From 2835f21156aa17d4f35261e3ee179a23f75260ba Mon Sep 17 00:00:00 2001 From: Ian Norden Date: Mon, 17 Jun 2019 17:46:21 -0500 Subject: [PATCH] updating vendor because dep is bugging out --- Gopkg.lock | 839 +- Gopkg.toml | 7 +- pkg/wrappers/core/rawdb/accessors_chain.go | 2 +- .../mocks/wrappers/core/state/database.go | 4 + .../github.com/Stebalien/go-bitfield/go.mod | 3 + .../allegro/bigcache/queue/bytes_queue.go | 34 +- vendor/github.com/allegro/bigcache/shard.go | 26 +- .../goarista/check_copyright_notice.sh | 19 + .../goarista/monotime/issue15006.s | 2 +- .../goarista/monotime/nanotime.go | 2 +- .../github.com/btcsuite/btcd/btcec/pubkey.go | 13 +- .../btcsuite/btcd/btcec/signature.go | 20 +- vendor/github.com/cenkalti/backoff/go.mod | 3 + .../deckarep/golang-set/threadsafe.go | 8 +- vendor/github.com/edsrzf/mmap-go/mmap.go | 21 +- vendor/github.com/edsrzf/mmap-go/mmap_unix.go | 50 +- .../github.com/edsrzf/mmap-go/mmap_windows.go | 64 +- .../github.com/edsrzf/mmap-go/msync_netbsd.go | 8 - .../github.com/edsrzf/mmap-go/msync_unix.go | 14 - .../github.com/elastic/gosigar/.appveyor.yml | 84 + vendor/github.com/elastic/gosigar/.gitignore | 41 + vendor/github.com/elastic/gosigar/.travis.yml | 37 + .../github.com/elastic/gosigar/CHANGELOG.md | 135 + vendor/github.com/elastic/gosigar/LICENSE | 201 + vendor/github.com/elastic/gosigar/NOTICE | 9 + vendor/github.com/elastic/gosigar/README.md | 58 + vendor/github.com/elastic/gosigar/Vagrantfile | 25 + vendor/github.com/elastic/gosigar/codecov.yml | 21 + .../elastic/gosigar/concrete_sigar.go | 89 + .../elastic/gosigar/sigar_darwin.go | 498 + .../elastic/gosigar/sigar_format.go | 126 + .../elastic/gosigar/sigar_freebsd.go | 158 + .../elastic/gosigar/sigar_interface.go | 207 + .../github.com/elastic/gosigar/sigar_linux.go | 133 + .../elastic/gosigar/sigar_linux_common.go | 457 + .../elastic/gosigar/sigar_openbsd.go | 426 + .../github.com/elastic/gosigar/sigar_stub.go | 75 + .../github.com/elastic/gosigar/sigar_unix.go | 69 + .../github.com/elastic/gosigar/sigar_util.go | 22 + .../elastic/gosigar/sigar_windows.go | 409 + .../elastic/gosigar/sys/windows/doc.go | 2 + .../elastic/gosigar/sys/windows/ntquery.go | 132 + .../elastic/gosigar/sys/windows/privileges.go | 272 + .../gosigar/sys/windows/syscall_windows.go | 588 ++ .../elastic/gosigar/sys/windows/version.go | 43 + .../gosigar/sys/windows/zsyscall_windows.go | 376 + .../ethereum/go-ethereum/.dockerignore | 4 - .../ethereum/go-ethereum/.github/CODEOWNERS | 15 +- .../ethereum/go-ethereum/.travis.yml | 33 +- .../ethereum/go-ethereum/Dockerfile | 2 +- .../ethereum/go-ethereum/Dockerfile.alltools | 2 +- .../github.com/ethereum/go-ethereum/Makefile | 10 +- .../github.com/ethereum/go-ethereum/README.md | 21 +- .../ethereum/go-ethereum/SECURITY.md | 120 + .../go-ethereum/accounts/abi/bind/auth.go | 19 + .../accounts/abi/bind/backends/simulated.go | 6 +- .../go-ethereum/accounts/abi/method.go | 4 +- .../ethereum/go-ethereum/accounts/accounts.go | 8 +- .../go-ethereum/accounts/external/backend.go | 2 +- .../ethereum/go-ethereum/accounts/hd.go | 8 +- .../accounts/keystore/passphrase.go | 5 +- .../go-ethereum/accounts/keystore/wallet.go | 3 +- .../go-ethereum/accounts/keystore/watch.go | 2 +- .../accounts/keystore/watch_fallback.go | 2 +- .../go-ethereum/accounts/scwallet/README.md | 20 +- .../go-ethereum/accounts/scwallet/hub.go | 6 +- .../go-ethereum/accounts/scwallet/wallet.go | 180 +- .../go-ethereum/accounts/usbwallet/hub.go | 55 +- .../go-ethereum/accounts/usbwallet/trezor.go | 15 +- .../usbwallet/trezor/messages-common.pb.go | 811 ++ .../usbwallet/trezor/messages-common.proto | 147 + .../usbwallet/trezor/messages-ethereum.pb.go | 698 ++ .../usbwallet/trezor/messages-ethereum.proto | 131 + .../trezor/messages-management.pb.go | 1621 +++ .../trezor/messages-management.proto | 289 + .../accounts/usbwallet/trezor/messages.pb.go | 3760 ++----- .../accounts/usbwallet/trezor/messages.proto | 1125 +- .../accounts/usbwallet/trezor/trezor.go | 32 +- .../accounts/usbwallet/trezor/types.pb.go | 1333 --- .../accounts/usbwallet/trezor/types.proto | 278 - .../go-ethereum/accounts/usbwallet/wallet.go | 145 +- .../ethereum/go-ethereum/appveyor.yml | 4 +- .../ethereum/go-ethereum/build/ci.go | 47 +- .../build/deb/ethereum-swarm/deb.changelog | 5 - .../build/deb/ethereum-swarm/deb.control | 19 - .../build/deb/ethereum-swarm/deb.copyright | 14 - .../build/deb/ethereum-swarm/deb.docs | 1 - .../build/deb/ethereum-swarm/deb.install | 1 - .../build/deb/ethereum-swarm/deb.rules | 16 - .../build/deb/ethereum/deb.control | 4 +- .../go-ethereum/build/update-license.go | 2 - .../ethereum/go-ethereum/cmd/abigen/main.go | 11 +- .../ethereum/go-ethereum/cmd/bootnode/main.go | 2 +- .../ethereum/go-ethereum/cmd/clef/main.go | 39 +- .../go-ethereum/cmd/devp2p/discv4cmd.go | 166 + .../ethereum/go-ethereum/cmd/devp2p/enrcmd.go | 198 + .../ethereum/go-ethereum/cmd/devp2p/main.go | 68 + .../ethereum/go-ethereum/cmd/ethkey/main.go | 3 +- .../ethereum/go-ethereum/cmd/evm/main.go | 3 +- .../ethereum/go-ethereum/cmd/faucet/faucet.go | 51 +- .../go-ethereum/cmd/faucet/faucet.html | 5 +- .../go-ethereum/cmd/faucet/website.go | 65 +- .../go-ethereum/cmd/geth/accountcmd.go | 10 +- .../ethereum/go-ethereum/cmd/geth/chaincmd.go | 123 +- .../ethereum/go-ethereum/cmd/geth/config.go | 2 +- .../ethereum/go-ethereum/cmd/geth/main.go | 34 +- .../ethereum/go-ethereum/cmd/geth/misccmd.go | 3 + .../go-ethereum/cmd/geth/retesteth.go | 888 ++ .../cmd/geth/retesteth_copypaste.go | 148 + .../ethereum/go-ethereum/cmd/geth/usage.go | 6 + .../ethereum/go-ethereum/cmd/swarm/access.go | 297 - .../go-ethereum/cmd/swarm/bootnodes.go | 24 - .../ethereum/go-ethereum/cmd/swarm/config.go | 451 - .../ethereum/go-ethereum/cmd/swarm/db.go | 147 - .../go-ethereum/cmd/swarm/download.go | 112 - .../ethereum/go-ethereum/cmd/swarm/explore.go | 59 - .../ethereum/go-ethereum/cmd/swarm/feeds.go | 238 - .../ethereum/go-ethereum/cmd/swarm/flags.go | 185 - .../ethereum/go-ethereum/cmd/swarm/fs.go | 162 - .../cmd/swarm/global-store/explorer.go | 66 - .../cmd/swarm/global-store/global_store.go | 120 - .../cmd/swarm/global-store/main.go | 120 - .../ethereum/go-ethereum/cmd/swarm/hash.go | 115 - .../ethereum/go-ethereum/cmd/swarm/list.go | 70 - .../ethereum/go-ethereum/cmd/swarm/main.go | 475 - .../go-ethereum/cmd/swarm/manifest.go | 353 - .../cmd/swarm/mimegen/generator.go | 124 - .../go-ethereum/cmd/swarm/mimegen/mime.types | 1828 ---- .../swarm/swarm-smoke/feed_upload_and_sync.go | 291 - .../go-ethereum/cmd/swarm/swarm-smoke/main.go | 197 - .../cmd/swarm/swarm-smoke/sliding_window.go | 145 - .../cmd/swarm/swarm-smoke/upload_and_sync.go | 207 - .../cmd/swarm/swarm-smoke/upload_speed.go | 73 - .../go-ethereum/cmd/swarm/swarm-smoke/util.go | 235 - .../cmd/swarm/swarm-snapshot/create.go | 160 - .../cmd/swarm/swarm-snapshot/main.go | 82 - .../ethereum/go-ethereum/cmd/swarm/upload.go | 188 - .../ethereum/go-ethereum/cmd/utils/cmd.go | 2 + .../ethereum/go-ethereum/cmd/utils/flags.go | 165 +- .../ethereum/go-ethereum/cmd/wnode/main.go | 6 +- .../ethereum/go-ethereum/common/math/big.go | 7 + .../go-ethereum/common/prque/prque.go | 25 +- .../go-ethereum/common/prque/sstack.go | 18 +- .../ethereum/go-ethereum/common/size.go | 12 +- .../go-ethereum/consensus/clique/clique.go | 19 +- .../go-ethereum/consensus/clique/snapshot.go | 16 +- .../go-ethereum/consensus/consensus.go | 11 +- .../go-ethereum/consensus/ethash/consensus.go | 12 +- .../go-ethereum/consensus/ethash/sealer.go | 4 +- .../ethereum/go-ethereum/console/prompter.go | 2 +- .../go-ethereum/contracts/chequebook/api.go | 68 - .../contracts/chequebook/cheque.go | 642 -- .../chequebook/contract/chequebook.go | 367 - .../chequebook/contract/chequebook.sol | 47 - .../contracts/chequebook/contract/code.go | 5 - .../contracts/chequebook/contract/mortal.sol | 10 - .../contracts/chequebook/contract/owned.sol | 15 - .../contracts/chequebook/gencode.go | 70 - .../go-ethereum/contracts/ens/README.md | 30 - .../ethereum/go-ethereum/contracts/ens/cid.go | 121 - .../contracts/ens/contract/ENS.sol | 26 - .../contracts/ens/contract/ENSRegistry.sol | 99 - .../contracts/ens/contract/FIFSRegistrar.sol | 36 - .../contracts/ens/contract/PublicResolver.sol | 212 - .../go-ethereum/contracts/ens/contract/ens.go | 892 -- .../contracts/ens/contract/ensregistry.go | 892 -- .../contracts/ens/contract/fifsregistrar.go | 210 - .../contracts/ens/contract/publicresolver.go | 1319 --- .../ethereum/go-ethereum/contracts/ens/ens.go | 263 - .../ens/fallback_contract/PublicResolver.sol | 212 - .../ens/fallback_contract/publicresolver.go | 1321 --- .../ethereum/go-ethereum/core/blockchain.go | 644 +- .../ethereum/go-ethereum/core/chain_makers.go | 18 +- .../ethereum/go-ethereum/core/error.go | 3 + .../ethereum/go-ethereum/core/genesis.go | 17 + .../ethereum/go-ethereum/core/headerchain.go | 80 +- .../go-ethereum/core/rawdb/accessors_chain.go | 249 +- .../core/rawdb/accessors_indexes.go | 54 +- .../core/rawdb/accessors_metadata.go | 12 +- .../go-ethereum/core/rawdb/database.go | 311 +- .../go-ethereum/core/rawdb/freezer.go | 393 + .../go-ethereum/core/rawdb/freezer_reinit.go | 127 + .../go-ethereum/core/rawdb/freezer_table.go | 635 ++ .../ethereum/go-ethereum/core/rawdb/schema.go | 31 +- .../ethereum/go-ethereum/core/rawdb/table.go | 51 +- .../go-ethereum/core/state/database.go | 2 +- .../go-ethereum/core/state/state_object.go | 236 +- .../ethereum/go-ethereum/core/state/sync.go | 4 +- .../go-ethereum/core/state_processor.go | 2 +- .../ethereum/go-ethereum/core/tx_list.go | 4 +- .../ethereum/go-ethereum/core/tx_pool.go | 151 +- .../ethereum/go-ethereum/core/types/log.go | 6 +- .../go-ethereum/core/types/receipt.go | 149 +- .../go-ethereum/core/types/transaction.go | 4 +- .../crypto/bn256/cloudflare/bn256.go | 9 + .../crypto/bn256/cloudflare/constants.go | 5 +- .../crypto/bn256/cloudflare/gfp6.go | 2 +- .../ethereum/go-ethereum/dashboard/assets.go | 9300 +++++++++-------- .../go-ethereum/dashboard/assets/yarn.lock | 1797 ++-- .../ethereum/go-ethereum/eth/api_backend.go | 12 +- .../ethereum/go-ethereum/eth/backend.go | 27 +- .../ethereum/go-ethereum/eth/config.go | 31 +- .../go-ethereum/eth/downloader/downloader.go | 216 +- .../go-ethereum/eth/downloader/fakepeer.go | 2 +- .../go-ethereum/eth/downloader/statesync.go | 19 +- .../ethereum/go-ethereum/eth/gen_config.go | 97 +- .../ethereum/go-ethereum/eth/handler.go | 125 +- .../ethereum/go-ethereum/eth/peer.go | 26 +- .../ethereum/go-ethereum/eth/sync.go | 15 +- .../go-ethereum/ethclient/ethclient.go | 23 +- .../ethereum/go-ethereum/ethdb/batch.go | 4 +- .../ethereum/go-ethereum/ethdb/database.go | 63 +- .../ethereum/go-ethereum/ethdb/iterator.go | 5 + .../go-ethereum/ethdb/leveldb/leveldb.go | 29 +- .../go-ethereum/ethdb/memorydb/memorydb.go | 33 +- .../go-ethereum/internal/build/env.go | 52 +- .../go-ethereum/internal/build/util.go | 13 +- .../go-ethereum/internal/ethapi/api.go | 64 +- .../go-ethereum/internal/ethapi/backend.go | 1 + .../testlog/testlog.go} | 41 +- .../ethereum/go-ethereum/les/api.go | 32 +- .../ethereum/go-ethereum/les/api_backend.go | 10 +- .../ethereum/go-ethereum/les/backend.go | 8 +- .../ethereum/go-ethereum/les/commons.go | 2 +- .../ethereum/go-ethereum/les/costtracker.go | 198 +- .../go-ethereum/les/csvlogger/csvlogger.go | 227 + .../ethereum/go-ethereum/les/distributor.go | 33 +- .../ethereum/go-ethereum/les/execqueue.go | 9 +- .../ethereum/go-ethereum/les/fetcher.go | 29 +- .../go-ethereum/les/flowcontrol/control.go | 111 +- .../go-ethereum/les/flowcontrol/manager.go | 193 +- .../ethereum/go-ethereum/les/freeclient.go | 61 +- .../ethereum/go-ethereum/les/handler.go | 749 +- .../ethereum/go-ethereum/les/odr.go | 1 + .../ethereum/go-ethereum/les/odr_requests.go | 42 +- .../ethereum/go-ethereum/les/peer.go | 156 +- .../ethereum/go-ethereum/les/protocol.go | 18 +- .../ethereum/go-ethereum/les/retrieve.go | 70 +- .../ethereum/go-ethereum/les/server.go | 98 +- .../ethereum/go-ethereum/les/serverpool.go | 2 +- .../ethereum/go-ethereum/les/servingqueue.go | 219 +- .../ethereum/go-ethereum/les/transactions.rlp | 0 .../ethereum/go-ethereum/les/txrelay.go | 15 +- .../ethereum/go-ethereum/les/ulc.go | 27 +- .../ethereum/go-ethereum/light/lightchain.go | 8 +- .../ethereum/go-ethereum/light/nodeset.go | 6 +- .../ethereum/go-ethereum/light/odr.go | 17 + .../ethereum/go-ethereum/light/odr_util.go | 36 +- .../ethereum/go-ethereum/light/postprocess.go | 8 - .../ethereum/go-ethereum/light/trie.go | 2 +- .../ethereum/go-ethereum/log/format.go | 13 +- .../pss/protocol_none.go => metrics/cpu.go} | 23 +- .../error.go => metrics/cpu_syscall.go} | 31 +- .../cpu_windows.go} | 14 +- .../ethereum/go-ethereum/metrics/metrics.go | 23 +- .../ethereum/go-ethereum/miner/miner.go | 18 +- .../go-ethereum/miner/stress_clique.go | 10 +- .../go-ethereum/miner/stress_ethash.go | 10 +- .../ethereum/go-ethereum/miner/worker.go | 45 +- .../ethereum/go-ethereum/node/api.go | 8 +- .../ethereum/go-ethereum/node/config.go | 29 +- .../ethereum/go-ethereum/node/defaults.go | 2 +- .../ethereum/go-ethereum/node/node.go | 20 + .../ethereum/go-ethereum/node/service.go | 25 +- .../ethereum/go-ethereum/p2p/dial.go | 109 +- .../go-ethereum/p2p/discover/common.go | 57 + .../ethereum/go-ethereum/p2p/discover/node.go | 3 +- .../go-ethereum/p2p/discover/table.go | 247 +- .../p2p/discover/{udp.go => v4_udp.go} | 608 +- .../go-ethereum/p2p/enode/localnode.go | 120 +- .../ethereum/go-ethereum/p2p/enode/node.go | 67 +- .../ethereum/go-ethereum/p2p/enode/urlv4.go | 18 +- .../ethereum/go-ethereum/p2p/enr/enr.go | 12 +- .../ethereum/go-ethereum/p2p/enr/entries.go | 76 +- .../ethereum/go-ethereum/p2p/metrics.go | 17 +- .../common.go => p2p/netutil/addrutil.go} | 25 +- .../ethereum/go-ethereum/p2p/peer.go | 4 +- .../go-ethereum/p2p/protocols/accounting.go | 182 - .../p2p/protocols/accounting_api.go | 94 - .../go-ethereum/p2p/protocols/protocol.go | 442 - .../go-ethereum/p2p/protocols/reporter.go | 162 - .../ethereum/go-ethereum/p2p/rlpx.go | 3 +- .../ethereum/go-ethereum/p2p/server.go | 214 +- .../go-ethereum/p2p/testing/peerpool.go | 2 +- .../go-ethereum/p2p/testing/protocoltester.go | 1 + .../ethereum/go-ethereum/p2p/util.go | 82 + .../ethereum/go-ethereum/params/config.go | 9 + .../go-ethereum/params/network_params.go | 6 + .../ethereum/go-ethereum/params/version.go | 5 +- .../ethereum/go-ethereum/rlp/decode.go | 30 +- .../ethereum/go-ethereum/rlp/encode.go | 28 +- .../ethereum/go-ethereum/rlp/typecache.go | 69 +- .../fuse_root.go => rpc/constants_unix.go} | 28 +- .../race.go => rpc/constants_unix_nocgo.go} | 12 +- .../ethereum/go-ethereum/rpc/ipc_unix.go | 16 +- .../ethereum/go-ethereum/signer/core/api.go | 51 +- .../go-ethereum/signer/core/signed_data.go | 240 +- .../signer/core/testdata/README.md | 5 + .../signer/core/testdata/arrays-1.json | 60 + .../core/testdata/custom_arraytype.json | 54 + .../signer/core/testdata/eip712.json | 76 + .../testdata/expfail_arraytype_overload.json | 67 + .../core/testdata/expfail_datamismatch_1.json | 64 + .../core/testdata/expfail_extradata-1.json | 76 + .../core/testdata/expfail_extradata-2.json | 77 + .../testdata/expfail_malformeddomainkeys.json | 64 + .../testdata/expfail_nonexistant_type.json | 64 + .../core/testdata/expfail_toolargeuint.json | 38 + .../core/testdata/expfail_toolargeuint2.json | 38 + .../testdata/expfail_unconvertiblefloat.json | 38 + .../testdata/expfail_unconvertiblefloat2.json | 38 + .../2850f6ccf2d7f5f846dfb73119b60e09e712783f | 38 + .../36fb987a774011dc675e1b5246ac5c1d44d84d92 | 60 + .../37ec7b55c7ba014cced204c5f9989d2d0eb9ff6d | 38 + .../582fa92154b784daa1faa293b695fa388fe34bf1 | 1 + .../ab57cb2b2b5ce614efe13a47bc73814580f2cce8 | 54 + .../e4303e23ca34fbbc43164a232b2caa7a3af2bf8d | 64 + .../f658340af009dd4a35abe645a00a7b732bc30921 | 1 + .../ethereum/go-ethereum/statediff/api.go | 31 +- .../ethereum/go-ethereum/statediff/builder.go | 4 +- .../go-ethereum/statediff/builder_test.go | 564 - .../ethereum/go-ethereum/statediff/config.go | 8 +- .../ethereum/go-ethereum/statediff/doc.go | 40 + .../ethereum/go-ethereum/statediff/service.go | 63 +- .../go-ethereum/statediff/service_test.go | 130 - .../testhelpers/mocks/{service.go => api.go} | 0 .../statediff/testhelpers/mocks/publisher.go | 36 - .../testhelpers/mocks/service_test.go | 145 - .../ethereum/go-ethereum/swarm/AUTHORS | 35 - .../ethereum/go-ethereum/swarm/OWNERS | 25 - .../ethereum/go-ethereum/swarm/README.md | 243 +- .../ethereum/go-ethereum/swarm/api/act.go | 538 - .../ethereum/go-ethereum/swarm/api/api.go | 1017 -- .../go-ethereum/swarm/api/client/client.go | 797 -- .../ethereum/go-ethereum/swarm/api/config.go | 168 - .../ethereum/go-ethereum/swarm/api/encrypt.go | 78 - .../go-ethereum/swarm/api/filesystem.go | 292 - .../go-ethereum/swarm/api/gen_mime.go | 1201 --- .../go-ethereum/swarm/api/http/middleware.go | 113 - .../go-ethereum/swarm/api/http/response.go | 132 - .../swarm/api/http/roundtripper.go | 66 - .../go-ethereum/swarm/api/http/sctx.go | 34 - .../go-ethereum/swarm/api/http/server.go | 887 -- .../go-ethereum/swarm/api/http/templates.go | 306 - .../go-ethereum/swarm/api/http/test_server.go | 98 - .../go-ethereum/swarm/api/inspector.go | 67 - .../go-ethereum/swarm/api/manifest.go | 585 -- .../ethereum/go-ethereum/swarm/api/storage.go | 85 - .../swarm/api/testdata/test0/img/logo.png | Bin 4119 -> 0 bytes .../swarm/api/testdata/test0/index.css | 9 - .../swarm/api/testdata/test0/index.html | 10 - .../ethereum/go-ethereum/swarm/api/uri.go | 144 - .../ethereum/go-ethereum/swarm/bmt/bmt.go | 690 -- .../ethereum/go-ethereum/swarm/bmt/bmt_r.go | 84 - .../ethereum/go-ethereum/swarm/chunk/chunk.go | 109 - .../go-ethereum/swarm/dev/.dockerignore | 2 - .../ethereum/go-ethereum/swarm/dev/.gitignore | 2 - .../ethereum/go-ethereum/swarm/dev/Dockerfile | 42 - .../ethereum/go-ethereum/swarm/dev/Makefile | 14 - .../ethereum/go-ethereum/swarm/dev/README.md | 20 - .../ethereum/go-ethereum/swarm/dev/bashrc | 21 - .../ethereum/go-ethereum/swarm/dev/run.sh | 90 - .../swarm/dev/scripts/boot-cluster.sh | 288 - .../swarm/dev/scripts/random-uploads.sh | 96 - .../swarm/dev/scripts/stop-cluster.sh | 98 - .../go-ethereum/swarm/dev/scripts/util.sh | 53 - .../go-ethereum/swarm/docker/Dockerfile | 32 - .../go-ethereum/swarm/docker/run-smoke.sh | 7 - .../ethereum/go-ethereum/swarm/docker/run.sh | 26 - .../go-ethereum/swarm/fuse/fuse_dir.go | 161 - .../go-ethereum/swarm/fuse/fuse_file.go | 146 - .../go-ethereum/swarm/fuse/swarmfs.go | 65 - .../go-ethereum/swarm/fuse/swarmfs_unix.go | 285 - .../go-ethereum/swarm/fuse/swarmfs_util.go | 121 - .../ethereum/go-ethereum/swarm/log/log.go | 48 - .../go-ethereum/swarm/metrics/flags.go | 108 - .../go-ethereum/swarm/network/README.md | 152 - .../swarm/network/bitvector/bitvector.go | 62 - .../go-ethereum/swarm/network/discovery.go | 220 - .../ethereum/go-ethereum/swarm/network/enr.go | 93 - .../go-ethereum/swarm/network/fetcher.go | 336 - .../go-ethereum/swarm/network/hive.go | 244 - .../go-ethereum/swarm/network/kademlia.go | 919 -- .../go-ethereum/swarm/network/network.go | 105 - .../network/priorityqueue/priorityqueue.go | 118 - .../go-ethereum/swarm/network/protocol.go | 335 - .../swarm/network/simulation/bucket.go | 79 - .../swarm/network/simulation/events.go | 217 - .../swarm/network/simulation/http.go | 68 - .../swarm/network/simulation/kademlia.go | 203 - .../swarm/network/simulation/node.go | 341 - .../swarm/network/simulation/service.go | 65 - .../swarm/network/simulation/simulation.go | 218 - .../simulations/discovery/discovery.go | 17 - .../simulations/discovery/snapshot.json | 1 - .../swarm/network/simulations/overlay.go | 144 - .../swarm/network/stream/delivery.go | 310 - .../network/stream/intervals/intervals.go | 206 - .../swarm/network/stream/messages.go | 405 - .../go-ethereum/swarm/network/stream/peer.go | 422 - .../swarm/network/stream/stream.go | 999 -- .../swarm/network/stream/syncer.go | 227 - .../network/stream/testing/snapshot_128.json | 1 - .../network/stream/testing/snapshot_16.json | 1 - .../network/stream/testing/snapshot_256.json | 1 - .../network/stream/testing/snapshot_32.json | 1 - .../network/stream/testing/snapshot_4.json | 1 - .../network/stream/testing/snapshot_64.json | 1 - .../ethereum/go-ethereum/swarm/pot/address.go | 210 - .../ethereum/go-ethereum/swarm/pot/doc.go | 83 - .../ethereum/go-ethereum/swarm/pot/pot.go | 787 -- .../go-ethereum/swarm/pss/ARCHITECTURE.md | 144 - .../ethereum/go-ethereum/swarm/pss/README.md | 318 - .../ethereum/go-ethereum/swarm/pss/api.go | 195 - .../go-ethereum/swarm/pss/client/client.go | 352 - .../go-ethereum/swarm/pss/client/doc.go | 96 - .../ethereum/go-ethereum/swarm/pss/doc.go | 61 - .../go-ethereum/swarm/pss/handshake.go | 592 -- .../go-ethereum/swarm/pss/keystore.go | 281 - .../go-ethereum/swarm/pss/notify/notify.go | 394 - .../ethereum/go-ethereum/swarm/pss/ping.go | 97 - .../go-ethereum/swarm/pss/protocol.go | 283 - .../ethereum/go-ethereum/swarm/pss/pss.go | 857 -- .../swarm/pss/testdata/snapshot_128.json | 1 - .../swarm/pss/testdata/snapshot_16.json | 1 - .../swarm/pss/testdata/snapshot_2.json | 1 - .../swarm/pss/testdata/snapshot_256.json | 1 - .../swarm/pss/testdata/snapshot_3.json | 1 - .../swarm/pss/testdata/snapshot_32.json | 1 - .../swarm/pss/testdata/snapshot_4.json | 1 - .../swarm/pss/testdata/snapshot_64.json | 1 - .../swarm/pss/testdata/snapshot_8.json | 1 - .../ethereum/go-ethereum/swarm/pss/types.go | 217 - .../ethereum/go-ethereum/swarm/pss/writeup.md | 125 - .../ethereum/go-ethereum/swarm/sctx/sctx.go | 20 - .../go-ethereum/swarm/services/swap/swap.go | 301 - .../swarm/services/swap/swap/swap.go | 252 - .../ethereum/go-ethereum/swarm/shed/db.go | 320 - .../go-ethereum/swarm/shed/field_string.go | 66 - .../go-ethereum/swarm/shed/field_struct.go | 71 - .../go-ethereum/swarm/shed/field_uint64.go | 146 - .../ethereum/go-ethereum/swarm/shed/index.go | 392 - .../ethereum/go-ethereum/swarm/shed/schema.go | 134 - .../go-ethereum/swarm/shed/vector_uint64.go | 146 - .../swarm/spancontext/spancontext.go | 49 - .../go-ethereum/swarm/state/dbstore.go | 111 - .../go-ethereum/swarm/storage/chunker.go | 612 -- .../go-ethereum/swarm/storage/database.go | 82 - .../swarm/storage/encryption/encryption.go | 152 - .../swarm/storage/feed/binaryserializer.go | 44 - .../swarm/storage/feed/cacheentry.go | 48 - .../go-ethereum/swarm/storage/feed/doc.go | 43 - .../go-ethereum/swarm/storage/feed/error.go | 73 - .../go-ethereum/swarm/storage/feed/feed.go | 125 - .../go-ethereum/swarm/storage/feed/handler.go | 291 - .../go-ethereum/swarm/storage/feed/id.go | 123 - .../swarm/storage/feed/lookup/epoch.go | 91 - .../swarm/storage/feed/lookup/lookup.go | 180 - .../go-ethereum/swarm/storage/feed/query.go | 78 - .../go-ethereum/swarm/storage/feed/request.go | 286 - .../go-ethereum/swarm/storage/feed/sign.go | 75 - .../swarm/storage/feed/testutil.go | 71 - .../swarm/storage/feed/timestampprovider.go | 62 - .../go-ethereum/swarm/storage/feed/topic.go | 105 - .../go-ethereum/swarm/storage/feed/update.go | 134 - .../go-ethereum/swarm/storage/filestore.go | 146 - .../go-ethereum/swarm/storage/hasherstore.go | 263 - .../go-ethereum/swarm/storage/ldbstore.go | 1082 -- .../go-ethereum/swarm/storage/localstore.go | 251 - .../swarm/storage/localstore/doc.go | 56 - .../swarm/storage/localstore/gc.go | 175 - .../swarm/storage/localstore/localstore.go | 360 - .../swarm/storage/localstore/mode_get.go | 151 - .../swarm/storage/localstore/mode_has.go | 39 - .../swarm/storage/localstore/mode_put.go | 158 - .../swarm/storage/localstore/mode_set.go | 201 - .../storage/localstore/subscription_pull.go | 211 - .../storage/localstore/subscription_push.go | 145 - .../go-ethereum/swarm/storage/memstore.go | 92 - .../go-ethereum/swarm/storage/mock/db/db.go | 476 - .../swarm/storage/mock/explorer/explorer.go | 257 - .../swarm/storage/mock/explorer/swagger.yaml | 176 - .../go-ethereum/swarm/storage/mock/mem/mem.go | 385 - .../go-ethereum/swarm/storage/mock/mock.go | 142 - .../go-ethereum/swarm/storage/mock/rpc/rpc.go | 114 - .../swarm/storage/mock/test/test.go | 362 - .../go-ethereum/swarm/storage/netstore.go | 348 - .../go-ethereum/swarm/storage/pyramid.go | 694 -- .../go-ethereum/swarm/storage/schema.go | 17 - .../go-ethereum/swarm/storage/swarmhasher.go | 41 - .../go-ethereum/swarm/storage/types.go | 252 - .../ethereum/go-ethereum/swarm/swap/swap.go | 98 - .../ethereum/go-ethereum/swarm/swarm.go | 553 - .../go-ethereum/swarm/testutil/file.go | 65 - .../go-ethereum/swarm/testutil/norace.go | 26 - .../go-ethereum/swarm/tracing/tracing.go | 173 - .../go-ethereum/swarm/version/version.go | 67 - .../go-ethereum/tests/gen_tttransaction.go | 95 - .../tests/transaction_test_util.go | 156 +- .../ethereum/go-ethereum/trie/database.go | 60 +- .../ethereum/go-ethereum/trie/proof.go | 9 +- .../ethereum/go-ethereum/trie/sync.go | 41 +- .../ethereum/go-ethereum/trie/sync_bloom.go | 207 + .../go-ethereum/whisper/whisperv6/api.go | 4 +- vendor/github.com/go-stack/stack/.travis.yml | 11 +- vendor/github.com/go-stack/stack/go.mod | 1 + vendor/github.com/go-stack/stack/stack.go | 218 +- .../github.com/gxed/hashland/keccak/LICENSE | 21 - .../github.com/gxed/hashland/keccakpg/go.mod | 1 - .../gxed/hashland/keccakpg/keccak.go | 224 - .../gxed/hashland/keccakpg/package.json | 14 - .../github.com/gxed/hashland/murmur3/LICENSE | 24 - .../gxed/hashland/murmur3/README.md | 84 - .../github.com/gxed/hashland/murmur3/go.mod | 1 - .../gxed/hashland/murmur3/murmur.go | 65 - .../gxed/hashland/murmur3/murmur128.go | 189 - .../gxed/hashland/murmur3/murmur32.go | 154 - .../gxed/hashland/murmur3/murmur64.go | 45 - vendor/github.com/hpcloud/tail/.travis.yml | 5 +- vendor/github.com/hpcloud/tail/README.md | 2 +- .../hpcloud/tail/ratelimiter/memory.go | 10 +- vendor/github.com/hpcloud/tail/tail.go | 11 +- .../hpcloud/tail/watch/filechanges.go | 2 +- .../github.com/hpcloud/tail/watch/inotify.go | 11 +- .../hpcloud/tail/watch/inotify_tracker.go | 88 +- vendor/github.com/ipfs/go-bitswap/.travis.yml | 1 - vendor/github.com/ipfs/go-bitswap/bitswap.go | 159 +- .../ipfs/go-bitswap/decision/engine.go | 100 +- .../ipfs/go-bitswap/decision/ledger.go | 5 +- .../go-bitswap/decision/peer_request_queue.go | 342 - vendor/github.com/ipfs/go-bitswap/go.mod | 41 +- vendor/github.com/ipfs/go-bitswap/go.sum | 255 +- .../ipfs/go-bitswap/message/message.go | 17 +- .../go-bitswap/messagequeue/messagequeue.go | 2 +- .../ipfs/go-bitswap/network/interface.go | 27 +- .../ipfs/go-bitswap/network/ipfs_impl.go | 63 +- .../go-bitswap/notifications/notifications.go | 4 + .../github.com/ipfs/go-bitswap/package.json | 196 - .../go-bitswap/peermanager/peermanager.go | 33 +- .../providerquerymanager.go | 2 +- .../ipfs/go-bitswap/session/session.go | 141 +- .../sessionmanager/sessionmanager.go | 12 +- .../sessionpeermanager/sessionpeermanager.go | 33 +- .../sessionrequestsplitter.go | 2 +- vendor/github.com/ipfs/go-bitswap/stat.go | 2 + .../ipfs/go-bitswap/testnet/interface.go | 13 - .../internet_latency_delay_generator.go | 63 - .../ipfs/go-bitswap/testnet/peernet.go | 42 - .../testnet/rate_limit_generators.go | 42 - .../ipfs/go-bitswap/testnet/virtual.go | 330 - .../github.com/ipfs/go-bitswap/testutils.go | 110 - .../ipfs/go-bitswap/wantlist/wantlist.go | 19 + .../go-bitswap/wantmanager/wantmanager.go | 10 +- vendor/github.com/ipfs/go-bitswap/workers.go | 22 +- .../ipfs/go-blockservice/.travis.yml | 2 - .../github.com/ipfs/go-blockservice/README.md | 2 +- .../ipfs/go-blockservice/blockservice.go | 17 +- vendor/github.com/ipfs/go-blockservice/go.mod | 9 +- vendor/github.com/ipfs/go-blockservice/go.sum | 254 +- .../ipfs/go-blockservice/package.json | 54 - vendor/github.com/ipfs/go-cid/README.md | 2 +- vendor/github.com/ipfs/go-cid/cid.go | 2 +- vendor/github.com/ipfs/go-cidutil/go.mod | 2 +- vendor/github.com/ipfs/go-cidutil/go.sum | 4 +- .../ipfs/go-datastore/delayed/delayed.go | 80 - vendor/github.com/ipfs/go-ipfs-addr/Makefile | 13 - vendor/github.com/ipfs/go-ipfs-addr/README.md | 47 - .../github.com/ipfs/go-ipfs-addr/codecov.yml | 3 - vendor/github.com/ipfs/go-ipfs-addr/go.mod | 7 - .../github.com/ipfs/go-ipfs-addr/ipfsaddr.go | 114 - .../github.com/ipfs/go-ipfs-addr/package.json | 35 - .../ipfs/go-ipfs-config/.travis.yml | 2 - .../ipfs/go-ipfs-config/bootstrap_peers.go | 49 +- .../ipfs/go-ipfs-config/experiments.go | 1 + vendor/github.com/ipfs/go-ipfs-config/go.mod | 5 +- vendor/github.com/ipfs/go-ipfs-config/go.sum | 69 +- .../ipfs/go-ipfs-config/identity.go | 2 +- vendor/github.com/ipfs/go-ipfs-config/init.go | 4 +- .../ipfs/go-ipfs-config/package.json | 60 - .../github.com/ipfs/go-ipfs-config/profile.go | 34 +- .../github.com/ipfs/go-ipfs-files/webfile.go | 29 +- vendor/github.com/ipfs/go-ipfs-flags/Makefile | 18 - .../github.com/ipfs/go-ipfs-flags/README.md | 42 - vendor/github.com/ipfs/go-ipfs-flags/flags.go | 14 - vendor/github.com/ipfs/go-ipfs-flags/go.mod | 1 - .../ipfs/go-ipfs-flags/package.json | 16 - .../mock/centralized_client.go | 90 - .../mock/centralized_server.go | 93 - .../ipfs/go-ipfs-routing/mock/interface.go | 59 - .../ipfs/go-ipfs-routing/none/none_client.go | 30 +- .../ipfs/go-ipfs-routing/offline/offline.go | 34 +- vendor/github.com/ipfs/go-ipfs/.gitignore | 1 + vendor/github.com/ipfs/go-ipfs/CHANGELOG.md | 599 ++ vendor/github.com/ipfs/go-ipfs/COPYRIGHT | 5 + vendor/github.com/ipfs/go-ipfs/Dockerfile | 11 + vendor/github.com/ipfs/go-ipfs/Gopkg.lock | 2642 +++++ vendor/github.com/ipfs/go-ipfs/Gopkg.toml | 443 + .../github.com/ipfs/go-ipfs/ISSUE_TEMPLATE.md | 39 - vendor/github.com/ipfs/go-ipfs/LICENSE | 21 - vendor/github.com/ipfs/go-ipfs/LICENSE-APACHE | 5 + .../LICENSE => ipfs/go-ipfs/LICENSE-MIT} | 2 - vendor/github.com/ipfs/go-ipfs/Makefile | 2 - vendor/github.com/ipfs/go-ipfs/README.md | 20 +- vendor/github.com/ipfs/go-ipfs/Rules.mk | 15 +- .../go-ipfs/core/{ => bootstrap}/bootstrap.go | 93 +- .../github.com/ipfs/go-ipfs/core/builder.go | 298 +- vendor/github.com/ipfs/go-ipfs/core/core.go | 931 +- .../ipfs/go-ipfs/core/node/builder.go | 151 + .../github.com/ipfs/go-ipfs/core/node/core.go | 124 + .../ipfs/go-ipfs/core/node/groups.go | 294 + .../ipfs/go-ipfs/core/node/helpers.go | 62 + .../ipfs/go-ipfs/core/node/helpers/helpers.go | 23 + .../ipfs/go-ipfs/core/node/identity.go | 29 + .../github.com/ipfs/go-ipfs/core/node/ipns.go | 56 + .../ipfs/go-ipfs/core/node/libp2p/addrs.go | 117 + .../go-ipfs/core/node/libp2p/discovery.go | 53 + .../ipfs/go-ipfs/core/node/libp2p/host.go | 76 + .../ipfs/go-ipfs/core/node/libp2p/hostopt.go | 25 + .../ipfs/go-ipfs/core/node/libp2p/libp2p.go | 46 + .../ipfs/go-ipfs/core/node/libp2p/nat.go | 32 + .../ipfs/go-ipfs/core/node/libp2p/pnet.go | 70 + .../ipfs/go-ipfs/core/node/libp2p/pubsub.go | 21 + .../ipfs/go-ipfs/core/node/libp2p/relay.go | 24 + .../ipfs/go-ipfs/core/node/libp2p/routing.go | 106 + .../go-ipfs/core/node/libp2p/routingopt.go | 36 + .../ipfs/go-ipfs/core/node/libp2p/smux.go | 54 + .../go-ipfs/core/node/libp2p/transport.go | 38 + .../ipfs/go-ipfs/core/node/provider.go | 117 + .../ipfs/go-ipfs/core/node/storage.go | 94 + .../ipfs/go-ipfs/core/pathresolver.go | 75 - vendor/github.com/ipfs/go-ipfs/doc.go | 23 - .../go-ipfs/exchange/reprovide/providers.go | 73 - .../ipfs/go-ipfs/filestore/fsrefstore.go | 2 +- vendor/github.com/ipfs/go-ipfs/go.mod | 119 - vendor/github.com/ipfs/go-ipfs/go.sum | 580 - .../ipfs/go-ipfs/keystore/keystore.go | 2 +- .../ipfs/go-ipfs/keystore/memkeystore.go | 2 +- .../ipfs/go-ipfs/namesys/interface.go | 2 +- .../ipfs/go-ipfs/namesys/namesys.go | 6 +- .../ipfs/go-ipfs/namesys/publisher.go | 6 +- .../ipfs/go-ipfs/namesys/republisher/repub.go | 4 +- .../ipfs/go-ipfs/namesys/routing.go | 4 +- .../github.com/ipfs/go-ipfs/p2p/listener.go | 6 +- vendor/github.com/ipfs/go-ipfs/p2p/local.go | 6 +- vendor/github.com/ipfs/go-ipfs/p2p/p2p.go | 10 +- vendor/github.com/ipfs/go-ipfs/p2p/remote.go | 4 +- vendor/github.com/ipfs/go-ipfs/p2p/stream.go | 8 +- .../github.com/ipfs/go-ipfs/package-list.json | 1 - vendor/github.com/ipfs/go-ipfs/pin/pin.go | 32 +- .../ipfs/go-ipfs/provider/offline.go | 20 +- .../ipfs/go-ipfs/provider/provider.go | 69 +- .../go-ipfs/provider/{ => queue}/queue.go | 5 +- .../ipfs/go-ipfs/provider/simple/provider.go | 72 + .../simple}/reprovide.go | 102 +- .../ipfs/go-ipfs/provider/system.go | 59 + .../ipfs/go-ipfs/thirdparty/math2/math2.go | 9 - vendor/github.com/ipfs/go-ipfs/version.go | 2 +- .../github.com/ipfs/go-ipld-cbor/.travis.yml | 1 - vendor/github.com/ipfs/go-ipld-cbor/go.mod | 2 +- vendor/github.com/ipfs/go-ipld-cbor/go.sum | 2 + .../github.com/ipfs/go-ipld-cbor/package.json | 54 - .../ipfs/go-ipld-format/.travis.yml | 4 +- vendor/github.com/ipfs/go-ipld-format/go.mod | 2 +- vendor/github.com/ipfs/go-ipld-format/go.sum | 2 + .../ipfs/go-ipld-format/package.json | 36 - .../github.com/ipfs/go-ipld-format/walker.go | 1 - vendor/github.com/ipfs/go-merkledag/go.mod | 12 +- vendor/github.com/ipfs/go-merkledag/go.sum | 251 +- vendor/github.com/ipfs/go-mfs/.travis.yml | 2 - vendor/github.com/ipfs/go-mfs/go.mod | 16 +- vendor/github.com/ipfs/go-mfs/go.sum | 322 +- vendor/github.com/ipfs/go-mfs/ops.go | 32 +- vendor/github.com/ipfs/go-path/error.go | 23 + vendor/github.com/ipfs/go-path/go.mod | 6 +- vendor/github.com/ipfs/go-path/go.sum | 210 +- vendor/github.com/ipfs/go-path/path.go | 32 +- .../go-peertaskqueue}/.travis.yml | 3 +- .../ipfs/go-peertaskqueue/COPYRIGHT | 3 + .../go-peertaskqueue/LICENSE-APACHE} | 2 +- .../LICENSE => go-peertaskqueue/LICENSE-MIT} | 4 +- .../github.com/ipfs/go-peertaskqueue/go.mod | 9 + .../github.com/ipfs/go-peertaskqueue/go.sum | 84 + .../go-peertaskqueue/peertask/peertask.go | 97 + .../ipfs/go-peertaskqueue/peertaskqueue.go | 220 + .../peertracker/peertracker.go | 212 + vendor/github.com/ipfs/go-unixfs/go.mod | 14 +- vendor/github.com/ipfs/go-unixfs/go.sum | 230 +- .../go-unixfs/importer/helpers/dagbuilder.go | 9 - .../ipfs/interface-go-ipfs-core/.travis.yml | 2 - .../ipfs/interface-go-ipfs-core/dht.go | 7 +- .../ipfs/interface-go-ipfs-core/go.mod | 11 +- .../ipfs/interface-go-ipfs-core/go.sum | 39 +- .../ipfs/interface-go-ipfs-core/key.go | 2 +- .../ipfs/interface-go-ipfs-core/package.json | 96 - .../ipfs/interface-go-ipfs-core/pubsub.go | 2 +- .../ipfs/interface-go-ipfs-core/swarm.go | 12 +- .../github.com/jbenet/go-context/io/ctxio.go | 120 - .../github.com/jbenet/goprocess/.travis.yml | 2 +- .../github.com/jbenet/goprocess/background.go | 33 + .../jbenet/goprocess/context/context.go | 28 +- .../jbenet/goprocess/context/derive.go | 44 +- vendor/github.com/jbenet/goprocess/go.mod | 5 + vendor/github.com/jbenet/goprocess/go.sum | 2 + .../github.com/jbenet/goprocess/goprocess.go | 34 +- .../github.com/jbenet/goprocess/impl-mutex.go | 74 +- vendor/github.com/jbenet/goprocess/link.go | 11 +- .../libp2p/go-buffer-pool/.travis.yml | 2 - .../github.com/libp2p/go-buffer-pool/Makefile | 10 - .../libp2p/go-buffer-pool/README.md | 9 +- .../github.com/libp2p/go-buffer-pool/go.mod | 2 + .../libp2p/go-buffer-pool/package.json | 16 - .../libp2p/go-buffer-pool/writer.go | 119 + .../go-conn-security-multistream/.travis.yml | 2 - .../go-conn-security-multistream/README.md | 33 +- .../go-conn-security-multistream/go.mod | 8 +- .../go-conn-security-multistream/go.sum | 81 +- .../go-conn-security-multistream/package.json | 36 - .../go-conn-security-multistream/ssms.go | 19 +- .../libp2p/go-conn-security/README.md | 59 - .../github.com/libp2p/go-conn-security/go.mod | 7 - .../github.com/libp2p/go-conn-security/go.sum | 106 - .../libp2p/go-conn-security/interface.go | 25 - .../libp2p/go-conn-security/package.json | 36 - .../libp2p/go-libp2p-autonat-svc/.travis.yml | 2 - .../libp2p/go-libp2p-autonat-svc/README.md | 4 + .../libp2p/go-libp2p-autonat-svc/go.mod | 11 +- .../libp2p/go-libp2p-autonat-svc/go.sum | 221 +- .../libp2p/go-libp2p-autonat-svc/package.json | 21 - .../libp2p/go-libp2p-autonat-svc/svc.go | 21 +- .../libp2p/go-libp2p-autonat/.travis.yml | 2 - .../libp2p/go-libp2p-autonat/Makefile | 7 - .../libp2p/go-libp2p-autonat/README.md | 4 + .../libp2p/go-libp2p-autonat/autonat.go | 24 +- .../libp2p/go-libp2p-autonat/client.go | 14 +- .../libp2p/go-libp2p-autonat/go.mod | 11 +- .../libp2p/go-libp2p-autonat/go.sum | 159 +- .../libp2p/go-libp2p-autonat/notify.go | 17 +- .../libp2p/go-libp2p-autonat/package.json | 68 - .../libp2p/go-libp2p-autonat/proto.go | 5 +- .../libp2p/go-libp2p-circuit/conn.go | 59 +- .../libp2p/go-libp2p-circuit/dial.go | 18 +- .../libp2p/go-libp2p-circuit/go.mod | 16 +- .../libp2p/go-libp2p-circuit/go.sum | 170 +- .../libp2p/go-libp2p-circuit/listen.go | 5 +- .../libp2p/go-libp2p-circuit/notify.go | 4 +- .../libp2p/go-libp2p-circuit/relay.go | 146 +- .../libp2p/go-libp2p-circuit/transport.go | 11 +- .../libp2p/go-libp2p-circuit/util.go | 26 +- .../libp2p/go-libp2p-connmgr/.travis.yml | 2 - .../libp2p/go-libp2p-connmgr/Makefile | 13 - .../libp2p/go-libp2p-connmgr/README.md | 25 +- .../libp2p/go-libp2p-connmgr/connmgr.go | 272 +- .../libp2p/go-libp2p-connmgr/go.mod | 8 +- .../libp2p/go-libp2p-connmgr/go.sum | 62 +- .../libp2p/go-libp2p-connmgr/package.json | 53 - .../connmgr/connmgr.go} | 26 +- .../libp2p/go-libp2p-core/connmgr/null.go | 23 + .../crypto}/ecdsa.go | 2 +- .../crypto}/ed25519.go | 4 +- .../crypto}/key.go | 17 +- .../go-libp2p-core/crypto/openssl_common.go | 98 + .../crypto}/pb/Makefile | 0 .../crypto}/pb/crypto.pb.go | 0 .../crypto}/pb/crypto.proto | 0 .../go-libp2p-core/crypto/rsa_common.go | 10 + .../crypto/rsa_go.go} | 57 +- .../go-libp2p-core/crypto/rsa_openssl.go | 62 + .../crypto}/secp256k1.go | 2 +- .../discovery/discovery.go} | 5 +- .../discovery}/options.go | 11 +- .../helpers}/match.go | 7 +- .../helpers/stream.go} | 8 +- .../libp2p/go-libp2p-core/host/helpers.go | 11 + .../host}/host.go | 33 +- .../go-libp2p-core/metrics/bandwidth.go | 153 + .../libp2p/go-libp2p-core/metrics/reporter.go | 31 + .../libp2p/go-libp2p-core/mux/mux.go | 70 + .../libp2p/go-libp2p-core/network/conn.go | 58 + .../network/context.go} | 21 +- .../libp2p/go-libp2p-core/network/errors.go | 10 + .../network/network.go} | 146 +- .../network/notifee.go} | 31 +- .../libp2p/go-libp2p-core/network/stream.go | 24 + .../libp2p/go-libp2p-core/peer/addrinfo.go | 98 + .../go-libp2p-core/peer/addrinfo_serde.go | 38 + .../peer}/peer.go | 41 +- .../peer}/peer_serde.go | 0 .../peerset.go => go-libp2p-core/peer/set.go} | 35 +- .../go-libp2p-core/peerstore/peerstore.go | 162 + .../libp2p/go-libp2p-core/pnet/env.go | 19 + .../libp2p/go-libp2p-core/pnet/error.go | 34 + .../libp2p/go-libp2p-core/pnet/protector.go | 15 + .../protocol/id.go} | 0 .../libp2p/go-libp2p-core/protocol/switch.go | 81 + .../routing}/options.go | 2 +- .../routing}/query.go | 41 +- .../go-libp2p-core/routing/query_serde.go | 40 + .../routing}/routing.go | 31 +- .../sec}/insecure/insecure.go | 20 +- .../libp2p/go-libp2p-core/sec/security.go | 26 + .../transport}/transport.go | 56 +- .../libp2p/go-libp2p-crypto/.travis.yml | 8 +- .../libp2p/go-libp2p-crypto/Makefile | 14 - .../libp2p/go-libp2p-crypto/README.md | 8 +- .../go-libp2p-crypto/ecdsa_deprecated.go | 64 + .../go-libp2p-crypto/ed25519_deprecated.go | 28 + .../github.com/libp2p/go-libp2p-crypto/go.mod | 7 +- .../github.com/libp2p/go-libp2p-crypto/go.sum | 28 + .../libp2p/go-libp2p-crypto/key_deprecated.go | 108 + .../libp2p/go-libp2p-crypto/package.json | 42 - .../libp2p/go-libp2p-crypto/rsa_deprecated.go | 31 + .../go-libp2p-crypto/secp256k1_deprecated.go | 28 + .../libp2p/go-libp2p-discovery/deprecated.go | 32 + .../libp2p/go-libp2p-discovery/go.mod | 13 +- .../libp2p/go-libp2p-discovery/go.sum | 157 +- .../libp2p/go-libp2p-discovery/routing.go | 25 +- .../libp2p/go-libp2p-discovery/util.go | 17 +- .../github.com/libp2p/go-libp2p-host/Makefile | 13 - .../libp2p/go-libp2p-host/README.md | 33 - .../libp2p/go-libp2p-host/codecov.yml | 3 - .../github.com/libp2p/go-libp2p-host/go.mod | 12 - .../github.com/libp2p/go-libp2p-host/go.sum | 118 - .../libp2p/go-libp2p-host/helpers.go | 11 - .../libp2p/go-libp2p-host/package.json | 66 - .../go-libp2p-interface-connmgr/.travis.yml | 32 - .../go-libp2p-interface-connmgr/Makefile | 13 - .../go-libp2p-interface-connmgr/README.md | 35 - .../go-libp2p-interface-connmgr/codecov.yml | 3 - .../libp2p/go-libp2p-interface-connmgr/go.mod | 7 - .../libp2p/go-libp2p-interface-connmgr/go.sum | 106 - .../go-libp2p-interface-connmgr/null.go | 30 - .../go-libp2p-interface-connmgr/package.json | 36 - .../go-libp2p-interface-pnet/.travis.yml | 32 - .../libp2p/go-libp2p-interface-pnet/LICENSE | 22 - .../libp2p/go-libp2p-interface-pnet/Makefile | 11 - .../libp2p/go-libp2p-interface-pnet/README.md | 37 - .../go-libp2p-interface-pnet/codecov.yml | 3 - .../libp2p/go-libp2p-interface-pnet/error.go | 29 - .../libp2p/go-libp2p-interface-pnet/go.mod | 1 - .../go-libp2p-interface-pnet/interface.go | 38 - .../go-libp2p-interface-pnet/package.json | 18 - .../libp2p/go-libp2p-kad-dht/dht.go | 31 +- .../libp2p/go-libp2p-kad-dht/dht_bootstrap.go | 10 +- .../libp2p/go-libp2p-kad-dht/dht_net.go | 77 +- .../libp2p/go-libp2p-kad-dht/dial_queue.go | 2 +- .../libp2p/go-libp2p-kad-dht/go.mod | 38 +- .../libp2p/go-libp2p-kad-dht/go.sum | 265 +- .../libp2p/go-libp2p-kad-dht/handlers.go | 18 +- .../libp2p/go-libp2p-kad-dht/lookup.go | 3 +- .../go-libp2p-kad-dht/metrics/metrics.go | 45 +- .../libp2p/go-libp2p-kad-dht/notif.go | 26 +- .../libp2p/go-libp2p-kad-dht/opts/options.go | 2 +- .../libp2p/go-libp2p-kad-dht/pb/message.go | 56 +- .../go-libp2p-kad-dht/providers/providers.go | 3 +- .../libp2p/go-libp2p-kad-dht/query.go | 74 +- .../libp2p/go-libp2p-kad-dht/records.go | 7 +- .../libp2p/go-libp2p-kad-dht/routing.go | 104 +- .../go-libp2p-kad-dht/routing_options.go | 10 +- .../libp2p/go-libp2p-kbucket/.travis.yml | 2 - .../libp2p/go-libp2p-kbucket/Makefile | 9 - .../libp2p/go-libp2p-kbucket/README.md | 4 + .../libp2p/go-libp2p-kbucket/bucket.go | 2 +- .../libp2p/go-libp2p-kbucket/go.mod | 6 +- .../libp2p/go-libp2p-kbucket/go.sum | 30 +- .../libp2p/go-libp2p-kbucket/keyspace/xor.go | 2 +- .../libp2p/go-libp2p-kbucket/package.json | 46 - .../libp2p/go-libp2p-kbucket/sorting.go | 67 +- .../libp2p/go-libp2p-kbucket/table.go | 42 +- .../libp2p/go-libp2p-kbucket/util.go | 7 +- .../libp2p/go-libp2p-loggables/.travis.yml | 6 +- .../libp2p/go-libp2p-loggables/Makefile | 14 - .../libp2p/go-libp2p-loggables/README.md | 12 +- .../libp2p/go-libp2p-loggables/go.mod | 5 +- .../libp2p/go-libp2p-loggables/go.sum | 23 +- .../libp2p/go-libp2p-loggables/loggables.go | 2 +- .../libp2p/go-libp2p-loggables/package.json | 42 - .../libp2p/go-libp2p-metrics/.travis.yml | 32 - .../libp2p/go-libp2p-metrics/Makefile | 11 - .../libp2p/go-libp2p-metrics/README.md | 33 - .../libp2p/go-libp2p-metrics/bw_stats.go | 83 - .../libp2p/go-libp2p-metrics/codecov.yml | 3 - .../libp2p/go-libp2p-metrics/go.mod | 7 - .../libp2p/go-libp2p-metrics/interface.go | 16 - .../libp2p/go-libp2p-metrics/package.json | 36 - .../.gitignore | 0 .../go-libp2p-mplex}/.travis.yml | 2 - .../go-libp2p-mplex}/LICENSE | 0 .../go-libp2p-mplex}/Makefile | 0 .../go-libp2p-mplex}/README.md | 6 +- .../github.com/libp2p/go-libp2p-mplex/go.mod | 9 + .../go.sum | 34 +- .../go-libp2p-mplex}/multiplex.go | 11 +- .../libp2p/go-libp2p-net/.travis.yml | 32 - .../github.com/libp2p/go-libp2p-net/LICENSE | 21 - .../github.com/libp2p/go-libp2p-net/Makefile | 13 - .../github.com/libp2p/go-libp2p-net/README.md | 44 - .../libp2p/go-libp2p-net/codecov.yml | 3 - vendor/github.com/libp2p/go-libp2p-net/go.mod | 11 - vendor/github.com/libp2p/go-libp2p-net/go.sum | 104 - .../libp2p/go-libp2p-net/options.go | 25 - .../libp2p/go-libp2p-net/package.json | 60 - .../libp2p/go-libp2p-netutil/.travis.yml | 32 - .../libp2p/go-libp2p-netutil/Makefile | 11 - .../libp2p/go-libp2p-netutil/README.md | 10 - .../libp2p/go-libp2p-netutil/codecov.yml | 3 - .../libp2p/go-libp2p-netutil/go.mod | 9 - .../libp2p/go-libp2p-netutil/key.go | 178 - .../libp2p/go-libp2p-netutil/package.json | 53 - .../libp2p/go-libp2p-peer/.travis.yml | 2 - .../github.com/libp2p/go-libp2p-peer/Makefile | 11 - .../libp2p/go-libp2p-peer/README.md | 10 +- .../libp2p/go-libp2p-peer/deprecated.go | 65 + .../github.com/libp2p/go-libp2p-peer/go.mod | 6 +- .../github.com/libp2p/go-libp2p-peer/go.sum | 24 +- .../libp2p/go-libp2p-peer/package.json | 36 - .../libp2p/go-libp2p-peer/test/utils.go | 39 - .../libp2p/go-libp2p-peerstore/go.mod | 7 +- .../libp2p/go-libp2p-peerstore/go.sum | 24 +- .../libp2p/go-libp2p-peerstore/interface.go | 152 +- .../libp2p/go-libp2p-peerstore/metrics.go | 14 +- .../libp2p/go-libp2p-peerstore/peerinfo.go | 115 +- .../libp2p/go-libp2p-peerstore/peerstore.go | 117 +- .../pstoremem/addr_book.go | 153 +- .../go-libp2p-peerstore/pstoremem/metadata.go | 6 +- .../pstoremem/peerstore.go | 1 + .../pstoremem/protobook.go | 142 + .../libp2p/go-libp2p-pnet/.travis.yml | 6 +- .../github.com/libp2p/go-libp2p-pnet/Makefile | 8 - .../libp2p/go-libp2p-pnet/README.md | 11 +- .../github.com/libp2p/go-libp2p-pnet/codec.go | 61 +- .../github.com/libp2p/go-libp2p-pnet/go.mod | 9 +- .../github.com/libp2p/go-libp2p-pnet/go.sum | 74 +- .../libp2p/go-libp2p-pnet/package.json | 43 - .../libp2p/go-libp2p-pnet/protector.go | 2 +- .../libp2p/go-libp2p-pnet/psk_conn.go | 11 +- .../libp2p/go-libp2p-protocol/.travis.yml | 32 - .../libp2p/go-libp2p-protocol/LICENSE | 21 - .../libp2p/go-libp2p-protocol/Makefile | 11 - .../libp2p/go-libp2p-protocol/README.md | 42 - .../libp2p/go-libp2p-protocol/codecov.yml | 3 - .../libp2p/go-libp2p-protocol/go.mod | 1 - .../libp2p/go-libp2p-protocol/package.json | 15 - .../go-libp2p-pubsub-router/.travis.yml | 2 - .../libp2p/go-libp2p-pubsub-router/Makefile | 9 - .../libp2p/go-libp2p-pubsub-router/README.md | 12 +- .../libp2p/go-libp2p-pubsub-router/go.mod | 19 +- .../libp2p/go-libp2p-pubsub-router/go.sum | 184 +- .../go-libp2p-pubsub-router/package.json | 97 - .../libp2p/go-libp2p-pubsub-router/pubsub.go | 52 +- .../libp2p/go-libp2p-pubsub/.travis.yml | 2 - .../libp2p/go-libp2p-pubsub/Makefile | 7 - .../libp2p/go-libp2p-pubsub/README.md | 5 + .../libp2p/go-libp2p-pubsub/blacklist.go | 2 +- .../libp2p/go-libp2p-pubsub/comm.go | 16 +- .../libp2p/go-libp2p-pubsub/floodsub.go | 6 +- .../github.com/libp2p/go-libp2p-pubsub/go.mod | 14 +- .../github.com/libp2p/go-libp2p-pubsub/go.sum | 159 +- .../libp2p/go-libp2p-pubsub/gossipsub.go | 6 +- .../libp2p/go-libp2p-pubsub/notify.go | 16 +- .../libp2p/go-libp2p-pubsub/package.json | 95 - .../libp2p/go-libp2p-pubsub/pubsub.go | 367 +- .../libp2p/go-libp2p-pubsub/randomsub.go | 6 +- .../libp2p/go-libp2p-pubsub/sign.go | 4 +- .../libp2p/go-libp2p-pubsub/validation.go | 391 + .../go-libp2p-quic-transport/.travis.yml | 1 - .../libp2p/go-libp2p-quic-transport/README.md | 8 + .../libp2p/go-libp2p-quic-transport/conn.go | 15 +- .../libp2p/go-libp2p-quic-transport/crypto.go | 4 +- .../libp2p/go-libp2p-quic-transport/go.mod | 9 +- .../libp2p/go-libp2p-quic-transport/go.sum | 90 +- .../go-libp2p-quic-transport/listener.go | 11 +- .../libp2p/go-libp2p-quic-transport/stream.go | 5 +- .../go-libp2p-quic-transport/transport.go | 33 +- .../libp2p/go-libp2p-record/.travis.yml | 2 - .../libp2p/go-libp2p-record/Makefile | 9 - .../libp2p/go-libp2p-record/README.md | 12 +- .../github.com/libp2p/go-libp2p-record/go.mod | 4 +- .../github.com/libp2p/go-libp2p-record/go.sum | 42 +- .../libp2p/go-libp2p-record/package.json | 50 - .../go-libp2p-routing-helpers/.travis.yml | 2 - .../libp2p/go-libp2p-routing-helpers/Makefile | 9 - .../go-libp2p-routing-helpers/README.md | 12 +- .../go-libp2p-routing-helpers/composed.go | 27 +- .../libp2p/go-libp2p-routing-helpers/go.mod | 11 +- .../libp2p/go-libp2p-routing-helpers/go.sum | 72 +- .../go-libp2p-routing-helpers/limited.go | 14 +- .../libp2p/go-libp2p-routing-helpers/null.go | 24 +- .../go-libp2p-routing-helpers/package.json | 70 - .../go-libp2p-routing-helpers/parallel.go | 75 +- .../go-libp2p-routing-helpers/tiered.go | 32 +- .../libp2p/go-libp2p-routing/.travis.yml | 32 - .../libp2p/go-libp2p-routing/Makefile | 9 - .../libp2p/go-libp2p-routing/README.md | 26 - .../libp2p/go-libp2p-routing/codecov.yml | 3 - .../libp2p/go-libp2p-routing/go.mod | 8 - .../libp2p/go-libp2p-routing/go.sum | 104 - .../notifications/deprecated.go | 48 + .../libp2p/go-libp2p-routing/package.json | 42 - .../github.com/libp2p/go-libp2p-secio/al.go | 2 +- .../github.com/libp2p/go-libp2p-secio/go.mod | 15 +- .../github.com/libp2p/go-libp2p-secio/go.sum | 38 + .../go-libp2p-secio/gx-workspace-update.json | 35 - .../libp2p/go-libp2p-secio/protocol.go | 9 +- .../github.com/libp2p/go-libp2p-secio/rw.go | 2 +- .../libp2p/go-libp2p-secio/transport.go | 12 +- .../libp2p/go-libp2p-swarm/.travis.yml | 2 - .../libp2p/go-libp2p-swarm/Makefile | 13 - .../libp2p/go-libp2p-swarm/README.md | 4 + .../libp2p/go-libp2p-swarm/dial_error.go | 70 + .../libp2p/go-libp2p-swarm/dial_sync.go | 2 +- .../github.com/libp2p/go-libp2p-swarm/go.mod | 34 +- .../github.com/libp2p/go-libp2p-swarm/go.sum | 155 +- .../libp2p/go-libp2p-swarm/limiter.go | 9 +- .../libp2p/go-libp2p-swarm/package.json | 167 - .../libp2p/go-libp2p-swarm/swarm.go | 76 +- .../libp2p/go-libp2p-swarm/swarm_conn.go | 35 +- .../libp2p/go-libp2p-swarm/swarm_dial.go | 89 +- .../libp2p/go-libp2p-swarm/swarm_listen.go | 7 +- .../libp2p/go-libp2p-swarm/swarm_stream.go | 20 +- .../libp2p/go-libp2p-swarm/swarm_transport.go | 3 +- .../libp2p/go-libp2p-tls/.travis.yml | 36 + .../libp2p/go-libp2p-tls/LICENSE.md | 7 + .../github.com/libp2p/go-libp2p-tls/README.md | 44 + .../libp2p/go-libp2p-tls/codecov.yml | 7 + .../github.com/libp2p/go-libp2p-tls/conn.go | 37 + .../github.com/libp2p/go-libp2p-tls/crypto.go | 223 + .../libp2p/go-libp2p-tls/extension.go | 22 + vendor/github.com/libp2p/go-libp2p-tls/go.mod | 11 + .../go-libp2p-tls}/go.sum | 62 +- .../libp2p/go-libp2p-tls/transport.go | 136 + .../go-libp2p-transport-upgrader/.travis.yml | 2 - .../go-libp2p-transport-upgrader/Makefile | 11 - .../go-libp2p-transport-upgrader/README.md | 32 +- .../go-libp2p-transport-upgrader/conn.go | 12 +- .../go-libp2p-transport-upgrader/go.mod | 18 +- .../go-libp2p-transport-upgrader/go.sum | 82 +- .../go-libp2p-transport-upgrader/listener.go | 9 +- .../go-libp2p-transport-upgrader/package.json | 101 - .../go-libp2p-transport-upgrader/upgrader.go | 37 +- .../libp2p/go-libp2p-transport/.travis.yml | 32 - .../libp2p/go-libp2p-transport/LICENSE | 21 - .../libp2p/go-libp2p-transport/Makefile | 11 - .../libp2p/go-libp2p-transport/README.md | 48 - .../libp2p/go-libp2p-transport/codecov.yml | 3 - .../libp2p/go-libp2p-transport/go.mod | 10 - .../libp2p/go-libp2p-transport/go.sum | 116 - .../libp2p/go-libp2p-transport/package.json | 53 - .../.gitignore | 0 .../go-libp2p-yamux}/.travis.yml | 2 - .../LICENSE | 0 .../go-libp2p-yamux}/Makefile | 0 .../libp2p/go-libp2p-yamux/README.md | 25 + .../github.com/libp2p/go-libp2p-yamux/go.mod | 7 + .../go.sum | 35 +- .../go-libp2p-yamux}/package.json | 2 +- .../go-libp2p-yamux}/yamux.go | 34 +- .../libp2p/go-libp2p/config/config.go | 28 +- .../go-libp2p/config/constructor_types.go | 27 +- .../libp2p/go-libp2p/config/muxer.go | 18 +- .../go-libp2p/config/reflection_magic.go | 2 +- .../libp2p/go-libp2p/config/security.go | 27 +- .../libp2p/go-libp2p/config/transport.go | 5 +- .../github.com/libp2p/go-libp2p/defaults.go | 6 +- vendor/github.com/libp2p/go-libp2p/go.mod | 60 +- vendor/github.com/libp2p/go-libp2p/go.sum | 201 +- vendor/github.com/libp2p/go-libp2p/libp2p.go | 2 +- vendor/github.com/libp2p/go-libp2p/options.go | 17 +- .../libp2p/go-libp2p/p2p/discovery/mdns.go | 10 +- .../go-libp2p/p2p/host/basic/basic_host.go | 85 +- .../libp2p/go-libp2p/p2p/host/basic/natmgr.go | 20 +- .../go-libp2p/p2p/host/relay/autorelay.go | 38 +- .../libp2p/go-libp2p/p2p/host/relay/relay.go | 6 +- .../go-libp2p/p2p/host/routed/routed.go | 42 +- .../go-libp2p/p2p/net/mock/interface.go | 105 - .../libp2p/go-libp2p/p2p/net/mock/mock.go | 52 - .../go-libp2p/p2p/net/mock/mock_conn.go | 160 - .../go-libp2p/p2p/net/mock/mock_link.go | 99 - .../libp2p/go-libp2p/p2p/net/mock/mock_net.go | 396 - .../go-libp2p/p2p/net/mock/mock_peernet.go | 385 - .../go-libp2p/p2p/net/mock/mock_printer.go | 36 - .../go-libp2p/p2p/net/mock/mock_stream.go | 266 - .../go-libp2p/p2p/net/mock/ratelimiter.go | 75 - .../go-libp2p/p2p/protocol/identify/id.go | 70 +- .../p2p/protocol/identify/obsaddr.go | 15 +- .../go-libp2p/p2p/protocol/ping/ping.go | 70 +- .../libp2p/go-maddr-filter/.travis.yml | 2 - .../libp2p/go-maddr-filter/Makefile | 11 - .../libp2p/go-maddr-filter/README.md | 25 +- .../libp2p/go-maddr-filter/filter.go | 157 +- .../libp2p/go-maddr-filter/package.json | 30 - vendor/github.com/libp2p/go-mplex/.travis.yml | 2 - vendor/github.com/libp2p/go-mplex/Makefile | 13 - vendor/github.com/libp2p/go-mplex/README.md | 11 +- vendor/github.com/libp2p/go-mplex/deadline.go | 80 + vendor/github.com/libp2p/go-mplex/go.mod | 2 +- vendor/github.com/libp2p/go-mplex/go.sum | 51 +- .../github.com/libp2p/go-mplex/multiplex.go | 243 +- .../github.com/libp2p/go-mplex/package.json | 35 - vendor/github.com/libp2p/go-mplex/stream.go | 142 +- vendor/github.com/libp2p/go-msgio/chan.go | 5 - vendor/github.com/libp2p/go-msgio/msgio.go | 49 +- vendor/github.com/libp2p/go-msgio/varint.go | 59 +- .../go-stream-muxer-multistream}/.gitignore | 0 .../.travis.yml | 2 - .../LICENSE | 0 .../go-stream-muxer-multistream}/Makefile | 0 .../go-stream-muxer-multistream}/README.md | 4 +- .../libp2p/go-stream-muxer-multistream/go.mod | 8 + .../go.sum | 31 +- .../multistream.go | 11 +- .../libp2p/go-stream-muxer/.gxignore | 1 - .../libp2p/go-stream-muxer/.travis.yml | 32 - .../libp2p/go-stream-muxer/Makefile | 13 - .../libp2p/go-stream-muxer/README.md | 114 - .../libp2p/go-stream-muxer/codecov.yml | 3 - .../github.com/libp2p/go-stream-muxer/go.mod | 1 - .../libp2p/go-stream-muxer/muxer.go | 55 - .../libp2p/go-stream-muxer/package.json | 15 - .../libp2p/go-tcp-transport/Makefile | 11 - .../libp2p/go-tcp-transport/README.md | 13 +- .../github.com/libp2p/go-tcp-transport/go.mod | 14 +- .../github.com/libp2p/go-tcp-transport/go.sum | 110 +- .../libp2p/go-tcp-transport/package.json | 83 - .../libp2p/go-tcp-transport/reuseport.go | 2 +- .../github.com/libp2p/go-tcp-transport/tcp.go | 19 +- .../github.com/libp2p/go-testutil/.travis.yml | 32 - vendor/github.com/libp2p/go-testutil/LICENSE | 21 - vendor/github.com/libp2p/go-testutil/Makefile | 10 - .../github.com/libp2p/go-testutil/README.md | 34 - .../github.com/libp2p/go-testutil/codecov.yml | 3 - vendor/github.com/libp2p/go-testutil/gen.go | 154 - vendor/github.com/libp2p/go-testutil/go.mod | 8 - .../github.com/libp2p/go-testutil/identity.go | 60 - .../libp2p/go-testutil/latency_config.go | 48 - .../libp2p/go-testutil/package.json | 47 - vendor/github.com/libp2p/go-testutil/rand.go | 36 - vendor/github.com/libp2p/go-testutil/util.go | 21 - .../libp2p/go-ws-transport/.travis.yml | 1 - .../libp2p/go-ws-transport/Makefile | 10 - .../libp2p/go-ws-transport/README.md | 20 +- .../github.com/libp2p/go-ws-transport/go.mod | 11 +- .../github.com/libp2p/go-ws-transport/go.sum | 88 +- .../libp2p/go-ws-transport/listener.go | 2 +- .../libp2p/go-ws-transport/package.json | 72 - .../libp2p/go-ws-transport/websocket.go | 14 +- .../yamux => libp2p/go-yamux}/.gitignore | 0 .../yamux => libp2p/go-yamux}/LICENSE | 0 vendor/github.com/libp2p/go-yamux/LICENSE-BSD | 27 + .../yamux => libp2p/go-yamux}/README.md | 2 +- .../yamux => libp2p/go-yamux}/addr.go | 0 .../yamux => libp2p/go-yamux}/const.go | 43 +- vendor/github.com/libp2p/go-yamux/deadline.go | 80 + vendor/github.com/libp2p/go-yamux/go.mod | 5 + vendor/github.com/libp2p/go-yamux/go.sum | 2 + .../yamux => libp2p/go-yamux}/mux.go | 22 +- .../yamux => libp2p/go-yamux}/session.go | 334 +- .../yamux => libp2p/go-yamux}/spec.md | 0 .../yamux => libp2p/go-yamux}/stream.go | 123 +- .../yamux => libp2p/go-yamux}/util.go | 28 +- .../internal/handshake/crypto_setup.go | 27 +- .../quic-go/internal/protocol/version.go | 8 +- .../magiconair/properties/.travis.yml | 2 + .../magiconair/properties/CHANGELOG.md | 8 + .../magiconair/properties/README.md | 4 +- .../github.com/magiconair/properties/go.mod | 1 + .../github.com/magiconair/properties/load.go | 2 +- .../marten-seemann/qtls/.travis.yml | 28 + vendor/github.com/marten-seemann/qtls/LICENSE | 27 + .../github.com/marten-seemann/qtls/README.md | 6 + .../github.com/marten-seemann/qtls/common.go | 7 + .../qtls/handshake_client_tls13.go | 12 + .../qtls/handshake_server_tls13.go | 4 + vendor/github.com/mattn/go-colorable/go.mod | 2 +- .../mattn/go-isatty/isatty_others.go | 2 +- .../{isatty_linux.go => isatty_tcgets.go} | 2 +- .../github.com/mattn/go-runewidth/.travis.yml | 8 + .../hashland => mattn/go-runewidth}/LICENSE | 3 +- .../github.com/mattn/go-runewidth/README.mkd | 27 + .../mattn/go-runewidth/runewidth.go | 977 ++ .../mattn/go-runewidth/runewidth_appengine.go | 8 + .../mattn/go-runewidth/runewidth_js.go | 9 + .../mattn/go-runewidth/runewidth_posix.go | 79 + .../mattn/go-runewidth/runewidth_windows.go | 28 + vendor/github.com/miekg/dns/Gopkg.lock | 40 +- vendor/github.com/miekg/dns/README.md | 2 + vendor/github.com/miekg/dns/acceptfunc.go | 3 - vendor/github.com/miekg/dns/client.go | 78 +- vendor/github.com/miekg/dns/dns.go | 4 +- vendor/github.com/miekg/dns/dnssec.go | 7 +- vendor/github.com/miekg/dns/dnssec_keygen.go | 46 +- vendor/github.com/miekg/dns/dnssec_keyscan.go | 34 +- vendor/github.com/miekg/dns/edns.go | 2 +- vendor/github.com/miekg/dns/msg_helpers.go | 25 +- vendor/github.com/miekg/dns/msg_truncate.go | 2 +- vendor/github.com/miekg/dns/privaterr.go | 38 +- vendor/github.com/miekg/dns/scan.go | 104 +- vendor/github.com/miekg/dns/scan_rr.go | 829 +- vendor/github.com/miekg/dns/server.go | 6 +- vendor/github.com/miekg/dns/tsig.go | 2 +- vendor/github.com/miekg/dns/types.go | 31 +- vendor/github.com/miekg/dns/types_generate.go | 4 +- vendor/github.com/miekg/dns/version.go | 2 +- vendor/github.com/miekg/dns/xfr.go | 5 +- vendor/github.com/miekg/dns/ztypes.go | 16 +- .../mr-tron/base58/base58/base58.go | 20 +- .../multiformats/go-multiaddr-fmt/.travis.yml | 33 + .../go-multiaddr-fmt}/LICENSE | 0 .../multiformats/go-multiaddr-fmt/README.md | 34 + .../multiformats/go-multiaddr-fmt/go.mod | 6 + .../multiformats/go-multiaddr-fmt/go.sum | 20 + .../go-multiaddr-fmt/package.json | 30 + .../multiformats/go-multiaddr-fmt/patterns.go | 172 + .../multiformats/go-multiaddr/.gitignore | 2 + .../multiformats/go-multiaddr/.travis.yml | 5 +- .../multiformats/go-multiaddr/Makefile | 12 + .../multiformats/go-multiaddr/codec.go | 19 +- .../multiformats/go-multiaddr/codecov.yml | 2 + .../multiformats/go-multiaddr/multiaddr.go | 4 + .../multiformats/go-multiaddr/protocols.go | 11 +- .../multiformats/go-multiaddr/transcoders.go | 49 +- .../multiformats/go-multicodec/.travis.yml | 17 - .../multiformats/go-multicodec/LICENSE | 21 - .../multiformats/go-multicodec/Makefile | 11 - .../multiformats/go-multicodec/README.md | 84 - .../go-multicodec/base/b64/codec.go | 64 - .../go-multicodec/base/bin/codec.go | 64 - .../multiformats/go-multicodec/base/errors.go | 7 - .../go-multicodec/base/hex/codec.go | 69 - .../go-multicodec/base/mux/mux.go | 20 - .../multiformats/go-multicodec/cbor/cbor.go | 85 - .../multiformats/go-multicodec/coding.go | 55 - .../multiformats/go-multicodec/header.go | 140 - .../multiformats/go-multicodec/json/json.go | 145 - .../multiformats/go-multicodec/multicodec.go | 70 - .../multiformats/go-multicodec/mux/all.go | 15 - .../multiformats/go-multicodec/mux/mux.go | 120 - .../multiformats/go-multicodec/package.json | 42 - .../multiformats/go-multihash/.travis.yml | 2 - .../multiformats/go-multihash/go.mod | 10 +- .../multiformats/go-multihash/go.sum | 26 +- .../multiformats/go-multihash/multihash.go | 2 +- .../multiformats/go-multihash/package.json | 54 - .../multiformats/go-multihash/sum.go | 22 +- .../multiformats/go-multistream/README.md | 5 - .../multiformats/go-multistream/client.go | 70 +- .../multiformats/go-multistream/lazyClient.go | 5 +- .../go-multistream/multistream-fuzz.zip | Bin 0 -> 2339352 bytes .../go-multistream/multistream.go | 48 +- .../go-multistream/multistream_fuzz.go | 28 + .../olekukonko/tablewriter/.gitignore | 15 + .../olekukonko/tablewriter/.travis.yml | 14 + .../tablewriter/LICENSE.md} | 4 +- .../olekukonko/tablewriter/README.md | 277 + .../github.com/olekukonko/tablewriter/csv.go | 52 + .../olekukonko/tablewriter/table.go | 839 ++ .../tablewriter/table_with_color.go | 134 + .../github.com/olekukonko/tablewriter/util.go | 93 + .../github.com/olekukonko/tablewriter/wrap.go | 99 + .../pelletier/go-toml/.dockerignore | 2 + .../github.com/pelletier/go-toml/.gitignore | 3 + .../github.com/pelletier/go-toml/Dockerfile | 10 + vendor/github.com/pelletier/go-toml/README.md | 17 + .../github.com/pelletier/go-toml/marshal.go | 42 +- .../marshal_OrderPreserve_Map_test.toml | 17 + vendor/github.com/pelletier/go-toml/toml.go | 2 +- .../pelletier/go-toml/tomltree_write.go | 2 +- vendor/github.com/prometheus/tsdb/LICENSE | 201 + .../prometheus/tsdb/fileutil/dir_unix.go | 22 + .../prometheus/tsdb/fileutil/dir_windows.go | 46 + .../prometheus/tsdb/fileutil/fileutil.go | 149 + .../prometheus/tsdb/fileutil/flock.go | 41 + .../prometheus/tsdb/fileutil/flock_plan9.go | 32 + .../prometheus/tsdb/fileutil/flock_solaris.go | 59 + .../prometheus/tsdb/fileutil/flock_unix.go | 54 + .../prometheus/tsdb/fileutil/flock_windows.go | 36 + .../prometheus/tsdb/fileutil/mmap.go | 61 + .../prometheus/tsdb/fileutil/mmap_386.go | 18 + .../prometheus/tsdb/fileutil/mmap_amd64.go | 18 + .../prometheus/tsdb/fileutil/mmap_unix.go | 30 + .../prometheus/tsdb/fileutil/mmap_windows.go | 46 + .../prometheus/tsdb/fileutil/preallocate.go | 54 + .../tsdb/fileutil/preallocate_darwin.go | 41 + .../tsdb/fileutil/preallocate_linux.go | 47 + .../tsdb/fileutil/preallocate_other.go | 25 + .../prometheus/tsdb/fileutil/sync.go | 24 + .../prometheus/tsdb/fileutil/sync_darwin.go | 27 + .../prometheus/tsdb/fileutil/sync_linux.go | 29 + vendor/github.com/rs/cors/.travis.yml | 8 +- vendor/github.com/rs/cors/README.md | 20 +- vendor/github.com/rs/cors/cors.go | 123 +- vendor/github.com/rs/cors/go.mod | 1 + vendor/github.com/rs/cors/utils.go | 7 +- vendor/github.com/rs/xhandler/.travis.yml | 7 - vendor/github.com/rs/xhandler/LICENSE | 19 - vendor/github.com/rs/xhandler/README.md | 134 - vendor/github.com/rs/xhandler/chain.go | 93 - vendor/github.com/rs/xhandler/middleware.go | 59 - vendor/github.com/rs/xhandler/xhandler.go | 42 - vendor/github.com/sirupsen/logrus/.travis.yml | 12 +- .../github.com/sirupsen/logrus/CHANGELOG.md | 2 + vendor/github.com/sirupsen/logrus/go.mod | 2 +- vendor/github.com/sirupsen/logrus/go.sum | 3 + ...ck_js.go => terminal_check_no_terminal.go} | 2 +- .../logrus/terminal_check_notappengine.go | 2 +- .../sirupsen/logrus/terminal_check_solaris.go | 11 + .../sirupsen/logrus/terminal_check_windows.go | 18 +- .../sirupsen/logrus/terminal_notwindows.go | 8 - .../sirupsen/logrus/terminal_windows.go | 18 - .../sirupsen/logrus/text_formatter.go | 4 - .../spacemonkeygo/openssl/.gitignore | 1 + .../github.com/spacemonkeygo/openssl/AUTHORS | 24 + .../github.com/spacemonkeygo/openssl/LICENSE | 191 + .../spacemonkeygo/openssl/README.md | 30 + .../github.com/spacemonkeygo/openssl/bio.go | 305 + .../github.com/spacemonkeygo/openssl/build.go | 24 + .../spacemonkeygo/openssl/build_static.go | 24 + .../github.com/spacemonkeygo/openssl/cert.go | 415 + .../spacemonkeygo/openssl/ciphers.go | 335 + .../spacemonkeygo/openssl/ciphers_gcm.go | 152 + .../github.com/spacemonkeygo/openssl/conn.go | 620 ++ .../github.com/spacemonkeygo/openssl/ctx.go | 568 + vendor/github.com/spacemonkeygo/openssl/dh.go | 66 + .../spacemonkeygo/openssl/dhparam.go | 64 + .../spacemonkeygo/openssl/digest.go | 51 + .../spacemonkeygo/openssl/engine.go | 50 + .../github.com/spacemonkeygo/openssl/fips.go | 39 + .../github.com/spacemonkeygo/openssl/go.mod | 3 + .../github.com/spacemonkeygo/openssl/go.sum | 2 + .../github.com/spacemonkeygo/openssl/hmac.go | 91 + .../spacemonkeygo/openssl/hostname.c | 373 + .../spacemonkeygo/openssl/hostname.go | 132 + .../github.com/spacemonkeygo/openssl/http.go | 61 + .../github.com/spacemonkeygo/openssl/init.go | 117 + .../spacemonkeygo/openssl/init_posix.go | 68 + .../spacemonkeygo/openssl/init_windows.go | 57 + .../github.com/spacemonkeygo/openssl/key.go | 504 + .../spacemonkeygo/openssl/mapping.go | 62 + .../github.com/spacemonkeygo/openssl/md4.go | 89 + .../github.com/spacemonkeygo/openssl/md5.go | 89 + .../github.com/spacemonkeygo/openssl/net.go | 147 + .../github.com/spacemonkeygo/openssl/nid.go | 210 + .../github.com/spacemonkeygo/openssl/pem.go | 32 + .../github.com/spacemonkeygo/openssl/sha1.go | 96 + .../spacemonkeygo/openssl/sha256.go | 89 + .../github.com/spacemonkeygo/openssl/shim.c | 770 ++ .../github.com/spacemonkeygo/openssl/shim.h | 172 + vendor/github.com/spacemonkeygo/openssl/sni.c | 23 + .../github.com/spacemonkeygo/openssl/ssl.go | 170 + .../spacemonkeygo/openssl/tickets.go | 222 + .../spacemonkeygo/openssl/utils/errors.go | 50 + .../spacemonkeygo/openssl/utils/future.go | 79 + .../spacemonkeygo/spacelog/.travis.yml | 6 + .../github.com/spacemonkeygo/spacelog/LICENSE | 191 + .../spacemonkeygo/spacelog/README.md | 19 + .../spacemonkeygo/spacelog/capture.go | 67 + .../spacemonkeygo/spacelog/capture_ae.go | 25 + .../spacemonkeygo/spacelog/capture_linux.go | 35 + .../spacemonkeygo/spacelog/capture_other.go | 38 + .../spacemonkeygo/spacelog/capture_solaris.go | 33 + .../spacemonkeygo/spacelog/capture_windows.go | 23 + .../spacemonkeygo/spacelog/collection.go | 271 + .../spacemonkeygo/spacelog/convenience.go | 296 + .../github.com/spacemonkeygo/spacelog/doc.go | 39 + .../spacemonkeygo/spacelog/event.go | 75 + .../spacemonkeygo/spacelog/handler.go | 53 + .../spacemonkeygo/spacelog/level.go | 136 + .../spacemonkeygo/spacelog/logger.go | 61 + .../spacemonkeygo/spacelog/output.go | 178 + .../spacemonkeygo/spacelog/output_other.go | 19 + .../spacemonkeygo/spacelog/output_windows.go | 17 + .../spacemonkeygo/spacelog/setup.go | 189 + .../spacelog/sighup_appengine.go | 37 + .../spacemonkeygo/spacelog/sighup_other.go | 23 + .../spacemonkeygo/spacelog/syslog.go | 65 + .../spacemonkeygo/spacelog/syslog_windows.go | 26 + .../spacemonkeygo/spacelog/templates.go | 69 + .../spacelog/templates_others.go | 22 + .../spacelog/templates_windows.go | 20 + .../github.com/spacemonkeygo/spacelog/text.go | 80 + vendor/github.com/spf13/cobra/.gitignore | 2 + vendor/github.com/spf13/cobra/.travis.yml | 26 +- vendor/github.com/spf13/cobra/README.md | 61 +- vendor/github.com/spf13/cobra/args.go | 12 + .../spf13/cobra/bash_completions.go | 63 +- .../spf13/cobra/bash_completions.md | 39 +- vendor/github.com/spf13/cobra/cobra.go | 7 + vendor/github.com/spf13/cobra/command.go | 103 +- vendor/github.com/spf13/cobra/command_win.go | 8 +- vendor/github.com/spf13/cobra/go.mod | 13 + vendor/github.com/spf13/cobra/go.sum | 51 + .../spf13/cobra/powershell_completions.go | 100 + .../spf13/cobra/powershell_completions.md | 14 + .../spf13/cobra/shell_completions.go | 85 + .../github.com/spf13/cobra/zsh_completions.go | 358 +- .../github.com/spf13/cobra/zsh_completions.md | 39 + vendor/github.com/spf13/viper/go.mod | 29 +- vendor/github.com/spf13/viper/go.sum | 153 +- vendor/github.com/spf13/viper/viper.go | 42 +- .../steakknife/bloomfilter/.travis.yml | 14 + .../steakknife/bloomfilter/MIT-LICENSE.txt | 8 + .../steakknife/bloomfilter/README.md | 120 + .../steakknife/bloomfilter/binarymarshaler.go | 87 + .../bloomfilter/binaryunmarshaler.go | 111 + .../steakknife/bloomfilter/bloomfilter.go | 123 + .../steakknife/bloomfilter/conformance.go | 29 + .../steakknife/bloomfilter/debug.go | 37 + .../steakknife/bloomfilter/errors.go | 34 + .../steakknife/bloomfilter/fileio.go | 105 + .../github.com/steakknife/bloomfilter/gob.go | 23 + .../steakknife/bloomfilter/iscompatible.go | 41 + .../github.com/steakknife/bloomfilter/new.go | 134 + .../steakknife/bloomfilter/optimal.go | 28 + .../steakknife/bloomfilter/statistics.go | 43 + .../steakknife/bloomfilter/textmarshaler.go | 49 + .../steakknife/bloomfilter/textunmarshaler.go | 150 + .../github.com/steakknife/hamming/.gitignore | 2 + .../github.com/steakknife/hamming/.travis.yml | 14 + .../steakknife/hamming/MIT-LICENSE.txt | 8 + .../github.com/steakknife/hamming/README.md | 82 + vendor/github.com/steakknife/hamming/doc.go | 35 + .../github.com/steakknife/hamming/hamming.go | 70 + .../steakknife/hamming/popcnt_amd64.go | 65 + .../steakknife/hamming/popcnt_amd64.s | 64 + .../github.com/steakknife/hamming/popcount.go | 134 + .../steakknife/hamming/popcount_slices.go | 123 + .../hamming/popcount_slices_amd64.go | 72 + .../hamming/popcount_slices_amd64.s | 370 + .../steakknife/hamming/slices_of_hamming.go | 144 + .../github.com/syndtr/goleveldb/leveldb/db.go | 24 +- .../syndtr/goleveldb/leveldb/db_compaction.go | 2 +- .../goleveldb/leveldb/db_transaction.go | 2 +- .../syndtr/goleveldb/leveldb/filter/bloom.go | 2 +- .../syndtr/goleveldb/leveldb/session.go | 55 +- .../goleveldb/leveldb/session_compaction.go | 12 +- .../syndtr/goleveldb/leveldb/session_util.go | 236 +- .../syndtr/goleveldb/leveldb/table.go | 89 +- .../syndtr/goleveldb/leveldb/version.go | 78 +- .../vulcanizedb/pkg/config/contract.go | 3 +- .../vulcanizedb/pkg/config/subscription.go | 59 + .../vulcanizedb/pkg/core/blockchain.go | 5 +- .../vulcanizedb/pkg/geth/blockchain.go | 2 +- .../vulcanizedb/pkg/geth/client/eth_client.go | 3 +- .../vulcanizedb/pkg/geth/client/rpc_client.go | 6 +- .../github.com/whyrusleeping/cbor/go/Makefile | 12 - .../github.com/whyrusleeping/cbor/go/cbor.go | 1625 --- .../github.com/whyrusleeping/cbor/go/doc.go | 24 - .../whyrusleeping/go-smux-multiplex/LICENSE | 21 - .../go-smux-multiplex/package.json | 30 - .../go-smux-multistream/.gitignore | 1 - .../whyrusleeping/go-smux-multistream/LICENSE | 21 - .../go-smux-multistream/README.md | 13 - .../go-smux-multistream/package.json | 30 - .../whyrusleeping/go-smux-yamux/.gitignore | 1 - .../whyrusleeping/go-smux-yamux/LICENSE | 21 - .../whyrusleeping/yamux/package.json | 24 - .../metric/metricdata/exemplar.go | 5 + .../metric/metricdata/label.go | 7 + .../metric/metricdata/metric.go | 10 +- vendor/go.opencensus.io/stats/record.go | 88 +- .../stats/view/view_to_metric.go | 23 +- vendor/go.opencensus.io/stats/view/worker.go | 2 + .../stats/view/worker_commands.go | 4 + vendor/go.opencensus.io/tag/key.go | 10 + vendor/go.opencensus.io/tag/map.go | 66 +- vendor/go.opencensus.io/tag/map_codec.go | 12 +- vendor/go.opencensus.io/tag/metadata.go | 52 + vendor/go.opencensus.io/tag/profile_19.go | 2 +- vendor/go.uber.org/atomic/.codecov.yml | 15 + vendor/go.uber.org/atomic/.gitignore | 11 + vendor/go.uber.org/atomic/.travis.yml | 27 + vendor/go.uber.org/atomic/LICENSE.txt | 19 + vendor/go.uber.org/atomic/Makefile | 51 + vendor/go.uber.org/atomic/README.md | 36 + vendor/go.uber.org/atomic/atomic.go | 351 + vendor/go.uber.org/atomic/error.go | 55 + vendor/go.uber.org/atomic/glide.lock | 17 + vendor/go.uber.org/atomic/glide.yaml | 6 + vendor/go.uber.org/atomic/string.go | 49 + vendor/go.uber.org/dig/.codecov.yml | 19 + vendor/go.uber.org/dig/.gitignore | 11 + vendor/go.uber.org/dig/.travis.yml | 18 + vendor/go.uber.org/dig/CHANGELOG.md | 160 + .../go-ipfs-addr => go.uber.org/dig}/LICENSE | 4 +- vendor/go.uber.org/dig/Makefile | 52 + vendor/go.uber.org/dig/README.md | 43 + vendor/go.uber.org/dig/check_license.sh | 23 + vendor/go.uber.org/dig/cycle.go | 142 + vendor/go.uber.org/dig/dig.go | 774 ++ vendor/go.uber.org/dig/doc.go | 334 + vendor/go.uber.org/dig/error.go | 324 + vendor/go.uber.org/dig/glide.lock | 17 + vendor/go.uber.org/dig/glide.yaml | 7 + vendor/go.uber.org/dig/graph.go | 179 + .../dig/internal/digreflect/func.go | 103 + vendor/go.uber.org/dig/internal/dot/README.md | 61 + vendor/go.uber.org/dig/internal/dot/graph.go | 466 + vendor/go.uber.org/dig/param.go | 454 + vendor/go.uber.org/dig/result.go | 406 + vendor/go.uber.org/dig/stringer.go | 106 + vendor/go.uber.org/dig/types.go | 159 + vendor/go.uber.org/dig/version.go | 24 + vendor/go.uber.org/fx/.codecov.yml | 15 + vendor/go.uber.org/fx/.gitignore | 13 + vendor/go.uber.org/fx/.travis.yml | 18 + vendor/go.uber.org/fx/CHANGELOG.md | 193 + vendor/go.uber.org/fx/CONTRIBUTING.md | 79 + .../fx}/LICENSE | 4 +- vendor/go.uber.org/fx/Makefile | 59 + vendor/go.uber.org/fx/README.md | 40 + vendor/go.uber.org/fx/annotated.go | 64 + vendor/go.uber.org/fx/app.go | 608 ++ vendor/go.uber.org/fx/doc.go | 39 + vendor/go.uber.org/fx/extract.go | 157 + vendor/go.uber.org/fx/glide.lock | 44 + vendor/go.uber.org/fx/glide.yaml | 25 + vendor/go.uber.org/fx/inout.go | 254 + vendor/go.uber.org/fx/internal/fxlog/fxlog.go | 80 + .../fx/internal/fxreflect/fxreflect.go | 163 + .../fx/internal/lifecycle/lifecycle.go | 92 + vendor/go.uber.org/fx/lifecycle.go | 52 + vendor/go.uber.org/fx/populate.go | 73 + vendor/go.uber.org/fx/shutdown.go | 79 + vendor/go.uber.org/fx/version.go | 24 + vendor/go.uber.org/multierr/.codecov.yml | 15 + vendor/go.uber.org/multierr/.gitignore | 1 + vendor/go.uber.org/multierr/.travis.yml | 33 + vendor/go.uber.org/multierr/CHANGELOG.md | 28 + vendor/go.uber.org/multierr/LICENSE.txt | 19 + vendor/go.uber.org/multierr/Makefile | 74 + vendor/go.uber.org/multierr/README.md | 23 + vendor/go.uber.org/multierr/error.go | 401 + vendor/go.uber.org/multierr/glide.lock | 19 + vendor/go.uber.org/multierr/glide.yaml | 8 + .../x/crypto/internal/chacha20/asm_ppc64le.s | 668 ++ .../crypto/internal/chacha20/chacha_noasm.go | 2 +- .../internal/chacha20/chacha_ppc64le.go | 52 + .../golang.org/x/crypto/poly1305/mac_noasm.go | 2 +- .../golang.org/x/crypto/poly1305/sum_noasm.go | 2 +- .../x/crypto/poly1305/sum_ppc64le.go | 68 + .../x/crypto/poly1305/sum_ppc64le.s | 247 + vendor/golang.org/x/crypto/sha3/shake.go | 6 +- .../golang.org/x/net/bpf/vm_instructions.go | 3 +- vendor/golang.org/x/net/html/parse.go | 44 +- .../internal/socket/cmsghdr_linux_64bit.go | 2 +- .../x/net/internal/socket/defs_aix.go | 8 - .../x/net/internal/socket/defs_darwin.go | 8 - .../x/net/internal/socket/defs_dragonfly.go | 8 - .../x/net/internal/socket/defs_freebsd.go | 8 - .../x/net/internal/socket/defs_linux.go | 8 - .../x/net/internal/socket/defs_netbsd.go | 8 - .../x/net/internal/socket/defs_openbsd.go | 8 - .../x/net/internal/socket/defs_solaris.go | 8 - .../x/net/internal/socket/iovec_64bit.go | 2 +- .../net/internal/socket/msghdr_linux_64bit.go | 2 +- .../x/net/internal/socket/sys_const_unix.go | 17 + .../internal/socket/sys_linux_riscv64.go} | 9 +- .../x/net/internal/socket/sys_windows.go | 10 +- .../x/net/internal/socket/zsys_aix_ppc64.go | 8 - .../x/net/internal/socket/zsys_darwin_386.go | 10 +- .../net/internal/socket/zsys_darwin_amd64.go | 10 +- .../x/net/internal/socket/zsys_darwin_arm.go | 10 +- .../net/internal/socket/zsys_darwin_arm64.go | 10 +- .../internal/socket/zsys_dragonfly_amd64.go | 10 +- .../x/net/internal/socket/zsys_freebsd_386.go | 10 +- .../net/internal/socket/zsys_freebsd_amd64.go | 10 +- .../x/net/internal/socket/zsys_freebsd_arm.go | 10 +- .../net/internal/socket/zsys_freebsd_arm64.go | 53 + .../x/net/internal/socket/zsys_linux_386.go | 10 +- .../x/net/internal/socket/zsys_linux_amd64.go | 10 +- .../x/net/internal/socket/zsys_linux_arm.go | 10 +- .../x/net/internal/socket/zsys_linux_arm64.go | 10 +- .../x/net/internal/socket/zsys_linux_mips.go | 10 +- .../net/internal/socket/zsys_linux_mips64.go | 10 +- .../internal/socket/zsys_linux_mips64le.go | 10 +- .../net/internal/socket/zsys_linux_mipsle.go | 10 +- .../x/net/internal/socket/zsys_linux_ppc64.go | 10 +- .../net/internal/socket/zsys_linux_ppc64le.go | 10 +- .../net/internal/socket/zsys_linux_riscv64.go | 59 + .../x/net/internal/socket/zsys_linux_s390x.go | 10 +- .../x/net/internal/socket/zsys_netbsd_386.go | 10 +- .../net/internal/socket/zsys_netbsd_amd64.go | 10 +- .../x/net/internal/socket/zsys_netbsd_arm.go | 10 +- .../net/internal/socket/zsys_netbsd_arm64.go | 60 + .../x/net/internal/socket/zsys_openbsd_386.go | 10 +- .../net/internal/socket/zsys_openbsd_amd64.go | 10 +- .../x/net/internal/socket/zsys_openbsd_arm.go | 10 +- .../net/internal/socket/zsys_openbsd_arm64.go | 53 + .../net/internal/socket/zsys_solaris_amd64.go | 10 +- vendor/golang.org/x/net/ipv4/zsys_darwin.go | 2 +- .../golang.org/x/net/ipv4/zsys_dragonfly.go | 2 +- .../golang.org/x/net/ipv4/zsys_freebsd_386.go | 2 +- .../x/net/ipv4/zsys_freebsd_amd64.go | 2 +- .../golang.org/x/net/ipv4/zsys_freebsd_arm.go | 2 +- .../golang.org/x/net/ipv4/zsys_linux_386.go | 2 +- .../golang.org/x/net/ipv4/zsys_linux_amd64.go | 2 +- .../golang.org/x/net/ipv4/zsys_linux_arm.go | 2 +- .../golang.org/x/net/ipv4/zsys_linux_arm64.go | 2 +- .../golang.org/x/net/ipv4/zsys_linux_mips.go | 2 +- .../x/net/ipv4/zsys_linux_mips64.go | 2 +- .../x/net/ipv4/zsys_linux_mips64le.go | 2 +- .../x/net/ipv4/zsys_linux_mipsle.go | 2 +- .../golang.org/x/net/ipv4/zsys_linux_ppc.go | 2 +- .../golang.org/x/net/ipv4/zsys_linux_ppc64.go | 2 +- .../x/net/ipv4/zsys_linux_ppc64le.go | 2 +- .../x/net/ipv4/zsys_linux_riscv64.go | 151 + .../golang.org/x/net/ipv4/zsys_linux_s390x.go | 2 +- vendor/golang.org/x/net/ipv4/zsys_netbsd.go | 2 +- vendor/golang.org/x/net/ipv4/zsys_openbsd.go | 2 +- vendor/golang.org/x/net/ipv4/zsys_solaris.go | 2 +- vendor/golang.org/x/net/ipv6/zsys_darwin.go | 2 +- .../golang.org/x/net/ipv6/zsys_dragonfly.go | 2 +- .../golang.org/x/net/ipv6/zsys_freebsd_386.go | 2 +- .../x/net/ipv6/zsys_freebsd_amd64.go | 2 +- .../golang.org/x/net/ipv6/zsys_freebsd_arm.go | 2 +- .../golang.org/x/net/ipv6/zsys_linux_386.go | 2 +- .../golang.org/x/net/ipv6/zsys_linux_amd64.go | 2 +- .../golang.org/x/net/ipv6/zsys_linux_arm.go | 2 +- .../golang.org/x/net/ipv6/zsys_linux_arm64.go | 2 +- .../golang.org/x/net/ipv6/zsys_linux_mips.go | 2 +- .../x/net/ipv6/zsys_linux_mips64.go | 2 +- .../x/net/ipv6/zsys_linux_mips64le.go | 2 +- .../x/net/ipv6/zsys_linux_mipsle.go | 2 +- .../golang.org/x/net/ipv6/zsys_linux_ppc.go | 2 +- .../golang.org/x/net/ipv6/zsys_linux_ppc64.go | 2 +- .../x/net/ipv6/zsys_linux_ppc64le.go | 2 +- .../x/net/ipv6/zsys_linux_riscv64.go | 173 + .../golang.org/x/net/ipv6/zsys_linux_s390x.go | 2 +- vendor/golang.org/x/net/ipv6/zsys_netbsd.go | 2 +- vendor/golang.org/x/net/ipv6/zsys_openbsd.go | 2 +- vendor/golang.org/x/net/ipv6/zsys_solaris.go | 2 +- vendor/golang.org/x/sys/cpu/asm_aix_ppc64.s | 17 + vendor/golang.org/x/sys/cpu/cpu_aix_ppc64.go | 10 +- .../x/sys/cpu/syscall_aix_ppc64_gc.go | 36 + .../golang.org/x/sys/unix/asm_linux_riscv64.s | 54 + .../golang.org/x/sys/unix/asm_openbsd_arm64.s | 29 + vendor/golang.org/x/sys/unix/mkall.sh | 29 +- vendor/golang.org/x/sys/unix/mkerrors.sh | 7 +- vendor/golang.org/x/sys/unix/mkpost.go | 16 + .../golang.org/x/sys/unix/mksysctl_openbsd.go | 355 + .../golang.org/x/sys/unix/mksysctl_openbsd.pl | 265 - vendor/golang.org/x/sys/unix/mksysnum.go | 2 +- .../{openbsd_pledge.go => pledge_openbsd.go} | 3 - vendor/golang.org/x/sys/unix/sockcmsg_unix.go | 8 +- vendor/golang.org/x/sys/unix/syscall.go | 1 - vendor/golang.org/x/sys/unix/syscall_aix.go | 8 +- .../golang.org/x/sys/unix/syscall_aix_ppc.go | 16 + .../x/sys/unix/syscall_aix_ppc64.go | 47 + .../golang.org/x/sys/unix/syscall_freebsd.go | 50 +- vendor/golang.org/x/sys/unix/syscall_linux.go | 75 +- .../x/sys/unix/syscall_linux_arm.go | 13 + .../golang.org/x/sys/unix/syscall_netbsd.go | 25 +- .../golang.org/x/sys/unix/syscall_openbsd.go | 25 +- .../x/sys/unix/syscall_openbsd_arm64.go | 37 + vendor/golang.org/x/sys/unix/types_aix.go | 27 +- .../{openbsd_unveil.go => unveil_openbsd.go} | 2 - .../x/sys/unix/zerrors_linux_386.go | 110 + .../x/sys/unix/zerrors_linux_amd64.go | 110 + .../x/sys/unix/zerrors_linux_arm.go | 110 + .../x/sys/unix/zerrors_linux_arm64.go | 110 + .../x/sys/unix/zerrors_linux_mips.go | 110 + .../x/sys/unix/zerrors_linux_mips64.go | 110 + .../x/sys/unix/zerrors_linux_mips64le.go | 110 + .../x/sys/unix/zerrors_linux_mipsle.go | 110 + .../x/sys/unix/zerrors_linux_ppc64.go | 110 + .../x/sys/unix/zerrors_linux_ppc64le.go | 110 + .../x/sys/unix/zerrors_linux_riscv64.go | 110 + .../x/sys/unix/zerrors_linux_s390x.go | 110 + .../x/sys/unix/zerrors_linux_sparc64.go | 110 + .../x/sys/unix/zerrors_openbsd_arm64.go | 1789 ++++ .../golang.org/x/sys/unix/zsyscall_aix_ppc.go | 10 +- .../x/sys/unix/zsyscall_aix_ppc64.go | 10 +- .../x/sys/unix/zsyscall_aix_ppc64_gc.go | 4 +- .../x/sys/unix/zsyscall_aix_ppc64_gccgo.go | 4 +- .../x/sys/unix/zsyscall_freebsd_386.go | 2 +- .../x/sys/unix/zsyscall_freebsd_amd64.go | 2 +- .../x/sys/unix/zsyscall_freebsd_arm.go | 2 +- .../x/sys/unix/zsyscall_freebsd_arm64.go | 2 +- .../x/sys/unix/zsyscall_linux_386.go | 8 +- .../x/sys/unix/zsyscall_linux_amd64.go | 8 +- .../x/sys/unix/zsyscall_linux_arm.go | 23 +- .../x/sys/unix/zsyscall_linux_arm64.go | 8 +- .../x/sys/unix/zsyscall_linux_mips.go | 8 +- .../x/sys/unix/zsyscall_linux_mips64.go | 8 +- .../x/sys/unix/zsyscall_linux_mips64le.go | 8 +- .../x/sys/unix/zsyscall_linux_mipsle.go | 8 +- .../x/sys/unix/zsyscall_linux_ppc64.go | 8 +- .../x/sys/unix/zsyscall_linux_ppc64le.go | 8 +- .../x/sys/unix/zsyscall_linux_riscv64.go | 8 +- .../x/sys/unix/zsyscall_linux_s390x.go | 8 +- .../x/sys/unix/zsyscall_linux_sparc64.go | 8 +- .../x/sys/unix/zsyscall_netbsd_386.go | 2 +- .../x/sys/unix/zsyscall_netbsd_amd64.go | 2 +- .../x/sys/unix/zsyscall_netbsd_arm.go | 2 +- .../x/sys/unix/zsyscall_netbsd_arm64.go | 2 +- .../x/sys/unix/zsyscall_openbsd_386.go | 2 +- .../x/sys/unix/zsyscall_openbsd_amd64.go | 2 +- .../x/sys/unix/zsyscall_openbsd_arm.go | 2 +- .../x/sys/unix/zsyscall_openbsd_arm64.go | 1692 +++ .../x/sys/unix/zsysctl_openbsd_386.go | 2 + .../x/sys/unix/zsysctl_openbsd_amd64.go | 2 +- .../x/sys/unix/zsysctl_openbsd_arm.go | 4 +- .../x/sys/unix/zsysctl_openbsd_arm64.go | 275 + .../x/sys/unix/zsysnum_freebsd_386.go | 23 +- .../x/sys/unix/zsysnum_freebsd_amd64.go | 23 +- .../x/sys/unix/zsysnum_freebsd_arm.go | 23 +- .../x/sys/unix/zsysnum_freebsd_arm64.go | 445 +- .../x/sys/unix/zsysnum_linux_386.go | 800 +- .../x/sys/unix/zsysnum_linux_amd64.go | 4 + .../x/sys/unix/zsysnum_linux_arm.go | 736 +- .../x/sys/unix/zsysnum_linux_arm64.go | 4 + .../x/sys/unix/zsysnum_linux_mips.go | 770 +- .../x/sys/unix/zsysnum_linux_mips64.go | 4 + .../x/sys/unix/zsysnum_linux_mips64le.go | 4 + .../x/sys/unix/zsysnum_linux_mipsle.go | 770 +- .../x/sys/unix/zsysnum_linux_ppc64.go | 15 + .../x/sys/unix/zsysnum_linux_ppc64le.go | 15 + .../x/sys/unix/zsysnum_linux_riscv64.go | 4 + .../x/sys/unix/zsysnum_linux_s390x.go | 18 + .../x/sys/unix/zsysnum_linux_sparc64.go | 19 + .../x/sys/unix/zsysnum_openbsd_arm64.go | 217 + .../golang.org/x/sys/unix/ztypes_aix_ppc.go | 45 +- .../golang.org/x/sys/unix/ztypes_aix_ppc64.go | 46 +- .../x/sys/unix/ztypes_darwin_386.go | 36 +- .../x/sys/unix/ztypes_darwin_amd64.go | 38 +- .../x/sys/unix/ztypes_darwin_arm.go | 36 +- .../x/sys/unix/ztypes_darwin_arm64.go | 38 +- .../x/sys/unix/ztypes_dragonfly_amd64.go | 38 +- .../x/sys/unix/ztypes_freebsd_386.go | 82 +- .../x/sys/unix/ztypes_freebsd_amd64.go | 72 +- .../x/sys/unix/ztypes_freebsd_arm.go | 72 +- .../x/sys/unix/ztypes_freebsd_arm64.go | 72 +- .../golang.org/x/sys/unix/ztypes_linux_386.go | 334 + .../x/sys/unix/ztypes_linux_amd64.go | 334 + .../golang.org/x/sys/unix/ztypes_linux_arm.go | 334 + .../x/sys/unix/ztypes_linux_arm64.go | 334 + .../x/sys/unix/ztypes_linux_mips.go | 334 + .../x/sys/unix/ztypes_linux_mips64.go | 334 + .../x/sys/unix/ztypes_linux_mips64le.go | 334 + .../x/sys/unix/ztypes_linux_mipsle.go | 334 + .../x/sys/unix/ztypes_linux_ppc64.go | 334 + .../x/sys/unix/ztypes_linux_ppc64le.go | 334 + .../x/sys/unix/ztypes_linux_riscv64.go | 334 + .../x/sys/unix/ztypes_linux_s390x.go | 334 + .../x/sys/unix/ztypes_linux_sparc64.go | 334 + .../x/sys/unix/ztypes_netbsd_386.go | 34 +- .../x/sys/unix/ztypes_netbsd_amd64.go | 40 +- .../x/sys/unix/ztypes_netbsd_arm.go | 40 +- .../x/sys/unix/ztypes_netbsd_arm64.go | 40 +- .../x/sys/unix/ztypes_openbsd_arm64.go | 564 + .../golang.org/x/sys/windows/env_windows.go | 34 +- vendor/golang.org/x/sys/windows/mkerrors.bash | 5 +- .../x/sys/windows/mkknownfolderids.bash | 27 + vendor/golang.org/x/sys/windows/mksyscall.go | 2 + .../x/sys/windows/security_windows.go | 235 +- vendor/golang.org/x/sys/windows/service.go | 70 +- .../x/sys/windows/syscall_windows.go | 100 +- .../golang.org/x/sys/windows/types_windows.go | 218 +- .../x/sys/windows/zerrors_windows.go | 2 +- .../x/sys/windows/zknownfolderids_windows.go | 149 + .../x/sys/windows/zsyscall_windows.go | 566 +- .../text/encoding/internal/identifier/gen.go | 7 +- .../text/encoding/internal/identifier/mib.go | 94 +- vendor/golang.org/x/text/internal/gen/gen.go | 2 +- .../x/text/unicode/norm/tables10.0.0.go | 2 +- .../x/text/unicode/norm/tables11.0.0.go | 7693 ++++++++++++++ vendor/golang.org/x/xerrors/codereview.cfg | 1 + vendor/golang.org/x/xerrors/wrap.go | 4 +- .../{fsnotify => }/fsnotify.v1/.editorconfig | 0 .../{fsnotify => }/fsnotify.v1/.gitignore | 0 .../{fsnotify => }/fsnotify.v1/.travis.yml | 0 .../{fsnotify => }/fsnotify.v1/AUTHORS | 0 .../{fsnotify => }/fsnotify.v1/CHANGELOG.md | 0 .../fsnotify.v1/CONTRIBUTING.md | 0 .../{fsnotify => }/fsnotify.v1/LICENSE | 0 .../{fsnotify => }/fsnotify.v1/README.md | 0 .../{fsnotify => }/fsnotify.v1/fen.go | 0 .../{fsnotify => }/fsnotify.v1/fsnotify.go | 0 .../{fsnotify => }/fsnotify.v1/inotify.go | 0 .../fsnotify.v1/inotify_poller.go | 0 .../{fsnotify => }/fsnotify.v1/kqueue.go | 0 .../fsnotify.v1/open_mode_bsd.go | 0 .../fsnotify.v1/open_mode_darwin.go | 0 .../{fsnotify => }/fsnotify.v1/windows.go | 0 vendor/gopkg.in/tomb.v1/tomb.go | 2 +- 1784 files changed, 91483 insertions(+), 87977 deletions(-) create mode 100644 vendor/github.com/Stebalien/go-bitfield/go.mod create mode 100755 vendor/github.com/aristanetworks/goarista/check_copyright_notice.sh create mode 100644 vendor/github.com/cenkalti/backoff/go.mod delete mode 100644 vendor/github.com/edsrzf/mmap-go/msync_netbsd.go delete mode 100644 vendor/github.com/edsrzf/mmap-go/msync_unix.go create mode 100644 vendor/github.com/elastic/gosigar/.appveyor.yml create mode 100644 vendor/github.com/elastic/gosigar/.gitignore create mode 100644 vendor/github.com/elastic/gosigar/.travis.yml create mode 100644 vendor/github.com/elastic/gosigar/CHANGELOG.md create mode 100644 vendor/github.com/elastic/gosigar/LICENSE create mode 100644 vendor/github.com/elastic/gosigar/NOTICE create mode 100644 vendor/github.com/elastic/gosigar/README.md create mode 100644 vendor/github.com/elastic/gosigar/Vagrantfile create mode 100644 vendor/github.com/elastic/gosigar/codecov.yml create mode 100644 vendor/github.com/elastic/gosigar/concrete_sigar.go create mode 100644 vendor/github.com/elastic/gosigar/sigar_darwin.go create mode 100644 vendor/github.com/elastic/gosigar/sigar_format.go create mode 100644 vendor/github.com/elastic/gosigar/sigar_freebsd.go create mode 100644 vendor/github.com/elastic/gosigar/sigar_interface.go create mode 100644 vendor/github.com/elastic/gosigar/sigar_linux.go create mode 100644 vendor/github.com/elastic/gosigar/sigar_linux_common.go create mode 100644 vendor/github.com/elastic/gosigar/sigar_openbsd.go create mode 100644 vendor/github.com/elastic/gosigar/sigar_stub.go create mode 100644 vendor/github.com/elastic/gosigar/sigar_unix.go create mode 100644 vendor/github.com/elastic/gosigar/sigar_util.go create mode 100644 vendor/github.com/elastic/gosigar/sigar_windows.go create mode 100644 vendor/github.com/elastic/gosigar/sys/windows/doc.go create mode 100644 vendor/github.com/elastic/gosigar/sys/windows/ntquery.go create mode 100644 vendor/github.com/elastic/gosigar/sys/windows/privileges.go create mode 100644 vendor/github.com/elastic/gosigar/sys/windows/syscall_windows.go create mode 100644 vendor/github.com/elastic/gosigar/sys/windows/version.go create mode 100644 vendor/github.com/elastic/gosigar/sys/windows/zsyscall_windows.go create mode 100644 vendor/github.com/ethereum/go-ethereum/SECURITY.md create mode 100644 vendor/github.com/ethereum/go-ethereum/accounts/usbwallet/trezor/messages-common.pb.go create mode 100644 vendor/github.com/ethereum/go-ethereum/accounts/usbwallet/trezor/messages-common.proto create mode 100644 vendor/github.com/ethereum/go-ethereum/accounts/usbwallet/trezor/messages-ethereum.pb.go create mode 100644 vendor/github.com/ethereum/go-ethereum/accounts/usbwallet/trezor/messages-ethereum.proto create mode 100644 vendor/github.com/ethereum/go-ethereum/accounts/usbwallet/trezor/messages-management.pb.go create mode 100644 vendor/github.com/ethereum/go-ethereum/accounts/usbwallet/trezor/messages-management.proto delete mode 100644 vendor/github.com/ethereum/go-ethereum/accounts/usbwallet/trezor/types.pb.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/accounts/usbwallet/trezor/types.proto delete mode 100644 vendor/github.com/ethereum/go-ethereum/build/deb/ethereum-swarm/deb.changelog delete mode 100644 vendor/github.com/ethereum/go-ethereum/build/deb/ethereum-swarm/deb.control delete mode 100644 vendor/github.com/ethereum/go-ethereum/build/deb/ethereum-swarm/deb.copyright delete mode 100644 vendor/github.com/ethereum/go-ethereum/build/deb/ethereum-swarm/deb.docs delete mode 100644 vendor/github.com/ethereum/go-ethereum/build/deb/ethereum-swarm/deb.install delete mode 100644 vendor/github.com/ethereum/go-ethereum/build/deb/ethereum-swarm/deb.rules create mode 100644 vendor/github.com/ethereum/go-ethereum/cmd/devp2p/discv4cmd.go create mode 100644 vendor/github.com/ethereum/go-ethereum/cmd/devp2p/enrcmd.go create mode 100644 vendor/github.com/ethereum/go-ethereum/cmd/devp2p/main.go create mode 100644 vendor/github.com/ethereum/go-ethereum/cmd/geth/retesteth.go create mode 100644 vendor/github.com/ethereum/go-ethereum/cmd/geth/retesteth_copypaste.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/cmd/swarm/access.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/cmd/swarm/bootnodes.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/cmd/swarm/config.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/cmd/swarm/db.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/cmd/swarm/download.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/cmd/swarm/explore.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/cmd/swarm/feeds.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/cmd/swarm/flags.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/cmd/swarm/fs.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/cmd/swarm/global-store/explorer.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/cmd/swarm/global-store/global_store.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/cmd/swarm/global-store/main.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/cmd/swarm/hash.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/cmd/swarm/list.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/cmd/swarm/main.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/cmd/swarm/manifest.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/cmd/swarm/mimegen/generator.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/cmd/swarm/mimegen/mime.types delete mode 100644 vendor/github.com/ethereum/go-ethereum/cmd/swarm/swarm-smoke/feed_upload_and_sync.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/cmd/swarm/swarm-smoke/main.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/cmd/swarm/swarm-smoke/sliding_window.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/cmd/swarm/swarm-smoke/upload_and_sync.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/cmd/swarm/swarm-smoke/upload_speed.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/cmd/swarm/swarm-smoke/util.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/cmd/swarm/swarm-snapshot/create.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/cmd/swarm/swarm-snapshot/main.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/cmd/swarm/upload.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/contracts/chequebook/api.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/contracts/chequebook/cheque.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/contracts/chequebook/contract/chequebook.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/contracts/chequebook/contract/chequebook.sol delete mode 100644 vendor/github.com/ethereum/go-ethereum/contracts/chequebook/contract/code.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/contracts/chequebook/contract/mortal.sol delete mode 100644 vendor/github.com/ethereum/go-ethereum/contracts/chequebook/contract/owned.sol delete mode 100644 vendor/github.com/ethereum/go-ethereum/contracts/chequebook/gencode.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/contracts/ens/README.md delete mode 100644 vendor/github.com/ethereum/go-ethereum/contracts/ens/cid.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/contracts/ens/contract/ENS.sol delete mode 100644 vendor/github.com/ethereum/go-ethereum/contracts/ens/contract/ENSRegistry.sol delete mode 100644 vendor/github.com/ethereum/go-ethereum/contracts/ens/contract/FIFSRegistrar.sol delete mode 100644 vendor/github.com/ethereum/go-ethereum/contracts/ens/contract/PublicResolver.sol delete mode 100644 vendor/github.com/ethereum/go-ethereum/contracts/ens/contract/ens.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/contracts/ens/contract/ensregistry.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/contracts/ens/contract/fifsregistrar.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/contracts/ens/contract/publicresolver.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/contracts/ens/ens.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/contracts/ens/fallback_contract/PublicResolver.sol delete mode 100644 vendor/github.com/ethereum/go-ethereum/contracts/ens/fallback_contract/publicresolver.go create mode 100644 vendor/github.com/ethereum/go-ethereum/core/rawdb/freezer.go create mode 100644 vendor/github.com/ethereum/go-ethereum/core/rawdb/freezer_reinit.go create mode 100644 vendor/github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go rename vendor/github.com/ethereum/go-ethereum/{swarm/fuse/swarmfs_fallback.go => internal/testlog/testlog.go} (56%) create mode 100644 vendor/github.com/ethereum/go-ethereum/les/csvlogger/csvlogger.go create mode 100755 vendor/github.com/ethereum/go-ethereum/les/transactions.rlp rename vendor/github.com/ethereum/go-ethereum/{swarm/pss/protocol_none.go => metrics/cpu.go} (57%) rename vendor/github.com/ethereum/go-ethereum/{swarm/storage/error.go => metrics/cpu_syscall.go} (61%) rename vendor/github.com/ethereum/go-ethereum/{swarm/pss/handshake_none.go => metrics/cpu_windows.go} (82%) create mode 100644 vendor/github.com/ethereum/go-ethereum/p2p/discover/common.go rename vendor/github.com/ethereum/go-ethereum/p2p/discover/{udp.go => v4_udp.go} (52%) rename vendor/github.com/ethereum/go-ethereum/{swarm/network/common.go => p2p/netutil/addrutil.go} (68%) delete mode 100644 vendor/github.com/ethereum/go-ethereum/p2p/protocols/accounting.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/p2p/protocols/accounting_api.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/p2p/protocols/protocol.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/p2p/protocols/reporter.go create mode 100644 vendor/github.com/ethereum/go-ethereum/p2p/util.go rename vendor/github.com/ethereum/go-ethereum/{swarm/fuse/fuse_root.go => rpc/constants_unix.go} (73%) rename vendor/github.com/ethereum/go-ethereum/{swarm/testutil/race.go => rpc/constants_unix_nocgo.go} (82%) create mode 100644 vendor/github.com/ethereum/go-ethereum/signer/core/testdata/README.md create mode 100644 vendor/github.com/ethereum/go-ethereum/signer/core/testdata/arrays-1.json create mode 100644 vendor/github.com/ethereum/go-ethereum/signer/core/testdata/custom_arraytype.json create mode 100644 vendor/github.com/ethereum/go-ethereum/signer/core/testdata/eip712.json create mode 100644 vendor/github.com/ethereum/go-ethereum/signer/core/testdata/expfail_arraytype_overload.json create mode 100644 vendor/github.com/ethereum/go-ethereum/signer/core/testdata/expfail_datamismatch_1.json create mode 100644 vendor/github.com/ethereum/go-ethereum/signer/core/testdata/expfail_extradata-1.json create mode 100644 vendor/github.com/ethereum/go-ethereum/signer/core/testdata/expfail_extradata-2.json create mode 100644 vendor/github.com/ethereum/go-ethereum/signer/core/testdata/expfail_malformeddomainkeys.json create mode 100644 vendor/github.com/ethereum/go-ethereum/signer/core/testdata/expfail_nonexistant_type.json create mode 100644 vendor/github.com/ethereum/go-ethereum/signer/core/testdata/expfail_toolargeuint.json create mode 100644 vendor/github.com/ethereum/go-ethereum/signer/core/testdata/expfail_toolargeuint2.json create mode 100644 vendor/github.com/ethereum/go-ethereum/signer/core/testdata/expfail_unconvertiblefloat.json create mode 100644 vendor/github.com/ethereum/go-ethereum/signer/core/testdata/expfail_unconvertiblefloat2.json create mode 100644 vendor/github.com/ethereum/go-ethereum/signer/core/testdata/fuzzing/2850f6ccf2d7f5f846dfb73119b60e09e712783f create mode 100644 vendor/github.com/ethereum/go-ethereum/signer/core/testdata/fuzzing/36fb987a774011dc675e1b5246ac5c1d44d84d92 create mode 100644 vendor/github.com/ethereum/go-ethereum/signer/core/testdata/fuzzing/37ec7b55c7ba014cced204c5f9989d2d0eb9ff6d create mode 100644 vendor/github.com/ethereum/go-ethereum/signer/core/testdata/fuzzing/582fa92154b784daa1faa293b695fa388fe34bf1 create mode 100644 vendor/github.com/ethereum/go-ethereum/signer/core/testdata/fuzzing/ab57cb2b2b5ce614efe13a47bc73814580f2cce8 create mode 100644 vendor/github.com/ethereum/go-ethereum/signer/core/testdata/fuzzing/e4303e23ca34fbbc43164a232b2caa7a3af2bf8d create mode 100644 vendor/github.com/ethereum/go-ethereum/signer/core/testdata/fuzzing/f658340af009dd4a35abe645a00a7b732bc30921 delete mode 100644 vendor/github.com/ethereum/go-ethereum/statediff/builder_test.go create mode 100644 vendor/github.com/ethereum/go-ethereum/statediff/doc.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/statediff/service_test.go rename vendor/github.com/ethereum/go-ethereum/statediff/testhelpers/mocks/{service.go => api.go} (100%) delete mode 100644 vendor/github.com/ethereum/go-ethereum/statediff/testhelpers/mocks/publisher.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/statediff/testhelpers/mocks/service_test.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/AUTHORS delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/OWNERS delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/api/act.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/api/api.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/api/client/client.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/api/config.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/api/encrypt.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/api/filesystem.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/api/gen_mime.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/api/http/middleware.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/api/http/response.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/api/http/roundtripper.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/api/http/sctx.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/api/http/server.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/api/http/templates.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/api/http/test_server.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/api/inspector.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/api/manifest.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/api/storage.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/api/testdata/test0/img/logo.png delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/api/testdata/test0/index.css delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/api/testdata/test0/index.html delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/api/uri.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/bmt/bmt.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/bmt/bmt_r.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/chunk/chunk.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/dev/.dockerignore delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/dev/.gitignore delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/dev/Dockerfile delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/dev/Makefile delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/dev/README.md delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/dev/bashrc delete mode 100755 vendor/github.com/ethereum/go-ethereum/swarm/dev/run.sh delete mode 100755 vendor/github.com/ethereum/go-ethereum/swarm/dev/scripts/boot-cluster.sh delete mode 100755 vendor/github.com/ethereum/go-ethereum/swarm/dev/scripts/random-uploads.sh delete mode 100755 vendor/github.com/ethereum/go-ethereum/swarm/dev/scripts/stop-cluster.sh delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/dev/scripts/util.sh delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/docker/Dockerfile delete mode 100755 vendor/github.com/ethereum/go-ethereum/swarm/docker/run-smoke.sh delete mode 100755 vendor/github.com/ethereum/go-ethereum/swarm/docker/run.sh delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/fuse/fuse_dir.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/fuse/fuse_file.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/fuse/swarmfs.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/fuse/swarmfs_unix.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/fuse/swarmfs_util.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/log/log.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/metrics/flags.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/network/README.md delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/network/bitvector/bitvector.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/network/discovery.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/network/enr.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/network/fetcher.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/network/hive.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/network/kademlia.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/network/network.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/network/priorityqueue/priorityqueue.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/network/protocol.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/network/simulation/bucket.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/network/simulation/events.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/network/simulation/http.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/network/simulation/kademlia.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/network/simulation/node.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/network/simulation/service.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/network/simulation/simulation.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/network/simulations/discovery/discovery.go delete mode 100755 vendor/github.com/ethereum/go-ethereum/swarm/network/simulations/discovery/snapshot.json delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/network/simulations/overlay.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/network/stream/delivery.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/network/stream/intervals/intervals.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/network/stream/messages.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/network/stream/peer.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/network/stream/stream.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/network/stream/syncer.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/network/stream/testing/snapshot_128.json delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/network/stream/testing/snapshot_16.json delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/network/stream/testing/snapshot_256.json delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/network/stream/testing/snapshot_32.json delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/network/stream/testing/snapshot_4.json delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/network/stream/testing/snapshot_64.json delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/pot/address.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/pot/doc.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/pot/pot.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/pss/ARCHITECTURE.md delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/pss/README.md delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/pss/api.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/pss/client/client.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/pss/client/doc.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/pss/doc.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/pss/handshake.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/pss/keystore.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/pss/notify/notify.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/pss/ping.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/pss/protocol.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/pss/pss.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/pss/testdata/snapshot_128.json delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/pss/testdata/snapshot_16.json delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/pss/testdata/snapshot_2.json delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/pss/testdata/snapshot_256.json delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/pss/testdata/snapshot_3.json delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/pss/testdata/snapshot_32.json delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/pss/testdata/snapshot_4.json delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/pss/testdata/snapshot_64.json delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/pss/testdata/snapshot_8.json delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/pss/types.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/pss/writeup.md delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/sctx/sctx.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/services/swap/swap.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/services/swap/swap/swap.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/shed/db.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/shed/field_string.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/shed/field_struct.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/shed/field_uint64.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/shed/index.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/shed/schema.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/shed/vector_uint64.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/spancontext/spancontext.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/state/dbstore.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/storage/chunker.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/storage/database.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/storage/encryption/encryption.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/storage/feed/binaryserializer.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/storage/feed/cacheentry.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/storage/feed/doc.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/storage/feed/error.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/storage/feed/feed.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/storage/feed/handler.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/storage/feed/id.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/storage/feed/lookup/epoch.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/storage/feed/lookup/lookup.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/storage/feed/query.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/storage/feed/request.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/storage/feed/sign.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/storage/feed/testutil.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/storage/feed/timestampprovider.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/storage/feed/topic.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/storage/feed/update.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/storage/filestore.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/storage/hasherstore.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/storage/ldbstore.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/storage/localstore.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/storage/localstore/doc.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/storage/localstore/gc.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/storage/localstore/localstore.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/storage/localstore/mode_get.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/storage/localstore/mode_has.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/storage/localstore/mode_put.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/storage/localstore/mode_set.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/storage/localstore/subscription_pull.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/storage/localstore/subscription_push.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/storage/memstore.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/storage/mock/db/db.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/storage/mock/explorer/explorer.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/storage/mock/explorer/swagger.yaml delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/storage/mock/mem/mem.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/storage/mock/mock.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/storage/mock/rpc/rpc.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/storage/mock/test/test.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/storage/netstore.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/storage/pyramid.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/storage/schema.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/storage/swarmhasher.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/storage/types.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/swap/swap.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/swarm.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/testutil/file.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/testutil/norace.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/tracing/tracing.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/swarm/version/version.go delete mode 100644 vendor/github.com/ethereum/go-ethereum/tests/gen_tttransaction.go create mode 100644 vendor/github.com/ethereum/go-ethereum/trie/sync_bloom.go create mode 100644 vendor/github.com/go-stack/stack/go.mod delete mode 100644 vendor/github.com/gxed/hashland/keccak/LICENSE delete mode 100644 vendor/github.com/gxed/hashland/keccakpg/go.mod delete mode 100644 vendor/github.com/gxed/hashland/keccakpg/keccak.go delete mode 100644 vendor/github.com/gxed/hashland/keccakpg/package.json delete mode 100644 vendor/github.com/gxed/hashland/murmur3/LICENSE delete mode 100644 vendor/github.com/gxed/hashland/murmur3/README.md delete mode 100644 vendor/github.com/gxed/hashland/murmur3/go.mod delete mode 100644 vendor/github.com/gxed/hashland/murmur3/murmur.go delete mode 100644 vendor/github.com/gxed/hashland/murmur3/murmur128.go delete mode 100644 vendor/github.com/gxed/hashland/murmur3/murmur32.go delete mode 100644 vendor/github.com/gxed/hashland/murmur3/murmur64.go delete mode 100644 vendor/github.com/ipfs/go-bitswap/decision/peer_request_queue.go delete mode 100644 vendor/github.com/ipfs/go-bitswap/package.json delete mode 100644 vendor/github.com/ipfs/go-bitswap/testnet/interface.go delete mode 100644 vendor/github.com/ipfs/go-bitswap/testnet/internet_latency_delay_generator.go delete mode 100644 vendor/github.com/ipfs/go-bitswap/testnet/peernet.go delete mode 100644 vendor/github.com/ipfs/go-bitswap/testnet/rate_limit_generators.go delete mode 100644 vendor/github.com/ipfs/go-bitswap/testnet/virtual.go delete mode 100644 vendor/github.com/ipfs/go-bitswap/testutils.go delete mode 100644 vendor/github.com/ipfs/go-blockservice/package.json delete mode 100644 vendor/github.com/ipfs/go-datastore/delayed/delayed.go delete mode 100644 vendor/github.com/ipfs/go-ipfs-addr/Makefile delete mode 100644 vendor/github.com/ipfs/go-ipfs-addr/README.md delete mode 100644 vendor/github.com/ipfs/go-ipfs-addr/codecov.yml delete mode 100644 vendor/github.com/ipfs/go-ipfs-addr/go.mod delete mode 100644 vendor/github.com/ipfs/go-ipfs-addr/ipfsaddr.go delete mode 100644 vendor/github.com/ipfs/go-ipfs-addr/package.json delete mode 100644 vendor/github.com/ipfs/go-ipfs-config/package.json delete mode 100644 vendor/github.com/ipfs/go-ipfs-flags/Makefile delete mode 100644 vendor/github.com/ipfs/go-ipfs-flags/README.md delete mode 100644 vendor/github.com/ipfs/go-ipfs-flags/flags.go delete mode 100644 vendor/github.com/ipfs/go-ipfs-flags/go.mod delete mode 100644 vendor/github.com/ipfs/go-ipfs-flags/package.json delete mode 100644 vendor/github.com/ipfs/go-ipfs-routing/mock/centralized_client.go delete mode 100644 vendor/github.com/ipfs/go-ipfs-routing/mock/centralized_server.go delete mode 100644 vendor/github.com/ipfs/go-ipfs-routing/mock/interface.go create mode 100644 vendor/github.com/ipfs/go-ipfs/COPYRIGHT create mode 100644 vendor/github.com/ipfs/go-ipfs/Gopkg.lock create mode 100644 vendor/github.com/ipfs/go-ipfs/Gopkg.toml delete mode 100644 vendor/github.com/ipfs/go-ipfs/ISSUE_TEMPLATE.md delete mode 100644 vendor/github.com/ipfs/go-ipfs/LICENSE create mode 100644 vendor/github.com/ipfs/go-ipfs/LICENSE-APACHE rename vendor/github.com/{libp2p/go-conn-security/LICENSE => ipfs/go-ipfs/LICENSE-MIT} (96%) rename vendor/github.com/ipfs/go-ipfs/core/{ => bootstrap}/bootstrap.go (72%) create mode 100644 vendor/github.com/ipfs/go-ipfs/core/node/builder.go create mode 100644 vendor/github.com/ipfs/go-ipfs/core/node/core.go create mode 100644 vendor/github.com/ipfs/go-ipfs/core/node/groups.go create mode 100644 vendor/github.com/ipfs/go-ipfs/core/node/helpers.go create mode 100644 vendor/github.com/ipfs/go-ipfs/core/node/helpers/helpers.go create mode 100644 vendor/github.com/ipfs/go-ipfs/core/node/identity.go create mode 100644 vendor/github.com/ipfs/go-ipfs/core/node/ipns.go create mode 100644 vendor/github.com/ipfs/go-ipfs/core/node/libp2p/addrs.go create mode 100644 vendor/github.com/ipfs/go-ipfs/core/node/libp2p/discovery.go create mode 100644 vendor/github.com/ipfs/go-ipfs/core/node/libp2p/host.go create mode 100644 vendor/github.com/ipfs/go-ipfs/core/node/libp2p/hostopt.go create mode 100644 vendor/github.com/ipfs/go-ipfs/core/node/libp2p/libp2p.go create mode 100644 vendor/github.com/ipfs/go-ipfs/core/node/libp2p/nat.go create mode 100644 vendor/github.com/ipfs/go-ipfs/core/node/libp2p/pnet.go create mode 100644 vendor/github.com/ipfs/go-ipfs/core/node/libp2p/pubsub.go create mode 100644 vendor/github.com/ipfs/go-ipfs/core/node/libp2p/relay.go create mode 100644 vendor/github.com/ipfs/go-ipfs/core/node/libp2p/routing.go create mode 100644 vendor/github.com/ipfs/go-ipfs/core/node/libp2p/routingopt.go create mode 100644 vendor/github.com/ipfs/go-ipfs/core/node/libp2p/smux.go create mode 100644 vendor/github.com/ipfs/go-ipfs/core/node/libp2p/transport.go create mode 100644 vendor/github.com/ipfs/go-ipfs/core/node/provider.go create mode 100644 vendor/github.com/ipfs/go-ipfs/core/node/storage.go delete mode 100644 vendor/github.com/ipfs/go-ipfs/core/pathresolver.go delete mode 100644 vendor/github.com/ipfs/go-ipfs/exchange/reprovide/providers.go delete mode 100644 vendor/github.com/ipfs/go-ipfs/go.mod delete mode 100644 vendor/github.com/ipfs/go-ipfs/go.sum rename vendor/github.com/ipfs/go-ipfs/provider/{ => queue}/queue.go (98%) create mode 100644 vendor/github.com/ipfs/go-ipfs/provider/simple/provider.go rename vendor/github.com/ipfs/go-ipfs/{exchange/reprovide => provider/simple}/reprovide.go (52%) create mode 100644 vendor/github.com/ipfs/go-ipfs/provider/system.go delete mode 100644 vendor/github.com/ipfs/go-ipfs/thirdparty/math2/math2.go delete mode 100644 vendor/github.com/ipfs/go-ipld-cbor/package.json delete mode 100644 vendor/github.com/ipfs/go-ipld-format/package.json create mode 100644 vendor/github.com/ipfs/go-path/error.go rename vendor/github.com/{libp2p/go-conn-security => ipfs/go-peertaskqueue}/.travis.yml (94%) create mode 100644 vendor/github.com/ipfs/go-peertaskqueue/COPYRIGHT rename vendor/github.com/{whyrusleeping/cbor/LICENSE => ipfs/go-peertaskqueue/LICENSE-APACHE} (93%) rename vendor/github.com/ipfs/{go-ipfs-flags/LICENSE => go-peertaskqueue/LICENSE-MIT} (96%) create mode 100644 vendor/github.com/ipfs/go-peertaskqueue/go.mod create mode 100644 vendor/github.com/ipfs/go-peertaskqueue/go.sum create mode 100644 vendor/github.com/ipfs/go-peertaskqueue/peertask/peertask.go create mode 100644 vendor/github.com/ipfs/go-peertaskqueue/peertaskqueue.go create mode 100644 vendor/github.com/ipfs/go-peertaskqueue/peertracker/peertracker.go delete mode 100644 vendor/github.com/ipfs/interface-go-ipfs-core/package.json delete mode 100644 vendor/github.com/jbenet/go-context/io/ctxio.go create mode 100644 vendor/github.com/jbenet/goprocess/background.go create mode 100644 vendor/github.com/jbenet/goprocess/go.mod create mode 100644 vendor/github.com/jbenet/goprocess/go.sum delete mode 100644 vendor/github.com/libp2p/go-buffer-pool/Makefile delete mode 100644 vendor/github.com/libp2p/go-buffer-pool/package.json create mode 100644 vendor/github.com/libp2p/go-buffer-pool/writer.go delete mode 100644 vendor/github.com/libp2p/go-conn-security-multistream/package.json delete mode 100644 vendor/github.com/libp2p/go-conn-security/README.md delete mode 100644 vendor/github.com/libp2p/go-conn-security/go.mod delete mode 100644 vendor/github.com/libp2p/go-conn-security/go.sum delete mode 100644 vendor/github.com/libp2p/go-conn-security/interface.go delete mode 100644 vendor/github.com/libp2p/go-conn-security/package.json delete mode 100644 vendor/github.com/libp2p/go-libp2p-autonat-svc/package.json delete mode 100644 vendor/github.com/libp2p/go-libp2p-autonat/Makefile delete mode 100644 vendor/github.com/libp2p/go-libp2p-autonat/package.json delete mode 100644 vendor/github.com/libp2p/go-libp2p-connmgr/Makefile delete mode 100644 vendor/github.com/libp2p/go-libp2p-connmgr/package.json rename vendor/github.com/libp2p/{go-libp2p-interface-connmgr/interface.go => go-libp2p-core/connmgr/connmgr.go} (65%) create mode 100644 vendor/github.com/libp2p/go-libp2p-core/connmgr/null.go rename vendor/github.com/libp2p/{go-libp2p-crypto => go-libp2p-core/crypto}/ecdsa.go (98%) rename vendor/github.com/libp2p/{go-libp2p-crypto => go-libp2p-core/crypto}/ed25519.go (96%) rename vendor/github.com/libp2p/{go-libp2p-crypto => go-libp2p-core/crypto}/key.go (94%) create mode 100644 vendor/github.com/libp2p/go-libp2p-core/crypto/openssl_common.go rename vendor/github.com/libp2p/{go-libp2p-crypto => go-libp2p-core/crypto}/pb/Makefile (100%) rename vendor/github.com/libp2p/{go-libp2p-crypto => go-libp2p-core/crypto}/pb/crypto.pb.go (100%) rename vendor/github.com/libp2p/{go-libp2p-crypto => go-libp2p-core/crypto}/pb/crypto.proto (100%) create mode 100644 vendor/github.com/libp2p/go-libp2p-core/crypto/rsa_common.go rename vendor/github.com/libp2p/{go-libp2p-crypto/rsa.go => go-libp2p-core/crypto/rsa_go.go} (60%) create mode 100644 vendor/github.com/libp2p/go-libp2p-core/crypto/rsa_openssl.go rename vendor/github.com/libp2p/{go-libp2p-crypto => go-libp2p-core/crypto}/secp256k1.go (98%) rename vendor/github.com/libp2p/{go-libp2p-discovery/interface.go => go-libp2p-core/discovery/discovery.go} (78%) rename vendor/github.com/libp2p/{go-libp2p-discovery => go-libp2p-core/discovery}/options.go (81%) rename vendor/github.com/libp2p/{go-libp2p-host => go-libp2p-core/helpers}/match.go (90%) rename vendor/github.com/libp2p/{go-libp2p-net/stream_util.go => go-libp2p-core/helpers/stream.go} (91%) create mode 100644 vendor/github.com/libp2p/go-libp2p-core/host/helpers.go rename vendor/github.com/libp2p/{go-libp2p-host => go-libp2p-core/host}/host.go (70%) create mode 100644 vendor/github.com/libp2p/go-libp2p-core/metrics/bandwidth.go create mode 100644 vendor/github.com/libp2p/go-libp2p-core/metrics/reporter.go create mode 100644 vendor/github.com/libp2p/go-libp2p-core/mux/mux.go create mode 100644 vendor/github.com/libp2p/go-libp2p-core/network/conn.go rename vendor/github.com/libp2p/{go-libp2p-net/timeouts.go => go-libp2p-core/network/context.go} (61%) create mode 100644 vendor/github.com/libp2p/go-libp2p-core/network/errors.go rename vendor/github.com/libp2p/{go-libp2p-net/interface.go => go-libp2p-core/network/network.go} (55%) rename vendor/github.com/libp2p/{go-libp2p-net/notifiee.go => go-libp2p-core/network/notifee.go} (54%) create mode 100644 vendor/github.com/libp2p/go-libp2p-core/network/stream.go create mode 100644 vendor/github.com/libp2p/go-libp2p-core/peer/addrinfo.go create mode 100644 vendor/github.com/libp2p/go-libp2p-core/peer/addrinfo_serde.go rename vendor/github.com/libp2p/{go-libp2p-peer => go-libp2p-core/peer}/peer.go (74%) rename vendor/github.com/libp2p/{go-libp2p-peer => go-libp2p-core/peer}/peer_serde.go (100%) rename vendor/github.com/libp2p/{go-libp2p-peer/peerset/peerset.go => go-libp2p-core/peer/set.go} (59%) create mode 100644 vendor/github.com/libp2p/go-libp2p-core/peerstore/peerstore.go create mode 100644 vendor/github.com/libp2p/go-libp2p-core/pnet/env.go create mode 100644 vendor/github.com/libp2p/go-libp2p-core/pnet/error.go create mode 100644 vendor/github.com/libp2p/go-libp2p-core/pnet/protector.go rename vendor/github.com/libp2p/{go-libp2p-protocol/protocol.go => go-libp2p-core/protocol/id.go} (100%) create mode 100644 vendor/github.com/libp2p/go-libp2p-core/protocol/switch.go rename vendor/github.com/libp2p/{go-libp2p-routing/options => go-libp2p-core/routing}/options.go (98%) rename vendor/github.com/libp2p/{go-libp2p-routing/notifications => go-libp2p-core/routing}/query.go (66%) create mode 100644 vendor/github.com/libp2p/go-libp2p-core/routing/query_serde.go rename vendor/github.com/libp2p/{go-libp2p-routing => go-libp2p-core/routing}/routing.go (77%) rename vendor/github.com/libp2p/{go-conn-security => go-libp2p-core/sec}/insecure/insecure.go (74%) create mode 100644 vendor/github.com/libp2p/go-libp2p-core/sec/security.go rename vendor/github.com/libp2p/{go-libp2p-transport => go-libp2p-core/transport}/transport.go (62%) delete mode 100644 vendor/github.com/libp2p/go-libp2p-crypto/Makefile create mode 100644 vendor/github.com/libp2p/go-libp2p-crypto/ecdsa_deprecated.go create mode 100644 vendor/github.com/libp2p/go-libp2p-crypto/ed25519_deprecated.go create mode 100644 vendor/github.com/libp2p/go-libp2p-crypto/key_deprecated.go delete mode 100644 vendor/github.com/libp2p/go-libp2p-crypto/package.json create mode 100644 vendor/github.com/libp2p/go-libp2p-crypto/rsa_deprecated.go create mode 100644 vendor/github.com/libp2p/go-libp2p-crypto/secp256k1_deprecated.go create mode 100644 vendor/github.com/libp2p/go-libp2p-discovery/deprecated.go delete mode 100644 vendor/github.com/libp2p/go-libp2p-host/Makefile delete mode 100644 vendor/github.com/libp2p/go-libp2p-host/README.md delete mode 100644 vendor/github.com/libp2p/go-libp2p-host/codecov.yml delete mode 100644 vendor/github.com/libp2p/go-libp2p-host/go.mod delete mode 100644 vendor/github.com/libp2p/go-libp2p-host/go.sum delete mode 100644 vendor/github.com/libp2p/go-libp2p-host/helpers.go delete mode 100644 vendor/github.com/libp2p/go-libp2p-host/package.json delete mode 100644 vendor/github.com/libp2p/go-libp2p-interface-connmgr/.travis.yml delete mode 100644 vendor/github.com/libp2p/go-libp2p-interface-connmgr/Makefile delete mode 100644 vendor/github.com/libp2p/go-libp2p-interface-connmgr/README.md delete mode 100644 vendor/github.com/libp2p/go-libp2p-interface-connmgr/codecov.yml delete mode 100644 vendor/github.com/libp2p/go-libp2p-interface-connmgr/go.mod delete mode 100644 vendor/github.com/libp2p/go-libp2p-interface-connmgr/go.sum delete mode 100644 vendor/github.com/libp2p/go-libp2p-interface-connmgr/null.go delete mode 100644 vendor/github.com/libp2p/go-libp2p-interface-connmgr/package.json delete mode 100644 vendor/github.com/libp2p/go-libp2p-interface-pnet/.travis.yml delete mode 100644 vendor/github.com/libp2p/go-libp2p-interface-pnet/LICENSE delete mode 100644 vendor/github.com/libp2p/go-libp2p-interface-pnet/Makefile delete mode 100644 vendor/github.com/libp2p/go-libp2p-interface-pnet/README.md delete mode 100644 vendor/github.com/libp2p/go-libp2p-interface-pnet/codecov.yml delete mode 100644 vendor/github.com/libp2p/go-libp2p-interface-pnet/error.go delete mode 100644 vendor/github.com/libp2p/go-libp2p-interface-pnet/go.mod delete mode 100644 vendor/github.com/libp2p/go-libp2p-interface-pnet/interface.go delete mode 100644 vendor/github.com/libp2p/go-libp2p-interface-pnet/package.json delete mode 100644 vendor/github.com/libp2p/go-libp2p-kbucket/Makefile delete mode 100644 vendor/github.com/libp2p/go-libp2p-kbucket/package.json delete mode 100644 vendor/github.com/libp2p/go-libp2p-loggables/Makefile delete mode 100644 vendor/github.com/libp2p/go-libp2p-loggables/package.json delete mode 100644 vendor/github.com/libp2p/go-libp2p-metrics/.travis.yml delete mode 100644 vendor/github.com/libp2p/go-libp2p-metrics/Makefile delete mode 100644 vendor/github.com/libp2p/go-libp2p-metrics/README.md delete mode 100644 vendor/github.com/libp2p/go-libp2p-metrics/bw_stats.go delete mode 100644 vendor/github.com/libp2p/go-libp2p-metrics/codecov.yml delete mode 100644 vendor/github.com/libp2p/go-libp2p-metrics/go.mod delete mode 100644 vendor/github.com/libp2p/go-libp2p-metrics/interface.go delete mode 100644 vendor/github.com/libp2p/go-libp2p-metrics/package.json rename vendor/github.com/libp2p/{go-libp2p-transport => go-libp2p-mplex}/.gitignore (100%) rename vendor/github.com/{ipfs/go-ipfs-flags => libp2p/go-libp2p-mplex}/.travis.yml (89%) rename vendor/github.com/{jbenet/go-context => libp2p/go-libp2p-mplex}/LICENSE (100%) rename vendor/github.com/{whyrusleeping/go-smux-multiplex => libp2p/go-libp2p-mplex}/Makefile (100%) rename vendor/github.com/{whyrusleeping/go-smux-multiplex => libp2p/go-libp2p-mplex}/README.md (76%) create mode 100644 vendor/github.com/libp2p/go-libp2p-mplex/go.mod rename vendor/github.com/libp2p/{go-libp2p-netutil => go-libp2p-mplex}/go.sum (78%) rename vendor/github.com/{whyrusleeping/go-smux-multiplex => libp2p/go-libp2p-mplex}/multiplex.go (64%) delete mode 100644 vendor/github.com/libp2p/go-libp2p-net/.travis.yml delete mode 100644 vendor/github.com/libp2p/go-libp2p-net/LICENSE delete mode 100644 vendor/github.com/libp2p/go-libp2p-net/Makefile delete mode 100644 vendor/github.com/libp2p/go-libp2p-net/README.md delete mode 100644 vendor/github.com/libp2p/go-libp2p-net/codecov.yml delete mode 100644 vendor/github.com/libp2p/go-libp2p-net/go.mod delete mode 100644 vendor/github.com/libp2p/go-libp2p-net/go.sum delete mode 100644 vendor/github.com/libp2p/go-libp2p-net/options.go delete mode 100644 vendor/github.com/libp2p/go-libp2p-net/package.json delete mode 100644 vendor/github.com/libp2p/go-libp2p-netutil/.travis.yml delete mode 100644 vendor/github.com/libp2p/go-libp2p-netutil/Makefile delete mode 100644 vendor/github.com/libp2p/go-libp2p-netutil/README.md delete mode 100644 vendor/github.com/libp2p/go-libp2p-netutil/codecov.yml delete mode 100644 vendor/github.com/libp2p/go-libp2p-netutil/go.mod delete mode 100644 vendor/github.com/libp2p/go-libp2p-netutil/key.go delete mode 100644 vendor/github.com/libp2p/go-libp2p-netutil/package.json delete mode 100644 vendor/github.com/libp2p/go-libp2p-peer/Makefile create mode 100644 vendor/github.com/libp2p/go-libp2p-peer/deprecated.go delete mode 100644 vendor/github.com/libp2p/go-libp2p-peer/package.json delete mode 100644 vendor/github.com/libp2p/go-libp2p-peer/test/utils.go create mode 100644 vendor/github.com/libp2p/go-libp2p-peerstore/pstoremem/protobook.go delete mode 100644 vendor/github.com/libp2p/go-libp2p-pnet/Makefile delete mode 100644 vendor/github.com/libp2p/go-libp2p-pnet/package.json delete mode 100644 vendor/github.com/libp2p/go-libp2p-protocol/.travis.yml delete mode 100644 vendor/github.com/libp2p/go-libp2p-protocol/LICENSE delete mode 100644 vendor/github.com/libp2p/go-libp2p-protocol/Makefile delete mode 100644 vendor/github.com/libp2p/go-libp2p-protocol/README.md delete mode 100644 vendor/github.com/libp2p/go-libp2p-protocol/codecov.yml delete mode 100644 vendor/github.com/libp2p/go-libp2p-protocol/go.mod delete mode 100644 vendor/github.com/libp2p/go-libp2p-protocol/package.json delete mode 100644 vendor/github.com/libp2p/go-libp2p-pubsub-router/Makefile delete mode 100644 vendor/github.com/libp2p/go-libp2p-pubsub-router/package.json delete mode 100644 vendor/github.com/libp2p/go-libp2p-pubsub/Makefile delete mode 100644 vendor/github.com/libp2p/go-libp2p-pubsub/package.json create mode 100644 vendor/github.com/libp2p/go-libp2p-pubsub/validation.go delete mode 100644 vendor/github.com/libp2p/go-libp2p-record/Makefile delete mode 100644 vendor/github.com/libp2p/go-libp2p-record/package.json delete mode 100644 vendor/github.com/libp2p/go-libp2p-routing-helpers/Makefile delete mode 100644 vendor/github.com/libp2p/go-libp2p-routing-helpers/package.json delete mode 100644 vendor/github.com/libp2p/go-libp2p-routing/.travis.yml delete mode 100644 vendor/github.com/libp2p/go-libp2p-routing/Makefile delete mode 100644 vendor/github.com/libp2p/go-libp2p-routing/README.md delete mode 100644 vendor/github.com/libp2p/go-libp2p-routing/codecov.yml delete mode 100644 vendor/github.com/libp2p/go-libp2p-routing/go.mod delete mode 100644 vendor/github.com/libp2p/go-libp2p-routing/go.sum create mode 100644 vendor/github.com/libp2p/go-libp2p-routing/notifications/deprecated.go delete mode 100644 vendor/github.com/libp2p/go-libp2p-routing/package.json delete mode 100644 vendor/github.com/libp2p/go-libp2p-secio/gx-workspace-update.json delete mode 100644 vendor/github.com/libp2p/go-libp2p-swarm/Makefile create mode 100644 vendor/github.com/libp2p/go-libp2p-swarm/dial_error.go delete mode 100644 vendor/github.com/libp2p/go-libp2p-swarm/package.json create mode 100644 vendor/github.com/libp2p/go-libp2p-tls/.travis.yml create mode 100644 vendor/github.com/libp2p/go-libp2p-tls/LICENSE.md create mode 100644 vendor/github.com/libp2p/go-libp2p-tls/README.md create mode 100644 vendor/github.com/libp2p/go-libp2p-tls/codecov.yml create mode 100644 vendor/github.com/libp2p/go-libp2p-tls/conn.go create mode 100644 vendor/github.com/libp2p/go-libp2p-tls/crypto.go create mode 100644 vendor/github.com/libp2p/go-libp2p-tls/extension.go create mode 100644 vendor/github.com/libp2p/go-libp2p-tls/go.mod rename vendor/github.com/{ipfs/go-ipfs-addr => libp2p/go-libp2p-tls}/go.sum (60%) create mode 100644 vendor/github.com/libp2p/go-libp2p-tls/transport.go delete mode 100644 vendor/github.com/libp2p/go-libp2p-transport-upgrader/Makefile delete mode 100644 vendor/github.com/libp2p/go-libp2p-transport-upgrader/package.json delete mode 100644 vendor/github.com/libp2p/go-libp2p-transport/.travis.yml delete mode 100644 vendor/github.com/libp2p/go-libp2p-transport/LICENSE delete mode 100644 vendor/github.com/libp2p/go-libp2p-transport/Makefile delete mode 100644 vendor/github.com/libp2p/go-libp2p-transport/README.md delete mode 100644 vendor/github.com/libp2p/go-libp2p-transport/codecov.yml delete mode 100644 vendor/github.com/libp2p/go-libp2p-transport/go.mod delete mode 100644 vendor/github.com/libp2p/go-libp2p-transport/go.sum delete mode 100644 vendor/github.com/libp2p/go-libp2p-transport/package.json rename vendor/github.com/libp2p/{go-stream-muxer => go-libp2p-yamux}/.gitignore (100%) rename vendor/github.com/{ipfs/go-ipfs-addr => libp2p/go-libp2p-yamux}/.travis.yml (89%) rename vendor/github.com/libp2p/{go-libp2p-netutil => go-libp2p-yamux}/LICENSE (100%) rename vendor/github.com/{whyrusleeping/go-smux-multistream => libp2p/go-libp2p-yamux}/Makefile (100%) create mode 100644 vendor/github.com/libp2p/go-libp2p-yamux/README.md create mode 100644 vendor/github.com/libp2p/go-libp2p-yamux/go.mod rename vendor/github.com/libp2p/{go-libp2p-metrics => go-libp2p-yamux}/go.sum (71%) rename vendor/github.com/{whyrusleeping/go-smux-yamux => libp2p/go-libp2p-yamux}/package.json (96%) rename vendor/github.com/{whyrusleeping/go-smux-yamux => libp2p/go-libp2p-yamux}/yamux.go (58%) delete mode 100644 vendor/github.com/libp2p/go-libp2p/p2p/net/mock/interface.go delete mode 100644 vendor/github.com/libp2p/go-libp2p/p2p/net/mock/mock.go delete mode 100644 vendor/github.com/libp2p/go-libp2p/p2p/net/mock/mock_conn.go delete mode 100644 vendor/github.com/libp2p/go-libp2p/p2p/net/mock/mock_link.go delete mode 100644 vendor/github.com/libp2p/go-libp2p/p2p/net/mock/mock_net.go delete mode 100644 vendor/github.com/libp2p/go-libp2p/p2p/net/mock/mock_peernet.go delete mode 100644 vendor/github.com/libp2p/go-libp2p/p2p/net/mock/mock_printer.go delete mode 100644 vendor/github.com/libp2p/go-libp2p/p2p/net/mock/mock_stream.go delete mode 100644 vendor/github.com/libp2p/go-libp2p/p2p/net/mock/ratelimiter.go delete mode 100644 vendor/github.com/libp2p/go-maddr-filter/Makefile delete mode 100644 vendor/github.com/libp2p/go-maddr-filter/package.json delete mode 100644 vendor/github.com/libp2p/go-mplex/Makefile create mode 100644 vendor/github.com/libp2p/go-mplex/deadline.go delete mode 100644 vendor/github.com/libp2p/go-mplex/package.json rename vendor/github.com/{whyrusleeping/go-smux-multiplex => libp2p/go-stream-muxer-multistream}/.gitignore (100%) rename vendor/github.com/libp2p/{go-libp2p-host => go-stream-muxer-multistream}/.travis.yml (89%) rename vendor/github.com/libp2p/{go-stream-muxer => go-stream-muxer-multistream}/LICENSE (100%) rename vendor/github.com/{whyrusleeping/go-smux-yamux => libp2p/go-stream-muxer-multistream}/Makefile (100%) rename vendor/github.com/{whyrusleeping/go-smux-yamux => libp2p/go-stream-muxer-multistream}/README.md (84%) create mode 100644 vendor/github.com/libp2p/go-stream-muxer-multistream/go.mod rename vendor/github.com/libp2p/{go-testutil => go-stream-muxer-multistream}/go.sum (72%) rename vendor/github.com/{whyrusleeping/go-smux-multistream => libp2p/go-stream-muxer-multistream}/multistream.go (82%) delete mode 100644 vendor/github.com/libp2p/go-stream-muxer/.gxignore delete mode 100644 vendor/github.com/libp2p/go-stream-muxer/.travis.yml delete mode 100644 vendor/github.com/libp2p/go-stream-muxer/Makefile delete mode 100644 vendor/github.com/libp2p/go-stream-muxer/README.md delete mode 100644 vendor/github.com/libp2p/go-stream-muxer/codecov.yml delete mode 100644 vendor/github.com/libp2p/go-stream-muxer/go.mod delete mode 100644 vendor/github.com/libp2p/go-stream-muxer/muxer.go delete mode 100644 vendor/github.com/libp2p/go-stream-muxer/package.json delete mode 100644 vendor/github.com/libp2p/go-tcp-transport/Makefile delete mode 100644 vendor/github.com/libp2p/go-tcp-transport/package.json delete mode 100644 vendor/github.com/libp2p/go-testutil/.travis.yml delete mode 100644 vendor/github.com/libp2p/go-testutil/LICENSE delete mode 100644 vendor/github.com/libp2p/go-testutil/Makefile delete mode 100644 vendor/github.com/libp2p/go-testutil/README.md delete mode 100644 vendor/github.com/libp2p/go-testutil/codecov.yml delete mode 100644 vendor/github.com/libp2p/go-testutil/gen.go delete mode 100644 vendor/github.com/libp2p/go-testutil/go.mod delete mode 100644 vendor/github.com/libp2p/go-testutil/identity.go delete mode 100644 vendor/github.com/libp2p/go-testutil/latency_config.go delete mode 100644 vendor/github.com/libp2p/go-testutil/package.json delete mode 100644 vendor/github.com/libp2p/go-testutil/rand.go delete mode 100644 vendor/github.com/libp2p/go-testutil/util.go delete mode 100644 vendor/github.com/libp2p/go-ws-transport/Makefile delete mode 100644 vendor/github.com/libp2p/go-ws-transport/package.json rename vendor/github.com/{whyrusleeping/yamux => libp2p/go-yamux}/.gitignore (100%) rename vendor/github.com/{whyrusleeping/yamux => libp2p/go-yamux}/LICENSE (100%) create mode 100644 vendor/github.com/libp2p/go-yamux/LICENSE-BSD rename vendor/github.com/{whyrusleeping/yamux => libp2p/go-yamux}/README.md (98%) rename vendor/github.com/{whyrusleeping/yamux => libp2p/go-yamux}/addr.go (100%) rename vendor/github.com/{whyrusleeping/yamux => libp2p/go-yamux}/const.go (73%) create mode 100644 vendor/github.com/libp2p/go-yamux/deadline.go create mode 100644 vendor/github.com/libp2p/go-yamux/go.mod create mode 100644 vendor/github.com/libp2p/go-yamux/go.sum rename vendor/github.com/{whyrusleeping/yamux => libp2p/go-yamux}/mux.go (75%) rename vendor/github.com/{whyrusleeping/yamux => libp2p/go-yamux}/session.go (68%) rename vendor/github.com/{whyrusleeping/yamux => libp2p/go-yamux}/spec.md (100%) rename vendor/github.com/{whyrusleeping/yamux => libp2p/go-yamux}/stream.go (78%) rename vendor/github.com/{whyrusleeping/yamux => libp2p/go-yamux}/util.go (54%) create mode 100644 vendor/github.com/magiconair/properties/go.mod create mode 100644 vendor/github.com/marten-seemann/qtls/.travis.yml create mode 100644 vendor/github.com/marten-seemann/qtls/LICENSE create mode 100644 vendor/github.com/marten-seemann/qtls/README.md rename vendor/github.com/mattn/go-isatty/{isatty_linux.go => isatty_tcgets.go} (95%) create mode 100644 vendor/github.com/mattn/go-runewidth/.travis.yml rename vendor/github.com/{gxed/hashland => mattn/go-runewidth}/LICENSE (96%) create mode 100644 vendor/github.com/mattn/go-runewidth/README.mkd create mode 100644 vendor/github.com/mattn/go-runewidth/runewidth.go create mode 100644 vendor/github.com/mattn/go-runewidth/runewidth_appengine.go create mode 100644 vendor/github.com/mattn/go-runewidth/runewidth_js.go create mode 100644 vendor/github.com/mattn/go-runewidth/runewidth_posix.go create mode 100644 vendor/github.com/mattn/go-runewidth/runewidth_windows.go create mode 100644 vendor/github.com/multiformats/go-multiaddr-fmt/.travis.yml rename vendor/github.com/{libp2p/go-libp2p-host => multiformats/go-multiaddr-fmt}/LICENSE (100%) create mode 100644 vendor/github.com/multiformats/go-multiaddr-fmt/README.md create mode 100644 vendor/github.com/multiformats/go-multiaddr-fmt/go.mod create mode 100644 vendor/github.com/multiformats/go-multiaddr-fmt/go.sum create mode 100644 vendor/github.com/multiformats/go-multiaddr-fmt/package.json create mode 100644 vendor/github.com/multiformats/go-multiaddr-fmt/patterns.go create mode 100644 vendor/github.com/multiformats/go-multiaddr/codecov.yml delete mode 100644 vendor/github.com/multiformats/go-multicodec/.travis.yml delete mode 100644 vendor/github.com/multiformats/go-multicodec/LICENSE delete mode 100644 vendor/github.com/multiformats/go-multicodec/Makefile delete mode 100644 vendor/github.com/multiformats/go-multicodec/README.md delete mode 100644 vendor/github.com/multiformats/go-multicodec/base/b64/codec.go delete mode 100644 vendor/github.com/multiformats/go-multicodec/base/bin/codec.go delete mode 100644 vendor/github.com/multiformats/go-multicodec/base/errors.go delete mode 100644 vendor/github.com/multiformats/go-multicodec/base/hex/codec.go delete mode 100644 vendor/github.com/multiformats/go-multicodec/base/mux/mux.go delete mode 100644 vendor/github.com/multiformats/go-multicodec/cbor/cbor.go delete mode 100644 vendor/github.com/multiformats/go-multicodec/coding.go delete mode 100644 vendor/github.com/multiformats/go-multicodec/header.go delete mode 100644 vendor/github.com/multiformats/go-multicodec/json/json.go delete mode 100644 vendor/github.com/multiformats/go-multicodec/multicodec.go delete mode 100644 vendor/github.com/multiformats/go-multicodec/mux/all.go delete mode 100644 vendor/github.com/multiformats/go-multicodec/mux/mux.go delete mode 100644 vendor/github.com/multiformats/go-multicodec/package.json delete mode 100644 vendor/github.com/multiformats/go-multihash/package.json create mode 100644 vendor/github.com/multiformats/go-multistream/multistream-fuzz.zip create mode 100644 vendor/github.com/multiformats/go-multistream/multistream_fuzz.go create mode 100644 vendor/github.com/olekukonko/tablewriter/.gitignore create mode 100644 vendor/github.com/olekukonko/tablewriter/.travis.yml rename vendor/github.com/{libp2p/go-libp2p-interface-connmgr/LICENSE => olekukonko/tablewriter/LICENSE.md} (94%) create mode 100644 vendor/github.com/olekukonko/tablewriter/README.md create mode 100644 vendor/github.com/olekukonko/tablewriter/csv.go create mode 100644 vendor/github.com/olekukonko/tablewriter/table.go create mode 100644 vendor/github.com/olekukonko/tablewriter/table_with_color.go create mode 100644 vendor/github.com/olekukonko/tablewriter/util.go create mode 100644 vendor/github.com/olekukonko/tablewriter/wrap.go create mode 100644 vendor/github.com/pelletier/go-toml/.dockerignore create mode 100644 vendor/github.com/pelletier/go-toml/Dockerfile create mode 100644 vendor/github.com/pelletier/go-toml/marshal_OrderPreserve_Map_test.toml create mode 100644 vendor/github.com/prometheus/tsdb/LICENSE create mode 100644 vendor/github.com/prometheus/tsdb/fileutil/dir_unix.go create mode 100644 vendor/github.com/prometheus/tsdb/fileutil/dir_windows.go create mode 100644 vendor/github.com/prometheus/tsdb/fileutil/fileutil.go create mode 100644 vendor/github.com/prometheus/tsdb/fileutil/flock.go create mode 100644 vendor/github.com/prometheus/tsdb/fileutil/flock_plan9.go create mode 100644 vendor/github.com/prometheus/tsdb/fileutil/flock_solaris.go create mode 100644 vendor/github.com/prometheus/tsdb/fileutil/flock_unix.go create mode 100644 vendor/github.com/prometheus/tsdb/fileutil/flock_windows.go create mode 100644 vendor/github.com/prometheus/tsdb/fileutil/mmap.go create mode 100644 vendor/github.com/prometheus/tsdb/fileutil/mmap_386.go create mode 100644 vendor/github.com/prometheus/tsdb/fileutil/mmap_amd64.go create mode 100644 vendor/github.com/prometheus/tsdb/fileutil/mmap_unix.go create mode 100644 vendor/github.com/prometheus/tsdb/fileutil/mmap_windows.go create mode 100644 vendor/github.com/prometheus/tsdb/fileutil/preallocate.go create mode 100644 vendor/github.com/prometheus/tsdb/fileutil/preallocate_darwin.go create mode 100644 vendor/github.com/prometheus/tsdb/fileutil/preallocate_linux.go create mode 100644 vendor/github.com/prometheus/tsdb/fileutil/preallocate_other.go create mode 100644 vendor/github.com/prometheus/tsdb/fileutil/sync.go create mode 100644 vendor/github.com/prometheus/tsdb/fileutil/sync_darwin.go create mode 100644 vendor/github.com/prometheus/tsdb/fileutil/sync_linux.go create mode 100644 vendor/github.com/rs/cors/go.mod delete mode 100644 vendor/github.com/rs/xhandler/.travis.yml delete mode 100644 vendor/github.com/rs/xhandler/LICENSE delete mode 100644 vendor/github.com/rs/xhandler/README.md delete mode 100644 vendor/github.com/rs/xhandler/chain.go delete mode 100644 vendor/github.com/rs/xhandler/middleware.go delete mode 100644 vendor/github.com/rs/xhandler/xhandler.go rename vendor/github.com/sirupsen/logrus/{terminal_check_js.go => terminal_check_no_terminal.go} (79%) create mode 100644 vendor/github.com/sirupsen/logrus/terminal_check_solaris.go delete mode 100644 vendor/github.com/sirupsen/logrus/terminal_notwindows.go delete mode 100644 vendor/github.com/sirupsen/logrus/terminal_windows.go create mode 100644 vendor/github.com/spacemonkeygo/openssl/.gitignore create mode 100644 vendor/github.com/spacemonkeygo/openssl/AUTHORS create mode 100644 vendor/github.com/spacemonkeygo/openssl/LICENSE create mode 100644 vendor/github.com/spacemonkeygo/openssl/README.md create mode 100644 vendor/github.com/spacemonkeygo/openssl/bio.go create mode 100644 vendor/github.com/spacemonkeygo/openssl/build.go create mode 100644 vendor/github.com/spacemonkeygo/openssl/build_static.go create mode 100644 vendor/github.com/spacemonkeygo/openssl/cert.go create mode 100644 vendor/github.com/spacemonkeygo/openssl/ciphers.go create mode 100644 vendor/github.com/spacemonkeygo/openssl/ciphers_gcm.go create mode 100644 vendor/github.com/spacemonkeygo/openssl/conn.go create mode 100644 vendor/github.com/spacemonkeygo/openssl/ctx.go create mode 100644 vendor/github.com/spacemonkeygo/openssl/dh.go create mode 100644 vendor/github.com/spacemonkeygo/openssl/dhparam.go create mode 100644 vendor/github.com/spacemonkeygo/openssl/digest.go create mode 100644 vendor/github.com/spacemonkeygo/openssl/engine.go create mode 100644 vendor/github.com/spacemonkeygo/openssl/fips.go create mode 100644 vendor/github.com/spacemonkeygo/openssl/go.mod create mode 100644 vendor/github.com/spacemonkeygo/openssl/go.sum create mode 100644 vendor/github.com/spacemonkeygo/openssl/hmac.go create mode 100644 vendor/github.com/spacemonkeygo/openssl/hostname.c create mode 100644 vendor/github.com/spacemonkeygo/openssl/hostname.go create mode 100644 vendor/github.com/spacemonkeygo/openssl/http.go create mode 100644 vendor/github.com/spacemonkeygo/openssl/init.go create mode 100644 vendor/github.com/spacemonkeygo/openssl/init_posix.go create mode 100644 vendor/github.com/spacemonkeygo/openssl/init_windows.go create mode 100644 vendor/github.com/spacemonkeygo/openssl/key.go create mode 100644 vendor/github.com/spacemonkeygo/openssl/mapping.go create mode 100644 vendor/github.com/spacemonkeygo/openssl/md4.go create mode 100644 vendor/github.com/spacemonkeygo/openssl/md5.go create mode 100644 vendor/github.com/spacemonkeygo/openssl/net.go create mode 100644 vendor/github.com/spacemonkeygo/openssl/nid.go create mode 100644 vendor/github.com/spacemonkeygo/openssl/pem.go create mode 100644 vendor/github.com/spacemonkeygo/openssl/sha1.go create mode 100644 vendor/github.com/spacemonkeygo/openssl/sha256.go create mode 100644 vendor/github.com/spacemonkeygo/openssl/shim.c create mode 100644 vendor/github.com/spacemonkeygo/openssl/shim.h create mode 100644 vendor/github.com/spacemonkeygo/openssl/sni.c create mode 100644 vendor/github.com/spacemonkeygo/openssl/ssl.go create mode 100644 vendor/github.com/spacemonkeygo/openssl/tickets.go create mode 100644 vendor/github.com/spacemonkeygo/openssl/utils/errors.go create mode 100644 vendor/github.com/spacemonkeygo/openssl/utils/future.go create mode 100644 vendor/github.com/spacemonkeygo/spacelog/.travis.yml create mode 100644 vendor/github.com/spacemonkeygo/spacelog/LICENSE create mode 100644 vendor/github.com/spacemonkeygo/spacelog/README.md create mode 100644 vendor/github.com/spacemonkeygo/spacelog/capture.go create mode 100644 vendor/github.com/spacemonkeygo/spacelog/capture_ae.go create mode 100644 vendor/github.com/spacemonkeygo/spacelog/capture_linux.go create mode 100644 vendor/github.com/spacemonkeygo/spacelog/capture_other.go create mode 100644 vendor/github.com/spacemonkeygo/spacelog/capture_solaris.go create mode 100644 vendor/github.com/spacemonkeygo/spacelog/capture_windows.go create mode 100644 vendor/github.com/spacemonkeygo/spacelog/collection.go create mode 100644 vendor/github.com/spacemonkeygo/spacelog/convenience.go create mode 100644 vendor/github.com/spacemonkeygo/spacelog/doc.go create mode 100644 vendor/github.com/spacemonkeygo/spacelog/event.go create mode 100644 vendor/github.com/spacemonkeygo/spacelog/handler.go create mode 100644 vendor/github.com/spacemonkeygo/spacelog/level.go create mode 100644 vendor/github.com/spacemonkeygo/spacelog/logger.go create mode 100644 vendor/github.com/spacemonkeygo/spacelog/output.go create mode 100644 vendor/github.com/spacemonkeygo/spacelog/output_other.go create mode 100644 vendor/github.com/spacemonkeygo/spacelog/output_windows.go create mode 100644 vendor/github.com/spacemonkeygo/spacelog/setup.go create mode 100644 vendor/github.com/spacemonkeygo/spacelog/sighup_appengine.go create mode 100644 vendor/github.com/spacemonkeygo/spacelog/sighup_other.go create mode 100644 vendor/github.com/spacemonkeygo/spacelog/syslog.go create mode 100644 vendor/github.com/spacemonkeygo/spacelog/syslog_windows.go create mode 100644 vendor/github.com/spacemonkeygo/spacelog/templates.go create mode 100644 vendor/github.com/spacemonkeygo/spacelog/templates_others.go create mode 100644 vendor/github.com/spacemonkeygo/spacelog/templates_windows.go create mode 100644 vendor/github.com/spacemonkeygo/spacelog/text.go create mode 100644 vendor/github.com/spf13/cobra/go.mod create mode 100644 vendor/github.com/spf13/cobra/go.sum create mode 100644 vendor/github.com/spf13/cobra/powershell_completions.go create mode 100644 vendor/github.com/spf13/cobra/powershell_completions.md create mode 100644 vendor/github.com/spf13/cobra/shell_completions.go create mode 100644 vendor/github.com/spf13/cobra/zsh_completions.md create mode 100644 vendor/github.com/steakknife/bloomfilter/.travis.yml create mode 100644 vendor/github.com/steakknife/bloomfilter/MIT-LICENSE.txt create mode 100644 vendor/github.com/steakknife/bloomfilter/README.md create mode 100644 vendor/github.com/steakknife/bloomfilter/binarymarshaler.go create mode 100644 vendor/github.com/steakknife/bloomfilter/binaryunmarshaler.go create mode 100644 vendor/github.com/steakknife/bloomfilter/bloomfilter.go create mode 100644 vendor/github.com/steakknife/bloomfilter/conformance.go create mode 100644 vendor/github.com/steakknife/bloomfilter/debug.go create mode 100644 vendor/github.com/steakknife/bloomfilter/errors.go create mode 100644 vendor/github.com/steakknife/bloomfilter/fileio.go create mode 100644 vendor/github.com/steakknife/bloomfilter/gob.go create mode 100644 vendor/github.com/steakknife/bloomfilter/iscompatible.go create mode 100644 vendor/github.com/steakknife/bloomfilter/new.go create mode 100644 vendor/github.com/steakknife/bloomfilter/optimal.go create mode 100644 vendor/github.com/steakknife/bloomfilter/statistics.go create mode 100644 vendor/github.com/steakknife/bloomfilter/textmarshaler.go create mode 100644 vendor/github.com/steakknife/bloomfilter/textunmarshaler.go create mode 100644 vendor/github.com/steakknife/hamming/.gitignore create mode 100644 vendor/github.com/steakknife/hamming/.travis.yml create mode 100644 vendor/github.com/steakknife/hamming/MIT-LICENSE.txt create mode 100644 vendor/github.com/steakknife/hamming/README.md create mode 100644 vendor/github.com/steakknife/hamming/doc.go create mode 100644 vendor/github.com/steakknife/hamming/hamming.go create mode 100644 vendor/github.com/steakknife/hamming/popcnt_amd64.go create mode 100644 vendor/github.com/steakknife/hamming/popcnt_amd64.s create mode 100644 vendor/github.com/steakknife/hamming/popcount.go create mode 100644 vendor/github.com/steakknife/hamming/popcount_slices.go create mode 100644 vendor/github.com/steakknife/hamming/popcount_slices_amd64.go create mode 100644 vendor/github.com/steakknife/hamming/popcount_slices_amd64.s create mode 100644 vendor/github.com/steakknife/hamming/slices_of_hamming.go create mode 100644 vendor/github.com/vulcanize/vulcanizedb/pkg/config/subscription.go delete mode 100644 vendor/github.com/whyrusleeping/cbor/go/Makefile delete mode 100644 vendor/github.com/whyrusleeping/cbor/go/cbor.go delete mode 100644 vendor/github.com/whyrusleeping/cbor/go/doc.go delete mode 100644 vendor/github.com/whyrusleeping/go-smux-multiplex/LICENSE delete mode 100644 vendor/github.com/whyrusleeping/go-smux-multiplex/package.json delete mode 100644 vendor/github.com/whyrusleeping/go-smux-multistream/.gitignore delete mode 100644 vendor/github.com/whyrusleeping/go-smux-multistream/LICENSE delete mode 100644 vendor/github.com/whyrusleeping/go-smux-multistream/README.md delete mode 100644 vendor/github.com/whyrusleeping/go-smux-multistream/package.json delete mode 100644 vendor/github.com/whyrusleeping/go-smux-yamux/.gitignore delete mode 100644 vendor/github.com/whyrusleeping/go-smux-yamux/LICENSE delete mode 100644 vendor/github.com/whyrusleeping/yamux/package.json create mode 100644 vendor/go.opencensus.io/tag/metadata.go create mode 100644 vendor/go.uber.org/atomic/.codecov.yml create mode 100644 vendor/go.uber.org/atomic/.gitignore create mode 100644 vendor/go.uber.org/atomic/.travis.yml create mode 100644 vendor/go.uber.org/atomic/LICENSE.txt create mode 100644 vendor/go.uber.org/atomic/Makefile create mode 100644 vendor/go.uber.org/atomic/README.md create mode 100644 vendor/go.uber.org/atomic/atomic.go create mode 100644 vendor/go.uber.org/atomic/error.go create mode 100644 vendor/go.uber.org/atomic/glide.lock create mode 100644 vendor/go.uber.org/atomic/glide.yaml create mode 100644 vendor/go.uber.org/atomic/string.go create mode 100644 vendor/go.uber.org/dig/.codecov.yml create mode 100644 vendor/go.uber.org/dig/.gitignore create mode 100644 vendor/go.uber.org/dig/.travis.yml create mode 100644 vendor/go.uber.org/dig/CHANGELOG.md rename vendor/{github.com/ipfs/go-ipfs-addr => go.uber.org/dig}/LICENSE (94%) create mode 100644 vendor/go.uber.org/dig/Makefile create mode 100644 vendor/go.uber.org/dig/README.md create mode 100755 vendor/go.uber.org/dig/check_license.sh create mode 100644 vendor/go.uber.org/dig/cycle.go create mode 100644 vendor/go.uber.org/dig/dig.go create mode 100644 vendor/go.uber.org/dig/doc.go create mode 100644 vendor/go.uber.org/dig/error.go create mode 100644 vendor/go.uber.org/dig/glide.lock create mode 100644 vendor/go.uber.org/dig/glide.yaml create mode 100644 vendor/go.uber.org/dig/graph.go create mode 100644 vendor/go.uber.org/dig/internal/digreflect/func.go create mode 100644 vendor/go.uber.org/dig/internal/dot/README.md create mode 100644 vendor/go.uber.org/dig/internal/dot/graph.go create mode 100644 vendor/go.uber.org/dig/param.go create mode 100644 vendor/go.uber.org/dig/result.go create mode 100644 vendor/go.uber.org/dig/stringer.go create mode 100644 vendor/go.uber.org/dig/types.go create mode 100644 vendor/go.uber.org/dig/version.go create mode 100644 vendor/go.uber.org/fx/.codecov.yml create mode 100644 vendor/go.uber.org/fx/.gitignore create mode 100644 vendor/go.uber.org/fx/.travis.yml create mode 100644 vendor/go.uber.org/fx/CHANGELOG.md create mode 100644 vendor/go.uber.org/fx/CONTRIBUTING.md rename vendor/{github.com/libp2p/go-libp2p-metrics => go.uber.org/fx}/LICENSE (94%) create mode 100644 vendor/go.uber.org/fx/Makefile create mode 100644 vendor/go.uber.org/fx/README.md create mode 100644 vendor/go.uber.org/fx/annotated.go create mode 100644 vendor/go.uber.org/fx/app.go create mode 100644 vendor/go.uber.org/fx/doc.go create mode 100644 vendor/go.uber.org/fx/extract.go create mode 100644 vendor/go.uber.org/fx/glide.lock create mode 100644 vendor/go.uber.org/fx/glide.yaml create mode 100644 vendor/go.uber.org/fx/inout.go create mode 100644 vendor/go.uber.org/fx/internal/fxlog/fxlog.go create mode 100644 vendor/go.uber.org/fx/internal/fxreflect/fxreflect.go create mode 100644 vendor/go.uber.org/fx/internal/lifecycle/lifecycle.go create mode 100644 vendor/go.uber.org/fx/lifecycle.go create mode 100644 vendor/go.uber.org/fx/populate.go create mode 100644 vendor/go.uber.org/fx/shutdown.go create mode 100644 vendor/go.uber.org/fx/version.go create mode 100644 vendor/go.uber.org/multierr/.codecov.yml create mode 100644 vendor/go.uber.org/multierr/.gitignore create mode 100644 vendor/go.uber.org/multierr/.travis.yml create mode 100644 vendor/go.uber.org/multierr/CHANGELOG.md create mode 100644 vendor/go.uber.org/multierr/LICENSE.txt create mode 100644 vendor/go.uber.org/multierr/Makefile create mode 100644 vendor/go.uber.org/multierr/README.md create mode 100644 vendor/go.uber.org/multierr/error.go create mode 100644 vendor/go.uber.org/multierr/glide.lock create mode 100644 vendor/go.uber.org/multierr/glide.yaml create mode 100644 vendor/golang.org/x/crypto/internal/chacha20/asm_ppc64le.s create mode 100644 vendor/golang.org/x/crypto/internal/chacha20/chacha_ppc64le.go create mode 100644 vendor/golang.org/x/crypto/poly1305/sum_ppc64le.go create mode 100644 vendor/golang.org/x/crypto/poly1305/sum_ppc64le.s create mode 100644 vendor/golang.org/x/net/internal/socket/sys_const_unix.go rename vendor/golang.org/x/{sys/windows/mkerrors.go => net/internal/socket/sys_linux_riscv64.go} (65%) create mode 100644 vendor/golang.org/x/net/internal/socket/zsys_freebsd_arm64.go create mode 100644 vendor/golang.org/x/net/internal/socket/zsys_linux_riscv64.go create mode 100644 vendor/golang.org/x/net/internal/socket/zsys_netbsd_arm64.go create mode 100644 vendor/golang.org/x/net/internal/socket/zsys_openbsd_arm64.go create mode 100644 vendor/golang.org/x/net/ipv4/zsys_linux_riscv64.go create mode 100644 vendor/golang.org/x/net/ipv6/zsys_linux_riscv64.go create mode 100644 vendor/golang.org/x/sys/cpu/asm_aix_ppc64.s create mode 100644 vendor/golang.org/x/sys/cpu/syscall_aix_ppc64_gc.go create mode 100644 vendor/golang.org/x/sys/unix/asm_linux_riscv64.s create mode 100644 vendor/golang.org/x/sys/unix/asm_openbsd_arm64.s create mode 100644 vendor/golang.org/x/sys/unix/mksysctl_openbsd.go delete mode 100755 vendor/golang.org/x/sys/unix/mksysctl_openbsd.pl rename vendor/golang.org/x/sys/unix/{openbsd_pledge.go => pledge_openbsd.go} (98%) create mode 100644 vendor/golang.org/x/sys/unix/syscall_openbsd_arm64.go rename vendor/golang.org/x/sys/unix/{openbsd_unveil.go => unveil_openbsd.go} (98%) create mode 100644 vendor/golang.org/x/sys/unix/zerrors_openbsd_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysctl_openbsd_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_openbsd_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_openbsd_arm64.go create mode 100755 vendor/golang.org/x/sys/windows/mkknownfolderids.bash create mode 100644 vendor/golang.org/x/sys/windows/zknownfolderids_windows.go create mode 100644 vendor/golang.org/x/text/unicode/norm/tables11.0.0.go create mode 100644 vendor/golang.org/x/xerrors/codereview.cfg rename vendor/gopkg.in/{fsnotify => }/fsnotify.v1/.editorconfig (100%) rename vendor/gopkg.in/{fsnotify => }/fsnotify.v1/.gitignore (100%) rename vendor/gopkg.in/{fsnotify => }/fsnotify.v1/.travis.yml (100%) rename vendor/gopkg.in/{fsnotify => }/fsnotify.v1/AUTHORS (100%) rename vendor/gopkg.in/{fsnotify => }/fsnotify.v1/CHANGELOG.md (100%) rename vendor/gopkg.in/{fsnotify => }/fsnotify.v1/CONTRIBUTING.md (100%) rename vendor/gopkg.in/{fsnotify => }/fsnotify.v1/LICENSE (100%) rename vendor/gopkg.in/{fsnotify => }/fsnotify.v1/README.md (100%) rename vendor/gopkg.in/{fsnotify => }/fsnotify.v1/fen.go (100%) rename vendor/gopkg.in/{fsnotify => }/fsnotify.v1/fsnotify.go (100%) rename vendor/gopkg.in/{fsnotify => }/fsnotify.v1/inotify.go (100%) rename vendor/gopkg.in/{fsnotify => }/fsnotify.v1/inotify_poller.go (100%) rename vendor/gopkg.in/{fsnotify => }/fsnotify.v1/kqueue.go (100%) rename vendor/gopkg.in/{fsnotify => }/fsnotify.v1/open_mode_bsd.go (100%) rename vendor/gopkg.in/{fsnotify => }/fsnotify.v1/open_mode_darwin.go (100%) rename vendor/gopkg.in/{fsnotify => }/fsnotify.v1/windows.go (100%) diff --git a/Gopkg.lock b/Gopkg.lock index e98d1dea..680921a4 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -14,30 +14,31 @@ revision = "65cc252bf6691cb3c7014bcb2c8dc29de91e3a7e" [[projects]] - branch = "master" - digest = "1:482fe066e308f0058abdfa302b9b5ff0fa4e89f6c55f103a2ac5e0af329f72cd" + digest = "1:bf67b338b8ad10f12e81c2f151d0be3246373c96681d06ba1312afe02d4e7fa4" name = "github.com/Stebalien/go-bitfield" packages = ["."] pruneopts = "UT" - revision = "076a62f9ce6ea421ab74a91f2d8dc7124f0cfd64" + revision = "a911218965d225c9b5b8ba5e1a8ea539651ca036" + version = "v0.0.1" [[projects]] - branch = "master" - digest = "1:e574dab86697e4e3a8e2e815e0e932cfbf3618e74d6379d8732b33757e11b23d" + digest = "1:f96ba6ecca7ba87b1dddd70ae38cfc4ce5ea844f58d1f728e121d2e29cdfb8a2" name = "github.com/allegro/bigcache" packages = [ ".", "queue", ] pruneopts = "UT" - revision = "e24eb225f15679bbe54f91bfa7da3b00e59b9768" + revision = "84a0ff3f153cbd7e280a19029a864bb04b504e62" + version = "v1.2.0" [[projects]] - digest = "1:f5322546f652db78b7a8efd35047a61d1e492abca2263e1c647eca49e1c8a354" + branch = "master" + digest = "1:7d191fd0c54ff370eaf6116a14dafe2a328df487baea280699f597aae858d00d" name = "github.com/aristanetworks/goarista" packages = ["monotime"] pruneopts = "UT" - revision = "ea17b1a17847fb6e4c0a91de0b674704693469b0" + revision = "52c2a7864a0891eefaed13a457510c7405a7105b" [[projects]] branch = "master" @@ -48,19 +49,20 @@ revision = "38337c27106d8f06e9b5cddc6df973ceece1c8ea" [[projects]] - digest = "1:477f6df8a1915abb180d730179a4a45212328effdf98cc6ca5b0e5741db00125" + branch = "master" + digest = "1:9e7c5138114ff9c51a60731b3a425c319305013c6ea8b3f60fd2435baba1a0db" name = "github.com/btcsuite/btcd" packages = ["btcec"] pruneopts = "UT" - revision = "2e60448ffcc6bf78332d1fe590260095f554dd78" + revision = "962a206e94e9151fe41bbd6d6464af4ba7168f50" [[projects]] - digest = "1:166438587ed45ac211dab8a3ecebf4fa0c186d0db63430fb9127bbc2e5fcdc67" + digest = "1:c1100fc71e23b6a32b2c68a5202a848fd13811d5a10b12edb8019c3667d1cd9a" name = "github.com/cenkalti/backoff" packages = ["."] pruneopts = "UT" - revision = "1e4cf3da559842a91afcb6ea6141451e6c30c618" - version = "v2.1.1" + revision = "4b4cebaf850ec58f1bb1fec5bdebdf8501c2bc3f" + version = "v3.0.0" [[projects]] digest = "1:f438d91be142877c3ad83157992c91de787ddfbddcc2a7da1ef6ef61606cadc4" @@ -92,25 +94,38 @@ name = "github.com/davidlazar/go-crypto" packages = ["salsa20"] pruneopts = "UT" - revision = "dcfb0a7ac018a248366f96bcd8a2f8c805d7b268" + revision = "62389b5e4ae0188549f6bb2f4877e7a22a1c420d" [[projects]] - digest = "1:1aeb4854a1c278e842712cd6684f48d595cbdd7839655d37a77248efa08c9fc0" + digest = "1:e47d51dab652d26c3fba6f8cba403f922d02757a82abdc77e90df7948daf296e" name = "github.com/deckarep/golang-set" packages = ["."] pruneopts = "UT" - revision = "504e848d77ea4752b3057b8fb46da0e7f746ccf3" + revision = "cbaa98ba5575e67703b32b4b19f73c91f3c4159e" + version = "v1.7.1" [[projects]] - digest = "1:563b179770b74de6a944e24599c840540cb0415da2596a15d32d060083f80f42" + digest = "1:edb569dd02419a41ddd98768cc0e7aec922ef19dae139731e5ca750afcf6f4c5" name = "github.com/edsrzf/mmap-go" packages = ["."] pruneopts = "UT" - revision = "935e0e8a636ca4ba70b713f3e38a19e1b77739e8" + revision = "188cc3b666ba704534fa4f96e9e61f21f1e1ba7c" + version = "v1.0.0" [[projects]] - branch = "rpc_statediffs_at_head" - digest = "1:2c0f4d6af078dff6a80597f5c339a9b2b36bd67ec2aff270a092888048b239ae" + digest = "1:682c0b06c64aa4d85f39fca4ba86d49724adf9cc055093aae7d7748fc3f73b10" + name = "github.com/elastic/gosigar" + packages = [ + ".", + "sys/windows", + ] + pruneopts = "UT" + revision = "99ed9cf55303a9d3936cb656b9a86a4a6e67b30a" + version = "v0.10.3" + +[[projects]] + branch = "rpc_statediffing" + digest = "1:89289139a19991d4f8cc00ea83ae7daddd1ff8533f9381a0607fb5c2a5cc1000" name = "github.com/ethereum/go-ethereum" packages = [ ".", @@ -148,7 +163,7 @@ "trie", ] pruneopts = "T" - revision = "79c9c5e59823b9b814d828a907e594d28509123b" + revision = "cc39d25e0fe0a44e3e7c1d4432e347351be06739" source = "github.com/vulcanize/go-ethereum" [[projects]] @@ -168,12 +183,12 @@ version = "v1.4.7" [[projects]] - digest = "1:33542eaf895b5489ccfb059502a721f0e8875379da8b3ff60fdd9212d503705c" + digest = "1:586ea76dbd0374d6fb649a91d70d652b7fe0ccffb8910a77468e7702e7901f3d" name = "github.com/go-stack/stack" packages = ["."] pruneopts = "UT" - revision = "54be5f394ed2c3e19dac9134a40a95ba5a017f7b" - version = "v1.5.4" + revision = "2fee6af1a9795aafbe0253a0cfbdf668e1fb8a9a" + version = "v1.8.0" [[projects]] digest = "1:d0e00c8ccabdfe678667d6be78c9d08a6a4efc36d9fb596f098706728b00ba6b" @@ -212,17 +227,6 @@ revision = "66b9c49e59c6c48f0ffce28c2d8b8a5678502c6d" version = "v1.4.0" -[[projects]] - digest = "1:43c609cba7aa615eaae5aa8f2ddba65dc1b2d3af7bc434f738238df8d3797ddb" - name = "github.com/gxed/hashland" - packages = [ - "keccakpg", - "murmur3", - ] - pruneopts = "UT" - revision = "a72cc0875a1e95edd309d3134bc7c11bf2d7360b" - version = "v0.0.1" - [[projects]] digest = "1:0ade334594e69404d80d9d323445d2297ff8161637f9b2d347cc6973d2d6f05b" name = "github.com/hashicorp/errwrap" @@ -270,8 +274,7 @@ version = "v1.0.0" [[projects]] - branch = "master" - digest = "1:59392ed8afb901aab4287d4894df8191722e34f3957716f4350c8c133ce99046" + digest = "1:a1038ef593beb4771c8f0f9c26e8b00410acd800af5c6864651d9bf160ea1813" name = "github.com/hpcloud/tail" packages = [ ".", @@ -281,7 +284,8 @@ "winfile", ] pruneopts = "UT" - revision = "a1dbeea552b7c8df4b542c66073e393de198a800" + revision = "a30252cb686a21eb2d0b98132633053ec2f7f1e5" + version = "v1.0.0" [[projects]] digest = "1:c00cc6d95a674b4b923ac069d364445043bc67836e9bd8aeff8440cfbe6a2cc7" @@ -316,7 +320,7 @@ version = "v0.0.1" [[projects]] - digest = "1:052da1a7811a1db320501f2291f9b520a8f539fa6ec818079183913f0bcce0d0" + digest = "1:a8251892e6757bb5ee5b6b2a3ffa3e50faa084f3f1037f9a43e699947c1c06e0" name = "github.com/ipfs/go-bitswap" packages = [ ".", @@ -333,13 +337,12 @@ "sessionmanager", "sessionpeermanager", "sessionrequestsplitter", - "testnet", "wantlist", "wantmanager", ] pruneopts = "UT" - revision = "2c47a554bca866a2ec50d54ccd192bf314c704f1" - version = "v0.0.4" + revision = "536feb6d3f87efea1aff433de88bb0c86449cee0" + version = "v0.1.4" [[projects]] digest = "1:97b7b1549d94c885626167359549d9164bb35a9a584faa7c3a576909be0ea37f" @@ -350,36 +353,35 @@ version = "v0.0.2" [[projects]] - digest = "1:9447c73342cc8dc50457df133a4ea4a2bbac20358cf53cb1245879d4af4e05fb" + digest = "1:06a1b271e8da35f27e53c81aa189d03d8bd45772fcf81e94b5a5506b0fd30120" name = "github.com/ipfs/go-blockservice" packages = ["."] pruneopts = "UT" - revision = "6ca3282a724998a2d47165de34f200ec3bc89619" - version = "v0.0.3" + revision = "67d4ac621a70a3e6f213b0e26c57de4b361f0bf1" + version = "v0.1.1" [[projects]] - digest = "1:ff780041e005869242b2cf977f1d4fa3b8f9bdd302fd254b4a19f78502a6ee10" + digest = "1:664cf1fc1e6ec05988cc6b8f52a61fca914279a92dcd0bc1b8be5507fb3b0c8a" name = "github.com/ipfs/go-cid" packages = ["."] pruneopts = "UT" - revision = "e7e67e08cfba888a4297224402e12832bdc15ea0" - version = "v0.0.1" + revision = "b1cc3e404d48791056147f118ea7e7ea94eb946f" + version = "v0.0.2" [[projects]] - digest = "1:bc03440e1a50ae0610f3bfa6ebd8454ada47bcb1abcf75faf139d649c2598bfa" + digest = "1:51b52e95a5f91a12afbddd264a0f857830c6fc1ec59e729c1397327f8c05898e" name = "github.com/ipfs/go-cidutil" packages = ["."] pruneopts = "UT" - revision = "7a289d95efee00994339172286cc99120f87b3e9" - version = "v0.0.1" + revision = "fdf58ea0da03b6087e14bcce352303c1c0bad32d" + version = "v0.0.2" [[projects]] - digest = "1:072829d8ab9f41e523774b1a7cc1f5f214eb48c0a475667883c41d7d95bab1f1" + digest = "1:079436f26cbece7e60cf4b4b851794a65dd5f360579b2f27a05415c70478dfb4" name = "github.com/ipfs/go-datastore" packages = [ ".", "autobatch", - "delayed", "keytransform", "mount", "namespace", @@ -408,13 +410,17 @@ version = "v0.0.1" [[projects]] - digest = "1:15f5e953da8605b4edc4e2d5bae64680fe31a8c8da066bcfea4fb87112c8187c" + branch = "postgres_update" + digest = "1:e418090e2967b5934f9c610691a88d914963f33f1a8948b60a063f09bcfc33e2" name = "github.com/ipfs/go-ipfs" packages = [ ".", "core", + "core/bootstrap", + "core/node", + "core/node/helpers", + "core/node/libp2p", "dagutils", - "exchange/reprovide", "filestore", "filestore/pb", "fuse/mount", @@ -425,26 +431,19 @@ "pin", "pin/internal/pb", "provider", + "provider/queue", + "provider/simple", "repo", "repo/common", "repo/fsrepo", "repo/fsrepo/migrations", "thirdparty/cidv0v1", "thirdparty/dir", - "thirdparty/math2", "thirdparty/verifbs", ] pruneopts = "UT" - revision = "8efc82534f74916b3416b7f10e4daac8ff1e95c9" - version = "v0.4.20" - -[[projects]] - digest = "1:cfecb1f62c703a0b4651b4c98c2b9c7645f2f062038208ad25060a77c9ae7e5d" - name = "github.com/ipfs/go-ipfs-addr" - packages = ["."] - pruneopts = "UT" - revision = "ac4881d4db36effbbeebf93d9172fcb20ed04c15" - version = "v0.0.1" + revision = "4f58f1dec03a63a75cfde25088c68ffb86c79fff" + source = "github.com/vulcanize/go-ipfs" [[projects]] digest = "1:429edc38cba9210059680d94ed67a8552632025635e666e112313986de135d74" @@ -463,15 +462,15 @@ version = "v0.0.1" [[projects]] - digest = "1:6a09c04984b8c581f3e7c765bc968a4bbfb6bc8ebf30f8bd6944dc73c43637b1" + digest = "1:4751a46363a69f324ef4ed1ef60e24a2f8d74c1b4de8672f094b9329a785ef18" name = "github.com/ipfs/go-ipfs-config" packages = [ ".", "serialize", ] pruneopts = "UT" - revision = "3a550f0da56c2527610b6db17aa2a9d65ae534fd" - version = "v0.0.2" + revision = "4a51393611d9580d17ecbccb0c4aec5eb81f21ce" + source = "github.com/vulcanize/go-ipfs-config" [[projects]] digest = "1:ae1ee4c628ee8ad66d9505bb2685902c93e0cd89089a17b8804463b5cc1b766b" @@ -506,20 +505,12 @@ version = "v0.0.1" [[projects]] - digest = "1:ff3f10c0e0d9c679390b06966df7344a72c31c3bec45c191676ab03fa845123f" + digest = "1:2f4c34c23f57eadaea0a620386dcc691e83f44cc52fb8163f53695e7aa3fbae4" name = "github.com/ipfs/go-ipfs-files" packages = ["."] pruneopts = "UT" - revision = "c68472a9b1ec45177ccf8fda607698c86ae0060f" - version = "v0.0.2" - -[[projects]] - digest = "1:f761e426f29519b6f4c7e419ed7aacb93c64fe0fe9db4835373b00034f15b959" - name = "github.com/ipfs/go-ipfs-flags" - packages = ["."] - pruneopts = "UT" - revision = "89d41d6d2542f7b3b25e01d7b4a3769885055454" - version = "v0.0.1" + revision = "cf8456081cd5fd17ae1716c5fdff7d4cfba1bbb2" + version = "v0.0.3" [[projects]] digest = "1:990c3a92954ef12159a3564533e63edc53feeadcb513930250351b919c6756f5" @@ -538,16 +529,15 @@ version = "v0.0.1" [[projects]] - digest = "1:744d6471a84d76b6d82eb6e15a0349aebb8728298caa649762ffd1e05c4109ad" + digest = "1:f00641be636a048182995a3ce649ee3239845a93f472ada8608c9546c961e5f3" name = "github.com/ipfs/go-ipfs-routing" packages = [ - "mock", "none", "offline", ] pruneopts = "UT" - revision = "29e4c89c60c510152e46033844194a62bc89b281" - version = "v0.0.1" + revision = "d508458cea98e199ae7b84029b627ceb9e5db660" + version = "v0.1.0" [[projects]] digest = "1:0b4439ae69776549e6489b261f66894a1390140dad53f1c3b1fbfc074478590d" @@ -558,23 +548,23 @@ version = "v0.0.1" [[projects]] - digest = "1:53f917e28732fbb5c1f24e368af2f03edbd3547dfe6e6a252b3727ce9f18f9cd" + digest = "1:b67b5b49a303fbef8d0c30958b41754068898b0084813cf9021cc9ecd7e4c7e4" name = "github.com/ipfs/go-ipld-cbor" packages = [ ".", "encoding", ] pruneopts = "UT" - revision = "e63450c54844e1bfe509b17cc73071c4ab150ef0" - version = "v0.0.1" + revision = "c084f45ab421fae38c99d98ce7aca9ca5ae85af3" + version = "v0.0.2" [[projects]] - digest = "1:a64b5e2c43d7a8a9bbda0d8519dca1841cdd7e352ffd059cf2a8fa06978ec5d1" + digest = "1:60006152d40763463546fc6db3e21a223d9a1a5dedb6554bbe6d1679ae1bf7b3" name = "github.com/ipfs/go-ipld-format" packages = ["."] pruneopts = "UT" - revision = "e6e9ea4d16a85d09cafb4dace15b978e984fa672" - version = "v0.0.1" + revision = "c8bb359ca21e831187139329dd4da249abc95602" + version = "v0.0.2" [[projects]] digest = "1:4638b57014e4a204350087e3a2d5631f8aaa197bb6af688ca6e280457a7a46fa" @@ -601,15 +591,15 @@ version = "v0.0.1" [[projects]] - digest = "1:703455843c663f97b4bd2506f6ed7ac307f6f45203b2c2452df888c01325f6c3" + digest = "1:3ff436f4ee9819ff02327bea8e947241338cbc2549d174d7e809bb6a829e928c" name = "github.com/ipfs/go-merkledag" packages = [ ".", "pb", ] pruneopts = "UT" - revision = "5e8e186e4d8f03514a43464e5b47310e71372ffc" - version = "v0.0.3" + revision = "e0c97528b5888969361ca8c0826e79944ea40682" + version = "v0.1.0" [[projects]] digest = "1:2de37461901377cb21aae96aab4ca67ebbb6d77e5f140c8f376eb566b7805365" @@ -620,23 +610,35 @@ version = "v0.0.1" [[projects]] - digest = "1:eb5e3140e55e3410055e91df6538a8712a3c20b33a97c397ba4beba8a9515db8" + digest = "1:1915753d8e710140521723fcaf003220711d0227dad3fb4b60fd0b26036b87ef" name = "github.com/ipfs/go-mfs" packages = ["."] pruneopts = "UT" - revision = "198fe2d22702d7d8102ba09900cddfd6981cabe1" - version = "v0.0.5" + revision = "7422e07115df7ec1a48358c142c45863b69093ee" + version = "v0.1.1" [[projects]] - digest = "1:ab4d5fb6c2469b61d8e9c3dd05fe29cc6935676acb17a7273d462e3bf263d87b" + digest = "1:78c440f94312bb5181ef6fdebf54ed91c7c115f6e79010aa5e513fdc9a7e3ddd" name = "github.com/ipfs/go-path" packages = [ ".", "resolver", ] pruneopts = "UT" - revision = "a1e7a849ac2bae46007920db4b6efe6faa4296a6" - version = "v0.0.3" + revision = "466e1ce7a7073faa0af3af8cd95c914ff1b1e945" + version = "v0.0.7" + +[[projects]] + digest = "1:3f51ad8ddff0464ba2044d7e665469f99c64aa397e1a0debaf912ec505e99519" + name = "github.com/ipfs/go-peertaskqueue" + packages = [ + ".", + "peertask", + "peertracker", + ] + pruneopts = "UT" + revision = "1e8b1e8c239e80cf3e0a6116f88740fdf9608032" + version = "v0.1.1" [[projects]] digest = "1:5d5961815f8e4f1fbad28f6c7ff5e42fcd9527aa823a5daa19b622b9cc41d1ed" @@ -647,7 +649,7 @@ version = "v0.0.1" [[projects]] - digest = "1:7f07522134395d0e83281d228ba5b08bd8ae440423fbd4c8780a348aa27fc804" + digest = "1:492daf11036434b7f75a0d9f797a3611d57ccd197b279d0520b54e7565d1e8e4" name = "github.com/ipfs/go-unixfs" packages = [ ".", @@ -659,8 +661,8 @@ "pb", ] pruneopts = "UT" - revision = "0b7b8867647cb408d8c057d00b0f0b170e2f1f1c" - version = "v0.0.4" + revision = "5fc20dbc340ea48f74d111d139b2d539d8ffa3c0" + version = "v0.0.8" [[projects]] digest = "1:78438260483c355139f9d83830a88ecd69578904f0f288134d3a95786c4f0864" @@ -671,7 +673,7 @@ version = "v0.0.1" [[projects]] - digest = "1:164193f6d91f8e2c9b5bfc5cb4522c8cd9c0994401eefbef0f5edbe9a3d10ce2" + digest = "1:b20852ec762d0ebedd0e3c1336959370f3badf8710c46e1034f8b6970216a449" name = "github.com/ipfs/interface-go-ipfs-core" packages = [ ".", @@ -680,8 +682,8 @@ "path", ] pruneopts = "UT" - revision = "77861581014b14ab47de990e82a1637fe1430ab7" - version = "v0.0.7" + revision = "f77aa7ee2c521ce3361de11b4e257b01f28f8db0" + version = "v0.1.0" [[projects]] digest = "1:b352ae8b1a77cc6b48fc8e314e34a522cfc76d6ca3a06c93b29c9cde5de6771e" @@ -699,14 +701,6 @@ revision = "c9cfead9f2a36ddf3daa40ba269aa7f4bbba6b62" version = "v1.0.1" -[[projects]] - branch = "master" - digest = "1:62fe3a7ea2050ecbd753a71889026f83d73329337ada66325cbafd5dea5f713d" - name = "github.com/jbenet/go-context" - packages = ["io"] - pruneopts = "UT" - revision = "d14ea06fba99483203c19d92cfcd13ebe73135f4" - [[projects]] digest = "1:30f857b000a0d14f978110222f1b1ba9cb1de8f6cabaca51933f3627ca6578a0" name = "github.com/jbenet/go-is-domain" @@ -724,8 +718,7 @@ revision = "aac704a3f4f27190b4ccc05f303a4931fd1241ff" [[projects]] - branch = "master" - digest = "1:a2a82ac6d7f2ab5966591f95612e3ecd9afed66051189e06876a29ed3744a3ea" + digest = "1:ee4b434dc3622e5c25a611ce314d40dd724495f27968797a2589a4d89eeed7eb" name = "github.com/jbenet/goprocess" packages = [ ".", @@ -734,7 +727,8 @@ "ratelimit", ] pruneopts = "UT" - revision = "b497e2f366b8624394fb2e89c10ab607bebdde0b" + revision = "7f9d9ed286badffcf2122cfeb383ec37daf92508" + version = "v0.1.3" [[projects]] digest = "1:31e761d97c76151dde79e9d28964a812c46efc5baee4085b86f68f0c654450de" @@ -761,31 +755,20 @@ version = "v0.0.1" [[projects]] - digest = "1:f9e8d1157f79aa5e81b34e0cdc7a6c99d6e44ad7a098f4e6869b8b83ef3d27bb" + digest = "1:b18a269f11ff51135d6f82987dbb53288f4d66098a6639b429f4f494a910155b" name = "github.com/libp2p/go-buffer-pool" packages = ["."] pruneopts = "UT" - revision = "eecb57f6a721b4a66062ebeb61d1da7ce1c38fbf" - version = "v0.0.1" - -[[projects]] - digest = "1:5810d7b1453ad0a085afc2afccbe88d606be67b8be1e12706158dbcbf95ae243" - name = "github.com/libp2p/go-conn-security" - packages = [ - ".", - "insecure", - ] - pruneopts = "UT" - revision = "80b6115ae32f104b2ed14d16a8551248f4599338" - version = "v0.0.1" + revision = "c4a5988a1e475884367015e1a2d0bd5fa4c491f4" + version = "v0.0.2" [[projects]] - digest = "1:9c14cac19ac8157c9cb89637da301f6b4994b93fd71da81e252940f6d0cf7332" + digest = "1:041a5219e2f0c1fa2af5d25aee6970600ba2ac055ba386c18cfe960d392df3db" name = "github.com/libp2p/go-conn-security-multistream" packages = ["."] pruneopts = "UT" - revision = "d4c3bf7e5688390e4106d3ec73aafd7d0856143b" - version = "v0.0.1" + revision = "09b4134a655b5fc883a5bdd62ea12db6e0a1b095" + version = "v0.1.0" [[projects]] digest = "1:83d3d59c84ff3da342ab63011d79750ccb987bda399eb64db3abd3e2fd32c18f" @@ -796,7 +779,7 @@ version = "v0.0.1" [[projects]] - digest = "1:1432bf2ddb7cfb0be623f9299e039a3910c20ecedd4beb2612c8fc6baabb666f" + digest = "1:a6490b575e691f41ff7acc35f7ce8618a2236070267466bc9b4d4af377bb2e94" name = "github.com/libp2p/go-libp2p" packages = [ ".", @@ -805,98 +788,96 @@ "p2p/host/basic", "p2p/host/relay", "p2p/host/routed", - "p2p/net/mock", "p2p/protocol/identify", "p2p/protocol/identify/pb", "p2p/protocol/ping", ] pruneopts = "UT" - revision = "e63ff38c3d274679753cf98846b247e06e9b9f5b" - version = "v0.0.16" + revision = "d69c889ad97b02883e04164c6acf77a7381634c2" + version = "v0.1.1" [[projects]] - digest = "1:7a9b53c8925819845e9ae47579cac5de87b66eddfc72988578f318504136a68c" + digest = "1:9a8251be38a87690510affa2e2fb04799a066b8ef49edc25a6acd30760d40792" name = "github.com/libp2p/go-libp2p-autonat" packages = [ ".", "pb", ] pruneopts = "UT" - revision = "c827b8ba68e6997431c27313efad33df19b5f6a3" - version = "v0.0.4" + revision = "3464f9b4f7bfbd7bb008813eacb626c7ab7fb9a3" + version = "v0.1.0" [[projects]] - digest = "1:c6c83e198fb782c1fc0e2706d9ff01d112d07f8781fd6f06127d08addd32b5fa" + digest = "1:04832a4429ccc5e9d793c6c27a5807c5854a79d44a893c80cb72d0bf8dfc157f" name = "github.com/libp2p/go-libp2p-autonat-svc" packages = ["."] pruneopts = "UT" - revision = "bcaff01a6eb53bf7e7a93f06b8fc494627a91641" - version = "v0.0.5" + revision = "51a8fe550623e6ebae91c9b43755e2ee9c310549" + version = "v0.1.0" [[projects]] - digest = "1:1289f34bbc72cfe59de1528e793e27c67a44a9597e1537ef03597abef8641f6e" + digest = "1:3da4ac7b6ea1fd52a22012966d7c744715a5cabfea013be30cb0d595bcfcdd3f" name = "github.com/libp2p/go-libp2p-circuit" packages = [ ".", "pb", ] pruneopts = "UT" - revision = "d07cd5f739a7878121b10e54a8ead734f93e2ddf" - version = "v0.0.4" + revision = "e65c36f3bb806cf658db0f0b612879899e2d28dc" + version = "v0.1.0" [[projects]] - digest = "1:b218b4385ba83a014018f63f6bcb78eae8fb51b86b410471c1ccc1ee2fac4d10" + digest = "1:15ffa5302d331a56efdc24ce2570ddf32bfff89daa4e3b0fed0c453a19b4960c" name = "github.com/libp2p/go-libp2p-connmgr" packages = ["."] pruneopts = "UT" - revision = "44a04f91e1fc9eb63caaf970e55cf319be76abee" - version = "v0.0.3" + revision = "152025a671fcc297333095f8e4afc98d90b30df7" + version = "v0.1.0" [[projects]] - digest = "1:83915d6b4485f9ca8727ad9195d0881f1eeea4c9f286b0c0fb4b0757c21d1bc2" - name = "github.com/libp2p/go-libp2p-crypto" + digest = "1:cadd85974083bc4e5959ccfde7543d9d7ce019a2019854150ff2ed5c3096753c" + name = "github.com/libp2p/go-libp2p-core" packages = [ - ".", - "pb", + "connmgr", + "crypto", + "crypto/pb", + "discovery", + "helpers", + "host", + "metrics", + "mux", + "network", + "peer", + "peerstore", + "pnet", + "protocol", + "routing", + "sec", + "sec/insecure", + "transport", ] pruneopts = "UT" - revision = "b0ed0e663e8b6832bad3f4502b2f6551ff2686cd" - version = "v0.0.1" - -[[projects]] - digest = "1:c8e13ce10e73ffc2c59e11fd62d85a1e516e33af6521ed337d2e4777bc7605d8" - name = "github.com/libp2p/go-libp2p-discovery" - packages = ["."] - pruneopts = "UT" - revision = "4cb4193d603389a75bccd07336de74d54bea6b00" - version = "v0.0.2" - -[[projects]] - digest = "1:1df10c788e75259f6ebae0612de30f0db09e690042b9db64551a188c6509cc8b" - name = "github.com/libp2p/go-libp2p-host" - packages = ["."] - pruneopts = "UT" - revision = "df61f890baee33effc62473e65c0ce481407181d" - version = "v0.0.2" + revision = "8f222f4b5a872d9af86f74f2ec0982c7356adce6" + version = "v0.0.3" [[projects]] - digest = "1:bc58f4c83d59130bbef42bbd7ebb0d23ccd8cc9c1eecd63a57b5576f5f8effc2" - name = "github.com/libp2p/go-libp2p-interface-connmgr" + digest = "1:35caf66f415bddda628d9410a20a6bcd8ac3deebbda33de1220d3f7ee3a14ccd" + name = "github.com/libp2p/go-libp2p-crypto" packages = ["."] pruneopts = "UT" - revision = "e80dd2e9f839e44febfcb7e6b38ded8761332eb6" - version = "v0.0.3" + revision = "ddb6d72b5ad0ae81bf1ee77b628eac1d7237536a" + version = "v0.1.0" [[projects]] - digest = "1:065f0484575f052b79972215142bb50ac634c5282bf85692192fc1dfc8752b8b" - name = "github.com/libp2p/go-libp2p-interface-pnet" + digest = "1:0333065da4682126d7c1aa07dd11d94accc3b93b48945ebb7f6a921e2f6b0db2" + name = "github.com/libp2p/go-libp2p-discovery" packages = ["."] pruneopts = "UT" - revision = "b02026130a4daafb8001e039e116121cb92ae1a9" - version = "v0.0.1" + revision = "d248d63b0af8c023307da18ad7000a12020e06f0" + version = "v0.1.0" [[projects]] - digest = "1:9c47cb524a992e85504d0916d1cdb9e022314d180f57f3e1bf32c6698b29e53f" + digest = "1:7811b2a796bfc81952e70d14c5bb99ac550b18b1bbf815359a4d24cfc4329481" name = "github.com/libp2p/go-libp2p-kad-dht" packages = [ ".", @@ -906,35 +887,35 @@ "providers", ] pruneopts = "UT" - revision = "ca611b1605e5c64e240c98755a4f913d661979b2" - version = "v0.0.9" + revision = "31765355df17ef818381169dc36180c84c119928" + version = "v0.1.0" [[projects]] - digest = "1:029a31918e966dba732de956af5af626c92d9e1296b2b34c6e68d4e6c5cf1b7e" + digest = "1:d750c3b6c1c69bab8ed996ca6c053e0a13db53d2c51937a0debc40174c77bfc1" name = "github.com/libp2p/go-libp2p-kbucket" packages = [ ".", "keyspace", ] pruneopts = "UT" - revision = "0ac6a1f84ed8c7d05b204f9f09556b1e34e1253a" - version = "v0.1.1" + revision = "3752ea0128fd84b4fef0a66739b8ca95c8a471b6" + version = "v0.2.0" [[projects]] - digest = "1:401eaa568a08603ebcccd833d0d69c2ac1abe153f1260f7a82375c3a455c7223" + digest = "1:645c5ab1429b06141e0d22852df9561e04b3759380f6657f0b510a30eef83665" name = "github.com/libp2p/go-libp2p-loggables" packages = ["."] pruneopts = "UT" - revision = "332c68ea465a3353571377635eb0fc257a0c38c4" - version = "v0.0.1" + revision = "814642b01726ff6f9302e8ce9eeeb00d25409520" + version = "v0.1.0" [[projects]] - digest = "1:09deed1e61077096d762c465c8cb6bd6f75a89729e27de6b3880feb455ba6358" - name = "github.com/libp2p/go-libp2p-metrics" + digest = "1:714ce7cff748910cfc250713300d24ece7d4832156ba7a245e7ac5fc810c7319" + name = "github.com/libp2p/go-libp2p-mplex" packages = ["."] pruneopts = "UT" - revision = "f7021db7729eb519a86ec6a90b5b476e6072f6f7" - version = "v0.0.1" + revision = "811729f15f0af13fe3f0d9e410c22f6a4bc5c686" + version = "v0.2.1" [[projects]] digest = "1:4614c7d351b9cc24ef6457107fad9830664615bb7d7de91de10c4a4ab1919545" @@ -945,35 +926,15 @@ version = "v0.0.4" [[projects]] - digest = "1:a87f13baa72a09a5d6fea78e3a1af82f2bc1f0637a4eb4304c5cba765720ccd3" - name = "github.com/libp2p/go-libp2p-net" - packages = ["."] - pruneopts = "UT" - revision = "e1b54a3fd69634603ac02b34e4eefcf5aca50ed9" - version = "v0.0.2" - -[[projects]] - digest = "1:9d7f797f63fc1d4a9960c89326cf26304c4db52e0490411da3e4deee65de5146" - name = "github.com/libp2p/go-libp2p-netutil" - packages = ["."] - pruneopts = "UT" - revision = "126124c7f3e570a469754c4857bd86527f5eb94e" - version = "v0.0.1" - -[[projects]] - digest = "1:dd98b7bc6fcd8ca56cd6f19f988db68d970eba9e66f25bc392e563a5791e0a26" + digest = "1:79d1cf3e88f9ae667c30039cc37a6ad0be8bf0fa9b5359b572253de74b24c644" name = "github.com/libp2p/go-libp2p-peer" - packages = [ - ".", - "peerset", - "test", - ] + packages = ["."] pruneopts = "UT" - revision = "96d6d7940e6fc555240a92d1b4615049cd451da2" - version = "v0.1.0" + revision = "62676d8fb785a8fc279878cbe8e03b878f005910" + version = "v0.2.0" [[projects]] - digest = "1:6806fd32afb9c73cf45624ddd4f6b1e3ae4ce119443b34bbb1dc8fe6fcb19823" + digest = "1:9a42e258de3b7daa00e2a3499bfa34185fb0c94b31cfa12a0f85f9105ebf8072" name = "github.com/libp2p/go-libp2p-peerstore" packages = [ ".", @@ -982,141 +943,137 @@ "queue", ] pruneopts = "UT" - revision = "b496ee543347a9c724e02ff7102da9d78c8acbee" - version = "v0.0.3" + revision = "4353646945045d89f77d0b362cb5e5533cbd117e" + version = "v0.1.0" [[projects]] - digest = "1:5d5de8a1d6165e92773a676617b354f352dd39849cbb6580d6d017706ca8e38e" + digest = "1:576fc983d8a7fae4f2d03f8bfcfee6c2b062b70fee73cb10cc6a7531445ba998" name = "github.com/libp2p/go-libp2p-pnet" packages = ["."] pruneopts = "UT" - revision = "7424696a369ba1535fd7961f22d710e39ae7c8f9" - version = "v0.0.1" - -[[projects]] - digest = "1:861a4351f79c9e2bca75407d8801b55da0526feec15ec98b433c2f800ad1f393" - name = "github.com/libp2p/go-libp2p-protocol" - packages = ["."] - pruneopts = "UT" - revision = "c170ad966a647835bda0cbe4dc710cf9f94949b6" - version = "v0.0.1" + revision = "f0a2f186a5c972b76b55680d5ef21894491c2f81" + version = "v0.1.0" [[projects]] - digest = "1:e8d3d819fb8398e0945fbe5e55b519c3c76d952e0e33901a47fdadc0fd1874e7" + digest = "1:639e2ee83cffd5445eeffd1cb8ba50b690028dc98464abac24e93a15abca8c8b" name = "github.com/libp2p/go-libp2p-pubsub" packages = [ ".", "pb", ] pruneopts = "UT" - revision = "25cbf38777e869acb77e8079c3c76d6b430e66ad" - version = "v0.0.1" + revision = "49274b0e8aecdf6cad59d768e5702ff00aa48488" + version = "v0.1.0" [[projects]] - digest = "1:bcf57f2766818c04d2fddc0bd75167b8cbf36f7043d4f4a73c729fd6ec8ada08" + digest = "1:d1eeaaf0f74ecb34eb30a48fd20347cf5b3df17ca822e3a99e23100922072b31" name = "github.com/libp2p/go-libp2p-pubsub-router" packages = ["."] pruneopts = "UT" - revision = "228ab843b11da664bb67cf1caa1b1fdf611aa769" - version = "v0.0.3" + revision = "1b619f8d12950c3a6b91f93c08f29842af38a68c" + version = "v0.1.0" [[projects]] - digest = "1:a1cf76b0f654cd8e2aec54b8c6f2a8aa4373f15879db9f5671380c421fcba0c9" + digest = "1:0e004b6b20f295a4e3a0e11e0644b3cb05beb5011c751f52cb088bc6d15ba94c" name = "github.com/libp2p/go-libp2p-quic-transport" packages = ["."] pruneopts = "UT" - revision = "b069bc9fa68a05c01a361550ca59f5e3fb9b421e" - version = "v0.0.3" + revision = "2abd270a64ebf0e3b869ee6bc7a1e5ac8b001fe6" + version = "v0.1.1" [[projects]] - digest = "1:712d8c0de8c227d80e589af33389c7c8b56b7ade75fa1d6b81963330ed7427e7" + digest = "1:524733c74ff3b3fad069dbfda7b21c532c2411125b5bd60a7560f90cdbf82eab" name = "github.com/libp2p/go-libp2p-record" packages = [ ".", "pb", ] pruneopts = "UT" - revision = "4c2093f40950fe401a612a725ef0765c0c767b60" - version = "v0.0.1" + revision = "4837430afd8f3864d4805d7a1675521abb1096b4" + version = "v0.1.0" [[projects]] - digest = "1:40536312550a2d67b11568a05e9885a3d7b728000a88a93d577f117fa0d2eef6" + digest = "1:ab8374423f8b7148d55e6d7ec848d248a0707b2af8a8b8a5b3608887d9ec485d" name = "github.com/libp2p/go-libp2p-routing" - packages = [ - ".", - "notifications", - "options", - ] + packages = ["notifications"] pruneopts = "UT" - revision = "ab366780f22ac0d2625105a9f6d3cace1817dd30" - version = "v0.0.1" + revision = "f4ece6c1baa8e77ee488b25014fcb1059955ed0f" + version = "v0.1.0" [[projects]] - digest = "1:86438785b80785614784bed81c0e8bcd9cdb362bfd1bb7675e24136d32b5842a" + digest = "1:62994932ddbe31d1130589fb009538831afec171c787677a570cc9eba0dd96fe" name = "github.com/libp2p/go-libp2p-routing-helpers" packages = ["."] pruneopts = "UT" - revision = "80177179327fbef5249eb0bc7f372d830f939a5c" - version = "v0.0.2" + revision = "061228ae05eb858e5d99d80e96920a6de1df497a" + version = "v0.1.0" [[projects]] - digest = "1:6a12f20cd4c7260f211f096aa70234150d930514070d73ccaa46dd17ed2fbbc1" + digest = "1:d0bed92a182074cefb3f2e1beb5d250618ab38b2fb2dbcaf0496c20c77acf8da" name = "github.com/libp2p/go-libp2p-secio" packages = [ ".", "pb", ] pruneopts = "UT" - revision = "b5b0ccd501582b3aec0a8076e9009c4c69f075b6" - version = "v0.0.2" + revision = "a158134b5708e33fa36545d8ba8e27ea1c8ae54e" + version = "v0.1.0" [[projects]] - digest = "1:13bb1cd21375488f6a49134b261439974e8105d04eb84e396c9c86248e0f4d97" + digest = "1:1bbb49167caff9f03e045bac3c6b0f71d563a91b5cba459aaf7a81afc90687ca" name = "github.com/libp2p/go-libp2p-swarm" packages = ["."] pruneopts = "UT" - revision = "51da4b6c9c2e869dce87a455a7c788d7181711c7" - version = "v0.0.2" + revision = "99831444e78c8f23c9335c17d8f7c700ba25ca14" + version = "v0.1.0" [[projects]] - digest = "1:3b26a897674c84976f9ee6d93d91d0fc503a4aada9c6b7a69b5ed4752452d035" - name = "github.com/libp2p/go-libp2p-transport" + digest = "1:af731b7005639d582a0353c22651e94d08d3970abfdddac742c9fad94b85bfd1" + name = "github.com/libp2p/go-libp2p-tls" packages = ["."] pruneopts = "UT" - revision = "760cba29c65701ce7b688f238f6c93cc1d899dde" - version = "v0.0.4" + revision = "d1a46ca5425197316b94a31953df645adaa21f67" + version = "v0.1.0" [[projects]] - digest = "1:9e59f3adcbbffe3fd2333843bb3d944e5b42791d86dfdbef67673fb9a1d0bce1" + digest = "1:2fcb80000123d80148ce210a053a226d52dc891419905d7ff076c164825da50d" name = "github.com/libp2p/go-libp2p-transport-upgrader" packages = ["."] pruneopts = "UT" - revision = "b4ab689796cdae99ad6641abcedcd7c23258de0c" - version = "v0.0.1" + revision = "07ed92ccf9aba3a2e4b2fddc4c17ced060524922" + version = "v0.1.1" [[projects]] - digest = "1:56b76ab784de08c03549ce824b2f103390c744016cf22c7d3cacd7f4abb26e54" + digest = "1:c476d8c20126fdc217055de367da2a8c4d78da52bf0818dedd6c92e87795021c" + name = "github.com/libp2p/go-libp2p-yamux" + packages = ["."] + pruneopts = "UT" + revision = "a61e80cb5770aa0d9b1bafe94da1278f58baa2c5" + version = "v0.2.1" + +[[projects]] + digest = "1:986c0c852c462da2cdc5d584dc2fd884cb898371cbc43cdc250149f40f8cd8fc" name = "github.com/libp2p/go-maddr-filter" packages = ["."] pruneopts = "UT" - revision = "1258bb7e3e3a37bb9a93aaf77ef88f8405b39bce" - version = "v0.0.1" + revision = "e3cdd802c04babcbec2c4711721d105cfe822cd3" + version = "v0.0.4" [[projects]] - digest = "1:dca7a0779bc8c3052ff1760928da7fab1d6bdaa568de55c175cb96c83a6d20c4" + digest = "1:fd01fc96631a63d323f17fcbd64161804439855404b9405db14deacba9e1b69c" name = "github.com/libp2p/go-mplex" packages = ["."] pruneopts = "UT" - revision = "b16006283f6036f9a461f78692c397b134a75393" - version = "v0.0.1" + revision = "62fe9554facaec3f80333b61ea8d694fe615705f" + version = "v0.1.0" [[projects]] - digest = "1:fec6c720509c1682df4e297899d23951d1b3ad3bcc124ecf734af34053a18982" + digest = "1:c9e9340913c74e8a3e93cbf8e60d93563ac780ea3ea0cd77a4ff501e6d0c18aa" name = "github.com/libp2p/go-msgio" packages = ["."] pruneopts = "UT" - revision = "b47fa43a3e8e2b96e34854e4a25b2b0988322621" - version = "v0.0.2" + revision = "9142103f7d8dc5a74a91116b8f927fe8d8bf4a96" + version = "v0.0.4" [[projects]] digest = "1:82e0411449d8af0c34e200cd6b90e70689d692d17f836906194fa9fc28692e80" @@ -1143,39 +1100,39 @@ version = "v0.0.2" [[projects]] - digest = "1:28994f656f7bd53b2f506641d72878250583051bd86477ab8129c613c8437ee3" - name = "github.com/libp2p/go-stream-muxer" + digest = "1:58a6c4b9e52e298228703f9bf480d65c40ede7152a9ad17aa1eafe618ed0b43a" + name = "github.com/libp2p/go-stream-muxer-multistream" packages = ["."] pruneopts = "UT" - revision = "96b8d4dc6b2577782a7c6c33776c115e3d2eacf6" - version = "v0.0.1" + revision = "2439b02deee2de8bb1fe24473d3d8333008a714a" + version = "v0.2.0" [[projects]] - digest = "1:32b1b70c98be85d88229af2ba0cceb9954e7ef88c3f7e90f95a8ea2deb32c0d3" + digest = "1:ac5ce11098023fcf8164307727a2b99d69e2bb84a3b1f4bc3e1d10fd72f9bdbd" name = "github.com/libp2p/go-tcp-transport" packages = ["."] pruneopts = "UT" - revision = "42717ef323c6cd024d3196d18bc1b7657c453d6d" - version = "v0.0.2" + revision = "415627e90148700bf97890e54b193a42125c3b66" + version = "v0.1.0" [[projects]] - digest = "1:d232baf2d647f75c9a676dcc2f4dcc912aa8c399001c7a45dc981131b77e414f" - name = "github.com/libp2p/go-testutil" + digest = "1:b1436d41d493ff2d51052838e0415c26366314febead5051f732f5c98e3729f1" + name = "github.com/libp2p/go-ws-transport" packages = ["."] pruneopts = "UT" - revision = "425d0bf3c5d09720ab62cb2b79107d83651f271b" - version = "v0.0.1" + revision = "6efd965516262a6b6e46ea987b94904ef13e59bc" + version = "v0.1.0" [[projects]] - digest = "1:fe4581341f14aba2ef06749c5f2fc6483d4354b25e3c6e0094a4135082a22ed2" - name = "github.com/libp2p/go-ws-transport" + digest = "1:64fdef1e970d17504d960d18412125e85ca620703e495105b3fbffee27acf568" + name = "github.com/libp2p/go-yamux" packages = ["."] pruneopts = "UT" - revision = "93daaa611babb322b314d33c6c6ad26298f55f56" - version = "v0.0.2" + revision = "663972181d409e7263040f0b668462f87c85e1bd" + version = "v1.2.3" [[projects]] - digest = "1:d90f4189a065809b38ccc5a5a6a66d57ccad809562409903f7518352aeb5986b" + digest = "1:95de854fb72e6cd0344b875a04abace9abbef78c304c4f31b451bbedd9023338" name = "github.com/lucas-clemente/quic-go" packages = [ ".", @@ -1189,48 +1146,56 @@ "internal/wire", ] pruneopts = "UT" - revision = "8dcdf12ff78def6cfd36107d8bf42aa38110fa94" - version = "v0.11.1" + revision = "4355e1a7e961ba3b6005cb035ae17732181c9508" + version = "v0.11.2" [[projects]] - digest = "1:c568d7727aa262c32bdf8a3f7db83614f7af0ed661474b24588de635c20024c7" + digest = "1:5a0ef768465592efca0412f7e838cdc0826712f8447e70e6ccc52eb441e9ab13" name = "github.com/magiconair/properties" packages = ["."] pruneopts = "UT" - revision = "c2353362d570a7bfa228149c62842019201cfb71" - version = "v1.8.0" + revision = "de8848e004dd33dc07a2947b3d76f618a7fc7ef1" + version = "v1.8.1" [[projects]] - digest = "1:94e7d7656c79a0c4eea386d663a046bb904bb93217052b74b16e79bb04f82f57" + digest = "1:9d377b8e6748a813a7fb25e99bf54bfaefba62eac5bf5152c2657f95dbe83172" name = "github.com/marten-seemann/qtls" packages = ["."] pruneopts = "UT" - revision = "65ca381cd298d7e0aef0de8ba523a870ec5a96fe" - version = "v0.2.3" + revision = "cd359ef406f82ab779fea7db4c512898eb3007a6" + version = "v0.2.4" [[projects]] - digest = "1:2fa7b0155cd54479a755c629de26f888a918e13f8857a2c442205d825368e084" + digest = "1:7c084e0e780596dd2a7e20d25803909a9a43689c153de953520dfbc0b0e51166" name = "github.com/mattn/go-colorable" packages = ["."] pruneopts = "UT" - revision = "3a70a971f94a22f2fa562ffcc7a0eb45f5daf045" - version = "v0.1.1" + revision = "8029fb3788e5a4a9c00e415f586a6d033f5d38b3" + version = "v0.1.2" [[projects]] - digest = "1:e150b5fafbd7607e2d638e4e5cf43aa4100124e5593385147b0a74e2733d8b0d" + digest = "1:9b90c7639a41697f3d4ad12d7d67dfacc9a7a4a6e0bbfae4fc72d0da57c28871" name = "github.com/mattn/go-isatty" packages = ["."] pruneopts = "UT" - revision = "c2a7a6ca930a4cd0bc33a3f298eb71960732a3a7" - version = "v0.0.7" + revision = "1311e847b0cb909da63b5fecfb5370aa66236465" + version = "v0.0.8" + +[[projects]] + digest = "1:0356f3312c9bd1cbeda81505b7fd437501d8e778ab66998ef69f00d7f9b3a0d7" + name = "github.com/mattn/go-runewidth" + packages = ["."] + pruneopts = "UT" + revision = "3ee7d812e62a0804a7d0a324e0249ca2db3476d3" + version = "v0.0.4" [[projects]] - digest = "1:2b4b4b2e5544c2a11a486c1b631357aa2ddf766e50c1b2483cf809da2c511234" + digest = "1:7c572c76f914b3d3f7d75ce752c3a6ac5ba03be1f775e4602a3f18d7b08ddbbb" name = "github.com/miekg/dns" packages = ["."] pruneopts = "UT" - revision = "73601d4aed9d844322611759d7f3619110b7c88e" - version = "v1.1.8" + revision = "9cfcfb2209aecb663673bd44b11f71c215186b80" + version = "v1.1.14" [[projects]] branch = "master" @@ -1241,12 +1206,12 @@ revision = "3f5f724cb5b182a5c278d6d3d55b40e7f8c2efb4" [[projects]] - branch = "master" digest = "1:d69117243f58a0d320c2889872d8c14d323d865277dc49fc85bfcf48b2846b8f" name = "github.com/minio/sha256-simd" packages = ["."] pruneopts = "UT" revision = "05b4dd3047e5d6e86cb4e0477164b850cd896261" + version = "v0.1.0" [[projects]] digest = "1:5d231480e1c64a726869bc4142d270184c419749d34f167646baa21008eb0a79" @@ -1265,12 +1230,12 @@ version = "v1.1.2" [[projects]] - digest = "1:cf5b7fbff2c87cff6c0e11f87b30edc21abc6592e6a76f41003ca6d5a712cf48" + digest = "1:b6299badabd66eaede0651e2eaede106d8298b25564e4a7f23e335471d3e5a35" name = "github.com/mr-tron/base58" packages = ["base58"] pruneopts = "UT" - revision = "6598572f05537592acb5a609ff53c4c7fbba7a3e" - version = "v1.1.1" + revision = "d504ab2e22d97cb9f10b1d146a1e6a063f4a5f43" + version = "v1.1.2" [[projects]] digest = "1:b9fe622bbadbb060338620752b1cb3aa1473855071195ebe83813af5ebb3629b" @@ -1281,12 +1246,12 @@ version = "v0.0.3" [[projects]] - digest = "1:4fb02614401f3511d3c76482b6bc626a307811d53df34610ce5ded5ad83fa05d" + digest = "1:c95537699dfc9ecc62c2bb273fd2fdf5810ce23ed50f25529c17f755a052a7c3" name = "github.com/multiformats/go-multiaddr" packages = ["."] pruneopts = "UT" - revision = "ce21123d5172669bbf37a166078bc5f9d345ec2f" - version = "v0.0.2" + revision = "5b1de2f51ff2368d5ce94a659f15ef26be273cd0" + version = "v0.0.4" [[projects]] digest = "1:e7b7007612b49b368d5b505b624b399a1de5fe2764271b92145aa9ca0440ab4e" @@ -1296,6 +1261,14 @@ revision = "e7c544d7a325c57bdbd7e9ba9c035a6701c5c7d2" version = "v0.0.2" +[[projects]] + digest = "1:1275cf8587ba416c439453ee4b194b803270b836831c487b3da3cf9d82f58bb7" + name = "github.com/multiformats/go-multiaddr-fmt" + packages = ["."] + pruneopts = "UT" + revision = "7d8102a98552c80f8a5ccb9c01e670fac17fd6df" + version = "v0.0.1" + [[projects]] digest = "1:ccb950e76138c70abe765c3b9c0e6cad0e55fc66ff53318cea8b651df9f892c7" name = "github.com/multiformats/go-multiaddr-net" @@ -1313,37 +1286,27 @@ version = "v0.0.1" [[projects]] - digest = "1:b113be7291061893f53217f1b34f044f5a8ebd1d296fb6774b307f305a2ef9ed" - name = "github.com/multiformats/go-multicodec" - packages = [ - ".", - "base", - "base/b64", - "base/bin", - "base/hex", - "base/mux", - "cbor", - "json", - "mux", - ] + digest = "1:83c4c7eef11b74d0dfacdd9464e4d694ebc3d2012c7f295a92551bb1b3a1b32a" + name = "github.com/multiformats/go-multihash" + packages = ["."] pruneopts = "UT" - revision = "b67bc51f663437753e2028cc4b5fea6192479956" - version = "v0.1.6" + revision = "0e239d8fa37b597bd150660e5b6845570aa5b833" + version = "v0.0.6" [[projects]] - digest = "1:f22991b1c70f4f93dbd16bf16f59f9b7f4b7fefbc1d6b6818d4aae1cb60f05af" - name = "github.com/multiformats/go-multihash" + digest = "1:026ef80e6db7432132c7687d23b465e0c4bdb47a4aed893ee4b7d528a0550059" + name = "github.com/multiformats/go-multistream" packages = ["."] pruneopts = "UT" - revision = "922cbd7915f407488e3f4413ada76400a1b29b49" - version = "v0.0.3" + revision = "039807e4901c4b2041f40a0e4aa32d72939608aa" + version = "v0.1.0" [[projects]] - digest = "1:894daf10008cdef37454571b584832b2a281a5709f6b80d7bd440ff3a627c962" - name = "github.com/multiformats/go-multistream" + digest = "1:abcdbf03ca6ca13d3697e2186edc1f33863bbdac2b3a44dfa39015e8903f7409" + name = "github.com/olekukonko/tablewriter" packages = ["."] pruneopts = "UT" - revision = "f3f44044ac2444cd3a017c0b269f8da65b0012f1" + revision = "e6d60cf7ba1f42d86d54cdf5508611c4aafb3970" version = "v0.0.1" [[projects]] @@ -1407,12 +1370,12 @@ version = "v1.1.0" [[projects]] - digest = "1:e0f50a07c0def90588d69f77178712c6fdc67eb6576365f551cce98b44b501bf" + digest = "1:93131d8002d7025da13582877c32d1fc302486775a1b06f62241741006428c5e" name = "github.com/pelletier/go-toml" packages = ["."] pruneopts = "UT" - revision = "63909f0a90ab0f36909e8e044e46ace10cf13ba2" - version = "v1.3.0" + revision = "728039f679cbcd4f6a54e080d2219a4c4928c546" + version = "v1.4.0" [[projects]] digest = "1:cf31692c14422fa27c83a05292eb5cbe0fb2775972e8f1f8446a71549bd8980b" @@ -1440,28 +1403,47 @@ revision = "01bf1e26dd14f9b71f26b7005a2b1ef514d5f9a4" [[projects]] - digest = "1:4b9bd28bbf14271f4b89a6c401589ea5939d14138e0399c253c1939cc4252d2f" + digest = "1:1b8344715571e257101066e65d0bc8172715ecf09c8bd09b56763ec6389395e4" + name = "github.com/prometheus/tsdb" + packages = ["fileutil"] + pruneopts = "UT" + revision = "d48a5e2d5c34116dfcbc7b935c66157847b2d8b5" + version = "v0.8.0" + +[[projects]] + digest = "1:b0c25f00bad20d783d259af2af8666969e2fc343fa0dc9efe52936bbd67fb758" name = "github.com/rs/cors" packages = ["."] pruneopts = "UT" - revision = "a62a804a8a009876ca59105f7899938a1349f4b3" - version = "v1.0" + revision = "9a47f48565a795472d43519dd49aac781f3034fb" + version = "v1.6.0" [[projects]] - digest = "1:9665a593c0199c193341b8b110e31b19c899923711fc70bde2c2f3eb2d337526" - name = "github.com/rs/xhandler" + digest = "1:04457f9f6f3ffc5fea48e71d62f2ca256637dee0a04d710288e27e05c8b41976" + name = "github.com/sirupsen/logrus" packages = ["."] pruneopts = "UT" - revision = "d9d9599b6aaf6a058cb7b1f48291ded2cbd13390" - version = "v1.0" + revision = "839c75faf7f98a33d445d181f3018b5c3409a45e" + version = "v1.4.2" [[projects]] - digest = "1:fd61cf4ae1953d55df708acb6b91492d538f49c305b364a014049914495db426" - name = "github.com/sirupsen/logrus" + branch = "master" + digest = "1:74aa99ef18406ebfdedfb2a07b9a01f9ff2b6d2547b27b33fcdf1007223d75cc" + name = "github.com/spacemonkeygo/openssl" + packages = [ + ".", + "utils", + ] + pruneopts = "UT" + revision = "c2dcc5cca94ac8f7f3f0c20e20050d4cce9d9730" + +[[projects]] + branch = "master" + digest = "1:d6956eb95db39859627c18e1dd425b2ddd1a0d6000b643a4d4ada8fc887c1e09" + name = "github.com/spacemonkeygo/spacelog" packages = ["."] pruneopts = "UT" - revision = "8bdbc7bcc01dcbb8ec23dc8a28e332258d25251f" - version = "v1.4.1" + revision = "2296661a0572a51438413369004fa931c2641923" [[projects]] digest = "1:919bb3aa6d9d0b67648c219fa4925312bc3c2872da19e818fa769e9c97a2b643" @@ -1491,12 +1473,12 @@ version = "v1.3.0" [[projects]] - digest = "1:645cabccbb4fa8aab25a956cbcbdf6a6845ca736b2c64e197ca7cbb9d210b939" + digest = "1:e096613fb7cf34743d49af87d197663cfccd61876e2219853005a57baedfa562" name = "github.com/spf13/cobra" packages = ["."] pruneopts = "UT" - revision = "ef82de70bb3f60c65fb8eebacbb2d122ef517385" - version = "v0.0.3" + revision = "f2b07da1e2c38d5f12845a4f607e2e1018cbb1f5" + version = "v0.0.5" [[projects]] digest = "1:1b753ec16506f5864d26a28b43703c58831255059644351bbcb019b843950900" @@ -1515,16 +1497,31 @@ version = "v1.0.3" [[projects]] - digest = "1:1b773526998f3dbde3a51a4a5881680c4d237d3600f570d900f97ac93c7ba0a8" + digest = "1:11118bd196646c6515fea3d6c43f66162833c6ae4939bfb229b9956d91c6cf17" name = "github.com/spf13/viper" packages = ["."] pruneopts = "UT" - revision = "9e56dacc08fbbf8c9ee2dbc717553c758ce42bc9" - version = "v1.3.2" + revision = "b5bf975e5823809fb22c7644d008757f78a4259e" + version = "v1.4.0" [[projects]] - branch = "master" - digest = "1:3f0c28875fb78456bc1815a9c13cb5962a4f0c462b37ec72e90c2f2cc407b54f" + digest = "1:266e2f508feb9a9a765bfeb74d116a88514248b2f8428788dcce574bd026b9c0" + name = "github.com/steakknife/bloomfilter" + packages = ["."] + pruneopts = "UT" + revision = "99ee86d9200fcc2ffde62f508329bd6627c0a307" + version = "1.0.4" + +[[projects]] + digest = "1:5ca4bdccd72e66aaba5b52f9c4a21f1021102f0919432fe138ad5d48abf06833" + name = "github.com/steakknife/hamming" + packages = ["."] + pruneopts = "UT" + revision = "003c143a81c25ea5e263d692919c611c7122ae6b" + version = "0.2.5" + +[[projects]] + digest = "1:5b180f17d5bc50b765f4dcf0d126c72979531cbbd7f7929bf3edd87fb801ea2d" name = "github.com/syndtr/goleveldb" packages = [ "leveldb", @@ -1541,11 +1538,12 @@ "leveldb/util", ] pruneopts = "UT" - revision = "c3a204f8e96543bb0cc090385c001078f184fc46" + revision = "9d007e481048296f09f59bd19bb7ae584563cd95" + version = "v1.0.0" [[projects]] branch = "syncAndPublish" - digest = "1:902deeaea32bc6f906ea4b25edf80b6666305f7d98ebfc6e2bde4722090671fe" + digest = "1:63be173fa28013787735d9674502fa7df9b1a7218732075f884867f83bad718c" name = "github.com/vulcanize/vulcanizedb" packages = [ "pkg/config", @@ -1557,7 +1555,7 @@ "pkg/plugin/helpers", ] pruneopts = "UT" - revision = "10307ff58f8b6f9cbaf73b7e3a77cfa0e531feba" + revision = "93d4f122ea784de57b8dd131790069ca1e11d3d5" [[projects]] branch = "master" @@ -1567,14 +1565,6 @@ pruneopts = "UT" revision = "c30ac30633ccdabefe87eb12465113f06f1bab75" -[[projects]] - branch = "master" - digest = "1:ee2495c639b3b0f9736db90775b8978b6d2495566b65fb8439d7b0665a749e16" - name = "github.com/whyrusleeping/cbor" - packages = ["go"] - pruneopts = "UT" - revision = "63513f603b11583741970c5045ea567130ddb492" - [[projects]] branch = "master" digest = "1:3ca7e47848bbb8fc6c17b86c9887117e2e83dd5d68f7c4daf8c8fd30471ea597" @@ -1607,30 +1597,6 @@ pruneopts = "UT" revision = "097c5d47330ff6a823f67e3515faa13566a62c6f" -[[projects]] - digest = "1:1c5b129f012e176d9cbcb173c67fef17698a2d0a8169e94c8db9e7beeb3ef716" - name = "github.com/whyrusleeping/go-smux-multiplex" - packages = ["."] - pruneopts = "UT" - revision = "2b855d4f3a3051b0133f7783bffe06e4b7833d1e" - version = "v3.0.16" - -[[projects]] - digest = "1:262e85ef9e2082fcb44335f6349699d61d5ac3672d24dcf3bf4cbc7377b51e96" - name = "github.com/whyrusleeping/go-smux-multistream" - packages = ["."] - pruneopts = "UT" - revision = "e799b10bc6eea2cc5ce18f7b7b4d8e1a0439476d" - version = "v2.0.2" - -[[projects]] - digest = "1:f1026ff0b15a5282885d6709582eba8d2faf261ffff4bac6960a8e97a4f6dfd5" - name = "github.com/whyrusleeping/go-smux-yamux" - packages = ["."] - pruneopts = "UT" - revision = "902adacdc02ba8fca64a0d0985576a1dc3138ee5" - version = "v2.0.9" - [[projects]] digest = "1:6c96967502c55c555abfe560f561a124951345e713a8e87cc6e2c214976e6e75" name = "github.com/whyrusleeping/mafmt" @@ -1664,15 +1630,7 @@ revision = "cfcb2f1abfee846c430233aef0b630a946e0a5a6" [[projects]] - digest = "1:1f186490a9ec1359604f041997996fb0caa98878bd53cdf0b89b6b6ec6803af9" - name = "github.com/whyrusleeping/yamux" - packages = ["."] - pruneopts = "UT" - revision = "5364a42fe4b5efa5967c11c8f9b0f049cac0c4a9" - version = "v1.1.5" - -[[projects]] - digest = "1:286eb95a9a56ac1d47dcbfa404ae1cf6fc5fd7d1e84ce30f80a7f41918930c1a" + digest = "1:0509a2e8721ffedf3c03ebed1ac8eda633b8f4ee812d5edcac5c5d77eaeb7f0d" name = "go.opencensus.io" packages = [ "internal/tagencoding", @@ -1685,8 +1643,49 @@ "tag", ] pruneopts = "UT" - revision = "75c0cca22312e51bfd4fafdbe9197ae399e18b38" - version = "v0.20.2" + revision = "9c377598961b706d1542bd2d84d538b5094d596e" + version = "v0.22.0" + +[[projects]] + digest = "1:a5158647b553c61877aa9ae74f4015000294e47981e6b8b07525edcbb0747c81" + name = "go.uber.org/atomic" + packages = ["."] + pruneopts = "UT" + revision = "df976f2515e274675050de7b3f42545de80594fd" + version = "v1.4.0" + +[[projects]] + digest = "1:2773e4e922e5af534775962ffef08770b8114e177590f7605886528d37417105" + name = "go.uber.org/dig" + packages = [ + ".", + "internal/digreflect", + "internal/dot", + ] + pruneopts = "UT" + revision = "7ff117f761a3f1b3eb521945c17a1091438eb6de" + version = "v1.7.0" + +[[projects]] + digest = "1:74e59bc785a76b467b9a5c0353193e8befa0c27863413e5fc52e87cf3d24fa4e" + name = "go.uber.org/fx" + packages = [ + ".", + "internal/fxlog", + "internal/fxreflect", + "internal/lifecycle", + ] + pruneopts = "UT" + revision = "3de044da969b90ad0a3e4a7867a74662f645f3f9" + version = "v1.9.0" + +[[projects]] + digest = "1:60bf2a5e347af463c42ed31a493d817f8a72f102543060ed992754e689805d1a" + name = "go.uber.org/multierr" + packages = ["."] + pruneopts = "UT" + revision = "3c4937480c32f4c13a875a1829af76c98ca3d40a" + version = "v1.1.0" [[projects]] branch = "master" @@ -1698,7 +1697,7 @@ [[projects]] branch = "master" - digest = "1:9d4ef0b818376f348bcf8723c5b716c5d7de7dca9fe080525ba3da1dfcdf96b7" + digest = "1:677e91b88bd44fd2457ce11bc3a4177181860d051b54d9400a8eeaa3f37247b4" name = "golang.org/x/crypto" packages = [ "blake2s", @@ -1719,11 +1718,11 @@ "sha3", ] pruneopts = "UT" - revision = "d864b10871cd4370fe574816b489c819c675ccc7" + revision = "57b3e21c3d5606066a87e63cfe07ec6b9f0db000" [[projects]] branch = "master" - digest = "1:3aeaebd3e6f1cbaf92214589c664272a80538b28ef830aa92306fc78e6506ad7" + digest = "1:ba6649199b57e9d553e7840db4cc27a668e1f20ab83bb7ce793860d0ad2f0a8a" name = "golang.org/x/net" packages = [ "bpf", @@ -1738,11 +1737,11 @@ "websocket", ] pruneopts = "UT" - revision = "4829fb13d2c62012c17688fa7f629f371014946d" + revision = "d28f0bde5980168871434b95cfc858db9f2a7a99" [[projects]] branch = "master" - digest = "1:45c0985630ebeafc0dba3e5fad8ae79ac344250a0d3517da4abcf7bc25a162b6" + digest = "1:b932dea7071a330220706e535413d9c4265560c1f29b95174c5425f42b09dfb7" name = "golang.org/x/sys" packages = [ "cpu", @@ -1750,10 +1749,10 @@ "windows", ] pruneopts = "UT" - revision = "953cdadca894cdc07be76fc99f95b40c28f06623" + revision = "15dcb6c0061f497a3f66e3ea034b629c6dd4d99e" [[projects]] - digest = "1:59607368811e42e02c54ec8868048ae7e6e21a71ec36395745de2dca549c6dc5" + digest = "1:7570a3e4daa14b7627089e77ad8c714f5f36b4cf1b7dfd8510df7d6935dc42a0" name = "golang.org/x/text" packages = [ "encoding", @@ -1780,26 +1779,27 @@ "unicode/norm", ] pruneopts = "UT" - revision = "c942b20a5d85b458c4dce1589326051d85e25d6d" - version = "v0.3.1" + revision = "342b2e1fbaa52c93f31447ad2c6abc048c63e475" + version = "v0.3.2" [[projects]] branch = "master" - digest = "1:d9d3a231c70b17470fc134900032da48d5c146f0f4a2ce12ceb92704dae8d67d" + digest = "1:c44a77760372a998be8d4656e8d3c865f68735ec4cad1743a245903a58f64249" name = "golang.org/x/xerrors" packages = [ ".", "internal", ] pruneopts = "UT" - revision = "1f06c39b43733b74392b1972507822714ced3242" + revision = "3ee3066db522c6628d440a3a91c4abdd7f5ef22f" [[projects]] digest = "1:abeb38ade3f32a92943e5be54f55ed6d6e3b6602761d74b4aab4c9dd45c18abd" - name = "gopkg.in/fsnotify/fsnotify.v1" + name = "gopkg.in/fsnotify.v1" packages = ["."] pruneopts = "UT" revision = "c2828203cd70a50dcccfb2761f8b1f8ceef9a8e9" + source = "gopkg.in/fsnotify/fsnotify.v1" version = "v1.4.7" [[projects]] @@ -1811,11 +1811,12 @@ revision = "c1b8fa8bdccecb0b8db834ee0b92fdbcfa606dd6" [[projects]] - digest = "1:3c839a777de0e6da035c9de900b60cbec463b0a89351192c1ea083eaf9e0fce0" + branch = "v1" + digest = "1:0caa92e17bc0b65a98c63e5bc76a9e844cd5e56493f8fdbb28fad101a16254d9" name = "gopkg.in/tomb.v1" packages = ["."] pruneopts = "UT" - revision = "c131134a1947e9afd9cecfe11f4c6dff0732ae58" + revision = "dd632973f1e7218eb1089048e0798ec9ae7dceb8" [[projects]] digest = "1:4d2e5a73dc1500038e504a8d78b986630e3626dc027bc030ba5c75da257cdb96" diff --git a/Gopkg.toml b/Gopkg.toml index 5a45e889..d1d84b1c 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -24,6 +24,9 @@ # go-tests = true # unused-packages = true +[[override]] + name = "gopkg.in/fsnotify.v1" + source = "gopkg.in/fsnotify/fsnotify.v1" [[constraint]] name = "github.com/ipfs/go-cid" @@ -64,12 +67,12 @@ [[constraint]] name = "github.com/vulcanize/vulcanizedb" - branch = "syncAndPublish" + branch = "ipfs_concurrency" [[constraint]] name = "github.com/ethereum/go-ethereum" source = "github.com/vulcanize/go-ethereum" - branch = "rpc_statediffing" + branch = "statediffing" [prune] go-tests = true diff --git a/pkg/wrappers/core/rawdb/accessors_chain.go b/pkg/wrappers/core/rawdb/accessors_chain.go index 9f280d80..54ac6b30 100644 --- a/pkg/wrappers/core/rawdb/accessors_chain.go +++ b/pkg/wrappers/core/rawdb/accessors_chain.go @@ -30,7 +30,7 @@ func (accessor *AccessorsChain) GetBlock(hash common.Hash, number uint64) *types } func (accessor *AccessorsChain) GetBlockReceipts(hash common.Hash, number uint64) types.Receipts { - return rawdb.ReadReceipts(accessor.ethDbConnection, hash, number) + return rawdb.ReadReceipts(accessor.ethDbConnection, hash, number, nil) } func (accessor *AccessorsChain) GetBody(hash common.Hash, number uint64) *types.Body { diff --git a/test_helpers/mocks/wrappers/core/state/database.go b/test_helpers/mocks/wrappers/core/state/database.go index 49927991..3cf25772 100644 --- a/test_helpers/mocks/wrappers/core/state/database.go +++ b/test_helpers/mocks/wrappers/core/state/database.go @@ -69,6 +69,10 @@ func (*mockStateDatabase) TrieDB() *trie.Database { type mockEthDB struct { } +func (db *mockEthDB) NewIteratorWithStart(start []byte) ethdb.Iterator { + panic("implement me") +} + func (*mockEthDB) Put(key []byte, value []byte) error { panic("implement me") } diff --git a/vendor/github.com/Stebalien/go-bitfield/go.mod b/vendor/github.com/Stebalien/go-bitfield/go.mod new file mode 100644 index 00000000..83337723 --- /dev/null +++ b/vendor/github.com/Stebalien/go-bitfield/go.mod @@ -0,0 +1,3 @@ +module github.com/Stebalien/go-bitfield + +go 1.12 diff --git a/vendor/github.com/allegro/bigcache/queue/bytes_queue.go b/vendor/github.com/allegro/bigcache/queue/bytes_queue.go index bda73740..0285c72c 100644 --- a/vendor/github.com/allegro/bigcache/queue/bytes_queue.go +++ b/vendor/github.com/allegro/bigcache/queue/bytes_queue.go @@ -16,12 +16,6 @@ const ( minimumEmptyBlobSize = 32 + headerEntrySize ) -var ( - errEmptyQueue = &queueError{"Empty queue"} - errInvalidIndex = &queueError{"Index must be greater than zero. Invalid index."} - errIndexOutOfBounds = &queueError{"Index out of range"} -) - // 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 { @@ -168,11 +162,6 @@ func (q *BytesQueue) Get(index int) ([]byte, error) { return data, err } -// CheckGet checks if an entry can be read from index -func (q *BytesQueue) CheckGet(index int) error { - return q.peekCheckErr(index) -} - // Capacity returns number of allocated bytes for queue func (q *BytesQueue) Capacity() int { return q.capacity @@ -188,35 +177,18 @@ func (e *queueError) Error() string { return e.message } -// peekCheckErr is identical to peek, but does not actually return any data -func (q *BytesQueue) peekCheckErr(index int) error { - - if q.count == 0 { - return errEmptyQueue - } - - if index <= 0 { - return errInvalidIndex - } - - if index+headerEntrySize >= len(q.array) { - return errIndexOutOfBounds - } - return nil -} - func (q *BytesQueue) peek(index int) ([]byte, int, error) { if q.count == 0 { - return nil, 0, errEmptyQueue + return nil, 0, &queueError{"Empty queue"} } if index <= 0 { - return nil, 0, errInvalidIndex + return nil, 0, &queueError{"Index must be grater than zero. Invalid index."} } if index+headerEntrySize >= len(q.array) { - return nil, 0, errIndexOutOfBounds + return nil, 0, &queueError{"Index out of range"} } blockSize := int(binary.LittleEndian.Uint32(q.array[index : index+headerEntrySize])) diff --git a/vendor/github.com/allegro/bigcache/shard.go b/vendor/github.com/allegro/bigcache/shard.go index a31094ff..67679ba1 100644 --- a/vendor/github.com/allegro/bigcache/shard.go +++ b/vendor/github.com/allegro/bigcache/shard.go @@ -49,10 +49,9 @@ func (s *cacheShard) get(key string, hashedKey uint64) ([]byte, error) { s.collision() return nil, ErrEntryNotFound } - entry := readEntry(wrappedEntry) s.lock.RUnlock() s.hit() - return entry, nil + return readEntry(wrappedEntry), nil } func (s *cacheShard) set(key string, hashedKey uint64, entry []byte) error { @@ -86,7 +85,6 @@ func (s *cacheShard) set(key string, hashedKey uint64, entry []byte) error { } func (s *cacheShard) del(key string, hashedKey uint64) error { - // Optimistic pre-check using only readlock s.lock.RLock() itemIndex := s.hashmap[hashedKey] @@ -96,7 +94,8 @@ func (s *cacheShard) del(key string, hashedKey uint64) error { return ErrEntryNotFound } - if err := s.entries.CheckGet(int(itemIndex)); err != nil { + wrappedEntry, err := s.entries.Get(int(itemIndex)) + if err != nil { s.lock.RUnlock() s.delmiss() return err @@ -105,23 +104,6 @@ func (s *cacheShard) del(key string, hashedKey uint64) error { s.lock.Lock() { - // After obtaining the writelock, we need to read the same again, - // since the data delivered earlier may be stale now - itemIndex = s.hashmap[hashedKey] - - if itemIndex == 0 { - s.lock.Unlock() - s.delmiss() - return ErrEntryNotFound - } - - wrappedEntry, err := s.entries.Get(int(itemIndex)) - if err != nil { - s.lock.Unlock() - s.delmiss() - return err - } - delete(s.hashmap, hashedKey) s.onRemove(wrappedEntry, Deleted) resetKeyFromEntry(wrappedEntry) @@ -154,8 +136,6 @@ func (s *cacheShard) cleanUp(currentTimestamp uint64) { } func (s *cacheShard) getOldestEntry() ([]byte, error) { - s.lock.RLock() - defer s.lock.RUnlock() return s.entries.Peek() } diff --git a/vendor/github.com/aristanetworks/goarista/check_copyright_notice.sh b/vendor/github.com/aristanetworks/goarista/check_copyright_notice.sh new file mode 100755 index 00000000..7bcc24d5 --- /dev/null +++ b/vendor/github.com/aristanetworks/goarista/check_copyright_notice.sh @@ -0,0 +1,19 @@ +#!/bin/sh +# Copyright (c) 2017 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the COPYING file. + +# egrep that comes with our Linux distro doesn't like \d, so use [0-9] +notice='Copyright \(c\) 20[0-9][0-9] Arista Networks, Inc.' +files=`git diff-tree --no-commit-id --name-only --diff-filter=ACMR -r HEAD | \ + egrep '\.(go|proto|py|sh)$' | grep -v '\.pb\.go$'` +status=0 + +for file in $files; do + if ! egrep -q "$notice" $file; then + echo "$file: missing or incorrect copyright notice" + status=1 + fi +done + +exit $status diff --git a/vendor/github.com/aristanetworks/goarista/monotime/issue15006.s b/vendor/github.com/aristanetworks/goarista/monotime/issue15006.s index 66109f4f..0d11d8d6 100644 --- a/vendor/github.com/aristanetworks/goarista/monotime/issue15006.s +++ b/vendor/github.com/aristanetworks/goarista/monotime/issue15006.s @@ -1,4 +1,4 @@ -// Copyright (C) 2016 Arista Networks, Inc. +// 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. diff --git a/vendor/github.com/aristanetworks/goarista/monotime/nanotime.go b/vendor/github.com/aristanetworks/goarista/monotime/nanotime.go index 5f5fbc7a..d999a42b 100644 --- a/vendor/github.com/aristanetworks/goarista/monotime/nanotime.go +++ b/vendor/github.com/aristanetworks/goarista/monotime/nanotime.go @@ -1,4 +1,4 @@ -// Copyright (C) 2016 Arista Networks, Inc. +// 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. diff --git a/vendor/github.com/btcsuite/btcd/btcec/pubkey.go b/vendor/github.com/btcsuite/btcd/btcec/pubkey.go index b7491771..cf498075 100644 --- a/vendor/github.com/btcsuite/btcd/btcec/pubkey.go +++ b/vendor/github.com/btcsuite/btcd/btcec/pubkey.go @@ -32,8 +32,9 @@ func decompressPoint(curve *KoblitzCurve, x *big.Int, ybit bool) (*big.Int, erro x3 := new(big.Int).Mul(x, x) x3.Mul(x3, x) x3.Add(x3, curve.Params().B) + x3.Mod(x3, curve.Params().P) - // now calculate sqrt mod p of x2 + B + // Now calculate sqrt mod p of x^3 + 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 @@ -42,9 +43,19 @@ func decompressPoint(curve *KoblitzCurve, x *big.Int, ybit bool) (*big.Int, erro if ybit != isOdd(y) { y.Sub(curve.Params().P, y) } + + // Check that y is a square root of x^3 + B. + y2 := new(big.Int).Mul(y, y) + y2.Mod(y2, curve.Params().P) + if y2.Cmp(x3) != 0 { + return nil, fmt.Errorf("invalid square root") + } + + // Verify that y-coord has expected parity. if ybit != isOdd(y) { return nil, fmt.Errorf("ybit doesn't match oddness") } + return y, nil } diff --git a/vendor/github.com/btcsuite/btcd/btcec/signature.go b/vendor/github.com/btcsuite/btcd/btcec/signature.go index 4392ab41..f1c43774 100644 --- a/vendor/github.com/btcsuite/btcd/btcec/signature.go +++ b/vendor/github.com/btcsuite/btcd/btcec/signature.go @@ -85,6 +85,11 @@ func (sig *Signature) IsEqual(otherSig *Signature) bool { sig.S.Cmp(otherSig.S) == 0 } +// MinSigLen is the minimum length of a DER encoded signature and is when both R +// and S are 1 byte each. +// 0x30 + <1-byte> + 0x02 + 0x01 + + 0x2 + 0x01 + +const MinSigLen = 8 + 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. @@ -98,9 +103,7 @@ func parseSig(sigStr []byte, curve elliptic.Curve, der bool) (*Signature, error) signature := &Signature{} - // minimal message is when both numbers are 1 bytes. adding up to: - // 0x30 + len + 0x02 + 0x01 + + 0x2 + 0x01 + - if len(sigStr) < 8 { + if len(sigStr) < MinSigLen { return nil, errors.New("malformed signature: too short") } // 0x30 @@ -112,7 +115,10 @@ func parseSig(sigStr []byte, curve elliptic.Curve, der bool) (*Signature, error) // length of remaining message siglen := sigStr[index] index++ - if int(siglen+2) > len(sigStr) { + + // siglen should be less than the entire message and greater than + // the minimal message size. + if int(siglen+2) > len(sigStr) || int(siglen+2) < MinSigLen { return nil, errors.New("malformed signature: bad length") } // trim the slice we're working on so we only look at what matters. @@ -269,7 +275,7 @@ func hashToInt(hash []byte, c elliptic.Curve) *big.Int { return ret } -// recoverKeyFromSignature recoves a public key from the signature "sig" on the +// recoverKeyFromSignature recovers 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 @@ -421,9 +427,7 @@ func signRFC6979(privateKey *PrivateKey, hash []byte) (*Signature, error) { 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) - } + r.Mod(r, N) if r.Sign() == 0 { return nil, errors.New("calculated R is zero") diff --git a/vendor/github.com/cenkalti/backoff/go.mod b/vendor/github.com/cenkalti/backoff/go.mod new file mode 100644 index 00000000..479e62ad --- /dev/null +++ b/vendor/github.com/cenkalti/backoff/go.mod @@ -0,0 +1,3 @@ +module github.com/cenkalti/backoff/v3 + +go 1.12 diff --git a/vendor/github.com/deckarep/golang-set/threadsafe.go b/vendor/github.com/deckarep/golang-set/threadsafe.go index 002e06af..269b4ab0 100644 --- a/vendor/github.com/deckarep/golang-set/threadsafe.go +++ b/vendor/github.com/deckarep/golang-set/threadsafe.go @@ -226,8 +226,14 @@ func (set *threadSafeSet) String() string { func (set *threadSafeSet) PowerSet() Set { set.RLock() - ret := set.s.PowerSet() + unsafePowerSet := set.s.PowerSet().(*threadUnsafeSet) set.RUnlock() + + ret := &threadSafeSet{s: newThreadUnsafeSet()} + for subset := range unsafePowerSet.Iter() { + unsafeSubset := subset.(*threadUnsafeSet) + ret.Add(&threadSafeSet{s: *unsafeSubset}) + } return ret } diff --git a/vendor/github.com/edsrzf/mmap-go/mmap.go b/vendor/github.com/edsrzf/mmap-go/mmap.go index 7bb4965e..29655bd2 100644 --- a/vendor/github.com/edsrzf/mmap-go/mmap.go +++ b/vendor/github.com/edsrzf/mmap-go/mmap.go @@ -54,6 +54,10 @@ func Map(f *os.File, prot, flags int) (MMap, error) { // 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) { + if offset%int64(os.Getpagesize()) != 0 { + return nil, errors.New("offset parameter must be a multiple of the system's page size") + } + var fd uintptr if flags&ANON == 0 { fd = uintptr(f.Fd()) @@ -77,25 +81,27 @@ func (m *MMap) header() *reflect.SliceHeader { return (*reflect.SliceHeader)(unsafe.Pointer(m)) } +func (m *MMap) addrLen() (uintptr, uintptr) { + header := m.header() + return header.Data, uintptr(header.Len) +} + // 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)) + return m.lock() } // 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)) + return m.unlock() } // 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)) + return m.flush() } // Unmap deletes the memory mapped region, flushes any remaining changes, and sets @@ -105,8 +111,7 @@ func (m MMap) Flush() error { // 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)) + err := m.unmap() *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 index 4af98420..25b13e51 100644 --- a/vendor/github.com/edsrzf/mmap-go/mmap_unix.go +++ b/vendor/github.com/edsrzf/mmap-go/mmap_unix.go @@ -7,61 +7,45 @@ package mmap import ( - "syscall" + "golang.org/x/sys/unix" ) func mmap(len int, inprot, inflags, fd uintptr, off int64) ([]byte, error) { - flags := syscall.MAP_SHARED - prot := syscall.PROT_READ + flags := unix.MAP_SHARED + prot := unix.PROT_READ switch { case inprot© != 0: - prot |= syscall.PROT_WRITE - flags = syscall.MAP_PRIVATE + prot |= unix.PROT_WRITE + flags = unix.MAP_PRIVATE case inprot&RDWR != 0: - prot |= syscall.PROT_WRITE + prot |= unix.PROT_WRITE } if inprot&EXEC != 0 { - prot |= syscall.PROT_EXEC + prot |= unix.PROT_EXEC } if inflags&ANON != 0 { - flags |= syscall.MAP_ANON + flags |= unix.MAP_ANON } - b, err := syscall.Mmap(int(fd), off, len, prot, flags) + b, err := unix.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 (m MMap) flush() error { + return unix.Msync([]byte(m), unix.MS_SYNC) } -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 (m MMap) lock() error { + return unix.Mlock([]byte(m)) } -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 (m MMap) unlock() error { + return unix.Munlock([]byte(m)) } -func unmap(addr, len uintptr) error { - _, _, errno := syscall.Syscall(syscall.SYS_MUNMAP, addr, len, 0) - if errno != 0 { - return syscall.Errno(errno) - } - return nil +func (m MMap) unmap() error { + return unix.Munmap([]byte(m)) } diff --git a/vendor/github.com/edsrzf/mmap-go/mmap_windows.go b/vendor/github.com/edsrzf/mmap-go/mmap_windows.go index c3d2d02d..7910da25 100644 --- a/vendor/github.com/edsrzf/mmap-go/mmap_windows.go +++ b/vendor/github.com/edsrzf/mmap-go/mmap_windows.go @@ -8,7 +8,8 @@ import ( "errors" "os" "sync" - "syscall" + + "golang.org/x/sys/windows" ) // mmap on Windows is a two-step process. @@ -19,23 +20,29 @@ import ( // 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. + +type addrinfo struct { + file windows.Handle + mapview windows.Handle +} + var handleLock sync.Mutex -var handleMap = map[uintptr]syscall.Handle{} +var handleMap = map[uintptr]*addrinfo{} func mmap(len int, prot, flags, hfile uintptr, off int64) ([]byte, error) { - flProtect := uint32(syscall.PAGE_READONLY) - dwDesiredAccess := uint32(syscall.FILE_MAP_READ) + flProtect := uint32(windows.PAGE_READONLY) + dwDesiredAccess := uint32(windows.FILE_MAP_READ) switch { case prot© != 0: - flProtect = syscall.PAGE_WRITECOPY - dwDesiredAccess = syscall.FILE_MAP_COPY + flProtect = windows.PAGE_WRITECOPY + dwDesiredAccess = windows.FILE_MAP_COPY case prot&RDWR != 0: - flProtect = syscall.PAGE_READWRITE - dwDesiredAccess = syscall.FILE_MAP_WRITE + flProtect = windows.PAGE_READWRITE + dwDesiredAccess = windows.FILE_MAP_WRITE } if prot&EXEC != 0 { flProtect <<= 4 - dwDesiredAccess |= syscall.FILE_MAP_EXECUTE + dwDesiredAccess |= windows.FILE_MAP_EXECUTE } // The maximum size is the area of the file, starting from 0, @@ -45,7 +52,7 @@ func mmap(len int, prot, flags, hfile uintptr, off int64) ([]byte, error) { 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) + h, errno := windows.CreateFileMapping(windows.Handle(hfile), nil, flProtect, maxSizeHigh, maxSizeLow, nil) if h == 0 { return nil, os.NewSyscallError("CreateFileMapping", errno) } @@ -54,12 +61,15 @@ func mmap(len int, prot, flags, hfile uintptr, off int64) ([]byte, error) { // is the length the user requested. fileOffsetHigh := uint32(off >> 32) fileOffsetLow := uint32(off & 0xFFFFFFFF) - addr, errno := syscall.MapViewOfFile(h, dwDesiredAccess, fileOffsetHigh, fileOffsetLow, uintptr(len)) + addr, errno := windows.MapViewOfFile(h, dwDesiredAccess, fileOffsetHigh, fileOffsetLow, uintptr(len)) if addr == 0 { return nil, os.NewSyscallError("MapViewOfFile", errno) } handleLock.Lock() - handleMap[addr] = h + handleMap[addr] = &addrinfo{ + file: windows.Handle(hfile), + mapview: h, + } handleLock.Unlock() m := MMap{} @@ -71,8 +81,9 @@ func mmap(len int, prot, flags, hfile uintptr, off int64) ([]byte, error) { return m, nil } -func flush(addr, len uintptr) error { - errno := syscall.FlushViewOfFile(addr, len) +func (m MMap) flush() error { + addr, len := m.addrLen() + errno := windows.FlushViewOfFile(addr, len) if errno != nil { return os.NewSyscallError("FlushViewOfFile", errno) } @@ -85,22 +96,29 @@ func flush(addr, len uintptr) error { return errors.New("unknown base address") } - errno = syscall.FlushFileBuffers(handle) + errno = windows.FlushFileBuffers(handle.file) return os.NewSyscallError("FlushFileBuffers", errno) } -func lock(addr, len uintptr) error { - errno := syscall.VirtualLock(addr, len) +func (m MMap) lock() error { + addr, len := m.addrLen() + errno := windows.VirtualLock(addr, len) return os.NewSyscallError("VirtualLock", errno) } -func unlock(addr, len uintptr) error { - errno := syscall.VirtualUnlock(addr, len) +func (m MMap) unlock() error { + addr, len := m.addrLen() + errno := windows.VirtualUnlock(addr, len) return os.NewSyscallError("VirtualUnlock", errno) } -func unmap(addr, len uintptr) error { - flush(addr, len) +func (m MMap) unmap() error { + err := m.flush() + if err != nil { + return err + } + + addr := m.header().Data // 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 @@ -108,7 +126,7 @@ func unmap(addr, len uintptr) error { // we're trying to remove our old addr/handle pair. handleLock.Lock() defer handleLock.Unlock() - err := syscall.UnmapViewOfFile(addr) + err = windows.UnmapViewOfFile(addr) if err != nil { return err } @@ -120,6 +138,6 @@ func unmap(addr, len uintptr) error { } delete(handleMap, addr) - e := syscall.CloseHandle(syscall.Handle(handle)) + e := windows.CloseHandle(windows.Handle(handle.mapview)) 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 a64b003e..00000000 --- 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 91ee5f40..00000000 --- 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/.appveyor.yml b/vendor/github.com/elastic/gosigar/.appveyor.yml new file mode 100644 index 00000000..ff467086 --- /dev/null +++ b/vendor/github.com/elastic/gosigar/.appveyor.yml @@ -0,0 +1,84 @@ +# Version format +version: "{build}" + +# Operating system (build VM template) +os: Windows Server 2012 R2 + +# Environment variables +environment: + GOPATH: c:\gopath + GVM_GO_VERSION: 1.8.3 + GVM_DL: https://github.com/andrewkroh/gvm/releases/download/v0.0.1/gvm-windows-amd64.exe + +# Custom clone folder (variables are not expanded here). +clone_folder: c:\gopath\src\github.com\elastic\gosigar + +# Cache mingw install until appveyor.yml is modified. +cache: +- C:\ProgramData\chocolatey\bin -> .appveyor.yml +- C:\ProgramData\chocolatey\lib -> .appveyor.yml +- C:\Users\appveyor\.gvm -> .appveyor.yml +- C:\Windows\System32\gvm.exe -> .appveyor.yml +- C:\tools\mingw64 -> .appveyor.yml + +# Scripts that run after cloning repository +install: + - ps: >- + if(!(Test-Path "C:\Windows\System32\gvm.exe")) { + wget "$env:GVM_DL" -Outfile C:\Windows\System32\gvm.exe + } + - ps: gvm --format=powershell "$env:GVM_GO_VERSION" | Invoke-Expression + # AppVeyor installed mingw is 32-bit only so install 64-bit version. + - ps: >- + if(!(Test-Path "C:\tools\mingw64\bin\gcc.exe")) { + cinst mingw > mingw-install.txt + Push-AppveyorArtifact mingw-install.txt + } + - set PATH=C:\tools\mingw64\bin;%GOROOT%\bin;%PATH% + - set PATH=%GOPATH%\bin;%PATH% + - go version + - go env + - python --version + - go get github.com/elastic/beats/vendor/github.com/pierrre/gotestcover + +# To run your custom scripts instead of automatic MSBuild +build_script: + # Compile + - appveyor AddCompilationMessage "Starting Compile" + - cd c:\gopath\src\github.com\elastic\gosigar + - go get -v -t -d ./... + - go build + - go build -o examples/df/df.exe ./examples/df + - go build -o examples/free/free.exe ./examples/free + - go build -o examples/ps/ps.exe ./examples/ps + - go build -o examples/uptime/uptime.exe ./examples/uptime + - appveyor AddCompilationMessage "Compile Success" + +# To run your custom scripts instead of automatic tests +test_script: + # Unit tests + - ps: Add-AppveyorTest "Unit Tests" -Outcome Running + - mkdir build\coverage + - gotestcover -v -coverprofile=build/coverage/unit.cov github.com/elastic/gosigar/... + - ps: Update-AppveyorTest "Unit Tests" -Outcome Passed + - ps: Add-AppveyorTest "Running Examples" -Outcome Running + - .\examples\df\df.exe + - .\examples\free\free.exe + - .\examples\ps\ps.exe + - .\examples\uptime\uptime.exe + - ps: Update-AppveyorTest "Running Examples" -Outcome Passed + +after_test: + - go tool cover -html=build\coverage\unit.cov -o build\coverage\unit.html + - ps: Push-AppveyorArtifact build\coverage\unit.cov + - ps: Push-AppveyorArtifact build\coverage\unit.html + # Upload coverage report. + - "SET PATH=C:\\Python34;C:\\Python34\\Scripts;%PATH%" + - pip install codecov + - codecov -X gcov -f "build\coverage\unit.cov" + +# To disable deployment +deploy: off + +# Notifications should only be setup using the AppVeyor UI so that +# forks can be created without inheriting the settings. diff --git a/vendor/github.com/elastic/gosigar/.gitignore b/vendor/github.com/elastic/gosigar/.gitignore new file mode 100644 index 00000000..6f145056 --- /dev/null +++ b/vendor/github.com/elastic/gosigar/.gitignore @@ -0,0 +1,41 @@ +# Directories +/.vagrant +/.idea +/build + +# Files +.DS_Store +/*.iml +*.h + +# Editor swap files +*.swp +*.swo +*.swn + +# Compiled Object files, Static and Dynamic libs (Shared Objects) +*.o +*.a +*.so +*.exe +*.test +*.prof +*.pyc +*.swp + +# Example binaries +examples/df/df +examples/df/df.exe +examples/free/free +examples/free/free.exe +examples/ps/ps +examples/ps/ps.exe +examples/ss/ss +examples/ss/ss.exe +examples/uptime/uptime +examples/uptime/uptime.exe + +# Test Data +cgroup/testdata/* +!cgroup/testdata/*.zip + diff --git a/vendor/github.com/elastic/gosigar/.travis.yml b/vendor/github.com/elastic/gosigar/.travis.yml new file mode 100644 index 00000000..fe804624 --- /dev/null +++ b/vendor/github.com/elastic/gosigar/.travis.yml @@ -0,0 +1,37 @@ +language: go + +os: + - linux + - osx + +go: + - 1.8.x + - 1.10.x + +env: + global: + - PROJ="github.com/elastic/gosigar" + +sudo: false + +before_install: + # Put project into proper GOPATH location (important for forks). + - mkdir -p $HOME/gopath/src/${PROJ} + - rsync -az ${TRAVIS_BUILD_DIR}/ $HOME/gopath/src/${PROJ}/ + - export TRAVIS_BUILD_DIR=$HOME/gopath/src/${PROJ} + - cd $HOME/gopath/src/${PROJ} + +install: + - go get -v -t -d ./... + - go get github.com/elastic/beats/vendor/github.com/pierrre/gotestcover + +script: + - gofmt -l . | read && echo "Code differs from gofmt's style. Run 'gofmt -w .'" 1>&2 && exit 1 || true + - go vet + - go build + - mkdir -p build/coverage + - gotestcover -v -coverprofile=build/coverage/unit.cov github.com/elastic/gosigar/... + - for i in $(ls examples); do go build -o examples/$i/$i ./examples/$i; ./examples/$i/$i; done + +after_success: + - bash <(curl -s https://codecov.io/bash) -f build/coverage/unit.cov diff --git a/vendor/github.com/elastic/gosigar/CHANGELOG.md b/vendor/github.com/elastic/gosigar/CHANGELOG.md new file mode 100644 index 00000000..0ce0fad6 --- /dev/null +++ b/vendor/github.com/elastic/gosigar/CHANGELOG.md @@ -0,0 +1,135 @@ +# 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 + +### Changed + +### Deprecated + +## [0.10.3] + +### Fixed +- ProcState.Get() doesn't fail under Windows when it cannot obtain process ownership information. #121 + +## [0.10.2] + +### Fixed +- Fix memory leak when getting process arguments. #119 + +## [0.10.1] + +### Fixed +- Replaced the WMI queries with win32 apis due to high CPU usage. #116 + +## [0.10.0] + +### Added +- List filesystems on Windows that have an access path but not an assigned letter. #112 + +### Fixed +- Added missing runtime import for FreeBSD. #104 +- Handle nil command line in Windows processes. #110 + +## [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 new file mode 100644 index 00000000..11069edd --- /dev/null +++ b/vendor/github.com/elastic/gosigar/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/vendor/github.com/elastic/gosigar/NOTICE b/vendor/github.com/elastic/gosigar/NOTICE new file mode 100644 index 00000000..fda553b5 --- /dev/null +++ b/vendor/github.com/elastic/gosigar/NOTICE @@ -0,0 +1,9 @@ +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 new file mode 100644 index 00000000..ecdfc1c3 --- /dev/null +++ b/vendor/github.com/elastic/gosigar/README.md @@ -0,0 +1,58 @@ +# 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 new file mode 100644 index 00000000..6fd990c1 --- /dev/null +++ b/vendor/github.com/elastic/gosigar/Vagrantfile @@ -0,0 +1,25 @@ +# 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 new file mode 100644 index 00000000..76ade0fd --- /dev/null +++ b/vendor/github.com/elastic/gosigar/codecov.yml @@ -0,0 +1,21 @@ +# 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 new file mode 100644 index 00000000..e3ee80a9 --- /dev/null +++ b/vendor/github.com/elastic/gosigar/concrete_sigar.go @@ -0,0 +1,89 @@ +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 new file mode 100644 index 00000000..a90b998c --- /dev/null +++ b/vendor/github.com/elastic/gosigar/sigar_darwin.go @@ -0,0 +1,498 @@ +// 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 new file mode 100644 index 00000000..ac56c987 --- /dev/null +++ b/vendor/github.com/elastic/gosigar/sigar_format.go @@ -0,0 +1,126 @@ +// 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 new file mode 100644 index 00000000..51dd84aa --- /dev/null +++ b/vendor/github.com/elastic/gosigar/sigar_freebsd.go @@ -0,0 +1,158 @@ +// 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 +} + +func (self *Mem) Get() error { + val := C.uint32_t(0) + sc := C.size_t(4) + + name := C.CString("vm.stats.vm.v_page_count") + _, err := C.sysctlbyname(name, unsafe.Pointer(&val), &sc, nil, 0) + C.free(unsafe.Pointer(name)) + if err != nil { + return err + } + pagecount := uint64(val) + + name = C.CString("vm.stats.vm.v_page_size") + _, err = C.sysctlbyname(name, unsafe.Pointer(&val), &sc, nil, 0) + C.free(unsafe.Pointer(name)) + if err != nil { + return err + } + pagesize := uint64(val) + + name = C.CString("vm.stats.vm.v_free_count") + _, err = C.sysctlbyname(name, unsafe.Pointer(&val), &sc, nil, 0) + C.free(unsafe.Pointer(name)) + if err != nil { + return err + } + self.Free = uint64(val) * pagesize + + name = C.CString("vm.stats.vm.v_inactive_count") + _, err = C.sysctlbyname(name, unsafe.Pointer(&val), &sc, nil, 0) + C.free(unsafe.Pointer(name)) + if err != nil { + return err + } + kern := uint64(val) + + self.Total = uint64(pagecount * pagesize) + + self.Used = self.Total - self.Free + self.ActualFree = self.Free + (kern * pagesize) + self.ActualUsed = self.Used - (kern * pagesize) + + return nil +} diff --git a/vendor/github.com/elastic/gosigar/sigar_interface.go b/vendor/github.com/elastic/gosigar/sigar_interface.go new file mode 100644 index 00000000..df79ae08 --- /dev/null +++ b/vendor/github.com/elastic/gosigar/sigar_interface.go @@ -0,0 +1,207 @@ +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 new file mode 100644 index 00000000..e04e8a97 --- /dev/null +++ b/vendor/github.com/elastic/gosigar/sigar_linux.go @@ -0,0 +1,133 @@ +// 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 +} + +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 +} diff --git a/vendor/github.com/elastic/gosigar/sigar_linux_common.go b/vendor/github.com/elastic/gosigar/sigar_linux_common.go new file mode 100644 index 00000000..e2c5e246 --- /dev/null +++ b/vendor/github.com/elastic/gosigar/sigar_linux_common.go @@ -0,0 +1,457 @@ +// 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 *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 new file mode 100644 index 00000000..e4371b8b --- /dev/null +++ b/vendor/github.com/elastic/gosigar/sigar_openbsd.go @@ -0,0 +1,426 @@ +// 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 new file mode 100644 index 00000000..de9565ae --- /dev/null +++ b/vendor/github.com/elastic/gosigar/sigar_stub.go @@ -0,0 +1,75 @@ +// +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 new file mode 100644 index 00000000..3f3a9f7f --- /dev/null +++ b/vendor/github.com/elastic/gosigar/sigar_unix.go @@ -0,0 +1,69 @@ +// 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 new file mode 100644 index 00000000..bf93b02b --- /dev/null +++ b/vendor/github.com/elastic/gosigar/sigar_util.go @@ -0,0 +1,22 @@ +// 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 new file mode 100644 index 00000000..fc868daf --- /dev/null +++ b/vendor/github.com/elastic/gosigar/sigar_windows.go @@ -0,0 +1,409 @@ +// Copyright (c) 2012 VMware, Inc. + +package gosigar + +import ( + "fmt" + "os" + "path/filepath" + "runtime" + "strings" + "sync" + "syscall" + "time" + + "github.com/elastic/gosigar/sys/windows" + "github.com/pkg/errors" +) + +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 { + uptime, err := windows.GetTickCount64() + if err != nil { + return errors.Wrap(err, "failed to get boot time using win32 api") + } + var boot = time.Unix(int64(uptime), 0) + bootTime = &boot + } + + 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.GetAccessPaths() + if err != nil { + return errors.Wrap(err, "GetAccessPaths 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")) + } + + // getProcCredName will often fail when run as a non-admin user. This is + // caused by strict ACL of the process token belonging to other users. + // Instead of failing completely, ignore this error and still return most + // data with an empty Username. + self.Username, _ = getProcCredName(pid) + + 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", pid) + } + + 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) + } + // Close token to prevent handle leaks. + defer token.Close() + + // Find the token user. + tokenUser, err := token.GetTokenUser() + if err != nil { + return "", errors.Wrapf(err, "GetTokenInformation failed 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} + } + 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) + pbi, err := windows.NtQueryProcessBasicInformation(handle) + if err != nil { + return errors.Wrapf(err, "NtQueryProcessBasicInformation failed for pid=%v", pid) + } + if err != nil { + return nil + } + userProcParams, err := windows.GetUserProcessParams(handle, pbi) + if err != nil { + return nil + } + if argsW, err := windows.ReadProcessUnicodeString(handle, &userProcParams.CommandLine); err == nil { + self.List, err = windows.ByteSliceToStringSlice(argsW) + if err != nil { + return err + } + } + 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 +} + +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 new file mode 100644 index 00000000..dda57aa8 --- /dev/null +++ b/vendor/github.com/elastic/gosigar/sys/windows/doc.go @@ -0,0 +1,2 @@ +// 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 new file mode 100644 index 00000000..85de365e --- /dev/null +++ b/vendor/github.com/elastic/gosigar/sys/windows/ntquery.go @@ -0,0 +1,132 @@ +// +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 new file mode 100644 index 00000000..28c78fd2 --- /dev/null +++ b/vendor/github.com/elastic/gosigar/sys/windows/privileges.go @@ -0,0 +1,272 @@ +// +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 new file mode 100644 index 00000000..7da8a071 --- /dev/null +++ b/vendor/github.com/elastic/gosigar/sys/windows/syscall_windows.go @@ -0,0 +1,588 @@ +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 +) + +// SizeOfRtlUserProcessParameters gives the size +// of the RtlUserProcessParameters struct. +const SizeOfRtlUserProcessParameters = unsafe.Sizeof(RtlUserProcessParameters{}) + +// 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 +) + +// UnicodeString is Go's equivalent for the _UNICODE_STRING struct. +type UnicodeString struct { + Size uint16 + MaximumLength uint16 + Buffer uintptr +} + +// RtlUserProcessParameters is Go's equivalent for the +// _RTL_USER_PROCESS_PARAMETERS struct. +// A few undocumented fields are exposed. +type RtlUserProcessParameters struct { + Reserved1 [16]byte + Reserved2 [5]uintptr + CurrentDirectoryPath UnicodeString + CurrentDirectoryHandle uintptr + DllPath UnicodeString + ImagePathName UnicodeString + CommandLine UnicodeString +} + +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") + } + + return UTF16SliceToStringSlice(buffer), nil +} + +// GetAccessPaths returns the list of access paths for volumes in the system. +func GetAccessPaths() ([]string, error) { + volumes, err := GetVolumes() + if err != nil { + return nil, errors.Wrap(err, "GetVolumes failed") + } + + var paths []string + for _, volumeName := range volumes { + volumePaths, err := GetVolumePathsForVolume(volumeName) + if err != nil { + return nil, errors.Wrapf(err, "failed to get list of access paths for volume '%s'", volumeName) + } + if len(volumePaths) == 0 { + continue + } + + // Get only the first path + paths = append(paths, volumePaths[0]) + } + + return paths, nil +} + +// GetVolumes returs the list of volumes in the system. +// https://docs.microsoft.com/es-es/windows/desktop/api/fileapi/nf-fileapi-findfirstvolumew +func GetVolumes() ([]string, error) { + buffer := make([]uint16, MAX_PATH+1) + + var volumes []string + + h, err := _FindFirstVolume(&buffer[0], uint32(len(buffer))) + if err != nil { + return nil, errors.Wrap(err, "FindFirstVolumeW failed") + } + defer _FindVolumeClose(h) + + for { + volumes = append(volumes, syscall.UTF16ToString(buffer)) + + err = _FindNextVolume(h, &buffer[0], uint32(len(buffer))) + if err != nil { + if errors.Cause(err) == syscall.ERROR_NO_MORE_FILES { + break + } + return nil, errors.Wrap(err, "FindNextVolumeW failed") + } + } + + return volumes, nil +} + +// GetVolumePathsForVolume returns the list of volume paths for a volume. +// https://docs.microsoft.com/en-us/windows/desktop/api/FileAPI/nf-fileapi-getvolumepathnamesforvolumenamew +func GetVolumePathsForVolume(volumeName string) ([]string, error) { + var length uint32 + err := _GetVolumePathNamesForVolumeName(volumeName, nil, 0, &length) + if errors.Cause(err) != syscall.ERROR_MORE_DATA { + return nil, errors.Wrap(err, "GetVolumePathNamesForVolumeNameW failed to get needed buffer length") + } + if length == 0 { + // Not mounted, no paths, that's ok + return nil, nil + } + + buffer := make([]uint16, length*(MAX_PATH+1)) + err = _GetVolumePathNamesForVolumeName(volumeName, &buffer[0], length, &length) + if err != nil { + return nil, errors.Wrap(err, "GetVolumePathNamesForVolumeNameW failed") + } + + return UTF16SliceToStringSlice(buffer), 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 +} + +// UTF16SliceToStringSlice converts slice of uint16 containing a list of UTF16 +// strings to a slice of strings. +func UTF16SliceToStringSlice(buffer []uint16) []string { + // Split the uint16 slice at null-terminators. + var startIdx int + var stringsUTF16 [][]uint16 + for i, value := range buffer { + if value == 0 { + stringsUTF16 = append(stringsUTF16, buffer[startIdx:i]) + startIdx = i + 1 + } + } + + // Convert the utf16 slices to strings. + result := make([]string, 0, len(stringsUTF16)) + for _, stringUTF16 := range stringsUTF16 { + if len(stringUTF16) > 0 { + result = append(result, syscall.UTF16ToString(stringUTF16)) + } + } + + return result +} + +func GetUserProcessParams(handle syscall.Handle, pbi ProcessBasicInformation) (params RtlUserProcessParameters, err error) { + const is32bitProc = unsafe.Sizeof(uintptr(0)) == 4 + + // Offset of params field within PEB structure. + // This structure is different in 32 and 64 bit. + paramsOffset := 0x20 + if is32bitProc { + paramsOffset = 0x10 + } + + // Read the PEB from the target process memory + pebSize := paramsOffset + 8 + peb := make([]byte, pebSize) + nRead, err := ReadProcessMemory(handle, pbi.PebBaseAddress, peb) + if err != nil { + return params, err + } + if nRead != uintptr(pebSize) { + return params, errors.Errorf("PEB: short read (%d/%d)", nRead, pebSize) + } + + // Get the RTL_USER_PROCESS_PARAMETERS struct pointer from the PEB + paramsAddr := *(*uintptr)(unsafe.Pointer(&peb[paramsOffset])) + + // Read the RTL_USER_PROCESS_PARAMETERS from the target process memory + paramsBuf := make([]byte, SizeOfRtlUserProcessParameters) + nRead, err = ReadProcessMemory(handle, paramsAddr, paramsBuf) + if err != nil { + return params, err + } + if nRead != uintptr(SizeOfRtlUserProcessParameters) { + return params, errors.Errorf("RTL_USER_PROCESS_PARAMETERS: short read (%d/%d)", nRead, SizeOfRtlUserProcessParameters) + } + + params = *(*RtlUserProcessParameters)(unsafe.Pointer(¶msBuf[0])) + return params, nil +} + +func ReadProcessUnicodeString(handle syscall.Handle, s *UnicodeString) ([]byte, error) { + buf := make([]byte, s.Size) + nRead, err := ReadProcessMemory(handle, s.Buffer, buf) + if err != nil { + return nil, err + } + if nRead != uintptr(s.Size) { + return nil, errors.Errorf("unicode string: short read: (%d/%d)", nRead, s.Size) + } + return buf, nil +} + +// Use Windows' CommandLineToArgv API to split an UTF-16 command line string +// into a list of parameters. +func ByteSliceToStringSlice(utf16 []byte) ([]string, error) { + if len(utf16) == 0 { + return nil, nil + } + var numArgs int32 + argsWide, err := syscall.CommandLineToArgv((*uint16)(unsafe.Pointer(&utf16[0])), &numArgs) + if err != nil { + return nil, err + } + + // Free memory allocated for CommandLineToArgvW arguments. + defer syscall.LocalFree((syscall.Handle)(unsafe.Pointer(argsWide))) + + args := make([]string, numArgs) + for idx := range args { + args[idx] = syscall.UTF16ToString(argsWide[idx][:]) + } + return args, nil +} + +// ReadProcessMemory reads from another process memory. The Handle needs to have +// the PROCESS_VM_READ right. +// A zero-byte read is a no-op, no error is returned. +func ReadProcessMemory(handle syscall.Handle, baseAddress uintptr, dest []byte) (numRead uintptr, err error) { + n := len(dest) + if n == 0 { + return 0, nil + } + if err = _ReadProcessMemory(handle, baseAddress, uintptr(unsafe.Pointer(&dest[0])), uintptr(n), &numRead); err != nil { + return 0, err + } + return numRead, nil +} + +func GetTickCount64() (uptime uint64, err error) { + if uptime, err = _GetTickCount64(); err != nil { + return 0, err + } + return uptime, 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 -systemdll=false -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 +//sys _FindFirstVolume(volumeName *uint16, size uint32) (handle syscall.Handle, err error) = kernel32.FindFirstVolumeW +//sys _FindNextVolume(handle syscall.Handle, volumeName *uint16, size uint32) (err error) = kernel32.FindNextVolumeW +//sys _FindVolumeClose(handle syscall.Handle) (err error) = kernel32.FindVolumeClose +//sys _GetVolumePathNamesForVolumeName(volumeName string, buffer *uint16, bufferSize uint32, length *uint32) (err error) = kernel32.GetVolumePathNamesForVolumeNameW +//sys _ReadProcessMemory(handle syscall.Handle, baseAddress uintptr, buffer uintptr, size uintptr, numRead *uintptr) (err error) = kernel32.ReadProcessMemory +//sys _GetTickCount64() (uptime uint64, err error) = kernel32.GetTickCount64 diff --git a/vendor/github.com/elastic/gosigar/sys/windows/version.go b/vendor/github.com/elastic/gosigar/sys/windows/version.go new file mode 100644 index 00000000..d0bca89c --- /dev/null +++ b/vendor/github.com/elastic/gosigar/sys/windows/version.go @@ -0,0 +1,43 @@ +// +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 new file mode 100644 index 00000000..cd5d9ca3 --- /dev/null +++ b/vendor/github.com/elastic/gosigar/sys/windows/zsyscall_windows.go @@ -0,0 +1,376 @@ +// Code generated by 'go generate'; DO NOT EDIT. + +package windows + +import ( + "syscall" + "unsafe" +) + +var _ unsafe.Pointer + +// Do the interface allocations only once for common +// Errno values. +const ( + errnoERROR_IO_PENDING = 997 +) + +var ( + errERROR_IO_PENDING error = syscall.Errno(errnoERROR_IO_PENDING) +) + +// errnoErr returns common boxed Errno values, to prevent +// allocations at runtime. +func errnoErr(e syscall.Errno) error { + switch e { + case 0: + return nil + case errnoERROR_IO_PENDING: + return errERROR_IO_PENDING + } + // TODO: add more here, after collecting data on the common + // error values see on Windows. (perhaps when running + // all.bat?) + return e +} + +var ( + 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") + procFindFirstVolumeW = modkernel32.NewProc("FindFirstVolumeW") + procFindNextVolumeW = modkernel32.NewProc("FindNextVolumeW") + procFindVolumeClose = modkernel32.NewProc("FindVolumeClose") + procGetVolumePathNamesForVolumeNameW = modkernel32.NewProc("GetVolumePathNamesForVolumeNameW") + procReadProcessMemory = modkernel32.NewProc("ReadProcessMemory") + procGetTickCount64 = modkernel32.NewProc("GetTickCount64") +) + +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 = errnoErr(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 = errnoErr(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 = errnoErr(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 = errnoErr(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 = errnoErr(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 = errnoErr(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 = errnoErr(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 = errnoErr(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 = errnoErr(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 = errnoErr(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 = errnoErr(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 = errnoErr(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 = errnoErr(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 = errnoErr(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 = errnoErr(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 = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func _FindFirstVolume(volumeName *uint16, size uint32) (handle syscall.Handle, err error) { + r0, _, e1 := syscall.Syscall(procFindFirstVolumeW.Addr(), 2, uintptr(unsafe.Pointer(volumeName)), uintptr(size), 0) + handle = syscall.Handle(r0) + if handle == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func _FindNextVolume(handle syscall.Handle, volumeName *uint16, size uint32) (err error) { + r1, _, e1 := syscall.Syscall(procFindNextVolumeW.Addr(), 3, uintptr(handle), uintptr(unsafe.Pointer(volumeName)), uintptr(size)) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func _FindVolumeClose(handle syscall.Handle) (err error) { + r1, _, e1 := syscall.Syscall(procFindVolumeClose.Addr(), 1, uintptr(handle), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func _GetVolumePathNamesForVolumeName(volumeName string, buffer *uint16, bufferSize uint32, length *uint32) (err error) { + var _p0 *uint16 + _p0, err = syscall.UTF16PtrFromString(volumeName) + if err != nil { + return + } + return __GetVolumePathNamesForVolumeName(_p0, buffer, bufferSize, length) +} + +func __GetVolumePathNamesForVolumeName(volumeName *uint16, buffer *uint16, bufferSize uint32, length *uint32) (err error) { + r1, _, e1 := syscall.Syscall6(procGetVolumePathNamesForVolumeNameW.Addr(), 4, uintptr(unsafe.Pointer(volumeName)), uintptr(unsafe.Pointer(buffer)), uintptr(bufferSize), uintptr(unsafe.Pointer(length)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func _ReadProcessMemory(handle syscall.Handle, baseAddress uintptr, buffer uintptr, size uintptr, numRead *uintptr) (err error) { + r1, _, e1 := syscall.Syscall6(procReadProcessMemory.Addr(), 5, uintptr(handle), uintptr(baseAddress), uintptr(buffer), uintptr(size), uintptr(unsafe.Pointer(numRead)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func _GetTickCount64() (uptime uint64, err error) { + r0, _, e1 := syscall.Syscall(procGetTickCount64.Addr(), 0, 0, 0, 0) + uptime = uint64(r0) + if uptime == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} diff --git a/vendor/github.com/ethereum/go-ethereum/.dockerignore b/vendor/github.com/ethereum/go-ethereum/.dockerignore index d280741c..0c013d18 100644 --- a/vendor/github.com/ethereum/go-ethereum/.dockerignore +++ b/vendor/github.com/ethereum/go-ethereum/.dockerignore @@ -1,7 +1,3 @@ -**/.git -.git -!.git/HEAD -!.git/refs/heads **/*_test.go build/_workspace diff --git a/vendor/github.com/ethereum/go-ethereum/.github/CODEOWNERS b/vendor/github.com/ethereum/go-ethereum/.github/CODEOWNERS index ed59c98c..6286617d 100644 --- a/vendor/github.com/ethereum/go-ethereum/.github/CODEOWNERS +++ b/vendor/github.com/ethereum/go-ethereum/.github/CODEOWNERS @@ -4,15 +4,20 @@ accounts/usbwallet @karalabe accounts/scwallet @gballet accounts/abi @gballet +cmd/clef @holiman +cmd/puppeth @karalabe consensus @karalabe -core/ @karalabe @holiman -eth/ @karalabe +core/ @karalabe @holiman @rjl493456442 +dashboard/ @kurkomisi +eth/ @karalabe @holiman @rjl493456442 graphql/ @gballet -les/ @zsfelfoldi -light/ @zsfelfoldi -mobile/ @karalabe +les/ @zsfelfoldi @rjl493456442 +light/ @zsfelfoldi @rjl493456442 +mobile/ @karalabe @ligi p2p/ @fjl @zsfelfoldi +rpc/ @fjl @holiman p2p/simulations @zelig @nonsense @janos @justelad p2p/protocols @zelig @nonsense @janos @justelad p2p/testing @zelig @nonsense @janos @justelad +signer/ @holiman whisper/ @gballet @gluk256 diff --git a/vendor/github.com/ethereum/go-ethereum/.travis.yml b/vendor/github.com/ethereum/go-ethereum/.travis.yml index c0faa62a..36defe30 100644 --- a/vendor/github.com/ethereum/go-ethereum/.travis.yml +++ b/vendor/github.com/ethereum/go-ethereum/.travis.yml @@ -5,35 +5,23 @@ matrix: include: - os: linux dist: xenial - sudo: required go: 1.10.x script: - - sudo modprobe fuse - - sudo chmod 666 /dev/fuse - - sudo chown root:$USER /etc/fuse.conf - go run build/ci.go install - go run build/ci.go test -coverage $TEST_PACKAGES - os: linux dist: xenial - sudo: required go: 1.11.x script: - - sudo modprobe fuse - - sudo chmod 666 /dev/fuse - - sudo chown root:$USER /etc/fuse.conf - go run build/ci.go install - go run build/ci.go test -coverage $TEST_PACKAGES # These are the latest Go versions. - os: linux dist: xenial - sudo: required go: 1.12.x script: - - sudo modprobe fuse - - sudo chmod 666 /dev/fuse - - sudo chown root:$USER /etc/fuse.conf - go run build/ci.go install - go run build/ci.go test -coverage $TEST_PACKAGES @@ -64,7 +52,7 @@ matrix: - go run build/ci.go lint # This builder does the Ubuntu PPA upload - - if: repo = ethereum/go-ethereum AND type = push + - if: type = push os: linux dist: xenial go: 1.12.x @@ -86,7 +74,7 @@ matrix: - go run build/ci.go debsrc -upload ethereum/ethereum -sftp-user geth-ci -signer "Go Ethereum Linux Builder " # This builder does the Linux Azure uploads - - if: repo = ethereum/go-ethereum AND type = push + - if: type = push os: linux dist: xenial sudo: required @@ -120,7 +108,7 @@ 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: repo = ethereum/go-ethereum AND type = push + - if: type = push os: linux dist: xenial services: @@ -148,7 +136,7 @@ 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: repo = ethereum/go-ethereum AND type = push + - if: type = push os: linux dist: xenial addons: @@ -185,7 +173,7 @@ matrix: - 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: repo = ethereum/go-ethereum AND type = push + - if: type = push os: osx go: 1.12.x env: @@ -214,7 +202,7 @@ 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: repo = ethereum/go-ethereum AND type = cron + - if: type = cron os: linux dist: xenial go: 1.12.x @@ -224,12 +212,3 @@ matrix: submodules: false # avoid cloning ethereum/tests script: - go run build/ci.go purge -store gethstore/builds -days 14 - - - name: Race Detector for Swarm - if: repo = ethersphere/go-ethereum - os: linux - dist: xenial - go: 1.12.x - git: - submodules: false # avoid cloning ethereum/tests - script: ./build/travis_keepalive.sh go test -timeout 20m -race ./swarm... ./p2p/{protocols,simulations,testing}/... diff --git a/vendor/github.com/ethereum/go-ethereum/Dockerfile b/vendor/github.com/ethereum/go-ethereum/Dockerfile index 4b205d64..c766576a 100644 --- a/vendor/github.com/ethereum/go-ethereum/Dockerfile +++ b/vendor/github.com/ethereum/go-ethereum/Dockerfile @@ -1,7 +1,7 @@ # Build Geth in a stock Go builder container FROM golang:1.12-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 diff --git a/vendor/github.com/ethereum/go-ethereum/Dockerfile.alltools b/vendor/github.com/ethereum/go-ethereum/Dockerfile.alltools index 4a4a26f8..a4adba9d 100644 --- a/vendor/github.com/ethereum/go-ethereum/Dockerfile.alltools +++ b/vendor/github.com/ethereum/go-ethereum/Dockerfile.alltools @@ -1,7 +1,7 @@ # Build Geth in a stock Go builder container FROM golang:1.12-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 diff --git a/vendor/github.com/ethereum/go-ethereum/Makefile b/vendor/github.com/ethereum/go-ethereum/Makefile index 966bf9cb..4bf52f5c 100644 --- a/vendor/github.com/ethereum/go-ethereum/Makefile +++ b/vendor/github.com/ethereum/go-ethereum/Makefile @@ -2,7 +2,7 @@ # 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 @@ -16,11 +16,6 @@ geth: @echo "Done building." @echo "Run \"$(GOBIN)/geth\" to launch geth." -swarm: - build/env.sh go run build/ci.go install ./cmd/swarm - @echo "Done building." - @echo "Run \"$(GOBIN)/swarm\" to launch swarm." - all: build/env.sh go run build/ci.go install @@ -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 diff --git a/vendor/github.com/ethereum/go-ethereum/README.md b/vendor/github.com/ethereum/go-ethereum/README.md index ea8b0a49..5ae8e7a6 100644 --- a/vendor/github.com/ethereum/go-ethereum/README.md +++ b/vendor/github.com/ethereum/go-ethereum/README.md @@ -32,16 +32,15 @@ or, to build the full suite of utilities: The go-ethereum project comes with several wrappers/executables found in the `cmd` directory. -| 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`). | -| `swarm` | Swarm daemon and tools. This is the entry point for the Swarm network. `swarm --help` for command line options and subcommands. See [Swarm README](https://github.com/ethereum/go-ethereum/tree/master/swarm) for more information. | -| `puppeth` | a CLI wizard that aids in creating a new Ethereum 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 geth @@ -95,7 +94,7 @@ Specifying the `--testnet` flag, however, will reconfigure your Geth instance a `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 diff --git a/vendor/github.com/ethereum/go-ethereum/SECURITY.md b/vendor/github.com/ethereum/go-ethereum/SECURITY.md new file mode 100644 index 00000000..bc54ede4 --- /dev/null +++ b/vendor/github.com/ethereum/go-ethereum/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 + +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 +=r6KK +-----END PGP PUBLIC KEY BLOCK----- +``` diff --git a/vendor/github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go b/vendor/github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go index e6bb0c3b..5d5ad003 100644 --- a/vendor/github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go +++ b/vendor/github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go @@ -22,6 +22,7 @@ import ( "io" "io/ioutil" + "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/types" @@ -42,6 +43,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 { diff --git a/vendor/github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go b/vendor/github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go index 7371dfb1..ac4602fe 100644 --- a/vendor/github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go +++ b/vendor/github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go @@ -160,7 +160,7 @@ 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 } @@ -464,7 +464,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) { @@ -472,7 +472,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/vendor/github.com/ethereum/go-ethereum/accounts/abi/method.go b/vendor/github.com/ethereum/go-ethereum/accounts/abi/method.go index 2d8d3d65..d3c02599 100644 --- a/vendor/github.com/ethereum/go-ethereum/accounts/abi/method.go +++ b/vendor/github.com/ethereum/go-ethereum/accounts/abi/method.go @@ -27,9 +27,9 @@ import ( // 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 diff --git a/vendor/github.com/ethereum/go-ethereum/accounts/accounts.go b/vendor/github.com/ethereum/go-ethereum/accounts/accounts.go index a52aa425..bf5190ad 100644 --- a/vendor/github.com/ethereum/go-ethereum/accounts/accounts.go +++ b/vendor/github.com/ethereum/go-ethereum/accounts/accounts.go @@ -36,7 +36,7 @@ type Account struct { } const ( - MimetypeTextWithValidator = "text/validator" + MimetypeDataWithValidator = "data/validator" MimetypeTypedData = "data/typed" MimetypeClique = "application/x-clique-header" MimetypeTextPlain = "text/plain" @@ -92,9 +92,13 @@ 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) // 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, diff --git a/vendor/github.com/ethereum/go-ethereum/accounts/external/backend.go b/vendor/github.com/ethereum/go-ethereum/accounts/external/backend.go index 21a313b6..23037f52 100644 --- a/vendor/github.com/ethereum/go-ethereum/accounts/external/backend.go +++ b/vendor/github.com/ethereum/go-ethereum/accounts/external/backend.go @@ -143,7 +143,7 @@ func (api *ExternalSigner) Derive(path accounts.DerivationPath, pin bool) (accou return accounts.Account{}, fmt.Errorf("operation not supported on external signers") } -func (api *ExternalSigner) SelfDerive(base accounts.DerivationPath, chain ethereum.ChainStateReader) { +func (api *ExternalSigner) SelfDerive(bases []accounts.DerivationPath, chain ethereum.ChainStateReader) { log.Error("operation SelfDerive not supported on external signers") } diff --git a/vendor/github.com/ethereum/go-ethereum/accounts/hd.go b/vendor/github.com/ethereum/go-ethereum/accounts/hd.go index 24aa777a..75c47611 100644 --- a/vendor/github.com/ethereum/go-ethereum/accounts/hd.go +++ b/vendor/github.com/ethereum/go-ethereum/accounts/hd.go @@ -35,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. diff --git a/vendor/github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go b/vendor/github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go index a0b6cf53..1ced41e9 100644 --- a/vendor/github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go +++ b/vendor/github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go @@ -38,6 +38,7 @@ import ( "os" "path/filepath" + "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" @@ -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 { diff --git a/vendor/github.com/ethereum/go-ethereum/accounts/keystore/wallet.go b/vendor/github.com/ethereum/go-ethereum/accounts/keystore/wallet.go index 1b36b6df..498067d4 100644 --- a/vendor/github.com/ethereum/go-ethereum/accounts/keystore/wallet.go +++ b/vendor/github.com/ethereum/go-ethereum/accounts/keystore/wallet.go @@ -77,7 +77,8 @@ 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 attempts to sign the given hash with // the given account. If the wallet does not wrap this particular account, an diff --git a/vendor/github.com/ethereum/go-ethereum/accounts/keystore/watch.go b/vendor/github.com/ethereum/go-ethereum/accounts/keystore/watch.go index bbcfb992..d6ef5332 100644 --- a/vendor/github.com/ethereum/go-ethereum/accounts/keystore/watch.go +++ b/vendor/github.com/ethereum/go-ethereum/accounts/keystore/watch.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 darwin,!ios freebsd linux,!arm64 netbsd solaris +// +build darwin,!ios,cgo freebsd linux,!arm64 netbsd solaris package keystore diff --git a/vendor/github.com/ethereum/go-ethereum/accounts/keystore/watch_fallback.go b/vendor/github.com/ethereum/go-ethereum/accounts/keystore/watch_fallback.go index 7c5e9cb2..de0e87f8 100644 --- a/vendor/github.com/ethereum/go-ethereum/accounts/keystore/watch_fallback.go +++ b/vendor/github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/accounts/scwallet/README.md b/vendor/github.com/ethereum/go-ethereum/accounts/scwallet/README.md index 20519e09..cfca916b 100644 --- a/vendor/github.com/ethereum/go-ethereum/accounts/scwallet/README.md +++ b/vendor/github.com/ethereum/go-ethereum/accounts/scwallet/README.md @@ -25,13 +25,13 @@ Start `geth` with the `console` command. You will notice the following warning: ``` - WARN [04-09|16:58:38.898] Failed to open wallet url=pcsc://044def09 err="smartcard: pairing password needed" + WARN [04-09|16:58:38.898] Failed to open wallet url=keycard://044def09 err="smartcard: pairing password needed" ``` - Write down the URL (`pcsc://044def09` in this example). Then ask `geth` to open the wallet: + Write down the URL (`keycard://044def09` in this example). Then ask `geth` to open the wallet: ``` - > personal.openWallet("pcsc://044def09") + > personal.openWallet("keycard://044def09") Please enter the pairing password: ``` @@ -42,12 +42,12 @@ ``` > personal - WARN [04-09|17:02:07.330] Smartcard wallet account derivation failed url=pcsc://044def09 err="Unexpected response status Cla=0x80, Ins=0xd1, Sw=0x6985" + 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: "pcsc://044def09" + url: "keycard://044def09" }], ... } @@ -56,7 +56,7 @@ So the communication with the card is working, but there is no key associated with this wallet. Let's create it: ``` - > personal.initializeWallet("pcsc://044def09") + > personal.initializeWallet("keycard://044def09") "tilt ... impact" ``` @@ -67,10 +67,10 @@ [{ accounts: [{ address: "0x678b7cd55c61917defb23546a41803c5bfefbc7a", - url: "pcsc://044d/m/44'/60'/0'/0/0" + url: "keycard://044d/m/44'/60'/0'/0/0" }], status: "Online", - url: "pcsc://044def09" + url: "keycard://044def09" }] ``` @@ -84,14 +84,14 @@ ``` listWallets: [{ status: "Online, can derive public keys", - url: "pcsc://a4d73015" + url: "keycard://a4d73015" }] ``` 3. Open the wallet, you will be prompted for your pairing password, then PIN: ``` -personal.openWallet("pcsc://a4d73015") +personal.openWallet("keycard://a4d73015") ``` 4. Check that creation was successful by typing e.g. `personal`. Then use it like a regular wallet. diff --git a/vendor/github.com/ethereum/go-ethereum/accounts/scwallet/hub.go b/vendor/github.com/ethereum/go-ethereum/accounts/scwallet/hub.go index c259f711..5f939c65 100644 --- a/vendor/github.com/ethereum/go-ethereum/accounts/scwallet/hub.go +++ b/vendor/github.com/ethereum/go-ethereum/accounts/scwallet/hub.go @@ -49,7 +49,7 @@ import ( ) // Scheme is the URI prefix for smartcard wallets. -const Scheme = "pcsc" +const Scheme = "keycard" // refreshCycle is the maximum time between wallet refreshes (if USB hotplug // notifications don't work). @@ -152,8 +152,8 @@ func (hub *Hub) setPairing(wallet *Wallet, pairing *smartcardPairing) error { } // NewHub creates a new hardware wallet manager for smartcards. -func NewHub(scheme string, datadir string) (*Hub, error) { - context, err := pcsc.EstablishContext(pcsc.ScopeSystem) +func NewHub(daemonPath string, scheme string, datadir string) (*Hub, error) { + context, err := pcsc.EstablishContext(daemonPath, pcsc.ScopeSystem) if err != nil { return nil, err } diff --git a/vendor/github.com/ethereum/go-ethereum/accounts/scwallet/wallet.go b/vendor/github.com/ethereum/go-ethereum/accounts/scwallet/wallet.go index 4c9a422a..57b59770 100644 --- a/vendor/github.com/ethereum/go-ethereum/accounts/scwallet/wallet.go +++ b/vendor/github.com/ethereum/go-ethereum/accounts/scwallet/wallet.go @@ -27,6 +27,7 @@ import ( "errors" "fmt" "math/big" + "regexp" "sort" "strings" "sync" @@ -37,7 +38,6 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/crypto/secp256k1" "github.com/ethereum/go-ethereum/log" pcsc "github.com/gballet/go-libpcsclite" "github.com/status-im/keycard-go/derivationpath" @@ -119,11 +119,11 @@ type Wallet struct { session *Session // The secure communication session with the card log log.Logger // Contextual logger to tag the base with its id - 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 } // NewWallet constructs and returns a new Wallet instance. @@ -311,8 +311,10 @@ func (w *Wallet) Status() (string, error) { 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 and new PIN"), nil + 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: @@ -378,10 +380,18 @@ func (w *Wallet) Open(passphrase string) error { 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 } @@ -390,7 +400,7 @@ func (w *Wallet) Open(passphrase string) error { w.deriveReq = make(chan chan struct{}) w.deriveQuit = make(chan chan error) - go w.selfDerive(0) + 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}) @@ -426,9 +436,8 @@ func (w *Wallet) Close() error { } // selfDerive is an account derivation loop that upon request attempts to find -// new non-zero accounts. maxEmpty specifies the number of empty accounts that -// should be derived once an initial empty account has been found. -func (w *Wallet) selfDerive(maxEmpty int) { +// 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") @@ -461,56 +470,59 @@ func (w *Wallet) selfDerive(maxEmpty int) { paths []accounts.DerivationPath nextAcc accounts.Account - nextAddr = w.deriveNextAddr - nextPath = w.deriveNextPath + nextPaths = append([]accounts.DerivationPath{}, w.deriveNextPaths...) + nextAddrs = append([]common.Address{}, w.deriveNextAddrs...) context = context.Background() ) - for empty, emptyCount := false, maxEmpty+1; !empty || emptyCount > 0; { - // Retrieve the next derived Ethereum account - if nextAddr == (common.Address{}) { - if nextAcc, err = w.session.derive(nextPath); err != nil { - w.log.Warn("Smartcard 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 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 } - nextAddr = nextAcc.Address - } - // 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("Smartcard wallet balance retrieval failed", "err", err) - break - } - nonce, err = w.deriveChain.NonceAt(context, nextAddr, nil) - if err != nil { - w.log.Warn("Smartcard wallet nonce retrieval failed", "err", err) - break - } - // If the next account is empty and no more empty accounts are - // allowed, stop self-derivation. Add the current one nonetheless. - if balance.Sign() == 0 && nonce == 0 { - empty = true - emptyCount-- - } - // 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) - - // Display a log message to the user for new (or previously empty accounts) - if _, known := pairing.Accounts[nextAddr]; !known || !empty || nextAddr != w.deriveNextAddr { - w.log.Info("Smartcard wallet discovered new account", "address", nextAddr, "path", path, "balance", balance, "nonce", nonce) - } - pairing.Accounts[nextAddr] = path + 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 || emptyCount > 0 { - nextAddr = common.Address{} - nextPath[len(nextPath)-1]++ + // 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 @@ -518,8 +530,8 @@ func (w *Wallet) selfDerive(maxEmpty int) { err = w.Hub.setPairing(w, pairing) } // Shift the self-derivation forward - w.deriveNextAddr = nextAddr - w.deriveNextPath = nextPath + w.deriveNextAddrs = nextAddrs + w.deriveNextPaths = nextPaths // Self derivation complete, release device lock w.lock.Unlock() @@ -592,7 +604,7 @@ func (w *Wallet) Contains(account accounts.Account) bool { // Initialize installs a keypair generated from the provided key into the wallet. func (w *Wallet) Initialize(seed []byte) error { - go w.selfDerive(0) + go w.selfDerive() // DO NOT lock at this stage, as the initialize // function relies on Status() return w.session.initialize(seed) @@ -629,16 +641,22 @@ func (w *Wallet) Derive(path accounts.DerivationPath, pin bool) (accounts.Accoun // 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(base accounts.DerivationPath, chain ethereum.ChainStateReader) { +func (w *Wallet) SelfDerive(bases []accounts.DerivationPath, chain ethereum.ChainStateReader) { w.lock.Lock() defer w.lock.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 } @@ -964,12 +982,10 @@ func (s *Session) derive(path accounts.DerivationPath) (accounts.Account, error) copy(sig[32-len(rbytes):32], rbytes) copy(sig[64-len(sbytes):64], sbytes) - pubkey, err := determinePublicKey(sig, sigdata.PublicKey) - if err != nil { + if err := confirmPublicKey(sig, sigdata.PublicKey); err != nil { return accounts.Account{}, err } - - pub, err := crypto.UnmarshalPubkey(pubkey) + pub, err := crypto.UnmarshalPubkey(sigdata.PublicKey) if err != nil { return accounts.Account{}, err } @@ -1039,36 +1055,28 @@ func (s *Session) sign(path accounts.DerivationPath, hash []byte) ([]byte, error return sig, nil } -// determinePublicKey uses a signature and the X component of a public key to -// recover the entire public key. -func determinePublicKey(sig, pubkeyX []byte) ([]byte, error) { - for v := 0; v < 2; v++ { - sig[64] = byte(v) - pubkey, err := crypto.Ecrecover(DerivationSignatureHash[:], sig) - if err == nil { - if bytes.Equal(pubkey, pubkeyX) { - return pubkey, nil - } - } else if v == 1 || err != secp256k1.ErrRecoverFailed { - return nil, err - } - } - return nil, ErrPubkeyMismatch +// 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) - pubkey, err := crypto.Ecrecover(hash, sig) - if err == nil { + if pubkey, err := crypto.Ecrecover(hash, sig); err == nil { if bytes.Equal(pubkey, expectedPubkey) { return sig, nil } - } else if v == 1 || err != secp256k1.ErrRecoverFailed { - return nil, err + } else { + libraryError = err } } + if libraryError != nil { + return nil, libraryError + } return nil, ErrPubkeyMismatch } diff --git a/vendor/github.com/ethereum/go-ethereum/accounts/usbwallet/hub.go b/vendor/github.com/ethereum/go-ethereum/accounts/usbwallet/hub.go index a91340b4..23be98a0 100644 --- a/vendor/github.com/ethereum/go-ethereum/accounts/usbwallet/hub.go +++ b/vendor/github.com/ethereum/go-ethereum/accounts/usbwallet/hub.go @@ -20,12 +20,13 @@ import ( "errors" "runtime" "sync" + "sync/atomic" "time" "github.com/ethereum/go-ethereum/accounts" "github.com/ethereum/go-ethereum/event" "github.com/ethereum/go-ethereum/log" - "github.com/karalabe/hid" + "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 diff --git a/vendor/github.com/ethereum/go-ethereum/accounts/usbwallet/trezor.go b/vendor/github.com/ethereum/go-ethereum/accounts/usbwallet/trezor.go index d3e17aba..1892097b 100644 --- a/vendor/github.com/ethereum/go-ethereum/accounts/usbwallet/trezor.go +++ b/vendor/github.com/ethereum/go-ethereum/accounts/usbwallet/trezor.go @@ -85,7 +85,7 @@ 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 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 @@ -192,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 @@ -211,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/vendor/github.com/ethereum/go-ethereum/accounts/usbwallet/trezor/messages-common.pb.go b/vendor/github.com/ethereum/go-ethereum/accounts/usbwallet/trezor/messages-common.pb.go new file mode 100644 index 00000000..304bec0e --- /dev/null +++ b/vendor/github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/accounts/usbwallet/trezor/messages-common.proto b/vendor/github.com/ethereum/go-ethereum/accounts/usbwallet/trezor/messages-common.proto new file mode 100644 index 00000000..75a983b0 --- /dev/null +++ b/vendor/github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/accounts/usbwallet/trezor/messages-ethereum.pb.go b/vendor/github.com/ethereum/go-ethereum/accounts/usbwallet/trezor/messages-ethereum.pb.go new file mode 100644 index 00000000..5d664f5b --- /dev/null +++ b/vendor/github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/accounts/usbwallet/trezor/messages-ethereum.proto b/vendor/github.com/ethereum/go-ethereum/accounts/usbwallet/trezor/messages-ethereum.proto new file mode 100644 index 00000000..096bed2e --- /dev/null +++ b/vendor/github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/accounts/usbwallet/trezor/messages-management.pb.go b/vendor/github.com/ethereum/go-ethereum/accounts/usbwallet/trezor/messages-management.pb.go new file mode 100644 index 00000000..f5c872f1 --- /dev/null +++ b/vendor/github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/accounts/usbwallet/trezor/messages-management.proto b/vendor/github.com/ethereum/go-ethereum/accounts/usbwallet/trezor/messages-management.proto new file mode 100644 index 00000000..0ab825a1 --- /dev/null +++ b/vendor/github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/accounts/usbwallet/trezor/messages.pb.go b/vendor/github.com/ethereum/go-ethereum/accounts/usbwallet/trezor/messages.pb.go index 15bb6fb7..6278bd8e 100644 --- a/vendor/github.com/ethereum/go-ethereum/accounts/usbwallet/trezor/messages.pb.go +++ b/vendor/github.com/ethereum/go-ethereum/accounts/usbwallet/trezor/messages.pb.go @@ -3,93 +3,242 @@ package trezor -import proto "github.com/golang/protobuf/proto" -import fmt "fmt" -import math "math" +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 -// * -// Mapping between Trezor wire identifier (uint) and a protobuf message +// 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 ( - 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 + // 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_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 + // 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{ @@ -99,64 +248,55 @@ var MessageType_name = map[int32]string{ 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", + 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", - 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", + 71: "MessageType_CosiCommit", + 72: "MessageType_CosiCommitment", + 73: "MessageType_CosiSign", + 74: "MessageType_CosiSignature", 100: "MessageType_DebugLinkDecision", 101: "MessageType_DebugLinkGetState", 102: "MessageType_DebugLinkState", @@ -166,81 +306,331 @@ var MessageType_name = map[int32]string{ 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_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, + "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 { @@ -248,9 +638,11 @@ func (x MessageType) Enum() *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 { @@ -259,2823 +651,239 @@ func (x *MessageType) UnmarshalJSON(data []byte) error { *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 (MessageType) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_4dc296cbfe5ffcd5, []int{0} } -func (m *GetPublicKey) GetEcdsaCurveName() string { - if m != nil && m.EcdsaCurveName != nil { - return *m.EcdsaCurveName - } - return "" +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", } -func (m *GetPublicKey) GetShowDisplay() bool { - if m != nil && m.ShowDisplay != nil { - return *m.ShowDisplay - } - return false +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", } -func (m *GetPublicKey) GetCoinName() string { - if m != nil && m.CoinName != nil { - return *m.CoinName - } - return Default_GetPublicKey_CoinName +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", } -// * -// 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:"-"` +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", } -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 +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", } -func (m *PublicKey) GetXpub() string { - if m != nil && m.Xpub != nil { - return *m.Xpub - } - return "" +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", } -// * -// 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 +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.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, + 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/vendor/github.com/ethereum/go-ethereum/accounts/usbwallet/trezor/messages.proto b/vendor/github.com/ethereum/go-ethereum/accounts/usbwallet/trezor/messages.proto index 8cb9c8cc..3e0482e3 100644 --- a/vendor/github.com/ethereum/go-ethereum/accounts/usbwallet/trezor/messages.proto +++ b/vendor/github.com/ethereum/go-ethereum/accounts/usbwallet/trezor/messages.proto @@ -1,8 +1,9 @@ // 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. +// dated 28.05.2019, commit 893fd219d4a01bcffa0cd9cfa631856371ec5aa9. syntax = "proto2"; +package hw.trezor.messages; /** * Messages for TREZOR communication @@ -12,894 +13,252 @@ syntax = "proto2"; option java_package = "com.satoshilabs.trezor.lib.protobuf"; option java_outer_classname = "TrezorMessage"; -import "types.proto"; +import "google/protobuf/descriptor.proto"; /** - * Mapping between Trezor wire identifier (uint) and a protobuf message + * Options for specifying message direction and type of wire (normal/debug) */ -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 +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 } -/////////////////// -// 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 + * Mapping between TREZOR wire identifier (uint) and a protobuf message */ -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; -} +enum MessageType { -/** - * Request: Erase block of flash on device - * WARNING: Writing to the wrong location can irreparably break the device. - */ -message DebugLinkFlashErase { - optional uint32 sector = 1; + // 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/vendor/github.com/ethereum/go-ethereum/accounts/usbwallet/trezor/trezor.go b/vendor/github.com/ethereum/go-ethereum/accounts/usbwallet/trezor/trezor.go index 80cc75ef..a259c1dc 100644 --- a/vendor/github.com/ethereum/go-ethereum/accounts/usbwallet/trezor/trezor.go +++ b/vendor/github.com/ethereum/go-ethereum/accounts/usbwallet/trezor/trezor.go @@ -1,4 +1,4 @@ -// Copyright 2017 The go-ethereum Authors +// 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 @@ -16,11 +16,35 @@ // 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 +// https://wiki.trezor.io/Developers_guide-Message_Workflows -//go:generate protoc --go_out=import_path=trezor:. types.proto messages.proto +// !!! 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 wrapper in Go. +// Package trezor contains the wire protocol. package trezor import ( diff --git a/vendor/github.com/ethereum/go-ethereum/accounts/usbwallet/trezor/types.pb.go b/vendor/github.com/ethereum/go-ethereum/accounts/usbwallet/trezor/types.pb.go deleted file mode 100644 index 25b7672d..00000000 --- a/vendor/github.com/ethereum/go-ethereum/accounts/usbwallet/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/vendor/github.com/ethereum/go-ethereum/accounts/usbwallet/trezor/types.proto b/vendor/github.com/ethereum/go-ethereum/accounts/usbwallet/trezor/types.proto deleted file mode 100644 index acbe79e3..00000000 --- a/vendor/github.com/ethereum/go-ethereum/accounts/usbwallet/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/vendor/github.com/ethereum/go-ethereum/accounts/usbwallet/wallet.go b/vendor/github.com/ethereum/go-ethereum/accounts/usbwallet/wallet.go index 2ddfa30a..ed786d9b 100644 --- a/vendor/github.com/ethereum/go-ethereum/accounts/usbwallet/wallet.go +++ b/vendor/github.com/ethereum/go-ethereum/accounts/usbwallet/wallet.go @@ -31,7 +31,7 @@ import ( "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/log" - "github.com/karalabe/hid" + "github.com/karalabe/usb" ) // Maximum time between wallet health checks to detect USB unplugs. @@ -77,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 @@ -339,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 @@ -406,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) @@ -479,18 +484,30 @@ func (w *wallet) Derive(path accounts.DerivationPath, pin bool) (accounts.Accoun 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 } diff --git a/vendor/github.com/ethereum/go-ethereum/appveyor.yml b/vendor/github.com/ethereum/go-ethereum/appveyor.yml index a17fd530..d3ed3785 100644 --- a/vendor/github.com/ethereum/go-ethereum/appveyor.yml +++ b/vendor/github.com/ethereum/go-ethereum/appveyor.yml @@ -23,8 +23,8 @@ environment: install: - git submodule update --init - rmdir C:\go /s /q - - appveyor DownloadFile https://dl.google.com/go/go1.12.3.windows-%GETH_ARCH%.zip - - 7z x go1.12.3.windows-%GETH_ARCH%.zip -y -oC:\ > NUL + - appveyor DownloadFile https://dl.google.com/go/go1.12.5.windows-%GETH_ARCH%.zip + - 7z x go1.12.5.windows-%GETH_ARCH%.zip -y -oC:\ > NUL - go version - gcc --version diff --git a/vendor/github.com/ethereum/go-ethereum/build/ci.go b/vendor/github.com/ethereum/go-ethereum/build/ci.go index f5553fd3..8be52338 100644 --- a/vendor/github.com/ethereum/go-ethereum/build/ci.go +++ b/vendor/github.com/ethereum/go-ethereum/build/ci.go @@ -60,7 +60,6 @@ import ( "github.com/ethereum/go-ethereum/internal/build" "github.com/ethereum/go-ethereum/params" - sv "github.com/ethereum/go-ethereum/swarm/version" ) var ( @@ -83,12 +82,6 @@ var ( executablePath("clef"), } - // Files that end up in the swarm*.zip archive. - swarmArchiveFiles = []string{ - "COPYING", - executablePath("swarm"), - } - // A debian package is created for all executables listed here. debExecutables = []debExecutable{ { @@ -126,13 +119,6 @@ var ( } // A debian package is created for all executables listed here. - debSwarmExecutables = []debExecutable{ - { - BinaryName: "swarm", - PackageName: "ethereum-swarm", - Description: "Ethereum Swarm daemon and tools", - }, - } debEthereum = debPackage{ Name: "ethereum", @@ -140,27 +126,17 @@ var ( 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. + // 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. debDistros = []string{"trusty", "xenial", "bionic", "cosmic", "disco"} ) @@ -284,6 +260,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") @@ -408,9 +385,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 { @@ -419,10 +393,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) } @@ -585,8 +556,8 @@ 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 } @@ -1022,7 +993,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))) diff --git a/vendor/github.com/ethereum/go-ethereum/build/deb/ethereum-swarm/deb.changelog b/vendor/github.com/ethereum/go-ethereum/build/deb/ethereum-swarm/deb.changelog deleted file mode 100644 index 83f804a8..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/build/deb/ethereum-swarm/deb.control b/vendor/github.com/ethereum/go-ethereum/build/deb/ethereum-swarm/deb.control deleted file mode 100644 index b0ced141..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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.11 -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/vendor/github.com/ethereum/go-ethereum/build/deb/ethereum-swarm/deb.copyright b/vendor/github.com/ethereum/go-ethereum/build/deb/ethereum-swarm/deb.copyright deleted file mode 100644 index fe6e36ad..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/build/deb/ethereum-swarm/deb.docs b/vendor/github.com/ethereum/go-ethereum/build/deb/ethereum-swarm/deb.docs deleted file mode 100644 index 62deb049..00000000 --- a/vendor/github.com/ethereum/go-ethereum/build/deb/ethereum-swarm/deb.docs +++ /dev/null @@ -1 +0,0 @@ -AUTHORS diff --git a/vendor/github.com/ethereum/go-ethereum/build/deb/ethereum-swarm/deb.install b/vendor/github.com/ethereum/go-ethereum/build/deb/ethereum-swarm/deb.install deleted file mode 100644 index e7666ce5..00000000 --- a/vendor/github.com/ethereum/go-ethereum/build/deb/ethereum-swarm/deb.install +++ /dev/null @@ -1 +0,0 @@ -build/bin/{{.BinaryName}} usr/bin diff --git a/vendor/github.com/ethereum/go-ethereum/build/deb/ethereum-swarm/deb.rules b/vendor/github.com/ethereum/go-ethereum/build/deb/ethereum-swarm/deb.rules deleted file mode 100644 index 5280e0e5..00000000 --- a/vendor/github.com/ethereum/go-ethereum/build/deb/ethereum-swarm/deb.rules +++ /dev/null @@ -1,16 +0,0 @@ -#!/usr/bin/make -f -# -*- makefile -*- - -# Uncomment this to turn on verbose mode. -#export DH_VERBOSE=1 - -# Launchpad rejects Go's access to $HOME/.cache, use custom folder -export GOCACHE=/tmp/go-build - -override_dh_auto_build: - build/env.sh /usr/lib/go-1.11/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/vendor/github.com/ethereum/go-ethereum/build/deb/ethereum/deb.control b/vendor/github.com/ethereum/go-ethereum/build/deb/ethereum/deb.control index 018067a1..5b3ff935 100644 --- a/vendor/github.com/ethereum/go-ethereum/build/deb/ethereum/deb.control +++ b/vendor/github.com/ethereum/go-ethereum/build/deb/ethereum/deb.control @@ -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/vendor/github.com/ethereum/go-ethereum/build/update-license.go b/vendor/github.com/ethereum/go-ethereum/build/update-license.go index e3e00d4c..0ce82923 100644 --- a/vendor/github.com/ethereum/go-ethereum/build/update-license.go +++ b/vendor/github.com/ethereum/go-ethereum/build/update-license.go @@ -72,8 +72,6 @@ var ( "internal/jsre/deps", "log/", "common/bitutil/bitutil", - // don't license generated files - "contracts/chequebook/contract/code.go", } // paths with this prefix are licensed as GPL. all other files are LGPL. diff --git a/vendor/github.com/ethereum/go-ethereum/cmd/abigen/main.go b/vendor/github.com/ethereum/go-ethereum/cmd/abigen/main.go index b6ec04ce..461c2946 100644 --- a/vendor/github.com/ethereum/go-ethereum/cmd/abigen/main.go +++ b/vendor/github.com/ethereum/go-ethereum/cmd/abigen/main.go @@ -81,7 +81,7 @@ func main() { bins []string types []string ) - if *solFlag != "" || *vyFlag != "" || (*abiFlag == "-" && *pkgFlag == "") { + if *solFlag != "" || *vyFlag != "" || *abiFlag == "-" { // Generate the list of types to exclude from binding exclude := make(map[string]bool) for _, kind := range strings.Split(*excFlag, ",") { @@ -129,13 +129,8 @@ func main() { } } 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) - } + abi, err := ioutil.ReadFile(*abiFlag) + if err != nil { fmt.Printf("Failed to read input ABI: %v\n", err) os.Exit(-1) diff --git a/vendor/github.com/ethereum/go-ethereum/cmd/bootnode/main.go b/vendor/github.com/ethereum/go-ethereum/cmd/bootnode/main.go index a40b32b6..2f9bba11 100644 --- a/vendor/github.com/ethereum/go-ethereum/cmd/bootnode/main.go +++ b/vendor/github.com/ethereum/go-ethereum/cmd/bootnode/main.go @@ -143,7 +143,7 @@ func printNotice(nodeKey *ecdsa.PublicKey, addr net.UDPAddr) { addr.IP = net.IP{127, 0, 0, 1} } n := enode.NewV4(nodeKey, addr.IP, 0, addr.Port) - fmt.Println(n.String()) + 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/vendor/github.com/ethereum/go-ethereum/cmd/clef/main.go b/vendor/github.com/ethereum/go-ethereum/cmd/clef/main.go index fecfcafa..0ea6f36f 100644 --- a/vendor/github.com/ethereum/go-ethereum/cmd/clef/main.go +++ b/vendor/github.com/ethereum/go-ethereum/cmd/clef/main.go @@ -33,6 +33,7 @@ import ( "path/filepath" "runtime" "strings" + "time" "github.com/ethereum/go-ethereum/accounts" "github.com/ethereum/go-ethereum/accounts/keystore" @@ -193,6 +194,7 @@ func init() { chainIdFlag, utils.LightKDFFlag, utils.NoUSBFlag, + utils.SmartCardDaemonPathFlag, utils.RPCListenAddrFlag, utils.RPCVirtualHostsFlag, utils.IPCDisabledFlag, @@ -418,10 +420,11 @@ func signer(c *cli.Context) error { 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) + 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 @@ -638,6 +641,10 @@ func testExternalUI(api *core.SignerAPI) { errs := make([]string, 0) a := common.HexToAddress("0xdeadbeef000000000000000000000000deadbeef") + addErr := func(errStr string) { + log.Info("Test error", "error", errStr) + errs = append(errs, errStr) + } queryUser := func(q string) string { resp, err := api.UI.OnInputRequired(core.UserInputRequest{ @@ -645,36 +652,39 @@ func testExternalUI(api *core.SignerAPI) { Prompt: q, }) if err != nil { - errs = append(errs, err.Error()) + addErr(err.Error()) } return resp.Text } expectResponse := func(testcase, question, expect string) { if got := queryUser(question); got != expect { - errs = append(errs, fmt.Sprintf("%s: got %v, expected %v", testcase, got, expect)) + addErr(fmt.Sprintf("%s: got %v, expected %v", testcase, got, expect)) } } expectApprove := func(testcase string, err error) { if err == nil || err == accounts.ErrUnknownAccount { return } - errs = append(errs, fmt.Sprintf("%v: expected no error, got %v", testcase, err.Error())) + addErr(fmt.Sprintf("%v: expected no error, got %v", testcase, err.Error())) } expectDeny := func(testcase string, err error) { if err == nil || err != core.ErrRequestDenied { - errs = append(errs, fmt.Sprintf("%v: expected ErrRequestDenied, got %v", testcase, err)) + 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{ common.HexToHash("0000H45H"), common.HexToHash("0000H45H"), @@ -700,14 +710,27 @@ func testExternalUI(api *core.SignerAPI) { _, 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 + err := 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) @@ -715,6 +738,7 @@ func testExternalUI(api *core.SignerAPI) { { // Sign transaction api.UI.ShowInfo("Please reject next transaction") + time.Sleep(delay) data := hexutil.Bytes([]byte{}) to := common.NewMixedcaseAddress(a) tx := core.SendTxArgs{ @@ -733,16 +757,19 @@ func testExternalUI(api *core.SignerAPI) { } { // 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") } diff --git a/vendor/github.com/ethereum/go-ethereum/cmd/devp2p/discv4cmd.go b/vendor/github.com/ethereum/go-ethereum/cmd/devp2p/discv4cmd.go new file mode 100644 index 00000000..1e56687a --- /dev/null +++ b/vendor/github.com/ethereum/go-ethereum/cmd/devp2p/discv4cmd.go @@ -0,0 +1,166 @@ +// 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" + "sort" + "strings" + "time" + + "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, + }, + } + discv4PingCommand = cli.Command{ + Name: "ping", + Usage: "Sends ping to a node", + Action: discv4Ping, + } + discv4RequestRecordCommand = cli.Command{ + Name: "requestenr", + Usage: "Requests a node record using EIP-868 enrRequest", + Action: discv4RequestRecord, + } + discv4ResolveCommand = cli.Command{ + Name: "resolve", + Usage: "Finds a node in the DHT", + Action: discv4Resolve, + Flags: []cli.Flag{bootnodesFlag}, + } +) + +var bootnodesFlag = cli.StringFlag{ + Name: "bootnodes", + Usage: "Comma separated nodes used for bootstrapping", +} + +func discv4Ping(ctx *cli.Context) error { + n, disc, err := getNodeArgAndStartV4(ctx) + if err != nil { + return err + } + 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, disc, err := getNodeArgAndStartV4(ctx) + if err != nil { + return err + } + 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, disc, err := getNodeArgAndStartV4(ctx) + if err != nil { + return err + } + defer disc.Close() + + fmt.Println(disc.Resolve(n).String()) + return nil +} + +func getNodeArgAndStartV4(ctx *cli.Context) (*enode.Node, *discover.UDPv4, error) { + if ctx.NArg() != 1 { + return nil, nil, fmt.Errorf("missing node as command-line argument") + } + n, err := parseNode(ctx.Args()[0]) + if err != nil { + return nil, nil, err + } + var bootnodes []*enode.Node + if commandHasFlag(ctx, bootnodesFlag) { + bootnodes, err = parseBootnodes(ctx) + if err != nil { + return nil, nil, err + } + } + disc, err := startV4(bootnodes) + return n, disc, err +} + +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 +} + +// 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() +} + +// startV4 starts an ephemeral discovery V4 node. +func startV4(bootnodes []*enode.Node) (*discover.UDPv4, error) { + var cfg discover.Config + cfg.Bootnodes = bootnodes + 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 { + return nil, err + } + addr := socket.LocalAddr().(*net.UDPAddr) + ln.SetFallbackIP(net.IP{127, 0, 0, 1}) + ln.SetFallbackUDP(addr.Port) + return discover.ListenUDP(socket, ln, cfg) +} diff --git a/vendor/github.com/ethereum/go-ethereum/cmd/devp2p/enrcmd.go b/vendor/github.com/ethereum/go-ethereum/cmd/devp2p/enrcmd.go new file mode 100644 index 00000000..15d77dd0 --- /dev/null +++ b/vendor/github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/cmd/devp2p/main.go b/vendor/github.com/ethereum/go-ethereum/cmd/devp2p/main.go new file mode 100644 index 00000000..4532ab96 --- /dev/null +++ b/vendor/github.com/ethereum/go-ethereum/cmd/devp2p/main.go @@ -0,0 +1,68 @@ +// 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" + + "github.com/ethereum/go-ethereum/internal/debug" + "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, + } +} + +func main() { + if err := app.Run(os.Args); err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } +} diff --git a/vendor/github.com/ethereum/go-ethereum/cmd/ethkey/main.go b/vendor/github.com/ethereum/go-ethereum/cmd/ethkey/main.go index c434da0c..a8399ad7 100644 --- a/vendor/github.com/ethereum/go-ethereum/cmd/ethkey/main.go +++ b/vendor/github.com/ethereum/go-ethereum/cmd/ethkey/main.go @@ -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, diff --git a/vendor/github.com/ethereum/go-ethereum/cmd/evm/main.go b/vendor/github.com/ethereum/go-ethereum/cmd/evm/main.go index ebac2047..a5159c6b 100644 --- a/vendor/github.com/ethereum/go-ethereum/cmd/evm/main.go +++ b/vendor/github.com/ethereum/go-ethereum/cmd/evm/main.go @@ -27,9 +27,10 @@ import ( ) 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", diff --git a/vendor/github.com/ethereum/go-ethereum/cmd/faucet/faucet.go b/vendor/github.com/ethereum/go-ethereum/cmd/faucet/faucet.go index 78b4a656..f8092084 100644 --- a/vendor/github.com/ethereum/go-ethereum/cmd/faucet/faucet.go +++ b/vendor/github.com/ethereum/go-ethereum/cmd/faucet/faucet.go @@ -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) } @@ -440,10 +445,14 @@ func (f *faucet) apiHandler(conn *websocket.Conn) { return } continue + case strings.HasPrefix(msg.URL, "https://plus.google.com/"): + 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: @@ -699,40 +708,6 @@ 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) { diff --git a/vendor/github.com/ethereum/go-ethereum/cmd/faucet/faucet.html b/vendor/github.com/ethereum/go-ethereum/cmd/faucet/faucet.html index ab41b2c8..314b19e1 100644 --- a/vendor/github.com/ethereum/go-ethereum/cmd/faucet/faucet.html +++ b/vendor/github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/cmd/faucet/website.go b/vendor/github.com/ethereum/go-ethereum/cmd/faucet/website.go index fab1d434..a091d249 100644 --- a/vendor/github.com/ethereum/go-ethereum/cmd/faucet/website.go +++ b/vendor/github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/cmd/geth/accountcmd.go b/vendor/github.com/ethereum/go-ethereum/cmd/geth/accountcmd.go index 94029089..8fd149ca 100644 --- a/vendor/github.com/ethereum/go-ethereum/cmd/geth/accountcmd.go +++ b/vendor/github.com/ethereum/go-ethereum/cmd/geth/accountcmd.go @@ -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 } diff --git a/vendor/github.com/ethereum/go-ethereum/cmd/geth/chaincmd.go b/vendor/github.com/ethereum/go-ethereum/cmd/geth/chaincmd.go index 72aace1c..c91545c7 100644 --- a/vendor/github.com/ethereum/go-ethereum/cmd/geth/chaincmd.go +++ b/vendor/github.com/ethereum/go-ethereum/cmd/geth/chaincmd.go @@ -20,6 +20,7 @@ import ( "encoding/json" "fmt" "os" + "path/filepath" "runtime" "strconv" "sync/atomic" @@ -35,6 +36,7 @@ import ( "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" ) @@ -166,6 +168,22 @@ Remove blockchain and state databases`, 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 @@ -367,19 +385,27 @@ func exportPreimages(ctx *cli.Context) error { func copyDb(ctx *cli.Context) error { // Ensure we have a source chain directory to copy - if len(ctx.Args()) != 1 { + 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) - dl := downloader.New(syncmode, chainDb, new(event.TypeMux), chain, nil, nil) + 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.NewLevelDBDatabase(ctx.Args().First(), ctx.GlobalInt(utils.CacheFlag.Name), 256, "") + db, err := rawdb.NewLevelDBDatabaseWithFreezer(ctx.Args().First(), ctx.GlobalInt(utils.CacheFlag.Name)/2, 256, ctx.Args().Get(1), "") if err != nil { return err } @@ -395,7 +421,7 @@ func copyDb(ctx *cli.Context) error { start := time.Now() currentHeader := hc.CurrentHeader() - if err = dl.Synchronise("local", currentHeader.Hash(), hc.GetTd(currentHeader.Hash(), currentHeader.Number.Uint64()), syncmode); err != nil { + if err = dl.Synchronise("local", currentHeader.Hash(), hc.GetTd(currentHeader.Hash(), currentHeader.Number.Uint64()), syncMode); err != nil { return err } for dl.Synchronising() { @@ -414,34 +440,65 @@ func copyDb(ctx *cli.Context) error { } 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) + stack, config := makeConfigNode(ctx) - 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))) - } + // 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() @@ -470,6 +527,16 @@ func dump(ctx *cli.Context) error { 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) diff --git a/vendor/github.com/ethereum/go-ethereum/cmd/geth/config.go b/vendor/github.com/ethereum/go-ethereum/cmd/geth/config.go index ec97070c..204eb37c 100644 --- a/vendor/github.com/ethereum/go-ethereum/cmd/geth/config.go +++ b/vendor/github.com/ethereum/go-ethereum/cmd/geth/config.go @@ -101,7 +101,7 @@ func loadConfig(file string, cfg *gethConfig) error { func defaultNodeConfig() node.Config { cfg := node.DefaultConfig cfg.Name = clientIdentifier - cfg.Version = params.VersionWithCommit(gitCommit) + cfg.Version = params.VersionWithCommit(gitCommit, gitDate) cfg.HTTPModules = append(cfg.HTTPModules, "eth", "shh") cfg.WSModules = append(cfg.WSModules, "eth", "shh") cfg.IPCPath = "geth.ipc" diff --git a/vendor/github.com/ethereum/go-ethereum/cmd/geth/main.go b/vendor/github.com/ethereum/go-ethereum/cmd/geth/main.go index 39375a2b..09086d0f 100644 --- a/vendor/github.com/ethereum/go-ethereum/cmd/geth/main.go +++ b/vendor/github.com/ethereum/go-ethereum/cmd/geth/main.go @@ -50,8 +50,9 @@ const ( 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, "the go-ethereum command line interface") + app = utils.NewApp(gitCommit, gitDate, "the go-ethereum command line interface") // flags that configure the node nodeFlags = []cli.Flag{ utils.IdentityFlag, @@ -61,9 +62,11 @@ var ( utils.BootnodesV4Flag, utils.BootnodesV5Flag, utils.DataDirFlag, + utils.AncientFlag, utils.KeyStoreDirFlag, utils.ExternalSignerFlag, utils.NoUSBFlag, + utils.SmartCardDaemonPathFlag, utils.DashboardEnabledFlag, utils.DashboardAddrFlag, utils.DashboardPortFlag, @@ -143,6 +146,10 @@ var ( utils.EWASMInterpreterFlag, utils.EVMInterpreterFlag, utils.StateDiffFlag, + utils.StateDiffPathsAndProofs, + utils.StateDiffIntermediateNodes, + utils.StateDiffStreamBlock, + utils.StateDiffWatchedAddresses, configFileFlag, } @@ -203,6 +210,7 @@ func init() { copydbCommand, removedbCommand, dumpCommand, + inspectCommand, // See accountcmd.go: accountCommand, walletCommand, @@ -217,6 +225,8 @@ func init() { licenseCommand, // See config.go dumpConfigCommand, + // See retesteth.go + retestethCommand, } sort.Sort(cli.CommandsByName(app.Commands)) @@ -235,6 +245,20 @@ func init() { if err := debug.Setup(ctx, logdir); err != nil { return err } + // 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) { + // 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 if err := mem.Get(); err == nil { @@ -329,11 +353,13 @@ func startNode(ctx *cli.Context, stack *node.Node) { status, _ := event.Wallet.Status() log.Info("New wallet appeared", "url", event.Wallet.URL(), "status", status) - derivationPath := accounts.DefaultBaseDerivationPath + var derivationPaths []accounts.DerivationPath if event.Wallet.URL().Scheme == "ledger" { - derivationPath = accounts.DefaultLedgerBaseDerivationPath + derivationPaths = append(derivationPaths, accounts.LegacyLedgerBaseDerivationPath) } - event.Wallet.SelfDerive(derivationPath, stateReader) + derivationPaths = append(derivationPaths, accounts.DefaultBaseDerivationPath) + + event.Wallet.SelfDerive(derivationPaths, stateReader) case accounts.WalletDropped: log.Info("Old wallet dropped", "url", event.Wallet.URL()) diff --git a/vendor/github.com/ethereum/go-ethereum/cmd/geth/misccmd.go b/vendor/github.com/ethereum/go-ethereum/cmd/geth/misccmd.go index f62e2547..39ca4787 100644 --- a/vendor/github.com/ethereum/go-ethereum/cmd/geth/misccmd.go +++ b/vendor/github.com/ethereum/go-ethereum/cmd/geth/misccmd.go @@ -112,6 +112,9 @@ 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) diff --git a/vendor/github.com/ethereum/go-ethereum/cmd/geth/retesteth.go b/vendor/github.com/ethereum/go-ethereum/cmd/geth/retesteth.go new file mode 100644 index 00000000..6d5763f8 --- /dev/null +++ b/vendor/github.com/ethereum/go-ethereum/cmd/geth/retesteth.go @@ -0,0 +1,888 @@ +// 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 { + AccountRangeAt(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"` + 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 + ) + 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) + } + 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, + }, + 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 coalescedLogs []*types.Log + 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) + coalescedLogs = append(coalescedLogs, receipt.Logs...) + 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) + 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) AccountRangeAt(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("%x: %x\n", it.Key, preimage) + } else { + //fmt.Printf("could not find preimage for %x\n", it.Key) + } + } + //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 + 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(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), + } + //fmt.Printf("Key: %s, Value: %s\n", ks, vs) + } else { + //fmt.Printf("Did not find preimage for %x\n", it.Key) + } + } + 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 = "n/a" + ) + 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) + signal.Notify(abortChan, os.Interrupt) + + sig := <-abortChan + log.Info("Exiting...", "signal", sig) + return nil +} diff --git a/vendor/github.com/ethereum/go-ethereum/cmd/geth/retesteth_copypaste.go b/vendor/github.com/ethereum/go-ethereum/cmd/geth/retesteth_copypaste.go new file mode 100644 index 00000000..e2795af7 --- /dev/null +++ b/vendor/github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/cmd/geth/usage.go b/vendor/github.com/ethereum/go-ethereum/cmd/geth/usage.go index e7a9e1fb..3ff7f884 100644 --- a/vendor/github.com/ethereum/go-ethereum/cmd/geth/usage.go +++ b/vendor/github.com/ethereum/go-ethereum/cmd/geth/usage.go @@ -69,8 +69,10 @@ var AppHelpFlagGroups = []flagGroup{ Flags: []cli.Flag{ configFileFlag, utils.DataDirFlag, + utils.AncientFlag, utils.KeyStoreDirFlag, utils.NoUSBFlag, + utils.SmartCardDaemonPathFlag, utils.NetworkIdFlag, utils.TestnetFlag, utils.RinkebyFlag, @@ -249,6 +251,10 @@ var AppHelpFlagGroups = []flagGroup{ Name: "STATE DIFF", Flags: []cli.Flag{ utils.StateDiffFlag, + utils.StateDiffPathsAndProofs, + utils.StateDiffIntermediateNodes, + utils.StateDiffStreamBlock, + utils.StateDiffWatchedAddresses, }, }, { diff --git a/vendor/github.com/ethereum/go-ethereum/cmd/swarm/access.go b/vendor/github.com/ethereum/go-ethereum/cmd/swarm/access.go deleted file mode 100644 index cc0cc820..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/ethereum/go-ethereum/cmd/utils" - "github.com/ethereum/go-ethereum/swarm/api" - "github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/cmd/swarm/bootnodes.go b/vendor/github.com/ethereum/go-ethereum/cmd/swarm/bootnodes.go deleted file mode 100644 index ce3cd528..00000000 --- a/vendor/github.com/ethereum/go-ethereum/cmd/swarm/bootnodes.go +++ /dev/null @@ -1,24 +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{ - // EF Swarm Bootnode - AWS - eu-central-1 - "enode://4c113504601930bf2000c29bcd98d1716b6167749f58bad703bae338332fe93cc9d9204f08afb44100dc7bea479205f5d162df579f9a8f76f8b402d339709023@3.122.203.99:30301", - // EF Swarm Bootnode - AWS - us-west-2 - "enode://89f2ede3371bff1ad9f2088f2012984e280287a4e2b68007c2a6ad994909c51886b4a8e9e2ecc97f9910aca538398e0a5804b0ee80a187fde1ba4f32626322ba@52.35.212.179:30301", -} diff --git a/vendor/github.com/ethereum/go-ethereum/cmd/swarm/config.go b/vendor/github.com/ethereum/go-ethereum/cmd/swarm/config.go deleted file mode 100644 index 32cd442a..00000000 --- a/vendor/github.com/ethereum/go-ethereum/cmd/swarm/config.go +++ /dev/null @@ -1,451 +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/ethereum/go-ethereum/cmd/utils" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/node" - "github.com/naoina/toml" - - bzzapi "github.com/ethereum/go-ethereum/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 ( - SwarmEnvChequebookAddr = "SWARM_CHEQUEBOOK_ADDR" - SwarmEnvAccount = "SWARM_ACCOUNT" - SwarmEnvListenAddr = "SWARM_LISTEN_ADDR" - SwarmEnvPort = "SWARM_PORT" - SwarmEnvNetworkID = "SWARM_NETWORK_ID" - SwarmEnvSwapEnable = "SWARM_SWAP_ENABLE" - SwarmEnvSwapAPI = "SWARM_SWAP_API" - SwarmEnvSyncDisable = "SWARM_SYNC_DISABLE" - SwarmEnvSyncUpdateDelay = "SWARM_ENV_SYNC_UPDATE_DELAY" - SwarmEnvMaxStreamPeerServers = "SWARM_ENV_MAX_STREAM_PEER_SERVERS" - SwarmEnvLightNodeEnable = "SWARM_LIGHT_NODE_ENABLE" - SwarmEnvDeliverySkipCheck = "SWARM_DELIVERY_SKIP_CHECK" - SwarmEnvENSAPI = "SWARM_ENS_API" - SwarmEnvENSAddr = "SWARM_ENS_ADDR" - SwarmEnvCORS = "SWARM_CORS" - SwarmEnvBootnodes = "SWARM_BOOTNODES" - SwarmEnvPSSEnable = "SWARM_PSS_ENABLE" - SwarmEnvStorePath = "SWARM_STORE_PATH" - SwarmEnvStoreCapacity = "SWARM_STORE_CAPACITY" - SwarmEnvStoreCacheCapacity = "SWARM_STORE_CACHE_CAPACITY" - SwarmEnvBootnodeMode = "SWARM_BOOTNODE_MODE" - SwarmAccessPassword = "SWARM_ACCESS_PASSWORD" - SwarmAutoDefaultPath = "SWARM_AUTO_DEFAULTPATH" - SwarmGlobalstoreAPI = "SWARM_GLOBALSTORE_API" - GethEnvDataDir = "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/ethereum/go-ethereum/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, nodeconfig *node.Config) error { - //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 - err := config.Init(prvkey, nodeconfig.NodeKey()) - if err != nil { - return err - } - //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)) - return nil -} - -//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 -} - -// cmdLineOverride overrides 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(SwarmErrSwapSetNoAPI) - } - - 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 ctx.GlobalIsSet(SwarmStoreCacheCapacity.Name) { - currentConfig.LocalStoreParams.CacheCapacity = ctx.GlobalUint(SwarmStoreCacheCapacity.Name) - } - - if ctx.GlobalIsSet(SwarmBootnodeModeFlag.Name) { - currentConfig.BootnodeMode = ctx.GlobalBool(SwarmBootnodeModeFlag.Name) - } - - if ctx.GlobalIsSet(SwarmGlobalStoreAPIFlag.Name) { - currentConfig.GlobalStoreAPI = ctx.GlobalString(SwarmGlobalStoreAPIFlag.Name) - } - - return currentConfig - -} - -// envVarsOverride overrides 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(SwarmEnvAccount); keyid != "" { - currentConfig.BzzAccount = keyid - } - - if chbookaddr := os.Getenv(SwarmEnvChequebookAddr); chbookaddr != "" { - currentConfig.Contract = common.HexToAddress(chbookaddr) - } - - if networkid := os.Getenv(SwarmEnvNetworkID); networkid != "" { - id, err := strconv.ParseUint(networkid, 10, 64) - if err != nil { - utils.Fatalf("invalid environment variable %s: %v", SwarmEnvNetworkID, err) - } - if id != 0 { - currentConfig.NetworkID = id - } - } - - if datadir := os.Getenv(GethEnvDataDir); datadir != "" { - currentConfig.Path = expandPath(datadir) - } - - bzzport := os.Getenv(SwarmEnvPort) - if len(bzzport) > 0 { - currentConfig.Port = bzzport - } - - if bzzaddr := os.Getenv(SwarmEnvListenAddr); bzzaddr != "" { - currentConfig.ListenAddr = bzzaddr - } - - if swapenable := os.Getenv(SwarmEnvSwapEnable); swapenable != "" { - swap, err := strconv.ParseBool(swapenable) - if err != nil { - utils.Fatalf("invalid environment variable %s: %v", SwarmEnvSwapEnable, err) - } - currentConfig.SwapEnabled = swap - } - - if syncdisable := os.Getenv(SwarmEnvSyncDisable); syncdisable != "" { - sync, err := strconv.ParseBool(syncdisable) - if err != nil { - utils.Fatalf("invalid environment variable %s: %v", SwarmEnvSyncDisable, err) - } - currentConfig.SyncEnabled = !sync - } - - if v := os.Getenv(SwarmEnvDeliverySkipCheck); v != "" { - skipCheck, err := strconv.ParseBool(v) - if err != nil { - currentConfig.DeliverySkipCheck = skipCheck - } - } - - if v := os.Getenv(SwarmEnvSyncUpdateDelay); v != "" { - d, err := time.ParseDuration(v) - if err != nil { - utils.Fatalf("invalid environment variable %s: %v", SwarmEnvSyncUpdateDelay, err) - } - currentConfig.SyncUpdateDelay = d - } - - if max := os.Getenv(SwarmEnvMaxStreamPeerServers); max != "" { - m, err := strconv.Atoi(max) - if err != nil { - utils.Fatalf("invalid environment variable %s: %v", SwarmEnvMaxStreamPeerServers, err) - } - currentConfig.MaxStreamPeerServers = m - } - - if lne := os.Getenv(SwarmEnvLightNodeEnable); lne != "" { - lightnode, err := strconv.ParseBool(lne) - if err != nil { - utils.Fatalf("invalid environment variable %s: %v", SwarmEnvLightNodeEnable, err) - } - currentConfig.LightNodeEnabled = lightnode - } - - if swapapi := os.Getenv(SwarmEnvSwapAPI); swapapi != "" { - currentConfig.SwapAPI = swapapi - } - - if currentConfig.SwapEnabled && currentConfig.SwapAPI == "" { - utils.Fatalf(SwarmErrSwapSetNoAPI) - } - - if ensapi := os.Getenv(SwarmEnvENSAPI); ensapi != "" { - currentConfig.EnsAPIs = strings.Split(ensapi, ",") - } - - if ensaddr := os.Getenv(SwarmEnvENSAddr); ensaddr != "" { - currentConfig.EnsRoot = common.HexToAddress(ensaddr) - } - - if cors := os.Getenv(SwarmEnvCORS); cors != "" { - currentConfig.Cors = cors - } - - if bm := os.Getenv(SwarmEnvBootnodeMode); bm != "" { - bootnodeMode, err := strconv.ParseBool(bm) - if err != nil { - utils.Fatalf("invalid environment variable %s: %v", SwarmEnvBootnodeMode, err) - } - currentConfig.BootnodeMode = bootnodeMode - } - - if api := os.Getenv(SwarmGlobalstoreAPI); api != "" { - currentConfig.GlobalStoreAPI = api - } - - 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/vendor/github.com/ethereum/go-ethereum/cmd/swarm/db.go b/vendor/github.com/ethereum/go-ethereum/cmd/swarm/db.go deleted file mode 100644 index 7916beff..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/ethereum/go-ethereum/cmd/utils" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/cmd/swarm/download.go b/vendor/github.com/ethereum/go-ethereum/cmd/swarm/download.go deleted file mode 100644 index fcbefa02..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/ethereum/go-ethereum/cmd/utils" - "github.com/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/swarm/api" - swarm "github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/cmd/swarm/explore.go b/vendor/github.com/ethereum/go-ethereum/cmd/swarm/explore.go deleted file mode 100644 index 5b5b8bf4..00000000 --- a/vendor/github.com/ethereum/go-ethereum/cmd/swarm/explore.go +++ /dev/null @@ -1,59 +0,0 @@ -// 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 . - -// Command bzzhash computes a swarm tree hash. -package main - -import ( - "context" - "fmt" - "os" - - "github.com/ethereum/go-ethereum/cmd/utils" - "github.com/ethereum/go-ethereum/swarm/storage" - "gopkg.in/urfave/cli.v1" -) - -var hashesCommand = cli.Command{ - Action: hashes, - CustomHelpTemplate: helpTemplate, - Name: "hashes", - Usage: "print all hashes of a file to STDOUT", - ArgsUsage: "", - Description: "Prints all hashes of a file to STDOUT", -} - -func hashes(ctx *cli.Context) { - args := ctx.Args() - if len(args) < 1 { - utils.Fatalf("Usage: swarm hashes ") - } - f, err := os.Open(args[0]) - if err != nil { - utils.Fatalf("Error opening file " + args[1]) - } - defer f.Close() - - fileStore := storage.NewFileStore(&storage.FakeChunkStore{}, storage.NewFileStoreParams()) - refs, err := fileStore.GetAllReferences(context.TODO(), f, false) - if err != nil { - utils.Fatalf("%v\n", err) - } else { - for _, r := range refs { - fmt.Println(r.String()) - } - } -} diff --git a/vendor/github.com/ethereum/go-ethereum/cmd/swarm/feeds.go b/vendor/github.com/ethereum/go-ethereum/cmd/swarm/feeds.go deleted file mode 100644 index 6cd971a9..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/crypto" - - "github.com/ethereum/go-ethereum/cmd/utils" - swarm "github.com/ethereum/go-ethereum/swarm/api/client" - "github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/cmd/swarm/flags.go b/vendor/github.com/ethereum/go-ethereum/cmd/swarm/flags.go deleted file mode 100644 index 5e1ada63..00000000 --- a/vendor/github.com/ethereum/go-ethereum/cmd/swarm/flags.go +++ /dev/null @@ -1,185 +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: SwarmEnvChequebookAddr, - } - SwarmAccountFlag = cli.StringFlag{ - Name: "bzzaccount", - Usage: "Swarm account key file", - EnvVar: SwarmEnvAccount, - } - SwarmListenAddrFlag = cli.StringFlag{ - Name: "httpaddr", - Usage: "Swarm HTTP API listening interface", - EnvVar: SwarmEnvListenAddr, - } - SwarmPortFlag = cli.StringFlag{ - Name: "bzzport", - Usage: "Swarm local http api port", - EnvVar: SwarmEnvPort, - } - SwarmNetworkIdFlag = cli.IntFlag{ - Name: "bzznetworkid", - Usage: "Network identifier (integer, default 3=swarm testnet)", - EnvVar: SwarmEnvNetworkID, - } - SwarmSwapEnabledFlag = cli.BoolFlag{ - Name: "swap", - Usage: "Swarm SWAP enabled (default false)", - EnvVar: SwarmEnvSwapEnable, - } - SwarmSwapAPIFlag = cli.StringFlag{ - Name: "swap-api", - Usage: "URL of the Ethereum API provider to use to settle SWAP payments", - EnvVar: SwarmEnvSwapAPI, - } - SwarmSyncDisabledFlag = cli.BoolTFlag{ - Name: "nosync", - Usage: "Disable swarm syncing", - EnvVar: SwarmEnvSyncDisable, - } - SwarmSyncUpdateDelay = cli.DurationFlag{ - Name: "sync-update-delay", - Usage: "Duration for sync subscriptions update after no new peers are added (default 15s)", - EnvVar: SwarmEnvSyncUpdateDelay, - } - SwarmMaxStreamPeerServersFlag = cli.IntFlag{ - Name: "max-stream-peer-servers", - Usage: "Limit of Stream peer servers, 0 denotes unlimited", - EnvVar: SwarmEnvMaxStreamPeerServers, - 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: SwarmEnvLightNodeEnable, - } - SwarmDeliverySkipCheckFlag = cli.BoolFlag{ - Name: "delivery-skip-check", - Usage: "Skip chunk delivery check (default false)", - EnvVar: SwarmEnvDeliverySkipCheck, - } - 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: SwarmEnvENSAPI, - } - 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: SwarmAccessPassword, - } - 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: SwarmEnvCORS, - } - SwarmStorePath = cli.StringFlag{ - Name: "store.path", - Usage: "Path to leveldb chunk DB (default <$GETH_ENV_DIR>/swarm/bzz-<$BZZ_KEY>/chunks)", - EnvVar: SwarmEnvStorePath, - } - SwarmStoreCapacity = cli.Uint64Flag{ - Name: "store.size", - Usage: "Number of chunks (5M is roughly 20-25GB) (default 5000000)", - EnvVar: SwarmEnvStoreCapacity, - } - SwarmStoreCacheCapacity = cli.UintFlag{ - Name: "store.cache.size", - Usage: "Number of recent chunks cached in memory", - EnvVar: SwarmEnvStoreCacheCapacity, - Value: 10000, - } - SwarmCompressedFlag = cli.BoolFlag{ - Name: "compressed", - Usage: "Prints encryption keys in compressed form", - } - SwarmBootnodeModeFlag = cli.BoolFlag{ - Name: "bootnode-mode", - Usage: "Run Swarm in Bootnode mode", - } - 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", - } - SwarmGlobalStoreAPIFlag = cli.StringFlag{ - Name: "globalstore-api", - Usage: "URL of the Global Store API provider (only for testing)", - EnvVar: SwarmGlobalstoreAPI, - } -) diff --git a/vendor/github.com/ethereum/go-ethereum/cmd/swarm/fs.go b/vendor/github.com/ethereum/go-ethereum/cmd/swarm/fs.go deleted file mode 100644 index 7f156523..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/ethereum/go-ethereum/cmd/utils" - "github.com/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/rpc" - "github.com/ethereum/go-ethereum/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() - - var 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/vendor/github.com/ethereum/go-ethereum/cmd/swarm/global-store/explorer.go b/vendor/github.com/ethereum/go-ethereum/cmd/swarm/global-store/explorer.go deleted file mode 100644 index 634ff1eb..00000000 --- a/vendor/github.com/ethereum/go-ethereum/cmd/swarm/global-store/explorer.go +++ /dev/null @@ -1,66 +0,0 @@ -// 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 ( - "context" - "fmt" - "net" - "net/http" - "time" - - "github.com/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/swarm/storage/mock" - "github.com/ethereum/go-ethereum/swarm/storage/mock/explorer" - cli "gopkg.in/urfave/cli.v1" -) - -// serveChunkExplorer starts an http server in background with chunk explorer handler -// using the provided global store. Server is started if the returned shutdown function -// is not nil. -func serveChunkExplorer(ctx *cli.Context, globalStore mock.GlobalStorer) (shutdown func(), err error) { - if !ctx.IsSet("explorer-address") { - return nil, nil - } - - corsOrigins := ctx.StringSlice("explorer-cors-origin") - server := &http.Server{ - Handler: explorer.NewHandler(globalStore, corsOrigins), - IdleTimeout: 30 * time.Minute, - ReadTimeout: 2 * time.Minute, - WriteTimeout: 2 * time.Minute, - } - listener, err := net.Listen("tcp", ctx.String("explorer-address")) - if err != nil { - return nil, fmt.Errorf("explorer: %v", err) - } - log.Info("chunk explorer http", "address", listener.Addr().String(), "origins", corsOrigins) - - go func() { - if err := server.Serve(listener); err != nil { - log.Error("chunk explorer", "err", err) - } - }() - - return func() { - ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) - defer cancel() - if err := server.Shutdown(ctx); err != nil { - log.Error("chunk explorer: shutdown", "err", err) - } - }, nil -} diff --git a/vendor/github.com/ethereum/go-ethereum/cmd/swarm/global-store/global_store.go b/vendor/github.com/ethereum/go-ethereum/cmd/swarm/global-store/global_store.go deleted file mode 100644 index f93b464d..00000000 --- a/vendor/github.com/ethereum/go-ethereum/cmd/swarm/global-store/global_store.go +++ /dev/null @@ -1,120 +0,0 @@ -// 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 ( - "io" - "net" - "net/http" - "os" - - "github.com/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/rpc" - "github.com/ethereum/go-ethereum/swarm/storage/mock" - "github.com/ethereum/go-ethereum/swarm/storage/mock/db" - "github.com/ethereum/go-ethereum/swarm/storage/mock/mem" - cli "gopkg.in/urfave/cli.v1" -) - -// startHTTP starts a global store with HTTP RPC server. -// It is used for "http" cli command. -func startHTTP(ctx *cli.Context) (err error) { - server, cleanup, err := newServer(ctx) - if err != nil { - return err - } - defer cleanup() - - listener, err := net.Listen("tcp", ctx.String("addr")) - if err != nil { - return err - } - log.Info("http", "address", listener.Addr().String()) - - return http.Serve(listener, server) -} - -// startWS starts a global store with WebSocket RPC server. -// It is used for "websocket" cli command. -func startWS(ctx *cli.Context) (err error) { - server, cleanup, err := newServer(ctx) - if err != nil { - return err - } - defer cleanup() - - listener, err := net.Listen("tcp", ctx.String("addr")) - if err != nil { - return err - } - origins := ctx.StringSlice("origins") - log.Info("websocket", "address", listener.Addr().String(), "origins", origins) - - return http.Serve(listener, server.WebsocketHandler(origins)) -} - -// newServer creates a global store and starts a chunk explorer server if configured. -// Returned cleanup function should be called only if err is nil. -func newServer(ctx *cli.Context) (server *rpc.Server, cleanup func(), err error) { - log.PrintOrigins(true) - log.Root().SetHandler(log.LvlFilterHandler(log.Lvl(ctx.Int("verbosity")), log.StreamHandler(os.Stdout, log.TerminalFormat(false)))) - - cleanup = func() {} - var globalStore mock.GlobalStorer - dir := ctx.String("dir") - if dir != "" { - dbStore, err := db.NewGlobalStore(dir) - if err != nil { - return nil, nil, err - } - cleanup = func() { - if err := dbStore.Close(); err != nil { - log.Error("global store: close", "err", err) - } - } - globalStore = dbStore - log.Info("database global store", "dir", dir) - } else { - globalStore = mem.NewGlobalStore() - log.Info("in-memory global store") - } - - server = rpc.NewServer() - if err := server.RegisterName("mockStore", globalStore); err != nil { - cleanup() - return nil, nil, err - } - - shutdown, err := serveChunkExplorer(ctx, globalStore) - if err != nil { - cleanup() - return nil, nil, err - } - if shutdown != nil { - cleanup = func() { - shutdown() - - if c, ok := globalStore.(io.Closer); ok { - if err := c.Close(); err != nil { - log.Error("global store: close", "err", err) - } - } - } - } - - return server, cleanup, nil -} diff --git a/vendor/github.com/ethereum/go-ethereum/cmd/swarm/global-store/main.go b/vendor/github.com/ethereum/go-ethereum/cmd/swarm/global-store/main.go deleted file mode 100644 index 52fafc8f..00000000 --- a/vendor/github.com/ethereum/go-ethereum/cmd/swarm/global-store/main.go +++ /dev/null @@ -1,120 +0,0 @@ -// 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 ( - "os" - - "github.com/ethereum/go-ethereum/log" - cli "gopkg.in/urfave/cli.v1" -) - -var ( - version = "0.1" - gitCommit string // Git SHA1 commit hash of the release (set via linker flags) -) - -func main() { - err := newApp().Run(os.Args) - if err != nil { - log.Error(err.Error()) - os.Exit(1) - } -} - -// newApp construct a new instance of Swarm Global Store. -// Method Run is called on it in the main function and in tests. -func newApp() (app *cli.App) { - app = cli.NewApp() - app.Name = "global-store" - app.Version = version - if len(gitCommit) >= 8 { - app.Version += "-" + gitCommit[:8] - } - app.Usage = "Swarm Global Store" - - // app flags (for all commands) - app.Flags = []cli.Flag{ - cli.IntFlag{ - Name: "verbosity", - Value: 3, - Usage: "Verbosity level.", - }, - cli.StringFlag{ - Name: "explorer-address", - Value: "", - Usage: "Chunk explorer HTTP listener address.", - }, - cli.StringSliceFlag{ - Name: "explorer-cors-origin", - Value: nil, - Usage: "Chunk explorer CORS origin (can be specified multiple times).", - }, - } - - app.Commands = []cli.Command{ - { - Name: "http", - Aliases: []string{"h"}, - Usage: "Start swarm global store with HTTP server.", - Action: startHTTP, - // Flags only for "start" command. - // Allow app flags to be specified after the - // command argument. - Flags: append(app.Flags, - cli.StringFlag{ - Name: "dir", - Value: "", - Usage: "Data directory.", - }, - cli.StringFlag{ - Name: "addr", - Value: "0.0.0.0:3033", - Usage: "Address to listen for HTTP connections.", - }, - ), - }, - { - Name: "websocket", - Aliases: []string{"ws"}, - Usage: "Start swarm global store with WebSocket server.", - Action: startWS, - // Flags only for "start" command. - // Allow app flags to be specified after the - // command argument. - Flags: append(app.Flags, - cli.StringFlag{ - Name: "dir", - Value: "", - Usage: "Data directory.", - }, - cli.StringFlag{ - Name: "addr", - Value: "0.0.0.0:3033", - Usage: "Address to listen for WebSocket connections.", - }, - cli.StringSliceFlag{ - Name: "origin", - Value: nil, - Usage: "WebSocket CORS origin (can be specified multiple times).", - }, - ), - }, - } - - return app -} diff --git a/vendor/github.com/ethereum/go-ethereum/cmd/swarm/hash.go b/vendor/github.com/ethereum/go-ethereum/cmd/swarm/hash.go deleted file mode 100644 index 2df02c0e..00000000 --- a/vendor/github.com/ethereum/go-ethereum/cmd/swarm/hash.go +++ /dev/null @@ -1,115 +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" - "encoding/hex" - "fmt" - "os" - - "github.com/ethereum/go-ethereum/cmd/utils" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/contracts/ens" - "github.com/ethereum/go-ethereum/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", - Subcommands: []cli.Command{ - { - CustomHelpTemplate: helpTemplate, - Name: "ens", - Usage: "converts a swarm hash to an ens EIP1577 compatible CIDv1 hash", - ArgsUsage: "", - Description: "", - Subcommands: []cli.Command{ - { - Action: encodeEipHash, - CustomHelpTemplate: helpTemplate, - Name: "contenthash", - Usage: "converts a swarm hash to an ens EIP1577 compatible CIDv1 hash", - ArgsUsage: "", - Description: "", - }, - { - Action: ensNodeHash, - CustomHelpTemplate: helpTemplate, - Name: "node", - Usage: "converts an ens name to an ENS node hash", - ArgsUsage: "", - Description: "", - }, - }, - }, - }} - -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) - } -} -func ensNodeHash(ctx *cli.Context) { - args := ctx.Args() - if len(args) < 1 { - utils.Fatalf("Usage: swarm hash ens node ") - } - ensName := args[0] - - hash := ens.EnsNode(ensName) - - stringHex := hex.EncodeToString(hash[:]) - fmt.Println(stringHex) -} -func encodeEipHash(ctx *cli.Context) { - args := ctx.Args() - if len(args) < 1 { - utils.Fatalf("Usage: swarm hash ens ") - } - swarmHash := args[0] - - hash := common.HexToHash(swarmHash) - ensHash, err := ens.EncodeSwarmHash(hash) - if err != nil { - utils.Fatalf("error converting swarm hash", err) - } - - stringHex := hex.EncodeToString(ensHash) - fmt.Println(stringHex) -} diff --git a/vendor/github.com/ethereum/go-ethereum/cmd/swarm/list.go b/vendor/github.com/ethereum/go-ethereum/cmd/swarm/list.go deleted file mode 100644 index 5d35154a..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/ethereum/go-ethereum/cmd/utils" - swarm "github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/cmd/swarm/main.go b/vendor/github.com/ethereum/go-ethereum/cmd/swarm/main.go deleted file mode 100644 index a4041eb3..00000000 --- a/vendor/github.com/ethereum/go-ethereum/cmd/swarm/main.go +++ /dev/null @@ -1,475 +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/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/crypto" - "github.com/ethereum/go-ethereum/internal/debug" - "github.com/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/node" - "github.com/ethereum/go-ethereum/p2p/enode" - "github.com/ethereum/go-ethereum/rpc" - "github.com/ethereum/go-ethereum/swarm" - bzzapi "github.com/ethereum/go-ethereum/swarm/api" - swarmmetrics "github.com/ethereum/go-ethereum/swarm/metrics" - "github.com/ethereum/go-ethereum/swarm/storage/mock" - mockrpc "github.com/ethereum/go-ethereum/swarm/storage/mock/rpc" - "github.com/ethereum/go-ethereum/swarm/tracing" - sv "github.com/ethereum/go-ethereum/swarm/version" - - cli "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}} -` - -// Git SHA1 commit hash of the release (set via linker flags) -// this variable will be assigned if corresponding parameter is passed with install, but not with test -// e.g.: go install -ldflags "-X main.gitCommit=ed1312d01b19e04ef578946226e5d8069d5dfd5a" ./cmd/swarm -var gitCommit string - -//declare a few constant error messages, useful for later error check comparisons in test -var ( - SwarmErrNoBZZAccount = "bzzaccount option is required but not set; check your config file, command line or environment variables" - SwarmErrSwapSetNoAPI = "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() { - sv.GitCommit = gitCommit - 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, - // hashesCommand - hashesCommand, - } - - // 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.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, - // bootnode mode - SwarmBootnodeModeFlag, - // storage flags - SwarmStorePath, - SwarmStoreCapacity, - SwarmStoreCacheCapacity, - SwarmGlobalStoreAPIFlag, - } - 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) - pubkey := crypto.FromECDSAPub(&privateKey.PublicKey) - pubkeyhex := hex.EncodeToString(pubkey) - pubCompressed := hex.EncodeToString(crypto.CompressPubkey(&privateKey.PublicKey)) - bzzkey := crypto.Keccak256Hash(pubkey).Hex() - - if !ctx.Bool(SwarmCompressedFlag.Name) { - fmt.Println(fmt.Sprintf("bzzkey=%s", bzzkey[2:])) - fmt.Println(fmt.Sprintf("publicKey=%s", pubkeyhex)) - } - 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) - - //disable dynamic dialing from p2p/discovery - cfg.P2P.NoDial = true - - stack, err := node.New(&cfg) - if err != nil { - utils.Fatalf("can't create node: %v", err) - } - defer stack.Close() - - //a few steps need to be done after the config phase is completed, - //due to overriding behavior - err = initSwarmNode(bzzconfig, stack, ctx, &cfg) - if err != nil { - return err - } - //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() - }() - - // add swarm bootnodes, because swarm doesn't use p2p package's discovery discv5 - go func() { - s := stack.Server() - - for _, n := range cfg.P2P.BootstrapNodes { - s.AddPeer(n) - } - }() - - 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) { - var nodeStore *mock.NodeStore - if bzzconfig.GlobalStoreAPI != "" { - // connect to global store - client, err := rpc.Dial(bzzconfig.GlobalStoreAPI) - if err != nil { - return nil, fmt.Errorf("global store: %v", err) - } - globalStore := mockrpc.NewGlobalStore(client) - // create a node store for this swarm key on global store - nodeStore = globalStore.NewNodeStore(common.HexToAddress(bzzconfig.BzzKey)) - } - return swarm.NewSwarm(bzzconfig, nodeStore) - } - //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(SwarmErrNoBZZAccount) - } - // 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) - } - defer stack.Close() - - 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) - } - -} diff --git a/vendor/github.com/ethereum/go-ethereum/cmd/swarm/manifest.go b/vendor/github.com/ethereum/go-ethereum/cmd/swarm/manifest.go deleted file mode 100644 index 312c72fa..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/ethereum/go-ethereum/cmd/utils" - "github.com/ethereum/go-ethereum/swarm/api" - swarm "github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/cmd/swarm/mimegen/generator.go b/vendor/github.com/ethereum/go-ethereum/cmd/swarm/mimegen/generator.go deleted file mode 100644 index 68f9e306..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/cmd/swarm/mimegen/mime.types b/vendor/github.com/ethereum/go-ethereum/cmd/swarm/mimegen/mime.types deleted file mode 100644 index 1bdf2114..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/cmd/swarm/swarm-smoke/feed_upload_and_sync.go b/vendor/github.com/ethereum/go-ethereum/cmd/swarm/swarm-smoke/feed_upload_and_sync.go deleted file mode 100644 index 6b3fed0c..00000000 --- a/vendor/github.com/ethereum/go-ethereum/cmd/swarm/swarm-smoke/feed_upload_and_sync.go +++ /dev/null @@ -1,291 +0,0 @@ -package main - -import ( - "bytes" - "crypto/md5" - "fmt" - "io" - "io/ioutil" - "os" - "os/exec" - "strings" - "sync" - "time" - - "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/metrics" - "github.com/ethereum/go-ethereum/swarm/storage/feed" - "github.com/ethereum/go-ethereum/swarm/testutil" - "github.com/pborman/uuid" - cli "gopkg.in/urfave/cli.v1" -) - -const ( - feedRandomDataLength = 8 -) - -func feedUploadAndSyncCmd(ctx *cli.Context, tuid string) error { - errc := make(chan error) - - go func() { - errc <- feedUploadAndSync(ctx, tuid) - }() - - select { - case err := <-errc: - if err != nil { - metrics.GetOrRegisterCounter(fmt.Sprintf("%s.fail", commandName), nil).Inc(1) - } - return err - case <-time.After(time.Duration(timeout) * time.Second): - metrics.GetOrRegisterCounter(fmt.Sprintf("%s.timeout", commandName), nil).Inc(1) - - return fmt.Errorf("timeout after %v sec", timeout) - } -} - -func feedUploadAndSync(c *cli.Context, tuid string) error { - log.Info("generating and uploading feeds to " + httpEndpoint(hosts[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", httpEndpoint(hosts[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", httpEndpoint(hosts[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", httpEndpoint(hosts[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", httpEndpoint(hosts[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", httpEndpoint(hosts[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", httpEndpoint(hosts[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 _, host := range hosts { - // 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, httpEndpoint(host), dataHash, ruid) - if err != nil { - continue - } - - wg.Done() - return - } - }(hex, httpEndpoint(host), ruid) - } - } - wg.Wait() - log.Info("all endpoints synced random data successfully") - - // upload test file - log.Info("feed uploading to "+httpEndpoint(hosts[0])+" and syncing", "seed", seed) - - randomBytes := testutil.RandomBytes(seed, filesize*1000) - - hash, err := upload(randomBytes, httpEndpoint(hosts[0])) - if err != nil { - return err - } - hashBytes, err := hexutil.Decode("0x" + hash) - if err != nil { - return err - } - multihashHex := hexutil.Encode(hashBytes) - fileHash := h.Sum(nil) - - log.Info("uploaded successfully", "hash", hash, "digest", fmt.Sprintf("%x", fileHash)) - - // update file with topic - cmd = exec.Command("swarm", "--bzzaccount", pkFile.Name(), "--bzzapi", httpEndpoint(hosts[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", httpEndpoint(hosts[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", httpEndpoint(hosts[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 _, host := range hosts { - - // 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, httpEndpoint(host), ruid) - } - - } - wg.Wait() - log.Info("all endpoints synced random file successfully") - - return nil -} diff --git a/vendor/github.com/ethereum/go-ethereum/cmd/swarm/swarm-smoke/main.go b/vendor/github.com/ethereum/go-ethereum/cmd/swarm/swarm-smoke/main.go deleted file mode 100644 index 860fbcc1..00000000 --- a/vendor/github.com/ethereum/go-ethereum/cmd/swarm/swarm-smoke/main.go +++ /dev/null @@ -1,197 +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/ethereum/go-ethereum/cmd/utils" - gethmetrics "github.com/ethereum/go-ethereum/metrics" - "github.com/ethereum/go-ethereum/metrics/influxdb" - swarmmetrics "github.com/ethereum/go-ethereum/swarm/metrics" - "github.com/ethereum/go-ethereum/swarm/tracing" - - "github.com/ethereum/go-ethereum/log" - - cli "gopkg.in/urfave/cli.v1" -) - -var ( - gitCommit string // Git SHA1 commit hash of the release (set via linker flags) -) - -var ( - allhosts string - hosts []string - filesize int - inputSeed int - syncDelay int - httpPort int - wsPort int - verbosity int - timeout int - single bool - trackTimeout int -) - -func main() { - - app := cli.NewApp() - app.Name = "smoke-test" - app.Usage = "" - - app.Flags = []cli.Flag{ - cli.StringFlag{ - Name: "hosts", - Value: "", - Usage: "comma-separated list of swarm hosts", - Destination: &allhosts, - }, - cli.IntFlag{ - Name: "http-port", - Value: 80, - Usage: "http port", - Destination: &httpPort, - }, - cli.IntFlag{ - Name: "ws-port", - Value: 8546, - Usage: "ws port", - Destination: &wsPort, - }, - cli.IntFlag{ - Name: "seed", - Value: 0, - Usage: "input seed in case we need deterministic upload", - Destination: &inputSeed, - }, - 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, - }, - cli.IntFlag{ - Name: "track-timeout", - Value: 5, - Usage: "timeout in seconds to wait for GetAllReferences to return", - Destination: &trackTimeout, - }, - } - - app.Flags = append(app.Flags, []cli.Flag{ - utils.MetricsEnabledFlag, - swarmmetrics.MetricsInfluxDBEndpointFlag, - swarmmetrics.MetricsInfluxDBDatabaseFlag, - swarmmetrics.MetricsInfluxDBUsernameFlag, - swarmmetrics.MetricsInfluxDBPasswordFlag, - swarmmetrics.MetricsInfluxDBTagsFlag, - }...) - - app.Flags = append(app.Flags, tracing.Flags...) - - app.Commands = []cli.Command{ - { - Name: "upload_and_sync", - Aliases: []string{"c"}, - Usage: "upload and sync", - Action: wrapCliCommand("upload-and-sync", uploadAndSyncCmd), - }, - { - Name: "feed_sync", - Aliases: []string{"f"}, - Usage: "feed update generate, upload and sync", - Action: wrapCliCommand("feed-and-sync", feedUploadAndSyncCmd), - }, - { - Name: "upload_speed", - Aliases: []string{"u"}, - Usage: "measure upload speed", - Action: wrapCliCommand("upload-speed", uploadSpeedCmd), - }, - { - Name: "sliding_window", - Aliases: []string{"s"}, - Usage: "measure network aggregate capacity", - Action: wrapCliCommand("sliding-window", slidingWindowCmd), - }, - } - - 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) - tags = ctx.GlobalString(swarmmetrics.MetricsInfluxDBTagsFlag.Name) - ) - - tagsMap := utils.SplitTagsFlag(tags) - tagsMap["version"] = gitCommit - tagsMap["filesize"] = fmt.Sprintf("%v", filesize) - - return influxdb.InfluxDBWithTagsOnce(gethmetrics.DefaultRegistry, endpoint, database, username, password, "swarm-smoke.", tagsMap) - } - - return nil -} diff --git a/vendor/github.com/ethereum/go-ethereum/cmd/swarm/swarm-smoke/sliding_window.go b/vendor/github.com/ethereum/go-ethereum/cmd/swarm/swarm-smoke/sliding_window.go deleted file mode 100644 index d589124b..00000000 --- a/vendor/github.com/ethereum/go-ethereum/cmd/swarm/swarm-smoke/sliding_window.go +++ /dev/null @@ -1,145 +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" - "fmt" - "math/rand" - "time" - - "github.com/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/metrics" - "github.com/ethereum/go-ethereum/swarm/testutil" - "github.com/pborman/uuid" - - cli "gopkg.in/urfave/cli.v1" -) - -type uploadResult struct { - hash string - digest []byte -} - -func slidingWindowCmd(ctx *cli.Context, tuid string) error { - errc := make(chan error) - - go func() { - errc <- slidingWindow(ctx, tuid) - }() - - err := <-errc - if err != nil { - metrics.GetOrRegisterCounter(fmt.Sprintf("%s.fail", commandName), nil).Inc(1) - } - return err -} - -func slidingWindow(ctx *cli.Context, tuid string) error { - var hashes []uploadResult //swarm hashes of the uploads - nodes := len(hosts) - log.Info("sliding window test started", "tuid", tuid, "nodes", nodes, "filesize(kb)", filesize, "timeout", timeout) - uploadedBytes := 0 - networkDepth := 0 - errored := false - -outer: - for { - seed = int(time.Now().UTC().UnixNano()) - log.Info("uploading to "+httpEndpoint(hosts[0])+" and syncing", "seed", seed) - - t1 := time.Now() - - randomBytes := testutil.RandomBytes(seed, filesize*1000) - - hash, err := upload(randomBytes, httpEndpoint(hosts[0])) - if err != nil { - log.Error(err.Error()) - return err - } - - metrics.GetOrRegisterResettingTimer("sliding-window.upload-time", nil).UpdateSince(t1) - metrics.GetOrRegisterGauge("sliding-window.upload-depth", nil).Update(int64(len(hashes))) - - 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), "sleeping", syncDelay) - hashes = append(hashes, uploadResult{hash: hash, digest: fhash}) - time.Sleep(time.Duration(syncDelay) * time.Second) - uploadedBytes += filesize * 1000 - q := make(chan struct{}, 1) - d := make(chan struct{}) - defer close(q) - defer close(d) - for i, v := range hashes { - timeoutC := time.After(time.Duration(timeout) * time.Second) - errored = false - - task: - for { - select { - case q <- struct{}{}: - go func() { - var start time.Time - done := false - for !done { - log.Info("trying to retrieve hash", "hash", v.hash) - idx := 1 + rand.Intn(len(hosts)-1) - ruid := uuid.New()[:8] - start = time.Now() - // fetch hangs when swarm dies out, so we have to jump through a bit more hoops to actually - // catch the timeout, but also allow this retry logic - err := fetch(v.hash, httpEndpoint(hosts[idx]), v.digest, ruid, "") - if err != nil { - log.Error("error fetching hash", "err", err) - continue - } - done = true - } - metrics.GetOrRegisterResettingTimer("sliding-window.single.fetch-time", nil).UpdateSince(start) - d <- struct{}{} - }() - case <-d: - <-q - break task - case <-timeoutC: - errored = true - log.Error("error retrieving hash. timeout", "hash idx", i) - metrics.GetOrRegisterCounter("sliding-window.single.error", nil).Inc(1) - break outer - default: - } - } - - networkDepth = i - metrics.GetOrRegisterGauge("sliding-window.network-depth", nil).Update(int64(networkDepth)) - log.Info("sliding window test successfully fetched file", "currentDepth", networkDepth) - // this test might take a long time to finish - but we'd like to see metrics while they accumulate and not just when - // the test finishes. therefore emit the metrics on each iteration - emitMetrics(ctx) - } - } - - log.Info("sliding window test finished", "errored?", errored, "networkDepth", networkDepth, "networkDepth(kb)", networkDepth*filesize) - log.Info("stats", "uploadedFiles", len(hashes), "uploadedKb", uploadedBytes/1000, "filesizeKb", filesize) - - return nil -} diff --git a/vendor/github.com/ethereum/go-ethereum/cmd/swarm/swarm-smoke/upload_and_sync.go b/vendor/github.com/ethereum/go-ethereum/cmd/swarm/swarm-smoke/upload_and_sync.go deleted file mode 100644 index 6c20a4fa..00000000 --- a/vendor/github.com/ethereum/go-ethereum/cmd/swarm/swarm-smoke/upload_and_sync.go +++ /dev/null @@ -1,207 +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" - "fmt" - "io/ioutil" - "math/rand" - "os" - "strings" - "sync" - "time" - - "github.com/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/metrics" - "github.com/ethereum/go-ethereum/rpc" - "github.com/ethereum/go-ethereum/swarm/api" - "github.com/ethereum/go-ethereum/swarm/storage" - "github.com/ethereum/go-ethereum/swarm/testutil" - "github.com/pborman/uuid" - - cli "gopkg.in/urfave/cli.v1" -) - -func uploadAndSyncCmd(ctx *cli.Context, tuid string) error { - // use input seed if it has been set - if inputSeed != 0 { - seed = inputSeed - } - - randomBytes := testutil.RandomBytes(seed, filesize*1000) - - errc := make(chan error) - - go func() { - errc <- uploadAndSync(ctx, randomBytes, tuid) - }() - - var err error - select { - case err = <-errc: - if err != nil { - metrics.GetOrRegisterCounter(fmt.Sprintf("%s.fail", commandName), nil).Inc(1) - } - case <-time.After(time.Duration(timeout) * time.Second): - metrics.GetOrRegisterCounter(fmt.Sprintf("%s.timeout", commandName), nil).Inc(1) - - err = fmt.Errorf("timeout after %v sec", timeout) - } - - // trigger debug functionality on randomBytes - e := trackChunks(randomBytes[:]) - if e != nil { - log.Error(e.Error()) - } - - return err -} - -func trackChunks(testData []byte) error { - addrs, err := getAllRefs(testData) - if err != nil { - return err - } - - for i, ref := range addrs { - log.Trace(fmt.Sprintf("ref %d", i), "ref", ref) - } - - for _, host := range hosts { - httpHost := fmt.Sprintf("ws://%s:%d", host, 8546) - - hostChunks := []string{} - - rpcClient, err := rpc.Dial(httpHost) - if err != nil { - log.Error("error dialing host", "err", err, "host", httpHost) - continue - } - - var hasInfo []api.HasInfo - err = rpcClient.Call(&hasInfo, "bzz_has", addrs) - if err != nil { - log.Error("error calling rpc client", "err", err, "host", httpHost) - continue - } - - count := 0 - for _, info := range hasInfo { - if info.Has { - hostChunks = append(hostChunks, "1") - } else { - hostChunks = append(hostChunks, "0") - count++ - } - } - - if count == 0 { - log.Info("host reported to have all chunks", "host", host) - } - - log.Trace("chunks", "chunks", strings.Join(hostChunks, ""), "host", host) - } - return nil -} - -func getAllRefs(testData []byte) (storage.AddressCollection, error) { - datadir, err := ioutil.TempDir("", "chunk-debug") - if err != nil { - return nil, fmt.Errorf("unable to create temp dir: %v", err) - } - defer os.RemoveAll(datadir) - fileStore, err := storage.NewLocalFileStore(datadir, make([]byte, 32)) - if err != nil { - return nil, err - } - ctx, cancel := context.WithTimeout(context.Background(), time.Duration(trackTimeout)*time.Second) - defer cancel() - - reader := bytes.NewReader(testData) - return fileStore.GetAllReferences(ctx, reader, false) -} - -func uploadAndSync(c *cli.Context, randomBytes []byte, tuid string) error { - log.Info("uploading to "+httpEndpoint(hosts[0])+" and syncing", "tuid", tuid, "seed", seed) - - t1 := time.Now() - hash, err := upload(randomBytes, httpEndpoint(hosts[0])) - if err != nil { - log.Error(err.Error()) - return err - } - t2 := time.Since(t1) - metrics.GetOrRegisterResettingTimer("upload-and-sync.upload-time", nil).Update(t2) - - fhash, err := digest(bytes.NewReader(randomBytes)) - if err != nil { - log.Error(err.Error()) - return err - } - - log.Info("uploaded successfully", "tuid", tuid, "hash", hash, "took", t2, "digest", fmt.Sprintf("%x", fhash)) - - time.Sleep(time.Duration(syncDelay) * time.Second) - - wg := sync.WaitGroup{} - if single { - randIndex := 1 + rand.Intn(len(hosts)-1) - ruid := uuid.New()[:8] - wg.Add(1) - go func(endpoint string, ruid string) { - for { - start := time.Now() - err := fetch(hash, endpoint, fhash, ruid, tuid) - if err != nil { - continue - } - ended := time.Since(start) - - metrics.GetOrRegisterResettingTimer("upload-and-sync.single.fetch-time", nil).Update(ended) - log.Info("fetch successful", "tuid", tuid, "ruid", ruid, "took", ended, "endpoint", endpoint) - wg.Done() - return - } - }(httpEndpoint(hosts[randIndex]), ruid) - } else { - for _, endpoint := range hosts[1:] { - ruid := uuid.New()[:8] - wg.Add(1) - go func(endpoint string, ruid string) { - for { - start := time.Now() - err := fetch(hash, endpoint, fhash, ruid, tuid) - if err != nil { - continue - } - ended := time.Since(start) - - metrics.GetOrRegisterResettingTimer("upload-and-sync.each.fetch-time", nil).Update(ended) - log.Info("fetch successful", "tuid", tuid, "ruid", ruid, "took", ended, "endpoint", endpoint) - wg.Done() - return - } - }(httpEndpoint(endpoint), ruid) - } - } - wg.Wait() - log.Info("all hosts synced random file successfully") - - return nil -} diff --git a/vendor/github.com/ethereum/go-ethereum/cmd/swarm/swarm-smoke/upload_speed.go b/vendor/github.com/ethereum/go-ethereum/cmd/swarm/swarm-smoke/upload_speed.go deleted file mode 100644 index 20bf7b86..00000000 --- a/vendor/github.com/ethereum/go-ethereum/cmd/swarm/swarm-smoke/upload_speed.go +++ /dev/null @@ -1,73 +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" - "fmt" - "time" - - "github.com/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/metrics" - "github.com/ethereum/go-ethereum/swarm/testutil" - - cli "gopkg.in/urfave/cli.v1" -) - -func uploadSpeedCmd(ctx *cli.Context, tuid string) error { - log.Info("uploading to "+hosts[0], "tuid", tuid, "seed", seed) - randomBytes := testutil.RandomBytes(seed, filesize*1000) - - errc := make(chan error) - - go func() { - errc <- uploadSpeed(ctx, tuid, randomBytes) - }() - - select { - case err := <-errc: - if err != nil { - metrics.GetOrRegisterCounter(fmt.Sprintf("%s.fail", commandName), nil).Inc(1) - } - return err - case <-time.After(time.Duration(timeout) * time.Second): - metrics.GetOrRegisterCounter(fmt.Sprintf("%s.timeout", commandName), nil).Inc(1) - - // trigger debug functionality on randomBytes - - return fmt.Errorf("timeout after %v sec", timeout) - } -} - -func uploadSpeed(c *cli.Context, tuid string, data []byte) error { - t1 := time.Now() - hash, err := upload(data, hosts[0]) - if err != nil { - log.Error(err.Error()) - return err - } - metrics.GetOrRegisterCounter("upload-speed.upload-time", nil).Inc(int64(time.Since(t1))) - - fhash, err := digest(bytes.NewReader(data)) - if err != nil { - log.Error(err.Error()) - return err - } - - log.Info("uploaded successfully", "hash", hash, "digest", fmt.Sprintf("%x", fhash)) - return nil -} diff --git a/vendor/github.com/ethereum/go-ethereum/cmd/swarm/swarm-smoke/util.go b/vendor/github.com/ethereum/go-ethereum/cmd/swarm/swarm-smoke/util.go deleted file mode 100644 index 87abb44b..00000000 --- a/vendor/github.com/ethereum/go-ethereum/cmd/swarm/swarm-smoke/util.go +++ /dev/null @@ -1,235 +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" - "strings" - "time" - - "github.com/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/metrics" - "github.com/ethereum/go-ethereum/swarm/api" - "github.com/ethereum/go-ethereum/swarm/api/client" - "github.com/ethereum/go-ethereum/swarm/spancontext" - opentracing "github.com/opentracing/opentracing-go" - "github.com/pborman/uuid" - cli "gopkg.in/urfave/cli.v1" -) - -var ( - commandName = "" - seed = int(time.Now().UTC().UnixNano()) -) - -func init() { - rand.Seed(int64(seed)) -} - -func httpEndpoint(host string) string { - return fmt.Sprintf("http://%s:%d", host, httpPort) -} - -func wsEndpoint(host string) string { - return fmt.Sprintf("ws://%s:%d", host, wsPort) -} - -func wrapCliCommand(name string, command func(*cli.Context, string) error) func(*cli.Context) error { - return func(ctx *cli.Context) error { - log.PrintOrigins(true) - log.Root().SetHandler(log.LvlFilterHandler(log.Lvl(verbosity), log.StreamHandler(os.Stdout, log.TerminalFormat(false)))) - - // test uuid - tuid := uuid.New()[:8] - - commandName = name - - hosts = strings.Split(allhosts, ",") - - defer func(now time.Time) { - totalTime := time.Since(now) - log.Info("total time", "tuid", tuid, "time", totalTime, "kb", filesize) - metrics.GetOrRegisterResettingTimer(name+".total-time", nil).Update(totalTime) - }(time.Now()) - - log.Info("smoke test starting", "tuid", tuid, "task", name, "timeout", timeout) - metrics.GetOrRegisterCounter(name, nil).Inc(1) - - return command(ctx, tuid) - } -} - -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 -} - -// 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, tuid string) error { - ctx, sp := spancontext.StartSpan(context.Background(), "upload-and-sync.fetch") - defer sp.Finish() - - log.Info("http get request", "tuid", tuid, "ruid", ruid, "endpoint", 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(commandName+" - http get", commandName, 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.Info("http get response", "tuid", tuid, "ruid", ruid, "endpoint", 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 an arbitrary byte as a plaintext file to `endpoint` using the api client -func upload(data []byte, endpoint string) (string, error) { - swarm := client.NewClient(endpoint) - f := &client.File{ - ReadCloser: ioutil.NopCloser(bytes.NewReader(data)), - ManifestEntry: api.ManifestEntry{ - ContentType: "text/plain", - Mode: 0660, - Size: int64(len(data)), - }, - } - - // 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/vendor/github.com/ethereum/go-ethereum/cmd/swarm/swarm-snapshot/create.go b/vendor/github.com/ethereum/go-ethereum/cmd/swarm/swarm-snapshot/create.go deleted file mode 100644 index 434561a4..00000000 --- a/vendor/github.com/ethereum/go-ethereum/cmd/swarm/swarm-snapshot/create.go +++ /dev/null @@ -1,160 +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" - "encoding/json" - "errors" - "fmt" - "io/ioutil" - "os" - "path" - "path/filepath" - "strings" - "sync" - "time" - - "github.com/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/node" - "github.com/ethereum/go-ethereum/p2p/simulations" - "github.com/ethereum/go-ethereum/p2p/simulations/adapters" - "github.com/ethereum/go-ethereum/swarm/network" - "github.com/ethereum/go-ethereum/swarm/network/simulation" - cli "gopkg.in/urfave/cli.v1" -) - -// create is used as the entry function for "create" app command. -func create(ctx *cli.Context) error { - log.PrintOrigins(true) - log.Root().SetHandler(log.LvlFilterHandler(log.Lvl(ctx.Int("verbosity")), log.StreamHandler(os.Stdout, log.TerminalFormat(true)))) - - if len(ctx.Args()) < 1 { - return errors.New("argument should be the filename to verify or write-to") - } - filename, err := touchPath(ctx.Args()[0]) - if err != nil { - return err - } - return createSnapshot(filename, ctx.Int("nodes"), strings.Split(ctx.String("services"), ",")) -} - -// createSnapshot creates a new snapshot on filesystem with provided filename, -// number of nodes and service names. -func createSnapshot(filename string, nodes int, services []string) (err error) { - log.Debug("create snapshot", "filename", filename, "nodes", nodes, "services", services) - - sim := simulation.New(map[string]simulation.ServiceFunc{ - "bzz": func(ctx *adapters.ServiceContext, bucket *sync.Map) (node.Service, func(), error) { - addr := network.NewAddr(ctx.Config.Node()) - kad := network.NewKademlia(addr.Over(), network.NewKadParams()) - hp := network.NewHiveParams() - hp.KeepAliveInterval = time.Duration(200) * time.Millisecond - hp.Discovery = true // discovery must be enabled when creating a snapshot - - // store the kademlia in the bucket, needed later in the WaitTillHealthy function - bucket.Store(simulation.BucketKeyKademlia, kad) - - config := &network.BzzConfig{ - OverlayAddr: addr.Over(), - UnderlayAddr: addr.Under(), - HiveParams: hp, - } - return network.NewBzz(config, kad, nil, nil, nil), nil, nil - }, - }) - defer sim.Close() - - ids, err := sim.AddNodes(nodes) - if err != nil { - return fmt.Errorf("add nodes: %v", err) - } - - err = sim.Net.ConnectNodesRing(ids) - if err != nil { - return fmt.Errorf("connect nodes: %v", err) - } - - ctx, cancelSimRun := context.WithTimeout(context.Background(), 3*time.Minute) - defer cancelSimRun() - if _, err := sim.WaitTillHealthy(ctx); err != nil { - return fmt.Errorf("wait for healthy kademlia: %v", err) - } - - var snap *simulations.Snapshot - if len(services) > 0 { - // If service names are provided, include them in the snapshot. - // But, check if "bzz" service is not among them to remove it - // form the snapshot as it exists on snapshot creation. - var removeServices []string - var wantBzz bool - for _, s := range services { - if s == "bzz" { - wantBzz = true - break - } - } - if !wantBzz { - removeServices = []string{"bzz"} - } - snap, err = sim.Net.SnapshotWithServices(services, removeServices) - } else { - snap, err = sim.Net.Snapshot() - } - if err != nil { - return fmt.Errorf("create snapshot: %v", err) - } - jsonsnapshot, err := json.Marshal(snap) - if err != nil { - return fmt.Errorf("json encode snapshot: %v", err) - } - return ioutil.WriteFile(filename, jsonsnapshot, 0666) -} - -// touchPath creates an empty file and all subdirectories -// that are missing. -func touchPath(filename string) (string, error) { - if path.IsAbs(filename) { - if _, err := os.Stat(filename); err == nil { - // path exists, overwrite - return filename, nil - } - } - - d, f := path.Split(filename) - dir, err := filepath.Abs(filepath.Dir(os.Args[0])) - if err != nil { - return "", err - } - - _, err = os.Stat(path.Join(dir, filename)) - if err == nil { - // path exists, overwrite - return filename, nil - } - - dirPath := path.Join(dir, d) - filePath := path.Join(dirPath, f) - if d != "" { - err = os.MkdirAll(dirPath, os.ModeDir) - if err != nil { - return "", err - } - } - - return filePath, nil -} diff --git a/vendor/github.com/ethereum/go-ethereum/cmd/swarm/swarm-snapshot/main.go b/vendor/github.com/ethereum/go-ethereum/cmd/swarm/swarm-snapshot/main.go deleted file mode 100644 index 136295e5..00000000 --- a/vendor/github.com/ethereum/go-ethereum/cmd/swarm/swarm-snapshot/main.go +++ /dev/null @@ -1,82 +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 ( - "os" - - "github.com/ethereum/go-ethereum/cmd/utils" - "github.com/ethereum/go-ethereum/log" - cli "gopkg.in/urfave/cli.v1" -) - -var gitCommit string // Git SHA1 commit hash of the release (set via linker flags) - -// default value for "create" command --nodes flag -const defaultNodes = 8 - -func main() { - err := newApp().Run(os.Args) - if err != nil { - log.Error(err.Error()) - os.Exit(1) - } -} - -// newApp construct a new instance of Swarm Snapshot Utility. -// Method Run is called on it in the main function and in tests. -func newApp() (app *cli.App) { - app = utils.NewApp(gitCommit, "Swarm Snapshot Utility") - - app.Name = "swarm-snapshot" - app.Usage = "" - - // app flags (for all commands) - app.Flags = []cli.Flag{ - cli.IntFlag{ - Name: "verbosity", - Value: 1, - Usage: "verbosity level", - }, - } - - app.Commands = []cli.Command{ - { - Name: "create", - Aliases: []string{"c"}, - Usage: "create a swarm snapshot", - Action: create, - // Flags only for "create" command. - // Allow app flags to be specified after the - // command argument. - Flags: append(app.Flags, - cli.IntFlag{ - Name: "nodes", - Value: defaultNodes, - Usage: "number of nodes", - }, - cli.StringFlag{ - Name: "services", - Value: "bzz", - Usage: "comma separated list of services to boot the nodes with", - }, - ), - }, - } - - return app -} diff --git a/vendor/github.com/ethereum/go-ethereum/cmd/swarm/upload.go b/vendor/github.com/ethereum/go-ethereum/cmd/swarm/upload.go deleted file mode 100644 index ab079083..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/ethereum/go-ethereum/log" - swarm "github.com/ethereum/go-ethereum/swarm/api/client" - - "github.com/ethereum/go-ethereum/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(SwarmAutoDefaultPath); autoDefaultPathString != "" { - b, err := strconv.ParseBool(autoDefaultPathString) - if err != nil { - utils.Fatalf("invalid environment variable %s: %v", SwarmAutoDefaultPath, 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/vendor/github.com/ethereum/go-ethereum/cmd/utils/cmd.go b/vendor/github.com/ethereum/go-ethereum/cmd/utils/cmd.go index 74a8c7f3..a3ee45ba 100644 --- a/vendor/github.com/ethereum/go-ethereum/cmd/utils/cmd.go +++ b/vendor/github.com/ethereum/go-ethereum/cmd/utils/cmd.go @@ -302,6 +302,8 @@ func ExportPreimages(db ethdb.Database, 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/vendor/github.com/ethereum/go-ethereum/cmd/utils/flags.go b/vendor/github.com/ethereum/go-ethereum/cmd/utils/flags.go index e4bb18a8..9ace9be7 100644 --- a/vendor/github.com/ethereum/go-ethereum/cmd/utils/flags.go +++ b/vendor/github.com/ethereum/go-ethereum/cmd/utils/flags.go @@ -51,6 +51,7 @@ import ( "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" @@ -60,6 +61,8 @@ import ( "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/statediff" whisper "github.com/ethereum/go-ethereum/whisper/whisperv6" + + pcsclite "github.com/gballet/go-libpcsclite" ) var ( @@ -93,16 +96,13 @@ GLOBAL OPTIONS: } // 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 } @@ -121,6 +121,10 @@ var ( Usage: "Data directory for the databases and keystore", Value: DirectoryString{node.DefaultDataDir()}, } + AncientFlag = DirectoryFlag{ + Name: "datadir.ancient", + Usage: "Data directory for ancient chain segments (default = inside chaindata)", + } KeyStoreDirFlag = DirectoryFlag{ Name: "keystore", Usage: "Directory for the keystore (default = inside the datadir)", @@ -129,6 +133,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)", @@ -205,13 +214,13 @@ var ( } LightBandwidthInFlag = cli.IntFlag{ Name: "lightbwin", - Usage: "Incoming bandwidth limit for light server (1000 bytes/sec, 0 = unlimited)", - Value: 1000, + Usage: "Incoming bandwidth limit for light server (kilobytes/sec, 0 = unlimited)", + Value: 0, } LightBandwidthOutFlag = cli.IntFlag{ Name: "lightbwout", - Usage: "Outgoing bandwidth limit for light server (1000 bytes/sec, 0 = unlimited)", - Value: 5000, + Usage: "Outgoing bandwidth limit for light server (kilobytes/sec, 0 = unlimited)", + Value: 0, } LightPeersFlag = cli.IntFlag{ Name: "lightpeers", @@ -333,7 +342,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{ @@ -377,27 +386,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.etherbase", @@ -420,7 +429,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", @@ -566,12 +575,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", @@ -714,6 +723,22 @@ var ( Name: "statediff", Usage: "Enables the calculation of state diffs between each block, persists these state diffs the configured persistence mode.", } + StateDiffPathsAndProofs = cli.BoolFlag{ + Name: "statediff.pathsandproofs", + Usage: "Set to true to generate paths and proof sets for diffed state and storage trie leaf nodes", + } + StateDiffIntermediateNodes = cli.BoolFlag{ + Name: "statediff.intermediatenodes", + Usage: "Set to include intermediate (branch and extension) nodes; default (false) processes leaf nodes only", + } + StateDiffStreamBlock = cli.BoolFlag{ + Name: "statediff.streamblock", + Usage: "Set to true to stream the block data alongside state diff data in the same subscription payload", + } + StateDiffWatchedAddresses = cli.StringSliceFlag{ + Name: "statediff.watchedaddresses", + Usage: "If provided, state diffing process is restricted to these addresses", + } ) // MakeDataDir retrieves the currently requested data directory, terminating @@ -793,7 +818,7 @@ func setBootstrapNodes(ctx *cli.Context, cfg *p2p.Config) { cfg.BootstrapNodes = make([]*enode.Node, 0, len(urls)) for _, url := range urls { if url != "" { - node, err := enode.ParseV4(url) + node, err := enode.Parse(enode.ValidSchemes, url) if err != nil { log.Crit("Bootstrap URL invalid", "enode", url, "err", err) continue @@ -1033,7 +1058,7 @@ func setEtherbase(ctx *cli.Context, ks *keystore.KeyStore, cfg *eth.Config) { if err != nil { Fatalf("Invalid miner etherbase: %v", err) } - cfg.Etherbase = account.Address + cfg.Miner.Etherbase = account.Address } else { Fatalf("No etherbase configured") } @@ -1134,6 +1159,7 @@ func SetNodeConfig(ctx *cli.Context, cfg *node.Config) { setWS(ctx, cfg) setNodeUserIdent(ctx, cfg) setDataDir(ctx, cfg) + setSmartCard(ctx, cfg) if ctx.GlobalIsSet(ExternalSignerFlag.Name) { cfg.ExternalSigner = ctx.GlobalString(ExternalSignerFlag.Name) @@ -1153,6 +1179,26 @@ func SetNodeConfig(ctx *cli.Context, cfg *node.Config) { } } +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) { switch { case ctx.GlobalIsSet(DataDirFlag.Name): @@ -1241,6 +1287,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 == "" { @@ -1333,6 +1412,7 @@ func SetEthConfig(ctx *cli.Context, stack *node.Node, cfg *eth.Config) { setGPO(ctx, &cfg.GPO) setTxPool(ctx, &cfg.TxPool) setEthash(ctx, cfg) + setMiner(ctx, &cfg.Miner) setWhitelist(ctx, cfg) if ctx.GlobalIsSet(SyncModeFlag.Name) { @@ -1356,6 +1436,9 @@ 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) @@ -1369,39 +1452,9 @@ func SetEthConfig(ctx *cli.Context, stack *node.Node, cfg *eth.Config) { 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) @@ -1459,7 +1512,7 @@ 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) } } } @@ -1528,12 +1581,18 @@ func RegisterEthStatsService(stack *node.Node, url string) { // RegisterStateDiffService configures and registers a service to stream state diff data over RPC func RegisterStateDiffService(stack *node.Node, ctx *cli.Context) { + config := statediff.Config{ + PathsAndProofs: ctx.GlobalBool(StateDiffPathsAndProofs.Name), + IntermediateNodes: ctx.GlobalBool(StateDiffIntermediateNodes.Name), + StreamBlock: ctx.GlobalBool(StateDiffStreamBlock.Name), + WatchedAddresses: ctx.GlobalStringSlice(StateDiffWatchedAddresses.Name), + } if err := stack.Register(func(ctx *node.ServiceContext) (node.Service, error) { var ethServ *eth.Ethereum ctx.Service(ðServ) chainDb := ethServ.ChainDb() blockChain := ethServ.BlockChain() - return statediff.NewStateDiffService(chainDb, blockChain) + return statediff.NewStateDiffService(chainDb, blockChain, config) }); err != nil { Fatalf("Failed to register State Diff Service", err) } @@ -1587,7 +1646,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) } diff --git a/vendor/github.com/ethereum/go-ethereum/cmd/wnode/main.go b/vendor/github.com/ethereum/go-ethereum/cmd/wnode/main.go index 97e58520..99cf84ec 100644 --- a/vendor/github.com/ethereum/go-ethereum/cmd/wnode/main.go +++ b/vendor/github.com/ethereum/go-ethereum/cmd/wnode/main.go @@ -203,7 +203,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) } @@ -747,9 +747,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/vendor/github.com/ethereum/go-ethereum/common/math/big.go b/vendor/github.com/ethereum/go-ethereum/common/math/big.go index 9d2e7946..d31c59af 100644 --- a/vendor/github.com/ethereum/go-ethereum/common/math/big.go +++ b/vendor/github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/common/prque/prque.go b/vendor/github.com/ethereum/go-ethereum/common/prque/prque.go index 9fd31a2e..3cc5a1ad 100755 --- a/vendor/github.com/ethereum/go-ethereum/common/prque/prque.go +++ b/vendor/github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/common/prque/sstack.go b/vendor/github.com/ethereum/go-ethereum/common/prque/sstack.go index 4875dae9..8518af54 100755 --- a/vendor/github.com/ethereum/go-ethereum/common/prque/sstack.go +++ b/vendor/github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/common/size.go b/vendor/github.com/ethereum/go-ethereum/common/size.go index 6381499a..097b6304 100644 --- a/vendor/github.com/ethereum/go-ethereum/common/size.go +++ b/vendor/github.com/ethereum/go-ethereum/common/size.go @@ -26,7 +26,11 @@ type StorageSize float64 // String implements the stringer interface. func (s StorageSize) String() string { - if s > 1048576 { + 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) @@ -38,7 +42,11 @@ func (s StorageSize) String() string { // TerminalString implements log.TerminalStringer, formatting a string for console // output during logging. func (s StorageSize) TerminalString() string { - if s > 1048576 { + 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) diff --git a/vendor/github.com/ethereum/go-ethereum/consensus/clique/clique.go b/vendor/github.com/ethereum/go-ethereum/consensus/clique/clique.go index 6bdee6dd..084009a0 100644 --- a/vendor/github.com/ethereum/go-ethereum/consensus/clique/clique.go +++ b/vendor/github.com/ethereum/go-ethereum/consensus/clique/clique.go @@ -365,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() @@ -548,8 +551,16 @@ func (c *Clique) Prepare(chain consensus.ChainReader, header *types.Header) erro } // 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) diff --git a/vendor/github.com/ethereum/go-ethereum/consensus/clique/snapshot.go b/vendor/github.com/ethereum/go-ethereum/consensus/clique/snapshot.go index 54d4555f..4ee731a9 100644 --- a/vendor/github.com/ethereum/go-ethereum/consensus/clique/snapshot.go +++ b/vendor/github.com/ethereum/go-ethereum/consensus/clique/snapshot.go @@ -20,10 +20,12 @@ import ( "bytes" "encoding/json" "sort" + "time" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/consensus/consensus.go b/vendor/github.com/ethereum/go-ethereum/consensus/consensus.go index 487b07be..f753af55 100644 --- a/vendor/github.com/ethereum/go-ethereum/consensus/consensus.go +++ b/vendor/github.com/ethereum/go-ethereum/consensus/consensus.go @@ -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/vendor/github.com/ethereum/go-ethereum/consensus/ethash/consensus.go b/vendor/github.com/ethereum/go-ethereum/consensus/ethash/consensus.go index 4d909146..d271518f 100644 --- a/vendor/github.com/ethereum/go-ethereum/consensus/ethash/consensus.go +++ b/vendor/github.com/ethereum/go-ethereum/consensus/ethash/consensus.go @@ -561,8 +561,16 @@ func (ethash *Ethash) Prepare(chain consensus.ChainReader, header *types.Header) } // 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/vendor/github.com/ethereum/go-ethereum/consensus/ethash/sealer.go b/vendor/github.com/ethereum/go-ethereum/consensus/ethash/sealer.go index 3a0919ca..43db1fcb 100644 --- a/vendor/github.com/ethereum/go-ethereum/consensus/ethash/sealer.go +++ b/vendor/github.com/ethereum/go-ethereum/consensus/ethash/sealer.go @@ -270,7 +270,7 @@ func (ethash *Ethash) remote(notify []string, noverify bool) { 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) + log.Warn("Invalid proof-of-work submitted", "sealhash", sealhash, "elapsed", common.PrettyDuration(time.Since(start)), "err", err) return false } } @@ -279,7 +279,7 @@ func (ethash *Ethash) remote(notify []string, noverify bool) { 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)) + 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) diff --git a/vendor/github.com/ethereum/go-ethereum/console/prompter.go b/vendor/github.com/ethereum/go-ethereum/console/prompter.go index 29a53aea..65675061 100644 --- a/vendor/github.com/ethereum/go-ethereum/console/prompter.go +++ b/vendor/github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/contracts/chequebook/api.go b/vendor/github.com/ethereum/go-ethereum/contracts/chequebook/api.go deleted file mode 100644 index fb708030..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/ethereum/go-ethereum/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 (a *API) Balance() (string, error) { - ch := a.chequebookf() - if ch == nil { - return "", errNoChequebook - } - return ch.Balance().String(), nil -} - -func (a *API) Issue(beneficiary common.Address, amount *big.Int) (cheque *Cheque, err error) { - ch := a.chequebookf() - if ch == nil { - return nil, errNoChequebook - } - return ch.Issue(beneficiary, amount) -} - -func (a *API) Cash(cheque *Cheque) (txhash string, err error) { - ch := a.chequebookf() - if ch == nil { - return "", errNoChequebook - } - return ch.Cash(cheque) -} - -func (a *API) Deposit(amount *big.Int) (txhash string, err error) { - ch := a.chequebookf() - if ch == nil { - return "", errNoChequebook - } - return ch.Deposit(amount) -} diff --git a/vendor/github.com/ethereum/go-ethereum/contracts/chequebook/cheque.go b/vendor/github.com/ethereum/go-ethereum/contracts/chequebook/cheque.go deleted file mode 100644 index 32e84067..00000000 --- a/vendor/github.com/ethereum/go-ethereum/contracts/chequebook/cheque.go +++ /dev/null @@ -1,642 +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/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/contracts/chequebook/contract" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/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 (ch *Cheque) String() string { - return fmt.Sprintf("contract: %s, beneficiary: %s, amount: %v, signature: %x", ch.Contract.Hex(), ch.Beneficiary.Hex(), ch.Amount, ch.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 (cb *Chequebook) String() string { - return fmt.Sprintf("contract: %s, owner: %s, balance: %v, signer: %x", cb.contractAddr.Hex(), cb.owner.Hex(), cb.balance, cb.prvKey.PublicKey) -} - -// NewChequebook creates a new Chequebook. -func NewChequebook(path string, contractAddr common.Address, prvKey *ecdsa.PrivateKey, backend Backend) (*Chequebook, 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, - } - - cb := &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{}) { - cb.setBalanceFromBlockChain() - cb.log.Trace("New chequebook initialised", "owner", cb.owner, "balance", cb.balance) - } - return cb, nil -} - -func (cb *Chequebook) setBalanceFromBlockChain() { - balance, err := cb.backend.BalanceAt(context.TODO(), cb.contractAddr, nil) - if err != nil { - log.Error("Failed to retrieve chequebook balance", "err", err) - } else { - cb.balance.Set(balance) - } -} - -// LoadChequebook loads a chequebook from disk (file path). -func LoadChequebook(path string, prvKey *ecdsa.PrivateKey, backend Backend, checkBalance bool) (*Chequebook, error) { - data, err := ioutil.ReadFile(path) - if err != nil { - return nil, err - } - cb, _ := NewChequebook(path, common.Address{}, prvKey, backend) - - if err = json.Unmarshal(data, cb); err != nil { - return nil, err - } - if checkBalance { - cb.setBalanceFromBlockChain() - } - log.Trace("Loaded chequebook from disk", "path", path) - - return cb, nil -} - -// 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 (cb *Chequebook) UnmarshalJSON(data []byte) error { - var file chequebookFile - err := json.Unmarshal(data, &file) - if err != nil { - return err - } - _, ok := cb.balance.SetString(file.Balance, 10) - if !ok { - return fmt.Errorf("cumulative amount sent: unable to convert string to big integer: %v", file.Balance) - } - cb.contractAddr = common.HexToAddress(file.Contract) - for addr, sent := range file.Sent { - cb.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 (cb *Chequebook) MarshalJSON() ([]byte, error) { - var file = &chequebookFile{ - Balance: cb.balance.String(), - Contract: cb.contractAddr.Hex(), - Owner: cb.owner.Hex(), - Sent: make(map[string]string), - } - for addr, sent := range cb.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 (cb *Chequebook) Save() error { - data, err := json.MarshalIndent(cb, "", " ") - if err != nil { - return err - } - cb.log.Trace("Saving chequebook to disk", cb.path) - - return ioutil.WriteFile(cb.path, data, os.ModePerm) -} - -// Stop quits the autodeposit go routine to terminate -func (cb *Chequebook) Stop() { - defer cb.lock.Unlock() - cb.lock.Lock() - if cb.quit != nil { - close(cb.quit) - cb.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 (cb *Chequebook) Issue(beneficiary common.Address, amount *big.Int) (*Cheque, error) { - defer cb.lock.Unlock() - cb.lock.Lock() - - if amount.Sign() <= 0 { - return nil, fmt.Errorf("amount must be greater than zero (%v)", amount) - } - var ( - ch *Cheque - err error - ) - if cb.balance.Cmp(amount) < 0 { - err = fmt.Errorf("insufficient funds to issue cheque for amount: %v. balance: %v", amount, cb.balance) - } else { - var sig []byte - sent, found := cb.sent[beneficiary] - if !found { - sent = new(big.Int) - cb.sent[beneficiary] = sent - } - sum := new(big.Int).Set(sent) - sum.Add(sum, amount) - - sig, err = crypto.Sign(sigHash(cb.contractAddr, beneficiary, sum), cb.prvKey) - if err == nil { - ch = &Cheque{ - Contract: cb.contractAddr, - Beneficiary: beneficiary, - Amount: sum, - Sig: sig, - } - sent.Set(sum) - cb.balance.Sub(cb.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 cb.threshold != nil { - if cb.balance.Cmp(cb.threshold) < 0 { - send := new(big.Int).Sub(cb.buffer, cb.balance) - cb.deposit(send) - } - } - return ch, err -} - -// Cash is a convenience method to cash any cheque. -func (cb *Chequebook) Cash(ch *Cheque) (string, error) { - return ch.Cash(cb.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 (cb *Chequebook) Balance() *big.Int { - defer cb.lock.Unlock() - cb.lock.Lock() - return new(big.Int).Set(cb.balance) -} - -// Owner returns the owner account of the chequebook. -func (cb *Chequebook) Owner() common.Address { - return cb.owner -} - -// Address returns the on-chain contract address of the chequebook. -func (cb *Chequebook) Address() common.Address { - return cb.contractAddr -} - -// Deposit deposits money to the chequebook account. -func (cb *Chequebook) Deposit(amount *big.Int) (string, error) { - defer cb.lock.Unlock() - cb.lock.Lock() - return cb.deposit(amount) -} - -// deposit deposits amount to the chequebook account. -// The caller must hold lock. -func (cb *Chequebook) deposit(amount *big.Int) (string, error) { - // since the amount is variable here, we do not use sessions - depositTransactor := bind.NewKeyedTransactor(cb.prvKey) - depositTransactor.Value = amount - chbookRaw := &contract.ChequebookRaw{Contract: cb.contract} - tx, err := chbookRaw.Transfer(depositTransactor) - if err != nil { - cb.log.Warn("Failed to fund chequebook", "amount", amount, "balance", cb.balance, "target", cb.buffer, "err", err) - return "", err - } - // assume that transaction is actually successful, we add the amount to balance right away - cb.balance.Add(cb.balance, amount) - cb.log.Trace("Deposited funds to chequebook", "amount", amount, "balance", cb.balance, "target", cb.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 (cb *Chequebook) AutoDeposit(interval time.Duration, threshold, buffer *big.Int) { - defer cb.lock.Unlock() - cb.lock.Lock() - cb.threshold = threshold - cb.buffer = buffer - cb.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 (cb *Chequebook) autoDeposit(interval time.Duration) { - if cb.quit != nil { - close(cb.quit) - cb.quit = nil - } - // if threshold >= balance autodeposit after every cheque issued - if interval == time.Duration(0) || cb.threshold != nil && cb.buffer != nil && cb.threshold.Cmp(cb.buffer) >= 0 { - return - } - - ticker := time.NewTicker(interval) - cb.quit = make(chan bool) - quit := cb.quit - - go func() { - for { - select { - case <-quit: - return - case <-ticker.C: - cb.lock.Lock() - if cb.balance.Cmp(cb.buffer) < 0 { - amount := new(big.Int).Sub(cb.buffer, cb.balance) - txhash, err := cb.deposit(amount) - if err == nil { - cb.txhash = txhash - } - } - cb.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(cb *Chequebook, beneficiary common.Address) *Outbox { - return &Outbox{cb, beneficiary} -} - -// Issue creates cheque. -func (o *Outbox) Issue(amount *big.Int) (swap.Promise, error) { - return o.chequeBook.Issue(o.beneficiary, amount) -} - -// AutoDeposit enables auto-deposits on the underlying chequebook. -func (o *Outbox) AutoDeposit(interval time.Duration, threshold, buffer *big.Int) { - o.chequeBook.AutoDeposit(interval, threshold, buffer) -} - -// Stop helps satisfy the swap.OutPayment interface. -func (o *Outbox) Stop() {} - -// String implements fmt.Stringer. -func (o *Outbox) String() string { - return fmt.Sprintf("chequebook: %v, beneficiary: %s, balance: %v", o.chequeBook.Address().Hex(), o.beneficiary.Hex(), o.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) (*Inbox, 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 - - inbox := &Inbox{ - contract: contractAddr, - beneficiary: beneficiary, - sender: sender, - signer: signer, - session: session, - cashed: new(big.Int).Set(common.Big0), - log: log.New("contract", contractAddr), - } - inbox.log.Trace("New chequebook inbox initialized", "beneficiary", inbox.beneficiary, "signer", hexutil.Bytes(crypto.FromECDSAPub(signer))) - return inbox, nil -} - -func (i *Inbox) String() string { - return fmt.Sprintf("chequebook: %v, beneficiary: %s, balance: %v", i.contract.Hex(), i.beneficiary.Hex(), i.cheque.Amount) -} - -// Stop quits the autocash goroutine. -func (i *Inbox) Stop() { - defer i.lock.Unlock() - i.lock.Lock() - if i.quit != nil { - close(i.quit) - i.quit = nil - } -} - -// Cash attempts to cash the current cheque. -func (i *Inbox) Cash() (string, error) { - if i.cheque == nil { - return "", nil - } - txhash, err := i.cheque.Cash(i.session) - i.log.Trace("Cashing in chequebook cheque", "amount", i.cheque.Amount, "beneficiary", i.beneficiary) - i.cashed = i.cheque.Amount - - return txhash, err -} - -// 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 (i *Inbox) AutoCash(cashInterval time.Duration, maxUncashed *big.Int) { - defer i.lock.Unlock() - i.lock.Lock() - i.maxUncashed = maxUncashed - i.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 lock. -func (i *Inbox) autoCash(cashInterval time.Duration) { - if i.quit != nil { - close(i.quit) - i.quit = nil - } - // if maxUncashed is set to 0, then autocash on receipt - if cashInterval == time.Duration(0) || i.maxUncashed != nil && i.maxUncashed.Sign() == 0 { - return - } - - ticker := time.NewTicker(cashInterval) - i.quit = make(chan bool) - quit := i.quit - - go func() { - for { - select { - case <-quit: - return - case <-ticker.C: - i.lock.Lock() - if i.cheque != nil && i.cheque.Amount.Cmp(i.cashed) != 0 { - txhash, err := i.Cash() - if err == nil { - i.txhash = txhash - } - } - i.lock.Unlock() - } - } - }() -} - -// Receive is called to deposit the latest cheque to the incoming Inbox. -// The given promise must be a *Cheque. -func (i *Inbox) Receive(promise swap.Promise) (*big.Int, error) { - ch := promise.(*Cheque) - - defer i.lock.Unlock() - i.lock.Lock() - - var sum *big.Int - if i.cheque == nil { - // the sum is checked against the blockchain once a cheque is received - tally, err := i.session.Sent(i.beneficiary) - if err != nil { - return nil, fmt.Errorf("inbox: error calling backend to set amount: %v", err) - } - sum = tally - } else { - sum = i.cheque.Amount - } - - amount, err := ch.Verify(i.signer, i.contract, i.beneficiary, sum) - var uncashed *big.Int - if err == nil { - i.cheque = ch - - if i.maxUncashed != nil { - uncashed = new(big.Int).Sub(ch.Amount, i.cashed) - if i.maxUncashed.Cmp(uncashed) < 0 { - i.Cash() - } - } - i.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 (ch *Cheque) Verify(signerKey *ecdsa.PublicKey, contract, beneficiary common.Address, sum *big.Int) (*big.Int, error) { - log.Trace("Verifying chequebook cheque", "cheque", ch, "sum", sum) - if sum == nil { - return nil, fmt.Errorf("invalid amount") - } - - if ch.Beneficiary != beneficiary { - return nil, fmt.Errorf("beneficiary mismatch: %v != %v", ch.Beneficiary.Hex(), beneficiary.Hex()) - } - if ch.Contract != contract { - return nil, fmt.Errorf("contract mismatch: %v != %v", ch.Contract.Hex(), contract.Hex()) - } - - amount := new(big.Int).Set(ch.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(ch.Contract, beneficiary, ch.Amount), ch.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 (ch *Cheque) Cash(session *contract.ChequebookSession) (string, error) { - v, r, s := sig2vrs(ch.Sig) - tx, err := session.Cash(ch.Beneficiary, ch.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) (bool, 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/vendor/github.com/ethereum/go-ethereum/contracts/chequebook/contract/chequebook.go b/vendor/github.com/ethereum/go-ethereum/contracts/chequebook/contract/chequebook.go deleted file mode 100644 index 3129b811..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/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" -) - -// 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, sigV uint8, sigR [32]byte, sigS [32]byte) (*types.Transaction, error) { - return _Chequebook.contract.Transact(opts, "cash", beneficiary, amount, sigV, sigR, sigS) -} - -// 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, sigV uint8, sigR [32]byte, sigS [32]byte) (*types.Transaction, error) { - return _Chequebook.Contract.Cash(&_Chequebook.TransactOpts, beneficiary, amount, sigV, sigR, sigS) -} - -// 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, sigV uint8, sigR [32]byte, sigS [32]byte) (*types.Transaction, error) { - return _Chequebook.Contract.Cash(&_Chequebook.TransactOpts, beneficiary, amount, sigV, sigR, sigS) -} - -// 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/vendor/github.com/ethereum/go-ethereum/contracts/chequebook/contract/chequebook.sol b/vendor/github.com/ethereum/go-ethereum/contracts/chequebook/contract/chequebook.sol deleted file mode 100644 index c386ccee..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/contracts/chequebook/contract/code.go b/vendor/github.com/ethereum/go-ethereum/contracts/chequebook/contract/code.go deleted file mode 100644 index d837a9d6..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/contracts/chequebook/contract/mortal.sol b/vendor/github.com/ethereum/go-ethereum/contracts/chequebook/contract/mortal.sol deleted file mode 100644 index c43f1e4f..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/contracts/chequebook/contract/owned.sol b/vendor/github.com/ethereum/go-ethereum/contracts/chequebook/contract/owned.sol deleted file mode 100644 index ee9860d3..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/contracts/chequebook/gencode.go b/vendor/github.com/ethereum/go-ethereum/contracts/chequebook/gencode.go deleted file mode 100644 index ddfe8d15..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" - "github.com/ethereum/go-ethereum/contracts/chequebook/contract" - "github.com/ethereum/go-ethereum/core" - "github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/contracts/ens/README.md b/vendor/github.com/ethereum/go-ethereum/contracts/ens/README.md deleted file mode 100644 index f2ea1330..00000000 --- a/vendor/github.com/ethereum/go-ethereum/contracts/ens/README.md +++ /dev/null @@ -1,30 +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 -``` - -## Fallback contract support - -In order to better support content resolution on different service providers (such as Swarm and IPFS), [EIP-1577](https://eips.ethereum.org/EIPS/eip-1577) -was introduced and with it changes that allow applications to know _where_ content hashes are stored (i.e. if the -requested hash resides on Swarm or IPFS). - -The code under `contracts/ens/contract` reflects the new Public Resolver changes and the code under `fallback_contract` allows -us to support the old contract resolution in cases where the ENS name owner did not update her Resolver contract, until the migration -period ends (date arbitrarily set to June 1st, 2019). diff --git a/vendor/github.com/ethereum/go-ethereum/contracts/ens/cid.go b/vendor/github.com/ethereum/go-ethereum/contracts/ens/cid.go deleted file mode 100644 index 673e8203..00000000 --- a/vendor/github.com/ethereum/go-ethereum/contracts/ens/cid.go +++ /dev/null @@ -1,121 +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 ( - "encoding/binary" - "errors" - "fmt" - - "github.com/ethereum/go-ethereum/common" -) - -const ( - cidv1 = 0x1 - - nsIpfs = 0xe3 - nsSwarm = 0xe4 - - swarmTypecode = 0xfa // swarm manifest, see https://github.com/multiformats/multicodec/blob/master/table.csv - swarmHashtype = 0x1b // keccak256, see https://github.com/multiformats/multicodec/blob/master/table.csv - - hashLength = 32 -) - -// deocodeEIP1577ContentHash decodes a chain-stored content hash from an ENS record according to EIP-1577 -// a successful decode will result the different parts of the content hash in accordance to the CID spec -// Note: only CIDv1 is supported -func decodeEIP1577ContentHash(buf []byte) (storageNs, contentType, hashType, hashLength uint64, hash []byte, err error) { - if len(buf) < 10 { - return 0, 0, 0, 0, nil, errors.New("buffer too short") - } - - storageNs, n := binary.Uvarint(buf) - - buf = buf[n:] - vers, n := binary.Uvarint(buf) - - if vers != 1 { - return 0, 0, 0, 0, nil, fmt.Errorf("expected cid v1, got: %d", vers) - } - buf = buf[n:] - contentType, n = binary.Uvarint(buf) - - buf = buf[n:] - hashType, n = binary.Uvarint(buf) - - buf = buf[n:] - hashLength, n = binary.Uvarint(buf) - - hash = buf[n:] - - if len(hash) != int(hashLength) { - return 0, 0, 0, 0, nil, errors.New("hash length mismatch") - } - return storageNs, contentType, hashType, hashLength, hash, nil -} - -func extractContentHash(buf []byte) (common.Hash, error) { - storageNs, _ /*contentType*/, _ /* hashType*/, decodedHashLength, hashBytes, err := decodeEIP1577ContentHash(buf) - - if err != nil { - return common.Hash{}, err - } - - if storageNs != nsSwarm { - return common.Hash{}, errors.New("unknown storage system") - } - - //todo: for the time being we implement loose enforcement for the EIP rules until ENS manager is updated - /*if contentType != swarmTypecode { - return common.Hash{}, errors.New("unknown content type") - } - - if hashType != swarmHashtype { - return common.Hash{}, errors.New("unknown multihash type") - }*/ - - if decodedHashLength != hashLength { - return common.Hash{}, errors.New("odd hash length, swarm expects 32 bytes") - } - - if len(hashBytes) != int(hashLength) { - return common.Hash{}, errors.New("hash length mismatch") - } - - return common.BytesToHash(buf), nil -} - -func EncodeSwarmHash(hash common.Hash) ([]byte, error) { - var cidBytes []byte - var headerBytes = []byte{ - nsSwarm, //swarm namespace - cidv1, // CIDv1 - swarmTypecode, // swarm hash - swarmHashtype, // keccak256 hash - hashLength, //hash length. 32 bytes - } - - varintbuf := make([]byte, binary.MaxVarintLen64) - for _, v := range headerBytes { - n := binary.PutUvarint(varintbuf, uint64(v)) - cidBytes = append(cidBytes, varintbuf[:n]...) - } - - cidBytes = append(cidBytes, hash[:]...) - return cidBytes, nil -} diff --git a/vendor/github.com/ethereum/go-ethereum/contracts/ens/contract/ENS.sol b/vendor/github.com/ethereum/go-ethereum/contracts/ens/contract/ENS.sol deleted file mode 100644 index 5ab8c92b..00000000 --- a/vendor/github.com/ethereum/go-ethereum/contracts/ens/contract/ENS.sol +++ /dev/null @@ -1,26 +0,0 @@ -pragma solidity >=0.4.24; - -interface ENS { - - // 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); - - - function setSubnodeOwner(bytes32 node, bytes32 label, address owner) external; - function setResolver(bytes32 node, address resolver) external; - function setOwner(bytes32 node, address owner) external; - function setTTL(bytes32 node, uint64 ttl) external; - function owner(bytes32 node) external view returns (address); - function resolver(bytes32 node) external view returns (address); - function ttl(bytes32 node) external view returns (uint64); - -} \ No newline at end of file diff --git a/vendor/github.com/ethereum/go-ethereum/contracts/ens/contract/ENSRegistry.sol b/vendor/github.com/ethereum/go-ethereum/contracts/ens/contract/ENSRegistry.sol deleted file mode 100644 index fa19131d..00000000 --- a/vendor/github.com/ethereum/go-ethereum/contracts/ens/contract/ENSRegistry.sol +++ /dev/null @@ -1,99 +0,0 @@ -pragma solidity ^0.5.0; - -import "./ENS.sol"; - -/** - * The ENS registry contract. - */ -contract ENSRegistry is ENS { - 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) { - require(records[node].owner == msg.sender); - _; - } - - /** - * @dev Constructs a new ENS registrar. - */ - constructor() public { - records[0x0].owner = msg.sender; - } - - /** - * @dev 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) external only_owner(node) { - emit Transfer(node, owner); - records[node].owner = owner; - } - - /** - * @dev Transfers ownership of a subnode keccak256(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) external only_owner(node) { - bytes32 subnode = keccak256(abi.encodePacked(node, label)); - emit NewOwner(node, label, owner); - records[subnode].owner = owner; - } - - /** - * @dev 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) external only_owner(node) { - emit NewResolver(node, resolver); - records[node].resolver = resolver; - } - - /** - * @dev 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) external only_owner(node) { - emit NewTTL(node, ttl); - records[node].ttl = ttl; - } - - /** - * @dev Returns the address that owns the specified node. - * @param node The specified node. - * @return address of the owner. - */ - function owner(bytes32 node) external view returns (address) { - return records[node].owner; - } - - /** - * @dev Returns the address of the resolver for the specified node. - * @param node The specified node. - * @return address of the resolver. - */ - function resolver(bytes32 node) external view returns (address) { - return records[node].resolver; - } - - /** - * @dev Returns the TTL of a node, and any records associated with it. - * @param node The specified node. - * @return ttl of the node. - */ - function ttl(bytes32 node) external view returns (uint64) { - return records[node].ttl; - } - -} \ No newline at end of file diff --git a/vendor/github.com/ethereum/go-ethereum/contracts/ens/contract/FIFSRegistrar.sol b/vendor/github.com/ethereum/go-ethereum/contracts/ens/contract/FIFSRegistrar.sol deleted file mode 100644 index 19287408..00000000 --- a/vendor/github.com/ethereum/go-ethereum/contracts/ens/contract/FIFSRegistrar.sol +++ /dev/null @@ -1,36 +0,0 @@ -pragma solidity ^0.5.0; - -import "./ENS.sol"; - -/** - * A registrar that allocates subdomains to the first person to claim them. - */ -contract FIFSRegistrar { - ENS ens; - bytes32 rootNode; - - modifier only_owner(bytes32 label) { - address currentOwner = ens.owner(keccak256(abi.encodePacked(rootNode, label))); - require(currentOwner == address(0x0) || currentOwner == msg.sender); - _; - } - - /** - * Constructor. - * @param ensAddr The address of the ENS registry. - * @param node The node that this registrar administers. - */ - constructor(ENS ensAddr, bytes32 node) public { - ens = ensAddr; - rootNode = node; - } - - /** - * Register a name, or change the owner of an existing registration. - * @param label The hash of the label to register. - * @param owner The address of the new owner. - */ - function register(bytes32 label, address owner) public only_owner(label) { - ens.setSubnodeOwner(rootNode, label, owner); - } -} \ No newline at end of file diff --git a/vendor/github.com/ethereum/go-ethereum/contracts/ens/contract/PublicResolver.sol b/vendor/github.com/ethereum/go-ethereum/contracts/ens/contract/PublicResolver.sol deleted file mode 100644 index cfcd5dd6..00000000 --- a/vendor/github.com/ethereum/go-ethereum/contracts/ens/contract/PublicResolver.sol +++ /dev/null @@ -1,212 +0,0 @@ -pragma solidity >=0.4.25; - -import "./ENS.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 NAME_INTERFACE_ID = 0x691f3431; - bytes4 constant ABI_INTERFACE_ID = 0x2203ab56; - bytes4 constant PUBKEY_INTERFACE_ID = 0xc8690233; - bytes4 constant TEXT_INTERFACE_ID = 0x59d1d43c; - bytes4 constant CONTENTHASH_INTERFACE_ID = 0xbc1c58d1; - - event AddrChanged(bytes32 indexed node, address a); - 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 indexedKey, string key); - event ContenthashChanged(bytes32 indexed node, bytes hash); - - struct PublicKey { - bytes32 x; - bytes32 y; - } - - struct Record { - address addr; - string name; - PublicKey pubkey; - mapping(string=>string) text; - mapping(uint256=>bytes) abis; - bytes contenthash; - } - - ENS ens; - - mapping (bytes32 => Record) records; - - modifier onlyOwner(bytes32 node) { - require(ens.owner(node) == msg.sender); - _; - } - - /** - * Constructor. - * @param ensAddr The ENS registrar contract. - */ - constructor(ENS ensAddr) public { - ens = ensAddr; - } - - /** - * 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) external onlyOwner(node) { - records[node].addr = addr; - emit AddrChanged(node, addr); - } - - /** - * Sets the contenthash 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 hash The contenthash to set - */ - function setContenthash(bytes32 node, bytes calldata hash) external onlyOwner(node) { - records[node].contenthash = hash; - emit ContenthashChanged(node, hash); - } - - /** - * 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 calldata name) external onlyOwner(node) { - records[node].name = name; - emit NameChanged(node, name); - } - - /** - * 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 calldata data) external onlyOwner(node) { - // Content types must be powers of 2 - require(((contentType - 1) & contentType) == 0); - - records[node].abis[contentType] = data; - emit ABIChanged(node, contentType); - } - - /** - * 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) external onlyOwner(node) { - records[node].pubkey = PublicKey(x, y); - emit PubkeyChanged(node, x, y); - } - - /** - * 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 calldata key, string calldata value) external onlyOwner(node) { - records[node].text[key] = value; - emit TextChanged(node, key, key); - } - - /** - * 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 calldata key) external view returns (string memory) { - return records[node].text[key]; - } - - /** - * 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) external view returns (bytes32 x, bytes32 y) { - return (records[node].pubkey.x, records[node].pubkey.y); - } - - /** - * 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) external view returns (uint256, bytes memory) { - Record storage record = records[node]; - - for (uint256 contentType = 1; contentType <= contentTypes; contentType <<= 1) { - if ((contentType & contentTypes) != 0 && record.abis[contentType].length > 0) { - return (contentType, record.abis[contentType]); - } - } - - bytes memory empty; - return (0, empty); - } - - /** - * 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) external view returns (string memory) { - return records[node].name; - } - - /** - * Returns the address associated with an ENS node. - * @param node The ENS node to query. - * @return The associated address. - */ - function addr(bytes32 node) external view returns (address) { - return records[node].addr; - } - - /** - * Returns the contenthash associated with an ENS node. - * @param node The ENS node to query. - * @return The associated contenthash. - */ - function contenthash(bytes32 node) external view returns (bytes memory) { - return records[node].contenthash; - } - - /** - * 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) external pure returns (bool) { - return interfaceID == ADDR_INTERFACE_ID || - interfaceID == NAME_INTERFACE_ID || - interfaceID == ABI_INTERFACE_ID || - interfaceID == PUBKEY_INTERFACE_ID || - interfaceID == TEXT_INTERFACE_ID || - interfaceID == CONTENTHASH_INTERFACE_ID || - interfaceID == INTERFACE_META_ID; - } -} diff --git a/vendor/github.com/ethereum/go-ethereum/contracts/ens/contract/ens.go b/vendor/github.com/ethereum/go-ethereum/contracts/ens/contract/ens.go deleted file mode 100644 index 7c0aed34..00000000 --- a/vendor/github.com/ethereum/go-ethereum/contracts/ens/contract/ens.go +++ /dev/null @@ -1,892 +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/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 -) - -// 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\"},{\"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 = `0x` - -// 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(bytes32 node) 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(bytes32 node) 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(bytes32 node) 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(bytes32 node) 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(bytes32 node) 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(bytes32 node) 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(bytes32 node) 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(bytes32 node) 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(bytes32 node) 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(bytes32 node, address owner) 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(bytes32 node, address owner) 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(bytes32 node, address owner) 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(bytes32 node, address resolver) 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(bytes32 node, address resolver) 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(bytes32 node, address resolver) 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(bytes32 node, bytes32 label, address owner) 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(bytes32 node, bytes32 label, address owner) 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(bytes32 node, bytes32 label, address owner) 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(bytes32 node, uint64 ttl) 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(bytes32 node, uint64 ttl) 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(bytes32 node, uint64 ttl) 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 returns 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(bytes32 indexed node, bytes32 indexed label, address owner) -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(bytes32 indexed node, bytes32 indexed label, address owner) -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 returns 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(bytes32 indexed node, address resolver) -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(bytes32 indexed node, address resolver) -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 returns 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(bytes32 indexed node, uint64 ttl) -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(bytes32 indexed node, uint64 ttl) -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 returns 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(bytes32 indexed node, address owner) -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(bytes32 indexed node, address owner) -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/vendor/github.com/ethereum/go-ethereum/contracts/ens/contract/ensregistry.go b/vendor/github.com/ethereum/go-ethereum/contracts/ens/contract/ensregistry.go deleted file mode 100644 index ca89a87b..00000000 --- a/vendor/github.com/ethereum/go-ethereum/contracts/ens/contract/ensregistry.go +++ /dev/null @@ -1,892 +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/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 -) - -// ENSRegistryABI is the input ABI used to generate the binding from. -const ENSRegistryABI = "[{\"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\"}]" - -// ENSRegistryBin is the compiled bytecode used for deploying new contracts. -const ENSRegistryBin = `0x608060405234801561001057600080fd5b5060008080526020527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb58054600160a060020a0319163317905561059d806100596000396000f3fe6080604052600436106100825763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416630178b8bf811461008757806302571be3146100cd57806306ab5923146100f757806314ab90381461013857806316a25cbd146101725780631896f70a146101b95780635b0fc9c3146101f2575b600080fd5b34801561009357600080fd5b506100b1600480360360208110156100aa57600080fd5b503561022b565b60408051600160a060020a039092168252519081900360200190f35b3480156100d957600080fd5b506100b1600480360360208110156100f057600080fd5b5035610249565b34801561010357600080fd5b506101366004803603606081101561011a57600080fd5b5080359060208101359060400135600160a060020a0316610264565b005b34801561014457600080fd5b506101366004803603604081101561015b57600080fd5b508035906020013567ffffffffffffffff1661032e565b34801561017e57600080fd5b5061019c6004803603602081101561019557600080fd5b50356103f7565b6040805167ffffffffffffffff9092168252519081900360200190f35b3480156101c557600080fd5b50610136600480360360408110156101dc57600080fd5b5080359060200135600160a060020a031661042e565b3480156101fe57600080fd5b506101366004803603604081101561021557600080fd5b5080359060200135600160a060020a03166104d1565b600090815260208190526040902060010154600160a060020a031690565b600090815260208190526040902054600160a060020a031690565b6000838152602081905260409020548390600160a060020a0316331461028957600080fd5b6040805160208082018790528183018690528251808303840181526060830180855281519190920120600160a060020a0386169091529151859187917fce0457fe73731f824cc272376169235128c118b49d344817417c6d108d155e829181900360800190a36000908152602081905260409020805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a039390931692909217909155505050565b6000828152602081905260409020548290600160a060020a0316331461035357600080fd5b6040805167ffffffffffffffff84168152905184917f1d4f9bbfc9cab89d66e1a1562f2233ccbf1308cb4f63de2ead5787adddb8fa68919081900360200190a250600091825260208290526040909120600101805467ffffffffffffffff90921674010000000000000000000000000000000000000000027fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff909216919091179055565b60009081526020819052604090206001015474010000000000000000000000000000000000000000900467ffffffffffffffff1690565b6000828152602081905260409020548290600160a060020a0316331461045357600080fd5b60408051600160a060020a0384168152905184917f335721b01866dc23fbee8b6b2c7b1e14d6f05c28cd35a2c934239f94095602a0919081900360200190a250600091825260208290526040909120600101805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03909216919091179055565b6000828152602081905260409020548290600160a060020a031633146104f657600080fd5b60408051600160a060020a0384168152905184917fd4735d920b0f87494915f556dd9b54c8f309026070caea5c737245152564d266919081900360200190a250600091825260208290526040909120805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0390921691909117905556fea165627a7a723058208be97eda88107945616fbd44aa4f2f1ce188b1a930a4bc5f8e1fb7924395d1650029` - -// DeployENSRegistry deploys a new Ethereum contract, binding an instance of ENSRegistry to it. -func DeployENSRegistry(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *ENSRegistry, error) { - parsed, err := abi.JSON(strings.NewReader(ENSRegistryABI)) - if err != nil { - return common.Address{}, nil, nil, err - } - address, tx, contract, err := bind.DeployContract(auth, parsed, common.FromHex(ENSRegistryBin), backend) - if err != nil { - return common.Address{}, nil, nil, err - } - return address, tx, &ENSRegistry{ENSRegistryCaller: ENSRegistryCaller{contract: contract}, ENSRegistryTransactor: ENSRegistryTransactor{contract: contract}, ENSRegistryFilterer: ENSRegistryFilterer{contract: contract}}, nil -} - -// ENSRegistry is an auto generated Go binding around an Ethereum contract. -type ENSRegistry struct { - ENSRegistryCaller // Read-only binding to the contract - ENSRegistryTransactor // Write-only binding to the contract - ENSRegistryFilterer // Log filterer for contract events -} - -// ENSRegistryCaller is an auto generated read-only Go binding around an Ethereum contract. -type ENSRegistryCaller struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// ENSRegistryTransactor is an auto generated write-only Go binding around an Ethereum contract. -type ENSRegistryTransactor struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// ENSRegistryFilterer is an auto generated log filtering Go binding around an Ethereum contract events. -type ENSRegistryFilterer struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// ENSRegistrySession is an auto generated Go binding around an Ethereum contract, -// with pre-set call and transact options. -type ENSRegistrySession struct { - Contract *ENSRegistry // 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 -} - -// ENSRegistryCallerSession is an auto generated read-only Go binding around an Ethereum contract, -// with pre-set call options. -type ENSRegistryCallerSession struct { - Contract *ENSRegistryCaller // Generic contract caller binding to set the session for - CallOpts bind.CallOpts // Call options to use throughout this session -} - -// ENSRegistryTransactorSession is an auto generated write-only Go binding around an Ethereum contract, -// with pre-set transact options. -type ENSRegistryTransactorSession struct { - Contract *ENSRegistryTransactor // Generic contract transactor binding to set the session for - TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session -} - -// ENSRegistryRaw is an auto generated low-level Go binding around an Ethereum contract. -type ENSRegistryRaw struct { - Contract *ENSRegistry // Generic contract binding to access the raw methods on -} - -// ENSRegistryCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. -type ENSRegistryCallerRaw struct { - Contract *ENSRegistryCaller // Generic read-only contract binding to access the raw methods on -} - -// ENSRegistryTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. -type ENSRegistryTransactorRaw struct { - Contract *ENSRegistryTransactor // Generic write-only contract binding to access the raw methods on -} - -// NewENSRegistry creates a new instance of ENSRegistry, bound to a specific deployed contract. -func NewENSRegistry(address common.Address, backend bind.ContractBackend) (*ENSRegistry, error) { - contract, err := bindENSRegistry(address, backend, backend, backend) - if err != nil { - return nil, err - } - return &ENSRegistry{ENSRegistryCaller: ENSRegistryCaller{contract: contract}, ENSRegistryTransactor: ENSRegistryTransactor{contract: contract}, ENSRegistryFilterer: ENSRegistryFilterer{contract: contract}}, nil -} - -// NewENSRegistryCaller creates a new read-only instance of ENSRegistry, bound to a specific deployed contract. -func NewENSRegistryCaller(address common.Address, caller bind.ContractCaller) (*ENSRegistryCaller, error) { - contract, err := bindENSRegistry(address, caller, nil, nil) - if err != nil { - return nil, err - } - return &ENSRegistryCaller{contract: contract}, nil -} - -// NewENSRegistryTransactor creates a new write-only instance of ENSRegistry, bound to a specific deployed contract. -func NewENSRegistryTransactor(address common.Address, transactor bind.ContractTransactor) (*ENSRegistryTransactor, error) { - contract, err := bindENSRegistry(address, nil, transactor, nil) - if err != nil { - return nil, err - } - return &ENSRegistryTransactor{contract: contract}, nil -} - -// NewENSRegistryFilterer creates a new log filterer instance of ENSRegistry, bound to a specific deployed contract. -func NewENSRegistryFilterer(address common.Address, filterer bind.ContractFilterer) (*ENSRegistryFilterer, error) { - contract, err := bindENSRegistry(address, nil, nil, filterer) - if err != nil { - return nil, err - } - return &ENSRegistryFilterer{contract: contract}, nil -} - -// bindENSRegistry binds a generic wrapper to an already deployed contract. -func bindENSRegistry(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { - parsed, err := abi.JSON(strings.NewReader(ENSRegistryABI)) - 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 (_ENSRegistry *ENSRegistryRaw) Call(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error { - return _ENSRegistry.Contract.ENSRegistryCaller.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 (_ENSRegistry *ENSRegistryRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { - return _ENSRegistry.Contract.ENSRegistryTransactor.contract.Transfer(opts) -} - -// Transact invokes the (paid) contract method with params as input values. -func (_ENSRegistry *ENSRegistryRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { - return _ENSRegistry.Contract.ENSRegistryTransactor.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 (_ENSRegistry *ENSRegistryCallerRaw) Call(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error { - return _ENSRegistry.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 (_ENSRegistry *ENSRegistryTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { - return _ENSRegistry.Contract.contract.Transfer(opts) -} - -// Transact invokes the (paid) contract method with params as input values. -func (_ENSRegistry *ENSRegistryTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { - return _ENSRegistry.Contract.contract.Transact(opts, method, params...) -} - -// Owner is a free data retrieval call binding the contract method 0x02571be3. -// -// Solidity: function owner(bytes32 node) constant returns(address) -func (_ENSRegistry *ENSRegistryCaller) Owner(opts *bind.CallOpts, node [32]byte) (common.Address, error) { - var ( - ret0 = new(common.Address) - ) - out := ret0 - err := _ENSRegistry.contract.Call(opts, out, "owner", node) - return *ret0, err -} - -// Owner is a free data retrieval call binding the contract method 0x02571be3. -// -// Solidity: function owner(bytes32 node) constant returns(address) -func (_ENSRegistry *ENSRegistrySession) Owner(node [32]byte) (common.Address, error) { - return _ENSRegistry.Contract.Owner(&_ENSRegistry.CallOpts, node) -} - -// Owner is a free data retrieval call binding the contract method 0x02571be3. -// -// Solidity: function owner(bytes32 node) constant returns(address) -func (_ENSRegistry *ENSRegistryCallerSession) Owner(node [32]byte) (common.Address, error) { - return _ENSRegistry.Contract.Owner(&_ENSRegistry.CallOpts, node) -} - -// Resolver is a free data retrieval call binding the contract method 0x0178b8bf. -// -// Solidity: function resolver(bytes32 node) constant returns(address) -func (_ENSRegistry *ENSRegistryCaller) Resolver(opts *bind.CallOpts, node [32]byte) (common.Address, error) { - var ( - ret0 = new(common.Address) - ) - out := ret0 - err := _ENSRegistry.contract.Call(opts, out, "resolver", node) - return *ret0, err -} - -// Resolver is a free data retrieval call binding the contract method 0x0178b8bf. -// -// Solidity: function resolver(bytes32 node) constant returns(address) -func (_ENSRegistry *ENSRegistrySession) Resolver(node [32]byte) (common.Address, error) { - return _ENSRegistry.Contract.Resolver(&_ENSRegistry.CallOpts, node) -} - -// Resolver is a free data retrieval call binding the contract method 0x0178b8bf. -// -// Solidity: function resolver(bytes32 node) constant returns(address) -func (_ENSRegistry *ENSRegistryCallerSession) Resolver(node [32]byte) (common.Address, error) { - return _ENSRegistry.Contract.Resolver(&_ENSRegistry.CallOpts, node) -} - -// Ttl is a free data retrieval call binding the contract method 0x16a25cbd. -// -// Solidity: function ttl(bytes32 node) constant returns(uint64) -func (_ENSRegistry *ENSRegistryCaller) Ttl(opts *bind.CallOpts, node [32]byte) (uint64, error) { - var ( - ret0 = new(uint64) - ) - out := ret0 - err := _ENSRegistry.contract.Call(opts, out, "ttl", node) - return *ret0, err -} - -// Ttl is a free data retrieval call binding the contract method 0x16a25cbd. -// -// Solidity: function ttl(bytes32 node) constant returns(uint64) -func (_ENSRegistry *ENSRegistrySession) Ttl(node [32]byte) (uint64, error) { - return _ENSRegistry.Contract.Ttl(&_ENSRegistry.CallOpts, node) -} - -// Ttl is a free data retrieval call binding the contract method 0x16a25cbd. -// -// Solidity: function ttl(bytes32 node) constant returns(uint64) -func (_ENSRegistry *ENSRegistryCallerSession) Ttl(node [32]byte) (uint64, error) { - return _ENSRegistry.Contract.Ttl(&_ENSRegistry.CallOpts, node) -} - -// SetOwner is a paid mutator transaction binding the contract method 0x5b0fc9c3. -// -// Solidity: function setOwner(bytes32 node, address owner) returns() -func (_ENSRegistry *ENSRegistryTransactor) SetOwner(opts *bind.TransactOpts, node [32]byte, owner common.Address) (*types.Transaction, error) { - return _ENSRegistry.contract.Transact(opts, "setOwner", node, owner) -} - -// SetOwner is a paid mutator transaction binding the contract method 0x5b0fc9c3. -// -// Solidity: function setOwner(bytes32 node, address owner) returns() -func (_ENSRegistry *ENSRegistrySession) SetOwner(node [32]byte, owner common.Address) (*types.Transaction, error) { - return _ENSRegistry.Contract.SetOwner(&_ENSRegistry.TransactOpts, node, owner) -} - -// SetOwner is a paid mutator transaction binding the contract method 0x5b0fc9c3. -// -// Solidity: function setOwner(bytes32 node, address owner) returns() -func (_ENSRegistry *ENSRegistryTransactorSession) SetOwner(node [32]byte, owner common.Address) (*types.Transaction, error) { - return _ENSRegistry.Contract.SetOwner(&_ENSRegistry.TransactOpts, node, owner) -} - -// SetResolver is a paid mutator transaction binding the contract method 0x1896f70a. -// -// Solidity: function setResolver(bytes32 node, address resolver) returns() -func (_ENSRegistry *ENSRegistryTransactor) SetResolver(opts *bind.TransactOpts, node [32]byte, resolver common.Address) (*types.Transaction, error) { - return _ENSRegistry.contract.Transact(opts, "setResolver", node, resolver) -} - -// SetResolver is a paid mutator transaction binding the contract method 0x1896f70a. -// -// Solidity: function setResolver(bytes32 node, address resolver) returns() -func (_ENSRegistry *ENSRegistrySession) SetResolver(node [32]byte, resolver common.Address) (*types.Transaction, error) { - return _ENSRegistry.Contract.SetResolver(&_ENSRegistry.TransactOpts, node, resolver) -} - -// SetResolver is a paid mutator transaction binding the contract method 0x1896f70a. -// -// Solidity: function setResolver(bytes32 node, address resolver) returns() -func (_ENSRegistry *ENSRegistryTransactorSession) SetResolver(node [32]byte, resolver common.Address) (*types.Transaction, error) { - return _ENSRegistry.Contract.SetResolver(&_ENSRegistry.TransactOpts, node, resolver) -} - -// SetSubnodeOwner is a paid mutator transaction binding the contract method 0x06ab5923. -// -// Solidity: function setSubnodeOwner(bytes32 node, bytes32 label, address owner) returns() -func (_ENSRegistry *ENSRegistryTransactor) SetSubnodeOwner(opts *bind.TransactOpts, node [32]byte, label [32]byte, owner common.Address) (*types.Transaction, error) { - return _ENSRegistry.contract.Transact(opts, "setSubnodeOwner", node, label, owner) -} - -// SetSubnodeOwner is a paid mutator transaction binding the contract method 0x06ab5923. -// -// Solidity: function setSubnodeOwner(bytes32 node, bytes32 label, address owner) returns() -func (_ENSRegistry *ENSRegistrySession) SetSubnodeOwner(node [32]byte, label [32]byte, owner common.Address) (*types.Transaction, error) { - return _ENSRegistry.Contract.SetSubnodeOwner(&_ENSRegistry.TransactOpts, node, label, owner) -} - -// SetSubnodeOwner is a paid mutator transaction binding the contract method 0x06ab5923. -// -// Solidity: function setSubnodeOwner(bytes32 node, bytes32 label, address owner) returns() -func (_ENSRegistry *ENSRegistryTransactorSession) SetSubnodeOwner(node [32]byte, label [32]byte, owner common.Address) (*types.Transaction, error) { - return _ENSRegistry.Contract.SetSubnodeOwner(&_ENSRegistry.TransactOpts, node, label, owner) -} - -// SetTTL is a paid mutator transaction binding the contract method 0x14ab9038. -// -// Solidity: function setTTL(bytes32 node, uint64 ttl) returns() -func (_ENSRegistry *ENSRegistryTransactor) SetTTL(opts *bind.TransactOpts, node [32]byte, ttl uint64) (*types.Transaction, error) { - return _ENSRegistry.contract.Transact(opts, "setTTL", node, ttl) -} - -// SetTTL is a paid mutator transaction binding the contract method 0x14ab9038. -// -// Solidity: function setTTL(bytes32 node, uint64 ttl) returns() -func (_ENSRegistry *ENSRegistrySession) SetTTL(node [32]byte, ttl uint64) (*types.Transaction, error) { - return _ENSRegistry.Contract.SetTTL(&_ENSRegistry.TransactOpts, node, ttl) -} - -// SetTTL is a paid mutator transaction binding the contract method 0x14ab9038. -// -// Solidity: function setTTL(bytes32 node, uint64 ttl) returns() -func (_ENSRegistry *ENSRegistryTransactorSession) SetTTL(node [32]byte, ttl uint64) (*types.Transaction, error) { - return _ENSRegistry.Contract.SetTTL(&_ENSRegistry.TransactOpts, node, ttl) -} - -// ENSRegistryNewOwnerIterator is returned from FilterNewOwner and is used to iterate over the raw logs and unpacked data for NewOwner events raised by the ENSRegistry contract. -type ENSRegistryNewOwnerIterator struct { - Event *ENSRegistryNewOwner // 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 *ENSRegistryNewOwnerIterator) 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(ENSRegistryNewOwner) - 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(ENSRegistryNewOwner) - 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 *ENSRegistryNewOwnerIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *ENSRegistryNewOwnerIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// ENSRegistryNewOwner represents a NewOwner event raised by the ENSRegistry contract. -type ENSRegistryNewOwner 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(bytes32 indexed node, bytes32 indexed label, address owner) -func (_ENSRegistry *ENSRegistryFilterer) FilterNewOwner(opts *bind.FilterOpts, node [][32]byte, label [][32]byte) (*ENSRegistryNewOwnerIterator, 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 := _ENSRegistry.contract.FilterLogs(opts, "NewOwner", nodeRule, labelRule) - if err != nil { - return nil, err - } - return &ENSRegistryNewOwnerIterator{contract: _ENSRegistry.contract, event: "NewOwner", logs: logs, sub: sub}, nil -} - -// WatchNewOwner is a free log subscription operation binding the contract event 0xce0457fe73731f824cc272376169235128c118b49d344817417c6d108d155e82. -// -// Solidity: event NewOwner(bytes32 indexed node, bytes32 indexed label, address owner) -func (_ENSRegistry *ENSRegistryFilterer) WatchNewOwner(opts *bind.WatchOpts, sink chan<- *ENSRegistryNewOwner, 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 := _ENSRegistry.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(ENSRegistryNewOwner) - if err := _ENSRegistry.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 -} - -// ENSRegistryNewResolverIterator is returned from FilterNewResolver and is used to iterate over the raw logs and unpacked data for NewResolver events raised by the ENSRegistry contract. -type ENSRegistryNewResolverIterator struct { - Event *ENSRegistryNewResolver // 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 *ENSRegistryNewResolverIterator) 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(ENSRegistryNewResolver) - 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(ENSRegistryNewResolver) - 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 *ENSRegistryNewResolverIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *ENSRegistryNewResolverIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// ENSRegistryNewResolver represents a NewResolver event raised by the ENSRegistry contract. -type ENSRegistryNewResolver 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(bytes32 indexed node, address resolver) -func (_ENSRegistry *ENSRegistryFilterer) FilterNewResolver(opts *bind.FilterOpts, node [][32]byte) (*ENSRegistryNewResolverIterator, error) { - - var nodeRule []interface{} - for _, nodeItem := range node { - nodeRule = append(nodeRule, nodeItem) - } - - logs, sub, err := _ENSRegistry.contract.FilterLogs(opts, "NewResolver", nodeRule) - if err != nil { - return nil, err - } - return &ENSRegistryNewResolverIterator{contract: _ENSRegistry.contract, event: "NewResolver", logs: logs, sub: sub}, nil -} - -// WatchNewResolver is a free log subscription operation binding the contract event 0x335721b01866dc23fbee8b6b2c7b1e14d6f05c28cd35a2c934239f94095602a0. -// -// Solidity: event NewResolver(bytes32 indexed node, address resolver) -func (_ENSRegistry *ENSRegistryFilterer) WatchNewResolver(opts *bind.WatchOpts, sink chan<- *ENSRegistryNewResolver, node [][32]byte) (event.Subscription, error) { - - var nodeRule []interface{} - for _, nodeItem := range node { - nodeRule = append(nodeRule, nodeItem) - } - - logs, sub, err := _ENSRegistry.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(ENSRegistryNewResolver) - if err := _ENSRegistry.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 -} - -// ENSRegistryNewTTLIterator is returned from FilterNewTTL and is used to iterate over the raw logs and unpacked data for NewTTL events raised by the ENSRegistry contract. -type ENSRegistryNewTTLIterator struct { - Event *ENSRegistryNewTTL // 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 *ENSRegistryNewTTLIterator) 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(ENSRegistryNewTTL) - 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(ENSRegistryNewTTL) - 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 *ENSRegistryNewTTLIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *ENSRegistryNewTTLIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// ENSRegistryNewTTL represents a NewTTL event raised by the ENSRegistry contract. -type ENSRegistryNewTTL 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(bytes32 indexed node, uint64 ttl) -func (_ENSRegistry *ENSRegistryFilterer) FilterNewTTL(opts *bind.FilterOpts, node [][32]byte) (*ENSRegistryNewTTLIterator, error) { - - var nodeRule []interface{} - for _, nodeItem := range node { - nodeRule = append(nodeRule, nodeItem) - } - - logs, sub, err := _ENSRegistry.contract.FilterLogs(opts, "NewTTL", nodeRule) - if err != nil { - return nil, err - } - return &ENSRegistryNewTTLIterator{contract: _ENSRegistry.contract, event: "NewTTL", logs: logs, sub: sub}, nil -} - -// WatchNewTTL is a free log subscription operation binding the contract event 0x1d4f9bbfc9cab89d66e1a1562f2233ccbf1308cb4f63de2ead5787adddb8fa68. -// -// Solidity: event NewTTL(bytes32 indexed node, uint64 ttl) -func (_ENSRegistry *ENSRegistryFilterer) WatchNewTTL(opts *bind.WatchOpts, sink chan<- *ENSRegistryNewTTL, node [][32]byte) (event.Subscription, error) { - - var nodeRule []interface{} - for _, nodeItem := range node { - nodeRule = append(nodeRule, nodeItem) - } - - logs, sub, err := _ENSRegistry.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(ENSRegistryNewTTL) - if err := _ENSRegistry.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 -} - -// ENSRegistryTransferIterator is returned from FilterTransfer and is used to iterate over the raw logs and unpacked data for Transfer events raised by the ENSRegistry contract. -type ENSRegistryTransferIterator struct { - Event *ENSRegistryTransfer // 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 *ENSRegistryTransferIterator) 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(ENSRegistryTransfer) - 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(ENSRegistryTransfer) - 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 *ENSRegistryTransferIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *ENSRegistryTransferIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// ENSRegistryTransfer represents a Transfer event raised by the ENSRegistry contract. -type ENSRegistryTransfer 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(bytes32 indexed node, address owner) -func (_ENSRegistry *ENSRegistryFilterer) FilterTransfer(opts *bind.FilterOpts, node [][32]byte) (*ENSRegistryTransferIterator, error) { - - var nodeRule []interface{} - for _, nodeItem := range node { - nodeRule = append(nodeRule, nodeItem) - } - - logs, sub, err := _ENSRegistry.contract.FilterLogs(opts, "Transfer", nodeRule) - if err != nil { - return nil, err - } - return &ENSRegistryTransferIterator{contract: _ENSRegistry.contract, event: "Transfer", logs: logs, sub: sub}, nil -} - -// WatchTransfer is a free log subscription operation binding the contract event 0xd4735d920b0f87494915f556dd9b54c8f309026070caea5c737245152564d266. -// -// Solidity: event Transfer(bytes32 indexed node, address owner) -func (_ENSRegistry *ENSRegistryFilterer) WatchTransfer(opts *bind.WatchOpts, sink chan<- *ENSRegistryTransfer, node [][32]byte) (event.Subscription, error) { - - var nodeRule []interface{} - for _, nodeItem := range node { - nodeRule = append(nodeRule, nodeItem) - } - - logs, sub, err := _ENSRegistry.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(ENSRegistryTransfer) - if err := _ENSRegistry.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/vendor/github.com/ethereum/go-ethereum/contracts/ens/contract/fifsregistrar.go b/vendor/github.com/ethereum/go-ethereum/contracts/ens/contract/fifsregistrar.go deleted file mode 100644 index 97263cbe..00000000 --- a/vendor/github.com/ethereum/go-ethereum/contracts/ens/contract/fifsregistrar.go +++ /dev/null @@ -1,210 +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/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 -) - -// FIFSRegistrarABI is the input ABI used to generate the binding from. -const FIFSRegistrarABI = "[{\"constant\":false,\"inputs\":[{\"name\":\"label\",\"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 = `0x608060405234801561001057600080fd5b506040516040806102cc8339810180604052604081101561003057600080fd5b50805160209091015160008054600160a060020a031916600160a060020a0390931692909217825560015561026190819061006b90396000f3fe6080604052600436106100405763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663d22057a98114610045575b600080fd5b34801561005157600080fd5b5061008b6004803603604081101561006857600080fd5b508035906020013573ffffffffffffffffffffffffffffffffffffffff1661008d565b005b6000805460015460408051602080820193909352808201879052815180820383018152606082018084528151918501919091207f02571be3000000000000000000000000000000000000000000000000000000009091526064820152905186949373ffffffffffffffffffffffffffffffffffffffff16926302571be39260848082019391829003018186803b15801561012657600080fd5b505afa15801561013a573d6000803e3d6000fd5b505050506040513d602081101561015057600080fd5b5051905073ffffffffffffffffffffffffffffffffffffffff8116158061018c575073ffffffffffffffffffffffffffffffffffffffff811633145b151561019757600080fd5b60008054600154604080517f06ab592300000000000000000000000000000000000000000000000000000000815260048101929092526024820188905273ffffffffffffffffffffffffffffffffffffffff878116604484015290519216926306ab59239260648084019382900301818387803b15801561021757600080fd5b505af115801561022b573d6000803e3d6000fd5b505050505050505056fea165627a7a723058200f21424d48c6fc6f2bc79f5b36b3a0e3067a97d4ce084ab0e0f9106303a3ee520029` - -// 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(bytes32 label, address owner) returns() -func (_FIFSRegistrar *FIFSRegistrarTransactor) Register(opts *bind.TransactOpts, label [32]byte, owner common.Address) (*types.Transaction, error) { - return _FIFSRegistrar.contract.Transact(opts, "register", label, owner) -} - -// Register is a paid mutator transaction binding the contract method 0xd22057a9. -// -// Solidity: function register(bytes32 label, address owner) returns() -func (_FIFSRegistrar *FIFSRegistrarSession) Register(label [32]byte, owner common.Address) (*types.Transaction, error) { - return _FIFSRegistrar.Contract.Register(&_FIFSRegistrar.TransactOpts, label, owner) -} - -// Register is a paid mutator transaction binding the contract method 0xd22057a9. -// -// Solidity: function register(bytes32 label, address owner) returns() -func (_FIFSRegistrar *FIFSRegistrarTransactorSession) Register(label [32]byte, owner common.Address) (*types.Transaction, error) { - return _FIFSRegistrar.Contract.Register(&_FIFSRegistrar.TransactOpts, label, owner) -} diff --git a/vendor/github.com/ethereum/go-ethereum/contracts/ens/contract/publicresolver.go b/vendor/github.com/ethereum/go-ethereum/contracts/ens/contract/publicresolver.go deleted file mode 100644 index 01bfce5e..00000000 --- a/vendor/github.com/ethereum/go-ethereum/contracts/ens/contract/publicresolver.go +++ /dev/null @@ -1,1319 +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/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 -) - -// 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\":\"pure\",\"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\":\"\",\"type\":\"uint256\"},{\"name\":\"\",\"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\":false,\"inputs\":[{\"name\":\"node\",\"type\":\"bytes32\"},{\"name\":\"hash\",\"type\":\"bytes\"}],\"name\":\"setContenthash\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"node\",\"type\":\"bytes32\"}],\"name\":\"addr\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"node\",\"type\":\"bytes32\"},{\"name\":\"key\",\"type\":\"string\"}],\"name\":\"text\",\"outputs\":[{\"name\":\"\",\"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\":\"\",\"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\":true,\"inputs\":[{\"name\":\"node\",\"type\":\"bytes32\"}],\"name\":\"contenthash\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"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\":\"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\":false,\"name\":\"indexedKey\",\"type\":\"string\"},{\"indexed\":false,\"name\":\"key\",\"type\":\"string\"}],\"name\":\"TextChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"node\",\"type\":\"bytes32\"},{\"indexed\":false,\"name\":\"hash\",\"type\":\"bytes\"}],\"name\":\"ContenthashChanged\",\"type\":\"event\"}]" - -// PublicResolverBin is the compiled bytecode used for deploying new contracts. -const PublicResolverBin = `0x608060405234801561001057600080fd5b506040516020806112ce8339810180604052602081101561003057600080fd5b505160008054600160a060020a03909216600160a060020a031990921691909117905561126c806100626000396000f3fe6080604052600436106100c45763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166301ffc9a781146100c957806310f13a8c146101115780632203ab56146101e957806329cd62ea14610298578063304e6ade146102ce5780633b3b57de1461035257806359d1d43c14610398578063623195b014610491578063691f34311461051a5780637737221314610544578063bc1c58d1146105c8578063c8690233146105f2578063d5fa2b0014610635575b600080fd5b3480156100d557600080fd5b506100fd600480360360208110156100ec57600080fd5b5035600160e060020a03191661066e565b604080519115158252519081900360200190f35b34801561011d57600080fd5b506101e76004803603606081101561013457600080fd5b8135919081019060408101602082013564010000000081111561015657600080fd5b82018360208201111561016857600080fd5b8035906020019184600183028401116401000000008311171561018a57600080fd5b9193909290916020810190356401000000008111156101a857600080fd5b8201836020820111156101ba57600080fd5b803590602001918460018302840111640100000000831117156101dc57600080fd5b5090925090506107db565b005b3480156101f557600080fd5b506102196004803603604081101561020c57600080fd5b508035906020013561094d565b6040518083815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561025c578181015183820152602001610244565b50505050905090810190601f1680156102895780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b3480156102a457600080fd5b506101e7600480360360608110156102bb57600080fd5b5080359060208101359060400135610a65565b3480156102da57600080fd5b506101e7600480360360408110156102f157600080fd5b8135919081019060408101602082013564010000000081111561031357600080fd5b82018360208201111561032557600080fd5b8035906020019184600183028401116401000000008311171561034757600080fd5b509092509050610b65565b34801561035e57600080fd5b5061037c6004803603602081101561037557600080fd5b5035610c7b565b60408051600160a060020a039092168252519081900360200190f35b3480156103a457600080fd5b5061041c600480360360408110156103bb57600080fd5b813591908101906040810160208201356401000000008111156103dd57600080fd5b8201836020820111156103ef57600080fd5b8035906020019184600183028401116401000000008311171561041157600080fd5b509092509050610c96565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561045657818101518382015260200161043e565b50505050905090810190601f1680156104835780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561049d57600080fd5b506101e7600480360360608110156104b457600080fd5b8135916020810135918101906060810160408201356401000000008111156104db57600080fd5b8201836020820111156104ed57600080fd5b8035906020019184600183028401116401000000008311171561050f57600080fd5b509092509050610d60565b34801561052657600080fd5b5061041c6004803603602081101561053d57600080fd5b5035610e5f565b34801561055057600080fd5b506101e76004803603604081101561056757600080fd5b8135919081019060408101602082013564010000000081111561058957600080fd5b82018360208201111561059b57600080fd5b803590602001918460018302840111640100000000831117156105bd57600080fd5b509092509050610f01565b3480156105d457600080fd5b5061041c600480360360208110156105eb57600080fd5b5035611018565b3480156105fe57600080fd5b5061061c6004803603602081101561061557600080fd5b5035611084565b6040805192835260208301919091528051918290030190f35b34801561064157600080fd5b506101e76004803603604081101561065857600080fd5b5080359060200135600160a060020a03166110a1565b6000600160e060020a031982167f3b3b57de0000000000000000000000000000000000000000000000000000000014806106d15750600160e060020a031982167f691f343100000000000000000000000000000000000000000000000000000000145b806107055750600160e060020a031982167f2203ab5600000000000000000000000000000000000000000000000000000000145b806107395750600160e060020a031982167fc869023300000000000000000000000000000000000000000000000000000000145b8061076d5750600160e060020a031982167f59d1d43c00000000000000000000000000000000000000000000000000000000145b806107a15750600160e060020a031982167fbc1c58d100000000000000000000000000000000000000000000000000000000145b806107d55750600160e060020a031982167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b6000546040805160e060020a6302571be302815260048101889052905187923392600160a060020a03909116916302571be391602480820192602092909190829003018186803b15801561082e57600080fd5b505afa158015610842573d6000803e3d6000fd5b505050506040513d602081101561085857600080fd5b5051600160a060020a03161461086d57600080fd5b8282600160008981526020019081526020016000206004018787604051808383808284378083019250505092505050908152602001604051809103902091906108b79291906111a5565b50857fd8c9334b1a9c2f9da342a0a2b32629c1a229b6445dad78947f674b44444a7550868688886040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a2505050505050565b600082815260016020819052604082206060915b848111610a53578085161580159061099a5750600081815260058301602052604081205460026000196101006001841615020190911604115b15610a4b57600081815260058301602090815260409182902080548351601f6002600019610100600186161502019093169290920491820184900484028101840190945280845284939192839190830182828015610a395780601f10610a0e57610100808354040283529160200191610a39565b820191906000526020600020905b815481529060010190602001808311610a1c57829003601f168201915b50505050509050935093505050610a5e565b600202610961565b506000925060609150505b9250929050565b6000546040805160e060020a6302571be302815260048101869052905185923392600160a060020a03909116916302571be391602480820192602092909190829003018186803b158015610ab857600080fd5b505afa158015610acc573d6000803e3d6000fd5b505050506040513d6020811015610ae257600080fd5b5051600160a060020a031614610af757600080fd5b604080518082018252848152602080820185815260008881526001835284902092516002840155516003909201919091558151858152908101849052815186927f1d6f5e03d3f63eb58751986629a5439baee5079ff04f345becb66e23eb154e46928290030190a250505050565b6000546040805160e060020a6302571be302815260048101869052905185923392600160a060020a03909116916302571be391602480820192602092909190829003018186803b158015610bb857600080fd5b505afa158015610bcc573d6000803e3d6000fd5b505050506040513d6020811015610be257600080fd5b5051600160a060020a031614610bf757600080fd5b6000848152600160205260409020610c139060060184846111a5565b50837fe379c1624ed7e714cc0937528a32359d69d5281337765313dba4e081b72d7578848460405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a250505050565b600090815260016020526040902054600160a060020a031690565b6060600160008581526020019081526020016000206004018383604051808383808284379190910194855250506040805160209481900385018120805460026001821615610100026000190190911604601f81018790048702830187019093528282529094909350909150830182828015610d525780601f10610d2757610100808354040283529160200191610d52565b820191906000526020600020905b815481529060010190602001808311610d3557829003601f168201915b505050505090509392505050565b6000546040805160e060020a6302571be302815260048101879052905186923392600160a060020a03909116916302571be391602480820192602092909190829003018186803b158015610db357600080fd5b505afa158015610dc7573d6000803e3d6000fd5b505050506040513d6020811015610ddd57600080fd5b5051600160a060020a031614610df257600080fd5b6000198401841615610e0357600080fd5b60008581526001602090815260408083208784526005019091529020610e2a9084846111a5565b50604051849086907faa121bbeef5f32f5961a2a28966e769023910fc9479059ee3495d4c1a696efe390600090a35050505050565b600081815260016020818152604092839020820180548451600294821615610100026000190190911693909304601f81018390048302840183019094528383526060939091830182828015610ef55780601f10610eca57610100808354040283529160200191610ef5565b820191906000526020600020905b815481529060010190602001808311610ed857829003601f168201915b50505050509050919050565b6000546040805160e060020a6302571be302815260048101869052905185923392600160a060020a03909116916302571be391602480820192602092909190829003018186803b158015610f5457600080fd5b505afa158015610f68573d6000803e3d6000fd5b505050506040513d6020811015610f7e57600080fd5b5051600160a060020a031614610f9357600080fd5b6000848152600160208190526040909120610fb0910184846111a5565b50837fb7d29e911041e8d9b843369e890bcb72c9388692ba48b65ac54e7214c4c348f7848460405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a250505050565b60008181526001602081815260409283902060060180548451600294821615610100026000190190911693909304601f81018390048302840183019094528383526060939091830182828015610ef55780601f10610eca57610100808354040283529160200191610ef5565b600090815260016020526040902060028101546003909101549091565b6000546040805160e060020a6302571be302815260048101859052905184923392600160a060020a03909116916302571be391602480820192602092909190829003018186803b1580156110f457600080fd5b505afa158015611108573d6000803e3d6000fd5b505050506040513d602081101561111e57600080fd5b5051600160a060020a03161461113357600080fd5b600083815260016020908152604091829020805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0386169081179091558251908152915185927f52d7d861f09ab3d26239d492e8968629f95e9e318cf0b73bfddc441522a15fd292908290030190a2505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106111e65782800160ff19823516178555611213565b82800160010185558215611213579182015b828111156112135782358255916020019190600101906111f8565b5061121f929150611223565b5090565b61123d91905b8082111561121f5760008155600101611229565b9056fea165627a7a7230582047f310fc746ab2e282cf63ba794d20abb361f9284c6c5f2a2e26151e5b7fab600029` - -// 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(bytes32 node, uint256 contentTypes) constant returns(uint256, bytes) -func (_PublicResolver *PublicResolverCaller) ABI(opts *bind.CallOpts, node [32]byte, contentTypes *big.Int) (*big.Int, []byte, error) { - var ( - ret0 = new(*big.Int) - ret1 = new([]byte) - ) - out := &[]interface{}{ - ret0, - ret1, - } - err := _PublicResolver.contract.Call(opts, out, "ABI", node, contentTypes) - return *ret0, *ret1, err -} - -// ABI is a free data retrieval call binding the contract method 0x2203ab56. -// -// Solidity: function ABI(bytes32 node, uint256 contentTypes) constant returns(uint256, bytes) -func (_PublicResolver *PublicResolverSession) ABI(node [32]byte, contentTypes *big.Int) (*big.Int, []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(bytes32 node, uint256 contentTypes) constant returns(uint256, bytes) -func (_PublicResolver *PublicResolverCallerSession) ABI(node [32]byte, contentTypes *big.Int) (*big.Int, []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(bytes32 node) constant returns(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(bytes32 node) constant returns(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(bytes32 node) constant returns(address) -func (_PublicResolver *PublicResolverCallerSession) Addr(node [32]byte) (common.Address, error) { - return _PublicResolver.Contract.Addr(&_PublicResolver.CallOpts, node) -} - -// Contenthash is a free data retrieval call binding the contract method 0xbc1c58d1. -// -// Solidity: function contenthash(bytes32 node) constant returns(bytes) -func (_PublicResolver *PublicResolverCaller) Contenthash(opts *bind.CallOpts, node [32]byte) ([]byte, error) { - var ( - ret0 = new([]byte) - ) - out := ret0 - err := _PublicResolver.contract.Call(opts, out, "contenthash", node) - return *ret0, err -} - -// Contenthash is a free data retrieval call binding the contract method 0xbc1c58d1. -// -// Solidity: function contenthash(bytes32 node) constant returns(bytes) -func (_PublicResolver *PublicResolverSession) Contenthash(node [32]byte) ([]byte, error) { - return _PublicResolver.Contract.Contenthash(&_PublicResolver.CallOpts, node) -} - -// Contenthash is a free data retrieval call binding the contract method 0xbc1c58d1. -// -// Solidity: function contenthash(bytes32 node) constant returns(bytes) -func (_PublicResolver *PublicResolverCallerSession) Contenthash(node [32]byte) ([]byte, error) { - return _PublicResolver.Contract.Contenthash(&_PublicResolver.CallOpts, node) -} - -// Name is a free data retrieval call binding the contract method 0x691f3431. -// -// Solidity: function name(bytes32 node) constant returns(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(bytes32 node) constant returns(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(bytes32 node) constant returns(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(bytes32 node) constant returns(bytes32 x, bytes32 y) -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(bytes32 node) constant returns(bytes32 x, bytes32 y) -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(bytes32 node) constant returns(bytes32 x, bytes32 y) -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(bytes4 interfaceID) 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(bytes4 interfaceID) 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(bytes4 interfaceID) 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(bytes32 node, string key) constant returns(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(bytes32 node, string key) constant returns(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(bytes32 node, string key) constant returns(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(bytes32 node, uint256 contentType, bytes data) 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(bytes32 node, uint256 contentType, bytes data) 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(bytes32 node, uint256 contentType, bytes data) 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(bytes32 node, address addr) 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(bytes32 node, address addr) 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(bytes32 node, address addr) returns() -func (_PublicResolver *PublicResolverTransactorSession) SetAddr(node [32]byte, addr common.Address) (*types.Transaction, error) { - return _PublicResolver.Contract.SetAddr(&_PublicResolver.TransactOpts, node, addr) -} - -// SetContenthash is a paid mutator transaction binding the contract method 0x304e6ade. -// -// Solidity: function setContenthash(bytes32 node, bytes hash) returns() -func (_PublicResolver *PublicResolverTransactor) SetContenthash(opts *bind.TransactOpts, node [32]byte, hash []byte) (*types.Transaction, error) { - return _PublicResolver.contract.Transact(opts, "setContenthash", node, hash) -} - -// SetContenthash is a paid mutator transaction binding the contract method 0x304e6ade. -// -// Solidity: function setContenthash(bytes32 node, bytes hash) returns() -func (_PublicResolver *PublicResolverSession) SetContenthash(node [32]byte, hash []byte) (*types.Transaction, error) { - return _PublicResolver.Contract.SetContenthash(&_PublicResolver.TransactOpts, node, hash) -} - -// SetContenthash is a paid mutator transaction binding the contract method 0x304e6ade. -// -// Solidity: function setContenthash(bytes32 node, bytes hash) returns() -func (_PublicResolver *PublicResolverTransactorSession) SetContenthash(node [32]byte, hash []byte) (*types.Transaction, error) { - return _PublicResolver.Contract.SetContenthash(&_PublicResolver.TransactOpts, node, hash) -} - -// SetName is a paid mutator transaction binding the contract method 0x77372213. -// -// Solidity: function setName(bytes32 node, string name) 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(bytes32 node, string name) 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(bytes32 node, string name) 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(bytes32 node, bytes32 x, bytes32 y) 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(bytes32 node, bytes32 x, bytes32 y) 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(bytes32 node, bytes32 x, bytes32 y) 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(bytes32 node, string key, string value) 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(bytes32 node, string key, string value) 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(bytes32 node, string key, string value) 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 returns 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(bytes32 indexed node, uint256 indexed contentType) -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(bytes32 indexed node, uint256 indexed contentType) -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 returns 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(bytes32 indexed node, address a) -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(bytes32 indexed node, address a) -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 -} - -// PublicResolverContenthashChangedIterator is returned from FilterContenthashChanged and is used to iterate over the raw logs and unpacked data for ContenthashChanged events raised by the PublicResolver contract. -type PublicResolverContenthashChangedIterator struct { - Event *PublicResolverContenthashChanged // 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 *PublicResolverContenthashChangedIterator) 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(PublicResolverContenthashChanged) - 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(PublicResolverContenthashChanged) - 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 *PublicResolverContenthashChangedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *PublicResolverContenthashChangedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// PublicResolverContenthashChanged represents a ContenthashChanged event raised by the PublicResolver contract. -type PublicResolverContenthashChanged struct { - Node [32]byte - Hash []byte - Raw types.Log // Blockchain specific contextual infos -} - -// FilterContenthashChanged is a free log retrieval operation binding the contract event 0xe379c1624ed7e714cc0937528a32359d69d5281337765313dba4e081b72d7578. -// -// Solidity: event ContenthashChanged(bytes32 indexed node, bytes hash) -func (_PublicResolver *PublicResolverFilterer) FilterContenthashChanged(opts *bind.FilterOpts, node [][32]byte) (*PublicResolverContenthashChangedIterator, error) { - - var nodeRule []interface{} - for _, nodeItem := range node { - nodeRule = append(nodeRule, nodeItem) - } - - logs, sub, err := _PublicResolver.contract.FilterLogs(opts, "ContenthashChanged", nodeRule) - if err != nil { - return nil, err - } - return &PublicResolverContenthashChangedIterator{contract: _PublicResolver.contract, event: "ContenthashChanged", logs: logs, sub: sub}, nil -} - -// WatchContenthashChanged is a free log subscription operation binding the contract event 0xe379c1624ed7e714cc0937528a32359d69d5281337765313dba4e081b72d7578. -// -// Solidity: event ContenthashChanged(bytes32 indexed node, bytes hash) -func (_PublicResolver *PublicResolverFilterer) WatchContenthashChanged(opts *bind.WatchOpts, sink chan<- *PublicResolverContenthashChanged, node [][32]byte) (event.Subscription, error) { - - var nodeRule []interface{} - for _, nodeItem := range node { - nodeRule = append(nodeRule, nodeItem) - } - - logs, sub, err := _PublicResolver.contract.WatchLogs(opts, "ContenthashChanged", 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(PublicResolverContenthashChanged) - if err := _PublicResolver.contract.UnpackLog(event, "ContenthashChanged", 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 returns 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(bytes32 indexed node, string name) -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(bytes32 indexed node, string name) -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 returns 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(bytes32 indexed node, bytes32 x, bytes32 y) -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(bytes32 indexed node, bytes32 x, bytes32 y) -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 returns 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 string - Key string - Raw types.Log // Blockchain specific contextual infos -} - -// FilterTextChanged is a free log retrieval operation binding the contract event 0xd8c9334b1a9c2f9da342a0a2b32629c1a229b6445dad78947f674b44444a7550. -// -// Solidity: event TextChanged(bytes32 indexed node, string indexedKey, string key) -func (_PublicResolver *PublicResolverFilterer) FilterTextChanged(opts *bind.FilterOpts, node [][32]byte) (*PublicResolverTextChangedIterator, error) { - - var nodeRule []interface{} - for _, nodeItem := range node { - nodeRule = append(nodeRule, nodeItem) - } - - logs, sub, err := _PublicResolver.contract.FilterLogs(opts, "TextChanged", nodeRule) - 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(bytes32 indexed node, string indexedKey, string key) -func (_PublicResolver *PublicResolverFilterer) WatchTextChanged(opts *bind.WatchOpts, sink chan<- *PublicResolverTextChanged, node [][32]byte) (event.Subscription, error) { - - var nodeRule []interface{} - for _, nodeItem := range node { - nodeRule = append(nodeRule, nodeItem) - } - - logs, sub, err := _PublicResolver.contract.WatchLogs(opts, "TextChanged", 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(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/vendor/github.com/ethereum/go-ethereum/contracts/ens/ens.go b/vendor/github.com/ethereum/go-ethereum/contracts/ens/ens.go deleted file mode 100644 index 6fed172d..00000000 --- a/vendor/github.com/ethereum/go-ethereum/contracts/ens/ens.go +++ /dev/null @@ -1,263 +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 --pkg contract --out contract/ens.go -//go:generate abigen --sol contract/ENSRegistry.sol --exc contract/ENS.sol:ENS --pkg contract --out contract/ensregistry.go -//go:generate abigen --sol contract/FIFSRegistrar.sol --exc contract/ENS.sol:ENS --pkg contract --out contract/fifsregistrar.go -//go:generate abigen --sol contract/PublicResolver.sol --exc contract/ENS.sol:ENS --pkg contract --out contract/publicresolver.go - -import ( - "encoding/binary" - "strings" - - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/contracts/ens/contract" - "github.com/ethereum/go-ethereum/contracts/ens/fallback_contract" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/crypto" -) - -var ( - MainNetAddress = common.HexToAddress("0x314159265dD8dbb310642f98f50C066173C1259b") - TestNetAddress = common.HexToAddress("0x112234455c3a32fd11230c42e7bccd4a84e02010") - contentHash_Interface_Id [4]byte -) - -const contentHash_Interface_Id_Spec = 0xbc1c58d1 - -func init() { - binary.BigEndian.PutUint32(contentHash_Interface_Id[:], contentHash_Interface_Id_Spec) -} - -// ENS is the 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.DeployENSRegistry(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 - } - 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 (ens *ENS) getResolver(node [32]byte) (*contract.PublicResolverSession, error) { - resolverAddr, err := ens.Resolver(node) - if err != nil { - return nil, err - } - resolver, err := contract.NewPublicResolver(resolverAddr, ens.contractBackend) - if err != nil { - return nil, err - } - return &contract.PublicResolverSession{ - Contract: resolver, - TransactOpts: ens.TransactOpts, - }, nil -} - -func (ens *ENS) getFallbackResolver(node [32]byte) (*fallback_contract.PublicResolverSession, error) { - resolverAddr, err := ens.Resolver(node) - if err != nil { - return nil, err - } - resolver, err := fallback_contract.NewPublicResolver(resolverAddr, ens.contractBackend) - if err != nil { - return nil, err - } - return &fallback_contract.PublicResolverSession{ - Contract: resolver, - TransactOpts: ens.TransactOpts, - }, nil -} - -func (ens *ENS) getRegistrar(node [32]byte) (*contract.FIFSRegistrarSession, error) { - registrarAddr, err := ens.Owner(node) - if err != nil { - return nil, err - } - registrar, err := contract.NewFIFSRegistrar(registrarAddr, ens.contractBackend) - if err != nil { - return nil, err - } - return &contract.FIFSRegistrarSession{ - Contract: registrar, - TransactOpts: ens.TransactOpts, - }, nil -} - -// Resolve is a non-transactional call that returns the content hash associated with a name. -func (ens *ENS) Resolve(name string) (common.Hash, error) { - node := EnsNode(name) - - resolver, err := ens.getResolver(node) - if err != nil { - return common.Hash{}, err - } - - // IMPORTANT: The old contract is deprecated. This code should be removed latest on June 1st 2019 - supported, err := resolver.SupportsInterface(contentHash_Interface_Id) - if err != nil { - return common.Hash{}, err - } - - if !supported { - resolver, err := ens.getFallbackResolver(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 - } - - // END DEPRECATED CODE - - contentHash, err := resolver.Contenthash(node) - if err != nil { - return common.Hash{}, err - } - - return extractContentHash(contentHash) -} - -// Addr is a non-transactional call that returns the address associated with a name. -func (ens *ENS) Addr(name string) (common.Address, error) { - node := EnsNode(name) - - resolver, err := ens.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 (ens *ENS) SetAddr(name string, addr common.Address) (*types.Transaction, error) { - node := EnsNode(name) - - resolver, err := ens.getResolver(node) - if err != nil { - return nil, err - } - opts := ens.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 (ens *ENS) Register(name string) (*types.Transaction, error) { - parentNode, label := ensParentNode(name) - registrar, err := ens.getRegistrar(parentNode) - if err != nil { - return nil, err - } - return registrar.Contract.Register(&ens.TransactOpts, label, ens.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 `setContenthash` function. -func (ens *ENS) SetContentHash(name string, hash []byte) (*types.Transaction, error) { - node := EnsNode(name) - - resolver, err := ens.getResolver(node) - if err != nil { - return nil, err - } - - opts := ens.TransactOpts - opts.GasLimit = 200000 - - // IMPORTANT: The old contract is deprecated. This code should be removed latest on June 1st 2019 - supported, err := resolver.SupportsInterface(contentHash_Interface_Id) - if err != nil { - return nil, err - } - - if !supported { - resolver, err := ens.getFallbackResolver(node) - if err != nil { - return nil, err - } - opts := ens.TransactOpts - opts.GasLimit = 200000 - var b [32]byte - copy(b[:], hash) - return resolver.Contract.SetContent(&opts, node, b) - } - - // END DEPRECATED CODE - return resolver.Contract.SetContenthash(&opts, node, hash) -} diff --git a/vendor/github.com/ethereum/go-ethereum/contracts/ens/fallback_contract/PublicResolver.sol b/vendor/github.com/ethereum/go-ethereum/contracts/ens/fallback_contract/PublicResolver.sol deleted file mode 100644 index 9dcc9568..00000000 --- a/vendor/github.com/ethereum/go-ethereum/contracts/ens/fallback_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/vendor/github.com/ethereum/go-ethereum/contracts/ens/fallback_contract/publicresolver.go b/vendor/github.com/ethereum/go-ethereum/contracts/ens/fallback_contract/publicresolver.go deleted file mode 100644 index a2a4be1c..00000000 --- a/vendor/github.com/ethereum/go-ethereum/contracts/ens/fallback_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 fallback_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" -) - -// 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/vendor/github.com/ethereum/go-ethereum/core/blockchain.go b/vendor/github.com/ethereum/go-ethereum/core/blockchain.go index 50530fa4..15e771f4 100644 --- a/vendor/github.com/ethereum/go-ethereum/core/blockchain.go +++ b/vendor/github.com/ethereum/go-ethereum/core/blockchain.go @@ -35,7 +35,6 @@ import ( "github.com/ethereum/go-ethereum/core/state" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" - "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/event" "github.com/ethereum/go-ethereum/log" @@ -43,10 +42,14 @@ import ( "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/rlp" "github.com/ethereum/go-ethereum/trie" - lru "github.com/hashicorp/golang-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) @@ -65,7 +68,7 @@ var ( blockPrefetchExecuteTimer = metrics.NewRegisteredTimer("chain/prefetch/executes", nil) blockPrefetchInterruptMeter = metrics.NewRegisteredMeter("chain/prefetch/interrupts", nil) - ErrNoGenesis = errors.New("Genesis not found in chain") + errInsertionInterrupted = errors.New("insertion is interrupted") ) const ( @@ -75,16 +78,29 @@ const ( maxFutureBlocks = 256 maxTimeFutureBlocks = 30 badBlockLimit = 10 - triesInMemory = 128 + TriesInMemory = 128 // BlockChainVersion ensures that an incompatible database forces a resync from scratch. // - // During the process of upgrading the database version from 3 to 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 - BlockChainVersion uint64 = 4 + // 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 @@ -132,7 +148,6 @@ type BlockChain struct { chainmu sync.RWMutex // blockchain insertion 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!) @@ -155,8 +170,9 @@ type BlockChain struct { 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. stateDiffsProcessed map[common.Hash]int } @@ -210,9 +226,51 @@ func NewBlockChain(db ethdb.Database, cacheConfig *CacheConfig, chainConfig *par if bc.genesisBlock == nil { return nil, ErrNoGenesis } + // 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 { @@ -240,6 +298,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 { @@ -264,9 +336,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() @@ -279,12 +353,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() @@ -309,12 +385,59 @@ func (bc *BlockChain) SetHead(head uint64) error { 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 ethdb.Writer, 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() @@ -323,33 +446,6 @@ func (bc *BlockChain) SetHead(head uint64) error { bc.blockCache.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() } @@ -367,6 +463,7 @@ func (bc *BlockChain) FastSyncCommitHead(hash common.Hash) error { // If all checks out, manually set the head block bc.chainmu.Lock() bc.currentBlock.Store(block) + headBlockGauge.Update(int64(block.NumberU64())) bc.chainmu.Unlock() log.Info("Committed new head block", "number", block.Number(), "hash", hash) @@ -439,9 +536,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 } @@ -515,6 +615,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 { @@ -522,6 +623,7 @@ func (bc *BlockChain) insert(block *types.Block) { rawdb.WriteHeadFastBlockHash(bc.db, block.Hash()) bc.currentFastBlock.Store(block) + headFastBlockGauge.Update(int64(block.NumberU64())) } } @@ -651,7 +753,7 @@ 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 } @@ -716,7 +818,7 @@ func (bc *BlockChain) Stop() { 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) @@ -777,139 +879,281 @@ 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() - - // block location fields - receipts[j].BlockHash = block.Hash() - receipts[j].BlockNumber = block.Number() - receipts[j].TransactionIndex = uint(j) + // Clear out any stale content from the caches + bc.bodyCache.Purge() + bc.bodyRLPCache.Purge() + bc.receiptsCache.Purge() + bc.blockCache.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 } // 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) { 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 { + var isCanonical bool + bc.chainmu.Lock() + 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) + headFastBlockGauge.Update(int64(head.NumberU64())) + isCanonical = 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 isCanonical + } + // 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 types.Blocks + 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, b) + } + if time.Since(logged) > 8*time.Second { + log.Info("Migrating ancient blocks", "count", count, "elapsed", common.PrettyDuration(time.Since(start))) + logged = time.Now() + } + } + 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 _, block := range append(deleted, 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 _, block := range append(deleted, 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.chainmu.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.chainmu.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(int64(head.Time()), 0)), - "size", common.StorageSize(bytes), + "size", common.StorageSize(size), } if stats.ignored > 0 { context = append(context, []interface{}{"ignored", stats.ignored}...) @@ -921,10 +1165,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() @@ -936,6 +1180,26 @@ 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 +} + func (bc *BlockChain) AddToStateDiffProcessedCollection(hash common.Hash) { count := bc.stateDiffsProcessed[hash] bc.stateDiffsProcessed[hash] = count + 1 @@ -987,7 +1251,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() @@ -997,7 +1261,7 @@ func (bc *BlockChain) writeBlockWithState(block *types.Block, receipts []*types. triedb.Cap(limit - ethdb.IdealBatchSize) } // Find the next state trie we need to commit - chosen := current - triesInMemory + chosen := current - TriesInMemory // If we exceeded out time allowance, flush an entire trie to disk if bc.gcproc > bc.cacheConfig.TrieTimeLimit { @@ -1009,8 +1273,8 @@ func (bc *BlockChain) writeBlockWithState(block *types.Block, receipts []*types. } 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) + 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) @@ -1204,22 +1468,50 @@ func (bc *BlockChain) insertChain(chain types.Blocks, verifySeals bool) (int, [] // 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 - current := bc.CurrentBlock().NumberU64() - for block != nil && err == ErrKnownBlock && current >= block.NumberU64() { + 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, nil, nil, 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(block, 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 } @@ -1238,7 +1530,7 @@ func (bc *BlockChain) insertChain(chain types.Blocks, verifySeals bool) (int, [] return it.index, events, coalescedLogs, 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") @@ -1249,6 +1541,32 @@ func (bc *BlockChain) insertChain(chain types.Blocks, verifySeals bool) (int, [] bc.reportBlock(block, nil, ErrBlacklistedHash) return it.index, events, coalescedLogs, 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, nil, nil, 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. + events = append(events, ChainEvent{block, block.Hash(), nil}) + lastCanon = block + + continue + } // Retrieve the parent block and it's state to execute on top start := time.Now() @@ -1348,6 +1666,14 @@ func (bc *BlockChain) insertChain(chain types.Blocks, verifySeals bool) (int, [] "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()) } stats.processed++ stats.usedGas += usedGas @@ -1378,13 +1704,13 @@ func (bc *BlockChain) insertChain(chain types.Blocks, verifySeals bool) (int, [] return it.index, events, coalescedLogs, 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(block *types.Block, it *insertIterator) (int, []interface{}, []*types.Log, error) { +func (bc *BlockChain) insertSideChain(block *types.Block, it *insertIterator) (int, []interface{}, []*types.Log, error) { var ( externTd *big.Int current = bc.CurrentBlock() @@ -1425,7 +1751,7 @@ func (bc *BlockChain) insertSidechain(block *types.Block, it *insertIterator) (i if !bc.HasBlock(block.Hash(), block.NumberU64()) { start := time.Now() - if err := bc.WriteBlockWithoutState(block, externTd); err != nil { + if err := bc.writeBlockWithoutState(block, externTd); err != nil { return it.index, nil, nil, err } log.Debug("Injected sidechain block", "number", block.Number(), "hash", block.Hash(), @@ -1519,7 +1845,7 @@ func (bc *BlockChain) reorg(oldBlock, newBlock *types.Block) error { if number == nil { return } - receipts := rawdb.ReadReceipts(bc.db, hash, *number) + receipts := rawdb.ReadReceipts(bc.db, hash, *number, bc.chainConfig) for _, receipt := range receipts { for _, log := range receipt.Logs { l := *log @@ -1589,15 +1915,15 @@ func (bc *BlockChain) reorg(oldBlock, newBlock *types.Block) error { } 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 - for i := len(newChain) - 1; i >= 0; i-- { + // 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]) - // Collect reborn logs due to chain reorg (except head block (reverse order)) - if i != 0 { - collectLogs(newChain[i].Hash(), false) - } + // 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()...) @@ -1608,8 +1934,16 @@ func (bc *BlockChain) reorg(oldBlock, newBlock *types.Block) error { 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 diff --git a/vendor/github.com/ethereum/go-ethereum/core/chain_makers.go b/vendor/github.com/ethereum/go-ethereum/core/chain_makers.go index d563d85e..17f40421 100644 --- a/vendor/github.com/ethereum/go-ethereum/core/chain_makers.go +++ b/vendor/github.com/ethereum/go-ethereum/core/chain_makers.go @@ -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. // @@ -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) @@ -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)) diff --git a/vendor/github.com/ethereum/go-ethereum/core/error.go b/vendor/github.com/ethereum/go-ethereum/core/error.go index 410eca1e..cd4be3d7 100644 --- a/vendor/github.com/ethereum/go-ethereum/core/error.go +++ b/vendor/github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/core/genesis.go b/vendor/github.com/ethereum/go-ethereum/core/genesis.go index 1f34a3a9..830fb033 100644 --- a/vendor/github.com/ethereum/go-ethereum/core/genesis.go +++ b/vendor/github.com/ethereum/go-ethereum/core/genesis.go @@ -170,6 +170,22 @@ func SetupGenesisBlockWithOverride(db ethdb.Database, genesis *Genesis, constant return genesis.Config, block.Hash(), err } + // 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) + return genesis.Config, block.Hash(), err + } + // Check whether the genesis block is already written. if genesis != nil { hash := genesis.ToBlock(nil).Hash() @@ -277,6 +293,7 @@ func (g *Genesis) Commit(db ethdb.Database) (*types.Block, error) { 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 diff --git a/vendor/github.com/ethereum/go-ethereum/core/headerchain.go b/vendor/github.com/ethereum/go-ethereum/core/headerchain.go index d0c1987f..034858f6 100644 --- a/vendor/github.com/ethereum/go-ethereum/core/headerchain.go +++ b/vendor/github.com/ethereum/go-ethereum/core/headerchain.go @@ -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) @@ -274,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 @@ -451,35 +457,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(ethdb.Writer, 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() @@ -487,13 +518,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/vendor/github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go b/vendor/github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go index 64783999..fab7ca56 100644 --- a/vendor/github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go +++ b/vendor/github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go @@ -25,12 +25,23 @@ import ( "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" ) // ReadCanonicalHash retrieves the hash assigned to a canonical block number. func ReadCanonicalHash(db ethdb.Reader, number uint64) common.Hash { - data, _ := db.Get(headerHashKey(number)) + 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{} } @@ -38,21 +49,38 @@ func ReadCanonicalHash(db ethdb.Reader, number uint64) common.Hash { } // WriteCanonicalHash stores the hash assigned to a canonical block number. -func WriteCanonicalHash(db ethdb.Writer, 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 ethdb.Writer, 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 ethdb.Reader, hash common.Hash) *uint64 { +func ReadHeaderNumber(db ethdb.KeyValueReader, hash common.Hash) *uint64 { data, _ := db.Get(headerNumberKey(hash)) if len(data) != 8 { return nil @@ -61,8 +89,24 @@ func ReadHeaderNumber(db ethdb.Reader, 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 ethdb.Reader) common.Hash { +func ReadHeadHeaderHash(db ethdb.KeyValueReader) common.Hash { data, _ := db.Get(headHeaderKey) if len(data) == 0 { return common.Hash{} @@ -71,14 +115,14 @@ func ReadHeadHeaderHash(db ethdb.Reader) common.Hash { } // WriteHeadHeaderHash stores the hash of the current canonical head header. -func WriteHeadHeaderHash(db ethdb.Writer, 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 ethdb.Reader) common.Hash { +func ReadHeadBlockHash(db ethdb.KeyValueReader) common.Hash { data, _ := db.Get(headBlockKey) if len(data) == 0 { return common.Hash{} @@ -87,14 +131,14 @@ func ReadHeadBlockHash(db ethdb.Reader) common.Hash { } // WriteHeadBlockHash stores the head block's hash. -func WriteHeadBlockHash(db ethdb.Writer, 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 ethdb.Reader) common.Hash { +func ReadHeadFastBlockHash(db ethdb.KeyValueReader) common.Hash { data, _ := db.Get(headFastBlockKey) if len(data) == 0 { return common.Hash{} @@ -103,7 +147,7 @@ func ReadHeadFastBlockHash(db ethdb.Reader) common.Hash { } // WriteHeadFastBlockHash stores the hash of the current fast-sync head block. -func WriteHeadFastBlockHash(db ethdb.Writer, 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) } @@ -111,7 +155,7 @@ func WriteHeadFastBlockHash(db ethdb.Writer, hash common.Hash) { // ReadFastTrieProgress retrieves the number of tries nodes fast synced to allow // reporting correct numbers across restarts. -func ReadFastTrieProgress(db ethdb.Reader) uint64 { +func ReadFastTrieProgress(db ethdb.KeyValueReader) uint64 { data, _ := db.Get(fastTrieProgressKey) if len(data) == 0 { return 0 @@ -121,7 +165,7 @@ func ReadFastTrieProgress(db ethdb.Reader) uint64 { // WriteFastTrieProgress stores the fast sync trie process counter to support // retrieving it across restarts. -func WriteFastTrieProgress(db ethdb.Writer, 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) } @@ -129,12 +173,25 @@ func WriteFastTrieProgress(db ethdb.Writer, count uint64) { // ReadHeaderRLP retrieves a block header in its raw RLP database encoding. func ReadHeaderRLP(db ethdb.Reader, hash common.Hash, number uint64) rlp.RawValue { - data, _ := db.Get(headerKey(number, hash)) + data, _ := db.Ancient(freezerHeaderTable, number) + if len(data) == 0 { + data, _ = db.Get(headerKey(number, hash)) + // 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(freezerHeaderTable, number) + } + } return data } // HasHeader verifies the existence of a block header corresponding to the hash. 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 } @@ -157,30 +214,27 @@ func ReadHeader(db ethdb.Reader, hash common.Hash, number uint64) *types.Header // WriteHeader stores a block header into the database and also stores the hash- // to-number mapping. -func WriteHeader(db ethdb.Writer, 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 ethdb.Writer, hash common.Hash, number uint64) { +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) @@ -189,7 +243,7 @@ func DeleteHeader(db ethdb.Writer, hash common.Hash, number uint64) { // deleteHeaderWithoutNumber removes only the block header but does not remove // the hash to number mapping. -func deleteHeaderWithoutNumber(db ethdb.Writer, hash common.Hash, number uint64) { +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) } @@ -197,12 +251,22 @@ func deleteHeaderWithoutNumber(db ethdb.Writer, hash common.Hash, number uint64) // ReadBodyRLP retrieves the block body (transactions and uncles) in RLP encoding. func ReadBodyRLP(db ethdb.Reader, hash common.Hash, number uint64) rlp.RawValue { - data, _ := db.Get(blockBodyKey(number, hash)) + data, _ := db.Ancient(freezerBodiesTable, number) + if len(data) == 0 { + data, _ = db.Get(blockBodyKey(number, hash)) + // 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(freezerBodiesTable, number) + } + } return data } // WriteBodyRLP stores an RLP encoded block body into the database. -func WriteBodyRLP(db ethdb.Writer, 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) } @@ -210,6 +274,9 @@ func WriteBodyRLP(db ethdb.Writer, hash common.Hash, number uint64, rlp rlp.RawV // HasBody verifies the existence of a block body corresponding to the hash. 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 } @@ -230,8 +297,8 @@ func ReadBody(db ethdb.Reader, hash common.Hash, number uint64) *types.Body { return body } -// WriteBody storea a block body into the database. -func WriteBody(db ethdb.Writer, 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) @@ -240,7 +307,7 @@ func WriteBody(db ethdb.Writer, hash common.Hash, number uint64, body *types.Bod } // DeleteBody removes all block body data associated with a hash. -func DeleteBody(db ethdb.Writer, 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) } @@ -248,7 +315,17 @@ func DeleteBody(db ethdb.Writer, hash common.Hash, number uint64) { // 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 { - data, _ := db.Get(headerTDKey(number, hash)) + data, _ := db.Ancient(freezerDifficultyTable, number) + if len(data) == 0 { + data, _ = db.Get(headerTDKey(number, hash)) + // 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(freezerDifficultyTable, number) + } + } return data } @@ -267,7 +344,7 @@ func ReadTd(db ethdb.Reader, hash common.Hash, number uint64) *big.Int { } // WriteTd stores the total difficulty of a block into the database. -func WriteTd(db ethdb.Writer, 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) @@ -278,7 +355,7 @@ func WriteTd(db ethdb.Writer, hash common.Hash, number uint64, td *big.Int) { } // DeleteTd removes all block total difficulty data associated with a hash. -func DeleteTd(db ethdb.Writer, 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) } @@ -287,6 +364,9 @@ func DeleteTd(db ethdb.Writer, hash common.Hash, number uint64) { // HasReceipts verifies the existence of all the transaction receipts belonging // to a block. 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 } @@ -295,12 +375,24 @@ func HasReceipts(db ethdb.Reader, hash common.Hash, number uint64) bool { // 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 { - data, _ := db.Get(blockReceiptsKey(number, hash)) + data, _ := db.Ancient(freezerReceiptTable, number) + if len(data) == 0 { + data, _ = db.Get(blockReceiptsKey(number, hash)) + // 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(freezerReceiptTable, number) + } + } return data } -// ReadReceipts retrieves all the transaction receipts belonging to a block. -func ReadReceipts(db ethdb.Reader, hash common.Hash, number uint64) types.Receipts { +// 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 := ReadReceiptsRLP(db, hash, number) if len(data) == 0 { @@ -313,27 +405,39 @@ func ReadReceipts(db ethdb.Reader, hash common.Hash, number uint64) types.Receip return nil } receipts := make(types.Receipts, len(storageReceipts)) - logIndex := uint(0) - for i, receipt := range storageReceipts { - // Assemble deriving fields for log. - for _, log := range receipt.Logs { - log.TxHash = receipt.TxHash - log.BlockHash = hash - log.BlockNumber = number - log.TxIndex = uint(i) - log.Index = logIndex - logIndex += 1 - } - receipts[i] = (*types.Receipt)(receipt) - receipts[i].BlockHash = hash - receipts[i].BlockNumber = big.NewInt(0).SetUint64(number) - receipts[i].TransactionIndex = uint(i) + 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 ethdb.Writer, 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 { @@ -350,7 +454,7 @@ func WriteReceipts(db ethdb.Writer, hash common.Hash, number uint64, receipts ty } // DeleteReceipts removes all receipt data associated with a block hash. -func DeleteReceipts(db ethdb.Writer, 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) } @@ -375,22 +479,53 @@ func ReadBlock(db ethdb.Reader, hash common.Hash, number uint64) *types.Block { } // WriteBlock serializes a block into the database, header and body separately. -func WriteBlock(db ethdb.Writer, 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 ethdb.Writer, 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 +// DeleteBlockWithoutNumber removes all block data associated with a hash, except // the hash to number mapping. -func deleteBlockWithoutNumber(db ethdb.Writer, hash common.Hash, number uint64) { +func DeleteBlockWithoutNumber(db ethdb.KeyValueWriter, hash common.Hash, number uint64) { DeleteReceipts(db, hash, number) deleteHeaderWithoutNumber(db, hash, number) DeleteBody(db, hash, number) diff --git a/vendor/github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go b/vendor/github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go index 5c7ad693..38f8fe10 100644 --- a/vendor/github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go +++ b/vendor/github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go @@ -17,56 +17,66 @@ package rawdb import ( + "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 ethdb.Reader, hash common.Hash) common.Hash { +func ReadTxLookupEntry(db ethdb.Reader, hash common.Hash) *uint64 { data, _ := db.Get(txLookupKey(hash)) if len(data) == 0 { - return common.Hash{} + 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 } + // Database v4-v5 tx lookup format just stores the hash if len(data) == common.HashLength { - return common.BytesToHash(data) + return ReadHeaderNumber(db, common.BytesToHash(data)) } - // Probably it's legacy txlookup entry data, try to decode it. + // 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, "blob", data, "err", err) - return common.Hash{} + return nil } - return entry.BlockHash + return &entry.BlockIndex } // WriteTxLookupEntries stores a positional metadata for every transaction from // a block, enabling hash based transaction and receipt lookups. -func WriteTxLookupEntries(db ethdb.Writer, block *types.Block) { +func WriteTxLookupEntries(db ethdb.KeyValueWriter, block *types.Block) { + number := block.Number().Bytes() for _, tx := range block.Transactions() { - if err := db.Put(txLookupKey(tx.Hash()), block.Hash().Bytes()); err != nil { + 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 ethdb.Writer, 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 ethdb.Reader, hash common.Hash) (*types.Transaction, common.Hash, uint64, uint64) { - blockHash := ReadTxLookupEntry(db, hash) - if blockHash == (common.Hash{}) { + blockNumber := ReadTxLookupEntry(db, hash) + if blockNumber == nil { return nil, common.Hash{}, 0, 0 } - blockNumber := ReadHeaderNumber(db, blockHash) - if blockNumber == nil { + blockHash := ReadCanonicalHash(db, *blockNumber) + if blockHash == (common.Hash{}) { return nil, common.Hash{}, 0, 0 } body := ReadBody(db, blockHash, *blockNumber) @@ -85,16 +95,18 @@ func ReadTransaction(db ethdb.Reader, hash common.Hash) (*types.Transaction, com // ReadReceipt retrieves a specific transaction receipt from the database, along with // its added positional metadata. -func ReadReceipt(db ethdb.Reader, hash common.Hash) (*types.Receipt, common.Hash, uint64, uint64) { - blockHash := 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 } - blockNumber := ReadHeaderNumber(db, blockHash) - if blockNumber == nil { + blockHash := ReadCanonicalHash(db, *blockNumber) + if blockHash == (common.Hash{}) { return nil, common.Hash{}, 0, 0 } - receipts := ReadReceipts(db, blockHash, *blockNumber) + // 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) @@ -106,13 +118,13 @@ func ReadReceipt(db ethdb.Reader, hash common.Hash) (*types.Receipt, common.Hash // ReadBloomBits retrieves the compressed bloom bit vector belonging to the given // section and bit index from the. -func ReadBloomBits(db ethdb.Reader, 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 ethdb.Writer, 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/vendor/github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go b/vendor/github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go index 1361b0d7..f8d09fbd 100644 --- a/vendor/github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go +++ b/vendor/github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go @@ -27,7 +27,7 @@ import ( ) // ReadDatabaseVersion retrieves the version number of the database. -func ReadDatabaseVersion(db ethdb.Reader) *uint64 { +func ReadDatabaseVersion(db ethdb.KeyValueReader) *uint64 { var version uint64 enc, _ := db.Get(databaseVerisionKey) @@ -42,7 +42,7 @@ func ReadDatabaseVersion(db ethdb.Reader) *uint64 { } // WriteDatabaseVersion stores the version number of the database -func WriteDatabaseVersion(db ethdb.Writer, 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) @@ -53,7 +53,7 @@ func WriteDatabaseVersion(db ethdb.Writer, version uint64) { } // ReadChainConfig retrieves the consensus settings based on the given genesis hash. -func ReadChainConfig(db ethdb.Reader, 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 @@ -67,7 +67,7 @@ func ReadChainConfig(db ethdb.Reader, hash common.Hash) *params.ChainConfig { } // WriteChainConfig writes the chain config settings to the database. -func WriteChainConfig(db ethdb.Writer, hash common.Hash, cfg *params.ChainConfig) { +func WriteChainConfig(db ethdb.KeyValueWriter, hash common.Hash, cfg *params.ChainConfig) { if cfg == nil { return } @@ -81,13 +81,13 @@ func WriteChainConfig(db ethdb.Writer, hash common.Hash, cfg *params.ChainConfig } // ReadPreimage retrieves a single preimage of the provided hash. -func ReadPreimage(db ethdb.Reader, 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 ethdb.Writer, 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/vendor/github.com/ethereum/go-ethereum/core/rawdb/database.go b/vendor/github.com/ethereum/go-ethereum/core/rawdb/database.go index b4c5dea7..353b7dce 100644 --- a/vendor/github.com/ethereum/go-ethereum/core/rawdb/database.go +++ b/vendor/github.com/ethereum/go-ethereum/core/rawdb/database.go @@ -17,15 +17,168 @@ 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 db + 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. + } else { + // Key-value store continues where the freezer left off, all is fine. We might + // have duplicate blocks (crash after freezer write but before kay-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 + } else { + // 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 @@ -34,9 +187,9 @@ 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. +// 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)) } @@ -50,3 +203,153 @@ func NewLevelDBDatabase(file string, cache int, handles int, namespace string) ( } 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/vendor/github.com/ethereum/go-ethereum/core/rawdb/freezer.go b/vendor/github.com/ethereum/go-ethereum/core/rawdb/freezer.go new file mode 100644 index 00000000..3f377447 --- /dev/null +++ b/vendor/github.com/ethereum/go-ethereum/core/rawdb/freezer.go @@ -0,0 +1,393 @@ +// 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 ( + "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) + sizeCounter = metrics.NewRegisteredCounter(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, sizeCounter, 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/vendor/github.com/ethereum/go-ethereum/core/rawdb/freezer_reinit.go b/vendor/github.com/ethereum/go-ethereum/core/rawdb/freezer_reinit.go new file mode 100644 index 00000000..ea4dd33d --- /dev/null +++ b/vendor/github.com/ethereum/go-ethereum/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 (no need for the hash, we pull by + // number from the freezer). If successful, pre-cache the block hash and + // the individual transaction hashes for storing into the database. + block := ReadBlock(db, common.Hash{}, 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/vendor/github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go b/vendor/github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go new file mode 100644 index 00000000..2fe354a0 --- /dev/null +++ b/vendor/github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go @@ -0,0 +1,635 @@ +// 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 + sizeCounter metrics.Counter // Counter 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, sizeCounter metrics.Counter, disableSnappy bool) (*freezerTable, error) { + return newCustomTable(path, name, readMeter, writeMeter, sizeCounter, 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, sizeCounter metrics.Counter, 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, + sizeCounter: sizeCounter, + 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.sizeCounter.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) + t.head, err = t.openFile(newLastIndex.filenum, openFreezerFileForAppend) + 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.sizeCounter.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.sizeCounter.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/vendor/github.com/ethereum/go-ethereum/core/rawdb/schema.go b/vendor/github.com/ethereum/go-ethereum/core/rawdb/schema.go index 87dbf94f..a44a2c99 100644 --- a/vendor/github.com/ethereum/go-ethereum/core/rawdb/schema.go +++ b/vendor/github.com/ethereum/go-ethereum/core/rawdb/schema.go @@ -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,6 +63,33 @@ var ( preimageHitCounter = metrics.NewRegisteredCounter("db/preimage/hits", nil) ) +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 { diff --git a/vendor/github.com/ethereum/go-ethereum/core/rawdb/table.go b/vendor/github.com/ethereum/go-ethereum/core/rawdb/table.go index e19649dd..6610b7f5 100644 --- a/vendor/github.com/ethereum/go-ethereum/core/rawdb/table.go +++ b/vendor/github.com/ethereum/go-ethereum/core/rawdb/table.go @@ -50,6 +50,48 @@ 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 { @@ -67,6 +109,13 @@ 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 { @@ -150,6 +199,6 @@ func (b *tableBatch) Reset() { } // Replay replays the batch contents. -func (b *tableBatch) Replay(w ethdb.Writer) error { +func (b *tableBatch) Replay(w ethdb.KeyValueWriter) error { return b.batch.Replay(w) } diff --git a/vendor/github.com/ethereum/go-ethereum/core/state/database.go b/vendor/github.com/ethereum/go-ethereum/core/state/database.go index 8798b738..ecc2c134 100644 --- a/vendor/github.com/ethereum/go-ethereum/core/state/database.go +++ b/vendor/github.com/ethereum/go-ethereum/core/state/database.go @@ -93,7 +93,7 @@ type Trie interface { // 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.Writer) error + Prove(key []byte, fromLevel uint, proofDb ethdb.KeyValueWriter) error } // NewDatabase creates a backing store for state. The returned database is safe for diff --git a/vendor/github.com/ethereum/go-ethereum/core/state/state_object.go b/vendor/github.com/ethereum/go-ethereum/core/state/state_object.go index 7fbb45b3..852c340b 100644 --- a/vendor/github.com/ethereum/go-ethereum/core/state/state_object.go +++ b/vendor/github.com/ethereum/go-ethereum/core/state/state_object.go @@ -33,23 +33,23 @@ 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 } @@ -123,210 +123,210 @@ func newObject(db *StateDB, address common.Address, data Account) *stateObject { } // 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 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 { +func (s *stateObject) GetCommittedState(db Database, key common.Hash) common.Hash { // If we have the original value cached, return that - value, cached := self.originStorage[key] + value, cached := s.originStorage[key] if cached { return value } // Track the amount of time wasted on reading the storge trie if metrics.EnabledExpensive { - defer func(start time.Time) { self.db.StorageReads += time.Since(start) }(time.Now()) + 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{} } 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 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 +func (s *stateObject) setState(key, value common.Hash) { + s.dirtyStorage[key] = value } // updateTrie writes cached storage modifications into the object's storage trie. -func (self *stateObject) updateTrie(db Database) Trie { +func (s *stateObject) updateTrie(db Database) Trie { // Track the amount of time wasted on updating the storge trie if metrics.EnabledExpensive { - defer func(start time.Time) { self.db.StorageUpdates += time.Since(start) }(time.Now()) + defer func(start time.Time) { s.db.StorageUpdates += time.Since(start) }(time.Now()) } // Update all the dirty slots in the trie - tr := self.getTrie(db) - for key, value := range self.dirtyStorage { - delete(self.dirtyStorage, key) + tr := s.getTrie(db) + for key, value := range s.dirtyStorage { + delete(s.dirtyStorage, key) // 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)) + s.setError(tr.TryUpdate(key[:], v)) } return tr } // UpdateRoot sets the trie root to the current root hash of -func (self *stateObject) updateRoot(db Database) { - self.updateTrie(db) +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) { self.db.StorageHashes += time.Since(start) }(time.Now()) + defer func(start time.Time) { s.db.StorageHashes += time.Since(start) }(time.Now()) } - self.data.Root = self.trie.Hash() + 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 } // Track the amount of time wasted on committing the storge trie if metrics.EnabledExpensive { - defer func(start time.Time) { self.db.StorageCommits += time.Since(start) }(time.Now()) + defer func(start time.Time) { s.db.StorageCommits += time.Since(start) }(time.Now()) } - root, err := self.trie.Commit(nil) + 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 (s *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) +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 = self.code - stateObject.dirtyStorage = self.dirtyStorage.Copy() - stateObject.originStorage = self.originStorage.Copy() - stateObject.suicided = self.suicided - stateObject.dirtyCode = self.dirtyCode - stateObject.deleted = self.deleted + stateObject.code = s.code + stateObject.dirtyStorage = s.dirtyStorage.Copy() + stateObject.originStorage = s.originStorage.Copy() + stateObject.suicided = s.suicided + stateObject.dirtyCode = s.dirtyCode + stateObject.deleted = s.deleted return stateObject } @@ -335,69 +335,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/vendor/github.com/ethereum/go-ethereum/core/state/sync.go b/vendor/github.com/ethereum/go-ethereum/core/state/sync.go index 5290411a..ef793052 100644 --- a/vendor/github.com/ethereum/go-ethereum/core/state/sync.go +++ b/vendor/github.com/ethereum/go-ethereum/core/state/sync.go @@ -26,7 +26,7 @@ import ( ) // NewStateSync create a new state trie download scheduler. -func NewStateSync(root common.Hash, database ethdb.Reader) *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 @@ -37,6 +37,6 @@ func NewStateSync(root common.Hash, database ethdb.Reader) *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/vendor/github.com/ethereum/go-ethereum/core/state_processor.go b/vendor/github.com/ethereum/go-ethereum/core/state_processor.go index 6f2a4512..bed6a073 100644 --- a/vendor/github.com/ethereum/go-ethereum/core/state_processor.go +++ b/vendor/github.com/ethereum/go-ethereum/core/state_processor.go @@ -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 } diff --git a/vendor/github.com/ethereum/go-ethereum/core/tx_list.go b/vendor/github.com/ethereum/go-ethereum/core/tx_list.go index 57abc514..75bfdaed 100644 --- a/vendor/github.com/ethereum/go-ethereum/core/tx_list.go +++ b/vendor/github.com/ethereum/go-ethereum/core/tx_list.go @@ -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/vendor/github.com/ethereum/go-ethereum/core/tx_pool.go b/vendor/github.com/ethereum/go-ethereum/core/tx_pool.go index 411143ae..b1682533 100644 --- a/vendor/github.com/ethereum/go-ethereum/core/tx_pool.go +++ b/vendor/github.com/ethereum/go-ethereum/core/tx_pool.go @@ -85,20 +85,25 @@ 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) + validMeter = metrics.NewRegisteredMeter("txpool/valid", nil) + invalidTxMeter = metrics.NewRegisteredMeter("txpool/invalid", nil) + underpricedTxMeter = metrics.NewRegisteredMeter("txpool/underpriced", nil) + + pendingCounter = metrics.NewRegisteredCounter("txpool/pending", nil) + queuedCounter = metrics.NewRegisteredCounter("txpool/queued", nil) + localCounter = metrics.NewRegisteredCounter("txpool/local", nil) ) // TxStatus is the current status of a transaction as seen by the pool. @@ -661,7 +666,7 @@ func (pool *TxPool) add(tx *types.Transaction, local bool) (bool, error) { // 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 @@ -669,14 +674,14 @@ 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) } } @@ -686,14 +691,14 @@ func (pool *TxPool) add(tx *types.Transaction, local bool) (bool, error) { // 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) @@ -718,6 +723,9 @@ func (pool *TxPool) add(tx *types.Transaction, local bool) (bool, error) { pool.locals.add(from) } } + if local || pool.locals.contains(from) { + localCounter.Inc(1) + } pool.journalTx(from, tx) log.Trace("Pooled new future transaction", "hash", hash, "from", from, "to", tx.To()) @@ -736,14 +744,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 + queuedCounter.Inc(1) } if pool.all.Get(hash) == nil { pool.all.Add(tx) @@ -779,17 +790,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 + pendingCounter.Inc(1) } // Failsafe to work around direct pending inserts (tests) if pool.all.Get(hash) == nil { @@ -844,6 +858,8 @@ func (pool *TxPool) addTx(tx *types.Transaction, local bool) error { if err != nil { return err } + validMeter.Mark(1) + // If we added a new transaction, run promotion checks and return if !replace { from, _ := types.Sender(pool.signer, tx) // already validated @@ -878,6 +894,8 @@ func (pool *TxPool) addTxsLocked(txs []*types.Transaction, local bool) []error { dirty[from] = struct{}{} } } + validMeter.Mark(int64(len(dirty))) + // Only reprocess the internal state if something was actually added if len(dirty) > 0 { addrs := make([]common.Address, 0, len(dirty)) @@ -928,7 +946,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) { + localCounter.Dec(1) } // Remove the transaction from the pending lists and reset the account nonce if pending := pool.pending[addr]; pending != nil { @@ -946,12 +967,17 @@ func (pool *TxPool) removeTx(hash common.Hash, outofbound bool) { if nonce := tx.Nonce(); pool.pendingState.GetNonce(addr) > nonce { pool.pendingState.SetNonce(addr, nonce) } + // Reduce the pending counter + pendingCounter.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 + queuedCounter.Dec(1) + } if future.Empty() { delete(pool.queue, addr) } @@ -979,38 +1005,48 @@ 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.pendingState.GetNonce(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) } } + queuedCounter.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)) + queuedCounter.Dec(int64(len(forwards) + len(drops) + len(caps))) + if pool.locals.contains(addr) { + localCounter.Dec(int64(len(forwards) + len(drops) + len(caps))) } // Delete the entire queue entry if it became empty. if list.Empty() { @@ -1052,11 +1088,12 @@ func (pool *TxPool) promoteExecutables(accounts []common.Address) { 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) { + + 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(offenders[i]) > nonce { @@ -1064,6 +1101,11 @@ func (pool *TxPool) promoteExecutables(accounts []common.Address) { } log.Trace("Removed fairness-exceeding pending transaction", "hash", hash) } + pool.priced.Removed(len(caps)) + pendingCounter.Dec(int64(len(caps))) + if pool.locals.contains(offenders[i]) { + localCounter.Dec(int64(len(caps))) + } pending-- } } @@ -1074,11 +1116,12 @@ func (pool *TxPool) promoteExecutables(accounts []common.Address) { 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) { + + 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 { @@ -1086,11 +1129,16 @@ func (pool *TxPool) promoteExecutables(accounts []common.Address) { } log.Trace("Removed fairness-exceeding pending transaction", "hash", hash) } + pool.priced.Removed(len(caps)) + pendingCounter.Dec(int64(len(caps))) + if pool.locals.contains(addr) { + localCounter.Dec(int64(len(caps))) + } pending-- } } } - pendingRateLimitCounter.Inc(int64(pendingBeforeCap - pending)) + pendingRateLimitMeter.Mark(int64(pendingBeforeCap - pending)) } // If we've queued more transactions than the hard limit, drop oldest ones queued := uint64(0) @@ -1120,7 +1168,7 @@ func (pool *TxPool) promoteExecutables(accounts []common.Address) { pool.removeTx(tx.Hash(), true) } drop -= size - queuedRateLimitCounter.Inc(int64(size)) + queuedRateLimitMeter.Mark(int64(size)) continue } // Otherwise drop only last few transactions @@ -1128,7 +1176,7 @@ func (pool *TxPool) promoteExecutables(accounts []common.Address) { for i := len(txs) - 1; i >= 0 && drop > 0; i-- { pool.removeTx(txs[i].Hash(), true) drop-- - queuedRateLimitCounter.Inc(1) + queuedRateLimitMeter.Mark(1) } } } @@ -1143,11 +1191,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) @@ -1155,21 +1203,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) } + pendingCounter.Dec(int64(len(olds) + len(drops) + len(invalids))) + if pool.locals.contains(addr) { + localCounter.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) } + pendingCounter.Inc(int64(len(gapped))) } // Delete the entire queue entry if it became empty. if list.Empty() { diff --git a/vendor/github.com/ethereum/go-ethereum/core/types/log.go b/vendor/github.com/ethereum/go-ethereum/core/types/log.go index 864af5ef..006f62bb 100644 --- a/vendor/github.com/ethereum/go-ethereum/core/types/log.go +++ b/vendor/github.com/ethereum/go-ethereum/core/types/log.go @@ -71,8 +71,8 @@ type rlpLog 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 { +// legacyRlpStorageLog is the previous storage encoding of a log including some redundant fields. +type legacyRlpStorageLog struct { Address common.Address Topics []common.Hash Data []byte @@ -129,7 +129,7 @@ func (l *LogForStorage) DecodeRLP(s *rlp.Stream) error { } } else { // Try to decode log with previous definition. - var dec LegacyRlpStorageLog + var dec legacyRlpStorageLog err = rlp.DecodeBytes(blob, &dec) if err == nil { *l = LogForStorage{ diff --git a/vendor/github.com/ethereum/go-ethereum/core/types/receipt.go b/vendor/github.com/ethereum/go-ethereum/core/types/receipt.go index 72d85a1e..a96c7525 100644 --- a/vendor/github.com/ethereum/go-ethereum/core/types/receipt.go +++ b/vendor/github.com/ethereum/go-ethereum/core/types/receipt.go @@ -18,6 +18,7 @@ package types import ( "bytes" + "errors" "fmt" "io" "math/big" @@ -25,6 +26,8 @@ import ( "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" ) @@ -82,8 +85,15 @@ type receiptRLP struct { Logs []*Log } -// receiptStorageRLP is the storage encoding of a receipt. -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 @@ -92,8 +102,8 @@ type receiptStorageRLP struct { GasUsed uint64 } -// LegacyReceiptStorageRLP is the previous storage encoding of a receipt including some unnecessary fields. -type LegacyReceiptStorageRLP struct { +// v3StoredReceiptRLP is the original storage encoding of a receipt including some unnecessary fields. +type v3StoredReceiptRLP struct { PostStateOrStatus []byte CumulativeGasUsed uint64 Bloom Bloom @@ -177,13 +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, - 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) @@ -194,36 +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 { + // Retrieve the entire receipt blob as we need to try multiple decoders blob, err := s.Raw() if err != nil { return err } - var dec receiptStorageRLP - if err := rlp.DecodeBytes(blob, &dec); err != nil { - var sdec LegacyReceiptStorageRLP - if err := rlp.DecodeBytes(blob, &sdec); err != nil { - return err - } - dec.PostStateOrStatus = common.CopyBytes(sdec.PostStateOrStatus) - dec.CumulativeGasUsed = sdec.CumulativeGasUsed - dec.TxHash = sdec.TxHash - dec.ContractAddress = sdec.ContractAddress - dec.Logs = sdec.Logs - dec.GasUsed = sdec.GasUsed - } - 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 + } + if err := (*Receipt)(r).setStatus(stored.PostStateOrStatus); err != nil { return err } - // Assign the consensus fields - r.CumulativeGasUsed = dec.CumulativeGasUsed - r.Logs = make([]*Log, len(dec.Logs)) - for i, log := range dec.Logs { + 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)}) - // Assign the implementation fields - r.TxHash, r.ContractAddress, r.GasUsed = dec.TxHash, dec.ContractAddress, dec.GasUsed + + 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) + } return nil } @@ -241,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/vendor/github.com/ethereum/go-ethereum/core/types/transaction.go b/vendor/github.com/ethereum/go-ethereum/core/types/transaction.go index ba3d5de9..3eb8df0a 100644 --- a/vendor/github.com/ethereum/go-ethereum/core/types/transaction.go +++ b/vendor/github.com/ethereum/go-ethereum/core/types/transaction.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/vendor/github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go b/vendor/github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go index c6ea2d07..38822a76 100644 --- a/vendor/github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go +++ b/vendor/github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/constants.go b/vendor/github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/constants.go index 5122aae6..f7d2c7c0 100644 --- a/vendor/github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/constants.go +++ b/vendor/github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp6.go b/vendor/github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp6.go index 83d61b78..a4273491 100644 --- a/vendor/github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp6.go +++ b/vendor/github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/dashboard/assets.go b/vendor/github.com/ethereum/go-ethereum/dashboard/assets.go index 1ce18b28..eb7a8271 100644 --- a/vendor/github.com/ethereum/go-ethereum/dashboard/assets.go +++ b/vendor/github.com/ethereum/go-ethereum/dashboard/assets.go @@ -2523,13 +2523,13 @@ var _bundleJs = []byte((((`!function(e) { } catch (e) { return !1; } - }(), [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]), O = x.concat([ 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 ]), w = ([ "xs", "sm", "lg", "fw", "ul", "li", "border", "pull-left", "pull-right", "spin", "pulse", "rotate-90", "rotate-180", "rotate-270", "flip-horizontal", "flip-vertical", "stack", "stack-1x", "stack-2x", "inverse", "layers", "layers-text", "layers-counter" ].concat(x.map(function(e) { + }(), [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]), O = x.concat([ 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 ]), w = ([ "xs", "sm", "lg", "fw", "ul", "li", "border", "pull-left", "pull-right", "spin", "pulse", "rotate-90", "rotate-180", "rotate-270", "flip-horizontal", "flip-vertical", "flip-both", "stack", "stack-1x", "stack-2x", "inverse", "layers", "layers-text", "layers-counter" ].concat(x.map(function(e) { return "".concat(e, "x"); })).concat(O.map(function(e) { return "w-".concat(e); })), _.FontAwesomeConfig || {}); if (m && "function" == typeof m.querySelector) { - [ [ "data-family-prefix", "familyPrefix" ], [ "data-replacement-class", "replacementClass" ], [ "data-auto-replace-svg", "autoReplaceSvg" ], [ "data-auto-add-css", "autoAddCss" ], [ "data-auto-a11y", "autoA11y" ], [ "data-search-pseudo-elements", "searchPseudoElements" ], [ "data-observe-mutations", "observeMutations" ], [ "data-keep-original-source", "keepOriginalSource" ], [ "data-measure-performance", "measurePerformance" ], [ "data-show-missing-icons", "showMissingIcons" ] ].forEach(function(e) { + [ [ "data-family-prefix", "familyPrefix" ], [ "data-replacement-class", "replacementClass" ], [ "data-auto-replace-svg", "autoReplaceSvg" ], [ "data-auto-add-css", "autoAddCss" ], [ "data-auto-a11y", "autoA11y" ], [ "data-search-pseudo-elements", "searchPseudoElements" ], [ "data-observe-mutations", "observeMutations" ], [ "data-mutate-approach", "mutateApproach" ], [ "data-keep-original-source", "keepOriginalSource" ], [ "data-measure-performance", "measurePerformance" ], [ "data-show-missing-icons", "showMissingIcons" ] ].forEach(function(e) { var t = l(e, 2), n = t[0], r = t[1], o = function(e) { return "" === e || "false" !== e && ("true" === e || e); }(function(e) { @@ -2547,6 +2547,7 @@ var _bundleJs = []byte((((`!function(e) { autoA11y: !0, searchPseudoElements: !1, observeMutations: !0, + mutateApproach: "async", keepOriginalSource: !0, measurePerformance: !1, showMissingIcons: !0 @@ -2563,7 +2564,7 @@ var _bundleJs = []byte((((`!function(e) { return e(); }); })); - var C, S = "pending", A = "settled", D = "fulfilled", I = "rejected", R = function() {}, L = void 0 !== e && void 0 !== e.process && "function" == typeof e.process.emit, N = void 0 === r ? setTimeout : r, B = []; + var C, S = "pending", D = "settled", A = "fulfilled", I = "rejected", R = function() {}, L = void 0 !== e && void 0 !== e.process && "function" == typeof e.process.emit, N = void 0 === r ? setTimeout : r, B = []; function U() { for (var e = 0; e < B.length; e++) B[e][0](B[e][1]); B = [], C = !1; @@ -2574,14 +2575,14 @@ var _bundleJs = []byte((((`!function(e) { function z(e) { var t = e.owner, n = t._state, r = t._data, o = e[n], a = e.then; if ("function" == typeof o) { - n = D; + n = A; try { r = o(r); } catch (e) { q(a, e); } } - K(a, r) || (n === D && F(a, r), n === I && q(a, r)); + K(a, r) || (n === A && F(a, r), n === I && q(a, r)); } function K(e, t) { var n; @@ -2604,26 +2605,26 @@ var _bundleJs = []byte((((`!function(e) { e !== t && K(e, t) || H(e, t); } function H(e, t) { - e._state === S && (e._state = A, e._data = t, W(V, e)); + e._state === S && (e._state = D, e._data = t, W(V, e)); } function q(e, t) { - e._state === S && (e._state = A, e._data = t, W($, e)); + e._state === S && (e._state = D, e._data = t, W(X, e)); } function G(e) { e._then = e._then.forEach(z); } function V(e) { - e._state = D, G(e); + e._state = A, G(e); } - function $(t) { + function X(t) { t._state = I, G(t), !t._handled && L && e.process.emit("unhandledRejection", t._data, t); } - function Y(t) { + function $(t) { e.process.emit("rejectionHandled", t); } - function X(e) { + function Y(e) { if ("function" != typeof e) throw new TypeError("Promise resolver " + e + " is not a function"); - if (this instanceof X == !1) throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function."); + if (this instanceof Y == !1) throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function."); this._then = [], function(e, t) { function n(e) { q(t, e); @@ -2637,8 +2638,8 @@ var _bundleJs = []byte((((`!function(e) { } }(e, this); } - X.prototype = { - constructor: X, + Y.prototype = { + constructor: Y, _state: S, _then: null, _data: void 0, @@ -2650,15 +2651,15 @@ var _bundleJs = []byte((((`!function(e) { fulfilled: e, rejected: t }; - return !t && !e || this._handled || (this._handled = !0, this._state === I && L && W(Y, this)), - this._state === D || this._state === I ? W(z, n) : this._then.push(n), n.then; + return !t && !e || this._handled || (this._handled = !0, this._state === I && L && W($, this)), + this._state === A || this._state === I ? W(z, n) : this._then.push(n), n.then; }, catch: function(e) { return this.then(null, e); } - }, X.all = function(e) { + }, Y.all = function(e) { if (!Array.isArray(e)) throw new TypeError("You must pass an array to Promise.all()."); - return new X(function(t, n) { + return new Y(function(t, n) { var r = [], o = 0; function a(e) { return o++, function(n) { @@ -2668,17 +2669,17 @@ var _bundleJs = []byte((((`!function(e) { for (var i, s = 0; s < e.length; s++) (i = e[s]) && "function" == typeof i.then ? i.then(a(s), n) : r[s] = i; o || t(r); }); - }, X.race = function(e) { + }, Y.race = function(e) { if (!Array.isArray(e)) throw new TypeError("You must pass an array to Promise.race()."); - return new X(function(t, n) { + return new Y(function(t, n) { for (var r, o = 0; o < e.length; o++) (r = e[o]) && "function" == typeof r.then ? r.then(t, n) : t(r); }); - }, X.resolve = function(e) { - return e && "object" === o(e) && e.constructor === X ? e : new X(function(t) { + }, Y.resolve = function(e) { + return e && "object" === o(e) && e.constructor === Y ? e : new Y(function(t) { t(e); }); - }, X.reject = function(e) { - return new X(function(t, n) { + }, Y.reject = function(e) { + return new Y(function(t, n) { n(e); }); }; @@ -2747,7 +2748,7 @@ var _bundleJs = []byte((((`!function(e) { "data-prefix": o, "data-icon": a, class: y, - role: "img", + role: c.attributes.role || "img", xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 ".concat(h, " ").concat(_) }) @@ -3201,7 +3202,7 @@ var _bundleJs = []byte((((`!function(e) { }, l = { prefix: "fas", iconName: "list", - icon: [ 512, 512, [], "f03a", "M128 116V76c0-8.837 7.163-16 16-16h352c8.837 0 16 7.163 16 16v40c0 8.837-7.163 16-16 16H144c-8.837 0-16-7.163-16-16zm16 176h352c8.837 0 16-7.163 16-16v-40c0-8.837-7.163-16-16-16H144c-8.837 0-16 7.163-16 16v40c0 8.837 7.163 16 16 16zm0 160h352c8.837 0 16-7.163 16-16v-40c0-8.837-7.163-16-16-16H144c-8.837 0-16 7.163-16 16v40c0 8.837 7.163 16 16 16zM16 144h64c8.837 0 16-7.163 16-16V64c0-8.837-7.163-16-16-16H16C7.163 48 0 55.163 0 64v64c0 8.837 7.163 16 16 16zm0 160h64c8.837 0 16-7.163 16-16v-64c0-8.837-7.163-16-16-16H16c-8.837 0-16 7.163-16 16v64c0 8.837 7.163 16 16 16zm0 160h64c8.837 0 16-7.163 16-16v-64c0-8.837-7.163-16-16-16H16c-8.837 0-16 7.163-16 16v64c0 8.837 7.163 16 16 16z" ] + icon: [ 512, 512, [], "f03a", "M80 368H16a16 16 0 0 0-16 16v64a16 16 0 0 0 16 16h64a16 16 0 0 0 16-16v-64a16 16 0 0 0-16-16zm0-320H16A16 16 0 0 0 0 64v64a16 16 0 0 0 16 16h64a16 16 0 0 0 16-16V64a16 16 0 0 0-16-16zm0 160H16a16 16 0 0 0-16 16v64a16 16 0 0 0 16 16h64a16 16 0 0 0 16-16v-64a16 16 0 0 0-16-16zm416 176H176a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h320a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm0-320H176a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h320a16 16 0 0 0 16-16V80a16 16 0 0 0-16-16zm0 160H176a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h320a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16z" ] }, u = { prefix: "fas", iconName: "tachometer-alt", @@ -3212,7 +3213,7 @@ var _bundleJs = []byte((((`!function(e) { "use strict"; (function(e) { n.d(t, "a", function() { - return v; + return b; }); var r = n("./node_modules/@fortawesome/fontawesome-svg-core/index.es.js"), o = n("./node_modules/prop-types/index.js"), a = n.n(o), i = n("./node_modules/react/index.js"), s = n.n(i); function l(e) { @@ -3268,74 +3269,78 @@ var _bundleJs = []byte((((`!function(e) { }(); } var p = "undefined" != typeof window ? window : void 0 !== e ? e : "undefined" != typeof self ? self : {}; - var h, _ = (function(e) { - var t, n, r, o, a, i, s, l, u, c, d, f, h, _, m; - t = p, n = function(e, t, r) { - if (!l(t) || c(t) || d(t) || f(t) || s(t)) return t; - var o, a = 0, i = 0; - if (u(t)) for (o = [], i = t.length; a < i; a++) o.push(n(e, t[a], r)); else for (var p in o = {}, - t) Object.prototype.hasOwnProperty.call(t, p) && (o[e(p, r)] = n(e, t[p], r)); - return o; - }, r = function(e) { - return h(e) ? e : (e = e.replace(/[\-_\s]+(.)?/g, function(e, t) { - return t ? t.toUpperCase() : ""; - })).substr(0, 1).toLowerCase() + e.substr(1); - }, o = function(e) { - var t = r(e); - return t.substr(0, 1).toUpperCase() + t.substr(1); - }, a = function(e, t) { - return function(e, t) { - var n = (t = t || {}).separator || "_", r = t.split || /(?=[A-Z])/; - return e.split(r).join(n); - }(e, t).toLowerCase(); - }, i = Object.prototype.toString, s = function(e) { - return "function" == typeof e; - }, l = function(e) { - return e === Object(e); - }, u = function(e) { - return "[object Array]" == i.call(e); - }, c = function(e) { - return "[object Date]" == i.call(e); - }, d = function(e) { - return "[object RegExp]" == i.call(e); - }, f = function(e) { - return "[object Boolean]" == i.call(e); - }, h = function(e) { - return (e -= 0) == e; - }, _ = function(e, t) { - var n = t && "process" in t ? t.process : t; - return "function" != typeof n ? e : function(t, r) { - return n(t, e, r); + var h = function(e, t) { + return e(t = { + exports: {} + }, t.exports), t.exports; + }(function(e) { + !function(t) { + var n = function(e, t, r) { + if (!l(t) || c(t) || d(t) || f(t) || s(t)) return t; + var o, a = 0, i = 0; + if (u(t)) for (o = [], i = t.length; a < i; a++) o.push(n(e, t[a], r)); else for (var p in o = {}, + t) Object.prototype.hasOwnProperty.call(t, p) && (o[e(p, r)] = n(e, t[p], r)); + return o; + }, r = function(e) { + return p(e) ? e : (e = e.replace(/[\-_\s]+(.)?/g, function(e, t) { + return t ? t.toUpperCase() : ""; + })).substr(0, 1).toLowerCase() + e.substr(1); + }, o = function(e) { + var t = r(e); + return t.substr(0, 1).toUpperCase() + t.substr(1); + }, a = function(e, t) { + return function(e, t) { + var n = (t = t || {}).separator || "_", r = t.split || /(?=[A-Z])/; + return e.split(r).join(n); + }(e, t).toLowerCase(); + }, i = Object.prototype.toString, s = function(e) { + return "function" == typeof e; + }, l = function(e) { + return e === Object(e); + }, u = function(e) { + return "[object Array]" == i.call(e); + }, c = function(e) { + return "[object Date]" == i.call(e); + }, d = function(e) { + return "[object RegExp]" == i.call(e); + }, f = function(e) { + return "[object Boolean]" == i.call(e); + }, p = function(e) { + return (e -= 0) == e; + }, h = function(e, t) { + var n = t && "process" in t ? t.process : t; + return "function" != typeof n ? e : function(t, r) { + return n(t, e, r); + }; + }, _ = { + camelize: r, + decamelize: a, + pascalize: o, + depascalize: a, + camelizeKeys: function(e, t) { + return n(h(r, t), e); + }, + decamelizeKeys: function(e, t) { + return n(h(a, t), e, t); + }, + pascalizeKeys: function(e, t) { + return n(h(o, t), e); + }, + depascalizeKeys: function() { + return this.decamelizeKeys.apply(this, arguments); + } }; - }, m = { - camelize: r, - decamelize: a, - pascalize: o, - depascalize: a, - camelizeKeys: function(e, t) { - return n(_(r, t), e); - }, - decamelizeKeys: function(e, t) { - return n(_(a, t), e, t); - }, - pascalizeKeys: function(e, t) { - return n(_(o, t), e); - }, - depascalizeKeys: function() { - return this.decamelizeKeys.apply(this, arguments); - } - }, e.exports ? e.exports = m : t.humps = m; - }(h = { - exports: {} - }, h.exports), h.exports); - var m = !1; + e.exports ? e.exports = _ : t.humps = _; + }(p); + }); + var _ = !1; try { - m = !0; + _ = !0; } catch (e) {} - function y(e, t) { + function m(e, t) { return Array.isArray(t) && t.length > 0 || !Array.isArray(t) && t ? u({}, e, t) : {}; } - function b(e) { + function y(e) { return null === e ? null : "object" === l(e) && e.prefix && e.iconName ? e : Array.isArray(e) && 2 === e.length ? { prefix: e[0], iconName: e[1] @@ -3344,8 +3349,8 @@ var _bundleJs = []byte((((`!function(e) { iconName: e } : void 0; } - function v(e) { - var t = e.icon, n = e.mask, o = e.symbol, a = e.className, i = e.title, s = b(t), l = y("classes", [].concat(f(function(e) { + function b(e) { + var t = e.icon, n = e.mask, o = e.symbol, a = e.className, i = e.title, s = y(t), l = m("classes", [].concat(f(function(e) { var t, n = (u(t = { "fa-spin": e.spin, "fa-pulse": e.pulse, @@ -3362,20 +3367,20 @@ var _bundleJs = []byte((((`!function(e) { }).filter(function(e) { return e; }); - }(e)), f(a.split(" ")))), d = y("transform", "string" == typeof e.transform ? r.b.transform(e.transform) : e.transform), p = y("mask", b(n)), h = Object(r.a)(s, c({}, l, d, p, { + }(e)), f(a.split(" ")))), d = m("transform", "string" == typeof e.transform ? r.b.transform(e.transform) : e.transform), p = m("mask", y(n)), h = Object(r.a)(s, c({}, l, d, p, { symbol: o, title: i })); if (!h) return function() { var e; - !m && console && "function" == typeof console.error && (e = console).error.apply(e, arguments); + !_ && console && "function" == typeof console.error && (e = console).error.apply(e, arguments); }("Could not find icon", s), null; - var _ = h.abstract, j = {}; + var g = h.abstract, j = {}; return Object.keys(e).forEach(function(t) { - v.defaultProps.hasOwnProperty(t) || (j[t] = e[t]); - }), g(_[0], j); + b.defaultProps.hasOwnProperty(t) || (j[t] = e[t]); + }), v(g[0], j); } - v.displayName = "FontAwesomeIcon", v.propTypes = { + b.displayName = "FontAwesomeIcon", b.propTypes = { border: a.a.bool, className: a.a.string, mask: a.a.oneOfType([ a.a.object, a.a.array, a.a.string ]), @@ -3392,7 +3397,7 @@ var _bundleJs = []byte((((`!function(e) { symbol: a.a.oneOfType([ a.a.bool, a.a.string ]), title: a.a.string, transform: a.a.oneOfType([ a.a.string, a.a.object ]) - }, v.defaultProps = { + }, b.defaultProps = { border: !1, className: "", mask: null, @@ -3410,7 +3415,7 @@ var _bundleJs = []byte((((`!function(e) { title: "", transform: null }; - var g = function e(t, n) { + var v = function e(t, n) { var r = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : {}; if ("string" == typeof n) return n; var o = (n.children || []).map(function(n) { @@ -3428,14 +3433,14 @@ var _bundleJs = []byte((((`!function(e) { }).filter(function(e) { return e; }).reduce(function(e, t) { - var n, r = t.indexOf(":"), o = _.camelize(t.slice(0, r)), a = t.slice(r + 1).trim(); + var n, r = t.indexOf(":"), o = h.camelize(t.slice(0, r)), a = t.slice(r + 1).trim(); return o.startsWith("webkit") ? e[(n = o, n.charAt(0).toUpperCase() + n.slice(1))] = a : e[o] = a, e; }, {}); break; default: - 0 === t.indexOf("aria-") || 0 === t.indexOf("data-") ? e.attrs[t.toLowerCase()] = r : e.attrs[_.camelize(t)] = r; + 0 === t.indexOf("aria-") || 0 === t.indexOf("data-") ? e.attrs[t.toLowerCase()] = r : e.attrs[h.camelize(t)] = r; } return e; }, { @@ -3716,7 +3721,7 @@ var _bundleJs = []byte((((`!function(e) { value: !0 }), t.default = void 0; var o = r(n("./node_modules/@babel/runtime/helpers/extends.js")), a = r(n("./node_modules/@babel/runtime/helpers/defineProperty.js")), i = r(n("./node_modules/@babel/runtime/helpers/objectWithoutProperties.js")), s = r(n("./node_modules/@babel/runtime/helpers/classCallCheck.js")), l = r(n("./node_modules/@babel/runtime/helpers/createClass.js")), u = r(n("./node_modules/@babel/runtime/helpers/possibleConstructorReturn.js")), c = r(n("./node_modules/@babel/runtime/helpers/getPrototypeOf.js")), d = r(n("./node_modules/@babel/runtime/helpers/inherits.js")), f = r(n("./node_modules/react/index.js")), p = (r(n("./node_modules/prop-types/index.js")), - r(n("./node_modules/classnames/index.js"))), h = r(n("./node_modules/react-transition-group/Transition.js")), _ = function(e) { + r(n("./node_modules/classnames/index.js"))), h = r(n("./node_modules/@material-ui/core/node_modules/react-transition-group/Transition.js")), _ = function(e) { function t() { var e, n; (0, s.default)(this, t); @@ -3772,7 +3777,7 @@ var _bundleJs = []byte((((`!function(e) { value: !0 }), t.default = t.styles = t.DELAY_RIPPLE = void 0; var o = r(n("./node_modules/@babel/runtime/helpers/extends.js")), a = r(n("./node_modules/@babel/runtime/helpers/objectWithoutProperties.js")), i = r(n("./node_modules/@babel/runtime/helpers/toConsumableArray.js")), s = r(n("./node_modules/@babel/runtime/helpers/classCallCheck.js")), l = r(n("./node_modules/@babel/runtime/helpers/createClass.js")), u = r(n("./node_modules/@babel/runtime/helpers/possibleConstructorReturn.js")), c = r(n("./node_modules/@babel/runtime/helpers/getPrototypeOf.js")), d = r(n("./node_modules/@babel/runtime/helpers/inherits.js")), f = r(n("./node_modules/@babel/runtime/helpers/assertThisInitialized.js")), p = r(n("./node_modules/react/index.js")), h = (r(n("./node_modules/prop-types/index.js")), - r(n("./node_modules/react-dom/index.js"))), _ = r(n("./node_modules/react-transition-group/TransitionGroup.js")), m = r(n("./node_modules/classnames/index.js")), y = r(n("./node_modules/@material-ui/core/styles/withStyles.js")), b = r(n("./node_modules/@material-ui/core/ButtonBase/Ripple.js")), v = 550, g = 80; + r(n("./node_modules/react-dom/index.js"))), _ = r(n("./node_modules/@material-ui/core/node_modules/react-transition-group/TransitionGroup.js")), m = r(n("./node_modules/classnames/index.js")), y = r(n("./node_modules/@material-ui/core/styles/withStyles.js")), b = r(n("./node_modules/@material-ui/core/ButtonBase/Ripple.js")), v = 550, g = 80; t.DELAY_RIPPLE = g; var j = function(e) { return { @@ -5514,6 +5519,330 @@ var _bundleJs = []byte((((`!function(e) { }; t.default = r; }, + "./node_modules/@material-ui/core/node_modules/react-transition-group/Transition.js": function(e, t, n) { + "use strict"; + t.__esModule = !0, t.default = t.EXITING = t.ENTERED = t.ENTERING = t.EXITED = t.UNMOUNTED = void 0; + var r = function(e) { + if (e && e.__esModule) return e; + var t = {}; + if (null != e) for (var n in e) if (Object.prototype.hasOwnProperty.call(e, n)) { + var r = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(e, n) : {}; + r.get || r.set ? Object.defineProperty(t, n, r) : t[n] = e[n]; + } + return t.default = e, t; + }(n("./node_modules/prop-types/index.js")), o = s(n("./node_modules/react/index.js")), a = s(n("./node_modules/react-dom/index.js")), i = n("./node_modules/react-lifecycles-compat/react-lifecycles-compat.es.js"); + n("./node_modules/@material-ui/core/node_modules/react-transition-group/utils/PropTypes.js"); + function s(e) { + return e && e.__esModule ? e : { + default: e + }; + } + var l = "unmounted"; + t.UNMOUNTED = l; + var u = "exited"; + t.EXITED = u; + var c = "entering"; + t.ENTERING = c; + var d = "entered"; + t.ENTERED = d; + t.EXITING = "exiting"; + var f = function(e) { + var t, n; + function r(t, n) { + var r; + r = e.call(this, t, n) || this; + var o, a = n.transitionGroup, i = a && !a.isMounting ? t.enter : t.appear; + return r.appearStatus = null, t.in ? i ? (o = u, r.appearStatus = c) : o = d : o = t.unmountOnExit || t.mountOnEnter ? l : u, + r.state = { + status: o + }, r.nextCallback = null, r; + } + n = e, (t = r).prototype = Object.create(n.prototype), t.prototype.constructor = t, + t.__proto__ = n; + var i = r.prototype; + return i.getChildContext = function() { + return { + transitionGroup: null + }; + }, r.getDerivedStateFromProps = function(e, t) { + return e.in && t.status === l ? { + status: u + } : null; + }, i.componentDidMount = function() { + this.updateStatus(!0, this.appearStatus); + }, i.componentDidUpdate = function(e) { + var t = null; + if (e !== this.props) { + var n = this.state.status; + this.props.in ? n !== c && n !== d && (t = c) : n !== c && n !== d || (t = "exiting"); + } + this.updateStatus(!1, t); + }, i.componentWillUnmount = function() { + this.cancelNextCallback(); + }, i.getTimeouts = function() { + var e, t, n, r = this.props.timeout; + return e = t = n = r, null != r && "number" != typeof r && (e = r.exit, t = r.enter, + n = void 0 !== r.appear ? r.appear : t), { + exit: e, + enter: t, + appear: n + }; + }, i.updateStatus = function(e, t) { + if (void 0 === e && (e = !1), null !== t) { + this.cancelNextCallback(); + var n = a.default.findDOMNode(this); + t === c ? this.performEnter(n, e) : this.performExit(n); + } else this.props.unmountOnExit && this.state.status === u && this.setState({ + status: l + }); + }, i.performEnter = function(e, t) { + var n = this, r = this.props.enter, o = this.context.transitionGroup ? this.context.transitionGroup.isMounting : t, a = this.getTimeouts(), i = o ? a.appear : a.enter; + t || r ? (this.props.onEnter(e, o), this.safeSetState({ + status: c + }, function() { + n.props.onEntering(e, o), n.onTransitionEnd(e, i, function() { + n.safeSetState({ + status: d + }, function() { + n.props.onEntered(e, o); + }); + }); + })) : this.safeSetState({ + status: d + }, function() { + n.props.onEntered(e); + }); + }, i.performExit = function(e) { + var t = this, n = this.props.exit, r = this.getTimeouts(); + n ? (this.props.onExit(e), this.safeSetState({ + status: "exiting" + }, function() { + t.props.onExiting(e), t.onTransitionEnd(e, r.exit, function() { + t.safeSetState({ + status: u + }, function() { + t.props.onExited(e); + }); + }); + })) : this.safeSetState({ + status: u + }, function() { + t.props.onExited(e); + }); + }, i.cancelNextCallback = function() { + null !== this.nextCallback && (this.nextCallback.cancel(), this.nextCallback = null); + }, i.safeSetState = function(e, t) { + t = this.setNextCallback(t), this.setState(e, t); + }, i.setNextCallback = function(e) { + var t = this, n = !0; + return this.nextCallback = function(r) { + n && (n = !1, t.nextCallback = null, e(r)); + }, this.nextCallback.cancel = function() { + n = !1; + }, this.nextCallback; + }, i.onTransitionEnd = function(e, t, n) { + this.setNextCallback(n); + var r = null == t && !this.props.addEndListener; + e && !r ? (this.props.addEndListener && this.props.addEndListener(e, this.nextCallback), + null != t && setTimeout(this.nextCallback, t)) : setTimeout(this.nextCallback, 0); + }, i.render = function() { + var e = this.state.status; + if (e === l) return null; + var t = this.props, n = t.children, r = function(e, t) { + if (null == e) return {}; + var n, r, o = {}, a = Object.keys(e); + for (r = 0; r < a.length; r++) n = a[r], t.indexOf(n) >= 0 || (o[n] = e[n]); + return o; + }(t, [ "children" ]); + if (delete r.in, delete r.mountOnEnter, delete r.unmountOnExit, delete r.appear, + delete r.enter, delete r.exit, delete r.timeout, delete r.addEndListener, delete r.onEnter, + delete r.onEntering, delete r.onEntered, delete r.onExit, delete r.onExiting, delete r.onExited, + "function" == typeof n) return n(e, r); + var a = o.default.Children.only(n); + return o.default.cloneElement(a, r); + }, r; + }(o.default.Component); + function p() {} + f.contextTypes = { + transitionGroup: r.object + }, f.childContextTypes = { + transitionGroup: function() {} + }, f.propTypes = {}, f.defaultProps = { + in: !1, + mountOnEnter: !1, + unmountOnExit: !1, + appear: !1, + enter: !0, + exit: !0, + onEnter: p, + onEntering: p, + onEntered: p, + onExit: p, + onExiting: p, + onExited: p + }, f.UNMOUNTED = 0, f.EXITED = 1, f.ENTERING = 2, f.ENTERED = 3, f.EXITING = 4; + var h = (0, i.polyfill)(f); + t.default = h; + }, + "./node_modules/@material-ui/core/node_modules/react-transition-group/TransitionGroup.js": function(e, t, n) { + "use strict"; + t.__esModule = !0, t.default = void 0; + var r = s(n("./node_modules/prop-types/index.js")), o = s(n("./node_modules/react/index.js")), a = n("./node_modules/react-lifecycles-compat/react-lifecycles-compat.es.js"), i = n("./node_modules/@material-ui/core/node_modules/react-transition-group/utils/ChildMapping.js"); + function s(e) { + return e && e.__esModule ? e : { + default: e + }; + } + function l() { + return (l = Object.assign || function(e) { + for (var t = 1; t < arguments.length; t++) { + var n = arguments[t]; + for (var r in n) Object.prototype.hasOwnProperty.call(n, r) && (e[r] = n[r]); + } + return e; + }).apply(this, arguments); + } + function u(e) { + if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + return e; + } + var c = Object.values || function(e) { + return Object.keys(e).map(function(t) { + return e[t]; + }); + }, d = function(e) { + var t, n; + function r(t, n) { + var r, o = (r = e.call(this, t, n) || this).handleExited.bind(u(u(r))); + return r.state = { + handleExited: o, + firstRender: !0 + }, r; + } + n = e, (t = r).prototype = Object.create(n.prototype), t.prototype.constructor = t, + t.__proto__ = n; + var a = r.prototype; + return a.getChildContext = function() { + return { + transitionGroup: { + isMounting: !this.appeared + } + }; + }, a.componentDidMount = function() { + this.appeared = !0, this.mounted = !0; + }, a.componentWillUnmount = function() { + this.mounted = !1; + }, r.getDerivedStateFromProps = function(e, t) { + var n = t.children, r = t.handleExited; + return { + children: t.firstRender ? (0, i.getInitialChildMapping)(e, r) : (0, i.getNextChildMapping)(e, n, r), + firstRender: !1 + }; + }, a.handleExited = function(e, t) { + var n = (0, i.getChildMapping)(this.props.children); + e.key in n || (e.props.onExited && e.props.onExited(t), this.mounted && this.setState(function(t) { + var n = l({}, t.children); + return delete n[e.key], { + children: n + }; + })); + }, a.render = function() { + var e = this.props, t = e.component, n = e.childFactory, r = function(e, t) { + if (null == e) return {}; + var n, r, o = {}, a = Object.keys(e); + for (r = 0; r < a.length; r++) n = a[r], t.indexOf(n) >= 0 || (o[n] = e[n]); + return o; + }(e, [ "component", "childFactory" ]), a = c(this.state.children).map(n); + return delete r.appear, delete r.enter, delete r.exit, null === t ? a : o.default.createElement(t, r, a); + }, r; + }(o.default.Component); + d.childContextTypes = { + transitionGroup: r.default.object.isRequired + }, d.propTypes = {}, d.defaultProps = { + component: "div", + childFactory: function(e) { + return e; + } + }; + var f = (0, a.polyfill)(d); + t.default = f, e.exports = t.default; + }, + "./node_modules/@material-ui/core/node_modules/react-transition-group/utils/ChildMapping.js": function(e, t, n) { + "use strict"; + t.__esModule = !0, t.getChildMapping = o, t.mergeChildMappings = a, t.getInitialChildMapping = function(e, t) { + return o(e.children, function(n) { + return (0, r.cloneElement)(n, { + onExited: t.bind(null, n), + in: !0, + appear: i(n, "appear", e), + enter: i(n, "enter", e), + exit: i(n, "exit", e) + }); + }); + }, t.getNextChildMapping = function(e, t, n) { + var s = o(e.children), l = a(t, s); + return Object.keys(l).forEach(function(o) { + var a = l[o]; + if ((0, r.isValidElement)(a)) { + var u = o in t, c = o in s, d = t[o], f = (0, r.isValidElement)(d) && !d.props.in; + !c || u && !f ? c || !u || f ? c && u && (0, r.isValidElement)(d) && (l[o] = (0, + r.cloneElement)(a, { + onExited: n.bind(null, a), + in: d.props.in, + exit: i(a, "exit", e), + enter: i(a, "enter", e) + })) : l[o] = (0, r.cloneElement)(a, { + in: !1 + }) : l[o] = (0, r.cloneElement)(a, { + onExited: n.bind(null, a), + in: !0, + exit: i(a, "exit", e), + enter: i(a, "enter", e) + }); + } + }), l; + }; + var r = n("./node_modules/react/index.js"); + function o(e, t) { + var n = Object.create(null); + return e && r.Children.map(e, function(e) { + return e; + }).forEach(function(e) { + n[e.key] = function(e) { + return t && (0, r.isValidElement)(e) ? t(e) : e; + }(e); + }), n; + } + function a(e, t) { + function n(n) { + return n in t ? t[n] : e[n]; + } + e = e || {}, t = t || {}; + var r, o = Object.create(null), a = []; + for (var i in e) i in t ? a.length && (o[i] = a, a = []) : a.push(i); + var s = {}; + for (var l in t) { + if (o[l]) for (r = 0; r < o[l].length; r++) { + var u = o[l][r]; + s[o[l][r]] = n(u); + } + s[l] = n(l); + } + for (r = 0; r < a.length; r++) s[a[r]] = n(a[r]); + return s; + } + function i(e, t, n) { + return null != n[t] ? n[t] : e.props[t]; + } + }, + "./node_modules/@material-ui/core/node_modules/react-transition-group/utils/PropTypes.js": function(e, t, n) { + "use strict"; + t.__esModule = !0, t.classNamesShape = t.timeoutsShape = void 0; + var r; + (r = n("./node_modules/prop-types/index.js")) && r.__esModule; + t.timeoutsShape = null; + t.classNamesShape = null; + }, "./node_modules/@material-ui/core/styles/MuiThemeProvider.js": function(e, t, n) { "use strict"; var r = n("./node_modules/@babel/runtime/helpers/interopRequireWildcard.js"), o = n("./node_modules/@babel/runtime/helpers/interopRequireDefault.js"); @@ -6250,9 +6579,9 @@ var _bundleJs = []byte((((`!function(e) { _.ponyfillGlobal.__MUI_STYLES__ || (_.ponyfillGlobal.__MUI_STYLES__ = {}), _.ponyfillGlobal.__MUI_STYLES__.withStyles || (_.ponyfillGlobal.__MUI_STYLES__.withStyles = function(e) { var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}; return function(n) { - var r, _ = t.withTheme, m = void 0 !== _ && _, b = t.flip, j = void 0 === b ? null : b, O = t.name, A = (0, - d.default)(t, [ "withTheme", "flip", "name" ]), D = (0, w.default)(e), I = D.themingEnabled || "string" == typeof O || m; - k += 1, D.options.index = k; + var r, _ = t.withTheme, m = void 0 !== _ && _, b = t.flip, j = void 0 === b ? null : b, O = t.name, D = (0, + d.default)(t, [ "withTheme", "flip", "name" ]), A = (0, w.default)(e), I = A.themingEnabled || "string" == typeof O || m; + k += 1, A.options.index = k; var R = function(e) { function t(e, n) { var r; @@ -6260,7 +6589,7 @@ var _bundleJs = []byte((((`!function(e) { r.sheetsManager = T, r.unsubscribeId = null; var o = n.muiThemeProviderOptions; return o && (o.sheetsManager && (r.sheetsManager = o.sheetsManager), r.sheetsCache = o.sheetsCache, - r.disableStylesGeneration = o.disableStylesGeneration), r.stylesCreatorSaved = D, + r.disableStylesGeneration = o.disableStylesGeneration), r.stylesCreatorSaved = A, r.sheetOptions = (0, a.default)({ generateClassName: P }, n[y.default.sheetOptions]), r.theme = I ? x.default.initial(n) || S : C, r.attach(r.theme), @@ -6333,7 +6662,7 @@ var _bundleJs = []byte((((`!function(e) { link: !1 }, this.sheetOptions, this.stylesCreatorSaved.options, { name: O || n.displayName - }, A)); + }, D)); } }, { key: "detach", @@ -6735,6 +7064,9 @@ var _bundleJs = []byte((((`!function(e) { value: n }); } + function i(e, t) { + return (e[0] - t[0]) ** 2 + (e[1] - t[1]) ** 2 + (e[2] - t[2]) ** 2; + } a.rgb.hsl = function(e) { const t = e[0] / 255, n = e[1] / 255, r = e[2] / 255, o = Math.min(t, n, r), a = Math.max(t, n, r), i = a - o; let s, l; @@ -6761,10 +7093,9 @@ var _bundleJs = []byte((((`!function(e) { if (t) return t; let n, a = 1 / 0; for (const t of Object.keys(r)) { - const o = r[t], l = (s = o, ((i = e)[0] - s[0]) ** 2 + (i[1] - s[1]) ** 2 + (i[2] - s[2]) ** 2); - l < a && (a = l, n = t); + const o = i(e, r[t]); + o < a && (a = o, n = t); } - var i, s; return n; }, a.keyword.rgb = function(e) { return r[e]; @@ -7217,1694 +7548,2396 @@ var _bundleJs = []byte((((`!function(e) { yellowgreen: [ 154, 205, 50 ] }; }, - "./node_modules/css-vendor/lib/camelize.js": function(e, t, n) { - "use strict"; - Object.defineProperty(t, "__esModule", { - value: !0 - }), t.default = function(e) { - return e.replace(r, o); + "./node_modules/core-js/es6/math.js": function(e, t, n) { + n("./node_modules/core-js/modules/es6.math.acosh.js"), n("./node_modules/core-js/modules/es6.math.asinh.js"), + n("./node_modules/core-js/modules/es6.math.atanh.js"), n("./node_modules/core-js/modules/es6.math.cbrt.js"), + n("./node_modules/core-js/modules/es6.math.clz32.js"), n("./node_modules/core-js/modules/es6.math.cosh.js"), + n("./node_modules/core-js/modules/es6.math.expm1.js"), n("./node_modules/core-js/modules/es6.math.fround.js"), + n("./node_modules/core-js/modules/es6.math.hypot.js"), n("./node_modules/core-js/modules/es6.math.imul.js"), + n("./node_modules/core-js/modules/es6.math.log10.js"), n("./node_modules/core-js/modules/es6.math.log1p.js"), + n("./node_modules/core-js/modules/es6.math.log2.js"), n("./node_modules/core-js/modules/es6.math.sign.js"), + n("./node_modules/core-js/modules/es6.math.sinh.js"), n("./node_modules/core-js/modules/es6.math.tanh.js"), + n("./node_modules/core-js/modules/es6.math.trunc.js"), e.exports = n("./node_modules/core-js/modules/_core.js").Math; + }, + "./node_modules/core-js/es6/number.js": function(e, t, n) { + n("./node_modules/core-js/modules/es6.number.constructor.js"), n("./node_modules/core-js/modules/es6.number.to-fixed.js"), + n("./node_modules/core-js/modules/es6.number.to-precision.js"), n("./node_modules/core-js/modules/es6.number.epsilon.js"), + n("./node_modules/core-js/modules/es6.number.is-finite.js"), n("./node_modules/core-js/modules/es6.number.is-integer.js"), + n("./node_modules/core-js/modules/es6.number.is-nan.js"), n("./node_modules/core-js/modules/es6.number.is-safe-integer.js"), + n("./node_modules/core-js/modules/es6.number.max-safe-integer.js"), n("./node_modules/core-js/modules/es6.number.min-safe-integer.js"), + n("./node_modules/core-js/modules/es6.number.parse-float.js"), n("./node_modules/core-js/modules/es6.number.parse-int.js"), + e.exports = n("./node_modules/core-js/modules/_core.js").Number; + }, + "./node_modules/core-js/modules/_a-function.js": function(e, t) { + e.exports = function(e) { + if ("function" != typeof e) throw TypeError(e + " is not a function!"); + return e; }; - var r = /[-\s]+(.)?/g; - function o(e, t) { - return t ? t.toUpperCase() : ""; - } }, - "./node_modules/css-vendor/lib/index.js": function(e, t, n) { - "use strict"; - Object.defineProperty(t, "__esModule", { - value: !0 - }), t.supportedValue = t.supportedProperty = t.prefix = void 0; - var r = i(n("./node_modules/css-vendor/lib/prefix.js")), o = i(n("./node_modules/css-vendor/lib/supported-property.js")), a = i(n("./node_modules/css-vendor/lib/supported-value.js")); - function i(e) { - return e && e.__esModule ? e : { - default: e + "./node_modules/core-js/modules/_a-number-value.js": function(e, t, n) { + var r = n("./node_modules/core-js/modules/_cof.js"); + e.exports = function(e, t) { + if ("number" != typeof e && "Number" != r(e)) throw TypeError(t); + return +e; + }; + }, + "./node_modules/core-js/modules/_an-object.js": function(e, t, n) { + var r = n("./node_modules/core-js/modules/_is-object.js"); + e.exports = function(e) { + if (!r(e)) throw TypeError(e + " is not an object!"); + return e; + }; + }, + "./node_modules/core-js/modules/_array-includes.js": function(e, t, n) { + var r = n("./node_modules/core-js/modules/_to-iobject.js"), o = n("./node_modules/core-js/modules/_to-length.js"), a = n("./node_modules/core-js/modules/_to-absolute-index.js"); + e.exports = function(e) { + return function(t, n, i) { + var s, l = r(t), u = o(l.length), c = a(i, u); + if (e && n != n) { + for (;u > c; ) if ((s = l[c++]) != s) return !0; + } else for (;u > c; c++) if ((e || c in l) && l[c] === n) return e || c || 0; + return !e && -1; }; - } - t.default = { - prefix: r.default, - supportedProperty: o.default, - supportedValue: a.default - }, t.prefix = r.default, t.supportedProperty = o.default, t.supportedValue = a.default; + }; }, - "./node_modules/css-vendor/lib/prefix.js": function(e, t, n) { - "use strict"; - Object.defineProperty(t, "__esModule", { - value: !0 - }); - var r, o = n("./node_modules/is-in-browser/dist/module.js"); - var a = "", i = ""; - if (((r = o) && r.__esModule ? r : { - default: r - }).default) { - var s = { - Moz: "-moz-", - ms: "-ms-", - O: "-o-", - Webkit: "-webkit-" - }, l = document.createElement("p").style; - for (var u in s) if (u + "Transform" in l) { - a = u, i = s[u]; - break; - } - } - t.default = { - js: a, - css: i + "./node_modules/core-js/modules/_cof.js": function(e, t) { + var n = {}.toString; + e.exports = function(e) { + return n.call(e).slice(8, -1); }; }, - "./node_modules/css-vendor/lib/supported-property.js": function(e, t, n) { - "use strict"; - Object.defineProperty(t, "__esModule", { - value: !0 - }), t.default = function(e) { - if (!s) return e; - if (null != l[e]) return l[e]; - (0, a.default)(e) in s.style ? l[e] = e : o.default.js + (0, a.default)("-" + e) in s.style ? l[e] = o.default.css + e : l[e] = !1; - return l[e]; + "./node_modules/core-js/modules/_core.js": function(e, t) { + var n = e.exports = { + version: "2.5.7" }; - var r = i(n("./node_modules/is-in-browser/dist/module.js")), o = i(n("./node_modules/css-vendor/lib/prefix.js")), a = i(n("./node_modules/css-vendor/lib/camelize.js")); - function i(e) { - return e && e.__esModule ? e : { - default: e + "number" == typeof __e && (__e = n); + }, + "./node_modules/core-js/modules/_ctx.js": function(e, t, n) { + var r = n("./node_modules/core-js/modules/_a-function.js"); + e.exports = function(e, t, n) { + if (r(e), void 0 === t) return e; + switch (n) { + case 1: + return function(n) { + return e.call(t, n); + }; + + case 2: + return function(n, r) { + return e.call(t, n, r); + }; + + case 3: + return function(n, r, o) { + return e.call(t, n, r, o); + }; + } + return function() { + return e.apply(t, arguments); }; - } - var s = void 0, l = {}; - if (r.default) { - s = document.createElement("p"); - var u = window.getComputedStyle(document.documentElement, ""); - for (var c in u) isNaN(c) || (l[u[c]] = u[c]); - } + }; }, - "./node_modules/css-vendor/lib/supported-value.js": function(e, t, n) { - "use strict"; - Object.defineProperty(t, "__esModule", { - value: !0 - }), t.default = function(e, t) { - if (!s) return t; - if ("string" != typeof t || !isNaN(parseInt(t, 10))) return t; - var n = e + t; - if (null != i[n]) return i[n]; + "./node_modules/core-js/modules/_defined.js": function(e, t) { + e.exports = function(e) { + if (null == e) throw TypeError("Can't call method on " + e); + return e; + }; + }, + "./node_modules/core-js/modules/_descriptors.js": function(e, t, n) { + e.exports = !n("./node_modules/core-js/modules/_fails.js")(function() { + return 7 != Object.defineProperty({}, "a", { + get: function() { + return 7; + } + }).a; + }); + }, + "./node_modules/core-js/modules/_dom-create.js": function(e, t, n) { + var r = n("./node_modules/core-js/modules/_is-object.js"), o = n("./node_modules/core-js/modules/_global.js").document, a = r(o) && r(o.createElement); + e.exports = function(e) { + return a ? o.createElement(e) : {}; + }; + }, + "./node_modules/core-js/modules/_enum-bug-keys.js": function(e, t) { + e.exports = "constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(","); + }, + "./node_modules/core-js/modules/_export.js": function(e, t, n) { + var r = n("./node_modules/core-js/modules/_global.js"), o = n("./node_modules/core-js/modules/_core.js"), a = n("./node_modules/core-js/modules/_hide.js"), i = n("./node_modules/core-js/modules/_redefine.js"), s = n("./node_modules/core-js/modules/_ctx.js"), l = function(e, t, n) { + var u, c, d, f, p = e & l.F, h = e & l.G, _ = e & l.S, m = e & l.P, y = e & l.B, b = h ? r : _ ? r[t] || (r[t] = {}) : (r[t] || {}).prototype, v = h ? o : o[t] || (o[t] = {}), g = v.prototype || (v.prototype = {}); + for (u in h && (n = t), n) d = ((c = !p && b && void 0 !== b[u]) ? b : n)[u], f = y && c ? s(d, r) : m && "function" == typeof d ? s(Function.call, d) : d, + b && i(b, u, d, e & l.U), v[u] != d && a(v, u, f), m && g[u] != d && (g[u] = d); + }; + r.core = o, l.F = 1, l.G = 2, l.S = 4, l.P = 8, l.B = 16, l.W = 32, l.U = 64, l.R = 128, + e.exports = l; + }, + "./node_modules/core-js/modules/_fails.js": function(e, t) { + e.exports = function(e) { try { - s.style[e] = t; + return !!e(); } catch (e) { - return i[n] = !1, !1; + return !0; } - "" !== s.style[e] ? i[n] = t : ("-ms-flex" === (t = o.default.css + t) && (t = "-ms-flexbox"), - s.style[e] = t, "" !== s.style[e] && (i[n] = t)); - i[n] || (i[n] = !1); - return s.style[e] = "", i[n]; }; - var r = a(n("./node_modules/is-in-browser/dist/module.js")), o = a(n("./node_modules/css-vendor/lib/prefix.js")); - function a(e) { - return e && e.__esModule ? e : { - default: e - }; - } - var i = {}, s = void 0; - r.default && (s = document.createElement("p")); }, - "./node_modules/d3-scale/src/index.js": function(e, t, n) { - "use strict"; - n.r(t); - var r = function(e, t) { - return e < t ? -1 : e > t ? 1 : e >= t ? 0 : NaN; - }, o = function(e) { - var t; - return 1 === e.length && (t = e, e = function(e, n) { - return r(t(e), n); - }), { - left: function(t, n, r, o) { - for (null == r && (r = 0), null == o && (o = t.length); r < o; ) { - var a = r + o >>> 1; - e(t[a], n) < 0 ? r = a + 1 : o = a; - } - return r; - }, - right: function(t, n, r, o) { - for (null == r && (r = 0), null == o && (o = t.length); r < o; ) { - var a = r + o >>> 1; - e(t[a], n) > 0 ? o = a : r = a + 1; - } - return r; + "./node_modules/core-js/modules/_global.js": function(e, t) { + var n = e.exports = "undefined" != typeof window && window.Math == Math ? window : "undefined" != typeof self && self.Math == Math ? self : Function("return this")(); + "number" == typeof __g && (__g = n); + }, + "./node_modules/core-js/modules/_has.js": function(e, t) { + var n = {}.hasOwnProperty; + e.exports = function(e, t) { + return n.call(e, t); + }; + }, + "./node_modules/core-js/modules/_hide.js": function(e, t, n) { + var r = n("./node_modules/core-js/modules/_object-dp.js"), o = n("./node_modules/core-js/modules/_property-desc.js"); + e.exports = n("./node_modules/core-js/modules/_descriptors.js") ? function(e, t, n) { + return r.f(e, t, o(1, n)); + } : function(e, t, n) { + return e[t] = n, e; + }; + }, + "./node_modules/core-js/modules/_html.js": function(e, t, n) { + var r = n("./node_modules/core-js/modules/_global.js").document; + e.exports = r && r.documentElement; + }, + "./node_modules/core-js/modules/_ie8-dom-define.js": function(e, t, n) { + e.exports = !n("./node_modules/core-js/modules/_descriptors.js") && !n("./node_modules/core-js/modules/_fails.js")(function() { + return 7 != Object.defineProperty(n("./node_modules/core-js/modules/_dom-create.js")("div"), "a", { + get: function() { + return 7; } + }).a; + }); + }, + "./node_modules/core-js/modules/_inherit-if-required.js": function(e, t, n) { + var r = n("./node_modules/core-js/modules/_is-object.js"), o = n("./node_modules/core-js/modules/_set-proto.js").set; + e.exports = function(e, t, n) { + var a, i = t.constructor; + return i !== n && "function" == typeof i && (a = i.prototype) !== n.prototype && r(a) && o && o(e, a), + e; + }; + }, + "./node_modules/core-js/modules/_iobject.js": function(e, t, n) { + var r = n("./node_modules/core-js/modules/_cof.js"); + e.exports = Object("z").propertyIsEnumerable(0) ? Object : function(e) { + return "String" == r(e) ? e.split("") : Object(e); + }; + }, + "./node_modules/core-js/modules/_is-integer.js": function(e, t, n) { + var r = n("./node_modules/core-js/modules/_is-object.js"), o = Math.floor; + e.exports = function(e) { + return !r(e) && isFinite(e) && o(e) === e; + }; + }, + "./node_modules/core-js/modules/_is-object.js": function(e, t) { + e.exports = function(e) { + return "object" == typeof e ? null !== e : "function" == typeof e; + }; + }, + "./node_modules/core-js/modules/_library.js": function(e, t) { + e.exports = !1; + }, + "./node_modules/core-js/modules/_math-expm1.js": function(e, t) { + var n = Math.expm1; + e.exports = !n || n(10) > 22025.465794806718 || n(10) < 22025.465794806718 || -2e-17 != n(-2e-17) ? function(e) { + return 0 == (e = +e) ? e : e > -1e-6 && e < 1e-6 ? e + e * e / 2 : Math.exp(e) - 1; + } : n; + }, + "./node_modules/core-js/modules/_math-fround.js": function(e, t, n) { + var r = n("./node_modules/core-js/modules/_math-sign.js"), o = Math.pow, a = o(2, -52), i = o(2, -23), s = o(2, 127) * (2 - i), l = o(2, -126); + e.exports = Math.fround || function(e) { + var t, n, o = Math.abs(e), u = r(e); + return o < l ? u * (o / l / i + 1 / a - 1 / a) * l * i : (n = (t = (1 + i / a) * o) - (t - o)) > s || n != n ? u * (1 / 0) : u * n; + }; + }, + "./node_modules/core-js/modules/_math-log1p.js": function(e, t) { + e.exports = Math.log1p || function(e) { + return (e = +e) > -1e-8 && e < 1e-8 ? e - e * e / 2 : Math.log(1 + e); + }; + }, + "./node_modules/core-js/modules/_math-sign.js": function(e, t) { + e.exports = Math.sign || function(e) { + return 0 == (e = +e) || e != e ? e : e < 0 ? -1 : 1; + }; + }, + "./node_modules/core-js/modules/_object-create.js": function(e, t, n) { + var r = n("./node_modules/core-js/modules/_an-object.js"), o = n("./node_modules/core-js/modules/_object-dps.js"), a = n("./node_modules/core-js/modules/_enum-bug-keys.js"), i = n("./node_modules/core-js/modules/_shared-key.js")("IE_PROTO"), s = function() {}, l = function() { + var e, t = n("./node_modules/core-js/modules/_dom-create.js")("iframe"), r = a.length; + for (t.style.display = "none", n("./node_modules/core-js/modules/_html.js").appendChild(t), + t.src = "javascript:", (e = t.contentWindow.document).open(), e.write("\n if (val === '') return true;\n if (val === 'false') return false;\n if (val === 'true') return true;\n return val;\n}\n\nif (DOCUMENT && typeof DOCUMENT.querySelector === 'function') {\n var attrs = [['data-family-prefix', 'familyPrefix'], ['data-replacement-class', 'replacementClass'], ['data-auto-replace-svg', 'autoReplaceSvg'], ['data-auto-add-css', 'autoAddCss'], ['data-auto-a11y', 'autoA11y'], ['data-search-pseudo-elements', 'searchPseudoElements'], ['data-observe-mutations', 'observeMutations'], ['data-keep-original-source', 'keepOriginalSource'], ['data-measure-performance', 'measurePerformance'], ['data-show-missing-icons', 'showMissingIcons']];\n attrs.forEach(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n attr = _ref2[0],\n key = _ref2[1];\n\n var val = coerce(getAttrConfig(attr));\n\n if (val !== undefined && val !== null) {\n initial[key] = val;\n }\n });\n}\n\nvar _default = {\n familyPrefix: DEFAULT_FAMILY_PREFIX,\n replacementClass: DEFAULT_REPLACEMENT_CLASS,\n autoReplaceSvg: true,\n autoAddCss: true,\n autoA11y: true,\n searchPseudoElements: false,\n observeMutations: true,\n keepOriginalSource: true,\n measurePerformance: false,\n showMissingIcons: true\n};\n\nvar _config = _objectSpread({}, _default, initial);\n\nif (!_config.autoReplaceSvg) _config.observeMutations = false;\n\nvar config = _objectSpread({}, _config);\n\nWINDOW.FontAwesomeConfig = config;\n\nvar w = WINDOW || {};\nif (!w[NAMESPACE_IDENTIFIER]) w[NAMESPACE_IDENTIFIER] = {};\nif (!w[NAMESPACE_IDENTIFIER].styles) w[NAMESPACE_IDENTIFIER].styles = {};\nif (!w[NAMESPACE_IDENTIFIER].hooks) w[NAMESPACE_IDENTIFIER].hooks = {};\nif (!w[NAMESPACE_IDENTIFIER].shims) w[NAMESPACE_IDENTIFIER].shims = [];\nvar namespace = w[NAMESPACE_IDENTIFIER];\n\nvar functions = [];\n\nvar listener = function listener() {\n DOCUMENT.removeEventListener('DOMContentLoaded', listener);\n loaded = 1;\n functions.map(function (fn) {\n return fn();\n });\n};\n\nvar loaded = false;\n\nif (IS_DOM) {\n loaded = (DOCUMENT.documentElement.doScroll ? /^loaded|^c/ : /^loaded|^i|^c/).test(DOCUMENT.readyState);\n if (!loaded) DOCUMENT.addEventListener('DOMContentLoaded', listener);\n}\n\nfunction domready (fn) {\n if (!IS_DOM) return;\n loaded ? setTimeout(fn, 0) : functions.push(fn);\n}\n\nvar PENDING = 'pending';\nvar SETTLED = 'settled';\nvar FULFILLED = 'fulfilled';\nvar REJECTED = 'rejected';\n\nvar NOOP = function NOOP() {};\n\nvar isNode = typeof global !== 'undefined' && typeof global.process !== 'undefined' && typeof global.process.emit === 'function';\nvar asyncSetTimer = typeof setImmediate === 'undefined' ? setTimeout : setImmediate;\nvar asyncQueue = [];\nvar asyncTimer;\n\nfunction asyncFlush() {\n // run promise callbacks\n for (var i = 0; i < asyncQueue.length; i++) {\n asyncQueue[i][0](asyncQueue[i][1]);\n } // reset async asyncQueue\n\n\n asyncQueue = [];\n asyncTimer = false;\n}\n\nfunction asyncCall(callback, arg) {\n asyncQueue.push([callback, arg]);\n\n if (!asyncTimer) {\n asyncTimer = true;\n asyncSetTimer(asyncFlush, 0);\n }\n}\n\nfunction invokeResolver(resolver, promise) {\n function resolvePromise(value) {\n resolve(promise, value);\n }\n\n function rejectPromise(reason) {\n reject(promise, reason);\n }\n\n try {\n resolver(resolvePromise, rejectPromise);\n } catch (e) {\n rejectPromise(e);\n }\n}\n\nfunction invokeCallback(subscriber) {\n var owner = subscriber.owner;\n var settled = owner._state;\n var value = owner._data;\n var callback = subscriber[settled];\n var promise = subscriber.then;\n\n if (typeof callback === 'function') {\n settled = FULFILLED;\n\n try {\n value = callback(value);\n } catch (e) {\n reject(promise, e);\n }\n }\n\n if (!handleThenable(promise, value)) {\n if (settled === FULFILLED) {\n resolve(promise, value);\n }\n\n if (settled === REJECTED) {\n reject(promise, value);\n }\n }\n}\n\nfunction handleThenable(promise, value) {\n var resolved;\n\n try {\n if (promise === value) {\n throw new TypeError('A promises callback cannot return that same promise.');\n }\n\n if (value && (typeof value === 'function' || _typeof(value) === 'object')) {\n // then should be retrieved only once\n var then = value.then;\n\n if (typeof then === 'function') {\n then.call(value, function (val) {\n if (!resolved) {\n resolved = true;\n\n if (value === val) {\n fulfill(promise, val);\n } else {\n resolve(promise, val);\n }\n }\n }, function (reason) {\n if (!resolved) {\n resolved = true;\n reject(promise, reason);\n }\n });\n return true;\n }\n }\n } catch (e) {\n if (!resolved) {\n reject(promise, e);\n }\n\n return true;\n }\n\n return false;\n}\n\nfunction resolve(promise, value) {\n if (promise === value || !handleThenable(promise, value)) {\n fulfill(promise, value);\n }\n}\n\nfunction fulfill(promise, value) {\n if (promise._state === PENDING) {\n promise._state = SETTLED;\n promise._data = value;\n asyncCall(publishFulfillment, promise);\n }\n}\n\nfunction reject(promise, reason) {\n if (promise._state === PENDING) {\n promise._state = SETTLED;\n promise._data = reason;\n asyncCall(publishRejection, promise);\n }\n}\n\nfunction publish(promise) {\n promise._then = promise._then.forEach(invokeCallback);\n}\n\nfunction publishFulfillment(promise) {\n promise._state = FULFILLED;\n publish(promise);\n}\n\nfunction publishRejection(promise) {\n promise._state = REJECTED;\n publish(promise);\n\n if (!promise._handled && isNode) {\n global.process.emit('unhandledRejection', promise._data, promise);\n }\n}\n\nfunction notifyRejectionHandled(promise) {\n global.process.emit('rejectionHandled', promise);\n}\n/**\n * @class\n */\n\n\nfunction P(resolver) {\n if (typeof resolver !== 'function') {\n throw new TypeError('Promise resolver ' + resolver + ' is not a function');\n }\n\n if (this instanceof P === false) {\n throw new TypeError('Failed to construct \\'Promise\\': Please use the \\'new\\' operator, this object constructor cannot be called as a function.');\n }\n\n this._then = [];\n invokeResolver(resolver, this);\n}\n\nP.prototype = {\n constructor: P,\n _state: PENDING,\n _then: null,\n _data: undefined,\n _handled: false,\n then: function then(onFulfillment, onRejection) {\n var subscriber = {\n owner: this,\n then: new this.constructor(NOOP),\n fulfilled: onFulfillment,\n rejected: onRejection\n };\n\n if ((onRejection || onFulfillment) && !this._handled) {\n this._handled = true;\n\n if (this._state === REJECTED && isNode) {\n asyncCall(notifyRejectionHandled, this);\n }\n }\n\n if (this._state === FULFILLED || this._state === REJECTED) {\n // already resolved, call callback async\n asyncCall(invokeCallback, subscriber);\n } else {\n // subscribe\n this._then.push(subscriber);\n }\n\n return subscriber.then;\n },\n catch: function _catch(onRejection) {\n return this.then(null, onRejection);\n }\n};\n\nP.all = function (promises) {\n if (!Array.isArray(promises)) {\n throw new TypeError('You must pass an array to Promise.all().');\n }\n\n return new P(function (resolve, reject) {\n var results = [];\n var remaining = 0;\n\n function resolver(index) {\n remaining++;\n return function (value) {\n results[index] = value;\n\n if (! --remaining) {\n resolve(results);\n }\n };\n }\n\n for (var i = 0, promise; i < promises.length; i++) {\n promise = promises[i];\n\n if (promise && typeof promise.then === 'function') {\n promise.then(resolver(i), reject);\n } else {\n results[i] = promise;\n }\n }\n\n if (!remaining) {\n resolve(results);\n }\n });\n};\n\nP.race = function (promises) {\n if (!Array.isArray(promises)) {\n throw new TypeError('You must pass an array to Promise.race().');\n }\n\n return new P(function (resolve, reject) {\n for (var i = 0, promise; i < promises.length; i++) {\n promise = promises[i];\n\n if (promise && typeof promise.then === 'function') {\n promise.then(resolve, reject);\n } else {\n resolve(promise);\n }\n }\n });\n};\n\nP.resolve = function (value) {\n if (value && _typeof(value) === 'object' && value.constructor === P) {\n return value;\n }\n\n return new P(function (resolve) {\n resolve(value);\n });\n};\n\nP.reject = function (reason) {\n return new P(function (resolve, reject) {\n reject(reason);\n });\n};\n\nvar picked = typeof Promise === 'function' ? Promise : P;\n\nvar d = UNITS_IN_GRID;\nvar meaninglessTransform = {\n size: 16,\n x: 0,\n y: 0,\n rotate: 0,\n flipX: false,\n flipY: false\n};\n\nfunction isReserved(name) {\n return ~RESERVED_CLASSES.indexOf(name);\n}\nfunction insertCss(css) {\n if (!css || !IS_DOM) {\n return;\n }\n\n var style = DOCUMENT.createElement('style');\n style.setAttribute('type', 'text/css');\n style.innerHTML = css;\n var headChildren = DOCUMENT.head.childNodes;\n var beforeChild = null;\n\n for (var i = headChildren.length - 1; i > -1; i--) {\n var child = headChildren[i];\n var tagName = (child.tagName || '').toUpperCase();\n\n if (['STYLE', 'LINK'].indexOf(tagName) > -1) {\n beforeChild = child;\n }\n }\n\n DOCUMENT.head.insertBefore(style, beforeChild);\n return css;\n}\nvar idPool = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';\nfunction nextUniqueId() {\n var size = 12;\n var id = '';\n\n while (size-- > 0) {\n id += idPool[Math.random() * 62 | 0];\n }\n\n return id;\n}\nfunction toArray(obj) {\n var array = [];\n\n for (var i = (obj || []).length >>> 0; i--;) {\n array[i] = obj[i];\n }\n\n return array;\n}\nfunction classArray(node) {\n if (node.classList) {\n return toArray(node.classList);\n } else {\n return (node.getAttribute('class') || '').split(' ').filter(function (i) {\n return i;\n });\n }\n}\nfunction getIconName(familyPrefix, cls) {\n var parts = cls.split('-');\n var prefix = parts[0];\n var iconName = parts.slice(1).join('-');\n\n if (prefix === familyPrefix && iconName !== '' && !isReserved(iconName)) {\n return iconName;\n } else {\n return null;\n }\n}\nfunction htmlEscape(str) {\n return \"\".concat(str).replace(/&/g, '&').replace(/\"/g, '"').replace(/'/g, ''').replace(//g, '>');\n}\nfunction joinAttributes(attributes) {\n return Object.keys(attributes || {}).reduce(function (acc, attributeName) {\n return acc + \"\".concat(attributeName, \"=\\\"\").concat(htmlEscape(attributes[attributeName]), \"\\\" \");\n }, '').trim();\n}\nfunction joinStyles(styles) {\n return Object.keys(styles || {}).reduce(function (acc, styleName) {\n return acc + \"\".concat(styleName, \": \").concat(styles[styleName], \";\");\n }, '');\n}\nfunction transformIsMeaningful(transform) {\n return transform.size !== meaninglessTransform.size || transform.x !== meaninglessTransform.x || transform.y !== meaninglessTransform.y || transform.rotate !== meaninglessTransform.rotate || transform.flipX || transform.flipY;\n}\nfunction transformForSvg(_ref) {\n var transform = _ref.transform,\n containerWidth = _ref.containerWidth,\n iconWidth = _ref.iconWidth;\n var outer = {\n transform: \"translate(\".concat(containerWidth / 2, \" 256)\")\n };\n var innerTranslate = \"translate(\".concat(transform.x * 32, \", \").concat(transform.y * 32, \") \");\n var innerScale = \"scale(\".concat(transform.size / 16 * (transform.flipX ? -1 : 1), \", \").concat(transform.size / 16 * (transform.flipY ? -1 : 1), \") \");\n var innerRotate = \"rotate(\".concat(transform.rotate, \" 0 0)\");\n var inner = {\n transform: \"\".concat(innerTranslate, \" \").concat(innerScale, \" \").concat(innerRotate)\n };\n var path = {\n transform: \"translate(\".concat(iconWidth / 2 * -1, \" -256)\")\n };\n return {\n outer: outer,\n inner: inner,\n path: path\n };\n}\nfunction transformForCss(_ref2) {\n var transform = _ref2.transform,\n _ref2$width = _ref2.width,\n width = _ref2$width === void 0 ? UNITS_IN_GRID : _ref2$width,\n _ref2$height = _ref2.height,\n height = _ref2$height === void 0 ? UNITS_IN_GRID : _ref2$height,\n _ref2$startCentered = _ref2.startCentered,\n startCentered = _ref2$startCentered === void 0 ? false : _ref2$startCentered;\n var val = '';\n\n if (startCentered && IS_IE) {\n val += \"translate(\".concat(transform.x / d - width / 2, \"em, \").concat(transform.y / d - height / 2, \"em) \");\n } else if (startCentered) {\n val += \"translate(calc(-50% + \".concat(transform.x / d, \"em), calc(-50% + \").concat(transform.y / d, \"em)) \");\n } else {\n val += \"translate(\".concat(transform.x / d, \"em, \").concat(transform.y / d, \"em) \");\n }\n\n val += \"scale(\".concat(transform.size / d * (transform.flipX ? -1 : 1), \", \").concat(transform.size / d * (transform.flipY ? -1 : 1), \") \");\n val += \"rotate(\".concat(transform.rotate, \"deg) \");\n return val;\n}\n\nvar ALL_SPACE = {\n x: 0,\n y: 0,\n width: '100%',\n height: '100%'\n};\nfunction makeIconMasking (_ref) {\n var children = _ref.children,\n attributes = _ref.attributes,\n main = _ref.main,\n mask = _ref.mask,\n transform = _ref.transform;\n var mainWidth = main.width,\n mainPath = main.icon;\n var maskWidth = mask.width,\n maskPath = mask.icon;\n var trans = transformForSvg({\n transform: transform,\n containerWidth: maskWidth,\n iconWidth: mainWidth\n });\n var maskRect = {\n tag: 'rect',\n attributes: _objectSpread({}, ALL_SPACE, {\n fill: 'white'\n })\n };\n var maskInnerGroup = {\n tag: 'g',\n attributes: _objectSpread({}, trans.inner),\n children: [{\n tag: 'path',\n attributes: _objectSpread({}, mainPath.attributes, trans.path, {\n fill: 'black'\n })\n }]\n };\n var maskOuterGroup = {\n tag: 'g',\n attributes: _objectSpread({}, trans.outer),\n children: [maskInnerGroup]\n };\n var maskId = \"mask-\".concat(nextUniqueId());\n var clipId = \"clip-\".concat(nextUniqueId());\n var maskTag = {\n tag: 'mask',\n attributes: _objectSpread({}, ALL_SPACE, {\n id: maskId,\n maskUnits: 'userSpaceOnUse',\n maskContentUnits: 'userSpaceOnUse'\n }),\n children: [maskRect, maskOuterGroup]\n };\n var defs = {\n tag: 'defs',\n children: [{\n tag: 'clipPath',\n attributes: {\n id: clipId\n },\n children: [maskPath]\n }, maskTag]\n };\n children.push(defs, {\n tag: 'rect',\n attributes: _objectSpread({\n fill: 'currentColor',\n 'clip-path': \"url(#\".concat(clipId, \")\"),\n mask: \"url(#\".concat(maskId, \")\")\n }, ALL_SPACE)\n });\n return {\n children: children,\n attributes: attributes\n };\n}\n\nfunction makeIconStandard (_ref) {\n var children = _ref.children,\n attributes = _ref.attributes,\n main = _ref.main,\n transform = _ref.transform,\n styles = _ref.styles;\n var styleString = joinStyles(styles);\n\n if (styleString.length > 0) {\n attributes['style'] = styleString;\n }\n\n if (transformIsMeaningful(transform)) {\n var trans = transformForSvg({\n transform: transform,\n containerWidth: main.width,\n iconWidth: main.width\n });\n children.push({\n tag: 'g',\n attributes: _objectSpread({}, trans.outer),\n children: [{\n tag: 'g',\n attributes: _objectSpread({}, trans.inner),\n children: [{\n tag: main.icon.tag,\n children: main.icon.children,\n attributes: _objectSpread({}, main.icon.attributes, trans.path)\n }]\n }]\n });\n } else {\n children.push(main.icon);\n }\n\n return {\n children: children,\n attributes: attributes\n };\n}\n\nfunction asIcon (_ref) {\n var children = _ref.children,\n main = _ref.main,\n mask = _ref.mask,\n attributes = _ref.attributes,\n styles = _ref.styles,\n transform = _ref.transform;\n\n if (transformIsMeaningful(transform) && main.found && !mask.found) {\n var width = main.width,\n height = main.height;\n var offset = {\n x: width / height / 2,\n y: 0.5\n };\n attributes['style'] = joinStyles(_objectSpread({}, styles, {\n 'transform-origin': \"\".concat(offset.x + transform.x / 16, \"em \").concat(offset.y + transform.y / 16, \"em\")\n }));\n }\n\n return [{\n tag: 'svg',\n attributes: attributes,\n children: children\n }];\n}\n\nfunction asSymbol (_ref) {\n var prefix = _ref.prefix,\n iconName = _ref.iconName,\n children = _ref.children,\n attributes = _ref.attributes,\n symbol = _ref.symbol;\n var id = symbol === true ? \"\".concat(prefix, \"-\").concat(config.familyPrefix, \"-\").concat(iconName) : symbol;\n return [{\n tag: 'svg',\n attributes: {\n style: 'display: none;'\n },\n children: [{\n tag: 'symbol',\n attributes: _objectSpread({}, attributes, {\n id: id\n }),\n children: children\n }]\n }];\n}\n\nfunction makeInlineSvgAbstract(params) {\n var _params$icons = params.icons,\n main = _params$icons.main,\n mask = _params$icons.mask,\n prefix = params.prefix,\n iconName = params.iconName,\n transform = params.transform,\n symbol = params.symbol,\n title = params.title,\n extra = params.extra,\n _params$watchable = params.watchable,\n watchable = _params$watchable === void 0 ? false : _params$watchable;\n\n var _ref = mask.found ? mask : main,\n width = _ref.width,\n height = _ref.height;\n\n var widthClass = \"fa-w-\".concat(Math.ceil(width / height * 16));\n var attrClass = [config.replacementClass, iconName ? \"\".concat(config.familyPrefix, \"-\").concat(iconName) : '', widthClass].filter(function (c) {\n return extra.classes.indexOf(c) === -1;\n }).concat(extra.classes).join(' ');\n var content = {\n children: [],\n attributes: _objectSpread({}, extra.attributes, {\n 'data-prefix': prefix,\n 'data-icon': iconName,\n 'class': attrClass,\n 'role': 'img',\n 'xmlns': 'http://www.w3.org/2000/svg',\n 'viewBox': \"0 0 \".concat(width, \" \").concat(height)\n })\n };\n\n if (watchable) {\n content.attributes[DATA_FA_I2SVG] = '';\n }\n\n if (title) content.children.push({\n tag: 'title',\n attributes: {\n id: content.attributes['aria-labelledby'] || \"title-\".concat(nextUniqueId())\n },\n children: [title]\n });\n\n var args = _objectSpread({}, content, {\n prefix: prefix,\n iconName: iconName,\n main: main,\n mask: mask,\n transform: transform,\n symbol: symbol,\n styles: extra.styles\n });\n\n var _ref2 = mask.found && main.found ? makeIconMasking(args) : makeIconStandard(args),\n children = _ref2.children,\n attributes = _ref2.attributes;\n\n args.children = children;\n args.attributes = attributes;\n\n if (symbol) {\n return asSymbol(args);\n } else {\n return asIcon(args);\n }\n}\nfunction makeLayersTextAbstract(params) {\n var content = params.content,\n width = params.width,\n height = params.height,\n transform = params.transform,\n title = params.title,\n extra = params.extra,\n _params$watchable2 = params.watchable,\n watchable = _params$watchable2 === void 0 ? false : _params$watchable2;\n\n var attributes = _objectSpread({}, extra.attributes, title ? {\n 'title': title\n } : {}, {\n 'class': extra.classes.join(' ')\n });\n\n if (watchable) {\n attributes[DATA_FA_I2SVG] = '';\n }\n\n var styles = _objectSpread({}, extra.styles);\n\n if (transformIsMeaningful(transform)) {\n styles['transform'] = transformForCss({\n transform: transform,\n startCentered: true,\n width: width,\n height: height\n });\n styles['-webkit-transform'] = styles['transform'];\n }\n\n var styleString = joinStyles(styles);\n\n if (styleString.length > 0) {\n attributes['style'] = styleString;\n }\n\n var val = [];\n val.push({\n tag: 'span',\n attributes: attributes,\n children: [content]\n });\n\n if (title) {\n val.push({\n tag: 'span',\n attributes: {\n class: 'sr-only'\n },\n children: [title]\n });\n }\n\n return val;\n}\nfunction makeLayersCounterAbstract(params) {\n var content = params.content,\n title = params.title,\n extra = params.extra;\n\n var attributes = _objectSpread({}, extra.attributes, title ? {\n 'title': title\n } : {}, {\n 'class': extra.classes.join(' ')\n });\n\n var styleString = joinStyles(extra.styles);\n\n if (styleString.length > 0) {\n attributes['style'] = styleString;\n }\n\n var val = [];\n val.push({\n tag: 'span',\n attributes: attributes,\n children: [content]\n });\n\n if (title) {\n val.push({\n tag: 'span',\n attributes: {\n class: 'sr-only'\n },\n children: [title]\n });\n }\n\n return val;\n}\n\nvar noop$1 = function noop() {};\n\nvar p = config.measurePerformance && PERFORMANCE && PERFORMANCE.mark && PERFORMANCE.measure ? PERFORMANCE : {\n mark: noop$1,\n measure: noop$1\n};\nvar preamble = \"FA \\\"5.7.2\\\"\";\n\nvar begin = function begin(name) {\n p.mark(\"\".concat(preamble, \" \").concat(name, \" begins\"));\n return function () {\n return end(name);\n };\n};\n\nvar end = function end(name) {\n p.mark(\"\".concat(preamble, \" \").concat(name, \" ends\"));\n p.measure(\"\".concat(preamble, \" \").concat(name), \"\".concat(preamble, \" \").concat(name, \" begins\"), \"\".concat(preamble, \" \").concat(name, \" ends\"));\n};\n\nvar perf = {\n begin: begin,\n end: end\n};\n\n/**\n * Internal helper to bind a function known to have 4 arguments\n * to a given context.\n */\n\nvar bindInternal4 = function bindInternal4(func, thisContext) {\n return function (a, b, c, d) {\n return func.call(thisContext, a, b, c, d);\n };\n};\n\n/**\n * # Reduce\n *\n * A fast object ` + ("`" + `.reduce()`)) + ("`" + (` implementation.\n *\n * @param {Object} subject The object to reduce over.\n * @param {Function} fn The reducer function.\n * @param {mixed} initialValue The initial value for the reducer, defaults to subject[0].\n * @param {Object} thisContext The context for the reducer.\n * @return {mixed} The final result.\n */\n\n\nvar reduce = function fastReduceObject(subject, fn, initialValue, thisContext) {\n var keys = Object.keys(subject),\n length = keys.length,\n iterator = thisContext !== undefined ? bindInternal4(fn, thisContext) : fn,\n i,\n key,\n result;\n\n if (initialValue === undefined) {\n i = 1;\n result = subject[keys[0]];\n } else {\n i = 0;\n result = initialValue;\n }\n\n for (; i < length; i++) {\n key = keys[i];\n result = iterator(result, subject[key], key, subject);\n }\n\n return result;\n};\n\nfunction defineIcons(prefix, icons) {\n var params = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n var _params$skipHooks = params.skipHooks,\n skipHooks = _params$skipHooks === void 0 ? false : _params$skipHooks;\n var normalized = Object.keys(icons).reduce(function (acc, iconName) {\n var icon = icons[iconName];\n var expanded = !!icon.icon;\n\n if (expanded) {\n acc[icon.iconName] = icon.icon;\n } else {\n acc[iconName] = icon;\n }\n\n return acc;\n }, {});\n\n if (typeof namespace.hooks.addPack === 'function' && !skipHooks) {\n namespace.hooks.addPack(prefix, normalized);\n } else {\n namespace.styles[prefix] = _objectSpread({}, namespace.styles[prefix] || {}, normalized);\n }\n /**\n * Font Awesome 4 used the prefix of ` + "`"))))) + ((((`fa` + "`") + (` for all icons. With the introduction\n * of new styles we needed to differentiate between them. Prefix ` + ("`" + `fa`))) + (("`" + (` is now an alias\n * for ` + "`")) + (`fas` + ("`" + ` so we'll easy the upgrade process for our users by automatically defining\n * this as well.\n */\n\n\n if (prefix === 'fas') {\n defineIcons('fa', icons);\n }\n}\n\nvar styles = namespace.styles,\n shims = namespace.shims;\nvar _byUnicode = {};\nvar _byLigature = {};\nvar _byOldName = {};\nvar build = function build() {\n var lookup = function lookup(reducer) {\n return reduce(styles, function (o, style, prefix) {\n o[prefix] = reduce(style, reducer, {});\n return o;\n }, {});\n };\n\n _byUnicode = lookup(function (acc, icon, iconName) {\n if (icon[3]) {\n acc[icon[3]] = iconName;\n }\n\n return acc;\n });\n _byLigature = lookup(function (acc, icon, iconName) {\n var ligatures = icon[2];\n acc[iconName] = iconName;\n ligatures.forEach(function (ligature) {\n acc[ligature] = iconName;\n });\n return acc;\n });\n var hasRegular = 'far' in styles;\n _byOldName = reduce(shims, function (acc, shim) {\n var oldName = shim[0];\n var prefix = shim[1];\n var iconName = shim[2];\n\n if (prefix === 'far' && !hasRegular) {\n prefix = 'fas';\n }\n\n acc[oldName] = {\n prefix: prefix,\n iconName: iconName\n };\n return acc;\n }, {});\n};\nbuild();\nfunction byUnicode(prefix, unicode) {\n return _byUnicode[prefix][unicode];\n}\nfunction byLigature(prefix, ligature) {\n return _byLigature[prefix][ligature];\n}\nfunction byOldName(name) {\n return _byOldName[name] || {\n prefix: null,\n iconName: null\n };\n}\n\nvar styles$1 = namespace.styles;\nvar emptyCanonicalIcon = function emptyCanonicalIcon() {\n return {\n prefix: null,\n iconName: null,\n rest: []\n };\n};\nfunction getCanonicalIcon(values) {\n return values.reduce(function (acc, cls) {\n var iconName = getIconName(config.familyPrefix, cls);\n\n if (styles$1[cls]) {\n acc.prefix = cls;\n } else if (config.autoFetchSvg && ['fas', 'far', 'fal', 'fab', 'fa'].indexOf(cls) > -1) {\n acc.prefix = cls;\n } else if (iconName) {\n var shim = acc.prefix === 'fa' ? byOldName(iconName) : {};\n acc.iconName = shim.iconName || iconName;\n acc.prefix = shim.prefix || acc.prefix;\n } else if (cls !== config.replacementClass && cls.indexOf('fa-w-') !== 0) {\n acc.rest.push(cls);\n }\n\n return acc;\n }, emptyCanonicalIcon());\n}\nfunction iconFromMapping(mapping, prefix, iconName) {\n if (mapping && mapping[prefix] && mapping[prefix][iconName]) {\n return {\n prefix: prefix,\n iconName: iconName,\n icon: mapping[prefix][iconName]\n };\n }\n}\n\nfunction toHtml(abstractNodes) {\n var tag = abstractNodes.tag,\n _abstractNodes$attrib = abstractNodes.attributes,\n attributes = _abstractNodes$attrib === void 0 ? {} : _abstractNodes$attrib,\n _abstractNodes$childr = abstractNodes.children,\n children = _abstractNodes$childr === void 0 ? [] : _abstractNodes$childr;\n\n if (typeof abstractNodes === 'string') {\n return htmlEscape(abstractNodes);\n } else {\n return \"<\".concat(tag, \" \").concat(joinAttributes(attributes), \">\").concat(children.map(toHtml).join(''), \"\");\n }\n}\n\nvar noop$2 = function noop() {};\n\nfunction isWatched(node) {\n var i2svg = node.getAttribute ? node.getAttribute(DATA_FA_I2SVG) : null;\n return typeof i2svg === 'string';\n}\n\nfunction getMutator() {\n if (config.autoReplaceSvg === true) {\n return mutators.replace;\n }\n\n var mutator = mutators[config.autoReplaceSvg];\n return mutator || mutators.replace;\n}\n\nvar mutators = {\n replace: function replace(mutation) {\n var node = mutation[0];\n var abstract = mutation[1];\n var newOuterHTML = abstract.map(function (a) {\n return toHtml(a);\n }).join('\\n');\n\n if (node.parentNode && node.outerHTML) {\n node.outerHTML = newOuterHTML + (config.keepOriginalSource && node.tagName.toLowerCase() !== 'svg' ? \"\") : '');\n } else if (node.parentNode) {\n var newNode = document.createElement('span');\n node.parentNode.replaceChild(newNode, node);\n newNode.outerHTML = newOuterHTML;\n }\n },\n nest: function nest(mutation) {\n var node = mutation[0];\n var abstract = mutation[1]; // If we already have a replaced node we do not want to continue nesting within it.\n // Short-circuit to the standard replacement\n\n if (~classArray(node).indexOf(config.replacementClass)) {\n return mutators.replace(mutation);\n }\n\n var forSvg = new RegExp(\"\".concat(config.familyPrefix, \"-.*\"));\n delete abstract[0].attributes.style;\n var splitClasses = abstract[0].attributes.class.split(' ').reduce(function (acc, cls) {\n if (cls === config.replacementClass || cls.match(forSvg)) {\n acc.toSvg.push(cls);\n } else {\n acc.toNode.push(cls);\n }\n\n return acc;\n }, {\n toNode: [],\n toSvg: []\n });\n abstract[0].attributes.class = splitClasses.toSvg.join(' ');\n var newInnerHTML = abstract.map(function (a) {\n return toHtml(a);\n }).join('\\n');\n node.setAttribute('class', splitClasses.toNode.join(' '));\n node.setAttribute(DATA_FA_I2SVG, '');\n node.innerHTML = newInnerHTML;\n }\n};\nfunction perform(mutations, callback) {\n var callbackFunction = typeof callback === 'function' ? callback : noop$2;\n\n if (mutations.length === 0) {\n callbackFunction();\n } else {\n var frame = WINDOW.requestAnimationFrame || function (op) {\n return op();\n };\n\n frame(function () {\n var mutator = getMutator();\n var mark = perf.begin('mutate');\n mutations.map(mutator);\n mark();\n callbackFunction();\n });\n }\n}\nvar disabled = false;\nfunction disableObservation() {\n disabled = true;\n}\nfunction enableObservation() {\n disabled = false;\n}\nvar mo = null;\nfunction observe(options) {\n if (!MUTATION_OBSERVER) {\n return;\n }\n\n if (!config.observeMutations) {\n return;\n }\n\n var treeCallback = options.treeCallback,\n nodeCallback = options.nodeCallback,\n pseudoElementsCallback = options.pseudoElementsCallback,\n _options$observeMutat = options.observeMutationsRoot,\n observeMutationsRoot = _options$observeMutat === void 0 ? DOCUMENT : _options$observeMutat;\n mo = new MUTATION_OBSERVER(function (objects) {\n if (disabled) return;\n toArray(objects).forEach(function (mutationRecord) {\n if (mutationRecord.type === 'childList' && mutationRecord.addedNodes.length > 0 && !isWatched(mutationRecord.addedNodes[0])) {\n if (config.searchPseudoElements) {\n pseudoElementsCallback(mutationRecord.target);\n }\n\n treeCallback(mutationRecord.target);\n }\n\n if (mutationRecord.type === 'attributes' && mutationRecord.target.parentNode && config.searchPseudoElements) {\n pseudoElementsCallback(mutationRecord.target.parentNode);\n }\n\n if (mutationRecord.type === 'attributes' && isWatched(mutationRecord.target) && ~ATTRIBUTES_WATCHED_FOR_MUTATION.indexOf(mutationRecord.attributeName)) {\n if (mutationRecord.attributeName === 'class') {\n var _getCanonicalIcon = getCanonicalIcon(classArray(mutationRecord.target)),\n prefix = _getCanonicalIcon.prefix,\n iconName = _getCanonicalIcon.iconName;\n\n if (prefix) mutationRecord.target.setAttribute('data-prefix', prefix);\n if (iconName) mutationRecord.target.setAttribute('data-icon', iconName);\n } else {\n nodeCallback(mutationRecord.target);\n }\n }\n });\n });\n if (!IS_DOM) return;\n mo.observe(observeMutationsRoot, {\n childList: true,\n attributes: true,\n characterData: true,\n subtree: true\n });\n}\nfunction disconnect() {\n if (!mo) return;\n mo.disconnect();\n}\n\nfunction styleParser (node) {\n var style = node.getAttribute('style');\n var val = [];\n\n if (style) {\n val = style.split(';').reduce(function (acc, style) {\n var styles = style.split(':');\n var prop = styles[0];\n var value = styles.slice(1);\n\n if (prop && value.length > 0) {\n acc[prop] = value.join(':').trim();\n }\n\n return acc;\n }, {});\n }\n\n return val;\n}\n\nfunction toHex(unicode) {\n var result = '';\n\n for (var i = 0; i < unicode.length; i++) {\n var hex = unicode.charCodeAt(i).toString(16);\n result += ('000' + hex).slice(-4);\n }\n\n return result;\n}\n\nfunction classParser (node) {\n var existingPrefix = node.getAttribute('data-prefix');\n var existingIconName = node.getAttribute('data-icon');\n var innerText = node.innerText !== undefined ? node.innerText.trim() : '';\n var val = getCanonicalIcon(classArray(node));\n\n if (existingPrefix && existingIconName) {\n val.prefix = existingPrefix;\n val.iconName = existingIconName;\n }\n\n if (val.prefix && innerText.length > 1) {\n val.iconName = byLigature(val.prefix, node.innerText);\n } else if (val.prefix && innerText.length === 1) {\n val.iconName = byUnicode(val.prefix, toHex(node.innerText));\n }\n\n return val;\n}\n\nvar parseTransformString = function parseTransformString(transformString) {\n var transform = {\n size: 16,\n x: 0,\n y: 0,\n flipX: false,\n flipY: false,\n rotate: 0\n };\n\n if (!transformString) {\n return transform;\n } else {\n return transformString.toLowerCase().split(' ').reduce(function (acc, n) {\n var parts = n.toLowerCase().split('-');\n var first = parts[0];\n var rest = parts.slice(1).join('-');\n\n if (first && rest === 'h') {\n acc.flipX = true;\n return acc;\n }\n\n if (first && rest === 'v') {\n acc.flipY = true;\n return acc;\n }\n\n rest = parseFloat(rest);\n\n if (isNaN(rest)) {\n return acc;\n }\n\n switch (first) {\n case 'grow':\n acc.size = acc.size + rest;\n break;\n\n case 'shrink':\n acc.size = acc.size - rest;\n break;\n\n case 'left':\n acc.x = acc.x - rest;\n break;\n\n case 'right':\n acc.x = acc.x + rest;\n break;\n\n case 'up':\n acc.y = acc.y - rest;\n break;\n\n case 'down':\n acc.y = acc.y + rest;\n break;\n\n case 'rotate':\n acc.rotate = acc.rotate + rest;\n break;\n }\n\n return acc;\n }, transform);\n }\n};\nfunction transformParser (node) {\n return parseTransformString(node.getAttribute('data-fa-transform'));\n}\n\nfunction symbolParser (node) {\n var symbol = node.getAttribute('data-fa-symbol');\n return symbol === null ? false : symbol === '' ? true : symbol;\n}\n\nfunction attributesParser (node) {\n var extraAttributes = toArray(node.attributes).reduce(function (acc, attr) {\n if (acc.name !== 'class' && acc.name !== 'style') {\n acc[attr.name] = attr.value;\n }\n\n return acc;\n }, {});\n var title = node.getAttribute('title');\n\n if (config.autoA11y) {\n if (title) {\n extraAttributes['aria-labelledby'] = \"\".concat(config.replacementClass, \"-title-\").concat(nextUniqueId());\n } else {\n extraAttributes['aria-hidden'] = 'true';\n extraAttributes['focusable'] = 'false';\n }\n }\n\n return extraAttributes;\n}\n\nfunction maskParser (node) {\n var mask = node.getAttribute('data-fa-mask');\n\n if (!mask) {\n return emptyCanonicalIcon();\n } else {\n return getCanonicalIcon(mask.split(' ').map(function (i) {\n return i.trim();\n }));\n }\n}\n\nfunction blankMeta() {\n return {\n iconName: null,\n title: null,\n prefix: null,\n transform: meaninglessTransform,\n symbol: false,\n mask: null,\n extra: {\n classes: [],\n styles: {},\n attributes: {}\n }\n };\n}\nfunction parseMeta(node) {\n var _classParser = classParser(node),\n iconName = _classParser.iconName,\n prefix = _classParser.prefix,\n extraClasses = _classParser.rest;\n\n var extraStyles = styleParser(node);\n var transform = transformParser(node);\n var symbol = symbolParser(node);\n var extraAttributes = attributesParser(node);\n var mask = maskParser(node);\n return {\n iconName: iconName,\n title: node.getAttribute('title'),\n prefix: prefix,\n transform: transform,\n symbol: symbol,\n mask: mask,\n extra: {\n classes: extraClasses,\n styles: extraStyles,\n attributes: extraAttributes\n }\n };\n}\n\nfunction MissingIcon(error) {\n this.name = 'MissingIcon';\n this.message = error || 'Icon unavailable';\n this.stack = new Error().stack;\n}\nMissingIcon.prototype = Object.create(Error.prototype);\nMissingIcon.prototype.constructor = MissingIcon;\n\nvar FILL = {\n fill: 'currentColor'\n};\nvar ANIMATION_BASE = {\n attributeType: 'XML',\n repeatCount: 'indefinite',\n dur: '2s'\n};\nvar RING = {\n tag: 'path',\n attributes: _objectSpread({}, FILL, {\n d: 'M156.5,447.7l-12.6,29.5c-18.7-9.5-35.9-21.2-51.5-34.9l22.7-22.7C127.6,430.5,141.5,440,156.5,447.7z M40.6,272H8.5 c1.4,21.2,5.4,41.7,11.7,61.1L50,321.2C45.1,305.5,41.8,289,40.6,272z M40.6,240c1.4-18.8,5.2-37,11.1-54.1l-29.5-12.6 C14.7,194.3,10,216.7,8.5,240H40.6z M64.3,156.5c7.8-14.9,17.2-28.8,28.1-41.5L69.7,92.3c-13.7,15.6-25.5,32.8-34.9,51.5 L64.3,156.5z M397,419.6c-13.9,12-29.4,22.3-46.1,30.4l11.9,29.8c20.7-9.9,39.8-22.6,56.9-37.6L397,419.6z M115,92.4 c13.9-12,29.4-22.3,46.1-30.4l-11.9-29.8c-20.7,9.9-39.8,22.6-56.8,37.6L115,92.4z M447.7,355.5c-7.8,14.9-17.2,28.8-28.1,41.5 l22.7,22.7c13.7-15.6,25.5-32.9,34.9-51.5L447.7,355.5z M471.4,272c-1.4,18.8-5.2,37-11.1,54.1l29.5,12.6 c7.5-21.1,12.2-43.5,13.6-66.8H471.4z M321.2,462c-15.7,5-32.2,8.2-49.2,9.4v32.1c21.2-1.4,41.7-5.4,61.1-11.7L321.2,462z M240,471.4c-18.8-1.4-37-5.2-54.1-11.1l-12.6,29.5c21.1,7.5,43.5,12.2,66.8,13.6V471.4z M462,190.8c5,15.7,8.2,32.2,9.4,49.2h32.1 c-1.4-21.2-5.4-41.7-11.7-61.1L462,190.8z M92.4,397c-12-13.9-22.3-29.4-30.4-46.1l-29.8,11.9c9.9,20.7,22.6,39.8,37.6,56.9 L92.4,397z M272,40.6c18.8,1.4,36.9,5.2,54.1,11.1l12.6-29.5C317.7,14.7,295.3,10,272,8.5V40.6z M190.8,50 c15.7-5,32.2-8.2,49.2-9.4V8.5c-21.2,1.4-41.7,5.4-61.1,11.7L190.8,50z M442.3,92.3L419.6,115c12,13.9,22.3,29.4,30.5,46.1 l29.8-11.9C470,128.5,457.3,109.4,442.3,92.3z M397,92.4l22.7-22.7c-15.6-13.7-32.8-25.5-51.5-34.9l-12.6,29.5 C370.4,72.1,384.4,81.5,397,92.4z'\n })\n};\n\nvar OPACITY_ANIMATE = _objectSpread({}, ANIMATION_BASE, {\n attributeName: 'opacity'\n});\n\nvar DOT = {\n tag: 'circle',\n attributes: _objectSpread({}, FILL, {\n cx: '256',\n cy: '364',\n r: '28'\n }),\n children: [{\n tag: 'animate',\n attributes: _objectSpread({}, ANIMATION_BASE, {\n attributeName: 'r',\n values: '28;14;28;28;14;28;'\n })\n }, {\n tag: 'animate',\n attributes: _objectSpread({}, OPACITY_ANIMATE, {\n values: '1;0;1;1;0;1;'\n })\n }]\n};\nvar QUESTION = {\n tag: 'path',\n attributes: _objectSpread({}, FILL, {\n opacity: '1',\n d: 'M263.7,312h-16c-6.6,0-12-5.4-12-12c0-71,77.4-63.9,77.4-107.8c0-20-17.8-40.2-57.4-40.2c-29.1,0-44.3,9.6-59.2,28.7 c-3.9,5-11.1,6-16.2,2.4l-13.1-9.2c-5.6-3.9-6.9-11.8-2.6-17.2c21.2-27.2,46.4-44.7,91.2-44.7c52.3,0,97.4,29.8,97.4,80.2 c0,67.6-77.4,63.5-77.4,107.8C275.7,306.6,270.3,312,263.7,312z'\n }),\n children: [{\n tag: 'animate',\n attributes: _objectSpread({}, OPACITY_ANIMATE, {\n values: '1;0;0;0;0;1;'\n })\n }]\n};\nvar EXCLAMATION = {\n tag: 'path',\n attributes: _objectSpread({}, FILL, {\n opacity: '0',\n d: 'M232.5,134.5l7,168c0.3,6.4,5.6,11.5,12,11.5h9c6.4,0,11.7-5.1,12-11.5l7-168c0.3-6.8-5.2-12.5-12-12.5h-23 C237.7,122,232.2,127.7,232.5,134.5z'\n }),\n children: [{\n tag: 'animate',\n attributes: _objectSpread({}, OPACITY_ANIMATE, {\n values: '0;0;1;1;0;0;'\n })\n }]\n};\nvar missing = {\n tag: 'g',\n children: [RING, DOT, QUESTION, EXCLAMATION]\n};\n\nvar styles$2 = namespace.styles;\nfunction findIcon(iconName, prefix) {\n return new picked(function (resolve, reject) {\n var val = {\n found: false,\n width: 512,\n height: 512,\n icon: missing\n };\n\n if (iconName && prefix && styles$2[prefix] && styles$2[prefix][iconName]) {\n var icon = styles$2[prefix][iconName];\n var width = icon[0];\n var height = icon[1];\n var vectorData = icon.slice(4);\n val = {\n found: true,\n width: width,\n height: height,\n icon: {\n tag: 'path',\n attributes: {\n fill: 'currentColor',\n d: vectorData[0]\n }\n }\n };\n return resolve(val);\n }\n\n if (iconName && prefix && !config.showMissingIcons) {\n reject(new MissingIcon(\"Icon is missing for prefix \".concat(prefix, \" with icon name \").concat(iconName)));\n } else {\n resolve(val);\n }\n });\n}\n\nvar styles$3 = namespace.styles;\n\nfunction generateSvgReplacementMutation(node, nodeMeta) {\n var iconName = nodeMeta.iconName,\n title = nodeMeta.title,\n prefix = nodeMeta.prefix,\n transform = nodeMeta.transform,\n symbol = nodeMeta.symbol,\n mask = nodeMeta.mask,\n extra = nodeMeta.extra;\n return new picked(function (resolve, reject) {\n picked.all([findIcon(iconName, prefix), findIcon(mask.iconName, mask.prefix)]).then(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n main = _ref2[0],\n mask = _ref2[1];\n\n resolve([node, makeInlineSvgAbstract({\n icons: {\n main: main,\n mask: mask\n },\n prefix: prefix,\n iconName: iconName,\n transform: transform,\n symbol: symbol,\n mask: mask,\n title: title,\n extra: extra,\n watchable: true\n })]);\n });\n });\n}\n\nfunction generateLayersText(node, nodeMeta) {\n var title = nodeMeta.title,\n transform = nodeMeta.transform,\n extra = nodeMeta.extra;\n var width = null;\n var height = null;\n\n if (IS_IE) {\n var computedFontSize = parseInt(getComputedStyle(node).fontSize, 10);\n var boundingClientRect = node.getBoundingClientRect();\n width = boundingClientRect.width / computedFontSize;\n height = boundingClientRect.height / computedFontSize;\n }\n\n if (config.autoA11y && !title) {\n extra.attributes['aria-hidden'] = 'true';\n }\n\n return picked.resolve([node, makeLayersTextAbstract({\n content: node.innerHTML,\n width: width,\n height: height,\n transform: transform,\n title: title,\n extra: extra,\n watchable: true\n })]);\n}\n\nfunction generateMutation(node) {\n var nodeMeta = parseMeta(node);\n\n if (~nodeMeta.extra.classes.indexOf(LAYERS_TEXT_CLASSNAME)) {\n return generateLayersText(node, nodeMeta);\n } else {\n return generateSvgReplacementMutation(node, nodeMeta);\n }\n}\n\nfunction onTree(root) {\n var callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n if (!IS_DOM) return;\n var htmlClassList = DOCUMENT.documentElement.classList;\n\n var hclAdd = function hclAdd(suffix) {\n return htmlClassList.add(\"\".concat(HTML_CLASS_I2SVG_BASE_CLASS, \"-\").concat(suffix));\n };\n\n var hclRemove = function hclRemove(suffix) {\n return htmlClassList.remove(\"\".concat(HTML_CLASS_I2SVG_BASE_CLASS, \"-\").concat(suffix));\n };\n\n var prefixes = config.autoFetchSvg ? Object.keys(PREFIX_TO_STYLE) : Object.keys(styles$3);\n var prefixesDomQuery = [\".\".concat(LAYERS_TEXT_CLASSNAME, \":not([\").concat(DATA_FA_I2SVG, \"])\")].concat(prefixes.map(function (p) {\n return \".\".concat(p, \":not([\").concat(DATA_FA_I2SVG, \"])\");\n })).join(', ');\n\n if (prefixesDomQuery.length === 0) {\n return;\n }\n\n var candidates = toArray(root.querySelectorAll(prefixesDomQuery));\n\n if (candidates.length > 0) {\n hclAdd('pending');\n hclRemove('complete');\n } else {\n return;\n }\n\n var mark = perf.begin('onTree');\n var mutations = candidates.reduce(function (acc, node) {\n try {\n var mutation = generateMutation(node);\n\n if (mutation) {\n acc.push(mutation);\n }\n } catch (e) {\n if (!PRODUCTION) {\n if (e instanceof MissingIcon) {\n console.error(e);\n }\n }\n }\n\n return acc;\n }, []);\n return new picked(function (resolve, reject) {\n picked.all(mutations).then(function (resolvedMutations) {\n perform(resolvedMutations, function () {\n hclAdd('active');\n hclAdd('complete');\n hclRemove('pending');\n if (typeof callback === 'function') callback();\n mark();\n resolve();\n });\n }).catch(function () {\n mark();\n reject();\n });\n });\n}\nfunction onNode(node) {\n var callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n generateMutation(node).then(function (mutation) {\n if (mutation) {\n perform([mutation], callback);\n }\n });\n}\n\nfunction replaceForPosition(node, position) {\n var pendingAttribute = \"\".concat(DATA_FA_PSEUDO_ELEMENT_PENDING).concat(position.replace(':', '-'));\n return new picked(function (resolve, reject) {\n if (node.getAttribute(pendingAttribute) !== null) {\n // This node is already being processed\n return resolve();\n }\n\n var children = toArray(node.children);\n var alreadyProcessedPseudoElement = children.filter(function (c) {\n return c.getAttribute(DATA_FA_PSEUDO_ELEMENT) === position;\n })[0];\n var styles = WINDOW.getComputedStyle(node, position);\n var fontFamily = styles.getPropertyValue('font-family').match(FONT_FAMILY_PATTERN);\n var fontWeight = styles.getPropertyValue('font-weight');\n\n if (alreadyProcessedPseudoElement && !fontFamily) {\n // If we've already processed it but the current computed style does not result in a font-family,\n // that probably means that a class name that was previously present to make the icon has been\n // removed. So we now should delete the icon.\n node.removeChild(alreadyProcessedPseudoElement);\n return resolve();\n } else if (fontFamily) {\n var content = styles.getPropertyValue('content');\n var prefix = ~['Light', 'Regular', 'Solid', 'Brands'].indexOf(fontFamily[1]) ? STYLE_TO_PREFIX[fontFamily[1].toLowerCase()] : FONT_WEIGHT_TO_PREFIX[fontWeight];\n var iconName = byUnicode(prefix, toHex(content.length === 3 ? content.substr(1, 1) : content)); // Only convert the pseudo element in this :before/:after position into an icon if we haven't\n // already done so with the same prefix and iconName\n\n if (!alreadyProcessedPseudoElement || alreadyProcessedPseudoElement.getAttribute(DATA_PREFIX) !== prefix || alreadyProcessedPseudoElement.getAttribute(DATA_ICON) !== iconName) {\n node.setAttribute(pendingAttribute, iconName);\n\n if (alreadyProcessedPseudoElement) {\n // Delete the old one, since we're replacing it with a new one\n node.removeChild(alreadyProcessedPseudoElement);\n }\n\n var meta = blankMeta();\n var extra = meta.extra;\n extra.attributes[DATA_FA_PSEUDO_ELEMENT] = position;\n findIcon(iconName, prefix).then(function (main) {\n var abstract = makeInlineSvgAbstract(_objectSpread({}, meta, {\n icons: {\n main: main,\n mask: emptyCanonicalIcon()\n },\n prefix: prefix,\n iconName: iconName,\n extra: extra,\n watchable: true\n }));\n var element = DOCUMENT.createElement('svg');\n\n if (position === ':before') {\n node.insertBefore(element, node.firstChild);\n } else {\n node.appendChild(element);\n }\n\n element.outerHTML = abstract.map(function (a) {\n return toHtml(a);\n }).join('\\n');\n node.removeAttribute(pendingAttribute);\n resolve();\n }).catch(reject);\n } else {\n resolve();\n }\n } else {\n resolve();\n }\n });\n}\n\nfunction replace(node) {\n return picked.all([replaceForPosition(node, ':before'), replaceForPosition(node, ':after')]);\n}\n\nfunction processable(node) {\n return node.parentNode !== document.head && !~TAGNAMES_TO_SKIP_FOR_PSEUDOELEMENTS.indexOf(node.tagName.toUpperCase()) && !node.getAttribute(DATA_FA_PSEUDO_ELEMENT) && (!node.parentNode || node.parentNode.tagName !== 'svg');\n}\n\nfunction searchPseudoElements (root) {\n if (!IS_DOM) return;\n return new picked(function (resolve, reject) {\n var operations = toArray(root.querySelectorAll('*')).filter(processable).map(replace);\n var end = perf.begin('searchPseudoElements');\n disableObservation();\n picked.all(operations).then(function () {\n end();\n enableObservation();\n resolve();\n }).catch(function () {\n end();\n enableObservation();\n reject();\n });\n });\n}\n\nvar baseStyles = \"svg:not(:root).svg-inline--fa {\\n overflow: visible;\\n}\\n\\n.svg-inline--fa {\\n display: inline-block;\\n font-size: inherit;\\n height: 1em;\\n overflow: visible;\\n vertical-align: -0.125em;\\n}\\n.svg-inline--fa.fa-lg {\\n vertical-align: -0.225em;\\n}\\n.svg-inline--fa.fa-w-1 {\\n width: 0.0625em;\\n}\\n.svg-inline--fa.fa-w-2 {\\n width: 0.125em;\\n}\\n.svg-inline--fa.fa-w-3 {\\n width: 0.1875em;\\n}\\n.svg-inline--fa.fa-w-4 {\\n width: 0.25em;\\n}\\n.svg-inline--fa.fa-w-5 {\\n width: 0.3125em;\\n}\\n.svg-inline--fa.fa-w-6 {\\n width: 0.375em;\\n}\\n.svg-inline--fa.fa-w-7 {\\n width: 0.4375em;\\n}\\n.svg-inline--fa.fa-w-8 {\\n width: 0.5em;\\n}\\n.svg-inline--fa.fa-w-9 {\\n width: 0.5625em;\\n}\\n.svg-inline--fa.fa-w-10 {\\n width: 0.625em;\\n}\\n.svg-inline--fa.fa-w-11 {\\n width: 0.6875em;\\n}\\n.svg-inline--fa.fa-w-12 {\\n width: 0.75em;\\n}\\n.svg-inline--fa.fa-w-13 {\\n width: 0.8125em;\\n}\\n.svg-inline--fa.fa-w-14 {\\n width: 0.875em;\\n}\\n.svg-inline--fa.fa-w-15 {\\n width: 0.9375em;\\n}\\n.svg-inline--fa.fa-w-16 {\\n width: 1em;\\n}\\n.svg-inline--fa.fa-w-17 {\\n width: 1.0625em;\\n}\\n.svg-inline--fa.fa-w-18 {\\n width: 1.125em;\\n}\\n.svg-inline--fa.fa-w-19 {\\n width: 1.1875em;\\n}\\n.svg-inline--fa.fa-w-20 {\\n width: 1.25em;\\n}\\n.svg-inline--fa.fa-pull-left {\\n margin-right: 0.3em;\\n width: auto;\\n}\\n.svg-inline--fa.fa-pull-right {\\n margin-left: 0.3em;\\n width: auto;\\n}\\n.svg-inline--fa.fa-border {\\n height: 1.5em;\\n}\\n.svg-inline--fa.fa-li {\\n width: 2em;\\n}\\n.svg-inline--fa.fa-fw {\\n width: 1.25em;\\n}\\n\\n.fa-layers svg.svg-inline--fa {\\n bottom: 0;\\n left: 0;\\n margin: auto;\\n position: absolute;\\n right: 0;\\n top: 0;\\n}\\n\\n.fa-layers {\\n display: inline-block;\\n height: 1em;\\n position: relative;\\n text-align: center;\\n vertical-align: -0.125em;\\n width: 1em;\\n}\\n.fa-layers svg.svg-inline--fa {\\n -webkit-transform-origin: center center;\\n transform-origin: center center;\\n}\\n\\n.fa-layers-counter, .fa-layers-text {\\n display: inline-block;\\n position: absolute;\\n text-align: center;\\n}\\n\\n.fa-layers-text {\\n left: 50%;\\n top: 50%;\\n -webkit-transform: translate(-50%, -50%);\\n transform: translate(-50%, -50%);\\n -webkit-transform-origin: center center;\\n transform-origin: center center;\\n}\\n\\n.fa-layers-counter {\\n background-color: #ff253a;\\n border-radius: 1em;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n color: #fff;\\n height: 1.5em;\\n line-height: 1;\\n max-width: 5em;\\n min-width: 1.5em;\\n overflow: hidden;\\n padding: 0.25em;\\n right: 0;\\n text-overflow: ellipsis;\\n top: 0;\\n -webkit-transform: scale(0.25);\\n transform: scale(0.25);\\n -webkit-transform-origin: top right;\\n transform-origin: top right;\\n}\\n\\n.fa-layers-bottom-right {\\n bottom: 0;\\n right: 0;\\n top: auto;\\n -webkit-transform: scale(0.25);\\n transform: scale(0.25);\\n -webkit-transform-origin: bottom right;\\n transform-origin: bottom right;\\n}\\n\\n.fa-layers-bottom-left {\\n bottom: 0;\\n left: 0;\\n right: auto;\\n top: auto;\\n -webkit-transform: scale(0.25);\\n transform: scale(0.25);\\n -webkit-transform-origin: bottom left;\\n transform-origin: bottom left;\\n}\\n\\n.fa-layers-top-right {\\n right: 0;\\n top: 0;\\n -webkit-transform: scale(0.25);\\n transform: scale(0.25);\\n -webkit-transform-origin: top right;\\n transform-origin: top right;\\n}\\n\\n.fa-layers-top-left {\\n left: 0;\\n right: auto;\\n top: 0;\\n -webkit-transform: scale(0.25);\\n transform: scale(0.25);\\n -webkit-transform-origin: top left;\\n transform-origin: top left;\\n}\\n\\n.fa-lg {\\n font-size: 1.3333333333em;\\n line-height: 0.75em;\\n vertical-align: -0.0667em;\\n}\\n\\n.fa-xs {\\n font-size: 0.75em;\\n}\\n\\n.fa-sm {\\n font-size: 0.875em;\\n}\\n\\n.fa-1x {\\n font-size: 1em;\\n}\\n\\n.fa-2x {\\n font-size: 2em;\\n}\\n\\n.fa-3x {\\n font-size: 3em;\\n}\\n\\n.fa-4x {\\n font-size: 4em;\\n}\\n\\n.fa-5x {\\n font-size: 5em;\\n}\\n\\n.fa-6x {\\n font-size: 6em;\\n}\\n\\n.fa-7x {\\n font-size: 7em;\\n}\\n\\n.fa-8x {\\n font-size: 8em;\\n}\\n\\n.fa-9x {\\n font-size: 9em;\\n}\\n\\n.fa-10x {\\n font-size: 10em;\\n}\\n\\n.fa-fw {\\n text-align: center;\\n width: 1.25em;\\n}\\n\\n.fa-ul {\\n list-style-type: none;\\n margin-left: 2.5em;\\n padding-left: 0;\\n}\\n.fa-ul > li {\\n position: relative;\\n}\\n\\n.fa-li {\\n left: -2em;\\n position: absolute;\\n text-align: center;\\n width: 2em;\\n line-height: inherit;\\n}\\n\\n.fa-border {\\n border: solid 0.08em #eee;\\n border-radius: 0.1em;\\n padding: 0.2em 0.25em 0.15em;\\n}\\n\\n.fa-pull-left {\\n float: left;\\n}\\n\\n.fa-pull-right {\\n float: right;\\n}\\n\\n.fa.fa-pull-left,\\n.fas.fa-pull-left,\\n.far.fa-pull-left,\\n.fal.fa-pull-left,\\n.fab.fa-pull-left {\\n margin-right: 0.3em;\\n}\\n.fa.fa-pull-right,\\n.fas.fa-pull-right,\\n.far.fa-pull-right,\\n.fal.fa-pull-right,\\n.fab.fa-pull-right {\\n margin-left: 0.3em;\\n}\\n\\n.fa-spin {\\n -webkit-animation: fa-spin 2s infinite linear;\\n animation: fa-spin 2s infinite linear;\\n}\\n\\n.fa-pulse {\\n -webkit-animation: fa-spin 1s infinite steps(8);\\n animation: fa-spin 1s infinite steps(8);\\n}\\n\\n@-webkit-keyframes fa-spin {\\n 0% {\\n -webkit-transform: rotate(0deg);\\n transform: rotate(0deg);\\n }\\n 100% {\\n -webkit-transform: rotate(360deg);\\n transform: rotate(360deg);\\n }\\n}\\n\\n@keyframes fa-spin {\\n 0% {\\n -webkit-transform: rotate(0deg);\\n transform: rotate(0deg);\\n }\\n 100% {\\n -webkit-transform: rotate(360deg);\\n transform: rotate(360deg);\\n }\\n}\\n.fa-rotate-90 {\\n -ms-filter: \\\"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)\\\";\\n -webkit-transform: rotate(90deg);\\n transform: rotate(90deg);\\n}\\n\\n.fa-rotate-180 {\\n -ms-filter: \\\"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)\\\";\\n -webkit-transform: rotate(180deg);\\n transform: rotate(180deg);\\n}\\n\\n.fa-rotate-270 {\\n -ms-filter: \\\"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)\\\";\\n -webkit-transform: rotate(270deg);\\n transform: rotate(270deg);\\n}\\n\\n.fa-flip-horizontal {\\n -ms-filter: \\\"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)\\\";\\n -webkit-transform: scale(-1, 1);\\n transform: scale(-1, 1);\\n}\\n\\n.fa-flip-vertical {\\n -ms-filter: \\\"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)\\\";\\n -webkit-transform: scale(1, -1);\\n transform: scale(1, -1);\\n}\\n\\n.fa-flip-both, .fa-flip-horizontal.fa-flip-vertical {\\n -ms-filter: \\\"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)\\\";\\n -webkit-transform: scale(-1, -1);\\n transform: scale(-1, -1);\\n}\\n\\n:root .fa-rotate-90,\\n:root .fa-rotate-180,\\n:root .fa-rotate-270,\\n:root .fa-flip-horizontal,\\n:root .fa-flip-vertical,\\n:root .fa-flip-both {\\n -webkit-filter: none;\\n filter: none;\\n}\\n\\n.fa-stack {\\n display: inline-block;\\n height: 2em;\\n position: relative;\\n width: 2.5em;\\n}\\n\\n.fa-stack-1x,\\n.fa-stack-2x {\\n bottom: 0;\\n left: 0;\\n margin: auto;\\n position: absolute;\\n right: 0;\\n top: 0;\\n}\\n\\n.svg-inline--fa.fa-stack-1x {\\n height: 1em;\\n width: 1.25em;\\n}\\n.svg-inline--fa.fa-stack-2x {\\n height: 2em;\\n width: 2.5em;\\n}\\n\\n.fa-inverse {\\n color: #fff;\\n}\\n\\n.sr-only {\\n border: 0;\\n clip: rect(0, 0, 0, 0);\\n height: 1px;\\n margin: -1px;\\n overflow: hidden;\\n padding: 0;\\n position: absolute;\\n width: 1px;\\n}\\n\\n.sr-only-focusable:active, .sr-only-focusable:focus {\\n clip: auto;\\n height: auto;\\n margin: 0;\\n overflow: visible;\\n position: static;\\n width: auto;\\n}\";\n\nfunction css () {\n var dfp = DEFAULT_FAMILY_PREFIX;\n var drc = DEFAULT_REPLACEMENT_CLASS;\n var fp = config.familyPrefix;\n var rc = config.replacementClass;\n var s = baseStyles;\n\n if (fp !== dfp || rc !== drc) {\n var dPatt = new RegExp(\"\\\\.\".concat(dfp, \"\\\\-\"), 'g');\n var rPatt = new RegExp(\"\\\\.\".concat(drc), 'g');\n s = s.replace(dPatt, \".\".concat(fp, \"-\")).replace(rPatt, \".\".concat(rc));\n }\n\n return s;\n}\n\nvar Library =\n/*#__PURE__*/\nfunction () {\n function Library() {\n _classCallCheck(this, Library);\n\n this.definitions = {};\n }\n\n _createClass(Library, [{\n key: \"add\",\n value: function add() {\n var _this = this;\n\n for (var _len = arguments.length, definitions = new Array(_len), _key = 0; _key < _len; _key++) {\n definitions[_key] = arguments[_key];\n }\n\n var additions = definitions.reduce(this._pullDefinitions, {});\n Object.keys(additions).forEach(function (key) {\n _this.definitions[key] = _objectSpread({}, _this.definitions[key] || {}, additions[key]);\n defineIcons(key, additions[key]);\n build();\n });\n }\n }, {\n key: \"reset\",\n value: function reset() {\n this.definitions = {};\n }\n }, {\n key: \"_pullDefinitions\",\n value: function _pullDefinitions(additions, definition) {\n var normalized = definition.prefix && definition.iconName && definition.icon ? {\n 0: definition\n } : definition;\n Object.keys(normalized).map(function (key) {\n var _normalized$key = normalized[key],\n prefix = _normalized$key.prefix,\n iconName = _normalized$key.iconName,\n icon = _normalized$key.icon;\n if (!additions[prefix]) additions[prefix] = {};\n additions[prefix][iconName] = icon;\n });\n return additions;\n }\n }]);\n\n return Library;\n}();\n\nfunction prepIcon(icon) {\n var width = icon[0];\n var height = icon[1];\n var vectorData = icon.slice(4);\n return {\n found: true,\n width: width,\n height: height,\n icon: {\n tag: 'path',\n attributes: {\n fill: 'currentColor',\n d: vectorData[0]\n }\n }\n };\n}\n\nfunction ensureCss() {\n if (config.autoAddCss && !_cssInserted) {\n insertCss(css());\n\n _cssInserted = true;\n }\n}\n\nfunction apiObject(val, abstractCreator) {\n Object.defineProperty(val, 'abstract', {\n get: abstractCreator\n });\n Object.defineProperty(val, 'html', {\n get: function get() {\n return val.abstract.map(function (a) {\n return toHtml(a);\n });\n }\n });\n Object.defineProperty(val, 'node', {\n get: function get() {\n if (!IS_DOM) return;\n var container = DOCUMENT.createElement('div');\n container.innerHTML = val.html;\n return container.children;\n }\n });\n return val;\n}\n\nfunction findIconDefinition(iconLookup) {\n var _iconLookup$prefix = iconLookup.prefix,\n prefix = _iconLookup$prefix === void 0 ? 'fa' : _iconLookup$prefix,\n iconName = iconLookup.iconName;\n if (!iconName) return;\n return iconFromMapping(library.definitions, prefix, iconName) || iconFromMapping(namespace.styles, prefix, iconName);\n}\n\nfunction resolveIcons(next) {\n return function (maybeIconDefinition) {\n var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var iconDefinition = (maybeIconDefinition || {}).icon ? maybeIconDefinition : findIconDefinition(maybeIconDefinition || {});\n var mask = params.mask;\n\n if (mask) {\n mask = (mask || {}).icon ? mask : findIconDefinition(mask || {});\n }\n\n return next(iconDefinition, _objectSpread({}, params, {\n mask: mask\n }));\n };\n}\n\nvar library = new Library();\nvar noAuto = function noAuto() {\n config.autoReplaceSvg = false;\n config.observeMutations = false;\n disconnect();\n};\nvar _cssInserted = false;\nvar dom = {\n i2svg: function i2svg() {\n var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n if (IS_DOM) {\n ensureCss();\n var _params$node = params.node,\n node = _params$node === void 0 ? DOCUMENT : _params$node,\n _params$callback = params.callback,\n callback = _params$callback === void 0 ? function () {} : _params$callback;\n\n if (config.searchPseudoElements) {\n searchPseudoElements(node);\n }\n\n return onTree(node, callback);\n } else {\n return picked.reject('Operation requires a DOM of some kind.');\n }\n },\n css: css,\n insertCss: function insertCss$$1() {\n if (!_cssInserted) {\n insertCss(css());\n\n _cssInserted = true;\n }\n },\n watch: function watch() {\n var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var autoReplaceSvgRoot = params.autoReplaceSvgRoot,\n observeMutationsRoot = params.observeMutationsRoot;\n\n if (config.autoReplaceSvg === false) {\n config.autoReplaceSvg = true;\n }\n\n config.observeMutations = true;\n domready(function () {\n autoReplace({\n autoReplaceSvgRoot: autoReplaceSvgRoot\n });\n observe({\n treeCallback: onTree,\n nodeCallback: onNode,\n pseudoElementsCallback: searchPseudoElements,\n observeMutationsRoot: observeMutationsRoot\n });\n });\n }\n};\nvar parse = {\n transform: function transform(transformString) {\n return parseTransformString(transformString);\n }\n};\nvar icon = resolveIcons(function (iconDefinition) {\n var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var _params$transform = params.transform,\n transform = _params$transform === void 0 ? meaninglessTransform : _params$transform,\n _params$symbol = params.symbol,\n symbol = _params$symbol === void 0 ? false : _params$symbol,\n _params$mask = params.mask,\n mask = _params$mask === void 0 ? null : _params$mask,\n _params$title = params.title,\n title = _params$title === void 0 ? null : _params$title,\n _params$classes = params.classes,\n classes = _params$classes === void 0 ? [] : _params$classes,\n _params$attributes = params.attributes,\n attributes = _params$attributes === void 0 ? {} : _params$attributes,\n _params$styles = params.styles,\n styles = _params$styles === void 0 ? {} : _params$styles;\n if (!iconDefinition) return;\n var prefix = iconDefinition.prefix,\n iconName = iconDefinition.iconName,\n icon = iconDefinition.icon;\n return apiObject(_objectSpread({\n type: 'icon'\n }, iconDefinition), function () {\n ensureCss();\n\n if (config.autoA11y) {\n if (title) {\n attributes['aria-labelledby'] = \"\".concat(config.replacementClass, \"-title-\").concat(nextUniqueId());\n } else {\n attributes['aria-hidden'] = 'true';\n attributes['focusable'] = 'false';\n }\n }\n\n return makeInlineSvgAbstract({\n icons: {\n main: prepIcon(icon),\n mask: mask ? prepIcon(mask.icon) : {\n found: false,\n width: null,\n height: null,\n icon: {}\n }\n },\n prefix: prefix,\n iconName: iconName,\n transform: _objectSpread({}, meaninglessTransform, transform),\n symbol: symbol,\n title: title,\n extra: {\n attributes: attributes,\n styles: styles,\n classes: classes\n }\n });\n });\n});\nvar text = function text(content) {\n var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var _params$transform2 = params.transform,\n transform = _params$transform2 === void 0 ? meaninglessTransform : _params$transform2,\n _params$title2 = params.title,\n title = _params$title2 === void 0 ? null : _params$title2,\n _params$classes2 = params.classes,\n classes = _params$classes2 === void 0 ? [] : _params$classes2,\n _params$attributes2 = params.attributes,\n attributes = _params$attributes2 === void 0 ? {} : _params$attributes2,\n _params$styles2 = params.styles,\n styles = _params$styles2 === void 0 ? {} : _params$styles2;\n return apiObject({\n type: 'text',\n content: content\n }, function () {\n ensureCss();\n return makeLayersTextAbstract({\n content: content,\n transform: _objectSpread({}, meaninglessTransform, transform),\n title: title,\n extra: {\n attributes: attributes,\n styles: styles,\n classes: [\"\".concat(config.familyPrefix, \"-layers-text\")].concat(_toConsumableArray(classes))\n }\n });\n });\n};\nvar counter = function counter(content) {\n var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var _params$title3 = params.title,\n title = _params$title3 === void 0 ? null : _params$title3,\n _params$classes3 = params.classes,\n classes = _params$classes3 === void 0 ? [] : _params$classes3,\n _params$attributes3 = params.attributes,\n attributes = _params$attributes3 === void 0 ? {} : _params$attributes3,\n _params$styles3 = params.styles,\n styles = _params$styles3 === void 0 ? {} : _params$styles3;\n return apiObject({\n type: 'counter',\n content: content\n }, function () {\n ensureCss();\n return makeLayersCounterAbstract({\n content: content.toString(),\n title: title,\n extra: {\n attributes: attributes,\n styles: styles,\n classes: [\"\".concat(config.familyPrefix, \"-layers-counter\")].concat(_toConsumableArray(classes))\n }\n });\n });\n};\nvar layer = function layer(assembler) {\n return apiObject({\n type: 'layer'\n }, function () {\n ensureCss();\n var children = [];\n assembler(function (args) {\n Array.isArray(args) ? args.map(function (a) {\n children = children.concat(a.abstract);\n }) : children = children.concat(args.abstract);\n });\n return [{\n tag: 'span',\n attributes: {\n class: \"\".concat(config.familyPrefix, \"-layers\")\n },\n children: children\n }];\n });\n};\nvar api = {\n noAuto: noAuto,\n config: config,\n dom: dom,\n library: library,\n parse: parse,\n findIconDefinition: findIconDefinition,\n icon: icon,\n text: text,\n counter: counter,\n layer: layer,\n toHtml: toHtml\n};\n\nvar autoReplace = function autoReplace() {\n var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var _params$autoReplaceSv = params.autoReplaceSvgRoot,\n autoReplaceSvgRoot = _params$autoReplaceSv === void 0 ? DOCUMENT : _params$autoReplaceSv;\n if ((Object.keys(namespace.styles).length > 0 || config.autoFetchSvg) && IS_DOM && config.autoReplaceSvg) api.dom.i2svg({\n node: autoReplaceSvgRoot\n });\n};\n\nexport { icon, noAuto, config, toHtml, layer, text, counter, library, dom, parse, findIconDefinition };\n", + "function _typeof(obj) {\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n _typeof = function (obj) {\n return typeof obj;\n };\n } else {\n _typeof = function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n }\n\n return _typeof(obj);\n}\n\nfunction _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\n\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\n\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}\n\nfunction _objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n var ownKeys = Object.keys(source);\n\n if (typeof Object.getOwnPropertySymbols === 'function') {\n ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) {\n return Object.getOwnPropertyDescriptor(source, sym).enumerable;\n }));\n }\n\n ownKeys.forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n }\n\n return target;\n}\n\nfunction _slicedToArray(arr, i) {\n return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest();\n}\n\nfunction _toConsumableArray(arr) {\n return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread();\n}\n\nfunction _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) {\n for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];\n\n return arr2;\n }\n}\n\nfunction _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n}\n\nfunction _iterableToArray(iter) {\n if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === \"[object Arguments]\") return Array.from(iter);\n}\n\nfunction _iterableToArrayLimit(arr, i) {\n var _arr = [];\n var _n = true;\n var _d = false;\n var _e = undefined;\n\n try {\n for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);\n\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally {\n try {\n if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n } finally {\n if (_d) throw _e;\n }\n }\n\n return _arr;\n}\n\nfunction _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance\");\n}\n\nfunction _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance\");\n}\n\nvar noop = function noop() {};\n\nvar _WINDOW = {};\nvar _DOCUMENT = {};\nvar _MUTATION_OBSERVER = null;\nvar _PERFORMANCE = {\n mark: noop,\n measure: noop\n};\n\ntry {\n if (typeof window !== 'undefined') _WINDOW = window;\n if (typeof document !== 'undefined') _DOCUMENT = document;\n if (typeof MutationObserver !== 'undefined') _MUTATION_OBSERVER = MutationObserver;\n if (typeof performance !== 'undefined') _PERFORMANCE = performance;\n} catch (e) {}\n\nvar _ref = _WINDOW.navigator || {},\n _ref$userAgent = _ref.userAgent,\n userAgent = _ref$userAgent === void 0 ? '' : _ref$userAgent;\n\nvar WINDOW = _WINDOW;\nvar DOCUMENT = _DOCUMENT;\nvar MUTATION_OBSERVER = _MUTATION_OBSERVER;\nvar PERFORMANCE = _PERFORMANCE;\nvar IS_BROWSER = !!WINDOW.document;\nvar IS_DOM = !!DOCUMENT.documentElement && !!DOCUMENT.head && typeof DOCUMENT.addEventListener === 'function' && typeof DOCUMENT.createElement === 'function';\nvar IS_IE = ~userAgent.indexOf('MSIE') || ~userAgent.indexOf('Trident/');\n\nvar NAMESPACE_IDENTIFIER = '___FONT_AWESOME___';\nvar UNITS_IN_GRID = 16;\nvar DEFAULT_FAMILY_PREFIX = 'fa';\nvar DEFAULT_REPLACEMENT_CLASS = 'svg-inline--fa';\nvar DATA_FA_I2SVG = 'data-fa-i2svg';\nvar DATA_FA_PSEUDO_ELEMENT = 'data-fa-pseudo-element';\nvar DATA_FA_PSEUDO_ELEMENT_PENDING = 'data-fa-pseudo-element-pending';\nvar DATA_PREFIX = 'data-prefix';\nvar DATA_ICON = 'data-icon';\nvar HTML_CLASS_I2SVG_BASE_CLASS = 'fontawesome-i2svg';\nvar MUTATION_APPROACH_ASYNC = 'async';\nvar TAGNAMES_TO_SKIP_FOR_PSEUDOELEMENTS = ['HTML', 'HEAD', 'STYLE', 'SCRIPT'];\nvar PRODUCTION = function () {\n try {\n return process.env.NODE_ENV === 'production';\n } catch (e) {\n return false;\n }\n}();\nvar PREFIX_TO_STYLE = {\n 'fas': 'solid',\n 'far': 'regular',\n 'fal': 'light',\n 'fab': 'brands',\n 'fa': 'solid'\n};\nvar STYLE_TO_PREFIX = {\n 'solid': 'fas',\n 'regular': 'far',\n 'light': 'fal',\n 'brands': 'fab'\n};\nvar LAYERS_TEXT_CLASSNAME = 'fa-layers-text';\nvar FONT_FAMILY_PATTERN = /Font Awesome 5 (Solid|Regular|Light|Brands|Free|Pro)/;\nvar FONT_WEIGHT_TO_PREFIX = {\n '900': 'fas',\n '400': 'far',\n 'normal': 'far',\n '300': 'fal'\n};\nvar oneToTen = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];\nvar oneToTwenty = oneToTen.concat([11, 12, 13, 14, 15, 16, 17, 18, 19, 20]);\nvar ATTRIBUTES_WATCHED_FOR_MUTATION = ['class', 'data-prefix', 'data-icon', 'data-fa-transform', 'data-fa-mask'];\nvar RESERVED_CLASSES = ['xs', 'sm', 'lg', 'fw', 'ul', 'li', 'border', 'pull-left', 'pull-right', 'spin', 'pulse', 'rotate-90', 'rotate-180', 'rotate-270', 'flip-horizontal', 'flip-vertical', 'flip-both', 'stack', 'stack-1x', 'stack-2x', 'inverse', 'layers', 'layers-text', 'layers-counter'].concat(oneToTen.map(function (n) {\n return \"\".concat(n, \"x\");\n})).concat(oneToTwenty.map(function (n) {\n return \"w-\".concat(n);\n}));\n\nvar initial = WINDOW.FontAwesomeConfig || {};\n\nfunction getAttrConfig(attr) {\n var element = DOCUMENT.querySelector('script[' + attr + ']');\n\n if (element) {\n return element.getAttribute(attr);\n }\n}\n\nfunction coerce(val) {\n // Getting an empty string will occur if the attribute is set on the HTML tag but without a value\n // We'll assume that this is an indication that it should be toggled to true\n // For example \n if (val === '') return true;\n if (val === 'false') return false;\n if (val === 'true') return true;\n return val;\n}\n\nif (DOCUMENT && typeof DOCUMENT.querySelector === 'function') {\n var attrs = [['data-family-prefix', 'familyPrefix'], ['data-replacement-class', 'replacementClass'], ['data-auto-replace-svg', 'autoReplaceSvg'], ['data-auto-add-css', 'autoAddCss'], ['data-auto-a11y', 'autoA11y'], ['data-search-pseudo-elements', 'searchPseudoElements'], ['data-observe-mutations', 'observeMutations'], ['data-mutate-approach', 'mutateApproach'], ['data-keep-original-source', 'keepOriginalSource'], ['data-measure-performance', 'measurePerformance'], ['data-show-missing-icons', 'showMissingIcons']];\n attrs.forEach(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n attr = _ref2[0],\n key = _ref2[1];\n\n var val = coerce(getAttrConfig(attr));\n\n if (val !== undefined && val !== null) {\n initial[key] = val;\n }\n });\n}\n\nvar _default = {\n familyPrefix: DEFAULT_FAMILY_PREFIX,\n replacementClass: DEFAULT_REPLACEMENT_CLASS,\n autoReplaceSvg: true,\n autoAddCss: true,\n autoA11y: true,\n searchPseudoElements: false,\n observeMutations: true,\n mutateApproach: 'async',\n keepOriginalSource: true,\n measurePerformance: false,\n showMissingIcons: true\n};\n\nvar _config = _objectSpread({}, _default, initial);\n\nif (!_config.autoReplaceSvg) _config.observeMutations = false;\n\nvar config = _objectSpread({}, _config);\n\nWINDOW.FontAwesomeConfig = config;\n\nvar w = WINDOW || {};\nif (!w[NAMESPACE_IDENTIFIER]) w[NAMESPACE_IDENTIFIER] = {};\nif (!w[NAMESPACE_IDENTIFIER].styles) w[NAMESPACE_IDENTIFIER].styles = {};\nif (!w[NAMESPACE_IDENTIFIER].hooks) w[NAMESPACE_IDENTIFIER].hooks = {};\nif (!w[NAMESPACE_IDENTIFIER].shims) w[NAMESPACE_IDENTIFIER].shims = [];\nvar namespace = w[NAMESPACE_IDENTIFIER];\n\nvar functions = [];\n\nvar listener = function listener() {\n DOCUMENT.removeEventListener('DOMContentLoaded', listener);\n loaded = 1;\n functions.map(function (fn) {\n return fn();\n });\n};\n\nvar loaded = false;\n\nif (IS_DOM) {\n loaded = (DOCUMENT.documentElement.doScroll ? /^loaded|^c/ : /^loaded|^i|^c/).test(DOCUMENT.readyState);\n if (!loaded) DOCUMENT.addEventListener('DOMContentLoaded', listener);\n}\n\nfunction domready (fn) {\n if (!IS_DOM) return;\n loaded ? setTimeout(fn, 0) : functions.push(fn);\n}\n\nvar PENDING = 'pending';\nvar SETTLED = 'settled';\nvar FULFILLED = 'fulfilled';\nvar REJECTED = 'rejected';\n\nvar NOOP = function NOOP() {};\n\nvar isNode = typeof global !== 'undefined' && typeof global.process !== 'undefined' && typeof global.process.emit === 'function';\nvar asyncSetTimer = typeof setImmediate === 'undefined' ? setTimeout : setImmediate;\nvar asyncQueue = [];\nvar asyncTimer;\n\nfunction asyncFlush() {\n // run promise callbacks\n for (var i = 0; i < asyncQueue.length; i++) {\n asyncQueue[i][0](asyncQueue[i][1]);\n } // reset async asyncQueue\n\n\n asyncQueue = [];\n asyncTimer = false;\n}\n\nfunction asyncCall(callback, arg) {\n asyncQueue.push([callback, arg]);\n\n if (!asyncTimer) {\n asyncTimer = true;\n asyncSetTimer(asyncFlush, 0);\n }\n}\n\nfunction invokeResolver(resolver, promise) {\n function resolvePromise(value) {\n resolve(promise, value);\n }\n\n function rejectPromise(reason) {\n reject(promise, reason);\n }\n\n try {\n resolver(resolvePromise, rejectPromise);\n } catch (e) {\n rejectPromise(e);\n }\n}\n\nfunction invokeCallback(subscriber) {\n var owner = subscriber.owner;\n var settled = owner._state;\n var value = owner._data;\n var callback = subscriber[settled];\n var promise = subscriber.then;\n\n if (typeof callback === 'function') {\n settled = FULFILLED;\n\n try {\n value = callback(value);\n } catch (e) {\n reject(promise, e);\n }\n }\n\n if (!handleThenable(promise, value)) {\n if (settled === FULFILLED) {\n resolve(promise, value);\n }\n\n if (settled === REJECTED) {\n reject(promise, value);\n }\n }\n}\n\nfunction handleThenable(promise, value) {\n var resolved;\n\n try {\n if (promise === value) {\n throw new TypeError('A promises callback cannot return that same promise.');\n }\n\n if (value && (typeof value === 'function' || _typeof(value) === 'object')) {\n // then should be retrieved only once\n var then = value.then;\n\n if (typeof then === 'function') {\n then.call(value, function (val) {\n if (!resolved) {\n resolved = true;\n\n if (value === val) {\n fulfill(promise, val);\n } else {\n resolve(promise, val);\n }\n }\n }, function (reason) {\n if (!resolved) {\n resolved = true;\n reject(promise, reason);\n }\n });\n return true;\n }\n }\n } catch (e) {\n if (!resolved) {\n reject(promise, e);\n }\n\n return true;\n }\n\n return false;\n}\n\nfunction resolve(promise, value) {\n if (promise === value || !handleThenable(promise, value)) {\n fulfill(promise, value);\n }\n}\n\nfunction fulfill(promise, value) {\n if (promise._state === PENDING) {\n promise._state = SETTLED;\n promise._data = value;\n asyncCall(publishFulfillment, promise);\n }\n}\n\nfunction reject(promise, reason) {\n if (promise._state === PENDING) {\n promise._state = SETTLED;\n promise._data = reason;\n asyncCall(publishRejection, promise);\n }\n}\n\nfunction publish(promise) {\n promise._then = promise._then.forEach(invokeCallback);\n}\n\nfunction publishFulfillment(promise) {\n promise._state = FULFILLED;\n publish(promise);\n}\n\nfunction publishRejection(promise) {\n promise._state = REJECTED;\n publish(promise);\n\n if (!promise._handled && isNode) {\n global.process.emit('unhandledRejection', promise._data, promise);\n }\n}\n\nfunction notifyRejectionHandled(promise) {\n global.process.emit('rejectionHandled', promise);\n}\n/**\n * @class\n */\n\n\nfunction P(resolver) {\n if (typeof resolver !== 'function') {\n throw new TypeError('Promise resolver ' + resolver + ' is not a function');\n }\n\n if (this instanceof P === false) {\n throw new TypeError('Failed to construct \\'Promise\\': Please use the \\'new\\' operator, this object constructor cannot be called as a function.');\n }\n\n this._then = [];\n invokeResolver(resolver, this);\n}\n\nP.prototype = {\n constructor: P,\n _state: PENDING,\n _then: null,\n _data: undefined,\n _handled: false,\n then: function then(onFulfillment, onRejection) {\n var subscriber = {\n owner: this,\n then: new this.constructor(NOOP),\n fulfilled: onFulfillment,\n rejected: onRejection\n };\n\n if ((onRejection || onFulfillment) && !this._handled) {\n this._handled = true;\n\n if (this._state === REJECTED && isNode) {\n asyncCall(notifyRejectionHandled, this);\n }\n }\n\n if (this._state === FULFILLED || this._state === REJECTED) {\n // already resolved, call callback async\n asyncCall(invokeCallback, subscriber);\n } else {\n // subscribe\n this._then.push(subscriber);\n }\n\n return subscriber.then;\n },\n catch: function _catch(onRejection) {\n return this.then(null, onRejection);\n }\n};\n\nP.all = function (promises) {\n if (!Array.isArray(promises)) {\n throw new TypeError('You must pass an array to Promise.all().');\n }\n\n return new P(function (resolve, reject) {\n var results = [];\n var remaining = 0;\n\n function resolver(index) {\n remaining++;\n return function (value) {\n results[index] = value;\n\n if (! --remaining) {\n resolve(results);\n }\n };\n }\n\n for (var i = 0, promise; i < promises.length; i++) {\n promise = promises[i];\n\n if (promise && typeof promise.then === 'function') {\n promise.then(resolver(i), reject);\n } else {\n results[i] = promise;\n }\n }\n\n if (!remaining) {\n resolve(results);\n }\n });\n};\n\nP.race = function (promises) {\n if (!Array.isArray(promises)) {\n throw new TypeError('You must pass an array to Promise.race().');\n }\n\n return new P(function (resolve, reject) {\n for (var i = 0, promise; i < promises.length; i++) {\n promise = promises[i];\n\n if (promise && typeof promise.then === 'function') {\n promise.then(resolve, reject);\n } else {\n resolve(promise);\n }\n }\n });\n};\n\nP.resolve = function (value) {\n if (value && _typeof(value) === 'object' && value.constructor === P) {\n return value;\n }\n\n return new P(function (resolve) {\n resolve(value);\n });\n};\n\nP.reject = function (reason) {\n return new P(function (resolve, reject) {\n reject(reason);\n });\n};\n\nvar picked = typeof Promise === 'function' ? Promise : P;\n\nvar d = UNITS_IN_GRID;\nvar meaninglessTransform = {\n size: 16,\n x: 0,\n y: 0,\n rotate: 0,\n flipX: false,\n flipY: false\n};\n\nfunction isReserved(name) {\n return ~RESERVED_CLASSES.indexOf(name);\n}\nfunction insertCss(css) {\n if (!css || !IS_DOM) {\n return;\n }\n\n var style = DOCUMENT.createElement('style');\n style.setAttribute('type', 'text/css');\n style.innerHTML = css;\n var headChildren = DOCUMENT.head.childNodes;\n var beforeChild = null;\n\n for (var i = headChildren.length - 1; i > -1; i--) {\n var child = headChildren[i];\n var tagName = (child.tagName || '').toUpperCase();\n\n if (['STYLE', 'LINK'].indexOf(tagName) > -1) {\n beforeChild = child;\n }\n }\n\n DOCUMENT.head.insertBefore(style, beforeChild);\n return css;\n}\nvar idPool = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';\nfunction nextUniqueId() {\n var size = 12;\n var id = '';\n\n while (size-- > 0) {\n id += idPool[Math.random() * 62 | 0];\n }\n\n return id;\n}\nfunction toArray(obj) {\n var array = [];\n\n for (var i = (obj || []).length >>> 0; i--;) {\n array[i] = obj[i];\n }\n\n return array;\n}\nfunction classArray(node) {\n if (node.classList) {\n return toArray(node.classList);\n } else {\n return (node.getAttribute('class') || '').split(' ').filter(function (i) {\n return i;\n });\n }\n}\nfunction getIconName(familyPrefix, cls) {\n var parts = cls.split('-');\n var prefix = parts[0];\n var iconName = parts.slice(1).join('-');\n\n if (prefix === familyPrefix && iconName !== '' && !isReserved(iconName)) {\n return iconName;\n } else {\n return null;\n }\n}\nfunction htmlEscape(str) {\n return \"\".concat(str).replace(/&/g, '&').replace(/\"/g, '"').replace(/'/g, ''').replace(//g, '>');\n}\nfunction joinAttributes(attributes) {\n return Object.keys(attributes || {}).reduce(function (acc, attributeName) {\n return acc + \"\".concat(attributeName, \"=\\\"\").concat(htmlEscape(attributes[attributeName]), \"\\\" \");\n }, '').trim();\n}\nfunction joinStyles(styles) {\n return Object.keys(styles || {}).reduce(function (acc, styleName) {\n return acc + \"\".concat(styleName, \": \").concat(styles[styleName], \";\");\n }, '');\n}\nfunction transformIsMeaningful(transform) {\n return transform.size !== meaninglessTransform.size || transform.x !== meaninglessTransform.x || transform.y !== meaninglessTransform.y || transform.rotate !== meaninglessTransform.rotate || transform.flipX || transform.flipY;\n}\nfunction transformForSvg(_ref) {\n var transform = _ref.transform,\n containerWidth = _ref.containerWidth,\n iconWidth = _ref.iconWidth;\n var outer = {\n transform: \"translate(\".concat(containerWidth / 2, \" 256)\")\n };\n var innerTranslate = \"translate(\".concat(transform.x * 32, \", \").concat(transform.y * 32, \") \");\n var innerScale = \"scale(\".concat(transform.size / 16 * (transform.flipX ? -1 : 1), \", \").concat(transform.size / 16 * (transform.flipY ? -1 : 1), \") \");\n var innerRotate = \"rotate(\".concat(transform.rotate, \" 0 0)\");\n var inner = {\n transform: \"\".concat(innerTranslate, \" \").concat(innerScale, \" \").concat(innerRotate)\n };\n var path = {\n transform: \"translate(\".concat(iconWidth / 2 * -1, \" -256)\")\n };\n return {\n outer: outer,\n inner: inner,\n path: path\n };\n}\nfunction transformForCss(_ref2) {\n var transform = _ref2.transform,\n _ref2$width = _ref2.width,\n width = _ref2$width === void 0 ? UNITS_IN_GRID : _ref2$width,\n _ref2$height = _ref2.height,\n height = _ref2$height === void 0 ? UNITS_IN_GRID : _ref2$height,\n _ref2$startCentered = _ref2.startCentered,\n startCentered = _ref2$startCentered === void 0 ? false : _ref2$startCentered;\n var val = '';\n\n if (startCentered && IS_IE) {\n val += \"translate(\".concat(transform.x / d - width / 2, \"em, \").concat(transform.y / d - height / 2, \"em) \");\n } else if (startCentered) {\n val += \"translate(calc(-50% + \".concat(transform.x / d, \"em), calc(-50% + \").concat(transform.y / d, \"em)) \");\n } else {\n val += \"translate(\".concat(transform.x / d, \"em, \").concat(transform.y / d, \"em) \");\n }\n\n val += \"scale(\".concat(transform.size / d * (transform.flipX ? -1 : 1), \", \").concat(transform.size / d * (transform.flipY ? -1 : 1), \") \");\n val += \"rotate(\".concat(transform.rotate, \"deg) \");\n return val;\n}\n\nvar ALL_SPACE = {\n x: 0,\n y: 0,\n width: '100%',\n height: '100%'\n};\nfunction makeIconMasking (_ref) {\n var children = _ref.children,\n attributes = _ref.attributes,\n main = _ref.main,\n mask = _ref.mask,\n transform = _ref.transform;\n var mainWidth = main.width,\n mainPath = main.icon;\n var maskWidth = mask.width,\n maskPath = mask.icon;\n var trans = transformForSvg({\n transform: transform,\n containerWidth: maskWidth,\n iconWidth: mainWidth\n });\n var maskRect = {\n tag: 'rect',\n attributes: _objectSpread({}, ALL_SPACE, {\n fill: 'white'\n })\n };\n var maskInnerGroup = {\n tag: 'g',\n attributes: _objectSpread({}, trans.inner),\n children: [{\n tag: 'path',\n attributes: _objectSpread({}, mainPath.attributes, trans.path, {\n fill: 'black'\n })\n }]\n };\n var maskOuterGroup = {\n tag: 'g',\n attributes: _objectSpread({}, trans.outer),\n children: [maskInnerGroup]\n };\n var maskId = \"mask-\".concat(nextUniqueId());\n var clipId = \"clip-\".concat(nextUniqueId());\n var maskTag = {\n tag: 'mask',\n attributes: _objectSpread({}, ALL_SPACE, {\n id: maskId,\n maskUnits: 'userSpaceOnUse',\n maskContentUnits: 'userSpaceOnUse'\n }),\n children: [maskRect, maskOuterGroup]\n };\n var defs = {\n tag: 'defs',\n children: [{\n tag: 'clipPath',\n attributes: {\n id: clipId\n },\n children: [maskPath]\n }, maskTag]\n };\n children.push(defs, {\n tag: 'rect',\n attributes: _objectSpread({\n fill: 'currentColor',\n 'clip-path': \"url(#\".concat(clipId, \")\"),\n mask: \"url(#\".concat(maskId, \")\")\n }, ALL_SPACE)\n });\n return {\n children: children,\n attributes: attributes\n };\n}\n\nfunction makeIconStandard (_ref) {\n var children = _ref.children,\n attributes = _ref.attributes,\n main = _ref.main,\n transform = _ref.transform,\n styles = _ref.styles;\n var styleString = joinStyles(styles);\n\n if (styleString.length > 0) {\n attributes['style'] = styleString;\n }\n\n if (transformIsMeaningful(transform)) {\n var trans = transformForSvg({\n transform: transform,\n containerWidth: main.width,\n iconWidth: main.width\n });\n children.push({\n tag: 'g',\n attributes: _objectSpread({}, trans.outer),\n children: [{\n tag: 'g',\n attributes: _objectSpread({}, trans.inner),\n children: [{\n tag: main.icon.tag,\n children: main.icon.children,\n attributes: _objectSpread({}, main.icon.attributes, trans.path)\n }]\n }]\n });\n } else {\n children.push(main.icon);\n }\n\n return {\n children: children,\n attributes: attributes\n };\n}\n\nfunction asIcon (_ref) {\n var children = _ref.children,\n main = _ref.main,\n mask = _ref.mask,\n attributes = _ref.attributes,\n styles = _ref.styles,\n transform = _ref.transform;\n\n if (transformIsMeaningful(transform) && main.found && !mask.found) {\n var width = main.width,\n height = main.height;\n var offset = {\n x: width / height / 2,\n y: 0.5\n };\n attributes['style'] = joinStyles(_objectSpread({}, styles, {\n 'transform-origin': \"\".concat(offset.x + transform.x / 16, \"em \").concat(offset.y + transform.y / 16, \"em\")\n }));\n }\n\n return [{\n tag: 'svg',\n attributes: attributes,\n children: children\n }];\n}\n\nfunction asSymbol (_ref) {\n var prefix = _ref.prefix,\n iconName = _ref.iconName,\n children = _ref.children,\n attributes = _ref.attributes,\n symbol = _ref.symbol;\n var id = symbol === true ? \"\".concat(prefix, \"-\").concat(config.familyPrefix, \"-\").concat(iconName) : symbol;\n return [{\n tag: 'svg',\n attributes: {\n style: 'display: none;'\n },\n children: [{\n tag: 'symbol',\n attributes: _objectSpread({}, attributes, {\n id: id\n }),\n children: children\n }]\n }];\n}\n\nfunction makeInlineSvgAbstract(params) {\n var _params$icons = params.icons,\n main = _params$icons.main,\n mask = _params$icons.mask,\n prefix = params.prefix,\n iconName = params.iconName,\n transform = params.transform,\n symbol = params.symbol,\n title = params.title,\n extra = params.extra,\n _params$watchable = params.watchable,\n watchable = _params$watchable === void 0 ? false : _params$watchable;\n\n var _ref = mask.found ? mask : main,\n width = _ref.width,\n height = _ref.height;\n\n var widthClass = \"fa-w-\".concat(Math.ceil(width / height * 16));\n var attrClass = [config.replacementClass, iconName ? \"\".concat(config.familyPrefix, \"-\").concat(iconName) : '', widthClass].filter(function (c) {\n return extra.classes.indexOf(c) === -1;\n }).concat(extra.classes).join(' ');\n var content = {\n children: [],\n attributes: _objectSpread({}, extra.attributes, {\n 'data-prefix': prefix,\n 'data-icon': iconName,\n 'class': attrClass,\n 'role': extra.attributes.role || 'img',\n 'xmlns': 'http://www.w3.org/2000/svg',\n 'viewBox': \"0 0 \".concat(width, \" \").concat(height)\n })\n };\n\n if (watchable) {\n content.attributes[DATA_FA_I2SVG] = '';\n }\n\n if (title) content.children.push({\n tag: 'title',\n attributes: {\n id: content.attributes['aria-labelledby'] || \"title-\".concat(nextUniqueId())\n },\n children: [title]\n });\n\n var args = _objectSpread({}, content, {\n prefix: prefix,\n iconName: iconName,\n main: main,\n mask: mask,\n transform: transform,\n symbol: symbol,\n styles: extra.styles\n });\n\n var _ref2 = mask.found && main.found ? makeIconMasking(args) : makeIconStandard(args),\n children = _ref2.children,\n attributes = _ref2.attributes;\n\n args.children = children;\n args.attributes = attributes;\n\n if (symbol) {\n return asSymbol(args);\n } else {\n return asIcon(args);\n }\n}\nfunction makeLayersTextAbstract(params) {\n var content = params.content,\n width = params.width,\n height = params.height,\n transform = params.transform,\n title = params.title,\n extra = params.extra,\n _params$watchable2 = params.watchable,\n watchable = _params$watchable2 === void 0 ? false : _params$watchable2;\n\n var attributes = _objectSpread({}, extra.attributes, title ? {\n 'title': title\n } : {}, {\n 'class': extra.classes.join(' ')\n });\n\n if (watchable) {\n attributes[DATA_FA_I2SVG] = '';\n }\n\n var styles = _objectSpread({}, extra.styles);\n\n if (transformIsMeaningful(transform)) {\n styles['transform'] = transformForCss({\n transform: transform,\n startCentered: true,\n width: width,\n height: height\n });\n styles['-webkit-transform'] = styles['transform'];\n }\n\n var styleString = joinStyles(styles);\n\n if (styleString.length > 0) {\n attributes['style'] = styleString;\n }\n\n var val = [];\n val.push({\n tag: 'span',\n attributes: attributes,\n children: [content]\n });\n\n if (title) {\n val.push({\n tag: 'span',\n attributes: {\n class: 'sr-only'\n },\n children: [title]\n });\n }\n\n return val;\n}\nfunction makeLayersCounterAbstract(params) {\n var content = params.content,\n title = params.title,\n extra = params.extra;\n\n var attributes = _objectSpread({}, extra.attributes, title ? {\n 'title': title\n } : {}, {\n 'class': extra.classes.join(' ')\n });\n\n var styleString = joinStyles(extra.styles);\n\n if (styleString.length > 0) {\n attributes['style'] = styleString;\n }\n\n var val = [];\n val.push({\n tag: 'span',\n attributes: attributes,\n children: [content]\n });\n\n if (title) {\n val.push({\n tag: 'span',\n attributes: {\n class: 'sr-only'\n },\n children: [title]\n });\n }\n\n return val;\n}\n\nvar noop$1 = function noop() {};\n\nvar p = config.measurePerformance && PERFORMANCE && PERFORMANCE.mark && PERFORMANCE.measure ? PERFORMANCE : {\n mark: noop$1,\n measure: noop$1\n};\nvar preamble = \"FA \\\"5.9.0\\\"\";\n\nvar begin = function begin(name) {\n p.mark(\"\".concat(preamble, \" \").concat(name, \" begins\"));\n return function () {\n return end(name);\n };\n};\n\nvar end = function end(name) {\n p.mark(\"\".concat(preamble, \" \").concat(name, \" ends\"));\n p.measure(\"\".concat(preamble, \" \").concat(name), \"\".concat(preamble, \" \").concat(name, \" begins\"), \"\".concat(preamble, \" \").concat(name, \" ends\"));\n};\n\nvar perf = {\n begin: begin,\n end: end\n};\n\n/**\n * Internal helper to bind a function known to have 4 arguments\n * to a given context.\n */\n\nvar bindInternal4 = function bindInternal4(func, thisContext) {\n return function (a, b, c, d) {\n return func.call(thisContext, a, b, c, d);\n };\n};\n\n/**\n * # Reduce\n *\n * A fast object ` + ("`" + `.reduce()`)) + ("`" + (` implementation.\n *\n * @param {Object} subject The object to reduce over.\n * @param {Function} fn The reducer function.\n * @param {mixed} initialValue The initial value for the reducer, defaults to subject[0].\n * @param {Object} thisContext The context for the reducer.\n * @return {mixed} The final result.\n */\n\n\nvar reduce = function fastReduceObject(subject, fn, initialValue, thisContext) {\n var keys = Object.keys(subject),\n length = keys.length,\n iterator = thisContext !== undefined ? bindInternal4(fn, thisContext) : fn,\n i,\n key,\n result;\n\n if (initialValue === undefined) {\n i = 1;\n result = subject[keys[0]];\n } else {\n i = 0;\n result = initialValue;\n }\n\n for (; i < length; i++) {\n key = keys[i];\n result = iterator(result, subject[key], key, subject);\n }\n\n return result;\n};\n\nfunction toHex(unicode) {\n var result = '';\n\n for (var i = 0; i < unicode.length; i++) {\n var hex = unicode.charCodeAt(i).toString(16);\n result += ('000' + hex).slice(-4);\n }\n\n return result;\n}\n\nfunction defineIcons(prefix, icons) {\n var params = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n var _params$skipHooks = params.skipHooks,\n skipHooks = _params$skipHooks === void 0 ? false : _params$skipHooks;\n var normalized = Object.keys(icons).reduce(function (acc, iconName) {\n var icon = icons[iconName];\n var expanded = !!icon.icon;\n\n if (expanded) {\n acc[icon.iconName] = icon.icon;\n } else {\n acc[iconName] = icon;\n }\n\n return acc;\n }, {});\n\n if (typeof namespace.hooks.addPack === 'function' && !skipHooks) {\n namespace.hooks.addPack(prefix, normalized);\n } else {\n namespace.styles[prefix] = _objectSpread({}, namespace.styles[prefix] || {}, normalized);\n }\n /**\n * Font Awesome 4 used the prefix of ` + "`"))) + ((`fa` + ("`" + ` for all icons. With the introduction\n * of new styles we needed to differentiate between them. Prefix `)) + ("`" + (`fa` + "`")))) + (((` is now an alias\n * for ` + ("`" + `fas`)) + ("`" + (` so we'll easy the upgrade process for our users by automatically defining\n * this as well.\n */\n\n\n if (prefix === 'fas') {\n defineIcons('fa', icons);\n }\n}\n\nvar styles = namespace.styles,\n shims = namespace.shims;\nvar _byUnicode = {};\nvar _byLigature = {};\nvar _byOldName = {};\nvar build = function build() {\n var lookup = function lookup(reducer) {\n return reduce(styles, function (o, style, prefix) {\n o[prefix] = reduce(style, reducer, {});\n return o;\n }, {});\n };\n\n _byUnicode = lookup(function (acc, icon, iconName) {\n if (icon[3]) {\n acc[icon[3]] = iconName;\n }\n\n return acc;\n });\n _byLigature = lookup(function (acc, icon, iconName) {\n var ligatures = icon[2];\n acc[iconName] = iconName;\n ligatures.forEach(function (ligature) {\n acc[ligature] = iconName;\n });\n return acc;\n });\n var hasRegular = 'far' in styles;\n _byOldName = reduce(shims, function (acc, shim) {\n var oldName = shim[0];\n var prefix = shim[1];\n var iconName = shim[2];\n\n if (prefix === 'far' && !hasRegular) {\n prefix = 'fas';\n }\n\n acc[oldName] = {\n prefix: prefix,\n iconName: iconName\n };\n return acc;\n }, {});\n};\nbuild();\nfunction byUnicode(prefix, unicode) {\n return (_byUnicode[prefix] || {})[unicode];\n}\nfunction byLigature(prefix, ligature) {\n return (_byLigature[prefix] || {})[ligature];\n}\nfunction byOldName(name) {\n return _byOldName[name] || {\n prefix: null,\n iconName: null\n };\n}\n\nvar styles$1 = namespace.styles;\nvar emptyCanonicalIcon = function emptyCanonicalIcon() {\n return {\n prefix: null,\n iconName: null,\n rest: []\n };\n};\nfunction getCanonicalIcon(values) {\n return values.reduce(function (acc, cls) {\n var iconName = getIconName(config.familyPrefix, cls);\n\n if (styles$1[cls]) {\n acc.prefix = cls;\n } else if (config.autoFetchSvg && ['fas', 'far', 'fal', 'fab', 'fa'].indexOf(cls) > -1) {\n acc.prefix = cls;\n } else if (iconName) {\n var shim = acc.prefix === 'fa' ? byOldName(iconName) : {};\n acc.iconName = shim.iconName || iconName;\n acc.prefix = shim.prefix || acc.prefix;\n } else if (cls !== config.replacementClass && cls.indexOf('fa-w-') !== 0) {\n acc.rest.push(cls);\n }\n\n return acc;\n }, emptyCanonicalIcon());\n}\nfunction iconFromMapping(mapping, prefix, iconName) {\n if (mapping && mapping[prefix] && mapping[prefix][iconName]) {\n return {\n prefix: prefix,\n iconName: iconName,\n icon: mapping[prefix][iconName]\n };\n }\n}\n\nfunction toHtml(abstractNodes) {\n var tag = abstractNodes.tag,\n _abstractNodes$attrib = abstractNodes.attributes,\n attributes = _abstractNodes$attrib === void 0 ? {} : _abstractNodes$attrib,\n _abstractNodes$childr = abstractNodes.children,\n children = _abstractNodes$childr === void 0 ? [] : _abstractNodes$childr;\n\n if (typeof abstractNodes === 'string') {\n return htmlEscape(abstractNodes);\n } else {\n return \"<\".concat(tag, \" \").concat(joinAttributes(attributes), \">\").concat(children.map(toHtml).join(''), \"\");\n }\n}\n\nvar noop$2 = function noop() {};\n\nfunction isWatched(node) {\n var i2svg = node.getAttribute ? node.getAttribute(DATA_FA_I2SVG) : null;\n return typeof i2svg === 'string';\n}\n\nfunction getMutator() {\n if (config.autoReplaceSvg === true) {\n return mutators.replace;\n }\n\n var mutator = mutators[config.autoReplaceSvg];\n return mutator || mutators.replace;\n}\n\nvar mutators = {\n replace: function replace(mutation) {\n var node = mutation[0];\n var abstract = mutation[1];\n var newOuterHTML = abstract.map(function (a) {\n return toHtml(a);\n }).join('\\n');\n\n if (node.parentNode && node.outerHTML) {\n node.outerHTML = newOuterHTML + (config.keepOriginalSource && node.tagName.toLowerCase() !== 'svg' ? \"\") : '');\n } else if (node.parentNode) {\n var newNode = document.createElement('span');\n node.parentNode.replaceChild(newNode, node);\n newNode.outerHTML = newOuterHTML;\n }\n },\n nest: function nest(mutation) {\n var node = mutation[0];\n var abstract = mutation[1]; // If we already have a replaced node we do not want to continue nesting within it.\n // Short-circuit to the standard replacement\n\n if (~classArray(node).indexOf(config.replacementClass)) {\n return mutators.replace(mutation);\n }\n\n var forSvg = new RegExp(\"\".concat(config.familyPrefix, \"-.*\"));\n delete abstract[0].attributes.style;\n var splitClasses = abstract[0].attributes.class.split(' ').reduce(function (acc, cls) {\n if (cls === config.replacementClass || cls.match(forSvg)) {\n acc.toSvg.push(cls);\n } else {\n acc.toNode.push(cls);\n }\n\n return acc;\n }, {\n toNode: [],\n toSvg: []\n });\n abstract[0].attributes.class = splitClasses.toSvg.join(' ');\n var newInnerHTML = abstract.map(function (a) {\n return toHtml(a);\n }).join('\\n');\n node.setAttribute('class', splitClasses.toNode.join(' '));\n node.setAttribute(DATA_FA_I2SVG, '');\n node.innerHTML = newInnerHTML;\n }\n};\n\nfunction performOperationSync(op) {\n op();\n}\n\nfunction perform(mutations, callback) {\n var callbackFunction = typeof callback === 'function' ? callback : noop$2;\n\n if (mutations.length === 0) {\n callbackFunction();\n } else {\n var frame = performOperationSync;\n\n if (config.mutateApproach === MUTATION_APPROACH_ASYNC) {\n frame = WINDOW.requestAnimationFrame || performOperationSync;\n }\n\n frame(function () {\n var mutator = getMutator();\n var mark = perf.begin('mutate');\n mutations.map(mutator);\n mark();\n callbackFunction();\n });\n }\n}\nvar disabled = false;\nfunction disableObservation() {\n disabled = true;\n}\nfunction enableObservation() {\n disabled = false;\n}\nvar mo = null;\nfunction observe(options) {\n if (!MUTATION_OBSERVER) {\n return;\n }\n\n if (!config.observeMutations) {\n return;\n }\n\n var treeCallback = options.treeCallback,\n nodeCallback = options.nodeCallback,\n pseudoElementsCallback = options.pseudoElementsCallback,\n _options$observeMutat = options.observeMutationsRoot,\n observeMutationsRoot = _options$observeMutat === void 0 ? DOCUMENT : _options$observeMutat;\n mo = new MUTATION_OBSERVER(function (objects) {\n if (disabled) return;\n toArray(objects).forEach(function (mutationRecord) {\n if (mutationRecord.type === 'childList' && mutationRecord.addedNodes.length > 0 && !isWatched(mutationRecord.addedNodes[0])) {\n if (config.searchPseudoElements) {\n pseudoElementsCallback(mutationRecord.target);\n }\n\n treeCallback(mutationRecord.target);\n }\n\n if (mutationRecord.type === 'attributes' && mutationRecord.target.parentNode && config.searchPseudoElements) {\n pseudoElementsCallback(mutationRecord.target.parentNode);\n }\n\n if (mutationRecord.type === 'attributes' && isWatched(mutationRecord.target) && ~ATTRIBUTES_WATCHED_FOR_MUTATION.indexOf(mutationRecord.attributeName)) {\n if (mutationRecord.attributeName === 'class') {\n var _getCanonicalIcon = getCanonicalIcon(classArray(mutationRecord.target)),\n prefix = _getCanonicalIcon.prefix,\n iconName = _getCanonicalIcon.iconName;\n\n if (prefix) mutationRecord.target.setAttribute('data-prefix', prefix);\n if (iconName) mutationRecord.target.setAttribute('data-icon', iconName);\n } else {\n nodeCallback(mutationRecord.target);\n }\n }\n });\n });\n if (!IS_DOM) return;\n mo.observe(observeMutationsRoot, {\n childList: true,\n attributes: true,\n characterData: true,\n subtree: true\n });\n}\nfunction disconnect() {\n if (!mo) return;\n mo.disconnect();\n}\n\nfunction styleParser (node) {\n var style = node.getAttribute('style');\n var val = [];\n\n if (style) {\n val = style.split(';').reduce(function (acc, style) {\n var styles = style.split(':');\n var prop = styles[0];\n var value = styles.slice(1);\n\n if (prop && value.length > 0) {\n acc[prop] = value.join(':').trim();\n }\n\n return acc;\n }, {});\n }\n\n return val;\n}\n\nfunction classParser (node) {\n var existingPrefix = node.getAttribute('data-prefix');\n var existingIconName = node.getAttribute('data-icon');\n var innerText = node.innerText !== undefined ? node.innerText.trim() : '';\n var val = getCanonicalIcon(classArray(node));\n\n if (existingPrefix && existingIconName) {\n val.prefix = existingPrefix;\n val.iconName = existingIconName;\n }\n\n if (val.prefix && innerText.length > 1) {\n val.iconName = byLigature(val.prefix, node.innerText);\n } else if (val.prefix && innerText.length === 1) {\n val.iconName = byUnicode(val.prefix, toHex(node.innerText));\n }\n\n return val;\n}\n\nvar parseTransformString = function parseTransformString(transformString) {\n var transform = {\n size: 16,\n x: 0,\n y: 0,\n flipX: false,\n flipY: false,\n rotate: 0\n };\n\n if (!transformString) {\n return transform;\n } else {\n return transformString.toLowerCase().split(' ').reduce(function (acc, n) {\n var parts = n.toLowerCase().split('-');\n var first = parts[0];\n var rest = parts.slice(1).join('-');\n\n if (first && rest === 'h') {\n acc.flipX = true;\n return acc;\n }\n\n if (first && rest === 'v') {\n acc.flipY = true;\n return acc;\n }\n\n rest = parseFloat(rest);\n\n if (isNaN(rest)) {\n return acc;\n }\n\n switch (first) {\n case 'grow':\n acc.size = acc.size + rest;\n break;\n\n case 'shrink':\n acc.size = acc.size - rest;\n break;\n\n case 'left':\n acc.x = acc.x - rest;\n break;\n\n case 'right':\n acc.x = acc.x + rest;\n break;\n\n case 'up':\n acc.y = acc.y - rest;\n break;\n\n case 'down':\n acc.y = acc.y + rest;\n break;\n\n case 'rotate':\n acc.rotate = acc.rotate + rest;\n break;\n }\n\n return acc;\n }, transform);\n }\n};\nfunction transformParser (node) {\n return parseTransformString(node.getAttribute('data-fa-transform'));\n}\n\nfunction symbolParser (node) {\n var symbol = node.getAttribute('data-fa-symbol');\n return symbol === null ? false : symbol === '' ? true : symbol;\n}\n\nfunction attributesParser (node) {\n var extraAttributes = toArray(node.attributes).reduce(function (acc, attr) {\n if (acc.name !== 'class' && acc.name !== 'style') {\n acc[attr.name] = attr.value;\n }\n\n return acc;\n }, {});\n var title = node.getAttribute('title');\n\n if (config.autoA11y) {\n if (title) {\n extraAttributes['aria-labelledby'] = \"\".concat(config.replacementClass, \"-title-\").concat(nextUniqueId());\n } else {\n extraAttributes['aria-hidden'] = 'true';\n extraAttributes['focusable'] = 'false';\n }\n }\n\n return extraAttributes;\n}\n\nfunction maskParser (node) {\n var mask = node.getAttribute('data-fa-mask');\n\n if (!mask) {\n return emptyCanonicalIcon();\n } else {\n return getCanonicalIcon(mask.split(' ').map(function (i) {\n return i.trim();\n }));\n }\n}\n\nfunction blankMeta() {\n return {\n iconName: null,\n title: null,\n prefix: null,\n transform: meaninglessTransform,\n symbol: false,\n mask: null,\n extra: {\n classes: [],\n styles: {},\n attributes: {}\n }\n };\n}\nfunction parseMeta(node) {\n var _classParser = classParser(node),\n iconName = _classParser.iconName,\n prefix = _classParser.prefix,\n extraClasses = _classParser.rest;\n\n var extraStyles = styleParser(node);\n var transform = transformParser(node);\n var symbol = symbolParser(node);\n var extraAttributes = attributesParser(node);\n var mask = maskParser(node);\n return {\n iconName: iconName,\n title: node.getAttribute('title'),\n prefix: prefix,\n transform: transform,\n symbol: symbol,\n mask: mask,\n extra: {\n classes: extraClasses,\n styles: extraStyles,\n attributes: extraAttributes\n }\n };\n}\n\nfunction MissingIcon(error) {\n this.name = 'MissingIcon';\n this.message = error || 'Icon unavailable';\n this.stack = new Error().stack;\n}\nMissingIcon.prototype = Object.create(Error.prototype);\nMissingIcon.prototype.constructor = MissingIcon;\n\nvar FILL = {\n fill: 'currentColor'\n};\nvar ANIMATION_BASE = {\n attributeType: 'XML',\n repeatCount: 'indefinite',\n dur: '2s'\n};\nvar RING = {\n tag: 'path',\n attributes: _objectSpread({}, FILL, {\n d: 'M156.5,447.7l-12.6,29.5c-18.7-9.5-35.9-21.2-51.5-34.9l22.7-22.7C127.6,430.5,141.5,440,156.5,447.7z M40.6,272H8.5 c1.4,21.2,5.4,41.7,11.7,61.1L50,321.2C45.1,305.5,41.8,289,40.6,272z M40.6,240c1.4-18.8,5.2-37,11.1-54.1l-29.5-12.6 C14.7,194.3,10,216.7,8.5,240H40.6z M64.3,156.5c7.8-14.9,17.2-28.8,28.1-41.5L69.7,92.3c-13.7,15.6-25.5,32.8-34.9,51.5 L64.3,156.5z M397,419.6c-13.9,12-29.4,22.3-46.1,30.4l11.9,29.8c20.7-9.9,39.8-22.6,56.9-37.6L397,419.6z M115,92.4 c13.9-12,29.4-22.3,46.1-30.4l-11.9-29.8c-20.7,9.9-39.8,22.6-56.8,37.6L115,92.4z M447.7,355.5c-7.8,14.9-17.2,28.8-28.1,41.5 l22.7,22.7c13.7-15.6,25.5-32.9,34.9-51.5L447.7,355.5z M471.4,272c-1.4,18.8-5.2,37-11.1,54.1l29.5,12.6 c7.5-21.1,12.2-43.5,13.6-66.8H471.4z M321.2,462c-15.7,5-32.2,8.2-49.2,9.4v32.1c21.2-1.4,41.7-5.4,61.1-11.7L321.2,462z M240,471.4c-18.8-1.4-37-5.2-54.1-11.1l-12.6,29.5c21.1,7.5,43.5,12.2,66.8,13.6V471.4z M462,190.8c5,15.7,8.2,32.2,9.4,49.2h32.1 c-1.4-21.2-5.4-41.7-11.7-61.1L462,190.8z M92.4,397c-12-13.9-22.3-29.4-30.4-46.1l-29.8,11.9c9.9,20.7,22.6,39.8,37.6,56.9 L92.4,397z M272,40.6c18.8,1.4,36.9,5.2,54.1,11.1l12.6-29.5C317.7,14.7,295.3,10,272,8.5V40.6z M190.8,50 c15.7-5,32.2-8.2,49.2-9.4V8.5c-21.2,1.4-41.7,5.4-61.1,11.7L190.8,50z M442.3,92.3L419.6,115c12,13.9,22.3,29.4,30.5,46.1 l29.8-11.9C470,128.5,457.3,109.4,442.3,92.3z M397,92.4l22.7-22.7c-15.6-13.7-32.8-25.5-51.5-34.9l-12.6,29.5 C370.4,72.1,384.4,81.5,397,92.4z'\n })\n};\n\nvar OPACITY_ANIMATE = _objectSpread({}, ANIMATION_BASE, {\n attributeName: 'opacity'\n});\n\nvar DOT = {\n tag: 'circle',\n attributes: _objectSpread({}, FILL, {\n cx: '256',\n cy: '364',\n r: '28'\n }),\n children: [{\n tag: 'animate',\n attributes: _objectSpread({}, ANIMATION_BASE, {\n attributeName: 'r',\n values: '28;14;28;28;14;28;'\n })\n }, {\n tag: 'animate',\n attributes: _objectSpread({}, OPACITY_ANIMATE, {\n values: '1;0;1;1;0;1;'\n })\n }]\n};\nvar QUESTION = {\n tag: 'path',\n attributes: _objectSpread({}, FILL, {\n opacity: '1',\n d: 'M263.7,312h-16c-6.6,0-12-5.4-12-12c0-71,77.4-63.9,77.4-107.8c0-20-17.8-40.2-57.4-40.2c-29.1,0-44.3,9.6-59.2,28.7 c-3.9,5-11.1,6-16.2,2.4l-13.1-9.2c-5.6-3.9-6.9-11.8-2.6-17.2c21.2-27.2,46.4-44.7,91.2-44.7c52.3,0,97.4,29.8,97.4,80.2 c0,67.6-77.4,63.5-77.4,107.8C275.7,306.6,270.3,312,263.7,312z'\n }),\n children: [{\n tag: 'animate',\n attributes: _objectSpread({}, OPACITY_ANIMATE, {\n values: '1;0;0;0;0;1;'\n })\n }]\n};\nvar EXCLAMATION = {\n tag: 'path',\n attributes: _objectSpread({}, FILL, {\n opacity: '0',\n d: 'M232.5,134.5l7,168c0.3,6.4,5.6,11.5,12,11.5h9c6.4,0,11.7-5.1,12-11.5l7-168c0.3-6.8-5.2-12.5-12-12.5h-23 C237.7,122,232.2,127.7,232.5,134.5z'\n }),\n children: [{\n tag: 'animate',\n attributes: _objectSpread({}, OPACITY_ANIMATE, {\n values: '0;0;1;1;0;0;'\n })\n }]\n};\nvar missing = {\n tag: 'g',\n children: [RING, DOT, QUESTION, EXCLAMATION]\n};\n\nvar styles$2 = namespace.styles;\nfunction findIcon(iconName, prefix) {\n return new picked(function (resolve, reject) {\n var val = {\n found: false,\n width: 512,\n height: 512,\n icon: missing\n };\n\n if (iconName && prefix && styles$2[prefix] && styles$2[prefix][iconName]) {\n var icon = styles$2[prefix][iconName];\n var width = icon[0];\n var height = icon[1];\n var vectorData = icon.slice(4);\n val = {\n found: true,\n width: width,\n height: height,\n icon: {\n tag: 'path',\n attributes: {\n fill: 'currentColor',\n d: vectorData[0]\n }\n }\n };\n return resolve(val);\n }\n\n if (iconName && prefix && !config.showMissingIcons) {\n reject(new MissingIcon(\"Icon is missing for prefix \".concat(prefix, \" with icon name \").concat(iconName)));\n } else {\n resolve(val);\n }\n });\n}\n\nvar styles$3 = namespace.styles;\n\nfunction generateSvgReplacementMutation(node, nodeMeta) {\n var iconName = nodeMeta.iconName,\n title = nodeMeta.title,\n prefix = nodeMeta.prefix,\n transform = nodeMeta.transform,\n symbol = nodeMeta.symbol,\n mask = nodeMeta.mask,\n extra = nodeMeta.extra;\n return new picked(function (resolve, reject) {\n picked.all([findIcon(iconName, prefix), findIcon(mask.iconName, mask.prefix)]).then(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n main = _ref2[0],\n mask = _ref2[1];\n\n resolve([node, makeInlineSvgAbstract({\n icons: {\n main: main,\n mask: mask\n },\n prefix: prefix,\n iconName: iconName,\n transform: transform,\n symbol: symbol,\n mask: mask,\n title: title,\n extra: extra,\n watchable: true\n })]);\n });\n });\n}\n\nfunction generateLayersText(node, nodeMeta) {\n var title = nodeMeta.title,\n transform = nodeMeta.transform,\n extra = nodeMeta.extra;\n var width = null;\n var height = null;\n\n if (IS_IE) {\n var computedFontSize = parseInt(getComputedStyle(node).fontSize, 10);\n var boundingClientRect = node.getBoundingClientRect();\n width = boundingClientRect.width / computedFontSize;\n height = boundingClientRect.height / computedFontSize;\n }\n\n if (config.autoA11y && !title) {\n extra.attributes['aria-hidden'] = 'true';\n }\n\n return picked.resolve([node, makeLayersTextAbstract({\n content: node.innerHTML,\n width: width,\n height: height,\n transform: transform,\n title: title,\n extra: extra,\n watchable: true\n })]);\n}\n\nfunction generateMutation(node) {\n var nodeMeta = parseMeta(node);\n\n if (~nodeMeta.extra.classes.indexOf(LAYERS_TEXT_CLASSNAME)) {\n return generateLayersText(node, nodeMeta);\n } else {\n return generateSvgReplacementMutation(node, nodeMeta);\n }\n}\n\nfunction onTree(root) {\n var callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n if (!IS_DOM) return;\n var htmlClassList = DOCUMENT.documentElement.classList;\n\n var hclAdd = function hclAdd(suffix) {\n return htmlClassList.add(\"\".concat(HTML_CLASS_I2SVG_BASE_CLASS, \"-\").concat(suffix));\n };\n\n var hclRemove = function hclRemove(suffix) {\n return htmlClassList.remove(\"\".concat(HTML_CLASS_I2SVG_BASE_CLASS, \"-\").concat(suffix));\n };\n\n var prefixes = config.autoFetchSvg ? Object.keys(PREFIX_TO_STYLE) : Object.keys(styles$3);\n var prefixesDomQuery = [\".\".concat(LAYERS_TEXT_CLASSNAME, \":not([\").concat(DATA_FA_I2SVG, \"])\")].concat(prefixes.map(function (p) {\n return \".\".concat(p, \":not([\").concat(DATA_FA_I2SVG, \"])\");\n })).join(', ');\n\n if (prefixesDomQuery.length === 0) {\n return;\n }\n\n var candidates = [];\n\n try {\n candidates = toArray(root.querySelectorAll(prefixesDomQuery));\n } catch (e) {// noop\n }\n\n if (candidates.length > 0) {\n hclAdd('pending');\n hclRemove('complete');\n } else {\n return;\n }\n\n var mark = perf.begin('onTree');\n var mutations = candidates.reduce(function (acc, node) {\n try {\n var mutation = generateMutation(node);\n\n if (mutation) {\n acc.push(mutation);\n }\n } catch (e) {\n if (!PRODUCTION) {\n if (e instanceof MissingIcon) {\n console.error(e);\n }\n }\n }\n\n return acc;\n }, []);\n return new picked(function (resolve, reject) {\n picked.all(mutations).then(function (resolvedMutations) {\n perform(resolvedMutations, function () {\n hclAdd('active');\n hclAdd('complete');\n hclRemove('pending');\n if (typeof callback === 'function') callback();\n mark();\n resolve();\n });\n }).catch(function () {\n mark();\n reject();\n });\n });\n}\nfunction onNode(node) {\n var callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n generateMutation(node).then(function (mutation) {\n if (mutation) {\n perform([mutation], callback);\n }\n });\n}\n\nfunction replaceForPosition(node, position) {\n var pendingAttribute = \"\".concat(DATA_FA_PSEUDO_ELEMENT_PENDING).concat(position.replace(':', '-'));\n return new picked(function (resolve, reject) {\n if (node.getAttribute(pendingAttribute) !== null) {\n // This node is already being processed\n return resolve();\n }\n\n var children = toArray(node.children);\n var alreadyProcessedPseudoElement = children.filter(function (c) {\n return c.getAttribute(DATA_FA_PSEUDO_ELEMENT) === position;\n })[0];\n var styles = WINDOW.getComputedStyle(node, position);\n var fontFamily = styles.getPropertyValue('font-family').match(FONT_FAMILY_PATTERN);\n var fontWeight = styles.getPropertyValue('font-weight');\n\n if (alreadyProcessedPseudoElement && !fontFamily) {\n // If we've already processed it but the current computed style does not result in a font-family,\n // that probably means that a class name that was previously present to make the icon has been\n // removed. So we now should delete the icon.\n node.removeChild(alreadyProcessedPseudoElement);\n return resolve();\n } else if (fontFamily) {\n var content = styles.getPropertyValue('content');\n var prefix = ~['Light', 'Regular', 'Solid', 'Brands'].indexOf(fontFamily[1]) ? STYLE_TO_PREFIX[fontFamily[1].toLowerCase()] : FONT_WEIGHT_TO_PREFIX[fontWeight];\n var hexValue = toHex(content.length === 3 ? content.substr(1, 1) : content);\n var iconName = byUnicode(prefix, hexValue);\n var iconIdentifier = iconName; // Only convert the pseudo element in this :before/:after position into an icon if we haven't\n // already done so with the same prefix and iconName\n\n if (iconName && (!alreadyProcessedPseudoElement || alreadyProcessedPseudoElement.getAttribute(DATA_PREFIX) !== prefix || alreadyProcessedPseudoElement.getAttribute(DATA_ICON) !== iconIdentifier)) {\n node.setAttribute(pendingAttribute, iconIdentifier);\n\n if (alreadyProcessedPseudoElement) {\n // Delete the old one, since we're replacing it with a new one\n node.removeChild(alreadyProcessedPseudoElement);\n }\n\n var meta = blankMeta();\n var extra = meta.extra;\n extra.attributes[DATA_FA_PSEUDO_ELEMENT] = position;\n findIcon(iconName, prefix).then(function (main) {\n var abstract = makeInlineSvgAbstract(_objectSpread({}, meta, {\n icons: {\n main: main,\n mask: emptyCanonicalIcon()\n },\n prefix: prefix,\n iconName: iconIdentifier,\n extra: extra,\n watchable: true\n }));\n var element = DOCUMENT.createElement('svg');\n\n if (position === ':before') {\n node.insertBefore(element, node.firstChild);\n } else {\n node.appendChild(element);\n }\n\n element.outerHTML = abstract.map(function (a) {\n return toHtml(a);\n }).join('\\n');\n node.removeAttribute(pendingAttribute);\n resolve();\n }).catch(reject);\n } else {\n resolve();\n }\n } else {\n resolve();\n }\n });\n}\n\nfunction replace(node) {\n return picked.all([replaceForPosition(node, ':before'), replaceForPosition(node, ':after')]);\n}\n\nfunction processable(node) {\n return node.parentNode !== document.head && !~TAGNAMES_TO_SKIP_FOR_PSEUDOELEMENTS.indexOf(node.tagName.toUpperCase()) && !node.getAttribute(DATA_FA_PSEUDO_ELEMENT) && (!node.parentNode || node.parentNode.tagName !== 'svg');\n}\n\nfunction searchPseudoElements (root) {\n if (!IS_DOM) return;\n return new picked(function (resolve, reject) {\n var operations = toArray(root.querySelectorAll('*')).filter(processable).map(replace);\n var end = perf.begin('searchPseudoElements');\n disableObservation();\n picked.all(operations).then(function () {\n end();\n enableObservation();\n resolve();\n }).catch(function () {\n end();\n enableObservation();\n reject();\n });\n });\n}\n\nvar baseStyles = \"svg:not(:root).svg-inline--fa {\\n overflow: visible;\\n}\\n\\n.svg-inline--fa {\\n display: inline-block;\\n font-size: inherit;\\n height: 1em;\\n overflow: visible;\\n vertical-align: -0.125em;\\n}\\n.svg-inline--fa.fa-lg {\\n vertical-align: -0.225em;\\n}\\n.svg-inline--fa.fa-w-1 {\\n width: 0.0625em;\\n}\\n.svg-inline--fa.fa-w-2 {\\n width: 0.125em;\\n}\\n.svg-inline--fa.fa-w-3 {\\n width: 0.1875em;\\n}\\n.svg-inline--fa.fa-w-4 {\\n width: 0.25em;\\n}\\n.svg-inline--fa.fa-w-5 {\\n width: 0.3125em;\\n}\\n.svg-inline--fa.fa-w-6 {\\n width: 0.375em;\\n}\\n.svg-inline--fa.fa-w-7 {\\n width: 0.4375em;\\n}\\n.svg-inline--fa.fa-w-8 {\\n width: 0.5em;\\n}\\n.svg-inline--fa.fa-w-9 {\\n width: 0.5625em;\\n}\\n.svg-inline--fa.fa-w-10 {\\n width: 0.625em;\\n}\\n.svg-inline--fa.fa-w-11 {\\n width: 0.6875em;\\n}\\n.svg-inline--fa.fa-w-12 {\\n width: 0.75em;\\n}\\n.svg-inline--fa.fa-w-13 {\\n width: 0.8125em;\\n}\\n.svg-inline--fa.fa-w-14 {\\n width: 0.875em;\\n}\\n.svg-inline--fa.fa-w-15 {\\n width: 0.9375em;\\n}\\n.svg-inline--fa.fa-w-16 {\\n width: 1em;\\n}\\n.svg-inline--fa.fa-w-17 {\\n width: 1.0625em;\\n}\\n.svg-inline--fa.fa-w-18 {\\n width: 1.125em;\\n}\\n.svg-inline--fa.fa-w-19 {\\n width: 1.1875em;\\n}\\n.svg-inline--fa.fa-w-20 {\\n width: 1.25em;\\n}\\n.svg-inline--fa.fa-pull-left {\\n margin-right: 0.3em;\\n width: auto;\\n}\\n.svg-inline--fa.fa-pull-right {\\n margin-left: 0.3em;\\n width: auto;\\n}\\n.svg-inline--fa.fa-border {\\n height: 1.5em;\\n}\\n.svg-inline--fa.fa-li {\\n width: 2em;\\n}\\n.svg-inline--fa.fa-fw {\\n width: 1.25em;\\n}\\n\\n.fa-layers svg.svg-inline--fa {\\n bottom: 0;\\n left: 0;\\n margin: auto;\\n position: absolute;\\n right: 0;\\n top: 0;\\n}\\n\\n.fa-layers {\\n display: inline-block;\\n height: 1em;\\n position: relative;\\n text-align: center;\\n vertical-align: -0.125em;\\n width: 1em;\\n}\\n.fa-layers svg.svg-inline--fa {\\n -webkit-transform-origin: center center;\\n transform-origin: center center;\\n}\\n\\n.fa-layers-counter, .fa-layers-text {\\n display: inline-block;\\n position: absolute;\\n text-align: center;\\n}\\n\\n.fa-layers-text {\\n left: 50%;\\n top: 50%;\\n -webkit-transform: translate(-50%, -50%);\\n transform: translate(-50%, -50%);\\n -webkit-transform-origin: center center;\\n transform-origin: center center;\\n}\\n\\n.fa-layers-counter {\\n background-color: #ff253a;\\n border-radius: 1em;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n color: #fff;\\n height: 1.5em;\\n line-height: 1;\\n max-width: 5em;\\n min-width: 1.5em;\\n overflow: hidden;\\n padding: 0.25em;\\n right: 0;\\n text-overflow: ellipsis;\\n top: 0;\\n -webkit-transform: scale(0.25);\\n transform: scale(0.25);\\n -webkit-transform-origin: top right;\\n transform-origin: top right;\\n}\\n\\n.fa-layers-bottom-right {\\n bottom: 0;\\n right: 0;\\n top: auto;\\n -webkit-transform: scale(0.25);\\n transform: scale(0.25);\\n -webkit-transform-origin: bottom right;\\n transform-origin: bottom right;\\n}\\n\\n.fa-layers-bottom-left {\\n bottom: 0;\\n left: 0;\\n right: auto;\\n top: auto;\\n -webkit-transform: scale(0.25);\\n transform: scale(0.25);\\n -webkit-transform-origin: bottom left;\\n transform-origin: bottom left;\\n}\\n\\n.fa-layers-top-right {\\n right: 0;\\n top: 0;\\n -webkit-transform: scale(0.25);\\n transform: scale(0.25);\\n -webkit-transform-origin: top right;\\n transform-origin: top right;\\n}\\n\\n.fa-layers-top-left {\\n left: 0;\\n right: auto;\\n top: 0;\\n -webkit-transform: scale(0.25);\\n transform: scale(0.25);\\n -webkit-transform-origin: top left;\\n transform-origin: top left;\\n}\\n\\n.fa-lg {\\n font-size: 1.3333333333em;\\n line-height: 0.75em;\\n vertical-align: -0.0667em;\\n}\\n\\n.fa-xs {\\n font-size: 0.75em;\\n}\\n\\n.fa-sm {\\n font-size: 0.875em;\\n}\\n\\n.fa-1x {\\n font-size: 1em;\\n}\\n\\n.fa-2x {\\n font-size: 2em;\\n}\\n\\n.fa-3x {\\n font-size: 3em;\\n}\\n\\n.fa-4x {\\n font-size: 4em;\\n}\\n\\n.fa-5x {\\n font-size: 5em;\\n}\\n\\n.fa-6x {\\n font-size: 6em;\\n}\\n\\n.fa-7x {\\n font-size: 7em;\\n}\\n\\n.fa-8x {\\n font-size: 8em;\\n}\\n\\n.fa-9x {\\n font-size: 9em;\\n}\\n\\n.fa-10x {\\n font-size: 10em;\\n}\\n\\n.fa-fw {\\n text-align: center;\\n width: 1.25em;\\n}\\n\\n.fa-ul {\\n list-style-type: none;\\n margin-left: 2.5em;\\n padding-left: 0;\\n}\\n.fa-ul > li {\\n position: relative;\\n}\\n\\n.fa-li {\\n left: -2em;\\n position: absolute;\\n text-align: center;\\n width: 2em;\\n line-height: inherit;\\n}\\n\\n.fa-border {\\n border: solid 0.08em #eee;\\n border-radius: 0.1em;\\n padding: 0.2em 0.25em 0.15em;\\n}\\n\\n.fa-pull-left {\\n float: left;\\n}\\n\\n.fa-pull-right {\\n float: right;\\n}\\n\\n.fa.fa-pull-left,\\n.fas.fa-pull-left,\\n.far.fa-pull-left,\\n.fal.fa-pull-left,\\n.fab.fa-pull-left {\\n margin-right: 0.3em;\\n}\\n.fa.fa-pull-right,\\n.fas.fa-pull-right,\\n.far.fa-pull-right,\\n.fal.fa-pull-right,\\n.fab.fa-pull-right {\\n margin-left: 0.3em;\\n}\\n\\n.fa-spin {\\n -webkit-animation: fa-spin 2s infinite linear;\\n animation: fa-spin 2s infinite linear;\\n}\\n\\n.fa-pulse {\\n -webkit-animation: fa-spin 1s infinite steps(8);\\n animation: fa-spin 1s infinite steps(8);\\n}\\n\\n@-webkit-keyframes fa-spin {\\n 0% {\\n -webkit-transform: rotate(0deg);\\n transform: rotate(0deg);\\n }\\n 100% {\\n -webkit-transform: rotate(360deg);\\n transform: rotate(360deg);\\n }\\n}\\n\\n@keyframes fa-spin {\\n 0% {\\n -webkit-transform: rotate(0deg);\\n transform: rotate(0deg);\\n }\\n 100% {\\n -webkit-transform: rotate(360deg);\\n transform: rotate(360deg);\\n }\\n}\\n.fa-rotate-90 {\\n -ms-filter: \\\"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)\\\";\\n -webkit-transform: rotate(90deg);\\n transform: rotate(90deg);\\n}\\n\\n.fa-rotate-180 {\\n -ms-filter: \\\"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)\\\";\\n -webkit-transform: rotate(180deg);\\n transform: rotate(180deg);\\n}\\n\\n.fa-rotate-270 {\\n -ms-filter: \\\"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)\\\";\\n -webkit-transform: rotate(270deg);\\n transform: rotate(270deg);\\n}\\n\\n.fa-flip-horizontal {\\n -ms-filter: \\\"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)\\\";\\n -webkit-transform: scale(-1, 1);\\n transform: scale(-1, 1);\\n}\\n\\n.fa-flip-vertical {\\n -ms-filter: \\\"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)\\\";\\n -webkit-transform: scale(1, -1);\\n transform: scale(1, -1);\\n}\\n\\n.fa-flip-both, .fa-flip-horizontal.fa-flip-vertical {\\n -ms-filter: \\\"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)\\\";\\n -webkit-transform: scale(-1, -1);\\n transform: scale(-1, -1);\\n}\\n\\n:root .fa-rotate-90,\\n:root .fa-rotate-180,\\n:root .fa-rotate-270,\\n:root .fa-flip-horizontal,\\n:root .fa-flip-vertical,\\n:root .fa-flip-both {\\n -webkit-filter: none;\\n filter: none;\\n}\\n\\n.fa-stack {\\n display: inline-block;\\n height: 2em;\\n position: relative;\\n width: 2.5em;\\n}\\n\\n.fa-stack-1x,\\n.fa-stack-2x {\\n bottom: 0;\\n left: 0;\\n margin: auto;\\n position: absolute;\\n right: 0;\\n top: 0;\\n}\\n\\n.svg-inline--fa.fa-stack-1x {\\n height: 1em;\\n width: 1.25em;\\n}\\n.svg-inline--fa.fa-stack-2x {\\n height: 2em;\\n width: 2.5em;\\n}\\n\\n.fa-inverse {\\n color: #fff;\\n}\\n\\n.sr-only {\\n border: 0;\\n clip: rect(0, 0, 0, 0);\\n height: 1px;\\n margin: -1px;\\n overflow: hidden;\\n padding: 0;\\n position: absolute;\\n width: 1px;\\n}\\n\\n.sr-only-focusable:active, .sr-only-focusable:focus {\\n clip: auto;\\n height: auto;\\n margin: 0;\\n overflow: visible;\\n position: static;\\n width: auto;\\n}\";\n\nfunction css () {\n var dfp = DEFAULT_FAMILY_PREFIX;\n var drc = DEFAULT_REPLACEMENT_CLASS;\n var fp = config.familyPrefix;\n var rc = config.replacementClass;\n var s = baseStyles;\n\n if (fp !== dfp || rc !== drc) {\n var dPatt = new RegExp(\"\\\\.\".concat(dfp, \"\\\\-\"), 'g');\n var rPatt = new RegExp(\"\\\\.\".concat(drc), 'g');\n s = s.replace(dPatt, \".\".concat(fp, \"-\")).replace(rPatt, \".\".concat(rc));\n }\n\n return s;\n}\n\nvar Library =\n/*#__PURE__*/\nfunction () {\n function Library() {\n _classCallCheck(this, Library);\n\n this.definitions = {};\n }\n\n _createClass(Library, [{\n key: \"add\",\n value: function add() {\n var _this = this;\n\n for (var _len = arguments.length, definitions = new Array(_len), _key = 0; _key < _len; _key++) {\n definitions[_key] = arguments[_key];\n }\n\n var additions = definitions.reduce(this._pullDefinitions, {});\n Object.keys(additions).forEach(function (key) {\n _this.definitions[key] = _objectSpread({}, _this.definitions[key] || {}, additions[key]);\n defineIcons(key, additions[key]);\n build();\n });\n }\n }, {\n key: \"reset\",\n value: function reset() {\n this.definitions = {};\n }\n }, {\n key: \"_pullDefinitions\",\n value: function _pullDefinitions(additions, definition) {\n var normalized = definition.prefix && definition.iconName && definition.icon ? {\n 0: definition\n } : definition;\n Object.keys(normalized).map(function (key) {\n var _normalized$key = normalized[key],\n prefix = _normalized$key.prefix,\n iconName = _normalized$key.iconName,\n icon = _normalized$key.icon;\n if (!additions[prefix]) additions[prefix] = {};\n additions[prefix][iconName] = icon;\n });\n return additions;\n }\n }]);\n\n return Library;\n}();\n\nfunction prepIcon(icon) {\n var width = icon[0];\n var height = icon[1];\n var vectorData = icon.slice(4);\n return {\n found: true,\n width: width,\n height: height,\n icon: {\n tag: 'path',\n attributes: {\n fill: 'currentColor',\n d: vectorData[0]\n }\n }\n };\n}\n\nfunction ensureCss() {\n if (config.autoAddCss && !_cssInserted) {\n insertCss(css());\n\n _cssInserted = true;\n }\n}\n\nfunction apiObject(val, abstractCreator) {\n Object.defineProperty(val, 'abstract', {\n get: abstractCreator\n });\n Object.defineProperty(val, 'html', {\n get: function get() {\n return val.abstract.map(function (a) {\n return toHtml(a);\n });\n }\n });\n Object.defineProperty(val, 'node', {\n get: function get() {\n if (!IS_DOM) return;\n var container = DOCUMENT.createElement('div');\n container.innerHTML = val.html;\n return container.children;\n }\n });\n return val;\n}\n\nfunction findIconDefinition(iconLookup) {\n var _iconLookup$prefix = iconLookup.prefix,\n prefix = _iconLookup$prefix === void 0 ? 'fa' : _iconLookup$prefix,\n iconName = iconLookup.iconName;\n if (!iconName) return;\n return iconFromMapping(library.definitions, prefix, iconName) || iconFromMapping(namespace.styles, prefix, iconName);\n}\n\nfunction resolveIcons(next) {\n return function (maybeIconDefinition) {\n var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var iconDefinition = (maybeIconDefinition || {}).icon ? maybeIconDefinition : findIconDefinition(maybeIconDefinition || {});\n var mask = params.mask;\n\n if (mask) {\n mask = (mask || {}).icon ? mask : findIconDefinition(mask || {});\n }\n\n return next(iconDefinition, _objectSpread({}, params, {\n mask: mask\n }));\n };\n}\n\nvar library = new Library();\nvar noAuto = function noAuto() {\n config.autoReplaceSvg = false;\n config.observeMutations = false;\n disconnect();\n};\nvar _cssInserted = false;\nvar dom = {\n i2svg: function i2svg() {\n var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n if (IS_DOM) {\n ensureCss();\n var _params$node = params.node,\n node = _params$node === void 0 ? DOCUMENT : _params$node,\n _params$callback = params.callback,\n callback = _params$callback === void 0 ? function () {} : _params$callback;\n\n if (config.searchPseudoElements) {\n searchPseudoElements(node);\n }\n\n return onTree(node, callback);\n } else {\n return picked.reject('Operation requires a DOM of some kind.');\n }\n },\n css: css,\n insertCss: function insertCss$$1() {\n if (!_cssInserted) {\n insertCss(css());\n\n _cssInserted = true;\n }\n },\n watch: function watch() {\n var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var autoReplaceSvgRoot = params.autoReplaceSvgRoot,\n observeMutationsRoot = params.observeMutationsRoot;\n\n if (config.autoReplaceSvg === false) {\n config.autoReplaceSvg = true;\n }\n\n config.observeMutations = true;\n domready(function () {\n autoReplace({\n autoReplaceSvgRoot: autoReplaceSvgRoot\n });\n observe({\n treeCallback: onTree,\n nodeCallback: onNode,\n pseudoElementsCallback: searchPseudoElements,\n observeMutationsRoot: observeMutationsRoot\n });\n });\n }\n};\nvar parse = {\n transform: function transform(transformString) {\n return parseTransformString(transformString);\n }\n};\nvar icon = resolveIcons(function (iconDefinition) {\n var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var _params$transform = params.transform,\n transform = _params$transform === void 0 ? meaninglessTransform : _params$transform,\n _params$symbol = params.symbol,\n symbol = _params$symbol === void 0 ? false : _params$symbol,\n _params$mask = params.mask,\n mask = _params$mask === void 0 ? null : _params$mask,\n _params$title = params.title,\n title = _params$title === void 0 ? null : _params$title,\n _params$classes = params.classes,\n classes = _params$classes === void 0 ? [] : _params$classes,\n _params$attributes = params.attributes,\n attributes = _params$attributes === void 0 ? {} : _params$attributes,\n _params$styles = params.styles,\n styles = _params$styles === void 0 ? {} : _params$styles;\n if (!iconDefinition) return;\n var prefix = iconDefinition.prefix,\n iconName = iconDefinition.iconName,\n icon = iconDefinition.icon;\n return apiObject(_objectSpread({\n type: 'icon'\n }, iconDefinition), function () {\n ensureCss();\n\n if (config.autoA11y) {\n if (title) {\n attributes['aria-labelledby'] = \"\".concat(config.replacementClass, \"-title-\").concat(nextUniqueId());\n } else {\n attributes['aria-hidden'] = 'true';\n attributes['focusable'] = 'false';\n }\n }\n\n return makeInlineSvgAbstract({\n icons: {\n main: prepIcon(icon),\n mask: mask ? prepIcon(mask.icon) : {\n found: false,\n width: null,\n height: null,\n icon: {}\n }\n },\n prefix: prefix,\n iconName: iconName,\n transform: _objectSpread({}, meaninglessTransform, transform),\n symbol: symbol,\n title: title,\n extra: {\n attributes: attributes,\n styles: styles,\n classes: classes\n }\n });\n });\n});\nvar text = function text(content) {\n var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var _params$transform2 = params.transform,\n transform = _params$transform2 === void 0 ? meaninglessTransform : _params$transform2,\n _params$title2 = params.title,\n title = _params$title2 === void 0 ? null : _params$title2,\n _params$classes2 = params.classes,\n classes = _params$classes2 === void 0 ? [] : _params$classes2,\n _params$attributes2 = params.attributes,\n attributes = _params$attributes2 === void 0 ? {} : _params$attributes2,\n _params$styles2 = params.styles,\n styles = _params$styles2 === void 0 ? {} : _params$styles2;\n return apiObject({\n type: 'text',\n content: content\n }, function () {\n ensureCss();\n return makeLayersTextAbstract({\n content: content,\n transform: _objectSpread({}, meaninglessTransform, transform),\n title: title,\n extra: {\n attributes: attributes,\n styles: styles,\n classes: [\"\".concat(config.familyPrefix, \"-layers-text\")].concat(_toConsumableArray(classes))\n }\n });\n });\n};\nvar counter = function counter(content) {\n var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var _params$title3 = params.title,\n title = _params$title3 === void 0 ? null : _params$title3,\n _params$classes3 = params.classes,\n classes = _params$classes3 === void 0 ? [] : _params$classes3,\n _params$attributes3 = params.attributes,\n attributes = _params$attributes3 === void 0 ? {} : _params$attributes3,\n _params$styles3 = params.styles,\n styles = _params$styles3 === void 0 ? {} : _params$styles3;\n return apiObject({\n type: 'counter',\n content: content\n }, function () {\n ensureCss();\n return makeLayersCounterAbstract({\n content: content.toString(),\n title: title,\n extra: {\n attributes: attributes,\n styles: styles,\n classes: [\"\".concat(config.familyPrefix, \"-layers-counter\")].concat(_toConsumableArray(classes))\n }\n });\n });\n};\nvar layer = function layer(assembler) {\n return apiObject({\n type: 'layer'\n }, function () {\n ensureCss();\n var children = [];\n assembler(function (args) {\n Array.isArray(args) ? args.map(function (a) {\n children = children.concat(a.abstract);\n }) : children = children.concat(args.abstract);\n });\n return [{\n tag: 'span',\n attributes: {\n class: \"\".concat(config.familyPrefix, \"-layers\")\n },\n children: children\n }];\n });\n};\nvar api = {\n noAuto: noAuto,\n config: config,\n dom: dom,\n library: library,\n parse: parse,\n findIconDefinition: findIconDefinition,\n icon: icon,\n text: text,\n counter: counter,\n layer: layer,\n toHtml: toHtml\n};\n\nvar autoReplace = function autoReplace() {\n var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var _params$autoReplaceSv = params.autoReplaceSvgRoot,\n autoReplaceSvgRoot = _params$autoReplaceSv === void 0 ? DOCUMENT : _params$autoReplaceSv;\n if ((Object.keys(namespace.styles).length > 0 || config.autoFetchSvg) && IS_DOM && config.autoReplaceSvg) api.dom.i2svg({\n node: autoReplaceSvgRoot\n });\n};\n\nexport { icon, noAuto, config, toHtml, layer, text, counter, library, dom, parse, findIconDefinition };\n", "var prefix = \"far\";\nvar faAddressBook = {\n prefix: 'far',\n iconName: 'address-book',\n icon: [448, 512, [], \"f2b9\", \"M436 160c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-20V48c0-26.5-21.5-48-48-48H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h320c26.5 0 48-21.5 48-48v-48h20c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-20v-64h20c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-20v-64h20zm-68 304H48V48h320v416zM208 256c35.3 0 64-28.7 64-64s-28.7-64-64-64-64 28.7-64 64 28.7 64 64 64zm-89.6 128h179.2c12.4 0 22.4-8.6 22.4-19.2v-19.2c0-31.8-30.1-57.6-67.2-57.6-10.8 0-18.7 8-44.8 8-26.9 0-33.4-8-44.8-8-37.1 0-67.2 25.8-67.2 57.6v19.2c0 10.6 10 19.2 22.4 19.2z\"]\n};\nvar faAddressCard = {\n prefix: 'far',\n iconName: 'address-card',\n icon: [576, 512, [], \"f2bb\", \"M528 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h480c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zm0 400H48V80h480v352zM208 256c35.3 0 64-28.7 64-64s-28.7-64-64-64-64 28.7-64 64 28.7 64 64 64zm-89.6 128h179.2c12.4 0 22.4-8.6 22.4-19.2v-19.2c0-31.8-30.1-57.6-67.2-57.6-10.8 0-18.7 8-44.8 8-26.9 0-33.4-8-44.8-8-37.1 0-67.2 25.8-67.2 57.6v19.2c0 10.6 10 19.2 22.4 19.2zM360 320h112c4.4 0 8-3.6 8-8v-16c0-4.4-3.6-8-8-8H360c-4.4 0-8 3.6-8 8v16c0 4.4 3.6 8 8 8zm0-64h112c4.4 0 8-3.6 8-8v-16c0-4.4-3.6-8-8-8H360c-4.4 0-8 3.6-8 8v16c0 4.4 3.6 8 8 8zm0-64h112c4.4 0 8-3.6 8-8v-16c0-4.4-3.6-8-8-8H360c-4.4 0-8 3.6-8 8v16c0 4.4 3.6 8 8 8z\"]\n};\nvar faAngry = {\n prefix: 'far',\n iconName: 'angry',\n icon: [496, 512, [], \"f556\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm0-144c-33.6 0-65.2 14.8-86.8 40.6-8.5 10.2-7.1 25.3 3.1 33.8s25.3 7.2 33.8-3c24.8-29.7 75-29.7 99.8 0 8.1 9.7 23.2 11.9 33.8 3 10.2-8.5 11.5-23.6 3.1-33.8-21.6-25.8-53.2-40.6-86.8-40.6zm-48-72c10.3 0 19.9-6.7 23-17.1 3.8-12.7-3.4-26.1-16.1-29.9l-80-24c-12.8-3.9-26.1 3.4-29.9 16.1-3.8 12.7 3.4 26.1 16.1 29.9l28.2 8.5c-3.1 4.9-5.3 10.4-5.3 16.6 0 17.7 14.3 32 32 32s32-14.4 32-32.1zm199-54.9c-3.8-12.7-17.1-19.9-29.9-16.1l-80 24c-12.7 3.8-19.9 17.2-16.1 29.9 3.1 10.4 12.7 17.1 23 17.1 0 17.7 14.3 32 32 32s32-14.3 32-32c0-6.2-2.2-11.7-5.3-16.6l28.2-8.5c12.7-3.7 19.9-17.1 16.1-29.8z\"]\n};\nvar faArrowAltCircleDown = {\n prefix: 'far',\n iconName: 'arrow-alt-circle-down',\n icon: [512, 512, [], \"f358\", \"M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm0 448c-110.5 0-200-89.5-200-200S145.5 56 256 56s200 89.5 200 200-89.5 200-200 200zm-32-316v116h-67c-10.7 0-16 12.9-8.5 20.5l99 99c4.7 4.7 12.3 4.7 17 0l99-99c7.6-7.6 2.2-20.5-8.5-20.5h-67V140c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12z\"]\n};\nvar faArrowAltCircleLeft = {\n prefix: 'far',\n iconName: 'arrow-alt-circle-left',\n icon: [512, 512, [], \"f359\", \"M8 256c0 137 111 248 248 248s248-111 248-248S393 8 256 8 8 119 8 256zm448 0c0 110.5-89.5 200-200 200S56 366.5 56 256 145.5 56 256 56s200 89.5 200 200zm-72-20v40c0 6.6-5.4 12-12 12H256v67c0 10.7-12.9 16-20.5 8.5l-99-99c-4.7-4.7-4.7-12.3 0-17l99-99c7.6-7.6 20.5-2.2 20.5 8.5v67h116c6.6 0 12 5.4 12 12z\"]\n};\nvar faArrowAltCircleRight = {\n prefix: 'far',\n iconName: 'arrow-alt-circle-right',\n icon: [512, 512, [], \"f35a\", \"M504 256C504 119 393 8 256 8S8 119 8 256s111 248 248 248 248-111 248-248zm-448 0c0-110.5 89.5-200 200-200s200 89.5 200 200-89.5 200-200 200S56 366.5 56 256zm72 20v-40c0-6.6 5.4-12 12-12h116v-67c0-10.7 12.9-16 20.5-8.5l99 99c4.7 4.7 4.7 12.3 0 17l-99 99c-7.6 7.6-20.5 2.2-20.5-8.5v-67H140c-6.6 0-12-5.4-12-12z\"]\n};\nvar faArrowAltCircleUp = {\n prefix: 'far',\n iconName: 'arrow-alt-circle-up',\n icon: [512, 512, [], \"f35b\", \"M256 504c137 0 248-111 248-248S393 8 256 8 8 119 8 256s111 248 248 248zm0-448c110.5 0 200 89.5 200 200s-89.5 200-200 200S56 366.5 56 256 145.5 56 256 56zm20 328h-40c-6.6 0-12-5.4-12-12V256h-67c-10.7 0-16-12.9-8.5-20.5l99-99c4.7-4.7 12.3-4.7 17 0l99 99c7.6 7.6 2.2 20.5-8.5 20.5h-67v116c0 6.6-5.4 12-12 12z\"]\n};\nvar faBell = {\n prefix: 'far',\n iconName: 'bell',\n icon: [448, 512, [], \"f0f3\", \"M439.39 362.29c-19.32-20.76-55.47-51.99-55.47-154.29 0-77.7-54.48-139.9-127.94-155.16V32c0-17.67-14.32-32-31.98-32s-31.98 14.33-31.98 32v20.84C118.56 68.1 64.08 130.3 64.08 208c0 102.3-36.15 133.53-55.47 154.29-6 6.45-8.66 14.16-8.61 21.71.11 16.4 12.98 32 32.1 32h383.8c19.12 0 32-15.6 32.1-32 .05-7.55-2.61-15.27-8.61-21.71zM67.53 368c21.22-27.97 44.42-74.33 44.53-159.42 0-.2-.06-.38-.06-.58 0-61.86 50.14-112 112-112s112 50.14 112 112c0 .2-.06.38-.06.58.11 85.1 23.31 131.46 44.53 159.42H67.53zM224 512c35.32 0 63.97-28.65 63.97-64H160.03c0 35.35 28.65 64 63.97 64z\"]\n};\nvar faBellSlash = {\n prefix: 'far',\n iconName: 'bell-slash',\n icon: [640, 512, [], \"f1f6\", \"M633.99 471.02L36 3.51C29.1-2.01 19.03-.9 13.51 6l-10 12.49C-2.02 25.39-.9 35.46 6 40.98l598 467.51c6.9 5.52 16.96 4.4 22.49-2.49l10-12.49c5.52-6.9 4.41-16.97-2.5-22.49zM163.53 368c16.71-22.03 34.48-55.8 41.4-110.58l-45.47-35.55c-3.27 90.73-36.47 120.68-54.84 140.42-6 6.45-8.66 14.16-8.61 21.71.11 16.4 12.98 32 32.1 32h279.66l-61.4-48H163.53zM320 96c61.86 0 112 50.14 112 112 0 .2-.06.38-.06.58.02 16.84 1.16 31.77 2.79 45.73l59.53 46.54c-8.31-22.13-14.34-51.49-14.34-92.85 0-77.7-54.48-139.9-127.94-155.16V32c0-17.67-14.32-32-31.98-32s-31.98 14.33-31.98 32v20.84c-26.02 5.41-49.45 16.94-69.13 32.72l38.17 29.84C275 103.18 296.65 96 320 96zm0 416c35.32 0 63.97-28.65 63.97-64H256.03c0 35.35 28.65 64 63.97 64z\"]\n};\nvar faBookmark = {\n prefix: 'far',\n iconName: 'bookmark',\n icon: [384, 512, [], \"f02e\", \"M336 0H48C21.49 0 0 21.49 0 48v464l192-112 192 112V48c0-26.51-21.49-48-48-48zm0 428.43l-144-84-144 84V54a6 6 0 0 1 6-6h276c3.314 0 6 2.683 6 5.996V428.43z\"]\n};\nvar faBuilding = {\n prefix: 'far',\n iconName: 'building',\n icon: [448, 512, [], \"f1ad\", \"M128 148v-40c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v40c0 6.6-5.4 12-12 12h-40c-6.6 0-12-5.4-12-12zm140 12h40c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12zm-128 96h40c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12zm128 0h40c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12zm-76 84v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12zm76 12h40c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12zm180 124v36H0v-36c0-6.6 5.4-12 12-12h19.5V24c0-13.3 10.7-24 24-24h337c13.3 0 24 10.7 24 24v440H436c6.6 0 12 5.4 12 12zM79.5 463H192v-67c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v67h112.5V49L80 48l-.5 415z\"]\n};\nvar faCalendar = {\n prefix: 'far',\n iconName: 'calendar',\n icon: [448, 512, [], \"f133\", \"M400 64h-48V12c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v52H160V12c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v52H48C21.5 64 0 85.5 0 112v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V112c0-26.5-21.5-48-48-48zm-6 400H54c-3.3 0-6-2.7-6-6V160h352v298c0 3.3-2.7 6-6 6z\"]\n};\nvar faCalendarAlt = {\n prefix: 'far',\n iconName: 'calendar-alt',\n icon: [448, 512, [], \"f073\", \"M148 288h-40c-6.6 0-12-5.4-12-12v-40c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v40c0 6.6-5.4 12-12 12zm108-12v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12zm96 0v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12zm-96 96v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12zm-96 0v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12zm192 0v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12zm96-260v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V112c0-26.5 21.5-48 48-48h48V12c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v52h128V12c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v52h48c26.5 0 48 21.5 48 48zm-48 346V160H48v298c0 3.3 2.7 6 6 6h340c3.3 0 6-2.7 6-6z\"]\n};\nvar faCalendarCheck = {\n prefix: 'far',\n iconName: 'calendar-check',\n icon: [448, 512, [], \"f274\", \"M400 64h-48V12c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v52H160V12c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v52H48C21.49 64 0 85.49 0 112v352c0 26.51 21.49 48 48 48h352c26.51 0 48-21.49 48-48V112c0-26.51-21.49-48-48-48zm-6 400H54a6 6 0 0 1-6-6V160h352v298a6 6 0 0 1-6 6zm-52.849-200.65L198.842 404.519c-4.705 4.667-12.303 4.637-16.971-.068l-75.091-75.699c-4.667-4.705-4.637-12.303.068-16.971l22.719-22.536c4.705-4.667 12.303-4.637 16.97.069l44.104 44.461 111.072-110.181c4.705-4.667 12.303-4.637 16.971.068l22.536 22.718c4.667 4.705 4.636 12.303-.069 16.97z\"]\n};\nvar faCalendarMinus = {\n prefix: 'far',\n iconName: 'calendar-minus',\n icon: [448, 512, [], \"f272\", \"M124 328c-6.6 0-12-5.4-12-12v-24c0-6.6 5.4-12 12-12h200c6.6 0 12 5.4 12 12v24c0 6.6-5.4 12-12 12H124zm324-216v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V112c0-26.5 21.5-48 48-48h48V12c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v52h128V12c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v52h48c26.5 0 48 21.5 48 48zm-48 346V160H48v298c0 3.3 2.7 6 6 6h340c3.3 0 6-2.7 6-6z\"]\n};\nvar faCalendarPlus = {\n prefix: 'far',\n iconName: 'calendar-plus',\n icon: [448, 512, [], \"f271\", \"M336 292v24c0 6.6-5.4 12-12 12h-76v76c0 6.6-5.4 12-12 12h-24c-6.6 0-12-5.4-12-12v-76h-76c-6.6 0-12-5.4-12-12v-24c0-6.6 5.4-12 12-12h76v-76c0-6.6 5.4-12 12-12h24c6.6 0 12 5.4 12 12v76h76c6.6 0 12 5.4 12 12zm112-180v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V112c0-26.5 21.5-48 48-48h48V12c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v52h128V12c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v52h48c26.5 0 48 21.5 48 48zm-48 346V160H48v298c0 3.3 2.7 6 6 6h340c3.3 0 6-2.7 6-6z\"]\n};\nvar faCalendarTimes = {\n prefix: 'far',\n iconName: 'calendar-times',\n icon: [448, 512, [], \"f273\", \"M311.7 374.7l-17 17c-4.7 4.7-12.3 4.7-17 0L224 337.9l-53.7 53.7c-4.7 4.7-12.3 4.7-17 0l-17-17c-4.7-4.7-4.7-12.3 0-17l53.7-53.7-53.7-53.7c-4.7-4.7-4.7-12.3 0-17l17-17c4.7-4.7 12.3-4.7 17 0l53.7 53.7 53.7-53.7c4.7-4.7 12.3-4.7 17 0l17 17c4.7 4.7 4.7 12.3 0 17L257.9 304l53.7 53.7c4.8 4.7 4.8 12.3.1 17zM448 112v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V112c0-26.5 21.5-48 48-48h48V12c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v52h128V12c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v52h48c26.5 0 48 21.5 48 48zm-48 346V160H48v298c0 3.3 2.7 6 6 6h340c3.3 0 6-2.7 6-6z\"]\n};\nvar faCaretSquareDown = {\n prefix: 'far',\n iconName: 'caret-square-down',\n icon: [448, 512, [], \"f150\", \"M125.1 208h197.8c10.7 0 16.1 13 8.5 20.5l-98.9 98.3c-4.7 4.7-12.2 4.7-16.9 0l-98.9-98.3c-7.7-7.5-2.3-20.5 8.4-20.5zM448 80v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V80c0-26.5 21.5-48 48-48h352c26.5 0 48 21.5 48 48zm-48 346V86c0-3.3-2.7-6-6-6H54c-3.3 0-6 2.7-6 6v340c0 3.3 2.7 6 6 6h340c3.3 0 6-2.7 6-6z\"]\n};\nvar faCaretSquareLeft = {\n prefix: 'far',\n iconName: 'caret-square-left',\n icon: [448, 512, [], \"f191\", \"M272 157.1v197.8c0 10.7-13 16.1-20.5 8.5l-98.3-98.9c-4.7-4.7-4.7-12.2 0-16.9l98.3-98.9c7.5-7.7 20.5-2.3 20.5 8.4zM448 80v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V80c0-26.5 21.5-48 48-48h352c26.5 0 48 21.5 48 48zm-48 346V86c0-3.3-2.7-6-6-6H54c-3.3 0-6 2.7-6 6v340c0 3.3 2.7 6 6 6h340c3.3 0 6-2.7 6-6z\"]\n};\nvar faCaretSquareRight = {\n prefix: 'far',\n iconName: 'caret-square-right',\n icon: [448, 512, [], \"f152\", \"M176 354.9V157.1c0-10.7 13-16.1 20.5-8.5l98.3 98.9c4.7 4.7 4.7 12.2 0 16.9l-98.3 98.9c-7.5 7.7-20.5 2.3-20.5-8.4zM448 80v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V80c0-26.5 21.5-48 48-48h352c26.5 0 48 21.5 48 48zm-48 346V86c0-3.3-2.7-6-6-6H54c-3.3 0-6 2.7-6 6v340c0 3.3 2.7 6 6 6h340c3.3 0 6-2.7 6-6z\"]\n};\nvar faCaretSquareUp = {\n prefix: 'far',\n iconName: 'caret-square-up',\n icon: [448, 512, [], \"f151\", \"M322.9 304H125.1c-10.7 0-16.1-13-8.5-20.5l98.9-98.3c4.7-4.7 12.2-4.7 16.9 0l98.9 98.3c7.7 7.5 2.3 20.5-8.4 20.5zM448 80v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V80c0-26.5 21.5-48 48-48h352c26.5 0 48 21.5 48 48zm-48 346V86c0-3.3-2.7-6-6-6H54c-3.3 0-6 2.7-6 6v340c0 3.3 2.7 6 6 6h340c3.3 0 6-2.7 6-6z\"]\n};\nvar faChartBar = {\n prefix: 'far',\n iconName: 'chart-bar',\n icon: [512, 512, [], \"f080\", \"M396.8 352h22.4c6.4 0 12.8-6.4 12.8-12.8V108.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v230.4c0 6.4 6.4 12.8 12.8 12.8zm-192 0h22.4c6.4 0 12.8-6.4 12.8-12.8V140.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v198.4c0 6.4 6.4 12.8 12.8 12.8zm96 0h22.4c6.4 0 12.8-6.4 12.8-12.8V204.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v134.4c0 6.4 6.4 12.8 12.8 12.8zM496 400H48V80c0-8.84-7.16-16-16-16H16C7.16 64 0 71.16 0 80v336c0 17.67 14.33 32 32 32h464c8.84 0 16-7.16 16-16v-16c0-8.84-7.16-16-16-16zm-387.2-48h22.4c6.4 0 12.8-6.4 12.8-12.8v-70.4c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v70.4c0 6.4 6.4 12.8 12.8 12.8z\"]\n};\nvar faCheckCircle = {\n prefix: 'far',\n iconName: 'check-circle',\n icon: [512, 512, [], \"f058\", \"M256 8C119.033 8 8 119.033 8 256s111.033 248 248 248 248-111.033 248-248S392.967 8 256 8zm0 48c110.532 0 200 89.451 200 200 0 110.532-89.451 200-200 200-110.532 0-200-89.451-200-200 0-110.532 89.451-200 200-200m140.204 130.267l-22.536-22.718c-4.667-4.705-12.265-4.736-16.97-.068L215.346 303.697l-59.792-60.277c-4.667-4.705-12.265-4.736-16.97-.069l-22.719 22.536c-4.705 4.667-4.736 12.265-.068 16.971l90.781 91.516c4.667 4.705 12.265 4.736 16.97.068l172.589-171.204c4.704-4.668 4.734-12.266.067-16.971z\"]\n};\nvar faCheckSquare = {\n prefix: 'far',\n iconName: 'check-square',\n icon: [448, 512, [], \"f14a\", \"M400 32H48C21.49 32 0 53.49 0 80v352c0 26.51 21.49 48 48 48h352c26.51 0 48-21.49 48-48V80c0-26.51-21.49-48-48-48zm0 400H48V80h352v352zm-35.864-241.724L191.547 361.48c-4.705 4.667-12.303 4.637-16.97-.068l-90.781-91.516c-4.667-4.705-4.637-12.303.069-16.971l22.719-22.536c4.705-4.667 12.303-4.637 16.97.069l59.792 60.277 141.352-140.216c4.705-4.667 12.303-4.637 16.97.068l22.536 22.718c4.667 4.706 4.637 12.304-.068 16.971z\"]\n};\nvar faCircle = {\n prefix: 'far',\n iconName: 'circle',\n icon: [512, 512, [], \"f111\", \"M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm0 448c-110.5 0-200-89.5-200-200S145.5 56 256 56s200 89.5 200 200-89.5 200-200 200z\"]\n};\nvar faClipboard = {\n prefix: 'far',\n iconName: 'clipboard',\n icon: [384, 512, [], \"f328\", \"M336 64h-80c0-35.3-28.7-64-64-64s-64 28.7-64 64H48C21.5 64 0 85.5 0 112v352c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V112c0-26.5-21.5-48-48-48zM192 40c13.3 0 24 10.7 24 24s-10.7 24-24 24-24-10.7-24-24 10.7-24 24-24zm144 418c0 3.3-2.7 6-6 6H54c-3.3 0-6-2.7-6-6V118c0-3.3 2.7-6 6-6h42v36c0 6.6 5.4 12 12 12h168c6.6 0 12-5.4 12-12v-36h42c3.3 0 6 2.7 6 6z\"]\n};\nvar faClock = {\n prefix: 'far',\n iconName: 'clock',\n icon: [512, 512, [], \"f017\", \"M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm0 448c-110.5 0-200-89.5-200-200S145.5 56 256 56s200 89.5 200 200-89.5 200-200 200zm61.8-104.4l-84.9-61.7c-3.1-2.3-4.9-5.9-4.9-9.7V116c0-6.6 5.4-12 12-12h32c6.6 0 12 5.4 12 12v141.7l66.8 48.6c5.4 3.9 6.5 11.4 2.6 16.8L334.6 349c-3.9 5.3-11.4 6.5-16.8 2.6z\"]\n};\nvar faClone = {\n prefix: 'far',\n iconName: 'clone',\n icon: [512, 512, [], \"f24d\", \"M464 0H144c-26.51 0-48 21.49-48 48v48H48c-26.51 0-48 21.49-48 48v320c0 26.51 21.49 48 48 48h320c26.51 0 48-21.49 48-48v-48h48c26.51 0 48-21.49 48-48V48c0-26.51-21.49-48-48-48zM362 464H54a6 6 0 0 1-6-6V150a6 6 0 0 1 6-6h42v224c0 26.51 21.49 48 48 48h224v42a6 6 0 0 1-6 6zm96-96H150a6 6 0 0 1-6-6V54a6 6 0 0 1 6-6h308a6 6 0 0 1 6 6v308a6 6 0 0 1-6 6z\"]\n};\nvar faClosedCaptioning = {\n prefix: 'far',\n iconName: 'closed-captioning',\n icon: [512, 512, [], \"f20a\", \"M464 64H48C21.5 64 0 85.5 0 112v288c0 26.5 21.5 48 48 48h416c26.5 0 48-21.5 48-48V112c0-26.5-21.5-48-48-48zm-6 336H54c-3.3 0-6-2.7-6-6V118c0-3.3 2.7-6 6-6h404c3.3 0 6 2.7 6 6v276c0 3.3-2.7 6-6 6zm-211.1-85.7c1.7 2.4 1.5 5.6-.5 7.7-53.6 56.8-172.8 32.1-172.8-67.9 0-97.3 121.7-119.5 172.5-70.1 2.1 2 2.5 3.2 1 5.7l-17.5 30.5c-1.9 3.1-6.2 4-9.1 1.7-40.8-32-94.6-14.9-94.6 31.2 0 48 51 70.5 92.2 32.6 2.8-2.5 7.1-2.1 9.2.9l19.6 27.7zm190.4 0c1.7 2.4 1.5 5.6-.5 7.7-53.6 56.9-172.8 32.1-172.8-67.9 0-97.3 121.7-119.5 172.5-70.1 2.1 2 2.5 3.2 1 5.7L420 220.2c-1.9 3.1-6.2 4-9.1 1.7-40.8-32-94.6-14.9-94.6 31.2 0 48 51 70.5 92.2 32.6 2.8-2.5 7.1-2.1 9.2.9l19.6 27.7z\"]\n};\nvar faComment = {\n prefix: 'far',\n iconName: 'comment',\n icon: [512, 512, [], \"f075\", \"M256 32C114.6 32 0 125.1 0 240c0 47.6 19.9 91.2 52.9 126.3C38 405.7 7 439.1 6.5 439.5c-6.6 7-8.4 17.2-4.6 26S14.4 480 24 480c61.5 0 110-25.7 139.1-46.3C192 442.8 223.2 448 256 448c141.4 0 256-93.1 256-208S397.4 32 256 32zm0 368c-26.7 0-53.1-4.1-78.4-12.1l-22.7-7.2-19.5 13.8c-14.3 10.1-33.9 21.4-57.5 29 7.3-12.1 14.4-25.7 19.9-40.2l10.6-28.1-20.6-21.8C69.7 314.1 48 282.2 48 240c0-88.2 93.3-160 208-160s208 71.8 208 160-93.3 160-208 160z\"]\n};\nvar faCommentAlt = {\n prefix: 'far',\n iconName: 'comment-alt',\n icon: [512, 512, [], \"f27a\", \"M448 0H64C28.7 0 0 28.7 0 64v288c0 35.3 28.7 64 64 64h96v84c0 7.1 5.8 12 12 12 2.4 0 4.9-.7 7.1-2.4L304 416h144c35.3 0 64-28.7 64-64V64c0-35.3-28.7-64-64-64zm16 352c0 8.8-7.2 16-16 16H288l-12.8 9.6L208 428v-60H64c-8.8 0-16-7.2-16-16V64c0-8.8 7.2-16 16-16h384c8.8 0 16 7.2 16 16v288z\"]\n};\nvar faCommentDots = {\n prefix: 'far',\n iconName: 'comment-dots',\n icon: [512, 512, [], \"f4ad\", \"M144 208c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32zm112 0c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32zm112 0c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32zM256 32C114.6 32 0 125.1 0 240c0 47.6 19.9 91.2 52.9 126.3C38 405.7 7 439.1 6.5 439.5c-6.6 7-8.4 17.2-4.6 26S14.4 480 24 480c61.5 0 110-25.7 139.1-46.3C192 442.8 223.2 448 256 448c141.4 0 256-93.1 256-208S397.4 32 256 32zm0 368c-26.7 0-53.1-4.1-78.4-12.1l-22.7-7.2-19.5 13.8c-14.3 10.1-33.9 21.4-57.5 29 7.3-12.1 14.4-25.7 19.9-40.2l10.6-28.1-20.6-21.8C69.7 314.1 48 282.2 48 240c0-88.2 93.3-160 208-160s208 71.8 208 160-93.3 160-208 160z\"]\n};\nvar faComments = {\n prefix: 'far',\n iconName: 'comments',\n icon: [576, 512, [], \"f086\", \"M532 386.2c27.5-27.1 44-61.1 44-98.2 0-80-76.5-146.1-176.2-157.9C368.3 72.5 294.3 32 208 32 93.1 32 0 103.6 0 192c0 37 16.5 71 44 98.2-15.3 30.7-37.3 54.5-37.7 54.9-6.3 6.7-8.1 16.5-4.4 25 3.6 8.5 12 14 21.2 14 53.5 0 96.7-20.2 125.2-38.8 9.2 2.1 18.7 3.7 28.4 4.9C208.1 407.6 281.8 448 368 448c20.8 0 40.8-2.4 59.8-6.8C456.3 459.7 499.4 480 553 480c9.2 0 17.5-5.5 21.2-14 3.6-8.5 1.9-18.3-4.4-25-.4-.3-22.5-24.1-37.8-54.8zm-392.8-92.3L122.1 305c-14.1 9.1-28.5 16.3-43.1 21.4 2.7-4.7 5.4-9.7 8-14.8l15.5-31.1L77.7 256C64.2 242.6 48 220.7 48 192c0-60.7 73.3-112 160-112s160 51.3 160 112-73.3 112-160 112c-16.5 0-33-1.9-49-5.6l-19.8-4.5zM498.3 352l-24.7 24.4 15.5 31.1c2.6 5.1 5.3 10.1 8 14.8-14.6-5.1-29-12.3-43.1-21.4l-17.1-11.1-19.9 4.6c-16 3.7-32.5 5.6-49 5.6-54 0-102.2-20.1-131.3-49.7C338 339.5 416 272.9 416 192c0-3.4-.4-6.7-.7-10C479.7 196.5 528 238.8 528 288c0 28.7-16.2 50.6-29.7 64z\"]\n};\nvar faCompass = {\n prefix: 'far',\n iconName: 'compass',\n icon: [496, 512, [], \"f14e\", \"M347.94 129.86L203.6 195.83a31.938 31.938 0 0 0-15.77 15.77l-65.97 144.34c-7.61 16.65 9.54 33.81 26.2 26.2l144.34-65.97a31.938 31.938 0 0 0 15.77-15.77l65.97-144.34c7.61-16.66-9.54-33.81-26.2-26.2zm-77.36 148.72c-12.47 12.47-32.69 12.47-45.16 0-12.47-12.47-12.47-32.69 0-45.16 12.47-12.47 32.69-12.47 45.16 0 12.47 12.47 12.47 32.69 0 45.16zM248 8C111.03 8 0 119.03 0 256s111.03 248 248 248 248-111.03 248-248S384.97 8 248 8zm0 448c-110.28 0-200-89.72-200-200S137.72 56 248 56s200 89.72 200 200-89.72 200-200 200z\"]\n};\nvar faCopy = {\n prefix: 'far',\n iconName: 'copy',\n icon: [448, 512, [], \"f0c5\", \"M433.941 65.941l-51.882-51.882A48 48 0 0 0 348.118 0H176c-26.51 0-48 21.49-48 48v48H48c-26.51 0-48 21.49-48 48v320c0 26.51 21.49 48 48 48h224c26.51 0 48-21.49 48-48v-48h80c26.51 0 48-21.49 48-48V99.882a48 48 0 0 0-14.059-33.941zM266 464H54a6 6 0 0 1-6-6V150a6 6 0 0 1 6-6h74v224c0 26.51 21.49 48 48 48h96v42a6 6 0 0 1-6 6zm128-96H182a6 6 0 0 1-6-6V54a6 6 0 0 1 6-6h106v88c0 13.255 10.745 24 24 24h88v202a6 6 0 0 1-6 6zm6-256h-64V48h9.632c1.591 0 3.117.632 4.243 1.757l48.368 48.368a6 6 0 0 1 1.757 4.243V112z\"]\n};\nvar faCopyright = {\n prefix: 'far',\n iconName: 'copyright',\n icon: [512, 512, [], \"f1f9\", \"M256 8C119.033 8 8 119.033 8 256s111.033 248 248 248 248-111.033 248-248S392.967 8 256 8zm0 448c-110.532 0-200-89.451-200-200 0-110.531 89.451-200 200-200 110.532 0 200 89.451 200 200 0 110.532-89.451 200-200 200zm107.351-101.064c-9.614 9.712-45.53 41.396-104.065 41.396-82.43 0-140.484-61.425-140.484-141.567 0-79.152 60.275-139.401 139.762-139.401 55.531 0 88.738 26.62 97.593 34.779a11.965 11.965 0 0 1 1.936 15.322l-18.155 28.113c-3.841 5.95-11.966 7.282-17.499 2.921-8.595-6.776-31.814-22.538-61.708-22.538-48.303 0-77.916 35.33-77.916 80.082 0 41.589 26.888 83.692 78.277 83.692 32.657 0 56.843-19.039 65.726-27.225 5.27-4.857 13.596-4.039 17.82 1.738l19.865 27.17a11.947 11.947 0 0 1-1.152 15.518z\"]\n};\nvar faCreditCard = {\n prefix: 'far',\n iconName: 'credit-card',\n icon: [576, 512, [], \"f09d\", \"M527.9 32H48.1C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48.1 48h479.8c26.6 0 48.1-21.5 48.1-48V80c0-26.5-21.5-48-48.1-48zM54.1 80h467.8c3.3 0 6 2.7 6 6v42H48.1V86c0-3.3 2.7-6 6-6zm467.8 352H54.1c-3.3 0-6-2.7-6-6V256h479.8v170c0 3.3-2.7 6-6 6zM192 332v40c0 6.6-5.4 12-12 12h-72c-6.6 0-12-5.4-12-12v-40c0-6.6 5.4-12 12-12h72c6.6 0 12 5.4 12 12zm192 0v40c0 6.6-5.4 12-12 12H236c-6.6 0-12-5.4-12-12v-40c0-6.6 5.4-12 12-12h136c6.6 0 12 5.4 12 12z\"]\n};\nvar faDizzy = {\n prefix: 'far',\n iconName: 'dizzy',\n icon: [496, 512, [], \"f567\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm-33.8-217.9c7.8-7.8 7.8-20.5 0-28.3L196.3 192l17.9-17.9c7.8-7.8 7.8-20.5 0-28.3-7.8-7.8-20.5-7.8-28.3 0L168 163.7l-17.8-17.8c-7.8-7.8-20.5-7.8-28.3 0-7.8 7.8-7.8 20.5 0 28.3l17.9 17.9-17.9 17.9c-7.8 7.8-7.8 20.5 0 28.3 7.8 7.8 20.5 7.8 28.3 0l17.8-17.8 17.8 17.8c7.9 7.7 20.5 7.7 28.4-.2zm160-92.2c-7.8-7.8-20.5-7.8-28.3 0L328 163.7l-17.8-17.8c-7.8-7.8-20.5-7.8-28.3 0-7.8 7.8-7.8 20.5 0 28.3l17.9 17.9-17.9 17.9c-7.8 7.8-7.8 20.5 0 28.3 7.8 7.8 20.5 7.8 28.3 0l17.8-17.8 17.8 17.8c7.8 7.8 20.5 7.8 28.3 0 7.8-7.8 7.8-20.5 0-28.3l-17.8-18 17.9-17.9c7.7-7.8 7.7-20.4 0-28.2zM248 272c-35.3 0-64 28.7-64 64s28.7 64 64 64 64-28.7 64-64-28.7-64-64-64z\"]\n};\nvar faDotCircle = {\n prefix: 'far',\n iconName: 'dot-circle',\n icon: [512, 512, [], \"f192\", \"M256 56c110.532 0 200 89.451 200 200 0 110.532-89.451 200-200 200-110.532 0-200-89.451-200-200 0-110.532 89.451-200 200-200m0-48C119.033 8 8 119.033 8 256s111.033 248 248 248 248-111.033 248-248S392.967 8 256 8zm0 168c-44.183 0-80 35.817-80 80s35.817 80 80 80 80-35.817 80-80-35.817-80-80-80z\"]\n};\nvar faEdit = {\n prefix: 'far',\n iconName: 'edit',\n icon: [576, 512, [], \"f044\", \"M402.3 344.9l32-32c5-5 13.7-1.5 13.7 5.7V464c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V112c0-26.5 21.5-48 48-48h273.5c7.1 0 10.7 8.6 5.7 13.7l-32 32c-1.5 1.5-3.5 2.3-5.7 2.3H48v352h352V350.5c0-2.1.8-4.1 2.3-5.6zm156.6-201.8L296.3 405.7l-90.4 10c-26.2 2.9-48.5-19.2-45.6-45.6l10-90.4L432.9 17.1c22.9-22.9 59.9-22.9 82.7 0l43.2 43.2c22.9 22.9 22.9 60 .1 82.8zM460.1 174L402 115.9 216.2 301.8l-7.3 65.3 65.3-7.3L460.1 174zm64.8-79.7l-43.2-43.2c-4.1-4.1-10.8-4.1-14.8 0L436 82l58.1 58.1 30.9-30.9c4-4.2 4-10.8-.1-14.9z\"]\n};\nvar faEnvelope = {\n prefix: 'far',\n iconName: 'envelope',\n icon: [512, 512, [], \"f0e0\", \"M464 64H48C21.49 64 0 85.49 0 112v288c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48V112c0-26.51-21.49-48-48-48zm0 48v40.805c-22.422 18.259-58.168 46.651-134.587 106.49-16.841 13.247-50.201 45.072-73.413 44.701-23.208.375-56.579-31.459-73.413-44.701C106.18 199.465 70.425 171.067 48 152.805V112h416zM48 400V214.398c22.914 18.251 55.409 43.862 104.938 82.646 21.857 17.205 60.134 55.186 103.062 54.955 42.717.231 80.509-37.199 103.053-54.947 49.528-38.783 82.032-64.401 104.947-82.653V400H48z\"]\n};\nvar faEnvelopeOpen = {\n prefix: 'far',\n iconName: 'envelope-open',\n icon: [512, 512, [], \"f2b6\", \"M494.586 164.516c-4.697-3.883-111.723-89.95-135.251-108.657C337.231 38.191 299.437 0 256 0c-43.205 0-80.636 37.717-103.335 55.859-24.463 19.45-131.07 105.195-135.15 108.549A48.004 48.004 0 0 0 0 201.485V464c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48V201.509a48 48 0 0 0-17.414-36.993zM464 458a6 6 0 0 1-6 6H54a6 6 0 0 1-6-6V204.347c0-1.813.816-3.526 2.226-4.665 15.87-12.814 108.793-87.554 132.364-106.293C200.755 78.88 232.398 48 256 48c23.693 0 55.857 31.369 73.41 45.389 23.573 18.741 116.503 93.493 132.366 106.316a5.99 5.99 0 0 1 2.224 4.663V458zm-31.991-187.704c4.249 5.159 3.465 12.795-1.745 16.981-28.975 23.283-59.274 47.597-70.929 56.863C336.636 362.283 299.205 400 256 400c-43.452 0-81.287-38.237-103.335-55.86-11.279-8.967-41.744-33.413-70.927-56.865-5.21-4.187-5.993-11.822-1.745-16.981l15.258-18.528c4.178-5.073 11.657-5.843 16.779-1.726 28.618 23.001 58.566 47.035 70.56 56.571C200.143 320.631 232.307 352 256 352c23.602 0 55.246-30.88 73.41-45.389 11.994-9.535 41.944-33.57 70.563-56.568 5.122-4.116 12.601-3.346 16.778 1.727l15.258 18.526z\"]\n};\nvar faEye = {\n prefix: 'far',\n iconName: 'eye',\n icon: [576, 512, [], \"f06e\", \"M288 144a110.94 110.94 0 0 0-31.24 5 55.4 55.4 0 0 1 7.24 27 56 56 0 0 1-56 56 55.4 55.4 0 0 1-27-7.24A111.71 111.71 0 1 0 288 144zm284.52 97.4C518.29 135.59 410.93 64 288 64S57.68 135.64 3.48 241.41a32.35 32.35 0 0 0 0 29.19C57.71 376.41 165.07 448 288 448s230.32-71.64 284.52-177.41a32.35 32.35 0 0 0 0-29.19zM288 400c-98.65 0-189.09-55-237.93-144C98.91 167 189.34 112 288 112s189.09 55 237.93 144C477.1 345 386.66 400 288 400z\"]\n};\nvar faEyeSlash = {\n prefix: 'far',\n iconName: 'eye-slash',\n icon: [640, 512, [], \"f070\", \"M634 471L36 3.51A16 16 0 0 0 13.51 6l-10 12.49A16 16 0 0 0 6 41l598 467.49a16 16 0 0 0 22.49-2.49l10-12.49A16 16 0 0 0 634 471zM296.79 146.47l134.79 105.38C429.36 191.91 380.48 144 320 144a112.26 112.26 0 0 0-23.21 2.47zm46.42 219.07L208.42 260.16C210.65 320.09 259.53 368 320 368a113 113 0 0 0 23.21-2.46zM320 112c98.65 0 189.09 55 237.93 144a285.53 285.53 0 0 1-44 60.2l37.74 29.5a333.7 333.7 0 0 0 52.9-75.11 32.35 32.35 0 0 0 0-29.19C550.29 135.59 442.93 64 320 64c-36.7 0-71.71 7-104.63 18.81l46.41 36.29c18.94-4.3 38.34-7.1 58.22-7.1zm0 288c-98.65 0-189.08-55-237.93-144a285.47 285.47 0 0 1 44.05-60.19l-37.74-29.5a333.6 333.6 0 0 0-52.89 75.1 32.35 32.35 0 0 0 0 29.19C89.72 376.41 197.08 448 320 448c36.7 0 71.71-7.05 104.63-18.81l-46.41-36.28C359.28 397.2 339.89 400 320 400z\"]\n};\nvar faFile = {\n prefix: 'far',\n iconName: 'file',\n icon: [384, 512, [], \"f15b\", \"M369.9 97.9L286 14C277 5 264.8-.1 252.1-.1H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V131.9c0-12.7-5.1-25-14.1-34zM332.1 128H256V51.9l76.1 76.1zM48 464V48h160v104c0 13.3 10.7 24 24 24h104v288H48z\"]\n};\nvar faFileAlt = {\n prefix: 'far',\n iconName: 'file-alt',\n icon: [384, 512, [], \"f15c\", \"M288 248v28c0 6.6-5.4 12-12 12H108c-6.6 0-12-5.4-12-12v-28c0-6.6 5.4-12 12-12h168c6.6 0 12 5.4 12 12zm-12 72H108c-6.6 0-12 5.4-12 12v28c0 6.6 5.4 12 12 12h168c6.6 0 12-5.4 12-12v-28c0-6.6-5.4-12-12-12zm108-188.1V464c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V48C0 21.5 21.5 0 48 0h204.1C264.8 0 277 5.1 286 14.1L369.9 98c9 8.9 14.1 21.2 14.1 33.9zm-128-80V128h76.1L256 51.9zM336 464V176H232c-13.3 0-24-10.7-24-24V48H48v416h288z\"]\n};\nvar faFileArchive = {\n prefix: 'far',\n iconName: 'file-archive',\n icon: [384, 512, [], \"f1c6\", \"M128.3 160v32h32v-32zm64-96h-32v32h32zm-64 32v32h32V96zm64 32h-32v32h32zm177.6-30.1L286 14C277 5 264.8-.1 252.1-.1H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V131.9c0-12.7-5.1-25-14.1-34zM256 51.9l76.1 76.1H256zM336 464H48V48h79.7v16h32V48H208v104c0 13.3 10.7 24 24 24h104zM194.2 265.7c-1.1-5.6-6-9.7-11.8-9.7h-22.1v-32h-32v32l-19.7 97.1C102 385.6 126.8 416 160 416c33.1 0 57.9-30.2 51.5-62.6zm-33.9 124.4c-17.9 0-32.4-12.1-32.4-27s14.5-27 32.4-27 32.4 12.1 32.4 27-14.5 27-32.4 27zm32-198.1h-32v32h32z\"]\n};\nvar faFileAudio = {\n prefix: 'far',\n iconName: 'file-audio',\n icon: [384, 512, [], \"f1c7\", \"M369.941 97.941l-83.882-83.882A48 48 0 0 0 252.118 0H48C21.49 0 0 21.49 0 48v416c0 26.51 21.49 48 48 48h288c26.51 0 48-21.49 48-48V131.882a48 48 0 0 0-14.059-33.941zM332.118 128H256V51.882L332.118 128zM48 464V48h160v104c0 13.255 10.745 24 24 24h104v288H48zm144-76.024c0 10.691-12.926 16.045-20.485 8.485L136 360.486h-28c-6.627 0-12-5.373-12-12v-56c0-6.627 5.373-12 12-12h28l35.515-36.947c7.56-7.56 20.485-2.206 20.485 8.485v135.952zm41.201-47.13c9.051-9.297 9.06-24.133.001-33.439-22.149-22.752 12.235-56.246 34.395-33.481 27.198 27.94 27.212 72.444.001 100.401-21.793 22.386-56.947-10.315-34.397-33.481z\"]\n};\nvar faFileCode = {\n prefix: 'far',\n iconName: 'file-code',\n icon: [384, 512, [], \"f1c9\", \"M149.9 349.1l-.2-.2-32.8-28.9 32.8-28.9c3.6-3.2 4-8.8.8-12.4l-.2-.2-17.4-18.6c-3.4-3.6-9-3.7-12.4-.4l-57.7 54.1c-3.7 3.5-3.7 9.4 0 12.8l57.7 54.1c1.6 1.5 3.8 2.4 6 2.4 2.4 0 4.8-1 6.4-2.8l17.4-18.6c3.3-3.5 3.1-9.1-.4-12.4zm220-251.2L286 14C277 5 264.8-.1 252.1-.1H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V131.9c0-12.7-5.1-25-14.1-34zM256 51.9l76.1 76.1H256zM336 464H48V48h160v104c0 13.3 10.7 24 24 24h104zM209.6 214c-4.7-1.4-9.5 1.3-10.9 6L144 408.1c-1.4 4.7 1.3 9.6 6 10.9l24.4 7.1c4.7 1.4 9.6-1.4 10.9-6L240 231.9c1.4-4.7-1.3-9.6-6-10.9zm24.5 76.9l.2.2 32.8 28.9-32.8 28.9c-3.6 3.2-4 8.8-.8 12.4l.2.2 17.4 18.6c3.3 3.5 8.9 3.7 12.4.4l57.7-54.1c3.7-3.5 3.7-9.4 0-12.8l-57.7-54.1c-3.5-3.3-9.1-3.2-12.4.4l-17.4 18.6c-3.3 3.5-3.1 9.1.4 12.4z\"]\n};\nvar faFileExcel = {\n prefix: 'far',\n iconName: 'file-excel',\n icon: [384, 512, [], \"f1c3\", \"M369.9 97.9L286 14C277 5 264.8-.1 252.1-.1H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V131.9c0-12.7-5.1-25-14.1-34zM332.1 128H256V51.9l76.1 76.1zM48 464V48h160v104c0 13.3 10.7 24 24 24h104v288H48zm212-240h-28.8c-4.4 0-8.4 2.4-10.5 6.3-18 33.1-22.2 42.4-28.6 57.7-13.9-29.1-6.9-17.3-28.6-57.7-2.1-3.9-6.2-6.3-10.6-6.3H124c-9.3 0-15 10-10.4 18l46.3 78-46.3 78c-4.7 8 1.1 18 10.4 18h28.9c4.4 0 8.4-2.4 10.5-6.3 21.7-40 23-45 28.6-57.7 14.9 30.2 5.9 15.9 28.6 57.7 2.1 3.9 6.2 6.3 10.6 6.3H260c9.3 0 15-10 10.4-18L224 320c.7-1.1 30.3-50.5 46.3-78 4.7-8-1.1-18-10.3-18z\"]\n};\nvar faFileImage = {\n prefix: 'far',\n iconName: 'file-image',\n icon: [384, 512, [], \"f1c5\", \"M369.9 97.9L286 14C277 5 264.8-.1 252.1-.1H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V131.9c0-12.7-5.1-25-14.1-34zM332.1 128H256V51.9l76.1 76.1zM48 464V48h160v104c0 13.3 10.7 24 24 24h104v288H48zm32-48h224V288l-23.5-23.5c-4.7-4.7-12.3-4.7-17 0L176 352l-39.5-39.5c-4.7-4.7-12.3-4.7-17 0L80 352v64zm48-240c-26.5 0-48 21.5-48 48s21.5 48 48 48 48-21.5 48-48-21.5-48-48-48z\"]\n};\nvar faFilePdf = {\n prefix: 'far',\n iconName: 'file-pdf',\n icon: [384, 512, [], \"f1c1\", \"M369.9 97.9L286 14C277 5 264.8-.1 252.1-.1H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V131.9c0-12.7-5.1-25-14.1-34zM332.1 128H256V51.9l76.1 76.1zM48 464V48h160v104c0 13.3 10.7 24 24 24h104v288H48zm250.2-143.7c-12.2-12-47-8.7-64.4-6.5-17.2-10.5-28.7-25-36.8-46.3 3.9-16.1 10.1-40.6 5.4-56-4.2-26.2-37.8-23.6-42.6-5.9-4.4 16.1-.4 38.5 7 67.1-10 23.9-24.9 56-35.4 74.4-20 10.3-47 26.2-51 46.2-3.3 15.8 26 55.2 76.1-31.2 22.4-7.4 46.8-16.5 68.4-20.1 18.9 10.2 41 17 55.8 17 25.5 0 28-28.2 17.5-38.7zm-198.1 77.8c5.1-13.7 24.5-29.5 30.4-35-19 30.3-30.4 35.7-30.4 35zm81.6-190.6c7.4 0 6.7 32.1 1.8 40.8-4.4-13.9-4.3-40.8-1.8-40.8zm-24.4 136.6c9.7-16.9 18-37 24.7-54.7 8.3 15.1 18.9 27.2 30.1 35.5-20.8 4.3-38.9 13.1-54.8 19.2zm131.6-5s-5 6-37.3-7.8c35.1-2.6 40.9 5.4 37.3 7.8z\"]\n};\nvar faFilePowerpoint = {\n prefix: 'far',\n iconName: 'file-powerpoint',\n icon: [384, 512, [], \"f1c4\", \"M369.9 97.9L286 14C277 5 264.8-.1 252.1-.1H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V131.9c0-12.7-5.1-25-14.1-34zM332.1 128H256V51.9l76.1 76.1zM48 464V48h160v104c0 13.3 10.7 24 24 24h104v288H48zm72-60V236c0-6.6 5.4-12 12-12h69.2c36.7 0 62.8 27 62.8 66.3 0 74.3-68.7 66.5-95.5 66.5V404c0 6.6-5.4 12-12 12H132c-6.6 0-12-5.4-12-12zm48.5-87.4h23c7.9 0 13.9-2.4 18.1-7.2 8.5-9.8 8.4-28.5.1-37.8-4.1-4.6-9.9-7-17.4-7h-23.9v52z\"]\n};\nvar faFileVideo = {\n prefix: 'far',\n iconName: 'file-video',\n icon: [384, 512, [], \"f1c8\", \"M369.941 97.941l-83.882-83.882A48 48 0 0 0 252.118 0H48C21.49 0 0 21.49 0 48v416c0 26.51 21.49 48 48 48h288c26.51 0 48-21.49 48-48V131.882a48 48 0 0 0-14.059-33.941zM332.118 128H256V51.882L332.118 128zM48 464V48h160v104c0 13.255 10.745 24 24 24h104v288H48zm228.687-211.303L224 305.374V268c0-11.046-8.954-20-20-20H100c-11.046 0-20 8.954-20 20v104c0 11.046 8.954 20 20 20h104c11.046 0 20-8.954 20-20v-37.374l52.687 52.674C286.704 397.318 304 390.28 304 375.986V264.011c0-14.311-17.309-21.319-27.313-11.314z\"]\n};\nvar faFileWord = {\n prefix: 'far',\n iconName: 'file-word',\n icon: [384, 512, [], \"f1c2\", \"M369.9 97.9L286 14C277 5 264.8-.1 252.1-.1H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V131.9c0-12.7-5.1-25-14.1-34zM332.1 128H256V51.9l76.1 76.1zM48 464V48h160v104c0 13.3 10.7 24 24 24h104v288H48zm220.1-208c-5.7 0-10.6 4-11.7 9.5-20.6 97.7-20.4 95.4-21 103.5-.2-1.2-.4-2.6-.7-4.3-.8-5.1.3.2-23.6-99.5-1.3-5.4-6.1-9.2-11.7-9.2h-13.3c-5.5 0-10.3 3.8-11.7 9.1-24.4 99-24 96.2-24.8 103.7-.1-1.1-.2-2.5-.5-4.2-.7-5.2-14.1-73.3-19.1-99-1.1-5.6-6-9.7-11.8-9.7h-16.8c-7.8 0-13.5 7.3-11.7 14.8 8 32.6 26.7 109.5 33.2 136 1.3 5.4 6.1 9.1 11.7 9.1h25.2c5.5 0 10.3-3.7 11.6-9.1l17.9-71.4c1.5-6.2 2.5-12 3-17.3l2.9 17.3c.1.4 12.6 50.5 17.9 71.4 1.3 5.3 6.1 9.1 11.6 9.1h24.7c5.5 0 10.3-3.7 11.6-9.1 20.8-81.9 30.2-119 34.5-136 1.9-7.6-3.8-14.9-11.6-14.9h-15.8z\"]\n};\nvar faFlag = {\n prefix: 'far',\n iconName: 'flag',\n icon: [512, 512, [], \"f024\", \"M336.174 80c-49.132 0-93.305-32-161.913-32-31.301 0-58.303 6.482-80.721 15.168a48.04 48.04 0 0 0 2.142-20.727C93.067 19.575 74.167 1.594 51.201.104 23.242-1.71 0 20.431 0 48c0 17.764 9.657 33.262 24 41.562V496c0 8.837 7.163 16 16 16h16c8.837 0 16-7.163 16-16v-83.443C109.869 395.28 143.259 384 199.826 384c49.132 0 93.305 32 161.913 32 58.479 0 101.972-22.617 128.548-39.981C503.846 367.161 512 352.051 512 335.855V95.937c0-34.459-35.264-57.768-66.904-44.117C409.193 67.309 371.641 80 336.174 80zM464 336c-21.783 15.412-60.824 32-102.261 32-59.945 0-102.002-32-161.913-32-43.361 0-96.379 9.403-127.826 24V128c21.784-15.412 60.824-32 102.261-32 59.945 0 102.002 32 161.913 32 43.271 0 96.32-17.366 127.826-32v240z\"]\n};\nvar faFlushed = {\n prefix: 'far',\n iconName: 'flushed',\n icon: [496, 512, [], \"f579\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm96-312c-44.2 0-80 35.8-80 80s35.8 80 80 80 80-35.8 80-80-35.8-80-80-80zm0 128c-26.5 0-48-21.5-48-48s21.5-48 48-48 48 21.5 48 48-21.5 48-48 48zm0-72c-13.3 0-24 10.7-24 24s10.7 24 24 24 24-10.7 24-24-10.7-24-24-24zm-112 24c0-44.2-35.8-80-80-80s-80 35.8-80 80 35.8 80 80 80 80-35.8 80-80zm-80 48c-26.5 0-48-21.5-48-48s21.5-48 48-48 48 21.5 48 48-21.5 48-48 48zm0-72c-13.3 0-24 10.7-24 24s10.7 24 24 24 24-10.7 24-24-10.7-24-24-24zm160 144H184c-13.2 0-24 10.8-24 24s10.8 24 24 24h128c13.2 0 24-10.8 24-24s-10.8-24-24-24z\"]\n};\nvar faFolder = {\n prefix: 'far',\n iconName: 'folder',\n icon: [512, 512, [], \"f07b\", \"M464 128H272l-54.63-54.63c-6-6-14.14-9.37-22.63-9.37H48C21.49 64 0 85.49 0 112v288c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48V176c0-26.51-21.49-48-48-48zm0 272H48V112h140.12l54.63 54.63c6 6 14.14 9.37 22.63 9.37H464v224z\"]\n};\nvar faFolderOpen = {\n prefix: 'far',\n iconName: 'folder-open',\n icon: [576, 512, [], \"f07c\", \"M527.9 224H480v-48c0-26.5-21.5-48-48-48H272l-64-64H48C21.5 64 0 85.5 0 112v288c0 26.5 21.5 48 48 48h400c16.5 0 31.9-8.5 40.7-22.6l79.9-128c20-31.9-3-73.4-40.7-73.4zM48 118c0-3.3 2.7-6 6-6h134.1l64 64H426c3.3 0 6 2.7 6 6v42H152c-16.8 0-32.4 8.8-41.1 23.2L48 351.4zm400 282H72l77.2-128H528z\"]\n};\nvar faFontAwesomeLogoFull = {\n prefix: 'far',\n iconName: 'font-awesome-logo-full',\n icon: [3992, 512, [\"Font Awesome\"], \"f4e6\", \"M454.6 0H57.4C25.9 0 0 25.9 0 57.4v397.3C0 486.1 25.9 512 57.4 512h397.3c31.4 0 57.4-25.9 57.4-57.4V57.4C512 25.9 486.1 0 454.6 0zm-58.9 324.9c0 4.8-4.1 6.9-8.9 8.9-19.2 8.1-39.7 15.7-61.5 15.7-40.5 0-68.7-44.8-163.2 2.5v51.8c0 30.3-45.7 30.2-45.7 0v-250c-9-7-15-17.9-15-30.3 0-21 17.1-38.2 38.2-38.2 21 0 38.2 17.1 38.2 38.2 0 12.2-5.8 23.2-14.9 30.2v21c37.1-12 65.5-34.4 146.1-3.4 26.6 11.4 68.7-15.7 76.5-15.7 5.5 0 10.3 4.1 10.3 8.9v160.4zm432.9-174.2h-137v70.1H825c39.8 0 40.4 62.2 0 62.2H691.6v105.6c0 45.5-70.7 46.4-70.7 0V128.3c0-22 18-39.8 39.8-39.8h167.8c39.6 0 40.5 62.2.1 62.2zm191.1 23.4c-169.3 0-169.1 252.4 0 252.4 169.9 0 169.9-252.4 0-252.4zm0 196.1c-81.6 0-82.1-139.8 0-139.8 82.5 0 82.4 139.8 0 139.8zm372.4 53.4c-17.5 0-31.4-13.9-31.4-31.4v-117c0-62.4-72.6-52.5-99.1-16.4v133.4c0 41.5-63.3 41.8-63.3 0V208c0-40 63.1-41.6 63.1 0v3.4c43.3-51.6 162.4-60.4 162.4 39.3v141.5c.3 30.4-31.5 31.4-31.7 31.4zm179.7 2.9c-44.3 0-68.3-22.9-68.3-65.8V235.2H1488c-35.6 0-36.7-55.3 0-55.3h15.5v-37.3c0-41.3 63.8-42.1 63.8 0v37.5h24.9c35.4 0 35.7 55.3 0 55.3h-24.9v108.5c0 29.6 26.1 26.3 27.4 26.3 31.4 0 52.6 56.3-22.9 56.3zM1992 123c-19.5-50.2-95.5-50-114.5 0-107.3 275.7-99.5 252.7-99.5 262.8 0 42.8 58.3 51.2 72.1 14.4l13.5-35.9H2006l13 35.9c14.2 37.7 72.1 27.2 72.1-14.4 0-10.1 5.3 6.8-99.1-262.8zm-108.9 179.1l51.7-142.9 51.8 142.9h-103.5zm591.3-85.6l-53.7 176.3c-12.4 41.2-72 41-84 0l-42.3-135.9-42.3 135.9c-12.4 40.9-72 41.2-84.5 0l-54.2-176.3c-12.5-39.4 49.8-56.1 60.2-16.9L2213 342l45.3-139.5c10.9-32.7 59.6-34.7 71.2 0l45.3 139.5 39.3-142.4c10.3-38.3 72.6-23.8 60.3 16.9zm275.4 75.1c0-42.4-33.9-117.5-119.5-117.5-73.2 0-124.4 56.3-124.4 126 0 77.2 55.3 126.4 128.5 126.4 31.7 0 93-11.5 93-39.8 0-18.3-21.1-31.5-39.3-22.4-49.4 26.2-109 8.4-115.9-43.8h148.3c16.3 0 29.3-13.4 29.3-28.9zM2571 277.7c9.5-73.4 113.9-68.6 118.6 0H2571zm316.7 148.8c-31.4 0-81.6-10.5-96.6-31.9-12.4-17 2.5-39.8 21.8-39.8 16.3 0 36.8 22.9 77.7 22.9 27.4 0 40.4-11 40.4-25.8 0-39.8-142.9-7.4-142.9-102 0-40.4 35.3-75.7 98.6-75.7 31.4 0 74.1 9.9 87.6 29.4 10.8 14.8-1.4 36.2-20.9 36.2-15.1 0-26.7-17.3-66.2-17.3-22.9 0-37.8 10.5-37.8 23.8 0 35.9 142.4 6 142.4 103.1-.1 43.7-37.4 77.1-104.1 77.1zm266.8-252.4c-169.3 0-169.1 252.4 0 252.4 170.1 0 169.6-252.4 0-252.4zm0 196.1c-81.8 0-82-139.8 0-139.8 82.5 0 82.4 139.8 0 139.8zm476.9 22V268.7c0-53.8-61.4-45.8-85.7-10.5v134c0 41.3-63.8 42.1-63.8 0V268.7c0-52.1-59.5-47.4-85.7-10.1v133.6c0 41.5-63.3 41.8-63.3 0V208c0-40 63.1-41.6 63.1 0v3.4c9.9-14.4 41.8-37.3 78.6-37.3 35.3 0 57.7 16.4 66.7 43.8 13.9-21.8 45.8-43.8 82.6-43.8 44.3 0 70.7 23.4 70.7 72.7v145.3c.5 17.3-13.5 31.4-31.9 31.4 3.5.1-31.3 1.1-31.3-31.3zM3992 291.6c0-42.4-32.4-117.5-117.9-117.5-73.2 0-127.5 56.3-127.5 126 0 77.2 58.3 126.4 131.6 126.4 31.7 0 91.5-11.5 91.5-39.8 0-18.3-21.1-31.5-39.3-22.4-49.4 26.2-110.5 8.4-117.5-43.8h149.8c16.3 0 29.1-13.4 29.3-28.9zm-180.5-13.9c9.7-74.4 115.9-68.3 120.1 0h-120.1z\"]\n};\nvar faFrown = {\n prefix: 'far',\n iconName: 'frown',\n icon: [496, 512, [], \"f119\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm-80-216c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32zm160-64c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32zm-80 128c-40.2 0-78 17.7-103.8 48.6-8.5 10.2-7.1 25.3 3.1 33.8 10.2 8.4 25.3 7.1 33.8-3.1 16.6-19.9 41-31.4 66.9-31.4s50.3 11.4 66.9 31.4c8.1 9.7 23.1 11.9 33.8 3.1 10.2-8.5 11.5-23.6 3.1-33.8C326 321.7 288.2 304 248 304z\"]\n};\nvar faFrownOpen = {\n prefix: 'far',\n iconName: 'frown-open',\n icon: [496, 512, [], \"f57a\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm-48-248c0-17.7-14.3-32-32-32s-32 14.3-32 32 14.3 32 32 32 32-14.3 32-32zm128-32c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32zm-80 112c-35.6 0-88.8 21.3-95.8 61.2-2 11.8 9 21.5 20.5 18.1 31.2-9.6 59.4-15.3 75.3-15.3s44.1 5.7 75.3 15.3c11.4 3.5 22.5-6.3 20.5-18.1-7-39.9-60.2-61.2-95.8-61.2z\"]\n};\nvar faFutbol = {\n prefix: 'far',\n iconName: 'futbol',\n icon: [496, 512, [], \"f1e3\", \"M483.8 179.4C449.8 74.6 352.6 8 248.1 8c-25.4 0-51.2 3.9-76.7 12.2C41.2 62.5-30.1 202.4 12.2 332.6 46.2 437.4 143.4 504 247.9 504c25.4 0 51.2-3.9 76.7-12.2 130.2-42.3 201.5-182.2 159.2-312.4zm-74.5 193.7l-52.2 6.4-43.7-60.9 24.4-75.2 71.1-22.1 38.9 36.4c-.2 30.7-7.4 61.1-21.7 89.2-4.7 9.3-10.7 17.8-16.8 26.2zm0-235.4l-10.4 53.1-70.7 22-64.2-46.5V92.5l47.4-26.2c39.2 13 73.4 38 97.9 71.4zM184.9 66.4L232 92.5v73.8l-64.2 46.5-70.6-22-10.1-52.5c24.3-33.4 57.9-58.6 97.8-71.9zM139 379.5L85.9 373c-14.4-20.1-37.3-59.6-37.8-115.3l39-36.4 71.1 22.2 24.3 74.3-43.5 61.7zm48.2 67l-22.4-48.1 43.6-61.7H287l44.3 61.7-22.4 48.1c-6.2 1.8-57.6 20.4-121.7 0z\"]\n};\nvar faGem = {\n prefix: 'far',\n iconName: 'gem',\n icon: [576, 512, [], \"f3a5\", \"M464 0H112c-4 0-7.8 2-10 5.4L2 152.6c-2.9 4.4-2.6 10.2.7 14.2l276 340.8c4.8 5.9 13.8 5.9 18.6 0l276-340.8c3.3-4.1 3.6-9.8.7-14.2L474.1 5.4C471.8 2 468.1 0 464 0zm-19.3 48l63.3 96h-68.4l-51.7-96h56.8zm-202.1 0h90.7l51.7 96H191l51.6-96zm-111.3 0h56.8l-51.7 96H68l63.3-96zm-43 144h51.4L208 352 88.3 192zm102.9 0h193.6L288 435.3 191.2 192zM368 352l68.2-160h51.4L368 352z\"]\n};\nvar faGrimace = {\n prefix: 'far',\n iconName: 'grimace',\n icon: [496, 512, [], \"f57f\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm-80-216c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32zm160 0c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32zm16 16H152c-26.5 0-48 21.5-48 48v32c0 26.5 21.5 48 48 48h192c26.5 0 48-21.5 48-48v-32c0-26.5-21.5-48-48-48zm-168 96h-24c-8.8 0-16-7.2-16-16v-8h40v24zm0-40h-40v-8c0-8.8 7.2-16 16-16h24v24zm64 40h-48v-24h48v24zm0-40h-48v-24h48v24zm64 40h-48v-24h48v24zm0-40h-48v-24h48v24zm56 24c0 8.8-7.2 16-16 16h-24v-24h40v8zm0-24h-40v-24h24c8.8 0 16 7.2 16 16v8z\"]\n};\nvar faGrin = {\n prefix: 'far',\n iconName: 'grin',\n icon: [496, 512, [], \"f580\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm105.6-151.4c-25.9 8.3-64.4 13.1-105.6 13.1s-79.6-4.8-105.6-13.1c-9.9-3.1-19.4 5.4-17.7 15.3 7.9 47.1 71.3 80 123.3 80s115.3-32.9 123.3-80c1.6-9.8-7.7-18.4-17.7-15.3zM168 240c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32zm160 0c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32z\"]\n};\nvar faGrinAlt = {\n prefix: 'far',\n iconName: 'grin-alt',\n icon: [496, 512, [], \"f581\", \"M200.3 248c12.4-18.7 15.1-37.3 15.7-56-.5-18.7-3.3-37.3-15.7-56-8-12-25.1-11.4-32.7 0-12.4 18.7-15.1 37.3-15.7 56 .5 18.7 3.3 37.3 15.7 56 8.1 12 25.2 11.4 32.7 0zm128 0c12.4-18.7 15.1-37.3 15.7-56-.5-18.7-3.3-37.3-15.7-56-8-12-25.1-11.4-32.7 0-12.4 18.7-15.1 37.3-15.7 56 .5 18.7 3.3 37.3 15.7 56 8.1 12 25.2 11.4 32.7 0zM248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm105.6-151.4c-25.9 8.3-64.4 13.1-105.6 13.1s-79.6-4.8-105.6-13.1c-9.9-3.1-19.4 5.3-17.7 15.3 7.9 47.2 71.3 80 123.3 80s115.3-32.9 123.3-80c1.6-9.8-7.7-18.4-17.7-15.3z\"]\n};\nvar faGrinBeam = {\n prefix: 'far',\n iconName: 'grin-beam',\n icon: [496, 512, [], \"f582\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm105.6-151.4c-25.9 8.3-64.4 13.1-105.6 13.1s-79.6-4.8-105.6-13.1c-9.8-3.1-19.4 5.3-17.7 15.3 7.9 47.1 71.3 80 123.3 80s115.3-32.9 123.3-80c1.6-9.8-7.7-18.4-17.7-15.3zm-235.9-72.9c3.5 1.1 7.4-.5 9.3-3.7l9.5-17c7.7-13.7 19.2-21.6 31.5-21.6s23.8 7.9 31.5 21.6l9.5 17c2.1 3.7 6.2 4.7 9.3 3.7 3.6-1.1 6-4.5 5.7-8.3-3.3-42.1-32.2-71.4-56-71.4s-52.7 29.3-56 71.4c-.3 3.7 2.1 7.2 5.7 8.3zm160 0c3.5 1.1 7.4-.5 9.3-3.7l9.5-17c7.7-13.7 19.2-21.6 31.5-21.6s23.8 7.9 31.5 21.6l9.5 17c2.1 3.7 6.2 4.7 9.3 3.7 3.6-1.1 6-4.5 5.7-8.3-3.3-42.1-32.2-71.4-56-71.4s-52.7 29.3-56 71.4c-.3 3.7 2.1 7.2 5.7 8.3z\"]\n};\nvar faGrinBeamSweat = {\n prefix: 'far',\n iconName: 'grin-beam-sweat',\n icon: [496, 512, [], \"f583\", \"M440 160c29.5 0 53.3-26.3 53.3-58.7 0-25-31.7-75.5-46.2-97.3-3.6-5.3-10.7-5.3-14.2 0-14.5 21.8-46.2 72.3-46.2 97.3 0 32.4 23.8 58.7 53.3 58.7zM248 400c51.9 0 115.3-32.9 123.3-80 1.7-9.9-7.7-18.5-17.7-15.3-25.9 8.3-64.4 13.1-105.6 13.1s-79.6-4.8-105.6-13.1c-9.8-3.1-19.4 5.3-17.7 15.3 8 47.1 71.4 80 123.3 80zm130.3-168.3c3.6-1.1 6-4.5 5.7-8.3-3.3-42.1-32.2-71.4-56-71.4s-52.7 29.3-56 71.4c-.3 3.7 2.1 7.2 5.7 8.3 3.5 1.1 7.4-.5 9.3-3.7l9.5-17c7.7-13.7 19.2-21.6 31.5-21.6s23.8 7.9 31.5 21.6l9.5 17c2.1 3.6 6.2 4.6 9.3 3.7zm105.3-52.9c-24.6 15.7-46 12.9-46.4 12.9 6.9 20.2 10.8 41.8 10.8 64.3 0 110.3-89.7 200-200 200S48 366.3 48 256 137.7 56 248 56c39.8 0 76.8 11.8 108 31.9 1.7-9.5 6.3-24.1 17.2-45.7C336.4 20.6 293.7 8 248 8 111 8 0 119 0 256s111 248 248 248 248-111 248-248c0-27-4.4-52.9-12.4-77.2zM168 189.4c12.3 0 23.8 7.9 31.5 21.6l9.5 17c2.1 3.7 6.2 4.7 9.3 3.7 3.6-1.1 6-4.5 5.7-8.3-3.3-42.1-32.2-71.4-56-71.4s-52.7 29.3-56 71.4c-.3 3.7 2.1 7.2 5.7 8.3 3.5 1.1 7.4-.5 9.3-3.7l9.5-17c7.7-13.8 19.2-21.6 31.5-21.6z\"]\n};\nvar faGrinHearts = {\n prefix: 'far',\n iconName: 'grin-hearts',\n icon: [496, 512, [], \"f584\", \"M353.6 304.6c-25.9 8.3-64.4 13.1-105.6 13.1s-79.6-4.8-105.6-13.1c-9.8-3.1-19.4 5.3-17.7 15.3 7.9 47.2 71.3 80 123.3 80s115.3-32.9 123.3-80c1.6-9.8-7.7-18.4-17.7-15.3zm-152.8-48.9c4.5 1.2 9.2-1.5 10.5-6l19.4-69.9c5.6-20.3-7.4-41.1-28.8-44.5-18.6-3-36.4 9.8-41.5 27.9l-2 7.1-7.1-1.9c-18.2-4.7-38.2 4.3-44.9 22-7.7 20.2 3.8 41.9 24.2 47.2l70.2 18.1zm188.8-65.3c-6.7-17.6-26.7-26.7-44.9-22l-7.1 1.9-2-7.1c-5-18.1-22.8-30.9-41.5-27.9-21.4 3.4-34.4 24.2-28.8 44.5l19.4 69.9c1.2 4.5 5.9 7.2 10.5 6l70.2-18.2c20.4-5.3 31.9-26.9 24.2-47.1zM248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200z\"]\n};\nvar faGrinSquint = {\n prefix: 'far',\n iconName: 'grin-squint',\n icon: [496, 512, [], \"f585\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm105.6-151.4c-25.9 8.3-64.4 13.1-105.6 13.1s-79.6-4.8-105.6-13.1c-9.9-3.1-19.4 5.4-17.7 15.3 7.9 47.1 71.3 80 123.3 80s115.3-32.9 123.3-80c1.6-9.8-7.7-18.4-17.7-15.3zm-234.7-40.8c3.6 4.2 9.9 5.7 15.3 2.5l80-48c3.6-2.2 5.8-6.1 5.8-10.3s-2.2-8.1-5.8-10.3l-80-48c-5.1-3-11.4-1.9-15.3 2.5-3.8 4.5-3.8 11-.1 15.5l33.6 40.3-33.6 40.3c-3.8 4.5-3.7 11.1.1 15.5zm242.9 2.5c5.4 3.2 11.7 1.7 15.3-2.5 3.8-4.5 3.8-11 .1-15.5L343.6 208l33.6-40.3c3.8-4.5 3.7-11-.1-15.5-3.8-4.4-10.2-5.4-15.3-2.5l-80 48c-3.6 2.2-5.8 6.1-5.8 10.3s2.2 8.1 5.8 10.3l80 48z\"]\n};\nvar faGrinSquintTears = {\n prefix: 'far',\n iconName: 'grin-squint-tears',\n icon: [512, 512, [], \"f586\", \"M117.1 384.1c-25.8 3.7-84 13.7-100.9 30.6-21.9 21.9-21.5 57.9.9 80.3s58.3 22.8 80.3.9C114.3 479 124.3 420.8 128 395c.8-6.4-4.6-11.8-10.9-10.9zm-41.2-41.7C40.3 268 53 176.1 114.6 114.6 152.4 76.8 202.6 56 256 56c36.2 0 70.8 9.8 101.2 27.7 3.8-20.3 8-36.1 12-48.3C333.8 17.2 294.9 8 256 8 192.5 8 129.1 32.2 80.6 80.6c-74.1 74.1-91.3 183.4-52 274 12.2-4.1 27.7-8.3 47.3-12.2zm352.3-187.6c45 76.6 34.9 176.9-30.8 242.6-37.8 37.8-88 58.6-141.4 58.6-30.5 0-59.8-7-86.4-19.8-3.9 19.5-8 35-12.2 47.2 31.4 13.6 65 20.6 98.7 20.6 63.5 0 126.9-24.2 175.4-72.6 78.1-78.1 93.1-195.4 45.2-288.6-12.3 4-28.2 8.1-48.5 12zm-33.3-26.9c25.8-3.7 84-13.7 100.9-30.6 21.9-21.9 21.5-57.9-.9-80.3s-58.3-22.8-80.3-.9C397.7 33 387.7 91.2 384 117c-.8 6.4 4.6 11.8 10.9 10.9zm-187 108.3c-3-3-7.2-4.2-11.4-3.2L106 255.7c-5.7 1.4-9.5 6.7-9.1 12.6.5 5.8 5.1 10.5 10.9 11l52.3 4.8 4.8 52.3c.5 5.8 5.2 10.4 11 10.9h.9c5.5 0 10.3-3.7 11.7-9.1l22.6-90.5c1-4.2-.2-8.5-3.2-11.5zm39.7-25.1l90.5-22.6c5.7-1.4 9.5-6.7 9.1-12.6-.5-5.8-5.1-10.5-10.9-11l-52.3-4.8-4.8-52.3c-.5-5.8-5.2-10.4-11-10.9-5.6-.1-11.2 3.4-12.6 9.1L233 196.5c-1 4.1.2 8.4 3.2 11.4 5 5 11.3 3.2 11.4 3.2zm52 88.5c-29.1 29.1-59.7 52.9-83.9 65.4-9.2 4.8-10 17.5-1.7 23.4 38.9 27.7 107 6.2 143.7-30.6S416 253 388.3 214.1c-5.8-8.2-18.5-7.6-23.4 1.7-12.3 24.2-36.2 54.7-65.3 83.8z\"]\n};\nvar faGrinStars = {\n prefix: 'far',\n iconName: 'grin-stars',\n icon: [496, 512, [], \"f587\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm105.6-151.4c-25.9 8.3-64.4 13.1-105.6 13.1s-79.6-4.8-105.6-13.1c-9.8-3.1-19.4 5.3-17.7 15.3 7.9 47.2 71.3 80 123.3 80s115.3-32.9 123.3-80c1.6-9.8-7.7-18.4-17.7-15.3zm-227.9-57.5c-1 6.2 5.4 11 11 7.9l31.3-16.3 31.3 16.3c5.6 3.1 12-1.7 11-7.9l-6-34.9 25.4-24.6c4.5-4.5 1.9-12.2-4.3-13.2l-34.9-5-15.5-31.6c-2.9-5.8-11-5.8-13.9 0l-15.5 31.6-34.9 5c-6.2.9-8.9 8.6-4.3 13.2l25.4 24.6-6.1 34.9zm259.7-72.7l-34.9-5-15.5-31.6c-2.9-5.8-11-5.8-13.9 0l-15.5 31.6-34.9 5c-6.2.9-8.9 8.6-4.3 13.2l25.4 24.6-6 34.9c-1 6.2 5.4 11 11 7.9l31.3-16.3 31.3 16.3c5.6 3.1 12-1.7 11-7.9l-6-34.9 25.4-24.6c4.5-4.6 1.8-12.2-4.4-13.2z\"]\n};\nvar faGrinTears = {\n prefix: 'far',\n iconName: 'grin-tears',\n icon: [640, 512, [], \"f588\", \"M117.1 256.1c-25.8 3.7-84 13.7-100.9 30.6-21.9 21.9-21.5 57.9.9 80.3s58.3 22.8 80.3.9C114.3 351 124.3 292.8 128 267c.8-6.4-4.6-11.8-10.9-10.9zm506.7 30.6c-16.9-16.9-75.1-26.9-100.9-30.6-6.3-.9-11.7 4.5-10.8 10.8 3.7 25.8 13.7 84 30.6 100.9 21.9 21.9 57.9 21.5 80.3-.9 22.3-22.3 22.7-58.3.8-80.2zm-126.6 61.7C463.8 412.3 396.9 456 320 456c-76.9 0-143.8-43.7-177.2-107.6-12.5 37.4-25.2 43.9-28.3 46.5C159.1 460.7 234.5 504 320 504s160.9-43.3 205.5-109.1c-3.2-2.7-15.9-9.2-28.3-46.5zM122.7 224.5C137.9 129.2 220.5 56 320 56c99.5 0 182.1 73.2 197.3 168.5 2.1-.2 5.2-2.4 49.5 7C554.4 106 448.7 8 320 8S85.6 106 73.2 231.4c44.5-9.4 47.1-7.2 49.5-6.9zM320 400c51.9 0 115.3-32.9 123.3-80 1.7-9.9-7.7-18.5-17.7-15.3-25.9 8.3-64.4 13.1-105.6 13.1s-79.6-4.8-105.6-13.1c-9.8-3.1-19.4 5.3-17.7 15.3 8 47.1 71.4 80 123.3 80zm130.3-168.3c3.6-1.1 6-4.5 5.7-8.3-3.3-42.1-32.2-71.4-56-71.4s-52.7 29.3-56 71.4c-.3 3.7 2.1 7.2 5.7 8.3 3.5 1.1 7.4-.5 9.3-3.7l9.5-17c7.7-13.7 19.2-21.6 31.5-21.6s23.8 7.9 31.5 21.6l9.5 17c2.1 3.6 6.2 4.6 9.3 3.7zM240 189.4c12.3 0 23.8 7.9 31.5 21.6l9.5 17c2.1 3.7 6.2 4.7 9.3 3.7 3.6-1.1 6-4.5 5.7-8.3-3.3-42.1-32.2-71.4-56-71.4s-52.7 29.3-56 71.4c-.3 3.7 2.1 7.2 5.7 8.3 3.5 1.1 7.4-.5 9.3-3.7l9.5-17c7.7-13.8 19.2-21.6 31.5-21.6z\"]\n};\nvar faGrinTongue = {\n prefix: 'far',\n iconName: 'grin-tongue',\n icon: [496, 512, [], \"f589\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm64 400c0 35.6-29.1 64.5-64.9 64-35.1-.5-63.1-29.8-63.1-65v-42.8l17.7-8.8c15-7.5 31.5 1.7 34.9 16.5l2.8 12.1c2.1 9.2 15.2 9.2 17.3 0l2.8-12.1c3.4-14.8 19.8-24.1 34.9-16.5l17.7 8.8V408zm28.2 25.3c2.2-8.1 3.8-16.5 3.8-25.3v-43.5c14.2-12.4 24.4-27.5 27.3-44.5 1.7-9.9-7.7-18.5-17.7-15.3-25.9 8.3-64.4 13.1-105.6 13.1s-79.6-4.8-105.6-13.1c-9.9-3.1-19.4 5.3-17.7 15.3 2.9 17 13.1 32.1 27.3 44.5V408c0 8.8 1.6 17.2 3.8 25.3C91.8 399.9 48 333 48 256c0-110.3 89.7-200 200-200s200 89.7 200 200c0 77-43.8 143.9-107.8 177.3zM168 176c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32zm160 0c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32z\"]\n};\nvar faGrinTongueSquint = {\n prefix: 'far',\n iconName: 'grin-tongue-squint',\n icon: [496, 512, [], \"f58a\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm64 400c0 35.6-29.1 64.5-64.9 64-35.1-.5-63.1-29.8-63.1-65v-42.8l17.7-8.8c15-7.5 31.5 1.7 34.9 16.5l2.8 12.1c2.1 9.2 15.2 9.2 17.3 0l2.8-12.1c3.4-14.8 19.8-24.1 34.9-16.5l17.7 8.8V408zm28.2 25.3c2.2-8.1 3.8-16.5 3.8-25.3v-43.5c14.2-12.4 24.4-27.5 27.3-44.5 1.7-9.9-7.7-18.5-17.7-15.3-25.9 8.3-64.4 13.1-105.6 13.1s-79.6-4.8-105.6-13.1c-9.9-3.1-19.4 5.3-17.7 15.3 2.9 17 13.1 32.1 27.3 44.5V408c0 8.8 1.6 17.2 3.8 25.3C91.8 399.9 48 333 48 256c0-110.3 89.7-200 200-200s200 89.7 200 200c0 77-43.8 143.9-107.8 177.3zm36.9-281.1c-3.8-4.4-10.3-5.5-15.3-2.5l-80 48c-3.6 2.2-5.8 6.1-5.8 10.3s2.2 8.1 5.8 10.3l80 48c5.4 3.2 11.7 1.7 15.3-2.5 3.8-4.5 3.8-11 .1-15.5L343.6 208l33.6-40.3c3.8-4.5 3.7-11.1-.1-15.5zm-162.9 45.5l-80-48c-5-3-11.4-2-15.3 2.5-3.8 4.5-3.8 11-.1 15.5l33.6 40.3-33.6 40.3c-3.8 4.5-3.7 11 .1 15.5 3.6 4.2 9.9 5.7 15.3 2.5l80-48c3.6-2.2 5.8-6.1 5.8-10.3s-2.2-8.1-5.8-10.3z\"]\n};\nvar faGrinTongueWink = {\n prefix: 'far',\n iconName: 'grin-tongue-wink',\n icon: [496, 512, [], \"f58b\", \"M152 180c-25.7 0-55.9 16.9-59.8 42.1-.8 5 1.7 10 6.1 12.4 4.4 2.4 9.9 1.8 13.7-1.6l9.5-8.5c14.8-13.2 46.2-13.2 61 0l9.5 8.5c2.5 2.2 8 4.7 13.7 1.6 4.4-2.4 6.9-7.4 6.1-12.4-3.9-25.2-34.1-42.1-59.8-42.1zm176-52c-44.2 0-80 35.8-80 80s35.8 80 80 80 80-35.8 80-80-35.8-80-80-80zm0 128c-26.5 0-48-21.5-48-48s21.5-48 48-48 48 21.5 48 48-21.5 48-48 48zm0-72c-13.3 0-24 10.7-24 24s10.7 24 24 24 24-10.7 24-24-10.7-24-24-24zM248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm64 400c0 35.6-29.1 64.5-64.9 64-35.1-.5-63.1-29.8-63.1-65v-42.8l17.7-8.8c15-7.5 31.5 1.7 34.9 16.5l2.8 12.1c2.1 9.2 15.2 9.2 17.3 0l2.8-12.1c3.4-14.8 19.8-24.1 34.9-16.5l17.7 8.8V408zm28.2 25.3c2.2-8.1 3.8-16.5 3.8-25.3v-43.5c14.2-12.4 24.4-27.5 27.3-44.5 1.7-9.9-7.7-18.5-17.7-15.3-25.9 8.3-64.4 13.1-105.6 13.1s-79.6-4.8-105.6-13.1c-9.9-3.1-19.4 5.3-17.7 15.3 2.9 17 13.1 32.1 27.3 44.5V408c0 8.8 1.6 17.2 3.8 25.3C91.8 399.9 48 333 48 256c0-110.3 89.7-200 200-200s200 89.7 200 200c0 77-43.8 143.9-107.8 177.3z\"]\n};\nvar faGrinWink = {\n prefix: 'far',\n iconName: 'grin-wink',\n icon: [496, 512, [], \"f58c\", \"M328 180c-25.69 0-55.88 16.92-59.86 42.12-1.75 11.22 11.5 18.24 19.83 10.84l9.55-8.48c14.81-13.19 46.16-13.19 60.97 0l9.55 8.48c8.48 7.43 21.56.25 19.83-10.84C383.88 196.92 353.69 180 328 180zm-160 60c17.67 0 32-14.33 32-32s-14.33-32-32-32-32 14.33-32 32 14.33 32 32 32zm185.55 64.64c-25.93 8.3-64.4 13.06-105.55 13.06s-79.62-4.75-105.55-13.06c-9.94-3.13-19.4 5.37-17.71 15.34C132.67 367.13 196.06 400 248 400s115.33-32.87 123.26-80.02c1.68-9.89-7.67-18.48-17.71-15.34zM248 8C111.03 8 0 119.03 0 256s111.03 248 248 248 248-111.03 248-248S384.97 8 248 8zm0 448c-110.28 0-200-89.72-200-200S137.72 56 248 56s200 89.72 200 200-89.72 200-200 200z\"]\n};\nvar faHandLizard = {\n prefix: 'far',\n iconName: 'hand-lizard',\n icon: [576, 512, [], \"f258\", \"M556.686 290.542L410.328 64.829C397.001 44.272 374.417 32 349.917 32H56C25.121 32 0 57.122 0 88v8c0 44.112 35.888 80 80 80h196.042l-18.333 48H144c-48.523 0-88 39.477-88 88 0 30.879 25.121 56 56 56h131.552c2.987 0 5.914.549 8.697 1.631L352 408.418V480h224V355.829c0-23.225-6.679-45.801-19.314-65.287zM528 432H400v-23.582c0-19.948-12.014-37.508-30.604-44.736l-99.751-38.788A71.733 71.733 0 0 0 243.552 320H112c-4.411 0-8-3.589-8-8 0-22.056 17.944-40 40-40h113.709c19.767 0 37.786-12.407 44.84-30.873l24.552-64.281c8.996-23.553-8.428-48.846-33.63-48.846H80c-17.645 0-32-14.355-32-32v-8c0-4.411 3.589-8 8-8h293.917c8.166 0 15.693 4.09 20.137 10.942l146.358 225.715A71.84 71.84 0 0 1 528 355.829V432z\"]\n};\nvar faHandPaper = {\n prefix: 'far',\n iconName: 'hand-paper',\n icon: [448, 512, [], \"f256\", \"M372.57 112.641v-10.825c0-43.612-40.52-76.691-83.039-65.546-25.629-49.5-94.09-47.45-117.982.747C130.269 26.456 89.144 57.945 89.144 102v126.13c-19.953-7.427-43.308-5.068-62.083 8.871-29.355 21.796-35.794 63.333-14.55 93.153L132.48 498.569a32 32 0 0 0 26.062 13.432h222.897c14.904 0 27.835-10.289 31.182-24.813l30.184-130.958A203.637 203.637 0 0 0 448 310.564V179c0-40.62-35.523-71.992-75.43-66.359zm27.427 197.922c0 11.731-1.334 23.469-3.965 34.886L368.707 464h-201.92L51.591 302.303c-14.439-20.27 15.023-42.776 29.394-22.605l27.128 38.079c8.995 12.626 29.031 6.287 29.031-9.283V102c0-25.645 36.571-24.81 36.571.691V256c0 8.837 7.163 16 16 16h6.856c8.837 0 16-7.163 16-16V67c0-25.663 36.571-24.81 36.571.691V256c0 8.837 7.163 16 16 16h6.856c8.837 0 16-7.163 16-16V101.125c0-25.672 36.57-24.81 36.57.691V256c0 8.837 7.163 16 16 16h6.857c8.837 0 16-7.163 16-16v-76.309c0-26.242 36.57-25.64 36.57-.691v131.563z\"]\n};\nvar faHandPeace = {\n prefix: 'far',\n iconName: 'hand-peace',\n icon: [448, 512, [], \"f25b\", \"M362.146 191.976c-13.71-21.649-38.761-34.016-65.006-30.341V74c0-40.804-32.811-74-73.141-74-40.33 0-73.14 33.196-73.14 74L160 168l-18.679-78.85C126.578 50.843 83.85 32.11 46.209 47.208 8.735 62.238-9.571 104.963 5.008 142.85l55.757 144.927c-30.557 24.956-43.994 57.809-24.733 92.218l54.853 97.999C102.625 498.97 124.73 512 148.575 512h205.702c30.744 0 57.558-21.44 64.555-51.797l27.427-118.999a67.801 67.801 0 0 0 1.729-15.203L448 256c0-44.956-43.263-77.343-85.854-64.024zM399.987 326c0 1.488-.169 2.977-.502 4.423l-27.427 119.001c-1.978 8.582-9.29 14.576-17.782 14.576H148.575c-6.486 0-12.542-3.621-15.805-9.449l-54.854-98c-4.557-8.141-2.619-18.668 4.508-24.488l26.647-21.764a16 16 0 0 0 4.812-18.139l-64.09-166.549C37.226 92.956 84.37 74.837 96.51 106.389l59.784 155.357A16 16 0 0 0 171.227 272h11.632c8.837 0 16-7.163 16-16V74c0-34.375 50.281-34.43 50.281 0v182c0 8.837 7.163 16 16 16h6.856c8.837 0 16-7.163 16-16v-28c0-25.122 36.567-25.159 36.567 0v28c0 8.837 7.163 16 16 16h6.856c8.837 0 16-7.163 16-16 0-25.12 36.567-25.16 36.567 0v70z\"]\n};\nvar faHandPointDown = {\n prefix: 'far',\n iconName: 'hand-point-down',\n icon: [448, 512, [], \"f0a7\", \"M188.8 512c45.616 0 83.2-37.765 83.2-83.2v-35.647a93.148 93.148 0 0 0 22.064-7.929c22.006 2.507 44.978-3.503 62.791-15.985C409.342 368.1 448 331.841 448 269.299V248c0-60.063-40-98.512-40-127.2v-2.679c4.952-5.747 8-13.536 8-22.12V32c0-17.673-12.894-32-28.8-32H156.8C140.894 0 128 14.327 128 32v64c0 8.584 3.048 16.373 8 22.12v2.679c0 6.964-6.193 14.862-23.668 30.183l-.148.129-.146.131c-9.937 8.856-20.841 18.116-33.253 25.851C48.537 195.798 0 207.486 0 252.8c0 56.928 35.286 92 83.2 92 8.026 0 15.489-.814 22.4-2.176V428.8c0 45.099 38.101 83.2 83.2 83.2zm0-48c-18.7 0-35.2-16.775-35.2-35.2V270.4c-17.325 0-35.2 26.4-70.4 26.4-26.4 0-35.2-20.625-35.2-44 0-8.794 32.712-20.445 56.1-34.926 14.575-9.074 27.225-19.524 39.875-30.799 18.374-16.109 36.633-33.836 39.596-59.075h176.752C364.087 170.79 400 202.509 400 248v21.299c0 40.524-22.197 57.124-61.325 50.601-8.001 14.612-33.979 24.151-53.625 12.925-18.225 19.365-46.381 17.787-61.05 4.95V428.8c0 18.975-16.225 35.2-35.2 35.2zM328 64c0-13.255 10.745-24 24-24s24 10.745 24 24-10.745 24-24 24-24-10.745-24-24z\"]\n};\nvar faHandPointLeft = {\n prefix: 'far',\n iconName: 'hand-point-left',\n icon: [512, 512, [], \"f0a5\", \"M0 220.8C0 266.416 37.765 304 83.2 304h35.647a93.148 93.148 0 0 0 7.929 22.064c-2.507 22.006 3.503 44.978 15.985 62.791C143.9 441.342 180.159 480 242.701 480H264c60.063 0 98.512-40 127.2-40h2.679c5.747 4.952 13.536 8 22.12 8h64c17.673 0 32-12.894 32-28.8V188.8c0-15.906-14.327-28.8-32-28.8h-64c-8.584 0-16.373 3.048-22.12 8H391.2c-6.964 0-14.862-6.193-30.183-23.668l-.129-.148-.131-.146c-8.856-9.937-18.116-20.841-25.851-33.253C316.202 80.537 304.514 32 259.2 32c-56.928 0-92 35.286-92 83.2 0 8.026.814 15.489 2.176 22.4H83.2C38.101 137.6 0 175.701 0 220.8zm48 0c0-18.7 16.775-35.2 35.2-35.2h158.4c0-17.325-26.4-35.2-26.4-70.4 0-26.4 20.625-35.2 44-35.2 8.794 0 20.445 32.712 34.926 56.1 9.074 14.575 19.524 27.225 30.799 39.875 16.109 18.374 33.836 36.633 59.075 39.596v176.752C341.21 396.087 309.491 432 264 432h-21.299c-40.524 0-57.124-22.197-50.601-61.325-14.612-8.001-24.151-33.979-12.925-53.625-19.365-18.225-17.787-46.381-4.95-61.05H83.2C64.225 256 48 239.775 48 220.8zM448 360c13.255 0 24 10.745 24 24s-10.745 24-24 24-24-10.745-24-24 10.745-24 24-24z\"]\n};\nvar faHandPointRight = {\n prefix: 'far',\n iconName: 'hand-point-right',\n icon: [512, 512, [], \"f0a4\", \"M428.8 137.6h-86.177a115.52 115.52 0 0 0 2.176-22.4c0-47.914-35.072-83.2-92-83.2-45.314 0-57.002 48.537-75.707 78.784-7.735 12.413-16.994 23.317-25.851 33.253l-.131.146-.129.148C135.662 161.807 127.764 168 120.8 168h-2.679c-5.747-4.952-13.536-8-22.12-8H32c-17.673 0-32 12.894-32 28.8v230.4C0 435.106 14.327 448 32 448h64c8.584 0 16.373-3.048 22.12-8h2.679c28.688 0 67.137 40 127.2 40h21.299c62.542 0 98.8-38.658 99.94-91.145 12.482-17.813 18.491-40.785 15.985-62.791A93.148 93.148 0 0 0 393.152 304H428.8c45.435 0 83.2-37.584 83.2-83.2 0-45.099-38.101-83.2-83.2-83.2zm0 118.4h-91.026c12.837 14.669 14.415 42.825-4.95 61.05 11.227 19.646 1.687 45.624-12.925 53.625 6.524 39.128-10.076 61.325-50.6 61.325H248c-45.491 0-77.21-35.913-120-39.676V215.571c25.239-2.964 42.966-21.222 59.075-39.596 11.275-12.65 21.725-25.3 30.799-39.875C232.355 112.712 244.006 80 252.8 80c23.375 0 44 8.8 44 35.2 0 35.2-26.4 53.075-26.4 70.4h158.4c18.425 0 35.2 16.5 35.2 35.2 0 18.975-16.225 35.2-35.2 35.2zM88 384c0 13.255-10.745 24-24 24s-24-10.745-24-24 10.745-24 24-24 24 10.745 24 24z\"]\n};\nvar faHandPointUp = {\n prefix: 'far',\n iconName: 'hand-point-up',\n icon: [448, 512, [], \"f0a6\", \"M105.6 83.2v86.177a115.52 115.52 0 0 0-22.4-2.176c-47.914 0-83.2 35.072-83.2 92 0 45.314 48.537 57.002 78.784 75.707 12.413 7.735 23.317 16.994 33.253 25.851l.146.131.148.129C129.807 376.338 136 384.236 136 391.2v2.679c-4.952 5.747-8 13.536-8 22.12v64c0 17.673 12.894 32 28.8 32h230.4c15.906 0 28.8-14.327 28.8-32v-64c0-8.584-3.048-16.373-8-22.12V391.2c0-28.688 40-67.137 40-127.2v-21.299c0-62.542-38.658-98.8-91.145-99.94-17.813-12.482-40.785-18.491-62.791-15.985A93.148 93.148 0 0 0 272 118.847V83.2C272 37.765 234.416 0 188.8 0c-45.099 0-83.2 38.101-83.2 83.2zm118.4 0v91.026c14.669-12.837 42.825-14.415 61.05 4.95 19.646-11.227 45.624-1.687 53.625 12.925 39.128-6.524 61.325 10.076 61.325 50.6V264c0 45.491-35.913 77.21-39.676 120H183.571c-2.964-25.239-21.222-42.966-39.596-59.075-12.65-11.275-25.3-21.725-39.875-30.799C80.712 279.645 48 267.994 48 259.2c0-23.375 8.8-44 35.2-44 35.2 0 53.075 26.4 70.4 26.4V83.2c0-18.425 16.5-35.2 35.2-35.2 18.975 0 35.2 16.225 35.2 35.2zM352 424c13.255 0 24 10.745 24 24s-10.745 24-24 24-24-10.745-24-24 10.745-24 24-24z\"]\n};\nvar faHandPointer = {\n prefix: 'far',\n iconName: 'hand-pointer',\n icon: [448, 512, [], \"f25a\", \"M358.182 179.361c-19.493-24.768-52.679-31.945-79.872-19.098-15.127-15.687-36.182-22.487-56.595-19.629V67c0-36.944-29.736-67-66.286-67S89.143 30.056 89.143 67v161.129c-19.909-7.41-43.272-5.094-62.083 8.872-29.355 21.795-35.793 63.333-14.55 93.152l109.699 154.001C134.632 501.59 154.741 512 176 512h178.286c30.802 0 57.574-21.5 64.557-51.797l27.429-118.999A67.873 67.873 0 0 0 448 326v-84c0-46.844-46.625-79.273-89.818-62.639zM80.985 279.697l27.126 38.079c8.995 12.626 29.031 6.287 29.031-9.283V67c0-25.12 36.571-25.16 36.571 0v175c0 8.836 7.163 16 16 16h6.857c8.837 0 16-7.164 16-16v-35c0-25.12 36.571-25.16 36.571 0v35c0 8.836 7.163 16 16 16H272c8.837 0 16-7.164 16-16v-21c0-25.12 36.571-25.16 36.571 0v21c0 8.836 7.163 16 16 16h6.857c8.837 0 16-7.164 16-16 0-25.121 36.571-25.16 36.571 0v84c0 1.488-.169 2.977-.502 4.423l-27.43 119.001c-1.978 8.582-9.29 14.576-17.782 14.576H176c-5.769 0-11.263-2.878-14.697-7.697l-109.712-154c-14.406-20.223 14.994-42.818 29.394-22.606zM176.143 400v-96c0-8.837 6.268-16 14-16h6c7.732 0 14 7.163 14 16v96c0 8.837-6.268 16-14 16h-6c-7.733 0-14-7.163-14-16zm75.428 0v-96c0-8.837 6.268-16 14-16h6c7.732 0 14 7.163 14 16v96c0 8.837-6.268 16-14 16h-6c-7.732 0-14-7.163-14-16zM327 400v-96c0-8.837 6.268-16 14-16h6c7.732 0 14 7.163 14 16v96c0 8.837-6.268 16-14 16h-6c-7.732 0-14-7.163-14-16z\"]\n};\nvar faHandRock = {\n prefix: 'far',\n iconName: 'hand-rock',\n icon: [512, 512, [], \"f255\", \"M408.864 79.052c-22.401-33.898-66.108-42.273-98.813-23.588-29.474-31.469-79.145-31.093-108.334-.022-47.16-27.02-108.71 5.055-110.671 60.806C44.846 105.407 0 140.001 0 187.429v56.953c0 32.741 14.28 63.954 39.18 85.634l97.71 85.081c4.252 3.702 3.11 5.573 3.11 32.903 0 17.673 14.327 32 32 32h252c17.673 0 32-14.327 32-32 0-23.513-1.015-30.745 3.982-42.37l42.835-99.656c6.094-14.177 9.183-29.172 9.183-44.568V146.963c0-52.839-54.314-88.662-103.136-67.911zM464 261.406a64.505 64.505 0 0 1-5.282 25.613l-42.835 99.655c-5.23 12.171-7.883 25.04-7.883 38.25V432H188v-10.286c0-16.37-7.14-31.977-19.59-42.817l-97.71-85.08C56.274 281.255 48 263.236 48 244.381v-56.953c0-33.208 52-33.537 52 .677v41.228a16 16 0 0 0 5.493 12.067l7 6.095A16 16 0 0 0 139 235.429V118.857c0-33.097 52-33.725 52 .677v26.751c0 8.836 7.164 16 16 16h7c8.836 0 16-7.164 16-16v-41.143c0-33.134 52-33.675 52 .677v40.466c0 8.836 7.163 16 16 16h7c8.837 0 16-7.164 16-16v-27.429c0-33.03 52-33.78 52 .677v26.751c0 8.836 7.163 16 16 16h7c8.837 0 16-7.164 16-16 0-33.146 52-33.613 52 .677v114.445z\"]\n};\nvar faHandScissors = {\n prefix: 'far',\n iconName: 'hand-scissors',\n icon: [512, 512, [], \"f257\", \"M256 480l70-.013c5.114 0 10.231-.583 15.203-1.729l118.999-27.427C490.56 443.835 512 417.02 512 386.277V180.575c0-23.845-13.03-45.951-34.005-57.69l-97.999-54.853c-34.409-19.261-67.263-5.824-92.218 24.733L142.85 37.008c-37.887-14.579-80.612 3.727-95.642 41.201-15.098 37.642 3.635 80.37 41.942 95.112L168 192l-94-9.141c-40.804 0-74 32.811-74 73.14 0 40.33 33.196 73.141 74 73.141h87.635c-3.675 26.245 8.692 51.297 30.341 65.006C178.657 436.737 211.044 480 256 480zm0-48.013c-25.16 0-25.12-36.567 0-36.567 8.837 0 16-7.163 16-16v-6.856c0-8.837-7.163-16-16-16h-28c-25.159 0-25.122-36.567 0-36.567h28c8.837 0 16-7.163 16-16v-6.856c0-8.837-7.163-16-16-16H74c-34.43 0-34.375-50.281 0-50.281h182c8.837 0 16-7.163 16-16v-11.632a16 16 0 0 0-10.254-14.933L106.389 128.51c-31.552-12.14-13.432-59.283 19.222-46.717l166.549 64.091a16.001 16.001 0 0 0 18.139-4.812l21.764-26.647c5.82-7.127 16.348-9.064 24.488-4.508l98 54.854c5.828 3.263 9.449 9.318 9.449 15.805v205.701c0 8.491-5.994 15.804-14.576 17.782l-119.001 27.427a19.743 19.743 0 0 1-4.423.502h-70z\"]\n};\nvar faHandSpock = {\n prefix: 'far',\n iconName: 'hand-spock',\n icon: [512, 512, [], \"f259\", \"M21.096 381.79l129.092 121.513a32 32 0 0 0 21.932 8.698h237.6c14.17 0 26.653-9.319 30.68-22.904l31.815-107.313A115.955 115.955 0 0 0 477 348.811v-36.839c0-4.051.476-8.104 1.414-12.045l31.73-133.41c10.099-42.412-22.316-82.738-65.544-82.525-4.144-24.856-22.543-47.165-49.85-53.992-35.803-8.952-72.227 12.655-81.25 48.75L296.599 184 274.924 52.01c-8.286-36.07-44.303-58.572-80.304-50.296-29.616 6.804-50.138 32.389-51.882 61.295-42.637.831-73.455 40.563-64.071 81.844l31.04 136.508c-27.194-22.515-67.284-19.992-91.482 5.722-25.376 26.961-24.098 69.325 2.871 94.707zm32.068-61.811l.002-.001c7.219-7.672 19.241-7.98 26.856-.813l53.012 49.894C143.225 378.649 160 371.4 160 357.406v-69.479c0-1.193-.134-2.383-.397-3.546l-34.13-150.172c-5.596-24.617 31.502-32.86 37.054-8.421l30.399 133.757a16 16 0 0 0 15.603 12.454h8.604c10.276 0 17.894-9.567 15.594-19.583l-41.62-181.153c-5.623-24.469 31.39-33.076 37.035-8.508l45.22 196.828A16 16 0 0 0 288.956 272h13.217a16 16 0 0 0 15.522-12.119l42.372-169.49c6.104-24.422 42.962-15.159 36.865 9.217L358.805 252.12c-2.521 10.088 5.115 19.88 15.522 19.88h9.694a16 16 0 0 0 15.565-12.295L426.509 146.6c5.821-24.448 42.797-15.687 36.966 8.802L431.72 288.81a100.094 100.094 0 0 0-2.72 23.162v36.839c0 6.548-.943 13.051-2.805 19.328L397.775 464h-219.31L53.978 346.836c-7.629-7.18-7.994-19.229-.814-26.857z\"]\n};\nvar faHandshake = {\n prefix: 'far',\n iconName: 'handshake',\n icon: [640, 512, [], \"f2b5\", \"M519.2 127.9l-47.6-47.6A56.252 56.252 0 0 0 432 64H205.2c-14.8 0-29.1 5.9-39.6 16.3L118 127.9H0v255.7h64c17.6 0 31.8-14.2 31.9-31.7h9.1l84.6 76.4c30.9 25.1 73.8 25.7 105.6 3.8 12.5 10.8 26 15.9 41.1 15.9 18.2 0 35.3-7.4 48.8-24 22.1 8.7 48.2 2.6 64-16.8l26.2-32.3c5.6-6.9 9.1-14.8 10.9-23h57.9c.1 17.5 14.4 31.7 31.9 31.7h64V127.9H519.2zM48 351.6c-8.8 0-16-7.2-16-16s7.2-16 16-16 16 7.2 16 16c0 8.9-7.2 16-16 16zm390-6.9l-26.1 32.2c-2.8 3.4-7.8 4-11.3 1.2l-23.9-19.4-30 36.5c-6 7.3-15 4.8-18 2.4l-36.8-31.5-15.6 19.2c-13.9 17.1-39.2 19.7-55.3 6.6l-97.3-88H96V175.8h41.9l61.7-61.6c2-.8 3.7-1.5 5.7-2.3H262l-38.7 35.5c-29.4 26.9-31.1 72.3-4.4 101.3 14.8 16.2 61.2 41.2 101.5 4.4l8.2-7.5 108.2 87.8c3.4 2.8 3.9 7.9 1.2 11.3zm106-40.8h-69.2c-2.3-2.8-4.9-5.4-7.7-7.7l-102.7-83.4 12.5-11.4c6.5-6 7-16.1 1-22.6L367 167.1c-6-6.5-16.1-6.9-22.6-1l-55.2 50.6c-9.5 8.7-25.7 9.4-34.6 0-9.3-9.9-8.5-25.1 1.2-33.9l65.6-60.1c7.4-6.8 17-10.5 27-10.5l83.7-.2c2.1 0 4.1.8 5.5 2.3l61.7 61.6H544v128zm48 47.7c-8.8 0-16-7.2-16-16s7.2-16 16-16 16 7.2 16 16c0 8.9-7.2 16-16 16z\"]\n};\nvar faHdd = {\n prefix: 'far',\n iconName: 'hdd',\n icon: [576, 512, [], \"f0a0\", \"M567.403 235.642L462.323 84.589A48 48 0 0 0 422.919 64H153.081a48 48 0 0 0-39.404 20.589L8.597 235.642A48.001 48.001 0 0 0 0 263.054V400c0 26.51 21.49 48 48 48h480c26.51 0 48-21.49 48-48V263.054c0-9.801-3-19.366-8.597-27.412zM153.081 112h269.838l77.913 112H75.168l77.913-112zM528 400H48V272h480v128zm-32-64c0 17.673-14.327 32-32 32s-32-14.327-32-32 14.327-32 32-32 32 14.327 32 32zm-96 0c0 17.673-14.327 32-32 32s-32-14.327-32-32 14.327-32 32-32 32 14.327 32 32z\"]\n};\nvar faHeart = {\n prefix: 'far',\n iconName: 'heart',\n icon: [512, 512, [], \"f004\", \"M458.4 64.3C400.6 15.7 311.3 23 256 79.3 200.7 23 111.4 15.6 53.6 64.3-21.6 127.6-10.6 230.8 43 285.5l175.4 178.7c10 10.2 23.4 15.9 37.6 15.9 14.3 0 27.6-5.6 37.6-15.8L469 285.6c53.5-54.7 64.7-157.9-10.6-221.3zm-23.6 187.5L259.4 430.5c-2.4 2.4-4.4 2.4-6.8 0L77.2 251.8c-36.5-37.2-43.9-107.6 7.3-150.7 38.9-32.7 98.9-27.8 136.5 10.5l35 35.7 35-35.7c37.8-38.5 97.8-43.2 136.5-10.6 51.1 43.1 43.5 113.9 7.3 150.8z\"]\n};\nvar faHospital = {\n prefix: 'far',\n iconName: 'hospital',\n icon: [448, 512, [], \"f0f8\", \"M128 244v-40c0-6.627 5.373-12 12-12h40c6.627 0 12 5.373 12 12v40c0 6.627-5.373 12-12 12h-40c-6.627 0-12-5.373-12-12zm140 12h40c6.627 0 12-5.373 12-12v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12zm-76 84v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm76 12h40c6.627 0 12-5.373 12-12v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12zm180 124v36H0v-36c0-6.627 5.373-12 12-12h19.5V85.035C31.5 73.418 42.245 64 55.5 64H144V24c0-13.255 10.745-24 24-24h112c13.255 0 24 10.745 24 24v40h88.5c13.255 0 24 9.418 24 21.035V464H436c6.627 0 12 5.373 12 12zM79.5 463H192v-67c0-6.627 5.373-12 12-12h40c6.627 0 12 5.373 12 12v67h112.5V112H304v24c0 13.255-10.745 24-24 24H168c-13.255 0-24-10.745-24-24v-24H79.5v351zM266 64h-26V38a6 6 0 0 0-6-6h-20a6 6 0 0 0-6 6v26h-26a6 6 0 0 0-6 6v20a6 6 0 0 0 6 6h26v26a6 6 0 0 0 6 6h20a6 6 0 0 0 6-6V96h26a6 6 0 0 0 6-6V70a6 6 0 0 0-6-6z\"]\n};\nvar faHourglass = {\n prefix: 'far',\n iconName: 'hourglass',\n icon: [384, 512, [], \"f254\", \"M368 48h4c6.627 0 12-5.373 12-12V12c0-6.627-5.373-12-12-12H12C5.373 0 0 5.373 0 12v24c0 6.627 5.373 12 12 12h4c0 80.564 32.188 165.807 97.18 208C47.899 298.381 16 383.9 16 464h-4c-6.627 0-12 5.373-12 12v24c0 6.627 5.373 12 12 12h360c6.627 0 12-5.373 12-12v-24c0-6.627-5.373-12-12-12h-4c0-80.564-32.188-165.807-97.18-208C336.102 213.619 368 128.1 368 48zM64 48h256c0 101.62-57.307 184-128 184S64 149.621 64 48zm256 416H64c0-101.62 57.308-184 128-184s128 82.38 128 184z\"]\n};\nvar faIdBadge = {\n prefix: 'far',\n iconName: 'id-badge',\n icon: [384, 512, [], \"f2c1\", \"M336 0H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V48c0-26.5-21.5-48-48-48zm0 464H48V48h288v416zM144 112h96c8.8 0 16-7.2 16-16s-7.2-16-16-16h-96c-8.8 0-16 7.2-16 16s7.2 16 16 16zm48 176c35.3 0 64-28.7 64-64s-28.7-64-64-64-64 28.7-64 64 28.7 64 64 64zm-89.6 128h179.2c12.4 0 22.4-8.6 22.4-19.2v-19.2c0-31.8-30.1-57.6-67.2-57.6-10.8 0-18.7 8-44.8 8-26.9 0-33.4-8-44.8-8-37.1 0-67.2 25.8-67.2 57.6v19.2c0 10.6 10 19.2 22.4 19.2z\"]\n};\nvar faIdCard = {\n prefix: 'far',\n iconName: 'id-card',\n icon: [576, 512, [], \"f2c2\", \"M528 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h480c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zm0 400H303.2c.9-4.5.8 3.6.8-22.4 0-31.8-30.1-57.6-67.2-57.6-10.8 0-18.7 8-44.8 8-26.9 0-33.4-8-44.8-8-37.1 0-67.2 25.8-67.2 57.6 0 26-.2 17.9.8 22.4H48V144h480v288zm-168-80h112c4.4 0 8-3.6 8-8v-16c0-4.4-3.6-8-8-8H360c-4.4 0-8 3.6-8 8v16c0 4.4 3.6 8 8 8zm0-64h112c4.4 0 8-3.6 8-8v-16c0-4.4-3.6-8-8-8H360c-4.4 0-8 3.6-8 8v16c0 4.4 3.6 8 8 8zm0-64h112c4.4 0 8-3.6 8-8v-16c0-4.4-3.6-8-8-8H360c-4.4 0-8 3.6-8 8v16c0 4.4 3.6 8 8 8zm-168 96c35.3 0 64-28.7 64-64s-28.7-64-64-64-64 28.7-64 64 28.7 64 64 64z\"]\n};\nvar faImage = {\n prefix: 'far',\n iconName: 'image',\n icon: [512, 512, [], \"f03e\", \"M464 64H48C21.49 64 0 85.49 0 112v288c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48V112c0-26.51-21.49-48-48-48zm-6 336H54a6 6 0 0 1-6-6V118a6 6 0 0 1 6-6h404a6 6 0 0 1 6 6v276a6 6 0 0 1-6 6zM128 152c-22.091 0-40 17.909-40 40s17.909 40 40 40 40-17.909 40-40-17.909-40-40-40zM96 352h320v-80l-87.515-87.515c-4.686-4.686-12.284-4.686-16.971 0L192 304l-39.515-39.515c-4.686-4.686-12.284-4.686-16.971 0L96 304v48z\"]\n};\nvar faImages = {\n prefix: 'far',\n iconName: 'images',\n icon: [576, 512, [], \"f302\", \"M480 416v16c0 26.51-21.49 48-48 48H48c-26.51 0-48-21.49-48-48V176c0-26.51 21.49-48 48-48h16v48H54a6 6 0 0 0-6 6v244a6 6 0 0 0 6 6h372a6 6 0 0 0 6-6v-10h48zm42-336H150a6 6 0 0 0-6 6v244a6 6 0 0 0 6 6h372a6 6 0 0 0 6-6V86a6 6 0 0 0-6-6zm6-48c26.51 0 48 21.49 48 48v256c0 26.51-21.49 48-48 48H144c-26.51 0-48-21.49-48-48V80c0-26.51 21.49-48 48-48h384zM264 144c0 22.091-17.909 40-40 40s-40-17.909-40-40 17.909-40 40-40 40 17.909 40 40zm-72 96l39.515-39.515c4.686-4.686 12.284-4.686 16.971 0L288 240l103.515-103.515c4.686-4.686 12.284-4.686 16.971 0L480 208v80H192v-48z\"]\n};\nvar faKeyboard = {\n prefix: 'far',\n iconName: 'keyboard',\n icon: [576, 512, [], \"f11c\", \"M528 64H48C21.49 64 0 85.49 0 112v288c0 26.51 21.49 48 48 48h480c26.51 0 48-21.49 48-48V112c0-26.51-21.49-48-48-48zm8 336c0 4.411-3.589 8-8 8H48c-4.411 0-8-3.589-8-8V112c0-4.411 3.589-8 8-8h480c4.411 0 8 3.589 8 8v288zM170 270v-28c0-6.627-5.373-12-12-12h-28c-6.627 0-12 5.373-12 12v28c0 6.627 5.373 12 12 12h28c6.627 0 12-5.373 12-12zm96 0v-28c0-6.627-5.373-12-12-12h-28c-6.627 0-12 5.373-12 12v28c0 6.627 5.373 12 12 12h28c6.627 0 12-5.373 12-12zm96 0v-28c0-6.627-5.373-12-12-12h-28c-6.627 0-12 5.373-12 12v28c0 6.627 5.373 12 12 12h28c6.627 0 12-5.373 12-12zm96 0v-28c0-6.627-5.373-12-12-12h-28c-6.627 0-12 5.373-12 12v28c0 6.627 5.373 12 12 12h28c6.627 0 12-5.373 12-12zm-336 82v-28c0-6.627-5.373-12-12-12H82c-6.627 0-12 5.373-12 12v28c0 6.627 5.373 12 12 12h28c6.627 0 12-5.373 12-12zm384 0v-28c0-6.627-5.373-12-12-12h-28c-6.627 0-12 5.373-12 12v28c0 6.627 5.373 12 12 12h28c6.627 0 12-5.373 12-12zM122 188v-28c0-6.627-5.373-12-12-12H82c-6.627 0-12 5.373-12 12v28c0 6.627 5.373 12 12 12h28c6.627 0 12-5.373 12-12zm96 0v-28c0-6.627-5.373-12-12-12h-28c-6.627 0-12 5.373-12 12v28c0 6.627 5.373 12 12 12h28c6.627 0 12-5.373 12-12zm96 0v-28c0-6.627-5.373-12-12-12h-28c-6.627 0-12 5.373-12 12v28c0 6.627 5.373 12 12 12h28c6.627 0 12-5.373 12-12zm96 0v-28c0-6.627-5.373-12-12-12h-28c-6.627 0-12 5.373-12 12v28c0 6.627 5.373 12 12 12h28c6.627 0 12-5.373 12-12zm96 0v-28c0-6.627-5.373-12-12-12h-28c-6.627 0-12 5.373-12 12v28c0 6.627 5.373 12 12 12h28c6.627 0 12-5.373 12-12zm-98 158v-16c0-6.627-5.373-12-12-12H180c-6.627 0-12 5.373-12 12v16c0 6.627 5.373 12 12 12h216c6.627 0 12-5.373 12-12z\"]\n};\nvar faKiss = {\n prefix: 'far',\n iconName: 'kiss',\n icon: [496, 512, [], \"f596\", \"M168 176c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32zm136 132c0-19.2-28.8-41.5-71.5-44-3.8-.4-7.4 2.4-8.2 6.2-.9 3.8 1.1 7.7 4.7 9.2l16.9 7.2c13 5.5 20.8 13.5 20.8 21.5s-7.8 16-20.7 21.5l-17 7.2c-5.7 2.4-6 12.2 0 14.8l16.9 7.2c13 5.5 20.8 13.5 20.8 21.5s-7.8 16-20.7 21.5l-17 7.2c-3.6 1.5-5.6 5.4-4.7 9.2.8 3.6 4.1 6.2 7.8 6.2h.5c42.8-2.5 71.5-24.8 71.5-44 0-13-13.4-27.3-35.2-36C290.6 335.3 304 321 304 308zM248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm80-280c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32z\"]\n};\nvar faKissBeam = {\n prefix: 'far',\n iconName: 'kiss-beam',\n icon: [496, 512, [], \"f597\", \"M168 152c-23.8 0-52.7 29.3-56 71.4-.3 3.7 2 7.2 5.6 8.3 3.5 1 7.5-.5 9.3-3.7l9.5-17c7.7-13.7 19.2-21.6 31.5-21.6s23.8 7.9 31.5 21.6l9.5 17c2.1 3.7 6.2 4.7 9.3 3.7 3.6-1.1 5.9-4.5 5.6-8.3-3.1-42.1-32-71.4-55.8-71.4zM248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm56-148c0-19.2-28.8-41.5-71.5-44-3.8-.4-7.4 2.4-8.2 6.2-.9 3.8 1.1 7.7 4.7 9.2l16.9 7.2c13 5.5 20.8 13.5 20.8 21.5s-7.8 16-20.7 21.5l-17 7.2c-5.7 2.4-6 12.2 0 14.8l16.9 7.2c13 5.5 20.8 13.5 20.8 21.5s-7.8 16-20.7 21.5l-17 7.2c-3.6 1.5-5.6 5.4-4.7 9.2.8 3.6 4.1 6.2 7.8 6.2h.5c42.8-2.5 71.5-24.8 71.5-44 0-13-13.4-27.3-35.2-36C290.6 335.3 304 321 304 308zm24-156c-23.8 0-52.7 29.3-56 71.4-.3 3.7 2 7.2 5.6 8.3 3.5 1 7.5-.5 9.3-3.7l9.5-17c7.7-13.7 19.2-21.6 31.5-21.6s23.8 7.9 31.5 21.6l9.5 17c2.1 3.7 6.2 4.7 9.3 3.7 3.6-1.1 5.9-4.5 5.6-8.3-3.1-42.1-32-71.4-55.8-71.4z\"]\n};\nvar faKissWinkHeart = {\n prefix: 'far',\n iconName: 'kiss-wink-heart',\n icon: [504, 512, [], \"f598\", \"M304 308.5c0-19.2-28.8-41.5-71.5-44-3.8-.4-7.4 2.4-8.2 6.2-.9 3.8 1.1 7.7 4.7 9.2l16.9 7.2c13 5.5 20.8 13.5 20.8 21.5s-7.8 16-20.7 21.5l-17 7.2c-5.7 2.4-6 12.2 0 14.8l16.9 7.2c13 5.5 20.8 13.5 20.8 21.5s-7.8 16-20.7 21.5l-17 7.2c-3.6 1.5-5.6 5.4-4.7 9.2.8 3.6 4.1 6.2 7.8 6.2h.5c42.8-2.5 71.5-24.8 71.5-44 0-13-13.4-27.3-35.2-36 21.7-9.1 35.1-23.4 35.1-36.4zm70.5-83.5l9.5 8.5c3.8 3.3 9.3 4 13.7 1.6 4.4-2.4 6.9-7.4 6.1-12.4-4-25.2-34.2-42.1-59.8-42.1s-55.9 16.9-59.8 42.1c-.8 5 1.7 10 6.1 12.4 5.8 3.1 11.2.7 13.7-1.6l9.5-8.5c14.8-13.2 46.2-13.2 61 0zM136 208.5c0 17.7 14.3 32 32 32s32-14.3 32-32-14.3-32-32-32-32 14.3-32 32zm365.1 194c-8-20.8-31.5-31.5-53.1-25.9l-8.4 2.2-2.3-8.4c-5.9-21.4-27-36.5-49-33-25.2 4-40.6 28.6-34 52.6l22.9 82.6c1.5 5.3 7 8.5 12.4 7.1l83-21.5c24.1-6.3 37.7-31.8 28.5-55.7zM334 436.3c-26.1 12.5-55.2 19.7-86 19.7-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200c0 22.1-3.7 43.3-10.4 63.2 9 6.4 17 14.2 22.6 23.9 6.4.1 12.6 1.4 18.6 2.9 10.9-27.9 17.1-58.2 17.1-90C496 119 385 8 248 8S0 119 0 256s111 248 248 248c35.4 0 68.9-7.5 99.4-20.9-2.5-7.3 4.3 17.2-13.4-46.8z\"]\n};\nvar faLaugh = {\n prefix: 'far',\n iconName: 'laugh',\n icon: [496, 512, [], \"f599\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm141.4 389.4c-37.8 37.8-88 58.6-141.4 58.6s-103.6-20.8-141.4-58.6S48 309.4 48 256s20.8-103.6 58.6-141.4S194.6 56 248 56s103.6 20.8 141.4 58.6S448 202.6 448 256s-20.8 103.6-58.6 141.4zM328 224c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32zm-160 0c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32zm194.4 64H133.6c-8.2 0-14.5 7-13.5 15 7.5 59.2 58.9 105 121.1 105h13.6c62.2 0 113.6-45.8 121.1-105 1-8-5.3-15-13.5-15z\"]\n};\nvar faLaughBeam = {\n prefix: 'far',\n iconName: 'laugh-beam',\n icon: [496, 512, [], \"f59a\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm141.4 389.4c-37.8 37.8-88 58.6-141.4 58.6s-103.6-20.8-141.4-58.6S48 309.4 48 256s20.8-103.6 58.6-141.4S194.6 56 248 56s103.6 20.8 141.4 58.6S448 202.6 448 256s-20.8 103.6-58.6 141.4zM328 152c-23.8 0-52.7 29.3-56 71.4-.7 8.6 10.8 11.9 14.9 4.5l9.5-17c7.7-13.7 19.2-21.6 31.5-21.6s23.8 7.9 31.5 21.6l9.5 17c4.1 7.4 15.6 4 14.9-4.5-3.1-42.1-32-71.4-55.8-71.4zm-201 75.9l9.5-17c7.7-13.7 19.2-21.6 31.5-21.6s23.8 7.9 31.5 21.6l9.5 17c4.1 7.4 15.6 4 14.9-4.5-3.3-42.1-32.2-71.4-56-71.4s-52.7 29.3-56 71.4c-.6 8.5 10.9 11.9 15.1 4.5zM362.4 288H133.6c-8.2 0-14.5 7-13.5 15 7.5 59.2 58.9 105 121.1 105h13.6c62.2 0 113.6-45.8 121.1-105 1-8-5.3-15-13.5-15z\"]\n};\nvar faLaughSquint = {\n prefix: 'far',\n iconName: 'laugh-squint',\n icon: [496, 512, [], \"f59b\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm141.4 389.4c-37.8 37.8-88 58.6-141.4 58.6s-103.6-20.8-141.4-58.6S48 309.4 48 256s20.8-103.6 58.6-141.4S194.6 56 248 56s103.6 20.8 141.4 58.6S448 202.6 448 256s-20.8 103.6-58.6 141.4zM343.6 196l33.6-40.3c8.6-10.3-3.8-24.8-15.4-18l-80 48c-7.8 4.7-7.8 15.9 0 20.6l80 48c11.5 6.8 24-7.6 15.4-18L343.6 196zm-209.4 58.3l80-48c7.8-4.7 7.8-15.9 0-20.6l-80-48c-11.6-6.9-24 7.7-15.4 18l33.6 40.3-33.6 40.3c-8.7 10.4 3.8 24.8 15.4 18zM362.4 288H133.6c-8.2 0-14.5 7-13.5 15 7.5 59.2 58.9 105 121.1 105h13.6c62.2 0 113.6-45.8 121.1-105 1-8-5.3-15-13.5-15z\"]\n};\nvar faLaughWink = {\n prefix: 'far',\n iconName: 'laugh-wink',\n icon: [496, 512, [], \"f59c\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm141.4 389.4c-37.8 37.8-88 58.6-141.4 58.6s-103.6-20.8-141.4-58.6C68.8 359.6 48 309.4 48 256s20.8-103.6 58.6-141.4C144.4 76.8 194.6 56 248 56s103.6 20.8 141.4 58.6c37.8 37.8 58.6 88 58.6 141.4s-20.8 103.6-58.6 141.4zM328 164c-25.7 0-55.9 16.9-59.9 42.1-1.7 11.2 11.5 18.2 19.8 10.8l9.5-8.5c14.8-13.2 46.2-13.2 61 0l9.5 8.5c8.5 7.4 21.6.3 19.8-10.8-3.8-25.2-34-42.1-59.7-42.1zm-160 60c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32zm194.4 64H133.6c-8.2 0-14.5 7-13.5 15 7.5 59.2 58.9 105 121.1 105h13.6c62.2 0 113.6-45.8 121.1-105 1-8-5.3-15-13.5-15z\"]\n};\nvar faLemon = {\n prefix: 'far',\n iconName: 'lemon',\n icon: [512, 512, [], \"f094\", \"M484.112 27.889C455.989-.233 416.108-8.057 387.059 8.865 347.604 31.848 223.504-41.111 91.196 91.197-41.277 223.672 31.923 347.472 8.866 387.058c-16.922 29.051-9.1 68.932 19.022 97.054 28.135 28.135 68.011 35.938 97.057 19.021 39.423-22.97 163.557 49.969 295.858-82.329 132.474-132.477 59.273-256.277 82.331-295.861 16.922-29.05 9.1-68.931-19.022-97.054zm-22.405 72.894c-38.8 66.609 45.6 165.635-74.845 286.08-120.44 120.443-219.475 36.048-286.076 74.843-22.679 13.207-64.035-27.241-50.493-50.488 38.8-66.609-45.6-165.635 74.845-286.08C245.573 4.702 344.616 89.086 411.219 50.292c22.73-13.24 64.005 27.288 50.488 50.491zm-169.861 8.736c1.37 10.96-6.404 20.957-17.365 22.327-54.846 6.855-135.779 87.787-142.635 142.635-1.373 10.989-11.399 18.734-22.326 17.365-10.961-1.37-18.735-11.366-17.365-22.326 9.162-73.286 104.167-168.215 177.365-177.365 10.953-1.368 20.956 6.403 22.326 17.364z\"]\n};\nvar faLifeRing = {\n prefix: 'far',\n iconName: 'life-ring',\n icon: [512, 512, [], \"f1cd\", \"M256 504c136.967 0 248-111.033 248-248S392.967 8 256 8 8 119.033 8 256s111.033 248 248 248zm-103.398-76.72l53.411-53.411c31.806 13.506 68.128 13.522 99.974 0l53.411 53.411c-63.217 38.319-143.579 38.319-206.796 0zM336 256c0 44.112-35.888 80-80 80s-80-35.888-80-80 35.888-80 80-80 80 35.888 80 80zm91.28 103.398l-53.411-53.411c13.505-31.806 13.522-68.128 0-99.974l53.411-53.411c38.319 63.217 38.319 143.579 0 206.796zM359.397 84.72l-53.411 53.411c-31.806-13.505-68.128-13.522-99.973 0L152.602 84.72c63.217-38.319 143.579-38.319 206.795 0zM84.72 152.602l53.411 53.411c-13.506 31.806-13.522 68.128 0 99.974L84.72 359.398c-38.319-63.217-38.319-143.579 0-206.796z\"]\n};\nvar faLightbulb = {\n prefix: 'far',\n iconName: 'lightbulb',\n icon: [352, 512, [], \"f0eb\", \"M176 80c-52.94 0-96 43.06-96 96 0 8.84 7.16 16 16 16s16-7.16 16-16c0-35.3 28.72-64 64-64 8.84 0 16-7.16 16-16s-7.16-16-16-16zM96.06 459.17c0 3.15.93 6.22 2.68 8.84l24.51 36.84c2.97 4.46 7.97 7.14 13.32 7.14h78.85c5.36 0 10.36-2.68 13.32-7.14l24.51-36.84c1.74-2.62 2.67-5.7 2.68-8.84l.05-43.18H96.02l.04 43.18zM176 0C73.72 0 0 82.97 0 176c0 44.37 16.45 84.85 43.56 115.78 16.64 18.99 42.74 58.8 52.42 92.16v.06h48v-.12c-.01-4.77-.72-9.51-2.15-14.07-5.59-17.81-22.82-64.77-62.17-109.67-20.54-23.43-31.52-53.15-31.61-84.14-.2-73.64 59.67-128 127.95-128 70.58 0 128 57.42 128 128 0 30.97-11.24 60.85-31.65 84.14-39.11 44.61-56.42 91.47-62.1 109.46a47.507 47.507 0 0 0-2.22 14.3v.1h48v-.05c9.68-33.37 35.78-73.18 52.42-92.16C335.55 260.85 352 220.37 352 176 352 78.8 273.2 0 176 0z\"]\n};\nvar faListAlt = {\n prefix: 'far',\n iconName: 'list-alt',\n icon: [512, 512, [], \"f022\", \"M464 32H48C21.49 32 0 53.49 0 80v352c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48V80c0-26.51-21.49-48-48-48zm-6 400H54a6 6 0 0 1-6-6V86a6 6 0 0 1 6-6h404a6 6 0 0 1 6 6v340a6 6 0 0 1-6 6zm-42-92v24c0 6.627-5.373 12-12 12H204c-6.627 0-12-5.373-12-12v-24c0-6.627 5.373-12 12-12h200c6.627 0 12 5.373 12 12zm0-96v24c0 6.627-5.373 12-12 12H204c-6.627 0-12-5.373-12-12v-24c0-6.627 5.373-12 12-12h200c6.627 0 12 5.373 12 12zm0-96v24c0 6.627-5.373 12-12 12H204c-6.627 0-12-5.373-12-12v-24c0-6.627 5.373-12 12-12h200c6.627 0 12 5.373 12 12zm-252 12c0 19.882-16.118 36-36 36s-36-16.118-36-36 16.118-36 36-36 36 16.118 36 36zm0 96c0 19.882-16.118 36-36 36s-36-16.118-36-36 16.118-36 36-36 36 16.118 36 36zm0 96c0 19.882-16.118 36-36 36s-36-16.118-36-36 16.118-36 36-36 36 16.118 36 36z\"]\n};\nvar faMap = {\n prefix: 'far',\n iconName: 'map',\n icon: [576, 512, [], \"f279\", \"M560.02 32c-1.96 0-3.98.37-5.96 1.16L384.01 96H384L212 35.28A64.252 64.252 0 0 0 191.76 32c-6.69 0-13.37 1.05-19.81 3.14L20.12 87.95A32.006 32.006 0 0 0 0 117.66v346.32C0 473.17 7.53 480 15.99 480c1.96 0 3.97-.37 5.96-1.16L192 416l172 60.71a63.98 63.98 0 0 0 40.05.15l151.83-52.81A31.996 31.996 0 0 0 576 394.34V48.02c0-9.19-7.53-16.02-15.98-16.02zM224 90.42l128 45.19v285.97l-128-45.19V90.42zM48 418.05V129.07l128-44.53v286.2l-.64.23L48 418.05zm480-35.13l-128 44.53V141.26l.64-.24L528 93.95v288.97z\"]\n};\nvar faMeh = {\n prefix: 'far',\n iconName: 'meh',\n icon: [496, 512, [], \"f11a\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm-80-216c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32zm160-64c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32zm8 144H160c-13.2 0-24 10.8-24 24s10.8 24 24 24h176c13.2 0 24-10.8 24-24s-10.8-24-24-24z\"]\n};\nvar faMehBlank = {\n prefix: 'far',\n iconName: 'meh-blank',\n icon: [496, 512, [], \"f5a4\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm-80-280c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32zm160 0c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32z\"]\n};\nvar faMehRollingEyes = {\n prefix: 'far',\n iconName: 'meh-rolling-eyes',\n icon: [496, 512, [], \"f5a5\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm88-304c-39.8 0-72 32.2-72 72s32.2 72 72 72 72-32.2 72-72-32.2-72-72-72zm0 112c-22.1 0-40-17.9-40-40 0-13.6 7.3-25.1 17.7-32.3-1 2.6-1.7 5.3-1.7 8.3 0 13.3 10.7 24 24 24s24-10.7 24-24c0-2.9-.7-5.7-1.7-8.3 10.4 7.2 17.7 18.7 17.7 32.3 0 22.1-17.9 40-40 40zm-104-40c0-39.8-32.2-72-72-72s-72 32.2-72 72 32.2 72 72 72 72-32.2 72-72zm-112 0c0-13.6 7.3-25.1 17.7-32.3-1 2.6-1.7 5.3-1.7 8.3 0 13.3 10.7 24 24 24s24-10.7 24-24c0-2.9-.7-5.7-1.7-8.3 10.4 7.2 17.7 18.7 17.7 32.3 0 22.1-17.9 40-40 40s-40-17.9-40-40zm192 128H184c-13.2 0-24 10.8-24 24s10.8 24 24 24h128c13.2 0 24-10.8 24-24s-10.8-24-24-24z\"]\n};\nvar faMinusSquare = {\n prefix: 'far',\n iconName: 'minus-square',\n icon: [448, 512, [], \"f146\", \"M108 284c-6.6 0-12-5.4-12-12v-32c0-6.6 5.4-12 12-12h232c6.6 0 12 5.4 12 12v32c0 6.6-5.4 12-12 12H108zM448 80v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V80c0-26.5 21.5-48 48-48h352c26.5 0 48 21.5 48 48zm-48 346V86c0-3.3-2.7-6-6-6H54c-3.3 0-6 2.7-6 6v340c0 3.3 2.7 6 6 6h340c3.3 0 6-2.7 6-6z\"]\n};\nvar faMoneyBillAlt = {\n prefix: 'far',\n iconName: 'money-bill-alt',\n icon: [640, 512, [], \"f3d1\", \"M320 144c-53.02 0-96 50.14-96 112 0 61.85 42.98 112 96 112 53 0 96-50.13 96-112 0-61.86-42.98-112-96-112zm40 168c0 4.42-3.58 8-8 8h-64c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h16v-55.44l-.47.31a7.992 7.992 0 0 1-11.09-2.22l-8.88-13.31a7.992 7.992 0 0 1 2.22-11.09l15.33-10.22a23.99 23.99 0 0 1 13.31-4.03H328c4.42 0 8 3.58 8 8v88h16c4.42 0 8 3.58 8 8v16zM608 64H32C14.33 64 0 78.33 0 96v320c0 17.67 14.33 32 32 32h576c17.67 0 32-14.33 32-32V96c0-17.67-14.33-32-32-32zm-16 272c-35.35 0-64 28.65-64 64H112c0-35.35-28.65-64-64-64V176c35.35 0 64-28.65 64-64h416c0 35.35 28.65 64 64 64v160z\"]\n};\nvar faMoon = {\n prefix: 'far',\n iconName: 'moon',\n icon: [512, 512, [], \"f186\", \"M279.135 512c78.756 0 150.982-35.804 198.844-94.775 28.27-34.831-2.558-85.722-46.249-77.401-82.348 15.683-158.272-47.268-158.272-130.792 0-48.424 26.06-92.292 67.434-115.836 38.745-22.05 28.999-80.788-15.022-88.919A257.936 257.936 0 0 0 279.135 0c-141.36 0-256 114.575-256 256 0 141.36 114.576 256 256 256zm0-464c12.985 0 25.689 1.201 38.016 3.478-54.76 31.163-91.693 90.042-91.693 157.554 0 113.848 103.641 199.2 215.252 177.944C402.574 433.964 344.366 464 279.135 464c-114.875 0-208-93.125-208-208s93.125-208 208-208z\"]\n};\nvar faNewspaper = {\n prefix: 'far',\n iconName: 'newspaper',\n icon: [576, 512, [], \"f1ea\", \"M552 64H112c-20.858 0-38.643 13.377-45.248 32H24c-13.255 0-24 10.745-24 24v272c0 30.928 25.072 56 56 56h496c13.255 0 24-10.745 24-24V88c0-13.255-10.745-24-24-24zM48 392V144h16v248c0 4.411-3.589 8-8 8s-8-3.589-8-8zm480 8H111.422c.374-2.614.578-5.283.578-8V112h416v288zM172 280h136c6.627 0 12-5.373 12-12v-96c0-6.627-5.373-12-12-12H172c-6.627 0-12 5.373-12 12v96c0 6.627 5.373 12 12 12zm28-80h80v40h-80v-40zm-40 140v-24c0-6.627 5.373-12 12-12h136c6.627 0 12 5.373 12 12v24c0 6.627-5.373 12-12 12H172c-6.627 0-12-5.373-12-12zm192 0v-24c0-6.627 5.373-12 12-12h104c6.627 0 12 5.373 12 12v24c0 6.627-5.373 12-12 12H364c-6.627 0-12-5.373-12-12zm0-144v-24c0-6.627 5.373-12 12-12h104c6.627 0 12 5.373 12 12v24c0 6.627-5.373 12-12 12H364c-6.627 0-12-5.373-12-12zm0 72v-24c0-6.627 5.373-12 12-12h104c6.627 0 12 5.373 12 12v24c0 6.627-5.373 12-12 12H364c-6.627 0-12-5.373-12-12z\"]\n};\nvar faObjectGroup = {\n prefix: 'far',\n iconName: 'object-group',\n icon: [512, 512, [], \"f247\", \"M500 128c6.627 0 12-5.373 12-12V44c0-6.627-5.373-12-12-12h-72c-6.627 0-12 5.373-12 12v12H96V44c0-6.627-5.373-12-12-12H12C5.373 32 0 37.373 0 44v72c0 6.627 5.373 12 12 12h12v256H12c-6.627 0-12 5.373-12 12v72c0 6.627 5.373 12 12 12h72c6.627 0 12-5.373 12-12v-12h320v12c0 6.627 5.373 12 12 12h72c6.627 0 12-5.373 12-12v-72c0-6.627-5.373-12-12-12h-12V128h12zm-52-64h32v32h-32V64zM32 64h32v32H32V64zm32 384H32v-32h32v32zm416 0h-32v-32h32v32zm-40-64h-12c-6.627 0-12 5.373-12 12v12H96v-12c0-6.627-5.373-12-12-12H72V128h12c6.627 0 12-5.373 12-12v-12h320v12c0 6.627 5.373 12 12 12h12v256zm-36-192h-84v-52c0-6.628-5.373-12-12-12H108c-6.627 0-12 5.372-12 12v168c0 6.628 5.373 12 12 12h84v52c0 6.628 5.373 12 12 12h200c6.627 0 12-5.372 12-12V204c0-6.628-5.373-12-12-12zm-268-24h144v112H136V168zm240 176H232v-24h76c6.627 0 12-5.372 12-12v-76h56v112z\"]\n};\nvar faObjectUngroup = {\n prefix: 'far',\n iconName: 'object-ungroup',\n icon: [576, 512, [], \"f248\", \"M564 224c6.627 0 12-5.373 12-12v-72c0-6.627-5.373-12-12-12h-72c-6.627 0-12 5.373-12 12v12h-88v-24h12c6.627 0 12-5.373 12-12V44c0-6.627-5.373-12-12-12h-72c-6.627 0-12 5.373-12 12v12H96V44c0-6.627-5.373-12-12-12H12C5.373 32 0 37.373 0 44v72c0 6.627 5.373 12 12 12h12v160H12c-6.627 0-12 5.373-12 12v72c0 6.627 5.373 12 12 12h72c6.627 0 12-5.373 12-12v-12h88v24h-12c-6.627 0-12 5.373-12 12v72c0 6.627 5.373 12 12 12h72c6.627 0 12-5.373 12-12v-12h224v12c0 6.627 5.373 12 12 12h72c6.627 0 12-5.373 12-12v-72c0-6.627-5.373-12-12-12h-12V224h12zM352 64h32v32h-32V64zm0 256h32v32h-32v-32zM64 352H32v-32h32v32zm0-256H32V64h32v32zm32 216v-12c0-6.627-5.373-12-12-12H72V128h12c6.627 0 12-5.373 12-12v-12h224v12c0 6.627 5.373 12 12 12h12v160h-12c-6.627 0-12 5.373-12 12v12H96zm128 136h-32v-32h32v32zm280-64h-12c-6.627 0-12 5.373-12 12v12H256v-12c0-6.627-5.373-12-12-12h-12v-24h88v12c0 6.627 5.373 12 12 12h72c6.627 0 12-5.373 12-12v-72c0-6.627-5.373-12-12-12h-12v-88h88v12c0 6.627 5.373 12 12 12h12v160zm40 64h-32v-32h32v32zm0-256h-32v-32h32v32z\"]\n};\nvar faPaperPlane = {\n prefix: 'far',\n iconName: 'paper-plane',\n icon: [512, 512, [], \"f1d8\", \"M440 6.5L24 246.4c-34.4 19.9-31.1 70.8 5.7 85.9L144 379.6V464c0 46.4 59.2 65.5 86.6 28.6l43.8-59.1 111.9 46.2c5.9 2.4 12.1 3.6 18.3 3.6 8.2 0 16.3-2.1 23.6-6.2 12.8-7.2 21.6-20 23.9-34.5l59.4-387.2c6.1-40.1-36.9-68.8-71.5-48.9zM192 464v-64.6l36.6 15.1L192 464zm212.6-28.7l-153.8-63.5L391 169.5c10.7-15.5-9.5-33.5-23.7-21.2L155.8 332.6 48 288 464 48l-59.4 387.3z\"]\n};\nvar faPauseCircle = {\n prefix: 'far',\n iconName: 'pause-circle',\n icon: [512, 512, [], \"f28b\", \"M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm0 448c-110.5 0-200-89.5-200-200S145.5 56 256 56s200 89.5 200 200-89.5 200-200 200zm96-280v160c0 8.8-7.2 16-16 16h-48c-8.8 0-16-7.2-16-16V176c0-8.8 7.2-16 16-16h48c8.8 0 16 7.2 16 16zm-112 0v160c0 8.8-7.2 16-16 16h-48c-8.8 0-16-7.2-16-16V176c0-8.8 7.2-16 16-16h48c8.8 0 16 7.2 16 16z\"]\n};\nvar faPlayCircle = {\n prefix: 'far',\n iconName: 'play-circle',\n icon: [512, 512, [], \"f144\", \"M371.7 238l-176-107c-15.8-8.8-35.7 2.5-35.7 21v208c0 18.4 19.8 29.8 35.7 21l176-101c16.4-9.1 16.4-32.8 0-42zM504 256C504 119 393 8 256 8S8 119 8 256s111 248 248 248 248-111 248-248zm-448 0c0-110.5 89.5-200 200-200s200 89.5 200 200-89.5 200-200 200S56 366.5 56 256z\"]\n};\nvar faPlusSquare = {\n prefix: 'far',\n iconName: 'plus-square',\n icon: [448, 512, [], \"f0fe\", \"M352 240v32c0 6.6-5.4 12-12 12h-88v88c0 6.6-5.4 12-12 12h-32c-6.6 0-12-5.4-12-12v-88h-88c-6.6 0-12-5.4-12-12v-32c0-6.6 5.4-12 12-12h88v-88c0-6.6 5.4-12 12-12h32c6.6 0 12 5.4 12 12v88h88c6.6 0 12 5.4 12 12zm96-160v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V80c0-26.5 21.5-48 48-48h352c26.5 0 48 21.5 48 48zm-48 346V86c0-3.3-2.7-6-6-6H54c-3.3 0-6 2.7-6 6v340c0 3.3 2.7 6 6 6h340c3.3 0 6-2.7 6-6z\"]\n};\nvar faQuestionCircle = {\n prefix: 'far',\n iconName: 'question-circle',\n icon: [512, 512, [], \"f059\", \"M256 8C119.043 8 8 119.083 8 256c0 136.997 111.043 248 248 248s248-111.003 248-248C504 119.083 392.957 8 256 8zm0 448c-110.532 0-200-89.431-200-200 0-110.495 89.472-200 200-200 110.491 0 200 89.471 200 200 0 110.53-89.431 200-200 200zm107.244-255.2c0 67.052-72.421 68.084-72.421 92.863V300c0 6.627-5.373 12-12 12h-45.647c-6.627 0-12-5.373-12-12v-8.659c0-35.745 27.1-50.034 47.579-61.516 17.561-9.845 28.324-16.541 28.324-29.579 0-17.246-21.999-28.693-39.784-28.693-23.189 0-33.894 10.977-48.942 29.969-4.057 5.12-11.46 6.071-16.666 2.124l-27.824-21.098c-5.107-3.872-6.251-11.066-2.644-16.363C184.846 131.491 214.94 112 261.794 112c49.071 0 101.45 38.304 101.45 88.8zM298 368c0 23.159-18.841 42-42 42s-42-18.841-42-42 18.841-42 42-42 42 18.841 42 42z\"]\n};\nvar faRegistered = {\n prefix: 'far',\n iconName: 'registered',\n icon: [512, 512, [], \"f25d\", \"M256 8C119.033 8 8 119.033 8 256s111.033 248 248 248 248-111.033 248-248S392.967 8 256 8zm0 448c-110.532 0-200-89.451-200-200 0-110.531 89.451-200 200-200 110.532 0 200 89.451 200 200 0 110.532-89.451 200-200 200zm110.442-81.791c-53.046-96.284-50.25-91.468-53.271-96.085 24.267-13.879 39.482-41.563 39.482-73.176 0-52.503-30.247-85.252-101.498-85.252h-78.667c-6.617 0-12 5.383-12 12V380c0 6.617 5.383 12 12 12h38.568c6.617 0 12-5.383 12-12v-83.663h31.958l47.515 89.303a11.98 11.98 0 0 0 10.593 6.36h42.81c9.14 0 14.914-9.799 10.51-17.791zM256.933 239.906h-33.875v-64.14h27.377c32.417 0 38.929 12.133 38.929 31.709-.001 20.913-11.518 32.431-32.431 32.431z\"]\n};\nvar faSadCry = {\n prefix: 'far',\n iconName: 'sad-cry',\n icon: [496, 512, [], \"f5b3\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm144 386.4V280c0-13.2-10.8-24-24-24s-24 10.8-24 24v151.4C315.5 447 282.8 456 248 456s-67.5-9-96-24.6V280c0-13.2-10.8-24-24-24s-24 10.8-24 24v114.4c-34.6-36-56-84.7-56-138.4 0-110.3 89.7-200 200-200s200 89.7 200 200c0 53.7-21.4 102.5-56 138.4zM205.8 234.5c4.4-2.4 6.9-7.4 6.1-12.4-4-25.2-34.2-42.1-59.8-42.1s-55.9 16.9-59.8 42.1c-.8 5 1.7 10 6.1 12.4 4.4 2.4 9.9 1.8 13.7-1.6l9.5-8.5c14.8-13.2 46.2-13.2 61 0l9.5 8.5c2.5 2.3 7.9 4.8 13.7 1.6zM344 180c-25.7 0-55.9 16.9-59.8 42.1-.8 5 1.7 10 6.1 12.4 4.5 2.4 9.9 1.8 13.7-1.6l9.5-8.5c14.8-13.2 46.2-13.2 61 0l9.5 8.5c2.5 2.2 8 4.7 13.7 1.6 4.4-2.4 6.9-7.4 6.1-12.4-3.9-25.2-34.1-42.1-59.8-42.1zm-96 92c-30.9 0-56 28.7-56 64s25.1 64 56 64 56-28.7 56-64-25.1-64-56-64z\"]\n};\nvar faSadTear = {\n prefix: 'far',\n iconName: 'sad-tear',\n icon: [496, 512, [], \"f5b4\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm8-152c-13.2 0-24 10.8-24 24s10.8 24 24 24c23.8 0 46.3 10.5 61.6 28.8 8.1 9.8 23.2 11.9 33.8 3.1 10.2-8.5 11.6-23.6 3.1-33.8C330 320.8 294.1 304 256 304zm-88-64c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32zm160-64c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32zm-165.6 98.8C151 290.1 126 325.4 126 342.9c0 22.7 18.8 41.1 42 41.1s42-18.4 42-41.1c0-17.5-25-52.8-36.4-68.1-2.8-3.7-8.4-3.7-11.2 0z\"]\n};\nvar faSave = {\n prefix: 'far',\n iconName: 'save',\n icon: [448, 512, [], \"f0c7\", \"M433.941 129.941l-83.882-83.882A48 48 0 0 0 316.118 32H48C21.49 32 0 53.49 0 80v352c0 26.51 21.49 48 48 48h352c26.51 0 48-21.49 48-48V163.882a48 48 0 0 0-14.059-33.941zM272 80v80H144V80h128zm122 352H54a6 6 0 0 1-6-6V86a6 6 0 0 1 6-6h42v104c0 13.255 10.745 24 24 24h176c13.255 0 24-10.745 24-24V83.882l78.243 78.243a6 6 0 0 1 1.757 4.243V426a6 6 0 0 1-6 6zM224 232c-48.523 0-88 39.477-88 88s39.477 88 88 88 88-39.477 88-88-39.477-88-88-88zm0 128c-22.056 0-40-17.944-40-40s17.944-40 40-40 40 17.944 40 40-17.944 40-40 40z\"]\n};\nvar faShareSquare = {\n prefix: 'far',\n iconName: 'share-square',\n icon: [576, 512, [], \"f14d\", \"M561.938 158.06L417.94 14.092C387.926-15.922 336 5.097 336 48.032v57.198c-42.45 1.88-84.03 6.55-120.76 17.99-35.17 10.95-63.07 27.58-82.91 49.42C108.22 199.2 96 232.6 96 271.94c0 61.697 33.178 112.455 84.87 144.76 37.546 23.508 85.248-12.651 71.02-55.74-15.515-47.119-17.156-70.923 84.11-78.76V336c0 42.993 51.968 63.913 81.94 33.94l143.998-144c18.75-18.74 18.75-49.14 0-67.88zM384 336V232.16C255.309 234.082 166.492 255.35 206.31 376 176.79 357.55 144 324.08 144 271.94c0-109.334 129.14-118.947 240-119.85V48l144 144-144 144zm24.74 84.493a82.658 82.658 0 0 0 20.974-9.303c7.976-4.952 18.286.826 18.286 10.214V464c0 26.51-21.49 48-48 48H48c-26.51 0-48-21.49-48-48V112c0-26.51 21.49-48 48-48h132c6.627 0 12 5.373 12 12v4.486c0 4.917-2.987 9.369-7.569 11.152-13.702 5.331-26.396 11.537-38.05 18.585a12.138 12.138 0 0 1-6.28 1.777H54a6 6 0 0 0-6 6v340a6 6 0 0 0 6 6h340a6 6 0 0 0 6-6v-25.966c0-5.37 3.579-10.059 8.74-11.541z\"]\n};\nvar faSmile = {\n prefix: 'far',\n iconName: 'smile',\n icon: [496, 512, [], \"f118\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm-80-216c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32zm160 0c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32zm4 72.6c-20.8 25-51.5 39.4-84 39.4s-63.2-14.3-84-39.4c-8.5-10.2-23.7-11.5-33.8-3.1-10.2 8.5-11.5 23.6-3.1 33.8 30 36 74.1 56.6 120.9 56.6s90.9-20.6 120.9-56.6c8.5-10.2 7.1-25.3-3.1-33.8-10.1-8.4-25.3-7.1-33.8 3.1z\"]\n};\nvar faSmileBeam = {\n prefix: 'far',\n iconName: 'smile-beam',\n icon: [496, 512, [], \"f5b8\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm84-143.4c-20.8 25-51.5 39.4-84 39.4s-63.2-14.3-84-39.4c-8.5-10.2-23.6-11.5-33.8-3.1-10.2 8.5-11.5 23.6-3.1 33.8 30 36 74.1 56.6 120.9 56.6s90.9-20.6 120.9-56.6c8.5-10.2 7.1-25.3-3.1-33.8-10.2-8.4-25.3-7.1-33.8 3.1zM136.5 211c7.7-13.7 19.2-21.6 31.5-21.6s23.8 7.9 31.5 21.6l9.5 17c2.1 3.7 6.2 4.7 9.3 3.7 3.6-1.1 6-4.5 5.7-8.3-3.3-42.1-32.2-71.4-56-71.4s-52.7 29.3-56 71.4c-.3 3.7 2.1 7.2 5.7 8.3 3.4 1.1 7.4-.5 9.3-3.7l9.5-17zM328 152c-23.8 0-52.7 29.3-56 71.4-.3 3.7 2.1 7.2 5.7 8.3 3.5 1.1 7.4-.5 9.3-3.7l9.5-17c7.7-13.7 19.2-21.6 31.5-21.6s23.8 7.9 31.5 21.6l9.5 17c2.1 3.7 6.2 4.7 9.3 3.7 3.6-1.1 6-4.5 5.7-8.3-3.3-42.1-32.2-71.4-56-71.4z\"]\n};\nvar faSmileWink = {\n prefix: 'far',\n iconName: 'smile-wink',\n icon: [496, 512, [], \"f4da\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm117.8-146.4c-10.2-8.5-25.3-7.1-33.8 3.1-20.8 25-51.5 39.4-84 39.4s-63.2-14.3-84-39.4c-8.5-10.2-23.7-11.5-33.8-3.1-10.2 8.5-11.5 23.6-3.1 33.8 30 36 74.1 56.6 120.9 56.6s90.9-20.6 120.9-56.6c8.5-10.2 7.1-25.3-3.1-33.8zM168 240c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32zm160-60c-25.7 0-55.9 16.9-59.9 42.1-1.7 11.2 11.5 18.2 19.8 10.8l9.5-8.5c14.8-13.2 46.2-13.2 61 0l9.5 8.5c8.5 7.4 21.6.3 19.8-10.8-3.8-25.2-34-42.1-59.7-42.1z\"]\n};\nvar faSnowflake = {\n prefix: 'far',\n iconName: 'snowflake',\n icon: [448, 512, [], \"f2dc\", \"M440.1 355.2l-39.2-23 34.1-9.3c8.4-2.3 13.4-11.1 11.1-19.6l-4.1-15.5c-2.2-8.5-10.9-13.6-19.3-11.3L343 298.2 271.2 256l71.9-42.2 79.7 21.7c8.4 2.3 17-2.8 19.3-11.3l4.1-15.5c2.2-8.5-2.7-17.3-11.1-19.6l-34.1-9.3 39.2-23c7.5-4.4 10.1-14.2 5.8-21.9l-7.9-13.9c-4.3-7.7-14-10.3-21.5-5.9l-39.2 23 9.1-34.7c2.2-8.5-2.7-17.3-11.1-19.6l-15.2-4.1c-8.4-2.3-17 2.8-19.3 11.3l-21.3 81-71.9 42.2v-84.5L306 70.4c6.1-6.2 6.1-16.4 0-22.6l-11.1-11.3c-6.1-6.2-16.1-6.2-22.2 0l-24.9 25.4V16c0-8.8-7-16-15.7-16h-15.7c-8.7 0-15.7 7.2-15.7 16v46.1l-24.9-25.4c-6.1-6.2-16.1-6.2-22.2 0L142.1 48c-6.1 6.2-6.1 16.4 0 22.6l58.3 59.3v84.5l-71.9-42.2-21.3-81c-2.2-8.5-10.9-13.6-19.3-11.3L72.7 84c-8.4 2.3-13.4 11.1-11.1 19.6l9.1 34.7-39.2-23c-7.5-4.4-17.1-1.8-21.5 5.9l-7.9 13.9c-4.3 7.7-1.8 17.4 5.8 21.9l39.2 23-34.1 9.1c-8.4 2.3-13.4 11.1-11.1 19.6L6 224.2c2.2 8.5 10.9 13.6 19.3 11.3l79.7-21.7 71.9 42.2-71.9 42.2-79.7-21.7c-8.4-2.3-17 2.8-19.3 11.3l-4.1 15.5c-2.2 8.5 2.7 17.3 11.1 19.6l34.1 9.3-39.2 23c-7.5 4.4-10.1 14.2-5.8 21.9L10 391c4.3 7.7 14 10.3 21.5 5.9l39.2-23-9.1 34.7c-2.2 8.5 2.7 17.3 11.1 19.6l15.2 4.1c8.4 2.3 17-2.8 19.3-11.3l21.3-81 71.9-42.2v84.5l-58.3 59.3c-6.1 6.2-6.1 16.4 0 22.6l11.1 11.3c6.1 6.2 16.1 6.2 22.2 0l24.9-25.4V496c0 8.8 7 16 15.7 16h15.7c8.7 0 15.7-7.2 15.7-16v-46.1l24.9 25.4c6.1 6.2 16.1 6.2 22.2 0l11.1-11.3c6.1-6.2 6.1-16.4 0-22.6l-58.3-59.3v-84.5l71.9 42.2 21.3 81c2.2 8.5 10.9 13.6 19.3 11.3L375 428c8.4-2.3 13.4-11.1 11.1-19.6l-9.1-34.7 39.2 23c7.5 4.4 17.1 1.8 21.5-5.9l7.9-13.9c4.6-7.5 2.1-17.3-5.5-21.7z\"]\n};\nvar faSquare = {\n prefix: 'far',\n iconName: 'square',\n icon: [448, 512, [], \"f0c8\", \"M400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zm-6 400H54c-3.3 0-6-2.7-6-6V86c0-3.3 2.7-6 6-6h340c3.3 0 6 2.7 6 6v340c0 3.3-2.7 6-6 6z\"]\n};\nvar faStar = {\n prefix: 'far',\n iconName: 'star',\n icon: [576, 512, [], \"f005\", \"M528.1 171.5L382 150.2 316.7 17.8c-11.7-23.6-45.6-23.9-57.4 0L194 150.2 47.9 171.5c-26.2 3.8-36.7 36.1-17.7 54.6l105.7 103-25 145.5c-4.5 26.3 23.2 46 46.4 33.7L288 439.6l130.7 68.7c23.2 12.2 50.9-7.4 46.4-33.7l-25-145.5 105.7-103c19-18.5 8.5-50.8-17.7-54.6zM388.6 312.3l23.7 138.4L288 385.4l-124.3 65.3 23.7-138.4-100.6-98 139-20.2 62.2-126 62.2 126 139 20.2-100.6 98z\"]\n};\nvar faStarHalf = {\n prefix: 'far',\n iconName: 'star-half',\n icon: [576, 512, [], \"f089\", \"M288 385.3l-124.3 65.4 23.7-138.4-100.6-98 139-20.2 62.2-126V0c-11.4 0-22.8 5.9-28.7 17.8L194 150.2 47.9 171.4c-26.2 3.8-36.7 36.1-17.7 54.6l105.7 103-25 145.5c-4.5 26.1 23 46 46.4 33.7L288 439.6v-54.3z\"]\n};\nvar faStickyNote = {\n prefix: 'far',\n iconName: 'sticky-note',\n icon: [448, 512, [], \"f249\", \"M448 348.106V80c0-26.51-21.49-48-48-48H48C21.49 32 0 53.49 0 80v351.988c0 26.51 21.49 48 48 48h268.118a48 48 0 0 0 33.941-14.059l83.882-83.882A48 48 0 0 0 448 348.106zm-128 80v-76.118h76.118L320 428.106zM400 80v223.988H296c-13.255 0-24 10.745-24 24v104H48V80h352z\"]\n};\nvar faStopCircle = {\n prefix: 'far',\n iconName: 'stop-circle',\n icon: [512, 512, [], \"f28d\", \"M504 256C504 119 393 8 256 8S8 119 8 256s111 248 248 248 248-111 248-248zm-448 0c0-110.5 89.5-200 200-200s200 89.5 200 200-89.5 200-200 200S56 366.5 56 256zm296-80v160c0 8.8-7.2 16-16 16H176c-8.8 0-16-7.2-16-16V176c0-8.8 7.2-16 16-16h160c8.8 0 16 7.2 16 16z\"]\n};\nvar faSun = {\n prefix: 'far',\n iconName: 'sun',\n icon: [512, 512, [], \"f185\", \"M494.2 221.9l-59.8-40.5 13.7-71c2.6-13.2-1.6-26.8-11.1-36.4-9.6-9.5-23.2-13.7-36.2-11.1l-70.9 13.7-40.4-59.9c-15.1-22.3-51.9-22.3-67 0l-40.4 59.9-70.8-13.7C98 60.4 84.5 64.5 75 74.1c-9.5 9.6-13.7 23.1-11.1 36.3l13.7 71-59.8 40.5C6.6 229.5 0 242 0 255.5s6.7 26 17.8 33.5l59.8 40.5-13.7 71c-2.6 13.2 1.6 26.8 11.1 36.3 9.5 9.5 22.9 13.7 36.3 11.1l70.8-13.7 40.4 59.9C230 505.3 242.6 512 256 512s26-6.7 33.5-17.8l40.4-59.9 70.9 13.7c13.4 2.7 26.8-1.6 36.3-11.1 9.5-9.5 13.6-23.1 11.1-36.3l-13.7-71 59.8-40.5c11.1-7.5 17.8-20.1 17.8-33.5-.1-13.6-6.7-26.1-17.9-33.7zm-112.9 85.6l17.6 91.2-91-17.6L256 458l-51.9-77-90.9 17.6 17.6-91.2-76.8-52 76.8-52-17.6-91.2 91 17.6L256 53l51.9 76.9 91-17.6-17.6 91.1 76.8 52-76.8 52.1zM256 152c-57.3 0-104 46.7-104 104s46.7 104 104 104 104-46.7 104-104-46.7-104-104-104zm0 160c-30.9 0-56-25.1-56-56s25.1-56 56-56 56 25.1 56 56-25.1 56-56 56z\"]\n};\nvar faSurprise = {\n prefix: 'far',\n iconName: 'surprise',\n icon: [496, 512, [], \"f5c2\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm0-176c-35.3 0-64 28.7-64 64s28.7 64 64 64 64-28.7 64-64-28.7-64-64-64zm-48-72c0-17.7-14.3-32-32-32s-32 14.3-32 32 14.3 32 32 32 32-14.3 32-32zm128-32c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32z\"]\n};\nvar faThumbsDown = {\n prefix: 'far',\n iconName: 'thumbs-down',\n icon: [512, 512, [], \"f165\", \"M466.27 225.31c4.674-22.647.864-44.538-8.99-62.99 2.958-23.868-4.021-48.565-17.34-66.99C438.986 39.423 404.117 0 327 0c-7 0-15 .01-22.22.01C201.195.01 168.997 40 128 40h-10.845c-5.64-4.975-13.042-8-21.155-8H32C14.327 32 0 46.327 0 64v240c0 17.673 14.327 32 32 32h64c11.842 0 22.175-6.438 27.708-16h7.052c19.146 16.953 46.013 60.653 68.76 83.4 13.667 13.667 10.153 108.6 71.76 108.6 57.58 0 95.27-31.936 95.27-104.73 0-18.41-3.93-33.73-8.85-46.54h36.48c48.602 0 85.82-41.565 85.82-85.58 0-19.15-4.96-34.99-13.73-49.84zM64 296c-13.255 0-24-10.745-24-24s10.745-24 24-24 24 10.745 24 24-10.745 24-24 24zm330.18 16.73H290.19c0 37.82 28.36 55.37 28.36 94.54 0 23.75 0 56.73-47.27 56.73-18.91-18.91-9.46-66.18-37.82-94.54C206.9 342.89 167.28 272 138.92 272H128V85.83c53.611 0 100.001-37.82 171.64-37.82h37.82c35.512 0 60.82 17.12 53.12 65.9 15.2 8.16 26.5 36.44 13.94 57.57 21.581 20.384 18.699 51.065 5.21 65.62 9.45 0 22.36 18.91 22.27 37.81-.09 18.91-16.71 37.82-37.82 37.82z\"]\n};\nvar faThumbsUp = {\n prefix: 'far',\n iconName: 'thumbs-up',\n icon: [512, 512, [], \"f164\", \"M466.27 286.69C475.04 271.84 480 256 480 236.85c0-44.015-37.218-85.58-85.82-85.58H357.7c4.92-12.81 8.85-28.13 8.85-46.54C366.55 31.936 328.86 0 271.28 0c-61.607 0-58.093 94.933-71.76 108.6-22.747 22.747-49.615 66.447-68.76 83.4H32c-17.673 0-32 14.327-32 32v240c0 17.673 14.327 32 32 32h64c14.893 0 27.408-10.174 30.978-23.95 44.509 1.001 75.06 39.94 177.802 39.94 7.22 0 15.22.01 22.22.01 77.117 0 111.986-39.423 112.94-95.33 13.319-18.425 20.299-43.122 17.34-66.99 9.854-18.452 13.664-40.343 8.99-62.99zm-61.75 53.83c12.56 21.13 1.26 49.41-13.94 57.57 7.7 48.78-17.608 65.9-53.12 65.9h-37.82c-71.639 0-118.029-37.82-171.64-37.82V240h10.92c28.36 0 67.98-70.89 94.54-97.46 28.36-28.36 18.91-75.63 37.82-94.54 47.27 0 47.27 32.98 47.27 56.73 0 39.17-28.36 56.72-28.36 94.54h103.99c21.11 0 37.73 18.91 37.82 37.82.09 18.9-12.82 37.81-22.27 37.81 13.489 14.555 16.371 45.236-5.21 65.62zM88 432c0 13.255-10.745 24-24 24s-24-10.745-24-24 10.745-24 24-24 24 10.745 24 24z\"]\n};\nvar faTimesCircle = {\n prefix: 'far',\n iconName: 'times-circle',\n icon: [512, 512, [], \"f057\", \"M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm0 448c-110.5 0-200-89.5-200-200S145.5 56 256 56s200 89.5 200 200-89.5 200-200 200zm101.8-262.2L295.6 256l62.2 62.2c4.7 4.7 4.7 12.3 0 17l-22.6 22.6c-4.7 4.7-12.3 4.7-17 0L256 295.6l-62.2 62.2c-4.7 4.7-12.3 4.7-17 0l-22.6-22.6c-4.7-4.7-4.7-12.3 0-17l62.2-62.2-62.2-62.2c-4.7-4.7-4.7-12.3 0-17l22.6-22.6c4.7-4.7 12.3-4.7 17 0l62.2 62.2 62.2-62.2c4.7-4.7 12.3-4.7 17 0l22.6 22.6c4.7 4.7 4.7 12.3 0 17z\"]\n};\nvar faTired = {\n prefix: 'far',\n iconName: 'tired',\n icon: [496, 512, [], \"f5c8\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm129.1-303.8c-3.8-4.4-10.3-5.4-15.3-2.5l-80 48c-3.6 2.2-5.8 6.1-5.8 10.3s2.2 8.1 5.8 10.3l80 48c5.4 3.2 11.8 1.6 15.3-2.5 3.8-4.5 3.9-11 .1-15.5L343.6 208l33.6-40.3c3.8-4.5 3.7-11.1-.1-15.5zM220 208c0-4.2-2.2-8.1-5.8-10.3l-80-48c-5-3-11.5-1.9-15.3 2.5-3.8 4.5-3.9 11-.1 15.5l33.6 40.3-33.6 40.3c-3.8 4.5-3.7 11 .1 15.5 3.5 4.1 9.9 5.7 15.3 2.5l80-48c3.6-2.2 5.8-6.1 5.8-10.3zm28 64c-45.4 0-100.9 38.3-107.8 93.3-1.5 11.8 6.9 21.6 15.5 17.9C178.4 373.5 212 368 248 368s69.6 5.5 92.3 15.2c8.5 3.7 17-6 15.5-17.9-6.9-55-62.4-93.3-107.8-93.3z\"]\n};\nvar faTrashAlt = {\n prefix: 'far',\n iconName: 'trash-alt',\n icon: [448, 512, [], \"f2ed\", \"M268 416h24a12 12 0 0 0 12-12V188a12 12 0 0 0-12-12h-24a12 12 0 0 0-12 12v216a12 12 0 0 0 12 12zM432 80h-82.41l-34-56.7A48 48 0 0 0 274.41 0H173.59a48 48 0 0 0-41.16 23.3L98.41 80H16A16 16 0 0 0 0 96v16a16 16 0 0 0 16 16h16v336a48 48 0 0 0 48 48h288a48 48 0 0 0 48-48V128h16a16 16 0 0 0 16-16V96a16 16 0 0 0-16-16zM171.84 50.91A6 6 0 0 1 177 48h94a6 6 0 0 1 5.15 2.91L293.61 80H154.39zM368 464H80V128h288zm-212-48h24a12 12 0 0 0 12-12V188a12 12 0 0 0-12-12h-24a12 12 0 0 0-12 12v216a12 12 0 0 0 12 12z\"]\n};\nvar faUser = {\n prefix: 'far',\n iconName: 'user',\n icon: [448, 512, [], \"f007\", \"M313.6 304c-28.7 0-42.5 16-89.6 16-47.1 0-60.8-16-89.6-16C60.2 304 0 364.2 0 438.4V464c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48v-25.6c0-74.2-60.2-134.4-134.4-134.4zM400 464H48v-25.6c0-47.6 38.8-86.4 86.4-86.4 14.6 0 38.3 16 89.6 16 51.7 0 74.9-16 89.6-16 47.6 0 86.4 38.8 86.4 86.4V464zM224 288c79.5 0 144-64.5 144-144S303.5 0 224 0 80 64.5 80 144s64.5 144 144 144zm0-240c52.9 0 96 43.1 96 96s-43.1 96-96 96-96-43.1-96-96 43.1-96 96-96z\"]\n};\nvar faUserCircle = {\n prefix: 'far',\n iconName: 'user-circle',\n icon: [496, 512, [], \"f2bd\", \"M248 104c-53 0-96 43-96 96s43 96 96 96 96-43 96-96-43-96-96-96zm0 144c-26.5 0-48-21.5-48-48s21.5-48 48-48 48 21.5 48 48-21.5 48-48 48zm0-240C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-49.7 0-95.1-18.3-130.1-48.4 14.9-23 40.4-38.6 69.6-39.5 20.8 6.4 40.6 9.6 60.5 9.6s39.7-3.1 60.5-9.6c29.2 1 54.7 16.5 69.6 39.5-35 30.1-80.4 48.4-130.1 48.4zm162.7-84.1c-24.4-31.4-62.1-51.9-105.1-51.9-10.2 0-26 9.6-57.6 9.6-31.5 0-47.4-9.6-57.6-9.6-42.9 0-80.6 20.5-105.1 51.9C61.9 339.2 48 299.2 48 256c0-110.3 89.7-200 200-200s200 89.7 200 200c0 43.2-13.9 83.2-37.3 115.9z\"]\n};\nvar faWindowClose = {\n prefix: 'far',\n iconName: 'window-close',\n icon: [512, 512, [], \"f410\", \"M464 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h416c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zm0 394c0 3.3-2.7 6-6 6H54c-3.3 0-6-2.7-6-6V86c0-3.3 2.7-6 6-6h404c3.3 0 6 2.7 6 6v340zM356.5 194.6L295.1 256l61.4 61.4c4.6 4.6 4.6 12.1 0 16.8l-22.3 22.3c-4.6 4.6-12.1 4.6-16.8 0L256 295.1l-61.4 61.4c-4.6 4.6-12.1 4.6-16.8 0l-22.3-22.3c-4.6-4.6-4.6-12.1 0-16.8l61.4-61.4-61.4-61.4c-4.6-4.6-4.6-12.1 0-16.8l22.3-22.3c4.6-4.6 12.1-4.6 16.8 0l61.4 61.4 61.4-61.4c4.6-4.6 12.1-4.6 16.8 0l22.3 22.3c4.7 4.6 4.7 12.1 0 16.8z\"]\n};\nvar faWindowMaximize = {\n prefix: 'far',\n iconName: 'window-maximize',\n icon: [512, 512, [], \"f2d0\", \"M464 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h416c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zm0 394c0 3.3-2.7 6-6 6H54c-3.3 0-6-2.7-6-6V192h416v234z\"]\n};\nvar faWindowMinimize = {\n prefix: 'far',\n iconName: 'window-minimize',\n icon: [512, 512, [], \"f2d1\", \"M480 480H32c-17.7 0-32-14.3-32-32s14.3-32 32-32h448c17.7 0 32 14.3 32 32s-14.3 32-32 32z\"]\n};\nvar faWindowRestore = {\n prefix: 'far',\n iconName: 'window-restore',\n icon: [512, 512, [], \"f2d2\", \"M464 0H144c-26.5 0-48 21.5-48 48v48H48c-26.5 0-48 21.5-48 48v320c0 26.5 21.5 48 48 48h320c26.5 0 48-21.5 48-48v-48h48c26.5 0 48-21.5 48-48V48c0-26.5-21.5-48-48-48zm-96 464H48V256h320v208zm96-96h-48V144c0-26.5-21.5-48-48-48H144V48h320v320z\"]\n};\nvar _iconsCache = {\n faAddressBook: faAddressBook,\n faAddressCard: faAddressCard,\n faAngry: faAngry,\n faArrowAltCircleDown: faArrowAltCircleDown,\n faArrowAltCircleLeft: faArrowAltCircleLeft,\n faArrowAltCircleRight: faArrowAltCircleRight,\n faArrowAltCircleUp: faArrowAltCircleUp,\n faBell: faBell,\n faBellSlash: faBellSlash,\n faBookmark: faBookmark,\n faBuilding: faBuilding,\n faCalendar: faCalendar,\n faCalendarAlt: faCalendarAlt,\n faCalendarCheck: faCalendarCheck,\n faCalendarMinus: faCalendarMinus,\n faCalendarPlus: faCalendarPlus,\n faCalendarTimes: faCalendarTimes,\n faCaretSquareDown: faCaretSquareDown,\n faCaretSquareLeft: faCaretSquareLeft,\n faCaretSquareRight: faCaretSquareRight,\n faCaretSquareUp: faCaretSquareUp,\n faChartBar: faChartBar,\n faCheckCircle: faCheckCircle,\n faCheckSquare: faCheckSquare,\n faCircle: faCircle,\n faClipboard: faClipboard,\n faClock: faClock,\n faClone: faClone,\n faClosedCaptioning: faClosedCaptioning,\n faComment: faComment,\n faCommentAlt: faCommentAlt,\n faCommentDots: faCommentDots,\n faComments: faComments,\n faCompass: faCompass,\n faCopy: faCopy,\n faCopyright: faCopyright,\n faCreditCard: faCreditCard,\n faDizzy: faDizzy,\n faDotCircle: faDotCircle,\n faEdit: faEdit,\n faEnvelope: faEnvelope,\n faEnvelopeOpen: faEnvelopeOpen,\n faEye: faEye,\n faEyeSlash: faEyeSlash,\n faFile: faFile,\n faFileAlt: faFileAlt,\n faFileArchive: faFileArchive,\n faFileAudio: faFileAudio,\n faFileCode: faFileCode,\n faFileExcel: faFileExcel,\n faFileImage: faFileImage,\n faFilePdf: faFilePdf,\n faFilePowerpoint: faFilePowerpoint,\n faFileVideo: faFileVideo,\n faFileWord: faFileWord,\n faFlag: faFlag,\n faFlushed: faFlushed,\n faFolder: faFolder,\n faFolderOpen: faFolderOpen,\n faFontAwesomeLogoFull: faFontAwesomeLogoFull,\n faFrown: faFrown,\n faFrownOpen: faFrownOpen,\n faFutbol: faFutbol,\n faGem: faGem,\n faGrimace: faGrimace,\n faGrin: faGrin,\n faGrinAlt: faGrinAlt,\n faGrinBeam: faGrinBeam,\n faGrinBeamSweat: faGrinBeamSweat,\n faGrinHearts: faGrinHearts,\n faGrinSquint: faGrinSquint,\n faGrinSquintTears: faGrinSquintTears,\n faGrinStars: faGrinStars,\n faGrinTears: faGrinTears,\n faGrinTongue: faGrinTongue,\n faGrinTongueSquint: faGrinTongueSquint,\n faGrinTongueWink: faGrinTongueWink,\n faGrinWink: faGrinWink,\n faHandLizard: faHandLizard,\n faHandPaper: faHandPaper,\n faHandPeace: faHandPeace,\n faHandPointDown: faHandPointDown,\n faHandPointLeft: faHandPointLeft,\n faHandPointRight: faHandPointRight,\n faHandPointUp: faHandPointUp,\n faHandPointer: faHandPointer,\n faHandRock: faHandRock,\n faHandScissors: faHandScissors,\n faHandSpock: faHandSpock,\n faHandshake: faHandshake,\n faHdd: faHdd,\n faHeart: faHeart,\n faHospital: faHospital,\n faHourglass: faHourglass,\n faIdBadge: faIdBadge,\n faIdCard: faIdCard,\n faImage: faImage,\n faImages: faImages,\n faKeyboard: faKeyboard,\n faKiss: faKiss,\n faKissBeam: faKissBeam,\n faKissWinkHeart: faKissWinkHeart,\n faLaugh: faLaugh,\n faLaughBeam: faLaughBeam,\n faLaughSquint: faLaughSquint,\n faLaughWink: faLaughWink,\n faLemon: faLemon,\n faLifeRing: faLifeRing,\n faLightbulb: faLightbulb,\n faListAlt: faListAlt,\n faMap: faMap,\n faMeh: faMeh,\n faMehBlank: faMehBlank,\n faMehRollingEyes: faMehRollingEyes,\n faMinusSquare: faMinusSquare,\n faMoneyBillAlt: faMoneyBillAlt,\n faMoon: faMoon,\n faNewspaper: faNewspaper,\n faObjectGroup: faObjectGroup,\n faObjectUngroup: faObjectUngroup,\n faPaperPlane: faPaperPlane,\n faPauseCircle: faPauseCircle,\n faPlayCircle: faPlayCircle,\n faPlusSquare: faPlusSquare,\n faQuestionCircle: faQuestionCircle,\n faRegistered: faRegistered,\n faSadCry: faSadCry,\n faSadTear: faSadTear,\n faSave: faSave,\n faShareSquare: faShareSquare,\n faSmile: faSmile,\n faSmileBeam: faSmileBeam,\n faSmileWink: faSmileWink,\n faSnowflake: faSnowflake,\n faSquare: faSquare,\n faStar: faStar,\n faStarHalf: faStarHalf,\n faStickyNote: faStickyNote,\n faStopCircle: faStopCircle,\n faSun: faSun,\n faSurprise: faSurprise,\n faThumbsDown: faThumbsDown,\n faThumbsUp: faThumbsUp,\n faTimesCircle: faTimesCircle,\n faTired: faTired,\n faTrashAlt: faTrashAlt,\n faUser: faUser,\n faUserCircle: faUserCircle,\n faWindowClose: faWindowClose,\n faWindowMaximize: faWindowMaximize,\n faWindowMinimize: faWindowMinimize,\n faWindowRestore: faWindowRestore\n};\n\nexport { _iconsCache as far, prefix, faAddressBook, faAddressCard, faAngry, faArrowAltCircleDown, faArrowAltCircleLeft, faArrowAltCircleRight, faArrowAltCircleUp, faBell, faBellSlash, faBookmark, faBuilding, faCalendar, faCalendarAlt, faCalendarCheck, faCalendarMinus, faCalendarPlus, faCalendarTimes, faCaretSquareDown, faCaretSquareLeft, faCaretSquareRight, faCaretSquareUp, faChartBar, faCheckCircle, faCheckSquare, faCircle, faClipboard, faClock, faClone, faClosedCaptioning, faComment, faCommentAlt, faCommentDots, faComments, faCompass, faCopy, faCopyright, faCreditCard, faDizzy, faDotCircle, faEdit, faEnvelope, faEnvelopeOpen, faEye, faEyeSlash, faFile, faFileAlt, faFileArchive, faFileAudio, faFileCode, faFileExcel, faFileImage, faFilePdf, faFilePowerpoint, faFileVideo, faFileWord, faFlag, faFlushed, faFolder, faFolderOpen, faFontAwesomeLogoFull, faFrown, faFrownOpen, faFutbol, faGem, faGrimace, faGrin, faGrinAlt, faGrinBeam, faGrinBeamSweat, faGrinHearts, faGrinSquint, faGrinSquintTears, faGrinStars, faGrinTears, faGrinTongue, faGrinTongueSquint, faGrinTongueWink, faGrinWink, faHandLizard, faHandPaper, faHandPeace, faHandPointDown, faHandPointLeft, faHandPointRight, faHandPointUp, faHandPointer, faHandRock, faHandScissors, faHandSpock, faHandshake, faHdd, faHeart, faHospital, faHourglass, faIdBadge, faIdCard, faImage, faImages, faKeyboard, faKiss, faKissBeam, faKissWinkHeart, faLaugh, faLaughBeam, faLaughSquint, faLaughWink, faLemon, faLifeRing, faLightbulb, faListAlt, faMap, faMeh, faMehBlank, faMehRollingEyes, faMinusSquare, faMoneyBillAlt, faMoon, faNewspaper, faObjectGroup, faObjectUngroup, faPaperPlane, faPauseCircle, faPlayCircle, faPlusSquare, faQuestionCircle, faRegistered, faSadCry, faSadTear, faSave, faShareSquare, faSmile, faSmileBeam, faSmileWink, faSnowflake, faSquare, faStar, faStarHalf, faStickyNote, faStopCircle, faSun, faSurprise, faThumbsDown, faThumbsUp, faTimesCircle, faTired, faTrashAlt, faUser, faUserCircle, faWindowClose, faWindowMaximize, faWindowMinimize, faWindowRestore };\n", - "var prefix = \"fas\";\nvar faAd = {\n prefix: 'fas',\n iconName: 'ad',\n icon: [512, 512, [], \"f641\", \"M157.52 272h36.96L176 218.78 157.52 272zM352 256c-13.23 0-24 10.77-24 24s10.77 24 24 24 24-10.77 24-24-10.77-24-24-24zM464 64H48C21.5 64 0 85.5 0 112v288c0 26.5 21.5 48 48 48h416c26.5 0 48-21.5 48-48V112c0-26.5-21.5-48-48-48zM250.58 352h-16.94c-6.81 0-12.88-4.32-15.12-10.75L211.15 320h-70.29l-7.38 21.25A16 16 0 0 1 118.36 352h-16.94c-11.01 0-18.73-10.85-15.12-21.25L140 176.12A23.995 23.995 0 0 1 162.67 160h26.66A23.99 23.99 0 0 1 212 176.13l53.69 154.62c3.61 10.4-4.11 21.25-15.11 21.25zM424 336c0 8.84-7.16 16-16 16h-16c-4.85 0-9.04-2.27-11.98-5.68-8.62 3.66-18.09 5.68-28.02 5.68-39.7 0-72-32.3-72-72s32.3-72 72-72c8.46 0 16.46 1.73 24 4.42V176c0-8.84 7.16-16 16-16h16c8.84 0 16 7.16 16 16v160z\"]\n};\nvar faAddressBook = {\n prefix: 'fas',\n iconName: 'address-book',\n icon: [448, 512, [], \"f2b9\", \"M436 160c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-20V48c0-26.5-21.5-48-48-48H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h320c26.5 0 48-21.5 48-48v-48h20c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-20v-64h20c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-20v-64h20zm-228-32c35.3 0 64 28.7 64 64s-28.7 64-64 64-64-28.7-64-64 28.7-64 64-64zm112 236.8c0 10.6-10 19.2-22.4 19.2H118.4C106 384 96 375.4 96 364.8v-19.2c0-31.8 30.1-57.6 67.2-57.6h5c12.3 5.1 25.7 8 39.8 8s27.6-2.9 39.8-8h5c37.1 0 67.2 25.8 67.2 57.6v19.2z\"]\n};\nvar faAddressCard = {\n prefix: 'fas',\n iconName: 'address-card',\n icon: [576, 512, [], \"f2bb\", \"M528 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h480c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zm-352 96c35.3 0 64 28.7 64 64s-28.7 64-64 64-64-28.7-64-64 28.7-64 64-64zm112 236.8c0 10.6-10 19.2-22.4 19.2H86.4C74 384 64 375.4 64 364.8v-19.2c0-31.8 30.1-57.6 67.2-57.6h5c12.3 5.1 25.7 8 39.8 8s27.6-2.9 39.8-8h5c37.1 0 67.2 25.8 67.2 57.6v19.2zM512 312c0 4.4-3.6 8-8 8H360c-4.4 0-8-3.6-8-8v-16c0-4.4 3.6-8 8-8h144c4.4 0 8 3.6 8 8v16zm0-64c0 4.4-3.6 8-8 8H360c-4.4 0-8-3.6-8-8v-16c0-4.4 3.6-8 8-8h144c4.4 0 8 3.6 8 8v16zm0-64c0 4.4-3.6 8-8 8H360c-4.4 0-8-3.6-8-8v-16c0-4.4 3.6-8 8-8h144c4.4 0 8 3.6 8 8v16z\"]\n};\nvar faAdjust = {\n prefix: 'fas',\n iconName: 'adjust',\n icon: [512, 512, [], \"f042\", \"M8 256c0 136.966 111.033 248 248 248s248-111.034 248-248S392.966 8 256 8 8 119.033 8 256zm248 184V72c101.705 0 184 82.311 184 184 0 101.705-82.311 184-184 184z\"]\n};\nvar faAirFreshener = {\n prefix: 'fas',\n iconName: 'air-freshener',\n icon: [384, 512, [], \"f5d0\", \"M378.94 321.41L284.7 224h49.22c15.3 0 23.66-16.6 13.86-27.53L234.45 69.96c3.43-6.61 5.55-14 5.55-21.96 0-26.51-21.49-48-48-48s-48 21.49-48 48c0 7.96 2.12 15.35 5.55 21.96L36.22 196.47C26.42 207.4 34.78 224 50.08 224H99.3L5.06 321.41C-6.69 333.56 3.34 352 21.7 352H160v32H48c-8.84 0-16 7.16-16 16v96c0 8.84 7.16 16 16 16h288c8.84 0 16-7.16 16-16v-96c0-8.84-7.16-16-16-16H224v-32h138.3c18.36 0 28.39-18.44 16.64-30.59zM192 31.98c8.85 0 16.02 7.17 16.02 16.02 0 8.84-7.17 16.02-16.02 16.02S175.98 56.84 175.98 48c0-8.85 7.17-16.02 16.02-16.02zM304 432v32H80v-32h224z\"]\n};\nvar faAlignCenter = {\n prefix: 'fas',\n iconName: 'align-center',\n icon: [448, 512, [], \"f037\", \"M352 44v40c0 8.837-7.163 16-16 16H112c-8.837 0-16-7.163-16-16V44c0-8.837 7.163-16 16-16h224c8.837 0 16 7.163 16 16zM16 228h416c8.837 0 16-7.163 16-16v-40c0-8.837-7.163-16-16-16H16c-8.837 0-16 7.163-16 16v40c0 8.837 7.163 16 16 16zm0 256h416c8.837 0 16-7.163 16-16v-40c0-8.837-7.163-16-16-16H16c-8.837 0-16 7.163-16 16v40c0 8.837 7.163 16 16 16zm320-200H112c-8.837 0-16 7.163-16 16v40c0 8.837 7.163 16 16 16h224c8.837 0 16-7.163 16-16v-40c0-8.837-7.163-16-16-16z\"]\n};\nvar faAlignJustify = {\n prefix: 'fas',\n iconName: 'align-justify',\n icon: [448, 512, [], \"f039\", \"M0 84V44c0-8.837 7.163-16 16-16h416c8.837 0 16 7.163 16 16v40c0 8.837-7.163 16-16 16H16c-8.837 0-16-7.163-16-16zm16 144h416c8.837 0 16-7.163 16-16v-40c0-8.837-7.163-16-16-16H16c-8.837 0-16 7.163-16 16v40c0 8.837 7.163 16 16 16zm0 256h416c8.837 0 16-7.163 16-16v-40c0-8.837-7.163-16-16-16H16c-8.837 0-16 7.163-16 16v40c0 8.837 7.163 16 16 16zm0-128h416c8.837 0 16-7.163 16-16v-40c0-8.837-7.163-16-16-16H16c-8.837 0-16 7.163-16 16v40c0 8.837 7.163 16 16 16z\"]\n};\nvar faAlignLeft = {\n prefix: 'fas',\n iconName: 'align-left',\n icon: [448, 512, [], \"f036\", \"M288 44v40c0 8.837-7.163 16-16 16H16c-8.837 0-16-7.163-16-16V44c0-8.837 7.163-16 16-16h256c8.837 0 16 7.163 16 16zM0 172v40c0 8.837 7.163 16 16 16h416c8.837 0 16-7.163 16-16v-40c0-8.837-7.163-16-16-16H16c-8.837 0-16 7.163-16 16zm16 312h416c8.837 0 16-7.163 16-16v-40c0-8.837-7.163-16-16-16H16c-8.837 0-16 7.163-16 16v40c0 8.837 7.163 16 16 16zm256-200H16c-8.837 0-16 7.163-16 16v40c0 8.837 7.163 16 16 16h256c8.837 0 16-7.163 16-16v-40c0-8.837-7.163-16-16-16z\"]\n};\nvar faAlignRight = {\n prefix: 'fas',\n iconName: 'align-right',\n icon: [448, 512, [], \"f038\", \"M160 84V44c0-8.837 7.163-16 16-16h256c8.837 0 16 7.163 16 16v40c0 8.837-7.163 16-16 16H176c-8.837 0-16-7.163-16-16zM16 228h416c8.837 0 16-7.163 16-16v-40c0-8.837-7.163-16-16-16H16c-8.837 0-16 7.163-16 16v40c0 8.837 7.163 16 16 16zm0 256h416c8.837 0 16-7.163 16-16v-40c0-8.837-7.163-16-16-16H16c-8.837 0-16 7.163-16 16v40c0 8.837 7.163 16 16 16zm160-128h256c8.837 0 16-7.163 16-16v-40c0-8.837-7.163-16-16-16H176c-8.837 0-16 7.163-16 16v40c0 8.837 7.163 16 16 16z\"]\n};\nvar faAllergies = {\n prefix: 'fas',\n iconName: 'allergies',\n icon: [448, 512, [], \"f461\", \"M416 112c-17.6 0-32 14.4-32 32v72c0 4.4-3.6 8-8 8h-16c-4.4 0-8-3.6-8-8V64c0-17.6-14.4-32-32-32s-32 14.4-32 32v152c0 4.4-3.6 8-8 8h-16c-4.4 0-8-3.6-8-8V32c0-17.6-14.4-32-32-32s-32 14.4-32 32v184c0 4.4-3.6 8-8 8h-16c-4.4 0-8-3.6-8-8V64c0-17.6-14.4-32-32-32S96 46.4 96 64v241l-23.6-32.5c-13-17.9-38-21.8-55.9-8.8s-21.8 38-8.8 55.9l125.6 172.7c9 12.4 23.5 19.8 38.8 19.8h197.6c22.3 0 41.6-15.3 46.7-37l26.5-112.7c3.2-13.7 4.9-28.3 5.1-42.3V144c0-17.6-14.4-32-32-32zM176 416c-8.8 0-16-7.2-16-16s7.2-16 16-16 16 7.2 16 16-7.2 16-16 16zm0-96c-8.8 0-16-7.2-16-16s7.2-16 16-16 16 7.2 16 16-7.2 16-16 16zm64 128c-8.8 0-16-7.2-16-16s7.2-16 16-16 16 7.2 16 16-7.2 16-16 16zm0-96c-8.8 0-16-7.2-16-16s7.2-16 16-16 16 7.2 16 16-7.2 16-16 16zm64 32c-8.8 0-16-7.2-16-16s7.2-16 16-16 16 7.2 16 16-7.2 16-16 16zm32 64c-8.8 0-16-7.2-16-16s7.2-16 16-16 16 7.2 16 16-7.2 16-16 16zm32-128c-8.8 0-16-7.2-16-16s7.2-16 16-16 16 7.2 16 16-7.2 16-16 16z\"]\n};\nvar faAmbulance = {\n prefix: 'fas',\n iconName: 'ambulance',\n icon: [640, 512, [], \"f0f9\", \"M624 352h-16V243.9c0-12.7-5.1-24.9-14.1-33.9L494 110.1c-9-9-21.2-14.1-33.9-14.1H416V48c0-26.5-21.5-48-48-48H48C21.5 0 0 21.5 0 48v320c0 26.5 21.5 48 48 48h16c0 53 43 96 96 96s96-43 96-96h128c0 53 43 96 96 96s96-43 96-96h48c8.8 0 16-7.2 16-16v-32c0-8.8-7.2-16-16-16zM160 464c-26.5 0-48-21.5-48-48s21.5-48 48-48 48 21.5 48 48-21.5 48-48 48zm144-248c0 4.4-3.6 8-8 8h-56v56c0 4.4-3.6 8-8 8h-48c-4.4 0-8-3.6-8-8v-56h-56c-4.4 0-8-3.6-8-8v-48c0-4.4 3.6-8 8-8h56v-56c0-4.4 3.6-8 8-8h48c4.4 0 8 3.6 8 8v56h56c4.4 0 8 3.6 8 8v48zm176 248c-26.5 0-48-21.5-48-48s21.5-48 48-48 48 21.5 48 48-21.5 48-48 48zm80-208H416V144h44.1l99.9 99.9V256z\"]\n};\nvar faAmericanSignLanguageInterpreting = {\n prefix: 'fas',\n iconName: 'american-sign-language-interpreting',\n icon: [640, 512, [], \"f2a3\", \"M290.547 189.039c-20.295-10.149-44.147-11.199-64.739-3.89 42.606 0 71.208 20.475 85.578 50.576 8.576 17.899-5.148 38.071-23.617 38.071 18.429 0 32.211 20.136 23.617 38.071-14.725 30.846-46.123 50.854-80.298 50.854-.557 0-94.471-8.615-94.471-8.615l-66.406 33.347c-9.384 4.693-19.815.379-23.895-7.781L1.86 290.747c-4.167-8.615-1.111-18.897 6.946-23.621l58.072-33.069L108 159.861c6.39-57.245 34.731-109.767 79.743-146.726 11.391-9.448 28.341-7.781 37.51 3.613 9.446 11.394 7.78 28.067-3.612 37.516-12.503 10.559-23.618 22.509-32.509 35.57 21.672-14.729 46.679-24.732 74.186-28.067 14.725-1.945 28.063 8.336 29.73 23.065 1.945 14.728-8.336 28.067-23.062 29.734-16.116 1.945-31.12 7.503-44.178 15.284 26.114-5.713 58.712-3.138 88.079 11.115 13.336 6.669 18.893 22.509 12.224 35.848-6.389 13.06-22.504 18.617-35.564 12.226zm-27.229 69.472c-6.112-12.505-18.338-20.286-32.231-20.286a35.46 35.46 0 0 0-35.565 35.57c0 21.428 17.808 35.57 35.565 35.57 13.893 0 26.119-7.781 32.231-20.286 4.446-9.449 13.614-15.006 23.339-15.284-9.725-.277-18.893-5.835-23.339-15.284zm374.821-37.237c4.168 8.615 1.111 18.897-6.946 23.621l-58.071 33.069L532 352.16c-6.39 57.245-34.731 109.767-79.743 146.726-10.932 9.112-27.799 8.144-37.51-3.613-9.446-11.394-7.78-28.067 3.613-37.516 12.503-10.559 23.617-22.509 32.508-35.57-21.672 14.729-46.679 24.732-74.186 28.067-10.021 2.506-27.552-5.643-29.73-23.065-1.945-14.728 8.336-28.067 23.062-29.734 16.116-1.946 31.12-7.503 44.178-15.284-26.114 5.713-58.712 3.138-88.079-11.115-13.336-6.669-18.893-22.509-12.224-35.848 6.389-13.061 22.505-18.619 35.565-12.227 20.295 10.149 44.147 11.199 64.739 3.89-42.606 0-71.208-20.475-85.578-50.576-8.576-17.899 5.148-38.071 23.617-38.071-18.429 0-32.211-20.136-23.617-38.071 14.033-29.396 44.039-50.887 81.966-50.854l92.803 8.615 66.406-33.347c9.408-4.704 19.828-.354 23.894 7.781l44.455 88.926zm-229.227-18.618c-13.893 0-26.119 7.781-32.231 20.286-4.446 9.449-13.614 15.006-23.339 15.284 9.725.278 18.893 5.836 23.339 15.284 6.112 12.505 18.338 20.286 32.231 20.286a35.46 35.46 0 0 0 35.565-35.57c0-21.429-17.808-35.57-35.565-35.57z\"]\n};\nvar faAnchor = {\n prefix: 'fas',\n iconName: 'anchor',\n icon: [576, 512, [], \"f13d\", \"M12.971 352h32.394C67.172 454.735 181.944 512 288 512c106.229 0 220.853-57.38 242.635-160h32.394c10.691 0 16.045-12.926 8.485-20.485l-67.029-67.029c-4.686-4.686-12.284-4.686-16.971 0l-67.029 67.029c-7.56 7.56-2.206 20.485 8.485 20.485h35.146c-20.29 54.317-84.963 86.588-144.117 94.015V256h52c6.627 0 12-5.373 12-12v-40c0-6.627-5.373-12-12-12h-52v-5.47c37.281-13.178 63.995-48.725 64-90.518C384.005 43.772 341.605.738 289.37.01 235.723-.739 192 42.525 192 96c0 41.798 26.716 77.35 64 90.53V192h-52c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h52v190.015c-58.936-7.399-123.82-39.679-144.117-94.015h35.146c10.691 0 16.045-12.926 8.485-20.485l-67.029-67.029c-4.686-4.686-12.284-4.686-16.971 0L4.485 331.515C-3.074 339.074 2.28 352 12.971 352zM288 64c17.645 0 32 14.355 32 32s-14.355 32-32 32-32-14.355-32-32 14.355-32 32-32z\"]\n};\nvar faAngleDoubleDown = {\n prefix: 'fas',\n iconName: 'angle-double-down',\n icon: [320, 512, [], \"f103\", \"M143 256.3L7 120.3c-9.4-9.4-9.4-24.6 0-33.9l22.6-22.6c9.4-9.4 24.6-9.4 33.9 0l96.4 96.4 96.4-96.4c9.4-9.4 24.6-9.4 33.9 0L313 86.3c9.4 9.4 9.4 24.6 0 33.9l-136 136c-9.4 9.5-24.6 9.5-34 .1zm34 192l136-136c9.4-9.4 9.4-24.6 0-33.9l-22.6-22.6c-9.4-9.4-24.6-9.4-33.9 0L160 352.1l-96.4-96.4c-9.4-9.4-24.6-9.4-33.9 0L7 278.3c-9.4 9.4-9.4 24.6 0 33.9l136 136c9.4 9.5 24.6 9.5 34 .1z\"]\n};\nvar faAngleDoubleLeft = {\n prefix: 'fas',\n iconName: 'angle-double-left',\n icon: [448, 512, [], \"f100\", \"M223.7 239l136-136c9.4-9.4 24.6-9.4 33.9 0l22.6 22.6c9.4 9.4 9.4 24.6 0 33.9L319.9 256l96.4 96.4c9.4 9.4 9.4 24.6 0 33.9L393.7 409c-9.4 9.4-24.6 9.4-33.9 0l-136-136c-9.5-9.4-9.5-24.6-.1-34zm-192 34l136 136c9.4 9.4 24.6 9.4 33.9 0l22.6-22.6c9.4-9.4 9.4-24.6 0-33.9L127.9 256l96.4-96.4c9.4-9.4 9.4-24.6 0-33.9L201.7 103c-9.4-9.4-24.6-9.4-33.9 0l-136 136c-9.5 9.4-9.5 24.6-.1 34z\"]\n};\nvar faAngleDoubleRight = {\n prefix: 'fas',\n iconName: 'angle-double-right',\n icon: [448, 512, [], \"f101\", \"M224.3 273l-136 136c-9.4 9.4-24.6 9.4-33.9 0l-22.6-22.6c-9.4-9.4-9.4-24.6 0-33.9l96.4-96.4-96.4-96.4c-9.4-9.4-9.4-24.6 0-33.9L54.3 103c9.4-9.4 24.6-9.4 33.9 0l136 136c9.5 9.4 9.5 24.6.1 34zm192-34l-136-136c-9.4-9.4-24.6-9.4-33.9 0l-22.6 22.6c-9.4 9.4-9.4 24.6 0 33.9l96.4 96.4-96.4 96.4c-9.4 9.4-9.4 24.6 0 33.9l22.6 22.6c9.4 9.4 24.6 9.4 33.9 0l136-136c9.4-9.2 9.4-24.4 0-33.8z\"]\n};\nvar faAngleDoubleUp = {\n prefix: 'fas',\n iconName: 'angle-double-up',\n icon: [320, 512, [], \"f102\", \"M177 255.7l136 136c9.4 9.4 9.4 24.6 0 33.9l-22.6 22.6c-9.4 9.4-24.6 9.4-33.9 0L160 351.9l-96.4 96.4c-9.4 9.4-24.6 9.4-33.9 0L7 425.7c-9.4-9.4-9.4-24.6 0-33.9l136-136c9.4-9.5 24.6-9.5 34-.1zm-34-192L7 199.7c-9.4 9.4-9.4 24.6 0 33.9l22.6 22.6c9.4 9.4 24.6 9.4 33.9 0l96.4-96.4 96.4 96.4c9.4 9.4 24.6 9.4 33.9 0l22.6-22.6c9.4-9.4 9.4-24.6 0-33.9l-136-136c-9.2-9.4-24.4-9.4-33.8 0z\"]\n};\nvar faAngleDown = {\n prefix: 'fas',\n iconName: 'angle-down',\n icon: [320, 512, [], \"f107\", \"M143 352.3L7 216.3c-9.4-9.4-9.4-24.6 0-33.9l22.6-22.6c9.4-9.4 24.6-9.4 33.9 0l96.4 96.4 96.4-96.4c9.4-9.4 24.6-9.4 33.9 0l22.6 22.6c9.4 9.4 9.4 24.6 0 33.9l-136 136c-9.2 9.4-24.4 9.4-33.8 0z\"]\n};\nvar faAngleLeft = {\n prefix: 'fas',\n iconName: 'angle-left',\n icon: [256, 512, [], \"f104\", \"M31.7 239l136-136c9.4-9.4 24.6-9.4 33.9 0l22.6 22.6c9.4 9.4 9.4 24.6 0 33.9L127.9 256l96.4 96.4c9.4 9.4 9.4 24.6 0 33.9L201.7 409c-9.4 9.4-24.6 9.4-33.9 0l-136-136c-9.5-9.4-9.5-24.6-.1-34z\"]\n};\nvar faAngleRight = {\n prefix: 'fas',\n iconName: 'angle-right',\n icon: [256, 512, [], \"f105\", \"M224.3 273l-136 136c-9.4 9.4-24.6 9.4-33.9 0l-22.6-22.6c-9.4-9.4-9.4-24.6 0-33.9l96.4-96.4-96.4-96.4c-9.4-9.4-9.4-24.6 0-33.9L54.3 103c9.4-9.4 24.6-9.4 33.9 0l136 136c9.5 9.4 9.5 24.6.1 34z\"]\n};\nvar faAngleUp = {\n prefix: 'fas',\n iconName: 'angle-up',\n icon: [320, 512, [], \"f106\", \"M177 159.7l136 136c9.4 9.4 9.4 24.6 0 33.9l-22.6 22.6c-9.4 9.4-24.6 9.4-33.9 0L160 255.9l-96.4 96.4c-9.4 9.4-24.6 9.4-33.9 0L7 329.7c-9.4-9.4-9.4-24.6 0-33.9l136-136c9.4-9.5 24.6-9.5 34-.1z\"]\n};\nvar faAngry = {\n prefix: 'fas',\n iconName: 'angry',\n icon: [496, 512, [], \"f556\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zM136 240c0-9.3 4.1-17.5 10.5-23.4l-31-9.3c-8.5-2.5-13.3-11.5-10.7-19.9 2.5-8.5 11.4-13.2 19.9-10.7l80 24c8.5 2.5 13.3 11.5 10.7 19.9-2.1 6.9-8.4 11.4-15.3 11.4-.5 0-1.1-.2-1.7-.2.7 2.7 1.7 5.3 1.7 8.2 0 17.7-14.3 32-32 32S136 257.7 136 240zm168 154.2c-27.8-33.4-84.2-33.4-112.1 0-13.5 16.3-38.2-4.2-24.6-20.5 20-24 49.4-37.8 80.6-37.8s60.6 13.8 80.6 37.8c13.8 16.5-11.1 36.6-24.5 20.5zm76.6-186.9l-31 9.3c6.3 5.8 10.5 14.1 10.5 23.4 0 17.7-14.3 32-32 32s-32-14.3-32-32c0-2.9.9-5.6 1.7-8.2-.6.1-1.1.2-1.7.2-6.9 0-13.2-4.5-15.3-11.4-2.5-8.5 2.3-17.4 10.7-19.9l80-24c8.4-2.5 17.4 2.3 19.9 10.7 2.5 8.5-2.3 17.4-10.8 19.9z\"]\n};\nvar faAnkh = {\n prefix: 'fas',\n iconName: 'ankh',\n icon: [320, 512, [], \"f644\", \"M296 256h-44.62C272.46 222.01 288 181.65 288 144 288 55.63 230.69 0 160 0S32 55.63 32 144c0 37.65 15.54 78.01 36.62 112H24c-13.25 0-24 10.74-24 24v32c0 13.25 10.75 24 24 24h96v152c0 13.25 10.75 24 24 24h32c13.25 0 24-10.75 24-24V336h96c13.25 0 24-10.75 24-24v-32c0-13.26-10.75-24-24-24zM160 80c29.61 0 48 24.52 48 64 0 34.66-27.14 78.14-48 100.87-20.86-22.72-48-66.21-48-100.87 0-39.48 18.39-64 48-64z\"]\n};\nvar faAppleAlt = {\n prefix: 'fas',\n iconName: 'apple-alt',\n icon: [448, 512, [], \"f5d1\", \"M350.85 129c25.97 4.67 47.27 18.67 63.92 42 14.65 20.67 24.64 46.67 29.96 78 4.67 28.67 4.32 57.33-1 86-7.99 47.33-23.97 87-47.94 119-28.64 38.67-64.59 58-107.87 58-10.66 0-22.3-3.33-34.96-10-8.66-5.33-18.31-8-28.97-8s-20.3 2.67-28.97 8c-12.66 6.67-24.3 10-34.96 10-43.28 0-79.23-19.33-107.87-58-23.97-32-39.95-71.67-47.94-119-5.32-28.67-5.67-57.33-1-86 5.32-31.33 15.31-57.33 29.96-78 16.65-23.33 37.95-37.33 63.92-42 15.98-2.67 37.95-.33 65.92 7 23.97 6.67 44.28 14.67 60.93 24 16.65-9.33 36.96-17.33 60.93-24 27.98-7.33 49.96-9.67 65.94-7zm-54.94-41c-9.32 8.67-21.65 15-36.96 19-10.66 3.33-22.3 5-34.96 5l-14.98-1c-1.33-9.33-1.33-20 0-32 2.67-24 10.32-42.33 22.97-55 9.32-8.67 21.65-15 36.96-19 10.66-3.33 22.3-5 34.96-5l14.98 1 1 15c0 12.67-1.67 24.33-4.99 35-3.99 15.33-10.31 27.67-18.98 37z\"]\n};\nvar faArchive = {\n prefix: 'fas',\n iconName: 'archive',\n icon: [512, 512, [], \"f187\", \"M32 448c0 17.7 14.3 32 32 32h384c17.7 0 32-14.3 32-32V160H32v288zm160-212c0-6.6 5.4-12 12-12h104c6.6 0 12 5.4 12 12v8c0 6.6-5.4 12-12 12H204c-6.6 0-12-5.4-12-12v-8zM480 32H32C14.3 32 0 46.3 0 64v48c0 8.8 7.2 16 16 16h480c8.8 0 16-7.2 16-16V64c0-17.7-14.3-32-32-32z\"]\n};\nvar faArchway = {\n prefix: 'fas',\n iconName: 'archway',\n icon: [576, 512, [], \"f557\", \"M560 448h-16V96H32v352H16.02c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16H176c8.84 0 16-7.16 16-16V320c0-53.02 42.98-96 96-96s96 42.98 96 96l.02 160v16c0 8.84 7.16 16 16 16H560c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16zm0-448H16C7.16 0 0 7.16 0 16v32c0 8.84 7.16 16 16 16h544c8.84 0 16-7.16 16-16V16c0-8.84-7.16-16-16-16z\"]\n};\nvar faArrowAltCircleDown = {\n prefix: 'fas',\n iconName: 'arrow-alt-circle-down',\n icon: [512, 512, [], \"f358\", \"M504 256c0 137-111 248-248 248S8 393 8 256 119 8 256 8s248 111 248 248zM212 140v116h-70.9c-10.7 0-16.1 13-8.5 20.5l114.9 114.3c4.7 4.7 12.2 4.7 16.9 0l114.9-114.3c7.6-7.6 2.2-20.5-8.5-20.5H300V140c0-6.6-5.4-12-12-12h-64c-6.6 0-12 5.4-12 12z\"]\n};\nvar faArrowAltCircleLeft = {\n prefix: 'fas',\n iconName: 'arrow-alt-circle-left',\n icon: [512, 512, [], \"f359\", \"M256 504C119 504 8 393 8 256S119 8 256 8s248 111 248 248-111 248-248 248zm116-292H256v-70.9c0-10.7-13-16.1-20.5-8.5L121.2 247.5c-4.7 4.7-4.7 12.2 0 16.9l114.3 114.9c7.6 7.6 20.5 2.2 20.5-8.5V300h116c6.6 0 12-5.4 12-12v-64c0-6.6-5.4-12-12-12z\"]\n};\nvar faArrowAltCircleRight = {\n prefix: 'fas',\n iconName: 'arrow-alt-circle-right',\n icon: [512, 512, [], \"f35a\", \"M256 8c137 0 248 111 248 248S393 504 256 504 8 393 8 256 119 8 256 8zM140 300h116v70.9c0 10.7 13 16.1 20.5 8.5l114.3-114.9c4.7-4.7 4.7-12.2 0-16.9l-114.3-115c-7.6-7.6-20.5-2.2-20.5 8.5V212H140c-6.6 0-12 5.4-12 12v64c0 6.6 5.4 12 12 12z\"]\n};\nvar faArrowAltCircleUp = {\n prefix: 'fas',\n iconName: 'arrow-alt-circle-up',\n icon: [512, 512, [], \"f35b\", \"M8 256C8 119 119 8 256 8s248 111 248 248-111 248-248 248S8 393 8 256zm292 116V256h70.9c10.7 0 16.1-13 8.5-20.5L264.5 121.2c-4.7-4.7-12.2-4.7-16.9 0l-115 114.3c-7.6 7.6-2.2 20.5 8.5 20.5H212v116c0 6.6 5.4 12 12 12h64c6.6 0 12-5.4 12-12z\"]\n};\nvar faArrowCircleDown = {\n prefix: 'fas',\n iconName: 'arrow-circle-down',\n icon: [512, 512, [], \"f0ab\", \"M504 256c0 137-111 248-248 248S8 393 8 256 119 8 256 8s248 111 248 248zm-143.6-28.9L288 302.6V120c0-13.3-10.7-24-24-24h-16c-13.3 0-24 10.7-24 24v182.6l-72.4-75.5c-9.3-9.7-24.8-9.9-34.3-.4l-10.9 11c-9.4 9.4-9.4 24.6 0 33.9L239 404.3c9.4 9.4 24.6 9.4 33.9 0l132.7-132.7c9.4-9.4 9.4-24.6 0-33.9l-10.9-11c-9.5-9.5-25-9.3-34.3.4z\"]\n};\nvar faArrowCircleLeft = {\n prefix: 'fas',\n iconName: 'arrow-circle-left',\n icon: [512, 512, [], \"f0a8\", \"M256 504C119 504 8 393 8 256S119 8 256 8s248 111 248 248-111 248-248 248zm28.9-143.6L209.4 288H392c13.3 0 24-10.7 24-24v-16c0-13.3-10.7-24-24-24H209.4l75.5-72.4c9.7-9.3 9.9-24.8.4-34.3l-11-10.9c-9.4-9.4-24.6-9.4-33.9 0L107.7 239c-9.4 9.4-9.4 24.6 0 33.9l132.7 132.7c9.4 9.4 24.6 9.4 33.9 0l11-10.9c9.5-9.5 9.3-25-.4-34.3z\"]\n};\nvar faArrowCircleRight = {\n prefix: 'fas',\n iconName: 'arrow-circle-right',\n icon: [512, 512, [], \"f0a9\", \"M256 8c137 0 248 111 248 248S393 504 256 504 8 393 8 256 119 8 256 8zm-28.9 143.6l75.5 72.4H120c-13.3 0-24 10.7-24 24v16c0 13.3 10.7 24 24 24h182.6l-75.5 72.4c-9.7 9.3-9.9 24.8-.4 34.3l11 10.9c9.4 9.4 24.6 9.4 33.9 0L404.3 273c9.4-9.4 9.4-24.6 0-33.9L271.6 106.3c-9.4-9.4-24.6-9.4-33.9 0l-11 10.9c-9.5 9.6-9.3 25.1.4 34.4z\"]\n};\nvar faArrowCircleUp = {\n prefix: 'fas',\n iconName: 'arrow-circle-up',\n icon: [512, 512, [], \"f0aa\", \"M8 256C8 119 119 8 256 8s248 111 248 248-111 248-248 248S8 393 8 256zm143.6 28.9l72.4-75.5V392c0 13.3 10.7 24 24 24h16c13.3 0 24-10.7 24-24V209.4l72.4 75.5c9.3 9.7 24.8 9.9 34.3.4l10.9-11c9.4-9.4 9.4-24.6 0-33.9L273 107.7c-9.4-9.4-24.6-9.4-33.9 0L106.3 240.4c-9.4 9.4-9.4 24.6 0 33.9l10.9 11c9.6 9.5 25.1 9.3 34.4-.4z\"]\n};\nvar faArrowDown = {\n prefix: 'fas',\n iconName: 'arrow-down',\n icon: [448, 512, [], \"f063\", \"M413.1 222.5l22.2 22.2c9.4 9.4 9.4 24.6 0 33.9L241 473c-9.4 9.4-24.6 9.4-33.9 0L12.7 278.6c-9.4-9.4-9.4-24.6 0-33.9l22.2-22.2c9.5-9.5 25-9.3 34.3.4L184 343.4V56c0-13.3 10.7-24 24-24h32c13.3 0 24 10.7 24 24v287.4l114.8-120.5c9.3-9.8 24.8-10 34.3-.4z\"]\n};\nvar faArrowLeft = {\n prefix: 'fas',\n iconName: 'arrow-left',\n icon: [448, 512, [], \"f060\", \"M257.5 445.1l-22.2 22.2c-9.4 9.4-24.6 9.4-33.9 0L7 273c-9.4-9.4-9.4-24.6 0-33.9L201.4 44.7c9.4-9.4 24.6-9.4 33.9 0l22.2 22.2c9.5 9.5 9.3 25-.4 34.3L136.6 216H424c13.3 0 24 10.7 24 24v32c0 13.3-10.7 24-24 24H136.6l120.5 114.8c9.8 9.3 10 24.8.4 34.3z\"]\n};\nvar faArrowRight = {\n prefix: 'fas',\n iconName: 'arrow-right',\n icon: [448, 512, [], \"f061\", \"M190.5 66.9l22.2-22.2c9.4-9.4 24.6-9.4 33.9 0L441 239c9.4 9.4 9.4 24.6 0 33.9L246.6 467.3c-9.4 9.4-24.6 9.4-33.9 0l-22.2-22.2c-9.5-9.5-9.3-25 .4-34.3L311.4 296H24c-13.3 0-24-10.7-24-24v-32c0-13.3 10.7-24 24-24h287.4L190.9 101.2c-9.8-9.3-10-24.8-.4-34.3z\"]\n};\nvar faArrowUp = {\n prefix: 'fas',\n iconName: 'arrow-up',\n icon: [448, 512, [], \"f062\", \"M34.9 289.5l-22.2-22.2c-9.4-9.4-9.4-24.6 0-33.9L207 39c9.4-9.4 24.6-9.4 33.9 0l194.3 194.3c9.4 9.4 9.4 24.6 0 33.9L413 289.4c-9.5 9.5-25 9.3-34.3-.4L264 168.6V456c0 13.3-10.7 24-24 24h-32c-13.3 0-24-10.7-24-24V168.6L69.2 289.1c-9.3 9.8-24.8 10-34.3.4z\"]\n};\nvar faArrowsAlt = {\n prefix: 'fas',\n iconName: 'arrows-alt',\n icon: [512, 512, [], \"f0b2\", \"M352.201 425.775l-79.196 79.196c-9.373 9.373-24.568 9.373-33.941 0l-79.196-79.196c-15.119-15.119-4.411-40.971 16.971-40.97h51.162L228 284H127.196v51.162c0 21.382-25.851 32.09-40.971 16.971L7.029 272.937c-9.373-9.373-9.373-24.569 0-33.941L86.225 159.8c15.119-15.119 40.971-4.411 40.971 16.971V228H228V127.196h-51.23c-21.382 0-32.09-25.851-16.971-40.971l79.196-79.196c9.373-9.373 24.568-9.373 33.941 0l79.196 79.196c15.119 15.119 4.411 40.971-16.971 40.971h-51.162V228h100.804v-51.162c0-21.382 25.851-32.09 40.97-16.971l79.196 79.196c9.373 9.373 9.373 24.569 0 33.941L425.773 352.2c-15.119 15.119-40.971 4.411-40.97-16.971V284H284v100.804h51.23c21.382 0 32.09 25.851 16.971 40.971z\"]\n};\nvar faArrowsAltH = {\n prefix: 'fas',\n iconName: 'arrows-alt-h',\n icon: [512, 512, [], \"f337\", \"M377.941 169.941V216H134.059v-46.059c0-21.382-25.851-32.09-40.971-16.971L7.029 239.029c-9.373 9.373-9.373 24.568 0 33.941l86.059 86.059c15.119 15.119 40.971 4.411 40.971-16.971V296h243.882v46.059c0 21.382 25.851 32.09 40.971 16.971l86.059-86.059c9.373-9.373 9.373-24.568 0-33.941l-86.059-86.059c-15.119-15.12-40.971-4.412-40.971 16.97z\"]\n};\nvar faArrowsAltV = {\n prefix: 'fas',\n iconName: 'arrows-alt-v',\n icon: [256, 512, [], \"f338\", \"M214.059 377.941H168V134.059h46.059c21.382 0 32.09-25.851 16.971-40.971L144.971 7.029c-9.373-9.373-24.568-9.373-33.941 0L24.971 93.088c-15.119 15.119-4.411 40.971 16.971 40.971H88v243.882H41.941c-21.382 0-32.09 25.851-16.971 40.971l86.059 86.059c9.373 9.373 24.568 9.373 33.941 0l86.059-86.059c15.12-15.119 4.412-40.971-16.97-40.971z\"]\n};\nvar faAssistiveListeningSystems = {\n prefix: 'fas',\n iconName: 'assistive-listening-systems',\n icon: [512, 512, [], \"f2a2\", \"M216 260c0 15.464-12.536 28-28 28s-28-12.536-28-28c0-44.112 35.888-80 80-80s80 35.888 80 80c0 15.464-12.536 28-28 28s-28-12.536-28-28c0-13.234-10.767-24-24-24s-24 10.766-24 24zm24-176c-97.047 0-176 78.953-176 176 0 15.464 12.536 28 28 28s28-12.536 28-28c0-66.168 53.832-120 120-120s120 53.832 120 120c0 75.164-71.009 70.311-71.997 143.622L288 404c0 28.673-23.327 52-52 52-15.464 0-28 12.536-28 28s12.536 28 28 28c59.475 0 107.876-48.328 108-107.774.595-34.428 72-48.24 72-144.226 0-97.047-78.953-176-176-176zm-80 236c-17.673 0-32 14.327-32 32s14.327 32 32 32 32-14.327 32-32-14.327-32-32-32zM32 448c-17.673 0-32 14.327-32 32s14.327 32 32 32 32-14.327 32-32-14.327-32-32-32zm480-187.993c0-1.518-.012-3.025-.045-4.531C510.076 140.525 436.157 38.47 327.994 1.511c-14.633-4.998-30.549 2.809-35.55 17.442-5 14.633 2.81 30.549 17.442 35.55 85.906 29.354 144.61 110.513 146.077 201.953l.003.188c.026 1.118.033 2.236.033 3.363 0 15.464 12.536 28 28 28s28.001-12.536 28.001-28zM152.971 439.029l-80-80L39.03 392.97l80 80 33.941-33.941z\"]\n};\nvar faAsterisk = {\n prefix: 'fas',\n iconName: 'asterisk',\n icon: [512, 512, [], \"f069\", \"M478.21 334.093L336 256l142.21-78.093c11.795-6.477 15.961-21.384 9.232-33.037l-19.48-33.741c-6.728-11.653-21.72-15.499-33.227-8.523L296 186.718l3.475-162.204C299.763 11.061 288.937 0 275.48 0h-38.96c-13.456 0-24.283 11.061-23.994 24.514L216 186.718 77.265 102.607c-11.506-6.976-26.499-3.13-33.227 8.523l-19.48 33.741c-6.728 11.653-2.562 26.56 9.233 33.037L176 256 33.79 334.093c-11.795 6.477-15.961 21.384-9.232 33.037l19.48 33.741c6.728 11.653 21.721 15.499 33.227 8.523L216 325.282l-3.475 162.204C212.237 500.939 223.064 512 236.52 512h38.961c13.456 0 24.283-11.061 23.995-24.514L296 325.282l138.735 84.111c11.506 6.976 26.499 3.13 33.227-8.523l19.48-33.741c6.728-11.653 2.563-26.559-9.232-33.036z\"]\n};\nvar faAt = {\n prefix: 'fas',\n iconName: 'at',\n icon: [512, 512, [], \"f1fa\", \"M256 8C118.941 8 8 118.919 8 256c0 137.059 110.919 248 248 248 48.154 0 95.342-14.14 135.408-40.223 12.005-7.815 14.625-24.288 5.552-35.372l-10.177-12.433c-7.671-9.371-21.179-11.667-31.373-5.129C325.92 429.757 291.314 440 256 440c-101.458 0-184-82.542-184-184S154.542 72 256 72c100.139 0 184 57.619 184 160 0 38.786-21.093 79.742-58.17 83.693-17.349-.454-16.91-12.857-13.476-30.024l23.433-121.11C394.653 149.75 383.308 136 368.225 136h-44.981a13.518 13.518 0 0 0-13.432 11.993l-.01.092c-14.697-17.901-40.448-21.775-59.971-21.775-74.58 0-137.831 62.234-137.831 151.46 0 65.303 36.785 105.87 96 105.87 26.984 0 57.369-15.637 74.991-38.333 9.522 34.104 40.613 34.103 70.71 34.103C462.609 379.41 504 307.798 504 232 504 95.653 394.023 8 256 8zm-21.68 304.43c-22.249 0-36.07-15.623-36.07-40.771 0-44.993 30.779-72.729 58.63-72.729 22.292 0 35.601 15.241 35.601 40.77 0 45.061-33.875 72.73-58.161 72.73z\"]\n};\nvar faAtlas = {\n prefix: 'fas',\n iconName: 'atlas',\n icon: [448, 512, [], \"f558\", \"M318.38 208h-39.09c-1.49 27.03-6.54 51.35-14.21 70.41 27.71-13.24 48.02-39.19 53.3-70.41zm0-32c-5.29-31.22-25.59-57.17-53.3-70.41 7.68 19.06 12.72 43.38 14.21 70.41h39.09zM224 97.31c-7.69 7.45-20.77 34.42-23.43 78.69h46.87c-2.67-44.26-15.75-71.24-23.44-78.69zm-41.08 8.28c-27.71 13.24-48.02 39.19-53.3 70.41h39.09c1.49-27.03 6.53-51.35 14.21-70.41zm0 172.82c-7.68-19.06-12.72-43.38-14.21-70.41h-39.09c5.28 31.22 25.59 57.17 53.3 70.41zM247.43 208h-46.87c2.66 44.26 15.74 71.24 23.43 78.69 7.7-7.45 20.78-34.43 23.44-78.69zM448 358.4V25.6c0-16-9.6-25.6-25.6-25.6H96C41.6 0 0 41.6 0 96v320c0 54.4 41.6 96 96 96h326.4c12.8 0 25.6-9.6 25.6-25.6v-16c0-6.4-3.2-12.8-9.6-19.2-3.2-16-3.2-60.8 0-73.6 6.4-3.2 9.6-9.6 9.6-19.2zM224 64c70.69 0 128 57.31 128 128s-57.31 128-128 128S96 262.69 96 192 153.31 64 224 64zm160 384H96c-19.2 0-32-12.8-32-32s16-32 32-32h288v64z\"]\n};\nvar faAtom = {\n prefix: 'fas',\n iconName: 'atom',\n icon: [448, 512, [], \"f5d2\", \"M413.03 256c40.13-54.89 41.51-98.62 25.14-128-10.91-19.52-40.54-50.73-116.33-41.88C300.36 34.89 267.64 0 224 0s-76.36 34.89-97.84 86.12C50.43 77.34 20.73 108.48 9.83 128c-16.38 29.4-15 73.09 25.14 128-40.13 54.89-41.51 98.62-25.14 128 29.21 52.34 101.68 43.58 116.33 41.88C147.63 477.1 180.36 512 224 512s76.37-34.9 97.84-86.12c14.64 1.7 87.11 10.46 116.33-41.88 16.38-29.4 15-73.09-25.14-128zM63.38 352c-4.03-7.21-.19-24.8 14.95-48.29 6.96 6.53 14.2 12.89 21.87 19.18 1.71 13.71 4 27.08 6.76 40.08-24.56.89-39.89-4.37-43.58-10.97zm36.82-162.88c-7.66 6.29-14.9 12.65-21.87 19.18-15.13-23.5-18.97-41.09-14.95-48.3 3.41-6.14 16.39-11.47 37.92-11.47 1.71 0 3.87.3 5.69.37a472.191 472.191 0 0 0-6.79 40.22zM224 64c9.47 0 22.2 13.52 33.86 37.26-11.19 3.7-22.44 8-33.86 12.86-11.42-4.86-22.67-9.16-33.86-12.86C201.8 77.52 214.53 64 224 64zm0 384c-9.47 0-22.2-13.52-33.86-37.26 11.19-3.7 22.44-8 33.86-12.86 11.42 4.86 22.67 9.16 33.86 12.86C246.2 434.48 233.47 448 224 448zm62.5-157.33c-26.7 19.08-46.14 29.33-62.5 37.48-16.35-8.14-35.8-18.41-62.5-37.48-1.99-27.79-1.99-41.54 0-69.33 26.67-19.05 46.13-29.32 62.5-37.48 16.39 8.17 35.86 18.44 62.5 37.48 1.98 27.78 1.99 41.53 0 69.33zM384.62 352c-3.67 6.62-19 11.82-43.58 10.95 2.76-13 5.05-26.37 6.76-40.06 7.66-6.29 14.9-12.65 21.87-19.18 15.13 23.49 18.97 41.08 14.95 48.29zm-14.95-143.71c-6.96-6.53-14.2-12.89-21.87-19.18a473.535 473.535 0 0 0-6.79-40.22c1.82-.07 3.97-.37 5.69-.37 21.52 0 34.51 5.34 37.92 11.47 4.02 7.22.18 24.81-14.95 48.3zM224 224c-17.67 0-32 14.33-32 32s14.33 32 32 32 32-14.33 32-32-14.33-32-32-32z\"]\n};\nvar faAudioDescription = {\n prefix: 'fas',\n iconName: 'audio-description',\n icon: [512, 512, [], \"f29e\", \"M162.925 238.709l8.822 30.655h-25.606l9.041-30.652c1.277-4.421 2.651-9.994 3.872-15.245 1.22 5.251 2.594 10.823 3.871 15.242zm166.474-32.099h-14.523v98.781h14.523c29.776 0 46.175-17.678 46.175-49.776 0-32.239-17.49-49.005-46.175-49.005zM512 112v288c0 26.51-21.49 48-48 48H48c-26.51 0-48-21.49-48-48V112c0-26.51 21.49-48 48-48h416c26.51 0 48 21.49 48 48zM245.459 336.139l-57.097-168A12.001 12.001 0 0 0 177 160h-35.894a12.001 12.001 0 0 0-11.362 8.139l-57.097 168C70.003 343.922 75.789 352 84.009 352h29.133a12 12 0 0 0 11.535-8.693l8.574-29.906h51.367l8.793 29.977A12 12 0 0 0 204.926 352h29.172c8.22 0 14.006-8.078 11.361-15.861zm184.701-80.525c0-58.977-37.919-95.614-98.96-95.614h-57.366c-6.627 0-12 5.373-12 12v168c0 6.627 5.373 12 12 12H331.2c61.041 0 98.96-36.933 98.96-96.386z\"]\n};\nvar faAward = {\n prefix: 'fas',\n iconName: 'award',\n icon: [384, 512, [], \"f559\", \"M97.12 362.63c-8.69-8.69-4.16-6.24-25.12-11.85-9.51-2.55-17.87-7.45-25.43-13.32L1.2 448.7c-4.39 10.77 3.81 22.47 15.43 22.03l52.69-2.01L105.56 507c8 8.44 22.04 5.81 26.43-4.96l52.05-127.62c-10.84 6.04-22.87 9.58-35.31 9.58-19.5 0-37.82-7.59-51.61-21.37zM382.8 448.7l-45.37-111.24c-7.56 5.88-15.92 10.77-25.43 13.32-21.07 5.64-16.45 3.18-25.12 11.85-13.79 13.78-32.12 21.37-51.62 21.37-12.44 0-24.47-3.55-35.31-9.58L252 502.04c4.39 10.77 18.44 13.4 26.43 4.96l36.25-38.28 52.69 2.01c11.62.44 19.82-11.27 15.43-22.03zM263 340c15.28-15.55 17.03-14.21 38.79-20.14 13.89-3.79 24.75-14.84 28.47-28.98 7.48-28.4 5.54-24.97 25.95-45.75 10.17-10.35 14.14-25.44 10.42-39.58-7.47-28.38-7.48-24.42 0-52.83 3.72-14.14-.25-29.23-10.42-39.58-20.41-20.78-18.47-17.36-25.95-45.75-3.72-14.14-14.58-25.19-28.47-28.98-27.88-7.61-24.52-5.62-44.95-26.41-10.17-10.35-25-14.4-38.89-10.61-27.87 7.6-23.98 7.61-51.9 0-13.89-3.79-28.72.25-38.89 10.61-20.41 20.78-17.05 18.8-44.94 26.41-13.89 3.79-24.75 14.84-28.47 28.98-7.47 28.39-5.54 24.97-25.95 45.75-10.17 10.35-14.15 25.44-10.42 39.58 7.47 28.36 7.48 24.4 0 52.82-3.72 14.14.25 29.23 10.42 39.59 20.41 20.78 18.47 17.35 25.95 45.75 3.72 14.14 14.58 25.19 28.47 28.98C104.6 325.96 106.27 325 121 340c13.23 13.47 33.84 15.88 49.74 5.82a39.676 39.676 0 0 1 42.53 0c15.89 10.06 36.5 7.65 49.73-5.82zM97.66 175.96c0-53.03 42.24-96.02 94.34-96.02s94.34 42.99 94.34 96.02-42.24 96.02-94.34 96.02-94.34-42.99-94.34-96.02z\"]\n};\nvar faBaby = {\n prefix: 'fas',\n iconName: 'baby',\n icon: [384, 512, [], \"f77c\", \"M192 160c44.2 0 80-35.8 80-80S236.2 0 192 0s-80 35.8-80 80 35.8 80 80 80zm-53.4 248.8l25.6-32-61.5-51.2L56.8 383c-11.4 14.2-11.7 34.4-.8 49l48 64c7.9 10.5 19.9 16 32 16 8.3 0 16.8-2.6 24-8 17.7-13.2 21.2-38.3 8-56l-29.4-39.2zm142.7-83.2l-61.5 51.2 25.6 32L216 448c-13.2 17.7-9.7 42.8 8 56 7.2 5.4 15.6 8 24 8 12.2 0 24.2-5.5 32-16l48-64c10.9-14.6 10.6-34.8-.8-49l-45.9-57.4zM376.7 145c-12.7-18.1-37.6-22.4-55.7-9.8l-40.6 28.5c-52.7 37-124.2 37-176.8 0L63 135.3C44.9 122.6 20 127 7.3 145-5.4 163.1-1 188 17 200.7l40.6 28.5c17 11.9 35.4 20.9 54.4 27.9V288h160v-30.8c19-7 37.4-16 54.4-27.9l40.6-28.5c18.1-12.8 22.4-37.7 9.7-55.8z\"]\n};\nvar faBabyCarriage = {\n prefix: 'fas',\n iconName: 'baby-carriage',\n icon: [512, 512, [], \"f77d\", \"M144.8 17c-11.3-17.8-37.2-22.8-54-9.4C35.3 51.9 0 118 0 192h256L144.8 17zM496 96h-48c-35.3 0-64 28.7-64 64v64H0c0 50.6 23 96.4 60.3 130.7C25.7 363.6 0 394.7 0 432c0 44.2 35.8 80 80 80s80-35.8 80-80c0-8.9-1.8-17.2-4.4-25.2 21.6 5.9 44.6 9.2 68.4 9.2s46.9-3.3 68.4-9.2c-2.7 8-4.4 16.3-4.4 25.2 0 44.2 35.8 80 80 80s80-35.8 80-80c0-37.3-25.7-68.4-60.3-77.3C425 320.4 448 274.6 448 224v-64h48c8.8 0 16-7.2 16-16v-32c0-8.8-7.2-16-16-16zM80 464c-17.6 0-32-14.4-32-32s14.4-32 32-32 32 14.4 32 32-14.4 32-32 32zm320-32c0 17.6-14.4 32-32 32s-32-14.4-32-32 14.4-32 32-32 32 14.4 32 32z\"]\n};\nvar faBackspace = {\n prefix: 'fas',\n iconName: 'backspace',\n icon: [640, 512, [], \"f55a\", \"M576 64H205.26A63.97 63.97 0 0 0 160 82.75L9.37 233.37c-12.5 12.5-12.5 32.76 0 45.25L160 429.25c12 12 28.28 18.75 45.25 18.75H576c35.35 0 64-28.65 64-64V128c0-35.35-28.65-64-64-64zm-84.69 254.06c6.25 6.25 6.25 16.38 0 22.63l-22.62 22.62c-6.25 6.25-16.38 6.25-22.63 0L384 301.25l-62.06 62.06c-6.25 6.25-16.38 6.25-22.63 0l-22.62-22.62c-6.25-6.25-6.25-16.38 0-22.63L338.75 256l-62.06-62.06c-6.25-6.25-6.25-16.38 0-22.63l22.62-22.62c6.25-6.25 16.38-6.25 22.63 0L384 210.75l62.06-62.06c6.25-6.25 16.38-6.25 22.63 0l22.62 22.62c6.25 6.25 6.25 16.38 0 22.63L429.25 256l62.06 62.06z\"]\n};\nvar faBackward = {\n prefix: 'fas',\n iconName: 'backward',\n icon: [512, 512, [], \"f04a\", \"M11.5 280.6l192 160c20.6 17.2 52.5 2.8 52.5-24.6V96c0-27.4-31.9-41.8-52.5-24.6l-192 160c-15.3 12.8-15.3 36.4 0 49.2zm256 0l192 160c20.6 17.2 52.5 2.8 52.5-24.6V96c0-27.4-31.9-41.8-52.5-24.6l-192 160c-15.3 12.8-15.3 36.4 0 49.2z\"]\n};\nvar faBacon = {\n prefix: 'fas',\n iconName: 'bacon',\n icon: [576, 512, [], \"f7e5\", \"M218.92 336.39c34.89-34.89 44.2-59.7 54.05-86 10.61-28.29 21.59-57.54 61.37-97.34s69.05-50.77 97.35-61.38c23.88-9 46.64-17.68 76.79-45.37L470.81 8.91a31 31 0 0 0-40.18-2.83c-13.64 10.1-25.15 14.39-41 20.3C247 79.52 209.26 191.29 200.65 214.1c-29.75 78.83-89.55 94.68-98.72 98.09-24.86 9.26-54.73 20.38-91.07 50.36C-3 374-3.63 395 9.07 407.61l35.76 35.51C80 410.52 107 400.15 133 390.39c26.27-9.84 51.06-19.12 85.92-54zm348-232l-35.75-35.51c-35.19 32.63-62.18 43-88.25 52.79-26.26 9.85-51.06 19.16-85.95 54s-44.19 59.69-54 86C292.33 290 281.34 319.22 241.55 359s-69 50.73-97.3 61.32c-23.86 9-46.61 17.66-76.72 45.33l37.68 37.43a31 31 0 0 0 40.18 2.82c13.6-10.06 25.09-14.34 40.94-20.24 142.2-53 180-164.1 188.94-187.69C405 219.18 464.8 203.3 474 199.86c24.87-9.27 54.74-20.4 91.11-50.41 13.89-11.4 14.52-32.45 1.82-45.05z\"]\n};\nvar faBalanceScale = {\n prefix: 'fas',\n iconName: 'balance-scale',\n icon: [640, 512, [], \"f24e\", \"M256 336h-.02c0-16.18 1.34-8.73-85.05-181.51-17.65-35.29-68.19-35.36-85.87 0C-2.06 328.75.02 320.33.02 336H0c0 44.18 57.31 80 128 80s128-35.82 128-80zM128 176l72 144H56l72-144zm511.98 160c0-16.18 1.34-8.73-85.05-181.51-17.65-35.29-68.19-35.36-85.87 0-87.12 174.26-85.04 165.84-85.04 181.51H384c0 44.18 57.31 80 128 80s128-35.82 128-80h-.02zM440 320l72-144 72 144H440zm88 128H352V153.25c23.51-10.29 41.16-31.48 46.39-57.25H528c8.84 0 16-7.16 16-16V48c0-8.84-7.16-16-16-16H383.64C369.04 12.68 346.09 0 320 0s-49.04 12.68-63.64 32H112c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h129.61c5.23 25.76 22.87 46.96 46.39 57.25V448H112c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h416c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16z\"]\n};\nvar faBan = {\n prefix: 'fas',\n iconName: 'ban',\n icon: [512, 512, [], \"f05e\", \"M256 8C119.034 8 8 119.033 8 256s111.034 248 248 248 248-111.034 248-248S392.967 8 256 8zm130.108 117.892c65.448 65.448 70 165.481 20.677 235.637L150.47 105.216c70.204-49.356 170.226-44.735 235.638 20.676zM125.892 386.108c-65.448-65.448-70-165.481-20.677-235.637L361.53 406.784c-70.203 49.356-170.226 44.736-235.638-20.676z\"]\n};\nvar faBandAid = {\n prefix: 'fas',\n iconName: 'band-aid',\n icon: [640, 512, [], \"f462\", \"M0 160v192c0 35.3 28.7 64 64 64h96V96H64c-35.3 0-64 28.7-64 64zm576-64h-96v320h96c35.3 0 64-28.7 64-64V160c0-35.3-28.7-64-64-64zM192 416h256V96H192v320zm176-232c13.3 0 24 10.7 24 24s-10.7 24-24 24-24-10.7-24-24 10.7-24 24-24zm0 96c13.3 0 24 10.7 24 24s-10.7 24-24 24-24-10.7-24-24 10.7-24 24-24zm-96-96c13.3 0 24 10.7 24 24s-10.7 24-24 24-24-10.7-24-24 10.7-24 24-24zm0 96c13.3 0 24 10.7 24 24s-10.7 24-24 24-24-10.7-24-24 10.7-24 24-24z\"]\n};\nvar faBarcode = {\n prefix: 'fas',\n iconName: 'barcode',\n icon: [512, 512, [], \"f02a\", \"M0 448V64h18v384H0zm26.857-.273V64H36v383.727h-9.143zm27.143 0V64h8.857v383.727H54zm44.857 0V64h8.857v383.727h-8.857zm36 0V64h17.714v383.727h-17.714zm44.857 0V64h8.857v383.727h-8.857zm18 0V64h8.857v383.727h-8.857zm18 0V64h8.857v383.727h-8.857zm35.715 0V64h18v383.727h-18zm44.857 0V64h18v383.727h-18zm35.999 0V64h18.001v383.727h-18.001zm36.001 0V64h18.001v383.727h-18.001zm26.857 0V64h18v383.727h-18zm45.143 0V64h26.857v383.727h-26.857zm35.714 0V64h9.143v383.727H476zm18 .273V64h18v384h-18z\"]\n};\nvar faBars = {\n prefix: 'fas',\n iconName: 'bars',\n icon: [448, 512, [], \"f0c9\", \"M16 132h416c8.837 0 16-7.163 16-16V76c0-8.837-7.163-16-16-16H16C7.163 60 0 67.163 0 76v40c0 8.837 7.163 16 16 16zm0 160h416c8.837 0 16-7.163 16-16v-40c0-8.837-7.163-16-16-16H16c-8.837 0-16 7.163-16 16v40c0 8.837 7.163 16 16 16zm0 160h416c8.837 0 16-7.163 16-16v-40c0-8.837-7.163-16-16-16H16c-8.837 0-16 7.163-16 16v40c0 8.837 7.163 16 16 16z\"]\n};\nvar faBaseballBall = {\n prefix: 'fas',\n iconName: 'baseball-ball',\n icon: [496, 512, [], \"f433\", \"M368.5 363.9l28.8-13.9c11.1 22.9 26 43.2 44.1 60.9 34-42.5 54.5-96.3 54.5-154.9 0-58.5-20.4-112.2-54.2-154.6-17.8 17.3-32.6 37.1-43.6 59.5l-28.7-14.1c12.8-26 30-49 50.8-69C375.6 34.7 315 8 248 8 181.1 8 120.5 34.6 75.9 77.7c20.7 19.9 37.9 42.9 50.7 68.8l-28.7 14.1c-11-22.3-25.7-42.1-43.5-59.4C20.4 143.7 0 197.4 0 256c0 58.6 20.4 112.3 54.4 154.7 18.2-17.7 33.2-38 44.3-61l28.8 13.9c-12.9 26.7-30.3 50.3-51.5 70.7 44.5 43.1 105.1 69.7 172 69.7 66.8 0 127.3-26.5 171.9-69.5-21.1-20.4-38.5-43.9-51.4-70.6zm-228.3-32l-30.5-9.8c14.9-46.4 12.7-93.8-.6-134l30.4-10c15 45.6 18 99.9.7 153.8zm216.3-153.4l30.4 10c-13.2 40.1-15.5 87.5-.6 134l-30.5 9.8c-17.3-54-14.3-108.3.7-153.8z\"]\n};\nvar faBasketballBall = {\n prefix: 'fas',\n iconName: 'basketball-ball',\n icon: [496, 512, [], \"f434\", \"M212.3 10.3c-43.8 6.3-86.2 24.1-122.2 53.8l77.4 77.4c27.8-35.8 43.3-81.2 44.8-131.2zM248 222L405.9 64.1c-42.4-35-93.6-53.5-145.5-56.1-1.2 63.9-21.5 122.3-58.7 167.7L248 222zM56.1 98.1c-29.7 36-47.5 78.4-53.8 122.2 50-1.5 95.5-17 131.2-44.8L56.1 98.1zm272.2 204.2c45.3-37.1 103.7-57.4 167.7-58.7-2.6-51.9-21.1-103.1-56.1-145.5L282 256l46.3 46.3zM248 290L90.1 447.9c42.4 34.9 93.6 53.5 145.5 56.1 1.3-64 21.6-122.4 58.7-167.7L248 290zm191.9 123.9c29.7-36 47.5-78.4 53.8-122.2-50.1 1.6-95.5 17.1-131.2 44.8l77.4 77.4zM167.7 209.7C122.3 246.9 63.9 267.3 0 268.4c2.6 51.9 21.1 103.1 56.1 145.5L214 256l-46.3-46.3zm116 292c43.8-6.3 86.2-24.1 122.2-53.8l-77.4-77.4c-27.7 35.7-43.2 81.2-44.8 131.2z\"]\n};\nvar faBath = {\n prefix: 'fas',\n iconName: 'bath',\n icon: [512, 512, [], \"f2cd\", \"M488 256H80V112c0-17.645 14.355-32 32-32 11.351 0 21.332 5.945 27.015 14.88-16.492 25.207-14.687 59.576 6.838 83.035-4.176 4.713-4.021 11.916.491 16.428l11.314 11.314c4.686 4.686 12.284 4.686 16.971 0l95.03-95.029c4.686-4.686 4.686-12.284 0-16.971l-11.314-11.314c-4.512-4.512-11.715-4.666-16.428-.491-17.949-16.469-42.294-21.429-64.178-15.365C163.281 45.667 139.212 32 112 32c-44.112 0-80 35.888-80 80v144h-8c-13.255 0-24 10.745-24 24v16c0 13.255 10.745 24 24 24h8v32c0 28.43 12.362 53.969 32 71.547V456c0 13.255 10.745 24 24 24h16c13.255 0 24-10.745 24-24v-8h256v8c0 13.255 10.745 24 24 24h16c13.255 0 24-10.745 24-24v-32.453c19.638-17.578 32-43.117 32-71.547v-32h8c13.255 0 24-10.745 24-24v-16c0-13.255-10.745-24-24-24z\"]\n};\nvar faBatteryEmpty = {\n prefix: 'fas',\n iconName: 'battery-empty',\n icon: [640, 512, [], \"f244\", \"M544 160v64h32v64h-32v64H64V160h480m16-64H48c-26.51 0-48 21.49-48 48v224c0 26.51 21.49 48 48 48h512c26.51 0 48-21.49 48-48v-16h8c13.255 0 24-10.745 24-24V184c0-13.255-10.745-24-24-24h-8v-16c0-26.51-21.49-48-48-48z\"]\n};\nvar faBatteryFull = {\n prefix: 'fas',\n iconName: 'battery-full',\n icon: [640, 512, [], \"f240\", \"M544 160v64h32v64h-32v64H64V160h480m16-64H48c-26.51 0-48 21.49-48 48v224c0 26.51 21.49 48 48 48h512c26.51 0 48-21.49 48-48v-16h8c13.255 0 24-10.745 24-24V184c0-13.255-10.745-24-24-24h-8v-16c0-26.51-21.49-48-48-48zm-48 96H96v128h416V192z\"]\n};\nvar faBatteryHalf = {\n prefix: 'fas',\n iconName: 'battery-half',\n icon: [640, 512, [], \"f242\", \"M544 160v64h32v64h-32v64H64V160h480m16-64H48c-26.51 0-48 21.49-48 48v224c0 26.51 21.49 48 48 48h512c26.51 0 48-21.49 48-48v-16h8c13.255 0 24-10.745 24-24V184c0-13.255-10.745-24-24-24h-8v-16c0-26.51-21.49-48-48-48zm-240 96H96v128h224V192z\"]\n};\nvar faBatteryQuarter = {\n prefix: 'fas',\n iconName: 'battery-quarter',\n icon: [640, 512, [], \"f243\", \"M544 160v64h32v64h-32v64H64V160h480m16-64H48c-26.51 0-48 21.49-48 48v224c0 26.51 21.49 48 48 48h512c26.51 0 48-21.49 48-48v-16h8c13.255 0 24-10.745 24-24V184c0-13.255-10.745-24-24-24h-8v-16c0-26.51-21.49-48-48-48zm-336 96H96v128h128V192z\"]\n};\nvar faBatteryThreeQuarters = {\n prefix: 'fas',\n iconName: 'battery-three-quarters',\n icon: [640, 512, [], \"f241\", \"M544 160v64h32v64h-32v64H64V160h480m16-64H48c-26.51 0-48 21.49-48 48v224c0 26.51 21.49 48 48 48h512c26.51 0 48-21.49 48-48v-16h8c13.255 0 24-10.745 24-24V184c0-13.255-10.745-24-24-24h-8v-16c0-26.51-21.49-48-48-48zm-144 96H96v128h320V192z\"]\n};\nvar faBed = {\n prefix: 'fas',\n iconName: 'bed',\n icon: [640, 512, [], \"f236\", \"M176 256c44.11 0 80-35.89 80-80s-35.89-80-80-80-80 35.89-80 80 35.89 80 80 80zm352-128H304c-8.84 0-16 7.16-16 16v144H64V80c0-8.84-7.16-16-16-16H16C7.16 64 0 71.16 0 80v352c0 8.84 7.16 16 16 16h32c8.84 0 16-7.16 16-16v-48h512v48c0 8.84 7.16 16 16 16h32c8.84 0 16-7.16 16-16V240c0-61.86-50.14-112-112-112z\"]\n};\nvar faBeer = {\n prefix: 'fas',\n iconName: 'beer',\n icon: [448, 512, [], \"f0fc\", \"M368 96h-48V56c0-13.255-10.745-24-24-24H24C10.745 32 0 42.745 0 56v400c0 13.255 10.745 24 24 24h272c13.255 0 24-10.745 24-24v-42.11l80.606-35.977C429.396 365.063 448 336.388 448 304.86V176c0-44.112-35.888-80-80-80zm16 208.86a16.018 16.018 0 0 1-9.479 14.611L320 343.805V160h48c8.822 0 16 7.178 16 16v128.86zM208 384c-8.836 0-16-7.164-16-16V144c0-8.836 7.164-16 16-16s16 7.164 16 16v224c0 8.836-7.164 16-16 16zm-96 0c-8.836 0-16-7.164-16-16V144c0-8.836 7.164-16 16-16s16 7.164 16 16v224c0 8.836-7.164 16-16 16z\"]\n};\nvar faBell = {\n prefix: 'fas',\n iconName: 'bell',\n icon: [448, 512, [], \"f0f3\", \"M224 512c35.32 0 63.97-28.65 63.97-64H160.03c0 35.35 28.65 64 63.97 64zm215.39-149.71c-19.32-20.76-55.47-51.99-55.47-154.29 0-77.7-54.48-139.9-127.94-155.16V32c0-17.67-14.32-32-31.98-32s-31.98 14.33-31.98 32v20.84C118.56 68.1 64.08 130.3 64.08 208c0 102.3-36.15 133.53-55.47 154.29-6 6.45-8.66 14.16-8.61 21.71.11 16.4 12.98 32 32.1 32h383.8c19.12 0 32-15.6 32.1-32 .05-7.55-2.61-15.27-8.61-21.71z\"]\n};\nvar faBellSlash = {\n prefix: 'fas',\n iconName: 'bell-slash',\n icon: [640, 512, [], \"f1f6\", \"M633.82 458.1l-90.62-70.05c.19-1.38.8-2.66.8-4.06.05-7.55-2.61-15.27-8.61-21.71-19.32-20.76-55.47-51.99-55.47-154.29 0-77.7-54.48-139.9-127.94-155.16V32c0-17.67-14.32-32-31.98-32s-31.98 14.33-31.98 32v20.84c-40.33 8.38-74.66 31.07-97.59 62.57L45.47 3.37C38.49-2.05 28.43-.8 23.01 6.18L3.37 31.45C-2.05 38.42-.8 48.47 6.18 53.9l588.35 454.73c6.98 5.43 17.03 4.17 22.46-2.81l19.64-25.27c5.42-6.97 4.17-17.02-2.81-22.45zM157.23 251.54c-8.61 67.96-36.41 93.33-52.62 110.75-6 6.45-8.66 14.16-8.61 21.71.11 16.4 12.98 32 32.1 32h241.92L157.23 251.54zM320 512c35.32 0 63.97-28.65 63.97-64H256.03c0 35.35 28.65 64 63.97 64z\"]\n};\nvar faBezierCurve = {\n prefix: 'fas',\n iconName: 'bezier-curve',\n icon: [640, 512, [], \"f55b\", \"M368 32h-96c-17.67 0-32 14.33-32 32v96c0 17.67 14.33 32 32 32h96c17.67 0 32-14.33 32-32V64c0-17.67-14.33-32-32-32zM208 88h-84.75C113.75 64.56 90.84 48 64 48 28.66 48 0 76.65 0 112s28.66 64 64 64c26.84 0 49.75-16.56 59.25-40h79.73c-55.37 32.52-95.86 87.32-109.54 152h49.4c11.3-41.61 36.77-77.21 71.04-101.56-3.7-8.08-5.88-16.99-5.88-26.44V88zm-48 232H64c-17.67 0-32 14.33-32 32v96c0 17.67 14.33 32 32 32h96c17.67 0 32-14.33 32-32v-96c0-17.67-14.33-32-32-32zM576 48c-26.84 0-49.75 16.56-59.25 40H432v72c0 9.45-2.19 18.36-5.88 26.44 34.27 24.35 59.74 59.95 71.04 101.56h49.4c-13.68-64.68-54.17-119.48-109.54-152h79.73c9.5 23.44 32.41 40 59.25 40 35.34 0 64-28.65 64-64s-28.66-64-64-64zm0 272h-96c-17.67 0-32 14.33-32 32v96c0 17.67 14.33 32 32 32h96c17.67 0 32-14.33 32-32v-96c0-17.67-14.33-32-32-32z\"]\n};\nvar faBible = {\n prefix: 'fas',\n iconName: 'bible',\n icon: [448, 512, [], \"f647\", \"M448 358.4V25.6c0-16-9.6-25.6-25.6-25.6H96C41.6 0 0 41.6 0 96v320c0 54.4 41.6 96 96 96h326.4c12.8 0 25.6-9.6 25.6-25.6v-16c0-6.4-3.2-12.8-9.6-19.2-3.2-16-3.2-60.8 0-73.6 6.4-3.2 9.6-9.6 9.6-19.2zM144 144c0-8.84 7.16-16 16-16h48V80c0-8.84 7.16-16 16-16h32c8.84 0 16 7.16 16 16v48h48c8.84 0 16 7.16 16 16v32c0 8.84-7.16 16-16 16h-48v112c0 8.84-7.16 16-16 16h-32c-8.84 0-16-7.16-16-16V192h-48c-8.84 0-16-7.16-16-16v-32zm236.8 304H96c-19.2 0-32-12.8-32-32s16-32 32-32h284.8v64z\"]\n};\nvar faBicycle = {\n prefix: 'fas',\n iconName: 'bicycle',\n icon: [640, 512, [], \"f206\", \"M512.509 192.001c-16.373-.064-32.03 2.955-46.436 8.495l-77.68-125.153A24 24 0 0 0 368.001 64h-64c-8.837 0-16 7.163-16 16v16c0 8.837 7.163 16 16 16h50.649l14.896 24H256.002v-16c0-8.837-7.163-16-16-16h-87.459c-13.441 0-24.777 10.999-24.536 24.437.232 13.044 10.876 23.563 23.995 23.563h48.726l-29.417 47.52c-13.433-4.83-27.904-7.483-42.992-7.52C58.094 191.83.412 249.012.002 319.236-.413 390.279 57.055 448 128.002 448c59.642 0 109.758-40.793 123.967-96h52.033a24 24 0 0 0 20.406-11.367L410.37 201.77l14.938 24.067c-25.455 23.448-41.385 57.081-41.307 94.437.145 68.833 57.899 127.051 126.729 127.719 70.606.685 128.181-55.803 129.255-125.996 1.086-70.941-56.526-129.72-127.476-129.996zM186.75 265.772c9.727 10.529 16.673 23.661 19.642 38.228h-43.306l23.664-38.228zM128.002 400c-44.112 0-80-35.888-80-80s35.888-80 80-80c5.869 0 11.586.653 17.099 1.859l-45.505 73.509C89.715 331.327 101.213 352 120.002 352h81.3c-12.37 28.225-40.562 48-73.3 48zm162.63-96h-35.624c-3.96-31.756-19.556-59.894-42.383-80.026L237.371 184h127.547l-74.286 120zm217.057 95.886c-41.036-2.165-74.049-35.692-75.627-76.755-.812-21.121 6.633-40.518 19.335-55.263l44.433 71.586c4.66 7.508 14.524 9.816 22.032 5.156l13.594-8.437c7.508-4.66 9.817-14.524 5.156-22.032l-44.468-71.643a79.901 79.901 0 0 1 19.858-2.497c44.112 0 80 35.888 80 80-.001 45.54-38.252 82.316-84.313 79.885z\"]\n};\nvar faBinoculars = {\n prefix: 'fas',\n iconName: 'binoculars',\n icon: [512, 512, [], \"f1e5\", \"M416 48c0-8.84-7.16-16-16-16h-64c-8.84 0-16 7.16-16 16v48h96V48zM63.91 159.99C61.4 253.84 3.46 274.22 0 404v44c0 17.67 14.33 32 32 32h96c17.67 0 32-14.33 32-32V288h32V128H95.84c-17.63 0-31.45 14.37-31.93 31.99zm384.18 0c-.48-17.62-14.3-31.99-31.93-31.99H320v160h32v160c0 17.67 14.33 32 32 32h96c17.67 0 32-14.33 32-32v-44c-3.46-129.78-61.4-150.16-63.91-244.01zM176 32h-64c-8.84 0-16 7.16-16 16v48h96V48c0-8.84-7.16-16-16-16zm48 256h64V128h-64v160z\"]\n};\nvar faBiohazard = {\n prefix: 'fas',\n iconName: 'biohazard',\n icon: [576, 512, [], \"f780\", \"M287.9 112c18.6 0 36.2 3.8 52.8 9.6 13.3-10.3 23.6-24.3 29.5-40.7-25.2-10.9-53-17-82.2-17-29.1 0-56.9 6-82.1 16.9 5.9 16.4 16.2 30.4 29.5 40.7 16.5-5.7 34-9.5 52.5-9.5zM163.6 438.7c12-11.8 20.4-26.4 24.5-42.4-32.9-26.4-54.8-65.3-58.9-109.6-8.5-2.8-17.2-4.6-26.4-4.6-7.6 0-15.2 1-22.5 3.1 4.1 62.8 35.8 118 83.3 153.5zm224.2-42.6c4.1 16 12.5 30.7 24.5 42.5 47.4-35.5 79.1-90.7 83-153.5-7.2-2-14.7-3-22.2-3-9.2 0-18 1.9-26.6 4.7-4.1 44.2-26 82.9-58.7 109.3zm113.5-205c-17.6-10.4-36.3-16.6-55.3-19.9 6-17.7 10-36.4 10-56.2 0-41-14.5-80.8-41-112.2-2.5-3-6.6-3.7-10-1.8-3.3 1.9-4.8 6-3.6 9.7 4.5 13.8 6.6 26.3 6.6 38.5 0 67.8-53.8 122.9-120 122.9S168 117 168 49.2c0-12.1 2.2-24.7 6.6-38.5 1.2-3.7-.3-7.8-3.6-9.7-3.4-1.9-7.5-1.2-10 1.8C134.6 34.2 120 74 120 115c0 19.8 3.9 38.5 10 56.2-18.9 3.3-37.7 9.5-55.3 19.9-34.6 20.5-61 53.3-74.3 92.4-1.3 3.7.2 7.7 3.5 9.8 3.3 2 7.5 1.3 10-1.6 9.4-10.8 19-19.1 29.2-25.1 57.3-33.9 130.8-13.7 163.9 45 33.1 58.7 13.4 134-43.9 167.9-10.2 6.1-22 10.4-35.8 13.4-3.7.8-6.4 4.2-6.4 8.1.1 4 2.7 7.3 6.5 8 39.7 7.8 80.6.8 115.2-19.7 18-10.6 32.9-24.5 45.3-40.1 12.4 15.6 27.3 29.5 45.3 40.1 34.6 20.5 75.5 27.5 115.2 19.7 3.8-.7 6.4-4 6.5-8 0-3.9-2.6-7.3-6.4-8.1-13.9-2.9-25.6-7.3-35.8-13.4-57.3-33.9-77-109.2-43.9-167.9s106.6-78.9 163.9-45c10.2 6.1 19.8 14.3 29.2 25.1 2.5 2.9 6.7 3.6 10 1.6s4.8-6.1 3.5-9.8c-13.1-39.1-39.5-72-74.1-92.4zm-213.4 129c-26.5 0-48-21.5-48-48s21.5-48 48-48 48 21.5 48 48-21.5 48-48 48z\"]\n};\nvar faBirthdayCake = {\n prefix: 'fas',\n iconName: 'birthday-cake',\n icon: [448, 512, [], \"f1fd\", \"M448 384c-28.02 0-31.26-32-74.5-32-43.43 0-46.825 32-74.75 32-27.695 0-31.454-32-74.75-32-42.842 0-47.218 32-74.5 32-28.148 0-31.202-32-74.75-32-43.547 0-46.653 32-74.75 32v-80c0-26.5 21.5-48 48-48h16V112h64v144h64V112h64v144h64V112h64v144h16c26.5 0 48 21.5 48 48v80zm0 128H0v-96c43.356 0 46.767-32 74.75-32 27.951 0 31.253 32 74.75 32 42.843 0 47.217-32 74.5-32 28.148 0 31.201 32 74.75 32 43.357 0 46.767-32 74.75-32 27.488 0 31.252 32 74.5 32v96zM96 96c-17.75 0-32-14.25-32-32 0-31 32-23 32-64 12 0 32 29.5 32 56s-14.25 40-32 40zm128 0c-17.75 0-32-14.25-32-32 0-31 32-23 32-64 12 0 32 29.5 32 56s-14.25 40-32 40zm128 0c-17.75 0-32-14.25-32-32 0-31 32-23 32-64 12 0 32 29.5 32 56s-14.25 40-32 40z\"]\n};\nvar faBlender = {\n prefix: 'fas',\n iconName: 'blender',\n icon: [512, 512, [], \"f517\", \"M416 384H160c-35.35 0-64 28.65-64 64v32c0 17.67 14.33 32 32 32h320c17.67 0 32-14.33 32-32v-32c0-35.35-28.65-64-64-64zm-128 96c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm40-416h166.54L512 0H48C21.49 0 0 21.49 0 48v160c0 26.51 21.49 48 48 48h103.27l8.73 96h256l17.46-64H328c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h114.18l17.46-64H328c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h140.36l17.46-64H328c-4.42 0-8-3.58-8-8V72c0-4.42 3.58-8 8-8zM64 192V64h69.82l11.64 128H64z\"]\n};\nvar faBlenderPhone = {\n prefix: 'fas',\n iconName: 'blender-phone',\n icon: [576, 512, [], \"f6b6\", \"M392 64h166.54L576 0H192v352h288l17.46-64H392c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h114.18l17.46-64H392c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h140.36l17.46-64H392c-4.42 0-8-3.58-8-8V72c0-4.42 3.58-8 8-8zM158.8 335.01l-25.78-63.26c-2.78-6.81-9.8-10.99-17.24-10.26l-45.03 4.42c-17.28-46.94-17.65-99.78 0-147.72l45.03 4.42c7.43.73 14.46-3.46 17.24-10.26l25.78-63.26c3.02-7.39.2-15.85-6.68-20.07l-39.28-24.1C98.51-3.87 80.09-.5 68.95 11.97c-92.57 103.6-92 259.55 2.1 362.49 9.87 10.8 29.12 12.48 41.65 4.8l39.41-24.18c6.89-4.22 9.7-12.67 6.69-20.07zM480 384H192c-35.35 0-64 28.65-64 64v32c0 17.67 14.33 32 32 32h352c17.67 0 32-14.33 32-32v-32c0-35.35-28.65-64-64-64zm-144 96c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32z\"]\n};\nvar faBlind = {\n prefix: 'fas',\n iconName: 'blind',\n icon: [384, 512, [], \"f29d\", \"M380.15 510.837a8 8 0 0 1-10.989-2.687l-125.33-206.427a31.923 31.923 0 0 0 12.958-9.485l126.048 207.608a8 8 0 0 1-2.687 10.991zM142.803 314.338l-32.54 89.485 36.12 88.285c6.693 16.36 25.377 24.192 41.733 17.501 16.357-6.692 24.193-25.376 17.501-41.734l-62.814-153.537zM96 88c24.301 0 44-19.699 44-44S120.301 0 96 0 52 19.699 52 44s19.699 44 44 44zm154.837 169.128l-120-152c-4.733-5.995-11.75-9.108-18.837-9.112V96H80v.026c-7.146.003-14.217 3.161-18.944 9.24L0 183.766v95.694c0 13.455 11.011 24.791 24.464 24.536C37.505 303.748 48 293.1 48 280v-79.766l16-20.571v140.698L9.927 469.055c-6.04 16.609 2.528 34.969 19.138 41.009 16.602 6.039 34.968-2.524 41.009-19.138L136 309.638V202.441l-31.406-39.816a4 4 0 1 1 6.269-4.971l102.3 129.217c9.145 11.584 24.368 11.339 33.708 3.965 10.41-8.216 12.159-23.334 3.966-33.708z\"]\n};\nvar faBlog = {\n prefix: 'fas',\n iconName: 'blog',\n icon: [512, 512, [], \"f781\", \"M172.2 226.8c-14.6-2.9-28.2 8.9-28.2 23.8V301c0 10.2 7.1 18.4 16.7 22 18.2 6.8 31.3 24.4 31.3 45 0 26.5-21.5 48-48 48s-48-21.5-48-48V120c0-13.3-10.7-24-24-24H24c-13.3 0-24 10.7-24 24v248c0 89.5 82.1 160.2 175 140.7 54.4-11.4 98.3-55.4 109.7-109.7 17.4-82.9-37-157.2-112.5-172.2zM209 0c-9.2-.5-17 6.8-17 16v31.6c0 8.5 6.6 15.5 15 15.9 129.4 7 233.4 112 240.9 241.5.5 8.4 7.5 15 15.9 15h32.1c9.2 0 16.5-7.8 16-17C503.4 139.8 372.2 8.6 209 0zm.3 96c-9.3-.7-17.3 6.7-17.3 16.1v32.1c0 8.4 6.5 15.3 14.8 15.9 76.8 6.3 138 68.2 144.9 145.2.8 8.3 7.6 14.7 15.9 14.7h32.2c9.3 0 16.8-8 16.1-17.3-8.4-110.1-96.5-198.2-206.6-206.7z\"]\n};\nvar faBold = {\n prefix: 'fas',\n iconName: 'bold',\n icon: [384, 512, [], \"f032\", \"M304.793 243.891c33.639-18.537 53.657-54.16 53.657-95.693 0-48.236-26.25-87.626-68.626-104.179C265.138 34.01 240.849 32 209.661 32H24c-8.837 0-16 7.163-16 16v33.049c0 8.837 7.163 16 16 16h33.113v318.53H24c-8.837 0-16 7.163-16 16V464c0 8.837 7.163 16 16 16h195.69c24.203 0 44.834-1.289 66.866-7.584C337.52 457.193 376 410.647 376 350.014c0-52.168-26.573-91.684-71.207-106.123zM142.217 100.809h67.444c16.294 0 27.536 2.019 37.525 6.717 15.828 8.479 24.906 26.502 24.906 49.446 0 35.029-20.32 56.79-53.029 56.79h-76.846V100.809zm112.642 305.475c-10.14 4.056-22.677 4.907-31.409 4.907h-81.233V281.943h84.367c39.645 0 63.057 25.38 63.057 63.057.001 28.425-13.66 52.483-34.782 61.284z\"]\n};\nvar faBolt = {\n prefix: 'fas',\n iconName: 'bolt',\n icon: [320, 512, [], \"f0e7\", \"M296 160H180.6l42.6-129.8C227.2 15 215.7 0 200 0H56C44 0 33.8 8.9 32.2 20.8l-32 240C-1.7 275.2 9.5 288 24 288h118.7L96.6 482.5c-3.6 15.2 8 29.5 23.3 29.5 8.4 0 16.4-4.4 20.8-12l176-304c9.3-15.9-2.2-36-20.7-36z\"]\n};\nvar faBomb = {\n prefix: 'fas',\n iconName: 'bomb',\n icon: [512, 512, [], \"f1e2\", \"M440.5 88.5l-52 52L415 167c9.4 9.4 9.4 24.6 0 33.9l-17.4 17.4c11.8 26.1 18.4 55.1 18.4 85.6 0 114.9-93.1 208-208 208S0 418.9 0 304 93.1 96 208 96c30.5 0 59.5 6.6 85.6 18.4L311 97c9.4-9.4 24.6-9.4 33.9 0l26.5 26.5 52-52 17.1 17zM500 60h-24c-6.6 0-12 5.4-12 12s5.4 12 12 12h24c6.6 0 12-5.4 12-12s-5.4-12-12-12zM440 0c-6.6 0-12 5.4-12 12v24c0 6.6 5.4 12 12 12s12-5.4 12-12V12c0-6.6-5.4-12-12-12zm33.9 55l17-17c4.7-4.7 4.7-12.3 0-17-4.7-4.7-12.3-4.7-17 0l-17 17c-4.7 4.7-4.7 12.3 0 17 4.8 4.7 12.4 4.7 17 0zm-67.8 0c4.7 4.7 12.3 4.7 17 0 4.7-4.7 4.7-12.3 0-17l-17-17c-4.7-4.7-12.3-4.7-17 0-4.7 4.7-4.7 12.3 0 17l17 17zm67.8 34c-4.7-4.7-12.3-4.7-17 0-4.7 4.7-4.7 12.3 0 17l17 17c4.7 4.7 12.3 4.7 17 0 4.7-4.7 4.7-12.3 0-17l-17-17zM112 272c0-35.3 28.7-64 64-64 8.8 0 16-7.2 16-16s-7.2-16-16-16c-52.9 0-96 43.1-96 96 0 8.8 7.2 16 16 16s16-7.2 16-16z\"]\n};\nvar faBone = {\n prefix: 'fas',\n iconName: 'bone',\n icon: [640, 512, [], \"f5d7\", \"M598.88 244.56c25.2-12.6 41.12-38.36 41.12-66.53v-7.64C640 129.3 606.7 96 565.61 96c-32.02 0-60.44 20.49-70.57 50.86-7.68 23.03-11.6 45.14-38.11 45.14H183.06c-27.38 0-31.58-25.54-38.11-45.14C134.83 116.49 106.4 96 74.39 96 33.3 96 0 129.3 0 170.39v7.64c0 28.17 15.92 53.93 41.12 66.53 9.43 4.71 9.43 18.17 0 22.88C15.92 280.04 0 305.8 0 333.97v7.64C0 382.7 33.3 416 74.38 416c32.02 0 60.44-20.49 70.57-50.86 7.68-23.03 11.6-45.14 38.11-45.14h273.87c27.38 0 31.58 25.54 38.11 45.14C505.17 395.51 533.6 416 565.61 416c41.08 0 74.38-33.3 74.38-74.39v-7.64c0-28.18-15.92-53.93-41.12-66.53-9.42-4.71-9.42-18.17.01-22.88z\"]\n};\nvar faBong = {\n prefix: 'fas',\n iconName: 'bong',\n icon: [448, 512, [], \"f55c\", \"M302.5 512c23.18 0 44.43-12.58 56-32.66C374.69 451.26 384 418.75 384 384c0-36.12-10.08-69.81-27.44-98.62L400 241.94l9.38 9.38c6.25 6.25 16.38 6.25 22.63 0l11.3-11.32c6.25-6.25 6.25-16.38 0-22.63l-52.69-52.69c-6.25-6.25-16.38-6.25-22.63 0l-11.31 11.31c-6.25 6.25-6.25 16.38 0 22.63l9.38 9.38-39.41 39.41c-11.56-11.37-24.53-21.33-38.65-29.51V63.74l15.97-.02c8.82-.01 15.97-7.16 15.98-15.98l.04-31.72C320 7.17 312.82-.01 303.97 0L80.03.26c-8.82.01-15.97 7.16-15.98 15.98l-.04 31.73c-.01 8.85 7.17 16.02 16.02 16.01L96 63.96v153.93C38.67 251.1 0 312.97 0 384c0 34.75 9.31 67.27 25.5 95.34C37.08 499.42 58.33 512 81.5 512h221zM120.06 259.43L144 245.56V63.91l96-.11v181.76l23.94 13.87c24.81 14.37 44.12 35.73 56.56 60.57h-257c12.45-24.84 31.75-46.2 56.56-60.57z\"]\n};\nvar faBook = {\n prefix: 'fas',\n iconName: 'book',\n icon: [448, 512, [], \"f02d\", \"M448 360V24c0-13.3-10.7-24-24-24H96C43 0 0 43 0 96v320c0 53 43 96 96 96h328c13.3 0 24-10.7 24-24v-16c0-7.5-3.5-14.3-8.9-18.7-4.2-15.4-4.2-59.3 0-74.7 5.4-4.3 8.9-11.1 8.9-18.6zM128 134c0-3.3 2.7-6 6-6h212c3.3 0 6 2.7 6 6v20c0 3.3-2.7 6-6 6H134c-3.3 0-6-2.7-6-6v-20zm0 64c0-3.3 2.7-6 6-6h212c3.3 0 6 2.7 6 6v20c0 3.3-2.7 6-6 6H134c-3.3 0-6-2.7-6-6v-20zm253.4 250H96c-17.7 0-32-14.3-32-32 0-17.6 14.4-32 32-32h285.4c-1.9 17.1-1.9 46.9 0 64z\"]\n};\nvar faBookDead = {\n prefix: 'fas',\n iconName: 'book-dead',\n icon: [448, 512, [], \"f6b7\", \"M272 136c8.8 0 16-7.2 16-16s-7.2-16-16-16-16 7.2-16 16 7.2 16 16 16zm176 222.4V25.6c0-16-9.6-25.6-25.6-25.6H96C41.6 0 0 41.6 0 96v320c0 54.4 41.6 96 96 96h326.4c12.8 0 25.6-9.6 25.6-25.6v-16c0-6.4-3.2-12.8-9.6-19.2-3.2-16-3.2-60.8 0-73.6 6.4-3.2 9.6-9.6 9.6-19.2zM240 56c44.2 0 80 28.7 80 64 0 20.9-12.7 39.2-32 50.9V184c0 8.8-7.2 16-16 16h-64c-8.8 0-16-7.2-16-16v-13.1c-19.3-11.7-32-30-32-50.9 0-35.3 35.8-64 80-64zM124.8 223.3l6.3-14.7c1.7-4.1 6.4-5.9 10.5-4.2l98.3 42.1 98.4-42.1c4.1-1.7 8.8.1 10.5 4.2l6.3 14.7c1.7 4.1-.1 8.8-4.2 10.5L280.6 264l70.3 30.1c4.1 1.7 5.9 6.4 4.2 10.5l-6.3 14.7c-1.7 4.1-6.4 5.9-10.5 4.2L240 281.4l-98.3 42.2c-4.1 1.7-8.8-.1-10.5-4.2l-6.3-14.7c-1.7-4.1.1-8.8 4.2-10.5l70.4-30.1-70.5-30.3c-4.1-1.7-5.9-6.4-4.2-10.5zm256 224.7H96c-19.2 0-32-12.8-32-32s16-32 32-32h284.8zM208 136c8.8 0 16-7.2 16-16s-7.2-16-16-16-16 7.2-16 16 7.2 16 16 16z\"]\n};\nvar faBookMedical = {\n prefix: 'fas',\n iconName: 'book-medical',\n icon: [448, 512, [], \"f7e6\", \"M448 358.4V25.6c0-16-9.6-25.6-25.6-25.6H96C41.6 0 0 41.6 0 96v320c0 54.4 41.6 96 96 96h326.4c12.8 0 25.6-9.6 25.6-25.6v-16q0-9.6-9.6-19.2c-3.2-16-3.2-60.8 0-73.6q9.6-4.8 9.6-19.2zM144 168a8 8 0 0 1 8-8h56v-56a8 8 0 0 1 8-8h48a8 8 0 0 1 8 8v56h56a8 8 0 0 1 8 8v48a8 8 0 0 1-8 8h-56v56a8 8 0 0 1-8 8h-48a8 8 0 0 1-8-8v-56h-56a8 8 0 0 1-8-8zm236.8 280H96c-19.2 0-32-12.8-32-32s16-32 32-32h284.8z\"]\n};\nvar faBookOpen = {\n prefix: 'fas',\n iconName: 'book-open',\n icon: [576, 512, [], \"f518\", \"M542.22 32.05c-54.8 3.11-163.72 14.43-230.96 55.59-4.64 2.84-7.27 7.89-7.27 13.17v363.87c0 11.55 12.63 18.85 23.28 13.49 69.18-34.82 169.23-44.32 218.7-46.92 16.89-.89 30.02-14.43 30.02-30.66V62.75c.01-17.71-15.35-31.74-33.77-30.7zM264.73 87.64C197.5 46.48 88.58 35.17 33.78 32.05 15.36 31.01 0 45.04 0 62.75V400.6c0 16.24 13.13 29.78 30.02 30.66 49.49 2.6 149.59 12.11 218.77 46.95 10.62 5.35 23.21-1.94 23.21-13.46V100.63c0-5.29-2.62-10.14-7.27-12.99z\"]\n};\nvar faBookReader = {\n prefix: 'fas',\n iconName: 'book-reader',\n icon: [512, 512, [], \"f5da\", \"M352 96c0-53.02-42.98-96-96-96s-96 42.98-96 96 42.98 96 96 96 96-42.98 96-96zM233.59 241.1c-59.33-36.32-155.43-46.3-203.79-49.05C13.55 191.13 0 203.51 0 219.14v222.8c0 14.33 11.59 26.28 26.49 27.05 43.66 2.29 131.99 10.68 193.04 41.43 9.37 4.72 20.48-1.71 20.48-11.87V252.56c-.01-4.67-2.32-8.95-6.42-11.46zm248.61-49.05c-48.35 2.74-144.46 12.73-203.78 49.05-4.1 2.51-6.41 6.96-6.41 11.63v245.79c0 10.19 11.14 16.63 20.54 11.9 61.04-30.72 149.32-39.11 192.97-41.4 14.9-.78 26.49-12.73 26.49-27.06V219.14c-.01-15.63-13.56-28.01-29.81-27.09z\"]\n};\nvar faBookmark = {\n prefix: 'fas',\n iconName: 'bookmark',\n icon: [384, 512, [], \"f02e\", \"M0 512V48C0 21.49 21.49 0 48 0h288c26.51 0 48 21.49 48 48v464L192 400 0 512z\"]\n};\nvar faBowlingBall = {\n prefix: 'fas',\n iconName: 'bowling-ball',\n icon: [496, 512, [], \"f436\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zM120 192c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32zm64-96c0-17.7 14.3-32 32-32s32 14.3 32 32-14.3 32-32 32-32-14.3-32-32zm48 144c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32z\"]\n};\nvar faBox = {\n prefix: 'fas',\n iconName: 'box',\n icon: [512, 512, [], \"f466\", \"M509.5 184.6L458.9 32.8C452.4 13.2 434.1 0 413.4 0H272v192h238.7c-.4-2.5-.4-5-1.2-7.4zM240 0H98.6c-20.7 0-39 13.2-45.5 32.8L2.5 184.6c-.8 2.4-.8 4.9-1.2 7.4H240V0zM0 224v240c0 26.5 21.5 48 48 48h416c26.5 0 48-21.5 48-48V224H0z\"]\n};\nvar faBoxOpen = {\n prefix: 'fas',\n iconName: 'box-open',\n icon: [640, 512, [], \"f49e\", \"M425.7 256c-16.9 0-32.8-9-41.4-23.4L320 126l-64.2 106.6c-8.7 14.5-24.6 23.5-41.5 23.5-4.5 0-9-.6-13.3-1.9L64 215v178c0 14.7 10 27.5 24.2 31l216.2 54.1c10.2 2.5 20.9 2.5 31 0L551.8 424c14.2-3.6 24.2-16.4 24.2-31V215l-137 39.1c-4.3 1.3-8.8 1.9-13.3 1.9zm212.6-112.2L586.8 41c-3.1-6.2-9.8-9.8-16.7-8.9L320 64l91.7 152.1c3.8 6.3 11.4 9.3 18.5 7.3l197.9-56.5c9.9-2.9 14.7-13.9 10.2-23.1zM53.2 41L1.7 143.8c-4.6 9.2.3 20.2 10.1 23l197.9 56.5c7.1 2 14.7-1 18.5-7.3L320 64 69.8 32.1c-6.9-.8-13.5 2.7-16.6 8.9z\"]\n};\nvar faBoxes = {\n prefix: 'fas',\n iconName: 'boxes',\n icon: [576, 512, [], \"f468\", \"M560 288h-80v96l-32-21.3-32 21.3v-96h-80c-8.8 0-16 7.2-16 16v192c0 8.8 7.2 16 16 16h224c8.8 0 16-7.2 16-16V304c0-8.8-7.2-16-16-16zm-384-64h224c8.8 0 16-7.2 16-16V16c0-8.8-7.2-16-16-16h-80v96l-32-21.3L256 96V0h-80c-8.8 0-16 7.2-16 16v192c0 8.8 7.2 16 16 16zm64 64h-80v96l-32-21.3L96 384v-96H16c-8.8 0-16 7.2-16 16v192c0 8.8 7.2 16 16 16h224c8.8 0 16-7.2 16-16V304c0-8.8-7.2-16-16-16z\"]\n};\nvar faBraille = {\n prefix: 'fas',\n iconName: 'braille',\n icon: [640, 512, [], \"f2a1\", \"M128 256c0 35.346-28.654 64-64 64S0 291.346 0 256s28.654-64 64-64 64 28.654 64 64zM64 384c-17.673 0-32 14.327-32 32s14.327 32 32 32 32-14.327 32-32-14.327-32-32-32zm0-352C28.654 32 0 60.654 0 96s28.654 64 64 64 64-28.654 64-64-28.654-64-64-64zm160 192c-17.673 0-32 14.327-32 32s14.327 32 32 32 32-14.327 32-32-14.327-32-32-32zm0 160c-17.673 0-32 14.327-32 32s14.327 32 32 32 32-14.327 32-32-14.327-32-32-32zm0-352c-35.346 0-64 28.654-64 64s28.654 64 64 64 64-28.654 64-64-28.654-64-64-64zm224 192c-17.673 0-32 14.327-32 32s14.327 32 32 32 32-14.327 32-32-14.327-32-32-32zm0 160c-17.673 0-32 14.327-32 32s14.327 32 32 32 32-14.327 32-32-14.327-32-32-32zm0-352c-35.346 0-64 28.654-64 64s28.654 64 64 64 64-28.654 64-64-28.654-64-64-64zm160 192c-17.673 0-32 14.327-32 32s14.327 32 32 32 32-14.327 32-32-14.327-32-32-32zm0 160c-17.673 0-32 14.327-32 32s14.327 32 32 32 32-14.327 32-32-14.327-32-32-32zm0-320c-17.673 0-32 14.327-32 32s14.327 32 32 32 32-14.327 32-32-14.327-32-32-32z\"]\n};\nvar faBrain = {\n prefix: 'fas',\n iconName: 'brain',\n icon: [576, 512, [], \"f5dc\", \"M208 0c-29.87 0-54.74 20.55-61.8 48.22-.75-.02-1.45-.22-2.2-.22-35.34 0-64 28.65-64 64 0 4.84.64 9.51 1.66 14.04C52.54 138 32 166.57 32 200c0 12.58 3.16 24.32 8.34 34.91C16.34 248.72 0 274.33 0 304c0 33.34 20.42 61.88 49.42 73.89-.9 4.57-1.42 9.28-1.42 14.11 0 39.76 32.23 72 72 72 4.12 0 8.1-.55 12.03-1.21C141.61 491.31 168.25 512 200 512c39.77 0 72-32.24 72-72V205.45c-10.91 8.98-23.98 15.45-38.36 18.39-4.97 1.02-9.64-2.82-9.64-7.89v-16.18c0-3.57 2.35-6.78 5.8-7.66 24.2-6.16 42.2-27.95 42.2-54.04V64c0-35.35-28.66-64-64-64zm368 304c0-29.67-16.34-55.28-40.34-69.09 5.17-10.59 8.34-22.33 8.34-34.91 0-33.43-20.54-62-49.66-73.96 1.02-4.53 1.66-9.2 1.66-14.04 0-35.35-28.66-64-64-64-.75 0-1.45.2-2.2.22C422.74 20.55 397.87 0 368 0c-35.34 0-64 28.65-64 64v74.07c0 26.09 17.99 47.88 42.2 54.04 3.46.88 5.8 4.09 5.8 7.66v16.18c0 5.07-4.68 8.91-9.64 7.89-14.38-2.94-27.44-9.41-38.36-18.39V440c0 39.76 32.23 72 72 72 31.75 0 58.39-20.69 67.97-49.21 3.93.67 7.91 1.21 12.03 1.21 39.77 0 72-32.24 72-72 0-4.83-.52-9.54-1.42-14.11 29-12.01 49.42-40.55 49.42-73.89z\"]\n};\nvar faBreadSlice = {\n prefix: 'fas',\n iconName: 'bread-slice',\n icon: [576, 512, [], \"f7ec\", \"M288 0C108 0 0 93.4 0 169.14 0 199.44 24.24 224 64 224v256c0 17.67 16.12 32 36 32h376c19.88 0 36-14.33 36-32V224c39.76 0 64-24.56 64-54.86C576 93.4 468 0 288 0z\"]\n};\nvar faBriefcase = {\n prefix: 'fas',\n iconName: 'briefcase',\n icon: [512, 512, [], \"f0b1\", \"M320 336c0 8.84-7.16 16-16 16h-96c-8.84 0-16-7.16-16-16v-48H0v144c0 25.6 22.4 48 48 48h416c25.6 0 48-22.4 48-48V288H320v48zm144-208h-80V80c0-25.6-22.4-48-48-48H176c-25.6 0-48 22.4-48 48v48H48c-25.6 0-48 22.4-48 48v80h512v-80c0-25.6-22.4-48-48-48zm-144 0H192V96h128v32z\"]\n};\nvar faBriefcaseMedical = {\n prefix: 'fas',\n iconName: 'briefcase-medical',\n icon: [512, 512, [], \"f469\", \"M464 128h-80V80c0-26.5-21.5-48-48-48H176c-26.5 0-48 21.5-48 48v48H48c-26.5 0-48 21.5-48 48v288c0 26.5 21.5 48 48 48h416c26.5 0 48-21.5 48-48V176c0-26.5-21.5-48-48-48zM192 96h128v32H192V96zm160 248c0 4.4-3.6 8-8 8h-56v56c0 4.4-3.6 8-8 8h-48c-4.4 0-8-3.6-8-8v-56h-56c-4.4 0-8-3.6-8-8v-48c0-4.4 3.6-8 8-8h56v-56c0-4.4 3.6-8 8-8h48c4.4 0 8 3.6 8 8v56h56c4.4 0 8 3.6 8 8v48z\"]\n};\nvar faBroadcastTower = {\n prefix: 'fas',\n iconName: 'broadcast-tower',\n icon: [640, 512, [], \"f519\", \"M150.94 192h33.73c11.01 0 18.61-10.83 14.86-21.18-4.93-13.58-7.55-27.98-7.55-42.82s2.62-29.24 7.55-42.82C203.29 74.83 195.68 64 184.67 64h-33.73c-7.01 0-13.46 4.49-15.41 11.23C130.64 92.21 128 109.88 128 128c0 18.12 2.64 35.79 7.54 52.76 1.94 6.74 8.39 11.24 15.4 11.24zM89.92 23.34C95.56 12.72 87.97 0 75.96 0H40.63c-6.27 0-12.14 3.59-14.74 9.31C9.4 45.54 0 85.65 0 128c0 24.75 3.12 68.33 26.69 118.86 2.62 5.63 8.42 9.14 14.61 9.14h34.84c12.02 0 19.61-12.74 13.95-23.37-49.78-93.32-16.71-178.15-.17-209.29zM614.06 9.29C611.46 3.58 605.6 0 599.33 0h-35.42c-11.98 0-19.66 12.66-14.02 23.25 18.27 34.29 48.42 119.42.28 209.23-5.72 10.68 1.8 23.52 13.91 23.52h35.23c6.27 0 12.13-3.58 14.73-9.29C630.57 210.48 640 170.36 640 128s-9.42-82.48-25.94-118.71zM489.06 64h-33.73c-11.01 0-18.61 10.83-14.86 21.18 4.93 13.58 7.55 27.98 7.55 42.82s-2.62 29.24-7.55 42.82c-3.76 10.35 3.85 21.18 14.86 21.18h33.73c7.02 0 13.46-4.49 15.41-11.24 4.9-16.97 7.53-34.64 7.53-52.76 0-18.12-2.64-35.79-7.54-52.76-1.94-6.75-8.39-11.24-15.4-11.24zm-116.3 100.12c7.05-10.29 11.2-22.71 11.2-36.12 0-35.35-28.63-64-63.96-64-35.32 0-63.96 28.65-63.96 64 0 13.41 4.15 25.83 11.2 36.12l-130.5 313.41c-3.4 8.15.46 17.52 8.61 20.92l29.51 12.31c8.15 3.4 17.52-.46 20.91-8.61L244.96 384h150.07l49.2 118.15c3.4 8.16 12.76 12.01 20.91 8.61l29.51-12.31c8.15-3.4 12-12.77 8.61-20.92l-130.5-313.41zM271.62 320L320 203.81 368.38 320h-96.76z\"]\n};\nvar faBroom = {\n prefix: 'fas',\n iconName: 'broom',\n icon: [640, 512, [], \"f51a\", \"M256.47 216.77l86.73 109.18s-16.6 102.36-76.57 150.12C206.66 523.85 0 510.19 0 510.19s3.8-23.14 11-55.43l94.62-112.17c3.97-4.7-.87-11.62-6.65-9.5l-60.4 22.09c14.44-41.66 32.72-80.04 54.6-97.47 59.97-47.76 163.3-40.94 163.3-40.94zM636.53 31.03l-19.86-25c-5.49-6.9-15.52-8.05-22.41-2.56l-232.48 177.8-34.14-42.97c-5.09-6.41-15.14-5.21-18.59 2.21l-25.33 54.55 86.73 109.18 58.8-12.45c8-1.69 11.42-11.2 6.34-17.6l-34.09-42.92 232.48-177.8c6.89-5.48 8.04-15.53 2.55-22.44z\"]\n};\nvar faBrush = {\n prefix: 'fas',\n iconName: 'brush',\n icon: [384, 512, [], \"f55d\", \"M352 0H32C14.33 0 0 14.33 0 32v224h384V32c0-17.67-14.33-32-32-32zM0 320c0 35.35 28.66 64 64 64h64v64c0 35.35 28.66 64 64 64s64-28.65 64-64v-64h64c35.34 0 64-28.65 64-64v-32H0v32zm192 104c13.25 0 24 10.74 24 24 0 13.25-10.75 24-24 24s-24-10.75-24-24c0-13.26 10.75-24 24-24z\"]\n};\nvar faBug = {\n prefix: 'fas',\n iconName: 'bug',\n icon: [512, 512, [], \"f188\", \"M511.988 288.9c-.478 17.43-15.217 31.1-32.653 31.1H424v16c0 21.864-4.882 42.584-13.6 61.145l60.228 60.228c12.496 12.497 12.496 32.758 0 45.255-12.498 12.497-32.759 12.496-45.256 0l-54.736-54.736C345.886 467.965 314.351 480 280 480V236c0-6.627-5.373-12-12-12h-24c-6.627 0-12 5.373-12 12v244c-34.351 0-65.886-12.035-90.636-32.108l-54.736 54.736c-12.498 12.497-32.759 12.496-45.256 0-12.496-12.497-12.496-32.758 0-45.255l60.228-60.228C92.882 378.584 88 357.864 88 336v-16H32.666C15.23 320 .491 306.33.013 288.9-.484 270.816 14.028 256 32 256h56v-58.745l-46.628-46.628c-12.496-12.497-12.496-32.758 0-45.255 12.498-12.497 32.758-12.497 45.256 0L141.255 160h229.489l54.627-54.627c12.498-12.497 32.758-12.497 45.256 0 12.496 12.497 12.496 32.758 0 45.255L424 197.255V256h56c17.972 0 32.484 14.816 31.988 32.9zM257 0c-61.856 0-112 50.144-112 112h224C369 50.144 318.856 0 257 0z\"]\n};\nvar faBuilding = {\n prefix: 'fas',\n iconName: 'building',\n icon: [448, 512, [], \"f1ad\", \"M436 480h-20V24c0-13.255-10.745-24-24-24H56C42.745 0 32 10.745 32 24v456H12c-6.627 0-12 5.373-12 12v20h448v-20c0-6.627-5.373-12-12-12zM128 76c0-6.627 5.373-12 12-12h40c6.627 0 12 5.373 12 12v40c0 6.627-5.373 12-12 12h-40c-6.627 0-12-5.373-12-12V76zm0 96c0-6.627 5.373-12 12-12h40c6.627 0 12 5.373 12 12v40c0 6.627-5.373 12-12 12h-40c-6.627 0-12-5.373-12-12v-40zm52 148h-40c-6.627 0-12-5.373-12-12v-40c0-6.627 5.373-12 12-12h40c6.627 0 12 5.373 12 12v40c0 6.627-5.373 12-12 12zm76 160h-64v-84c0-6.627 5.373-12 12-12h40c6.627 0 12 5.373 12 12v84zm64-172c0 6.627-5.373 12-12 12h-40c-6.627 0-12-5.373-12-12v-40c0-6.627 5.373-12 12-12h40c6.627 0 12 5.373 12 12v40zm0-96c0 6.627-5.373 12-12 12h-40c-6.627 0-12-5.373-12-12v-40c0-6.627 5.373-12 12-12h40c6.627 0 12 5.373 12 12v40zm0-96c0 6.627-5.373 12-12 12h-40c-6.627 0-12-5.373-12-12V76c0-6.627 5.373-12 12-12h40c6.627 0 12 5.373 12 12v40z\"]\n};\nvar faBullhorn = {\n prefix: 'fas',\n iconName: 'bullhorn',\n icon: [576, 512, [], \"f0a1\", \"M576 240c0-23.63-12.95-44.04-32-55.12V32.01C544 23.26 537.02 0 512 0c-7.12 0-14.19 2.38-19.98 7.02l-85.03 68.03C364.28 109.19 310.66 128 256 128H64c-35.35 0-64 28.65-64 64v96c0 35.35 28.65 64 64 64h33.7c-1.39 10.48-2.18 21.14-2.18 32 0 39.77 9.26 77.35 25.56 110.94 5.19 10.69 16.52 17.06 28.4 17.06h74.28c26.05 0 41.69-29.84 25.9-50.56-16.4-21.52-26.15-48.36-26.15-77.44 0-11.11 1.62-21.79 4.41-32H256c54.66 0 108.28 18.81 150.98 52.95l85.03 68.03a32.023 32.023 0 0 0 19.98 7.02c24.92 0 32-22.78 32-32V295.13C563.05 284.04 576 263.63 576 240zm-96 141.42l-33.05-26.44C392.95 311.78 325.12 288 256 288v-96c69.12 0 136.95-23.78 190.95-66.98L480 98.58v282.84z\"]\n};\nvar faBullseye = {\n prefix: 'fas',\n iconName: 'bullseye',\n icon: [496, 512, [], \"f140\", \"M248 8C111.03 8 0 119.03 0 256s111.03 248 248 248 248-111.03 248-248S384.97 8 248 8zm0 432c-101.69 0-184-82.29-184-184 0-101.69 82.29-184 184-184 101.69 0 184 82.29 184 184 0 101.69-82.29 184-184 184zm0-312c-70.69 0-128 57.31-128 128s57.31 128 128 128 128-57.31 128-128-57.31-128-128-128zm0 192c-35.29 0-64-28.71-64-64s28.71-64 64-64 64 28.71 64 64-28.71 64-64 64z\"]\n};\nvar faBurn = {\n prefix: 'fas',\n iconName: 'burn',\n icon: [384, 512, [], \"f46a\", \"M192 0C79.7 101.3 0 220.9 0 300.5 0 425 79 512 192 512s192-87 192-211.5c0-79.9-80.2-199.6-192-300.5zm0 448c-56.5 0-96-39-96-94.8 0-13.5 4.6-61.5 96-161.2 91.4 99.7 96 147.7 96 161.2 0 55.8-39.5 94.8-96 94.8z\"]\n};\nvar faBus = {\n prefix: 'fas',\n iconName: 'bus',\n icon: [512, 512, [], \"f207\", \"M488 128h-8V80c0-44.8-99.2-80-224-80S32 35.2 32 80v48h-8c-13.25 0-24 10.74-24 24v80c0 13.25 10.75 24 24 24h8v160c0 17.67 14.33 32 32 32v32c0 17.67 14.33 32 32 32h32c17.67 0 32-14.33 32-32v-32h192v32c0 17.67 14.33 32 32 32h32c17.67 0 32-14.33 32-32v-32h6.4c16 0 25.6-12.8 25.6-25.6V256h8c13.25 0 24-10.75 24-24v-80c0-13.26-10.75-24-24-24zM112 400c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm16-112c-17.67 0-32-14.33-32-32V128c0-17.67 14.33-32 32-32h256c17.67 0 32 14.33 32 32v128c0 17.67-14.33 32-32 32H128zm272 112c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32z\"]\n};\nvar faBusAlt = {\n prefix: 'fas',\n iconName: 'bus-alt',\n icon: [512, 512, [], \"f55e\", \"M488 128h-8V80c0-44.8-99.2-80-224-80S32 35.2 32 80v48h-8c-13.25 0-24 10.74-24 24v80c0 13.25 10.75 24 24 24h8v160c0 17.67 14.33 32 32 32v32c0 17.67 14.33 32 32 32h32c17.67 0 32-14.33 32-32v-32h192v32c0 17.67 14.33 32 32 32h32c17.67 0 32-14.33 32-32v-32h6.4c16 0 25.6-12.8 25.6-25.6V256h8c13.25 0 24-10.75 24-24v-80c0-13.26-10.75-24-24-24zM160 72c0-4.42 3.58-8 8-8h176c4.42 0 8 3.58 8 8v16c0 4.42-3.58 8-8 8H168c-4.42 0-8-3.58-8-8V72zm-48 328c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm128-112H128c-17.67 0-32-14.33-32-32v-96c0-17.67 14.33-32 32-32h112v160zm32 0V128h112c17.67 0 32 14.33 32 32v96c0 17.67-14.33 32-32 32H272zm128 112c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32z\"]\n};\nvar faBusinessTime = {\n prefix: 'fas',\n iconName: 'business-time',\n icon: [640, 512, [], \"f64a\", \"M496 224c-79.59 0-144 64.41-144 144s64.41 144 144 144 144-64.41 144-144-64.41-144-144-144zm64 150.29c0 5.34-4.37 9.71-9.71 9.71h-60.57c-5.34 0-9.71-4.37-9.71-9.71v-76.57c0-5.34 4.37-9.71 9.71-9.71h12.57c5.34 0 9.71 4.37 9.71 9.71V352h38.29c5.34 0 9.71 4.37 9.71 9.71v12.58zM496 192c5.4 0 10.72.33 16 .81V144c0-25.6-22.4-48-48-48h-80V48c0-25.6-22.4-48-48-48H176c-25.6 0-48 22.4-48 48v48H48c-25.6 0-48 22.4-48 48v80h395.12c28.6-20.09 63.35-32 100.88-32zM320 96H192V64h128v32zm6.82 224H208c-8.84 0-16-7.16-16-16v-48H0v144c0 25.6 22.4 48 48 48h291.43C327.1 423.96 320 396.82 320 368c0-16.66 2.48-32.72 6.82-48z\"]\n};\nvar faCalculator = {\n prefix: 'fas',\n iconName: 'calculator',\n icon: [448, 512, [], \"f1ec\", \"M400 0H48C22.4 0 0 22.4 0 48v416c0 25.6 22.4 48 48 48h352c25.6 0 48-22.4 48-48V48c0-25.6-22.4-48-48-48zM128 435.2c0 6.4-6.4 12.8-12.8 12.8H76.8c-6.4 0-12.8-6.4-12.8-12.8v-38.4c0-6.4 6.4-12.8 12.8-12.8h38.4c6.4 0 12.8 6.4 12.8 12.8v38.4zm0-128c0 6.4-6.4 12.8-12.8 12.8H76.8c-6.4 0-12.8-6.4-12.8-12.8v-38.4c0-6.4 6.4-12.8 12.8-12.8h38.4c6.4 0 12.8 6.4 12.8 12.8v38.4zm128 128c0 6.4-6.4 12.8-12.8 12.8h-38.4c-6.4 0-12.8-6.4-12.8-12.8v-38.4c0-6.4 6.4-12.8 12.8-12.8h38.4c6.4 0 12.8 6.4 12.8 12.8v38.4zm0-128c0 6.4-6.4 12.8-12.8 12.8h-38.4c-6.4 0-12.8-6.4-12.8-12.8v-38.4c0-6.4 6.4-12.8 12.8-12.8h38.4c6.4 0 12.8 6.4 12.8 12.8v38.4zm128 128c0 6.4-6.4 12.8-12.8 12.8h-38.4c-6.4 0-12.8-6.4-12.8-12.8V268.8c0-6.4 6.4-12.8 12.8-12.8h38.4c6.4 0 12.8 6.4 12.8 12.8v166.4zm0-256c0 6.4-6.4 12.8-12.8 12.8H76.8c-6.4 0-12.8-6.4-12.8-12.8V76.8C64 70.4 70.4 64 76.8 64h294.4c6.4 0 12.8 6.4 12.8 12.8v102.4z\"]\n};\nvar faCalendar = {\n prefix: 'fas',\n iconName: 'calendar',\n icon: [448, 512, [], \"f133\", \"M12 192h424c6.6 0 12 5.4 12 12v260c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V204c0-6.6 5.4-12 12-12zm436-44v-36c0-26.5-21.5-48-48-48h-48V12c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v52H160V12c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v52H48C21.5 64 0 85.5 0 112v36c0 6.6 5.4 12 12 12h424c6.6 0 12-5.4 12-12z\"]\n};\nvar faCalendarAlt = {\n prefix: 'fas',\n iconName: 'calendar-alt',\n icon: [448, 512, [], \"f073\", \"M0 464c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V192H0v272zm320-196c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v40c0 6.6-5.4 12-12 12h-40c-6.6 0-12-5.4-12-12v-40zm0 128c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v40c0 6.6-5.4 12-12 12h-40c-6.6 0-12-5.4-12-12v-40zM192 268c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v40c0 6.6-5.4 12-12 12h-40c-6.6 0-12-5.4-12-12v-40zm0 128c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v40c0 6.6-5.4 12-12 12h-40c-6.6 0-12-5.4-12-12v-40zM64 268c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v40c0 6.6-5.4 12-12 12H76c-6.6 0-12-5.4-12-12v-40zm0 128c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v40c0 6.6-5.4 12-12 12H76c-6.6 0-12-5.4-12-12v-40zM400 64h-48V16c0-8.8-7.2-16-16-16h-32c-8.8 0-16 7.2-16 16v48H160V16c0-8.8-7.2-16-16-16h-32c-8.8 0-16 7.2-16 16v48H48C21.5 64 0 85.5 0 112v48h448v-48c0-26.5-21.5-48-48-48z\"]\n};\nvar faCalendarCheck = {\n prefix: 'fas',\n iconName: 'calendar-check',\n icon: [448, 512, [], \"f274\", \"M436 160H12c-6.627 0-12-5.373-12-12v-36c0-26.51 21.49-48 48-48h48V12c0-6.627 5.373-12 12-12h40c6.627 0 12 5.373 12 12v52h128V12c0-6.627 5.373-12 12-12h40c6.627 0 12 5.373 12 12v52h48c26.51 0 48 21.49 48 48v36c0 6.627-5.373 12-12 12zM12 192h424c6.627 0 12 5.373 12 12v260c0 26.51-21.49 48-48 48H48c-26.51 0-48-21.49-48-48V204c0-6.627 5.373-12 12-12zm333.296 95.947l-28.169-28.398c-4.667-4.705-12.265-4.736-16.97-.068L194.12 364.665l-45.98-46.352c-4.667-4.705-12.266-4.736-16.971-.068l-28.397 28.17c-4.705 4.667-4.736 12.265-.068 16.97l82.601 83.269c4.667 4.705 12.265 4.736 16.97.068l142.953-141.805c4.705-4.667 4.736-12.265.068-16.97z\"]\n};\nvar faCalendarDay = {\n prefix: 'fas',\n iconName: 'calendar-day',\n icon: [448, 512, [], \"f783\", \"M0 464c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V192H0v272zm64-192c0-8.8 7.2-16 16-16h96c8.8 0 16 7.2 16 16v96c0 8.8-7.2 16-16 16H80c-8.8 0-16-7.2-16-16v-96zM400 64h-48V16c0-8.8-7.2-16-16-16h-32c-8.8 0-16 7.2-16 16v48H160V16c0-8.8-7.2-16-16-16h-32c-8.8 0-16 7.2-16 16v48H48C21.5 64 0 85.5 0 112v48h448v-48c0-26.5-21.5-48-48-48z\"]\n};\nvar faCalendarMinus = {\n prefix: 'fas',\n iconName: 'calendar-minus',\n icon: [448, 512, [], \"f272\", \"M436 160H12c-6.6 0-12-5.4-12-12v-36c0-26.5 21.5-48 48-48h48V12c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v52h128V12c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v52h48c26.5 0 48 21.5 48 48v36c0 6.6-5.4 12-12 12zM12 192h424c6.6 0 12 5.4 12 12v260c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V204c0-6.6 5.4-12 12-12zm304 192c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12H132c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h184z\"]\n};\nvar faCalendarPlus = {\n prefix: 'fas',\n iconName: 'calendar-plus',\n icon: [448, 512, [], \"f271\", \"M436 160H12c-6.6 0-12-5.4-12-12v-36c0-26.5 21.5-48 48-48h48V12c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v52h128V12c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v52h48c26.5 0 48 21.5 48 48v36c0 6.6-5.4 12-12 12zM12 192h424c6.6 0 12 5.4 12 12v260c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V204c0-6.6 5.4-12 12-12zm316 140c0-6.6-5.4-12-12-12h-60v-60c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v60h-60c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h60v60c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12v-60h60c6.6 0 12-5.4 12-12v-40z\"]\n};\nvar faCalendarTimes = {\n prefix: 'fas',\n iconName: 'calendar-times',\n icon: [448, 512, [], \"f273\", \"M436 160H12c-6.6 0-12-5.4-12-12v-36c0-26.5 21.5-48 48-48h48V12c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v52h128V12c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v52h48c26.5 0 48 21.5 48 48v36c0 6.6-5.4 12-12 12zM12 192h424c6.6 0 12 5.4 12 12v260c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V204c0-6.6 5.4-12 12-12zm257.3 160l48.1-48.1c4.7-4.7 4.7-12.3 0-17l-28.3-28.3c-4.7-4.7-12.3-4.7-17 0L224 306.7l-48.1-48.1c-4.7-4.7-12.3-4.7-17 0l-28.3 28.3c-4.7 4.7-4.7 12.3 0 17l48.1 48.1-48.1 48.1c-4.7 4.7-4.7 12.3 0 17l28.3 28.3c4.7 4.7 12.3 4.7 17 0l48.1-48.1 48.1 48.1c4.7 4.7 12.3 4.7 17 0l28.3-28.3c4.7-4.7 4.7-12.3 0-17L269.3 352z\"]\n};\nvar faCalendarWeek = {\n prefix: 'fas',\n iconName: 'calendar-week',\n icon: [448, 512, [], \"f784\", \"M0 464c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V192H0v272zm64-192c0-8.8 7.2-16 16-16h288c8.8 0 16 7.2 16 16v64c0 8.8-7.2 16-16 16H80c-8.8 0-16-7.2-16-16v-64zM400 64h-48V16c0-8.8-7.2-16-16-16h-32c-8.8 0-16 7.2-16 16v48H160V16c0-8.8-7.2-16-16-16h-32c-8.8 0-16 7.2-16 16v48H48C21.5 64 0 85.5 0 112v48h448v-48c0-26.5-21.5-48-48-48z\"]\n};\nvar faCamera = {\n prefix: 'fas',\n iconName: 'camera',\n icon: [512, 512, [], \"f030\", \"M512 144v288c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V144c0-26.5 21.5-48 48-48h88l12.3-32.9c7-18.7 24.9-31.1 44.9-31.1h125.5c20 0 37.9 12.4 44.9 31.1L376 96h88c26.5 0 48 21.5 48 48zM376 288c0-66.2-53.8-120-120-120s-120 53.8-120 120 53.8 120 120 120 120-53.8 120-120zm-32 0c0 48.5-39.5 88-88 88s-88-39.5-88-88 39.5-88 88-88 88 39.5 88 88z\"]\n};\nvar faCameraRetro = {\n prefix: 'fas',\n iconName: 'camera-retro',\n icon: [512, 512, [], \"f083\", \"M48 32C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h416c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48H48zm0 32h106c3.3 0 6 2.7 6 6v20c0 3.3-2.7 6-6 6H38c-3.3 0-6-2.7-6-6V80c0-8.8 7.2-16 16-16zm426 96H38c-3.3 0-6-2.7-6-6v-36c0-3.3 2.7-6 6-6h138l30.2-45.3c1.1-1.7 3-2.7 5-2.7H464c8.8 0 16 7.2 16 16v74c0 3.3-2.7 6-6 6zM256 424c-66.2 0-120-53.8-120-120s53.8-120 120-120 120 53.8 120 120-53.8 120-120 120zm0-208c-48.5 0-88 39.5-88 88s39.5 88 88 88 88-39.5 88-88-39.5-88-88-88zm-48 104c-8.8 0-16-7.2-16-16 0-35.3 28.7-64 64-64 8.8 0 16 7.2 16 16s-7.2 16-16 16c-17.6 0-32 14.4-32 32 0 8.8-7.2 16-16 16z\"]\n};\nvar faCampground = {\n prefix: 'fas',\n iconName: 'campground',\n icon: [640, 512, [], \"f6bb\", \"M624 448h-24.68L359.54 117.75l53.41-73.55c5.19-7.15 3.61-17.16-3.54-22.35l-25.9-18.79c-7.15-5.19-17.15-3.61-22.35 3.55L320 63.3 278.83 6.6c-5.19-7.15-15.2-8.74-22.35-3.55l-25.88 18.8c-7.15 5.19-8.74 15.2-3.54 22.35l53.41 73.55L40.68 448H16c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h608c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16zM320 288l116.36 160H203.64L320 288z\"]\n};\nvar faCandyCane = {\n prefix: 'fas',\n iconName: 'candy-cane',\n icon: [512, 512, [], \"f786\", \"M497.5 92C469.6 33.1 411.8 0 352.4 0c-27.9 0-56.2 7.3-81.8 22.6L243.1 39c-15.2 9.1-20.1 28.7-11 43.9l32.8 54.9c6 10 16.6 15.6 27.5 15.6 5.6 0 11.2-1.5 16.4-4.5l27.5-16.4c5.1-3.1 10.8-4.5 16.4-4.5 10.9 0 21.5 5.6 27.5 15.6 9.1 15.1 4.1 34.8-11 43.9L15.6 397.6c-15.2 9.1-20.1 28.7-11 43.9l32.8 54.9c6 10 16.6 15.6 27.5 15.6 5.6 0 11.2-1.5 16.4-4.5L428.6 301c71.7-42.9 104.6-133.5 68.9-209zm-177.7 13l-2.5 1.5L296.8 45c9.7-4.7 19.8-8.1 30.3-10.2l20.6 61.8c-9.8.8-19.4 3.3-27.9 8.4zM145.9 431.8l-60.5-38.5 30.8-18.3 60.5 38.5-30.8 18.3zm107.5-63.9l-60.5-38.5 30.8-18.3 60.5 38.5-30.8 18.3zM364.3 302l-60.5-38.5 30.8-18.3 60.5 38.5-30.8 18.3zm20.4-197.3l46-46c8.4 6.5 16 14.1 22.6 22.6L407.6 127c-5.7-9.3-13.7-16.9-22.9-22.3zm82.1 107.8l-59.5-19.8c3.2-5.3 5.8-10.9 7.4-17.1 1.1-4.5 1.7-9.1 1.8-13.6l60.4 20.1c-2.1 10.4-5.5 20.6-10.1 30.4z\"]\n};\nvar faCannabis = {\n prefix: 'fas',\n iconName: 'cannabis',\n icon: [512, 512, [], \"f55f\", \"M503.47 360.25c-1.56-.82-32.39-16.89-76.78-25.81 64.25-75.12 84.05-161.67 84.93-165.64 1.18-5.33-.44-10.9-4.3-14.77-3.03-3.04-7.12-4.7-11.32-4.7-1.14 0-2.29.12-3.44.38-3.88.85-86.54 19.59-160.58 79.76.01-1.46.01-2.93.01-4.4 0-118.79-59.98-213.72-62.53-217.7A15.973 15.973 0 0 0 256 0c-5.45 0-10.53 2.78-13.47 7.37-2.55 3.98-62.53 98.91-62.53 217.7 0 1.47.01 2.94.01 4.4-74.03-60.16-156.69-78.9-160.58-79.76-1.14-.25-2.29-.38-3.44-.38-4.2 0-8.29 1.66-11.32 4.7A15.986 15.986 0 0 0 .38 168.8c.88 3.97 20.68 90.52 84.93 165.64-44.39 8.92-75.21 24.99-76.78 25.81a16.003 16.003 0 0 0-.02 28.29c2.45 1.29 60.76 31.72 133.49 31.72 6.14 0 11.96-.1 17.5-.31-11.37 22.23-16.52 38.31-16.81 39.22-1.8 5.68-.29 11.89 3.91 16.11a16.019 16.019 0 0 0 16.1 3.99c1.83-.57 37.72-11.99 77.3-39.29V504c0 4.42 3.58 8 8 8h16c4.42 0 8-3.58 8-8v-64.01c39.58 27.3 75.47 38.71 77.3 39.29a16.019 16.019 0 0 0 16.1-3.99c4.2-4.22 5.71-10.43 3.91-16.11-.29-.91-5.45-16.99-16.81-39.22 5.54.21 11.37.31 17.5.31 72.72 0 131.04-30.43 133.49-31.72 5.24-2.78 8.52-8.22 8.51-14.15-.01-5.94-3.29-11.39-8.53-14.15z\"]\n};\nvar faCapsules = {\n prefix: 'fas',\n iconName: 'capsules',\n icon: [576, 512, [], \"f46b\", \"M555.3 300.1L424.2 112.8C401.9 81 366.4 64 330.4 64c-22.6 0-45.5 6.7-65.5 20.7-19.7 13.8-33.7 32.8-41.5 53.8C220.5 79.2 172 32 112 32 50.1 32 0 82.1 0 144v224c0 61.9 50.1 112 112 112s112-50.1 112-112V218.9c3.3 8.6 7.3 17.1 12.8 25L368 431.2c22.2 31.8 57.7 48.8 93.8 48.8 22.7 0 45.5-6.7 65.5-20.7 51.7-36.2 64.2-107.5 28-159.2zM160 256H64V144c0-26.5 21.5-48 48-48s48 21.5 48 48v112zm194.8 44.9l-65.6-93.7c-7.7-11-10.7-24.4-8.3-37.6 2.3-13.2 9.7-24.8 20.7-32.5 8.5-6 18.5-9.1 28.8-9.1 16.5 0 31.9 8 41.3 21.5l65.6 93.7-82.5 57.7z\"]\n};\nvar faCar = {\n prefix: 'fas',\n iconName: 'car',\n icon: [512, 512, [], \"f1b9\", \"M499.99 176h-59.87l-16.64-41.6C406.38 91.63 365.57 64 319.5 64h-127c-46.06 0-86.88 27.63-103.99 70.4L71.87 176H12.01C4.2 176-1.53 183.34.37 190.91l6 24C7.7 220.25 12.5 224 18.01 224h20.07C24.65 235.73 16 252.78 16 272v48c0 16.12 6.16 30.67 16 41.93V416c0 17.67 14.33 32 32 32h32c17.67 0 32-14.33 32-32v-32h256v32c0 17.67 14.33 32 32 32h32c17.67 0 32-14.33 32-32v-54.07c9.84-11.25 16-25.8 16-41.93v-48c0-19.22-8.65-36.27-22.07-48H494c5.51 0 10.31-3.75 11.64-9.09l6-24c1.89-7.57-3.84-14.91-11.65-14.91zm-352.06-17.83c7.29-18.22 24.94-30.17 44.57-30.17h127c19.63 0 37.28 11.95 44.57 30.17L384 208H128l19.93-49.83zM96 319.8c-19.2 0-32-12.76-32-31.9S76.8 256 96 256s48 28.71 48 47.85-28.8 15.95-48 15.95zm320 0c-19.2 0-48 3.19-48-15.95S396.8 256 416 256s32 12.76 32 31.9-12.8 31.9-32 31.9z\"]\n};\nvar faCarAlt = {\n prefix: 'fas',\n iconName: 'car-alt',\n icon: [480, 512, [], \"f5de\", \"M438.66 212.33l-11.24-28.1-19.93-49.83C390.38 91.63 349.57 64 303.5 64h-127c-46.06 0-86.88 27.63-103.99 70.4l-19.93 49.83-11.24 28.1C17.22 221.5 0 244.66 0 272v48c0 16.12 6.16 30.67 16 41.93V416c0 17.67 14.33 32 32 32h32c17.67 0 32-14.33 32-32v-32h256v32c0 17.67 14.33 32 32 32h32c17.67 0 32-14.33 32-32v-54.07c9.84-11.25 16-25.8 16-41.93v-48c0-27.34-17.22-50.5-41.34-59.67zm-306.73-54.16c7.29-18.22 24.94-30.17 44.57-30.17h127c19.63 0 37.28 11.95 44.57 30.17L368 208H112l19.93-49.83zM80 319.8c-19.2 0-32-12.76-32-31.9S60.8 256 80 256s48 28.71 48 47.85-28.8 15.95-48 15.95zm320 0c-19.2 0-48 3.19-48-15.95S380.8 256 400 256s32 12.76 32 31.9-12.8 31.9-32 31.9z\"]\n};\nvar faCarBattery = {\n prefix: 'fas',\n iconName: 'car-battery',\n icon: [512, 512, [], \"f5df\", \"M480 128h-32V80c0-8.84-7.16-16-16-16h-96c-8.84 0-16 7.16-16 16v48H192V80c0-8.84-7.16-16-16-16H80c-8.84 0-16 7.16-16 16v48H32c-17.67 0-32 14.33-32 32v256c0 17.67 14.33 32 32 32h448c17.67 0 32-14.33 32-32V160c0-17.67-14.33-32-32-32zM192 264c0 4.42-3.58 8-8 8H72c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h112c4.42 0 8 3.58 8 8v16zm256 0c0 4.42-3.58 8-8 8h-40v40c0 4.42-3.58 8-8 8h-16c-4.42 0-8-3.58-8-8v-40h-40c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h40v-40c0-4.42 3.58-8 8-8h16c4.42 0 8 3.58 8 8v40h40c4.42 0 8 3.58 8 8v16z\"]\n};\nvar faCarCrash = {\n prefix: 'fas',\n iconName: 'car-crash',\n icon: [640, 512, [], \"f5e1\", \"M143.25 220.81l-12.42 46.37c-3.01 11.25-3.63 22.89-2.41 34.39l-35.2 28.98c-6.57 5.41-16.31-.43-14.62-8.77l15.44-76.68c1.06-5.26-2.66-10.28-8-10.79l-77.86-7.55c-8.47-.82-11.23-11.83-4.14-16.54l65.15-43.3c4.46-2.97 5.38-9.15 1.98-13.29L21.46 93.22c-5.41-6.57.43-16.3 8.78-14.62l76.68 15.44c5.26 1.06 10.28-2.66 10.8-8l7.55-77.86c.82-8.48 11.83-11.23 16.55-4.14l43.3 65.14c2.97 4.46 9.15 5.38 13.29 1.98l60.4-49.71c6.57-5.41 16.3.43 14.62 8.77L262.1 86.38c-2.71 3.05-5.43 6.09-7.91 9.4l-32.15 42.97-10.71 14.32c-32.73 8.76-59.18 34.53-68.08 67.74zm494.57 132.51l-12.42 46.36c-3.13 11.68-9.38 21.61-17.55 29.36a66.876 66.876 0 0 1-8.76 7l-13.99 52.23c-1.14 4.27-3.1 8.1-5.65 11.38-7.67 9.84-20.74 14.68-33.54 11.25L515 502.62c-17.07-4.57-27.2-22.12-22.63-39.19l8.28-30.91-247.28-66.26-8.28 30.91c-4.57 17.07-22.12 27.2-39.19 22.63l-30.91-8.28c-12.8-3.43-21.7-14.16-23.42-26.51-.57-4.12-.35-8.42.79-12.68l13.99-52.23a66.62 66.62 0 0 1-4.09-10.45c-3.2-10.79-3.65-22.52-.52-34.2l12.42-46.37c5.31-19.8 19.36-34.83 36.89-42.21a64.336 64.336 0 0 1 18.49-4.72l18.13-24.23 32.15-42.97c3.45-4.61 7.19-8.9 11.2-12.84 8-7.89 17.03-14.44 26.74-19.51 4.86-2.54 9.89-4.71 15.05-6.49 10.33-3.58 21.19-5.63 32.24-6.04 11.05-.41 22.31.82 33.43 3.8l122.68 32.87c11.12 2.98 21.48 7.54 30.85 13.43a111.11 111.11 0 0 1 34.69 34.5c8.82 13.88 14.64 29.84 16.68 46.99l6.36 53.29 3.59 30.05a64.49 64.49 0 0 1 22.74 29.93c4.39 11.88 5.29 25.19 1.75 38.39zM255.58 234.34c-18.55-4.97-34.21 4.04-39.17 22.53-4.96 18.49 4.11 34.12 22.65 39.09 18.55 4.97 45.54 15.51 50.49-2.98 4.96-18.49-15.43-53.67-33.97-58.64zm290.61 28.17l-6.36-53.29c-.58-4.87-1.89-9.53-3.82-13.86-5.8-12.99-17.2-23.01-31.42-26.82l-122.68-32.87a48.008 48.008 0 0 0-50.86 17.61l-32.15 42.97 172 46.08 75.29 20.18zm18.49 54.65c-18.55-4.97-53.8 15.31-58.75 33.79-4.95 18.49 23.69 22.86 42.24 27.83 18.55 4.97 34.21-4.04 39.17-22.53 4.95-18.48-4.11-34.12-22.66-39.09z\"]\n};\nvar faCarSide = {\n prefix: 'fas',\n iconName: 'car-side',\n icon: [640, 512, [], \"f5e4\", \"M544 192h-16L419.22 56.02A64.025 64.025 0 0 0 369.24 32H155.33c-26.17 0-49.7 15.93-59.42 40.23L48 194.26C20.44 201.4 0 226.21 0 256v112c0 8.84 7.16 16 16 16h48c0 53.02 42.98 96 96 96s96-42.98 96-96h128c0 53.02 42.98 96 96 96s96-42.98 96-96h48c8.84 0 16-7.16 16-16v-80c0-53.02-42.98-96-96-96zM160 432c-26.47 0-48-21.53-48-48s21.53-48 48-48 48 21.53 48 48-21.53 48-48 48zm72-240H116.93l38.4-96H232v96zm48 0V96h89.24l76.8 96H280zm200 240c-26.47 0-48-21.53-48-48s21.53-48 48-48 48 21.53 48 48-21.53 48-48 48z\"]\n};\nvar faCaretDown = {\n prefix: 'fas',\n iconName: 'caret-down',\n icon: [320, 512, [], \"f0d7\", \"M31.3 192h257.3c17.8 0 26.7 21.5 14.1 34.1L174.1 354.8c-7.8 7.8-20.5 7.8-28.3 0L17.2 226.1C4.6 213.5 13.5 192 31.3 192z\"]\n};\nvar faCaretLeft = {\n prefix: 'fas',\n iconName: 'caret-left',\n icon: [192, 512, [], \"f0d9\", \"M192 127.338v257.324c0 17.818-21.543 26.741-34.142 14.142L29.196 270.142c-7.81-7.81-7.81-20.474 0-28.284l128.662-128.662c12.599-12.6 34.142-3.676 34.142 14.142z\"]\n};\nvar faCaretRight = {\n prefix: 'fas',\n iconName: 'caret-right',\n icon: [192, 512, [], \"f0da\", \"M0 384.662V127.338c0-17.818 21.543-26.741 34.142-14.142l128.662 128.662c7.81 7.81 7.81 20.474 0 28.284L34.142 398.804C21.543 411.404 0 402.48 0 384.662z\"]\n};\nvar faCaretSquareDown = {\n prefix: 'fas',\n iconName: 'caret-square-down',\n icon: [448, 512, [], \"f150\", \"M448 80v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V80c0-26.5 21.5-48 48-48h352c26.5 0 48 21.5 48 48zM92.5 220.5l123 123c4.7 4.7 12.3 4.7 17 0l123-123c7.6-7.6 2.2-20.5-8.5-20.5H101c-10.7 0-16.1 12.9-8.5 20.5z\"]\n};\nvar faCaretSquareLeft = {\n prefix: 'fas',\n iconName: 'caret-square-left',\n icon: [448, 512, [], \"f191\", \"M400 480H48c-26.51 0-48-21.49-48-48V80c0-26.51 21.49-48 48-48h352c26.51 0 48 21.49 48 48v352c0 26.51-21.49 48-48 48zM259.515 124.485l-123.03 123.03c-4.686 4.686-4.686 12.284 0 16.971l123.029 123.029c7.56 7.56 20.485 2.206 20.485-8.485V132.971c.001-10.691-12.925-16.045-20.484-8.486z\"]\n};\nvar faCaretSquareRight = {\n prefix: 'fas',\n iconName: 'caret-square-right',\n icon: [448, 512, [], \"f152\", \"M48 32h352c26.51 0 48 21.49 48 48v352c0 26.51-21.49 48-48 48H48c-26.51 0-48-21.49-48-48V80c0-26.51 21.49-48 48-48zm140.485 355.515l123.029-123.029c4.686-4.686 4.686-12.284 0-16.971l-123.029-123.03c-7.56-7.56-20.485-2.206-20.485 8.485v246.059c0 10.691 12.926 16.045 20.485 8.486z\"]\n};\nvar faCaretSquareUp = {\n prefix: 'fas',\n iconName: 'caret-square-up',\n icon: [448, 512, [], \"f151\", \"M0 432V80c0-26.51 21.49-48 48-48h352c26.51 0 48 21.49 48 48v352c0 26.51-21.49 48-48 48H48c-26.51 0-48-21.49-48-48zm355.515-140.485l-123.03-123.03c-4.686-4.686-12.284-4.686-16.971 0L92.485 291.515c-7.56 7.56-2.206 20.485 8.485 20.485h246.059c10.691 0 16.045-12.926 8.486-20.485z\"]\n};\nvar faCaretUp = {\n prefix: 'fas',\n iconName: 'caret-up',\n icon: [320, 512, [], \"f0d8\", \"M288.662 352H31.338c-17.818 0-26.741-21.543-14.142-34.142l128.662-128.662c7.81-7.81 20.474-7.81 28.284 0l128.662 128.662c12.6 12.599 3.676 34.142-14.142 34.142z\"]\n};\nvar faCarrot = {\n prefix: 'fas',\n iconName: 'carrot',\n icon: [512, 512, [], \"f787\", \"M298.2 156.6c-52.7-25.7-114.5-10.5-150.2 32.8l55.2 55.2c6.3 6.3 6.3 16.4 0 22.6-3.1 3.1-7.2 4.7-11.3 4.7s-8.2-1.6-11.3-4.7L130.4 217 2.3 479.7c-2.9 6-3.1 13.3 0 19.7 5.4 11.1 18.9 15.7 30 10.3l133.6-65.2-49.2-49.2c-6.3-6.2-6.3-16.4 0-22.6 6.3-6.2 16.4-6.2 22.6 0l57 57 102-49.8c24-11.7 44.5-31.3 57.1-57.1 30.1-61.7 4.5-136.1-57.2-166.2zm92.1-34.9C409.8 81 399.7 32.9 360 0c-50.3 41.7-52.5 107.5-7.9 151.9l8 8c44.4 44.6 110.3 42.4 151.9-7.9-32.9-39.7-81-49.8-121.7-30.3z\"]\n};\nvar faCartArrowDown = {\n prefix: 'fas',\n iconName: 'cart-arrow-down',\n icon: [576, 512, [], \"f218\", \"M504.717 320H211.572l6.545 32h268.418c15.401 0 26.816 14.301 23.403 29.319l-5.517 24.276C523.112 414.668 536 433.828 536 456c0 31.202-25.519 56.444-56.824 55.994-29.823-.429-54.35-24.631-55.155-54.447-.44-16.287 6.085-31.049 16.803-41.548H231.176C241.553 426.165 248 440.326 248 456c0 31.813-26.528 57.431-58.67 55.938-28.54-1.325-51.751-24.385-53.251-52.917-1.158-22.034 10.436-41.455 28.051-51.586L93.883 64H24C10.745 64 0 53.255 0 40V24C0 10.745 10.745 0 24 0h102.529c11.401 0 21.228 8.021 23.513 19.19L159.208 64H551.99c15.401 0 26.816 14.301 23.403 29.319l-47.273 208C525.637 312.246 515.923 320 504.717 320zM403.029 192H360v-60c0-6.627-5.373-12-12-12h-24c-6.627 0-12 5.373-12 12v60h-43.029c-10.691 0-16.045 12.926-8.485 20.485l67.029 67.029c4.686 4.686 12.284 4.686 16.971 0l67.029-67.029c7.559-7.559 2.205-20.485-8.486-20.485z\"]\n};\nvar faCartPlus = {\n prefix: 'fas',\n iconName: 'cart-plus',\n icon: [576, 512, [], \"f217\", \"M504.717 320H211.572l6.545 32h268.418c15.401 0 26.816 14.301 23.403 29.319l-5.517 24.276C523.112 414.668 536 433.828 536 456c0 31.202-25.519 56.444-56.824 55.994-29.823-.429-54.35-24.631-55.155-54.447-.44-16.287 6.085-31.049 16.803-41.548H231.176C241.553 426.165 248 440.326 248 456c0 31.813-26.528 57.431-58.67 55.938-28.54-1.325-51.751-24.385-53.251-52.917-1.158-22.034 10.436-41.455 28.051-51.586L93.883 64H24C10.745 64 0 53.255 0 40V24C0 10.745 10.745 0 24 0h102.529c11.401 0 21.228 8.021 23.513 19.19L159.208 64H551.99c15.401 0 26.816 14.301 23.403 29.319l-47.273 208C525.637 312.246 515.923 320 504.717 320zM408 168h-48v-40c0-8.837-7.163-16-16-16h-16c-8.837 0-16 7.163-16 16v40h-48c-8.837 0-16 7.163-16 16v16c0 8.837 7.163 16 16 16h48v40c0 8.837 7.163 16 16 16h16c8.837 0 16-7.163 16-16v-40h48c8.837 0 16-7.163 16-16v-16c0-8.837-7.163-16-16-16z\"]\n};\nvar faCashRegister = {\n prefix: 'fas',\n iconName: 'cash-register',\n icon: [512, 512, [], \"f788\", \"M511.1 378.8l-26.7-160c-2.6-15.4-15.9-26.7-31.6-26.7H208v-64h96c8.8 0 16-7.2 16-16V16c0-8.8-7.2-16-16-16H48c-8.8 0-16 7.2-16 16v96c0 8.8 7.2 16 16 16h96v64H59.1c-15.6 0-29 11.3-31.6 26.7L.8 378.7c-.6 3.5-.9 7-.9 10.5V480c0 17.7 14.3 32 32 32h448c17.7 0 32-14.3 32-32v-90.7c.1-3.5-.2-7-.8-10.5zM280 248c0-8.8 7.2-16 16-16h16c8.8 0 16 7.2 16 16v16c0 8.8-7.2 16-16 16h-16c-8.8 0-16-7.2-16-16v-16zm-32 64h16c8.8 0 16 7.2 16 16v16c0 8.8-7.2 16-16 16h-16c-8.8 0-16-7.2-16-16v-16c0-8.8 7.2-16 16-16zm-32-80c8.8 0 16 7.2 16 16v16c0 8.8-7.2 16-16 16h-16c-8.8 0-16-7.2-16-16v-16c0-8.8 7.2-16 16-16h16zM80 80V48h192v32H80zm40 200h-16c-8.8 0-16-7.2-16-16v-16c0-8.8 7.2-16 16-16h16c8.8 0 16 7.2 16 16v16c0 8.8-7.2 16-16 16zm16 64v-16c0-8.8 7.2-16 16-16h16c8.8 0 16 7.2 16 16v16c0 8.8-7.2 16-16 16h-16c-8.8 0-16-7.2-16-16zm216 112c0 4.4-3.6 8-8 8H168c-4.4 0-8-3.6-8-8v-16c0-4.4 3.6-8 8-8h176c4.4 0 8 3.6 8 8v16zm24-112c0 8.8-7.2 16-16 16h-16c-8.8 0-16-7.2-16-16v-16c0-8.8 7.2-16 16-16h16c8.8 0 16 7.2 16 16v16zm48-80c0 8.8-7.2 16-16 16h-16c-8.8 0-16-7.2-16-16v-16c0-8.8 7.2-16 16-16h16c8.8 0 16 7.2 16 16v16z\"]\n};\nvar faCat = {\n prefix: 'fas',\n iconName: 'cat',\n icon: [512, 512, [], \"f6be\", \"M290.59 192c-20.18 0-106.82 1.98-162.59 85.95V192c0-52.94-43.06-96-96-96-17.67 0-32 14.33-32 32s14.33 32 32 32c17.64 0 32 14.36 32 32v256c0 35.3 28.7 64 64 64h176c8.84 0 16-7.16 16-16v-16c0-17.67-14.33-32-32-32h-32l128-96v144c0 8.84 7.16 16 16 16h32c8.84 0 16-7.16 16-16V289.86c-10.29 2.67-20.89 4.54-32 4.54-61.81 0-113.52-44.05-125.41-102.4zM448 96h-64l-64-64v134.4c0 53.02 42.98 96 96 96s96-42.98 96-96V32l-64 64zm-72 80c-8.84 0-16-7.16-16-16s7.16-16 16-16 16 7.16 16 16-7.16 16-16 16zm80 0c-8.84 0-16-7.16-16-16s7.16-16 16-16 16 7.16 16 16-7.16 16-16 16z\"]\n};\nvar faCertificate = {\n prefix: 'fas',\n iconName: 'certificate',\n icon: [512, 512, [], \"f0a3\", \"M458.622 255.92l45.985-45.005c13.708-12.977 7.316-36.039-10.664-40.339l-62.65-15.99 17.661-62.015c4.991-17.838-11.829-34.663-29.661-29.671l-61.994 17.667-15.984-62.671C337.085.197 313.765-6.276 300.99 7.228L256 53.57 211.011 7.229c-12.63-13.351-36.047-7.234-40.325 10.668l-15.984 62.671-61.995-17.667C74.87 57.907 58.056 74.738 63.046 92.572l17.661 62.015-62.65 15.99C.069 174.878-6.31 197.944 7.392 210.915l45.985 45.005-45.985 45.004c-13.708 12.977-7.316 36.039 10.664 40.339l62.65 15.99-17.661 62.015c-4.991 17.838 11.829 34.663 29.661 29.671l61.994-17.667 15.984 62.671c4.439 18.575 27.696 24.018 40.325 10.668L256 458.61l44.989 46.001c12.5 13.488 35.987 7.486 40.325-10.668l15.984-62.671 61.994 17.667c17.836 4.994 34.651-11.837 29.661-29.671l-17.661-62.015 62.65-15.99c17.987-4.302 24.366-27.367 10.664-40.339l-45.984-45.004z\"]\n};\nvar faChair = {\n prefix: 'fas',\n iconName: 'chair',\n icon: [448, 512, [], \"f6c0\", \"M112 128c0-29.5 16.2-55 40-68.9V256h48V48h48v208h48V59.1c23.8 13.9 40 39.4 40 68.9v128h48V128C384 57.3 326.7 0 256 0h-64C121.3 0 64 57.3 64 128v128h48zm334.3 213.9l-10.7-32c-4.4-13.1-16.6-21.9-30.4-21.9H42.7c-13.8 0-26 8.8-30.4 21.9l-10.7 32C-5.2 362.6 10.2 384 32 384v112c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16V384h256v112c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16V384c21.8 0 37.2-21.4 30.3-42.1z\"]\n};\nvar faChalkboard = {\n prefix: 'fas',\n iconName: 'chalkboard',\n icon: [640, 512, [], \"f51b\", \"M96 64h448v352h64V40c0-22.06-17.94-40-40-40H72C49.94 0 32 17.94 32 40v376h64V64zm528 384H480v-64H288v64H16c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h608c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16z\"]\n};\nvar faChalkboardTeacher = {\n prefix: 'fas',\n iconName: 'chalkboard-teacher',\n icon: [640, 512, [], \"f51c\", \"M208 352c-2.39 0-4.78.35-7.06 1.09C187.98 357.3 174.35 360 160 360c-14.35 0-27.98-2.7-40.95-6.91-2.28-.74-4.66-1.09-7.05-1.09C49.94 352-.33 402.48 0 464.62.14 490.88 21.73 512 48 512h224c26.27 0 47.86-21.12 48-47.38.33-62.14-49.94-112.62-112-112.62zm-48-32c53.02 0 96-42.98 96-96s-42.98-96-96-96-96 42.98-96 96 42.98 96 96 96zM592 0H208c-26.47 0-48 22.25-48 49.59V96c23.42 0 45.1 6.78 64 17.8V64h352v288h-64v-64H384v64h-76.24c19.1 16.69 33.12 38.73 39.69 64H592c26.47 0 48-22.25 48-49.59V49.59C640 22.25 618.47 0 592 0z\"]\n};\nvar faChargingStation = {\n prefix: 'fas',\n iconName: 'charging-station',\n icon: [576, 512, [], \"f5e7\", \"M336 448H16c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h320c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16zm208-320V80c0-8.84-7.16-16-16-16s-16 7.16-16 16v48h-32V80c0-8.84-7.16-16-16-16s-16 7.16-16 16v48h-16c-8.84 0-16 7.16-16 16v32c0 35.76 23.62 65.69 56 75.93v118.49c0 13.95-9.5 26.92-23.26 29.19C431.22 402.5 416 388.99 416 372v-28c0-48.6-39.4-88-88-88h-8V64c0-35.35-28.65-64-64-64H96C60.65 0 32 28.65 32 64v352h288V304h8c22.09 0 40 17.91 40 40v24.61c0 39.67 28.92 75.16 68.41 79.01C481.71 452.05 520 416.41 520 372V251.93c32.38-10.24 56-40.17 56-75.93v-32c0-8.84-7.16-16-16-16h-16zm-283.91 47.76l-93.7 139c-2.2 3.33-6.21 5.24-10.39 5.24-7.67 0-13.47-6.28-11.67-12.92L167.35 224H108c-7.25 0-12.85-5.59-11.89-11.89l16-107C112.9 99.9 117.98 96 124 96h68c7.88 0 13.62 6.54 11.6 13.21L192 160h57.7c9.24 0 15.01 8.78 10.39 15.76z\"]\n};\nvar faChartArea = {\n prefix: 'fas',\n iconName: 'chart-area',\n icon: [512, 512, [], \"f1fe\", \"M500 384c6.6 0 12 5.4 12 12v40c0 6.6-5.4 12-12 12H12c-6.6 0-12-5.4-12-12V76c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v308h436zM372.7 159.5L288 216l-85.3-113.7c-5.1-6.8-15.5-6.3-19.9 1L96 248v104h384l-89.9-187.8c-3.2-6.5-11.4-8.7-17.4-4.7z\"]\n};\nvar faChartBar = {\n prefix: 'fas',\n iconName: 'chart-bar',\n icon: [512, 512, [], \"f080\", \"M332.8 320h38.4c6.4 0 12.8-6.4 12.8-12.8V172.8c0-6.4-6.4-12.8-12.8-12.8h-38.4c-6.4 0-12.8 6.4-12.8 12.8v134.4c0 6.4 6.4 12.8 12.8 12.8zm96 0h38.4c6.4 0 12.8-6.4 12.8-12.8V76.8c0-6.4-6.4-12.8-12.8-12.8h-38.4c-6.4 0-12.8 6.4-12.8 12.8v230.4c0 6.4 6.4 12.8 12.8 12.8zm-288 0h38.4c6.4 0 12.8-6.4 12.8-12.8v-70.4c0-6.4-6.4-12.8-12.8-12.8h-38.4c-6.4 0-12.8 6.4-12.8 12.8v70.4c0 6.4 6.4 12.8 12.8 12.8zm96 0h38.4c6.4 0 12.8-6.4 12.8-12.8V108.8c0-6.4-6.4-12.8-12.8-12.8h-38.4c-6.4 0-12.8 6.4-12.8 12.8v198.4c0 6.4 6.4 12.8 12.8 12.8zM496 384H64V80c0-8.84-7.16-16-16-16H16C7.16 64 0 71.16 0 80v336c0 17.67 14.33 32 32 32h464c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16z\"]\n};\nvar faChartLine = {\n prefix: 'fas',\n iconName: 'chart-line',\n icon: [512, 512, [], \"f201\", \"M496 384H64V80c0-8.84-7.16-16-16-16H16C7.16 64 0 71.16 0 80v336c0 17.67 14.33 32 32 32h464c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16zM464 96H345.94c-21.38 0-32.09 25.85-16.97 40.97l32.4 32.4L288 242.75l-73.37-73.37c-12.5-12.5-32.76-12.5-45.25 0l-68.69 68.69c-6.25 6.25-6.25 16.38 0 22.63l22.62 22.62c6.25 6.25 16.38 6.25 22.63 0L192 237.25l73.37 73.37c12.5 12.5 32.76 12.5 45.25 0l96-96 32.4 32.4c15.12 15.12 40.97 4.41 40.97-16.97V112c.01-8.84-7.15-16-15.99-16z\"]\n};\nvar faChartPie = {\n prefix: 'fas',\n iconName: 'chart-pie',\n icon: [544, 512, [], \"f200\", \"M527.79 288H290.5l158.03 158.03c6.04 6.04 15.98 6.53 22.19.68 38.7-36.46 65.32-85.61 73.13-140.86 1.34-9.46-6.51-17.85-16.06-17.85zm-15.83-64.8C503.72 103.74 408.26 8.28 288.8.04 279.68-.59 272 7.1 272 16.24V240h223.77c9.14 0 16.82-7.68 16.19-16.8zM224 288V50.71c0-9.55-8.39-17.4-17.84-16.06C86.99 51.49-4.1 155.6.14 280.37 4.5 408.51 114.83 513.59 243.03 511.98c50.4-.63 96.97-16.87 135.26-44.03 7.9-5.6 8.42-17.23 1.57-24.08L224 288z\"]\n};\nvar faCheck = {\n prefix: 'fas',\n iconName: 'check',\n icon: [512, 512, [], \"f00c\", \"M173.898 439.404l-166.4-166.4c-9.997-9.997-9.997-26.206 0-36.204l36.203-36.204c9.997-9.998 26.207-9.998 36.204 0L192 312.69 432.095 72.596c9.997-9.997 26.207-9.997 36.204 0l36.203 36.204c9.997 9.997 9.997 26.206 0 36.204l-294.4 294.401c-9.998 9.997-26.207 9.997-36.204-.001z\"]\n};\nvar faCheckCircle = {\n prefix: 'fas',\n iconName: 'check-circle',\n icon: [512, 512, [], \"f058\", \"M504 256c0 136.967-111.033 248-248 248S8 392.967 8 256 119.033 8 256 8s248 111.033 248 248zM227.314 387.314l184-184c6.248-6.248 6.248-16.379 0-22.627l-22.627-22.627c-6.248-6.249-16.379-6.249-22.628 0L216 308.118l-70.059-70.059c-6.248-6.248-16.379-6.248-22.628 0l-22.627 22.627c-6.248 6.248-6.248 16.379 0 22.627l104 104c6.249 6.249 16.379 6.249 22.628.001z\"]\n};\nvar faCheckDouble = {\n prefix: 'fas',\n iconName: 'check-double',\n icon: [512, 512, [], \"f560\", \"M504.5 171.95l-36.2-36.41c-10-10.05-26.21-10.05-36.2 0L192 377.02 79.9 264.28c-10-10.06-26.21-10.06-36.2 0L7.5 300.69c-10 10.05-10 26.36 0 36.41l166.4 167.36c10 10.06 26.21 10.06 36.2 0l294.4-296.09c10-10.06 10-26.36 0-36.42zM166.57 282.71c6.84 7.02 18.18 7.02 25.21.18L403.85 72.62c7.02-6.84 7.02-18.18.18-25.21L362.08 5.29c-6.84-7.02-18.18-7.02-25.21-.18L179.71 161.19l-68.23-68.77c-6.84-7.02-18.18-7.02-25.2-.18l-42.13 41.77c-7.02 6.84-7.02 18.18-.18 25.2l122.6 123.5z\"]\n};\nvar faCheckSquare = {\n prefix: 'fas',\n iconName: 'check-square',\n icon: [448, 512, [], \"f14a\", \"M400 480H48c-26.51 0-48-21.49-48-48V80c0-26.51 21.49-48 48-48h352c26.51 0 48 21.49 48 48v352c0 26.51-21.49 48-48 48zm-204.686-98.059l184-184c6.248-6.248 6.248-16.379 0-22.627l-22.627-22.627c-6.248-6.248-16.379-6.249-22.628 0L184 302.745l-70.059-70.059c-6.248-6.248-16.379-6.248-22.628 0l-22.627 22.627c-6.248 6.248-6.248 16.379 0 22.627l104 104c6.249 6.25 16.379 6.25 22.628.001z\"]\n};\nvar faCheese = {\n prefix: 'fas',\n iconName: 'cheese',\n icon: [512, 512, [], \"f7ef\", \"M0 288v160a32 32 0 0 0 32 32h448a32 32 0 0 0 32-32V288zM299.83 32a32 32 0 0 0-21.13 7L0 256h512c0-119.89-94-217.8-212.17-224z\"]\n};\nvar faChess = {\n prefix: 'fas',\n iconName: 'chess',\n icon: [512, 512, [], \"f439\", \"M76.1 210.2h103.7l34.6-95.1c2.8-7.8-3-16.1-11.3-16.1H152V68.8h21.6c3.3 0 6-2.7 6-6V40.4c0-3.3-2.7-6-6-6h-28.4V6c0-3.3-2.7-6-6-6h-22.4c-3.3 0-6 2.7-6 6v28.4H82.4c-3.3 0-6 2.7-6 6v22.4c0 3.3 2.7 6 6 6H104V99H52.8c-8.3 0-14.1 8.3-11.3 16.1zm237.2 90.7l24.9 17c.1 18.1-.2 63.9-11.9 114.5h147.5c-11.7-50.5-12-96.3-11.9-114.5l24.9-16.9c1.1-.7 1.7-1.9 1.7-3.2v-69.9c0-2.1-1.7-3.9-3.9-3.9h-27.7c-2.1 0-3.9 1.7-3.9 3.9v31.5h-22.7v-31.5c0-2.1-1.7-3.9-3.9-3.9h-52.9c-2.1 0-3.9 1.7-3.9 3.9v31.5h-22.7v-31.5c0-2.1-1.7-3.9-3.9-3.9h-27.7c-2.1 0-3.9 1.7-3.9 3.9v69.9c.2 1.2.8 2.4 1.9 3.1zm71.5 52c0-8.4 6.8-15.2 15.2-15.2s15.2 6.8 15.2 15.2v30.3h-30.3v-30.3zm119.8 117.2L491 459.4v-15.6c0-2.1-1.7-3.9-3.9-3.9H312.9c-2.1 0-3.9 1.7-3.9 3.9v15.6L295.3 470c-.9.7-1.5 1.9-1.5 3v35c0 2.1 1.7 3.9 3.9 3.9h204.5c2.1 0 3.9-1.7 3.9-3.9v-35c0-1.1-.5-2.2-1.5-2.9zm-259.8-10.8l-22.1-14.2V417c0-3.3-2.7-6-6-6H39.3c-3.3 0-6 2.7-6 6v28.1l-22.1 14.2c-1.7 1.1-2.8 3-2.8 5.1V506c0 3.3 2.7 6 6 6h227.2c3.3 0 6-2.7 6-6v-41.6c0-2.1-1-4-2.8-5.1zm-45-208.9c3.3 0 6-2.7 6-6v-20.8c0-3.3-2.7-6-6-6H56.2c-3.3 0-6 2.7-6 6v20.8c0 3.3 2.7 6 6 6H82c0 28.8 2.5 95.1-17.4 153.2h126.8c-19.6-57-17.4-121.5-17.4-153.2z\"]\n};\nvar faChessBishop = {\n prefix: 'fas',\n iconName: 'chess-bishop',\n icon: [320, 512, [], \"f43a\", \"M123.158 77.881C107.369 72.53 96 57.597 96 40c0-22.091 17.909-40 40-40h47.796c22.091 0 40 17.909 40 40 0 17.541-11.295 32.434-27.005 37.829 23.993 16.657 48.577 46.839 68.703 82.05L144.929 280.443a6 6 0 0 0 0 8.485l14.142 14.142a6 6 0 0 0 8.485 0L280.9 189.726c17.758 38.297 29.371 79.443 29.371 114.273 0 53.786-22.897 75.788-58.446 86.033V448H68.174v-57.97C32.631 379.784 9.739 357.781 9.739 304c0-78.029 58.281-187.766 113.419-226.119zM320 500v-24c0-6.627-5.373-12-12-12H12c-6.627 0-12 5.373-12 12v24c0 6.627 5.373 12 12 12h296c6.627 0 12-5.373 12-12z\"]\n};\nvar faChessBoard = {\n prefix: 'fas',\n iconName: 'chess-board',\n icon: [512, 512, [], \"f43c\", \"M192 256v64h64v-64zm320 64v-64h-64v64zM0 192v64h64v-64zm512 0v-64h-64v64zm0 256v-64h-64v64zM256 256h64v-64h-64zM0 512h64v-64H0zm128 0h64v-64h-64zM384 0h-64v64h64zM128 0H64v64h64zm128 512h64v-64h-64zM0 64v64h64V64zm0 256v64h64v-64zM256 0h-64v64h64zm128 512h64v-64h-64zM64 384v64h64v-64zm256 0v64h64v-64zm-64-192v-64h-64v64zm128 192h64v-64h-64zM128 256H64v64h64zm256 0h64v-64h-64zM512 0h-64v64h64zM128 128H64v64h64zm256-64v64h64V64zM192 384v64h64v-64zm-64-64v64h64v-64zm128 0v64h64v-64zm-64-128h-64v64h64zm128-64V64h-64v64zm-128 0V64h-64v64zm128 64h64v-64h-64zm0 128h64v-64h-64z\"]\n};\nvar faChessKing = {\n prefix: 'fas',\n iconName: 'chess-king',\n icon: [448, 512, [], \"f43f\", \"M416 476v24c0 6.627-5.373 12-12 12H44c-6.627 0-12-5.373-12-12v-24c0-6.627 5.373-12 12-12h360c6.627 0 12 5.373 12 12zm-8.033-324H248v-48h50a6 6 0 0 0 6-6V62a6 6 0 0 0-6-6h-50V6a6 6 0 0 0-6-6h-36a6 6 0 0 0-6 6v50h-50a6 6 0 0 0-6 6v36a6 6 0 0 0 6 6h50v48H40.033c-27.574 0-46.879 27.244-37.738 53.259L87.582 448h272.836l85.287-242.741C454.846 179.244 435.541 152 407.967 152z\"]\n};\nvar faChessKnight = {\n prefix: 'fas',\n iconName: 'chess-knight',\n icon: [384, 512, [], \"f441\", \"M352 224v224H32v-46.557c0-30.302 17.12-58.003 44.223-71.554l57.243-28.622A48 48 0 0 0 160 258.334V208l-22.127 11.063a23.996 23.996 0 0 0-12.55 15.645l-11.835 47.338a12 12 0 0 1-7.185 8.231l-29.601 11.84a11.998 11.998 0 0 1-9.33-.176L7.126 275.167A12 12 0 0 1 0 264.201v-158.26c0-6.365 2.529-12.47 7.03-16.971L16 80 1.789 51.578A16.937 16.937 0 0 1 0 44c0-6.627 5.373-12 12-12h148c106.039 0 192 85.961 192 192zm20 240H12c-6.627 0-12 5.373-12 12v24c0 6.627 5.373 12 12 12h360c6.627 0 12-5.373 12-12v-24c0-6.627-5.373-12-12-12zM52 128c-11.046 0-20 8.954-20 20s8.954 20 20 20 20-8.954 20-20-8.954-20-20-20z\"]\n};\nvar faChessPawn = {\n prefix: 'fas',\n iconName: 'chess-pawn',\n icon: [320, 512, [], \"f443\", \"M264 448H56s60-42.743 60-176H84c-6.627 0-12-5.373-12-12v-24c0-6.627 5.373-12 12-12h40.209C95.721 210.56 76 181.588 76 148c0-46.392 37.608-84 84-84s84 37.608 84 84c0 33.588-19.721 62.56-48.209 76H236c6.627 0 12 5.373 12 12v24c0 6.627-5.373 12-12 12h-32c0 133.257 60 176 60 176zm28 16H28c-6.627 0-12 5.373-12 12v24c0 6.627 5.373 12 12 12h264c6.627 0 12-5.373 12-12v-24c0-6.627-5.373-12-12-12z\"]\n};\nvar faChessQueen = {\n prefix: 'fas',\n iconName: 'chess-queen',\n icon: [512, 512, [], \"f445\", \"M436 512H76c-6.627 0-12-5.373-12-12v-24c0-6.627 5.373-12 12-12h360c6.627 0 12 5.373 12 12v24c0 6.627-5.373 12-12 12zM255.579 0c-30.928 0-56 25.072-56 56s25.072 56 56 56 56-25.072 56-56-25.072-56-56-56zm204.568 154.634c-5.768-3.045-12.916-.932-16.082 4.77-8.616 15.516-22.747 37.801-44.065 37.801-28.714 0-30.625-19.804-31.686-57.542-.183-6.492-5.501-11.664-11.995-11.664h-41.006c-5.175 0-9.754 3.328-11.388 8.238-8.89 26.709-26.073 40.992-47.925 40.992s-39.034-14.283-47.925-40.992c-1.634-4.91-6.213-8.238-11.388-8.238h-41.005c-6.495 0-11.813 5.174-11.995 11.667-1.052 37.642-2.934 57.539-31.688 57.539-20.691 0-33.817-20.224-44.425-38.025-3.266-5.48-10.258-7.431-15.899-4.453l-39.179 20.679a12 12 0 0 0-5.51 15.145L112 448h288l105.014-257.448a12 12 0 0 0-5.51-15.145l-39.357-20.773z\"]\n};\nvar faChessRook = {\n prefix: 'fas',\n iconName: 'chess-rook',\n icon: [384, 512, [], \"f447\", \"M81.241 215.027C80.957 258.92 77.411 348.076 48 448h287.982c-29.4-99.604-32.936-188.912-33.221-232.975l45.418-42.312a11.998 11.998 0 0 0 3.82-8.78V44c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v44h-48V44c0-6.627-5.373-12-12-12h-72c-6.627 0-12 5.373-12 12v44H96V44c0-6.627-5.373-12-12-12H44c-6.627 0-12 5.373-12 12v119.932c0 3.33 1.384 6.51 3.82 8.78l45.421 42.315zM160 256c0-17.673 14.327-32 32-32 17.673 0 32 14.327 32 32v64.004h-64V256zm224 220v24c0 6.627-5.373 12-12 12H12c-6.627 0-12-5.373-12-12v-24c0-6.627 5.373-12 12-12h360c6.627 0 12 5.373 12 12z\"]\n};\nvar faChevronCircleDown = {\n prefix: 'fas',\n iconName: 'chevron-circle-down',\n icon: [512, 512, [], \"f13a\", \"M504 256c0 137-111 248-248 248S8 393 8 256 119 8 256 8s248 111 248 248zM273 369.9l135.5-135.5c9.4-9.4 9.4-24.6 0-33.9l-17-17c-9.4-9.4-24.6-9.4-33.9 0L256 285.1 154.4 183.5c-9.4-9.4-24.6-9.4-33.9 0l-17 17c-9.4 9.4-9.4 24.6 0 33.9L239 369.9c9.4 9.4 24.6 9.4 34 0z\"]\n};\nvar faChevronCircleLeft = {\n prefix: 'fas',\n iconName: 'chevron-circle-left',\n icon: [512, 512, [], \"f137\", \"M256 504C119 504 8 393 8 256S119 8 256 8s248 111 248 248-111 248-248 248zM142.1 273l135.5 135.5c9.4 9.4 24.6 9.4 33.9 0l17-17c9.4-9.4 9.4-24.6 0-33.9L226.9 256l101.6-101.6c9.4-9.4 9.4-24.6 0-33.9l-17-17c-9.4-9.4-24.6-9.4-33.9 0L142.1 239c-9.4 9.4-9.4 24.6 0 34z\"]\n};\nvar faChevronCircleRight = {\n prefix: 'fas',\n iconName: 'chevron-circle-right',\n icon: [512, 512, [], \"f138\", \"M256 8c137 0 248 111 248 248S393 504 256 504 8 393 8 256 119 8 256 8zm113.9 231L234.4 103.5c-9.4-9.4-24.6-9.4-33.9 0l-17 17c-9.4 9.4-9.4 24.6 0 33.9L285.1 256 183.5 357.6c-9.4 9.4-9.4 24.6 0 33.9l17 17c9.4 9.4 24.6 9.4 33.9 0L369.9 273c9.4-9.4 9.4-24.6 0-34z\"]\n};\nvar faChevronCircleUp = {\n prefix: 'fas',\n iconName: 'chevron-circle-up',\n icon: [512, 512, [], \"f139\", \"M8 256C8 119 119 8 256 8s248 111 248 248-111 248-248 248S8 393 8 256zm231-113.9L103.5 277.6c-9.4 9.4-9.4 24.6 0 33.9l17 17c9.4 9.4 24.6 9.4 33.9 0L256 226.9l101.6 101.6c9.4 9.4 24.6 9.4 33.9 0l17-17c9.4-9.4 9.4-24.6 0-33.9L273 142.1c-9.4-9.4-24.6-9.4-34 0z\"]\n};\nvar faChevronDown = {\n prefix: 'fas',\n iconName: 'chevron-down',\n icon: [448, 512, [], \"f078\", \"M207.029 381.476L12.686 187.132c-9.373-9.373-9.373-24.569 0-33.941l22.667-22.667c9.357-9.357 24.522-9.375 33.901-.04L224 284.505l154.745-154.021c9.379-9.335 24.544-9.317 33.901.04l22.667 22.667c9.373 9.373 9.373 24.569 0 33.941L240.971 381.476c-9.373 9.372-24.569 9.372-33.942 0z\"]\n};\nvar faChevronLeft = {\n prefix: 'fas',\n iconName: 'chevron-left',\n icon: [320, 512, [], \"f053\", \"M34.52 239.03L228.87 44.69c9.37-9.37 24.57-9.37 33.94 0l22.67 22.67c9.36 9.36 9.37 24.52.04 33.9L131.49 256l154.02 154.75c9.34 9.38 9.32 24.54-.04 33.9l-22.67 22.67c-9.37 9.37-24.57 9.37-33.94 0L34.52 272.97c-9.37-9.37-9.37-24.57 0-33.94z\"]\n};\nvar faChevronRight = {\n prefix: 'fas',\n iconName: 'chevron-right',\n icon: [320, 512, [], \"f054\", \"M285.476 272.971L91.132 467.314c-9.373 9.373-24.569 9.373-33.941 0l-22.667-22.667c-9.357-9.357-9.375-24.522-.04-33.901L188.505 256 34.484 101.255c-9.335-9.379-9.317-24.544.04-33.901l22.667-22.667c9.373-9.373 24.569-9.373 33.941 0L285.475 239.03c9.373 9.372 9.373 24.568.001 33.941z\"]\n};\nvar faChevronUp = {\n prefix: 'fas',\n iconName: 'chevron-up',\n icon: [448, 512, [], \"f077\", \"M240.971 130.524l194.343 194.343c9.373 9.373 9.373 24.569 0 33.941l-22.667 22.667c-9.357 9.357-24.522 9.375-33.901.04L224 227.495 69.255 381.516c-9.379 9.335-24.544 9.317-33.901-.04l-22.667-22.667c-9.373-9.373-9.373-24.569 0-33.941L207.03 130.525c9.372-9.373 24.568-9.373 33.941-.001z\"]\n};\nvar faChild = {\n prefix: 'fas',\n iconName: 'child',\n icon: [384, 512, [], \"f1ae\", \"M120 72c0-39.765 32.235-72 72-72s72 32.235 72 72c0 39.764-32.235 72-72 72s-72-32.236-72-72zm254.627 1.373c-12.496-12.497-32.758-12.497-45.254 0L242.745 160H141.254L54.627 73.373c-12.496-12.497-32.758-12.497-45.254 0-12.497 12.497-12.497 32.758 0 45.255L104 213.254V480c0 17.673 14.327 32 32 32h16c17.673 0 32-14.327 32-32V368h16v112c0 17.673 14.327 32 32 32h16c17.673 0 32-14.327 32-32V213.254l94.627-94.627c12.497-12.497 12.497-32.757 0-45.254z\"]\n};\nvar faChurch = {\n prefix: 'fas',\n iconName: 'church',\n icon: [640, 512, [], \"f51d\", \"M464.46 246.68L352 179.2V128h48c8.84 0 16-7.16 16-16V80c0-8.84-7.16-16-16-16h-48V16c0-8.84-7.16-16-16-16h-32c-8.84 0-16 7.16-16 16v48h-48c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h48v51.2l-112.46 67.48A31.997 31.997 0 0 0 160 274.12V512h96v-96c0-35.35 28.65-64 64-64s64 28.65 64 64v96h96V274.12c0-11.24-5.9-21.66-15.54-27.44zM0 395.96V496c0 8.84 7.16 16 16 16h112V320L19.39 366.54A32.024 32.024 0 0 0 0 395.96zm620.61-29.42L512 320v192h112c8.84 0 16-7.16 16-16V395.96c0-12.8-7.63-24.37-19.39-29.42z\"]\n};\nvar faCircle = {\n prefix: 'fas',\n iconName: 'circle',\n icon: [512, 512, [], \"f111\", \"M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8z\"]\n};\nvar faCircleNotch = {\n prefix: 'fas',\n iconName: 'circle-notch',\n icon: [512, 512, [], \"f1ce\", \"M288 39.056v16.659c0 10.804 7.281 20.159 17.686 23.066C383.204 100.434 440 171.518 440 256c0 101.689-82.295 184-184 184-101.689 0-184-82.295-184-184 0-84.47 56.786-155.564 134.312-177.219C216.719 75.874 224 66.517 224 55.712V39.064c0-15.709-14.834-27.153-30.046-23.234C86.603 43.482 7.394 141.206 8.003 257.332c.72 137.052 111.477 246.956 248.531 246.667C393.255 503.711 504 392.788 504 256c0-115.633-79.14-212.779-186.211-240.236C302.678 11.889 288 23.456 288 39.056z\"]\n};\nvar faCity = {\n prefix: 'fas',\n iconName: 'city',\n icon: [640, 512, [], \"f64f\", \"M616 192H480V24c0-13.26-10.74-24-24-24H312c-13.26 0-24 10.74-24 24v72h-64V16c0-8.84-7.16-16-16-16h-16c-8.84 0-16 7.16-16 16v80h-64V16c0-8.84-7.16-16-16-16H80c-8.84 0-16 7.16-16 16v80H24c-13.26 0-24 10.74-24 24v360c0 17.67 14.33 32 32 32h576c17.67 0 32-14.33 32-32V216c0-13.26-10.75-24-24-24zM128 404c0 6.63-5.37 12-12 12H76c-6.63 0-12-5.37-12-12v-40c0-6.63 5.37-12 12-12h40c6.63 0 12 5.37 12 12v40zm0-96c0 6.63-5.37 12-12 12H76c-6.63 0-12-5.37-12-12v-40c0-6.63 5.37-12 12-12h40c6.63 0 12 5.37 12 12v40zm0-96c0 6.63-5.37 12-12 12H76c-6.63 0-12-5.37-12-12v-40c0-6.63 5.37-12 12-12h40c6.63 0 12 5.37 12 12v40zm128 192c0 6.63-5.37 12-12 12h-40c-6.63 0-12-5.37-12-12v-40c0-6.63 5.37-12 12-12h40c6.63 0 12 5.37 12 12v40zm0-96c0 6.63-5.37 12-12 12h-40c-6.63 0-12-5.37-12-12v-40c0-6.63 5.37-12 12-12h40c6.63 0 12 5.37 12 12v40zm0-96c0 6.63-5.37 12-12 12h-40c-6.63 0-12-5.37-12-12v-40c0-6.63 5.37-12 12-12h40c6.63 0 12 5.37 12 12v40zm160 96c0 6.63-5.37 12-12 12h-40c-6.63 0-12-5.37-12-12v-40c0-6.63 5.37-12 12-12h40c6.63 0 12 5.37 12 12v40zm0-96c0 6.63-5.37 12-12 12h-40c-6.63 0-12-5.37-12-12v-40c0-6.63 5.37-12 12-12h40c6.63 0 12 5.37 12 12v40zm0-96c0 6.63-5.37 12-12 12h-40c-6.63 0-12-5.37-12-12V76c0-6.63 5.37-12 12-12h40c6.63 0 12 5.37 12 12v40zm160 288c0 6.63-5.37 12-12 12h-40c-6.63 0-12-5.37-12-12v-40c0-6.63 5.37-12 12-12h40c6.63 0 12 5.37 12 12v40zm0-96c0 6.63-5.37 12-12 12h-40c-6.63 0-12-5.37-12-12v-40c0-6.63 5.37-12 12-12h40c6.63 0 12 5.37 12 12v40z\"]\n};\nvar faClinicMedical = {\n prefix: 'fas',\n iconName: 'clinic-medical',\n icon: [576, 512, [], \"f7f2\", \"M288 115L69.47 307.71c-1.62 1.46-3.69 2.14-5.47 3.35V496a16 16 0 0 0 16 16h416a16 16 0 0 0 16-16V311.1c-1.7-1.16-3.72-1.82-5.26-3.2zm96 261a8 8 0 0 1-8 8h-56v56a8 8 0 0 1-8 8h-48a8 8 0 0 1-8-8v-56h-56a8 8 0 0 1-8-8v-48a8 8 0 0 1 8-8h56v-56a8 8 0 0 1 8-8h48a8 8 0 0 1 8 8v56h56a8 8 0 0 1 8 8zm186.69-139.72l-255.94-226a39.85 39.85 0 0 0-53.45 0l-256 226a16 16 0 0 0-1.21 22.6L25.5 282.7a16 16 0 0 0 22.6 1.21L277.42 81.63a16 16 0 0 1 21.17 0L527.91 283.9a16 16 0 0 0 22.6-1.21l21.4-23.82a16 16 0 0 0-1.22-22.59z\"]\n};\nvar faClipboard = {\n prefix: 'fas',\n iconName: 'clipboard',\n icon: [384, 512, [], \"f328\", \"M384 112v352c0 26.51-21.49 48-48 48H48c-26.51 0-48-21.49-48-48V112c0-26.51 21.49-48 48-48h80c0-35.29 28.71-64 64-64s64 28.71 64 64h80c26.51 0 48 21.49 48 48zM192 40c-13.255 0-24 10.745-24 24s10.745 24 24 24 24-10.745 24-24-10.745-24-24-24m96 114v-20a6 6 0 0 0-6-6H102a6 6 0 0 0-6 6v20a6 6 0 0 0 6 6h180a6 6 0 0 0 6-6z\"]\n};\nvar faClipboardCheck = {\n prefix: 'fas',\n iconName: 'clipboard-check',\n icon: [384, 512, [], \"f46c\", \"M336 64h-80c0-35.3-28.7-64-64-64s-64 28.7-64 64H48C21.5 64 0 85.5 0 112v352c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V112c0-26.5-21.5-48-48-48zM192 40c13.3 0 24 10.7 24 24s-10.7 24-24 24-24-10.7-24-24 10.7-24 24-24zm121.2 231.8l-143 141.8c-4.7 4.7-12.3 4.6-17-.1l-82.6-83.3c-4.7-4.7-4.6-12.3.1-17L99.1 285c4.7-4.7 12.3-4.6 17 .1l46 46.4 106-105.2c4.7-4.7 12.3-4.6 17 .1l28.2 28.4c4.7 4.8 4.6 12.3-.1 17z\"]\n};\nvar faClipboardList = {\n prefix: 'fas',\n iconName: 'clipboard-list',\n icon: [384, 512, [], \"f46d\", \"M336 64h-80c0-35.3-28.7-64-64-64s-64 28.7-64 64H48C21.5 64 0 85.5 0 112v352c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V112c0-26.5-21.5-48-48-48zM96 424c-13.3 0-24-10.7-24-24s10.7-24 24-24 24 10.7 24 24-10.7 24-24 24zm0-96c-13.3 0-24-10.7-24-24s10.7-24 24-24 24 10.7 24 24-10.7 24-24 24zm0-96c-13.3 0-24-10.7-24-24s10.7-24 24-24 24 10.7 24 24-10.7 24-24 24zm96-192c13.3 0 24 10.7 24 24s-10.7 24-24 24-24-10.7-24-24 10.7-24 24-24zm128 368c0 4.4-3.6 8-8 8H168c-4.4 0-8-3.6-8-8v-16c0-4.4 3.6-8 8-8h144c4.4 0 8 3.6 8 8v16zm0-96c0 4.4-3.6 8-8 8H168c-4.4 0-8-3.6-8-8v-16c0-4.4 3.6-8 8-8h144c4.4 0 8 3.6 8 8v16zm0-96c0 4.4-3.6 8-8 8H168c-4.4 0-8-3.6-8-8v-16c0-4.4 3.6-8 8-8h144c4.4 0 8 3.6 8 8v16z\"]\n};\nvar faClock = {\n prefix: 'fas',\n iconName: 'clock',\n icon: [512, 512, [], \"f017\", \"M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm57.1 350.1L224.9 294c-3.1-2.3-4.9-5.9-4.9-9.7V116c0-6.6 5.4-12 12-12h48c6.6 0 12 5.4 12 12v137.7l63.5 46.2c5.4 3.9 6.5 11.4 2.6 16.8l-28.2 38.8c-3.9 5.3-11.4 6.5-16.8 2.6z\"]\n};\nvar faClone = {\n prefix: 'fas',\n iconName: 'clone',\n icon: [512, 512, [], \"f24d\", \"M464 0c26.51 0 48 21.49 48 48v288c0 26.51-21.49 48-48 48H176c-26.51 0-48-21.49-48-48V48c0-26.51 21.49-48 48-48h288M176 416c-44.112 0-80-35.888-80-80V128H48c-26.51 0-48 21.49-48 48v288c0 26.51 21.49 48 48 48h288c26.51 0 48-21.49 48-48v-48H176z\"]\n};\nvar faClosedCaptioning = {\n prefix: 'fas',\n iconName: 'closed-captioning',\n icon: [512, 512, [], \"f20a\", \"M464 64H48C21.5 64 0 85.5 0 112v288c0 26.5 21.5 48 48 48h416c26.5 0 48-21.5 48-48V112c0-26.5-21.5-48-48-48zM218.1 287.7c2.8-2.5 7.1-2.1 9.2.9l19.5 27.7c1.7 2.4 1.5 5.6-.5 7.7-53.6 56.8-172.8 32.1-172.8-67.9 0-97.3 121.7-119.5 172.5-70.1 2.1 2 2.5 3.2 1 5.7l-17.5 30.5c-1.9 3.1-6.2 4-9.1 1.7-40.8-32-94.6-14.9-94.6 31.2.1 48 51.1 70.5 92.3 32.6zm190.4 0c2.8-2.5 7.1-2.1 9.2.9l19.5 27.7c1.7 2.4 1.5 5.6-.5 7.7-53.5 56.9-172.7 32.1-172.7-67.9 0-97.3 121.7-119.5 172.5-70.1 2.1 2 2.5 3.2 1 5.7L420 222.2c-1.9 3.1-6.2 4-9.1 1.7-40.8-32-94.6-14.9-94.6 31.2 0 48 51 70.5 92.2 32.6z\"]\n};\nvar faCloud = {\n prefix: 'fas',\n iconName: 'cloud',\n icon: [640, 512, [], \"f0c2\", \"M537.6 226.6c4.1-10.7 6.4-22.4 6.4-34.6 0-53-43-96-96-96-19.7 0-38.1 6-53.3 16.2C367 64.2 315.3 32 256 32c-88.4 0-160 71.6-160 160 0 2.7.1 5.4.2 8.1C40.2 219.8 0 273.2 0 336c0 79.5 64.5 144 144 144h368c70.7 0 128-57.3 128-128 0-61.9-44-113.6-102.4-125.4z\"]\n};\nvar faCloudDownloadAlt = {\n prefix: 'fas',\n iconName: 'cloud-download-alt',\n icon: [640, 512, [], \"f381\", \"M537.6 226.6c4.1-10.7 6.4-22.4 6.4-34.6 0-53-43-96-96-96-19.7 0-38.1 6-53.3 16.2C367 64.2 315.3 32 256 32c-88.4 0-160 71.6-160 160 0 2.7.1 5.4.2 8.1C40.2 219.8 0 273.2 0 336c0 79.5 64.5 144 144 144h368c70.7 0 128-57.3 128-128 0-61.9-44-113.6-102.4-125.4zm-132.9 88.7L299.3 420.7c-6.2 6.2-16.4 6.2-22.6 0L171.3 315.3c-10.1-10.1-2.9-27.3 11.3-27.3H248V176c0-8.8 7.2-16 16-16h48c8.8 0 16 7.2 16 16v112h65.4c14.2 0 21.4 17.2 11.3 27.3z\"]\n};\nvar faCloudMeatball = {\n prefix: 'fas',\n iconName: 'cloud-meatball',\n icon: [512, 512, [], \"f73b\", \"M48 352c-26.5 0-48 21.5-48 48s21.5 48 48 48 48-21.5 48-48-21.5-48-48-48zm416 0c-26.5 0-48 21.5-48 48s21.5 48 48 48 48-21.5 48-48-21.5-48-48-48zm-119 11.1c4.6-14.5 1.6-30.8-9.8-42.3-11.5-11.5-27.8-14.4-42.3-9.9-7-13.5-20.7-23-36.9-23s-29.9 9.5-36.9 23c-14.5-4.6-30.8-1.6-42.3 9.9-11.5 11.5-14.4 27.8-9.9 42.3-13.5 7-23 20.7-23 36.9s9.5 29.9 23 36.9c-4.6 14.5-1.6 30.8 9.9 42.3 8.2 8.2 18.9 12.3 29.7 12.3 4.3 0 8.5-1.1 12.6-2.5 7 13.5 20.7 23 36.9 23s29.9-9.5 36.9-23c4.1 1.3 8.3 2.5 12.6 2.5 10.8 0 21.5-4.1 29.7-12.3 11.5-11.5 14.4-27.8 9.8-42.3 13.5-7 23-20.7 23-36.9s-9.5-29.9-23-36.9zM512 224c0-53-43-96-96-96-.6 0-1.1.2-1.6.2 1.1-5.2 1.6-10.6 1.6-16.2 0-44.2-35.8-80-80-80-24.6 0-46.3 11.3-61 28.8C256.4 24.8 219.3 0 176 0 114.1 0 64 50.1 64 112c0 7.3.8 14.3 2.1 21.2C27.8 145.8 0 181.5 0 224c0 53 43 96 96 96h43.4c3.6-8 8.4-15.4 14.8-21.8 13.5-13.5 31.5-21.1 50.8-21.3 13.5-13.2 31.7-20.9 51-20.9s37.5 7.7 51 20.9c19.3.2 37.3 7.8 50.8 21.3 6.4 6.4 11.3 13.8 14.8 21.8H416c53 0 96-43 96-96z\"]\n};\nvar faCloudMoon = {\n prefix: 'fas',\n iconName: 'cloud-moon',\n icon: [576, 512, [], \"f6c3\", \"M342.8 352.7c5.7-9.6 9.2-20.7 9.2-32.7 0-35.3-28.7-64-64-64-17.2 0-32.8 6.9-44.3 17.9-16.3-29.6-47.5-49.9-83.7-49.9-53 0-96 43-96 96 0 2 .5 3.8.6 5.7C27.1 338.8 0 374.1 0 416c0 53 43 96 96 96h240c44.2 0 80-35.8 80-80 0-41.9-32.3-75.8-73.2-79.3zm222.5-54.3c-93.1 17.7-178.5-53.7-178.5-147.7 0-54.2 29-104 76.1-130.8 7.3-4.1 5.4-15.1-2.8-16.7C448.4 1.1 436.7 0 425 0 319.1 0 233.1 85.9 233.1 192c0 8.5.7 16.8 1.8 25 5.9 4.3 11.6 8.9 16.7 14.2 11.4-4.7 23.7-7.2 36.4-7.2 52.9 0 96 43.1 96 96 0 3.6-.2 7.2-.6 10.7 23.6 10.8 42.4 29.5 53.5 52.6 54.4-3.4 103.7-29.3 137.1-70.4 5.3-6.5-.5-16.1-8.7-14.5z\"]\n};\nvar faCloudMoonRain = {\n prefix: 'fas',\n iconName: 'cloud-moon-rain',\n icon: [576, 512, [], \"f73c\", \"M350.5 225.5c-6.9-37.2-39.3-65.5-78.5-65.5-12.3 0-23.9 3-34.3 8-17.4-24.1-45.6-40-77.7-40-53 0-96 43-96 96 0 .5.2 1.1.2 1.6C27.6 232.9 0 265.2 0 304c0 44.2 35.8 80 80 80h256c44.2 0 80-35.8 80-80 0-39.2-28.2-71.7-65.5-78.5zm217.4-1.7c-70.4 13.3-135-40.3-135-110.8 0-40.6 21.9-78 57.5-98.1 5.5-3.1 4.1-11.4-2.1-12.5C479.6.8 470.7 0 461.8 0c-77.9 0-141.1 61.2-144.4 137.9 26.7 11.9 48.2 33.8 58.9 61.7 37.1 14.3 64 47.4 70.2 86.8 5.1.5 10 1.5 15.2 1.5 44.7 0 85.6-20.2 112.6-53.3 4.2-4.8-.2-12-6.4-10.8zM364.5 418.1c-7.6-4.3-17.4-1.8-21.8 6l-36.6 64c-4.4 7.7-1.7 17.4 6 21.8 2.5 1.4 5.2 2.1 7.9 2.1 5.5 0 10.9-2.9 13.9-8.1l36.6-64c4.3-7.7 1.7-17.4-6-21.8zm-96 0c-7.6-4.3-17.4-1.8-21.8 6l-36.6 64c-4.4 7.7-1.7 17.4 6 21.8 2.5 1.4 5.2 2.1 7.9 2.1 5.5 0 10.9-2.9 13.9-8.1l36.6-64c4.3-7.7 1.7-17.4-6-21.8zm-96 0c-7.6-4.3-17.4-1.8-21.8 6l-36.6 64c-4.4 7.7-1.7 17.4 6 21.8 2.5 1.4 5.2 2.1 7.9 2.1 5.5 0 10.9-2.9 13.9-8.1l36.6-64c4.3-7.7 1.7-17.4-6-21.8zm-96 0c-7.6-4.3-17.4-1.8-21.8 6l-36.6 64c-4.4 7.7-1.7 17.4 6 21.8 2.5 1.4 5.2 2.1 7.9 2.1 5.5 0 10.9-2.9 13.9-8.1l36.6-64c4.3-7.7 1.7-17.4-6-21.8z\"]\n};\nvar faCloudRain = {\n prefix: 'fas',\n iconName: 'cloud-rain',\n icon: [512, 512, [], \"f73d\", \"M416 128c-.6 0-1.1.2-1.6.2 1.1-5.2 1.6-10.6 1.6-16.2 0-44.2-35.8-80-80-80-24.6 0-46.3 11.3-61 28.8C256.4 24.8 219.3 0 176 0 114.1 0 64 50.1 64 112c0 7.3.8 14.3 2.1 21.2C27.8 145.8 0 181.5 0 224c0 53 43 96 96 96h320c53 0 96-43 96-96s-43-96-96-96zM88 374.2c-12.8 44.4-40 56.4-40 87.7 0 27.7 21.5 50.1 48 50.1s48-22.4 48-50.1c0-31.4-27.2-43.1-40-87.7-2.2-8.1-13.5-8.5-16 0zm160 0c-12.8 44.4-40 56.4-40 87.7 0 27.7 21.5 50.1 48 50.1s48-22.4 48-50.1c0-31.4-27.2-43.1-40-87.7-2.2-8.1-13.5-8.5-16 0zm160 0c-12.8 44.4-40 56.4-40 87.7 0 27.7 21.5 50.1 48 50.1s48-22.4 48-50.1c0-31.4-27.2-43.1-40-87.7-2.2-8.1-13.5-8.5-16 0z\"]\n};\nvar faCloudShowersHeavy = {\n prefix: 'fas',\n iconName: 'cloud-showers-heavy',\n icon: [512, 512, [], \"f740\", \"M183.9 370.1c-7.6-4.4-17.4-1.8-21.8 6l-64 112c-4.4 7.7-1.7 17.5 6 21.8 2.5 1.4 5.2 2.1 7.9 2.1 5.5 0 10.9-2.9 13.9-8.1l64-112c4.4-7.6 1.7-17.4-6-21.8zm96 0c-7.6-4.4-17.4-1.8-21.8 6l-64 112c-4.4 7.7-1.7 17.5 6 21.8 2.5 1.4 5.2 2.1 7.9 2.1 5.5 0 10.9-2.9 13.9-8.1l64-112c4.4-7.6 1.7-17.4-6-21.8zm-192 0c-7.6-4.4-17.4-1.8-21.8 6l-64 112c-4.4 7.7-1.7 17.5 6 21.8 2.5 1.4 5.2 2.1 7.9 2.1 5.5 0 10.9-2.9 13.9-8.1l64-112c4.4-7.6 1.7-17.4-6-21.8zm384 0c-7.6-4.4-17.4-1.8-21.8 6l-64 112c-4.4 7.7-1.7 17.5 6 21.8 2.5 1.4 5.2 2.1 7.9 2.1 5.5 0 10.9-2.9 13.9-8.1l64-112c4.4-7.6 1.7-17.4-6-21.8zm-96 0c-7.6-4.4-17.4-1.8-21.8 6l-64 112c-4.4 7.7-1.7 17.5 6 21.8 2.5 1.4 5.2 2.1 7.9 2.1 5.5 0 10.9-2.9 13.9-8.1l64-112c4.4-7.6 1.7-17.4-6-21.8zM416 128c-.6 0-1.1.2-1.6.2 1.1-5.2 1.6-10.6 1.6-16.2 0-44.2-35.8-80-80-80-24.6 0-46.3 11.3-61 28.8C256.4 24.8 219.3 0 176 0 114.2 0 64 50.1 64 112c0 7.3.8 14.3 2.1 21.2C27.8 145.8 0 181.5 0 224c0 53 43 96 96 96h320c53 0 96-43 96-96s-43-96-96-96z\"]\n};\nvar faCloudSun = {\n prefix: 'fas',\n iconName: 'cloud-sun',\n icon: [640, 512, [], \"f6c4\", \"M575.2 325.7c.2-1.9.8-3.7.8-5.6 0-35.3-28.7-64-64-64-12.6 0-24.2 3.8-34.1 10-17.6-38.8-56.5-66-101.9-66-61.8 0-112 50.1-112 112 0 3 .7 5.8.9 8.7-49.6 3.7-88.9 44.7-88.9 95.3 0 53 43 96 96 96h272c53 0 96-43 96-96 0-42.1-27.2-77.4-64.8-90.4zm-430.4-22.6c-43.7-43.7-43.7-114.7 0-158.3 43.7-43.7 114.7-43.7 158.4 0 9.7 9.7 16.9 20.9 22.3 32.7 9.8-3.7 20.1-6 30.7-7.5L386 81.1c4-11.9-7.3-23.1-19.2-19.2L279 91.2 237.5 8.4C232-2.8 216-2.8 210.4 8.4L169 91.2 81.1 61.9C69.3 58 58 69.3 61.9 81.1l29.3 87.8-82.8 41.5c-11.2 5.6-11.2 21.5 0 27.1l82.8 41.4-29.3 87.8c-4 11.9 7.3 23.1 19.2 19.2l76.1-25.3c6.1-12.4 14-23.7 23.6-33.5-13.1-5.4-25.4-13.4-36-24zm-4.8-79.2c0 40.8 29.3 74.8 67.9 82.3 8-4.7 16.3-8.8 25.2-11.7 5.4-44.3 31-82.5 67.4-105C287.3 160.4 258 140 224 140c-46.3 0-84 37.6-84 83.9z\"]\n};\nvar faCloudSunRain = {\n prefix: 'fas',\n iconName: 'cloud-sun-rain',\n icon: [576, 512, [], \"f743\", \"M510.5 225.5c-6.9-37.2-39.3-65.5-78.5-65.5-12.3 0-23.9 3-34.3 8-17.4-24.1-45.6-40-77.7-40-53 0-96 43-96 96 0 .5.2 1.1.2 1.6C187.6 233 160 265.2 160 304c0 44.2 35.8 80 80 80h256c44.2 0 80-35.8 80-80 0-39.2-28.2-71.7-65.5-78.5zm-386.4 34.4c-37.4-37.4-37.4-98.3 0-135.8 34.6-34.6 89.1-36.8 126.7-7.4 20-12.9 43.6-20.7 69.2-20.7.7 0 1.3.2 2 .2l8.9-26.7c3.4-10.2-6.3-19.8-16.5-16.4l-75.3 25.1-35.5-71c-4.8-9.6-18.5-9.6-23.3 0l-35.5 71-75.3-25.1c-10.2-3.4-19.8 6.3-16.4 16.5l25.1 75.3-71 35.5c-9.6 4.8-9.6 18.5 0 23.3l71 35.5-25.1 75.3c-3.4 10.2 6.3 19.8 16.5 16.5l59.2-19.7c-.2-2.4-.7-4.7-.7-7.2 0-12.5 2.3-24.5 6.2-35.9-3.6-2.7-7.1-5.2-10.2-8.3zm69.8-58c4.3-24.5 15.8-46.4 31.9-64-9.8-6.2-21.4-9.9-33.8-9.9-35.3 0-64 28.7-64 64 0 18.7 8.2 35.4 21.1 47.1 11.3-15.9 26.6-28.9 44.8-37.2zm330.6 216.2c-7.6-4.3-17.4-1.8-21.8 6l-36.6 64c-4.4 7.7-1.7 17.4 6 21.8 2.5 1.4 5.2 2.1 7.9 2.1 5.5 0 10.9-2.9 13.9-8.1l36.6-64c4.3-7.7 1.7-17.4-6-21.8zm-96 0c-7.6-4.3-17.4-1.8-21.8 6l-36.6 64c-4.4 7.7-1.7 17.4 6 21.8 2.5 1.4 5.2 2.1 7.9 2.1 5.5 0 10.9-2.9 13.9-8.1l36.6-64c4.3-7.7 1.7-17.4-6-21.8zm-96 0c-7.6-4.3-17.4-1.8-21.8 6l-36.6 64c-4.4 7.7-1.7 17.4 6 21.8 2.5 1.4 5.2 2.1 7.9 2.1 5.5 0 10.9-2.9 13.9-8.1l36.6-64c4.3-7.7 1.7-17.4-6-21.8zm-96 0c-7.6-4.3-17.4-1.8-21.8 6l-36.6 64c-4.4 7.7-1.7 17.4 6 21.8 2.5 1.4 5.2 2.1 7.9 2.1 5.5 0 10.9-2.9 13.9-8.1l36.6-64c4.3-7.7 1.7-17.4-6-21.8z\"]\n};\nvar faCloudUploadAlt = {\n prefix: 'fas',\n iconName: 'cloud-upload-alt',\n icon: [640, 512, [], \"f382\", \"M537.6 226.6c4.1-10.7 6.4-22.4 6.4-34.6 0-53-43-96-96-96-19.7 0-38.1 6-53.3 16.2C367 64.2 315.3 32 256 32c-88.4 0-160 71.6-160 160 0 2.7.1 5.4.2 8.1C40.2 219.8 0 273.2 0 336c0 79.5 64.5 144 144 144h368c70.7 0 128-57.3 128-128 0-61.9-44-113.6-102.4-125.4zM393.4 288H328v112c0 8.8-7.2 16-16 16h-48c-8.8 0-16-7.2-16-16V288h-65.4c-14.3 0-21.4-17.2-11.3-27.3l105.4-105.4c6.2-6.2 16.4-6.2 22.6 0l105.4 105.4c10.1 10.1 2.9 27.3-11.3 27.3z\"]\n};\nvar faCocktail = {\n prefix: 'fas',\n iconName: 'cocktail',\n icon: [576, 512, [], \"f561\", \"M296 464h-56V338.78l168.74-168.73c15.52-15.52 4.53-42.05-17.42-42.05H24.68c-21.95 0-32.94 26.53-17.42 42.05L176 338.78V464h-56c-22.09 0-40 17.91-40 40 0 4.42 3.58 8 8 8h240c4.42 0 8-3.58 8-8 0-22.09-17.91-40-40-40zM432 0c-62.61 0-115.35 40.2-135.18 96h52.54c16.65-28.55 47.27-48 82.64-48 52.93 0 96 43.06 96 96s-43.07 96-96 96c-14.04 0-27.29-3.2-39.32-8.64l-35.26 35.26C379.23 279.92 404.59 288 432 288c79.53 0 144-64.47 144-144S511.53 0 432 0z\"]\n};\nvar faCode = {\n prefix: 'fas',\n iconName: 'code',\n icon: [640, 512, [], \"f121\", \"M278.9 511.5l-61-17.7c-6.4-1.8-10-8.5-8.2-14.9L346.2 8.7c1.8-6.4 8.5-10 14.9-8.2l61 17.7c6.4 1.8 10 8.5 8.2 14.9L293.8 503.3c-1.9 6.4-8.5 10.1-14.9 8.2zm-114-112.2l43.5-46.4c4.6-4.9 4.3-12.7-.8-17.2L117 256l90.6-79.7c5.1-4.5 5.5-12.3.8-17.2l-43.5-46.4c-4.5-4.8-12.1-5.1-17-.5L3.8 247.2c-5.1 4.7-5.1 12.8 0 17.5l144.1 135.1c4.9 4.6 12.5 4.4 17-.5zm327.2.6l144.1-135.1c5.1-4.7 5.1-12.8 0-17.5L492.1 112.1c-4.8-4.5-12.4-4.3-17 .5L431.6 159c-4.6 4.9-4.3 12.7.8 17.2L523 256l-90.6 79.7c-5.1 4.5-5.5 12.3-.8 17.2l43.5 46.4c4.5 4.9 12.1 5.1 17 .6z\"]\n};\nvar faCodeBranch = {\n prefix: 'fas',\n iconName: 'code-branch',\n icon: [384, 512, [], \"f126\", \"M384 144c0-44.2-35.8-80-80-80s-80 35.8-80 80c0 36.4 24.3 67.1 57.5 76.8-.6 16.1-4.2 28.5-11 36.9-15.4 19.2-49.3 22.4-85.2 25.7-28.2 2.6-57.4 5.4-81.3 16.9v-144c32.5-10.2 56-40.5 56-76.3 0-44.2-35.8-80-80-80S0 35.8 0 80c0 35.8 23.5 66.1 56 76.3v199.3C23.5 365.9 0 396.2 0 432c0 44.2 35.8 80 80 80s80-35.8 80-80c0-34-21.2-63.1-51.2-74.6 3.1-5.2 7.8-9.8 14.9-13.4 16.2-8.2 40.4-10.4 66.1-12.8 42.2-3.9 90-8.4 118.2-43.4 14-17.4 21.1-39.8 21.6-67.9 31.6-10.8 54.4-40.7 54.4-75.9zM80 64c8.8 0 16 7.2 16 16s-7.2 16-16 16-16-7.2-16-16 7.2-16 16-16zm0 384c-8.8 0-16-7.2-16-16s7.2-16 16-16 16 7.2 16 16-7.2 16-16 16zm224-320c8.8 0 16 7.2 16 16s-7.2 16-16 16-16-7.2-16-16 7.2-16 16-16z\"]\n};\nvar faCoffee = {\n prefix: 'fas',\n iconName: 'coffee',\n icon: [640, 512, [], \"f0f4\", \"M192 384h192c53 0 96-43 96-96h32c70.6 0 128-57.4 128-128S582.6 32 512 32H120c-13.3 0-24 10.7-24 24v232c0 53 43 96 96 96zM512 96c35.3 0 64 28.7 64 64s-28.7 64-64 64h-32V96h32zm47.7 384H48.3c-47.6 0-61-64-36-64h583.3c25 0 11.8 64-35.9 64z\"]\n};\nvar faCog = {\n prefix: 'fas',\n iconName: 'cog',\n icon: [512, 512, [], \"f013\", \"M487.4 315.7l-42.6-24.6c4.3-23.2 4.3-47 0-70.2l42.6-24.6c4.9-2.8 7.1-8.6 5.5-14-11.1-35.6-30-67.8-54.7-94.6-3.8-4.1-10-5.1-14.8-2.3L380.8 110c-17.9-15.4-38.5-27.3-60.8-35.1V25.8c0-5.6-3.9-10.5-9.4-11.7-36.7-8.2-74.3-7.8-109.2 0-5.5 1.2-9.4 6.1-9.4 11.7V75c-22.2 7.9-42.8 19.8-60.8 35.1L88.7 85.5c-4.9-2.8-11-1.9-14.8 2.3-24.7 26.7-43.6 58.9-54.7 94.6-1.7 5.4.6 11.2 5.5 14L67.3 221c-4.3 23.2-4.3 47 0 70.2l-42.6 24.6c-4.9 2.8-7.1 8.6-5.5 14 11.1 35.6 30 67.8 54.7 94.6 3.8 4.1 10 5.1 14.8 2.3l42.6-24.6c17.9 15.4 38.5 27.3 60.8 35.1v49.2c0 5.6 3.9 10.5 9.4 11.7 36.7 8.2 74.3 7.8 109.2 0 5.5-1.2 9.4-6.1 9.4-11.7v-49.2c22.2-7.9 42.8-19.8 60.8-35.1l42.6 24.6c4.9 2.8 11 1.9 14.8-2.3 24.7-26.7 43.6-58.9 54.7-94.6 1.5-5.5-.7-11.3-5.6-14.1zM256 336c-44.1 0-80-35.9-80-80s35.9-80 80-80 80 35.9 80 80-35.9 80-80 80z\"]\n};\nvar faCogs = {\n prefix: 'fas',\n iconName: 'cogs',\n icon: [640, 512, [], \"f085\", \"M512.1 191l-8.2 14.3c-3 5.3-9.4 7.5-15.1 5.4-11.8-4.4-22.6-10.7-32.1-18.6-4.6-3.8-5.8-10.5-2.8-15.7l8.2-14.3c-6.9-8-12.3-17.3-15.9-27.4h-16.5c-6 0-11.2-4.3-12.2-10.3-2-12-2.1-24.6 0-37.1 1-6 6.2-10.4 12.2-10.4h16.5c3.6-10.1 9-19.4 15.9-27.4l-8.2-14.3c-3-5.2-1.9-11.9 2.8-15.7 9.5-7.9 20.4-14.2 32.1-18.6 5.7-2.1 12.1.1 15.1 5.4l8.2 14.3c10.5-1.9 21.2-1.9 31.7 0L552 6.3c3-5.3 9.4-7.5 15.1-5.4 11.8 4.4 22.6 10.7 32.1 18.6 4.6 3.8 5.8 10.5 2.8 15.7l-8.2 14.3c6.9 8 12.3 17.3 15.9 27.4h16.5c6 0 11.2 4.3 12.2 10.3 2 12 2.1 24.6 0 37.1-1 6-6.2 10.4-12.2 10.4h-16.5c-3.6 10.1-9 19.4-15.9 27.4l8.2 14.3c3 5.2 1.9 11.9-2.8 15.7-9.5 7.9-20.4 14.2-32.1 18.6-5.7 2.1-12.1-.1-15.1-5.4l-8.2-14.3c-10.4 1.9-21.2 1.9-31.7 0zm-10.5-58.8c38.5 29.6 82.4-14.3 52.8-52.8-38.5-29.7-82.4 14.3-52.8 52.8zM386.3 286.1l33.7 16.8c10.1 5.8 14.5 18.1 10.5 29.1-8.9 24.2-26.4 46.4-42.6 65.8-7.4 8.9-20.2 11.1-30.3 5.3l-29.1-16.8c-16 13.7-34.6 24.6-54.9 31.7v33.6c0 11.6-8.3 21.6-19.7 23.6-24.6 4.2-50.4 4.4-75.9 0-11.5-2-20-11.9-20-23.6V418c-20.3-7.2-38.9-18-54.9-31.7L74 403c-10 5.8-22.9 3.6-30.3-5.3-16.2-19.4-33.3-41.6-42.2-65.7-4-10.9.4-23.2 10.5-29.1l33.3-16.8c-3.9-20.9-3.9-42.4 0-63.4L12 205.8c-10.1-5.8-14.6-18.1-10.5-29 8.9-24.2 26-46.4 42.2-65.8 7.4-8.9 20.2-11.1 30.3-5.3l29.1 16.8c16-13.7 34.6-24.6 54.9-31.7V57.1c0-11.5 8.2-21.5 19.6-23.5 24.6-4.2 50.5-4.4 76-.1 11.5 2 20 11.9 20 23.6v33.6c20.3 7.2 38.9 18 54.9 31.7l29.1-16.8c10-5.8 22.9-3.6 30.3 5.3 16.2 19.4 33.2 41.6 42.1 65.8 4 10.9.1 23.2-10 29.1l-33.7 16.8c3.9 21 3.9 42.5 0 63.5zm-117.6 21.1c59.2-77-28.7-164.9-105.7-105.7-59.2 77 28.7 164.9 105.7 105.7zm243.4 182.7l-8.2 14.3c-3 5.3-9.4 7.5-15.1 5.4-11.8-4.4-22.6-10.7-32.1-18.6-4.6-3.8-5.8-10.5-2.8-15.7l8.2-14.3c-6.9-8-12.3-17.3-15.9-27.4h-16.5c-6 0-11.2-4.3-12.2-10.3-2-12-2.1-24.6 0-37.1 1-6 6.2-10.4 12.2-10.4h16.5c3.6-10.1 9-19.4 15.9-27.4l-8.2-14.3c-3-5.2-1.9-11.9 2.8-15.7 9.5-7.9 20.4-14.2 32.1-18.6 5.7-2.1 12.1.1 15.1 5.4l8.2 14.3c10.5-1.9 21.2-1.9 31.7 0l8.2-14.3c3-5.3 9.4-7.5 15.1-5.4 11.8 4.4 22.6 10.7 32.1 18.6 4.6 3.8 5.8 10.5 2.8 15.7l-8.2 14.3c6.9 8 12.3 17.3 15.9 27.4h16.5c6 0 11.2 4.3 12.2 10.3 2 12 2.1 24.6 0 37.1-1 6-6.2 10.4-12.2 10.4h-16.5c-3.6 10.1-9 19.4-15.9 27.4l8.2 14.3c3 5.2 1.9 11.9-2.8 15.7-9.5 7.9-20.4 14.2-32.1 18.6-5.7 2.1-12.1-.1-15.1-5.4l-8.2-14.3c-10.4 1.9-21.2 1.9-31.7 0zM501.6 431c38.5 29.6 82.4-14.3 52.8-52.8-38.5-29.6-82.4 14.3-52.8 52.8z\"]\n};\nvar faCoins = {\n prefix: 'fas',\n iconName: 'coins',\n icon: [512, 512, [], \"f51e\", \"M0 405.3V448c0 35.3 86 64 192 64s192-28.7 192-64v-42.7C342.7 434.4 267.2 448 192 448S41.3 434.4 0 405.3zM320 128c106 0 192-28.7 192-64S426 0 320 0 128 28.7 128 64s86 64 192 64zM0 300.4V352c0 35.3 86 64 192 64s192-28.7 192-64v-51.6c-41.3 34-116.9 51.6-192 51.6S41.3 334.4 0 300.4zm416 11c57.3-11.1 96-31.7 96-55.4v-42.7c-23.2 16.4-57.3 27.6-96 34.5v63.6zM192 160C86 160 0 195.8 0 240s86 80 192 80 192-35.8 192-80-86-80-192-80zm219.3 56.3c60-10.8 100.7-32 100.7-56.3v-42.7c-35.5 25.1-96.5 38.6-160.7 41.8 29.5 14.3 51.2 33.5 60 57.2z\"]\n};\nvar faColumns = {\n prefix: 'fas',\n iconName: 'columns',\n icon: [512, 512, [], \"f0db\", \"M464 32H48C21.49 32 0 53.49 0 80v352c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48V80c0-26.51-21.49-48-48-48zM224 416H64V160h160v256zm224 0H288V160h160v256z\"]\n};\nvar faComment = {\n prefix: 'fas',\n iconName: 'comment',\n icon: [512, 512, [], \"f075\", \"M256 32C114.6 32 0 125.1 0 240c0 49.6 21.4 95 57 130.7C44.5 421.1 2.7 466 2.2 466.5c-2.2 2.3-2.8 5.7-1.5 8.7S4.8 480 8 480c66.3 0 116-31.8 140.6-51.4 32.7 12.3 69 19.4 107.4 19.4 141.4 0 256-93.1 256-208S397.4 32 256 32z\"]\n};\nvar faCommentAlt = {\n prefix: 'fas',\n iconName: 'comment-alt',\n icon: [512, 512, [], \"f27a\", \"M448 0H64C28.7 0 0 28.7 0 64v288c0 35.3 28.7 64 64 64h96v84c0 9.8 11.2 15.5 19.1 9.7L304 416h144c35.3 0 64-28.7 64-64V64c0-35.3-28.7-64-64-64z\"]\n};\nvar faCommentDollar = {\n prefix: 'fas',\n iconName: 'comment-dollar',\n icon: [512, 512, [], \"f651\", \"M256 32C114.62 32 0 125.12 0 240c0 49.56 21.41 95.01 57.02 130.74C44.46 421.05 2.7 465.97 2.2 466.5A7.995 7.995 0 0 0 8 480c66.26 0 115.99-31.75 140.6-51.38C181.29 440.93 217.59 448 256 448c141.38 0 256-93.12 256-208S397.38 32 256 32zm24 302.44V352c0 8.84-7.16 16-16 16h-16c-8.84 0-16-7.16-16-16v-17.73c-11.42-1.35-22.28-5.19-31.78-11.46-6.22-4.11-6.82-13.11-1.55-18.38l17.52-17.52c3.74-3.74 9.31-4.24 14.11-2.03 3.18 1.46 6.66 2.22 10.26 2.22h32.78c4.66 0 8.44-3.78 8.44-8.42 0-3.75-2.52-7.08-6.12-8.11l-50.07-14.3c-22.25-6.35-40.01-24.71-42.91-47.67-4.05-32.07 19.03-59.43 49.32-63.05V128c0-8.84 7.16-16 16-16h16c8.84 0 16 7.16 16 16v17.73c11.42 1.35 22.28 5.19 31.78 11.46 6.22 4.11 6.82 13.11 1.55 18.38l-17.52 17.52c-3.74 3.74-9.31 4.24-14.11 2.03a24.516 24.516 0 0 0-10.26-2.22h-32.78c-4.66 0-8.44 3.78-8.44 8.42 0 3.75 2.52 7.08 6.12 8.11l50.07 14.3c22.25 6.36 40.01 24.71 42.91 47.67 4.05 32.06-19.03 59.42-49.32 63.04z\"]\n};\nvar faCommentDots = {\n prefix: 'fas',\n iconName: 'comment-dots',\n icon: [512, 512, [], \"f4ad\", \"M256 32C114.6 32 0 125.1 0 240c0 49.6 21.4 95 57 130.7C44.5 421.1 2.7 466 2.2 466.5c-2.2 2.3-2.8 5.7-1.5 8.7S4.8 480 8 480c66.3 0 116-31.8 140.6-51.4 32.7 12.3 69 19.4 107.4 19.4 141.4 0 256-93.1 256-208S397.4 32 256 32zM128 272c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32zm128 0c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32zm128 0c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32z\"]\n};\nvar faCommentMedical = {\n prefix: 'fas',\n iconName: 'comment-medical',\n icon: [512, 512, [], \"f7f5\", \"M256 32C114.62 32 0 125.12 0 240c0 49.56 21.41 95 57 130.74C44.46 421.05 2.7 466 2.2 466.5A8 8 0 0 0 8 480c66.26 0 116-31.75 140.6-51.38A304.66 304.66 0 0 0 256 448c141.39 0 256-93.12 256-208S397.39 32 256 32zm96 232a8 8 0 0 1-8 8h-56v56a8 8 0 0 1-8 8h-48a8 8 0 0 1-8-8v-56h-56a8 8 0 0 1-8-8v-48a8 8 0 0 1 8-8h56v-56a8 8 0 0 1 8-8h48a8 8 0 0 1 8 8v56h56a8 8 0 0 1 8 8z\"]\n};\nvar faCommentSlash = {\n prefix: 'fas',\n iconName: 'comment-slash',\n icon: [640, 512, [], \"f4b3\", \"M64 240c0 49.6 21.4 95 57 130.7-12.6 50.3-54.3 95.2-54.8 95.8-2.2 2.3-2.8 5.7-1.5 8.7 1.3 2.9 4.1 4.8 7.3 4.8 66.3 0 116-31.8 140.6-51.4 32.7 12.3 69 19.4 107.4 19.4 27.4 0 53.7-3.6 78.4-10L72.9 186.4c-5.6 17.1-8.9 35-8.9 53.6zm569.8 218.1l-114.4-88.4C554.6 334.1 576 289.2 576 240c0-114.9-114.6-208-256-208-65.1 0-124.2 20.1-169.4 52.7L45.5 3.4C38.5-2 28.5-.8 23 6.2L3.4 31.4c-5.4 7-4.2 17 2.8 22.4l588.4 454.7c7 5.4 17 4.2 22.5-2.8l19.6-25.3c5.4-6.8 4.1-16.9-2.9-22.3z\"]\n};\nvar faComments = {\n prefix: 'fas',\n iconName: 'comments',\n icon: [576, 512, [], \"f086\", \"M416 192c0-88.4-93.1-160-208-160S0 103.6 0 192c0 34.3 14.1 65.9 38 92-13.4 30.2-35.5 54.2-35.8 54.5-2.2 2.3-2.8 5.7-1.5 8.7S4.8 352 8 352c36.6 0 66.9-12.3 88.7-25 32.2 15.7 70.3 25 111.3 25 114.9 0 208-71.6 208-160zm122 220c23.9-26 38-57.7 38-92 0-66.9-53.5-124.2-129.3-148.1.9 6.6 1.3 13.3 1.3 20.1 0 105.9-107.7 192-240 192-10.8 0-21.3-.8-31.7-1.9C207.8 439.6 281.8 480 368 480c41 0 79.1-9.2 111.3-25 21.8 12.7 52.1 25 88.7 25 3.2 0 6.1-1.9 7.3-4.8 1.3-2.9.7-6.3-1.5-8.7-.3-.3-22.4-24.2-35.8-54.5z\"]\n};\nvar faCommentsDollar = {\n prefix: 'fas',\n iconName: 'comments-dollar',\n icon: [576, 512, [], \"f653\", \"M416 192c0-88.37-93.12-160-208-160S0 103.63 0 192c0 34.27 14.13 65.95 37.97 91.98C24.61 314.22 2.52 338.16 2.2 338.5A7.995 7.995 0 0 0 8 352c36.58 0 66.93-12.25 88.73-24.98C128.93 342.76 167.02 352 208 352c114.88 0 208-71.63 208-160zm-224 96v-16.29c-11.29-.58-22.27-4.52-31.37-11.35-3.9-2.93-4.1-8.77-.57-12.14l11.75-11.21c2.77-2.64 6.89-2.76 10.13-.73 3.87 2.42 8.26 3.72 12.82 3.72h28.11c6.5 0 11.8-5.92 11.8-13.19 0-5.95-3.61-11.19-8.77-12.73l-45-13.5c-18.59-5.58-31.58-23.42-31.58-43.39 0-24.52 19.05-44.44 42.67-45.07V96c0-4.42 3.58-8 8-8h16c4.42 0 8 3.58 8 8v16.29c11.29.58 22.27 4.51 31.37 11.35 3.9 2.93 4.1 8.77.57 12.14l-11.75 11.21c-2.77 2.64-6.89 2.76-10.13.73-3.87-2.43-8.26-3.72-12.82-3.72h-28.11c-6.5 0-11.8 5.92-11.8 13.19 0 5.95 3.61 11.19 8.77 12.73l45 13.5c18.59 5.58 31.58 23.42 31.58 43.39 0 24.53-19.05 44.44-42.67 45.07V288c0 4.42-3.58 8-8 8h-16c-4.42 0-8-3.58-8-8zm346.01 123.99C561.87 385.96 576 354.27 576 320c0-66.94-53.49-124.2-129.33-148.07.86 6.6 1.33 13.29 1.33 20.07 0 105.87-107.66 192-240 192-10.78 0-21.32-.77-31.73-1.88C207.8 439.63 281.77 480 368 480c40.98 0 79.07-9.24 111.27-24.98C501.07 467.75 531.42 480 568 480c3.2 0 6.09-1.91 7.34-4.84 1.27-2.94.66-6.34-1.55-8.67-.31-.33-22.42-24.24-35.78-54.5z\"]\n};\nvar faCompactDisc = {\n prefix: 'fas',\n iconName: 'compact-disc',\n icon: [496, 512, [], \"f51f\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zM88 256H56c0-105.9 86.1-192 192-192v32c-88.2 0-160 71.8-160 160zm160 96c-53 0-96-43-96-96s43-96 96-96 96 43 96 96-43 96-96 96zm0-128c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32z\"]\n};\nvar faCompass = {\n prefix: 'fas',\n iconName: 'compass',\n icon: [496, 512, [], \"f14e\", \"M225.38 233.37c-12.5 12.5-12.5 32.76 0 45.25 12.49 12.5 32.76 12.5 45.25 0 12.5-12.5 12.5-32.76 0-45.25-12.5-12.49-32.76-12.49-45.25 0zM248 8C111.03 8 0 119.03 0 256s111.03 248 248 248 248-111.03 248-248S384.97 8 248 8zm126.14 148.05L308.17 300.4a31.938 31.938 0 0 1-15.77 15.77l-144.34 65.97c-16.65 7.61-33.81-9.55-26.2-26.2l65.98-144.35a31.938 31.938 0 0 1 15.77-15.77l144.34-65.97c16.65-7.6 33.8 9.55 26.19 26.2z\"]\n};\nvar faCompress = {\n prefix: 'fas',\n iconName: 'compress',\n icon: [448, 512, [], \"f066\", \"M436 192H312c-13.3 0-24-10.7-24-24V44c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v84h84c6.6 0 12 5.4 12 12v40c0 6.6-5.4 12-12 12zm-276-24V44c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v84H12c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h124c13.3 0 24-10.7 24-24zm0 300V344c0-13.3-10.7-24-24-24H12c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h84v84c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12zm192 0v-84h84c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12H312c-13.3 0-24 10.7-24 24v124c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12z\"]\n};\nvar faCompressArrowsAlt = {\n prefix: 'fas',\n iconName: 'compress-arrows-alt',\n icon: [512, 512, [], \"f78c\", \"M200 288H88c-21.4 0-32.1 25.8-17 41l32.9 31-99.2 99.3c-6.2 6.2-6.2 16.4 0 22.6l25.4 25.4c6.2 6.2 16.4 6.2 22.6 0L152 408l31.1 33c15.1 15.1 40.9 4.4 40.9-17V312c0-13.3-10.7-24-24-24zm112-64h112c21.4 0 32.1-25.9 17-41l-33-31 99.3-99.3c6.2-6.2 6.2-16.4 0-22.6L481.9 4.7c-6.2-6.2-16.4-6.2-22.6 0L360 104l-31.1-33C313.8 55.9 288 66.6 288 88v112c0 13.3 10.7 24 24 24zm96 136l33-31.1c15.1-15.1 4.4-40.9-17-40.9H312c-13.3 0-24 10.7-24 24v112c0 21.4 25.9 32.1 41 17l31-32.9 99.3 99.3c6.2 6.2 16.4 6.2 22.6 0l25.4-25.4c6.2-6.2 6.2-16.4 0-22.6L408 360zM183 71.1L152 104 52.7 4.7c-6.2-6.2-16.4-6.2-22.6 0L4.7 30.1c-6.2 6.2-6.2 16.4 0 22.6L104 152l-33 31.1C55.9 198.2 66.6 224 88 224h112c13.3 0 24-10.7 24-24V88c0-21.3-25.9-32-41-16.9z\"]\n};\nvar faConciergeBell = {\n prefix: 'fas',\n iconName: 'concierge-bell',\n icon: [512, 512, [], \"f562\", \"M288 130.54V112h16c8.84 0 16-7.16 16-16V80c0-8.84-7.16-16-16-16h-96c-8.84 0-16 7.16-16 16v16c0 8.84 7.16 16 16 16h16v18.54C115.49 146.11 32 239.18 32 352h448c0-112.82-83.49-205.89-192-221.46zM496 384H16c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h480c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16z\"]\n};\nvar faCookie = {\n prefix: 'fas',\n iconName: 'cookie',\n icon: [512, 512, [], \"f563\", \"M510.37 254.79l-12.08-76.26a132.493 132.493 0 0 0-37.16-72.95l-54.76-54.75c-19.73-19.72-45.18-32.7-72.71-37.05l-76.7-12.15c-27.51-4.36-55.69.11-80.52 12.76L107.32 49.6a132.25 132.25 0 0 0-57.79 57.8l-35.1 68.88a132.602 132.602 0 0 0-12.82 80.94l12.08 76.27a132.493 132.493 0 0 0 37.16 72.95l54.76 54.75a132.087 132.087 0 0 0 72.71 37.05l76.7 12.14c27.51 4.36 55.69-.11 80.52-12.75l69.12-35.21a132.302 132.302 0 0 0 57.79-57.8l35.1-68.87c12.71-24.96 17.2-53.3 12.82-80.96zM176 368c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm32-160c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm160 128c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32z\"]\n};\nvar faCookieBite = {\n prefix: 'fas',\n iconName: 'cookie-bite',\n icon: [512, 512, [], \"f564\", \"M510.52 255.82c-69.97-.85-126.47-57.69-126.47-127.86-70.17 0-127-56.49-127.86-126.45-27.26-4.14-55.13.3-79.72 12.82l-69.13 35.22a132.221 132.221 0 0 0-57.79 57.81l-35.1 68.88a132.645 132.645 0 0 0-12.82 80.95l12.08 76.27a132.521 132.521 0 0 0 37.16 72.96l54.77 54.76a132.036 132.036 0 0 0 72.71 37.06l76.71 12.15c27.51 4.36 55.7-.11 80.53-12.76l69.13-35.21a132.273 132.273 0 0 0 57.79-57.81l35.1-68.88c12.56-24.64 17.01-52.58 12.91-79.91zM176 368c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm32-160c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm160 128c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32z\"]\n};\nvar faCopy = {\n prefix: 'fas',\n iconName: 'copy',\n icon: [448, 512, [], \"f0c5\", \"M320 448v40c0 13.255-10.745 24-24 24H24c-13.255 0-24-10.745-24-24V120c0-13.255 10.745-24 24-24h72v296c0 30.879 25.121 56 56 56h168zm0-344V0H152c-13.255 0-24 10.745-24 24v368c0 13.255 10.745 24 24 24h272c13.255 0 24-10.745 24-24V128H344c-13.2 0-24-10.8-24-24zm120.971-31.029L375.029 7.029A24 24 0 0 0 358.059 0H352v96h96v-6.059a24 24 0 0 0-7.029-16.97z\"]\n};\nvar faCopyright = {\n prefix: 'fas',\n iconName: 'copyright',\n icon: [512, 512, [], \"f1f9\", \"M256 8C119.033 8 8 119.033 8 256s111.033 248 248 248 248-111.033 248-248S392.967 8 256 8zm117.134 346.753c-1.592 1.867-39.776 45.731-109.851 45.731-84.692 0-144.484-63.26-144.484-145.567 0-81.303 62.004-143.401 143.762-143.401 66.957 0 101.965 37.315 103.422 38.904a12 12 0 0 1 1.238 14.623l-22.38 34.655c-4.049 6.267-12.774 7.351-18.234 2.295-.233-.214-26.529-23.88-61.88-23.88-46.116 0-73.916 33.575-73.916 76.082 0 39.602 25.514 79.692 74.277 79.692 38.697 0 65.28-28.338 65.544-28.625 5.132-5.565 14.059-5.033 18.508 1.053l24.547 33.572a12.001 12.001 0 0 1-.553 14.866z\"]\n};\nvar faCouch = {\n prefix: 'fas',\n iconName: 'couch',\n icon: [640, 512, [], \"f4b8\", \"M160 224v64h320v-64c0-35.3 28.7-64 64-64h32c0-53-43-96-96-96H160c-53 0-96 43-96 96h32c35.3 0 64 28.7 64 64zm416-32h-32c-17.7 0-32 14.3-32 32v96H128v-96c0-17.7-14.3-32-32-32H64c-35.3 0-64 28.7-64 64 0 23.6 13 44 32 55.1V432c0 8.8 7.2 16 16 16h64c8.8 0 16-7.2 16-16v-16h384v16c0 8.8 7.2 16 16 16h64c8.8 0 16-7.2 16-16V311.1c19-11.1 32-31.5 32-55.1 0-35.3-28.7-64-64-64z\"]\n};\nvar faCreditCard = {\n prefix: 'fas',\n iconName: 'credit-card',\n icon: [576, 512, [], \"f09d\", \"M0 432c0 26.5 21.5 48 48 48h480c26.5 0 48-21.5 48-48V256H0v176zm192-68c0-6.6 5.4-12 12-12h136c6.6 0 12 5.4 12 12v40c0 6.6-5.4 12-12 12H204c-6.6 0-12-5.4-12-12v-40zm-128 0c0-6.6 5.4-12 12-12h72c6.6 0 12 5.4 12 12v40c0 6.6-5.4 12-12 12H76c-6.6 0-12-5.4-12-12v-40zM576 80v48H0V80c0-26.5 21.5-48 48-48h480c26.5 0 48 21.5 48 48z\"]\n};\nvar faCrop = {\n prefix: 'fas',\n iconName: 'crop',\n icon: [512, 512, [], \"f125\", \"M488 352h-40V109.25l59.31-59.31c6.25-6.25 6.25-16.38 0-22.63L484.69 4.69c-6.25-6.25-16.38-6.25-22.63 0L402.75 64H192v96h114.75L160 306.75V24c0-13.26-10.75-24-24-24H88C74.75 0 64 10.74 64 24v40H24C10.75 64 0 74.74 0 88v48c0 13.25 10.75 24 24 24h40v264c0 13.25 10.75 24 24 24h232v-96H205.25L352 205.25V488c0 13.25 10.75 24 24 24h48c13.25 0 24-10.75 24-24v-40h40c13.25 0 24-10.75 24-24v-48c0-13.26-10.75-24-24-24z\"]\n};\nvar faCropAlt = {\n prefix: 'fas',\n iconName: 'crop-alt',\n icon: [512, 512, [], \"f565\", \"M488 352h-40V96c0-17.67-14.33-32-32-32H192v96h160v328c0 13.25 10.75 24 24 24h48c13.25 0 24-10.75 24-24v-40h40c13.25 0 24-10.75 24-24v-48c0-13.26-10.75-24-24-24zM160 24c0-13.26-10.75-24-24-24H88C74.75 0 64 10.74 64 24v40H24C10.75 64 0 74.74 0 88v48c0 13.25 10.75 24 24 24h40v256c0 17.67 14.33 32 32 32h224v-96H160V24z\"]\n};\nvar faCross = {\n prefix: 'fas',\n iconName: 'cross',\n icon: [384, 512, [], \"f654\", \"M352 128h-96V32c0-17.67-14.33-32-32-32h-64c-17.67 0-32 14.33-32 32v96H32c-17.67 0-32 14.33-32 32v64c0 17.67 14.33 32 32 32h96v224c0 17.67 14.33 32 32 32h64c17.67 0 32-14.33 32-32V256h96c17.67 0 32-14.33 32-32v-64c0-17.67-14.33-32-32-32z\"]\n};\nvar faCrosshairs = {\n prefix: 'fas',\n iconName: 'crosshairs',\n icon: [512, 512, [], \"f05b\", \"M500 224h-30.364C455.724 130.325 381.675 56.276 288 42.364V12c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v30.364C130.325 56.276 56.276 130.325 42.364 224H12c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h30.364C56.276 381.675 130.325 455.724 224 469.636V500c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12v-30.364C381.675 455.724 455.724 381.675 469.636 288H500c6.627 0 12-5.373 12-12v-40c0-6.627-5.373-12-12-12zM288 404.634V364c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40.634C165.826 392.232 119.783 346.243 107.366 288H148c6.627 0 12-5.373 12-12v-40c0-6.627-5.373-12-12-12h-40.634C119.768 165.826 165.757 119.783 224 107.366V148c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12v-40.634C346.174 119.768 392.217 165.757 404.634 224H364c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40.634C392.232 346.174 346.243 392.217 288 404.634zM288 256c0 17.673-14.327 32-32 32s-32-14.327-32-32c0-17.673 14.327-32 32-32s32 14.327 32 32z\"]\n};\nvar faCrow = {\n prefix: 'fas',\n iconName: 'crow',\n icon: [640, 512, [], \"f520\", \"M544 32h-16.36C513.04 12.68 490.09 0 464 0c-44.18 0-80 35.82-80 80v20.98L12.09 393.57A30.216 30.216 0 0 0 0 417.74c0 22.46 23.64 37.07 43.73 27.03L165.27 384h96.49l44.41 120.1c2.27 6.23 9.15 9.44 15.38 7.17l22.55-8.21c6.23-2.27 9.44-9.15 7.17-15.38L312.94 384H352c1.91 0 3.76-.23 5.66-.29l44.51 120.38c2.27 6.23 9.15 9.44 15.38 7.17l22.55-8.21c6.23-2.27 9.44-9.15 7.17-15.38l-41.24-111.53C485.74 352.8 544 279.26 544 192v-80l96-16c0-35.35-42.98-64-96-64zm-80 72c-13.25 0-24-10.75-24-24 0-13.26 10.75-24 24-24s24 10.74 24 24c0 13.25-10.75 24-24 24z\"]\n};\nvar faCrown = {\n prefix: 'fas',\n iconName: 'crown',\n icon: [640, 512, [], \"f521\", \"M528 448H112c-8.8 0-16 7.2-16 16v32c0 8.8 7.2 16 16 16h416c8.8 0 16-7.2 16-16v-32c0-8.8-7.2-16-16-16zm64-320c-26.5 0-48 21.5-48 48 0 7.1 1.6 13.7 4.4 19.8L476 239.2c-15.4 9.2-35.3 4-44.2-11.6L350.3 85C361 76.2 368 63 368 48c0-26.5-21.5-48-48-48s-48 21.5-48 48c0 15 7 28.2 17.7 37l-81.5 142.6c-8.9 15.6-28.9 20.8-44.2 11.6l-72.3-43.4c2.7-6 4.4-12.7 4.4-19.8 0-26.5-21.5-48-48-48S0 149.5 0 176s21.5 48 48 48c2.6 0 5.2-.4 7.7-.8L128 416h384l72.3-192.8c2.5.4 5.1.8 7.7.8 26.5 0 48-21.5 48-48s-21.5-48-48-48z\"]\n};\nvar faCrutch = {\n prefix: 'fas',\n iconName: 'crutch',\n icon: [512, 512, [], \"f7f7\", \"M507.31 185.71l-181-181a16 16 0 0 0-22.62 0L281 27.31a16 16 0 0 0 0 22.63l181 181a16 16 0 0 0 22.63 0l22.62-22.63a16 16 0 0 0 .06-22.6zm-179.54 66.41l-67.89-67.89 55.1-55.1-45.25-45.25-109.67 109.67a96.08 96.08 0 0 0-25.67 46.29L106.65 360.1l-102 102a16 16 0 0 0 0 22.63l22.62 22.62a16 16 0 0 0 22.63 0l102-102 120.25-27.75a95.88 95.88 0 0 0 46.29-25.65l109.68-109.68L382.87 197zm-54.57 54.57a32 32 0 0 1-15.45 8.54l-79.3 18.32 18.3-79.3a32.22 32.22 0 0 1 8.56-15.45l9.31-9.31 67.89 67.89z\"]\n};\nvar faCube = {\n prefix: 'fas',\n iconName: 'cube',\n icon: [512, 512, [], \"f1b2\", \"M239.1 6.3l-208 78c-18.7 7-31.1 25-31.1 45v225.1c0 18.2 10.3 34.8 26.5 42.9l208 104c13.5 6.8 29.4 6.8 42.9 0l208-104c16.3-8.1 26.5-24.8 26.5-42.9V129.3c0-20-12.4-37.9-31.1-44.9l-208-78C262 2.2 250 2.2 239.1 6.3zM256 68.4l192 72v1.1l-192 78-192-78v-1.1l192-72zm32 356V275.5l160-65v133.9l-160 80z\"]\n};\nvar faCubes = {\n prefix: 'fas',\n iconName: 'cubes',\n icon: [512, 512, [], \"f1b3\", \"M488.6 250.2L392 214V105.5c0-15-9.3-28.4-23.4-33.7l-100-37.5c-8.1-3.1-17.1-3.1-25.3 0l-100 37.5c-14.1 5.3-23.4 18.7-23.4 33.7V214l-96.6 36.2C9.3 255.5 0 268.9 0 283.9V394c0 13.6 7.7 26.1 19.9 32.2l100 50c10.1 5.1 22.1 5.1 32.2 0l103.9-52 103.9 52c10.1 5.1 22.1 5.1 32.2 0l100-50c12.2-6.1 19.9-18.6 19.9-32.2V283.9c0-15-9.3-28.4-23.4-33.7zM358 214.8l-85 31.9v-68.2l85-37v73.3zM154 104.1l102-38.2 102 38.2v.6l-102 41.4-102-41.4v-.6zm84 291.1l-85 42.5v-79.1l85-38.8v75.4zm0-112l-102 41.4-102-41.4v-.6l102-38.2 102 38.2v.6zm240 112l-85 42.5v-79.1l85-38.8v75.4zm0-112l-102 41.4-102-41.4v-.6l102-38.2 102 38.2v.6z\"]\n};\nvar faCut = {\n prefix: 'fas',\n iconName: 'cut',\n icon: [448, 512, [], \"f0c4\", \"M278.06 256L444.48 89.57c4.69-4.69 4.69-12.29 0-16.97-32.8-32.8-85.99-32.8-118.79 0L210.18 188.12l-24.86-24.86c4.31-10.92 6.68-22.81 6.68-35.26 0-53.02-42.98-96-96-96S0 74.98 0 128s42.98 96 96 96c4.54 0 8.99-.32 13.36-.93L142.29 256l-32.93 32.93c-4.37-.61-8.83-.93-13.36-.93-53.02 0-96 42.98-96 96s42.98 96 96 96 96-42.98 96-96c0-12.45-2.37-24.34-6.68-35.26l24.86-24.86L325.69 439.4c32.8 32.8 85.99 32.8 118.79 0 4.69-4.68 4.69-12.28 0-16.97L278.06 256zM96 160c-17.64 0-32-14.36-32-32s14.36-32 32-32 32 14.36 32 32-14.36 32-32 32zm0 256c-17.64 0-32-14.36-32-32s14.36-32 32-32 32 14.36 32 32-14.36 32-32 32z\"]\n};\nvar faDatabase = {\n prefix: 'fas',\n iconName: 'database',\n icon: [448, 512, [], \"f1c0\", \"M448 73.143v45.714C448 159.143 347.667 192 224 192S0 159.143 0 118.857V73.143C0 32.857 100.333 0 224 0s224 32.857 224 73.143zM448 176v102.857C448 319.143 347.667 352 224 352S0 319.143 0 278.857V176c48.125 33.143 136.208 48.572 224 48.572S399.874 209.143 448 176zm0 160v102.857C448 479.143 347.667 512 224 512S0 479.143 0 438.857V336c48.125 33.143 136.208 48.572 224 48.572S399.874 369.143 448 336z\"]\n};\nvar faDeaf = {\n prefix: 'fas',\n iconName: 'deaf',\n icon: [512, 512, [], \"f2a4\", \"M216 260c0 15.464-12.536 28-28 28s-28-12.536-28-28c0-44.112 35.888-80 80-80s80 35.888 80 80c0 15.464-12.536 28-28 28s-28-12.536-28-28c0-13.234-10.767-24-24-24s-24 10.766-24 24zm24-176c-97.047 0-176 78.953-176 176 0 15.464 12.536 28 28 28s28-12.536 28-28c0-66.168 53.832-120 120-120s120 53.832 120 120c0 75.164-71.009 70.311-71.997 143.622L288 404c0 28.673-23.327 52-52 52-15.464 0-28 12.536-28 28s12.536 28 28 28c59.475 0 107.876-48.328 108-107.774.595-34.428 72-48.24 72-144.226 0-97.047-78.953-176-176-176zm268.485-52.201L480.2 3.515c-4.687-4.686-12.284-4.686-16.971 0L376.2 90.544c-4.686 4.686-4.686 12.284 0 16.971l28.285 28.285c4.686 4.686 12.284 4.686 16.97 0l87.03-87.029c4.687-4.688 4.687-12.286 0-16.972zM168.97 314.745c-4.686-4.686-12.284-4.686-16.97 0L3.515 463.23c-4.686 4.686-4.686 12.284 0 16.971L31.8 508.485c4.687 4.686 12.284 4.686 16.971 0L197.256 360c4.686-4.686 4.686-12.284 0-16.971l-28.286-28.284z\"]\n};\nvar faDemocrat = {\n prefix: 'fas',\n iconName: 'democrat',\n icon: [640, 512, [], \"f747\", \"M637.3 256.9l-19.6-29.4c-28.2-42.3-75.3-67.5-126.1-67.5H256l-81.2-81.2c20.1-20.1 22.6-51.1 7.5-73.9-3.4-5.2-10.8-5.9-15.2-1.5l-41.8 41.8L82.4 2.4c-3.6-3.6-9.6-3-12.4 1.2-12.3 18.6-10.3 44 6.1 60.4 3.3 3.3 7.3 5.3 11.3 7.5-2.2 1.7-4.7 3.1-6.4 5.4L6.4 176.2c-7.3 9.7-8.4 22.7-3 33.5l14.3 28.6c5.4 10.8 16.5 17.7 28.6 17.7h31c8.5 0 16.6-3.4 22.6-9.4L138 212l54 108h352v-77.8c16.2 12.2 18.3 17.6 40.1 50.3 4.9 7.4 14.8 9.3 22.2 4.4l26.6-17.7c7.3-5 9.3-14.9 4.4-22.3zm-341.1-13.6l-16.5 16.1 3.9 22.7c.7 4.1-3.6 7.2-7.2 5.3L256 276.7l-20.4 10.7c-3.6 1.9-7.9-1.2-7.2-5.3l3.9-22.7-16.5-16.1c-3-2.9-1.3-7.9 2.8-8.5l22.8-3.3 10.2-20.7c1.8-3.7 7.1-3.7 9 0l10.2 20.7 22.8 3.3c4 .6 5.6 5.6 2.6 8.5zm112 0l-16.5 16.1 3.9 22.7c.7 4.1-3.6 7.2-7.2 5.3L368 276.7l-20.4 10.7c-3.6 1.9-7.9-1.2-7.2-5.3l3.9-22.7-16.5-16.1c-3-2.9-1.3-7.9 2.8-8.5l22.8-3.3 10.2-20.7c1.8-3.7 7.1-3.7 9 0l10.2 20.7 22.8 3.3c4 .6 5.6 5.6 2.6 8.5zm112 0l-16.5 16.1 3.9 22.7c.7 4.1-3.6 7.2-7.2 5.3L480 276.7l-20.4 10.7c-3.6 1.9-7.9-1.2-7.2-5.3l3.9-22.7-16.5-16.1c-3-2.9-1.3-7.9 2.8-8.5l22.8-3.3 10.2-20.7c1.8-3.7 7.1-3.7 9 0l10.2 20.7 22.8 3.3c4 .6 5.6 5.6 2.6 8.5zM192 496c0 8.8 7.2 16 16 16h64c8.8 0 16-7.2 16-16v-80h160v80c0 8.8 7.2 16 16 16h64c8.8 0 16-7.2 16-16V352H192v144z\"]\n};\nvar faDesktop = {\n prefix: 'fas',\n iconName: 'desktop',\n icon: [576, 512, [], \"f108\", \"M528 0H48C21.5 0 0 21.5 0 48v320c0 26.5 21.5 48 48 48h192l-16 48h-72c-13.3 0-24 10.7-24 24s10.7 24 24 24h272c13.3 0 24-10.7 24-24s-10.7-24-24-24h-72l-16-48h192c26.5 0 48-21.5 48-48V48c0-26.5-21.5-48-48-48zm-16 352H64V64h448v288z\"]\n};\nvar faDharmachakra = {\n prefix: 'fas',\n iconName: 'dharmachakra',\n icon: [512, 512, [], \"f655\", \"M495 225.06l-17.22 1.08c-5.27-39.49-20.79-75.64-43.86-105.84l12.95-11.43c6.92-6.11 7.25-16.79.73-23.31L426.44 64.4c-6.53-6.53-17.21-6.19-23.31.73L391.7 78.07c-30.2-23.06-66.35-38.58-105.83-43.86L286.94 17c.58-9.21-6.74-17-15.97-17h-29.94c-9.23 0-16.54 7.79-15.97 17l1.08 17.22c-39.49 5.27-75.64 20.79-105.83 43.86l-11.43-12.95c-6.11-6.92-16.79-7.25-23.31-.73L64.4 85.56c-6.53 6.53-6.19 17.21.73 23.31l12.95 11.43c-23.06 30.2-38.58 66.35-43.86 105.84L17 225.06c-9.21-.58-17 6.74-17 15.97v29.94c0 9.23 7.79 16.54 17 15.97l17.22-1.08c5.27 39.49 20.79 75.64 43.86 105.83l-12.95 11.43c-6.92 6.11-7.25 16.79-.73 23.31l21.17 21.17c6.53 6.53 17.21 6.19 23.31-.73l11.43-12.95c30.2 23.06 66.35 38.58 105.84 43.86L225.06 495c-.58 9.21 6.74 17 15.97 17h29.94c9.23 0 16.54-7.79 15.97-17l-1.08-17.22c39.49-5.27 75.64-20.79 105.84-43.86l11.43 12.95c6.11 6.92 16.79 7.25 23.31.73l21.17-21.17c6.53-6.53 6.19-17.21-.73-23.31l-12.95-11.43c23.06-30.2 38.58-66.35 43.86-105.83l17.22 1.08c9.21.58 17-6.74 17-15.97v-29.94c-.01-9.23-7.8-16.54-17.01-15.97zM281.84 98.61c24.81 4.07 47.63 13.66 67.23 27.78l-42.62 48.29c-8.73-5.44-18.32-9.54-28.62-11.95l4.01-64.12zm-51.68 0l4.01 64.12c-10.29 2.41-19.89 6.52-28.62 11.95l-42.62-48.29c19.6-14.12 42.42-23.71 67.23-27.78zm-103.77 64.33l48.3 42.61c-5.44 8.73-9.54 18.33-11.96 28.62l-64.12-4.01c4.07-24.81 13.66-47.62 27.78-67.22zm-27.78 118.9l64.12-4.01c2.41 10.29 6.52 19.89 11.95 28.62l-48.29 42.62c-14.12-19.6-23.71-42.42-27.78-67.23zm131.55 131.55c-24.81-4.07-47.63-13.66-67.23-27.78l42.61-48.3c8.73 5.44 18.33 9.54 28.62 11.96l-4 64.12zM256 288c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm25.84 125.39l-4.01-64.12c10.29-2.41 19.89-6.52 28.62-11.96l42.61 48.3c-19.6 14.12-42.41 23.71-67.22 27.78zm103.77-64.33l-48.29-42.62c5.44-8.73 9.54-18.32 11.95-28.62l64.12 4.01c-4.07 24.82-13.66 47.64-27.78 67.23zm-36.34-114.89c-2.41-10.29-6.52-19.89-11.96-28.62l48.3-42.61c14.12 19.6 23.71 42.42 27.78 67.23l-64.12 4z\"]\n};\nvar faDiagnoses = {\n prefix: 'fas',\n iconName: 'diagnoses',\n icon: [640, 512, [], \"f470\", \"M496 256c8.8 0 16-7.2 16-16s-7.2-16-16-16-16 7.2-16 16 7.2 16 16 16zm-176-80c48.5 0 88-39.5 88-88S368.5 0 320 0s-88 39.5-88 88 39.5 88 88 88zM59.8 364c10.2 15.3 29.3 17.8 42.9 9.8 16.2-9.6 56.2-31.7 105.3-48.6V416h224v-90.7c49.1 16.8 89.1 39 105.3 48.6 13.6 8 32.7 5.3 42.9-9.8l17.8-26.7c8.8-13.2 7.6-34.6-10-45.1-11.9-7.1-29.7-17-51.1-27.4-28.1 46.1-99.4 17.8-87.7-35.1C409.3 217.2 365.1 208 320 208c-57 0-112.9 14.5-160 32.2-.2 40.2-47.6 63.3-79.2 36-11.2 6-21.3 11.6-28.7 16-17.6 10.5-18.8 31.8-10 45.1L59.8 364zM368 344c13.3 0 24 10.7 24 24s-10.7 24-24 24-24-10.7-24-24 10.7-24 24-24zm-96-96c13.3 0 24 10.7 24 24s-10.7 24-24 24-24-10.7-24-24 10.7-24 24-24zm-160 8c8.8 0 16-7.2 16-16s-7.2-16-16-16-16 7.2-16 16 7.2 16 16 16zm512 192H16c-8.8 0-16 7.2-16 16v32c0 8.8 7.2 16 16 16h608c8.8 0 16-7.2 16-16v-32c0-8.8-7.2-16-16-16z\"]\n};\nvar faDice = {\n prefix: 'fas',\n iconName: 'dice',\n icon: [640, 512, [], \"f522\", \"M592 192H473.26c12.69 29.59 7.12 65.2-17 89.32L320 417.58V464c0 26.51 21.49 48 48 48h224c26.51 0 48-21.49 48-48V240c0-26.51-21.49-48-48-48zM480 376c-13.25 0-24-10.75-24-24 0-13.26 10.75-24 24-24s24 10.74 24 24c0 13.25-10.75 24-24 24zm-46.37-186.7L258.7 14.37c-19.16-19.16-50.23-19.16-69.39 0L14.37 189.3c-19.16 19.16-19.16 50.23 0 69.39L189.3 433.63c19.16 19.16 50.23 19.16 69.39 0L433.63 258.7c19.16-19.17 19.16-50.24 0-69.4zM96 248c-13.25 0-24-10.75-24-24 0-13.26 10.75-24 24-24s24 10.74 24 24c0 13.25-10.75 24-24 24zm128 128c-13.25 0-24-10.75-24-24 0-13.26 10.75-24 24-24s24 10.74 24 24c0 13.25-10.75 24-24 24zm0-128c-13.25 0-24-10.75-24-24 0-13.26 10.75-24 24-24s24 10.74 24 24c0 13.25-10.75 24-24 24zm0-128c-13.25 0-24-10.75-24-24 0-13.26 10.75-24 24-24s24 10.74 24 24c0 13.25-10.75 24-24 24zm128 128c-13.25 0-24-10.75-24-24 0-13.26 10.75-24 24-24s24 10.74 24 24c0 13.25-10.75 24-24 24z\"]\n};\nvar faDiceD20 = {\n prefix: 'fas',\n iconName: 'dice-d20',\n icon: [480, 512, [], \"f6cf\", \"M106.75 215.06L1.2 370.95c-3.08 5 .1 11.5 5.93 12.14l208.26 22.07-108.64-190.1zM7.41 315.43L82.7 193.08 6.06 147.1c-2.67-1.6-6.06.32-6.06 3.43v162.81c0 4.03 5.29 5.53 7.41 2.09zM18.25 423.6l194.4 87.66c5.3 2.45 11.35-1.43 11.35-7.26v-65.67l-203.55-22.3c-4.45-.5-6.23 5.59-2.2 7.57zm81.22-257.78L179.4 22.88c4.34-7.06-3.59-15.25-10.78-11.14L17.81 110.35c-2.47 1.62-2.39 5.26.13 6.78l81.53 48.69zM240 176h109.21L253.63 7.62C250.5 2.54 245.25 0 240 0s-10.5 2.54-13.63 7.62L130.79 176H240zm233.94-28.9l-76.64 45.99 75.29 122.35c2.11 3.44 7.41 1.94 7.41-2.1V150.53c0-3.11-3.39-5.03-6.06-3.43zm-93.41 18.72l81.53-48.7c2.53-1.52 2.6-5.16.13-6.78l-150.81-98.6c-7.19-4.11-15.12 4.08-10.78 11.14l79.93 142.94zm79.02 250.21L256 438.32v65.67c0 5.84 6.05 9.71 11.35 7.26l194.4-87.66c4.03-1.97 2.25-8.06-2.2-7.56zm-86.3-200.97l-108.63 190.1 208.26-22.07c5.83-.65 9.01-7.14 5.93-12.14L373.25 215.06zM240 208H139.57L240 383.75 340.43 208H240z\"]\n};\nvar faDiceD6 = {\n prefix: 'fas',\n iconName: 'dice-d6',\n icon: [448, 512, [], \"f6d1\", \"M422.19 109.95L256.21 9.07c-19.91-12.1-44.52-12.1-64.43 0L25.81 109.95c-5.32 3.23-5.29 11.27.06 14.46L224 242.55l198.14-118.14c5.35-3.19 5.38-11.22.05-14.46zm13.84 44.63L240 271.46v223.82c0 12.88 13.39 20.91 24.05 14.43l152.16-92.48c19.68-11.96 31.79-33.94 31.79-57.7v-197.7c0-6.41-6.64-10.43-11.97-7.25zM0 161.83v197.7c0 23.77 12.11 45.74 31.79 57.7l152.16 92.47c10.67 6.48 24.05-1.54 24.05-14.43V271.46L11.97 154.58C6.64 151.4 0 155.42 0 161.83z\"]\n};\nvar faDiceFive = {\n prefix: 'fas',\n iconName: 'dice-five',\n icon: [448, 512, [], \"f523\", \"M384 32H64C28.65 32 0 60.65 0 96v320c0 35.35 28.65 64 64 64h320c35.35 0 64-28.65 64-64V96c0-35.35-28.65-64-64-64zM128 384c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm0-192c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm96 96c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm96 96c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm0-192c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32z\"]\n};\nvar faDiceFour = {\n prefix: 'fas',\n iconName: 'dice-four',\n icon: [448, 512, [], \"f524\", \"M384 32H64C28.65 32 0 60.65 0 96v320c0 35.35 28.65 64 64 64h320c35.35 0 64-28.65 64-64V96c0-35.35-28.65-64-64-64zM128 384c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm0-192c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm192 192c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm0-192c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32z\"]\n};\nvar faDiceOne = {\n prefix: 'fas',\n iconName: 'dice-one',\n icon: [448, 512, [], \"f525\", \"M384 32H64C28.65 32 0 60.65 0 96v320c0 35.35 28.65 64 64 64h320c35.35 0 64-28.65 64-64V96c0-35.35-28.65-64-64-64zM224 288c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32z\"]\n};\nvar faDiceSix = {\n prefix: 'fas',\n iconName: 'dice-six',\n icon: [448, 512, [], \"f526\", \"M384 32H64C28.65 32 0 60.65 0 96v320c0 35.35 28.65 64 64 64h320c35.35 0 64-28.65 64-64V96c0-35.35-28.65-64-64-64zM128 384c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm0-96c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm0-96c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm192 192c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm0-96c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm0-96c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32z\"]\n};\nvar faDiceThree = {\n prefix: 'fas',\n iconName: 'dice-three',\n icon: [448, 512, [], \"f527\", \"M384 32H64C28.65 32 0 60.65 0 96v320c0 35.35 28.65 64 64 64h320c35.35 0 64-28.65 64-64V96c0-35.35-28.65-64-64-64zM128 192c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm96 96c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm96 96c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32z\"]\n};\nvar faDiceTwo = {\n prefix: 'fas',\n iconName: 'dice-two',\n icon: [448, 512, [], \"f528\", \"M384 32H64C28.65 32 0 60.65 0 96v320c0 35.35 28.65 64 64 64h320c35.35 0 64-28.65 64-64V96c0-35.35-28.65-64-64-64zM128 192c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm192 192c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32z\"]\n};\nvar faDigitalTachograph = {\n prefix: 'fas',\n iconName: 'digital-tachograph',\n icon: [640, 512, [], \"f566\", \"M608 96H32c-17.67 0-32 14.33-32 32v256c0 17.67 14.33 32 32 32h576c17.67 0 32-14.33 32-32V128c0-17.67-14.33-32-32-32zM304 352c0 4.42-3.58 8-8 8H72c-4.42 0-8-3.58-8-8v-8c0-4.42 3.58-8 8-8h224c4.42 0 8 3.58 8 8v8zM72 288v-16c0-4.42 3.58-8 8-8h16c4.42 0 8 3.58 8 8v16c0 4.42-3.58 8-8 8H80c-4.42 0-8-3.58-8-8zm64 0v-16c0-4.42 3.58-8 8-8h16c4.42 0 8 3.58 8 8v16c0 4.42-3.58 8-8 8h-16c-4.42 0-8-3.58-8-8zm64 0v-16c0-4.42 3.58-8 8-8h16c4.42 0 8 3.58 8 8v16c0 4.42-3.58 8-8 8h-16c-4.42 0-8-3.58-8-8zm64 0v-16c0-4.42 3.58-8 8-8h16c4.42 0 8 3.58 8 8v16c0 4.42-3.58 8-8 8h-16c-4.42 0-8-3.58-8-8zm40-64c0 8.84-7.16 16-16 16H80c-8.84 0-16-7.16-16-16v-48c0-8.84 7.16-16 16-16h208c8.84 0 16 7.16 16 16v48zm272 128c0 4.42-3.58 8-8 8H344c-4.42 0-8-3.58-8-8v-8c0-4.42 3.58-8 8-8h224c4.42 0 8 3.58 8 8v8z\"]\n};\nvar faDirections = {\n prefix: 'fas',\n iconName: 'directions',\n icon: [512, 512, [], \"f5eb\", \"M502.61 233.32L278.68 9.39c-12.52-12.52-32.83-12.52-45.36 0L9.39 233.32c-12.52 12.53-12.52 32.83 0 45.36l223.93 223.93c12.52 12.53 32.83 12.53 45.36 0l223.93-223.93c12.52-12.53 12.52-32.83 0-45.36zm-100.98 12.56l-84.21 77.73c-5.12 4.73-13.43 1.1-13.43-5.88V264h-96v64c0 4.42-3.58 8-8 8h-32c-4.42 0-8-3.58-8-8v-80c0-17.67 14.33-32 32-32h112v-53.73c0-6.97 8.3-10.61 13.43-5.88l84.21 77.73c3.43 3.17 3.43 8.59 0 11.76z\"]\n};\nvar faDivide = {\n prefix: 'fas',\n iconName: 'divide',\n icon: [448, 512, [], \"f529\", \"M224 352c-35.35 0-64 28.65-64 64s28.65 64 64 64 64-28.65 64-64-28.65-64-64-64zm0-192c35.35 0 64-28.65 64-64s-28.65-64-64-64-64 28.65-64 64 28.65 64 64 64zm192 48H32c-17.67 0-32 14.33-32 32v32c0 17.67 14.33 32 32 32h384c17.67 0 32-14.33 32-32v-32c0-17.67-14.33-32-32-32z\"]\n};\nvar faDizzy = {\n prefix: 'fas',\n iconName: 'dizzy',\n icon: [496, 512, [], \"f567\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm-96 206.6l-28.7 28.7c-14.8 14.8-37.8-7.5-22.6-22.6l28.7-28.7-28.7-28.7c-15-15 7.7-37.6 22.6-22.6l28.7 28.7 28.7-28.7c15-15 37.6 7.7 22.6 22.6L174.6 192l28.7 28.7c15.2 15.2-7.9 37.4-22.6 22.6L152 214.6zM248 416c-35.3 0-64-28.7-64-64s28.7-64 64-64 64 28.7 64 64-28.7 64-64 64zm147.3-195.3c15.2 15.2-7.9 37.4-22.6 22.6L344 214.6l-28.7 28.7c-14.8 14.8-37.8-7.5-22.6-22.6l28.7-28.7-28.7-28.7c-15-15 7.7-37.6 22.6-22.6l28.7 28.7 28.7-28.7c15-15 37.6 7.7 22.6 22.6L366.6 192l28.7 28.7z\"]\n};\nvar faDna = {\n prefix: 'fas',\n iconName: 'dna',\n icon: [448, 512, [], \"f471\", \"M.1 494.1c-1.1 9.5 6.3 17.8 15.9 17.8l32.3.1c8.1 0 14.9-5.9 16-13.9.7-4.9 1.8-11.1 3.4-18.1H380c1.6 6.9 2.9 13.2 3.5 18.1 1.1 8 7.9 14 16 13.9l32.3-.1c9.6 0 17.1-8.3 15.9-17.8-4.6-37.9-25.6-129-118.9-207.7-17.6 12.4-37.1 24.2-58.5 35.4 6.2 4.6 11.4 9.4 17 14.2H159.7c21.3-18.1 47-35.6 78.7-51.4C410.5 199.1 442.1 65.8 447.9 17.9 449 8.4 441.6.1 432 .1L399.6 0c-8.1 0-14.9 5.9-16 13.9-.7 4.9-1.8 11.1-3.4 18.1H67.8c-1.6-7-2.7-13.1-3.4-18.1-1.1-8-7.9-14-16-13.9L16.1.1C6.5.1-1 8.4.1 17.9 5.3 60.8 31.4 171.8 160 256 31.5 340.2 5.3 451.2.1 494.1zM224 219.6c-25.1-13.7-46.4-28.4-64.3-43.6h128.5c-17.8 15.2-39.1 30-64.2 43.6zM355.1 96c-5.8 10.4-12.8 21.1-21 32H114c-8.3-10.9-15.3-21.6-21-32h262.1zM92.9 416c5.8-10.4 12.8-21.1 21-32h219.4c8.3 10.9 15.4 21.6 21.2 32H92.9z\"]\n};\nvar faDog = {\n prefix: 'fas',\n iconName: 'dog',\n icon: [512, 512, [], \"f6d3\", \"M496 96h-64l-7.16-14.31A32 32 0 0 0 396.22 64H342.6l-27.28-27.28C305.23 26.64 288 33.78 288 48.03v149.84l128 45.71V208h32c35.35 0 64-28.65 64-64v-32c0-8.84-7.16-16-16-16zm-112 48c-8.84 0-16-7.16-16-16s7.16-16 16-16 16 7.16 16 16-7.16 16-16 16zM96 224c-17.64 0-32-14.36-32-32 0-17.67-14.33-32-32-32S0 174.33 0 192c0 41.66 26.83 76.85 64 90.1V496c0 8.84 7.16 16 16 16h64c8.84 0 16-7.16 16-16V384h160v112c0 8.84 7.16 16 16 16h64c8.84 0 16-7.16 16-16V277.55L266.05 224H96z\"]\n};\nvar faDollarSign = {\n prefix: 'fas',\n iconName: 'dollar-sign',\n icon: [288, 512, [], \"f155\", \"M209.2 233.4l-108-31.6C88.7 198.2 80 186.5 80 173.5c0-16.3 13.2-29.5 29.5-29.5h66.3c12.2 0 24.2 3.7 34.2 10.5 6.1 4.1 14.3 3.1 19.5-2l34.8-34c7.1-6.9 6.1-18.4-1.8-24.5C238 74.8 207.4 64.1 176 64V16c0-8.8-7.2-16-16-16h-32c-8.8 0-16 7.2-16 16v48h-2.5C45.8 64-5.4 118.7.5 183.6c4.2 46.1 39.4 83.6 83.8 96.6l102.5 30c12.5 3.7 21.2 15.3 21.2 28.3 0 16.3-13.2 29.5-29.5 29.5h-66.3C100 368 88 364.3 78 357.5c-6.1-4.1-14.3-3.1-19.5 2l-34.8 34c-7.1 6.9-6.1 18.4 1.8 24.5 24.5 19.2 55.1 29.9 86.5 30v48c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16v-48.2c46.6-.9 90.3-28.6 105.7-72.7 21.5-61.6-14.6-124.8-72.5-141.7z\"]\n};\nvar faDolly = {\n prefix: 'fas',\n iconName: 'dolly',\n icon: [576, 512, [], \"f472\", \"M294.2 277.7c18 5 34.7 13.4 49.5 24.7l161.5-53.8c8.4-2.8 12.9-11.9 10.1-20.2L454.9 47.2c-2.8-8.4-11.9-12.9-20.2-10.1l-61.1 20.4 33.1 99.4L346 177l-33.1-99.4-61.6 20.5c-8.4 2.8-12.9 11.9-10.1 20.2l53 159.4zm281 48.7L565 296c-2.8-8.4-11.9-12.9-20.2-10.1l-213.5 71.2c-17.2-22-43.6-36.4-73.5-37L158.4 21.9C154 8.8 141.8 0 128 0H16C7.2 0 0 7.2 0 16v32c0 8.8 7.2 16 16 16h88.9l92.2 276.7c-26.1 20.4-41.7 53.6-36 90.5 6.1 39.4 37.9 72.3 77.3 79.2 60.2 10.7 112.3-34.8 113.4-92.6l213.3-71.2c8.3-2.8 12.9-11.8 10.1-20.2zM256 464c-26.5 0-48-21.5-48-48s21.5-48 48-48 48 21.5 48 48-21.5 48-48 48z\"]\n};\nvar faDollyFlatbed = {\n prefix: 'fas',\n iconName: 'dolly-flatbed',\n icon: [640, 512, [], \"f474\", \"M208 320h384c8.8 0 16-7.2 16-16V48c0-8.8-7.2-16-16-16H448v128l-48-32-48 32V32H208c-8.8 0-16 7.2-16 16v256c0 8.8 7.2 16 16 16zm416 64H128V16c0-8.8-7.2-16-16-16H16C7.2 0 0 7.2 0 16v32c0 8.8 7.2 16 16 16h48v368c0 8.8 7.2 16 16 16h82.9c-1.8 5-2.9 10.4-2.9 16 0 26.5 21.5 48 48 48s48-21.5 48-48c0-5.6-1.2-11-2.9-16H451c-1.8 5-2.9 10.4-2.9 16 0 26.5 21.5 48 48 48s48-21.5 48-48c0-5.6-1.2-11-2.9-16H624c8.8 0 16-7.2 16-16v-32c0-8.8-7.2-16-16-16z\"]\n};\nvar faDonate = {\n prefix: 'fas',\n iconName: 'donate',\n icon: [512, 512, [], \"f4b9\", \"M256 416c114.9 0 208-93.1 208-208S370.9 0 256 0 48 93.1 48 208s93.1 208 208 208zM233.8 97.4V80.6c0-9.2 7.4-16.6 16.6-16.6h11.1c9.2 0 16.6 7.4 16.6 16.6v17c15.5.8 30.5 6.1 43 15.4 5.6 4.1 6.2 12.3 1.2 17.1L306 145.6c-3.8 3.7-9.5 3.8-14 1-5.4-3.4-11.4-5.1-17.8-5.1h-38.9c-9 0-16.3 8.2-16.3 18.3 0 8.2 5 15.5 12.1 17.6l62.3 18.7c25.7 7.7 43.7 32.4 43.7 60.1 0 34-26.4 61.5-59.1 62.4v16.8c0 9.2-7.4 16.6-16.6 16.6h-11.1c-9.2 0-16.6-7.4-16.6-16.6v-17c-15.5-.8-30.5-6.1-43-15.4-5.6-4.1-6.2-12.3-1.2-17.1l16.3-15.5c3.8-3.7 9.5-3.8 14-1 5.4 3.4 11.4 5.1 17.8 5.1h38.9c9 0 16.3-8.2 16.3-18.3 0-8.2-5-15.5-12.1-17.6l-62.3-18.7c-25.7-7.7-43.7-32.4-43.7-60.1.1-34 26.4-61.5 59.1-62.4zM480 352h-32.5c-19.6 26-44.6 47.7-73 64h63.8c5.3 0 9.6 3.6 9.6 8v16c0 4.4-4.3 8-9.6 8H73.6c-5.3 0-9.6-3.6-9.6-8v-16c0-4.4 4.3-8 9.6-8h63.8c-28.4-16.3-53.3-38-73-64H32c-17.7 0-32 14.3-32 32v96c0 17.7 14.3 32 32 32h448c17.7 0 32-14.3 32-32v-96c0-17.7-14.3-32-32-32z\"]\n};\nvar faDoorClosed = {\n prefix: 'fas',\n iconName: 'door-closed',\n icon: [640, 512, [], \"f52a\", \"M624 448H512V50.8C512 22.78 490.47 0 464 0H175.99c-26.47 0-48 22.78-48 50.8V448H16c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h608c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16zM415.99 288c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32c.01 17.67-14.32 32-32 32z\"]\n};\nvar faDoorOpen = {\n prefix: 'fas',\n iconName: 'door-open',\n icon: [640, 512, [], \"f52b\", \"M624 448h-80V113.45C544 86.19 522.47 64 496 64H384v64h96v384h144c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16zM312.24 1.01l-192 49.74C105.99 54.44 96 67.7 96 82.92V448H16c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h336V33.18c0-21.58-19.56-37.41-39.76-32.17zM264 288c-13.25 0-24-14.33-24-32s10.75-32 24-32 24 14.33 24 32-10.75 32-24 32z\"]\n};\nvar faDotCircle = {\n prefix: 'fas',\n iconName: 'dot-circle',\n icon: [512, 512, [], \"f192\", \"M256 8C119.033 8 8 119.033 8 256s111.033 248 248 248 248-111.033 248-248S392.967 8 256 8zm80 248c0 44.112-35.888 80-80 80s-80-35.888-80-80 35.888-80 80-80 80 35.888 80 80z\"]\n};\nvar faDove = {\n prefix: 'fas',\n iconName: 'dove',\n icon: [512, 512, [], \"f4ba\", \"M288 167.2v-28.1c-28.2-36.3-47.1-79.3-54.1-125.2-2.1-13.5-19-18.8-27.8-8.3-21.1 24.9-37.7 54.1-48.9 86.5 34.2 38.3 80 64.6 130.8 75.1zM400 64c-44.2 0-80 35.9-80 80.1v59.4C215.6 197.3 127 133 87 41.8c-5.5-12.5-23.2-13.2-29-.9C41.4 76 32 115.2 32 156.6c0 70.8 34.1 136.9 85.1 185.9 13.2 12.7 26.1 23.2 38.9 32.8l-143.9 36C1.4 414-3.4 426.4 2.6 435.7 20 462.6 63 508.2 155.8 512c8 .3 16-2.6 22.1-7.9l65.2-56.1H320c88.4 0 160-71.5 160-159.9V128l32-64H400zm0 96.1c-8.8 0-16-7.2-16-16s7.2-16 16-16 16 7.2 16 16-7.2 16-16 16z\"]\n};\nvar faDownload = {\n prefix: 'fas',\n iconName: 'download',\n icon: [512, 512, [], \"f019\", \"M216 0h80c13.3 0 24 10.7 24 24v168h87.7c17.8 0 26.7 21.5 14.1 34.1L269.7 378.3c-7.5 7.5-19.8 7.5-27.3 0L90.1 226.1c-12.6-12.6-3.7-34.1 14.1-34.1H192V24c0-13.3 10.7-24 24-24zm296 376v112c0 13.3-10.7 24-24 24H24c-13.3 0-24-10.7-24-24V376c0-13.3 10.7-24 24-24h146.7l49 49c20.1 20.1 52.5 20.1 72.6 0l49-49H488c13.3 0 24 10.7 24 24zm-124 88c0-11-9-20-20-20s-20 9-20 20 9 20 20 20 20-9 20-20zm64 0c0-11-9-20-20-20s-20 9-20 20 9 20 20 20 20-9 20-20z\"]\n};\nvar faDraftingCompass = {\n prefix: 'fas',\n iconName: 'drafting-compass',\n icon: [512, 512, [], \"f568\", \"M457.01 344.42c-25.05 20.33-52.63 37.18-82.54 49.05l54.38 94.19 53.95 23.04c9.81 4.19 20.89-2.21 22.17-12.8l7.02-58.25-54.98-95.23zm42.49-94.56c4.86-7.67 1.89-17.99-6.05-22.39l-28.07-15.57c-7.48-4.15-16.61-1.46-21.26 5.72C403.01 281.15 332.25 320 256 320c-23.93 0-47.23-4.25-69.41-11.53l67.36-116.68c.7.02 1.34.21 2.04.21s1.35-.19 2.04-.21l51.09 88.5c31.23-8.96 59.56-25.75 82.61-48.92l-51.79-89.71C347.39 128.03 352 112.63 352 96c0-53.02-42.98-96-96-96s-96 42.98-96 96c0 16.63 4.61 32.03 12.05 45.66l-68.3 118.31c-12.55-11.61-23.96-24.59-33.68-39-4.79-7.1-13.97-9.62-21.38-5.33l-27.75 16.07c-7.85 4.54-10.63 14.9-5.64 22.47 15.57 23.64 34.69 44.21 55.98 62.02L0 439.66l7.02 58.25c1.28 10.59 12.36 16.99 22.17 12.8l53.95-23.04 70.8-122.63C186.13 377.28 220.62 384 256 384c99.05 0 190.88-51.01 243.5-134.14zM256 64c17.67 0 32 14.33 32 32s-14.33 32-32 32-32-14.33-32-32 14.33-32 32-32z\"]\n};\nvar faDragon = {\n prefix: 'fas',\n iconName: 'dragon',\n icon: [640, 512, [], \"f6d5\", \"M18.32 255.78L192 223.96l-91.28 68.69c-10.08 10.08-2.94 27.31 11.31 27.31h222.7c-9.44-26.4-14.73-54.47-14.73-83.38v-42.27l-119.73-87.6c-23.82-15.88-55.29-14.01-77.06 4.59L5.81 227.64c-12.38 10.33-3.45 30.42 12.51 28.14zm556.87 34.1l-100.66-50.31A47.992 47.992 0 0 1 448 196.65v-36.69h64l28.09 22.63c6 6 14.14 9.37 22.63 9.37h30.97a32 32 0 0 0 28.62-17.69l14.31-28.62a32.005 32.005 0 0 0-3.02-33.51l-74.53-99.38C553.02 4.7 543.54 0 533.47 0H296.02c-7.13 0-10.7 8.57-5.66 13.61L352 63.96 292.42 88.8c-5.9 2.95-5.9 11.36 0 14.31L352 127.96v108.62c0 72.08 36.03 139.39 96 179.38-195.59 6.81-344.56 41.01-434.1 60.91C5.78 478.67 0 485.88 0 494.2 0 504 7.95 512 17.76 512h499.08c63.29.01 119.61-47.56 122.99-110.76 2.52-47.28-22.73-90.4-64.64-111.36zM489.18 66.25l45.65 11.41c-2.75 10.91-12.47 18.89-24.13 18.26-12.96-.71-25.85-12.53-21.52-29.67z\"]\n};\nvar faDrawPolygon = {\n prefix: 'fas',\n iconName: 'draw-polygon',\n icon: [448, 512, [], \"f5ee\", \"M384 352c-.35 0-.67.1-1.02.1l-39.2-65.32c5.07-9.17 8.22-19.56 8.22-30.78s-3.14-21.61-8.22-30.78l39.2-65.32c.35.01.67.1 1.02.1 35.35 0 64-28.65 64-64s-28.65-64-64-64c-23.63 0-44.04 12.95-55.12 32H119.12C108.04 44.95 87.63 32 64 32 28.65 32 0 60.65 0 96c0 23.63 12.95 44.04 32 55.12v209.75C12.95 371.96 0 392.37 0 416c0 35.35 28.65 64 64 64 23.63 0 44.04-12.95 55.12-32h209.75c11.09 19.05 31.49 32 55.12 32 35.35 0 64-28.65 64-64 .01-35.35-28.64-64-63.99-64zm-288 8.88V151.12A63.825 63.825 0 0 0 119.12 128h208.36l-38.46 64.1c-.35-.01-.67-.1-1.02-.1-35.35 0-64 28.65-64 64s28.65 64 64 64c.35 0 .67-.1 1.02-.1l38.46 64.1H119.12A63.748 63.748 0 0 0 96 360.88zM272 256c0-8.82 7.18-16 16-16s16 7.18 16 16-7.18 16-16 16-16-7.18-16-16zM400 96c0 8.82-7.18 16-16 16s-16-7.18-16-16 7.18-16 16-16 16 7.18 16 16zM64 80c8.82 0 16 7.18 16 16s-7.18 16-16 16-16-7.18-16-16 7.18-16 16-16zM48 416c0-8.82 7.18-16 16-16s16 7.18 16 16-7.18 16-16 16-16-7.18-16-16zm336 16c-8.82 0-16-7.18-16-16s7.18-16 16-16 16 7.18 16 16-7.18 16-16 16z\"]\n};\nvar faDrum = {\n prefix: 'fas',\n iconName: 'drum',\n icon: [576, 512, [], \"f569\", \"M458.08 120.88l102.39-61.43c15.16-9.09 20.06-28.75 10.97-43.91C562.34.39 542.7-4.53 527.53 4.57l-160.69 96.41A629.32 629.32 0 0 0 288 96C128.94 96 0 153.31 0 224v160.83c0 30.46 24.03 58.4 64 80.37v-96.37c0-17.6 14.4-32 32-32s32 14.4 32 32v122.41c37.4 11.13 81 18.44 128 20.75V400.84c0-17.6 14.4-32 32-32s32 14.4 32 32V512c47-2.31 90.6-9.62 128-20.75V368.84c0-17.6 14.4-32 32-32s32 14.4 32 32v96.37c39.97-21.97 64-49.91 64-80.37V224.01c-.01-42.38-46.54-79.84-117.92-103.13zM288 304c-132.55 0-240-35.82-240-80s107.45-80 240-80c2.34 0 4.62.1 6.94.12l-87.41 52.44c-15.16 9.09-20.06 28.75-10.97 43.91 9.56 15.93 29.51 19.61 43.91 10.97l162.71-97.62C477.55 167.41 528 193.74 528 224.01 528 268.19 420.54 304 288 304z\"]\n};\nvar faDrumSteelpan = {\n prefix: 'fas',\n iconName: 'drum-steelpan',\n icon: [576, 512, [], \"f56a\", \"M288 32C128.94 32 0 89.31 0 160v192c0 70.69 128.94 128 288 128s288-57.31 288-128V160c0-70.69-128.94-128-288-128zm-82.99 158.36c-4.45 16.61-14.54 30.57-28.31 40.48C100.23 217.46 48 190.78 48 160c0-30.16 50.11-56.39 124.04-70.03l25.6 44.34c9.86 17.09 12.48 36.99 7.37 56.05zM288 240c-21.08 0-41.41-1-60.89-2.7 8.06-26.13 32.15-45.3 60.89-45.3s52.83 19.17 60.89 45.3C329.41 239 309.08 240 288 240zm64-144c0 35.29-28.71 64-64 64s-64-28.71-64-64V82.96c20.4-1.88 41.8-2.96 64-2.96s43.6 1.08 64 2.96V96zm46.93 134.9c-13.81-9.91-23.94-23.9-28.4-40.54-5.11-19.06-2.49-38.96 7.38-56.04l25.65-44.42C477.72 103.5 528 129.79 528 160c0 30.83-52.4 57.54-129.07 70.9z\"]\n};\nvar faDrumstickBite = {\n prefix: 'fas',\n iconName: 'drumstick-bite',\n icon: [512, 512, [], \"f6d7\", \"M462.8 49.57a169.44 169.44 0 0 0-239.5 0C187.82 85 160.13 128 160.13 192v85.83l-40.62 40.59c-9.7 9.69-24 11.07-36.78 6a60.33 60.33 0 0 0-65 98.72C33 438.39 54.24 442.7 73.85 438.21c-4.5 19.6-.18 40.83 15.1 56.1a60.35 60.35 0 0 0 98.8-65c-5.09-12.73-3.72-27 6-36.75L234.36 352h85.89a187.87 187.87 0 0 0 61.89-10c-39.64-43.89-39.83-110.23 1.05-151.07 34.38-34.36 86.76-39.46 128.74-16.8 1.3-44.96-14.81-90.28-49.13-124.56z\"]\n};\nvar faDumbbell = {\n prefix: 'fas',\n iconName: 'dumbbell',\n icon: [640, 512, [], \"f44b\", \"M104 96H56c-13.3 0-24 10.7-24 24v104H8c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8h24v104c0 13.3 10.7 24 24 24h48c13.3 0 24-10.7 24-24V120c0-13.3-10.7-24-24-24zm528 128h-24V120c0-13.3-10.7-24-24-24h-48c-13.3 0-24 10.7-24 24v272c0 13.3 10.7 24 24 24h48c13.3 0 24-10.7 24-24V288h24c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8zM456 32h-48c-13.3 0-24 10.7-24 24v168H256V56c0-13.3-10.7-24-24-24h-48c-13.3 0-24 10.7-24 24v400c0 13.3 10.7 24 24 24h48c13.3 0 24-10.7 24-24V288h128v168c0 13.3 10.7 24 24 24h48c13.3 0 24-10.7 24-24V56c0-13.3-10.7-24-24-24z\"]\n};\nvar faDumpster = {\n prefix: 'fas',\n iconName: 'dumpster',\n icon: [576, 512, [], \"f793\", \"M560 160c10.4 0 18-9.8 15.5-19.9l-24-96C549.7 37 543.3 32 536 32h-98.9l25.6 128H560zM272 32H171.5l-25.6 128H272V32zm132.5 0H304v128h126.1L404.5 32zM16 160h97.3l25.6-128H40c-7.3 0-13.7 5-15.5 12.1l-24 96C-2 150.2 5.6 160 16 160zm544 64h-20l4-32H32l4 32H16c-8.8 0-16 7.2-16 16v32c0 8.8 7.2 16 16 16h28l20 160v16c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16v-16h320v16c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16v-16l20-160h28c8.8 0 16-7.2 16-16v-32c0-8.8-7.2-16-16-16z\"]\n};\nvar faDumpsterFire = {\n prefix: 'fas',\n iconName: 'dumpster-fire',\n icon: [640, 512, [], \"f794\", \"M418.7 104.1l.2-.2-14.4-72H304v128h60.8c16.2-19.3 34.2-38.2 53.9-55.8zM272 32H171.5l-25.6 128H272V32zm189.3 72.1c18.2 16.3 35.5 33.7 51.1 51.5 5.7-5.6 11.4-11.1 17.3-16.3l21.3-19 21.3 19c1.1.9 2.1 2.1 3.1 3.1-.1-.8.2-1.5 0-2.3l-24-96C549.7 37 543.3 32 536 32h-98.9l12.3 61.5 11.9 10.6zM16 160h97.3l25.6-128H40c-7.3 0-13.7 5-15.5 12.1l-24 96C-2 150.2 5.6 160 16 160zm324.6 32H32l4 32H16c-8.8 0-16 7.2-16 16v32c0 8.8 7.2 16 16 16h28l20 160v16c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16v-16h208.8c-30.2-33.7-48.8-77.9-48.8-126.4 0-35.9 19.9-82.9 52.6-129.6zm210.5-28.8c-14.9 13.3-28.3 27.2-40.2 41.2-19.5-25.8-43.6-52-71-76.4-70.2 62.7-120 144.3-120 193.6 0 87.5 71.6 158.4 160 158.4s160-70.9 160-158.4c.1-36.6-37-112.2-88.8-158.4zm-18.6 229.4c-14.7 10.7-32.9 17-52.5 17-49 0-88.9-33.5-88.9-88 0-27.1 16.5-51 49.4-91.9 4.7 5.6 67.1 88.1 67.1 88.1l39.8-47c2.8 4.8 5.4 9.5 7.7 14 18.6 36.7 10.8 83.6-22.6 107.8z\"]\n};\nvar faDungeon = {\n prefix: 'fas',\n iconName: 'dungeon',\n icon: [512, 512, [], \"f6d9\", \"M128.73 195.32l-82.81-51.76c-8.04-5.02-18.99-2.17-22.93 6.45A254.19 254.19 0 0 0 .54 239.28C-.05 248.37 7.59 256 16.69 256h97.13c7.96 0 14.08-6.25 15.01-14.16 1.09-9.33 3.24-18.33 6.24-26.94 2.56-7.34.25-15.46-6.34-19.58zM319.03 8C298.86 2.82 277.77 0 256 0s-42.86 2.82-63.03 8c-9.17 2.35-13.91 12.6-10.39 21.39l37.47 104.03A16.003 16.003 0 0 0 235.1 144h41.8c6.75 0 12.77-4.23 15.05-10.58l37.47-104.03c3.52-8.79-1.22-19.03-10.39-21.39zM112 288H16c-8.84 0-16 7.16-16 16v64c0 8.84 7.16 16 16 16h96c8.84 0 16-7.16 16-16v-64c0-8.84-7.16-16-16-16zm0 128H16c-8.84 0-16 7.16-16 16v64c0 8.84 7.16 16 16 16h96c8.84 0 16-7.16 16-16v-64c0-8.84-7.16-16-16-16zm77.31-283.67l-36.32-90.8c-3.53-8.83-14.13-12.99-22.42-8.31a257.308 257.308 0 0 0-71.61 59.89c-6.06 7.32-3.85 18.48 4.22 23.52l82.93 51.83c6.51 4.07 14.66 2.62 20.11-2.79 5.18-5.15 10.79-9.85 16.79-14.05 6.28-4.41 9.15-12.17 6.3-19.29zM398.18 256h97.13c9.1 0 16.74-7.63 16.15-16.72a254.135 254.135 0 0 0-22.45-89.27c-3.94-8.62-14.89-11.47-22.93-6.45l-82.81 51.76c-6.59 4.12-8.9 12.24-6.34 19.58 3.01 8.61 5.15 17.62 6.24 26.94.93 7.91 7.05 14.16 15.01 14.16zm54.85-162.89a257.308 257.308 0 0 0-71.61-59.89c-8.28-4.68-18.88-.52-22.42 8.31l-36.32 90.8c-2.85 7.12.02 14.88 6.3 19.28 6 4.2 11.61 8.9 16.79 14.05 5.44 5.41 13.6 6.86 20.11 2.79l82.93-51.83c8.07-5.03 10.29-16.19 4.22-23.51zM496 288h-96c-8.84 0-16 7.16-16 16v64c0 8.84 7.16 16 16 16h96c8.84 0 16-7.16 16-16v-64c0-8.84-7.16-16-16-16zm0 128h-96c-8.84 0-16 7.16-16 16v64c0 8.84 7.16 16 16 16h96c8.84 0 16-7.16 16-16v-64c0-8.84-7.16-16-16-16zM240 177.62V472c0 4.42 3.58 8 8 8h16c4.42 0 8-3.58 8-8V177.62c-5.23-.89-10.52-1.62-16-1.62s-10.77.73-16 1.62zm-64 41.51V472c0 4.42 3.58 8 8 8h16c4.42 0 8-3.58 8-8V189.36c-12.78 7.45-23.84 17.47-32 29.77zm128-29.77V472c0 4.42 3.58 8 8 8h16c4.42 0 8-3.58 8-8V219.13c-8.16-12.3-19.22-22.32-32-29.77z\"]\n};\nvar faEdit = {\n prefix: 'fas',\n iconName: 'edit',\n icon: [576, 512, [], \"f044\", \"M402.6 83.2l90.2 90.2c3.8 3.8 3.8 10 0 13.8L274.4 405.6l-92.8 10.3c-12.4 1.4-22.9-9.1-21.5-21.5l10.3-92.8L388.8 83.2c3.8-3.8 10-3.8 13.8 0zm162-22.9l-48.8-48.8c-15.2-15.2-39.9-15.2-55.2 0l-35.4 35.4c-3.8 3.8-3.8 10 0 13.8l90.2 90.2c3.8 3.8 10 3.8 13.8 0l35.4-35.4c15.2-15.3 15.2-40 0-55.2zM384 346.2V448H64V128h229.8c3.2 0 6.2-1.3 8.5-3.5l40-40c7.6-7.6 2.2-20.5-8.5-20.5H48C21.5 64 0 85.5 0 112v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V306.2c0-10.7-12.9-16-20.5-8.5l-40 40c-2.2 2.3-3.5 5.3-3.5 8.5z\"]\n};\nvar faEgg = {\n prefix: 'fas',\n iconName: 'egg',\n icon: [384, 512, [], \"f7fb\", \"M192 0C86 0 0 214 0 320s86 192 192 192 192-86 192-192S298 0 192 0z\"]\n};\nvar faEject = {\n prefix: 'fas',\n iconName: 'eject',\n icon: [448, 512, [], \"f052\", \"M448 384v64c0 17.673-14.327 32-32 32H32c-17.673 0-32-14.327-32-32v-64c0-17.673 14.327-32 32-32h384c17.673 0 32 14.327 32 32zM48.053 320h351.886c41.651 0 63.581-49.674 35.383-80.435L259.383 47.558c-19.014-20.743-51.751-20.744-70.767 0L12.67 239.565C-15.475 270.268 6.324 320 48.053 320z\"]\n};\nvar faEllipsisH = {\n prefix: 'fas',\n iconName: 'ellipsis-h',\n icon: [512, 512, [], \"f141\", \"M328 256c0 39.8-32.2 72-72 72s-72-32.2-72-72 32.2-72 72-72 72 32.2 72 72zm104-72c-39.8 0-72 32.2-72 72s32.2 72 72 72 72-32.2 72-72-32.2-72-72-72zm-352 0c-39.8 0-72 32.2-72 72s32.2 72 72 72 72-32.2 72-72-32.2-72-72-72z\"]\n};\nvar faEllipsisV = {\n prefix: 'fas',\n iconName: 'ellipsis-v',\n icon: [192, 512, [], \"f142\", \"M96 184c39.8 0 72 32.2 72 72s-32.2 72-72 72-72-32.2-72-72 32.2-72 72-72zM24 80c0 39.8 32.2 72 72 72s72-32.2 72-72S135.8 8 96 8 24 40.2 24 80zm0 352c0 39.8 32.2 72 72 72s72-32.2 72-72-32.2-72-72-72-72 32.2-72 72z\"]\n};\nvar faEnvelope = {\n prefix: 'fas',\n iconName: 'envelope',\n icon: [512, 512, [], \"f0e0\", \"M502.3 190.8c3.9-3.1 9.7-.2 9.7 4.7V400c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V195.6c0-5 5.7-7.8 9.7-4.7 22.4 17.4 52.1 39.5 154.1 113.6 21.1 15.4 56.7 47.8 92.2 47.6 35.7.3 72-32.8 92.3-47.6 102-74.1 131.6-96.3 154-113.7zM256 320c23.2.4 56.6-29.2 73.4-41.4 132.7-96.3 142.8-104.7 173.4-128.7 5.8-4.5 9.2-11.5 9.2-18.9v-19c0-26.5-21.5-48-48-48H48C21.5 64 0 85.5 0 112v19c0 7.4 3.4 14.3 9.2 18.9 30.6 23.9 40.7 32.4 173.4 128.7 16.8 12.2 50.2 41.8 73.4 41.4z\"]\n};\nvar faEnvelopeOpen = {\n prefix: 'fas',\n iconName: 'envelope-open',\n icon: [512, 512, [], \"f2b6\", \"M512 464c0 26.51-21.49 48-48 48H48c-26.51 0-48-21.49-48-48V200.724a48 48 0 0 1 18.387-37.776c24.913-19.529 45.501-35.365 164.2-121.511C199.412 29.17 232.797-.347 256 .003c23.198-.354 56.596 29.172 73.413 41.433 118.687 86.137 139.303 101.995 164.2 121.512A48 48 0 0 1 512 200.724V464zm-65.666-196.605c-2.563-3.728-7.7-4.595-11.339-1.907-22.845 16.873-55.462 40.705-105.582 77.079-16.825 12.266-50.21 41.781-73.413 41.43-23.211.344-56.559-29.143-73.413-41.43-50.114-36.37-82.734-60.204-105.582-77.079-3.639-2.688-8.776-1.821-11.339 1.907l-9.072 13.196a7.998 7.998 0 0 0 1.839 10.967c22.887 16.899 55.454 40.69 105.303 76.868 20.274 14.781 56.524 47.813 92.264 47.573 35.724.242 71.961-32.771 92.263-47.573 49.85-36.179 82.418-59.97 105.303-76.868a7.998 7.998 0 0 0 1.839-10.967l-9.071-13.196z\"]\n};\nvar faEnvelopeOpenText = {\n prefix: 'fas',\n iconName: 'envelope-open-text',\n icon: [512, 512, [], \"f658\", \"M176 216h160c8.84 0 16-7.16 16-16v-16c0-8.84-7.16-16-16-16H176c-8.84 0-16 7.16-16 16v16c0 8.84 7.16 16 16 16zm-16 80c0 8.84 7.16 16 16 16h160c8.84 0 16-7.16 16-16v-16c0-8.84-7.16-16-16-16H176c-8.84 0-16 7.16-16 16v16zm96 121.13c-16.42 0-32.84-5.06-46.86-15.19L0 250.86V464c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48V250.86L302.86 401.94c-14.02 10.12-30.44 15.19-46.86 15.19zm237.61-254.18c-8.85-6.94-17.24-13.47-29.61-22.81V96c0-26.51-21.49-48-48-48h-77.55c-3.04-2.2-5.87-4.26-9.04-6.56C312.6 29.17 279.2-.35 256 0c-23.2-.35-56.59 29.17-73.41 41.44-3.17 2.3-6 4.36-9.04 6.56H96c-26.51 0-48 21.49-48 48v44.14c-12.37 9.33-20.76 15.87-29.61 22.81A47.995 47.995 0 0 0 0 200.72v10.65l96 69.35V96h320v184.72l96-69.35v-10.65c0-14.74-6.78-28.67-18.39-37.77z\"]\n};\nvar faEnvelopeSquare = {\n prefix: 'fas',\n iconName: 'envelope-square',\n icon: [448, 512, [], \"f199\", \"M400 32H48C21.49 32 0 53.49 0 80v352c0 26.51 21.49 48 48 48h352c26.51 0 48-21.49 48-48V80c0-26.51-21.49-48-48-48zM178.117 262.104C87.429 196.287 88.353 196.121 64 177.167V152c0-13.255 10.745-24 24-24h272c13.255 0 24 10.745 24 24v25.167c-24.371 18.969-23.434 19.124-114.117 84.938-10.5 7.655-31.392 26.12-45.883 25.894-14.503.218-35.367-18.227-45.883-25.895zM384 217.775V360c0 13.255-10.745 24-24 24H88c-13.255 0-24-10.745-24-24V217.775c13.958 10.794 33.329 25.236 95.303 70.214 14.162 10.341 37.975 32.145 64.694 32.01 26.887.134 51.037-22.041 64.72-32.025 61.958-44.965 81.325-59.406 95.283-70.199z\"]\n};\nvar faEquals = {\n prefix: 'fas',\n iconName: 'equals',\n icon: [448, 512, [], \"f52c\", \"M416 304H32c-17.67 0-32 14.33-32 32v32c0 17.67 14.33 32 32 32h384c17.67 0 32-14.33 32-32v-32c0-17.67-14.33-32-32-32zm0-192H32c-17.67 0-32 14.33-32 32v32c0 17.67 14.33 32 32 32h384c17.67 0 32-14.33 32-32v-32c0-17.67-14.33-32-32-32z\"]\n};\nvar faEraser = {\n prefix: 'fas',\n iconName: 'eraser',\n icon: [512, 512, [], \"f12d\", \"M497.941 273.941c18.745-18.745 18.745-49.137 0-67.882l-160-160c-18.745-18.745-49.136-18.746-67.883 0l-256 256c-18.745 18.745-18.745 49.137 0 67.882l96 96A48.004 48.004 0 0 0 144 480h356c6.627 0 12-5.373 12-12v-40c0-6.627-5.373-12-12-12H355.883l142.058-142.059zm-302.627-62.627l137.373 137.373L265.373 416H150.628l-80-80 124.686-124.686z\"]\n};\nvar faEthernet = {\n prefix: 'fas',\n iconName: 'ethernet',\n icon: [512, 512, [], \"f796\", \"M496 192h-48v-48c0-8.8-7.2-16-16-16h-48V80c0-8.8-7.2-16-16-16H144c-8.8 0-16 7.2-16 16v48H80c-8.8 0-16 7.2-16 16v48H16c-8.8 0-16 7.2-16 16v224c0 8.8 7.2 16 16 16h80V320h32v128h64V320h32v128h64V320h32v128h64V320h32v128h80c8.8 0 16-7.2 16-16V208c0-8.8-7.2-16-16-16z\"]\n};\nvar faEuroSign = {\n prefix: 'fas',\n iconName: 'euro-sign',\n icon: [320, 512, [], \"f153\", \"M310.706 413.765c-1.314-6.63-7.835-10.872-14.424-9.369-10.692 2.439-27.422 5.413-45.426 5.413-56.763 0-101.929-34.79-121.461-85.449h113.689a12 12 0 0 0 11.708-9.369l6.373-28.36c1.686-7.502-4.019-14.631-11.708-14.631H115.22c-1.21-14.328-1.414-28.287.137-42.245H261.95a12 12 0 0 0 11.723-9.434l6.512-29.755c1.638-7.484-4.061-14.566-11.723-14.566H130.184c20.633-44.991 62.69-75.03 117.619-75.03 14.486 0 28.564 2.25 37.851 4.145 6.216 1.268 12.347-2.498 14.002-8.623l11.991-44.368c1.822-6.741-2.465-13.616-9.326-14.917C290.217 34.912 270.71 32 249.635 32 152.451 32 74.03 92.252 45.075 176H12c-6.627 0-12 5.373-12 12v29.755c0 6.627 5.373 12 12 12h21.569c-1.009 13.607-1.181 29.287-.181 42.245H12c-6.627 0-12 5.373-12 12v28.36c0 6.627 5.373 12 12 12h30.114C67.139 414.692 145.264 480 249.635 480c26.301 0 48.562-4.544 61.101-7.788 6.167-1.595 10.027-7.708 8.788-13.957l-8.818-44.49z\"]\n};\nvar faExchangeAlt = {\n prefix: 'fas',\n iconName: 'exchange-alt',\n icon: [512, 512, [], \"f362\", \"M0 168v-16c0-13.255 10.745-24 24-24h360V80c0-21.367 25.899-32.042 40.971-16.971l80 80c9.372 9.373 9.372 24.569 0 33.941l-80 80C409.956 271.982 384 261.456 384 240v-48H24c-13.255 0-24-10.745-24-24zm488 152H128v-48c0-21.314-25.862-32.08-40.971-16.971l-80 80c-9.372 9.373-9.372 24.569 0 33.941l80 80C102.057 463.997 128 453.437 128 432v-48h360c13.255 0 24-10.745 24-24v-16c0-13.255-10.745-24-24-24z\"]\n};\nvar faExclamation = {\n prefix: 'fas',\n iconName: 'exclamation',\n icon: [192, 512, [], \"f12a\", \"M176 432c0 44.112-35.888 80-80 80s-80-35.888-80-80 35.888-80 80-80 80 35.888 80 80zM25.26 25.199l13.6 272C39.499 309.972 50.041 320 62.83 320h66.34c12.789 0 23.331-10.028 23.97-22.801l13.6-272C167.425 11.49 156.496 0 142.77 0H49.23C35.504 0 24.575 11.49 25.26 25.199z\"]\n};\nvar faExclamationCircle = {\n prefix: 'fas',\n iconName: 'exclamation-circle',\n icon: [512, 512, [], \"f06a\", \"M504 256c0 136.997-111.043 248-248 248S8 392.997 8 256C8 119.083 119.043 8 256 8s248 111.083 248 248zm-248 50c-25.405 0-46 20.595-46 46s20.595 46 46 46 46-20.595 46-46-20.595-46-46-46zm-43.673-165.346l7.418 136c.347 6.364 5.609 11.346 11.982 11.346h48.546c6.373 0 11.635-4.982 11.982-11.346l7.418-136c.375-6.874-5.098-12.654-11.982-12.654h-63.383c-6.884 0-12.356 5.78-11.981 12.654z\"]\n};\nvar faExclamationTriangle = {\n prefix: 'fas',\n iconName: 'exclamation-triangle',\n icon: [576, 512, [], \"f071\", \"M569.517 440.013C587.975 472.007 564.806 512 527.94 512H48.054c-36.937 0-59.999-40.055-41.577-71.987L246.423 23.985c18.467-32.009 64.72-31.951 83.154 0l239.94 416.028zM288 354c-25.405 0-46 20.595-46 46s20.595 46 46 46 46-20.595 46-46-20.595-46-46-46zm-43.673-165.346l7.418 136c.347 6.364 5.609 11.346 11.982 11.346h48.546c6.373 0 11.635-4.982 11.982-11.346l7.418-136c.375-6.874-5.098-12.654-11.982-12.654h-63.383c-6.884 0-12.356 5.78-11.981 12.654z\"]\n};\nvar faExpand = {\n prefix: 'fas',\n iconName: 'expand',\n icon: [448, 512, [], \"f065\", \"M0 180V56c0-13.3 10.7-24 24-24h124c6.6 0 12 5.4 12 12v40c0 6.6-5.4 12-12 12H64v84c0 6.6-5.4 12-12 12H12c-6.6 0-12-5.4-12-12zM288 44v40c0 6.6 5.4 12 12 12h84v84c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12V56c0-13.3-10.7-24-24-24H300c-6.6 0-12 5.4-12 12zm148 276h-40c-6.6 0-12 5.4-12 12v84h-84c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h124c13.3 0 24-10.7 24-24V332c0-6.6-5.4-12-12-12zM160 468v-40c0-6.6-5.4-12-12-12H64v-84c0-6.6-5.4-12-12-12H12c-6.6 0-12 5.4-12 12v124c0 13.3 10.7 24 24 24h124c6.6 0 12-5.4 12-12z\"]\n};\nvar faExpandArrowsAlt = {\n prefix: 'fas',\n iconName: 'expand-arrows-alt',\n icon: [448, 512, [], \"f31e\", \"M448.1 344v112c0 13.3-10.7 24-24 24h-112c-21.4 0-32.1-25.9-17-41l36.2-36.2L224 295.6 116.8 402.9 153 439c15.1 15.1 4.4 41-17 41H24c-13.3 0-24-10.7-24-24V344c0-21.4 25.9-32.1 41-17l36.2 36.2L184.5 256 77.2 148.7 41 185c-15.1 15.1-41 4.4-41-17V56c0-13.3 10.7-24 24-24h112c21.4 0 32.1 25.9 17 41l-36.2 36.2L224 216.4l107.3-107.3L295.1 73c-15.1-15.1-4.4-41 17-41h112c13.3 0 24 10.7 24 24v112c0 21.4-25.9 32.1-41 17l-36.2-36.2L263.6 256l107.3 107.3 36.2-36.2c15.1-15.2 41-4.5 41 16.9z\"]\n};\nvar faExternalLinkAlt = {\n prefix: 'fas',\n iconName: 'external-link-alt',\n icon: [576, 512, [], \"f35d\", \"M576 24v127.984c0 21.461-25.96 31.98-40.971 16.971l-35.707-35.709-243.523 243.523c-9.373 9.373-24.568 9.373-33.941 0l-22.627-22.627c-9.373-9.373-9.373-24.569 0-33.941L442.756 76.676l-35.703-35.705C391.982 25.9 402.656 0 424.024 0H552c13.255 0 24 10.745 24 24zM407.029 270.794l-16 16A23.999 23.999 0 0 0 384 303.765V448H64V128h264a24.003 24.003 0 0 0 16.97-7.029l16-16C376.089 89.851 365.381 64 344 64H48C21.49 64 0 85.49 0 112v352c0 26.51 21.49 48 48 48h352c26.51 0 48-21.49 48-48V287.764c0-21.382-25.852-32.09-40.971-16.97z\"]\n};\nvar faExternalLinkSquareAlt = {\n prefix: 'fas',\n iconName: 'external-link-square-alt',\n icon: [448, 512, [], \"f360\", \"M448 80v352c0 26.51-21.49 48-48 48H48c-26.51 0-48-21.49-48-48V80c0-26.51 21.49-48 48-48h352c26.51 0 48 21.49 48 48zm-88 16H248.029c-21.313 0-32.08 25.861-16.971 40.971l31.984 31.987L67.515 364.485c-4.686 4.686-4.686 12.284 0 16.971l31.029 31.029c4.687 4.686 12.285 4.686 16.971 0l195.526-195.526 31.988 31.991C358.058 263.977 384 253.425 384 231.979V120c0-13.255-10.745-24-24-24z\"]\n};\nvar faEye = {\n prefix: 'fas',\n iconName: 'eye',\n icon: [576, 512, [], \"f06e\", \"M572.52 241.4C518.29 135.59 410.93 64 288 64S57.68 135.64 3.48 241.41a32.35 32.35 0 0 0 0 29.19C57.71 376.41 165.07 448 288 448s230.32-71.64 284.52-177.41a32.35 32.35 0 0 0 0-29.19zM288 400a144 144 0 1 1 144-144 143.93 143.93 0 0 1-144 144zm0-240a95.31 95.31 0 0 0-25.31 3.79 47.85 47.85 0 0 1-66.9 66.9A95.78 95.78 0 1 0 288 160z\"]\n};\nvar faEyeDropper = {\n prefix: 'fas',\n iconName: 'eye-dropper',\n icon: [512, 512, [], \"f1fb\", \"M50.75 333.25c-12 12-18.75 28.28-18.75 45.26V424L0 480l32 32 56-32h45.49c16.97 0 33.25-6.74 45.25-18.74l126.64-126.62-128-128L50.75 333.25zM483.88 28.12c-37.47-37.5-98.28-37.5-135.75 0l-77.09 77.09-13.1-13.1c-9.44-9.44-24.65-9.31-33.94 0l-40.97 40.97c-9.37 9.37-9.37 24.57 0 33.94l161.94 161.94c9.44 9.44 24.65 9.31 33.94 0L419.88 288c9.37-9.37 9.37-24.57 0-33.94l-13.1-13.1 77.09-77.09c37.51-37.48 37.51-98.26.01-135.75z\"]\n};\nvar faEyeSlash = {\n prefix: 'fas',\n iconName: 'eye-slash',\n icon: [640, 512, [], \"f070\", \"M320 400c-75.85 0-137.25-58.71-142.9-133.11L72.2 185.82c-13.79 17.3-26.48 35.59-36.72 55.59a32.35 32.35 0 0 0 0 29.19C89.71 376.41 197.07 448 320 448c26.91 0 52.87-4 77.89-10.46L346 397.39a144.13 144.13 0 0 1-26 2.61zm313.82 58.1l-110.55-85.44a331.25 331.25 0 0 0 81.25-102.07 32.35 32.35 0 0 0 0-29.19C550.29 135.59 442.93 64 320 64a308.15 308.15 0 0 0-147.32 37.7L45.46 3.37A16 16 0 0 0 23 6.18L3.37 31.45A16 16 0 0 0 6.18 53.9l588.36 454.73a16 16 0 0 0 22.46-2.81l19.64-25.27a16 16 0 0 0-2.82-22.45zm-183.72-142l-39.3-30.38A94.75 94.75 0 0 0 416 256a94.76 94.76 0 0 0-121.31-92.21A47.65 47.65 0 0 1 304 192a46.64 46.64 0 0 1-1.54 10l-73.61-56.89A142.31 142.31 0 0 1 320 112a143.92 143.92 0 0 1 144 144c0 21.63-5.29 41.79-13.9 60.11z\"]\n};\nvar faFastBackward = {\n prefix: 'fas',\n iconName: 'fast-backward',\n icon: [512, 512, [], \"f049\", \"M0 436V76c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v151.9L235.5 71.4C256.1 54.3 288 68.6 288 96v131.9L459.5 71.4C480.1 54.3 512 68.6 512 96v320c0 27.4-31.9 41.7-52.5 24.6L288 285.3V416c0 27.4-31.9 41.7-52.5 24.6L64 285.3V436c0 6.6-5.4 12-12 12H12c-6.6 0-12-5.4-12-12z\"]\n};\nvar faFastForward = {\n prefix: 'fas',\n iconName: 'fast-forward',\n icon: [512, 512, [], \"f050\", \"M512 76v360c0 6.6-5.4 12-12 12h-40c-6.6 0-12-5.4-12-12V284.1L276.5 440.6c-20.6 17.2-52.5 2.8-52.5-24.6V284.1L52.5 440.6C31.9 457.8 0 443.4 0 416V96c0-27.4 31.9-41.7 52.5-24.6L224 226.8V96c0-27.4 31.9-41.7 52.5-24.6L448 226.8V76c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12z\"]\n};\nvar faFax = {\n prefix: 'fas',\n iconName: 'fax',\n icon: [512, 512, [], \"f1ac\", \"M64 128H32c-17.67 0-32 14.33-32 32v320c0 17.67 14.33 32 32 32h32c17.67 0 32-14.33 32-32V160c0-17.67-14.33-32-32-32zm416 32V77.25c0-8.49-3.37-16.62-9.37-22.63L425.37 9.37c-6-6-14.14-9.37-22.63-9.37H160c-17.67 0-32 14.33-32 32v448c0 17.67 14.33 32 32 32h320c17.67 0 32-14.33 32-32V192c0-17.67-14.33-32-32-32zM288 432c0 8.84-7.16 16-16 16h-32c-8.84 0-16-7.16-16-16v-32c0-8.84 7.16-16 16-16h32c8.84 0 16 7.16 16 16v32zm0-128c0 8.84-7.16 16-16 16h-32c-8.84 0-16-7.16-16-16v-32c0-8.84 7.16-16 16-16h32c8.84 0 16 7.16 16 16v32zm128 128c0 8.84-7.16 16-16 16h-32c-8.84 0-16-7.16-16-16v-32c0-8.84 7.16-16 16-16h32c8.84 0 16 7.16 16 16v32zm0-128c0 8.84-7.16 16-16 16h-32c-8.84 0-16-7.16-16-16v-32c0-8.84 7.16-16 16-16h32c8.84 0 16 7.16 16 16v32zm16-112H176V48h208v32c0 8.84 7.16 16 16 16h32v96z\"]\n};\nvar faFeather = {\n prefix: 'fas',\n iconName: 'feather',\n icon: [512, 512, [], \"f52d\", \"M467.14 44.84c-62.55-62.48-161.67-64.78-252.28 25.73-78.61 78.52-60.98 60.92-85.75 85.66-60.46 60.39-70.39 150.83-63.64 211.17l178.44-178.25c6.26-6.25 16.4-6.25 22.65 0s6.25 16.38 0 22.63L7.04 471.03c-9.38 9.37-9.38 24.57 0 33.94 9.38 9.37 24.6 9.37 33.98 0l66.1-66.03C159.42 454.65 279 457.11 353.95 384h-98.19l147.57-49.14c49.99-49.93 36.38-36.18 46.31-46.86h-97.78l131.54-43.8c45.44-74.46 34.31-148.84-16.26-199.36z\"]\n};\nvar faFeatherAlt = {\n prefix: 'fas',\n iconName: 'feather-alt',\n icon: [512, 512, [], \"f56b\", \"M512 0C460.22 3.56 96.44 38.2 71.01 287.61c-3.09 26.66-4.84 53.44-5.99 80.24l178.87-178.69c6.25-6.25 16.4-6.25 22.65 0s6.25 16.38 0 22.63L7.04 471.03c-9.38 9.37-9.38 24.57 0 33.94 9.38 9.37 24.59 9.37 33.98 0l57.13-57.07c42.09-.14 84.15-2.53 125.96-7.36 53.48-5.44 97.02-26.47 132.58-56.54H255.74l146.79-48.88c11.25-14.89 21.37-30.71 30.45-47.12h-81.14l106.54-53.21C500.29 132.86 510.19 26.26 512 0z\"]\n};\nvar faFemale = {\n prefix: 'fas',\n iconName: 'female',\n icon: [256, 512, [], \"f182\", \"M128 0c35.346 0 64 28.654 64 64s-28.654 64-64 64c-35.346 0-64-28.654-64-64S92.654 0 128 0m119.283 354.179l-48-192A24 24 0 0 0 176 144h-11.36c-22.711 10.443-49.59 10.894-73.28 0H80a24 24 0 0 0-23.283 18.179l-48 192C4.935 369.305 16.383 384 32 384h56v104c0 13.255 10.745 24 24 24h32c13.255 0 24-10.745 24-24V384h56c15.591 0 27.071-14.671 23.283-29.821z\"]\n};\nvar faFighterJet = {\n prefix: 'fas',\n iconName: 'fighter-jet',\n icon: [640, 512, [], \"f0fb\", \"M544 224l-128-16-48-16h-24L227.158 44h39.509C278.333 44 288 41.375 288 38s-9.667-6-21.333-6H152v12h16v164h-48l-66.667-80H18.667L8 138.667V208h8v16h48v2.666l-64 8v42.667l64 8V288H16v16H8v69.333L18.667 384h34.667L120 304h48v164h-16v12h114.667c11.667 0 21.333-2.625 21.333-6s-9.667-6-21.333-6h-39.509L344 320h24l48-16 128-16c96-21.333 96-26.583 96-32 0-5.417 0-10.667-96-32z\"]\n};\nvar faFile = {\n prefix: 'fas',\n iconName: 'file',\n icon: [384, 512, [], \"f15b\", \"M224 136V0H24C10.7 0 0 10.7 0 24v464c0 13.3 10.7 24 24 24h336c13.3 0 24-10.7 24-24V160H248c-13.2 0-24-10.8-24-24zm160-14.1v6.1H256V0h6.1c6.4 0 12.5 2.5 17 7l97.9 98c4.5 4.5 7 10.6 7 16.9z\"]\n};\nvar faFileAlt = {\n prefix: 'fas',\n iconName: 'file-alt',\n icon: [384, 512, [], \"f15c\", \"M224 136V0H24C10.7 0 0 10.7 0 24v464c0 13.3 10.7 24 24 24h336c13.3 0 24-10.7 24-24V160H248c-13.2 0-24-10.8-24-24zm64 236c0 6.6-5.4 12-12 12H108c-6.6 0-12-5.4-12-12v-8c0-6.6 5.4-12 12-12h168c6.6 0 12 5.4 12 12v8zm0-64c0 6.6-5.4 12-12 12H108c-6.6 0-12-5.4-12-12v-8c0-6.6 5.4-12 12-12h168c6.6 0 12 5.4 12 12v8zm0-72v8c0 6.6-5.4 12-12 12H108c-6.6 0-12-5.4-12-12v-8c0-6.6 5.4-12 12-12h168c6.6 0 12 5.4 12 12zm96-114.1v6.1H256V0h6.1c6.4 0 12.5 2.5 17 7l97.9 98c4.5 4.5 7 10.6 7 16.9z\"]\n};\nvar faFileArchive = {\n prefix: 'fas',\n iconName: 'file-archive',\n icon: [384, 512, [], \"f1c6\", \"M377 105L279.1 7c-4.5-4.5-10.6-7-17-7H256v128h128v-6.1c0-6.3-2.5-12.4-7-16.9zM128.4 336c-17.9 0-32.4 12.1-32.4 27 0 15 14.6 27 32.5 27s32.4-12.1 32.4-27-14.6-27-32.5-27zM224 136V0h-63.6v32h-32V0H24C10.7 0 0 10.7 0 24v464c0 13.3 10.7 24 24 24h336c13.3 0 24-10.7 24-24V160H248c-13.2 0-24-10.8-24-24zM95.9 32h32v32h-32zm32.3 384c-33.2 0-58-30.4-51.4-62.9L96.4 256v-32h32v-32h-32v-32h32v-32h-32V96h32V64h32v32h-32v32h32v32h-32v32h32v32h-32v32h22.1c5.7 0 10.7 4.1 11.8 9.7l17.3 87.7c6.4 32.4-18.4 62.6-51.4 62.6z\"]\n};\nvar faFileAudio = {\n prefix: 'fas',\n iconName: 'file-audio',\n icon: [384, 512, [], \"f1c7\", \"M224 136V0H24C10.7 0 0 10.7 0 24v464c0 13.3 10.7 24 24 24h336c13.3 0 24-10.7 24-24V160H248c-13.2 0-24-10.8-24-24zm-64 268c0 10.7-12.9 16-20.5 8.5L104 376H76c-6.6 0-12-5.4-12-12v-56c0-6.6 5.4-12 12-12h28l35.5-36.5c7.6-7.6 20.5-2.2 20.5 8.5v136zm33.2-47.6c9.1-9.3 9.1-24.1 0-33.4-22.1-22.8 12.2-56.2 34.4-33.5 27.2 27.9 27.2 72.4 0 100.4-21.8 22.3-56.9-10.4-34.4-33.5zm86-117.1c54.4 55.9 54.4 144.8 0 200.8-21.8 22.4-57-10.3-34.4-33.5 36.2-37.2 36.3-96.5 0-133.8-22.1-22.8 12.3-56.3 34.4-33.5zM384 121.9v6.1H256V0h6.1c6.4 0 12.5 2.5 17 7l97.9 98c4.5 4.5 7 10.6 7 16.9z\"]\n};\nvar faFileCode = {\n prefix: 'fas',\n iconName: 'file-code',\n icon: [384, 512, [], \"f1c9\", \"M384 121.941V128H256V0h6.059c6.365 0 12.47 2.529 16.971 7.029l97.941 97.941A24.005 24.005 0 0 1 384 121.941zM248 160c-13.2 0-24-10.8-24-24V0H24C10.745 0 0 10.745 0 24v464c0 13.255 10.745 24 24 24h336c13.255 0 24-10.745 24-24V160H248zM123.206 400.505a5.4 5.4 0 0 1-7.633.246l-64.866-60.812a5.4 5.4 0 0 1 0-7.879l64.866-60.812a5.4 5.4 0 0 1 7.633.246l19.579 20.885a5.4 5.4 0 0 1-.372 7.747L101.65 336l40.763 35.874a5.4 5.4 0 0 1 .372 7.747l-19.579 20.884zm51.295 50.479l-27.453-7.97a5.402 5.402 0 0 1-3.681-6.692l61.44-211.626a5.402 5.402 0 0 1 6.692-3.681l27.452 7.97a5.4 5.4 0 0 1 3.68 6.692l-61.44 211.626a5.397 5.397 0 0 1-6.69 3.681zm160.792-111.045l-64.866 60.812a5.4 5.4 0 0 1-7.633-.246l-19.58-20.885a5.4 5.4 0 0 1 .372-7.747L284.35 336l-40.763-35.874a5.4 5.4 0 0 1-.372-7.747l19.58-20.885a5.4 5.4 0 0 1 7.633-.246l64.866 60.812a5.4 5.4 0 0 1-.001 7.879z\"]\n};\nvar faFileContract = {\n prefix: 'fas',\n iconName: 'file-contract',\n icon: [384, 512, [], \"f56c\", \"M224 136V0H24C10.7 0 0 10.7 0 24v464c0 13.3 10.7 24 24 24h336c13.3 0 24-10.7 24-24V160H248c-13.2 0-24-10.8-24-24zM64 72c0-4.42 3.58-8 8-8h80c4.42 0 8 3.58 8 8v16c0 4.42-3.58 8-8 8H72c-4.42 0-8-3.58-8-8V72zm0 64c0-4.42 3.58-8 8-8h80c4.42 0 8 3.58 8 8v16c0 4.42-3.58 8-8 8H72c-4.42 0-8-3.58-8-8v-16zm192.81 248H304c8.84 0 16 7.16 16 16s-7.16 16-16 16h-47.19c-16.45 0-31.27-9.14-38.64-23.86-2.95-5.92-8.09-6.52-10.17-6.52s-7.22.59-10.02 6.19l-7.67 15.34a15.986 15.986 0 0 1-14.31 8.84c-.38 0-.75-.02-1.14-.05-6.45-.45-12-4.75-14.03-10.89L144 354.59l-10.61 31.88c-5.89 17.66-22.38 29.53-41 29.53H80c-8.84 0-16-7.16-16-16s7.16-16 16-16h12.39c4.83 0 9.11-3.08 10.64-7.66l18.19-54.64c3.3-9.81 12.44-16.41 22.78-16.41s19.48 6.59 22.77 16.41l13.88 41.64c19.77-16.19 54.05-9.7 66 14.16 2.02 4.06 5.96 6.5 10.16 6.5zM377 105L279.1 7c-4.5-4.5-10.6-7-17-7H256v128h128v-6.1c0-6.3-2.5-12.4-7-16.9z\"]\n};\nvar faFileCsv = {\n prefix: 'fas',\n iconName: 'file-csv',\n icon: [384, 512, [], \"f6dd\", \"M224 136V0H24C10.7 0 0 10.7 0 24v464c0 13.3 10.7 24 24 24h336c13.3 0 24-10.7 24-24V160H248c-13.2 0-24-10.8-24-24zm-96 144c0 4.42-3.58 8-8 8h-8c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h8c4.42 0 8 3.58 8 8v16c0 4.42-3.58 8-8 8h-8c-26.51 0-48-21.49-48-48v-32c0-26.51 21.49-48 48-48h8c4.42 0 8 3.58 8 8v16zm44.27 104H160c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h12.27c5.95 0 10.41-3.5 10.41-6.62 0-1.3-.75-2.66-2.12-3.84l-21.89-18.77c-8.47-7.22-13.33-17.48-13.33-28.14 0-21.3 19.02-38.62 42.41-38.62H200c4.42 0 8 3.58 8 8v16c0 4.42-3.58 8-8 8h-12.27c-5.95 0-10.41 3.5-10.41 6.62 0 1.3.75 2.66 2.12 3.84l21.89 18.77c8.47 7.22 13.33 17.48 13.33 28.14.01 21.29-19 38.62-42.39 38.62zM256 264v20.8c0 20.27 5.7 40.17 16 56.88 10.3-16.7 16-36.61 16-56.88V264c0-4.42 3.58-8 8-8h16c4.42 0 8 3.58 8 8v20.8c0 35.48-12.88 68.89-36.28 94.09-3.02 3.25-7.27 5.11-11.72 5.11s-8.7-1.86-11.72-5.11c-23.4-25.2-36.28-58.61-36.28-94.09V264c0-4.42 3.58-8 8-8h16c4.42 0 8 3.58 8 8zm121-159L279.1 7c-4.5-4.5-10.6-7-17-7H256v128h128v-6.1c0-6.3-2.5-12.4-7-16.9z\"]\n};\nvar faFileDownload = {\n prefix: 'fas',\n iconName: 'file-download',\n icon: [384, 512, [], \"f56d\", \"M224 136V0H24C10.7 0 0 10.7 0 24v464c0 13.3 10.7 24 24 24h336c13.3 0 24-10.7 24-24V160H248c-13.2 0-24-10.8-24-24zm76.45 211.36l-96.42 95.7c-6.65 6.61-17.39 6.61-24.04 0l-96.42-95.7C73.42 337.29 80.54 320 94.82 320H160v-80c0-8.84 7.16-16 16-16h32c8.84 0 16 7.16 16 16v80h65.18c14.28 0 21.4 17.29 11.27 27.36zM377 105L279.1 7c-4.5-4.5-10.6-7-17-7H256v128h128v-6.1c0-6.3-2.5-12.4-7-16.9z\"]\n};\nvar faFileExcel = {\n prefix: 'fas',\n iconName: 'file-excel',\n icon: [384, 512, [], \"f1c3\", \"M224 136V0H24C10.7 0 0 10.7 0 24v464c0 13.3 10.7 24 24 24h336c13.3 0 24-10.7 24-24V160H248c-13.2 0-24-10.8-24-24zm60.1 106.5L224 336l60.1 93.5c5.1 8-.6 18.5-10.1 18.5h-34.9c-4.4 0-8.5-2.4-10.6-6.3C208.9 405.5 192 373 192 373c-6.4 14.8-10 20-36.6 68.8-2.1 3.9-6.1 6.3-10.5 6.3H110c-9.5 0-15.2-10.5-10.1-18.5l60.3-93.5-60.3-93.5c-5.2-8 .6-18.5 10.1-18.5h34.8c4.4 0 8.5 2.4 10.6 6.3 26.1 48.8 20 33.6 36.6 68.5 0 0 6.1-11.7 36.6-68.5 2.1-3.9 6.2-6.3 10.6-6.3H274c9.5-.1 15.2 10.4 10.1 18.4zM384 121.9v6.1H256V0h6.1c6.4 0 12.5 2.5 17 7l97.9 98c4.5 4.5 7 10.6 7 16.9z\"]\n};\nvar faFileExport = {\n prefix: 'fas',\n iconName: 'file-export',\n icon: [576, 512, [], \"f56e\", \"M384 121.9c0-6.3-2.5-12.4-7-16.9L279.1 7c-4.5-4.5-10.6-7-17-7H256v128h128zM571 308l-95.7-96.4c-10.1-10.1-27.4-3-27.4 11.3V288h-64v64h64v65.2c0 14.3 17.3 21.4 27.4 11.3L571 332c6.6-6.6 6.6-17.4 0-24zm-379 28v-32c0-8.8 7.2-16 16-16h176V160H248c-13.2 0-24-10.8-24-24V0H24C10.7 0 0 10.7 0 24v464c0 13.3 10.7 24 24 24h336c13.3 0 24-10.7 24-24V352H208c-8.8 0-16-7.2-16-16z\"]\n};\nvar faFileImage = {\n prefix: 'fas',\n iconName: 'file-image',\n icon: [384, 512, [], \"f1c5\", \"M384 121.941V128H256V0h6.059a24 24 0 0 1 16.97 7.029l97.941 97.941a24.002 24.002 0 0 1 7.03 16.971zM248 160c-13.2 0-24-10.8-24-24V0H24C10.745 0 0 10.745 0 24v464c0 13.255 10.745 24 24 24h336c13.255 0 24-10.745 24-24V160H248zm-135.455 16c26.51 0 48 21.49 48 48s-21.49 48-48 48-48-21.49-48-48 21.491-48 48-48zm208 240h-256l.485-48.485L104.545 328c4.686-4.686 11.799-4.201 16.485.485L160.545 368 264.06 264.485c4.686-4.686 12.284-4.686 16.971 0L320.545 304v112z\"]\n};\nvar faFileImport = {\n prefix: 'fas',\n iconName: 'file-import',\n icon: [512, 512, [], \"f56f\", \"M16 288c-8.8 0-16 7.2-16 16v32c0 8.8 7.2 16 16 16h112v-64zm489-183L407.1 7c-4.5-4.5-10.6-7-17-7H384v128h128v-6.1c0-6.3-2.5-12.4-7-16.9zm-153 31V0H152c-13.3 0-24 10.7-24 24v264h128v-65.2c0-14.3 17.3-21.4 27.4-11.3L379 308c6.6 6.7 6.6 17.4 0 24l-95.7 96.4c-10.1 10.1-27.4 3-27.4-11.3V352H128v136c0 13.3 10.7 24 24 24h336c13.3 0 24-10.7 24-24V160H376c-13.2 0-24-10.8-24-24z\"]\n};\nvar faFileInvoice = {\n prefix: 'fas',\n iconName: 'file-invoice',\n icon: [384, 512, [], \"f570\", \"M288 256H96v64h192v-64zm89-151L279.1 7c-4.5-4.5-10.6-7-17-7H256v128h128v-6.1c0-6.3-2.5-12.4-7-16.9zm-153 31V0H24C10.7 0 0 10.7 0 24v464c0 13.3 10.7 24 24 24h336c13.3 0 24-10.7 24-24V160H248c-13.2 0-24-10.8-24-24zM64 72c0-4.42 3.58-8 8-8h80c4.42 0 8 3.58 8 8v16c0 4.42-3.58 8-8 8H72c-4.42 0-8-3.58-8-8V72zm0 64c0-4.42 3.58-8 8-8h80c4.42 0 8 3.58 8 8v16c0 4.42-3.58 8-8 8H72c-4.42 0-8-3.58-8-8v-16zm256 304c0 4.42-3.58 8-8 8h-80c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h80c4.42 0 8 3.58 8 8v16zm0-200v96c0 8.84-7.16 16-16 16H80c-8.84 0-16-7.16-16-16v-96c0-8.84 7.16-16 16-16h224c8.84 0 16 7.16 16 16z\"]\n};\nvar faFileInvoiceDollar = {\n prefix: 'fas',\n iconName: 'file-invoice-dollar',\n icon: [384, 512, [], \"f571\", \"M377 105L279.1 7c-4.5-4.5-10.6-7-17-7H256v128h128v-6.1c0-6.3-2.5-12.4-7-16.9zm-153 31V0H24C10.7 0 0 10.7 0 24v464c0 13.3 10.7 24 24 24h336c13.3 0 24-10.7 24-24V160H248c-13.2 0-24-10.8-24-24zM64 72c0-4.42 3.58-8 8-8h80c4.42 0 8 3.58 8 8v16c0 4.42-3.58 8-8 8H72c-4.42 0-8-3.58-8-8V72zm0 80v-16c0-4.42 3.58-8 8-8h80c4.42 0 8 3.58 8 8v16c0 4.42-3.58 8-8 8H72c-4.42 0-8-3.58-8-8zm144 263.88V440c0 4.42-3.58 8-8 8h-16c-4.42 0-8-3.58-8-8v-24.29c-11.29-.58-22.27-4.52-31.37-11.35-3.9-2.93-4.1-8.77-.57-12.14l11.75-11.21c2.77-2.64 6.89-2.76 10.13-.73 3.87 2.42 8.26 3.72 12.82 3.72h28.11c6.5 0 11.8-5.92 11.8-13.19 0-5.95-3.61-11.19-8.77-12.73l-45-13.5c-18.59-5.58-31.58-23.42-31.58-43.39 0-24.52 19.05-44.44 42.67-45.07V232c0-4.42 3.58-8 8-8h16c4.42 0 8 3.58 8 8v24.29c11.29.58 22.27 4.51 31.37 11.35 3.9 2.93 4.1 8.77.57 12.14l-11.75 11.21c-2.77 2.64-6.89 2.76-10.13.73-3.87-2.43-8.26-3.72-12.82-3.72h-28.11c-6.5 0-11.8 5.92-11.8 13.19 0 5.95 3.61 11.19 8.77 12.73l45 13.5c18.59 5.58 31.58 23.42 31.58 43.39 0 24.53-19.05 44.44-42.67 45.07z\"]\n};\nvar faFileMedical = {\n prefix: 'fas',\n iconName: 'file-medical',\n icon: [384, 512, [], \"f477\", \"M377 105L279.1 7c-4.5-4.5-10.6-7-17-7H256v128h128v-6.1c0-6.3-2.5-12.4-7-16.9zm-153 31V0H24C10.7 0 0 10.7 0 24v464c0 13.3 10.7 24 24 24h336c13.3 0 24-10.7 24-24V160H248c-13.2 0-24-10.8-24-24zm64 160v48c0 4.4-3.6 8-8 8h-56v56c0 4.4-3.6 8-8 8h-48c-4.4 0-8-3.6-8-8v-56h-56c-4.4 0-8-3.6-8-8v-48c0-4.4 3.6-8 8-8h56v-56c0-4.4 3.6-8 8-8h48c4.4 0 8 3.6 8 8v56h56c4.4 0 8 3.6 8 8z\"]\n};\nvar faFileMedicalAlt = {\n prefix: 'fas',\n iconName: 'file-medical-alt',\n icon: [448, 512, [], \"f478\", \"M288 136V0H88C74.7 0 64 10.7 64 24v232H8c-4.4 0-8 3.6-8 8v16c0 4.4 3.6 8 8 8h140.9c3 0 5.8 1.7 7.2 4.4l19.9 39.8 56.8-113.7c2.9-5.9 11.4-5.9 14.3 0l34.7 69.5H352c8.8 0 16 7.2 16 16s-7.2 16-16 16h-89.9L240 275.8l-56.8 113.7c-2.9 5.9-11.4 5.9-14.3 0L134.1 320H64v168c0 13.3 10.7 24 24 24h336c13.3 0 24-10.7 24-24V160H312c-13.2 0-24-10.8-24-24zm153-31L343.1 7c-4.5-4.5-10.6-7-17-7H320v128h128v-6.1c0-6.3-2.5-12.4-7-16.9z\"]\n};\nvar faFilePdf = {\n prefix: 'fas',\n iconName: 'file-pdf',\n icon: [384, 512, [], \"f1c1\", \"M181.9 256.1c-5-16-4.9-46.9-2-46.9 8.4 0 7.6 36.9 2 46.9zm-1.7 47.2c-7.7 20.2-17.3 43.3-28.4 62.7 18.3-7 39-17.2 62.9-21.9-12.7-9.6-24.9-23.4-34.5-40.8zM86.1 428.1c0 .8 13.2-5.4 34.9-40.2-6.7 6.3-29.1 24.5-34.9 40.2zM248 160h136v328c0 13.3-10.7 24-24 24H24c-13.3 0-24-10.7-24-24V24C0 10.7 10.7 0 24 0h200v136c0 13.2 10.8 24 24 24zm-8 171.8c-20-12.2-33.3-29-42.7-53.8 4.5-18.5 11.6-46.6 6.2-64.2-4.7-29.4-42.4-26.5-47.8-6.8-5 18.3-.4 44.1 8.1 77-11.6 27.6-28.7 64.6-40.8 85.8-.1 0-.1.1-.2.1-27.1 13.9-73.6 44.5-54.5 68 5.6 6.9 16 10 21.5 10 17.9 0 35.7-18 61.1-61.8 25.8-8.5 54.1-19.1 79-23.2 21.7 11.8 47.1 19.5 64 19.5 29.2 0 31.2-32 19.7-43.4-13.9-13.6-54.3-9.7-73.6-7.2zM377 105L279 7c-4.5-4.5-10.6-7-17-7h-6v128h128v-6.1c0-6.3-2.5-12.4-7-16.9zm-74.1 255.3c4.1-2.7-2.5-11.9-42.8-9 37.1 15.8 42.8 9 42.8 9z\"]\n};\nvar faFilePowerpoint = {\n prefix: 'fas',\n iconName: 'file-powerpoint',\n icon: [384, 512, [], \"f1c4\", \"M193.7 271.2c8.8 0 15.5 2.7 20.3 8.1 9.6 10.9 9.8 32.7-.2 44.1-4.9 5.6-11.9 8.5-21.1 8.5h-26.9v-60.7h27.9zM377 105L279 7c-4.5-4.5-10.6-7-17-7h-6v128h128v-6.1c0-6.3-2.5-12.4-7-16.9zm-153 31V0H24C10.7 0 0 10.7 0 24v464c0 13.3 10.7 24 24 24h336c13.3 0 24-10.7 24-24V160H248c-13.2 0-24-10.8-24-24zm53 165.2c0 90.3-88.8 77.6-111.1 77.6V436c0 6.6-5.4 12-12 12h-30.8c-6.6 0-12-5.4-12-12V236.2c0-6.6 5.4-12 12-12h81c44.5 0 72.9 32.8 72.9 77z\"]\n};\nvar faFilePrescription = {\n prefix: 'fas',\n iconName: 'file-prescription',\n icon: [384, 512, [], \"f572\", \"M224 136V0H24C10.7 0 0 10.7 0 24v464c0 13.3 10.7 24 24 24h336c13.3 0 24-10.7 24-24V160H248c-13.2 0-24-10.8-24-24zm68.53 179.48l11.31 11.31c6.25 6.25 6.25 16.38 0 22.63l-29.9 29.9L304 409.38c6.25 6.25 6.25 16.38 0 22.63l-11.31 11.31c-6.25 6.25-16.38 6.25-22.63 0L240 413.25l-30.06 30.06c-6.25 6.25-16.38 6.25-22.63 0L176 432c-6.25-6.25-6.25-16.38 0-22.63l30.06-30.06L146.74 320H128v48c0 8.84-7.16 16-16 16H96c-8.84 0-16-7.16-16-16V208c0-8.84 7.16-16 16-16h80c35.35 0 64 28.65 64 64 0 24.22-13.62 45.05-33.46 55.92L240 345.38l29.9-29.9c6.25-6.25 16.38-6.25 22.63 0zM176 272h-48v-32h48c8.82 0 16 7.18 16 16s-7.18 16-16 16zm208-150.1v6.1H256V0h6.1c6.4 0 12.5 2.5 17 7l97.9 98c4.5 4.5 7 10.6 7 16.9z\"]\n};\nvar faFileSignature = {\n prefix: 'fas',\n iconName: 'file-signature',\n icon: [576, 512, [], \"f573\", \"M218.17 424.14c-2.95-5.92-8.09-6.52-10.17-6.52s-7.22.59-10.02 6.19l-7.67 15.34c-6.37 12.78-25.03 11.37-29.48-2.09L144 386.59l-10.61 31.88c-5.89 17.66-22.38 29.53-41 29.53H80c-8.84 0-16-7.16-16-16s7.16-16 16-16h12.39c4.83 0 9.11-3.08 10.64-7.66l18.19-54.64c3.3-9.81 12.44-16.41 22.78-16.41s19.48 6.59 22.77 16.41l13.88 41.64c19.75-16.19 54.06-9.7 66 14.16 1.89 3.78 5.49 5.95 9.36 6.26v-82.12l128-127.09V160H248c-13.2 0-24-10.8-24-24V0H24C10.7 0 0 10.7 0 24v464c0 13.3 10.7 24 24 24h336c13.3 0 24-10.7 24-24v-40l-128-.11c-16.12-.31-30.58-9.28-37.83-23.75zM384 121.9c0-6.3-2.5-12.4-7-16.9L279.1 7c-4.5-4.5-10.6-7-17-7H256v128h128v-6.1zm-96 225.06V416h68.99l161.68-162.78-67.88-67.88L288 346.96zm280.54-179.63l-31.87-31.87c-9.94-9.94-26.07-9.94-36.01 0l-27.25 27.25 67.88 67.88 27.25-27.25c9.95-9.94 9.95-26.07 0-36.01z\"]\n};\nvar faFileUpload = {\n prefix: 'fas',\n iconName: 'file-upload',\n icon: [384, 512, [], \"f574\", \"M224 136V0H24C10.7 0 0 10.7 0 24v464c0 13.3 10.7 24 24 24h336c13.3 0 24-10.7 24-24V160H248c-13.2 0-24-10.8-24-24zm65.18 216.01H224v80c0 8.84-7.16 16-16 16h-32c-8.84 0-16-7.16-16-16v-80H94.82c-14.28 0-21.41-17.29-11.27-27.36l96.42-95.7c6.65-6.61 17.39-6.61 24.04 0l96.42 95.7c10.15 10.07 3.03 27.36-11.25 27.36zM377 105L279.1 7c-4.5-4.5-10.6-7-17-7H256v128h128v-6.1c0-6.3-2.5-12.4-7-16.9z\"]\n};\nvar faFileVideo = {\n prefix: 'fas',\n iconName: 'file-video',\n icon: [384, 512, [], \"f1c8\", \"M384 121.941V128H256V0h6.059c6.365 0 12.47 2.529 16.971 7.029l97.941 97.941A24.005 24.005 0 0 1 384 121.941zM224 136V0H24C10.745 0 0 10.745 0 24v464c0 13.255 10.745 24 24 24h336c13.255 0 24-10.745 24-24V160H248c-13.2 0-24-10.8-24-24zm96 144.016v111.963c0 21.445-25.943 31.998-40.971 16.971L224 353.941V392c0 13.255-10.745 24-24 24H88c-13.255 0-24-10.745-24-24V280c0-13.255 10.745-24 24-24h112c13.255 0 24 10.745 24 24v38.059l55.029-55.013c15.011-15.01 40.971-4.491 40.971 16.97z\"]\n};\nvar faFileWord = {\n prefix: 'fas',\n iconName: 'file-word',\n icon: [384, 512, [], \"f1c2\", \"M224 136V0H24C10.7 0 0 10.7 0 24v464c0 13.3 10.7 24 24 24h336c13.3 0 24-10.7 24-24V160H248c-13.2 0-24-10.8-24-24zm57.1 120H305c7.7 0 13.4 7.1 11.7 14.7l-38 168c-1.2 5.5-6.1 9.3-11.7 9.3h-38c-5.5 0-10.3-3.8-11.6-9.1-25.8-103.5-20.8-81.2-25.6-110.5h-.5c-1.1 14.3-2.4 17.4-25.6 110.5-1.3 5.3-6.1 9.1-11.6 9.1H117c-5.6 0-10.5-3.9-11.7-9.4l-37.8-168c-1.7-7.5 4-14.6 11.7-14.6h24.5c5.7 0 10.7 4 11.8 9.7 15.6 78 20.1 109.5 21 122.2 1.6-10.2 7.3-32.7 29.4-122.7 1.3-5.4 6.1-9.1 11.7-9.1h29.1c5.6 0 10.4 3.8 11.7 9.2 24 100.4 28.8 124 29.6 129.4-.2-11.2-2.6-17.8 21.6-129.2 1-5.6 5.9-9.5 11.5-9.5zM384 121.9v6.1H256V0h6.1c6.4 0 12.5 2.5 17 7l97.9 98c4.5 4.5 7 10.6 7 16.9z\"]\n};\nvar faFill = {\n prefix: 'fas',\n iconName: 'fill',\n icon: [512, 512, [], \"f575\", \"M502.63 217.06L294.94 9.37C288.69 3.12 280.5 0 272.31 0s-16.38 3.12-22.62 9.37l-81.58 81.58L81.93 4.77c-6.24-6.25-16.38-6.25-22.62 0L36.69 27.38c-6.24 6.25-6.24 16.38 0 22.63l86.19 86.18-94.76 94.76c-37.49 37.49-37.49 98.26 0 135.75l117.19 117.19c18.75 18.74 43.31 28.12 67.87 28.12 24.57 0 49.13-9.37 67.88-28.12l221.57-221.57c12.49-12.5 12.49-32.76 0-45.26zm-116.22 70.97H65.93c1.36-3.84 3.57-7.98 7.43-11.83l13.15-13.15 81.61-81.61 58.61 58.6c12.49 12.49 32.75 12.49 45.24 0 12.49-12.49 12.49-32.75 0-45.24l-58.61-58.6 58.95-58.95 162.45 162.44-48.35 48.34z\"]\n};\nvar faFillDrip = {\n prefix: 'fas',\n iconName: 'fill-drip',\n icon: [576, 512, [], \"f576\", \"M512 320s-64 92.65-64 128c0 35.35 28.66 64 64 64s64-28.65 64-64-64-128-64-128zm-9.37-102.94L294.94 9.37C288.69 3.12 280.5 0 272.31 0s-16.38 3.12-22.62 9.37l-81.58 81.58L81.93 4.76c-6.25-6.25-16.38-6.25-22.62 0L36.69 27.38c-6.24 6.25-6.24 16.38 0 22.62l86.19 86.18-94.76 94.76c-37.49 37.48-37.49 98.26 0 135.75l117.19 117.19c18.74 18.74 43.31 28.12 67.87 28.12 24.57 0 49.13-9.37 67.87-28.12l221.57-221.57c12.5-12.5 12.5-32.75.01-45.25zm-116.22 70.97H65.93c1.36-3.84 3.57-7.98 7.43-11.83l13.15-13.15 81.61-81.61 58.6 58.6c12.49 12.49 32.75 12.49 45.24 0s12.49-32.75 0-45.24l-58.6-58.6 58.95-58.95 162.44 162.44-48.34 48.34z\"]\n};\nvar faFilm = {\n prefix: 'fas',\n iconName: 'film',\n icon: [512, 512, [], \"f008\", \"M488 64h-8v20c0 6.6-5.4 12-12 12h-40c-6.6 0-12-5.4-12-12V64H96v20c0 6.6-5.4 12-12 12H44c-6.6 0-12-5.4-12-12V64h-8C10.7 64 0 74.7 0 88v336c0 13.3 10.7 24 24 24h8v-20c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v20h320v-20c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v20h8c13.3 0 24-10.7 24-24V88c0-13.3-10.7-24-24-24zM96 372c0 6.6-5.4 12-12 12H44c-6.6 0-12-5.4-12-12v-40c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v40zm0-96c0 6.6-5.4 12-12 12H44c-6.6 0-12-5.4-12-12v-40c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v40zm0-96c0 6.6-5.4 12-12 12H44c-6.6 0-12-5.4-12-12v-40c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v40zm272 208c0 6.6-5.4 12-12 12H156c-6.6 0-12-5.4-12-12v-96c0-6.6 5.4-12 12-12h200c6.6 0 12 5.4 12 12v96zm0-168c0 6.6-5.4 12-12 12H156c-6.6 0-12-5.4-12-12v-96c0-6.6 5.4-12 12-12h200c6.6 0 12 5.4 12 12v96zm112 152c0 6.6-5.4 12-12 12h-40c-6.6 0-12-5.4-12-12v-40c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v40zm0-96c0 6.6-5.4 12-12 12h-40c-6.6 0-12-5.4-12-12v-40c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v40zm0-96c0 6.6-5.4 12-12 12h-40c-6.6 0-12-5.4-12-12v-40c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v40z\"]\n};\nvar faFilter = {\n prefix: 'fas',\n iconName: 'filter',\n icon: [512, 512, [], \"f0b0\", \"M487.976 0H24.028C2.71 0-8.047 25.866 7.058 40.971L192 225.941V432c0 7.831 3.821 15.17 10.237 19.662l80 55.98C298.02 518.69 320 507.493 320 487.98V225.941l184.947-184.97C520.021 25.896 509.338 0 487.976 0z\"]\n};\nvar faFingerprint = {\n prefix: 'fas',\n iconName: 'fingerprint',\n icon: [512, 512, [], \"f577\", \"M256.12 245.96c-13.25 0-24 10.74-24 24 1.14 72.25-8.14 141.9-27.7 211.55-2.73 9.72 2.15 30.49 23.12 30.49 10.48 0 20.11-6.92 23.09-17.52 13.53-47.91 31.04-125.41 29.48-224.52.01-13.25-10.73-24-23.99-24zm-.86-81.73C194 164.16 151.25 211.3 152.1 265.32c.75 47.94-3.75 95.91-13.37 142.55-2.69 12.98 5.67 25.69 18.64 28.36 13.05 2.67 25.67-5.66 28.36-18.64 10.34-50.09 15.17-101.58 14.37-153.02-.41-25.95 19.92-52.49 54.45-52.34 31.31.47 57.15 25.34 57.62 55.47.77 48.05-2.81 96.33-10.61 143.55-2.17 13.06 6.69 25.42 19.76 27.58 19.97 3.33 26.81-15.1 27.58-19.77 8.28-50.03 12.06-101.21 11.27-152.11-.88-55.8-47.94-101.88-104.91-102.72zm-110.69-19.78c-10.3-8.34-25.37-6.8-33.76 3.48-25.62 31.5-39.39 71.28-38.75 112 .59 37.58-2.47 75.27-9.11 112.05-2.34 13.05 6.31 25.53 19.36 27.89 20.11 3.5 27.07-14.81 27.89-19.36 7.19-39.84 10.5-80.66 9.86-121.33-.47-29.88 9.2-57.88 28-80.97 8.35-10.28 6.79-25.39-3.49-33.76zm109.47-62.33c-15.41-.41-30.87 1.44-45.78 4.97-12.89 3.06-20.87 15.98-17.83 28.89 3.06 12.89 16 20.83 28.89 17.83 11.05-2.61 22.47-3.77 34-3.69 75.43 1.13 137.73 61.5 138.88 134.58.59 37.88-1.28 76.11-5.58 113.63-1.5 13.17 7.95 25.08 21.11 26.58 16.72 1.95 25.51-11.88 26.58-21.11a929.06 929.06 0 0 0 5.89-119.85c-1.56-98.75-85.07-180.33-186.16-181.83zm252.07 121.45c-2.86-12.92-15.51-21.2-28.61-18.27-12.94 2.86-21.12 15.66-18.26 28.61 4.71 21.41 4.91 37.41 4.7 61.6-.11 13.27 10.55 24.09 23.8 24.2h.2c13.17 0 23.89-10.61 24-23.8.18-22.18.4-44.11-5.83-72.34zm-40.12-90.72C417.29 43.46 337.6 1.29 252.81.02 183.02-.82 118.47 24.91 70.46 72.94 24.09 119.37-.9 181.04.14 246.65l-.12 21.47c-.39 13.25 10.03 24.31 23.28 24.69.23.02.48.02.72.02 12.92 0 23.59-10.3 23.97-23.3l.16-23.64c-.83-52.5 19.16-101.86 56.28-139 38.76-38.8 91.34-59.67 147.68-58.86 69.45 1.03 134.73 35.56 174.62 92.39 7.61 10.86 22.56 13.45 33.42 5.86 10.84-7.62 13.46-22.59 5.84-33.43z\"]\n};\nvar faFire = {\n prefix: 'fas',\n iconName: 'fire',\n icon: [384, 512, [], \"f06d\", \"M216 23.86c0-23.8-30.65-32.77-44.15-13.04C48 191.85 224 200 224 288c0 35.63-29.11 64.46-64.85 63.99-35.17-.45-63.15-29.77-63.15-64.94v-85.51c0-21.7-26.47-32.23-41.43-16.5C27.8 213.16 0 261.33 0 320c0 105.87 86.13 192 192 192s192-86.13 192-192c0-170.29-168-193-168-296.14z\"]\n};\nvar faFireAlt = {\n prefix: 'fas',\n iconName: 'fire-alt',\n icon: [448, 512, [], \"f7e4\", \"M323.56 51.2c-20.8 19.3-39.58 39.59-56.22 59.97C240.08 73.62 206.28 35.53 168 0 69.74 91.17 0 209.96 0 281.6 0 408.85 100.29 512 224 512s224-103.15 224-230.4c0-53.27-51.98-163.14-124.44-230.4zm-19.47 340.65C282.43 407.01 255.72 416 226.86 416 154.71 416 96 368.26 96 290.75c0-38.61 24.31-72.63 72.79-130.75 6.93 7.98 98.83 125.34 98.83 125.34l58.63-66.88c4.14 6.85 7.91 13.55 11.27 19.97 27.35 52.19 15.81 118.97-33.43 153.42z\"]\n};\nvar faFireExtinguisher = {\n prefix: 'fas',\n iconName: 'fire-extinguisher',\n icon: [448, 512, [], \"f134\", \"M434.027 26.329l-168 28C254.693 56.218 256 67.8 256 72h-58.332C208.353 36.108 181.446 0 144 0c-39.435 0-66.368 39.676-52.228 76.203-52.039 13.051-75.381 54.213-90.049 90.884-4.923 12.307 1.063 26.274 13.37 31.197 12.317 4.926 26.279-1.075 31.196-13.37C75.058 112.99 106.964 120 168 120v27.076c-41.543 10.862-72 49.235-72 94.129V488c0 13.255 10.745 24 24 24h144c13.255 0 24-10.745 24-24V240c0-44.731-30.596-82.312-72-92.97V120h40c0 2.974-1.703 15.716 10.027 17.671l168 28C441.342 166.89 448 161.25 448 153.834V38.166c0-7.416-6.658-13.056-13.973-11.837zM144 72c-8.822 0-16-7.178-16-16s7.178-16 16-16 16 7.178 16 16-7.178 16-16 16z\"]\n};\nvar faFirstAid = {\n prefix: 'fas',\n iconName: 'first-aid',\n icon: [576, 512, [], \"f479\", \"M0 80v352c0 26.5 21.5 48 48 48h48V32H48C21.5 32 0 53.5 0 80zm128 400h320V32H128v448zm64-248c0-4.4 3.6-8 8-8h56v-56c0-4.4 3.6-8 8-8h48c4.4 0 8 3.6 8 8v56h56c4.4 0 8 3.6 8 8v48c0 4.4-3.6 8-8 8h-56v56c0 4.4-3.6 8-8 8h-48c-4.4 0-8-3.6-8-8v-56h-56c-4.4 0-8-3.6-8-8v-48zM528 32h-48v448h48c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48z\"]\n};\nvar faFish = {\n prefix: 'fas',\n iconName: 'fish',\n icon: [576, 512, [], \"f578\", \"M327.1 96c-89.97 0-168.54 54.77-212.27 101.63L27.5 131.58c-12.13-9.18-30.24.6-27.14 14.66L24.54 256 .35 365.77c-3.1 14.06 15.01 23.83 27.14 14.66l87.33-66.05C158.55 361.23 237.13 416 327.1 416 464.56 416 576 288 576 256S464.56 96 327.1 96zm87.43 184c-13.25 0-24-10.75-24-24 0-13.26 10.75-24 24-24 13.26 0 24 10.74 24 24 0 13.25-10.75 24-24 24z\"]\n};\nvar faFistRaised = {\n prefix: 'fas',\n iconName: 'fist-raised',\n icon: [384, 512, [], \"f6de\", \"M255.98 160V16c0-8.84-7.16-16-16-16h-32c-8.84 0-16 7.16-16 16v146.93c5.02-1.78 10.34-2.93 15.97-2.93h48.03zm128 95.99c-.01-35.34-28.66-63.99-63.99-63.99H207.85c-8.78 0-15.9 7.07-15.9 15.85v.56c0 26.27 21.3 47.59 47.57 47.59h35.26c9.68 0 13.2 3.58 13.2 8v16.2c0 4.29-3.59 7.78-7.88 8-44.52 2.28-64.16 24.71-96.05 72.55l-6.31 9.47a7.994 7.994 0 0 1-11.09 2.22l-13.31-8.88a7.994 7.994 0 0 1-2.22-11.09l6.31-9.47c15.73-23.6 30.2-43.26 47.31-58.08-17.27-5.51-31.4-18.12-38.87-34.45-6.59 3.41-13.96 5.52-21.87 5.52h-32c-12.34 0-23.49-4.81-32-12.48C71.48 251.19 60.33 256 48 256H16c-5.64 0-10.97-1.15-16-2.95v77.93c0 33.95 13.48 66.5 37.49 90.51L63.99 448v64h255.98v-63.96l35.91-35.92A96.035 96.035 0 0 0 384 344.21l-.02-88.22zm-32.01-90.09V48c0-8.84-7.16-16-16-16h-32c-8.84 0-16 7.16-16 16v112h32c11.28 0 21.94 2.31 32 5.9zM16 224h32c8.84 0 16-7.16 16-16V80c0-8.84-7.16-16-16-16H16C7.16 64 0 71.16 0 80v128c0 8.84 7.16 16 16 16zm95.99 0h32c8.84 0 16-7.16 16-16V48c0-8.84-7.16-16-16-16h-32c-8.84 0-16 7.16-16 16v160c0 8.84 7.16 16 16 16z\"]\n};\nvar faFlag = {\n prefix: 'fas',\n iconName: 'flag',\n icon: [512, 512, [], \"f024\", \"M349.565 98.783C295.978 98.783 251.721 64 184.348 64c-24.955 0-47.309 4.384-68.045 12.013a55.947 55.947 0 0 0 3.586-23.562C118.117 24.015 94.806 1.206 66.338.048 34.345-1.254 8 24.296 8 56c0 19.026 9.497 35.825 24 45.945V488c0 13.255 10.745 24 24 24h16c13.255 0 24-10.745 24-24v-94.4c28.311-12.064 63.582-22.122 114.435-22.122 53.588 0 97.844 34.783 165.217 34.783 48.169 0 86.667-16.294 122.505-40.858C506.84 359.452 512 349.571 512 339.045v-243.1c0-23.393-24.269-38.87-45.485-29.016-34.338 15.948-76.454 31.854-116.95 31.854z\"]\n};\nvar faFlagCheckered = {\n prefix: 'fas',\n iconName: 'flag-checkered',\n icon: [512, 512, [], \"f11e\", \"M243.2 189.9V258c26.1 5.9 49.3 15.6 73.6 22.3v-68.2c-26-5.8-49.4-15.5-73.6-22.2zm223.3-123c-34.3 15.9-76.5 31.9-117 31.9C296 98.8 251.7 64 184.3 64c-25 0-47.3 4.4-68 12 2.8-7.3 4.1-15.2 3.6-23.6C118.1 24 94.8 1.2 66.3 0 34.3-1.3 8 24.3 8 56c0 19 9.5 35.8 24 45.9V488c0 13.3 10.7 24 24 24h16c13.3 0 24-10.7 24-24v-94.4c28.3-12.1 63.6-22.1 114.4-22.1 53.6 0 97.8 34.8 165.2 34.8 48.2 0 86.7-16.3 122.5-40.9 8.7-6 13.8-15.8 13.8-26.4V95.9c.1-23.3-24.2-38.8-45.4-29zM169.6 325.5c-25.8 2.7-50 8.2-73.6 16.6v-70.5c26.2-9.3 47.5-15 73.6-17.4zM464 191c-23.6 9.8-46.3 19.5-73.6 23.9V286c24.8-3.4 51.4-11.8 73.6-26v70.5c-25.1 16.1-48.5 24.7-73.6 27.1V286c-27 3.7-47.9 1.5-73.6-5.6v67.4c-23.9-7.4-47.3-16.7-73.6-21.3V258c-19.7-4.4-40.8-6.8-73.6-3.8v-70c-22.4 3.1-44.6 10.2-73.6 20.9v-70.5c33.2-12.2 50.1-19.8 73.6-22v71.6c27-3.7 48.4-1.3 73.6 5.7v-67.4c23.7 7.4 47.2 16.7 73.6 21.3v68.4c23.7 5.3 47.6 6.9 73.6 2.7V143c27-4.8 52.3-13.6 73.6-22.5z\"]\n};\nvar faFlagUsa = {\n prefix: 'fas',\n iconName: 'flag-usa',\n icon: [512, 512, [], \"f74d\", \"M32 0C14.3 0 0 14.3 0 32v464c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16V32C64 14.3 49.7 0 32 0zm267.9 303.6c-57.2-15.1-111.7-28.8-203.9 11.1V384c185.7-92.2 221.7 53.3 397.5-23.1 11.4-5 18.5-16.5 18.5-28.8v-36c-43.6 17.3-80.2 24.1-112.1 24.1-37.4-.1-68.9-8.4-100-16.6zm0-96c-57.2-15.1-111.7-28.8-203.9 11.1v61.5c94.8-37.6 154.6-22.7 212.1-7.6 57.2 15.1 111.7 28.8 203.9-11.1V200c-43.6 17.3-80.2 24.1-112.1 24.1-37.4 0-68.9-8.3-100-16.5zm9.5-125.9c51.8 15.6 97.4 29 202.6-20.1V30.8c0-25.1-26.8-38.1-49.4-26.6C291.3 91.5 305.4-62.2 96 32.4v151.9c94.8-37.5 154.6-22.7 212.1-7.6 57.2 15 111.7 28.7 203.9-11.1V96.7c-53.6 23.5-93.3 31.4-126.1 31.4s-59-7.8-85.7-15.9c-4-1.2-8.1-2.4-12.1-3.5V75.5c7.2 2 14.3 4.1 21.3 6.2zM160 128.1c-8.8 0-16-7.1-16-16 0-8.8 7.2-16 16-16s16 7.1 16 16-7.2 16-16 16zm0-55.8c-8.8 0-16-7.1-16-16 0-8.8 7.2-16 16-16s16 7.1 16 16c0 8.8-7.2 16-16 16zm64 47.9c-8.8 0-16-7.1-16-16 0-8.8 7.2-16 16-16s16 7.1 16 16c0 8.8-7.2 16-16 16zm0-55.9c-8.8 0-16-7.1-16-16 0-8.8 7.2-16 16-16s16 7.1 16 16c0 8.8-7.2 16-16 16z\"]\n};\nvar faFlask = {\n prefix: 'fas',\n iconName: 'flask',\n icon: [448, 512, [], \"f0c3\", \"M437.2 403.5L320 215V64h8c13.3 0 24-10.7 24-24V24c0-13.3-10.7-24-24-24H120c-13.3 0-24 10.7-24 24v16c0 13.3 10.7 24 24 24h8v151L10.8 403.5C-18.5 450.6 15.3 512 70.9 512h306.2c55.7 0 89.4-61.5 60.1-108.5zM137.9 320l48.2-77.6c3.7-5.2 5.8-11.6 5.8-18.4V64h64v160c0 6.9 2.2 13.2 5.8 18.4l48.2 77.6h-172z\"]\n};\nvar faFlushed = {\n prefix: 'fas',\n iconName: 'flushed',\n icon: [496, 512, [], \"f579\", \"M344 200c-13.3 0-24 10.7-24 24s10.7 24 24 24 24-10.7 24-24-10.7-24-24-24zm-192 0c-13.3 0-24 10.7-24 24s10.7 24 24 24 24-10.7 24-24-10.7-24-24-24zM248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zM80 224c0-39.8 32.2-72 72-72s72 32.2 72 72-32.2 72-72 72-72-32.2-72-72zm232 176H184c-21.2 0-21.2-32 0-32h128c21.2 0 21.2 32 0 32zm32-104c-39.8 0-72-32.2-72-72s32.2-72 72-72 72 32.2 72 72-32.2 72-72 72z\"]\n};\nvar faFolder = {\n prefix: 'fas',\n iconName: 'folder',\n icon: [512, 512, [], \"f07b\", \"M464 128H272l-64-64H48C21.49 64 0 85.49 0 112v288c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48V176c0-26.51-21.49-48-48-48z\"]\n};\nvar faFolderMinus = {\n prefix: 'fas',\n iconName: 'folder-minus',\n icon: [512, 512, [], \"f65d\", \"M464 128H272l-64-64H48C21.49 64 0 85.49 0 112v288c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48V176c0-26.51-21.49-48-48-48zm-96 168c0 8.84-7.16 16-16 16H160c-8.84 0-16-7.16-16-16v-16c0-8.84 7.16-16 16-16h192c8.84 0 16 7.16 16 16v16z\"]\n};\nvar faFolderOpen = {\n prefix: 'fas',\n iconName: 'folder-open',\n icon: [576, 512, [], \"f07c\", \"M572.694 292.093L500.27 416.248A63.997 63.997 0 0 1 444.989 448H45.025c-18.523 0-30.064-20.093-20.731-36.093l72.424-124.155A64 64 0 0 1 152 256h399.964c18.523 0 30.064 20.093 20.73 36.093zM152 224h328v-48c0-26.51-21.49-48-48-48H272l-64-64H48C21.49 64 0 85.49 0 112v278.046l69.077-118.418C86.214 242.25 117.989 224 152 224z\"]\n};\nvar faFolderPlus = {\n prefix: 'fas',\n iconName: 'folder-plus',\n icon: [512, 512, [], \"f65e\", \"M464 128H272l-64-64H48C21.49 64 0 85.49 0 112v288c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48V176c0-26.51-21.49-48-48-48zm-96 168c0 8.84-7.16 16-16 16h-72v72c0 8.84-7.16 16-16 16h-16c-8.84 0-16-7.16-16-16v-72h-72c-8.84 0-16-7.16-16-16v-16c0-8.84 7.16-16 16-16h72v-72c0-8.84 7.16-16 16-16h16c8.84 0 16 7.16 16 16v72h72c8.84 0 16 7.16 16 16v16z\"]\n};\nvar faFont = {\n prefix: 'fas',\n iconName: 'font',\n icon: [448, 512, [], \"f031\", \"M432 416h-26.7L275.5 42.7c-2.2-6.4-8.3-10.7-15.1-10.7h-72.8c-6.8 0-12.9 4.3-15.1 10.7L42.7 416H16c-8.8 0-16 7.2-16 16v32c0 8.8 7.2 16 16 16h136c8.8 0 16-7.2 16-16v-32c0-8.8-7.2-16-16-16h-24l26.6-80.8h138.2l26.6 80.8H296c-8.8 0-16 7.2-16 16v32c0 8.8 7.2 16 16 16h136c8.8 0 16-7.2 16-16v-32c0-8.8-7.2-16-16-16zM174.4 268.3l42-124.1c4.3-15.2 6.6-28.2 7.6-34.6.8 6.5 2.9 19.5 7.7 34.7l41.3 124z\"]\n};\nvar faFontAwesomeLogoFull = {\n prefix: 'fas',\n iconName: 'font-awesome-logo-full',\n icon: [3992, 512, [\"Font Awesome\"], \"f4e6\", \"M454.6 0H57.4C25.9 0 0 25.9 0 57.4v397.3C0 486.1 25.9 512 57.4 512h397.3c31.4 0 57.4-25.9 57.4-57.4V57.4C512 25.9 486.1 0 454.6 0zm-58.9 324.9c0 4.8-4.1 6.9-8.9 8.9-19.2 8.1-39.7 15.7-61.5 15.7-40.5 0-68.7-44.8-163.2 2.5v51.8c0 30.3-45.7 30.2-45.7 0v-250c-9-7-15-17.9-15-30.3 0-21 17.1-38.2 38.2-38.2 21 0 38.2 17.1 38.2 38.2 0 12.2-5.8 23.2-14.9 30.2v21c37.1-12 65.5-34.4 146.1-3.4 26.6 11.4 68.7-15.7 76.5-15.7 5.5 0 10.3 4.1 10.3 8.9v160.4zm432.9-174.2h-137v70.1H825c39.8 0 40.4 62.2 0 62.2H691.6v105.6c0 45.5-70.7 46.4-70.7 0V128.3c0-22 18-39.8 39.8-39.8h167.8c39.6 0 40.5 62.2.1 62.2zm191.1 23.4c-169.3 0-169.1 252.4 0 252.4 169.9 0 169.9-252.4 0-252.4zm0 196.1c-81.6 0-82.1-139.8 0-139.8 82.5 0 82.4 139.8 0 139.8zm372.4 53.4c-17.5 0-31.4-13.9-31.4-31.4v-117c0-62.4-72.6-52.5-99.1-16.4v133.4c0 41.5-63.3 41.8-63.3 0V208c0-40 63.1-41.6 63.1 0v3.4c43.3-51.6 162.4-60.4 162.4 39.3v141.5c.3 30.4-31.5 31.4-31.7 31.4zm179.7 2.9c-44.3 0-68.3-22.9-68.3-65.8V235.2H1488c-35.6 0-36.7-55.3 0-55.3h15.5v-37.3c0-41.3 63.8-42.1 63.8 0v37.5h24.9c35.4 0 35.7 55.3 0 55.3h-24.9v108.5c0 29.6 26.1 26.3 27.4 26.3 31.4 0 52.6 56.3-22.9 56.3zM1992 123c-19.5-50.2-95.5-50-114.5 0-107.3 275.7-99.5 252.7-99.5 262.8 0 42.8 58.3 51.2 72.1 14.4l13.5-35.9H2006l13 35.9c14.2 37.7 72.1 27.2 72.1-14.4 0-10.1 5.3 6.8-99.1-262.8zm-108.9 179.1l51.7-142.9 51.8 142.9h-103.5zm591.3-85.6l-53.7 176.3c-12.4 41.2-72 41-84 0l-42.3-135.9-42.3 135.9c-12.4 40.9-72 41.2-84.5 0l-54.2-176.3c-12.5-39.4 49.8-56.1 60.2-16.9L2213 342l45.3-139.5c10.9-32.7 59.6-34.7 71.2 0l45.3 139.5 39.3-142.4c10.3-38.3 72.6-23.8 60.3 16.9zm275.4 75.1c0-42.4-33.9-117.5-119.5-117.5-73.2 0-124.4 56.3-124.4 126 0 77.2 55.3 126.4 128.5 126.4 31.7 0 93-11.5 93-39.8 0-18.3-21.1-31.5-39.3-22.4-49.4 26.2-109 8.4-115.9-43.8h148.3c16.3 0 29.3-13.4 29.3-28.9zM2571 277.7c9.5-73.4 113.9-68.6 118.6 0H2571zm316.7 148.8c-31.4 0-81.6-10.5-96.6-31.9-12.4-17 2.5-39.8 21.8-39.8 16.3 0 36.8 22.9 77.7 22.9 27.4 0 40.4-11 40.4-25.8 0-39.8-142.9-7.4-142.9-102 0-40.4 35.3-75.7 98.6-75.7 31.4 0 74.1 9.9 87.6 29.4 10.8 14.8-1.4 36.2-20.9 36.2-15.1 0-26.7-17.3-66.2-17.3-22.9 0-37.8 10.5-37.8 23.8 0 35.9 142.4 6 142.4 103.1-.1 43.7-37.4 77.1-104.1 77.1zm266.8-252.4c-169.3 0-169.1 252.4 0 252.4 170.1 0 169.6-252.4 0-252.4zm0 196.1c-81.8 0-82-139.8 0-139.8 82.5 0 82.4 139.8 0 139.8zm476.9 22V268.7c0-53.8-61.4-45.8-85.7-10.5v134c0 41.3-63.8 42.1-63.8 0V268.7c0-52.1-59.5-47.4-85.7-10.1v133.6c0 41.5-63.3 41.8-63.3 0V208c0-40 63.1-41.6 63.1 0v3.4c9.9-14.4 41.8-37.3 78.6-37.3 35.3 0 57.7 16.4 66.7 43.8 13.9-21.8 45.8-43.8 82.6-43.8 44.3 0 70.7 23.4 70.7 72.7v145.3c.5 17.3-13.5 31.4-31.9 31.4 3.5.1-31.3 1.1-31.3-31.3zM3992 291.6c0-42.4-32.4-117.5-117.9-117.5-73.2 0-127.5 56.3-127.5 126 0 77.2 58.3 126.4 131.6 126.4 31.7 0 91.5-11.5 91.5-39.8 0-18.3-21.1-31.5-39.3-22.4-49.4 26.2-110.5 8.4-117.5-43.8h149.8c16.3 0 29.1-13.4 29.3-28.9zm-180.5-13.9c9.7-74.4 115.9-68.3 120.1 0h-120.1z\"]\n};\nvar faFootballBall = {\n prefix: 'fas',\n iconName: 'football-ball',\n icon: [496, 512, [], \"f44e\", \"M481.5 60.3c-4.8-18.2-19.1-32.5-37.3-37.4C420.3 16.5 383 8.9 339.4 8L496 164.8c-.8-43.5-8.2-80.6-14.5-104.5zm-467 391.4c4.8 18.2 19.1 32.5 37.3 37.4 23.9 6.4 61.2 14 104.8 14.9L0 347.2c.8 43.5 8.2 80.6 14.5 104.5zM4.2 283.4L220.4 500c132.5-19.4 248.8-118.7 271.5-271.4L275.6 12C143.1 31.4 26.8 130.7 4.2 283.4zm317.3-123.6c3.1-3.1 8.2-3.1 11.3 0l11.3 11.3c3.1 3.1 3.1 8.2 0 11.3l-28.3 28.3 28.3 28.3c3.1 3.1 3.1 8.2 0 11.3l-11.3 11.3c-3.1 3.1-8.2 3.1-11.3 0l-28.3-28.3-22.6 22.7 28.3 28.3c3.1 3.1 3.1 8.2 0 11.3l-11.3 11.3c-3.1 3.1-8.2 3.1-11.3 0L248 278.6l-22.6 22.6 28.3 28.3c3.1 3.1 3.1 8.2 0 11.3l-11.3 11.3c-3.1 3.1-8.2 3.1-11.3 0l-28.3-28.3-28.3 28.3c-3.1 3.1-8.2 3.1-11.3 0l-11.3-11.3c-3.1-3.1-3.1-8.2 0-11.3l28.3-28.3-28.3-28.2c-3.1-3.1-3.1-8.2 0-11.3l11.3-11.3c3.1-3.1 8.2-3.1 11.3 0l28.3 28.3 22.6-22.6-28.3-28.3c-3.1-3.1-3.1-8.2 0-11.3l11.3-11.3c3.1-3.1 8.2-3.1 11.3 0l28.3 28.3 22.6-22.6-28.3-28.3c-3.1-3.1-3.1-8.2 0-11.3l11.3-11.3c3.1-3.1 8.2-3.1 11.3 0l28.3 28.3 28.3-28.5z\"]\n};\nvar faForward = {\n prefix: 'fas',\n iconName: 'forward',\n icon: [512, 512, [], \"f04e\", \"M500.5 231.4l-192-160C287.9 54.3 256 68.6 256 96v320c0 27.4 31.9 41.8 52.5 24.6l192-160c15.3-12.8 15.3-36.4 0-49.2zm-256 0l-192-160C31.9 54.3 0 68.6 0 96v320c0 27.4 31.9 41.8 52.5 24.6l192-160c15.3-12.8 15.3-36.4 0-49.2z\"]\n};\nvar faFrog = {\n prefix: 'fas',\n iconName: 'frog',\n icon: [576, 512, [], \"f52e\", \"M446.53 97.43C439.67 60.23 407.19 32 368 32c-39.23 0-71.72 28.29-78.54 65.54C126.75 112.96-.5 250.12 0 416.98.11 451.9 29.08 480 64 480h304c8.84 0 16-7.16 16-16 0-17.67-14.33-32-32-32h-79.49l35.8-48.33c24.14-36.23 10.35-88.28-33.71-106.6-23.89-9.93-51.55-4.65-72.24 10.88l-32.76 24.59c-7.06 5.31-17.09 3.91-22.41-3.19-5.3-7.08-3.88-17.11 3.19-22.41l34.78-26.09c36.84-27.66 88.28-27.62 125.13 0 10.87 8.15 45.87 39.06 40.8 93.21L469.62 480H560c8.84 0 16-7.16 16-16 0-17.67-14.33-32-32-32h-53.63l-98.52-104.68 154.44-86.65A58.16 58.16 0 0 0 576 189.94c0-21.4-11.72-40.95-30.48-51.23-40.56-22.22-98.99-41.28-98.99-41.28zM368 136c-13.26 0-24-10.75-24-24 0-13.26 10.74-24 24-24 13.25 0 24 10.74 24 24 0 13.25-10.75 24-24 24z\"]\n};\nvar faFrown = {\n prefix: 'fas',\n iconName: 'frown',\n icon: [496, 512, [], \"f119\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm80 168c17.7 0 32 14.3 32 32s-14.3 32-32 32-32-14.3-32-32 14.3-32 32-32zm-160 0c17.7 0 32 14.3 32 32s-14.3 32-32 32-32-14.3-32-32 14.3-32 32-32zm170.2 218.2C315.8 367.4 282.9 352 248 352s-67.8 15.4-90.2 42.2c-13.5 16.3-38.1-4.2-24.6-20.5C161.7 339.6 203.6 320 248 320s86.3 19.6 114.7 53.8c13.6 16.2-11 36.7-24.5 20.4z\"]\n};\nvar faFrownOpen = {\n prefix: 'fas',\n iconName: 'frown-open',\n icon: [496, 512, [], \"f57a\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zM136 208c0-17.7 14.3-32 32-32s32 14.3 32 32-14.3 32-32 32-32-14.3-32-32zm187.3 183.3c-31.2-9.6-59.4-15.3-75.3-15.3s-44.1 5.7-75.3 15.3c-11.5 3.5-22.5-6.3-20.5-18.1 7-40 60.1-61.2 95.8-61.2s88.8 21.3 95.8 61.2c2 11.9-9.1 21.6-20.5 18.1zM328 240c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32z\"]\n};\nvar faFunnelDollar = {\n prefix: 'fas',\n iconName: 'funnel-dollar',\n icon: [640, 512, [], \"f662\", \"M433.46 165.94l101.2-111.87C554.61 34.12 540.48 0 512.26 0H31.74C3.52 0-10.61 34.12 9.34 54.07L192 256v155.92c0 12.59 5.93 24.44 16 32l79.99 60c20.86 15.64 48.47 6.97 59.22-13.57C310.8 455.38 288 406.35 288 352c0-89.79 62.05-165.17 145.46-186.06zM480 192c-88.37 0-160 71.63-160 160s71.63 160 160 160 160-71.63 160-160-71.63-160-160-160zm16 239.88V448c0 4.42-3.58 8-8 8h-16c-4.42 0-8-3.58-8-8v-16.29c-11.29-.58-22.27-4.52-31.37-11.35-3.9-2.93-4.1-8.77-.57-12.14l11.75-11.21c2.77-2.64 6.89-2.76 10.13-.73 3.87 2.42 8.26 3.72 12.82 3.72h28.11c6.5 0 11.8-5.92 11.8-13.19 0-5.95-3.61-11.19-8.77-12.73l-45-13.5c-18.59-5.58-31.58-23.42-31.58-43.39 0-24.52 19.05-44.44 42.67-45.07V256c0-4.42 3.58-8 8-8h16c4.42 0 8 3.58 8 8v16.29c11.29.58 22.27 4.51 31.37 11.35 3.9 2.93 4.1 8.77.57 12.14l-11.75 11.21c-2.77 2.64-6.89 2.76-10.13.73-3.87-2.43-8.26-3.72-12.82-3.72h-28.11c-6.5 0-11.8 5.92-11.8 13.19 0 5.95 3.61 11.19 8.77 12.73l45 13.5c18.59 5.58 31.58 23.42 31.58 43.39 0 24.53-19.04 44.44-42.67 45.07z\"]\n};\nvar faFutbol = {\n prefix: 'fas',\n iconName: 'futbol',\n icon: [512, 512, [], \"f1e3\", \"M504 256c0 136.967-111.033 248-248 248S8 392.967 8 256 119.033 8 256 8s248 111.033 248 248zm-48 0l-.003-.282-26.064 22.741-62.679-58.5 16.454-84.355 34.303 3.072c-24.889-34.216-60.004-60.089-100.709-73.141l13.651 31.939L256 139l-74.953-41.525 13.651-31.939c-40.631 13.028-75.78 38.87-100.709 73.141l34.565-3.073 16.192 84.355-62.678 58.5-26.064-22.741-.003.282c0 43.015 13.497 83.952 38.472 117.991l7.704-33.897 85.138 10.447 36.301 77.826-29.902 17.786c40.202 13.122 84.29 13.148 124.572 0l-29.902-17.786 36.301-77.826 85.138-10.447 7.704 33.897C442.503 339.952 456 299.015 456 256zm-248.102 69.571l-29.894-91.312L256 177.732l77.996 56.527-29.622 91.312h-96.476z\"]\n};\nvar faGamepad = {\n prefix: 'fas',\n iconName: 'gamepad',\n icon: [640, 512, [], \"f11b\", \"M480 96H160C71.6 96 0 167.6 0 256s71.6 160 160 160c44.8 0 85.2-18.4 114.2-48h91.5c29 29.6 69.5 48 114.2 48 88.4 0 160-71.6 160-160S568.4 96 480 96zM256 276c0 6.6-5.4 12-12 12h-52v52c0 6.6-5.4 12-12 12h-40c-6.6 0-12-5.4-12-12v-52H76c-6.6 0-12-5.4-12-12v-40c0-6.6 5.4-12 12-12h52v-52c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v52h52c6.6 0 12 5.4 12 12v40zm184 68c-26.5 0-48-21.5-48-48s21.5-48 48-48 48 21.5 48 48-21.5 48-48 48zm80-80c-26.5 0-48-21.5-48-48s21.5-48 48-48 48 21.5 48 48-21.5 48-48 48z\"]\n};\nvar faGasPump = {\n prefix: 'fas',\n iconName: 'gas-pump',\n icon: [512, 512, [], \"f52f\", \"M336 448H16c-8.8 0-16 7.2-16 16v32c0 8.8 7.2 16 16 16h320c8.8 0 16-7.2 16-16v-32c0-8.8-7.2-16-16-16zm157.2-340.7l-81-81c-6.2-6.2-16.4-6.2-22.6 0l-11.3 11.3c-6.2 6.2-6.2 16.4 0 22.6L416 97.9V160c0 28.1 20.9 51.3 48 55.2V376c0 13.2-10.8 24-24 24s-24-10.8-24-24v-32c0-48.6-39.4-88-88-88h-8V64c0-35.3-28.7-64-64-64H96C60.7 0 32 28.7 32 64v352h288V304h8c22.1 0 40 17.9 40 40v27.8c0 37.7 27 72 64.5 75.9 43 4.3 79.5-29.5 79.5-71.7V152.6c0-17-6.8-33.3-18.8-45.3zM256 192H96V64h160v128z\"]\n};\nvar faGavel = {\n prefix: 'fas',\n iconName: 'gavel',\n icon: [512, 512, [], \"f0e3\", \"M504.971 199.362l-22.627-22.627c-9.373-9.373-24.569-9.373-33.941 0l-5.657 5.657L329.608 69.255l5.657-5.657c9.373-9.373 9.373-24.569 0-33.941L312.638 7.029c-9.373-9.373-24.569-9.373-33.941 0L154.246 131.48c-9.373 9.373-9.373 24.569 0 33.941l22.627 22.627c9.373 9.373 24.569 9.373 33.941 0l5.657-5.657 39.598 39.598-81.04 81.04-5.657-5.657c-12.497-12.497-32.758-12.497-45.255 0L9.373 412.118c-12.497 12.497-12.497 32.758 0 45.255l45.255 45.255c12.497 12.497 32.758 12.497 45.255 0l114.745-114.745c12.497-12.497 12.497-32.758 0-45.255l-5.657-5.657 81.04-81.04 39.598 39.598-5.657 5.657c-9.373 9.373-9.373 24.569 0 33.941l22.627 22.627c9.373 9.373 24.569 9.373 33.941 0l124.451-124.451c9.372-9.372 9.372-24.568 0-33.941z\"]\n};\nvar faGem = {\n prefix: 'fas',\n iconName: 'gem',\n icon: [576, 512, [], \"f3a5\", \"M485.5 0L576 160H474.9L405.7 0h79.8zm-128 0l69.2 160H149.3L218.5 0h139zm-267 0h79.8l-69.2 160H0L90.5 0zM0 192h100.7l123 251.7c1.5 3.1-2.7 5.9-5 3.3L0 192zm148.2 0h279.6l-137 318.2c-1 2.4-4.5 2.4-5.5 0L148.2 192zm204.1 251.7l123-251.7H576L357.3 446.9c-2.3 2.7-6.5-.1-5-3.2z\"]\n};\nvar faGenderless = {\n prefix: 'fas',\n iconName: 'genderless',\n icon: [288, 512, [], \"f22d\", \"M144 176c44.1 0 80 35.9 80 80s-35.9 80-80 80-80-35.9-80-80 35.9-80 80-80m0-64C64.5 112 0 176.5 0 256s64.5 144 144 144 144-64.5 144-144-64.5-144-144-144z\"]\n};\nvar faGhost = {\n prefix: 'fas',\n iconName: 'ghost',\n icon: [384, 512, [], \"f6e2\", \"M186.1.09C81.01 3.24 0 94.92 0 200.05v263.92c0 14.26 17.23 21.39 27.31 11.31l24.92-18.53c6.66-4.95 16-3.99 21.51 2.21l42.95 48.35c6.25 6.25 16.38 6.25 22.63 0l40.72-45.85c6.37-7.17 17.56-7.17 23.92 0l40.72 45.85c6.25 6.25 16.38 6.25 22.63 0l42.95-48.35c5.51-6.2 14.85-7.17 21.51-2.21l24.92 18.53c10.08 10.08 27.31 2.94 27.31-11.31V192C384 84 294.83-3.17 186.1.09zM128 224c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm128 0c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32z\"]\n};\nvar faGift = {\n prefix: 'fas',\n iconName: 'gift',\n icon: [512, 512, [], \"f06b\", \"M32 448c0 17.7 14.3 32 32 32h160V320H32v128zm256 32h160c17.7 0 32-14.3 32-32V320H288v160zm192-320h-42.1c6.2-12.1 10.1-25.5 10.1-40 0-48.5-39.5-88-88-88-41.6 0-68.5 21.3-103 68.3-34.5-47-61.4-68.3-103-68.3-48.5 0-88 39.5-88 88 0 14.5 3.8 27.9 10.1 40H32c-17.7 0-32 14.3-32 32v80c0 8.8 7.2 16 16 16h480c8.8 0 16-7.2 16-16v-80c0-17.7-14.3-32-32-32zm-326.1 0c-22.1 0-40-17.9-40-40s17.9-40 40-40c19.9 0 34.6 3.3 86.1 80h-86.1zm206.1 0h-86.1c51.4-76.5 65.7-80 86.1-80 22.1 0 40 17.9 40 40s-17.9 40-40 40z\"]\n};\nvar faGifts = {\n prefix: 'fas',\n iconName: 'gifts',\n icon: [640, 512, [], \"f79c\", \"M240.6 194.1c1.9-30.8 17.3-61.2 44-79.8C279.4 103.5 268.7 96 256 96h-29.4l30.7-22c7.2-5.1 8.9-15.1 3.7-22.3l-9.3-13c-5.1-7.2-15.1-8.9-22.3-3.7l-32 22.9 11.5-30.6c3.1-8.3-1.1-17.5-9.4-20.6l-15-5.6c-8.3-3.1-17.5 1.1-20.6 9.4l-19.9 53-19.9-53.1C121 2.1 111.8-2.1 103.5 1l-15 5.6C80.2 9.7 76 19 79.2 27.2l11.5 30.6L58.6 35c-7.2-5.1-17.2-3.5-22.3 3.7l-9.3 13c-5.1 7.2-3.5 17.2 3.7 22.3l30.7 22H32c-17.7 0-32 14.3-32 32v352c0 17.7 14.3 32 32 32h168.9c-5.5-9.5-8.9-20.3-8.9-32V256c0-29.9 20.8-55 48.6-61.9zM224 480c0 17.7 14.3 32 32 32h160V384H224v96zm224 32h160c17.7 0 32-14.3 32-32v-96H448v128zm160-288h-20.4c2.6-7.6 4.4-15.5 4.4-23.8 0-35.5-27-72.2-72.1-72.2-48.1 0-75.9 47.7-87.9 75.3-12.1-27.6-39.9-75.3-87.9-75.3-45.1 0-72.1 36.7-72.1 72.2 0 8.3 1.7 16.2 4.4 23.8H256c-17.7 0-32 14.3-32 32v96h192V224h15.3l.7-.2.7.2H448v128h192v-96c0-17.7-14.3-32-32-32zm-272 0c-2.7-1.4-5.1-3-7.2-4.8-7.3-6.4-8.8-13.8-8.8-19 0-9.7 6.4-24.2 24.1-24.2 18.7 0 35.6 27.4 44.5 48H336zm199.2-4.8c-2.1 1.8-4.5 3.4-7.2 4.8h-52.6c8.8-20.3 25.8-48 44.5-48 17.7 0 24.1 14.5 24.1 24.2 0 5.2-1.5 12.6-8.8 19z\"]\n};\nvar faGlassCheers = {\n prefix: 'fas',\n iconName: 'glass-cheers',\n icon: [640, 512, [], \"f79f\", \"M639.4 433.6c-8.4-20.4-31.8-30.1-52.2-21.6l-22.1 9.2-38.7-101.9c47.9-35 64.8-100.3 34.5-152.8L474.3 16c-8-13.9-25.1-19.7-40-13.6L320 49.8 205.7 2.4c-14.9-6.2-32-.3-40 13.6L79.1 166.5C48.9 219 65.7 284.3 113.6 319.2L74.9 421.1l-22.1-9.2c-20.4-8.5-43.7 1.2-52.2 21.6-1.7 4.1.2 8.8 4.3 10.5l162.3 67.4c4.1 1.7 8.7-.2 10.4-4.3 8.4-20.4-1.2-43.8-21.6-52.3l-22.1-9.2L173.3 342c4.4.5 8.8 1.3 13.1 1.3 51.7 0 99.4-33.1 113.4-85.3l20.2-75.4 20.2 75.4c14 52.2 61.7 85.3 113.4 85.3 4.3 0 8.7-.8 13.1-1.3L506 445.6l-22.1 9.2c-20.4 8.5-30.1 31.9-21.6 52.3 1.7 4.1 6.4 6 10.4 4.3L635.1 444c4-1.7 6-6.3 4.3-10.4zM275.9 162.1l-112.1-46.5 36.5-63.4 94.5 39.2-18.9 70.7zm88.2 0l-18.9-70.7 94.5-39.2 36.5 63.4-112.1 46.5z\"]\n};\nvar faGlassMartini = {\n prefix: 'fas',\n iconName: 'glass-martini',\n icon: [512, 512, [], \"f000\", \"M502.05 57.6C523.3 36.34 508.25 0 478.2 0H33.8C3.75 0-11.3 36.34 9.95 57.6L224 271.64V464h-56c-22.09 0-40 17.91-40 40 0 4.42 3.58 8 8 8h240c4.42 0 8-3.58 8-8 0-22.09-17.91-40-40-40h-56V271.64L502.05 57.6z\"]\n};\nvar faGlassMartiniAlt = {\n prefix: 'fas',\n iconName: 'glass-martini-alt',\n icon: [512, 512, [], \"f57b\", \"M502.05 57.6C523.3 36.34 508.25 0 478.2 0H33.8C3.75 0-11.3 36.34 9.95 57.6L224 271.64V464h-56c-22.09 0-40 17.91-40 40 0 4.42 3.58 8 8 8h240c4.42 0 8-3.58 8-8 0-22.09-17.91-40-40-40h-56V271.64L502.05 57.6zM443.77 48l-48 48H116.24l-48-48h375.53z\"]\n};\nvar faGlassWhiskey = {\n prefix: 'fas',\n iconName: 'glass-whiskey',\n icon: [512, 512, [], \"f7a0\", \"M480 32H32C12.5 32-2.4 49.2.3 68.5l56 356.5c4.5 31.5 31.5 54.9 63.4 54.9h273c31.8 0 58.9-23.4 63.4-54.9l55.6-356.5C514.4 49.2 499.5 32 480 32zm-37.4 64l-30 192h-313L69.4 96h373.2z\"]\n};\nvar faGlasses = {\n prefix: 'fas',\n iconName: 'glasses',\n icon: [576, 512, [], \"f530\", \"M574.1 280.37L528.75 98.66c-5.91-23.7-21.59-44.05-43-55.81-21.44-11.73-46.97-14.11-70.19-6.33l-15.25 5.08c-8.39 2.79-12.92 11.86-10.12 20.24l5.06 15.18c2.79 8.38 11.85 12.91 20.23 10.12l13.18-4.39c10.87-3.62 23-3.57 33.16 1.73 10.29 5.37 17.57 14.56 20.37 25.82l38.46 153.82c-22.19-6.81-49.79-12.46-81.2-12.46-34.77 0-73.98 7.02-114.85 26.74h-73.18c-40.87-19.74-80.08-26.75-114.86-26.75-31.42 0-59.02 5.65-81.21 12.46l38.46-153.83c2.79-11.25 10.09-20.45 20.38-25.81 10.16-5.3 22.28-5.35 33.15-1.73l13.17 4.39c8.38 2.79 17.44-1.74 20.23-10.12l5.06-15.18c2.8-8.38-1.73-17.45-10.12-20.24l-15.25-5.08c-23.22-7.78-48.75-5.41-70.19 6.33-21.41 11.77-37.09 32.11-43 55.8L1.9 280.37A64.218 64.218 0 0 0 0 295.86v70.25C0 429.01 51.58 480 115.2 480h37.12c60.28 0 110.37-45.94 114.88-105.37l2.93-38.63h35.75l2.93 38.63C313.31 434.06 363.4 480 423.68 480h37.12c63.62 0 115.2-50.99 115.2-113.88v-70.25c0-5.23-.64-10.43-1.9-15.5zm-370.72 89.42c-1.97 25.91-24.4 46.21-51.06 46.21H115.2C86.97 416 64 393.62 64 366.11v-37.54c18.12-6.49 43.42-12.92 72.58-12.92 23.86 0 47.26 4.33 69.93 12.92l-3.13 41.22zM512 366.12c0 27.51-22.97 49.88-51.2 49.88h-37.12c-26.67 0-49.1-20.3-51.06-46.21l-3.13-41.22c22.67-8.59 46.08-12.92 69.95-12.92 29.12 0 54.43 6.44 72.55 12.93v37.54z\"]\n};\nvar faGlobe = {\n prefix: 'fas',\n iconName: 'globe',\n icon: [496, 512, [], \"f0ac\", \"M336.5 160C322 70.7 287.8 8 248 8s-74 62.7-88.5 152h177zM152 256c0 22.2 1.2 43.5 3.3 64h185.3c2.1-20.5 3.3-41.8 3.3-64s-1.2-43.5-3.3-64H155.3c-2.1 20.5-3.3 41.8-3.3 64zm324.7-96c-28.6-67.9-86.5-120.4-158-141.6 24.4 33.8 41.2 84.7 50 141.6h108zM177.2 18.4C105.8 39.6 47.8 92.1 19.3 160h108c8.7-56.9 25.5-107.8 49.9-141.6zM487.4 192H372.7c2.1 21 3.3 42.5 3.3 64s-1.2 43-3.3 64h114.6c5.5-20.5 8.6-41.8 8.6-64s-3.1-43.5-8.5-64zM120 256c0-21.5 1.2-43 3.3-64H8.6C3.2 212.5 0 233.8 0 256s3.2 43.5 8.6 64h114.6c-2-21-3.2-42.5-3.2-64zm39.5 96c14.5 89.3 48.7 152 88.5 152s74-62.7 88.5-152h-177zm159.3 141.6c71.4-21.2 129.4-73.7 158-141.6h-108c-8.8 56.9-25.6 107.8-50 141.6zM19.3 352c28.6 67.9 86.5 120.4 158 141.6-24.4-33.8-41.2-84.7-50-141.6h-108z\"]\n};\nvar faGlobeAfrica = {\n prefix: 'fas',\n iconName: 'globe-africa',\n icon: [496, 512, [], \"f57c\", \"M248 8C111.03 8 0 119.03 0 256s111.03 248 248 248 248-111.03 248-248S384.97 8 248 8zm160 215.5v6.93c0 5.87-3.32 11.24-8.57 13.86l-15.39 7.7a15.485 15.485 0 0 1-15.53-.97l-18.21-12.14a15.52 15.52 0 0 0-13.5-1.81l-2.65.88c-9.7 3.23-13.66 14.79-7.99 23.3l13.24 19.86c2.87 4.31 7.71 6.9 12.89 6.9h8.21c8.56 0 15.5 6.94 15.5 15.5v11.34c0 3.35-1.09 6.62-3.1 9.3l-18.74 24.98c-1.42 1.9-2.39 4.1-2.83 6.43l-4.3 22.83c-.62 3.29-2.29 6.29-4.76 8.56a159.608 159.608 0 0 0-25 29.16l-13.03 19.55a27.756 27.756 0 0 1-23.09 12.36c-10.51 0-20.12-5.94-24.82-15.34a78.902 78.902 0 0 1-8.33-35.29V367.5c0-8.56-6.94-15.5-15.5-15.5h-25.88c-14.49 0-28.38-5.76-38.63-16a54.659 54.659 0 0 1-16-38.63v-14.06c0-17.19 8.1-33.38 21.85-43.7l27.58-20.69a54.663 54.663 0 0 1 32.78-10.93h.89c8.48 0 16.85 1.97 24.43 5.77l14.72 7.36c3.68 1.84 7.93 2.14 11.83.84l47.31-15.77c6.33-2.11 10.6-8.03 10.6-14.7 0-8.56-6.94-15.5-15.5-15.5h-10.09c-4.11 0-8.05-1.63-10.96-4.54l-6.92-6.92a15.493 15.493 0 0 0-10.96-4.54H199.5c-8.56 0-15.5-6.94-15.5-15.5v-4.4c0-7.11 4.84-13.31 11.74-15.04l14.45-3.61c3.74-.94 7-3.23 9.14-6.44l8.08-12.11c2.87-4.31 7.71-6.9 12.89-6.9h24.21c8.56 0 15.5-6.94 15.5-15.5v-21.7C359.23 71.63 422.86 131.02 441.93 208H423.5c-8.56 0-15.5 6.94-15.5 15.5z\"]\n};\nvar faGlobeAmericas = {\n prefix: 'fas',\n iconName: 'globe-americas',\n icon: [496, 512, [], \"f57d\", \"M248 8C111.03 8 0 119.03 0 256s111.03 248 248 248 248-111.03 248-248S384.97 8 248 8zm82.29 357.6c-3.9 3.88-7.99 7.95-11.31 11.28-2.99 3-5.1 6.7-6.17 10.71-1.51 5.66-2.73 11.38-4.77 16.87l-17.39 46.85c-13.76 3-28 4.69-42.65 4.69v-27.38c1.69-12.62-7.64-36.26-22.63-51.25-6-6-9.37-14.14-9.37-22.63v-32.01c0-11.64-6.27-22.34-16.46-27.97-14.37-7.95-34.81-19.06-48.81-26.11-11.48-5.78-22.1-13.14-31.65-21.75l-.8-.72a114.792 114.792 0 0 1-18.06-20.74c-9.38-13.77-24.66-36.42-34.59-51.14 20.47-45.5 57.36-82.04 103.2-101.89l24.01 12.01C203.48 89.74 216 82.01 216 70.11v-11.3c7.99-1.29 16.12-2.11 24.39-2.42l28.3 28.3c6.25 6.25 6.25 16.38 0 22.63L264 112l-10.34 10.34c-3.12 3.12-3.12 8.19 0 11.31l4.69 4.69c3.12 3.12 3.12 8.19 0 11.31l-8 8a8.008 8.008 0 0 1-5.66 2.34h-8.99c-2.08 0-4.08.81-5.58 2.27l-9.92 9.65a8.008 8.008 0 0 0-1.58 9.31l15.59 31.19c2.66 5.32-1.21 11.58-7.15 11.58h-5.64c-1.93 0-3.79-.7-5.24-1.96l-9.28-8.06a16.017 16.017 0 0 0-15.55-3.1l-31.17 10.39a11.95 11.95 0 0 0-8.17 11.34c0 4.53 2.56 8.66 6.61 10.69l11.08 5.54c9.41 4.71 19.79 7.16 30.31 7.16s22.59 27.29 32 32h66.75c8.49 0 16.62 3.37 22.63 9.37l13.69 13.69a30.503 30.503 0 0 1 8.93 21.57 46.536 46.536 0 0 1-13.72 32.98zM417 274.25c-5.79-1.45-10.84-5-14.15-9.97l-17.98-26.97a23.97 23.97 0 0 1 0-26.62l19.59-29.38c2.32-3.47 5.5-6.29 9.24-8.15l12.98-6.49C440.2 193.59 448 223.87 448 256c0 8.67-.74 17.16-1.82 25.54L417 274.25z\"]\n};\nvar faGlobeAsia = {\n prefix: 'fas',\n iconName: 'globe-asia',\n icon: [496, 512, [], \"f57e\", \"M248 8C111.03 8 0 119.03 0 256s111.03 248 248 248 248-111.03 248-248S384.97 8 248 8zm-11.34 240.23c-2.89 4.82-8.1 7.77-13.72 7.77h-.31c-4.24 0-8.31 1.69-11.31 4.69l-5.66 5.66c-3.12 3.12-3.12 8.19 0 11.31l5.66 5.66c3 3 4.69 7.07 4.69 11.31V304c0 8.84-7.16 16-16 16h-6.11c-6.06 0-11.6-3.42-14.31-8.85l-22.62-45.23c-2.44-4.88-8.95-5.94-12.81-2.08l-19.47 19.46c-3 3-7.07 4.69-11.31 4.69H50.81C49.12 277.55 48 266.92 48 256c0-110.28 89.72-200 200-200 21.51 0 42.2 3.51 61.63 9.82l-50.16 38.53c-5.11 3.41-4.63 11.06.86 13.81l10.83 5.41c5.42 2.71 8.84 8.25 8.84 14.31V216c0 4.42-3.58 8-8 8h-3.06c-3.03 0-5.8-1.71-7.15-4.42-1.56-3.12-5.96-3.29-7.76-.3l-17.37 28.95zM408 358.43c0 4.24-1.69 8.31-4.69 11.31l-9.57 9.57c-3 3-7.07 4.69-11.31 4.69h-15.16c-4.24 0-8.31-1.69-11.31-4.69l-13.01-13.01a26.767 26.767 0 0 0-25.42-7.04l-21.27 5.32c-1.27.32-2.57.48-3.88.48h-10.34c-4.24 0-8.31-1.69-11.31-4.69l-11.91-11.91a8.008 8.008 0 0 1-2.34-5.66v-10.2c0-3.27 1.99-6.21 5.03-7.43l39.34-15.74c1.98-.79 3.86-1.82 5.59-3.05l23.71-16.89a7.978 7.978 0 0 1 4.64-1.48h12.09c3.23 0 6.15 1.94 7.39 4.93l5.35 12.85a4 4 0 0 0 3.69 2.46h3.8c1.78 0 3.35-1.18 3.84-2.88l4.2-14.47c.5-1.71 2.06-2.88 3.84-2.88h6.06c2.21 0 4 1.79 4 4v12.93c0 2.12.84 4.16 2.34 5.66l11.91 11.91c3 3 4.69 7.07 4.69 11.31v24.6z\"]\n};\nvar faGlobeEurope = {\n prefix: 'fas',\n iconName: 'globe-europe',\n icon: [496, 512, [], \"f7a2\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm200 248c0 22.5-3.9 44.2-10.8 64.4h-20.3c-4.3 0-8.4-1.7-11.4-4.8l-32-32.6c-4.5-4.6-4.5-12.1.1-16.7l12.5-12.5v-8.7c0-3-1.2-5.9-3.3-8l-9.4-9.4c-2.1-2.1-5-3.3-8-3.3h-16c-6.2 0-11.3-5.1-11.3-11.3 0-3 1.2-5.9 3.3-8l9.4-9.4c2.1-2.1 5-3.3 8-3.3h32c6.2 0 11.3-5.1 11.3-11.3v-9.4c0-6.2-5.1-11.3-11.3-11.3h-36.7c-8.8 0-16 7.2-16 16v4.5c0 6.9-4.4 13-10.9 15.2l-31.6 10.5c-3.3 1.1-5.5 4.1-5.5 7.6v2.2c0 4.4-3.6 8-8 8h-16c-4.4 0-8-3.6-8-8s-3.6-8-8-8H247c-3 0-5.8 1.7-7.2 4.4l-9.4 18.7c-2.7 5.4-8.2 8.8-14.3 8.8H194c-8.8 0-16-7.2-16-16V199c0-4.2 1.7-8.3 4.7-11.3l20.1-20.1c4.6-4.6 7.2-10.9 7.2-17.5 0-3.4 2.2-6.5 5.5-7.6l40-13.3c1.7-.6 3.2-1.5 4.4-2.7l26.8-26.8c2.1-2.1 3.3-5 3.3-8 0-6.2-5.1-11.3-11.3-11.3H258l-16 16v8c0 4.4-3.6 8-8 8h-16c-4.4 0-8-3.6-8-8v-20c0-2.5 1.2-4.9 3.2-6.4l28.9-21.7c1.9-.1 3.8-.3 5.7-.3C358.3 56 448 145.7 448 256zM130.1 149.1c0-3 1.2-5.9 3.3-8l25.4-25.4c2.1-2.1 5-3.3 8-3.3 6.2 0 11.3 5.1 11.3 11.3v16c0 3-1.2 5.9-3.3 8l-9.4 9.4c-2.1 2.1-5 3.3-8 3.3h-16c-6.2 0-11.3-5.1-11.3-11.3zm128 306.4v-7.1c0-8.8-7.2-16-16-16h-20.2c-10.8 0-26.7-5.3-35.4-11.8l-22.2-16.7c-11.5-8.6-18.2-22.1-18.2-36.4v-23.9c0-16 8.4-30.8 22.1-39l42.9-25.7c7.1-4.2 15.2-6.5 23.4-6.5h31.2c10.9 0 21.4 3.9 29.6 10.9l43.2 37.1h18.3c8.5 0 16.6 3.4 22.6 9.4l17.3 17.3c3.4 3.4 8.1 5.3 12.9 5.3H423c-32.4 58.9-93.8 99.5-164.9 103.1z\"]\n};\nvar faGolfBall = {\n prefix: 'fas',\n iconName: 'golf-ball',\n icon: [416, 512, [], \"f450\", \"M96 416h224c0 17.7-14.3 32-32 32h-16c-17.7 0-32 14.3-32 32v20c0 6.6-5.4 12-12 12h-40c-6.6 0-12-5.4-12-12v-20c0-17.7-14.3-32-32-32h-16c-17.7 0-32-14.3-32-32zm320-208c0 74.2-39 139.2-97.5 176h-221C39 347.2 0 282.2 0 208 0 93.1 93.1 0 208 0s208 93.1 208 208zm-180.1 43.9c18.3 0 33.1-14.8 33.1-33.1 0-14.4-9.3-26.3-22.1-30.9 9.6 26.8-15.6 51.3-41.9 41.9 4.6 12.8 16.5 22.1 30.9 22.1zm49.1 46.9c0-14.4-9.3-26.3-22.1-30.9 9.6 26.8-15.6 51.3-41.9 41.9 4.6 12.8 16.5 22.1 30.9 22.1 18.3 0 33.1-14.9 33.1-33.1zm64-64c0-14.4-9.3-26.3-22.1-30.9 9.6 26.8-15.6 51.3-41.9 41.9 4.6 12.8 16.5 22.1 30.9 22.1 18.3 0 33.1-14.9 33.1-33.1z\"]\n};\nvar faGopuram = {\n prefix: 'fas',\n iconName: 'gopuram',\n icon: [512, 512, [], \"f664\", \"M496 352h-16V240c0-8.8-7.2-16-16-16h-16v-80c0-8.8-7.2-16-16-16h-16V16c0-8.8-7.2-16-16-16s-16 7.2-16 16v16h-64V16c0-8.8-7.2-16-16-16s-16 7.2-16 16v16h-64V16c0-8.8-7.2-16-16-16s-16 7.2-16 16v16h-64V16c0-8.8-7.2-16-16-16S96 7.2 96 16v112H80c-8.8 0-16 7.2-16 16v80H48c-8.8 0-16 7.2-16 16v112H16c-8.8 0-16 7.2-16 16v128c0 8.8 7.2 16 16 16h80V352h32V224h32v-96h32v96h-32v128h-32v160h80v-80c0-8.8 7.2-16 16-16h64c8.8 0 16 7.2 16 16v80h80V352h-32V224h-32v-96h32v96h32v128h32v160h80c8.8 0 16-7.2 16-16V368c0-8.8-7.2-16-16-16zM232 176c0-8.8 7.2-16 16-16h16c8.8 0 16 7.2 16 16v48h-48zm56 176h-64v-64c0-8.8 7.2-16 16-16h32c8.8 0 16 7.2 16 16z\"]\n};\nvar faGraduationCap = {\n prefix: 'fas',\n iconName: 'graduation-cap',\n icon: [640, 512, [], \"f19d\", \"M622.34 153.2L343.4 67.5c-15.2-4.67-31.6-4.67-46.79 0L17.66 153.2c-23.54 7.23-23.54 38.36 0 45.59l48.63 14.94c-10.67 13.19-17.23 29.28-17.88 46.9C38.78 266.15 32 276.11 32 288c0 10.78 5.68 19.85 13.86 25.65L20.33 428.53C18.11 438.52 25.71 448 35.94 448h56.11c10.24 0 17.84-9.48 15.62-19.47L82.14 313.65C90.32 307.85 96 298.78 96 288c0-11.57-6.47-21.25-15.66-26.87.76-15.02 8.44-28.3 20.69-36.72L296.6 284.5c9.06 2.78 26.44 6.25 46.79 0l278.95-85.7c23.55-7.24 23.55-38.36 0-45.6zM352.79 315.09c-28.53 8.76-52.84 3.92-65.59 0l-145.02-44.55L128 384c0 35.35 85.96 64 192 64s192-28.65 192-64l-14.18-113.47-145.03 44.56z\"]\n};\nvar faGreaterThan = {\n prefix: 'fas',\n iconName: 'greater-than',\n icon: [384, 512, [], \"f531\", \"M365.52 209.85L59.22 67.01c-16.06-7.49-35.15-.54-42.64 15.52L3.01 111.61c-7.49 16.06-.54 35.15 15.52 42.64L236.96 256.1 18.49 357.99C2.47 365.46-4.46 384.5 3.01 400.52l13.52 29C24 445.54 43.04 452.47 59.06 445l306.47-142.91a32.003 32.003 0 0 0 18.48-29v-34.23c-.01-12.45-7.21-23.76-18.49-29.01z\"]\n};\nvar faGreaterThanEqual = {\n prefix: 'fas',\n iconName: 'greater-than-equal',\n icon: [448, 512, [], \"f532\", \"M55.22 107.69l175.56 68.09-175.44 68.05c-18.39 6.03-27.88 24.39-21.2 41l12.09 30.08c6.68 16.61 26.99 25.19 45.38 19.15L393.02 214.2c13.77-4.52 22.98-16.61 22.98-30.17v-15.96c0-13.56-9.21-25.65-22.98-30.17L91.3 17.92c-18.29-6-38.51 2.53-45.15 19.06L34.12 66.9c-6.64 16.53 2.81 34.79 21.1 40.79zM424 400H24c-13.25 0-24 10.74-24 24v48c0 13.25 10.75 24 24 24h400c13.25 0 24-10.75 24-24v-48c0-13.26-10.75-24-24-24z\"]\n};\nvar faGrimace = {\n prefix: 'fas',\n iconName: 'grimace',\n icon: [496, 512, [], \"f57f\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zM144 400h-8c-17.7 0-32-14.3-32-32v-8h40v40zm0-56h-40v-8c0-17.7 14.3-32 32-32h8v40zm-8-136c0-17.7 14.3-32 32-32s32 14.3 32 32-14.3 32-32 32-32-14.3-32-32zm72 192h-48v-40h48v40zm0-56h-48v-40h48v40zm64 56h-48v-40h48v40zm0-56h-48v-40h48v40zm64 56h-48v-40h48v40zm0-56h-48v-40h48v40zm-8-104c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32zm64 128c0 17.7-14.3 32-32 32h-8v-40h40v8zm0-24h-40v-40h8c17.7 0 32 14.3 32 32v8z\"]\n};\nvar faGrin = {\n prefix: 'fas',\n iconName: 'grin',\n icon: [496, 512, [], \"f580\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm80 168c17.7 0 32 14.3 32 32s-14.3 32-32 32-32-14.3-32-32 14.3-32 32-32zm-160 0c17.7 0 32 14.3 32 32s-14.3 32-32 32-32-14.3-32-32 14.3-32 32-32zm80 256c-60.6 0-134.5-38.3-143.8-93.3-2-11.8 9.3-21.6 20.7-17.9C155.1 330.5 200 336 248 336s92.9-5.5 123.1-15.2c11.3-3.7 22.6 6.1 20.7 17.9-9.3 55-83.2 93.3-143.8 93.3z\"]\n};\nvar faGrinAlt = {\n prefix: 'fas',\n iconName: 'grin-alt',\n icon: [496, 512, [], \"f581\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm63.7 128.7c7.6-11.4 24.7-11.7 32.7 0 12.4 18.4 15.1 36.9 15.7 55.3-.5 18.4-3.3 36.9-15.7 55.3-7.6 11.4-24.7 11.7-32.7 0-12.4-18.4-15.1-36.9-15.7-55.3.5-18.4 3.3-36.9 15.7-55.3zm-160 0c7.6-11.4 24.7-11.7 32.7 0 12.4 18.4 15.1 36.9 15.7 55.3-.5 18.4-3.3 36.9-15.7 55.3-7.6 11.4-24.7 11.7-32.7 0-12.4-18.4-15.1-36.9-15.7-55.3.5-18.4 3.3-36.9 15.7-55.3zM248 432c-60.6 0-134.5-38.3-143.8-93.3-2-11.8 9.3-21.6 20.7-17.9C155.1 330.5 200 336 248 336s92.9-5.5 123.1-15.2c11.4-3.7 22.6 6.1 20.7 17.9-9.3 55-83.2 93.3-143.8 93.3z\"]\n};\nvar faGrinBeam = {\n prefix: 'fas',\n iconName: 'grin-beam',\n icon: [496, 512, [], \"f582\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm80 144c23.8 0 52.7 29.3 56 71.4.7 8.6-10.8 11.9-14.9 4.5l-9.5-17c-7.7-13.7-19.2-21.6-31.5-21.6s-23.8 7.9-31.5 21.6l-9.5 17c-4.1 7.3-15.6 4-14.9-4.5 3.1-42.1 32-71.4 55.8-71.4zm-160 0c23.8 0 52.7 29.3 56 71.4.7 8.6-10.8 11.9-14.9 4.5l-9.5-17c-7.7-13.7-19.2-21.6-31.5-21.6s-23.8 7.9-31.5 21.6l-9.5 17c-4.2 7.4-15.6 4-14.9-4.5 3.1-42.1 32-71.4 55.8-71.4zm80 280c-60.6 0-134.5-38.3-143.8-93.3-2-11.9 9.4-21.6 20.7-17.9C155.1 330.5 200 336 248 336s92.9-5.5 123.1-15.2c11.4-3.7 22.6 6.1 20.7 17.9-9.3 55-83.2 93.3-143.8 93.3z\"]\n};\nvar faGrinBeamSweat = {\n prefix: 'fas',\n iconName: 'grin-beam-sweat',\n icon: [504, 512, [], \"f583\", \"M456 128c26.5 0 48-21 48-47 0-20-28.5-60.4-41.6-77.8-3.2-4.3-9.6-4.3-12.8 0C436.5 20.6 408 61 408 81c0 26 21.5 47 48 47zm0 32c-44.1 0-80-35.4-80-79 0-4.4.3-14.2 8.1-32.2C345 23.1 298.3 8 248 8 111 8 0 119 0 256s111 248 248 248 248-111 248-248c0-35.1-7.4-68.4-20.5-98.6-6.3 1.5-12.7 2.6-19.5 2.6zm-128-8c23.8 0 52.7 29.3 56 71.4.7 8.6-10.8 12-14.9 4.5l-9.5-17c-7.7-13.7-19.2-21.6-31.5-21.6s-23.8 7.9-31.5 21.6l-9.5 17c-4.1 7.4-15.6 4-14.9-4.5 3.1-42.1 32-71.4 55.8-71.4zm-160 0c23.8 0 52.7 29.3 56 71.4.7 8.6-10.8 12-14.9 4.5l-9.5-17c-7.7-13.7-19.2-21.6-31.5-21.6s-23.8 7.9-31.5 21.6l-9.5 17c-4.2 7.4-15.6 4-14.9-4.5 3.1-42.1 32-71.4 55.8-71.4zm80 280c-60.6 0-134.5-38.3-143.8-93.3-2-11.8 9.3-21.6 20.7-17.9C155.1 330.5 200 336 248 336s92.9-5.5 123.1-15.2c11.5-3.7 22.6 6.2 20.7 17.9-9.3 55-83.2 93.3-143.8 93.3z\"]\n};\nvar faGrinHearts = {\n prefix: 'fas',\n iconName: 'grin-hearts',\n icon: [496, 512, [], \"f584\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zM90.4 183.6c6.7-17.6 26.7-26.7 44.9-21.9l7.1 1.9 2-7.1c5-18.1 22.8-30.9 41.5-27.9 21.4 3.4 34.4 24.2 28.8 44.5L195.3 243c-1.2 4.5-5.9 7.2-10.5 6l-70.2-18.2c-20.4-5.4-31.9-27-24.2-47.2zM248 432c-60.6 0-134.5-38.3-143.8-93.3-2-11.8 9.2-21.5 20.7-17.9C155.1 330.5 200 336 248 336s92.9-5.5 123.1-15.2c11.4-3.6 22.6 6.1 20.7 17.9-9.3 55-83.2 93.3-143.8 93.3zm133.4-201.3l-70.2 18.2c-4.5 1.2-9.2-1.5-10.5-6L281.3 173c-5.6-20.3 7.4-41.1 28.8-44.5 18.6-3 36.4 9.8 41.5 27.9l2 7.1 7.1-1.9c18.2-4.7 38.2 4.3 44.9 21.9 7.7 20.3-3.8 41.9-24.2 47.2z\"]\n};\nvar faGrinSquint = {\n prefix: 'fas',\n iconName: 'grin-squint',\n icon: [496, 512, [], \"f585\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm33.8 189.7l80-48c11.6-6.9 24 7.7 15.4 18L343.6 208l33.6 40.3c8.7 10.4-3.9 24.8-15.4 18l-80-48c-7.7-4.7-7.7-15.9 0-20.6zm-163-30c-8.6-10.3 3.8-24.9 15.4-18l80 48c7.8 4.7 7.8 15.9 0 20.6l-80 48c-11.5 6.8-24-7.6-15.4-18l33.6-40.3-33.6-40.3zM248 432c-60.6 0-134.5-38.3-143.8-93.3-2-11.9 9.4-21.6 20.7-17.9C155.1 330.5 200 336 248 336s92.9-5.5 123.1-15.2c11.5-3.7 22.6 6.2 20.7 17.9-9.3 55-83.2 93.3-143.8 93.3z\"]\n};\nvar faGrinSquintTears = {\n prefix: 'fas',\n iconName: 'grin-squint-tears',\n icon: [512, 512, [], \"f586\", \"M409.6 111.9c22.6-3.2 73.5-12 88.3-26.8 19.2-19.2 18.9-50.6-.7-70.2S446-5 426.9 14.2c-14.8 14.8-23.5 65.7-26.8 88.3-.8 5.5 3.9 10.2 9.5 9.4zM102.4 400.1c-22.6 3.2-73.5 12-88.3 26.8-19.1 19.1-18.8 50.6.8 70.2s51 19.9 70.2.7c14.8-14.8 23.5-65.7 26.8-88.3.8-5.5-3.9-10.2-9.5-9.4zm311.7-256.5c-33 3.9-48.6-25.1-45.7-45.7 3.4-24 7.4-42.1 11.5-56.5C285.1-13.4 161.8-.5 80.6 80.6-.5 161.7-13.4 285 41.4 379.9c14.4-4.1 32.4-8 56.5-11.5 33.2-3.9 48.6 25.2 45.7 45.7-3.4 24-7.4 42.1-11.5 56.5 94.8 54.8 218.1 41.9 299.3-39.2s94-204.4 39.2-299.3c-14.4 4.1-32.5 8-56.5 11.5zM255.7 106c3.3-13.2 22.4-11.5 23.6 1.8l4.8 52.3 52.3 4.8c13.4 1.2 14.9 20.3 1.8 23.6l-90.5 22.6c-8.9 2.2-16.7-5.9-14.5-14.5l22.5-90.6zm-90.9 230.3L160 284l-52.3-4.8c-13.4-1.2-14.9-20.3-1.8-23.6l90.5-22.6c8.8-2.2 16.7 5.8 14.5 14.5L188.3 338c-3.1 13.2-22.2 11.7-23.5-1.7zm215.7 44.2c-29.3 29.3-75.7 50.4-116.7 50.4-18.9 0-36.6-4.5-51-14.7-9.8-6.9-8.7-21.8 2-27.2 28.3-14.6 63.9-42.4 97.8-76.3s61.7-69.6 76.3-97.8c5.4-10.5 20.2-11.9 27.3-2 32.3 45.3 7.1 124.7-35.7 167.6z\"]\n};\nvar faGrinStars = {\n prefix: 'fas',\n iconName: 'grin-stars',\n icon: [496, 512, [], \"f587\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zM94.6 168.9l34.9-5 15.5-31.6c2.9-5.8 11-5.8 13.9 0l15.5 31.6 34.9 5c6.2 1 8.9 8.6 4.3 13.2l-25.4 24.6 6 34.9c1 6.2-5.3 11-11 7.9L152 233.3l-31.3 16.3c-5.7 3.1-12-1.7-11-7.9l6-34.9-25.4-24.6c-4.6-4.7-1.9-12.3 4.3-13.3zM248 432c-60.6 0-134.5-38.3-143.8-93.3-2-11.8 9.3-21.5 20.7-17.9C155.1 330.5 200 336 248 336s92.9-5.5 123.1-15.2c11.5-3.7 22.6 6.1 20.7 17.9-9.3 55-83.2 93.3-143.8 93.3zm157.7-249.9l-25.4 24.6 6 34.9c1 6.2-5.3 11-11 7.9L344 233.3l-31.3 16.3c-5.7 3.1-12-1.7-11-7.9l6-34.9-25.4-24.6c-4.5-4.6-1.9-12.2 4.3-13.2l34.9-5 15.5-31.6c2.9-5.8 11-5.8 13.9 0l15.5 31.6 34.9 5c6.3.9 9 8.5 4.4 13.1z\"]\n};\nvar faGrinTears = {\n prefix: 'fas',\n iconName: 'grin-tears',\n icon: [640, 512, [], \"f588\", \"M102.4 256.1c-22.6 3.2-73.5 12-88.3 26.8-19.1 19.1-18.8 50.6.8 70.2s51 19.9 70.2.7c14.8-14.8 23.5-65.7 26.8-88.3.8-5.5-3.9-10.2-9.5-9.4zm523.4 26.8c-14.8-14.8-65.7-23.5-88.3-26.8-5.5-.8-10.3 3.9-9.5 9.5 3.2 22.6 12 73.5 26.8 88.3 19.2 19.2 50.6 18.9 70.2-.7s20-51.2.8-70.3zm-129.4-12.8c-3.8-26.6 19.1-49.5 45.7-45.7 8.9 1.3 16.8 2.7 24.3 4.1C552.7 104.5 447.7 8 320 8S87.3 104.5 73.6 228.5c7.5-1.4 15.4-2.8 24.3-4.1 33.2-3.9 48.6 25.3 45.7 45.7-11.8 82.3-29.9 100.4-35.8 106.4-.9.9-2 1.6-3 2.5 42.7 74.6 123 125 215.2 125s172.5-50.4 215.2-125.1c-1-.9-2.1-1.5-3-2.5-5.9-5.9-24-24-35.8-106.3zM400 152c23.8 0 52.7 29.3 56 71.4.7 8.6-10.8 12-14.9 4.5l-9.5-17c-7.7-13.7-19.2-21.6-31.5-21.6s-23.8 7.9-31.5 21.6l-9.5 17c-4.2 7.4-15.6 4-14.9-4.5 3.1-42.1 32-71.4 55.8-71.4zm-160 0c23.8 0 52.7 29.3 56 71.4.7 8.6-10.8 12-14.9 4.5l-9.5-17c-7.7-13.7-19.2-21.6-31.5-21.6s-23.8 7.9-31.5 21.6l-9.5 17c-4.2 7.4-15.6 4-14.9-4.5 3.1-42.1 32-71.4 55.8-71.4zm80 280c-60.6 0-134.5-38.3-143.8-93.3-2-11.7 9.2-21.6 20.7-17.9C227.1 330.5 272 336 320 336s92.9-5.5 123.1-15.2c11.4-3.7 22.6 6.1 20.7 17.9-9.3 55-83.2 93.3-143.8 93.3z\"]\n};\nvar faGrinTongue = {\n prefix: 'fas',\n iconName: 'grin-tongue',\n icon: [496, 512, [], \"f589\", \"M248 8C111 8 0 119 0 256c0 106.3 67 196.7 161 232-5.6-12.2-9-25.7-9-40v-45.5c-24.7-16.2-43.5-38.1-47.8-63.8-2-11.8 9.3-21.5 20.7-17.9C155.1 330.5 200 336 248 336s92.9-5.5 123.1-15.2c11.4-3.6 22.6 6.1 20.7 17.9-4.3 25.7-23.1 47.6-47.8 63.8V448c0 14.3-3.4 27.8-9 40 94-35.3 161-125.7 161-232C496 119 385 8 248 8zm-80 232c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32zm160 0c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32zm-34.9 134.6c-14.4-6.5-31.1 2.2-34.6 17.6l-1.8 7.8c-2.1 9.2-15.2 9.2-17.3 0l-1.8-7.8c-3.5-15.4-20.2-24.1-34.6-17.6-.9.4.3-.2-18.9 9.4v63c0 35.2 28 64.5 63.1 64.9 35.7.5 64.9-28.4 64.9-64v-64c-19.5-9.6-18.2-8.9-19-9.3z\"]\n};\nvar faGrinTongueSquint = {\n prefix: 'fas',\n iconName: 'grin-tongue-squint',\n icon: [496, 512, [], \"f58a\", \"M293.1 374.6c-14.4-6.5-31.1 2.2-34.6 17.6l-1.8 7.8c-2.1 9.2-15.2 9.2-17.3 0l-1.8-7.8c-3.5-15.4-20.2-24.1-34.6-17.6-.9.4.3-.2-18.9 9.4v63c0 35.2 28 64.5 63.1 64.9 35.7.5 64.9-28.4 64.9-64v-64c-19.5-9.6-18.2-8.9-19-9.3zM248 8C111 8 0 119 0 256c0 106.3 67 196.7 161 232-5.6-12.2-9-25.7-9-40v-45.5c-24.7-16.2-43.5-38.1-47.8-63.8-2-11.8 9.2-21.5 20.7-17.9C155.1 330.5 200 336 248 336s92.9-5.5 123.1-15.2c11.4-3.7 22.6 6.1 20.7 17.9-4.3 25.7-23.1 47.6-47.8 63.8V448c0 14.3-3.4 27.8-9 40 94-35.3 161-125.7 161-232C496 119 385 8 248 8zm-33.8 210.3l-80 48c-11.5 6.8-24-7.6-15.4-18l33.6-40.3-33.6-40.3c-8.6-10.3 3.8-24.9 15.4-18l80 48c7.7 4.7 7.7 15.9 0 20.6zm163 30c8.7 10.4-3.9 24.8-15.4 18l-80-48c-7.8-4.7-7.8-15.9 0-20.6l80-48c11.7-6.9 23.9 7.7 15.4 18L343.6 208l33.6 40.3z\"]\n};\nvar faGrinTongueWink = {\n prefix: 'fas',\n iconName: 'grin-tongue-wink',\n icon: [496, 512, [], \"f58b\", \"M344 184c-13.3 0-24 10.7-24 24s10.7 24 24 24 24-10.7 24-24-10.7-24-24-24zM248 8C111 8 0 119 0 256c0 106.3 67 196.7 161 232-5.6-12.2-9-25.7-9-40v-45.5c-24.7-16.2-43.5-38.1-47.8-63.8-2-11.8 9.3-21.5 20.7-17.9C155.1 330.5 200 336 248 336s92.9-5.5 123.1-15.2c11.5-3.7 22.6 6.1 20.7 17.9-4.3 25.7-23.1 47.6-47.8 63.8V448c0 14.3-3.4 27.8-9 40 94-35.3 161-125.7 161-232C496 119 385 8 248 8zm-56 225l-9.5-8.5c-14.8-13.2-46.2-13.2-61 0L112 233c-8.5 7.4-21.6.3-19.8-10.8 4-25.2 34.2-42.1 59.9-42.1S208 197 212 222.2c1.6 11.1-11.6 18.2-20 10.8zm152 39c-35.3 0-64-28.7-64-64s28.7-64 64-64 64 28.7 64 64-28.7 64-64 64zm-50.9 102.6c-14.4-6.5-31.1 2.2-34.6 17.6l-1.8 7.8c-2.1 9.2-15.2 9.2-17.3 0l-1.8-7.8c-3.5-15.4-20.2-24.1-34.6-17.6-.9.4.3-.2-18.9 9.4v63c0 35.2 28 64.5 63.1 64.9 35.7.5 64.9-28.4 64.9-64v-64c-19.5-9.6-18.2-8.9-19-9.3z\"]\n};\nvar faGrinWink = {\n prefix: 'fas',\n iconName: 'grin-wink',\n icon: [496, 512, [], \"f58c\", \"M0 256c0 137 111 248 248 248s248-111 248-248S385 8 248 8 0 119 0 256zm200-48c0 17.7-14.3 32-32 32s-32-14.3-32-32 14.3-32 32-32 32 14.3 32 32zm168 25l-9.5-8.5c-14.8-13.2-46.2-13.2-61 0L288 233c-8.3 7.4-21.6.4-19.8-10.8 4-25.2 34.2-42.1 59.9-42.1S384 197 388 222.2c1.6 11-11.5 18.2-20 10.8zm-243.1 87.8C155.1 330.5 200 336 248 336s92.9-5.5 123.1-15.2c11.3-3.7 22.6 6 20.7 17.9-9.2 55-83.2 93.3-143.8 93.3s-134.5-38.3-143.8-93.3c-2-11.9 9.3-21.6 20.7-17.9z\"]\n};\nvar faGripHorizontal = {\n prefix: 'fas',\n iconName: 'grip-horizontal',\n icon: [448, 512, [], \"f58d\", \"M96 288H32c-17.67 0-32 14.33-32 32v64c0 17.67 14.33 32 32 32h64c17.67 0 32-14.33 32-32v-64c0-17.67-14.33-32-32-32zm160 0h-64c-17.67 0-32 14.33-32 32v64c0 17.67 14.33 32 32 32h64c17.67 0 32-14.33 32-32v-64c0-17.67-14.33-32-32-32zm160 0h-64c-17.67 0-32 14.33-32 32v64c0 17.67 14.33 32 32 32h64c17.67 0 32-14.33 32-32v-64c0-17.67-14.33-32-32-32zM96 96H32c-17.67 0-32 14.33-32 32v64c0 17.67 14.33 32 32 32h64c17.67 0 32-14.33 32-32v-64c0-17.67-14.33-32-32-32zm160 0h-64c-17.67 0-32 14.33-32 32v64c0 17.67 14.33 32 32 32h64c17.67 0 32-14.33 32-32v-64c0-17.67-14.33-32-32-32zm160 0h-64c-17.67 0-32 14.33-32 32v64c0 17.67 14.33 32 32 32h64c17.67 0 32-14.33 32-32v-64c0-17.67-14.33-32-32-32z\"]\n};\nvar faGripLines = {\n prefix: 'fas',\n iconName: 'grip-lines',\n icon: [512, 512, [], \"f7a4\", \"M496 288H16c-8.8 0-16 7.2-16 16v32c0 8.8 7.2 16 16 16h480c8.8 0 16-7.2 16-16v-32c0-8.8-7.2-16-16-16zm0-128H16c-8.8 0-16 7.2-16 16v32c0 8.8 7.2 16 16 16h480c8.8 0 16-7.2 16-16v-32c0-8.8-7.2-16-16-16z\"]\n};\nvar faGripLinesVertical = {\n prefix: 'fas',\n iconName: 'grip-lines-vertical',\n icon: [256, 512, [], \"f7a5\", \"M96 496V16c0-8.8-7.2-16-16-16H48c-8.8 0-16 7.2-16 16v480c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16zm128 0V16c0-8.8-7.2-16-16-16h-32c-8.8 0-16 7.2-16 16v480c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16z\"]\n};\nvar faGripVertical = {\n prefix: 'fas',\n iconName: 'grip-vertical',\n icon: [320, 512, [], \"f58e\", \"M96 32H32C14.33 32 0 46.33 0 64v64c0 17.67 14.33 32 32 32h64c17.67 0 32-14.33 32-32V64c0-17.67-14.33-32-32-32zm0 160H32c-17.67 0-32 14.33-32 32v64c0 17.67 14.33 32 32 32h64c17.67 0 32-14.33 32-32v-64c0-17.67-14.33-32-32-32zm0 160H32c-17.67 0-32 14.33-32 32v64c0 17.67 14.33 32 32 32h64c17.67 0 32-14.33 32-32v-64c0-17.67-14.33-32-32-32zM288 32h-64c-17.67 0-32 14.33-32 32v64c0 17.67 14.33 32 32 32h64c17.67 0 32-14.33 32-32V64c0-17.67-14.33-32-32-32zm0 160h-64c-17.67 0-32 14.33-32 32v64c0 17.67 14.33 32 32 32h64c17.67 0 32-14.33 32-32v-64c0-17.67-14.33-32-32-32zm0 160h-64c-17.67 0-32 14.33-32 32v64c0 17.67 14.33 32 32 32h64c17.67 0 32-14.33 32-32v-64c0-17.67-14.33-32-32-32z\"]\n};\nvar faGuitar = {\n prefix: 'fas',\n iconName: 'guitar',\n icon: [512, 512, [], \"f7a6\", \"M502.6 54.6L457.4 9.4c-12.5-12.5-32.8-12.5-45.3 0l-67.9 67.9c-12.5 12.5-12.5 32.8 0 45.3L290 176.7c-45.4-29-100.4-28.9-133.5 4.2-9.7 9.7-16.4 21.2-20.5 33.9-6.1 18.8-23.5 33.1-42.7 34.9-24 2.3-46.3 11.6-63.4 28.8C-16.3 324.6-8 407.6 48.2 463.8c56.2 56.2 139.2 64.4 185.3 18.3 17.2-17.1 26.5-39.4 28.8-63.5 1.8-19.1 16.1-36.6 34.9-42.7 12.7-4.1 24.2-10.8 33.9-20.5 33.1-33.1 33.1-88.1 4.2-133.5l54.2-54.2c12.5 12.5 32.8 12.5 45.3 0l67.9-67.9c12.4-12.4 12.4-32.7-.1-45.2zM208 352c-26.5 0-48-21.5-48-48s21.5-48 48-48 48 21.5 48 48-21.5 48-48 48z\"]\n};\nvar faHSquare = {\n prefix: 'fas',\n iconName: 'h-square',\n icon: [448, 512, [], \"f0fd\", \"M448 80v352c0 26.51-21.49 48-48 48H48c-26.51 0-48-21.49-48-48V80c0-26.51 21.49-48 48-48h352c26.51 0 48 21.49 48 48zm-112 48h-32c-8.837 0-16 7.163-16 16v80H160v-80c0-8.837-7.163-16-16-16h-32c-8.837 0-16 7.163-16 16v224c0 8.837 7.163 16 16 16h32c8.837 0 16-7.163 16-16v-80h128v80c0 8.837 7.163 16 16 16h32c8.837 0 16-7.163 16-16V144c0-8.837-7.163-16-16-16z\"]\n};\nvar faHamburger = {\n prefix: 'fas',\n iconName: 'hamburger',\n icon: [512, 512, [], \"f805\", \"M464 256H48a48 48 0 0 0 0 96h416a48 48 0 0 0 0-96zm16 128H32a16 16 0 0 0-16 16v16a64 64 0 0 0 64 64h352a64 64 0 0 0 64-64v-16a16 16 0 0 0-16-16zM58.64 224h394.72c34.57 0 54.62-43.9 34.82-75.88C448 83.2 359.55 32.1 256 32c-103.54.1-192 51.2-232.18 116.11C4 180.09 24.07 224 58.64 224zM384 112a16 16 0 1 1-16 16 16 16 0 0 1 16-16zM256 80a16 16 0 1 1-16 16 16 16 0 0 1 16-16zm-128 32a16 16 0 1 1-16 16 16 16 0 0 1 16-16z\"]\n};\nvar faHammer = {\n prefix: 'fas',\n iconName: 'hammer',\n icon: [576, 512, [], \"f6e3\", \"M571.31 193.94l-22.63-22.63c-6.25-6.25-16.38-6.25-22.63 0l-11.31 11.31-28.9-28.9c5.63-21.31.36-44.9-16.35-61.61l-45.25-45.25c-62.48-62.48-163.79-62.48-226.28 0l90.51 45.25v18.75c0 16.97 6.74 33.25 18.75 45.25l49.14 49.14c16.71 16.71 40.3 21.98 61.61 16.35l28.9 28.9-11.31 11.31c-6.25 6.25-6.25 16.38 0 22.63l22.63 22.63c6.25 6.25 16.38 6.25 22.63 0l90.51-90.51c6.23-6.24 6.23-16.37-.02-22.62zm-286.72-15.2c-3.7-3.7-6.84-7.79-9.85-11.95L19.64 404.96c-25.57 23.88-26.26 64.19-1.53 88.93s65.05 24.05 88.93-1.53l238.13-255.07c-3.96-2.91-7.9-5.87-11.44-9.41l-49.14-49.14z\"]\n};\nvar faHamsa = {\n prefix: 'fas',\n iconName: 'hamsa',\n icon: [512, 512, [], \"f665\", \"M509.34 307.25C504.28 295.56 492.75 288 480 288h-64V80c0-22-18-40-40-40s-40 18-40 40v134c0 5.52-4.48 10-10 10h-20c-5.52 0-10-4.48-10-10V40c0-22-18-40-40-40s-40 18-40 40v174c0 5.52-4.48 10-10 10h-20c-5.52 0-10-4.48-10-10V80c0-22-18-40-40-40S96 58 96 80v208H32c-12.75 0-24.28 7.56-29.34 19.25a31.966 31.966 0 0 0 5.94 34.58l102.69 110.03C146.97 490.08 199.69 512 256 512s109.03-21.92 144.72-60.14L503.4 341.83a31.966 31.966 0 0 0 5.94-34.58zM256 416c-53.02 0-96-64-96-64s42.98-64 96-64 96 64 96 64-42.98 64-96 64zm0-96c-17.67 0-32 14.33-32 32s14.33 32 32 32 32-14.33 32-32-14.33-32-32-32z\"]\n};\nvar faHandHolding = {\n prefix: 'fas',\n iconName: 'hand-holding',\n icon: [576, 512, [], \"f4bd\", \"M565.3 328.1c-11.8-10.7-30.2-10-42.6 0L430.3 402c-11.3 9.1-25.4 14-40 14H272c-8.8 0-16-7.2-16-16s7.2-16 16-16h78.3c15.9 0 30.7-10.9 33.3-26.6 3.3-20-12.1-37.4-31.6-37.4H192c-27 0-53.1 9.3-74.1 26.3L71.4 384H16c-8.8 0-16 7.2-16 16v96c0 8.8 7.2 16 16 16h356.8c14.5 0 28.6-4.9 40-14L564 377c15.2-12.1 16.4-35.3 1.3-48.9z\"]\n};\nvar faHandHoldingHeart = {\n prefix: 'fas',\n iconName: 'hand-holding-heart',\n icon: [576, 512, [], \"f4be\", \"M275.3 250.5c7 7.4 18.4 7.4 25.5 0l108.9-114.2c31.6-33.2 29.8-88.2-5.6-118.8-30.8-26.7-76.7-21.9-104.9 7.7L288 36.9l-11.1-11.6C248.7-4.4 202.8-9.2 172 17.5c-35.3 30.6-37.2 85.6-5.6 118.8l108.9 114.2zm290 77.6c-11.8-10.7-30.2-10-42.6 0L430.3 402c-11.3 9.1-25.4 14-40 14H272c-8.8 0-16-7.2-16-16s7.2-16 16-16h78.3c15.9 0 30.7-10.9 33.3-26.6 3.3-20-12.1-37.4-31.6-37.4H192c-27 0-53.1 9.3-74.1 26.3L71.4 384H16c-8.8 0-16 7.2-16 16v96c0 8.8 7.2 16 16 16h356.8c14.5 0 28.6-4.9 40-14L564 377c15.2-12.1 16.4-35.3 1.3-48.9z\"]\n};\nvar faHandHoldingUsd = {\n prefix: 'fas',\n iconName: 'hand-holding-usd',\n icon: [544, 512, [], \"f4c0\", \"M257.6 144.3l50 14.3c3.6 1 6.1 4.4 6.1 8.1 0 4.6-3.8 8.4-8.4 8.4h-32.8c-3.6 0-7.1-.8-10.3-2.2-4.8-2.2-10.4-1.7-14.1 2l-17.5 17.5c-5.3 5.3-4.7 14.3 1.5 18.4 9.5 6.3 20.3 10.1 31.8 11.5V240c0 8.8 7.2 16 16 16h16c8.8 0 16-7.2 16-16v-17.6c30.3-3.6 53.3-31 49.3-63-2.9-23-20.7-41.3-42.9-47.7l-50-14.3c-3.6-1-6.1-4.4-6.1-8.1 0-4.6 3.8-8.4 8.4-8.4h32.8c3.6 0 7.1.8 10.3 2.2 4.8 2.2 10.4 1.7 14.1-2l17.5-17.5c5.3-5.3 4.7-14.3-1.5-18.4-9.5-6.3-20.3-10.1-31.8-11.5V16c0-8.8-7.2-16-16-16h-16c-8.8 0-16 7.2-16 16v17.6c-30.3 3.6-53.3 31-49.3 63 2.9 23 20.7 41.3 42.9 47.7zm276.3 183.8c-11.2-10.7-28.5-10-40.3 0L406.4 402c-10.7 9.1-24 14-37.8 14H256.9c-8.3 0-15.1-7.2-15.1-16s6.8-16 15.1-16h73.9c15.1 0 29-10.9 31.4-26.6 3.1-20-11.5-37.4-29.8-37.4H181.3c-25.5 0-50.2 9.3-69.9 26.3L67.5 384H15.1C6.8 384 0 391.2 0 400v96c0 8.8 6.8 16 15.1 16H352c13.7 0 27-4.9 37.8-14l142.8-121c14.4-12.1 15.5-35.3 1.3-48.9z\"]\n};\nvar faHandLizard = {\n prefix: 'fas',\n iconName: 'hand-lizard',\n icon: [576, 512, [], \"f258\", \"M384 480h192V363.778a95.998 95.998 0 0 0-14.833-51.263L398.127 54.368A48 48 0 0 0 357.544 32H24C10.745 32 0 42.745 0 56v16c0 30.928 25.072 56 56 56h229.981c12.844 0 21.556 13.067 16.615 24.923l-21.41 51.385A32 32 0 0 1 251.648 224H128c-35.346 0-64 28.654-64 64v8c0 13.255 10.745 24 24 24h147.406a47.995 47.995 0 0 1 25.692 7.455l111.748 70.811A24.001 24.001 0 0 1 384 418.539V480z\"]\n};\nvar faHandMiddleFinger = {\n prefix: 'fas',\n iconName: 'hand-middle-finger',\n icon: [512, 512, [], \"f806\", \"M479.93 317.12a37.33 37.33 0 0 0-28.28-36.19L416 272v-49.59c0-11.44-9.69-21.29-23.15-23.54l-38.4-6.4C336.63 189.5 320 200.86 320 216v32a8 8 0 0 1-16 0V50c0-26.28-20.25-49.2-46.52-50A48 48 0 0 0 208 48v200a8 8 0 0 1-16 0v-32c0-15.15-16.63-26.51-34.45-23.54l-30.68 5.12c-18 3-30.87 16.12-30.87 31.38V376a8 8 0 0 1-16 0v-76l-27.36 15A37.34 37.34 0 0 0 32 348.4v73.47a37.31 37.31 0 0 0 10.93 26.39l30.93 30.93A112 112 0 0 0 153.05 512h215A112 112 0 0 0 480 400z\"]\n};\nvar faHandPaper = {\n prefix: 'fas',\n iconName: 'hand-paper',\n icon: [448, 512, [], \"f256\", \"M408.781 128.007C386.356 127.578 368 146.36 368 168.79V256h-8V79.79c0-22.43-18.356-41.212-40.781-40.783C297.488 39.423 280 57.169 280 79v177h-8V40.79C272 18.36 253.644-.422 231.219.007 209.488.423 192 18.169 192 40v216h-8V80.79c0-22.43-18.356-41.212-40.781-40.783C121.488 40.423 104 58.169 104 80v235.992l-31.648-43.519c-12.993-17.866-38.009-21.817-55.877-8.823-17.865 12.994-21.815 38.01-8.822 55.877l125.601 172.705A48 48 0 0 0 172.073 512h197.59c22.274 0 41.622-15.324 46.724-37.006l26.508-112.66a192.011 192.011 0 0 0 5.104-43.975V168c.001-21.831-17.487-39.577-39.218-39.993z\"]\n};\nvar faHandPeace = {\n prefix: 'fas',\n iconName: 'hand-peace',\n icon: [448, 512, [], \"f25b\", \"M408 216c-22.092 0-40 17.909-40 40h-8v-32c0-22.091-17.908-40-40-40s-40 17.909-40 40v32h-8V48c0-26.51-21.49-48-48-48s-48 21.49-48 48v208h-13.572L92.688 78.449C82.994 53.774 55.134 41.63 30.461 51.324 5.787 61.017-6.356 88.877 3.337 113.551l74.765 190.342-31.09 24.872c-15.381 12.306-19.515 33.978-9.741 51.081l64 112A39.998 39.998 0 0 0 136 512h240c18.562 0 34.686-12.77 38.937-30.838l32-136A39.97 39.97 0 0 0 448 336v-80c0-22.091-17.908-40-40-40z\"]\n};\nvar faHandPointDown = {\n prefix: 'fas',\n iconName: 'hand-point-down',\n icon: [384, 512, [], \"f0a7\", \"M91.826 467.2V317.966c-8.248 5.841-16.558 10.57-24.918 14.153C35.098 345.752-.014 322.222 0 288c.008-18.616 10.897-32.203 29.092-40 28.286-12.122 64.329-78.648 77.323-107.534 7.956-17.857 25.479-28.453 43.845-28.464l.001-.002h171.526c11.812 0 21.897 8.596 23.703 20.269 7.25 46.837 38.483 61.76 38.315 123.731-.007 2.724.195 13.254.195 16 0 50.654-22.122 81.574-71.263 72.6-9.297 18.597-39.486 30.738-62.315 16.45-21.177 24.645-53.896 22.639-70.944 6.299V467.2c0 24.15-20.201 44.8-43.826 44.8-23.283 0-43.826-21.35-43.826-44.8zM112 72V24c0-13.255 10.745-24 24-24h192c13.255 0 24 10.745 24 24v48c0 13.255-10.745 24-24 24H136c-13.255 0-24-10.745-24-24zm212-24c0-11.046-8.954-20-20-20s-20 8.954-20 20 8.954 20 20 20 20-8.954 20-20z\"]\n};\nvar faHandPointLeft = {\n prefix: 'fas',\n iconName: 'hand-point-left',\n icon: [512, 512, [], \"f0a5\", \"M44.8 155.826h149.234c-5.841-8.248-10.57-16.558-14.153-24.918C166.248 99.098 189.778 63.986 224 64c18.616.008 32.203 10.897 40 29.092 12.122 28.286 78.648 64.329 107.534 77.323 17.857 7.956 28.453 25.479 28.464 43.845l.002.001v171.526c0 11.812-8.596 21.897-20.269 23.703-46.837 7.25-61.76 38.483-123.731 38.315-2.724-.007-13.254.195-16 .195-50.654 0-81.574-22.122-72.6-71.263-18.597-9.297-30.738-39.486-16.45-62.315-24.645-21.177-22.639-53.896-6.299-70.944H44.8c-24.15 0-44.8-20.201-44.8-43.826 0-23.283 21.35-43.826 44.8-43.826zM440 176h48c13.255 0 24 10.745 24 24v192c0 13.255-10.745 24-24 24h-48c-13.255 0-24-10.745-24-24V200c0-13.255 10.745-24 24-24zm24 212c11.046 0 20-8.954 20-20s-8.954-20-20-20-20 8.954-20 20 8.954 20 20 20z\"]\n};\nvar faHandPointRight = {\n prefix: 'fas',\n iconName: 'hand-point-right',\n icon: [512, 512, [], \"f0a4\", \"M512 199.652c0 23.625-20.65 43.826-44.8 43.826h-99.851c16.34 17.048 18.346 49.766-6.299 70.944 14.288 22.829 2.147 53.017-16.45 62.315C353.574 425.878 322.654 448 272 448c-2.746 0-13.276-.203-16-.195-61.971.168-76.894-31.065-123.731-38.315C120.596 407.683 112 397.599 112 385.786V214.261l.002-.001c.011-18.366 10.607-35.889 28.464-43.845 28.886-12.994 95.413-49.038 107.534-77.323 7.797-18.194 21.384-29.084 40-29.092 34.222-.014 57.752 35.098 44.119 66.908-3.583 8.359-8.312 16.67-14.153 24.918H467.2c23.45 0 44.8 20.543 44.8 43.826zM96 200v192c0 13.255-10.745 24-24 24H24c-13.255 0-24-10.745-24-24V200c0-13.255 10.745-24 24-24h48c13.255 0 24 10.745 24 24zM68 368c0-11.046-8.954-20-20-20s-20 8.954-20 20 8.954 20 20 20 20-8.954 20-20z\"]\n};\nvar faHandPointUp = {\n prefix: 'fas',\n iconName: 'hand-point-up',\n icon: [384, 512, [], \"f0a6\", \"M135.652 0c23.625 0 43.826 20.65 43.826 44.8v99.851c17.048-16.34 49.766-18.346 70.944 6.299 22.829-14.288 53.017-2.147 62.315 16.45C361.878 158.426 384 189.346 384 240c0 2.746-.203 13.276-.195 16 .168 61.971-31.065 76.894-38.315 123.731C343.683 391.404 333.599 400 321.786 400H150.261l-.001-.002c-18.366-.011-35.889-10.607-43.845-28.464C93.421 342.648 57.377 276.122 29.092 264 10.897 256.203.008 242.616 0 224c-.014-34.222 35.098-57.752 66.908-44.119 8.359 3.583 16.67 8.312 24.918 14.153V44.8c0-23.45 20.543-44.8 43.826-44.8zM136 416h192c13.255 0 24 10.745 24 24v48c0 13.255-10.745 24-24 24H136c-13.255 0-24-10.745-24-24v-48c0-13.255 10.745-24 24-24zm168 28c-11.046 0-20 8.954-20 20s8.954 20 20 20 20-8.954 20-20-8.954-20-20-20z\"]\n};\nvar faHandPointer = {\n prefix: 'fas',\n iconName: 'hand-pointer',\n icon: [448, 512, [], \"f25a\", \"M448 240v96c0 3.084-.356 6.159-1.063 9.162l-32 136C410.686 499.23 394.562 512 376 512H168a40.004 40.004 0 0 1-32.35-16.473l-127.997-176c-12.993-17.866-9.043-42.883 8.822-55.876 17.867-12.994 42.884-9.043 55.877 8.823L104 315.992V40c0-22.091 17.908-40 40-40s40 17.909 40 40v200h8v-40c0-22.091 17.908-40 40-40s40 17.909 40 40v40h8v-24c0-22.091 17.908-40 40-40s40 17.909 40 40v24h8c0-22.091 17.908-40 40-40s40 17.909 40 40zm-256 80h-8v96h8v-96zm88 0h-8v96h8v-96zm88 0h-8v96h8v-96z\"]\n};\nvar faHandRock = {\n prefix: 'fas',\n iconName: 'hand-rock',\n icon: [512, 512, [], \"f255\", \"M464.8 80c-26.9-.4-48.8 21.2-48.8 48h-8V96.8c0-26.3-20.9-48.3-47.2-48.8-26.9-.4-48.8 21.2-48.8 48v32h-8V80.8c0-26.3-20.9-48.3-47.2-48.8-26.9-.4-48.8 21.2-48.8 48v48h-8V96.8c0-26.3-20.9-48.3-47.2-48.8-26.9-.4-48.8 21.2-48.8 48v136l-8-7.1v-48.1c0-26.3-20.9-48.3-47.2-48.8C21.9 127.6 0 149.2 0 176v66.4c0 27.4 11.7 53.5 32.2 71.8l111.7 99.3c10.2 9.1 16.1 22.2 16.1 35.9v6.7c0 13.3 10.7 24 24 24h240c13.3 0 24-10.7 24-24v-2.9c0-12.8 2.6-25.5 7.5-37.3l49-116.3c5-11.8 7.5-24.5 7.5-37.3V128.8c0-26.3-20.9-48.4-47.2-48.8z\"]\n};\nvar faHandScissors = {\n prefix: 'fas',\n iconName: 'hand-scissors',\n icon: [512, 512, [], \"f257\", \"M216 440c0-22.092 17.909-40 40-40v-8h-32c-22.091 0-40-17.908-40-40s17.909-40 40-40h32v-8H48c-26.51 0-48-21.49-48-48s21.49-48 48-48h208v-13.572l-177.551-69.74c-24.674-9.694-36.818-37.555-27.125-62.228 9.693-24.674 37.554-36.817 62.228-27.124l190.342 74.765 24.872-31.09c12.306-15.381 33.978-19.515 51.081-9.741l112 64A40.002 40.002 0 0 1 512 168v240c0 18.562-12.77 34.686-30.838 38.937l-136 32A39.982 39.982 0 0 1 336 480h-80c-22.091 0-40-17.908-40-40z\"]\n};\nvar faHandSpock = {\n prefix: 'fas',\n iconName: 'hand-spock',\n icon: [512, 512, [], \"f259\", \"M481.3 97.1c-21.5-5.1-43.1 8.2-48.2 29.6L402.3 256h-11.1l43.6-174.3c5.4-21.4-7.7-43.1-29.1-48.5s-43.1 7.7-48.5 29.1L308.8 256h-15.1L242 31.1c-5-21.6-26.4-35-48-30.1-21.5 4.9-35 26.4-30 47.9l47.6 207h-9.8L167 103.1c-4.9-21.5-26.3-35-47.9-30.1-21.5 4.9-35 26.3-30.1 47.9l39 171.6v79.4l-60.6-57c-16.1-15.1-41.4-14.4-56.5 1.7s-14.4 41.4 1.7 56.5L146.3 499c8.9 8.4 20.7 13 32.9 13h216.7c21.3 0 40-14 46-34.4l26.2-88.3c2.6-8.9 4-18 4-27.3v-42c0-7.5.9-15 2.6-22.2L511 145.3c5-21.5-8.3-43.1-29.7-48.2z\"]\n};\nvar faHands = {\n prefix: 'fas',\n iconName: 'hands',\n icon: [640, 512, [], \"f4c2\", \"M204.8 230.4c-10.6-14.1-30.7-17-44.8-6.4-14.1 10.6-17 30.7-6.4 44.8l38.1 50.8c4.8 6.4 4.1 15.3-1.5 20.9l-12.8 12.8c-6.7 6.7-17.6 6.2-23.6-1.1L64 244.4V96c0-17.7-14.3-32-32-32S0 78.3 0 96v218.4c0 10.9 3.7 21.5 10.5 30l104.1 134.3c5 6.5 8.4 13.9 10.4 21.7 1.8 6.9 8.1 11.6 15.3 11.6H272c8.8 0 16-7.2 16-16V384c0-27.7-9-54.6-25.6-76.8l-57.6-76.8zM608 64c-17.7 0-32 14.3-32 32v148.4l-89.8 107.8c-6 7.2-17 7.7-23.6 1.1l-12.8-12.8c-5.6-5.6-6.3-14.5-1.5-20.9l38.1-50.8c10.6-14.1 7.7-34.2-6.4-44.8-14.1-10.6-34.2-7.7-44.8 6.4l-57.6 76.8C361 329.4 352 356.3 352 384v112c0 8.8 7.2 16 16 16h131.7c7.1 0 13.5-4.7 15.3-11.6 2-7.8 5.4-15.2 10.4-21.7l104.1-134.3c6.8-8.5 10.5-19.1 10.5-30V96c0-17.7-14.3-32-32-32z\"]\n};\nvar faHandsHelping = {\n prefix: 'fas',\n iconName: 'hands-helping',\n icon: [640, 512, [], \"f4c4\", \"M488 192H336v56c0 39.7-32.3 72-72 72s-72-32.3-72-72V126.4l-64.9 39C107.8 176.9 96 197.8 96 220.2v47.3l-80 46.2C.7 322.5-4.6 342.1 4.3 357.4l80 138.6c8.8 15.3 28.4 20.5 43.7 11.7L231.4 448H368c35.3 0 64-28.7 64-64h16c17.7 0 32-14.3 32-32v-64h8c13.3 0 24-10.7 24-24v-48c0-13.3-10.7-24-24-24zm147.7-37.4L555.7 16C546.9.7 527.3-4.5 512 4.3L408.6 64H306.4c-12 0-23.7 3.4-33.9 9.7L239 94.6c-9.4 5.8-15 16.1-15 27.1V248c0 22.1 17.9 40 40 40s40-17.9 40-40v-88h184c30.9 0 56 25.1 56 56v28.5l80-46.2c15.3-8.9 20.5-28.4 11.7-43.7z\"]\n};\nvar faHandshake = {\n prefix: 'fas',\n iconName: 'handshake',\n icon: [640, 512, [], \"f2b5\", \"M434.7 64h-85.9c-8 0-15.7 3-21.6 8.4l-98.3 90c-.1.1-.2.3-.3.4-16.6 15.6-16.3 40.5-2.1 56 12.7 13.9 39.4 17.6 56.1 2.7.1-.1.3-.1.4-.2l79.9-73.2c6.5-5.9 16.7-5.5 22.6 1 6 6.5 5.5 16.6-1 22.6l-26.1 23.9L504 313.8c2.9 2.4 5.5 5 7.9 7.7V128l-54.6-54.6c-5.9-6-14.1-9.4-22.6-9.4zM544 128.2v223.9c0 17.7 14.3 32 32 32h64V128.2h-96zm48 223.9c-8.8 0-16-7.2-16-16s7.2-16 16-16 16 7.2 16 16-7.2 16-16 16zM0 384h64c17.7 0 32-14.3 32-32V128.2H0V384zm48-63.9c8.8 0 16 7.2 16 16s-7.2 16-16 16-16-7.2-16-16c0-8.9 7.2-16 16-16zm435.9 18.6L334.6 217.5l-30 27.5c-29.7 27.1-75.2 24.5-101.7-4.4-26.9-29.4-24.8-74.9 4.4-101.7L289.1 64h-83.8c-8.5 0-16.6 3.4-22.6 9.4L128 128v223.9h18.3l90.5 81.9c27.4 22.3 67.7 18.1 90-9.3l.2-.2 17.9 15.5c15.9 13 39.4 10.5 52.3-5.4l31.4-38.6 5.4 4.4c13.7 11.1 33.9 9.1 45-4.7l9.5-11.7c11.2-13.8 9.1-33.9-4.6-45.1z\"]\n};\nvar faHanukiah = {\n prefix: 'fas',\n iconName: 'hanukiah',\n icon: [640, 512, [], \"f6e6\", \"M232 160c-4.42 0-8 3.58-8 8v120h32V168c0-4.42-3.58-8-8-8h-16zm-64 0c-4.42 0-8 3.58-8 8v120h32V168c0-4.42-3.58-8-8-8h-16zm224 0c-4.42 0-8 3.58-8 8v120h32V168c0-4.42-3.58-8-8-8h-16zm64 0c-4.42 0-8 3.58-8 8v120h32V168c0-4.42-3.58-8-8-8h-16zm88 8c0-4.42-3.58-8-8-8h-16c-4.42 0-8 3.58-8 8v120h32V168zm-440-8c-4.42 0-8 3.58-8 8v120h32V168c0-4.42-3.58-8-8-8h-16zm520 0h-32c-8.84 0-16 7.16-16 16v112c0 17.67-14.33 32-32 32H352V128c0-8.84-7.16-16-16-16h-32c-8.84 0-16 7.16-16 16v192H96c-17.67 0-32-14.33-32-32V176c0-8.84-7.16-16-16-16H16c-8.84 0-16 7.16-16 16v112c0 53.02 42.98 96 96 96h192v64H112c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h416c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16H352v-64h192c53.02 0 96-42.98 96-96V176c0-8.84-7.16-16-16-16zm-16-32c13.25 0 24-11.94 24-26.67S608 48 608 48s-24 38.61-24 53.33S594.75 128 608 128zm-576 0c13.25 0 24-11.94 24-26.67S32 48 32 48 8 86.61 8 101.33 18.75 128 32 128zm288-48c13.25 0 24-11.94 24-26.67S320 0 320 0s-24 38.61-24 53.33S306.75 80 320 80zm-208 48c13.25 0 24-11.94 24-26.67S112 48 112 48s-24 38.61-24 53.33S98.75 128 112 128zm64 0c13.25 0 24-11.94 24-26.67S176 48 176 48s-24 38.61-24 53.33S162.75 128 176 128zm64 0c13.25 0 24-11.94 24-26.67S240 48 240 48s-24 38.61-24 53.33S226.75 128 240 128zm160 0c13.25 0 24-11.94 24-26.67S400 48 400 48s-24 38.61-24 53.33S386.75 128 400 128zm64 0c13.25 0 24-11.94 24-26.67S464 48 464 48s-24 38.61-24 53.33S450.75 128 464 128zm64 0c13.25 0 24-11.94 24-26.67S528 48 528 48s-24 38.61-24 53.33S514.75 128 528 128z\"]\n};\nvar faHardHat = {\n prefix: 'fas',\n iconName: 'hard-hat',\n icon: [512, 512, [], \"f807\", \"M480 288c0-80.25-49.28-148.92-119.19-177.62L320 192V80a16 16 0 0 0-16-16h-96a16 16 0 0 0-16 16v112l-40.81-81.62C81.28 139.08 32 207.75 32 288v64h448zm16 96H16a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h480a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16z\"]\n};\nvar faHashtag = {\n prefix: 'fas',\n iconName: 'hashtag',\n icon: [448, 512, [], \"f292\", \"M440.667 182.109l7.143-40c1.313-7.355-4.342-14.109-11.813-14.109h-74.81l14.623-81.891C377.123 38.754 371.468 32 363.997 32h-40.632a12 12 0 0 0-11.813 9.891L296.175 128H197.54l14.623-81.891C213.477 38.754 207.822 32 200.35 32h-40.632a12 12 0 0 0-11.813 9.891L132.528 128H53.432a12 12 0 0 0-11.813 9.891l-7.143 40C33.163 185.246 38.818 192 46.289 192h74.81L98.242 320H19.146a12 12 0 0 0-11.813 9.891l-7.143 40C-1.123 377.246 4.532 384 12.003 384h74.81L72.19 465.891C70.877 473.246 76.532 480 84.003 480h40.632a12 12 0 0 0 11.813-9.891L151.826 384h98.634l-14.623 81.891C234.523 473.246 240.178 480 247.65 480h40.632a12 12 0 0 0 11.813-9.891L315.472 384h79.096a12 12 0 0 0 11.813-9.891l7.143-40c1.313-7.355-4.342-14.109-11.813-14.109h-74.81l22.857-128h79.096a12 12 0 0 0 11.813-9.891zM261.889 320h-98.634l22.857-128h98.634l-22.857 128z\"]\n};\nvar faHatWizard = {\n prefix: 'fas',\n iconName: 'hat-wizard',\n icon: [512, 512, [], \"f6e8\", \"M496 448H16c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h480c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16zm-304-64l-64-32 64-32 32-64 32 64 64 32-64 32-16 32h208l-86.41-201.63a63.955 63.955 0 0 1-1.89-45.45L416 0 228.42 107.19a127.989 127.989 0 0 0-53.46 59.15L64 416h144l-16-32zm64-224l16-32 16 32 32 16-32 16-16 32-16-32-32-16 32-16z\"]\n};\nvar faHaykal = {\n prefix: 'fas',\n iconName: 'haykal',\n icon: [512, 512, [], \"f666\", \"M496.25 202.52l-110-15.44 41.82-104.34c6.67-16.64-11.6-32.18-26.59-22.63L307.44 120 273.35 12.82C270.64 4.27 263.32 0 256 0c-7.32 0-14.64 4.27-17.35 12.82l-34.09 107.19-94.04-59.89c-14.99-9.55-33.25 5.99-26.59 22.63l41.82 104.34-110 15.43c-17.54 2.46-21.68 26.27-6.03 34.67l98.16 52.66-74.48 83.54c-10.92 12.25-1.72 30.93 13.29 30.93 1.31 0 2.67-.14 4.07-.45l108.57-23.65-4.11 112.55c-.43 11.65 8.87 19.22 18.41 19.22 5.15 0 10.39-2.21 14.2-7.18l68.18-88.9 68.18 88.9c3.81 4.97 9.04 7.18 14.2 7.18 9.54 0 18.84-7.57 18.41-19.22l-4.11-112.55 108.57 23.65c17.36 3.76 29.21-17.2 17.35-30.49l-74.48-83.54 98.16-52.66c15.64-8.39 11.5-32.2-6.04-34.66zM338.51 311.68l-51.89-11.3 1.97 53.79L256 311.68l-32.59 42.49 1.96-53.79-51.89 11.3 35.6-39.93-46.92-25.17 52.57-7.38-19.99-49.87 44.95 28.62L256 166.72l16.29 51.23 44.95-28.62-19.99 49.87 52.57 7.38-46.92 25.17 35.61 39.93z\"]\n};\nvar faHdd = {\n prefix: 'fas',\n iconName: 'hdd',\n icon: [576, 512, [], \"f0a0\", \"M576 304v96c0 26.51-21.49 48-48 48H48c-26.51 0-48-21.49-48-48v-96c0-26.51 21.49-48 48-48h480c26.51 0 48 21.49 48 48zm-48-80a79.557 79.557 0 0 1 30.777 6.165L462.25 85.374A48.003 48.003 0 0 0 422.311 64H153.689a48 48 0 0 0-39.938 21.374L17.223 230.165A79.557 79.557 0 0 1 48 224h480zm-48 96c-17.673 0-32 14.327-32 32s14.327 32 32 32 32-14.327 32-32-14.327-32-32-32zm-96 0c-17.673 0-32 14.327-32 32s14.327 32 32 32 32-14.327 32-32-14.327-32-32-32z\"]\n};\nvar faHeading = {\n prefix: 'fas',\n iconName: 'heading',\n icon: [512, 512, [], \"f1dc\", \"M496 80V48c0-8.837-7.163-16-16-16H320c-8.837 0-16 7.163-16 16v32c0 8.837 7.163 16 16 16h37.621v128H154.379V96H192c8.837 0 16-7.163 16-16V48c0-8.837-7.163-16-16-16H32c-8.837 0-16 7.163-16 16v32c0 8.837 7.163 16 16 16h37.275v320H32c-8.837 0-16 7.163-16 16v32c0 8.837 7.163 16 16 16h160c8.837 0 16-7.163 16-16v-32c0-8.837-7.163-16-16-16h-37.621V288H357.62v128H320c-8.837 0-16 7.163-16 16v32c0 8.837 7.163 16 16 16h160c8.837 0 16-7.163 16-16v-32c0-8.837-7.163-16-16-16h-37.275V96H480c8.837 0 16-7.163 16-16z\"]\n};\nvar faHeadphones = {\n prefix: 'fas',\n iconName: 'headphones',\n icon: [512, 512, [], \"f025\", \"M256 32C114.52 32 0 146.496 0 288v48a32 32 0 0 0 17.689 28.622l14.383 7.191C34.083 431.903 83.421 480 144 480h24c13.255 0 24-10.745 24-24V280c0-13.255-10.745-24-24-24h-24c-31.342 0-59.671 12.879-80 33.627V288c0-105.869 86.131-192 192-192s192 86.131 192 192v1.627C427.671 268.879 399.342 256 368 256h-24c-13.255 0-24 10.745-24 24v176c0 13.255 10.745 24 24 24h24c60.579 0 109.917-48.098 111.928-108.187l14.382-7.191A32 32 0 0 0 512 336v-48c0-141.479-114.496-256-256-256z\"]\n};\nvar faHeadphonesAlt = {\n prefix: 'fas',\n iconName: 'headphones-alt',\n icon: [512, 512, [], \"f58f\", \"M160 288h-16c-35.35 0-64 28.7-64 64.12v63.76c0 35.41 28.65 64.12 64 64.12h16c17.67 0 32-14.36 32-32.06V320.06c0-17.71-14.33-32.06-32-32.06zm208 0h-16c-17.67 0-32 14.35-32 32.06v127.88c0 17.7 14.33 32.06 32 32.06h16c35.35 0 64-28.71 64-64.12v-63.76c0-35.41-28.65-64.12-64-64.12zM256 32C112.91 32 4.57 151.13 0 288v112c0 8.84 7.16 16 16 16h16c8.84 0 16-7.16 16-16V288c0-114.67 93.33-207.8 208-207.82 114.67.02 208 93.15 208 207.82v112c0 8.84 7.16 16 16 16h16c8.84 0 16-7.16 16-16V288C507.43 151.13 399.09 32 256 32z\"]\n};\nvar faHeadset = {\n prefix: 'fas',\n iconName: 'headset',\n icon: [512, 512, [], \"f590\", \"M192 208c0-17.67-14.33-32-32-32h-16c-35.35 0-64 28.65-64 64v48c0 35.35 28.65 64 64 64h16c17.67 0 32-14.33 32-32V208zm176 144c35.35 0 64-28.65 64-64v-48c0-35.35-28.65-64-64-64h-16c-17.67 0-32 14.33-32 32v112c0 17.67 14.33 32 32 32h16zM256 0C113.18 0 4.58 118.83 0 256v16c0 8.84 7.16 16 16 16h16c8.84 0 16-7.16 16-16v-16c0-114.69 93.31-208 208-208s208 93.31 208 208h-.12c.08 2.43.12 165.72.12 165.72 0 23.35-18.93 42.28-42.28 42.28H320c0-26.51-21.49-48-48-48h-32c-26.51 0-48 21.49-48 48s21.49 48 48 48h181.72c49.86 0 90.28-40.42 90.28-90.28V256C507.42 118.83 398.82 0 256 0z\"]\n};\nvar faHeart = {\n prefix: 'fas',\n iconName: 'heart',\n icon: [512, 512, [], \"f004\", \"M462.3 62.6C407.5 15.9 326 24.3 275.7 76.2L256 96.5l-19.7-20.3C186.1 24.3 104.5 15.9 49.7 62.6c-62.8 53.6-66.1 149.8-9.9 207.9l193.5 199.8c12.5 12.9 32.8 12.9 45.3 0l193.5-199.8c56.3-58.1 53-154.3-9.8-207.9z\"]\n};\nvar faHeartBroken = {\n prefix: 'fas',\n iconName: 'heart-broken',\n icon: [512, 512, [], \"f7a9\", \"M473.7 73.8l-2.4-2.5c-46-47-118-51.7-169.6-14.8L336 159.9l-96 64 48 128-144-144 96-64-28.6-86.5C159.7 19.6 87 24 40.7 71.4l-2.4 2.4C-10.4 123.6-12.5 202.9 31 256l212.1 218.6c7.1 7.3 18.6 7.3 25.7 0L481 255.9c43.5-53 41.4-132.3-7.3-182.1z\"]\n};\nvar faHeartbeat = {\n prefix: 'fas',\n iconName: 'heartbeat',\n icon: [512, 512, [], \"f21e\", \"M320.2 243.8l-49.7 99.4c-6 12.1-23.4 11.7-28.9-.6l-56.9-126.3-30 71.7H60.6l182.5 186.5c7.1 7.3 18.6 7.3 25.7 0L451.4 288H342.3l-22.1-44.2zM473.7 73.9l-2.4-2.5c-51.5-52.6-135.8-52.6-187.4 0L256 100l-27.9-28.5c-51.5-52.7-135.9-52.7-187.4 0l-2.4 2.4C-10.4 123.7-12.5 203 31 256h102.4l35.9-86.2c5.4-12.9 23.6-13.2 29.4-.4l58.2 129.3 49-97.9c5.9-11.8 22.7-11.8 28.6 0l27.6 55.2H481c43.5-53 41.4-132.3-7.3-182.1z\"]\n};\nvar faHelicopter = {\n prefix: 'fas',\n iconName: 'helicopter',\n icon: [640, 512, [], \"f533\", \"M304 384h272c17.67 0 32-14.33 32-32 0-123.71-100.29-224-224-224V64h176c8.84 0 16-7.16 16-16V16c0-8.84-7.16-16-16-16H144c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h176v64H112L68.8 70.4C65.78 66.37 61.03 64 56 64H16.01C5.6 64-2.04 73.78.49 83.88L32 192l160 64 86.4 115.2A31.992 31.992 0 0 0 304 384zm112-188.49C478.55 208.3 528.03 257.44 540.79 320H416V195.51zm219.37 263.3l-22.15-22.2c-6.25-6.26-16.24-6.1-22.64.01-7.09 6.77-13.84 11.25-24.64 11.25H240c-8.84 0-16 7.18-16 16.03v32.06c0 8.85 7.16 16.03 16 16.03h325.94c14.88 0 35.3-.47 68.45-29.52 7.02-6.14 7.57-17.05.98-23.66z\"]\n};\nvar faHighlighter = {\n prefix: 'fas',\n iconName: 'highlighter',\n icon: [544, 512, [], \"f591\", \"M0 479.98L99.92 512l35.45-35.45-67.04-67.04L0 479.98zm124.61-240.01a36.592 36.592 0 0 0-10.79 38.1l13.05 42.83-50.93 50.94 96.23 96.23 50.86-50.86 42.74 13.08c13.73 4.2 28.65-.01 38.15-10.78l35.55-41.64-173.34-173.34-41.52 35.44zm403.31-160.7l-63.2-63.2c-20.49-20.49-53.38-21.52-75.12-2.35L190.55 183.68l169.77 169.78L530.27 154.4c19.18-21.74 18.15-54.63-2.35-75.13z\"]\n};\nvar faHiking = {\n prefix: 'fas',\n iconName: 'hiking',\n icon: [384, 512, [], \"f6ec\", \"M80.95 472.23c-4.28 17.16 6.14 34.53 23.28 38.81 2.61.66 5.22.95 7.8.95 14.33 0 27.37-9.7 31.02-24.23l25.24-100.97-52.78-52.78-34.56 138.22zm14.89-196.12L137 117c2.19-8.42-3.14-16.95-11.92-19.06-43.88-10.52-88.35 15.07-99.32 57.17L.49 253.24c-2.19 8.42 3.14 16.95 11.92 19.06l63.56 15.25c8.79 2.1 17.68-3.02 19.87-11.44zM368 160h-16c-8.84 0-16 7.16-16 16v16h-34.75l-46.78-46.78C243.38 134.11 228.61 128 212.91 128c-27.02 0-50.47 18.3-57.03 44.52l-26.92 107.72a32.012 32.012 0 0 0 8.42 30.39L224 397.25V480c0 17.67 14.33 32 32 32s32-14.33 32-32v-82.75c0-17.09-6.66-33.16-18.75-45.25l-46.82-46.82c.15-.5.49-.89.62-1.41l19.89-79.57 22.43 22.43c6 6 14.14 9.38 22.62 9.38h48v240c0 8.84 7.16 16 16 16h16c8.84 0 16-7.16 16-16V176c.01-8.84-7.15-16-15.99-16zM240 96c26.51 0 48-21.49 48-48S266.51 0 240 0s-48 21.49-48 48 21.49 48 48 48z\"]\n};\nvar faHippo = {\n prefix: 'fas',\n iconName: 'hippo',\n icon: [640, 512, [], \"f6ed\", \"M581.12 96.2c-27.67-.15-52.5 17.58-76.6 26.62C489.98 88.27 455.83 64 416 64c-11.28 0-21.95 2.3-32 5.88V56c0-13.26-10.75-24-24-24h-16c-13.25 0-24 10.74-24 24v48.98C286.01 79.58 241.24 64 192 64 85.96 64 0 135.64 0 224v240c0 8.84 7.16 16 16 16h64c8.84 0 16-7.16 16-16v-70.79C128.35 407.57 166.72 416 208 416s79.65-8.43 112-22.79V464c0 8.84 7.16 16 16 16h64c8.84 0 16-7.16 16-16V288h128v32c0 8.84 7.16 16 16 16h32c8.84 0 16-7.16 16-16v-32c17.67 0 32-14.33 32-32v-92.02c0-34.09-24.79-67.59-58.88-67.78zM448 176c-8.84 0-16-7.16-16-16s7.16-16 16-16 16 7.16 16 16-7.16 16-16 16z\"]\n};\nvar faHistory = {\n prefix: 'fas',\n iconName: 'history',\n icon: [512, 512, [], \"f1da\", \"M504 255.531c.253 136.64-111.18 248.372-247.82 248.468-59.015.042-113.223-20.53-155.822-54.911-11.077-8.94-11.905-25.541-1.839-35.607l11.267-11.267c8.609-8.609 22.353-9.551 31.891-1.984C173.062 425.135 212.781 440 256 440c101.705 0 184-82.311 184-184 0-101.705-82.311-184-184-184-48.814 0-93.149 18.969-126.068 49.932l50.754 50.754c10.08 10.08 2.941 27.314-11.313 27.314H24c-8.837 0-16-7.163-16-16V38.627c0-14.254 17.234-21.393 27.314-11.314l49.372 49.372C129.209 34.136 189.552 8 256 8c136.81 0 247.747 110.78 248 247.531zm-180.912 78.784l9.823-12.63c8.138-10.463 6.253-25.542-4.21-33.679L288 256.349V152c0-13.255-10.745-24-24-24h-16c-13.255 0-24 10.745-24 24v135.651l65.409 50.874c10.463 8.137 25.541 6.253 33.679-4.21z\"]\n};\nvar faHockeyPuck = {\n prefix: 'fas',\n iconName: 'hockey-puck',\n icon: [512, 512, [], \"f453\", \"M0 160c0-53 114.6-96 256-96s256 43 256 96-114.6 96-256 96S0 213 0 160zm0 82.2V352c0 53 114.6 96 256 96s256-43 256-96V242.2c-113.4 82.3-398.5 82.4-512 0z\"]\n};\nvar faHollyBerry = {\n prefix: 'fas',\n iconName: 'holly-berry',\n icon: [448, 512, [], \"f7aa\", \"M144 192c26.5 0 48-21.5 48-48s-21.5-48-48-48-48 21.5-48 48 21.5 48 48 48zm112-48c0 26.5 21.5 48 48 48s48-21.5 48-48-21.5-48-48-48-48 21.5-48 48zm-32-48c26.5 0 48-21.5 48-48S250.5 0 224 0s-48 21.5-48 48 21.5 48 48 48zm-16.2 139.1c.1-12.4-13.1-20.1-23.8-13.7-34.3 20.3-71.4 32.7-108.7 36.2-9.7.9-15.6 11.3-11.6 20.2 6.2 13.9 11.1 28.6 14.7 43.8 3.6 15.2-5.3 30.6-20.2 35.1-14.9 4.5-30.1 7.6-45.3 9.1-9.7 1-15.7 11.3-11.7 20.2 15 32.8 22.9 69.5 23 107.7.1 14.4 15.2 23.1 27.6 16 33.2-19 68.9-30.5 104.8-33.9 9.7-.9 15.6-11.3 11.6-20.2-6.2-13.9-11.1-28.6-14.7-43.8-3.6-15.2 5.3-30.6 20.2-35.1 14.9-4.5 30.1-7.6 45.3-9.1 9.7-1 15.7-11.3 11.7-20.2-15.5-34.2-23.3-72.5-22.9-112.3zM435 365.6c-15.2-1.6-30.3-4.7-45.3-9.1-14.9-4.5-23.8-19.9-20.2-35.1 3.6-15.2 8.5-29.8 14.7-43.8 4-8.9-1.9-19.3-11.6-20.2-37.3-3.5-74.4-15.9-108.7-36.2-10.7-6.3-23.9 1.4-23.8 13.7 0 1.6-.2 3.2-.2 4.9.2 33.3 7 65.7 19.9 94 5.7 12.4 5.2 26.6-.6 38.9 4.9 1.2 9.9 2.2 14.8 3.7 14.9 4.5 23.8 19.9 20.2 35.1-3.6 15.2-8.5 29.8-14.7 43.8-4 8.9 1.9 19.3 11.6 20.2 35.9 3.4 71.6 14.9 104.8 33.9 12.5 7.1 27.6-1.6 27.6-16 .2-38.2 8-75 23-107.7 4.3-8.7-1.8-19.1-11.5-20.1z\"]\n};\nvar faHome = {\n prefix: 'fas',\n iconName: 'home',\n icon: [576, 512, [], \"f015\", \"M280.37 148.26L96 300.11V464a16 16 0 0 0 16 16l112.06-.29a16 16 0 0 0 15.92-16V368a16 16 0 0 1 16-16h64a16 16 0 0 1 16 16v95.64a16 16 0 0 0 16 16.05L464 480a16 16 0 0 0 16-16V300L295.67 148.26a12.19 12.19 0 0 0-15.3 0zM571.6 251.47L488 182.56V44.05a12 12 0 0 0-12-12h-56a12 12 0 0 0-12 12v72.61L318.47 43a48 48 0 0 0-61 0L4.34 251.47a12 12 0 0 0-1.6 16.9l25.5 31A12 12 0 0 0 45.15 301l235.22-193.74a12.19 12.19 0 0 1 15.3 0L530.9 301a12 12 0 0 0 16.9-1.6l25.5-31a12 12 0 0 0-1.7-16.93z\"]\n};\nvar faHorse = {\n prefix: 'fas',\n iconName: 'horse',\n icon: [576, 512, [], \"f6f0\", \"M575.92 76.6c-.01-8.13-3.02-15.87-8.58-21.8-3.78-4.03-8.58-9.12-13.69-14.5 11.06-6.84 19.5-17.49 22.18-30.66C576.85 4.68 572.96 0 567.9 0H447.92c-70.69 0-128 57.31-128 128H160c-28.84 0-54.4 12.98-72 33.11V160c-48.53 0-88 39.47-88 88v56c0 8.84 7.16 16 16 16h16c8.84 0 16-7.16 16-16v-56c0-13.22 6.87-24.39 16.78-31.68-.21 2.58-.78 5.05-.78 7.68 0 27.64 11.84 52.36 30.54 69.88l-25.72 68.6a63.945 63.945 0 0 0-2.16 37.99l24.85 99.41A15.982 15.982 0 0 0 107.02 512h65.96c10.41 0 18.05-9.78 15.52-19.88l-26.31-105.26 23.84-63.59L320 345.6V496c0 8.84 7.16 16 16 16h64c8.84 0 16-7.16 16-16V318.22c19.74-20.19 32-47.75 32-78.22 0-.22-.07-.42-.08-.64V136.89l16 7.11 18.9 37.7c7.45 14.87 25.05 21.55 40.49 15.37l32.55-13.02a31.997 31.997 0 0 0 20.12-29.74l-.06-77.71zm-64 19.4c-8.84 0-16-7.16-16-16s7.16-16 16-16 16 7.16 16 16-7.16 16-16 16z\"]\n};\nvar faHorseHead = {\n prefix: 'fas',\n iconName: 'horse-head',\n icon: [512, 512, [], \"f7ab\", \"M509.8 332.5l-69.9-164.3c-14.9-41.2-50.4-71-93-79.2 18-10.6 46.3-35.9 34.2-82.3-1.3-5-7.1-7.9-12-6.1L166.9 76.3C35.9 123.4 0 238.9 0 398.8V480c0 17.7 14.3 32 32 32h236.2c23.8 0 39.3-25 28.6-46.3L256 384v-.7c-45.6-3.5-84.6-30.7-104.3-69.6-1.6-3.1-.9-6.9 1.6-9.3l12.1-12.1c3.9-3.9 10.6-2.7 12.9 2.4 14.8 33.7 48.2 57.4 87.4 57.4 17.2 0 33-5.1 46.8-13.2l46 63.9c6 8.4 15.7 13.3 26 13.3h50.3c8.5 0 16.6-3.4 22.6-9.4l45.3-39.8c8.9-9.1 11.7-22.6 7.1-34.4zM328 224c-13.3 0-24-10.7-24-24s10.7-24 24-24 24 10.7 24 24-10.7 24-24 24z\"]\n};\nvar faHospital = {\n prefix: 'fas',\n iconName: 'hospital',\n icon: [448, 512, [], \"f0f8\", \"M448 492v20H0v-20c0-6.627 5.373-12 12-12h20V120c0-13.255 10.745-24 24-24h88V24c0-13.255 10.745-24 24-24h112c13.255 0 24 10.745 24 24v72h88c13.255 0 24 10.745 24 24v360h20c6.627 0 12 5.373 12 12zM308 192h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12v-40c0-6.627-5.373-12-12-12zm-168 64h40c6.627 0 12-5.373 12-12v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12zm104 128h-40c-6.627 0-12 5.373-12 12v84h64v-84c0-6.627-5.373-12-12-12zm64-96h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12v-40c0-6.627-5.373-12-12-12zm-116 12c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12v-40zM182 96h26v26a6 6 0 0 0 6 6h20a6 6 0 0 0 6-6V96h26a6 6 0 0 0 6-6V70a6 6 0 0 0-6-6h-26V38a6 6 0 0 0-6-6h-20a6 6 0 0 0-6 6v26h-26a6 6 0 0 0-6 6v20a6 6 0 0 0 6 6z\"]\n};\nvar faHospitalAlt = {\n prefix: 'fas',\n iconName: 'hospital-alt',\n icon: [576, 512, [], \"f47d\", \"M544 96H416V32c0-17.7-14.3-32-32-32H192c-17.7 0-32 14.3-32 32v64H32c-17.7 0-32 14.3-32 32v368c0 8.8 7.2 16 16 16h544c8.8 0 16-7.2 16-16V128c0-17.7-14.3-32-32-32zM160 436c0 6.6-5.4 12-12 12h-40c-6.6 0-12-5.4-12-12v-40c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v40zm0-128c0 6.6-5.4 12-12 12h-40c-6.6 0-12-5.4-12-12v-40c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v40zm160 128c0 6.6-5.4 12-12 12h-40c-6.6 0-12-5.4-12-12v-40c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v40zm0-128c0 6.6-5.4 12-12 12h-40c-6.6 0-12-5.4-12-12v-40c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v40zm16-170c0 3.3-2.7 6-6 6h-26v26c0 3.3-2.7 6-6 6h-20c-3.3 0-6-2.7-6-6v-26h-26c-3.3 0-6-2.7-6-6v-20c0-3.3 2.7-6 6-6h26V86c0-3.3 2.7-6 6-6h20c3.3 0 6 2.7 6 6v26h26c3.3 0 6 2.7 6 6v20zm144 298c0 6.6-5.4 12-12 12h-40c-6.6 0-12-5.4-12-12v-40c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v40zm0-128c0 6.6-5.4 12-12 12h-40c-6.6 0-12-5.4-12-12v-40c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v40z\"]\n};\nvar faHospitalSymbol = {\n prefix: 'fas',\n iconName: 'hospital-symbol',\n icon: [512, 512, [], \"f47e\", \"M256 0C114.6 0 0 114.6 0 256s114.6 256 256 256 256-114.6 256-256S397.4 0 256 0zm112 376c0 4.4-3.6 8-8 8h-48c-4.4 0-8-3.6-8-8v-88h-96v88c0 4.4-3.6 8-8 8h-48c-4.4 0-8-3.6-8-8V136c0-4.4 3.6-8 8-8h48c4.4 0 8 3.6 8 8v88h96v-88c0-4.4 3.6-8 8-8h48c4.4 0 8 3.6 8 8v240z\"]\n};\nvar faHotTub = {\n prefix: 'fas',\n iconName: 'hot-tub',\n icon: [512, 512, [], \"f593\", \"M414.21 177.65c1.02 8.21 7.75 14.35 15.75 14.35h16.12c9.51 0 17.08-8.57 16-18.35-4.34-39.11-22.4-74.53-50.13-97.16-17.37-14.17-28.82-36.75-31.98-62.15C378.96 6.14 372.22 0 364.23 0h-16.12c-9.51 0-17.09 8.57-16 18.35 4.34 39.11 22.4 74.53 50.13 97.16 17.36 14.17 28.82 36.75 31.97 62.14zm-108 0c1.02 8.21 7.75 14.35 15.75 14.35h16.12c9.51 0 17.08-8.57 16-18.35-4.34-39.11-22.4-74.53-50.13-97.16-17.37-14.17-28.82-36.75-31.98-62.15C270.96 6.14 264.22 0 256.23 0h-16.12c-9.51 0-17.09 8.57-16 18.35 4.34 39.11 22.4 74.53 50.13 97.16 17.36 14.17 28.82 36.75 31.97 62.14zM480 256H256l-110.93-83.2a63.99 63.99 0 0 0-38.4-12.8H64c-35.35 0-64 28.65-64 64v224c0 35.35 28.65 64 64 64h384c35.35 0 64-28.65 64-64V288c0-17.67-14.33-32-32-32zM128 440c0 4.42-3.58 8-8 8h-16c-4.42 0-8-3.58-8-8V328c0-4.42 3.58-8 8-8h16c4.42 0 8 3.58 8 8v112zm96 0c0 4.42-3.58 8-8 8h-16c-4.42 0-8-3.58-8-8V328c0-4.42 3.58-8 8-8h16c4.42 0 8 3.58 8 8v112zm96 0c0 4.42-3.58 8-8 8h-16c-4.42 0-8-3.58-8-8V328c0-4.42 3.58-8 8-8h16c4.42 0 8 3.58 8 8v112zm96 0c0 4.42-3.58 8-8 8h-16c-4.42 0-8-3.58-8-8V328c0-4.42 3.58-8 8-8h16c4.42 0 8 3.58 8 8v112zM64 128c35.35 0 64-28.65 64-64S99.35 0 64 0 0 28.65 0 64s28.65 64 64 64z\"]\n};\nvar faHotdog = {\n prefix: 'fas',\n iconName: 'hotdog',\n icon: [512, 512, [], \"f80f\", \"M488.56 23.44a80 80 0 0 0-113.12 0l-352 352a80 80 0 1 0 113.12 113.12l352-352a80 80 0 0 0 0-113.12zm-49.93 95.19c-19.6 19.59-37.52 22.67-51.93 25.14C373.76 146 364.4 147.6 352 160s-14 21.76-16.23 34.71c-2.48 14.4-5.55 32.33-25.15 51.92s-37.52 22.67-51.92 25.15C245.75 274 236.4 275.6 224 288s-14 21.75-16.23 34.7c-2.47 14.4-5.54 32.33-25.14 51.92s-37.53 22.68-51.93 25.15C117.76 402 108.4 403.6 96 416a16 16 0 0 1-22.63-22.63c19.6-19.59 37.52-22.67 51.92-25.14 13-2.22 22.3-3.82 34.71-16.23s14-21.75 16.22-34.7c2.48-14.4 5.55-32.33 25.15-51.92s37.52-22.67 51.92-25.14c13-2.22 22.3-3.83 34.7-16.23s14-21.76 16.24-34.71c2.47-14.4 5.54-32.33 25.14-51.92s37.52-22.68 51.92-25.15C394.24 110 403.59 108.41 416 96a16 16 0 0 1 22.63 22.63zM31.44 322.18L322.18 31.44l-11.54-11.55c-25-25-63.85-26.66-86.79-3.72L16.17 223.85c-22.94 22.94-21.27 61.79 3.72 86.78zm449.12-132.36L189.82 480.56l11.54 11.55c25 25 63.85 26.66 86.79 3.72l207.68-207.68c22.94-22.94 21.27-61.79-3.72-86.79z\"]\n};\nvar faHotel = {\n prefix: 'fas',\n iconName: 'hotel',\n icon: [576, 512, [], \"f594\", \"M560 64c8.84 0 16-7.16 16-16V16c0-8.84-7.16-16-16-16H16C7.16 0 0 7.16 0 16v32c0 8.84 7.16 16 16 16h15.98v384H16c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h240v-80c0-8.8 7.2-16 16-16h32c8.8 0 16 7.2 16 16v80h240c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16h-16V64h16zm-304 44.8c0-6.4 6.4-12.8 12.8-12.8h38.4c6.4 0 12.8 6.4 12.8 12.8v38.4c0 6.4-6.4 12.8-12.8 12.8h-38.4c-6.4 0-12.8-6.4-12.8-12.8v-38.4zm0 96c0-6.4 6.4-12.8 12.8-12.8h38.4c6.4 0 12.8 6.4 12.8 12.8v38.4c0 6.4-6.4 12.8-12.8 12.8h-38.4c-6.4 0-12.8-6.4-12.8-12.8v-38.4zm-128-96c0-6.4 6.4-12.8 12.8-12.8h38.4c6.4 0 12.8 6.4 12.8 12.8v38.4c0 6.4-6.4 12.8-12.8 12.8h-38.4c-6.4 0-12.8-6.4-12.8-12.8v-38.4zM179.2 256h-38.4c-6.4 0-12.8-6.4-12.8-12.8v-38.4c0-6.4 6.4-12.8 12.8-12.8h38.4c6.4 0 12.8 6.4 12.8 12.8v38.4c0 6.4-6.4 12.8-12.8 12.8zM192 384c0-53.02 42.98-96 96-96s96 42.98 96 96H192zm256-140.8c0 6.4-6.4 12.8-12.8 12.8h-38.4c-6.4 0-12.8-6.4-12.8-12.8v-38.4c0-6.4 6.4-12.8 12.8-12.8h38.4c6.4 0 12.8 6.4 12.8 12.8v38.4zm0-96c0 6.4-6.4 12.8-12.8 12.8h-38.4c-6.4 0-12.8-6.4-12.8-12.8v-38.4c0-6.4 6.4-12.8 12.8-12.8h38.4c6.4 0 12.8 6.4 12.8 12.8v38.4z\"]\n};\nvar faHourglass = {\n prefix: 'fas',\n iconName: 'hourglass',\n icon: [384, 512, [], \"f254\", \"M360 64c13.255 0 24-10.745 24-24V24c0-13.255-10.745-24-24-24H24C10.745 0 0 10.745 0 24v16c0 13.255 10.745 24 24 24 0 90.965 51.016 167.734 120.842 192C75.016 280.266 24 357.035 24 448c-13.255 0-24 10.745-24 24v16c0 13.255 10.745 24 24 24h336c13.255 0 24-10.745 24-24v-16c0-13.255-10.745-24-24-24 0-90.965-51.016-167.734-120.842-192C308.984 231.734 360 154.965 360 64z\"]\n};\nvar faHourglassEnd = {\n prefix: 'fas',\n iconName: 'hourglass-end',\n icon: [384, 512, [], \"f253\", \"M360 64c13.255 0 24-10.745 24-24V24c0-13.255-10.745-24-24-24H24C10.745 0 0 10.745 0 24v16c0 13.255 10.745 24 24 24 0 90.965 51.016 167.734 120.842 192C75.016 280.266 24 357.035 24 448c-13.255 0-24 10.745-24 24v16c0 13.255 10.745 24 24 24h336c13.255 0 24-10.745 24-24v-16c0-13.255-10.745-24-24-24 0-90.965-51.016-167.734-120.842-192C308.984 231.734 360 154.965 360 64zM192 208c-57.787 0-104-66.518-104-144h208c0 77.945-46.51 144-104 144z\"]\n};\nvar faHourglassHalf = {\n prefix: 'fas',\n iconName: 'hourglass-half',\n icon: [384, 512, [], \"f252\", \"M360 0H24C10.745 0 0 10.745 0 24v16c0 13.255 10.745 24 24 24 0 90.965 51.016 167.734 120.842 192C75.016 280.266 24 357.035 24 448c-13.255 0-24 10.745-24 24v16c0 13.255 10.745 24 24 24h336c13.255 0 24-10.745 24-24v-16c0-13.255-10.745-24-24-24 0-90.965-51.016-167.734-120.842-192C308.984 231.734 360 154.965 360 64c13.255 0 24-10.745 24-24V24c0-13.255-10.745-24-24-24zm-75.078 384H99.08c17.059-46.797 52.096-80 92.92-80 40.821 0 75.862 33.196 92.922 80zm.019-256H99.078C91.988 108.548 88 86.748 88 64h208c0 22.805-3.987 44.587-11.059 64z\"]\n};\nvar faHourglassStart = {\n prefix: 'fas',\n iconName: 'hourglass-start',\n icon: [384, 512, [], \"f251\", \"M360 0H24C10.745 0 0 10.745 0 24v16c0 13.255 10.745 24 24 24 0 90.965 51.016 167.734 120.842 192C75.016 280.266 24 357.035 24 448c-13.255 0-24 10.745-24 24v16c0 13.255 10.745 24 24 24h336c13.255 0 24-10.745 24-24v-16c0-13.255-10.745-24-24-24 0-90.965-51.016-167.734-120.842-192C308.984 231.734 360 154.965 360 64c13.255 0 24-10.745 24-24V24c0-13.255-10.745-24-24-24zm-64 448H88c0-77.458 46.204-144 104-144 57.786 0 104 66.517 104 144z\"]\n};\nvar faHouseDamage = {\n prefix: 'fas',\n iconName: 'house-damage',\n icon: [576, 512, [], \"f6f1\", \"M288 114.96L69.47 307.71c-1.62 1.46-3.69 2.14-5.47 3.35V496c0 8.84 7.16 16 16 16h149.23L192 439.19l104.11-64-60.16-119.22L384 392.75l-104.11 64L319.81 512H496c8.84 0 16-7.16 16-16V311.1c-1.7-1.16-3.72-1.82-5.26-3.2L288 114.96zm282.69 121.32L512 184.45V48c0-8.84-7.16-16-16-16h-64c-8.84 0-16 7.16-16 16v51.69L314.75 10.31C307.12 3.45 297.56.01 288 0s-19.1 3.41-26.7 10.27L5.31 236.28c-6.57 5.91-7.12 16.02-1.21 22.6l21.4 23.82c5.9 6.57 16.02 7.12 22.6 1.21L277.42 81.63c6.05-5.33 15.12-5.33 21.17 0L527.91 283.9c6.57 5.9 16.69 5.36 22.6-1.21l21.4-23.82c5.9-6.57 5.36-16.69-1.22-22.59z\"]\n};\nvar faHryvnia = {\n prefix: 'fas',\n iconName: 'hryvnia',\n icon: [384, 512, [], \"f6f2\", \"M368 240c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16h-41.86c13.41-28.63 13.74-63.33-4.13-94.05C303.34 49.84 267.1 32 229.96 32h-78.82c-24.32 0-47.86 8.53-66.54 24.09L72.83 65.9c-10.18 8.49-11.56 23.62-3.07 33.8l20.49 24.59c8.49 10.19 23.62 11.56 33.81 3.07l11.73-9.78c4.32-3.6 9.77-5.57 15.39-5.57h83.62c11.69 0 21.2 9.52 21.2 21.2 0 5.91-2.48 11.58-6.81 15.58L219.7 176H16c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h134.37l-34.67 32H16c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h41.86c-13.41 28.63-13.74 63.33 4.13 94.05C80.66 462.15 116.9 480 154.04 480h78.82c24.32 0 47.86-8.53 66.54-24.09l11.77-9.81c10.18-8.49 11.56-23.62 3.07-33.8l-20.49-24.59c-8.49-10.19-23.62-11.56-33.81-3.07l-11.75 9.8a23.992 23.992 0 0 1-15.36 5.56H149.2c-11.69 0-21.2-9.52-21.2-21.2 0-5.91 2.48-11.58 6.81-15.58L164.3 336H368c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16H233.63l34.67-32H368z\"]\n};\nvar faICursor = {\n prefix: 'fas',\n iconName: 'i-cursor',\n icon: [256, 512, [], \"f246\", \"M256 52.048V12.065C256 5.496 250.726.148 244.158.066 211.621-.344 166.469.011 128 37.959 90.266.736 46.979-.114 11.913.114 5.318.157 0 5.519 0 12.114v39.645c0 6.687 5.458 12.078 12.145 11.998C38.111 63.447 96 67.243 96 112.182V224H60c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h36v112c0 44.932-56.075 48.031-83.95 47.959C5.404 447.942 0 453.306 0 459.952v39.983c0 6.569 5.274 11.917 11.842 11.999 32.537.409 77.689.054 116.158-37.894 37.734 37.223 81.021 38.073 116.087 37.845 6.595-.043 11.913-5.405 11.913-12V460.24c0-6.687-5.458-12.078-12.145-11.998C217.889 448.553 160 444.939 160 400V288h36c6.627 0 12-5.373 12-12v-40c0-6.627-5.373-12-12-12h-36V112.182c0-44.932 56.075-48.213 83.95-48.142 6.646.018 12.05-5.346 12.05-11.992z\"]\n};\nvar faIceCream = {\n prefix: 'fas',\n iconName: 'ice-cream',\n icon: [448, 512, [], \"f810\", \"M368 160h-.94a144 144 0 1 0-286.12 0H80a48 48 0 0 0 0 96h288a48 48 0 0 0 0-96zM195.38 493.69a31.52 31.52 0 0 0 57.24 0L352 288H96z\"]\n};\nvar faIcicles = {\n prefix: 'fas',\n iconName: 'icicles',\n icon: [512, 512, [], \"f7ad\", \"M511.4 37.9C515.1 18.2 500 0 480 0H32C10.6 0-4.8 20.7 1.4 41.2l87.1 273.4c2.5 7.2 12.7 7.2 15.1 0L140 190.5l44.2 187.3c1.9 8.3 13.7 8.3 15.6 0l46.5-196.9 34.1 133.4c2.3 7.6 13 7.6 15.3 0l45.8-172.5 66.7 363.8c1.7 8.6 14 8.6 15.7 0l87.5-467.7z\"]\n};\nvar faIdBadge = {\n prefix: 'fas',\n iconName: 'id-badge',\n icon: [384, 512, [], \"f2c1\", \"M336 0H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V48c0-26.5-21.5-48-48-48zM144 32h96c8.8 0 16 7.2 16 16s-7.2 16-16 16h-96c-8.8 0-16-7.2-16-16s7.2-16 16-16zm48 128c35.3 0 64 28.7 64 64s-28.7 64-64 64-64-28.7-64-64 28.7-64 64-64zm112 236.8c0 10.6-10 19.2-22.4 19.2H102.4C90 416 80 407.4 80 396.8v-19.2c0-31.8 30.1-57.6 67.2-57.6h5c12.3 5.1 25.7 8 39.8 8s27.6-2.9 39.8-8h5c37.1 0 67.2 25.8 67.2 57.6v19.2z\"]\n};\nvar faIdCard = {\n prefix: 'fas',\n iconName: 'id-card',\n icon: [576, 512, [], \"f2c2\", \"M528 32H48C21.5 32 0 53.5 0 80v16h576V80c0-26.5-21.5-48-48-48zM0 432c0 26.5 21.5 48 48 48h480c26.5 0 48-21.5 48-48V128H0v304zm352-232c0-4.4 3.6-8 8-8h144c4.4 0 8 3.6 8 8v16c0 4.4-3.6 8-8 8H360c-4.4 0-8-3.6-8-8v-16zm0 64c0-4.4 3.6-8 8-8h144c4.4 0 8 3.6 8 8v16c0 4.4-3.6 8-8 8H360c-4.4 0-8-3.6-8-8v-16zm0 64c0-4.4 3.6-8 8-8h144c4.4 0 8 3.6 8 8v16c0 4.4-3.6 8-8 8H360c-4.4 0-8-3.6-8-8v-16zM176 192c35.3 0 64 28.7 64 64s-28.7 64-64 64-64-28.7-64-64 28.7-64 64-64zM67.1 396.2C75.5 370.5 99.6 352 128 352h8.2c12.3 5.1 25.7 8 39.8 8s27.6-2.9 39.8-8h8.2c28.4 0 52.5 18.5 60.9 44.2 3.2 9.9-5.2 19.8-15.6 19.8H82.7c-10.4 0-18.8-10-15.6-19.8z\"]\n};\nvar faIdCardAlt = {\n prefix: 'fas',\n iconName: 'id-card-alt',\n icon: [576, 512, [], \"f47f\", \"M528 64H384v96H192V64H48C21.5 64 0 85.5 0 112v352c0 26.5 21.5 48 48 48h480c26.5 0 48-21.5 48-48V112c0-26.5-21.5-48-48-48zM288 224c35.3 0 64 28.7 64 64s-28.7 64-64 64-64-28.7-64-64 28.7-64 64-64zm93.3 224H194.7c-10.4 0-18.8-10-15.6-19.8 8.3-25.6 32.4-44.2 60.9-44.2h8.2c12.3 5.1 25.7 8 39.8 8s27.6-2.9 39.8-8h8.2c28.4 0 52.5 18.5 60.9 44.2 3.2 9.8-5.2 19.8-15.6 19.8zM352 32c0-17.7-14.3-32-32-32h-64c-17.7 0-32 14.3-32 32v96h128V32z\"]\n};\nvar faIgloo = {\n prefix: 'fas',\n iconName: 'igloo',\n icon: [576, 512, [], \"f7ae\", \"M320 33.9c-10.5-1.2-21.2-1.9-32-1.9-99.8 0-187.8 50.8-239.4 128H320V33.9zM96 192H30.3C11.1 230.6 0 274 0 320h96V192zM352 39.4V160h175.4C487.2 99.9 424.8 55.9 352 39.4zM480 320h96c0-46-11.1-89.4-30.3-128H480v128zm-64 64v96h128c17.7 0 32-14.3 32-32v-96H411.5c2.6 10.3 4.5 20.9 4.5 32zm32-192H128v128h49.8c22.2-38.1 63-64 110.2-64s88 25.9 110.2 64H448V192zM0 448c0 17.7 14.3 32 32 32h128v-96c0-11.1 1.9-21.7 4.5-32H0v96zm288-160c-53 0-96 43-96 96v96h192v-96c0-53-43-96-96-96z\"]\n};\nvar faImage = {\n prefix: 'fas',\n iconName: 'image',\n icon: [512, 512, [], \"f03e\", \"M464 448H48c-26.51 0-48-21.49-48-48V112c0-26.51 21.49-48 48-48h416c26.51 0 48 21.49 48 48v288c0 26.51-21.49 48-48 48zM112 120c-30.928 0-56 25.072-56 56s25.072 56 56 56 56-25.072 56-56-25.072-56-56-56zM64 384h384V272l-87.515-87.515c-4.686-4.686-12.284-4.686-16.971 0L208 320l-55.515-55.515c-4.686-4.686-12.284-4.686-16.971 0L64 336v48z\"]\n};\nvar faImages = {\n prefix: 'fas',\n iconName: 'images',\n icon: [576, 512, [], \"f302\", \"M480 416v16c0 26.51-21.49 48-48 48H48c-26.51 0-48-21.49-48-48V176c0-26.51 21.49-48 48-48h16v208c0 44.112 35.888 80 80 80h336zm96-80V80c0-26.51-21.49-48-48-48H144c-26.51 0-48 21.49-48 48v256c0 26.51 21.49 48 48 48h384c26.51 0 48-21.49 48-48zM256 128c0 26.51-21.49 48-48 48s-48-21.49-48-48 21.49-48 48-48 48 21.49 48 48zm-96 144l55.515-55.515c4.686-4.686 12.284-4.686 16.971 0L272 256l135.515-135.515c4.686-4.686 12.284-4.686 16.971 0L512 208v112H160v-48z\"]\n};\nvar faInbox = {\n prefix: 'fas',\n iconName: 'inbox',\n icon: [576, 512, [], \"f01c\", \"M567.938 243.908L462.25 85.374A48.003 48.003 0 0 0 422.311 64H153.689a48 48 0 0 0-39.938 21.374L8.062 243.908A47.994 47.994 0 0 0 0 270.533V400c0 26.51 21.49 48 48 48h480c26.51 0 48-21.49 48-48V270.533a47.994 47.994 0 0 0-8.062-26.625zM162.252 128h251.497l85.333 128H376l-32 64H232l-32-64H76.918l85.334-128z\"]\n};\nvar faIndent = {\n prefix: 'fas',\n iconName: 'indent',\n icon: [448, 512, [], \"f03c\", \"M0 84V44c0-8.837 7.163-16 16-16h416c8.837 0 16 7.163 16 16v40c0 8.837-7.163 16-16 16H16c-8.837 0-16-7.163-16-16zm176 144h256c8.837 0 16-7.163 16-16v-40c0-8.837-7.163-16-16-16H176c-8.837 0-16 7.163-16 16v40c0 8.837 7.163 16 16 16zM16 484h416c8.837 0 16-7.163 16-16v-40c0-8.837-7.163-16-16-16H16c-8.837 0-16 7.163-16 16v40c0 8.837 7.163 16 16 16zm160-128h256c8.837 0 16-7.163 16-16v-40c0-8.837-7.163-16-16-16H176c-8.837 0-16 7.163-16 16v40c0 8.837 7.163 16 16 16zm-52.687-111.313l-96-95.984C17.266 138.652 0 145.776 0 160.016v191.975c0 14.329 17.325 21.304 27.313 11.313l96-95.992c6.249-6.247 6.249-16.377 0-22.625z\"]\n};\nvar faIndustry = {\n prefix: 'fas',\n iconName: 'industry',\n icon: [512, 512, [], \"f275\", \"M475.115 163.781L336 252.309v-68.28c0-18.916-20.931-30.399-36.885-20.248L160 252.309V56c0-13.255-10.745-24-24-24H24C10.745 32 0 42.745 0 56v400c0 13.255 10.745 24 24 24h464c13.255 0 24-10.745 24-24V184.029c0-18.917-20.931-30.399-36.885-20.248z\"]\n};\nvar faInfinity = {\n prefix: 'fas',\n iconName: 'infinity',\n icon: [640, 512, [], \"f534\", \"M471.1 96C405 96 353.3 137.3 320 174.6 286.7 137.3 235 96 168.9 96 75.8 96 0 167.8 0 256s75.8 160 168.9 160c66.1 0 117.8-41.3 151.1-78.6 33.3 37.3 85 78.6 151.1 78.6 93.1 0 168.9-71.8 168.9-160S564.2 96 471.1 96zM168.9 320c-40.2 0-72.9-28.7-72.9-64s32.7-64 72.9-64c38.2 0 73.4 36.1 94 64-20.4 27.6-55.9 64-94 64zm302.2 0c-38.2 0-73.4-36.1-94-64 20.4-27.6 55.9-64 94-64 40.2 0 72.9 28.7 72.9 64s-32.7 64-72.9 64z\"]\n};\nvar faInfo = {\n prefix: 'fas',\n iconName: 'info',\n icon: [192, 512, [], \"f129\", \"M20 424.229h20V279.771H20c-11.046 0-20-8.954-20-20V212c0-11.046 8.954-20 20-20h112c11.046 0 20 8.954 20 20v212.229h20c11.046 0 20 8.954 20 20V492c0 11.046-8.954 20-20 20H20c-11.046 0-20-8.954-20-20v-47.771c0-11.046 8.954-20 20-20zM96 0C56.235 0 24 32.235 24 72s32.235 72 72 72 72-32.235 72-72S135.764 0 96 0z\"]\n};\nvar faInfoCircle = {\n prefix: 'fas',\n iconName: 'info-circle',\n icon: [512, 512, [], \"f05a\", \"M256 8C119.043 8 8 119.083 8 256c0 136.997 111.043 248 248 248s248-111.003 248-248C504 119.083 392.957 8 256 8zm0 110c23.196 0 42 18.804 42 42s-18.804 42-42 42-42-18.804-42-42 18.804-42 42-42zm56 254c0 6.627-5.373 12-12 12h-88c-6.627 0-12-5.373-12-12v-24c0-6.627 5.373-12 12-12h12v-64h-12c-6.627 0-12-5.373-12-12v-24c0-6.627 5.373-12 12-12h64c6.627 0 12 5.373 12 12v100h12c6.627 0 12 5.373 12 12v24z\"]\n};\nvar faItalic = {\n prefix: 'fas',\n iconName: 'italic',\n icon: [320, 512, [], \"f033\", \"M204.758 416h-33.849l62.092-320h40.725a16 16 0 0 0 15.704-12.937l6.242-32C297.599 41.184 290.034 32 279.968 32H120.235a16 16 0 0 0-15.704 12.937l-6.242 32C96.362 86.816 103.927 96 113.993 96h33.846l-62.09 320H46.278a16 16 0 0 0-15.704 12.935l-6.245 32C22.402 470.815 29.967 480 40.034 480h158.479a16 16 0 0 0 15.704-12.935l6.245-32c1.927-9.88-5.638-19.065-15.704-19.065z\"]\n};\nvar faJedi = {\n prefix: 'fas',\n iconName: 'jedi',\n icon: [544, 512, [], \"f669\", \"M479.99 352l58.88-58.87c3.29-16.8 5.13-34.12 5.13-51.86 0-5.81-.68-11.51-1.05-17.27H496l41.25-41.24c-14.5-64.79-52.43-123.05-107.91-162.27-2.77-1.96-5.97-2.99-9.25-2.99-5.37 0-10.41 2.71-13.49 7.24-3.05 4.49-3.64 9.99-1.61 15.09 6.55 16.46 9.86 33.73 9.86 51.31 0 45.12-21.03 86.57-57.69 113.73-4.02 2.98-6.46 7.5-6.7 12.4-.24 4.92 1.76 9.66 5.49 13.03 32.93 29.75 47.35 73.51 38.57 117.07-9.74 48.35-48.84 87.1-97.31 96.5l-2.5-65.34L321.88 397c2.98 2.06 7.39 1.69 10.02-.8a8.002 8.002 0 0 0 1.34-9.92l-20.11-33.73 42.07-8.72c3.7-.75 6.38-4.05 6.38-7.83 0-3.77-2.69-7.06-6.38-7.83l-42.07-8.73 20.13-33.77c1.92-3.23 1.34-7.31-1.38-9.91-2.7-2.55-6.97-2.89-10-.8l-30.39 20.67L279.96 7.7a7.964 7.964 0 0 0-8-7.7c-4.33 0-7.84 3.38-8 7.67l-11.52 287.97-30.39-20.66c-3.14-2.12-7.27-1.83-10 .78-2.72 2.59-3.3 6.67-1.36 9.94l20.11 33.73-42.07 8.73c-3.7.75-6.38 4.05-6.38 7.83s2.67 7.08 6.38 7.83l42.07 8.72-20.13 33.77c-1.92 3.23-1.34 7.33 1.39 9.94 2.59 2.45 7.03 2.75 10 .75l27.16-18.48-2.5 65.26c-56.94-11.64-99.89-61.89-99.89-121.92 0-35.08 14.62-67.6 41.17-91.58 3.72-3.36 5.72-8.11 5.48-13.01-.24-4.9-2.68-9.41-6.69-12.38-36.67-27.16-57.71-68.62-57.71-113.74 0-17.56 3.31-34.81 9.84-51.26 2.02-5.09 1.43-10.59-1.62-15.09-3.08-4.54-8.13-7.25-13.51-7.25-3.3 0-6.5 1.04-9.27 3-55.87 39.52-93.6 97.37-107.97 162.07L47.93 224H.72c-.63 9.92-.97 19.91-.5 29.99.62 13.43 2.54 26.53 5.11 39.41l58.6 58.6H24.02c41.25 90.23 131.13 154.94 235.1 159.71 4.3.2 8.59.29 12.85.29 110.34 0 205.35-65.83 247.98-160h-39.96z\"]\n};\nvar faJoint = {\n prefix: 'fas',\n iconName: 'joint',\n icon: [640, 512, [], \"f595\", \"M444.34 181.1c22.38 15.68 35.66 41.16 35.66 68.59V280c0 4.42 3.58 8 8 8h48c4.42 0 8-3.58 8-8v-30.31c0-43.24-21.01-83.41-56.34-108.06C463.85 125.02 448 99.34 448 70.31V8c0-4.42-3.58-8-8-8h-48c-4.42 0-8 3.58-8 8v66.4c0 43.69 24.56 81.63 60.34 106.7zM194.97 358.98C126.03 370.07 59.69 394.69 0 432c83.65 52.28 180.3 80 278.94 80h88.57L254.79 380.49c-14.74-17.2-37.45-25.11-59.82-21.51zM553.28 87.09c-5.67-3.8-9.28-9.96-9.28-16.78V8c0-4.42-3.58-8-8-8h-48c-4.42 0-8 3.58-8 8v62.31c0 22.02 10.17 43.41 28.64 55.39C550.79 153.04 576 199.54 576 249.69V280c0 4.42 3.58 8 8 8h48c4.42 0 8-3.58 8-8v-30.31c0-65.44-32.41-126.19-86.72-162.6zM360.89 352.05c-34.4.06-86.81.15-88.21.17l117.8 137.43A63.987 63.987 0 0 0 439.07 512h88.45L409.57 374.4a63.955 63.955 0 0 0-48.68-22.35zM616 352H432l117.99 137.65A63.987 63.987 0 0 0 598.58 512H616c13.25 0 24-10.75 24-24V376c0-13.26-10.75-24-24-24z\"]\n};\nvar faJournalWhills = {\n prefix: 'fas',\n iconName: 'journal-whills',\n icon: [448, 512, [], \"f66a\", \"M448 358.4V25.6c0-16-9.6-25.6-25.6-25.6H96C41.6 0 0 41.6 0 96v320c0 54.4 41.6 96 96 96h326.4c12.8 0 25.6-9.6 25.6-25.6v-16c0-6.4-3.2-12.8-9.6-19.2-3.2-16-3.2-60.8 0-73.6 6.4-3.2 9.6-9.6 9.6-19.2zM133.08 144.39l21.26 21.26c1.56 1.56 3.61 2.34 5.66 2.34s4.09-.78 5.66-2.34c3.12-3.12 3.12-8.19 0-11.31l-26.42-26.42c10-20.9 26.24-37.97 46.37-49.26C179.62 88.4 176 99.74 176 112c0 19.96 9.33 37.57 23.66 49.31C190.01 171.37 184 184.96 184 200c0 26.94 19.04 49.4 44.38 54.76l1.36-32.71-10.37 7.04c-.69.45-1.47.69-2.25.69-1 0-1.98-.38-2.75-1.09a4.006 4.006 0 0 1-.69-4.95l8.54-14.31-17.91-3.72c-1.86-.39-3.19-2.03-3.19-3.92s1.33-3.53 3.19-3.92l17.91-3.72-8.54-14.31c-.95-1.61-.67-3.67.69-4.95 1.36-1.3 3.44-1.44 5-.41l12.01 8.16L236 71.83c.09-2.14 1.86-3.83 4-3.83s3.91 1.69 4 3.83l4.68 112.29 14.2-9.65a4.067 4.067 0 0 1 5 .41 4.006 4.006 0 0 1 .69 4.95l-8.54 14.31 17.91 3.72c1.86.39 3.19 2.03 3.19 3.92s-1.33 3.53-3.19 3.92l-17.91 3.72 8.54 14.31c.95 1.61.67 3.67-.69 4.95-.77.72-1.77 1.09-2.75 1.09-.78 0-1.56-.23-2.25-.69l-12.68-8.62 1.43 34.28C276.96 249.4 296 226.94 296 200c0-15.04-6.01-28.63-15.66-38.69C294.67 149.57 304 131.96 304 112c0-12.26-3.62-23.6-9.6-33.33 20.13 11.28 36.37 28.36 46.37 49.26l-26.42 26.42c-3.12 3.12-3.12 8.19 0 11.31 1.56 1.56 3.61 2.34 5.66 2.34s4.09-.78 5.66-2.34l21.26-21.26c2.97 10.08 5.07 20.55 5.07 31.6 0 .52-.14.99-.15 1.51l-37.11 32.47a7.975 7.975 0 0 0-.75 11.28 7.97 7.97 0 0 0 6.02 2.73c1.88 0 3.75-.66 5.27-1.98l23.59-20.64C337.32 250.96 293.09 288 240 288s-97.32-37.04-108.86-86.62l23.59 20.64A7.957 7.957 0 0 0 160 224c2.22 0 4.44-.92 6.02-2.73 2.92-3.33 2.58-8.38-.75-11.28l-37.11-32.47c-.01-.52-.15-.99-.15-1.51-.01-11.06 2.09-21.53 5.07-31.62zM380.8 448H96c-19.2 0-32-12.8-32-32s16-32 32-32h284.8v64z\"]\n};\nvar faKaaba = {\n prefix: 'fas',\n iconName: 'kaaba',\n icon: [576, 512, [], \"f66b\", \"M554.12 83.51L318.36 4.93a95.962 95.962 0 0 0-60.71 0L21.88 83.51A32.006 32.006 0 0 0 0 113.87v49.01l265.02-79.51c15.03-4.5 30.92-4.5 45.98 0l265 79.51v-49.01c0-13.77-8.81-26-21.88-30.36zm-279.9 30.52L0 196.3v228.38c0 15 10.42 27.98 25.06 31.24l242.12 53.8a95.937 95.937 0 0 0 41.65 0l242.12-53.8c14.64-3.25 25.06-16.24 25.06-31.24V196.29l-274.2-82.26c-9.04-2.72-18.59-2.72-27.59 0zM128 230.11c0 3.61-2.41 6.77-5.89 7.72l-80 21.82C37.02 261.03 32 257.2 32 251.93v-16.58c0-3.61 2.41-6.77 5.89-7.72l80-21.82c5.09-1.39 10.11 2.44 10.11 7.72v16.58zm144-39.28c0 3.61-2.41 6.77-5.89 7.72l-96 26.18c-5.09 1.39-10.11-2.44-10.11-7.72v-16.58c0-3.61 2.41-6.77 5.89-7.72l96-26.18c5.09-1.39 10.11 2.44 10.11 7.72v16.58zm176 22.7c0-5.28 5.02-9.11 10.11-7.72l80 21.82c3.48.95 5.89 4.11 5.89 7.72v16.58c0 5.28-5.02 9.11-10.11 7.72l-80-21.82a7.997 7.997 0 0 1-5.89-7.72v-16.58zm-144-39.27c0-5.28 5.02-9.11 10.11-7.72l96 26.18c3.48.95 5.89 4.11 5.89 7.72v16.58c0 5.28-5.02 9.11-10.11 7.72l-96-26.18a7.997 7.997 0 0 1-5.89-7.72v-16.58z\"]\n};\nvar faKey = {\n prefix: 'fas',\n iconName: 'key',\n icon: [512, 512, [], \"f084\", \"M512 176.001C512 273.203 433.202 352 336 352c-11.22 0-22.19-1.062-32.827-3.069l-24.012 27.014A23.999 23.999 0 0 1 261.223 384H224v40c0 13.255-10.745 24-24 24h-40v40c0 13.255-10.745 24-24 24H24c-13.255 0-24-10.745-24-24v-78.059c0-6.365 2.529-12.47 7.029-16.971l161.802-161.802C163.108 213.814 160 195.271 160 176 160 78.798 238.797.001 335.999 0 433.488-.001 512 78.511 512 176.001zM336 128c0 26.51 21.49 48 48 48s48-21.49 48-48-21.49-48-48-48-48 21.49-48 48z\"]\n};\nvar faKeyboard = {\n prefix: 'fas',\n iconName: 'keyboard',\n icon: [576, 512, [], \"f11c\", \"M528 448H48c-26.51 0-48-21.49-48-48V112c0-26.51 21.49-48 48-48h480c26.51 0 48 21.49 48 48v288c0 26.51-21.49 48-48 48zM128 180v-40c0-6.627-5.373-12-12-12H76c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm96 0v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm96 0v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm96 0v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm96 0v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm-336 96v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm96 0v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm96 0v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm96 0v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm-336 96v-40c0-6.627-5.373-12-12-12H76c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm288 0v-40c0-6.627-5.373-12-12-12H172c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h232c6.627 0 12-5.373 12-12zm96 0v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12z\"]\n};\nvar faKhanda = {\n prefix: 'fas',\n iconName: 'khanda',\n icon: [512, 512, [], \"f66d\", \"M415.81 66c-6.37-3.5-14.37-2.33-19.36 3.02a15.974 15.974 0 0 0-1.91 19.52c16.49 26.16 25.2 56.39 25.2 87.41-.19 53.25-26.77 102.69-71.27 132.41l-76.63 53.35v-20.1l44.05-36.09c3.92-4.2 5-10.09 2.81-15.28L310.85 273c33.84-19.26 56.94-55.25 56.94-96.99 0-40.79-22.02-76.13-54.59-95.71l5.22-11.44c2.34-5.53.93-11.83-3.57-16.04L255.86 0l-58.99 52.81c-4.5 4.21-5.9 10.51-3.57 16.04l5.22 11.44c-32.57 19.58-54.59 54.93-54.59 95.72 0 41.75 23.09 77.73 56.94 96.99l-7.85 17.24c-2.19 5.18-1.1 11.07 2.81 15.28l44.05 36.09v19.9l-76.59-53.33C119.02 278.62 92.44 229.19 92.26 176c0-31.08 8.71-61.31 25.2-87.47 3.87-6.16 2.4-13.77-2.59-19.08-5-5.34-13.68-6.2-20.02-2.7C16.32 109.6-22.3 205.3 13.36 295.99c7.07 17.99 17.89 34.38 30.46 49.06l55.97 65.36c4.87 5.69 13.04 7.24 19.65 3.72l79.35-42.23L228 392.23l-47.08 32.78c-1.67-.37-3.23-1.01-5.01-1.01-13.25 0-23.99 10.74-23.99 24 0 13.25 10.74 24 23.99 24 12.1 0 21.69-9.11 23.33-20.76l40.63-28.28v29.95c-9.39 5.57-15.99 15.38-15.99 27.1 0 17.67 14.32 32 31.98 32s31.98-14.33 31.98-32c0-11.71-6.61-21.52-15.99-27.1v-30.15l40.91 28.48C314.41 462.89 324 472 336.09 472c13.25 0 23.99-10.75 23.99-24 0-13.26-10.74-24-23.99-24-1.78 0-3.34.64-5.01 1.01L284 392.23l29.21-20.34 79.35 42.23c6.61 3.52 14.78 1.97 19.65-3.71l52.51-61.31c18.87-22.02 34-47.5 41.25-75.59 21.62-83.66-16.45-167.27-90.16-207.51zm-95.99 110c0 22.3-11.49 41.92-28.83 53.38l-5.65-12.41c-8.75-24.52-8.75-51.04 0-75.56l7.83-17.18c16.07 11.65 26.65 30.45 26.65 51.77zm-127.93 0c0-21.32 10.58-40.12 26.66-51.76l7.83 17.18c8.75 24.52 8.75 51.03 0 75.56l-5.65 12.41c-17.34-11.46-28.84-31.09-28.84-53.39z\"]\n};\nvar faKiss = {\n prefix: 'fas',\n iconName: 'kiss',\n icon: [496, 512, [], \"f596\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm-80 232c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32zm136 156c0 19.2-28.7 41.5-71.5 44-8.5.8-12.1-11.8-3.6-15.4l17-7.2c13-5.5 20.8-13.5 20.8-21.5s-7.8-16-20.8-21.5l-17-7.2c-6-2.5-6.1-12.2 0-14.8l17-7.2c13-5.5 20.8-13.5 20.8-21.5s-7.8-16-20.8-21.5l-17-7.2c-8.6-3.6-4.8-16.5 3.6-15.4 42.8 2.5 71.5 24.8 71.5 44 0 13-13.4 27.3-35.2 36C290.6 368.7 304 383 304 396zm24-156c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32z\"]\n};\nvar faKissBeam = {\n prefix: 'fas',\n iconName: 'kiss-beam',\n icon: [496, 512, [], \"f597\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm-39 219.9l-9.5-17c-7.7-13.7-19.2-21.6-31.5-21.6s-23.8 7.9-31.5 21.6l-9.5 17c-4.2 7.4-15.6 4-14.9-4.5 3.3-42.1 32.2-71.4 56-71.4s52.7 29.3 56 71.4c.5 8.5-10.9 12-15.1 4.5zM304 396c0 19.2-28.7 41.5-71.5 44-8.5.8-12.1-11.8-3.6-15.4l17-7.2c13-5.5 20.8-13.5 20.8-21.5s-7.8-16-20.8-21.5l-17-7.2c-6-2.5-6.1-12.2 0-14.8l17-7.2c13-5.5 20.8-13.5 20.8-21.5s-7.8-16-20.8-21.5l-17-7.2c-8.6-3.6-4.8-16.5 3.6-15.4 42.8 2.5 71.5 24.8 71.5 44 0 13-13.4 27.3-35.2 36C290.6 368.7 304 383 304 396zm65-168.1l-9.5-17c-7.7-13.7-19.2-21.6-31.5-21.6s-23.8 7.9-31.5 21.6l-9.5 17c-4.1 7.3-15.6 4-14.9-4.5 3.3-42.1 32.2-71.4 56-71.4s52.7 29.3 56 71.4c.5 8.5-10.9 12-15.1 4.5z\"]\n};\nvar faKissWinkHeart = {\n prefix: 'fas',\n iconName: 'kiss-wink-heart',\n icon: [504, 512, [], \"f598\", \"M501.1 402.5c-8-20.8-31.5-31.5-53.1-25.9l-8.4 2.2-2.3-8.4c-5.9-21.4-27-36.5-49-33-25.2 4-40.6 28.6-34 52.6l22.9 82.6c1.5 5.3 7 8.5 12.4 7.1l83-21.5c24.1-6.3 37.7-31.8 28.5-55.7zm-177.6-4c-5.6-20.3-2.3-42 9-59.7 29.7-46.3 98.7-45.5 127.8 4.3 6.4.1 12.6 1.4 18.6 2.9 10.9-27.9 17.1-58.2 17.1-90C496 119 385 8 248 8S0 119 0 256s111 248 248 248c35.4 0 68.9-7.5 99.4-20.9-.3-.7-23.9-84.6-23.9-84.6zM168 240c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32zm120 156c0 19.2-28.7 41.5-71.5 44-8.5.8-12.1-11.8-3.6-15.4l17-7.2c13-5.5 20.8-13.5 20.8-21.5s-7.8-16-20.8-21.5l-17-7.2c-6-2.5-5.7-12.3 0-14.8l17-7.2c13-5.5 20.8-13.5 20.8-21.5s-7.8-16-20.8-21.5l-17-7.2c-8.8-3.7-4.6-16.6 3.6-15.4 42.8 2.5 71.5 24.8 71.5 44 0 13-13.4 27.3-35.2 36C274.6 368.7 288 383 288 396zm16-179c-8.3 7.4-21.6.4-19.8-10.8 4-25.2 34.2-42.1 59.9-42.1S400 181 404 206.2c1.7 11.1-11.3 18.3-19.8 10.8l-9.5-8.5c-14.8-13.2-46.2-13.2-61 0L304 217z\"]\n};\nvar faKiwiBird = {\n prefix: 'fas',\n iconName: 'kiwi-bird',\n icon: [576, 512, [], \"f535\", \"M575.81 217.98C572.64 157.41 518.28 112 457.63 112h-9.37c-52.82 0-104.25-16.25-147.74-46.24-41.99-28.96-96.04-41.62-153.21-28.7C129.3 41.12-.08 78.24 0 224c.04 70.95 38.68 132.8 95.99 166.01V464c0 8.84 7.16 16 16 16h16c8.84 0 16-7.16 16-16v-54.26c15.36 3.96 31.4 6.26 48 6.26 5.44 0 10.68-.73 16-1.18V464c0 8.84 7.16 16 16 16h16c8.84 0 16-7.16 16-16v-59.43c14.24-5.06 27.88-11.39 40.34-19.51C342.07 355.25 393.86 336 448.46 336c25.48 0 16.01-.31 23.05-.78l74.41 136.44c2.86 5.23 8.3 8.34 14.05 8.34 1.31 0 2.64-.16 3.95-.5 7.09-1.8 12.05-8.19 12.05-15.5 0 0 .14-240.24-.16-246.02zM463.97 248c-13.25 0-24-10.75-24-24 0-13.26 10.75-24 24-24s24 10.74 24 24c0 13.25-10.75 24-24 24zm80 153.25l-39.86-73.08c15.12-5.83 28.73-14.6 39.86-25.98v99.06z\"]\n};\nvar faLandmark = {\n prefix: 'fas',\n iconName: 'landmark',\n icon: [512, 512, [], \"f66f\", \"M501.62 92.11L267.24 2.04a31.958 31.958 0 0 0-22.47 0L10.38 92.11A16.001 16.001 0 0 0 0 107.09V144c0 8.84 7.16 16 16 16h480c8.84 0 16-7.16 16-16v-36.91c0-6.67-4.14-12.64-10.38-14.98zM64 192v160H48c-8.84 0-16 7.16-16 16v48h448v-48c0-8.84-7.16-16-16-16h-16V192h-64v160h-96V192h-64v160h-96V192H64zm432 256H16c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h480c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16z\"]\n};\nvar faLanguage = {\n prefix: 'fas',\n iconName: 'language',\n icon: [640, 512, [], \"f1ab\", \"M152.1 236.2c-3.5-12.1-7.8-33.2-7.8-33.2h-.5s-4.3 21.1-7.8 33.2l-11.1 37.5H163zM616 96H336v320h280c13.3 0 24-10.7 24-24V120c0-13.3-10.7-24-24-24zm-24 120c0 6.6-5.4 12-12 12h-11.4c-6.9 23.6-21.7 47.4-42.7 69.9 8.4 6.4 17.1 12.5 26.1 18 5.5 3.4 7.3 10.5 4.1 16.2l-7.9 13.9c-3.4 5.9-10.9 7.8-16.7 4.3-12.6-7.8-24.5-16.1-35.4-24.9-10.9 8.7-22.7 17.1-35.4 24.9-5.8 3.5-13.3 1.6-16.7-4.3l-7.9-13.9c-3.2-5.6-1.4-12.8 4.2-16.2 9.3-5.7 18-11.7 26.1-18-7.9-8.4-14.9-17-21-25.7-4-5.7-2.2-13.6 3.7-17.1l6.5-3.9 7.3-4.3c5.4-3.2 12.4-1.7 16 3.4 5 7 10.8 14 17.4 20.9 13.5-14.2 23.8-28.9 30-43.2H412c-6.6 0-12-5.4-12-12v-16c0-6.6 5.4-12 12-12h64v-16c0-6.6 5.4-12 12-12h16c6.6 0 12 5.4 12 12v16h64c6.6 0 12 5.4 12 12zM0 120v272c0 13.3 10.7 24 24 24h280V96H24c-13.3 0-24 10.7-24 24zm58.9 216.1L116.4 167c1.7-4.9 6.2-8.1 11.4-8.1h32.5c5.1 0 9.7 3.3 11.4 8.1l57.5 169.1c2.6 7.8-3.1 15.9-11.4 15.9h-22.9a12 12 0 0 1-11.5-8.6l-9.4-31.9h-60.2l-9.1 31.8c-1.5 5.1-6.2 8.7-11.5 8.7H70.3c-8.2 0-14-8.1-11.4-15.9z\"]\n};\nvar faLaptop = {\n prefix: 'fas',\n iconName: 'laptop',\n icon: [640, 512, [], \"f109\", \"M624 416H381.54c-.74 19.81-14.71 32-32.74 32H288c-18.69 0-33.02-17.47-32.77-32H16c-8.8 0-16 7.2-16 16v16c0 35.2 28.8 64 64 64h512c35.2 0 64-28.8 64-64v-16c0-8.8-7.2-16-16-16zM576 48c0-26.4-21.6-48-48-48H112C85.6 0 64 21.6 64 48v336h512V48zm-64 272H128V64h384v256z\"]\n};\nvar faLaptopCode = {\n prefix: 'fas',\n iconName: 'laptop-code',\n icon: [640, 512, [], \"f5fc\", \"M255.03 261.65c6.25 6.25 16.38 6.25 22.63 0l11.31-11.31c6.25-6.25 6.25-16.38 0-22.63L253.25 192l35.71-35.72c6.25-6.25 6.25-16.38 0-22.63l-11.31-11.31c-6.25-6.25-16.38-6.25-22.63 0l-58.34 58.34c-6.25 6.25-6.25 16.38 0 22.63l58.35 58.34zm96.01-11.3l11.31 11.31c6.25 6.25 16.38 6.25 22.63 0l58.34-58.34c6.25-6.25 6.25-16.38 0-22.63l-58.34-58.34c-6.25-6.25-16.38-6.25-22.63 0l-11.31 11.31c-6.25 6.25-6.25 16.38 0 22.63L386.75 192l-35.71 35.72c-6.25 6.25-6.25 16.38 0 22.63zM624 416H381.54c-.74 19.81-14.71 32-32.74 32H288c-18.69 0-33.02-17.47-32.77-32H16c-8.8 0-16 7.2-16 16v16c0 35.2 28.8 64 64 64h512c35.2 0 64-28.8 64-64v-16c0-8.8-7.2-16-16-16zM576 48c0-26.4-21.6-48-48-48H112C85.6 0 64 21.6 64 48v336h512V48zm-64 272H128V64h384v256z\"]\n};\nvar faLaptopMedical = {\n prefix: 'fas',\n iconName: 'laptop-medical',\n icon: [640, 512, [], \"f812\", \"M232 224h56v56a8 8 0 0 0 8 8h48a8 8 0 0 0 8-8v-56h56a8 8 0 0 0 8-8v-48a8 8 0 0 0-8-8h-56v-56a8 8 0 0 0-8-8h-48a8 8 0 0 0-8 8v56h-56a8 8 0 0 0-8 8v48a8 8 0 0 0 8 8zM576 48a48.14 48.14 0 0 0-48-48H112a48.14 48.14 0 0 0-48 48v336h512zm-64 272H128V64h384zm112 96H381.54c-.74 19.81-14.71 32-32.74 32H288c-18.69 0-33-17.47-32.77-32H16a16 16 0 0 0-16 16v16a64.19 64.19 0 0 0 64 64h512a64.19 64.19 0 0 0 64-64v-16a16 16 0 0 0-16-16z\"]\n};\nvar faLaugh = {\n prefix: 'fas',\n iconName: 'laugh',\n icon: [496, 512, [], \"f599\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm80 152c17.7 0 32 14.3 32 32s-14.3 32-32 32-32-14.3-32-32 14.3-32 32-32zm-160 0c17.7 0 32 14.3 32 32s-14.3 32-32 32-32-14.3-32-32 14.3-32 32-32zm88 272h-16c-73.4 0-134-55-142.9-126-1.2-9.5 6.3-18 15.9-18h270c9.6 0 17.1 8.4 15.9 18-8.9 71-69.5 126-142.9 126z\"]\n};\nvar faLaughBeam = {\n prefix: 'fas',\n iconName: 'laugh-beam',\n icon: [496, 512, [], \"f59a\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm24 199.4c3.3-42.1 32.2-71.4 56-71.4s52.7 29.3 56 71.4c.7 8.6-10.8 11.9-14.9 4.5l-9.5-17c-7.7-13.7-19.2-21.6-31.5-21.6s-23.8 7.9-31.5 21.6l-9.5 17c-4.2 7.4-15.8 4.1-15.1-4.5zm-160 0c3.3-42.1 32.2-71.4 56-71.4s52.7 29.3 56 71.4c.7 8.6-10.8 11.9-14.9 4.5l-9.5-17c-7.7-13.7-19.2-21.6-31.5-21.6s-23.8 7.9-31.5 21.6l-9.5 17c-4.3 7.4-15.8 4-15.1-4.5zM398.9 306C390 377 329.4 432 256 432h-16c-73.4 0-134-55-142.9-126-1.2-9.5 6.3-18 15.9-18h270c9.6 0 17.1 8.4 15.9 18z\"]\n};\nvar faLaughSquint = {\n prefix: 'fas',\n iconName: 'laugh-squint',\n icon: [496, 512, [], \"f59b\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm33.8 161.7l80-48c11.6-6.9 24 7.7 15.4 18L343.6 180l33.6 40.3c8.7 10.4-3.9 24.8-15.4 18l-80-48c-7.7-4.7-7.7-15.9 0-20.6zm-163-30c-8.6-10.3 3.8-24.9 15.4-18l80 48c7.8 4.7 7.8 15.9 0 20.6l-80 48c-11.5 6.8-24-7.6-15.4-18l33.6-40.3-33.6-40.3zM398.9 306C390 377 329.4 432 256 432h-16c-73.4 0-134-55-142.9-126-1.2-9.5 6.3-18 15.9-18h270c9.6 0 17.1 8.4 15.9 18z\"]\n};\nvar faLaughWink = {\n prefix: 'fas',\n iconName: 'laugh-wink',\n icon: [496, 512, [], \"f59c\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm20.1 198.1c4-25.2 34.2-42.1 59.9-42.1s55.9 16.9 59.9 42.1c1.7 11.1-11.4 18.3-19.8 10.8l-9.5-8.5c-14.8-13.2-46.2-13.2-61 0L288 217c-8.4 7.4-21.6.3-19.9-10.9zM168 160c17.7 0 32 14.3 32 32s-14.3 32-32 32-32-14.3-32-32 14.3-32 32-32zm230.9 146C390 377 329.4 432 256 432h-16c-73.4 0-134-55-142.9-126-1.2-9.5 6.3-18 15.9-18h270c9.6 0 17.1 8.4 15.9 18z\"]\n};\nvar faLayerGroup = {\n prefix: 'fas',\n iconName: 'layer-group',\n icon: [512, 512, [], \"f5fd\", \"M12.41 148.02l232.94 105.67c6.8 3.09 14.49 3.09 21.29 0l232.94-105.67c16.55-7.51 16.55-32.52 0-40.03L266.65 2.31a25.607 25.607 0 0 0-21.29 0L12.41 107.98c-16.55 7.51-16.55 32.53 0 40.04zm487.18 88.28l-58.09-26.33-161.64 73.27c-7.56 3.43-15.59 5.17-23.86 5.17s-16.29-1.74-23.86-5.17L70.51 209.97l-58.1 26.33c-16.55 7.5-16.55 32.5 0 40l232.94 105.59c6.8 3.08 14.49 3.08 21.29 0L499.59 276.3c16.55-7.5 16.55-32.5 0-40zm0 127.8l-57.87-26.23-161.86 73.37c-7.56 3.43-15.59 5.17-23.86 5.17s-16.29-1.74-23.86-5.17L70.29 337.87 12.41 364.1c-16.55 7.5-16.55 32.5 0 40l232.94 105.59c6.8 3.08 14.49 3.08 21.29 0L499.59 404.1c16.55-7.5 16.55-32.5 0-40z\"]\n};\nvar faLeaf = {\n prefix: 'fas',\n iconName: 'leaf',\n icon: [576, 512, [], \"f06c\", \"M546.2 9.7c-5.6-12.5-21.6-13-28.3-1.2C486.9 62.4 431.4 96 368 96h-80C182 96 96 182 96 288c0 7 .8 13.7 1.5 20.5C161.3 262.8 253.4 224 384 224c8.8 0 16 7.2 16 16s-7.2 16-16 16C132.6 256 26 410.1 2.4 468c-6.6 16.3 1.2 34.9 17.5 41.6 16.4 6.8 35-1.1 41.8-17.3 1.5-3.6 20.9-47.9 71.9-90.6 32.4 43.9 94 85.8 174.9 77.2C465.5 467.5 576 326.7 576 154.3c0-50.2-10.8-102.2-29.8-144.6z\"]\n};\nvar faLemon = {\n prefix: 'fas',\n iconName: 'lemon',\n icon: [512, 512, [], \"f094\", \"M489.038 22.963C465.944-.13 434.648-5.93 413.947 6.129c-58.906 34.312-181.25-53.077-321.073 86.746S40.441 355.041 6.129 413.945c-12.059 20.702-6.26 51.999 16.833 75.093 23.095 23.095 54.392 28.891 75.095 16.832 58.901-34.31 181.246 53.079 321.068-86.743S471.56 156.96 505.871 98.056c12.059-20.702 6.261-51.999-16.833-75.093zM243.881 95.522c-58.189 14.547-133.808 90.155-148.358 148.358-1.817 7.27-8.342 12.124-15.511 12.124-1.284 0-2.59-.156-3.893-.481-8.572-2.144-13.784-10.83-11.642-19.403C81.901 166.427 166.316 81.93 236.119 64.478c8.575-2.143 17.261 3.069 19.403 11.642s-3.069 17.259-11.641 19.402z\"]\n};\nvar faLessThan = {\n prefix: 'fas',\n iconName: 'less-than',\n icon: [384, 512, [], \"f536\", \"M365.46 357.74L147.04 255.89l218.47-101.88c16.02-7.47 22.95-26.51 15.48-42.53l-13.52-29C360 66.46 340.96 59.53 324.94 67L18.48 209.91a32.014 32.014 0 0 0-18.48 29v34.24c0 12.44 7.21 23.75 18.48 29l306.31 142.83c16.06 7.49 35.15.54 42.64-15.52l13.56-29.08c7.49-16.06.54-35.15-15.53-42.64z\"]\n};\nvar faLessThanEqual = {\n prefix: 'fas',\n iconName: 'less-than-equal',\n icon: [448, 512, [], \"f537\", \"M54.98 214.2l301.41 119.87c18.39 6.03 38.71-2.54 45.38-19.15l12.09-30.08c6.68-16.61-2.82-34.97-21.21-41l-175.44-68.05 175.56-68.09c18.29-6 27.74-24.27 21.1-40.79l-12.03-29.92c-6.64-16.53-26.86-25.06-45.15-19.06L54.98 137.89C41.21 142.41 32 154.5 32 168.07v15.96c0 13.56 9.21 25.65 22.98 30.17zM424 400H24c-13.25 0-24 10.74-24 24v48c0 13.25 10.75 24 24 24h400c13.25 0 24-10.75 24-24v-48c0-13.26-10.75-24-24-24z\"]\n};\nvar faLevelDownAlt = {\n prefix: 'fas',\n iconName: 'level-down-alt',\n icon: [320, 512, [], \"f3be\", \"M313.553 392.331L209.587 504.334c-9.485 10.214-25.676 10.229-35.174 0L70.438 392.331C56.232 377.031 67.062 352 88.025 352H152V80H68.024a11.996 11.996 0 0 1-8.485-3.515l-56-56C-4.021 12.926 1.333 0 12.024 0H208c13.255 0 24 10.745 24 24v328h63.966c20.878 0 31.851 24.969 17.587 40.331z\"]\n};\nvar faLevelUpAlt = {\n prefix: 'fas',\n iconName: 'level-up-alt',\n icon: [320, 512, [], \"f3bf\", \"M313.553 119.669L209.587 7.666c-9.485-10.214-25.676-10.229-35.174 0L70.438 119.669C56.232 134.969 67.062 160 88.025 160H152v272H68.024a11.996 11.996 0 0 0-8.485 3.515l-56 56C-4.021 499.074 1.333 512 12.024 512H208c13.255 0 24-10.745 24-24V160h63.966c20.878 0 31.851-24.969 17.587-40.331z\"]\n};\nvar faLifeRing = {\n prefix: 'fas',\n iconName: 'life-ring',\n icon: [512, 512, [], \"f1cd\", \"M256 8C119.033 8 8 119.033 8 256s111.033 248 248 248 248-111.033 248-248S392.967 8 256 8zm173.696 119.559l-63.399 63.399c-10.987-18.559-26.67-34.252-45.255-45.255l63.399-63.399a218.396 218.396 0 0 1 45.255 45.255zM256 352c-53.019 0-96-42.981-96-96s42.981-96 96-96 96 42.981 96 96-42.981 96-96 96zM127.559 82.304l63.399 63.399c-18.559 10.987-34.252 26.67-45.255 45.255l-63.399-63.399a218.372 218.372 0 0 1 45.255-45.255zM82.304 384.441l63.399-63.399c10.987 18.559 26.67 34.252 45.255 45.255l-63.399 63.399a218.396 218.396 0 0 1-45.255-45.255zm302.137 45.255l-63.399-63.399c18.559-10.987 34.252-26.67 45.255-45.255l63.399 63.399a218.403 218.403 0 0 1-45.255 45.255z\"]\n};\nvar faLightbulb = {\n prefix: 'fas',\n iconName: 'lightbulb',\n icon: [352, 512, [], \"f0eb\", \"M96.06 454.35c.01 6.29 1.87 12.45 5.36 17.69l17.09 25.69a31.99 31.99 0 0 0 26.64 14.28h61.71a31.99 31.99 0 0 0 26.64-14.28l17.09-25.69a31.989 31.989 0 0 0 5.36-17.69l.04-38.35H96.01l.05 38.35zM0 176c0 44.37 16.45 84.85 43.56 115.78 16.52 18.85 42.36 58.23 52.21 91.45.04.26.07.52.11.78h160.24c.04-.26.07-.51.11-.78 9.85-33.22 35.69-72.6 52.21-91.45C335.55 260.85 352 220.37 352 176 352 78.61 272.91-.3 175.45 0 73.44.31 0 82.97 0 176zm176-80c-44.11 0-80 35.89-80 80 0 8.84-7.16 16-16 16s-16-7.16-16-16c0-61.76 50.24-112 112-112 8.84 0 16 7.16 16 16s-7.16 16-16 16z\"]\n};\nvar faLink = {\n prefix: 'fas',\n iconName: 'link',\n icon: [512, 512, [], \"f0c1\", \"M326.612 185.391c59.747 59.809 58.927 155.698.36 214.59-.11.12-.24.25-.36.37l-67.2 67.2c-59.27 59.27-155.699 59.262-214.96 0-59.27-59.26-59.27-155.7 0-214.96l37.106-37.106c9.84-9.84 26.786-3.3 27.294 10.606.648 17.722 3.826 35.527 9.69 52.721 1.986 5.822.567 12.262-3.783 16.612l-13.087 13.087c-28.026 28.026-28.905 73.66-1.155 101.96 28.024 28.579 74.086 28.749 102.325.51l67.2-67.19c28.191-28.191 28.073-73.757 0-101.83-3.701-3.694-7.429-6.564-10.341-8.569a16.037 16.037 0 0 1-6.947-12.606c-.396-10.567 3.348-21.456 11.698-29.806l21.054-21.055c5.521-5.521 14.182-6.199 20.584-1.731a152.482 152.482 0 0 1 20.522 17.197zM467.547 44.449c-59.261-59.262-155.69-59.27-214.96 0l-67.2 67.2c-.12.12-.25.25-.36.37-58.566 58.892-59.387 154.781.36 214.59a152.454 152.454 0 0 0 20.521 17.196c6.402 4.468 15.064 3.789 20.584-1.731l21.054-21.055c8.35-8.35 12.094-19.239 11.698-29.806a16.037 16.037 0 0 0-6.947-12.606c-2.912-2.005-6.64-4.875-10.341-8.569-28.073-28.073-28.191-73.639 0-101.83l67.2-67.19c28.239-28.239 74.3-28.069 102.325.51 27.75 28.3 26.872 73.934-1.155 101.96l-13.087 13.087c-4.35 4.35-5.769 10.79-3.783 16.612 5.864 17.194 9.042 34.999 9.69 52.721.509 13.906 17.454 20.446 27.294 10.606l37.106-37.106c59.271-59.259 59.271-155.699.001-214.959z\"]\n};\nvar faLiraSign = {\n prefix: 'fas',\n iconName: 'lira-sign',\n icon: [384, 512, [], \"f195\", \"M371.994 256h-48.019C317.64 256 312 260.912 312 267.246 312 368 230.179 416 144 416V256.781l134.603-29.912A12 12 0 0 0 288 215.155v-40.976c0-7.677-7.109-13.38-14.603-11.714L144 191.219V160.78l134.603-29.912A12 12 0 0 0 288 119.154V78.179c0-7.677-7.109-13.38-14.603-11.714L144 95.219V44c0-6.627-5.373-12-12-12H76c-6.627 0-12 5.373-12 12v68.997L9.397 125.131A12 12 0 0 0 0 136.845v40.976c0 7.677 7.109 13.38 14.603 11.714L64 178.558v30.439L9.397 221.131A12 12 0 0 0 0 232.845v40.976c0 7.677 7.109 13.38 14.603 11.714L64 274.558V468c0 6.627 5.373 12 12 12h79.583c134.091 0 223.255-77.834 228.408-211.592.261-6.782-5.211-12.408-11.997-12.408z\"]\n};\nvar faList = {\n prefix: 'fas',\n iconName: 'list',\n icon: [512, 512, [], \"f03a\", \"M128 116V76c0-8.837 7.163-16 16-16h352c8.837 0 16 7.163 16 16v40c0 8.837-7.163 16-16 16H144c-8.837 0-16-7.163-16-16zm16 176h352c8.837 0 16-7.163 16-16v-40c0-8.837-7.163-16-16-16H144c-8.837 0-16 7.163-16 16v40c0 8.837 7.163 16 16 16zm0 160h352c8.837 0 16-7.163 16-16v-40c0-8.837-7.163-16-16-16H144c-8.837 0-16 7.163-16 16v40c0 8.837 7.163 16 16 16zM16 144h64c8.837 0 16-7.163 16-16V64c0-8.837-7.163-16-16-16H16C7.163 48 0 55.163 0 64v64c0 8.837 7.163 16 16 16zm0 160h64c8.837 0 16-7.163 16-16v-64c0-8.837-7.163-16-16-16H16c-8.837 0-16 7.163-16 16v64c0 8.837 7.163 16 16 16zm0 160h64c8.837 0 16-7.163 16-16v-64c0-8.837-7.163-16-16-16H16c-8.837 0-16 7.163-16 16v64c0 8.837 7.163 16 16 16z\"]\n};\nvar faListAlt = {\n prefix: 'fas',\n iconName: 'list-alt',\n icon: [512, 512, [], \"f022\", \"M464 480H48c-26.51 0-48-21.49-48-48V80c0-26.51 21.49-48 48-48h416c26.51 0 48 21.49 48 48v352c0 26.51-21.49 48-48 48zM128 120c-22.091 0-40 17.909-40 40s17.909 40 40 40 40-17.909 40-40-17.909-40-40-40zm0 96c-22.091 0-40 17.909-40 40s17.909 40 40 40 40-17.909 40-40-17.909-40-40-40zm0 96c-22.091 0-40 17.909-40 40s17.909 40 40 40 40-17.909 40-40-17.909-40-40-40zm288-136v-32c0-6.627-5.373-12-12-12H204c-6.627 0-12 5.373-12 12v32c0 6.627 5.373 12 12 12h200c6.627 0 12-5.373 12-12zm0 96v-32c0-6.627-5.373-12-12-12H204c-6.627 0-12 5.373-12 12v32c0 6.627 5.373 12 12 12h200c6.627 0 12-5.373 12-12zm0 96v-32c0-6.627-5.373-12-12-12H204c-6.627 0-12 5.373-12 12v32c0 6.627 5.373 12 12 12h200c6.627 0 12-5.373 12-12z\"]\n};\nvar faListOl = {\n prefix: 'fas',\n iconName: 'list-ol',\n icon: [512, 512, [], \"f0cb\", \"M3.263 139.527c0-7.477 3.917-11.572 11.573-11.572h15.131V88.078c0-5.163.534-10.503.534-10.503h-.356s-1.779 2.67-2.848 3.738c-4.451 4.273-10.504 4.451-15.666-1.068l-5.518-6.231c-5.342-5.341-4.984-11.216.534-16.379l21.72-19.938C32.815 33.602 36.732 32 42.785 32H54.89c7.656 0 11.749 3.916 11.749 11.572v84.384h15.488c7.655 0 11.572 4.094 11.572 11.572v8.901c0 7.477-3.917 11.572-11.572 11.572H14.836c-7.656 0-11.573-4.095-11.573-11.572v-8.902zM2.211 304.591c0-47.278 50.955-56.383 50.955-69.165 0-7.18-5.954-8.755-9.28-8.755-3.153 0-6.479 1.051-9.455 3.852-5.079 4.903-10.507 7.004-16.111 2.451l-8.579-6.829c-5.779-4.553-7.18-9.805-2.803-15.409C13.592 201.981 26.025 192 47.387 192c19.437 0 44.476 10.506 44.476 39.573 0 38.347-46.753 46.402-48.679 56.909h39.049c7.529 0 11.557 4.027 11.557 11.382v8.755c0 7.354-4.028 11.382-11.557 11.382h-67.94c-7.005 0-12.083-4.028-12.083-11.382v-4.028zM5.654 454.61l5.603-9.28c3.853-6.654 9.105-7.004 15.584-3.152 4.903 2.101 9.63 3.152 14.359 3.152 10.155 0 14.358-3.502 14.358-8.23 0-6.654-5.604-9.106-15.934-9.106h-4.728c-5.954 0-9.28-2.101-12.258-7.88l-1.05-1.926c-2.451-4.728-1.226-9.806 2.801-14.884l5.604-7.004c6.829-8.405 12.257-13.483 12.257-13.483v-.35s-4.203 1.051-12.608 1.051H16.685c-7.53 0-11.383-4.028-11.383-11.382v-8.755c0-7.53 3.853-11.382 11.383-11.382h58.484c7.529 0 11.382 4.027 11.382 11.382v3.327c0 5.778-1.401 9.806-5.079 14.183l-17.509 20.137c19.611 5.078 28.716 20.487 28.716 34.845 0 21.363-14.358 44.126-48.503 44.126-16.636 0-28.192-4.728-35.896-9.455-5.779-4.202-6.304-9.805-2.626-15.934zM144 132h352c8.837 0 16-7.163 16-16V76c0-8.837-7.163-16-16-16H144c-8.837 0-16 7.163-16 16v40c0 8.837 7.163 16 16 16zm0 160h352c8.837 0 16-7.163 16-16v-40c0-8.837-7.163-16-16-16H144c-8.837 0-16 7.163-16 16v40c0 8.837 7.163 16 16 16zm0 160h352c8.837 0 16-7.163 16-16v-40c0-8.837-7.163-16-16-16H144c-8.837 0-16 7.163-16 16v40c0 8.837 7.163 16 16 16z\"]\n};\nvar faListUl = {\n prefix: 'fas',\n iconName: 'list-ul',\n icon: [512, 512, [], \"f0ca\", \"M96 96c0 26.51-21.49 48-48 48S0 122.51 0 96s21.49-48 48-48 48 21.49 48 48zM48 208c-26.51 0-48 21.49-48 48s21.49 48 48 48 48-21.49 48-48-21.49-48-48-48zm0 160c-26.51 0-48 21.49-48 48s21.49 48 48 48 48-21.49 48-48-21.49-48-48-48zm96-236h352c8.837 0 16-7.163 16-16V76c0-8.837-7.163-16-16-16H144c-8.837 0-16 7.163-16 16v40c0 8.837 7.163 16 16 16zm0 160h352c8.837 0 16-7.163 16-16v-40c0-8.837-7.163-16-16-16H144c-8.837 0-16 7.163-16 16v40c0 8.837 7.163 16 16 16zm0 160h352c8.837 0 16-7.163 16-16v-40c0-8.837-7.163-16-16-16H144c-8.837 0-16 7.163-16 16v40c0 8.837 7.163 16 16 16z\"]\n};\nvar faLocationArrow = {\n prefix: 'fas',\n iconName: 'location-arrow',\n icon: [512, 512, [], \"f124\", \"M444.52 3.52L28.74 195.42c-47.97 22.39-31.98 92.75 19.19 92.75h175.91v175.91c0 51.17 70.36 67.17 92.75 19.19l191.9-415.78c15.99-38.39-25.59-79.97-63.97-63.97z\"]\n};\nvar faLock = {\n prefix: 'fas',\n iconName: 'lock',\n icon: [448, 512, [], \"f023\", \"M400 224h-24v-72C376 68.2 307.8 0 224 0S72 68.2 72 152v72H48c-26.5 0-48 21.5-48 48v192c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V272c0-26.5-21.5-48-48-48zm-104 0H152v-72c0-39.7 32.3-72 72-72s72 32.3 72 72v72z\"]\n};\nvar faLockOpen = {\n prefix: 'fas',\n iconName: 'lock-open',\n icon: [576, 512, [], \"f3c1\", \"M423.5 0C339.5.3 272 69.5 272 153.5V224H48c-26.5 0-48 21.5-48 48v192c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V272c0-26.5-21.5-48-48-48h-48v-71.1c0-39.6 31.7-72.5 71.3-72.9 40-.4 72.7 32.1 72.7 72v80c0 13.3 10.7 24 24 24h32c13.3 0 24-10.7 24-24v-80C576 68 507.5-.3 423.5 0z\"]\n};\nvar faLongArrowAltDown = {\n prefix: 'fas',\n iconName: 'long-arrow-alt-down',\n icon: [256, 512, [], \"f309\", \"M168 345.941V44c0-6.627-5.373-12-12-12h-56c-6.627 0-12 5.373-12 12v301.941H41.941c-21.382 0-32.09 25.851-16.971 40.971l86.059 86.059c9.373 9.373 24.569 9.373 33.941 0l86.059-86.059c15.119-15.119 4.411-40.971-16.971-40.971H168z\"]\n};\nvar faLongArrowAltLeft = {\n prefix: 'fas',\n iconName: 'long-arrow-alt-left',\n icon: [448, 512, [], \"f30a\", \"M134.059 296H436c6.627 0 12-5.373 12-12v-56c0-6.627-5.373-12-12-12H134.059v-46.059c0-21.382-25.851-32.09-40.971-16.971L7.029 239.029c-9.373 9.373-9.373 24.569 0 33.941l86.059 86.059c15.119 15.119 40.971 4.411 40.971-16.971V296z\"]\n};\nvar faLongArrowAltRight = {\n prefix: 'fas',\n iconName: 'long-arrow-alt-right',\n icon: [448, 512, [], \"f30b\", \"M313.941 216H12c-6.627 0-12 5.373-12 12v56c0 6.627 5.373 12 12 12h301.941v46.059c0 21.382 25.851 32.09 40.971 16.971l86.059-86.059c9.373-9.373 9.373-24.569 0-33.941l-86.059-86.059c-15.119-15.119-40.971-4.411-40.971 16.971V216z\"]\n};\nvar faLongArrowAltUp = {\n prefix: 'fas',\n iconName: 'long-arrow-alt-up',\n icon: [256, 512, [], \"f30c\", \"M88 166.059V468c0 6.627 5.373 12 12 12h56c6.627 0 12-5.373 12-12V166.059h46.059c21.382 0 32.09-25.851 16.971-40.971l-86.059-86.059c-9.373-9.373-24.569-9.373-33.941 0l-86.059 86.059c-15.119 15.119-4.411 40.971 16.971 40.971H88z\"]\n};\nvar faLowVision = {\n prefix: 'fas',\n iconName: 'low-vision',\n icon: [576, 512, [], \"f2a8\", \"M569.344 231.631C512.96 135.949 407.81 72 288 72c-28.468 0-56.102 3.619-82.451 10.409L152.778 10.24c-7.601-10.858-22.564-13.5-33.423-5.9l-13.114 9.178c-10.86 7.601-13.502 22.566-5.9 33.426l43.131 58.395C89.449 131.73 40.228 174.683 6.682 231.581c-.01.017-.023.033-.034.05-8.765 14.875-8.964 33.528 0 48.739 38.5 65.332 99.742 115.862 172.859 141.349L55.316 244.302A272.194 272.194 0 0 1 83.61 208.39l119.4 170.58h.01l40.63 58.04a330.055 330.055 0 0 0 78.94 1.17l-189.98-271.4a277.628 277.628 0 0 1 38.777-21.563l251.836 356.544c7.601 10.858 22.564 13.499 33.423 5.9l13.114-9.178c10.86-7.601 13.502-22.567 5.9-33.426l-43.12-58.377-.007-.009c57.161-27.978 104.835-72.04 136.81-126.301a47.938 47.938 0 0 0 .001-48.739zM390.026 345.94l-19.066-27.23c24.682-32.567 27.711-76.353 8.8-111.68v.03c0 23.65-19.17 42.82-42.82 42.82-23.828 0-42.82-19.349-42.82-42.82 0-23.65 19.17-42.82 42.82-42.82h.03c-24.75-13.249-53.522-15.643-79.51-7.68l-19.068-27.237C253.758 123.306 270.488 120 288 120c75.162 0 136 60.826 136 136 0 34.504-12.833 65.975-33.974 89.94z\"]\n};\nvar faLuggageCart = {\n prefix: 'fas',\n iconName: 'luggage-cart',\n icon: [640, 512, [], \"f59d\", \"M224 320h32V96h-32c-17.67 0-32 14.33-32 32v160c0 17.67 14.33 32 32 32zm352-32V128c0-17.67-14.33-32-32-32h-32v224h32c17.67 0 32-14.33 32-32zm48 96H128V16c0-8.84-7.16-16-16-16H16C7.16 0 0 7.16 0 16v32c0 8.84 7.16 16 16 16h48v368c0 8.84 7.16 16 16 16h82.94c-1.79 5.03-2.94 10.36-2.94 16 0 26.51 21.49 48 48 48s48-21.49 48-48c0-5.64-1.15-10.97-2.94-16h197.88c-1.79 5.03-2.94 10.36-2.94 16 0 26.51 21.49 48 48 48s48-21.49 48-48c0-5.64-1.15-10.97-2.94-16H624c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16zM480 96V48c0-26.51-21.49-48-48-48h-96c-26.51 0-48 21.49-48 48v272h192V96zm-48 0h-96V48h96v48z\"]\n};\nvar faMagic = {\n prefix: 'fas',\n iconName: 'magic',\n icon: [512, 512, [], \"f0d0\", \"M224 96l16-32 32-16-32-16-16-32-16 32-32 16 32 16 16 32zM80 160l26.66-53.33L160 80l-53.34-26.67L80 0 53.34 53.33 0 80l53.34 26.67L80 160zm352 128l-26.66 53.33L352 368l53.34 26.67L432 448l26.66-53.33L512 368l-53.34-26.67L432 288zm70.62-193.77L417.77 9.38C411.53 3.12 403.34 0 395.15 0c-8.19 0-16.38 3.12-22.63 9.38L9.38 372.52c-12.5 12.5-12.5 32.76 0 45.25l84.85 84.85c6.25 6.25 14.44 9.37 22.62 9.37 8.19 0 16.38-3.12 22.63-9.37l363.14-363.15c12.5-12.48 12.5-32.75 0-45.24zM359.45 203.46l-50.91-50.91 86.6-86.6 50.91 50.91-86.6 86.6z\"]\n};\nvar faMagnet = {\n prefix: 'fas',\n iconName: 'magnet',\n icon: [512, 512, [], \"f076\", \"M164.1 160H12c-6.6 0-12-5.4-12-12V68c0-19.9 16.1-36 36-36h104c19.9 0 36 16.1 36 36v80c.1 6.6-5.3 12-11.9 12zm348-12V67.9c0-19.9-16.1-36-36-36h-104c-19.9 0-36 16.1-36 36v80c0 6.6 5.4 12 12 12h152c6.6.1 12-5.3 12-11.9zm-164 44c-6.6 0-12 5.4-12 12v52c0 128.1-160 127.9-160 0v-52c0-6.6-5.4-12-12-12h-152c-6.7 0-12 5.4-12 12.1.1 21.4.6 40.3 0 53.3C.1 408 136.3 504 256.9 504 377.5 504 512 408 512 257.3c-.6-12.8-.2-33 0-53.2 0-6.7-5.3-12.1-12-12.1H348.1z\"]\n};\nvar faMailBulk = {\n prefix: 'fas',\n iconName: 'mail-bulk',\n icon: [576, 512, [], \"f674\", \"M160 448c-25.6 0-51.2-22.4-64-32-64-44.8-83.2-60.8-96-70.4V480c0 17.67 14.33 32 32 32h256c17.67 0 32-14.33 32-32V345.6c-12.8 9.6-32 25.6-96 70.4-12.8 9.6-38.4 32-64 32zm128-192H32c-17.67 0-32 14.33-32 32v16c25.6 19.2 22.4 19.2 115.2 86.4 9.6 6.4 28.8 25.6 44.8 25.6s35.2-19.2 44.8-22.4c92.8-67.2 89.6-67.2 115.2-86.4V288c0-17.67-14.33-32-32-32zm256-96H224c-17.67 0-32 14.33-32 32v32h96c33.21 0 60.59 25.42 63.71 57.82l.29-.22V416h192c17.67 0 32-14.33 32-32V192c0-17.67-14.33-32-32-32zm-32 128h-64v-64h64v64zm-352-96c0-35.29 28.71-64 64-64h224V32c0-17.67-14.33-32-32-32H96C78.33 0 64 14.33 64 32v192h96v-32z\"]\n};\nvar faMale = {\n prefix: 'fas',\n iconName: 'male',\n icon: [192, 512, [], \"f183\", \"M96 0c35.346 0 64 28.654 64 64s-28.654 64-64 64-64-28.654-64-64S60.654 0 96 0m48 144h-11.36c-22.711 10.443-49.59 10.894-73.28 0H48c-26.51 0-48 21.49-48 48v136c0 13.255 10.745 24 24 24h16v136c0 13.255 10.745 24 24 24h64c13.255 0 24-10.745 24-24V352h16c13.255 0 24-10.745 24-24V192c0-26.51-21.49-48-48-48z\"]\n};\nvar faMap = {\n prefix: 'fas',\n iconName: 'map',\n icon: [576, 512, [], \"f279\", \"M0 117.66v346.32c0 11.32 11.43 19.06 21.94 14.86L160 416V32L20.12 87.95A32.006 32.006 0 0 0 0 117.66zM192 416l192 64V96L192 32v384zM554.06 33.16L416 96v384l139.88-55.95A31.996 31.996 0 0 0 576 394.34V48.02c0-11.32-11.43-19.06-21.94-14.86z\"]\n};\nvar faMapMarked = {\n prefix: 'fas',\n iconName: 'map-marked',\n icon: [576, 512, [], \"f59f\", \"M288 0c-69.59 0-126 56.41-126 126 0 56.26 82.35 158.8 113.9 196.02 6.39 7.54 17.82 7.54 24.2 0C331.65 284.8 414 182.26 414 126 414 56.41 357.59 0 288 0zM20.12 215.95A32.006 32.006 0 0 0 0 245.66v250.32c0 11.32 11.43 19.06 21.94 14.86L160 448V214.92c-8.84-15.98-16.07-31.54-21.25-46.42L20.12 215.95zM288 359.67c-14.07 0-27.38-6.18-36.51-16.96-19.66-23.2-40.57-49.62-59.49-76.72v182l192 64V266c-18.92 27.09-39.82 53.52-59.49 76.72-9.13 10.77-22.44 16.95-36.51 16.95zm266.06-198.51L416 224v288l139.88-55.95A31.996 31.996 0 0 0 576 426.34V176.02c0-11.32-11.43-19.06-21.94-14.86z\"]\n};\nvar faMapMarkedAlt = {\n prefix: 'fas',\n iconName: 'map-marked-alt',\n icon: [576, 512, [], \"f5a0\", \"M288 0c-69.59 0-126 56.41-126 126 0 56.26 82.35 158.8 113.9 196.02 6.39 7.54 17.82 7.54 24.2 0C331.65 284.8 414 182.26 414 126 414 56.41 357.59 0 288 0zm0 168c-23.2 0-42-18.8-42-42s18.8-42 42-42 42 18.8 42 42-18.8 42-42 42zM20.12 215.95A32.006 32.006 0 0 0 0 245.66v250.32c0 11.32 11.43 19.06 21.94 14.86L160 448V214.92c-8.84-15.98-16.07-31.54-21.25-46.42L20.12 215.95zM288 359.67c-14.07 0-27.38-6.18-36.51-16.96-19.66-23.2-40.57-49.62-59.49-76.72v182l192 64V266c-18.92 27.09-39.82 53.52-59.49 76.72-9.13 10.77-22.44 16.95-36.51 16.95zm266.06-198.51L416 224v288l139.88-55.95A31.996 31.996 0 0 0 576 426.34V176.02c0-11.32-11.43-19.06-21.94-14.86z\"]\n};\nvar faMapMarker = {\n prefix: 'fas',\n iconName: 'map-marker',\n icon: [384, 512, [], \"f041\", \"M172.268 501.67C26.97 291.031 0 269.413 0 192 0 85.961 85.961 0 192 0s192 85.961 192 192c0 77.413-26.97 99.031-172.268 309.67-9.535 13.774-29.93 13.773-39.464 0z\"]\n};\nvar faMapMarkerAlt = {\n prefix: 'fas',\n iconName: 'map-marker-alt',\n icon: [384, 512, [], \"f3c5\", \"M172.268 501.67C26.97 291.031 0 269.413 0 192 0 85.961 85.961 0 192 0s192 85.961 192 192c0 77.413-26.97 99.031-172.268 309.67-9.535 13.774-29.93 13.773-39.464 0zM192 272c44.183 0 80-35.817 80-80s-35.817-80-80-80-80 35.817-80 80 35.817 80 80 80z\"]\n};\nvar faMapPin = {\n prefix: 'fas',\n iconName: 'map-pin',\n icon: [288, 512, [], \"f276\", \"M112 316.94v156.69l22.02 33.02c4.75 7.12 15.22 7.12 19.97 0L176 473.63V316.94c-10.39 1.92-21.06 3.06-32 3.06s-21.61-1.14-32-3.06zM144 0C64.47 0 0 64.47 0 144s64.47 144 144 144 144-64.47 144-144S223.53 0 144 0zm0 76c-37.5 0-68 30.5-68 68 0 6.62-5.38 12-12 12s-12-5.38-12-12c0-50.73 41.28-92 92-92 6.62 0 12 5.38 12 12s-5.38 12-12 12z\"]\n};\nvar faMapSigns = {\n prefix: 'fas',\n iconName: 'map-signs',\n icon: [512, 512, [], \"f277\", \"M507.31 84.69L464 41.37c-6-6-14.14-9.37-22.63-9.37H288V16c0-8.84-7.16-16-16-16h-32c-8.84 0-16 7.16-16 16v16H56c-13.25 0-24 10.75-24 24v80c0 13.25 10.75 24 24 24h385.37c8.49 0 16.62-3.37 22.63-9.37l43.31-43.31c6.25-6.26 6.25-16.38 0-22.63zM224 496c0 8.84 7.16 16 16 16h32c8.84 0 16-7.16 16-16V384h-64v112zm232-272H288v-32h-64v32H70.63c-8.49 0-16.62 3.37-22.63 9.37L4.69 276.69c-6.25 6.25-6.25 16.38 0 22.63L48 342.63c6 6 14.14 9.37 22.63 9.37H456c13.25 0 24-10.75 24-24v-80c0-13.25-10.75-24-24-24z\"]\n};\nvar faMarker = {\n prefix: 'fas',\n iconName: 'marker',\n icon: [512, 512, [], \"f5a1\", \"M93.95 290.03A327.038 327.038 0 0 0 .17 485.11l-.03.23c-1.7 15.28 11.21 28.2 26.49 26.51a327.02 327.02 0 0 0 195.34-93.8l75.4-75.4-128.02-128.02-75.4 75.4zM485.49 26.51c-35.35-35.35-92.67-35.35-128.02 0l-21.76 21.76-36.56-36.55c-15.62-15.62-40.95-15.62-56.56 0L138.47 115.84c-6.25 6.25-6.25 16.38 0 22.63l22.62 22.62c6.25 6.25 16.38 6.25 22.63 0l87.15-87.15 19.59 19.59L191.98 192 320 320.02l165.49-165.49c35.35-35.35 35.35-92.66 0-128.02z\"]\n};\nvar faMars = {\n prefix: 'fas',\n iconName: 'mars',\n icon: [384, 512, [], \"f222\", \"M372 64h-79c-10.7 0-16 12.9-8.5 20.5l16.9 16.9-80.7 80.7c-22.2-14-48.5-22.1-76.7-22.1C64.5 160 0 224.5 0 304s64.5 144 144 144 144-64.5 144-144c0-28.2-8.1-54.5-22.1-76.7l80.7-80.7 16.9 16.9c7.6 7.6 20.5 2.2 20.5-8.5V76c0-6.6-5.4-12-12-12zM144 384c-44.1 0-80-35.9-80-80s35.9-80 80-80 80 35.9 80 80-35.9 80-80 80z\"]\n};\nvar faMarsDouble = {\n prefix: 'fas',\n iconName: 'mars-double',\n icon: [512, 512, [], \"f227\", \"M340 0h-79c-10.7 0-16 12.9-8.5 20.5l16.9 16.9-48.7 48.7C198.5 72.1 172.2 64 144 64 64.5 64 0 128.5 0 208s64.5 144 144 144 144-64.5 144-144c0-28.2-8.1-54.5-22.1-76.7l48.7-48.7 16.9 16.9c2.4 2.4 5.5 3.5 8.4 3.5 6.2 0 12.1-4.8 12.1-12V12c0-6.6-5.4-12-12-12zM144 288c-44.1 0-80-35.9-80-80s35.9-80 80-80 80 35.9 80 80-35.9 80-80 80zm356-128.1h-79c-10.7 0-16 12.9-8.5 20.5l16.9 16.9-48.7 48.7c-18.2-11.4-39-18.9-61.5-21.3-2.1 21.8-8.2 43.3-18.4 63.3 1.1 0 2.2-.1 3.2-.1 44.1 0 80 35.9 80 80s-35.9 80-80 80-80-35.9-80-80c0-1.1 0-2.2.1-3.2-20 10.2-41.5 16.4-63.3 18.4C168.4 455.6 229.6 512 304 512c79.5 0 144-64.5 144-144 0-28.2-8.1-54.5-22.1-76.7l48.7-48.7 16.9 16.9c2.4 2.4 5.4 3.5 8.4 3.5 6.2 0 12.1-4.8 12.1-12v-79c0-6.7-5.4-12.1-12-12.1z\"]\n};\nvar faMarsStroke = {\n prefix: 'fas',\n iconName: 'mars-stroke',\n icon: [384, 512, [], \"f229\", \"M372 64h-79c-10.7 0-16 12.9-8.5 20.5l16.9 16.9-17.5 17.5-14.1-14.1c-4.7-4.7-12.3-4.7-17 0L224.5 133c-4.7 4.7-4.7 12.3 0 17l14.1 14.1-18 18c-22.2-14-48.5-22.1-76.7-22.1C64.5 160 0 224.5 0 304s64.5 144 144 144 144-64.5 144-144c0-28.2-8.1-54.5-22.1-76.7l18-18 14.1 14.1c4.7 4.7 12.3 4.7 17 0l28.3-28.3c4.7-4.7 4.7-12.3 0-17L329.2 164l17.5-17.5 16.9 16.9c7.6 7.6 20.5 2.2 20.5-8.5V76c-.1-6.6-5.5-12-12.1-12zM144 384c-44.1 0-80-35.9-80-80s35.9-80 80-80 80 35.9 80 80-35.9 80-80 80z\"]\n};\nvar faMarsStrokeH = {\n prefix: 'fas',\n iconName: 'mars-stroke-h',\n icon: [480, 512, [], \"f22b\", \"M476.2 247.5l-55.9-55.9c-7.6-7.6-20.5-2.2-20.5 8.5V224H376v-20c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v20h-27.6c-5.8-25.6-18.7-49.9-38.6-69.8C189.6 98 98.4 98 42.2 154.2c-56.2 56.2-56.2 147.4 0 203.6 56.2 56.2 147.4 56.2 203.6 0 19.9-19.9 32.8-44.2 38.6-69.8H312v20c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12v-20h23.9v23.9c0 10.7 12.9 16 20.5 8.5l55.9-55.9c4.6-4.7 4.6-12.3-.1-17zm-275.6 65.1c-31.2 31.2-81.9 31.2-113.1 0-31.2-31.2-31.2-81.9 0-113.1 31.2-31.2 81.9-31.2 113.1 0 31.2 31.1 31.2 81.9 0 113.1z\"]\n};\nvar faMarsStrokeV = {\n prefix: 'fas',\n iconName: 'mars-stroke-v',\n icon: [288, 512, [], \"f22a\", \"M245.8 234.2c-19.9-19.9-44.2-32.8-69.8-38.6v-25.4h20c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-20V81.4h23.9c10.7 0 16-12.9 8.5-20.5L152.5 5.1c-4.7-4.7-12.3-4.7-17 0L79.6 61c-7.6 7.6-2.2 20.5 8.5 20.5H112v24.7H92c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h20v25.4c-25.6 5.8-49.9 18.7-69.8 38.6-56.2 56.2-56.2 147.4 0 203.6 56.2 56.2 147.4 56.2 203.6 0 56.3-56.2 56.3-147.4 0-203.6zm-45.2 158.4c-31.2 31.2-81.9 31.2-113.1 0-31.2-31.2-31.2-81.9 0-113.1 31.2-31.2 81.9-31.2 113.1 0 31.2 31.1 31.2 81.9 0 113.1z\"]\n};\nvar faMask = {\n prefix: 'fas',\n iconName: 'mask',\n icon: [640, 512, [], \"f6fa\", \"M320.67 64c-442.6 0-357.57 384-158.46 384 39.9 0 77.47-20.69 101.42-55.86l25.73-37.79c15.66-22.99 46.97-22.99 62.63 0l25.73 37.79C401.66 427.31 439.23 448 479.13 448c189.86 0 290.63-384-158.46-384zM184 308.36c-41.06 0-67.76-25.66-80.08-41.05-5.23-6.53-5.23-16.09 0-22.63 12.32-15.4 39.01-41.05 80.08-41.05s67.76 25.66 80.08 41.05c5.23 6.53 5.23 16.09 0 22.63-12.32 15.4-39.02 41.05-80.08 41.05zm272 0c-41.06 0-67.76-25.66-80.08-41.05-5.23-6.53-5.23-16.09 0-22.63 12.32-15.4 39.01-41.05 80.08-41.05s67.76 25.66 80.08 41.05c5.23 6.53 5.23 16.09 0 22.63-12.32 15.4-39.02 41.05-80.08 41.05z\"]\n};\nvar faMedal = {\n prefix: 'fas',\n iconName: 'medal',\n icon: [512, 512, [], \"f5a2\", \"M223.75 130.75L154.62 15.54A31.997 31.997 0 0 0 127.18 0H16.03C3.08 0-4.5 14.57 2.92 25.18l111.27 158.96c29.72-27.77 67.52-46.83 109.56-53.39zM495.97 0H384.82c-11.24 0-21.66 5.9-27.44 15.54l-69.13 115.21c42.04 6.56 79.84 25.62 109.56 53.38L509.08 25.18C516.5 14.57 508.92 0 495.97 0zM256 160c-97.2 0-176 78.8-176 176s78.8 176 176 176 176-78.8 176-176-78.8-176-176-176zm92.52 157.26l-37.93 36.96 8.97 52.22c1.6 9.36-8.26 16.51-16.65 12.09L256 393.88l-46.9 24.65c-8.4 4.45-18.25-2.74-16.65-12.09l8.97-52.22-37.93-36.96c-6.82-6.64-3.05-18.23 6.35-19.59l52.43-7.64 23.43-47.52c2.11-4.28 6.19-6.39 10.28-6.39 4.11 0 8.22 2.14 10.33 6.39l23.43 47.52 52.43 7.64c9.4 1.36 13.17 12.95 6.35 19.59z\"]\n};\nvar faMedkit = {\n prefix: 'fas',\n iconName: 'medkit',\n icon: [512, 512, [], \"f0fa\", \"M96 480h320V128h-32V80c0-26.51-21.49-48-48-48H176c-26.51 0-48 21.49-48 48v48H96v352zm96-384h128v32H192V96zm320 80v256c0 26.51-21.49 48-48 48h-16V128h16c26.51 0 48 21.49 48 48zM64 480H48c-26.51 0-48-21.49-48-48V176c0-26.51 21.49-48 48-48h16v352zm288-208v32c0 8.837-7.163 16-16 16h-48v48c0 8.837-7.163 16-16 16h-32c-8.837 0-16-7.163-16-16v-48h-48c-8.837 0-16-7.163-16-16v-32c0-8.837 7.163-16 16-16h48v-48c0-8.837 7.163-16 16-16h32c8.837 0 16 7.163 16 16v48h48c8.837 0 16 7.163 16 16z\"]\n};\nvar faMeh = {\n prefix: 'fas',\n iconName: 'meh',\n icon: [496, 512, [], \"f11a\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm-80 168c17.7 0 32 14.3 32 32s-14.3 32-32 32-32-14.3-32-32 14.3-32 32-32zm176 192H152c-21.2 0-21.2-32 0-32h192c21.2 0 21.2 32 0 32zm-16-128c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32z\"]\n};\nvar faMehBlank = {\n prefix: 'fas',\n iconName: 'meh-blank',\n icon: [496, 512, [], \"f5a4\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm-80 232c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32zm160 0c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32z\"]\n};\nvar faMehRollingEyes = {\n prefix: 'fas',\n iconName: 'meh-rolling-eyes',\n icon: [496, 512, [], \"f5a5\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zM88 224c0-24.3 13.7-45.2 33.6-56-.7 2.6-1.6 5.2-1.6 8 0 17.7 14.3 32 32 32s32-14.3 32-32c0-2.8-.9-5.4-1.6-8 19.9 10.8 33.6 31.7 33.6 56 0 35.3-28.7 64-64 64s-64-28.7-64-64zm224 176H184c-21.2 0-21.2-32 0-32h128c21.2 0 21.2 32 0 32zm32-112c-35.3 0-64-28.7-64-64 0-24.3 13.7-45.2 33.6-56-.7 2.6-1.6 5.2-1.6 8 0 17.7 14.3 32 32 32s32-14.3 32-32c0-2.8-.9-5.4-1.6-8 19.9 10.8 33.6 31.7 33.6 56 0 35.3-28.7 64-64 64z\"]\n};\nvar faMemory = {\n prefix: 'fas',\n iconName: 'memory',\n icon: [640, 512, [], \"f538\", \"M640 130.94V96c0-17.67-14.33-32-32-32H32C14.33 64 0 78.33 0 96v34.94c18.6 6.61 32 24.19 32 45.06s-13.4 38.45-32 45.06V320h640v-98.94c-18.6-6.61-32-24.19-32-45.06s13.4-38.45 32-45.06zM224 256h-64V128h64v128zm128 0h-64V128h64v128zm128 0h-64V128h64v128zM0 448h64v-26.67c0-8.84 7.16-16 16-16s16 7.16 16 16V448h128v-26.67c0-8.84 7.16-16 16-16s16 7.16 16 16V448h128v-26.67c0-8.84 7.16-16 16-16s16 7.16 16 16V448h128v-26.67c0-8.84 7.16-16 16-16s16 7.16 16 16V448h64v-96H0v96z\"]\n};\nvar faMenorah = {\n prefix: 'fas',\n iconName: 'menorah',\n icon: [640, 512, [], \"f676\", \"M144 128h-32c-8.84 0-16 7.16-16 16v144h64V144c0-8.84-7.16-16-16-16zm96 0h-32c-8.84 0-16 7.16-16 16v144h64V144c0-8.84-7.16-16-16-16zm192 0h-32c-8.84 0-16 7.16-16 16v144h64V144c0-8.84-7.16-16-16-16zm96 0h-32c-8.84 0-16 7.16-16 16v144h64V144c0-8.84-7.16-16-16-16zm80-32c17.67 0 32-14.33 32-32S608 0 608 0s-32 46.33-32 64 14.33 32 32 32zm-96 0c17.67 0 32-14.33 32-32S512 0 512 0s-32 46.33-32 64 14.33 32 32 32zm-96 0c17.67 0 32-14.33 32-32S416 0 416 0s-32 46.33-32 64 14.33 32 32 32zm-96 0c17.67 0 32-14.33 32-32S320 0 320 0s-32 46.33-32 64 14.33 32 32 32zm-96 0c17.67 0 32-14.33 32-32S224 0 224 0s-32 46.33-32 64 14.33 32 32 32zm-96 0c17.67 0 32-14.33 32-32S128 0 128 0 96 46.33 96 64s14.33 32 32 32zm-96 0c17.67 0 32-14.33 32-32S32 0 32 0 0 46.33 0 64s14.33 32 32 32zm544 192c0 17.67-14.33 32-32 32H352V144c0-8.84-7.16-16-16-16h-32c-8.84 0-16 7.16-16 16v176H96c-17.67 0-32-14.33-32-32V144c0-8.84-7.16-16-16-16H16c-8.84 0-16 7.16-16 16v144c0 53.02 42.98 96 96 96h192v64H112c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h416c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16H352v-64h192c53.02 0 96-42.98 96-96V144c0-8.84-7.16-16-16-16h-32c-8.84 0-16 7.16-16 16v144z\"]\n};\nvar faMercury = {\n prefix: 'fas',\n iconName: 'mercury',\n icon: [288, 512, [], \"f223\", \"M288 208c0-44.2-19.9-83.7-51.2-110.1 2.5-1.8 4.9-3.8 7.2-5.8 24.7-21.2 39.8-48.8 43.2-78.8.9-7.1-4.7-13.3-11.9-13.3h-40.5C229 0 224.1 4.1 223 9.8c-2.4 12.5-9.6 24.3-20.7 33.8C187 56.8 166.3 64 144 64s-43-7.2-58.4-20.4C74.5 34.1 67.4 22.3 64.9 9.8 63.8 4.1 58.9 0 53.2 0H12.7C5.5 0-.1 6.2.8 13.3 4.2 43.4 19.2 71 44 92.2c2.3 2 4.7 3.9 7.2 5.8C19.9 124.3 0 163.8 0 208c0 68.5 47.9 125.9 112 140.4V400H76c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h36v36c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12v-36h36c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-36v-51.6c64.1-14.5 112-71.9 112-140.4zm-224 0c0-44.1 35.9-80 80-80s80 35.9 80 80-35.9 80-80 80-80-35.9-80-80z\"]\n};\nvar faMeteor = {\n prefix: 'fas',\n iconName: 'meteor',\n icon: [512, 512, [], \"f753\", \"M491.2.7C452.5 12.3 379.4 35 303.5 62c-2.1-7-4-13.5-5.6-18.6-3-9.7-13.9-14.2-22.9-9.5C232.6 56 122.2 116.5 60.6 176.4c-1.1 1-2.5 2-3.5 3C19 217.4 0 267.3 0 317.2 0 367 19 416.9 57 455c38 38 87.9 57.1 137.8 57 49.9 0 99.8-19 137.9-57.1 1-1 2-2.4 3-3.5 59.8-61.6 120.4-172.1 142.5-214.4 4.7-9 .2-19.9-9.5-22.9-5.2-1.6-11.6-3.5-18.6-5.6 27-76 49.7-149 61.3-187.7C515 8.4 503.6-3 491.2.7zM192 448c-70.7 0-128-57.3-128-128s57.3-128 128-128 128 57.3 128 128-57.3 128-128 128zm-32-192c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32zm48 96c-8.8 0-16 7.2-16 16s7.2 16 16 16 16-7.2 16-16-7.2-16-16-16z\"]\n};\nvar faMicrochip = {\n prefix: 'fas',\n iconName: 'microchip',\n icon: [512, 512, [], \"f2db\", \"M416 48v416c0 26.51-21.49 48-48 48H144c-26.51 0-48-21.49-48-48V48c0-26.51 21.49-48 48-48h224c26.51 0 48 21.49 48 48zm96 58v12a6 6 0 0 1-6 6h-18v6a6 6 0 0 1-6 6h-42V88h42a6 6 0 0 1 6 6v6h18a6 6 0 0 1 6 6zm0 96v12a6 6 0 0 1-6 6h-18v6a6 6 0 0 1-6 6h-42v-48h42a6 6 0 0 1 6 6v6h18a6 6 0 0 1 6 6zm0 96v12a6 6 0 0 1-6 6h-18v6a6 6 0 0 1-6 6h-42v-48h42a6 6 0 0 1 6 6v6h18a6 6 0 0 1 6 6zm0 96v12a6 6 0 0 1-6 6h-18v6a6 6 0 0 1-6 6h-42v-48h42a6 6 0 0 1 6 6v6h18a6 6 0 0 1 6 6zM30 376h42v48H30a6 6 0 0 1-6-6v-6H6a6 6 0 0 1-6-6v-12a6 6 0 0 1 6-6h18v-6a6 6 0 0 1 6-6zm0-96h42v48H30a6 6 0 0 1-6-6v-6H6a6 6 0 0 1-6-6v-12a6 6 0 0 1 6-6h18v-6a6 6 0 0 1 6-6zm0-96h42v48H30a6 6 0 0 1-6-6v-6H6a6 6 0 0 1-6-6v-12a6 6 0 0 1 6-6h18v-6a6 6 0 0 1 6-6zm0-96h42v48H30a6 6 0 0 1-6-6v-6H6a6 6 0 0 1-6-6v-12a6 6 0 0 1 6-6h18v-6a6 6 0 0 1 6-6z\"]\n};\nvar faMicrophone = {\n prefix: 'fas',\n iconName: 'microphone',\n icon: [352, 512, [], \"f130\", \"M176 352c53.02 0 96-42.98 96-96V96c0-53.02-42.98-96-96-96S80 42.98 80 96v160c0 53.02 42.98 96 96 96zm160-160h-16c-8.84 0-16 7.16-16 16v48c0 74.8-64.49 134.82-140.79 127.38C96.71 376.89 48 317.11 48 250.3V208c0-8.84-7.16-16-16-16H16c-8.84 0-16 7.16-16 16v40.16c0 89.64 63.97 169.55 152 181.69V464H96c-8.84 0-16 7.16-16 16v16c0 8.84 7.16 16 16 16h160c8.84 0 16-7.16 16-16v-16c0-8.84-7.16-16-16-16h-56v-33.77C285.71 418.47 352 344.9 352 256v-48c0-8.84-7.16-16-16-16z\"]\n};\nvar faMicrophoneAlt = {\n prefix: 'fas',\n iconName: 'microphone-alt',\n icon: [352, 512, [], \"f3c9\", \"M336 192h-16c-8.84 0-16 7.16-16 16v48c0 74.8-64.49 134.82-140.79 127.38C96.71 376.89 48 317.11 48 250.3V208c0-8.84-7.16-16-16-16H16c-8.84 0-16 7.16-16 16v40.16c0 89.64 63.97 169.55 152 181.69V464H96c-8.84 0-16 7.16-16 16v16c0 8.84 7.16 16 16 16h160c8.84 0 16-7.16 16-16v-16c0-8.84-7.16-16-16-16h-56v-33.77C285.71 418.47 352 344.9 352 256v-48c0-8.84-7.16-16-16-16zM176 352c53.02 0 96-42.98 96-96h-85.33c-5.89 0-10.67-3.58-10.67-8v-16c0-4.42 4.78-8 10.67-8H272v-32h-85.33c-5.89 0-10.67-3.58-10.67-8v-16c0-4.42 4.78-8 10.67-8H272v-32h-85.33c-5.89 0-10.67-3.58-10.67-8v-16c0-4.42 4.78-8 10.67-8H272c0-53.02-42.98-96-96-96S80 42.98 80 96v160c0 53.02 42.98 96 96 96z\"]\n};\nvar faMicrophoneAltSlash = {\n prefix: 'fas',\n iconName: 'microphone-alt-slash',\n icon: [640, 512, [], \"f539\", \"M633.82 458.1L476.26 336.33C488.74 312.21 496 284.98 496 256v-48c0-8.84-7.16-16-16-16h-16c-8.84 0-16 7.16-16 16v48c0 17.92-3.96 34.8-10.72 50.2l-26.55-20.52c3.1-9.4 5.28-19.22 5.28-29.67h-43.67l-41.4-32H416v-32h-85.33c-5.89 0-10.67-3.58-10.67-8v-16c0-4.42 4.78-8 10.67-8H416v-32h-85.33c-5.89 0-10.67-3.58-10.67-8v-16c0-4.42 4.78-8 10.67-8H416c0-53.02-42.98-96-96-96s-96 42.98-96 96v45.36L45.47 3.37C38.49-2.05 28.43-.8 23.01 6.18L3.37 31.45C-2.05 38.42-.8 48.47 6.18 53.9l588.36 454.73c6.98 5.43 17.03 4.17 22.46-2.81l19.64-25.27c5.41-6.97 4.16-17.02-2.82-22.45zM400 464h-56v-33.78c11.71-1.62 23.1-4.28 33.96-8.08l-50.4-38.96c-6.71.4-13.41.87-20.35.2-55.85-5.45-98.74-48.63-111.18-101.85L144 241.31v6.85c0 89.64 63.97 169.55 152 181.69V464h-56c-8.84 0-16 7.16-16 16v16c0 8.84 7.16 16 16 16h160c8.84 0 16-7.16 16-16v-16c0-8.84-7.16-16-16-16z\"]\n};\nvar faMicrophoneSlash = {\n prefix: 'fas',\n iconName: 'microphone-slash',\n icon: [640, 512, [], \"f131\", \"M633.82 458.1l-157.8-121.96C488.61 312.13 496 285.01 496 256v-48c0-8.84-7.16-16-16-16h-16c-8.84 0-16 7.16-16 16v48c0 17.92-3.96 34.8-10.72 50.2l-26.55-20.52c3.1-9.4 5.28-19.22 5.28-29.67V96c0-53.02-42.98-96-96-96s-96 42.98-96 96v45.36L45.47 3.37C38.49-2.05 28.43-.8 23.01 6.18L3.37 31.45C-2.05 38.42-.8 48.47 6.18 53.9l588.36 454.73c6.98 5.43 17.03 4.17 22.46-2.81l19.64-25.27c5.41-6.97 4.16-17.02-2.82-22.45zM400 464h-56v-33.77c11.66-1.6 22.85-4.54 33.67-8.31l-50.11-38.73c-6.71.4-13.41.87-20.35.2-55.85-5.45-98.74-48.63-111.18-101.85L144 241.31v6.85c0 89.64 63.97 169.55 152 181.69V464h-56c-8.84 0-16 7.16-16 16v16c0 8.84 7.16 16 16 16h160c8.84 0 16-7.16 16-16v-16c0-8.84-7.16-16-16-16z\"]\n};\nvar faMicroscope = {\n prefix: 'fas',\n iconName: 'microscope',\n icon: [512, 512, [], \"f610\", \"M160 320h12v16c0 8.84 7.16 16 16 16h40c8.84 0 16-7.16 16-16v-16h12c17.67 0 32-14.33 32-32V64c0-17.67-14.33-32-32-32V16c0-8.84-7.16-16-16-16h-64c-8.84 0-16 7.16-16 16v16c-17.67 0-32 14.33-32 32v224c0 17.67 14.33 32 32 32zm304 128h-1.29C493.24 413.99 512 369.2 512 320c0-105.88-86.12-192-192-192v64c70.58 0 128 57.42 128 128s-57.42 128-128 128H48c-26.51 0-48 21.49-48 48 0 8.84 7.16 16 16 16h480c8.84 0 16-7.16 16-16 0-26.51-21.49-48-48-48zm-360-32h208c4.42 0 8-3.58 8-8v-16c0-4.42-3.58-8-8-8H104c-4.42 0-8 3.58-8 8v16c0 4.42 3.58 8 8 8z\"]\n};\nvar faMinus = {\n prefix: 'fas',\n iconName: 'minus',\n icon: [448, 512, [], \"f068\", \"M416 208H32c-17.67 0-32 14.33-32 32v32c0 17.67 14.33 32 32 32h384c17.67 0 32-14.33 32-32v-32c0-17.67-14.33-32-32-32z\"]\n};\nvar faMinusCircle = {\n prefix: 'fas',\n iconName: 'minus-circle',\n icon: [512, 512, [], \"f056\", \"M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zM124 296c-6.6 0-12-5.4-12-12v-56c0-6.6 5.4-12 12-12h264c6.6 0 12 5.4 12 12v56c0 6.6-5.4 12-12 12H124z\"]\n};\nvar faMinusSquare = {\n prefix: 'fas',\n iconName: 'minus-square',\n icon: [448, 512, [], \"f146\", \"M400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zM92 296c-6.6 0-12-5.4-12-12v-56c0-6.6 5.4-12 12-12h264c6.6 0 12 5.4 12 12v56c0 6.6-5.4 12-12 12H92z\"]\n};\nvar faMitten = {\n prefix: 'fas',\n iconName: 'mitten',\n icon: [448, 512, [], \"f7b5\", \"M368 416H48c-8.8 0-16 7.2-16 16v64c0 8.8 7.2 16 16 16h320c8.8 0 16-7.2 16-16v-64c0-8.8-7.2-16-16-16zm57-209.1c-27.2-22.6-67.5-19-90.1 8.2l-20.9 25-29.6-128.4c-18-77.5-95.4-125.9-172.8-108C34.2 21.6-14.2 98.9 3.7 176.4L51.6 384h309l72.5-87c22.7-27.2 19-67.5-8.1-90.1z\"]\n};\nvar faMobile = {\n prefix: 'fas',\n iconName: 'mobile',\n icon: [320, 512, [], \"f10b\", \"M272 0H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h224c26.5 0 48-21.5 48-48V48c0-26.5-21.5-48-48-48zM160 480c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32z\"]\n};\nvar faMobileAlt = {\n prefix: 'fas',\n iconName: 'mobile-alt',\n icon: [320, 512, [], \"f3cd\", \"M272 0H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h224c26.5 0 48-21.5 48-48V48c0-26.5-21.5-48-48-48zM160 480c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32zm112-108c0 6.6-5.4 12-12 12H60c-6.6 0-12-5.4-12-12V60c0-6.6 5.4-12 12-12h200c6.6 0 12 5.4 12 12v312z\"]\n};\nvar faMoneyBill = {\n prefix: 'fas',\n iconName: 'money-bill',\n icon: [640, 512, [], \"f0d6\", \"M608 64H32C14.33 64 0 78.33 0 96v320c0 17.67 14.33 32 32 32h576c17.67 0 32-14.33 32-32V96c0-17.67-14.33-32-32-32zM48 400v-64c35.35 0 64 28.65 64 64H48zm0-224v-64h64c0 35.35-28.65 64-64 64zm272 176c-44.19 0-80-42.99-80-96 0-53.02 35.82-96 80-96s80 42.98 80 96c0 53.03-35.83 96-80 96zm272 48h-64c0-35.35 28.65-64 64-64v64zm0-224c-35.35 0-64-28.65-64-64h64v64z\"]\n};\nvar faMoneyBillAlt = {\n prefix: 'fas',\n iconName: 'money-bill-alt',\n icon: [640, 512, [], \"f3d1\", \"M352 288h-16v-88c0-4.42-3.58-8-8-8h-13.58c-4.74 0-9.37 1.4-13.31 4.03l-15.33 10.22a7.994 7.994 0 0 0-2.22 11.09l8.88 13.31a7.994 7.994 0 0 0 11.09 2.22l.47-.31V288h-16c-4.42 0-8 3.58-8 8v16c0 4.42 3.58 8 8 8h64c4.42 0 8-3.58 8-8v-16c0-4.42-3.58-8-8-8zM608 64H32C14.33 64 0 78.33 0 96v320c0 17.67 14.33 32 32 32h576c17.67 0 32-14.33 32-32V96c0-17.67-14.33-32-32-32zM48 400v-64c35.35 0 64 28.65 64 64H48zm0-224v-64h64c0 35.35-28.65 64-64 64zm272 192c-53.02 0-96-50.15-96-112 0-61.86 42.98-112 96-112s96 50.14 96 112c0 61.87-43 112-96 112zm272 32h-64c0-35.35 28.65-64 64-64v64zm0-224c-35.35 0-64-28.65-64-64h64v64z\"]\n};\nvar faMoneyBillWave = {\n prefix: 'fas',\n iconName: 'money-bill-wave',\n icon: [640, 512, [], \"f53a\", \"M621.16 54.46C582.37 38.19 543.55 32 504.75 32c-123.17-.01-246.33 62.34-369.5 62.34-30.89 0-61.76-3.92-92.65-13.72-3.47-1.1-6.95-1.62-10.35-1.62C15.04 79 0 92.32 0 110.81v317.26c0 12.63 7.23 24.6 18.84 29.46C57.63 473.81 96.45 480 135.25 480c123.17 0 246.34-62.35 369.51-62.35 30.89 0 61.76 3.92 92.65 13.72 3.47 1.1 6.95 1.62 10.35 1.62 17.21 0 32.25-13.32 32.25-31.81V83.93c-.01-12.64-7.24-24.6-18.85-29.47zM48 132.22c20.12 5.04 41.12 7.57 62.72 8.93C104.84 170.54 79 192.69 48 192.69v-60.47zm0 285v-47.78c34.37 0 62.18 27.27 63.71 61.4-22.53-1.81-43.59-6.31-63.71-13.62zM320 352c-44.19 0-80-42.99-80-96 0-53.02 35.82-96 80-96s80 42.98 80 96c0 53.03-35.83 96-80 96zm272 27.78c-17.52-4.39-35.71-6.85-54.32-8.44 5.87-26.08 27.5-45.88 54.32-49.28v57.72zm0-236.11c-30.89-3.91-54.86-29.7-55.81-61.55 19.54 2.17 38.09 6.23 55.81 12.66v48.89z\"]\n};\nvar faMoneyBillWaveAlt = {\n prefix: 'fas',\n iconName: 'money-bill-wave-alt',\n icon: [640, 512, [], \"f53b\", \"M621.16 54.46C582.37 38.19 543.55 32 504.75 32c-123.17-.01-246.33 62.34-369.5 62.34-30.89 0-61.76-3.92-92.65-13.72-3.47-1.1-6.95-1.62-10.35-1.62C15.04 79 0 92.32 0 110.81v317.26c0 12.63 7.23 24.6 18.84 29.46C57.63 473.81 96.45 480 135.25 480c123.17 0 246.34-62.35 369.51-62.35 30.89 0 61.76 3.92 92.65 13.72 3.47 1.1 6.95 1.62 10.35 1.62 17.21 0 32.25-13.32 32.25-31.81V83.93c-.01-12.64-7.24-24.6-18.85-29.47zM320 352c-44.19 0-80-42.99-80-96 0-53.02 35.82-96 80-96s80 42.98 80 96c0 53.03-35.83 96-80 96z\"]\n};\nvar faMoneyCheck = {\n prefix: 'fas',\n iconName: 'money-check',\n icon: [640, 512, [], \"f53c\", \"M0 448c0 17.67 14.33 32 32 32h576c17.67 0 32-14.33 32-32V128H0v320zm448-208c0-8.84 7.16-16 16-16h96c8.84 0 16 7.16 16 16v32c0 8.84-7.16 16-16 16h-96c-8.84 0-16-7.16-16-16v-32zm0 120c0-4.42 3.58-8 8-8h112c4.42 0 8 3.58 8 8v16c0 4.42-3.58 8-8 8H456c-4.42 0-8-3.58-8-8v-16zM64 264c0-4.42 3.58-8 8-8h304c4.42 0 8 3.58 8 8v16c0 4.42-3.58 8-8 8H72c-4.42 0-8-3.58-8-8v-16zm0 96c0-4.42 3.58-8 8-8h176c4.42 0 8 3.58 8 8v16c0 4.42-3.58 8-8 8H72c-4.42 0-8-3.58-8-8v-16zM624 32H16C7.16 32 0 39.16 0 48v48h640V48c0-8.84-7.16-16-16-16z\"]\n};\nvar faMoneyCheckAlt = {\n prefix: 'fas',\n iconName: 'money-check-alt',\n icon: [640, 512, [], \"f53d\", \"M608 32H32C14.33 32 0 46.33 0 64v384c0 17.67 14.33 32 32 32h576c17.67 0 32-14.33 32-32V64c0-17.67-14.33-32-32-32zM176 327.88V344c0 4.42-3.58 8-8 8h-16c-4.42 0-8-3.58-8-8v-16.29c-11.29-.58-22.27-4.52-31.37-11.35-3.9-2.93-4.1-8.77-.57-12.14l11.75-11.21c2.77-2.64 6.89-2.76 10.13-.73 3.87 2.42 8.26 3.72 12.82 3.72h28.11c6.5 0 11.8-5.92 11.8-13.19 0-5.95-3.61-11.19-8.77-12.73l-45-13.5c-18.59-5.58-31.58-23.42-31.58-43.39 0-24.52 19.05-44.44 42.67-45.07V152c0-4.42 3.58-8 8-8h16c4.42 0 8 3.58 8 8v16.29c11.29.58 22.27 4.51 31.37 11.35 3.9 2.93 4.1 8.77.57 12.14l-11.75 11.21c-2.77 2.64-6.89 2.76-10.13.73-3.87-2.43-8.26-3.72-12.82-3.72h-28.11c-6.5 0-11.8 5.92-11.8 13.19 0 5.95 3.61 11.19 8.77 12.73l45 13.5c18.59 5.58 31.58 23.42 31.58 43.39 0 24.53-19.05 44.44-42.67 45.07zM416 312c0 4.42-3.58 8-8 8H296c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h112c4.42 0 8 3.58 8 8v16zm160 0c0 4.42-3.58 8-8 8h-80c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h80c4.42 0 8 3.58 8 8v16zm0-96c0 4.42-3.58 8-8 8H296c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h272c4.42 0 8 3.58 8 8v16z\"]\n};\nvar faMonument = {\n prefix: 'fas',\n iconName: 'monument',\n icon: [384, 512, [], \"f5a6\", \"M368 448H16c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h352c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16zm-78.86-347.26a31.97 31.97 0 0 0-9.21-19.44L203.31 4.69c-6.25-6.25-16.38-6.25-22.63 0l-76.6 76.61a31.97 31.97 0 0 0-9.21 19.44L64 416h256l-30.86-315.26zM240 307.2c0 6.4-6.4 12.8-12.8 12.8h-70.4c-6.4 0-12.8-6.4-12.8-12.8v-38.4c0-6.4 6.4-12.8 12.8-12.8h70.4c6.4 0 12.8 6.4 12.8 12.8v38.4z\"]\n};\nvar faMoon = {\n prefix: 'fas',\n iconName: 'moon',\n icon: [512, 512, [], \"f186\", \"M283.211 512c78.962 0 151.079-35.925 198.857-94.792 7.068-8.708-.639-21.43-11.562-19.35-124.203 23.654-238.262-71.576-238.262-196.954 0-72.222 38.662-138.635 101.498-174.394 9.686-5.512 7.25-20.197-3.756-22.23A258.156 258.156 0 0 0 283.211 0c-141.309 0-256 114.511-256 256 0 141.309 114.511 256 256 256z\"]\n};\nvar faMortarPestle = {\n prefix: 'fas',\n iconName: 'mortar-pestle',\n icon: [512, 512, [], \"f5a7\", \"M501.54 60.91c17.22-17.22 12.51-46.25-9.27-57.14a35.696 35.696 0 0 0-37.37 3.37L251.09 160h151.37l99.08-99.09zM496 192H16c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h16c0 80.98 50.2 150.11 121.13 178.32-12.76 16.87-21.72 36.8-24.95 58.69-1.46 9.92 6.04 18.98 16.07 18.98h223.5c10.03 0 17.53-9.06 16.07-18.98-3.22-21.89-12.18-41.82-24.95-58.69C429.8 406.11 480 336.98 480 256h16c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16z\"]\n};\nvar faMosque = {\n prefix: 'fas',\n iconName: 'mosque',\n icon: [640, 512, [], \"f678\", \"M0 480c0 17.67 14.33 32 32 32h64c17.67 0 32-14.33 32-32V160H0v320zm579.16-192c17.86-17.39 28.84-37.34 28.84-58.91 0-52.86-41.79-93.79-87.92-122.9-41.94-26.47-80.63-57.77-111.96-96.22L400 0l-8.12 9.97c-31.33 38.45-70.01 69.76-111.96 96.22C233.79 135.3 192 176.23 192 229.09c0 21.57 10.98 41.52 28.84 58.91h358.32zM608 320H192c-17.67 0-32 14.33-32 32v128c0 17.67 14.33 32 32 32h32v-64c0-17.67 14.33-32 32-32s32 14.33 32 32v64h64v-72c0-48 48-72 48-72s48 24 48 72v72h64v-64c0-17.67 14.33-32 32-32s32 14.33 32 32v64h32c17.67 0 32-14.33 32-32V352c0-17.67-14.33-32-32-32zM64 0S0 32 0 96v32h128V96c0-64-64-96-64-96z\"]\n};\nvar faMotorcycle = {\n prefix: 'fas',\n iconName: 'motorcycle',\n icon: [640, 512, [], \"f21c\", \"M512.9 192c-14.9-.1-29.1 2.3-42.4 6.9L437.6 144H520c13.3 0 24-10.7 24-24V88c0-13.3-10.7-24-24-24h-45.3c-6.8 0-13.3 2.9-17.8 7.9l-37.5 41.7-22.8-38C392.2 68.4 384.4 64 376 64h-80c-8.8 0-16 7.2-16 16v16c0 8.8 7.2 16 16 16h66.4l19.2 32H227.9c-17.7-23.1-44.9-40-99.9-40H72.5C59 104 47.7 115 48 128.5c.2 13 10.9 23.5 24 23.5h56c24.5 0 38.7 10.9 47.8 24.8l-11.3 20.5c-13-3.9-26.9-5.7-41.3-5.2C55.9 194.5 1.6 249.6 0 317c-1.6 72.1 56.3 131 128 131 59.6 0 109.7-40.8 124-96h84.2c13.7 0 24.6-11.4 24-25.1-2.1-47.1 17.5-93.7 56.2-125l12.5 20.8c-27.6 23.7-45.1 58.9-44.8 98.2.5 69.6 57.2 126.5 126.8 127.1 71.6.7 129.8-57.5 129.2-129.1-.7-69.6-57.6-126.4-127.2-126.9zM128 400c-44.1 0-80-35.9-80-80s35.9-80 80-80c4.2 0 8.4.3 12.5 1L99 316.4c-8.8 16 2.8 35.6 21 35.6h81.3c-12.4 28.2-40.6 48-73.3 48zm463.9-75.6c-2.2 40.6-35 73.4-75.5 75.5-46.1 2.5-84.4-34.3-84.4-79.9 0-21.4 8.4-40.8 22.1-55.1l49.4 82.4c4.5 7.6 14.4 10 22 5.5l13.7-8.2c7.6-4.5 10-14.4 5.5-22l-48.6-80.9c5.2-1.1 10.5-1.6 15.9-1.6 45.6-.1 82.3 38.2 79.9 84.3z\"]\n};\nvar faMountain = {\n prefix: 'fas',\n iconName: 'mountain',\n icon: [640, 512, [], \"f6fc\", \"M634.92 462.7l-288-448C341.03 5.54 330.89 0 320 0s-21.03 5.54-26.92 14.7l-288 448a32.001 32.001 0 0 0-1.17 32.64A32.004 32.004 0 0 0 32 512h576c11.71 0 22.48-6.39 28.09-16.67a31.983 31.983 0 0 0-1.17-32.63zM320 91.18L405.39 224H320l-64 64-38.06-38.06L320 91.18z\"]\n};\nvar faMousePointer = {\n prefix: 'fas',\n iconName: 'mouse-pointer',\n icon: [320, 512, [], \"f245\", \"M302.189 329.126H196.105l55.831 135.993c3.889 9.428-.555 19.999-9.444 23.999l-49.165 21.427c-9.165 4-19.443-.571-23.332-9.714l-53.053-129.136-86.664 89.138C18.729 472.71 0 463.554 0 447.977V18.299C0 1.899 19.921-6.096 30.277 5.443l284.412 292.542c11.472 11.179 3.007 31.141-12.5 31.141z\"]\n};\nvar faMugHot = {\n prefix: 'fas',\n iconName: 'mug-hot',\n icon: [512, 512, [], \"f7b6\", \"M127.1 146.5c1.3 7.7 8 13.5 16 13.5h16.5c9.8 0 17.6-8.5 16.3-18-3.8-28.2-16.4-54.2-36.6-74.7-14.4-14.7-23.6-33.3-26.4-53.5C111.8 5.9 105 0 96.8 0H80.4C70.6 0 63 8.5 64.1 18c3.9 31.9 18 61.3 40.6 84.4 12 12.2 19.7 27.5 22.4 44.1zm112 0c1.3 7.7 8 13.5 16 13.5h16.5c9.8 0 17.6-8.5 16.3-18-3.8-28.2-16.4-54.2-36.6-74.7-14.4-14.7-23.6-33.3-26.4-53.5C223.8 5.9 217 0 208.8 0h-16.4c-9.8 0-17.5 8.5-16.3 18 3.9 31.9 18 61.3 40.6 84.4 12 12.2 19.7 27.5 22.4 44.1zM400 192H32c-17.7 0-32 14.3-32 32v192c0 53 43 96 96 96h192c53 0 96-43 96-96h16c61.8 0 112-50.2 112-112s-50.2-112-112-112zm0 160h-16v-96h16c26.5 0 48 21.5 48 48s-21.5 48-48 48z\"]\n};\nvar faMusic = {\n prefix: 'fas',\n iconName: 'music',\n icon: [512, 512, [], \"f001\", \"M511.99 32.01c0-21.71-21.1-37.01-41.6-30.51L150.4 96c-13.3 4.2-22.4 16.5-22.4 30.5v261.42c-10.05-2.38-20.72-3.92-32-3.92-53.02 0-96 28.65-96 64s42.98 64 96 64 96-28.65 96-64V214.31l256-75.02v184.63c-10.05-2.38-20.72-3.92-32-3.92-53.02 0-96 28.65-96 64s42.98 64 96 64 96-28.65 96-64l-.01-351.99z\"]\n};\nvar faNetworkWired = {\n prefix: 'fas',\n iconName: 'network-wired',\n icon: [640, 512, [], \"f6ff\", \"M640 264v-16c0-8.84-7.16-16-16-16H344v-40h72c17.67 0 32-14.33 32-32V32c0-17.67-14.33-32-32-32H224c-17.67 0-32 14.33-32 32v128c0 17.67 14.33 32 32 32h72v40H16c-8.84 0-16 7.16-16 16v16c0 8.84 7.16 16 16 16h104v40H64c-17.67 0-32 14.33-32 32v128c0 17.67 14.33 32 32 32h160c17.67 0 32-14.33 32-32V352c0-17.67-14.33-32-32-32h-56v-40h304v40h-56c-17.67 0-32 14.33-32 32v128c0 17.67 14.33 32 32 32h160c17.67 0 32-14.33 32-32V352c0-17.67-14.33-32-32-32h-56v-40h104c8.84 0 16-7.16 16-16zM256 128V64h128v64H256zm-64 320H96v-64h96v64zm352 0h-96v-64h96v64z\"]\n};\nvar faNeuter = {\n prefix: 'fas',\n iconName: 'neuter',\n icon: [288, 512, [], \"f22c\", \"M288 176c0-79.5-64.5-144-144-144S0 96.5 0 176c0 68.5 47.9 125.9 112 140.4V468c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12V316.4c64.1-14.5 112-71.9 112-140.4zm-144 80c-44.1 0-80-35.9-80-80s35.9-80 80-80 80 35.9 80 80-35.9 80-80 80z\"]\n};\nvar faNewspaper = {\n prefix: 'fas',\n iconName: 'newspaper',\n icon: [576, 512, [], \"f1ea\", \"M552 64H88c-13.255 0-24 10.745-24 24v8H24c-13.255 0-24 10.745-24 24v272c0 30.928 25.072 56 56 56h472c26.51 0 48-21.49 48-48V88c0-13.255-10.745-24-24-24zM56 400a8 8 0 0 1-8-8V144h16v248a8 8 0 0 1-8 8zm236-16H140c-6.627 0-12-5.373-12-12v-8c0-6.627 5.373-12 12-12h152c6.627 0 12 5.373 12 12v8c0 6.627-5.373 12-12 12zm208 0H348c-6.627 0-12-5.373-12-12v-8c0-6.627 5.373-12 12-12h152c6.627 0 12 5.373 12 12v8c0 6.627-5.373 12-12 12zm-208-96H140c-6.627 0-12-5.373-12-12v-8c0-6.627 5.373-12 12-12h152c6.627 0 12 5.373 12 12v8c0 6.627-5.373 12-12 12zm208 0H348c-6.627 0-12-5.373-12-12v-8c0-6.627 5.373-12 12-12h152c6.627 0 12 5.373 12 12v8c0 6.627-5.373 12-12 12zm0-96H140c-6.627 0-12-5.373-12-12v-40c0-6.627 5.373-12 12-12h360c6.627 0 12 5.373 12 12v40c0 6.627-5.373 12-12 12z\"]\n};\nvar faNotEqual = {\n prefix: 'fas',\n iconName: 'not-equal',\n icon: [448, 512, [], \"f53e\", \"M416 208c17.67 0 32-14.33 32-32v-32c0-17.67-14.33-32-32-32h-23.88l51.87-66.81c5.37-7.02 4.04-17.06-2.97-22.43L415.61 3.3c-7.02-5.38-17.06-4.04-22.44 2.97L311.09 112H32c-17.67 0-32 14.33-32 32v32c0 17.67 14.33 32 32 32h204.56l-74.53 96H32c-17.67 0-32 14.33-32 32v32c0 17.67 14.33 32 32 32h55.49l-51.87 66.81c-5.37 7.01-4.04 17.05 2.97 22.43L64 508.7c7.02 5.38 17.06 4.04 22.43-2.97L168.52 400H416c17.67 0 32-14.33 32-32v-32c0-17.67-14.33-32-32-32H243.05l74.53-96H416z\"]\n};\nvar faNotesMedical = {\n prefix: 'fas',\n iconName: 'notes-medical',\n icon: [384, 512, [], \"f481\", \"M336 64h-80c0-35.3-28.7-64-64-64s-64 28.7-64 64H48C21.5 64 0 85.5 0 112v352c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V112c0-26.5-21.5-48-48-48zM192 40c13.3 0 24 10.7 24 24s-10.7 24-24 24-24-10.7-24-24 10.7-24 24-24zm96 304c0 4.4-3.6 8-8 8h-56v56c0 4.4-3.6 8-8 8h-48c-4.4 0-8-3.6-8-8v-56h-56c-4.4 0-8-3.6-8-8v-48c0-4.4 3.6-8 8-8h56v-56c0-4.4 3.6-8 8-8h48c4.4 0 8 3.6 8 8v56h56c4.4 0 8 3.6 8 8v48zm0-192c0 4.4-3.6 8-8 8H104c-4.4 0-8-3.6-8-8v-16c0-4.4 3.6-8 8-8h176c4.4 0 8 3.6 8 8v16z\"]\n};\nvar faObjectGroup = {\n prefix: 'fas',\n iconName: 'object-group',\n icon: [512, 512, [], \"f247\", \"M480 128V96h20c6.627 0 12-5.373 12-12V44c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v20H64V44c0-6.627-5.373-12-12-12H12C5.373 32 0 37.373 0 44v40c0 6.627 5.373 12 12 12h20v320H12c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12v-20h384v20c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12v-40c0-6.627-5.373-12-12-12h-20V128zM96 276V140c0-6.627 5.373-12 12-12h168c6.627 0 12 5.373 12 12v136c0 6.627-5.373 12-12 12H108c-6.627 0-12-5.373-12-12zm320 96c0 6.627-5.373 12-12 12H236c-6.627 0-12-5.373-12-12v-52h72c13.255 0 24-10.745 24-24v-72h84c6.627 0 12 5.373 12 12v136z\"]\n};\nvar faObjectUngroup = {\n prefix: 'fas',\n iconName: 'object-ungroup',\n icon: [576, 512, [], \"f248\", \"M64 320v26a6 6 0 0 1-6 6H6a6 6 0 0 1-6-6v-52a6 6 0 0 1 6-6h26V96H6a6 6 0 0 1-6-6V38a6 6 0 0 1 6-6h52a6 6 0 0 1 6 6v26h288V38a6 6 0 0 1 6-6h52a6 6 0 0 1 6 6v52a6 6 0 0 1-6 6h-26v192h26a6 6 0 0 1 6 6v52a6 6 0 0 1-6 6h-52a6 6 0 0 1-6-6v-26H64zm480-64v-32h26a6 6 0 0 0 6-6v-52a6 6 0 0 0-6-6h-52a6 6 0 0 0-6 6v26H408v72h8c13.255 0 24 10.745 24 24v64c0 13.255-10.745 24-24 24h-64c-13.255 0-24-10.745-24-24v-8H192v72h-26a6 6 0 0 0-6 6v52a6 6 0 0 0 6 6h52a6 6 0 0 0 6-6v-26h288v26a6 6 0 0 0 6 6h52a6 6 0 0 0 6-6v-52a6 6 0 0 0-6-6h-26V256z\"]\n};\nvar faOilCan = {\n prefix: 'fas',\n iconName: 'oil-can',\n icon: [640, 512, [], \"f613\", \"M629.8 160.31L416 224l-50.49-25.24a64.07 64.07 0 0 0-28.62-6.76H280v-48h56c8.84 0 16-7.16 16-16v-16c0-8.84-7.16-16-16-16H176c-8.84 0-16 7.16-16 16v16c0 8.84 7.16 16 16 16h56v48h-56L37.72 166.86a31.9 31.9 0 0 0-5.79-.53C14.67 166.33 0 180.36 0 198.34v94.95c0 15.46 11.06 28.72 26.28 31.48L96 337.46V384c0 17.67 14.33 32 32 32h274.63c8.55 0 16.75-3.42 22.76-9.51l212.26-214.75c1.5-1.5 2.34-3.54 2.34-5.66V168c.01-5.31-5.08-9.15-10.19-7.69zM96 288.67l-48-8.73v-62.43l48 8.73v62.43zm453.33 84.66c0 23.56 19.1 42.67 42.67 42.67s42.67-19.1 42.67-42.67S592 288 592 288s-42.67 61.77-42.67 85.33z\"]\n};\nvar faOm = {\n prefix: 'fas',\n iconName: 'om',\n icon: [512, 512, [], \"f679\", \"M360.6 60.94a10.43 10.43 0 0 0 14.76 0l21.57-21.56a10.43 10.43 0 0 0 0-14.76L375.35 3.06c-4.08-4.07-10.68-4.07-14.76 0l-21.57 21.56a10.43 10.43 0 0 0 0 14.76l21.58 21.56zM412.11 192c-26.69 0-51.77 10.39-70.64 29.25l-24.25 24.25c-6.78 6.77-15.78 10.5-25.38 10.5H245c10.54-22.1 14.17-48.11 7.73-75.23-10.1-42.55-46.36-76.11-89.52-83.19-36.15-5.93-70.9 5.04-96.01 28.78-7.36 6.96-6.97 18.85 1.12 24.93l26.15 19.63c5.72 4.3 13.66 4.32 19.2-.21 8.45-6.9 19.02-10.71 30.27-10.71 26.47 0 48.01 21.53 48.01 48s-21.54 48-48.01 48h-31.9c-11.96 0-19.74 12.58-14.39 23.28l16.09 32.17c2.53 5.06 7.6 8.1 13.17 8.55h33.03c35.3 0 64.01 28.7 64.01 64s-28.71 64-64.01 64c-96.02 0-122.35-54.02-145.15-92.03-4.53-7.55-14.77-3.58-14.79 5.22C-.09 416 41.13 512 159.94 512c70.59 0 128.02-57.42 128.02-128 0-23.42-6.78-45.1-17.81-64h21.69c26.69 0 51.77-10.39 70.64-29.25l24.25-24.25c6.78-6.77 15.78-10.5 25.38-10.5 19.78 0 35.88 16.09 35.88 35.88V392c0 13.23-18.77 24-32.01 24-39.4 0-66.67-24.24-81.82-42.89-4.77-5.87-14.2-2.54-14.2 5.02V416s0 64 96.02 64c48.54 0 96.02-39.47 96.02-88V291.88c0-55.08-44.8-99.88-99.89-99.88zm42.18-124.73c-85.55 65.12-169.05 2.75-172.58.05-6.02-4.62-14.44-4.38-20.14.55-5.74 4.92-7.27 13.17-3.66 19.8 1.61 2.95 40.37 72.34 118.8 72.34 79.92 0 98.78-31.36 101.75-37.66 1.02-2.12 1.53-4.47 1.53-6.83V80c0-13.22-15.14-20.69-25.7-12.73z\"]\n};\nvar faOtter = {\n prefix: 'fas',\n iconName: 'otter',\n icon: [640, 512, [], \"f700\", \"M608 32h-32l-13.25-13.25A63.97 63.97 0 0 0 517.49 0H497c-11.14 0-22.08 2.91-31.75 8.43L312 96h-56C149.96 96 64 181.96 64 288v1.61c0 32.75-16 62.14-39.56 84.89-18.19 17.58-28.1 43.68-23.19 71.8 6.76 38.8 42.9 65.7 82.28 65.7H192c17.67 0 32-14.33 32-32s-14.33-32-32-32H80c-8.83 0-16-7.17-16-16s7.17-16 16-16h224c8.84 0 16-7.16 16-16v-16c0-17.67-14.33-32-32-32h-64l149.49-80.5L448 416h80c8.84 0 16-7.16 16-16v-16c0-17.67-14.33-32-32-32h-28.22l-55.11-110.21L521.14 192H544c53.02 0 96-42.98 96-96V64c0-17.67-14.33-32-32-32zm-96 16c8.84 0 16 7.16 16 16s-7.16 16-16 16-16-7.16-16-16 7.16-16 16-16zm32 96h-34.96L407.2 198.84l-13.77-27.55L512 112h77.05c-6.62 18.58-24.22 32-45.05 32z\"]\n};\nvar faOutdent = {\n prefix: 'fas',\n iconName: 'outdent',\n icon: [448, 512, [], \"f03b\", \"M0 84V44c0-8.837 7.163-16 16-16h416c8.837 0 16 7.163 16 16v40c0 8.837-7.163 16-16 16H16c-8.837 0-16-7.163-16-16zm208 144h224c8.837 0 16-7.163 16-16v-40c0-8.837-7.163-16-16-16H208c-8.837 0-16 7.163-16 16v40c0 8.837 7.163 16 16 16zM16 484h416c8.837 0 16-7.163 16-16v-40c0-8.837-7.163-16-16-16H16c-8.837 0-16 7.163-16 16v40c0 8.837 7.163 16 16 16zm192-128h224c8.837 0 16-7.163 16-16v-40c0-8.837-7.163-16-16-16H208c-8.837 0-16 7.163-16 16v40c0 8.837 7.163 16 16 16zM4.687 267.313l96 95.984C110.734 373.348 128 366.224 128 351.984V160.008c0-14.329-17.325-21.304-27.313-11.313l-96 95.992c-6.249 6.248-6.249 16.378 0 22.626z\"]\n};\nvar faPager = {\n prefix: 'fas',\n iconName: 'pager',\n icon: [512, 512, [], \"f815\", \"M448 64H64a64 64 0 0 0-64 64v256a64 64 0 0 0 64 64h384a64 64 0 0 0 64-64V128a64 64 0 0 0-64-64zM160 368H80a16 16 0 0 1-16-16v-16a16 16 0 0 1 16-16h80zm128-16a16 16 0 0 1-16 16h-80v-48h80a16 16 0 0 1 16 16zm160-128a32 32 0 0 1-32 32H96a32 32 0 0 1-32-32v-64a32 32 0 0 1 32-32h320a32 32 0 0 1 32 32z\"]\n};\nvar faPaintBrush = {\n prefix: 'fas',\n iconName: 'paint-brush',\n icon: [512, 512, [], \"f1fc\", \"M167.02 309.34c-40.12 2.58-76.53 17.86-97.19 72.3-2.35 6.21-8 9.98-14.59 9.98-11.11 0-45.46-27.67-55.25-34.35C0 439.62 37.93 512 128 512c75.86 0 128-43.77 128-120.19 0-3.11-.65-6.08-.97-9.13l-88.01-73.34zM457.89 0c-15.16 0-29.37 6.71-40.21 16.45C213.27 199.05 192 203.34 192 257.09c0 13.7 3.25 26.76 8.73 38.7l63.82 53.18c7.21 1.8 14.64 3.03 22.39 3.03 62.11 0 98.11-45.47 211.16-256.46 7.38-14.35 13.9-29.85 13.9-45.99C512 20.64 486 0 457.89 0z\"]\n};\nvar faPaintRoller = {\n prefix: 'fas',\n iconName: 'paint-roller',\n icon: [512, 512, [], \"f5aa\", \"M416 128V32c0-17.67-14.33-32-32-32H32C14.33 0 0 14.33 0 32v96c0 17.67 14.33 32 32 32h352c17.67 0 32-14.33 32-32zm32-64v128c0 17.67-14.33 32-32 32H256c-35.35 0-64 28.65-64 64v32c-17.67 0-32 14.33-32 32v128c0 17.67 14.33 32 32 32h64c17.67 0 32-14.33 32-32V352c0-17.67-14.33-32-32-32v-32h160c53.02 0 96-42.98 96-96v-64c0-35.35-28.65-64-64-64z\"]\n};\nvar faPalette = {\n prefix: 'fas',\n iconName: 'palette',\n icon: [512, 512, [], \"f53f\", \"M204.3 5C104.9 24.4 24.8 104.3 5.2 203.4c-37 187 131.7 326.4 258.8 306.7 41.2-6.4 61.4-54.6 42.5-91.7-23.1-45.4 9.9-98.4 60.9-98.4h79.7c35.8 0 64.8-29.6 64.9-65.3C511.5 97.1 368.1-26.9 204.3 5zM96 320c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32zm32-128c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32zm128-64c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32zm128 64c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32z\"]\n};\nvar faPallet = {\n prefix: 'fas',\n iconName: 'pallet',\n icon: [640, 512, [], \"f482\", \"M144 256h352c8.8 0 16-7.2 16-16V16c0-8.8-7.2-16-16-16H384v128l-64-32-64 32V0H144c-8.8 0-16 7.2-16 16v224c0 8.8 7.2 16 16 16zm480 128c8.8 0 16-7.2 16-16v-32c0-8.8-7.2-16-16-16H16c-8.8 0-16 7.2-16 16v32c0 8.8 7.2 16 16 16h48v64H16c-8.8 0-16 7.2-16 16v32c0 8.8 7.2 16 16 16h608c8.8 0 16-7.2 16-16v-32c0-8.8-7.2-16-16-16h-48v-64h48zm-336 64H128v-64h160v64zm224 0H352v-64h160v64z\"]\n};\nvar faPaperPlane = {\n prefix: 'fas',\n iconName: 'paper-plane',\n icon: [512, 512, [], \"f1d8\", \"M476 3.2L12.5 270.6c-18.1 10.4-15.8 35.6 2.2 43.2L121 358.4l287.3-253.2c5.5-4.9 13.3 2.6 8.6 8.3L176 407v80.5c0 23.6 28.5 32.9 42.5 15.8L282 426l124.6 52.2c14.2 6 30.4-2.9 33-18.2l72-432C515 7.8 493.3-6.8 476 3.2z\"]\n};\nvar faPaperclip = {\n prefix: 'fas',\n iconName: 'paperclip',\n icon: [448, 512, [], \"f0c6\", \"M43.246 466.142c-58.43-60.289-57.341-157.511 1.386-217.581L254.392 34c44.316-45.332 116.351-45.336 160.671 0 43.89 44.894 43.943 117.329 0 162.276L232.214 383.128c-29.855 30.537-78.633 30.111-107.982-.998-28.275-29.97-27.368-77.473 1.452-106.953l143.743-146.835c6.182-6.314 16.312-6.422 22.626-.241l22.861 22.379c6.315 6.182 6.422 16.312.241 22.626L171.427 319.927c-4.932 5.045-5.236 13.428-.648 18.292 4.372 4.634 11.245 4.711 15.688.165l182.849-186.851c19.613-20.062 19.613-52.725-.011-72.798-19.189-19.627-49.957-19.637-69.154 0L90.39 293.295c-34.763 35.56-35.299 93.12-1.191 128.313 34.01 35.093 88.985 35.137 123.058.286l172.06-175.999c6.177-6.319 16.307-6.433 22.626-.256l22.877 22.364c6.319 6.177 6.434 16.307.256 22.626l-172.06 175.998c-59.576 60.938-155.943 60.216-214.77-.485z\"]\n};\nvar faParachuteBox = {\n prefix: 'fas',\n iconName: 'parachute-box',\n icon: [512, 512, [], \"f4cd\", \"M511.9 175c-9.1-75.6-78.4-132.4-158.3-158.7C390 55.7 416 116.9 416 192h28.1L327.5 321.5c-2.5-.6-4.8-1.5-7.5-1.5h-48V192h112C384 76.8 315.1 0 256 0S128 76.8 128 192h112v128h-48c-2.7 0-5 .9-7.5 1.5L67.9 192H96c0-75.1 26-136.3 62.4-175.7C78.5 42.7 9.2 99.5.1 175c-1.1 9.1 6.8 17 16 17h8.7l136.7 151.9c-.7 2.6-1.6 5.2-1.6 8.1v128c0 17.7 14.3 32 32 32h128c17.7 0 32-14.3 32-32V352c0-2.9-.9-5.4-1.6-8.1L487.1 192h8.7c9.3 0 17.2-7.8 16.1-17z\"]\n};\nvar faParagraph = {\n prefix: 'fas',\n iconName: 'paragraph',\n icon: [448, 512, [], \"f1dd\", \"M408 32H177.531C88.948 32 16.045 103.335 16 191.918 15.956 280.321 87.607 352 176 352v104c0 13.255 10.745 24 24 24h32c13.255 0 24-10.745 24-24V112h32v344c0 13.255 10.745 24 24 24h32c13.255 0 24-10.745 24-24V112h40c13.255 0 24-10.745 24-24V56c0-13.255-10.745-24-24-24z\"]\n};\nvar faParking = {\n prefix: 'fas',\n iconName: 'parking',\n icon: [448, 512, [], \"f540\", \"M400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zM240 320h-48v48c0 8.8-7.2 16-16 16h-32c-8.8 0-16-7.2-16-16V144c0-8.8 7.2-16 16-16h96c52.9 0 96 43.1 96 96s-43.1 96-96 96zm0-128h-48v64h48c17.6 0 32-14.4 32-32s-14.4-32-32-32z\"]\n};\nvar faPassport = {\n prefix: 'fas',\n iconName: 'passport',\n icon: [448, 512, [], \"f5ab\", \"M129.62 176h39.09c1.49-27.03 6.54-51.35 14.21-70.41-27.71 13.24-48.02 39.19-53.3 70.41zm0 32c5.29 31.22 25.59 57.17 53.3 70.41-7.68-19.06-12.72-43.38-14.21-70.41h-39.09zM224 286.69c7.69-7.45 20.77-34.42 23.43-78.69h-46.87c2.67 44.26 15.75 71.24 23.44 78.69zM200.57 176h46.87c-2.66-44.26-15.74-71.24-23.43-78.69-7.7 7.45-20.78 34.43-23.44 78.69zm64.51 102.41c27.71-13.24 48.02-39.19 53.3-70.41h-39.09c-1.49 27.03-6.53 51.35-14.21 70.41zM416 0H64C28.65 0 0 28.65 0 64v384c0 35.35 28.65 64 64 64h352c17.67 0 32-14.33 32-32V32c0-17.67-14.33-32-32-32zm-80 416H112c-8.8 0-16-7.2-16-16s7.2-16 16-16h224c8.8 0 16 7.2 16 16s-7.2 16-16 16zm-112-96c-70.69 0-128-57.31-128-128S153.31 64 224 64s128 57.31 128 128-57.31 128-128 128zm41.08-214.41c7.68 19.06 12.72 43.38 14.21 70.41h39.09c-5.28-31.22-25.59-57.17-53.3-70.41z\"]\n};\nvar faPastafarianism = {\n prefix: 'fas',\n iconName: 'pastafarianism',\n icon: [640, 512, [], \"f67b\", \"M624.54 347.67c-32.7-12.52-57.36 4.25-75.37 16.45-17.06 11.53-23.25 14.42-31.41 11.36-8.12-3.09-10.83-9.38-15.89-29.38-3.33-13.15-7.44-29.32-17.95-42.65 2.24-2.91 4.43-5.79 6.38-8.57C500.47 304.45 513.71 312 532 312c33.95 0 50.87-25.78 62.06-42.83 10.59-16.14 15-21.17 21.94-21.17 13.25 0 24-10.75 24-24s-10.75-24-24-24c-33.95 0-50.87 25.78-62.06 42.83-10.6 16.14-15 21.17-21.94 21.17-17.31 0-37.48-61.43-97.26-101.91l17.25-34.5C485.43 125.5 512 97.98 512 64c0-35.35-28.65-64-64-64s-64 28.65-64 64c0 13.02 3.94 25.1 10.62 35.21l-18.15 36.3c-16.98-4.6-35.6-7.51-56.46-7.51s-39.49 2.91-56.46 7.51l-18.15-36.3C252.06 89.1 256 77.02 256 64c0-35.35-28.65-64-64-64s-64 28.65-64 64c0 33.98 26.56 61.5 60.02 63.6l17.25 34.5C145.68 202.44 125.15 264 108 264c-6.94 0-11.34-5.03-21.94-21.17C74.88 225.78 57.96 200 24 200c-13.25 0-24 10.75-24 24s10.75 24 24 24c6.94 0 11.34 5.03 21.94 21.17C57.13 286.22 74.05 312 108 312c18.29 0 31.53-7.55 41.7-17.11 1.95 2.79 4.14 5.66 6.38 8.57-10.51 13.33-14.62 29.5-17.95 42.65-5.06 20-7.77 26.28-15.89 29.38-8.11 3.06-14.33.17-31.41-11.36-18.03-12.2-42.72-28.92-75.37-16.45-12.39 4.72-18.59 18.58-13.87 30.97 4.72 12.41 18.61 18.61 30.97 13.88 8.16-3.09 14.34-.19 31.39 11.36 13.55 9.16 30.83 20.86 52.42 20.84 7.17 0 14.83-1.28 22.97-4.39 32.66-12.44 39.98-41.33 45.33-62.44 2.21-8.72 3.99-14.49 5.95-18.87 16.62 13.61 36.95 25.88 61.64 34.17-9.96 37-32.18 90.8-60.26 90.8-13.25 0-24 10.75-24 24s10.75 24 24 24c66.74 0 97.05-88.63 107.42-129.14 6.69.6 13.42 1.14 20.58 1.14s13.89-.54 20.58-1.14C350.95 423.37 381.26 512 448 512c13.25 0 24-10.75 24-24s-10.75-24-24-24c-27.94 0-50.21-53.81-60.22-90.81 24.69-8.29 45-20.56 61.62-34.16 1.96 4.38 3.74 10.15 5.95 18.87 5.34 21.11 12.67 50 45.33 62.44 8.14 3.11 15.8 4.39 22.97 4.39 21.59 0 38.87-11.69 52.42-20.84 17.05-11.55 23.28-14.45 31.39-11.36 12.39 4.75 26.27-1.47 30.97-13.88 4.71-12.4-1.49-26.26-13.89-30.98zM448 48c8.82 0 16 7.18 16 16s-7.18 16-16 16-16-7.18-16-16 7.18-16 16-16zm-256 0c8.82 0 16 7.18 16 16s-7.18 16-16 16-16-7.18-16-16 7.18-16 16-16z\"]\n};\nvar faPaste = {\n prefix: 'fas',\n iconName: 'paste',\n icon: [448, 512, [], \"f0ea\", \"M128 184c0-30.879 25.122-56 56-56h136V56c0-13.255-10.745-24-24-24h-80.61C204.306 12.89 183.637 0 160 0s-44.306 12.89-55.39 32H24C10.745 32 0 42.745 0 56v336c0 13.255 10.745 24 24 24h104V184zm32-144c13.255 0 24 10.745 24 24s-10.745 24-24 24-24-10.745-24-24 10.745-24 24-24zm184 248h104v200c0 13.255-10.745 24-24 24H184c-13.255 0-24-10.745-24-24V184c0-13.255 10.745-24 24-24h136v104c0 13.2 10.8 24 24 24zm104-38.059V256h-96v-96h6.059a24 24 0 0 1 16.97 7.029l65.941 65.941a24.002 24.002 0 0 1 7.03 16.971z\"]\n};\nvar faPause = {\n prefix: 'fas',\n iconName: 'pause',\n icon: [448, 512, [], \"f04c\", \"M144 479H48c-26.5 0-48-21.5-48-48V79c0-26.5 21.5-48 48-48h96c26.5 0 48 21.5 48 48v352c0 26.5-21.5 48-48 48zm304-48V79c0-26.5-21.5-48-48-48h-96c-26.5 0-48 21.5-48 48v352c0 26.5 21.5 48 48 48h96c26.5 0 48-21.5 48-48z\"]\n};\nvar faPauseCircle = {\n prefix: 'fas',\n iconName: 'pause-circle',\n icon: [512, 512, [], \"f28b\", \"M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm-16 328c0 8.8-7.2 16-16 16h-48c-8.8 0-16-7.2-16-16V176c0-8.8 7.2-16 16-16h48c8.8 0 16 7.2 16 16v160zm112 0c0 8.8-7.2 16-16 16h-48c-8.8 0-16-7.2-16-16V176c0-8.8 7.2-16 16-16h48c8.8 0 16 7.2 16 16v160z\"]\n};\nvar faPaw = {\n prefix: 'fas',\n iconName: 'paw',\n icon: [512, 512, [], \"f1b0\", \"M256 224c-79.41 0-192 122.76-192 200.25 0 34.9 26.81 55.75 71.74 55.75 48.84 0 81.09-25.08 120.26-25.08 39.51 0 71.85 25.08 120.26 25.08 44.93 0 71.74-20.85 71.74-55.75C448 346.76 335.41 224 256 224zm-147.28-12.61c-10.4-34.65-42.44-57.09-71.56-50.13-29.12 6.96-44.29 40.69-33.89 75.34 10.4 34.65 42.44 57.09 71.56 50.13 29.12-6.96 44.29-40.69 33.89-75.34zm84.72-20.78c30.94-8.14 46.42-49.94 34.58-93.36s-46.52-72.01-77.46-63.87-46.42 49.94-34.58 93.36c11.84 43.42 46.53 72.02 77.46 63.87zm281.39-29.34c-29.12-6.96-61.15 15.48-71.56 50.13-10.4 34.65 4.77 68.38 33.89 75.34 29.12 6.96 61.15-15.48 71.56-50.13 10.4-34.65-4.77-68.38-33.89-75.34zm-156.27 29.34c30.94 8.14 65.62-20.45 77.46-63.87 11.84-43.42-3.64-85.21-34.58-93.36s-65.62 20.45-77.46 63.87c-11.84 43.42 3.64 85.22 34.58 93.36z\"]\n};\nvar faPeace = {\n prefix: 'fas',\n iconName: 'peace',\n icon: [496, 512, [], \"f67c\", \"M248 8C111.03 8 0 119.03 0 256s111.03 248 248 248 248-111.03 248-248S384.97 8 248 8zm184 248c0 31.93-8.2 61.97-22.57 88.17L280 240.63V74.97c86.23 15.21 152 90.5 152 181.03zM216 437.03c-33.86-5.97-64.49-21.2-89.29-43.02L216 322.57v114.46zm64-114.46L369.29 394c-24.8 21.82-55.43 37.05-89.29 43.02V322.57zm-64-247.6v165.66L86.57 344.17C72.2 317.97 64 287.93 64 256c0-90.53 65.77-165.82 152-181.03z\"]\n};\nvar faPen = {\n prefix: 'fas',\n iconName: 'pen',\n icon: [512, 512, [], \"f304\", \"M290.74 93.24l128.02 128.02-277.99 277.99-114.14 12.6C11.35 513.54-1.56 500.62.14 485.34l12.7-114.22 277.9-277.88zm207.2-19.06l-60.11-60.11c-18.75-18.75-49.16-18.75-67.91 0l-56.55 56.55 128.02 128.02 56.55-56.55c18.75-18.76 18.75-49.16 0-67.91z\"]\n};\nvar faPenAlt = {\n prefix: 'fas',\n iconName: 'pen-alt',\n icon: [512, 512, [], \"f305\", \"M497.94 74.17l-60.11-60.11c-18.75-18.75-49.16-18.75-67.91 0l-56.55 56.55 128.02 128.02 56.55-56.55c18.75-18.75 18.75-49.15 0-67.91zm-246.8-20.53c-15.62-15.62-40.94-15.62-56.56 0L75.8 172.43c-6.25 6.25-6.25 16.38 0 22.62l22.63 22.63c6.25 6.25 16.38 6.25 22.63 0l101.82-101.82 22.63 22.62L93.95 290.03A327.038 327.038 0 0 0 .17 485.11l-.03.23c-1.7 15.28 11.21 28.2 26.49 26.51a327.02 327.02 0 0 0 195.34-93.8l196.79-196.79-82.77-82.77-84.85-84.85z\"]\n};\nvar faPenFancy = {\n prefix: 'fas',\n iconName: 'pen-fancy',\n icon: [512, 512, [], \"f5ac\", \"M79.18 282.94a32.005 32.005 0 0 0-20.24 20.24L0 480l4.69 4.69 92.89-92.89c-.66-2.56-1.57-5.03-1.57-7.8 0-17.67 14.33-32 32-32s32 14.33 32 32-14.33 32-32 32c-2.77 0-5.24-.91-7.8-1.57l-92.89 92.89L32 512l176.82-58.94a31.983 31.983 0 0 0 20.24-20.24l33.07-84.07-98.88-98.88-84.07 33.07zM369.25 28.32L186.14 227.81l97.85 97.85 199.49-183.11C568.4 67.48 443.73-55.94 369.25 28.32z\"]\n};\nvar faPenNib = {\n prefix: 'fas',\n iconName: 'pen-nib',\n icon: [512, 512, [], \"f5ad\", \"M136.6 138.79a64.003 64.003 0 0 0-43.31 41.35L0 460l14.69 14.69L164.8 324.58c-2.99-6.26-4.8-13.18-4.8-20.58 0-26.51 21.49-48 48-48s48 21.49 48 48-21.49 48-48 48c-7.4 0-14.32-1.81-20.58-4.8L37.31 497.31 52 512l279.86-93.29a64.003 64.003 0 0 0 41.35-43.31L416 224 288 96l-151.4 42.79zm361.34-64.62l-60.11-60.11c-18.75-18.75-49.16-18.75-67.91 0l-56.55 56.55 128.02 128.02 56.55-56.55c18.75-18.75 18.75-49.15 0-67.91z\"]\n};\nvar faPenSquare = {\n prefix: 'fas',\n iconName: 'pen-square',\n icon: [448, 512, [], \"f14b\", \"M400 480H48c-26.5 0-48-21.5-48-48V80c0-26.5 21.5-48 48-48h352c26.5 0 48 21.5 48 48v352c0 26.5-21.5 48-48 48zM238.1 177.9L102.4 313.6l-6.3 57.1c-.8 7.6 5.6 14.1 13.3 13.3l57.1-6.3L302.2 242c2.3-2.3 2.3-6.1 0-8.5L246.7 178c-2.5-2.4-6.3-2.4-8.6-.1zM345 165.1L314.9 135c-9.4-9.4-24.6-9.4-33.9 0l-23.1 23.1c-2.3 2.3-2.3 6.1 0 8.5l55.5 55.5c2.3 2.3 6.1 2.3 8.5 0L345 199c9.3-9.3 9.3-24.5 0-33.9z\"]\n};\nvar faPencilAlt = {\n prefix: 'fas',\n iconName: 'pencil-alt',\n icon: [512, 512, [], \"f303\", \"M497.9 142.1l-46.1 46.1c-4.7 4.7-12.3 4.7-17 0l-111-111c-4.7-4.7-4.7-12.3 0-17l46.1-46.1c18.7-18.7 49.1-18.7 67.9 0l60.1 60.1c18.8 18.7 18.8 49.1 0 67.9zM284.2 99.8L21.6 362.4.4 483.9c-2.9 16.4 11.4 30.6 27.8 27.8l121.5-21.3 262.6-262.6c4.7-4.7 4.7-12.3 0-17l-111-111c-4.8-4.7-12.4-4.7-17.1 0zM124.1 339.9c-5.5-5.5-5.5-14.3 0-19.8l154-154c5.5-5.5 14.3-5.5 19.8 0s5.5 14.3 0 19.8l-154 154c-5.5 5.5-14.3 5.5-19.8 0zM88 424h48v36.3l-64.5 11.3-31.1-31.1L51.7 376H88v48z\"]\n};\nvar faPencilRuler = {\n prefix: 'fas',\n iconName: 'pencil-ruler',\n icon: [512, 512, [], \"f5ae\", \"M109.46 244.04l134.58-134.56-44.12-44.12-61.68 61.68a7.919 7.919 0 0 1-11.21 0l-11.21-11.21c-3.1-3.1-3.1-8.12 0-11.21l61.68-61.68-33.64-33.65C131.47-3.1 111.39-3.1 99 9.29L9.29 99c-12.38 12.39-12.39 32.47 0 44.86l100.17 100.18zm388.47-116.8c18.76-18.76 18.75-49.17 0-67.93l-45.25-45.25c-18.76-18.76-49.18-18.76-67.95 0l-46.02 46.01 113.2 113.2 46.02-46.03zM316.08 82.71l-297 296.96L.32 487.11c-2.53 14.49 10.09 27.11 24.59 24.56l107.45-18.84L429.28 195.9 316.08 82.71zm186.63 285.43l-33.64-33.64-61.68 61.68c-3.1 3.1-8.12 3.1-11.21 0l-11.21-11.21c-3.09-3.1-3.09-8.12 0-11.21l61.68-61.68-44.14-44.14L267.93 402.5l100.21 100.2c12.39 12.39 32.47 12.39 44.86 0l89.71-89.7c12.39-12.39 12.39-32.47 0-44.86z\"]\n};\nvar faPeopleCarry = {\n prefix: 'fas',\n iconName: 'people-carry',\n icon: [640, 512, [], \"f4ce\", \"M128 96c26.5 0 48-21.5 48-48S154.5 0 128 0 80 21.5 80 48s21.5 48 48 48zm384 0c26.5 0 48-21.5 48-48S538.5 0 512 0s-48 21.5-48 48 21.5 48 48 48zm125.7 372.1l-44-110-41.1 46.4-2 18.2 27.7 69.2c5 12.5 17 20.1 29.7 20.1 4 0 8-.7 11.9-2.3 16.4-6.6 24.4-25.2 17.8-41.6zm-34.2-209.8L585 178.1c-4.6-20-18.6-36.8-37.5-44.9-18.5-8-39-6.7-56.1 3.3-22.7 13.4-39.7 34.5-48.1 59.4L432 229.8 416 240v-96c0-8.8-7.2-16-16-16H240c-8.8 0-16 7.2-16 16v96l-16.1-10.2-11.3-33.9c-8.3-25-25.4-46-48.1-59.4-17.2-10-37.6-11.3-56.1-3.3-18.9 8.1-32.9 24.9-37.5 44.9l-18.4 80.2c-4.6 20 .7 41.2 14.4 56.7l67.2 75.9 10.1 92.6C130 499.8 143.8 512 160 512c1.2 0 2.3-.1 3.5-.2 17.6-1.9 30.2-17.7 28.3-35.3l-10.1-92.8c-1.5-13-6.9-25.1-15.6-35l-43.3-49 17.6-70.3 6.8 20.4c4.1 12.5 11.9 23.4 24.5 32.6l51.1 32.5c4.6 2.9 12.1 4.6 17.2 5h160c5.1-.4 12.6-2.1 17.2-5l51.1-32.5c12.6-9.2 20.4-20 24.5-32.6l6.8-20.4 17.6 70.3-43.3 49c-8.7 9.9-14.1 22-15.6 35l-10.1 92.8c-1.9 17.6 10.8 33.4 28.3 35.3 1.2.1 2.3.2 3.5.2 16.1 0 30-12.1 31.8-28.5l10.1-92.6 67.2-75.9c13.6-15.5 19-36.7 14.4-56.7zM46.3 358.1l-44 110c-6.6 16.4 1.4 35 17.8 41.6 16.8 6.6 35.1-1.7 41.6-17.8l27.7-69.2-2-18.2-41.1-46.4z\"]\n};\nvar faPepperHot = {\n prefix: 'fas',\n iconName: 'pepper-hot',\n icon: [512, 512, [], \"f816\", \"M330.67 263.12V173.4l-52.75-24.22C219.44 218.76 197.58 400 56 400a56 56 0 0 0 0 112c212.64 0 370.65-122.87 419.18-210.34l-37.05-38.54zm131.09-128.37C493.92 74.91 477.18 26.48 458.62 3a8 8 0 0 0-11.93-.59l-22.9 23a8.06 8.06 0 0 0-.89 10.23c6.86 10.36 17.05 35.1-1.4 72.32A142.85 142.85 0 0 0 364.34 96c-28 0-54 8.54-76.34 22.59l74.67 34.29v78.24h89.09L506.44 288c3.26-12.62 5.56-25.63 5.56-39.31a154 154 0 0 0-50.24-113.94z\"]\n};\nvar faPercent = {\n prefix: 'fas',\n iconName: 'percent',\n icon: [448, 512, [], \"f295\", \"M112 224c61.9 0 112-50.1 112-112S173.9 0 112 0 0 50.1 0 112s50.1 112 112 112zm0-160c26.5 0 48 21.5 48 48s-21.5 48-48 48-48-21.5-48-48 21.5-48 48-48zm224 224c-61.9 0-112 50.1-112 112s50.1 112 112 112 112-50.1 112-112-50.1-112-112-112zm0 160c-26.5 0-48-21.5-48-48s21.5-48 48-48 48 21.5 48 48-21.5 48-48 48zM392.3.2l31.6-.1c19.4-.1 30.9 21.8 19.7 37.8L77.4 501.6a23.95 23.95 0 0 1-19.6 10.2l-33.4.1c-19.5 0-30.9-21.9-19.7-37.8l368-463.7C377.2 4 384.5.2 392.3.2z\"]\n};\nvar faPercentage = {\n prefix: 'fas',\n iconName: 'percentage',\n icon: [384, 512, [], \"f541\", \"M109.25 173.25c24.99-24.99 24.99-65.52 0-90.51-24.99-24.99-65.52-24.99-90.51 0-24.99 24.99-24.99 65.52 0 90.51 25 25 65.52 25 90.51 0zm256 165.49c-24.99-24.99-65.52-24.99-90.51 0-24.99 24.99-24.99 65.52 0 90.51 24.99 24.99 65.52 24.99 90.51 0 25-24.99 25-65.51 0-90.51zm-1.94-231.43l-22.62-22.62c-12.5-12.5-32.76-12.5-45.25 0L20.69 359.44c-12.5 12.5-12.5 32.76 0 45.25l22.62 22.62c12.5 12.5 32.76 12.5 45.25 0l274.75-274.75c12.5-12.49 12.5-32.75 0-45.25z\"]\n};\nvar faPersonBooth = {\n prefix: 'fas',\n iconName: 'person-booth',\n icon: [576, 512, [], \"f756\", \"M192 496c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16V320h-64v176zm32-272h-50.9l-45.2-45.3C115.8 166.6 99.7 160 82.7 160H64c-17.1 0-33.2 6.7-45.3 18.8C6.7 190.9 0 207 0 224.1L.2 320 0 480c0 17.7 14.3 32 31.9 32 17.6 0 32-14.3 32-32l.1-100.7c.9.5 1.6 1.3 2.5 1.7l29.1 43v56c0 17.7 14.3 32 32 32s32-14.3 32-32v-56.5c0-9.9-2.3-19.8-6.7-28.6l-41.2-61.3V253l20.9 20.9c9.1 9.1 21.1 14.1 33.9 14.1H224c17.7 0 32-14.3 32-32s-14.3-32-32-32zM64 128c26.5 0 48-21.5 48-48S90.5 32 64 32 16 53.5 16 80s21.5 48 48 48zm224-96l31.5 223.1-30.9 154.6c-4.3 21.6 13 38.3 31.4 38.3 15.2 0 28-9.1 32.3-30.4.9 16.9 14.6 30.4 31.7 30.4 17.7 0 32-14.3 32-32 0 17.7 14.3 32 32 32s32-14.3 32-32V0H288v32zm-96 0v160h64V0h-32c-17.7 0-32 14.3-32 32zM544 0h-32v496c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16V32c0-17.7-14.3-32-32-32z\"]\n};\nvar faPhone = {\n prefix: 'fas',\n iconName: 'phone',\n icon: [512, 512, [], \"f095\", \"M493.4 24.6l-104-24c-11.3-2.6-22.9 3.3-27.5 13.9l-48 112c-4.2 9.8-1.4 21.3 6.9 28l60.6 49.6c-36 76.7-98.9 140.5-177.2 177.2l-49.6-60.6c-6.8-8.3-18.2-11.1-28-6.9l-112 48C3.9 366.5-2 378.1.6 389.4l24 104C27.1 504.2 36.7 512 48 512c256.1 0 464-207.5 464-464 0-11.2-7.7-20.9-18.6-23.4z\"]\n};\nvar faPhoneSlash = {\n prefix: 'fas',\n iconName: 'phone-slash',\n icon: [640, 512, [], \"f3dd\", \"M268.2 381.4l-49.6-60.6c-6.8-8.3-18.2-11.1-28-6.9l-112 48c-10.7 4.6-16.5 16.1-13.9 27.5l24 104c2.5 10.8 12.1 18.6 23.4 18.6 100.7 0 193.7-32.4 269.7-86.9l-80-61.8c-10.9 6.5-22.1 12.7-33.6 18.1zm365.6 76.7L475.1 335.5C537.9 256.4 576 156.9 576 48c0-11.2-7.7-20.9-18.6-23.4l-104-24c-11.3-2.6-22.9 3.3-27.5 13.9l-48 112c-4.2 9.8-1.4 21.3 6.9 28l60.6 49.6c-12.2 26.1-27.9 50.3-46 72.8L45.5 3.4C38.5-2 28.5-.8 23 6.2L3.4 31.4c-5.4 7-4.2 17 2.8 22.4l588.4 454.7c7 5.4 17 4.2 22.5-2.8l19.6-25.3c5.4-6.8 4.1-16.9-2.9-22.3z\"]\n};\nvar faPhoneSquare = {\n prefix: 'fas',\n iconName: 'phone-square',\n icon: [448, 512, [], \"f098\", \"M400 32H48C21.49 32 0 53.49 0 80v352c0 26.51 21.49 48 48 48h352c26.51 0 48-21.49 48-48V80c0-26.51-21.49-48-48-48zM94 416c-7.033 0-13.057-4.873-14.616-11.627l-14.998-65a15 15 0 0 1 8.707-17.16l69.998-29.999a15 15 0 0 1 17.518 4.289l30.997 37.885c48.944-22.963 88.297-62.858 110.781-110.78l-37.886-30.997a15.001 15.001 0 0 1-4.289-17.518l30-69.998a15 15 0 0 1 17.16-8.707l65 14.998A14.997 14.997 0 0 1 384 126c0 160.292-129.945 290-290 290z\"]\n};\nvar faPhoneVolume = {\n prefix: 'fas',\n iconName: 'phone-volume',\n icon: [384, 512, [], \"f2a0\", \"M97.333 506.966c-129.874-129.874-129.681-340.252 0-469.933 5.698-5.698 14.527-6.632 21.263-2.422l64.817 40.513a17.187 17.187 0 0 1 6.849 20.958l-32.408 81.021a17.188 17.188 0 0 1-17.669 10.719l-55.81-5.58c-21.051 58.261-20.612 122.471 0 179.515l55.811-5.581a17.188 17.188 0 0 1 17.669 10.719l32.408 81.022a17.188 17.188 0 0 1-6.849 20.958l-64.817 40.513a17.19 17.19 0 0 1-21.264-2.422zM247.126 95.473c11.832 20.047 11.832 45.008 0 65.055-3.95 6.693-13.108 7.959-18.718 2.581l-5.975-5.726c-3.911-3.748-4.793-9.622-2.261-14.41a32.063 32.063 0 0 0 0-29.945c-2.533-4.788-1.65-10.662 2.261-14.41l5.975-5.726c5.61-5.378 14.768-4.112 18.718 2.581zm91.787-91.187c60.14 71.604 60.092 175.882 0 247.428-4.474 5.327-12.53 5.746-17.552.933l-5.798-5.557c-4.56-4.371-4.977-11.529-.93-16.379 49.687-59.538 49.646-145.933 0-205.422-4.047-4.85-3.631-12.008.93-16.379l5.798-5.557c5.022-4.813 13.078-4.394 17.552.933zm-45.972 44.941c36.05 46.322 36.108 111.149 0 157.546-4.39 5.641-12.697 6.251-17.856 1.304l-5.818-5.579c-4.4-4.219-4.998-11.095-1.285-15.931 26.536-34.564 26.534-82.572 0-117.134-3.713-4.836-3.115-11.711 1.285-15.931l5.818-5.579c5.159-4.947 13.466-4.337 17.856 1.304z\"]\n};\nvar faPiggyBank = {\n prefix: 'fas',\n iconName: 'piggy-bank',\n icon: [576, 512, [], \"f4d3\", \"M560 224h-29.5c-8.8-20-21.6-37.7-37.4-52.5L512 96h-32c-29.4 0-55.4 13.5-73 34.3-7.6-1.1-15.1-2.3-23-2.3H256c-77.4 0-141.9 55-156.8 128H56c-14.8 0-26.5-13.5-23.5-28.8C34.7 215.8 45.4 208 57 208h1c3.3 0 6-2.7 6-6v-20c0-3.3-2.7-6-6-6-28.5 0-53.9 20.4-57.5 48.6C-3.9 258.8 22.7 288 56 288h40c0 52.2 25.4 98.1 64 127.3V496c0 8.8 7.2 16 16 16h64c8.8 0 16-7.2 16-16v-48h128v48c0 8.8 7.2 16 16 16h64c8.8 0 16-7.2 16-16v-80.7c11.8-8.9 22.3-19.4 31.3-31.3H560c8.8 0 16-7.2 16-16V240c0-8.8-7.2-16-16-16zm-128 64c-8.8 0-16-7.2-16-16s7.2-16 16-16 16 7.2 16 16-7.2 16-16 16zM256 96h128c5.4 0 10.7.4 15.9.8 0-.3.1-.5.1-.8 0-53-43-96-96-96s-96 43-96 96c0 2.1.5 4.1.6 6.2 15.2-3.9 31-6.2 47.4-6.2z\"]\n};\nvar faPills = {\n prefix: 'fas',\n iconName: 'pills',\n icon: [576, 512, [], \"f484\", \"M112 32C50.1 32 0 82.1 0 144v224c0 61.9 50.1 112 112 112s112-50.1 112-112V144c0-61.9-50.1-112-112-112zm48 224H64V144c0-26.5 21.5-48 48-48s48 21.5 48 48v112zm139.7-29.7c-3.5-3.5-9.4-3.1-12.3.8-45.3 62.5-40.4 150.1 15.9 206.4 56.3 56.3 143.9 61.2 206.4 15.9 4-2.9 4.3-8.8.8-12.3L299.7 226.3zm229.8-19c-56.3-56.3-143.9-61.2-206.4-15.9-4 2.9-4.3 8.8-.8 12.3l210.8 210.8c3.5 3.5 9.4 3.1 12.3-.8 45.3-62.6 40.5-150.1-15.9-206.4z\"]\n};\nvar faPizzaSlice = {\n prefix: 'fas',\n iconName: 'pizza-slice',\n icon: [512, 512, [], \"f818\", \"M158.87.15c-16.16-1.52-31.2 8.42-35.33 24.12l-14.81 56.27c187.62 5.49 314.54 130.61 322.48 317l56.94-15.78c15.72-4.36 25.49-19.68 23.62-35.9C490.89 165.08 340.78 17.32 158.87.15zm-58.47 112L.55 491.64a16.21 16.21 0 0 0 20 19.75l379-105.1c-4.27-174.89-123.08-292.14-299.15-294.1zM128 416a32 32 0 1 1 32-32 32 32 0 0 1-32 32zm48-152a32 32 0 1 1 32-32 32 32 0 0 1-32 32zm104 104a32 32 0 1 1 32-32 32 32 0 0 1-32 32z\"]\n};\nvar faPlaceOfWorship = {\n prefix: 'fas',\n iconName: 'place-of-worship',\n icon: [640, 512, [], \"f67f\", \"M620.61 366.55L512 320v192h112c8.84 0 16-7.16 16-16V395.96a32 32 0 0 0-19.39-29.41zM0 395.96V496c0 8.84 7.16 16 16 16h112V320L19.39 366.55A32 32 0 0 0 0 395.96zm464.46-149.28L416 217.6V102.63c0-8.49-3.37-16.62-9.38-22.63L331.31 4.69c-6.25-6.25-16.38-6.25-22.62 0L233.38 80c-6 6-9.38 14.14-9.38 22.63V217.6l-48.46 29.08A31.997 31.997 0 0 0 160 274.12V512h96v-96c0-35.35 28.66-64 64-64s64 28.65 64 64v96h96V274.12c0-11.24-5.9-21.66-15.54-27.44z\"]\n};\nvar faPlane = {\n prefix: 'fas',\n iconName: 'plane',\n icon: [576, 512, [], \"f072\", \"M480 192H365.71L260.61 8.06A16.014 16.014 0 0 0 246.71 0h-65.5c-10.63 0-18.3 10.17-15.38 20.39L214.86 192H112l-43.2-57.6c-3.02-4.03-7.77-6.4-12.8-6.4H16.01C5.6 128-2.04 137.78.49 147.88L32 256 .49 364.12C-2.04 374.22 5.6 384 16.01 384H56c5.04 0 9.78-2.37 12.8-6.4L112 320h102.86l-49.03 171.6c-2.92 10.22 4.75 20.4 15.38 20.4h65.5c5.74 0 11.04-3.08 13.89-8.06L365.71 320H480c35.35 0 96-28.65 96-64s-60.65-64-96-64z\"]\n};\nvar faPlaneArrival = {\n prefix: 'fas',\n iconName: 'plane-arrival',\n icon: [640, 512, [], \"f5af\", \"M624 448H16c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h608c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16zM44.81 205.66l88.74 80a62.607 62.607 0 0 0 25.47 13.93l287.6 78.35c26.48 7.21 54.56 8.72 81 1.36 29.67-8.27 43.44-21.21 47.25-35.71 3.83-14.5-1.73-32.71-23.37-54.96-19.28-19.82-44.35-32.79-70.83-40l-97.51-26.56L282.8 30.22c-1.51-5.81-5.95-10.35-11.66-11.91L206.05.58c-10.56-2.88-20.9 5.32-20.71 16.44l47.92 164.21-102.2-27.84-27.59-67.88c-1.93-4.89-6.01-8.57-11.02-9.93L52.72 64.75c-10.34-2.82-20.53 5-20.72 15.88l.23 101.78c.19 8.91 6.03 17.34 12.58 23.25z\"]\n};\nvar faPlaneDeparture = {\n prefix: 'fas',\n iconName: 'plane-departure',\n icon: [640, 512, [], \"f5b0\", \"M624 448H16c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h608c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16zM80.55 341.27c6.28 6.84 15.1 10.72 24.33 10.71l130.54-.18a65.62 65.62 0 0 0 29.64-7.12l290.96-147.65c26.74-13.57 50.71-32.94 67.02-58.31 18.31-28.48 20.3-49.09 13.07-63.65-7.21-14.57-24.74-25.27-58.25-27.45-29.85-1.94-59.54 5.92-86.28 19.48l-98.51 49.99-218.7-82.06a17.799 17.799 0 0 0-18-1.11L90.62 67.29c-10.67 5.41-13.25 19.65-5.17 28.53l156.22 98.1-103.21 52.38-72.35-36.47a17.804 17.804 0 0 0-16.07.02L9.91 230.22c-10.44 5.3-13.19 19.12-5.57 28.08l76.21 82.97z\"]\n};\nvar faPlay = {\n prefix: 'fas',\n iconName: 'play',\n icon: [448, 512, [], \"f04b\", \"M424.4 214.7L72.4 6.6C43.8-10.3 0 6.1 0 47.9V464c0 37.5 40.7 60.1 72.4 41.3l352-208c31.4-18.5 31.5-64.1 0-82.6z\"]\n};\nvar faPlayCircle = {\n prefix: 'fas',\n iconName: 'play-circle',\n icon: [512, 512, [], \"f144\", \"M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm115.7 272l-176 101c-15.8 8.8-35.7-2.5-35.7-21V152c0-18.4 19.8-29.8 35.7-21l176 107c16.4 9.2 16.4 32.9 0 42z\"]\n};\nvar faPlug = {\n prefix: 'fas',\n iconName: 'plug',\n icon: [384, 512, [], \"f1e6\", \"M256 144V32c0-17.673 14.327-32 32-32s32 14.327 32 32v112h-64zm112 16H16c-8.837 0-16 7.163-16 16v32c0 8.837 7.163 16 16 16h16v32c0 77.406 54.969 141.971 128 156.796V512h64v-99.204c73.031-14.825 128-79.39 128-156.796v-32h16c8.837 0 16-7.163 16-16v-32c0-8.837-7.163-16-16-16zm-240-16V32c0-17.673-14.327-32-32-32S64 14.327 64 32v112h64z\"]\n};\nvar faPlus = {\n prefix: 'fas',\n iconName: 'plus',\n icon: [448, 512, [], \"f067\", \"M416 208H272V64c0-17.67-14.33-32-32-32h-32c-17.67 0-32 14.33-32 32v144H32c-17.67 0-32 14.33-32 32v32c0 17.67 14.33 32 32 32h144v144c0 17.67 14.33 32 32 32h32c17.67 0 32-14.33 32-32V304h144c17.67 0 32-14.33 32-32v-32c0-17.67-14.33-32-32-32z\"]\n};\nvar faPlusCircle = {\n prefix: 'fas',\n iconName: 'plus-circle',\n icon: [512, 512, [], \"f055\", \"M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm144 276c0 6.6-5.4 12-12 12h-92v92c0 6.6-5.4 12-12 12h-56c-6.6 0-12-5.4-12-12v-92h-92c-6.6 0-12-5.4-12-12v-56c0-6.6 5.4-12 12-12h92v-92c0-6.6 5.4-12 12-12h56c6.6 0 12 5.4 12 12v92h92c6.6 0 12 5.4 12 12v56z\"]\n};\nvar faPlusSquare = {\n prefix: 'fas',\n iconName: 'plus-square',\n icon: [448, 512, [], \"f0fe\", \"M400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zm-32 252c0 6.6-5.4 12-12 12h-92v92c0 6.6-5.4 12-12 12h-56c-6.6 0-12-5.4-12-12v-92H92c-6.6 0-12-5.4-12-12v-56c0-6.6 5.4-12 12-12h92v-92c0-6.6 5.4-12 12-12h56c6.6 0 12 5.4 12 12v92h92c6.6 0 12 5.4 12 12v56z\"]\n};\nvar faPodcast = {\n prefix: 'fas',\n iconName: 'podcast',\n icon: [448, 512, [], \"f2ce\", \"M267.429 488.563C262.286 507.573 242.858 512 224 512c-18.857 0-38.286-4.427-43.428-23.437C172.927 460.134 160 388.898 160 355.75c0-35.156 31.142-43.75 64-43.75s64 8.594 64 43.75c0 32.949-12.871 104.179-20.571 132.813zM156.867 288.554c-18.693-18.308-29.958-44.173-28.784-72.599 2.054-49.724 42.395-89.956 92.124-91.881C274.862 121.958 320 165.807 320 220c0 26.827-11.064 51.116-28.866 68.552-2.675 2.62-2.401 6.986.628 9.187 9.312 6.765 16.46 15.343 21.234 25.363 1.741 3.654 6.497 4.66 9.449 1.891 28.826-27.043 46.553-65.783 45.511-108.565-1.855-76.206-63.595-138.208-139.793-140.369C146.869 73.753 80 139.215 80 220c0 41.361 17.532 78.7 45.55 104.989 2.953 2.771 7.711 1.77 9.453-1.887 4.774-10.021 11.923-18.598 21.235-25.363 3.029-2.2 3.304-6.566.629-9.185zM224 0C100.204 0 0 100.185 0 224c0 89.992 52.602 165.647 125.739 201.408 4.333 2.118 9.267-1.544 8.535-6.31-2.382-15.512-4.342-30.946-5.406-44.339-.146-1.836-1.149-3.486-2.678-4.512-47.4-31.806-78.564-86.016-78.187-147.347.592-96.237 79.29-174.648 175.529-174.899C320.793 47.747 400 126.797 400 224c0 61.932-32.158 116.49-80.65 147.867-.999 14.037-3.069 30.588-5.624 47.23-.732 4.767 4.203 8.429 8.535 6.31C395.227 389.727 448 314.187 448 224 448 100.205 347.815 0 224 0zm0 160c-35.346 0-64 28.654-64 64s28.654 64 64 64 64-28.654 64-64-28.654-64-64-64z\"]\n};\nvar faPoll = {\n prefix: 'fas',\n iconName: 'poll',\n icon: [448, 512, [], \"f681\", \"M400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zM160 368c0 8.84-7.16 16-16 16h-32c-8.84 0-16-7.16-16-16V240c0-8.84 7.16-16 16-16h32c8.84 0 16 7.16 16 16v128zm96 0c0 8.84-7.16 16-16 16h-32c-8.84 0-16-7.16-16-16V144c0-8.84 7.16-16 16-16h32c8.84 0 16 7.16 16 16v224zm96 0c0 8.84-7.16 16-16 16h-32c-8.84 0-16-7.16-16-16v-64c0-8.84 7.16-16 16-16h32c8.84 0 16 7.16 16 16v64z\"]\n};\nvar faPollH = {\n prefix: 'fas',\n iconName: 'poll-h',\n icon: [448, 512, [], \"f682\", \"M448 432V80c0-26.5-21.5-48-48-48H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48zM112 192c-8.84 0-16-7.16-16-16v-32c0-8.84 7.16-16 16-16h128c8.84 0 16 7.16 16 16v32c0 8.84-7.16 16-16 16H112zm0 96c-8.84 0-16-7.16-16-16v-32c0-8.84 7.16-16 16-16h224c8.84 0 16 7.16 16 16v32c0 8.84-7.16 16-16 16H112zm0 96c-8.84 0-16-7.16-16-16v-32c0-8.84 7.16-16 16-16h64c8.84 0 16 7.16 16 16v32c0 8.84-7.16 16-16 16h-64z\"]\n};\nvar faPoo = {\n prefix: 'fas',\n iconName: 'poo',\n icon: [512, 512, [], \"f2fe\", \"M451.4 369.1C468.7 356 480 335.4 480 312c0-39.8-32.2-72-72-72h-14.1c13.4-11.7 22.1-28.8 22.1-48 0-35.3-28.7-64-64-64h-5.9c3.6-10.1 5.9-20.7 5.9-32 0-53-43-96-96-96-5.2 0-10.2.7-15.1 1.5C250.3 14.6 256 30.6 256 48c0 44.2-35.8 80-80 80h-16c-35.3 0-64 28.7-64 64 0 19.2 8.7 36.3 22.1 48H104c-39.8 0-72 32.2-72 72 0 23.4 11.3 44 28.6 57.1C26.3 374.6 0 404.1 0 440c0 39.8 32.2 72 72 72h368c39.8 0 72-32.2 72-72 0-35.9-26.3-65.4-60.6-70.9zM192 256c17.7 0 32 14.3 32 32s-14.3 32-32 32-32-14.3-32-32 14.3-32 32-32zm159.5 139C341 422.9 293 448 256 448s-85-25.1-95.5-53c-2-5.3 2-11 7.8-11h175.4c5.8 0 9.8 5.7 7.8 11zM320 320c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32z\"]\n};\nvar faPooStorm = {\n prefix: 'fas',\n iconName: 'poo-storm',\n icon: [448, 512, [], \"f75a\", \"M308 336h-57.7l17.3-64.9c2-7.6-3.7-15.1-11.6-15.1h-68c-6 0-11.1 4.5-11.9 10.4l-16 120c-1 7.2 4.6 13.6 11.9 13.6h59.3l-23 97.2c-1.8 7.6 4 14.8 11.7 14.8 4.2 0 8.2-2.2 10.4-6l88-152c4.6-8-1.2-18-10.4-18zm66.4-111.3c5.9-9.6 9.6-20.6 9.6-32.7 0-35.3-28.7-64-64-64h-5.9c3.6-10.1 5.9-20.7 5.9-32 0-53-43-96-96-96-5.2 0-10.2.7-15.1 1.5C218.3 14.6 224 30.6 224 48c0 44.2-35.8 80-80 80h-16c-35.3 0-64 28.7-64 64 0 12.1 3.7 23.1 9.6 32.7C32.6 228 0 262.2 0 304c0 44 36 80 80 80h48.3c.1-.6 0-1.2 0-1.8l16-120c3-21.8 21.7-38.2 43.7-38.2h68c13.8 0 26.5 6.3 34.9 17.2s11.2 24.8 7.6 38.1l-6.6 24.7h16c15.7 0 30.3 8.4 38.1 22 7.8 13.6 7.8 30.5 0 44l-8.1 14h30c44 0 80-36 80-80 .1-41.8-32.5-76-73.5-79.3z\"]\n};\nvar faPoop = {\n prefix: 'fas',\n iconName: 'poop',\n icon: [512, 512, [], \"f619\", \"M451.36 369.14C468.66 355.99 480 335.41 480 312c0-39.77-32.24-72-72-72h-14.07c13.42-11.73 22.07-28.78 22.07-48 0-35.35-28.65-64-64-64h-5.88c3.57-10.05 5.88-20.72 5.88-32 0-53.02-42.98-96-96-96-5.17 0-10.15.74-15.11 1.52C250.31 14.64 256 30.62 256 48c0 44.18-35.82 80-80 80h-16c-35.35 0-64 28.65-64 64 0 19.22 8.65 36.27 22.07 48H104c-39.76 0-72 32.23-72 72 0 23.41 11.34 43.99 28.64 57.14C26.31 374.62 0 404.12 0 440c0 39.76 32.24 72 72 72h368c39.76 0 72-32.24 72-72 0-35.88-26.31-65.38-60.64-70.86z\"]\n};\nvar faPortrait = {\n prefix: 'fas',\n iconName: 'portrait',\n icon: [384, 512, [], \"f3e0\", \"M336 0H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V48c0-26.5-21.5-48-48-48zM192 128c35.3 0 64 28.7 64 64s-28.7 64-64 64-64-28.7-64-64 28.7-64 64-64zm112 236.8c0 10.6-10 19.2-22.4 19.2H102.4C90 384 80 375.4 80 364.8v-19.2c0-31.8 30.1-57.6 67.2-57.6h5c12.3 5.1 25.7 8 39.8 8s27.6-2.9 39.8-8h5c37.1 0 67.2 25.8 67.2 57.6v19.2z\"]\n};\nvar faPoundSign = {\n prefix: 'fas',\n iconName: 'pound-sign',\n icon: [320, 512, [], \"f154\", \"M308 352h-45.495c-6.627 0-12 5.373-12 12v50.848H128V288h84c6.627 0 12-5.373 12-12v-40c0-6.627-5.373-12-12-12h-84v-63.556c0-32.266 24.562-57.086 61.792-57.086 23.658 0 45.878 11.505 57.652 18.849 5.151 3.213 11.888 2.051 15.688-2.685l28.493-35.513c4.233-5.276 3.279-13.005-2.119-17.081C273.124 54.56 236.576 32 187.931 32 106.026 32 48 84.742 48 157.961V224H20c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h28v128H12c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h296c6.627 0 12-5.373 12-12V364c0-6.627-5.373-12-12-12z\"]\n};\nvar faPowerOff = {\n prefix: 'fas',\n iconName: 'power-off',\n icon: [512, 512, [], \"f011\", \"M400 54.1c63 45 104 118.6 104 201.9 0 136.8-110.8 247.7-247.5 248C120 504.3 8.2 393 8 256.4 7.9 173.1 48.9 99.3 111.8 54.2c11.7-8.3 28-4.8 35 7.7L162.6 90c5.9 10.5 3.1 23.8-6.6 31-41.5 30.8-68 79.6-68 134.9-.1 92.3 74.5 168.1 168 168.1 91.6 0 168.6-74.2 168-169.1-.3-51.8-24.7-101.8-68.1-134-9.7-7.2-12.4-20.5-6.5-30.9l15.8-28.1c7-12.4 23.2-16.1 34.8-7.8zM296 264V24c0-13.3-10.7-24-24-24h-32c-13.3 0-24 10.7-24 24v240c0 13.3 10.7 24 24 24h32c13.3 0 24-10.7 24-24z\"]\n};\nvar faPray = {\n prefix: 'fas',\n iconName: 'pray',\n icon: [384, 512, [], \"f683\", \"M256 128c35.35 0 64-28.65 64-64S291.35 0 256 0s-64 28.65-64 64 28.65 64 64 64zm-30.63 169.75c14.06 16.72 39 19.09 55.97 5.22l88-72.02c17.09-13.98 19.59-39.19 5.62-56.28-13.97-17.11-39.19-19.59-56.31-5.62l-57.44 47-38.91-46.31c-15.44-18.39-39.22-27.92-64-25.33-24.19 2.48-45.25 16.27-56.37 36.92l-49.37 92.03c-23.4 43.64-8.69 96.37 34.19 123.75L131.56 432H40c-22.09 0-40 17.91-40 40s17.91 40 40 40h208c34.08 0 53.77-42.79 28.28-68.28L166.42 333.86l34.8-64.87 24.15 28.76z\"]\n};\nvar faPrayingHands = {\n prefix: 'fas',\n iconName: 'praying-hands',\n icon: [640, 512, [], \"f684\", \"M272 191.91c-17.6 0-32 14.4-32 32v80c0 8.84-7.16 16-16 16s-16-7.16-16-16v-76.55c0-17.39 4.72-34.47 13.69-49.39l77.75-129.59c9.09-15.16 4.19-34.81-10.97-43.91-14.45-8.67-32.72-4.3-42.3 9.21-.2.23-.62.21-.79.48l-117.26 175.9C117.56 205.9 112 224.31 112 243.29v80.23l-90.12 30.04A31.974 31.974 0 0 0 0 383.91v96c0 10.82 8.52 32 32 32 2.69 0 5.41-.34 8.06-1.03l179.19-46.62C269.16 449.99 304 403.8 304 351.91v-128c0-17.6-14.4-32-32-32zm346.12 161.73L528 323.6v-80.23c0-18.98-5.56-37.39-16.12-53.23L394.62 14.25c-.18-.27-.59-.24-.79-.48-9.58-13.51-27.85-17.88-42.3-9.21-15.16 9.09-20.06 28.75-10.97 43.91l77.75 129.59c8.97 14.92 13.69 32 13.69 49.39V304c0 8.84-7.16 16-16 16s-16-7.16-16-16v-80c0-17.6-14.4-32-32-32s-32 14.4-32 32v128c0 51.89 34.84 98.08 84.75 112.34l179.19 46.62c2.66.69 5.38 1.03 8.06 1.03 23.48 0 32-21.18 32-32v-96c0-13.77-8.81-25.99-21.88-30.35z\"]\n};\nvar faPrescription = {\n prefix: 'fas',\n iconName: 'prescription',\n icon: [384, 512, [], \"f5b1\", \"M301.26 352l78.06-78.06c6.25-6.25 6.25-16.38 0-22.63l-22.63-22.63c-6.25-6.25-16.38-6.25-22.63 0L256 306.74l-83.96-83.96C219.31 216.8 256 176.89 256 128c0-53.02-42.98-96-96-96H16C7.16 32 0 39.16 0 48v256c0 8.84 7.16 16 16 16h32c8.84 0 16-7.16 16-16v-80h18.75l128 128-78.06 78.06c-6.25 6.25-6.25 16.38 0 22.63l22.63 22.63c6.25 6.25 16.38 6.25 22.63 0L256 397.25l78.06 78.06c6.25 6.25 16.38 6.25 22.63 0l22.63-22.63c6.25-6.25 6.25-16.38 0-22.63L301.26 352zM64 96h96c17.64 0 32 14.36 32 32s-14.36 32-32 32H64V96z\"]\n};\nvar faPrescriptionBottle = {\n prefix: 'fas',\n iconName: 'prescription-bottle',\n icon: [384, 512, [], \"f485\", \"M32 192h120c4.4 0 8 3.6 8 8v16c0 4.4-3.6 8-8 8H32v64h120c4.4 0 8 3.6 8 8v16c0 4.4-3.6 8-8 8H32v64h120c4.4 0 8 3.6 8 8v16c0 4.4-3.6 8-8 8H32v64c0 17.6 14.4 32 32 32h256c17.6 0 32-14.4 32-32V128H32v64zM360 0H24C10.8 0 0 10.8 0 24v48c0 13.2 10.8 24 24 24h336c13.2 0 24-10.8 24-24V24c0-13.2-10.8-24-24-24z\"]\n};\nvar faPrescriptionBottleAlt = {\n prefix: 'fas',\n iconName: 'prescription-bottle-alt',\n icon: [384, 512, [], \"f486\", \"M360 0H24C10.8 0 0 10.8 0 24v48c0 13.2 10.8 24 24 24h336c13.2 0 24-10.8 24-24V24c0-13.2-10.8-24-24-24zM32 480c0 17.6 14.4 32 32 32h256c17.6 0 32-14.4 32-32V128H32v352zm64-184c0-4.4 3.6-8 8-8h56v-56c0-4.4 3.6-8 8-8h48c4.4 0 8 3.6 8 8v56h56c4.4 0 8 3.6 8 8v48c0 4.4-3.6 8-8 8h-56v56c0 4.4-3.6 8-8 8h-48c-4.4 0-8-3.6-8-8v-56h-56c-4.4 0-8-3.6-8-8v-48z\"]\n};\nvar faPrint = {\n prefix: 'fas',\n iconName: 'print',\n icon: [512, 512, [], \"f02f\", \"M448 192V77.25c0-8.49-3.37-16.62-9.37-22.63L393.37 9.37c-6-6-14.14-9.37-22.63-9.37H96C78.33 0 64 14.33 64 32v160c-35.35 0-64 28.65-64 64v112c0 8.84 7.16 16 16 16h48v96c0 17.67 14.33 32 32 32h320c17.67 0 32-14.33 32-32v-96h48c8.84 0 16-7.16 16-16V256c0-35.35-28.65-64-64-64zm-64 256H128v-96h256v96zm0-224H128V64h192v48c0 8.84 7.16 16 16 16h48v96zm48 72c-13.25 0-24-10.75-24-24 0-13.26 10.75-24 24-24s24 10.74 24 24c0 13.25-10.75 24-24 24z\"]\n};\nvar faProcedures = {\n prefix: 'fas',\n iconName: 'procedures',\n icon: [640, 512, [], \"f487\", \"M528 224H272c-8.8 0-16 7.2-16 16v144H64V144c0-8.8-7.2-16-16-16H16c-8.8 0-16 7.2-16 16v352c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16v-48h512v48c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16V336c0-61.9-50.1-112-112-112zM136 96h126.1l27.6 55.2c5.9 11.8 22.7 11.8 28.6 0L368 51.8 390.1 96H512c8.8 0 16-7.2 16-16s-7.2-16-16-16H409.9L382.3 8.8C376.4-3 359.6-3 353.7 8.8L304 108.2l-19.9-39.8c-1.4-2.7-4.1-4.4-7.2-4.4H136c-4.4 0-8 3.6-8 8v16c0 4.4 3.6 8 8 8zm24 256c35.3 0 64-28.7 64-64s-28.7-64-64-64-64 28.7-64 64 28.7 64 64 64z\"]\n};\nvar faProjectDiagram = {\n prefix: 'fas',\n iconName: 'project-diagram',\n icon: [640, 512, [], \"f542\", \"M384 320H256c-17.67 0-32 14.33-32 32v128c0 17.67 14.33 32 32 32h128c17.67 0 32-14.33 32-32V352c0-17.67-14.33-32-32-32zM192 32c0-17.67-14.33-32-32-32H32C14.33 0 0 14.33 0 32v128c0 17.67 14.33 32 32 32h95.72l73.16 128.04C211.98 300.98 232.4 288 256 288h.28L192 175.51V128h224V64H192V32zM608 0H480c-17.67 0-32 14.33-32 32v128c0 17.67 14.33 32 32 32h128c17.67 0 32-14.33 32-32V32c0-17.67-14.33-32-32-32z\"]\n};\nvar faPuzzlePiece = {\n prefix: 'fas',\n iconName: 'puzzle-piece',\n icon: [576, 512, [], \"f12e\", \"M519.442 288.651c-41.519 0-59.5 31.593-82.058 31.593C377.409 320.244 432 144 432 144s-196.288 80-196.288-3.297c0-35.827 36.288-46.25 36.288-85.985C272 19.216 243.885 0 210.539 0c-34.654 0-66.366 18.891-66.366 56.346 0 41.364 31.711 59.277 31.711 81.75C175.885 207.719 0 166.758 0 166.758v333.237s178.635 41.047 178.635-28.662c0-22.473-40-40.107-40-81.471 0-37.456 29.25-56.346 63.577-56.346 33.673 0 61.788 19.216 61.788 54.717 0 39.735-36.288 50.158-36.288 85.985 0 60.803 129.675 25.73 181.23 25.73 0 0-34.725-120.101 25.827-120.101 35.962 0 46.423 36.152 86.308 36.152C556.712 416 576 387.99 576 354.443c0-34.199-18.962-65.792-56.558-65.792z\"]\n};\nvar faQrcode = {\n prefix: 'fas',\n iconName: 'qrcode',\n icon: [448, 512, [], \"f029\", \"M0 224h192V32H0v192zM64 96h64v64H64V96zm192-64v192h192V32H256zm128 128h-64V96h64v64zM0 480h192V288H0v192zm64-128h64v64H64v-64zm352-64h32v128h-96v-32h-32v96h-64V288h96v32h64v-32zm0 160h32v32h-32v-32zm-64 0h32v32h-32v-32z\"]\n};\nvar faQuestion = {\n prefix: 'fas',\n iconName: 'question',\n icon: [384, 512, [], \"f128\", \"M202.021 0C122.202 0 70.503 32.703 29.914 91.026c-7.363 10.58-5.093 25.086 5.178 32.874l43.138 32.709c10.373 7.865 25.132 6.026 33.253-4.148 25.049-31.381 43.63-49.449 82.757-49.449 30.764 0 68.816 19.799 68.816 49.631 0 22.552-18.617 34.134-48.993 51.164-35.423 19.86-82.299 44.576-82.299 106.405V320c0 13.255 10.745 24 24 24h72.471c13.255 0 24-10.745 24-24v-5.773c0-42.86 125.268-44.645 125.268-160.627C377.504 66.256 286.902 0 202.021 0zM192 373.459c-38.196 0-69.271 31.075-69.271 69.271 0 38.195 31.075 69.27 69.271 69.27s69.271-31.075 69.271-69.271-31.075-69.27-69.271-69.27z\"]\n};\nvar faQuestionCircle = {\n prefix: 'fas',\n iconName: 'question-circle',\n icon: [512, 512, [], \"f059\", \"M504 256c0 136.997-111.043 248-248 248S8 392.997 8 256C8 119.083 119.043 8 256 8s248 111.083 248 248zM262.655 90c-54.497 0-89.255 22.957-116.549 63.758-3.536 5.286-2.353 12.415 2.715 16.258l34.699 26.31c5.205 3.947 12.621 3.008 16.665-2.122 17.864-22.658 30.113-35.797 57.303-35.797 20.429 0 45.698 13.148 45.698 32.958 0 14.976-12.363 22.667-32.534 33.976C247.128 238.528 216 254.941 216 296v4c0 6.627 5.373 12 12 12h56c6.627 0 12-5.373 12-12v-1.333c0-28.462 83.186-29.647 83.186-106.667 0-58.002-60.165-102-116.531-102zM256 338c-25.365 0-46 20.635-46 46 0 25.364 20.635 46 46 46s46-20.636 46-46c0-25.365-20.635-46-46-46z\"]\n};\nvar faQuidditch = {\n prefix: 'fas',\n iconName: 'quidditch',\n icon: [640, 512, [], \"f458\", \"M256.5 216.8L343.2 326s-16.6 102.4-76.6 150.1C206.7 523.8 0 510.2 0 510.2s3.8-23.1 11-55.4l94.6-112.2c4-4.7-.9-11.6-6.6-9.5l-60.4 22.1c14.4-41.7 32.7-80 54.6-97.5 59.9-47.8 163.3-40.9 163.3-40.9zm238 135c-44 0-79.8 35.8-79.8 79.9 0 44.1 35.7 79.9 79.8 79.9 44.1 0 79.8-35.8 79.8-79.9 0-44.2-35.8-79.9-79.8-79.9zM636.5 31L616.7 6c-5.5-6.9-15.5-8-22.4-2.6L361.8 181.3l-34.1-43c-5.1-6.4-15.1-5.2-18.6 2.2l-25.3 54.6 86.7 109.2 58.8-12.4c8-1.7 11.4-11.2 6.3-17.6l-34.1-42.9L634 53.5c6.9-5.5 8-15.6 2.5-22.5z\"]\n};\nvar faQuoteLeft = {\n prefix: 'fas',\n iconName: 'quote-left',\n icon: [512, 512, [], \"f10d\", \"M464 256h-80v-64c0-35.3 28.7-64 64-64h8c13.3 0 24-10.7 24-24V56c0-13.3-10.7-24-24-24h-8c-88.4 0-160 71.6-160 160v240c0 26.5 21.5 48 48 48h128c26.5 0 48-21.5 48-48V304c0-26.5-21.5-48-48-48zm-288 0H96v-64c0-35.3 28.7-64 64-64h8c13.3 0 24-10.7 24-24V56c0-13.3-10.7-24-24-24h-8C71.6 32 0 103.6 0 192v240c0 26.5 21.5 48 48 48h128c26.5 0 48-21.5 48-48V304c0-26.5-21.5-48-48-48z\"]\n};\nvar faQuoteRight = {\n prefix: 'fas',\n iconName: 'quote-right',\n icon: [512, 512, [], \"f10e\", \"M464 32H336c-26.5 0-48 21.5-48 48v128c0 26.5 21.5 48 48 48h80v64c0 35.3-28.7 64-64 64h-8c-13.3 0-24 10.7-24 24v48c0 13.3 10.7 24 24 24h8c88.4 0 160-71.6 160-160V80c0-26.5-21.5-48-48-48zm-288 0H48C21.5 32 0 53.5 0 80v128c0 26.5 21.5 48 48 48h80v64c0 35.3-28.7 64-64 64h-8c-13.3 0-24 10.7-24 24v48c0 13.3 10.7 24 24 24h8c88.4 0 160-71.6 160-160V80c0-26.5-21.5-48-48-48z\"]\n};\nvar faQuran = {\n prefix: 'fas',\n iconName: 'quran',\n icon: [448, 512, [], \"f687\", \"M448 358.4V25.6c0-16-9.6-25.6-25.6-25.6H96C41.6 0 0 41.6 0 96v320c0 54.4 41.6 96 96 96h326.4c12.8 0 25.6-9.6 25.6-25.6v-16c0-6.4-3.2-12.8-9.6-19.2-3.2-16-3.2-60.8 0-73.6 6.4-3.2 9.6-9.6 9.6-19.2zM301.08 145.82c.6-1.21 1.76-1.82 2.92-1.82s2.32.61 2.92 1.82l11.18 22.65 25 3.63c2.67.39 3.74 3.67 1.81 5.56l-18.09 17.63 4.27 24.89c.36 2.11-1.31 3.82-3.21 3.82-.5 0-1.02-.12-1.52-.38L304 211.87l-22.36 11.75c-.5.26-1.02.38-1.52.38-1.9 0-3.57-1.71-3.21-3.82l4.27-24.89-18.09-17.63c-1.94-1.89-.87-5.17 1.81-5.56l24.99-3.63 11.19-22.65zm-57.89-69.01c13.67 0 27.26 2.49 40.38 7.41a6.775 6.775 0 1 1-2.38 13.12c-.67 0-3.09-.21-4.13-.21-52.31 0-94.86 42.55-94.86 94.86 0 52.3 42.55 94.86 94.86 94.86 1.03 0 3.48-.21 4.13-.21 3.93 0 6.8 3.14 6.8 6.78 0 2.98-1.94 5.51-4.62 6.42-13.07 4.87-26.59 7.34-40.19 7.34C179.67 307.19 128 255.51 128 192c0-63.52 51.67-115.19 115.19-115.19zM380.8 448H96c-19.2 0-32-12.8-32-32s16-32 32-32h284.8v64z\"]\n};\nvar faRadiation = {\n prefix: 'fas',\n iconName: 'radiation',\n icon: [496, 512, [], \"f7b9\", \"M167.8 256.2H16.2C7.1 256.2-.6 263.9 0 273c5.1 75.8 44.4 142.2 102.5 184.2 7.4 5.3 17.9 2.9 22.7-4.8L205.6 324c-22.6-14.3-37.8-39.2-37.8-67.8zm37.8-67.7c12.3-7.7 26.8-12.4 42.4-12.4s30 4.7 42.4 12.4L370.8 60c4.8-7.7 2.4-18.1-5.6-22.4C330.3 18.8 290.4 8 248 8s-82.3 10.8-117.2 29.6c-8 4.3-10.4 14.8-5.6 22.4l80.4 128.5zm42.4 19.7c-26.5 0-48 21.5-48 48s21.5 48 48 48 48-21.5 48-48-21.5-48-48-48zm231.8 48H328.2c0 28.6-15.2 53.5-37.8 67.7l80.4 128.4c4.8 7.7 15.3 10.2 22.7 4.8 58.1-42 97.4-108.4 102.5-184.2.6-9-7.1-16.7-16.2-16.7z\"]\n};\nvar faRadiationAlt = {\n prefix: 'fas',\n iconName: 'radiation-alt',\n icon: [496, 512, [], \"f7ba\", \"M184 256h-79.1c-9.2 0-16.9 7.7-16 16.8 4.6 43.6 27 81.8 59.5 107.8 7.6 6.1 18.8 4.5 24-3.8l41.7-66.8c-18-11.2-30.1-31.2-30.1-54zm97.8-54.1l41.8-66.9c4.9-7.8 2.4-18.4-5.8-22.5C296.7 102.1 273.1 96 248 96s-48.7 6.1-69.9 16.5c-8.2 4.1-10.6 14.7-5.8 22.5l41.8 66.9c9.8-6.2 21.4-9.9 33.8-9.9s24.1 3.7 33.9 9.9zM391.1 256H312c0 22.8-12.1 42.8-30.2 54.1l41.7 66.8c5.2 8.3 16.4 9.9 24 3.8 32.6-26 54.9-64.2 59.5-107.8 1.1-9.2-6.7-16.9-15.9-16.9zM248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 432c-101.5 0-184-82.5-184-184S146.5 72 248 72s184 82.5 184 184-82.5 184-184 184zm0-216c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32z\"]\n};\nvar faRainbow = {\n prefix: 'fas',\n iconName: 'rainbow',\n icon: [576, 512, [], \"f75b\", \"M268.3 32.7C115.4 42.9 0 176.9 0 330.2V464c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16V320C64 186.8 180.9 80.3 317.5 97.9 430.4 112.4 512 214 512 327.8V464c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16V320c0-165.3-140-298.6-307.7-287.3zm-5.6 96.9C166 142 96 229.1 96 326.7V464c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16V320c0-74.8 64.5-134.8 140.8-127.4 66.5 6.5 115.2 66.2 115.2 133.1V464c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16V320c0-114.2-100.2-205.4-217.3-190.4zm6.2 96.3c-45.6 8.9-76.9 51.5-76.9 97.9V464c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16V320c0-17.6 14.3-32 32-32s32 14.4 32 32v144c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16V320c0-59.2-53.8-106-115.1-94.1z\"]\n};\nvar faRandom = {\n prefix: 'fas',\n iconName: 'random',\n icon: [512, 512, [], \"f074\", \"M504.971 359.029c9.373 9.373 9.373 24.569 0 33.941l-80 79.984c-15.01 15.01-40.971 4.49-40.971-16.971V416h-58.785a12.004 12.004 0 0 1-8.773-3.812l-70.556-75.596 53.333-57.143L352 336h32v-39.981c0-21.438 25.943-31.998 40.971-16.971l80 79.981zM12 176h84l52.781 56.551 53.333-57.143-70.556-75.596A11.999 11.999 0 0 0 122.785 96H12c-6.627 0-12 5.373-12 12v56c0 6.627 5.373 12 12 12zm372 0v39.984c0 21.46 25.961 31.98 40.971 16.971l80-79.984c9.373-9.373 9.373-24.569 0-33.941l-80-79.981C409.943 24.021 384 34.582 384 56.019V96h-58.785a12.004 12.004 0 0 0-8.773 3.812L96 336H12c-6.627 0-12 5.373-12 12v56c0 6.627 5.373 12 12 12h110.785c3.326 0 6.503-1.381 8.773-3.812L352 176h32z\"]\n};\nvar faReceipt = {\n prefix: 'fas',\n iconName: 'receipt',\n icon: [384, 512, [], \"f543\", \"M358.4 3.2L320 48 265.6 3.2a15.9 15.9 0 0 0-19.2 0L192 48 137.6 3.2a15.9 15.9 0 0 0-19.2 0L64 48 25.6 3.2C15-4.7 0 2.8 0 16v480c0 13.2 15 20.7 25.6 12.8L64 464l54.4 44.8a15.9 15.9 0 0 0 19.2 0L192 464l54.4 44.8a15.9 15.9 0 0 0 19.2 0L320 464l38.4 44.8c10.5 7.9 25.6.4 25.6-12.8V16c0-13.2-15-20.7-25.6-12.8zM320 360c0 4.4-3.6 8-8 8H72c-4.4 0-8-3.6-8-8v-16c0-4.4 3.6-8 8-8h240c4.4 0 8 3.6 8 8v16zm0-96c0 4.4-3.6 8-8 8H72c-4.4 0-8-3.6-8-8v-16c0-4.4 3.6-8 8-8h240c4.4 0 8 3.6 8 8v16zm0-96c0 4.4-3.6 8-8 8H72c-4.4 0-8-3.6-8-8v-16c0-4.4 3.6-8 8-8h240c4.4 0 8 3.6 8 8v16z\"]\n};\nvar faRecycle = {\n prefix: 'fas',\n iconName: 'recycle',\n icon: [512, 512, [], \"f1b8\", \"M184.561 261.903c3.232 13.997-12.123 24.635-24.068 17.168l-40.736-25.455-50.867 81.402C55.606 356.273 70.96 384 96.012 384H148c6.627 0 12 5.373 12 12v40c0 6.627-5.373 12-12 12H96.115c-75.334 0-121.302-83.048-81.408-146.88l50.822-81.388-40.725-25.448c-12.081-7.547-8.966-25.961 4.879-29.158l110.237-25.45c8.611-1.988 17.201 3.381 19.189 11.99l25.452 110.237zm98.561-182.915l41.289 66.076-40.74 25.457c-12.051 7.528-9 25.953 4.879 29.158l110.237 25.45c8.672 1.999 17.215-3.438 19.189-11.99l25.45-110.237c3.197-13.844-11.99-24.719-24.068-17.168l-40.687 25.424-41.263-66.082c-37.521-60.033-125.209-60.171-162.816 0l-17.963 28.766c-3.51 5.62-1.8 13.021 3.82 16.533l33.919 21.195c5.62 3.512 13.024 1.803 16.536-3.817l17.961-28.743c12.712-20.341 41.973-19.676 54.257-.022zM497.288 301.12l-27.515-44.065c-3.511-5.623-10.916-7.334-16.538-3.821l-33.861 21.159c-5.62 3.512-7.33 10.915-3.818 16.536l27.564 44.112c13.257 21.211-2.057 48.96-27.136 48.96H320V336.02c0-14.213-17.242-21.383-27.313-11.313l-80 79.981c-6.249 6.248-6.249 16.379 0 22.627l80 79.989C302.689 517.308 320 510.3 320 495.989V448h95.88c75.274 0 121.335-82.997 81.408-146.88z\"]\n};\nvar faRedo = {\n prefix: 'fas',\n iconName: 'redo',\n icon: [512, 512, [], \"f01e\", \"M500.333 0h-47.411c-6.853 0-12.314 5.729-11.986 12.574l3.966 82.759C399.416 41.899 331.672 8 256.001 8 119.34 8 7.899 119.526 8 256.187 8.101 393.068 119.096 504 256 504c63.926 0 122.202-24.187 166.178-63.908 5.113-4.618 5.354-12.561.482-17.433l-33.971-33.971c-4.466-4.466-11.64-4.717-16.38-.543C341.308 415.448 300.606 432 256 432c-97.267 0-176-78.716-176-176 0-97.267 78.716-176 176-176 60.892 0 114.506 30.858 146.099 77.8l-101.525-4.865c-6.845-.328-12.574 5.133-12.574 11.986v47.411c0 6.627 5.373 12 12 12h200.333c6.627 0 12-5.373 12-12V12c0-6.627-5.373-12-12-12z\"]\n};\nvar faRedoAlt = {\n prefix: 'fas',\n iconName: 'redo-alt',\n icon: [512, 512, [], \"f2f9\", \"M256.455 8c66.269.119 126.437 26.233 170.859 68.685l35.715-35.715C478.149 25.851 504 36.559 504 57.941V192c0 13.255-10.745 24-24 24H345.941c-21.382 0-32.09-25.851-16.971-40.971l41.75-41.75c-30.864-28.899-70.801-44.907-113.23-45.273-92.398-.798-170.283 73.977-169.484 169.442C88.764 348.009 162.184 424 256 424c41.127 0 79.997-14.678 110.629-41.556 4.743-4.161 11.906-3.908 16.368.553l39.662 39.662c4.872 4.872 4.631 12.815-.482 17.433C378.202 479.813 319.926 504 256 504 119.034 504 8.001 392.967 8 256.002 7.999 119.193 119.646 7.755 256.455 8z\"]\n};\nvar faRegistered = {\n prefix: 'fas',\n iconName: 'registered',\n icon: [512, 512, [], \"f25d\", \"M285.363 207.475c0 18.6-9.831 28.431-28.431 28.431h-29.876v-56.14h23.378c28.668 0 34.929 8.773 34.929 27.709zM504 256c0 136.967-111.033 248-248 248S8 392.967 8 256 119.033 8 256 8s248 111.033 248 248zM363.411 360.414c-46.729-84.825-43.299-78.636-44.702-80.98 23.432-15.172 37.945-42.979 37.945-74.486 0-54.244-31.5-89.252-105.498-89.252h-70.667c-13.255 0-24 10.745-24 24V372c0 13.255 10.745 24 24 24h22.567c13.255 0 24-10.745 24-24v-71.663h25.556l44.129 82.937a24.001 24.001 0 0 0 21.188 12.727h24.464c18.261-.001 29.829-19.591 21.018-35.587z\"]\n};\nvar faReply = {\n prefix: 'fas',\n iconName: 'reply',\n icon: [512, 512, [], \"f3e5\", \"M8.309 189.836L184.313 37.851C199.719 24.546 224 35.347 224 56.015v80.053c160.629 1.839 288 34.032 288 186.258 0 61.441-39.581 122.309-83.333 154.132-13.653 9.931-33.111-2.533-28.077-18.631 45.344-145.012-21.507-183.51-176.59-185.742V360c0 20.7-24.3 31.453-39.687 18.164l-176.004-152c-11.071-9.562-11.086-26.753 0-36.328z\"]\n};\nvar faReplyAll = {\n prefix: 'fas',\n iconName: 'reply-all',\n icon: [576, 512, [], \"f122\", \"M136.309 189.836L312.313 37.851C327.72 24.546 352 35.348 352 56.015v82.763c129.182 10.231 224 52.212 224 183.548 0 61.441-39.582 122.309-83.333 154.132-13.653 9.931-33.111-2.533-28.077-18.631 38.512-123.162-3.922-169.482-112.59-182.015v84.175c0 20.701-24.3 31.453-39.687 18.164L136.309 226.164c-11.071-9.561-11.086-26.753 0-36.328zm-128 36.328L184.313 378.15C199.7 391.439 224 380.687 224 359.986v-15.818l-108.606-93.785A55.96 55.96 0 0 1 96 207.998a55.953 55.953 0 0 1 19.393-42.38L224 71.832V56.015c0-20.667-24.28-31.469-39.687-18.164L8.309 189.836c-11.086 9.575-11.071 26.767 0 36.328z\"]\n};\nvar faRepublican = {\n prefix: 'fas',\n iconName: 'republican',\n icon: [640, 512, [], \"f75e\", \"M544 192c0-88.4-71.6-160-160-160H160C71.6 32 0 103.6 0 192v64h544v-64zm-367.7-21.6l-19.8 19.3 4.7 27.3c.8 4.9-4.3 8.6-8.7 6.3L128 210.4l-24.5 12.9c-4.3 2.3-9.5-1.4-8.7-6.3l4.7-27.3-19.8-19.3c-3.6-3.5-1.6-9.5 3.3-10.2l27.4-4 12.2-24.8c2.2-4.5 8.6-4.4 10.7 0l12.2 24.8 27.4 4c5 .7 6.9 6.7 3.4 10.2zm144 0l-19.8 19.3 4.7 27.3c.8 4.9-4.3 8.6-8.7 6.3L272 210.4l-24.5 12.9c-4.3 2.3-9.5-1.4-8.7-6.3l4.7-27.3-19.8-19.3c-3.6-3.5-1.6-9.5 3.3-10.2l27.4-4 12.2-24.8c2.2-4.5 8.6-4.4 10.7 0l12.2 24.8 27.4 4c5 .7 6.9 6.7 3.4 10.2zm144 0l-19.8 19.3 4.7 27.3c.8 4.9-4.3 8.6-8.7 6.3L416 210.4l-24.5 12.9c-4.3 2.3-9.5-1.4-8.7-6.3l4.7-27.3-19.8-19.3c-3.6-3.5-1.6-9.5 3.3-10.2l27.4-4 12.2-24.8c2.2-4.5 8.6-4.4 10.7 0l12.2 24.8 27.4 4c5 .7 6.9 6.7 3.4 10.2zM624 320h-32c-8.8 0-16 7.2-16 16v64c0 8.8-7.2 16-16 16s-16-7.2-16-16V288H0v176c0 8.8 7.2 16 16 16h96c8.8 0 16-7.2 16-16v-80h192v80c0 8.8 7.2 16 16 16h96c8.8 0 16-7.2 16-16V352h32v43.3c0 41.8 30 80.1 71.6 84.3 47.8 4.9 88.4-32.7 88.4-79.6v-64c0-8.8-7.2-16-16-16z\"]\n};\nvar faRestroom = {\n prefix: 'fas',\n iconName: 'restroom',\n icon: [640, 512, [], \"f7bd\", \"M128 128c35.3 0 64-28.7 64-64S163.3 0 128 0 64 28.7 64 64s28.7 64 64 64zm384 0c35.3 0 64-28.7 64-64S547.3 0 512 0s-64 28.7-64 64 28.7 64 64 64zm127.3 226.5l-45.6-185.8c-3.3-13.5-15.5-23-29.8-24.2-15 9.7-32.8 15.5-52 15.5-19.2 0-37-5.8-52-15.5-14.3 1.2-26.5 10.7-29.8 24.2l-45.6 185.8C381 369.6 393 384 409.2 384H464v104c0 13.3 10.7 24 24 24h48c13.3 0 24-10.7 24-24V384h54.8c16.2 0 28.2-14.4 24.5-29.5zM336 0h-32c-8.8 0-16 7.2-16 16v480c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16V16c0-8.8-7.2-16-16-16zM180.1 144.4c-15 9.8-32.9 15.6-52.1 15.6-19.2 0-37.1-5.8-52.1-15.6C51.3 146.5 32 166.9 32 192v136c0 13.3 10.7 24 24 24h8v136c0 13.3 10.7 24 24 24h80c13.3 0 24-10.7 24-24V352h8c13.3 0 24-10.7 24-24V192c0-25.1-19.3-45.5-43.9-47.6z\"]\n};\nvar faRetweet = {\n prefix: 'fas',\n iconName: 'retweet',\n icon: [640, 512, [], \"f079\", \"M629.657 343.598L528.971 444.284c-9.373 9.372-24.568 9.372-33.941 0L394.343 343.598c-9.373-9.373-9.373-24.569 0-33.941l10.823-10.823c9.562-9.562 25.133-9.34 34.419.492L480 342.118V160H292.451a24.005 24.005 0 0 1-16.971-7.029l-16-16C244.361 121.851 255.069 96 276.451 96H520c13.255 0 24 10.745 24 24v222.118l40.416-42.792c9.285-9.831 24.856-10.054 34.419-.492l10.823 10.823c9.372 9.372 9.372 24.569-.001 33.941zm-265.138 15.431A23.999 23.999 0 0 0 347.548 352H160V169.881l40.416 42.792c9.286 9.831 24.856 10.054 34.419.491l10.822-10.822c9.373-9.373 9.373-24.569 0-33.941L144.971 67.716c-9.373-9.373-24.569-9.373-33.941 0L10.343 168.402c-9.373 9.373-9.373 24.569 0 33.941l10.822 10.822c9.562 9.562 25.133 9.34 34.419-.491L96 169.881V392c0 13.255 10.745 24 24 24h243.549c21.382 0 32.09-25.851 16.971-40.971l-16.001-16z\"]\n};\nvar faRibbon = {\n prefix: 'fas',\n iconName: 'ribbon',\n icon: [448, 512, [], \"f4d6\", \"M6.1 444.3c-9.6 10.8-7.5 27.6 4.5 35.7l68.8 27.9c9.9 6.7 23.3 5 31.3-3.8l91.8-101.9-79.2-87.9-117.2 130zm435.8 0s-292-324.6-295.4-330.1c15.4-8.4 40.2-17.9 77.5-17.9s62.1 9.5 77.5 17.9c-3.3 5.6-56 64.6-56 64.6l79.1 87.7 34.2-38c28.7-31.9 33.3-78.6 11.4-115.5l-43.7-73.5c-4.3-7.2-9.9-13.3-16.8-18-40.7-27.6-127.4-29.7-171.4 0-6.9 4.7-12.5 10.8-16.8 18l-43.6 73.2c-1.5 2.5-37.1 62.2 11.5 116L337.5 504c8 8.9 21.4 10.5 31.3 3.8l68.8-27.9c11.9-8 14-24.8 4.3-35.6z\"]\n};\nvar faRing = {\n prefix: 'fas',\n iconName: 'ring',\n icon: [512, 512, [], \"f70b\", \"M256 64C110.06 64 0 125.91 0 208v98.13C0 384.48 114.62 448 256 448s256-63.52 256-141.87V208c0-82.09-110.06-144-256-144zm0 64c106.04 0 192 35.82 192 80 0 9.26-3.97 18.12-10.91 26.39C392.15 208.21 328.23 192 256 192s-136.15 16.21-181.09 42.39C67.97 226.12 64 217.26 64 208c0-44.18 85.96-80 192-80zM120.43 264.64C155.04 249.93 201.64 240 256 240s100.96 9.93 135.57 24.64C356.84 279.07 308.93 288 256 288s-100.84-8.93-135.57-23.36z\"]\n};\nvar faRoad = {\n prefix: 'fas',\n iconName: 'road',\n icon: [576, 512, [], \"f018\", \"M573.19 402.67l-139.79-320C428.43 71.29 417.6 64 405.68 64h-97.59l2.45 23.16c.5 4.72-3.21 8.84-7.96 8.84h-29.16c-4.75 0-8.46-4.12-7.96-8.84L267.91 64h-97.59c-11.93 0-22.76 7.29-27.73 18.67L2.8 402.67C-6.45 423.86 8.31 448 30.54 448h196.84l10.31-97.68c.86-8.14 7.72-14.32 15.91-14.32h68.8c8.19 0 15.05 6.18 15.91 14.32L348.62 448h196.84c22.23 0 36.99-24.14 27.73-45.33zM260.4 135.16a8 8 0 0 1 7.96-7.16h39.29c4.09 0 7.53 3.09 7.96 7.16l4.6 43.58c.75 7.09-4.81 13.26-11.93 13.26h-40.54c-7.13 0-12.68-6.17-11.93-13.26l4.59-43.58zM315.64 304h-55.29c-9.5 0-16.91-8.23-15.91-17.68l5.07-48c.86-8.14 7.72-14.32 15.91-14.32h45.15c8.19 0 15.05 6.18 15.91 14.32l5.07 48c1 9.45-6.41 17.68-15.91 17.68z\"]\n};\nvar faRobot = {\n prefix: 'fas',\n iconName: 'robot',\n icon: [640, 512, [], \"f544\", \"M0 256v128c0 17.7 14.3 32 32 32h32V224H32c-17.7 0-32 14.3-32 32zM464 96H352V32c0-17.7-14.3-32-32-32s-32 14.3-32 32v64H176c-44.2 0-80 35.8-80 80v272c0 35.3 28.7 64 64 64h320c35.3 0 64-28.7 64-64V176c0-44.2-35.8-80-80-80zM256 416h-64v-32h64v32zm-32-120c-22.1 0-40-17.9-40-40s17.9-40 40-40 40 17.9 40 40-17.9 40-40 40zm128 120h-64v-32h64v32zm96 0h-64v-32h64v32zm-32-120c-22.1 0-40-17.9-40-40s17.9-40 40-40 40 17.9 40 40-17.9 40-40 40zm192-72h-32v192h32c17.7 0 32-14.3 32-32V256c0-17.7-14.3-32-32-32z\"]\n};\nvar faRocket = {\n prefix: 'fas',\n iconName: 'rocket',\n icon: [512, 512, [], \"f135\", \"M505.05 19.1a15.89 15.89 0 0 0-12.2-12.2C460.65 0 435.46 0 410.36 0c-103.2 0-165.1 55.2-211.29 128H94.87A48 48 0 0 0 52 154.49l-49.42 98.8A24 24 0 0 0 24.07 288h103.77l-22.47 22.47a32 32 0 0 0 0 45.25l50.9 50.91a32 32 0 0 0 45.26 0L224 384.16V488a24 24 0 0 0 34.7 21.49l98.7-49.39a47.91 47.91 0 0 0 26.5-42.9V312.79c72.59-46.3 128-108.4 128-211.09.1-25.2.1-50.4-6.85-82.6zM384 168a40 40 0 1 1 40-40 40 40 0 0 1-40 40z\"]\n};\nvar faRoute = {\n prefix: 'fas',\n iconName: 'route',\n icon: [512, 512, [], \"f4d7\", \"M416 320h-96c-17.6 0-32-14.4-32-32s14.4-32 32-32h96s96-107 96-160-43-96-96-96-96 43-96 96c0 25.5 22.2 63.4 45.3 96H320c-52.9 0-96 43.1-96 96s43.1 96 96 96h96c17.6 0 32 14.4 32 32s-14.4 32-32 32H185.5c-16 24.8-33.8 47.7-47.3 64H416c52.9 0 96-43.1 96-96s-43.1-96-96-96zm0-256c17.7 0 32 14.3 32 32s-14.3 32-32 32-32-14.3-32-32 14.3-32 32-32zM96 256c-53 0-96 43-96 96s96 160 96 160 96-107 96-160-43-96-96-96zm0 128c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32z\"]\n};\nvar faRss = {\n prefix: 'fas',\n iconName: 'rss',\n icon: [448, 512, [], \"f09e\", \"M128.081 415.959c0 35.369-28.672 64.041-64.041 64.041S0 451.328 0 415.959s28.672-64.041 64.041-64.041 64.04 28.673 64.04 64.041zm175.66 47.25c-8.354-154.6-132.185-278.587-286.95-286.95C7.656 175.765 0 183.105 0 192.253v48.069c0 8.415 6.49 15.472 14.887 16.018 111.832 7.284 201.473 96.702 208.772 208.772.547 8.397 7.604 14.887 16.018 14.887h48.069c9.149.001 16.489-7.655 15.995-16.79zm144.249.288C439.596 229.677 251.465 40.445 16.503 32.01 7.473 31.686 0 38.981 0 48.016v48.068c0 8.625 6.835 15.645 15.453 15.999 191.179 7.839 344.627 161.316 352.465 352.465.353 8.618 7.373 15.453 15.999 15.453h48.068c9.034-.001 16.329-7.474 16.005-16.504z\"]\n};\nvar faRssSquare = {\n prefix: 'fas',\n iconName: 'rss-square',\n icon: [448, 512, [], \"f143\", \"M400 32H48C21.49 32 0 53.49 0 80v352c0 26.51 21.49 48 48 48h352c26.51 0 48-21.49 48-48V80c0-26.51-21.49-48-48-48zM112 416c-26.51 0-48-21.49-48-48s21.49-48 48-48 48 21.49 48 48-21.49 48-48 48zm157.533 0h-34.335c-6.011 0-11.051-4.636-11.442-10.634-5.214-80.05-69.243-143.92-149.123-149.123-5.997-.39-10.633-5.431-10.633-11.441v-34.335c0-6.535 5.468-11.777 11.994-11.425 110.546 5.974 198.997 94.536 204.964 204.964.352 6.526-4.89 11.994-11.425 11.994zm103.027 0h-34.334c-6.161 0-11.175-4.882-11.427-11.038-5.598-136.535-115.204-246.161-251.76-251.76C68.882 152.949 64 147.935 64 141.774V107.44c0-6.454 5.338-11.664 11.787-11.432 167.83 6.025 302.21 141.191 308.205 308.205.232 6.449-4.978 11.787-11.432 11.787z\"]\n};\nvar faRubleSign = {\n prefix: 'fas',\n iconName: 'ruble-sign',\n icon: [384, 512, [], \"f158\", \"M239.36 320C324.48 320 384 260.542 384 175.071S324.48 32 239.36 32H76c-6.627 0-12 5.373-12 12v206.632H12c-6.627 0-12 5.373-12 12V308c0 6.627 5.373 12 12 12h52v32H12c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h52v52c0 6.627 5.373 12 12 12h58.56c6.627 0 12-5.373 12-12v-52H308c6.627 0 12-5.373 12-12v-40c0-6.627-5.373-12-12-12H146.56v-32h92.8zm-92.8-219.252h78.72c46.72 0 74.88 29.11 74.88 74.323 0 45.832-28.16 75.561-76.16 75.561h-77.44V100.748z\"]\n};\nvar faRuler = {\n prefix: 'fas',\n iconName: 'ruler',\n icon: [640, 512, [], \"f545\", \"M635.7 167.2L556.1 31.7c-8.8-15-28.3-20.1-43.5-11.5l-69 39.1L503.3 161c2.2 3.8.9 8.5-2.9 10.7l-13.8 7.8c-3.8 2.2-8.7.9-10.9-2.9L416 75l-55.2 31.3 27.9 47.4c2.2 3.8.9 8.5-2.9 10.7l-13.8 7.8c-3.8 2.2-8.7.9-10.9-2.9L333.2 122 278 153.3 337.8 255c2.2 3.7.9 8.5-2.9 10.7l-13.8 7.8c-3.8 2.2-8.7.9-10.9-2.9l-59.7-101.7-55.2 31.3 27.9 47.4c2.2 3.8.9 8.5-2.9 10.7l-13.8 7.8c-3.8 2.2-8.7.9-10.9-2.9l-27.9-47.5-55.2 31.3 59.7 101.7c2.2 3.7.9 8.5-2.9 10.7l-13.8 7.8c-3.8 2.2-8.7.9-10.9-2.9L84.9 262.9l-69 39.1C.7 310.7-4.6 329.8 4.2 344.8l79.6 135.6c8.8 15 28.3 20.1 43.5 11.5L624.1 210c15.2-8.6 20.4-27.8 11.6-42.8z\"]\n};\nvar faRulerCombined = {\n prefix: 'fas',\n iconName: 'ruler-combined',\n icon: [512, 512, [], \"f546\", \"M160 288h-56c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h56v-64h-56c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h56V96h-56c-4.42 0-8-3.58-8-8V72c0-4.42 3.58-8 8-8h56V32c0-17.67-14.33-32-32-32H32C14.33 0 0 14.33 0 32v448c0 2.77.91 5.24 1.57 7.8L160 329.38V288zm320 64h-32v56c0 4.42-3.58 8-8 8h-16c-4.42 0-8-3.58-8-8v-56h-64v56c0 4.42-3.58 8-8 8h-16c-4.42 0-8-3.58-8-8v-56h-64v56c0 4.42-3.58 8-8 8h-16c-4.42 0-8-3.58-8-8v-56h-41.37L24.2 510.43c2.56.66 5.04 1.57 7.8 1.57h448c17.67 0 32-14.33 32-32v-96c0-17.67-14.33-32-32-32z\"]\n};\nvar faRulerHorizontal = {\n prefix: 'fas',\n iconName: 'ruler-horizontal',\n icon: [576, 512, [], \"f547\", \"M544 128h-48v88c0 4.42-3.58 8-8 8h-16c-4.42 0-8-3.58-8-8v-88h-64v88c0 4.42-3.58 8-8 8h-16c-4.42 0-8-3.58-8-8v-88h-64v88c0 4.42-3.58 8-8 8h-16c-4.42 0-8-3.58-8-8v-88h-64v88c0 4.42-3.58 8-8 8h-16c-4.42 0-8-3.58-8-8v-88h-64v88c0 4.42-3.58 8-8 8H88c-4.42 0-8-3.58-8-8v-88H32c-17.67 0-32 14.33-32 32v192c0 17.67 14.33 32 32 32h512c17.67 0 32-14.33 32-32V160c0-17.67-14.33-32-32-32z\"]\n};\nvar faRulerVertical = {\n prefix: 'fas',\n iconName: 'ruler-vertical',\n icon: [256, 512, [], \"f548\", \"M168 416c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h88v-64h-88c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h88v-64h-88c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h88v-64h-88c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h88V32c0-17.67-14.33-32-32-32H32C14.33 0 0 14.33 0 32v448c0 17.67 14.33 32 32 32h192c17.67 0 32-14.33 32-32v-64h-88z\"]\n};\nvar faRunning = {\n prefix: 'fas',\n iconName: 'running',\n icon: [416, 512, [], \"f70c\", \"M272 96c26.51 0 48-21.49 48-48S298.51 0 272 0s-48 21.49-48 48 21.49 48 48 48zM113.69 317.47l-14.8 34.52H32c-17.67 0-32 14.33-32 32s14.33 32 32 32h77.45c19.25 0 36.58-11.44 44.11-29.09l8.79-20.52-10.67-6.3c-17.32-10.23-30.06-25.37-37.99-42.61zM384 223.99h-44.03l-26.06-53.25c-12.5-25.55-35.45-44.23-61.78-50.94l-71.08-21.14c-28.3-6.8-57.77-.55-80.84 17.14l-39.67 30.41c-14.03 10.75-16.69 30.83-5.92 44.86s30.84 16.66 44.86 5.92l39.69-30.41c7.67-5.89 17.44-8 25.27-6.14l14.7 4.37-37.46 87.39c-12.62 29.48-1.31 64.01 26.3 80.31l84.98 50.17-27.47 87.73c-5.28 16.86 4.11 34.81 20.97 40.09 3.19 1 6.41 1.48 9.58 1.48 13.61 0 26.23-8.77 30.52-22.45l31.64-101.06c5.91-20.77-2.89-43.08-21.64-54.39l-61.24-36.14 31.31-78.28 20.27 41.43c8 16.34 24.92 26.89 43.11 26.89H384c17.67 0 32-14.33 32-32s-14.33-31.99-32-31.99z\"]\n};\nvar faRupeeSign = {\n prefix: 'fas',\n iconName: 'rupee-sign',\n icon: [320, 512, [], \"f156\", \"M308 96c6.627 0 12-5.373 12-12V44c0-6.627-5.373-12-12-12H12C5.373 32 0 37.373 0 44v44.748c0 6.627 5.373 12 12 12h85.28c27.308 0 48.261 9.958 60.97 27.252H12c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h158.757c-6.217 36.086-32.961 58.632-74.757 58.632H12c-6.627 0-12 5.373-12 12v53.012c0 3.349 1.4 6.546 3.861 8.818l165.052 152.356a12.001 12.001 0 0 0 8.139 3.182h82.562c10.924 0 16.166-13.408 8.139-20.818L116.871 319.906c76.499-2.34 131.144-53.395 138.318-127.906H308c6.627 0 12-5.373 12-12v-40c0-6.627-5.373-12-12-12h-58.69c-3.486-11.541-8.28-22.246-14.252-32H308z\"]\n};\nvar faSadCry = {\n prefix: 'fas',\n iconName: 'sad-cry',\n icon: [496, 512, [], \"f5b3\", \"M248 8C111 8 0 119 0 256c0 90.1 48.2 168.7 120 212.1V288c0-8.8 7.2-16 16-16s16 7.2 16 16v196.7c29.5 12.4 62 19.3 96 19.3s66.5-6.9 96-19.3V288c0-8.8 7.2-16 16-16s16 7.2 16 16v180.1C447.8 424.7 496 346 496 256 496 119 385 8 248 8zm-65.5 216.5c-14.8-13.2-46.2-13.2-61 0L112 233c-3.8 3.3-9.3 4-13.7 1.6-4.4-2.4-6.9-7.4-6.1-12.4 4-25.2 34.2-42.1 59.9-42.1S208 197 212 222.2c.8 5-1.7 10-6.1 12.4-5.8 3.1-11.2.7-13.7-1.6l-9.7-8.5zM248 416c-26.5 0-48-28.7-48-64s21.5-64 48-64 48 28.7 48 64-21.5 64-48 64zm149.8-181.5c-5.8 3.1-11.2.7-13.7-1.6l-9.5-8.5c-14.8-13.2-46.2-13.2-61 0L304 233c-3.8 3.3-9.3 4-13.7 1.6-4.4-2.4-6.9-7.4-6.1-12.4 4-25.2 34.2-42.1 59.9-42.1S400 197 404 222.2c.6 4.9-1.8 9.9-6.2 12.3z\"]\n};\nvar faSadTear = {\n prefix: 'fas',\n iconName: 'sad-tear',\n icon: [496, 512, [], \"f5b4\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm80 168c17.7 0 32 14.3 32 32s-14.3 32-32 32-32-14.3-32-32 14.3-32 32-32zM152 416c-26.5 0-48-21-48-47 0-20 28.5-60.4 41.6-77.8 3.2-4.3 9.6-4.3 12.8 0C171.5 308.6 200 349 200 369c0 26-21.5 47-48 47zm16-176c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32zm170.2 154.2C315.8 367.4 282.9 352 248 352c-21.2 0-21.2-32 0-32 44.4 0 86.3 19.6 114.7 53.8 13.8 16.4-11.2 36.5-24.5 20.4z\"]\n};\nvar faSatellite = {\n prefix: 'fas',\n iconName: 'satellite',\n icon: [512, 512, [], \"f7bf\", \"M502.7 265l-80.3-80.4 47.8-47.9c13.1-13.1 13.1-34.4 0-47.5l-47.5-47.5c-13.1-13.1-34.4-13.1-47.5 0l-47.8 47.9-80.3-80.3C240.8 3.1 232.7 0 224.5 0S208.2 3.1 202 9.3L105.3 106c-12.4 12.4-12.4 32.6 0 45.1l80.3 80.4-9.8 9.8C122.1 217 59.6 218.6 7.3 246.7c-8.5 4.6-9.6 16.4-2.8 23.2L112 377.4l-17.8 17.8c-2.6-.7-5-1.6-7.8-1.6-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32c0-2.8-.9-5.2-1.6-7.8l17.8-17.8 107.5 107.5c6.8 6.8 18.7 5.7 23.2-2.8 28.1-52.3 29.7-114.8 5.4-168.5l9.9-9.9 80.3 80.4c6.2 6.2 14.4 9.3 22.5 9.3s16.3-3.1 22.5-9.3l96.7-96.7c12.5-12.4 12.5-32.6.1-45zm-352-136.5l73.8-73.8 68.9 68.9-73.8 73.8-68.9-68.9zm232.8 232.8l-68.9-68.9 73.8-73.8 68.9 68.9-73.8 73.8z\"]\n};\nvar faSatelliteDish = {\n prefix: 'fas',\n iconName: 'satellite-dish',\n icon: [512, 512, [], \"f7c0\", \"M188.8 345.9l27.4-27.4c2.6.7 5 1.6 7.8 1.6 17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32c0 2.8.9 5.2 1.6 7.8l-27.4 27.4L49.4 206.5c-7.3-7.3-20.1-6.1-25 3-41.8 77.8-29.9 176.7 35.7 242.3 65.6 65.6 164.6 77.5 242.3 35.7 9.2-4.9 10.4-17.7 3-25L188.8 345.9zM209 0c-9.2-.5-17 6.8-17 16v31.6c0 8.5 6.6 15.5 15 15.9 129.4 7 233.4 112 240.9 241.5.5 8.4 7.5 15 15.9 15h32.1c9.2 0 16.5-7.8 16-17C503.4 139.8 372.2 8.6 209 0zm.3 96c-9.3-.7-17.3 6.7-17.3 16.1v32.1c0 8.4 6.5 15.3 14.8 15.9 76.8 6.3 138 68.2 144.9 145.2.8 8.3 7.6 14.7 15.9 14.7h32.2c9.3 0 16.8-8 16.1-17.3-8.4-110.1-96.5-198.2-206.6-206.7z\"]\n};\nvar faSave = {\n prefix: 'fas',\n iconName: 'save',\n icon: [448, 512, [], \"f0c7\", \"M433.941 129.941l-83.882-83.882A48 48 0 0 0 316.118 32H48C21.49 32 0 53.49 0 80v352c0 26.51 21.49 48 48 48h352c26.51 0 48-21.49 48-48V163.882a48 48 0 0 0-14.059-33.941zM224 416c-35.346 0-64-28.654-64-64 0-35.346 28.654-64 64-64s64 28.654 64 64c0 35.346-28.654 64-64 64zm96-304.52V212c0 6.627-5.373 12-12 12H76c-6.627 0-12-5.373-12-12V108c0-6.627 5.373-12 12-12h228.52c3.183 0 6.235 1.264 8.485 3.515l3.48 3.48A11.996 11.996 0 0 1 320 111.48z\"]\n};\nvar faSchool = {\n prefix: 'fas',\n iconName: 'school',\n icon: [640, 512, [], \"f549\", \"M0 224v272c0 8.84 7.16 16 16 16h80V192H32c-17.67 0-32 14.33-32 32zm360-48h-24v-40c0-4.42-3.58-8-8-8h-16c-4.42 0-8 3.58-8 8v64c0 4.42 3.58 8 8 8h48c4.42 0 8-3.58 8-8v-16c0-4.42-3.58-8-8-8zm137.75-63.96l-160-106.67a32.02 32.02 0 0 0-35.5 0l-160 106.67A32.002 32.002 0 0 0 128 138.66V512h128V368c0-8.84 7.16-16 16-16h96c8.84 0 16 7.16 16 16v144h128V138.67c0-10.7-5.35-20.7-14.25-26.63zM320 256c-44.18 0-80-35.82-80-80s35.82-80 80-80 80 35.82 80 80-35.82 80-80 80zm288-64h-64v320h80c8.84 0 16-7.16 16-16V224c0-17.67-14.33-32-32-32z\"]\n};\nvar faScrewdriver = {\n prefix: 'fas',\n iconName: 'screwdriver',\n icon: [512, 512, [], \"f54a\", \"M448 0L320 96v62.06l-83.03 83.03c6.79 4.25 13.27 9.06 19.07 14.87 5.8 5.8 10.62 12.28 14.87 19.07L353.94 192H416l96-128-64-64zM128 278.59L10.92 395.67c-14.55 14.55-14.55 38.15 0 52.71l52.7 52.7c14.56 14.56 38.15 14.56 52.71 0L233.41 384c29.11-29.11 29.11-76.3 0-105.41s-76.3-29.11-105.41 0z\"]\n};\nvar faScroll = {\n prefix: 'fas',\n iconName: 'scroll',\n icon: [640, 512, [], \"f70e\", \"M48 0C21.53 0 0 21.53 0 48v64c0 8.84 7.16 16 16 16h80V48C96 21.53 74.47 0 48 0zm208 412.57V352h288V96c0-52.94-43.06-96-96-96H111.59C121.74 13.41 128 29.92 128 48v368c0 38.87 34.65 69.65 74.75 63.12C234.22 474 256 444.46 256 412.57zM288 384v32c0 52.93-43.06 96-96 96h336c61.86 0 112-50.14 112-112 0-8.84-7.16-16-16-16H288z\"]\n};\nvar faSdCard = {\n prefix: 'fas',\n iconName: 'sd-card',\n icon: [384, 512, [], \"f7c2\", \"M320 0H128L0 128v320c0 35.3 28.7 64 64 64h256c35.3 0 64-28.7 64-64V64c0-35.3-28.7-64-64-64zM160 160h-48V64h48v96zm80 0h-48V64h48v96zm80 0h-48V64h48v96z\"]\n};\nvar faSearch = {\n prefix: 'fas',\n iconName: 'search',\n icon: [512, 512, [], \"f002\", \"M505 442.7L405.3 343c-4.5-4.5-10.6-7-17-7H372c27.6-35.3 44-79.7 44-128C416 93.1 322.9 0 208 0S0 93.1 0 208s93.1 208 208 208c48.3 0 92.7-16.4 128-44v16.3c0 6.4 2.5 12.5 7 17l99.7 99.7c9.4 9.4 24.6 9.4 33.9 0l28.3-28.3c9.4-9.4 9.4-24.6.1-34zM208 336c-70.7 0-128-57.2-128-128 0-70.7 57.2-128 128-128 70.7 0 128 57.2 128 128 0 70.7-57.2 128-128 128z\"]\n};\nvar faSearchDollar = {\n prefix: 'fas',\n iconName: 'search-dollar',\n icon: [512, 512, [], \"f688\", \"M505.04 442.66l-99.71-99.69c-4.5-4.5-10.6-7-17-7h-16.3c27.6-35.3 44-79.69 44-127.99C416.03 93.09 322.92 0 208.02 0S0 93.09 0 207.98s93.11 207.98 208.02 207.98c48.3 0 92.71-16.4 128.01-44v16.3c0 6.4 2.5 12.5 7 17l99.71 99.69c9.4 9.4 24.6 9.4 33.9 0l28.3-28.3c9.4-9.4 9.4-24.59.1-33.99zm-297.02-90.7c-79.54 0-144-64.34-144-143.98 0-79.53 64.35-143.98 144-143.98 79.54 0 144 64.34 144 143.98 0 79.53-64.35 143.98-144 143.98zm27.11-152.54l-45.01-13.5c-5.16-1.55-8.77-6.78-8.77-12.73 0-7.27 5.3-13.19 11.8-13.19h28.11c4.56 0 8.96 1.29 12.82 3.72 3.24 2.03 7.36 1.91 10.13-.73l11.75-11.21c3.53-3.37 3.33-9.21-.57-12.14-9.1-6.83-20.08-10.77-31.37-11.35V112c0-4.42-3.58-8-8-8h-16c-4.42 0-8 3.58-8 8v16.12c-23.63.63-42.68 20.55-42.68 45.07 0 19.97 12.99 37.81 31.58 43.39l45.01 13.5c5.16 1.55 8.77 6.78 8.77 12.73 0 7.27-5.3 13.19-11.8 13.19h-28.1c-4.56 0-8.96-1.29-12.82-3.72-3.24-2.03-7.36-1.91-10.13.73l-11.75 11.21c-3.53 3.37-3.33 9.21.57 12.14 9.1 6.83 20.08 10.77 31.37 11.35V304c0 4.42 3.58 8 8 8h16c4.42 0 8-3.58 8-8v-16.12c23.63-.63 42.68-20.54 42.68-45.07 0-19.97-12.99-37.81-31.59-43.39z\"]\n};\nvar faSearchLocation = {\n prefix: 'fas',\n iconName: 'search-location',\n icon: [512, 512, [], \"f689\", \"M505.04 442.66l-99.71-99.69c-4.5-4.5-10.6-7-17-7h-16.3c27.6-35.3 44-79.69 44-127.99C416.03 93.09 322.92 0 208.02 0S0 93.09 0 207.98s93.11 207.98 208.02 207.98c48.3 0 92.71-16.4 128.01-44v16.3c0 6.4 2.5 12.5 7 17l99.71 99.69c9.4 9.4 24.6 9.4 33.9 0l28.3-28.3c9.4-9.4 9.4-24.59.1-33.99zm-297.02-90.7c-79.54 0-144-64.34-144-143.98 0-79.53 64.35-143.98 144-143.98 79.54 0 144 64.34 144 143.98 0 79.53-64.35 143.98-144 143.98zm.02-239.96c-40.78 0-73.84 33.05-73.84 73.83 0 32.96 48.26 93.05 66.75 114.86a9.24 9.24 0 0 0 14.18 0c18.49-21.81 66.75-81.89 66.75-114.86 0-40.78-33.06-73.83-73.84-73.83zm0 96c-13.26 0-24-10.75-24-24 0-13.26 10.75-24 24-24s24 10.74 24 24c0 13.25-10.75 24-24 24z\"]\n};\nvar faSearchMinus = {\n prefix: 'fas',\n iconName: 'search-minus',\n icon: [512, 512, [], \"f010\", \"M304 192v32c0 6.6-5.4 12-12 12H124c-6.6 0-12-5.4-12-12v-32c0-6.6 5.4-12 12-12h168c6.6 0 12 5.4 12 12zm201 284.7L476.7 505c-9.4 9.4-24.6 9.4-33.9 0L343 405.3c-4.5-4.5-7-10.6-7-17V372c-35.3 27.6-79.7 44-128 44C93.1 416 0 322.9 0 208S93.1 0 208 0s208 93.1 208 208c0 48.3-16.4 92.7-44 128h16.3c6.4 0 12.5 2.5 17 7l99.7 99.7c9.3 9.4 9.3 24.6 0 34zM344 208c0-75.2-60.8-136-136-136S72 132.8 72 208s60.8 136 136 136 136-60.8 136-136z\"]\n};\nvar faSearchPlus = {\n prefix: 'fas',\n iconName: 'search-plus',\n icon: [512, 512, [], \"f00e\", \"M304 192v32c0 6.6-5.4 12-12 12h-56v56c0 6.6-5.4 12-12 12h-32c-6.6 0-12-5.4-12-12v-56h-56c-6.6 0-12-5.4-12-12v-32c0-6.6 5.4-12 12-12h56v-56c0-6.6 5.4-12 12-12h32c6.6 0 12 5.4 12 12v56h56c6.6 0 12 5.4 12 12zm201 284.7L476.7 505c-9.4 9.4-24.6 9.4-33.9 0L343 405.3c-4.5-4.5-7-10.6-7-17V372c-35.3 27.6-79.7 44-128 44C93.1 416 0 322.9 0 208S93.1 0 208 0s208 93.1 208 208c0 48.3-16.4 92.7-44 128h16.3c6.4 0 12.5 2.5 17 7l99.7 99.7c9.3 9.4 9.3 24.6 0 34zM344 208c0-75.2-60.8-136-136-136S72 132.8 72 208s60.8 136 136 136 136-60.8 136-136z\"]\n};\nvar faSeedling = {\n prefix: 'fas',\n iconName: 'seedling',\n icon: [512, 512, [], \"f4d8\", \"M64 96H0c0 123.7 100.3 224 224 224v144c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16V320C288 196.3 187.7 96 64 96zm384-64c-84.2 0-157.4 46.5-195.7 115.2 27.7 30.2 48.2 66.9 59 107.6C424 243.1 512 147.9 512 32h-64z\"]\n};\nvar faServer = {\n prefix: 'fas',\n iconName: 'server',\n icon: [512, 512, [], \"f233\", \"M480 160H32c-17.673 0-32-14.327-32-32V64c0-17.673 14.327-32 32-32h448c17.673 0 32 14.327 32 32v64c0 17.673-14.327 32-32 32zm-48-88c-13.255 0-24 10.745-24 24s10.745 24 24 24 24-10.745 24-24-10.745-24-24-24zm-64 0c-13.255 0-24 10.745-24 24s10.745 24 24 24 24-10.745 24-24-10.745-24-24-24zm112 248H32c-17.673 0-32-14.327-32-32v-64c0-17.673 14.327-32 32-32h448c17.673 0 32 14.327 32 32v64c0 17.673-14.327 32-32 32zm-48-88c-13.255 0-24 10.745-24 24s10.745 24 24 24 24-10.745 24-24-10.745-24-24-24zm-64 0c-13.255 0-24 10.745-24 24s10.745 24 24 24 24-10.745 24-24-10.745-24-24-24zm112 248H32c-17.673 0-32-14.327-32-32v-64c0-17.673 14.327-32 32-32h448c17.673 0 32 14.327 32 32v64c0 17.673-14.327 32-32 32zm-48-88c-13.255 0-24 10.745-24 24s10.745 24 24 24 24-10.745 24-24-10.745-24-24-24zm-64 0c-13.255 0-24 10.745-24 24s10.745 24 24 24 24-10.745 24-24-10.745-24-24-24z\"]\n};\nvar faShapes = {\n prefix: 'fas',\n iconName: 'shapes',\n icon: [512, 512, [], \"f61f\", \"M512 320v160c0 17.67-14.33 32-32 32H320c-17.67 0-32-14.33-32-32V320c0-17.67 14.33-32 32-32h160c17.67 0 32 14.33 32 32zm-384-64C57.31 256 0 313.31 0 384s57.31 128 128 128 128-57.31 128-128-57.31-128-128-128zm351.03-32c25.34 0 41.18-26.67 28.51-48L412.51 16c-12.67-21.33-44.35-21.33-57.02 0l-95.03 160c-12.67 21.33 3.17 48 28.51 48h190.06z\"]\n};\nvar faShare = {\n prefix: 'fas',\n iconName: 'share',\n icon: [512, 512, [], \"f064\", \"M503.691 189.836L327.687 37.851C312.281 24.546 288 35.347 288 56.015v80.053C127.371 137.907 0 170.1 0 322.326c0 61.441 39.581 122.309 83.333 154.132 13.653 9.931 33.111-2.533 28.077-18.631C66.066 312.814 132.917 274.316 288 272.085V360c0 20.7 24.3 31.453 39.687 18.164l176.004-152c11.071-9.562 11.086-26.753 0-36.328z\"]\n};\nvar faShareAlt = {\n prefix: 'fas',\n iconName: 'share-alt',\n icon: [448, 512, [], \"f1e0\", \"M352 320c-22.608 0-43.387 7.819-59.79 20.895l-102.486-64.054a96.551 96.551 0 0 0 0-41.683l102.486-64.054C308.613 184.181 329.392 192 352 192c53.019 0 96-42.981 96-96S405.019 0 352 0s-96 42.981-96 96c0 7.158.79 14.13 2.276 20.841L155.79 180.895C139.387 167.819 118.608 160 96 160c-53.019 0-96 42.981-96 96s42.981 96 96 96c22.608 0 43.387-7.819 59.79-20.895l102.486 64.054A96.301 96.301 0 0 0 256 416c0 53.019 42.981 96 96 96s96-42.981 96-96-42.981-96-96-96z\"]\n};\nvar faShareAltSquare = {\n prefix: 'fas',\n iconName: 'share-alt-square',\n icon: [448, 512, [], \"f1e1\", \"M448 80v352c0 26.51-21.49 48-48 48H48c-26.51 0-48-21.49-48-48V80c0-26.51 21.49-48 48-48h352c26.51 0 48 21.49 48 48zM304 296c-14.562 0-27.823 5.561-37.783 14.671l-67.958-40.775a56.339 56.339 0 0 0 0-27.793l67.958-40.775C276.177 210.439 289.438 216 304 216c30.928 0 56-25.072 56-56s-25.072-56-56-56-56 25.072-56 56c0 4.797.605 9.453 1.74 13.897l-67.958 40.775C171.823 205.561 158.562 200 144 200c-30.928 0-56 25.072-56 56s25.072 56 56 56c14.562 0 27.823-5.561 37.783-14.671l67.958 40.775a56.088 56.088 0 0 0-1.74 13.897c0 30.928 25.072 56 56 56s56-25.072 56-56C360 321.072 334.928 296 304 296z\"]\n};\nvar faShareSquare = {\n prefix: 'fas',\n iconName: 'share-square',\n icon: [576, 512, [], \"f14d\", \"M568.482 177.448L424.479 313.433C409.3 327.768 384 317.14 384 295.985v-71.963c-144.575.97-205.566 35.113-164.775 171.353 4.483 14.973-12.846 26.567-25.006 17.33C155.252 383.105 120 326.488 120 269.339c0-143.937 117.599-172.5 264-173.312V24.012c0-21.174 25.317-31.768 40.479-17.448l144.003 135.988c10.02 9.463 10.028 25.425 0 34.896zM384 379.128V448H64V128h50.916a11.99 11.99 0 0 0 8.648-3.693c14.953-15.568 32.237-27.89 51.014-37.676C185.708 80.83 181.584 64 169.033 64H48C21.49 64 0 85.49 0 112v352c0 26.51 21.49 48 48 48h352c26.51 0 48-21.49 48-48v-88.806c0-8.288-8.197-14.066-16.011-11.302a71.83 71.83 0 0 1-34.189 3.377c-7.27-1.046-13.8 4.514-13.8 11.859z\"]\n};\nvar faShekelSign = {\n prefix: 'fas',\n iconName: 'shekel-sign',\n icon: [448, 512, [], \"f20b\", \"M248 168v168c0 8.84 7.16 16 16 16h48c8.84 0 16-7.16 16-16V168c0-75.11-60.89-136-136-136H24C10.75 32 0 42.74 0 56v408c0 8.84 7.16 16 16 16h48c8.84 0 16-7.16 16-16V112h112c30.93 0 56 25.07 56 56zM432 32h-48c-8.84 0-16 7.16-16 16v296c0 30.93-25.07 56-56 56H200V176c0-8.84-7.16-16-16-16h-48c-8.84 0-16 7.16-16 16v280c0 13.25 10.75 24 24 24h168c75.11 0 136-60.89 136-136V48c0-8.84-7.16-16-16-16z\"]\n};\nvar faShieldAlt = {\n prefix: 'fas',\n iconName: 'shield-alt',\n icon: [512, 512, [], \"f3ed\", \"M466.5 83.7l-192-80a48.15 48.15 0 0 0-36.9 0l-192 80C27.7 91.1 16 108.6 16 128c0 198.5 114.5 335.7 221.5 380.3 11.8 4.9 25.1 4.9 36.9 0C360.1 472.6 496 349.3 496 128c0-19.4-11.7-36.9-29.5-44.3zM256.1 446.3l-.1-381 175.9 73.3c-3.3 151.4-82.1 261.1-175.8 307.7z\"]\n};\nvar faShip = {\n prefix: 'fas',\n iconName: 'ship',\n icon: [640, 512, [], \"f21a\", \"M496.616 372.639l70.012-70.012c16.899-16.9 9.942-45.771-12.836-53.092L512 236.102V96c0-17.673-14.327-32-32-32h-64V24c0-13.255-10.745-24-24-24H248c-13.255 0-24 10.745-24 24v40h-64c-17.673 0-32 14.327-32 32v140.102l-41.792 13.433c-22.753 7.313-29.754 36.173-12.836 53.092l70.012 70.012C125.828 416.287 85.587 448 24 448c-13.255 0-24 10.745-24 24v16c0 13.255 10.745 24 24 24 61.023 0 107.499-20.61 143.258-59.396C181.677 487.432 216.021 512 256 512h128c39.979 0 74.323-24.568 88.742-59.396C508.495 491.384 554.968 512 616 512c13.255 0 24-10.745 24-24v-16c0-13.255-10.745-24-24-24-60.817 0-101.542-31.001-119.384-75.361zM192 128h256v87.531l-118.208-37.995a31.995 31.995 0 0 0-19.584 0L192 215.531V128z\"]\n};\nvar faShippingFast = {\n prefix: 'fas',\n iconName: 'shipping-fast',\n icon: [640, 512, [], \"f48b\", \"M624 352h-16V243.9c0-12.7-5.1-24.9-14.1-33.9L494 110.1c-9-9-21.2-14.1-33.9-14.1H416V48c0-26.5-21.5-48-48-48H112C85.5 0 64 21.5 64 48v48H8c-4.4 0-8 3.6-8 8v16c0 4.4 3.6 8 8 8h272c4.4 0 8 3.6 8 8v16c0 4.4-3.6 8-8 8H40c-4.4 0-8 3.6-8 8v16c0 4.4 3.6 8 8 8h208c4.4 0 8 3.6 8 8v16c0 4.4-3.6 8-8 8H8c-4.4 0-8 3.6-8 8v16c0 4.4 3.6 8 8 8h208c4.4 0 8 3.6 8 8v16c0 4.4-3.6 8-8 8H64v128c0 53 43 96 96 96s96-43 96-96h128c0 53 43 96 96 96s96-43 96-96h48c8.8 0 16-7.2 16-16v-32c0-8.8-7.2-16-16-16zM160 464c-26.5 0-48-21.5-48-48s21.5-48 48-48 48 21.5 48 48-21.5 48-48 48zm320 0c-26.5 0-48-21.5-48-48s21.5-48 48-48 48 21.5 48 48-21.5 48-48 48zm80-208H416V144h44.1l99.9 99.9V256z\"]\n};\nvar faShoePrints = {\n prefix: 'fas',\n iconName: 'shoe-prints',\n icon: [640, 512, [], \"f54b\", \"M192 160h32V32h-32c-35.35 0-64 28.65-64 64s28.65 64 64 64zM0 416c0 35.35 28.65 64 64 64h32V352H64c-35.35 0-64 28.65-64 64zm337.46-128c-34.91 0-76.16 13.12-104.73 32-24.79 16.38-44.52 32-104.73 32v128l57.53 15.97c26.21 7.28 53.01 13.12 80.31 15.05 32.69 2.31 65.6.67 97.58-6.2C472.9 481.3 512 429.22 512 384c0-64-84.18-96-174.54-96zM491.42 7.19C459.44.32 426.53-1.33 393.84.99c-27.3 1.93-54.1 7.77-80.31 15.04L256 32v128c60.2 0 79.94 15.62 104.73 32 28.57 18.88 69.82 32 104.73 32C555.82 224 640 192 640 128c0-45.22-39.1-97.3-148.58-120.81z\"]\n};\nvar faShoppingBag = {\n prefix: 'fas',\n iconName: 'shopping-bag',\n icon: [448, 512, [], \"f290\", \"M352 160v-32C352 57.42 294.579 0 224 0 153.42 0 96 57.42 96 128v32H0v272c0 44.183 35.817 80 80 80h288c44.183 0 80-35.817 80-80V160h-96zm-192-32c0-35.29 28.71-64 64-64s64 28.71 64 64v32H160v-32zm160 120c-13.255 0-24-10.745-24-24s10.745-24 24-24 24 10.745 24 24-10.745 24-24 24zm-192 0c-13.255 0-24-10.745-24-24s10.745-24 24-24 24 10.745 24 24-10.745 24-24 24z\"]\n};\nvar faShoppingBasket = {\n prefix: 'fas',\n iconName: 'shopping-basket',\n icon: [576, 512, [], \"f291\", \"M576 216v16c0 13.255-10.745 24-24 24h-8l-26.113 182.788C514.509 462.435 494.257 480 470.37 480H105.63c-23.887 0-44.139-17.565-47.518-41.212L32 256h-8c-13.255 0-24-10.745-24-24v-16c0-13.255 10.745-24 24-24h67.341l106.78-146.821c10.395-14.292 30.407-17.453 44.701-7.058 14.293 10.395 17.453 30.408 7.058 44.701L170.477 192h235.046L326.12 82.821c-10.395-14.292-7.234-34.306 7.059-44.701 14.291-10.395 34.306-7.235 44.701 7.058L484.659 192H552c13.255 0 24 10.745 24 24zM312 392V280c0-13.255-10.745-24-24-24s-24 10.745-24 24v112c0 13.255 10.745 24 24 24s24-10.745 24-24zm112 0V280c0-13.255-10.745-24-24-24s-24 10.745-24 24v112c0 13.255 10.745 24 24 24s24-10.745 24-24zm-224 0V280c0-13.255-10.745-24-24-24s-24 10.745-24 24v112c0 13.255 10.745 24 24 24s24-10.745 24-24z\"]\n};\nvar faShoppingCart = {\n prefix: 'fas',\n iconName: 'shopping-cart',\n icon: [576, 512, [], \"f07a\", \"M528.12 301.319l47.273-208C578.806 78.301 567.391 64 551.99 64H159.208l-9.166-44.81C147.758 8.021 137.93 0 126.529 0H24C10.745 0 0 10.745 0 24v16c0 13.255 10.745 24 24 24h69.883l70.248 343.435C147.325 417.1 136 435.222 136 456c0 30.928 25.072 56 56 56s56-25.072 56-56c0-15.674-6.447-29.835-16.824-40h209.647C430.447 426.165 424 440.326 424 456c0 30.928 25.072 56 56 56s56-25.072 56-56c0-22.172-12.888-41.332-31.579-50.405l5.517-24.276c3.413-15.018-8.002-29.319-23.403-29.319H218.117l-6.545-32h293.145c11.206 0 20.92-7.754 23.403-18.681z\"]\n};\nvar faShower = {\n prefix: 'fas',\n iconName: 'shower',\n icon: [512, 512, [], \"f2cc\", \"M389.66 135.6L231.6 293.66c-9.37 9.37-24.57 9.37-33.94 0l-11.32-11.32c-9.37-9.37-9.37-24.57 0-33.94l.11-.11c-34.03-40.21-35.16-98.94-3.39-140.38-11.97-7.55-26.14-11.91-41.3-11.91C98.88 96 64 130.88 64 173.76V480H0V173.76C0 95.59 63.59 32 141.76 32c36.93 0 70.61 14.2 95.86 37.42 35.9-11.51 76.5-4.5 106.67 21.03l.11-.11c9.37-9.37 24.57-9.37 33.94 0l11.32 11.32c9.37 9.37 9.37 24.57 0 33.94zM384 208c0 8.837-7.163 16-16 16s-16-7.163-16-16 7.163-16 16-16 16 7.163 16 16zm32 0c0-8.837 7.163-16 16-16s16 7.163 16 16-7.163 16-16 16-16-7.163-16-16zm96 0c0 8.837-7.163 16-16 16s-16-7.163-16-16 7.163-16 16-16 16 7.163 16 16zm-160 32c0 8.837-7.163 16-16 16s-16-7.163-16-16 7.163-16 16-16 16 7.163 16 16zm48-16c8.837 0 16 7.163 16 16s-7.163 16-16 16-16-7.163-16-16 7.163-16 16-16zm80 16c0 8.837-7.163 16-16 16s-16-7.163-16-16 7.163-16 16-16 16 7.163 16 16zm-160 32c0 8.837-7.163 16-16 16s-16-7.163-16-16 7.163-16 16-16 16 7.163 16 16zm32 0c0-8.837 7.163-16 16-16s16 7.163 16 16-7.163 16-16 16-16-7.163-16-16zm96 0c0 8.837-7.163 16-16 16s-16-7.163-16-16 7.163-16 16-16 16 7.163 16 16zm-128 32c0-8.837 7.163-16 16-16s16 7.163 16 16-7.163 16-16 16-16-7.163-16-16zm96 0c0 8.837-7.163 16-16 16s-16-7.163-16-16 7.163-16 16-16 16 7.163 16 16zm-96 32c0 8.837-7.163 16-16 16s-16-7.163-16-16 7.163-16 16-16 16 7.163 16 16zm64 0c0 8.837-7.163 16-16 16s-16-7.163-16-16 7.163-16 16-16 16 7.163 16 16zm-32 32c0 8.837-7.163 16-16 16s-16-7.163-16-16 7.163-16 16-16 16 7.163 16 16zm-32 32c0 8.837-7.163 16-16 16s-16-7.163-16-16 7.163-16 16-16 16 7.163 16 16z\"]\n};\nvar faShuttleVan = {\n prefix: 'fas',\n iconName: 'shuttle-van',\n icon: [640, 512, [], \"f5b6\", \"M628.88 210.65L494.39 49.27A48.01 48.01 0 0 0 457.52 32H32C14.33 32 0 46.33 0 64v288c0 17.67 14.33 32 32 32h32c0 53.02 42.98 96 96 96s96-42.98 96-96h128c0 53.02 42.98 96 96 96s96-42.98 96-96h32c17.67 0 32-14.33 32-32V241.38c0-11.23-3.94-22.1-11.12-30.73zM64 192V96h96v96H64zm96 240c-26.51 0-48-21.49-48-48s21.49-48 48-48 48 21.49 48 48-21.49 48-48 48zm160-240h-96V96h96v96zm160 240c-26.51 0-48-21.49-48-48s21.49-48 48-48 48 21.49 48 48-21.49 48-48 48zm-96-240V96h66.02l80 96H384z\"]\n};\nvar faSign = {\n prefix: 'fas',\n iconName: 'sign',\n icon: [512, 512, [], \"f4d9\", \"M496 64H128V16c0-8.8-7.2-16-16-16H80c-8.8 0-16 7.2-16 16v48H16C7.2 64 0 71.2 0 80v32c0 8.8 7.2 16 16 16h48v368c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16V128h368c8.8 0 16-7.2 16-16V80c0-8.8-7.2-16-16-16zM160 384h320V160H160v224z\"]\n};\nvar faSignInAlt = {\n prefix: 'fas',\n iconName: 'sign-in-alt',\n icon: [512, 512, [], \"f2f6\", \"M416 448h-84c-6.6 0-12-5.4-12-12v-40c0-6.6 5.4-12 12-12h84c17.7 0 32-14.3 32-32V160c0-17.7-14.3-32-32-32h-84c-6.6 0-12-5.4-12-12V76c0-6.6 5.4-12 12-12h84c53 0 96 43 96 96v192c0 53-43 96-96 96zm-47-201L201 79c-15-15-41-4.5-41 17v96H24c-13.3 0-24 10.7-24 24v96c0 13.3 10.7 24 24 24h136v96c0 21.5 26 32 41 17l168-168c9.3-9.4 9.3-24.6 0-34z\"]\n};\nvar faSignLanguage = {\n prefix: 'fas',\n iconName: 'sign-language',\n icon: [448, 512, [], \"f2a7\", \"M91.434 483.987c-.307-16.018 13.109-29.129 29.13-29.129h62.293v-5.714H56.993c-16.021 0-29.437-13.111-29.13-29.129C28.16 404.491 40.835 392 56.428 392h126.429v-5.714H29.136c-16.021 0-29.437-13.111-29.13-29.129.297-15.522 12.973-28.013 28.566-28.013h154.286v-5.714H57.707c-16.021 0-29.437-13.111-29.13-29.129.297-15.522 12.973-28.013 28.566-28.013h168.566l-31.085-22.606c-12.762-9.281-15.583-27.149-6.302-39.912 9.281-12.761 27.15-15.582 39.912-6.302l123.361 89.715a34.287 34.287 0 0 1 14.12 27.728v141.136c0 15.91-10.946 29.73-26.433 33.374l-80.471 18.934a137.16 137.16 0 0 1-31.411 3.646H120c-15.593-.001-28.269-12.492-28.566-28.014zm73.249-225.701h36.423l-11.187-8.136c-18.579-13.511-20.313-40.887-3.17-56.536l-13.004-16.7c-9.843-12.641-28.43-15.171-40.88-5.088-12.065 9.771-14.133 27.447-4.553 39.75l36.371 46.71zm283.298-2.103l-5.003-152.452c-.518-15.771-13.722-28.136-29.493-27.619-15.773.518-28.137 13.722-27.619 29.493l1.262 38.415L283.565 11.019c-9.58-12.303-27.223-14.63-39.653-5.328-12.827 9.599-14.929 28.24-5.086 40.881l76.889 98.745-4.509 3.511-94.79-121.734c-9.58-12.303-27.223-14.63-39.653-5.328-12.827 9.599-14.929 28.24-5.086 40.881l94.443 121.288-4.509 3.511-77.675-99.754c-9.58-12.303-27.223-14.63-39.653-5.328-12.827 9.599-14.929 28.24-5.086 40.881l52.053 66.849c12.497-8.257 29.055-8.285 41.69.904l123.36 89.714c10.904 7.93 17.415 20.715 17.415 34.198v16.999l61.064-47.549a34.285 34.285 0 0 0 13.202-28.177z\"]\n};\nvar faSignOutAlt = {\n prefix: 'fas',\n iconName: 'sign-out-alt',\n icon: [512, 512, [], \"f2f5\", \"M497 273L329 441c-15 15-41 4.5-41-17v-96H152c-13.3 0-24-10.7-24-24v-96c0-13.3 10.7-24 24-24h136V88c0-21.4 25.9-32 41-17l168 168c9.3 9.4 9.3 24.6 0 34zM192 436v-40c0-6.6-5.4-12-12-12H96c-17.7 0-32-14.3-32-32V160c0-17.7 14.3-32 32-32h84c6.6 0 12-5.4 12-12V76c0-6.6-5.4-12-12-12H96c-53 0-96 43-96 96v192c0 53 43 96 96 96h84c6.6 0 12-5.4 12-12z\"]\n};\nvar faSignal = {\n prefix: 'fas',\n iconName: 'signal',\n icon: [640, 512, [], \"f012\", \"M216 288h-48c-8.84 0-16 7.16-16 16v192c0 8.84 7.16 16 16 16h48c8.84 0 16-7.16 16-16V304c0-8.84-7.16-16-16-16zM88 384H40c-8.84 0-16 7.16-16 16v96c0 8.84 7.16 16 16 16h48c8.84 0 16-7.16 16-16v-96c0-8.84-7.16-16-16-16zm256-192h-48c-8.84 0-16 7.16-16 16v288c0 8.84 7.16 16 16 16h48c8.84 0 16-7.16 16-16V208c0-8.84-7.16-16-16-16zm128-96h-48c-8.84 0-16 7.16-16 16v384c0 8.84 7.16 16 16 16h48c8.84 0 16-7.16 16-16V112c0-8.84-7.16-16-16-16zM600 0h-48c-8.84 0-16 7.16-16 16v480c0 8.84 7.16 16 16 16h48c8.84 0 16-7.16 16-16V16c0-8.84-7.16-16-16-16z\"]\n};\nvar faSignature = {\n prefix: 'fas',\n iconName: 'signature',\n icon: [640, 512, [], \"f5b7\", \"M623.2 192c-51.8 3.5-125.7 54.7-163.1 71.5-29.1 13.1-54.2 24.4-76.1 24.4-22.6 0-26-16.2-21.3-51.9 1.1-8 11.7-79.2-42.7-76.1-25.1 1.5-64.3 24.8-169.5 126L192 182.2c30.4-75.9-53.2-151.5-129.7-102.8L7.4 116.3C0 121-2.2 130.9 2.5 138.4l17.2 27c4.7 7.5 14.6 9.7 22.1 4.9l58-38.9c18.4-11.7 40.7 7.2 32.7 27.1L34.3 404.1C27.5 421 37 448 64 448c8.3 0 16.5-3.2 22.6-9.4 42.2-42.2 154.7-150.7 211.2-195.8-2.2 28.5-2.1 58.9 20.6 83.8 15.3 16.8 37.3 25.3 65.5 25.3 35.6 0 68-14.6 102.3-30 33-14.8 99-62.6 138.4-65.8 8.5-.7 15.2-7.3 15.2-15.8v-32.1c.2-9.1-7.5-16.8-16.6-16.2z\"]\n};\nvar faSimCard = {\n prefix: 'fas',\n iconName: 'sim-card',\n icon: [384, 512, [], \"f7c4\", \"M320 0H128L0 128v320c0 35.3 28.7 64 64 64h256c35.3 0 64-28.7 64-64V64c0-35.3-28.7-64-64-64zM160 192h64v64h-64v-64zm-96 32c0-17.7 14.3-32 32-32h32v64H64v-32zm64 224H96c-17.7 0-32-14.3-32-32v-32h64v64zm96 0h-64v-64h64v64zm96-32c0 17.7-14.3 32-32 32h-32v-64h64v32zm0-64H64v-64h256v64zm0-96h-64v-64h32c17.7 0 32 14.3 32 32v32z\"]\n};\nvar faSitemap = {\n prefix: 'fas',\n iconName: 'sitemap',\n icon: [640, 512, [], \"f0e8\", \"M128 352H32c-17.67 0-32 14.33-32 32v96c0 17.67 14.33 32 32 32h96c17.67 0 32-14.33 32-32v-96c0-17.67-14.33-32-32-32zm-24-80h192v48h48v-48h192v48h48v-57.59c0-21.17-17.23-38.41-38.41-38.41H344v-64h40c17.67 0 32-14.33 32-32V32c0-17.67-14.33-32-32-32H256c-17.67 0-32 14.33-32 32v96c0 17.67 14.33 32 32 32h40v64H94.41C73.23 224 56 241.23 56 262.41V320h48v-48zm264 80h-96c-17.67 0-32 14.33-32 32v96c0 17.67 14.33 32 32 32h96c17.67 0 32-14.33 32-32v-96c0-17.67-14.33-32-32-32zm240 0h-96c-17.67 0-32 14.33-32 32v96c0 17.67 14.33 32 32 32h96c17.67 0 32-14.33 32-32v-96c0-17.67-14.33-32-32-32z\"]\n};\nvar faSkating = {\n prefix: 'fas',\n iconName: 'skating',\n icon: [448, 512, [], \"f7c5\", \"M400 0c-26.5 0-48 21.5-48 48s21.5 48 48 48 48-21.5 48-48-21.5-48-48-48zm0 448c-8.8 0-16 7.2-16 16s-7.2 16-16 16h-96c-8.8 0-16 7.2-16 16s7.2 16 16 16h96c26.5 0 48-21.5 48-48 0-8.8-7.2-16-16-16zm-282.2 8.6c-6.2 6.2-16.4 6.3-22.6 0l-67.9-67.9c-6.2-6.2-16.4-6.2-22.6 0s-6.2 16.4 0 22.6l67.9 67.9c9.4 9.4 21.7 14 34 14s24.6-4.7 33.9-14c6.2-6.2 6.2-16.4 0-22.6s-16.4-6.3-22.7 0zm56.1-179.8l-93.7 93.7c-12.5 12.5-12.5 32.8 0 45.2 6.2 6.2 14.4 9.4 22.6 9.4s16.4-3.1 22.6-9.4l91.9-91.9-30.2-30.2c-5-5-9.4-10.7-13.2-16.8zM128 160h105.5l-20.1 17.2c-13.5 11.5-21.6 28.4-22.3 46.1-.7 17.8 6.1 35.2 18.7 47.7l78.2 78.2V432c0 17.7 14.3 32 32 32s32-14.3 32-32v-89.4c0-12.6-5.1-25-14.1-33.9l-61-61c.5-.4 1.2-.6 1.7-1.1l82.3-82.3c11.5-11.5 14.9-28.6 8.7-43.6-6.2-15-20.7-24.7-37-24.7H128c-17.7 0-32 14.3-32 32s14.3 32 32 32z\"]\n};\nvar faSkiing = {\n prefix: 'fas',\n iconName: 'skiing',\n icon: [512, 512, [], \"f7c9\", \"M432 96c26.5 0 48-21.5 48-48S458.5 0 432 0s-48 21.5-48 48 21.5 48 48 48zm73 356.1c-9.4-9.4-24.6-9.4-33.9 0-12.1 12.1-30.5 15.4-45.1 8.7l-135.8-70.2 49.2-73.8c12.7-19 10.2-44.5-6-60.6L293 215.7l-107-53.1c-2.9 19.9 3.4 40 17.7 54.4l75.1 75.2-45.9 68.8L35 258.7c-11.7-6-26.2-1.5-32.3 10.3-6.1 11.8-1.5 26.3 10.3 32.3l391.9 202.5c11.9 5.5 24.5 8.1 37.1 8.1 23.2 0 46-9 63-26 9.3-9.3 9.3-24.5 0-33.8zM120 91.6l-11.5 22.5c14.4 7.3 31.2 4.9 42.8-4.8l47.2 23.4c-.1.1-.1.2-.2.3l114.5 56.8 32.4-13 6.4 19.1c4 12.1 12.6 22 24 27.7l58.1 29c15.9 7.9 35 1.5 42.9-14.3 7.9-15.8 1.5-35-14.3-42.9l-52.1-26.1-17.1-51.2c-8.1-24.2-40.9-56.6-84.5-39.2l-81.2 32.5-62.5-31c.3-14.5-7.2-28.6-20.9-35.6l-11.1 21.7h-.2l-34.4-7c-1.8-.4-3.7.2-5 1.7-1.9 2.2-1.7 5.5.5 7.4l26.2 23z\"]\n};\nvar faSkiingNordic = {\n prefix: 'fas',\n iconName: 'skiing-nordic',\n icon: [576, 512, [], \"f7ca\", \"M336 96c26.5 0 48-21.5 48-48S362.5 0 336 0s-48 21.5-48 48 21.5 48 48 48zm216 320c-13.2 0-24 10.7-24 24 0 13.2-10.8 24-24 24h-69.5L460 285.6c11.7-4.7 20.1-16.2 20.1-29.6 0-17.7-14.3-32-32-32h-44L378 170.8c-12.5-25.5-35.5-44.2-61.8-50.9L245 98.7c-28.3-6.8-57.8-.5-80.8 17.1l-39.7 30.4c-14 10.7-16.7 30.8-5.9 44.9.7.9 1.7 1.3 2.4 2.1L66.9 464H24c-13.2 0-24 10.7-24 24s10.8 24 24 24h480c39.7 0 72-32.3 72-72 0-13.2-10.8-24-24-24zm-260.5 48h-96.9l43.1-91-22-13c-12.1-7.2-21.9-16.9-29.5-27.8L123.7 464H99.5l52.3-261.4c4.1-1 8.1-2.9 11.7-5.6l39.7-30.4c7.7-5.9 17.4-8 25.3-6.1l14.7 4.4-37.5 87.4c-12.6 29.5-1.3 64 26.3 80.3l85 50.2-25.5 81.2zm110.6 0h-43.6l23.6-75.5c5.9-20.8-2.9-43.1-21.6-54.4L299.3 298l31.3-78.3 20.3 41.4c8 16.3 24.9 26.9 43.1 26.9h33.3l-25.2 176z\"]\n};\nvar faSkull = {\n prefix: 'fas',\n iconName: 'skull',\n icon: [512, 512, [], \"f54c\", \"M256 0C114.6 0 0 100.3 0 224c0 70.1 36.9 132.6 94.5 173.7 9.6 6.9 15.2 18.1 13.5 29.9l-9.4 66.2c-1.4 9.6 6 18.2 15.7 18.2H192v-56c0-4.4 3.6-8 8-8h16c4.4 0 8 3.6 8 8v56h64v-56c0-4.4 3.6-8 8-8h16c4.4 0 8 3.6 8 8v56h77.7c9.7 0 17.1-8.6 15.7-18.2l-9.4-66.2c-1.7-11.7 3.8-23 13.5-29.9C475.1 356.6 512 294.1 512 224 512 100.3 397.4 0 256 0zm-96 320c-35.3 0-64-28.7-64-64s28.7-64 64-64 64 28.7 64 64-28.7 64-64 64zm192 0c-35.3 0-64-28.7-64-64s28.7-64 64-64 64 28.7 64 64-28.7 64-64 64z\"]\n};\nvar faSkullCrossbones = {\n prefix: 'fas',\n iconName: 'skull-crossbones',\n icon: [448, 512, [], \"f714\", \"M439.15 453.06L297.17 384l141.99-69.06c7.9-3.95 11.11-13.56 7.15-21.46L432 264.85c-3.95-7.9-13.56-11.11-21.47-7.16L224 348.41 37.47 257.69c-7.9-3.95-17.51-.75-21.47 7.16L1.69 293.48c-3.95 7.9-.75 17.51 7.15 21.46L150.83 384 8.85 453.06c-7.9 3.95-11.11 13.56-7.15 21.47l14.31 28.63c3.95 7.9 13.56 11.11 21.47 7.15L224 419.59l186.53 90.72c7.9 3.95 17.51.75 21.47-7.15l14.31-28.63c3.95-7.91.74-17.52-7.16-21.47zM150 237.28l-5.48 25.87c-2.67 12.62 5.42 24.85 16.45 24.85h126.08c11.03 0 19.12-12.23 16.45-24.85l-5.5-25.87c41.78-22.41 70-62.75 70-109.28C368 57.31 303.53 0 224 0S80 57.31 80 128c0 46.53 28.22 86.87 70 109.28zM280 112c17.65 0 32 14.35 32 32s-14.35 32-32 32-32-14.35-32-32 14.35-32 32-32zm-112 0c17.65 0 32 14.35 32 32s-14.35 32-32 32-32-14.35-32-32 14.35-32 32-32z\"]\n};\nvar faSlash = {\n prefix: 'fas',\n iconName: 'slash',\n icon: [640, 512, [], \"f715\", \"M594.53 508.63L6.18 53.9c-6.97-5.42-8.23-15.47-2.81-22.45L23.01 6.18C28.43-.8 38.49-2.06 45.47 3.37L633.82 458.1c6.97 5.42 8.23 15.47 2.81 22.45l-19.64 25.27c-5.42 6.98-15.48 8.23-22.46 2.81z\"]\n};\nvar faSleigh = {\n prefix: 'fas',\n iconName: 'sleigh',\n icon: [640, 512, [], \"f7cc\", \"M612.7 350.7l-9.3-7.4c-6.9-5.5-17-4.4-22.5 2.5l-10 12.5c-5.5 6.9-4.4 17 2.5 22.5l9.3 7.4c5.9 4.7 9.2 11.7 9.2 19.2 0 13.6-11 24.6-24.6 24.6H48c-8.8 0-16 7.2-16 16v16c0 8.8 7.2 16 16 16h516c39 0 73.7-29.3 75.9-68.3 1.4-23.8-8.7-46.3-27.2-61zM32 224c0 59.6 40.9 109.2 96 123.5V400h64v-48h192v48h64v-48c53 0 96-43 96-96v-96c17.7 0 32-14.3 32-32s-14.3-32-32-32h-96v64c0 35.3-28.7 64-64 64h-20.7c-65.8 0-125.9-37.2-155.3-96-29.4-58.8-89.6-96-155.3-96H32C14.3 32 0 46.3 0 64s14.3 32 32 32v128z\"]\n};\nvar faSlidersH = {\n prefix: 'fas',\n iconName: 'sliders-h',\n icon: [512, 512, [], \"f1de\", \"M496 384H160v-16c0-8.8-7.2-16-16-16h-32c-8.8 0-16 7.2-16 16v16H16c-8.8 0-16 7.2-16 16v32c0 8.8 7.2 16 16 16h80v16c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16v-16h336c8.8 0 16-7.2 16-16v-32c0-8.8-7.2-16-16-16zm0-160h-80v-16c0-8.8-7.2-16-16-16h-32c-8.8 0-16 7.2-16 16v16H16c-8.8 0-16 7.2-16 16v32c0 8.8 7.2 16 16 16h336v16c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16v-16h80c8.8 0 16-7.2 16-16v-32c0-8.8-7.2-16-16-16zm0-160H288V48c0-8.8-7.2-16-16-16h-32c-8.8 0-16 7.2-16 16v16H16C7.2 64 0 71.2 0 80v32c0 8.8 7.2 16 16 16h208v16c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16v-16h208c8.8 0 16-7.2 16-16V80c0-8.8-7.2-16-16-16z\"]\n};\nvar faSmile = {\n prefix: 'fas',\n iconName: 'smile',\n icon: [496, 512, [], \"f118\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm80 168c17.7 0 32 14.3 32 32s-14.3 32-32 32-32-14.3-32-32 14.3-32 32-32zm-160 0c17.7 0 32 14.3 32 32s-14.3 32-32 32-32-14.3-32-32 14.3-32 32-32zm194.8 170.2C334.3 380.4 292.5 400 248 400s-86.3-19.6-114.8-53.8c-13.6-16.3 11-36.7 24.6-20.5 22.4 26.9 55.2 42.2 90.2 42.2s67.8-15.4 90.2-42.2c13.4-16.2 38.1 4.2 24.6 20.5z\"]\n};\nvar faSmileBeam = {\n prefix: 'fas',\n iconName: 'smile-beam',\n icon: [496, 512, [], \"f5b8\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zM112 223.4c3.3-42.1 32.2-71.4 56-71.4s52.7 29.3 56 71.4c.7 8.6-10.8 11.9-14.9 4.5l-9.5-17c-7.7-13.7-19.2-21.6-31.5-21.6s-23.8 7.9-31.5 21.6l-9.5 17c-4.3 7.4-15.8 4-15.1-4.5zm250.8 122.8C334.3 380.4 292.5 400 248 400s-86.3-19.6-114.8-53.8c-13.5-16.3 11-36.7 24.6-20.5 22.4 26.9 55.2 42.2 90.2 42.2s67.8-15.4 90.2-42.2c13.6-16.2 38.1 4.3 24.6 20.5zm6.2-118.3l-9.5-17c-7.7-13.7-19.2-21.6-31.5-21.6s-23.8 7.9-31.5 21.6l-9.5 17c-4.1 7.3-15.6 4-14.9-4.5 3.3-42.1 32.2-71.4 56-71.4s52.7 29.3 56 71.4c.6 8.6-11 11.9-15.1 4.5z\"]\n};\nvar faSmileWink = {\n prefix: 'fas',\n iconName: 'smile-wink',\n icon: [496, 512, [], \"f4da\", \"M0 256c0 137 111 248 248 248s248-111 248-248S385 8 248 8 0 119 0 256zm200-48c0 17.7-14.3 32-32 32s-32-14.3-32-32 14.3-32 32-32 32 14.3 32 32zm158.5 16.5c-14.8-13.2-46.2-13.2-61 0L288 233c-8.3 7.4-21.6.4-19.8-10.8 4-25.2 34.2-42.1 59.9-42.1S384 197 388 222.2c1.7 11.1-11.4 18.3-19.8 10.8l-9.7-8.5zM157.8 325.8C180.2 352.7 213 368 248 368s67.8-15.4 90.2-42.2c13.6-16.2 38.1 4.2 24.6 20.5C334.3 380.4 292.5 400 248 400s-86.3-19.6-114.8-53.8c-13.5-16.3 11.2-36.7 24.6-20.4z\"]\n};\nvar faSmog = {\n prefix: 'fas',\n iconName: 'smog',\n icon: [640, 512, [], \"f75f\", \"M624 368H80c-8.8 0-16 7.2-16 16v16c0 8.8 7.2 16 16 16h544c8.8 0 16-7.2 16-16v-16c0-8.8-7.2-16-16-16zm-480 96H16c-8.8 0-16 7.2-16 16v16c0 8.8 7.2 16 16 16h128c8.8 0 16-7.2 16-16v-16c0-8.8-7.2-16-16-16zm416 0H224c-8.8 0-16 7.2-16 16v16c0 8.8 7.2 16 16 16h336c8.8 0 16-7.2 16-16v-16c0-8.8-7.2-16-16-16zM144 288h156.1c22.5 19.7 51.6 32 83.9 32s61.3-12.3 83.9-32H528c61.9 0 112-50.1 112-112S589.9 64 528 64c-18 0-34.7 4.6-49.7 12.1C454 31 406.8 0 352 0c-41 0-77.8 17.3-104 44.8C221.8 17.3 185 0 144 0 64.5 0 0 64.5 0 144s64.5 144 144 144z\"]\n};\nvar faSmoking = {\n prefix: 'fas',\n iconName: 'smoking',\n icon: [640, 512, [], \"f48d\", \"M632 352h-48c-4.4 0-8 3.6-8 8v144c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8V360c0-4.4-3.6-8-8-8zM553.3 87.1c-5.7-3.8-9.3-10-9.3-16.8V8c0-4.4-3.6-8-8-8h-48c-4.4 0-8 3.6-8 8v62.3c0 22 10.2 43.4 28.6 55.4 42.2 27.3 67.4 73.8 67.4 124V280c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8v-30.3c0-65.5-32.4-126.2-86.7-162.6zM432 352H48c-26.5 0-48 21.5-48 48v64c0 26.5 21.5 48 48 48h384c8.8 0 16-7.2 16-16V368c0-8.8-7.2-16-16-16zm-32 112H224v-64h176v64zm87.7-322.4C463.8 125 448 99.3 448 70.3V8c0-4.4-3.6-8-8-8h-48c-4.4 0-8 3.6-8 8v66.4c0 43.7 24.6 81.6 60.3 106.7 22.4 15.7 35.7 41.2 35.7 68.6V280c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8v-30.3c0-43.3-21-83.4-56.3-108.1zM536 352h-48c-4.4 0-8 3.6-8 8v144c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8V360c0-4.4-3.6-8-8-8z\"]\n};\nvar faSmokingBan = {\n prefix: 'fas',\n iconName: 'smoking-ban',\n icon: [512, 512, [], \"f54d\", \"M96 304c0 8.8 7.2 16 16 16h117.5l-96-96H112c-8.8 0-16 7.2-16 16v64zM256 0C114.6 0 0 114.6 0 256s114.6 256 256 256 256-114.6 256-256S397.4 0 256 0zm0 448c-105.9 0-192-86.1-192-192 0-41.4 13.3-79.7 35.7-111.1l267.4 267.4C335.7 434.7 297.4 448 256 448zm45.2-192H384v32h-50.8l-32-32zm111.1 111.1L365.2 320H400c8.8 0 16-7.2 16-16v-64c0-8.8-7.2-16-16-16H269.2L144.9 99.7C176.3 77.3 214.6 64 256 64c105.9 0 192 86.1 192 192 0 41.4-13.3 79.7-35.7 111.1zM320.6 128c-15.6 0-28.6-11.2-31.4-25.9-.7-3.6-4-6.1-7.7-6.1h-16.2c-5 0-8.7 4.5-8 9.4 4.6 30.9 31.2 54.6 63.3 54.6 15.6 0 28.6 11.2 31.4 25.9.7 3.6 4 6.1 7.7 6.1h16.2c5 0 8.7-4.5 8-9.4-4.6-30.9-31.2-54.6-63.3-54.6z\"]\n};\nvar faSms = {\n prefix: 'fas',\n iconName: 'sms',\n icon: [512, 512, [], \"f7cd\", \"M256 32C114.6 32 0 125.1 0 240c0 49.6 21.4 95 57 130.7C44.5 421.1 2.7 466 2.2 466.5c-2.2 2.3-2.8 5.7-1.5 8.7 1.3 3 4.1 4.8 7.3 4.8 66.3 0 116-31.8 140.6-51.4 32.7 12.3 69 19.4 107.4 19.4 141.4 0 256-93.1 256-208S397.4 32 256 32zM128.2 304H116c-4.4 0-8-3.6-8-8v-16c0-4.4 3.6-8 8-8h12.3c6 0 10.4-3.5 10.4-6.6 0-1.3-.8-2.7-2.1-3.8l-21.9-18.8c-8.5-7.2-13.3-17.5-13.3-28.1 0-21.3 19-38.6 42.4-38.6H156c4.4 0 8 3.6 8 8v16c0 4.4-3.6 8-8 8h-12.3c-6 0-10.4 3.5-10.4 6.6 0 1.3.8 2.7 2.1 3.8l21.9 18.8c8.5 7.2 13.3 17.5 13.3 28.1.1 21.3-19 38.6-42.4 38.6zm191.8-8c0 4.4-3.6 8-8 8h-16c-4.4 0-8-3.6-8-8v-68.2l-24.8 55.8c-2.9 5.9-11.4 5.9-14.3 0L224 227.8V296c0 4.4-3.6 8-8 8h-16c-4.4 0-8-3.6-8-8V192c0-8.8 7.2-16 16-16h16c6.1 0 11.6 3.4 14.3 8.8l17.7 35.4 17.7-35.4c2.7-5.4 8.3-8.8 14.3-8.8h16c8.8 0 16 7.2 16 16v104zm48.3 8H356c-4.4 0-8-3.6-8-8v-16c0-4.4 3.6-8 8-8h12.3c6 0 10.4-3.5 10.4-6.6 0-1.3-.8-2.7-2.1-3.8l-21.9-18.8c-8.5-7.2-13.3-17.5-13.3-28.1 0-21.3 19-38.6 42.4-38.6H396c4.4 0 8 3.6 8 8v16c0 4.4-3.6 8-8 8h-12.3c-6 0-10.4 3.5-10.4 6.6 0 1.3.8 2.7 2.1 3.8l21.9 18.8c8.5 7.2 13.3 17.5 13.3 28.1.1 21.3-18.9 38.6-42.3 38.6z\"]\n};\nvar faSnowboarding = {\n prefix: 'fas',\n iconName: 'snowboarding',\n icon: [512, 512, [], \"f7ce\", \"M432 96c26.5 0 48-21.5 48-48S458.5 0 432 0s-48 21.5-48 48 21.5 48 48 48zm28.8 153.6c5.8 4.3 12.5 6.4 19.2 6.4 9.7 0 19.3-4.4 25.6-12.8 10.6-14.1 7.8-34.2-6.4-44.8l-111.4-83.5c-13.8-10.3-29.1-18.4-45.4-23.8l-63.7-21.2-26.1-52.1C244.7 2 225.5-4.4 209.7 3.5c-15.8 7.9-22.2 27.1-14.3 42.9l29.1 58.1c5.7 11.4 15.6 19.9 27.7 24l16.4 5.5-41.2 20.6c-21.8 10.9-35.4 32.8-35.4 57.2v53.1l-74.1 24.7c-16.8 5.6-25.8 23.7-20.2 40.5 1.7 5.2 4.9 9.4 8.7 12.9l-38.7-14.1c-9.7-3.5-17.4-10.6-21.8-20-5.6-12-19.9-17.2-31.9-11.6s-17.2 19.9-11.6 31.9c9.8 21 27.1 36.9 48.9 44.8l364.8 132.7c9.7 3.5 19.7 5.3 29.7 5.3 12.5 0 24.9-2.7 36.5-8.2 12-5.6 17.2-19.9 11.6-31.9S474 454.7 462 460.3c-9.3 4.4-19.8 4.8-29.5 1.3l-90.8-33.1c8.7-4.1 15.6-11.8 17.8-21.9l21.9-102c3.9-18.2-3.2-37.2-18.1-48.4l-52-39 66-30.5 83.5 62.9zm-144.4 51.7l-19.7 92c-1.5 7.1-.1 13.9 2.8 20l-169.4-61.6c2.7-.2 5.4-.4 8-1.3l85-28.4c19.6-6.5 32.8-24.8 32.8-45.5V256l60.5 45.3z\"]\n};\nvar faSnowflake = {\n prefix: 'fas',\n iconName: 'snowflake',\n icon: [448, 512, [], \"f2dc\", \"M440.3 345.2l-33.8-19.5 26-7c8.2-2.2 13.1-10.7 10.9-18.9l-4-14.9c-2.2-8.2-10.7-13.1-18.9-10.9l-70.8 19-63.9-37 63.8-36.9 70.8 19c8.2 2.2 16.7-2.7 18.9-10.9l4-14.9c2.2-8.2-2.7-16.7-10.9-18.9l-26-7 33.8-19.5c7.4-4.3 9.9-13.7 5.7-21.1L430.4 119c-4.3-7.4-13.7-9.9-21.1-5.7l-33.8 19.5 7-26c2.2-8.2-2.7-16.7-10.9-18.9l-14.9-4c-8.2-2.2-16.7 2.7-18.9 10.9l-19 70.8-62.8 36.2v-77.5l53.7-53.7c6.2-6.2 6.2-16.4 0-22.6l-11.3-11.3c-6.2-6.2-16.4-6.2-22.6 0L256 56.4V16c0-8.8-7.2-16-16-16h-32c-8.8 0-16 7.2-16 16v40.4l-19.7-19.7c-6.2-6.2-16.4-6.2-22.6 0L138.3 48c-6.3 6.2-6.3 16.4 0 22.6l53.7 53.7v77.5l-62.8-36.2-19-70.8c-2.2-8.2-10.7-13.1-18.9-10.9l-14.9 4c-8.2 2.2-13.1 10.7-10.9 18.9l7 26-33.8-19.5c-7.4-4.3-16.8-1.7-21.1 5.7L2.1 145.7c-4.3 7.4-1.7 16.8 5.7 21.1l33.8 19.5-26 7c-8.3 2.2-13.2 10.7-11 19l4 14.9c2.2 8.2 10.7 13.1 18.9 10.9l70.8-19 63.8 36.9-63.8 36.9-70.8-19c-8.2-2.2-16.7 2.7-18.9 10.9l-4 14.9c-2.2 8.2 2.7 16.7 10.9 18.9l26 7-33.8 19.6c-7.4 4.3-9.9 13.7-5.7 21.1l15.5 26.8c4.3 7.4 13.7 9.9 21.1 5.7l33.8-19.5-7 26c-2.2 8.2 2.7 16.7 10.9 18.9l14.9 4c8.2 2.2 16.7-2.7 18.9-10.9l19-70.8 62.8-36.2v77.5l-53.7 53.7c-6.3 6.2-6.3 16.4 0 22.6l11.3 11.3c6.2 6.2 16.4 6.2 22.6 0l19.7-19.7V496c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16v-40.4l19.7 19.7c6.2 6.2 16.4 6.2 22.6 0l11.3-11.3c6.2-6.2 6.2-16.4 0-22.6L256 387.7v-77.5l62.8 36.2 19 70.8c2.2 8.2 10.7 13.1 18.9 10.9l14.9-4c8.2-2.2 13.1-10.7 10.9-18.9l-7-26 33.8 19.5c7.4 4.3 16.8 1.7 21.1-5.7l15.5-26.8c4.3-7.3 1.8-16.8-5.6-21z\"]\n};\nvar faSnowman = {\n prefix: 'fas',\n iconName: 'snowman',\n icon: [512, 512, [], \"f7d0\", \"M510.9 152.3l-5.9-14.5c-3.3-8-12.6-11.9-20.8-8.7L456 140.6v-29c0-8.6-7.2-15.6-16-15.6h-16c-8.8 0-16 7-16 15.6v46.9c0 .5.3 1 .3 1.5l-56.4 23c-5.9-10-13.3-18.9-22-26.6 13.6-16.6 22-37.4 22-60.5 0-53-43-96-96-96s-96 43-96 96c0 23.1 8.5 43.9 22 60.5-8.7 7.7-16 16.6-22 26.6l-56.4-23c.1-.5.3-1 .3-1.5v-46.9C104 103 96.8 96 88 96H72c-8.8 0-16 7-16 15.6v29l-28.1-11.5c-8.2-3.2-17.5.7-20.8 8.7l-5.9 14.5c-3.3 8 .7 17.1 8.9 20.3l135.2 55.2c-.4 4-1.2 8-1.2 12.2 0 10.1 1.7 19.6 4.2 28.9C120.9 296.4 104 334.2 104 376c0 54 28.4 100.9 70.8 127.8 9.3 5.9 20.3 8.2 31.3 8.2h99.2c13.3 0 26.3-4.1 37.2-11.7 46.5-32.3 74.4-89.4 62.9-152.6-5.5-30.2-20.5-57.6-41.6-79 2.5-9.2 4.2-18.7 4.2-28.7 0-4.2-.8-8.1-1.2-12.2L502 172.6c8.1-3.1 12.1-12.2 8.9-20.3zM224 96c-8.8 0-16-7.2-16-16s7.2-16 16-16 16 7.2 16 16-7.2 16-16 16zm32 272c-8.8 0-16-7.2-16-16s7.2-16 16-16 16 7.2 16 16-7.2 16-16 16zm0-64c-8.8 0-16-7.2-16-16s7.2-16 16-16 16 7.2 16 16-7.2 16-16 16zm0-64c-8.8 0-16-7.2-16-16s7.2-16 16-16 16 7.2 16 16-7.2 16-16 16zm0-88s-16-23.2-16-32 7.2-16 16-16 16 7.2 16 16-16 32-16 32zm32-56c-8.8 0-16-7.2-16-16s7.2-16 16-16 16 7.2 16 16-7.2 16-16 16z\"]\n};\nvar faSnowplow = {\n prefix: 'fas',\n iconName: 'snowplow',\n icon: [640, 512, [], \"f7d2\", \"M120 376c-13.3 0-24 10.7-24 24s10.7 24 24 24 24-10.7 24-24-10.7-24-24-24zm80 0c-13.3 0-24 10.7-24 24s10.7 24 24 24 24-10.7 24-24-10.7-24-24-24zm80 0c-13.3 0-24 10.7-24 24s10.7 24 24 24 24-10.7 24-24-10.7-24-24-24zm80 0c-13.3 0-24 10.7-24 24s10.7 24 24 24 24-10.7 24-24-10.7-24-24-24zm238.6 49.4c-14.5-14.5-22.6-34.1-22.6-54.6V269.2c0-20.5 8.1-40.1 22.6-54.6l36.7-36.7c6.2-6.2 6.2-16.4 0-22.6l-22.6-22.6c-6.2-6.2-16.4-6.2-22.6 0l-36.7 36.7c-26.5 26.5-41.4 62.4-41.4 99.9V288h-64v-50.9c0-8.7-1.8-17.2-5.2-25.2L364.5 29.1C356.9 11.4 339.6 0 320.3 0H176c-26.5 0-48 21.5-48 48v112h-16c-26.5 0-48 21.5-48 48v91.2C26.3 317.2 0 355.4 0 400c0 61.9 50.1 112 112 112h256c61.9 0 112-50.1 112-112 0-17.3-4.2-33.4-11.2-48H512v18.7c0 37.5 14.9 73.4 41.4 99.9l36.7 36.7c6.2 6.2 16.4 6.2 22.6 0l22.6-22.6c6.2-6.2 6.2-16.4 0-22.6l-36.7-36.7zM192 64h117.8l68.6 160H256l-64-64V64zm176 384H112c-26.5 0-48-21.5-48-48s21.5-48 48-48h256c26.5 0 48 21.5 48 48s-21.5 48-48 48z\"]\n};\nvar faSocks = {\n prefix: 'fas',\n iconName: 'socks',\n icon: [512, 512, [], \"f696\", \"M214.66 311.01L288 256V96H128v176l-86.65 64.61c-39.4 29.56-53.86 84.42-29.21 127.06C30.39 495.25 63.27 512 96.08 512c20.03 0 40.25-6.25 57.52-19.2l21.86-16.39c-29.85-55.38-13.54-125.84 39.2-165.4zM288 32c0-11.05 3.07-21.3 8.02-30.38C293.4.92 290.85 0 288 0H160c-17.67 0-32 14.33-32 32v32h160V32zM480 0H352c-17.67 0-32 14.33-32 32v32h192V32c0-17.67-14.33-32-32-32zM320 272l-86.13 64.61c-39.4 29.56-53.86 84.42-29.21 127.06 18.25 31.58 50.61 48.33 83.42 48.33 20.03 0 40.25-6.25 57.52-19.2l115.2-86.4A127.997 127.997 0 0 0 512 304V96H320v176z\"]\n};\nvar faSolarPanel = {\n prefix: 'fas',\n iconName: 'solar-panel',\n icon: [640, 512, [], \"f5ba\", \"M431.98 448.01l-47.97.05V416h-128v32.21l-47.98.05c-8.82.01-15.97 7.16-15.98 15.99l-.05 31.73c-.01 8.85 7.17 16.03 16.02 16.02l223.96-.26c8.82-.01 15.97-7.16 15.98-15.98l.04-31.73c.01-8.85-7.17-16.03-16.02-16.02zM585.2 26.74C582.58 11.31 568.99 0 553.06 0H86.93C71 0 57.41 11.31 54.79 26.74-3.32 369.16.04 348.08.03 352c-.03 17.32 14.29 32 32.6 32h574.74c18.23 0 32.51-14.56 32.59-31.79.02-4.08 3.35 16.95-54.76-325.47zM259.83 64h120.33l9.77 96H250.06l9.77-96zm-75.17 256H71.09L90.1 208h105.97l-11.41 112zm16.29-160H98.24l16.29-96h96.19l-9.77 96zm32.82 160l11.4-112h149.65l11.4 112H233.77zm195.5-256h96.19l16.29 96H439.04l-9.77-96zm26.06 256l-11.4-112H549.9l19.01 112H455.33z\"]\n};\nvar faSort = {\n prefix: 'fas',\n iconName: 'sort',\n icon: [320, 512, [], \"f0dc\", \"M41 288h238c21.4 0 32.1 25.9 17 41L177 448c-9.4 9.4-24.6 9.4-33.9 0L24 329c-15.1-15.1-4.4-41 17-41zm255-105L177 64c-9.4-9.4-24.6-9.4-33.9 0L24 183c-15.1 15.1-4.4 41 17 41h238c21.4 0 32.1-25.9 17-41z\"]\n};\nvar faSortAlphaDown = {\n prefix: 'fas',\n iconName: 'sort-alpha-down',\n icon: [448, 512, [], \"f15d\", \"M400.7 427.1h-61.1c.7-1 1.5-2 2.3-3.1l67.5-95.7c1.4-2 2.2-4.4 2.2-6.9V300c0-6.6-5.4-12-12-12H274.5c-6.6 0-12 5.4-12 12v28.9c0 6.6 5.4 12 12 12H331c-.7 1-1.5 2-2.3 3.1l-67.2 95.2c-1.4 2-2.2 4.4-2.2 6.9V468c0 6.6 5.4 12 12 12h129.4c6.6 0 12-5.4 12-12v-28.9c0-6.7-5.4-12-12-12zM176 368h-48V48c0-8.8-7.2-16-16-16H80c-8.8 0-16 7.2-16 16v320H16c-14.2 0-21.4 17.2-11.3 27.3l80 80c6.2 6.2 16.4 6.2 22.6 0l80-80c10-10 2.9-27.3-11.3-27.3zm248.2-159.9l-57.1-168c-1.7-4.9-6.2-8.1-11.4-8.1h-39.6c-5.1 0-9.7 3.3-11.4 8.1l-57.1 168c-2.6 7.8 3.1 15.9 11.4 15.9h35.7c5.4 0 10.1-3.5 11.5-8.7l8.1-28.2h42.9l8.3 28.3A12 12 0 0 0 377 224h35.7c8.4 0 14.2-8.1 11.5-15.9zm-95-71.5l6.8-22.9 6.6 22.9z\"]\n};\nvar faSortAlphaUp = {\n prefix: 'fas',\n iconName: 'sort-alpha-up',\n icon: [448, 512, [], \"f15e\", \"M107.3 36.7c-6.2-6.2-16.4-6.2-22.6 0l-80 80c-10 10-2.9 27.3 11.3 27.3h48v320c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16V144h48c14.2 0 21.4-17.2 11.3-27.3zm293.4 390.4h-61.1c.7-1 1.5-2 2.3-3.1l67.5-95.7c1.4-2 2.2-4.4 2.2-6.9V300c0-6.6-5.4-12-12-12H274.5c-6.6 0-12 5.4-12 12v28.9c0 6.6 5.4 12 12 12H331c-.7 1-1.5 2-2.3 3.1l-67.2 95.2c-1.4 2-2.2 4.4-2.2 6.9V468c0 6.6 5.4 12 12 12h129.4c6.6 0 12-5.4 12-12v-28.9c0-6.7-5.4-12-12-12zm23.5-219l-57.1-168c-1.7-4.9-6.2-8.1-11.4-8.1h-39.6c-5.1 0-9.7 3.3-11.4 8.1l-57.1 168c-2.6 7.8 3.1 15.9 11.4 15.9h35.7c5.4 0 10.1-3.5 11.5-8.7l8.1-28.2h42.9l8.3 28.3A12 12 0 0 0 377 224h35.7c8.4 0 14.2-8.1 11.5-15.9zm-95-71.5l6.8-22.9 6.6 22.9z\"]\n};\nvar faSortAmountDown = {\n prefix: 'fas',\n iconName: 'sort-amount-down',\n icon: [512, 512, [], \"f160\", \"M187.298 395.314l-79.984 80.002c-6.248 6.247-16.383 6.245-22.627 0L4.705 395.314C-5.365 385.244 1.807 368 16.019 368H64V48c0-8.837 7.163-16 16-16h32c8.837 0 16 7.163 16 16v320h47.984c14.241 0 21.363 17.264 11.314 27.314zM240 96h256c8.837 0 16-7.163 16-16V48c0-8.837-7.163-16-16-16H240c-8.837 0-16 7.163-16 16v32c0 8.837 7.163 16 16 16zm-16 112v-32c0-8.837 7.163-16 16-16h192c8.837 0 16 7.163 16 16v32c0 8.837-7.163 16-16 16H240c-8.837 0-16-7.163-16-16zm0 256v-32c0-8.837 7.163-16 16-16h64c8.837 0 16 7.163 16 16v32c0 8.837-7.163 16-16 16h-64c-8.837 0-16-7.163-16-16zm0-128v-32c0-8.837 7.163-16 16-16h128c8.837 0 16 7.163 16 16v32c0 8.837-7.163 16-16 16H240c-8.837 0-16-7.163-16-16z\"]\n};\nvar faSortAmountUp = {\n prefix: 'fas',\n iconName: 'sort-amount-up',\n icon: [512, 512, [], \"f161\", \"M4.702 116.686l79.984-80.002c6.248-6.247 16.383-6.245 22.627 0l79.981 80.002c10.07 10.07 2.899 27.314-11.314 27.314H128v320c0 8.837-7.163 16-16 16H80c-8.837 0-16-7.163-16-16V144H16.016c-14.241 0-21.363-17.264-11.314-27.314zM240 96h256c8.837 0 16-7.163 16-16V48c0-8.837-7.163-16-16-16H240c-8.837 0-16 7.163-16 16v32c0 8.837 7.163 16 16 16zm-16 112v-32c0-8.837 7.163-16 16-16h192c8.837 0 16 7.163 16 16v32c0 8.837-7.163 16-16 16H240c-8.837 0-16-7.163-16-16zm0 256v-32c0-8.837 7.163-16 16-16h64c8.837 0 16 7.163 16 16v32c0 8.837-7.163 16-16 16h-64c-8.837 0-16-7.163-16-16zm0-128v-32c0-8.837 7.163-16 16-16h128c8.837 0 16 7.163 16 16v32c0 8.837-7.163 16-16 16H240c-8.837 0-16-7.163-16-16z\"]\n};\nvar faSortDown = {\n prefix: 'fas',\n iconName: 'sort-down',\n icon: [320, 512, [], \"f0dd\", \"M41 288h238c21.4 0 32.1 25.9 17 41L177 448c-9.4 9.4-24.6 9.4-33.9 0L24 329c-15.1-15.1-4.4-41 17-41z\"]\n};\nvar faSortNumericDown = {\n prefix: 'fas',\n iconName: 'sort-numeric-down',\n icon: [448, 512, [], \"f162\", \"M308.811 113.787l-19.448-20.795c-4.522-4.836-4.274-12.421.556-16.95l43.443-40.741a11.999 11.999 0 0 1 8.209-3.247h31.591c6.627 0 12 5.373 12 12v127.07h25.66c6.627 0 12 5.373 12 12v28.93c0 6.627-5.373 12-12 12H301.649c-6.627 0-12-5.373-12-12v-28.93c0-6.627 5.373-12 12-12h25.414v-57.938c-7.254 6.58-14.211 4.921-18.252.601zm-30.57 238.569c0-32.653 23.865-67.356 68.094-67.356 38.253 0 79.424 28.861 79.424 92.228 0 51.276-32.237 105.772-91.983 105.772-17.836 0-30.546-3.557-38.548-6.781-5.79-2.333-8.789-8.746-6.922-14.703l9.237-29.48c2.035-6.496 9.049-9.983 15.467-7.716 13.029 4.602 27.878 5.275 38.103-4.138-38.742 5.072-72.872-25.36-72.872-67.826zm92.273 19.338c0-22.285-15.302-36.505-25.835-36.505-8.642 0-13.164 7.965-13.164 15.832 0 5.669 1.815 24.168 25.168 24.168 9.973 0 13.377-2.154 13.744-2.731.021-.046.087-.291.087-.764zM175.984 368H128V48c0-8.837-7.163-16-16-16H80c-8.837 0-16 7.163-16 16v320H16.019c-14.212 0-21.384 17.244-11.314 27.314l79.981 80.002c6.245 6.245 16.38 6.247 22.627 0l79.984-80.002c10.05-10.05 2.928-27.314-11.313-27.314z\"]\n};\nvar faSortNumericUp = {\n prefix: 'fas',\n iconName: 'sort-numeric-up',\n icon: [448, 512, [], \"f163\", \"M308.811 113.787l-19.448-20.795c-4.522-4.836-4.274-12.421.556-16.95l43.443-40.741a11.999 11.999 0 0 1 8.209-3.247h31.591c6.627 0 12 5.373 12 12v127.07h25.66c6.627 0 12 5.373 12 12v28.93c0 6.627-5.373 12-12 12H301.649c-6.627 0-12-5.373-12-12v-28.93c0-6.627 5.373-12 12-12h25.414v-57.938c-7.254 6.58-14.211 4.921-18.252.601zm-30.57 238.569c0-32.653 23.865-67.356 68.094-67.356 38.253 0 79.424 28.861 79.424 92.228 0 51.276-32.237 105.772-91.983 105.772-17.836 0-30.546-3.557-38.548-6.781-5.79-2.333-8.789-8.746-6.922-14.703l9.237-29.48c2.035-6.496 9.049-9.983 15.467-7.716 13.029 4.602 27.878 5.275 38.103-4.138-38.742 5.072-72.872-25.36-72.872-67.826zm92.273 19.338c0-22.285-15.302-36.505-25.835-36.505-8.642 0-13.164 7.965-13.164 15.832 0 5.669 1.815 24.168 25.168 24.168 9.973 0 13.377-2.154 13.744-2.731.021-.046.087-.291.087-.764zM16.016 144H64v320c0 8.837 7.163 16 16 16h32c8.837 0 16-7.163 16-16V144h47.981c14.212 0 21.384-17.244 11.314-27.314l-79.981-80.002c-6.245-6.245-16.38-6.247-22.627 0L4.702 116.686C-5.347 126.736 1.775 144 16.016 144z\"]\n};\nvar faSortUp = {\n prefix: 'fas',\n iconName: 'sort-up',\n icon: [320, 512, [], \"f0de\", \"M279 224H41c-21.4 0-32.1-25.9-17-41L143 64c9.4-9.4 24.6-9.4 33.9 0l119 119c15.2 15.1 4.5 41-16.9 41z\"]\n};\nvar faSpa = {\n prefix: 'fas',\n iconName: 'spa',\n icon: [576, 512, [], \"f5bb\", \"M568.25 192c-29.04.13-135.01 6.16-213.84 83-33.12 29.63-53.36 63.3-66.41 94.86-13.05-31.56-33.29-65.23-66.41-94.86-78.83-76.84-184.8-82.87-213.84-83-4.41-.02-7.79 3.4-7.75 7.82.23 27.92 7.14 126.14 88.77 199.3C172.79 480.94 256 480 288 480s115.19.95 199.23-80.88c81.64-73.17 88.54-171.38 88.77-199.3.04-4.42-3.34-7.84-7.75-7.82zM287.98 302.6c12.82-18.85 27.6-35.78 44.09-50.52 19.09-18.61 39.58-33.3 60.26-45.18-16.44-70.5-51.72-133.05-96.73-172.22-4.11-3.58-11.02-3.58-15.14 0-44.99 39.14-80.27 101.63-96.74 172.07 20.37 11.7 40.5 26.14 59.22 44.39a282.768 282.768 0 0 1 45.04 51.46z\"]\n};\nvar faSpaceShuttle = {\n prefix: 'fas',\n iconName: 'space-shuttle',\n icon: [640, 512, [], \"f197\", \"M592.604 208.244C559.735 192.836 515.777 184 472 184H186.327c-4.952-6.555-10.585-11.978-16.72-16H376C229.157 137.747 219.403 32 96.003 32H96v128H80V32c-26.51 0-48 28.654-48 64v64c-23.197 0-32 10.032-32 24v40c0 13.983 8.819 24 32 24v16c-23.197 0-32 10.032-32 24v40c0 13.983 8.819 24 32 24v64c0 35.346 21.49 64 48 64V352h16v128h.003c123.4 0 133.154-105.747 279.997-136H169.606c6.135-4.022 11.768-9.445 16.72-16H472c43.777 0 87.735-8.836 120.604-24.244C622.282 289.845 640 271.992 640 256s-17.718-33.845-47.396-47.756zM488 296a8 8 0 0 1-8-8v-64a8 8 0 0 1 8-8c31.909 0 31.942 80 0 80z\"]\n};\nvar faSpider = {\n prefix: 'fas',\n iconName: 'spider',\n icon: [576, 512, [], \"f717\", \"M151.17 167.35L177.1 176h4.67l5.22-26.12c.72-3.58 1.8-7.58 3.21-11.79l-20.29-40.58 23.8-71.39c2.79-8.38-1.73-17.44-10.12-20.24L168.42.82c-8.38-2.8-17.45 1.73-20.24 10.12l-25.89 77.68a32.04 32.04 0 0 0 1.73 24.43l27.15 54.3zm422.14 182.03l-52.75-79.12a32.002 32.002 0 0 0-26.62-14.25H416l68.99-24.36a32.03 32.03 0 0 0 16.51-12.61l53.6-80.41c4.9-7.35 2.91-17.29-4.44-22.19l-13.31-8.88c-7.35-4.9-17.29-2.91-22.19 4.44l-50.56 75.83L404.1 208H368l-10.37-51.85C355.44 145.18 340.26 96 288 96c-52.26 0-67.44 49.18-69.63 60.15L208 208h-36.1l-60.49-20.17L60.84 112c-4.9-7.35-14.83-9.34-22.19-4.44l-13.31 8.88c-7.35 4.9-9.34 14.83-4.44 22.19l53.6 80.41a32.03 32.03 0 0 0 16.51 12.61L160 256H82.06a32.02 32.02 0 0 0-26.63 14.25L2.69 349.38c-4.9 7.35-2.92 17.29 4.44 22.19l13.31 8.88c7.35 4.9 17.29 2.91 22.19-4.44l48-72h47.06l-60.83 97.33A31.988 31.988 0 0 0 72 418.3V496c0 8.84 7.16 16 16 16h16c8.84 0 16-7.16 16-16v-73.11l74.08-118.53c-1.01 14.05-2.08 28.11-2.08 42.21C192 399.64 232.76 448 288 448s96-48.36 96-101.43c0-14.1-1.08-28.16-2.08-42.21L456 422.89V496c0 8.84 7.16 16 16 16h16c8.84 0 16-7.16 16-16v-77.71c0-6-1.69-11.88-4.86-16.96L438.31 304h47.06l48 72c4.9 7.35 14.84 9.34 22.19 4.44l13.31-8.88c7.36-4.9 9.34-14.83 4.44-22.18zM406.09 97.51l-20.29 40.58c1.41 4.21 2.49 8.21 3.21 11.79l5.22 26.12h4.67l25.93-8.65 27.15-54.3a31.995 31.995 0 0 0 1.73-24.43l-25.89-77.68C425.03 2.56 415.96-1.98 407.58.82l-15.17 5.06c-8.38 2.8-12.91 11.86-10.12 20.24l23.8 71.39z\"]\n};\nvar faSpinner = {\n prefix: 'fas',\n iconName: 'spinner',\n icon: [512, 512, [], \"f110\", \"M304 48c0 26.51-21.49 48-48 48s-48-21.49-48-48 21.49-48 48-48 48 21.49 48 48zm-48 368c-26.51 0-48 21.49-48 48s21.49 48 48 48 48-21.49 48-48-21.49-48-48-48zm208-208c-26.51 0-48 21.49-48 48s21.49 48 48 48 48-21.49 48-48-21.49-48-48-48zM96 256c0-26.51-21.49-48-48-48S0 229.49 0 256s21.49 48 48 48 48-21.49 48-48zm12.922 99.078c-26.51 0-48 21.49-48 48s21.49 48 48 48 48-21.49 48-48c0-26.509-21.491-48-48-48zm294.156 0c-26.51 0-48 21.49-48 48s21.49 48 48 48 48-21.49 48-48c0-26.509-21.49-48-48-48zM108.922 60.922c-26.51 0-48 21.49-48 48s21.49 48 48 48 48-21.49 48-48-21.491-48-48-48z\"]\n};\nvar faSplotch = {\n prefix: 'fas',\n iconName: 'splotch',\n icon: [512, 512, [], \"f5bc\", \"M472.29 195.89l-67.06-22.95c-19.28-6.6-33.54-20.92-38.14-38.3L351.1 74.19c-11.58-43.77-76.57-57.13-109.98-22.62l-46.14 47.67c-13.26 13.71-33.54 20.93-54.2 19.31l-71.88-5.62c-52.05-4.07-86.93 44.88-59.03 82.83l38.54 52.42c11.08 15.07 12.82 33.86 4.64 50.24L24.62 355.4c-20.59 41.25 22.84 84.87 73.49 73.81l69.96-15.28c20.11-4.39 41.45 0 57.07 11.73l54.32 40.83c39.32 29.56 101.04 7.57 104.45-37.22l4.7-61.86c1.35-17.79 12.8-33.86 30.63-42.99l62-31.74c44.88-22.96 39.59-80.17-8.95-96.79z\"]\n};\nvar faSprayCan = {\n prefix: 'fas',\n iconName: 'spray-can',\n icon: [512, 512, [], \"f5bd\", \"M224 32c0-17.67-14.33-32-32-32h-64c-17.67 0-32 14.33-32 32v96h128V32zm256 96c-17.67 0-32 14.33-32 32s14.33 32 32 32 32-14.33 32-32-14.33-32-32-32zm-256 32H96c-53.02 0-96 42.98-96 96v224c0 17.67 14.33 32 32 32h256c17.67 0 32-14.33 32-32V256c0-53.02-42.98-96-96-96zm-64 256c-44.18 0-80-35.82-80-80s35.82-80 80-80 80 35.82 80 80-35.82 80-80 80zM480 96c17.67 0 32-14.33 32-32s-14.33-32-32-32-32 14.33-32 32 14.33 32 32 32zm-96 32c-17.67 0-32 14.33-32 32s14.33 32 32 32 32-14.33 32-32-14.33-32-32-32zm-96-96c-17.67 0-32 14.33-32 32s14.33 32 32 32 32-14.33 32-32-14.33-32-32-32zm96 0c-17.67 0-32 14.33-32 32s14.33 32 32 32 32-14.33 32-32-14.33-32-32-32zm96 192c-17.67 0-32 14.33-32 32s14.33 32 32 32 32-14.33 32-32-14.33-32-32-32z\"]\n};\nvar faSquare = {\n prefix: 'fas',\n iconName: 'square',\n icon: [448, 512, [], \"f0c8\", \"M400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48z\"]\n};\nvar faSquareFull = {\n prefix: 'fas',\n iconName: 'square-full',\n icon: [512, 512, [], \"f45c\", \"M512 512H0V0h512v512z\"]\n};\nvar faSquareRootAlt = {\n prefix: 'fas',\n iconName: 'square-root-alt',\n icon: [576, 512, [], \"f698\", \"M571.31 251.31l-22.62-22.62c-6.25-6.25-16.38-6.25-22.63 0L480 274.75l-46.06-46.06c-6.25-6.25-16.38-6.25-22.63 0l-22.62 22.62c-6.25 6.25-6.25 16.38 0 22.63L434.75 320l-46.06 46.06c-6.25 6.25-6.25 16.38 0 22.63l22.62 22.62c6.25 6.25 16.38 6.25 22.63 0L480 365.25l46.06 46.06c6.25 6.25 16.38 6.25 22.63 0l22.62-22.62c6.25-6.25 6.25-16.38 0-22.63L525.25 320l46.06-46.06c6.25-6.25 6.25-16.38 0-22.63zM552 0H307.65c-14.54 0-27.26 9.8-30.95 23.87l-84.79 322.8-58.41-106.1A32.008 32.008 0 0 0 105.47 224H24c-13.25 0-24 10.74-24 24v48c0 13.25 10.75 24 24 24h43.62l88.88 163.73C168.99 503.5 186.3 512 204.94 512c17.27 0 44.44-9 54.28-41.48L357.03 96H552c13.25 0 24-10.75 24-24V24c0-13.26-10.75-24-24-24z\"]\n};\nvar faStamp = {\n prefix: 'fas',\n iconName: 'stamp',\n icon: [512, 512, [], \"f5bf\", \"M32 512h448v-64H32v64zm384-256h-66.56c-16.26 0-29.44-13.18-29.44-29.44v-9.46c0-27.37 8.88-53.41 21.46-77.72 9.11-17.61 12.9-38.39 9.05-60.42-6.77-38.78-38.47-70.7-77.26-77.45C212.62-9.04 160 37.33 160 96c0 14.16 3.12 27.54 8.69 39.58C182.02 164.43 192 194.7 192 226.49v.07c0 16.26-13.18 29.44-29.44 29.44H96c-53.02 0-96 42.98-96 96v32c0 17.67 14.33 32 32 32h448c17.67 0 32-14.33 32-32v-32c0-53.02-42.98-96-96-96z\"]\n};\nvar faStar = {\n prefix: 'fas',\n iconName: 'star',\n icon: [576, 512, [], \"f005\", \"M259.3 17.8L194 150.2 47.9 171.5c-26.2 3.8-36.7 36.1-17.7 54.6l105.7 103-25 145.5c-4.5 26.3 23.2 46 46.4 33.7L288 439.6l130.7 68.7c23.2 12.2 50.9-7.4 46.4-33.7l-25-145.5 105.7-103c19-18.5 8.5-50.8-17.7-54.6L382 150.2 316.7 17.8c-11.7-23.6-45.6-23.9-57.4 0z\"]\n};\nvar faStarAndCrescent = {\n prefix: 'fas',\n iconName: 'star-and-crescent',\n icon: [512, 512, [], \"f699\", \"M340.47 466.36c-1.45 0-6.89.46-9.18.46-116.25 0-210.82-94.57-210.82-210.82S215.04 45.18 331.29 45.18c2.32 0 7.7.46 9.18.46 7.13 0 13.33-5.03 14.75-12.07 1.46-7.25-2.55-14.49-9.47-17.09C316.58 5.54 286.39 0 256 0 114.84 0 0 114.84 0 256s114.84 256 256 256c30.23 0 60.28-5.49 89.32-16.32 5.96-2.02 10.28-7.64 10.28-14.26 0-8.09-6.39-15.06-15.13-15.06zm162.99-252.5l-76.38-11.1-34.16-69.21c-1.83-3.7-5.38-5.55-8.93-5.55s-7.1 1.85-8.93 5.55l-34.16 69.21-76.38 11.1c-8.17 1.18-11.43 11.22-5.52 16.99l55.27 53.87-13.05 76.07c-1.11 6.44 4.01 11.66 9.81 11.66 1.53 0 3.11-.36 4.64-1.17L384 335.37l68.31 35.91c1.53.8 3.11 1.17 4.64 1.17 5.8 0 10.92-5.23 9.81-11.66l-13.05-76.07 55.27-53.87c5.91-5.77 2.65-15.81-5.52-16.99z\"]\n};\nvar faStarHalf = {\n prefix: 'fas',\n iconName: 'star-half',\n icon: [576, 512, [], \"f089\", \"M288 0c-11.4 0-22.8 5.9-28.7 17.8L194 150.2 47.9 171.4c-26.2 3.8-36.7 36.1-17.7 54.6l105.7 103-25 145.5c-4.5 26.1 23 46 46.4 33.7L288 439.6V0z\"]\n};\nvar faStarHalfAlt = {\n prefix: 'fas',\n iconName: 'star-half-alt',\n icon: [536, 512, [], \"f5c0\", \"M508.55 171.51L362.18 150.2 296.77 17.81C290.89 5.98 279.42 0 267.95 0c-11.4 0-22.79 5.9-28.69 17.81l-65.43 132.38-146.38 21.29c-26.25 3.8-36.77 36.09-17.74 54.59l105.89 103-25.06 145.48C86.98 495.33 103.57 512 122.15 512c4.93 0 10-1.17 14.87-3.75l130.95-68.68 130.94 68.7c4.86 2.55 9.92 3.71 14.83 3.71 18.6 0 35.22-16.61 31.66-37.4l-25.03-145.49 105.91-102.98c19.04-18.5 8.52-50.8-17.73-54.6zm-121.74 123.2l-18.12 17.62 4.28 24.88 19.52 113.45-102.13-53.59-22.38-11.74.03-317.19 51.03 103.29 11.18 22.63 25.01 3.64 114.23 16.63-82.65 80.38z\"]\n};\nvar faStarOfDavid = {\n prefix: 'fas',\n iconName: 'star-of-david',\n icon: [464, 512, [], \"f69a\", \"M405.68 256l53.21-89.39C473.3 142.4 455.48 112 426.88 112H319.96l-55.95-93.98C256.86 6.01 244.43 0 232 0s-24.86 6.01-32.01 18.02L144.04 112H37.11c-28.6 0-46.42 30.4-32.01 54.61L58.32 256 5.1 345.39C-9.31 369.6 8.51 400 37.11 400h106.93l55.95 93.98C207.14 505.99 219.57 512 232 512s24.86-6.01 32.01-18.02L319.96 400h106.93c28.6 0 46.42-30.4 32.01-54.61L405.68 256zm-12.78-88l-19.8 33.26L353.3 168h39.6zm-52.39 88l-52.39 88H175.88l-52.39-88 52.38-88h112.25l52.39 88zM232 73.72L254.79 112h-45.57L232 73.72zM71.1 168h39.6l-19.8 33.26L71.1 168zm0 176l19.8-33.26L110.7 344H71.1zM232 438.28L209.21 400h45.57L232 438.28zM353.29 344l19.8-33.26L392.9 344h-39.61z\"]\n};\nvar faStarOfLife = {\n prefix: 'fas',\n iconName: 'star-of-life',\n icon: [480, 512, [], \"f621\", \"M471.99 334.43L336.06 256l135.93-78.43c7.66-4.42 10.28-14.2 5.86-21.86l-32.02-55.43c-4.42-7.65-14.21-10.28-21.87-5.86l-135.93 78.43V16c0-8.84-7.17-16-16.01-16h-64.04c-8.84 0-16.01 7.16-16.01 16v156.86L56.04 94.43c-7.66-4.42-17.45-1.79-21.87 5.86L2.15 155.71c-4.42 7.65-1.8 17.44 5.86 21.86L143.94 256 8.01 334.43c-7.66 4.42-10.28 14.21-5.86 21.86l32.02 55.43c4.42 7.65 14.21 10.27 21.87 5.86l135.93-78.43V496c0 8.84 7.17 16 16.01 16h64.04c8.84 0 16.01-7.16 16.01-16V339.14l135.93 78.43c7.66 4.42 17.45 1.8 21.87-5.86l32.02-55.43c4.42-7.65 1.8-17.43-5.86-21.85z\"]\n};\nvar faStepBackward = {\n prefix: 'fas',\n iconName: 'step-backward',\n icon: [448, 512, [], \"f048\", \"M64 468V44c0-6.6 5.4-12 12-12h48c6.6 0 12 5.4 12 12v176.4l195.5-181C352.1 22.3 384 36.6 384 64v384c0 27.4-31.9 41.7-52.5 24.6L136 292.7V468c0 6.6-5.4 12-12 12H76c-6.6 0-12-5.4-12-12z\"]\n};\nvar faStepForward = {\n prefix: 'fas',\n iconName: 'step-forward',\n icon: [448, 512, [], \"f051\", \"M384 44v424c0 6.6-5.4 12-12 12h-48c-6.6 0-12-5.4-12-12V291.6l-195.5 181C95.9 489.7 64 475.4 64 448V64c0-27.4 31.9-41.7 52.5-24.6L312 219.3V44c0-6.6 5.4-12 12-12h48c6.6 0 12 5.4 12 12z\"]\n};\nvar faStethoscope = {\n prefix: 'fas',\n iconName: 'stethoscope',\n icon: [512, 512, [], \"f0f1\", \"M447.1 112c-34.2.5-62.3 28.4-63 62.6-.5 24.3 12.5 45.6 32 56.8V344c0 57.3-50.2 104-112 104-60 0-109.2-44.1-111.9-99.2C265 333.8 320 269.2 320 192V36.6c0-11.4-8.1-21.3-19.3-23.5L237.8.5c-13-2.6-25.6 5.8-28.2 18.8L206.4 35c-2.6 13 5.8 25.6 18.8 28.2l30.7 6.1v121.4c0 52.9-42.2 96.7-95.1 97.2-53.4.5-96.9-42.7-96.9-96V69.4l30.7-6.1c13-2.6 21.4-15.2 18.8-28.2l-3.1-15.7C107.7 6.4 95.1-2 82.1.6L19.3 13C8.1 15.3 0 25.1 0 36.6V192c0 77.3 55.1 142 128.1 156.8C130.7 439.2 208.6 512 304 512c97 0 176-75.4 176-168V231.4c19.1-11.1 32-31.7 32-55.4 0-35.7-29.2-64.5-64.9-64zm.9 80c-8.8 0-16-7.2-16-16s7.2-16 16-16 16 7.2 16 16-7.2 16-16 16z\"]\n};\nvar faStickyNote = {\n prefix: 'fas',\n iconName: 'sticky-note',\n icon: [448, 512, [], \"f249\", \"M312 320h136V56c0-13.3-10.7-24-24-24H24C10.7 32 0 42.7 0 56v400c0 13.3 10.7 24 24 24h264V344c0-13.2 10.8-24 24-24zm129 55l-98 98c-4.5 4.5-10.6 7-17 7h-6V352h128v6.1c0 6.3-2.5 12.4-7 16.9z\"]\n};\nvar faStop = {\n prefix: 'fas',\n iconName: 'stop',\n icon: [448, 512, [], \"f04d\", \"M400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48z\"]\n};\nvar faStopCircle = {\n prefix: 'fas',\n iconName: 'stop-circle',\n icon: [512, 512, [], \"f28d\", \"M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm96 328c0 8.8-7.2 16-16 16H176c-8.8 0-16-7.2-16-16V176c0-8.8 7.2-16 16-16h160c8.8 0 16 7.2 16 16v160z\"]\n};\nvar faStopwatch = {\n prefix: 'fas',\n iconName: 'stopwatch',\n icon: [448, 512, [], \"f2f2\", \"M432 304c0 114.9-93.1 208-208 208S16 418.9 16 304c0-104 76.3-190.2 176-205.5V64h-28c-6.6 0-12-5.4-12-12V12c0-6.6 5.4-12 12-12h120c6.6 0 12 5.4 12 12v40c0 6.6-5.4 12-12 12h-28v34.5c37.5 5.8 71.7 21.6 99.7 44.6l27.5-27.5c4.7-4.7 12.3-4.7 17 0l28.3 28.3c4.7 4.7 4.7 12.3 0 17l-29.4 29.4-.6.6C419.7 223.3 432 262.2 432 304zm-176 36V188.5c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12V340c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12z\"]\n};\nvar faStore = {\n prefix: 'fas',\n iconName: 'store',\n icon: [616, 512, [], \"f54e\", \"M602 118.6L537.1 15C531.3 5.7 521 0 510 0H106C95 0 84.7 5.7 78.9 15L14 118.6c-33.5 53.5-3.8 127.9 58.8 136.4 4.5.6 9.1.9 13.7.9 29.6 0 55.8-13 73.8-33.1 18 20.1 44.3 33.1 73.8 33.1 29.6 0 55.8-13 73.8-33.1 18 20.1 44.3 33.1 73.8 33.1 29.6 0 55.8-13 73.8-33.1 18.1 20.1 44.3 33.1 73.8 33.1 4.7 0 9.2-.3 13.7-.9 62.8-8.4 92.6-82.8 59-136.4zM529.5 288c-10 0-19.9-1.5-29.5-3.8V384H116v-99.8c-9.6 2.2-19.5 3.8-29.5 3.8-6 0-12.1-.4-18-1.2-5.6-.8-11.1-2.1-16.4-3.6V480c0 17.7 14.3 32 32 32h448c17.7 0 32-14.3 32-32V283.2c-5.4 1.6-10.8 2.9-16.4 3.6-6.1.8-12.1 1.2-18.2 1.2z\"]\n};\nvar faStoreAlt = {\n prefix: 'fas',\n iconName: 'store-alt',\n icon: [640, 512, [], \"f54f\", \"M320 384H128V224H64v256c0 17.7 14.3 32 32 32h256c17.7 0 32-14.3 32-32V224h-64v160zm314.6-241.8l-85.3-128c-6-8.9-16-14.2-26.7-14.2H117.4c-10.7 0-20.7 5.3-26.6 14.2l-85.3 128c-14.2 21.3 1 49.8 26.6 49.8H608c25.5 0 40.7-28.5 26.6-49.8zM512 496c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16V224h-64v272z\"]\n};\nvar faStream = {\n prefix: 'fas',\n iconName: 'stream',\n icon: [512, 512, [], \"f550\", \"M16 128h416c8.84 0 16-7.16 16-16V48c0-8.84-7.16-16-16-16H16C7.16 32 0 39.16 0 48v64c0 8.84 7.16 16 16 16zm480 80H80c-8.84 0-16 7.16-16 16v64c0 8.84 7.16 16 16 16h416c8.84 0 16-7.16 16-16v-64c0-8.84-7.16-16-16-16zm-64 176H16c-8.84 0-16 7.16-16 16v64c0 8.84 7.16 16 16 16h416c8.84 0 16-7.16 16-16v-64c0-8.84-7.16-16-16-16z\"]\n};\nvar faStreetView = {\n prefix: 'fas',\n iconName: 'street-view',\n icon: [512, 512, [], \"f21d\", \"M367.9 329.76c-4.62 5.3-9.78 10.1-15.9 13.65v22.94c66.52 9.34 112 28.05 112 49.65 0 30.93-93.12 56-208 56S48 446.93 48 416c0-21.6 45.48-40.3 112-49.65v-22.94c-6.12-3.55-11.28-8.35-15.9-13.65C58.87 345.34 0 378.05 0 416c0 53.02 114.62 96 256 96s256-42.98 256-96c0-37.95-58.87-70.66-144.1-86.24zM256 128c35.35 0 64-28.65 64-64S291.35 0 256 0s-64 28.65-64 64 28.65 64 64 64zm-64 192v96c0 17.67 14.33 32 32 32h64c17.67 0 32-14.33 32-32v-96c17.67 0 32-14.33 32-32v-96c0-26.51-21.49-48-48-48h-11.8c-11.07 5.03-23.26 8-36.2 8s-25.13-2.97-36.2-8H208c-26.51 0-48 21.49-48 48v96c0 17.67 14.33 32 32 32z\"]\n};\nvar faStrikethrough = {\n prefix: 'fas',\n iconName: 'strikethrough',\n icon: [512, 512, [], \"f0cc\", \"M496 288H16c-8.837 0-16-7.163-16-16v-32c0-8.837 7.163-16 16-16h480c8.837 0 16 7.163 16 16v32c0 8.837-7.163 16-16 16zm-214.666 16c27.258 12.937 46.524 28.683 46.524 56.243 0 33.108-28.977 53.676-75.621 53.676-32.325 0-76.874-12.08-76.874-44.271V368c0-8.837-7.164-16-16-16H113.75c-8.836 0-16 7.163-16 16v19.204c0 66.845 77.717 101.82 154.487 101.82 88.578 0 162.013-45.438 162.013-134.424 0-19.815-3.618-36.417-10.143-50.6H281.334zm-30.952-96c-32.422-13.505-56.836-28.946-56.836-59.683 0-33.92 30.901-47.406 64.962-47.406 42.647 0 64.962 16.593 64.962 32.985V136c0 8.837 7.164 16 16 16h45.613c8.836 0 16-7.163 16-16v-30.318c0-52.438-71.725-79.875-142.575-79.875-85.203 0-150.726 40.972-150.726 125.646 0 22.71 4.665 41.176 12.777 56.547h129.823z\"]\n};\nvar faStroopwafel = {\n prefix: 'fas',\n iconName: 'stroopwafel',\n icon: [512, 512, [], \"f551\", \"M188.12 210.74L142.86 256l45.25 45.25L233.37 256l-45.25-45.26zm113.13-22.62L256 142.86l-45.25 45.25L256 233.37l45.25-45.25zm-90.5 135.76L256 369.14l45.26-45.26L256 278.63l-45.25 45.25zM256 0C114.62 0 0 114.62 0 256s114.62 256 256 256 256-114.62 256-256S397.38 0 256 0zm186.68 295.6l-11.31 11.31c-3.12 3.12-8.19 3.12-11.31 0l-28.29-28.29-45.25 45.25 33.94 33.94 16.97-16.97c3.12-3.12 8.19-3.12 11.31 0l11.31 11.31c3.12 3.12 3.12 8.19 0 11.31l-16.97 16.97 16.97 16.97c3.12 3.12 3.12 8.19 0 11.31l-11.31 11.31c-3.12 3.12-8.19 3.12-11.31 0l-16.97-16.97-16.97 16.97c-3.12 3.12-8.19 3.12-11.31 0l-11.31-11.31c-3.12-3.12-3.12-8.19 0-11.31l16.97-16.97-33.94-33.94-45.26 45.26 28.29 28.29c3.12 3.12 3.12 8.19 0 11.31l-11.31 11.31c-3.12 3.12-8.19 3.12-11.31 0L256 414.39l-28.29 28.29c-3.12 3.12-8.19 3.12-11.31 0l-11.31-11.31c-3.12-3.12-3.12-8.19 0-11.31l28.29-28.29-45.25-45.26-33.94 33.94 16.97 16.97c3.12 3.12 3.12 8.19 0 11.31l-11.31 11.31c-3.12 3.12-8.19 3.12-11.31 0l-16.97-16.97-16.97 16.97c-3.12 3.12-8.19 3.12-11.31 0l-11.31-11.31c-3.12-3.12-3.12-8.19 0-11.31l16.97-16.97-16.97-16.97c-3.12-3.12-3.12-8.19 0-11.31l11.31-11.31c3.12-3.12 8.19-3.12 11.31 0l16.97 16.97 33.94-33.94-45.25-45.25-28.29 28.29c-3.12 3.12-8.19 3.12-11.31 0L69.32 295.6c-3.12-3.12-3.12-8.19 0-11.31L97.61 256l-28.29-28.29c-3.12-3.12-3.12-8.19 0-11.31l11.31-11.31c3.12-3.12 8.19-3.12 11.31 0l28.29 28.29 45.25-45.26-33.94-33.94-16.97 16.97c-3.12 3.12-8.19 3.12-11.31 0l-11.31-11.31c-3.12-3.12-3.12-8.19 0-11.31l16.97-16.97-16.97-16.97c-3.12-3.12-3.12-8.19 0-11.31l11.31-11.31c3.12-3.12 8.19-3.12 11.31 0l16.97 16.97 16.97-16.97c3.12-3.12 8.19-3.12 11.31 0l11.31 11.31c3.12 3.12 3.12 8.19 0 11.31l-16.97 16.97 33.94 33.94 45.26-45.25-28.29-28.29c-3.12-3.12-3.12-8.19 0-11.31l11.31-11.31c3.12-3.12 8.19-3.12 11.31 0L256 97.61l28.29-28.29c3.12-3.12 8.19-3.12 11.31 0l11.31 11.31c3.12 3.12 3.12 8.19 0 11.31l-28.29 28.29 45.26 45.25 33.94-33.94-16.97-16.97c-3.12-3.12-3.12-8.19 0-11.31l11.31-11.31c3.12-3.12 8.19-3.12 11.31 0l16.97 16.97 16.97-16.97c3.12-3.12 8.19-3.12 11.31 0l11.31 11.31c3.12 3.12 3.12 8.19 0 11.31l-16.97 16.97 16.97 16.97c3.12 3.12 3.12 8.19 0 11.31l-11.31 11.31c-3.12 3.12-8.19 3.12-11.31 0l-16.97-16.97-33.94 33.94 45.25 45.26 28.29-28.29c3.12-3.12 8.19-3.12 11.31 0l11.31 11.31c3.12 3.12 3.12 8.19 0 11.31L414.39 256l28.29 28.28a8.015 8.015 0 0 1 0 11.32zM278.63 256l45.26 45.25L369.14 256l-45.25-45.26L278.63 256z\"]\n};\nvar faSubscript = {\n prefix: 'fas',\n iconName: 'subscript',\n icon: [512, 512, [], \"f12c\", \"M272 32h-67.8c-5.5 0-10.7 2.9-13.6 7.6l-40.3 65c-2.3 3.6-4.5 7.3-6.2 10.5-1.7-3.2-3.7-6.8-5.7-10.4L98.5 39.6c-2.9-4.7-8.1-7.6-13.6-7.6H16C7.2 32 0 39.2 0 48v32c0 8.8 7.2 16 16 16h30.1l52.8 77.3L42.3 256H16c-8.8 0-16 7.2-16 16v32c0 8.8 7.2 16 16 16h64c5.5 0 10.7-2.9 13.6-7.6l44.7-72.1c2.2-3.6 4.2-7.3 5.9-10.6 1.8 3.2 3.9 6.9 6.2 10.2l45.7 72.6c2.9 4.7 8 7.5 13.5 7.5H272c8.8 0 16-7.2 16-16v-32c0-8.8-7.2-16-16-16h-22l-58.6-84.3L244 96h28c8.8 0 16-7.2 16-16V48c0-8.8-7.2-16-16-16zm224 384H395.2c3.5-10.5 18.8-21.3 36.3-32.4 16.6-10.6 35.5-22.6 50.3-38.9 17.5-19.1 25.9-40.2 25.9-64.6 0-60.6-50.7-88.1-97.8-88.1-42.5 0-76.4 22-94.4 50.4-4.7 7.3-2.6 17 4.6 21.9l30.3 20.3c7 4.7 16.5 3.1 21.6-3.6 8-10.4 18.8-18.2 31.7-18.2 19.4 0 26.3 12.9 26.3 23.9 0 36.2-119.4 57-119.4 160 0 6.7.6 13 1.4 19.3 1.1 8 7.8 13.9 15.9 13.9H496c8.8 0 16-7.2 16-16v-32c0-8.7-7.2-15.9-16-15.9z\"]\n};\nvar faSubway = {\n prefix: 'fas',\n iconName: 'subway',\n icon: [448, 512, [], \"f239\", \"M448 96v256c0 51.815-61.624 96-130.022 96l62.98 49.721C386.905 502.417 383.562 512 376 512H72c-7.578 0-10.892-9.594-4.957-14.279L130.022 448C61.82 448 0 403.954 0 352V96C0 42.981 64 0 128 0h192c65 0 128 42.981 128 96zM200 232V120c0-13.255-10.745-24-24-24H72c-13.255 0-24 10.745-24 24v112c0 13.255 10.745 24 24 24h104c13.255 0 24-10.745 24-24zm200 0V120c0-13.255-10.745-24-24-24H272c-13.255 0-24 10.745-24 24v112c0 13.255 10.745 24 24 24h104c13.255 0 24-10.745 24-24zm-48 56c-26.51 0-48 21.49-48 48s21.49 48 48 48 48-21.49 48-48-21.49-48-48-48zm-256 0c-26.51 0-48 21.49-48 48s21.49 48 48 48 48-21.49 48-48-21.49-48-48-48z\"]\n};\nvar faSuitcase = {\n prefix: 'fas',\n iconName: 'suitcase',\n icon: [512, 512, [], \"f0f2\", \"M128 480h256V80c0-26.5-21.5-48-48-48H176c-26.5 0-48 21.5-48 48v400zm64-384h128v32H192V96zm320 80v256c0 26.5-21.5 48-48 48h-48V128h48c26.5 0 48 21.5 48 48zM96 480H48c-26.5 0-48-21.5-48-48V176c0-26.5 21.5-48 48-48h48v352z\"]\n};\nvar faSuitcaseRolling = {\n prefix: 'fas',\n iconName: 'suitcase-rolling',\n icon: [384, 512, [], \"f5c1\", \"M336 160H48c-26.51 0-48 21.49-48 48v224c0 26.51 21.49 48 48 48h16v16c0 8.84 7.16 16 16 16h32c8.84 0 16-7.16 16-16v-16h128v16c0 8.84 7.16 16 16 16h32c8.84 0 16-7.16 16-16v-16h16c26.51 0 48-21.49 48-48V208c0-26.51-21.49-48-48-48zm-16 216c0 4.42-3.58 8-8 8H72c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h240c4.42 0 8 3.58 8 8v16zm0-96c0 4.42-3.58 8-8 8H72c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h240c4.42 0 8 3.58 8 8v16zM144 48h96v80h48V48c0-26.51-21.49-48-48-48h-96c-26.51 0-48 21.49-48 48v80h48V48z\"]\n};\nvar faSun = {\n prefix: 'fas',\n iconName: 'sun',\n icon: [512, 512, [], \"f185\", \"M256 160c-52.9 0-96 43.1-96 96s43.1 96 96 96 96-43.1 96-96-43.1-96-96-96zm246.4 80.5l-94.7-47.3 33.5-100.4c4.5-13.6-8.4-26.5-21.9-21.9l-100.4 33.5-47.4-94.8c-6.4-12.8-24.6-12.8-31 0l-47.3 94.7L92.7 70.8c-13.6-4.5-26.5 8.4-21.9 21.9l33.5 100.4-94.7 47.4c-12.8 6.4-12.8 24.6 0 31l94.7 47.3-33.5 100.5c-4.5 13.6 8.4 26.5 21.9 21.9l100.4-33.5 47.3 94.7c6.4 12.8 24.6 12.8 31 0l47.3-94.7 100.4 33.5c13.6 4.5 26.5-8.4 21.9-21.9l-33.5-100.4 94.7-47.3c13-6.5 13-24.7.2-31.1zm-155.9 106c-49.9 49.9-131.1 49.9-181 0-49.9-49.9-49.9-131.1 0-181 49.9-49.9 131.1-49.9 181 0 49.9 49.9 49.9 131.1 0 181z\"]\n};\nvar faSuperscript = {\n prefix: 'fas',\n iconName: 'superscript',\n icon: [512, 512, [], \"f12b\", \"M272 192h-67.8c-5.5 0-10.7 2.9-13.6 7.6l-40.3 65c-2.3 3.6-4.5 7.3-6.2 10.5-1.7-3.2-3.7-6.8-5.7-10.4l-39.9-65.1c-2.9-4.7-8.1-7.6-13.6-7.6H16c-8.8 0-16 7.2-16 16v32c0 8.8 7.2 16 16 16h30.1l52.8 77.3L42.3 416H16c-8.8 0-16 7.2-16 16v32c0 8.8 7.2 16 16 16h64c5.5 0 10.7-2.9 13.6-7.6l44.7-72.1c2.2-3.6 4.2-7.3 5.9-10.6 1.8 3.2 3.9 6.9 6.2 10.2l45.7 72.6c2.9 4.7 8 7.5 13.5 7.5H272c8.8 0 16-7.2 16-16v-32c0-8.8-7.2-16-16-16h-22l-58.6-84.3L244 256h28c8.8 0 16-7.2 16-16v-32c0-8.8-7.2-16-16-16zm224 64H395.2c3.5-10.5 18.8-21.3 36.3-32.4 16.6-10.6 35.5-22.6 50.3-38.9 17.5-19.1 25.9-40.2 25.9-64.6 0-60.6-50.7-88.1-97.8-88.1-42.5 0-76.4 22-94.4 50.4-4.7 7.3-2.6 17 4.6 21.9l30.3 20.3c7 4.7 16.5 3.1 21.6-3.6 8-10.4 18.8-18.2 31.7-18.2 19.4 0 26.3 12.9 26.3 23.9 0 36.2-119.4 57-119.4 160 0 6.7.6 13 1.4 19.3 1.1 8 7.8 13.9 15.9 13.9H496c8.8 0 16-7.2 16-16v-32c0-8.7-7.2-15.9-16-15.9z\"]\n};\nvar faSurprise = {\n prefix: 'fas',\n iconName: 'surprise',\n icon: [496, 512, [], \"f5c2\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zM136 208c0-17.7 14.3-32 32-32s32 14.3 32 32-14.3 32-32 32-32-14.3-32-32zm112 208c-35.3 0-64-28.7-64-64s28.7-64 64-64 64 28.7 64 64-28.7 64-64 64zm80-176c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32z\"]\n};\nvar faSwatchbook = {\n prefix: 'fas',\n iconName: 'swatchbook',\n icon: [511, 512, [], \"f5c3\", \"M479.06 320H372.29L186.15 506.51c-2.06 2.07-4.49 3.58-6.67 5.49h299.58c17.64 0 31.94-14.33 31.94-32V352c0-17.67-14.3-32-31.94-32zm-44.5-152.9l-90.33-90.51c-12.47-12.5-32.69-12.5-45.17 0l-75.5 75.65V416c0 2.96-.67 5.73-.87 8.64l211.87-212.28c12.47-12.5 12.47-32.77 0-45.26zM191.62 32c0-17.67-14.3-32-31.94-32H31.94C14.3 0 0 14.33 0 32v384c0 53.02 42.9 96 95.81 96s95.81-42.98 95.81-96V32zM95.81 440c-13.23 0-23.95-10.75-23.95-24 0-13.26 10.73-24 23.95-24s23.95 10.74 23.95 24c.01 13.25-10.72 24-23.95 24zm31.94-184H63.88v-64h63.88v64zm0-128H63.88V64h63.88v64z\"]\n};\nvar faSwimmer = {\n prefix: 'fas',\n iconName: 'swimmer',\n icon: [640, 512, [], \"f5c4\", \"M189.61 310.58c3.54 3.26 15.27 9.42 34.39 9.42s30.86-6.16 34.39-9.42c16.02-14.77 34.5-22.58 53.46-22.58h16.3c18.96 0 37.45 7.81 53.46 22.58 3.54 3.26 15.27 9.42 34.39 9.42s30.86-6.16 34.39-9.42c14.86-13.71 31.88-21.12 49.39-22.16l-112.84-80.6 18-12.86c3.64-2.58 8.28-3.52 12.62-2.61l100.35 21.53c25.91 5.53 51.44-10.97 57-36.88 5.55-25.92-10.95-51.44-36.88-57L437.68 98.47c-30.73-6.58-63.02.12-88.56 18.38l-80.02 57.17c-10.38 7.39-19.36 16.44-26.72 26.94L173.75 299c5.47 3.23 10.82 6.93 15.86 11.58zM624 352h-16c-26.04 0-45.8-8.42-56.09-17.9-8.9-8.21-19.66-14.1-31.77-14.1h-16.3c-12.11 0-22.87 5.89-31.77 14.1C461.8 343.58 442.04 352 416 352s-45.8-8.42-56.09-17.9c-8.9-8.21-19.66-14.1-31.77-14.1h-16.3c-12.11 0-22.87 5.89-31.77 14.1C269.8 343.58 250.04 352 224 352s-45.8-8.42-56.09-17.9c-8.9-8.21-19.66-14.1-31.77-14.1h-16.3c-12.11 0-22.87 5.89-31.77 14.1C77.8 343.58 58.04 352 32 352H16c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h16c38.62 0 72.72-12.19 96-31.84 23.28 19.66 57.38 31.84 96 31.84s72.72-12.19 96-31.84c23.28 19.66 57.38 31.84 96 31.84s72.72-12.19 96-31.84c23.28 19.66 57.38 31.84 96 31.84h16c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16zm-512-96c44.18 0 80-35.82 80-80s-35.82-80-80-80-80 35.82-80 80 35.82 80 80 80z\"]\n};\nvar faSwimmingPool = {\n prefix: 'fas',\n iconName: 'swimming-pool',\n icon: [640, 512, [], \"f5c5\", \"M624 416h-16c-26.04 0-45.8-8.42-56.09-17.9-8.9-8.21-19.66-14.1-31.77-14.1h-16.3c-12.11 0-22.87 5.89-31.77 14.1C461.8 407.58 442.04 416 416 416s-45.8-8.42-56.09-17.9c-8.9-8.21-19.66-14.1-31.77-14.1h-16.3c-12.11 0-22.87 5.89-31.77 14.1C269.8 407.58 250.04 416 224 416s-45.8-8.42-56.09-17.9c-8.9-8.21-19.66-14.1-31.77-14.1h-16.3c-12.11 0-22.87 5.89-31.77 14.1C77.8 407.58 58.04 416 32 416H16c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h16c38.62 0 72.72-12.19 96-31.84 23.28 19.66 57.38 31.84 96 31.84s72.72-12.19 96-31.84c23.28 19.66 57.38 31.84 96 31.84s72.72-12.19 96-31.84c23.28 19.66 57.38 31.84 96 31.84h16c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16zm-400-32v-96h192v96c19.12 0 30.86-6.16 34.39-9.42 9.17-8.46 19.2-14.34 29.61-18.07V128c0-17.64 14.36-32 32-32s32 14.36 32 32v16c0 8.84 7.16 16 16 16h32c8.84 0 16-7.16 16-16v-16c0-52.94-43.06-96-96-96s-96 43.06-96 96v96H224v-96c0-17.64 14.36-32 32-32s32 14.36 32 32v16c0 8.84 7.16 16 16 16h32c8.84 0 16-7.16 16-16v-16c0-52.94-43.06-96-96-96s-96 43.06-96 96v228.5c10.41 3.73 20.44 9.62 29.61 18.07 3.53 3.27 15.27 9.43 34.39 9.43z\"]\n};\nvar faSynagogue = {\n prefix: 'fas',\n iconName: 'synagogue',\n icon: [640, 512, [], \"f69b\", \"M70 196.51L6.67 268.29A26.643 26.643 0 0 0 0 285.93V512h128V239.58l-38-43.07c-5.31-6.01-14.69-6.01-20 0zm563.33 71.78L570 196.51c-5.31-6.02-14.69-6.02-20 0l-38 43.07V512h128V285.93c0-6.5-2.37-12.77-6.67-17.64zM339.99 7.01c-11.69-9.35-28.29-9.35-39.98 0l-128 102.4A32.005 32.005 0 0 0 160 134.4V512h96v-92.57c0-31.88 21.78-61.43 53.25-66.55C349.34 346.35 384 377.13 384 416v96h96V134.4c0-9.72-4.42-18.92-12.01-24.99l-128-102.4zm52.07 215.55c1.98 3.15-.29 7.24-4 7.24h-38.94L324 269.79c-1.85 2.95-6.15 2.95-8 0l-25.12-39.98h-38.94c-3.72 0-5.98-4.09-4-7.24l19.2-30.56-19.2-30.56c-1.98-3.15.29-7.24 4-7.24h38.94l25.12-40c1.85-2.95 6.15-2.95 8 0l25.12 39.98h38.95c3.71 0 5.98 4.09 4 7.24L372.87 192l19.19 30.56z\"]\n};\nvar faSync = {\n prefix: 'fas',\n iconName: 'sync',\n icon: [512, 512, [], \"f021\", \"M440.935 12.574l3.966 82.766C399.416 41.904 331.674 8 256 8 134.813 8 33.933 94.924 12.296 209.824 10.908 217.193 16.604 224 24.103 224h49.084c5.57 0 10.377-3.842 11.676-9.259C103.407 137.408 172.931 80 256 80c60.893 0 114.512 30.856 146.104 77.801l-101.53-4.865c-6.845-.328-12.574 5.133-12.574 11.986v47.411c0 6.627 5.373 12 12 12h200.333c6.627 0 12-5.373 12-12V12c0-6.627-5.373-12-12-12h-47.411c-6.853 0-12.315 5.729-11.987 12.574zM256 432c-60.895 0-114.517-30.858-146.109-77.805l101.868 4.871c6.845.327 12.573-5.134 12.573-11.986v-47.412c0-6.627-5.373-12-12-12H12c-6.627 0-12 5.373-12 12V500c0 6.627 5.373 12 12 12h47.385c6.863 0 12.328-5.745 11.985-12.599l-4.129-82.575C112.725 470.166 180.405 504 256 504c121.187 0 222.067-86.924 243.704-201.824 1.388-7.369-4.308-14.176-11.807-14.176h-49.084c-5.57 0-10.377 3.842-11.676 9.259C408.593 374.592 339.069 432 256 432z\"]\n};\nvar faSyncAlt = {\n prefix: 'fas',\n iconName: 'sync-alt',\n icon: [512, 512, [], \"f2f1\", \"M370.72 133.28C339.458 104.008 298.888 87.962 255.848 88c-77.458.068-144.328 53.178-162.791 126.85-1.344 5.363-6.122 9.15-11.651 9.15H24.103c-7.498 0-13.194-6.807-11.807-14.176C33.933 94.924 134.813 8 256 8c66.448 0 126.791 26.136 171.315 68.685L463.03 40.97C478.149 25.851 504 36.559 504 57.941V192c0 13.255-10.745 24-24 24H345.941c-21.382 0-32.09-25.851-16.971-40.971l41.75-41.749zM32 296h134.059c21.382 0 32.09 25.851 16.971 40.971l-41.75 41.75c31.262 29.273 71.835 45.319 114.876 45.28 77.418-.07 144.315-53.144 162.787-126.849 1.344-5.363 6.122-9.15 11.651-9.15h57.304c7.498 0 13.194 6.807 11.807 14.176C478.067 417.076 377.187 504 256 504c-66.448 0-126.791-26.136-171.315-68.685L48.97 471.03C33.851 486.149 8 475.441 8 454.059V320c0-13.255 10.745-24 24-24z\"]\n};\nvar faSyringe = {\n prefix: 'fas',\n iconName: 'syringe',\n icon: [512, 512, [], \"f48e\", \"M201.5 174.8l55.7 55.8c3.1 3.1 3.1 8.2 0 11.3l-11.3 11.3c-3.1 3.1-8.2 3.1-11.3 0l-55.7-55.8-45.3 45.3 55.8 55.8c3.1 3.1 3.1 8.2 0 11.3l-11.3 11.3c-3.1 3.1-8.2 3.1-11.3 0L111 265.2l-26.4 26.4c-17.3 17.3-25.6 41.1-23 65.4l7.1 63.6L2.3 487c-3.1 3.1-3.1 8.2 0 11.3l11.3 11.3c3.1 3.1 8.2 3.1 11.3 0l66.3-66.3 63.6 7.1c23.9 2.6 47.9-5.4 65.4-23l181.9-181.9-135.7-135.7-64.9 65zm308.2-93.3L430.5 2.3c-3.1-3.1-8.2-3.1-11.3 0l-11.3 11.3c-3.1 3.1-3.1 8.2 0 11.3l28.3 28.3-45.3 45.3-56.6-56.6-17-17c-3.1-3.1-8.2-3.1-11.3 0l-33.9 33.9c-3.1 3.1-3.1 8.2 0 11.3l17 17L424.8 223l17 17c3.1 3.1 8.2 3.1 11.3 0l33.9-34c3.1-3.1 3.1-8.2 0-11.3l-73.5-73.5 45.3-45.3 28.3 28.3c3.1 3.1 8.2 3.1 11.3 0l11.3-11.3c3.1-3.2 3.1-8.2 0-11.4z\"]\n};\nvar faTable = {\n prefix: 'fas',\n iconName: 'table',\n icon: [512, 512, [], \"f0ce\", \"M464 32H48C21.49 32 0 53.49 0 80v352c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48V80c0-26.51-21.49-48-48-48zM224 416H64v-96h160v96zm0-160H64v-96h160v96zm224 160H288v-96h160v96zm0-160H288v-96h160v96z\"]\n};\nvar faTableTennis = {\n prefix: 'fas',\n iconName: 'table-tennis',\n icon: [512, 512, [], \"f45d\", \"M496.2 296.5C527.7 218.7 512 126.2 449 63.1 365.1-21 229-21 145.1 63.1l-56 56.1 211.5 211.5c46.1-62.1 131.5-77.4 195.6-34.2zm-217.9 79.7L57.9 155.9c-27.3 45.3-21.7 105 17.3 144.1l34.5 34.6L6.7 424c-8.6 7.5-9.1 20.7-1 28.8l53.4 53.5c8 8.1 21.2 7.6 28.7-1L177.1 402l35.7 35.7c19.7 19.7 44.6 30.5 70.3 33.3-7.1-17-11-35.6-11-55.1-.1-13.8 2.5-27 6.2-39.7zM416 320c-53 0-96 43-96 96s43 96 96 96 96-43 96-96-43-96-96-96z\"]\n};\nvar faTablet = {\n prefix: 'fas',\n iconName: 'tablet',\n icon: [448, 512, [], \"f10a\", \"M400 0H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V48c0-26.5-21.5-48-48-48zM224 480c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32z\"]\n};\nvar faTabletAlt = {\n prefix: 'fas',\n iconName: 'tablet-alt',\n icon: [448, 512, [], \"f3fa\", \"M400 0H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V48c0-26.5-21.5-48-48-48zM224 480c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32zm176-108c0 6.6-5.4 12-12 12H60c-6.6 0-12-5.4-12-12V60c0-6.6 5.4-12 12-12h328c6.6 0 12 5.4 12 12v312z\"]\n};\nvar faTablets = {\n prefix: 'fas',\n iconName: 'tablets',\n icon: [640, 512, [], \"f490\", \"M160 192C78.9 192 12.5 250.5.1 326.7c-.8 4.8 3.3 9.3 8.3 9.3h303.3c5 0 9.1-4.5 8.3-9.3C307.5 250.5 241.1 192 160 192zm151.6 176H8.4c-5 0-9.1 4.5-8.3 9.3C12.5 453.5 78.9 512 160 512s147.5-58.5 159.9-134.7c.8-4.8-3.3-9.3-8.3-9.3zM593.4 46.6c-56.5-56.5-144.2-61.4-206.9-16-4 2.9-4.3 8.9-.8 12.3L597 254.3c3.5 3.5 9.5 3.2 12.3-.8 45.5-62.7 40.6-150.4-15.9-206.9zM363 65.7c-3.5-3.5-9.5-3.2-12.3.8-45.4 62.7-40.5 150.4 15.9 206.9 56.5 56.5 144.2 61.4 206.9 15.9 4-2.9 4.3-8.9.8-12.3L363 65.7z\"]\n};\nvar faTachometerAlt = {\n prefix: 'fas',\n iconName: 'tachometer-alt',\n icon: [576, 512, [], \"f3fd\", \"M288 32C128.94 32 0 160.94 0 320c0 52.8 14.25 102.26 39.06 144.8 5.61 9.62 16.3 15.2 27.44 15.2h443c11.14 0 21.83-5.58 27.44-15.2C561.75 422.26 576 372.8 576 320c0-159.06-128.94-288-288-288zm0 64c14.71 0 26.58 10.13 30.32 23.65-1.11 2.26-2.64 4.23-3.45 6.67l-9.22 27.67c-5.13 3.49-10.97 6.01-17.64 6.01-17.67 0-32-14.33-32-32S270.33 96 288 96zM96 384c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm48-160c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm246.77-72.41l-61.33 184C343.13 347.33 352 364.54 352 384c0 11.72-3.38 22.55-8.88 32H232.88c-5.5-9.45-8.88-20.28-8.88-32 0-33.94 26.5-61.43 59.9-63.59l61.34-184.01c4.17-12.56 17.73-19.45 30.36-15.17 12.57 4.19 19.35 17.79 15.17 30.36zm14.66 57.2l15.52-46.55c3.47-1.29 7.13-2.23 11.05-2.23 17.67 0 32 14.33 32 32s-14.33 32-32 32c-11.38-.01-20.89-6.28-26.57-15.22zM480 384c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32z\"]\n};\nvar faTag = {\n prefix: 'fas',\n iconName: 'tag',\n icon: [512, 512, [], \"f02b\", \"M0 252.118V48C0 21.49 21.49 0 48 0h204.118a48 48 0 0 1 33.941 14.059l211.882 211.882c18.745 18.745 18.745 49.137 0 67.882L293.823 497.941c-18.745 18.745-49.137 18.745-67.882 0L14.059 286.059A48 48 0 0 1 0 252.118zM112 64c-26.51 0-48 21.49-48 48s21.49 48 48 48 48-21.49 48-48-21.49-48-48-48z\"]\n};\nvar faTags = {\n prefix: 'fas',\n iconName: 'tags',\n icon: [640, 512, [], \"f02c\", \"M497.941 225.941L286.059 14.059A48 48 0 0 0 252.118 0H48C21.49 0 0 21.49 0 48v204.118a48 48 0 0 0 14.059 33.941l211.882 211.882c18.744 18.745 49.136 18.746 67.882 0l204.118-204.118c18.745-18.745 18.745-49.137 0-67.882zM112 160c-26.51 0-48-21.49-48-48s21.49-48 48-48 48 21.49 48 48-21.49 48-48 48zm513.941 133.823L421.823 497.941c-18.745 18.745-49.137 18.745-67.882 0l-.36-.36L527.64 323.522c16.999-16.999 26.36-39.6 26.36-63.64s-9.362-46.641-26.36-63.64L331.397 0h48.721a48 48 0 0 1 33.941 14.059l211.882 211.882c18.745 18.745 18.745 49.137 0 67.882z\"]\n};\nvar faTape = {\n prefix: 'fas',\n iconName: 'tape',\n icon: [640, 512, [], \"f4db\", \"M224 192c-35.3 0-64 28.7-64 64s28.7 64 64 64 64-28.7 64-64-28.7-64-64-64zm400 224H380.6c41.5-40.7 67.4-97.3 67.4-160 0-123.7-100.3-224-224-224S0 132.3 0 256s100.3 224 224 224h400c8.8 0 16-7.2 16-16v-32c0-8.8-7.2-16-16-16zm-400-64c-53 0-96-43-96-96s43-96 96-96 96 43 96 96-43 96-96 96z\"]\n};\nvar faTasks = {\n prefix: 'fas',\n iconName: 'tasks',\n icon: [512, 512, [], \"f0ae\", \"M208 132h288c8.8 0 16-7.2 16-16V76c0-8.8-7.2-16-16-16H208c-8.8 0-16 7.2-16 16v40c0 8.8 7.2 16 16 16zm0 160h288c8.8 0 16-7.2 16-16v-40c0-8.8-7.2-16-16-16H208c-8.8 0-16 7.2-16 16v40c0 8.8 7.2 16 16 16zm0 160h288c8.8 0 16-7.2 16-16v-40c0-8.8-7.2-16-16-16H208c-8.8 0-16 7.2-16 16v40c0 8.8 7.2 16 16 16zM64 368c-26.5 0-48.6 21.5-48.6 48s22.1 48 48.6 48 48-21.5 48-48-21.5-48-48-48zm92.5-299l-72.2 72.2-15.6 15.6c-4.7 4.7-12.9 4.7-17.6 0L3.5 109.4c-4.7-4.7-4.7-12.3 0-17l15.7-15.7c4.7-4.7 12.3-4.7 17 0l22.7 22.1 63.7-63.3c4.7-4.7 12.3-4.7 17 0l17 16.5c4.6 4.7 4.6 12.3-.1 17zm0 159.6l-72.2 72.2-15.7 15.7c-4.7 4.7-12.9 4.7-17.6 0L3.5 269c-4.7-4.7-4.7-12.3 0-17l15.7-15.7c4.7-4.7 12.3-4.7 17 0l22.7 22.1 63.7-63.7c4.7-4.7 12.3-4.7 17 0l17 17c4.6 4.6 4.6 12.2-.1 16.9z\"]\n};\nvar faTaxi = {\n prefix: 'fas',\n iconName: 'taxi',\n icon: [512, 512, [], \"f1ba\", \"M462 241.64l-22-84.84c-9.6-35.2-41.6-60.8-76.8-60.8H352V64c0-17.67-14.33-32-32-32H192c-17.67 0-32 14.33-32 32v32h-11.2c-35.2 0-67.2 25.6-76.8 60.8l-22 84.84C21.41 248.04 0 273.47 0 304v48c0 23.63 12.95 44.04 32 55.12V448c0 17.67 14.33 32 32 32h32c17.67 0 32-14.33 32-32v-32h256v32c0 17.67 14.33 32 32 32h32c17.67 0 32-14.33 32-32v-40.88c19.05-11.09 32-31.5 32-55.12v-48c0-30.53-21.41-55.96-50-62.36zM96 352c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm20.55-112l17.2-66.36c2.23-8.16 9.59-13.64 15.06-13.64h214.4c5.47 0 12.83 5.48 14.85 12.86L395.45 240h-278.9zM416 352c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32z\"]\n};\nvar faTeeth = {\n prefix: 'fas',\n iconName: 'teeth',\n icon: [640, 512, [], \"f62e\", \"M544 0H96C42.98 0 0 42.98 0 96v320c0 53.02 42.98 96 96 96h448c53.02 0 96-42.98 96-96V96c0-53.02-42.98-96-96-96zM160 368c0 26.51-21.49 48-48 48s-48-21.49-48-48v-64c0-8.84 7.16-16 16-16h64c8.84 0 16 7.16 16 16v64zm0-128c0 8.84-7.16 16-16 16H80c-8.84 0-16-7.16-16-16v-64c0-26.51 21.49-48 48-48s48 21.49 48 48v64zm144 120c0 30.93-25.07 56-56 56s-56-25.07-56-56v-56c0-8.84 7.16-16 16-16h80c8.84 0 16 7.16 16 16v56zm0-120c0 8.84-7.16 16-16 16h-80c-8.84 0-16-7.16-16-16v-88c0-30.93 25.07-56 56-56s56 25.07 56 56v88zm144 120c0 30.93-25.07 56-56 56s-56-25.07-56-56v-56c0-8.84 7.16-16 16-16h80c8.84 0 16 7.16 16 16v56zm0-120c0 8.84-7.16 16-16 16h-80c-8.84 0-16-7.16-16-16v-88c0-30.93 25.07-56 56-56s56 25.07 56 56v88zm128 128c0 26.51-21.49 48-48 48s-48-21.49-48-48v-64c0-8.84 7.16-16 16-16h64c8.84 0 16 7.16 16 16v64zm0-128c0 8.84-7.16 16-16 16h-64c-8.84 0-16-7.16-16-16v-64c0-26.51 21.49-48 48-48s48 21.49 48 48v64z\"]\n};\nvar faTeethOpen = {\n prefix: 'fas',\n iconName: 'teeth-open',\n icon: [640, 512, [], \"f62f\", \"M544 0H96C42.98 0 0 42.98 0 96v64c0 35.35 28.66 64 64 64h512c35.34 0 64-28.65 64-64V96c0-53.02-42.98-96-96-96zM160 176c0 8.84-7.16 16-16 16H80c-8.84 0-16-7.16-16-16v-32c0-26.51 21.49-48 48-48s48 21.49 48 48v32zm144 0c0 8.84-7.16 16-16 16h-80c-8.84 0-16-7.16-16-16v-56c0-30.93 25.07-56 56-56s56 25.07 56 56v56zm144 0c0 8.84-7.16 16-16 16h-80c-8.84 0-16-7.16-16-16v-56c0-30.93 25.07-56 56-56s56 25.07 56 56v56zm128 0c0 8.84-7.16 16-16 16h-64c-8.84 0-16-7.16-16-16v-32c0-26.51 21.49-48 48-48s48 21.49 48 48v32zm0 144H64c-35.34 0-64 28.65-64 64v32c0 53.02 42.98 96 96 96h448c53.02 0 96-42.98 96-96v-32c0-35.35-28.66-64-64-64zm-416 80c0 26.51-21.49 48-48 48s-48-21.49-48-48v-32c0-8.84 7.16-16 16-16h64c8.84 0 16 7.16 16 16v32zm144-8c0 30.93-25.07 56-56 56s-56-25.07-56-56v-24c0-8.84 7.16-16 16-16h80c8.84 0 16 7.16 16 16v24zm144 0c0 30.93-25.07 56-56 56s-56-25.07-56-56v-24c0-8.84 7.16-16 16-16h80c8.84 0 16 7.16 16 16v24zm128 8c0 26.51-21.49 48-48 48s-48-21.49-48-48v-32c0-8.84 7.16-16 16-16h64c8.84 0 16 7.16 16 16v32z\"]\n};\nvar faTemperatureHigh = {\n prefix: 'fas',\n iconName: 'temperature-high',\n icon: [512, 512, [], \"f769\", \"M416 0c-52.9 0-96 43.1-96 96s43.1 96 96 96 96-43.1 96-96-43.1-96-96-96zm0 128c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32zm-160-16C256 50.1 205.9 0 144 0S32 50.1 32 112v166.5C12.3 303.2 0 334 0 368c0 79.5 64.5 144 144 144s144-64.5 144-144c0-34-12.3-64.9-32-89.5V112zM144 448c-44.1 0-80-35.9-80-80 0-25.5 12.2-48.9 32-63.8V112c0-26.5 21.5-48 48-48s48 21.5 48 48v192.2c19.8 14.8 32 38.3 32 63.8 0 44.1-35.9 80-80 80zm16-125.1V112c0-8.8-7.2-16-16-16s-16 7.2-16 16v210.9c-18.6 6.6-32 24.2-32 45.1 0 26.5 21.5 48 48 48s48-21.5 48-48c0-20.9-13.4-38.5-32-45.1z\"]\n};\nvar faTemperatureLow = {\n prefix: 'fas',\n iconName: 'temperature-low',\n icon: [512, 512, [], \"f76b\", \"M416 0c-52.9 0-96 43.1-96 96s43.1 96 96 96 96-43.1 96-96-43.1-96-96-96zm0 128c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32zm-160-16C256 50.1 205.9 0 144 0S32 50.1 32 112v166.5C12.3 303.2 0 334 0 368c0 79.5 64.5 144 144 144s144-64.5 144-144c0-34-12.3-64.9-32-89.5V112zM144 448c-44.1 0-80-35.9-80-80 0-25.5 12.2-48.9 32-63.8V112c0-26.5 21.5-48 48-48s48 21.5 48 48v192.2c19.8 14.8 32 38.3 32 63.8 0 44.1-35.9 80-80 80zm16-125.1V304c0-8.8-7.2-16-16-16s-16 7.2-16 16v18.9c-18.6 6.6-32 24.2-32 45.1 0 26.5 21.5 48 48 48s48-21.5 48-48c0-20.9-13.4-38.5-32-45.1z\"]\n};\nvar faTenge = {\n prefix: 'fas',\n iconName: 'tenge',\n icon: [384, 512, [], \"f7d7\", \"M372 160H12c-6.6 0-12 5.4-12 12v56c0 6.6 5.4 12 12 12h140v228c0 6.6 5.4 12 12 12h56c6.6 0 12-5.4 12-12V240h140c6.6 0 12-5.4 12-12v-56c0-6.6-5.4-12-12-12zm0-128H12C5.4 32 0 37.4 0 44v56c0 6.6 5.4 12 12 12h360c6.6 0 12-5.4 12-12V44c0-6.6-5.4-12-12-12z\"]\n};\nvar faTerminal = {\n prefix: 'fas',\n iconName: 'terminal',\n icon: [640, 512, [], \"f120\", \"M257.981 272.971L63.638 467.314c-9.373 9.373-24.569 9.373-33.941 0L7.029 444.647c-9.357-9.357-9.375-24.522-.04-33.901L161.011 256 6.99 101.255c-9.335-9.379-9.317-24.544.04-33.901l22.667-22.667c9.373-9.373 24.569-9.373 33.941 0L257.981 239.03c9.373 9.372 9.373 24.568 0 33.941zM640 456v-32c0-13.255-10.745-24-24-24H312c-13.255 0-24 10.745-24 24v32c0 13.255 10.745 24 24 24h304c13.255 0 24-10.745 24-24z\"]\n};\nvar faTextHeight = {\n prefix: 'fas',\n iconName: 'text-height',\n icon: [576, 512, [], \"f034\", \"M16 32h288c8.837 0 16 7.163 16 16v96c0 8.837-7.163 16-16 16h-35.496c-8.837 0-16-7.163-16-16V96h-54.761v320H232c8.837 0 16 7.163 16 16v32c0 8.837-7.163 16-16 16H88c-8.837 0-16-7.163-16-16v-32c0-8.837 7.163-16 16-16h34.257V96H67.496v48c0 8.837-7.163 16-16 16H16c-8.837 0-16-7.163-16-16V48c0-8.837 7.163-16 16-16zm475.308 4.685l79.995 80.001C581.309 126.693 574.297 144 559.99 144H512v224h48c15.639 0 20.635 17.991 11.313 27.314l-79.995 80.001c-6.247 6.247-16.381 6.245-22.626 0l-79.995-80.001C378.691 385.307 385.703 368 400.01 368H448V144h-48c-15.639 0-20.635-17.991-11.313-27.314l79.995-80.001c6.247-6.248 16.381-6.245 22.626 0z\"]\n};\nvar faTextWidth = {\n prefix: 'fas',\n iconName: 'text-width',\n icon: [448, 512, [], \"f035\", \"M16 32h416c8.837 0 16 7.163 16 16v96c0 8.837-7.163 16-16 16h-35.496c-8.837 0-16-7.163-16-16V96H261.743v128H296c8.837 0 16 7.163 16 16v32c0 8.837-7.163 16-16 16H152c-8.837 0-16-7.163-16-16v-32c0-8.837 7.163-16 16-16h34.257V96H67.496v48c0 8.837-7.163 16-16 16H16c-8.837 0-16-7.163-16-16V48c0-8.837 7.163-16 16-16zm427.315 340.682l-80.001-79.995C353.991 283.365 336 288.362 336 304v48H112v-47.99c0-14.307-17.307-21.319-27.314-11.313L4.685 372.692c-6.245 6.245-6.247 16.379 0 22.626l80.001 79.995C94.009 484.635 112 479.638 112 464v-48h224v47.99c0 14.307 17.307 21.319 27.314 11.313l80.001-79.995c6.245-6.245 6.248-16.379 0-22.626z\"]\n};\nvar faTh = {\n prefix: 'fas',\n iconName: 'th',\n icon: [512, 512, [], \"f00a\", \"M149.333 56v80c0 13.255-10.745 24-24 24H24c-13.255 0-24-10.745-24-24V56c0-13.255 10.745-24 24-24h101.333c13.255 0 24 10.745 24 24zm181.334 240v-80c0-13.255-10.745-24-24-24H205.333c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24h101.333c13.256 0 24.001-10.745 24.001-24zm32-240v80c0 13.255 10.745 24 24 24H488c13.255 0 24-10.745 24-24V56c0-13.255-10.745-24-24-24H386.667c-13.255 0-24 10.745-24 24zm-32 80V56c0-13.255-10.745-24-24-24H205.333c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24h101.333c13.256 0 24.001-10.745 24.001-24zm-205.334 56H24c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24h101.333c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24zM0 376v80c0 13.255 10.745 24 24 24h101.333c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24H24c-13.255 0-24 10.745-24 24zm386.667-56H488c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24H386.667c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24zm0 160H488c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24H386.667c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24zM181.333 376v80c0 13.255 10.745 24 24 24h101.333c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24H205.333c-13.255 0-24 10.745-24 24z\"]\n};\nvar faThLarge = {\n prefix: 'fas',\n iconName: 'th-large',\n icon: [512, 512, [], \"f009\", \"M296 32h192c13.255 0 24 10.745 24 24v160c0 13.255-10.745 24-24 24H296c-13.255 0-24-10.745-24-24V56c0-13.255 10.745-24 24-24zm-80 0H24C10.745 32 0 42.745 0 56v160c0 13.255 10.745 24 24 24h192c13.255 0 24-10.745 24-24V56c0-13.255-10.745-24-24-24zM0 296v160c0 13.255 10.745 24 24 24h192c13.255 0 24-10.745 24-24V296c0-13.255-10.745-24-24-24H24c-13.255 0-24 10.745-24 24zm296 184h192c13.255 0 24-10.745 24-24V296c0-13.255-10.745-24-24-24H296c-13.255 0-24 10.745-24 24v160c0 13.255 10.745 24 24 24z\"]\n};\nvar faThList = {\n prefix: 'fas',\n iconName: 'th-list',\n icon: [512, 512, [], \"f00b\", \"M149.333 216v80c0 13.255-10.745 24-24 24H24c-13.255 0-24-10.745-24-24v-80c0-13.255 10.745-24 24-24h101.333c13.255 0 24 10.745 24 24zM0 376v80c0 13.255 10.745 24 24 24h101.333c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24H24c-13.255 0-24 10.745-24 24zM125.333 32H24C10.745 32 0 42.745 0 56v80c0 13.255 10.745 24 24 24h101.333c13.255 0 24-10.745 24-24V56c0-13.255-10.745-24-24-24zm80 448H488c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24H205.333c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24zm-24-424v80c0 13.255 10.745 24 24 24H488c13.255 0 24-10.745 24-24V56c0-13.255-10.745-24-24-24H205.333c-13.255 0-24 10.745-24 24zm24 264H488c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24H205.333c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24z\"]\n};\nvar faTheaterMasks = {\n prefix: 'fas',\n iconName: 'theater-masks',\n icon: [640, 512, [], \"f630\", \"M206.86 245.15c-35.88 10.45-59.95 41.2-57.53 74.1 11.4-12.72 28.81-23.7 49.9-30.92l7.63-43.18zM95.81 295L64.08 115.49c-.29-1.62.28-2.62.24-2.65 57.76-32.06 123.12-49.01 189.01-49.01 1.61 0 3.23.17 4.85.19 13.95-13.47 31.73-22.83 51.59-26 18.89-3.02 38.05-4.55 57.18-5.32-9.99-13.95-24.48-24.23-41.77-27C301.27 1.89 277.24 0 253.32 0 176.66 0 101.02 19.42 33.2 57.06 9.03 70.48-3.92 98.48 1.05 126.58l31.73 179.51c14.23 80.52 136.33 142.08 204.45 142.08 3.59 0 6.75-.46 10.01-.8-13.52-17.08-28.94-40.48-39.5-67.58-47.61-12.98-106.06-51.62-111.93-84.79zm97.55-137.46c-.73-4.12-2.23-7.87-4.07-11.4-8.25 8.91-20.67 15.75-35.32 18.32-14.65 2.58-28.67.4-39.48-5.17-.52 3.94-.64 7.98.09 12.1 3.84 21.7 24.58 36.19 46.34 32.37 21.75-3.82 36.28-24.52 32.44-46.22zM606.8 120.9c-88.98-49.38-191.43-67.41-291.98-51.35-27.31 4.36-49.08 26.26-54.04 54.36l-31.73 179.51c-15.39 87.05 95.28 196.27 158.31 207.35 63.03 11.09 204.47-53.79 219.86-140.84l31.73-179.51c4.97-28.11-7.98-56.11-32.15-69.52zm-273.24 96.8c3.84-21.7 24.58-36.19 46.34-32.36 21.76 3.83 36.28 24.52 32.45 46.22-.73 4.12-2.23 7.87-4.07 11.4-8.25-8.91-20.67-15.75-35.32-18.32-14.65-2.58-28.67-.4-39.48 5.17-.53-3.95-.65-7.99.08-12.11zm70.47 198.76c-55.68-9.79-93.52-59.27-89.04-112.9 20.6 25.54 56.21 46.17 99.49 53.78 43.28 7.61 83.82.37 111.93-16.6-14.18 51.94-66.71 85.51-122.38 75.72zm130.3-151.34c-8.25-8.91-20.68-15.75-35.33-18.32-14.65-2.58-28.67-.4-39.48 5.17-.52-3.94-.64-7.98.09-12.1 3.84-21.7 24.58-36.19 46.34-32.37 21.75 3.83 36.28 24.52 32.45 46.22-.73 4.13-2.23 7.88-4.07 11.4z\"]\n};\nvar faThermometer = {\n prefix: 'fas',\n iconName: 'thermometer',\n icon: [512, 512, [], \"f491\", \"M476.8 20.4c-37.5-30.7-95.5-26.3-131.9 10.2l-45.7 46 50.5 50.5c3.1 3.1 3.1 8.2 0 11.3l-11.3 11.3c-3.1 3.1-8.2 3.1-11.3 0l-50.4-50.5-45.1 45.4 50.3 50.4c3.1 3.1 3.1 8.2 0 11.3l-11.3 11.3c-3.1 3.1-8.2 3.1-11.3 0L209 167.4l-45.1 45.4L214 263c3.1 3.1 3.1 8.2 0 11.3l-11.3 11.3c-3.1 3.1-8.2 3.1-11.3 0l-50.1-50.2L96 281.1V382L7 471c-9.4 9.4-9.4 24.6 0 33.9 9.4 9.4 24.6 9.4 33.9 0l89-89h99.9L484 162.6c34.9-34.9 42.2-101.5-7.2-142.2z\"]\n};\nvar faThermometerEmpty = {\n prefix: 'fas',\n iconName: 'thermometer-empty',\n icon: [256, 512, [], \"f2cb\", \"M192 384c0 35.346-28.654 64-64 64s-64-28.654-64-64c0-35.346 28.654-64 64-64s64 28.654 64 64zm32-84.653c19.912 22.563 32 52.194 32 84.653 0 70.696-57.303 128-128 128-.299 0-.609-.001-.909-.003C56.789 511.509-.357 453.636.002 383.333.166 351.135 12.225 321.755 32 299.347V96c0-53.019 42.981-96 96-96s96 42.981 96 96v203.347zM208 384c0-34.339-19.37-52.19-32-66.502V96c0-26.467-21.533-48-48-48S80 69.533 80 96v221.498c-12.732 14.428-31.825 32.1-31.999 66.08-.224 43.876 35.563 80.116 79.423 80.42L128 464c44.112 0 80-35.888 80-80z\"]\n};\nvar faThermometerFull = {\n prefix: 'fas',\n iconName: 'thermometer-full',\n icon: [256, 512, [], \"f2c7\", \"M224 96c0-53.019-42.981-96-96-96S32 42.981 32 96v203.347C12.225 321.756.166 351.136.002 383.333c-.359 70.303 56.787 128.176 127.089 128.664.299.002.61.003.909.003 70.698 0 128-57.304 128-128 0-32.459-12.088-62.09-32-84.653V96zm-96 368l-.576-.002c-43.86-.304-79.647-36.544-79.423-80.42.173-33.98 19.266-51.652 31.999-66.08V96c0-26.467 21.533-48 48-48s48 21.533 48 48v221.498c12.63 14.312 32 32.164 32 66.502 0 44.112-35.888 80-80 80zm64-80c0 35.346-28.654 64-64 64s-64-28.654-64-64c0-23.685 12.876-44.349 32-55.417V96c0-17.673 14.327-32 32-32s32 14.327 32 32v232.583c19.124 11.068 32 31.732 32 55.417z\"]\n};\nvar faThermometerHalf = {\n prefix: 'fas',\n iconName: 'thermometer-half',\n icon: [256, 512, [], \"f2c9\", \"M192 384c0 35.346-28.654 64-64 64s-64-28.654-64-64c0-23.685 12.876-44.349 32-55.417V224c0-17.673 14.327-32 32-32s32 14.327 32 32v104.583c19.124 11.068 32 31.732 32 55.417zm32-84.653c19.912 22.563 32 52.194 32 84.653 0 70.696-57.303 128-128 128-.299 0-.609-.001-.909-.003C56.789 511.509-.357 453.636.002 383.333.166 351.135 12.225 321.755 32 299.347V96c0-53.019 42.981-96 96-96s96 42.981 96 96v203.347zM208 384c0-34.339-19.37-52.19-32-66.502V96c0-26.467-21.533-48-48-48S80 69.533 80 96v221.498c-12.732 14.428-31.825 32.1-31.999 66.08-.224 43.876 35.563 80.116 79.423 80.42L128 464c44.112 0 80-35.888 80-80z\"]\n};\nvar faThermometerQuarter = {\n prefix: 'fas',\n iconName: 'thermometer-quarter',\n icon: [256, 512, [], \"f2ca\", \"M192 384c0 35.346-28.654 64-64 64s-64-28.654-64-64c0-23.685 12.876-44.349 32-55.417V288c0-17.673 14.327-32 32-32s32 14.327 32 32v40.583c19.124 11.068 32 31.732 32 55.417zm32-84.653c19.912 22.563 32 52.194 32 84.653 0 70.696-57.303 128-128 128-.299 0-.609-.001-.909-.003C56.789 511.509-.357 453.636.002 383.333.166 351.135 12.225 321.755 32 299.347V96c0-53.019 42.981-96 96-96s96 42.981 96 96v203.347zM208 384c0-34.339-19.37-52.19-32-66.502V96c0-26.467-21.533-48-48-48S80 69.533 80 96v221.498c-12.732 14.428-31.825 32.1-31.999 66.08-.224 43.876 35.563 80.116 79.423 80.42L128 464c44.112 0 80-35.888 80-80z\"]\n};\nvar faThermometerThreeQuarters = {\n prefix: 'fas',\n iconName: 'thermometer-three-quarters',\n icon: [256, 512, [], \"f2c8\", \"M192 384c0 35.346-28.654 64-64 64-35.346 0-64-28.654-64-64 0-23.685 12.876-44.349 32-55.417V160c0-17.673 14.327-32 32-32s32 14.327 32 32v168.583c19.124 11.068 32 31.732 32 55.417zm32-84.653c19.912 22.563 32 52.194 32 84.653 0 70.696-57.303 128-128 128-.299 0-.609-.001-.909-.003C56.789 511.509-.357 453.636.002 383.333.166 351.135 12.225 321.755 32 299.347V96c0-53.019 42.981-96 96-96s96 42.981 96 96v203.347zM208 384c0-34.339-19.37-52.19-32-66.502V96c0-26.467-21.533-48-48-48S80 69.533 80 96v221.498c-12.732 14.428-31.825 32.1-31.999 66.08-.224 43.876 35.563 80.116 79.423 80.42L128 464c44.112 0 80-35.888 80-80z\"]\n};\nvar faThumbsDown = {\n prefix: 'fas',\n iconName: 'thumbs-down',\n icon: [512, 512, [], \"f165\", \"M0 56v240c0 13.255 10.745 24 24 24h80c13.255 0 24-10.745 24-24V56c0-13.255-10.745-24-24-24H24C10.745 32 0 42.745 0 56zm40 200c0-13.255 10.745-24 24-24s24 10.745 24 24-10.745 24-24 24-24-10.745-24-24zm272 256c-20.183 0-29.485-39.293-33.931-57.795-5.206-21.666-10.589-44.07-25.393-58.902-32.469-32.524-49.503-73.967-89.117-113.111a11.98 11.98 0 0 1-3.558-8.521V59.901c0-6.541 5.243-11.878 11.783-11.998 15.831-.29 36.694-9.079 52.651-16.178C256.189 17.598 295.709.017 343.995 0h2.844c42.777 0 93.363.413 113.774 29.737 8.392 12.057 10.446 27.034 6.148 44.632 16.312 17.053 25.063 48.863 16.382 74.757 17.544 23.432 19.143 56.132 9.308 79.469l.11.11c11.893 11.949 19.523 31.259 19.439 49.197-.156 30.352-26.157 58.098-59.553 58.098H350.723C358.03 364.34 384 388.132 384 430.548 384 504 336 512 312 512z\"]\n};\nvar faThumbsUp = {\n prefix: 'fas',\n iconName: 'thumbs-up',\n icon: [512, 512, [], \"f164\", \"M104 224H24c-13.255 0-24 10.745-24 24v240c0 13.255 10.745 24 24 24h80c13.255 0 24-10.745 24-24V248c0-13.255-10.745-24-24-24zM64 472c-13.255 0-24-10.745-24-24s10.745-24 24-24 24 10.745 24 24-10.745 24-24 24zM384 81.452c0 42.416-25.97 66.208-33.277 94.548h101.723c33.397 0 59.397 27.746 59.553 58.098.084 17.938-7.546 37.249-19.439 49.197l-.11.11c9.836 23.337 8.237 56.037-9.308 79.469 8.681 25.895-.069 57.704-16.382 74.757 4.298 17.598 2.244 32.575-6.148 44.632C440.202 511.587 389.616 512 346.839 512l-2.845-.001c-48.287-.017-87.806-17.598-119.56-31.725-15.957-7.099-36.821-15.887-52.651-16.178-6.54-.12-11.783-5.457-11.783-11.998v-213.77c0-3.2 1.282-6.271 3.558-8.521 39.614-39.144 56.648-80.587 89.117-113.111 14.804-14.832 20.188-37.236 25.393-58.902C282.515 39.293 291.817 0 312 0c24 0 72 8 72 81.452z\"]\n};\nvar faThumbtack = {\n prefix: 'fas',\n iconName: 'thumbtack',\n icon: [384, 512, [], \"f08d\", \"M298.028 214.267L285.793 96H328c13.255 0 24-10.745 24-24V24c0-13.255-10.745-24-24-24H56C42.745 0 32 10.745 32 24v48c0 13.255 10.745 24 24 24h42.207L85.972 214.267C37.465 236.82 0 277.261 0 328c0 13.255 10.745 24 24 24h136v104.007c0 1.242.289 2.467.845 3.578l24 48c2.941 5.882 11.364 5.893 14.311 0l24-48a8.008 8.008 0 0 0 .845-3.578V352h136c13.255 0 24-10.745 24-24-.001-51.183-37.983-91.42-85.973-113.733z\"]\n};\nvar faTicketAlt = {\n prefix: 'fas',\n iconName: 'ticket-alt',\n icon: [576, 512, [], \"f3ff\", \"M128 160h320v192H128V160zm400 96c0 26.51 21.49 48 48 48v96c0 26.51-21.49 48-48 48H48c-26.51 0-48-21.49-48-48v-96c26.51 0 48-21.49 48-48s-21.49-48-48-48v-96c0-26.51 21.49-48 48-48h480c26.51 0 48 21.49 48 48v96c-26.51 0-48 21.49-48 48zm-48-104c0-13.255-10.745-24-24-24H120c-13.255 0-24 10.745-24 24v208c0 13.255 10.745 24 24 24h336c13.255 0 24-10.745 24-24V152z\"]\n};\nvar faTimes = {\n prefix: 'fas',\n iconName: 'times',\n icon: [352, 512, [], \"f00d\", \"M242.72 256l100.07-100.07c12.28-12.28 12.28-32.19 0-44.48l-22.24-22.24c-12.28-12.28-32.19-12.28-44.48 0L176 189.28 75.93 89.21c-12.28-12.28-32.19-12.28-44.48 0L9.21 111.45c-12.28 12.28-12.28 32.19 0 44.48L109.28 256 9.21 356.07c-12.28 12.28-12.28 32.19 0 44.48l22.24 22.24c12.28 12.28 32.2 12.28 44.48 0L176 322.72l100.07 100.07c12.28 12.28 32.2 12.28 44.48 0l22.24-22.24c12.28-12.28 12.28-32.19 0-44.48L242.72 256z\"]\n};\nvar faTimesCircle = {\n prefix: 'fas',\n iconName: 'times-circle',\n icon: [512, 512, [], \"f057\", \"M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm121.6 313.1c4.7 4.7 4.7 12.3 0 17L338 377.6c-4.7 4.7-12.3 4.7-17 0L256 312l-65.1 65.6c-4.7 4.7-12.3 4.7-17 0L134.4 338c-4.7-4.7-4.7-12.3 0-17l65.6-65-65.6-65.1c-4.7-4.7-4.7-12.3 0-17l39.6-39.6c4.7-4.7 12.3-4.7 17 0l65 65.7 65.1-65.6c4.7-4.7 12.3-4.7 17 0l39.6 39.6c4.7 4.7 4.7 12.3 0 17L312 256l65.6 65.1z\"]\n};\nvar faTint = {\n prefix: 'fas',\n iconName: 'tint',\n icon: [352, 512, [], \"f043\", \"M205.22 22.09c-7.94-28.78-49.44-30.12-58.44 0C100.01 179.85 0 222.72 0 333.91 0 432.35 78.72 512 176 512s176-79.65 176-178.09c0-111.75-99.79-153.34-146.78-311.82zM176 448c-61.75 0-112-50.25-112-112 0-8.84 7.16-16 16-16s16 7.16 16 16c0 44.11 35.89 80 80 80 8.84 0 16 7.16 16 16s-7.16 16-16 16z\"]\n};\nvar faTintSlash = {\n prefix: 'fas',\n iconName: 'tint-slash',\n icon: [640, 512, [], \"f5c7\", \"M633.82 458.1L494.97 350.78c.52-5.57 1.03-11.16 1.03-16.87 0-111.76-99.79-153.34-146.78-311.82-7.94-28.78-49.44-30.12-58.44 0-15.52 52.34-36.87 91.96-58.49 125.68L45.47 3.37C38.49-2.05 28.43-.8 23.01 6.18L3.37 31.45C-2.05 38.42-.8 48.47 6.18 53.9l588.36 454.73c6.98 5.43 17.03 4.17 22.46-2.81l19.64-25.27c5.41-6.97 4.16-17.02-2.82-22.45zM144 333.91C144 432.35 222.72 512 320 512c44.71 0 85.37-16.96 116.4-44.7L162.72 255.78c-11.41 23.5-18.72 48.35-18.72 78.13z\"]\n};\nvar faTired = {\n prefix: 'fas',\n iconName: 'tired',\n icon: [496, 512, [], \"f5c8\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm33.8 189.7l80-48c11.6-6.9 24 7.7 15.4 18L343.6 208l33.6 40.3c8.7 10.4-3.9 24.8-15.4 18l-80-48c-7.7-4.7-7.7-15.9 0-20.6zm-163-30c-8.6-10.3 3.8-24.9 15.4-18l80 48c7.8 4.7 7.8 15.9 0 20.6l-80 48c-11.5 6.8-24-7.6-15.4-18l33.6-40.3-33.6-40.3zM248 288c51.9 0 115.3 43.8 123.2 106.7 1.7 13.6-8 24.6-17.7 20.4-25.9-11.1-64.4-17.4-105.5-17.4s-79.6 6.3-105.5 17.4c-9.8 4.2-19.4-7-17.7-20.4C132.7 331.8 196.1 288 248 288z\"]\n};\nvar faToggleOff = {\n prefix: 'fas',\n iconName: 'toggle-off',\n icon: [576, 512, [], \"f204\", \"M384 64H192C85.961 64 0 149.961 0 256s85.961 192 192 192h192c106.039 0 192-85.961 192-192S490.039 64 384 64zM64 256c0-70.741 57.249-128 128-128 70.741 0 128 57.249 128 128 0 70.741-57.249 128-128 128-70.741 0-128-57.249-128-128zm320 128h-48.905c65.217-72.858 65.236-183.12 0-256H384c70.741 0 128 57.249 128 128 0 70.74-57.249 128-128 128z\"]\n};\nvar faToggleOn = {\n prefix: 'fas',\n iconName: 'toggle-on',\n icon: [576, 512, [], \"f205\", \"M384 64H192C86 64 0 150 0 256s86 192 192 192h192c106 0 192-86 192-192S490 64 384 64zm0 320c-70.8 0-128-57.3-128-128 0-70.8 57.3-128 128-128 70.8 0 128 57.3 128 128 0 70.8-57.3 128-128 128z\"]\n};\nvar faToilet = {\n prefix: 'fas',\n iconName: 'toilet',\n icon: [384, 512, [], \"f7d8\", \"M368 48c8.8 0 16-7.2 16-16V16c0-8.8-7.2-16-16-16H16C7.2 0 0 7.2 0 16v16c0 8.8 7.2 16 16 16h16v156.7C11.8 214.8 0 226.9 0 240c0 67.2 34.6 126.2 86.8 160.5l-21.4 70.2C59.1 491.2 74.5 512 96 512h192c21.5 0 36.9-20.8 30.6-41.3l-21.4-70.2C349.4 366.2 384 307.2 384 240c0-13.1-11.8-25.2-32-35.3V48h16zM80 72c0-4.4 3.6-8 8-8h48c4.4 0 8 3.6 8 8v16c0 4.4-3.6 8-8 8H88c-4.4 0-8-3.6-8-8V72zm112 200c-77.1 0-139.6-14.3-139.6-32s62.5-32 139.6-32 139.6 14.3 139.6 32-62.5 32-139.6 32z\"]\n};\nvar faToiletPaper = {\n prefix: 'fas',\n iconName: 'toilet-paper',\n icon: [576, 512, [], \"f71e\", \"M128 0C74.98 0 32 85.96 32 192v172.07c0 41.12-9.8 62.77-31.17 126.87C-2.62 501.3 5.09 512 16.01 512h280.92c13.77 0 26-8.81 30.36-21.88 12.83-38.48 24.71-72.4 24.71-126.05V192c0-83.6 23.67-153.52 60.44-192H128zM96 224c-8.84 0-16-7.16-16-16s7.16-16 16-16 16 7.16 16 16-7.16 16-16 16zm64 0c-8.84 0-16-7.16-16-16s7.16-16 16-16 16 7.16 16 16-7.16 16-16 16zm64 0c-8.84 0-16-7.16-16-16s7.16-16 16-16 16 7.16 16 16-7.16 16-16 16zm64 0c-8.84 0-16-7.16-16-16s7.16-16 16-16 16 7.16 16 16-7.16 16-16 16zM480 0c-53.02 0-96 85.96-96 192s42.98 192 96 192 96-85.96 96-192S533.02 0 480 0zm0 256c-17.67 0-32-28.65-32-64s14.33-64 32-64 32 28.65 32 64-14.33 64-32 64z\"]\n};\nvar faToolbox = {\n prefix: 'fas',\n iconName: 'toolbox',\n icon: [512, 512, [], \"f552\", \"M502.63 214.63l-45.25-45.25c-6-6-14.14-9.37-22.63-9.37H384V80c0-26.51-21.49-48-48-48H176c-26.51 0-48 21.49-48 48v80H77.25c-8.49 0-16.62 3.37-22.63 9.37L9.37 214.63c-6 6-9.37 14.14-9.37 22.63V320h128v-16c0-8.84 7.16-16 16-16h32c8.84 0 16 7.16 16 16v16h128v-16c0-8.84 7.16-16 16-16h32c8.84 0 16 7.16 16 16v16h128v-82.75c0-8.48-3.37-16.62-9.37-22.62zM320 160H192V96h128v64zm64 208c0 8.84-7.16 16-16 16h-32c-8.84 0-16-7.16-16-16v-16H192v16c0 8.84-7.16 16-16 16h-32c-8.84 0-16-7.16-16-16v-16H0v96c0 17.67 14.33 32 32 32h448c17.67 0 32-14.33 32-32v-96H384v16z\"]\n};\nvar faTools = {\n prefix: 'fas',\n iconName: 'tools',\n icon: [512, 512, [], \"f7d9\", \"M501.1 395.7L384 278.6c-23.1-23.1-57.6-27.6-85.4-13.9L192 158.1V96L64 0 0 64l96 128h62.1l106.6 106.6c-13.6 27.8-9.2 62.3 13.9 85.4l117.1 117.1c14.6 14.6 38.2 14.6 52.7 0l52.7-52.7c14.5-14.6 14.5-38.2 0-52.7zM331.7 225c28.3 0 54.9 11 74.9 31l19.4 19.4c15.8-6.9 30.8-16.5 43.8-29.5 37.1-37.1 49.7-89.3 37.9-136.7-2.2-9-13.5-12.1-20.1-5.5l-74.4 74.4-67.9-11.3L334 98.9l74.4-74.4c6.6-6.6 3.4-17.9-5.7-20.2-47.4-11.7-99.6.9-136.6 37.9-28.5 28.5-41.9 66.1-41.2 103.6l82.1 82.1c8.1-1.9 16.5-2.9 24.7-2.9zm-103.9 82l-56.7-56.7L18.7 402.8c-25 25-25 65.5 0 90.5s65.5 25 90.5 0l123.6-123.6c-7.6-19.9-9.9-41.6-5-62.7zM64 472c-13.2 0-24-10.8-24-24 0-13.3 10.7-24 24-24s24 10.7 24 24c0 13.2-10.7 24-24 24z\"]\n};\nvar faTooth = {\n prefix: 'fas',\n iconName: 'tooth',\n icon: [448, 512, [], \"f5c9\", \"M443.98 96.25c-11.01-45.22-47.11-82.06-92.01-93.72-32.19-8.36-63 5.1-89.14 24.33-3.25 2.39-6.96 3.73-10.5 5.48l28.32 18.21c7.42 4.77 9.58 14.67 4.8 22.11-4.46 6.95-14.27 9.86-22.11 4.8L162.83 12.84c-20.7-10.85-43.38-16.4-66.81-10.31-44.9 11.67-81 48.5-92.01 93.72-10.13 41.62-.42 80.81 21.5 110.43 23.36 31.57 32.68 68.66 36.29 107.35 4.4 47.16 10.33 94.16 20.94 140.32l7.8 33.95c3.19 13.87 15.49 23.7 29.67 23.7 13.97 0 26.15-9.55 29.54-23.16l34.47-138.42c4.56-18.32 20.96-31.16 39.76-31.16s35.2 12.85 39.76 31.16l34.47 138.42c3.39 13.61 15.57 23.16 29.54 23.16 14.18 0 26.48-9.83 29.67-23.7l7.8-33.95c10.61-46.15 16.53-93.16 20.94-140.32 3.61-38.7 12.93-75.78 36.29-107.35 21.95-29.61 31.66-68.8 21.53-110.43z\"]\n};\nvar faTorah = {\n prefix: 'fas',\n iconName: 'torah',\n icon: [640, 512, [], \"f6a0\", \"M48 0A48.05 48.05 0 0 0 0 48v64a16 16 0 0 0 16 16h80V48A48.05 48.05 0 0 0 48 0zm347.14 228.56h34.91l-17.47-29.17zm-59.09 52.07l16.78-28.07h-33.58zM242 228.56h34.9l-17.48-29.19zm188-105.12h-34.9l17.48 29.19zM256 412.57V352h288V96a96.1 96.1 0 0 0-96-96H111.59A79.24 79.24 0 0 1 128 48v368a64 64 0 0 0 74.75 63.12C234.22 474 256 444.46 256 412.57zm-38.59-303a20.11 20.11 0 0 1 17.5-10.15h56.3L318.8 53.3a20 20 0 0 1 17.25-9.82 19.66 19.66 0 0 1 17 9.68l27.7 46.28h56.36a20 20 0 0 1 17.14 30.29L426.57 176l27.79 46.43a19.6 19.6 0 0 1 .23 20 20.11 20.11 0 0 1-17.5 10.15h-56.3L353.2 298.7a20 20 0 0 1-17.2 9.82 19.66 19.66 0 0 1-17-9.68l-27.7-46.28h-56.39a20 20 0 0 1-17.14-30.29L245.43 176l-27.79-46.43a19.6 19.6 0 0 1-.23-19.98zM624 384H288v32a96.11 96.11 0 0 1-96 96h336a112 112 0 0 0 112-112 16 16 0 0 0-16-16zM276.86 123.44H242l17.47 29.17zM336 71.38l-16.83 28.06h33.58zm-31.12 157.18h62.3L398.59 176l-31.47-52.58h-62.3L273.41 176z\"]\n};\nvar faToriiGate = {\n prefix: 'fas',\n iconName: 'torii-gate',\n icon: [512, 512, [], \"f6a1\", \"M376.45 32h-240.9A303.17 303.17 0 0 1 0 0v96c0 17.67 14.33 32 32 32h32v64H16c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h48v240c0 8.84 7.16 16 16 16h32c8.84 0 16-7.16 16-16V256h256v240c0 8.84 7.16 16 16 16h32c8.84 0 16-7.16 16-16V256h48c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16h-48v-64h32c17.67 0 32-14.33 32-32V0a303.17 303.17 0 0 1-135.55 32zM128 128h96v64h-96v-64zm256 64h-96v-64h96v64z\"]\n};\nvar faTractor = {\n prefix: 'fas',\n iconName: 'tractor',\n icon: [640, 512, [], \"f722\", \"M528 336c-48.6 0-88 39.4-88 88s39.4 88 88 88 88-39.4 88-88-39.4-88-88-88zm0 112c-13.23 0-24-10.77-24-24s10.77-24 24-24 24 10.77 24 24-10.77 24-24 24zm80-288h-64v-40.2c0-14.12 4.7-27.76 13.15-38.84 4.42-5.8 3.55-14.06-1.32-19.49L534.2 37.3c-6.66-7.45-18.32-6.92-24.7.78C490.58 60.9 480 89.81 480 119.8V160H377.67L321.58 29.14A47.914 47.914 0 0 0 277.45 0H144c-26.47 0-48 21.53-48 48v146.52c-8.63-6.73-20.96-6.46-28.89 1.47L36 227.1c-8.59 8.59-8.59 22.52 0 31.11l5.06 5.06c-4.99 9.26-8.96 18.82-11.91 28.72H22c-12.15 0-22 9.85-22 22v44c0 12.15 9.85 22 22 22h7.14c2.96 9.91 6.92 19.46 11.91 28.73l-5.06 5.06c-8.59 8.59-8.59 22.52 0 31.11L67.1 476c8.59 8.59 22.52 8.59 31.11 0l5.06-5.06c9.26 4.99 18.82 8.96 28.72 11.91V490c0 12.15 9.85 22 22 22h44c12.15 0 22-9.85 22-22v-7.14c9.9-2.95 19.46-6.92 28.72-11.91l5.06 5.06c8.59 8.59 22.52 8.59 31.11 0l31.11-31.11c8.59-8.59 8.59-22.52 0-31.11l-5.06-5.06c4.99-9.26 8.96-18.82 11.91-28.72H330c12.15 0 22-9.85 22-22v-6h80.54c21.91-28.99 56.32-48 95.46-48 18.64 0 36.07 4.61 51.8 12.2l50.82-50.82c6-6 9.37-14.14 9.37-22.63V192c.01-17.67-14.32-32-31.99-32zM176 416c-44.18 0-80-35.82-80-80s35.82-80 80-80 80 35.82 80 80-35.82 80-80 80zm22-256h-38V64h106.89l41.15 96H198z\"]\n};\nvar faTrademark = {\n prefix: 'fas',\n iconName: 'trademark',\n icon: [640, 512, [], \"f25c\", \"M260.6 96H12c-6.6 0-12 5.4-12 12v43.1c0 6.6 5.4 12 12 12h85.1V404c0 6.6 5.4 12 12 12h54.3c6.6 0 12-5.4 12-12V163.1h85.1c6.6 0 12-5.4 12-12V108c.1-6.6-5.3-12-11.9-12zM640 403l-24-296c-.5-6.2-5.7-11-12-11h-65.4c-5.1 0-9.7 3.3-11.3 8.1l-43.8 127.1c-7.2 20.6-16.1 52.8-16.1 52.8h-.9s-8.9-32.2-16.1-52.8l-43.8-127.1c-1.7-4.8-6.2-8.1-11.3-8.1h-65.4c-6.2 0-11.4 4.8-12 11l-24.4 296c-.6 7 4.9 13 12 13H360c6.3 0 11.5-4.9 12-11.2l9.1-132.9c1.8-24.2 0-53.7 0-53.7h.9s10.7 33.6 17.9 53.7l30.7 84.7c1.7 4.7 6.2 7.9 11.3 7.9h50.3c5.1 0 9.6-3.2 11.3-7.9l30.7-84.7c7.2-20.1 17.9-53.7 17.9-53.7h.9s-1.8 29.5 0 53.7l9.1 132.9c.4 6.3 5.7 11.2 12 11.2H628c7 0 12.5-6 12-13z\"]\n};\nvar faTrafficLight = {\n prefix: 'fas',\n iconName: 'traffic-light',\n icon: [384, 512, [], \"f637\", \"M384 192h-64v-37.88c37.2-13.22 64-48.38 64-90.12h-64V32c0-17.67-14.33-32-32-32H96C78.33 0 64 14.33 64 32v32H0c0 41.74 26.8 76.9 64 90.12V192H0c0 41.74 26.8 76.9 64 90.12V320H0c0 42.84 28.25 78.69 66.99 91.05C79.42 468.72 130.6 512 192 512s112.58-43.28 125.01-100.95C355.75 398.69 384 362.84 384 320h-64v-37.88c37.2-13.22 64-48.38 64-90.12zM192 416c-26.51 0-48-21.49-48-48s21.49-48 48-48 48 21.49 48 48-21.49 48-48 48zm0-128c-26.51 0-48-21.49-48-48s21.49-48 48-48 48 21.49 48 48-21.49 48-48 48zm0-128c-26.51 0-48-21.49-48-48s21.49-48 48-48 48 21.49 48 48-21.49 48-48 48z\"]\n};\nvar faTrain = {\n prefix: 'fas',\n iconName: 'train',\n icon: [448, 512, [], \"f238\", \"M448 96v256c0 51.815-61.624 96-130.022 96l62.98 49.721C386.905 502.417 383.562 512 376 512H72c-7.578 0-10.892-9.594-4.957-14.279L130.022 448C61.82 448 0 403.954 0 352V96C0 42.981 64 0 128 0h192c65 0 128 42.981 128 96zm-48 136V120c0-13.255-10.745-24-24-24H72c-13.255 0-24 10.745-24 24v112c0 13.255 10.745 24 24 24h304c13.255 0 24-10.745 24-24zm-176 64c-30.928 0-56 25.072-56 56s25.072 56 56 56 56-25.072 56-56-25.072-56-56-56z\"]\n};\nvar faTram = {\n prefix: 'fas',\n iconName: 'tram',\n icon: [512, 512, [], \"f7da\", \"M288 64c17.7 0 32-14.3 32-32S305.7 0 288 0s-32 14.3-32 32 14.3 32 32 32zm223.5-12.1c-2.3-8.6-11-13.6-19.6-11.3l-480 128c-8.5 2.3-13.6 11-11.3 19.6C2.5 195.3 8.9 200 16 200c1.4 0 2.8-.2 4.1-.5L240 140.8V224H64c-17.7 0-32 14.3-32 32v224c0 17.7 14.3 32 32 32h384c17.7 0 32-14.3 32-32V256c0-17.7-14.3-32-32-32H272v-91.7l228.1-60.8c8.6-2.3 13.6-11.1 11.4-19.6zM176 384H80v-96h96v96zm160-96h96v96h-96v-96zm-32 0v96h-96v-96h96zM192 96c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32z\"]\n};\nvar faTransgender = {\n prefix: 'fas',\n iconName: 'transgender',\n icon: [384, 512, [], \"f224\", \"M372 0h-79c-10.7 0-16 12.9-8.5 20.5l16.9 16.9-80.7 80.7C198.5 104.1 172.2 96 144 96 64.5 96 0 160.5 0 240c0 68.5 47.9 125.9 112 140.4V408H76c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h36v28c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12v-28h36c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-36v-27.6c64.1-14.6 112-71.9 112-140.4 0-28.2-8.1-54.5-22.1-76.7l80.7-80.7 16.9 16.9c7.6 7.6 20.5 2.2 20.5-8.5V12c0-6.6-5.4-12-12-12zM144 320c-44.1 0-80-35.9-80-80s35.9-80 80-80 80 35.9 80 80-35.9 80-80 80z\"]\n};\nvar faTransgenderAlt = {\n prefix: 'fas',\n iconName: 'transgender-alt',\n icon: [480, 512, [], \"f225\", \"M468 0h-79c-10.7 0-16 12.9-8.5 20.5l16.9 16.9-80.7 80.7C294.5 104.1 268.2 96 240 96c-28.2 0-54.5 8.1-76.7 22.1l-16.5-16.5 19.8-19.8c4.7-4.7 4.7-12.3 0-17l-28.3-28.3c-4.7-4.7-12.3-4.7-17 0l-19.8 19.8-19-19 16.9-16.9C107.1 12.9 101.7 0 91 0H12C5.4 0 0 5.4 0 12v79c0 10.7 12.9 16 20.5 8.5l16.9-16.9 19 19-19.8 19.8c-4.7 4.7-4.7 12.3 0 17l28.3 28.3c4.7 4.7 12.3 4.7 17 0l19.8-19.8 16.5 16.5C104.1 185.5 96 211.8 96 240c0 68.5 47.9 125.9 112 140.4V408h-36c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h36v28c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12v-28h36c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-36v-27.6c64.1-14.6 112-71.9 112-140.4 0-28.2-8.1-54.5-22.1-76.7l80.7-80.7 16.9 16.9c7.6 7.6 20.5 2.2 20.5-8.5V12c0-6.6-5.4-12-12-12zM240 320c-44.1 0-80-35.9-80-80s35.9-80 80-80 80 35.9 80 80-35.9 80-80 80z\"]\n};\nvar faTrash = {\n prefix: 'fas',\n iconName: 'trash',\n icon: [448, 512, [], \"f1f8\", \"M432 32H312l-9.4-18.7A24 24 0 0 0 281.1 0H166.8a23.72 23.72 0 0 0-21.4 13.3L136 32H16A16 16 0 0 0 0 48v32a16 16 0 0 0 16 16h416a16 16 0 0 0 16-16V48a16 16 0 0 0-16-16zM53.2 467a48 48 0 0 0 47.9 45h245.8a48 48 0 0 0 47.9-45L416 128H32z\"]\n};\nvar faTrashAlt = {\n prefix: 'fas',\n iconName: 'trash-alt',\n icon: [448, 512, [], \"f2ed\", \"M32 464a48 48 0 0 0 48 48h288a48 48 0 0 0 48-48V128H32zm272-256a16 16 0 0 1 32 0v224a16 16 0 0 1-32 0zm-96 0a16 16 0 0 1 32 0v224a16 16 0 0 1-32 0zm-96 0a16 16 0 0 1 32 0v224a16 16 0 0 1-32 0zM432 32H312l-9.4-18.7A24 24 0 0 0 281.1 0H166.8a23.72 23.72 0 0 0-21.4 13.3L136 32H16A16 16 0 0 0 0 48v32a16 16 0 0 0 16 16h416a16 16 0 0 0 16-16V48a16 16 0 0 0-16-16z\"]\n};\nvar faTrashRestore = {\n prefix: 'fas',\n iconName: 'trash-restore',\n icon: [448, 512, [], \"f829\", \"M53.2 467a48 48 0 0 0 47.9 45h245.8a48 48 0 0 0 47.9-45L416 128H32zm70.11-175.8l89.38-94.26a15.41 15.41 0 0 1 22.62 0l89.38 94.26c10.08 10.62 2.94 28.8-11.32 28.8H256v112a16 16 0 0 1-16 16h-32a16 16 0 0 1-16-16V320h-57.37c-14.26 0-21.4-18.18-11.32-28.8zM432 32H312l-9.4-18.7A24 24 0 0 0 281.1 0H166.8a23.72 23.72 0 0 0-21.4 13.3L136 32H16A16 16 0 0 0 0 48v32a16 16 0 0 0 16 16h416a16 16 0 0 0 16-16V48a16 16 0 0 0-16-16z\"]\n};\nvar faTrashRestoreAlt = {\n prefix: 'fas',\n iconName: 'trash-restore-alt',\n icon: [448, 512, [], \"f82a\", \"M32 464a48 48 0 0 0 48 48h288a48 48 0 0 0 48-48V128H32zm91.31-172.8l89.38-94.26a15.41 15.41 0 0 1 22.62 0l89.38 94.26c10.08 10.62 2.94 28.8-11.32 28.8H256v112a16 16 0 0 1-16 16h-32a16 16 0 0 1-16-16V320h-57.37c-14.26 0-21.4-18.18-11.32-28.8zM432 32H312l-9.4-18.7A24 24 0 0 0 281.1 0H166.8a23.72 23.72 0 0 0-21.4 13.3L136 32H16A16 16 0 0 0 0 48v32a16 16 0 0 0 16 16h416a16 16 0 0 0 16-16V48a16 16 0 0 0-16-16z\"]\n};\nvar faTree = {\n prefix: 'fas',\n iconName: 'tree',\n icon: [384, 512, [], \"f1bb\", \"M378.31 378.49L298.42 288h30.63c9.01 0 16.98-5 20.78-13.06 3.8-8.04 2.55-17.26-3.28-24.05L268.42 160h28.89c9.1 0 17.3-5.35 20.86-13.61 3.52-8.13 1.86-17.59-4.24-24.08L203.66 4.83c-6.03-6.45-17.28-6.45-23.32 0L70.06 122.31c-6.1 6.49-7.75 15.95-4.24 24.08C69.38 154.65 77.59 160 86.69 160h28.89l-78.14 90.91c-5.81 6.78-7.06 15.99-3.27 24.04C37.97 283 45.93 288 54.95 288h30.63L5.69 378.49c-6 6.79-7.36 16.09-3.56 24.26 3.75 8.05 12 13.25 21.01 13.25H160v24.45l-30.29 48.4c-5.32 10.64 2.42 23.16 14.31 23.16h95.96c11.89 0 19.63-12.52 14.31-23.16L224 440.45V416h136.86c9.01 0 17.26-5.2 21.01-13.25 3.8-8.17 2.44-17.47-3.56-24.26z\"]\n};\nvar faTrophy = {\n prefix: 'fas',\n iconName: 'trophy',\n icon: [576, 512, [], \"f091\", \"M552 64H448V24c0-13.3-10.7-24-24-24H152c-13.3 0-24 10.7-24 24v40H24C10.7 64 0 74.7 0 88v56c0 35.7 22.5 72.4 61.9 100.7 31.5 22.7 69.8 37.1 110 41.7C203.3 338.5 240 360 240 360v72h-48c-35.3 0-64 20.7-64 56v12c0 6.6 5.4 12 12 12h296c6.6 0 12-5.4 12-12v-12c0-35.3-28.7-56-64-56h-48v-72s36.7-21.5 68.1-73.6c40.3-4.6 78.6-19 110-41.7 39.3-28.3 61.9-65 61.9-100.7V88c0-13.3-10.7-24-24-24zM99.3 192.8C74.9 175.2 64 155.6 64 144v-16h64.2c1 32.6 5.8 61.2 12.8 86.2-15.1-5.2-29.2-12.4-41.7-21.4zM512 144c0 16.1-17.7 36.1-35.3 48.8-12.5 9-26.7 16.2-41.8 21.4 7-25 11.8-53.6 12.8-86.2H512v16z\"]\n};\nvar faTruck = {\n prefix: 'fas',\n iconName: 'truck',\n icon: [640, 512, [], \"f0d1\", \"M624 352h-16V243.9c0-12.7-5.1-24.9-14.1-33.9L494 110.1c-9-9-21.2-14.1-33.9-14.1H416V48c0-26.5-21.5-48-48-48H48C21.5 0 0 21.5 0 48v320c0 26.5 21.5 48 48 48h16c0 53 43 96 96 96s96-43 96-96h128c0 53 43 96 96 96s96-43 96-96h48c8.8 0 16-7.2 16-16v-32c0-8.8-7.2-16-16-16zM160 464c-26.5 0-48-21.5-48-48s21.5-48 48-48 48 21.5 48 48-21.5 48-48 48zm320 0c-26.5 0-48-21.5-48-48s21.5-48 48-48 48 21.5 48 48-21.5 48-48 48zm80-208H416V144h44.1l99.9 99.9V256z\"]\n};\nvar faTruckLoading = {\n prefix: 'fas',\n iconName: 'truck-loading',\n icon: [640, 512, [], \"f4de\", \"M50.2 375.6c2.3 8.5 11.1 13.6 19.6 11.3l216.4-58c8.5-2.3 13.6-11.1 11.3-19.6l-49.7-185.5c-2.3-8.5-11.1-13.6-19.6-11.3L151 133.3l24.8 92.7-61.8 16.5-24.8-92.7-77.3 20.7C3.4 172.8-1.7 181.6.6 190.1l49.6 185.5zM384 0c-17.7 0-32 14.3-32 32v323.6L5.9 450c-4.3 1.2-6.8 5.6-5.6 9.8l12.6 46.3c1.2 4.3 5.6 6.8 9.8 5.6l393.7-107.4C418.8 464.1 467.6 512 528 512c61.9 0 112-50.1 112-112V0H384zm144 448c-26.5 0-48-21.5-48-48s21.5-48 48-48 48 21.5 48 48-21.5 48-48 48z\"]\n};\nvar faTruckMonster = {\n prefix: 'fas',\n iconName: 'truck-monster',\n icon: [640, 512, [], \"f63b\", \"M624 224h-16v-64c0-17.67-14.33-32-32-32h-73.6L419.22 24.02A64.025 64.025 0 0 0 369.24 0H256c-17.67 0-32 14.33-32 32v96H48c-8.84 0-16 7.16-16 16v80H16c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h16.72c29.21-38.65 75.1-64 127.28-64s98.07 25.35 127.28 64h65.45c29.21-38.65 75.1-64 127.28-64s98.07 25.35 127.28 64H624c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16zm-336-96V64h81.24l51.2 64H288zm304 224h-5.2c-2.2-7.33-5.07-14.28-8.65-20.89l3.67-3.67c6.25-6.25 6.25-16.38 0-22.63l-22.63-22.63c-6.25-6.25-16.38-6.25-22.63 0l-3.67 3.67A110.85 110.85 0 0 0 512 277.2V272c0-8.84-7.16-16-16-16h-32c-8.84 0-16 7.16-16 16v5.2c-7.33 2.2-14.28 5.07-20.89 8.65l-3.67-3.67c-6.25-6.25-16.38-6.25-22.63 0l-22.63 22.63c-6.25 6.25-6.25 16.38 0 22.63l3.67 3.67A110.85 110.85 0 0 0 373.2 352H368c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h5.2c2.2 7.33 5.07 14.28 8.65 20.89l-3.67 3.67c-6.25 6.25-6.25 16.38 0 22.63l22.63 22.63c6.25 6.25 16.38 6.25 22.63 0l3.67-3.67c6.61 3.57 13.57 6.45 20.9 8.65v5.2c0 8.84 7.16 16 16 16h32c8.84 0 16-7.16 16-16v-5.2c7.33-2.2 14.28-5.07 20.9-8.65l3.67 3.67c6.25 6.25 16.38 6.25 22.63 0l22.63-22.63c6.25-6.25 6.25-16.38 0-22.63l-3.67-3.67a110.85 110.85 0 0 0 8.65-20.89h5.2c8.84 0 16-7.16 16-16v-32c-.02-8.84-7.18-16-16.02-16zm-112 80c-26.51 0-48-21.49-48-48s21.49-48 48-48 48 21.49 48 48-21.49 48-48 48zm-208-80h-5.2c-2.2-7.33-5.07-14.28-8.65-20.89l3.67-3.67c6.25-6.25 6.25-16.38 0-22.63l-22.63-22.63c-6.25-6.25-16.38-6.25-22.63 0l-3.67 3.67A110.85 110.85 0 0 0 192 277.2V272c0-8.84-7.16-16-16-16h-32c-8.84 0-16 7.16-16 16v5.2c-7.33 2.2-14.28 5.07-20.89 8.65l-3.67-3.67c-6.25-6.25-16.38-6.25-22.63 0L58.18 304.8c-6.25 6.25-6.25 16.38 0 22.63l3.67 3.67a110.85 110.85 0 0 0-8.65 20.89H48c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h5.2c2.2 7.33 5.07 14.28 8.65 20.89l-3.67 3.67c-6.25 6.25-6.25 16.38 0 22.63l22.63 22.63c6.25 6.25 16.38 6.25 22.63 0l3.67-3.67c6.61 3.57 13.57 6.45 20.9 8.65v5.2c0 8.84 7.16 16 16 16h32c8.84 0 16-7.16 16-16v-5.2c7.33-2.2 14.28-5.07 20.9-8.65l3.67 3.67c6.25 6.25 16.38 6.25 22.63 0l22.63-22.63c6.25-6.25 6.25-16.38 0-22.63l-3.67-3.67a110.85 110.85 0 0 0 8.65-20.89h5.2c8.84 0 16-7.16 16-16v-32C288 359.16 280.84 352 272 352zm-112 80c-26.51 0-48-21.49-48-48s21.49-48 48-48 48 21.49 48 48-21.49 48-48 48z\"]\n};\nvar faTruckMoving = {\n prefix: 'fas',\n iconName: 'truck-moving',\n icon: [640, 512, [], \"f4df\", \"M621.3 237.3l-58.5-58.5c-12-12-28.3-18.7-45.3-18.7H480V64c0-17.7-14.3-32-32-32H32C14.3 32 0 46.3 0 64v336c0 44.2 35.8 80 80 80 26.3 0 49.4-12.9 64-32.4 14.6 19.6 37.7 32.4 64 32.4 44.2 0 80-35.8 80-80 0-5.5-.6-10.8-1.6-16h163.2c-1.1 5.2-1.6 10.5-1.6 16 0 44.2 35.8 80 80 80s80-35.8 80-80c0-5.5-.6-10.8-1.6-16H624c8.8 0 16-7.2 16-16v-85.5c0-17-6.7-33.2-18.7-45.2zM80 432c-17.6 0-32-14.4-32-32s14.4-32 32-32 32 14.4 32 32-14.4 32-32 32zm128 0c-17.6 0-32-14.4-32-32s14.4-32 32-32 32 14.4 32 32-14.4 32-32 32zm272-224h37.5c4.3 0 8.3 1.7 11.3 4.7l43.3 43.3H480v-48zm48 224c-17.6 0-32-14.4-32-32s14.4-32 32-32 32 14.4 32 32-14.4 32-32 32z\"]\n};\nvar faTruckPickup = {\n prefix: 'fas',\n iconName: 'truck-pickup',\n icon: [640, 512, [], \"f63c\", \"M624 288h-16v-64c0-17.67-14.33-32-32-32h-48L419.22 56.02A64.025 64.025 0 0 0 369.24 32H256c-17.67 0-32 14.33-32 32v128H64c-17.67 0-32 14.33-32 32v64H16c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h49.61c-.76 5.27-1.61 10.52-1.61 16 0 61.86 50.14 112 112 112s112-50.14 112-112c0-5.48-.85-10.73-1.61-16h67.23c-.76 5.27-1.61 10.52-1.61 16 0 61.86 50.14 112 112 112s112-50.14 112-112c0-5.48-.85-10.73-1.61-16H624c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16zM288 96h81.24l76.8 96H288V96zM176 416c-26.47 0-48-21.53-48-48s21.53-48 48-48 48 21.53 48 48-21.53 48-48 48zm288 0c-26.47 0-48-21.53-48-48s21.53-48 48-48 48 21.53 48 48-21.53 48-48 48z\"]\n};\nvar faTshirt = {\n prefix: 'fas',\n iconName: 'tshirt',\n icon: [640, 512, [], \"f553\", \"M631.2 96.5L436.5 0C416.4 27.8 371.9 47.2 320 47.2S223.6 27.8 203.5 0L8.8 96.5c-7.9 4-11.1 13.6-7.2 21.5l57.2 114.5c4 7.9 13.6 11.1 21.5 7.2l56.6-27.7c10.6-5.2 23 2.5 23 14.4V480c0 17.7 14.3 32 32 32h256c17.7 0 32-14.3 32-32V226.3c0-11.8 12.4-19.6 23-14.4l56.6 27.7c7.9 4 17.5.8 21.5-7.2L638.3 118c4-7.9.8-17.6-7.1-21.5z\"]\n};\nvar faTty = {\n prefix: 'fas',\n iconName: 'tty',\n icon: [512, 512, [], \"f1e4\", \"M5.37 103.822c138.532-138.532 362.936-138.326 501.262 0 6.078 6.078 7.074 15.496 2.583 22.681l-43.214 69.138a18.332 18.332 0 0 1-22.356 7.305l-86.422-34.569a18.335 18.335 0 0 1-11.434-18.846L351.741 90c-62.145-22.454-130.636-21.986-191.483 0l5.953 59.532a18.331 18.331 0 0 1-11.434 18.846l-86.423 34.568a18.334 18.334 0 0 1-22.356-7.305L2.787 126.502a18.333 18.333 0 0 1 2.583-22.68zM96 308v-40c0-6.627-5.373-12-12-12H44c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm96 0v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm96 0v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm96 0v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm96 0v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm-336 96v-40c0-6.627-5.373-12-12-12H92c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm96 0v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm96 0v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm96 0v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zM96 500v-40c0-6.627-5.373-12-12-12H44c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm288 0v-40c0-6.627-5.373-12-12-12H140c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h232c6.627 0 12-5.373 12-12zm96 0v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12z\"]\n};\nvar faTv = {\n prefix: 'fas',\n iconName: 'tv',\n icon: [640, 512, [], \"f26c\", \"M592 0H48C21.5 0 0 21.5 0 48v320c0 26.5 21.5 48 48 48h245.1v32h-160c-17.7 0-32 14.3-32 32s14.3 32 32 32h384c17.7 0 32-14.3 32-32s-14.3-32-32-32h-160v-32H592c26.5 0 48-21.5 48-48V48c0-26.5-21.5-48-48-48zm-16 352H64V64h512v288z\"]\n};\nvar faUmbrella = {\n prefix: 'fas',\n iconName: 'umbrella',\n icon: [576, 512, [], \"f0e9\", \"M575.7 280.8C547.1 144.5 437.3 62.6 320 49.9V32c0-17.7-14.3-32-32-32s-32 14.3-32 32v17.9C138.3 62.6 29.5 144.5.3 280.8c-2.2 10.1 8.5 21.3 18.7 11.4 52-55 107.7-52.4 158.6 37 5.3 9.5 14.9 8.6 19.7 0 20.2-35.4 44.9-73.2 90.7-73.2 58.5 0 88.2 68.8 90.7 73.2 4.8 8.6 14.4 9.5 19.7 0 51-89.5 107.1-91.4 158.6-37 10.3 10 20.9-1.3 18.7-11.4zM256 301.7V432c0 8.8-7.2 16-16 16-7.8 0-13.2-5.3-15.1-10.7-5.9-16.7-24.1-25.4-40.8-19.5-16.7 5.9-25.4 24.2-19.5 40.8 11.2 31.9 41.6 53.3 75.4 53.3 44.1 0 80-35.9 80-80V301.6c-9.1-7.9-19.8-13.6-32-13.6-12.3.1-22.4 4.8-32 13.7z\"]\n};\nvar faUmbrellaBeach = {\n prefix: 'fas',\n iconName: 'umbrella-beach',\n icon: [640, 512, [], \"f5ca\", \"M115.38 136.9l102.11 37.18c35.19-81.54 86.21-144.29 139-173.7-95.88-4.89-188.78 36.96-248.53 111.8-6.69 8.4-2.66 21.05 7.42 24.72zm132.25 48.16l238.48 86.83c35.76-121.38 18.7-231.66-42.63-253.98-7.4-2.7-15.13-4-23.09-4-58.02.01-128.27 69.17-172.76 171.15zM521.48 60.5c6.22 16.3 10.83 34.6 13.2 55.19 5.74 49.89-1.42 108.23-18.95 166.98l102.62 37.36c10.09 3.67 21.31-3.43 21.57-14.17 2.32-95.69-41.91-187.44-118.44-245.36zM560 447.98H321.06L386 269.5l-60.14-21.9-72.9 200.37H16c-8.84 0-16 7.16-16 16.01v32.01C0 504.83 7.16 512 16 512h544c8.84 0 16-7.17 16-16.01v-32.01c0-8.84-7.16-16-16-16z\"]\n};\nvar faUnderline = {\n prefix: 'fas',\n iconName: 'underline',\n icon: [448, 512, [], \"f0cd\", \"M224.264 388.24c-91.669 0-156.603-51.165-156.603-151.392V64H39.37c-8.837 0-16-7.163-16-16V16c0-8.837 7.163-16 16-16h137.39c8.837 0 16 7.163 16 16v32c0 8.837-7.163 16-16 16h-28.813v172.848c0 53.699 28.314 79.444 76.317 79.444 46.966 0 75.796-25.434 75.796-79.965V64h-28.291c-8.837 0-16-7.163-16-16V16c0-8.837 7.163-16 16-16h136.868c8.837 0 16 7.163 16 16v32c0 8.837-7.163 16-16 16h-28.291v172.848c0 99.405-64.881 151.392-156.082 151.392zM16 448h416c8.837 0 16 7.163 16 16v32c0 8.837-7.163 16-16 16H16c-8.837 0-16-7.163-16-16v-32c0-8.837 7.163-16 16-16z\"]\n};\nvar faUndo = {\n prefix: 'fas',\n iconName: 'undo',\n icon: [512, 512, [], \"f0e2\", \"M212.333 224.333H12c-6.627 0-12-5.373-12-12V12C0 5.373 5.373 0 12 0h48c6.627 0 12 5.373 12 12v78.112C117.773 39.279 184.26 7.47 258.175 8.007c136.906.994 246.448 111.623 246.157 248.532C504.041 393.258 393.12 504 256.333 504c-64.089 0-122.496-24.313-166.51-64.215-5.099-4.622-5.334-12.554-.467-17.42l33.967-33.967c4.474-4.474 11.662-4.717 16.401-.525C170.76 415.336 211.58 432 256.333 432c97.268 0 176-78.716 176-176 0-97.267-78.716-176-176-176-58.496 0-110.28 28.476-142.274 72.333h98.274c6.627 0 12 5.373 12 12v48c0 6.627-5.373 12-12 12z\"]\n};\nvar faUndoAlt = {\n prefix: 'fas',\n iconName: 'undo-alt',\n icon: [512, 512, [], \"f2ea\", \"M255.545 8c-66.269.119-126.438 26.233-170.86 68.685L48.971 40.971C33.851 25.851 8 36.559 8 57.941V192c0 13.255 10.745 24 24 24h134.059c21.382 0 32.09-25.851 16.971-40.971l-41.75-41.75c30.864-28.899 70.801-44.907 113.23-45.273 92.398-.798 170.283 73.977 169.484 169.442C423.236 348.009 349.816 424 256 424c-41.127 0-79.997-14.678-110.63-41.556-4.743-4.161-11.906-3.908-16.368.553L89.34 422.659c-4.872 4.872-4.631 12.815.482 17.433C133.798 479.813 192.074 504 256 504c136.966 0 247.999-111.033 248-247.998C504.001 119.193 392.354 7.755 255.545 8z\"]\n};\nvar faUniversalAccess = {\n prefix: 'fas',\n iconName: 'universal-access',\n icon: [512, 512, [], \"f29a\", \"M256 48c114.953 0 208 93.029 208 208 0 114.953-93.029 208-208 208-114.953 0-208-93.029-208-208 0-114.953 93.029-208 208-208m0-40C119.033 8 8 119.033 8 256s111.033 248 248 248 248-111.033 248-248S392.967 8 256 8zm0 56C149.961 64 64 149.961 64 256s85.961 192 192 192 192-85.961 192-192S362.039 64 256 64zm0 44c19.882 0 36 16.118 36 36s-16.118 36-36 36-36-16.118-36-36 16.118-36 36-36zm117.741 98.023c-28.712 6.779-55.511 12.748-82.14 15.807.851 101.023 12.306 123.052 25.037 155.621 3.617 9.26-.957 19.698-10.217 23.315-9.261 3.617-19.699-.957-23.316-10.217-8.705-22.308-17.086-40.636-22.261-78.549h-9.686c-5.167 37.851-13.534 56.208-22.262 78.549-3.615 9.255-14.05 13.836-23.315 10.217-9.26-3.617-13.834-14.056-10.217-23.315 12.713-32.541 24.185-54.541 25.037-155.621-26.629-3.058-53.428-9.027-82.141-15.807-8.6-2.031-13.926-10.648-11.895-19.249s10.647-13.926 19.249-11.895c96.686 22.829 124.283 22.783 220.775 0 8.599-2.03 17.218 3.294 19.249 11.895 2.029 8.601-3.297 17.219-11.897 19.249z\"]\n};\nvar faUniversity = {\n prefix: 'fas',\n iconName: 'university',\n icon: [512, 512, [], \"f19c\", \"M496 128v16a8 8 0 0 1-8 8h-24v12c0 6.627-5.373 12-12 12H60c-6.627 0-12-5.373-12-12v-12H24a8 8 0 0 1-8-8v-16a8 8 0 0 1 4.941-7.392l232-88a7.996 7.996 0 0 1 6.118 0l232 88A8 8 0 0 1 496 128zm-24 304H40c-13.255 0-24 10.745-24 24v16a8 8 0 0 0 8 8h464a8 8 0 0 0 8-8v-16c0-13.255-10.745-24-24-24zM96 192v192H60c-6.627 0-12 5.373-12 12v20h416v-20c0-6.627-5.373-12-12-12h-36V192h-64v192h-64V192h-64v192h-64V192H96z\"]\n};\nvar faUnlink = {\n prefix: 'fas',\n iconName: 'unlink',\n icon: [512, 512, [], \"f127\", \"M304.083 405.907c4.686 4.686 4.686 12.284 0 16.971l-44.674 44.674c-59.263 59.262-155.693 59.266-214.961 0-59.264-59.265-59.264-155.696 0-214.96l44.675-44.675c4.686-4.686 12.284-4.686 16.971 0l39.598 39.598c4.686 4.686 4.686 12.284 0 16.971l-44.675 44.674c-28.072 28.073-28.072 73.75 0 101.823 28.072 28.072 73.75 28.073 101.824 0l44.674-44.674c4.686-4.686 12.284-4.686 16.971 0l39.597 39.598zm-56.568-260.216c4.686 4.686 12.284 4.686 16.971 0l44.674-44.674c28.072-28.075 73.75-28.073 101.824 0 28.072 28.073 28.072 73.75 0 101.823l-44.675 44.674c-4.686 4.686-4.686 12.284 0 16.971l39.598 39.598c4.686 4.686 12.284 4.686 16.971 0l44.675-44.675c59.265-59.265 59.265-155.695 0-214.96-59.266-59.264-155.695-59.264-214.961 0l-44.674 44.674c-4.686 4.686-4.686 12.284 0 16.971l39.597 39.598zm234.828 359.28l22.627-22.627c9.373-9.373 9.373-24.569 0-33.941L63.598 7.029c-9.373-9.373-24.569-9.373-33.941 0L7.029 29.657c-9.373 9.373-9.373 24.569 0 33.941l441.373 441.373c9.373 9.372 24.569 9.372 33.941 0z\"]\n};\nvar faUnlock = {\n prefix: 'fas',\n iconName: 'unlock',\n icon: [448, 512, [], \"f09c\", \"M400 256H152V152.9c0-39.6 31.7-72.5 71.3-72.9 40-.4 72.7 32.1 72.7 72v16c0 13.3 10.7 24 24 24h32c13.3 0 24-10.7 24-24v-16C376 68 307.5-.3 223.5 0 139.5.3 72 69.5 72 153.5V256H48c-26.5 0-48 21.5-48 48v160c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V304c0-26.5-21.5-48-48-48z\"]\n};\nvar faUnlockAlt = {\n prefix: 'fas',\n iconName: 'unlock-alt',\n icon: [448, 512, [], \"f13e\", \"M400 256H152V152.9c0-39.6 31.7-72.5 71.3-72.9 40-.4 72.7 32.1 72.7 72v16c0 13.3 10.7 24 24 24h32c13.3 0 24-10.7 24-24v-16C376 68 307.5-.3 223.5 0 139.5.3 72 69.5 72 153.5V256H48c-26.5 0-48 21.5-48 48v160c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V304c0-26.5-21.5-48-48-48zM264 408c0 22.1-17.9 40-40 40s-40-17.9-40-40v-48c0-22.1 17.9-40 40-40s40 17.9 40 40v48z\"]\n};\nvar faUpload = {\n prefix: 'fas',\n iconName: 'upload',\n icon: [512, 512, [], \"f093\", \"M296 384h-80c-13.3 0-24-10.7-24-24V192h-87.7c-17.8 0-26.7-21.5-14.1-34.1L242.3 5.7c7.5-7.5 19.8-7.5 27.3 0l152.2 152.2c12.6 12.6 3.7 34.1-14.1 34.1H320v168c0 13.3-10.7 24-24 24zm216-8v112c0 13.3-10.7 24-24 24H24c-13.3 0-24-10.7-24-24V376c0-13.3 10.7-24 24-24h136v8c0 30.9 25.1 56 56 56h80c30.9 0 56-25.1 56-56v-8h136c13.3 0 24 10.7 24 24zm-124 88c0-11-9-20-20-20s-20 9-20 20 9 20 20 20 20-9 20-20zm64 0c0-11-9-20-20-20s-20 9-20 20 9 20 20 20 20-9 20-20z\"]\n};\nvar faUser = {\n prefix: 'fas',\n iconName: 'user',\n icon: [448, 512, [], \"f007\", \"M224 256c70.7 0 128-57.3 128-128S294.7 0 224 0 96 57.3 96 128s57.3 128 128 128zm89.6 32h-16.7c-22.2 10.2-46.9 16-72.9 16s-50.6-5.8-72.9-16h-16.7C60.2 288 0 348.2 0 422.4V464c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48v-41.6c0-74.2-60.2-134.4-134.4-134.4z\"]\n};\nvar faUserAlt = {\n prefix: 'fas',\n iconName: 'user-alt',\n icon: [512, 512, [], \"f406\", \"M256 288c79.5 0 144-64.5 144-144S335.5 0 256 0 112 64.5 112 144s64.5 144 144 144zm128 32h-55.1c-22.2 10.2-46.9 16-72.9 16s-50.6-5.8-72.9-16H128C57.3 320 0 377.3 0 448v16c0 26.5 21.5 48 48 48h416c26.5 0 48-21.5 48-48v-16c0-70.7-57.3-128-128-128z\"]\n};\nvar faUserAltSlash = {\n prefix: 'fas',\n iconName: 'user-alt-slash',\n icon: [640, 512, [], \"f4fa\", \"M633.8 458.1L389.6 269.3C433.8 244.7 464 198.1 464 144 464 64.5 399.5 0 320 0c-67.1 0-123 46.1-139 108.2L45.5 3.4C38.5-2 28.5-.8 23 6.2L3.4 31.4c-5.4 7-4.2 17 2.8 22.4l588.4 454.7c7 5.4 17 4.2 22.5-2.8l19.6-25.3c5.4-6.8 4.1-16.9-2.9-22.3zM198.4 320C124.2 320 64 380.2 64 454.4v9.6c0 26.5 21.5 48 48 48h382.2L245.8 320h-47.4z\"]\n};\nvar faUserAstronaut = {\n prefix: 'fas',\n iconName: 'user-astronaut',\n icon: [448, 512, [], \"f4fb\", \"M64 224h13.5c24.7 56.5 80.9 96 146.5 96s121.8-39.5 146.5-96H384c8.8 0 16-7.2 16-16v-96c0-8.8-7.2-16-16-16h-13.5C345.8 39.5 289.6 0 224 0S102.2 39.5 77.5 96H64c-8.8 0-16 7.2-16 16v96c0 8.8 7.2 16 16 16zm40-88c0-22.1 21.5-40 48-40h144c26.5 0 48 17.9 48 40v24c0 53-43 96-96 96h-48c-53 0-96-43-96-96v-24zm72 72l12-36 36-12-36-12-12-36-12 36-36 12 36 12 12 36zm151.6 113.4C297.7 340.7 262.2 352 224 352s-73.7-11.3-103.6-30.6C52.9 328.5 0 385 0 454.4v9.6c0 26.5 21.5 48 48 48h80v-64c0-17.7 14.3-32 32-32h128c17.7 0 32 14.3 32 32v64h80c26.5 0 48-21.5 48-48v-9.6c0-69.4-52.9-125.9-120.4-133zM272 448c-8.8 0-16 7.2-16 16s7.2 16 16 16 16-7.2 16-16-7.2-16-16-16zm-96 0c-8.8 0-16 7.2-16 16v48h32v-48c0-8.8-7.2-16-16-16z\"]\n};\nvar faUserCheck = {\n prefix: 'fas',\n iconName: 'user-check',\n icon: [640, 512, [], \"f4fc\", \"M224 256c70.7 0 128-57.3 128-128S294.7 0 224 0 96 57.3 96 128s57.3 128 128 128zm89.6 32h-16.7c-22.2 10.2-46.9 16-72.9 16s-50.6-5.8-72.9-16h-16.7C60.2 288 0 348.2 0 422.4V464c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48v-41.6c0-74.2-60.2-134.4-134.4-134.4zm323-128.4l-27.8-28.1c-4.6-4.7-12.1-4.7-16.8-.1l-104.8 104-45.5-45.8c-4.6-4.7-12.1-4.7-16.8-.1l-28.1 27.9c-4.7 4.6-4.7 12.1-.1 16.8l81.7 82.3c4.6 4.7 12.1 4.7 16.8.1l141.3-140.2c4.6-4.7 4.7-12.2.1-16.8z\"]\n};\nvar faUserCircle = {\n prefix: 'fas',\n iconName: 'user-circle',\n icon: [496, 512, [], \"f2bd\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 96c48.6 0 88 39.4 88 88s-39.4 88-88 88-88-39.4-88-88 39.4-88 88-88zm0 344c-58.7 0-111.3-26.6-146.5-68.2 18.8-35.4 55.6-59.8 98.5-59.8 2.4 0 4.8.4 7.1 1.1 13 4.2 26.6 6.9 40.9 6.9 14.3 0 28-2.7 40.9-6.9 2.3-.7 4.7-1.1 7.1-1.1 42.9 0 79.7 24.4 98.5 59.8C359.3 421.4 306.7 448 248 448z\"]\n};\nvar faUserClock = {\n prefix: 'fas',\n iconName: 'user-clock',\n icon: [640, 512, [], \"f4fd\", \"M496 224c-79.6 0-144 64.4-144 144s64.4 144 144 144 144-64.4 144-144-64.4-144-144-144zm64 150.3c0 5.3-4.4 9.7-9.7 9.7h-60.6c-5.3 0-9.7-4.4-9.7-9.7v-76.6c0-5.3 4.4-9.7 9.7-9.7h12.6c5.3 0 9.7 4.4 9.7 9.7V352h38.3c5.3 0 9.7 4.4 9.7 9.7v12.6zM320 368c0-27.8 6.7-54.1 18.2-77.5-8-1.5-16.2-2.5-24.6-2.5h-16.7c-22.2 10.2-46.9 16-72.9 16s-50.6-5.8-72.9-16h-16.7C60.2 288 0 348.2 0 422.4V464c0 26.5 21.5 48 48 48h347.1c-45.3-31.9-75.1-84.5-75.1-144zm-96-112c70.7 0 128-57.3 128-128S294.7 0 224 0 96 57.3 96 128s57.3 128 128 128z\"]\n};\nvar faUserCog = {\n prefix: 'fas',\n iconName: 'user-cog',\n icon: [640, 512, [], \"f4fe\", \"M610.5 373.3c2.6-14.1 2.6-28.5 0-42.6l25.8-14.9c3-1.7 4.3-5.2 3.3-8.5-6.7-21.6-18.2-41.2-33.2-57.4-2.3-2.5-6-3.1-9-1.4l-25.8 14.9c-10.9-9.3-23.4-16.5-36.9-21.3v-29.8c0-3.4-2.4-6.4-5.7-7.1-22.3-5-45-4.8-66.2 0-3.3.7-5.7 3.7-5.7 7.1v29.8c-13.5 4.8-26 12-36.9 21.3l-25.8-14.9c-2.9-1.7-6.7-1.1-9 1.4-15 16.2-26.5 35.8-33.2 57.4-1 3.3.4 6.8 3.3 8.5l25.8 14.9c-2.6 14.1-2.6 28.5 0 42.6l-25.8 14.9c-3 1.7-4.3 5.2-3.3 8.5 6.7 21.6 18.2 41.1 33.2 57.4 2.3 2.5 6 3.1 9 1.4l25.8-14.9c10.9 9.3 23.4 16.5 36.9 21.3v29.8c0 3.4 2.4 6.4 5.7 7.1 22.3 5 45 4.8 66.2 0 3.3-.7 5.7-3.7 5.7-7.1v-29.8c13.5-4.8 26-12 36.9-21.3l25.8 14.9c2.9 1.7 6.7 1.1 9-1.4 15-16.2 26.5-35.8 33.2-57.4 1-3.3-.4-6.8-3.3-8.5l-25.8-14.9zM496 400.5c-26.8 0-48.5-21.8-48.5-48.5s21.8-48.5 48.5-48.5 48.5 21.8 48.5 48.5-21.7 48.5-48.5 48.5zM224 256c70.7 0 128-57.3 128-128S294.7 0 224 0 96 57.3 96 128s57.3 128 128 128zm201.2 226.5c-2.3-1.2-4.6-2.6-6.8-3.9l-7.9 4.6c-6 3.4-12.8 5.3-19.6 5.3-10.9 0-21.4-4.6-28.9-12.6-18.3-19.8-32.3-43.9-40.2-69.6-5.5-17.7 1.9-36.4 17.9-45.7l7.9-4.6c-.1-2.6-.1-5.2 0-7.8l-7.9-4.6c-16-9.2-23.4-28-17.9-45.7.9-2.9 2.2-5.8 3.2-8.7-3.8-.3-7.5-1.2-11.4-1.2h-16.7c-22.2 10.2-46.9 16-72.9 16s-50.6-5.8-72.9-16h-16.7C60.2 288 0 348.2 0 422.4V464c0 26.5 21.5 48 48 48h352c10.1 0 19.5-3.2 27.2-8.5-1.2-3.8-2-7.7-2-11.8v-9.2z\"]\n};\nvar faUserEdit = {\n prefix: 'fas',\n iconName: 'user-edit',\n icon: [640, 512, [], \"f4ff\", \"M224 256c70.7 0 128-57.3 128-128S294.7 0 224 0 96 57.3 96 128s57.3 128 128 128zm89.6 32h-16.7c-22.2 10.2-46.9 16-72.9 16s-50.6-5.8-72.9-16h-16.7C60.2 288 0 348.2 0 422.4V464c0 26.5 21.5 48 48 48h274.9c-2.4-6.8-3.4-14-2.6-21.3l6.8-60.9 1.2-11.1 7.9-7.9 77.3-77.3c-24.5-27.7-60-45.5-99.9-45.5zm45.3 145.3l-6.8 61c-1.1 10.2 7.5 18.8 17.6 17.6l60.9-6.8 137.9-137.9-71.7-71.7-137.9 137.8zM633 268.9L595.1 231c-9.3-9.3-24.5-9.3-33.8 0l-37.8 37.8-4.1 4.1 71.8 71.7 41.8-41.8c9.3-9.4 9.3-24.5 0-33.9z\"]\n};\nvar faUserFriends = {\n prefix: 'fas',\n iconName: 'user-friends',\n icon: [640, 512, [], \"f500\", \"M192 256c61.9 0 112-50.1 112-112S253.9 32 192 32 80 82.1 80 144s50.1 112 112 112zm76.8 32h-8.3c-20.8 10-43.9 16-68.5 16s-47.6-6-68.5-16h-8.3C51.6 288 0 339.6 0 403.2V432c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48v-28.8c0-63.6-51.6-115.2-115.2-115.2zM480 256c53 0 96-43 96-96s-43-96-96-96-96 43-96 96 43 96 96 96zm48 32h-3.8c-13.9 4.8-28.6 8-44.2 8s-30.3-3.2-44.2-8H432c-20.4 0-39.2 5.9-55.7 15.4 24.4 26.3 39.7 61.2 39.7 99.8v38.4c0 2.2-.5 4.3-.6 6.4H592c26.5 0 48-21.5 48-48 0-61.9-50.1-112-112-112z\"]\n};\nvar faUserGraduate = {\n prefix: 'fas',\n iconName: 'user-graduate',\n icon: [448, 512, [], \"f501\", \"M319.4 320.6L224 416l-95.4-95.4C57.1 323.7 0 382.2 0 454.4v9.6c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48v-9.6c0-72.2-57.1-130.7-128.6-133.8zM13.6 79.8l6.4 1.5v58.4c-7 4.2-12 11.5-12 20.3 0 8.4 4.6 15.4 11.1 19.7L3.5 242c-1.7 6.9 2.1 14 7.6 14h41.8c5.5 0 9.3-7.1 7.6-14l-15.6-62.3C51.4 175.4 56 168.4 56 160c0-8.8-5-16.1-12-20.3V87.1l66 15.9c-8.6 17.2-14 36.4-14 57 0 70.7 57.3 128 128 128s128-57.3 128-128c0-20.6-5.3-39.8-14-57l96.3-23.2c18.2-4.4 18.2-27.1 0-31.5l-190.4-46c-13-3.1-26.7-3.1-39.7 0L13.6 48.2c-18.1 4.4-18.1 27.2 0 31.6z\"]\n};\nvar faUserInjured = {\n prefix: 'fas',\n iconName: 'user-injured',\n icon: [448, 512, [], \"f728\", \"M277.37 11.98C261.08 4.47 243.11 0 224 0c-53.69 0-99.5 33.13-118.51 80h81.19l90.69-68.02zM342.51 80c-7.9-19.47-20.67-36.2-36.49-49.52L239.99 80h102.52zM224 256c70.69 0 128-57.31 128-128 0-5.48-.95-10.7-1.61-16H97.61c-.67 5.3-1.61 10.52-1.61 16 0 70.69 57.31 128 128 128zM80 299.7V512h128.26l-98.45-221.52A132.835 132.835 0 0 0 80 299.7zM0 464c0 26.51 21.49 48 48 48V320.24C18.88 344.89 0 381.26 0 422.4V464zm256-48h-55.38l42.67 96H256c26.47 0 48-21.53 48-48s-21.53-48-48-48zm57.6-128h-16.71c-22.24 10.18-46.88 16-72.89 16s-50.65-5.82-72.89-16h-7.37l42.67 96H256c44.11 0 80 35.89 80 80 0 18.08-6.26 34.59-16.41 48H400c26.51 0 48-21.49 48-48v-41.6c0-74.23-60.17-134.4-134.4-134.4z\"]\n};\nvar faUserLock = {\n prefix: 'fas',\n iconName: 'user-lock',\n icon: [640, 512, [], \"f502\", \"M320 320c0-11.1 3.1-21.4 8.1-30.5-4.8-.5-9.5-1.5-14.5-1.5h-16.7c-22.2 10.2-46.9 16-72.9 16s-50.6-5.8-72.9-16h-16.7C60.2 288 0 348.2 0 422.4V464c0 26.5 21.5 48 48 48h280.9c-5.5-9.5-8.9-20.3-8.9-32V320zm-96-64c70.7 0 128-57.3 128-128S294.7 0 224 0 96 57.3 96 128s57.3 128 128 128zm384 32h-32v-48c0-44.2-35.8-80-80-80s-80 35.8-80 80v48h-32c-17.7 0-32 14.3-32 32v160c0 17.7 14.3 32 32 32h224c17.7 0 32-14.3 32-32V320c0-17.7-14.3-32-32-32zm-80 0h-64v-48c0-17.6 14.4-32 32-32s32 14.4 32 32v48z\"]\n};\nvar faUserMd = {\n prefix: 'fas',\n iconName: 'user-md',\n icon: [448, 512, [], \"f0f0\", \"M224 256c70.7 0 128-57.3 128-128S294.7 0 224 0 96 57.3 96 128s57.3 128 128 128zM104 424c0 13.3 10.7 24 24 24s24-10.7 24-24-10.7-24-24-24-24 10.7-24 24zm216-135.4v49c36.5 7.4 64 39.8 64 78.4v41.7c0 7.6-5.4 14.2-12.9 15.7l-32.2 6.4c-4.3.9-8.5-1.9-9.4-6.3l-3.1-15.7c-.9-4.3 1.9-8.6 6.3-9.4l19.3-3.9V416c0-62.8-96-65.1-96 1.9v26.7l19.3 3.9c4.3.9 7.1 5.1 6.3 9.4l-3.1 15.7c-.9 4.3-5.1 7.1-9.4 6.3l-31.2-4.2c-7.9-1.1-13.8-7.8-13.8-15.9V416c0-38.6 27.5-70.9 64-78.4v-45.2c-2.2.7-4.4 1.1-6.6 1.9-18 6.3-37.3 9.8-57.4 9.8s-39.4-3.5-57.4-9.8c-7.4-2.6-14.9-4.2-22.6-5.2v81.6c23.1 6.9 40 28.1 40 53.4 0 30.9-25.1 56-56 56s-56-25.1-56-56c0-25.3 16.9-46.5 40-53.4v-80.4C48.5 301 0 355.8 0 422.4v44.8C0 491.9 20.1 512 44.8 512h358.4c24.7 0 44.8-20.1 44.8-44.8v-44.8c0-72-56.8-130.3-128-133.8z\"]\n};\nvar faUserMinus = {\n prefix: 'fas',\n iconName: 'user-minus',\n icon: [640, 512, [], \"f503\", \"M624 208H432c-8.8 0-16 7.2-16 16v32c0 8.8 7.2 16 16 16h192c8.8 0 16-7.2 16-16v-32c0-8.8-7.2-16-16-16zm-400 48c70.7 0 128-57.3 128-128S294.7 0 224 0 96 57.3 96 128s57.3 128 128 128zm89.6 32h-16.7c-22.2 10.2-46.9 16-72.9 16s-50.6-5.8-72.9-16h-16.7C60.2 288 0 348.2 0 422.4V464c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48v-41.6c0-74.2-60.2-134.4-134.4-134.4z\"]\n};\nvar faUserNinja = {\n prefix: 'fas',\n iconName: 'user-ninja',\n icon: [448, 512, [], \"f504\", \"M325.4 289.2L224 390.6 122.6 289.2C54 295.3 0 352.2 0 422.4V464c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48v-41.6c0-70.2-54-127.1-122.6-133.2zM32 192c27.3 0 51.8-11.5 69.2-29.7 15.1 53.9 64 93.7 122.8 93.7 70.7 0 128-57.3 128-128S294.7 0 224 0c-50.4 0-93.6 29.4-114.5 71.8C92.1 47.8 64 32 32 32c0 33.4 17.1 62.8 43.1 80-26 17.2-43.1 46.6-43.1 80zm144-96h96c17.7 0 32 14.3 32 32H144c0-17.7 14.3-32 32-32z\"]\n};\nvar faUserNurse = {\n prefix: 'fas',\n iconName: 'user-nurse',\n icon: [448, 512, [], \"f82f\", \"M57.78 288h82.36c22.51 19.68 51.62 32 83.86 32s61.35-12.32 83.86-32h82.36a16 16 0 0 0 14.28-23.18c-15.23-29.85-31.28-62.23-42.15-95.54C354.78 146.09 352 121.59 352 97.2V48L224 0 96 48v49.2c0 24.39-2.75 48.89-10.33 72.08C74.78 202.59 58.73 235 43.5 264.82A16 16 0 0 0 57.78 288zM184 71.67a5 5 0 0 1 5-5h21.67V45a5 5 0 0 1 5-5h16.66a5 5 0 0 1 5 5v21.67H259a5 5 0 0 1 5 5v16.66a5 5 0 0 1-5 5h-21.67V115a5 5 0 0 1-5 5h-16.66a5 5 0 0 1-5-5V93.33H189a5 5 0 0 1-5-5zM144 160h160v32a80 80 0 0 1-160 0zm175.41 160L224 415.39 128.59 320C57.1 323.1 0 381.6 0 453.79A58.21 58.21 0 0 0 58.21 512h331.58A58.21 58.21 0 0 0 448 453.79C448 381.6 390.9 323.1 319.41 320z\"]\n};\nvar faUserPlus = {\n prefix: 'fas',\n iconName: 'user-plus',\n icon: [640, 512, [], \"f234\", \"M624 208h-64v-64c0-8.8-7.2-16-16-16h-32c-8.8 0-16 7.2-16 16v64h-64c-8.8 0-16 7.2-16 16v32c0 8.8 7.2 16 16 16h64v64c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16v-64h64c8.8 0 16-7.2 16-16v-32c0-8.8-7.2-16-16-16zm-400 48c70.7 0 128-57.3 128-128S294.7 0 224 0 96 57.3 96 128s57.3 128 128 128zm89.6 32h-16.7c-22.2 10.2-46.9 16-72.9 16s-50.6-5.8-72.9-16h-16.7C60.2 288 0 348.2 0 422.4V464c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48v-41.6c0-74.2-60.2-134.4-134.4-134.4z\"]\n};\nvar faUserSecret = {\n prefix: 'fas',\n iconName: 'user-secret',\n icon: [448, 512, [], \"f21b\", \"M383.9 308.3l23.9-62.6c4-10.5-3.7-21.7-15-21.7h-58.5c11-18.9 17.8-40.6 17.8-64v-.3c39.2-7.8 64-19.1 64-31.7 0-13.3-27.3-25.1-70.1-33-9.2-32.8-27-65.8-40.6-82.8-9.5-11.9-25.9-15.6-39.5-8.8l-27.6 13.8c-9 4.5-19.6 4.5-28.6 0L182.1 3.4c-13.6-6.8-30-3.1-39.5 8.8-13.5 17-31.4 50-40.6 82.8-42.7 7.9-70 19.7-70 33 0 12.6 24.8 23.9 64 31.7v.3c0 23.4 6.8 45.1 17.8 64H56.3c-11.5 0-19.2 11.7-14.7 22.3l25.8 60.2C27.3 329.8 0 372.7 0 422.4v44.8C0 491.9 20.1 512 44.8 512h358.4c24.7 0 44.8-20.1 44.8-44.8v-44.8c0-48.4-25.8-90.4-64.1-114.1zM176 480l-41.6-192 49.6 32 24 40-32 120zm96 0l-32-120 24-40 49.6-32L272 480zm41.7-298.5c-3.9 11.9-7 24.6-16.5 33.4-10.1 9.3-48 22.4-64-25-2.8-8.4-15.4-8.4-18.3 0-17 50.2-56 32.4-64 25-9.5-8.8-12.7-21.5-16.5-33.4-.8-2.5-6.3-5.7-6.3-5.8v-10.8c28.3 3.6 61 5.8 96 5.8s67.7-2.1 96-5.8v10.8c-.1.1-5.6 3.2-6.4 5.8z\"]\n};\nvar faUserShield = {\n prefix: 'fas',\n iconName: 'user-shield',\n icon: [640, 512, [], \"f505\", \"M622.3 271.1l-115.2-45c-4.1-1.6-12.6-3.7-22.2 0l-115.2 45c-10.7 4.2-17.7 14-17.7 24.9 0 111.6 68.7 188.8 132.9 213.9 9.6 3.7 18 1.6 22.2 0C558.4 489.9 640 420.5 640 296c0-10.9-7-20.7-17.7-24.9zM496 462.4V273.3l95.5 37.3c-5.6 87.1-60.9 135.4-95.5 151.8zM224 256c70.7 0 128-57.3 128-128S294.7 0 224 0 96 57.3 96 128s57.3 128 128 128zm96 40c0-2.5.8-4.8 1.1-7.2-2.5-.1-4.9-.8-7.5-.8h-16.7c-22.2 10.2-46.9 16-72.9 16s-50.6-5.8-72.9-16h-16.7C60.2 288 0 348.2 0 422.4V464c0 26.5 21.5 48 48 48h352c6.8 0 13.3-1.5 19.2-4-54-42.9-99.2-116.7-99.2-212z\"]\n};\nvar faUserSlash = {\n prefix: 'fas',\n iconName: 'user-slash',\n icon: [640, 512, [], \"f506\", \"M633.8 458.1L362.3 248.3C412.1 230.7 448 183.8 448 128 448 57.3 390.7 0 320 0c-67.1 0-121.5 51.8-126.9 117.4L45.5 3.4C38.5-2 28.5-.8 23 6.2L3.4 31.4c-5.4 7-4.2 17 2.8 22.4l588.4 454.7c7 5.4 17 4.2 22.5-2.8l19.6-25.3c5.4-6.8 4.1-16.9-2.9-22.3zM96 422.4V464c0 26.5 21.5 48 48 48h350.2L207.4 290.3C144.2 301.3 96 356 96 422.4z\"]\n};\nvar faUserTag = {\n prefix: 'fas',\n iconName: 'user-tag',\n icon: [640, 512, [], \"f507\", \"M630.6 364.9l-90.3-90.2c-12-12-28.3-18.7-45.3-18.7h-79.3c-17.7 0-32 14.3-32 32v79.2c0 17 6.7 33.2 18.7 45.2l90.3 90.2c12.5 12.5 32.8 12.5 45.3 0l92.5-92.5c12.6-12.5 12.6-32.7.1-45.2zm-182.8-21c-13.3 0-24-10.7-24-24s10.7-24 24-24 24 10.7 24 24c0 13.2-10.7 24-24 24zm-223.8-88c70.7 0 128-57.3 128-128C352 57.3 294.7 0 224 0S96 57.3 96 128c0 70.6 57.3 127.9 128 127.9zm127.8 111.2V294c-12.2-3.6-24.9-6.2-38.2-6.2h-16.7c-22.2 10.2-46.9 16-72.9 16s-50.6-5.8-72.9-16h-16.7C60.2 287.9 0 348.1 0 422.3v41.6c0 26.5 21.5 48 48 48h352c15.5 0 29.1-7.5 37.9-18.9l-58-58c-18.1-18.1-28.1-42.2-28.1-67.9z\"]\n};\nvar faUserTie = {\n prefix: 'fas',\n iconName: 'user-tie',\n icon: [448, 512, [], \"f508\", \"M224 256c70.7 0 128-57.3 128-128S294.7 0 224 0 96 57.3 96 128s57.3 128 128 128zm95.8 32.6L272 480l-32-136 32-56h-96l32 56-32 136-47.8-191.4C56.9 292 0 350.3 0 422.4V464c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48v-41.6c0-72.1-56.9-130.4-128.2-133.8z\"]\n};\nvar faUserTimes = {\n prefix: 'fas',\n iconName: 'user-times',\n icon: [640, 512, [], \"f235\", \"M589.6 240l45.6-45.6c6.3-6.3 6.3-16.5 0-22.8l-22.8-22.8c-6.3-6.3-16.5-6.3-22.8 0L544 194.4l-45.6-45.6c-6.3-6.3-16.5-6.3-22.8 0l-22.8 22.8c-6.3 6.3-6.3 16.5 0 22.8l45.6 45.6-45.6 45.6c-6.3 6.3-6.3 16.5 0 22.8l22.8 22.8c6.3 6.3 16.5 6.3 22.8 0l45.6-45.6 45.6 45.6c6.3 6.3 16.5 6.3 22.8 0l22.8-22.8c6.3-6.3 6.3-16.5 0-22.8L589.6 240zM224 256c70.7 0 128-57.3 128-128S294.7 0 224 0 96 57.3 96 128s57.3 128 128 128zm89.6 32h-16.7c-22.2 10.2-46.9 16-72.9 16s-50.6-5.8-72.9-16h-16.7C60.2 288 0 348.2 0 422.4V464c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48v-41.6c0-74.2-60.2-134.4-134.4-134.4z\"]\n};\nvar faUsers = {\n prefix: 'fas',\n iconName: 'users',\n icon: [640, 512, [], \"f0c0\", \"M96 224c35.3 0 64-28.7 64-64s-28.7-64-64-64-64 28.7-64 64 28.7 64 64 64zm448 0c35.3 0 64-28.7 64-64s-28.7-64-64-64-64 28.7-64 64 28.7 64 64 64zm32 32h-64c-17.6 0-33.5 7.1-45.1 18.6 40.3 22.1 68.9 62 75.1 109.4h66c17.7 0 32-14.3 32-32v-32c0-35.3-28.7-64-64-64zm-256 0c61.9 0 112-50.1 112-112S381.9 32 320 32 208 82.1 208 144s50.1 112 112 112zm76.8 32h-8.3c-20.8 10-43.9 16-68.5 16s-47.6-6-68.5-16h-8.3C179.6 288 128 339.6 128 403.2V432c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48v-28.8c0-63.6-51.6-115.2-115.2-115.2zm-223.7-13.4C161.5 263.1 145.6 256 128 256H64c-35.3 0-64 28.7-64 64v32c0 17.7 14.3 32 32 32h65.9c6.3-47.4 34.9-87.3 75.2-109.4z\"]\n};\nvar faUsersCog = {\n prefix: 'fas',\n iconName: 'users-cog',\n icon: [640, 512, [], \"f509\", \"M610.5 341.3c2.6-14.1 2.6-28.5 0-42.6l25.8-14.9c3-1.7 4.3-5.2 3.3-8.5-6.7-21.6-18.2-41.2-33.2-57.4-2.3-2.5-6-3.1-9-1.4l-25.8 14.9c-10.9-9.3-23.4-16.5-36.9-21.3v-29.8c0-3.4-2.4-6.4-5.7-7.1-22.3-5-45-4.8-66.2 0-3.3.7-5.7 3.7-5.7 7.1v29.8c-13.5 4.8-26 12-36.9 21.3l-25.8-14.9c-2.9-1.7-6.7-1.1-9 1.4-15 16.2-26.5 35.8-33.2 57.4-1 3.3.4 6.8 3.3 8.5l25.8 14.9c-2.6 14.1-2.6 28.5 0 42.6l-25.8 14.9c-3 1.7-4.3 5.2-3.3 8.5 6.7 21.6 18.2 41.1 33.2 57.4 2.3 2.5 6 3.1 9 1.4l25.8-14.9c10.9 9.3 23.4 16.5 36.9 21.3v29.8c0 3.4 2.4 6.4 5.7 7.1 22.3 5 45 4.8 66.2 0 3.3-.7 5.7-3.7 5.7-7.1v-29.8c13.5-4.8 26-12 36.9-21.3l25.8 14.9c2.9 1.7 6.7 1.1 9-1.4 15-16.2 26.5-35.8 33.2-57.4 1-3.3-.4-6.8-3.3-8.5l-25.8-14.9zM496 368.5c-26.8 0-48.5-21.8-48.5-48.5s21.8-48.5 48.5-48.5 48.5 21.8 48.5 48.5-21.7 48.5-48.5 48.5zM96 224c35.3 0 64-28.7 64-64s-28.7-64-64-64-64 28.7-64 64 28.7 64 64 64zm224 32c1.9 0 3.7-.5 5.6-.6 8.3-21.7 20.5-42.1 36.3-59.2 7.4-8 17.9-12.6 28.9-12.6 6.9 0 13.7 1.8 19.6 5.3l7.9 4.6c.8-.5 1.6-.9 2.4-1.4 7-14.6 11.2-30.8 11.2-48 0-61.9-50.1-112-112-112S208 82.1 208 144c0 61.9 50.1 112 112 112zm105.2 194.5c-2.3-1.2-4.6-2.6-6.8-3.9-8.2 4.8-15.3 9.8-27.5 9.8-10.9 0-21.4-4.6-28.9-12.6-18.3-19.8-32.3-43.9-40.2-69.6-10.7-34.5 24.9-49.7 25.8-50.3-.1-2.6-.1-5.2 0-7.8l-7.9-4.6c-3.8-2.2-7-5-9.8-8.1-3.3.2-6.5.6-9.8.6-24.6 0-47.6-6-68.5-16h-8.3C179.6 288 128 339.6 128 403.2V432c0 26.5 21.5 48 48 48h255.4c-3.7-6-6.2-12.8-6.2-20.3v-9.2zM173.1 274.6C161.5 263.1 145.6 256 128 256H64c-35.3 0-64 28.7-64 64v32c0 17.7 14.3 32 32 32h65.9c6.3-47.4 34.9-87.3 75.2-109.4z\"]\n};\nvar faUtensilSpoon = {\n prefix: 'fas',\n iconName: 'utensil-spoon',\n icon: [512, 512, [], \"f2e5\", \"M480.1 31.9c-55-55.1-164.9-34.5-227.8 28.5-49.3 49.3-55.1 110-28.8 160.4L9 413.2c-11.6 10.5-12.1 28.5-1 39.5L59.3 504c11 11 29.1 10.5 39.5-1.1l192.4-214.4c50.4 26.3 111.1 20.5 160.4-28.8 63-62.9 83.6-172.8 28.5-227.8z\"]\n};\nvar faUtensils = {\n prefix: 'fas',\n iconName: 'utensils',\n icon: [416, 512, [], \"f2e7\", \"M207.9 15.2c.8 4.7 16.1 94.5 16.1 128.8 0 52.3-27.8 89.6-68.9 104.6L168 486.7c.7 13.7-10.2 25.3-24 25.3H80c-13.7 0-24.7-11.5-24-25.3l12.9-238.1C27.7 233.6 0 196.2 0 144 0 109.6 15.3 19.9 16.1 15.2 19.3-5.1 61.4-5.4 64 16.3v141.2c1.3 3.4 15.1 3.2 16 0 1.4-25.3 7.9-139.2 8-141.8 3.3-20.8 44.7-20.8 47.9 0 .2 2.7 6.6 116.5 8 141.8.9 3.2 14.8 3.4 16 0V16.3c2.6-21.6 44.8-21.4 48-1.1zm119.2 285.7l-15 185.1c-1.2 14 9.9 26 23.9 26h56c13.3 0 24-10.7 24-24V24c0-13.2-10.7-24-24-24-82.5 0-221.4 178.5-64.9 300.9z\"]\n};\nvar faVectorSquare = {\n prefix: 'fas',\n iconName: 'vector-square',\n icon: [512, 512, [], \"f5cb\", \"M512 128V32c0-17.67-14.33-32-32-32h-96c-17.67 0-32 14.33-32 32H160c0-17.67-14.33-32-32-32H32C14.33 0 0 14.33 0 32v96c0 17.67 14.33 32 32 32v192c-17.67 0-32 14.33-32 32v96c0 17.67 14.33 32 32 32h96c17.67 0 32-14.33 32-32h192c0 17.67 14.33 32 32 32h96c17.67 0 32-14.33 32-32v-96c0-17.67-14.33-32-32-32V160c17.67 0 32-14.33 32-32zm-96-64h32v32h-32V64zM64 64h32v32H64V64zm32 384H64v-32h32v32zm352 0h-32v-32h32v32zm-32-96h-32c-17.67 0-32 14.33-32 32v32H160v-32c0-17.67-14.33-32-32-32H96V160h32c17.67 0 32-14.33 32-32V96h192v32c0 17.67 14.33 32 32 32h32v192z\"]\n};\nvar faVenus = {\n prefix: 'fas',\n iconName: 'venus',\n icon: [288, 512, [], \"f221\", \"M288 176c0-79.5-64.5-144-144-144S0 96.5 0 176c0 68.5 47.9 125.9 112 140.4V368H76c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h36v36c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12v-36h36c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-36v-51.6c64.1-14.5 112-71.9 112-140.4zm-224 0c0-44.1 35.9-80 80-80s80 35.9 80 80-35.9 80-80 80-80-35.9-80-80z\"]\n};\nvar faVenusDouble = {\n prefix: 'fas',\n iconName: 'venus-double',\n icon: [512, 512, [], \"f226\", \"M288 176c0-79.5-64.5-144-144-144S0 96.5 0 176c0 68.5 47.9 125.9 112 140.4V368H76c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h36v36c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12v-36h36c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-36v-51.6c64.1-14.5 112-71.9 112-140.4zm-224 0c0-44.1 35.9-80 80-80s80 35.9 80 80-35.9 80-80 80-80-35.9-80-80zm336 140.4V368h36c6.6 0 12 5.4 12 12v40c0 6.6-5.4 12-12 12h-36v36c0 6.6-5.4 12-12 12h-40c-6.6 0-12-5.4-12-12v-36h-36c-6.6 0-12-5.4-12-12v-40c0-6.6 5.4-12 12-12h36v-51.6c-21.2-4.8-40.6-14.3-57.2-27.3 14-16.7 25-36 32.1-57.1 14.5 14.8 34.7 24 57.1 24 44.1 0 80-35.9 80-80s-35.9-80-80-80c-22.3 0-42.6 9.2-57.1 24-7.1-21.1-18-40.4-32.1-57.1C303.4 43.6 334.3 32 368 32c79.5 0 144 64.5 144 144 0 68.5-47.9 125.9-112 140.4z\"]\n};\nvar faVenusMars = {\n prefix: 'fas',\n iconName: 'venus-mars',\n icon: [576, 512, [], \"f228\", \"M564 0h-79c-10.7 0-16 12.9-8.5 20.5l16.9 16.9-48.7 48.7C422.5 72.1 396.2 64 368 64c-33.7 0-64.6 11.6-89.2 30.9 14 16.7 25 36 32.1 57.1 14.5-14.8 34.7-24 57.1-24 44.1 0 80 35.9 80 80s-35.9 80-80 80c-22.3 0-42.6-9.2-57.1-24-7.1 21.1-18 40.4-32.1 57.1 24.5 19.4 55.5 30.9 89.2 30.9 79.5 0 144-64.5 144-144 0-28.2-8.1-54.5-22.1-76.7l48.7-48.7 16.9 16.9c2.4 2.4 5.4 3.5 8.4 3.5 6.2 0 12.1-4.8 12.1-12V12c0-6.6-5.4-12-12-12zM144 64C64.5 64 0 128.5 0 208c0 68.5 47.9 125.9 112 140.4V400H76c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h36v36c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12v-36h36c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-36v-51.6c64.1-14.6 112-71.9 112-140.4 0-79.5-64.5-144-144-144zm0 224c-44.1 0-80-35.9-80-80s35.9-80 80-80 80 35.9 80 80-35.9 80-80 80z\"]\n};\nvar faVial = {\n prefix: 'fas',\n iconName: 'vial',\n icon: [480, 512, [], \"f492\", \"M477.7 186.1L309.5 18.3c-3.1-3.1-8.2-3.1-11.3 0l-34 33.9c-3.1 3.1-3.1 8.2 0 11.3l11.2 11.1L33 316.5c-38.8 38.7-45.1 102-9.4 143.5 20.6 24 49.5 36 78.4 35.9 26.4 0 52.8-10 72.9-30.1l246.3-245.7 11.2 11.1c3.1 3.1 8.2 3.1 11.3 0l34-33.9c3.1-3 3.1-8.1 0-11.2zM318 256H161l148-147.7 78.5 78.3L318 256z\"]\n};\nvar faVials = {\n prefix: 'fas',\n iconName: 'vials',\n icon: [640, 512, [], \"f493\", \"M72 64h24v240c0 44.1 35.9 80 80 80s80-35.9 80-80V64h24c4.4 0 8-3.6 8-8V8c0-4.4-3.6-8-8-8H72c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8zm72 0h64v96h-64V64zm480 384H16c-8.8 0-16 7.2-16 16v32c0 8.8 7.2 16 16 16h608c8.8 0 16-7.2 16-16v-32c0-8.8-7.2-16-16-16zM360 64h24v240c0 44.1 35.9 80 80 80s80-35.9 80-80V64h24c4.4 0 8-3.6 8-8V8c0-4.4-3.6-8-8-8H360c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8zm72 0h64v96h-64V64z\"]\n};\nvar faVideo = {\n prefix: 'fas',\n iconName: 'video',\n icon: [576, 512, [], \"f03d\", \"M336.2 64H47.8C21.4 64 0 85.4 0 111.8v288.4C0 426.6 21.4 448 47.8 448h288.4c26.4 0 47.8-21.4 47.8-47.8V111.8c0-26.4-21.4-47.8-47.8-47.8zm189.4 37.7L416 177.3v157.4l109.6 75.5c21.2 14.6 50.4-.3 50.4-25.8V127.5c0-25.4-29.1-40.4-50.4-25.8z\"]\n};\nvar faVideoSlash = {\n prefix: 'fas',\n iconName: 'video-slash',\n icon: [640, 512, [], \"f4e2\", \"M633.8 458.1l-55-42.5c15.4-1.4 29.2-13.7 29.2-31.1v-257c0-25.5-29.1-40.4-50.4-25.8L448 177.3v137.2l-32-24.7v-178c0-26.4-21.4-47.8-47.8-47.8H123.9L45.5 3.4C38.5-2 28.5-.8 23 6.2L3.4 31.4c-5.4 7-4.2 17 2.8 22.4L42.7 82 416 370.6l178.5 138c7 5.4 17 4.2 22.5-2.8l19.6-25.3c5.5-6.9 4.2-17-2.8-22.4zM32 400.2c0 26.4 21.4 47.8 47.8 47.8h288.4c11.2 0 21.4-4 29.6-10.5L32 154.7v245.5z\"]\n};\nvar faVihara = {\n prefix: 'fas',\n iconName: 'vihara',\n icon: [640, 512, [], \"f6a7\", \"M632.88 400.71L544 352v-64l55.16-17.69c11.79-5.9 11.79-22.72 0-28.62L480 192v-64l27.31-16.3c7.72-7.72 5.61-20.74-4.16-25.62L320 0 136.85 86.07c-9.77 4.88-11.88 17.9-4.16 25.62L160 128v64L40.84 241.69c-11.79 5.9-11.79 22.72 0 28.62L96 288v64L7.12 400.71c-5.42 3.62-7.7 9.63-7 15.29.62 5.01 3.57 9.75 8.72 12.33L64 448v48c0 8.84 7.16 16 16 16h32c8.84 0 16-7.16 16-16v-48h160v48c0 8.84 7.16 16 16 16h32c8.84 0 16-7.16 16-16v-48h160v48c0 8.84 7.16 16 16 16h32c8.84 0 16-7.16 16-16v-48l55.15-19.67c5.16-2.58 8.1-7.32 8.72-12.33.71-5.67-1.57-11.68-6.99-15.29zM224 128h192v64H224v-64zm-64 224v-64h320v64H160z\"]\n};\nvar faVolleyballBall = {\n prefix: 'fas',\n iconName: 'volleyball-ball',\n icon: [495, 512, [], \"f45f\", \"M223.3 243.4c-.9-37-8.6-72.8-22.7-105.7-90.8 42.4-157.5 122.4-180.3 216.8 13.4 30.8 32.9 58.3 56.9 81.1 22.7-79.2 74.2-147.8 146.1-192.2zM186.4 109c-15-26.4-34.5-50.1-57.4-70.7C38 88.1-15.8 191.2 4 300.5c33.4-83.1 98.4-152 182.4-191.5zM374 274.1c8.6-99.8-27.3-197.5-97.5-264.4-14.7-1.7-51.6-5.5-98.9 8.5 57.3 59.3 91 138.2 93.5 222.7 32.5 17.7 67.3 29 102.9 33.2zm-124.7 9.5c-31.6 19.3-58.7 43.9-80.2 72.6 82 57.3 184.5 75.1 277.5 47.8 19.7-26.4 34.2-56.8 42.2-89.9-26.6 6.6-53.7 10.4-80.9 10.4-54.6-.1-108.9-14.1-158.6-40.9zM151 383.3c-15.2 26-25.7 54.4-32.1 84.2 37.6 23 81.7 36.5 129.1 36.5 61 0 116.7-22.1 159.9-58.6C295 461.5 204.6 420.6 151 383.3zM331.3 22.7c55.3 70.4 82.5 161.2 74.6 253.6 30.3.2 60.5-4.8 89.7-14.2 0-2 .3-4 .3-6 0-107.8-68.7-199.1-164.6-233.4z\"]\n};\nvar faVolumeDown = {\n prefix: 'fas',\n iconName: 'volume-down',\n icon: [384, 512, [], \"f027\", \"M215.03 72.04L126.06 161H24c-13.26 0-24 10.74-24 24v144c0 13.25 10.74 24 24 24h102.06l88.97 88.95c15.03 15.03 40.97 4.47 40.97-16.97V89.02c0-21.47-25.96-31.98-40.97-16.98zm123.2 108.08c-11.58-6.33-26.19-2.16-32.61 9.45-6.39 11.61-2.16 26.2 9.45 32.61C327.98 229.28 336 242.62 336 257c0 14.38-8.02 27.72-20.92 34.81-11.61 6.41-15.84 21-9.45 32.61 6.43 11.66 21.05 15.8 32.61 9.45 28.23-15.55 45.77-45 45.77-76.88s-17.54-61.32-45.78-76.87z\"]\n};\nvar faVolumeMute = {\n prefix: 'fas',\n iconName: 'volume-mute',\n icon: [512, 512, [], \"f6a9\", \"M215.03 71.05L126.06 160H24c-13.26 0-24 10.74-24 24v144c0 13.25 10.74 24 24 24h102.06l88.97 88.95c15.03 15.03 40.97 4.47 40.97-16.97V88.02c0-21.46-25.96-31.98-40.97-16.97zM461.64 256l45.64-45.64c6.3-6.3 6.3-16.52 0-22.82l-22.82-22.82c-6.3-6.3-16.52-6.3-22.82 0L416 210.36l-45.64-45.64c-6.3-6.3-16.52-6.3-22.82 0l-22.82 22.82c-6.3 6.3-6.3 16.52 0 22.82L370.36 256l-45.63 45.63c-6.3 6.3-6.3 16.52 0 22.82l22.82 22.82c6.3 6.3 16.52 6.3 22.82 0L416 301.64l45.64 45.64c6.3 6.3 16.52 6.3 22.82 0l22.82-22.82c6.3-6.3 6.3-16.52 0-22.82L461.64 256z\"]\n};\nvar faVolumeOff = {\n prefix: 'fas',\n iconName: 'volume-off',\n icon: [257, 512, [], \"f026\", \"M216.36 71.04L127.39 160H25.33c-13.26 0-24 10.74-24 24v144c0 13.25 10.74 24 24 24h102.06l88.97 88.95c15.03 15.03 40.97 4.47 40.97-16.97V88.02c0-21.47-25.96-31.98-40.97-16.98z\"]\n};\nvar faVolumeUp = {\n prefix: 'fas',\n iconName: 'volume-up',\n icon: [576, 512, [], \"f028\", \"M215.03 71.05L126.06 160H24c-13.26 0-24 10.74-24 24v144c0 13.25 10.74 24 24 24h102.06l88.97 88.95c15.03 15.03 40.97 4.47 40.97-16.97V88.02c0-21.46-25.96-31.98-40.97-16.97zm233.32-51.08c-11.17-7.33-26.18-4.24-33.51 6.95-7.34 11.17-4.22 26.18 6.95 33.51 66.27 43.49 105.82 116.6 105.82 195.58 0 78.98-39.55 152.09-105.82 195.58-11.17 7.32-14.29 22.34-6.95 33.5 7.04 10.71 21.93 14.56 33.51 6.95C528.27 439.58 576 351.33 576 256S528.27 72.43 448.35 19.97zM480 256c0-63.53-32.06-121.94-85.77-156.24-11.19-7.14-26.03-3.82-33.12 7.46s-3.78 26.21 7.41 33.36C408.27 165.97 432 209.11 432 256s-23.73 90.03-63.48 115.42c-11.19 7.14-14.5 22.07-7.41 33.36 6.51 10.36 21.12 15.14 33.12 7.46C447.94 377.94 480 319.54 480 256zm-141.77-76.87c-11.58-6.33-26.19-2.16-32.61 9.45-6.39 11.61-2.16 26.2 9.45 32.61C327.98 228.28 336 241.63 336 256c0 14.38-8.02 27.72-20.92 34.81-11.61 6.41-15.84 21-9.45 32.61 6.43 11.66 21.05 15.8 32.61 9.45 28.23-15.55 45.77-45 45.77-76.88s-17.54-61.32-45.78-76.86z\"]\n};\nvar faVoteYea = {\n prefix: 'fas',\n iconName: 'vote-yea',\n icon: [640, 512, [], \"f772\", \"M608 320h-64v64h22.4c5.3 0 9.6 3.6 9.6 8v16c0 4.4-4.3 8-9.6 8H73.6c-5.3 0-9.6-3.6-9.6-8v-16c0-4.4 4.3-8 9.6-8H96v-64H32c-17.7 0-32 14.3-32 32v96c0 17.7 14.3 32 32 32h576c17.7 0 32-14.3 32-32v-96c0-17.7-14.3-32-32-32zm-96 64V64.3c0-17.9-14.5-32.3-32.3-32.3H160.4C142.5 32 128 46.5 128 64.3V384h384zM211.2 202l25.5-25.3c4.2-4.2 11-4.2 15.2.1l41.3 41.6 95.2-94.4c4.2-4.2 11-4.2 15.2.1l25.3 25.5c4.2 4.2 4.2 11-.1 15.2L300.5 292c-4.2 4.2-11 4.2-15.2-.1l-74.1-74.7c-4.3-4.2-4.2-11 0-15.2z\"]\n};\nvar faVrCardboard = {\n prefix: 'fas',\n iconName: 'vr-cardboard',\n icon: [640, 512, [], \"f729\", \"M608 64H32C14.33 64 0 78.33 0 96v320c0 17.67 14.33 32 32 32h160.22c25.19 0 48.03-14.77 58.36-37.74l27.74-61.64C286.21 331.08 302.35 320 320 320s33.79 11.08 41.68 28.62l27.74 61.64C399.75 433.23 422.6 448 447.78 448H608c17.67 0 32-14.33 32-32V96c0-17.67-14.33-32-32-32zM160 304c-35.35 0-64-28.65-64-64s28.65-64 64-64 64 28.65 64 64-28.65 64-64 64zm320 0c-35.35 0-64-28.65-64-64s28.65-64 64-64 64 28.65 64 64-28.65 64-64 64z\"]\n};\nvar faWalking = {\n prefix: 'fas',\n iconName: 'walking',\n icon: [320, 512, [], \"f554\", \"M208 96c26.5 0 48-21.5 48-48S234.5 0 208 0s-48 21.5-48 48 21.5 48 48 48zm94.5 149.1l-23.3-11.8-9.7-29.4c-14.7-44.6-55.7-75.8-102.2-75.9-36-.1-55.9 10.1-93.3 25.2-21.6 8.7-39.3 25.2-49.7 46.2L17.6 213c-7.8 15.8-1.5 35 14.2 42.9 15.6 7.9 34.6 1.5 42.5-14.3L81 228c3.5-7 9.3-12.5 16.5-15.4l26.8-10.8-15.2 60.7c-5.2 20.8.4 42.9 14.9 58.8l59.9 65.4c7.2 7.9 12.3 17.4 14.9 27.7l18.3 73.3c4.3 17.1 21.7 27.6 38.8 23.3 17.1-4.3 27.6-21.7 23.3-38.8l-22.2-89c-2.6-10.3-7.7-19.9-14.9-27.7l-45.5-49.7 17.2-68.7 5.5 16.5c5.3 16.1 16.7 29.4 31.7 37l23.3 11.8c15.6 7.9 34.6 1.5 42.5-14.3 7.7-15.7 1.4-35.1-14.3-43zM73.6 385.8c-3.2 8.1-8 15.4-14.2 21.5l-50 50.1c-12.5 12.5-12.5 32.8 0 45.3s32.7 12.5 45.2 0l59.4-59.4c6.1-6.1 10.9-13.4 14.2-21.5l13.5-33.8c-55.3-60.3-38.7-41.8-47.4-53.7l-20.7 51.5z\"]\n};\nvar faWallet = {\n prefix: 'fas',\n iconName: 'wallet',\n icon: [512, 512, [], \"f555\", \"M461.2 128H80c-8.84 0-16-7.16-16-16s7.16-16 16-16h384c8.84 0 16-7.16 16-16 0-26.51-21.49-48-48-48H64C28.65 32 0 60.65 0 96v320c0 35.35 28.65 64 64 64h397.2c28.02 0 50.8-21.53 50.8-48V176c0-26.47-22.78-48-50.8-48zM416 336c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32z\"]\n};\nvar faWarehouse = {\n prefix: 'fas',\n iconName: 'warehouse',\n icon: [640, 512, [], \"f494\", \"M504 352H136.4c-4.4 0-8 3.6-8 8l-.1 48c0 4.4 3.6 8 8 8H504c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8zm0 96H136.1c-4.4 0-8 3.6-8 8l-.1 48c0 4.4 3.6 8 8 8h368c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8zm0-192H136.6c-4.4 0-8 3.6-8 8l-.1 48c0 4.4 3.6 8 8 8H504c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8zm106.5-139L338.4 3.7a48.15 48.15 0 0 0-36.9 0L29.5 117C11.7 124.5 0 141.9 0 161.3V504c0 4.4 3.6 8 8 8h80c4.4 0 8-3.6 8-8V256c0-17.6 14.6-32 32.6-32h382.8c18 0 32.6 14.4 32.6 32v248c0 4.4 3.6 8 8 8h80c4.4 0 8-3.6 8-8V161.3c0-19.4-11.7-36.8-29.5-44.3z\"]\n};\nvar faWater = {\n prefix: 'fas',\n iconName: 'water',\n icon: [576, 512, [], \"f773\", \"M562.1 383.9c-21.5-2.4-42.1-10.5-57.9-22.9-14.1-11.1-34.2-11.3-48.2 0-37.9 30.4-107.2 30.4-145.7-1.5-13.5-11.2-33-9.1-46.7 1.8-38 30.1-106.9 30-145.2-1.7-13.5-11.2-33.3-8.9-47.1 2-15.5 12.2-36 20.1-57.7 22.4-7.9.8-13.6 7.8-13.6 15.7v32.2c0 9.1 7.6 16.8 16.7 16 28.8-2.5 56.1-11.4 79.4-25.9 56.5 34.6 137 34.1 192 0 56.5 34.6 137 34.1 192 0 23.3 14.2 50.9 23.3 79.1 25.8 9.1.8 16.7-6.9 16.7-16v-31.6c.1-8-5.7-15.4-13.8-16.3zm0-144c-21.5-2.4-42.1-10.5-57.9-22.9-14.1-11.1-34.2-11.3-48.2 0-37.9 30.4-107.2 30.4-145.7-1.5-13.5-11.2-33-9.1-46.7 1.8-38 30.1-106.9 30-145.2-1.7-13.5-11.2-33.3-8.9-47.1 2-15.5 12.2-36 20.1-57.7 22.4-7.9.8-13.6 7.8-13.6 15.7v32.2c0 9.1 7.6 16.8 16.7 16 28.8-2.5 56.1-11.4 79.4-25.9 56.5 34.6 137 34.1 192 0 56.5 34.6 137 34.1 192 0 23.3 14.2 50.9 23.3 79.1 25.8 9.1.8 16.7-6.9 16.7-16v-31.6c.1-8-5.7-15.4-13.8-16.3zm0-144C540.6 93.4 520 85.4 504.2 73 490.1 61.9 470 61.7 456 73c-37.9 30.4-107.2 30.4-145.7-1.5-13.5-11.2-33-9.1-46.7 1.8-38 30.1-106.9 30-145.2-1.7-13.5-11.2-33.3-8.9-47.1 2-15.5 12.2-36 20.1-57.7 22.4-7.9.8-13.6 7.8-13.6 15.7v32.2c0 9.1 7.6 16.8 16.7 16 28.8-2.5 56.1-11.4 79.4-25.9 56.5 34.6 137 34.1 192 0 56.5 34.6 137 34.1 192 0 23.3 14.2 50.9 23.3 79.1 25.8 9.1.8 16.7-6.9 16.7-16v-31.6c.1-8-5.7-15.4-13.8-16.3z\"]\n};\nvar faWeight = {\n prefix: 'fas',\n iconName: 'weight',\n icon: [512, 512, [], \"f496\", \"M448 64h-25.98C438.44 92.28 448 125.01 448 160c0 105.87-86.13 192-192 192S64 265.87 64 160c0-34.99 9.56-67.72 25.98-96H64C28.71 64 0 92.71 0 128v320c0 35.29 28.71 64 64 64h384c35.29 0 64-28.71 64-64V128c0-35.29-28.71-64-64-64zM256 320c88.37 0 160-71.63 160-160S344.37 0 256 0 96 71.63 96 160s71.63 160 160 160zm-.3-151.94l33.58-78.36c3.5-8.17 12.94-11.92 21.03-8.41 8.12 3.48 11.88 12.89 8.41 21l-33.67 78.55C291.73 188 296 197.45 296 208c0 22.09-17.91 40-40 40s-40-17.91-40-40c0-21.98 17.76-39.77 39.7-39.94z\"]\n};\nvar faWeightHanging = {\n prefix: 'fas',\n iconName: 'weight-hanging',\n icon: [512, 512, [], \"f5cd\", \"M510.28 445.86l-73.03-292.13c-3.8-15.19-16.44-25.72-30.87-25.72h-60.25c3.57-10.05 5.88-20.72 5.88-32 0-53.02-42.98-96-96-96s-96 42.98-96 96c0 11.28 2.3 21.95 5.88 32h-60.25c-14.43 0-27.08 10.54-30.87 25.72L1.72 445.86C-6.61 479.17 16.38 512 48.03 512h415.95c31.64 0 54.63-32.83 46.3-66.14zM256 128c-17.64 0-32-14.36-32-32s14.36-32 32-32 32 14.36 32 32-14.36 32-32 32z\"]\n};\nvar faWheelchair = {\n prefix: 'fas',\n iconName: 'wheelchair',\n icon: [512, 512, [], \"f193\", \"M496.101 385.669l14.227 28.663c3.929 7.915.697 17.516-7.218 21.445l-65.465 32.886c-16.049 7.967-35.556 1.194-43.189-15.055L331.679 320H192c-15.925 0-29.426-11.71-31.679-27.475C126.433 55.308 128.38 70.044 128 64c0-36.358 30.318-65.635 67.052-63.929 33.271 1.545 60.048 28.905 60.925 62.201.868 32.933-23.152 60.423-54.608 65.039l4.67 32.69H336c8.837 0 16 7.163 16 16v32c0 8.837-7.163 16-16 16H215.182l4.572 32H352a32 32 0 0 1 28.962 18.392L438.477 396.8l36.178-18.349c7.915-3.929 17.517-.697 21.446 7.218zM311.358 352h-24.506c-7.788 54.204-54.528 96-110.852 96-61.757 0-112-50.243-112-112 0-41.505 22.694-77.809 56.324-97.156-3.712-25.965-6.844-47.86-9.488-66.333C45.956 198.464 0 261.963 0 336c0 97.047 78.953 176 176 176 71.87 0 133.806-43.308 161.11-105.192L311.358 352z\"]\n};\nvar faWifi = {\n prefix: 'fas',\n iconName: 'wifi',\n icon: [640, 512, [], \"f1eb\", \"M634.91 154.88C457.74-8.99 182.19-8.93 5.09 154.88c-6.66 6.16-6.79 16.59-.35 22.98l34.24 33.97c6.14 6.1 16.02 6.23 22.4.38 145.92-133.68 371.3-133.71 517.25 0 6.38 5.85 16.26 5.71 22.4-.38l34.24-33.97c6.43-6.39 6.3-16.82-.36-22.98zM320 352c-35.35 0-64 28.65-64 64s28.65 64 64 64 64-28.65 64-64-28.65-64-64-64zm202.67-83.59c-115.26-101.93-290.21-101.82-405.34 0-6.9 6.1-7.12 16.69-.57 23.15l34.44 33.99c6 5.92 15.66 6.32 22.05.8 83.95-72.57 209.74-72.41 293.49 0 6.39 5.52 16.05 5.13 22.05-.8l34.44-33.99c6.56-6.46 6.33-17.06-.56-23.15z\"]\n};\nvar faWind = {\n prefix: 'fas',\n iconName: 'wind',\n icon: [512, 512, [], \"f72e\", \"M156.7 256H16c-8.8 0-16 7.2-16 16v32c0 8.8 7.2 16 16 16h142.2c15.9 0 30.8 10.9 33.4 26.6 3.3 20-12.1 37.4-31.6 37.4-14.1 0-26.1-9.2-30.4-21.9-2.1-6.3-8.6-10.1-15.2-10.1H81.6c-9.8 0-17.7 8.8-15.9 18.4 8.6 44.1 47.6 77.6 94.2 77.6 57.1 0 102.7-50.1 95.2-108.6C249 291 205.4 256 156.7 256zM16 224h336c59.7 0 106.8-54.8 93.8-116.7-7.6-36.2-36.9-65.5-73.1-73.1-55.4-11.6-105.1 24.9-114.9 75.5-1.9 9.6 6.1 18.3 15.8 18.3h32.8c6.7 0 13.1-3.8 15.2-10.1C325.9 105.2 337.9 96 352 96c19.4 0 34.9 17.4 31.6 37.4-2.6 15.7-17.4 26.6-33.4 26.6H16c-8.8 0-16 7.2-16 16v32c0 8.8 7.2 16 16 16zm384 32H243.7c19.3 16.6 33.2 38.8 39.8 64H400c26.5 0 48 21.5 48 48s-21.5 48-48 48c-17.9 0-33.3-9.9-41.6-24.4-2.9-5-8.7-7.6-14.5-7.6h-33.8c-10.9 0-19 10.8-15.3 21.1 17.8 50.6 70.5 84.8 129.4 72.3 41.2-8.7 75.1-41.6 84.7-82.7C526 321.5 470.5 256 400 256z\"]\n};\nvar faWindowClose = {\n prefix: 'fas',\n iconName: 'window-close',\n icon: [512, 512, [], \"f410\", \"M464 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h416c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zm-83.6 290.5c4.8 4.8 4.8 12.6 0 17.4l-40.5 40.5c-4.8 4.8-12.6 4.8-17.4 0L256 313.3l-66.5 67.1c-4.8 4.8-12.6 4.8-17.4 0l-40.5-40.5c-4.8-4.8-4.8-12.6 0-17.4l67.1-66.5-67.1-66.5c-4.8-4.8-4.8-12.6 0-17.4l40.5-40.5c4.8-4.8 12.6-4.8 17.4 0l66.5 67.1 66.5-67.1c4.8-4.8 12.6-4.8 17.4 0l40.5 40.5c4.8 4.8 4.8 12.6 0 17.4L313.3 256l67.1 66.5z\"]\n};\nvar faWindowMaximize = {\n prefix: 'fas',\n iconName: 'window-maximize',\n icon: [512, 512, [], \"f2d0\", \"M464 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h416c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zm-16 160H64v-84c0-6.6 5.4-12 12-12h360c6.6 0 12 5.4 12 12v84z\"]\n};\nvar faWindowMinimize = {\n prefix: 'fas',\n iconName: 'window-minimize',\n icon: [512, 512, [], \"f2d1\", \"M464 352H48c-26.5 0-48 21.5-48 48v32c0 26.5 21.5 48 48 48h416c26.5 0 48-21.5 48-48v-32c0-26.5-21.5-48-48-48z\"]\n};\nvar faWindowRestore = {\n prefix: 'fas',\n iconName: 'window-restore',\n icon: [512, 512, [], \"f2d2\", \"M512 48v288c0 26.5-21.5 48-48 48h-48V176c0-44.1-35.9-80-80-80H128V48c0-26.5 21.5-48 48-48h288c26.5 0 48 21.5 48 48zM384 176v288c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V176c0-26.5 21.5-48 48-48h288c26.5 0 48 21.5 48 48zm-68 28c0-6.6-5.4-12-12-12H76c-6.6 0-12 5.4-12 12v52h252v-52z\"]\n};\nvar faWineBottle = {\n prefix: 'fas',\n iconName: 'wine-bottle',\n icon: [512, 512, [], \"f72f\", \"M507.31 72.57L439.43 4.69c-6.25-6.25-16.38-6.25-22.63 0l-22.63 22.63c-6.25 6.25-6.25 16.38 0 22.63l-76.67 76.67c-46.58-19.7-102.4-10.73-140.37 27.23L18.75 312.23c-24.99 24.99-24.99 65.52 0 90.51l90.51 90.51c24.99 24.99 65.52 24.99 90.51 0l158.39-158.39c37.96-37.96 46.93-93.79 27.23-140.37l76.67-76.67c6.25 6.25 16.38 6.25 22.63 0l22.63-22.63c6.24-6.24 6.24-16.37-.01-22.62zM179.22 423.29l-90.51-90.51 122.04-122.04 90.51 90.51-122.04 122.04z\"]\n};\nvar faWineGlass = {\n prefix: 'fas',\n iconName: 'wine-glass',\n icon: [288, 512, [], \"f4e3\", \"M216 464h-40V346.81c68.47-15.89 118.05-79.91 111.4-154.16l-15.95-178.1C270.71 6.31 263.9 0 255.74 0H32.26c-8.15 0-14.97 6.31-15.7 14.55L.6 192.66C-6.05 266.91 43.53 330.93 112 346.82V464H72c-22.09 0-40 17.91-40 40 0 4.42 3.58 8 8 8h208c4.42 0 8-3.58 8-8 0-22.09-17.91-40-40-40z\"]\n};\nvar faWineGlassAlt = {\n prefix: 'fas',\n iconName: 'wine-glass-alt',\n icon: [288, 512, [], \"f5ce\", \"M216 464h-40V346.81c68.47-15.89 118.05-79.91 111.4-154.16l-15.95-178.1C270.71 6.31 263.9 0 255.74 0H32.26c-8.15 0-14.97 6.31-15.7 14.55L.6 192.66C-6.05 266.91 43.53 330.93 112 346.82V464H72c-22.09 0-40 17.91-40 40 0 4.42 3.58 8 8 8h208c4.42 0 8-3.58 8-8 0-22.09-17.91-40-40-40zM61.75 48h164.5l7.17 80H54.58l7.17-80z\"]\n};\nvar faWonSign = {\n prefix: 'fas',\n iconName: 'won-sign',\n icon: [576, 512, [], \"f159\", \"M564 192c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-48l18.6-80.6c1.7-7.5-4-14.7-11.7-14.7h-46.1c-5.7 0-10.6 4-11.7 9.5L450.7 128H340.8l-19.7-86c-1.3-5.5-6.1-9.3-11.7-9.3h-44c-5.6 0-10.4 3.8-11.7 9.3l-20 86H125l-17.5-85.7c-1.1-5.6-6.1-9.6-11.8-9.6H53.6c-7.7 0-13.4 7.1-11.7 14.6L60 128H12c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h62.3l7.2 32H12c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h83.9l40.9 182.6c1.2 5.5 6.1 9.4 11.7 9.4h56.8c5.6 0 10.4-3.9 11.7-9.3L259.3 288h55.1l42.4 182.7c1.3 5.4 6.1 9.3 11.7 9.3h56.8c5.6 0 10.4-3.9 11.7-9.3L479.1 288H564c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-70.1l7.4-32zM183.8 342c-6.2 25.8-6.8 47.2-7.3 47.2h-1.1s-1.7-22-6.8-47.2l-11-54h38.8zm27.5-118h-66.8l-6.5-32h80.8zm62.9 0l2-8.6c1.9-8 3.5-16 4.8-23.4h11.8c1.3 7.4 2.9 15.4 4.8 23.4l2 8.6zm130.9 118c-5.1 25.2-6.8 47.2-6.8 47.2h-1.1c-.6 0-1.1-21.4-7.3-47.2l-12.4-54h39.1zm25.2-118h-67.4l-7.3-32h81.6z\"]\n};\nvar faWrench = {\n prefix: 'fas',\n iconName: 'wrench',\n icon: [512, 512, [], \"f0ad\", \"M507.73 109.1c-2.24-9.03-13.54-12.09-20.12-5.51l-74.36 74.36-67.88-11.31-11.31-67.88 74.36-74.36c6.62-6.62 3.43-17.9-5.66-20.16-47.38-11.74-99.55.91-136.58 37.93-39.64 39.64-50.55 97.1-34.05 147.2L18.74 402.76c-24.99 24.99-24.99 65.51 0 90.5 24.99 24.99 65.51 24.99 90.5 0l213.21-213.21c50.12 16.71 107.47 5.68 147.37-34.22 37.07-37.07 49.7-89.32 37.91-136.73zM64 472c-13.25 0-24-10.75-24-24 0-13.26 10.75-24 24-24s24 10.74 24 24c0 13.25-10.75 24-24 24z\"]\n};\nvar faXRay = {\n prefix: 'fas',\n iconName: 'x-ray',\n icon: [640, 512, [], \"f497\", \"M240 384c-8.8 0-16 7.2-16 16s7.2 16 16 16 16-7.2 16-16-7.2-16-16-16zm160 32c8.8 0 16-7.2 16-16s-7.2-16-16-16-16 7.2-16 16 7.2 16 16 16zM624 0H16C7.2 0 0 7.2 0 16v32c0 8.8 7.2 16 16 16h608c8.8 0 16-7.2 16-16V16c0-8.8-7.2-16-16-16zm0 448h-48V96H64v352H16c-8.8 0-16 7.2-16 16v32c0 8.8 7.2 16 16 16h608c8.8 0 16-7.2 16-16v-32c0-8.8-7.2-16-16-16zM480 248c0 4.4-3.6 8-8 8H336v32h104c4.4 0 8 3.6 8 8v16c0 4.4-3.6 8-8 8H336v32h64c26.5 0 48 21.5 48 48s-21.5 48-48 48-48-21.5-48-48v-16h-64v16c0 26.5-21.5 48-48 48s-48-21.5-48-48 21.5-48 48-48h64v-32H200c-4.4 0-8-3.6-8-8v-16c0-4.4 3.6-8 8-8h104v-32H168c-4.4 0-8-3.6-8-8v-16c0-4.4 3.6-8 8-8h136v-32H200c-4.4 0-8-3.6-8-8v-16c0-4.4 3.6-8 8-8h104v-24c0-4.4 3.6-8 8-8h16c4.4 0 8 3.6 8 8v24h104c4.4 0 8 3.6 8 8v16c0 4.4-3.6 8-8 8H336v32h136c4.4 0 8 3.6 8 8v16z\"]\n};\nvar faYenSign = {\n prefix: 'fas',\n iconName: 'yen-sign',\n icon: [384, 512, [], \"f157\", \"M351.2 32h-65.3c-4.6 0-8.8 2.6-10.8 6.7l-55.4 113.2c-14.5 34.7-27.1 71.9-27.1 71.9h-1.3s-12.6-37.2-27.1-71.9L108.8 38.7c-2-4.1-6.2-6.7-10.8-6.7H32.8c-9.1 0-14.8 9.7-10.6 17.6L102.3 200H44c-6.6 0-12 5.4-12 12v32c0 6.6 5.4 12 12 12h88.2l19.8 37.2V320H44c-6.6 0-12 5.4-12 12v32c0 6.6 5.4 12 12 12h108v92c0 6.6 5.4 12 12 12h56c6.6 0 12-5.4 12-12v-92h108c6.6 0 12-5.4 12-12v-32c0-6.6-5.4-12-12-12H232v-26.8l19.8-37.2H340c6.6 0 12-5.4 12-12v-32c0-6.6-5.4-12-12-12h-58.3l80.1-150.4c4.3-7.9-1.5-17.6-10.6-17.6z\"]\n};\nvar faYinYang = {\n prefix: 'fas',\n iconName: 'yin-yang',\n icon: [496, 512, [], \"f6ad\", \"M248 8C111.03 8 0 119.03 0 256s111.03 248 248 248 248-111.03 248-248S384.97 8 248 8zm0 376c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm0-128c-53.02 0-96 42.98-96 96s42.98 96 96 96c-106.04 0-192-85.96-192-192S141.96 64 248 64c53.02 0 96 42.98 96 96s-42.98 96-96 96zm0-128c-17.67 0-32 14.33-32 32s14.33 32 32 32 32-14.33 32-32-14.33-32-32-32z\"]\n};\nvar _iconsCache = {\n faAd: faAd,\n faAddressBook: faAddressBook,\n faAddressCard: faAddressCard,\n faAdjust: faAdjust,\n faAirFreshener: faAirFreshener,\n faAlignCenter: faAlignCenter,\n faAlignJustify: faAlignJustify,\n faAlignLeft: faAlignLeft,\n faAlignRight: faAlignRight,\n faAllergies: faAllergies,\n faAmbulance: faAmbulance,\n faAmericanSignLanguageInterpreting: faAmericanSignLanguageInterpreting,\n faAnchor: faAnchor,\n faAngleDoubleDown: faAngleDoubleDown,\n faAngleDoubleLeft: faAngleDoubleLeft,\n faAngleDoubleRight: faAngleDoubleRight,\n faAngleDoubleUp: faAngleDoubleUp,\n faAngleDown: faAngleDown,\n faAngleLeft: faAngleLeft,\n faAngleRight: faAngleRight,\n faAngleUp: faAngleUp,\n faAngry: faAngry,\n faAnkh: faAnkh,\n faAppleAlt: faAppleAlt,\n faArchive: faArchive,\n faArchway: faArchway,\n faArrowAltCircleDown: faArrowAltCircleDown,\n faArrowAltCircleLeft: faArrowAltCircleLeft,\n faArrowAltCircleRight: faArrowAltCircleRight,\n faArrowAltCircleUp: faArrowAltCircleUp,\n faArrowCircleDown: faArrowCircleDown,\n faArrowCircleLeft: faArrowCircleLeft,\n faArrowCircleRight: faArrowCircleRight,\n faArrowCircleUp: faArrowCircleUp,\n faArrowDown: faArrowDown,\n faArrowLeft: faArrowLeft,\n faArrowRight: faArrowRight,\n faArrowUp: faArrowUp,\n faArrowsAlt: faArrowsAlt,\n faArrowsAltH: faArrowsAltH,\n faArrowsAltV: faArrowsAltV,\n faAssistiveListeningSystems: faAssistiveListeningSystems,\n faAsterisk: faAsterisk,\n faAt: faAt,\n faAtlas: faAtlas,\n faAtom: faAtom,\n faAudioDescription: faAudioDescription,\n faAward: faAward,\n faBaby: faBaby,\n faBabyCarriage: faBabyCarriage,\n faBackspace: faBackspace,\n faBackward: faBackward,\n faBacon: faBacon,\n faBalanceScale: faBalanceScale,\n faBan: faBan,\n faBandAid: faBandAid,\n faBarcode: faBarcode,\n faBars: faBars,\n faBaseballBall: faBaseballBall,\n faBasketballBall: faBasketballBall,\n faBath: faBath,\n faBatteryEmpty: faBatteryEmpty,\n faBatteryFull: faBatteryFull,\n faBatteryHalf: faBatteryHalf,\n faBatteryQuarter: faBatteryQuarter,\n faBatteryThreeQuarters: faBatteryThreeQuarters,\n faBed: faBed,\n faBeer: faBeer,\n faBell: faBell,\n faBellSlash: faBellSlash,\n faBezierCurve: faBezierCurve,\n faBible: faBible,\n faBicycle: faBicycle,\n faBinoculars: faBinoculars,\n faBiohazard: faBiohazard,\n faBirthdayCake: faBirthdayCake,\n faBlender: faBlender,\n faBlenderPhone: faBlenderPhone,\n faBlind: faBlind,\n faBlog: faBlog,\n faBold: faBold,\n faBolt: faBolt,\n faBomb: faBomb,\n faBone: faBone,\n faBong: faBong,\n faBook: faBook,\n faBookDead: faBookDead,\n faBookMedical: faBookMedical,\n faBookOpen: faBookOpen,\n faBookReader: faBookReader,\n faBookmark: faBookmark,\n faBowlingBall: faBowlingBall,\n faBox: faBox,\n faBoxOpen: faBoxOpen,\n faBoxes: faBoxes,\n faBraille: faBraille,\n faBrain: faBrain,\n faBreadSlice: faBreadSlice,\n faBriefcase: faBriefcase,\n faBriefcaseMedical: faBriefcaseMedical,\n faBroadcastTower: faBroadcastTower,\n faBroom: faBroom,\n faBrush: faBrush,\n faBug: faBug,\n faBuilding: faBuilding,\n faBullhorn: faBullhorn,\n faBullseye: faBullseye,\n faBurn: faBurn,\n faBus: faBus,\n faBusAlt: faBusAlt,\n faBusinessTime: faBusinessTime,\n faCalculator: faCalculator,\n faCalendar: faCalendar,\n faCalendarAlt: faCalendarAlt,\n faCalendarCheck: faCalendarCheck,\n faCalendarDay: faCalendarDay,\n faCalendarMinus: faCalendarMinus,\n faCalendarPlus: faCalendarPlus,\n faCalendarTimes: faCalendarTimes,\n faCalendarWeek: faCalendarWeek,\n faCamera: faCamera,\n faCameraRetro: faCameraRetro,\n faCampground: faCampground,\n faCandyCane: faCandyCane,\n faCannabis: faCannabis,\n faCapsules: faCapsules,\n faCar: faCar,\n faCarAlt: faCarAlt,\n faCarBattery: faCarBattery,\n faCarCrash: faCarCrash,\n faCarSide: faCarSide,\n faCaretDown: faCaretDown,\n faCaretLeft: faCaretLeft,\n faCaretRight: faCaretRight,\n faCaretSquareDown: faCaretSquareDown,\n faCaretSquareLeft: faCaretSquareLeft,\n faCaretSquareRight: faCaretSquareRight,\n faCaretSquareUp: faCaretSquareUp,\n faCaretUp: faCaretUp,\n faCarrot: faCarrot,\n faCartArrowDown: faCartArrowDown,\n faCartPlus: faCartPlus,\n faCashRegister: faCashRegister,\n faCat: faCat,\n faCertificate: faCertificate,\n faChair: faChair,\n faChalkboard: faChalkboard,\n faChalkboardTeacher: faChalkboardTeacher,\n faChargingStation: faChargingStation,\n faChartArea: faChartArea,\n faChartBar: faChartBar,\n faChartLine: faChartLine,\n faChartPie: faChartPie,\n faCheck: faCheck,\n faCheckCircle: faCheckCircle,\n faCheckDouble: faCheckDouble,\n faCheckSquare: faCheckSquare,\n faCheese: faCheese,\n faChess: faChess,\n faChessBishop: faChessBishop,\n faChessBoard: faChessBoard,\n faChessKing: faChessKing,\n faChessKnight: faChessKnight,\n faChessPawn: faChessPawn,\n faChessQueen: faChessQueen,\n faChessRook: faChessRook,\n faChevronCircleDown: faChevronCircleDown,\n faChevronCircleLeft: faChevronCircleLeft,\n faChevronCircleRight: faChevronCircleRight,\n faChevronCircleUp: faChevronCircleUp,\n faChevronDown: faChevronDown,\n faChevronLeft: faChevronLeft,\n faChevronRight: faChevronRight,\n faChevronUp: faChevronUp,\n faChild: faChild,\n faChurch: faChurch,\n faCircle: faCircle,\n faCircleNotch: faCircleNotch,\n faCity: faCity,\n faClinicMedical: faClinicMedical,\n faClipboard: faClipboard,\n faClipboardCheck: faClipboardCheck,\n faClipboardList: faClipboardList,\n faClock: faClock,\n faClone: faClone,\n faClosedCaptioning: faClosedCaptioning,\n faCloud: faCloud,\n faCloudDownloadAlt: faCloudDownloadAlt,\n faCloudMeatball: faCloudMeatball,\n faCloudMoon: faCloudMoon,\n faCloudMoonRain: faCloudMoonRain,\n faCloudRain: faCloudRain,\n faCloudShowersHeavy: faCloudShowersHeavy,\n faCloudSun: faCloudSun,\n faCloudSunRain: faCloudSunRain,\n faCloudUploadAlt: faCloudUploadAlt,\n faCocktail: faCocktail,\n faCode: faCode,\n faCodeBranch: faCodeBranch,\n faCoffee: faCoffee,\n faCog: faCog,\n faCogs: faCogs,\n faCoins: faCoins,\n faColumns: faColumns,\n faComment: faComment,\n faCommentAlt: faCommentAlt,\n faCommentDollar: faCommentDollar,\n faCommentDots: faCommentDots,\n faCommentMedical: faCommentMedical,\n faCommentSlash: faCommentSlash,\n faComments: faComments,\n faCommentsDollar: faCommentsDollar,\n faCompactDisc: faCompactDisc,\n faCompass: faCompass,\n faCompress: faCompress,\n faCompressArrowsAlt: faCompressArrowsAlt,\n faConciergeBell: faConciergeBell,\n faCookie: faCookie,\n faCookieBite: faCookieBite,\n faCopy: faCopy,\n faCopyright: faCopyright,\n faCouch: faCouch,\n faCreditCard: faCreditCard,\n faCrop: faCrop,\n faCropAlt: faCropAlt,\n faCross: faCross,\n faCrosshairs: faCrosshairs,\n faCrow: faCrow,\n faCrown: faCrown,\n faCrutch: faCrutch,\n faCube: faCube,\n faCubes: faCubes,\n faCut: faCut,\n faDatabase: faDatabase,\n faDeaf: faDeaf,\n faDemocrat: faDemocrat,\n faDesktop: faDesktop,\n faDharmachakra: faDharmachakra,\n faDiagnoses: faDiagnoses,\n faDice: faDice,\n faDiceD20: faDiceD20,\n faDiceD6: faDiceD6,\n faDiceFive: faDiceFive,\n faDiceFour: faDiceFour,\n faDiceOne: faDiceOne,\n faDiceSix: faDiceSix,\n faDiceThree: faDiceThree,\n faDiceTwo: faDiceTwo,\n faDigitalTachograph: faDigitalTachograph,\n faDirections: faDirections,\n faDivide: faDivide,\n faDizzy: faDizzy,\n faDna: faDna,\n faDog: faDog,\n faDollarSign: faDollarSign,\n faDolly: faDolly,\n faDollyFlatbed: faDollyFlatbed,\n faDonate: faDonate,\n faDoorClosed: faDoorClosed,\n faDoorOpen: faDoorOpen,\n faDotCircle: faDotCircle,\n faDove: faDove,\n faDownload: faDownload,\n faDraftingCompass: faDraftingCompass,\n faDragon: faDragon,\n faDrawPolygon: faDrawPolygon,\n faDrum: faDrum,\n faDrumSteelpan: faDrumSteelpan,\n faDrumstickBite: faDrumstickBite,\n faDumbbell: faDumbbell,\n faDumpster: faDumpster,\n faDumpsterFire: faDumpsterFire,\n faDungeon: faDungeon,\n faEdit: faEdit,\n faEgg: faEgg,\n faEject: faEject,\n faEllipsisH: faEllipsisH,\n faEllipsisV: faEllipsisV,\n faEnvelope: faEnvelope,\n faEnvelopeOpen: faEnvelopeOpen,\n faEnvelopeOpenText: faEnvelopeOpenText,\n faEnvelopeSquare: faEnvelopeSquare,\n faEquals: faEquals,\n faEraser: faEraser,\n faEthernet: faEthernet,\n faEuroSign: faEuroSign,\n faExchangeAlt: faExchangeAlt,\n faExclamation: faExclamation,\n faExclamationCircle: faExclamationCircle,\n faExclamationTriangle: faExclamationTriangle,\n faExpand: faExpand,\n faExpandArrowsAlt: faExpandArrowsAlt,\n faExternalLinkAlt: faExternalLinkAlt,\n faExternalLinkSquareAlt: faExternalLinkSquareAlt,\n faEye: faEye,\n faEyeDropper: faEyeDropper,\n faEyeSlash: faEyeSlash,\n faFastBackward: faFastBackward,\n faFastForward: faFastForward,\n faFax: faFax,\n faFeather: faFeather,\n faFeatherAlt: faFeatherAlt,\n faFemale: faFemale,\n faFighterJet: faFighterJet,\n faFile: faFile,\n faFileAlt: faFileAlt,\n faFileArchive: faFileArchive,\n faFileAudio: faFileAudio,\n faFileCode: faFileCode,\n faFileContract: faFileContract,\n faFileCsv: faFileCsv,\n faFileDownload: faFileDownload,\n faFileExcel: faFileExcel,\n faFileExport: faFileExport,\n faFileImage: faFileImage,\n faFileImport: faFileImport,\n faFileInvoice: faFileInvoice,\n faFileInvoiceDollar: faFileInvoiceDollar,\n faFileMedical: faFileMedical,\n faFileMedicalAlt: faFileMedicalAlt,\n faFilePdf: faFilePdf,\n faFilePowerpoint: faFilePowerpoint,\n faFilePrescription: faFilePrescription,\n faFileSignature: faFileSignature,\n faFileUpload: faFileUpload,\n faFileVideo: faFileVideo,\n faFileWord: faFileWord,\n faFill: faFill,\n faFillDrip: faFillDrip,\n faFilm: faFilm,\n faFilter: faFilter,\n faFingerprint: faFingerprint,\n faFire: faFire,\n faFireAlt: faFireAlt,\n faFireExtinguisher: faFireExtinguisher,\n faFirstAid: faFirstAid,\n faFish: faFish,\n faFistRaised: faFistRaised,\n faFlag: faFlag,\n faFlagCheckered: faFlagCheckered,\n faFlagUsa: faFlagUsa,\n faFlask: faFlask,\n faFlushed: faFlushed,\n faFolder: faFolder,\n faFolderMinus: faFolderMinus,\n faFolderOpen: faFolderOpen,\n faFolderPlus: faFolderPlus,\n faFont: faFont,\n faFontAwesomeLogoFull: faFontAwesomeLogoFull,\n faFootballBall: faFootballBall,\n faForward: faForward,\n faFrog: faFrog,\n faFrown: faFrown,\n faFrownOpen: faFrownOpen,\n faFunnelDollar: faFunnelDollar,\n faFutbol: faFutbol,\n faGamepad: faGamepad,\n faGasPump: faGasPump,\n faGavel: faGavel,\n faGem: faGem,\n faGenderless: faGenderless,\n faGhost: faGhost,\n faGift: faGift,\n faGifts: faGifts,\n faGlassCheers: faGlassCheers,\n faGlassMartini: faGlassMartini,\n faGlassMartiniAlt: faGlassMartiniAlt,\n faGlassWhiskey: faGlassWhiskey,\n faGlasses: faGlasses,\n faGlobe: faGlobe,\n faGlobeAfrica: faGlobeAfrica,\n faGlobeAmericas: faGlobeAmericas,\n faGlobeAsia: faGlobeAsia,\n faGlobeEurope: faGlobeEurope,\n faGolfBall: faGolfBall,\n faGopuram: faGopuram,\n faGraduationCap: faGraduationCap,\n faGreaterThan: faGreaterThan,\n faGreaterThanEqual: faGreaterThanEqual,\n faGrimace: faGrimace,\n faGrin: faGrin,\n faGrinAlt: faGrinAlt,\n faGrinBeam: faGrinBeam,\n faGrinBeamSweat: faGrinBeamSweat,\n faGrinHearts: faGrinHearts,\n faGrinSquint: faGrinSquint,\n faGrinSquintTears: faGrinSquintTears,\n faGrinStars: faGrinStars,\n faGrinTears: faGrinTears,\n faGrinTongue: faGrinTongue,\n faGrinTongueSquint: faGrinTongueSquint,\n faGrinTongueWink: faGrinTongueWink,\n faGrinWink: faGrinWink,\n faGripHorizontal: faGripHorizontal,\n faGripLines: faGripLines,\n faGripLinesVertical: faGripLinesVertical,\n faGripVertical: faGripVertical,\n faGuitar: faGuitar,\n faHSquare: faHSquare,\n faHamburger: faHamburger,\n faHammer: faHammer,\n faHamsa: faHamsa,\n faHandHolding: faHandHolding,\n faHandHoldingHeart: faHandHoldingHeart,\n faHandHoldingUsd: faHandHoldingUsd,\n faHandLizard: faHandLizard,\n faHandMiddleFinger: faHandMiddleFinger,\n faHandPaper: faHandPaper,\n faHandPeace: faHandPeace,\n faHandPointDown: faHandPointDown,\n faHandPointLeft: faHandPointLeft,\n faHandPointRight: faHandPointRight,\n faHandPointUp: faHandPointUp,\n faHandPointer: faHandPointer,\n faHandRock: faHandRock,\n faHandScissors: faHandScissors,\n faHandSpock: faHandSpock,\n faHands: faHands,\n faHandsHelping: faHandsHelping,\n faHandshake: faHandshake,\n faHanukiah: faHanukiah,\n faHardHat: faHardHat,\n faHashtag: faHashtag,\n faHatWizard: faHatWizard,\n faHaykal: faHaykal,\n faHdd: faHdd,\n faHeading: faHeading,\n faHeadphones: faHeadphones,\n faHeadphonesAlt: faHeadphonesAlt,\n faHeadset: faHeadset,\n faHeart: faHeart,\n faHeartBroken: faHeartBroken,\n faHeartbeat: faHeartbeat,\n faHelicopter: faHelicopter,\n faHighlighter: faHighlighter,\n faHiking: faHiking,\n faHippo: faHippo,\n faHistory: faHistory,\n faHockeyPuck: faHockeyPuck,\n faHollyBerry: faHollyBerry,\n faHome: faHome,\n faHorse: faHorse,\n faHorseHead: faHorseHead,\n faHospital: faHospital,\n faHospitalAlt: faHospitalAlt,\n faHospitalSymbol: faHospitalSymbol,\n faHotTub: faHotTub,\n faHotdog: faHotdog,\n faHotel: faHotel,\n faHourglass: faHourglass,\n faHourglassEnd: faHourglassEnd,\n faHourglassHalf: faHourglassHalf,\n faHourglassStart: faHourglassStart,\n faHouseDamage: faHouseDamage,\n faHryvnia: faHryvnia,\n faICursor: faICursor,\n faIceCream: faIceCream,\n faIcicles: faIcicles,\n faIdBadge: faIdBadge,\n faIdCard: faIdCard,\n faIdCardAlt: faIdCardAlt,\n faIgloo: faIgloo,\n faImage: faImage,\n faImages: faImages,\n faInbox: faInbox,\n faIndent: faIndent,\n faIndustry: faIndustry,\n faInfinity: faInfinity,\n faInfo: faInfo,\n faInfoCircle: faInfoCircle,\n faItalic: faItalic,\n faJedi: faJedi,\n faJoint: faJoint,\n faJournalWhills: faJournalWhills,\n faKaaba: faKaaba,\n faKey: faKey,\n faKeyboard: faKeyboard,\n faKhanda: faKhanda,\n faKiss: faKiss,\n faKissBeam: faKissBeam,\n faKissWinkHeart: faKissWinkHeart,\n faKiwiBird: faKiwiBird,\n faLandmark: faLandmark,\n faLanguage: faLanguage,\n faLaptop: faLaptop,\n faLaptopCode: faLaptopCode,\n faLaptopMedical: faLaptopMedical,\n faLaugh: faLaugh,\n faLaughBeam: faLaughBeam,\n faLaughSquint: faLaughSquint,\n faLaughWink: faLaughWink,\n faLayerGroup: faLayerGroup,\n faLeaf: faLeaf,\n faLemon: faLemon,\n faLessThan: faLessThan,\n faLessThanEqual: faLessThanEqual,\n faLevelDownAlt: faLevelDownAlt,\n faLevelUpAlt: faLevelUpAlt,\n faLifeRing: faLifeRing,\n faLightbulb: faLightbulb,\n faLink: faLink,\n faLiraSign: faLiraSign,\n faList: faList,\n faListAlt: faListAlt,\n faListOl: faListOl,\n faListUl: faListUl,\n faLocationArrow: faLocationArrow,\n faLock: faLock,\n faLockOpen: faLockOpen,\n faLongArrowAltDown: faLongArrowAltDown,\n faLongArrowAltLeft: faLongArrowAltLeft,\n faLongArrowAltRight: faLongArrowAltRight,\n faLongArrowAltUp: faLongArrowAltUp,\n faLowVision: faLowVision,\n faLuggageCart: faLuggageCart,\n faMagic: faMagic,\n faMagnet: faMagnet,\n faMailBulk: faMailBulk,\n faMale: faMale,\n faMap: faMap,\n faMapMarked: faMapMarked,\n faMapMarkedAlt: faMapMarkedAlt,\n faMapMarker: faMapMarker,\n faMapMarkerAlt: faMapMarkerAlt,\n faMapPin: faMapPin,\n faMapSigns: faMapSigns,\n faMarker: faMarker,\n faMars: faMars,\n faMarsDouble: faMarsDouble,\n faMarsStroke: faMarsStroke,\n faMarsStrokeH: faMarsStrokeH,\n faMarsStrokeV: faMarsStrokeV,\n faMask: faMask,\n faMedal: faMedal,\n faMedkit: faMedkit,\n faMeh: faMeh,\n faMehBlank: faMehBlank,\n faMehRollingEyes: faMehRollingEyes,\n faMemory: faMemory,\n faMenorah: faMenorah,\n faMercury: faMercury,\n faMeteor: faMeteor,\n faMicrochip: faMicrochip,\n faMicrophone: faMicrophone,\n faMicrophoneAlt: faMicrophoneAlt,\n faMicrophoneAltSlash: faMicrophoneAltSlash,\n faMicrophoneSlash: faMicrophoneSlash,\n faMicroscope: faMicroscope,\n faMinus: faMinus,\n faMinusCircle: faMinusCircle,\n faMinusSquare: faMinusSquare,\n faMitten: faMitten,\n faMobile: faMobile,\n faMobileAlt: faMobileAlt,\n faMoneyBill: faMoneyBill,\n faMoneyBillAlt: faMoneyBillAlt,\n faMoneyBillWave: faMoneyBillWave,\n faMoneyBillWaveAlt: faMoneyBillWaveAlt,\n faMoneyCheck: faMoneyCheck,\n faMoneyCheckAlt: faMoneyCheckAlt,\n faMonument: faMonument,\n faMoon: faMoon,\n faMortarPestle: faMortarPestle,\n faMosque: faMosque,\n faMotorcycle: faMotorcycle,\n faMountain: faMountain,\n faMousePointer: faMousePointer,\n faMugHot: faMugHot,\n faMusic: faMusic,\n faNetworkWired: faNetworkWired,\n faNeuter: faNeuter,\n faNewspaper: faNewspaper,\n faNotEqual: faNotEqual,\n faNotesMedical: faNotesMedical,\n faObjectGroup: faObjectGroup,\n faObjectUngroup: faObjectUngroup,\n faOilCan: faOilCan,\n faOm: faOm,\n faOtter: faOtter,\n faOutdent: faOutdent,\n faPager: faPager,\n faPaintBrush: faPaintBrush,\n faPaintRoller: faPaintRoller,\n faPalette: faPalette,\n faPallet: faPallet,\n faPaperPlane: faPaperPlane,\n faPaperclip: faPaperclip,\n faParachuteBox: faParachuteBox,\n faParagraph: faParagraph,\n faParking: faParking,\n faPassport: faPassport,\n faPastafarianism: faPastafarianism,\n faPaste: faPaste,\n faPause: faPause,\n faPauseCircle: faPauseCircle,\n faPaw: faPaw,\n faPeace: faPeace,\n faPen: faPen,\n faPenAlt: faPenAlt,\n faPenFancy: faPenFancy,\n faPenNib: faPenNib,\n faPenSquare: faPenSquare,\n faPencilAlt: faPencilAlt,\n faPencilRuler: faPencilRuler,\n faPeopleCarry: faPeopleCarry,\n faPepperHot: faPepperHot,\n faPercent: faPercent,\n faPercentage: faPercentage,\n faPersonBooth: faPersonBooth,\n faPhone: faPhone,\n faPhoneSlash: faPhoneSlash,\n faPhoneSquare: faPhoneSquare,\n faPhoneVolume: faPhoneVolume,\n faPiggyBank: faPiggyBank,\n faPills: faPills,\n faPizzaSlice: faPizzaSlice,\n faPlaceOfWorship: faPlaceOfWorship,\n faPlane: faPlane,\n faPlaneArrival: faPlaneArrival,\n faPlaneDeparture: faPlaneDeparture,\n faPlay: faPlay,\n faPlayCircle: faPlayCircle,\n faPlug: faPlug,\n faPlus: faPlus,\n faPlusCircle: faPlusCircle,\n faPlusSquare: faPlusSquare,\n faPodcast: faPodcast,\n faPoll: faPoll,\n faPollH: faPollH,\n faPoo: faPoo,\n faPooStorm: faPooStorm,\n faPoop: faPoop,\n faPortrait: faPortrait,\n faPoundSign: faPoundSign,\n faPowerOff: faPowerOff,\n faPray: faPray,\n faPrayingHands: faPrayingHands,\n faPrescription: faPrescription,\n faPrescriptionBottle: faPrescriptionBottle,\n faPrescriptionBottleAlt: faPrescriptionBottleAlt,\n faPrint: faPrint,\n faProcedures: faProcedures,\n faProjectDiagram: faProjectDiagram,\n faPuzzlePiece: faPuzzlePiece,\n faQrcode: faQrcode,\n faQuestion: faQuestion,\n faQuestionCircle: faQuestionCircle,\n faQuidditch: faQuidditch,\n faQuoteLeft: faQuoteLeft,\n faQuoteRight: faQuoteRight,\n faQuran: faQuran,\n faRadiation: faRadiation,\n faRadiationAlt: faRadiationAlt,\n faRainbow: faRainbow,\n faRandom: faRandom,\n faReceipt: faReceipt,\n faRecycle: faRecycle,\n faRedo: faRedo,\n faRedoAlt: faRedoAlt,\n faRegistered: faRegistered,\n faReply: faReply,\n faReplyAll: faReplyAll,\n faRepublican: faRepublican,\n faRestroom: faRestroom,\n faRetweet: faRetweet,\n faRibbon: faRibbon,\n faRing: faRing,\n faRoad: faRoad,\n faRobot: faRobot,\n faRocket: faRocket,\n faRoute: faRoute,\n faRss: faRss,\n faRssSquare: faRssSquare,\n faRubleSign: faRubleSign,\n faRuler: faRuler,\n faRulerCombined: faRulerCombined,\n faRulerHorizontal: faRulerHorizontal,\n faRulerVertical: faRulerVertical,\n faRunning: faRunning,\n faRupeeSign: faRupeeSign,\n faSadCry: faSadCry,\n faSadTear: faSadTear,\n faSatellite: faSatellite,\n faSatelliteDish: faSatelliteDish,\n faSave: faSave,\n faSchool: faSchool,\n faScrewdriver: faScrewdriver,\n faScroll: faScroll,\n faSdCard: faSdCard,\n faSearch: faSearch,\n faSearchDollar: faSearchDollar,\n faSearchLocation: faSearchLocation,\n faSearchMinus: faSearchMinus,\n faSearchPlus: faSearchPlus,\n faSeedling: faSeedling,\n faServer: faServer,\n faShapes: faShapes,\n faShare: faShare,\n faShareAlt: faShareAlt,\n faShareAltSquare: faShareAltSquare,\n faShareSquare: faShareSquare,\n faShekelSign: faShekelSign,\n faShieldAlt: faShieldAlt,\n faShip: faShip,\n faShippingFast: faShippingFast,\n faShoePrints: faShoePrints,\n faShoppingBag: faShoppingBag,\n faShoppingBasket: faShoppingBasket,\n faShoppingCart: faShoppingCart,\n faShower: faShower,\n faShuttleVan: faShuttleVan,\n faSign: faSign,\n faSignInAlt: faSignInAlt,\n faSignLanguage: faSignLanguage,\n faSignOutAlt: faSignOutAlt,\n faSignal: faSignal,\n faSignature: faSignature,\n faSimCard: faSimCard,\n faSitemap: faSitemap,\n faSkating: faSkating,\n faSkiing: faSkiing,\n faSkiingNordic: faSkiingNordic,\n faSkull: faSkull,\n faSkullCrossbones: faSkullCrossbones,\n faSlash: faSlash,\n faSleigh: faSleigh,\n faSlidersH: faSlidersH,\n faSmile: faSmile,\n faSmileBeam: faSmileBeam,\n faSmileWink: faSmileWink,\n faSmog: faSmog,\n faSmoking: faSmoking,\n faSmokingBan: faSmokingBan,\n faSms: faSms,\n faSnowboarding: faSnowboarding,\n faSnowflake: faSnowflake,\n faSnowman: faSnowman,\n faSnowplow: faSnowplow,\n faSocks: faSocks,\n faSolarPanel: faSolarPanel,\n faSort: faSort,\n faSortAlphaDown: faSortAlphaDown,\n faSortAlphaUp: faSortAlphaUp,\n faSortAmountDown: faSortAmountDown,\n faSortAmountUp: faSortAmountUp,\n faSortDown: faSortDown,\n faSortNumericDown: faSortNumericDown,\n faSortNumericUp: faSortNumericUp,\n faSortUp: faSortUp,\n faSpa: faSpa,\n faSpaceShuttle: faSpaceShuttle,\n faSpider: faSpider,\n faSpinner: faSpinner,\n faSplotch: faSplotch,\n faSprayCan: faSprayCan,\n faSquare: faSquare,\n faSquareFull: faSquareFull,\n faSquareRootAlt: faSquareRootAlt,\n faStamp: faStamp,\n faStar: faStar,\n faStarAndCrescent: faStarAndCrescent,\n faStarHalf: faStarHalf,\n faStarHalfAlt: faStarHalfAlt,\n faStarOfDavid: faStarOfDavid,\n faStarOfLife: faStarOfLife,\n faStepBackward: faStepBackward,\n faStepForward: faStepForward,\n faStethoscope: faStethoscope,\n faStickyNote: faStickyNote,\n faStop: faStop,\n faStopCircle: faStopCircle,\n faStopwatch: faStopwatch,\n faStore: faStore,\n faStoreAlt: faStoreAlt,\n faStream: faStream,\n faStreetView: faStreetView,\n faStrikethrough: faStrikethrough,\n faStroopwafel: faStroopwafel,\n faSubscript: faSubscript,\n faSubway: faSubway,\n faSuitcase: faSuitcase,\n faSuitcaseRolling: faSuitcaseRolling,\n faSun: faSun,\n faSuperscript: faSuperscript,\n faSurprise: faSurprise,\n faSwatchbook: faSwatchbook,\n faSwimmer: faSwimmer,\n faSwimmingPool: faSwimmingPool,\n faSynagogue: faSynagogue,\n faSync: faSync,\n faSyncAlt: faSyncAlt,\n faSyringe: faSyringe,\n faTable: faTable,\n faTableTennis: faTableTennis,\n faTablet: faTablet,\n faTabletAlt: faTabletAlt,\n faTablets: faTablets,\n faTachometerAlt: faTachometerAlt,\n faTag: faTag,\n faTags: faTags,\n faTape: faTape,\n faTasks: faTasks,\n faTaxi: faTaxi,\n faTeeth: faTeeth,\n faTeethOpen: faTeethOpen,\n faTemperatureHigh: faTemperatureHigh,\n faTemperatureLow: faTemperatureLow,\n faTenge: faTenge,\n faTerminal: faTerminal,\n faTextHeight: faTextHeight,\n faTextWidth: faTextWidth,\n faTh: faTh,\n faThLarge: faThLarge,\n faThList: faThList,\n faTheaterMasks: faTheaterMasks,\n faThermometer: faThermometer,\n faThermometerEmpty: faThermometerEmpty,\n faThermometerFull: faThermometerFull,\n faThermometerHalf: faThermometerHalf,\n faThermometerQuarter: faThermometerQuarter,\n faThermometerThreeQuarters: faThermometerThreeQuarters,\n faThumbsDown: faThumbsDown,\n faThumbsUp: faThumbsUp,\n faThumbtack: faThumbtack,\n faTicketAlt: faTicketAlt,\n faTimes: faTimes,\n faTimesCircle: faTimesCircle,\n faTint: faTint,\n faTintSlash: faTintSlash,\n faTired: faTired,\n faToggleOff: faToggleOff,\n faToggleOn: faToggleOn,\n faToilet: faToilet,\n faToiletPaper: faToiletPaper,\n faToolbox: faToolbox,\n faTools: faTools,\n faTooth: faTooth,\n faTorah: faTorah,\n faToriiGate: faToriiGate,\n faTractor: faTractor,\n faTrademark: faTrademark,\n faTrafficLight: faTrafficLight,\n faTrain: faTrain,\n faTram: faTram,\n faTransgender: faTransgender,\n faTransgenderAlt: faTransgenderAlt,\n faTrash: faTrash,\n faTrashAlt: faTrashAlt,\n faTrashRestore: faTrashRestore,\n faTrashRestoreAlt: faTrashRestoreAlt,\n faTree: faTree,\n faTrophy: faTrophy,\n faTruck: faTruck,\n faTruckLoading: faTruckLoading,\n faTruckMonster: faTruckMonster,\n faTruckMoving: faTruckMoving,\n faTruckPickup: faTruckPickup,\n faTshirt: faTshirt,\n faTty: faTty,\n faTv: faTv,\n faUmbrella: faUmbrella,\n faUmbrellaBeach: faUmbrellaBeach,\n faUnderline: faUnderline,\n faUndo: faUndo,\n faUndoAlt: faUndoAlt,\n faUniversalAccess: faUniversalAccess,\n faUniversity: faUniversity,\n faUnlink: faUnlink,\n faUnlock: faUnlock,\n faUnlockAlt: faUnlockAlt,\n faUpload: faUpload,\n faUser: faUser,\n faUserAlt: faUserAlt,\n faUserAltSlash: faUserAltSlash,\n faUserAstronaut: faUserAstronaut,\n faUserCheck: faUserCheck,\n faUserCircle: faUserCircle,\n faUserClock: faUserClock,\n faUserCog: faUserCog,\n faUserEdit: faUserEdit,\n faUserFriends: faUserFriends,\n faUserGraduate: faUserGraduate,\n faUserInjured: faUserInjured,\n faUserLock: faUserLock,\n faUserMd: faUserMd,\n faUserMinus: faUserMinus,\n faUserNinja: faUserNinja,\n faUserNurse: faUserNurse,\n faUserPlus: faUserPlus,\n faUserSecret: faUserSecret,\n faUserShield: faUserShield,\n faUserSlash: faUserSlash,\n faUserTag: faUserTag,\n faUserTie: faUserTie,\n faUserTimes: faUserTimes,\n faUsers: faUsers,\n faUsersCog: faUsersCog,\n faUtensilSpoon: faUtensilSpoon,\n faUtensils: faUtensils,\n faVectorSquare: faVectorSquare,\n faVenus: faVenus,\n faVenusDouble: faVenusDouble,\n faVenusMars: faVenusMars,\n faVial: faVial,\n faVials: faVials,\n faVideo: faVideo,\n faVideoSlash: faVideoSlash,\n faVihara: faVihara,\n faVolleyballBall: faVolleyballBall,\n faVolumeDown: faVolumeDown,\n faVolumeMute: faVolumeMute,\n faVolumeOff: faVolumeOff,\n faVolumeUp: faVolumeUp,\n faVoteYea: faVoteYea,\n faVrCardboard: faVrCardboard,\n faWalking: faWalking,\n faWallet: faWallet,\n faWarehouse: faWarehouse,\n faWater: faWater,\n faWeight: faWeight,\n faWeightHanging: faWeightHanging,\n faWheelchair: faWheelchair,\n faWifi: faWifi,\n faWind: faWind,\n faWindowClose: faWindowClose,\n faWindowMaximize: faWindowMaximize,\n faWindowMinimize: faWindowMinimize,\n faWindowRestore: faWindowRestore,\n faWineBottle: faWineBottle,\n faWineGlass: faWineGlass,\n faWineGlassAlt: faWineGlassAlt,\n faWonSign: faWonSign,\n faWrench: faWrench,\n faXRay: faXRay,\n faYenSign: faYenSign,\n faYinYang: faYinYang\n};\n\nexport { _iconsCache as fas, prefix, faAd, faAddressBook, faAddressCard, faAdjust, faAirFreshener, faAlignCenter, faAlignJustify, faAlignLeft, faAlignRight, faAllergies, faAmbulance, faAmericanSignLanguageInterpreting, faAnchor, faAngleDoubleDown, faAngleDoubleLeft, faAngleDoubleRight, faAngleDoubleUp, faAngleDown, faAngleLeft, faAngleRight, faAngleUp, faAngry, faAnkh, faAppleAlt, faArchive, faArchway, faArrowAltCircleDown, faArrowAltCircleLeft, faArrowAltCircleRight, faArrowAltCircleUp, faArrowCircleDown, faArrowCircleLeft, faArrowCircleRight, faArrowCircleUp, faArrowDown, faArrowLeft, faArrowRight, faArrowUp, faArrowsAlt, faArrowsAltH, faArrowsAltV, faAssistiveListeningSystems, faAsterisk, faAt, faAtlas, faAtom, faAudioDescription, faAward, faBaby, faBabyCarriage, faBackspace, faBackward, faBacon, faBalanceScale, faBan, faBandAid, faBarcode, faBars, faBaseballBall, faBasketballBall, faBath, faBatteryEmpty, faBatteryFull, faBatteryHalf, faBatteryQuarter, faBatteryThreeQuarters, faBed, faBeer, faBell, faBellSlash, faBezierCurve, faBible, faBicycle, faBinoculars, faBiohazard, faBirthdayCake, faBlender, faBlenderPhone, faBlind, faBlog, faBold, faBolt, faBomb, faBone, faBong, faBook, faBookDead, faBookMedical, faBookOpen, faBookReader, faBookmark, faBowlingBall, faBox, faBoxOpen, faBoxes, faBraille, faBrain, faBreadSlice, faBriefcase, faBriefcaseMedical, faBroadcastTower, faBroom, faBrush, faBug, faBuilding, faBullhorn, faBullseye, faBurn, faBus, faBusAlt, faBusinessTime, faCalculator, faCalendar, faCalendarAlt, faCalendarCheck, faCalendarDay, faCalendarMinus, faCalendarPlus, faCalendarTimes, faCalendarWeek, faCamera, faCameraRetro, faCampground, faCandyCane, faCannabis, faCapsules, faCar, faCarAlt, faCarBattery, faCarCrash, faCarSide, faCaretDown, faCaretLeft, faCaretRight, faCaretSquareDown, faCaretSquareLeft, faCaretSquareRight, faCaretSquareUp, faCaretUp, faCarrot, faCartArrowDown, faCartPlus, faCashRegister, faCat, faCertificate, faChair, faChalkboard, faChalkboardTeacher, faChargingStation, faChartArea, faChartBar, faChartLine, faChartPie, faCheck, faCheckCircle, faCheckDouble, faCheckSquare, faCheese, faChess, faChessBishop, faChessBoard, faChessKing, faChessKnight, faChessPawn, faChessQueen, faChessRook, faChevronCircleDown, faChevronCircleLeft, faChevronCircleRight, faChevronCircleUp, faChevronDown, faChevronLeft, faChevronRight, faChevronUp, faChild, faChurch, faCircle, faCircleNotch, faCity, faClinicMedical, faClipboard, faClipboardCheck, faClipboardList, faClock, faClone, faClosedCaptioning, faCloud, faCloudDownloadAlt, faCloudMeatball, faCloudMoon, faCloudMoonRain, faCloudRain, faCloudShowersHeavy, faCloudSun, faCloudSunRain, faCloudUploadAlt, faCocktail, faCode, faCodeBranch, faCoffee, faCog, faCogs, faCoins, faColumns, faComment, faCommentAlt, faCommentDollar, faCommentDots, faCommentMedical, faCommentSlash, faComments, faCommentsDollar, faCompactDisc, faCompass, faCompress, faCompressArrowsAlt, faConciergeBell, faCookie, faCookieBite, faCopy, faCopyright, faCouch, faCreditCard, faCrop, faCropAlt, faCross, faCrosshairs, faCrow, faCrown, faCrutch, faCube, faCubes, faCut, faDatabase, faDeaf, faDemocrat, faDesktop, faDharmachakra, faDiagnoses, faDice, faDiceD20, faDiceD6, faDiceFive, faDiceFour, faDiceOne, faDiceSix, faDiceThree, faDiceTwo, faDigitalTachograph, faDirections, faDivide, faDizzy, faDna, faDog, faDollarSign, faDolly, faDollyFlatbed, faDonate, faDoorClosed, faDoorOpen, faDotCircle, faDove, faDownload, faDraftingCompass, faDragon, faDrawPolygon, faDrum, faDrumSteelpan, faDrumstickBite, faDumbbell, faDumpster, faDumpsterFire, faDungeon, faEdit, faEgg, faEject, faEllipsisH, faEllipsisV, faEnvelope, faEnvelopeOpen, faEnvelopeOpenText, faEnvelopeSquare, faEquals, faEraser, faEthernet, faEuroSign, faExchangeAlt, faExclamation, faExclamationCircle, faExclamationTriangle, faExpand, faExpandArrowsAlt, faExternalLinkAlt, faExternalLinkSquareAlt, faEye, faEyeDropper, faEyeSlash, faFastBackward, faFastForward, faFax, faFeather, faFeatherAlt, faFemale, faFighterJet, faFile, faFileAlt, faFileArchive, faFileAudio, faFileCode, faFileContract, faFileCsv, faFileDownload, faFileExcel, faFileExport, faFileImage, faFileImport, faFileInvoice, faFileInvoiceDollar, faFileMedical, faFileMedicalAlt, faFilePdf, faFilePowerpoint, faFilePrescription, faFileSignature, faFileUpload, faFileVideo, faFileWord, faFill, faFillDrip, faFilm, faFilter, faFingerprint, faFire, faFireAlt, faFireExtinguisher, faFirstAid, faFish, faFistRaised, faFlag, faFlagCheckered, faFlagUsa, faFlask, faFlushed, faFolder, faFolderMinus, faFolderOpen, faFolderPlus, faFont, faFontAwesomeLogoFull, faFootballBall, faForward, faFrog, faFrown, faFrownOpen, faFunnelDollar, faFutbol, faGamepad, faGasPump, faGavel, faGem, faGenderless, faGhost, faGift, faGifts, faGlassCheers, faGlassMartini, faGlassMartiniAlt, faGlassWhiskey, faGlasses, faGlobe, faGlobeAfrica, faGlobeAmericas, faGlobeAsia, faGlobeEurope, faGolfBall, faGopuram, faGraduationCap, faGreaterThan, faGreaterThanEqual, faGrimace, faGrin, faGrinAlt, faGrinBeam, faGrinBeamSweat, faGrinHearts, faGrinSquint, faGrinSquintTears, faGrinStars, faGrinTears, faGrinTongue, faGrinTongueSquint, faGrinTongueWink, faGrinWink, faGripHorizontal, faGripLines, faGripLinesVertical, faGripVertical, faGuitar, faHSquare, faHamburger, faHammer, faHamsa, faHandHolding, faHandHoldingHeart, faHandHoldingUsd, faHandLizard, faHandMiddleFinger, faHandPaper, faHandPeace, faHandPointDown, faHandPointLeft, faHandPointRight, faHandPointUp, faHandPointer, faHandRock, faHandScissors, faHandSpock, faHands, faHandsHelping, faHandshake, faHanukiah, faHardHat, faHashtag, faHatWizard, faHaykal, faHdd, faHeading, faHeadphones, faHeadphonesAlt, faHeadset, faHeart, faHeartBroken, faHeartbeat, faHelicopter, faHighlighter, faHiking, faHippo, faHistory, faHockeyPuck, faHollyBerry, faHome, faHorse, faHorseHead, faHospital, faHospitalAlt, faHospitalSymbol, faHotTub, faHotdog, faHotel, faHourglass, faHourglassEnd, faHourglassHalf, faHourglassStart, faHouseDamage, faHryvnia, faICursor, faIceCream, faIcicles, faIdBadge, faIdCard, faIdCardAlt, faIgloo, faImage, faImages, faInbox, faIndent, faIndustry, faInfinity, faInfo, faInfoCircle, faItalic, faJedi, faJoint, faJournalWhills, faKaaba, faKey, faKeyboard, faKhanda, faKiss, faKissBeam, faKissWinkHeart, faKiwiBird, faLandmark, faLanguage, faLaptop, faLaptopCode, faLaptopMedical, faLaugh, faLaughBeam, faLaughSquint, faLaughWink, faLayerGroup, faLeaf, faLemon, faLessThan, faLessThanEqual, faLevelDownAlt, faLevelUpAlt, faLifeRing, faLightbulb, faLink, faLiraSign, faList, faListAlt, faListOl, faListUl, faLocationArrow, faLock, faLockOpen, faLongArrowAltDown, faLongArrowAltLeft, faLongArrowAltRight, faLongArrowAltUp, faLowVision, faLuggageCart, faMagic, faMagnet, faMailBulk, faMale, faMap, faMapMarked, faMapMarkedAlt, faMapMarker, faMapMarkerAlt, faMapPin, faMapSigns, faMarker, faMars, faMarsDouble, faMarsStroke, faMarsStrokeH, faMarsStrokeV, faMask, faMedal, faMedkit, faMeh, faMehBlank, faMehRollingEyes, faMemory, faMenorah, faMercury, faMeteor, faMicrochip, faMicrophone, faMicrophoneAlt, faMicrophoneAltSlash, faMicrophoneSlash, faMicroscope, faMinus, faMinusCircle, faMinusSquare, faMitten, faMobile, faMobileAlt, faMoneyBill, faMoneyBillAlt, faMoneyBillWave, faMoneyBillWaveAlt, faMoneyCheck, faMoneyCheckAlt, faMonument, faMoon, faMortarPestle, faMosque, faMotorcycle, faMountain, faMousePointer, faMugHot, faMusic, faNetworkWired, faNeuter, faNewspaper, faNotEqual, faNotesMedical, faObjectGroup, faObjectUngroup, faOilCan, faOm, faOtter, faOutdent, faPager, faPaintBrush, faPaintRoller, faPalette, faPallet, faPaperPlane, faPaperclip, faParachuteBox, faParagraph, faParking, faPassport, faPastafarianism, faPaste, faPause, faPauseCircle, faPaw, faPeace, faPen, faPenAlt, faPenFancy, faPenNib, faPenSquare, faPencilAlt, faPencilRuler, faPeopleCarry, faPepperHot, faPercent, faPercentage, faPersonBooth, faPhone, faPhoneSlash, faPhoneSquare, faPhoneVolume, faPiggyBank, faPills, faPizzaSlice, faPlaceOfWorship, faPlane, faPlaneArrival, faPlaneDeparture, faPlay, faPlayCircle, faPlug, faPlus, faPlusCircle, faPlusSquare, faPodcast, faPoll, faPollH, faPoo, faPooStorm, faPoop, faPortrait, faPoundSign, faPowerOff, faPray, faPrayingHands, faPrescription, faPrescriptionBottle, faPrescriptionBottleAlt, faPrint, faProcedures, faProjectDiagram, faPuzzlePiece, faQrcode, faQuestion, faQuestionCircle, faQuidditch, faQuoteLeft, faQuoteRight, faQuran, faRadiation, faRadiationAlt, faRainbow, faRandom, faReceipt, faRecycle, faRedo, faRedoAlt, faRegistered, faReply, faReplyAll, faRepublican, faRestroom, faRetweet, faRibbon, faRing, faRoad, faRobot, faRocket, faRoute, faRss, faRssSquare, faRubleSign, faRuler, faRulerCombined, faRulerHorizontal, faRulerVertical, faRunning, faRupeeSign, faSadCry, faSadTear, faSatellite, faSatelliteDish, faSave, faSchool, faScrewdriver, faScroll, faSdCard, faSearch, faSearchDollar, faSearchLocation, faSearchMinus, faSearchPlus, faSeedling, faServer, faShapes, faShare, faShareAlt, faShareAltSquare, faShareSquare, faShekelSign, faShieldAlt, faShip, faShippingFast, faShoePrints, faShoppingBag, faShoppingBasket, faShoppingCart, faShower, faShuttleVan, faSign, faSignInAlt, faSignLanguage, faSignOutAlt, faSignal, faSignature, faSimCard, faSitemap, faSkating, faSkiing, faSkiingNordic, faSkull, faSkullCrossbones, faSlash, faSleigh, faSlidersH, faSmile, faSmileBeam, faSmileWink, faSmog, faSmoking, faSmokingBan, faSms, faSnowboarding, faSnowflake, faSnowman, faSnowplow, faSocks, faSolarPanel, faSort, faSortAlphaDown, faSortAlphaUp, faSortAmountDown, faSortAmountUp, faSortDown, faSortNumericDown, faSortNumericUp, faSortUp, faSpa, faSpaceShuttle, faSpider, faSpinner, faSplotch, faSprayCan, faSquare, faSquareFull, faSquareRootAlt, faStamp, faStar, faStarAndCrescent, faStarHalf, faStarHalfAlt, faStarOfDavid, faStarOfLife, faStepBackward, faStepForward, faStethoscope, faStickyNote, faStop, faStopCircle, faStopwatch, faStore, faStoreAlt, faStream, faStreetView, faStrikethrough, faStroopwafel, faSubscript, faSubway, faSuitcase, faSuitcaseRolling, faSun, faSuperscript, faSurprise, faSwatchbook, faSwimmer, faSwimmingPool, faSynagogue, faSync, faSyncAlt, faSyringe, faTable, faTableTennis, faTablet, faTabletAlt, faTablets, faTachometerAlt, faTag, faTags, faTape, faTasks, faTaxi, faTeeth, faTeethOpen, faTemperatureHigh, faTemperatureLow, faTenge, faTerminal, faTextHeight, faTextWidth, faTh, faThLarge, faThList, faTheaterMasks, faThermometer, faThermometerEmpty, faThermometerFull, faThermometerHalf, faThermometerQuarter, faThermometerThreeQuarters, faThumbsDown, faThumbsUp, faThumbtack, faTicketAlt, faTimes, faTimesCircle, faTint, faTintSlash, faTired, faToggleOff, faToggleOn, faToilet, faToiletPaper, faToolbox, faTools, faTooth, faTorah, faToriiGate, faTractor, faTrademark, faTrafficLight, faTrain, faTram, faTransgender, faTransgenderAlt, faTrash, faTrashAlt, faTrashRestore, faTrashRestoreAlt, faTree, faTrophy, faTruck, faTruckLoading, faTruckMonster, faTruckMoving, faTruckPickup, faTshirt, faTty, faTv, faUmbrella, faUmbrellaBeach, faUnderline, faUndo, faUndoAlt, faUniversalAccess, faUniversity, faUnlink, faUnlock, faUnlockAlt, faUpload, faUser, faUserAlt, faUserAltSlash, faUserAstronaut, faUserCheck, faUserCircle, faUserClock, faUserCog, faUserEdit, faUserFriends, faUserGraduate, faUserInjured, faUserLock, faUserMd, faUserMinus, faUserNinja, faUserNurse, faUserPlus, faUserSecret, faUserShield, faUserSlash, faUserTag, faUserTie, faUserTimes, faUsers, faUsersCog, faUtensilSpoon, faUtensils, faVectorSquare, faVenus, faVenusDouble, faVenusMars, faVial, faVials, faVideo, faVideoSlash, faVihara, faVolleyballBall, faVolumeDown, faVolumeMute, faVolumeOff, faVolumeUp, faVoteYea, faVrCardboard, faWalking, faWallet, faWarehouse, faWater, faWeight, faWeightHanging, faWheelchair, faWifi, faWind, faWindowClose, faWindowMaximize, faWindowMinimize, faWindowRestore, faWineBottle, faWineGlass, faWineGlassAlt, faWonSign, faWrench, faXRay, faYenSign, faYinYang };\n", + "var prefix = \"fas\";\nvar faAd = {\n prefix: 'fas',\n iconName: 'ad',\n icon: [512, 512, [], \"f641\", \"M157.52 272h36.96L176 218.78 157.52 272zM352 256c-13.23 0-24 10.77-24 24s10.77 24 24 24 24-10.77 24-24-10.77-24-24-24zM464 64H48C21.5 64 0 85.5 0 112v288c0 26.5 21.5 48 48 48h416c26.5 0 48-21.5 48-48V112c0-26.5-21.5-48-48-48zM250.58 352h-16.94c-6.81 0-12.88-4.32-15.12-10.75L211.15 320h-70.29l-7.38 21.25A16 16 0 0 1 118.36 352h-16.94c-11.01 0-18.73-10.85-15.12-21.25L140 176.12A23.995 23.995 0 0 1 162.67 160h26.66A23.99 23.99 0 0 1 212 176.13l53.69 154.62c3.61 10.4-4.11 21.25-15.11 21.25zM424 336c0 8.84-7.16 16-16 16h-16c-4.85 0-9.04-2.27-11.98-5.68-8.62 3.66-18.09 5.68-28.02 5.68-39.7 0-72-32.3-72-72s32.3-72 72-72c8.46 0 16.46 1.73 24 4.42V176c0-8.84 7.16-16 16-16h16c8.84 0 16 7.16 16 16v160z\"]\n};\nvar faAddressBook = {\n prefix: 'fas',\n iconName: 'address-book',\n icon: [448, 512, [], \"f2b9\", \"M436 160c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-20V48c0-26.5-21.5-48-48-48H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h320c26.5 0 48-21.5 48-48v-48h20c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-20v-64h20c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-20v-64h20zm-228-32c35.3 0 64 28.7 64 64s-28.7 64-64 64-64-28.7-64-64 28.7-64 64-64zm112 236.8c0 10.6-10 19.2-22.4 19.2H118.4C106 384 96 375.4 96 364.8v-19.2c0-31.8 30.1-57.6 67.2-57.6h5c12.3 5.1 25.7 8 39.8 8s27.6-2.9 39.8-8h5c37.1 0 67.2 25.8 67.2 57.6v19.2z\"]\n};\nvar faAddressCard = {\n prefix: 'fas',\n iconName: 'address-card',\n icon: [576, 512, [], \"f2bb\", \"M528 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h480c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zm-352 96c35.3 0 64 28.7 64 64s-28.7 64-64 64-64-28.7-64-64 28.7-64 64-64zm112 236.8c0 10.6-10 19.2-22.4 19.2H86.4C74 384 64 375.4 64 364.8v-19.2c0-31.8 30.1-57.6 67.2-57.6h5c12.3 5.1 25.7 8 39.8 8s27.6-2.9 39.8-8h5c37.1 0 67.2 25.8 67.2 57.6v19.2zM512 312c0 4.4-3.6 8-8 8H360c-4.4 0-8-3.6-8-8v-16c0-4.4 3.6-8 8-8h144c4.4 0 8 3.6 8 8v16zm0-64c0 4.4-3.6 8-8 8H360c-4.4 0-8-3.6-8-8v-16c0-4.4 3.6-8 8-8h144c4.4 0 8 3.6 8 8v16zm0-64c0 4.4-3.6 8-8 8H360c-4.4 0-8-3.6-8-8v-16c0-4.4 3.6-8 8-8h144c4.4 0 8 3.6 8 8v16z\"]\n};\nvar faAdjust = {\n prefix: 'fas',\n iconName: 'adjust',\n icon: [512, 512, [], \"f042\", \"M8 256c0 136.966 111.033 248 248 248s248-111.034 248-248S392.966 8 256 8 8 119.033 8 256zm248 184V72c101.705 0 184 82.311 184 184 0 101.705-82.311 184-184 184z\"]\n};\nvar faAirFreshener = {\n prefix: 'fas',\n iconName: 'air-freshener',\n icon: [384, 512, [], \"f5d0\", \"M378.94 321.41L284.7 224h49.22c15.3 0 23.66-16.6 13.86-27.53L234.45 69.96c3.43-6.61 5.55-14 5.55-21.96 0-26.51-21.49-48-48-48s-48 21.49-48 48c0 7.96 2.12 15.35 5.55 21.96L36.22 196.47C26.42 207.4 34.78 224 50.08 224H99.3L5.06 321.41C-6.69 333.56 3.34 352 21.7 352H160v32H48c-8.84 0-16 7.16-16 16v96c0 8.84 7.16 16 16 16h288c8.84 0 16-7.16 16-16v-96c0-8.84-7.16-16-16-16H224v-32h138.3c18.36 0 28.39-18.44 16.64-30.59zM192 31.98c8.85 0 16.02 7.17 16.02 16.02 0 8.84-7.17 16.02-16.02 16.02S175.98 56.84 175.98 48c0-8.85 7.17-16.02 16.02-16.02zM304 432v32H80v-32h224z\"]\n};\nvar faAlignCenter = {\n prefix: 'fas',\n iconName: 'align-center',\n icon: [448, 512, [], \"f037\", \"M432 160H16a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h416a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm0 256H16a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h416a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zM108.1 96h231.81A12.09 12.09 0 0 0 352 83.9V44.09A12.09 12.09 0 0 0 339.91 32H108.1A12.09 12.09 0 0 0 96 44.09V83.9A12.1 12.1 0 0 0 108.1 96zm231.81 256A12.09 12.09 0 0 0 352 339.9v-39.81A12.09 12.09 0 0 0 339.91 288H108.1A12.09 12.09 0 0 0 96 300.09v39.81a12.1 12.1 0 0 0 12.1 12.1z\"]\n};\nvar faAlignJustify = {\n prefix: 'fas',\n iconName: 'align-justify',\n icon: [448, 512, [], \"f039\", \"M432 416H16a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h416a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm0-128H16a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h416a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm0-128H16a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h416a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm0-128H16A16 16 0 0 0 0 48v32a16 16 0 0 0 16 16h416a16 16 0 0 0 16-16V48a16 16 0 0 0-16-16z\"]\n};\nvar faAlignLeft = {\n prefix: 'fas',\n iconName: 'align-left',\n icon: [448, 512, [], \"f036\", \"M12.83 352h262.34A12.82 12.82 0 0 0 288 339.17v-38.34A12.82 12.82 0 0 0 275.17 288H12.83A12.82 12.82 0 0 0 0 300.83v38.34A12.82 12.82 0 0 0 12.83 352zm0-256h262.34A12.82 12.82 0 0 0 288 83.17V44.83A12.82 12.82 0 0 0 275.17 32H12.83A12.82 12.82 0 0 0 0 44.83v38.34A12.82 12.82 0 0 0 12.83 96zM432 160H16a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h416a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm0 256H16a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h416a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16z\"]\n};\nvar faAlignRight = {\n prefix: 'fas',\n iconName: 'align-right',\n icon: [448, 512, [], \"f038\", \"M16 224h416a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16H16a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16zm416 192H16a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h416a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm3.17-384H172.83A12.82 12.82 0 0 0 160 44.83v38.34A12.82 12.82 0 0 0 172.83 96h262.34A12.82 12.82 0 0 0 448 83.17V44.83A12.82 12.82 0 0 0 435.17 32zm0 256H172.83A12.82 12.82 0 0 0 160 300.83v38.34A12.82 12.82 0 0 0 172.83 352h262.34A12.82 12.82 0 0 0 448 339.17v-38.34A12.82 12.82 0 0 0 435.17 288z\"]\n};\nvar faAllergies = {\n prefix: 'fas',\n iconName: 'allergies',\n icon: [448, 512, [], \"f461\", \"M416 112c-17.6 0-32 14.4-32 32v72c0 4.4-3.6 8-8 8h-16c-4.4 0-8-3.6-8-8V64c0-17.6-14.4-32-32-32s-32 14.4-32 32v152c0 4.4-3.6 8-8 8h-16c-4.4 0-8-3.6-8-8V32c0-17.6-14.4-32-32-32s-32 14.4-32 32v184c0 4.4-3.6 8-8 8h-16c-4.4 0-8-3.6-8-8V64c0-17.6-14.4-32-32-32S96 46.4 96 64v241l-23.6-32.5c-13-17.9-38-21.8-55.9-8.8s-21.8 38-8.8 55.9l125.6 172.7c9 12.4 23.5 19.8 38.8 19.8h197.6c22.3 0 41.6-15.3 46.7-37l26.5-112.7c3.2-13.7 4.9-28.3 5.1-42.3V144c0-17.6-14.4-32-32-32zM176 416c-8.8 0-16-7.2-16-16s7.2-16 16-16 16 7.2 16 16-7.2 16-16 16zm0-96c-8.8 0-16-7.2-16-16s7.2-16 16-16 16 7.2 16 16-7.2 16-16 16zm64 128c-8.8 0-16-7.2-16-16s7.2-16 16-16 16 7.2 16 16-7.2 16-16 16zm0-96c-8.8 0-16-7.2-16-16s7.2-16 16-16 16 7.2 16 16-7.2 16-16 16zm64 32c-8.8 0-16-7.2-16-16s7.2-16 16-16 16 7.2 16 16-7.2 16-16 16zm32 64c-8.8 0-16-7.2-16-16s7.2-16 16-16 16 7.2 16 16-7.2 16-16 16zm32-128c-8.8 0-16-7.2-16-16s7.2-16 16-16 16 7.2 16 16-7.2 16-16 16z\"]\n};\nvar faAmbulance = {\n prefix: 'fas',\n iconName: 'ambulance',\n icon: [640, 512, [], \"f0f9\", \"M624 352h-16V243.9c0-12.7-5.1-24.9-14.1-33.9L494 110.1c-9-9-21.2-14.1-33.9-14.1H416V48c0-26.5-21.5-48-48-48H48C21.5 0 0 21.5 0 48v320c0 26.5 21.5 48 48 48h16c0 53 43 96 96 96s96-43 96-96h128c0 53 43 96 96 96s96-43 96-96h48c8.8 0 16-7.2 16-16v-32c0-8.8-7.2-16-16-16zM160 464c-26.5 0-48-21.5-48-48s21.5-48 48-48 48 21.5 48 48-21.5 48-48 48zm144-248c0 4.4-3.6 8-8 8h-56v56c0 4.4-3.6 8-8 8h-48c-4.4 0-8-3.6-8-8v-56h-56c-4.4 0-8-3.6-8-8v-48c0-4.4 3.6-8 8-8h56v-56c0-4.4 3.6-8 8-8h48c4.4 0 8 3.6 8 8v56h56c4.4 0 8 3.6 8 8v48zm176 248c-26.5 0-48-21.5-48-48s21.5-48 48-48 48 21.5 48 48-21.5 48-48 48zm80-208H416V144h44.1l99.9 99.9V256z\"]\n};\nvar faAmericanSignLanguageInterpreting = {\n prefix: 'fas',\n iconName: 'american-sign-language-interpreting',\n icon: [640, 512, [], \"f2a3\", \"M290.547 189.039c-20.295-10.149-44.147-11.199-64.739-3.89 42.606 0 71.208 20.475 85.578 50.576 8.576 17.899-5.148 38.071-23.617 38.071 18.429 0 32.211 20.136 23.617 38.071-14.725 30.846-46.123 50.854-80.298 50.854-.557 0-94.471-8.615-94.471-8.615l-66.406 33.347c-9.384 4.693-19.815.379-23.895-7.781L1.86 290.747c-4.167-8.615-1.111-18.897 6.946-23.621l58.072-33.069L108 159.861c6.39-57.245 34.731-109.767 79.743-146.726 11.391-9.448 28.341-7.781 37.51 3.613 9.446 11.394 7.78 28.067-3.612 37.516-12.503 10.559-23.618 22.509-32.509 35.57 21.672-14.729 46.679-24.732 74.186-28.067 14.725-1.945 28.063 8.336 29.73 23.065 1.945 14.728-8.336 28.067-23.062 29.734-16.116 1.945-31.12 7.503-44.178 15.284 26.114-5.713 58.712-3.138 88.079 11.115 13.336 6.669 18.893 22.509 12.224 35.848-6.389 13.06-22.504 18.617-35.564 12.226zm-27.229 69.472c-6.112-12.505-18.338-20.286-32.231-20.286a35.46 35.46 0 0 0-35.565 35.57c0 21.428 17.808 35.57 35.565 35.57 13.893 0 26.119-7.781 32.231-20.286 4.446-9.449 13.614-15.006 23.339-15.284-9.725-.277-18.893-5.835-23.339-15.284zm374.821-37.237c4.168 8.615 1.111 18.897-6.946 23.621l-58.071 33.069L532 352.16c-6.39 57.245-34.731 109.767-79.743 146.726-10.932 9.112-27.799 8.144-37.51-3.613-9.446-11.394-7.78-28.067 3.613-37.516 12.503-10.559 23.617-22.509 32.508-35.57-21.672 14.729-46.679 24.732-74.186 28.067-10.021 2.506-27.552-5.643-29.73-23.065-1.945-14.728 8.336-28.067 23.062-29.734 16.116-1.946 31.12-7.503 44.178-15.284-26.114 5.713-58.712 3.138-88.079-11.115-13.336-6.669-18.893-22.509-12.224-35.848 6.389-13.061 22.505-18.619 35.565-12.227 20.295 10.149 44.147 11.199 64.739 3.89-42.606 0-71.208-20.475-85.578-50.576-8.576-17.899 5.148-38.071 23.617-38.071-18.429 0-32.211-20.136-23.617-38.071 14.033-29.396 44.039-50.887 81.966-50.854l92.803 8.615 66.406-33.347c9.408-4.704 19.828-.354 23.894 7.781l44.455 88.926zm-229.227-18.618c-13.893 0-26.119 7.781-32.231 20.286-4.446 9.449-13.614 15.006-23.339 15.284 9.725.278 18.893 5.836 23.339 15.284 6.112 12.505 18.338 20.286 32.231 20.286a35.46 35.46 0 0 0 35.565-35.57c0-21.429-17.808-35.57-35.565-35.57z\"]\n};\nvar faAnchor = {\n prefix: 'fas',\n iconName: 'anchor',\n icon: [576, 512, [], \"f13d\", \"M12.971 352h32.394C67.172 454.735 181.944 512 288 512c106.229 0 220.853-57.38 242.635-160h32.394c10.691 0 16.045-12.926 8.485-20.485l-67.029-67.029c-4.686-4.686-12.284-4.686-16.971 0l-67.029 67.029c-7.56 7.56-2.206 20.485 8.485 20.485h35.146c-20.29 54.317-84.963 86.588-144.117 94.015V256h52c6.627 0 12-5.373 12-12v-40c0-6.627-5.373-12-12-12h-52v-5.47c37.281-13.178 63.995-48.725 64-90.518C384.005 43.772 341.605.738 289.37.01 235.723-.739 192 42.525 192 96c0 41.798 26.716 77.35 64 90.53V192h-52c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h52v190.015c-58.936-7.399-123.82-39.679-144.117-94.015h35.146c10.691 0 16.045-12.926 8.485-20.485l-67.029-67.029c-4.686-4.686-12.284-4.686-16.971 0L4.485 331.515C-3.074 339.074 2.28 352 12.971 352zM288 64c17.645 0 32 14.355 32 32s-14.355 32-32 32-32-14.355-32-32 14.355-32 32-32z\"]\n};\nvar faAngleDoubleDown = {\n prefix: 'fas',\n iconName: 'angle-double-down',\n icon: [320, 512, [], \"f103\", \"M143 256.3L7 120.3c-9.4-9.4-9.4-24.6 0-33.9l22.6-22.6c9.4-9.4 24.6-9.4 33.9 0l96.4 96.4 96.4-96.4c9.4-9.4 24.6-9.4 33.9 0L313 86.3c9.4 9.4 9.4 24.6 0 33.9l-136 136c-9.4 9.5-24.6 9.5-34 .1zm34 192l136-136c9.4-9.4 9.4-24.6 0-33.9l-22.6-22.6c-9.4-9.4-24.6-9.4-33.9 0L160 352.1l-96.4-96.4c-9.4-9.4-24.6-9.4-33.9 0L7 278.3c-9.4 9.4-9.4 24.6 0 33.9l136 136c9.4 9.5 24.6 9.5 34 .1z\"]\n};\nvar faAngleDoubleLeft = {\n prefix: 'fas',\n iconName: 'angle-double-left',\n icon: [448, 512, [], \"f100\", \"M223.7 239l136-136c9.4-9.4 24.6-9.4 33.9 0l22.6 22.6c9.4 9.4 9.4 24.6 0 33.9L319.9 256l96.4 96.4c9.4 9.4 9.4 24.6 0 33.9L393.7 409c-9.4 9.4-24.6 9.4-33.9 0l-136-136c-9.5-9.4-9.5-24.6-.1-34zm-192 34l136 136c9.4 9.4 24.6 9.4 33.9 0l22.6-22.6c9.4-9.4 9.4-24.6 0-33.9L127.9 256l96.4-96.4c9.4-9.4 9.4-24.6 0-33.9L201.7 103c-9.4-9.4-24.6-9.4-33.9 0l-136 136c-9.5 9.4-9.5 24.6-.1 34z\"]\n};\nvar faAngleDoubleRight = {\n prefix: 'fas',\n iconName: 'angle-double-right',\n icon: [448, 512, [], \"f101\", \"M224.3 273l-136 136c-9.4 9.4-24.6 9.4-33.9 0l-22.6-22.6c-9.4-9.4-9.4-24.6 0-33.9l96.4-96.4-96.4-96.4c-9.4-9.4-9.4-24.6 0-33.9L54.3 103c9.4-9.4 24.6-9.4 33.9 0l136 136c9.5 9.4 9.5 24.6.1 34zm192-34l-136-136c-9.4-9.4-24.6-9.4-33.9 0l-22.6 22.6c-9.4 9.4-9.4 24.6 0 33.9l96.4 96.4-96.4 96.4c-9.4 9.4-9.4 24.6 0 33.9l22.6 22.6c9.4 9.4 24.6 9.4 33.9 0l136-136c9.4-9.2 9.4-24.4 0-33.8z\"]\n};\nvar faAngleDoubleUp = {\n prefix: 'fas',\n iconName: 'angle-double-up',\n icon: [320, 512, [], \"f102\", \"M177 255.7l136 136c9.4 9.4 9.4 24.6 0 33.9l-22.6 22.6c-9.4 9.4-24.6 9.4-33.9 0L160 351.9l-96.4 96.4c-9.4 9.4-24.6 9.4-33.9 0L7 425.7c-9.4-9.4-9.4-24.6 0-33.9l136-136c9.4-9.5 24.6-9.5 34-.1zm-34-192L7 199.7c-9.4 9.4-9.4 24.6 0 33.9l22.6 22.6c9.4 9.4 24.6 9.4 33.9 0l96.4-96.4 96.4 96.4c9.4 9.4 24.6 9.4 33.9 0l22.6-22.6c9.4-9.4 9.4-24.6 0-33.9l-136-136c-9.2-9.4-24.4-9.4-33.8 0z\"]\n};\nvar faAngleDown = {\n prefix: 'fas',\n iconName: 'angle-down',\n icon: [320, 512, [], \"f107\", \"M143 352.3L7 216.3c-9.4-9.4-9.4-24.6 0-33.9l22.6-22.6c9.4-9.4 24.6-9.4 33.9 0l96.4 96.4 96.4-96.4c9.4-9.4 24.6-9.4 33.9 0l22.6 22.6c9.4 9.4 9.4 24.6 0 33.9l-136 136c-9.2 9.4-24.4 9.4-33.8 0z\"]\n};\nvar faAngleLeft = {\n prefix: 'fas',\n iconName: 'angle-left',\n icon: [256, 512, [], \"f104\", \"M31.7 239l136-136c9.4-9.4 24.6-9.4 33.9 0l22.6 22.6c9.4 9.4 9.4 24.6 0 33.9L127.9 256l96.4 96.4c9.4 9.4 9.4 24.6 0 33.9L201.7 409c-9.4 9.4-24.6 9.4-33.9 0l-136-136c-9.5-9.4-9.5-24.6-.1-34z\"]\n};\nvar faAngleRight = {\n prefix: 'fas',\n iconName: 'angle-right',\n icon: [256, 512, [], \"f105\", \"M224.3 273l-136 136c-9.4 9.4-24.6 9.4-33.9 0l-22.6-22.6c-9.4-9.4-9.4-24.6 0-33.9l96.4-96.4-96.4-96.4c-9.4-9.4-9.4-24.6 0-33.9L54.3 103c9.4-9.4 24.6-9.4 33.9 0l136 136c9.5 9.4 9.5 24.6.1 34z\"]\n};\nvar faAngleUp = {\n prefix: 'fas',\n iconName: 'angle-up',\n icon: [320, 512, [], \"f106\", \"M177 159.7l136 136c9.4 9.4 9.4 24.6 0 33.9l-22.6 22.6c-9.4 9.4-24.6 9.4-33.9 0L160 255.9l-96.4 96.4c-9.4 9.4-24.6 9.4-33.9 0L7 329.7c-9.4-9.4-9.4-24.6 0-33.9l136-136c9.4-9.5 24.6-9.5 34-.1z\"]\n};\nvar faAngry = {\n prefix: 'fas',\n iconName: 'angry',\n icon: [496, 512, [], \"f556\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zM136 240c0-9.3 4.1-17.5 10.5-23.4l-31-9.3c-8.5-2.5-13.3-11.5-10.7-19.9 2.5-8.5 11.4-13.2 19.9-10.7l80 24c8.5 2.5 13.3 11.5 10.7 19.9-2.1 6.9-8.4 11.4-15.3 11.4-.5 0-1.1-.2-1.7-.2.7 2.7 1.7 5.3 1.7 8.2 0 17.7-14.3 32-32 32S136 257.7 136 240zm168 154.2c-27.8-33.4-84.2-33.4-112.1 0-13.5 16.3-38.2-4.2-24.6-20.5 20-24 49.4-37.8 80.6-37.8s60.6 13.8 80.6 37.8c13.8 16.5-11.1 36.6-24.5 20.5zm76.6-186.9l-31 9.3c6.3 5.8 10.5 14.1 10.5 23.4 0 17.7-14.3 32-32 32s-32-14.3-32-32c0-2.9.9-5.6 1.7-8.2-.6.1-1.1.2-1.7.2-6.9 0-13.2-4.5-15.3-11.4-2.5-8.5 2.3-17.4 10.7-19.9l80-24c8.4-2.5 17.4 2.3 19.9 10.7 2.5 8.5-2.3 17.4-10.8 19.9z\"]\n};\nvar faAnkh = {\n prefix: 'fas',\n iconName: 'ankh',\n icon: [320, 512, [], \"f644\", \"M296 256h-44.62C272.46 222.01 288 181.65 288 144 288 55.63 230.69 0 160 0S32 55.63 32 144c0 37.65 15.54 78.01 36.62 112H24c-13.25 0-24 10.74-24 24v32c0 13.25 10.75 24 24 24h96v152c0 13.25 10.75 24 24 24h32c13.25 0 24-10.75 24-24V336h96c13.25 0 24-10.75 24-24v-32c0-13.26-10.75-24-24-24zM160 80c29.61 0 48 24.52 48 64 0 34.66-27.14 78.14-48 100.87-20.86-22.72-48-66.21-48-100.87 0-39.48 18.39-64 48-64z\"]\n};\nvar faAppleAlt = {\n prefix: 'fas',\n iconName: 'apple-alt',\n icon: [448, 512, [], \"f5d1\", \"M350.85 129c25.97 4.67 47.27 18.67 63.92 42 14.65 20.67 24.64 46.67 29.96 78 4.67 28.67 4.32 57.33-1 86-7.99 47.33-23.97 87-47.94 119-28.64 38.67-64.59 58-107.87 58-10.66 0-22.3-3.33-34.96-10-8.66-5.33-18.31-8-28.97-8s-20.3 2.67-28.97 8c-12.66 6.67-24.3 10-34.96 10-43.28 0-79.23-19.33-107.87-58-23.97-32-39.95-71.67-47.94-119-5.32-28.67-5.67-57.33-1-86 5.32-31.33 15.31-57.33 29.96-78 16.65-23.33 37.95-37.33 63.92-42 15.98-2.67 37.95-.33 65.92 7 23.97 6.67 44.28 14.67 60.93 24 16.65-9.33 36.96-17.33 60.93-24 27.98-7.33 49.96-9.67 65.94-7zm-54.94-41c-9.32 8.67-21.65 15-36.96 19-10.66 3.33-22.3 5-34.96 5l-14.98-1c-1.33-9.33-1.33-20 0-32 2.67-24 10.32-42.33 22.97-55 9.32-8.67 21.65-15 36.96-19 10.66-3.33 22.3-5 34.96-5l14.98 1 1 15c0 12.67-1.67 24.33-4.99 35-3.99 15.33-10.31 27.67-18.98 37z\"]\n};\nvar faArchive = {\n prefix: 'fas',\n iconName: 'archive',\n icon: [512, 512, [], \"f187\", \"M32 448c0 17.7 14.3 32 32 32h384c17.7 0 32-14.3 32-32V160H32v288zm160-212c0-6.6 5.4-12 12-12h104c6.6 0 12 5.4 12 12v8c0 6.6-5.4 12-12 12H204c-6.6 0-12-5.4-12-12v-8zM480 32H32C14.3 32 0 46.3 0 64v48c0 8.8 7.2 16 16 16h480c8.8 0 16-7.2 16-16V64c0-17.7-14.3-32-32-32z\"]\n};\nvar faArchway = {\n prefix: 'fas',\n iconName: 'archway',\n icon: [576, 512, [], \"f557\", \"M560 448h-16V96H32v352H16.02c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16H176c8.84 0 16-7.16 16-16V320c0-53.02 42.98-96 96-96s96 42.98 96 96l.02 160v16c0 8.84 7.16 16 16 16H560c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16zm0-448H16C7.16 0 0 7.16 0 16v32c0 8.84 7.16 16 16 16h544c8.84 0 16-7.16 16-16V16c0-8.84-7.16-16-16-16z\"]\n};\nvar faArrowAltCircleDown = {\n prefix: 'fas',\n iconName: 'arrow-alt-circle-down',\n icon: [512, 512, [], \"f358\", \"M504 256c0 137-111 248-248 248S8 393 8 256 119 8 256 8s248 111 248 248zM212 140v116h-70.9c-10.7 0-16.1 13-8.5 20.5l114.9 114.3c4.7 4.7 12.2 4.7 16.9 0l114.9-114.3c7.6-7.6 2.2-20.5-8.5-20.5H300V140c0-6.6-5.4-12-12-12h-64c-6.6 0-12 5.4-12 12z\"]\n};\nvar faArrowAltCircleLeft = {\n prefix: 'fas',\n iconName: 'arrow-alt-circle-left',\n icon: [512, 512, [], \"f359\", \"M256 504C119 504 8 393 8 256S119 8 256 8s248 111 248 248-111 248-248 248zm116-292H256v-70.9c0-10.7-13-16.1-20.5-8.5L121.2 247.5c-4.7 4.7-4.7 12.2 0 16.9l114.3 114.9c7.6 7.6 20.5 2.2 20.5-8.5V300h116c6.6 0 12-5.4 12-12v-64c0-6.6-5.4-12-12-12z\"]\n};\nvar faArrowAltCircleRight = {\n prefix: 'fas',\n iconName: 'arrow-alt-circle-right',\n icon: [512, 512, [], \"f35a\", \"M256 8c137 0 248 111 248 248S393 504 256 504 8 393 8 256 119 8 256 8zM140 300h116v70.9c0 10.7 13 16.1 20.5 8.5l114.3-114.9c4.7-4.7 4.7-12.2 0-16.9l-114.3-115c-7.6-7.6-20.5-2.2-20.5 8.5V212H140c-6.6 0-12 5.4-12 12v64c0 6.6 5.4 12 12 12z\"]\n};\nvar faArrowAltCircleUp = {\n prefix: 'fas',\n iconName: 'arrow-alt-circle-up',\n icon: [512, 512, [], \"f35b\", \"M8 256C8 119 119 8 256 8s248 111 248 248-111 248-248 248S8 393 8 256zm292 116V256h70.9c10.7 0 16.1-13 8.5-20.5L264.5 121.2c-4.7-4.7-12.2-4.7-16.9 0l-115 114.3c-7.6 7.6-2.2 20.5 8.5 20.5H212v116c0 6.6 5.4 12 12 12h64c6.6 0 12-5.4 12-12z\"]\n};\nvar faArrowCircleDown = {\n prefix: 'fas',\n iconName: 'arrow-circle-down',\n icon: [512, 512, [], \"f0ab\", \"M504 256c0 137-111 248-248 248S8 393 8 256 119 8 256 8s248 111 248 248zm-143.6-28.9L288 302.6V120c0-13.3-10.7-24-24-24h-16c-13.3 0-24 10.7-24 24v182.6l-72.4-75.5c-9.3-9.7-24.8-9.9-34.3-.4l-10.9 11c-9.4 9.4-9.4 24.6 0 33.9L239 404.3c9.4 9.4 24.6 9.4 33.9 0l132.7-132.7c9.4-9.4 9.4-24.6 0-33.9l-10.9-11c-9.5-9.5-25-9.3-34.3.4z\"]\n};\nvar faArrowCircleLeft = {\n prefix: 'fas',\n iconName: 'arrow-circle-left',\n icon: [512, 512, [], \"f0a8\", \"M256 504C119 504 8 393 8 256S119 8 256 8s248 111 248 248-111 248-248 248zm28.9-143.6L209.4 288H392c13.3 0 24-10.7 24-24v-16c0-13.3-10.7-24-24-24H209.4l75.5-72.4c9.7-9.3 9.9-24.8.4-34.3l-11-10.9c-9.4-9.4-24.6-9.4-33.9 0L107.7 239c-9.4 9.4-9.4 24.6 0 33.9l132.7 132.7c9.4 9.4 24.6 9.4 33.9 0l11-10.9c9.5-9.5 9.3-25-.4-34.3z\"]\n};\nvar faArrowCircleRight = {\n prefix: 'fas',\n iconName: 'arrow-circle-right',\n icon: [512, 512, [], \"f0a9\", \"M256 8c137 0 248 111 248 248S393 504 256 504 8 393 8 256 119 8 256 8zm-28.9 143.6l75.5 72.4H120c-13.3 0-24 10.7-24 24v16c0 13.3 10.7 24 24 24h182.6l-75.5 72.4c-9.7 9.3-9.9 24.8-.4 34.3l11 10.9c9.4 9.4 24.6 9.4 33.9 0L404.3 273c9.4-9.4 9.4-24.6 0-33.9L271.6 106.3c-9.4-9.4-24.6-9.4-33.9 0l-11 10.9c-9.5 9.6-9.3 25.1.4 34.4z\"]\n};\nvar faArrowCircleUp = {\n prefix: 'fas',\n iconName: 'arrow-circle-up',\n icon: [512, 512, [], \"f0aa\", \"M8 256C8 119 119 8 256 8s248 111 248 248-111 248-248 248S8 393 8 256zm143.6 28.9l72.4-75.5V392c0 13.3 10.7 24 24 24h16c13.3 0 24-10.7 24-24V209.4l72.4 75.5c9.3 9.7 24.8 9.9 34.3.4l10.9-11c9.4-9.4 9.4-24.6 0-33.9L273 107.7c-9.4-9.4-24.6-9.4-33.9 0L106.3 240.4c-9.4 9.4-9.4 24.6 0 33.9l10.9 11c9.6 9.5 25.1 9.3 34.4-.4z\"]\n};\nvar faArrowDown = {\n prefix: 'fas',\n iconName: 'arrow-down',\n icon: [448, 512, [], \"f063\", \"M413.1 222.5l22.2 22.2c9.4 9.4 9.4 24.6 0 33.9L241 473c-9.4 9.4-24.6 9.4-33.9 0L12.7 278.6c-9.4-9.4-9.4-24.6 0-33.9l22.2-22.2c9.5-9.5 25-9.3 34.3.4L184 343.4V56c0-13.3 10.7-24 24-24h32c13.3 0 24 10.7 24 24v287.4l114.8-120.5c9.3-9.8 24.8-10 34.3-.4z\"]\n};\nvar faArrowLeft = {\n prefix: 'fas',\n iconName: 'arrow-left',\n icon: [448, 512, [], \"f060\", \"M257.5 445.1l-22.2 22.2c-9.4 9.4-24.6 9.4-33.9 0L7 273c-9.4-9.4-9.4-24.6 0-33.9L201.4 44.7c9.4-9.4 24.6-9.4 33.9 0l22.2 22.2c9.5 9.5 9.3 25-.4 34.3L136.6 216H424c13.3 0 24 10.7 24 24v32c0 13.3-10.7 24-24 24H136.6l120.5 114.8c9.8 9.3 10 24.8.4 34.3z\"]\n};\nvar faArrowRight = {\n prefix: 'fas',\n iconName: 'arrow-right',\n icon: [448, 512, [], \"f061\", \"M190.5 66.9l22.2-22.2c9.4-9.4 24.6-9.4 33.9 0L441 239c9.4 9.4 9.4 24.6 0 33.9L246.6 467.3c-9.4 9.4-24.6 9.4-33.9 0l-22.2-22.2c-9.5-9.5-9.3-25 .4-34.3L311.4 296H24c-13.3 0-24-10.7-24-24v-32c0-13.3 10.7-24 24-24h287.4L190.9 101.2c-9.8-9.3-10-24.8-.4-34.3z\"]\n};\nvar faArrowUp = {\n prefix: 'fas',\n iconName: 'arrow-up',\n icon: [448, 512, [], \"f062\", \"M34.9 289.5l-22.2-22.2c-9.4-9.4-9.4-24.6 0-33.9L207 39c9.4-9.4 24.6-9.4 33.9 0l194.3 194.3c9.4 9.4 9.4 24.6 0 33.9L413 289.4c-9.5 9.5-25 9.3-34.3-.4L264 168.6V456c0 13.3-10.7 24-24 24h-32c-13.3 0-24-10.7-24-24V168.6L69.2 289.1c-9.3 9.8-24.8 10-34.3.4z\"]\n};\nvar faArrowsAlt = {\n prefix: 'fas',\n iconName: 'arrows-alt',\n icon: [512, 512, [], \"f0b2\", \"M352.201 425.775l-79.196 79.196c-9.373 9.373-24.568 9.373-33.941 0l-79.196-79.196c-15.119-15.119-4.411-40.971 16.971-40.97h51.162L228 284H127.196v51.162c0 21.382-25.851 32.09-40.971 16.971L7.029 272.937c-9.373-9.373-9.373-24.569 0-33.941L86.225 159.8c15.119-15.119 40.971-4.411 40.971 16.971V228H228V127.196h-51.23c-21.382 0-32.09-25.851-16.971-40.971l79.196-79.196c9.373-9.373 24.568-9.373 33.941 0l79.196 79.196c15.119 15.119 4.411 40.971-16.971 40.971h-51.162V228h100.804v-51.162c0-21.382 25.851-32.09 40.97-16.971l79.196 79.196c9.373 9.373 9.373 24.569 0 33.941L425.773 352.2c-15.119 15.119-40.971 4.411-40.97-16.971V284H284v100.804h51.23c21.382 0 32.09 25.851 16.971 40.971z\"]\n};\nvar faArrowsAltH = {\n prefix: 'fas',\n iconName: 'arrows-alt-h',\n icon: [512, 512, [], \"f337\", \"M377.941 169.941V216H134.059v-46.059c0-21.382-25.851-32.09-40.971-16.971L7.029 239.029c-9.373 9.373-9.373 24.568 0 33.941l86.059 86.059c15.119 15.119 40.971 4.411 40.971-16.971V296h243.882v46.059c0 21.382 25.851 32.09 40.971 16.971l86.059-86.059c9.373-9.373 9.373-24.568 0-33.941l-86.059-86.059c-15.119-15.12-40.971-4.412-40.971 16.97z\"]\n};\nvar faArrowsAltV = {\n prefix: 'fas',\n iconName: 'arrows-alt-v',\n icon: [256, 512, [], \"f338\", \"M214.059 377.941H168V134.059h46.059c21.382 0 32.09-25.851 16.971-40.971L144.971 7.029c-9.373-9.373-24.568-9.373-33.941 0L24.971 93.088c-15.119 15.119-4.411 40.971 16.971 40.971H88v243.882H41.941c-21.382 0-32.09 25.851-16.971 40.971l86.059 86.059c9.373 9.373 24.568 9.373 33.941 0l86.059-86.059c15.12-15.119 4.412-40.971-16.97-40.971z\"]\n};\nvar faAssistiveListeningSystems = {\n prefix: 'fas',\n iconName: 'assistive-listening-systems',\n icon: [512, 512, [], \"f2a2\", \"M216 260c0 15.464-12.536 28-28 28s-28-12.536-28-28c0-44.112 35.888-80 80-80s80 35.888 80 80c0 15.464-12.536 28-28 28s-28-12.536-28-28c0-13.234-10.767-24-24-24s-24 10.766-24 24zm24-176c-97.047 0-176 78.953-176 176 0 15.464 12.536 28 28 28s28-12.536 28-28c0-66.168 53.832-120 120-120s120 53.832 120 120c0 75.164-71.009 70.311-71.997 143.622L288 404c0 28.673-23.327 52-52 52-15.464 0-28 12.536-28 28s12.536 28 28 28c59.475 0 107.876-48.328 108-107.774.595-34.428 72-48.24 72-144.226 0-97.047-78.953-176-176-176zm-80 236c-17.673 0-32 14.327-32 32s14.327 32 32 32 32-14.327 32-32-14.327-32-32-32zM32 448c-17.673 0-32 14.327-32 32s14.327 32 32 32 32-14.327 32-32-14.327-32-32-32zm480-187.993c0-1.518-.012-3.025-.045-4.531C510.076 140.525 436.157 38.47 327.994 1.511c-14.633-4.998-30.549 2.809-35.55 17.442-5 14.633 2.81 30.549 17.442 35.55 85.906 29.354 144.61 110.513 146.077 201.953l.003.188c.026 1.118.033 2.236.033 3.363 0 15.464 12.536 28 28 28s28.001-12.536 28.001-28zM152.971 439.029l-80-80L39.03 392.97l80 80 33.941-33.941z\"]\n};\nvar faAsterisk = {\n prefix: 'fas',\n iconName: 'asterisk',\n icon: [512, 512, [], \"f069\", \"M478.21 334.093L336 256l142.21-78.093c11.795-6.477 15.961-21.384 9.232-33.037l-19.48-33.741c-6.728-11.653-21.72-15.499-33.227-8.523L296 186.718l3.475-162.204C299.763 11.061 288.937 0 275.48 0h-38.96c-13.456 0-24.283 11.061-23.994 24.514L216 186.718 77.265 102.607c-11.506-6.976-26.499-3.13-33.227 8.523l-19.48 33.741c-6.728 11.653-2.562 26.56 9.233 33.037L176 256 33.79 334.093c-11.795 6.477-15.961 21.384-9.232 33.037l19.48 33.741c6.728 11.653 21.721 15.499 33.227 8.523L216 325.282l-3.475 162.204C212.237 500.939 223.064 512 236.52 512h38.961c13.456 0 24.283-11.061 23.995-24.514L296 325.282l138.735 84.111c11.506 6.976 26.499 3.13 33.227-8.523l19.48-33.741c6.728-11.653 2.563-26.559-9.232-33.036z\"]\n};\nvar faAt = {\n prefix: 'fas',\n iconName: 'at',\n icon: [512, 512, [], \"f1fa\", \"M256 8C118.941 8 8 118.919 8 256c0 137.059 110.919 248 248 248 48.154 0 95.342-14.14 135.408-40.223 12.005-7.815 14.625-24.288 5.552-35.372l-10.177-12.433c-7.671-9.371-21.179-11.667-31.373-5.129C325.92 429.757 291.314 440 256 440c-101.458 0-184-82.542-184-184S154.542 72 256 72c100.139 0 184 57.619 184 160 0 38.786-21.093 79.742-58.17 83.693-17.349-.454-16.91-12.857-13.476-30.024l23.433-121.11C394.653 149.75 383.308 136 368.225 136h-44.981a13.518 13.518 0 0 0-13.432 11.993l-.01.092c-14.697-17.901-40.448-21.775-59.971-21.775-74.58 0-137.831 62.234-137.831 151.46 0 65.303 36.785 105.87 96 105.87 26.984 0 57.369-15.637 74.991-38.333 9.522 34.104 40.613 34.103 70.71 34.103C462.609 379.41 504 307.798 504 232 504 95.653 394.023 8 256 8zm-21.68 304.43c-22.249 0-36.07-15.623-36.07-40.771 0-44.993 30.779-72.729 58.63-72.729 22.292 0 35.601 15.241 35.601 40.77 0 45.061-33.875 72.73-58.161 72.73z\"]\n};\nvar faAtlas = {\n prefix: 'fas',\n iconName: 'atlas',\n icon: [448, 512, [], \"f558\", \"M318.38 208h-39.09c-1.49 27.03-6.54 51.35-14.21 70.41 27.71-13.24 48.02-39.19 53.3-70.41zm0-32c-5.29-31.22-25.59-57.17-53.3-70.41 7.68 19.06 12.72 43.38 14.21 70.41h39.09zM224 97.31c-7.69 7.45-20.77 34.42-23.43 78.69h46.87c-2.67-44.26-15.75-71.24-23.44-78.69zm-41.08 8.28c-27.71 13.24-48.02 39.19-53.3 70.41h39.09c1.49-27.03 6.53-51.35 14.21-70.41zm0 172.82c-7.68-19.06-12.72-43.38-14.21-70.41h-39.09c5.28 31.22 25.59 57.17 53.3 70.41zM247.43 208h-46.87c2.66 44.26 15.74 71.24 23.43 78.69 7.7-7.45 20.78-34.43 23.44-78.69zM448 358.4V25.6c0-16-9.6-25.6-25.6-25.6H96C41.6 0 0 41.6 0 96v320c0 54.4 41.6 96 96 96h326.4c12.8 0 25.6-9.6 25.6-25.6v-16c0-6.4-3.2-12.8-9.6-19.2-3.2-16-3.2-60.8 0-73.6 6.4-3.2 9.6-9.6 9.6-19.2zM224 64c70.69 0 128 57.31 128 128s-57.31 128-128 128S96 262.69 96 192 153.31 64 224 64zm160 384H96c-19.2 0-32-12.8-32-32s16-32 32-32h288v64z\"]\n};\nvar faAtom = {\n prefix: 'fas',\n iconName: 'atom',\n icon: [448, 512, [], \"f5d2\", \"M413.03 256c40.13-54.89 41.51-98.62 25.14-128-10.91-19.52-40.54-50.73-116.33-41.88C300.36 34.89 267.64 0 224 0s-76.36 34.89-97.84 86.12C50.43 77.34 20.73 108.48 9.83 128c-16.38 29.4-15 73.09 25.14 128-40.13 54.89-41.51 98.62-25.14 128 29.21 52.34 101.68 43.58 116.33 41.88C147.63 477.1 180.36 512 224 512s76.37-34.9 97.84-86.12c14.64 1.7 87.11 10.46 116.33-41.88 16.38-29.4 15-73.09-25.14-128zM63.38 352c-4.03-7.21-.19-24.8 14.95-48.29 6.96 6.53 14.2 12.89 21.87 19.18 1.71 13.71 4 27.08 6.76 40.08-24.56.89-39.89-4.37-43.58-10.97zm36.82-162.88c-7.66 6.29-14.9 12.65-21.87 19.18-15.13-23.5-18.97-41.09-14.95-48.3 3.41-6.14 16.39-11.47 37.92-11.47 1.71 0 3.87.3 5.69.37a472.191 472.191 0 0 0-6.79 40.22zM224 64c9.47 0 22.2 13.52 33.86 37.26-11.19 3.7-22.44 8-33.86 12.86-11.42-4.86-22.67-9.16-33.86-12.86C201.8 77.52 214.53 64 224 64zm0 384c-9.47 0-22.2-13.52-33.86-37.26 11.19-3.7 22.44-8 33.86-12.86 11.42 4.86 22.67 9.16 33.86 12.86C246.2 434.48 233.47 448 224 448zm62.5-157.33c-26.7 19.08-46.14 29.33-62.5 37.48-16.35-8.14-35.8-18.41-62.5-37.48-1.99-27.79-1.99-41.54 0-69.33 26.67-19.05 46.13-29.32 62.5-37.48 16.39 8.17 35.86 18.44 62.5 37.48 1.98 27.78 1.99 41.53 0 69.33zM384.62 352c-3.67 6.62-19 11.82-43.58 10.95 2.76-13 5.05-26.37 6.76-40.06 7.66-6.29 14.9-12.65 21.87-19.18 15.13 23.49 18.97 41.08 14.95 48.29zm-14.95-143.71c-6.96-6.53-14.2-12.89-21.87-19.18a473.535 473.535 0 0 0-6.79-40.22c1.82-.07 3.97-.37 5.69-.37 21.52 0 34.51 5.34 37.92 11.47 4.02 7.22.18 24.81-14.95 48.3zM224 224c-17.67 0-32 14.33-32 32s14.33 32 32 32 32-14.33 32-32-14.33-32-32-32z\"]\n};\nvar faAudioDescription = {\n prefix: 'fas',\n iconName: 'audio-description',\n icon: [512, 512, [], \"f29e\", \"M162.925 238.709l8.822 30.655h-25.606l9.041-30.652c1.277-4.421 2.651-9.994 3.872-15.245 1.22 5.251 2.594 10.823 3.871 15.242zm166.474-32.099h-14.523v98.781h14.523c29.776 0 46.175-17.678 46.175-49.776 0-32.239-17.49-49.005-46.175-49.005zM512 112v288c0 26.51-21.49 48-48 48H48c-26.51 0-48-21.49-48-48V112c0-26.51 21.49-48 48-48h416c26.51 0 48 21.49 48 48zM245.459 336.139l-57.097-168A12.001 12.001 0 0 0 177 160h-35.894a12.001 12.001 0 0 0-11.362 8.139l-57.097 168C70.003 343.922 75.789 352 84.009 352h29.133a12 12 0 0 0 11.535-8.693l8.574-29.906h51.367l8.793 29.977A12 12 0 0 0 204.926 352h29.172c8.22 0 14.006-8.078 11.361-15.861zm184.701-80.525c0-58.977-37.919-95.614-98.96-95.614h-57.366c-6.627 0-12 5.373-12 12v168c0 6.627 5.373 12 12 12H331.2c61.041 0 98.96-36.933 98.96-96.386z\"]\n};\nvar faAward = {\n prefix: 'fas',\n iconName: 'award',\n icon: [384, 512, [], \"f559\", \"M97.12 362.63c-8.69-8.69-4.16-6.24-25.12-11.85-9.51-2.55-17.87-7.45-25.43-13.32L1.2 448.7c-4.39 10.77 3.81 22.47 15.43 22.03l52.69-2.01L105.56 507c8 8.44 22.04 5.81 26.43-4.96l52.05-127.62c-10.84 6.04-22.87 9.58-35.31 9.58-19.5 0-37.82-7.59-51.61-21.37zM382.8 448.7l-45.37-111.24c-7.56 5.88-15.92 10.77-25.43 13.32-21.07 5.64-16.45 3.18-25.12 11.85-13.79 13.78-32.12 21.37-51.62 21.37-12.44 0-24.47-3.55-35.31-9.58L252 502.04c4.39 10.77 18.44 13.4 26.43 4.96l36.25-38.28 52.69 2.01c11.62.44 19.82-11.27 15.43-22.03zM263 340c15.28-15.55 17.03-14.21 38.79-20.14 13.89-3.79 24.75-14.84 28.47-28.98 7.48-28.4 5.54-24.97 25.95-45.75 10.17-10.35 14.14-25.44 10.42-39.58-7.47-28.38-7.48-24.42 0-52.83 3.72-14.14-.25-29.23-10.42-39.58-20.41-20.78-18.47-17.36-25.95-45.75-3.72-14.14-14.58-25.19-28.47-28.98-27.88-7.61-24.52-5.62-44.95-26.41-10.17-10.35-25-14.4-38.89-10.61-27.87 7.6-23.98 7.61-51.9 0-13.89-3.79-28.72.25-38.89 10.61-20.41 20.78-17.05 18.8-44.94 26.41-13.89 3.79-24.75 14.84-28.47 28.98-7.47 28.39-5.54 24.97-25.95 45.75-10.17 10.35-14.15 25.44-10.42 39.58 7.47 28.36 7.48 24.4 0 52.82-3.72 14.14.25 29.23 10.42 39.59 20.41 20.78 18.47 17.35 25.95 45.75 3.72 14.14 14.58 25.19 28.47 28.98C104.6 325.96 106.27 325 121 340c13.23 13.47 33.84 15.88 49.74 5.82a39.676 39.676 0 0 1 42.53 0c15.89 10.06 36.5 7.65 49.73-5.82zM97.66 175.96c0-53.03 42.24-96.02 94.34-96.02s94.34 42.99 94.34 96.02-42.24 96.02-94.34 96.02-94.34-42.99-94.34-96.02z\"]\n};\nvar faBaby = {\n prefix: 'fas',\n iconName: 'baby',\n icon: [384, 512, [], \"f77c\", \"M192 160c44.2 0 80-35.8 80-80S236.2 0 192 0s-80 35.8-80 80 35.8 80 80 80zm-53.4 248.8l25.6-32-61.5-51.2L56.8 383c-11.4 14.2-11.7 34.4-.8 49l48 64c7.9 10.5 19.9 16 32 16 8.3 0 16.8-2.6 24-8 17.7-13.2 21.2-38.3 8-56l-29.4-39.2zm142.7-83.2l-61.5 51.2 25.6 32L216 448c-13.2 17.7-9.7 42.8 8 56 7.2 5.4 15.6 8 24 8 12.2 0 24.2-5.5 32-16l48-64c10.9-14.6 10.6-34.8-.8-49l-45.9-57.4zM376.7 145c-12.7-18.1-37.6-22.4-55.7-9.8l-40.6 28.5c-52.7 37-124.2 37-176.8 0L63 135.3C44.9 122.6 20 127 7.3 145-5.4 163.1-1 188 17 200.7l40.6 28.5c17 11.9 35.4 20.9 54.4 27.9V288h160v-30.8c19-7 37.4-16 54.4-27.9l40.6-28.5c18.1-12.8 22.4-37.7 9.7-55.8z\"]\n};\nvar faBabyCarriage = {\n prefix: 'fas',\n iconName: 'baby-carriage',\n icon: [512, 512, [], \"f77d\", \"M144.8 17c-11.3-17.8-37.2-22.8-54-9.4C35.3 51.9 0 118 0 192h256L144.8 17zM496 96h-48c-35.3 0-64 28.7-64 64v64H0c0 50.6 23 96.4 60.3 130.7C25.7 363.6 0 394.7 0 432c0 44.2 35.8 80 80 80s80-35.8 80-80c0-8.9-1.8-17.2-4.4-25.2 21.6 5.9 44.6 9.2 68.4 9.2s46.9-3.3 68.4-9.2c-2.7 8-4.4 16.3-4.4 25.2 0 44.2 35.8 80 80 80s80-35.8 80-80c0-37.3-25.7-68.4-60.3-77.3C425 320.4 448 274.6 448 224v-64h48c8.8 0 16-7.2 16-16v-32c0-8.8-7.2-16-16-16zM80 464c-17.6 0-32-14.4-32-32s14.4-32 32-32 32 14.4 32 32-14.4 32-32 32zm320-32c0 17.6-14.4 32-32 32s-32-14.4-32-32 14.4-32 32-32 32 14.4 32 32z\"]\n};\nvar faBackspace = {\n prefix: 'fas',\n iconName: 'backspace',\n icon: [640, 512, [], \"f55a\", \"M576 64H205.26A63.97 63.97 0 0 0 160 82.75L9.37 233.37c-12.5 12.5-12.5 32.76 0 45.25L160 429.25c12 12 28.28 18.75 45.25 18.75H576c35.35 0 64-28.65 64-64V128c0-35.35-28.65-64-64-64zm-84.69 254.06c6.25 6.25 6.25 16.38 0 22.63l-22.62 22.62c-6.25 6.25-16.38 6.25-22.63 0L384 301.25l-62.06 62.06c-6.25 6.25-16.38 6.25-22.63 0l-22.62-22.62c-6.25-6.25-6.25-16.38 0-22.63L338.75 256l-62.06-62.06c-6.25-6.25-6.25-16.38 0-22.63l22.62-22.62c6.25-6.25 16.38-6.25 22.63 0L384 210.75l62.06-62.06c6.25-6.25 16.38-6.25 22.63 0l22.62 22.62c6.25 6.25 6.25 16.38 0 22.63L429.25 256l62.06 62.06z\"]\n};\nvar faBackward = {\n prefix: 'fas',\n iconName: 'backward',\n icon: [512, 512, [], \"f04a\", \"M11.5 280.6l192 160c20.6 17.2 52.5 2.8 52.5-24.6V96c0-27.4-31.9-41.8-52.5-24.6l-192 160c-15.3 12.8-15.3 36.4 0 49.2zm256 0l192 160c20.6 17.2 52.5 2.8 52.5-24.6V96c0-27.4-31.9-41.8-52.5-24.6l-192 160c-15.3 12.8-15.3 36.4 0 49.2z\"]\n};\nvar faBacon = {\n prefix: 'fas',\n iconName: 'bacon',\n icon: [576, 512, [], \"f7e5\", \"M218.92 336.39c34.89-34.89 44.2-59.7 54.05-86 10.61-28.29 21.59-57.54 61.37-97.34s69.05-50.77 97.35-61.38c23.88-9 46.64-17.68 76.79-45.37L470.81 8.91a31 31 0 0 0-40.18-2.83c-13.64 10.1-25.15 14.39-41 20.3C247 79.52 209.26 191.29 200.65 214.1c-29.75 78.83-89.55 94.68-98.72 98.09-24.86 9.26-54.73 20.38-91.07 50.36C-3 374-3.63 395 9.07 407.61l35.76 35.51C80 410.52 107 400.15 133 390.39c26.27-9.84 51.06-19.12 85.92-54zm348-232l-35.75-35.51c-35.19 32.63-62.18 43-88.25 52.79-26.26 9.85-51.06 19.16-85.95 54s-44.19 59.69-54 86C292.33 290 281.34 319.22 241.55 359s-69 50.73-97.3 61.32c-23.86 9-46.61 17.66-76.72 45.33l37.68 37.43a31 31 0 0 0 40.18 2.82c13.6-10.06 25.09-14.34 40.94-20.24 142.2-53 180-164.1 188.94-187.69C405 219.18 464.8 203.3 474 199.86c24.87-9.27 54.74-20.4 91.11-50.41 13.89-11.4 14.52-32.45 1.82-45.05z\"]\n};\nvar faBalanceScale = {\n prefix: 'fas',\n iconName: 'balance-scale',\n icon: [640, 512, [], \"f24e\", \"M256 336h-.02c0-16.18 1.34-8.73-85.05-181.51-17.65-35.29-68.19-35.36-85.87 0C-2.06 328.75.02 320.33.02 336H0c0 44.18 57.31 80 128 80s128-35.82 128-80zM128 176l72 144H56l72-144zm511.98 160c0-16.18 1.34-8.73-85.05-181.51-17.65-35.29-68.19-35.36-85.87 0-87.12 174.26-85.04 165.84-85.04 181.51H384c0 44.18 57.31 80 128 80s128-35.82 128-80h-.02zM440 320l72-144 72 144H440zm88 128H352V153.25c23.51-10.29 41.16-31.48 46.39-57.25H528c8.84 0 16-7.16 16-16V48c0-8.84-7.16-16-16-16H383.64C369.04 12.68 346.09 0 320 0s-49.04 12.68-63.64 32H112c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h129.61c5.23 25.76 22.87 46.96 46.39 57.25V448H112c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h416c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16z\"]\n};\nvar faBalanceScaleLeft = {\n prefix: 'fas',\n iconName: 'balance-scale-left',\n icon: [640, 512, [], \"f515\", \"M528 448H352V153.25c20.42-8.94 36.1-26.22 43.38-47.47l132-44.26c8.38-2.81 12.89-11.88 10.08-20.26l-10.17-30.34C524.48 2.54 515.41-1.97 507.03.84L389.11 40.37C375.3 16.36 349.69 0 320 0c-44.18 0-80 35.82-80 80 0 3.43.59 6.71 1.01 10.03l-128.39 43.05c-8.38 2.81-12.89 11.88-10.08 20.26l10.17 30.34c2.81 8.38 11.88 12.89 20.26 10.08l142.05-47.63c4.07 2.77 8.43 5.12 12.99 7.12V496c0 8.84 7.16 16 16 16h224c8.84 0 16-7.16 16-16v-32c-.01-8.84-7.17-16-16.01-16zm111.98-144c0-16.18 1.34-8.73-85.05-181.51-17.65-35.29-68.19-35.36-85.87 0-87.12 174.26-85.04 165.84-85.04 181.51H384c0 44.18 57.31 80 128 80s128-35.82 128-80h-.02zM440 288l72-144 72 144H440zm-269.07-37.51c-17.65-35.29-68.19-35.36-85.87 0C-2.06 424.75.02 416.33.02 432H0c0 44.18 57.31 80 128 80s128-35.82 128-80h-.02c0-16.18 1.34-8.73-85.05-181.51zM56 416l72-144 72 144H56z\"]\n};\nvar faBalanceScaleRight = {\n prefix: 'fas',\n iconName: 'balance-scale-right',\n icon: [640, 512, [], \"f516\", \"M96 464v32c0 8.84 7.16 16 16 16h224c8.84 0 16-7.16 16-16V153.25c4.56-2 8.92-4.35 12.99-7.12l142.05 47.63c8.38 2.81 17.45-1.71 20.26-10.08l10.17-30.34c2.81-8.38-1.71-17.45-10.08-20.26l-128.4-43.05c.42-3.32 1.01-6.6 1.01-10.03 0-44.18-35.82-80-80-80-29.69 0-55.3 16.36-69.11 40.37L132.96.83c-8.38-2.81-17.45 1.71-20.26 10.08l-10.17 30.34c-2.81 8.38 1.71 17.45 10.08 20.26l132 44.26c7.28 21.25 22.96 38.54 43.38 47.47V448H112c-8.84 0-16 7.16-16 16zM0 304c0 44.18 57.31 80 128 80s128-35.82 128-80h-.02c0-15.67 2.08-7.25-85.05-181.51-17.68-35.36-68.22-35.29-85.87 0C-1.32 295.27.02 287.82.02 304H0zm56-16l72-144 72 144H56zm328.02 144H384c0 44.18 57.31 80 128 80s128-35.82 128-80h-.02c0-15.67 2.08-7.25-85.05-181.51-17.68-35.36-68.22-35.29-85.87 0-86.38 172.78-85.04 165.33-85.04 181.51zM440 416l72-144 72 144H440z\"]\n};\nvar faBan = {\n prefix: 'fas',\n iconName: 'ban',\n icon: [512, 512, [], \"f05e\", \"M256 8C119.034 8 8 119.033 8 256s111.034 248 248 248 248-111.034 248-248S392.967 8 256 8zm130.108 117.892c65.448 65.448 70 165.481 20.677 235.637L150.47 105.216c70.204-49.356 170.226-44.735 235.638 20.676zM125.892 386.108c-65.448-65.448-70-165.481-20.677-235.637L361.53 406.784c-70.203 49.356-170.226 44.736-235.638-20.676z\"]\n};\nvar faBandAid = {\n prefix: 'fas',\n iconName: 'band-aid',\n icon: [640, 512, [], \"f462\", \"M0 160v192c0 35.3 28.7 64 64 64h96V96H64c-35.3 0-64 28.7-64 64zm576-64h-96v320h96c35.3 0 64-28.7 64-64V160c0-35.3-28.7-64-64-64zM192 416h256V96H192v320zm176-232c13.3 0 24 10.7 24 24s-10.7 24-24 24-24-10.7-24-24 10.7-24 24-24zm0 96c13.3 0 24 10.7 24 24s-10.7 24-24 24-24-10.7-24-24 10.7-24 24-24zm-96-96c13.3 0 24 10.7 24 24s-10.7 24-24 24-24-10.7-24-24 10.7-24 24-24zm0 96c13.3 0 24 10.7 24 24s-10.7 24-24 24-24-10.7-24-24 10.7-24 24-24z\"]\n};\nvar faBarcode = {\n prefix: 'fas',\n iconName: 'barcode',\n icon: [512, 512, [], \"f02a\", \"M0 448V64h18v384H0zm26.857-.273V64H36v383.727h-9.143zm27.143 0V64h8.857v383.727H54zm44.857 0V64h8.857v383.727h-8.857zm36 0V64h17.714v383.727h-17.714zm44.857 0V64h8.857v383.727h-8.857zm18 0V64h8.857v383.727h-8.857zm18 0V64h8.857v383.727h-8.857zm35.715 0V64h18v383.727h-18zm44.857 0V64h18v383.727h-18zm35.999 0V64h18.001v383.727h-18.001zm36.001 0V64h18.001v383.727h-18.001zm26.857 0V64h18v383.727h-18zm45.143 0V64h26.857v383.727h-26.857zm35.714 0V64h9.143v383.727H476zm18 .273V64h18v384h-18z\"]\n};\nvar faBars = {\n prefix: 'fas',\n iconName: 'bars',\n icon: [448, 512, [], \"f0c9\", \"M16 132h416c8.837 0 16-7.163 16-16V76c0-8.837-7.163-16-16-16H16C7.163 60 0 67.163 0 76v40c0 8.837 7.163 16 16 16zm0 160h416c8.837 0 16-7.163 16-16v-40c0-8.837-7.163-16-16-16H16c-8.837 0-16 7.163-16 16v40c0 8.837 7.163 16 16 16zm0 160h416c8.837 0 16-7.163 16-16v-40c0-8.837-7.163-16-16-16H16c-8.837 0-16 7.163-16 16v40c0 8.837 7.163 16 16 16z\"]\n};\nvar faBaseballBall = {\n prefix: 'fas',\n iconName: 'baseball-ball',\n icon: [496, 512, [], \"f433\", \"M368.5 363.9l28.8-13.9c11.1 22.9 26 43.2 44.1 60.9 34-42.5 54.5-96.3 54.5-154.9 0-58.5-20.4-112.2-54.2-154.6-17.8 17.3-32.6 37.1-43.6 59.5l-28.7-14.1c12.8-26 30-49 50.8-69C375.6 34.7 315 8 248 8 181.1 8 120.5 34.6 75.9 77.7c20.7 19.9 37.9 42.9 50.7 68.8l-28.7 14.1c-11-22.3-25.7-42.1-43.5-59.4C20.4 143.7 0 197.4 0 256c0 58.6 20.4 112.3 54.4 154.7 18.2-17.7 33.2-38 44.3-61l28.8 13.9c-12.9 26.7-30.3 50.3-51.5 70.7 44.5 43.1 105.1 69.7 172 69.7 66.8 0 127.3-26.5 171.9-69.5-21.1-20.4-38.5-43.9-51.4-70.6zm-228.3-32l-30.5-9.8c14.9-46.4 12.7-93.8-.6-134l30.4-10c15 45.6 18 99.9.7 153.8zm216.3-153.4l30.4 10c-13.2 40.1-15.5 87.5-.6 134l-30.5 9.8c-17.3-54-14.3-108.3.7-153.8z\"]\n};\nvar faBasketballBall = {\n prefix: 'fas',\n iconName: 'basketball-ball',\n icon: [496, 512, [], \"f434\", \"M212.3 10.3c-43.8 6.3-86.2 24.1-122.2 53.8l77.4 77.4c27.8-35.8 43.3-81.2 44.8-131.2zM248 222L405.9 64.1c-42.4-35-93.6-53.5-145.5-56.1-1.2 63.9-21.5 122.3-58.7 167.7L248 222zM56.1 98.1c-29.7 36-47.5 78.4-53.8 122.2 50-1.5 95.5-17 131.2-44.8L56.1 98.1zm272.2 204.2c45.3-37.1 103.7-57.4 167.7-58.7-2.6-51.9-21.1-103.1-56.1-145.5L282 256l46.3 46.3zM248 290L90.1 447.9c42.4 34.9 93.6 53.5 145.5 56.1 1.3-64 21.6-122.4 58.7-167.7L248 290zm191.9 123.9c29.7-36 47.5-78.4 53.8-122.2-50.1 1.6-95.5 17.1-131.2 44.8l77.4 77.4zM167.7 209.7C122.3 246.9 63.9 267.3 0 268.4c2.6 51.9 21.1 103.1 56.1 145.5L214 256l-46.3-46.3zm116 292c43.8-6.3 86.2-24.1 122.2-53.8l-77.4-77.4c-27.7 35.7-43.2 81.2-44.8 131.2z\"]\n};\nvar faBath = {\n prefix: 'fas',\n iconName: 'bath',\n icon: [512, 512, [], \"f2cd\", \"M488 256H80V112c0-17.645 14.355-32 32-32 11.351 0 21.332 5.945 27.015 14.88-16.492 25.207-14.687 59.576 6.838 83.035-4.176 4.713-4.021 11.916.491 16.428l11.314 11.314c4.686 4.686 12.284 4.686 16.971 0l95.03-95.029c4.686-4.686 4.686-12.284 0-16.971l-11.314-11.314c-4.512-4.512-11.715-4.666-16.428-.491-17.949-16.469-42.294-21.429-64.178-15.365C163.281 45.667 139.212 32 112 32c-44.112 0-80 35.888-80 80v144h-8c-13.255 0-24 10.745-24 24v16c0 13.255 10.745 24 24 24h8v32c0 28.43 12.362 53.969 32 71.547V456c0 13.255 10.745 24 24 24h16c13.255 0 24-10.745 24-24v-8h256v8c0 13.255 10.745 24 24 24h16c13.255 0 24-10.745 24-24v-32.453c19.638-17.578 32-43.117 32-71.547v-32h8c13.255 0 24-10.745 24-24v-16c0-13.255-10.745-24-24-24z\"]\n};\nvar faBatteryEmpty = {\n prefix: 'fas',\n iconName: 'battery-empty',\n icon: [640, 512, [], \"f244\", \"M544 160v64h32v64h-32v64H64V160h480m16-64H48c-26.51 0-48 21.49-48 48v224c0 26.51 21.49 48 48 48h512c26.51 0 48-21.49 48-48v-16h8c13.255 0 24-10.745 24-24V184c0-13.255-10.745-24-24-24h-8v-16c0-26.51-21.49-48-48-48z\"]\n};\nvar faBatteryFull = {\n prefix: 'fas',\n iconName: 'battery-full',\n icon: [640, 512, [], \"f240\", \"M544 160v64h32v64h-32v64H64V160h480m16-64H48c-26.51 0-48 21.49-48 48v224c0 26.51 21.49 48 48 48h512c26.51 0 48-21.49 48-48v-16h8c13.255 0 24-10.745 24-24V184c0-13.255-10.745-24-24-24h-8v-16c0-26.51-21.49-48-48-48zm-48 96H96v128h416V192z\"]\n};\nvar faBatteryHalf = {\n prefix: 'fas',\n iconName: 'battery-half',\n icon: [640, 512, [], \"f242\", \"M544 160v64h32v64h-32v64H64V160h480m16-64H48c-26.51 0-48 21.49-48 48v224c0 26.51 21.49 48 48 48h512c26.51 0 48-21.49 48-48v-16h8c13.255 0 24-10.745 24-24V184c0-13.255-10.745-24-24-24h-8v-16c0-26.51-21.49-48-48-48zm-240 96H96v128h224V192z\"]\n};\nvar faBatteryQuarter = {\n prefix: 'fas',\n iconName: 'battery-quarter',\n icon: [640, 512, [], \"f243\", \"M544 160v64h32v64h-32v64H64V160h480m16-64H48c-26.51 0-48 21.49-48 48v224c0 26.51 21.49 48 48 48h512c26.51 0 48-21.49 48-48v-16h8c13.255 0 24-10.745 24-24V184c0-13.255-10.745-24-24-24h-8v-16c0-26.51-21.49-48-48-48zm-336 96H96v128h128V192z\"]\n};\nvar faBatteryThreeQuarters = {\n prefix: 'fas',\n iconName: 'battery-three-quarters',\n icon: [640, 512, [], \"f241\", \"M544 160v64h32v64h-32v64H64V160h480m16-64H48c-26.51 0-48 21.49-48 48v224c0 26.51 21.49 48 48 48h512c26.51 0 48-21.49 48-48v-16h8c13.255 0 24-10.745 24-24V184c0-13.255-10.745-24-24-24h-8v-16c0-26.51-21.49-48-48-48zm-144 96H96v128h320V192z\"]\n};\nvar faBed = {\n prefix: 'fas',\n iconName: 'bed',\n icon: [640, 512, [], \"f236\", \"M176 256c44.11 0 80-35.89 80-80s-35.89-80-80-80-80 35.89-80 80 35.89 80 80 80zm352-128H304c-8.84 0-16 7.16-16 16v144H64V80c0-8.84-7.16-16-16-16H16C7.16 64 0 71.16 0 80v352c0 8.84 7.16 16 16 16h32c8.84 0 16-7.16 16-16v-48h512v48c0 8.84 7.16 16 16 16h32c8.84 0 16-7.16 16-16V240c0-61.86-50.14-112-112-112z\"]\n};\nvar faBeer = {\n prefix: 'fas',\n iconName: 'beer',\n icon: [448, 512, [], \"f0fc\", \"M368 96h-48V56c0-13.255-10.745-24-24-24H24C10.745 32 0 42.745 0 56v400c0 13.255 10.745 24 24 24h272c13.255 0 24-10.745 24-24v-42.11l80.606-35.977C429.396 365.063 448 336.388 448 304.86V176c0-44.112-35.888-80-80-80zm16 208.86a16.018 16.018 0 0 1-9.479 14.611L320 343.805V160h48c8.822 0 16 7.178 16 16v128.86zM208 384c-8.836 0-16-7.164-16-16V144c0-8.836 7.164-16 16-16s16 7.164 16 16v224c0 8.836-7.164 16-16 16zm-96 0c-8.836 0-16-7.164-16-16V144c0-8.836 7.164-16 16-16s16 7.164 16 16v224c0 8.836-7.164 16-16 16z\"]\n};\nvar faBell = {\n prefix: 'fas',\n iconName: 'bell',\n icon: [448, 512, [], \"f0f3\", \"M224 512c35.32 0 63.97-28.65 63.97-64H160.03c0 35.35 28.65 64 63.97 64zm215.39-149.71c-19.32-20.76-55.47-51.99-55.47-154.29 0-77.7-54.48-139.9-127.94-155.16V32c0-17.67-14.32-32-31.98-32s-31.98 14.33-31.98 32v20.84C118.56 68.1 64.08 130.3 64.08 208c0 102.3-36.15 133.53-55.47 154.29-6 6.45-8.66 14.16-8.61 21.71.11 16.4 12.98 32 32.1 32h383.8c19.12 0 32-15.6 32.1-32 .05-7.55-2.61-15.27-8.61-21.71z\"]\n};\nvar faBellSlash = {\n prefix: 'fas',\n iconName: 'bell-slash',\n icon: [640, 512, [], \"f1f6\", \"M633.82 458.1l-90.62-70.05c.19-1.38.8-2.66.8-4.06.05-7.55-2.61-15.27-8.61-21.71-19.32-20.76-55.47-51.99-55.47-154.29 0-77.7-54.48-139.9-127.94-155.16V32c0-17.67-14.32-32-31.98-32s-31.98 14.33-31.98 32v20.84c-40.33 8.38-74.66 31.07-97.59 62.57L45.47 3.37C38.49-2.05 28.43-.8 23.01 6.18L3.37 31.45C-2.05 38.42-.8 48.47 6.18 53.9l588.35 454.73c6.98 5.43 17.03 4.17 22.46-2.81l19.64-25.27c5.42-6.97 4.17-17.02-2.81-22.45zM157.23 251.54c-8.61 67.96-36.41 93.33-52.62 110.75-6 6.45-8.66 14.16-8.61 21.71.11 16.4 12.98 32 32.1 32h241.92L157.23 251.54zM320 512c35.32 0 63.97-28.65 63.97-64H256.03c0 35.35 28.65 64 63.97 64z\"]\n};\nvar faBezierCurve = {\n prefix: 'fas',\n iconName: 'bezier-curve',\n icon: [640, 512, [], \"f55b\", \"M368 32h-96c-17.67 0-32 14.33-32 32v96c0 17.67 14.33 32 32 32h96c17.67 0 32-14.33 32-32V64c0-17.67-14.33-32-32-32zM208 88h-84.75C113.75 64.56 90.84 48 64 48 28.66 48 0 76.65 0 112s28.66 64 64 64c26.84 0 49.75-16.56 59.25-40h79.73c-55.37 32.52-95.86 87.32-109.54 152h49.4c11.3-41.61 36.77-77.21 71.04-101.56-3.7-8.08-5.88-16.99-5.88-26.44V88zm-48 232H64c-17.67 0-32 14.33-32 32v96c0 17.67 14.33 32 32 32h96c17.67 0 32-14.33 32-32v-96c0-17.67-14.33-32-32-32zM576 48c-26.84 0-49.75 16.56-59.25 40H432v72c0 9.45-2.19 18.36-5.88 26.44 34.27 24.35 59.74 59.95 71.04 101.56h49.4c-13.68-64.68-54.17-119.48-109.54-152h79.73c9.5 23.44 32.41 40 59.25 40 35.34 0 64-28.65 64-64s-28.66-64-64-64zm0 272h-96c-17.67 0-32 14.33-32 32v96c0 17.67 14.33 32 32 32h96c17.67 0 32-14.33 32-32v-96c0-17.67-14.33-32-32-32z\"]\n};\nvar faBible = {\n prefix: 'fas',\n iconName: 'bible',\n icon: [448, 512, [], \"f647\", \"M448 358.4V25.6c0-16-9.6-25.6-25.6-25.6H96C41.6 0 0 41.6 0 96v320c0 54.4 41.6 96 96 96h326.4c12.8 0 25.6-9.6 25.6-25.6v-16c0-6.4-3.2-12.8-9.6-19.2-3.2-16-3.2-60.8 0-73.6 6.4-3.2 9.6-9.6 9.6-19.2zM144 144c0-8.84 7.16-16 16-16h48V80c0-8.84 7.16-16 16-16h32c8.84 0 16 7.16 16 16v48h48c8.84 0 16 7.16 16 16v32c0 8.84-7.16 16-16 16h-48v112c0 8.84-7.16 16-16 16h-32c-8.84 0-16-7.16-16-16V192h-48c-8.84 0-16-7.16-16-16v-32zm236.8 304H96c-19.2 0-32-12.8-32-32s16-32 32-32h284.8v64z\"]\n};\nvar faBicycle = {\n prefix: 'fas',\n iconName: 'bicycle',\n icon: [640, 512, [], \"f206\", \"M512.509 192.001c-16.373-.064-32.03 2.955-46.436 8.495l-77.68-125.153A24 24 0 0 0 368.001 64h-64c-8.837 0-16 7.163-16 16v16c0 8.837 7.163 16 16 16h50.649l14.896 24H256.002v-16c0-8.837-7.163-16-16-16h-87.459c-13.441 0-24.777 10.999-24.536 24.437.232 13.044 10.876 23.563 23.995 23.563h48.726l-29.417 47.52c-13.433-4.83-27.904-7.483-42.992-7.52C58.094 191.83.412 249.012.002 319.236-.413 390.279 57.055 448 128.002 448c59.642 0 109.758-40.793 123.967-96h52.033a24 24 0 0 0 20.406-11.367L410.37 201.77l14.938 24.067c-25.455 23.448-41.385 57.081-41.307 94.437.145 68.833 57.899 127.051 126.729 127.719 70.606.685 128.181-55.803 129.255-125.996 1.086-70.941-56.526-129.72-127.476-129.996zM186.75 265.772c9.727 10.529 16.673 23.661 19.642 38.228h-43.306l23.664-38.228zM128.002 400c-44.112 0-80-35.888-80-80s35.888-80 80-80c5.869 0 11.586.653 17.099 1.859l-45.505 73.509C89.715 331.327 101.213 352 120.002 352h81.3c-12.37 28.225-40.562 48-73.3 48zm162.63-96h-35.624c-3.96-31.756-19.556-59.894-42.383-80.026L237.371 184h127.547l-74.286 120zm217.057 95.886c-41.036-2.165-74.049-35.692-75.627-76.755-.812-21.121 6.633-40.518 19.335-55.263l44.433 71.586c4.66 7.508 14.524 9.816 22.032 5.156l13.594-8.437c7.508-4.66 9.817-14.524 5.156-22.032l-44.468-71.643a79.901 79.901 0 0 1 19.858-2.497c44.112 0 80 35.888 80 80-.001 45.54-38.252 82.316-84.313 79.885z\"]\n};\nvar faBiking = {\n prefix: 'fas',\n iconName: 'biking',\n icon: [640, 512, [], \"f84a\", \"M400 96a48 48 0 1 0-48-48 48 48 0 0 0 48 48zm-4 121a31.9 31.9 0 0 0 20 7h64a32 32 0 0 0 0-64h-52.78L356 103a31.94 31.94 0 0 0-40.81.68l-112 96a32 32 0 0 0 3.08 50.92L288 305.12V416a32 32 0 0 0 64 0V288a32 32 0 0 0-14.25-26.62l-41.36-27.57 58.25-49.92zm116 39a128 128 0 1 0 128 128 128 128 0 0 0-128-128zm0 192a64 64 0 1 1 64-64 64 64 0 0 1-64 64zM128 256a128 128 0 1 0 128 128 128 128 0 0 0-128-128zm0 192a64 64 0 1 1 64-64 64 64 0 0 1-64 64z\"]\n};\nvar faBinoculars = {\n prefix: 'fas',\n iconName: 'binoculars',\n icon: [512, 512, [], \"f1e5\", \"M416 48c0-8.84-7.16-16-16-16h-64c-8.84 0-16 7.16-16 16v48h96V48zM63.91 159.99C61.4 253.84 3.46 274.22 0 404v44c0 17.67 14.33 32 32 32h96c17.67 0 32-14.33 32-32V288h32V128H95.84c-17.63 0-31.45 14.37-31.93 31.99zm384.18 0c-.48-17.62-14.3-31.99-31.93-31.99H320v160h32v160c0 17.67 14.33 32 32 32h96c17.67 0 32-14.33 32-32v-44c-3.46-129.78-61.4-150.16-63.91-244.01zM176 32h-64c-8.84 0-16 7.16-16 16v48h96V48c0-8.84-7.16-16-16-16zm48 256h64V128h-64v160z\"]\n};\nvar faBiohazard = {\n prefix: 'fas',\n iconName: 'biohazard',\n icon: [576, 512, [], \"f780\", \"M287.9 112c18.6 0 36.2 3.8 52.8 9.6 13.3-10.3 23.6-24.3 29.5-40.7-25.2-10.9-53-17-82.2-17-29.1 0-56.9 6-82.1 16.9 5.9 16.4 16.2 30.4 29.5 40.7 16.5-5.7 34-9.5 52.5-9.5zM163.6 438.7c12-11.8 20.4-26.4 24.5-42.4-32.9-26.4-54.8-65.3-58.9-109.6-8.5-2.8-17.2-4.6-26.4-4.6-7.6 0-15.2 1-22.5 3.1 4.1 62.8 35.8 118 83.3 153.5zm224.2-42.6c4.1 16 12.5 30.7 24.5 42.5 47.4-35.5 79.1-90.7 83-153.5-7.2-2-14.7-3-22.2-3-9.2 0-18 1.9-26.6 4.7-4.1 44.2-26 82.9-58.7 109.3zm113.5-205c-17.6-10.4-36.3-16.6-55.3-19.9 6-17.7 10-36.4 10-56.2 0-41-14.5-80.8-41-112.2-2.5-3-6.6-3.7-10-1.8-3.3 1.9-4.8 6-3.6 9.7 4.5 13.8 6.6 26.3 6.6 38.5 0 67.8-53.8 122.9-120 122.9S168 117 168 49.2c0-12.1 2.2-24.7 6.6-38.5 1.2-3.7-.3-7.8-3.6-9.7-3.4-1.9-7.5-1.2-10 1.8C134.6 34.2 120 74 120 115c0 19.8 3.9 38.5 10 56.2-18.9 3.3-37.7 9.5-55.3 19.9-34.6 20.5-61 53.3-74.3 92.4-1.3 3.7.2 7.7 3.5 9.8 3.3 2 7.5 1.3 10-1.6 9.4-10.8 19-19.1 29.2-25.1 57.3-33.9 130.8-13.7 163.9 45 33.1 58.7 13.4 134-43.9 167.9-10.2 6.1-22 10.4-35.8 13.4-3.7.8-6.4 4.2-6.4 8.1.1 4 2.7 7.3 6.5 8 39.7 7.8 80.6.8 115.2-19.7 18-10.6 32.9-24.5 45.3-40.1 12.4 15.6 27.3 29.5 45.3 40.1 34.6 20.5 75.5 27.5 115.2 19.7 3.8-.7 6.4-4 6.5-8 0-3.9-2.6-7.3-6.4-8.1-13.9-2.9-25.6-7.3-35.8-13.4-57.3-33.9-77-109.2-43.9-167.9s106.6-78.9 163.9-45c10.2 6.1 19.8 14.3 29.2 25.1 2.5 2.9 6.7 3.6 10 1.6s4.8-6.1 3.5-9.8c-13.1-39.1-39.5-72-74.1-92.4zm-213.4 129c-26.5 0-48-21.5-48-48s21.5-48 48-48 48 21.5 48 48-21.5 48-48 48z\"]\n};\nvar faBirthdayCake = {\n prefix: 'fas',\n iconName: 'birthday-cake',\n icon: [448, 512, [], \"f1fd\", \"M448 384c-28.02 0-31.26-32-74.5-32-43.43 0-46.825 32-74.75 32-27.695 0-31.454-32-74.75-32-42.842 0-47.218 32-74.5 32-28.148 0-31.202-32-74.75-32-43.547 0-46.653 32-74.75 32v-80c0-26.5 21.5-48 48-48h16V112h64v144h64V112h64v144h64V112h64v144h16c26.5 0 48 21.5 48 48v80zm0 128H0v-96c43.356 0 46.767-32 74.75-32 27.951 0 31.253 32 74.75 32 42.843 0 47.217-32 74.5-32 28.148 0 31.201 32 74.75 32 43.357 0 46.767-32 74.75-32 27.488 0 31.252 32 74.5 32v96zM96 96c-17.75 0-32-14.25-32-32 0-31 32-23 32-64 12 0 32 29.5 32 56s-14.25 40-32 40zm128 0c-17.75 0-32-14.25-32-32 0-31 32-23 32-64 12 0 32 29.5 32 56s-14.25 40-32 40zm128 0c-17.75 0-32-14.25-32-32 0-31 32-23 32-64 12 0 32 29.5 32 56s-14.25 40-32 40z\"]\n};\nvar faBlender = {\n prefix: 'fas',\n iconName: 'blender',\n icon: [512, 512, [], \"f517\", \"M416 384H160c-35.35 0-64 28.65-64 64v32c0 17.67 14.33 32 32 32h320c17.67 0 32-14.33 32-32v-32c0-35.35-28.65-64-64-64zm-128 96c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm40-416h166.54L512 0H48C21.49 0 0 21.49 0 48v160c0 26.51 21.49 48 48 48h103.27l8.73 96h256l17.46-64H328c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h114.18l17.46-64H328c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h140.36l17.46-64H328c-4.42 0-8-3.58-8-8V72c0-4.42 3.58-8 8-8zM64 192V64h69.82l11.64 128H64z\"]\n};\nvar faBlenderPhone = {\n prefix: 'fas',\n iconName: 'blender-phone',\n icon: [576, 512, [], \"f6b6\", \"M392 64h166.54L576 0H192v352h288l17.46-64H392c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h114.18l17.46-64H392c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h140.36l17.46-64H392c-4.42 0-8-3.58-8-8V72c0-4.42 3.58-8 8-8zM158.8 335.01l-25.78-63.26c-2.78-6.81-9.8-10.99-17.24-10.26l-45.03 4.42c-17.28-46.94-17.65-99.78 0-147.72l45.03 4.42c7.43.73 14.46-3.46 17.24-10.26l25.78-63.26c3.02-7.39.2-15.85-6.68-20.07l-39.28-24.1C98.51-3.87 80.09-.5 68.95 11.97c-92.57 103.6-92 259.55 2.1 362.49 9.87 10.8 29.12 12.48 41.65 4.8l39.41-24.18c6.89-4.22 9.7-12.67 6.69-20.07zM480 384H192c-35.35 0-64 28.65-64 64v32c0 17.67 14.33 32 32 32h352c17.67 0 32-14.33 32-32v-32c0-35.35-28.65-64-64-64zm-144 96c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32z\"]\n};\nvar faBlind = {\n prefix: 'fas',\n iconName: 'blind',\n icon: [384, 512, [], \"f29d\", \"M380.15 510.837a8 8 0 0 1-10.989-2.687l-125.33-206.427a31.923 31.923 0 0 0 12.958-9.485l126.048 207.608a8 8 0 0 1-2.687 10.991zM142.803 314.338l-32.54 89.485 36.12 88.285c6.693 16.36 25.377 24.192 41.733 17.501 16.357-6.692 24.193-25.376 17.501-41.734l-62.814-153.537zM96 88c24.301 0 44-19.699 44-44S120.301 0 96 0 52 19.699 52 44s19.699 44 44 44zm154.837 169.128l-120-152c-4.733-5.995-11.75-9.108-18.837-9.112V96H80v.026c-7.146.003-14.217 3.161-18.944 9.24L0 183.766v95.694c0 13.455 11.011 24.791 24.464 24.536C37.505 303.748 48 293.1 48 280v-79.766l16-20.571v140.698L9.927 469.055c-6.04 16.609 2.528 34.969 19.138 41.009 16.602 6.039 34.968-2.524 41.009-19.138L136 309.638V202.441l-31.406-39.816a4 4 0 1 1 6.269-4.971l102.3 129.217c9.145 11.584 24.368 11.339 33.708 3.965 10.41-8.216 12.159-23.334 3.966-33.708z\"]\n};\nvar faBlog = {\n prefix: 'fas',\n iconName: 'blog',\n icon: [512, 512, [], \"f781\", \"M172.2 226.8c-14.6-2.9-28.2 8.9-28.2 23.8V301c0 10.2 7.1 18.4 16.7 22 18.2 6.8 31.3 24.4 31.3 45 0 26.5-21.5 48-48 48s-48-21.5-48-48V120c0-13.3-10.7-24-24-24H24c-13.3 0-24 10.7-24 24v248c0 89.5 82.1 160.2 175 140.7 54.4-11.4 98.3-55.4 109.7-109.7 17.4-82.9-37-157.2-112.5-172.2zM209 0c-9.2-.5-17 6.8-17 16v31.6c0 8.5 6.6 15.5 15 15.9 129.4 7 233.4 112 240.9 241.5.5 8.4 7.5 15 15.9 15h32.1c9.2 0 16.5-7.8 16-17C503.4 139.8 372.2 8.6 209 0zm.3 96c-9.3-.7-17.3 6.7-17.3 16.1v32.1c0 8.4 6.5 15.3 14.8 15.9 76.8 6.3 138 68.2 144.9 145.2.8 8.3 7.6 14.7 15.9 14.7h32.2c9.3 0 16.8-8 16.1-17.3-8.4-110.1-96.5-198.2-206.6-206.7z\"]\n};\nvar faBold = {\n prefix: 'fas',\n iconName: 'bold',\n icon: [384, 512, [], \"f032\", \"M333.49 238a122 122 0 0 0 27-65.21C367.87 96.49 308 32 233.42 32H34a16 16 0 0 0-16 16v48a16 16 0 0 0 16 16h31.87v288H34a16 16 0 0 0-16 16v48a16 16 0 0 0 16 16h209.32c70.8 0 134.14-51.75 141-122.4 4.74-48.45-16.39-92.06-50.83-119.6zM145.66 112h87.76a48 48 0 0 1 0 96h-87.76zm87.76 288h-87.76V288h87.76a56 56 0 0 1 0 112z\"]\n};\nvar faBolt = {\n prefix: 'fas',\n iconName: 'bolt',\n icon: [320, 512, [], \"f0e7\", \"M296 160H180.6l42.6-129.8C227.2 15 215.7 0 200 0H56C44 0 33.8 8.9 32.2 20.8l-32 240C-1.7 275.2 9.5 288 24 288h118.7L96.6 482.5c-3.6 15.2 8 29.5 23.3 29.5 8.4 0 16.4-4.4 20.8-12l176-304c9.3-15.9-2.2-36-20.7-36z\"]\n};\nvar faBomb = {\n prefix: 'fas',\n iconName: 'bomb',\n icon: [512, 512, [], \"f1e2\", \"M440.5 88.5l-52 52L415 167c9.4 9.4 9.4 24.6 0 33.9l-17.4 17.4c11.8 26.1 18.4 55.1 18.4 85.6 0 114.9-93.1 208-208 208S0 418.9 0 304 93.1 96 208 96c30.5 0 59.5 6.6 85.6 18.4L311 97c9.4-9.4 24.6-9.4 33.9 0l26.5 26.5 52-52 17.1 17zM500 60h-24c-6.6 0-12 5.4-12 12s5.4 12 12 12h24c6.6 0 12-5.4 12-12s-5.4-12-12-12zM440 0c-6.6 0-12 5.4-12 12v24c0 6.6 5.4 12 12 12s12-5.4 12-12V12c0-6.6-5.4-12-12-12zm33.9 55l17-17c4.7-4.7 4.7-12.3 0-17-4.7-4.7-12.3-4.7-17 0l-17 17c-4.7 4.7-4.7 12.3 0 17 4.8 4.7 12.4 4.7 17 0zm-67.8 0c4.7 4.7 12.3 4.7 17 0 4.7-4.7 4.7-12.3 0-17l-17-17c-4.7-4.7-12.3-4.7-17 0-4.7 4.7-4.7 12.3 0 17l17 17zm67.8 34c-4.7-4.7-12.3-4.7-17 0-4.7 4.7-4.7 12.3 0 17l17 17c4.7 4.7 12.3 4.7 17 0 4.7-4.7 4.7-12.3 0-17l-17-17zM112 272c0-35.3 28.7-64 64-64 8.8 0 16-7.2 16-16s-7.2-16-16-16c-52.9 0-96 43.1-96 96 0 8.8 7.2 16 16 16s16-7.2 16-16z\"]\n};\nvar faBone = {\n prefix: 'fas',\n iconName: 'bone',\n icon: [640, 512, [], \"f5d7\", \"M598.88 244.56c25.2-12.6 41.12-38.36 41.12-66.53v-7.64C640 129.3 606.7 96 565.61 96c-32.02 0-60.44 20.49-70.57 50.86-7.68 23.03-11.6 45.14-38.11 45.14H183.06c-27.38 0-31.58-25.54-38.11-45.14C134.83 116.49 106.4 96 74.39 96 33.3 96 0 129.3 0 170.39v7.64c0 28.17 15.92 53.93 41.12 66.53 9.43 4.71 9.43 18.17 0 22.88C15.92 280.04 0 305.8 0 333.97v7.64C0 382.7 33.3 416 74.38 416c32.02 0 60.44-20.49 70.57-50.86 7.68-23.03 11.6-45.14 38.11-45.14h273.87c27.38 0 31.58 25.54 38.11 45.14C505.17 395.51 533.6 416 565.61 416c41.08 0 74.38-33.3 74.38-74.39v-7.64c0-28.18-15.92-53.93-41.12-66.53-9.42-4.71-9.42-18.17.01-22.88z\"]\n};\nvar faBong = {\n prefix: 'fas',\n iconName: 'bong',\n icon: [448, 512, [], \"f55c\", \"M302.5 512c23.18 0 44.43-12.58 56-32.66C374.69 451.26 384 418.75 384 384c0-36.12-10.08-69.81-27.44-98.62L400 241.94l9.38 9.38c6.25 6.25 16.38 6.25 22.63 0l11.3-11.32c6.25-6.25 6.25-16.38 0-22.63l-52.69-52.69c-6.25-6.25-16.38-6.25-22.63 0l-11.31 11.31c-6.25 6.25-6.25 16.38 0 22.63l9.38 9.38-39.41 39.41c-11.56-11.37-24.53-21.33-38.65-29.51V63.74l15.97-.02c8.82-.01 15.97-7.16 15.98-15.98l.04-31.72C320 7.17 312.82-.01 303.97 0L80.03.26c-8.82.01-15.97 7.16-15.98 15.98l-.04 31.73c-.01 8.85 7.17 16.02 16.02 16.01L96 63.96v153.93C38.67 251.1 0 312.97 0 384c0 34.75 9.31 67.27 25.5 95.34C37.08 499.42 58.33 512 81.5 512h221zM120.06 259.43L144 245.56V63.91l96-.11v181.76l23.94 13.87c24.81 14.37 44.12 35.73 56.56 60.57h-257c12.45-24.84 31.75-46.2 56.56-60.57z\"]\n};\nvar faBook = {\n prefix: 'fas',\n iconName: 'book',\n icon: [448, 512, [], \"f02d\", \"M448 360V24c0-13.3-10.7-24-24-24H96C43 0 0 43 0 96v320c0 53 43 96 96 96h328c13.3 0 24-10.7 24-24v-16c0-7.5-3.5-14.3-8.9-18.7-4.2-15.4-4.2-59.3 0-74.7 5.4-4.3 8.9-11.1 8.9-18.6zM128 134c0-3.3 2.7-6 6-6h212c3.3 0 6 2.7 6 6v20c0 3.3-2.7 6-6 6H134c-3.3 0-6-2.7-6-6v-20zm0 64c0-3.3 2.7-6 6-6h212c3.3 0 6 2.7 6 6v20c0 3.3-2.7 6-6 6H134c-3.3 0-6-2.7-6-6v-20zm253.4 250H96c-17.7 0-32-14.3-32-32 0-17.6 14.4-32 32-32h285.4c-1.9 17.1-1.9 46.9 0 64z\"]\n};\nvar faBookDead = {\n prefix: 'fas',\n iconName: 'book-dead',\n icon: [448, 512, [], \"f6b7\", \"M272 136c8.8 0 16-7.2 16-16s-7.2-16-16-16-16 7.2-16 16 7.2 16 16 16zm176 222.4V25.6c0-16-9.6-25.6-25.6-25.6H96C41.6 0 0 41.6 0 96v320c0 54.4 41.6 96 96 96h326.4c12.8 0 25.6-9.6 25.6-25.6v-16c0-6.4-3.2-12.8-9.6-19.2-3.2-16-3.2-60.8 0-73.6 6.4-3.2 9.6-9.6 9.6-19.2zM240 56c44.2 0 80 28.7 80 64 0 20.9-12.7 39.2-32 50.9V184c0 8.8-7.2 16-16 16h-64c-8.8 0-16-7.2-16-16v-13.1c-19.3-11.7-32-30-32-50.9 0-35.3 35.8-64 80-64zM124.8 223.3l6.3-14.7c1.7-4.1 6.4-5.9 10.5-4.2l98.3 42.1 98.4-42.1c4.1-1.7 8.8.1 10.5 4.2l6.3 14.7c1.7 4.1-.1 8.8-4.2 10.5L280.6 264l70.3 30.1c4.1 1.7 5.9 6.4 4.2 10.5l-6.3 14.7c-1.7 4.1-6.4 5.9-10.5 4.2L240 281.4l-98.3 42.2c-4.1 1.7-8.8-.1-10.5-4.2l-6.3-14.7c-1.7-4.1.1-8.8 4.2-10.5l70.4-30.1-70.5-30.3c-4.1-1.7-5.9-6.4-4.2-10.5zm256 224.7H96c-19.2 0-32-12.8-32-32s16-32 32-32h284.8zM208 136c8.8 0 16-7.2 16-16s-7.2-16-16-16-16 7.2-16 16 7.2 16 16 16z\"]\n};\nvar faBookMedical = {\n prefix: 'fas',\n iconName: 'book-medical',\n icon: [448, 512, [], \"f7e6\", \"M448 358.4V25.6c0-16-9.6-25.6-25.6-25.6H96C41.6 0 0 41.6 0 96v320c0 54.4 41.6 96 96 96h326.4c12.8 0 25.6-9.6 25.6-25.6v-16q0-9.6-9.6-19.2c-3.2-16-3.2-60.8 0-73.6q9.6-4.8 9.6-19.2zM144 168a8 8 0 0 1 8-8h56v-56a8 8 0 0 1 8-8h48a8 8 0 0 1 8 8v56h56a8 8 0 0 1 8 8v48a8 8 0 0 1-8 8h-56v56a8 8 0 0 1-8 8h-48a8 8 0 0 1-8-8v-56h-56a8 8 0 0 1-8-8zm236.8 280H96c-19.2 0-32-12.8-32-32s16-32 32-32h284.8z\"]\n};\nvar faBookOpen = {\n prefix: 'fas',\n iconName: 'book-open',\n icon: [576, 512, [], \"f518\", \"M542.22 32.05c-54.8 3.11-163.72 14.43-230.96 55.59-4.64 2.84-7.27 7.89-7.27 13.17v363.87c0 11.55 12.63 18.85 23.28 13.49 69.18-34.82 169.23-44.32 218.7-46.92 16.89-.89 30.02-14.43 30.02-30.66V62.75c.01-17.71-15.35-31.74-33.77-30.7zM264.73 87.64C197.5 46.48 88.58 35.17 33.78 32.05 15.36 31.01 0 45.04 0 62.75V400.6c0 16.24 13.13 29.78 30.02 30.66 49.49 2.6 149.59 12.11 218.77 46.95 10.62 5.35 23.21-1.94 23.21-13.46V100.63c0-5.29-2.62-10.14-7.27-12.99z\"]\n};\nvar faBookReader = {\n prefix: 'fas',\n iconName: 'book-reader',\n icon: [512, 512, [], \"f5da\", \"M352 96c0-53.02-42.98-96-96-96s-96 42.98-96 96 42.98 96 96 96 96-42.98 96-96zM233.59 241.1c-59.33-36.32-155.43-46.3-203.79-49.05C13.55 191.13 0 203.51 0 219.14v222.8c0 14.33 11.59 26.28 26.49 27.05 43.66 2.29 131.99 10.68 193.04 41.43 9.37 4.72 20.48-1.71 20.48-11.87V252.56c-.01-4.67-2.32-8.95-6.42-11.46zm248.61-49.05c-48.35 2.74-144.46 12.73-203.78 49.05-4.1 2.51-6.41 6.96-6.41 11.63v245.79c0 10.19 11.14 16.63 20.54 11.9 61.04-30.72 149.32-39.11 192.97-41.4 14.9-.78 26.49-12.73 26.49-27.06V219.14c-.01-15.63-13.56-28.01-29.81-27.09z\"]\n};\nvar faBookmark = {\n prefix: 'fas',\n iconName: 'bookmark',\n icon: [384, 512, [], \"f02e\", \"M0 512V48C0 21.49 21.49 0 48 0h288c26.51 0 48 21.49 48 48v464L192 400 0 512z\"]\n};\nvar faBorderAll = {\n prefix: 'fas',\n iconName: 'border-all',\n icon: [448, 512, [], \"f84c\", \"M416 32H32A32 32 0 0 0 0 64v384a32 32 0 0 0 32 32h384a32 32 0 0 0 32-32V64a32 32 0 0 0-32-32zm-32 64v128H256V96zm-192 0v128H64V96zM64 416V288h128v128zm192 0V288h128v128z\"]\n};\nvar faBorderNone = {\n prefix: 'fas',\n iconName: 'border-none',\n icon: [448, 512, [], \"f850\", \"M240 224h-32a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm96 0h-32a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm96 0h-32a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm-288 0h-32a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm96 192h-32a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm96 0h-32a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm96 0h-32a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm0-96h-32a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm0-192h-32a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zM240 320h-32a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm0-192h-32a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm-96 288h-32a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm96-384h-32a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16V48a16 16 0 0 0-16-16zm96 0h-32a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16V48a16 16 0 0 0-16-16zm96 0h-32a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16V48a16 16 0 0 0-16-16zM48 224H16a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm0 192H16a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm0-96H16a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm0-192H16a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm0-96H16A16 16 0 0 0 0 48v32a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16V48a16 16 0 0 0-16-16zm96 0h-32a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16V48a16 16 0 0 0-16-16z\"]\n};\nvar faBorderStyle = {\n prefix: 'fas',\n iconName: 'border-style',\n icon: [448, 512, [], \"f853\", \"M240 416h-32a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm-96 0h-32a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm192 0h-32a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm96-192h-32a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm0 96h-32a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm0 96h-32a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm0-288h-32a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm0-96H32A32 32 0 0 0 0 64v400a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16V96h368a16 16 0 0 0 16-16V48a16 16 0 0 0-16-16z\"]\n};\nvar faBowlingBall = {\n prefix: 'fas',\n iconName: 'bowling-ball',\n icon: [496, 512, [], \"f436\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zM120 192c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32zm64-96c0-17.7 14.3-32 32-32s32 14.3 32 32-14.3 32-32 32-32-14.3-32-32zm48 144c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32z\"]\n};\nvar faBox = {\n prefix: 'fas',\n iconName: 'box',\n icon: [512, 512, [], \"f466\", \"M509.5 184.6L458.9 32.8C452.4 13.2 434.1 0 413.4 0H272v192h238.7c-.4-2.5-.4-5-1.2-7.4zM240 0H98.6c-20.7 0-39 13.2-45.5 32.8L2.5 184.6c-.8 2.4-.8 4.9-1.2 7.4H240V0zM0 224v240c0 26.5 21.5 48 48 48h416c26.5 0 48-21.5 48-48V224H0z\"]\n};\nvar faBoxOpen = {\n prefix: 'fas',\n iconName: 'box-open',\n icon: [640, 512, [], \"f49e\", \"M425.7 256c-16.9 0-32.8-9-41.4-23.4L320 126l-64.2 106.6c-8.7 14.5-24.6 23.5-41.5 23.5-4.5 0-9-.6-13.3-1.9L64 215v178c0 14.7 10 27.5 24.2 31l216.2 54.1c10.2 2.5 20.9 2.5 31 0L551.8 424c14.2-3.6 24.2-16.4 24.2-31V215l-137 39.1c-4.3 1.3-8.8 1.9-13.3 1.9zm212.6-112.2L586.8 41c-3.1-6.2-9.8-9.8-16.7-8.9L320 64l91.7 152.1c3.8 6.3 11.4 9.3 18.5 7.3l197.9-56.5c9.9-2.9 14.7-13.9 10.2-23.1zM53.2 41L1.7 143.8c-4.6 9.2.3 20.2 10.1 23l197.9 56.5c7.1 2 14.7-1 18.5-7.3L320 64 69.8 32.1c-6.9-.8-13.5 2.7-16.6 8.9z\"]\n};\nvar faBoxes = {\n prefix: 'fas',\n iconName: 'boxes',\n icon: [576, 512, [], \"f468\", \"M560 288h-80v96l-32-21.3-32 21.3v-96h-80c-8.8 0-16 7.2-16 16v192c0 8.8 7.2 16 16 16h224c8.8 0 16-7.2 16-16V304c0-8.8-7.2-16-16-16zm-384-64h224c8.8 0 16-7.2 16-16V16c0-8.8-7.2-16-16-16h-80v96l-32-21.3L256 96V0h-80c-8.8 0-16 7.2-16 16v192c0 8.8 7.2 16 16 16zm64 64h-80v96l-32-21.3L96 384v-96H16c-8.8 0-16 7.2-16 16v192c0 8.8 7.2 16 16 16h224c8.8 0 16-7.2 16-16V304c0-8.8-7.2-16-16-16z\"]\n};\nvar faBraille = {\n prefix: 'fas',\n iconName: 'braille',\n icon: [640, 512, [], \"f2a1\", \"M128 256c0 35.346-28.654 64-64 64S0 291.346 0 256s28.654-64 64-64 64 28.654 64 64zM64 384c-17.673 0-32 14.327-32 32s14.327 32 32 32 32-14.327 32-32-14.327-32-32-32zm0-352C28.654 32 0 60.654 0 96s28.654 64 64 64 64-28.654 64-64-28.654-64-64-64zm160 192c-17.673 0-32 14.327-32 32s14.327 32 32 32 32-14.327 32-32-14.327-32-32-32zm0 160c-17.673 0-32 14.327-32 32s14.327 32 32 32 32-14.327 32-32-14.327-32-32-32zm0-352c-35.346 0-64 28.654-64 64s28.654 64 64 64 64-28.654 64-64-28.654-64-64-64zm224 192c-17.673 0-32 14.327-32 32s14.327 32 32 32 32-14.327 32-32-14.327-32-32-32zm0 160c-17.673 0-32 14.327-32 32s14.327 32 32 32 32-14.327 32-32-14.327-32-32-32zm0-352c-35.346 0-64 28.654-64 64s28.654 64 64 64 64-28.654 64-64-28.654-64-64-64zm160 192c-17.673 0-32 14.327-32 32s14.327 32 32 32 32-14.327 32-32-14.327-32-32-32zm0 160c-17.673 0-32 14.327-32 32s14.327 32 32 32 32-14.327 32-32-14.327-32-32-32zm0-320c-17.673 0-32 14.327-32 32s14.327 32 32 32 32-14.327 32-32-14.327-32-32-32z\"]\n};\nvar faBrain = {\n prefix: 'fas',\n iconName: 'brain',\n icon: [576, 512, [], \"f5dc\", \"M208 0c-29.9 0-54.7 20.5-61.8 48.2-.8 0-1.4-.2-2.2-.2-35.3 0-64 28.7-64 64 0 4.8.6 9.5 1.7 14C52.5 138 32 166.6 32 200c0 12.6 3.2 24.3 8.3 34.9C16.3 248.7 0 274.3 0 304c0 33.3 20.4 61.9 49.4 73.9-.9 4.6-1.4 9.3-1.4 14.1 0 39.8 32.2 72 72 72 4.1 0 8.1-.5 12-1.2 9.6 28.5 36.2 49.2 68 49.2 39.8 0 72-32.2 72-72V64c0-35.3-28.7-64-64-64zm368 304c0-29.7-16.3-55.3-40.3-69.1 5.2-10.6 8.3-22.3 8.3-34.9 0-33.4-20.5-62-49.7-74 1-4.5 1.7-9.2 1.7-14 0-35.3-28.7-64-64-64-.8 0-1.5.2-2.2.2C422.7 20.5 397.9 0 368 0c-35.3 0-64 28.6-64 64v376c0 39.8 32.2 72 72 72 31.8 0 58.4-20.7 68-49.2 3.9.7 7.9 1.2 12 1.2 39.8 0 72-32.2 72-72 0-4.8-.5-9.5-1.4-14.1 29-12 49.4-40.6 49.4-73.9z\"]\n};\nvar faBreadSlice = {\n prefix: 'fas',\n iconName: 'bread-slice',\n icon: [576, 512, [], \"f7ec\", \"M288 0C108 0 0 93.4 0 169.14 0 199.44 24.24 224 64 224v256c0 17.67 16.12 32 36 32h376c19.88 0 36-14.33 36-32V224c39.76 0 64-24.56 64-54.86C576 93.4 468 0 288 0z\"]\n};\nvar faBriefcase = {\n prefix: 'fas',\n iconName: 'briefcase',\n icon: [512, 512, [], \"f0b1\", \"M320 336c0 8.84-7.16 16-16 16h-96c-8.84 0-16-7.16-16-16v-48H0v144c0 25.6 22.4 48 48 48h416c25.6 0 48-22.4 48-48V288H320v48zm144-208h-80V80c0-25.6-22.4-48-48-48H176c-25.6 0-48 22.4-48 48v48H48c-25.6 0-48 22.4-48 48v80h512v-80c0-25.6-22.4-48-48-48zm-144 0H192V96h128v32z\"]\n};\nvar faBriefcaseMedical = {\n prefix: 'fas',\n iconName: 'briefcase-medical',\n icon: [512, 512, [], \"f469\", \"M464 128h-80V80c0-26.5-21.5-48-48-48H176c-26.5 0-48 21.5-48 48v48H48c-26.5 0-48 21.5-48 48v288c0 26.5 21.5 48 48 48h416c26.5 0 48-21.5 48-48V176c0-26.5-21.5-48-48-48zM192 96h128v32H192V96zm160 248c0 4.4-3.6 8-8 8h-56v56c0 4.4-3.6 8-8 8h-48c-4.4 0-8-3.6-8-8v-56h-56c-4.4 0-8-3.6-8-8v-48c0-4.4 3.6-8 8-8h56v-56c0-4.4 3.6-8 8-8h48c4.4 0 8 3.6 8 8v56h56c4.4 0 8 3.6 8 8v48z\"]\n};\nvar faBroadcastTower = {\n prefix: 'fas',\n iconName: 'broadcast-tower',\n icon: [640, 512, [], \"f519\", \"M150.94 192h33.73c11.01 0 18.61-10.83 14.86-21.18-4.93-13.58-7.55-27.98-7.55-42.82s2.62-29.24 7.55-42.82C203.29 74.83 195.68 64 184.67 64h-33.73c-7.01 0-13.46 4.49-15.41 11.23C130.64 92.21 128 109.88 128 128c0 18.12 2.64 35.79 7.54 52.76 1.94 6.74 8.39 11.24 15.4 11.24zM89.92 23.34C95.56 12.72 87.97 0 75.96 0H40.63c-6.27 0-12.14 3.59-14.74 9.31C9.4 45.54 0 85.65 0 128c0 24.75 3.12 68.33 26.69 118.86 2.62 5.63 8.42 9.14 14.61 9.14h34.84c12.02 0 19.61-12.74 13.95-23.37-49.78-93.32-16.71-178.15-.17-209.29zM614.06 9.29C611.46 3.58 605.6 0 599.33 0h-35.42c-11.98 0-19.66 12.66-14.02 23.25 18.27 34.29 48.42 119.42.28 209.23-5.72 10.68 1.8 23.52 13.91 23.52h35.23c6.27 0 12.13-3.58 14.73-9.29C630.57 210.48 640 170.36 640 128s-9.42-82.48-25.94-118.71zM489.06 64h-33.73c-11.01 0-18.61 10.83-14.86 21.18 4.93 13.58 7.55 27.98 7.55 42.82s-2.62 29.24-7.55 42.82c-3.76 10.35 3.85 21.18 14.86 21.18h33.73c7.02 0 13.46-4.49 15.41-11.24 4.9-16.97 7.53-34.64 7.53-52.76 0-18.12-2.64-35.79-7.54-52.76-1.94-6.75-8.39-11.24-15.4-11.24zm-116.3 100.12c7.05-10.29 11.2-22.71 11.2-36.12 0-35.35-28.63-64-63.96-64-35.32 0-63.96 28.65-63.96 64 0 13.41 4.15 25.83 11.2 36.12l-130.5 313.41c-3.4 8.15.46 17.52 8.61 20.92l29.51 12.31c8.15 3.4 17.52-.46 20.91-8.61L244.96 384h150.07l49.2 118.15c3.4 8.16 12.76 12.01 20.91 8.61l29.51-12.31c8.15-3.4 12-12.77 8.61-20.92l-130.5-313.41zM271.62 320L320 203.81 368.38 320h-96.76z\"]\n};\nvar faBroom = {\n prefix: 'fas',\n iconName: 'broom',\n icon: [640, 512, [], \"f51a\", \"M256.47 216.77l86.73 109.18s-16.6 102.36-76.57 150.12C206.66 523.85 0 510.19 0 510.19s3.8-23.14 11-55.43l94.62-112.17c3.97-4.7-.87-11.62-6.65-9.5l-60.4 22.09c14.44-41.66 32.72-80.04 54.6-97.47 59.97-47.76 163.3-40.94 163.3-40.94zM636.53 31.03l-19.86-25c-5.49-6.9-15.52-8.05-22.41-2.56l-232.48 177.8-34.14-42.97c-5.09-6.41-15.14-5.21-18.59 2.21l-25.33 54.55 86.73 109.18 58.8-12.45c8-1.69 11.42-11.2 6.34-17.6l-34.09-42.92 232.48-177.8c6.89-5.48 8.04-15.53 2.55-22.44z\"]\n};\nvar faBrush = {\n prefix: 'fas',\n iconName: 'brush',\n icon: [384, 512, [], \"f55d\", \"M352 0H32C14.33 0 0 14.33 0 32v224h384V32c0-17.67-14.33-32-32-32zM0 320c0 35.35 28.66 64 64 64h64v64c0 35.35 28.66 64 64 64s64-28.65 64-64v-64h64c35.34 0 64-28.65 64-64v-32H0v32zm192 104c13.25 0 24 10.74 24 24 0 13.25-10.75 24-24 24s-24-10.75-24-24c0-13.26 10.75-24 24-24z\"]\n};\nvar faBug = {\n prefix: 'fas',\n iconName: 'bug',\n icon: [512, 512, [], \"f188\", \"M511.988 288.9c-.478 17.43-15.217 31.1-32.653 31.1H424v16c0 21.864-4.882 42.584-13.6 61.145l60.228 60.228c12.496 12.497 12.496 32.758 0 45.255-12.498 12.497-32.759 12.496-45.256 0l-54.736-54.736C345.886 467.965 314.351 480 280 480V236c0-6.627-5.373-12-12-12h-24c-6.627 0-12 5.373-12 12v244c-34.351 0-65.886-12.035-90.636-32.108l-54.736 54.736c-12.498 12.497-32.759 12.496-45.256 0-12.496-12.497-12.496-32.758 0-45.255l60.228-60.228C92.882 378.584 88 357.864 88 336v-16H32.666C15.23 320 .491 306.33.013 288.9-.484 270.816 14.028 256 32 256h56v-58.745l-46.628-46.628c-12.496-12.497-12.496-32.758 0-45.255 12.498-12.497 32.758-12.497 45.256 0L141.255 160h229.489l54.627-54.627c12.498-12.497 32.758-12.497 45.256 0 12.496 12.497 12.496 32.758 0 45.255L424 197.255V256h56c17.972 0 32.484 14.816 31.988 32.9zM257 0c-61.856 0-112 50.144-112 112h224C369 50.144 318.856 0 257 0z\"]\n};\nvar faBuilding = {\n prefix: 'fas',\n iconName: 'building',\n icon: [448, 512, [], \"f1ad\", \"M436 480h-20V24c0-13.255-10.745-24-24-24H56C42.745 0 32 10.745 32 24v456H12c-6.627 0-12 5.373-12 12v20h448v-20c0-6.627-5.373-12-12-12zM128 76c0-6.627 5.373-12 12-12h40c6.627 0 12 5.373 12 12v40c0 6.627-5.373 12-12 12h-40c-6.627 0-12-5.373-12-12V76zm0 96c0-6.627 5.373-12 12-12h40c6.627 0 12 5.373 12 12v40c0 6.627-5.373 12-12 12h-40c-6.627 0-12-5.373-12-12v-40zm52 148h-40c-6.627 0-12-5.373-12-12v-40c0-6.627 5.373-12 12-12h40c6.627 0 12 5.373 12 12v40c0 6.627-5.373 12-12 12zm76 160h-64v-84c0-6.627 5.373-12 12-12h40c6.627 0 12 5.373 12 12v84zm64-172c0 6.627-5.373 12-12 12h-40c-6.627 0-12-5.373-12-12v-40c0-6.627 5.373-12 12-12h40c6.627 0 12 5.373 12 12v40zm0-96c0 6.627-5.373 12-12 12h-40c-6.627 0-12-5.373-12-12v-40c0-6.627 5.373-12 12-12h40c6.627 0 12 5.373 12 12v40zm0-96c0 6.627-5.373 12-12 12h-40c-6.627 0-12-5.373-12-12V76c0-6.627 5.373-12 12-12h40c6.627 0 12 5.373 12 12v40z\"]\n};\nvar faBullhorn = {\n prefix: 'fas',\n iconName: 'bullhorn',\n icon: [576, 512, [], \"f0a1\", \"M576 240c0-23.63-12.95-44.04-32-55.12V32.01C544 23.26 537.02 0 512 0c-7.12 0-14.19 2.38-19.98 7.02l-85.03 68.03C364.28 109.19 310.66 128 256 128H64c-35.35 0-64 28.65-64 64v96c0 35.35 28.65 64 64 64h33.7c-1.39 10.48-2.18 21.14-2.18 32 0 39.77 9.26 77.35 25.56 110.94 5.19 10.69 16.52 17.06 28.4 17.06h74.28c26.05 0 41.69-29.84 25.9-50.56-16.4-21.52-26.15-48.36-26.15-77.44 0-11.11 1.62-21.79 4.41-32H256c54.66 0 108.28 18.81 150.98 52.95l85.03 68.03a32.023 32.023 0 0 0 19.98 7.02c24.92 0 32-22.78 32-32V295.13C563.05 284.04 576 263.63 576 240zm-96 141.42l-33.05-26.44C392.95 311.78 325.12 288 256 288v-96c69.12 0 136.95-23.78 190.95-66.98L480 98.58v282.84z\"]\n};\nvar faBullseye = {\n prefix: 'fas',\n iconName: 'bullseye',\n icon: [496, 512, [], \"f140\", \"M248 8C111.03 8 0 119.03 0 256s111.03 248 248 248 248-111.03 248-248S384.97 8 248 8zm0 432c-101.69 0-184-82.29-184-184 0-101.69 82.29-184 184-184 101.69 0 184 82.29 184 184 0 101.69-82.29 184-184 184zm0-312c-70.69 0-128 57.31-128 128s57.31 128 128 128 128-57.31 128-128-57.31-128-128-128zm0 192c-35.29 0-64-28.71-64-64s28.71-64 64-64 64 28.71 64 64-28.71 64-64 64z\"]\n};\nvar faBurn = {\n prefix: 'fas',\n iconName: 'burn',\n icon: [384, 512, [], \"f46a\", \"M192 0C79.7 101.3 0 220.9 0 300.5 0 425 79 512 192 512s192-87 192-211.5c0-79.9-80.2-199.6-192-300.5zm0 448c-56.5 0-96-39-96-94.8 0-13.5 4.6-61.5 96-161.2 91.4 99.7 96 147.7 96 161.2 0 55.8-39.5 94.8-96 94.8z\"]\n};\nvar faBus = {\n prefix: 'fas',\n iconName: 'bus',\n icon: [512, 512, [], \"f207\", \"M488 128h-8V80c0-44.8-99.2-80-224-80S32 35.2 32 80v48h-8c-13.25 0-24 10.74-24 24v80c0 13.25 10.75 24 24 24h8v160c0 17.67 14.33 32 32 32v32c0 17.67 14.33 32 32 32h32c17.67 0 32-14.33 32-32v-32h192v32c0 17.67 14.33 32 32 32h32c17.67 0 32-14.33 32-32v-32h6.4c16 0 25.6-12.8 25.6-25.6V256h8c13.25 0 24-10.75 24-24v-80c0-13.26-10.75-24-24-24zM112 400c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm16-112c-17.67 0-32-14.33-32-32V128c0-17.67 14.33-32 32-32h256c17.67 0 32 14.33 32 32v128c0 17.67-14.33 32-32 32H128zm272 112c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32z\"]\n};\nvar faBusAlt = {\n prefix: 'fas',\n iconName: 'bus-alt',\n icon: [512, 512, [], \"f55e\", \"M488 128h-8V80c0-44.8-99.2-80-224-80S32 35.2 32 80v48h-8c-13.25 0-24 10.74-24 24v80c0 13.25 10.75 24 24 24h8v160c0 17.67 14.33 32 32 32v32c0 17.67 14.33 32 32 32h32c17.67 0 32-14.33 32-32v-32h192v32c0 17.67 14.33 32 32 32h32c17.67 0 32-14.33 32-32v-32h6.4c16 0 25.6-12.8 25.6-25.6V256h8c13.25 0 24-10.75 24-24v-80c0-13.26-10.75-24-24-24zM160 72c0-4.42 3.58-8 8-8h176c4.42 0 8 3.58 8 8v16c0 4.42-3.58 8-8 8H168c-4.42 0-8-3.58-8-8V72zm-48 328c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm128-112H128c-17.67 0-32-14.33-32-32v-96c0-17.67 14.33-32 32-32h112v160zm32 0V128h112c17.67 0 32 14.33 32 32v96c0 17.67-14.33 32-32 32H272zm128 112c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32z\"]\n};\nvar faBusinessTime = {\n prefix: 'fas',\n iconName: 'business-time',\n icon: [640, 512, [], \"f64a\", \"M496 224c-79.59 0-144 64.41-144 144s64.41 144 144 144 144-64.41 144-144-64.41-144-144-144zm64 150.29c0 5.34-4.37 9.71-9.71 9.71h-60.57c-5.34 0-9.71-4.37-9.71-9.71v-76.57c0-5.34 4.37-9.71 9.71-9.71h12.57c5.34 0 9.71 4.37 9.71 9.71V352h38.29c5.34 0 9.71 4.37 9.71 9.71v12.58zM496 192c5.4 0 10.72.33 16 .81V144c0-25.6-22.4-48-48-48h-80V48c0-25.6-22.4-48-48-48H176c-25.6 0-48 22.4-48 48v48H48c-25.6 0-48 22.4-48 48v80h395.12c28.6-20.09 63.35-32 100.88-32zM320 96H192V64h128v32zm6.82 224H208c-8.84 0-16-7.16-16-16v-48H0v144c0 25.6 22.4 48 48 48h291.43C327.1 423.96 320 396.82 320 368c0-16.66 2.48-32.72 6.82-48z\"]\n};\nvar faCalculator = {\n prefix: 'fas',\n iconName: 'calculator',\n icon: [448, 512, [], \"f1ec\", \"M400 0H48C22.4 0 0 22.4 0 48v416c0 25.6 22.4 48 48 48h352c25.6 0 48-22.4 48-48V48c0-25.6-22.4-48-48-48zM128 435.2c0 6.4-6.4 12.8-12.8 12.8H76.8c-6.4 0-12.8-6.4-12.8-12.8v-38.4c0-6.4 6.4-12.8 12.8-12.8h38.4c6.4 0 12.8 6.4 12.8 12.8v38.4zm0-128c0 6.4-6.4 12.8-12.8 12.8H76.8c-6.4 0-12.8-6.4-12.8-12.8v-38.4c0-6.4 6.4-12.8 12.8-12.8h38.4c6.4 0 12.8 6.4 12.8 12.8v38.4zm128 128c0 6.4-6.4 12.8-12.8 12.8h-38.4c-6.4 0-12.8-6.4-12.8-12.8v-38.4c0-6.4 6.4-12.8 12.8-12.8h38.4c6.4 0 12.8 6.4 12.8 12.8v38.4zm0-128c0 6.4-6.4 12.8-12.8 12.8h-38.4c-6.4 0-12.8-6.4-12.8-12.8v-38.4c0-6.4 6.4-12.8 12.8-12.8h38.4c6.4 0 12.8 6.4 12.8 12.8v38.4zm128 128c0 6.4-6.4 12.8-12.8 12.8h-38.4c-6.4 0-12.8-6.4-12.8-12.8V268.8c0-6.4 6.4-12.8 12.8-12.8h38.4c6.4 0 12.8 6.4 12.8 12.8v166.4zm0-256c0 6.4-6.4 12.8-12.8 12.8H76.8c-6.4 0-12.8-6.4-12.8-12.8V76.8C64 70.4 70.4 64 76.8 64h294.4c6.4 0 12.8 6.4 12.8 12.8v102.4z\"]\n};\nvar faCalendar = {\n prefix: 'fas',\n iconName: 'calendar',\n icon: [448, 512, [], \"f133\", \"M12 192h424c6.6 0 12 5.4 12 12v260c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V204c0-6.6 5.4-12 12-12zm436-44v-36c0-26.5-21.5-48-48-48h-48V12c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v52H160V12c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v52H48C21.5 64 0 85.5 0 112v36c0 6.6 5.4 12 12 12h424c6.6 0 12-5.4 12-12z\"]\n};\nvar faCalendarAlt = {\n prefix: 'fas',\n iconName: 'calendar-alt',\n icon: [448, 512, [], \"f073\", \"M0 464c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V192H0v272zm320-196c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v40c0 6.6-5.4 12-12 12h-40c-6.6 0-12-5.4-12-12v-40zm0 128c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v40c0 6.6-5.4 12-12 12h-40c-6.6 0-12-5.4-12-12v-40zM192 268c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v40c0 6.6-5.4 12-12 12h-40c-6.6 0-12-5.4-12-12v-40zm0 128c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v40c0 6.6-5.4 12-12 12h-40c-6.6 0-12-5.4-12-12v-40zM64 268c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v40c0 6.6-5.4 12-12 12H76c-6.6 0-12-5.4-12-12v-40zm0 128c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v40c0 6.6-5.4 12-12 12H76c-6.6 0-12-5.4-12-12v-40zM400 64h-48V16c0-8.8-7.2-16-16-16h-32c-8.8 0-16 7.2-16 16v48H160V16c0-8.8-7.2-16-16-16h-32c-8.8 0-16 7.2-16 16v48H48C21.5 64 0 85.5 0 112v48h448v-48c0-26.5-21.5-48-48-48z\"]\n};\nvar faCalendarCheck = {\n prefix: 'fas',\n iconName: 'calendar-check',\n icon: [448, 512, [], \"f274\", \"M436 160H12c-6.627 0-12-5.373-12-12v-36c0-26.51 21.49-48 48-48h48V12c0-6.627 5.373-12 12-12h40c6.627 0 12 5.373 12 12v52h128V12c0-6.627 5.373-12 12-12h40c6.627 0 12 5.373 12 12v52h48c26.51 0 48 21.49 48 48v36c0 6.627-5.373 12-12 12zM12 192h424c6.627 0 12 5.373 12 12v260c0 26.51-21.49 48-48 48H48c-26.51 0-48-21.49-48-48V204c0-6.627 5.373-12 12-12zm333.296 95.947l-28.169-28.398c-4.667-4.705-12.265-4.736-16.97-.068L194.12 364.665l-45.98-46.352c-4.667-4.705-12.266-4.736-16.971-.068l-28.397 28.17c-4.705 4.667-4.736 12.265-.068 16.97l82.601 83.269c4.667 4.705 12.265 4.736 16.97.068l142.953-141.805c4.705-4.667 4.736-12.265.068-16.97z\"]\n};\nvar faCalendarDay = {\n prefix: 'fas',\n iconName: 'calendar-day',\n icon: [448, 512, [], \"f783\", \"M0 464c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V192H0v272zm64-192c0-8.8 7.2-16 16-16h96c8.8 0 16 7.2 16 16v96c0 8.8-7.2 16-16 16H80c-8.8 0-16-7.2-16-16v-96zM400 64h-48V16c0-8.8-7.2-16-16-16h-32c-8.8 0-16 7.2-16 16v48H160V16c0-8.8-7.2-16-16-16h-32c-8.8 0-16 7.2-16 16v48H48C21.5 64 0 85.5 0 112v48h448v-48c0-26.5-21.5-48-48-48z\"]\n};\nvar faCalendarMinus = {\n prefix: 'fas',\n iconName: 'calendar-minus',\n icon: [448, 512, [], \"f272\", \"M436 160H12c-6.6 0-12-5.4-12-12v-36c0-26.5 21.5-48 48-48h48V12c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v52h128V12c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v52h48c26.5 0 48 21.5 48 48v36c0 6.6-5.4 12-12 12zM12 192h424c6.6 0 12 5.4 12 12v260c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V204c0-6.6 5.4-12 12-12zm304 192c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12H132c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h184z\"]\n};\nvar faCalendarPlus = {\n prefix: 'fas',\n iconName: 'calendar-plus',\n icon: [448, 512, [], \"f271\", \"M436 160H12c-6.6 0-12-5.4-12-12v-36c0-26.5 21.5-48 48-48h48V12c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v52h128V12c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v52h48c26.5 0 48 21.5 48 48v36c0 6.6-5.4 12-12 12zM12 192h424c6.6 0 12 5.4 12 12v260c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V204c0-6.6 5.4-12 12-12zm316 140c0-6.6-5.4-12-12-12h-60v-60c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v60h-60c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h60v60c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12v-60h60c6.6 0 12-5.4 12-12v-40z\"]\n};\nvar faCalendarTimes = {\n prefix: 'fas',\n iconName: 'calendar-times',\n icon: [448, 512, [], \"f273\", \"M436 160H12c-6.6 0-12-5.4-12-12v-36c0-26.5 21.5-48 48-48h48V12c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v52h128V12c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v52h48c26.5 0 48 21.5 48 48v36c0 6.6-5.4 12-12 12zM12 192h424c6.6 0 12 5.4 12 12v260c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V204c0-6.6 5.4-12 12-12zm257.3 160l48.1-48.1c4.7-4.7 4.7-12.3 0-17l-28.3-28.3c-4.7-4.7-12.3-4.7-17 0L224 306.7l-48.1-48.1c-4.7-4.7-12.3-4.7-17 0l-28.3 28.3c-4.7 4.7-4.7 12.3 0 17l48.1 48.1-48.1 48.1c-4.7 4.7-4.7 12.3 0 17l28.3 28.3c4.7 4.7 12.3 4.7 17 0l48.1-48.1 48.1 48.1c4.7 4.7 12.3 4.7 17 0l28.3-28.3c4.7-4.7 4.7-12.3 0-17L269.3 352z\"]\n};\nvar faCalendarWeek = {\n prefix: 'fas',\n iconName: 'calendar-week',\n icon: [448, 512, [], \"f784\", \"M0 464c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V192H0v272zm64-192c0-8.8 7.2-16 16-16h288c8.8 0 16 7.2 16 16v64c0 8.8-7.2 16-16 16H80c-8.8 0-16-7.2-16-16v-64zM400 64h-48V16c0-8.8-7.2-16-16-16h-32c-8.8 0-16 7.2-16 16v48H160V16c0-8.8-7.2-16-16-16h-32c-8.8 0-16 7.2-16 16v48H48C21.5 64 0 85.5 0 112v48h448v-48c0-26.5-21.5-48-48-48z\"]\n};\nvar faCamera = {\n prefix: 'fas',\n iconName: 'camera',\n icon: [512, 512, [], \"f030\", \"M512 144v288c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V144c0-26.5 21.5-48 48-48h88l12.3-32.9c7-18.7 24.9-31.1 44.9-31.1h125.5c20 0 37.9 12.4 44.9 31.1L376 96h88c26.5 0 48 21.5 48 48zM376 288c0-66.2-53.8-120-120-120s-120 53.8-120 120 53.8 120 120 120 120-53.8 120-120zm-32 0c0 48.5-39.5 88-88 88s-88-39.5-88-88 39.5-88 88-88 88 39.5 88 88z\"]\n};\nvar faCameraRetro = {\n prefix: 'fas',\n iconName: 'camera-retro',\n icon: [512, 512, [], \"f083\", \"M48 32C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h416c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48H48zm0 32h106c3.3 0 6 2.7 6 6v20c0 3.3-2.7 6-6 6H38c-3.3 0-6-2.7-6-6V80c0-8.8 7.2-16 16-16zm426 96H38c-3.3 0-6-2.7-6-6v-36c0-3.3 2.7-6 6-6h138l30.2-45.3c1.1-1.7 3-2.7 5-2.7H464c8.8 0 16 7.2 16 16v74c0 3.3-2.7 6-6 6zM256 424c-66.2 0-120-53.8-120-120s53.8-120 120-120 120 53.8 120 120-53.8 120-120 120zm0-208c-48.5 0-88 39.5-88 88s39.5 88 88 88 88-39.5 88-88-39.5-88-88-88zm-48 104c-8.8 0-16-7.2-16-16 0-35.3 28.7-64 64-64 8.8 0 16 7.2 16 16s-7.2 16-16 16c-17.6 0-32 14.4-32 32 0 8.8-7.2 16-16 16z\"]\n};\nvar faCampground = {\n prefix: 'fas',\n iconName: 'campground',\n icon: [640, 512, [], \"f6bb\", \"M624 448h-24.68L359.54 117.75l53.41-73.55c5.19-7.15 3.61-17.16-3.54-22.35l-25.9-18.79c-7.15-5.19-17.15-3.61-22.35 3.55L320 63.3 278.83 6.6c-5.19-7.15-15.2-8.74-22.35-3.55l-25.88 18.8c-7.15 5.19-8.74 15.2-3.54 22.35l53.41 73.55L40.68 448H16c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h608c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16zM320 288l116.36 160H203.64L320 288z\"]\n};\nvar faCandyCane = {\n prefix: 'fas',\n iconName: 'candy-cane',\n icon: [512, 512, [], \"f786\", \"M497.5 92C469.6 33.1 411.8 0 352.4 0c-27.9 0-56.2 7.3-81.8 22.6L243.1 39c-15.2 9.1-20.1 28.7-11 43.9l32.8 54.9c6 10 16.6 15.6 27.5 15.6 5.6 0 11.2-1.5 16.4-4.5l27.5-16.4c5.1-3.1 10.8-4.5 16.4-4.5 10.9 0 21.5 5.6 27.5 15.6 9.1 15.1 4.1 34.8-11 43.9L15.6 397.6c-15.2 9.1-20.1 28.7-11 43.9l32.8 54.9c6 10 16.6 15.6 27.5 15.6 5.6 0 11.2-1.5 16.4-4.5L428.6 301c71.7-42.9 104.6-133.5 68.9-209zm-177.7 13l-2.5 1.5L296.8 45c9.7-4.7 19.8-8.1 30.3-10.2l20.6 61.8c-9.8.8-19.4 3.3-27.9 8.4zM145.9 431.8l-60.5-38.5 30.8-18.3 60.5 38.5-30.8 18.3zm107.5-63.9l-60.5-38.5 30.8-18.3 60.5 38.5-30.8 18.3zM364.3 302l-60.5-38.5 30.8-18.3 60.5 38.5-30.8 18.3zm20.4-197.3l46-46c8.4 6.5 16 14.1 22.6 22.6L407.6 127c-5.7-9.3-13.7-16.9-22.9-22.3zm82.1 107.8l-59.5-19.8c3.2-5.3 5.8-10.9 7.4-17.1 1.1-4.5 1.7-9.1 1.8-13.6l60.4 20.1c-2.1 10.4-5.5 20.6-10.1 30.4z\"]\n};\nvar faCannabis = {\n prefix: 'fas',\n iconName: 'cannabis',\n icon: [512, 512, [], \"f55f\", \"M503.47 360.25c-1.56-.82-32.39-16.89-76.78-25.81 64.25-75.12 84.05-161.67 84.93-165.64 1.18-5.33-.44-10.9-4.3-14.77-3.03-3.04-7.12-4.7-11.32-4.7-1.14 0-2.29.12-3.44.38-3.88.85-86.54 19.59-160.58 79.76.01-1.46.01-2.93.01-4.4 0-118.79-59.98-213.72-62.53-217.7A15.973 15.973 0 0 0 256 0c-5.45 0-10.53 2.78-13.47 7.37-2.55 3.98-62.53 98.91-62.53 217.7 0 1.47.01 2.94.01 4.4-74.03-60.16-156.69-78.9-160.58-79.76-1.14-.25-2.29-.38-3.44-.38-4.2 0-8.29 1.66-11.32 4.7A15.986 15.986 0 0 0 .38 168.8c.88 3.97 20.68 90.52 84.93 165.64-44.39 8.92-75.21 24.99-76.78 25.81a16.003 16.003 0 0 0-.02 28.29c2.45 1.29 60.76 31.72 133.49 31.72 6.14 0 11.96-.1 17.5-.31-11.37 22.23-16.52 38.31-16.81 39.22-1.8 5.68-.29 11.89 3.91 16.11a16.019 16.019 0 0 0 16.1 3.99c1.83-.57 37.72-11.99 77.3-39.29V504c0 4.42 3.58 8 8 8h16c4.42 0 8-3.58 8-8v-64.01c39.58 27.3 75.47 38.71 77.3 39.29a16.019 16.019 0 0 0 16.1-3.99c4.2-4.22 5.71-10.43 3.91-16.11-.29-.91-5.45-16.99-16.81-39.22 5.54.21 11.37.31 17.5.31 72.72 0 131.04-30.43 133.49-31.72 5.24-2.78 8.52-8.22 8.51-14.15-.01-5.94-3.29-11.39-8.53-14.15z\"]\n};\nvar faCapsules = {\n prefix: 'fas',\n iconName: 'capsules',\n icon: [576, 512, [], \"f46b\", \"M555.3 300.1L424.2 112.8C401.9 81 366.4 64 330.4 64c-22.6 0-45.5 6.7-65.5 20.7-19.7 13.8-33.7 32.8-41.5 53.8C220.5 79.2 172 32 112 32 50.1 32 0 82.1 0 144v224c0 61.9 50.1 112 112 112s112-50.1 112-112V218.9c3.3 8.6 7.3 17.1 12.8 25L368 431.2c22.2 31.8 57.7 48.8 93.8 48.8 22.7 0 45.5-6.7 65.5-20.7 51.7-36.2 64.2-107.5 28-159.2zM160 256H64V144c0-26.5 21.5-48 48-48s48 21.5 48 48v112zm194.8 44.9l-65.6-93.7c-7.7-11-10.7-24.4-8.3-37.6 2.3-13.2 9.7-24.8 20.7-32.5 8.5-6 18.5-9.1 28.8-9.1 16.5 0 31.9 8 41.3 21.5l65.6 93.7-82.5 57.7z\"]\n};\nvar faCar = {\n prefix: 'fas',\n iconName: 'car',\n icon: [512, 512, [], \"f1b9\", \"M499.99 176h-59.87l-16.64-41.6C406.38 91.63 365.57 64 319.5 64h-127c-46.06 0-86.88 27.63-103.99 70.4L71.87 176H12.01C4.2 176-1.53 183.34.37 190.91l6 24C7.7 220.25 12.5 224 18.01 224h20.07C24.65 235.73 16 252.78 16 272v48c0 16.12 6.16 30.67 16 41.93V416c0 17.67 14.33 32 32 32h32c17.67 0 32-14.33 32-32v-32h256v32c0 17.67 14.33 32 32 32h32c17.67 0 32-14.33 32-32v-54.07c9.84-11.25 16-25.8 16-41.93v-48c0-19.22-8.65-36.27-22.07-48H494c5.51 0 10.31-3.75 11.64-9.09l6-24c1.89-7.57-3.84-14.91-11.65-14.91zm-352.06-17.83c7.29-18.22 24.94-30.17 44.57-30.17h127c19.63 0 37.28 11.95 44.57 30.17L384 208H128l19.93-49.83zM96 319.8c-19.2 0-32-12.76-32-31.9S76.8 256 96 256s48 28.71 48 47.85-28.8 15.95-48 15.95zm320 0c-19.2 0-48 3.19-48-15.95S396.8 256 416 256s32 12.76 32 31.9-12.8 31.9-32 31.9z\"]\n};\nvar faCarAlt = {\n prefix: 'fas',\n iconName: 'car-alt',\n icon: [480, 512, [], \"f5de\", \"M438.66 212.33l-11.24-28.1-19.93-49.83C390.38 91.63 349.57 64 303.5 64h-127c-46.06 0-86.88 27.63-103.99 70.4l-19.93 49.83-11.24 28.1C17.22 221.5 0 244.66 0 272v48c0 16.12 6.16 30.67 16 41.93V416c0 17.67 14.33 32 32 32h32c17.67 0 32-14.33 32-32v-32h256v32c0 17.67 14.33 32 32 32h32c17.67 0 32-14.33 32-32v-54.07c9.84-11.25 16-25.8 16-41.93v-48c0-27.34-17.22-50.5-41.34-59.67zm-306.73-54.16c7.29-18.22 24.94-30.17 44.57-30.17h127c19.63 0 37.28 11.95 44.57 30.17L368 208H112l19.93-49.83zM80 319.8c-19.2 0-32-12.76-32-31.9S60.8 256 80 256s48 28.71 48 47.85-28.8 15.95-48 15.95zm320 0c-19.2 0-48 3.19-48-15.95S380.8 256 400 256s32 12.76 32 31.9-12.8 31.9-32 31.9z\"]\n};\nvar faCarBattery = {\n prefix: 'fas',\n iconName: 'car-battery',\n icon: [512, 512, [], \"f5df\", \"M480 128h-32V80c0-8.84-7.16-16-16-16h-96c-8.84 0-16 7.16-16 16v48H192V80c0-8.84-7.16-16-16-16H80c-8.84 0-16 7.16-16 16v48H32c-17.67 0-32 14.33-32 32v256c0 17.67 14.33 32 32 32h448c17.67 0 32-14.33 32-32V160c0-17.67-14.33-32-32-32zM192 264c0 4.42-3.58 8-8 8H72c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h112c4.42 0 8 3.58 8 8v16zm256 0c0 4.42-3.58 8-8 8h-40v40c0 4.42-3.58 8-8 8h-16c-4.42 0-8-3.58-8-8v-40h-40c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h40v-40c0-4.42 3.58-8 8-8h16c4.42 0 8 3.58 8 8v40h40c4.42 0 8 3.58 8 8v16z\"]\n};\nvar faCarCrash = {\n prefix: 'fas',\n iconName: 'car-crash',\n icon: [640, 512, [], \"f5e1\", \"M143.25 220.81l-12.42 46.37c-3.01 11.25-3.63 22.89-2.41 34.39l-35.2 28.98c-6.57 5.41-16.31-.43-14.62-8.77l15.44-76.68c1.06-5.26-2.66-10.28-8-10.79l-77.86-7.55c-8.47-.82-11.23-11.83-4.14-16.54l65.15-43.3c4.46-2.97 5.38-9.15 1.98-13.29L21.46 93.22c-5.41-6.57.43-16.3 8.78-14.62l76.68 15.44c5.26 1.06 10.28-2.66 10.8-8l7.55-77.86c.82-8.48 11.83-11.23 16.55-4.14l43.3 65.14c2.97 4.46 9.15 5.38 13.29 1.98l60.4-49.71c6.57-5.41 16.3.43 14.62 8.77L262.1 86.38c-2.71 3.05-5.43 6.09-7.91 9.4l-32.15 42.97-10.71 14.32c-32.73 8.76-59.18 34.53-68.08 67.74zm494.57 132.51l-12.42 46.36c-3.13 11.68-9.38 21.61-17.55 29.36a66.876 66.876 0 0 1-8.76 7l-13.99 52.23c-1.14 4.27-3.1 8.1-5.65 11.38-7.67 9.84-20.74 14.68-33.54 11.25L515 502.62c-17.07-4.57-27.2-22.12-22.63-39.19l8.28-30.91-247.28-66.26-8.28 30.91c-4.57 17.07-22.12 27.2-39.19 22.63l-30.91-8.28c-12.8-3.43-21.7-14.16-23.42-26.51-.57-4.12-.35-8.42.79-12.68l13.99-52.23a66.62 66.62 0 0 1-4.09-10.45c-3.2-10.79-3.65-22.52-.52-34.2l12.42-46.37c5.31-19.8 19.36-34.83 36.89-42.21a64.336 64.336 0 0 1 18.49-4.72l18.13-24.23 32.15-42.97c3.45-4.61 7.19-8.9 11.2-12.84 8-7.89 17.03-14.44 26.74-19.51 4.86-2.54 9.89-4.71 15.05-6.49 10.33-3.58 21.19-5.63 32.24-6.04 11.05-.41 22.31.82 33.43 3.8l122.68 32.87c11.12 2.98 21.48 7.54 30.85 13.43a111.11 111.11 0 0 1 34.69 34.5c8.82 13.88 14.64 29.84 16.68 46.99l6.36 53.29 3.59 30.05a64.49 64.49 0 0 1 22.74 29.93c4.39 11.88 5.29 25.19 1.75 38.39zM255.58 234.34c-18.55-4.97-34.21 4.04-39.17 22.53-4.96 18.49 4.11 34.12 22.65 39.09 18.55 4.97 45.54 15.51 50.49-2.98 4.96-18.49-15.43-53.67-33.97-58.64zm290.61 28.17l-6.36-53.29c-.58-4.87-1.89-9.53-3.82-13.86-5.8-12.99-17.2-23.01-31.42-26.82l-122.68-32.87a48.008 48.008 0 0 0-50.86 17.61l-32.15 42.97 172 46.08 75.29 20.18zm18.49 54.65c-18.55-4.97-53.8 15.31-58.75 33.79-4.95 18.49 23.69 22.86 42.24 27.83 18.55 4.97 34.21-4.04 39.17-22.53 4.95-18.48-4.11-34.12-22.66-39.09z\"]\n};\nvar faCarSide = {\n prefix: 'fas',\n iconName: 'car-side',\n icon: [640, 512, [], \"f5e4\", \"M544 192h-16L419.22 56.02A64.025 64.025 0 0 0 369.24 32H155.33c-26.17 0-49.7 15.93-59.42 40.23L48 194.26C20.44 201.4 0 226.21 0 256v112c0 8.84 7.16 16 16 16h48c0 53.02 42.98 96 96 96s96-42.98 96-96h128c0 53.02 42.98 96 96 96s96-42.98 96-96h48c8.84 0 16-7.16 16-16v-80c0-53.02-42.98-96-96-96zM160 432c-26.47 0-48-21.53-48-48s21.53-48 48-48 48 21.53 48 48-21.53 48-48 48zm72-240H116.93l38.4-96H232v96zm48 0V96h89.24l76.8 96H280zm200 240c-26.47 0-48-21.53-48-48s21.53-48 48-48 48 21.53 48 48-21.53 48-48 48z\"]\n};\nvar faCaretDown = {\n prefix: 'fas',\n iconName: 'caret-down',\n icon: [320, 512, [], \"f0d7\", \"M31.3 192h257.3c17.8 0 26.7 21.5 14.1 34.1L174.1 354.8c-7.8 7.8-20.5 7.8-28.3 0L17.2 226.1C4.6 213.5 13.5 192 31.3 192z\"]\n};\nvar faCaretLeft = {\n prefix: 'fas',\n iconName: 'caret-left',\n icon: [192, 512, [], \"f0d9\", \"M192 127.338v257.324c0 17.818-21.543 26.741-34.142 14.142L29.196 270.142c-7.81-7.81-7.81-20.474 0-28.284l128.662-128.662c12.599-12.6 34.142-3.676 34.142 14.142z\"]\n};\nvar faCaretRight = {\n prefix: 'fas',\n iconName: 'caret-right',\n icon: [192, 512, [], \"f0da\", \"M0 384.662V127.338c0-17.818 21.543-26.741 34.142-14.142l128.662 128.662c7.81 7.81 7.81 20.474 0 28.284L34.142 398.804C21.543 411.404 0 402.48 0 384.662z\"]\n};\nvar faCaretSquareDown = {\n prefix: 'fas',\n iconName: 'caret-square-down',\n icon: [448, 512, [], \"f150\", \"M448 80v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V80c0-26.5 21.5-48 48-48h352c26.5 0 48 21.5 48 48zM92.5 220.5l123 123c4.7 4.7 12.3 4.7 17 0l123-123c7.6-7.6 2.2-20.5-8.5-20.5H101c-10.7 0-16.1 12.9-8.5 20.5z\"]\n};\nvar faCaretSquareLeft = {\n prefix: 'fas',\n iconName: 'caret-square-left',\n icon: [448, 512, [], \"f191\", \"M400 480H48c-26.51 0-48-21.49-48-48V80c0-26.51 21.49-48 48-48h352c26.51 0 48 21.49 48 48v352c0 26.51-21.49 48-48 48zM259.515 124.485l-123.03 123.03c-4.686 4.686-4.686 12.284 0 16.971l123.029 123.029c7.56 7.56 20.485 2.206 20.485-8.485V132.971c.001-10.691-12.925-16.045-20.484-8.486z\"]\n};\nvar faCaretSquareRight = {\n prefix: 'fas',\n iconName: 'caret-square-right',\n icon: [448, 512, [], \"f152\", \"M48 32h352c26.51 0 48 21.49 48 48v352c0 26.51-21.49 48-48 48H48c-26.51 0-48-21.49-48-48V80c0-26.51 21.49-48 48-48zm140.485 355.515l123.029-123.029c4.686-4.686 4.686-12.284 0-16.971l-123.029-123.03c-7.56-7.56-20.485-2.206-20.485 8.485v246.059c0 10.691 12.926 16.045 20.485 8.486z\"]\n};\nvar faCaretSquareUp = {\n prefix: 'fas',\n iconName: 'caret-square-up',\n icon: [448, 512, [], \"f151\", \"M0 432V80c0-26.51 21.49-48 48-48h352c26.51 0 48 21.49 48 48v352c0 26.51-21.49 48-48 48H48c-26.51 0-48-21.49-48-48zm355.515-140.485l-123.03-123.03c-4.686-4.686-12.284-4.686-16.971 0L92.485 291.515c-7.56 7.56-2.206 20.485 8.485 20.485h246.059c10.691 0 16.045-12.926 8.486-20.485z\"]\n};\nvar faCaretUp = {\n prefix: 'fas',\n iconName: 'caret-up',\n icon: [320, 512, [], \"f0d8\", \"M288.662 352H31.338c-17.818 0-26.741-21.543-14.142-34.142l128.662-128.662c7.81-7.81 20.474-7.81 28.284 0l128.662 128.662c12.6 12.599 3.676 34.142-14.142 34.142z\"]\n};\nvar faCarrot = {\n prefix: 'fas',\n iconName: 'carrot',\n icon: [512, 512, [], \"f787\", \"M298.2 156.6c-52.7-25.7-114.5-10.5-150.2 32.8l55.2 55.2c6.3 6.3 6.3 16.4 0 22.6-3.1 3.1-7.2 4.7-11.3 4.7s-8.2-1.6-11.3-4.7L130.4 217 2.3 479.7c-2.9 6-3.1 13.3 0 19.7 5.4 11.1 18.9 15.7 30 10.3l133.6-65.2-49.2-49.2c-6.3-6.2-6.3-16.4 0-22.6 6.3-6.2 16.4-6.2 22.6 0l57 57 102-49.8c24-11.7 44.5-31.3 57.1-57.1 30.1-61.7 4.5-136.1-57.2-166.2zm92.1-34.9C409.8 81 399.7 32.9 360 0c-50.3 41.7-52.5 107.5-7.9 151.9l8 8c44.4 44.6 110.3 42.4 151.9-7.9-32.9-39.7-81-49.8-121.7-30.3z\"]\n};\nvar faCartArrowDown = {\n prefix: 'fas',\n iconName: 'cart-arrow-down',\n icon: [576, 512, [], \"f218\", \"M504.717 320H211.572l6.545 32h268.418c15.401 0 26.816 14.301 23.403 29.319l-5.517 24.276C523.112 414.668 536 433.828 536 456c0 31.202-25.519 56.444-56.824 55.994-29.823-.429-54.35-24.631-55.155-54.447-.44-16.287 6.085-31.049 16.803-41.548H231.176C241.553 426.165 248 440.326 248 456c0 31.813-26.528 57.431-58.67 55.938-28.54-1.325-51.751-24.385-53.251-52.917-1.158-22.034 10.436-41.455 28.051-51.586L93.883 64H24C10.745 64 0 53.255 0 40V24C0 10.745 10.745 0 24 0h102.529c11.401 0 21.228 8.021 23.513 19.19L159.208 64H551.99c15.401 0 26.816 14.301 23.403 29.319l-47.273 208C525.637 312.246 515.923 320 504.717 320zM403.029 192H360v-60c0-6.627-5.373-12-12-12h-24c-6.627 0-12 5.373-12 12v60h-43.029c-10.691 0-16.045 12.926-8.485 20.485l67.029 67.029c4.686 4.686 12.284 4.686 16.971 0l67.029-67.029c7.559-7.559 2.205-20.485-8.486-20.485z\"]\n};\nvar faCartPlus = {\n prefix: 'fas',\n iconName: 'cart-plus',\n icon: [576, 512, [], \"f217\", \"M504.717 320H211.572l6.545 32h268.418c15.401 0 26.816 14.301 23.403 29.319l-5.517 24.276C523.112 414.668 536 433.828 536 456c0 31.202-25.519 56.444-56.824 55.994-29.823-.429-54.35-24.631-55.155-54.447-.44-16.287 6.085-31.049 16.803-41.548H231.176C241.553 426.165 248 440.326 248 456c0 31.813-26.528 57.431-58.67 55.938-28.54-1.325-51.751-24.385-53.251-52.917-1.158-22.034 10.436-41.455 28.051-51.586L93.883 64H24C10.745 64 0 53.255 0 40V24C0 10.745 10.745 0 24 0h102.529c11.401 0 21.228 8.021 23.513 19.19L159.208 64H551.99c15.401 0 26.816 14.301 23.403 29.319l-47.273 208C525.637 312.246 515.923 320 504.717 320zM408 168h-48v-40c0-8.837-7.163-16-16-16h-16c-8.837 0-16 7.163-16 16v40h-48c-8.837 0-16 7.163-16 16v16c0 8.837 7.163 16 16 16h48v40c0 8.837 7.163 16 16 16h16c8.837 0 16-7.163 16-16v-40h48c8.837 0 16-7.163 16-16v-16c0-8.837-7.163-16-16-16z\"]\n};\nvar faCashRegister = {\n prefix: 'fas',\n iconName: 'cash-register',\n icon: [512, 512, [], \"f788\", \"M511.1 378.8l-26.7-160c-2.6-15.4-15.9-26.7-31.6-26.7H208v-64h96c8.8 0 16-7.2 16-16V16c0-8.8-7.2-16-16-16H48c-8.8 0-16 7.2-16 16v96c0 8.8 7.2 16 16 16h96v64H59.1c-15.6 0-29 11.3-31.6 26.7L.8 378.7c-.6 3.5-.9 7-.9 10.5V480c0 17.7 14.3 32 32 32h448c17.7 0 32-14.3 32-32v-90.7c.1-3.5-.2-7-.8-10.5zM280 248c0-8.8 7.2-16 16-16h16c8.8 0 16 7.2 16 16v16c0 8.8-7.2 16-16 16h-16c-8.8 0-16-7.2-16-16v-16zm-32 64h16c8.8 0 16 7.2 16 16v16c0 8.8-7.2 16-16 16h-16c-8.8 0-16-7.2-16-16v-16c0-8.8 7.2-16 16-16zm-32-80c8.8 0 16 7.2 16 16v16c0 8.8-7.2 16-16 16h-16c-8.8 0-16-7.2-16-16v-16c0-8.8 7.2-16 16-16h16zM80 80V48h192v32H80zm40 200h-16c-8.8 0-16-7.2-16-16v-16c0-8.8 7.2-16 16-16h16c8.8 0 16 7.2 16 16v16c0 8.8-7.2 16-16 16zm16 64v-16c0-8.8 7.2-16 16-16h16c8.8 0 16 7.2 16 16v16c0 8.8-7.2 16-16 16h-16c-8.8 0-16-7.2-16-16zm216 112c0 4.4-3.6 8-8 8H168c-4.4 0-8-3.6-8-8v-16c0-4.4 3.6-8 8-8h176c4.4 0 8 3.6 8 8v16zm24-112c0 8.8-7.2 16-16 16h-16c-8.8 0-16-7.2-16-16v-16c0-8.8 7.2-16 16-16h16c8.8 0 16 7.2 16 16v16zm48-80c0 8.8-7.2 16-16 16h-16c-8.8 0-16-7.2-16-16v-16c0-8.8 7.2-16 16-16h16c8.8 0 16 7.2 16 16v16z\"]\n};\nvar faCat = {\n prefix: 'fas',\n iconName: 'cat',\n icon: [512, 512, [], \"f6be\", \"M290.59 192c-20.18 0-106.82 1.98-162.59 85.95V192c0-52.94-43.06-96-96-96-17.67 0-32 14.33-32 32s14.33 32 32 32c17.64 0 32 14.36 32 32v256c0 35.3 28.7 64 64 64h176c8.84 0 16-7.16 16-16v-16c0-17.67-14.33-32-32-32h-32l128-96v144c0 8.84 7.16 16 16 16h32c8.84 0 16-7.16 16-16V289.86c-10.29 2.67-20.89 4.54-32 4.54-61.81 0-113.52-44.05-125.41-102.4zM448 96h-64l-64-64v134.4c0 53.02 42.98 96 96 96s96-42.98 96-96V32l-64 64zm-72 80c-8.84 0-16-7.16-16-16s7.16-16 16-16 16 7.16 16 16-7.16 16-16 16zm80 0c-8.84 0-16-7.16-16-16s7.16-16 16-16 16 7.16 16 16-7.16 16-16 16z\"]\n};\nvar faCertificate = {\n prefix: 'fas',\n iconName: 'certificate',\n icon: [512, 512, [], \"f0a3\", \"M458.622 255.92l45.985-45.005c13.708-12.977 7.316-36.039-10.664-40.339l-62.65-15.99 17.661-62.015c4.991-17.838-11.829-34.663-29.661-29.671l-61.994 17.667-15.984-62.671C337.085.197 313.765-6.276 300.99 7.228L256 53.57 211.011 7.229c-12.63-13.351-36.047-7.234-40.325 10.668l-15.984 62.671-61.995-17.667C74.87 57.907 58.056 74.738 63.046 92.572l17.661 62.015-62.65 15.99C.069 174.878-6.31 197.944 7.392 210.915l45.985 45.005-45.985 45.004c-13.708 12.977-7.316 36.039 10.664 40.339l62.65 15.99-17.661 62.015c-4.991 17.838 11.829 34.663 29.661 29.671l61.994-17.667 15.984 62.671c4.439 18.575 27.696 24.018 40.325 10.668L256 458.61l44.989 46.001c12.5 13.488 35.987 7.486 40.325-10.668l15.984-62.671 61.994 17.667c17.836 4.994 34.651-11.837 29.661-29.671l-17.661-62.015 62.65-15.99c17.987-4.302 24.366-27.367 10.664-40.339l-45.984-45.004z\"]\n};\nvar faChair = {\n prefix: 'fas',\n iconName: 'chair',\n icon: [448, 512, [], \"f6c0\", \"M112 128c0-29.5 16.2-55 40-68.9V256h48V48h48v208h48V59.1c23.8 13.9 40 39.4 40 68.9v128h48V128C384 57.3 326.7 0 256 0h-64C121.3 0 64 57.3 64 128v128h48zm334.3 213.9l-10.7-32c-4.4-13.1-16.6-21.9-30.4-21.9H42.7c-13.8 0-26 8.8-30.4 21.9l-10.7 32C-5.2 362.6 10.2 384 32 384v112c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16V384h256v112c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16V384c21.8 0 37.2-21.4 30.3-42.1z\"]\n};\nvar faChalkboard = {\n prefix: 'fas',\n iconName: 'chalkboard',\n icon: [640, 512, [], \"f51b\", \"M96 64h448v352h64V40c0-22.06-17.94-40-40-40H72C49.94 0 32 17.94 32 40v376h64V64zm528 384H480v-64H288v64H16c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h608c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16z\"]\n};\nvar faChalkboardTeacher = {\n prefix: 'fas',\n iconName: 'chalkboard-teacher',\n icon: [640, 512, [], \"f51c\", \"M208 352c-2.39 0-4.78.35-7.06 1.09C187.98 357.3 174.35 360 160 360c-14.35 0-27.98-2.7-40.95-6.91-2.28-.74-4.66-1.09-7.05-1.09C49.94 352-.33 402.48 0 464.62.14 490.88 21.73 512 48 512h224c26.27 0 47.86-21.12 48-47.38.33-62.14-49.94-112.62-112-112.62zm-48-32c53.02 0 96-42.98 96-96s-42.98-96-96-96-96 42.98-96 96 42.98 96 96 96zM592 0H208c-26.47 0-48 22.25-48 49.59V96c23.42 0 45.1 6.78 64 17.8V64h352v288h-64v-64H384v64h-76.24c19.1 16.69 33.12 38.73 39.69 64H592c26.47 0 48-22.25 48-49.59V49.59C640 22.25 618.47 0 592 0z\"]\n};\nvar faChargingStation = {\n prefix: 'fas',\n iconName: 'charging-station',\n icon: [576, 512, [], \"f5e7\", \"M336 448H16c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h320c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16zm208-320V80c0-8.84-7.16-16-16-16s-16 7.16-16 16v48h-32V80c0-8.84-7.16-16-16-16s-16 7.16-16 16v48h-16c-8.84 0-16 7.16-16 16v32c0 35.76 23.62 65.69 56 75.93v118.49c0 13.95-9.5 26.92-23.26 29.19C431.22 402.5 416 388.99 416 372v-28c0-48.6-39.4-88-88-88h-8V64c0-35.35-28.65-64-64-64H96C60.65 0 32 28.65 32 64v352h288V304h8c22.09 0 40 17.91 40 40v24.61c0 39.67 28.92 75.16 68.41 79.01C481.71 452.05 520 416.41 520 372V251.93c32.38-10.24 56-40.17 56-75.93v-32c0-8.84-7.16-16-16-16h-16zm-283.91 47.76l-93.7 139c-2.2 3.33-6.21 5.24-10.39 5.24-7.67 0-13.47-6.28-11.67-12.92L167.35 224H108c-7.25 0-12.85-5.59-11.89-11.89l16-107C112.9 99.9 117.98 96 124 96h68c7.88 0 13.62 6.54 11.6 13.21L192 160h57.7c9.24 0 15.01 8.78 10.39 15.76z\"]\n};\nvar faChartArea = {\n prefix: 'fas',\n iconName: 'chart-area',\n icon: [512, 512, [], \"f1fe\", \"M500 384c6.6 0 12 5.4 12 12v40c0 6.6-5.4 12-12 12H12c-6.6 0-12-5.4-12-12V76c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v308h436zM372.7 159.5L288 216l-85.3-113.7c-5.1-6.8-15.5-6.3-19.9 1L96 248v104h384l-89.9-187.8c-3.2-6.5-11.4-8.7-17.4-4.7z\"]\n};\nvar faChartBar = {\n prefix: 'fas',\n iconName: 'chart-bar',\n icon: [512, 512, [], \"f080\", \"M332.8 320h38.4c6.4 0 12.8-6.4 12.8-12.8V172.8c0-6.4-6.4-12.8-12.8-12.8h-38.4c-6.4 0-12.8 6.4-12.8 12.8v134.4c0 6.4 6.4 12.8 12.8 12.8zm96 0h38.4c6.4 0 12.8-6.4 12.8-12.8V76.8c0-6.4-6.4-12.8-12.8-12.8h-38.4c-6.4 0-12.8 6.4-12.8 12.8v230.4c0 6.4 6.4 12.8 12.8 12.8zm-288 0h38.4c6.4 0 12.8-6.4 12.8-12.8v-70.4c0-6.4-6.4-12.8-12.8-12.8h-38.4c-6.4 0-12.8 6.4-12.8 12.8v70.4c0 6.4 6.4 12.8 12.8 12.8zm96 0h38.4c6.4 0 12.8-6.4 12.8-12.8V108.8c0-6.4-6.4-12.8-12.8-12.8h-38.4c-6.4 0-12.8 6.4-12.8 12.8v198.4c0 6.4 6.4 12.8 12.8 12.8zM496 384H64V80c0-8.84-7.16-16-16-16H16C7.16 64 0 71.16 0 80v336c0 17.67 14.33 32 32 32h464c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16z\"]\n};\nvar faChartLine = {\n prefix: 'fas',\n iconName: 'chart-line',\n icon: [512, 512, [], \"f201\", \"M496 384H64V80c0-8.84-7.16-16-16-16H16C7.16 64 0 71.16 0 80v336c0 17.67 14.33 32 32 32h464c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16zM464 96H345.94c-21.38 0-32.09 25.85-16.97 40.97l32.4 32.4L288 242.75l-73.37-73.37c-12.5-12.5-32.76-12.5-45.25 0l-68.69 68.69c-6.25 6.25-6.25 16.38 0 22.63l22.62 22.62c6.25 6.25 16.38 6.25 22.63 0L192 237.25l73.37 73.37c12.5 12.5 32.76 12.5 45.25 0l96-96 32.4 32.4c15.12 15.12 40.97 4.41 40.97-16.97V112c.01-8.84-7.15-16-15.99-16z\"]\n};\nvar faChartPie = {\n prefix: 'fas',\n iconName: 'chart-pie',\n icon: [544, 512, [], \"f200\", \"M527.79 288H290.5l158.03 158.03c6.04 6.04 15.98 6.53 22.19.68 38.7-36.46 65.32-85.61 73.13-140.86 1.34-9.46-6.51-17.85-16.06-17.85zm-15.83-64.8C503.72 103.74 408.26 8.28 288.8.04 279.68-.59 272 7.1 272 16.24V240h223.77c9.14 0 16.82-7.68 16.19-16.8zM224 288V50.71c0-9.55-8.39-17.4-17.84-16.06C86.99 51.49-4.1 155.6.14 280.37 4.5 408.51 114.83 513.59 243.03 511.98c50.4-.63 96.97-16.87 135.26-44.03 7.9-5.6 8.42-17.23 1.57-24.08L224 288z\"]\n};\nvar faCheck = {\n prefix: 'fas',\n iconName: 'check',\n icon: [512, 512, [], \"f00c\", \"M173.898 439.404l-166.4-166.4c-9.997-9.997-9.997-26.206 0-36.204l36.203-36.204c9.997-9.998 26.207-9.998 36.204 0L192 312.69 432.095 72.596c9.997-9.997 26.207-9.997 36.204 0l36.203 36.204c9.997 9.997 9.997 26.206 0 36.204l-294.4 294.401c-9.998 9.997-26.207 9.997-36.204-.001z\"]\n};\nvar faCheckCircle = {\n prefix: 'fas',\n iconName: 'check-circle',\n icon: [512, 512, [], \"f058\", \"M504 256c0 136.967-111.033 248-248 248S8 392.967 8 256 119.033 8 256 8s248 111.033 248 248zM227.314 387.314l184-184c6.248-6.248 6.248-16.379 0-22.627l-22.627-22.627c-6.248-6.249-16.379-6.249-22.628 0L216 308.118l-70.059-70.059c-6.248-6.248-16.379-6.248-22.628 0l-22.627 22.627c-6.248 6.248-6.248 16.379 0 22.627l104 104c6.249 6.249 16.379 6.249 22.628.001z\"]\n};\nvar faCheckDouble = {\n prefix: 'fas',\n iconName: 'check-double',\n icon: [512, 512, [], \"f560\", \"M505 174.8l-39.6-39.6c-9.4-9.4-24.6-9.4-33.9 0L192 374.7 80.6 263.2c-9.4-9.4-24.6-9.4-33.9 0L7 302.9c-9.4 9.4-9.4 24.6 0 34L175 505c9.4 9.4 24.6 9.4 33.9 0l296-296.2c9.4-9.5 9.4-24.7.1-34zm-324.3 106c6.2 6.3 16.4 6.3 22.6 0l208-208.2c6.2-6.3 6.2-16.4 0-22.6L366.1 4.7c-6.2-6.3-16.4-6.3-22.6 0L192 156.2l-55.4-55.5c-6.2-6.3-16.4-6.3-22.6 0L68.7 146c-6.2 6.3-6.2 16.4 0 22.6l112 112.2z\"]\n};\nvar faCheckSquare = {\n prefix: 'fas',\n iconName: 'check-square',\n icon: [448, 512, [], \"f14a\", \"M400 480H48c-26.51 0-48-21.49-48-48V80c0-26.51 21.49-48 48-48h352c26.51 0 48 21.49 48 48v352c0 26.51-21.49 48-48 48zm-204.686-98.059l184-184c6.248-6.248 6.248-16.379 0-22.627l-22.627-22.627c-6.248-6.248-16.379-6.249-22.628 0L184 302.745l-70.059-70.059c-6.248-6.248-16.379-6.248-22.628 0l-22.627 22.627c-6.248 6.248-6.248 16.379 0 22.627l104 104c6.249 6.25 16.379 6.25 22.628.001z\"]\n};\nvar faCheese = {\n prefix: 'fas',\n iconName: 'cheese',\n icon: [512, 512, [], \"f7ef\", \"M0 288v160a32 32 0 0 0 32 32h448a32 32 0 0 0 32-32V288zM299.83 32a32 32 0 0 0-21.13 7L0 256h512c0-119.89-94-217.8-212.17-224z\"]\n};\nvar faChess = {\n prefix: 'fas',\n iconName: 'chess',\n icon: [512, 512, [], \"f439\", \"M74 208H64a16 16 0 0 0-16 16v16a16 16 0 0 0 16 16h15.94A535.78 535.78 0 0 1 64 384h128a535.78 535.78 0 0 1-15.94-128H192a16 16 0 0 0 16-16v-16a16 16 0 0 0-16-16h-10l33.89-90.38a16 16 0 0 0-15-21.62H144V64h24a8 8 0 0 0 8-8V40a8 8 0 0 0-8-8h-24V8a8 8 0 0 0-8-8h-16a8 8 0 0 0-8 8v24H88a8 8 0 0 0-8 8v16a8 8 0 0 0 8 8h24v32H55.09a16 16 0 0 0-15 21.62zm173.16 251.58L224 448v-16a16 16 0 0 0-16-16H48a16 16 0 0 0-16 16v16L8.85 459.58A16 16 0 0 0 0 473.89V496a16 16 0 0 0 16 16h224a16 16 0 0 0 16-16v-22.11a16 16 0 0 0-8.84-14.31zm92.77-157.78l-3.29 82.2h126.72l-3.29-82.21 24.6-20.79A32 32 0 0 0 496 256.54V198a6 6 0 0 0-6-6h-26.38a6 6 0 0 0-6 6v26h-24.71v-26a6 6 0 0 0-6-6H373.1a6 6 0 0 0-6 6v26h-24.71v-26a6 6 0 0 0-6-6H310a6 6 0 0 0-6 6v58.6a32 32 0 0 0 11.36 24.4zM384 304a16 16 0 0 1 32 0v32h-32zm119.16 155.58L480 448v-16a16 16 0 0 0-16-16H336a16 16 0 0 0-16 16v16l-23.15 11.58a16 16 0 0 0-8.85 14.31V496a16 16 0 0 0 16 16h192a16 16 0 0 0 16-16v-22.11a16 16 0 0 0-8.84-14.31z\"]\n};\nvar faChessBishop = {\n prefix: 'fas',\n iconName: 'chess-bishop',\n icon: [320, 512, [], \"f43a\", \"M8 287.88c0 51.64 22.14 73.83 56 84.6V416h192v-43.52c33.86-10.77 56-33 56-84.6 0-30.61-10.73-67.1-26.69-102.56L185 285.65a8 8 0 0 1-11.31 0l-11.31-11.31a8 8 0 0 1 0-11.31L270.27 155.1c-20.8-37.91-46.47-72.1-70.87-92.59C213.4 59.09 224 47.05 224 32a32 32 0 0 0-32-32h-64a32 32 0 0 0-32 32c0 15 10.6 27.09 24.6 30.51C67.81 106.8 8 214.5 8 287.88zM304 448H16a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h288a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16z\"]\n};\nvar faChessBoard = {\n prefix: 'fas',\n iconName: 'chess-board',\n icon: [512, 512, [], \"f43c\", \"M255.9.2h-64v64h64zM0 64.17v64h64v-64zM128 .2H64v64h64zm64 255.9v64h64v-64zM0 192.12v64h64v-64zM383.85.2h-64v64h64zm128 0h-64v64h64zM128 256.1H64v64h64zM511.8 448v-64h-64v64zm0-128v-64h-64v64zM383.85 512h64v-64h-64zm128-319.88v-64h-64v64zM128 512h64v-64h-64zM0 512h64v-64H0zm255.9 0h64v-64h-64zM0 320.07v64h64v-64zm319.88-191.92v-64h-64v64zm-64 128h64v-64h-64zm-64 128v64h64v-64zm128-64h64v-64h-64zm0-127.95h64v-64h-64zm0 191.93v64h64v-64zM64 384.05v64h64v-64zm128-255.9v-64h-64v64zm191.92 255.9h64v-64h-64zm-128-191.93v-64h-64v64zm128-127.95v64h64v-64zm-128 255.9v64h64v-64zm-64-127.95H128v64h64zm191.92 64h64v-64h-64zM128 128.15H64v64h64zm0 191.92v64h64v-64z\"]\n};\nvar faChessKing = {\n prefix: 'fas',\n iconName: 'chess-king',\n icon: [448, 512, [], \"f43f\", \"M400 448H48a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h352a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm16-288H256v-48h40a8 8 0 0 0 8-8V56a8 8 0 0 0-8-8h-40V8a8 8 0 0 0-8-8h-48a8 8 0 0 0-8 8v40h-40a8 8 0 0 0-8 8v48a8 8 0 0 0 8 8h40v48H32a32 32 0 0 0-30.52 41.54L74.56 416h298.88l73.08-214.46A32 32 0 0 0 416 160z\"]\n};\nvar faChessKnight = {\n prefix: 'fas',\n iconName: 'chess-knight',\n icon: [384, 512, [], \"f441\", \"M19 272.47l40.63 18.06a32 32 0 0 0 24.88.47l12.78-5.12a32 32 0 0 0 18.76-20.5l9.22-30.65a24 24 0 0 1 12.55-15.65L159.94 208v50.33a48 48 0 0 1-26.53 42.94l-57.22 28.65A80 80 0 0 0 32 401.48V416h319.86V224c0-106-85.92-192-191.92-192H12A12 12 0 0 0 0 44a16.9 16.9 0 0 0 1.79 7.58L16 80l-9 9a24 24 0 0 0-7 17v137.21a32 32 0 0 0 19 29.26zM52 128a20 20 0 1 1-20 20 20 20 0 0 1 20-20zm316 320H16a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h352a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16z\"]\n};\nvar faChessPawn = {\n prefix: 'fas',\n iconName: 'chess-pawn',\n icon: [320, 512, [], \"f443\", \"M105.1 224H80a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h16v5.49c0 44-4.14 86.6-24 122.51h176c-19.89-35.91-24-78.51-24-122.51V288h16a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16h-25.1c29.39-18.38 49.1-50.78 49.1-88a104 104 0 0 0-208 0c0 37.22 19.71 69.62 49.1 88zM304 448H16a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h288a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16z\"]\n};\nvar faChessQueen = {\n prefix: 'fas',\n iconName: 'chess-queen',\n icon: [512, 512, [], \"f445\", \"M256 112a56 56 0 1 0-56-56 56 56 0 0 0 56 56zm176 336H80a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h352a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm72.87-263.84l-28.51-15.92c-7.44-5-16.91-2.46-22.29 4.68a47.59 47.59 0 0 1-47.23 18.23C383.7 186.86 368 164.93 368 141.4a13.4 13.4 0 0 0-13.4-13.4h-38.77c-6 0-11.61 4-12.86 9.91a48 48 0 0 1-93.94 0c-1.25-5.92-6.82-9.91-12.86-9.91H157.4a13.4 13.4 0 0 0-13.4 13.4c0 25.69-19 48.75-44.67 50.49a47.5 47.5 0 0 1-41.54-19.15c-5.28-7.09-14.73-9.45-22.09-4.54l-28.57 16a16 16 0 0 0-5.44 20.47L104.24 416h303.52l102.55-211.37a16 16 0 0 0-5.44-20.47z\"]\n};\nvar faChessRook = {\n prefix: 'fas',\n iconName: 'chess-rook',\n icon: [384, 512, [], \"f447\", \"M368 32h-56a16 16 0 0 0-16 16v48h-48V48a16 16 0 0 0-16-16h-80a16 16 0 0 0-16 16v48H88.1V48a16 16 0 0 0-16-16H16A16 16 0 0 0 0 48v176l64 32c0 48.33-1.54 95-13.21 160h282.42C321.54 351 320 303.72 320 256l64-32V48a16 16 0 0 0-16-16zM224 320h-64v-64a32 32 0 0 1 64 0zm144 128H16a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h352a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16z\"]\n};\nvar faChevronCircleDown = {\n prefix: 'fas',\n iconName: 'chevron-circle-down',\n icon: [512, 512, [], \"f13a\", \"M504 256c0 137-111 248-248 248S8 393 8 256 119 8 256 8s248 111 248 248zM273 369.9l135.5-135.5c9.4-9.4 9.4-24.6 0-33.9l-17-17c-9.4-9.4-24.6-9.4-33.9 0L256 285.1 154.4 183.5c-9.4-9.4-24.6-9.4-33.9 0l-17 17c-9.4 9.4-9.4 24.6 0 33.9L239 369.9c9.4 9.4 24.6 9.4 34 0z\"]\n};\nvar faChevronCircleLeft = {\n prefix: 'fas',\n iconName: 'chevron-circle-left',\n icon: [512, 512, [], \"f137\", \"M256 504C119 504 8 393 8 256S119 8 256 8s248 111 248 248-111 248-248 248zM142.1 273l135.5 135.5c9.4 9.4 24.6 9.4 33.9 0l17-17c9.4-9.4 9.4-24.6 0-33.9L226.9 256l101.6-101.6c9.4-9.4 9.4-24.6 0-33.9l-17-17c-9.4-9.4-24.6-9.4-33.9 0L142.1 239c-9.4 9.4-9.4 24.6 0 34z\"]\n};\nvar faChevronCircleRight = {\n prefix: 'fas',\n iconName: 'chevron-circle-right',\n icon: [512, 512, [], \"f138\", \"M256 8c137 0 248 111 248 248S393 504 256 504 8 393 8 256 119 8 256 8zm113.9 231L234.4 103.5c-9.4-9.4-24.6-9.4-33.9 0l-17 17c-9.4 9.4-9.4 24.6 0 33.9L285.1 256 183.5 357.6c-9.4 9.4-9.4 24.6 0 33.9l17 17c9.4 9.4 24.6 9.4 33.9 0L369.9 273c9.4-9.4 9.4-24.6 0-34z\"]\n};\nvar faChevronCircleUp = {\n prefix: 'fas',\n iconName: 'chevron-circle-up',\n icon: [512, 512, [], \"f139\", \"M8 256C8 119 119 8 256 8s248 111 248 248-111 248-248 248S8 393 8 256zm231-113.9L103.5 277.6c-9.4 9.4-9.4 24.6 0 33.9l17 17c9.4 9.4 24.6 9.4 33.9 0L256 226.9l101.6 101.6c9.4 9.4 24.6 9.4 33.9 0l17-17c9.4-9.4 9.4-24.6 0-33.9L273 142.1c-9.4-9.4-24.6-9.4-34 0z\"]\n};\nvar faChevronDown = {\n prefix: 'fas',\n iconName: 'chevron-down',\n icon: [448, 512, [], \"f078\", \"M207.029 381.476L12.686 187.132c-9.373-9.373-9.373-24.569 0-33.941l22.667-22.667c9.357-9.357 24.522-9.375 33.901-.04L224 284.505l154.745-154.021c9.379-9.335 24.544-9.317 33.901.04l22.667 22.667c9.373 9.373 9.373 24.569 0 33.941L240.971 381.476c-9.373 9.372-24.569 9.372-33.942 0z\"]\n};\nvar faChevronLeft = {\n prefix: 'fas',\n iconName: 'chevron-left',\n icon: [320, 512, [], \"f053\", \"M34.52 239.03L228.87 44.69c9.37-9.37 24.57-9.37 33.94 0l22.67 22.67c9.36 9.36 9.37 24.52.04 33.9L131.49 256l154.02 154.75c9.34 9.38 9.32 24.54-.04 33.9l-22.67 22.67c-9.37 9.37-24.57 9.37-33.94 0L34.52 272.97c-9.37-9.37-9.37-24.57 0-33.94z\"]\n};\nvar faChevronRight = {\n prefix: 'fas',\n iconName: 'chevron-right',\n icon: [320, 512, [], \"f054\", \"M285.476 272.971L91.132 467.314c-9.373 9.373-24.569 9.373-33.941 0l-22.667-22.667c-9.357-9.357-9.375-24.522-.04-33.901L188.505 256 34.484 101.255c-9.335-9.379-9.317-24.544.04-33.901l22.667-22.667c9.373-9.373 24.569-9.373 33.941 0L285.475 239.03c9.373 9.372 9.373 24.568.001 33.941z\"]\n};\nvar faChevronUp = {\n prefix: 'fas',\n iconName: 'chevron-up',\n icon: [448, 512, [], \"f077\", \"M240.971 130.524l194.343 194.343c9.373 9.373 9.373 24.569 0 33.941l-22.667 22.667c-9.357 9.357-24.522 9.375-33.901.04L224 227.495 69.255 381.516c-9.379 9.335-24.544 9.317-33.901-.04l-22.667-22.667c-9.373-9.373-9.373-24.569 0-33.941L207.03 130.525c9.372-9.373 24.568-9.373 33.941-.001z\"]\n};\nvar faChild = {\n prefix: 'fas',\n iconName: 'child',\n icon: [384, 512, [], \"f1ae\", \"M120 72c0-39.765 32.235-72 72-72s72 32.235 72 72c0 39.764-32.235 72-72 72s-72-32.236-72-72zm254.627 1.373c-12.496-12.497-32.758-12.497-45.254 0L242.745 160H141.254L54.627 73.373c-12.496-12.497-32.758-12.497-45.254 0-12.497 12.497-12.497 32.758 0 45.255L104 213.254V480c0 17.673 14.327 32 32 32h16c17.673 0 32-14.327 32-32V368h16v112c0 17.673 14.327 32 32 32h16c17.673 0 32-14.327 32-32V213.254l94.627-94.627c12.497-12.497 12.497-32.757 0-45.254z\"]\n};\nvar faChurch = {\n prefix: 'fas',\n iconName: 'church',\n icon: [640, 512, [], \"f51d\", \"M464.46 246.68L352 179.2V128h48c8.84 0 16-7.16 16-16V80c0-8.84-7.16-16-16-16h-48V16c0-8.84-7.16-16-16-16h-32c-8.84 0-16 7.16-16 16v48h-48c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h48v51.2l-112.46 67.48A31.997 31.997 0 0 0 160 274.12V512h96v-96c0-35.35 28.65-64 64-64s64 28.65 64 64v96h96V274.12c0-11.24-5.9-21.66-15.54-27.44zM0 395.96V496c0 8.84 7.16 16 16 16h112V320L19.39 366.54A32.024 32.024 0 0 0 0 395.96zm620.61-29.42L512 320v192h112c8.84 0 16-7.16 16-16V395.96c0-12.8-7.63-24.37-19.39-29.42z\"]\n};\nvar faCircle = {\n prefix: 'fas',\n iconName: 'circle',\n icon: [512, 512, [], \"f111\", \"M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8z\"]\n};\nvar faCircleNotch = {\n prefix: 'fas',\n iconName: 'circle-notch',\n icon: [512, 512, [], \"f1ce\", \"M288 39.056v16.659c0 10.804 7.281 20.159 17.686 23.066C383.204 100.434 440 171.518 440 256c0 101.689-82.295 184-184 184-101.689 0-184-82.295-184-184 0-84.47 56.786-155.564 134.312-177.219C216.719 75.874 224 66.517 224 55.712V39.064c0-15.709-14.834-27.153-30.046-23.234C86.603 43.482 7.394 141.206 8.003 257.332c.72 137.052 111.477 246.956 248.531 246.667C393.255 503.711 504 392.788 504 256c0-115.633-79.14-212.779-186.211-240.236C302.678 11.889 288 23.456 288 39.056z\"]\n};\nvar faCity = {\n prefix: 'fas',\n iconName: 'city',\n icon: [640, 512, [], \"f64f\", \"M616 192H480V24c0-13.26-10.74-24-24-24H312c-13.26 0-24 10.74-24 24v72h-64V16c0-8.84-7.16-16-16-16h-16c-8.84 0-16 7.16-16 16v80h-64V16c0-8.84-7.16-16-16-16H80c-8.84 0-16 7.16-16 16v80H24c-13.26 0-24 10.74-24 24v360c0 17.67 14.33 32 32 32h576c17.67 0 32-14.33 32-32V216c0-13.26-10.75-24-24-24zM128 404c0 6.63-5.37 12-12 12H76c-6.63 0-12-5.37-12-12v-40c0-6.63 5.37-12 12-12h40c6.63 0 12 5.37 12 12v40zm0-96c0 6.63-5.37 12-12 12H76c-6.63 0-12-5.37-12-12v-40c0-6.63 5.37-12 12-12h40c6.63 0 12 5.37 12 12v40zm0-96c0 6.63-5.37 12-12 12H76c-6.63 0-12-5.37-12-12v-40c0-6.63 5.37-12 12-12h40c6.63 0 12 5.37 12 12v40zm128 192c0 6.63-5.37 12-12 12h-40c-6.63 0-12-5.37-12-12v-40c0-6.63 5.37-12 12-12h40c6.63 0 12 5.37 12 12v40zm0-96c0 6.63-5.37 12-12 12h-40c-6.63 0-12-5.37-12-12v-40c0-6.63 5.37-12 12-12h40c6.63 0 12 5.37 12 12v40zm0-96c0 6.63-5.37 12-12 12h-40c-6.63 0-12-5.37-12-12v-40c0-6.63 5.37-12 12-12h40c6.63 0 12 5.37 12 12v40zm160 96c0 6.63-5.37 12-12 12h-40c-6.63 0-12-5.37-12-12v-40c0-6.63 5.37-12 12-12h40c6.63 0 12 5.37 12 12v40zm0-96c0 6.63-5.37 12-12 12h-40c-6.63 0-12-5.37-12-12v-40c0-6.63 5.37-12 12-12h40c6.63 0 12 5.37 12 12v40zm0-96c0 6.63-5.37 12-12 12h-40c-6.63 0-12-5.37-12-12V76c0-6.63 5.37-12 12-12h40c6.63 0 12 5.37 12 12v40zm160 288c0 6.63-5.37 12-12 12h-40c-6.63 0-12-5.37-12-12v-40c0-6.63 5.37-12 12-12h40c6.63 0 12 5.37 12 12v40zm0-96c0 6.63-5.37 12-12 12h-40c-6.63 0-12-5.37-12-12v-40c0-6.63 5.37-12 12-12h40c6.63 0 12 5.37 12 12v40z\"]\n};\nvar faClinicMedical = {\n prefix: 'fas',\n iconName: 'clinic-medical',\n icon: [576, 512, [], \"f7f2\", \"M288 115L69.47 307.71c-1.62 1.46-3.69 2.14-5.47 3.35V496a16 16 0 0 0 16 16h416a16 16 0 0 0 16-16V311.1c-1.7-1.16-3.72-1.82-5.26-3.2zm96 261a8 8 0 0 1-8 8h-56v56a8 8 0 0 1-8 8h-48a8 8 0 0 1-8-8v-56h-56a8 8 0 0 1-8-8v-48a8 8 0 0 1 8-8h56v-56a8 8 0 0 1 8-8h48a8 8 0 0 1 8 8v56h56a8 8 0 0 1 8 8zm186.69-139.72l-255.94-226a39.85 39.85 0 0 0-53.45 0l-256 226a16 16 0 0 0-1.21 22.6L25.5 282.7a16 16 0 0 0 22.6 1.21L277.42 81.63a16 16 0 0 1 21.17 0L527.91 283.9a16 16 0 0 0 22.6-1.21l21.4-23.82a16 16 0 0 0-1.22-22.59z\"]\n};\nvar faClipboard = {\n prefix: 'fas',\n iconName: 'clipboard',\n icon: [384, 512, [], \"f328\", \"M384 112v352c0 26.51-21.49 48-48 48H48c-26.51 0-48-21.49-48-48V112c0-26.51 21.49-48 48-48h80c0-35.29 28.71-64 64-64s64 28.71 64 64h80c26.51 0 48 21.49 48 48zM192 40c-13.255 0-24 10.745-24 24s10.745 24 24 24 24-10.745 24-24-10.745-24-24-24m96 114v-20a6 6 0 0 0-6-6H102a6 6 0 0 0-6 6v20a6 6 0 0 0 6 6h180a6 6 0 0 0 6-6z\"]\n};\nvar faClipboardCheck = {\n prefix: 'fas',\n iconName: 'clipboard-check',\n icon: [384, 512, [], \"f46c\", \"M336 64h-80c0-35.3-28.7-64-64-64s-64 28.7-64 64H48C21.5 64 0 85.5 0 112v352c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V112c0-26.5-21.5-48-48-48zM192 40c13.3 0 24 10.7 24 24s-10.7 24-24 24-24-10.7-24-24 10.7-24 24-24zm121.2 231.8l-143 141.8c-4.7 4.7-12.3 4.6-17-.1l-82.6-83.3c-4.7-4.7-4.6-12.3.1-17L99.1 285c4.7-4.7 12.3-4.6 17 .1l46 46.4 106-105.2c4.7-4.7 12.3-4.6 17 .1l28.2 28.4c4.7 4.8 4.6 12.3-.1 17z\"]\n};\nvar faClipboardList = {\n prefix: 'fas',\n iconName: 'clipboard-list',\n icon: [384, 512, [], \"f46d\", \"M336 64h-80c0-35.3-28.7-64-64-64s-64 28.7-64 64H48C21.5 64 0 85.5 0 112v352c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V112c0-26.5-21.5-48-48-48zM96 424c-13.3 0-24-10.7-24-24s10.7-24 24-24 24 10.7 24 24-10.7 24-24 24zm0-96c-13.3 0-24-10.7-24-24s10.7-24 24-24 24 10.7 24 24-10.7 24-24 24zm0-96c-13.3 0-24-10.7-24-24s10.7-24 24-24 24 10.7 24 24-10.7 24-24 24zm96-192c13.3 0 24 10.7 24 24s-10.7 24-24 24-24-10.7-24-24 10.7-24 24-24zm128 368c0 4.4-3.6 8-8 8H168c-4.4 0-8-3.6-8-8v-16c0-4.4 3.6-8 8-8h144c4.4 0 8 3.6 8 8v16zm0-96c0 4.4-3.6 8-8 8H168c-4.4 0-8-3.6-8-8v-16c0-4.4 3.6-8 8-8h144c4.4 0 8 3.6 8 8v16zm0-96c0 4.4-3.6 8-8 8H168c-4.4 0-8-3.6-8-8v-16c0-4.4 3.6-8 8-8h144c4.4 0 8 3.6 8 8v16z\"]\n};\nvar faClock = {\n prefix: 'fas',\n iconName: 'clock',\n icon: [512, 512, [], \"f017\", \"M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm57.1 350.1L224.9 294c-3.1-2.3-4.9-5.9-4.9-9.7V116c0-6.6 5.4-12 12-12h48c6.6 0 12 5.4 12 12v137.7l63.5 46.2c5.4 3.9 6.5 11.4 2.6 16.8l-28.2 38.8c-3.9 5.3-11.4 6.5-16.8 2.6z\"]\n};\nvar faClone = {\n prefix: 'fas',\n iconName: 'clone',\n icon: [512, 512, [], \"f24d\", \"M464 0c26.51 0 48 21.49 48 48v288c0 26.51-21.49 48-48 48H176c-26.51 0-48-21.49-48-48V48c0-26.51 21.49-48 48-48h288M176 416c-44.112 0-80-35.888-80-80V128H48c-26.51 0-48 21.49-48 48v288c0 26.51 21.49 48 48 48h288c26.51 0 48-21.49 48-48v-48H176z\"]\n};\nvar faClosedCaptioning = {\n prefix: 'fas',\n iconName: 'closed-captioning',\n icon: [512, 512, [], \"f20a\", \"M464 64H48C21.5 64 0 85.5 0 112v288c0 26.5 21.5 48 48 48h416c26.5 0 48-21.5 48-48V112c0-26.5-21.5-48-48-48zM218.1 287.7c2.8-2.5 7.1-2.1 9.2.9l19.5 27.7c1.7 2.4 1.5 5.6-.5 7.7-53.6 56.8-172.8 32.1-172.8-67.9 0-97.3 121.7-119.5 172.5-70.1 2.1 2 2.5 3.2 1 5.7l-17.5 30.5c-1.9 3.1-6.2 4-9.1 1.7-40.8-32-94.6-14.9-94.6 31.2.1 48 51.1 70.5 92.3 32.6zm190.4 0c2.8-2.5 7.1-2.1 9.2.9l19.5 27.7c1.7 2.4 1.5 5.6-.5 7.7-53.5 56.9-172.7 32.1-172.7-67.9 0-97.3 121.7-119.5 172.5-70.1 2.1 2 2.5 3.2 1 5.7L420 222.2c-1.9 3.1-6.2 4-9.1 1.7-40.8-32-94.6-14.9-94.6 31.2 0 48 51 70.5 92.2 32.6z\"]\n};\nvar faCloud = {\n prefix: 'fas',\n iconName: 'cloud',\n icon: [640, 512, [], \"f0c2\", \"M537.6 226.6c4.1-10.7 6.4-22.4 6.4-34.6 0-53-43-96-96-96-19.7 0-38.1 6-53.3 16.2C367 64.2 315.3 32 256 32c-88.4 0-160 71.6-160 160 0 2.7.1 5.4.2 8.1C40.2 219.8 0 273.2 0 336c0 79.5 64.5 144 144 144h368c70.7 0 128-57.3 128-128 0-61.9-44-113.6-102.4-125.4z\"]\n};\nvar faCloudDownloadAlt = {\n prefix: 'fas',\n iconName: 'cloud-download-alt',\n icon: [640, 512, [], \"f381\", \"M537.6 226.6c4.1-10.7 6.4-22.4 6.4-34.6 0-53-43-96-96-96-19.7 0-38.1 6-53.3 16.2C367 64.2 315.3 32 256 32c-88.4 0-160 71.6-160 160 0 2.7.1 5.4.2 8.1C40.2 219.8 0 273.2 0 336c0 79.5 64.5 144 144 144h368c70.7 0 128-57.3 128-128 0-61.9-44-113.6-102.4-125.4zm-132.9 88.7L299.3 420.7c-6.2 6.2-16.4 6.2-22.6 0L171.3 315.3c-10.1-10.1-2.9-27.3 11.3-27.3H248V176c0-8.8 7.2-16 16-16h48c8.8 0 16 7.2 16 16v112h65.4c14.2 0 21.4 17.2 11.3 27.3z\"]\n};\nvar faCloudMeatball = {\n prefix: 'fas',\n iconName: 'cloud-meatball',\n icon: [512, 512, [], \"f73b\", \"M48 352c-26.5 0-48 21.5-48 48s21.5 48 48 48 48-21.5 48-48-21.5-48-48-48zm416 0c-26.5 0-48 21.5-48 48s21.5 48 48 48 48-21.5 48-48-21.5-48-48-48zm-119 11.1c4.6-14.5 1.6-30.8-9.8-42.3-11.5-11.5-27.8-14.4-42.3-9.9-7-13.5-20.7-23-36.9-23s-29.9 9.5-36.9 23c-14.5-4.6-30.8-1.6-42.3 9.9-11.5 11.5-14.4 27.8-9.9 42.3-13.5 7-23 20.7-23 36.9s9.5 29.9 23 36.9c-4.6 14.5-1.6 30.8 9.9 42.3 8.2 8.2 18.9 12.3 29.7 12.3 4.3 0 8.5-1.1 12.6-2.5 7 13.5 20.7 23 36.9 23s29.9-9.5 36.9-23c4.1 1.3 8.3 2.5 12.6 2.5 10.8 0 21.5-4.1 29.7-12.3 11.5-11.5 14.4-27.8 9.8-42.3 13.5-7 23-20.7 23-36.9s-9.5-29.9-23-36.9zM512 224c0-53-43-96-96-96-.6 0-1.1.2-1.6.2 1.1-5.2 1.6-10.6 1.6-16.2 0-44.2-35.8-80-80-80-24.6 0-46.3 11.3-61 28.8C256.4 24.8 219.3 0 176 0 114.1 0 64 50.1 64 112c0 7.3.8 14.3 2.1 21.2C27.8 145.8 0 181.5 0 224c0 53 43 96 96 96h43.4c3.6-8 8.4-15.4 14.8-21.8 13.5-13.5 31.5-21.1 50.8-21.3 13.5-13.2 31.7-20.9 51-20.9s37.5 7.7 51 20.9c19.3.2 37.3 7.8 50.8 21.3 6.4 6.4 11.3 13.8 14.8 21.8H416c53 0 96-43 96-96z\"]\n};\nvar faCloudMoon = {\n prefix: 'fas',\n iconName: 'cloud-moon',\n icon: [576, 512, [], \"f6c3\", \"M342.8 352.7c5.7-9.6 9.2-20.7 9.2-32.7 0-35.3-28.7-64-64-64-17.2 0-32.8 6.9-44.3 17.9-16.3-29.6-47.5-49.9-83.7-49.9-53 0-96 43-96 96 0 2 .5 3.8.6 5.7C27.1 338.8 0 374.1 0 416c0 53 43 96 96 96h240c44.2 0 80-35.8 80-80 0-41.9-32.3-75.8-73.2-79.3zm222.5-54.3c-93.1 17.7-178.5-53.7-178.5-147.7 0-54.2 29-104 76.1-130.8 7.3-4.1 5.4-15.1-2.8-16.7C448.4 1.1 436.7 0 425 0 319.1 0 233.1 85.9 233.1 192c0 8.5.7 16.8 1.8 25 5.9 4.3 11.6 8.9 16.7 14.2 11.4-4.7 23.7-7.2 36.4-7.2 52.9 0 96 43.1 96 96 0 3.6-.2 7.2-.6 10.7 23.6 10.8 42.4 29.5 53.5 52.6 54.4-3.4 103.7-29.3 137.1-70.4 5.3-6.5-.5-16.1-8.7-14.5z\"]\n};\nvar faCloudMoonRain = {\n prefix: 'fas',\n iconName: 'cloud-moon-rain',\n icon: [576, 512, [], \"f73c\", \"M350.5 225.5c-6.9-37.2-39.3-65.5-78.5-65.5-12.3 0-23.9 3-34.3 8-17.4-24.1-45.6-40-77.7-40-53 0-96 43-96 96 0 .5.2 1.1.2 1.6C27.6 232.9 0 265.2 0 304c0 44.2 35.8 80 80 80h256c44.2 0 80-35.8 80-80 0-39.2-28.2-71.7-65.5-78.5zm217.4-1.7c-70.4 13.3-135-40.3-135-110.8 0-40.6 21.9-78 57.5-98.1 5.5-3.1 4.1-11.4-2.1-12.5C479.6.8 470.7 0 461.8 0c-77.9 0-141.1 61.2-144.4 137.9 26.7 11.9 48.2 33.8 58.9 61.7 37.1 14.3 64 47.4 70.2 86.8 5.1.5 10 1.5 15.2 1.5 44.7 0 85.6-20.2 112.6-53.3 4.2-4.8-.2-12-6.4-10.8zM364.5 418.1c-7.6-4.3-17.4-1.8-21.8 6l-36.6 64c-4.4 7.7-1.7 17.4 6 21.8 2.5 1.4 5.2 2.1 7.9 2.1 5.5 0 10.9-2.9 13.9-8.1l36.6-64c4.3-7.7 1.7-17.4-6-21.8zm-96 0c-7.6-4.3-17.4-1.8-21.8 6l-36.6 64c-4.4 7.7-1.7 17.4 6 21.8 2.5 1.4 5.2 2.1 7.9 2.1 5.5 0 10.9-2.9 13.9-8.1l36.6-64c4.3-7.7 1.7-17.4-6-21.8zm-96 0c-7.6-4.3-17.4-1.8-21.8 6l-36.6 64c-4.4 7.7-1.7 17.4 6 21.8 2.5 1.4 5.2 2.1 7.9 2.1 5.5 0 10.9-2.9 13.9-8.1l36.6-64c4.3-7.7 1.7-17.4-6-21.8zm-96 0c-7.6-4.3-17.4-1.8-21.8 6l-36.6 64c-4.4 7.7-1.7 17.4 6 21.8 2.5 1.4 5.2 2.1 7.9 2.1 5.5 0 10.9-2.9 13.9-8.1l36.6-64c4.3-7.7 1.7-17.4-6-21.8z\"]\n};\nvar faCloudRain = {\n prefix: 'fas',\n iconName: 'cloud-rain',\n icon: [512, 512, [], \"f73d\", \"M416 128c-.6 0-1.1.2-1.6.2 1.1-5.2 1.6-10.6 1.6-16.2 0-44.2-35.8-80-80-80-24.6 0-46.3 11.3-61 28.8C256.4 24.8 219.3 0 176 0 114.1 0 64 50.1 64 112c0 7.3.8 14.3 2.1 21.2C27.8 145.8 0 181.5 0 224c0 53 43 96 96 96h320c53 0 96-43 96-96s-43-96-96-96zM88 374.2c-12.8 44.4-40 56.4-40 87.7 0 27.7 21.5 50.1 48 50.1s48-22.4 48-50.1c0-31.4-27.2-43.1-40-87.7-2.2-8.1-13.5-8.5-16 0zm160 0c-12.8 44.4-40 56.4-40 87.7 0 27.7 21.5 50.1 48 50.1s48-22.4 48-50.1c0-31.4-27.2-43.1-40-87.7-2.2-8.1-13.5-8.5-16 0zm160 0c-12.8 44.4-40 56.4-40 87.7 0 27.7 21.5 50.1 48 50.1s48-22.4 48-50.1c0-31.4-27.2-43.1-40-87.7-2.2-8.1-13.5-8.5-16 0z\"]\n};\nvar faCloudShowersHeavy = {\n prefix: 'fas',\n iconName: 'cloud-showers-heavy',\n icon: [512, 512, [], \"f740\", \"M183.9 370.1c-7.6-4.4-17.4-1.8-21.8 6l-64 112c-4.4 7.7-1.7 17.5 6 21.8 2.5 1.4 5.2 2.1 7.9 2.1 5.5 0 10.9-2.9 13.9-8.1l64-112c4.4-7.6 1.7-17.4-6-21.8zm96 0c-7.6-4.4-17.4-1.8-21.8 6l-64 112c-4.4 7.7-1.7 17.5 6 21.8 2.5 1.4 5.2 2.1 7.9 2.1 5.5 0 10.9-2.9 13.9-8.1l64-112c4.4-7.6 1.7-17.4-6-21.8zm-192 0c-7.6-4.4-17.4-1.8-21.8 6l-64 112c-4.4 7.7-1.7 17.5 6 21.8 2.5 1.4 5.2 2.1 7.9 2.1 5.5 0 10.9-2.9 13.9-8.1l64-112c4.4-7.6 1.7-17.4-6-21.8zm384 0c-7.6-4.4-17.4-1.8-21.8 6l-64 112c-4.4 7.7-1.7 17.5 6 21.8 2.5 1.4 5.2 2.1 7.9 2.1 5.5 0 10.9-2.9 13.9-8.1l64-112c4.4-7.6 1.7-17.4-6-21.8zm-96 0c-7.6-4.4-17.4-1.8-21.8 6l-64 112c-4.4 7.7-1.7 17.5 6 21.8 2.5 1.4 5.2 2.1 7.9 2.1 5.5 0 10.9-2.9 13.9-8.1l64-112c4.4-7.6 1.7-17.4-6-21.8zM416 128c-.6 0-1.1.2-1.6.2 1.1-5.2 1.6-10.6 1.6-16.2 0-44.2-35.8-80-80-80-24.6 0-46.3 11.3-61 28.8C256.4 24.8 219.3 0 176 0 114.2 0 64 50.1 64 112c0 7.3.8 14.3 2.1 21.2C27.8 145.8 0 181.5 0 224c0 53 43 96 96 96h320c53 0 96-43 96-96s-43-96-96-96z\"]\n};\nvar faCloudSun = {\n prefix: 'fas',\n iconName: 'cloud-sun',\n icon: [640, 512, [], \"f6c4\", \"M575.2 325.7c.2-1.9.8-3.7.8-5.6 0-35.3-28.7-64-64-64-12.6 0-24.2 3.8-34.1 10-17.6-38.8-56.5-66-101.9-66-61.8 0-112 50.1-112 112 0 3 .7 5.8.9 8.7-49.6 3.7-88.9 44.7-88.9 95.3 0 53 43 96 96 96h272c53 0 96-43 96-96 0-42.1-27.2-77.4-64.8-90.4zm-430.4-22.6c-43.7-43.7-43.7-114.7 0-158.3 43.7-43.7 114.7-43.7 158.4 0 9.7 9.7 16.9 20.9 22.3 32.7 9.8-3.7 20.1-6 30.7-7.5L386 81.1c4-11.9-7.3-23.1-19.2-19.2L279 91.2 237.5 8.4C232-2.8 216-2.8 210.4 8.4L169 91.2 81.1 61.9C69.3 58 58 69.3 61.9 81.1l29.3 87.8-82.8 41.5c-11.2 5.6-11.2 21.5 0 27.1l82.8 41.4-29.3 87.8c-4 11.9 7.3 23.1 19.2 19.2l76.1-25.3c6.1-12.4 14-23.7 23.6-33.5-13.1-5.4-25.4-13.4-36-24zm-4.8-79.2c0 40.8 29.3 74.8 67.9 82.3 8-4.7 16.3-8.8 25.2-11.7 5.4-44.3 31-82.5 67.4-105C287.3 160.4 258 140 224 140c-46.3 0-84 37.6-84 83.9z\"]\n};\nvar faCloudSunRain = {\n prefix: 'fas',\n iconName: 'cloud-sun-rain',\n icon: [576, 512, [], \"f743\", \"M510.5 225.5c-6.9-37.2-39.3-65.5-78.5-65.5-12.3 0-23.9 3-34.3 8-17.4-24.1-45.6-40-77.7-40-53 0-96 43-96 96 0 .5.2 1.1.2 1.6C187.6 233 160 265.2 160 304c0 44.2 35.8 80 80 80h256c44.2 0 80-35.8 80-80 0-39.2-28.2-71.7-65.5-78.5zm-386.4 34.4c-37.4-37.4-37.4-98.3 0-135.8 34.6-34.6 89.1-36.8 126.7-7.4 20-12.9 43.6-20.7 69.2-20.7.7 0 1.3.2 2 .2l8.9-26.7c3.4-10.2-6.3-19.8-16.5-16.4l-75.3 25.1-35.5-71c-4.8-9.6-18.5-9.6-23.3 0l-35.5 71-75.3-25.1c-10.2-3.4-19.8 6.3-16.4 16.5l25.1 75.3-71 35.5c-9.6 4.8-9.6 18.5 0 23.3l71 35.5-25.1 75.3c-3.4 10.2 6.3 19.8 16.5 16.5l59.2-19.7c-.2-2.4-.7-4.7-.7-7.2 0-12.5 2.3-24.5 6.2-35.9-3.6-2.7-7.1-5.2-10.2-8.3zm69.8-58c4.3-24.5 15.8-46.4 31.9-64-9.8-6.2-21.4-9.9-33.8-9.9-35.3 0-64 28.7-64 64 0 18.7 8.2 35.4 21.1 47.1 11.3-15.9 26.6-28.9 44.8-37.2zm330.6 216.2c-7.6-4.3-17.4-1.8-21.8 6l-36.6 64c-4.4 7.7-1.7 17.4 6 21.8 2.5 1.4 5.2 2.1 7.9 2.1 5.5 0 10.9-2.9 13.9-8.1l36.6-64c4.3-7.7 1.7-17.4-6-21.8zm-96 0c-7.6-4.3-17.4-1.8-21.8 6l-36.6 64c-4.4 7.7-1.7 17.4 6 21.8 2.5 1.4 5.2 2.1 7.9 2.1 5.5 0 10.9-2.9 13.9-8.1l36.6-64c4.3-7.7 1.7-17.4-6-21.8zm-96 0c-7.6-4.3-17.4-1.8-21.8 6l-36.6 64c-4.4 7.7-1.7 17.4 6 21.8 2.5 1.4 5.2 2.1 7.9 2.1 5.5 0 10.9-2.9 13.9-8.1l36.6-64c4.3-7.7 1.7-17.4-6-21.8zm-96 0c-7.6-4.3-17.4-1.8-21.8 6l-36.6 64c-4.4 7.7-1.7 17.4 6 21.8 2.5 1.4 5.2 2.1 7.9 2.1 5.5 0 10.9-2.9 13.9-8.1l36.6-64c4.3-7.7 1.7-17.4-6-21.8z\"]\n};\nvar faCloudUploadAlt = {\n prefix: 'fas',\n iconName: 'cloud-upload-alt',\n icon: [640, 512, [], \"f382\", \"M537.6 226.6c4.1-10.7 6.4-22.4 6.4-34.6 0-53-43-96-96-96-19.7 0-38.1 6-53.3 16.2C367 64.2 315.3 32 256 32c-88.4 0-160 71.6-160 160 0 2.7.1 5.4.2 8.1C40.2 219.8 0 273.2 0 336c0 79.5 64.5 144 144 144h368c70.7 0 128-57.3 128-128 0-61.9-44-113.6-102.4-125.4zM393.4 288H328v112c0 8.8-7.2 16-16 16h-48c-8.8 0-16-7.2-16-16V288h-65.4c-14.3 0-21.4-17.2-11.3-27.3l105.4-105.4c6.2-6.2 16.4-6.2 22.6 0l105.4 105.4c10.1 10.1 2.9 27.3-11.3 27.3z\"]\n};\nvar faCocktail = {\n prefix: 'fas',\n iconName: 'cocktail',\n icon: [576, 512, [], \"f561\", \"M296 464h-56V338.78l168.74-168.73c15.52-15.52 4.53-42.05-17.42-42.05H24.68c-21.95 0-32.94 26.53-17.42 42.05L176 338.78V464h-56c-22.09 0-40 17.91-40 40 0 4.42 3.58 8 8 8h240c4.42 0 8-3.58 8-8 0-22.09-17.91-40-40-40zM432 0c-62.61 0-115.35 40.2-135.18 96h52.54c16.65-28.55 47.27-48 82.64-48 52.93 0 96 43.06 96 96s-43.07 96-96 96c-14.04 0-27.29-3.2-39.32-8.64l-35.26 35.26C379.23 279.92 404.59 288 432 288c79.53 0 144-64.47 144-144S511.53 0 432 0z\"]\n};\nvar faCode = {\n prefix: 'fas',\n iconName: 'code',\n icon: [640, 512, [], \"f121\", \"M278.9 511.5l-61-17.7c-6.4-1.8-10-8.5-8.2-14.9L346.2 8.7c1.8-6.4 8.5-10 14.9-8.2l61 17.7c6.4 1.8 10 8.5 8.2 14.9L293.8 503.3c-1.9 6.4-8.5 10.1-14.9 8.2zm-114-112.2l43.5-46.4c4.6-4.9 4.3-12.7-.8-17.2L117 256l90.6-79.7c5.1-4.5 5.5-12.3.8-17.2l-43.5-46.4c-4.5-4.8-12.1-5.1-17-.5L3.8 247.2c-5.1 4.7-5.1 12.8 0 17.5l144.1 135.1c4.9 4.6 12.5 4.4 17-.5zm327.2.6l144.1-135.1c5.1-4.7 5.1-12.8 0-17.5L492.1 112.1c-4.8-4.5-12.4-4.3-17 .5L431.6 159c-4.6 4.9-4.3 12.7.8 17.2L523 256l-90.6 79.7c-5.1 4.5-5.5 12.3-.8 17.2l43.5 46.4c4.5 4.9 12.1 5.1 17 .6z\"]\n};\nvar faCodeBranch = {\n prefix: 'fas',\n iconName: 'code-branch',\n icon: [384, 512, [], \"f126\", \"M384 144c0-44.2-35.8-80-80-80s-80 35.8-80 80c0 36.4 24.3 67.1 57.5 76.8-.6 16.1-4.2 28.5-11 36.9-15.4 19.2-49.3 22.4-85.2 25.7-28.2 2.6-57.4 5.4-81.3 16.9v-144c32.5-10.2 56-40.5 56-76.3 0-44.2-35.8-80-80-80S0 35.8 0 80c0 35.8 23.5 66.1 56 76.3v199.3C23.5 365.9 0 396.2 0 432c0 44.2 35.8 80 80 80s80-35.8 80-80c0-34-21.2-63.1-51.2-74.6 3.1-5.2 7.8-9.8 14.9-13.4 16.2-8.2 40.4-10.4 66.1-12.8 42.2-3.9 90-8.4 118.2-43.4 14-17.4 21.1-39.8 21.6-67.9 31.6-10.8 54.4-40.7 54.4-75.9zM80 64c8.8 0 16 7.2 16 16s-7.2 16-16 16-16-7.2-16-16 7.2-16 16-16zm0 384c-8.8 0-16-7.2-16-16s7.2-16 16-16 16 7.2 16 16-7.2 16-16 16zm224-320c8.8 0 16 7.2 16 16s-7.2 16-16 16-16-7.2-16-16 7.2-16 16-16z\"]\n};\nvar faCoffee = {\n prefix: 'fas',\n iconName: 'coffee',\n icon: [640, 512, [], \"f0f4\", \"M192 384h192c53 0 96-43 96-96h32c70.6 0 128-57.4 128-128S582.6 32 512 32H120c-13.3 0-24 10.7-24 24v232c0 53 43 96 96 96zM512 96c35.3 0 64 28.7 64 64s-28.7 64-64 64h-32V96h32zm47.7 384H48.3c-47.6 0-61-64-36-64h583.3c25 0 11.8 64-35.9 64z\"]\n};\nvar faCog = {\n prefix: 'fas',\n iconName: 'cog',\n icon: [512, 512, [], \"f013\", \"M487.4 315.7l-42.6-24.6c4.3-23.2 4.3-47 0-70.2l42.6-24.6c4.9-2.8 7.1-8.6 5.5-14-11.1-35.6-30-67.8-54.7-94.6-3.8-4.1-10-5.1-14.8-2.3L380.8 110c-17.9-15.4-38.5-27.3-60.8-35.1V25.8c0-5.6-3.9-10.5-9.4-11.7-36.7-8.2-74.3-7.8-109.2 0-5.5 1.2-9.4 6.1-9.4 11.7V75c-22.2 7.9-42.8 19.8-60.8 35.1L88.7 85.5c-4.9-2.8-11-1.9-14.8 2.3-24.7 26.7-43.6 58.9-54.7 94.6-1.7 5.4.6 11.2 5.5 14L67.3 221c-4.3 23.2-4.3 47 0 70.2l-42.6 24.6c-4.9 2.8-7.1 8.6-5.5 14 11.1 35.6 30 67.8 54.7 94.6 3.8 4.1 10 5.1 14.8 2.3l42.6-24.6c17.9 15.4 38.5 27.3 60.8 35.1v49.2c0 5.6 3.9 10.5 9.4 11.7 36.7 8.2 74.3 7.8 109.2 0 5.5-1.2 9.4-6.1 9.4-11.7v-49.2c22.2-7.9 42.8-19.8 60.8-35.1l42.6 24.6c4.9 2.8 11 1.9 14.8-2.3 24.7-26.7 43.6-58.9 54.7-94.6 1.5-5.5-.7-11.3-5.6-14.1zM256 336c-44.1 0-80-35.9-80-80s35.9-80 80-80 80 35.9 80 80-35.9 80-80 80z\"]\n};\nvar faCogs = {\n prefix: 'fas',\n iconName: 'cogs',\n icon: [640, 512, [], \"f085\", \"M512.1 191l-8.2 14.3c-3 5.3-9.4 7.5-15.1 5.4-11.8-4.4-22.6-10.7-32.1-18.6-4.6-3.8-5.8-10.5-2.8-15.7l8.2-14.3c-6.9-8-12.3-17.3-15.9-27.4h-16.5c-6 0-11.2-4.3-12.2-10.3-2-12-2.1-24.6 0-37.1 1-6 6.2-10.4 12.2-10.4h16.5c3.6-10.1 9-19.4 15.9-27.4l-8.2-14.3c-3-5.2-1.9-11.9 2.8-15.7 9.5-7.9 20.4-14.2 32.1-18.6 5.7-2.1 12.1.1 15.1 5.4l8.2 14.3c10.5-1.9 21.2-1.9 31.7 0L552 6.3c3-5.3 9.4-7.5 15.1-5.4 11.8 4.4 22.6 10.7 32.1 18.6 4.6 3.8 5.8 10.5 2.8 15.7l-8.2 14.3c6.9 8 12.3 17.3 15.9 27.4h16.5c6 0 11.2 4.3 12.2 10.3 2 12 2.1 24.6 0 37.1-1 6-6.2 10.4-12.2 10.4h-16.5c-3.6 10.1-9 19.4-15.9 27.4l8.2 14.3c3 5.2 1.9 11.9-2.8 15.7-9.5 7.9-20.4 14.2-32.1 18.6-5.7 2.1-12.1-.1-15.1-5.4l-8.2-14.3c-10.4 1.9-21.2 1.9-31.7 0zm-10.5-58.8c38.5 29.6 82.4-14.3 52.8-52.8-38.5-29.7-82.4 14.3-52.8 52.8zM386.3 286.1l33.7 16.8c10.1 5.8 14.5 18.1 10.5 29.1-8.9 24.2-26.4 46.4-42.6 65.8-7.4 8.9-20.2 11.1-30.3 5.3l-29.1-16.8c-16 13.7-34.6 24.6-54.9 31.7v33.6c0 11.6-8.3 21.6-19.7 23.6-24.6 4.2-50.4 4.4-75.9 0-11.5-2-20-11.9-20-23.6V418c-20.3-7.2-38.9-18-54.9-31.7L74 403c-10 5.8-22.9 3.6-30.3-5.3-16.2-19.4-33.3-41.6-42.2-65.7-4-10.9.4-23.2 10.5-29.1l33.3-16.8c-3.9-20.9-3.9-42.4 0-63.4L12 205.8c-10.1-5.8-14.6-18.1-10.5-29 8.9-24.2 26-46.4 42.2-65.8 7.4-8.9 20.2-11.1 30.3-5.3l29.1 16.8c16-13.7 34.6-24.6 54.9-31.7V57.1c0-11.5 8.2-21.5 19.6-23.5 24.6-4.2 50.5-4.4 76-.1 11.5 2 20 11.9 20 23.6v33.6c20.3 7.2 38.9 18 54.9 31.7l29.1-16.8c10-5.8 22.9-3.6 30.3 5.3 16.2 19.4 33.2 41.6 42.1 65.8 4 10.9.1 23.2-10 29.1l-33.7 16.8c3.9 21 3.9 42.5 0 63.5zm-117.6 21.1c59.2-77-28.7-164.9-105.7-105.7-59.2 77 28.7 164.9 105.7 105.7zm243.4 182.7l-8.2 14.3c-3 5.3-9.4 7.5-15.1 5.4-11.8-4.4-22.6-10.7-32.1-18.6-4.6-3.8-5.8-10.5-2.8-15.7l8.2-14.3c-6.9-8-12.3-17.3-15.9-27.4h-16.5c-6 0-11.2-4.3-12.2-10.3-2-12-2.1-24.6 0-37.1 1-6 6.2-10.4 12.2-10.4h16.5c3.6-10.1 9-19.4 15.9-27.4l-8.2-14.3c-3-5.2-1.9-11.9 2.8-15.7 9.5-7.9 20.4-14.2 32.1-18.6 5.7-2.1 12.1.1 15.1 5.4l8.2 14.3c10.5-1.9 21.2-1.9 31.7 0l8.2-14.3c3-5.3 9.4-7.5 15.1-5.4 11.8 4.4 22.6 10.7 32.1 18.6 4.6 3.8 5.8 10.5 2.8 15.7l-8.2 14.3c6.9 8 12.3 17.3 15.9 27.4h16.5c6 0 11.2 4.3 12.2 10.3 2 12 2.1 24.6 0 37.1-1 6-6.2 10.4-12.2 10.4h-16.5c-3.6 10.1-9 19.4-15.9 27.4l8.2 14.3c3 5.2 1.9 11.9-2.8 15.7-9.5 7.9-20.4 14.2-32.1 18.6-5.7 2.1-12.1-.1-15.1-5.4l-8.2-14.3c-10.4 1.9-21.2 1.9-31.7 0zM501.6 431c38.5 29.6 82.4-14.3 52.8-52.8-38.5-29.6-82.4 14.3-52.8 52.8z\"]\n};\nvar faCoins = {\n prefix: 'fas',\n iconName: 'coins',\n icon: [512, 512, [], \"f51e\", \"M0 405.3V448c0 35.3 86 64 192 64s192-28.7 192-64v-42.7C342.7 434.4 267.2 448 192 448S41.3 434.4 0 405.3zM320 128c106 0 192-28.7 192-64S426 0 320 0 128 28.7 128 64s86 64 192 64zM0 300.4V352c0 35.3 86 64 192 64s192-28.7 192-64v-51.6c-41.3 34-116.9 51.6-192 51.6S41.3 334.4 0 300.4zm416 11c57.3-11.1 96-31.7 96-55.4v-42.7c-23.2 16.4-57.3 27.6-96 34.5v63.6zM192 160C86 160 0 195.8 0 240s86 80 192 80 192-35.8 192-80-86-80-192-80zm219.3 56.3c60-10.8 100.7-32 100.7-56.3v-42.7c-35.5 25.1-96.5 38.6-160.7 41.8 29.5 14.3 51.2 33.5 60 57.2z\"]\n};\nvar faColumns = {\n prefix: 'fas',\n iconName: 'columns',\n icon: [512, 512, [], \"f0db\", \"M464 32H48C21.49 32 0 53.49 0 80v352c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48V80c0-26.51-21.49-48-48-48zM224 416H64V160h160v256zm224 0H288V160h160v256z\"]\n};\nvar faComment = {\n prefix: 'fas',\n iconName: 'comment',\n icon: [512, 512, [], \"f075\", \"M256 32C114.6 32 0 125.1 0 240c0 49.6 21.4 95 57 130.7C44.5 421.1 2.7 466 2.2 466.5c-2.2 2.3-2.8 5.7-1.5 8.7S4.8 480 8 480c66.3 0 116-31.8 140.6-51.4 32.7 12.3 69 19.4 107.4 19.4 141.4 0 256-93.1 256-208S397.4 32 256 32z\"]\n};\nvar faCommentAlt = {\n prefix: 'fas',\n iconName: 'comment-alt',\n icon: [512, 512, [], \"f27a\", \"M448 0H64C28.7 0 0 28.7 0 64v288c0 35.3 28.7 64 64 64h96v84c0 9.8 11.2 15.5 19.1 9.7L304 416h144c35.3 0 64-28.7 64-64V64c0-35.3-28.7-64-64-64z\"]\n};\nvar faCommentDollar = {\n prefix: 'fas',\n iconName: 'comment-dollar',\n icon: [512, 512, [], \"f651\", \"M256 32C114.62 32 0 125.12 0 240c0 49.56 21.41 95.01 57.02 130.74C44.46 421.05 2.7 465.97 2.2 466.5A7.995 7.995 0 0 0 8 480c66.26 0 115.99-31.75 140.6-51.38C181.29 440.93 217.59 448 256 448c141.38 0 256-93.12 256-208S397.38 32 256 32zm24 302.44V352c0 8.84-7.16 16-16 16h-16c-8.84 0-16-7.16-16-16v-17.73c-11.42-1.35-22.28-5.19-31.78-11.46-6.22-4.11-6.82-13.11-1.55-18.38l17.52-17.52c3.74-3.74 9.31-4.24 14.11-2.03 3.18 1.46 6.66 2.22 10.26 2.22h32.78c4.66 0 8.44-3.78 8.44-8.42 0-3.75-2.52-7.08-6.12-8.11l-50.07-14.3c-22.25-6.35-40.01-24.71-42.91-47.67-4.05-32.07 19.03-59.43 49.32-63.05V128c0-8.84 7.16-16 16-16h16c8.84 0 16 7.16 16 16v17.73c11.42 1.35 22.28 5.19 31.78 11.46 6.22 4.11 6.82 13.11 1.55 18.38l-17.52 17.52c-3.74 3.74-9.31 4.24-14.11 2.03a24.516 24.516 0 0 0-10.26-2.22h-32.78c-4.66 0-8.44 3.78-8.44 8.42 0 3.75 2.52 7.08 6.12 8.11l50.07 14.3c22.25 6.36 40.01 24.71 42.91 47.67 4.05 32.06-19.03 59.42-49.32 63.04z\"]\n};\nvar faCommentDots = {\n prefix: 'fas',\n iconName: 'comment-dots',\n icon: [512, 512, [], \"f4ad\", \"M256 32C114.6 32 0 125.1 0 240c0 49.6 21.4 95 57 130.7C44.5 421.1 2.7 466 2.2 466.5c-2.2 2.3-2.8 5.7-1.5 8.7S4.8 480 8 480c66.3 0 116-31.8 140.6-51.4 32.7 12.3 69 19.4 107.4 19.4 141.4 0 256-93.1 256-208S397.4 32 256 32zM128 272c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32zm128 0c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32zm128 0c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32z\"]\n};\nvar faCommentMedical = {\n prefix: 'fas',\n iconName: 'comment-medical',\n icon: [512, 512, [], \"f7f5\", \"M256 32C114.62 32 0 125.12 0 240c0 49.56 21.41 95 57 130.74C44.46 421.05 2.7 466 2.2 466.5A8 8 0 0 0 8 480c66.26 0 116-31.75 140.6-51.38A304.66 304.66 0 0 0 256 448c141.39 0 256-93.12 256-208S397.39 32 256 32zm96 232a8 8 0 0 1-8 8h-56v56a8 8 0 0 1-8 8h-48a8 8 0 0 1-8-8v-56h-56a8 8 0 0 1-8-8v-48a8 8 0 0 1 8-8h56v-56a8 8 0 0 1 8-8h48a8 8 0 0 1 8 8v56h56a8 8 0 0 1 8 8z\"]\n};\nvar faCommentSlash = {\n prefix: 'fas',\n iconName: 'comment-slash',\n icon: [640, 512, [], \"f4b3\", \"M64 240c0 49.6 21.4 95 57 130.7-12.6 50.3-54.3 95.2-54.8 95.8-2.2 2.3-2.8 5.7-1.5 8.7 1.3 2.9 4.1 4.8 7.3 4.8 66.3 0 116-31.8 140.6-51.4 32.7 12.3 69 19.4 107.4 19.4 27.4 0 53.7-3.6 78.4-10L72.9 186.4c-5.6 17.1-8.9 35-8.9 53.6zm569.8 218.1l-114.4-88.4C554.6 334.1 576 289.2 576 240c0-114.9-114.6-208-256-208-65.1 0-124.2 20.1-169.4 52.7L45.5 3.4C38.5-2 28.5-.8 23 6.2L3.4 31.4c-5.4 7-4.2 17 2.8 22.4l588.4 454.7c7 5.4 17 4.2 22.5-2.8l19.6-25.3c5.4-6.8 4.1-16.9-2.9-22.3z\"]\n};\nvar faComments = {\n prefix: 'fas',\n iconName: 'comments',\n icon: [576, 512, [], \"f086\", \"M416 192c0-88.4-93.1-160-208-160S0 103.6 0 192c0 34.3 14.1 65.9 38 92-13.4 30.2-35.5 54.2-35.8 54.5-2.2 2.3-2.8 5.7-1.5 8.7S4.8 352 8 352c36.6 0 66.9-12.3 88.7-25 32.2 15.7 70.3 25 111.3 25 114.9 0 208-71.6 208-160zm122 220c23.9-26 38-57.7 38-92 0-66.9-53.5-124.2-129.3-148.1.9 6.6 1.3 13.3 1.3 20.1 0 105.9-107.7 192-240 192-10.8 0-21.3-.8-31.7-1.9C207.8 439.6 281.8 480 368 480c41 0 79.1-9.2 111.3-25 21.8 12.7 52.1 25 88.7 25 3.2 0 6.1-1.9 7.3-4.8 1.3-2.9.7-6.3-1.5-8.7-.3-.3-22.4-24.2-35.8-54.5z\"]\n};\nvar faCommentsDollar = {\n prefix: 'fas',\n iconName: 'comments-dollar',\n icon: [576, 512, [], \"f653\", \"M416 192c0-88.37-93.12-160-208-160S0 103.63 0 192c0 34.27 14.13 65.95 37.97 91.98C24.61 314.22 2.52 338.16 2.2 338.5A7.995 7.995 0 0 0 8 352c36.58 0 66.93-12.25 88.73-24.98C128.93 342.76 167.02 352 208 352c114.88 0 208-71.63 208-160zm-224 96v-16.29c-11.29-.58-22.27-4.52-31.37-11.35-3.9-2.93-4.1-8.77-.57-12.14l11.75-11.21c2.77-2.64 6.89-2.76 10.13-.73 3.87 2.42 8.26 3.72 12.82 3.72h28.11c6.5 0 11.8-5.92 11.8-13.19 0-5.95-3.61-11.19-8.77-12.73l-45-13.5c-18.59-5.58-31.58-23.42-31.58-43.39 0-24.52 19.05-44.44 42.67-45.07V96c0-4.42 3.58-8 8-8h16c4.42 0 8 3.58 8 8v16.29c11.29.58 22.27 4.51 31.37 11.35 3.9 2.93 4.1 8.77.57 12.14l-11.75 11.21c-2.77 2.64-6.89 2.76-10.13.73-3.87-2.43-8.26-3.72-12.82-3.72h-28.11c-6.5 0-11.8 5.92-11.8 13.19 0 5.95 3.61 11.19 8.77 12.73l45 13.5c18.59 5.58 31.58 23.42 31.58 43.39 0 24.53-19.05 44.44-42.67 45.07V288c0 4.42-3.58 8-8 8h-16c-4.42 0-8-3.58-8-8zm346.01 123.99C561.87 385.96 576 354.27 576 320c0-66.94-53.49-124.2-129.33-148.07.86 6.6 1.33 13.29 1.33 20.07 0 105.87-107.66 192-240 192-10.78 0-21.32-.77-31.73-1.88C207.8 439.63 281.77 480 368 480c40.98 0 79.07-9.24 111.27-24.98C501.07 467.75 531.42 480 568 480c3.2 0 6.09-1.91 7.34-4.84 1.27-2.94.66-6.34-1.55-8.67-.31-.33-22.42-24.24-35.78-54.5z\"]\n};\nvar faCompactDisc = {\n prefix: 'fas',\n iconName: 'compact-disc',\n icon: [496, 512, [], \"f51f\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zM88 256H56c0-105.9 86.1-192 192-192v32c-88.2 0-160 71.8-160 160zm160 96c-53 0-96-43-96-96s43-96 96-96 96 43 96 96-43 96-96 96zm0-128c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32z\"]\n};\nvar faCompass = {\n prefix: 'fas',\n iconName: 'compass',\n icon: [496, 512, [], \"f14e\", \"M225.38 233.37c-12.5 12.5-12.5 32.76 0 45.25 12.49 12.5 32.76 12.5 45.25 0 12.5-12.5 12.5-32.76 0-45.25-12.5-12.49-32.76-12.49-45.25 0zM248 8C111.03 8 0 119.03 0 256s111.03 248 248 248 248-111.03 248-248S384.97 8 248 8zm126.14 148.05L308.17 300.4a31.938 31.938 0 0 1-15.77 15.77l-144.34 65.97c-16.65 7.61-33.81-9.55-26.2-26.2l65.98-144.35a31.938 31.938 0 0 1 15.77-15.77l144.34-65.97c16.65-7.6 33.8 9.55 26.19 26.2z\"]\n};\nvar faCompress = {\n prefix: 'fas',\n iconName: 'compress',\n icon: [448, 512, [], \"f066\", \"M436 192H312c-13.3 0-24-10.7-24-24V44c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v84h84c6.6 0 12 5.4 12 12v40c0 6.6-5.4 12-12 12zm-276-24V44c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v84H12c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h124c13.3 0 24-10.7 24-24zm0 300V344c0-13.3-10.7-24-24-24H12c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h84v84c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12zm192 0v-84h84c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12H312c-13.3 0-24 10.7-24 24v124c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12z\"]\n};\nvar faCompressArrowsAlt = {\n prefix: 'fas',\n iconName: 'compress-arrows-alt',\n icon: [512, 512, [], \"f78c\", \"M200 288H88c-21.4 0-32.1 25.8-17 41l32.9 31-99.2 99.3c-6.2 6.2-6.2 16.4 0 22.6l25.4 25.4c6.2 6.2 16.4 6.2 22.6 0L152 408l31.1 33c15.1 15.1 40.9 4.4 40.9-17V312c0-13.3-10.7-24-24-24zm112-64h112c21.4 0 32.1-25.9 17-41l-33-31 99.3-99.3c6.2-6.2 6.2-16.4 0-22.6L481.9 4.7c-6.2-6.2-16.4-6.2-22.6 0L360 104l-31.1-33C313.8 55.9 288 66.6 288 88v112c0 13.3 10.7 24 24 24zm96 136l33-31.1c15.1-15.1 4.4-40.9-17-40.9H312c-13.3 0-24 10.7-24 24v112c0 21.4 25.9 32.1 41 17l31-32.9 99.3 99.3c6.2 6.2 16.4 6.2 22.6 0l25.4-25.4c6.2-6.2 6.2-16.4 0-22.6L408 360zM183 71.1L152 104 52.7 4.7c-6.2-6.2-16.4-6.2-22.6 0L4.7 30.1c-6.2 6.2-6.2 16.4 0 22.6L104 152l-33 31.1C55.9 198.2 66.6 224 88 224h112c13.3 0 24-10.7 24-24V88c0-21.3-25.9-32-41-16.9z\"]\n};\nvar faConciergeBell = {\n prefix: 'fas',\n iconName: 'concierge-bell',\n icon: [512, 512, [], \"f562\", \"M288 130.54V112h16c8.84 0 16-7.16 16-16V80c0-8.84-7.16-16-16-16h-96c-8.84 0-16 7.16-16 16v16c0 8.84 7.16 16 16 16h16v18.54C115.49 146.11 32 239.18 32 352h448c0-112.82-83.49-205.89-192-221.46zM496 384H16c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h480c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16z\"]\n};\nvar faCookie = {\n prefix: 'fas',\n iconName: 'cookie',\n icon: [512, 512, [], \"f563\", \"M510.37 254.79l-12.08-76.26a132.493 132.493 0 0 0-37.16-72.95l-54.76-54.75c-19.73-19.72-45.18-32.7-72.71-37.05l-76.7-12.15c-27.51-4.36-55.69.11-80.52 12.76L107.32 49.6a132.25 132.25 0 0 0-57.79 57.8l-35.1 68.88a132.602 132.602 0 0 0-12.82 80.94l12.08 76.27a132.493 132.493 0 0 0 37.16 72.95l54.76 54.75a132.087 132.087 0 0 0 72.71 37.05l76.7 12.14c27.51 4.36 55.69-.11 80.52-12.75l69.12-35.21a132.302 132.302 0 0 0 57.79-57.8l35.1-68.87c12.71-24.96 17.2-53.3 12.82-80.96zM176 368c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm32-160c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm160 128c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32z\"]\n};\nvar faCookieBite = {\n prefix: 'fas',\n iconName: 'cookie-bite',\n icon: [512, 512, [], \"f564\", \"M510.52 255.82c-69.97-.85-126.47-57.69-126.47-127.86-70.17 0-127-56.49-127.86-126.45-27.26-4.14-55.13.3-79.72 12.82l-69.13 35.22a132.221 132.221 0 0 0-57.79 57.81l-35.1 68.88a132.645 132.645 0 0 0-12.82 80.95l12.08 76.27a132.521 132.521 0 0 0 37.16 72.96l54.77 54.76a132.036 132.036 0 0 0 72.71 37.06l76.71 12.15c27.51 4.36 55.7-.11 80.53-12.76l69.13-35.21a132.273 132.273 0 0 0 57.79-57.81l35.1-68.88c12.56-24.64 17.01-52.58 12.91-79.91zM176 368c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm32-160c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm160 128c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32z\"]\n};\nvar faCopy = {\n prefix: 'fas',\n iconName: 'copy',\n icon: [448, 512, [], \"f0c5\", \"M320 448v40c0 13.255-10.745 24-24 24H24c-13.255 0-24-10.745-24-24V120c0-13.255 10.745-24 24-24h72v296c0 30.879 25.121 56 56 56h168zm0-344V0H152c-13.255 0-24 10.745-24 24v368c0 13.255 10.745 24 24 24h272c13.255 0 24-10.745 24-24V128H344c-13.2 0-24-10.8-24-24zm120.971-31.029L375.029 7.029A24 24 0 0 0 358.059 0H352v96h96v-6.059a24 24 0 0 0-7.029-16.97z\"]\n};\nvar faCopyright = {\n prefix: 'fas',\n iconName: 'copyright',\n icon: [512, 512, [], \"f1f9\", \"M256 8C119.033 8 8 119.033 8 256s111.033 248 248 248 248-111.033 248-248S392.967 8 256 8zm117.134 346.753c-1.592 1.867-39.776 45.731-109.851 45.731-84.692 0-144.484-63.26-144.484-145.567 0-81.303 62.004-143.401 143.762-143.401 66.957 0 101.965 37.315 103.422 38.904a12 12 0 0 1 1.238 14.623l-22.38 34.655c-4.049 6.267-12.774 7.351-18.234 2.295-.233-.214-26.529-23.88-61.88-23.88-46.116 0-73.916 33.575-73.916 76.082 0 39.602 25.514 79.692 74.277 79.692 38.697 0 65.28-28.338 65.544-28.625 5.132-5.565 14.059-5.033 18.508 1.053l24.547 33.572a12.001 12.001 0 0 1-.553 14.866z\"]\n};\nvar faCouch = {\n prefix: 'fas',\n iconName: 'couch',\n icon: [640, 512, [], \"f4b8\", \"M160 224v64h320v-64c0-35.3 28.7-64 64-64h32c0-53-43-96-96-96H160c-53 0-96 43-96 96h32c35.3 0 64 28.7 64 64zm416-32h-32c-17.7 0-32 14.3-32 32v96H128v-96c0-17.7-14.3-32-32-32H64c-35.3 0-64 28.7-64 64 0 23.6 13 44 32 55.1V432c0 8.8 7.2 16 16 16h64c8.8 0 16-7.2 16-16v-16h384v16c0 8.8 7.2 16 16 16h64c8.8 0 16-7.2 16-16V311.1c19-11.1 32-31.5 32-55.1 0-35.3-28.7-64-64-64z\"]\n};\nvar faCreditCard = {\n prefix: 'fas',\n iconName: 'credit-card',\n icon: [576, 512, [], \"f09d\", \"M0 432c0 26.5 21.5 48 48 48h480c26.5 0 48-21.5 48-48V256H0v176zm192-68c0-6.6 5.4-12 12-12h136c6.6 0 12 5.4 12 12v40c0 6.6-5.4 12-12 12H204c-6.6 0-12-5.4-12-12v-40zm-128 0c0-6.6 5.4-12 12-12h72c6.6 0 12 5.4 12 12v40c0 6.6-5.4 12-12 12H76c-6.6 0-12-5.4-12-12v-40zM576 80v48H0V80c0-26.5 21.5-48 48-48h480c26.5 0 48 21.5 48 48z\"]\n};\nvar faCrop = {\n prefix: 'fas',\n iconName: 'crop',\n icon: [512, 512, [], \"f125\", \"M488 352h-40V109.25l59.31-59.31c6.25-6.25 6.25-16.38 0-22.63L484.69 4.69c-6.25-6.25-16.38-6.25-22.63 0L402.75 64H192v96h114.75L160 306.75V24c0-13.26-10.75-24-24-24H88C74.75 0 64 10.74 64 24v40H24C10.75 64 0 74.74 0 88v48c0 13.25 10.75 24 24 24h40v264c0 13.25 10.75 24 24 24h232v-96H205.25L352 205.25V488c0 13.25 10.75 24 24 24h48c13.25 0 24-10.75 24-24v-40h40c13.25 0 24-10.75 24-24v-48c0-13.26-10.75-24-24-24z\"]\n};\nvar faCropAlt = {\n prefix: 'fas',\n iconName: 'crop-alt',\n icon: [512, 512, [], \"f565\", \"M488 352h-40V96c0-17.67-14.33-32-32-32H192v96h160v328c0 13.25 10.75 24 24 24h48c13.25 0 24-10.75 24-24v-40h40c13.25 0 24-10.75 24-24v-48c0-13.26-10.75-24-24-24zM160 24c0-13.26-10.75-24-24-24H88C74.75 0 64 10.74 64 24v40H24C10.75 64 0 74.74 0 88v48c0 13.25 10.75 24 24 24h40v256c0 17.67 14.33 32 32 32h224v-96H160V24z\"]\n};\nvar faCross = {\n prefix: 'fas',\n iconName: 'cross',\n icon: [384, 512, [], \"f654\", \"M352 128h-96V32c0-17.67-14.33-32-32-32h-64c-17.67 0-32 14.33-32 32v96H32c-17.67 0-32 14.33-32 32v64c0 17.67 14.33 32 32 32h96v224c0 17.67 14.33 32 32 32h64c17.67 0 32-14.33 32-32V256h96c17.67 0 32-14.33 32-32v-64c0-17.67-14.33-32-32-32z\"]\n};\nvar faCrosshairs = {\n prefix: 'fas',\n iconName: 'crosshairs',\n icon: [512, 512, [], \"f05b\", \"M500 224h-30.364C455.724 130.325 381.675 56.276 288 42.364V12c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v30.364C130.325 56.276 56.276 130.325 42.364 224H12c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h30.364C56.276 381.675 130.325 455.724 224 469.636V500c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12v-30.364C381.675 455.724 455.724 381.675 469.636 288H500c6.627 0 12-5.373 12-12v-40c0-6.627-5.373-12-12-12zM288 404.634V364c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40.634C165.826 392.232 119.783 346.243 107.366 288H148c6.627 0 12-5.373 12-12v-40c0-6.627-5.373-12-12-12h-40.634C119.768 165.826 165.757 119.783 224 107.366V148c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12v-40.634C346.174 119.768 392.217 165.757 404.634 224H364c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40.634C392.232 346.174 346.243 392.217 288 404.634zM288 256c0 17.673-14.327 32-32 32s-32-14.327-32-32c0-17.673 14.327-32 32-32s32 14.327 32 32z\"]\n};\nvar faCrow = {\n prefix: 'fas',\n iconName: 'crow',\n icon: [640, 512, [], \"f520\", \"M544 32h-16.36C513.04 12.68 490.09 0 464 0c-44.18 0-80 35.82-80 80v20.98L12.09 393.57A30.216 30.216 0 0 0 0 417.74c0 22.46 23.64 37.07 43.73 27.03L165.27 384h96.49l44.41 120.1c2.27 6.23 9.15 9.44 15.38 7.17l22.55-8.21c6.23-2.27 9.44-9.15 7.17-15.38L312.94 384H352c1.91 0 3.76-.23 5.66-.29l44.51 120.38c2.27 6.23 9.15 9.44 15.38 7.17l22.55-8.21c6.23-2.27 9.44-9.15 7.17-15.38l-41.24-111.53C485.74 352.8 544 279.26 544 192v-80l96-16c0-35.35-42.98-64-96-64zm-80 72c-13.25 0-24-10.75-24-24 0-13.26 10.75-24 24-24s24 10.74 24 24c0 13.25-10.75 24-24 24z\"]\n};\nvar faCrown = {\n prefix: 'fas',\n iconName: 'crown',\n icon: [640, 512, [], \"f521\", \"M528 448H112c-8.8 0-16 7.2-16 16v32c0 8.8 7.2 16 16 16h416c8.8 0 16-7.2 16-16v-32c0-8.8-7.2-16-16-16zm64-320c-26.5 0-48 21.5-48 48 0 7.1 1.6 13.7 4.4 19.8L476 239.2c-15.4 9.2-35.3 4-44.2-11.6L350.3 85C361 76.2 368 63 368 48c0-26.5-21.5-48-48-48s-48 21.5-48 48c0 15 7 28.2 17.7 37l-81.5 142.6c-8.9 15.6-28.9 20.8-44.2 11.6l-72.3-43.4c2.7-6 4.4-12.7 4.4-19.8 0-26.5-21.5-48-48-48S0 149.5 0 176s21.5 48 48 48c2.6 0 5.2-.4 7.7-.8L128 416h384l72.3-192.8c2.5.4 5.1.8 7.7.8 26.5 0 48-21.5 48-48s-21.5-48-48-48z\"]\n};\nvar faCrutch = {\n prefix: 'fas',\n iconName: 'crutch',\n icon: [512, 512, [], \"f7f7\", \"M507.31 185.71l-181-181a16 16 0 0 0-22.62 0L281 27.31a16 16 0 0 0 0 22.63l181 181a16 16 0 0 0 22.63 0l22.62-22.63a16 16 0 0 0 .06-22.6zm-179.54 66.41l-67.89-67.89 55.1-55.1-45.25-45.25-109.67 109.67a96.08 96.08 0 0 0-25.67 46.29L106.65 360.1l-102 102a16 16 0 0 0 0 22.63l22.62 22.62a16 16 0 0 0 22.63 0l102-102 120.25-27.75a95.88 95.88 0 0 0 46.29-25.65l109.68-109.68L382.87 197zm-54.57 54.57a32 32 0 0 1-15.45 8.54l-79.3 18.32 18.3-79.3a32.22 32.22 0 0 1 8.56-15.45l9.31-9.31 67.89 67.89z\"]\n};\nvar faCube = {\n prefix: 'fas',\n iconName: 'cube',\n icon: [512, 512, [], \"f1b2\", \"M239.1 6.3l-208 78c-18.7 7-31.1 25-31.1 45v225.1c0 18.2 10.3 34.8 26.5 42.9l208 104c13.5 6.8 29.4 6.8 42.9 0l208-104c16.3-8.1 26.5-24.8 26.5-42.9V129.3c0-20-12.4-37.9-31.1-44.9l-208-78C262 2.2 250 2.2 239.1 6.3zM256 68.4l192 72v1.1l-192 78-192-78v-1.1l192-72zm32 356V275.5l160-65v133.9l-160 80z\"]\n};\nvar faCubes = {\n prefix: 'fas',\n iconName: 'cubes',\n icon: [512, 512, [], \"f1b3\", \"M488.6 250.2L392 214V105.5c0-15-9.3-28.4-23.4-33.7l-100-37.5c-8.1-3.1-17.1-3.1-25.3 0l-100 37.5c-14.1 5.3-23.4 18.7-23.4 33.7V214l-96.6 36.2C9.3 255.5 0 268.9 0 283.9V394c0 13.6 7.7 26.1 19.9 32.2l100 50c10.1 5.1 22.1 5.1 32.2 0l103.9-52 103.9 52c10.1 5.1 22.1 5.1 32.2 0l100-50c12.2-6.1 19.9-18.6 19.9-32.2V283.9c0-15-9.3-28.4-23.4-33.7zM358 214.8l-85 31.9v-68.2l85-37v73.3zM154 104.1l102-38.2 102 38.2v.6l-102 41.4-102-41.4v-.6zm84 291.1l-85 42.5v-79.1l85-38.8v75.4zm0-112l-102 41.4-102-41.4v-.6l102-38.2 102 38.2v.6zm240 112l-85 42.5v-79.1l85-38.8v75.4zm0-112l-102 41.4-102-41.4v-.6l102-38.2 102 38.2v.6z\"]\n};\nvar faCut = {\n prefix: 'fas',\n iconName: 'cut',\n icon: [448, 512, [], \"f0c4\", \"M278.06 256L444.48 89.57c4.69-4.69 4.69-12.29 0-16.97-32.8-32.8-85.99-32.8-118.79 0L210.18 188.12l-24.86-24.86c4.31-10.92 6.68-22.81 6.68-35.26 0-53.02-42.98-96-96-96S0 74.98 0 128s42.98 96 96 96c4.54 0 8.99-.32 13.36-.93L142.29 256l-32.93 32.93c-4.37-.61-8.83-.93-13.36-.93-53.02 0-96 42.98-96 96s42.98 96 96 96 96-42.98 96-96c0-12.45-2.37-24.34-6.68-35.26l24.86-24.86L325.69 439.4c32.8 32.8 85.99 32.8 118.79 0 4.69-4.68 4.69-12.28 0-16.97L278.06 256zM96 160c-17.64 0-32-14.36-32-32s14.36-32 32-32 32 14.36 32 32-14.36 32-32 32zm0 256c-17.64 0-32-14.36-32-32s14.36-32 32-32 32 14.36 32 32-14.36 32-32 32z\"]\n};\nvar faDatabase = {\n prefix: 'fas',\n iconName: 'database',\n icon: [448, 512, [], \"f1c0\", \"M448 73.143v45.714C448 159.143 347.667 192 224 192S0 159.143 0 118.857V73.143C0 32.857 100.333 0 224 0s224 32.857 224 73.143zM448 176v102.857C448 319.143 347.667 352 224 352S0 319.143 0 278.857V176c48.125 33.143 136.208 48.572 224 48.572S399.874 209.143 448 176zm0 160v102.857C448 479.143 347.667 512 224 512S0 479.143 0 438.857V336c48.125 33.143 136.208 48.572 224 48.572S399.874 369.143 448 336z\"]\n};\nvar faDeaf = {\n prefix: 'fas',\n iconName: 'deaf',\n icon: [512, 512, [], \"f2a4\", \"M216 260c0 15.464-12.536 28-28 28s-28-12.536-28-28c0-44.112 35.888-80 80-80s80 35.888 80 80c0 15.464-12.536 28-28 28s-28-12.536-28-28c0-13.234-10.767-24-24-24s-24 10.766-24 24zm24-176c-97.047 0-176 78.953-176 176 0 15.464 12.536 28 28 28s28-12.536 28-28c0-66.168 53.832-120 120-120s120 53.832 120 120c0 75.164-71.009 70.311-71.997 143.622L288 404c0 28.673-23.327 52-52 52-15.464 0-28 12.536-28 28s12.536 28 28 28c59.475 0 107.876-48.328 108-107.774.595-34.428 72-48.24 72-144.226 0-97.047-78.953-176-176-176zm268.485-52.201L480.2 3.515c-4.687-4.686-12.284-4.686-16.971 0L376.2 90.544c-4.686 4.686-4.686 12.284 0 16.971l28.285 28.285c4.686 4.686 12.284 4.686 16.97 0l87.03-87.029c4.687-4.688 4.687-12.286 0-16.972zM168.97 314.745c-4.686-4.686-12.284-4.686-16.97 0L3.515 463.23c-4.686 4.686-4.686 12.284 0 16.971L31.8 508.485c4.687 4.686 12.284 4.686 16.971 0L197.256 360c4.686-4.686 4.686-12.284 0-16.971l-28.286-28.284z\"]\n};\nvar faDemocrat = {\n prefix: 'fas',\n iconName: 'democrat',\n icon: [640, 512, [], \"f747\", \"M637.3 256.9l-19.6-29.4c-28.2-42.3-75.3-67.5-126.1-67.5H256l-81.2-81.2c20.1-20.1 22.6-51.1 7.5-73.9-3.4-5.2-10.8-5.9-15.2-1.5l-41.8 41.8L82.4 2.4c-3.6-3.6-9.6-3-12.4 1.2-12.3 18.6-10.3 44 6.1 60.4 3.3 3.3 7.3 5.3 11.3 7.5-2.2 1.7-4.7 3.1-6.4 5.4L6.4 176.2c-7.3 9.7-8.4 22.7-3 33.5l14.3 28.6c5.4 10.8 16.5 17.7 28.6 17.7h31c8.5 0 16.6-3.4 22.6-9.4L138 212l54 108h352v-77.8c16.2 12.2 18.3 17.6 40.1 50.3 4.9 7.4 14.8 9.3 22.2 4.4l26.6-17.7c7.3-5 9.3-14.9 4.4-22.3zm-341.1-13.6l-16.5 16.1 3.9 22.7c.7 4.1-3.6 7.2-7.2 5.3L256 276.7l-20.4 10.7c-3.6 1.9-7.9-1.2-7.2-5.3l3.9-22.7-16.5-16.1c-3-2.9-1.3-7.9 2.8-8.5l22.8-3.3 10.2-20.7c1.8-3.7 7.1-3.7 9 0l10.2 20.7 22.8 3.3c4 .6 5.6 5.6 2.6 8.5zm112 0l-16.5 16.1 3.9 22.7c.7 4.1-3.6 7.2-7.2 5.3L368 276.7l-20.4 10.7c-3.6 1.9-7.9-1.2-7.2-5.3l3.9-22.7-16.5-16.1c-3-2.9-1.3-7.9 2.8-8.5l22.8-3.3 10.2-20.7c1.8-3.7 7.1-3.7 9 0l10.2 20.7 22.8 3.3c4 .6 5.6 5.6 2.6 8.5zm112 0l-16.5 16.1 3.9 22.7c.7 4.1-3.6 7.2-7.2 5.3L480 276.7l-20.4 10.7c-3.6 1.9-7.9-1.2-7.2-5.3l3.9-22.7-16.5-16.1c-3-2.9-1.3-7.9 2.8-8.5l22.8-3.3 10.2-20.7c1.8-3.7 7.1-3.7 9 0l10.2 20.7 22.8 3.3c4 .6 5.6 5.6 2.6 8.5zM192 496c0 8.8 7.2 16 16 16h64c8.8 0 16-7.2 16-16v-80h160v80c0 8.8 7.2 16 16 16h64c8.8 0 16-7.2 16-16V352H192v144z\"]\n};\nvar faDesktop = {\n prefix: 'fas',\n iconName: 'desktop',\n icon: [576, 512, [], \"f108\", \"M528 0H48C21.5 0 0 21.5 0 48v320c0 26.5 21.5 48 48 48h192l-16 48h-72c-13.3 0-24 10.7-24 24s10.7 24 24 24h272c13.3 0 24-10.7 24-24s-10.7-24-24-24h-72l-16-48h192c26.5 0 48-21.5 48-48V48c0-26.5-21.5-48-48-48zm-16 352H64V64h448v288z\"]\n};\nvar faDharmachakra = {\n prefix: 'fas',\n iconName: 'dharmachakra',\n icon: [512, 512, [], \"f655\", \"M495 225.06l-17.22 1.08c-5.27-39.49-20.79-75.64-43.86-105.84l12.95-11.43c6.92-6.11 7.25-16.79.73-23.31L426.44 64.4c-6.53-6.53-17.21-6.19-23.31.73L391.7 78.07c-30.2-23.06-66.35-38.58-105.83-43.86L286.94 17c.58-9.21-6.74-17-15.97-17h-29.94c-9.23 0-16.54 7.79-15.97 17l1.08 17.22c-39.49 5.27-75.64 20.79-105.83 43.86l-11.43-12.95c-6.11-6.92-16.79-7.25-23.31-.73L64.4 85.56c-6.53 6.53-6.19 17.21.73 23.31l12.95 11.43c-23.06 30.2-38.58 66.35-43.86 105.84L17 225.06c-9.21-.58-17 6.74-17 15.97v29.94c0 9.23 7.79 16.54 17 15.97l17.22-1.08c5.27 39.49 20.79 75.64 43.86 105.83l-12.95 11.43c-6.92 6.11-7.25 16.79-.73 23.31l21.17 21.17c6.53 6.53 17.21 6.19 23.31-.73l11.43-12.95c30.2 23.06 66.35 38.58 105.84 43.86L225.06 495c-.58 9.21 6.74 17 15.97 17h29.94c9.23 0 16.54-7.79 15.97-17l-1.08-17.22c39.49-5.27 75.64-20.79 105.84-43.86l11.43 12.95c6.11 6.92 16.79 7.25 23.31.73l21.17-21.17c6.53-6.53 6.19-17.21-.73-23.31l-12.95-11.43c23.06-30.2 38.58-66.35 43.86-105.83l17.22 1.08c9.21.58 17-6.74 17-15.97v-29.94c-.01-9.23-7.8-16.54-17.01-15.97zM281.84 98.61c24.81 4.07 47.63 13.66 67.23 27.78l-42.62 48.29c-8.73-5.44-18.32-9.54-28.62-11.95l4.01-64.12zm-51.68 0l4.01 64.12c-10.29 2.41-19.89 6.52-28.62 11.95l-42.62-48.29c19.6-14.12 42.42-23.71 67.23-27.78zm-103.77 64.33l48.3 42.61c-5.44 8.73-9.54 18.33-11.96 28.62l-64.12-4.01c4.07-24.81 13.66-47.62 27.78-67.22zm-27.78 118.9l64.12-4.01c2.41 10.29 6.52 19.89 11.95 28.62l-48.29 42.62c-14.12-19.6-23.71-42.42-27.78-67.23zm131.55 131.55c-24.81-4.07-47.63-13.66-67.23-27.78l42.61-48.3c8.73 5.44 18.33 9.54 28.62 11.96l-4 64.12zM256 288c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm25.84 125.39l-4.01-64.12c10.29-2.41 19.89-6.52 28.62-11.96l42.61 48.3c-19.6 14.12-42.41 23.71-67.22 27.78zm103.77-64.33l-48.29-42.62c5.44-8.73 9.54-18.32 11.95-28.62l64.12 4.01c-4.07 24.82-13.66 47.64-27.78 67.23zm-36.34-114.89c-2.41-10.29-6.52-19.89-11.96-28.62l48.3-42.61c14.12 19.6 23.71 42.42 27.78 67.23l-64.12 4z\"]\n};\nvar faDiagnoses = {\n prefix: 'fas',\n iconName: 'diagnoses',\n icon: [640, 512, [], \"f470\", \"M496 256c8.8 0 16-7.2 16-16s-7.2-16-16-16-16 7.2-16 16 7.2 16 16 16zm-176-80c48.5 0 88-39.5 88-88S368.5 0 320 0s-88 39.5-88 88 39.5 88 88 88zM59.8 364c10.2 15.3 29.3 17.8 42.9 9.8 16.2-9.6 56.2-31.7 105.3-48.6V416h224v-90.7c49.1 16.8 89.1 39 105.3 48.6 13.6 8 32.7 5.3 42.9-9.8l17.8-26.7c8.8-13.2 7.6-34.6-10-45.1-11.9-7.1-29.7-17-51.1-27.4-28.1 46.1-99.4 17.8-87.7-35.1C409.3 217.2 365.1 208 320 208c-57 0-112.9 14.5-160 32.2-.2 40.2-47.6 63.3-79.2 36-11.2 6-21.3 11.6-28.7 16-17.6 10.5-18.8 31.8-10 45.1L59.8 364zM368 344c13.3 0 24 10.7 24 24s-10.7 24-24 24-24-10.7-24-24 10.7-24 24-24zm-96-96c13.3 0 24 10.7 24 24s-10.7 24-24 24-24-10.7-24-24 10.7-24 24-24zm-160 8c8.8 0 16-7.2 16-16s-7.2-16-16-16-16 7.2-16 16 7.2 16 16 16zm512 192H16c-8.8 0-16 7.2-16 16v32c0 8.8 7.2 16 16 16h608c8.8 0 16-7.2 16-16v-32c0-8.8-7.2-16-16-16z\"]\n};\nvar faDice = {\n prefix: 'fas',\n iconName: 'dice',\n icon: [640, 512, [], \"f522\", \"M592 192H473.26c12.69 29.59 7.12 65.2-17 89.32L320 417.58V464c0 26.51 21.49 48 48 48h224c26.51 0 48-21.49 48-48V240c0-26.51-21.49-48-48-48zM480 376c-13.25 0-24-10.75-24-24 0-13.26 10.75-24 24-24s24 10.74 24 24c0 13.25-10.75 24-24 24zm-46.37-186.7L258.7 14.37c-19.16-19.16-50.23-19.16-69.39 0L14.37 189.3c-19.16 19.16-19.16 50.23 0 69.39L189.3 433.63c19.16 19.16 50.23 19.16 69.39 0L433.63 258.7c19.16-19.17 19.16-50.24 0-69.4zM96 248c-13.25 0-24-10.75-24-24 0-13.26 10.75-24 24-24s24 10.74 24 24c0 13.25-10.75 24-24 24zm128 128c-13.25 0-24-10.75-24-24 0-13.26 10.75-24 24-24s24 10.74 24 24c0 13.25-10.75 24-24 24zm0-128c-13.25 0-24-10.75-24-24 0-13.26 10.75-24 24-24s24 10.74 24 24c0 13.25-10.75 24-24 24zm0-128c-13.25 0-24-10.75-24-24 0-13.26 10.75-24 24-24s24 10.74 24 24c0 13.25-10.75 24-24 24zm128 128c-13.25 0-24-10.75-24-24 0-13.26 10.75-24 24-24s24 10.74 24 24c0 13.25-10.75 24-24 24z\"]\n};\nvar faDiceD20 = {\n prefix: 'fas',\n iconName: 'dice-d20',\n icon: [480, 512, [], \"f6cf\", \"M106.75 215.06L1.2 370.95c-3.08 5 .1 11.5 5.93 12.14l208.26 22.07-108.64-190.1zM7.41 315.43L82.7 193.08 6.06 147.1c-2.67-1.6-6.06.32-6.06 3.43v162.81c0 4.03 5.29 5.53 7.41 2.09zM18.25 423.6l194.4 87.66c5.3 2.45 11.35-1.43 11.35-7.26v-65.67l-203.55-22.3c-4.45-.5-6.23 5.59-2.2 7.57zm81.22-257.78L179.4 22.88c4.34-7.06-3.59-15.25-10.78-11.14L17.81 110.35c-2.47 1.62-2.39 5.26.13 6.78l81.53 48.69zM240 176h109.21L253.63 7.62C250.5 2.54 245.25 0 240 0s-10.5 2.54-13.63 7.62L130.79 176H240zm233.94-28.9l-76.64 45.99 75.29 122.35c2.11 3.44 7.41 1.94 7.41-2.1V150.53c0-3.11-3.39-5.03-6.06-3.43zm-93.41 18.72l81.53-48.7c2.53-1.52 2.6-5.16.13-6.78l-150.81-98.6c-7.19-4.11-15.12 4.08-10.78 11.14l79.93 142.94zm79.02 250.21L256 438.32v65.67c0 5.84 6.05 9.71 11.35 7.26l194.4-87.66c4.03-1.97 2.25-8.06-2.2-7.56zm-86.3-200.97l-108.63 190.1 208.26-22.07c5.83-.65 9.01-7.14 5.93-12.14L373.25 215.06zM240 208H139.57L240 383.75 340.43 208H240z\"]\n};\nvar faDiceD6 = {\n prefix: 'fas',\n iconName: 'dice-d6',\n icon: [448, 512, [], \"f6d1\", \"M422.19 109.95L256.21 9.07c-19.91-12.1-44.52-12.1-64.43 0L25.81 109.95c-5.32 3.23-5.29 11.27.06 14.46L224 242.55l198.14-118.14c5.35-3.19 5.38-11.22.05-14.46zm13.84 44.63L240 271.46v223.82c0 12.88 13.39 20.91 24.05 14.43l152.16-92.48c19.68-11.96 31.79-33.94 31.79-57.7v-197.7c0-6.41-6.64-10.43-11.97-7.25zM0 161.83v197.7c0 23.77 12.11 45.74 31.79 57.7l152.16 92.47c10.67 6.48 24.05-1.54 24.05-14.43V271.46L11.97 154.58C6.64 151.4 0 155.42 0 161.83z\"]\n};\nvar faDiceFive = {\n prefix: 'fas',\n iconName: 'dice-five',\n icon: [448, 512, [], \"f523\", \"M384 32H64C28.65 32 0 60.65 0 96v320c0 35.35 28.65 64 64 64h320c35.35 0 64-28.65 64-64V96c0-35.35-28.65-64-64-64zM128 384c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm0-192c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm96 96c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm96 96c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm0-192c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32z\"]\n};\nvar faDiceFour = {\n prefix: 'fas',\n iconName: 'dice-four',\n icon: [448, 512, [], \"f524\", \"M384 32H64C28.65 32 0 60.65 0 96v320c0 35.35 28.65 64 64 64h320c35.35 0 64-28.65 64-64V96c0-35.35-28.65-64-64-64zM128 384c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm0-192c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm192 192c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm0-192c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32z\"]\n};\nvar faDiceOne = {\n prefix: 'fas',\n iconName: 'dice-one',\n icon: [448, 512, [], \"f525\", \"M384 32H64C28.65 32 0 60.65 0 96v320c0 35.35 28.65 64 64 64h320c35.35 0 64-28.65 64-64V96c0-35.35-28.65-64-64-64zM224 288c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32z\"]\n};\nvar faDiceSix = {\n prefix: 'fas',\n iconName: 'dice-six',\n icon: [448, 512, [], \"f526\", \"M384 32H64C28.65 32 0 60.65 0 96v320c0 35.35 28.65 64 64 64h320c35.35 0 64-28.65 64-64V96c0-35.35-28.65-64-64-64zM128 384c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm0-96c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm0-96c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm192 192c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm0-96c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm0-96c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32z\"]\n};\nvar faDiceThree = {\n prefix: 'fas',\n iconName: 'dice-three',\n icon: [448, 512, [], \"f527\", \"M384 32H64C28.65 32 0 60.65 0 96v320c0 35.35 28.65 64 64 64h320c35.35 0 64-28.65 64-64V96c0-35.35-28.65-64-64-64zM128 192c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm96 96c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm96 96c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32z\"]\n};\nvar faDiceTwo = {\n prefix: 'fas',\n iconName: 'dice-two',\n icon: [448, 512, [], \"f528\", \"M384 32H64C28.65 32 0 60.65 0 96v320c0 35.35 28.65 64 64 64h320c35.35 0 64-28.65 64-64V96c0-35.35-28.65-64-64-64zM128 192c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm192 192c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32z\"]\n};\nvar faDigitalTachograph = {\n prefix: 'fas',\n iconName: 'digital-tachograph',\n icon: [640, 512, [], \"f566\", \"M608 96H32c-17.67 0-32 14.33-32 32v256c0 17.67 14.33 32 32 32h576c17.67 0 32-14.33 32-32V128c0-17.67-14.33-32-32-32zM304 352c0 4.42-3.58 8-8 8H72c-4.42 0-8-3.58-8-8v-8c0-4.42 3.58-8 8-8h224c4.42 0 8 3.58 8 8v8zM72 288v-16c0-4.42 3.58-8 8-8h16c4.42 0 8 3.58 8 8v16c0 4.42-3.58 8-8 8H80c-4.42 0-8-3.58-8-8zm64 0v-16c0-4.42 3.58-8 8-8h16c4.42 0 8 3.58 8 8v16c0 4.42-3.58 8-8 8h-16c-4.42 0-8-3.58-8-8zm64 0v-16c0-4.42 3.58-8 8-8h16c4.42 0 8 3.58 8 8v16c0 4.42-3.58 8-8 8h-16c-4.42 0-8-3.58-8-8zm64 0v-16c0-4.42 3.58-8 8-8h16c4.42 0 8 3.58 8 8v16c0 4.42-3.58 8-8 8h-16c-4.42 0-8-3.58-8-8zm40-64c0 8.84-7.16 16-16 16H80c-8.84 0-16-7.16-16-16v-48c0-8.84 7.16-16 16-16h208c8.84 0 16 7.16 16 16v48zm272 128c0 4.42-3.58 8-8 8H344c-4.42 0-8-3.58-8-8v-8c0-4.42 3.58-8 8-8h224c4.42 0 8 3.58 8 8v8z\"]\n};\nvar faDirections = {\n prefix: 'fas',\n iconName: 'directions',\n icon: [512, 512, [], \"f5eb\", \"M502.61 233.32L278.68 9.39c-12.52-12.52-32.83-12.52-45.36 0L9.39 233.32c-12.52 12.53-12.52 32.83 0 45.36l223.93 223.93c12.52 12.53 32.83 12.53 45.36 0l223.93-223.93c12.52-12.53 12.52-32.83 0-45.36zm-100.98 12.56l-84.21 77.73c-5.12 4.73-13.43 1.1-13.43-5.88V264h-96v64c0 4.42-3.58 8-8 8h-32c-4.42 0-8-3.58-8-8v-80c0-17.67 14.33-32 32-32h112v-53.73c0-6.97 8.3-10.61 13.43-5.88l84.21 77.73c3.43 3.17 3.43 8.59 0 11.76z\"]\n};\nvar faDivide = {\n prefix: 'fas',\n iconName: 'divide',\n icon: [448, 512, [], \"f529\", \"M224 352c-35.35 0-64 28.65-64 64s28.65 64 64 64 64-28.65 64-64-28.65-64-64-64zm0-192c35.35 0 64-28.65 64-64s-28.65-64-64-64-64 28.65-64 64 28.65 64 64 64zm192 48H32c-17.67 0-32 14.33-32 32v32c0 17.67 14.33 32 32 32h384c17.67 0 32-14.33 32-32v-32c0-17.67-14.33-32-32-32z\"]\n};\nvar faDizzy = {\n prefix: 'fas',\n iconName: 'dizzy',\n icon: [496, 512, [], \"f567\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm-96 206.6l-28.7 28.7c-14.8 14.8-37.8-7.5-22.6-22.6l28.7-28.7-28.7-28.7c-15-15 7.7-37.6 22.6-22.6l28.7 28.7 28.7-28.7c15-15 37.6 7.7 22.6 22.6L174.6 192l28.7 28.7c15.2 15.2-7.9 37.4-22.6 22.6L152 214.6zM248 416c-35.3 0-64-28.7-64-64s28.7-64 64-64 64 28.7 64 64-28.7 64-64 64zm147.3-195.3c15.2 15.2-7.9 37.4-22.6 22.6L344 214.6l-28.7 28.7c-14.8 14.8-37.8-7.5-22.6-22.6l28.7-28.7-28.7-28.7c-15-15 7.7-37.6 22.6-22.6l28.7 28.7 28.7-28.7c15-15 37.6 7.7 22.6 22.6L366.6 192l28.7 28.7z\"]\n};\nvar faDna = {\n prefix: 'fas',\n iconName: 'dna',\n icon: [448, 512, [], \"f471\", \"M.1 494.1c-1.1 9.5 6.3 17.8 15.9 17.8l32.3.1c8.1 0 14.9-5.9 16-13.9.7-4.9 1.8-11.1 3.4-18.1H380c1.6 6.9 2.9 13.2 3.5 18.1 1.1 8 7.9 14 16 13.9l32.3-.1c9.6 0 17.1-8.3 15.9-17.8-4.6-37.9-25.6-129-118.9-207.7-17.6 12.4-37.1 24.2-58.5 35.4 6.2 4.6 11.4 9.4 17 14.2H159.7c21.3-18.1 47-35.6 78.7-51.4C410.5 199.1 442.1 65.8 447.9 17.9 449 8.4 441.6.1 432 .1L399.6 0c-8.1 0-14.9 5.9-16 13.9-.7 4.9-1.8 11.1-3.4 18.1H67.8c-1.6-7-2.7-13.1-3.4-18.1-1.1-8-7.9-14-16-13.9L16.1.1C6.5.1-1 8.4.1 17.9 5.3 60.8 31.4 171.8 160 256 31.5 340.2 5.3 451.2.1 494.1zM224 219.6c-25.1-13.7-46.4-28.4-64.3-43.6h128.5c-17.8 15.2-39.1 30-64.2 43.6zM355.1 96c-5.8 10.4-12.8 21.1-21 32H114c-8.3-10.9-15.3-21.6-21-32h262.1zM92.9 416c5.8-10.4 12.8-21.1 21-32h219.4c8.3 10.9 15.4 21.6 21.2 32H92.9z\"]\n};\nvar faDog = {\n prefix: 'fas',\n iconName: 'dog',\n icon: [512, 512, [], \"f6d3\", \"M496 96h-64l-7.16-14.31A32 32 0 0 0 396.22 64H342.6l-27.28-27.28C305.23 26.64 288 33.78 288 48.03v149.84l128 45.71V208h32c35.35 0 64-28.65 64-64v-32c0-8.84-7.16-16-16-16zm-112 48c-8.84 0-16-7.16-16-16s7.16-16 16-16 16 7.16 16 16-7.16 16-16 16zM96 224c-17.64 0-32-14.36-32-32 0-17.67-14.33-32-32-32S0 174.33 0 192c0 41.66 26.83 76.85 64 90.1V496c0 8.84 7.16 16 16 16h64c8.84 0 16-7.16 16-16V384h160v112c0 8.84 7.16 16 16 16h64c8.84 0 16-7.16 16-16V277.55L266.05 224H96z\"]\n};\nvar faDollarSign = {\n prefix: 'fas',\n iconName: 'dollar-sign',\n icon: [288, 512, [], \"f155\", \"M209.2 233.4l-108-31.6C88.7 198.2 80 186.5 80 173.5c0-16.3 13.2-29.5 29.5-29.5h66.3c12.2 0 24.2 3.7 34.2 10.5 6.1 4.1 14.3 3.1 19.5-2l34.8-34c7.1-6.9 6.1-18.4-1.8-24.5C238 74.8 207.4 64.1 176 64V16c0-8.8-7.2-16-16-16h-32c-8.8 0-16 7.2-16 16v48h-2.5C45.8 64-5.4 118.7.5 183.6c4.2 46.1 39.4 83.6 83.8 96.6l102.5 30c12.5 3.7 21.2 15.3 21.2 28.3 0 16.3-13.2 29.5-29.5 29.5h-66.3C100 368 88 364.3 78 357.5c-6.1-4.1-14.3-3.1-19.5 2l-34.8 34c-7.1 6.9-6.1 18.4 1.8 24.5 24.5 19.2 55.1 29.9 86.5 30v48c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16v-48.2c46.6-.9 90.3-28.6 105.7-72.7 21.5-61.6-14.6-124.8-72.5-141.7z\"]\n};\nvar faDolly = {\n prefix: 'fas',\n iconName: 'dolly',\n icon: [576, 512, [], \"f472\", \"M294.2 277.7c18 5 34.7 13.4 49.5 24.7l161.5-53.8c8.4-2.8 12.9-11.9 10.1-20.2L454.9 47.2c-2.8-8.4-11.9-12.9-20.2-10.1l-61.1 20.4 33.1 99.4L346 177l-33.1-99.4-61.6 20.5c-8.4 2.8-12.9 11.9-10.1 20.2l53 159.4zm281 48.7L565 296c-2.8-8.4-11.9-12.9-20.2-10.1l-213.5 71.2c-17.2-22-43.6-36.4-73.5-37L158.4 21.9C154 8.8 141.8 0 128 0H16C7.2 0 0 7.2 0 16v32c0 8.8 7.2 16 16 16h88.9l92.2 276.7c-26.1 20.4-41.7 53.6-36 90.5 6.1 39.4 37.9 72.3 77.3 79.2 60.2 10.7 112.3-34.8 113.4-92.6l213.3-71.2c8.3-2.8 12.9-11.8 10.1-20.2zM256 464c-26.5 0-48-21.5-48-48s21.5-48 48-48 48 21.5 48 48-21.5 48-48 48z\"]\n};\nvar faDollyFlatbed = {\n prefix: 'fas',\n iconName: 'dolly-flatbed',\n icon: [640, 512, [], \"f474\", \"M208 320h384c8.8 0 16-7.2 16-16V48c0-8.8-7.2-16-16-16H448v128l-48-32-48 32V32H208c-8.8 0-16 7.2-16 16v256c0 8.8 7.2 16 16 16zm416 64H128V16c0-8.8-7.2-16-16-16H16C7.2 0 0 7.2 0 16v32c0 8.8 7.2 16 16 16h48v368c0 8.8 7.2 16 16 16h82.9c-1.8 5-2.9 10.4-2.9 16 0 26.5 21.5 48 48 48s48-21.5 48-48c0-5.6-1.2-11-2.9-16H451c-1.8 5-2.9 10.4-2.9 16 0 26.5 21.5 48 48 48s48-21.5 48-48c0-5.6-1.2-11-2.9-16H624c8.8 0 16-7.2 16-16v-32c0-8.8-7.2-16-16-16z\"]\n};\nvar faDonate = {\n prefix: 'fas',\n iconName: 'donate',\n icon: [512, 512, [], \"f4b9\", \"M256 416c114.9 0 208-93.1 208-208S370.9 0 256 0 48 93.1 48 208s93.1 208 208 208zM233.8 97.4V80.6c0-9.2 7.4-16.6 16.6-16.6h11.1c9.2 0 16.6 7.4 16.6 16.6v17c15.5.8 30.5 6.1 43 15.4 5.6 4.1 6.2 12.3 1.2 17.1L306 145.6c-3.8 3.7-9.5 3.8-14 1-5.4-3.4-11.4-5.1-17.8-5.1h-38.9c-9 0-16.3 8.2-16.3 18.3 0 8.2 5 15.5 12.1 17.6l62.3 18.7c25.7 7.7 43.7 32.4 43.7 60.1 0 34-26.4 61.5-59.1 62.4v16.8c0 9.2-7.4 16.6-16.6 16.6h-11.1c-9.2 0-16.6-7.4-16.6-16.6v-17c-15.5-.8-30.5-6.1-43-15.4-5.6-4.1-6.2-12.3-1.2-17.1l16.3-15.5c3.8-3.7 9.5-3.8 14-1 5.4 3.4 11.4 5.1 17.8 5.1h38.9c9 0 16.3-8.2 16.3-18.3 0-8.2-5-15.5-12.1-17.6l-62.3-18.7c-25.7-7.7-43.7-32.4-43.7-60.1.1-34 26.4-61.5 59.1-62.4zM480 352h-32.5c-19.6 26-44.6 47.7-73 64h63.8c5.3 0 9.6 3.6 9.6 8v16c0 4.4-4.3 8-9.6 8H73.6c-5.3 0-9.6-3.6-9.6-8v-16c0-4.4 4.3-8 9.6-8h63.8c-28.4-16.3-53.3-38-73-64H32c-17.7 0-32 14.3-32 32v96c0 17.7 14.3 32 32 32h448c17.7 0 32-14.3 32-32v-96c0-17.7-14.3-32-32-32z\"]\n};\nvar faDoorClosed = {\n prefix: 'fas',\n iconName: 'door-closed',\n icon: [640, 512, [], \"f52a\", \"M624 448H512V50.8C512 22.78 490.47 0 464 0H175.99c-26.47 0-48 22.78-48 50.8V448H16c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h608c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16zM415.99 288c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32c.01 17.67-14.32 32-32 32z\"]\n};\nvar faDoorOpen = {\n prefix: 'fas',\n iconName: 'door-open',\n icon: [640, 512, [], \"f52b\", \"M624 448h-80V113.45C544 86.19 522.47 64 496 64H384v64h96v384h144c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16zM312.24 1.01l-192 49.74C105.99 54.44 96 67.7 96 82.92V448H16c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h336V33.18c0-21.58-19.56-37.41-39.76-32.17zM264 288c-13.25 0-24-14.33-24-32s10.75-32 24-32 24 14.33 24 32-10.75 32-24 32z\"]\n};\nvar faDotCircle = {\n prefix: 'fas',\n iconName: 'dot-circle',\n icon: [512, 512, [], \"f192\", \"M256 8C119.033 8 8 119.033 8 256s111.033 248 248 248 248-111.033 248-248S392.967 8 256 8zm80 248c0 44.112-35.888 80-80 80s-80-35.888-80-80 35.888-80 80-80 80 35.888 80 80z\"]\n};\nvar faDove = {\n prefix: 'fas',\n iconName: 'dove',\n icon: [512, 512, [], \"f4ba\", \"M288 167.2v-28.1c-28.2-36.3-47.1-79.3-54.1-125.2-2.1-13.5-19-18.8-27.8-8.3-21.1 24.9-37.7 54.1-48.9 86.5 34.2 38.3 80 64.6 130.8 75.1zM400 64c-44.2 0-80 35.9-80 80.1v59.4C215.6 197.3 127 133 87 41.8c-5.5-12.5-23.2-13.2-29-.9C41.4 76 32 115.2 32 156.6c0 70.8 34.1 136.9 85.1 185.9 13.2 12.7 26.1 23.2 38.9 32.8l-143.9 36C1.4 414-3.4 426.4 2.6 435.7 20 462.6 63 508.2 155.8 512c8 .3 16-2.6 22.1-7.9l65.2-56.1H320c88.4 0 160-71.5 160-159.9V128l32-64H400zm0 96.1c-8.8 0-16-7.2-16-16s7.2-16 16-16 16 7.2 16 16-7.2 16-16 16z\"]\n};\nvar faDownload = {\n prefix: 'fas',\n iconName: 'download',\n icon: [512, 512, [], \"f019\", \"M216 0h80c13.3 0 24 10.7 24 24v168h87.7c17.8 0 26.7 21.5 14.1 34.1L269.7 378.3c-7.5 7.5-19.8 7.5-27.3 0L90.1 226.1c-12.6-12.6-3.7-34.1 14.1-34.1H192V24c0-13.3 10.7-24 24-24zm296 376v112c0 13.3-10.7 24-24 24H24c-13.3 0-24-10.7-24-24V376c0-13.3 10.7-24 24-24h146.7l49 49c20.1 20.1 52.5 20.1 72.6 0l49-49H488c13.3 0 24 10.7 24 24zm-124 88c0-11-9-20-20-20s-20 9-20 20 9 20 20 20 20-9 20-20zm64 0c0-11-9-20-20-20s-20 9-20 20 9 20 20 20 20-9 20-20z\"]\n};\nvar faDraftingCompass = {\n prefix: 'fas',\n iconName: 'drafting-compass',\n icon: [512, 512, [], \"f568\", \"M457.01 344.42c-25.05 20.33-52.63 37.18-82.54 49.05l54.38 94.19 53.95 23.04c9.81 4.19 20.89-2.21 22.17-12.8l7.02-58.25-54.98-95.23zm42.49-94.56c4.86-7.67 1.89-17.99-6.05-22.39l-28.07-15.57c-7.48-4.15-16.61-1.46-21.26 5.72C403.01 281.15 332.25 320 256 320c-23.93 0-47.23-4.25-69.41-11.53l67.36-116.68c.7.02 1.34.21 2.04.21s1.35-.19 2.04-.21l51.09 88.5c31.23-8.96 59.56-25.75 82.61-48.92l-51.79-89.71C347.39 128.03 352 112.63 352 96c0-53.02-42.98-96-96-96s-96 42.98-96 96c0 16.63 4.61 32.03 12.05 45.66l-68.3 118.31c-12.55-11.61-23.96-24.59-33.68-39-4.79-7.1-13.97-9.62-21.38-5.33l-27.75 16.07c-7.85 4.54-10.63 14.9-5.64 22.47 15.57 23.64 34.69 44.21 55.98 62.02L0 439.66l7.02 58.25c1.28 10.59 12.36 16.99 22.17 12.8l53.95-23.04 70.8-122.63C186.13 377.28 220.62 384 256 384c99.05 0 190.88-51.01 243.5-134.14zM256 64c17.67 0 32 14.33 32 32s-14.33 32-32 32-32-14.33-32-32 14.33-32 32-32z\"]\n};\nvar faDragon = {\n prefix: 'fas',\n iconName: 'dragon',\n icon: [640, 512, [], \"f6d5\", \"M18.32 255.78L192 223.96l-91.28 68.69c-10.08 10.08-2.94 27.31 11.31 27.31h222.7c-9.44-26.4-14.73-54.47-14.73-83.38v-42.27l-119.73-87.6c-23.82-15.88-55.29-14.01-77.06 4.59L5.81 227.64c-12.38 10.33-3.45 30.42 12.51 28.14zm556.87 34.1l-100.66-50.31A47.992 47.992 0 0 1 448 196.65v-36.69h64l28.09 22.63c6 6 14.14 9.37 22.63 9.37h30.97a32 32 0 0 0 28.62-17.69l14.31-28.62a32.005 32.005 0 0 0-3.02-33.51l-74.53-99.38C553.02 4.7 543.54 0 533.47 0H296.02c-7.13 0-10.7 8.57-5.66 13.61L352 63.96 292.42 88.8c-5.9 2.95-5.9 11.36 0 14.31L352 127.96v108.62c0 72.08 36.03 139.39 96 179.38-195.59 6.81-344.56 41.01-434.1 60.91C5.78 478.67 0 485.88 0 494.2 0 504 7.95 512 17.76 512h499.08c63.29.01 119.61-47.56 122.99-110.76 2.52-47.28-22.73-90.4-64.64-111.36zM489.18 66.25l45.65 11.41c-2.75 10.91-12.47 18.89-24.13 18.26-12.96-.71-25.85-12.53-21.52-29.67z\"]\n};\nvar faDrawPolygon = {\n prefix: 'fas',\n iconName: 'draw-polygon',\n icon: [448, 512, [], \"f5ee\", \"M384 352c-.35 0-.67.1-1.02.1l-39.2-65.32c5.07-9.17 8.22-19.56 8.22-30.78s-3.14-21.61-8.22-30.78l39.2-65.32c.35.01.67.1 1.02.1 35.35 0 64-28.65 64-64s-28.65-64-64-64c-23.63 0-44.04 12.95-55.12 32H119.12C108.04 44.95 87.63 32 64 32 28.65 32 0 60.65 0 96c0 23.63 12.95 44.04 32 55.12v209.75C12.95 371.96 0 392.37 0 416c0 35.35 28.65 64 64 64 23.63 0 44.04-12.95 55.12-32h209.75c11.09 19.05 31.49 32 55.12 32 35.35 0 64-28.65 64-64 .01-35.35-28.64-64-63.99-64zm-288 8.88V151.12A63.825 63.825 0 0 0 119.12 128h208.36l-38.46 64.1c-.35-.01-.67-.1-1.02-.1-35.35 0-64 28.65-64 64s28.65 64 64 64c.35 0 .67-.1 1.02-.1l38.46 64.1H119.12A63.748 63.748 0 0 0 96 360.88zM272 256c0-8.82 7.18-16 16-16s16 7.18 16 16-7.18 16-16 16-16-7.18-16-16zM400 96c0 8.82-7.18 16-16 16s-16-7.18-16-16 7.18-16 16-16 16 7.18 16 16zM64 80c8.82 0 16 7.18 16 16s-7.18 16-16 16-16-7.18-16-16 7.18-16 16-16zM48 416c0-8.82 7.18-16 16-16s16 7.18 16 16-7.18 16-16 16-16-7.18-16-16zm336 16c-8.82 0-16-7.18-16-16s7.18-16 16-16 16 7.18 16 16-7.18 16-16 16z\"]\n};\nvar faDrum = {\n prefix: 'fas',\n iconName: 'drum',\n icon: [576, 512, [], \"f569\", \"M458.08 120.88l102.39-61.43c15.16-9.09 20.06-28.75 10.97-43.91C562.34.39 542.7-4.53 527.53 4.57l-160.69 96.41A629.32 629.32 0 0 0 288 96C128.94 96 0 153.31 0 224v160.83c0 30.46 24.03 58.4 64 80.37v-96.37c0-17.6 14.4-32 32-32s32 14.4 32 32v122.41c37.4 11.13 81 18.44 128 20.75V400.84c0-17.6 14.4-32 32-32s32 14.4 32 32V512c47-2.31 90.6-9.62 128-20.75V368.84c0-17.6 14.4-32 32-32s32 14.4 32 32v96.37c39.97-21.97 64-49.91 64-80.37V224.01c-.01-42.38-46.54-79.84-117.92-103.13zM288 304c-132.55 0-240-35.82-240-80s107.45-80 240-80c2.34 0 4.62.1 6.94.12l-87.41 52.44c-15.16 9.09-20.06 28.75-10.97 43.91 9.56 15.93 29.51 19.61 43.91 10.97l162.71-97.62C477.55 167.41 528 193.74 528 224.01 528 268.19 420.54 304 288 304z\"]\n};\nvar faDrumSteelpan = {\n prefix: 'fas',\n iconName: 'drum-steelpan',\n icon: [576, 512, [], \"f56a\", \"M288 32C128.94 32 0 89.31 0 160v192c0 70.69 128.94 128 288 128s288-57.31 288-128V160c0-70.69-128.94-128-288-128zm-82.99 158.36c-4.45 16.61-14.54 30.57-28.31 40.48C100.23 217.46 48 190.78 48 160c0-30.16 50.11-56.39 124.04-70.03l25.6 44.34c9.86 17.09 12.48 36.99 7.37 56.05zM288 240c-21.08 0-41.41-1-60.89-2.7 8.06-26.13 32.15-45.3 60.89-45.3s52.83 19.17 60.89 45.3C329.41 239 309.08 240 288 240zm64-144c0 35.29-28.71 64-64 64s-64-28.71-64-64V82.96c20.4-1.88 41.8-2.96 64-2.96s43.6 1.08 64 2.96V96zm46.93 134.9c-13.81-9.91-23.94-23.9-28.4-40.54-5.11-19.06-2.49-38.96 7.38-56.04l25.65-44.42C477.72 103.5 528 129.79 528 160c0 30.83-52.4 57.54-129.07 70.9z\"]\n};\nvar faDrumstickBite = {\n prefix: 'fas',\n iconName: 'drumstick-bite',\n icon: [512, 512, [], \"f6d7\", \"M462.8 49.57a169.44 169.44 0 0 0-239.5 0C187.82 85 160.13 128 160.13 192v85.83l-40.62 40.59c-9.7 9.69-24 11.07-36.78 6a60.33 60.33 0 0 0-65 98.72C33 438.39 54.24 442.7 73.85 438.21c-4.5 19.6-.18 40.83 15.1 56.1a60.35 60.35 0 0 0 98.8-65c-5.09-12.73-3.72-27 6-36.75L234.36 352h85.89a187.87 187.87 0 0 0 61.89-10c-39.64-43.89-39.83-110.23 1.05-151.07 34.38-34.36 86.76-39.46 128.74-16.8 1.3-44.96-14.81-90.28-49.13-124.56z\"]\n};\nvar faDumbbell = {\n prefix: 'fas',\n iconName: 'dumbbell',\n icon: [640, 512, [], \"f44b\", \"M104 96H56c-13.3 0-24 10.7-24 24v104H8c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8h24v104c0 13.3 10.7 24 24 24h48c13.3 0 24-10.7 24-24V120c0-13.3-10.7-24-24-24zm528 128h-24V120c0-13.3-10.7-24-24-24h-48c-13.3 0-24 10.7-24 24v272c0 13.3 10.7 24 24 24h48c13.3 0 24-10.7 24-24V288h24c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8zM456 32h-48c-13.3 0-24 10.7-24 24v168H256V56c0-13.3-10.7-24-24-24h-48c-13.3 0-24 10.7-24 24v400c0 13.3 10.7 24 24 24h48c13.3 0 24-10.7 24-24V288h128v168c0 13.3 10.7 24 24 24h48c13.3 0 24-10.7 24-24V56c0-13.3-10.7-24-24-24z\"]\n};\nvar faDumpster = {\n prefix: 'fas',\n iconName: 'dumpster',\n icon: [576, 512, [], \"f793\", \"M560 160c10.4 0 18-9.8 15.5-19.9l-24-96C549.7 37 543.3 32 536 32h-98.9l25.6 128H560zM272 32H171.5l-25.6 128H272V32zm132.5 0H304v128h126.1L404.5 32zM16 160h97.3l25.6-128H40c-7.3 0-13.7 5-15.5 12.1l-24 96C-2 150.2 5.6 160 16 160zm544 64h-20l4-32H32l4 32H16c-8.8 0-16 7.2-16 16v32c0 8.8 7.2 16 16 16h28l20 160v16c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16v-16h320v16c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16v-16l20-160h28c8.8 0 16-7.2 16-16v-32c0-8.8-7.2-16-16-16z\"]\n};\nvar faDumpsterFire = {\n prefix: 'fas',\n iconName: 'dumpster-fire',\n icon: [640, 512, [], \"f794\", \"M418.7 104.1l.2-.2-14.4-72H304v128h60.8c16.2-19.3 34.2-38.2 53.9-55.8zM272 32H171.5l-25.6 128H272V32zm189.3 72.1c18.2 16.3 35.5 33.7 51.1 51.5 5.7-5.6 11.4-11.1 17.3-16.3l21.3-19 21.3 19c1.1.9 2.1 2.1 3.1 3.1-.1-.8.2-1.5 0-2.3l-24-96C549.7 37 543.3 32 536 32h-98.9l12.3 61.5 11.9 10.6zM16 160h97.3l25.6-128H40c-7.3 0-13.7 5-15.5 12.1l-24 96C-2 150.2 5.6 160 16 160zm324.6 32H32l4 32H16c-8.8 0-16 7.2-16 16v32c0 8.8 7.2 16 16 16h28l20 160v16c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16v-16h208.8c-30.2-33.7-48.8-77.9-48.8-126.4 0-35.9 19.9-82.9 52.6-129.6zm210.5-28.8c-14.9 13.3-28.3 27.2-40.2 41.2-19.5-25.8-43.6-52-71-76.4-70.2 62.7-120 144.3-120 193.6 0 87.5 71.6 158.4 160 158.4s160-70.9 160-158.4c.1-36.6-37-112.2-88.8-158.4zm-18.6 229.4c-14.7 10.7-32.9 17-52.5 17-49 0-88.9-33.5-88.9-88 0-27.1 16.5-51 49.4-91.9 4.7 5.6 67.1 88.1 67.1 88.1l39.8-47c2.8 4.8 5.4 9.5 7.7 14 18.6 36.7 10.8 83.6-22.6 107.8z\"]\n};\nvar faDungeon = {\n prefix: 'fas',\n iconName: 'dungeon',\n icon: [512, 512, [], \"f6d9\", \"M128.73 195.32l-82.81-51.76c-8.04-5.02-18.99-2.17-22.93 6.45A254.19 254.19 0 0 0 .54 239.28C-.05 248.37 7.59 256 16.69 256h97.13c7.96 0 14.08-6.25 15.01-14.16 1.09-9.33 3.24-18.33 6.24-26.94 2.56-7.34.25-15.46-6.34-19.58zM319.03 8C298.86 2.82 277.77 0 256 0s-42.86 2.82-63.03 8c-9.17 2.35-13.91 12.6-10.39 21.39l37.47 104.03A16.003 16.003 0 0 0 235.1 144h41.8c6.75 0 12.77-4.23 15.05-10.58l37.47-104.03c3.52-8.79-1.22-19.03-10.39-21.39zM112 288H16c-8.84 0-16 7.16-16 16v64c0 8.84 7.16 16 16 16h96c8.84 0 16-7.16 16-16v-64c0-8.84-7.16-16-16-16zm0 128H16c-8.84 0-16 7.16-16 16v64c0 8.84 7.16 16 16 16h96c8.84 0 16-7.16 16-16v-64c0-8.84-7.16-16-16-16zm77.31-283.67l-36.32-90.8c-3.53-8.83-14.13-12.99-22.42-8.31a257.308 257.308 0 0 0-71.61 59.89c-6.06 7.32-3.85 18.48 4.22 23.52l82.93 51.83c6.51 4.07 14.66 2.62 20.11-2.79 5.18-5.15 10.79-9.85 16.79-14.05 6.28-4.41 9.15-12.17 6.3-19.29zM398.18 256h97.13c9.1 0 16.74-7.63 16.15-16.72a254.135 254.135 0 0 0-22.45-89.27c-3.94-8.62-14.89-11.47-22.93-6.45l-82.81 51.76c-6.59 4.12-8.9 12.24-6.34 19.58 3.01 8.61 5.15 17.62 6.24 26.94.93 7.91 7.05 14.16 15.01 14.16zm54.85-162.89a257.308 257.308 0 0 0-71.61-59.89c-8.28-4.68-18.88-.52-22.42 8.31l-36.32 90.8c-2.85 7.12.02 14.88 6.3 19.28 6 4.2 11.61 8.9 16.79 14.05 5.44 5.41 13.6 6.86 20.11 2.79l82.93-51.83c8.07-5.03 10.29-16.19 4.22-23.51zM496 288h-96c-8.84 0-16 7.16-16 16v64c0 8.84 7.16 16 16 16h96c8.84 0 16-7.16 16-16v-64c0-8.84-7.16-16-16-16zm0 128h-96c-8.84 0-16 7.16-16 16v64c0 8.84 7.16 16 16 16h96c8.84 0 16-7.16 16-16v-64c0-8.84-7.16-16-16-16zM240 177.62V472c0 4.42 3.58 8 8 8h16c4.42 0 8-3.58 8-8V177.62c-5.23-.89-10.52-1.62-16-1.62s-10.77.73-16 1.62zm-64 41.51V472c0 4.42 3.58 8 8 8h16c4.42 0 8-3.58 8-8V189.36c-12.78 7.45-23.84 17.47-32 29.77zm128-29.77V472c0 4.42 3.58 8 8 8h16c4.42 0 8-3.58 8-8V219.13c-8.16-12.3-19.22-22.32-32-29.77z\"]\n};\nvar faEdit = {\n prefix: 'fas',\n iconName: 'edit',\n icon: [576, 512, [], \"f044\", \"M402.6 83.2l90.2 90.2c3.8 3.8 3.8 10 0 13.8L274.4 405.6l-92.8 10.3c-12.4 1.4-22.9-9.1-21.5-21.5l10.3-92.8L388.8 83.2c3.8-3.8 10-3.8 13.8 0zm162-22.9l-48.8-48.8c-15.2-15.2-39.9-15.2-55.2 0l-35.4 35.4c-3.8 3.8-3.8 10 0 13.8l90.2 90.2c3.8 3.8 10 3.8 13.8 0l35.4-35.4c15.2-15.3 15.2-40 0-55.2zM384 346.2V448H64V128h229.8c3.2 0 6.2-1.3 8.5-3.5l40-40c7.6-7.6 2.2-20.5-8.5-20.5H48C21.5 64 0 85.5 0 112v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V306.2c0-10.7-12.9-16-20.5-8.5l-40 40c-2.2 2.3-3.5 5.3-3.5 8.5z\"]\n};\nvar faEgg = {\n prefix: 'fas',\n iconName: 'egg',\n icon: [384, 512, [], \"f7fb\", \"M192 0C86 0 0 214 0 320s86 192 192 192 192-86 192-192S298 0 192 0z\"]\n};\nvar faEject = {\n prefix: 'fas',\n iconName: 'eject',\n icon: [448, 512, [], \"f052\", \"M448 384v64c0 17.673-14.327 32-32 32H32c-17.673 0-32-14.327-32-32v-64c0-17.673 14.327-32 32-32h384c17.673 0 32 14.327 32 32zM48.053 320h351.886c41.651 0 63.581-49.674 35.383-80.435L259.383 47.558c-19.014-20.743-51.751-20.744-70.767 0L12.67 239.565C-15.475 270.268 6.324 320 48.053 320z\"]\n};\nvar faEllipsisH = {\n prefix: 'fas',\n iconName: 'ellipsis-h',\n icon: [512, 512, [], \"f141\", \"M328 256c0 39.8-32.2 72-72 72s-72-32.2-72-72 32.2-72 72-72 72 32.2 72 72zm104-72c-39.8 0-72 32.2-72 72s32.2 72 72 72 72-32.2 72-72-32.2-72-72-72zm-352 0c-39.8 0-72 32.2-72 72s32.2 72 72 72 72-32.2 72-72-32.2-72-72-72z\"]\n};\nvar faEllipsisV = {\n prefix: 'fas',\n iconName: 'ellipsis-v',\n icon: [192, 512, [], \"f142\", \"M96 184c39.8 0 72 32.2 72 72s-32.2 72-72 72-72-32.2-72-72 32.2-72 72-72zM24 80c0 39.8 32.2 72 72 72s72-32.2 72-72S135.8 8 96 8 24 40.2 24 80zm0 352c0 39.8 32.2 72 72 72s72-32.2 72-72-32.2-72-72-72-72 32.2-72 72z\"]\n};\nvar faEnvelope = {\n prefix: 'fas',\n iconName: 'envelope',\n icon: [512, 512, [], \"f0e0\", \"M502.3 190.8c3.9-3.1 9.7-.2 9.7 4.7V400c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V195.6c0-5 5.7-7.8 9.7-4.7 22.4 17.4 52.1 39.5 154.1 113.6 21.1 15.4 56.7 47.8 92.2 47.6 35.7.3 72-32.8 92.3-47.6 102-74.1 131.6-96.3 154-113.7zM256 320c23.2.4 56.6-29.2 73.4-41.4 132.7-96.3 142.8-104.7 173.4-128.7 5.8-4.5 9.2-11.5 9.2-18.9v-19c0-26.5-21.5-48-48-48H48C21.5 64 0 85.5 0 112v19c0 7.4 3.4 14.3 9.2 18.9 30.6 23.9 40.7 32.4 173.4 128.7 16.8 12.2 50.2 41.8 73.4 41.4z\"]\n};\nvar faEnvelopeOpen = {\n prefix: 'fas',\n iconName: 'envelope-open',\n icon: [512, 512, [], \"f2b6\", \"M512 464c0 26.51-21.49 48-48 48H48c-26.51 0-48-21.49-48-48V200.724a48 48 0 0 1 18.387-37.776c24.913-19.529 45.501-35.365 164.2-121.511C199.412 29.17 232.797-.347 256 .003c23.198-.354 56.596 29.172 73.413 41.433 118.687 86.137 139.303 101.995 164.2 121.512A48 48 0 0 1 512 200.724V464zm-65.666-196.605c-2.563-3.728-7.7-4.595-11.339-1.907-22.845 16.873-55.462 40.705-105.582 77.079-16.825 12.266-50.21 41.781-73.413 41.43-23.211.344-56.559-29.143-73.413-41.43-50.114-36.37-82.734-60.204-105.582-77.079-3.639-2.688-8.776-1.821-11.339 1.907l-9.072 13.196a7.998 7.998 0 0 0 1.839 10.967c22.887 16.899 55.454 40.69 105.303 76.868 20.274 14.781 56.524 47.813 92.264 47.573 35.724.242 71.961-32.771 92.263-47.573 49.85-36.179 82.418-59.97 105.303-76.868a7.998 7.998 0 0 0 1.839-10.967l-9.071-13.196z\"]\n};\nvar faEnvelopeOpenText = {\n prefix: 'fas',\n iconName: 'envelope-open-text',\n icon: [512, 512, [], \"f658\", \"M176 216h160c8.84 0 16-7.16 16-16v-16c0-8.84-7.16-16-16-16H176c-8.84 0-16 7.16-16 16v16c0 8.84 7.16 16 16 16zm-16 80c0 8.84 7.16 16 16 16h160c8.84 0 16-7.16 16-16v-16c0-8.84-7.16-16-16-16H176c-8.84 0-16 7.16-16 16v16zm96 121.13c-16.42 0-32.84-5.06-46.86-15.19L0 250.86V464c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48V250.86L302.86 401.94c-14.02 10.12-30.44 15.19-46.86 15.19zm237.61-254.18c-8.85-6.94-17.24-13.47-29.61-22.81V96c0-26.51-21.49-48-48-48h-77.55c-3.04-2.2-5.87-4.26-9.04-6.56C312.6 29.17 279.2-.35 256 0c-23.2-.35-56.59 29.17-73.41 41.44-3.17 2.3-6 4.36-9.04 6.56H96c-26.51 0-48 21.49-48 48v44.14c-12.37 9.33-20.76 15.87-29.61 22.81A47.995 47.995 0 0 0 0 200.72v10.65l96 69.35V96h320v184.72l96-69.35v-10.65c0-14.74-6.78-28.67-18.39-37.77z\"]\n};\nvar faEnvelopeSquare = {\n prefix: 'fas',\n iconName: 'envelope-square',\n icon: [448, 512, [], \"f199\", \"M400 32H48C21.49 32 0 53.49 0 80v352c0 26.51 21.49 48 48 48h352c26.51 0 48-21.49 48-48V80c0-26.51-21.49-48-48-48zM178.117 262.104C87.429 196.287 88.353 196.121 64 177.167V152c0-13.255 10.745-24 24-24h272c13.255 0 24 10.745 24 24v25.167c-24.371 18.969-23.434 19.124-114.117 84.938-10.5 7.655-31.392 26.12-45.883 25.894-14.503.218-35.367-18.227-45.883-25.895zM384 217.775V360c0 13.255-10.745 24-24 24H88c-13.255 0-24-10.745-24-24V217.775c13.958 10.794 33.329 25.236 95.303 70.214 14.162 10.341 37.975 32.145 64.694 32.01 26.887.134 51.037-22.041 64.72-32.025 61.958-44.965 81.325-59.406 95.283-70.199z\"]\n};\nvar faEquals = {\n prefix: 'fas',\n iconName: 'equals',\n icon: [448, 512, [], \"f52c\", \"M416 304H32c-17.67 0-32 14.33-32 32v32c0 17.67 14.33 32 32 32h384c17.67 0 32-14.33 32-32v-32c0-17.67-14.33-32-32-32zm0-192H32c-17.67 0-32 14.33-32 32v32c0 17.67 14.33 32 32 32h384c17.67 0 32-14.33 32-32v-32c0-17.67-14.33-32-32-32z\"]\n};\nvar faEraser = {\n prefix: 'fas',\n iconName: 'eraser',\n icon: [512, 512, [], \"f12d\", \"M497.941 273.941c18.745-18.745 18.745-49.137 0-67.882l-160-160c-18.745-18.745-49.136-18.746-67.883 0l-256 256c-18.745 18.745-18.745 49.137 0 67.882l96 96A48.004 48.004 0 0 0 144 480h356c6.627 0 12-5.373 12-12v-40c0-6.627-5.373-12-12-12H355.883l142.058-142.059zm-302.627-62.627l137.373 137.373L265.373 416H150.628l-80-80 124.686-124.686z\"]\n};\nvar faEthernet = {\n prefix: 'fas',\n iconName: 'ethernet',\n icon: [512, 512, [], \"f796\", \"M496 192h-48v-48c0-8.8-7.2-16-16-16h-48V80c0-8.8-7.2-16-16-16H144c-8.8 0-16 7.2-16 16v48H80c-8.8 0-16 7.2-16 16v48H16c-8.8 0-16 7.2-16 16v224c0 8.8 7.2 16 16 16h80V320h32v128h64V320h32v128h64V320h32v128h64V320h32v128h80c8.8 0 16-7.2 16-16V208c0-8.8-7.2-16-16-16z\"]\n};\nvar faEuroSign = {\n prefix: 'fas',\n iconName: 'euro-sign',\n icon: [320, 512, [], \"f153\", \"M310.706 413.765c-1.314-6.63-7.835-10.872-14.424-9.369-10.692 2.439-27.422 5.413-45.426 5.413-56.763 0-101.929-34.79-121.461-85.449h113.689a12 12 0 0 0 11.708-9.369l6.373-28.36c1.686-7.502-4.019-14.631-11.708-14.631H115.22c-1.21-14.328-1.414-28.287.137-42.245H261.95a12 12 0 0 0 11.723-9.434l6.512-29.755c1.638-7.484-4.061-14.566-11.723-14.566H130.184c20.633-44.991 62.69-75.03 117.619-75.03 14.486 0 28.564 2.25 37.851 4.145 6.216 1.268 12.347-2.498 14.002-8.623l11.991-44.368c1.822-6.741-2.465-13.616-9.326-14.917C290.217 34.912 270.71 32 249.635 32 152.451 32 74.03 92.252 45.075 176H12c-6.627 0-12 5.373-12 12v29.755c0 6.627 5.373 12 12 12h21.569c-1.009 13.607-1.181 29.287-.181 42.245H12c-6.627 0-12 5.373-12 12v28.36c0 6.627 5.373 12 12 12h30.114C67.139 414.692 145.264 480 249.635 480c26.301 0 48.562-4.544 61.101-7.788 6.167-1.595 10.027-7.708 8.788-13.957l-8.818-44.49z\"]\n};\nvar faExchangeAlt = {\n prefix: 'fas',\n iconName: 'exchange-alt',\n icon: [512, 512, [], \"f362\", \"M0 168v-16c0-13.255 10.745-24 24-24h360V80c0-21.367 25.899-32.042 40.971-16.971l80 80c9.372 9.373 9.372 24.569 0 33.941l-80 80C409.956 271.982 384 261.456 384 240v-48H24c-13.255 0-24-10.745-24-24zm488 152H128v-48c0-21.314-25.862-32.08-40.971-16.971l-80 80c-9.372 9.373-9.372 24.569 0 33.941l80 80C102.057 463.997 128 453.437 128 432v-48h360c13.255 0 24-10.745 24-24v-16c0-13.255-10.745-24-24-24z\"]\n};\nvar faExclamation = {\n prefix: 'fas',\n iconName: 'exclamation',\n icon: [192, 512, [], \"f12a\", \"M176 432c0 44.112-35.888 80-80 80s-80-35.888-80-80 35.888-80 80-80 80 35.888 80 80zM25.26 25.199l13.6 272C39.499 309.972 50.041 320 62.83 320h66.34c12.789 0 23.331-10.028 23.97-22.801l13.6-272C167.425 11.49 156.496 0 142.77 0H49.23C35.504 0 24.575 11.49 25.26 25.199z\"]\n};\nvar faExclamationCircle = {\n prefix: 'fas',\n iconName: 'exclamation-circle',\n icon: [512, 512, [], \"f06a\", \"M504 256c0 136.997-111.043 248-248 248S8 392.997 8 256C8 119.083 119.043 8 256 8s248 111.083 248 248zm-248 50c-25.405 0-46 20.595-46 46s20.595 46 46 46 46-20.595 46-46-20.595-46-46-46zm-43.673-165.346l7.418 136c.347 6.364 5.609 11.346 11.982 11.346h48.546c6.373 0 11.635-4.982 11.982-11.346l7.418-136c.375-6.874-5.098-12.654-11.982-12.654h-63.383c-6.884 0-12.356 5.78-11.981 12.654z\"]\n};\nvar faExclamationTriangle = {\n prefix: 'fas',\n iconName: 'exclamation-triangle',\n icon: [576, 512, [], \"f071\", \"M569.517 440.013C587.975 472.007 564.806 512 527.94 512H48.054c-36.937 0-59.999-40.055-41.577-71.987L246.423 23.985c18.467-32.009 64.72-31.951 83.154 0l239.94 416.028zM288 354c-25.405 0-46 20.595-46 46s20.595 46 46 46 46-20.595 46-46-20.595-46-46-46zm-43.673-165.346l7.418 136c.347 6.364 5.609 11.346 11.982 11.346h48.546c6.373 0 11.635-4.982 11.982-11.346l7.418-136c.375-6.874-5.098-12.654-11.982-12.654h-63.383c-6.884 0-12.356 5.78-11.981 12.654z\"]\n};\nvar faExpand = {\n prefix: 'fas',\n iconName: 'expand',\n icon: [448, 512, [], \"f065\", \"M0 180V56c0-13.3 10.7-24 24-24h124c6.6 0 12 5.4 12 12v40c0 6.6-5.4 12-12 12H64v84c0 6.6-5.4 12-12 12H12c-6.6 0-12-5.4-12-12zM288 44v40c0 6.6 5.4 12 12 12h84v84c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12V56c0-13.3-10.7-24-24-24H300c-6.6 0-12 5.4-12 12zm148 276h-40c-6.6 0-12 5.4-12 12v84h-84c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h124c13.3 0 24-10.7 24-24V332c0-6.6-5.4-12-12-12zM160 468v-40c0-6.6-5.4-12-12-12H64v-84c0-6.6-5.4-12-12-12H12c-6.6 0-12 5.4-12 12v124c0 13.3 10.7 24 24 24h124c6.6 0 12-5.4 12-12z\"]\n};\nvar faExpandArrowsAlt = {\n prefix: 'fas',\n iconName: 'expand-arrows-alt',\n icon: [448, 512, [], \"f31e\", \"M448 344v112a23.94 23.94 0 0 1-24 24H312c-21.39 0-32.09-25.9-17-41l36.2-36.2L224 295.6 116.77 402.9 153 439c15.09 15.1 4.39 41-17 41H24a23.94 23.94 0 0 1-24-24V344c0-21.4 25.89-32.1 41-17l36.19 36.2L184.46 256 77.18 148.7 41 185c-15.1 15.1-41 4.4-41-17V56a23.94 23.94 0 0 1 24-24h112c21.39 0 32.09 25.9 17 41l-36.2 36.2L224 216.4l107.23-107.3L295 73c-15.09-15.1-4.39-41 17-41h112a23.94 23.94 0 0 1 24 24v112c0 21.4-25.89 32.1-41 17l-36.19-36.2L263.54 256l107.28 107.3L407 327.1c15.1-15.2 41-4.5 41 16.9z\"]\n};\nvar faExternalLinkAlt = {\n prefix: 'fas',\n iconName: 'external-link-alt',\n icon: [576, 512, [], \"f35d\", \"M576 24v127.984c0 21.461-25.96 31.98-40.971 16.971l-35.707-35.709-243.523 243.523c-9.373 9.373-24.568 9.373-33.941 0l-22.627-22.627c-9.373-9.373-9.373-24.569 0-33.941L442.756 76.676l-35.703-35.705C391.982 25.9 402.656 0 424.024 0H552c13.255 0 24 10.745 24 24zM407.029 270.794l-16 16A23.999 23.999 0 0 0 384 303.765V448H64V128h264a24.003 24.003 0 0 0 16.97-7.029l16-16C376.089 89.851 365.381 64 344 64H48C21.49 64 0 85.49 0 112v352c0 26.51 21.49 48 48 48h352c26.51 0 48-21.49 48-48V287.764c0-21.382-25.852-32.09-40.971-16.97z\"]\n};\nvar faExternalLinkSquareAlt = {\n prefix: 'fas',\n iconName: 'external-link-square-alt',\n icon: [448, 512, [], \"f360\", \"M448 80v352c0 26.51-21.49 48-48 48H48c-26.51 0-48-21.49-48-48V80c0-26.51 21.49-48 48-48h352c26.51 0 48 21.49 48 48zm-88 16H248.029c-21.313 0-32.08 25.861-16.971 40.971l31.984 31.987L67.515 364.485c-4.686 4.686-4.686 12.284 0 16.971l31.029 31.029c4.687 4.686 12.285 4.686 16.971 0l195.526-195.526 31.988 31.991C358.058 263.977 384 253.425 384 231.979V120c0-13.255-10.745-24-24-24z\"]\n};\nvar faEye = {\n prefix: 'fas',\n iconName: 'eye',\n icon: [576, 512, [], \"f06e\", \"M572.52 241.4C518.29 135.59 410.93 64 288 64S57.68 135.64 3.48 241.41a32.35 32.35 0 0 0 0 29.19C57.71 376.41 165.07 448 288 448s230.32-71.64 284.52-177.41a32.35 32.35 0 0 0 0-29.19zM288 400a144 144 0 1 1 144-144 143.93 143.93 0 0 1-144 144zm0-240a95.31 95.31 0 0 0-25.31 3.79 47.85 47.85 0 0 1-66.9 66.9A95.78 95.78 0 1 0 288 160z\"]\n};\nvar faEyeDropper = {\n prefix: 'fas',\n iconName: 'eye-dropper',\n icon: [512, 512, [], \"f1fb\", \"M50.75 333.25c-12 12-18.75 28.28-18.75 45.26V424L0 480l32 32 56-32h45.49c16.97 0 33.25-6.74 45.25-18.74l126.64-126.62-128-128L50.75 333.25zM483.88 28.12c-37.47-37.5-98.28-37.5-135.75 0l-77.09 77.09-13.1-13.1c-9.44-9.44-24.65-9.31-33.94 0l-40.97 40.97c-9.37 9.37-9.37 24.57 0 33.94l161.94 161.94c9.44 9.44 24.65 9.31 33.94 0L419.88 288c9.37-9.37 9.37-24.57 0-33.94l-13.1-13.1 77.09-77.09c37.51-37.48 37.51-98.26.01-135.75z\"]\n};\nvar faEyeSlash = {\n prefix: 'fas',\n iconName: 'eye-slash',\n icon: [640, 512, [], \"f070\", \"M320 400c-75.85 0-137.25-58.71-142.9-133.11L72.2 185.82c-13.79 17.3-26.48 35.59-36.72 55.59a32.35 32.35 0 0 0 0 29.19C89.71 376.41 197.07 448 320 448c26.91 0 52.87-4 77.89-10.46L346 397.39a144.13 144.13 0 0 1-26 2.61zm313.82 58.1l-110.55-85.44a331.25 331.25 0 0 0 81.25-102.07 32.35 32.35 0 0 0 0-29.19C550.29 135.59 442.93 64 320 64a308.15 308.15 0 0 0-147.32 37.7L45.46 3.37A16 16 0 0 0 23 6.18L3.37 31.45A16 16 0 0 0 6.18 53.9l588.36 454.73a16 16 0 0 0 22.46-2.81l19.64-25.27a16 16 0 0 0-2.82-22.45zm-183.72-142l-39.3-30.38A94.75 94.75 0 0 0 416 256a94.76 94.76 0 0 0-121.31-92.21A47.65 47.65 0 0 1 304 192a46.64 46.64 0 0 1-1.54 10l-73.61-56.89A142.31 142.31 0 0 1 320 112a143.92 143.92 0 0 1 144 144c0 21.63-5.29 41.79-13.9 60.11z\"]\n};\nvar faFan = {\n prefix: 'fas',\n iconName: 'fan',\n icon: [512, 512, [], \"f863\", \"M352.57 128c-28.09 0-54.09 4.52-77.06 12.86l12.41-123.11C289 7.31 279.81-1.18 269.33.13 189.63 10.13 128 77.64 128 159.43c0 28.09 4.52 54.09 12.86 77.06L17.75 224.08C7.31 223-1.18 232.19.13 242.67c10 79.7 77.51 141.33 159.3 141.33 28.09 0 54.09-4.52 77.06-12.86l-12.41 123.11c-1.05 10.43 8.11 18.93 18.59 17.62 79.7-10 141.33-77.51 141.33-159.3 0-28.09-4.52-54.09-12.86-77.06l123.11 12.41c10.44 1.05 18.93-8.11 17.62-18.59-10-79.7-77.51-141.33-159.3-141.33zM256 288a32 32 0 1 1 32-32 32 32 0 0 1-32 32z\"]\n};\nvar faFastBackward = {\n prefix: 'fas',\n iconName: 'fast-backward',\n icon: [512, 512, [], \"f049\", \"M0 436V76c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v151.9L235.5 71.4C256.1 54.3 288 68.6 288 96v131.9L459.5 71.4C480.1 54.3 512 68.6 512 96v320c0 27.4-31.9 41.7-52.5 24.6L288 285.3V416c0 27.4-31.9 41.7-52.5 24.6L64 285.3V436c0 6.6-5.4 12-12 12H12c-6.6 0-12-5.4-12-12z\"]\n};\nvar faFastForward = {\n prefix: 'fas',\n iconName: 'fast-forward',\n icon: [512, 512, [], \"f050\", \"M512 76v360c0 6.6-5.4 12-12 12h-40c-6.6 0-12-5.4-12-12V284.1L276.5 440.6c-20.6 17.2-52.5 2.8-52.5-24.6V284.1L52.5 440.6C31.9 457.8 0 443.4 0 416V96c0-27.4 31.9-41.7 52.5-24.6L224 226.8V96c0-27.4 31.9-41.7 52.5-24.6L448 226.8V76c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12z\"]\n};\nvar faFax = {\n prefix: 'fas',\n iconName: 'fax',\n icon: [512, 512, [], \"f1ac\", \"M64 128H32c-17.67 0-32 14.33-32 32v320c0 17.67 14.33 32 32 32h32c17.67 0 32-14.33 32-32V160c0-17.67-14.33-32-32-32zm416 32V77.25c0-8.49-3.37-16.62-9.37-22.63L425.37 9.37c-6-6-14.14-9.37-22.63-9.37H160c-17.67 0-32 14.33-32 32v448c0 17.67 14.33 32 32 32h320c17.67 0 32-14.33 32-32V192c0-17.67-14.33-32-32-32zM288 432c0 8.84-7.16 16-16 16h-32c-8.84 0-16-7.16-16-16v-32c0-8.84 7.16-16 16-16h32c8.84 0 16 7.16 16 16v32zm0-128c0 8.84-7.16 16-16 16h-32c-8.84 0-16-7.16-16-16v-32c0-8.84 7.16-16 16-16h32c8.84 0 16 7.16 16 16v32zm128 128c0 8.84-7.16 16-16 16h-32c-8.84 0-16-7.16-16-16v-32c0-8.84 7.16-16 16-16h32c8.84 0 16 7.16 16 16v32zm0-128c0 8.84-7.16 16-16 16h-32c-8.84 0-16-7.16-16-16v-32c0-8.84 7.16-16 16-16h32c8.84 0 16 7.16 16 16v32zm16-112H176V48h208v32c0 8.84 7.16 16 16 16h32v96z\"]\n};\nvar faFeather = {\n prefix: 'fas',\n iconName: 'feather',\n icon: [512, 512, [], \"f52d\", \"M467.14 44.84c-62.55-62.48-161.67-64.78-252.28 25.73-78.61 78.52-60.98 60.92-85.75 85.66-60.46 60.39-70.39 150.83-63.64 211.17l178.44-178.25c6.26-6.25 16.4-6.25 22.65 0s6.25 16.38 0 22.63L7.04 471.03c-9.38 9.37-9.38 24.57 0 33.94 9.38 9.37 24.6 9.37 33.98 0l66.1-66.03C159.42 454.65 279 457.11 353.95 384h-98.19l147.57-49.14c49.99-49.93 36.38-36.18 46.31-46.86h-97.78l131.54-43.8c45.44-74.46 34.31-148.84-16.26-199.36z\"]\n};\nvar faFeatherAlt = {\n prefix: 'fas',\n iconName: 'feather-alt',\n icon: [512, 512, [], \"f56b\", \"M512 0C460.22 3.56 96.44 38.2 71.01 287.61c-3.09 26.66-4.84 53.44-5.99 80.24l178.87-178.69c6.25-6.25 16.4-6.25 22.65 0s6.25 16.38 0 22.63L7.04 471.03c-9.38 9.37-9.38 24.57 0 33.94 9.38 9.37 24.59 9.37 33.98 0l57.13-57.07c42.09-.14 84.15-2.53 125.96-7.36 53.48-5.44 97.02-26.47 132.58-56.54H255.74l146.79-48.88c11.25-14.89 21.37-30.71 30.45-47.12h-81.14l106.54-53.21C500.29 132.86 510.19 26.26 512 0z\"]\n};\nvar faFemale = {\n prefix: 'fas',\n iconName: 'female',\n icon: [256, 512, [], \"f182\", \"M128 0c35.346 0 64 28.654 64 64s-28.654 64-64 64c-35.346 0-64-28.654-64-64S92.654 0 128 0m119.283 354.179l-48-192A24 24 0 0 0 176 144h-11.36c-22.711 10.443-49.59 10.894-73.28 0H80a24 24 0 0 0-23.283 18.179l-48 192C4.935 369.305 16.383 384 32 384h56v104c0 13.255 10.745 24 24 24h32c13.255 0 24-10.745 24-24V384h56c15.591 0 27.071-14.671 23.283-29.821z\"]\n};\nvar faFighterJet = {\n prefix: 'fas',\n iconName: 'fighter-jet',\n icon: [640, 512, [], \"f0fb\", \"M544 224l-128-16-48-16h-24L227.158 44h39.509C278.333 44 288 41.375 288 38s-9.667-6-21.333-6H152v12h16v164h-48l-66.667-80H18.667L8 138.667V208h8v16h48v2.666l-64 8v42.667l64 8V288H16v16H8v69.333L18.667 384h34.667L120 304h48v164h-16v12h114.667c11.667 0 21.333-2.625 21.333-6s-9.667-6-21.333-6h-39.509L344 320h24l48-16 128-16c96-21.333 96-26.583 96-32 0-5.417 0-10.667-96-32z\"]\n};\nvar faFile = {\n prefix: 'fas',\n iconName: 'file',\n icon: [384, 512, [], \"f15b\", \"M224 136V0H24C10.7 0 0 10.7 0 24v464c0 13.3 10.7 24 24 24h336c13.3 0 24-10.7 24-24V160H248c-13.2 0-24-10.8-24-24zm160-14.1v6.1H256V0h6.1c6.4 0 12.5 2.5 17 7l97.9 98c4.5 4.5 7 10.6 7 16.9z\"]\n};\nvar faFileAlt = {\n prefix: 'fas',\n iconName: 'file-alt',\n icon: [384, 512, [], \"f15c\", \"M224 136V0H24C10.7 0 0 10.7 0 24v464c0 13.3 10.7 24 24 24h336c13.3 0 24-10.7 24-24V160H248c-13.2 0-24-10.8-24-24zm64 236c0 6.6-5.4 12-12 12H108c-6.6 0-12-5.4-12-12v-8c0-6.6 5.4-12 12-12h168c6.6 0 12 5.4 12 12v8zm0-64c0 6.6-5.4 12-12 12H108c-6.6 0-12-5.4-12-12v-8c0-6.6 5.4-12 12-12h168c6.6 0 12 5.4 12 12v8zm0-72v8c0 6.6-5.4 12-12 12H108c-6.6 0-12-5.4-12-12v-8c0-6.6 5.4-12 12-12h168c6.6 0 12 5.4 12 12zm96-114.1v6.1H256V0h6.1c6.4 0 12.5 2.5 17 7l97.9 98c4.5 4.5 7 10.6 7 16.9z\"]\n};\nvar faFileArchive = {\n prefix: 'fas',\n iconName: 'file-archive',\n icon: [384, 512, [], \"f1c6\", \"M377 105L279.1 7c-4.5-4.5-10.6-7-17-7H256v128h128v-6.1c0-6.3-2.5-12.4-7-16.9zM128.4 336c-17.9 0-32.4 12.1-32.4 27 0 15 14.6 27 32.5 27s32.4-12.1 32.4-27-14.6-27-32.5-27zM224 136V0h-63.6v32h-32V0H24C10.7 0 0 10.7 0 24v464c0 13.3 10.7 24 24 24h336c13.3 0 24-10.7 24-24V160H248c-13.2 0-24-10.8-24-24zM95.9 32h32v32h-32zm32.3 384c-33.2 0-58-30.4-51.4-62.9L96.4 256v-32h32v-32h-32v-32h32v-32h-32V96h32V64h32v32h-32v32h32v32h-32v32h32v32h-32v32h22.1c5.7 0 10.7 4.1 11.8 9.7l17.3 87.7c6.4 32.4-18.4 62.6-51.4 62.6z\"]\n};\nvar faFileAudio = {\n prefix: 'fas',\n iconName: 'file-audio',\n icon: [384, 512, [], \"f1c7\", \"M224 136V0H24C10.7 0 0 10.7 0 24v464c0 13.3 10.7 24 24 24h336c13.3 0 24-10.7 24-24V160H248c-13.2 0-24-10.8-24-24zm-64 268c0 10.7-12.9 16-20.5 8.5L104 376H76c-6.6 0-12-5.4-12-12v-56c0-6.6 5.4-12 12-12h28l35.5-36.5c7.6-7.6 20.5-2.2 20.5 8.5v136zm33.2-47.6c9.1-9.3 9.1-24.1 0-33.4-22.1-22.8 12.2-56.2 34.4-33.5 27.2 27.9 27.2 72.4 0 100.4-21.8 22.3-56.9-10.4-34.4-33.5zm86-117.1c54.4 55.9 54.4 144.8 0 200.8-21.8 22.4-57-10.3-34.4-33.5 36.2-37.2 36.3-96.5 0-133.8-22.1-22.8 12.3-56.3 34.4-33.5zM384 121.9v6.1H256V0h6.1c6.4 0 12.5 2.5 17 7l97.9 98c4.5 4.5 7 10.6 7 16.9z\"]\n};\nvar faFileCode = {\n prefix: 'fas',\n iconName: 'file-code',\n icon: [384, 512, [], \"f1c9\", \"M384 121.941V128H256V0h6.059c6.365 0 12.47 2.529 16.971 7.029l97.941 97.941A24.005 24.005 0 0 1 384 121.941zM248 160c-13.2 0-24-10.8-24-24V0H24C10.745 0 0 10.745 0 24v464c0 13.255 10.745 24 24 24h336c13.255 0 24-10.745 24-24V160H248zM123.206 400.505a5.4 5.4 0 0 1-7.633.246l-64.866-60.812a5.4 5.4 0 0 1 0-7.879l64.866-60.812a5.4 5.4 0 0 1 7.633.246l19.579 20.885a5.4 5.4 0 0 1-.372 7.747L101.65 336l40.763 35.874a5.4 5.4 0 0 1 .372 7.747l-19.579 20.884zm51.295 50.479l-27.453-7.97a5.402 5.402 0 0 1-3.681-6.692l61.44-211.626a5.402 5.402 0 0 1 6.692-3.681l27.452 7.97a5.4 5.4 0 0 1 3.68 6.692l-61.44 211.626a5.397 5.397 0 0 1-6.69 3.681zm160.792-111.045l-64.866 60.812a5.4 5.4 0 0 1-7.633-.246l-19.58-20.885a5.4 5.4 0 0 1 .372-7.747L284.35 336l-40.763-35.874a5.4 5.4 0 0 1-.372-7.747l19.58-20.885a5.4 5.4 0 0 1 7.633-.246l64.866 60.812a5.4 5.4 0 0 1-.001 7.879z\"]\n};\nvar faFileContract = {\n prefix: 'fas',\n iconName: 'file-contract',\n icon: [384, 512, [], \"f56c\", \"M224 136V0H24C10.7 0 0 10.7 0 24v464c0 13.3 10.7 24 24 24h336c13.3 0 24-10.7 24-24V160H248c-13.2 0-24-10.8-24-24zM64 72c0-4.42 3.58-8 8-8h80c4.42 0 8 3.58 8 8v16c0 4.42-3.58 8-8 8H72c-4.42 0-8-3.58-8-8V72zm0 64c0-4.42 3.58-8 8-8h80c4.42 0 8 3.58 8 8v16c0 4.42-3.58 8-8 8H72c-4.42 0-8-3.58-8-8v-16zm192.81 248H304c8.84 0 16 7.16 16 16s-7.16 16-16 16h-47.19c-16.45 0-31.27-9.14-38.64-23.86-2.95-5.92-8.09-6.52-10.17-6.52s-7.22.59-10.02 6.19l-7.67 15.34a15.986 15.986 0 0 1-14.31 8.84c-.38 0-.75-.02-1.14-.05-6.45-.45-12-4.75-14.03-10.89L144 354.59l-10.61 31.88c-5.89 17.66-22.38 29.53-41 29.53H80c-8.84 0-16-7.16-16-16s7.16-16 16-16h12.39c4.83 0 9.11-3.08 10.64-7.66l18.19-54.64c3.3-9.81 12.44-16.41 22.78-16.41s19.48 6.59 22.77 16.41l13.88 41.64c19.77-16.19 54.05-9.7 66 14.16 2.02 4.06 5.96 6.5 10.16 6.5zM377 105L279.1 7c-4.5-4.5-10.6-7-17-7H256v128h128v-6.1c0-6.3-2.5-12.4-7-16.9z\"]\n};\nvar faFileCsv = {\n prefix: 'fas',\n iconName: 'file-csv',\n icon: [384, 512, [], \"f6dd\", \"M224 136V0H24C10.7 0 0 10.7 0 24v464c0 13.3 10.7 24 24 24h336c13.3 0 24-10.7 24-24V160H248c-13.2 0-24-10.8-24-24zm-96 144c0 4.42-3.58 8-8 8h-8c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h8c4.42 0 8 3.58 8 8v16c0 4.42-3.58 8-8 8h-8c-26.51 0-48-21.49-48-48v-32c0-26.51 21.49-48 48-48h8c4.42 0 8 3.58 8 8v16zm44.27 104H160c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h12.27c5.95 0 10.41-3.5 10.41-6.62 0-1.3-.75-2.66-2.12-3.84l-21.89-18.77c-8.47-7.22-13.33-17.48-13.33-28.14 0-21.3 19.02-38.62 42.41-38.62H200c4.42 0 8 3.58 8 8v16c0 4.42-3.58 8-8 8h-12.27c-5.95 0-10.41 3.5-10.41 6.62 0 1.3.75 2.66 2.12 3.84l21.89 18.77c8.47 7.22 13.33 17.48 13.33 28.14.01 21.29-19 38.62-42.39 38.62zM256 264v20.8c0 20.27 5.7 40.17 16 56.88 10.3-16.7 16-36.61 16-56.88V264c0-4.42 3.58-8 8-8h16c4.42 0 8 3.58 8 8v20.8c0 35.48-12.88 68.89-36.28 94.09-3.02 3.25-7.27 5.11-11.72 5.11s-8.7-1.86-11.72-5.11c-23.4-25.2-36.28-58.61-36.28-94.09V264c0-4.42 3.58-8 8-8h16c4.42 0 8 3.58 8 8zm121-159L279.1 7c-4.5-4.5-10.6-7-17-7H256v128h128v-6.1c0-6.3-2.5-12.4-7-16.9z\"]\n};\nvar faFileDownload = {\n prefix: 'fas',\n iconName: 'file-download',\n icon: [384, 512, [], \"f56d\", \"M224 136V0H24C10.7 0 0 10.7 0 24v464c0 13.3 10.7 24 24 24h336c13.3 0 24-10.7 24-24V160H248c-13.2 0-24-10.8-24-24zm76.45 211.36l-96.42 95.7c-6.65 6.61-17.39 6.61-24.04 0l-96.42-95.7C73.42 337.29 80.54 320 94.82 320H160v-80c0-8.84 7.16-16 16-16h32c8.84 0 16 7.16 16 16v80h65.18c14.28 0 21.4 17.29 11.27 27.36zM377 105L279.1 7c-4.5-4.5-10.6-7-17-7H256v128h128v-6.1c0-6.3-2.5-12.4-7-16.9z\"]\n};\nvar faFileExcel = {\n prefix: 'fas',\n iconName: 'file-excel',\n icon: [384, 512, [], \"f1c3\", \"M224 136V0H24C10.7 0 0 10.7 0 24v464c0 13.3 10.7 24 24 24h336c13.3 0 24-10.7 24-24V160H248c-13.2 0-24-10.8-24-24zm60.1 106.5L224 336l60.1 93.5c5.1 8-.6 18.5-10.1 18.5h-34.9c-4.4 0-8.5-2.4-10.6-6.3C208.9 405.5 192 373 192 373c-6.4 14.8-10 20-36.6 68.8-2.1 3.9-6.1 6.3-10.5 6.3H110c-9.5 0-15.2-10.5-10.1-18.5l60.3-93.5-60.3-93.5c-5.2-8 .6-18.5 10.1-18.5h34.8c4.4 0 8.5 2.4 10.6 6.3 26.1 48.8 20 33.6 36.6 68.5 0 0 6.1-11.7 36.6-68.5 2.1-3.9 6.2-6.3 10.6-6.3H274c9.5-.1 15.2 10.4 10.1 18.4zM384 121.9v6.1H256V0h6.1c6.4 0 12.5 2.5 17 7l97.9 98c4.5 4.5 7 10.6 7 16.9z\"]\n};\nvar faFileExport = {\n prefix: 'fas',\n iconName: 'file-export',\n icon: [576, 512, [], \"f56e\", \"M384 121.9c0-6.3-2.5-12.4-7-16.9L279.1 7c-4.5-4.5-10.6-7-17-7H256v128h128zM571 308l-95.7-96.4c-10.1-10.1-27.4-3-27.4 11.3V288h-64v64h64v65.2c0 14.3 17.3 21.4 27.4 11.3L571 332c6.6-6.6 6.6-17.4 0-24zm-379 28v-32c0-8.8 7.2-16 16-16h176V160H248c-13.2 0-24-10.8-24-24V0H24C10.7 0 0 10.7 0 24v464c0 13.3 10.7 24 24 24h336c13.3 0 24-10.7 24-24V352H208c-8.8 0-16-7.2-16-16z\"]\n};\nvar faFileImage = {\n prefix: 'fas',\n iconName: 'file-image',\n icon: [384, 512, [], \"f1c5\", \"M384 121.941V128H256V0h6.059a24 24 0 0 1 16.97 7.029l97.941 97.941a24.002 24.002 0 0 1 7.03 16.971zM248 160c-13.2 0-24-10.8-24-24V0H24C10.745 0 0 10.745 0 24v464c0 13.255 10.745 24 24 24h336c13.255 0 24-10.745 24-24V160H248zm-135.455 16c26.51 0 48 21.49 48 48s-21.49 48-48 48-48-21.49-48-48 21.491-48 48-48zm208 240h-256l.485-48.485L104.545 328c4.686-4.686 11.799-4.201 16.485.485L160.545 368 264.06 264.485c4.686-4.686 12.284-4.686 16.971 0L320.545 304v112z\"]\n};\nvar faFileImport = {\n prefix: 'fas',\n iconName: 'file-import',\n icon: [512, 512, [], \"f56f\", \"M16 288c-8.8 0-16 7.2-16 16v32c0 8.8 7.2 16 16 16h112v-64zm489-183L407.1 7c-4.5-4.5-10.6-7-17-7H384v128h128v-6.1c0-6.3-2.5-12.4-7-16.9zm-153 31V0H152c-13.3 0-24 10.7-24 24v264h128v-65.2c0-14.3 17.3-21.4 27.4-11.3L379 308c6.6 6.7 6.6 17.4 0 24l-95.7 96.4c-10.1 10.1-27.4 3-27.4-11.3V352H128v136c0 13.3 10.7 24 24 24h336c13.3 0 24-10.7 24-24V160H376c-13.2 0-24-10.8-24-24z\"]\n};\nvar faFileInvoice = {\n prefix: 'fas',\n iconName: 'file-invoice',\n icon: [384, 512, [], \"f570\", \"M288 256H96v64h192v-64zm89-151L279.1 7c-4.5-4.5-10.6-7-17-7H256v128h128v-6.1c0-6.3-2.5-12.4-7-16.9zm-153 31V0H24C10.7 0 0 10.7 0 24v464c0 13.3 10.7 24 24 24h336c13.3 0 24-10.7 24-24V160H248c-13.2 0-24-10.8-24-24zM64 72c0-4.42 3.58-8 8-8h80c4.42 0 8 3.58 8 8v16c0 4.42-3.58 8-8 8H72c-4.42 0-8-3.58-8-8V72zm0 64c0-4.42 3.58-8 8-8h80c4.42 0 8 3.58 8 8v16c0 4.42-3.58 8-8 8H72c-4.42 0-8-3.58-8-8v-16zm256 304c0 4.42-3.58 8-8 8h-80c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h80c4.42 0 8 3.58 8 8v16zm0-200v96c0 8.84-7.16 16-16 16H80c-8.84 0-16-7.16-16-16v-96c0-8.84 7.16-16 16-16h224c8.84 0 16 7.16 16 16z\"]\n};\nvar faFileInvoiceDollar = {\n prefix: 'fas',\n iconName: 'file-invoice-dollar',\n icon: [384, 512, [], \"f571\", \"M377 105L279.1 7c-4.5-4.5-10.6-7-17-7H256v128h128v-6.1c0-6.3-2.5-12.4-7-16.9zm-153 31V0H24C10.7 0 0 10.7 0 24v464c0 13.3 10.7 24 24 24h336c13.3 0 24-10.7 24-24V160H248c-13.2 0-24-10.8-24-24zM64 72c0-4.42 3.58-8 8-8h80c4.42 0 8 3.58 8 8v16c0 4.42-3.58 8-8 8H72c-4.42 0-8-3.58-8-8V72zm0 80v-16c0-4.42 3.58-8 8-8h80c4.42 0 8 3.58 8 8v16c0 4.42-3.58 8-8 8H72c-4.42 0-8-3.58-8-8zm144 263.88V440c0 4.42-3.58 8-8 8h-16c-4.42 0-8-3.58-8-8v-24.29c-11.29-.58-22.27-4.52-31.37-11.35-3.9-2.93-4.1-8.77-.57-12.14l11.75-11.21c2.77-2.64 6.89-2.76 10.13-.73 3.87 2.42 8.26 3.72 12.82 3.72h28.11c6.5 0 11.8-5.92 11.8-13.19 0-5.95-3.61-11.19-8.77-12.73l-45-13.5c-18.59-5.58-31.58-23.42-31.58-43.39 0-24.52 19.05-44.44 42.67-45.07V232c0-4.42 3.58-8 8-8h16c4.42 0 8 3.58 8 8v24.29c11.29.58 22.27 4.51 31.37 11.35 3.9 2.93 4.1 8.77.57 12.14l-11.75 11.21c-2.77 2.64-6.89 2.76-10.13.73-3.87-2.43-8.26-3.72-12.82-3.72h-28.11c-6.5 0-11.8 5.92-11.8 13.19 0 5.95 3.61 11.19 8.77 12.73l45 13.5c18.59 5.58 31.58 23.42 31.58 43.39 0 24.53-19.05 44.44-42.67 45.07z\"]\n};\nvar faFileMedical = {\n prefix: 'fas',\n iconName: 'file-medical',\n icon: [384, 512, [], \"f477\", \"M377 105L279.1 7c-4.5-4.5-10.6-7-17-7H256v128h128v-6.1c0-6.3-2.5-12.4-7-16.9zm-153 31V0H24C10.7 0 0 10.7 0 24v464c0 13.3 10.7 24 24 24h336c13.3 0 24-10.7 24-24V160H248c-13.2 0-24-10.8-24-24zm64 160v48c0 4.4-3.6 8-8 8h-56v56c0 4.4-3.6 8-8 8h-48c-4.4 0-8-3.6-8-8v-56h-56c-4.4 0-8-3.6-8-8v-48c0-4.4 3.6-8 8-8h56v-56c0-4.4 3.6-8 8-8h48c4.4 0 8 3.6 8 8v56h56c4.4 0 8 3.6 8 8z\"]\n};\nvar faFileMedicalAlt = {\n prefix: 'fas',\n iconName: 'file-medical-alt',\n icon: [448, 512, [], \"f478\", \"M288 136V0H88C74.7 0 64 10.7 64 24v232H8c-4.4 0-8 3.6-8 8v16c0 4.4 3.6 8 8 8h140.9c3 0 5.8 1.7 7.2 4.4l19.9 39.8 56.8-113.7c2.9-5.9 11.4-5.9 14.3 0l34.7 69.5H352c8.8 0 16 7.2 16 16s-7.2 16-16 16h-89.9L240 275.8l-56.8 113.7c-2.9 5.9-11.4 5.9-14.3 0L134.1 320H64v168c0 13.3 10.7 24 24 24h336c13.3 0 24-10.7 24-24V160H312c-13.2 0-24-10.8-24-24zm153-31L343.1 7c-4.5-4.5-10.6-7-17-7H320v128h128v-6.1c0-6.3-2.5-12.4-7-16.9z\"]\n};\nvar faFilePdf = {\n prefix: 'fas',\n iconName: 'file-pdf',\n icon: [384, 512, [], \"f1c1\", \"M181.9 256.1c-5-16-4.9-46.9-2-46.9 8.4 0 7.6 36.9 2 46.9zm-1.7 47.2c-7.7 20.2-17.3 43.3-28.4 62.7 18.3-7 39-17.2 62.9-21.9-12.7-9.6-24.9-23.4-34.5-40.8zM86.1 428.1c0 .8 13.2-5.4 34.9-40.2-6.7 6.3-29.1 24.5-34.9 40.2zM248 160h136v328c0 13.3-10.7 24-24 24H24c-13.3 0-24-10.7-24-24V24C0 10.7 10.7 0 24 0h200v136c0 13.2 10.8 24 24 24zm-8 171.8c-20-12.2-33.3-29-42.7-53.8 4.5-18.5 11.6-46.6 6.2-64.2-4.7-29.4-42.4-26.5-47.8-6.8-5 18.3-.4 44.1 8.1 77-11.6 27.6-28.7 64.6-40.8 85.8-.1 0-.1.1-.2.1-27.1 13.9-73.6 44.5-54.5 68 5.6 6.9 16 10 21.5 10 17.9 0 35.7-18 61.1-61.8 25.8-8.5 54.1-19.1 79-23.2 21.7 11.8 47.1 19.5 64 19.5 29.2 0 31.2-32 19.7-43.4-13.9-13.6-54.3-9.7-73.6-7.2zM377 105L279 7c-4.5-4.5-10.6-7-17-7h-6v128h128v-6.1c0-6.3-2.5-12.4-7-16.9zm-74.1 255.3c4.1-2.7-2.5-11.9-42.8-9 37.1 15.8 42.8 9 42.8 9z\"]\n};\nvar faFilePowerpoint = {\n prefix: 'fas',\n iconName: 'file-powerpoint',\n icon: [384, 512, [], \"f1c4\", \"M193.7 271.2c8.8 0 15.5 2.7 20.3 8.1 9.6 10.9 9.8 32.7-.2 44.1-4.9 5.6-11.9 8.5-21.1 8.5h-26.9v-60.7h27.9zM377 105L279 7c-4.5-4.5-10.6-7-17-7h-6v128h128v-6.1c0-6.3-2.5-12.4-7-16.9zm-153 31V0H24C10.7 0 0 10.7 0 24v464c0 13.3 10.7 24 24 24h336c13.3 0 24-10.7 24-24V160H248c-13.2 0-24-10.8-24-24zm53 165.2c0 90.3-88.8 77.6-111.1 77.6V436c0 6.6-5.4 12-12 12h-30.8c-6.6 0-12-5.4-12-12V236.2c0-6.6 5.4-12 12-12h81c44.5 0 72.9 32.8 72.9 77z\"]\n};\nvar faFilePrescription = {\n prefix: 'fas',\n iconName: 'file-prescription',\n icon: [384, 512, [], \"f572\", \"M224 136V0H24C10.7 0 0 10.7 0 24v464c0 13.3 10.7 24 24 24h336c13.3 0 24-10.7 24-24V160H248c-13.2 0-24-10.8-24-24zm68.53 179.48l11.31 11.31c6.25 6.25 6.25 16.38 0 22.63l-29.9 29.9L304 409.38c6.25 6.25 6.25 16.38 0 22.63l-11.31 11.31c-6.25 6.25-16.38 6.25-22.63 0L240 413.25l-30.06 30.06c-6.25 6.25-16.38 6.25-22.63 0L176 432c-6.25-6.25-6.25-16.38 0-22.63l30.06-30.06L146.74 320H128v48c0 8.84-7.16 16-16 16H96c-8.84 0-16-7.16-16-16V208c0-8.84 7.16-16 16-16h80c35.35 0 64 28.65 64 64 0 24.22-13.62 45.05-33.46 55.92L240 345.38l29.9-29.9c6.25-6.25 16.38-6.25 22.63 0zM176 272h-48v-32h48c8.82 0 16 7.18 16 16s-7.18 16-16 16zm208-150.1v6.1H256V0h6.1c6.4 0 12.5 2.5 17 7l97.9 98c4.5 4.5 7 10.6 7 16.9z\"]\n};\nvar faFileSignature = {\n prefix: 'fas',\n iconName: 'file-signature',\n icon: [576, 512, [], \"f573\", \"M218.17 424.14c-2.95-5.92-8.09-6.52-10.17-6.52s-7.22.59-10.02 6.19l-7.67 15.34c-6.37 12.78-25.03 11.37-29.48-2.09L144 386.59l-10.61 31.88c-5.89 17.66-22.38 29.53-41 29.53H80c-8.84 0-16-7.16-16-16s7.16-16 16-16h12.39c4.83 0 9.11-3.08 10.64-7.66l18.19-54.64c3.3-9.81 12.44-16.41 22.78-16.41s19.48 6.59 22.77 16.41l13.88 41.64c19.75-16.19 54.06-9.7 66 14.16 1.89 3.78 5.49 5.95 9.36 6.26v-82.12l128-127.09V160H248c-13.2 0-24-10.8-24-24V0H24C10.7 0 0 10.7 0 24v464c0 13.3 10.7 24 24 24h336c13.3 0 24-10.7 24-24v-40l-128-.11c-16.12-.31-30.58-9.28-37.83-23.75zM384 121.9c0-6.3-2.5-12.4-7-16.9L279.1 7c-4.5-4.5-10.6-7-17-7H256v128h128v-6.1zm-96 225.06V416h68.99l161.68-162.78-67.88-67.88L288 346.96zm280.54-179.63l-31.87-31.87c-9.94-9.94-26.07-9.94-36.01 0l-27.25 27.25 67.88 67.88 27.25-27.25c9.95-9.94 9.95-26.07 0-36.01z\"]\n};\nvar faFileUpload = {\n prefix: 'fas',\n iconName: 'file-upload',\n icon: [384, 512, [], \"f574\", \"M224 136V0H24C10.7 0 0 10.7 0 24v464c0 13.3 10.7 24 24 24h336c13.3 0 24-10.7 24-24V160H248c-13.2 0-24-10.8-24-24zm65.18 216.01H224v80c0 8.84-7.16 16-16 16h-32c-8.84 0-16-7.16-16-16v-80H94.82c-14.28 0-21.41-17.29-11.27-27.36l96.42-95.7c6.65-6.61 17.39-6.61 24.04 0l96.42 95.7c10.15 10.07 3.03 27.36-11.25 27.36zM377 105L279.1 7c-4.5-4.5-10.6-7-17-7H256v128h128v-6.1c0-6.3-2.5-12.4-7-16.9z\"]\n};\nvar faFileVideo = {\n prefix: 'fas',\n iconName: 'file-video',\n icon: [384, 512, [], \"f1c8\", \"M384 121.941V128H256V0h6.059c6.365 0 12.47 2.529 16.971 7.029l97.941 97.941A24.005 24.005 0 0 1 384 121.941zM224 136V0H24C10.745 0 0 10.745 0 24v464c0 13.255 10.745 24 24 24h336c13.255 0 24-10.745 24-24V160H248c-13.2 0-24-10.8-24-24zm96 144.016v111.963c0 21.445-25.943 31.998-40.971 16.971L224 353.941V392c0 13.255-10.745 24-24 24H88c-13.255 0-24-10.745-24-24V280c0-13.255 10.745-24 24-24h112c13.255 0 24 10.745 24 24v38.059l55.029-55.013c15.011-15.01 40.971-4.491 40.971 16.97z\"]\n};\nvar faFileWord = {\n prefix: 'fas',\n iconName: 'file-word',\n icon: [384, 512, [], \"f1c2\", \"M224 136V0H24C10.7 0 0 10.7 0 24v464c0 13.3 10.7 24 24 24h336c13.3 0 24-10.7 24-24V160H248c-13.2 0-24-10.8-24-24zm57.1 120H305c7.7 0 13.4 7.1 11.7 14.7l-38 168c-1.2 5.5-6.1 9.3-11.7 9.3h-38c-5.5 0-10.3-3.8-11.6-9.1-25.8-103.5-20.8-81.2-25.6-110.5h-.5c-1.1 14.3-2.4 17.4-25.6 110.5-1.3 5.3-6.1 9.1-11.6 9.1H117c-5.6 0-10.5-3.9-11.7-9.4l-37.8-168c-1.7-7.5 4-14.6 11.7-14.6h24.5c5.7 0 10.7 4 11.8 9.7 15.6 78 20.1 109.5 21 122.2 1.6-10.2 7.3-32.7 29.4-122.7 1.3-5.4 6.1-9.1 11.7-9.1h29.1c5.6 0 10.4 3.8 11.7 9.2 24 100.4 28.8 124 29.6 129.4-.2-11.2-2.6-17.8 21.6-129.2 1-5.6 5.9-9.5 11.5-9.5zM384 121.9v6.1H256V0h6.1c6.4 0 12.5 2.5 17 7l97.9 98c4.5 4.5 7 10.6 7 16.9z\"]\n};\nvar faFill = {\n prefix: 'fas',\n iconName: 'fill',\n icon: [512, 512, [], \"f575\", \"M502.63 217.06L294.94 9.37C288.69 3.12 280.5 0 272.31 0s-16.38 3.12-22.62 9.37l-81.58 81.58L81.93 4.77c-6.24-6.25-16.38-6.25-22.62 0L36.69 27.38c-6.24 6.25-6.24 16.38 0 22.63l86.19 86.18-94.76 94.76c-37.49 37.49-37.49 98.26 0 135.75l117.19 117.19c18.75 18.74 43.31 28.12 67.87 28.12 24.57 0 49.13-9.37 67.88-28.12l221.57-221.57c12.49-12.5 12.49-32.76 0-45.26zm-116.22 70.97H65.93c1.36-3.84 3.57-7.98 7.43-11.83l13.15-13.15 81.61-81.61 58.61 58.6c12.49 12.49 32.75 12.49 45.24 0 12.49-12.49 12.49-32.75 0-45.24l-58.61-58.6 58.95-58.95 162.45 162.44-48.35 48.34z\"]\n};\nvar faFillDrip = {\n prefix: 'fas',\n iconName: 'fill-drip',\n icon: [576, 512, [], \"f576\", \"M512 320s-64 92.65-64 128c0 35.35 28.66 64 64 64s64-28.65 64-64-64-128-64-128zm-9.37-102.94L294.94 9.37C288.69 3.12 280.5 0 272.31 0s-16.38 3.12-22.62 9.37l-81.58 81.58L81.93 4.76c-6.25-6.25-16.38-6.25-22.62 0L36.69 27.38c-6.24 6.25-6.24 16.38 0 22.62l86.19 86.18-94.76 94.76c-37.49 37.48-37.49 98.26 0 135.75l117.19 117.19c18.74 18.74 43.31 28.12 67.87 28.12 24.57 0 49.13-9.37 67.87-28.12l221.57-221.57c12.5-12.5 12.5-32.75.01-45.25zm-116.22 70.97H65.93c1.36-3.84 3.57-7.98 7.43-11.83l13.15-13.15 81.61-81.61 58.6 58.6c12.49 12.49 32.75 12.49 45.24 0s12.49-32.75 0-45.24l-58.6-58.6 58.95-58.95 162.44 162.44-48.34 48.34z\"]\n};\nvar faFilm = {\n prefix: 'fas',\n iconName: 'film',\n icon: [512, 512, [], \"f008\", \"M488 64h-8v20c0 6.6-5.4 12-12 12h-40c-6.6 0-12-5.4-12-12V64H96v20c0 6.6-5.4 12-12 12H44c-6.6 0-12-5.4-12-12V64h-8C10.7 64 0 74.7 0 88v336c0 13.3 10.7 24 24 24h8v-20c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v20h320v-20c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v20h8c13.3 0 24-10.7 24-24V88c0-13.3-10.7-24-24-24zM96 372c0 6.6-5.4 12-12 12H44c-6.6 0-12-5.4-12-12v-40c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v40zm0-96c0 6.6-5.4 12-12 12H44c-6.6 0-12-5.4-12-12v-40c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v40zm0-96c0 6.6-5.4 12-12 12H44c-6.6 0-12-5.4-12-12v-40c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v40zm272 208c0 6.6-5.4 12-12 12H156c-6.6 0-12-5.4-12-12v-96c0-6.6 5.4-12 12-12h200c6.6 0 12 5.4 12 12v96zm0-168c0 6.6-5.4 12-12 12H156c-6.6 0-12-5.4-12-12v-96c0-6.6 5.4-12 12-12h200c6.6 0 12 5.4 12 12v96zm112 152c0 6.6-5.4 12-12 12h-40c-6.6 0-12-5.4-12-12v-40c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v40zm0-96c0 6.6-5.4 12-12 12h-40c-6.6 0-12-5.4-12-12v-40c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v40zm0-96c0 6.6-5.4 12-12 12h-40c-6.6 0-12-5.4-12-12v-40c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v40z\"]\n};\nvar faFilter = {\n prefix: 'fas',\n iconName: 'filter',\n icon: [512, 512, [], \"f0b0\", \"M487.976 0H24.028C2.71 0-8.047 25.866 7.058 40.971L192 225.941V432c0 7.831 3.821 15.17 10.237 19.662l80 55.98C298.02 518.69 320 507.493 320 487.98V225.941l184.947-184.97C520.021 25.896 509.338 0 487.976 0z\"]\n};\nvar faFingerprint = {\n prefix: 'fas',\n iconName: 'fingerprint',\n icon: [512, 512, [], \"f577\", \"M256.12 245.96c-13.25 0-24 10.74-24 24 1.14 72.25-8.14 141.9-27.7 211.55-2.73 9.72 2.15 30.49 23.12 30.49 10.48 0 20.11-6.92 23.09-17.52 13.53-47.91 31.04-125.41 29.48-224.52.01-13.25-10.73-24-23.99-24zm-.86-81.73C194 164.16 151.25 211.3 152.1 265.32c.75 47.94-3.75 95.91-13.37 142.55-2.69 12.98 5.67 25.69 18.64 28.36 13.05 2.67 25.67-5.66 28.36-18.64 10.34-50.09 15.17-101.58 14.37-153.02-.41-25.95 19.92-52.49 54.45-52.34 31.31.47 57.15 25.34 57.62 55.47.77 48.05-2.81 96.33-10.61 143.55-2.17 13.06 6.69 25.42 19.76 27.58 19.97 3.33 26.81-15.1 27.58-19.77 8.28-50.03 12.06-101.21 11.27-152.11-.88-55.8-47.94-101.88-104.91-102.72zm-110.69-19.78c-10.3-8.34-25.37-6.8-33.76 3.48-25.62 31.5-39.39 71.28-38.75 112 .59 37.58-2.47 75.27-9.11 112.05-2.34 13.05 6.31 25.53 19.36 27.89 20.11 3.5 27.07-14.81 27.89-19.36 7.19-39.84 10.5-80.66 9.86-121.33-.47-29.88 9.2-57.88 28-80.97 8.35-10.28 6.79-25.39-3.49-33.76zm109.47-62.33c-15.41-.41-30.87 1.44-45.78 4.97-12.89 3.06-20.87 15.98-17.83 28.89 3.06 12.89 16 20.83 28.89 17.83 11.05-2.61 22.47-3.77 34-3.69 75.43 1.13 137.73 61.5 138.88 134.58.59 37.88-1.28 76.11-5.58 113.63-1.5 13.17 7.95 25.08 21.11 26.58 16.72 1.95 25.51-11.88 26.58-21.11a929.06 929.06 0 0 0 5.89-119.85c-1.56-98.75-85.07-180.33-186.16-181.83zm252.07 121.45c-2.86-12.92-15.51-21.2-28.61-18.27-12.94 2.86-21.12 15.66-18.26 28.61 4.71 21.41 4.91 37.41 4.7 61.6-.11 13.27 10.55 24.09 23.8 24.2h.2c13.17 0 23.89-10.61 24-23.8.18-22.18.4-44.11-5.83-72.34zm-40.12-90.72C417.29 43.46 337.6 1.29 252.81.02 183.02-.82 118.47 24.91 70.46 72.94 24.09 119.37-.9 181.04.14 246.65l-.12 21.47c-.39 13.25 10.03 24.31 23.28 24.69.23.02.48.02.72.02 12.92 0 23.59-10.3 23.97-23.3l.16-23.64c-.83-52.5 19.16-101.86 56.28-139 38.76-38.8 91.34-59.67 147.68-58.86 69.45 1.03 134.73 35.56 174.62 92.39 7.61 10.86 22.56 13.45 33.42 5.86 10.84-7.62 13.46-22.59 5.84-33.43z\"]\n};\nvar faFire = {\n prefix: 'fas',\n iconName: 'fire',\n icon: [384, 512, [], \"f06d\", \"M216 23.86c0-23.8-30.65-32.77-44.15-13.04C48 191.85 224 200 224 288c0 35.63-29.11 64.46-64.85 63.99-35.17-.45-63.15-29.77-63.15-64.94v-85.51c0-21.7-26.47-32.23-41.43-16.5C27.8 213.16 0 261.33 0 320c0 105.87 86.13 192 192 192s192-86.13 192-192c0-170.29-168-193-168-296.14z\"]\n};\nvar faFireAlt = {\n prefix: 'fas',\n iconName: 'fire-alt',\n icon: [448, 512, [], \"f7e4\", \"M323.56 51.2c-20.8 19.3-39.58 39.59-56.22 59.97C240.08 73.62 206.28 35.53 168 0 69.74 91.17 0 209.96 0 281.6 0 408.85 100.29 512 224 512s224-103.15 224-230.4c0-53.27-51.98-163.14-124.44-230.4zm-19.47 340.65C282.43 407.01 255.72 416 226.86 416 154.71 416 96 368.26 96 290.75c0-38.61 24.31-72.63 72.79-130.75 6.93 7.98 98.83 125.34 98.83 125.34l58.63-66.88c4.14 6.85 7.91 13.55 11.27 19.97 27.35 52.19 15.81 118.97-33.43 153.42z\"]\n};\nvar faFireExtinguisher = {\n prefix: 'fas',\n iconName: 'fire-extinguisher',\n icon: [448, 512, [], \"f134\", \"M434.027 26.329l-168 28C254.693 56.218 256 67.8 256 72h-58.332C208.353 36.108 181.446 0 144 0c-39.435 0-66.368 39.676-52.228 76.203-52.039 13.051-75.381 54.213-90.049 90.884-4.923 12.307 1.063 26.274 13.37 31.197 12.317 4.926 26.279-1.075 31.196-13.37C75.058 112.99 106.964 120 168 120v27.076c-41.543 10.862-72 49.235-72 94.129V488c0 13.255 10.745 24 24 24h144c13.255 0 24-10.745 24-24V240c0-44.731-30.596-82.312-72-92.97V120h40c0 2.974-1.703 15.716 10.027 17.671l168 28C441.342 166.89 448 161.25 448 153.834V38.166c0-7.416-6.658-13.056-13.973-11.837zM144 72c-8.822 0-16-7.178-16-16s7.178-16 16-16 16 7.178 16 16-7.178 16-16 16z\"]\n};\nvar faFirstAid = {\n prefix: 'fas',\n iconName: 'first-aid',\n icon: [576, 512, [], \"f479\", \"M0 80v352c0 26.5 21.5 48 48 48h48V32H48C21.5 32 0 53.5 0 80zm128 400h320V32H128v448zm64-248c0-4.4 3.6-8 8-8h56v-56c0-4.4 3.6-8 8-8h48c4.4 0 8 3.6 8 8v56h56c4.4 0 8 3.6 8 8v48c0 4.4-3.6 8-8 8h-56v56c0 4.4-3.6 8-8 8h-48c-4.4 0-8-3.6-8-8v-56h-56c-4.4 0-8-3.6-8-8v-48zM528 32h-48v448h48c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48z\"]\n};\nvar faFish = {\n prefix: 'fas',\n iconName: 'fish',\n icon: [576, 512, [], \"f578\", \"M327.1 96c-89.97 0-168.54 54.77-212.27 101.63L27.5 131.58c-12.13-9.18-30.24.6-27.14 14.66L24.54 256 .35 365.77c-3.1 14.06 15.01 23.83 27.14 14.66l87.33-66.05C158.55 361.23 237.13 416 327.1 416 464.56 416 576 288 576 256S464.56 96 327.1 96zm87.43 184c-13.25 0-24-10.75-24-24 0-13.26 10.75-24 24-24 13.26 0 24 10.74 24 24 0 13.25-10.75 24-24 24z\"]\n};\nvar faFistRaised = {\n prefix: 'fas',\n iconName: 'fist-raised',\n icon: [384, 512, [], \"f6de\", \"M255.98 160V16c0-8.84-7.16-16-16-16h-32c-8.84 0-16 7.16-16 16v146.93c5.02-1.78 10.34-2.93 15.97-2.93h48.03zm128 95.99c-.01-35.34-28.66-63.99-63.99-63.99H207.85c-8.78 0-15.9 7.07-15.9 15.85v.56c0 26.27 21.3 47.59 47.57 47.59h35.26c9.68 0 13.2 3.58 13.2 8v16.2c0 4.29-3.59 7.78-7.88 8-44.52 2.28-64.16 24.71-96.05 72.55l-6.31 9.47a7.994 7.994 0 0 1-11.09 2.22l-13.31-8.88a7.994 7.994 0 0 1-2.22-11.09l6.31-9.47c15.73-23.6 30.2-43.26 47.31-58.08-17.27-5.51-31.4-18.12-38.87-34.45-6.59 3.41-13.96 5.52-21.87 5.52h-32c-12.34 0-23.49-4.81-32-12.48C71.48 251.19 60.33 256 48 256H16c-5.64 0-10.97-1.15-16-2.95v77.93c0 33.95 13.48 66.5 37.49 90.51L63.99 448v64h255.98v-63.96l35.91-35.92A96.035 96.035 0 0 0 384 344.21l-.02-88.22zm-32.01-90.09V48c0-8.84-7.16-16-16-16h-32c-8.84 0-16 7.16-16 16v112h32c11.28 0 21.94 2.31 32 5.9zM16 224h32c8.84 0 16-7.16 16-16V80c0-8.84-7.16-16-16-16H16C7.16 64 0 71.16 0 80v128c0 8.84 7.16 16 16 16zm95.99 0h32c8.84 0 16-7.16 16-16V48c0-8.84-7.16-16-16-16h-32c-8.84 0-16 7.16-16 16v160c0 8.84 7.16 16 16 16z\"]\n};\nvar faFlag = {\n prefix: 'fas',\n iconName: 'flag',\n icon: [512, 512, [], \"f024\", \"M349.565 98.783C295.978 98.783 251.721 64 184.348 64c-24.955 0-47.309 4.384-68.045 12.013a55.947 55.947 0 0 0 3.586-23.562C118.117 24.015 94.806 1.206 66.338.048 34.345-1.254 8 24.296 8 56c0 19.026 9.497 35.825 24 45.945V488c0 13.255 10.745 24 24 24h16c13.255 0 24-10.745 24-24v-94.4c28.311-12.064 63.582-22.122 114.435-22.122 53.588 0 97.844 34.783 165.217 34.783 48.169 0 86.667-16.294 122.505-40.858C506.84 359.452 512 349.571 512 339.045v-243.1c0-23.393-24.269-38.87-45.485-29.016-34.338 15.948-76.454 31.854-116.95 31.854z\"]\n};\nvar faFlagCheckered = {\n prefix: 'fas',\n iconName: 'flag-checkered',\n icon: [512, 512, [], \"f11e\", \"M243.2 189.9V258c26.1 5.9 49.3 15.6 73.6 22.3v-68.2c-26-5.8-49.4-15.5-73.6-22.2zm223.3-123c-34.3 15.9-76.5 31.9-117 31.9C296 98.8 251.7 64 184.3 64c-25 0-47.3 4.4-68 12 2.8-7.3 4.1-15.2 3.6-23.6C118.1 24 94.8 1.2 66.3 0 34.3-1.3 8 24.3 8 56c0 19 9.5 35.8 24 45.9V488c0 13.3 10.7 24 24 24h16c13.3 0 24-10.7 24-24v-94.4c28.3-12.1 63.6-22.1 114.4-22.1 53.6 0 97.8 34.8 165.2 34.8 48.2 0 86.7-16.3 122.5-40.9 8.7-6 13.8-15.8 13.8-26.4V95.9c.1-23.3-24.2-38.8-45.4-29zM169.6 325.5c-25.8 2.7-50 8.2-73.6 16.6v-70.5c26.2-9.3 47.5-15 73.6-17.4zM464 191c-23.6 9.8-46.3 19.5-73.6 23.9V286c24.8-3.4 51.4-11.8 73.6-26v70.5c-25.1 16.1-48.5 24.7-73.6 27.1V286c-27 3.7-47.9 1.5-73.6-5.6v67.4c-23.9-7.4-47.3-16.7-73.6-21.3V258c-19.7-4.4-40.8-6.8-73.6-3.8v-70c-22.4 3.1-44.6 10.2-73.6 20.9v-70.5c33.2-12.2 50.1-19.8 73.6-22v71.6c27-3.7 48.4-1.3 73.6 5.7v-67.4c23.7 7.4 47.2 16.7 73.6 21.3v68.4c23.7 5.3 47.6 6.9 73.6 2.7V143c27-4.8 52.3-13.6 73.6-22.5z\"]\n};\nvar faFlagUsa = {\n prefix: 'fas',\n iconName: 'flag-usa',\n icon: [512, 512, [], \"f74d\", \"M32 0C14.3 0 0 14.3 0 32v464c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16V32C64 14.3 49.7 0 32 0zm267.9 303.6c-57.2-15.1-111.7-28.8-203.9 11.1V384c185.7-92.2 221.7 53.3 397.5-23.1 11.4-5 18.5-16.5 18.5-28.8v-36c-43.6 17.3-80.2 24.1-112.1 24.1-37.4-.1-68.9-8.4-100-16.6zm0-96c-57.2-15.1-111.7-28.8-203.9 11.1v61.5c94.8-37.6 154.6-22.7 212.1-7.6 57.2 15.1 111.7 28.8 203.9-11.1V200c-43.6 17.3-80.2 24.1-112.1 24.1-37.4 0-68.9-8.3-100-16.5zm9.5-125.9c51.8 15.6 97.4 29 202.6-20.1V30.8c0-25.1-26.8-38.1-49.4-26.6C291.3 91.5 305.4-62.2 96 32.4v151.9c94.8-37.5 154.6-22.7 212.1-7.6 57.2 15 111.7 28.7 203.9-11.1V96.7c-53.6 23.5-93.3 31.4-126.1 31.4s-59-7.8-85.7-15.9c-4-1.2-8.1-2.4-12.1-3.5V75.5c7.2 2 14.3 4.1 21.3 6.2zM160 128.1c-8.8 0-16-7.1-16-16 0-8.8 7.2-16 16-16s16 7.1 16 16-7.2 16-16 16zm0-55.8c-8.8 0-16-7.1-16-16 0-8.8 7.2-16 16-16s16 7.1 16 16c0 8.8-7.2 16-16 16zm64 47.9c-8.8 0-16-7.1-16-16 0-8.8 7.2-16 16-16s16 7.1 16 16c0 8.8-7.2 16-16 16zm0-55.9c-8.8 0-16-7.1-16-16 0-8.8 7.2-16 16-16s16 7.1 16 16c0 8.8-7.2 16-16 16z\"]\n};\nvar faFlask = {\n prefix: 'fas',\n iconName: 'flask',\n icon: [448, 512, [], \"f0c3\", \"M437.2 403.5L320 215V64h8c13.3 0 24-10.7 24-24V24c0-13.3-10.7-24-24-24H120c-13.3 0-24 10.7-24 24v16c0 13.3 10.7 24 24 24h8v151L10.8 403.5C-18.5 450.6 15.3 512 70.9 512h306.2c55.7 0 89.4-61.5 60.1-108.5zM137.9 320l48.2-77.6c3.7-5.2 5.8-11.6 5.8-18.4V64h64v160c0 6.9 2.2 13.2 5.8 18.4l48.2 77.6h-172z\"]\n};\nvar faFlushed = {\n prefix: 'fas',\n iconName: 'flushed',\n icon: [496, 512, [], \"f579\", \"M344 200c-13.3 0-24 10.7-24 24s10.7 24 24 24 24-10.7 24-24-10.7-24-24-24zm-192 0c-13.3 0-24 10.7-24 24s10.7 24 24 24 24-10.7 24-24-10.7-24-24-24zM248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zM80 224c0-39.8 32.2-72 72-72s72 32.2 72 72-32.2 72-72 72-72-32.2-72-72zm232 176H184c-21.2 0-21.2-32 0-32h128c21.2 0 21.2 32 0 32zm32-104c-39.8 0-72-32.2-72-72s32.2-72 72-72 72 32.2 72 72-32.2 72-72 72z\"]\n};\nvar faFolder = {\n prefix: 'fas',\n iconName: 'folder',\n icon: [512, 512, [], \"f07b\", \"M464 128H272l-64-64H48C21.49 64 0 85.49 0 112v288c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48V176c0-26.51-21.49-48-48-48z\"]\n};\nvar faFolderMinus = {\n prefix: 'fas',\n iconName: 'folder-minus',\n icon: [512, 512, [], \"f65d\", \"M464 128H272l-64-64H48C21.49 64 0 85.49 0 112v288c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48V176c0-26.51-21.49-48-48-48zm-96 168c0 8.84-7.16 16-16 16H160c-8.84 0-16-7.16-16-16v-16c0-8.84 7.16-16 16-16h192c8.84 0 16 7.16 16 16v16z\"]\n};\nvar faFolderOpen = {\n prefix: 'fas',\n iconName: 'folder-open',\n icon: [576, 512, [], \"f07c\", \"M572.694 292.093L500.27 416.248A63.997 63.997 0 0 1 444.989 448H45.025c-18.523 0-30.064-20.093-20.731-36.093l72.424-124.155A64 64 0 0 1 152 256h399.964c18.523 0 30.064 20.093 20.73 36.093zM152 224h328v-48c0-26.51-21.49-48-48-48H272l-64-64H48C21.49 64 0 85.49 0 112v278.046l69.077-118.418C86.214 242.25 117.989 224 152 224z\"]\n};\nvar faFolderPlus = {\n prefix: 'fas',\n iconName: 'folder-plus',\n icon: [512, 512, [], \"f65e\", \"M464 128H272l-64-64H48C21.49 64 0 85.49 0 112v288c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48V176c0-26.51-21.49-48-48-48zm-96 168c0 8.84-7.16 16-16 16h-72v72c0 8.84-7.16 16-16 16h-16c-8.84 0-16-7.16-16-16v-72h-72c-8.84 0-16-7.16-16-16v-16c0-8.84 7.16-16 16-16h72v-72c0-8.84 7.16-16 16-16h16c8.84 0 16 7.16 16 16v72h72c8.84 0 16 7.16 16 16v16z\"]\n};\nvar faFont = {\n prefix: 'fas',\n iconName: 'font',\n icon: [448, 512, [], \"f031\", \"M432 416h-23.41L277.88 53.69A32 32 0 0 0 247.58 32h-47.16a32 32 0 0 0-30.3 21.69L39.41 416H16a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h128a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16h-19.58l23.3-64h152.56l23.3 64H304a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h128a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zM176.85 272L224 142.51 271.15 272z\"]\n};\nvar faFontAwesomeLogoFull = {\n prefix: 'fas',\n iconName: 'font-awesome-logo-full',\n icon: [3992, 512, [\"Font Awesome\"], \"f4e6\", \"M454.6 0H57.4C25.9 0 0 25.9 0 57.4v397.3C0 486.1 25.9 512 57.4 512h397.3c31.4 0 57.4-25.9 57.4-57.4V57.4C512 25.9 486.1 0 454.6 0zm-58.9 324.9c0 4.8-4.1 6.9-8.9 8.9-19.2 8.1-39.7 15.7-61.5 15.7-40.5 0-68.7-44.8-163.2 2.5v51.8c0 30.3-45.7 30.2-45.7 0v-250c-9-7-15-17.9-15-30.3 0-21 17.1-38.2 38.2-38.2 21 0 38.2 17.1 38.2 38.2 0 12.2-5.8 23.2-14.9 30.2v21c37.1-12 65.5-34.4 146.1-3.4 26.6 11.4 68.7-15.7 76.5-15.7 5.5 0 10.3 4.1 10.3 8.9v160.4zm432.9-174.2h-137v70.1H825c39.8 0 40.4 62.2 0 62.2H691.6v105.6c0 45.5-70.7 46.4-70.7 0V128.3c0-22 18-39.8 39.8-39.8h167.8c39.6 0 40.5 62.2.1 62.2zm191.1 23.4c-169.3 0-169.1 252.4 0 252.4 169.9 0 169.9-252.4 0-252.4zm0 196.1c-81.6 0-82.1-139.8 0-139.8 82.5 0 82.4 139.8 0 139.8zm372.4 53.4c-17.5 0-31.4-13.9-31.4-31.4v-117c0-62.4-72.6-52.5-99.1-16.4v133.4c0 41.5-63.3 41.8-63.3 0V208c0-40 63.1-41.6 63.1 0v3.4c43.3-51.6 162.4-60.4 162.4 39.3v141.5c.3 30.4-31.5 31.4-31.7 31.4zm179.7 2.9c-44.3 0-68.3-22.9-68.3-65.8V235.2H1488c-35.6 0-36.7-55.3 0-55.3h15.5v-37.3c0-41.3 63.8-42.1 63.8 0v37.5h24.9c35.4 0 35.7 55.3 0 55.3h-24.9v108.5c0 29.6 26.1 26.3 27.4 26.3 31.4 0 52.6 56.3-22.9 56.3zM1992 123c-19.5-50.2-95.5-50-114.5 0-107.3 275.7-99.5 252.7-99.5 262.8 0 42.8 58.3 51.2 72.1 14.4l13.5-35.9H2006l13 35.9c14.2 37.7 72.1 27.2 72.1-14.4 0-10.1 5.3 6.8-99.1-262.8zm-108.9 179.1l51.7-142.9 51.8 142.9h-103.5zm591.3-85.6l-53.7 176.3c-12.4 41.2-72 41-84 0l-42.3-135.9-42.3 135.9c-12.4 40.9-72 41.2-84.5 0l-54.2-176.3c-12.5-39.4 49.8-56.1 60.2-16.9L2213 342l45.3-139.5c10.9-32.7 59.6-34.7 71.2 0l45.3 139.5 39.3-142.4c10.3-38.3 72.6-23.8 60.3 16.9zm275.4 75.1c0-42.4-33.9-117.5-119.5-117.5-73.2 0-124.4 56.3-124.4 126 0 77.2 55.3 126.4 128.5 126.4 31.7 0 93-11.5 93-39.8 0-18.3-21.1-31.5-39.3-22.4-49.4 26.2-109 8.4-115.9-43.8h148.3c16.3 0 29.3-13.4 29.3-28.9zM2571 277.7c9.5-73.4 113.9-68.6 118.6 0H2571zm316.7 148.8c-31.4 0-81.6-10.5-96.6-31.9-12.4-17 2.5-39.8 21.8-39.8 16.3 0 36.8 22.9 77.7 22.9 27.4 0 40.4-11 40.4-25.8 0-39.8-142.9-7.4-142.9-102 0-40.4 35.3-75.7 98.6-75.7 31.4 0 74.1 9.9 87.6 29.4 10.8 14.8-1.4 36.2-20.9 36.2-15.1 0-26.7-17.3-66.2-17.3-22.9 0-37.8 10.5-37.8 23.8 0 35.9 142.4 6 142.4 103.1-.1 43.7-37.4 77.1-104.1 77.1zm266.8-252.4c-169.3 0-169.1 252.4 0 252.4 170.1 0 169.6-252.4 0-252.4zm0 196.1c-81.8 0-82-139.8 0-139.8 82.5 0 82.4 139.8 0 139.8zm476.9 22V268.7c0-53.8-61.4-45.8-85.7-10.5v134c0 41.3-63.8 42.1-63.8 0V268.7c0-52.1-59.5-47.4-85.7-10.1v133.6c0 41.5-63.3 41.8-63.3 0V208c0-40 63.1-41.6 63.1 0v3.4c9.9-14.4 41.8-37.3 78.6-37.3 35.3 0 57.7 16.4 66.7 43.8 13.9-21.8 45.8-43.8 82.6-43.8 44.3 0 70.7 23.4 70.7 72.7v145.3c.5 17.3-13.5 31.4-31.9 31.4 3.5.1-31.3 1.1-31.3-31.3zM3992 291.6c0-42.4-32.4-117.5-117.9-117.5-73.2 0-127.5 56.3-127.5 126 0 77.2 58.3 126.4 131.6 126.4 31.7 0 91.5-11.5 91.5-39.8 0-18.3-21.1-31.5-39.3-22.4-49.4 26.2-110.5 8.4-117.5-43.8h149.8c16.3 0 29.1-13.4 29.3-28.9zm-180.5-13.9c9.7-74.4 115.9-68.3 120.1 0h-120.1z\"]\n};\nvar faFootballBall = {\n prefix: 'fas',\n iconName: 'football-ball',\n icon: [496, 512, [], \"f44e\", \"M481.5 60.3c-4.8-18.2-19.1-32.5-37.3-37.4C420.3 16.5 383 8.9 339.4 8L496 164.8c-.8-43.5-8.2-80.6-14.5-104.5zm-467 391.4c4.8 18.2 19.1 32.5 37.3 37.4 23.9 6.4 61.2 14 104.8 14.9L0 347.2c.8 43.5 8.2 80.6 14.5 104.5zM4.2 283.4L220.4 500c132.5-19.4 248.8-118.7 271.5-271.4L275.6 12C143.1 31.4 26.8 130.7 4.2 283.4zm317.3-123.6c3.1-3.1 8.2-3.1 11.3 0l11.3 11.3c3.1 3.1 3.1 8.2 0 11.3l-28.3 28.3 28.3 28.3c3.1 3.1 3.1 8.2 0 11.3l-11.3 11.3c-3.1 3.1-8.2 3.1-11.3 0l-28.3-28.3-22.6 22.7 28.3 28.3c3.1 3.1 3.1 8.2 0 11.3l-11.3 11.3c-3.1 3.1-8.2 3.1-11.3 0L248 278.6l-22.6 22.6 28.3 28.3c3.1 3.1 3.1 8.2 0 11.3l-11.3 11.3c-3.1 3.1-8.2 3.1-11.3 0l-28.3-28.3-28.3 28.3c-3.1 3.1-8.2 3.1-11.3 0l-11.3-11.3c-3.1-3.1-3.1-8.2 0-11.3l28.3-28.3-28.3-28.2c-3.1-3.1-3.1-8.2 0-11.3l11.3-11.3c3.1-3.1 8.2-3.1 11.3 0l28.3 28.3 22.6-22.6-28.3-28.3c-3.1-3.1-3.1-8.2 0-11.3l11.3-11.3c3.1-3.1 8.2-3.1 11.3 0l28.3 28.3 22.6-22.6-28.3-28.3c-3.1-3.1-3.1-8.2 0-11.3l11.3-11.3c3.1-3.1 8.2-3.1 11.3 0l28.3 28.3 28.3-28.5z\"]\n};\nvar faForward = {\n prefix: 'fas',\n iconName: 'forward',\n icon: [512, 512, [], \"f04e\", \"M500.5 231.4l-192-160C287.9 54.3 256 68.6 256 96v320c0 27.4 31.9 41.8 52.5 24.6l192-160c15.3-12.8 15.3-36.4 0-49.2zm-256 0l-192-160C31.9 54.3 0 68.6 0 96v320c0 27.4 31.9 41.8 52.5 24.6l192-160c15.3-12.8 15.3-36.4 0-49.2z\"]\n};\nvar faFrog = {\n prefix: 'fas',\n iconName: 'frog',\n icon: [576, 512, [], \"f52e\", \"M446.53 97.43C439.67 60.23 407.19 32 368 32c-39.23 0-71.72 28.29-78.54 65.54C126.75 112.96-.5 250.12 0 416.98.11 451.9 29.08 480 64 480h304c8.84 0 16-7.16 16-16 0-17.67-14.33-32-32-32h-79.49l35.8-48.33c24.14-36.23 10.35-88.28-33.71-106.6-23.89-9.93-51.55-4.65-72.24 10.88l-32.76 24.59c-7.06 5.31-17.09 3.91-22.41-3.19-5.3-7.08-3.88-17.11 3.19-22.41l34.78-26.09c36.84-27.66 88.28-27.62 125.13 0 10.87 8.15 45.87 39.06 40.8 93.21L469.62 480H560c8.84 0 16-7.16 16-16 0-17.67-14.33-32-32-32h-53.63l-98.52-104.68 154.44-86.65A58.16 58.16 0 0 0 576 189.94c0-21.4-11.72-40.95-30.48-51.23-40.56-22.22-98.99-41.28-98.99-41.28zM368 136c-13.26 0-24-10.75-24-24 0-13.26 10.74-24 24-24 13.25 0 24 10.74 24 24 0 13.25-10.75 24-24 24z\"]\n};\nvar faFrown = {\n prefix: 'fas',\n iconName: 'frown',\n icon: [496, 512, [], \"f119\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm80 168c17.7 0 32 14.3 32 32s-14.3 32-32 32-32-14.3-32-32 14.3-32 32-32zm-160 0c17.7 0 32 14.3 32 32s-14.3 32-32 32-32-14.3-32-32 14.3-32 32-32zm170.2 218.2C315.8 367.4 282.9 352 248 352s-67.8 15.4-90.2 42.2c-13.5 16.3-38.1-4.2-24.6-20.5C161.7 339.6 203.6 320 248 320s86.3 19.6 114.7 53.8c13.6 16.2-11 36.7-24.5 20.4z\"]\n};\nvar faFrownOpen = {\n prefix: 'fas',\n iconName: 'frown-open',\n icon: [496, 512, [], \"f57a\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zM136 208c0-17.7 14.3-32 32-32s32 14.3 32 32-14.3 32-32 32-32-14.3-32-32zm187.3 183.3c-31.2-9.6-59.4-15.3-75.3-15.3s-44.1 5.7-75.3 15.3c-11.5 3.5-22.5-6.3-20.5-18.1 7-40 60.1-61.2 95.8-61.2s88.8 21.3 95.8 61.2c2 11.9-9.1 21.6-20.5 18.1zM328 240c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32z\"]\n};\nvar faFunnelDollar = {\n prefix: 'fas',\n iconName: 'funnel-dollar',\n icon: [640, 512, [], \"f662\", \"M433.46 165.94l101.2-111.87C554.61 34.12 540.48 0 512.26 0H31.74C3.52 0-10.61 34.12 9.34 54.07L192 256v155.92c0 12.59 5.93 24.44 16 32l79.99 60c20.86 15.64 48.47 6.97 59.22-13.57C310.8 455.38 288 406.35 288 352c0-89.79 62.05-165.17 145.46-186.06zM480 192c-88.37 0-160 71.63-160 160s71.63 160 160 160 160-71.63 160-160-71.63-160-160-160zm16 239.88V448c0 4.42-3.58 8-8 8h-16c-4.42 0-8-3.58-8-8v-16.29c-11.29-.58-22.27-4.52-31.37-11.35-3.9-2.93-4.1-8.77-.57-12.14l11.75-11.21c2.77-2.64 6.89-2.76 10.13-.73 3.87 2.42 8.26 3.72 12.82 3.72h28.11c6.5 0 11.8-5.92 11.8-13.19 0-5.95-3.61-11.19-8.77-12.73l-45-13.5c-18.59-5.58-31.58-23.42-31.58-43.39 0-24.52 19.05-44.44 42.67-45.07V256c0-4.42 3.58-8 8-8h16c4.42 0 8 3.58 8 8v16.29c11.29.58 22.27 4.51 31.37 11.35 3.9 2.93 4.1 8.77.57 12.14l-11.75 11.21c-2.77 2.64-6.89 2.76-10.13.73-3.87-2.43-8.26-3.72-12.82-3.72h-28.11c-6.5 0-11.8 5.92-11.8 13.19 0 5.95 3.61 11.19 8.77 12.73l45 13.5c18.59 5.58 31.58 23.42 31.58 43.39 0 24.53-19.04 44.44-42.67 45.07z\"]\n};\nvar faFutbol = {\n prefix: 'fas',\n iconName: 'futbol',\n icon: [512, 512, [], \"f1e3\", \"M504 256c0 136.967-111.033 248-248 248S8 392.967 8 256 119.033 8 256 8s248 111.033 248 248zm-48 0l-.003-.282-26.064 22.741-62.679-58.5 16.454-84.355 34.303 3.072c-24.889-34.216-60.004-60.089-100.709-73.141l13.651 31.939L256 139l-74.953-41.525 13.651-31.939c-40.631 13.028-75.78 38.87-100.709 73.141l34.565-3.073 16.192 84.355-62.678 58.5-26.064-22.741-.003.282c0 43.015 13.497 83.952 38.472 117.991l7.704-33.897 85.138 10.447 36.301 77.826-29.902 17.786c40.202 13.122 84.29 13.148 124.572 0l-29.902-17.786 36.301-77.826 85.138-10.447 7.704 33.897C442.503 339.952 456 299.015 456 256zm-248.102 69.571l-29.894-91.312L256 177.732l77.996 56.527-29.622 91.312h-96.476z\"]\n};\nvar faGamepad = {\n prefix: 'fas',\n iconName: 'gamepad',\n icon: [640, 512, [], \"f11b\", \"M480 96H160C71.6 96 0 167.6 0 256s71.6 160 160 160c44.8 0 85.2-18.4 114.2-48h91.5c29 29.6 69.5 48 114.2 48 88.4 0 160-71.6 160-160S568.4 96 480 96zM256 276c0 6.6-5.4 12-12 12h-52v52c0 6.6-5.4 12-12 12h-40c-6.6 0-12-5.4-12-12v-52H76c-6.6 0-12-5.4-12-12v-40c0-6.6 5.4-12 12-12h52v-52c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v52h52c6.6 0 12 5.4 12 12v40zm184 68c-26.5 0-48-21.5-48-48s21.5-48 48-48 48 21.5 48 48-21.5 48-48 48zm80-80c-26.5 0-48-21.5-48-48s21.5-48 48-48 48 21.5 48 48-21.5 48-48 48z\"]\n};\nvar faGasPump = {\n prefix: 'fas',\n iconName: 'gas-pump',\n icon: [512, 512, [], \"f52f\", \"M336 448H16c-8.8 0-16 7.2-16 16v32c0 8.8 7.2 16 16 16h320c8.8 0 16-7.2 16-16v-32c0-8.8-7.2-16-16-16zm157.2-340.7l-81-81c-6.2-6.2-16.4-6.2-22.6 0l-11.3 11.3c-6.2 6.2-6.2 16.4 0 22.6L416 97.9V160c0 28.1 20.9 51.3 48 55.2V376c0 13.2-10.8 24-24 24s-24-10.8-24-24v-32c0-48.6-39.4-88-88-88h-8V64c0-35.3-28.7-64-64-64H96C60.7 0 32 28.7 32 64v352h288V304h8c22.1 0 40 17.9 40 40v27.8c0 37.7 27 72 64.5 75.9 43 4.3 79.5-29.5 79.5-71.7V152.6c0-17-6.8-33.3-18.8-45.3zM256 192H96V64h160v128z\"]\n};\nvar faGavel = {\n prefix: 'fas',\n iconName: 'gavel',\n icon: [512, 512, [], \"f0e3\", \"M504.971 199.362l-22.627-22.627c-9.373-9.373-24.569-9.373-33.941 0l-5.657 5.657L329.608 69.255l5.657-5.657c9.373-9.373 9.373-24.569 0-33.941L312.638 7.029c-9.373-9.373-24.569-9.373-33.941 0L154.246 131.48c-9.373 9.373-9.373 24.569 0 33.941l22.627 22.627c9.373 9.373 24.569 9.373 33.941 0l5.657-5.657 39.598 39.598-81.04 81.04-5.657-5.657c-12.497-12.497-32.758-12.497-45.255 0L9.373 412.118c-12.497 12.497-12.497 32.758 0 45.255l45.255 45.255c12.497 12.497 32.758 12.497 45.255 0l114.745-114.745c12.497-12.497 12.497-32.758 0-45.255l-5.657-5.657 81.04-81.04 39.598 39.598-5.657 5.657c-9.373 9.373-9.373 24.569 0 33.941l22.627 22.627c9.373 9.373 24.569 9.373 33.941 0l124.451-124.451c9.372-9.372 9.372-24.568 0-33.941z\"]\n};\nvar faGem = {\n prefix: 'fas',\n iconName: 'gem',\n icon: [576, 512, [], \"f3a5\", \"M485.5 0L576 160H474.9L405.7 0h79.8zm-128 0l69.2 160H149.3L218.5 0h139zm-267 0h79.8l-69.2 160H0L90.5 0zM0 192h100.7l123 251.7c1.5 3.1-2.7 5.9-5 3.3L0 192zm148.2 0h279.6l-137 318.2c-1 2.4-4.5 2.4-5.5 0L148.2 192zm204.1 251.7l123-251.7H576L357.3 446.9c-2.3 2.7-6.5-.1-5-3.2z\"]\n};\nvar faGenderless = {\n prefix: 'fas',\n iconName: 'genderless',\n icon: [288, 512, [], \"f22d\", \"M144 176c44.1 0 80 35.9 80 80s-35.9 80-80 80-80-35.9-80-80 35.9-80 80-80m0-64C64.5 112 0 176.5 0 256s64.5 144 144 144 144-64.5 144-144-64.5-144-144-144z\"]\n};\nvar faGhost = {\n prefix: 'fas',\n iconName: 'ghost',\n icon: [384, 512, [], \"f6e2\", \"M186.1.09C81.01 3.24 0 94.92 0 200.05v263.92c0 14.26 17.23 21.39 27.31 11.31l24.92-18.53c6.66-4.95 16-3.99 21.51 2.21l42.95 48.35c6.25 6.25 16.38 6.25 22.63 0l40.72-45.85c6.37-7.17 17.56-7.17 23.92 0l40.72 45.85c6.25 6.25 16.38 6.25 22.63 0l42.95-48.35c5.51-6.2 14.85-7.17 21.51-2.21l24.92 18.53c10.08 10.08 27.31 2.94 27.31-11.31V192C384 84 294.83-3.17 186.1.09zM128 224c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm128 0c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32z\"]\n};\nvar faGift = {\n prefix: 'fas',\n iconName: 'gift',\n icon: [512, 512, [], \"f06b\", \"M32 448c0 17.7 14.3 32 32 32h160V320H32v128zm256 32h160c17.7 0 32-14.3 32-32V320H288v160zm192-320h-42.1c6.2-12.1 10.1-25.5 10.1-40 0-48.5-39.5-88-88-88-41.6 0-68.5 21.3-103 68.3-34.5-47-61.4-68.3-103-68.3-48.5 0-88 39.5-88 88 0 14.5 3.8 27.9 10.1 40H32c-17.7 0-32 14.3-32 32v80c0 8.8 7.2 16 16 16h480c8.8 0 16-7.2 16-16v-80c0-17.7-14.3-32-32-32zm-326.1 0c-22.1 0-40-17.9-40-40s17.9-40 40-40c19.9 0 34.6 3.3 86.1 80h-86.1zm206.1 0h-86.1c51.4-76.5 65.7-80 86.1-80 22.1 0 40 17.9 40 40s-17.9 40-40 40z\"]\n};\nvar faGifts = {\n prefix: 'fas',\n iconName: 'gifts',\n icon: [640, 512, [], \"f79c\", \"M240.6 194.1c1.9-30.8 17.3-61.2 44-79.8C279.4 103.5 268.7 96 256 96h-29.4l30.7-22c7.2-5.1 8.9-15.1 3.7-22.3l-9.3-13c-5.1-7.2-15.1-8.9-22.3-3.7l-32 22.9 11.5-30.6c3.1-8.3-1.1-17.5-9.4-20.6l-15-5.6c-8.3-3.1-17.5 1.1-20.6 9.4l-19.9 53-19.9-53.1C121 2.1 111.8-2.1 103.5 1l-15 5.6C80.2 9.7 76 19 79.2 27.2l11.5 30.6L58.6 35c-7.2-5.1-17.2-3.5-22.3 3.7l-9.3 13c-5.1 7.2-3.5 17.2 3.7 22.3l30.7 22H32c-17.7 0-32 14.3-32 32v352c0 17.7 14.3 32 32 32h168.9c-5.5-9.5-8.9-20.3-8.9-32V256c0-29.9 20.8-55 48.6-61.9zM224 480c0 17.7 14.3 32 32 32h160V384H224v96zm224 32h160c17.7 0 32-14.3 32-32v-96H448v128zm160-288h-20.4c2.6-7.6 4.4-15.5 4.4-23.8 0-35.5-27-72.2-72.1-72.2-48.1 0-75.9 47.7-87.9 75.3-12.1-27.6-39.9-75.3-87.9-75.3-45.1 0-72.1 36.7-72.1 72.2 0 8.3 1.7 16.2 4.4 23.8H256c-17.7 0-32 14.3-32 32v96h192V224h15.3l.7-.2.7.2H448v128h192v-96c0-17.7-14.3-32-32-32zm-272 0c-2.7-1.4-5.1-3-7.2-4.8-7.3-6.4-8.8-13.8-8.8-19 0-9.7 6.4-24.2 24.1-24.2 18.7 0 35.6 27.4 44.5 48H336zm199.2-4.8c-2.1 1.8-4.5 3.4-7.2 4.8h-52.6c8.8-20.3 25.8-48 44.5-48 17.7 0 24.1 14.5 24.1 24.2 0 5.2-1.5 12.6-8.8 19z\"]\n};\nvar faGlassCheers = {\n prefix: 'fas',\n iconName: 'glass-cheers',\n icon: [640, 512, [], \"f79f\", \"M639.4 433.6c-8.4-20.4-31.8-30.1-52.2-21.6l-22.1 9.2-38.7-101.9c47.9-35 64.8-100.3 34.5-152.8L474.3 16c-8-13.9-25.1-19.7-40-13.6L320 49.8 205.7 2.4c-14.9-6.2-32-.3-40 13.6L79.1 166.5C48.9 219 65.7 284.3 113.6 319.2L74.9 421.1l-22.1-9.2c-20.4-8.5-43.7 1.2-52.2 21.6-1.7 4.1.2 8.8 4.3 10.5l162.3 67.4c4.1 1.7 8.7-.2 10.4-4.3 8.4-20.4-1.2-43.8-21.6-52.3l-22.1-9.2L173.3 342c4.4.5 8.8 1.3 13.1 1.3 51.7 0 99.4-33.1 113.4-85.3l20.2-75.4 20.2 75.4c14 52.2 61.7 85.3 113.4 85.3 4.3 0 8.7-.8 13.1-1.3L506 445.6l-22.1 9.2c-20.4 8.5-30.1 31.9-21.6 52.3 1.7 4.1 6.4 6 10.4 4.3L635.1 444c4-1.7 6-6.3 4.3-10.4zM275.9 162.1l-112.1-46.5 36.5-63.4 94.5 39.2-18.9 70.7zm88.2 0l-18.9-70.7 94.5-39.2 36.5 63.4-112.1 46.5z\"]\n};\nvar faGlassMartini = {\n prefix: 'fas',\n iconName: 'glass-martini',\n icon: [512, 512, [], \"f000\", \"M502.05 57.6C523.3 36.34 508.25 0 478.2 0H33.8C3.75 0-11.3 36.34 9.95 57.6L224 271.64V464h-56c-22.09 0-40 17.91-40 40 0 4.42 3.58 8 8 8h240c4.42 0 8-3.58 8-8 0-22.09-17.91-40-40-40h-56V271.64L502.05 57.6z\"]\n};\nvar faGlassMartiniAlt = {\n prefix: 'fas',\n iconName: 'glass-martini-alt',\n icon: [512, 512, [], \"f57b\", \"M502.05 57.6C523.3 36.34 508.25 0 478.2 0H33.8C3.75 0-11.3 36.34 9.95 57.6L224 271.64V464h-56c-22.09 0-40 17.91-40 40 0 4.42 3.58 8 8 8h240c4.42 0 8-3.58 8-8 0-22.09-17.91-40-40-40h-56V271.64L502.05 57.6zM443.77 48l-48 48H116.24l-48-48h375.53z\"]\n};\nvar faGlassWhiskey = {\n prefix: 'fas',\n iconName: 'glass-whiskey',\n icon: [512, 512, [], \"f7a0\", \"M480 32H32C12.5 32-2.4 49.2.3 68.5l56 356.5c4.5 31.5 31.5 54.9 63.4 54.9h273c31.8 0 58.9-23.4 63.4-54.9l55.6-356.5C514.4 49.2 499.5 32 480 32zm-37.4 64l-30 192h-313L69.4 96h373.2z\"]\n};\nvar faGlasses = {\n prefix: 'fas',\n iconName: 'glasses',\n icon: [576, 512, [], \"f530\", \"M574.1 280.37L528.75 98.66c-5.91-23.7-21.59-44.05-43-55.81-21.44-11.73-46.97-14.11-70.19-6.33l-15.25 5.08c-8.39 2.79-12.92 11.86-10.12 20.24l5.06 15.18c2.79 8.38 11.85 12.91 20.23 10.12l13.18-4.39c10.87-3.62 23-3.57 33.16 1.73 10.29 5.37 17.57 14.56 20.37 25.82l38.46 153.82c-22.19-6.81-49.79-12.46-81.2-12.46-34.77 0-73.98 7.02-114.85 26.74h-73.18c-40.87-19.74-80.08-26.75-114.86-26.75-31.42 0-59.02 5.65-81.21 12.46l38.46-153.83c2.79-11.25 10.09-20.45 20.38-25.81 10.16-5.3 22.28-5.35 33.15-1.73l13.17 4.39c8.38 2.79 17.44-1.74 20.23-10.12l5.06-15.18c2.8-8.38-1.73-17.45-10.12-20.24l-15.25-5.08c-23.22-7.78-48.75-5.41-70.19 6.33-21.41 11.77-37.09 32.11-43 55.8L1.9 280.37A64.218 64.218 0 0 0 0 295.86v70.25C0 429.01 51.58 480 115.2 480h37.12c60.28 0 110.37-45.94 114.88-105.37l2.93-38.63h35.75l2.93 38.63C313.31 434.06 363.4 480 423.68 480h37.12c63.62 0 115.2-50.99 115.2-113.88v-70.25c0-5.23-.64-10.43-1.9-15.5zm-370.72 89.42c-1.97 25.91-24.4 46.21-51.06 46.21H115.2C86.97 416 64 393.62 64 366.11v-37.54c18.12-6.49 43.42-12.92 72.58-12.92 23.86 0 47.26 4.33 69.93 12.92l-3.13 41.22zM512 366.12c0 27.51-22.97 49.88-51.2 49.88h-37.12c-26.67 0-49.1-20.3-51.06-46.21l-3.13-41.22c22.67-8.59 46.08-12.92 69.95-12.92 29.12 0 54.43 6.44 72.55 12.93v37.54z\"]\n};\nvar faGlobe = {\n prefix: 'fas',\n iconName: 'globe',\n icon: [496, 512, [], \"f0ac\", \"M336.5 160C322 70.7 287.8 8 248 8s-74 62.7-88.5 152h177zM152 256c0 22.2 1.2 43.5 3.3 64h185.3c2.1-20.5 3.3-41.8 3.3-64s-1.2-43.5-3.3-64H155.3c-2.1 20.5-3.3 41.8-3.3 64zm324.7-96c-28.6-67.9-86.5-120.4-158-141.6 24.4 33.8 41.2 84.7 50 141.6h108zM177.2 18.4C105.8 39.6 47.8 92.1 19.3 160h108c8.7-56.9 25.5-107.8 49.9-141.6zM487.4 192H372.7c2.1 21 3.3 42.5 3.3 64s-1.2 43-3.3 64h114.6c5.5-20.5 8.6-41.8 8.6-64s-3.1-43.5-8.5-64zM120 256c0-21.5 1.2-43 3.3-64H8.6C3.2 212.5 0 233.8 0 256s3.2 43.5 8.6 64h114.6c-2-21-3.2-42.5-3.2-64zm39.5 96c14.5 89.3 48.7 152 88.5 152s74-62.7 88.5-152h-177zm159.3 141.6c71.4-21.2 129.4-73.7 158-141.6h-108c-8.8 56.9-25.6 107.8-50 141.6zM19.3 352c28.6 67.9 86.5 120.4 158 141.6-24.4-33.8-41.2-84.7-50-141.6h-108z\"]\n};\nvar faGlobeAfrica = {\n prefix: 'fas',\n iconName: 'globe-africa',\n icon: [496, 512, [], \"f57c\", \"M248 8C111.03 8 0 119.03 0 256s111.03 248 248 248 248-111.03 248-248S384.97 8 248 8zm160 215.5v6.93c0 5.87-3.32 11.24-8.57 13.86l-15.39 7.7a15.485 15.485 0 0 1-15.53-.97l-18.21-12.14a15.52 15.52 0 0 0-13.5-1.81l-2.65.88c-9.7 3.23-13.66 14.79-7.99 23.3l13.24 19.86c2.87 4.31 7.71 6.9 12.89 6.9h8.21c8.56 0 15.5 6.94 15.5 15.5v11.34c0 3.35-1.09 6.62-3.1 9.3l-18.74 24.98c-1.42 1.9-2.39 4.1-2.83 6.43l-4.3 22.83c-.62 3.29-2.29 6.29-4.76 8.56a159.608 159.608 0 0 0-25 29.16l-13.03 19.55a27.756 27.756 0 0 1-23.09 12.36c-10.51 0-20.12-5.94-24.82-15.34a78.902 78.902 0 0 1-8.33-35.29V367.5c0-8.56-6.94-15.5-15.5-15.5h-25.88c-14.49 0-28.38-5.76-38.63-16a54.659 54.659 0 0 1-16-38.63v-14.06c0-17.19 8.1-33.38 21.85-43.7l27.58-20.69a54.663 54.663 0 0 1 32.78-10.93h.89c8.48 0 16.85 1.97 24.43 5.77l14.72 7.36c3.68 1.84 7.93 2.14 11.83.84l47.31-15.77c6.33-2.11 10.6-8.03 10.6-14.7 0-8.56-6.94-15.5-15.5-15.5h-10.09c-4.11 0-8.05-1.63-10.96-4.54l-6.92-6.92a15.493 15.493 0 0 0-10.96-4.54H199.5c-8.56 0-15.5-6.94-15.5-15.5v-4.4c0-7.11 4.84-13.31 11.74-15.04l14.45-3.61c3.74-.94 7-3.23 9.14-6.44l8.08-12.11c2.87-4.31 7.71-6.9 12.89-6.9h24.21c8.56 0 15.5-6.94 15.5-15.5v-21.7C359.23 71.63 422.86 131.02 441.93 208H423.5c-8.56 0-15.5 6.94-15.5 15.5z\"]\n};\nvar faGlobeAmericas = {\n prefix: 'fas',\n iconName: 'globe-americas',\n icon: [496, 512, [], \"f57d\", \"M248 8C111.03 8 0 119.03 0 256s111.03 248 248 248 248-111.03 248-248S384.97 8 248 8zm82.29 357.6c-3.9 3.88-7.99 7.95-11.31 11.28-2.99 3-5.1 6.7-6.17 10.71-1.51 5.66-2.73 11.38-4.77 16.87l-17.39 46.85c-13.76 3-28 4.69-42.65 4.69v-27.38c1.69-12.62-7.64-36.26-22.63-51.25-6-6-9.37-14.14-9.37-22.63v-32.01c0-11.64-6.27-22.34-16.46-27.97-14.37-7.95-34.81-19.06-48.81-26.11-11.48-5.78-22.1-13.14-31.65-21.75l-.8-.72a114.792 114.792 0 0 1-18.06-20.74c-9.38-13.77-24.66-36.42-34.59-51.14 20.47-45.5 57.36-82.04 103.2-101.89l24.01 12.01C203.48 89.74 216 82.01 216 70.11v-11.3c7.99-1.29 16.12-2.11 24.39-2.42l28.3 28.3c6.25 6.25 6.25 16.38 0 22.63L264 112l-10.34 10.34c-3.12 3.12-3.12 8.19 0 11.31l4.69 4.69c3.12 3.12 3.12 8.19 0 11.31l-8 8a8.008 8.008 0 0 1-5.66 2.34h-8.99c-2.08 0-4.08.81-5.58 2.27l-9.92 9.65a8.008 8.008 0 0 0-1.58 9.31l15.59 31.19c2.66 5.32-1.21 11.58-7.15 11.58h-5.64c-1.93 0-3.79-.7-5.24-1.96l-9.28-8.06a16.017 16.017 0 0 0-15.55-3.1l-31.17 10.39a11.95 11.95 0 0 0-8.17 11.34c0 4.53 2.56 8.66 6.61 10.69l11.08 5.54c9.41 4.71 19.79 7.16 30.31 7.16s22.59 27.29 32 32h66.75c8.49 0 16.62 3.37 22.63 9.37l13.69 13.69a30.503 30.503 0 0 1 8.93 21.57 46.536 46.536 0 0 1-13.72 32.98zM417 274.25c-5.79-1.45-10.84-5-14.15-9.97l-17.98-26.97a23.97 23.97 0 0 1 0-26.62l19.59-29.38c2.32-3.47 5.5-6.29 9.24-8.15l12.98-6.49C440.2 193.59 448 223.87 448 256c0 8.67-.74 17.16-1.82 25.54L417 274.25z\"]\n};\nvar faGlobeAsia = {\n prefix: 'fas',\n iconName: 'globe-asia',\n icon: [496, 512, [], \"f57e\", \"M248 8C111.03 8 0 119.03 0 256s111.03 248 248 248 248-111.03 248-248S384.97 8 248 8zm-11.34 240.23c-2.89 4.82-8.1 7.77-13.72 7.77h-.31c-4.24 0-8.31 1.69-11.31 4.69l-5.66 5.66c-3.12 3.12-3.12 8.19 0 11.31l5.66 5.66c3 3 4.69 7.07 4.69 11.31V304c0 8.84-7.16 16-16 16h-6.11c-6.06 0-11.6-3.42-14.31-8.85l-22.62-45.23c-2.44-4.88-8.95-5.94-12.81-2.08l-19.47 19.46c-3 3-7.07 4.69-11.31 4.69H50.81C49.12 277.55 48 266.92 48 256c0-110.28 89.72-200 200-200 21.51 0 42.2 3.51 61.63 9.82l-50.16 38.53c-5.11 3.41-4.63 11.06.86 13.81l10.83 5.41c5.42 2.71 8.84 8.25 8.84 14.31V216c0 4.42-3.58 8-8 8h-3.06c-3.03 0-5.8-1.71-7.15-4.42-1.56-3.12-5.96-3.29-7.76-.3l-17.37 28.95zM408 358.43c0 4.24-1.69 8.31-4.69 11.31l-9.57 9.57c-3 3-7.07 4.69-11.31 4.69h-15.16c-4.24 0-8.31-1.69-11.31-4.69l-13.01-13.01a26.767 26.767 0 0 0-25.42-7.04l-21.27 5.32c-1.27.32-2.57.48-3.88.48h-10.34c-4.24 0-8.31-1.69-11.31-4.69l-11.91-11.91a8.008 8.008 0 0 1-2.34-5.66v-10.2c0-3.27 1.99-6.21 5.03-7.43l39.34-15.74c1.98-.79 3.86-1.82 5.59-3.05l23.71-16.89a7.978 7.978 0 0 1 4.64-1.48h12.09c3.23 0 6.15 1.94 7.39 4.93l5.35 12.85a4 4 0 0 0 3.69 2.46h3.8c1.78 0 3.35-1.18 3.84-2.88l4.2-14.47c.5-1.71 2.06-2.88 3.84-2.88h6.06c2.21 0 4 1.79 4 4v12.93c0 2.12.84 4.16 2.34 5.66l11.91 11.91c3 3 4.69 7.07 4.69 11.31v24.6z\"]\n};\nvar faGlobeEurope = {\n prefix: 'fas',\n iconName: 'globe-europe',\n icon: [496, 512, [], \"f7a2\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm200 248c0 22.5-3.9 44.2-10.8 64.4h-20.3c-4.3 0-8.4-1.7-11.4-4.8l-32-32.6c-4.5-4.6-4.5-12.1.1-16.7l12.5-12.5v-8.7c0-3-1.2-5.9-3.3-8l-9.4-9.4c-2.1-2.1-5-3.3-8-3.3h-16c-6.2 0-11.3-5.1-11.3-11.3 0-3 1.2-5.9 3.3-8l9.4-9.4c2.1-2.1 5-3.3 8-3.3h32c6.2 0 11.3-5.1 11.3-11.3v-9.4c0-6.2-5.1-11.3-11.3-11.3h-36.7c-8.8 0-16 7.2-16 16v4.5c0 6.9-4.4 13-10.9 15.2l-31.6 10.5c-3.3 1.1-5.5 4.1-5.5 7.6v2.2c0 4.4-3.6 8-8 8h-16c-4.4 0-8-3.6-8-8s-3.6-8-8-8H247c-3 0-5.8 1.7-7.2 4.4l-9.4 18.7c-2.7 5.4-8.2 8.8-14.3 8.8H194c-8.8 0-16-7.2-16-16V199c0-4.2 1.7-8.3 4.7-11.3l20.1-20.1c4.6-4.6 7.2-10.9 7.2-17.5 0-3.4 2.2-6.5 5.5-7.6l40-13.3c1.7-.6 3.2-1.5 4.4-2.7l26.8-26.8c2.1-2.1 3.3-5 3.3-8 0-6.2-5.1-11.3-11.3-11.3H258l-16 16v8c0 4.4-3.6 8-8 8h-16c-4.4 0-8-3.6-8-8v-20c0-2.5 1.2-4.9 3.2-6.4l28.9-21.7c1.9-.1 3.8-.3 5.7-.3C358.3 56 448 145.7 448 256zM130.1 149.1c0-3 1.2-5.9 3.3-8l25.4-25.4c2.1-2.1 5-3.3 8-3.3 6.2 0 11.3 5.1 11.3 11.3v16c0 3-1.2 5.9-3.3 8l-9.4 9.4c-2.1 2.1-5 3.3-8 3.3h-16c-6.2 0-11.3-5.1-11.3-11.3zm128 306.4v-7.1c0-8.8-7.2-16-16-16h-20.2c-10.8 0-26.7-5.3-35.4-11.8l-22.2-16.7c-11.5-8.6-18.2-22.1-18.2-36.4v-23.9c0-16 8.4-30.8 22.1-39l42.9-25.7c7.1-4.2 15.2-6.5 23.4-6.5h31.2c10.9 0 21.4 3.9 29.6 10.9l43.2 37.1h18.3c8.5 0 16.6 3.4 22.6 9.4l17.3 17.3c3.4 3.4 8.1 5.3 12.9 5.3H423c-32.4 58.9-93.8 99.5-164.9 103.1z\"]\n};\nvar faGolfBall = {\n prefix: 'fas',\n iconName: 'golf-ball',\n icon: [416, 512, [], \"f450\", \"M96 416h224c0 17.7-14.3 32-32 32h-16c-17.7 0-32 14.3-32 32v20c0 6.6-5.4 12-12 12h-40c-6.6 0-12-5.4-12-12v-20c0-17.7-14.3-32-32-32h-16c-17.7 0-32-14.3-32-32zm320-208c0 74.2-39 139.2-97.5 176h-221C39 347.2 0 282.2 0 208 0 93.1 93.1 0 208 0s208 93.1 208 208zm-180.1 43.9c18.3 0 33.1-14.8 33.1-33.1 0-14.4-9.3-26.3-22.1-30.9 9.6 26.8-15.6 51.3-41.9 41.9 4.6 12.8 16.5 22.1 30.9 22.1zm49.1 46.9c0-14.4-9.3-26.3-22.1-30.9 9.6 26.8-15.6 51.3-41.9 41.9 4.6 12.8 16.5 22.1 30.9 22.1 18.3 0 33.1-14.9 33.1-33.1zm64-64c0-14.4-9.3-26.3-22.1-30.9 9.6 26.8-15.6 51.3-41.9 41.9 4.6 12.8 16.5 22.1 30.9 22.1 18.3 0 33.1-14.9 33.1-33.1z\"]\n};\nvar faGopuram = {\n prefix: 'fas',\n iconName: 'gopuram',\n icon: [512, 512, [], \"f664\", \"M496 352h-16V240c0-8.8-7.2-16-16-16h-16v-80c0-8.8-7.2-16-16-16h-16V16c0-8.8-7.2-16-16-16s-16 7.2-16 16v16h-64V16c0-8.8-7.2-16-16-16s-16 7.2-16 16v16h-64V16c0-8.8-7.2-16-16-16s-16 7.2-16 16v16h-64V16c0-8.8-7.2-16-16-16S96 7.2 96 16v112H80c-8.8 0-16 7.2-16 16v80H48c-8.8 0-16 7.2-16 16v112H16c-8.8 0-16 7.2-16 16v128c0 8.8 7.2 16 16 16h80V352h32V224h32v-96h32v96h-32v128h-32v160h80v-80c0-8.8 7.2-16 16-16h64c8.8 0 16 7.2 16 16v80h80V352h-32V224h-32v-96h32v96h32v128h32v160h80c8.8 0 16-7.2 16-16V368c0-8.8-7.2-16-16-16zM232 176c0-8.8 7.2-16 16-16h16c8.8 0 16 7.2 16 16v48h-48zm56 176h-64v-64c0-8.8 7.2-16 16-16h32c8.8 0 16 7.2 16 16z\"]\n};\nvar faGraduationCap = {\n prefix: 'fas',\n iconName: 'graduation-cap',\n icon: [640, 512, [], \"f19d\", \"M622.34 153.2L343.4 67.5c-15.2-4.67-31.6-4.67-46.79 0L17.66 153.2c-23.54 7.23-23.54 38.36 0 45.59l48.63 14.94c-10.67 13.19-17.23 29.28-17.88 46.9C38.78 266.15 32 276.11 32 288c0 10.78 5.68 19.85 13.86 25.65L20.33 428.53C18.11 438.52 25.71 448 35.94 448h56.11c10.24 0 17.84-9.48 15.62-19.47L82.14 313.65C90.32 307.85 96 298.78 96 288c0-11.57-6.47-21.25-15.66-26.87.76-15.02 8.44-28.3 20.69-36.72L296.6 284.5c9.06 2.78 26.44 6.25 46.79 0l278.95-85.7c23.55-7.24 23.55-38.36 0-45.6zM352.79 315.09c-28.53 8.76-52.84 3.92-65.59 0l-145.02-44.55L128 384c0 35.35 85.96 64 192 64s192-28.65 192-64l-14.18-113.47-145.03 44.56z\"]\n};\nvar faGreaterThan = {\n prefix: 'fas',\n iconName: 'greater-than',\n icon: [384, 512, [], \"f531\", \"M365.52 209.85L59.22 67.01c-16.06-7.49-35.15-.54-42.64 15.52L3.01 111.61c-7.49 16.06-.54 35.15 15.52 42.64L236.96 256.1 18.49 357.99C2.47 365.46-4.46 384.5 3.01 400.52l13.52 29C24 445.54 43.04 452.47 59.06 445l306.47-142.91a32.003 32.003 0 0 0 18.48-29v-34.23c-.01-12.45-7.21-23.76-18.49-29.01z\"]\n};\nvar faGreaterThanEqual = {\n prefix: 'fas',\n iconName: 'greater-than-equal',\n icon: [448, 512, [], \"f532\", \"M55.22 107.69l175.56 68.09-175.44 68.05c-18.39 6.03-27.88 24.39-21.2 41l12.09 30.08c6.68 16.61 26.99 25.19 45.38 19.15L393.02 214.2c13.77-4.52 22.98-16.61 22.98-30.17v-15.96c0-13.56-9.21-25.65-22.98-30.17L91.3 17.92c-18.29-6-38.51 2.53-45.15 19.06L34.12 66.9c-6.64 16.53 2.81 34.79 21.1 40.79zM424 400H24c-13.25 0-24 10.74-24 24v48c0 13.25 10.75 24 24 24h400c13.25 0 24-10.75 24-24v-48c0-13.26-10.75-24-24-24z\"]\n};\nvar faGrimace = {\n prefix: 'fas',\n iconName: 'grimace',\n icon: [496, 512, [], \"f57f\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zM144 400h-8c-17.7 0-32-14.3-32-32v-8h40v40zm0-56h-40v-8c0-17.7 14.3-32 32-32h8v40zm-8-136c0-17.7 14.3-32 32-32s32 14.3 32 32-14.3 32-32 32-32-14.3-32-32zm72 192h-48v-40h48v40zm0-56h-48v-40h48v40zm64 56h-48v-40h48v40zm0-56h-48v-40h48v40zm64 56h-48v-40h48v40zm0-56h-48v-40h48v40zm-8-104c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32zm64 128c0 17.7-14.3 32-32 32h-8v-40h40v8zm0-24h-40v-40h8c17.7 0 32 14.3 32 32v8z\"]\n};\nvar faGrin = {\n prefix: 'fas',\n iconName: 'grin',\n icon: [496, 512, [], \"f580\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm80 168c17.7 0 32 14.3 32 32s-14.3 32-32 32-32-14.3-32-32 14.3-32 32-32zm-160 0c17.7 0 32 14.3 32 32s-14.3 32-32 32-32-14.3-32-32 14.3-32 32-32zm80 256c-60.6 0-134.5-38.3-143.8-93.3-2-11.8 9.3-21.6 20.7-17.9C155.1 330.5 200 336 248 336s92.9-5.5 123.1-15.2c11.3-3.7 22.6 6.1 20.7 17.9-9.3 55-83.2 93.3-143.8 93.3z\"]\n};\nvar faGrinAlt = {\n prefix: 'fas',\n iconName: 'grin-alt',\n icon: [496, 512, [], \"f581\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm63.7 128.7c7.6-11.4 24.7-11.7 32.7 0 12.4 18.4 15.1 36.9 15.7 55.3-.5 18.4-3.3 36.9-15.7 55.3-7.6 11.4-24.7 11.7-32.7 0-12.4-18.4-15.1-36.9-15.7-55.3.5-18.4 3.3-36.9 15.7-55.3zm-160 0c7.6-11.4 24.7-11.7 32.7 0 12.4 18.4 15.1 36.9 15.7 55.3-.5 18.4-3.3 36.9-15.7 55.3-7.6 11.4-24.7 11.7-32.7 0-12.4-18.4-15.1-36.9-15.7-55.3.5-18.4 3.3-36.9 15.7-55.3zM248 432c-60.6 0-134.5-38.3-143.8-93.3-2-11.8 9.3-21.6 20.7-17.9C155.1 330.5 200 336 248 336s92.9-5.5 123.1-15.2c11.4-3.7 22.6 6.1 20.7 17.9-9.3 55-83.2 93.3-143.8 93.3z\"]\n};\nvar faGrinBeam = {\n prefix: 'fas',\n iconName: 'grin-beam',\n icon: [496, 512, [], \"f582\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm80 144c23.8 0 52.7 29.3 56 71.4.7 8.6-10.8 11.9-14.9 4.5l-9.5-17c-7.7-13.7-19.2-21.6-31.5-21.6s-23.8 7.9-31.5 21.6l-9.5 17c-4.1 7.3-15.6 4-14.9-4.5 3.1-42.1 32-71.4 55.8-71.4zm-160 0c23.8 0 52.7 29.3 56 71.4.7 8.6-10.8 11.9-14.9 4.5l-9.5-17c-7.7-13.7-19.2-21.6-31.5-21.6s-23.8 7.9-31.5 21.6l-9.5 17c-4.2 7.4-15.6 4-14.9-4.5 3.1-42.1 32-71.4 55.8-71.4zm80 280c-60.6 0-134.5-38.3-143.8-93.3-2-11.9 9.4-21.6 20.7-17.9C155.1 330.5 200 336 248 336s92.9-5.5 123.1-15.2c11.4-3.7 22.6 6.1 20.7 17.9-9.3 55-83.2 93.3-143.8 93.3z\"]\n};\nvar faGrinBeamSweat = {\n prefix: 'fas',\n iconName: 'grin-beam-sweat',\n icon: [504, 512, [], \"f583\", \"M456 128c26.5 0 48-21 48-47 0-20-28.5-60.4-41.6-77.8-3.2-4.3-9.6-4.3-12.8 0C436.5 20.6 408 61 408 81c0 26 21.5 47 48 47zm0 32c-44.1 0-80-35.4-80-79 0-4.4.3-14.2 8.1-32.2C345 23.1 298.3 8 248 8 111 8 0 119 0 256s111 248 248 248 248-111 248-248c0-35.1-7.4-68.4-20.5-98.6-6.3 1.5-12.7 2.6-19.5 2.6zm-128-8c23.8 0 52.7 29.3 56 71.4.7 8.6-10.8 12-14.9 4.5l-9.5-17c-7.7-13.7-19.2-21.6-31.5-21.6s-23.8 7.9-31.5 21.6l-9.5 17c-4.1 7.4-15.6 4-14.9-4.5 3.1-42.1 32-71.4 55.8-71.4zm-160 0c23.8 0 52.7 29.3 56 71.4.7 8.6-10.8 12-14.9 4.5l-9.5-17c-7.7-13.7-19.2-21.6-31.5-21.6s-23.8 7.9-31.5 21.6l-9.5 17c-4.2 7.4-15.6 4-14.9-4.5 3.1-42.1 32-71.4 55.8-71.4zm80 280c-60.6 0-134.5-38.3-143.8-93.3-2-11.8 9.3-21.6 20.7-17.9C155.1 330.5 200 336 248 336s92.9-5.5 123.1-15.2c11.5-3.7 22.6 6.2 20.7 17.9-9.3 55-83.2 93.3-143.8 93.3z\"]\n};\nvar faGrinHearts = {\n prefix: 'fas',\n iconName: 'grin-hearts',\n icon: [496, 512, [], \"f584\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zM90.4 183.6c6.7-17.6 26.7-26.7 44.9-21.9l7.1 1.9 2-7.1c5-18.1 22.8-30.9 41.5-27.9 21.4 3.4 34.4 24.2 28.8 44.5L195.3 243c-1.2 4.5-5.9 7.2-10.5 6l-70.2-18.2c-20.4-5.4-31.9-27-24.2-47.2zM248 432c-60.6 0-134.5-38.3-143.8-93.3-2-11.8 9.2-21.5 20.7-17.9C155.1 330.5 200 336 248 336s92.9-5.5 123.1-15.2c11.4-3.6 22.6 6.1 20.7 17.9-9.3 55-83.2 93.3-143.8 93.3zm133.4-201.3l-70.2 18.2c-4.5 1.2-9.2-1.5-10.5-6L281.3 173c-5.6-20.3 7.4-41.1 28.8-44.5 18.6-3 36.4 9.8 41.5 27.9l2 7.1 7.1-1.9c18.2-4.7 38.2 4.3 44.9 21.9 7.7 20.3-3.8 41.9-24.2 47.2z\"]\n};\nvar faGrinSquint = {\n prefix: 'fas',\n iconName: 'grin-squint',\n icon: [496, 512, [], \"f585\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm33.8 189.7l80-48c11.6-6.9 24 7.7 15.4 18L343.6 208l33.6 40.3c8.7 10.4-3.9 24.8-15.4 18l-80-48c-7.7-4.7-7.7-15.9 0-20.6zm-163-30c-8.6-10.3 3.8-24.9 15.4-18l80 48c7.8 4.7 7.8 15.9 0 20.6l-80 48c-11.5 6.8-24-7.6-15.4-18l33.6-40.3-33.6-40.3zM248 432c-60.6 0-134.5-38.3-143.8-93.3-2-11.9 9.4-21.6 20.7-17.9C155.1 330.5 200 336 248 336s92.9-5.5 123.1-15.2c11.5-3.7 22.6 6.2 20.7 17.9-9.3 55-83.2 93.3-143.8 93.3z\"]\n};\nvar faGrinSquintTears = {\n prefix: 'fas',\n iconName: 'grin-squint-tears',\n icon: [512, 512, [], \"f586\", \"M409.6 111.9c22.6-3.2 73.5-12 88.3-26.8 19.2-19.2 18.9-50.6-.7-70.2S446-5 426.9 14.2c-14.8 14.8-23.5 65.7-26.8 88.3-.8 5.5 3.9 10.2 9.5 9.4zM102.4 400.1c-22.6 3.2-73.5 12-88.3 26.8-19.1 19.1-18.8 50.6.8 70.2s51 19.9 70.2.7c14.8-14.8 23.5-65.7 26.8-88.3.8-5.5-3.9-10.2-9.5-9.4zm311.7-256.5c-33 3.9-48.6-25.1-45.7-45.7 3.4-24 7.4-42.1 11.5-56.5C285.1-13.4 161.8-.5 80.6 80.6-.5 161.7-13.4 285 41.4 379.9c14.4-4.1 32.4-8 56.5-11.5 33.2-3.9 48.6 25.2 45.7 45.7-3.4 24-7.4 42.1-11.5 56.5 94.8 54.8 218.1 41.9 299.3-39.2s94-204.4 39.2-299.3c-14.4 4.1-32.5 8-56.5 11.5zM255.7 106c3.3-13.2 22.4-11.5 23.6 1.8l4.8 52.3 52.3 4.8c13.4 1.2 14.9 20.3 1.8 23.6l-90.5 22.6c-8.9 2.2-16.7-5.9-14.5-14.5l22.5-90.6zm-90.9 230.3L160 284l-52.3-4.8c-13.4-1.2-14.9-20.3-1.8-23.6l90.5-22.6c8.8-2.2 16.7 5.8 14.5 14.5L188.3 338c-3.1 13.2-22.2 11.7-23.5-1.7zm215.7 44.2c-29.3 29.3-75.7 50.4-116.7 50.4-18.9 0-36.6-4.5-51-14.7-9.8-6.9-8.7-21.8 2-27.2 28.3-14.6 63.9-42.4 97.8-76.3s61.7-69.6 76.3-97.8c5.4-10.5 20.2-11.9 27.3-2 32.3 45.3 7.1 124.7-35.7 167.6z\"]\n};\nvar faGrinStars = {\n prefix: 'fas',\n iconName: 'grin-stars',\n icon: [496, 512, [], \"f587\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zM94.6 168.9l34.9-5 15.5-31.6c2.9-5.8 11-5.8 13.9 0l15.5 31.6 34.9 5c6.2 1 8.9 8.6 4.3 13.2l-25.4 24.6 6 34.9c1 6.2-5.3 11-11 7.9L152 233.3l-31.3 16.3c-5.7 3.1-12-1.7-11-7.9l6-34.9-25.4-24.6c-4.6-4.7-1.9-12.3 4.3-13.3zM248 432c-60.6 0-134.5-38.3-143.8-93.3-2-11.8 9.3-21.5 20.7-17.9C155.1 330.5 200 336 248 336s92.9-5.5 123.1-15.2c11.5-3.7 22.6 6.1 20.7 17.9-9.3 55-83.2 93.3-143.8 93.3zm157.7-249.9l-25.4 24.6 6 34.9c1 6.2-5.3 11-11 7.9L344 233.3l-31.3 16.3c-5.7 3.1-12-1.7-11-7.9l6-34.9-25.4-24.6c-4.5-4.6-1.9-12.2 4.3-13.2l34.9-5 15.5-31.6c2.9-5.8 11-5.8 13.9 0l15.5 31.6 34.9 5c6.3.9 9 8.5 4.4 13.1z\"]\n};\nvar faGrinTears = {\n prefix: 'fas',\n iconName: 'grin-tears',\n icon: [640, 512, [], \"f588\", \"M102.4 256.1c-22.6 3.2-73.5 12-88.3 26.8-19.1 19.1-18.8 50.6.8 70.2s51 19.9 70.2.7c14.8-14.8 23.5-65.7 26.8-88.3.8-5.5-3.9-10.2-9.5-9.4zm523.4 26.8c-14.8-14.8-65.7-23.5-88.3-26.8-5.5-.8-10.3 3.9-9.5 9.5 3.2 22.6 12 73.5 26.8 88.3 19.2 19.2 50.6 18.9 70.2-.7s20-51.2.8-70.3zm-129.4-12.8c-3.8-26.6 19.1-49.5 45.7-45.7 8.9 1.3 16.8 2.7 24.3 4.1C552.7 104.5 447.7 8 320 8S87.3 104.5 73.6 228.5c7.5-1.4 15.4-2.8 24.3-4.1 33.2-3.9 48.6 25.3 45.7 45.7-11.8 82.3-29.9 100.4-35.8 106.4-.9.9-2 1.6-3 2.5 42.7 74.6 123 125 215.2 125s172.5-50.4 215.2-125.1c-1-.9-2.1-1.5-3-2.5-5.9-5.9-24-24-35.8-106.3zM400 152c23.8 0 52.7 29.3 56 71.4.7 8.6-10.8 12-14.9 4.5l-9.5-17c-7.7-13.7-19.2-21.6-31.5-21.6s-23.8 7.9-31.5 21.6l-9.5 17c-4.2 7.4-15.6 4-14.9-4.5 3.1-42.1 32-71.4 55.8-71.4zm-160 0c23.8 0 52.7 29.3 56 71.4.7 8.6-10.8 12-14.9 4.5l-9.5-17c-7.7-13.7-19.2-21.6-31.5-21.6s-23.8 7.9-31.5 21.6l-9.5 17c-4.2 7.4-15.6 4-14.9-4.5 3.1-42.1 32-71.4 55.8-71.4zm80 280c-60.6 0-134.5-38.3-143.8-93.3-2-11.7 9.2-21.6 20.7-17.9C227.1 330.5 272 336 320 336s92.9-5.5 123.1-15.2c11.4-3.7 22.6 6.1 20.7 17.9-9.3 55-83.2 93.3-143.8 93.3z\"]\n};\nvar faGrinTongue = {\n prefix: 'fas',\n iconName: 'grin-tongue',\n icon: [496, 512, [], \"f589\", \"M248 8C111 8 0 119 0 256c0 106.3 67 196.7 161 232-5.6-12.2-9-25.7-9-40v-45.5c-24.7-16.2-43.5-38.1-47.8-63.8-2-11.8 9.3-21.5 20.7-17.9C155.1 330.5 200 336 248 336s92.9-5.5 123.1-15.2c11.4-3.6 22.6 6.1 20.7 17.9-4.3 25.7-23.1 47.6-47.8 63.8V448c0 14.3-3.4 27.8-9 40 94-35.3 161-125.7 161-232C496 119 385 8 248 8zm-80 232c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32zm160 0c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32zm-34.9 134.6c-14.4-6.5-31.1 2.2-34.6 17.6l-1.8 7.8c-2.1 9.2-15.2 9.2-17.3 0l-1.8-7.8c-3.5-15.4-20.2-24.1-34.6-17.6-.9.4.3-.2-18.9 9.4v63c0 35.2 28 64.5 63.1 64.9 35.7.5 64.9-28.4 64.9-64v-64c-19.5-9.6-18.2-8.9-19-9.3z\"]\n};\nvar faGrinTongueSquint = {\n prefix: 'fas',\n iconName: 'grin-tongue-squint',\n icon: [496, 512, [], \"f58a\", \"M293.1 374.6c-14.4-6.5-31.1 2.2-34.6 17.6l-1.8 7.8c-2.1 9.2-15.2 9.2-17.3 0l-1.8-7.8c-3.5-15.4-20.2-24.1-34.6-17.6-.9.4.3-.2-18.9 9.4v63c0 35.2 28 64.5 63.1 64.9 35.7.5 64.9-28.4 64.9-64v-64c-19.5-9.6-18.2-8.9-19-9.3zM248 8C111 8 0 119 0 256c0 106.3 67 196.7 161 232-5.6-12.2-9-25.7-9-40v-45.5c-24.7-16.2-43.5-38.1-47.8-63.8-2-11.8 9.2-21.5 20.7-17.9C155.1 330.5 200 336 248 336s92.9-5.5 123.1-15.2c11.4-3.7 22.6 6.1 20.7 17.9-4.3 25.7-23.1 47.6-47.8 63.8V448c0 14.3-3.4 27.8-9 40 94-35.3 161-125.7 161-232C496 119 385 8 248 8zm-33.8 210.3l-80 48c-11.5 6.8-24-7.6-15.4-18l33.6-40.3-33.6-40.3c-8.6-10.3 3.8-24.9 15.4-18l80 48c7.7 4.7 7.7 15.9 0 20.6zm163 30c8.7 10.4-3.9 24.8-15.4 18l-80-48c-7.8-4.7-7.8-15.9 0-20.6l80-48c11.7-6.9 23.9 7.7 15.4 18L343.6 208l33.6 40.3z\"]\n};\nvar faGrinTongueWink = {\n prefix: 'fas',\n iconName: 'grin-tongue-wink',\n icon: [496, 512, [], \"f58b\", \"M344 184c-13.3 0-24 10.7-24 24s10.7 24 24 24 24-10.7 24-24-10.7-24-24-24zM248 8C111 8 0 119 0 256c0 106.3 67 196.7 161 232-5.6-12.2-9-25.7-9-40v-45.5c-24.7-16.2-43.5-38.1-47.8-63.8-2-11.8 9.3-21.5 20.7-17.9C155.1 330.5 200 336 248 336s92.9-5.5 123.1-15.2c11.5-3.7 22.6 6.1 20.7 17.9-4.3 25.7-23.1 47.6-47.8 63.8V448c0 14.3-3.4 27.8-9 40 94-35.3 161-125.7 161-232C496 119 385 8 248 8zm-56 225l-9.5-8.5c-14.8-13.2-46.2-13.2-61 0L112 233c-8.5 7.4-21.6.3-19.8-10.8 4-25.2 34.2-42.1 59.9-42.1S208 197 212 222.2c1.6 11.1-11.6 18.2-20 10.8zm152 39c-35.3 0-64-28.7-64-64s28.7-64 64-64 64 28.7 64 64-28.7 64-64 64zm-50.9 102.6c-14.4-6.5-31.1 2.2-34.6 17.6l-1.8 7.8c-2.1 9.2-15.2 9.2-17.3 0l-1.8-7.8c-3.5-15.4-20.2-24.1-34.6-17.6-.9.4.3-.2-18.9 9.4v63c0 35.2 28 64.5 63.1 64.9 35.7.5 64.9-28.4 64.9-64v-64c-19.5-9.6-18.2-8.9-19-9.3z\"]\n};\nvar faGrinWink = {\n prefix: 'fas',\n iconName: 'grin-wink',\n icon: [496, 512, [], \"f58c\", \"M0 256c0 137 111 248 248 248s248-111 248-248S385 8 248 8 0 119 0 256zm200-48c0 17.7-14.3 32-32 32s-32-14.3-32-32 14.3-32 32-32 32 14.3 32 32zm168 25l-9.5-8.5c-14.8-13.2-46.2-13.2-61 0L288 233c-8.3 7.4-21.6.4-19.8-10.8 4-25.2 34.2-42.1 59.9-42.1S384 197 388 222.2c1.6 11-11.5 18.2-20 10.8zm-243.1 87.8C155.1 330.5 200 336 248 336s92.9-5.5 123.1-15.2c11.3-3.7 22.6 6 20.7 17.9-9.2 55-83.2 93.3-143.8 93.3s-134.5-38.3-143.8-93.3c-2-11.9 9.3-21.6 20.7-17.9z\"]\n};\nvar faGripHorizontal = {\n prefix: 'fas',\n iconName: 'grip-horizontal',\n icon: [448, 512, [], \"f58d\", \"M96 288H32c-17.67 0-32 14.33-32 32v64c0 17.67 14.33 32 32 32h64c17.67 0 32-14.33 32-32v-64c0-17.67-14.33-32-32-32zm160 0h-64c-17.67 0-32 14.33-32 32v64c0 17.67 14.33 32 32 32h64c17.67 0 32-14.33 32-32v-64c0-17.67-14.33-32-32-32zm160 0h-64c-17.67 0-32 14.33-32 32v64c0 17.67 14.33 32 32 32h64c17.67 0 32-14.33 32-32v-64c0-17.67-14.33-32-32-32zM96 96H32c-17.67 0-32 14.33-32 32v64c0 17.67 14.33 32 32 32h64c17.67 0 32-14.33 32-32v-64c0-17.67-14.33-32-32-32zm160 0h-64c-17.67 0-32 14.33-32 32v64c0 17.67 14.33 32 32 32h64c17.67 0 32-14.33 32-32v-64c0-17.67-14.33-32-32-32zm160 0h-64c-17.67 0-32 14.33-32 32v64c0 17.67 14.33 32 32 32h64c17.67 0 32-14.33 32-32v-64c0-17.67-14.33-32-32-32z\"]\n};\nvar faGripLines = {\n prefix: 'fas',\n iconName: 'grip-lines',\n icon: [512, 512, [], \"f7a4\", \"M496 288H16c-8.8 0-16 7.2-16 16v32c0 8.8 7.2 16 16 16h480c8.8 0 16-7.2 16-16v-32c0-8.8-7.2-16-16-16zm0-128H16c-8.8 0-16 7.2-16 16v32c0 8.8 7.2 16 16 16h480c8.8 0 16-7.2 16-16v-32c0-8.8-7.2-16-16-16z\"]\n};\nvar faGripLinesVertical = {\n prefix: 'fas',\n iconName: 'grip-lines-vertical',\n icon: [256, 512, [], \"f7a5\", \"M96 496V16c0-8.8-7.2-16-16-16H48c-8.8 0-16 7.2-16 16v480c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16zm128 0V16c0-8.8-7.2-16-16-16h-32c-8.8 0-16 7.2-16 16v480c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16z\"]\n};\nvar faGripVertical = {\n prefix: 'fas',\n iconName: 'grip-vertical',\n icon: [320, 512, [], \"f58e\", \"M96 32H32C14.33 32 0 46.33 0 64v64c0 17.67 14.33 32 32 32h64c17.67 0 32-14.33 32-32V64c0-17.67-14.33-32-32-32zm0 160H32c-17.67 0-32 14.33-32 32v64c0 17.67 14.33 32 32 32h64c17.67 0 32-14.33 32-32v-64c0-17.67-14.33-32-32-32zm0 160H32c-17.67 0-32 14.33-32 32v64c0 17.67 14.33 32 32 32h64c17.67 0 32-14.33 32-32v-64c0-17.67-14.33-32-32-32zM288 32h-64c-17.67 0-32 14.33-32 32v64c0 17.67 14.33 32 32 32h64c17.67 0 32-14.33 32-32V64c0-17.67-14.33-32-32-32zm0 160h-64c-17.67 0-32 14.33-32 32v64c0 17.67 14.33 32 32 32h64c17.67 0 32-14.33 32-32v-64c0-17.67-14.33-32-32-32zm0 160h-64c-17.67 0-32 14.33-32 32v64c0 17.67 14.33 32 32 32h64c17.67 0 32-14.33 32-32v-64c0-17.67-14.33-32-32-32z\"]\n};\nvar faGuitar = {\n prefix: 'fas',\n iconName: 'guitar',\n icon: [512, 512, [], \"f7a6\", \"M502.6 54.6L457.4 9.4c-12.5-12.5-32.8-12.5-45.3 0l-67.9 67.9c-12.5 12.5-12.5 32.8 0 45.3L290 176.7c-45.4-29-100.4-28.9-133.5 4.2-9.7 9.7-16.4 21.2-20.5 33.9-6.1 18.8-23.5 33.1-42.7 34.9-24 2.3-46.3 11.6-63.4 28.8C-16.3 324.6-8 407.6 48.2 463.8c56.2 56.2 139.2 64.4 185.3 18.3 17.2-17.1 26.5-39.4 28.8-63.5 1.8-19.1 16.1-36.6 34.9-42.7 12.7-4.1 24.2-10.8 33.9-20.5 33.1-33.1 33.1-88.1 4.2-133.5l54.2-54.2c12.5 12.5 32.8 12.5 45.3 0l67.9-67.9c12.4-12.4 12.4-32.7-.1-45.2zM208 352c-26.5 0-48-21.5-48-48s21.5-48 48-48 48 21.5 48 48-21.5 48-48 48z\"]\n};\nvar faHSquare = {\n prefix: 'fas',\n iconName: 'h-square',\n icon: [448, 512, [], \"f0fd\", \"M448 80v352c0 26.51-21.49 48-48 48H48c-26.51 0-48-21.49-48-48V80c0-26.51 21.49-48 48-48h352c26.51 0 48 21.49 48 48zm-112 48h-32c-8.837 0-16 7.163-16 16v80H160v-80c0-8.837-7.163-16-16-16h-32c-8.837 0-16 7.163-16 16v224c0 8.837 7.163 16 16 16h32c8.837 0 16-7.163 16-16v-80h128v80c0 8.837 7.163 16 16 16h32c8.837 0 16-7.163 16-16V144c0-8.837-7.163-16-16-16z\"]\n};\nvar faHamburger = {\n prefix: 'fas',\n iconName: 'hamburger',\n icon: [512, 512, [], \"f805\", \"M464 256H48a48 48 0 0 0 0 96h416a48 48 0 0 0 0-96zm16 128H32a16 16 0 0 0-16 16v16a64 64 0 0 0 64 64h352a64 64 0 0 0 64-64v-16a16 16 0 0 0-16-16zM58.64 224h394.72c34.57 0 54.62-43.9 34.82-75.88C448 83.2 359.55 32.1 256 32c-103.54.1-192 51.2-232.18 116.11C4 180.09 24.07 224 58.64 224zM384 112a16 16 0 1 1-16 16 16 16 0 0 1 16-16zM256 80a16 16 0 1 1-16 16 16 16 0 0 1 16-16zm-128 32a16 16 0 1 1-16 16 16 16 0 0 1 16-16z\"]\n};\nvar faHammer = {\n prefix: 'fas',\n iconName: 'hammer',\n icon: [576, 512, [], \"f6e3\", \"M571.31 193.94l-22.63-22.63c-6.25-6.25-16.38-6.25-22.63 0l-11.31 11.31-28.9-28.9c5.63-21.31.36-44.9-16.35-61.61l-45.25-45.25c-62.48-62.48-163.79-62.48-226.28 0l90.51 45.25v18.75c0 16.97 6.74 33.25 18.75 45.25l49.14 49.14c16.71 16.71 40.3 21.98 61.61 16.35l28.9 28.9-11.31 11.31c-6.25 6.25-6.25 16.38 0 22.63l22.63 22.63c6.25 6.25 16.38 6.25 22.63 0l90.51-90.51c6.23-6.24 6.23-16.37-.02-22.62zm-286.72-15.2c-3.7-3.7-6.84-7.79-9.85-11.95L19.64 404.96c-25.57 23.88-26.26 64.19-1.53 88.93s65.05 24.05 88.93-1.53l238.13-255.07c-3.96-2.91-7.9-5.87-11.44-9.41l-49.14-49.14z\"]\n};\nvar faHamsa = {\n prefix: 'fas',\n iconName: 'hamsa',\n icon: [512, 512, [], \"f665\", \"M509.34 307.25C504.28 295.56 492.75 288 480 288h-64V80c0-22-18-40-40-40s-40 18-40 40v134c0 5.52-4.48 10-10 10h-20c-5.52 0-10-4.48-10-10V40c0-22-18-40-40-40s-40 18-40 40v174c0 5.52-4.48 10-10 10h-20c-5.52 0-10-4.48-10-10V80c0-22-18-40-40-40S96 58 96 80v208H32c-12.75 0-24.28 7.56-29.34 19.25a31.966 31.966 0 0 0 5.94 34.58l102.69 110.03C146.97 490.08 199.69 512 256 512s109.03-21.92 144.72-60.14L503.4 341.83a31.966 31.966 0 0 0 5.94-34.58zM256 416c-53.02 0-96-64-96-64s42.98-64 96-64 96 64 96 64-42.98 64-96 64zm0-96c-17.67 0-32 14.33-32 32s14.33 32 32 32 32-14.33 32-32-14.33-32-32-32z\"]\n};\nvar faHandHolding = {\n prefix: 'fas',\n iconName: 'hand-holding',\n icon: [576, 512, [], \"f4bd\", \"M565.3 328.1c-11.8-10.7-30.2-10-42.6 0L430.3 402c-11.3 9.1-25.4 14-40 14H272c-8.8 0-16-7.2-16-16s7.2-16 16-16h78.3c15.9 0 30.7-10.9 33.3-26.6 3.3-20-12.1-37.4-31.6-37.4H192c-27 0-53.1 9.3-74.1 26.3L71.4 384H16c-8.8 0-16 7.2-16 16v96c0 8.8 7.2 16 16 16h356.8c14.5 0 28.6-4.9 40-14L564 377c15.2-12.1 16.4-35.3 1.3-48.9z\"]\n};\nvar faHandHoldingHeart = {\n prefix: 'fas',\n iconName: 'hand-holding-heart',\n icon: [576, 512, [], \"f4be\", \"M275.3 250.5c7 7.4 18.4 7.4 25.5 0l108.9-114.2c31.6-33.2 29.8-88.2-5.6-118.8-30.8-26.7-76.7-21.9-104.9 7.7L288 36.9l-11.1-11.6C248.7-4.4 202.8-9.2 172 17.5c-35.3 30.6-37.2 85.6-5.6 118.8l108.9 114.2zm290 77.6c-11.8-10.7-30.2-10-42.6 0L430.3 402c-11.3 9.1-25.4 14-40 14H272c-8.8 0-16-7.2-16-16s7.2-16 16-16h78.3c15.9 0 30.7-10.9 33.3-26.6 3.3-20-12.1-37.4-31.6-37.4H192c-27 0-53.1 9.3-74.1 26.3L71.4 384H16c-8.8 0-16 7.2-16 16v96c0 8.8 7.2 16 16 16h356.8c14.5 0 28.6-4.9 40-14L564 377c15.2-12.1 16.4-35.3 1.3-48.9z\"]\n};\nvar faHandHoldingUsd = {\n prefix: 'fas',\n iconName: 'hand-holding-usd',\n icon: [544, 512, [], \"f4c0\", \"M257.6 144.3l50 14.3c3.6 1 6.1 4.4 6.1 8.1 0 4.6-3.8 8.4-8.4 8.4h-32.8c-3.6 0-7.1-.8-10.3-2.2-4.8-2.2-10.4-1.7-14.1 2l-17.5 17.5c-5.3 5.3-4.7 14.3 1.5 18.4 9.5 6.3 20.3 10.1 31.8 11.5V240c0 8.8 7.2 16 16 16h16c8.8 0 16-7.2 16-16v-17.6c30.3-3.6 53.3-31 49.3-63-2.9-23-20.7-41.3-42.9-47.7l-50-14.3c-3.6-1-6.1-4.4-6.1-8.1 0-4.6 3.8-8.4 8.4-8.4h32.8c3.6 0 7.1.8 10.3 2.2 4.8 2.2 10.4 1.7 14.1-2l17.5-17.5c5.3-5.3 4.7-14.3-1.5-18.4-9.5-6.3-20.3-10.1-31.8-11.5V16c0-8.8-7.2-16-16-16h-16c-8.8 0-16 7.2-16 16v17.6c-30.3 3.6-53.3 31-49.3 63 2.9 23 20.7 41.3 42.9 47.7zm276.3 183.8c-11.2-10.7-28.5-10-40.3 0L406.4 402c-10.7 9.1-24 14-37.8 14H256.9c-8.3 0-15.1-7.2-15.1-16s6.8-16 15.1-16h73.9c15.1 0 29-10.9 31.4-26.6 3.1-20-11.5-37.4-29.8-37.4H181.3c-25.5 0-50.2 9.3-69.9 26.3L67.5 384H15.1C6.8 384 0 391.2 0 400v96c0 8.8 6.8 16 15.1 16H352c13.7 0 27-4.9 37.8-14l142.8-121c14.4-12.1 15.5-35.3 1.3-48.9z\"]\n};\nvar faHandLizard = {\n prefix: 'fas',\n iconName: 'hand-lizard',\n icon: [576, 512, [], \"f258\", \"M384 480h192V363.778a95.998 95.998 0 0 0-14.833-51.263L398.127 54.368A48 48 0 0 0 357.544 32H24C10.745 32 0 42.745 0 56v16c0 30.928 25.072 56 56 56h229.981c12.844 0 21.556 13.067 16.615 24.923l-21.41 51.385A32 32 0 0 1 251.648 224H128c-35.346 0-64 28.654-64 64v8c0 13.255 10.745 24 24 24h147.406a47.995 47.995 0 0 1 25.692 7.455l111.748 70.811A24.001 24.001 0 0 1 384 418.539V480z\"]\n};\nvar faHandMiddleFinger = {\n prefix: 'fas',\n iconName: 'hand-middle-finger',\n icon: [512, 512, [], \"f806\", \"M479.93 317.12a37.33 37.33 0 0 0-28.28-36.19L416 272v-49.59c0-11.44-9.69-21.29-23.15-23.54l-38.4-6.4C336.63 189.5 320 200.86 320 216v32a8 8 0 0 1-16 0V50c0-26.28-20.25-49.2-46.52-50A48 48 0 0 0 208 48v200a8 8 0 0 1-16 0v-32c0-15.15-16.63-26.51-34.45-23.54l-30.68 5.12c-18 3-30.87 16.12-30.87 31.38V376a8 8 0 0 1-16 0v-76l-27.36 15A37.34 37.34 0 0 0 32 348.4v73.47a37.31 37.31 0 0 0 10.93 26.39l30.93 30.93A112 112 0 0 0 153.05 512h215A112 112 0 0 0 480 400z\"]\n};\nvar faHandPaper = {\n prefix: 'fas',\n iconName: 'hand-paper',\n icon: [448, 512, [], \"f256\", \"M408.781 128.007C386.356 127.578 368 146.36 368 168.79V256h-8V79.79c0-22.43-18.356-41.212-40.781-40.783C297.488 39.423 280 57.169 280 79v177h-8V40.79C272 18.36 253.644-.422 231.219.007 209.488.423 192 18.169 192 40v216h-8V80.79c0-22.43-18.356-41.212-40.781-40.783C121.488 40.423 104 58.169 104 80v235.992l-31.648-43.519c-12.993-17.866-38.009-21.817-55.877-8.823-17.865 12.994-21.815 38.01-8.822 55.877l125.601 172.705A48 48 0 0 0 172.073 512h197.59c22.274 0 41.622-15.324 46.724-37.006l26.508-112.66a192.011 192.011 0 0 0 5.104-43.975V168c.001-21.831-17.487-39.577-39.218-39.993z\"]\n};\nvar faHandPeace = {\n prefix: 'fas',\n iconName: 'hand-peace',\n icon: [448, 512, [], \"f25b\", \"M408 216c-22.092 0-40 17.909-40 40h-8v-32c0-22.091-17.908-40-40-40s-40 17.909-40 40v32h-8V48c0-26.51-21.49-48-48-48s-48 21.49-48 48v208h-13.572L92.688 78.449C82.994 53.774 55.134 41.63 30.461 51.324 5.787 61.017-6.356 88.877 3.337 113.551l74.765 190.342-31.09 24.872c-15.381 12.306-19.515 33.978-9.741 51.081l64 112A39.998 39.998 0 0 0 136 512h240c18.562 0 34.686-12.77 38.937-30.838l32-136A39.97 39.97 0 0 0 448 336v-80c0-22.091-17.908-40-40-40z\"]\n};\nvar faHandPointDown = {\n prefix: 'fas',\n iconName: 'hand-point-down',\n icon: [384, 512, [], \"f0a7\", \"M91.826 467.2V317.966c-8.248 5.841-16.558 10.57-24.918 14.153C35.098 345.752-.014 322.222 0 288c.008-18.616 10.897-32.203 29.092-40 28.286-12.122 64.329-78.648 77.323-107.534 7.956-17.857 25.479-28.453 43.845-28.464l.001-.002h171.526c11.812 0 21.897 8.596 23.703 20.269 7.25 46.837 38.483 61.76 38.315 123.731-.007 2.724.195 13.254.195 16 0 50.654-22.122 81.574-71.263 72.6-9.297 18.597-39.486 30.738-62.315 16.45-21.177 24.645-53.896 22.639-70.944 6.299V467.2c0 24.15-20.201 44.8-43.826 44.8-23.283 0-43.826-21.35-43.826-44.8zM112 72V24c0-13.255 10.745-24 24-24h192c13.255 0 24 10.745 24 24v48c0 13.255-10.745 24-24 24H136c-13.255 0-24-10.745-24-24zm212-24c0-11.046-8.954-20-20-20s-20 8.954-20 20 8.954 20 20 20 20-8.954 20-20z\"]\n};\nvar faHandPointLeft = {\n prefix: 'fas',\n iconName: 'hand-point-left',\n icon: [512, 512, [], \"f0a5\", \"M44.8 155.826h149.234c-5.841-8.248-10.57-16.558-14.153-24.918C166.248 99.098 189.778 63.986 224 64c18.616.008 32.203 10.897 40 29.092 12.122 28.286 78.648 64.329 107.534 77.323 17.857 7.956 28.453 25.479 28.464 43.845l.002.001v171.526c0 11.812-8.596 21.897-20.269 23.703-46.837 7.25-61.76 38.483-123.731 38.315-2.724-.007-13.254.195-16 .195-50.654 0-81.574-22.122-72.6-71.263-18.597-9.297-30.738-39.486-16.45-62.315-24.645-21.177-22.639-53.896-6.299-70.944H44.8c-24.15 0-44.8-20.201-44.8-43.826 0-23.283 21.35-43.826 44.8-43.826zM440 176h48c13.255 0 24 10.745 24 24v192c0 13.255-10.745 24-24 24h-48c-13.255 0-24-10.745-24-24V200c0-13.255 10.745-24 24-24zm24 212c11.046 0 20-8.954 20-20s-8.954-20-20-20-20 8.954-20 20 8.954 20 20 20z\"]\n};\nvar faHandPointRight = {\n prefix: 'fas',\n iconName: 'hand-point-right',\n icon: [512, 512, [], \"f0a4\", \"M512 199.652c0 23.625-20.65 43.826-44.8 43.826h-99.851c16.34 17.048 18.346 49.766-6.299 70.944 14.288 22.829 2.147 53.017-16.45 62.315C353.574 425.878 322.654 448 272 448c-2.746 0-13.276-.203-16-.195-61.971.168-76.894-31.065-123.731-38.315C120.596 407.683 112 397.599 112 385.786V214.261l.002-.001c.011-18.366 10.607-35.889 28.464-43.845 28.886-12.994 95.413-49.038 107.534-77.323 7.797-18.194 21.384-29.084 40-29.092 34.222-.014 57.752 35.098 44.119 66.908-3.583 8.359-8.312 16.67-14.153 24.918H467.2c23.45 0 44.8 20.543 44.8 43.826zM96 200v192c0 13.255-10.745 24-24 24H24c-13.255 0-24-10.745-24-24V200c0-13.255 10.745-24 24-24h48c13.255 0 24 10.745 24 24zM68 368c0-11.046-8.954-20-20-20s-20 8.954-20 20 8.954 20 20 20 20-8.954 20-20z\"]\n};\nvar faHandPointUp = {\n prefix: 'fas',\n iconName: 'hand-point-up',\n icon: [384, 512, [], \"f0a6\", \"M135.652 0c23.625 0 43.826 20.65 43.826 44.8v99.851c17.048-16.34 49.766-18.346 70.944 6.299 22.829-14.288 53.017-2.147 62.315 16.45C361.878 158.426 384 189.346 384 240c0 2.746-.203 13.276-.195 16 .168 61.971-31.065 76.894-38.315 123.731C343.683 391.404 333.599 400 321.786 400H150.261l-.001-.002c-18.366-.011-35.889-10.607-43.845-28.464C93.421 342.648 57.377 276.122 29.092 264 10.897 256.203.008 242.616 0 224c-.014-34.222 35.098-57.752 66.908-44.119 8.359 3.583 16.67 8.312 24.918 14.153V44.8c0-23.45 20.543-44.8 43.826-44.8zM136 416h192c13.255 0 24 10.745 24 24v48c0 13.255-10.745 24-24 24H136c-13.255 0-24-10.745-24-24v-48c0-13.255 10.745-24 24-24zm168 28c-11.046 0-20 8.954-20 20s8.954 20 20 20 20-8.954 20-20-8.954-20-20-20z\"]\n};\nvar faHandPointer = {\n prefix: 'fas',\n iconName: 'hand-pointer',\n icon: [448, 512, [], \"f25a\", \"M448 240v96c0 3.084-.356 6.159-1.063 9.162l-32 136C410.686 499.23 394.562 512 376 512H168a40.004 40.004 0 0 1-32.35-16.473l-127.997-176c-12.993-17.866-9.043-42.883 8.822-55.876 17.867-12.994 42.884-9.043 55.877 8.823L104 315.992V40c0-22.091 17.908-40 40-40s40 17.909 40 40v200h8v-40c0-22.091 17.908-40 40-40s40 17.909 40 40v40h8v-24c0-22.091 17.908-40 40-40s40 17.909 40 40v24h8c0-22.091 17.908-40 40-40s40 17.909 40 40zm-256 80h-8v96h8v-96zm88 0h-8v96h8v-96zm88 0h-8v96h8v-96z\"]\n};\nvar faHandRock = {\n prefix: 'fas',\n iconName: 'hand-rock',\n icon: [512, 512, [], \"f255\", \"M464.8 80c-26.9-.4-48.8 21.2-48.8 48h-8V96.8c0-26.3-20.9-48.3-47.2-48.8-26.9-.4-48.8 21.2-48.8 48v32h-8V80.8c0-26.3-20.9-48.3-47.2-48.8-26.9-.4-48.8 21.2-48.8 48v48h-8V96.8c0-26.3-20.9-48.3-47.2-48.8-26.9-.4-48.8 21.2-48.8 48v136l-8-7.1v-48.1c0-26.3-20.9-48.3-47.2-48.8C21.9 127.6 0 149.2 0 176v66.4c0 27.4 11.7 53.5 32.2 71.8l111.7 99.3c10.2 9.1 16.1 22.2 16.1 35.9v6.7c0 13.3 10.7 24 24 24h240c13.3 0 24-10.7 24-24v-2.9c0-12.8 2.6-25.5 7.5-37.3l49-116.3c5-11.8 7.5-24.5 7.5-37.3V128.8c0-26.3-20.9-48.4-47.2-48.8z\"]\n};\nvar faHandScissors = {\n prefix: 'fas',\n iconName: 'hand-scissors',\n icon: [512, 512, [], \"f257\", \"M216 440c0-22.092 17.909-40 40-40v-8h-32c-22.091 0-40-17.908-40-40s17.909-40 40-40h32v-8H48c-26.51 0-48-21.49-48-48s21.49-48 48-48h208v-13.572l-177.551-69.74c-24.674-9.694-36.818-37.555-27.125-62.228 9.693-24.674 37.554-36.817 62.228-27.124l190.342 74.765 24.872-31.09c12.306-15.381 33.978-19.515 51.081-9.741l112 64A40.002 40.002 0 0 1 512 168v240c0 18.562-12.77 34.686-30.838 38.937l-136 32A39.982 39.982 0 0 1 336 480h-80c-22.091 0-40-17.908-40-40z\"]\n};\nvar faHandSpock = {\n prefix: 'fas',\n iconName: 'hand-spock',\n icon: [512, 512, [], \"f259\", \"M481.3 97.1c-21.5-5.1-43.1 8.2-48.2 29.6L402.3 256h-11.1l43.6-174.3c5.4-21.4-7.7-43.1-29.1-48.5s-43.1 7.7-48.5 29.1L308.8 256h-15.1L242 31.1c-5-21.6-26.4-35-48-30.1-21.5 4.9-35 26.4-30 47.9l47.6 207h-9.8L167 103.1c-4.9-21.5-26.3-35-47.9-30.1-21.5 4.9-35 26.3-30.1 47.9l39 171.6v79.4l-60.6-57c-16.1-15.1-41.4-14.4-56.5 1.7s-14.4 41.4 1.7 56.5L146.3 499c8.9 8.4 20.7 13 32.9 13h216.7c21.3 0 40-14 46-34.4l26.2-88.3c2.6-8.9 4-18 4-27.3v-42c0-7.5.9-15 2.6-22.2L511 145.3c5-21.5-8.3-43.1-29.7-48.2z\"]\n};\nvar faHands = {\n prefix: 'fas',\n iconName: 'hands',\n icon: [640, 512, [], \"f4c2\", \"M204.8 230.4c-10.6-14.1-30.7-17-44.8-6.4-14.1 10.6-17 30.7-6.4 44.8l38.1 50.8c4.8 6.4 4.1 15.3-1.5 20.9l-12.8 12.8c-6.7 6.7-17.6 6.2-23.6-1.1L64 244.4V96c0-17.7-14.3-32-32-32S0 78.3 0 96v218.4c0 10.9 3.7 21.5 10.5 30l104.1 134.3c5 6.5 8.4 13.9 10.4 21.7 1.8 6.9 8.1 11.6 15.3 11.6H272c8.8 0 16-7.2 16-16V384c0-27.7-9-54.6-25.6-76.8l-57.6-76.8zM608 64c-17.7 0-32 14.3-32 32v148.4l-89.8 107.8c-6 7.2-17 7.7-23.6 1.1l-12.8-12.8c-5.6-5.6-6.3-14.5-1.5-20.9l38.1-50.8c10.6-14.1 7.7-34.2-6.4-44.8-14.1-10.6-34.2-7.7-44.8 6.4l-57.6 76.8C361 329.4 352 356.3 352 384v112c0 8.8 7.2 16 16 16h131.7c7.1 0 13.5-4.7 15.3-11.6 2-7.8 5.4-15.2 10.4-21.7l104.1-134.3c6.8-8.5 10.5-19.1 10.5-30V96c0-17.7-14.3-32-32-32z\"]\n};\nvar faHandsHelping = {\n prefix: 'fas',\n iconName: 'hands-helping',\n icon: [640, 512, [], \"f4c4\", \"M488 192H336v56c0 39.7-32.3 72-72 72s-72-32.3-72-72V126.4l-64.9 39C107.8 176.9 96 197.8 96 220.2v47.3l-80 46.2C.7 322.5-4.6 342.1 4.3 357.4l80 138.6c8.8 15.3 28.4 20.5 43.7 11.7L231.4 448H368c35.3 0 64-28.7 64-64h16c17.7 0 32-14.3 32-32v-64h8c13.3 0 24-10.7 24-24v-48c0-13.3-10.7-24-24-24zm147.7-37.4L555.7 16C546.9.7 527.3-4.5 512 4.3L408.6 64H306.4c-12 0-23.7 3.4-33.9 9.7L239 94.6c-9.4 5.8-15 16.1-15 27.1V248c0 22.1 17.9 40 40 40s40-17.9 40-40v-88h184c30.9 0 56 25.1 56 56v28.5l80-46.2c15.3-8.9 20.5-28.4 11.7-43.7z\"]\n};\nvar faHandshake = {\n prefix: 'fas',\n iconName: 'handshake',\n icon: [640, 512, [], \"f2b5\", \"M434.7 64h-85.9c-8 0-15.7 3-21.6 8.4l-98.3 90c-.1.1-.2.3-.3.4-16.6 15.6-16.3 40.5-2.1 56 12.7 13.9 39.4 17.6 56.1 2.7.1-.1.3-.1.4-.2l79.9-73.2c6.5-5.9 16.7-5.5 22.6 1 6 6.5 5.5 16.6-1 22.6l-26.1 23.9L504 313.8c2.9 2.4 5.5 5 7.9 7.7V128l-54.6-54.6c-5.9-6-14.1-9.4-22.6-9.4zM544 128.2v223.9c0 17.7 14.3 32 32 32h64V128.2h-96zm48 223.9c-8.8 0-16-7.2-16-16s7.2-16 16-16 16 7.2 16 16-7.2 16-16 16zM0 384h64c17.7 0 32-14.3 32-32V128.2H0V384zm48-63.9c8.8 0 16 7.2 16 16s-7.2 16-16 16-16-7.2-16-16c0-8.9 7.2-16 16-16zm435.9 18.6L334.6 217.5l-30 27.5c-29.7 27.1-75.2 24.5-101.7-4.4-26.9-29.4-24.8-74.9 4.4-101.7L289.1 64h-83.8c-8.5 0-16.6 3.4-22.6 9.4L128 128v223.9h18.3l90.5 81.9c27.4 22.3 67.7 18.1 90-9.3l.2-.2 17.9 15.5c15.9 13 39.4 10.5 52.3-5.4l31.4-38.6 5.4 4.4c13.7 11.1 33.9 9.1 45-4.7l9.5-11.7c11.2-13.8 9.1-33.9-4.6-45.1z\"]\n};\nvar faHanukiah = {\n prefix: 'fas',\n iconName: 'hanukiah',\n icon: [640, 512, [], \"f6e6\", \"M232 160c-4.42 0-8 3.58-8 8v120h32V168c0-4.42-3.58-8-8-8h-16zm-64 0c-4.42 0-8 3.58-8 8v120h32V168c0-4.42-3.58-8-8-8h-16zm224 0c-4.42 0-8 3.58-8 8v120h32V168c0-4.42-3.58-8-8-8h-16zm64 0c-4.42 0-8 3.58-8 8v120h32V168c0-4.42-3.58-8-8-8h-16zm88 8c0-4.42-3.58-8-8-8h-16c-4.42 0-8 3.58-8 8v120h32V168zm-440-8c-4.42 0-8 3.58-8 8v120h32V168c0-4.42-3.58-8-8-8h-16zm520 0h-32c-8.84 0-16 7.16-16 16v112c0 17.67-14.33 32-32 32H352V128c0-8.84-7.16-16-16-16h-32c-8.84 0-16 7.16-16 16v192H96c-17.67 0-32-14.33-32-32V176c0-8.84-7.16-16-16-16H16c-8.84 0-16 7.16-16 16v112c0 53.02 42.98 96 96 96h192v64H112c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h416c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16H352v-64h192c53.02 0 96-42.98 96-96V176c0-8.84-7.16-16-16-16zm-16-32c13.25 0 24-11.94 24-26.67S608 48 608 48s-24 38.61-24 53.33S594.75 128 608 128zm-576 0c13.25 0 24-11.94 24-26.67S32 48 32 48 8 86.61 8 101.33 18.75 128 32 128zm288-48c13.25 0 24-11.94 24-26.67S320 0 320 0s-24 38.61-24 53.33S306.75 80 320 80zm-208 48c13.25 0 24-11.94 24-26.67S112 48 112 48s-24 38.61-24 53.33S98.75 128 112 128zm64 0c13.25 0 24-11.94 24-26.67S176 48 176 48s-24 38.61-24 53.33S162.75 128 176 128zm64 0c13.25 0 24-11.94 24-26.67S240 48 240 48s-24 38.61-24 53.33S226.75 128 240 128zm160 0c13.25 0 24-11.94 24-26.67S400 48 400 48s-24 38.61-24 53.33S386.75 128 400 128zm64 0c13.25 0 24-11.94 24-26.67S464 48 464 48s-24 38.61-24 53.33S450.75 128 464 128zm64 0c13.25 0 24-11.94 24-26.67S528 48 528 48s-24 38.61-24 53.33S514.75 128 528 128z\"]\n};\nvar faHardHat = {\n prefix: 'fas',\n iconName: 'hard-hat',\n icon: [512, 512, [], \"f807\", \"M480 288c0-80.25-49.28-148.92-119.19-177.62L320 192V80a16 16 0 0 0-16-16h-96a16 16 0 0 0-16 16v112l-40.81-81.62C81.28 139.08 32 207.75 32 288v64h448zm16 96H16a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h480a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16z\"]\n};\nvar faHashtag = {\n prefix: 'fas',\n iconName: 'hashtag',\n icon: [448, 512, [], \"f292\", \"M440.667 182.109l7.143-40c1.313-7.355-4.342-14.109-11.813-14.109h-74.81l14.623-81.891C377.123 38.754 371.468 32 363.997 32h-40.632a12 12 0 0 0-11.813 9.891L296.175 128H197.54l14.623-81.891C213.477 38.754 207.822 32 200.35 32h-40.632a12 12 0 0 0-11.813 9.891L132.528 128H53.432a12 12 0 0 0-11.813 9.891l-7.143 40C33.163 185.246 38.818 192 46.289 192h74.81L98.242 320H19.146a12 12 0 0 0-11.813 9.891l-7.143 40C-1.123 377.246 4.532 384 12.003 384h74.81L72.19 465.891C70.877 473.246 76.532 480 84.003 480h40.632a12 12 0 0 0 11.813-9.891L151.826 384h98.634l-14.623 81.891C234.523 473.246 240.178 480 247.65 480h40.632a12 12 0 0 0 11.813-9.891L315.472 384h79.096a12 12 0 0 0 11.813-9.891l7.143-40c1.313-7.355-4.342-14.109-11.813-14.109h-74.81l22.857-128h79.096a12 12 0 0 0 11.813-9.891zM261.889 320h-98.634l22.857-128h98.634l-22.857 128z\"]\n};\nvar faHatWizard = {\n prefix: 'fas',\n iconName: 'hat-wizard',\n icon: [512, 512, [], \"f6e8\", \"M496 448H16c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h480c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16zm-304-64l-64-32 64-32 32-64 32 64 64 32-64 32-16 32h208l-86.41-201.63a63.955 63.955 0 0 1-1.89-45.45L416 0 228.42 107.19a127.989 127.989 0 0 0-53.46 59.15L64 416h144l-16-32zm64-224l16-32 16 32 32 16-32 16-16 32-16-32-32-16 32-16z\"]\n};\nvar faHaykal = {\n prefix: 'fas',\n iconName: 'haykal',\n icon: [512, 512, [], \"f666\", \"M496.25 202.52l-110-15.44 41.82-104.34c6.67-16.64-11.6-32.18-26.59-22.63L307.44 120 273.35 12.82C270.64 4.27 263.32 0 256 0c-7.32 0-14.64 4.27-17.35 12.82l-34.09 107.19-94.04-59.89c-14.99-9.55-33.25 5.99-26.59 22.63l41.82 104.34-110 15.43c-17.54 2.46-21.68 26.27-6.03 34.67l98.16 52.66-74.48 83.54c-10.92 12.25-1.72 30.93 13.29 30.93 1.31 0 2.67-.14 4.07-.45l108.57-23.65-4.11 112.55c-.43 11.65 8.87 19.22 18.41 19.22 5.15 0 10.39-2.21 14.2-7.18l68.18-88.9 68.18 88.9c3.81 4.97 9.04 7.18 14.2 7.18 9.54 0 18.84-7.57 18.41-19.22l-4.11-112.55 108.57 23.65c17.36 3.76 29.21-17.2 17.35-30.49l-74.48-83.54 98.16-52.66c15.64-8.39 11.5-32.2-6.04-34.66zM338.51 311.68l-51.89-11.3 1.97 53.79L256 311.68l-32.59 42.49 1.96-53.79-51.89 11.3 35.6-39.93-46.92-25.17 52.57-7.38-19.99-49.87 44.95 28.62L256 166.72l16.29 51.23 44.95-28.62-19.99 49.87 52.57 7.38-46.92 25.17 35.61 39.93z\"]\n};\nvar faHdd = {\n prefix: 'fas',\n iconName: 'hdd',\n icon: [576, 512, [], \"f0a0\", \"M576 304v96c0 26.51-21.49 48-48 48H48c-26.51 0-48-21.49-48-48v-96c0-26.51 21.49-48 48-48h480c26.51 0 48 21.49 48 48zm-48-80a79.557 79.557 0 0 1 30.777 6.165L462.25 85.374A48.003 48.003 0 0 0 422.311 64H153.689a48 48 0 0 0-39.938 21.374L17.223 230.165A79.557 79.557 0 0 1 48 224h480zm-48 96c-17.673 0-32 14.327-32 32s14.327 32 32 32 32-14.327 32-32-14.327-32-32-32zm-96 0c-17.673 0-32 14.327-32 32s14.327 32 32 32 32-14.327 32-32-14.327-32-32-32z\"]\n};\nvar faHeading = {\n prefix: 'fas',\n iconName: 'heading',\n icon: [512, 512, [], \"f1dc\", \"M448 96v320h32a16 16 0 0 1 16 16v32a16 16 0 0 1-16 16H320a16 16 0 0 1-16-16v-32a16 16 0 0 1 16-16h32V288H160v128h32a16 16 0 0 1 16 16v32a16 16 0 0 1-16 16H32a16 16 0 0 1-16-16v-32a16 16 0 0 1 16-16h32V96H32a16 16 0 0 1-16-16V48a16 16 0 0 1 16-16h160a16 16 0 0 1 16 16v32a16 16 0 0 1-16 16h-32v128h192V96h-32a16 16 0 0 1-16-16V48a16 16 0 0 1 16-16h160a16 16 0 0 1 16 16v32a16 16 0 0 1-16 16z\"]\n};\nvar faHeadphones = {\n prefix: 'fas',\n iconName: 'headphones',\n icon: [512, 512, [], \"f025\", \"M256 32C114.52 32 0 146.496 0 288v48a32 32 0 0 0 17.689 28.622l14.383 7.191C34.083 431.903 83.421 480 144 480h24c13.255 0 24-10.745 24-24V280c0-13.255-10.745-24-24-24h-24c-31.342 0-59.671 12.879-80 33.627V288c0-105.869 86.131-192 192-192s192 86.131 192 192v1.627C427.671 268.879 399.342 256 368 256h-24c-13.255 0-24 10.745-24 24v176c0 13.255 10.745 24 24 24h24c60.579 0 109.917-48.098 111.928-108.187l14.382-7.191A32 32 0 0 0 512 336v-48c0-141.479-114.496-256-256-256z\"]\n};\nvar faHeadphonesAlt = {\n prefix: 'fas',\n iconName: 'headphones-alt',\n icon: [512, 512, [], \"f58f\", \"M160 288h-16c-35.35 0-64 28.7-64 64.12v63.76c0 35.41 28.65 64.12 64 64.12h16c17.67 0 32-14.36 32-32.06V320.06c0-17.71-14.33-32.06-32-32.06zm208 0h-16c-17.67 0-32 14.35-32 32.06v127.88c0 17.7 14.33 32.06 32 32.06h16c35.35 0 64-28.71 64-64.12v-63.76c0-35.41-28.65-64.12-64-64.12zM256 32C112.91 32 4.57 151.13 0 288v112c0 8.84 7.16 16 16 16h16c8.84 0 16-7.16 16-16V288c0-114.67 93.33-207.8 208-207.82 114.67.02 208 93.15 208 207.82v112c0 8.84 7.16 16 16 16h16c8.84 0 16-7.16 16-16V288C507.43 151.13 399.09 32 256 32z\"]\n};\nvar faHeadset = {\n prefix: 'fas',\n iconName: 'headset',\n icon: [512, 512, [], \"f590\", \"M192 208c0-17.67-14.33-32-32-32h-16c-35.35 0-64 28.65-64 64v48c0 35.35 28.65 64 64 64h16c17.67 0 32-14.33 32-32V208zm176 144c35.35 0 64-28.65 64-64v-48c0-35.35-28.65-64-64-64h-16c-17.67 0-32 14.33-32 32v112c0 17.67 14.33 32 32 32h16zM256 0C113.18 0 4.58 118.83 0 256v16c0 8.84 7.16 16 16 16h16c8.84 0 16-7.16 16-16v-16c0-114.69 93.31-208 208-208s208 93.31 208 208h-.12c.08 2.43.12 165.72.12 165.72 0 23.35-18.93 42.28-42.28 42.28H320c0-26.51-21.49-48-48-48h-32c-26.51 0-48 21.49-48 48s21.49 48 48 48h181.72c49.86 0 90.28-40.42 90.28-90.28V256C507.42 118.83 398.82 0 256 0z\"]\n};\nvar faHeart = {\n prefix: 'fas',\n iconName: 'heart',\n icon: [512, 512, [], \"f004\", \"M462.3 62.6C407.5 15.9 326 24.3 275.7 76.2L256 96.5l-19.7-20.3C186.1 24.3 104.5 15.9 49.7 62.6c-62.8 53.6-66.1 149.8-9.9 207.9l193.5 199.8c12.5 12.9 32.8 12.9 45.3 0l193.5-199.8c56.3-58.1 53-154.3-9.8-207.9z\"]\n};\nvar faHeartBroken = {\n prefix: 'fas',\n iconName: 'heart-broken',\n icon: [512, 512, [], \"f7a9\", \"M473.7 73.8l-2.4-2.5c-46-47-118-51.7-169.6-14.8L336 159.9l-96 64 48 128-144-144 96-64-28.6-86.5C159.7 19.6 87 24 40.7 71.4l-2.4 2.4C-10.4 123.6-12.5 202.9 31 256l212.1 218.6c7.1 7.3 18.6 7.3 25.7 0L481 255.9c43.5-53 41.4-132.3-7.3-182.1z\"]\n};\nvar faHeartbeat = {\n prefix: 'fas',\n iconName: 'heartbeat',\n icon: [512, 512, [], \"f21e\", \"M320.2 243.8l-49.7 99.4c-6 12.1-23.4 11.7-28.9-.6l-56.9-126.3-30 71.7H60.6l182.5 186.5c7.1 7.3 18.6 7.3 25.7 0L451.4 288H342.3l-22.1-44.2zM473.7 73.9l-2.4-2.5c-51.5-52.6-135.8-52.6-187.4 0L256 100l-27.9-28.5c-51.5-52.7-135.9-52.7-187.4 0l-2.4 2.4C-10.4 123.7-12.5 203 31 256h102.4l35.9-86.2c5.4-12.9 23.6-13.2 29.4-.4l58.2 129.3 49-97.9c5.9-11.8 22.7-11.8 28.6 0l27.6 55.2H481c43.5-53 41.4-132.3-7.3-182.1z\"]\n};\nvar faHelicopter = {\n prefix: 'fas',\n iconName: 'helicopter',\n icon: [640, 512, [], \"f533\", \"M304 384h272c17.67 0 32-14.33 32-32 0-123.71-100.29-224-224-224V64h176c8.84 0 16-7.16 16-16V16c0-8.84-7.16-16-16-16H144c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h176v64H112L68.8 70.4C65.78 66.37 61.03 64 56 64H16.01C5.6 64-2.04 73.78.49 83.88L32 192l160 64 86.4 115.2A31.992 31.992 0 0 0 304 384zm112-188.49C478.55 208.3 528.03 257.44 540.79 320H416V195.51zm219.37 263.3l-22.15-22.2c-6.25-6.26-16.24-6.1-22.64.01-7.09 6.77-13.84 11.25-24.64 11.25H240c-8.84 0-16 7.18-16 16.03v32.06c0 8.85 7.16 16.03 16 16.03h325.94c14.88 0 35.3-.47 68.45-29.52 7.02-6.14 7.57-17.05.98-23.66z\"]\n};\nvar faHighlighter = {\n prefix: 'fas',\n iconName: 'highlighter',\n icon: [544, 512, [], \"f591\", \"M0 479.98L99.92 512l35.45-35.45-67.04-67.04L0 479.98zm124.61-240.01a36.592 36.592 0 0 0-10.79 38.1l13.05 42.83-50.93 50.94 96.23 96.23 50.86-50.86 42.74 13.08c13.73 4.2 28.65-.01 38.15-10.78l35.55-41.64-173.34-173.34-41.52 35.44zm403.31-160.7l-63.2-63.2c-20.49-20.49-53.38-21.52-75.12-2.35L190.55 183.68l169.77 169.78L530.27 154.4c19.18-21.74 18.15-54.63-2.35-75.13z\"]\n};\nvar faHiking = {\n prefix: 'fas',\n iconName: 'hiking',\n icon: [384, 512, [], \"f6ec\", \"M80.95 472.23c-4.28 17.16 6.14 34.53 23.28 38.81 2.61.66 5.22.95 7.8.95 14.33 0 27.37-9.7 31.02-24.23l25.24-100.97-52.78-52.78-34.56 138.22zm14.89-196.12L137 117c2.19-8.42-3.14-16.95-11.92-19.06-43.88-10.52-88.35 15.07-99.32 57.17L.49 253.24c-2.19 8.42 3.14 16.95 11.92 19.06l63.56 15.25c8.79 2.1 17.68-3.02 19.87-11.44zM368 160h-16c-8.84 0-16 7.16-16 16v16h-34.75l-46.78-46.78C243.38 134.11 228.61 128 212.91 128c-27.02 0-50.47 18.3-57.03 44.52l-26.92 107.72a32.012 32.012 0 0 0 8.42 30.39L224 397.25V480c0 17.67 14.33 32 32 32s32-14.33 32-32v-82.75c0-17.09-6.66-33.16-18.75-45.25l-46.82-46.82c.15-.5.49-.89.62-1.41l19.89-79.57 22.43 22.43c6 6 14.14 9.38 22.62 9.38h48v240c0 8.84 7.16 16 16 16h16c8.84 0 16-7.16 16-16V176c.01-8.84-7.15-16-15.99-16zM240 96c26.51 0 48-21.49 48-48S266.51 0 240 0s-48 21.49-48 48 21.49 48 48 48z\"]\n};\nvar faHippo = {\n prefix: 'fas',\n iconName: 'hippo',\n icon: [640, 512, [], \"f6ed\", \"M581.12 96.2c-27.67-.15-52.5 17.58-76.6 26.62C489.98 88.27 455.83 64 416 64c-11.28 0-21.95 2.3-32 5.88V56c0-13.26-10.75-24-24-24h-16c-13.25 0-24 10.74-24 24v48.98C286.01 79.58 241.24 64 192 64 85.96 64 0 135.64 0 224v240c0 8.84 7.16 16 16 16h64c8.84 0 16-7.16 16-16v-70.79C128.35 407.57 166.72 416 208 416s79.65-8.43 112-22.79V464c0 8.84 7.16 16 16 16h64c8.84 0 16-7.16 16-16V288h128v32c0 8.84 7.16 16 16 16h32c8.84 0 16-7.16 16-16v-32c17.67 0 32-14.33 32-32v-92.02c0-34.09-24.79-67.59-58.88-67.78zM448 176c-8.84 0-16-7.16-16-16s7.16-16 16-16 16 7.16 16 16-7.16 16-16 16z\"]\n};\nvar faHistory = {\n prefix: 'fas',\n iconName: 'history',\n icon: [512, 512, [], \"f1da\", \"M504 255.531c.253 136.64-111.18 248.372-247.82 248.468-59.015.042-113.223-20.53-155.822-54.911-11.077-8.94-11.905-25.541-1.839-35.607l11.267-11.267c8.609-8.609 22.353-9.551 31.891-1.984C173.062 425.135 212.781 440 256 440c101.705 0 184-82.311 184-184 0-101.705-82.311-184-184-184-48.814 0-93.149 18.969-126.068 49.932l50.754 50.754c10.08 10.08 2.941 27.314-11.313 27.314H24c-8.837 0-16-7.163-16-16V38.627c0-14.254 17.234-21.393 27.314-11.314l49.372 49.372C129.209 34.136 189.552 8 256 8c136.81 0 247.747 110.78 248 247.531zm-180.912 78.784l9.823-12.63c8.138-10.463 6.253-25.542-4.21-33.679L288 256.349V152c0-13.255-10.745-24-24-24h-16c-13.255 0-24 10.745-24 24v135.651l65.409 50.874c10.463 8.137 25.541 6.253 33.679-4.21z\"]\n};\nvar faHockeyPuck = {\n prefix: 'fas',\n iconName: 'hockey-puck',\n icon: [512, 512, [], \"f453\", \"M0 160c0-53 114.6-96 256-96s256 43 256 96-114.6 96-256 96S0 213 0 160zm0 82.2V352c0 53 114.6 96 256 96s256-43 256-96V242.2c-113.4 82.3-398.5 82.4-512 0z\"]\n};\nvar faHollyBerry = {\n prefix: 'fas',\n iconName: 'holly-berry',\n icon: [448, 512, [], \"f7aa\", \"M144 192c26.5 0 48-21.5 48-48s-21.5-48-48-48-48 21.5-48 48 21.5 48 48 48zm112-48c0 26.5 21.5 48 48 48s48-21.5 48-48-21.5-48-48-48-48 21.5-48 48zm-32-48c26.5 0 48-21.5 48-48S250.5 0 224 0s-48 21.5-48 48 21.5 48 48 48zm-16.2 139.1c.1-12.4-13.1-20.1-23.8-13.7-34.3 20.3-71.4 32.7-108.7 36.2-9.7.9-15.6 11.3-11.6 20.2 6.2 13.9 11.1 28.6 14.7 43.8 3.6 15.2-5.3 30.6-20.2 35.1-14.9 4.5-30.1 7.6-45.3 9.1-9.7 1-15.7 11.3-11.7 20.2 15 32.8 22.9 69.5 23 107.7.1 14.4 15.2 23.1 27.6 16 33.2-19 68.9-30.5 104.8-33.9 9.7-.9 15.6-11.3 11.6-20.2-6.2-13.9-11.1-28.6-14.7-43.8-3.6-15.2 5.3-30.6 20.2-35.1 14.9-4.5 30.1-7.6 45.3-9.1 9.7-1 15.7-11.3 11.7-20.2-15.5-34.2-23.3-72.5-22.9-112.3zM435 365.6c-15.2-1.6-30.3-4.7-45.3-9.1-14.9-4.5-23.8-19.9-20.2-35.1 3.6-15.2 8.5-29.8 14.7-43.8 4-8.9-1.9-19.3-11.6-20.2-37.3-3.5-74.4-15.9-108.7-36.2-10.7-6.3-23.9 1.4-23.8 13.7 0 1.6-.2 3.2-.2 4.9.2 33.3 7 65.7 19.9 94 5.7 12.4 5.2 26.6-.6 38.9 4.9 1.2 9.9 2.2 14.8 3.7 14.9 4.5 23.8 19.9 20.2 35.1-3.6 15.2-8.5 29.8-14.7 43.8-4 8.9 1.9 19.3 11.6 20.2 35.9 3.4 71.6 14.9 104.8 33.9 12.5 7.1 27.6-1.6 27.6-16 .2-38.2 8-75 23-107.7 4.3-8.7-1.8-19.1-11.5-20.1z\"]\n};\nvar faHome = {\n prefix: 'fas',\n iconName: 'home',\n icon: [576, 512, [], \"f015\", \"M280.37 148.26L96 300.11V464a16 16 0 0 0 16 16l112.06-.29a16 16 0 0 0 15.92-16V368a16 16 0 0 1 16-16h64a16 16 0 0 1 16 16v95.64a16 16 0 0 0 16 16.05L464 480a16 16 0 0 0 16-16V300L295.67 148.26a12.19 12.19 0 0 0-15.3 0zM571.6 251.47L488 182.56V44.05a12 12 0 0 0-12-12h-56a12 12 0 0 0-12 12v72.61L318.47 43a48 48 0 0 0-61 0L4.34 251.47a12 12 0 0 0-1.6 16.9l25.5 31A12 12 0 0 0 45.15 301l235.22-193.74a12.19 12.19 0 0 1 15.3 0L530.9 301a12 12 0 0 0 16.9-1.6l25.5-31a12 12 0 0 0-1.7-16.93z\"]\n};\nvar faHorse = {\n prefix: 'fas',\n iconName: 'horse',\n icon: [576, 512, [], \"f6f0\", \"M575.92 76.6c-.01-8.13-3.02-15.87-8.58-21.8-3.78-4.03-8.58-9.12-13.69-14.5 11.06-6.84 19.5-17.49 22.18-30.66C576.85 4.68 572.96 0 567.9 0H447.92c-70.69 0-128 57.31-128 128H160c-28.84 0-54.4 12.98-72 33.11V160c-48.53 0-88 39.47-88 88v56c0 8.84 7.16 16 16 16h16c8.84 0 16-7.16 16-16v-56c0-13.22 6.87-24.39 16.78-31.68-.21 2.58-.78 5.05-.78 7.68 0 27.64 11.84 52.36 30.54 69.88l-25.72 68.6a63.945 63.945 0 0 0-2.16 37.99l24.85 99.41A15.982 15.982 0 0 0 107.02 512h65.96c10.41 0 18.05-9.78 15.52-19.88l-26.31-105.26 23.84-63.59L320 345.6V496c0 8.84 7.16 16 16 16h64c8.84 0 16-7.16 16-16V318.22c19.74-20.19 32-47.75 32-78.22 0-.22-.07-.42-.08-.64V136.89l16 7.11 18.9 37.7c7.45 14.87 25.05 21.55 40.49 15.37l32.55-13.02a31.997 31.997 0 0 0 20.12-29.74l-.06-77.71zm-64 19.4c-8.84 0-16-7.16-16-16s7.16-16 16-16 16 7.16 16 16-7.16 16-16 16z\"]\n};\nvar faHorseHead = {\n prefix: 'fas',\n iconName: 'horse-head',\n icon: [512, 512, [], \"f7ab\", \"M509.8 332.5l-69.9-164.3c-14.9-41.2-50.4-71-93-79.2 18-10.6 46.3-35.9 34.2-82.3-1.3-5-7.1-7.9-12-6.1L166.9 76.3C35.9 123.4 0 238.9 0 398.8V480c0 17.7 14.3 32 32 32h236.2c23.8 0 39.3-25 28.6-46.3L256 384v-.7c-45.6-3.5-84.6-30.7-104.3-69.6-1.6-3.1-.9-6.9 1.6-9.3l12.1-12.1c3.9-3.9 10.6-2.7 12.9 2.4 14.8 33.7 48.2 57.4 87.4 57.4 17.2 0 33-5.1 46.8-13.2l46 63.9c6 8.4 15.7 13.3 26 13.3h50.3c8.5 0 16.6-3.4 22.6-9.4l45.3-39.8c8.9-9.1 11.7-22.6 7.1-34.4zM328 224c-13.3 0-24-10.7-24-24s10.7-24 24-24 24 10.7 24 24-10.7 24-24 24z\"]\n};\nvar faHospital = {\n prefix: 'fas',\n iconName: 'hospital',\n icon: [448, 512, [], \"f0f8\", \"M448 492v20H0v-20c0-6.627 5.373-12 12-12h20V120c0-13.255 10.745-24 24-24h88V24c0-13.255 10.745-24 24-24h112c13.255 0 24 10.745 24 24v72h88c13.255 0 24 10.745 24 24v360h20c6.627 0 12 5.373 12 12zM308 192h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12v-40c0-6.627-5.373-12-12-12zm-168 64h40c6.627 0 12-5.373 12-12v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12zm104 128h-40c-6.627 0-12 5.373-12 12v84h64v-84c0-6.627-5.373-12-12-12zm64-96h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12v-40c0-6.627-5.373-12-12-12zm-116 12c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12v-40zM182 96h26v26a6 6 0 0 0 6 6h20a6 6 0 0 0 6-6V96h26a6 6 0 0 0 6-6V70a6 6 0 0 0-6-6h-26V38a6 6 0 0 0-6-6h-20a6 6 0 0 0-6 6v26h-26a6 6 0 0 0-6 6v20a6 6 0 0 0 6 6z\"]\n};\nvar faHospitalAlt = {\n prefix: 'fas',\n iconName: 'hospital-alt',\n icon: [576, 512, [], \"f47d\", \"M544 96H416V32c0-17.7-14.3-32-32-32H192c-17.7 0-32 14.3-32 32v64H32c-17.7 0-32 14.3-32 32v368c0 8.8 7.2 16 16 16h544c8.8 0 16-7.2 16-16V128c0-17.7-14.3-32-32-32zM160 436c0 6.6-5.4 12-12 12h-40c-6.6 0-12-5.4-12-12v-40c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v40zm0-128c0 6.6-5.4 12-12 12h-40c-6.6 0-12-5.4-12-12v-40c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v40zm160 128c0 6.6-5.4 12-12 12h-40c-6.6 0-12-5.4-12-12v-40c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v40zm0-128c0 6.6-5.4 12-12 12h-40c-6.6 0-12-5.4-12-12v-40c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v40zm16-170c0 3.3-2.7 6-6 6h-26v26c0 3.3-2.7 6-6 6h-20c-3.3 0-6-2.7-6-6v-26h-26c-3.3 0-6-2.7-6-6v-20c0-3.3 2.7-6 6-6h26V86c0-3.3 2.7-6 6-6h20c3.3 0 6 2.7 6 6v26h26c3.3 0 6 2.7 6 6v20zm144 298c0 6.6-5.4 12-12 12h-40c-6.6 0-12-5.4-12-12v-40c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v40zm0-128c0 6.6-5.4 12-12 12h-40c-6.6 0-12-5.4-12-12v-40c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v40z\"]\n};\nvar faHospitalSymbol = {\n prefix: 'fas',\n iconName: 'hospital-symbol',\n icon: [512, 512, [], \"f47e\", \"M256 0C114.6 0 0 114.6 0 256s114.6 256 256 256 256-114.6 256-256S397.4 0 256 0zm112 376c0 4.4-3.6 8-8 8h-48c-4.4 0-8-3.6-8-8v-88h-96v88c0 4.4-3.6 8-8 8h-48c-4.4 0-8-3.6-8-8V136c0-4.4 3.6-8 8-8h48c4.4 0 8 3.6 8 8v88h96v-88c0-4.4 3.6-8 8-8h48c4.4 0 8 3.6 8 8v240z\"]\n};\nvar faHotTub = {\n prefix: 'fas',\n iconName: 'hot-tub',\n icon: [512, 512, [], \"f593\", \"M414.21 177.65c1.02 8.21 7.75 14.35 15.75 14.35h16.12c9.51 0 17.08-8.57 16-18.35-4.34-39.11-22.4-74.53-50.13-97.16-17.37-14.17-28.82-36.75-31.98-62.15C378.96 6.14 372.22 0 364.23 0h-16.12c-9.51 0-17.09 8.57-16 18.35 4.34 39.11 22.4 74.53 50.13 97.16 17.36 14.17 28.82 36.75 31.97 62.14zm-108 0c1.02 8.21 7.75 14.35 15.75 14.35h16.12c9.51 0 17.08-8.57 16-18.35-4.34-39.11-22.4-74.53-50.13-97.16-17.37-14.17-28.82-36.75-31.98-62.15C270.96 6.14 264.22 0 256.23 0h-16.12c-9.51 0-17.09 8.57-16 18.35 4.34 39.11 22.4 74.53 50.13 97.16 17.36 14.17 28.82 36.75 31.97 62.14zM480 256H256l-110.93-83.2a63.99 63.99 0 0 0-38.4-12.8H64c-35.35 0-64 28.65-64 64v224c0 35.35 28.65 64 64 64h384c35.35 0 64-28.65 64-64V288c0-17.67-14.33-32-32-32zM128 440c0 4.42-3.58 8-8 8h-16c-4.42 0-8-3.58-8-8V328c0-4.42 3.58-8 8-8h16c4.42 0 8 3.58 8 8v112zm96 0c0 4.42-3.58 8-8 8h-16c-4.42 0-8-3.58-8-8V328c0-4.42 3.58-8 8-8h16c4.42 0 8 3.58 8 8v112zm96 0c0 4.42-3.58 8-8 8h-16c-4.42 0-8-3.58-8-8V328c0-4.42 3.58-8 8-8h16c4.42 0 8 3.58 8 8v112zm96 0c0 4.42-3.58 8-8 8h-16c-4.42 0-8-3.58-8-8V328c0-4.42 3.58-8 8-8h16c4.42 0 8 3.58 8 8v112zM64 128c35.35 0 64-28.65 64-64S99.35 0 64 0 0 28.65 0 64s28.65 64 64 64z\"]\n};\nvar faHotdog = {\n prefix: 'fas',\n iconName: 'hotdog',\n icon: [512, 512, [], \"f80f\", \"M488.56 23.44a80 80 0 0 0-113.12 0l-352 352a80 80 0 1 0 113.12 113.12l352-352a80 80 0 0 0 0-113.12zm-49.93 95.19c-19.6 19.59-37.52 22.67-51.93 25.14C373.76 146 364.4 147.6 352 160s-14 21.76-16.23 34.71c-2.48 14.4-5.55 32.33-25.15 51.92s-37.52 22.67-51.92 25.15C245.75 274 236.4 275.6 224 288s-14 21.75-16.23 34.7c-2.47 14.4-5.54 32.33-25.14 51.92s-37.53 22.68-51.93 25.15C117.76 402 108.4 403.6 96 416a16 16 0 0 1-22.63-22.63c19.6-19.59 37.52-22.67 51.92-25.14 13-2.22 22.3-3.82 34.71-16.23s14-21.75 16.22-34.7c2.48-14.4 5.55-32.33 25.15-51.92s37.52-22.67 51.92-25.14c13-2.22 22.3-3.83 34.7-16.23s14-21.76 16.24-34.71c2.47-14.4 5.54-32.33 25.14-51.92s37.52-22.68 51.92-25.15C394.24 110 403.59 108.41 416 96a16 16 0 0 1 22.63 22.63zM31.44 322.18L322.18 31.44l-11.54-11.55c-25-25-63.85-26.66-86.79-3.72L16.17 223.85c-22.94 22.94-21.27 61.79 3.72 86.78zm449.12-132.36L189.82 480.56l11.54 11.55c25 25 63.85 26.66 86.79 3.72l207.68-207.68c22.94-22.94 21.27-61.79-3.72-86.79z\"]\n};\nvar faHotel = {\n prefix: 'fas',\n iconName: 'hotel',\n icon: [576, 512, [], \"f594\", \"M560 64c8.84 0 16-7.16 16-16V16c0-8.84-7.16-16-16-16H16C7.16 0 0 7.16 0 16v32c0 8.84 7.16 16 16 16h15.98v384H16c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h240v-80c0-8.8 7.2-16 16-16h32c8.8 0 16 7.2 16 16v80h240c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16h-16V64h16zm-304 44.8c0-6.4 6.4-12.8 12.8-12.8h38.4c6.4 0 12.8 6.4 12.8 12.8v38.4c0 6.4-6.4 12.8-12.8 12.8h-38.4c-6.4 0-12.8-6.4-12.8-12.8v-38.4zm0 96c0-6.4 6.4-12.8 12.8-12.8h38.4c6.4 0 12.8 6.4 12.8 12.8v38.4c0 6.4-6.4 12.8-12.8 12.8h-38.4c-6.4 0-12.8-6.4-12.8-12.8v-38.4zm-128-96c0-6.4 6.4-12.8 12.8-12.8h38.4c6.4 0 12.8 6.4 12.8 12.8v38.4c0 6.4-6.4 12.8-12.8 12.8h-38.4c-6.4 0-12.8-6.4-12.8-12.8v-38.4zM179.2 256h-38.4c-6.4 0-12.8-6.4-12.8-12.8v-38.4c0-6.4 6.4-12.8 12.8-12.8h38.4c6.4 0 12.8 6.4 12.8 12.8v38.4c0 6.4-6.4 12.8-12.8 12.8zM192 384c0-53.02 42.98-96 96-96s96 42.98 96 96H192zm256-140.8c0 6.4-6.4 12.8-12.8 12.8h-38.4c-6.4 0-12.8-6.4-12.8-12.8v-38.4c0-6.4 6.4-12.8 12.8-12.8h38.4c6.4 0 12.8 6.4 12.8 12.8v38.4zm0-96c0 6.4-6.4 12.8-12.8 12.8h-38.4c-6.4 0-12.8-6.4-12.8-12.8v-38.4c0-6.4 6.4-12.8 12.8-12.8h38.4c6.4 0 12.8 6.4 12.8 12.8v38.4z\"]\n};\nvar faHourglass = {\n prefix: 'fas',\n iconName: 'hourglass',\n icon: [384, 512, [], \"f254\", \"M360 64c13.255 0 24-10.745 24-24V24c0-13.255-10.745-24-24-24H24C10.745 0 0 10.745 0 24v16c0 13.255 10.745 24 24 24 0 90.965 51.016 167.734 120.842 192C75.016 280.266 24 357.035 24 448c-13.255 0-24 10.745-24 24v16c0 13.255 10.745 24 24 24h336c13.255 0 24-10.745 24-24v-16c0-13.255-10.745-24-24-24 0-90.965-51.016-167.734-120.842-192C308.984 231.734 360 154.965 360 64z\"]\n};\nvar faHourglassEnd = {\n prefix: 'fas',\n iconName: 'hourglass-end',\n icon: [384, 512, [], \"f253\", \"M360 64c13.255 0 24-10.745 24-24V24c0-13.255-10.745-24-24-24H24C10.745 0 0 10.745 0 24v16c0 13.255 10.745 24 24 24 0 90.965 51.016 167.734 120.842 192C75.016 280.266 24 357.035 24 448c-13.255 0-24 10.745-24 24v16c0 13.255 10.745 24 24 24h336c13.255 0 24-10.745 24-24v-16c0-13.255-10.745-24-24-24 0-90.965-51.016-167.734-120.842-192C308.984 231.734 360 154.965 360 64zM192 208c-57.787 0-104-66.518-104-144h208c0 77.945-46.51 144-104 144z\"]\n};\nvar faHourglassHalf = {\n prefix: 'fas',\n iconName: 'hourglass-half',\n icon: [384, 512, [], \"f252\", \"M360 0H24C10.745 0 0 10.745 0 24v16c0 13.255 10.745 24 24 24 0 90.965 51.016 167.734 120.842 192C75.016 280.266 24 357.035 24 448c-13.255 0-24 10.745-24 24v16c0 13.255 10.745 24 24 24h336c13.255 0 24-10.745 24-24v-16c0-13.255-10.745-24-24-24 0-90.965-51.016-167.734-120.842-192C308.984 231.734 360 154.965 360 64c13.255 0 24-10.745 24-24V24c0-13.255-10.745-24-24-24zm-75.078 384H99.08c17.059-46.797 52.096-80 92.92-80 40.821 0 75.862 33.196 92.922 80zm.019-256H99.078C91.988 108.548 88 86.748 88 64h208c0 22.805-3.987 44.587-11.059 64z\"]\n};\nvar faHourglassStart = {\n prefix: 'fas',\n iconName: 'hourglass-start',\n icon: [384, 512, [], \"f251\", \"M360 0H24C10.745 0 0 10.745 0 24v16c0 13.255 10.745 24 24 24 0 90.965 51.016 167.734 120.842 192C75.016 280.266 24 357.035 24 448c-13.255 0-24 10.745-24 24v16c0 13.255 10.745 24 24 24h336c13.255 0 24-10.745 24-24v-16c0-13.255-10.745-24-24-24 0-90.965-51.016-167.734-120.842-192C308.984 231.734 360 154.965 360 64c13.255 0 24-10.745 24-24V24c0-13.255-10.745-24-24-24zm-64 448H88c0-77.458 46.204-144 104-144 57.786 0 104 66.517 104 144z\"]\n};\nvar faHouseDamage = {\n prefix: 'fas',\n iconName: 'house-damage',\n icon: [576, 512, [], \"f6f1\", \"M288 114.96L69.47 307.71c-1.62 1.46-3.69 2.14-5.47 3.35V496c0 8.84 7.16 16 16 16h149.23L192 439.19l104.11-64-60.16-119.22L384 392.75l-104.11 64L319.81 512H496c8.84 0 16-7.16 16-16V311.1c-1.7-1.16-3.72-1.82-5.26-3.2L288 114.96zm282.69 121.32L512 184.45V48c0-8.84-7.16-16-16-16h-64c-8.84 0-16 7.16-16 16v51.69L314.75 10.31C307.12 3.45 297.56.01 288 0s-19.1 3.41-26.7 10.27L5.31 236.28c-6.57 5.91-7.12 16.02-1.21 22.6l21.4 23.82c5.9 6.57 16.02 7.12 22.6 1.21L277.42 81.63c6.05-5.33 15.12-5.33 21.17 0L527.91 283.9c6.57 5.9 16.69 5.36 22.6-1.21l21.4-23.82c5.9-6.57 5.36-16.69-1.22-22.59z\"]\n};\nvar faHryvnia = {\n prefix: 'fas',\n iconName: 'hryvnia',\n icon: [384, 512, [], \"f6f2\", \"M368 240c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16h-41.86c13.41-28.63 13.74-63.33-4.13-94.05C303.34 49.84 267.1 32 229.96 32h-78.82c-24.32 0-47.86 8.53-66.54 24.09L72.83 65.9c-10.18 8.49-11.56 23.62-3.07 33.8l20.49 24.59c8.49 10.19 23.62 11.56 33.81 3.07l11.73-9.78c4.32-3.6 9.77-5.57 15.39-5.57h83.62c11.69 0 21.2 9.52 21.2 21.2 0 5.91-2.48 11.58-6.81 15.58L219.7 176H16c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h134.37l-34.67 32H16c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h41.86c-13.41 28.63-13.74 63.33 4.13 94.05C80.66 462.15 116.9 480 154.04 480h78.82c24.32 0 47.86-8.53 66.54-24.09l11.77-9.81c10.18-8.49 11.56-23.62 3.07-33.8l-20.49-24.59c-8.49-10.19-23.62-11.56-33.81-3.07l-11.75 9.8a23.992 23.992 0 0 1-15.36 5.56H149.2c-11.69 0-21.2-9.52-21.2-21.2 0-5.91 2.48-11.58 6.81-15.58L164.3 336H368c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16H233.63l34.67-32H368z\"]\n};\nvar faICursor = {\n prefix: 'fas',\n iconName: 'i-cursor',\n icon: [256, 512, [], \"f246\", \"M256 52.048V12.065C256 5.496 250.726.148 244.158.066 211.621-.344 166.469.011 128 37.959 90.266.736 46.979-.114 11.913.114 5.318.157 0 5.519 0 12.114v39.645c0 6.687 5.458 12.078 12.145 11.998C38.111 63.447 96 67.243 96 112.182V224H60c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h36v112c0 44.932-56.075 48.031-83.95 47.959C5.404 447.942 0 453.306 0 459.952v39.983c0 6.569 5.274 11.917 11.842 11.999 32.537.409 77.689.054 116.158-37.894 37.734 37.223 81.021 38.073 116.087 37.845 6.595-.043 11.913-5.405 11.913-12V460.24c0-6.687-5.458-12.078-12.145-11.998C217.889 448.553 160 444.939 160 400V288h36c6.627 0 12-5.373 12-12v-40c0-6.627-5.373-12-12-12h-36V112.182c0-44.932 56.075-48.213 83.95-48.142 6.646.018 12.05-5.346 12.05-11.992z\"]\n};\nvar faIceCream = {\n prefix: 'fas',\n iconName: 'ice-cream',\n icon: [448, 512, [], \"f810\", \"M368 160h-.94a144 144 0 1 0-286.12 0H80a48 48 0 0 0 0 96h288a48 48 0 0 0 0-96zM195.38 493.69a31.52 31.52 0 0 0 57.24 0L352 288H96z\"]\n};\nvar faIcicles = {\n prefix: 'fas',\n iconName: 'icicles',\n icon: [512, 512, [], \"f7ad\", \"M511.4 37.9C515.1 18.2 500 0 480 0H32C10.6 0-4.8 20.7 1.4 41.2l87.1 273.4c2.5 7.2 12.7 7.2 15.1 0L140 190.5l44.2 187.3c1.9 8.3 13.7 8.3 15.6 0l46.5-196.9 34.1 133.4c2.3 7.6 13 7.6 15.3 0l45.8-172.5 66.7 363.8c1.7 8.6 14 8.6 15.7 0l87.5-467.7z\"]\n};\nvar faIcons = {\n prefix: 'fas',\n iconName: 'icons',\n icon: [512, 512, [], \"f86d\", \"M116.65 219.35a15.68 15.68 0 0 0 22.65 0l96.75-99.83c28.15-29 26.5-77.1-4.91-103.88C203.75-7.7 163-3.5 137.86 22.44L128 32.58l-9.85-10.14C93.05-3.5 52.25-7.7 24.86 15.64c-31.41 26.78-33 74.85-5 103.88zm143.92 100.49h-48l-7.08-14.24a27.39 27.39 0 0 0-25.66-17.78h-71.71a27.39 27.39 0 0 0-25.66 17.78l-7 14.24h-48A27.45 27.45 0 0 0 0 347.3v137.25A27.44 27.44 0 0 0 27.43 512h233.14A27.45 27.45 0 0 0 288 484.55V347.3a27.45 27.45 0 0 0-27.43-27.46zM144 468a52 52 0 1 1 52-52 52 52 0 0 1-52 52zm355.4-115.9h-60.58l22.36-50.75c2.1-6.65-3.93-13.21-12.18-13.21h-75.59c-6.3 0-11.66 3.9-12.5 9.1l-16.8 106.93c-1 6.3 4.88 11.89 12.5 11.89h62.31l-24.2 83c-1.89 6.65 4.2 12.9 12.23 12.9a13.26 13.26 0 0 0 10.92-5.25l92.4-138.91c4.88-6.91-1.16-15.7-10.87-15.7zM478.08.33L329.51 23.17C314.87 25.42 304 38.92 304 54.83V161.6a83.25 83.25 0 0 0-16-1.7c-35.35 0-64 21.48-64 48s28.65 48 64 48c35.2 0 63.73-21.32 64-47.66V99.66l112-17.22v47.18a83.25 83.25 0 0 0-16-1.7c-35.35 0-64 21.48-64 48s28.65 48 64 48c35.2 0 63.73-21.32 64-47.66V32c0-19.48-16-34.42-33.92-31.67z\"]\n};\nvar faIdBadge = {\n prefix: 'fas',\n iconName: 'id-badge',\n icon: [384, 512, [], \"f2c1\", \"M336 0H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V48c0-26.5-21.5-48-48-48zM144 32h96c8.8 0 16 7.2 16 16s-7.2 16-16 16h-96c-8.8 0-16-7.2-16-16s7.2-16 16-16zm48 128c35.3 0 64 28.7 64 64s-28.7 64-64 64-64-28.7-64-64 28.7-64 64-64zm112 236.8c0 10.6-10 19.2-22.4 19.2H102.4C90 416 80 407.4 80 396.8v-19.2c0-31.8 30.1-57.6 67.2-57.6h5c12.3 5.1 25.7 8 39.8 8s27.6-2.9 39.8-8h5c37.1 0 67.2 25.8 67.2 57.6v19.2z\"]\n};\nvar faIdCard = {\n prefix: 'fas',\n iconName: 'id-card',\n icon: [576, 512, [], \"f2c2\", \"M528 32H48C21.5 32 0 53.5 0 80v16h576V80c0-26.5-21.5-48-48-48zM0 432c0 26.5 21.5 48 48 48h480c26.5 0 48-21.5 48-48V128H0v304zm352-232c0-4.4 3.6-8 8-8h144c4.4 0 8 3.6 8 8v16c0 4.4-3.6 8-8 8H360c-4.4 0-8-3.6-8-8v-16zm0 64c0-4.4 3.6-8 8-8h144c4.4 0 8 3.6 8 8v16c0 4.4-3.6 8-8 8H360c-4.4 0-8-3.6-8-8v-16zm0 64c0-4.4 3.6-8 8-8h144c4.4 0 8 3.6 8 8v16c0 4.4-3.6 8-8 8H360c-4.4 0-8-3.6-8-8v-16zM176 192c35.3 0 64 28.7 64 64s-28.7 64-64 64-64-28.7-64-64 28.7-64 64-64zM67.1 396.2C75.5 370.5 99.6 352 128 352h8.2c12.3 5.1 25.7 8 39.8 8s27.6-2.9 39.8-8h8.2c28.4 0 52.5 18.5 60.9 44.2 3.2 9.9-5.2 19.8-15.6 19.8H82.7c-10.4 0-18.8-10-15.6-19.8z\"]\n};\nvar faIdCardAlt = {\n prefix: 'fas',\n iconName: 'id-card-alt',\n icon: [576, 512, [], \"f47f\", \"M528 64H384v96H192V64H48C21.5 64 0 85.5 0 112v352c0 26.5 21.5 48 48 48h480c26.5 0 48-21.5 48-48V112c0-26.5-21.5-48-48-48zM288 224c35.3 0 64 28.7 64 64s-28.7 64-64 64-64-28.7-64-64 28.7-64 64-64zm93.3 224H194.7c-10.4 0-18.8-10-15.6-19.8 8.3-25.6 32.4-44.2 60.9-44.2h8.2c12.3 5.1 25.7 8 39.8 8s27.6-2.9 39.8-8h8.2c28.4 0 52.5 18.5 60.9 44.2 3.2 9.8-5.2 19.8-15.6 19.8zM352 32c0-17.7-14.3-32-32-32h-64c-17.7 0-32 14.3-32 32v96h128V32z\"]\n};\nvar faIgloo = {\n prefix: 'fas',\n iconName: 'igloo',\n icon: [576, 512, [], \"f7ae\", \"M320 33.9c-10.5-1.2-21.2-1.9-32-1.9-99.8 0-187.8 50.8-239.4 128H320V33.9zM96 192H30.3C11.1 230.6 0 274 0 320h96V192zM352 39.4V160h175.4C487.2 99.9 424.8 55.9 352 39.4zM480 320h96c0-46-11.1-89.4-30.3-128H480v128zm-64 64v96h128c17.7 0 32-14.3 32-32v-96H411.5c2.6 10.3 4.5 20.9 4.5 32zm32-192H128v128h49.8c22.2-38.1 63-64 110.2-64s88 25.9 110.2 64H448V192zM0 448c0 17.7 14.3 32 32 32h128v-96c0-11.1 1.9-21.7 4.5-32H0v96zm288-160c-53 0-96 43-96 96v96h192v-96c0-53-43-96-96-96z\"]\n};\nvar faImage = {\n prefix: 'fas',\n iconName: 'image',\n icon: [512, 512, [], \"f03e\", \"M464 448H48c-26.51 0-48-21.49-48-48V112c0-26.51 21.49-48 48-48h416c26.51 0 48 21.49 48 48v288c0 26.51-21.49 48-48 48zM112 120c-30.928 0-56 25.072-56 56s25.072 56 56 56 56-25.072 56-56-25.072-56-56-56zM64 384h384V272l-87.515-87.515c-4.686-4.686-12.284-4.686-16.971 0L208 320l-55.515-55.515c-4.686-4.686-12.284-4.686-16.971 0L64 336v48z\"]\n};\nvar faImages = {\n prefix: 'fas',\n iconName: 'images',\n icon: [576, 512, [], \"f302\", \"M480 416v16c0 26.51-21.49 48-48 48H48c-26.51 0-48-21.49-48-48V176c0-26.51 21.49-48 48-48h16v208c0 44.112 35.888 80 80 80h336zm96-80V80c0-26.51-21.49-48-48-48H144c-26.51 0-48 21.49-48 48v256c0 26.51 21.49 48 48 48h384c26.51 0 48-21.49 48-48zM256 128c0 26.51-21.49 48-48 48s-48-21.49-48-48 21.49-48 48-48 48 21.49 48 48zm-96 144l55.515-55.515c4.686-4.686 12.284-4.686 16.971 0L272 256l135.515-135.515c4.686-4.686 12.284-4.686 16.971 0L512 208v112H160v-48z\"]\n};\nvar faInbox = {\n prefix: 'fas',\n iconName: 'inbox',\n icon: [576, 512, [], \"f01c\", \"M567.938 243.908L462.25 85.374A48.003 48.003 0 0 0 422.311 64H153.689a48 48 0 0 0-39.938 21.374L8.062 243.908A47.994 47.994 0 0 0 0 270.533V400c0 26.51 21.49 48 48 48h480c26.51 0 48-21.49 48-48V270.533a47.994 47.994 0 0 0-8.062-26.625zM162.252 128h251.497l85.333 128H376l-32 64H232l-32-64H76.918l85.334-128z\"]\n};\nvar faIndent = {\n prefix: 'fas',\n iconName: 'indent',\n icon: [448, 512, [], \"f03c\", \"M27.31 363.3l96-96a16 16 0 0 0 0-22.62l-96-96C17.27 138.66 0 145.78 0 160v192c0 14.31 17.33 21.3 27.31 11.3zM432 416H16a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h416a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm3.17-128H204.83A12.82 12.82 0 0 0 192 300.83v38.34A12.82 12.82 0 0 0 204.83 352h230.34A12.82 12.82 0 0 0 448 339.17v-38.34A12.82 12.82 0 0 0 435.17 288zm0-128H204.83A12.82 12.82 0 0 0 192 172.83v38.34A12.82 12.82 0 0 0 204.83 224h230.34A12.82 12.82 0 0 0 448 211.17v-38.34A12.82 12.82 0 0 0 435.17 160zM432 32H16A16 16 0 0 0 0 48v32a16 16 0 0 0 16 16h416a16 16 0 0 0 16-16V48a16 16 0 0 0-16-16z\"]\n};\nvar faIndustry = {\n prefix: 'fas',\n iconName: 'industry',\n icon: [512, 512, [], \"f275\", \"M475.115 163.781L336 252.309v-68.28c0-18.916-20.931-30.399-36.885-20.248L160 252.309V56c0-13.255-10.745-24-24-24H24C10.745 32 0 42.745 0 56v400c0 13.255 10.745 24 24 24h464c13.255 0 24-10.745 24-24V184.029c0-18.917-20.931-30.399-36.885-20.248z\"]\n};\nvar faInfinity = {\n prefix: 'fas',\n iconName: 'infinity',\n icon: [640, 512, [], \"f534\", \"M471.1 96C405 96 353.3 137.3 320 174.6 286.7 137.3 235 96 168.9 96 75.8 96 0 167.8 0 256s75.8 160 168.9 160c66.1 0 117.8-41.3 151.1-78.6 33.3 37.3 85 78.6 151.1 78.6 93.1 0 168.9-71.8 168.9-160S564.2 96 471.1 96zM168.9 320c-40.2 0-72.9-28.7-72.9-64s32.7-64 72.9-64c38.2 0 73.4 36.1 94 64-20.4 27.6-55.9 64-94 64zm302.2 0c-38.2 0-73.4-36.1-94-64 20.4-27.6 55.9-64 94-64 40.2 0 72.9 28.7 72.9 64s-32.7 64-72.9 64z\"]\n};\nvar faInfo = {\n prefix: 'fas',\n iconName: 'info',\n icon: [192, 512, [], \"f129\", \"M20 424.229h20V279.771H20c-11.046 0-20-8.954-20-20V212c0-11.046 8.954-20 20-20h112c11.046 0 20 8.954 20 20v212.229h20c11.046 0 20 8.954 20 20V492c0 11.046-8.954 20-20 20H20c-11.046 0-20-8.954-20-20v-47.771c0-11.046 8.954-20 20-20zM96 0C56.235 0 24 32.235 24 72s32.235 72 72 72 72-32.235 72-72S135.764 0 96 0z\"]\n};\nvar faInfoCircle = {\n prefix: 'fas',\n iconName: 'info-circle',\n icon: [512, 512, [], \"f05a\", \"M256 8C119.043 8 8 119.083 8 256c0 136.997 111.043 248 248 248s248-111.003 248-248C504 119.083 392.957 8 256 8zm0 110c23.196 0 42 18.804 42 42s-18.804 42-42 42-42-18.804-42-42 18.804-42 42-42zm56 254c0 6.627-5.373 12-12 12h-88c-6.627 0-12-5.373-12-12v-24c0-6.627 5.373-12 12-12h12v-64h-12c-6.627 0-12-5.373-12-12v-24c0-6.627 5.373-12 12-12h64c6.627 0 12 5.373 12 12v100h12c6.627 0 12 5.373 12 12v24z\"]\n};\nvar faItalic = {\n prefix: 'fas',\n iconName: 'italic',\n icon: [320, 512, [], \"f033\", \"M320 48v32a16 16 0 0 1-16 16h-62.76l-80 320H208a16 16 0 0 1 16 16v32a16 16 0 0 1-16 16H16a16 16 0 0 1-16-16v-32a16 16 0 0 1 16-16h62.76l80-320H112a16 16 0 0 1-16-16V48a16 16 0 0 1 16-16h192a16 16 0 0 1 16 16z\"]\n};\nvar faJedi = {\n prefix: 'fas',\n iconName: 'jedi',\n icon: [544, 512, [], \"f669\", \"M479.99 352l58.88-58.87c3.29-16.8 5.13-34.12 5.13-51.86 0-5.81-.68-11.51-1.05-17.27H496l41.25-41.24c-14.5-64.79-52.43-123.05-107.91-162.27-2.77-1.96-5.97-2.99-9.25-2.99-5.37 0-10.41 2.71-13.49 7.24-3.05 4.49-3.64 9.99-1.61 15.09 6.55 16.46 9.86 33.73 9.86 51.31 0 45.12-21.03 86.57-57.69 113.73-4.02 2.98-6.46 7.5-6.7 12.4-.24 4.92 1.76 9.66 5.49 13.03 32.93 29.75 47.35 73.51 38.57 117.07-9.74 48.35-48.84 87.1-97.31 96.5l-2.5-65.34L321.88 397c2.98 2.06 7.39 1.69 10.02-.8a8.002 8.002 0 0 0 1.34-9.92l-20.11-33.73 42.07-8.72c3.7-.75 6.38-4.05 6.38-7.83 0-3.77-2.69-7.06-6.38-7.83l-42.07-8.73 20.13-33.77c1.92-3.23 1.34-7.31-1.38-9.91-2.7-2.55-6.97-2.89-10-.8l-30.39 20.67L279.96 7.7a7.964 7.964 0 0 0-8-7.7c-4.33 0-7.84 3.38-8 7.67l-11.52 287.97-30.39-20.66c-3.14-2.12-7.27-1.83-10 .78-2.72 2.59-3.3 6.67-1.36 9.94l20.11 33.73-42.07 8.73c-3.7.75-6.38 4.05-6.38 7.83s2.67 7.08 6.38 7.83l42.07 8.72-20.13 33.77c-1.92 3.23-1.34 7.33 1.39 9.94 2.59 2.45 7.03 2.75 10 .75l27.16-18.48-2.5 65.26c-56.94-11.64-99.89-61.89-99.89-121.92 0-35.08 14.62-67.6 41.17-91.58 3.72-3.36 5.72-8.11 5.48-13.01-.24-4.9-2.68-9.41-6.69-12.38-36.67-27.16-57.71-68.62-57.71-113.74 0-17.56 3.31-34.81 9.84-51.26 2.02-5.09 1.43-10.59-1.62-15.09-3.08-4.54-8.13-7.25-13.51-7.25-3.3 0-6.5 1.04-9.27 3-55.87 39.52-93.6 97.37-107.97 162.07L47.93 224H.72c-.63 9.92-.97 19.91-.5 29.99.62 13.43 2.54 26.53 5.11 39.41l58.6 58.6H24.02c41.25 90.23 131.13 154.94 235.1 159.71 4.3.2 8.59.29 12.85.29 110.34 0 205.35-65.83 247.98-160h-39.96z\"]\n};\nvar faJoint = {\n prefix: 'fas',\n iconName: 'joint',\n icon: [640, 512, [], \"f595\", \"M444.34 181.1c22.38 15.68 35.66 41.16 35.66 68.59V280c0 4.42 3.58 8 8 8h48c4.42 0 8-3.58 8-8v-30.31c0-43.24-21.01-83.41-56.34-108.06C463.85 125.02 448 99.34 448 70.31V8c0-4.42-3.58-8-8-8h-48c-4.42 0-8 3.58-8 8v66.4c0 43.69 24.56 81.63 60.34 106.7zM194.97 358.98C126.03 370.07 59.69 394.69 0 432c83.65 52.28 180.3 80 278.94 80h88.57L254.79 380.49c-14.74-17.2-37.45-25.11-59.82-21.51zM553.28 87.09c-5.67-3.8-9.28-9.96-9.28-16.78V8c0-4.42-3.58-8-8-8h-48c-4.42 0-8 3.58-8 8v62.31c0 22.02 10.17 43.41 28.64 55.39C550.79 153.04 576 199.54 576 249.69V280c0 4.42 3.58 8 8 8h48c4.42 0 8-3.58 8-8v-30.31c0-65.44-32.41-126.19-86.72-162.6zM360.89 352.05c-34.4.06-86.81.15-88.21.17l117.8 137.43A63.987 63.987 0 0 0 439.07 512h88.45L409.57 374.4a63.955 63.955 0 0 0-48.68-22.35zM616 352H432l117.99 137.65A63.987 63.987 0 0 0 598.58 512H616c13.25 0 24-10.75 24-24V376c0-13.26-10.75-24-24-24z\"]\n};\nvar faJournalWhills = {\n prefix: 'fas',\n iconName: 'journal-whills',\n icon: [448, 512, [], \"f66a\", \"M448 358.4V25.6c0-16-9.6-25.6-25.6-25.6H96C41.6 0 0 41.6 0 96v320c0 54.4 41.6 96 96 96h326.4c12.8 0 25.6-9.6 25.6-25.6v-16c0-6.4-3.2-12.8-9.6-19.2-3.2-16-3.2-60.8 0-73.6 6.4-3.2 9.6-9.6 9.6-19.2zM133.08 144.39l21.26 21.26c1.56 1.56 3.61 2.34 5.66 2.34s4.09-.78 5.66-2.34c3.12-3.12 3.12-8.19 0-11.31l-26.42-26.42c10-20.9 26.24-37.97 46.37-49.26C179.62 88.4 176 99.74 176 112c0 19.96 9.33 37.57 23.66 49.31C190.01 171.37 184 184.96 184 200c0 26.94 19.04 49.4 44.38 54.76l1.36-32.71-10.37 7.04c-.69.45-1.47.69-2.25.69-1 0-1.98-.38-2.75-1.09a4.006 4.006 0 0 1-.69-4.95l8.54-14.31-17.91-3.72c-1.86-.39-3.19-2.03-3.19-3.92s1.33-3.53 3.19-3.92l17.91-3.72-8.54-14.31c-.95-1.61-.67-3.67.69-4.95 1.36-1.3 3.44-1.44 5-.41l12.01 8.16L236 71.83c.09-2.14 1.86-3.83 4-3.83s3.91 1.69 4 3.83l4.68 112.29 14.2-9.65a4.067 4.067 0 0 1 5 .41 4.006 4.006 0 0 1 .69 4.95l-8.54 14.31 17.91 3.72c1.86.39 3.19 2.03 3.19 3.92s-1.33 3.53-3.19 3.92l-17.91 3.72 8.54 14.31c.95 1.61.67 3.67-.69 4.95-.77.72-1.77 1.09-2.75 1.09-.78 0-1.56-.23-2.25-.69l-12.68-8.62 1.43 34.28C276.96 249.4 296 226.94 296 200c0-15.04-6.01-28.63-15.66-38.69C294.67 149.57 304 131.96 304 112c0-12.26-3.62-23.6-9.6-33.33 20.13 11.28 36.37 28.36 46.37 49.26l-26.42 26.42c-3.12 3.12-3.12 8.19 0 11.31 1.56 1.56 3.61 2.34 5.66 2.34s4.09-.78 5.66-2.34l21.26-21.26c2.97 10.08 5.07 20.55 5.07 31.6 0 .52-.14.99-.15 1.51l-37.11 32.47a7.975 7.975 0 0 0-.75 11.28 7.97 7.97 0 0 0 6.02 2.73c1.88 0 3.75-.66 5.27-1.98l23.59-20.64C337.32 250.96 293.09 288 240 288s-97.32-37.04-108.86-86.62l23.59 20.64A7.957 7.957 0 0 0 160 224c2.22 0 4.44-.92 6.02-2.73 2.92-3.33 2.58-8.38-.75-11.28l-37.11-32.47c-.01-.52-.15-.99-.15-1.51-.01-11.06 2.09-21.53 5.07-31.62zM380.8 448H96c-19.2 0-32-12.8-32-32s16-32 32-32h284.8v64z\"]\n};\nvar faKaaba = {\n prefix: 'fas',\n iconName: 'kaaba',\n icon: [576, 512, [], \"f66b\", \"M554.12 83.51L318.36 4.93a95.962 95.962 0 0 0-60.71 0L21.88 83.51A32.006 32.006 0 0 0 0 113.87v49.01l265.02-79.51c15.03-4.5 30.92-4.5 45.98 0l265 79.51v-49.01c0-13.77-8.81-26-21.88-30.36zm-279.9 30.52L0 196.3v228.38c0 15 10.42 27.98 25.06 31.24l242.12 53.8a95.937 95.937 0 0 0 41.65 0l242.12-53.8c14.64-3.25 25.06-16.24 25.06-31.24V196.29l-274.2-82.26c-9.04-2.72-18.59-2.72-27.59 0zM128 230.11c0 3.61-2.41 6.77-5.89 7.72l-80 21.82C37.02 261.03 32 257.2 32 251.93v-16.58c0-3.61 2.41-6.77 5.89-7.72l80-21.82c5.09-1.39 10.11 2.44 10.11 7.72v16.58zm144-39.28c0 3.61-2.41 6.77-5.89 7.72l-96 26.18c-5.09 1.39-10.11-2.44-10.11-7.72v-16.58c0-3.61 2.41-6.77 5.89-7.72l96-26.18c5.09-1.39 10.11 2.44 10.11 7.72v16.58zm176 22.7c0-5.28 5.02-9.11 10.11-7.72l80 21.82c3.48.95 5.89 4.11 5.89 7.72v16.58c0 5.28-5.02 9.11-10.11 7.72l-80-21.82a7.997 7.997 0 0 1-5.89-7.72v-16.58zm-144-39.27c0-5.28 5.02-9.11 10.11-7.72l96 26.18c3.48.95 5.89 4.11 5.89 7.72v16.58c0 5.28-5.02 9.11-10.11 7.72l-96-26.18a7.997 7.997 0 0 1-5.89-7.72v-16.58z\"]\n};\nvar faKey = {\n prefix: 'fas',\n iconName: 'key',\n icon: [512, 512, [], \"f084\", \"M512 176.001C512 273.203 433.202 352 336 352c-11.22 0-22.19-1.062-32.827-3.069l-24.012 27.014A23.999 23.999 0 0 1 261.223 384H224v40c0 13.255-10.745 24-24 24h-40v40c0 13.255-10.745 24-24 24H24c-13.255 0-24-10.745-24-24v-78.059c0-6.365 2.529-12.47 7.029-16.971l161.802-161.802C163.108 213.814 160 195.271 160 176 160 78.798 238.797.001 335.999 0 433.488-.001 512 78.511 512 176.001zM336 128c0 26.51 21.49 48 48 48s48-21.49 48-48-21.49-48-48-48-48 21.49-48 48z\"]\n};\nvar faKeyboard = {\n prefix: 'fas',\n iconName: 'keyboard',\n icon: [576, 512, [], \"f11c\", \"M528 448H48c-26.51 0-48-21.49-48-48V112c0-26.51 21.49-48 48-48h480c26.51 0 48 21.49 48 48v288c0 26.51-21.49 48-48 48zM128 180v-40c0-6.627-5.373-12-12-12H76c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm96 0v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm96 0v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm96 0v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm96 0v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm-336 96v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm96 0v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm96 0v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm96 0v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm-336 96v-40c0-6.627-5.373-12-12-12H76c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm288 0v-40c0-6.627-5.373-12-12-12H172c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h232c6.627 0 12-5.373 12-12zm96 0v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12z\"]\n};\nvar faKhanda = {\n prefix: 'fas',\n iconName: 'khanda',\n icon: [512, 512, [], \"f66d\", \"M415.81 66c-6.37-3.5-14.37-2.33-19.36 3.02a15.974 15.974 0 0 0-1.91 19.52c16.49 26.16 25.2 56.39 25.2 87.41-.19 53.25-26.77 102.69-71.27 132.41l-76.63 53.35v-20.1l44.05-36.09c3.92-4.2 5-10.09 2.81-15.28L310.85 273c33.84-19.26 56.94-55.25 56.94-96.99 0-40.79-22.02-76.13-54.59-95.71l5.22-11.44c2.34-5.53.93-11.83-3.57-16.04L255.86 0l-58.99 52.81c-4.5 4.21-5.9 10.51-3.57 16.04l5.22 11.44c-32.57 19.58-54.59 54.93-54.59 95.72 0 41.75 23.09 77.73 56.94 96.99l-7.85 17.24c-2.19 5.18-1.1 11.07 2.81 15.28l44.05 36.09v19.9l-76.59-53.33C119.02 278.62 92.44 229.19 92.26 176c0-31.08 8.71-61.31 25.2-87.47 3.87-6.16 2.4-13.77-2.59-19.08-5-5.34-13.68-6.2-20.02-2.7C16.32 109.6-22.3 205.3 13.36 295.99c7.07 17.99 17.89 34.38 30.46 49.06l55.97 65.36c4.87 5.69 13.04 7.24 19.65 3.72l79.35-42.23L228 392.23l-47.08 32.78c-1.67-.37-3.23-1.01-5.01-1.01-13.25 0-23.99 10.74-23.99 24 0 13.25 10.74 24 23.99 24 12.1 0 21.69-9.11 23.33-20.76l40.63-28.28v29.95c-9.39 5.57-15.99 15.38-15.99 27.1 0 17.67 14.32 32 31.98 32s31.98-14.33 31.98-32c0-11.71-6.61-21.52-15.99-27.1v-30.15l40.91 28.48C314.41 462.89 324 472 336.09 472c13.25 0 23.99-10.75 23.99-24 0-13.26-10.74-24-23.99-24-1.78 0-3.34.64-5.01 1.01L284 392.23l29.21-20.34 79.35 42.23c6.61 3.52 14.78 1.97 19.65-3.71l52.51-61.31c18.87-22.02 34-47.5 41.25-75.59 21.62-83.66-16.45-167.27-90.16-207.51zm-95.99 110c0 22.3-11.49 41.92-28.83 53.38l-5.65-12.41c-8.75-24.52-8.75-51.04 0-75.56l7.83-17.18c16.07 11.65 26.65 30.45 26.65 51.77zm-127.93 0c0-21.32 10.58-40.12 26.66-51.76l7.83 17.18c8.75 24.52 8.75 51.03 0 75.56l-5.65 12.41c-17.34-11.46-28.84-31.09-28.84-53.39z\"]\n};\nvar faKiss = {\n prefix: 'fas',\n iconName: 'kiss',\n icon: [496, 512, [], \"f596\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm-80 232c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32zm136 156c0 19.2-28.7 41.5-71.5 44-8.5.8-12.1-11.8-3.6-15.4l17-7.2c13-5.5 20.8-13.5 20.8-21.5s-7.8-16-20.8-21.5l-17-7.2c-6-2.5-6.1-12.2 0-14.8l17-7.2c13-5.5 20.8-13.5 20.8-21.5s-7.8-16-20.8-21.5l-17-7.2c-8.6-3.6-4.8-16.5 3.6-15.4 42.8 2.5 71.5 24.8 71.5 44 0 13-13.4 27.3-35.2 36C290.6 368.7 304 383 304 396zm24-156c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32z\"]\n};\nvar faKissBeam = {\n prefix: 'fas',\n iconName: 'kiss-beam',\n icon: [496, 512, [], \"f597\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm-39 219.9l-9.5-17c-7.7-13.7-19.2-21.6-31.5-21.6s-23.8 7.9-31.5 21.6l-9.5 17c-4.2 7.4-15.6 4-14.9-4.5 3.3-42.1 32.2-71.4 56-71.4s52.7 29.3 56 71.4c.5 8.5-10.9 12-15.1 4.5zM304 396c0 19.2-28.7 41.5-71.5 44-8.5.8-12.1-11.8-3.6-15.4l17-7.2c13-5.5 20.8-13.5 20.8-21.5s-7.8-16-20.8-21.5l-17-7.2c-6-2.5-6.1-12.2 0-14.8l17-7.2c13-5.5 20.8-13.5 20.8-21.5s-7.8-16-20.8-21.5l-17-7.2c-8.6-3.6-4.8-16.5 3.6-15.4 42.8 2.5 71.5 24.8 71.5 44 0 13-13.4 27.3-35.2 36C290.6 368.7 304 383 304 396zm65-168.1l-9.5-17c-7.7-13.7-19.2-21.6-31.5-21.6s-23.8 7.9-31.5 21.6l-9.5 17c-4.1 7.3-15.6 4-14.9-4.5 3.3-42.1 32.2-71.4 56-71.4s52.7 29.3 56 71.4c.5 8.5-10.9 12-15.1 4.5z\"]\n};\nvar faKissWinkHeart = {\n prefix: 'fas',\n iconName: 'kiss-wink-heart',\n icon: [504, 512, [], \"f598\", \"M501.1 402.5c-8-20.8-31.5-31.5-53.1-25.9l-8.4 2.2-2.3-8.4c-5.9-21.4-27-36.5-49-33-25.2 4-40.6 28.6-34 52.6l22.9 82.6c1.5 5.3 7 8.5 12.4 7.1l83-21.5c24.1-6.3 37.7-31.8 28.5-55.7zm-177.6-4c-5.6-20.3-2.3-42 9-59.7 29.7-46.3 98.7-45.5 127.8 4.3 6.4.1 12.6 1.4 18.6 2.9 10.9-27.9 17.1-58.2 17.1-90C496 119 385 8 248 8S0 119 0 256s111 248 248 248c35.4 0 68.9-7.5 99.4-20.9-.3-.7-23.9-84.6-23.9-84.6zM168 240c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32zm120 156c0 19.2-28.7 41.5-71.5 44-8.5.8-12.1-11.8-3.6-15.4l17-7.2c13-5.5 20.8-13.5 20.8-21.5s-7.8-16-20.8-21.5l-17-7.2c-6-2.5-5.7-12.3 0-14.8l17-7.2c13-5.5 20.8-13.5 20.8-21.5s-7.8-16-20.8-21.5l-17-7.2c-8.8-3.7-4.6-16.6 3.6-15.4 42.8 2.5 71.5 24.8 71.5 44 0 13-13.4 27.3-35.2 36C274.6 368.7 288 383 288 396zm16-179c-8.3 7.4-21.6.4-19.8-10.8 4-25.2 34.2-42.1 59.9-42.1S400 181 404 206.2c1.7 11.1-11.3 18.3-19.8 10.8l-9.5-8.5c-14.8-13.2-46.2-13.2-61 0L304 217z\"]\n};\nvar faKiwiBird = {\n prefix: 'fas',\n iconName: 'kiwi-bird',\n icon: [576, 512, [], \"f535\", \"M575.81 217.98C572.64 157.41 518.28 112 457.63 112h-9.37c-52.82 0-104.25-16.25-147.74-46.24-41.99-28.96-96.04-41.62-153.21-28.7C129.3 41.12-.08 78.24 0 224c.04 70.95 38.68 132.8 95.99 166.01V464c0 8.84 7.16 16 16 16h16c8.84 0 16-7.16 16-16v-54.26c15.36 3.96 31.4 6.26 48 6.26 5.44 0 10.68-.73 16-1.18V464c0 8.84 7.16 16 16 16h16c8.84 0 16-7.16 16-16v-59.43c14.24-5.06 27.88-11.39 40.34-19.51C342.07 355.25 393.86 336 448.46 336c25.48 0 16.01-.31 23.05-.78l74.41 136.44c2.86 5.23 8.3 8.34 14.05 8.34 1.31 0 2.64-.16 3.95-.5 7.09-1.8 12.05-8.19 12.05-15.5 0 0 .14-240.24-.16-246.02zM463.97 248c-13.25 0-24-10.75-24-24 0-13.26 10.75-24 24-24s24 10.74 24 24c0 13.25-10.75 24-24 24zm80 153.25l-39.86-73.08c15.12-5.83 28.73-14.6 39.86-25.98v99.06z\"]\n};\nvar faLandmark = {\n prefix: 'fas',\n iconName: 'landmark',\n icon: [512, 512, [], \"f66f\", \"M501.62 92.11L267.24 2.04a31.958 31.958 0 0 0-22.47 0L10.38 92.11A16.001 16.001 0 0 0 0 107.09V144c0 8.84 7.16 16 16 16h480c8.84 0 16-7.16 16-16v-36.91c0-6.67-4.14-12.64-10.38-14.98zM64 192v160H48c-8.84 0-16 7.16-16 16v48h448v-48c0-8.84-7.16-16-16-16h-16V192h-64v160h-96V192h-64v160h-96V192H64zm432 256H16c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h480c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16z\"]\n};\nvar faLanguage = {\n prefix: 'fas',\n iconName: 'language',\n icon: [640, 512, [], \"f1ab\", \"M152.1 236.2c-3.5-12.1-7.8-33.2-7.8-33.2h-.5s-4.3 21.1-7.8 33.2l-11.1 37.5H163zM616 96H336v320h280c13.3 0 24-10.7 24-24V120c0-13.3-10.7-24-24-24zm-24 120c0 6.6-5.4 12-12 12h-11.4c-6.9 23.6-21.7 47.4-42.7 69.9 8.4 6.4 17.1 12.5 26.1 18 5.5 3.4 7.3 10.5 4.1 16.2l-7.9 13.9c-3.4 5.9-10.9 7.8-16.7 4.3-12.6-7.8-24.5-16.1-35.4-24.9-10.9 8.7-22.7 17.1-35.4 24.9-5.8 3.5-13.3 1.6-16.7-4.3l-7.9-13.9c-3.2-5.6-1.4-12.8 4.2-16.2 9.3-5.7 18-11.7 26.1-18-7.9-8.4-14.9-17-21-25.7-4-5.7-2.2-13.6 3.7-17.1l6.5-3.9 7.3-4.3c5.4-3.2 12.4-1.7 16 3.4 5 7 10.8 14 17.4 20.9 13.5-14.2 23.8-28.9 30-43.2H412c-6.6 0-12-5.4-12-12v-16c0-6.6 5.4-12 12-12h64v-16c0-6.6 5.4-12 12-12h16c6.6 0 12 5.4 12 12v16h64c6.6 0 12 5.4 12 12zM0 120v272c0 13.3 10.7 24 24 24h280V96H24c-13.3 0-24 10.7-24 24zm58.9 216.1L116.4 167c1.7-4.9 6.2-8.1 11.4-8.1h32.5c5.1 0 9.7 3.3 11.4 8.1l57.5 169.1c2.6 7.8-3.1 15.9-11.4 15.9h-22.9a12 12 0 0 1-11.5-8.6l-9.4-31.9h-60.2l-9.1 31.8c-1.5 5.1-6.2 8.7-11.5 8.7H70.3c-8.2 0-14-8.1-11.4-15.9z\"]\n};\nvar faLaptop = {\n prefix: 'fas',\n iconName: 'laptop',\n icon: [640, 512, [], \"f109\", \"M624 416H381.54c-.74 19.81-14.71 32-32.74 32H288c-18.69 0-33.02-17.47-32.77-32H16c-8.8 0-16 7.2-16 16v16c0 35.2 28.8 64 64 64h512c35.2 0 64-28.8 64-64v-16c0-8.8-7.2-16-16-16zM576 48c0-26.4-21.6-48-48-48H112C85.6 0 64 21.6 64 48v336h512V48zm-64 272H128V64h384v256z\"]\n};\nvar faLaptopCode = {\n prefix: 'fas',\n iconName: 'laptop-code',\n icon: [640, 512, [], \"f5fc\", \"M255.03 261.65c6.25 6.25 16.38 6.25 22.63 0l11.31-11.31c6.25-6.25 6.25-16.38 0-22.63L253.25 192l35.71-35.72c6.25-6.25 6.25-16.38 0-22.63l-11.31-11.31c-6.25-6.25-16.38-6.25-22.63 0l-58.34 58.34c-6.25 6.25-6.25 16.38 0 22.63l58.35 58.34zm96.01-11.3l11.31 11.31c6.25 6.25 16.38 6.25 22.63 0l58.34-58.34c6.25-6.25 6.25-16.38 0-22.63l-58.34-58.34c-6.25-6.25-16.38-6.25-22.63 0l-11.31 11.31c-6.25 6.25-6.25 16.38 0 22.63L386.75 192l-35.71 35.72c-6.25 6.25-6.25 16.38 0 22.63zM624 416H381.54c-.74 19.81-14.71 32-32.74 32H288c-18.69 0-33.02-17.47-32.77-32H16c-8.8 0-16 7.2-16 16v16c0 35.2 28.8 64 64 64h512c35.2 0 64-28.8 64-64v-16c0-8.8-7.2-16-16-16zM576 48c0-26.4-21.6-48-48-48H112C85.6 0 64 21.6 64 48v336h512V48zm-64 272H128V64h384v256z\"]\n};\nvar faLaptopMedical = {\n prefix: 'fas',\n iconName: 'laptop-medical',\n icon: [640, 512, [], \"f812\", \"M232 224h56v56a8 8 0 0 0 8 8h48a8 8 0 0 0 8-8v-56h56a8 8 0 0 0 8-8v-48a8 8 0 0 0-8-8h-56v-56a8 8 0 0 0-8-8h-48a8 8 0 0 0-8 8v56h-56a8 8 0 0 0-8 8v48a8 8 0 0 0 8 8zM576 48a48.14 48.14 0 0 0-48-48H112a48.14 48.14 0 0 0-48 48v336h512zm-64 272H128V64h384zm112 96H381.54c-.74 19.81-14.71 32-32.74 32H288c-18.69 0-33-17.47-32.77-32H16a16 16 0 0 0-16 16v16a64.19 64.19 0 0 0 64 64h512a64.19 64.19 0 0 0 64-64v-16a16 16 0 0 0-16-16z\"]\n};\nvar faLaugh = {\n prefix: 'fas',\n iconName: 'laugh',\n icon: [496, 512, [], \"f599\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm80 152c17.7 0 32 14.3 32 32s-14.3 32-32 32-32-14.3-32-32 14.3-32 32-32zm-160 0c17.7 0 32 14.3 32 32s-14.3 32-32 32-32-14.3-32-32 14.3-32 32-32zm88 272h-16c-73.4 0-134-55-142.9-126-1.2-9.5 6.3-18 15.9-18h270c9.6 0 17.1 8.4 15.9 18-8.9 71-69.5 126-142.9 126z\"]\n};\nvar faLaughBeam = {\n prefix: 'fas',\n iconName: 'laugh-beam',\n icon: [496, 512, [], \"f59a\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm24 199.4c3.3-42.1 32.2-71.4 56-71.4s52.7 29.3 56 71.4c.7 8.6-10.8 11.9-14.9 4.5l-9.5-17c-7.7-13.7-19.2-21.6-31.5-21.6s-23.8 7.9-31.5 21.6l-9.5 17c-4.2 7.4-15.8 4.1-15.1-4.5zm-160 0c3.3-42.1 32.2-71.4 56-71.4s52.7 29.3 56 71.4c.7 8.6-10.8 11.9-14.9 4.5l-9.5-17c-7.7-13.7-19.2-21.6-31.5-21.6s-23.8 7.9-31.5 21.6l-9.5 17c-4.3 7.4-15.8 4-15.1-4.5zM398.9 306C390 377 329.4 432 256 432h-16c-73.4 0-134-55-142.9-126-1.2-9.5 6.3-18 15.9-18h270c9.6 0 17.1 8.4 15.9 18z\"]\n};\nvar faLaughSquint = {\n prefix: 'fas',\n iconName: 'laugh-squint',\n icon: [496, 512, [], \"f59b\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm33.8 161.7l80-48c11.6-6.9 24 7.7 15.4 18L343.6 180l33.6 40.3c8.7 10.4-3.9 24.8-15.4 18l-80-48c-7.7-4.7-7.7-15.9 0-20.6zm-163-30c-8.6-10.3 3.8-24.9 15.4-18l80 48c7.8 4.7 7.8 15.9 0 20.6l-80 48c-11.5 6.8-24-7.6-15.4-18l33.6-40.3-33.6-40.3zM398.9 306C390 377 329.4 432 256 432h-16c-73.4 0-134-55-142.9-126-1.2-9.5 6.3-18 15.9-18h270c9.6 0 17.1 8.4 15.9 18z\"]\n};\nvar faLaughWink = {\n prefix: 'fas',\n iconName: 'laugh-wink',\n icon: [496, 512, [], \"f59c\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm20.1 198.1c4-25.2 34.2-42.1 59.9-42.1s55.9 16.9 59.9 42.1c1.7 11.1-11.4 18.3-19.8 10.8l-9.5-8.5c-14.8-13.2-46.2-13.2-61 0L288 217c-8.4 7.4-21.6.3-19.9-10.9zM168 160c17.7 0 32 14.3 32 32s-14.3 32-32 32-32-14.3-32-32 14.3-32 32-32zm230.9 146C390 377 329.4 432 256 432h-16c-73.4 0-134-55-142.9-126-1.2-9.5 6.3-18 15.9-18h270c9.6 0 17.1 8.4 15.9 18z\"]\n};\nvar faLayerGroup = {\n prefix: 'fas',\n iconName: 'layer-group',\n icon: [512, 512, [], \"f5fd\", \"M12.41 148.02l232.94 105.67c6.8 3.09 14.49 3.09 21.29 0l232.94-105.67c16.55-7.51 16.55-32.52 0-40.03L266.65 2.31a25.607 25.607 0 0 0-21.29 0L12.41 107.98c-16.55 7.51-16.55 32.53 0 40.04zm487.18 88.28l-58.09-26.33-161.64 73.27c-7.56 3.43-15.59 5.17-23.86 5.17s-16.29-1.74-23.86-5.17L70.51 209.97l-58.1 26.33c-16.55 7.5-16.55 32.5 0 40l232.94 105.59c6.8 3.08 14.49 3.08 21.29 0L499.59 276.3c16.55-7.5 16.55-32.5 0-40zm0 127.8l-57.87-26.23-161.86 73.37c-7.56 3.43-15.59 5.17-23.86 5.17s-16.29-1.74-23.86-5.17L70.29 337.87 12.41 364.1c-16.55 7.5-16.55 32.5 0 40l232.94 105.59c6.8 3.08 14.49 3.08 21.29 0L499.59 404.1c16.55-7.5 16.55-32.5 0-40z\"]\n};\nvar faLeaf = {\n prefix: 'fas',\n iconName: 'leaf',\n icon: [576, 512, [], \"f06c\", \"M546.2 9.7c-5.6-12.5-21.6-13-28.3-1.2C486.9 62.4 431.4 96 368 96h-80C182 96 96 182 96 288c0 7 .8 13.7 1.5 20.5C161.3 262.8 253.4 224 384 224c8.8 0 16 7.2 16 16s-7.2 16-16 16C132.6 256 26 410.1 2.4 468c-6.6 16.3 1.2 34.9 17.5 41.6 16.4 6.8 35-1.1 41.8-17.3 1.5-3.6 20.9-47.9 71.9-90.6 32.4 43.9 94 85.8 174.9 77.2C465.5 467.5 576 326.7 576 154.3c0-50.2-10.8-102.2-29.8-144.6z\"]\n};\nvar faLemon = {\n prefix: 'fas',\n iconName: 'lemon',\n icon: [512, 512, [], \"f094\", \"M489.038 22.963C465.944-.13 434.648-5.93 413.947 6.129c-58.906 34.312-181.25-53.077-321.073 86.746S40.441 355.041 6.129 413.945c-12.059 20.702-6.26 51.999 16.833 75.093 23.095 23.095 54.392 28.891 75.095 16.832 58.901-34.31 181.246 53.079 321.068-86.743S471.56 156.96 505.871 98.056c12.059-20.702 6.261-51.999-16.833-75.093zM243.881 95.522c-58.189 14.547-133.808 90.155-148.358 148.358-1.817 7.27-8.342 12.124-15.511 12.124-1.284 0-2.59-.156-3.893-.481-8.572-2.144-13.784-10.83-11.642-19.403C81.901 166.427 166.316 81.93 236.119 64.478c8.575-2.143 17.261 3.069 19.403 11.642s-3.069 17.259-11.641 19.402z\"]\n};\nvar faLessThan = {\n prefix: 'fas',\n iconName: 'less-than',\n icon: [384, 512, [], \"f536\", \"M365.46 357.74L147.04 255.89l218.47-101.88c16.02-7.47 22.95-26.51 15.48-42.53l-13.52-29C360 66.46 340.96 59.53 324.94 67L18.48 209.91a32.014 32.014 0 0 0-18.48 29v34.24c0 12.44 7.21 23.75 18.48 29l306.31 142.83c16.06 7.49 35.15.54 42.64-15.52l13.56-29.08c7.49-16.06.54-35.15-15.53-42.64z\"]\n};\nvar faLessThanEqual = {\n prefix: 'fas',\n iconName: 'less-than-equal',\n icon: [448, 512, [], \"f537\", \"M54.98 214.2l301.41 119.87c18.39 6.03 38.71-2.54 45.38-19.15l12.09-30.08c6.68-16.61-2.82-34.97-21.21-41l-175.44-68.05 175.56-68.09c18.29-6 27.74-24.27 21.1-40.79l-12.03-29.92c-6.64-16.53-26.86-25.06-45.15-19.06L54.98 137.89C41.21 142.41 32 154.5 32 168.07v15.96c0 13.56 9.21 25.65 22.98 30.17zM424 400H24c-13.25 0-24 10.74-24 24v48c0 13.25 10.75 24 24 24h400c13.25 0 24-10.75 24-24v-48c0-13.26-10.75-24-24-24z\"]\n};\nvar faLevelDownAlt = {\n prefix: 'fas',\n iconName: 'level-down-alt',\n icon: [320, 512, [], \"f3be\", \"M313.553 392.331L209.587 504.334c-9.485 10.214-25.676 10.229-35.174 0L70.438 392.331C56.232 377.031 67.062 352 88.025 352H152V80H68.024a11.996 11.996 0 0 1-8.485-3.515l-56-56C-4.021 12.926 1.333 0 12.024 0H208c13.255 0 24 10.745 24 24v328h63.966c20.878 0 31.851 24.969 17.587 40.331z\"]\n};\nvar faLevelUpAlt = {\n prefix: 'fas',\n iconName: 'level-up-alt',\n icon: [320, 512, [], \"f3bf\", \"M313.553 119.669L209.587 7.666c-9.485-10.214-25.676-10.229-35.174 0L70.438 119.669C56.232 134.969 67.062 160 88.025 160H152v272H68.024a11.996 11.996 0 0 0-8.485 3.515l-56 56C-4.021 499.074 1.333 512 12.024 512H208c13.255 0 24-10.745 24-24V160h63.966c20.878 0 31.851-24.969 17.587-40.331z\"]\n};\nvar faLifeRing = {\n prefix: 'fas',\n iconName: 'life-ring',\n icon: [512, 512, [], \"f1cd\", \"M256 8C119.033 8 8 119.033 8 256s111.033 248 248 248 248-111.033 248-248S392.967 8 256 8zm173.696 119.559l-63.399 63.399c-10.987-18.559-26.67-34.252-45.255-45.255l63.399-63.399a218.396 218.396 0 0 1 45.255 45.255zM256 352c-53.019 0-96-42.981-96-96s42.981-96 96-96 96 42.981 96 96-42.981 96-96 96zM127.559 82.304l63.399 63.399c-18.559 10.987-34.252 26.67-45.255 45.255l-63.399-63.399a218.372 218.372 0 0 1 45.255-45.255zM82.304 384.441l63.399-63.399c10.987 18.559 26.67 34.252 45.255 45.255l-63.399 63.399a218.396 218.396 0 0 1-45.255-45.255zm302.137 45.255l-63.399-63.399c18.559-10.987 34.252-26.67 45.255-45.255l63.399 63.399a218.403 218.403 0 0 1-45.255 45.255z\"]\n};\nvar faLightbulb = {\n prefix: 'fas',\n iconName: 'lightbulb',\n icon: [352, 512, [], \"f0eb\", \"M96.06 454.35c.01 6.29 1.87 12.45 5.36 17.69l17.09 25.69a31.99 31.99 0 0 0 26.64 14.28h61.71a31.99 31.99 0 0 0 26.64-14.28l17.09-25.69a31.989 31.989 0 0 0 5.36-17.69l.04-38.35H96.01l.05 38.35zM0 176c0 44.37 16.45 84.85 43.56 115.78 16.52 18.85 42.36 58.23 52.21 91.45.04.26.07.52.11.78h160.24c.04-.26.07-.51.11-.78 9.85-33.22 35.69-72.6 52.21-91.45C335.55 260.85 352 220.37 352 176 352 78.61 272.91-.3 175.45 0 73.44.31 0 82.97 0 176zm176-80c-44.11 0-80 35.89-80 80 0 8.84-7.16 16-16 16s-16-7.16-16-16c0-61.76 50.24-112 112-112 8.84 0 16 7.16 16 16s-7.16 16-16 16z\"]\n};\nvar faLink = {\n prefix: 'fas',\n iconName: 'link',\n icon: [512, 512, [], \"f0c1\", \"M326.612 185.391c59.747 59.809 58.927 155.698.36 214.59-.11.12-.24.25-.36.37l-67.2 67.2c-59.27 59.27-155.699 59.262-214.96 0-59.27-59.26-59.27-155.7 0-214.96l37.106-37.106c9.84-9.84 26.786-3.3 27.294 10.606.648 17.722 3.826 35.527 9.69 52.721 1.986 5.822.567 12.262-3.783 16.612l-13.087 13.087c-28.026 28.026-28.905 73.66-1.155 101.96 28.024 28.579 74.086 28.749 102.325.51l67.2-67.19c28.191-28.191 28.073-73.757 0-101.83-3.701-3.694-7.429-6.564-10.341-8.569a16.037 16.037 0 0 1-6.947-12.606c-.396-10.567 3.348-21.456 11.698-29.806l21.054-21.055c5.521-5.521 14.182-6.199 20.584-1.731a152.482 152.482 0 0 1 20.522 17.197zM467.547 44.449c-59.261-59.262-155.69-59.27-214.96 0l-67.2 67.2c-.12.12-.25.25-.36.37-58.566 58.892-59.387 154.781.36 214.59a152.454 152.454 0 0 0 20.521 17.196c6.402 4.468 15.064 3.789 20.584-1.731l21.054-21.055c8.35-8.35 12.094-19.239 11.698-29.806a16.037 16.037 0 0 0-6.947-12.606c-2.912-2.005-6.64-4.875-10.341-8.569-28.073-28.073-28.191-73.639 0-101.83l67.2-67.19c28.239-28.239 74.3-28.069 102.325.51 27.75 28.3 26.872 73.934-1.155 101.96l-13.087 13.087c-4.35 4.35-5.769 10.79-3.783 16.612 5.864 17.194 9.042 34.999 9.69 52.721.509 13.906 17.454 20.446 27.294 10.606l37.106-37.106c59.271-59.259 59.271-155.699.001-214.959z\"]\n};\nvar faLiraSign = {\n prefix: 'fas',\n iconName: 'lira-sign',\n icon: [384, 512, [], \"f195\", \"M371.994 256h-48.019C317.64 256 312 260.912 312 267.246 312 368 230.179 416 144 416V256.781l134.603-29.912A12 12 0 0 0 288 215.155v-40.976c0-7.677-7.109-13.38-14.603-11.714L144 191.219V160.78l134.603-29.912A12 12 0 0 0 288 119.154V78.179c0-7.677-7.109-13.38-14.603-11.714L144 95.219V44c0-6.627-5.373-12-12-12H76c-6.627 0-12 5.373-12 12v68.997L9.397 125.131A12 12 0 0 0 0 136.845v40.976c0 7.677 7.109 13.38 14.603 11.714L64 178.558v30.439L9.397 221.131A12 12 0 0 0 0 232.845v40.976c0 7.677 7.109 13.38 14.603 11.714L64 274.558V468c0 6.627 5.373 12 12 12h79.583c134.091 0 223.255-77.834 228.408-211.592.261-6.782-5.211-12.408-11.997-12.408z\"]\n};\nvar faList = {\n prefix: 'fas',\n iconName: 'list',\n icon: [512, 512, [], \"f03a\", \"M80 368H16a16 16 0 0 0-16 16v64a16 16 0 0 0 16 16h64a16 16 0 0 0 16-16v-64a16 16 0 0 0-16-16zm0-320H16A16 16 0 0 0 0 64v64a16 16 0 0 0 16 16h64a16 16 0 0 0 16-16V64a16 16 0 0 0-16-16zm0 160H16a16 16 0 0 0-16 16v64a16 16 0 0 0 16 16h64a16 16 0 0 0 16-16v-64a16 16 0 0 0-16-16zm416 176H176a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h320a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm0-320H176a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h320a16 16 0 0 0 16-16V80a16 16 0 0 0-16-16zm0 160H176a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h320a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16z\"]\n};\nvar faListAlt = {\n prefix: 'fas',\n iconName: 'list-alt',\n icon: [512, 512, [], \"f022\", \"M464 480H48c-26.51 0-48-21.49-48-48V80c0-26.51 21.49-48 48-48h416c26.51 0 48 21.49 48 48v352c0 26.51-21.49 48-48 48zM128 120c-22.091 0-40 17.909-40 40s17.909 40 40 40 40-17.909 40-40-17.909-40-40-40zm0 96c-22.091 0-40 17.909-40 40s17.909 40 40 40 40-17.909 40-40-17.909-40-40-40zm0 96c-22.091 0-40 17.909-40 40s17.909 40 40 40 40-17.909 40-40-17.909-40-40-40zm288-136v-32c0-6.627-5.373-12-12-12H204c-6.627 0-12 5.373-12 12v32c0 6.627 5.373 12 12 12h200c6.627 0 12-5.373 12-12zm0 96v-32c0-6.627-5.373-12-12-12H204c-6.627 0-12 5.373-12 12v32c0 6.627 5.373 12 12 12h200c6.627 0 12-5.373 12-12zm0 96v-32c0-6.627-5.373-12-12-12H204c-6.627 0-12 5.373-12 12v32c0 6.627 5.373 12 12 12h200c6.627 0 12-5.373 12-12z\"]\n};\nvar faListOl = {\n prefix: 'fas',\n iconName: 'list-ol',\n icon: [512, 512, [], \"f0cb\", \"M61.77 401l17.5-20.15a19.92 19.92 0 0 0 5.07-14.19v-3.31C84.34 356 80.5 352 73 352H16a8 8 0 0 0-8 8v16a8 8 0 0 0 8 8h22.83a157.41 157.41 0 0 0-11 12.31l-5.61 7c-4 5.07-5.25 10.13-2.8 14.88l1.05 1.93c3 5.76 6.29 7.88 12.25 7.88h4.73c10.33 0 15.94 2.44 15.94 9.09 0 4.72-4.2 8.22-14.36 8.22a41.54 41.54 0 0 1-15.47-3.12c-6.49-3.88-11.74-3.5-15.6 3.12l-5.59 9.31c-3.72 6.13-3.19 11.72 2.63 15.94 7.71 4.69 20.38 9.44 37 9.44 34.16 0 48.5-22.75 48.5-44.12-.03-14.38-9.12-29.76-28.73-34.88zM496 224H176a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h320a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm0-160H176a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h320a16 16 0 0 0 16-16V80a16 16 0 0 0-16-16zm0 320H176a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h320a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zM16 160h64a8 8 0 0 0 8-8v-16a8 8 0 0 0-8-8H64V40a8 8 0 0 0-8-8H32a8 8 0 0 0-7.14 4.42l-8 16A8 8 0 0 0 24 64h8v64H16a8 8 0 0 0-8 8v16a8 8 0 0 0 8 8zm-3.91 160H80a8 8 0 0 0 8-8v-16a8 8 0 0 0-8-8H41.32c3.29-10.29 48.34-18.68 48.34-56.44 0-29.06-25-39.56-44.47-39.56-21.36 0-33.8 10-40.46 18.75-4.37 5.59-3 10.84 2.8 15.37l8.58 6.88c5.61 4.56 11 2.47 16.12-2.44a13.44 13.44 0 0 1 9.46-3.84c3.33 0 9.28 1.56 9.28 8.75C51 248.19 0 257.31 0 304.59v4C0 316 5.08 320 12.09 320z\"]\n};\nvar faListUl = {\n prefix: 'fas',\n iconName: 'list-ul',\n icon: [512, 512, [], \"f0ca\", \"M48 48a48 48 0 1 0 48 48 48 48 0 0 0-48-48zm0 160a48 48 0 1 0 48 48 48 48 0 0 0-48-48zm0 160a48 48 0 1 0 48 48 48 48 0 0 0-48-48zm448 16H176a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h320a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm0-320H176a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h320a16 16 0 0 0 16-16V80a16 16 0 0 0-16-16zm0 160H176a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h320a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16z\"]\n};\nvar faLocationArrow = {\n prefix: 'fas',\n iconName: 'location-arrow',\n icon: [512, 512, [], \"f124\", \"M444.52 3.52L28.74 195.42c-47.97 22.39-31.98 92.75 19.19 92.75h175.91v175.91c0 51.17 70.36 67.17 92.75 19.19l191.9-415.78c15.99-38.39-25.59-79.97-63.97-63.97z\"]\n};\nvar faLock = {\n prefix: 'fas',\n iconName: 'lock',\n icon: [448, 512, [], \"f023\", \"M400 224h-24v-72C376 68.2 307.8 0 224 0S72 68.2 72 152v72H48c-26.5 0-48 21.5-48 48v192c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V272c0-26.5-21.5-48-48-48zm-104 0H152v-72c0-39.7 32.3-72 72-72s72 32.3 72 72v72z\"]\n};\nvar faLockOpen = {\n prefix: 'fas',\n iconName: 'lock-open',\n icon: [576, 512, [], \"f3c1\", \"M423.5 0C339.5.3 272 69.5 272 153.5V224H48c-26.5 0-48 21.5-48 48v192c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V272c0-26.5-21.5-48-48-48h-48v-71.1c0-39.6 31.7-72.5 71.3-72.9 40-.4 72.7 32.1 72.7 72v80c0 13.3 10.7 24 24 24h32c13.3 0 24-10.7 24-24v-80C576 68 507.5-.3 423.5 0z\"]\n};\nvar faLongArrowAltDown = {\n prefix: 'fas',\n iconName: 'long-arrow-alt-down',\n icon: [256, 512, [], \"f309\", \"M168 345.941V44c0-6.627-5.373-12-12-12h-56c-6.627 0-12 5.373-12 12v301.941H41.941c-21.382 0-32.09 25.851-16.971 40.971l86.059 86.059c9.373 9.373 24.569 9.373 33.941 0l86.059-86.059c15.119-15.119 4.411-40.971-16.971-40.971H168z\"]\n};\nvar faLongArrowAltLeft = {\n prefix: 'fas',\n iconName: 'long-arrow-alt-left',\n icon: [448, 512, [], \"f30a\", \"M134.059 296H436c6.627 0 12-5.373 12-12v-56c0-6.627-5.373-12-12-12H134.059v-46.059c0-21.382-25.851-32.09-40.971-16.971L7.029 239.029c-9.373 9.373-9.373 24.569 0 33.941l86.059 86.059c15.119 15.119 40.971 4.411 40.971-16.971V296z\"]\n};\nvar faLongArrowAltRight = {\n prefix: 'fas',\n iconName: 'long-arrow-alt-right',\n icon: [448, 512, [], \"f30b\", \"M313.941 216H12c-6.627 0-12 5.373-12 12v56c0 6.627 5.373 12 12 12h301.941v46.059c0 21.382 25.851 32.09 40.971 16.971l86.059-86.059c9.373-9.373 9.373-24.569 0-33.941l-86.059-86.059c-15.119-15.119-40.971-4.411-40.971 16.971V216z\"]\n};\nvar faLongArrowAltUp = {\n prefix: 'fas',\n iconName: 'long-arrow-alt-up',\n icon: [256, 512, [], \"f30c\", \"M88 166.059V468c0 6.627 5.373 12 12 12h56c6.627 0 12-5.373 12-12V166.059h46.059c21.382 0 32.09-25.851 16.971-40.971l-86.059-86.059c-9.373-9.373-24.569-9.373-33.941 0l-86.059 86.059c-15.119 15.119-4.411 40.971 16.971 40.971H88z\"]\n};\nvar faLowVision = {\n prefix: 'fas',\n iconName: 'low-vision',\n icon: [576, 512, [], \"f2a8\", \"M569.344 231.631C512.96 135.949 407.81 72 288 72c-28.468 0-56.102 3.619-82.451 10.409L152.778 10.24c-7.601-10.858-22.564-13.5-33.423-5.9l-13.114 9.178c-10.86 7.601-13.502 22.566-5.9 33.426l43.131 58.395C89.449 131.73 40.228 174.683 6.682 231.581c-.01.017-.023.033-.034.05-8.765 14.875-8.964 33.528 0 48.739 38.5 65.332 99.742 115.862 172.859 141.349L55.316 244.302A272.194 272.194 0 0 1 83.61 208.39l119.4 170.58h.01l40.63 58.04a330.055 330.055 0 0 0 78.94 1.17l-189.98-271.4a277.628 277.628 0 0 1 38.777-21.563l251.836 356.544c7.601 10.858 22.564 13.499 33.423 5.9l13.114-9.178c10.86-7.601 13.502-22.567 5.9-33.426l-43.12-58.377-.007-.009c57.161-27.978 104.835-72.04 136.81-126.301a47.938 47.938 0 0 0 .001-48.739zM390.026 345.94l-19.066-27.23c24.682-32.567 27.711-76.353 8.8-111.68v.03c0 23.65-19.17 42.82-42.82 42.82-23.828 0-42.82-19.349-42.82-42.82 0-23.65 19.17-42.82 42.82-42.82h.03c-24.75-13.249-53.522-15.643-79.51-7.68l-19.068-27.237C253.758 123.306 270.488 120 288 120c75.162 0 136 60.826 136 136 0 34.504-12.833 65.975-33.974 89.94z\"]\n};\nvar faLuggageCart = {\n prefix: 'fas',\n iconName: 'luggage-cart',\n icon: [640, 512, [], \"f59d\", \"M224 320h32V96h-32c-17.67 0-32 14.33-32 32v160c0 17.67 14.33 32 32 32zm352-32V128c0-17.67-14.33-32-32-32h-32v224h32c17.67 0 32-14.33 32-32zm48 96H128V16c0-8.84-7.16-16-16-16H16C7.16 0 0 7.16 0 16v32c0 8.84 7.16 16 16 16h48v368c0 8.84 7.16 16 16 16h82.94c-1.79 5.03-2.94 10.36-2.94 16 0 26.51 21.49 48 48 48s48-21.49 48-48c0-5.64-1.15-10.97-2.94-16h197.88c-1.79 5.03-2.94 10.36-2.94 16 0 26.51 21.49 48 48 48s48-21.49 48-48c0-5.64-1.15-10.97-2.94-16H624c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16zM480 96V48c0-26.51-21.49-48-48-48h-96c-26.51 0-48 21.49-48 48v272h192V96zm-48 0h-96V48h96v48z\"]\n};\nvar faMagic = {\n prefix: 'fas',\n iconName: 'magic',\n icon: [512, 512, [], \"f0d0\", \"M224 96l16-32 32-16-32-16-16-32-16 32-32 16 32 16 16 32zM80 160l26.66-53.33L160 80l-53.34-26.67L80 0 53.34 53.33 0 80l53.34 26.67L80 160zm352 128l-26.66 53.33L352 368l53.34 26.67L432 448l26.66-53.33L512 368l-53.34-26.67L432 288zm70.62-193.77L417.77 9.38C411.53 3.12 403.34 0 395.15 0c-8.19 0-16.38 3.12-22.63 9.38L9.38 372.52c-12.5 12.5-12.5 32.76 0 45.25l84.85 84.85c6.25 6.25 14.44 9.37 22.62 9.37 8.19 0 16.38-3.12 22.63-9.37l363.14-363.15c12.5-12.48 12.5-32.75 0-45.24zM359.45 203.46l-50.91-50.91 86.6-86.6 50.91 50.91-86.6 86.6z\"]\n};\nvar faMagnet = {\n prefix: 'fas',\n iconName: 'magnet',\n icon: [512, 512, [], \"f076\", \"M164.07 148.1H12a12 12 0 0 1-12-12v-80a36 36 0 0 1 36-36h104a36 36 0 0 1 36 36v80a11.89 11.89 0 0 1-11.93 12zm347.93-12V56a36 36 0 0 0-36-36H372a36 36 0 0 0-36 36v80a12 12 0 0 0 12 12h152a11.89 11.89 0 0 0 12-11.9zm-164 44a12 12 0 0 0-12 12v52c0 128.1-160 127.9-160 0v-52a12 12 0 0 0-12-12H12.1a12 12 0 0 0-12 12.1c.1 21.4.6 40.3 0 53.3 0 150.6 136.17 246.6 256.75 246.6s255-96 255-246.7c-.6-12.8-.2-33 0-53.2a12 12 0 0 0-12-12.1z\"]\n};\nvar faMailBulk = {\n prefix: 'fas',\n iconName: 'mail-bulk',\n icon: [576, 512, [], \"f674\", \"M160 448c-25.6 0-51.2-22.4-64-32-64-44.8-83.2-60.8-96-70.4V480c0 17.67 14.33 32 32 32h256c17.67 0 32-14.33 32-32V345.6c-12.8 9.6-32 25.6-96 70.4-12.8 9.6-38.4 32-64 32zm128-192H32c-17.67 0-32 14.33-32 32v16c25.6 19.2 22.4 19.2 115.2 86.4 9.6 6.4 28.8 25.6 44.8 25.6s35.2-19.2 44.8-22.4c92.8-67.2 89.6-67.2 115.2-86.4V288c0-17.67-14.33-32-32-32zm256-96H224c-17.67 0-32 14.33-32 32v32h96c33.21 0 60.59 25.42 63.71 57.82l.29-.22V416h192c17.67 0 32-14.33 32-32V192c0-17.67-14.33-32-32-32zm-32 128h-64v-64h64v64zm-352-96c0-35.29 28.71-64 64-64h224V32c0-17.67-14.33-32-32-32H96C78.33 0 64 14.33 64 32v192h96v-32z\"]\n};\nvar faMale = {\n prefix: 'fas',\n iconName: 'male',\n icon: [192, 512, [], \"f183\", \"M96 0c35.346 0 64 28.654 64 64s-28.654 64-64 64-64-28.654-64-64S60.654 0 96 0m48 144h-11.36c-22.711 10.443-49.59 10.894-73.28 0H48c-26.51 0-48 21.49-48 48v136c0 13.255 10.745 24 24 24h16v136c0 13.255 10.745 24 24 24h64c13.255 0 24-10.745 24-24V352h16c13.255 0 24-10.745 24-24V192c0-26.51-21.49-48-48-48z\"]\n};\nvar faMap = {\n prefix: 'fas',\n iconName: 'map',\n icon: [576, 512, [], \"f279\", \"M0 117.66v346.32c0 11.32 11.43 19.06 21.94 14.86L160 416V32L20.12 87.95A32.006 32.006 0 0 0 0 117.66zM192 416l192 64V96L192 32v384zM554.06 33.16L416 96v384l139.88-55.95A31.996 31.996 0 0 0 576 394.34V48.02c0-11.32-11.43-19.06-21.94-14.86z\"]\n};\nvar faMapMarked = {\n prefix: 'fas',\n iconName: 'map-marked',\n icon: [576, 512, [], \"f59f\", \"M288 0c-69.59 0-126 56.41-126 126 0 56.26 82.35 158.8 113.9 196.02 6.39 7.54 17.82 7.54 24.2 0C331.65 284.8 414 182.26 414 126 414 56.41 357.59 0 288 0zM20.12 215.95A32.006 32.006 0 0 0 0 245.66v250.32c0 11.32 11.43 19.06 21.94 14.86L160 448V214.92c-8.84-15.98-16.07-31.54-21.25-46.42L20.12 215.95zM288 359.67c-14.07 0-27.38-6.18-36.51-16.96-19.66-23.2-40.57-49.62-59.49-76.72v182l192 64V266c-18.92 27.09-39.82 53.52-59.49 76.72-9.13 10.77-22.44 16.95-36.51 16.95zm266.06-198.51L416 224v288l139.88-55.95A31.996 31.996 0 0 0 576 426.34V176.02c0-11.32-11.43-19.06-21.94-14.86z\"]\n};\nvar faMapMarkedAlt = {\n prefix: 'fas',\n iconName: 'map-marked-alt',\n icon: [576, 512, [], \"f5a0\", \"M288 0c-69.59 0-126 56.41-126 126 0 56.26 82.35 158.8 113.9 196.02 6.39 7.54 17.82 7.54 24.2 0C331.65 284.8 414 182.26 414 126 414 56.41 357.59 0 288 0zm0 168c-23.2 0-42-18.8-42-42s18.8-42 42-42 42 18.8 42 42-18.8 42-42 42zM20.12 215.95A32.006 32.006 0 0 0 0 245.66v250.32c0 11.32 11.43 19.06 21.94 14.86L160 448V214.92c-8.84-15.98-16.07-31.54-21.25-46.42L20.12 215.95zM288 359.67c-14.07 0-27.38-6.18-36.51-16.96-19.66-23.2-40.57-49.62-59.49-76.72v182l192 64V266c-18.92 27.09-39.82 53.52-59.49 76.72-9.13 10.77-22.44 16.95-36.51 16.95zm266.06-198.51L416 224v288l139.88-55.95A31.996 31.996 0 0 0 576 426.34V176.02c0-11.32-11.43-19.06-21.94-14.86z\"]\n};\nvar faMapMarker = {\n prefix: 'fas',\n iconName: 'map-marker',\n icon: [384, 512, [], \"f041\", \"M172.268 501.67C26.97 291.031 0 269.413 0 192 0 85.961 85.961 0 192 0s192 85.961 192 192c0 77.413-26.97 99.031-172.268 309.67-9.535 13.774-29.93 13.773-39.464 0z\"]\n};\nvar faMapMarkerAlt = {\n prefix: 'fas',\n iconName: 'map-marker-alt',\n icon: [384, 512, [], \"f3c5\", \"M172.268 501.67C26.97 291.031 0 269.413 0 192 0 85.961 85.961 0 192 0s192 85.961 192 192c0 77.413-26.97 99.031-172.268 309.67-9.535 13.774-29.93 13.773-39.464 0zM192 272c44.183 0 80-35.817 80-80s-35.817-80-80-80-80 35.817-80 80 35.817 80 80 80z\"]\n};\nvar faMapPin = {\n prefix: 'fas',\n iconName: 'map-pin',\n icon: [288, 512, [], \"f276\", \"M112 316.94v156.69l22.02 33.02c4.75 7.12 15.22 7.12 19.97 0L176 473.63V316.94c-10.39 1.92-21.06 3.06-32 3.06s-21.61-1.14-32-3.06zM144 0C64.47 0 0 64.47 0 144s64.47 144 144 144 144-64.47 144-144S223.53 0 144 0zm0 76c-37.5 0-68 30.5-68 68 0 6.62-5.38 12-12 12s-12-5.38-12-12c0-50.73 41.28-92 92-92 6.62 0 12 5.38 12 12s-5.38 12-12 12z\"]\n};\nvar faMapSigns = {\n prefix: 'fas',\n iconName: 'map-signs',\n icon: [512, 512, [], \"f277\", \"M507.31 84.69L464 41.37c-6-6-14.14-9.37-22.63-9.37H288V16c0-8.84-7.16-16-16-16h-32c-8.84 0-16 7.16-16 16v16H56c-13.25 0-24 10.75-24 24v80c0 13.25 10.75 24 24 24h385.37c8.49 0 16.62-3.37 22.63-9.37l43.31-43.31c6.25-6.26 6.25-16.38 0-22.63zM224 496c0 8.84 7.16 16 16 16h32c8.84 0 16-7.16 16-16V384h-64v112zm232-272H288v-32h-64v32H70.63c-8.49 0-16.62 3.37-22.63 9.37L4.69 276.69c-6.25 6.25-6.25 16.38 0 22.63L48 342.63c6 6 14.14 9.37 22.63 9.37H456c13.25 0 24-10.75 24-24v-80c0-13.25-10.75-24-24-24z\"]\n};\nvar faMarker = {\n prefix: 'fas',\n iconName: 'marker',\n icon: [512, 512, [], \"f5a1\", \"M93.95 290.03A327.038 327.038 0 0 0 .17 485.11l-.03.23c-1.7 15.28 11.21 28.2 26.49 26.51a327.02 327.02 0 0 0 195.34-93.8l75.4-75.4-128.02-128.02-75.4 75.4zM485.49 26.51c-35.35-35.35-92.67-35.35-128.02 0l-21.76 21.76-36.56-36.55c-15.62-15.62-40.95-15.62-56.56 0L138.47 115.84c-6.25 6.25-6.25 16.38 0 22.63l22.62 22.62c6.25 6.25 16.38 6.25 22.63 0l87.15-87.15 19.59 19.59L191.98 192 320 320.02l165.49-165.49c35.35-35.35 35.35-92.66 0-128.02z\"]\n};\nvar faMars = {\n prefix: 'fas',\n iconName: 'mars',\n icon: [384, 512, [], \"f222\", \"M372 64h-79c-10.7 0-16 12.9-8.5 20.5l16.9 16.9-80.7 80.7c-22.2-14-48.5-22.1-76.7-22.1C64.5 160 0 224.5 0 304s64.5 144 144 144 144-64.5 144-144c0-28.2-8.1-54.5-22.1-76.7l80.7-80.7 16.9 16.9c7.6 7.6 20.5 2.2 20.5-8.5V76c0-6.6-5.4-12-12-12zM144 384c-44.1 0-80-35.9-80-80s35.9-80 80-80 80 35.9 80 80-35.9 80-80 80z\"]\n};\nvar faMarsDouble = {\n prefix: 'fas',\n iconName: 'mars-double',\n icon: [512, 512, [], \"f227\", \"M340 0h-79c-10.7 0-16 12.9-8.5 20.5l16.9 16.9-48.7 48.7C198.5 72.1 172.2 64 144 64 64.5 64 0 128.5 0 208s64.5 144 144 144 144-64.5 144-144c0-28.2-8.1-54.5-22.1-76.7l48.7-48.7 16.9 16.9c2.4 2.4 5.5 3.5 8.4 3.5 6.2 0 12.1-4.8 12.1-12V12c0-6.6-5.4-12-12-12zM144 288c-44.1 0-80-35.9-80-80s35.9-80 80-80 80 35.9 80 80-35.9 80-80 80zm356-128.1h-79c-10.7 0-16 12.9-8.5 20.5l16.9 16.9-48.7 48.7c-18.2-11.4-39-18.9-61.5-21.3-2.1 21.8-8.2 43.3-18.4 63.3 1.1 0 2.2-.1 3.2-.1 44.1 0 80 35.9 80 80s-35.9 80-80 80-80-35.9-80-80c0-1.1 0-2.2.1-3.2-20 10.2-41.5 16.4-63.3 18.4C168.4 455.6 229.6 512 304 512c79.5 0 144-64.5 144-144 0-28.2-8.1-54.5-22.1-76.7l48.7-48.7 16.9 16.9c2.4 2.4 5.4 3.5 8.4 3.5 6.2 0 12.1-4.8 12.1-12v-79c0-6.7-5.4-12.1-12-12.1z\"]\n};\nvar faMarsStroke = {\n prefix: 'fas',\n iconName: 'mars-stroke',\n icon: [384, 512, [], \"f229\", \"M372 64h-79c-10.7 0-16 12.9-8.5 20.5l16.9 16.9-17.5 17.5-14.1-14.1c-4.7-4.7-12.3-4.7-17 0L224.5 133c-4.7 4.7-4.7 12.3 0 17l14.1 14.1-18 18c-22.2-14-48.5-22.1-76.7-22.1C64.5 160 0 224.5 0 304s64.5 144 144 144 144-64.5 144-144c0-28.2-8.1-54.5-22.1-76.7l18-18 14.1 14.1c4.7 4.7 12.3 4.7 17 0l28.3-28.3c4.7-4.7 4.7-12.3 0-17L329.2 164l17.5-17.5 16.9 16.9c7.6 7.6 20.5 2.2 20.5-8.5V76c-.1-6.6-5.5-12-12.1-12zM144 384c-44.1 0-80-35.9-80-80s35.9-80 80-80 80 35.9 80 80-35.9 80-80 80z\"]\n};\nvar faMarsStrokeH = {\n prefix: 'fas',\n iconName: 'mars-stroke-h',\n icon: [480, 512, [], \"f22b\", \"M476.2 247.5l-55.9-55.9c-7.6-7.6-20.5-2.2-20.5 8.5V224H376v-20c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v20h-27.6c-5.8-25.6-18.7-49.9-38.6-69.8C189.6 98 98.4 98 42.2 154.2c-56.2 56.2-56.2 147.4 0 203.6 56.2 56.2 147.4 56.2 203.6 0 19.9-19.9 32.8-44.2 38.6-69.8H312v20c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12v-20h23.9v23.9c0 10.7 12.9 16 20.5 8.5l55.9-55.9c4.6-4.7 4.6-12.3-.1-17zm-275.6 65.1c-31.2 31.2-81.9 31.2-113.1 0-31.2-31.2-31.2-81.9 0-113.1 31.2-31.2 81.9-31.2 113.1 0 31.2 31.1 31.2 81.9 0 113.1z\"]\n};\nvar faMarsStrokeV = {\n prefix: 'fas',\n iconName: 'mars-stroke-v',\n icon: [288, 512, [], \"f22a\", \"M245.8 234.2c-19.9-19.9-44.2-32.8-69.8-38.6v-25.4h20c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-20V81.4h23.9c10.7 0 16-12.9 8.5-20.5L152.5 5.1c-4.7-4.7-12.3-4.7-17 0L79.6 61c-7.6 7.6-2.2 20.5 8.5 20.5H112v24.7H92c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h20v25.4c-25.6 5.8-49.9 18.7-69.8 38.6-56.2 56.2-56.2 147.4 0 203.6 56.2 56.2 147.4 56.2 203.6 0 56.3-56.2 56.3-147.4 0-203.6zm-45.2 158.4c-31.2 31.2-81.9 31.2-113.1 0-31.2-31.2-31.2-81.9 0-113.1 31.2-31.2 81.9-31.2 113.1 0 31.2 31.1 31.2 81.9 0 113.1z\"]\n};\nvar faMask = {\n prefix: 'fas',\n iconName: 'mask',\n icon: [640, 512, [], \"f6fa\", \"M320.67 64c-442.6 0-357.57 384-158.46 384 39.9 0 77.47-20.69 101.42-55.86l25.73-37.79c15.66-22.99 46.97-22.99 62.63 0l25.73 37.79C401.66 427.31 439.23 448 479.13 448c189.86 0 290.63-384-158.46-384zM184 308.36c-41.06 0-67.76-25.66-80.08-41.05-5.23-6.53-5.23-16.09 0-22.63 12.32-15.4 39.01-41.05 80.08-41.05s67.76 25.66 80.08 41.05c5.23 6.53 5.23 16.09 0 22.63-12.32 15.4-39.02 41.05-80.08 41.05zm272 0c-41.06 0-67.76-25.66-80.08-41.05-5.23-6.53-5.23-16.09 0-22.63 12.32-15.4 39.01-41.05 80.08-41.05s67.76 25.66 80.08 41.05c5.23 6.53 5.23 16.09 0 22.63-12.32 15.4-39.02 41.05-80.08 41.05z\"]\n};\nvar faMedal = {\n prefix: 'fas',\n iconName: 'medal',\n icon: [512, 512, [], \"f5a2\", \"M223.75 130.75L154.62 15.54A31.997 31.997 0 0 0 127.18 0H16.03C3.08 0-4.5 14.57 2.92 25.18l111.27 158.96c29.72-27.77 67.52-46.83 109.56-53.39zM495.97 0H384.82c-11.24 0-21.66 5.9-27.44 15.54l-69.13 115.21c42.04 6.56 79.84 25.62 109.56 53.38L509.08 25.18C516.5 14.57 508.92 0 495.97 0zM256 160c-97.2 0-176 78.8-176 176s78.8 176 176 176 176-78.8 176-176-78.8-176-176-176zm92.52 157.26l-37.93 36.96 8.97 52.22c1.6 9.36-8.26 16.51-16.65 12.09L256 393.88l-46.9 24.65c-8.4 4.45-18.25-2.74-16.65-12.09l8.97-52.22-37.93-36.96c-6.82-6.64-3.05-18.23 6.35-19.59l52.43-7.64 23.43-47.52c2.11-4.28 6.19-6.39 10.28-6.39 4.11 0 8.22 2.14 10.33 6.39l23.43 47.52 52.43 7.64c9.4 1.36 13.17 12.95 6.35 19.59z\"]\n};\nvar faMedkit = {\n prefix: 'fas',\n iconName: 'medkit',\n icon: [512, 512, [], \"f0fa\", \"M96 480h320V128h-32V80c0-26.51-21.49-48-48-48H176c-26.51 0-48 21.49-48 48v48H96v352zm96-384h128v32H192V96zm320 80v256c0 26.51-21.49 48-48 48h-16V128h16c26.51 0 48 21.49 48 48zM64 480H48c-26.51 0-48-21.49-48-48V176c0-26.51 21.49-48 48-48h16v352zm288-208v32c0 8.837-7.163 16-16 16h-48v48c0 8.837-7.163 16-16 16h-32c-8.837 0-16-7.163-16-16v-48h-48c-8.837 0-16-7.163-16-16v-32c0-8.837 7.163-16 16-16h48v-48c0-8.837 7.163-16 16-16h32c8.837 0 16 7.163 16 16v48h48c8.837 0 16 7.163 16 16z\"]\n};\nvar faMeh = {\n prefix: 'fas',\n iconName: 'meh',\n icon: [496, 512, [], \"f11a\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm-80 168c17.7 0 32 14.3 32 32s-14.3 32-32 32-32-14.3-32-32 14.3-32 32-32zm176 192H152c-21.2 0-21.2-32 0-32h192c21.2 0 21.2 32 0 32zm-16-128c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32z\"]\n};\nvar faMehBlank = {\n prefix: 'fas',\n iconName: 'meh-blank',\n icon: [496, 512, [], \"f5a4\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm-80 232c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32zm160 0c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32z\"]\n};\nvar faMehRollingEyes = {\n prefix: 'fas',\n iconName: 'meh-rolling-eyes',\n icon: [496, 512, [], \"f5a5\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zM88 224c0-24.3 13.7-45.2 33.6-56-.7 2.6-1.6 5.2-1.6 8 0 17.7 14.3 32 32 32s32-14.3 32-32c0-2.8-.9-5.4-1.6-8 19.9 10.8 33.6 31.7 33.6 56 0 35.3-28.7 64-64 64s-64-28.7-64-64zm224 176H184c-21.2 0-21.2-32 0-32h128c21.2 0 21.2 32 0 32zm32-112c-35.3 0-64-28.7-64-64 0-24.3 13.7-45.2 33.6-56-.7 2.6-1.6 5.2-1.6 8 0 17.7 14.3 32 32 32s32-14.3 32-32c0-2.8-.9-5.4-1.6-8 19.9 10.8 33.6 31.7 33.6 56 0 35.3-28.7 64-64 64z\"]\n};\nvar faMemory = {\n prefix: 'fas',\n iconName: 'memory',\n icon: [640, 512, [], \"f538\", \"M640 130.94V96c0-17.67-14.33-32-32-32H32C14.33 64 0 78.33 0 96v34.94c18.6 6.61 32 24.19 32 45.06s-13.4 38.45-32 45.06V320h640v-98.94c-18.6-6.61-32-24.19-32-45.06s13.4-38.45 32-45.06zM224 256h-64V128h64v128zm128 0h-64V128h64v128zm128 0h-64V128h64v128zM0 448h64v-26.67c0-8.84 7.16-16 16-16s16 7.16 16 16V448h128v-26.67c0-8.84 7.16-16 16-16s16 7.16 16 16V448h128v-26.67c0-8.84 7.16-16 16-16s16 7.16 16 16V448h128v-26.67c0-8.84 7.16-16 16-16s16 7.16 16 16V448h64v-96H0v96z\"]\n};\nvar faMenorah = {\n prefix: 'fas',\n iconName: 'menorah',\n icon: [640, 512, [], \"f676\", \"M144 128h-32c-8.84 0-16 7.16-16 16v144h64V144c0-8.84-7.16-16-16-16zm96 0h-32c-8.84 0-16 7.16-16 16v144h64V144c0-8.84-7.16-16-16-16zm192 0h-32c-8.84 0-16 7.16-16 16v144h64V144c0-8.84-7.16-16-16-16zm96 0h-32c-8.84 0-16 7.16-16 16v144h64V144c0-8.84-7.16-16-16-16zm80-32c17.67 0 32-14.33 32-32S608 0 608 0s-32 46.33-32 64 14.33 32 32 32zm-96 0c17.67 0 32-14.33 32-32S512 0 512 0s-32 46.33-32 64 14.33 32 32 32zm-96 0c17.67 0 32-14.33 32-32S416 0 416 0s-32 46.33-32 64 14.33 32 32 32zm-96 0c17.67 0 32-14.33 32-32S320 0 320 0s-32 46.33-32 64 14.33 32 32 32zm-96 0c17.67 0 32-14.33 32-32S224 0 224 0s-32 46.33-32 64 14.33 32 32 32zm-96 0c17.67 0 32-14.33 32-32S128 0 128 0 96 46.33 96 64s14.33 32 32 32zm-96 0c17.67 0 32-14.33 32-32S32 0 32 0 0 46.33 0 64s14.33 32 32 32zm544 192c0 17.67-14.33 32-32 32H352V144c0-8.84-7.16-16-16-16h-32c-8.84 0-16 7.16-16 16v176H96c-17.67 0-32-14.33-32-32V144c0-8.84-7.16-16-16-16H16c-8.84 0-16 7.16-16 16v144c0 53.02 42.98 96 96 96h192v64H112c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h416c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16H352v-64h192c53.02 0 96-42.98 96-96V144c0-8.84-7.16-16-16-16h-32c-8.84 0-16 7.16-16 16v144z\"]\n};\nvar faMercury = {\n prefix: 'fas',\n iconName: 'mercury',\n icon: [288, 512, [], \"f223\", \"M288 208c0-44.2-19.9-83.7-51.2-110.1 2.5-1.8 4.9-3.8 7.2-5.8 24.7-21.2 39.8-48.8 43.2-78.8.9-7.1-4.7-13.3-11.9-13.3h-40.5C229 0 224.1 4.1 223 9.8c-2.4 12.5-9.6 24.3-20.7 33.8C187 56.8 166.3 64 144 64s-43-7.2-58.4-20.4C74.5 34.1 67.4 22.3 64.9 9.8 63.8 4.1 58.9 0 53.2 0H12.7C5.5 0-.1 6.2.8 13.3 4.2 43.4 19.2 71 44 92.2c2.3 2 4.7 3.9 7.2 5.8C19.9 124.3 0 163.8 0 208c0 68.5 47.9 125.9 112 140.4V400H76c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h36v36c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12v-36h36c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-36v-51.6c64.1-14.5 112-71.9 112-140.4zm-224 0c0-44.1 35.9-80 80-80s80 35.9 80 80-35.9 80-80 80-80-35.9-80-80z\"]\n};\nvar faMeteor = {\n prefix: 'fas',\n iconName: 'meteor',\n icon: [512, 512, [], \"f753\", \"M491.2.7C452.5 12.3 379.4 35 303.5 62c-2.1-7-4-13.5-5.6-18.6-3-9.7-13.9-14.2-22.9-9.5C232.6 56 122.2 116.5 60.6 176.4c-1.1 1-2.5 2-3.5 3C19 217.4 0 267.3 0 317.2 0 367 19 416.9 57 455c38 38 87.9 57.1 137.8 57 49.9 0 99.8-19 137.9-57.1 1-1 2-2.4 3-3.5 59.8-61.6 120.4-172.1 142.5-214.4 4.7-9 .2-19.9-9.5-22.9-5.2-1.6-11.6-3.5-18.6-5.6 27-76 49.7-149 61.3-187.7C515 8.4 503.6-3 491.2.7zM192 448c-70.7 0-128-57.3-128-128s57.3-128 128-128 128 57.3 128 128-57.3 128-128 128zm-32-192c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32zm48 96c-8.8 0-16 7.2-16 16s7.2 16 16 16 16-7.2 16-16-7.2-16-16-16z\"]\n};\nvar faMicrochip = {\n prefix: 'fas',\n iconName: 'microchip',\n icon: [512, 512, [], \"f2db\", \"M416 48v416c0 26.51-21.49 48-48 48H144c-26.51 0-48-21.49-48-48V48c0-26.51 21.49-48 48-48h224c26.51 0 48 21.49 48 48zm96 58v12a6 6 0 0 1-6 6h-18v6a6 6 0 0 1-6 6h-42V88h42a6 6 0 0 1 6 6v6h18a6 6 0 0 1 6 6zm0 96v12a6 6 0 0 1-6 6h-18v6a6 6 0 0 1-6 6h-42v-48h42a6 6 0 0 1 6 6v6h18a6 6 0 0 1 6 6zm0 96v12a6 6 0 0 1-6 6h-18v6a6 6 0 0 1-6 6h-42v-48h42a6 6 0 0 1 6 6v6h18a6 6 0 0 1 6 6zm0 96v12a6 6 0 0 1-6 6h-18v6a6 6 0 0 1-6 6h-42v-48h42a6 6 0 0 1 6 6v6h18a6 6 0 0 1 6 6zM30 376h42v48H30a6 6 0 0 1-6-6v-6H6a6 6 0 0 1-6-6v-12a6 6 0 0 1 6-6h18v-6a6 6 0 0 1 6-6zm0-96h42v48H30a6 6 0 0 1-6-6v-6H6a6 6 0 0 1-6-6v-12a6 6 0 0 1 6-6h18v-6a6 6 0 0 1 6-6zm0-96h42v48H30a6 6 0 0 1-6-6v-6H6a6 6 0 0 1-6-6v-12a6 6 0 0 1 6-6h18v-6a6 6 0 0 1 6-6zm0-96h42v48H30a6 6 0 0 1-6-6v-6H6a6 6 0 0 1-6-6v-12a6 6 0 0 1 6-6h18v-6a6 6 0 0 1 6-6z\"]\n};\nvar faMicrophone = {\n prefix: 'fas',\n iconName: 'microphone',\n icon: [352, 512, [], \"f130\", \"M176 352c53.02 0 96-42.98 96-96V96c0-53.02-42.98-96-96-96S80 42.98 80 96v160c0 53.02 42.98 96 96 96zm160-160h-16c-8.84 0-16 7.16-16 16v48c0 74.8-64.49 134.82-140.79 127.38C96.71 376.89 48 317.11 48 250.3V208c0-8.84-7.16-16-16-16H16c-8.84 0-16 7.16-16 16v40.16c0 89.64 63.97 169.55 152 181.69V464H96c-8.84 0-16 7.16-16 16v16c0 8.84 7.16 16 16 16h160c8.84 0 16-7.16 16-16v-16c0-8.84-7.16-16-16-16h-56v-33.77C285.71 418.47 352 344.9 352 256v-48c0-8.84-7.16-16-16-16z\"]\n};\nvar faMicrophoneAlt = {\n prefix: 'fas',\n iconName: 'microphone-alt',\n icon: [352, 512, [], \"f3c9\", \"M336 192h-16c-8.84 0-16 7.16-16 16v48c0 74.8-64.49 134.82-140.79 127.38C96.71 376.89 48 317.11 48 250.3V208c0-8.84-7.16-16-16-16H16c-8.84 0-16 7.16-16 16v40.16c0 89.64 63.97 169.55 152 181.69V464H96c-8.84 0-16 7.16-16 16v16c0 8.84 7.16 16 16 16h160c8.84 0 16-7.16 16-16v-16c0-8.84-7.16-16-16-16h-56v-33.77C285.71 418.47 352 344.9 352 256v-48c0-8.84-7.16-16-16-16zM176 352c53.02 0 96-42.98 96-96h-85.33c-5.89 0-10.67-3.58-10.67-8v-16c0-4.42 4.78-8 10.67-8H272v-32h-85.33c-5.89 0-10.67-3.58-10.67-8v-16c0-4.42 4.78-8 10.67-8H272v-32h-85.33c-5.89 0-10.67-3.58-10.67-8v-16c0-4.42 4.78-8 10.67-8H272c0-53.02-42.98-96-96-96S80 42.98 80 96v160c0 53.02 42.98 96 96 96z\"]\n};\nvar faMicrophoneAltSlash = {\n prefix: 'fas',\n iconName: 'microphone-alt-slash',\n icon: [640, 512, [], \"f539\", \"M633.82 458.1L476.26 336.33C488.74 312.21 496 284.98 496 256v-48c0-8.84-7.16-16-16-16h-16c-8.84 0-16 7.16-16 16v48c0 17.92-3.96 34.8-10.72 50.2l-26.55-20.52c3.1-9.4 5.28-19.22 5.28-29.67h-43.67l-41.4-32H416v-32h-85.33c-5.89 0-10.67-3.58-10.67-8v-16c0-4.42 4.78-8 10.67-8H416v-32h-85.33c-5.89 0-10.67-3.58-10.67-8v-16c0-4.42 4.78-8 10.67-8H416c0-53.02-42.98-96-96-96s-96 42.98-96 96v45.36L45.47 3.37C38.49-2.05 28.43-.8 23.01 6.18L3.37 31.45C-2.05 38.42-.8 48.47 6.18 53.9l588.36 454.73c6.98 5.43 17.03 4.17 22.46-2.81l19.64-25.27c5.41-6.97 4.16-17.02-2.82-22.45zM400 464h-56v-33.78c11.71-1.62 23.1-4.28 33.96-8.08l-50.4-38.96c-6.71.4-13.41.87-20.35.2-55.85-5.45-98.74-48.63-111.18-101.85L144 241.31v6.85c0 89.64 63.97 169.55 152 181.69V464h-56c-8.84 0-16 7.16-16 16v16c0 8.84 7.16 16 16 16h160c8.84 0 16-7.16 16-16v-16c0-8.84-7.16-16-16-16z\"]\n};\nvar faMicrophoneSlash = {\n prefix: 'fas',\n iconName: 'microphone-slash',\n icon: [640, 512, [], \"f131\", \"M633.82 458.1l-157.8-121.96C488.61 312.13 496 285.01 496 256v-48c0-8.84-7.16-16-16-16h-16c-8.84 0-16 7.16-16 16v48c0 17.92-3.96 34.8-10.72 50.2l-26.55-20.52c3.1-9.4 5.28-19.22 5.28-29.67V96c0-53.02-42.98-96-96-96s-96 42.98-96 96v45.36L45.47 3.37C38.49-2.05 28.43-.8 23.01 6.18L3.37 31.45C-2.05 38.42-.8 48.47 6.18 53.9l588.36 454.73c6.98 5.43 17.03 4.17 22.46-2.81l19.64-25.27c5.41-6.97 4.16-17.02-2.82-22.45zM400 464h-56v-33.77c11.66-1.6 22.85-4.54 33.67-8.31l-50.11-38.73c-6.71.4-13.41.87-20.35.2-55.85-5.45-98.74-48.63-111.18-101.85L144 241.31v6.85c0 89.64 63.97 169.55 152 181.69V464h-56c-8.84 0-16 7.16-16 16v16c0 8.84 7.16 16 16 16h160c8.84 0 16-7.16 16-16v-16c0-8.84-7.16-16-16-16z\"]\n};\nvar faMicroscope = {\n prefix: 'fas',\n iconName: 'microscope',\n icon: [512, 512, [], \"f610\", \"M160 320h12v16c0 8.84 7.16 16 16 16h40c8.84 0 16-7.16 16-16v-16h12c17.67 0 32-14.33 32-32V64c0-17.67-14.33-32-32-32V16c0-8.84-7.16-16-16-16h-64c-8.84 0-16 7.16-16 16v16c-17.67 0-32 14.33-32 32v224c0 17.67 14.33 32 32 32zm304 128h-1.29C493.24 413.99 512 369.2 512 320c0-105.88-86.12-192-192-192v64c70.58 0 128 57.42 128 128s-57.42 128-128 128H48c-26.51 0-48 21.49-48 48 0 8.84 7.16 16 16 16h480c8.84 0 16-7.16 16-16 0-26.51-21.49-48-48-48zm-360-32h208c4.42 0 8-3.58 8-8v-16c0-4.42-3.58-8-8-8H104c-4.42 0-8 3.58-8 8v16c0 4.42 3.58 8 8 8z\"]\n};\nvar faMinus = {\n prefix: 'fas',\n iconName: 'minus',\n icon: [448, 512, [], \"f068\", \"M416 208H32c-17.67 0-32 14.33-32 32v32c0 17.67 14.33 32 32 32h384c17.67 0 32-14.33 32-32v-32c0-17.67-14.33-32-32-32z\"]\n};\nvar faMinusCircle = {\n prefix: 'fas',\n iconName: 'minus-circle',\n icon: [512, 512, [], \"f056\", \"M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zM124 296c-6.6 0-12-5.4-12-12v-56c0-6.6 5.4-12 12-12h264c6.6 0 12 5.4 12 12v56c0 6.6-5.4 12-12 12H124z\"]\n};\nvar faMinusSquare = {\n prefix: 'fas',\n iconName: 'minus-square',\n icon: [448, 512, [], \"f146\", \"M400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zM92 296c-6.6 0-12-5.4-12-12v-56c0-6.6 5.4-12 12-12h264c6.6 0 12 5.4 12 12v56c0 6.6-5.4 12-12 12H92z\"]\n};\nvar faMitten = {\n prefix: 'fas',\n iconName: 'mitten',\n icon: [448, 512, [], \"f7b5\", \"M368 416H48c-8.8 0-16 7.2-16 16v64c0 8.8 7.2 16 16 16h320c8.8 0 16-7.2 16-16v-64c0-8.8-7.2-16-16-16zm57-209.1c-27.2-22.6-67.5-19-90.1 8.2l-20.9 25-29.6-128.4c-18-77.5-95.4-125.9-172.8-108C34.2 21.6-14.2 98.9 3.7 176.4L51.6 384h309l72.5-87c22.7-27.2 19-67.5-8.1-90.1z\"]\n};\nvar faMobile = {\n prefix: 'fas',\n iconName: 'mobile',\n icon: [320, 512, [], \"f10b\", \"M272 0H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h224c26.5 0 48-21.5 48-48V48c0-26.5-21.5-48-48-48zM160 480c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32z\"]\n};\nvar faMobileAlt = {\n prefix: 'fas',\n iconName: 'mobile-alt',\n icon: [320, 512, [], \"f3cd\", \"M272 0H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h224c26.5 0 48-21.5 48-48V48c0-26.5-21.5-48-48-48zM160 480c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32zm112-108c0 6.6-5.4 12-12 12H60c-6.6 0-12-5.4-12-12V60c0-6.6 5.4-12 12-12h200c6.6 0 12 5.4 12 12v312z\"]\n};\nvar faMoneyBill = {\n prefix: 'fas',\n iconName: 'money-bill',\n icon: [640, 512, [], \"f0d6\", \"M608 64H32C14.33 64 0 78.33 0 96v320c0 17.67 14.33 32 32 32h576c17.67 0 32-14.33 32-32V96c0-17.67-14.33-32-32-32zM48 400v-64c35.35 0 64 28.65 64 64H48zm0-224v-64h64c0 35.35-28.65 64-64 64zm272 176c-44.19 0-80-42.99-80-96 0-53.02 35.82-96 80-96s80 42.98 80 96c0 53.03-35.83 96-80 96zm272 48h-64c0-35.35 28.65-64 64-64v64zm0-224c-35.35 0-64-28.65-64-64h64v64z\"]\n};\nvar faMoneyBillAlt = {\n prefix: 'fas',\n iconName: 'money-bill-alt',\n icon: [640, 512, [], \"f3d1\", \"M352 288h-16v-88c0-4.42-3.58-8-8-8h-13.58c-4.74 0-9.37 1.4-13.31 4.03l-15.33 10.22a7.994 7.994 0 0 0-2.22 11.09l8.88 13.31a7.994 7.994 0 0 0 11.09 2.22l.47-.31V288h-16c-4.42 0-8 3.58-8 8v16c0 4.42 3.58 8 8 8h64c4.42 0 8-3.58 8-8v-16c0-4.42-3.58-8-8-8zM608 64H32C14.33 64 0 78.33 0 96v320c0 17.67 14.33 32 32 32h576c17.67 0 32-14.33 32-32V96c0-17.67-14.33-32-32-32zM48 400v-64c35.35 0 64 28.65 64 64H48zm0-224v-64h64c0 35.35-28.65 64-64 64zm272 192c-53.02 0-96-50.15-96-112 0-61.86 42.98-112 96-112s96 50.14 96 112c0 61.87-43 112-96 112zm272 32h-64c0-35.35 28.65-64 64-64v64zm0-224c-35.35 0-64-28.65-64-64h64v64z\"]\n};\nvar faMoneyBillWave = {\n prefix: 'fas',\n iconName: 'money-bill-wave',\n icon: [640, 512, [], \"f53a\", \"M621.16 54.46C582.37 38.19 543.55 32 504.75 32c-123.17-.01-246.33 62.34-369.5 62.34-30.89 0-61.76-3.92-92.65-13.72-3.47-1.1-6.95-1.62-10.35-1.62C15.04 79 0 92.32 0 110.81v317.26c0 12.63 7.23 24.6 18.84 29.46C57.63 473.81 96.45 480 135.25 480c123.17 0 246.34-62.35 369.51-62.35 30.89 0 61.76 3.92 92.65 13.72 3.47 1.1 6.95 1.62 10.35 1.62 17.21 0 32.25-13.32 32.25-31.81V83.93c-.01-12.64-7.24-24.6-18.85-29.47zM48 132.22c20.12 5.04 41.12 7.57 62.72 8.93C104.84 170.54 79 192.69 48 192.69v-60.47zm0 285v-47.78c34.37 0 62.18 27.27 63.71 61.4-22.53-1.81-43.59-6.31-63.71-13.62zM320 352c-44.19 0-80-42.99-80-96 0-53.02 35.82-96 80-96s80 42.98 80 96c0 53.03-35.83 96-80 96zm272 27.78c-17.52-4.39-35.71-6.85-54.32-8.44 5.87-26.08 27.5-45.88 54.32-49.28v57.72zm0-236.11c-30.89-3.91-54.86-29.7-55.81-61.55 19.54 2.17 38.09 6.23 55.81 12.66v48.89z\"]\n};\nvar faMoneyBillWaveAlt = {\n prefix: 'fas',\n iconName: 'money-bill-wave-alt',\n icon: [640, 512, [], \"f53b\", \"M621.16 54.46C582.37 38.19 543.55 32 504.75 32c-123.17-.01-246.33 62.34-369.5 62.34-30.89 0-61.76-3.92-92.65-13.72-3.47-1.1-6.95-1.62-10.35-1.62C15.04 79 0 92.32 0 110.81v317.26c0 12.63 7.23 24.6 18.84 29.46C57.63 473.81 96.45 480 135.25 480c123.17 0 246.34-62.35 369.51-62.35 30.89 0 61.76 3.92 92.65 13.72 3.47 1.1 6.95 1.62 10.35 1.62 17.21 0 32.25-13.32 32.25-31.81V83.93c-.01-12.64-7.24-24.6-18.85-29.47zM320 352c-44.19 0-80-42.99-80-96 0-53.02 35.82-96 80-96s80 42.98 80 96c0 53.03-35.83 96-80 96z\"]\n};\nvar faMoneyCheck = {\n prefix: 'fas',\n iconName: 'money-check',\n icon: [640, 512, [], \"f53c\", \"M0 448c0 17.67 14.33 32 32 32h576c17.67 0 32-14.33 32-32V128H0v320zm448-208c0-8.84 7.16-16 16-16h96c8.84 0 16 7.16 16 16v32c0 8.84-7.16 16-16 16h-96c-8.84 0-16-7.16-16-16v-32zm0 120c0-4.42 3.58-8 8-8h112c4.42 0 8 3.58 8 8v16c0 4.42-3.58 8-8 8H456c-4.42 0-8-3.58-8-8v-16zM64 264c0-4.42 3.58-8 8-8h304c4.42 0 8 3.58 8 8v16c0 4.42-3.58 8-8 8H72c-4.42 0-8-3.58-8-8v-16zm0 96c0-4.42 3.58-8 8-8h176c4.42 0 8 3.58 8 8v16c0 4.42-3.58 8-8 8H72c-4.42 0-8-3.58-8-8v-16zM624 32H16C7.16 32 0 39.16 0 48v48h640V48c0-8.84-7.16-16-16-16z\"]\n};\nvar faMoneyCheckAlt = {\n prefix: 'fas',\n iconName: 'money-check-alt',\n icon: [640, 512, [], \"f53d\", \"M608 32H32C14.33 32 0 46.33 0 64v384c0 17.67 14.33 32 32 32h576c17.67 0 32-14.33 32-32V64c0-17.67-14.33-32-32-32zM176 327.88V344c0 4.42-3.58 8-8 8h-16c-4.42 0-8-3.58-8-8v-16.29c-11.29-.58-22.27-4.52-31.37-11.35-3.9-2.93-4.1-8.77-.57-12.14l11.75-11.21c2.77-2.64 6.89-2.76 10.13-.73 3.87 2.42 8.26 3.72 12.82 3.72h28.11c6.5 0 11.8-5.92 11.8-13.19 0-5.95-3.61-11.19-8.77-12.73l-45-13.5c-18.59-5.58-31.58-23.42-31.58-43.39 0-24.52 19.05-44.44 42.67-45.07V152c0-4.42 3.58-8 8-8h16c4.42 0 8 3.58 8 8v16.29c11.29.58 22.27 4.51 31.37 11.35 3.9 2.93 4.1 8.77.57 12.14l-11.75 11.21c-2.77 2.64-6.89 2.76-10.13.73-3.87-2.43-8.26-3.72-12.82-3.72h-28.11c-6.5 0-11.8 5.92-11.8 13.19 0 5.95 3.61 11.19 8.77 12.73l45 13.5c18.59 5.58 31.58 23.42 31.58 43.39 0 24.53-19.05 44.44-42.67 45.07zM416 312c0 4.42-3.58 8-8 8H296c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h112c4.42 0 8 3.58 8 8v16zm160 0c0 4.42-3.58 8-8 8h-80c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h80c4.42 0 8 3.58 8 8v16zm0-96c0 4.42-3.58 8-8 8H296c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h272c4.42 0 8 3.58 8 8v16z\"]\n};\nvar faMonument = {\n prefix: 'fas',\n iconName: 'monument',\n icon: [384, 512, [], \"f5a6\", \"M368 448H16c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h352c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16zm-78.86-347.26a31.97 31.97 0 0 0-9.21-19.44L203.31 4.69c-6.25-6.25-16.38-6.25-22.63 0l-76.6 76.61a31.97 31.97 0 0 0-9.21 19.44L64 416h256l-30.86-315.26zM240 307.2c0 6.4-6.4 12.8-12.8 12.8h-70.4c-6.4 0-12.8-6.4-12.8-12.8v-38.4c0-6.4 6.4-12.8 12.8-12.8h70.4c6.4 0 12.8 6.4 12.8 12.8v38.4z\"]\n};\nvar faMoon = {\n prefix: 'fas',\n iconName: 'moon',\n icon: [512, 512, [], \"f186\", \"M283.211 512c78.962 0 151.079-35.925 198.857-94.792 7.068-8.708-.639-21.43-11.562-19.35-124.203 23.654-238.262-71.576-238.262-196.954 0-72.222 38.662-138.635 101.498-174.394 9.686-5.512 7.25-20.197-3.756-22.23A258.156 258.156 0 0 0 283.211 0c-141.309 0-256 114.511-256 256 0 141.309 114.511 256 256 256z\"]\n};\nvar faMortarPestle = {\n prefix: 'fas',\n iconName: 'mortar-pestle',\n icon: [512, 512, [], \"f5a7\", \"M501.54 60.91c17.22-17.22 12.51-46.25-9.27-57.14a35.696 35.696 0 0 0-37.37 3.37L251.09 160h151.37l99.08-99.09zM496 192H16c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h16c0 80.98 50.2 150.11 121.13 178.32-12.76 16.87-21.72 36.8-24.95 58.69-1.46 9.92 6.04 18.98 16.07 18.98h223.5c10.03 0 17.53-9.06 16.07-18.98-3.22-21.89-12.18-41.82-24.95-58.69C429.8 406.11 480 336.98 480 256h16c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16z\"]\n};\nvar faMosque = {\n prefix: 'fas',\n iconName: 'mosque',\n icon: [640, 512, [], \"f678\", \"M0 480c0 17.67 14.33 32 32 32h64c17.67 0 32-14.33 32-32V160H0v320zm579.16-192c17.86-17.39 28.84-37.34 28.84-58.91 0-52.86-41.79-93.79-87.92-122.9-41.94-26.47-80.63-57.77-111.96-96.22L400 0l-8.12 9.97c-31.33 38.45-70.01 69.76-111.96 96.22C233.79 135.3 192 176.23 192 229.09c0 21.57 10.98 41.52 28.84 58.91h358.32zM608 320H192c-17.67 0-32 14.33-32 32v128c0 17.67 14.33 32 32 32h32v-64c0-17.67 14.33-32 32-32s32 14.33 32 32v64h64v-72c0-48 48-72 48-72s48 24 48 72v72h64v-64c0-17.67 14.33-32 32-32s32 14.33 32 32v64h32c17.67 0 32-14.33 32-32V352c0-17.67-14.33-32-32-32zM64 0S0 32 0 96v32h128V96c0-64-64-96-64-96z\"]\n};\nvar faMotorcycle = {\n prefix: 'fas',\n iconName: 'motorcycle',\n icon: [640, 512, [], \"f21c\", \"M512.9 192c-14.9-.1-29.1 2.3-42.4 6.9L437.6 144H520c13.3 0 24-10.7 24-24V88c0-13.3-10.7-24-24-24h-45.3c-6.8 0-13.3 2.9-17.8 7.9l-37.5 41.7-22.8-38C392.2 68.4 384.4 64 376 64h-80c-8.8 0-16 7.2-16 16v16c0 8.8 7.2 16 16 16h66.4l19.2 32H227.9c-17.7-23.1-44.9-40-99.9-40H72.5C59 104 47.7 115 48 128.5c.2 13 10.9 23.5 24 23.5h56c24.5 0 38.7 10.9 47.8 24.8l-11.3 20.5c-13-3.9-26.9-5.7-41.3-5.2C55.9 194.5 1.6 249.6 0 317c-1.6 72.1 56.3 131 128 131 59.6 0 109.7-40.8 124-96h84.2c13.7 0 24.6-11.4 24-25.1-2.1-47.1 17.5-93.7 56.2-125l12.5 20.8c-27.6 23.7-45.1 58.9-44.8 98.2.5 69.6 57.2 126.5 126.8 127.1 71.6.7 129.8-57.5 129.2-129.1-.7-69.6-57.6-126.4-127.2-126.9zM128 400c-44.1 0-80-35.9-80-80s35.9-80 80-80c4.2 0 8.4.3 12.5 1L99 316.4c-8.8 16 2.8 35.6 21 35.6h81.3c-12.4 28.2-40.6 48-73.3 48zm463.9-75.6c-2.2 40.6-35 73.4-75.5 75.5-46.1 2.5-84.4-34.3-84.4-79.9 0-21.4 8.4-40.8 22.1-55.1l49.4 82.4c4.5 7.6 14.4 10 22 5.5l13.7-8.2c7.6-4.5 10-14.4 5.5-22l-48.6-80.9c5.2-1.1 10.5-1.6 15.9-1.6 45.6-.1 82.3 38.2 79.9 84.3z\"]\n};\nvar faMountain = {\n prefix: 'fas',\n iconName: 'mountain',\n icon: [640, 512, [], \"f6fc\", \"M634.92 462.7l-288-448C341.03 5.54 330.89 0 320 0s-21.03 5.54-26.92 14.7l-288 448a32.001 32.001 0 0 0-1.17 32.64A32.004 32.004 0 0 0 32 512h576c11.71 0 22.48-6.39 28.09-16.67a31.983 31.983 0 0 0-1.17-32.63zM320 91.18L405.39 224H320l-64 64-38.06-38.06L320 91.18z\"]\n};\nvar faMousePointer = {\n prefix: 'fas',\n iconName: 'mouse-pointer',\n icon: [320, 512, [], \"f245\", \"M302.189 329.126H196.105l55.831 135.993c3.889 9.428-.555 19.999-9.444 23.999l-49.165 21.427c-9.165 4-19.443-.571-23.332-9.714l-53.053-129.136-86.664 89.138C18.729 472.71 0 463.554 0 447.977V18.299C0 1.899 19.921-6.096 30.277 5.443l284.412 292.542c11.472 11.179 3.007 31.141-12.5 31.141z\"]\n};\nvar faMugHot = {\n prefix: 'fas',\n iconName: 'mug-hot',\n icon: [512, 512, [], \"f7b6\", \"M127.1 146.5c1.3 7.7 8 13.5 16 13.5h16.5c9.8 0 17.6-8.5 16.3-18-3.8-28.2-16.4-54.2-36.6-74.7-14.4-14.7-23.6-33.3-26.4-53.5C111.8 5.9 105 0 96.8 0H80.4C70.6 0 63 8.5 64.1 18c3.9 31.9 18 61.3 40.6 84.4 12 12.2 19.7 27.5 22.4 44.1zm112 0c1.3 7.7 8 13.5 16 13.5h16.5c9.8 0 17.6-8.5 16.3-18-3.8-28.2-16.4-54.2-36.6-74.7-14.4-14.7-23.6-33.3-26.4-53.5C223.8 5.9 217 0 208.8 0h-16.4c-9.8 0-17.5 8.5-16.3 18 3.9 31.9 18 61.3 40.6 84.4 12 12.2 19.7 27.5 22.4 44.1zM400 192H32c-17.7 0-32 14.3-32 32v192c0 53 43 96 96 96h192c53 0 96-43 96-96h16c61.8 0 112-50.2 112-112s-50.2-112-112-112zm0 160h-16v-96h16c26.5 0 48 21.5 48 48s-21.5 48-48 48z\"]\n};\nvar faMusic = {\n prefix: 'fas',\n iconName: 'music',\n icon: [512, 512, [], \"f001\", \"M511.99 32.01c0-21.71-21.1-37.01-41.6-30.51L150.4 96c-13.3 4.2-22.4 16.5-22.4 30.5v261.42c-10.05-2.38-20.72-3.92-32-3.92-53.02 0-96 28.65-96 64s42.98 64 96 64 96-28.65 96-64V214.31l256-75.02v184.63c-10.05-2.38-20.72-3.92-32-3.92-53.02 0-96 28.65-96 64s42.98 64 96 64 96-28.65 96-64l-.01-351.99z\"]\n};\nvar faNetworkWired = {\n prefix: 'fas',\n iconName: 'network-wired',\n icon: [640, 512, [], \"f6ff\", \"M640 264v-16c0-8.84-7.16-16-16-16H344v-40h72c17.67 0 32-14.33 32-32V32c0-17.67-14.33-32-32-32H224c-17.67 0-32 14.33-32 32v128c0 17.67 14.33 32 32 32h72v40H16c-8.84 0-16 7.16-16 16v16c0 8.84 7.16 16 16 16h104v40H64c-17.67 0-32 14.33-32 32v128c0 17.67 14.33 32 32 32h160c17.67 0 32-14.33 32-32V352c0-17.67-14.33-32-32-32h-56v-40h304v40h-56c-17.67 0-32 14.33-32 32v128c0 17.67 14.33 32 32 32h160c17.67 0 32-14.33 32-32V352c0-17.67-14.33-32-32-32h-56v-40h104c8.84 0 16-7.16 16-16zM256 128V64h128v64H256zm-64 320H96v-64h96v64zm352 0h-96v-64h96v64z\"]\n};\nvar faNeuter = {\n prefix: 'fas',\n iconName: 'neuter',\n icon: [288, 512, [], \"f22c\", \"M288 176c0-79.5-64.5-144-144-144S0 96.5 0 176c0 68.5 47.9 125.9 112 140.4V468c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12V316.4c64.1-14.5 112-71.9 112-140.4zm-144 80c-44.1 0-80-35.9-80-80s35.9-80 80-80 80 35.9 80 80-35.9 80-80 80z\"]\n};\nvar faNewspaper = {\n prefix: 'fas',\n iconName: 'newspaper',\n icon: [576, 512, [], \"f1ea\", \"M552 64H88c-13.255 0-24 10.745-24 24v8H24c-13.255 0-24 10.745-24 24v272c0 30.928 25.072 56 56 56h472c26.51 0 48-21.49 48-48V88c0-13.255-10.745-24-24-24zM56 400a8 8 0 0 1-8-8V144h16v248a8 8 0 0 1-8 8zm236-16H140c-6.627 0-12-5.373-12-12v-8c0-6.627 5.373-12 12-12h152c6.627 0 12 5.373 12 12v8c0 6.627-5.373 12-12 12zm208 0H348c-6.627 0-12-5.373-12-12v-8c0-6.627 5.373-12 12-12h152c6.627 0 12 5.373 12 12v8c0 6.627-5.373 12-12 12zm-208-96H140c-6.627 0-12-5.373-12-12v-8c0-6.627 5.373-12 12-12h152c6.627 0 12 5.373 12 12v8c0 6.627-5.373 12-12 12zm208 0H348c-6.627 0-12-5.373-12-12v-8c0-6.627 5.373-12 12-12h152c6.627 0 12 5.373 12 12v8c0 6.627-5.373 12-12 12zm0-96H140c-6.627 0-12-5.373-12-12v-40c0-6.627 5.373-12 12-12h360c6.627 0 12 5.373 12 12v40c0 6.627-5.373 12-12 12z\"]\n};\nvar faNotEqual = {\n prefix: 'fas',\n iconName: 'not-equal',\n icon: [448, 512, [], \"f53e\", \"M416 208c17.67 0 32-14.33 32-32v-32c0-17.67-14.33-32-32-32h-23.88l51.87-66.81c5.37-7.02 4.04-17.06-2.97-22.43L415.61 3.3c-7.02-5.38-17.06-4.04-22.44 2.97L311.09 112H32c-17.67 0-32 14.33-32 32v32c0 17.67 14.33 32 32 32h204.56l-74.53 96H32c-17.67 0-32 14.33-32 32v32c0 17.67 14.33 32 32 32h55.49l-51.87 66.81c-5.37 7.01-4.04 17.05 2.97 22.43L64 508.7c7.02 5.38 17.06 4.04 22.43-2.97L168.52 400H416c17.67 0 32-14.33 32-32v-32c0-17.67-14.33-32-32-32H243.05l74.53-96H416z\"]\n};\nvar faNotesMedical = {\n prefix: 'fas',\n iconName: 'notes-medical',\n icon: [384, 512, [], \"f481\", \"M336 64h-80c0-35.3-28.7-64-64-64s-64 28.7-64 64H48C21.5 64 0 85.5 0 112v352c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V112c0-26.5-21.5-48-48-48zM192 40c13.3 0 24 10.7 24 24s-10.7 24-24 24-24-10.7-24-24 10.7-24 24-24zm96 304c0 4.4-3.6 8-8 8h-56v56c0 4.4-3.6 8-8 8h-48c-4.4 0-8-3.6-8-8v-56h-56c-4.4 0-8-3.6-8-8v-48c0-4.4 3.6-8 8-8h56v-56c0-4.4 3.6-8 8-8h48c4.4 0 8 3.6 8 8v56h56c4.4 0 8 3.6 8 8v48zm0-192c0 4.4-3.6 8-8 8H104c-4.4 0-8-3.6-8-8v-16c0-4.4 3.6-8 8-8h176c4.4 0 8 3.6 8 8v16z\"]\n};\nvar faObjectGroup = {\n prefix: 'fas',\n iconName: 'object-group',\n icon: [512, 512, [], \"f247\", \"M480 128V96h20c6.627 0 12-5.373 12-12V44c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v20H64V44c0-6.627-5.373-12-12-12H12C5.373 32 0 37.373 0 44v40c0 6.627 5.373 12 12 12h20v320H12c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12v-20h384v20c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12v-40c0-6.627-5.373-12-12-12h-20V128zM96 276V140c0-6.627 5.373-12 12-12h168c6.627 0 12 5.373 12 12v136c0 6.627-5.373 12-12 12H108c-6.627 0-12-5.373-12-12zm320 96c0 6.627-5.373 12-12 12H236c-6.627 0-12-5.373-12-12v-52h72c13.255 0 24-10.745 24-24v-72h84c6.627 0 12 5.373 12 12v136z\"]\n};\nvar faObjectUngroup = {\n prefix: 'fas',\n iconName: 'object-ungroup',\n icon: [576, 512, [], \"f248\", \"M64 320v26a6 6 0 0 1-6 6H6a6 6 0 0 1-6-6v-52a6 6 0 0 1 6-6h26V96H6a6 6 0 0 1-6-6V38a6 6 0 0 1 6-6h52a6 6 0 0 1 6 6v26h288V38a6 6 0 0 1 6-6h52a6 6 0 0 1 6 6v52a6 6 0 0 1-6 6h-26v192h26a6 6 0 0 1 6 6v52a6 6 0 0 1-6 6h-52a6 6 0 0 1-6-6v-26H64zm480-64v-32h26a6 6 0 0 0 6-6v-52a6 6 0 0 0-6-6h-52a6 6 0 0 0-6 6v26H408v72h8c13.255 0 24 10.745 24 24v64c0 13.255-10.745 24-24 24h-64c-13.255 0-24-10.745-24-24v-8H192v72h-26a6 6 0 0 0-6 6v52a6 6 0 0 0 6 6h52a6 6 0 0 0 6-6v-26h288v26a6 6 0 0 0 6 6h52a6 6 0 0 0 6-6v-52a6 6 0 0 0-6-6h-26V256z\"]\n};\nvar faOilCan = {\n prefix: 'fas',\n iconName: 'oil-can',\n icon: [640, 512, [], \"f613\", \"M629.8 160.31L416 224l-50.49-25.24a64.07 64.07 0 0 0-28.62-6.76H280v-48h56c8.84 0 16-7.16 16-16v-16c0-8.84-7.16-16-16-16H176c-8.84 0-16 7.16-16 16v16c0 8.84 7.16 16 16 16h56v48h-56L37.72 166.86a31.9 31.9 0 0 0-5.79-.53C14.67 166.33 0 180.36 0 198.34v94.95c0 15.46 11.06 28.72 26.28 31.48L96 337.46V384c0 17.67 14.33 32 32 32h274.63c8.55 0 16.75-3.42 22.76-9.51l212.26-214.75c1.5-1.5 2.34-3.54 2.34-5.66V168c.01-5.31-5.08-9.15-10.19-7.69zM96 288.67l-48-8.73v-62.43l48 8.73v62.43zm453.33 84.66c0 23.56 19.1 42.67 42.67 42.67s42.67-19.1 42.67-42.67S592 288 592 288s-42.67 61.77-42.67 85.33z\"]\n};\nvar faOm = {\n prefix: 'fas',\n iconName: 'om',\n icon: [512, 512, [], \"f679\", \"M360.6 60.94a10.43 10.43 0 0 0 14.76 0l21.57-21.56a10.43 10.43 0 0 0 0-14.76L375.35 3.06c-4.08-4.07-10.68-4.07-14.76 0l-21.57 21.56a10.43 10.43 0 0 0 0 14.76l21.58 21.56zM412.11 192c-26.69 0-51.77 10.39-70.64 29.25l-24.25 24.25c-6.78 6.77-15.78 10.5-25.38 10.5H245c10.54-22.1 14.17-48.11 7.73-75.23-10.1-42.55-46.36-76.11-89.52-83.19-36.15-5.93-70.9 5.04-96.01 28.78-7.36 6.96-6.97 18.85 1.12 24.93l26.15 19.63c5.72 4.3 13.66 4.32 19.2-.21 8.45-6.9 19.02-10.71 30.27-10.71 26.47 0 48.01 21.53 48.01 48s-21.54 48-48.01 48h-31.9c-11.96 0-19.74 12.58-14.39 23.28l16.09 32.17c2.53 5.06 7.6 8.1 13.17 8.55h33.03c35.3 0 64.01 28.7 64.01 64s-28.71 64-64.01 64c-96.02 0-122.35-54.02-145.15-92.03-4.53-7.55-14.77-3.58-14.79 5.22C-.09 416 41.13 512 159.94 512c70.59 0 128.02-57.42 128.02-128 0-23.42-6.78-45.1-17.81-64h21.69c26.69 0 51.77-10.39 70.64-29.25l24.25-24.25c6.78-6.77 15.78-10.5 25.38-10.5 19.78 0 35.88 16.09 35.88 35.88V392c0 13.23-18.77 24-32.01 24-39.4 0-66.67-24.24-81.82-42.89-4.77-5.87-14.2-2.54-14.2 5.02V416s0 64 96.02 64c48.54 0 96.02-39.47 96.02-88V291.88c0-55.08-44.8-99.88-99.89-99.88zm42.18-124.73c-85.55 65.12-169.05 2.75-172.58.05-6.02-4.62-14.44-4.38-20.14.55-5.74 4.92-7.27 13.17-3.66 19.8 1.61 2.95 40.37 72.34 118.8 72.34 79.92 0 98.78-31.36 101.75-37.66 1.02-2.12 1.53-4.47 1.53-6.83V80c0-13.22-15.14-20.69-25.7-12.73z\"]\n};\nvar faOtter = {\n prefix: 'fas',\n iconName: 'otter',\n icon: [640, 512, [], \"f700\", \"M608 32h-32l-13.25-13.25A63.97 63.97 0 0 0 517.49 0H497c-11.14 0-22.08 2.91-31.75 8.43L312 96h-56C149.96 96 64 181.96 64 288v1.61c0 32.75-16 62.14-39.56 84.89-18.19 17.58-28.1 43.68-23.19 71.8 6.76 38.8 42.9 65.7 82.28 65.7H192c17.67 0 32-14.33 32-32s-14.33-32-32-32H80c-8.83 0-16-7.17-16-16s7.17-16 16-16h224c8.84 0 16-7.16 16-16v-16c0-17.67-14.33-32-32-32h-64l149.49-80.5L448 416h80c8.84 0 16-7.16 16-16v-16c0-17.67-14.33-32-32-32h-28.22l-55.11-110.21L521.14 192H544c53.02 0 96-42.98 96-96V64c0-17.67-14.33-32-32-32zm-96 16c8.84 0 16 7.16 16 16s-7.16 16-16 16-16-7.16-16-16 7.16-16 16-16zm32 96h-34.96L407.2 198.84l-13.77-27.55L512 112h77.05c-6.62 18.58-24.22 32-45.05 32z\"]\n};\nvar faOutdent = {\n prefix: 'fas',\n iconName: 'outdent',\n icon: [448, 512, [], \"f03b\", \"M100.69 363.29c10 10 27.31 2.93 27.31-11.31V160c0-14.32-17.33-21.31-27.31-11.31l-96 96a16 16 0 0 0 0 22.62zM432 416H16a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h416a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm3.17-128H204.83A12.82 12.82 0 0 0 192 300.83v38.34A12.82 12.82 0 0 0 204.83 352h230.34A12.82 12.82 0 0 0 448 339.17v-38.34A12.82 12.82 0 0 0 435.17 288zm0-128H204.83A12.82 12.82 0 0 0 192 172.83v38.34A12.82 12.82 0 0 0 204.83 224h230.34A12.82 12.82 0 0 0 448 211.17v-38.34A12.82 12.82 0 0 0 435.17 160zM432 32H16A16 16 0 0 0 0 48v32a16 16 0 0 0 16 16h416a16 16 0 0 0 16-16V48a16 16 0 0 0-16-16z\"]\n};\nvar faPager = {\n prefix: 'fas',\n iconName: 'pager',\n icon: [512, 512, [], \"f815\", \"M448 64H64a64 64 0 0 0-64 64v256a64 64 0 0 0 64 64h384a64 64 0 0 0 64-64V128a64 64 0 0 0-64-64zM160 368H80a16 16 0 0 1-16-16v-16a16 16 0 0 1 16-16h80zm128-16a16 16 0 0 1-16 16h-80v-48h80a16 16 0 0 1 16 16zm160-128a32 32 0 0 1-32 32H96a32 32 0 0 1-32-32v-64a32 32 0 0 1 32-32h320a32 32 0 0 1 32 32z\"]\n};\nvar faPaintBrush = {\n prefix: 'fas',\n iconName: 'paint-brush',\n icon: [512, 512, [], \"f1fc\", \"M167.02 309.34c-40.12 2.58-76.53 17.86-97.19 72.3-2.35 6.21-8 9.98-14.59 9.98-11.11 0-45.46-27.67-55.25-34.35C0 439.62 37.93 512 128 512c75.86 0 128-43.77 128-120.19 0-3.11-.65-6.08-.97-9.13l-88.01-73.34zM457.89 0c-15.16 0-29.37 6.71-40.21 16.45C213.27 199.05 192 203.34 192 257.09c0 13.7 3.25 26.76 8.73 38.7l63.82 53.18c7.21 1.8 14.64 3.03 22.39 3.03 62.11 0 98.11-45.47 211.16-256.46 7.38-14.35 13.9-29.85 13.9-45.99C512 20.64 486 0 457.89 0z\"]\n};\nvar faPaintRoller = {\n prefix: 'fas',\n iconName: 'paint-roller',\n icon: [512, 512, [], \"f5aa\", \"M416 128V32c0-17.67-14.33-32-32-32H32C14.33 0 0 14.33 0 32v96c0 17.67 14.33 32 32 32h352c17.67 0 32-14.33 32-32zm32-64v128c0 17.67-14.33 32-32 32H256c-35.35 0-64 28.65-64 64v32c-17.67 0-32 14.33-32 32v128c0 17.67 14.33 32 32 32h64c17.67 0 32-14.33 32-32V352c0-17.67-14.33-32-32-32v-32h160c53.02 0 96-42.98 96-96v-64c0-35.35-28.65-64-64-64z\"]\n};\nvar faPalette = {\n prefix: 'fas',\n iconName: 'palette',\n icon: [512, 512, [], \"f53f\", \"M204.3 5C104.9 24.4 24.8 104.3 5.2 203.4c-37 187 131.7 326.4 258.8 306.7 41.2-6.4 61.4-54.6 42.5-91.7-23.1-45.4 9.9-98.4 60.9-98.4h79.7c35.8 0 64.8-29.6 64.9-65.3C511.5 97.1 368.1-26.9 204.3 5zM96 320c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32zm32-128c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32zm128-64c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32zm128 64c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32z\"]\n};\nvar faPallet = {\n prefix: 'fas',\n iconName: 'pallet',\n icon: [640, 512, [], \"f482\", \"M144 256h352c8.8 0 16-7.2 16-16V16c0-8.8-7.2-16-16-16H384v128l-64-32-64 32V0H144c-8.8 0-16 7.2-16 16v224c0 8.8 7.2 16 16 16zm480 128c8.8 0 16-7.2 16-16v-32c0-8.8-7.2-16-16-16H16c-8.8 0-16 7.2-16 16v32c0 8.8 7.2 16 16 16h48v64H16c-8.8 0-16 7.2-16 16v32c0 8.8 7.2 16 16 16h608c8.8 0 16-7.2 16-16v-32c0-8.8-7.2-16-16-16h-48v-64h48zm-336 64H128v-64h160v64zm224 0H352v-64h160v64z\"]\n};\nvar faPaperPlane = {\n prefix: 'fas',\n iconName: 'paper-plane',\n icon: [512, 512, [], \"f1d8\", \"M476 3.2L12.5 270.6c-18.1 10.4-15.8 35.6 2.2 43.2L121 358.4l287.3-253.2c5.5-4.9 13.3 2.6 8.6 8.3L176 407v80.5c0 23.6 28.5 32.9 42.5 15.8L282 426l124.6 52.2c14.2 6 30.4-2.9 33-18.2l72-432C515 7.8 493.3-6.8 476 3.2z\"]\n};\nvar faPaperclip = {\n prefix: 'fas',\n iconName: 'paperclip',\n icon: [448, 512, [], \"f0c6\", \"M43.246 466.142c-58.43-60.289-57.341-157.511 1.386-217.581L254.392 34c44.316-45.332 116.351-45.336 160.671 0 43.89 44.894 43.943 117.329 0 162.276L232.214 383.128c-29.855 30.537-78.633 30.111-107.982-.998-28.275-29.97-27.368-77.473 1.452-106.953l143.743-146.835c6.182-6.314 16.312-6.422 22.626-.241l22.861 22.379c6.315 6.182 6.422 16.312.241 22.626L171.427 319.927c-4.932 5.045-5.236 13.428-.648 18.292 4.372 4.634 11.245 4.711 15.688.165l182.849-186.851c19.613-20.062 19.613-52.725-.011-72.798-19.189-19.627-49.957-19.637-69.154 0L90.39 293.295c-34.763 35.56-35.299 93.12-1.191 128.313 34.01 35.093 88.985 35.137 123.058.286l172.06-175.999c6.177-6.319 16.307-6.433 22.626-.256l22.877 22.364c6.319 6.177 6.434 16.307.256 22.626l-172.06 175.998c-59.576 60.938-155.943 60.216-214.77-.485z\"]\n};\nvar faParachuteBox = {\n prefix: 'fas',\n iconName: 'parachute-box',\n icon: [512, 512, [], \"f4cd\", \"M511.9 175c-9.1-75.6-78.4-132.4-158.3-158.7C390 55.7 416 116.9 416 192h28.1L327.5 321.5c-2.5-.6-4.8-1.5-7.5-1.5h-48V192h112C384 76.8 315.1 0 256 0S128 76.8 128 192h112v128h-48c-2.7 0-5 .9-7.5 1.5L67.9 192H96c0-75.1 26-136.3 62.4-175.7C78.5 42.7 9.2 99.5.1 175c-1.1 9.1 6.8 17 16 17h8.7l136.7 151.9c-.7 2.6-1.6 5.2-1.6 8.1v128c0 17.7 14.3 32 32 32h128c17.7 0 32-14.3 32-32V352c0-2.9-.9-5.4-1.6-8.1L487.1 192h8.7c9.3 0 17.2-7.8 16.1-17z\"]\n};\nvar faParagraph = {\n prefix: 'fas',\n iconName: 'paragraph',\n icon: [448, 512, [], \"f1dd\", \"M448 48v32a16 16 0 0 1-16 16h-48v368a16 16 0 0 1-16 16h-32a16 16 0 0 1-16-16V96h-32v368a16 16 0 0 1-16 16h-32a16 16 0 0 1-16-16V352h-32a160 160 0 0 1 0-320h240a16 16 0 0 1 16 16z\"]\n};\nvar faParking = {\n prefix: 'fas',\n iconName: 'parking',\n icon: [448, 512, [], \"f540\", \"M400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zM240 320h-48v48c0 8.8-7.2 16-16 16h-32c-8.8 0-16-7.2-16-16V144c0-8.8 7.2-16 16-16h96c52.9 0 96 43.1 96 96s-43.1 96-96 96zm0-128h-48v64h48c17.6 0 32-14.4 32-32s-14.4-32-32-32z\"]\n};\nvar faPassport = {\n prefix: 'fas',\n iconName: 'passport',\n icon: [448, 512, [], \"f5ab\", \"M129.62 176h39.09c1.49-27.03 6.54-51.35 14.21-70.41-27.71 13.24-48.02 39.19-53.3 70.41zm0 32c5.29 31.22 25.59 57.17 53.3 70.41-7.68-19.06-12.72-43.38-14.21-70.41h-39.09zM224 286.69c7.69-7.45 20.77-34.42 23.43-78.69h-46.87c2.67 44.26 15.75 71.24 23.44 78.69zM200.57 176h46.87c-2.66-44.26-15.74-71.24-23.43-78.69-7.7 7.45-20.78 34.43-23.44 78.69zm64.51 102.41c27.71-13.24 48.02-39.19 53.3-70.41h-39.09c-1.49 27.03-6.53 51.35-14.21 70.41zM416 0H64C28.65 0 0 28.65 0 64v384c0 35.35 28.65 64 64 64h352c17.67 0 32-14.33 32-32V32c0-17.67-14.33-32-32-32zm-80 416H112c-8.8 0-16-7.2-16-16s7.2-16 16-16h224c8.8 0 16 7.2 16 16s-7.2 16-16 16zm-112-96c-70.69 0-128-57.31-128-128S153.31 64 224 64s128 57.31 128 128-57.31 128-128 128zm41.08-214.41c7.68 19.06 12.72 43.38 14.21 70.41h39.09c-5.28-31.22-25.59-57.17-53.3-70.41z\"]\n};\nvar faPastafarianism = {\n prefix: 'fas',\n iconName: 'pastafarianism',\n icon: [640, 512, [], \"f67b\", \"M624.54 347.67c-32.7-12.52-57.36 4.25-75.37 16.45-17.06 11.53-23.25 14.42-31.41 11.36-8.12-3.09-10.83-9.38-15.89-29.38-3.33-13.15-7.44-29.32-17.95-42.65 2.24-2.91 4.43-5.79 6.38-8.57C500.47 304.45 513.71 312 532 312c33.95 0 50.87-25.78 62.06-42.83 10.59-16.14 15-21.17 21.94-21.17 13.25 0 24-10.75 24-24s-10.75-24-24-24c-33.95 0-50.87 25.78-62.06 42.83-10.6 16.14-15 21.17-21.94 21.17-17.31 0-37.48-61.43-97.26-101.91l17.25-34.5C485.43 125.5 512 97.98 512 64c0-35.35-28.65-64-64-64s-64 28.65-64 64c0 13.02 3.94 25.1 10.62 35.21l-18.15 36.3c-16.98-4.6-35.6-7.51-56.46-7.51s-39.49 2.91-56.46 7.51l-18.15-36.3C252.06 89.1 256 77.02 256 64c0-35.35-28.65-64-64-64s-64 28.65-64 64c0 33.98 26.56 61.5 60.02 63.6l17.25 34.5C145.68 202.44 125.15 264 108 264c-6.94 0-11.34-5.03-21.94-21.17C74.88 225.78 57.96 200 24 200c-13.25 0-24 10.75-24 24s10.75 24 24 24c6.94 0 11.34 5.03 21.94 21.17C57.13 286.22 74.05 312 108 312c18.29 0 31.53-7.55 41.7-17.11 1.95 2.79 4.14 5.66 6.38 8.57-10.51 13.33-14.62 29.5-17.95 42.65-5.06 20-7.77 26.28-15.89 29.38-8.11 3.06-14.33.17-31.41-11.36-18.03-12.2-42.72-28.92-75.37-16.45-12.39 4.72-18.59 18.58-13.87 30.97 4.72 12.41 18.61 18.61 30.97 13.88 8.16-3.09 14.34-.19 31.39 11.36 13.55 9.16 30.83 20.86 52.42 20.84 7.17 0 14.83-1.28 22.97-4.39 32.66-12.44 39.98-41.33 45.33-62.44 2.21-8.72 3.99-14.49 5.95-18.87 16.62 13.61 36.95 25.88 61.64 34.17-9.96 37-32.18 90.8-60.26 90.8-13.25 0-24 10.75-24 24s10.75 24 24 24c66.74 0 97.05-88.63 107.42-129.14 6.69.6 13.42 1.14 20.58 1.14s13.89-.54 20.58-1.14C350.95 423.37 381.26 512 448 512c13.25 0 24-10.75 24-24s-10.75-24-24-24c-27.94 0-50.21-53.81-60.22-90.81 24.69-8.29 45-20.56 61.62-34.16 1.96 4.38 3.74 10.15 5.95 18.87 5.34 21.11 12.67 50 45.33 62.44 8.14 3.11 15.8 4.39 22.97 4.39 21.59 0 38.87-11.69 52.42-20.84 17.05-11.55 23.28-14.45 31.39-11.36 12.39 4.75 26.27-1.47 30.97-13.88 4.71-12.4-1.49-26.26-13.89-30.98zM448 48c8.82 0 16 7.18 16 16s-7.18 16-16 16-16-7.18-16-16 7.18-16 16-16zm-256 0c8.82 0 16 7.18 16 16s-7.18 16-16 16-16-7.18-16-16 7.18-16 16-16z\"]\n};\nvar faPaste = {\n prefix: 'fas',\n iconName: 'paste',\n icon: [448, 512, [], \"f0ea\", \"M128 184c0-30.879 25.122-56 56-56h136V56c0-13.255-10.745-24-24-24h-80.61C204.306 12.89 183.637 0 160 0s-44.306 12.89-55.39 32H24C10.745 32 0 42.745 0 56v336c0 13.255 10.745 24 24 24h104V184zm32-144c13.255 0 24 10.745 24 24s-10.745 24-24 24-24-10.745-24-24 10.745-24 24-24zm184 248h104v200c0 13.255-10.745 24-24 24H184c-13.255 0-24-10.745-24-24V184c0-13.255 10.745-24 24-24h136v104c0 13.2 10.8 24 24 24zm104-38.059V256h-96v-96h6.059a24 24 0 0 1 16.97 7.029l65.941 65.941a24.002 24.002 0 0 1 7.03 16.971z\"]\n};\nvar faPause = {\n prefix: 'fas',\n iconName: 'pause',\n icon: [448, 512, [], \"f04c\", \"M144 479H48c-26.5 0-48-21.5-48-48V79c0-26.5 21.5-48 48-48h96c26.5 0 48 21.5 48 48v352c0 26.5-21.5 48-48 48zm304-48V79c0-26.5-21.5-48-48-48h-96c-26.5 0-48 21.5-48 48v352c0 26.5 21.5 48 48 48h96c26.5 0 48-21.5 48-48z\"]\n};\nvar faPauseCircle = {\n prefix: 'fas',\n iconName: 'pause-circle',\n icon: [512, 512, [], \"f28b\", \"M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm-16 328c0 8.8-7.2 16-16 16h-48c-8.8 0-16-7.2-16-16V176c0-8.8 7.2-16 16-16h48c8.8 0 16 7.2 16 16v160zm112 0c0 8.8-7.2 16-16 16h-48c-8.8 0-16-7.2-16-16V176c0-8.8 7.2-16 16-16h48c8.8 0 16 7.2 16 16v160z\"]\n};\nvar faPaw = {\n prefix: 'fas',\n iconName: 'paw',\n icon: [512, 512, [], \"f1b0\", \"M256 224c-79.41 0-192 122.76-192 200.25 0 34.9 26.81 55.75 71.74 55.75 48.84 0 81.09-25.08 120.26-25.08 39.51 0 71.85 25.08 120.26 25.08 44.93 0 71.74-20.85 71.74-55.75C448 346.76 335.41 224 256 224zm-147.28-12.61c-10.4-34.65-42.44-57.09-71.56-50.13-29.12 6.96-44.29 40.69-33.89 75.34 10.4 34.65 42.44 57.09 71.56 50.13 29.12-6.96 44.29-40.69 33.89-75.34zm84.72-20.78c30.94-8.14 46.42-49.94 34.58-93.36s-46.52-72.01-77.46-63.87-46.42 49.94-34.58 93.36c11.84 43.42 46.53 72.02 77.46 63.87zm281.39-29.34c-29.12-6.96-61.15 15.48-71.56 50.13-10.4 34.65 4.77 68.38 33.89 75.34 29.12 6.96 61.15-15.48 71.56-50.13 10.4-34.65-4.77-68.38-33.89-75.34zm-156.27 29.34c30.94 8.14 65.62-20.45 77.46-63.87 11.84-43.42-3.64-85.21-34.58-93.36s-65.62 20.45-77.46 63.87c-11.84 43.42 3.64 85.22 34.58 93.36z\"]\n};\nvar faPeace = {\n prefix: 'fas',\n iconName: 'peace',\n icon: [496, 512, [], \"f67c\", \"M248 8C111.03 8 0 119.03 0 256s111.03 248 248 248 248-111.03 248-248S384.97 8 248 8zm184 248c0 31.93-8.2 61.97-22.57 88.17L280 240.63V74.97c86.23 15.21 152 90.5 152 181.03zM216 437.03c-33.86-5.97-64.49-21.2-89.29-43.02L216 322.57v114.46zm64-114.46L369.29 394c-24.8 21.82-55.43 37.05-89.29 43.02V322.57zm-64-247.6v165.66L86.57 344.17C72.2 317.97 64 287.93 64 256c0-90.53 65.77-165.82 152-181.03z\"]\n};\nvar faPen = {\n prefix: 'fas',\n iconName: 'pen',\n icon: [512, 512, [], \"f304\", \"M290.74 93.24l128.02 128.02-277.99 277.99-114.14 12.6C11.35 513.54-1.56 500.62.14 485.34l12.7-114.22 277.9-277.88zm207.2-19.06l-60.11-60.11c-18.75-18.75-49.16-18.75-67.91 0l-56.55 56.55 128.02 128.02 56.55-56.55c18.75-18.76 18.75-49.16 0-67.91z\"]\n};\nvar faPenAlt = {\n prefix: 'fas',\n iconName: 'pen-alt',\n icon: [512, 512, [], \"f305\", \"M497.94 74.17l-60.11-60.11c-18.75-18.75-49.16-18.75-67.91 0l-56.55 56.55 128.02 128.02 56.55-56.55c18.75-18.75 18.75-49.15 0-67.91zm-246.8-20.53c-15.62-15.62-40.94-15.62-56.56 0L75.8 172.43c-6.25 6.25-6.25 16.38 0 22.62l22.63 22.63c6.25 6.25 16.38 6.25 22.63 0l101.82-101.82 22.63 22.62L93.95 290.03A327.038 327.038 0 0 0 .17 485.11l-.03.23c-1.7 15.28 11.21 28.2 26.49 26.51a327.02 327.02 0 0 0 195.34-93.8l196.79-196.79-82.77-82.77-84.85-84.85z\"]\n};\nvar faPenFancy = {\n prefix: 'fas',\n iconName: 'pen-fancy',\n icon: [512, 512, [], \"f5ac\", \"M79.18 282.94a32.005 32.005 0 0 0-20.24 20.24L0 480l4.69 4.69 92.89-92.89c-.66-2.56-1.57-5.03-1.57-7.8 0-17.67 14.33-32 32-32s32 14.33 32 32-14.33 32-32 32c-2.77 0-5.24-.91-7.8-1.57l-92.89 92.89L32 512l176.82-58.94a31.983 31.983 0 0 0 20.24-20.24l33.07-84.07-98.88-98.88-84.07 33.07zM369.25 28.32L186.14 227.81l97.85 97.85 199.49-183.11C568.4 67.48 443.73-55.94 369.25 28.32z\"]\n};\nvar faPenNib = {\n prefix: 'fas',\n iconName: 'pen-nib',\n icon: [512, 512, [], \"f5ad\", \"M136.6 138.79a64.003 64.003 0 0 0-43.31 41.35L0 460l14.69 14.69L164.8 324.58c-2.99-6.26-4.8-13.18-4.8-20.58 0-26.51 21.49-48 48-48s48 21.49 48 48-21.49 48-48 48c-7.4 0-14.32-1.81-20.58-4.8L37.31 497.31 52 512l279.86-93.29a64.003 64.003 0 0 0 41.35-43.31L416 224 288 96l-151.4 42.79zm361.34-64.62l-60.11-60.11c-18.75-18.75-49.16-18.75-67.91 0l-56.55 56.55 128.02 128.02 56.55-56.55c18.75-18.75 18.75-49.15 0-67.91z\"]\n};\nvar faPenSquare = {\n prefix: 'fas',\n iconName: 'pen-square',\n icon: [448, 512, [], \"f14b\", \"M400 480H48c-26.5 0-48-21.5-48-48V80c0-26.5 21.5-48 48-48h352c26.5 0 48 21.5 48 48v352c0 26.5-21.5 48-48 48zM238.1 177.9L102.4 313.6l-6.3 57.1c-.8 7.6 5.6 14.1 13.3 13.3l57.1-6.3L302.2 242c2.3-2.3 2.3-6.1 0-8.5L246.7 178c-2.5-2.4-6.3-2.4-8.6-.1zM345 165.1L314.9 135c-9.4-9.4-24.6-9.4-33.9 0l-23.1 23.1c-2.3 2.3-2.3 6.1 0 8.5l55.5 55.5c2.3 2.3 6.1 2.3 8.5 0L345 199c9.3-9.3 9.3-24.5 0-33.9z\"]\n};\nvar faPencilAlt = {\n prefix: 'fas',\n iconName: 'pencil-alt',\n icon: [512, 512, [], \"f303\", \"M497.9 142.1l-46.1 46.1c-4.7 4.7-12.3 4.7-17 0l-111-111c-4.7-4.7-4.7-12.3 0-17l46.1-46.1c18.7-18.7 49.1-18.7 67.9 0l60.1 60.1c18.8 18.7 18.8 49.1 0 67.9zM284.2 99.8L21.6 362.4.4 483.9c-2.9 16.4 11.4 30.6 27.8 27.8l121.5-21.3 262.6-262.6c4.7-4.7 4.7-12.3 0-17l-111-111c-4.8-4.7-12.4-4.7-17.1 0zM124.1 339.9c-5.5-5.5-5.5-14.3 0-19.8l154-154c5.5-5.5 14.3-5.5 19.8 0s5.5 14.3 0 19.8l-154 154c-5.5 5.5-14.3 5.5-19.8 0zM88 424h48v36.3l-64.5 11.3-31.1-31.1L51.7 376H88v48z\"]\n};\nvar faPencilRuler = {\n prefix: 'fas',\n iconName: 'pencil-ruler',\n icon: [512, 512, [], \"f5ae\", \"M109.46 244.04l134.58-134.56-44.12-44.12-61.68 61.68a7.919 7.919 0 0 1-11.21 0l-11.21-11.21c-3.1-3.1-3.1-8.12 0-11.21l61.68-61.68-33.64-33.65C131.47-3.1 111.39-3.1 99 9.29L9.29 99c-12.38 12.39-12.39 32.47 0 44.86l100.17 100.18zm388.47-116.8c18.76-18.76 18.75-49.17 0-67.93l-45.25-45.25c-18.76-18.76-49.18-18.76-67.95 0l-46.02 46.01 113.2 113.2 46.02-46.03zM316.08 82.71l-297 296.96L.32 487.11c-2.53 14.49 10.09 27.11 24.59 24.56l107.45-18.84L429.28 195.9 316.08 82.71zm186.63 285.43l-33.64-33.64-61.68 61.68c-3.1 3.1-8.12 3.1-11.21 0l-11.21-11.21c-3.09-3.1-3.09-8.12 0-11.21l61.68-61.68-44.14-44.14L267.93 402.5l100.21 100.2c12.39 12.39 32.47 12.39 44.86 0l89.71-89.7c12.39-12.39 12.39-32.47 0-44.86z\"]\n};\nvar faPeopleCarry = {\n prefix: 'fas',\n iconName: 'people-carry',\n icon: [640, 512, [], \"f4ce\", \"M128 96c26.5 0 48-21.5 48-48S154.5 0 128 0 80 21.5 80 48s21.5 48 48 48zm384 0c26.5 0 48-21.5 48-48S538.5 0 512 0s-48 21.5-48 48 21.5 48 48 48zm125.7 372.1l-44-110-41.1 46.4-2 18.2 27.7 69.2c5 12.5 17 20.1 29.7 20.1 4 0 8-.7 11.9-2.3 16.4-6.6 24.4-25.2 17.8-41.6zm-34.2-209.8L585 178.1c-4.6-20-18.6-36.8-37.5-44.9-18.5-8-39-6.7-56.1 3.3-22.7 13.4-39.7 34.5-48.1 59.4L432 229.8 416 240v-96c0-8.8-7.2-16-16-16H240c-8.8 0-16 7.2-16 16v96l-16.1-10.2-11.3-33.9c-8.3-25-25.4-46-48.1-59.4-17.2-10-37.6-11.3-56.1-3.3-18.9 8.1-32.9 24.9-37.5 44.9l-18.4 80.2c-4.6 20 .7 41.2 14.4 56.7l67.2 75.9 10.1 92.6C130 499.8 143.8 512 160 512c1.2 0 2.3-.1 3.5-.2 17.6-1.9 30.2-17.7 28.3-35.3l-10.1-92.8c-1.5-13-6.9-25.1-15.6-35l-43.3-49 17.6-70.3 6.8 20.4c4.1 12.5 11.9 23.4 24.5 32.6l51.1 32.5c4.6 2.9 12.1 4.6 17.2 5h160c5.1-.4 12.6-2.1 17.2-5l51.1-32.5c12.6-9.2 20.4-20 24.5-32.6l6.8-20.4 17.6 70.3-43.3 49c-8.7 9.9-14.1 22-15.6 35l-10.1 92.8c-1.9 17.6 10.8 33.4 28.3 35.3 1.2.1 2.3.2 3.5.2 16.1 0 30-12.1 31.8-28.5l10.1-92.6 67.2-75.9c13.6-15.5 19-36.7 14.4-56.7zM46.3 358.1l-44 110c-6.6 16.4 1.4 35 17.8 41.6 16.8 6.6 35.1-1.7 41.6-17.8l27.7-69.2-2-18.2-41.1-46.4z\"]\n};\nvar faPepperHot = {\n prefix: 'fas',\n iconName: 'pepper-hot',\n icon: [512, 512, [], \"f816\", \"M330.67 263.12V173.4l-52.75-24.22C219.44 218.76 197.58 400 56 400a56 56 0 0 0 0 112c212.64 0 370.65-122.87 419.18-210.34l-37.05-38.54zm131.09-128.37C493.92 74.91 477.18 26.48 458.62 3a8 8 0 0 0-11.93-.59l-22.9 23a8.06 8.06 0 0 0-.89 10.23c6.86 10.36 17.05 35.1-1.4 72.32A142.85 142.85 0 0 0 364.34 96c-28 0-54 8.54-76.34 22.59l74.67 34.29v78.24h89.09L506.44 288c3.26-12.62 5.56-25.63 5.56-39.31a154 154 0 0 0-50.24-113.94z\"]\n};\nvar faPercent = {\n prefix: 'fas',\n iconName: 'percent',\n icon: [448, 512, [], \"f295\", \"M112 224c61.9 0 112-50.1 112-112S173.9 0 112 0 0 50.1 0 112s50.1 112 112 112zm0-160c26.5 0 48 21.5 48 48s-21.5 48-48 48-48-21.5-48-48 21.5-48 48-48zm224 224c-61.9 0-112 50.1-112 112s50.1 112 112 112 112-50.1 112-112-50.1-112-112-112zm0 160c-26.5 0-48-21.5-48-48s21.5-48 48-48 48 21.5 48 48-21.5 48-48 48zM392.3.2l31.6-.1c19.4-.1 30.9 21.8 19.7 37.8L77.4 501.6a23.95 23.95 0 0 1-19.6 10.2l-33.4.1c-19.5 0-30.9-21.9-19.7-37.8l368-463.7C377.2 4 384.5.2 392.3.2z\"]\n};\nvar faPercentage = {\n prefix: 'fas',\n iconName: 'percentage',\n icon: [384, 512, [], \"f541\", \"M109.25 173.25c24.99-24.99 24.99-65.52 0-90.51-24.99-24.99-65.52-24.99-90.51 0-24.99 24.99-24.99 65.52 0 90.51 25 25 65.52 25 90.51 0zm256 165.49c-24.99-24.99-65.52-24.99-90.51 0-24.99 24.99-24.99 65.52 0 90.51 24.99 24.99 65.52 24.99 90.51 0 25-24.99 25-65.51 0-90.51zm-1.94-231.43l-22.62-22.62c-12.5-12.5-32.76-12.5-45.25 0L20.69 359.44c-12.5 12.5-12.5 32.76 0 45.25l22.62 22.62c12.5 12.5 32.76 12.5 45.25 0l274.75-274.75c12.5-12.49 12.5-32.75 0-45.25z\"]\n};\nvar faPersonBooth = {\n prefix: 'fas',\n iconName: 'person-booth',\n icon: [576, 512, [], \"f756\", \"M192 496c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16V320h-64v176zm32-272h-50.9l-45.2-45.3C115.8 166.6 99.7 160 82.7 160H64c-17.1 0-33.2 6.7-45.3 18.8C6.7 190.9 0 207 0 224.1L.2 320 0 480c0 17.7 14.3 32 31.9 32 17.6 0 32-14.3 32-32l.1-100.7c.9.5 1.6 1.3 2.5 1.7l29.1 43v56c0 17.7 14.3 32 32 32s32-14.3 32-32v-56.5c0-9.9-2.3-19.8-6.7-28.6l-41.2-61.3V253l20.9 20.9c9.1 9.1 21.1 14.1 33.9 14.1H224c17.7 0 32-14.3 32-32s-14.3-32-32-32zM64 128c26.5 0 48-21.5 48-48S90.5 32 64 32 16 53.5 16 80s21.5 48 48 48zm224-96l31.5 223.1-30.9 154.6c-4.3 21.6 13 38.3 31.4 38.3 15.2 0 28-9.1 32.3-30.4.9 16.9 14.6 30.4 31.7 30.4 17.7 0 32-14.3 32-32 0 17.7 14.3 32 32 32s32-14.3 32-32V0H288v32zm-96 0v160h64V0h-32c-17.7 0-32 14.3-32 32zM544 0h-32v496c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16V32c0-17.7-14.3-32-32-32z\"]\n};\nvar faPhone = {\n prefix: 'fas',\n iconName: 'phone',\n icon: [512, 512, [], \"f095\", \"M493.4 24.6l-104-24c-11.3-2.6-22.9 3.3-27.5 13.9l-48 112c-4.2 9.8-1.4 21.3 6.9 28l60.6 49.6c-36 76.7-98.9 140.5-177.2 177.2l-49.6-60.6c-6.8-8.3-18.2-11.1-28-6.9l-112 48C3.9 366.5-2 378.1.6 389.4l24 104C27.1 504.2 36.7 512 48 512c256.1 0 464-207.5 464-464 0-11.2-7.7-20.9-18.6-23.4z\"]\n};\nvar faPhoneAlt = {\n prefix: 'fas',\n iconName: 'phone-alt',\n icon: [512, 512, [], \"f879\", \"M497.39 361.8l-112-48a24 24 0 0 0-28 6.9l-49.6 60.6A370.66 370.66 0 0 1 130.6 204.11l60.6-49.6a23.94 23.94 0 0 0 6.9-28l-48-112A24.16 24.16 0 0 0 122.6.61l-104 24A24 24 0 0 0 0 48c0 256.5 207.9 464 464 464a24 24 0 0 0 23.4-18.6l24-104a24.29 24.29 0 0 0-14.01-27.6z\"]\n};\nvar faPhoneSlash = {\n prefix: 'fas',\n iconName: 'phone-slash',\n icon: [640, 512, [], \"f3dd\", \"M268.2 381.4l-49.6-60.6c-6.8-8.3-18.2-11.1-28-6.9l-112 48c-10.7 4.6-16.5 16.1-13.9 27.5l24 104c2.5 10.8 12.1 18.6 23.4 18.6 100.7 0 193.7-32.4 269.7-86.9l-80-61.8c-10.9 6.5-22.1 12.7-33.6 18.1zm365.6 76.7L475.1 335.5C537.9 256.4 576 156.9 576 48c0-11.2-7.7-20.9-18.6-23.4l-104-24c-11.3-2.6-22.9 3.3-27.5 13.9l-48 112c-4.2 9.8-1.4 21.3 6.9 28l60.6 49.6c-12.2 26.1-27.9 50.3-46 72.8L45.5 3.4C38.5-2 28.5-.8 23 6.2L3.4 31.4c-5.4 7-4.2 17 2.8 22.4l588.4 454.7c7 5.4 17 4.2 22.5-2.8l19.6-25.3c5.4-6.8 4.1-16.9-2.9-22.3z\"]\n};\nvar faPhoneSquare = {\n prefix: 'fas',\n iconName: 'phone-square',\n icon: [448, 512, [], \"f098\", \"M400 32H48C21.49 32 0 53.49 0 80v352c0 26.51 21.49 48 48 48h352c26.51 0 48-21.49 48-48V80c0-26.51-21.49-48-48-48zM94 416c-7.033 0-13.057-4.873-14.616-11.627l-14.998-65a15 15 0 0 1 8.707-17.16l69.998-29.999a15 15 0 0 1 17.518 4.289l30.997 37.885c48.944-22.963 88.297-62.858 110.781-110.78l-37.886-30.997a15.001 15.001 0 0 1-4.289-17.518l30-69.998a15 15 0 0 1 17.16-8.707l65 14.998A14.997 14.997 0 0 1 384 126c0 160.292-129.945 290-290 290z\"]\n};\nvar faPhoneSquareAlt = {\n prefix: 'fas',\n iconName: 'phone-square-alt',\n icon: [448, 512, [], \"f87b\", \"M400 32H48A48 48 0 0 0 0 80v352a48 48 0 0 0 48 48h352a48 48 0 0 0 48-48V80a48 48 0 0 0-48-48zm-16.39 307.37l-15 65A15 15 0 0 1 354 416C194 416 64 286.29 64 126a15.7 15.7 0 0 1 11.63-14.61l65-15A18.23 18.23 0 0 1 144 96a16.27 16.27 0 0 1 13.79 9.09l30 70A17.9 17.9 0 0 1 189 181a17 17 0 0 1-5.5 11.61l-37.89 31a231.91 231.91 0 0 0 110.78 110.78l31-37.89A17 17 0 0 1 299 291a17.85 17.85 0 0 1 5.91 1.21l70 30A16.25 16.25 0 0 1 384 336a17.41 17.41 0 0 1-.39 3.37z\"]\n};\nvar faPhoneVolume = {\n prefix: 'fas',\n iconName: 'phone-volume',\n icon: [384, 512, [], \"f2a0\", \"M97.333 506.966c-129.874-129.874-129.681-340.252 0-469.933 5.698-5.698 14.527-6.632 21.263-2.422l64.817 40.513a17.187 17.187 0 0 1 6.849 20.958l-32.408 81.021a17.188 17.188 0 0 1-17.669 10.719l-55.81-5.58c-21.051 58.261-20.612 122.471 0 179.515l55.811-5.581a17.188 17.188 0 0 1 17.669 10.719l32.408 81.022a17.188 17.188 0 0 1-6.849 20.958l-64.817 40.513a17.19 17.19 0 0 1-21.264-2.422zM247.126 95.473c11.832 20.047 11.832 45.008 0 65.055-3.95 6.693-13.108 7.959-18.718 2.581l-5.975-5.726c-3.911-3.748-4.793-9.622-2.261-14.41a32.063 32.063 0 0 0 0-29.945c-2.533-4.788-1.65-10.662 2.261-14.41l5.975-5.726c5.61-5.378 14.768-4.112 18.718 2.581zm91.787-91.187c60.14 71.604 60.092 175.882 0 247.428-4.474 5.327-12.53 5.746-17.552.933l-5.798-5.557c-4.56-4.371-4.977-11.529-.93-16.379 49.687-59.538 49.646-145.933 0-205.422-4.047-4.85-3.631-12.008.93-16.379l5.798-5.557c5.022-4.813 13.078-4.394 17.552.933zm-45.972 44.941c36.05 46.322 36.108 111.149 0 157.546-4.39 5.641-12.697 6.251-17.856 1.304l-5.818-5.579c-4.4-4.219-4.998-11.095-1.285-15.931 26.536-34.564 26.534-82.572 0-117.134-3.713-4.836-3.115-11.711 1.285-15.931l5.818-5.579c5.159-4.947 13.466-4.337 17.856 1.304z\"]\n};\nvar faPhotoVideo = {\n prefix: 'fas',\n iconName: 'photo-video',\n icon: [640, 512, [], \"f87c\", \"M608 0H160a32 32 0 0 0-32 32v96h160V64h192v320h128a32 32 0 0 0 32-32V32a32 32 0 0 0-32-32zM232 103a9 9 0 0 1-9 9h-30a9 9 0 0 1-9-9V73a9 9 0 0 1 9-9h30a9 9 0 0 1 9 9zm352 208a9 9 0 0 1-9 9h-30a9 9 0 0 1-9-9v-30a9 9 0 0 1 9-9h30a9 9 0 0 1 9 9zm0-104a9 9 0 0 1-9 9h-30a9 9 0 0 1-9-9v-30a9 9 0 0 1 9-9h30a9 9 0 0 1 9 9zm0-104a9 9 0 0 1-9 9h-30a9 9 0 0 1-9-9V73a9 9 0 0 1 9-9h30a9 9 0 0 1 9 9zm-168 57H32a32 32 0 0 0-32 32v288a32 32 0 0 0 32 32h384a32 32 0 0 0 32-32V192a32 32 0 0 0-32-32zM96 224a32 32 0 1 1-32 32 32 32 0 0 1 32-32zm288 224H64v-32l64-64 32 32 128-128 96 96z\"]\n};\nvar faPiggyBank = {\n prefix: 'fas',\n iconName: 'piggy-bank',\n icon: [576, 512, [], \"f4d3\", \"M560 224h-29.5c-8.8-20-21.6-37.7-37.4-52.5L512 96h-32c-29.4 0-55.4 13.5-73 34.3-7.6-1.1-15.1-2.3-23-2.3H256c-77.4 0-141.9 55-156.8 128H56c-14.8 0-26.5-13.5-23.5-28.8C34.7 215.8 45.4 208 57 208h1c3.3 0 6-2.7 6-6v-20c0-3.3-2.7-6-6-6-28.5 0-53.9 20.4-57.5 48.6C-3.9 258.8 22.7 288 56 288h40c0 52.2 25.4 98.1 64 127.3V496c0 8.8 7.2 16 16 16h64c8.8 0 16-7.2 16-16v-48h128v48c0 8.8 7.2 16 16 16h64c8.8 0 16-7.2 16-16v-80.7c11.8-8.9 22.3-19.4 31.3-31.3H560c8.8 0 16-7.2 16-16V240c0-8.8-7.2-16-16-16zm-128 64c-8.8 0-16-7.2-16-16s7.2-16 16-16 16 7.2 16 16-7.2 16-16 16zM256 96h128c5.4 0 10.7.4 15.9.8 0-.3.1-.5.1-.8 0-53-43-96-96-96s-96 43-96 96c0 2.1.5 4.1.6 6.2 15.2-3.9 31-6.2 47.4-6.2z\"]\n};\nvar faPills = {\n prefix: 'fas',\n iconName: 'pills',\n icon: [576, 512, [], \"f484\", \"M112 32C50.1 32 0 82.1 0 144v224c0 61.9 50.1 112 112 112s112-50.1 112-112V144c0-61.9-50.1-112-112-112zm48 224H64V144c0-26.5 21.5-48 48-48s48 21.5 48 48v112zm139.7-29.7c-3.5-3.5-9.4-3.1-12.3.8-45.3 62.5-40.4 150.1 15.9 206.4 56.3 56.3 143.9 61.2 206.4 15.9 4-2.9 4.3-8.8.8-12.3L299.7 226.3zm229.8-19c-56.3-56.3-143.9-61.2-206.4-15.9-4 2.9-4.3 8.8-.8 12.3l210.8 210.8c3.5 3.5 9.4 3.1 12.3-.8 45.3-62.6 40.5-150.1-15.9-206.4z\"]\n};\nvar faPizzaSlice = {\n prefix: 'fas',\n iconName: 'pizza-slice',\n icon: [512, 512, [], \"f818\", \"M158.87.15c-16.16-1.52-31.2 8.42-35.33 24.12l-14.81 56.27c187.62 5.49 314.54 130.61 322.48 317l56.94-15.78c15.72-4.36 25.49-19.68 23.62-35.9C490.89 165.08 340.78 17.32 158.87.15zm-58.47 112L.55 491.64a16.21 16.21 0 0 0 20 19.75l379-105.1c-4.27-174.89-123.08-292.14-299.15-294.1zM128 416a32 32 0 1 1 32-32 32 32 0 0 1-32 32zm48-152a32 32 0 1 1 32-32 32 32 0 0 1-32 32zm104 104a32 32 0 1 1 32-32 32 32 0 0 1-32 32z\"]\n};\nvar faPlaceOfWorship = {\n prefix: 'fas',\n iconName: 'place-of-worship',\n icon: [640, 512, [], \"f67f\", \"M620.61 366.55L512 320v192h112c8.84 0 16-7.16 16-16V395.96a32 32 0 0 0-19.39-29.41zM0 395.96V496c0 8.84 7.16 16 16 16h112V320L19.39 366.55A32 32 0 0 0 0 395.96zm464.46-149.28L416 217.6V102.63c0-8.49-3.37-16.62-9.38-22.63L331.31 4.69c-6.25-6.25-16.38-6.25-22.62 0L233.38 80c-6 6-9.38 14.14-9.38 22.63V217.6l-48.46 29.08A31.997 31.997 0 0 0 160 274.12V512h96v-96c0-35.35 28.66-64 64-64s64 28.65 64 64v96h96V274.12c0-11.24-5.9-21.66-15.54-27.44z\"]\n};\nvar faPlane = {\n prefix: 'fas',\n iconName: 'plane',\n icon: [576, 512, [], \"f072\", \"M480 192H365.71L260.61 8.06A16.014 16.014 0 0 0 246.71 0h-65.5c-10.63 0-18.3 10.17-15.38 20.39L214.86 192H112l-43.2-57.6c-3.02-4.03-7.77-6.4-12.8-6.4H16.01C5.6 128-2.04 137.78.49 147.88L32 256 .49 364.12C-2.04 374.22 5.6 384 16.01 384H56c5.04 0 9.78-2.37 12.8-6.4L112 320h102.86l-49.03 171.6c-2.92 10.22 4.75 20.4 15.38 20.4h65.5c5.74 0 11.04-3.08 13.89-8.06L365.71 320H480c35.35 0 96-28.65 96-64s-60.65-64-96-64z\"]\n};\nvar faPlaneArrival = {\n prefix: 'fas',\n iconName: 'plane-arrival',\n icon: [640, 512, [], \"f5af\", \"M624 448H16c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h608c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16zM44.81 205.66l88.74 80a62.607 62.607 0 0 0 25.47 13.93l287.6 78.35c26.48 7.21 54.56 8.72 81 1.36 29.67-8.27 43.44-21.21 47.25-35.71 3.83-14.5-1.73-32.71-23.37-54.96-19.28-19.82-44.35-32.79-70.83-40l-97.51-26.56L282.8 30.22c-1.51-5.81-5.95-10.35-11.66-11.91L206.05.58c-10.56-2.88-20.9 5.32-20.71 16.44l47.92 164.21-102.2-27.84-27.59-67.88c-1.93-4.89-6.01-8.57-11.02-9.93L52.72 64.75c-10.34-2.82-20.53 5-20.72 15.88l.23 101.78c.19 8.91 6.03 17.34 12.58 23.25z\"]\n};\nvar faPlaneDeparture = {\n prefix: 'fas',\n iconName: 'plane-departure',\n icon: [640, 512, [], \"f5b0\", \"M624 448H16c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h608c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16zM80.55 341.27c6.28 6.84 15.1 10.72 24.33 10.71l130.54-.18a65.62 65.62 0 0 0 29.64-7.12l290.96-147.65c26.74-13.57 50.71-32.94 67.02-58.31 18.31-28.48 20.3-49.09 13.07-63.65-7.21-14.57-24.74-25.27-58.25-27.45-29.85-1.94-59.54 5.92-86.28 19.48l-98.51 49.99-218.7-82.06a17.799 17.799 0 0 0-18-1.11L90.62 67.29c-10.67 5.41-13.25 19.65-5.17 28.53l156.22 98.1-103.21 52.38-72.35-36.47a17.804 17.804 0 0 0-16.07.02L9.91 230.22c-10.44 5.3-13.19 19.12-5.57 28.08l76.21 82.97z\"]\n};\nvar faPlay = {\n prefix: 'fas',\n iconName: 'play',\n icon: [448, 512, [], \"f04b\", \"M424.4 214.7L72.4 6.6C43.8-10.3 0 6.1 0 47.9V464c0 37.5 40.7 60.1 72.4 41.3l352-208c31.4-18.5 31.5-64.1 0-82.6z\"]\n};\nvar faPlayCircle = {\n prefix: 'fas',\n iconName: 'play-circle',\n icon: [512, 512, [], \"f144\", \"M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm115.7 272l-176 101c-15.8 8.8-35.7-2.5-35.7-21V152c0-18.4 19.8-29.8 35.7-21l176 107c16.4 9.2 16.4 32.9 0 42z\"]\n};\nvar faPlug = {\n prefix: 'fas',\n iconName: 'plug',\n icon: [384, 512, [], \"f1e6\", \"M256 144V32c0-17.673 14.327-32 32-32s32 14.327 32 32v112h-64zm112 16H16c-8.837 0-16 7.163-16 16v32c0 8.837 7.163 16 16 16h16v32c0 77.406 54.969 141.971 128 156.796V512h64v-99.204c73.031-14.825 128-79.39 128-156.796v-32h16c8.837 0 16-7.163 16-16v-32c0-8.837-7.163-16-16-16zm-240-16V32c0-17.673-14.327-32-32-32S64 14.327 64 32v112h64z\"]\n};\nvar faPlus = {\n prefix: 'fas',\n iconName: 'plus',\n icon: [448, 512, [], \"f067\", \"M416 208H272V64c0-17.67-14.33-32-32-32h-32c-17.67 0-32 14.33-32 32v144H32c-17.67 0-32 14.33-32 32v32c0 17.67 14.33 32 32 32h144v144c0 17.67 14.33 32 32 32h32c17.67 0 32-14.33 32-32V304h144c17.67 0 32-14.33 32-32v-32c0-17.67-14.33-32-32-32z\"]\n};\nvar faPlusCircle = {\n prefix: 'fas',\n iconName: 'plus-circle',\n icon: [512, 512, [], \"f055\", \"M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm144 276c0 6.6-5.4 12-12 12h-92v92c0 6.6-5.4 12-12 12h-56c-6.6 0-12-5.4-12-12v-92h-92c-6.6 0-12-5.4-12-12v-56c0-6.6 5.4-12 12-12h92v-92c0-6.6 5.4-12 12-12h56c6.6 0 12 5.4 12 12v92h92c6.6 0 12 5.4 12 12v56z\"]\n};\nvar faPlusSquare = {\n prefix: 'fas',\n iconName: 'plus-square',\n icon: [448, 512, [], \"f0fe\", \"M400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zm-32 252c0 6.6-5.4 12-12 12h-92v92c0 6.6-5.4 12-12 12h-56c-6.6 0-12-5.4-12-12v-92H92c-6.6 0-12-5.4-12-12v-56c0-6.6 5.4-12 12-12h92v-92c0-6.6 5.4-12 12-12h56c6.6 0 12 5.4 12 12v92h92c6.6 0 12 5.4 12 12v56z\"]\n};\nvar faPodcast = {\n prefix: 'fas',\n iconName: 'podcast',\n icon: [448, 512, [], \"f2ce\", \"M267.429 488.563C262.286 507.573 242.858 512 224 512c-18.857 0-38.286-4.427-43.428-23.437C172.927 460.134 160 388.898 160 355.75c0-35.156 31.142-43.75 64-43.75s64 8.594 64 43.75c0 32.949-12.871 104.179-20.571 132.813zM156.867 288.554c-18.693-18.308-29.958-44.173-28.784-72.599 2.054-49.724 42.395-89.956 92.124-91.881C274.862 121.958 320 165.807 320 220c0 26.827-11.064 51.116-28.866 68.552-2.675 2.62-2.401 6.986.628 9.187 9.312 6.765 16.46 15.343 21.234 25.363 1.741 3.654 6.497 4.66 9.449 1.891 28.826-27.043 46.553-65.783 45.511-108.565-1.855-76.206-63.595-138.208-139.793-140.369C146.869 73.753 80 139.215 80 220c0 41.361 17.532 78.7 45.55 104.989 2.953 2.771 7.711 1.77 9.453-1.887 4.774-10.021 11.923-18.598 21.235-25.363 3.029-2.2 3.304-6.566.629-9.185zM224 0C100.204 0 0 100.185 0 224c0 89.992 52.602 165.647 125.739 201.408 4.333 2.118 9.267-1.544 8.535-6.31-2.382-15.512-4.342-30.946-5.406-44.339-.146-1.836-1.149-3.486-2.678-4.512-47.4-31.806-78.564-86.016-78.187-147.347.592-96.237 79.29-174.648 175.529-174.899C320.793 47.747 400 126.797 400 224c0 61.932-32.158 116.49-80.65 147.867-.999 14.037-3.069 30.588-5.624 47.23-.732 4.767 4.203 8.429 8.535 6.31C395.227 389.727 448 314.187 448 224 448 100.205 347.815 0 224 0zm0 160c-35.346 0-64 28.654-64 64s28.654 64 64 64 64-28.654 64-64-28.654-64-64-64z\"]\n};\nvar faPoll = {\n prefix: 'fas',\n iconName: 'poll',\n icon: [448, 512, [], \"f681\", \"M400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zM160 368c0 8.84-7.16 16-16 16h-32c-8.84 0-16-7.16-16-16V240c0-8.84 7.16-16 16-16h32c8.84 0 16 7.16 16 16v128zm96 0c0 8.84-7.16 16-16 16h-32c-8.84 0-16-7.16-16-16V144c0-8.84 7.16-16 16-16h32c8.84 0 16 7.16 16 16v224zm96 0c0 8.84-7.16 16-16 16h-32c-8.84 0-16-7.16-16-16v-64c0-8.84 7.16-16 16-16h32c8.84 0 16 7.16 16 16v64z\"]\n};\nvar faPollH = {\n prefix: 'fas',\n iconName: 'poll-h',\n icon: [448, 512, [], \"f682\", \"M448 432V80c0-26.5-21.5-48-48-48H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48zM112 192c-8.84 0-16-7.16-16-16v-32c0-8.84 7.16-16 16-16h128c8.84 0 16 7.16 16 16v32c0 8.84-7.16 16-16 16H112zm0 96c-8.84 0-16-7.16-16-16v-32c0-8.84 7.16-16 16-16h224c8.84 0 16 7.16 16 16v32c0 8.84-7.16 16-16 16H112zm0 96c-8.84 0-16-7.16-16-16v-32c0-8.84 7.16-16 16-16h64c8.84 0 16 7.16 16 16v32c0 8.84-7.16 16-16 16h-64z\"]\n};\nvar faPoo = {\n prefix: 'fas',\n iconName: 'poo',\n icon: [512, 512, [], \"f2fe\", \"M451.4 369.1C468.7 356 480 335.4 480 312c0-39.8-32.2-72-72-72h-14.1c13.4-11.7 22.1-28.8 22.1-48 0-35.3-28.7-64-64-64h-5.9c3.6-10.1 5.9-20.7 5.9-32 0-53-43-96-96-96-5.2 0-10.2.7-15.1 1.5C250.3 14.6 256 30.6 256 48c0 44.2-35.8 80-80 80h-16c-35.3 0-64 28.7-64 64 0 19.2 8.7 36.3 22.1 48H104c-39.8 0-72 32.2-72 72 0 23.4 11.3 44 28.6 57.1C26.3 374.6 0 404.1 0 440c0 39.8 32.2 72 72 72h368c39.8 0 72-32.2 72-72 0-35.9-26.3-65.4-60.6-70.9zM192 256c17.7 0 32 14.3 32 32s-14.3 32-32 32-32-14.3-32-32 14.3-32 32-32zm159.5 139C341 422.9 293 448 256 448s-85-25.1-95.5-53c-2-5.3 2-11 7.8-11h175.4c5.8 0 9.8 5.7 7.8 11zM320 320c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32z\"]\n};\nvar faPooStorm = {\n prefix: 'fas',\n iconName: 'poo-storm',\n icon: [448, 512, [], \"f75a\", \"M308 336h-57.7l17.3-64.9c2-7.6-3.7-15.1-11.6-15.1h-68c-6 0-11.1 4.5-11.9 10.4l-16 120c-1 7.2 4.6 13.6 11.9 13.6h59.3l-23 97.2c-1.8 7.6 4 14.8 11.7 14.8 4.2 0 8.2-2.2 10.4-6l88-152c4.6-8-1.2-18-10.4-18zm66.4-111.3c5.9-9.6 9.6-20.6 9.6-32.7 0-35.3-28.7-64-64-64h-5.9c3.6-10.1 5.9-20.7 5.9-32 0-53-43-96-96-96-5.2 0-10.2.7-15.1 1.5C218.3 14.6 224 30.6 224 48c0 44.2-35.8 80-80 80h-16c-35.3 0-64 28.7-64 64 0 12.1 3.7 23.1 9.6 32.7C32.6 228 0 262.2 0 304c0 44 36 80 80 80h48.3c.1-.6 0-1.2 0-1.8l16-120c3-21.8 21.7-38.2 43.7-38.2h68c13.8 0 26.5 6.3 34.9 17.2s11.2 24.8 7.6 38.1l-6.6 24.7h16c15.7 0 30.3 8.4 38.1 22 7.8 13.6 7.8 30.5 0 44l-8.1 14h30c44 0 80-36 80-80 .1-41.8-32.5-76-73.5-79.3z\"]\n};\nvar faPoop = {\n prefix: 'fas',\n iconName: 'poop',\n icon: [512, 512, [], \"f619\", \"M451.36 369.14C468.66 355.99 480 335.41 480 312c0-39.77-32.24-72-72-72h-14.07c13.42-11.73 22.07-28.78 22.07-48 0-35.35-28.65-64-64-64h-5.88c3.57-10.05 5.88-20.72 5.88-32 0-53.02-42.98-96-96-96-5.17 0-10.15.74-15.11 1.52C250.31 14.64 256 30.62 256 48c0 44.18-35.82 80-80 80h-16c-35.35 0-64 28.65-64 64 0 19.22 8.65 36.27 22.07 48H104c-39.76 0-72 32.23-72 72 0 23.41 11.34 43.99 28.64 57.14C26.31 374.62 0 404.12 0 440c0 39.76 32.24 72 72 72h368c39.76 0 72-32.24 72-72 0-35.88-26.31-65.38-60.64-70.86z\"]\n};\nvar faPortrait = {\n prefix: 'fas',\n iconName: 'portrait',\n icon: [384, 512, [], \"f3e0\", \"M336 0H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V48c0-26.5-21.5-48-48-48zM192 128c35.3 0 64 28.7 64 64s-28.7 64-64 64-64-28.7-64-64 28.7-64 64-64zm112 236.8c0 10.6-10 19.2-22.4 19.2H102.4C90 384 80 375.4 80 364.8v-19.2c0-31.8 30.1-57.6 67.2-57.6h5c12.3 5.1 25.7 8 39.8 8s27.6-2.9 39.8-8h5c37.1 0 67.2 25.8 67.2 57.6v19.2z\"]\n};\nvar faPoundSign = {\n prefix: 'fas',\n iconName: 'pound-sign',\n icon: [320, 512, [], \"f154\", \"M308 352h-45.495c-6.627 0-12 5.373-12 12v50.848H128V288h84c6.627 0 12-5.373 12-12v-40c0-6.627-5.373-12-12-12h-84v-63.556c0-32.266 24.562-57.086 61.792-57.086 23.658 0 45.878 11.505 57.652 18.849 5.151 3.213 11.888 2.051 15.688-2.685l28.493-35.513c4.233-5.276 3.279-13.005-2.119-17.081C273.124 54.56 236.576 32 187.931 32 106.026 32 48 84.742 48 157.961V224H20c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h28v128H12c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h296c6.627 0 12-5.373 12-12V364c0-6.627-5.373-12-12-12z\"]\n};\nvar faPowerOff = {\n prefix: 'fas',\n iconName: 'power-off',\n icon: [512, 512, [], \"f011\", \"M400 54.1c63 45 104 118.6 104 201.9 0 136.8-110.8 247.7-247.5 248C120 504.3 8.2 393 8 256.4 7.9 173.1 48.9 99.3 111.8 54.2c11.7-8.3 28-4.8 35 7.7L162.6 90c5.9 10.5 3.1 23.8-6.6 31-41.5 30.8-68 79.6-68 134.9-.1 92.3 74.5 168.1 168 168.1 91.6 0 168.6-74.2 168-169.1-.3-51.8-24.7-101.8-68.1-134-9.7-7.2-12.4-20.5-6.5-30.9l15.8-28.1c7-12.4 23.2-16.1 34.8-7.8zM296 264V24c0-13.3-10.7-24-24-24h-32c-13.3 0-24 10.7-24 24v240c0 13.3 10.7 24 24 24h32c13.3 0 24-10.7 24-24z\"]\n};\nvar faPray = {\n prefix: 'fas',\n iconName: 'pray',\n icon: [384, 512, [], \"f683\", \"M256 128c35.35 0 64-28.65 64-64S291.35 0 256 0s-64 28.65-64 64 28.65 64 64 64zm-30.63 169.75c14.06 16.72 39 19.09 55.97 5.22l88-72.02c17.09-13.98 19.59-39.19 5.62-56.28-13.97-17.11-39.19-19.59-56.31-5.62l-57.44 47-38.91-46.31c-15.44-18.39-39.22-27.92-64-25.33-24.19 2.48-45.25 16.27-56.37 36.92l-49.37 92.03c-23.4 43.64-8.69 96.37 34.19 123.75L131.56 432H40c-22.09 0-40 17.91-40 40s17.91 40 40 40h208c34.08 0 53.77-42.79 28.28-68.28L166.42 333.86l34.8-64.87 24.15 28.76z\"]\n};\nvar faPrayingHands = {\n prefix: 'fas',\n iconName: 'praying-hands',\n icon: [640, 512, [], \"f684\", \"M272 191.91c-17.6 0-32 14.4-32 32v80c0 8.84-7.16 16-16 16s-16-7.16-16-16v-76.55c0-17.39 4.72-34.47 13.69-49.39l77.75-129.59c9.09-15.16 4.19-34.81-10.97-43.91-14.45-8.67-32.72-4.3-42.3 9.21-.2.23-.62.21-.79.48l-117.26 175.9C117.56 205.9 112 224.31 112 243.29v80.23l-90.12 30.04A31.974 31.974 0 0 0 0 383.91v96c0 10.82 8.52 32 32 32 2.69 0 5.41-.34 8.06-1.03l179.19-46.62C269.16 449.99 304 403.8 304 351.91v-128c0-17.6-14.4-32-32-32zm346.12 161.73L528 323.6v-80.23c0-18.98-5.56-37.39-16.12-53.23L394.62 14.25c-.18-.27-.59-.24-.79-.48-9.58-13.51-27.85-17.88-42.3-9.21-15.16 9.09-20.06 28.75-10.97 43.91l77.75 129.59c8.97 14.92 13.69 32 13.69 49.39V304c0 8.84-7.16 16-16 16s-16-7.16-16-16v-80c0-17.6-14.4-32-32-32s-32 14.4-32 32v128c0 51.89 34.84 98.08 84.75 112.34l179.19 46.62c2.66.69 5.38 1.03 8.06 1.03 23.48 0 32-21.18 32-32v-96c0-13.77-8.81-25.99-21.88-30.35z\"]\n};\nvar faPrescription = {\n prefix: 'fas',\n iconName: 'prescription',\n icon: [384, 512, [], \"f5b1\", \"M301.26 352l78.06-78.06c6.25-6.25 6.25-16.38 0-22.63l-22.63-22.63c-6.25-6.25-16.38-6.25-22.63 0L256 306.74l-83.96-83.96C219.31 216.8 256 176.89 256 128c0-53.02-42.98-96-96-96H16C7.16 32 0 39.16 0 48v256c0 8.84 7.16 16 16 16h32c8.84 0 16-7.16 16-16v-80h18.75l128 128-78.06 78.06c-6.25 6.25-6.25 16.38 0 22.63l22.63 22.63c6.25 6.25 16.38 6.25 22.63 0L256 397.25l78.06 78.06c6.25 6.25 16.38 6.25 22.63 0l22.63-22.63c6.25-6.25 6.25-16.38 0-22.63L301.26 352zM64 96h96c17.64 0 32 14.36 32 32s-14.36 32-32 32H64V96z\"]\n};\nvar faPrescriptionBottle = {\n prefix: 'fas',\n iconName: 'prescription-bottle',\n icon: [384, 512, [], \"f485\", \"M32 192h120c4.4 0 8 3.6 8 8v16c0 4.4-3.6 8-8 8H32v64h120c4.4 0 8 3.6 8 8v16c0 4.4-3.6 8-8 8H32v64h120c4.4 0 8 3.6 8 8v16c0 4.4-3.6 8-8 8H32v64c0 17.6 14.4 32 32 32h256c17.6 0 32-14.4 32-32V128H32v64zM360 0H24C10.8 0 0 10.8 0 24v48c0 13.2 10.8 24 24 24h336c13.2 0 24-10.8 24-24V24c0-13.2-10.8-24-24-24z\"]\n};\nvar faPrescriptionBottleAlt = {\n prefix: 'fas',\n iconName: 'prescription-bottle-alt',\n icon: [384, 512, [], \"f486\", \"M360 0H24C10.8 0 0 10.8 0 24v48c0 13.2 10.8 24 24 24h336c13.2 0 24-10.8 24-24V24c0-13.2-10.8-24-24-24zM32 480c0 17.6 14.4 32 32 32h256c17.6 0 32-14.4 32-32V128H32v352zm64-184c0-4.4 3.6-8 8-8h56v-56c0-4.4 3.6-8 8-8h48c4.4 0 8 3.6 8 8v56h56c4.4 0 8 3.6 8 8v48c0 4.4-3.6 8-8 8h-56v56c0 4.4-3.6 8-8 8h-48c-4.4 0-8-3.6-8-8v-56h-56c-4.4 0-8-3.6-8-8v-48z\"]\n};\nvar faPrint = {\n prefix: 'fas',\n iconName: 'print',\n icon: [512, 512, [], \"f02f\", \"M448 192V77.25c0-8.49-3.37-16.62-9.37-22.63L393.37 9.37c-6-6-14.14-9.37-22.63-9.37H96C78.33 0 64 14.33 64 32v160c-35.35 0-64 28.65-64 64v112c0 8.84 7.16 16 16 16h48v96c0 17.67 14.33 32 32 32h320c17.67 0 32-14.33 32-32v-96h48c8.84 0 16-7.16 16-16V256c0-35.35-28.65-64-64-64zm-64 256H128v-96h256v96zm0-224H128V64h192v48c0 8.84 7.16 16 16 16h48v96zm48 72c-13.25 0-24-10.75-24-24 0-13.26 10.75-24 24-24s24 10.74 24 24c0 13.25-10.75 24-24 24z\"]\n};\nvar faProcedures = {\n prefix: 'fas',\n iconName: 'procedures',\n icon: [640, 512, [], \"f487\", \"M528 224H272c-8.8 0-16 7.2-16 16v144H64V144c0-8.8-7.2-16-16-16H16c-8.8 0-16 7.2-16 16v352c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16v-48h512v48c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16V336c0-61.9-50.1-112-112-112zM136 96h126.1l27.6 55.2c5.9 11.8 22.7 11.8 28.6 0L368 51.8 390.1 96H512c8.8 0 16-7.2 16-16s-7.2-16-16-16H409.9L382.3 8.8C376.4-3 359.6-3 353.7 8.8L304 108.2l-19.9-39.8c-1.4-2.7-4.1-4.4-7.2-4.4H136c-4.4 0-8 3.6-8 8v16c0 4.4 3.6 8 8 8zm24 256c35.3 0 64-28.7 64-64s-28.7-64-64-64-64 28.7-64 64 28.7 64 64 64z\"]\n};\nvar faProjectDiagram = {\n prefix: 'fas',\n iconName: 'project-diagram',\n icon: [640, 512, [], \"f542\", \"M384 320H256c-17.67 0-32 14.33-32 32v128c0 17.67 14.33 32 32 32h128c17.67 0 32-14.33 32-32V352c0-17.67-14.33-32-32-32zM192 32c0-17.67-14.33-32-32-32H32C14.33 0 0 14.33 0 32v128c0 17.67 14.33 32 32 32h95.72l73.16 128.04C211.98 300.98 232.4 288 256 288h.28L192 175.51V128h224V64H192V32zM608 0H480c-17.67 0-32 14.33-32 32v128c0 17.67 14.33 32 32 32h128c17.67 0 32-14.33 32-32V32c0-17.67-14.33-32-32-32z\"]\n};\nvar faPuzzlePiece = {\n prefix: 'fas',\n iconName: 'puzzle-piece',\n icon: [576, 512, [], \"f12e\", \"M519.442 288.651c-41.519 0-59.5 31.593-82.058 31.593C377.409 320.244 432 144 432 144s-196.288 80-196.288-3.297c0-35.827 36.288-46.25 36.288-85.985C272 19.216 243.885 0 210.539 0c-34.654 0-66.366 18.891-66.366 56.346 0 41.364 31.711 59.277 31.711 81.75C175.885 207.719 0 166.758 0 166.758v333.237s178.635 41.047 178.635-28.662c0-22.473-40-40.107-40-81.471 0-37.456 29.25-56.346 63.577-56.346 33.673 0 61.788 19.216 61.788 54.717 0 39.735-36.288 50.158-36.288 85.985 0 60.803 129.675 25.73 181.23 25.73 0 0-34.725-120.101 25.827-120.101 35.962 0 46.423 36.152 86.308 36.152C556.712 416 576 387.99 576 354.443c0-34.199-18.962-65.792-56.558-65.792z\"]\n};\nvar faQrcode = {\n prefix: 'fas',\n iconName: 'qrcode',\n icon: [448, 512, [], \"f029\", \"M0 224h192V32H0v192zM64 96h64v64H64V96zm192-64v192h192V32H256zm128 128h-64V96h64v64zM0 480h192V288H0v192zm64-128h64v64H64v-64zm352-64h32v128h-96v-32h-32v96h-64V288h96v32h64v-32zm0 160h32v32h-32v-32zm-64 0h32v32h-32v-32z\"]\n};\nvar faQuestion = {\n prefix: 'fas',\n iconName: 'question',\n icon: [384, 512, [], \"f128\", \"M202.021 0C122.202 0 70.503 32.703 29.914 91.026c-7.363 10.58-5.093 25.086 5.178 32.874l43.138 32.709c10.373 7.865 25.132 6.026 33.253-4.148 25.049-31.381 43.63-49.449 82.757-49.449 30.764 0 68.816 19.799 68.816 49.631 0 22.552-18.617 34.134-48.993 51.164-35.423 19.86-82.299 44.576-82.299 106.405V320c0 13.255 10.745 24 24 24h72.471c13.255 0 24-10.745 24-24v-5.773c0-42.86 125.268-44.645 125.268-160.627C377.504 66.256 286.902 0 202.021 0zM192 373.459c-38.196 0-69.271 31.075-69.271 69.271 0 38.195 31.075 69.27 69.271 69.27s69.271-31.075 69.271-69.271-31.075-69.27-69.271-69.27z\"]\n};\nvar faQuestionCircle = {\n prefix: 'fas',\n iconName: 'question-circle',\n icon: [512, 512, [], \"f059\", \"M504 256c0 136.997-111.043 248-248 248S8 392.997 8 256C8 119.083 119.043 8 256 8s248 111.083 248 248zM262.655 90c-54.497 0-89.255 22.957-116.549 63.758-3.536 5.286-2.353 12.415 2.715 16.258l34.699 26.31c5.205 3.947 12.621 3.008 16.665-2.122 17.864-22.658 30.113-35.797 57.303-35.797 20.429 0 45.698 13.148 45.698 32.958 0 14.976-12.363 22.667-32.534 33.976C247.128 238.528 216 254.941 216 296v4c0 6.627 5.373 12 12 12h56c6.627 0 12-5.373 12-12v-1.333c0-28.462 83.186-29.647 83.186-106.667 0-58.002-60.165-102-116.531-102zM256 338c-25.365 0-46 20.635-46 46 0 25.364 20.635 46 46 46s46-20.636 46-46c0-25.365-20.635-46-46-46z\"]\n};\nvar faQuidditch = {\n prefix: 'fas',\n iconName: 'quidditch',\n icon: [640, 512, [], \"f458\", \"M256.5 216.8L343.2 326s-16.6 102.4-76.6 150.1C206.7 523.8 0 510.2 0 510.2s3.8-23.1 11-55.4l94.6-112.2c4-4.7-.9-11.6-6.6-9.5l-60.4 22.1c14.4-41.7 32.7-80 54.6-97.5 59.9-47.8 163.3-40.9 163.3-40.9zm238 135c-44 0-79.8 35.8-79.8 79.9 0 44.1 35.7 79.9 79.8 79.9 44.1 0 79.8-35.8 79.8-79.9 0-44.2-35.8-79.9-79.8-79.9zM636.5 31L616.7 6c-5.5-6.9-15.5-8-22.4-2.6L361.8 181.3l-34.1-43c-5.1-6.4-15.1-5.2-18.6 2.2l-25.3 54.6 86.7 109.2 58.8-12.4c8-1.7 11.4-11.2 6.3-17.6l-34.1-42.9L634 53.5c6.9-5.5 8-15.6 2.5-22.5z\"]\n};\nvar faQuoteLeft = {\n prefix: 'fas',\n iconName: 'quote-left',\n icon: [512, 512, [], \"f10d\", \"M464 256h-80v-64c0-35.3 28.7-64 64-64h8c13.3 0 24-10.7 24-24V56c0-13.3-10.7-24-24-24h-8c-88.4 0-160 71.6-160 160v240c0 26.5 21.5 48 48 48h128c26.5 0 48-21.5 48-48V304c0-26.5-21.5-48-48-48zm-288 0H96v-64c0-35.3 28.7-64 64-64h8c13.3 0 24-10.7 24-24V56c0-13.3-10.7-24-24-24h-8C71.6 32 0 103.6 0 192v240c0 26.5 21.5 48 48 48h128c26.5 0 48-21.5 48-48V304c0-26.5-21.5-48-48-48z\"]\n};\nvar faQuoteRight = {\n prefix: 'fas',\n iconName: 'quote-right',\n icon: [512, 512, [], \"f10e\", \"M464 32H336c-26.5 0-48 21.5-48 48v128c0 26.5 21.5 48 48 48h80v64c0 35.3-28.7 64-64 64h-8c-13.3 0-24 10.7-24 24v48c0 13.3 10.7 24 24 24h8c88.4 0 160-71.6 160-160V80c0-26.5-21.5-48-48-48zm-288 0H48C21.5 32 0 53.5 0 80v128c0 26.5 21.5 48 48 48h80v64c0 35.3-28.7 64-64 64h-8c-13.3 0-24 10.7-24 24v48c0 13.3 10.7 24 24 24h8c88.4 0 160-71.6 160-160V80c0-26.5-21.5-48-48-48z\"]\n};\nvar faQuran = {\n prefix: 'fas',\n iconName: 'quran',\n icon: [448, 512, [], \"f687\", \"M448 358.4V25.6c0-16-9.6-25.6-25.6-25.6H96C41.6 0 0 41.6 0 96v320c0 54.4 41.6 96 96 96h326.4c12.8 0 25.6-9.6 25.6-25.6v-16c0-6.4-3.2-12.8-9.6-19.2-3.2-16-3.2-60.8 0-73.6 6.4-3.2 9.6-9.6 9.6-19.2zM301.08 145.82c.6-1.21 1.76-1.82 2.92-1.82s2.32.61 2.92 1.82l11.18 22.65 25 3.63c2.67.39 3.74 3.67 1.81 5.56l-18.09 17.63 4.27 24.89c.36 2.11-1.31 3.82-3.21 3.82-.5 0-1.02-.12-1.52-.38L304 211.87l-22.36 11.75c-.5.26-1.02.38-1.52.38-1.9 0-3.57-1.71-3.21-3.82l4.27-24.89-18.09-17.63c-1.94-1.89-.87-5.17 1.81-5.56l24.99-3.63 11.19-22.65zm-57.89-69.01c13.67 0 27.26 2.49 40.38 7.41a6.775 6.775 0 1 1-2.38 13.12c-.67 0-3.09-.21-4.13-.21-52.31 0-94.86 42.55-94.86 94.86 0 52.3 42.55 94.86 94.86 94.86 1.03 0 3.48-.21 4.13-.21 3.93 0 6.8 3.14 6.8 6.78 0 2.98-1.94 5.51-4.62 6.42-13.07 4.87-26.59 7.34-40.19 7.34C179.67 307.19 128 255.51 128 192c0-63.52 51.67-115.19 115.19-115.19zM380.8 448H96c-19.2 0-32-12.8-32-32s16-32 32-32h284.8v64z\"]\n};\nvar faRadiation = {\n prefix: 'fas',\n iconName: 'radiation',\n icon: [496, 512, [], \"f7b9\", \"M328.2 255.8h151.6c9.1 0 16.8-7.7 16.2-16.8-5.1-75.8-44.4-142.2-102.5-184.2-7.4-5.3-17.9-2.9-22.7 4.8L290.4 188c22.6 14.3 37.8 39.2 37.8 67.8zm-37.8 67.7c-12.3 7.7-26.8 12.4-42.4 12.4-15.6 0-30-4.7-42.4-12.4L125.2 452c-4.8 7.7-2.4 18.1 5.6 22.4C165.7 493.2 205.6 504 248 504s82.3-10.8 117.2-29.6c8-4.3 10.4-14.8 5.6-22.4l-80.4-128.5zM248 303.8c26.5 0 48-21.5 48-48s-21.5-48-48-48-48 21.5-48 48 21.5 48 48 48zm-231.8-48h151.6c0-28.6 15.2-53.5 37.8-67.7L125.2 59.7c-4.8-7.7-15.3-10.2-22.7-4.8C44.4 96.9 5.1 163.3 0 239.1c-.6 9 7.1 16.7 16.2 16.7z\"]\n};\nvar faRadiationAlt = {\n prefix: 'fas',\n iconName: 'radiation-alt',\n icon: [496, 512, [], \"f7ba\", \"M312 256h79.1c9.2 0 16.9-7.7 16-16.8-4.6-43.6-27-81.8-59.5-107.8-7.6-6.1-18.8-4.5-24 3.8L281.9 202c18 11.2 30.1 31.2 30.1 54zm-97.8 54.1L172.4 377c-4.9 7.8-2.4 18.4 5.8 22.5 21.1 10.4 44.7 16.5 69.8 16.5s48.7-6.1 69.9-16.5c8.2-4.1 10.6-14.7 5.8-22.5l-41.8-66.9c-9.8 6.2-21.4 9.9-33.8 9.9s-24.1-3.7-33.9-9.9zM104.9 256H184c0-22.8 12.1-42.8 30.2-54.1l-41.7-66.8c-5.2-8.3-16.4-9.9-24-3.8-32.6 26-54.9 64.2-59.5 107.8-1.1 9.2 6.7 16.9 15.9 16.9zM248 504c137 0 248-111 248-248S385 8 248 8 0 119 0 256s111 248 248 248zm0-432c101.5 0 184 82.5 184 184s-82.5 184-184 184S64 357.5 64 256 146.5 72 248 72zm0 216c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32z\"]\n};\nvar faRainbow = {\n prefix: 'fas',\n iconName: 'rainbow',\n icon: [576, 512, [], \"f75b\", \"M268.3 32.7C115.4 42.9 0 176.9 0 330.2V464c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16V320C64 186.8 180.9 80.3 317.5 97.9 430.4 112.4 512 214 512 327.8V464c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16V320c0-165.3-140-298.6-307.7-287.3zm-5.6 96.9C166 142 96 229.1 96 326.7V464c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16V320c0-74.8 64.5-134.8 140.8-127.4 66.5 6.5 115.2 66.2 115.2 133.1V464c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16V320c0-114.2-100.2-205.4-217.3-190.4zm6.2 96.3c-45.6 8.9-76.9 51.5-76.9 97.9V464c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16V320c0-17.6 14.3-32 32-32s32 14.4 32 32v144c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16V320c0-59.2-53.8-106-115.1-94.1z\"]\n};\nvar faRandom = {\n prefix: 'fas',\n iconName: 'random',\n icon: [512, 512, [], \"f074\", \"M504.971 359.029c9.373 9.373 9.373 24.569 0 33.941l-80 79.984c-15.01 15.01-40.971 4.49-40.971-16.971V416h-58.785a12.004 12.004 0 0 1-8.773-3.812l-70.556-75.596 53.333-57.143L352 336h32v-39.981c0-21.438 25.943-31.998 40.971-16.971l80 79.981zM12 176h84l52.781 56.551 53.333-57.143-70.556-75.596A11.999 11.999 0 0 0 122.785 96H12c-6.627 0-12 5.373-12 12v56c0 6.627 5.373 12 12 12zm372 0v39.984c0 21.46 25.961 31.98 40.971 16.971l80-79.984c9.373-9.373 9.373-24.569 0-33.941l-80-79.981C409.943 24.021 384 34.582 384 56.019V96h-58.785a12.004 12.004 0 0 0-8.773 3.812L96 336H12c-6.627 0-12 5.373-12 12v56c0 6.627 5.373 12 12 12h110.785c3.326 0 6.503-1.381 8.773-3.812L352 176h32z\"]\n};\nvar faReceipt = {\n prefix: 'fas',\n iconName: 'receipt',\n icon: [384, 512, [], \"f543\", \"M358.4 3.2L320 48 265.6 3.2a15.9 15.9 0 0 0-19.2 0L192 48 137.6 3.2a15.9 15.9 0 0 0-19.2 0L64 48 25.6 3.2C15-4.7 0 2.8 0 16v480c0 13.2 15 20.7 25.6 12.8L64 464l54.4 44.8a15.9 15.9 0 0 0 19.2 0L192 464l54.4 44.8a15.9 15.9 0 0 0 19.2 0L320 464l38.4 44.8c10.5 7.9 25.6.4 25.6-12.8V16c0-13.2-15-20.7-25.6-12.8zM320 360c0 4.4-3.6 8-8 8H72c-4.4 0-8-3.6-8-8v-16c0-4.4 3.6-8 8-8h240c4.4 0 8 3.6 8 8v16zm0-96c0 4.4-3.6 8-8 8H72c-4.4 0-8-3.6-8-8v-16c0-4.4 3.6-8 8-8h240c4.4 0 8 3.6 8 8v16zm0-96c0 4.4-3.6 8-8 8H72c-4.4 0-8-3.6-8-8v-16c0-4.4 3.6-8 8-8h240c4.4 0 8 3.6 8 8v16z\"]\n};\nvar faRecycle = {\n prefix: 'fas',\n iconName: 'recycle',\n icon: [512, 512, [], \"f1b8\", \"M184.561 261.903c3.232 13.997-12.123 24.635-24.068 17.168l-40.736-25.455-50.867 81.402C55.606 356.273 70.96 384 96.012 384H148c6.627 0 12 5.373 12 12v40c0 6.627-5.373 12-12 12H96.115c-75.334 0-121.302-83.048-81.408-146.88l50.822-81.388-40.725-25.448c-12.081-7.547-8.966-25.961 4.879-29.158l110.237-25.45c8.611-1.988 17.201 3.381 19.189 11.99l25.452 110.237zm98.561-182.915l41.289 66.076-40.74 25.457c-12.051 7.528-9 25.953 4.879 29.158l110.237 25.45c8.672 1.999 17.215-3.438 19.189-11.99l25.45-110.237c3.197-13.844-11.99-24.719-24.068-17.168l-40.687 25.424-41.263-66.082c-37.521-60.033-125.209-60.171-162.816 0l-17.963 28.766c-3.51 5.62-1.8 13.021 3.82 16.533l33.919 21.195c5.62 3.512 13.024 1.803 16.536-3.817l17.961-28.743c12.712-20.341 41.973-19.676 54.257-.022zM497.288 301.12l-27.515-44.065c-3.511-5.623-10.916-7.334-16.538-3.821l-33.861 21.159c-5.62 3.512-7.33 10.915-3.818 16.536l27.564 44.112c13.257 21.211-2.057 48.96-27.136 48.96H320V336.02c0-14.213-17.242-21.383-27.313-11.313l-80 79.981c-6.249 6.248-6.249 16.379 0 22.627l80 79.989C302.689 517.308 320 510.3 320 495.989V448h95.88c75.274 0 121.335-82.997 81.408-146.88z\"]\n};\nvar faRedo = {\n prefix: 'fas',\n iconName: 'redo',\n icon: [512, 512, [], \"f01e\", \"M500.33 0h-47.41a12 12 0 0 0-12 12.57l4 82.76A247.42 247.42 0 0 0 256 8C119.34 8 7.9 119.53 8 256.19 8.1 393.07 119.1 504 256 504a247.1 247.1 0 0 0 166.18-63.91 12 12 0 0 0 .48-17.43l-34-34a12 12 0 0 0-16.38-.55A176 176 0 1 1 402.1 157.8l-101.53-4.87a12 12 0 0 0-12.57 12v47.41a12 12 0 0 0 12 12h200.33a12 12 0 0 0 12-12V12a12 12 0 0 0-12-12z\"]\n};\nvar faRedoAlt = {\n prefix: 'fas',\n iconName: 'redo-alt',\n icon: [512, 512, [], \"f2f9\", \"M256.455 8c66.269.119 126.437 26.233 170.859 68.685l35.715-35.715C478.149 25.851 504 36.559 504 57.941V192c0 13.255-10.745 24-24 24H345.941c-21.382 0-32.09-25.851-16.971-40.971l41.75-41.75c-30.864-28.899-70.801-44.907-113.23-45.273-92.398-.798-170.283 73.977-169.484 169.442C88.764 348.009 162.184 424 256 424c41.127 0 79.997-14.678 110.629-41.556 4.743-4.161 11.906-3.908 16.368.553l39.662 39.662c4.872 4.872 4.631 12.815-.482 17.433C378.202 479.813 319.926 504 256 504 119.034 504 8.001 392.967 8 256.002 7.999 119.193 119.646 7.755 256.455 8z\"]\n};\nvar faRegistered = {\n prefix: 'fas',\n iconName: 'registered',\n icon: [512, 512, [], \"f25d\", \"M285.363 207.475c0 18.6-9.831 28.431-28.431 28.431h-29.876v-56.14h23.378c28.668 0 34.929 8.773 34.929 27.709zM504 256c0 136.967-111.033 248-248 248S8 392.967 8 256 119.033 8 256 8s248 111.033 248 248zM363.411 360.414c-46.729-84.825-43.299-78.636-44.702-80.98 23.432-15.172 37.945-42.979 37.945-74.486 0-54.244-31.5-89.252-105.498-89.252h-70.667c-13.255 0-24 10.745-24 24V372c0 13.255 10.745 24 24 24h22.567c13.255 0 24-10.745 24-24v-71.663h25.556l44.129 82.937a24.001 24.001 0 0 0 21.188 12.727h24.464c18.261-.001 29.829-19.591 21.018-35.587z\"]\n};\nvar faRemoveFormat = {\n prefix: 'fas',\n iconName: 'remove-format',\n icon: [640, 512, [], \"f87d\", \"M336 416h-11.17l9.26-27.77L267 336.4 240.49 416H208a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h128a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm297.82 42.1L377 259.59 426.17 112H544v32a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16V48a16 16 0 0 0-16-16H176a16 16 0 0 0-16 16v43.9L45.46 3.38A16 16 0 0 0 23 6.19L3.37 31.46a16 16 0 0 0 2.81 22.45l588.36 454.72a16 16 0 0 0 22.46-2.81l19.64-25.27a16 16 0 0 0-2.82-22.45zM309.91 207.76L224 141.36V112h117.83z\"]\n};\nvar faReply = {\n prefix: 'fas',\n iconName: 'reply',\n icon: [512, 512, [], \"f3e5\", \"M8.309 189.836L184.313 37.851C199.719 24.546 224 35.347 224 56.015v80.053c160.629 1.839 288 34.032 288 186.258 0 61.441-39.581 122.309-83.333 154.132-13.653 9.931-33.111-2.533-28.077-18.631 45.344-145.012-21.507-183.51-176.59-185.742V360c0 20.7-24.3 31.453-39.687 18.164l-176.004-152c-11.071-9.562-11.086-26.753 0-36.328z\"]\n};\nvar faReplyAll = {\n prefix: 'fas',\n iconName: 'reply-all',\n icon: [576, 512, [], \"f122\", \"M136.309 189.836L312.313 37.851C327.72 24.546 352 35.348 352 56.015v82.763c129.182 10.231 224 52.212 224 183.548 0 61.441-39.582 122.309-83.333 154.132-13.653 9.931-33.111-2.533-28.077-18.631 38.512-123.162-3.922-169.482-112.59-182.015v84.175c0 20.701-24.3 31.453-39.687 18.164L136.309 226.164c-11.071-9.561-11.086-26.753 0-36.328zm-128 36.328L184.313 378.15C199.7 391.439 224 380.687 224 359.986v-15.818l-108.606-93.785A55.96 55.96 0 0 1 96 207.998a55.953 55.953 0 0 1 19.393-42.38L224 71.832V56.015c0-20.667-24.28-31.469-39.687-18.164L8.309 189.836c-11.086 9.575-11.071 26.767 0 36.328z\"]\n};\nvar faRepublican = {\n prefix: 'fas',\n iconName: 'republican',\n icon: [640, 512, [], \"f75e\", \"M544 192c0-88.4-71.6-160-160-160H160C71.6 32 0 103.6 0 192v64h544v-64zm-367.7-21.6l-19.8 19.3 4.7 27.3c.8 4.9-4.3 8.6-8.7 6.3L128 210.4l-24.5 12.9c-4.3 2.3-9.5-1.4-8.7-6.3l4.7-27.3-19.8-19.3c-3.6-3.5-1.6-9.5 3.3-10.2l27.4-4 12.2-24.8c2.2-4.5 8.6-4.4 10.7 0l12.2 24.8 27.4 4c5 .7 6.9 6.7 3.4 10.2zm144 0l-19.8 19.3 4.7 27.3c.8 4.9-4.3 8.6-8.7 6.3L272 210.4l-24.5 12.9c-4.3 2.3-9.5-1.4-8.7-6.3l4.7-27.3-19.8-19.3c-3.6-3.5-1.6-9.5 3.3-10.2l27.4-4 12.2-24.8c2.2-4.5 8.6-4.4 10.7 0l12.2 24.8 27.4 4c5 .7 6.9 6.7 3.4 10.2zm144 0l-19.8 19.3 4.7 27.3c.8 4.9-4.3 8.6-8.7 6.3L416 210.4l-24.5 12.9c-4.3 2.3-9.5-1.4-8.7-6.3l4.7-27.3-19.8-19.3c-3.6-3.5-1.6-9.5 3.3-10.2l27.4-4 12.2-24.8c2.2-4.5 8.6-4.4 10.7 0l12.2 24.8 27.4 4c5 .7 6.9 6.7 3.4 10.2zM624 320h-32c-8.8 0-16 7.2-16 16v64c0 8.8-7.2 16-16 16s-16-7.2-16-16V288H0v176c0 8.8 7.2 16 16 16h96c8.8 0 16-7.2 16-16v-80h192v80c0 8.8 7.2 16 16 16h96c8.8 0 16-7.2 16-16V352h32v43.3c0 41.8 30 80.1 71.6 84.3 47.8 4.9 88.4-32.7 88.4-79.6v-64c0-8.8-7.2-16-16-16z\"]\n};\nvar faRestroom = {\n prefix: 'fas',\n iconName: 'restroom',\n icon: [640, 512, [], \"f7bd\", \"M128 128c35.3 0 64-28.7 64-64S163.3 0 128 0 64 28.7 64 64s28.7 64 64 64zm384 0c35.3 0 64-28.7 64-64S547.3 0 512 0s-64 28.7-64 64 28.7 64 64 64zm127.3 226.5l-45.6-185.8c-3.3-13.5-15.5-23-29.8-24.2-15 9.7-32.8 15.5-52 15.5-19.2 0-37-5.8-52-15.5-14.3 1.2-26.5 10.7-29.8 24.2l-45.6 185.8C381 369.6 393 384 409.2 384H464v104c0 13.3 10.7 24 24 24h48c13.3 0 24-10.7 24-24V384h54.8c16.2 0 28.2-14.4 24.5-29.5zM336 0h-32c-8.8 0-16 7.2-16 16v480c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16V16c0-8.8-7.2-16-16-16zM180.1 144.4c-15 9.8-32.9 15.6-52.1 15.6-19.2 0-37.1-5.8-52.1-15.6C51.3 146.5 32 166.9 32 192v136c0 13.3 10.7 24 24 24h8v136c0 13.3 10.7 24 24 24h80c13.3 0 24-10.7 24-24V352h8c13.3 0 24-10.7 24-24V192c0-25.1-19.3-45.5-43.9-47.6z\"]\n};\nvar faRetweet = {\n prefix: 'fas',\n iconName: 'retweet',\n icon: [640, 512, [], \"f079\", \"M629.657 343.598L528.971 444.284c-9.373 9.372-24.568 9.372-33.941 0L394.343 343.598c-9.373-9.373-9.373-24.569 0-33.941l10.823-10.823c9.562-9.562 25.133-9.34 34.419.492L480 342.118V160H292.451a24.005 24.005 0 0 1-16.971-7.029l-16-16C244.361 121.851 255.069 96 276.451 96H520c13.255 0 24 10.745 24 24v222.118l40.416-42.792c9.285-9.831 24.856-10.054 34.419-.492l10.823 10.823c9.372 9.372 9.372 24.569-.001 33.941zm-265.138 15.431A23.999 23.999 0 0 0 347.548 352H160V169.881l40.416 42.792c9.286 9.831 24.856 10.054 34.419.491l10.822-10.822c9.373-9.373 9.373-24.569 0-33.941L144.971 67.716c-9.373-9.373-24.569-9.373-33.941 0L10.343 168.402c-9.373 9.373-9.373 24.569 0 33.941l10.822 10.822c9.562 9.562 25.133 9.34 34.419-.491L96 169.881V392c0 13.255 10.745 24 24 24h243.549c21.382 0 32.09-25.851 16.971-40.971l-16.001-16z\"]\n};\nvar faRibbon = {\n prefix: 'fas',\n iconName: 'ribbon',\n icon: [448, 512, [], \"f4d6\", \"M6.1 444.3c-9.6 10.8-7.5 27.6 4.5 35.7l68.8 27.9c9.9 6.7 23.3 5 31.3-3.8l91.8-101.9-79.2-87.9-117.2 130zm435.8 0s-292-324.6-295.4-330.1c15.4-8.4 40.2-17.9 77.5-17.9s62.1 9.5 77.5 17.9c-3.3 5.6-56 64.6-56 64.6l79.1 87.7 34.2-38c28.7-31.9 33.3-78.6 11.4-115.5l-43.7-73.5c-4.3-7.2-9.9-13.3-16.8-18-40.7-27.6-127.4-29.7-171.4 0-6.9 4.7-12.5 10.8-16.8 18l-43.6 73.2c-1.5 2.5-37.1 62.2 11.5 116L337.5 504c8 8.9 21.4 10.5 31.3 3.8l68.8-27.9c11.9-8 14-24.8 4.3-35.6z\"]\n};\nvar faRing = {\n prefix: 'fas',\n iconName: 'ring',\n icon: [512, 512, [], \"f70b\", \"M256 64C110.06 64 0 125.91 0 208v98.13C0 384.48 114.62 448 256 448s256-63.52 256-141.87V208c0-82.09-110.06-144-256-144zm0 64c106.04 0 192 35.82 192 80 0 9.26-3.97 18.12-10.91 26.39C392.15 208.21 328.23 192 256 192s-136.15 16.21-181.09 42.39C67.97 226.12 64 217.26 64 208c0-44.18 85.96-80 192-80zM120.43 264.64C155.04 249.93 201.64 240 256 240s100.96 9.93 135.57 24.64C356.84 279.07 308.93 288 256 288s-100.84-8.93-135.57-23.36z\"]\n};\nvar faRoad = {\n prefix: 'fas',\n iconName: 'road',\n icon: [576, 512, [], \"f018\", \"M573.19 402.67l-139.79-320C428.43 71.29 417.6 64 405.68 64h-97.59l2.45 23.16c.5 4.72-3.21 8.84-7.96 8.84h-29.16c-4.75 0-8.46-4.12-7.96-8.84L267.91 64h-97.59c-11.93 0-22.76 7.29-27.73 18.67L2.8 402.67C-6.45 423.86 8.31 448 30.54 448h196.84l10.31-97.68c.86-8.14 7.72-14.32 15.91-14.32h68.8c8.19 0 15.05 6.18 15.91 14.32L348.62 448h196.84c22.23 0 36.99-24.14 27.73-45.33zM260.4 135.16a8 8 0 0 1 7.96-7.16h39.29c4.09 0 7.53 3.09 7.96 7.16l4.6 43.58c.75 7.09-4.81 13.26-11.93 13.26h-40.54c-7.13 0-12.68-6.17-11.93-13.26l4.59-43.58zM315.64 304h-55.29c-9.5 0-16.91-8.23-15.91-17.68l5.07-48c.86-8.14 7.72-14.32 15.91-14.32h45.15c8.19 0 15.05 6.18 15.91 14.32l5.07 48c1 9.45-6.41 17.68-15.91 17.68z\"]\n};\nvar faRobot = {\n prefix: 'fas',\n iconName: 'robot',\n icon: [640, 512, [], \"f544\", \"M0 256v128c0 17.7 14.3 32 32 32h32V224H32c-17.7 0-32 14.3-32 32zM464 96H352V32c0-17.7-14.3-32-32-32s-32 14.3-32 32v64H176c-44.2 0-80 35.8-80 80v272c0 35.3 28.7 64 64 64h320c35.3 0 64-28.7 64-64V176c0-44.2-35.8-80-80-80zM256 416h-64v-32h64v32zm-32-120c-22.1 0-40-17.9-40-40s17.9-40 40-40 40 17.9 40 40-17.9 40-40 40zm128 120h-64v-32h64v32zm96 0h-64v-32h64v32zm-32-120c-22.1 0-40-17.9-40-40s17.9-40 40-40 40 17.9 40 40-17.9 40-40 40zm192-72h-32v192h32c17.7 0 32-14.3 32-32V256c0-17.7-14.3-32-32-32z\"]\n};\nvar faRocket = {\n prefix: 'fas',\n iconName: 'rocket',\n icon: [512, 512, [], \"f135\", \"M505.05 19.1a15.89 15.89 0 0 0-12.2-12.2C460.65 0 435.46 0 410.36 0c-103.2 0-165.1 55.2-211.29 128H94.87A48 48 0 0 0 52 154.49l-49.42 98.8A24 24 0 0 0 24.07 288h103.77l-22.47 22.47a32 32 0 0 0 0 45.25l50.9 50.91a32 32 0 0 0 45.26 0L224 384.16V488a24 24 0 0 0 34.7 21.49l98.7-49.39a47.91 47.91 0 0 0 26.5-42.9V312.79c72.59-46.3 128-108.4 128-211.09.1-25.2.1-50.4-6.85-82.6zM384 168a40 40 0 1 1 40-40 40 40 0 0 1-40 40z\"]\n};\nvar faRoute = {\n prefix: 'fas',\n iconName: 'route',\n icon: [512, 512, [], \"f4d7\", \"M416 320h-96c-17.6 0-32-14.4-32-32s14.4-32 32-32h96s96-107 96-160-43-96-96-96-96 43-96 96c0 25.5 22.2 63.4 45.3 96H320c-52.9 0-96 43.1-96 96s43.1 96 96 96h96c17.6 0 32 14.4 32 32s-14.4 32-32 32H185.5c-16 24.8-33.8 47.7-47.3 64H416c52.9 0 96-43.1 96-96s-43.1-96-96-96zm0-256c17.7 0 32 14.3 32 32s-14.3 32-32 32-32-14.3-32-32 14.3-32 32-32zM96 256c-53 0-96 43-96 96s96 160 96 160 96-107 96-160-43-96-96-96zm0 128c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32z\"]\n};\nvar faRss = {\n prefix: 'fas',\n iconName: 'rss',\n icon: [448, 512, [], \"f09e\", \"M128.081 415.959c0 35.369-28.672 64.041-64.041 64.041S0 451.328 0 415.959s28.672-64.041 64.041-64.041 64.04 28.673 64.04 64.041zm175.66 47.25c-8.354-154.6-132.185-278.587-286.95-286.95C7.656 175.765 0 183.105 0 192.253v48.069c0 8.415 6.49 15.472 14.887 16.018 111.832 7.284 201.473 96.702 208.772 208.772.547 8.397 7.604 14.887 16.018 14.887h48.069c9.149.001 16.489-7.655 15.995-16.79zm144.249.288C439.596 229.677 251.465 40.445 16.503 32.01 7.473 31.686 0 38.981 0 48.016v48.068c0 8.625 6.835 15.645 15.453 15.999 191.179 7.839 344.627 161.316 352.465 352.465.353 8.618 7.373 15.453 15.999 15.453h48.068c9.034-.001 16.329-7.474 16.005-16.504z\"]\n};\nvar faRssSquare = {\n prefix: 'fas',\n iconName: 'rss-square',\n icon: [448, 512, [], \"f143\", \"M400 32H48C21.49 32 0 53.49 0 80v352c0 26.51 21.49 48 48 48h352c26.51 0 48-21.49 48-48V80c0-26.51-21.49-48-48-48zM112 416c-26.51 0-48-21.49-48-48s21.49-48 48-48 48 21.49 48 48-21.49 48-48 48zm157.533 0h-34.335c-6.011 0-11.051-4.636-11.442-10.634-5.214-80.05-69.243-143.92-149.123-149.123-5.997-.39-10.633-5.431-10.633-11.441v-34.335c0-6.535 5.468-11.777 11.994-11.425 110.546 5.974 198.997 94.536 204.964 204.964.352 6.526-4.89 11.994-11.425 11.994zm103.027 0h-34.334c-6.161 0-11.175-4.882-11.427-11.038-5.598-136.535-115.204-246.161-251.76-251.76C68.882 152.949 64 147.935 64 141.774V107.44c0-6.454 5.338-11.664 11.787-11.432 167.83 6.025 302.21 141.191 308.205 308.205.232 6.449-4.978 11.787-11.432 11.787z\"]\n};\nvar faRubleSign = {\n prefix: 'fas',\n iconName: 'ruble-sign',\n icon: [384, 512, [], \"f158\", \"M239.36 320C324.48 320 384 260.542 384 175.071S324.48 32 239.36 32H76c-6.627 0-12 5.373-12 12v206.632H12c-6.627 0-12 5.373-12 12V308c0 6.627 5.373 12 12 12h52v32H12c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h52v52c0 6.627 5.373 12 12 12h58.56c6.627 0 12-5.373 12-12v-52H308c6.627 0 12-5.373 12-12v-40c0-6.627-5.373-12-12-12H146.56v-32h92.8zm-92.8-219.252h78.72c46.72 0 74.88 29.11 74.88 74.323 0 45.832-28.16 75.561-76.16 75.561h-77.44V100.748z\"]\n};\nvar faRuler = {\n prefix: 'fas',\n iconName: 'ruler',\n icon: [640, 512, [], \"f545\", \"M635.7 167.2L556.1 31.7c-8.8-15-28.3-20.1-43.5-11.5l-69 39.1L503.3 161c2.2 3.8.9 8.5-2.9 10.7l-13.8 7.8c-3.8 2.2-8.7.9-10.9-2.9L416 75l-55.2 31.3 27.9 47.4c2.2 3.8.9 8.5-2.9 10.7l-13.8 7.8c-3.8 2.2-8.7.9-10.9-2.9L333.2 122 278 153.3 337.8 255c2.2 3.7.9 8.5-2.9 10.7l-13.8 7.8c-3.8 2.2-8.7.9-10.9-2.9l-59.7-101.7-55.2 31.3 27.9 47.4c2.2 3.8.9 8.5-2.9 10.7l-13.8 7.8c-3.8 2.2-8.7.9-10.9-2.9l-27.9-47.5-55.2 31.3 59.7 101.7c2.2 3.7.9 8.5-2.9 10.7l-13.8 7.8c-3.8 2.2-8.7.9-10.9-2.9L84.9 262.9l-69 39.1C.7 310.7-4.6 329.8 4.2 344.8l79.6 135.6c8.8 15 28.3 20.1 43.5 11.5L624.1 210c15.2-8.6 20.4-27.8 11.6-42.8z\"]\n};\nvar faRulerCombined = {\n prefix: 'fas',\n iconName: 'ruler-combined',\n icon: [512, 512, [], \"f546\", \"M160 288h-56c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h56v-64h-56c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h56V96h-56c-4.42 0-8-3.58-8-8V72c0-4.42 3.58-8 8-8h56V32c0-17.67-14.33-32-32-32H32C14.33 0 0 14.33 0 32v448c0 2.77.91 5.24 1.57 7.8L160 329.38V288zm320 64h-32v56c0 4.42-3.58 8-8 8h-16c-4.42 0-8-3.58-8-8v-56h-64v56c0 4.42-3.58 8-8 8h-16c-4.42 0-8-3.58-8-8v-56h-64v56c0 4.42-3.58 8-8 8h-16c-4.42 0-8-3.58-8-8v-56h-41.37L24.2 510.43c2.56.66 5.04 1.57 7.8 1.57h448c17.67 0 32-14.33 32-32v-96c0-17.67-14.33-32-32-32z\"]\n};\nvar faRulerHorizontal = {\n prefix: 'fas',\n iconName: 'ruler-horizontal',\n icon: [576, 512, [], \"f547\", \"M544 128h-48v88c0 4.42-3.58 8-8 8h-16c-4.42 0-8-3.58-8-8v-88h-64v88c0 4.42-3.58 8-8 8h-16c-4.42 0-8-3.58-8-8v-88h-64v88c0 4.42-3.58 8-8 8h-16c-4.42 0-8-3.58-8-8v-88h-64v88c0 4.42-3.58 8-8 8h-16c-4.42 0-8-3.58-8-8v-88h-64v88c0 4.42-3.58 8-8 8H88c-4.42 0-8-3.58-8-8v-88H32c-17.67 0-32 14.33-32 32v192c0 17.67 14.33 32 32 32h512c17.67 0 32-14.33 32-32V160c0-17.67-14.33-32-32-32z\"]\n};\nvar faRulerVertical = {\n prefix: 'fas',\n iconName: 'ruler-vertical',\n icon: [256, 512, [], \"f548\", \"M168 416c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h88v-64h-88c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h88v-64h-88c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h88v-64h-88c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h88V32c0-17.67-14.33-32-32-32H32C14.33 0 0 14.33 0 32v448c0 17.67 14.33 32 32 32h192c17.67 0 32-14.33 32-32v-64h-88z\"]\n};\nvar faRunning = {\n prefix: 'fas',\n iconName: 'running',\n icon: [416, 512, [], \"f70c\", \"M272 96c26.51 0 48-21.49 48-48S298.51 0 272 0s-48 21.49-48 48 21.49 48 48 48zM113.69 317.47l-14.8 34.52H32c-17.67 0-32 14.33-32 32s14.33 32 32 32h77.45c19.25 0 36.58-11.44 44.11-29.09l8.79-20.52-10.67-6.3c-17.32-10.23-30.06-25.37-37.99-42.61zM384 223.99h-44.03l-26.06-53.25c-12.5-25.55-35.45-44.23-61.78-50.94l-71.08-21.14c-28.3-6.8-57.77-.55-80.84 17.14l-39.67 30.41c-14.03 10.75-16.69 30.83-5.92 44.86s30.84 16.66 44.86 5.92l39.69-30.41c7.67-5.89 17.44-8 25.27-6.14l14.7 4.37-37.46 87.39c-12.62 29.48-1.31 64.01 26.3 80.31l84.98 50.17-27.47 87.73c-5.28 16.86 4.11 34.81 20.97 40.09 3.19 1 6.41 1.48 9.58 1.48 13.61 0 26.23-8.77 30.52-22.45l31.64-101.06c5.91-20.77-2.89-43.08-21.64-54.39l-61.24-36.14 31.31-78.28 20.27 41.43c8 16.34 24.92 26.89 43.11 26.89H384c17.67 0 32-14.33 32-32s-14.33-31.99-32-31.99z\"]\n};\nvar faRupeeSign = {\n prefix: 'fas',\n iconName: 'rupee-sign',\n icon: [320, 512, [], \"f156\", \"M308 96c6.627 0 12-5.373 12-12V44c0-6.627-5.373-12-12-12H12C5.373 32 0 37.373 0 44v44.748c0 6.627 5.373 12 12 12h85.28c27.308 0 48.261 9.958 60.97 27.252H12c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h158.757c-6.217 36.086-32.961 58.632-74.757 58.632H12c-6.627 0-12 5.373-12 12v53.012c0 3.349 1.4 6.546 3.861 8.818l165.052 152.356a12.001 12.001 0 0 0 8.139 3.182h82.562c10.924 0 16.166-13.408 8.139-20.818L116.871 319.906c76.499-2.34 131.144-53.395 138.318-127.906H308c6.627 0 12-5.373 12-12v-40c0-6.627-5.373-12-12-12h-58.69c-3.486-11.541-8.28-22.246-14.252-32H308z\"]\n};\nvar faSadCry = {\n prefix: 'fas',\n iconName: 'sad-cry',\n icon: [496, 512, [], \"f5b3\", \"M248 8C111 8 0 119 0 256c0 90.1 48.2 168.7 120 212.1V288c0-8.8 7.2-16 16-16s16 7.2 16 16v196.7c29.5 12.4 62 19.3 96 19.3s66.5-6.9 96-19.3V288c0-8.8 7.2-16 16-16s16 7.2 16 16v180.1C447.8 424.7 496 346 496 256 496 119 385 8 248 8zm-65.5 216.5c-14.8-13.2-46.2-13.2-61 0L112 233c-3.8 3.3-9.3 4-13.7 1.6-4.4-2.4-6.9-7.4-6.1-12.4 4-25.2 34.2-42.1 59.9-42.1S208 197 212 222.2c.8 5-1.7 10-6.1 12.4-5.8 3.1-11.2.7-13.7-1.6l-9.7-8.5zM248 416c-26.5 0-48-28.7-48-64s21.5-64 48-64 48 28.7 48 64-21.5 64-48 64zm149.8-181.5c-5.8 3.1-11.2.7-13.7-1.6l-9.5-8.5c-14.8-13.2-46.2-13.2-61 0L304 233c-3.8 3.3-9.3 4-13.7 1.6-4.4-2.4-6.9-7.4-6.1-12.4 4-25.2 34.2-42.1 59.9-42.1S400 197 404 222.2c.6 4.9-1.8 9.9-6.2 12.3z\"]\n};\nvar faSadTear = {\n prefix: 'fas',\n iconName: 'sad-tear',\n icon: [496, 512, [], \"f5b4\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm80 168c17.7 0 32 14.3 32 32s-14.3 32-32 32-32-14.3-32-32 14.3-32 32-32zM152 416c-26.5 0-48-21-48-47 0-20 28.5-60.4 41.6-77.8 3.2-4.3 9.6-4.3 12.8 0C171.5 308.6 200 349 200 369c0 26-21.5 47-48 47zm16-176c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32zm170.2 154.2C315.8 367.4 282.9 352 248 352c-21.2 0-21.2-32 0-32 44.4 0 86.3 19.6 114.7 53.8 13.8 16.4-11.2 36.5-24.5 20.4z\"]\n};\nvar faSatellite = {\n prefix: 'fas',\n iconName: 'satellite',\n icon: [512, 512, [], \"f7bf\", \"M502.7 265l-80.3-80.4 47.8-47.9c13.1-13.1 13.1-34.4 0-47.5l-47.5-47.5c-13.1-13.1-34.4-13.1-47.5 0l-47.8 47.9-80.3-80.3C240.8 3.1 232.7 0 224.5 0S208.2 3.1 202 9.3L105.3 106c-12.4 12.4-12.4 32.6 0 45.1l80.3 80.4-9.8 9.8C122.1 217 59.6 218.6 7.3 246.7c-8.5 4.6-9.6 16.4-2.8 23.2L112 377.4l-17.8 17.8c-2.6-.7-5-1.6-7.8-1.6-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32c0-2.8-.9-5.2-1.6-7.8l17.8-17.8 107.5 107.5c6.8 6.8 18.7 5.7 23.2-2.8 28.1-52.3 29.7-114.8 5.4-168.5l9.9-9.9 80.3 80.4c6.2 6.2 14.4 9.3 22.5 9.3s16.3-3.1 22.5-9.3l96.7-96.7c12.5-12.4 12.5-32.6.1-45zm-352-136.5l73.8-73.8 68.9 68.9-73.8 73.8-68.9-68.9zm232.8 232.8l-68.9-68.9 73.8-73.8 68.9 68.9-73.8 73.8z\"]\n};\nvar faSatelliteDish = {\n prefix: 'fas',\n iconName: 'satellite-dish',\n icon: [512, 512, [], \"f7c0\", \"M188.8 345.9l27.4-27.4c2.6.7 5 1.6 7.8 1.6 17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32c0 2.8.9 5.2 1.6 7.8l-27.4 27.4L49.4 206.5c-7.3-7.3-20.1-6.1-25 3-41.8 77.8-29.9 176.7 35.7 242.3 65.6 65.6 164.6 77.5 242.3 35.7 9.2-4.9 10.4-17.7 3-25L188.8 345.9zM209 0c-9.2-.5-17 6.8-17 16v31.6c0 8.5 6.6 15.5 15 15.9 129.4 7 233.4 112 240.9 241.5.5 8.4 7.5 15 15.9 15h32.1c9.2 0 16.5-7.8 16-17C503.4 139.8 372.2 8.6 209 0zm.3 96c-9.3-.7-17.3 6.7-17.3 16.1v32.1c0 8.4 6.5 15.3 14.8 15.9 76.8 6.3 138 68.2 144.9 145.2.8 8.3 7.6 14.7 15.9 14.7h32.2c9.3 0 16.8-8 16.1-17.3-8.4-110.1-96.5-198.2-206.6-206.7z\"]\n};\nvar faSave = {\n prefix: 'fas',\n iconName: 'save',\n icon: [448, 512, [], \"f0c7\", \"M433.941 129.941l-83.882-83.882A48 48 0 0 0 316.118 32H48C21.49 32 0 53.49 0 80v352c0 26.51 21.49 48 48 48h352c26.51 0 48-21.49 48-48V163.882a48 48 0 0 0-14.059-33.941zM224 416c-35.346 0-64-28.654-64-64 0-35.346 28.654-64 64-64s64 28.654 64 64c0 35.346-28.654 64-64 64zm96-304.52V212c0 6.627-5.373 12-12 12H76c-6.627 0-12-5.373-12-12V108c0-6.627 5.373-12 12-12h228.52c3.183 0 6.235 1.264 8.485 3.515l3.48 3.48A11.996 11.996 0 0 1 320 111.48z\"]\n};\nvar faSchool = {\n prefix: 'fas',\n iconName: 'school',\n icon: [640, 512, [], \"f549\", \"M0 224v272c0 8.84 7.16 16 16 16h80V192H32c-17.67 0-32 14.33-32 32zm360-48h-24v-40c0-4.42-3.58-8-8-8h-16c-4.42 0-8 3.58-8 8v64c0 4.42 3.58 8 8 8h48c4.42 0 8-3.58 8-8v-16c0-4.42-3.58-8-8-8zm137.75-63.96l-160-106.67a32.02 32.02 0 0 0-35.5 0l-160 106.67A32.002 32.002 0 0 0 128 138.66V512h128V368c0-8.84 7.16-16 16-16h96c8.84 0 16 7.16 16 16v144h128V138.67c0-10.7-5.35-20.7-14.25-26.63zM320 256c-44.18 0-80-35.82-80-80s35.82-80 80-80 80 35.82 80 80-35.82 80-80 80zm288-64h-64v320h80c8.84 0 16-7.16 16-16V224c0-17.67-14.33-32-32-32z\"]\n};\nvar faScrewdriver = {\n prefix: 'fas',\n iconName: 'screwdriver',\n icon: [512, 512, [], \"f54a\", \"M448 0L320 96v62.06l-83.03 83.03c6.79 4.25 13.27 9.06 19.07 14.87 5.8 5.8 10.62 12.28 14.87 19.07L353.94 192H416l96-128-64-64zM128 278.59L10.92 395.67c-14.55 14.55-14.55 38.15 0 52.71l52.7 52.7c14.56 14.56 38.15 14.56 52.71 0L233.41 384c29.11-29.11 29.11-76.3 0-105.41s-76.3-29.11-105.41 0z\"]\n};\nvar faScroll = {\n prefix: 'fas',\n iconName: 'scroll',\n icon: [640, 512, [], \"f70e\", \"M48 0C21.53 0 0 21.53 0 48v64c0 8.84 7.16 16 16 16h80V48C96 21.53 74.47 0 48 0zm208 412.57V352h288V96c0-52.94-43.06-96-96-96H111.59C121.74 13.41 128 29.92 128 48v368c0 38.87 34.65 69.65 74.75 63.12C234.22 474 256 444.46 256 412.57zM288 384v32c0 52.93-43.06 96-96 96h336c61.86 0 112-50.14 112-112 0-8.84-7.16-16-16-16H288z\"]\n};\nvar faSdCard = {\n prefix: 'fas',\n iconName: 'sd-card',\n icon: [384, 512, [], \"f7c2\", \"M320 0H128L0 128v320c0 35.3 28.7 64 64 64h256c35.3 0 64-28.7 64-64V64c0-35.3-28.7-64-64-64zM160 160h-48V64h48v96zm80 0h-48V64h48v96zm80 0h-48V64h48v96z\"]\n};\nvar faSearch = {\n prefix: 'fas',\n iconName: 'search',\n icon: [512, 512, [], \"f002\", \"M505 442.7L405.3 343c-4.5-4.5-10.6-7-17-7H372c27.6-35.3 44-79.7 44-128C416 93.1 322.9 0 208 0S0 93.1 0 208s93.1 208 208 208c48.3 0 92.7-16.4 128-44v16.3c0 6.4 2.5 12.5 7 17l99.7 99.7c9.4 9.4 24.6 9.4 33.9 0l28.3-28.3c9.4-9.4 9.4-24.6.1-34zM208 336c-70.7 0-128-57.2-128-128 0-70.7 57.2-128 128-128 70.7 0 128 57.2 128 128 0 70.7-57.2 128-128 128z\"]\n};\nvar faSearchDollar = {\n prefix: 'fas',\n iconName: 'search-dollar',\n icon: [512, 512, [], \"f688\", \"M505.04 442.66l-99.71-99.69c-4.5-4.5-10.6-7-17-7h-16.3c27.6-35.3 44-79.69 44-127.99C416.03 93.09 322.92 0 208.02 0S0 93.09 0 207.98s93.11 207.98 208.02 207.98c48.3 0 92.71-16.4 128.01-44v16.3c0 6.4 2.5 12.5 7 17l99.71 99.69c9.4 9.4 24.6 9.4 33.9 0l28.3-28.3c9.4-9.4 9.4-24.59.1-33.99zm-297.02-90.7c-79.54 0-144-64.34-144-143.98 0-79.53 64.35-143.98 144-143.98 79.54 0 144 64.34 144 143.98 0 79.53-64.35 143.98-144 143.98zm27.11-152.54l-45.01-13.5c-5.16-1.55-8.77-6.78-8.77-12.73 0-7.27 5.3-13.19 11.8-13.19h28.11c4.56 0 8.96 1.29 12.82 3.72 3.24 2.03 7.36 1.91 10.13-.73l11.75-11.21c3.53-3.37 3.33-9.21-.57-12.14-9.1-6.83-20.08-10.77-31.37-11.35V112c0-4.42-3.58-8-8-8h-16c-4.42 0-8 3.58-8 8v16.12c-23.63.63-42.68 20.55-42.68 45.07 0 19.97 12.99 37.81 31.58 43.39l45.01 13.5c5.16 1.55 8.77 6.78 8.77 12.73 0 7.27-5.3 13.19-11.8 13.19h-28.1c-4.56 0-8.96-1.29-12.82-3.72-3.24-2.03-7.36-1.91-10.13.73l-11.75 11.21c-3.53 3.37-3.33 9.21.57 12.14 9.1 6.83 20.08 10.77 31.37 11.35V304c0 4.42 3.58 8 8 8h16c4.42 0 8-3.58 8-8v-16.12c23.63-.63 42.68-20.54 42.68-45.07 0-19.97-12.99-37.81-31.59-43.39z\"]\n};\nvar faSearchLocation = {\n prefix: 'fas',\n iconName: 'search-location',\n icon: [512, 512, [], \"f689\", \"M505.04 442.66l-99.71-99.69c-4.5-4.5-10.6-7-17-7h-16.3c27.6-35.3 44-79.69 44-127.99C416.03 93.09 322.92 0 208.02 0S0 93.09 0 207.98s93.11 207.98 208.02 207.98c48.3 0 92.71-16.4 128.01-44v16.3c0 6.4 2.5 12.5 7 17l99.71 99.69c9.4 9.4 24.6 9.4 33.9 0l28.3-28.3c9.4-9.4 9.4-24.59.1-33.99zm-297.02-90.7c-79.54 0-144-64.34-144-143.98 0-79.53 64.35-143.98 144-143.98 79.54 0 144 64.34 144 143.98 0 79.53-64.35 143.98-144 143.98zm.02-239.96c-40.78 0-73.84 33.05-73.84 73.83 0 32.96 48.26 93.05 66.75 114.86a9.24 9.24 0 0 0 14.18 0c18.49-21.81 66.75-81.89 66.75-114.86 0-40.78-33.06-73.83-73.84-73.83zm0 96c-13.26 0-24-10.75-24-24 0-13.26 10.75-24 24-24s24 10.74 24 24c0 13.25-10.75 24-24 24z\"]\n};\nvar faSearchMinus = {\n prefix: 'fas',\n iconName: 'search-minus',\n icon: [512, 512, [], \"f010\", \"M304 192v32c0 6.6-5.4 12-12 12H124c-6.6 0-12-5.4-12-12v-32c0-6.6 5.4-12 12-12h168c6.6 0 12 5.4 12 12zm201 284.7L476.7 505c-9.4 9.4-24.6 9.4-33.9 0L343 405.3c-4.5-4.5-7-10.6-7-17V372c-35.3 27.6-79.7 44-128 44C93.1 416 0 322.9 0 208S93.1 0 208 0s208 93.1 208 208c0 48.3-16.4 92.7-44 128h16.3c6.4 0 12.5 2.5 17 7l99.7 99.7c9.3 9.4 9.3 24.6 0 34zM344 208c0-75.2-60.8-136-136-136S72 132.8 72 208s60.8 136 136 136 136-60.8 136-136z\"]\n};\nvar faSearchPlus = {\n prefix: 'fas',\n iconName: 'search-plus',\n icon: [512, 512, [], \"f00e\", \"M304 192v32c0 6.6-5.4 12-12 12h-56v56c0 6.6-5.4 12-12 12h-32c-6.6 0-12-5.4-12-12v-56h-56c-6.6 0-12-5.4-12-12v-32c0-6.6 5.4-12 12-12h56v-56c0-6.6 5.4-12 12-12h32c6.6 0 12 5.4 12 12v56h56c6.6 0 12 5.4 12 12zm201 284.7L476.7 505c-9.4 9.4-24.6 9.4-33.9 0L343 405.3c-4.5-4.5-7-10.6-7-17V372c-35.3 27.6-79.7 44-128 44C93.1 416 0 322.9 0 208S93.1 0 208 0s208 93.1 208 208c0 48.3-16.4 92.7-44 128h16.3c6.4 0 12.5 2.5 17 7l99.7 99.7c9.3 9.4 9.3 24.6 0 34zM344 208c0-75.2-60.8-136-136-136S72 132.8 72 208s60.8 136 136 136 136-60.8 136-136z\"]\n};\nvar faSeedling = {\n prefix: 'fas',\n iconName: 'seedling',\n icon: [512, 512, [], \"f4d8\", \"M64 96H0c0 123.7 100.3 224 224 224v144c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16V320C288 196.3 187.7 96 64 96zm384-64c-84.2 0-157.4 46.5-195.7 115.2 27.7 30.2 48.2 66.9 59 107.6C424 243.1 512 147.9 512 32h-64z\"]\n};\nvar faServer = {\n prefix: 'fas',\n iconName: 'server',\n icon: [512, 512, [], \"f233\", \"M480 160H32c-17.673 0-32-14.327-32-32V64c0-17.673 14.327-32 32-32h448c17.673 0 32 14.327 32 32v64c0 17.673-14.327 32-32 32zm-48-88c-13.255 0-24 10.745-24 24s10.745 24 24 24 24-10.745 24-24-10.745-24-24-24zm-64 0c-13.255 0-24 10.745-24 24s10.745 24 24 24 24-10.745 24-24-10.745-24-24-24zm112 248H32c-17.673 0-32-14.327-32-32v-64c0-17.673 14.327-32 32-32h448c17.673 0 32 14.327 32 32v64c0 17.673-14.327 32-32 32zm-48-88c-13.255 0-24 10.745-24 24s10.745 24 24 24 24-10.745 24-24-10.745-24-24-24zm-64 0c-13.255 0-24 10.745-24 24s10.745 24 24 24 24-10.745 24-24-10.745-24-24-24zm112 248H32c-17.673 0-32-14.327-32-32v-64c0-17.673 14.327-32 32-32h448c17.673 0 32 14.327 32 32v64c0 17.673-14.327 32-32 32zm-48-88c-13.255 0-24 10.745-24 24s10.745 24 24 24 24-10.745 24-24-10.745-24-24-24zm-64 0c-13.255 0-24 10.745-24 24s10.745 24 24 24 24-10.745 24-24-10.745-24-24-24z\"]\n};\nvar faShapes = {\n prefix: 'fas',\n iconName: 'shapes',\n icon: [512, 512, [], \"f61f\", \"M512 320v160c0 17.67-14.33 32-32 32H320c-17.67 0-32-14.33-32-32V320c0-17.67 14.33-32 32-32h160c17.67 0 32 14.33 32 32zm-384-64C57.31 256 0 313.31 0 384s57.31 128 128 128 128-57.31 128-128-57.31-128-128-128zm351.03-32c25.34 0 41.18-26.67 28.51-48L412.51 16c-12.67-21.33-44.35-21.33-57.02 0l-95.03 160c-12.67 21.33 3.17 48 28.51 48h190.06z\"]\n};\nvar faShare = {\n prefix: 'fas',\n iconName: 'share',\n icon: [512, 512, [], \"f064\", \"M503.691 189.836L327.687 37.851C312.281 24.546 288 35.347 288 56.015v80.053C127.371 137.907 0 170.1 0 322.326c0 61.441 39.581 122.309 83.333 154.132 13.653 9.931 33.111-2.533 28.077-18.631C66.066 312.814 132.917 274.316 288 272.085V360c0 20.7 24.3 31.453 39.687 18.164l176.004-152c11.071-9.562 11.086-26.753 0-36.328z\"]\n};\nvar faShareAlt = {\n prefix: 'fas',\n iconName: 'share-alt',\n icon: [448, 512, [], \"f1e0\", \"M352 320c-22.608 0-43.387 7.819-59.79 20.895l-102.486-64.054a96.551 96.551 0 0 0 0-41.683l102.486-64.054C308.613 184.181 329.392 192 352 192c53.019 0 96-42.981 96-96S405.019 0 352 0s-96 42.981-96 96c0 7.158.79 14.13 2.276 20.841L155.79 180.895C139.387 167.819 118.608 160 96 160c-53.019 0-96 42.981-96 96s42.981 96 96 96c22.608 0 43.387-7.819 59.79-20.895l102.486 64.054A96.301 96.301 0 0 0 256 416c0 53.019 42.981 96 96 96s96-42.981 96-96-42.981-96-96-96z\"]\n};\nvar faShareAltSquare = {\n prefix: 'fas',\n iconName: 'share-alt-square',\n icon: [448, 512, [], \"f1e1\", \"M448 80v352c0 26.51-21.49 48-48 48H48c-26.51 0-48-21.49-48-48V80c0-26.51 21.49-48 48-48h352c26.51 0 48 21.49 48 48zM304 296c-14.562 0-27.823 5.561-37.783 14.671l-67.958-40.775a56.339 56.339 0 0 0 0-27.793l67.958-40.775C276.177 210.439 289.438 216 304 216c30.928 0 56-25.072 56-56s-25.072-56-56-56-56 25.072-56 56c0 4.797.605 9.453 1.74 13.897l-67.958 40.775C171.823 205.561 158.562 200 144 200c-30.928 0-56 25.072-56 56s25.072 56 56 56c14.562 0 27.823-5.561 37.783-14.671l67.958 40.775a56.088 56.088 0 0 0-1.74 13.897c0 30.928 25.072 56 56 56s56-25.072 56-56C360 321.072 334.928 296 304 296z\"]\n};\nvar faShareSquare = {\n prefix: 'fas',\n iconName: 'share-square',\n icon: [576, 512, [], \"f14d\", \"M568.482 177.448L424.479 313.433C409.3 327.768 384 317.14 384 295.985v-71.963c-144.575.97-205.566 35.113-164.775 171.353 4.483 14.973-12.846 26.567-25.006 17.33C155.252 383.105 120 326.488 120 269.339c0-143.937 117.599-172.5 264-173.312V24.012c0-21.174 25.317-31.768 40.479-17.448l144.003 135.988c10.02 9.463 10.028 25.425 0 34.896zM384 379.128V448H64V128h50.916a11.99 11.99 0 0 0 8.648-3.693c14.953-15.568 32.237-27.89 51.014-37.676C185.708 80.83 181.584 64 169.033 64H48C21.49 64 0 85.49 0 112v352c0 26.51 21.49 48 48 48h352c26.51 0 48-21.49 48-48v-88.806c0-8.288-8.197-14.066-16.011-11.302a71.83 71.83 0 0 1-34.189 3.377c-7.27-1.046-13.8 4.514-13.8 11.859z\"]\n};\nvar faShekelSign = {\n prefix: 'fas',\n iconName: 'shekel-sign',\n icon: [448, 512, [], \"f20b\", \"M248 168v168c0 8.84 7.16 16 16 16h48c8.84 0 16-7.16 16-16V168c0-75.11-60.89-136-136-136H24C10.75 32 0 42.74 0 56v408c0 8.84 7.16 16 16 16h48c8.84 0 16-7.16 16-16V112h112c30.93 0 56 25.07 56 56zM432 32h-48c-8.84 0-16 7.16-16 16v296c0 30.93-25.07 56-56 56H200V176c0-8.84-7.16-16-16-16h-48c-8.84 0-16 7.16-16 16v280c0 13.25 10.75 24 24 24h168c75.11 0 136-60.89 136-136V48c0-8.84-7.16-16-16-16z\"]\n};\nvar faShieldAlt = {\n prefix: 'fas',\n iconName: 'shield-alt',\n icon: [512, 512, [], \"f3ed\", \"M466.5 83.7l-192-80a48.15 48.15 0 0 0-36.9 0l-192 80C27.7 91.1 16 108.6 16 128c0 198.5 114.5 335.7 221.5 380.3 11.8 4.9 25.1 4.9 36.9 0C360.1 472.6 496 349.3 496 128c0-19.4-11.7-36.9-29.5-44.3zM256.1 446.3l-.1-381 175.9 73.3c-3.3 151.4-82.1 261.1-175.8 307.7z\"]\n};\nvar faShip = {\n prefix: 'fas',\n iconName: 'ship',\n icon: [640, 512, [], \"f21a\", \"M496.616 372.639l70.012-70.012c16.899-16.9 9.942-45.771-12.836-53.092L512 236.102V96c0-17.673-14.327-32-32-32h-64V24c0-13.255-10.745-24-24-24H248c-13.255 0-24 10.745-24 24v40h-64c-17.673 0-32 14.327-32 32v140.102l-41.792 13.433c-22.753 7.313-29.754 36.173-12.836 53.092l70.012 70.012C125.828 416.287 85.587 448 24 448c-13.255 0-24 10.745-24 24v16c0 13.255 10.745 24 24 24 61.023 0 107.499-20.61 143.258-59.396C181.677 487.432 216.021 512 256 512h128c39.979 0 74.323-24.568 88.742-59.396C508.495 491.384 554.968 512 616 512c13.255 0 24-10.745 24-24v-16c0-13.255-10.745-24-24-24-60.817 0-101.542-31.001-119.384-75.361zM192 128h256v87.531l-118.208-37.995a31.995 31.995 0 0 0-19.584 0L192 215.531V128z\"]\n};\nvar faShippingFast = {\n prefix: 'fas',\n iconName: 'shipping-fast',\n icon: [640, 512, [], \"f48b\", \"M624 352h-16V243.9c0-12.7-5.1-24.9-14.1-33.9L494 110.1c-9-9-21.2-14.1-33.9-14.1H416V48c0-26.5-21.5-48-48-48H112C85.5 0 64 21.5 64 48v48H8c-4.4 0-8 3.6-8 8v16c0 4.4 3.6 8 8 8h272c4.4 0 8 3.6 8 8v16c0 4.4-3.6 8-8 8H40c-4.4 0-8 3.6-8 8v16c0 4.4 3.6 8 8 8h208c4.4 0 8 3.6 8 8v16c0 4.4-3.6 8-8 8H8c-4.4 0-8 3.6-8 8v16c0 4.4 3.6 8 8 8h208c4.4 0 8 3.6 8 8v16c0 4.4-3.6 8-8 8H64v128c0 53 43 96 96 96s96-43 96-96h128c0 53 43 96 96 96s96-43 96-96h48c8.8 0 16-7.2 16-16v-32c0-8.8-7.2-16-16-16zM160 464c-26.5 0-48-21.5-48-48s21.5-48 48-48 48 21.5 48 48-21.5 48-48 48zm320 0c-26.5 0-48-21.5-48-48s21.5-48 48-48 48 21.5 48 48-21.5 48-48 48zm80-208H416V144h44.1l99.9 99.9V256z\"]\n};\nvar faShoePrints = {\n prefix: 'fas',\n iconName: 'shoe-prints',\n icon: [640, 512, [], \"f54b\", \"M192 160h32V32h-32c-35.35 0-64 28.65-64 64s28.65 64 64 64zM0 416c0 35.35 28.65 64 64 64h32V352H64c-35.35 0-64 28.65-64 64zm337.46-128c-34.91 0-76.16 13.12-104.73 32-24.79 16.38-44.52 32-104.73 32v128l57.53 15.97c26.21 7.28 53.01 13.12 80.31 15.05 32.69 2.31 65.6.67 97.58-6.2C472.9 481.3 512 429.22 512 384c0-64-84.18-96-174.54-96zM491.42 7.19C459.44.32 426.53-1.33 393.84.99c-27.3 1.93-54.1 7.77-80.31 15.04L256 32v128c60.2 0 79.94 15.62 104.73 32 28.57 18.88 69.82 32 104.73 32C555.82 224 640 192 640 128c0-45.22-39.1-97.3-148.58-120.81z\"]\n};\nvar faShoppingBag = {\n prefix: 'fas',\n iconName: 'shopping-bag',\n icon: [448, 512, [], \"f290\", \"M352 160v-32C352 57.42 294.579 0 224 0 153.42 0 96 57.42 96 128v32H0v272c0 44.183 35.817 80 80 80h288c44.183 0 80-35.817 80-80V160h-96zm-192-32c0-35.29 28.71-64 64-64s64 28.71 64 64v32H160v-32zm160 120c-13.255 0-24-10.745-24-24s10.745-24 24-24 24 10.745 24 24-10.745 24-24 24zm-192 0c-13.255 0-24-10.745-24-24s10.745-24 24-24 24 10.745 24 24-10.745 24-24 24z\"]\n};\nvar faShoppingBasket = {\n prefix: 'fas',\n iconName: 'shopping-basket',\n icon: [576, 512, [], \"f291\", \"M576 216v16c0 13.255-10.745 24-24 24h-8l-26.113 182.788C514.509 462.435 494.257 480 470.37 480H105.63c-23.887 0-44.139-17.565-47.518-41.212L32 256h-8c-13.255 0-24-10.745-24-24v-16c0-13.255 10.745-24 24-24h67.341l106.78-146.821c10.395-14.292 30.407-17.453 44.701-7.058 14.293 10.395 17.453 30.408 7.058 44.701L170.477 192h235.046L326.12 82.821c-10.395-14.292-7.234-34.306 7.059-44.701 14.291-10.395 34.306-7.235 44.701 7.058L484.659 192H552c13.255 0 24 10.745 24 24zM312 392V280c0-13.255-10.745-24-24-24s-24 10.745-24 24v112c0 13.255 10.745 24 24 24s24-10.745 24-24zm112 0V280c0-13.255-10.745-24-24-24s-24 10.745-24 24v112c0 13.255 10.745 24 24 24s24-10.745 24-24zm-224 0V280c0-13.255-10.745-24-24-24s-24 10.745-24 24v112c0 13.255 10.745 24 24 24s24-10.745 24-24z\"]\n};\nvar faShoppingCart = {\n prefix: 'fas',\n iconName: 'shopping-cart',\n icon: [576, 512, [], \"f07a\", \"M528.12 301.319l47.273-208C578.806 78.301 567.391 64 551.99 64H159.208l-9.166-44.81C147.758 8.021 137.93 0 126.529 0H24C10.745 0 0 10.745 0 24v16c0 13.255 10.745 24 24 24h69.883l70.248 343.435C147.325 417.1 136 435.222 136 456c0 30.928 25.072 56 56 56s56-25.072 56-56c0-15.674-6.447-29.835-16.824-40h209.647C430.447 426.165 424 440.326 424 456c0 30.928 25.072 56 56 56s56-25.072 56-56c0-22.172-12.888-41.332-31.579-50.405l5.517-24.276c3.413-15.018-8.002-29.319-23.403-29.319H218.117l-6.545-32h293.145c11.206 0 20.92-7.754 23.403-18.681z\"]\n};\nvar faShower = {\n prefix: 'fas',\n iconName: 'shower',\n icon: [512, 512, [], \"f2cc\", \"M389.66 135.6L231.6 293.66c-9.37 9.37-24.57 9.37-33.94 0l-11.32-11.32c-9.37-9.37-9.37-24.57 0-33.94l.11-.11c-34.03-40.21-35.16-98.94-3.39-140.38-11.97-7.55-26.14-11.91-41.3-11.91C98.88 96 64 130.88 64 173.76V480H0V173.76C0 95.59 63.59 32 141.76 32c36.93 0 70.61 14.2 95.86 37.42 35.9-11.51 76.5-4.5 106.67 21.03l.11-.11c9.37-9.37 24.57-9.37 33.94 0l11.32 11.32c9.37 9.37 9.37 24.57 0 33.94zM384 208c0 8.837-7.163 16-16 16s-16-7.163-16-16 7.163-16 16-16 16 7.163 16 16zm32 0c0-8.837 7.163-16 16-16s16 7.163 16 16-7.163 16-16 16-16-7.163-16-16zm96 0c0 8.837-7.163 16-16 16s-16-7.163-16-16 7.163-16 16-16 16 7.163 16 16zm-160 32c0 8.837-7.163 16-16 16s-16-7.163-16-16 7.163-16 16-16 16 7.163 16 16zm48-16c8.837 0 16 7.163 16 16s-7.163 16-16 16-16-7.163-16-16 7.163-16 16-16zm80 16c0 8.837-7.163 16-16 16s-16-7.163-16-16 7.163-16 16-16 16 7.163 16 16zm-160 32c0 8.837-7.163 16-16 16s-16-7.163-16-16 7.163-16 16-16 16 7.163 16 16zm32 0c0-8.837 7.163-16 16-16s16 7.163 16 16-7.163 16-16 16-16-7.163-16-16zm96 0c0 8.837-7.163 16-16 16s-16-7.163-16-16 7.163-16 16-16 16 7.163 16 16zm-128 32c0-8.837 7.163-16 16-16s16 7.163 16 16-7.163 16-16 16-16-7.163-16-16zm96 0c0 8.837-7.163 16-16 16s-16-7.163-16-16 7.163-16 16-16 16 7.163 16 16zm-96 32c0 8.837-7.163 16-16 16s-16-7.163-16-16 7.163-16 16-16 16 7.163 16 16zm64 0c0 8.837-7.163 16-16 16s-16-7.163-16-16 7.163-16 16-16 16 7.163 16 16zm-32 32c0 8.837-7.163 16-16 16s-16-7.163-16-16 7.163-16 16-16 16 7.163 16 16zm-32 32c0 8.837-7.163 16-16 16s-16-7.163-16-16 7.163-16 16-16 16 7.163 16 16z\"]\n};\nvar faShuttleVan = {\n prefix: 'fas',\n iconName: 'shuttle-van',\n icon: [640, 512, [], \"f5b6\", \"M628.88 210.65L494.39 49.27A48.01 48.01 0 0 0 457.52 32H32C14.33 32 0 46.33 0 64v288c0 17.67 14.33 32 32 32h32c0 53.02 42.98 96 96 96s96-42.98 96-96h128c0 53.02 42.98 96 96 96s96-42.98 96-96h32c17.67 0 32-14.33 32-32V241.38c0-11.23-3.94-22.1-11.12-30.73zM64 192V96h96v96H64zm96 240c-26.51 0-48-21.49-48-48s21.49-48 48-48 48 21.49 48 48-21.49 48-48 48zm160-240h-96V96h96v96zm160 240c-26.51 0-48-21.49-48-48s21.49-48 48-48 48 21.49 48 48-21.49 48-48 48zm-96-240V96h66.02l80 96H384z\"]\n};\nvar faSign = {\n prefix: 'fas',\n iconName: 'sign',\n icon: [512, 512, [], \"f4d9\", \"M496 64H128V16c0-8.8-7.2-16-16-16H80c-8.8 0-16 7.2-16 16v48H16C7.2 64 0 71.2 0 80v32c0 8.8 7.2 16 16 16h48v368c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16V128h368c8.8 0 16-7.2 16-16V80c0-8.8-7.2-16-16-16zM160 384h320V160H160v224z\"]\n};\nvar faSignInAlt = {\n prefix: 'fas',\n iconName: 'sign-in-alt',\n icon: [512, 512, [], \"f2f6\", \"M416 448h-84c-6.6 0-12-5.4-12-12v-40c0-6.6 5.4-12 12-12h84c17.7 0 32-14.3 32-32V160c0-17.7-14.3-32-32-32h-84c-6.6 0-12-5.4-12-12V76c0-6.6 5.4-12 12-12h84c53 0 96 43 96 96v192c0 53-43 96-96 96zm-47-201L201 79c-15-15-41-4.5-41 17v96H24c-13.3 0-24 10.7-24 24v96c0 13.3 10.7 24 24 24h136v96c0 21.5 26 32 41 17l168-168c9.3-9.4 9.3-24.6 0-34z\"]\n};\nvar faSignLanguage = {\n prefix: 'fas',\n iconName: 'sign-language',\n icon: [448, 512, [], \"f2a7\", \"M91.434 483.987c-.307-16.018 13.109-29.129 29.13-29.129h62.293v-5.714H56.993c-16.021 0-29.437-13.111-29.13-29.129C28.16 404.491 40.835 392 56.428 392h126.429v-5.714H29.136c-16.021 0-29.437-13.111-29.13-29.129.297-15.522 12.973-28.013 28.566-28.013h154.286v-5.714H57.707c-16.021 0-29.437-13.111-29.13-29.129.297-15.522 12.973-28.013 28.566-28.013h168.566l-31.085-22.606c-12.762-9.281-15.583-27.149-6.302-39.912 9.281-12.761 27.15-15.582 39.912-6.302l123.361 89.715a34.287 34.287 0 0 1 14.12 27.728v141.136c0 15.91-10.946 29.73-26.433 33.374l-80.471 18.934a137.16 137.16 0 0 1-31.411 3.646H120c-15.593-.001-28.269-12.492-28.566-28.014zm73.249-225.701h36.423l-11.187-8.136c-18.579-13.511-20.313-40.887-3.17-56.536l-13.004-16.7c-9.843-12.641-28.43-15.171-40.88-5.088-12.065 9.771-14.133 27.447-4.553 39.75l36.371 46.71zm283.298-2.103l-5.003-152.452c-.518-15.771-13.722-28.136-29.493-27.619-15.773.518-28.137 13.722-27.619 29.493l1.262 38.415L283.565 11.019c-9.58-12.303-27.223-14.63-39.653-5.328-12.827 9.599-14.929 28.24-5.086 40.881l76.889 98.745-4.509 3.511-94.79-121.734c-9.58-12.303-27.223-14.63-39.653-5.328-12.827 9.599-14.929 28.24-5.086 40.881l94.443 121.288-4.509 3.511-77.675-99.754c-9.58-12.303-27.223-14.63-39.653-5.328-12.827 9.599-14.929 28.24-5.086 40.881l52.053 66.849c12.497-8.257 29.055-8.285 41.69.904l123.36 89.714c10.904 7.93 17.415 20.715 17.415 34.198v16.999l61.064-47.549a34.285 34.285 0 0 0 13.202-28.177z\"]\n};\nvar faSignOutAlt = {\n prefix: 'fas',\n iconName: 'sign-out-alt',\n icon: [512, 512, [], \"f2f5\", \"M497 273L329 441c-15 15-41 4.5-41-17v-96H152c-13.3 0-24-10.7-24-24v-96c0-13.3 10.7-24 24-24h136V88c0-21.4 25.9-32 41-17l168 168c9.3 9.4 9.3 24.6 0 34zM192 436v-40c0-6.6-5.4-12-12-12H96c-17.7 0-32-14.3-32-32V160c0-17.7 14.3-32 32-32h84c6.6 0 12-5.4 12-12V76c0-6.6-5.4-12-12-12H96c-53 0-96 43-96 96v192c0 53 43 96 96 96h84c6.6 0 12-5.4 12-12z\"]\n};\nvar faSignal = {\n prefix: 'fas',\n iconName: 'signal',\n icon: [640, 512, [], \"f012\", \"M216 288h-48c-8.84 0-16 7.16-16 16v192c0 8.84 7.16 16 16 16h48c8.84 0 16-7.16 16-16V304c0-8.84-7.16-16-16-16zM88 384H40c-8.84 0-16 7.16-16 16v96c0 8.84 7.16 16 16 16h48c8.84 0 16-7.16 16-16v-96c0-8.84-7.16-16-16-16zm256-192h-48c-8.84 0-16 7.16-16 16v288c0 8.84 7.16 16 16 16h48c8.84 0 16-7.16 16-16V208c0-8.84-7.16-16-16-16zm128-96h-48c-8.84 0-16 7.16-16 16v384c0 8.84 7.16 16 16 16h48c8.84 0 16-7.16 16-16V112c0-8.84-7.16-16-16-16zM600 0h-48c-8.84 0-16 7.16-16 16v480c0 8.84 7.16 16 16 16h48c8.84 0 16-7.16 16-16V16c0-8.84-7.16-16-16-16z\"]\n};\nvar faSignature = {\n prefix: 'fas',\n iconName: 'signature',\n icon: [640, 512, [], \"f5b7\", \"M623.2 192c-51.8 3.5-125.7 54.7-163.1 71.5-29.1 13.1-54.2 24.4-76.1 24.4-22.6 0-26-16.2-21.3-51.9 1.1-8 11.7-79.2-42.7-76.1-25.1 1.5-64.3 24.8-169.5 126L192 182.2c30.4-75.9-53.2-151.5-129.7-102.8L7.4 116.3C0 121-2.2 130.9 2.5 138.4l17.2 27c4.7 7.5 14.6 9.7 22.1 4.9l58-38.9c18.4-11.7 40.7 7.2 32.7 27.1L34.3 404.1C27.5 421 37 448 64 448c8.3 0 16.5-3.2 22.6-9.4 42.2-42.2 154.7-150.7 211.2-195.8-2.2 28.5-2.1 58.9 20.6 83.8 15.3 16.8 37.3 25.3 65.5 25.3 35.6 0 68-14.6 102.3-30 33-14.8 99-62.6 138.4-65.8 8.5-.7 15.2-7.3 15.2-15.8v-32.1c.2-9.1-7.5-16.8-16.6-16.2z\"]\n};\nvar faSimCard = {\n prefix: 'fas',\n iconName: 'sim-card',\n icon: [384, 512, [], \"f7c4\", \"M0 64v384c0 35.3 28.7 64 64 64h256c35.3 0 64-28.7 64-64V128L256 0H64C28.7 0 0 28.7 0 64zm224 192h-64v-64h64v64zm96 0h-64v-64h32c17.7 0 32 14.3 32 32v32zm-64 128h64v32c0 17.7-14.3 32-32 32h-32v-64zm-96 0h64v64h-64v-64zm-96 0h64v64H96c-17.7 0-32-14.3-32-32v-32zm0-96h256v64H64v-64zm0-64c0-17.7 14.3-32 32-32h32v64H64v-32z\"]\n};\nvar faSitemap = {\n prefix: 'fas',\n iconName: 'sitemap',\n icon: [640, 512, [], \"f0e8\", \"M128 352H32c-17.67 0-32 14.33-32 32v96c0 17.67 14.33 32 32 32h96c17.67 0 32-14.33 32-32v-96c0-17.67-14.33-32-32-32zm-24-80h192v48h48v-48h192v48h48v-57.59c0-21.17-17.23-38.41-38.41-38.41H344v-64h40c17.67 0 32-14.33 32-32V32c0-17.67-14.33-32-32-32H256c-17.67 0-32 14.33-32 32v96c0 17.67 14.33 32 32 32h40v64H94.41C73.23 224 56 241.23 56 262.41V320h48v-48zm264 80h-96c-17.67 0-32 14.33-32 32v96c0 17.67 14.33 32 32 32h96c17.67 0 32-14.33 32-32v-96c0-17.67-14.33-32-32-32zm240 0h-96c-17.67 0-32 14.33-32 32v96c0 17.67 14.33 32 32 32h96c17.67 0 32-14.33 32-32v-96c0-17.67-14.33-32-32-32z\"]\n};\nvar faSkating = {\n prefix: 'fas',\n iconName: 'skating',\n icon: [448, 512, [], \"f7c5\", \"M400 0c-26.5 0-48 21.5-48 48s21.5 48 48 48 48-21.5 48-48-21.5-48-48-48zm0 448c-8.8 0-16 7.2-16 16s-7.2 16-16 16h-96c-8.8 0-16 7.2-16 16s7.2 16 16 16h96c26.5 0 48-21.5 48-48 0-8.8-7.2-16-16-16zm-282.2 8.6c-6.2 6.2-16.4 6.3-22.6 0l-67.9-67.9c-6.2-6.2-16.4-6.2-22.6 0s-6.2 16.4 0 22.6l67.9 67.9c9.4 9.4 21.7 14 34 14s24.6-4.7 33.9-14c6.2-6.2 6.2-16.4 0-22.6s-16.4-6.3-22.7 0zm56.1-179.8l-93.7 93.7c-12.5 12.5-12.5 32.8 0 45.2 6.2 6.2 14.4 9.4 22.6 9.4s16.4-3.1 22.6-9.4l91.9-91.9-30.2-30.2c-5-5-9.4-10.7-13.2-16.8zM128 160h105.5l-20.1 17.2c-13.5 11.5-21.6 28.4-22.3 46.1-.7 17.8 6.1 35.2 18.7 47.7l78.2 78.2V432c0 17.7 14.3 32 32 32s32-14.3 32-32v-89.4c0-12.6-5.1-25-14.1-33.9l-61-61c.5-.4 1.2-.6 1.7-1.1l82.3-82.3c11.5-11.5 14.9-28.6 8.7-43.6-6.2-15-20.7-24.7-37-24.7H128c-17.7 0-32 14.3-32 32s14.3 32 32 32z\"]\n};\nvar faSkiing = {\n prefix: 'fas',\n iconName: 'skiing',\n icon: [512, 512, [], \"f7c9\", \"M432 96c26.5 0 48-21.5 48-48S458.5 0 432 0s-48 21.5-48 48 21.5 48 48 48zm73 356.1c-9.4-9.4-24.6-9.4-33.9 0-12.1 12.1-30.5 15.4-45.1 8.7l-135.8-70.2 49.2-73.8c12.7-19 10.2-44.5-6-60.6L293 215.7l-107-53.1c-2.9 19.9 3.4 40 17.7 54.4l75.1 75.2-45.9 68.8L35 258.7c-11.7-6-26.2-1.5-32.3 10.3-6.1 11.8-1.5 26.3 10.3 32.3l391.9 202.5c11.9 5.5 24.5 8.1 37.1 8.1 23.2 0 46-9 63-26 9.3-9.3 9.3-24.5 0-33.8zM120 91.6l-11.5 22.5c14.4 7.3 31.2 4.9 42.8-4.8l47.2 23.4c-.1.1-.1.2-.2.3l114.5 56.8 32.4-13 6.4 19.1c4 12.1 12.6 22 24 27.7l58.1 29c15.9 7.9 35 1.5 42.9-14.3 7.9-15.8 1.5-35-14.3-42.9l-52.1-26.1-17.1-51.2c-8.1-24.2-40.9-56.6-84.5-39.2l-81.2 32.5-62.5-31c.3-14.5-7.2-28.6-20.9-35.6l-11.1 21.7h-.2l-34.4-7c-1.8-.4-3.7.2-5 1.7-1.9 2.2-1.7 5.5.5 7.4l26.2 23z\"]\n};\nvar faSkiingNordic = {\n prefix: 'fas',\n iconName: 'skiing-nordic',\n icon: [576, 512, [], \"f7ca\", \"M336 96c26.5 0 48-21.5 48-48S362.5 0 336 0s-48 21.5-48 48 21.5 48 48 48zm216 320c-13.2 0-24 10.7-24 24 0 13.2-10.8 24-24 24h-69.5L460 285.6c11.7-4.7 20.1-16.2 20.1-29.6 0-17.7-14.3-32-32-32h-44L378 170.8c-12.5-25.5-35.5-44.2-61.8-50.9L245 98.7c-28.3-6.8-57.8-.5-80.8 17.1l-39.7 30.4c-14 10.7-16.7 30.8-5.9 44.9.7.9 1.7 1.3 2.4 2.1L66.9 464H24c-13.2 0-24 10.7-24 24s10.8 24 24 24h480c39.7 0 72-32.3 72-72 0-13.2-10.8-24-24-24zm-260.5 48h-96.9l43.1-91-22-13c-12.1-7.2-21.9-16.9-29.5-27.8L123.7 464H99.5l52.3-261.4c4.1-1 8.1-2.9 11.7-5.6l39.7-30.4c7.7-5.9 17.4-8 25.3-6.1l14.7 4.4-37.5 87.4c-12.6 29.5-1.3 64 26.3 80.3l85 50.2-25.5 81.2zm110.6 0h-43.6l23.6-75.5c5.9-20.8-2.9-43.1-21.6-54.4L299.3 298l31.3-78.3 20.3 41.4c8 16.3 24.9 26.9 43.1 26.9h33.3l-25.2 176z\"]\n};\nvar faSkull = {\n prefix: 'fas',\n iconName: 'skull',\n icon: [512, 512, [], \"f54c\", \"M256 0C114.6 0 0 100.3 0 224c0 70.1 36.9 132.6 94.5 173.7 9.6 6.9 15.2 18.1 13.5 29.9l-9.4 66.2c-1.4 9.6 6 18.2 15.7 18.2H192v-56c0-4.4 3.6-8 8-8h16c4.4 0 8 3.6 8 8v56h64v-56c0-4.4 3.6-8 8-8h16c4.4 0 8 3.6 8 8v56h77.7c9.7 0 17.1-8.6 15.7-18.2l-9.4-66.2c-1.7-11.7 3.8-23 13.5-29.9C475.1 356.6 512 294.1 512 224 512 100.3 397.4 0 256 0zm-96 320c-35.3 0-64-28.7-64-64s28.7-64 64-64 64 28.7 64 64-28.7 64-64 64zm192 0c-35.3 0-64-28.7-64-64s28.7-64 64-64 64 28.7 64 64-28.7 64-64 64z\"]\n};\nvar faSkullCrossbones = {\n prefix: 'fas',\n iconName: 'skull-crossbones',\n icon: [448, 512, [], \"f714\", \"M439.15 453.06L297.17 384l141.99-69.06c7.9-3.95 11.11-13.56 7.15-21.46L432 264.85c-3.95-7.9-13.56-11.11-21.47-7.16L224 348.41 37.47 257.69c-7.9-3.95-17.51-.75-21.47 7.16L1.69 293.48c-3.95 7.9-.75 17.51 7.15 21.46L150.83 384 8.85 453.06c-7.9 3.95-11.11 13.56-7.15 21.47l14.31 28.63c3.95 7.9 13.56 11.11 21.47 7.15L224 419.59l186.53 90.72c7.9 3.95 17.51.75 21.47-7.15l14.31-28.63c3.95-7.91.74-17.52-7.16-21.47zM150 237.28l-5.48 25.87c-2.67 12.62 5.42 24.85 16.45 24.85h126.08c11.03 0 19.12-12.23 16.45-24.85l-5.5-25.87c41.78-22.41 70-62.75 70-109.28C368 57.31 303.53 0 224 0S80 57.31 80 128c0 46.53 28.22 86.87 70 109.28zM280 112c17.65 0 32 14.35 32 32s-14.35 32-32 32-32-14.35-32-32 14.35-32 32-32zm-112 0c17.65 0 32 14.35 32 32s-14.35 32-32 32-32-14.35-32-32 14.35-32 32-32z\"]\n};\nvar faSlash = {\n prefix: 'fas',\n iconName: 'slash',\n icon: [640, 512, [], \"f715\", \"M594.53 508.63L6.18 53.9c-6.97-5.42-8.23-15.47-2.81-22.45L23.01 6.18C28.43-.8 38.49-2.06 45.47 3.37L633.82 458.1c6.97 5.42 8.23 15.47 2.81 22.45l-19.64 25.27c-5.42 6.98-15.48 8.23-22.46 2.81z\"]\n};\nvar faSleigh = {\n prefix: 'fas',\n iconName: 'sleigh',\n icon: [640, 512, [], \"f7cc\", \"M612.7 350.7l-9.3-7.4c-6.9-5.5-17-4.4-22.5 2.5l-10 12.5c-5.5 6.9-4.4 17 2.5 22.5l9.3 7.4c5.9 4.7 9.2 11.7 9.2 19.2 0 13.6-11 24.6-24.6 24.6H48c-8.8 0-16 7.2-16 16v16c0 8.8 7.2 16 16 16h516c39 0 73.7-29.3 75.9-68.3 1.4-23.8-8.7-46.3-27.2-61zM32 224c0 59.6 40.9 109.2 96 123.5V400h64v-48h192v48h64v-48c53 0 96-43 96-96v-96c17.7 0 32-14.3 32-32s-14.3-32-32-32h-96v64c0 35.3-28.7 64-64 64h-20.7c-65.8 0-125.9-37.2-155.3-96-29.4-58.8-89.6-96-155.3-96H32C14.3 32 0 46.3 0 64s14.3 32 32 32v128z\"]\n};\nvar faSlidersH = {\n prefix: 'fas',\n iconName: 'sliders-h',\n icon: [512, 512, [], \"f1de\", \"M496 384H160v-16c0-8.8-7.2-16-16-16h-32c-8.8 0-16 7.2-16 16v16H16c-8.8 0-16 7.2-16 16v32c0 8.8 7.2 16 16 16h80v16c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16v-16h336c8.8 0 16-7.2 16-16v-32c0-8.8-7.2-16-16-16zm0-160h-80v-16c0-8.8-7.2-16-16-16h-32c-8.8 0-16 7.2-16 16v16H16c-8.8 0-16 7.2-16 16v32c0 8.8 7.2 16 16 16h336v16c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16v-16h80c8.8 0 16-7.2 16-16v-32c0-8.8-7.2-16-16-16zm0-160H288V48c0-8.8-7.2-16-16-16h-32c-8.8 0-16 7.2-16 16v16H16C7.2 64 0 71.2 0 80v32c0 8.8 7.2 16 16 16h208v16c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16v-16h208c8.8 0 16-7.2 16-16V80c0-8.8-7.2-16-16-16z\"]\n};\nvar faSmile = {\n prefix: 'fas',\n iconName: 'smile',\n icon: [496, 512, [], \"f118\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm80 168c17.7 0 32 14.3 32 32s-14.3 32-32 32-32-14.3-32-32 14.3-32 32-32zm-160 0c17.7 0 32 14.3 32 32s-14.3 32-32 32-32-14.3-32-32 14.3-32 32-32zm194.8 170.2C334.3 380.4 292.5 400 248 400s-86.3-19.6-114.8-53.8c-13.6-16.3 11-36.7 24.6-20.5 22.4 26.9 55.2 42.2 90.2 42.2s67.8-15.4 90.2-42.2c13.4-16.2 38.1 4.2 24.6 20.5z\"]\n};\nvar faSmileBeam = {\n prefix: 'fas',\n iconName: 'smile-beam',\n icon: [496, 512, [], \"f5b8\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zM112 223.4c3.3-42.1 32.2-71.4 56-71.4s52.7 29.3 56 71.4c.7 8.6-10.8 11.9-14.9 4.5l-9.5-17c-7.7-13.7-19.2-21.6-31.5-21.6s-23.8 7.9-31.5 21.6l-9.5 17c-4.3 7.4-15.8 4-15.1-4.5zm250.8 122.8C334.3 380.4 292.5 400 248 400s-86.3-19.6-114.8-53.8c-13.5-16.3 11-36.7 24.6-20.5 22.4 26.9 55.2 42.2 90.2 42.2s67.8-15.4 90.2-42.2c13.6-16.2 38.1 4.3 24.6 20.5zm6.2-118.3l-9.5-17c-7.7-13.7-19.2-21.6-31.5-21.6s-23.8 7.9-31.5 21.6l-9.5 17c-4.1 7.3-15.6 4-14.9-4.5 3.3-42.1 32.2-71.4 56-71.4s52.7 29.3 56 71.4c.6 8.6-11 11.9-15.1 4.5z\"]\n};\nvar faSmileWink = {\n prefix: 'fas',\n iconName: 'smile-wink',\n icon: [496, 512, [], \"f4da\", \"M0 256c0 137 111 248 248 248s248-111 248-248S385 8 248 8 0 119 0 256zm200-48c0 17.7-14.3 32-32 32s-32-14.3-32-32 14.3-32 32-32 32 14.3 32 32zm158.5 16.5c-14.8-13.2-46.2-13.2-61 0L288 233c-8.3 7.4-21.6.4-19.8-10.8 4-25.2 34.2-42.1 59.9-42.1S384 197 388 222.2c1.7 11.1-11.4 18.3-19.8 10.8l-9.7-8.5zM157.8 325.8C180.2 352.7 213 368 248 368s67.8-15.4 90.2-42.2c13.6-16.2 38.1 4.2 24.6 20.5C334.3 380.4 292.5 400 248 400s-86.3-19.6-114.8-53.8c-13.5-16.3 11.2-36.7 24.6-20.4z\"]\n};\nvar faSmog = {\n prefix: 'fas',\n iconName: 'smog',\n icon: [640, 512, [], \"f75f\", \"M624 368H80c-8.8 0-16 7.2-16 16v16c0 8.8 7.2 16 16 16h544c8.8 0 16-7.2 16-16v-16c0-8.8-7.2-16-16-16zm-480 96H16c-8.8 0-16 7.2-16 16v16c0 8.8 7.2 16 16 16h128c8.8 0 16-7.2 16-16v-16c0-8.8-7.2-16-16-16zm416 0H224c-8.8 0-16 7.2-16 16v16c0 8.8 7.2 16 16 16h336c8.8 0 16-7.2 16-16v-16c0-8.8-7.2-16-16-16zM144 288h156.1c22.5 19.7 51.6 32 83.9 32s61.3-12.3 83.9-32H528c61.9 0 112-50.1 112-112S589.9 64 528 64c-18 0-34.7 4.6-49.7 12.1C454 31 406.8 0 352 0c-41 0-77.8 17.3-104 44.8C221.8 17.3 185 0 144 0 64.5 0 0 64.5 0 144s64.5 144 144 144z\"]\n};\nvar faSmoking = {\n prefix: 'fas',\n iconName: 'smoking',\n icon: [640, 512, [], \"f48d\", \"M632 352h-48c-4.4 0-8 3.6-8 8v144c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8V360c0-4.4-3.6-8-8-8zM553.3 87.1c-5.7-3.8-9.3-10-9.3-16.8V8c0-4.4-3.6-8-8-8h-48c-4.4 0-8 3.6-8 8v62.3c0 22 10.2 43.4 28.6 55.4 42.2 27.3 67.4 73.8 67.4 124V280c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8v-30.3c0-65.5-32.4-126.2-86.7-162.6zM432 352H48c-26.5 0-48 21.5-48 48v64c0 26.5 21.5 48 48 48h384c8.8 0 16-7.2 16-16V368c0-8.8-7.2-16-16-16zm-32 112H224v-64h176v64zm87.7-322.4C463.8 125 448 99.3 448 70.3V8c0-4.4-3.6-8-8-8h-48c-4.4 0-8 3.6-8 8v66.4c0 43.7 24.6 81.6 60.3 106.7 22.4 15.7 35.7 41.2 35.7 68.6V280c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8v-30.3c0-43.3-21-83.4-56.3-108.1zM536 352h-48c-4.4 0-8 3.6-8 8v144c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8V360c0-4.4-3.6-8-8-8z\"]\n};\nvar faSmokingBan = {\n prefix: 'fas',\n iconName: 'smoking-ban',\n icon: [512, 512, [], \"f54d\", \"M96 304c0 8.8 7.2 16 16 16h117.5l-96-96H112c-8.8 0-16 7.2-16 16v64zM256 0C114.6 0 0 114.6 0 256s114.6 256 256 256 256-114.6 256-256S397.4 0 256 0zm0 448c-105.9 0-192-86.1-192-192 0-41.4 13.3-79.7 35.7-111.1l267.4 267.4C335.7 434.7 297.4 448 256 448zm45.2-192H384v32h-50.8l-32-32zm111.1 111.1L365.2 320H400c8.8 0 16-7.2 16-16v-64c0-8.8-7.2-16-16-16H269.2L144.9 99.7C176.3 77.3 214.6 64 256 64c105.9 0 192 86.1 192 192 0 41.4-13.3 79.7-35.7 111.1zM320.6 128c-15.6 0-28.6-11.2-31.4-25.9-.7-3.6-4-6.1-7.7-6.1h-16.2c-5 0-8.7 4.5-8 9.4 4.6 30.9 31.2 54.6 63.3 54.6 15.6 0 28.6 11.2 31.4 25.9.7 3.6 4 6.1 7.7 6.1h16.2c5 0 8.7-4.5 8-9.4-4.6-30.9-31.2-54.6-63.3-54.6z\"]\n};\nvar faSms = {\n prefix: 'fas',\n iconName: 'sms',\n icon: [512, 512, [], \"f7cd\", \"M256 32C114.6 32 0 125.1 0 240c0 49.6 21.4 95 57 130.7C44.5 421.1 2.7 466 2.2 466.5c-2.2 2.3-2.8 5.7-1.5 8.7 1.3 3 4.1 4.8 7.3 4.8 66.3 0 116-31.8 140.6-51.4 32.7 12.3 69 19.4 107.4 19.4 141.4 0 256-93.1 256-208S397.4 32 256 32zM128.2 304H116c-4.4 0-8-3.6-8-8v-16c0-4.4 3.6-8 8-8h12.3c6 0 10.4-3.5 10.4-6.6 0-1.3-.8-2.7-2.1-3.8l-21.9-18.8c-8.5-7.2-13.3-17.5-13.3-28.1 0-21.3 19-38.6 42.4-38.6H156c4.4 0 8 3.6 8 8v16c0 4.4-3.6 8-8 8h-12.3c-6 0-10.4 3.5-10.4 6.6 0 1.3.8 2.7 2.1 3.8l21.9 18.8c8.5 7.2 13.3 17.5 13.3 28.1.1 21.3-19 38.6-42.4 38.6zm191.8-8c0 4.4-3.6 8-8 8h-16c-4.4 0-8-3.6-8-8v-68.2l-24.8 55.8c-2.9 5.9-11.4 5.9-14.3 0L224 227.8V296c0 4.4-3.6 8-8 8h-16c-4.4 0-8-3.6-8-8V192c0-8.8 7.2-16 16-16h16c6.1 0 11.6 3.4 14.3 8.8l17.7 35.4 17.7-35.4c2.7-5.4 8.3-8.8 14.3-8.8h16c8.8 0 16 7.2 16 16v104zm48.3 8H356c-4.4 0-8-3.6-8-8v-16c0-4.4 3.6-8 8-8h12.3c6 0 10.4-3.5 10.4-6.6 0-1.3-.8-2.7-2.1-3.8l-21.9-18.8c-8.5-7.2-13.3-17.5-13.3-28.1 0-21.3 19-38.6 42.4-38.6H396c4.4 0 8 3.6 8 8v16c0 4.4-3.6 8-8 8h-12.3c-6 0-10.4 3.5-10.4 6.6 0 1.3.8 2.7 2.1 3.8l21.9 18.8c8.5 7.2 13.3 17.5 13.3 28.1.1 21.3-18.9 38.6-42.3 38.6z\"]\n};\nvar faSnowboarding = {\n prefix: 'fas',\n iconName: 'snowboarding',\n icon: [512, 512, [], \"f7ce\", \"M432 96c26.5 0 48-21.5 48-48S458.5 0 432 0s-48 21.5-48 48 21.5 48 48 48zm28.8 153.6c5.8 4.3 12.5 6.4 19.2 6.4 9.7 0 19.3-4.4 25.6-12.8 10.6-14.1 7.8-34.2-6.4-44.8l-111.4-83.5c-13.8-10.3-29.1-18.4-45.4-23.8l-63.7-21.2-26.1-52.1C244.7 2 225.5-4.4 209.7 3.5c-15.8 7.9-22.2 27.1-14.3 42.9l29.1 58.1c5.7 11.4 15.6 19.9 27.7 24l16.4 5.5-41.2 20.6c-21.8 10.9-35.4 32.8-35.4 57.2v53.1l-74.1 24.7c-16.8 5.6-25.8 23.7-20.2 40.5 1.7 5.2 4.9 9.4 8.7 12.9l-38.7-14.1c-9.7-3.5-17.4-10.6-21.8-20-5.6-12-19.9-17.2-31.9-11.6s-17.2 19.9-11.6 31.9c9.8 21 27.1 36.9 48.9 44.8l364.8 132.7c9.7 3.5 19.7 5.3 29.7 5.3 12.5 0 24.9-2.7 36.5-8.2 12-5.6 17.2-19.9 11.6-31.9S474 454.7 462 460.3c-9.3 4.4-19.8 4.8-29.5 1.3l-90.8-33.1c8.7-4.1 15.6-11.8 17.8-21.9l21.9-102c3.9-18.2-3.2-37.2-18.1-48.4l-52-39 66-30.5 83.5 62.9zm-144.4 51.7l-19.7 92c-1.5 7.1-.1 13.9 2.8 20l-169.4-61.6c2.7-.2 5.4-.4 8-1.3l85-28.4c19.6-6.5 32.8-24.8 32.8-45.5V256l60.5 45.3z\"]\n};\nvar faSnowflake = {\n prefix: 'fas',\n iconName: 'snowflake',\n icon: [448, 512, [], \"f2dc\", \"M440.3 345.2l-33.8-19.5 26-7c8.2-2.2 13.1-10.7 10.9-18.9l-4-14.9c-2.2-8.2-10.7-13.1-18.9-10.9l-70.8 19-63.9-37 63.8-36.9 70.8 19c8.2 2.2 16.7-2.7 18.9-10.9l4-14.9c2.2-8.2-2.7-16.7-10.9-18.9l-26-7 33.8-19.5c7.4-4.3 9.9-13.7 5.7-21.1L430.4 119c-4.3-7.4-13.7-9.9-21.1-5.7l-33.8 19.5 7-26c2.2-8.2-2.7-16.7-10.9-18.9l-14.9-4c-8.2-2.2-16.7 2.7-18.9 10.9l-19 70.8-62.8 36.2v-77.5l53.7-53.7c6.2-6.2 6.2-16.4 0-22.6l-11.3-11.3c-6.2-6.2-16.4-6.2-22.6 0L256 56.4V16c0-8.8-7.2-16-16-16h-32c-8.8 0-16 7.2-16 16v40.4l-19.7-19.7c-6.2-6.2-16.4-6.2-22.6 0L138.3 48c-6.3 6.2-6.3 16.4 0 22.6l53.7 53.7v77.5l-62.8-36.2-19-70.8c-2.2-8.2-10.7-13.1-18.9-10.9l-14.9 4c-8.2 2.2-13.1 10.7-10.9 18.9l7 26-33.8-19.5c-7.4-4.3-16.8-1.7-21.1 5.7L2.1 145.7c-4.3 7.4-1.7 16.8 5.7 21.1l33.8 19.5-26 7c-8.3 2.2-13.2 10.7-11 19l4 14.9c2.2 8.2 10.7 13.1 18.9 10.9l70.8-19 63.8 36.9-63.8 36.9-70.8-19c-8.2-2.2-16.7 2.7-18.9 10.9l-4 14.9c-2.2 8.2 2.7 16.7 10.9 18.9l26 7-33.8 19.6c-7.4 4.3-9.9 13.7-5.7 21.1l15.5 26.8c4.3 7.4 13.7 9.9 21.1 5.7l33.8-19.5-7 26c-2.2 8.2 2.7 16.7 10.9 18.9l14.9 4c8.2 2.2 16.7-2.7 18.9-10.9l19-70.8 62.8-36.2v77.5l-53.7 53.7c-6.3 6.2-6.3 16.4 0 22.6l11.3 11.3c6.2 6.2 16.4 6.2 22.6 0l19.7-19.7V496c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16v-40.4l19.7 19.7c6.2 6.2 16.4 6.2 22.6 0l11.3-11.3c6.2-6.2 6.2-16.4 0-22.6L256 387.7v-77.5l62.8 36.2 19 70.8c2.2 8.2 10.7 13.1 18.9 10.9l14.9-4c8.2-2.2 13.1-10.7 10.9-18.9l-7-26 33.8 19.5c7.4 4.3 16.8 1.7 21.1-5.7l15.5-26.8c4.3-7.3 1.8-16.8-5.6-21z\"]\n};\nvar faSnowman = {\n prefix: 'fas',\n iconName: 'snowman',\n icon: [512, 512, [], \"f7d0\", \"M510.9 152.3l-5.9-14.5c-3.3-8-12.6-11.9-20.8-8.7L456 140.6v-29c0-8.6-7.2-15.6-16-15.6h-16c-8.8 0-16 7-16 15.6v46.9c0 .5.3 1 .3 1.5l-56.4 23c-5.9-10-13.3-18.9-22-26.6 13.6-16.6 22-37.4 22-60.5 0-53-43-96-96-96s-96 43-96 96c0 23.1 8.5 43.9 22 60.5-8.7 7.7-16 16.6-22 26.6l-56.4-23c.1-.5.3-1 .3-1.5v-46.9C104 103 96.8 96 88 96H72c-8.8 0-16 7-16 15.6v29l-28.1-11.5c-8.2-3.2-17.5.7-20.8 8.7l-5.9 14.5c-3.3 8 .7 17.1 8.9 20.3l135.2 55.2c-.4 4-1.2 8-1.2 12.2 0 10.1 1.7 19.6 4.2 28.9C120.9 296.4 104 334.2 104 376c0 54 28.4 100.9 70.8 127.8 9.3 5.9 20.3 8.2 31.3 8.2h99.2c13.3 0 26.3-4.1 37.2-11.7 46.5-32.3 74.4-89.4 62.9-152.6-5.5-30.2-20.5-57.6-41.6-79 2.5-9.2 4.2-18.7 4.2-28.7 0-4.2-.8-8.1-1.2-12.2L502 172.6c8.1-3.1 12.1-12.2 8.9-20.3zM224 96c-8.8 0-16-7.2-16-16s7.2-16 16-16 16 7.2 16 16-7.2 16-16 16zm32 272c-8.8 0-16-7.2-16-16s7.2-16 16-16 16 7.2 16 16-7.2 16-16 16zm0-64c-8.8 0-16-7.2-16-16s7.2-16 16-16 16 7.2 16 16-7.2 16-16 16zm0-64c-8.8 0-16-7.2-16-16s7.2-16 16-16 16 7.2 16 16-7.2 16-16 16zm0-88s-16-23.2-16-32 7.2-16 16-16 16 7.2 16 16-16 32-16 32zm32-56c-8.8 0-16-7.2-16-16s7.2-16 16-16 16 7.2 16 16-7.2 16-16 16z\"]\n};\nvar faSnowplow = {\n prefix: 'fas',\n iconName: 'snowplow',\n icon: [640, 512, [], \"f7d2\", \"M120 376c-13.3 0-24 10.7-24 24s10.7 24 24 24 24-10.7 24-24-10.7-24-24-24zm80 0c-13.3 0-24 10.7-24 24s10.7 24 24 24 24-10.7 24-24-10.7-24-24-24zm80 0c-13.3 0-24 10.7-24 24s10.7 24 24 24 24-10.7 24-24-10.7-24-24-24zm80 0c-13.3 0-24 10.7-24 24s10.7 24 24 24 24-10.7 24-24-10.7-24-24-24zm238.6 49.4c-14.5-14.5-22.6-34.1-22.6-54.6V269.2c0-20.5 8.1-40.1 22.6-54.6l36.7-36.7c6.2-6.2 6.2-16.4 0-22.6l-22.6-22.6c-6.2-6.2-16.4-6.2-22.6 0l-36.7 36.7c-26.5 26.5-41.4 62.4-41.4 99.9V288h-64v-50.9c0-8.7-1.8-17.2-5.2-25.2L364.5 29.1C356.9 11.4 339.6 0 320.3 0H176c-26.5 0-48 21.5-48 48v112h-16c-26.5 0-48 21.5-48 48v91.2C26.3 317.2 0 355.4 0 400c0 61.9 50.1 112 112 112h256c61.9 0 112-50.1 112-112 0-17.3-4.2-33.4-11.2-48H512v18.7c0 37.5 14.9 73.4 41.4 99.9l36.7 36.7c6.2 6.2 16.4 6.2 22.6 0l22.6-22.6c6.2-6.2 6.2-16.4 0-22.6l-36.7-36.7zM192 64h117.8l68.6 160H256l-64-64V64zm176 384H112c-26.5 0-48-21.5-48-48s21.5-48 48-48h256c26.5 0 48 21.5 48 48s-21.5 48-48 48z\"]\n};\nvar faSocks = {\n prefix: 'fas',\n iconName: 'socks',\n icon: [512, 512, [], \"f696\", \"M214.66 311.01L288 256V96H128v176l-86.65 64.61c-39.4 29.56-53.86 84.42-29.21 127.06C30.39 495.25 63.27 512 96.08 512c20.03 0 40.25-6.25 57.52-19.2l21.86-16.39c-29.85-55.38-13.54-125.84 39.2-165.4zM288 32c0-11.05 3.07-21.3 8.02-30.38C293.4.92 290.85 0 288 0H160c-17.67 0-32 14.33-32 32v32h160V32zM480 0H352c-17.67 0-32 14.33-32 32v32h192V32c0-17.67-14.33-32-32-32zM320 272l-86.13 64.61c-39.4 29.56-53.86 84.42-29.21 127.06 18.25 31.58 50.61 48.33 83.42 48.33 20.03 0 40.25-6.25 57.52-19.2l115.2-86.4A127.997 127.997 0 0 0 512 304V96H320v176z\"]\n};\nvar faSolarPanel = {\n prefix: 'fas',\n iconName: 'solar-panel',\n icon: [640, 512, [], \"f5ba\", \"M431.98 448.01l-47.97.05V416h-128v32.21l-47.98.05c-8.82.01-15.97 7.16-15.98 15.99l-.05 31.73c-.01 8.85 7.17 16.03 16.02 16.02l223.96-.26c8.82-.01 15.97-7.16 15.98-15.98l.04-31.73c.01-8.85-7.17-16.03-16.02-16.02zM585.2 26.74C582.58 11.31 568.99 0 553.06 0H86.93C71 0 57.41 11.31 54.79 26.74-3.32 369.16.04 348.08.03 352c-.03 17.32 14.29 32 32.6 32h574.74c18.23 0 32.51-14.56 32.59-31.79.02-4.08 3.35 16.95-54.76-325.47zM259.83 64h120.33l9.77 96H250.06l9.77-96zm-75.17 256H71.09L90.1 208h105.97l-11.41 112zm16.29-160H98.24l16.29-96h96.19l-9.77 96zm32.82 160l11.4-112h149.65l11.4 112H233.77zm195.5-256h96.19l16.29 96H439.04l-9.77-96zm26.06 256l-11.4-112H549.9l19.01 112H455.33z\"]\n};\nvar faSort = {\n prefix: 'fas',\n iconName: 'sort',\n icon: [320, 512, [], \"f0dc\", \"M41 288h238c21.4 0 32.1 25.9 17 41L177 448c-9.4 9.4-24.6 9.4-33.9 0L24 329c-15.1-15.1-4.4-41 17-41zm255-105L177 64c-9.4-9.4-24.6-9.4-33.9 0L24 183c-15.1 15.1-4.4 41 17 41h238c21.4 0 32.1-25.9 17-41z\"]\n};\nvar faSortAlphaDown = {\n prefix: 'fas',\n iconName: 'sort-alpha-down',\n icon: [448, 512, [], \"f15d\", \"M176 352h-48V48a16 16 0 0 0-16-16H80a16 16 0 0 0-16 16v304H16c-14.19 0-21.36 17.24-11.29 27.31l80 96a16 16 0 0 0 22.62 0l80-96C197.35 369.26 190.22 352 176 352zm240-64H288a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h56l-61.26 70.45A32 32 0 0 0 272 446.37V464a16 16 0 0 0 16 16h128a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16h-56l61.26-70.45A32 32 0 0 0 432 321.63V304a16 16 0 0 0-16-16zm31.06-85.38l-59.27-160A16 16 0 0 0 372.72 32h-41.44a16 16 0 0 0-15.07 10.62l-59.27 160A16 16 0 0 0 272 224h24.83a16 16 0 0 0 15.23-11.08l4.42-12.92h71l4.41 12.92A16 16 0 0 0 407.16 224H432a16 16 0 0 0 15.06-21.38zM335.61 144L352 96l16.39 48z\"]\n};\nvar faSortAlphaDownAlt = {\n prefix: 'fas',\n iconName: 'sort-alpha-down-alt',\n icon: [448, 512, [], \"f881\", \"M176 352h-48V48a16 16 0 0 0-16-16H80a16 16 0 0 0-16 16v304H16c-14.19 0-21.36 17.24-11.29 27.31l80 96a16 16 0 0 0 22.62 0l80-96C197.35 369.26 190.22 352 176 352zm112-128h128a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16h-56l61.26-70.45A32 32 0 0 0 432 65.63V48a16 16 0 0 0-16-16H288a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h56l-61.26 70.45A32 32 0 0 0 272 190.37V208a16 16 0 0 0 16 16zm159.06 234.62l-59.27-160A16 16 0 0 0 372.72 288h-41.44a16 16 0 0 0-15.07 10.62l-59.27 160A16 16 0 0 0 272 480h24.83a16 16 0 0 0 15.23-11.08l4.42-12.92h71l4.41 12.92A16 16 0 0 0 407.16 480H432a16 16 0 0 0 15.06-21.38zM335.61 400L352 352l16.39 48z\"]\n};\nvar faSortAlphaUp = {\n prefix: 'fas',\n iconName: 'sort-alpha-up',\n icon: [448, 512, [], \"f15e\", \"M16 160h48v304a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16V160h48c14.21 0 21.38-17.24 11.31-27.31l-80-96a16 16 0 0 0-22.62 0l-80 96C-5.35 142.74 1.78 160 16 160zm400 128H288a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h56l-61.26 70.45A32 32 0 0 0 272 446.37V464a16 16 0 0 0 16 16h128a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16h-56l61.26-70.45A32 32 0 0 0 432 321.63V304a16 16 0 0 0-16-16zm31.06-85.38l-59.27-160A16 16 0 0 0 372.72 32h-41.44a16 16 0 0 0-15.07 10.62l-59.27 160A16 16 0 0 0 272 224h24.83a16 16 0 0 0 15.23-11.08l4.42-12.92h71l4.41 12.92A16 16 0 0 0 407.16 224H432a16 16 0 0 0 15.06-21.38zM335.61 144L352 96l16.39 48z\"]\n};\nvar faSortAlphaUpAlt = {\n prefix: 'fas',\n iconName: 'sort-alpha-up-alt',\n icon: [448, 512, [], \"f882\", \"M16 160h48v304a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16V160h48c14.21 0 21.38-17.24 11.31-27.31l-80-96a16 16 0 0 0-22.62 0l-80 96C-5.35 142.74 1.78 160 16 160zm272 64h128a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16h-56l61.26-70.45A32 32 0 0 0 432 65.63V48a16 16 0 0 0-16-16H288a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h56l-61.26 70.45A32 32 0 0 0 272 190.37V208a16 16 0 0 0 16 16zm159.06 234.62l-59.27-160A16 16 0 0 0 372.72 288h-41.44a16 16 0 0 0-15.07 10.62l-59.27 160A16 16 0 0 0 272 480h24.83a16 16 0 0 0 15.23-11.08l4.42-12.92h71l4.41 12.92A16 16 0 0 0 407.16 480H432a16 16 0 0 0 15.06-21.38zM335.61 400L352 352l16.39 48z\"]\n};\nvar faSortAmountDown = {\n prefix: 'fas',\n iconName: 'sort-amount-down',\n icon: [512, 512, [], \"f160\", \"M304 416h-64a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h64a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm-128-64h-48V48a16 16 0 0 0-16-16H80a16 16 0 0 0-16 16v304H16c-14.19 0-21.37 17.24-11.29 27.31l80 96a16 16 0 0 0 22.62 0l80-96C197.35 369.26 190.22 352 176 352zm256-192H240a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h192a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm-64 128H240a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h128a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zM496 32H240a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h256a16 16 0 0 0 16-16V48a16 16 0 0 0-16-16z\"]\n};\nvar faSortAmountDownAlt = {\n prefix: 'fas',\n iconName: 'sort-amount-down-alt',\n icon: [512, 512, [], \"f884\", \"M240 96h64a16 16 0 0 0 16-16V48a16 16 0 0 0-16-16h-64a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16zm0 128h128a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16H240a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16zm256 192H240a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h256a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm-256-64h192a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16H240a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16zm-64 0h-48V48a16 16 0 0 0-16-16H80a16 16 0 0 0-16 16v304H16c-14.19 0-21.37 17.24-11.29 27.31l80 96a16 16 0 0 0 22.62 0l80-96C197.35 369.26 190.22 352 176 352z\"]\n};\nvar faSortAmountUp = {\n prefix: 'fas',\n iconName: 'sort-amount-up',\n icon: [512, 512, [], \"f161\", \"M304 416h-64a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h64a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zM16 160h48v304a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16V160h48c14.21 0 21.38-17.24 11.31-27.31l-80-96a16 16 0 0 0-22.62 0l-80 96C-5.35 142.74 1.77 160 16 160zm416 0H240a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h192a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm-64 128H240a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h128a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zM496 32H240a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h256a16 16 0 0 0 16-16V48a16 16 0 0 0-16-16z\"]\n};\nvar faSortAmountUpAlt = {\n prefix: 'fas',\n iconName: 'sort-amount-up-alt',\n icon: [512, 512, [], \"f885\", \"M240 96h64a16 16 0 0 0 16-16V48a16 16 0 0 0-16-16h-64a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16zm0 128h128a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16H240a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16zm256 192H240a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h256a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm-256-64h192a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16H240a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16zM16 160h48v304a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16V160h48c14.21 0 21.39-17.24 11.31-27.31l-80-96a16 16 0 0 0-22.62 0l-80 96C-5.35 142.74 1.78 160 16 160z\"]\n};\nvar faSortDown = {\n prefix: 'fas',\n iconName: 'sort-down',\n icon: [320, 512, [], \"f0dd\", \"M41 288h238c21.4 0 32.1 25.9 17 41L177 448c-9.4 9.4-24.6 9.4-33.9 0L24 329c-15.1-15.1-4.4-41 17-41z\"]\n};\nvar faSortNumericDown = {\n prefix: 'fas',\n iconName: 'sort-numeric-down',\n icon: [448, 512, [], \"f162\", \"M304 96h16v64h-16a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h96a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16h-16V48a16 16 0 0 0-16-16h-48a16 16 0 0 0-14.29 8.83l-16 32A16 16 0 0 0 304 96zm26.15 162.91a79 79 0 0 0-55 54.17c-14.25 51.05 21.21 97.77 68.85 102.53a84.07 84.07 0 0 1-20.85 12.91c-7.57 3.4-10.8 12.47-8.18 20.34l9.9 20c2.87 8.63 12.53 13.49 20.9 9.91 58-24.76 86.25-61.61 86.25-132V336c-.02-51.21-48.4-91.34-101.85-77.09zM352 356a20 20 0 1 1 20-20 20 20 0 0 1-20 20zm-176-4h-48V48a16 16 0 0 0-16-16H80a16 16 0 0 0-16 16v304H16c-14.19 0-21.36 17.24-11.29 27.31l80 96a16 16 0 0 0 22.62 0l80-96C197.35 369.26 190.22 352 176 352z\"]\n};\nvar faSortNumericDownAlt = {\n prefix: 'fas',\n iconName: 'sort-numeric-down-alt',\n icon: [448, 512, [], \"f886\", \"M176 352h-48V48a16 16 0 0 0-16-16H80a16 16 0 0 0-16 16v304H16c-14.19 0-21.36 17.24-11.29 27.31l80 96a16 16 0 0 0 22.62 0l80-96C197.35 369.26 190.22 352 176 352zm224 64h-16V304a16 16 0 0 0-16-16h-48a16 16 0 0 0-14.29 8.83l-16 32A16 16 0 0 0 304 352h16v64h-16a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h96a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zM330.17 34.91a79 79 0 0 0-55 54.17c-14.27 51.05 21.19 97.77 68.83 102.53a84.07 84.07 0 0 1-20.85 12.91c-7.57 3.4-10.8 12.47-8.18 20.34l9.9 20c2.87 8.63 12.53 13.49 20.9 9.91 58-24.77 86.25-61.61 86.25-132V112c-.02-51.21-48.4-91.34-101.85-77.09zM352 132a20 20 0 1 1 20-20 20 20 0 0 1-20 20z\"]\n};\nvar faSortNumericUp = {\n prefix: 'fas',\n iconName: 'sort-numeric-up',\n icon: [448, 512, [], \"f163\", \"M330.17 258.91a79 79 0 0 0-55 54.17c-14.27 51.05 21.19 97.77 68.83 102.53a84.07 84.07 0 0 1-20.85 12.91c-7.57 3.4-10.8 12.47-8.18 20.34l9.9 20c2.87 8.63 12.53 13.49 20.9 9.91 58-24.76 86.25-61.61 86.25-132V336c-.02-51.21-48.4-91.34-101.85-77.09zM352 356a20 20 0 1 1 20-20 20 20 0 0 1-20 20zM304 96h16v64h-16a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h96a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16h-16V48a16 16 0 0 0-16-16h-48a16 16 0 0 0-14.29 8.83l-16 32A16 16 0 0 0 304 96zM107.31 36.69a16 16 0 0 0-22.62 0l-80 96C-5.35 142.74 1.78 160 16 160h48v304a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16V160h48c14.21 0 21.38-17.24 11.31-27.31z\"]\n};\nvar faSortNumericUpAlt = {\n prefix: 'fas',\n iconName: 'sort-numeric-up-alt',\n icon: [448, 512, [], \"f887\", \"M107.31 36.69a16 16 0 0 0-22.62 0l-80 96C-5.35 142.74 1.78 160 16 160h48v304a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16V160h48c14.21 0 21.38-17.24 11.31-27.31zM400 416h-16V304a16 16 0 0 0-16-16h-48a16 16 0 0 0-14.29 8.83l-16 32A16 16 0 0 0 304 352h16v64h-16a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h96a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zM330.17 34.91a79 79 0 0 0-55 54.17c-14.27 51.05 21.19 97.77 68.83 102.53a84.07 84.07 0 0 1-20.85 12.91c-7.57 3.4-10.8 12.47-8.18 20.34l9.9 20c2.87 8.63 12.53 13.49 20.9 9.91 58-24.77 86.25-61.61 86.25-132V112c-.02-51.21-48.4-91.34-101.85-77.09zM352 132a20 20 0 1 1 20-20 20 20 0 0 1-20 20z\"]\n};\nvar faSortUp = {\n prefix: 'fas',\n iconName: 'sort-up',\n icon: [320, 512, [], \"f0de\", \"M279 224H41c-21.4 0-32.1-25.9-17-41L143 64c9.4-9.4 24.6-9.4 33.9 0l119 119c15.2 15.1 4.5 41-16.9 41z\"]\n};\nvar faSpa = {\n prefix: 'fas',\n iconName: 'spa',\n icon: [576, 512, [], \"f5bb\", \"M568.25 192c-29.04.13-135.01 6.16-213.84 83-33.12 29.63-53.36 63.3-66.41 94.86-13.05-31.56-33.29-65.23-66.41-94.86-78.83-76.84-184.8-82.87-213.84-83-4.41-.02-7.79 3.4-7.75 7.82.23 27.92 7.14 126.14 88.77 199.3C172.79 480.94 256 480 288 480s115.19.95 199.23-80.88c81.64-73.17 88.54-171.38 88.77-199.3.04-4.42-3.34-7.84-7.75-7.82zM287.98 302.6c12.82-18.85 27.6-35.78 44.09-50.52 19.09-18.61 39.58-33.3 60.26-45.18-16.44-70.5-51.72-133.05-96.73-172.22-4.11-3.58-11.02-3.58-15.14 0-44.99 39.14-80.27 101.63-96.74 172.07 20.37 11.7 40.5 26.14 59.22 44.39a282.768 282.768 0 0 1 45.04 51.46z\"]\n};\nvar faSpaceShuttle = {\n prefix: 'fas',\n iconName: 'space-shuttle',\n icon: [640, 512, [], \"f197\", \"M592.604 208.244C559.735 192.836 515.777 184 472 184H186.327c-4.952-6.555-10.585-11.978-16.72-16H376C229.157 137.747 219.403 32 96.003 32H96v128H80V32c-26.51 0-48 28.654-48 64v64c-23.197 0-32 10.032-32 24v40c0 13.983 8.819 24 32 24v16c-23.197 0-32 10.032-32 24v40c0 13.983 8.819 24 32 24v64c0 35.346 21.49 64 48 64V352h16v128h.003c123.4 0 133.154-105.747 279.997-136H169.606c6.135-4.022 11.768-9.445 16.72-16H472c43.777 0 87.735-8.836 120.604-24.244C622.282 289.845 640 271.992 640 256s-17.718-33.845-47.396-47.756zM488 296a8 8 0 0 1-8-8v-64a8 8 0 0 1 8-8c31.909 0 31.942 80 0 80z\"]\n};\nvar faSpellCheck = {\n prefix: 'fas',\n iconName: 'spell-check',\n icon: [576, 512, [], \"f891\", \"M272 256h91.36c43.2 0 82-32.2 84.51-75.34a79.82 79.82 0 0 0-25.26-63.07 79.81 79.81 0 0 0 9.06-44.91C427.9 30.57 389.3 0 347 0h-75a16 16 0 0 0-16 16v224a16 16 0 0 0 16 16zm40-200h40a24 24 0 0 1 0 48h-40zm0 96h56a24 24 0 0 1 0 48h-56zM155.12 22.25A32 32 0 0 0 124.64 0H99.36a32 32 0 0 0-30.48 22.25L.59 235.73A16 16 0 0 0 16 256h24.93a16 16 0 0 0 15.42-11.73L68.29 208h87.42l11.94 36.27A16 16 0 0 0 183.07 256H208a16 16 0 0 0 15.42-20.27zM89.37 144L112 75.3l22.63 68.7zm482 132.48l-45.21-45.3a15.88 15.88 0 0 0-22.59 0l-151.5 151.5-55.41-55.5a15.88 15.88 0 0 0-22.59 0l-45.3 45.3a16 16 0 0 0 0 22.59l112 112.21a15.89 15.89 0 0 0 22.6 0l208-208.21a16 16 0 0 0-.02-22.59z\"]\n};\nvar faSpider = {\n prefix: 'fas',\n iconName: 'spider',\n icon: [576, 512, [], \"f717\", \"M151.17 167.35L177.1 176h4.67l5.22-26.12c.72-3.58 1.8-7.58 3.21-11.79l-20.29-40.58 23.8-71.39c2.79-8.38-1.73-17.44-10.12-20.24L168.42.82c-8.38-2.8-17.45 1.73-20.24 10.12l-25.89 77.68a32.04 32.04 0 0 0 1.73 24.43l27.15 54.3zm422.14 182.03l-52.75-79.12a32.002 32.002 0 0 0-26.62-14.25H416l68.99-24.36a32.03 32.03 0 0 0 16.51-12.61l53.6-80.41c4.9-7.35 2.91-17.29-4.44-22.19l-13.31-8.88c-7.35-4.9-17.29-2.91-22.19 4.44l-50.56 75.83L404.1 208H368l-10.37-51.85C355.44 145.18 340.26 96 288 96c-52.26 0-67.44 49.18-69.63 60.15L208 208h-36.1l-60.49-20.17L60.84 112c-4.9-7.35-14.83-9.34-22.19-4.44l-13.31 8.88c-7.35 4.9-9.34 14.83-4.44 22.19l53.6 80.41a32.03 32.03 0 0 0 16.51 12.61L160 256H82.06a32.02 32.02 0 0 0-26.63 14.25L2.69 349.38c-4.9 7.35-2.92 17.29 4.44 22.19l13.31 8.88c7.35 4.9 17.29 2.91 22.19-4.44l48-72h47.06l-60.83 97.33A31.988 31.988 0 0 0 72 418.3V496c0 8.84 7.16 16 16 16h16c8.84 0 16-7.16 16-16v-73.11l74.08-118.53c-1.01 14.05-2.08 28.11-2.08 42.21C192 399.64 232.76 448 288 448s96-48.36 96-101.43c0-14.1-1.08-28.16-2.08-42.21L456 422.89V496c0 8.84 7.16 16 16 16h16c8.84 0 16-7.16 16-16v-77.71c0-6-1.69-11.88-4.86-16.96L438.31 304h47.06l48 72c4.9 7.35 14.84 9.34 22.19 4.44l13.31-8.88c7.36-4.9 9.34-14.83 4.44-22.18zM406.09 97.51l-20.29 40.58c1.41 4.21 2.49 8.21 3.21 11.79l5.22 26.12h4.67l25.93-8.65 27.15-54.3a31.995 31.995 0 0 0 1.73-24.43l-25.89-77.68C425.03 2.56 415.96-1.98 407.58.82l-15.17 5.06c-8.38 2.8-12.91 11.86-10.12 20.24l23.8 71.39z\"]\n};\nvar faSpinner = {\n prefix: 'fas',\n iconName: 'spinner',\n icon: [512, 512, [], \"f110\", \"M304 48c0 26.51-21.49 48-48 48s-48-21.49-48-48 21.49-48 48-48 48 21.49 48 48zm-48 368c-26.51 0-48 21.49-48 48s21.49 48 48 48 48-21.49 48-48-21.49-48-48-48zm208-208c-26.51 0-48 21.49-48 48s21.49 48 48 48 48-21.49 48-48-21.49-48-48-48zM96 256c0-26.51-21.49-48-48-48S0 229.49 0 256s21.49 48 48 48 48-21.49 48-48zm12.922 99.078c-26.51 0-48 21.49-48 48s21.49 48 48 48 48-21.49 48-48c0-26.509-21.491-48-48-48zm294.156 0c-26.51 0-48 21.49-48 48s21.49 48 48 48 48-21.49 48-48c0-26.509-21.49-48-48-48zM108.922 60.922c-26.51 0-48 21.49-48 48s21.49 48 48 48 48-21.49 48-48-21.491-48-48-48z\"]\n};\nvar faSplotch = {\n prefix: 'fas',\n iconName: 'splotch',\n icon: [512, 512, [], \"f5bc\", \"M472.29 195.89l-67.06-22.95c-19.28-6.6-33.54-20.92-38.14-38.3L351.1 74.19c-11.58-43.77-76.57-57.13-109.98-22.62l-46.14 47.67c-13.26 13.71-33.54 20.93-54.2 19.31l-71.88-5.62c-52.05-4.07-86.93 44.88-59.03 82.83l38.54 52.42c11.08 15.07 12.82 33.86 4.64 50.24L24.62 355.4c-20.59 41.25 22.84 84.87 73.49 73.81l69.96-15.28c20.11-4.39 41.45 0 57.07 11.73l54.32 40.83c39.32 29.56 101.04 7.57 104.45-37.22l4.7-61.86c1.35-17.79 12.8-33.86 30.63-42.99l62-31.74c44.88-22.96 39.59-80.17-8.95-96.79z\"]\n};\nvar faSprayCan = {\n prefix: 'fas',\n iconName: 'spray-can',\n icon: [512, 512, [], \"f5bd\", \"M224 32c0-17.67-14.33-32-32-32h-64c-17.67 0-32 14.33-32 32v96h128V32zm256 96c-17.67 0-32 14.33-32 32s14.33 32 32 32 32-14.33 32-32-14.33-32-32-32zm-256 32H96c-53.02 0-96 42.98-96 96v224c0 17.67 14.33 32 32 32h256c17.67 0 32-14.33 32-32V256c0-53.02-42.98-96-96-96zm-64 256c-44.18 0-80-35.82-80-80s35.82-80 80-80 80 35.82 80 80-35.82 80-80 80zM480 96c17.67 0 32-14.33 32-32s-14.33-32-32-32-32 14.33-32 32 14.33 32 32 32zm-96 32c-17.67 0-32 14.33-32 32s14.33 32 32 32 32-14.33 32-32-14.33-32-32-32zm-96-96c-17.67 0-32 14.33-32 32s14.33 32 32 32 32-14.33 32-32-14.33-32-32-32zm96 0c-17.67 0-32 14.33-32 32s14.33 32 32 32 32-14.33 32-32-14.33-32-32-32zm96 192c-17.67 0-32 14.33-32 32s14.33 32 32 32 32-14.33 32-32-14.33-32-32-32z\"]\n};\nvar faSquare = {\n prefix: 'fas',\n iconName: 'square',\n icon: [448, 512, [], \"f0c8\", \"M400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48z\"]\n};\nvar faSquareFull = {\n prefix: 'fas',\n iconName: 'square-full',\n icon: [512, 512, [], \"f45c\", \"M512 512H0V0h512v512z\"]\n};\nvar faSquareRootAlt = {\n prefix: 'fas',\n iconName: 'square-root-alt',\n icon: [576, 512, [], \"f698\", \"M571.31 251.31l-22.62-22.62c-6.25-6.25-16.38-6.25-22.63 0L480 274.75l-46.06-46.06c-6.25-6.25-16.38-6.25-22.63 0l-22.62 22.62c-6.25 6.25-6.25 16.38 0 22.63L434.75 320l-46.06 46.06c-6.25 6.25-6.25 16.38 0 22.63l22.62 22.62c6.25 6.25 16.38 6.25 22.63 0L480 365.25l46.06 46.06c6.25 6.25 16.38 6.25 22.63 0l22.62-22.62c6.25-6.25 6.25-16.38 0-22.63L525.25 320l46.06-46.06c6.25-6.25 6.25-16.38 0-22.63zM552 0H307.65c-14.54 0-27.26 9.8-30.95 23.87l-84.79 322.8-58.41-106.1A32.008 32.008 0 0 0 105.47 224H24c-13.25 0-24 10.74-24 24v48c0 13.25 10.75 24 24 24h43.62l88.88 163.73C168.99 503.5 186.3 512 204.94 512c17.27 0 44.44-9 54.28-41.48L357.03 96H552c13.25 0 24-10.75 24-24V24c0-13.26-10.75-24-24-24z\"]\n};\nvar faStamp = {\n prefix: 'fas',\n iconName: 'stamp',\n icon: [512, 512, [], \"f5bf\", \"M32 512h448v-64H32v64zm384-256h-66.56c-16.26 0-29.44-13.18-29.44-29.44v-9.46c0-27.37 8.88-53.41 21.46-77.72 9.11-17.61 12.9-38.39 9.05-60.42-6.77-38.78-38.47-70.7-77.26-77.45C212.62-9.04 160 37.33 160 96c0 14.16 3.12 27.54 8.69 39.58C182.02 164.43 192 194.7 192 226.49v.07c0 16.26-13.18 29.44-29.44 29.44H96c-53.02 0-96 42.98-96 96v32c0 17.67 14.33 32 32 32h448c17.67 0 32-14.33 32-32v-32c0-53.02-42.98-96-96-96z\"]\n};\nvar faStar = {\n prefix: 'fas',\n iconName: 'star',\n icon: [576, 512, [], \"f005\", \"M259.3 17.8L194 150.2 47.9 171.5c-26.2 3.8-36.7 36.1-17.7 54.6l105.7 103-25 145.5c-4.5 26.3 23.2 46 46.4 33.7L288 439.6l130.7 68.7c23.2 12.2 50.9-7.4 46.4-33.7l-25-145.5 105.7-103c19-18.5 8.5-50.8-17.7-54.6L382 150.2 316.7 17.8c-11.7-23.6-45.6-23.9-57.4 0z\"]\n};\nvar faStarAndCrescent = {\n prefix: 'fas',\n iconName: 'star-and-crescent',\n icon: [512, 512, [], \"f699\", \"M340.47 466.36c-1.45 0-6.89.46-9.18.46-116.25 0-210.82-94.57-210.82-210.82S215.04 45.18 331.29 45.18c2.32 0 7.7.46 9.18.46 7.13 0 13.33-5.03 14.75-12.07 1.46-7.25-2.55-14.49-9.47-17.09C316.58 5.54 286.39 0 256 0 114.84 0 0 114.84 0 256s114.84 256 256 256c30.23 0 60.28-5.49 89.32-16.32 5.96-2.02 10.28-7.64 10.28-14.26 0-8.09-6.39-15.06-15.13-15.06zm162.99-252.5l-76.38-11.1-34.16-69.21c-1.83-3.7-5.38-5.55-8.93-5.55s-7.1 1.85-8.93 5.55l-34.16 69.21-76.38 11.1c-8.17 1.18-11.43 11.22-5.52 16.99l55.27 53.87-13.05 76.07c-1.11 6.44 4.01 11.66 9.81 11.66 1.53 0 3.11-.36 4.64-1.17L384 335.37l68.31 35.91c1.53.8 3.11 1.17 4.64 1.17 5.8 0 10.92-5.23 9.81-11.66l-13.05-76.07 55.27-53.87c5.91-5.77 2.65-15.81-5.52-16.99z\"]\n};\nvar faStarHalf = {\n prefix: 'fas',\n iconName: 'star-half',\n icon: [576, 512, [], \"f089\", \"M288 0c-11.4 0-22.8 5.9-28.7 17.8L194 150.2 47.9 171.4c-26.2 3.8-36.7 36.1-17.7 54.6l105.7 103-25 145.5c-4.5 26.1 23 46 46.4 33.7L288 439.6V0z\"]\n};\nvar faStarHalfAlt = {\n prefix: 'fas',\n iconName: 'star-half-alt',\n icon: [536, 512, [], \"f5c0\", \"M508.55 171.51L362.18 150.2 296.77 17.81C290.89 5.98 279.42 0 267.95 0c-11.4 0-22.79 5.9-28.69 17.81l-65.43 132.38-146.38 21.29c-26.25 3.8-36.77 36.09-17.74 54.59l105.89 103-25.06 145.48C86.98 495.33 103.57 512 122.15 512c4.93 0 10-1.17 14.87-3.75l130.95-68.68 130.94 68.7c4.86 2.55 9.92 3.71 14.83 3.71 18.6 0 35.22-16.61 31.66-37.4l-25.03-145.49 105.91-102.98c19.04-18.5 8.52-50.8-17.73-54.6zm-121.74 123.2l-18.12 17.62 4.28 24.88 19.52 113.45-102.13-53.59-22.38-11.74.03-317.19 51.03 103.29 11.18 22.63 25.01 3.64 114.23 16.63-82.65 80.38z\"]\n};\nvar faStarOfDavid = {\n prefix: 'fas',\n iconName: 'star-of-david',\n icon: [464, 512, [], \"f69a\", \"M405.68 256l53.21-89.39C473.3 142.4 455.48 112 426.88 112H319.96l-55.95-93.98C256.86 6.01 244.43 0 232 0s-24.86 6.01-32.01 18.02L144.04 112H37.11c-28.6 0-46.42 30.4-32.01 54.61L58.32 256 5.1 345.39C-9.31 369.6 8.51 400 37.11 400h106.93l55.95 93.98C207.14 505.99 219.57 512 232 512s24.86-6.01 32.01-18.02L319.96 400h106.93c28.6 0 46.42-30.4 32.01-54.61L405.68 256zm-12.78-88l-19.8 33.26L353.3 168h39.6zm-52.39 88l-52.39 88H175.88l-52.39-88 52.38-88h112.25l52.39 88zM232 73.72L254.79 112h-45.57L232 73.72zM71.1 168h39.6l-19.8 33.26L71.1 168zm0 176l19.8-33.26L110.7 344H71.1zM232 438.28L209.21 400h45.57L232 438.28zM353.29 344l19.8-33.26L392.9 344h-39.61z\"]\n};\nvar faStarOfLife = {\n prefix: 'fas',\n iconName: 'star-of-life',\n icon: [480, 512, [], \"f621\", \"M471.99 334.43L336.06 256l135.93-78.43c7.66-4.42 10.28-14.2 5.86-21.86l-32.02-55.43c-4.42-7.65-14.21-10.28-21.87-5.86l-135.93 78.43V16c0-8.84-7.17-16-16.01-16h-64.04c-8.84 0-16.01 7.16-16.01 16v156.86L56.04 94.43c-7.66-4.42-17.45-1.79-21.87 5.86L2.15 155.71c-4.42 7.65-1.8 17.44 5.86 21.86L143.94 256 8.01 334.43c-7.66 4.42-10.28 14.21-5.86 21.86l32.02 55.43c4.42 7.65 14.21 10.27 21.87 5.86l135.93-78.43V496c0 8.84 7.17 16 16.01 16h64.04c8.84 0 16.01-7.16 16.01-16V339.14l135.93 78.43c7.66 4.42 17.45 1.8 21.87-5.86l32.02-55.43c4.42-7.65 1.8-17.43-5.86-21.85z\"]\n};\nvar faStepBackward = {\n prefix: 'fas',\n iconName: 'step-backward',\n icon: [448, 512, [], \"f048\", \"M64 468V44c0-6.6 5.4-12 12-12h48c6.6 0 12 5.4 12 12v176.4l195.5-181C352.1 22.3 384 36.6 384 64v384c0 27.4-31.9 41.7-52.5 24.6L136 292.7V468c0 6.6-5.4 12-12 12H76c-6.6 0-12-5.4-12-12z\"]\n};\nvar faStepForward = {\n prefix: 'fas',\n iconName: 'step-forward',\n icon: [448, 512, [], \"f051\", \"M384 44v424c0 6.6-5.4 12-12 12h-48c-6.6 0-12-5.4-12-12V291.6l-195.5 181C95.9 489.7 64 475.4 64 448V64c0-27.4 31.9-41.7 52.5-24.6L312 219.3V44c0-6.6 5.4-12 12-12h48c6.6 0 12 5.4 12 12z\"]\n};\nvar faStethoscope = {\n prefix: 'fas',\n iconName: 'stethoscope',\n icon: [512, 512, [], \"f0f1\", \"M447.1 112c-34.2.5-62.3 28.4-63 62.6-.5 24.3 12.5 45.6 32 56.8V344c0 57.3-50.2 104-112 104-60 0-109.2-44.1-111.9-99.2C265 333.8 320 269.2 320 192V36.6c0-11.4-8.1-21.3-19.3-23.5L237.8.5c-13-2.6-25.6 5.8-28.2 18.8L206.4 35c-2.6 13 5.8 25.6 18.8 28.2l30.7 6.1v121.4c0 52.9-42.2 96.7-95.1 97.2-53.4.5-96.9-42.7-96.9-96V69.4l30.7-6.1c13-2.6 21.4-15.2 18.8-28.2l-3.1-15.7C107.7 6.4 95.1-2 82.1.6L19.3 13C8.1 15.3 0 25.1 0 36.6V192c0 77.3 55.1 142 128.1 156.8C130.7 439.2 208.6 512 304 512c97 0 176-75.4 176-168V231.4c19.1-11.1 32-31.7 32-55.4 0-35.7-29.2-64.5-64.9-64zm.9 80c-8.8 0-16-7.2-16-16s7.2-16 16-16 16 7.2 16 16-7.2 16-16 16z\"]\n};\nvar faStickyNote = {\n prefix: 'fas',\n iconName: 'sticky-note',\n icon: [448, 512, [], \"f249\", \"M312 320h136V56c0-13.3-10.7-24-24-24H24C10.7 32 0 42.7 0 56v400c0 13.3 10.7 24 24 24h264V344c0-13.2 10.8-24 24-24zm129 55l-98 98c-4.5 4.5-10.6 7-17 7h-6V352h128v6.1c0 6.3-2.5 12.4-7 16.9z\"]\n};\nvar faStop = {\n prefix: 'fas',\n iconName: 'stop',\n icon: [448, 512, [], \"f04d\", \"M400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48z\"]\n};\nvar faStopCircle = {\n prefix: 'fas',\n iconName: 'stop-circle',\n icon: [512, 512, [], \"f28d\", \"M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm96 328c0 8.8-7.2 16-16 16H176c-8.8 0-16-7.2-16-16V176c0-8.8 7.2-16 16-16h160c8.8 0 16 7.2 16 16v160z\"]\n};\nvar faStopwatch = {\n prefix: 'fas',\n iconName: 'stopwatch',\n icon: [448, 512, [], \"f2f2\", \"M432 304c0 114.9-93.1 208-208 208S16 418.9 16 304c0-104 76.3-190.2 176-205.5V64h-28c-6.6 0-12-5.4-12-12V12c0-6.6 5.4-12 12-12h120c6.6 0 12 5.4 12 12v40c0 6.6-5.4 12-12 12h-28v34.5c37.5 5.8 71.7 21.6 99.7 44.6l27.5-27.5c4.7-4.7 12.3-4.7 17 0l28.3 28.3c4.7 4.7 4.7 12.3 0 17l-29.4 29.4-.6.6C419.7 223.3 432 262.2 432 304zm-176 36V188.5c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12V340c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12z\"]\n};\nvar faStore = {\n prefix: 'fas',\n iconName: 'store',\n icon: [616, 512, [], \"f54e\", \"M602 118.6L537.1 15C531.3 5.7 521 0 510 0H106C95 0 84.7 5.7 78.9 15L14 118.6c-33.5 53.5-3.8 127.9 58.8 136.4 4.5.6 9.1.9 13.7.9 29.6 0 55.8-13 73.8-33.1 18 20.1 44.3 33.1 73.8 33.1 29.6 0 55.8-13 73.8-33.1 18 20.1 44.3 33.1 73.8 33.1 29.6 0 55.8-13 73.8-33.1 18.1 20.1 44.3 33.1 73.8 33.1 4.7 0 9.2-.3 13.7-.9 62.8-8.4 92.6-82.8 59-136.4zM529.5 288c-10 0-19.9-1.5-29.5-3.8V384H116v-99.8c-9.6 2.2-19.5 3.8-29.5 3.8-6 0-12.1-.4-18-1.2-5.6-.8-11.1-2.1-16.4-3.6V480c0 17.7 14.3 32 32 32h448c17.7 0 32-14.3 32-32V283.2c-5.4 1.6-10.8 2.9-16.4 3.6-6.1.8-12.1 1.2-18.2 1.2z\"]\n};\nvar faStoreAlt = {\n prefix: 'fas',\n iconName: 'store-alt',\n icon: [640, 512, [], \"f54f\", \"M320 384H128V224H64v256c0 17.7 14.3 32 32 32h256c17.7 0 32-14.3 32-32V224h-64v160zm314.6-241.8l-85.3-128c-6-8.9-16-14.2-26.7-14.2H117.4c-10.7 0-20.7 5.3-26.6 14.2l-85.3 128c-14.2 21.3 1 49.8 26.6 49.8H608c25.5 0 40.7-28.5 26.6-49.8zM512 496c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16V224h-64v272z\"]\n};\nvar faStream = {\n prefix: 'fas',\n iconName: 'stream',\n icon: [512, 512, [], \"f550\", \"M16 128h416c8.84 0 16-7.16 16-16V48c0-8.84-7.16-16-16-16H16C7.16 32 0 39.16 0 48v64c0 8.84 7.16 16 16 16zm480 80H80c-8.84 0-16 7.16-16 16v64c0 8.84 7.16 16 16 16h416c8.84 0 16-7.16 16-16v-64c0-8.84-7.16-16-16-16zm-64 176H16c-8.84 0-16 7.16-16 16v64c0 8.84 7.16 16 16 16h416c8.84 0 16-7.16 16-16v-64c0-8.84-7.16-16-16-16z\"]\n};\nvar faStreetView = {\n prefix: 'fas',\n iconName: 'street-view',\n icon: [512, 512, [], \"f21d\", \"M367.9 329.76c-4.62 5.3-9.78 10.1-15.9 13.65v22.94c66.52 9.34 112 28.05 112 49.65 0 30.93-93.12 56-208 56S48 446.93 48 416c0-21.6 45.48-40.3 112-49.65v-22.94c-6.12-3.55-11.28-8.35-15.9-13.65C58.87 345.34 0 378.05 0 416c0 53.02 114.62 96 256 96s256-42.98 256-96c0-37.95-58.87-70.66-144.1-86.24zM256 128c35.35 0 64-28.65 64-64S291.35 0 256 0s-64 28.65-64 64 28.65 64 64 64zm-64 192v96c0 17.67 14.33 32 32 32h64c17.67 0 32-14.33 32-32v-96c17.67 0 32-14.33 32-32v-96c0-26.51-21.49-48-48-48h-11.8c-11.07 5.03-23.26 8-36.2 8s-25.13-2.97-36.2-8H208c-26.51 0-48 21.49-48 48v96c0 17.67 14.33 32 32 32z\"]\n};\nvar faStrikethrough = {\n prefix: 'fas',\n iconName: 'strikethrough',\n icon: [512, 512, [], \"f0cc\", \"M496 224H293.9l-87.17-26.83A43.55 43.55 0 0 1 219.55 112h66.79A49.89 49.89 0 0 1 331 139.58a16 16 0 0 0 21.46 7.15l42.94-21.47a16 16 0 0 0 7.16-21.46l-.53-1A128 128 0 0 0 287.51 32h-68a123.68 123.68 0 0 0-123 135.64c2 20.89 10.1 39.83 21.78 56.36H16a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h480a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm-180.24 96A43 43 0 0 1 336 356.45 43.59 43.59 0 0 1 292.45 400h-66.79A49.89 49.89 0 0 1 181 372.42a16 16 0 0 0-21.46-7.15l-42.94 21.47a16 16 0 0 0-7.16 21.46l.53 1A128 128 0 0 0 224.49 480h68a123.68 123.68 0 0 0 123-135.64 114.25 114.25 0 0 0-5.34-24.36z\"]\n};\nvar faStroopwafel = {\n prefix: 'fas',\n iconName: 'stroopwafel',\n icon: [512, 512, [], \"f551\", \"M188.12 210.74L142.86 256l45.25 45.25L233.37 256l-45.25-45.26zm113.13-22.62L256 142.86l-45.25 45.25L256 233.37l45.25-45.25zm-90.5 135.76L256 369.14l45.26-45.26L256 278.63l-45.25 45.25zM256 0C114.62 0 0 114.62 0 256s114.62 256 256 256 256-114.62 256-256S397.38 0 256 0zm186.68 295.6l-11.31 11.31c-3.12 3.12-8.19 3.12-11.31 0l-28.29-28.29-45.25 45.25 33.94 33.94 16.97-16.97c3.12-3.12 8.19-3.12 11.31 0l11.31 11.31c3.12 3.12 3.12 8.19 0 11.31l-16.97 16.97 16.97 16.97c3.12 3.12 3.12 8.19 0 11.31l-11.31 11.31c-3.12 3.12-8.19 3.12-11.31 0l-16.97-16.97-16.97 16.97c-3.12 3.12-8.19 3.12-11.31 0l-11.31-11.31c-3.12-3.12-3.12-8.19 0-11.31l16.97-16.97-33.94-33.94-45.26 45.26 28.29 28.29c3.12 3.12 3.12 8.19 0 11.31l-11.31 11.31c-3.12 3.12-8.19 3.12-11.31 0L256 414.39l-28.29 28.29c-3.12 3.12-8.19 3.12-11.31 0l-11.31-11.31c-3.12-3.12-3.12-8.19 0-11.31l28.29-28.29-45.25-45.26-33.94 33.94 16.97 16.97c3.12 3.12 3.12 8.19 0 11.31l-11.31 11.31c-3.12 3.12-8.19 3.12-11.31 0l-16.97-16.97-16.97 16.97c-3.12 3.12-8.19 3.12-11.31 0l-11.31-11.31c-3.12-3.12-3.12-8.19 0-11.31l16.97-16.97-16.97-16.97c-3.12-3.12-3.12-8.19 0-11.31l11.31-11.31c3.12-3.12 8.19-3.12 11.31 0l16.97 16.97 33.94-33.94-45.25-45.25-28.29 28.29c-3.12 3.12-8.19 3.12-11.31 0L69.32 295.6c-3.12-3.12-3.12-8.19 0-11.31L97.61 256l-28.29-28.29c-3.12-3.12-3.12-8.19 0-11.31l11.31-11.31c3.12-3.12 8.19-3.12 11.31 0l28.29 28.29 45.25-45.26-33.94-33.94-16.97 16.97c-3.12 3.12-8.19 3.12-11.31 0l-11.31-11.31c-3.12-3.12-3.12-8.19 0-11.31l16.97-16.97-16.97-16.97c-3.12-3.12-3.12-8.19 0-11.31l11.31-11.31c3.12-3.12 8.19-3.12 11.31 0l16.97 16.97 16.97-16.97c3.12-3.12 8.19-3.12 11.31 0l11.31 11.31c3.12 3.12 3.12 8.19 0 11.31l-16.97 16.97 33.94 33.94 45.26-45.25-28.29-28.29c-3.12-3.12-3.12-8.19 0-11.31l11.31-11.31c3.12-3.12 8.19-3.12 11.31 0L256 97.61l28.29-28.29c3.12-3.12 8.19-3.12 11.31 0l11.31 11.31c3.12 3.12 3.12 8.19 0 11.31l-28.29 28.29 45.26 45.25 33.94-33.94-16.97-16.97c-3.12-3.12-3.12-8.19 0-11.31l11.31-11.31c3.12-3.12 8.19-3.12 11.31 0l16.97 16.97 16.97-16.97c3.12-3.12 8.19-3.12 11.31 0l11.31 11.31c3.12 3.12 3.12 8.19 0 11.31l-16.97 16.97 16.97 16.97c3.12 3.12 3.12 8.19 0 11.31l-11.31 11.31c-3.12 3.12-8.19 3.12-11.31 0l-16.97-16.97-33.94 33.94 45.25 45.26 28.29-28.29c3.12-3.12 8.19-3.12 11.31 0l11.31 11.31c3.12 3.12 3.12 8.19 0 11.31L414.39 256l28.29 28.28a8.015 8.015 0 0 1 0 11.32zM278.63 256l45.26 45.25L369.14 256l-45.25-45.26L278.63 256z\"]\n};\nvar faSubscript = {\n prefix: 'fas',\n iconName: 'subscript',\n icon: [512, 512, [], \"f12c\", \"M496 448h-16V304a16 16 0 0 0-16-16h-48a16 16 0 0 0-14.29 8.83l-16 32A16 16 0 0 0 400 352h16v96h-16a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h96a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zM336 64h-67a16 16 0 0 0-13.14 6.87l-79.9 115-79.9-115A16 16 0 0 0 83 64H16A16 16 0 0 0 0 80v48a16 16 0 0 0 16 16h33.48l77.81 112-77.81 112H16a16 16 0 0 0-16 16v48a16 16 0 0 0 16 16h67a16 16 0 0 0 13.14-6.87l79.9-115 79.9 115A16 16 0 0 0 269 448h67a16 16 0 0 0 16-16v-48a16 16 0 0 0-16-16h-33.48l-77.81-112 77.81-112H336a16 16 0 0 0 16-16V80a16 16 0 0 0-16-16z\"]\n};\nvar faSubway = {\n prefix: 'fas',\n iconName: 'subway',\n icon: [448, 512, [], \"f239\", \"M448 96v256c0 51.815-61.624 96-130.022 96l62.98 49.721C386.905 502.417 383.562 512 376 512H72c-7.578 0-10.892-9.594-4.957-14.279L130.022 448C61.82 448 0 403.954 0 352V96C0 42.981 64 0 128 0h192c65 0 128 42.981 128 96zM200 232V120c0-13.255-10.745-24-24-24H72c-13.255 0-24 10.745-24 24v112c0 13.255 10.745 24 24 24h104c13.255 0 24-10.745 24-24zm200 0V120c0-13.255-10.745-24-24-24H272c-13.255 0-24 10.745-24 24v112c0 13.255 10.745 24 24 24h104c13.255 0 24-10.745 24-24zm-48 56c-26.51 0-48 21.49-48 48s21.49 48 48 48 48-21.49 48-48-21.49-48-48-48zm-256 0c-26.51 0-48 21.49-48 48s21.49 48 48 48 48-21.49 48-48-21.49-48-48-48z\"]\n};\nvar faSuitcase = {\n prefix: 'fas',\n iconName: 'suitcase',\n icon: [512, 512, [], \"f0f2\", \"M128 480h256V80c0-26.5-21.5-48-48-48H176c-26.5 0-48 21.5-48 48v400zm64-384h128v32H192V96zm320 80v256c0 26.5-21.5 48-48 48h-48V128h48c26.5 0 48 21.5 48 48zM96 480H48c-26.5 0-48-21.5-48-48V176c0-26.5 21.5-48 48-48h48v352z\"]\n};\nvar faSuitcaseRolling = {\n prefix: 'fas',\n iconName: 'suitcase-rolling',\n icon: [384, 512, [], \"f5c1\", \"M336 160H48c-26.51 0-48 21.49-48 48v224c0 26.51 21.49 48 48 48h16v16c0 8.84 7.16 16 16 16h32c8.84 0 16-7.16 16-16v-16h128v16c0 8.84 7.16 16 16 16h32c8.84 0 16-7.16 16-16v-16h16c26.51 0 48-21.49 48-48V208c0-26.51-21.49-48-48-48zm-16 216c0 4.42-3.58 8-8 8H72c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h240c4.42 0 8 3.58 8 8v16zm0-96c0 4.42-3.58 8-8 8H72c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h240c4.42 0 8 3.58 8 8v16zM144 48h96v80h48V48c0-26.51-21.49-48-48-48h-96c-26.51 0-48 21.49-48 48v80h48V48z\"]\n};\nvar faSun = {\n prefix: 'fas',\n iconName: 'sun',\n icon: [512, 512, [], \"f185\", \"M256 160c-52.9 0-96 43.1-96 96s43.1 96 96 96 96-43.1 96-96-43.1-96-96-96zm246.4 80.5l-94.7-47.3 33.5-100.4c4.5-13.6-8.4-26.5-21.9-21.9l-100.4 33.5-47.4-94.8c-6.4-12.8-24.6-12.8-31 0l-47.3 94.7L92.7 70.8c-13.6-4.5-26.5 8.4-21.9 21.9l33.5 100.4-94.7 47.4c-12.8 6.4-12.8 24.6 0 31l94.7 47.3-33.5 100.5c-4.5 13.6 8.4 26.5 21.9 21.9l100.4-33.5 47.3 94.7c6.4 12.8 24.6 12.8 31 0l47.3-94.7 100.4 33.5c13.6 4.5 26.5-8.4 21.9-21.9l-33.5-100.4 94.7-47.3c13-6.5 13-24.7.2-31.1zm-155.9 106c-49.9 49.9-131.1 49.9-181 0-49.9-49.9-49.9-131.1 0-181 49.9-49.9 131.1-49.9 181 0 49.9 49.9 49.9 131.1 0 181z\"]\n};\nvar faSuperscript = {\n prefix: 'fas',\n iconName: 'superscript',\n icon: [512, 512, [], \"f12b\", \"M496 160h-16V16a16 16 0 0 0-16-16h-48a16 16 0 0 0-14.29 8.83l-16 32A16 16 0 0 0 400 64h16v96h-16a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h96a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zM336 64h-67a16 16 0 0 0-13.14 6.87l-79.9 115-79.9-115A16 16 0 0 0 83 64H16A16 16 0 0 0 0 80v48a16 16 0 0 0 16 16h33.48l77.81 112-77.81 112H16a16 16 0 0 0-16 16v48a16 16 0 0 0 16 16h67a16 16 0 0 0 13.14-6.87l79.9-115 79.9 115A16 16 0 0 0 269 448h67a16 16 0 0 0 16-16v-48a16 16 0 0 0-16-16h-33.48l-77.81-112 77.81-112H336a16 16 0 0 0 16-16V80a16 16 0 0 0-16-16z\"]\n};\nvar faSurprise = {\n prefix: 'fas',\n iconName: 'surprise',\n icon: [496, 512, [], \"f5c2\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zM136 208c0-17.7 14.3-32 32-32s32 14.3 32 32-14.3 32-32 32-32-14.3-32-32zm112 208c-35.3 0-64-28.7-64-64s28.7-64 64-64 64 28.7 64 64-28.7 64-64 64zm80-176c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32z\"]\n};\nvar faSwatchbook = {\n prefix: 'fas',\n iconName: 'swatchbook',\n icon: [511, 512, [], \"f5c3\", \"M479.06 320H372.29L186.15 506.51c-2.06 2.07-4.49 3.58-6.67 5.49h299.58c17.64 0 31.94-14.33 31.94-32V352c0-17.67-14.3-32-31.94-32zm-44.5-152.9l-90.33-90.51c-12.47-12.5-32.69-12.5-45.17 0l-75.5 75.65V416c0 2.96-.67 5.73-.87 8.64l211.87-212.28c12.47-12.5 12.47-32.77 0-45.26zM191.62 32c0-17.67-14.3-32-31.94-32H31.94C14.3 0 0 14.33 0 32v384c0 53.02 42.9 96 95.81 96s95.81-42.98 95.81-96V32zM95.81 440c-13.23 0-23.95-10.75-23.95-24 0-13.26 10.73-24 23.95-24s23.95 10.74 23.95 24c.01 13.25-10.72 24-23.95 24zm31.94-184H63.88v-64h63.88v64zm0-128H63.88V64h63.88v64z\"]\n};\nvar faSwimmer = {\n prefix: 'fas',\n iconName: 'swimmer',\n icon: [640, 512, [], \"f5c4\", \"M189.61 310.58c3.54 3.26 15.27 9.42 34.39 9.42s30.86-6.16 34.39-9.42c16.02-14.77 34.5-22.58 53.46-22.58h16.3c18.96 0 37.45 7.81 53.46 22.58 3.54 3.26 15.27 9.42 34.39 9.42s30.86-6.16 34.39-9.42c14.86-13.71 31.88-21.12 49.39-22.16l-112.84-80.6 18-12.86c3.64-2.58 8.28-3.52 12.62-2.61l100.35 21.53c25.91 5.53 51.44-10.97 57-36.88 5.55-25.92-10.95-51.44-36.88-57L437.68 98.47c-30.73-6.58-63.02.12-88.56 18.38l-80.02 57.17c-10.38 7.39-19.36 16.44-26.72 26.94L173.75 299c5.47 3.23 10.82 6.93 15.86 11.58zM624 352h-16c-26.04 0-45.8-8.42-56.09-17.9-8.9-8.21-19.66-14.1-31.77-14.1h-16.3c-12.11 0-22.87 5.89-31.77 14.1C461.8 343.58 442.04 352 416 352s-45.8-8.42-56.09-17.9c-8.9-8.21-19.66-14.1-31.77-14.1h-16.3c-12.11 0-22.87 5.89-31.77 14.1C269.8 343.58 250.04 352 224 352s-45.8-8.42-56.09-17.9c-8.9-8.21-19.66-14.1-31.77-14.1h-16.3c-12.11 0-22.87 5.89-31.77 14.1C77.8 343.58 58.04 352 32 352H16c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h16c38.62 0 72.72-12.19 96-31.84 23.28 19.66 57.38 31.84 96 31.84s72.72-12.19 96-31.84c23.28 19.66 57.38 31.84 96 31.84s72.72-12.19 96-31.84c23.28 19.66 57.38 31.84 96 31.84h16c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16zm-512-96c44.18 0 80-35.82 80-80s-35.82-80-80-80-80 35.82-80 80 35.82 80 80 80z\"]\n};\nvar faSwimmingPool = {\n prefix: 'fas',\n iconName: 'swimming-pool',\n icon: [640, 512, [], \"f5c5\", \"M624 416h-16c-26.04 0-45.8-8.42-56.09-17.9-8.9-8.21-19.66-14.1-31.77-14.1h-16.3c-12.11 0-22.87 5.89-31.77 14.1C461.8 407.58 442.04 416 416 416s-45.8-8.42-56.09-17.9c-8.9-8.21-19.66-14.1-31.77-14.1h-16.3c-12.11 0-22.87 5.89-31.77 14.1C269.8 407.58 250.04 416 224 416s-45.8-8.42-56.09-17.9c-8.9-8.21-19.66-14.1-31.77-14.1h-16.3c-12.11 0-22.87 5.89-31.77 14.1C77.8 407.58 58.04 416 32 416H16c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h16c38.62 0 72.72-12.19 96-31.84 23.28 19.66 57.38 31.84 96 31.84s72.72-12.19 96-31.84c23.28 19.66 57.38 31.84 96 31.84s72.72-12.19 96-31.84c23.28 19.66 57.38 31.84 96 31.84h16c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16zm-400-32v-96h192v96c19.12 0 30.86-6.16 34.39-9.42 9.17-8.46 19.2-14.34 29.61-18.07V128c0-17.64 14.36-32 32-32s32 14.36 32 32v16c0 8.84 7.16 16 16 16h32c8.84 0 16-7.16 16-16v-16c0-52.94-43.06-96-96-96s-96 43.06-96 96v96H224v-96c0-17.64 14.36-32 32-32s32 14.36 32 32v16c0 8.84 7.16 16 16 16h32c8.84 0 16-7.16 16-16v-16c0-52.94-43.06-96-96-96s-96 43.06-96 96v228.5c10.41 3.73 20.44 9.62 29.61 18.07 3.53 3.27 15.27 9.43 34.39 9.43z\"]\n};\nvar faSynagogue = {\n prefix: 'fas',\n iconName: 'synagogue',\n icon: [640, 512, [], \"f69b\", \"M70 196.51L6.67 268.29A26.643 26.643 0 0 0 0 285.93V512h128V239.58l-38-43.07c-5.31-6.01-14.69-6.01-20 0zm563.33 71.78L570 196.51c-5.31-6.02-14.69-6.02-20 0l-38 43.07V512h128V285.93c0-6.5-2.37-12.77-6.67-17.64zM339.99 7.01c-11.69-9.35-28.29-9.35-39.98 0l-128 102.4A32.005 32.005 0 0 0 160 134.4V512h96v-92.57c0-31.88 21.78-61.43 53.25-66.55C349.34 346.35 384 377.13 384 416v96h96V134.4c0-9.72-4.42-18.92-12.01-24.99l-128-102.4zm52.07 215.55c1.98 3.15-.29 7.24-4 7.24h-38.94L324 269.79c-1.85 2.95-6.15 2.95-8 0l-25.12-39.98h-38.94c-3.72 0-5.98-4.09-4-7.24l19.2-30.56-19.2-30.56c-1.98-3.15.29-7.24 4-7.24h38.94l25.12-40c1.85-2.95 6.15-2.95 8 0l25.12 39.98h38.95c3.71 0 5.98 4.09 4 7.24L372.87 192l19.19 30.56z\"]\n};\nvar faSync = {\n prefix: 'fas',\n iconName: 'sync',\n icon: [512, 512, [], \"f021\", \"M440.65 12.57l4 82.77A247.16 247.16 0 0 0 255.83 8C134.73 8 33.91 94.92 12.29 209.82A12 12 0 0 0 24.09 224h49.05a12 12 0 0 0 11.67-9.26 175.91 175.91 0 0 1 317-56.94l-101.46-4.86a12 12 0 0 0-12.57 12v47.41a12 12 0 0 0 12 12H500a12 12 0 0 0 12-12V12a12 12 0 0 0-12-12h-47.37a12 12 0 0 0-11.98 12.57zM255.83 432a175.61 175.61 0 0 1-146-77.8l101.8 4.87a12 12 0 0 0 12.57-12v-47.4a12 12 0 0 0-12-12H12a12 12 0 0 0-12 12V500a12 12 0 0 0 12 12h47.35a12 12 0 0 0 12-12.6l-4.15-82.57A247.17 247.17 0 0 0 255.83 504c121.11 0 221.93-86.92 243.55-201.82a12 12 0 0 0-11.8-14.18h-49.05a12 12 0 0 0-11.67 9.26A175.86 175.86 0 0 1 255.83 432z\"]\n};\nvar faSyncAlt = {\n prefix: 'fas',\n iconName: 'sync-alt',\n icon: [512, 512, [], \"f2f1\", \"M370.72 133.28C339.458 104.008 298.888 87.962 255.848 88c-77.458.068-144.328 53.178-162.791 126.85-1.344 5.363-6.122 9.15-11.651 9.15H24.103c-7.498 0-13.194-6.807-11.807-14.176C33.933 94.924 134.813 8 256 8c66.448 0 126.791 26.136 171.315 68.685L463.03 40.97C478.149 25.851 504 36.559 504 57.941V192c0 13.255-10.745 24-24 24H345.941c-21.382 0-32.09-25.851-16.971-40.971l41.75-41.749zM32 296h134.059c21.382 0 32.09 25.851 16.971 40.971l-41.75 41.75c31.262 29.273 71.835 45.319 114.876 45.28 77.418-.07 144.315-53.144 162.787-126.849 1.344-5.363 6.122-9.15 11.651-9.15h57.304c7.498 0 13.194 6.807 11.807 14.176C478.067 417.076 377.187 504 256 504c-66.448 0-126.791-26.136-171.315-68.685L48.97 471.03C33.851 486.149 8 475.441 8 454.059V320c0-13.255 10.745-24 24-24z\"]\n};\nvar faSyringe = {\n prefix: 'fas',\n iconName: 'syringe',\n icon: [512, 512, [], \"f48e\", \"M201.5 174.8l55.7 55.8c3.1 3.1 3.1 8.2 0 11.3l-11.3 11.3c-3.1 3.1-8.2 3.1-11.3 0l-55.7-55.8-45.3 45.3 55.8 55.8c3.1 3.1 3.1 8.2 0 11.3l-11.3 11.3c-3.1 3.1-8.2 3.1-11.3 0L111 265.2l-26.4 26.4c-17.3 17.3-25.6 41.1-23 65.4l7.1 63.6L2.3 487c-3.1 3.1-3.1 8.2 0 11.3l11.3 11.3c3.1 3.1 8.2 3.1 11.3 0l66.3-66.3 63.6 7.1c23.9 2.6 47.9-5.4 65.4-23l181.9-181.9-135.7-135.7-64.9 65zm308.2-93.3L430.5 2.3c-3.1-3.1-8.2-3.1-11.3 0l-11.3 11.3c-3.1 3.1-3.1 8.2 0 11.3l28.3 28.3-45.3 45.3-56.6-56.6-17-17c-3.1-3.1-8.2-3.1-11.3 0l-33.9 33.9c-3.1 3.1-3.1 8.2 0 11.3l17 17L424.8 223l17 17c3.1 3.1 8.2 3.1 11.3 0l33.9-34c3.1-3.1 3.1-8.2 0-11.3l-73.5-73.5 45.3-45.3 28.3 28.3c3.1 3.1 8.2 3.1 11.3 0l11.3-11.3c3.1-3.2 3.1-8.2 0-11.4z\"]\n};\nvar faTable = {\n prefix: 'fas',\n iconName: 'table',\n icon: [512, 512, [], \"f0ce\", \"M464 32H48C21.49 32 0 53.49 0 80v352c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48V80c0-26.51-21.49-48-48-48zM224 416H64v-96h160v96zm0-160H64v-96h160v96zm224 160H288v-96h160v96zm0-160H288v-96h160v96z\"]\n};\nvar faTableTennis = {\n prefix: 'fas',\n iconName: 'table-tennis',\n icon: [512, 512, [], \"f45d\", \"M496.2 296.5C527.7 218.7 512 126.2 449 63.1 365.1-21 229-21 145.1 63.1l-56 56.1 211.5 211.5c46.1-62.1 131.5-77.4 195.6-34.2zm-217.9 79.7L57.9 155.9c-27.3 45.3-21.7 105 17.3 144.1l34.5 34.6L6.7 424c-8.6 7.5-9.1 20.7-1 28.8l53.4 53.5c8 8.1 21.2 7.6 28.7-1L177.1 402l35.7 35.7c19.7 19.7 44.6 30.5 70.3 33.3-7.1-17-11-35.6-11-55.1-.1-13.8 2.5-27 6.2-39.7zM416 320c-53 0-96 43-96 96s43 96 96 96 96-43 96-96-43-96-96-96z\"]\n};\nvar faTablet = {\n prefix: 'fas',\n iconName: 'tablet',\n icon: [448, 512, [], \"f10a\", \"M400 0H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V48c0-26.5-21.5-48-48-48zM224 480c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32z\"]\n};\nvar faTabletAlt = {\n prefix: 'fas',\n iconName: 'tablet-alt',\n icon: [448, 512, [], \"f3fa\", \"M400 0H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V48c0-26.5-21.5-48-48-48zM224 480c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32zm176-108c0 6.6-5.4 12-12 12H60c-6.6 0-12-5.4-12-12V60c0-6.6 5.4-12 12-12h328c6.6 0 12 5.4 12 12v312z\"]\n};\nvar faTablets = {\n prefix: 'fas',\n iconName: 'tablets',\n icon: [640, 512, [], \"f490\", \"M160 192C78.9 192 12.5 250.5.1 326.7c-.8 4.8 3.3 9.3 8.3 9.3h303.3c5 0 9.1-4.5 8.3-9.3C307.5 250.5 241.1 192 160 192zm151.6 176H8.4c-5 0-9.1 4.5-8.3 9.3C12.5 453.5 78.9 512 160 512s147.5-58.5 159.9-134.7c.8-4.8-3.3-9.3-8.3-9.3zM593.4 46.6c-56.5-56.5-144.2-61.4-206.9-16-4 2.9-4.3 8.9-.8 12.3L597 254.3c3.5 3.5 9.5 3.2 12.3-.8 45.5-62.7 40.6-150.4-15.9-206.9zM363 65.7c-3.5-3.5-9.5-3.2-12.3.8-45.4 62.7-40.5 150.4 15.9 206.9 56.5 56.5 144.2 61.4 206.9 15.9 4-2.9 4.3-8.9.8-12.3L363 65.7z\"]\n};\nvar faTachometerAlt = {\n prefix: 'fas',\n iconName: 'tachometer-alt',\n icon: [576, 512, [], \"f3fd\", \"M288 32C128.94 32 0 160.94 0 320c0 52.8 14.25 102.26 39.06 144.8 5.61 9.62 16.3 15.2 27.44 15.2h443c11.14 0 21.83-5.58 27.44-15.2C561.75 422.26 576 372.8 576 320c0-159.06-128.94-288-288-288zm0 64c14.71 0 26.58 10.13 30.32 23.65-1.11 2.26-2.64 4.23-3.45 6.67l-9.22 27.67c-5.13 3.49-10.97 6.01-17.64 6.01-17.67 0-32-14.33-32-32S270.33 96 288 96zM96 384c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm48-160c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm246.77-72.41l-61.33 184C343.13 347.33 352 364.54 352 384c0 11.72-3.38 22.55-8.88 32H232.88c-5.5-9.45-8.88-20.28-8.88-32 0-33.94 26.5-61.43 59.9-63.59l61.34-184.01c4.17-12.56 17.73-19.45 30.36-15.17 12.57 4.19 19.35 17.79 15.17 30.36zm14.66 57.2l15.52-46.55c3.47-1.29 7.13-2.23 11.05-2.23 17.67 0 32 14.33 32 32s-14.33 32-32 32c-11.38-.01-20.89-6.28-26.57-15.22zM480 384c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32z\"]\n};\nvar faTag = {\n prefix: 'fas',\n iconName: 'tag',\n icon: [512, 512, [], \"f02b\", \"M0 252.118V48C0 21.49 21.49 0 48 0h204.118a48 48 0 0 1 33.941 14.059l211.882 211.882c18.745 18.745 18.745 49.137 0 67.882L293.823 497.941c-18.745 18.745-49.137 18.745-67.882 0L14.059 286.059A48 48 0 0 1 0 252.118zM112 64c-26.51 0-48 21.49-48 48s21.49 48 48 48 48-21.49 48-48-21.49-48-48-48z\"]\n};\nvar faTags = {\n prefix: 'fas',\n iconName: 'tags',\n icon: [640, 512, [], \"f02c\", \"M497.941 225.941L286.059 14.059A48 48 0 0 0 252.118 0H48C21.49 0 0 21.49 0 48v204.118a48 48 0 0 0 14.059 33.941l211.882 211.882c18.744 18.745 49.136 18.746 67.882 0l204.118-204.118c18.745-18.745 18.745-49.137 0-67.882zM112 160c-26.51 0-48-21.49-48-48s21.49-48 48-48 48 21.49 48 48-21.49 48-48 48zm513.941 133.823L421.823 497.941c-18.745 18.745-49.137 18.745-67.882 0l-.36-.36L527.64 323.522c16.999-16.999 26.36-39.6 26.36-63.64s-9.362-46.641-26.36-63.64L331.397 0h48.721a48 48 0 0 1 33.941 14.059l211.882 211.882c18.745 18.745 18.745 49.137 0 67.882z\"]\n};\nvar faTape = {\n prefix: 'fas',\n iconName: 'tape',\n icon: [640, 512, [], \"f4db\", \"M224 192c-35.3 0-64 28.7-64 64s28.7 64 64 64 64-28.7 64-64-28.7-64-64-64zm400 224H380.6c41.5-40.7 67.4-97.3 67.4-160 0-123.7-100.3-224-224-224S0 132.3 0 256s100.3 224 224 224h400c8.8 0 16-7.2 16-16v-32c0-8.8-7.2-16-16-16zm-400-64c-53 0-96-43-96-96s43-96 96-96 96 43 96 96-43 96-96 96z\"]\n};\nvar faTasks = {\n prefix: 'fas',\n iconName: 'tasks',\n icon: [512, 512, [], \"f0ae\", \"M139.61 35.5a12 12 0 0 0-17 0L58.93 98.81l-22.7-22.12a12 12 0 0 0-17 0L3.53 92.41a12 12 0 0 0 0 17l47.59 47.4a12.78 12.78 0 0 0 17.61 0l15.59-15.62L156.52 69a12.09 12.09 0 0 0 .09-17zm0 159.19a12 12 0 0 0-17 0l-63.68 63.72-22.7-22.1a12 12 0 0 0-17 0L3.53 252a12 12 0 0 0 0 17L51 316.5a12.77 12.77 0 0 0 17.6 0l15.7-15.69 72.2-72.22a12 12 0 0 0 .09-16.9zM64 368c-26.49 0-48.59 21.5-48.59 48S37.53 464 64 464a48 48 0 0 0 0-96zm432 16H208a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h288a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm0-320H208a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h288a16 16 0 0 0 16-16V80a16 16 0 0 0-16-16zm0 160H208a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h288a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16z\"]\n};\nvar faTaxi = {\n prefix: 'fas',\n iconName: 'taxi',\n icon: [512, 512, [], \"f1ba\", \"M462 241.64l-22-84.84c-9.6-35.2-41.6-60.8-76.8-60.8H352V64c0-17.67-14.33-32-32-32H192c-17.67 0-32 14.33-32 32v32h-11.2c-35.2 0-67.2 25.6-76.8 60.8l-22 84.84C21.41 248.04 0 273.47 0 304v48c0 23.63 12.95 44.04 32 55.12V448c0 17.67 14.33 32 32 32h32c17.67 0 32-14.33 32-32v-32h256v32c0 17.67 14.33 32 32 32h32c17.67 0 32-14.33 32-32v-40.88c19.05-11.09 32-31.5 32-55.12v-48c0-30.53-21.41-55.96-50-62.36zM96 352c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm20.55-112l17.2-66.36c2.23-8.16 9.59-13.64 15.06-13.64h214.4c5.47 0 12.83 5.48 14.85 12.86L395.45 240h-278.9zM416 352c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32z\"]\n};\nvar faTeeth = {\n prefix: 'fas',\n iconName: 'teeth',\n icon: [640, 512, [], \"f62e\", \"M544 0H96C42.98 0 0 42.98 0 96v320c0 53.02 42.98 96 96 96h448c53.02 0 96-42.98 96-96V96c0-53.02-42.98-96-96-96zM160 368c0 26.51-21.49 48-48 48s-48-21.49-48-48v-64c0-8.84 7.16-16 16-16h64c8.84 0 16 7.16 16 16v64zm0-128c0 8.84-7.16 16-16 16H80c-8.84 0-16-7.16-16-16v-64c0-26.51 21.49-48 48-48s48 21.49 48 48v64zm144 120c0 30.93-25.07 56-56 56s-56-25.07-56-56v-56c0-8.84 7.16-16 16-16h80c8.84 0 16 7.16 16 16v56zm0-120c0 8.84-7.16 16-16 16h-80c-8.84 0-16-7.16-16-16v-88c0-30.93 25.07-56 56-56s56 25.07 56 56v88zm144 120c0 30.93-25.07 56-56 56s-56-25.07-56-56v-56c0-8.84 7.16-16 16-16h80c8.84 0 16 7.16 16 16v56zm0-120c0 8.84-7.16 16-16 16h-80c-8.84 0-16-7.16-16-16v-88c0-30.93 25.07-56 56-56s56 25.07 56 56v88zm128 128c0 26.51-21.49 48-48 48s-48-21.49-48-48v-64c0-8.84 7.16-16 16-16h64c8.84 0 16 7.16 16 16v64zm0-128c0 8.84-7.16 16-16 16h-64c-8.84 0-16-7.16-16-16v-64c0-26.51 21.49-48 48-48s48 21.49 48 48v64z\"]\n};\nvar faTeethOpen = {\n prefix: 'fas',\n iconName: 'teeth-open',\n icon: [640, 512, [], \"f62f\", \"M544 0H96C42.98 0 0 42.98 0 96v64c0 35.35 28.66 64 64 64h512c35.34 0 64-28.65 64-64V96c0-53.02-42.98-96-96-96zM160 176c0 8.84-7.16 16-16 16H80c-8.84 0-16-7.16-16-16v-32c0-26.51 21.49-48 48-48s48 21.49 48 48v32zm144 0c0 8.84-7.16 16-16 16h-80c-8.84 0-16-7.16-16-16v-56c0-30.93 25.07-56 56-56s56 25.07 56 56v56zm144 0c0 8.84-7.16 16-16 16h-80c-8.84 0-16-7.16-16-16v-56c0-30.93 25.07-56 56-56s56 25.07 56 56v56zm128 0c0 8.84-7.16 16-16 16h-64c-8.84 0-16-7.16-16-16v-32c0-26.51 21.49-48 48-48s48 21.49 48 48v32zm0 144H64c-35.34 0-64 28.65-64 64v32c0 53.02 42.98 96 96 96h448c53.02 0 96-42.98 96-96v-32c0-35.35-28.66-64-64-64zm-416 80c0 26.51-21.49 48-48 48s-48-21.49-48-48v-32c0-8.84 7.16-16 16-16h64c8.84 0 16 7.16 16 16v32zm144-8c0 30.93-25.07 56-56 56s-56-25.07-56-56v-24c0-8.84 7.16-16 16-16h80c8.84 0 16 7.16 16 16v24zm144 0c0 30.93-25.07 56-56 56s-56-25.07-56-56v-24c0-8.84 7.16-16 16-16h80c8.84 0 16 7.16 16 16v24zm128 8c0 26.51-21.49 48-48 48s-48-21.49-48-48v-32c0-8.84 7.16-16 16-16h64c8.84 0 16 7.16 16 16v32z\"]\n};\nvar faTemperatureHigh = {\n prefix: 'fas',\n iconName: 'temperature-high',\n icon: [512, 512, [], \"f769\", \"M416 0c-52.9 0-96 43.1-96 96s43.1 96 96 96 96-43.1 96-96-43.1-96-96-96zm0 128c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32zm-160-16C256 50.1 205.9 0 144 0S32 50.1 32 112v166.5C12.3 303.2 0 334 0 368c0 79.5 64.5 144 144 144s144-64.5 144-144c0-34-12.3-64.9-32-89.5V112zM144 448c-44.1 0-80-35.9-80-80 0-25.5 12.2-48.9 32-63.8V112c0-26.5 21.5-48 48-48s48 21.5 48 48v192.2c19.8 14.8 32 38.3 32 63.8 0 44.1-35.9 80-80 80zm16-125.1V112c0-8.8-7.2-16-16-16s-16 7.2-16 16v210.9c-18.6 6.6-32 24.2-32 45.1 0 26.5 21.5 48 48 48s48-21.5 48-48c0-20.9-13.4-38.5-32-45.1z\"]\n};\nvar faTemperatureLow = {\n prefix: 'fas',\n iconName: 'temperature-low',\n icon: [512, 512, [], \"f76b\", \"M416 0c-52.9 0-96 43.1-96 96s43.1 96 96 96 96-43.1 96-96-43.1-96-96-96zm0 128c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32zm-160-16C256 50.1 205.9 0 144 0S32 50.1 32 112v166.5C12.3 303.2 0 334 0 368c0 79.5 64.5 144 144 144s144-64.5 144-144c0-34-12.3-64.9-32-89.5V112zM144 448c-44.1 0-80-35.9-80-80 0-25.5 12.2-48.9 32-63.8V112c0-26.5 21.5-48 48-48s48 21.5 48 48v192.2c19.8 14.8 32 38.3 32 63.8 0 44.1-35.9 80-80 80zm16-125.1V304c0-8.8-7.2-16-16-16s-16 7.2-16 16v18.9c-18.6 6.6-32 24.2-32 45.1 0 26.5 21.5 48 48 48s48-21.5 48-48c0-20.9-13.4-38.5-32-45.1z\"]\n};\nvar faTenge = {\n prefix: 'fas',\n iconName: 'tenge',\n icon: [384, 512, [], \"f7d7\", \"M372 160H12c-6.6 0-12 5.4-12 12v56c0 6.6 5.4 12 12 12h140v228c0 6.6 5.4 12 12 12h56c6.6 0 12-5.4 12-12V240h140c6.6 0 12-5.4 12-12v-56c0-6.6-5.4-12-12-12zm0-128H12C5.4 32 0 37.4 0 44v56c0 6.6 5.4 12 12 12h360c6.6 0 12-5.4 12-12V44c0-6.6-5.4-12-12-12z\"]\n};\nvar faTerminal = {\n prefix: 'fas',\n iconName: 'terminal',\n icon: [640, 512, [], \"f120\", \"M257.981 272.971L63.638 467.314c-9.373 9.373-24.569 9.373-33.941 0L7.029 444.647c-9.357-9.357-9.375-24.522-.04-33.901L161.011 256 6.99 101.255c-9.335-9.379-9.317-24.544.04-33.901l22.667-22.667c9.373-9.373 24.569-9.373 33.941 0L257.981 239.03c9.373 9.372 9.373 24.568 0 33.941zM640 456v-32c0-13.255-10.745-24-24-24H312c-13.255 0-24 10.745-24 24v32c0 13.255 10.745 24 24 24h304c13.255 0 24-10.745 24-24z\"]\n};\nvar faTextHeight = {\n prefix: 'fas',\n iconName: 'text-height',\n icon: [576, 512, [], \"f034\", \"M304 32H16A16 16 0 0 0 0 48v96a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16v-32h56v304H80a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h160a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16h-40V112h56v32a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16V48a16 16 0 0 0-16-16zm256 336h-48V144h48c14.31 0 21.33-17.31 11.31-27.31l-80-80a16 16 0 0 0-22.62 0l-80 80C379.36 126 384.36 144 400 144h48v224h-48c-14.31 0-21.32 17.31-11.31 27.31l80 80a16 16 0 0 0 22.62 0l80-80C580.64 386 575.64 368 560 368z\"]\n};\nvar faTextWidth = {\n prefix: 'fas',\n iconName: 'text-width',\n icon: [448, 512, [], \"f035\", \"M432 32H16A16 16 0 0 0 0 48v80a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16v-16h120v112h-24a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h128a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16h-24V112h120v16a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16V48a16 16 0 0 0-16-16zm-68.69 260.69C354 283.36 336 288.36 336 304v48H112v-48c0-14.31-17.31-21.32-27.31-11.31l-80 80a16 16 0 0 0 0 22.62l80 80C94 484.64 112 479.64 112 464v-48h224v48c0 14.31 17.31 21.33 27.31 11.31l80-80a16 16 0 0 0 0-22.62z\"]\n};\nvar faTh = {\n prefix: 'fas',\n iconName: 'th',\n icon: [512, 512, [], \"f00a\", \"M149.333 56v80c0 13.255-10.745 24-24 24H24c-13.255 0-24-10.745-24-24V56c0-13.255 10.745-24 24-24h101.333c13.255 0 24 10.745 24 24zm181.334 240v-80c0-13.255-10.745-24-24-24H205.333c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24h101.333c13.256 0 24.001-10.745 24.001-24zm32-240v80c0 13.255 10.745 24 24 24H488c13.255 0 24-10.745 24-24V56c0-13.255-10.745-24-24-24H386.667c-13.255 0-24 10.745-24 24zm-32 80V56c0-13.255-10.745-24-24-24H205.333c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24h101.333c13.256 0 24.001-10.745 24.001-24zm-205.334 56H24c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24h101.333c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24zM0 376v80c0 13.255 10.745 24 24 24h101.333c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24H24c-13.255 0-24 10.745-24 24zm386.667-56H488c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24H386.667c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24zm0 160H488c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24H386.667c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24zM181.333 376v80c0 13.255 10.745 24 24 24h101.333c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24H205.333c-13.255 0-24 10.745-24 24z\"]\n};\nvar faThLarge = {\n prefix: 'fas',\n iconName: 'th-large',\n icon: [512, 512, [], \"f009\", \"M296 32h192c13.255 0 24 10.745 24 24v160c0 13.255-10.745 24-24 24H296c-13.255 0-24-10.745-24-24V56c0-13.255 10.745-24 24-24zm-80 0H24C10.745 32 0 42.745 0 56v160c0 13.255 10.745 24 24 24h192c13.255 0 24-10.745 24-24V56c0-13.255-10.745-24-24-24zM0 296v160c0 13.255 10.745 24 24 24h192c13.255 0 24-10.745 24-24V296c0-13.255-10.745-24-24-24H24c-13.255 0-24 10.745-24 24zm296 184h192c13.255 0 24-10.745 24-24V296c0-13.255-10.745-24-24-24H296c-13.255 0-24 10.745-24 24v160c0 13.255 10.745 24 24 24z\"]\n};\nvar faThList = {\n prefix: 'fas',\n iconName: 'th-list',\n icon: [512, 512, [], \"f00b\", \"M149.333 216v80c0 13.255-10.745 24-24 24H24c-13.255 0-24-10.745-24-24v-80c0-13.255 10.745-24 24-24h101.333c13.255 0 24 10.745 24 24zM0 376v80c0 13.255 10.745 24 24 24h101.333c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24H24c-13.255 0-24 10.745-24 24zM125.333 32H24C10.745 32 0 42.745 0 56v80c0 13.255 10.745 24 24 24h101.333c13.255 0 24-10.745 24-24V56c0-13.255-10.745-24-24-24zm80 448H488c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24H205.333c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24zm-24-424v80c0 13.255 10.745 24 24 24H488c13.255 0 24-10.745 24-24V56c0-13.255-10.745-24-24-24H205.333c-13.255 0-24 10.745-24 24zm24 264H488c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24H205.333c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24z\"]\n};\nvar faTheaterMasks = {\n prefix: 'fas',\n iconName: 'theater-masks',\n icon: [640, 512, [], \"f630\", \"M206.86 245.15c-35.88 10.45-59.95 41.2-57.53 74.1 11.4-12.72 28.81-23.7 49.9-30.92l7.63-43.18zM95.81 295L64.08 115.49c-.29-1.62.28-2.62.24-2.65 57.76-32.06 123.12-49.01 189.01-49.01 1.61 0 3.23.17 4.85.19 13.95-13.47 31.73-22.83 51.59-26 18.89-3.02 38.05-4.55 57.18-5.32-9.99-13.95-24.48-24.23-41.77-27C301.27 1.89 277.24 0 253.32 0 176.66 0 101.02 19.42 33.2 57.06 9.03 70.48-3.92 98.48 1.05 126.58l31.73 179.51c14.23 80.52 136.33 142.08 204.45 142.08 3.59 0 6.75-.46 10.01-.8-13.52-17.08-28.94-40.48-39.5-67.58-47.61-12.98-106.06-51.62-111.93-84.79zm97.55-137.46c-.73-4.12-2.23-7.87-4.07-11.4-8.25 8.91-20.67 15.75-35.32 18.32-14.65 2.58-28.67.4-39.48-5.17-.52 3.94-.64 7.98.09 12.1 3.84 21.7 24.58 36.19 46.34 32.37 21.75-3.82 36.28-24.52 32.44-46.22zM606.8 120.9c-88.98-49.38-191.43-67.41-291.98-51.35-27.31 4.36-49.08 26.26-54.04 54.36l-31.73 179.51c-15.39 87.05 95.28 196.27 158.31 207.35 63.03 11.09 204.47-53.79 219.86-140.84l31.73-179.51c4.97-28.11-7.98-56.11-32.15-69.52zm-273.24 96.8c3.84-21.7 24.58-36.19 46.34-32.36 21.76 3.83 36.28 24.52 32.45 46.22-.73 4.12-2.23 7.87-4.07 11.4-8.25-8.91-20.67-15.75-35.32-18.32-14.65-2.58-28.67-.4-39.48 5.17-.53-3.95-.65-7.99.08-12.11zm70.47 198.76c-55.68-9.79-93.52-59.27-89.04-112.9 20.6 25.54 56.21 46.17 99.49 53.78 43.28 7.61 83.82.37 111.93-16.6-14.18 51.94-66.71 85.51-122.38 75.72zm130.3-151.34c-8.25-8.91-20.68-15.75-35.33-18.32-14.65-2.58-28.67-.4-39.48 5.17-.52-3.94-.64-7.98.09-12.1 3.84-21.7 24.58-36.19 46.34-32.37 21.75 3.83 36.28 24.52 32.45 46.22-.73 4.13-2.23 7.88-4.07 11.4z\"]\n};\nvar faThermometer = {\n prefix: 'fas',\n iconName: 'thermometer',\n icon: [512, 512, [], \"f491\", \"M476.8 20.4c-37.5-30.7-95.5-26.3-131.9 10.2l-45.7 46 50.5 50.5c3.1 3.1 3.1 8.2 0 11.3l-11.3 11.3c-3.1 3.1-8.2 3.1-11.3 0l-50.4-50.5-45.1 45.4 50.3 50.4c3.1 3.1 3.1 8.2 0 11.3l-11.3 11.3c-3.1 3.1-8.2 3.1-11.3 0L209 167.4l-45.1 45.4L214 263c3.1 3.1 3.1 8.2 0 11.3l-11.3 11.3c-3.1 3.1-8.2 3.1-11.3 0l-50.1-50.2L96 281.1V382L7 471c-9.4 9.4-9.4 24.6 0 33.9 9.4 9.4 24.6 9.4 33.9 0l89-89h99.9L484 162.6c34.9-34.9 42.2-101.5-7.2-142.2z\"]\n};\nvar faThermometerEmpty = {\n prefix: 'fas',\n iconName: 'thermometer-empty',\n icon: [256, 512, [], \"f2cb\", \"M192 384c0 35.346-28.654 64-64 64s-64-28.654-64-64c0-35.346 28.654-64 64-64s64 28.654 64 64zm32-84.653c19.912 22.563 32 52.194 32 84.653 0 70.696-57.303 128-128 128-.299 0-.609-.001-.909-.003C56.789 511.509-.357 453.636.002 383.333.166 351.135 12.225 321.755 32 299.347V96c0-53.019 42.981-96 96-96s96 42.981 96 96v203.347zM208 384c0-34.339-19.37-52.19-32-66.502V96c0-26.467-21.533-48-48-48S80 69.533 80 96v221.498c-12.732 14.428-31.825 32.1-31.999 66.08-.224 43.876 35.563 80.116 79.423 80.42L128 464c44.112 0 80-35.888 80-80z\"]\n};\nvar faThermometerFull = {\n prefix: 'fas',\n iconName: 'thermometer-full',\n icon: [256, 512, [], \"f2c7\", \"M224 96c0-53.019-42.981-96-96-96S32 42.981 32 96v203.347C12.225 321.756.166 351.136.002 383.333c-.359 70.303 56.787 128.176 127.089 128.664.299.002.61.003.909.003 70.698 0 128-57.304 128-128 0-32.459-12.088-62.09-32-84.653V96zm-96 368l-.576-.002c-43.86-.304-79.647-36.544-79.423-80.42.173-33.98 19.266-51.652 31.999-66.08V96c0-26.467 21.533-48 48-48s48 21.533 48 48v221.498c12.63 14.312 32 32.164 32 66.502 0 44.112-35.888 80-80 80zm64-80c0 35.346-28.654 64-64 64s-64-28.654-64-64c0-23.685 12.876-44.349 32-55.417V96c0-17.673 14.327-32 32-32s32 14.327 32 32v232.583c19.124 11.068 32 31.732 32 55.417z\"]\n};\nvar faThermometerHalf = {\n prefix: 'fas',\n iconName: 'thermometer-half',\n icon: [256, 512, [], \"f2c9\", \"M192 384c0 35.346-28.654 64-64 64s-64-28.654-64-64c0-23.685 12.876-44.349 32-55.417V224c0-17.673 14.327-32 32-32s32 14.327 32 32v104.583c19.124 11.068 32 31.732 32 55.417zm32-84.653c19.912 22.563 32 52.194 32 84.653 0 70.696-57.303 128-128 128-.299 0-.609-.001-.909-.003C56.789 511.509-.357 453.636.002 383.333.166 351.135 12.225 321.755 32 299.347V96c0-53.019 42.981-96 96-96s96 42.981 96 96v203.347zM208 384c0-34.339-19.37-52.19-32-66.502V96c0-26.467-21.533-48-48-48S80 69.533 80 96v221.498c-12.732 14.428-31.825 32.1-31.999 66.08-.224 43.876 35.563 80.116 79.423 80.42L128 464c44.112 0 80-35.888 80-80z\"]\n};\nvar faThermometerQuarter = {\n prefix: 'fas',\n iconName: 'thermometer-quarter',\n icon: [256, 512, [], \"f2ca\", \"M192 384c0 35.346-28.654 64-64 64s-64-28.654-64-64c0-23.685 12.876-44.349 32-55.417V288c0-17.673 14.327-32 32-32s32 14.327 32 32v40.583c19.124 11.068 32 31.732 32 55.417zm32-84.653c19.912 22.563 32 52.194 32 84.653 0 70.696-57.303 128-128 128-.299 0-.609-.001-.909-.003C56.789 511.509-.357 453.636.002 383.333.166 351.135 12.225 321.755 32 299.347V96c0-53.019 42.981-96 96-96s96 42.981 96 96v203.347zM208 384c0-34.339-19.37-52.19-32-66.502V96c0-26.467-21.533-48-48-48S80 69.533 80 96v221.498c-12.732 14.428-31.825 32.1-31.999 66.08-.224 43.876 35.563 80.116 79.423 80.42L128 464c44.112 0 80-35.888 80-80z\"]\n};\nvar faThermometerThreeQuarters = {\n prefix: 'fas',\n iconName: 'thermometer-three-quarters',\n icon: [256, 512, [], \"f2c8\", \"M192 384c0 35.346-28.654 64-64 64-35.346 0-64-28.654-64-64 0-23.685 12.876-44.349 32-55.417V160c0-17.673 14.327-32 32-32s32 14.327 32 32v168.583c19.124 11.068 32 31.732 32 55.417zm32-84.653c19.912 22.563 32 52.194 32 84.653 0 70.696-57.303 128-128 128-.299 0-.609-.001-.909-.003C56.789 511.509-.357 453.636.002 383.333.166 351.135 12.225 321.755 32 299.347V96c0-53.019 42.981-96 96-96s96 42.981 96 96v203.347zM208 384c0-34.339-19.37-52.19-32-66.502V96c0-26.467-21.533-48-48-48S80 69.533 80 96v221.498c-12.732 14.428-31.825 32.1-31.999 66.08-.224 43.876 35.563 80.116 79.423 80.42L128 464c44.112 0 80-35.888 80-80z\"]\n};\nvar faThumbsDown = {\n prefix: 'fas',\n iconName: 'thumbs-down',\n icon: [512, 512, [], \"f165\", \"M0 56v240c0 13.255 10.745 24 24 24h80c13.255 0 24-10.745 24-24V56c0-13.255-10.745-24-24-24H24C10.745 32 0 42.745 0 56zm40 200c0-13.255 10.745-24 24-24s24 10.745 24 24-10.745 24-24 24-24-10.745-24-24zm272 256c-20.183 0-29.485-39.293-33.931-57.795-5.206-21.666-10.589-44.07-25.393-58.902-32.469-32.524-49.503-73.967-89.117-113.111a11.98 11.98 0 0 1-3.558-8.521V59.901c0-6.541 5.243-11.878 11.783-11.998 15.831-.29 36.694-9.079 52.651-16.178C256.189 17.598 295.709.017 343.995 0h2.844c42.777 0 93.363.413 113.774 29.737 8.392 12.057 10.446 27.034 6.148 44.632 16.312 17.053 25.063 48.863 16.382 74.757 17.544 23.432 19.143 56.132 9.308 79.469l.11.11c11.893 11.949 19.523 31.259 19.439 49.197-.156 30.352-26.157 58.098-59.553 58.098H350.723C358.03 364.34 384 388.132 384 430.548 384 504 336 512 312 512z\"]\n};\nvar faThumbsUp = {\n prefix: 'fas',\n iconName: 'thumbs-up',\n icon: [512, 512, [], \"f164\", \"M104 224H24c-13.255 0-24 10.745-24 24v240c0 13.255 10.745 24 24 24h80c13.255 0 24-10.745 24-24V248c0-13.255-10.745-24-24-24zM64 472c-13.255 0-24-10.745-24-24s10.745-24 24-24 24 10.745 24 24-10.745 24-24 24zM384 81.452c0 42.416-25.97 66.208-33.277 94.548h101.723c33.397 0 59.397 27.746 59.553 58.098.084 17.938-7.546 37.249-19.439 49.197l-.11.11c9.836 23.337 8.237 56.037-9.308 79.469 8.681 25.895-.069 57.704-16.382 74.757 4.298 17.598 2.244 32.575-6.148 44.632C440.202 511.587 389.616 512 346.839 512l-2.845-.001c-48.287-.017-87.806-17.598-119.56-31.725-15.957-7.099-36.821-15.887-52.651-16.178-6.54-.12-11.783-5.457-11.783-11.998v-213.77c0-3.2 1.282-6.271 3.558-8.521 39.614-39.144 56.648-80.587 89.117-113.111 14.804-14.832 20.188-37.236 25.393-58.902C282.515 39.293 291.817 0 312 0c24 0 72 8 72 81.452z\"]\n};\nvar faThumbtack = {\n prefix: 'fas',\n iconName: 'thumbtack',\n icon: [384, 512, [], \"f08d\", \"M298.028 214.267L285.793 96H328c13.255 0 24-10.745 24-24V24c0-13.255-10.745-24-24-24H56C42.745 0 32 10.745 32 24v48c0 13.255 10.745 24 24 24h42.207L85.972 214.267C37.465 236.82 0 277.261 0 328c0 13.255 10.745 24 24 24h136v104.007c0 1.242.289 2.467.845 3.578l24 48c2.941 5.882 11.364 5.893 14.311 0l24-48a8.008 8.008 0 0 0 .845-3.578V352h136c13.255 0 24-10.745 24-24-.001-51.183-37.983-91.42-85.973-113.733z\"]\n};\nvar faTicketAlt = {\n prefix: 'fas',\n iconName: 'ticket-alt',\n icon: [576, 512, [], \"f3ff\", \"M128 160h320v192H128V160zm400 96c0 26.51 21.49 48 48 48v96c0 26.51-21.49 48-48 48H48c-26.51 0-48-21.49-48-48v-96c26.51 0 48-21.49 48-48s-21.49-48-48-48v-96c0-26.51 21.49-48 48-48h480c26.51 0 48 21.49 48 48v96c-26.51 0-48 21.49-48 48zm-48-104c0-13.255-10.745-24-24-24H120c-13.255 0-24 10.745-24 24v208c0 13.255 10.745 24 24 24h336c13.255 0 24-10.745 24-24V152z\"]\n};\nvar faTimes = {\n prefix: 'fas',\n iconName: 'times',\n icon: [352, 512, [], \"f00d\", \"M242.72 256l100.07-100.07c12.28-12.28 12.28-32.19 0-44.48l-22.24-22.24c-12.28-12.28-32.19-12.28-44.48 0L176 189.28 75.93 89.21c-12.28-12.28-32.19-12.28-44.48 0L9.21 111.45c-12.28 12.28-12.28 32.19 0 44.48L109.28 256 9.21 356.07c-12.28 12.28-12.28 32.19 0 44.48l22.24 22.24c12.28 12.28 32.2 12.28 44.48 0L176 322.72l100.07 100.07c12.28 12.28 32.2 12.28 44.48 0l22.24-22.24c12.28-12.28 12.28-32.19 0-44.48L242.72 256z\"]\n};\nvar faTimesCircle = {\n prefix: 'fas',\n iconName: 'times-circle',\n icon: [512, 512, [], \"f057\", \"M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm121.6 313.1c4.7 4.7 4.7 12.3 0 17L338 377.6c-4.7 4.7-12.3 4.7-17 0L256 312l-65.1 65.6c-4.7 4.7-12.3 4.7-17 0L134.4 338c-4.7-4.7-4.7-12.3 0-17l65.6-65-65.6-65.1c-4.7-4.7-4.7-12.3 0-17l39.6-39.6c4.7-4.7 12.3-4.7 17 0l65 65.7 65.1-65.6c4.7-4.7 12.3-4.7 17 0l39.6 39.6c4.7 4.7 4.7 12.3 0 17L312 256l65.6 65.1z\"]\n};\nvar faTint = {\n prefix: 'fas',\n iconName: 'tint',\n icon: [352, 512, [], \"f043\", \"M205.22 22.09c-7.94-28.78-49.44-30.12-58.44 0C100.01 179.85 0 222.72 0 333.91 0 432.35 78.72 512 176 512s176-79.65 176-178.09c0-111.75-99.79-153.34-146.78-311.82zM176 448c-61.75 0-112-50.25-112-112 0-8.84 7.16-16 16-16s16 7.16 16 16c0 44.11 35.89 80 80 80 8.84 0 16 7.16 16 16s-7.16 16-16 16z\"]\n};\nvar faTintSlash = {\n prefix: 'fas',\n iconName: 'tint-slash',\n icon: [640, 512, [], \"f5c7\", \"M633.82 458.1L494.97 350.78c.52-5.57 1.03-11.16 1.03-16.87 0-111.76-99.79-153.34-146.78-311.82-7.94-28.78-49.44-30.12-58.44 0-15.52 52.34-36.87 91.96-58.49 125.68L45.47 3.37C38.49-2.05 28.43-.8 23.01 6.18L3.37 31.45C-2.05 38.42-.8 48.47 6.18 53.9l588.36 454.73c6.98 5.43 17.03 4.17 22.46-2.81l19.64-25.27c5.41-6.97 4.16-17.02-2.82-22.45zM144 333.91C144 432.35 222.72 512 320 512c44.71 0 85.37-16.96 116.4-44.7L162.72 255.78c-11.41 23.5-18.72 48.35-18.72 78.13z\"]\n};\nvar faTired = {\n prefix: 'fas',\n iconName: 'tired',\n icon: [496, 512, [], \"f5c8\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm33.8 189.7l80-48c11.6-6.9 24 7.7 15.4 18L343.6 208l33.6 40.3c8.7 10.4-3.9 24.8-15.4 18l-80-48c-7.7-4.7-7.7-15.9 0-20.6zm-163-30c-8.6-10.3 3.8-24.9 15.4-18l80 48c7.8 4.7 7.8 15.9 0 20.6l-80 48c-11.5 6.8-24-7.6-15.4-18l33.6-40.3-33.6-40.3zM248 288c51.9 0 115.3 43.8 123.2 106.7 1.7 13.6-8 24.6-17.7 20.4-25.9-11.1-64.4-17.4-105.5-17.4s-79.6 6.3-105.5 17.4c-9.8 4.2-19.4-7-17.7-20.4C132.7 331.8 196.1 288 248 288z\"]\n};\nvar faToggleOff = {\n prefix: 'fas',\n iconName: 'toggle-off',\n icon: [576, 512, [], \"f204\", \"M384 64H192C85.961 64 0 149.961 0 256s85.961 192 192 192h192c106.039 0 192-85.961 192-192S490.039 64 384 64zM64 256c0-70.741 57.249-128 128-128 70.741 0 128 57.249 128 128 0 70.741-57.249 128-128 128-70.741 0-128-57.249-128-128zm320 128h-48.905c65.217-72.858 65.236-183.12 0-256H384c70.741 0 128 57.249 128 128 0 70.74-57.249 128-128 128z\"]\n};\nvar faToggleOn = {\n prefix: 'fas',\n iconName: 'toggle-on',\n icon: [576, 512, [], \"f205\", \"M384 64H192C86 64 0 150 0 256s86 192 192 192h192c106 0 192-86 192-192S490 64 384 64zm0 320c-70.8 0-128-57.3-128-128 0-70.8 57.3-128 128-128 70.8 0 128 57.3 128 128 0 70.8-57.3 128-128 128z\"]\n};\nvar faToilet = {\n prefix: 'fas',\n iconName: 'toilet',\n icon: [384, 512, [], \"f7d8\", \"M368 48c8.8 0 16-7.2 16-16V16c0-8.8-7.2-16-16-16H16C7.2 0 0 7.2 0 16v16c0 8.8 7.2 16 16 16h16v156.7C11.8 214.8 0 226.9 0 240c0 67.2 34.6 126.2 86.8 160.5l-21.4 70.2C59.1 491.2 74.5 512 96 512h192c21.5 0 36.9-20.8 30.6-41.3l-21.4-70.2C349.4 366.2 384 307.2 384 240c0-13.1-11.8-25.2-32-35.3V48h16zM80 72c0-4.4 3.6-8 8-8h48c4.4 0 8 3.6 8 8v16c0 4.4-3.6 8-8 8H88c-4.4 0-8-3.6-8-8V72zm112 200c-77.1 0-139.6-14.3-139.6-32s62.5-32 139.6-32 139.6 14.3 139.6 32-62.5 32-139.6 32z\"]\n};\nvar faToiletPaper = {\n prefix: 'fas',\n iconName: 'toilet-paper',\n icon: [576, 512, [], \"f71e\", \"M128 0C74.98 0 32 85.96 32 192v172.07c0 41.12-9.8 62.77-31.17 126.87C-2.62 501.3 5.09 512 16.01 512h280.92c13.77 0 26-8.81 30.36-21.88 12.83-38.48 24.71-72.4 24.71-126.05V192c0-83.6 23.67-153.52 60.44-192H128zM96 224c-8.84 0-16-7.16-16-16s7.16-16 16-16 16 7.16 16 16-7.16 16-16 16zm64 0c-8.84 0-16-7.16-16-16s7.16-16 16-16 16 7.16 16 16-7.16 16-16 16zm64 0c-8.84 0-16-7.16-16-16s7.16-16 16-16 16 7.16 16 16-7.16 16-16 16zm64 0c-8.84 0-16-7.16-16-16s7.16-16 16-16 16 7.16 16 16-7.16 16-16 16zM480 0c-53.02 0-96 85.96-96 192s42.98 192 96 192 96-85.96 96-192S533.02 0 480 0zm0 256c-17.67 0-32-28.65-32-64s14.33-64 32-64 32 28.65 32 64-14.33 64-32 64z\"]\n};\nvar faToolbox = {\n prefix: 'fas',\n iconName: 'toolbox',\n icon: [512, 512, [], \"f552\", \"M502.63 214.63l-45.25-45.25c-6-6-14.14-9.37-22.63-9.37H384V80c0-26.51-21.49-48-48-48H176c-26.51 0-48 21.49-48 48v80H77.25c-8.49 0-16.62 3.37-22.63 9.37L9.37 214.63c-6 6-9.37 14.14-9.37 22.63V320h128v-16c0-8.84 7.16-16 16-16h32c8.84 0 16 7.16 16 16v16h128v-16c0-8.84 7.16-16 16-16h32c8.84 0 16 7.16 16 16v16h128v-82.75c0-8.48-3.37-16.62-9.37-22.62zM320 160H192V96h128v64zm64 208c0 8.84-7.16 16-16 16h-32c-8.84 0-16-7.16-16-16v-16H192v16c0 8.84-7.16 16-16 16h-32c-8.84 0-16-7.16-16-16v-16H0v96c0 17.67 14.33 32 32 32h448c17.67 0 32-14.33 32-32v-96H384v16z\"]\n};\nvar faTools = {\n prefix: 'fas',\n iconName: 'tools',\n icon: [512, 512, [], \"f7d9\", \"M501.1 395.7L384 278.6c-23.1-23.1-57.6-27.6-85.4-13.9L192 158.1V96L64 0 0 64l96 128h62.1l106.6 106.6c-13.6 27.8-9.2 62.3 13.9 85.4l117.1 117.1c14.6 14.6 38.2 14.6 52.7 0l52.7-52.7c14.5-14.6 14.5-38.2 0-52.7zM331.7 225c28.3 0 54.9 11 74.9 31l19.4 19.4c15.8-6.9 30.8-16.5 43.8-29.5 37.1-37.1 49.7-89.3 37.9-136.7-2.2-9-13.5-12.1-20.1-5.5l-74.4 74.4-67.9-11.3L334 98.9l74.4-74.4c6.6-6.6 3.4-17.9-5.7-20.2-47.4-11.7-99.6.9-136.6 37.9-28.5 28.5-41.9 66.1-41.2 103.6l82.1 82.1c8.1-1.9 16.5-2.9 24.7-2.9zm-103.9 82l-56.7-56.7L18.7 402.8c-25 25-25 65.5 0 90.5s65.5 25 90.5 0l123.6-123.6c-7.6-19.9-9.9-41.6-5-62.7zM64 472c-13.2 0-24-10.8-24-24 0-13.3 10.7-24 24-24s24 10.7 24 24c0 13.2-10.7 24-24 24z\"]\n};\nvar faTooth = {\n prefix: 'fas',\n iconName: 'tooth',\n icon: [448, 512, [], \"f5c9\", \"M443.98 96.25c-11.01-45.22-47.11-82.06-92.01-93.72-32.19-8.36-63 5.1-89.14 24.33-3.25 2.39-6.96 3.73-10.5 5.48l28.32 18.21c7.42 4.77 9.58 14.67 4.8 22.11-4.46 6.95-14.27 9.86-22.11 4.8L162.83 12.84c-20.7-10.85-43.38-16.4-66.81-10.31-44.9 11.67-81 48.5-92.01 93.72-10.13 41.62-.42 80.81 21.5 110.43 23.36 31.57 32.68 68.66 36.29 107.35 4.4 47.16 10.33 94.16 20.94 140.32l7.8 33.95c3.19 13.87 15.49 23.7 29.67 23.7 13.97 0 26.15-9.55 29.54-23.16l34.47-138.42c4.56-18.32 20.96-31.16 39.76-31.16s35.2 12.85 39.76 31.16l34.47 138.42c3.39 13.61 15.57 23.16 29.54 23.16 14.18 0 26.48-9.83 29.67-23.7l7.8-33.95c10.61-46.15 16.53-93.16 20.94-140.32 3.61-38.7 12.93-75.78 36.29-107.35 21.95-29.61 31.66-68.8 21.53-110.43z\"]\n};\nvar faTorah = {\n prefix: 'fas',\n iconName: 'torah',\n icon: [640, 512, [], \"f6a0\", \"M320.05 366.48l17.72-29.64h-35.46zm99.21-166H382.4l18.46 30.82zM48 0C21.49 0 0 14.33 0 32v448c0 17.67 21.49 32 48 32s48-14.33 48-32V32C96 14.33 74.51 0 48 0zm172.74 311.5h36.85l-18.46-30.82zm161.71 0h36.86l-18.45-30.8zM128 464h384V48H128zm66.77-278.13a21.22 21.22 0 0 1 18.48-10.71h59.45l29.13-48.71a21.13 21.13 0 0 1 18.22-10.37A20.76 20.76 0 0 1 338 126.29l29.25 48.86h59.52a21.12 21.12 0 0 1 18.1 32L415.63 256 445 305a20.69 20.69 0 0 1 .24 21.12 21.25 21.25 0 0 1-18.48 10.72h-59.47l-29.13 48.7a21.13 21.13 0 0 1-18.16 10.4 20.79 20.79 0 0 1-18-10.22l-29.25-48.88h-59.5a21.11 21.11 0 0 1-18.1-32L224.36 256 195 207a20.7 20.7 0 0 1-.23-21.13zM592 0c-26.51 0-48 14.33-48 32v448c0 17.67 21.49 32 48 32s48-14.33 48-32V32c0-17.67-21.49-32-48-32zM320 145.53l-17.78 29.62h35.46zm-62.45 55h-36.81l18.44 30.8zm29.58 111h65.79L386.09 256l-33.23-55.52h-65.79L253.9 256z\"]\n};\nvar faToriiGate = {\n prefix: 'fas',\n iconName: 'torii-gate',\n icon: [512, 512, [], \"f6a1\", \"M376.45 32h-240.9A303.17 303.17 0 0 1 0 0v96c0 17.67 14.33 32 32 32h32v64H16c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h48v240c0 8.84 7.16 16 16 16h32c8.84 0 16-7.16 16-16V256h256v240c0 8.84 7.16 16 16 16h32c8.84 0 16-7.16 16-16V256h48c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16h-48v-64h32c17.67 0 32-14.33 32-32V0a303.17 303.17 0 0 1-135.55 32zM128 128h96v64h-96v-64zm256 64h-96v-64h96v64z\"]\n};\nvar faTractor = {\n prefix: 'fas',\n iconName: 'tractor',\n icon: [640, 512, [], \"f722\", \"M528 336c-48.6 0-88 39.4-88 88s39.4 88 88 88 88-39.4 88-88-39.4-88-88-88zm0 112c-13.23 0-24-10.77-24-24s10.77-24 24-24 24 10.77 24 24-10.77 24-24 24zm80-288h-64v-40.2c0-14.12 4.7-27.76 13.15-38.84 4.42-5.8 3.55-14.06-1.32-19.49L534.2 37.3c-6.66-7.45-18.32-6.92-24.7.78C490.58 60.9 480 89.81 480 119.8V160H377.67L321.58 29.14A47.914 47.914 0 0 0 277.45 0H144c-26.47 0-48 21.53-48 48v146.52c-8.63-6.73-20.96-6.46-28.89 1.47L36 227.1c-8.59 8.59-8.59 22.52 0 31.11l5.06 5.06c-4.99 9.26-8.96 18.82-11.91 28.72H22c-12.15 0-22 9.85-22 22v44c0 12.15 9.85 22 22 22h7.14c2.96 9.91 6.92 19.46 11.91 28.73l-5.06 5.06c-8.59 8.59-8.59 22.52 0 31.11L67.1 476c8.59 8.59 22.52 8.59 31.11 0l5.06-5.06c9.26 4.99 18.82 8.96 28.72 11.91V490c0 12.15 9.85 22 22 22h44c12.15 0 22-9.85 22-22v-7.14c9.9-2.95 19.46-6.92 28.72-11.91l5.06 5.06c8.59 8.59 22.52 8.59 31.11 0l31.11-31.11c8.59-8.59 8.59-22.52 0-31.11l-5.06-5.06c4.99-9.26 8.96-18.82 11.91-28.72H330c12.15 0 22-9.85 22-22v-6h80.54c21.91-28.99 56.32-48 95.46-48 18.64 0 36.07 4.61 51.8 12.2l50.82-50.82c6-6 9.37-14.14 9.37-22.63V192c.01-17.67-14.32-32-31.99-32zM176 416c-44.18 0-80-35.82-80-80s35.82-80 80-80 80 35.82 80 80-35.82 80-80 80zm22-256h-38V64h106.89l41.15 96H198z\"]\n};\nvar faTrademark = {\n prefix: 'fas',\n iconName: 'trademark',\n icon: [640, 512, [], \"f25c\", \"M260.6 96H12c-6.6 0-12 5.4-12 12v43.1c0 6.6 5.4 12 12 12h85.1V404c0 6.6 5.4 12 12 12h54.3c6.6 0 12-5.4 12-12V163.1h85.1c6.6 0 12-5.4 12-12V108c.1-6.6-5.3-12-11.9-12zM640 403l-24-296c-.5-6.2-5.7-11-12-11h-65.4c-5.1 0-9.7 3.3-11.3 8.1l-43.8 127.1c-7.2 20.6-16.1 52.8-16.1 52.8h-.9s-8.9-32.2-16.1-52.8l-43.8-127.1c-1.7-4.8-6.2-8.1-11.3-8.1h-65.4c-6.2 0-11.4 4.8-12 11l-24.4 296c-.6 7 4.9 13 12 13H360c6.3 0 11.5-4.9 12-11.2l9.1-132.9c1.8-24.2 0-53.7 0-53.7h.9s10.7 33.6 17.9 53.7l30.7 84.7c1.7 4.7 6.2 7.9 11.3 7.9h50.3c5.1 0 9.6-3.2 11.3-7.9l30.7-84.7c7.2-20.1 17.9-53.7 17.9-53.7h.9s-1.8 29.5 0 53.7l9.1 132.9c.4 6.3 5.7 11.2 12 11.2H628c7 0 12.5-6 12-13z\"]\n};\nvar faTrafficLight = {\n prefix: 'fas',\n iconName: 'traffic-light',\n icon: [384, 512, [], \"f637\", \"M384 192h-64v-37.88c37.2-13.22 64-48.38 64-90.12h-64V32c0-17.67-14.33-32-32-32H96C78.33 0 64 14.33 64 32v32H0c0 41.74 26.8 76.9 64 90.12V192H0c0 41.74 26.8 76.9 64 90.12V320H0c0 42.84 28.25 78.69 66.99 91.05C79.42 468.72 130.6 512 192 512s112.58-43.28 125.01-100.95C355.75 398.69 384 362.84 384 320h-64v-37.88c37.2-13.22 64-48.38 64-90.12zM192 416c-26.51 0-48-21.49-48-48s21.49-48 48-48 48 21.49 48 48-21.49 48-48 48zm0-128c-26.51 0-48-21.49-48-48s21.49-48 48-48 48 21.49 48 48-21.49 48-48 48zm0-128c-26.51 0-48-21.49-48-48s21.49-48 48-48 48 21.49 48 48-21.49 48-48 48z\"]\n};\nvar faTrain = {\n prefix: 'fas',\n iconName: 'train',\n icon: [448, 512, [], \"f238\", \"M448 96v256c0 51.815-61.624 96-130.022 96l62.98 49.721C386.905 502.417 383.562 512 376 512H72c-7.578 0-10.892-9.594-4.957-14.279L130.022 448C61.82 448 0 403.954 0 352V96C0 42.981 64 0 128 0h192c65 0 128 42.981 128 96zm-48 136V120c0-13.255-10.745-24-24-24H72c-13.255 0-24 10.745-24 24v112c0 13.255 10.745 24 24 24h304c13.255 0 24-10.745 24-24zm-176 64c-30.928 0-56 25.072-56 56s25.072 56 56 56 56-25.072 56-56-25.072-56-56-56z\"]\n};\nvar faTram = {\n prefix: 'fas',\n iconName: 'tram',\n icon: [512, 512, [], \"f7da\", \"M288 64c17.7 0 32-14.3 32-32S305.7 0 288 0s-32 14.3-32 32 14.3 32 32 32zm223.5-12.1c-2.3-8.6-11-13.6-19.6-11.3l-480 128c-8.5 2.3-13.6 11-11.3 19.6C2.5 195.3 8.9 200 16 200c1.4 0 2.8-.2 4.1-.5L240 140.8V224H64c-17.7 0-32 14.3-32 32v224c0 17.7 14.3 32 32 32h384c17.7 0 32-14.3 32-32V256c0-17.7-14.3-32-32-32H272v-91.7l228.1-60.8c8.6-2.3 13.6-11.1 11.4-19.6zM176 384H80v-96h96v96zm160-96h96v96h-96v-96zm-32 0v96h-96v-96h96zM192 96c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32z\"]\n};\nvar faTransgender = {\n prefix: 'fas',\n iconName: 'transgender',\n icon: [384, 512, [], \"f224\", \"M372 0h-79c-10.7 0-16 12.9-8.5 20.5l16.9 16.9-80.7 80.7C198.5 104.1 172.2 96 144 96 64.5 96 0 160.5 0 240c0 68.5 47.9 125.9 112 140.4V408H76c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h36v28c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12v-28h36c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-36v-27.6c64.1-14.6 112-71.9 112-140.4 0-28.2-8.1-54.5-22.1-76.7l80.7-80.7 16.9 16.9c7.6 7.6 20.5 2.2 20.5-8.5V12c0-6.6-5.4-12-12-12zM144 320c-44.1 0-80-35.9-80-80s35.9-80 80-80 80 35.9 80 80-35.9 80-80 80z\"]\n};\nvar faTransgenderAlt = {\n prefix: 'fas',\n iconName: 'transgender-alt',\n icon: [480, 512, [], \"f225\", \"M468 0h-79c-10.7 0-16 12.9-8.5 20.5l16.9 16.9-80.7 80.7C294.5 104.1 268.2 96 240 96c-28.2 0-54.5 8.1-76.7 22.1l-16.5-16.5 19.8-19.8c4.7-4.7 4.7-12.3 0-17l-28.3-28.3c-4.7-4.7-12.3-4.7-17 0l-19.8 19.8-19-19 16.9-16.9C107.1 12.9 101.7 0 91 0H12C5.4 0 0 5.4 0 12v79c0 10.7 12.9 16 20.5 8.5l16.9-16.9 19 19-19.8 19.8c-4.7 4.7-4.7 12.3 0 17l28.3 28.3c4.7 4.7 12.3 4.7 17 0l19.8-19.8 16.5 16.5C104.1 185.5 96 211.8 96 240c0 68.5 47.9 125.9 112 140.4V408h-36c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h36v28c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12v-28h36c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-36v-27.6c64.1-14.6 112-71.9 112-140.4 0-28.2-8.1-54.5-22.1-76.7l80.7-80.7 16.9 16.9c7.6 7.6 20.5 2.2 20.5-8.5V12c0-6.6-5.4-12-12-12zM240 320c-44.1 0-80-35.9-80-80s35.9-80 80-80 80 35.9 80 80-35.9 80-80 80z\"]\n};\nvar faTrash = {\n prefix: 'fas',\n iconName: 'trash',\n icon: [448, 512, [], \"f1f8\", \"M432 32H312l-9.4-18.7A24 24 0 0 0 281.1 0H166.8a23.72 23.72 0 0 0-21.4 13.3L136 32H16A16 16 0 0 0 0 48v32a16 16 0 0 0 16 16h416a16 16 0 0 0 16-16V48a16 16 0 0 0-16-16zM53.2 467a48 48 0 0 0 47.9 45h245.8a48 48 0 0 0 47.9-45L416 128H32z\"]\n};\nvar faTrashAlt = {\n prefix: 'fas',\n iconName: 'trash-alt',\n icon: [448, 512, [], \"f2ed\", \"M32 464a48 48 0 0 0 48 48h288a48 48 0 0 0 48-48V128H32zm272-256a16 16 0 0 1 32 0v224a16 16 0 0 1-32 0zm-96 0a16 16 0 0 1 32 0v224a16 16 0 0 1-32 0zm-96 0a16 16 0 0 1 32 0v224a16 16 0 0 1-32 0zM432 32H312l-9.4-18.7A24 24 0 0 0 281.1 0H166.8a23.72 23.72 0 0 0-21.4 13.3L136 32H16A16 16 0 0 0 0 48v32a16 16 0 0 0 16 16h416a16 16 0 0 0 16-16V48a16 16 0 0 0-16-16z\"]\n};\nvar faTrashRestore = {\n prefix: 'fas',\n iconName: 'trash-restore',\n icon: [448, 512, [], \"f829\", \"M53.2 467a48 48 0 0 0 47.9 45h245.8a48 48 0 0 0 47.9-45L416 128H32zm70.11-175.8l89.38-94.26a15.41 15.41 0 0 1 22.62 0l89.38 94.26c10.08 10.62 2.94 28.8-11.32 28.8H256v112a16 16 0 0 1-16 16h-32a16 16 0 0 1-16-16V320h-57.37c-14.26 0-21.4-18.18-11.32-28.8zM432 32H312l-9.4-18.7A24 24 0 0 0 281.1 0H166.8a23.72 23.72 0 0 0-21.4 13.3L136 32H16A16 16 0 0 0 0 48v32a16 16 0 0 0 16 16h416a16 16 0 0 0 16-16V48a16 16 0 0 0-16-16z\"]\n};\nvar faTrashRestoreAlt = {\n prefix: 'fas',\n iconName: 'trash-restore-alt',\n icon: [448, 512, [], \"f82a\", \"M32 464a48 48 0 0 0 48 48h288a48 48 0 0 0 48-48V128H32zm91.31-172.8l89.38-94.26a15.41 15.41 0 0 1 22.62 0l89.38 94.26c10.08 10.62 2.94 28.8-11.32 28.8H256v112a16 16 0 0 1-16 16h-32a16 16 0 0 1-16-16V320h-57.37c-14.26 0-21.4-18.18-11.32-28.8zM432 32H312l-9.4-18.7A24 24 0 0 0 281.1 0H166.8a23.72 23.72 0 0 0-21.4 13.3L136 32H16A16 16 0 0 0 0 48v32a16 16 0 0 0 16 16h416a16 16 0 0 0 16-16V48a16 16 0 0 0-16-16z\"]\n};\nvar faTree = {\n prefix: 'fas',\n iconName: 'tree',\n icon: [384, 512, [], \"f1bb\", \"M378.31 378.49L298.42 288h30.63c9.01 0 16.98-5 20.78-13.06 3.8-8.04 2.55-17.26-3.28-24.05L268.42 160h28.89c9.1 0 17.3-5.35 20.86-13.61 3.52-8.13 1.86-17.59-4.24-24.08L203.66 4.83c-6.03-6.45-17.28-6.45-23.32 0L70.06 122.31c-6.1 6.49-7.75 15.95-4.24 24.08C69.38 154.65 77.59 160 86.69 160h28.89l-78.14 90.91c-5.81 6.78-7.06 15.99-3.27 24.04C37.97 283 45.93 288 54.95 288h30.63L5.69 378.49c-6 6.79-7.36 16.09-3.56 24.26 3.75 8.05 12 13.25 21.01 13.25H160v24.45l-30.29 48.4c-5.32 10.64 2.42 23.16 14.31 23.16h95.96c11.89 0 19.63-12.52 14.31-23.16L224 440.45V416h136.86c9.01 0 17.26-5.2 21.01-13.25 3.8-8.17 2.44-17.47-3.56-24.26z\"]\n};\nvar faTrophy = {\n prefix: 'fas',\n iconName: 'trophy',\n icon: [576, 512, [], \"f091\", \"M552 64H448V24c0-13.3-10.7-24-24-24H152c-13.3 0-24 10.7-24 24v40H24C10.7 64 0 74.7 0 88v56c0 35.7 22.5 72.4 61.9 100.7 31.5 22.7 69.8 37.1 110 41.7C203.3 338.5 240 360 240 360v72h-48c-35.3 0-64 20.7-64 56v12c0 6.6 5.4 12 12 12h296c6.6 0 12-5.4 12-12v-12c0-35.3-28.7-56-64-56h-48v-72s36.7-21.5 68.1-73.6c40.3-4.6 78.6-19 110-41.7 39.3-28.3 61.9-65 61.9-100.7V88c0-13.3-10.7-24-24-24zM99.3 192.8C74.9 175.2 64 155.6 64 144v-16h64.2c1 32.6 5.8 61.2 12.8 86.2-15.1-5.2-29.2-12.4-41.7-21.4zM512 144c0 16.1-17.7 36.1-35.3 48.8-12.5 9-26.7 16.2-41.8 21.4 7-25 11.8-53.6 12.8-86.2H512v16z\"]\n};\nvar faTruck = {\n prefix: 'fas',\n iconName: 'truck',\n icon: [640, 512, [], \"f0d1\", \"M624 352h-16V243.9c0-12.7-5.1-24.9-14.1-33.9L494 110.1c-9-9-21.2-14.1-33.9-14.1H416V48c0-26.5-21.5-48-48-48H48C21.5 0 0 21.5 0 48v320c0 26.5 21.5 48 48 48h16c0 53 43 96 96 96s96-43 96-96h128c0 53 43 96 96 96s96-43 96-96h48c8.8 0 16-7.2 16-16v-32c0-8.8-7.2-16-16-16zM160 464c-26.5 0-48-21.5-48-48s21.5-48 48-48 48 21.5 48 48-21.5 48-48 48zm320 0c-26.5 0-48-21.5-48-48s21.5-48 48-48 48 21.5 48 48-21.5 48-48 48zm80-208H416V144h44.1l99.9 99.9V256z\"]\n};\nvar faTruckLoading = {\n prefix: 'fas',\n iconName: 'truck-loading',\n icon: [640, 512, [], \"f4de\", \"M50.2 375.6c2.3 8.5 11.1 13.6 19.6 11.3l216.4-58c8.5-2.3 13.6-11.1 11.3-19.6l-49.7-185.5c-2.3-8.5-11.1-13.6-19.6-11.3L151 133.3l24.8 92.7-61.8 16.5-24.8-92.7-77.3 20.7C3.4 172.8-1.7 181.6.6 190.1l49.6 185.5zM384 0c-17.7 0-32 14.3-32 32v323.6L5.9 450c-4.3 1.2-6.8 5.6-5.6 9.8l12.6 46.3c1.2 4.3 5.6 6.8 9.8 5.6l393.7-107.4C418.8 464.1 467.6 512 528 512c61.9 0 112-50.1 112-112V0H384zm144 448c-26.5 0-48-21.5-48-48s21.5-48 48-48 48 21.5 48 48-21.5 48-48 48z\"]\n};\nvar faTruckMonster = {\n prefix: 'fas',\n iconName: 'truck-monster',\n icon: [640, 512, [], \"f63b\", \"M624 224h-16v-64c0-17.67-14.33-32-32-32h-73.6L419.22 24.02A64.025 64.025 0 0 0 369.24 0H256c-17.67 0-32 14.33-32 32v96H48c-8.84 0-16 7.16-16 16v80H16c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h16.72c29.21-38.65 75.1-64 127.28-64s98.07 25.35 127.28 64h65.45c29.21-38.65 75.1-64 127.28-64s98.07 25.35 127.28 64H624c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16zm-336-96V64h81.24l51.2 64H288zm304 224h-5.2c-2.2-7.33-5.07-14.28-8.65-20.89l3.67-3.67c6.25-6.25 6.25-16.38 0-22.63l-22.63-22.63c-6.25-6.25-16.38-6.25-22.63 0l-3.67 3.67A110.85 110.85 0 0 0 512 277.2V272c0-8.84-7.16-16-16-16h-32c-8.84 0-16 7.16-16 16v5.2c-7.33 2.2-14.28 5.07-20.89 8.65l-3.67-3.67c-6.25-6.25-16.38-6.25-22.63 0l-22.63 22.63c-6.25 6.25-6.25 16.38 0 22.63l3.67 3.67A110.85 110.85 0 0 0 373.2 352H368c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h5.2c2.2 7.33 5.07 14.28 8.65 20.89l-3.67 3.67c-6.25 6.25-6.25 16.38 0 22.63l22.63 22.63c6.25 6.25 16.38 6.25 22.63 0l3.67-3.67c6.61 3.57 13.57 6.45 20.9 8.65v5.2c0 8.84 7.16 16 16 16h32c8.84 0 16-7.16 16-16v-5.2c7.33-2.2 14.28-5.07 20.9-8.65l3.67 3.67c6.25 6.25 16.38 6.25 22.63 0l22.63-22.63c6.25-6.25 6.25-16.38 0-22.63l-3.67-3.67a110.85 110.85 0 0 0 8.65-20.89h5.2c8.84 0 16-7.16 16-16v-32c-.02-8.84-7.18-16-16.02-16zm-112 80c-26.51 0-48-21.49-48-48s21.49-48 48-48 48 21.49 48 48-21.49 48-48 48zm-208-80h-5.2c-2.2-7.33-5.07-14.28-8.65-20.89l3.67-3.67c6.25-6.25 6.25-16.38 0-22.63l-22.63-22.63c-6.25-6.25-16.38-6.25-22.63 0l-3.67 3.67A110.85 110.85 0 0 0 192 277.2V272c0-8.84-7.16-16-16-16h-32c-8.84 0-16 7.16-16 16v5.2c-7.33 2.2-14.28 5.07-20.89 8.65l-3.67-3.67c-6.25-6.25-16.38-6.25-22.63 0L58.18 304.8c-6.25 6.25-6.25 16.38 0 22.63l3.67 3.67a110.85 110.85 0 0 0-8.65 20.89H48c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h5.2c2.2 7.33 5.07 14.28 8.65 20.89l-3.67 3.67c-6.25 6.25-6.25 16.38 0 22.63l22.63 22.63c6.25 6.25 16.38 6.25 22.63 0l3.67-3.67c6.61 3.57 13.57 6.45 20.9 8.65v5.2c0 8.84 7.16 16 16 16h32c8.84 0 16-7.16 16-16v-5.2c7.33-2.2 14.28-5.07 20.9-8.65l3.67 3.67c6.25 6.25 16.38 6.25 22.63 0l22.63-22.63c6.25-6.25 6.25-16.38 0-22.63l-3.67-3.67a110.85 110.85 0 0 0 8.65-20.89h5.2c8.84 0 16-7.16 16-16v-32C288 359.16 280.84 352 272 352zm-112 80c-26.51 0-48-21.49-48-48s21.49-48 48-48 48 21.49 48 48-21.49 48-48 48z\"]\n};\nvar faTruckMoving = {\n prefix: 'fas',\n iconName: 'truck-moving',\n icon: [640, 512, [], \"f4df\", \"M621.3 237.3l-58.5-58.5c-12-12-28.3-18.7-45.3-18.7H480V64c0-17.7-14.3-32-32-32H32C14.3 32 0 46.3 0 64v336c0 44.2 35.8 80 80 80 26.3 0 49.4-12.9 64-32.4 14.6 19.6 37.7 32.4 64 32.4 44.2 0 80-35.8 80-80 0-5.5-.6-10.8-1.6-16h163.2c-1.1 5.2-1.6 10.5-1.6 16 0 44.2 35.8 80 80 80s80-35.8 80-80c0-5.5-.6-10.8-1.6-16H624c8.8 0 16-7.2 16-16v-85.5c0-17-6.7-33.2-18.7-45.2zM80 432c-17.6 0-32-14.4-32-32s14.4-32 32-32 32 14.4 32 32-14.4 32-32 32zm128 0c-17.6 0-32-14.4-32-32s14.4-32 32-32 32 14.4 32 32-14.4 32-32 32zm272-224h37.5c4.3 0 8.3 1.7 11.3 4.7l43.3 43.3H480v-48zm48 224c-17.6 0-32-14.4-32-32s14.4-32 32-32 32 14.4 32 32-14.4 32-32 32z\"]\n};\nvar faTruckPickup = {\n prefix: 'fas',\n iconName: 'truck-pickup',\n icon: [640, 512, [], \"f63c\", \"M624 288h-16v-64c0-17.67-14.33-32-32-32h-48L419.22 56.02A64.025 64.025 0 0 0 369.24 32H256c-17.67 0-32 14.33-32 32v128H64c-17.67 0-32 14.33-32 32v64H16c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h49.61c-.76 5.27-1.61 10.52-1.61 16 0 61.86 50.14 112 112 112s112-50.14 112-112c0-5.48-.85-10.73-1.61-16h67.23c-.76 5.27-1.61 10.52-1.61 16 0 61.86 50.14 112 112 112s112-50.14 112-112c0-5.48-.85-10.73-1.61-16H624c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16zM288 96h81.24l76.8 96H288V96zM176 416c-26.47 0-48-21.53-48-48s21.53-48 48-48 48 21.53 48 48-21.53 48-48 48zm288 0c-26.47 0-48-21.53-48-48s21.53-48 48-48 48 21.53 48 48-21.53 48-48 48z\"]\n};\nvar faTshirt = {\n prefix: 'fas',\n iconName: 'tshirt',\n icon: [640, 512, [], \"f553\", \"M631.2 96.5L436.5 0C416.4 27.8 371.9 47.2 320 47.2S223.6 27.8 203.5 0L8.8 96.5c-7.9 4-11.1 13.6-7.2 21.5l57.2 114.5c4 7.9 13.6 11.1 21.5 7.2l56.6-27.7c10.6-5.2 23 2.5 23 14.4V480c0 17.7 14.3 32 32 32h256c17.7 0 32-14.3 32-32V226.3c0-11.8 12.4-19.6 23-14.4l56.6 27.7c7.9 4 17.5.8 21.5-7.2L638.3 118c4-7.9.8-17.6-7.1-21.5z\"]\n};\nvar faTty = {\n prefix: 'fas',\n iconName: 'tty',\n icon: [512, 512, [], \"f1e4\", \"M5.37 103.822c138.532-138.532 362.936-138.326 501.262 0 6.078 6.078 7.074 15.496 2.583 22.681l-43.214 69.138a18.332 18.332 0 0 1-22.356 7.305l-86.422-34.569a18.335 18.335 0 0 1-11.434-18.846L351.741 90c-62.145-22.454-130.636-21.986-191.483 0l5.953 59.532a18.331 18.331 0 0 1-11.434 18.846l-86.423 34.568a18.334 18.334 0 0 1-22.356-7.305L2.787 126.502a18.333 18.333 0 0 1 2.583-22.68zM96 308v-40c0-6.627-5.373-12-12-12H44c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm96 0v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm96 0v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm96 0v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm96 0v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm-336 96v-40c0-6.627-5.373-12-12-12H92c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm96 0v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm96 0v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm96 0v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zM96 500v-40c0-6.627-5.373-12-12-12H44c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm288 0v-40c0-6.627-5.373-12-12-12H140c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h232c6.627 0 12-5.373 12-12zm96 0v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12z\"]\n};\nvar faTv = {\n prefix: 'fas',\n iconName: 'tv',\n icon: [640, 512, [], \"f26c\", \"M592 0H48C21.5 0 0 21.5 0 48v320c0 26.5 21.5 48 48 48h245.1v32h-160c-17.7 0-32 14.3-32 32s14.3 32 32 32h384c17.7 0 32-14.3 32-32s-14.3-32-32-32h-160v-32H592c26.5 0 48-21.5 48-48V48c0-26.5-21.5-48-48-48zm-16 352H64V64h512v288z\"]\n};\nvar faUmbrella = {\n prefix: 'fas',\n iconName: 'umbrella',\n icon: [576, 512, [], \"f0e9\", \"M575.7 280.8C547.1 144.5 437.3 62.6 320 49.9V32c0-17.7-14.3-32-32-32s-32 14.3-32 32v17.9C138.3 62.6 29.5 144.5.3 280.8c-2.2 10.1 8.5 21.3 18.7 11.4 52-55 107.7-52.4 158.6 37 5.3 9.5 14.9 8.6 19.7 0 20.2-35.4 44.9-73.2 90.7-73.2 58.5 0 88.2 68.8 90.7 73.2 4.8 8.6 14.4 9.5 19.7 0 51-89.5 107.1-91.4 158.6-37 10.3 10 20.9-1.3 18.7-11.4zM256 301.7V432c0 8.8-7.2 16-16 16-7.8 0-13.2-5.3-15.1-10.7-5.9-16.7-24.1-25.4-40.8-19.5-16.7 5.9-25.4 24.2-19.5 40.8 11.2 31.9 41.6 53.3 75.4 53.3 44.1 0 80-35.9 80-80V301.6c-9.1-7.9-19.8-13.6-32-13.6-12.3.1-22.4 4.8-32 13.7z\"]\n};\nvar faUmbrellaBeach = {\n prefix: 'fas',\n iconName: 'umbrella-beach',\n icon: [640, 512, [], \"f5ca\", \"M115.38 136.9l102.11 37.18c35.19-81.54 86.21-144.29 139-173.7-95.88-4.89-188.78 36.96-248.53 111.8-6.69 8.4-2.66 21.05 7.42 24.72zm132.25 48.16l238.48 86.83c35.76-121.38 18.7-231.66-42.63-253.98-7.4-2.7-15.13-4-23.09-4-58.02.01-128.27 69.17-172.76 171.15zM521.48 60.5c6.22 16.3 10.83 34.6 13.2 55.19 5.74 49.89-1.42 108.23-18.95 166.98l102.62 37.36c10.09 3.67 21.31-3.43 21.57-14.17 2.32-95.69-41.91-187.44-118.44-245.36zM560 447.98H321.06L386 269.5l-60.14-21.9-72.9 200.37H16c-8.84 0-16 7.16-16 16.01v32.01C0 504.83 7.16 512 16 512h544c8.84 0 16-7.17 16-16.01v-32.01c0-8.84-7.16-16-16-16z\"]\n};\nvar faUnderline = {\n prefix: 'fas',\n iconName: 'underline',\n icon: [448, 512, [], \"f0cd\", \"M32 64h32v160c0 88.22 71.78 160 160 160s160-71.78 160-160V64h32a16 16 0 0 0 16-16V16a16 16 0 0 0-16-16H272a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h32v160a80 80 0 0 1-160 0V64h32a16 16 0 0 0 16-16V16a16 16 0 0 0-16-16H32a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16zm400 384H16a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h416a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16z\"]\n};\nvar faUndo = {\n prefix: 'fas',\n iconName: 'undo',\n icon: [512, 512, [], \"f0e2\", \"M212.333 224.333H12c-6.627 0-12-5.373-12-12V12C0 5.373 5.373 0 12 0h48c6.627 0 12 5.373 12 12v78.112C117.773 39.279 184.26 7.47 258.175 8.007c136.906.994 246.448 111.623 246.157 248.532C504.041 393.258 393.12 504 256.333 504c-64.089 0-122.496-24.313-166.51-64.215-5.099-4.622-5.334-12.554-.467-17.42l33.967-33.967c4.474-4.474 11.662-4.717 16.401-.525C170.76 415.336 211.58 432 256.333 432c97.268 0 176-78.716 176-176 0-97.267-78.716-176-176-176-58.496 0-110.28 28.476-142.274 72.333h98.274c6.627 0 12 5.373 12 12v48c0 6.627-5.373 12-12 12z\"]\n};\nvar faUndoAlt = {\n prefix: 'fas',\n iconName: 'undo-alt',\n icon: [512, 512, [], \"f2ea\", \"M255.545 8c-66.269.119-126.438 26.233-170.86 68.685L48.971 40.971C33.851 25.851 8 36.559 8 57.941V192c0 13.255 10.745 24 24 24h134.059c21.382 0 32.09-25.851 16.971-40.971l-41.75-41.75c30.864-28.899 70.801-44.907 113.23-45.273 92.398-.798 170.283 73.977 169.484 169.442C423.236 348.009 349.816 424 256 424c-41.127 0-79.997-14.678-110.63-41.556-4.743-4.161-11.906-3.908-16.368.553L89.34 422.659c-4.872 4.872-4.631 12.815.482 17.433C133.798 479.813 192.074 504 256 504c136.966 0 247.999-111.033 248-247.998C504.001 119.193 392.354 7.755 255.545 8z\"]\n};\nvar faUniversalAccess = {\n prefix: 'fas',\n iconName: 'universal-access',\n icon: [512, 512, [], \"f29a\", \"M256 48c114.953 0 208 93.029 208 208 0 114.953-93.029 208-208 208-114.953 0-208-93.029-208-208 0-114.953 93.029-208 208-208m0-40C119.033 8 8 119.033 8 256s111.033 248 248 248 248-111.033 248-248S392.967 8 256 8zm0 56C149.961 64 64 149.961 64 256s85.961 192 192 192 192-85.961 192-192S362.039 64 256 64zm0 44c19.882 0 36 16.118 36 36s-16.118 36-36 36-36-16.118-36-36 16.118-36 36-36zm117.741 98.023c-28.712 6.779-55.511 12.748-82.14 15.807.851 101.023 12.306 123.052 25.037 155.621 3.617 9.26-.957 19.698-10.217 23.315-9.261 3.617-19.699-.957-23.316-10.217-8.705-22.308-17.086-40.636-22.261-78.549h-9.686c-5.167 37.851-13.534 56.208-22.262 78.549-3.615 9.255-14.05 13.836-23.315 10.217-9.26-3.617-13.834-14.056-10.217-23.315 12.713-32.541 24.185-54.541 25.037-155.621-26.629-3.058-53.428-9.027-82.141-15.807-8.6-2.031-13.926-10.648-11.895-19.249s10.647-13.926 19.249-11.895c96.686 22.829 124.283 22.783 220.775 0 8.599-2.03 17.218 3.294 19.249 11.895 2.029 8.601-3.297 17.219-11.897 19.249z\"]\n};\nvar faUniversity = {\n prefix: 'fas',\n iconName: 'university',\n icon: [512, 512, [], \"f19c\", \"M496 128v16a8 8 0 0 1-8 8h-24v12c0 6.627-5.373 12-12 12H60c-6.627 0-12-5.373-12-12v-12H24a8 8 0 0 1-8-8v-16a8 8 0 0 1 4.941-7.392l232-88a7.996 7.996 0 0 1 6.118 0l232 88A8 8 0 0 1 496 128zm-24 304H40c-13.255 0-24 10.745-24 24v16a8 8 0 0 0 8 8h464a8 8 0 0 0 8-8v-16c0-13.255-10.745-24-24-24zM96 192v192H60c-6.627 0-12 5.373-12 12v20h416v-20c0-6.627-5.373-12-12-12h-36V192h-64v192h-64V192h-64v192h-64V192H96z\"]\n};\nvar faUnlink = {\n prefix: 'fas',\n iconName: 'unlink',\n icon: [512, 512, [], \"f127\", \"M304.083 405.907c4.686 4.686 4.686 12.284 0 16.971l-44.674 44.674c-59.263 59.262-155.693 59.266-214.961 0-59.264-59.265-59.264-155.696 0-214.96l44.675-44.675c4.686-4.686 12.284-4.686 16.971 0l39.598 39.598c4.686 4.686 4.686 12.284 0 16.971l-44.675 44.674c-28.072 28.073-28.072 73.75 0 101.823 28.072 28.072 73.75 28.073 101.824 0l44.674-44.674c4.686-4.686 12.284-4.686 16.971 0l39.597 39.598zm-56.568-260.216c4.686 4.686 12.284 4.686 16.971 0l44.674-44.674c28.072-28.075 73.75-28.073 101.824 0 28.072 28.073 28.072 73.75 0 101.823l-44.675 44.674c-4.686 4.686-4.686 12.284 0 16.971l39.598 39.598c4.686 4.686 12.284 4.686 16.971 0l44.675-44.675c59.265-59.265 59.265-155.695 0-214.96-59.266-59.264-155.695-59.264-214.961 0l-44.674 44.674c-4.686 4.686-4.686 12.284 0 16.971l39.597 39.598zm234.828 359.28l22.627-22.627c9.373-9.373 9.373-24.569 0-33.941L63.598 7.029c-9.373-9.373-24.569-9.373-33.941 0L7.029 29.657c-9.373 9.373-9.373 24.569 0 33.941l441.373 441.373c9.373 9.372 24.569 9.372 33.941 0z\"]\n};\nvar faUnlock = {\n prefix: 'fas',\n iconName: 'unlock',\n icon: [448, 512, [], \"f09c\", \"M400 256H152V152.9c0-39.6 31.7-72.5 71.3-72.9 40-.4 72.7 32.1 72.7 72v16c0 13.3 10.7 24 24 24h32c13.3 0 24-10.7 24-24v-16C376 68 307.5-.3 223.5 0 139.5.3 72 69.5 72 153.5V256H48c-26.5 0-48 21.5-48 48v160c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V304c0-26.5-21.5-48-48-48z\"]\n};\nvar faUnlockAlt = {\n prefix: 'fas',\n iconName: 'unlock-alt',\n icon: [448, 512, [], \"f13e\", \"M400 256H152V152.9c0-39.6 31.7-72.5 71.3-72.9 40-.4 72.7 32.1 72.7 72v16c0 13.3 10.7 24 24 24h32c13.3 0 24-10.7 24-24v-16C376 68 307.5-.3 223.5 0 139.5.3 72 69.5 72 153.5V256H48c-26.5 0-48 21.5-48 48v160c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V304c0-26.5-21.5-48-48-48zM264 408c0 22.1-17.9 40-40 40s-40-17.9-40-40v-48c0-22.1 17.9-40 40-40s40 17.9 40 40v48z\"]\n};\nvar faUpload = {\n prefix: 'fas',\n iconName: 'upload',\n icon: [512, 512, [], \"f093\", \"M296 384h-80c-13.3 0-24-10.7-24-24V192h-87.7c-17.8 0-26.7-21.5-14.1-34.1L242.3 5.7c7.5-7.5 19.8-7.5 27.3 0l152.2 152.2c12.6 12.6 3.7 34.1-14.1 34.1H320v168c0 13.3-10.7 24-24 24zm216-8v112c0 13.3-10.7 24-24 24H24c-13.3 0-24-10.7-24-24V376c0-13.3 10.7-24 24-24h136v8c0 30.9 25.1 56 56 56h80c30.9 0 56-25.1 56-56v-8h136c13.3 0 24 10.7 24 24zm-124 88c0-11-9-20-20-20s-20 9-20 20 9 20 20 20 20-9 20-20zm64 0c0-11-9-20-20-20s-20 9-20 20 9 20 20 20 20-9 20-20z\"]\n};\nvar faUser = {\n prefix: 'fas',\n iconName: 'user',\n icon: [448, 512, [], \"f007\", \"M224 256c70.7 0 128-57.3 128-128S294.7 0 224 0 96 57.3 96 128s57.3 128 128 128zm89.6 32h-16.7c-22.2 10.2-46.9 16-72.9 16s-50.6-5.8-72.9-16h-16.7C60.2 288 0 348.2 0 422.4V464c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48v-41.6c0-74.2-60.2-134.4-134.4-134.4z\"]\n};\nvar faUserAlt = {\n prefix: 'fas',\n iconName: 'user-alt',\n icon: [512, 512, [], \"f406\", \"M256 288c79.5 0 144-64.5 144-144S335.5 0 256 0 112 64.5 112 144s64.5 144 144 144zm128 32h-55.1c-22.2 10.2-46.9 16-72.9 16s-50.6-5.8-72.9-16H128C57.3 320 0 377.3 0 448v16c0 26.5 21.5 48 48 48h416c26.5 0 48-21.5 48-48v-16c0-70.7-57.3-128-128-128z\"]\n};\nvar faUserAltSlash = {\n prefix: 'fas',\n iconName: 'user-alt-slash',\n icon: [640, 512, [], \"f4fa\", \"M633.8 458.1L389.6 269.3C433.8 244.7 464 198.1 464 144 464 64.5 399.5 0 320 0c-67.1 0-123 46.1-139 108.2L45.5 3.4C38.5-2 28.5-.8 23 6.2L3.4 31.4c-5.4 7-4.2 17 2.8 22.4l588.4 454.7c7 5.4 17 4.2 22.5-2.8l19.6-25.3c5.4-6.8 4.1-16.9-2.9-22.3zM198.4 320C124.2 320 64 380.2 64 454.4v9.6c0 26.5 21.5 48 48 48h382.2L245.8 320h-47.4z\"]\n};\nvar faUserAstronaut = {\n prefix: 'fas',\n iconName: 'user-astronaut',\n icon: [448, 512, [], \"f4fb\", \"M64 224h13.5c24.7 56.5 80.9 96 146.5 96s121.8-39.5 146.5-96H384c8.8 0 16-7.2 16-16v-96c0-8.8-7.2-16-16-16h-13.5C345.8 39.5 289.6 0 224 0S102.2 39.5 77.5 96H64c-8.8 0-16 7.2-16 16v96c0 8.8 7.2 16 16 16zm40-88c0-22.1 21.5-40 48-40h144c26.5 0 48 17.9 48 40v24c0 53-43 96-96 96h-48c-53 0-96-43-96-96v-24zm72 72l12-36 36-12-36-12-12-36-12 36-36 12 36 12 12 36zm151.6 113.4C297.7 340.7 262.2 352 224 352s-73.7-11.3-103.6-30.6C52.9 328.5 0 385 0 454.4v9.6c0 26.5 21.5 48 48 48h80v-64c0-17.7 14.3-32 32-32h128c17.7 0 32 14.3 32 32v64h80c26.5 0 48-21.5 48-48v-9.6c0-69.4-52.9-125.9-120.4-133zM272 448c-8.8 0-16 7.2-16 16s7.2 16 16 16 16-7.2 16-16-7.2-16-16-16zm-96 0c-8.8 0-16 7.2-16 16v48h32v-48c0-8.8-7.2-16-16-16z\"]\n};\nvar faUserCheck = {\n prefix: 'fas',\n iconName: 'user-check',\n icon: [640, 512, [], \"f4fc\", \"M224 256c70.7 0 128-57.3 128-128S294.7 0 224 0 96 57.3 96 128s57.3 128 128 128zm89.6 32h-16.7c-22.2 10.2-46.9 16-72.9 16s-50.6-5.8-72.9-16h-16.7C60.2 288 0 348.2 0 422.4V464c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48v-41.6c0-74.2-60.2-134.4-134.4-134.4zm323-128.4l-27.8-28.1c-4.6-4.7-12.1-4.7-16.8-.1l-104.8 104-45.5-45.8c-4.6-4.7-12.1-4.7-16.8-.1l-28.1 27.9c-4.7 4.6-4.7 12.1-.1 16.8l81.7 82.3c4.6 4.7 12.1 4.7 16.8.1l141.3-140.2c4.6-4.7 4.7-12.2.1-16.8z\"]\n};\nvar faUserCircle = {\n prefix: 'fas',\n iconName: 'user-circle',\n icon: [496, 512, [], \"f2bd\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 96c48.6 0 88 39.4 88 88s-39.4 88-88 88-88-39.4-88-88 39.4-88 88-88zm0 344c-58.7 0-111.3-26.6-146.5-68.2 18.8-35.4 55.6-59.8 98.5-59.8 2.4 0 4.8.4 7.1 1.1 13 4.2 26.6 6.9 40.9 6.9 14.3 0 28-2.7 40.9-6.9 2.3-.7 4.7-1.1 7.1-1.1 42.9 0 79.7 24.4 98.5 59.8C359.3 421.4 306.7 448 248 448z\"]\n};\nvar faUserClock = {\n prefix: 'fas',\n iconName: 'user-clock',\n icon: [640, 512, [], \"f4fd\", \"M496 224c-79.6 0-144 64.4-144 144s64.4 144 144 144 144-64.4 144-144-64.4-144-144-144zm64 150.3c0 5.3-4.4 9.7-9.7 9.7h-60.6c-5.3 0-9.7-4.4-9.7-9.7v-76.6c0-5.3 4.4-9.7 9.7-9.7h12.6c5.3 0 9.7 4.4 9.7 9.7V352h38.3c5.3 0 9.7 4.4 9.7 9.7v12.6zM320 368c0-27.8 6.7-54.1 18.2-77.5-8-1.5-16.2-2.5-24.6-2.5h-16.7c-22.2 10.2-46.9 16-72.9 16s-50.6-5.8-72.9-16h-16.7C60.2 288 0 348.2 0 422.4V464c0 26.5 21.5 48 48 48h347.1c-45.3-31.9-75.1-84.5-75.1-144zm-96-112c70.7 0 128-57.3 128-128S294.7 0 224 0 96 57.3 96 128s57.3 128 128 128z\"]\n};\nvar faUserCog = {\n prefix: 'fas',\n iconName: 'user-cog',\n icon: [640, 512, [], \"f4fe\", \"M610.5 373.3c2.6-14.1 2.6-28.5 0-42.6l25.8-14.9c3-1.7 4.3-5.2 3.3-8.5-6.7-21.6-18.2-41.2-33.2-57.4-2.3-2.5-6-3.1-9-1.4l-25.8 14.9c-10.9-9.3-23.4-16.5-36.9-21.3v-29.8c0-3.4-2.4-6.4-5.7-7.1-22.3-5-45-4.8-66.2 0-3.3.7-5.7 3.7-5.7 7.1v29.8c-13.5 4.8-26 12-36.9 21.3l-25.8-14.9c-2.9-1.7-6.7-1.1-9 1.4-15 16.2-26.5 35.8-33.2 57.4-1 3.3.4 6.8 3.3 8.5l25.8 14.9c-2.6 14.1-2.6 28.5 0 42.6l-25.8 14.9c-3 1.7-4.3 5.2-3.3 8.5 6.7 21.6 18.2 41.1 33.2 57.4 2.3 2.5 6 3.1 9 1.4l25.8-14.9c10.9 9.3 23.4 16.5 36.9 21.3v29.8c0 3.4 2.4 6.4 5.7 7.1 22.3 5 45 4.8 66.2 0 3.3-.7 5.7-3.7 5.7-7.1v-29.8c13.5-4.8 26-12 36.9-21.3l25.8 14.9c2.9 1.7 6.7 1.1 9-1.4 15-16.2 26.5-35.8 33.2-57.4 1-3.3-.4-6.8-3.3-8.5l-25.8-14.9zM496 400.5c-26.8 0-48.5-21.8-48.5-48.5s21.8-48.5 48.5-48.5 48.5 21.8 48.5 48.5-21.7 48.5-48.5 48.5zM224 256c70.7 0 128-57.3 128-128S294.7 0 224 0 96 57.3 96 128s57.3 128 128 128zm201.2 226.5c-2.3-1.2-4.6-2.6-6.8-3.9l-7.9 4.6c-6 3.4-12.8 5.3-19.6 5.3-10.9 0-21.4-4.6-28.9-12.6-18.3-19.8-32.3-43.9-40.2-69.6-5.5-17.7 1.9-36.4 17.9-45.7l7.9-4.6c-.1-2.6-.1-5.2 0-7.8l-7.9-4.6c-16-9.2-23.4-28-17.9-45.7.9-2.9 2.2-5.8 3.2-8.7-3.8-.3-7.5-1.2-11.4-1.2h-16.7c-22.2 10.2-46.9 16-72.9 16s-50.6-5.8-72.9-16h-16.7C60.2 288 0 348.2 0 422.4V464c0 26.5 21.5 48 48 48h352c10.1 0 19.5-3.2 27.2-8.5-1.2-3.8-2-7.7-2-11.8v-9.2z\"]\n};\nvar faUserEdit = {\n prefix: 'fas',\n iconName: 'user-edit',\n icon: [640, 512, [], \"f4ff\", \"M224 256c70.7 0 128-57.3 128-128S294.7 0 224 0 96 57.3 96 128s57.3 128 128 128zm89.6 32h-16.7c-22.2 10.2-46.9 16-72.9 16s-50.6-5.8-72.9-16h-16.7C60.2 288 0 348.2 0 422.4V464c0 26.5 21.5 48 48 48h274.9c-2.4-6.8-3.4-14-2.6-21.3l6.8-60.9 1.2-11.1 7.9-7.9 77.3-77.3c-24.5-27.7-60-45.5-99.9-45.5zm45.3 145.3l-6.8 61c-1.1 10.2 7.5 18.8 17.6 17.6l60.9-6.8 137.9-137.9-71.7-71.7-137.9 137.8zM633 268.9L595.1 231c-9.3-9.3-24.5-9.3-33.8 0l-37.8 37.8-4.1 4.1 71.8 71.7 41.8-41.8c9.3-9.4 9.3-24.5 0-33.9z\"]\n};\nvar faUserFriends = {\n prefix: 'fas',\n iconName: 'user-friends',\n icon: [640, 512, [], \"f500\", \"M192 256c61.9 0 112-50.1 112-112S253.9 32 192 32 80 82.1 80 144s50.1 112 112 112zm76.8 32h-8.3c-20.8 10-43.9 16-68.5 16s-47.6-6-68.5-16h-8.3C51.6 288 0 339.6 0 403.2V432c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48v-28.8c0-63.6-51.6-115.2-115.2-115.2zM480 256c53 0 96-43 96-96s-43-96-96-96-96 43-96 96 43 96 96 96zm48 32h-3.8c-13.9 4.8-28.6 8-44.2 8s-30.3-3.2-44.2-8H432c-20.4 0-39.2 5.9-55.7 15.4 24.4 26.3 39.7 61.2 39.7 99.8v38.4c0 2.2-.5 4.3-.6 6.4H592c26.5 0 48-21.5 48-48 0-61.9-50.1-112-112-112z\"]\n};\nvar faUserGraduate = {\n prefix: 'fas',\n iconName: 'user-graduate',\n icon: [448, 512, [], \"f501\", \"M319.4 320.6L224 416l-95.4-95.4C57.1 323.7 0 382.2 0 454.4v9.6c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48v-9.6c0-72.2-57.1-130.7-128.6-133.8zM13.6 79.8l6.4 1.5v58.4c-7 4.2-12 11.5-12 20.3 0 8.4 4.6 15.4 11.1 19.7L3.5 242c-1.7 6.9 2.1 14 7.6 14h41.8c5.5 0 9.3-7.1 7.6-14l-15.6-62.3C51.4 175.4 56 168.4 56 160c0-8.8-5-16.1-12-20.3V87.1l66 15.9c-8.6 17.2-14 36.4-14 57 0 70.7 57.3 128 128 128s128-57.3 128-128c0-20.6-5.3-39.8-14-57l96.3-23.2c18.2-4.4 18.2-27.1 0-31.5l-190.4-46c-13-3.1-26.7-3.1-39.7 0L13.6 48.2c-18.1 4.4-18.1 27.2 0 31.6z\"]\n};\nvar faUserInjured = {\n prefix: 'fas',\n iconName: 'user-injured',\n icon: [448, 512, [], \"f728\", \"M277.37 11.98C261.08 4.47 243.11 0 224 0c-53.69 0-99.5 33.13-118.51 80h81.19l90.69-68.02zM342.51 80c-7.9-19.47-20.67-36.2-36.49-49.52L239.99 80h102.52zM224 256c70.69 0 128-57.31 128-128 0-5.48-.95-10.7-1.61-16H97.61c-.67 5.3-1.61 10.52-1.61 16 0 70.69 57.31 128 128 128zM80 299.7V512h128.26l-98.45-221.52A132.835 132.835 0 0 0 80 299.7zM0 464c0 26.51 21.49 48 48 48V320.24C18.88 344.89 0 381.26 0 422.4V464zm256-48h-55.38l42.67 96H256c26.47 0 48-21.53 48-48s-21.53-48-48-48zm57.6-128h-16.71c-22.24 10.18-46.88 16-72.89 16s-50.65-5.82-72.89-16h-7.37l42.67 96H256c44.11 0 80 35.89 80 80 0 18.08-6.26 34.59-16.41 48H400c26.51 0 48-21.49 48-48v-41.6c0-74.23-60.17-134.4-134.4-134.4z\"]\n};\nvar faUserLock = {\n prefix: 'fas',\n iconName: 'user-lock',\n icon: [640, 512, [], \"f502\", \"M224 256A128 128 0 1 0 96 128a128 128 0 0 0 128 128zm96 64a63.08 63.08 0 0 1 8.1-30.5c-4.8-.5-9.5-1.5-14.5-1.5h-16.7a174.08 174.08 0 0 1-145.8 0h-16.7A134.43 134.43 0 0 0 0 422.4V464a48 48 0 0 0 48 48h280.9a63.54 63.54 0 0 1-8.9-32zm288-32h-32v-80a80 80 0 0 0-160 0v80h-32a32 32 0 0 0-32 32v160a32 32 0 0 0 32 32h224a32 32 0 0 0 32-32V320a32 32 0 0 0-32-32zM496 432a32 32 0 1 1 32-32 32 32 0 0 1-32 32zm32-144h-64v-80a32 32 0 0 1 64 0z\"]\n};\nvar faUserMd = {\n prefix: 'fas',\n iconName: 'user-md',\n icon: [448, 512, [], \"f0f0\", \"M224 256c70.7 0 128-57.3 128-128S294.7 0 224 0 96 57.3 96 128s57.3 128 128 128zM104 424c0 13.3 10.7 24 24 24s24-10.7 24-24-10.7-24-24-24-24 10.7-24 24zm216-135.4v49c36.5 7.4 64 39.8 64 78.4v41.7c0 7.6-5.4 14.2-12.9 15.7l-32.2 6.4c-4.3.9-8.5-1.9-9.4-6.3l-3.1-15.7c-.9-4.3 1.9-8.6 6.3-9.4l19.3-3.9V416c0-62.8-96-65.1-96 1.9v26.7l19.3 3.9c4.3.9 7.1 5.1 6.3 9.4l-3.1 15.7c-.9 4.3-5.1 7.1-9.4 6.3l-31.2-4.2c-7.9-1.1-13.8-7.8-13.8-15.9V416c0-38.6 27.5-70.9 64-78.4v-45.2c-2.2.7-4.4 1.1-6.6 1.9-18 6.3-37.3 9.8-57.4 9.8s-39.4-3.5-57.4-9.8c-7.4-2.6-14.9-4.2-22.6-5.2v81.6c23.1 6.9 40 28.1 40 53.4 0 30.9-25.1 56-56 56s-56-25.1-56-56c0-25.3 16.9-46.5 40-53.4v-80.4C48.5 301 0 355.8 0 422.4v44.8C0 491.9 20.1 512 44.8 512h358.4c24.7 0 44.8-20.1 44.8-44.8v-44.8c0-72-56.8-130.3-128-133.8z\"]\n};\nvar faUserMinus = {\n prefix: 'fas',\n iconName: 'user-minus',\n icon: [640, 512, [], \"f503\", \"M624 208H432c-8.8 0-16 7.2-16 16v32c0 8.8 7.2 16 16 16h192c8.8 0 16-7.2 16-16v-32c0-8.8-7.2-16-16-16zm-400 48c70.7 0 128-57.3 128-128S294.7 0 224 0 96 57.3 96 128s57.3 128 128 128zm89.6 32h-16.7c-22.2 10.2-46.9 16-72.9 16s-50.6-5.8-72.9-16h-16.7C60.2 288 0 348.2 0 422.4V464c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48v-41.6c0-74.2-60.2-134.4-134.4-134.4z\"]\n};\nvar faUserNinja = {\n prefix: 'fas',\n iconName: 'user-ninja',\n icon: [448, 512, [], \"f504\", \"M325.4 289.2L224 390.6 122.6 289.2C54 295.3 0 352.2 0 422.4V464c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48v-41.6c0-70.2-54-127.1-122.6-133.2zM32 192c27.3 0 51.8-11.5 69.2-29.7 15.1 53.9 64 93.7 122.8 93.7 70.7 0 128-57.3 128-128S294.7 0 224 0c-50.4 0-93.6 29.4-114.5 71.8C92.1 47.8 64 32 32 32c0 33.4 17.1 62.8 43.1 80-26 17.2-43.1 46.6-43.1 80zm144-96h96c17.7 0 32 14.3 32 32H144c0-17.7 14.3-32 32-32z\"]\n};\nvar faUserNurse = {\n prefix: 'fas',\n iconName: 'user-nurse',\n icon: [448, 512, [], \"f82f\", \"M57.78 288h82.36c22.51 19.68 51.62 32 83.86 32s61.35-12.32 83.86-32h82.36a16 16 0 0 0 14.28-23.18c-15.23-29.85-31.28-62.23-42.15-95.54C354.78 146.09 352 121.59 352 97.2V48L224 0 96 48v49.2c0 24.39-2.75 48.89-10.33 72.08C74.78 202.59 58.73 235 43.5 264.82A16 16 0 0 0 57.78 288zM184 71.67a5 5 0 0 1 5-5h21.67V45a5 5 0 0 1 5-5h16.66a5 5 0 0 1 5 5v21.67H259a5 5 0 0 1 5 5v16.66a5 5 0 0 1-5 5h-21.67V115a5 5 0 0 1-5 5h-16.66a5 5 0 0 1-5-5V93.33H189a5 5 0 0 1-5-5zM144 160h160v32a80 80 0 0 1-160 0zm175.41 160L224 415.39 128.59 320C57.1 323.1 0 381.6 0 453.79A58.21 58.21 0 0 0 58.21 512h331.58A58.21 58.21 0 0 0 448 453.79C448 381.6 390.9 323.1 319.41 320z\"]\n};\nvar faUserPlus = {\n prefix: 'fas',\n iconName: 'user-plus',\n icon: [640, 512, [], \"f234\", \"M624 208h-64v-64c0-8.8-7.2-16-16-16h-32c-8.8 0-16 7.2-16 16v64h-64c-8.8 0-16 7.2-16 16v32c0 8.8 7.2 16 16 16h64v64c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16v-64h64c8.8 0 16-7.2 16-16v-32c0-8.8-7.2-16-16-16zm-400 48c70.7 0 128-57.3 128-128S294.7 0 224 0 96 57.3 96 128s57.3 128 128 128zm89.6 32h-16.7c-22.2 10.2-46.9 16-72.9 16s-50.6-5.8-72.9-16h-16.7C60.2 288 0 348.2 0 422.4V464c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48v-41.6c0-74.2-60.2-134.4-134.4-134.4z\"]\n};\nvar faUserSecret = {\n prefix: 'fas',\n iconName: 'user-secret',\n icon: [448, 512, [], \"f21b\", \"M383.9 308.3l23.9-62.6c4-10.5-3.7-21.7-15-21.7h-58.5c11-18.9 17.8-40.6 17.8-64v-.3c39.2-7.8 64-19.1 64-31.7 0-13.3-27.3-25.1-70.1-33-9.2-32.8-27-65.8-40.6-82.8-9.5-11.9-25.9-15.6-39.5-8.8l-27.6 13.8c-9 4.5-19.6 4.5-28.6 0L182.1 3.4c-13.6-6.8-30-3.1-39.5 8.8-13.5 17-31.4 50-40.6 82.8-42.7 7.9-70 19.7-70 33 0 12.6 24.8 23.9 64 31.7v.3c0 23.4 6.8 45.1 17.8 64H56.3c-11.5 0-19.2 11.7-14.7 22.3l25.8 60.2C27.3 329.8 0 372.7 0 422.4v44.8C0 491.9 20.1 512 44.8 512h358.4c24.7 0 44.8-20.1 44.8-44.8v-44.8c0-48.4-25.8-90.4-64.1-114.1zM176 480l-41.6-192 49.6 32 24 40-32 120zm96 0l-32-120 24-40 49.6-32L272 480zm41.7-298.5c-3.9 11.9-7 24.6-16.5 33.4-10.1 9.3-48 22.4-64-25-2.8-8.4-15.4-8.4-18.3 0-17 50.2-56 32.4-64 25-9.5-8.8-12.7-21.5-16.5-33.4-.8-2.5-6.3-5.7-6.3-5.8v-10.8c28.3 3.6 61 5.8 96 5.8s67.7-2.1 96-5.8v10.8c-.1.1-5.6 3.2-6.4 5.8z\"]\n};\nvar faUserShield = {\n prefix: 'fas',\n iconName: 'user-shield',\n icon: [640, 512, [], \"f505\", \"M622.3 271.1l-115.2-45c-4.1-1.6-12.6-3.7-22.2 0l-115.2 45c-10.7 4.2-17.7 14-17.7 24.9 0 111.6 68.7 188.8 132.9 213.9 9.6 3.7 18 1.6 22.2 0C558.4 489.9 640 420.5 640 296c0-10.9-7-20.7-17.7-24.9zM496 462.4V273.3l95.5 37.3c-5.6 87.1-60.9 135.4-95.5 151.8zM224 256c70.7 0 128-57.3 128-128S294.7 0 224 0 96 57.3 96 128s57.3 128 128 128zm96 40c0-2.5.8-4.8 1.1-7.2-2.5-.1-4.9-.8-7.5-.8h-16.7c-22.2 10.2-46.9 16-72.9 16s-50.6-5.8-72.9-16h-16.7C60.2 288 0 348.2 0 422.4V464c0 26.5 21.5 48 48 48h352c6.8 0 13.3-1.5 19.2-4-54-42.9-99.2-116.7-99.2-212z\"]\n};\nvar faUserSlash = {\n prefix: 'fas',\n iconName: 'user-slash',\n icon: [640, 512, [], \"f506\", \"M633.8 458.1L362.3 248.3C412.1 230.7 448 183.8 448 128 448 57.3 390.7 0 320 0c-67.1 0-121.5 51.8-126.9 117.4L45.5 3.4C38.5-2 28.5-.8 23 6.2L3.4 31.4c-5.4 7-4.2 17 2.8 22.4l588.4 454.7c7 5.4 17 4.2 22.5-2.8l19.6-25.3c5.4-6.8 4.1-16.9-2.9-22.3zM96 422.4V464c0 26.5 21.5 48 48 48h350.2L207.4 290.3C144.2 301.3 96 356 96 422.4z\"]\n};\nvar faUserTag = {\n prefix: 'fas',\n iconName: 'user-tag',\n icon: [640, 512, [], \"f507\", \"M630.6 364.9l-90.3-90.2c-12-12-28.3-18.7-45.3-18.7h-79.3c-17.7 0-32 14.3-32 32v79.2c0 17 6.7 33.2 18.7 45.2l90.3 90.2c12.5 12.5 32.8 12.5 45.3 0l92.5-92.5c12.6-12.5 12.6-32.7.1-45.2zm-182.8-21c-13.3 0-24-10.7-24-24s10.7-24 24-24 24 10.7 24 24c0 13.2-10.7 24-24 24zm-223.8-88c70.7 0 128-57.3 128-128C352 57.3 294.7 0 224 0S96 57.3 96 128c0 70.6 57.3 127.9 128 127.9zm127.8 111.2V294c-12.2-3.6-24.9-6.2-38.2-6.2h-16.7c-22.2 10.2-46.9 16-72.9 16s-50.6-5.8-72.9-16h-16.7C60.2 287.9 0 348.1 0 422.3v41.6c0 26.5 21.5 48 48 48h352c15.5 0 29.1-7.5 37.9-18.9l-58-58c-18.1-18.1-28.1-42.2-28.1-67.9z\"]\n};\nvar faUserTie = {\n prefix: 'fas',\n iconName: 'user-tie',\n icon: [448, 512, [], \"f508\", \"M224 256c70.7 0 128-57.3 128-128S294.7 0 224 0 96 57.3 96 128s57.3 128 128 128zm95.8 32.6L272 480l-32-136 32-56h-96l32 56-32 136-47.8-191.4C56.9 292 0 350.3 0 422.4V464c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48v-41.6c0-72.1-56.9-130.4-128.2-133.8z\"]\n};\nvar faUserTimes = {\n prefix: 'fas',\n iconName: 'user-times',\n icon: [640, 512, [], \"f235\", \"M589.6 240l45.6-45.6c6.3-6.3 6.3-16.5 0-22.8l-22.8-22.8c-6.3-6.3-16.5-6.3-22.8 0L544 194.4l-45.6-45.6c-6.3-6.3-16.5-6.3-22.8 0l-22.8 22.8c-6.3 6.3-6.3 16.5 0 22.8l45.6 45.6-45.6 45.6c-6.3 6.3-6.3 16.5 0 22.8l22.8 22.8c6.3 6.3 16.5 6.3 22.8 0l45.6-45.6 45.6 45.6c6.3 6.3 16.5 6.3 22.8 0l22.8-22.8c6.3-6.3 6.3-16.5 0-22.8L589.6 240zM224 256c70.7 0 128-57.3 128-128S294.7 0 224 0 96 57.3 96 128s57.3 128 128 128zm89.6 32h-16.7c-22.2 10.2-46.9 16-72.9 16s-50.6-5.8-72.9-16h-16.7C60.2 288 0 348.2 0 422.4V464c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48v-41.6c0-74.2-60.2-134.4-134.4-134.4z\"]\n};\nvar faUsers = {\n prefix: 'fas',\n iconName: 'users',\n icon: [640, 512, [], \"f0c0\", \"M96 224c35.3 0 64-28.7 64-64s-28.7-64-64-64-64 28.7-64 64 28.7 64 64 64zm448 0c35.3 0 64-28.7 64-64s-28.7-64-64-64-64 28.7-64 64 28.7 64 64 64zm32 32h-64c-17.6 0-33.5 7.1-45.1 18.6 40.3 22.1 68.9 62 75.1 109.4h66c17.7 0 32-14.3 32-32v-32c0-35.3-28.7-64-64-64zm-256 0c61.9 0 112-50.1 112-112S381.9 32 320 32 208 82.1 208 144s50.1 112 112 112zm76.8 32h-8.3c-20.8 10-43.9 16-68.5 16s-47.6-6-68.5-16h-8.3C179.6 288 128 339.6 128 403.2V432c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48v-28.8c0-63.6-51.6-115.2-115.2-115.2zm-223.7-13.4C161.5 263.1 145.6 256 128 256H64c-35.3 0-64 28.7-64 64v32c0 17.7 14.3 32 32 32h65.9c6.3-47.4 34.9-87.3 75.2-109.4z\"]\n};\nvar faUsersCog = {\n prefix: 'fas',\n iconName: 'users-cog',\n icon: [640, 512, [], \"f509\", \"M610.5 341.3c2.6-14.1 2.6-28.5 0-42.6l25.8-14.9c3-1.7 4.3-5.2 3.3-8.5-6.7-21.6-18.2-41.2-33.2-57.4-2.3-2.5-6-3.1-9-1.4l-25.8 14.9c-10.9-9.3-23.4-16.5-36.9-21.3v-29.8c0-3.4-2.4-6.4-5.7-7.1-22.3-5-45-4.8-66.2 0-3.3.7-5.7 3.7-5.7 7.1v29.8c-13.5 4.8-26 12-36.9 21.3l-25.8-14.9c-2.9-1.7-6.7-1.1-9 1.4-15 16.2-26.5 35.8-33.2 57.4-1 3.3.4 6.8 3.3 8.5l25.8 14.9c-2.6 14.1-2.6 28.5 0 42.6l-25.8 14.9c-3 1.7-4.3 5.2-3.3 8.5 6.7 21.6 18.2 41.1 33.2 57.4 2.3 2.5 6 3.1 9 1.4l25.8-14.9c10.9 9.3 23.4 16.5 36.9 21.3v29.8c0 3.4 2.4 6.4 5.7 7.1 22.3 5 45 4.8 66.2 0 3.3-.7 5.7-3.7 5.7-7.1v-29.8c13.5-4.8 26-12 36.9-21.3l25.8 14.9c2.9 1.7 6.7 1.1 9-1.4 15-16.2 26.5-35.8 33.2-57.4 1-3.3-.4-6.8-3.3-8.5l-25.8-14.9zM496 368.5c-26.8 0-48.5-21.8-48.5-48.5s21.8-48.5 48.5-48.5 48.5 21.8 48.5 48.5-21.7 48.5-48.5 48.5zM96 224c35.3 0 64-28.7 64-64s-28.7-64-64-64-64 28.7-64 64 28.7 64 64 64zm224 32c1.9 0 3.7-.5 5.6-.6 8.3-21.7 20.5-42.1 36.3-59.2 7.4-8 17.9-12.6 28.9-12.6 6.9 0 13.7 1.8 19.6 5.3l7.9 4.6c.8-.5 1.6-.9 2.4-1.4 7-14.6 11.2-30.8 11.2-48 0-61.9-50.1-112-112-112S208 82.1 208 144c0 61.9 50.1 112 112 112zm105.2 194.5c-2.3-1.2-4.6-2.6-6.8-3.9-8.2 4.8-15.3 9.8-27.5 9.8-10.9 0-21.4-4.6-28.9-12.6-18.3-19.8-32.3-43.9-40.2-69.6-10.7-34.5 24.9-49.7 25.8-50.3-.1-2.6-.1-5.2 0-7.8l-7.9-4.6c-3.8-2.2-7-5-9.8-8.1-3.3.2-6.5.6-9.8.6-24.6 0-47.6-6-68.5-16h-8.3C179.6 288 128 339.6 128 403.2V432c0 26.5 21.5 48 48 48h255.4c-3.7-6-6.2-12.8-6.2-20.3v-9.2zM173.1 274.6C161.5 263.1 145.6 256 128 256H64c-35.3 0-64 28.7-64 64v32c0 17.7 14.3 32 32 32h65.9c6.3-47.4 34.9-87.3 75.2-109.4z\"]\n};\nvar faUtensilSpoon = {\n prefix: 'fas',\n iconName: 'utensil-spoon',\n icon: [512, 512, [], \"f2e5\", \"M480.1 31.9c-55-55.1-164.9-34.5-227.8 28.5-49.3 49.3-55.1 110-28.8 160.4L9 413.2c-11.6 10.5-12.1 28.5-1 39.5L59.3 504c11 11 29.1 10.5 39.5-1.1l192.4-214.4c50.4 26.3 111.1 20.5 160.4-28.8 63-62.9 83.6-172.8 28.5-227.8z\"]\n};\nvar faUtensils = {\n prefix: 'fas',\n iconName: 'utensils',\n icon: [416, 512, [], \"f2e7\", \"M207.9 15.2c.8 4.7 16.1 94.5 16.1 128.8 0 52.3-27.8 89.6-68.9 104.6L168 486.7c.7 13.7-10.2 25.3-24 25.3H80c-13.7 0-24.7-11.5-24-25.3l12.9-238.1C27.7 233.6 0 196.2 0 144 0 109.6 15.3 19.9 16.1 15.2 19.3-5.1 61.4-5.4 64 16.3v141.2c1.3 3.4 15.1 3.2 16 0 1.4-25.3 7.9-139.2 8-141.8 3.3-20.8 44.7-20.8 47.9 0 .2 2.7 6.6 116.5 8 141.8.9 3.2 14.8 3.4 16 0V16.3c2.6-21.6 44.8-21.4 48-1.1zm119.2 285.7l-15 185.1c-1.2 14 9.9 26 23.9 26h56c13.3 0 24-10.7 24-24V24c0-13.2-10.7-24-24-24-82.5 0-221.4 178.5-64.9 300.9z\"]\n};\nvar faVectorSquare = {\n prefix: 'fas',\n iconName: 'vector-square',\n icon: [512, 512, [], \"f5cb\", \"M512 128V32c0-17.67-14.33-32-32-32h-96c-17.67 0-32 14.33-32 32H160c0-17.67-14.33-32-32-32H32C14.33 0 0 14.33 0 32v96c0 17.67 14.33 32 32 32v192c-17.67 0-32 14.33-32 32v96c0 17.67 14.33 32 32 32h96c17.67 0 32-14.33 32-32h192c0 17.67 14.33 32 32 32h96c17.67 0 32-14.33 32-32v-96c0-17.67-14.33-32-32-32V160c17.67 0 32-14.33 32-32zm-96-64h32v32h-32V64zM64 64h32v32H64V64zm32 384H64v-32h32v32zm352 0h-32v-32h32v32zm-32-96h-32c-17.67 0-32 14.33-32 32v32H160v-32c0-17.67-14.33-32-32-32H96V160h32c17.67 0 32-14.33 32-32V96h192v32c0 17.67 14.33 32 32 32h32v192z\"]\n};\nvar faVenus = {\n prefix: 'fas',\n iconName: 'venus',\n icon: [288, 512, [], \"f221\", \"M288 176c0-79.5-64.5-144-144-144S0 96.5 0 176c0 68.5 47.9 125.9 112 140.4V368H76c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h36v36c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12v-36h36c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-36v-51.6c64.1-14.5 112-71.9 112-140.4zm-224 0c0-44.1 35.9-80 80-80s80 35.9 80 80-35.9 80-80 80-80-35.9-80-80z\"]\n};\nvar faVenusDouble = {\n prefix: 'fas',\n iconName: 'venus-double',\n icon: [512, 512, [], \"f226\", \"M288 176c0-79.5-64.5-144-144-144S0 96.5 0 176c0 68.5 47.9 125.9 112 140.4V368H76c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h36v36c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12v-36h36c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-36v-51.6c64.1-14.5 112-71.9 112-140.4zm-224 0c0-44.1 35.9-80 80-80s80 35.9 80 80-35.9 80-80 80-80-35.9-80-80zm336 140.4V368h36c6.6 0 12 5.4 12 12v40c0 6.6-5.4 12-12 12h-36v36c0 6.6-5.4 12-12 12h-40c-6.6 0-12-5.4-12-12v-36h-36c-6.6 0-12-5.4-12-12v-40c0-6.6 5.4-12 12-12h36v-51.6c-21.2-4.8-40.6-14.3-57.2-27.3 14-16.7 25-36 32.1-57.1 14.5 14.8 34.7 24 57.1 24 44.1 0 80-35.9 80-80s-35.9-80-80-80c-22.3 0-42.6 9.2-57.1 24-7.1-21.1-18-40.4-32.1-57.1C303.4 43.6 334.3 32 368 32c79.5 0 144 64.5 144 144 0 68.5-47.9 125.9-112 140.4z\"]\n};\nvar faVenusMars = {\n prefix: 'fas',\n iconName: 'venus-mars',\n icon: [576, 512, [], \"f228\", \"M564 0h-79c-10.7 0-16 12.9-8.5 20.5l16.9 16.9-48.7 48.7C422.5 72.1 396.2 64 368 64c-33.7 0-64.6 11.6-89.2 30.9 14 16.7 25 36 32.1 57.1 14.5-14.8 34.7-24 57.1-24 44.1 0 80 35.9 80 80s-35.9 80-80 80c-22.3 0-42.6-9.2-57.1-24-7.1 21.1-18 40.4-32.1 57.1 24.5 19.4 55.5 30.9 89.2 30.9 79.5 0 144-64.5 144-144 0-28.2-8.1-54.5-22.1-76.7l48.7-48.7 16.9 16.9c2.4 2.4 5.4 3.5 8.4 3.5 6.2 0 12.1-4.8 12.1-12V12c0-6.6-5.4-12-12-12zM144 64C64.5 64 0 128.5 0 208c0 68.5 47.9 125.9 112 140.4V400H76c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h36v36c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12v-36h36c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-36v-51.6c64.1-14.6 112-71.9 112-140.4 0-79.5-64.5-144-144-144zm0 224c-44.1 0-80-35.9-80-80s35.9-80 80-80 80 35.9 80 80-35.9 80-80 80z\"]\n};\nvar faVial = {\n prefix: 'fas',\n iconName: 'vial',\n icon: [480, 512, [], \"f492\", \"M477.7 186.1L309.5 18.3c-3.1-3.1-8.2-3.1-11.3 0l-34 33.9c-3.1 3.1-3.1 8.2 0 11.3l11.2 11.1L33 316.5c-38.8 38.7-45.1 102-9.4 143.5 20.6 24 49.5 36 78.4 35.9 26.4 0 52.8-10 72.9-30.1l246.3-245.7 11.2 11.1c3.1 3.1 8.2 3.1 11.3 0l34-33.9c3.1-3 3.1-8.1 0-11.2zM318 256H161l148-147.7 78.5 78.3L318 256z\"]\n};\nvar faVials = {\n prefix: 'fas',\n iconName: 'vials',\n icon: [640, 512, [], \"f493\", \"M72 64h24v240c0 44.1 35.9 80 80 80s80-35.9 80-80V64h24c4.4 0 8-3.6 8-8V8c0-4.4-3.6-8-8-8H72c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8zm72 0h64v96h-64V64zm480 384H16c-8.8 0-16 7.2-16 16v32c0 8.8 7.2 16 16 16h608c8.8 0 16-7.2 16-16v-32c0-8.8-7.2-16-16-16zM360 64h24v240c0 44.1 35.9 80 80 80s80-35.9 80-80V64h24c4.4 0 8-3.6 8-8V8c0-4.4-3.6-8-8-8H360c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8zm72 0h64v96h-64V64z\"]\n};\nvar faVideo = {\n prefix: 'fas',\n iconName: 'video',\n icon: [576, 512, [], \"f03d\", \"M336.2 64H47.8C21.4 64 0 85.4 0 111.8v288.4C0 426.6 21.4 448 47.8 448h288.4c26.4 0 47.8-21.4 47.8-47.8V111.8c0-26.4-21.4-47.8-47.8-47.8zm189.4 37.7L416 177.3v157.4l109.6 75.5c21.2 14.6 50.4-.3 50.4-25.8V127.5c0-25.4-29.1-40.4-50.4-25.8z\"]\n};\nvar faVideoSlash = {\n prefix: 'fas',\n iconName: 'video-slash',\n icon: [640, 512, [], \"f4e2\", \"M633.8 458.1l-55-42.5c15.4-1.4 29.2-13.7 29.2-31.1v-257c0-25.5-29.1-40.4-50.4-25.8L448 177.3v137.2l-32-24.7v-178c0-26.4-21.4-47.8-47.8-47.8H123.9L45.5 3.4C38.5-2 28.5-.8 23 6.2L3.4 31.4c-5.4 7-4.2 17 2.8 22.4L42.7 82 416 370.6l178.5 138c7 5.4 17 4.2 22.5-2.8l19.6-25.3c5.5-6.9 4.2-17-2.8-22.4zM32 400.2c0 26.4 21.4 47.8 47.8 47.8h288.4c11.2 0 21.4-4 29.6-10.5L32 154.7v245.5z\"]\n};\nvar faVihara = {\n prefix: 'fas',\n iconName: 'vihara',\n icon: [640, 512, [], \"f6a7\", \"M632.88 400.71L544 352v-64l55.16-17.69c11.79-5.9 11.79-22.72 0-28.62L480 192v-64l27.31-16.3c7.72-7.72 5.61-20.74-4.16-25.62L320 0 136.85 86.07c-9.77 4.88-11.88 17.9-4.16 25.62L160 128v64L40.84 241.69c-11.79 5.9-11.79 22.72 0 28.62L96 288v64L7.12 400.71c-5.42 3.62-7.7 9.63-7 15.29.62 5.01 3.57 9.75 8.72 12.33L64 448v48c0 8.84 7.16 16 16 16h32c8.84 0 16-7.16 16-16v-48h160v48c0 8.84 7.16 16 16 16h32c8.84 0 16-7.16 16-16v-48h160v48c0 8.84 7.16 16 16 16h32c8.84 0 16-7.16 16-16v-48l55.15-19.67c5.16-2.58 8.1-7.32 8.72-12.33.71-5.67-1.57-11.68-6.99-15.29zM224 128h192v64H224v-64zm-64 224v-64h320v64H160z\"]\n};\nvar faVoicemail = {\n prefix: 'fas',\n iconName: 'voicemail',\n icon: [640, 512, [], \"f897\", \"M496 128a144 144 0 0 0-119.74 224H263.74A144 144 0 1 0 144 416h352a144 144 0 0 0 0-288zM64 272a80 80 0 1 1 80 80 80 80 0 0 1-80-80zm432 80a80 80 0 1 1 80-80 80 80 0 0 1-80 80z\"]\n};\nvar faVolleyballBall = {\n prefix: 'fas',\n iconName: 'volleyball-ball',\n icon: [512, 512, [], \"f45f\", \"M231.39 243.48a285.56 285.56 0 0 0-22.7-105.7c-90.8 42.4-157.5 122.4-180.3 216.8a249 249 0 0 0 56.9 81.1 333.87 333.87 0 0 1 146.1-192.2zm-36.9-134.4a284.23 284.23 0 0 0-57.4-70.7c-91 49.8-144.8 152.9-125 262.2 33.4-83.1 98.4-152 182.4-191.5zm187.6 165.1c8.6-99.8-27.3-197.5-97.5-264.4-14.7-1.7-51.6-5.5-98.9 8.5A333.87 333.87 0 0 1 279.19 241a285 285 0 0 0 102.9 33.18zm-124.7 9.5a286.33 286.33 0 0 0-80.2 72.6c82 57.3 184.5 75.1 277.5 47.8a247.15 247.15 0 0 0 42.2-89.9 336.1 336.1 0 0 1-80.9 10.4c-54.6-.1-108.9-14.1-158.6-40.9zm-98.3 99.7c-15.2 26-25.7 54.4-32.1 84.2a247.07 247.07 0 0 0 289-22.1c-112.9 16.1-203.3-24.8-256.9-62.1zm180.3-360.6c55.3 70.4 82.5 161.2 74.6 253.6a286.59 286.59 0 0 0 89.7-14.2c0-2 .3-4 .3-6 0-107.8-68.7-199.1-164.6-233.4z\"]\n};\nvar faVolumeDown = {\n prefix: 'fas',\n iconName: 'volume-down',\n icon: [384, 512, [], \"f027\", \"M215.03 72.04L126.06 161H24c-13.26 0-24 10.74-24 24v144c0 13.25 10.74 24 24 24h102.06l88.97 88.95c15.03 15.03 40.97 4.47 40.97-16.97V89.02c0-21.47-25.96-31.98-40.97-16.98zm123.2 108.08c-11.58-6.33-26.19-2.16-32.61 9.45-6.39 11.61-2.16 26.2 9.45 32.61C327.98 229.28 336 242.62 336 257c0 14.38-8.02 27.72-20.92 34.81-11.61 6.41-15.84 21-9.45 32.61 6.43 11.66 21.05 15.8 32.61 9.45 28.23-15.55 45.77-45 45.77-76.88s-17.54-61.32-45.78-76.87z\"]\n};\nvar faVolumeMute = {\n prefix: 'fas',\n iconName: 'volume-mute',\n icon: [512, 512, [], \"f6a9\", \"M215.03 71.05L126.06 160H24c-13.26 0-24 10.74-24 24v144c0 13.25 10.74 24 24 24h102.06l88.97 88.95c15.03 15.03 40.97 4.47 40.97-16.97V88.02c0-21.46-25.96-31.98-40.97-16.97zM461.64 256l45.64-45.64c6.3-6.3 6.3-16.52 0-22.82l-22.82-22.82c-6.3-6.3-16.52-6.3-22.82 0L416 210.36l-45.64-45.64c-6.3-6.3-16.52-6.3-22.82 0l-22.82 22.82c-6.3 6.3-6.3 16.52 0 22.82L370.36 256l-45.63 45.63c-6.3 6.3-6.3 16.52 0 22.82l22.82 22.82c6.3 6.3 16.52 6.3 22.82 0L416 301.64l45.64 45.64c6.3 6.3 16.52 6.3 22.82 0l22.82-22.82c6.3-6.3 6.3-16.52 0-22.82L461.64 256z\"]\n};\nvar faVolumeOff = {\n prefix: 'fas',\n iconName: 'volume-off',\n icon: [256, 512, [], \"f026\", \"M215 71l-89 89H24a24 24 0 0 0-24 24v144a24 24 0 0 0 24 24h102.06L215 441c15 15 41 4.47 41-17V88c0-21.47-26-32-41-17z\"]\n};\nvar faVolumeUp = {\n prefix: 'fas',\n iconName: 'volume-up',\n icon: [576, 512, [], \"f028\", \"M215.03 71.05L126.06 160H24c-13.26 0-24 10.74-24 24v144c0 13.25 10.74 24 24 24h102.06l88.97 88.95c15.03 15.03 40.97 4.47 40.97-16.97V88.02c0-21.46-25.96-31.98-40.97-16.97zm233.32-51.08c-11.17-7.33-26.18-4.24-33.51 6.95-7.34 11.17-4.22 26.18 6.95 33.51 66.27 43.49 105.82 116.6 105.82 195.58 0 78.98-39.55 152.09-105.82 195.58-11.17 7.32-14.29 22.34-6.95 33.5 7.04 10.71 21.93 14.56 33.51 6.95C528.27 439.58 576 351.33 576 256S528.27 72.43 448.35 19.97zM480 256c0-63.53-32.06-121.94-85.77-156.24-11.19-7.14-26.03-3.82-33.12 7.46s-3.78 26.21 7.41 33.36C408.27 165.97 432 209.11 432 256s-23.73 90.03-63.48 115.42c-11.19 7.14-14.5 22.07-7.41 33.36 6.51 10.36 21.12 15.14 33.12 7.46C447.94 377.94 480 319.54 480 256zm-141.77-76.87c-11.58-6.33-26.19-2.16-32.61 9.45-6.39 11.61-2.16 26.2 9.45 32.61C327.98 228.28 336 241.63 336 256c0 14.38-8.02 27.72-20.92 34.81-11.61 6.41-15.84 21-9.45 32.61 6.43 11.66 21.05 15.8 32.61 9.45 28.23-15.55 45.77-45 45.77-76.88s-17.54-61.32-45.78-76.86z\"]\n};\nvar faVoteYea = {\n prefix: 'fas',\n iconName: 'vote-yea',\n icon: [640, 512, [], \"f772\", \"M608 320h-64v64h22.4c5.3 0 9.6 3.6 9.6 8v16c0 4.4-4.3 8-9.6 8H73.6c-5.3 0-9.6-3.6-9.6-8v-16c0-4.4 4.3-8 9.6-8H96v-64H32c-17.7 0-32 14.3-32 32v96c0 17.7 14.3 32 32 32h576c17.7 0 32-14.3 32-32v-96c0-17.7-14.3-32-32-32zm-96 64V64.3c0-17.9-14.5-32.3-32.3-32.3H160.4C142.5 32 128 46.5 128 64.3V384h384zM211.2 202l25.5-25.3c4.2-4.2 11-4.2 15.2.1l41.3 41.6 95.2-94.4c4.2-4.2 11-4.2 15.2.1l25.3 25.5c4.2 4.2 4.2 11-.1 15.2L300.5 292c-4.2 4.2-11 4.2-15.2-.1l-74.1-74.7c-4.3-4.2-4.2-11 0-15.2z\"]\n};\nvar faVrCardboard = {\n prefix: 'fas',\n iconName: 'vr-cardboard',\n icon: [640, 512, [], \"f729\", \"M608 64H32C14.33 64 0 78.33 0 96v320c0 17.67 14.33 32 32 32h160.22c25.19 0 48.03-14.77 58.36-37.74l27.74-61.64C286.21 331.08 302.35 320 320 320s33.79 11.08 41.68 28.62l27.74 61.64C399.75 433.23 422.6 448 447.78 448H608c17.67 0 32-14.33 32-32V96c0-17.67-14.33-32-32-32zM160 304c-35.35 0-64-28.65-64-64s28.65-64 64-64 64 28.65 64 64-28.65 64-64 64zm320 0c-35.35 0-64-28.65-64-64s28.65-64 64-64 64 28.65 64 64-28.65 64-64 64z\"]\n};\nvar faWalking = {\n prefix: 'fas',\n iconName: 'walking',\n icon: [320, 512, [], \"f554\", \"M208 96c26.5 0 48-21.5 48-48S234.5 0 208 0s-48 21.5-48 48 21.5 48 48 48zm94.5 149.1l-23.3-11.8-9.7-29.4c-14.7-44.6-55.7-75.8-102.2-75.9-36-.1-55.9 10.1-93.3 25.2-21.6 8.7-39.3 25.2-49.7 46.2L17.6 213c-7.8 15.8-1.5 35 14.2 42.9 15.6 7.9 34.6 1.5 42.5-14.3L81 228c3.5-7 9.3-12.5 16.5-15.4l26.8-10.8-15.2 60.7c-5.2 20.8.4 42.9 14.9 58.8l59.9 65.4c7.2 7.9 12.3 17.4 14.9 27.7l18.3 73.3c4.3 17.1 21.7 27.6 38.8 23.3 17.1-4.3 27.6-21.7 23.3-38.8l-22.2-89c-2.6-10.3-7.7-19.9-14.9-27.7l-45.5-49.7 17.2-68.7 5.5 16.5c5.3 16.1 16.7 29.4 31.7 37l23.3 11.8c15.6 7.9 34.6 1.5 42.5-14.3 7.7-15.7 1.4-35.1-14.3-43zM73.6 385.8c-3.2 8.1-8 15.4-14.2 21.5l-50 50.1c-12.5 12.5-12.5 32.8 0 45.3s32.7 12.5 45.2 0l59.4-59.4c6.1-6.1 10.9-13.4 14.2-21.5l13.5-33.8c-55.3-60.3-38.7-41.8-47.4-53.7l-20.7 51.5z\"]\n};\nvar faWallet = {\n prefix: 'fas',\n iconName: 'wallet',\n icon: [512, 512, [], \"f555\", \"M461.2 128H80c-8.84 0-16-7.16-16-16s7.16-16 16-16h384c8.84 0 16-7.16 16-16 0-26.51-21.49-48-48-48H64C28.65 32 0 60.65 0 96v320c0 35.35 28.65 64 64 64h397.2c28.02 0 50.8-21.53 50.8-48V176c0-26.47-22.78-48-50.8-48zM416 336c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32z\"]\n};\nvar faWarehouse = {\n prefix: 'fas',\n iconName: 'warehouse',\n icon: [640, 512, [], \"f494\", \"M504 352H136.4c-4.4 0-8 3.6-8 8l-.1 48c0 4.4 3.6 8 8 8H504c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8zm0 96H136.1c-4.4 0-8 3.6-8 8l-.1 48c0 4.4 3.6 8 8 8h368c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8zm0-192H136.6c-4.4 0-8 3.6-8 8l-.1 48c0 4.4 3.6 8 8 8H504c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8zm106.5-139L338.4 3.7a48.15 48.15 0 0 0-36.9 0L29.5 117C11.7 124.5 0 141.9 0 161.3V504c0 4.4 3.6 8 8 8h80c4.4 0 8-3.6 8-8V256c0-17.6 14.6-32 32.6-32h382.8c18 0 32.6 14.4 32.6 32v248c0 4.4 3.6 8 8 8h80c4.4 0 8-3.6 8-8V161.3c0-19.4-11.7-36.8-29.5-44.3z\"]\n};\nvar faWater = {\n prefix: 'fas',\n iconName: 'water',\n icon: [576, 512, [], \"f773\", \"M562.1 383.9c-21.5-2.4-42.1-10.5-57.9-22.9-14.1-11.1-34.2-11.3-48.2 0-37.9 30.4-107.2 30.4-145.7-1.5-13.5-11.2-33-9.1-46.7 1.8-38 30.1-106.9 30-145.2-1.7-13.5-11.2-33.3-8.9-47.1 2-15.5 12.2-36 20.1-57.7 22.4-7.9.8-13.6 7.8-13.6 15.7v32.2c0 9.1 7.6 16.8 16.7 16 28.8-2.5 56.1-11.4 79.4-25.9 56.5 34.6 137 34.1 192 0 56.5 34.6 137 34.1 192 0 23.3 14.2 50.9 23.3 79.1 25.8 9.1.8 16.7-6.9 16.7-16v-31.6c.1-8-5.7-15.4-13.8-16.3zm0-144c-21.5-2.4-42.1-10.5-57.9-22.9-14.1-11.1-34.2-11.3-48.2 0-37.9 30.4-107.2 30.4-145.7-1.5-13.5-11.2-33-9.1-46.7 1.8-38 30.1-106.9 30-145.2-1.7-13.5-11.2-33.3-8.9-47.1 2-15.5 12.2-36 20.1-57.7 22.4-7.9.8-13.6 7.8-13.6 15.7v32.2c0 9.1 7.6 16.8 16.7 16 28.8-2.5 56.1-11.4 79.4-25.9 56.5 34.6 137 34.1 192 0 56.5 34.6 137 34.1 192 0 23.3 14.2 50.9 23.3 79.1 25.8 9.1.8 16.7-6.9 16.7-16v-31.6c.1-8-5.7-15.4-13.8-16.3zm0-144C540.6 93.4 520 85.4 504.2 73 490.1 61.9 470 61.7 456 73c-37.9 30.4-107.2 30.4-145.7-1.5-13.5-11.2-33-9.1-46.7 1.8-38 30.1-106.9 30-145.2-1.7-13.5-11.2-33.3-8.9-47.1 2-15.5 12.2-36 20.1-57.7 22.4-7.9.8-13.6 7.8-13.6 15.7v32.2c0 9.1 7.6 16.8 16.7 16 28.8-2.5 56.1-11.4 79.4-25.9 56.5 34.6 137 34.1 192 0 56.5 34.6 137 34.1 192 0 23.3 14.2 50.9 23.3 79.1 25.8 9.1.8 16.7-6.9 16.7-16v-31.6c.1-8-5.7-15.4-13.8-16.3z\"]\n};\nvar faWaveSquare = {\n prefix: 'fas',\n iconName: 'wave-square',\n icon: [640, 512, [], \"f83e\", \"M476 480H324a36 36 0 0 1-36-36V96h-96v156a36 36 0 0 1-36 36H16a16 16 0 0 1-16-16v-32a16 16 0 0 1 16-16h112V68a36 36 0 0 1 36-36h152a36 36 0 0 1 36 36v348h96V260a36 36 0 0 1 36-36h140a16 16 0 0 1 16 16v32a16 16 0 0 1-16 16H512v156a36 36 0 0 1-36 36z\"]\n};\nvar faWeight = {\n prefix: 'fas',\n iconName: 'weight',\n icon: [512, 512, [], \"f496\", \"M448 64h-25.98C438.44 92.28 448 125.01 448 160c0 105.87-86.13 192-192 192S64 265.87 64 160c0-34.99 9.56-67.72 25.98-96H64C28.71 64 0 92.71 0 128v320c0 35.29 28.71 64 64 64h384c35.29 0 64-28.71 64-64V128c0-35.29-28.71-64-64-64zM256 320c88.37 0 160-71.63 160-160S344.37 0 256 0 96 71.63 96 160s71.63 160 160 160zm-.3-151.94l33.58-78.36c3.5-8.17 12.94-11.92 21.03-8.41 8.12 3.48 11.88 12.89 8.41 21l-33.67 78.55C291.73 188 296 197.45 296 208c0 22.09-17.91 40-40 40s-40-17.91-40-40c0-21.98 17.76-39.77 39.7-39.94z\"]\n};\nvar faWeightHanging = {\n prefix: 'fas',\n iconName: 'weight-hanging',\n icon: [512, 512, [], \"f5cd\", \"M510.28 445.86l-73.03-292.13c-3.8-15.19-16.44-25.72-30.87-25.72h-60.25c3.57-10.05 5.88-20.72 5.88-32 0-53.02-42.98-96-96-96s-96 42.98-96 96c0 11.28 2.3 21.95 5.88 32h-60.25c-14.43 0-27.08 10.54-30.87 25.72L1.72 445.86C-6.61 479.17 16.38 512 48.03 512h415.95c31.64 0 54.63-32.83 46.3-66.14zM256 128c-17.64 0-32-14.36-32-32s14.36-32 32-32 32 14.36 32 32-14.36 32-32 32z\"]\n};\nvar faWheelchair = {\n prefix: 'fas',\n iconName: 'wheelchair',\n icon: [512, 512, [], \"f193\", \"M496.101 385.669l14.227 28.663c3.929 7.915.697 17.516-7.218 21.445l-65.465 32.886c-16.049 7.967-35.556 1.194-43.189-15.055L331.679 320H192c-15.925 0-29.426-11.71-31.679-27.475C126.433 55.308 128.38 70.044 128 64c0-36.358 30.318-65.635 67.052-63.929 33.271 1.545 60.048 28.905 60.925 62.201.868 32.933-23.152 60.423-54.608 65.039l4.67 32.69H336c8.837 0 16 7.163 16 16v32c0 8.837-7.163 16-16 16H215.182l4.572 32H352a32 32 0 0 1 28.962 18.392L438.477 396.8l36.178-18.349c7.915-3.929 17.517-.697 21.446 7.218zM311.358 352h-24.506c-7.788 54.204-54.528 96-110.852 96-61.757 0-112-50.243-112-112 0-41.505 22.694-77.809 56.324-97.156-3.712-25.965-6.844-47.86-9.488-66.333C45.956 198.464 0 261.963 0 336c0 97.047 78.953 176 176 176 71.87 0 133.806-43.308 161.11-105.192L311.358 352z\"]\n};\nvar faWifi = {\n prefix: 'fas',\n iconName: 'wifi',\n icon: [640, 512, [], \"f1eb\", \"M634.91 154.88C457.74-8.99 182.19-8.93 5.09 154.88c-6.66 6.16-6.79 16.59-.35 22.98l34.24 33.97c6.14 6.1 16.02 6.23 22.4.38 145.92-133.68 371.3-133.71 517.25 0 6.38 5.85 16.26 5.71 22.4-.38l34.24-33.97c6.43-6.39 6.3-16.82-.36-22.98zM320 352c-35.35 0-64 28.65-64 64s28.65 64 64 64 64-28.65 64-64-28.65-64-64-64zm202.67-83.59c-115.26-101.93-290.21-101.82-405.34 0-6.9 6.1-7.12 16.69-.57 23.15l34.44 33.99c6 5.92 15.66 6.32 22.05.8 83.95-72.57 209.74-72.41 293.49 0 6.39 5.52 16.05 5.13 22.05-.8l34.44-33.99c6.56-6.46 6.33-17.06-.56-23.15z\"]\n};\nvar faWind = {\n prefix: 'fas',\n iconName: 'wind',\n icon: [512, 512, [], \"f72e\", \"M156.7 256H16c-8.8 0-16 7.2-16 16v32c0 8.8 7.2 16 16 16h142.2c15.9 0 30.8 10.9 33.4 26.6 3.3 20-12.1 37.4-31.6 37.4-14.1 0-26.1-9.2-30.4-21.9-2.1-6.3-8.6-10.1-15.2-10.1H81.6c-9.8 0-17.7 8.8-15.9 18.4 8.6 44.1 47.6 77.6 94.2 77.6 57.1 0 102.7-50.1 95.2-108.6C249 291 205.4 256 156.7 256zM16 224h336c59.7 0 106.8-54.8 93.8-116.7-7.6-36.2-36.9-65.5-73.1-73.1-55.4-11.6-105.1 24.9-114.9 75.5-1.9 9.6 6.1 18.3 15.8 18.3h32.8c6.7 0 13.1-3.8 15.2-10.1C325.9 105.2 337.9 96 352 96c19.4 0 34.9 17.4 31.6 37.4-2.6 15.7-17.4 26.6-33.4 26.6H16c-8.8 0-16 7.2-16 16v32c0 8.8 7.2 16 16 16zm384 32H243.7c19.3 16.6 33.2 38.8 39.8 64H400c26.5 0 48 21.5 48 48s-21.5 48-48 48c-17.9 0-33.3-9.9-41.6-24.4-2.9-5-8.7-7.6-14.5-7.6h-33.8c-10.9 0-19 10.8-15.3 21.1 17.8 50.6 70.5 84.8 129.4 72.3 41.2-8.7 75.1-41.6 84.7-82.7C526 321.5 470.5 256 400 256z\"]\n};\nvar faWindowClose = {\n prefix: 'fas',\n iconName: 'window-close',\n icon: [512, 512, [], \"f410\", \"M464 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h416c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zm-83.6 290.5c4.8 4.8 4.8 12.6 0 17.4l-40.5 40.5c-4.8 4.8-12.6 4.8-17.4 0L256 313.3l-66.5 67.1c-4.8 4.8-12.6 4.8-17.4 0l-40.5-40.5c-4.8-4.8-4.8-12.6 0-17.4l67.1-66.5-67.1-66.5c-4.8-4.8-4.8-12.6 0-17.4l40.5-40.5c4.8-4.8 12.6-4.8 17.4 0l66.5 67.1 66.5-67.1c4.8-4.8 12.6-4.8 17.4 0l40.5 40.5c4.8 4.8 4.8 12.6 0 17.4L313.3 256l67.1 66.5z\"]\n};\nvar faWindowMaximize = {\n prefix: 'fas',\n iconName: 'window-maximize',\n icon: [512, 512, [], \"f2d0\", \"M464 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h416c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zm-16 160H64v-84c0-6.6 5.4-12 12-12h360c6.6 0 12 5.4 12 12v84z\"]\n};\nvar faWindowMinimize = {\n prefix: 'fas',\n iconName: 'window-minimize',\n icon: [512, 512, [], \"f2d1\", \"M464 352H48c-26.5 0-48 21.5-48 48v32c0 26.5 21.5 48 48 48h416c26.5 0 48-21.5 48-48v-32c0-26.5-21.5-48-48-48z\"]\n};\nvar faWindowRestore = {\n prefix: 'fas',\n iconName: 'window-restore',\n icon: [512, 512, [], \"f2d2\", \"M512 48v288c0 26.5-21.5 48-48 48h-48V176c0-44.1-35.9-80-80-80H128V48c0-26.5 21.5-48 48-48h288c26.5 0 48 21.5 48 48zM384 176v288c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V176c0-26.5 21.5-48 48-48h288c26.5 0 48 21.5 48 48zm-68 28c0-6.6-5.4-12-12-12H76c-6.6 0-12 5.4-12 12v52h252v-52z\"]\n};\nvar faWineBottle = {\n prefix: 'fas',\n iconName: 'wine-bottle',\n icon: [512, 512, [], \"f72f\", \"M507.31 72.57L439.43 4.69c-6.25-6.25-16.38-6.25-22.63 0l-22.63 22.63c-6.25 6.25-6.25 16.38 0 22.63l-76.67 76.67c-46.58-19.7-102.4-10.73-140.37 27.23L18.75 312.23c-24.99 24.99-24.99 65.52 0 90.51l90.51 90.51c24.99 24.99 65.52 24.99 90.51 0l158.39-158.39c37.96-37.96 46.93-93.79 27.23-140.37l76.67-76.67c6.25 6.25 16.38 6.25 22.63 0l22.63-22.63c6.24-6.24 6.24-16.37-.01-22.62zM179.22 423.29l-90.51-90.51 122.04-122.04 90.51 90.51-122.04 122.04z\"]\n};\nvar faWineGlass = {\n prefix: 'fas',\n iconName: 'wine-glass',\n icon: [288, 512, [], \"f4e3\", \"M216 464h-40V346.81c68.47-15.89 118.05-79.91 111.4-154.16l-15.95-178.1C270.71 6.31 263.9 0 255.74 0H32.26c-8.15 0-14.97 6.31-15.7 14.55L.6 192.66C-6.05 266.91 43.53 330.93 112 346.82V464H72c-22.09 0-40 17.91-40 40 0 4.42 3.58 8 8 8h208c4.42 0 8-3.58 8-8 0-22.09-17.91-40-40-40z\"]\n};\nvar faWineGlassAlt = {\n prefix: 'fas',\n iconName: 'wine-glass-alt',\n icon: [288, 512, [], \"f5ce\", \"M216 464h-40V346.81c68.47-15.89 118.05-79.91 111.4-154.16l-15.95-178.1C270.71 6.31 263.9 0 255.74 0H32.26c-8.15 0-14.97 6.31-15.7 14.55L.6 192.66C-6.05 266.91 43.53 330.93 112 346.82V464H72c-22.09 0-40 17.91-40 40 0 4.42 3.58 8 8 8h208c4.42 0 8-3.58 8-8 0-22.09-17.91-40-40-40zM61.75 48h164.5l7.17 80H54.58l7.17-80z\"]\n};\nvar faWonSign = {\n prefix: 'fas',\n iconName: 'won-sign',\n icon: [576, 512, [], \"f159\", \"M564 192c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-48l18.6-80.6c1.7-7.5-4-14.7-11.7-14.7h-46.1c-5.7 0-10.6 4-11.7 9.5L450.7 128H340.8l-19.7-86c-1.3-5.5-6.1-9.3-11.7-9.3h-44c-5.6 0-10.4 3.8-11.7 9.3l-20 86H125l-17.5-85.7c-1.1-5.6-6.1-9.6-11.8-9.6H53.6c-7.7 0-13.4 7.1-11.7 14.6L60 128H12c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h62.3l7.2 32H12c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h83.9l40.9 182.6c1.2 5.5 6.1 9.4 11.7 9.4h56.8c5.6 0 10.4-3.9 11.7-9.3L259.3 288h55.1l42.4 182.7c1.3 5.4 6.1 9.3 11.7 9.3h56.8c5.6 0 10.4-3.9 11.7-9.3L479.1 288H564c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-70.1l7.4-32zM183.8 342c-6.2 25.8-6.8 47.2-7.3 47.2h-1.1s-1.7-22-6.8-47.2l-11-54h38.8zm27.5-118h-66.8l-6.5-32h80.8zm62.9 0l2-8.6c1.9-8 3.5-16 4.8-23.4h11.8c1.3 7.4 2.9 15.4 4.8 23.4l2 8.6zm130.9 118c-5.1 25.2-6.8 47.2-6.8 47.2h-1.1c-.6 0-1.1-21.4-7.3-47.2l-12.4-54h39.1zm25.2-118h-67.4l-7.3-32h81.6z\"]\n};\nvar faWrench = {\n prefix: 'fas',\n iconName: 'wrench',\n icon: [512, 512, [], \"f0ad\", \"M507.73 109.1c-2.24-9.03-13.54-12.09-20.12-5.51l-74.36 74.36-67.88-11.31-11.31-67.88 74.36-74.36c6.62-6.62 3.43-17.9-5.66-20.16-47.38-11.74-99.55.91-136.58 37.93-39.64 39.64-50.55 97.1-34.05 147.2L18.74 402.76c-24.99 24.99-24.99 65.51 0 90.5 24.99 24.99 65.51 24.99 90.5 0l213.21-213.21c50.12 16.71 107.47 5.68 147.37-34.22 37.07-37.07 49.7-89.32 37.91-136.73zM64 472c-13.25 0-24-10.75-24-24 0-13.26 10.75-24 24-24s24 10.74 24 24c0 13.25-10.75 24-24 24z\"]\n};\nvar faXRay = {\n prefix: 'fas',\n iconName: 'x-ray',\n icon: [640, 512, [], \"f497\", \"M240 384c-8.8 0-16 7.2-16 16s7.2 16 16 16 16-7.2 16-16-7.2-16-16-16zm160 32c8.8 0 16-7.2 16-16s-7.2-16-16-16-16 7.2-16 16 7.2 16 16 16zM624 0H16C7.2 0 0 7.2 0 16v32c0 8.8 7.2 16 16 16h608c8.8 0 16-7.2 16-16V16c0-8.8-7.2-16-16-16zm0 448h-48V96H64v352H16c-8.8 0-16 7.2-16 16v32c0 8.8 7.2 16 16 16h608c8.8 0 16-7.2 16-16v-32c0-8.8-7.2-16-16-16zM480 248c0 4.4-3.6 8-8 8H336v32h104c4.4 0 8 3.6 8 8v16c0 4.4-3.6 8-8 8H336v32h64c26.5 0 48 21.5 48 48s-21.5 48-48 48-48-21.5-48-48v-16h-64v16c0 26.5-21.5 48-48 48s-48-21.5-48-48 21.5-48 48-48h64v-32H200c-4.4 0-8-3.6-8-8v-16c0-4.4 3.6-8 8-8h104v-32H168c-4.4 0-8-3.6-8-8v-16c0-4.4 3.6-8 8-8h136v-32H200c-4.4 0-8-3.6-8-8v-16c0-4.4 3.6-8 8-8h104v-24c0-4.4 3.6-8 8-8h16c4.4 0 8 3.6 8 8v24h104c4.4 0 8 3.6 8 8v16c0 4.4-3.6 8-8 8H336v32h136c4.4 0 8 3.6 8 8v16z\"]\n};\nvar faYenSign = {\n prefix: 'fas',\n iconName: 'yen-sign',\n icon: [384, 512, [], \"f157\", \"M351.2 32h-65.3c-4.6 0-8.8 2.6-10.8 6.7l-55.4 113.2c-14.5 34.7-27.1 71.9-27.1 71.9h-1.3s-12.6-37.2-27.1-71.9L108.8 38.7c-2-4.1-6.2-6.7-10.8-6.7H32.8c-9.1 0-14.8 9.7-10.6 17.6L102.3 200H44c-6.6 0-12 5.4-12 12v32c0 6.6 5.4 12 12 12h88.2l19.8 37.2V320H44c-6.6 0-12 5.4-12 12v32c0 6.6 5.4 12 12 12h108v92c0 6.6 5.4 12 12 12h56c6.6 0 12-5.4 12-12v-92h108c6.6 0 12-5.4 12-12v-32c0-6.6-5.4-12-12-12H232v-26.8l19.8-37.2H340c6.6 0 12-5.4 12-12v-32c0-6.6-5.4-12-12-12h-58.3l80.1-150.4c4.3-7.9-1.5-17.6-10.6-17.6z\"]\n};\nvar faYinYang = {\n prefix: 'fas',\n iconName: 'yin-yang',\n icon: [496, 512, [], \"f6ad\", \"M248 8C111.03 8 0 119.03 0 256s111.03 248 248 248 248-111.03 248-248S384.97 8 248 8zm0 376c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm0-128c-53.02 0-96 42.98-96 96s42.98 96 96 96c-106.04 0-192-85.96-192-192S141.96 64 248 64c53.02 0 96 42.98 96 96s-42.98 96-96 96zm0-128c-17.67 0-32 14.33-32 32s14.33 32 32 32 32-14.33 32-32-14.33-32-32-32z\"]\n};\nvar _iconsCache = {\n faAd: faAd,\n faAddressBook: faAddressBook,\n faAddressCard: faAddressCard,\n faAdjust: faAdjust,\n faAirFreshener: faAirFreshener,\n faAlignCenter: faAlignCenter,\n faAlignJustify: faAlignJustify,\n faAlignLeft: faAlignLeft,\n faAlignRight: faAlignRight,\n faAllergies: faAllergies,\n faAmbulance: faAmbulance,\n faAmericanSignLanguageInterpreting: faAmericanSignLanguageInterpreting,\n faAnchor: faAnchor,\n faAngleDoubleDown: faAngleDoubleDown,\n faAngleDoubleLeft: faAngleDoubleLeft,\n faAngleDoubleRight: faAngleDoubleRight,\n faAngleDoubleUp: faAngleDoubleUp,\n faAngleDown: faAngleDown,\n faAngleLeft: faAngleLeft,\n faAngleRight: faAngleRight,\n faAngleUp: faAngleUp,\n faAngry: faAngry,\n faAnkh: faAnkh,\n faAppleAlt: faAppleAlt,\n faArchive: faArchive,\n faArchway: faArchway,\n faArrowAltCircleDown: faArrowAltCircleDown,\n faArrowAltCircleLeft: faArrowAltCircleLeft,\n faArrowAltCircleRight: faArrowAltCircleRight,\n faArrowAltCircleUp: faArrowAltCircleUp,\n faArrowCircleDown: faArrowCircleDown,\n faArrowCircleLeft: faArrowCircleLeft,\n faArrowCircleRight: faArrowCircleRight,\n faArrowCircleUp: faArrowCircleUp,\n faArrowDown: faArrowDown,\n faArrowLeft: faArrowLeft,\n faArrowRight: faArrowRight,\n faArrowUp: faArrowUp,\n faArrowsAlt: faArrowsAlt,\n faArrowsAltH: faArrowsAltH,\n faArrowsAltV: faArrowsAltV,\n faAssistiveListeningSystems: faAssistiveListeningSystems,\n faAsterisk: faAsterisk,\n faAt: faAt,\n faAtlas: faAtlas,\n faAtom: faAtom,\n faAudioDescription: faAudioDescription,\n faAward: faAward,\n faBaby: faBaby,\n faBabyCarriage: faBabyCarriage,\n faBackspace: faBackspace,\n faBackward: faBackward,\n faBacon: faBacon,\n faBalanceScale: faBalanceScale,\n faBalanceScaleLeft: faBalanceScaleLeft,\n faBalanceScaleRight: faBalanceScaleRight,\n faBan: faBan,\n faBandAid: faBandAid,\n faBarcode: faBarcode,\n faBars: faBars,\n faBaseballBall: faBaseballBall,\n faBasketballBall: faBasketballBall,\n faBath: faBath,\n faBatteryEmpty: faBatteryEmpty,\n faBatteryFull: faBatteryFull,\n faBatteryHalf: faBatteryHalf,\n faBatteryQuarter: faBatteryQuarter,\n faBatteryThreeQuarters: faBatteryThreeQuarters,\n faBed: faBed,\n faBeer: faBeer,\n faBell: faBell,\n faBellSlash: faBellSlash,\n faBezierCurve: faBezierCurve,\n faBible: faBible,\n faBicycle: faBicycle,\n faBiking: faBiking,\n faBinoculars: faBinoculars,\n faBiohazard: faBiohazard,\n faBirthdayCake: faBirthdayCake,\n faBlender: faBlender,\n faBlenderPhone: faBlenderPhone,\n faBlind: faBlind,\n faBlog: faBlog,\n faBold: faBold,\n faBolt: faBolt,\n faBomb: faBomb,\n faBone: faBone,\n faBong: faBong,\n faBook: faBook,\n faBookDead: faBookDead,\n faBookMedical: faBookMedical,\n faBookOpen: faBookOpen,\n faBookReader: faBookReader,\n faBookmark: faBookmark,\n faBorderAll: faBorderAll,\n faBorderNone: faBorderNone,\n faBorderStyle: faBorderStyle,\n faBowlingBall: faBowlingBall,\n faBox: faBox,\n faBoxOpen: faBoxOpen,\n faBoxes: faBoxes,\n faBraille: faBraille,\n faBrain: faBrain,\n faBreadSlice: faBreadSlice,\n faBriefcase: faBriefcase,\n faBriefcaseMedical: faBriefcaseMedical,\n faBroadcastTower: faBroadcastTower,\n faBroom: faBroom,\n faBrush: faBrush,\n faBug: faBug,\n faBuilding: faBuilding,\n faBullhorn: faBullhorn,\n faBullseye: faBullseye,\n faBurn: faBurn,\n faBus: faBus,\n faBusAlt: faBusAlt,\n faBusinessTime: faBusinessTime,\n faCalculator: faCalculator,\n faCalendar: faCalendar,\n faCalendarAlt: faCalendarAlt,\n faCalendarCheck: faCalendarCheck,\n faCalendarDay: faCalendarDay,\n faCalendarMinus: faCalendarMinus,\n faCalendarPlus: faCalendarPlus,\n faCalendarTimes: faCalendarTimes,\n faCalendarWeek: faCalendarWeek,\n faCamera: faCamera,\n faCameraRetro: faCameraRetro,\n faCampground: faCampground,\n faCandyCane: faCandyCane,\n faCannabis: faCannabis,\n faCapsules: faCapsules,\n faCar: faCar,\n faCarAlt: faCarAlt,\n faCarBattery: faCarBattery,\n faCarCrash: faCarCrash,\n faCarSide: faCarSide,\n faCaretDown: faCaretDown,\n faCaretLeft: faCaretLeft,\n faCaretRight: faCaretRight,\n faCaretSquareDown: faCaretSquareDown,\n faCaretSquareLeft: faCaretSquareLeft,\n faCaretSquareRight: faCaretSquareRight,\n faCaretSquareUp: faCaretSquareUp,\n faCaretUp: faCaretUp,\n faCarrot: faCarrot,\n faCartArrowDown: faCartArrowDown,\n faCartPlus: faCartPlus,\n faCashRegister: faCashRegister,\n faCat: faCat,\n faCertificate: faCertificate,\n faChair: faChair,\n faChalkboard: faChalkboard,\n faChalkboardTeacher: faChalkboardTeacher,\n faChargingStation: faChargingStation,\n faChartArea: faChartArea,\n faChartBar: faChartBar,\n faChartLine: faChartLine,\n faChartPie: faChartPie,\n faCheck: faCheck,\n faCheckCircle: faCheckCircle,\n faCheckDouble: faCheckDouble,\n faCheckSquare: faCheckSquare,\n faCheese: faCheese,\n faChess: faChess,\n faChessBishop: faChessBishop,\n faChessBoard: faChessBoard,\n faChessKing: faChessKing,\n faChessKnight: faChessKnight,\n faChessPawn: faChessPawn,\n faChessQueen: faChessQueen,\n faChessRook: faChessRook,\n faChevronCircleDown: faChevronCircleDown,\n faChevronCircleLeft: faChevronCircleLeft,\n faChevronCircleRight: faChevronCircleRight,\n faChevronCircleUp: faChevronCircleUp,\n faChevronDown: faChevronDown,\n faChevronLeft: faChevronLeft,\n faChevronRight: faChevronRight,\n faChevronUp: faChevronUp,\n faChild: faChild,\n faChurch: faChurch,\n faCircle: faCircle,\n faCircleNotch: faCircleNotch,\n faCity: faCity,\n faClinicMedical: faClinicMedical,\n faClipboard: faClipboard,\n faClipboardCheck: faClipboardCheck,\n faClipboardList: faClipboardList,\n faClock: faClock,\n faClone: faClone,\n faClosedCaptioning: faClosedCaptioning,\n faCloud: faCloud,\n faCloudDownloadAlt: faCloudDownloadAlt,\n faCloudMeatball: faCloudMeatball,\n faCloudMoon: faCloudMoon,\n faCloudMoonRain: faCloudMoonRain,\n faCloudRain: faCloudRain,\n faCloudShowersHeavy: faCloudShowersHeavy,\n faCloudSun: faCloudSun,\n faCloudSunRain: faCloudSunRain,\n faCloudUploadAlt: faCloudUploadAlt,\n faCocktail: faCocktail,\n faCode: faCode,\n faCodeBranch: faCodeBranch,\n faCoffee: faCoffee,\n faCog: faCog,\n faCogs: faCogs,\n faCoins: faCoins,\n faColumns: faColumns,\n faComment: faComment,\n faCommentAlt: faCommentAlt,\n faCommentDollar: faCommentDollar,\n faCommentDots: faCommentDots,\n faCommentMedical: faCommentMedical,\n faCommentSlash: faCommentSlash,\n faComments: faComments,\n faCommentsDollar: faCommentsDollar,\n faCompactDisc: faCompactDisc,\n faCompass: faCompass,\n faCompress: faCompress,\n faCompressArrowsAlt: faCompressArrowsAlt,\n faConciergeBell: faConciergeBell,\n faCookie: faCookie,\n faCookieBite: faCookieBite,\n faCopy: faCopy,\n faCopyright: faCopyright,\n faCouch: faCouch,\n faCreditCard: faCreditCard,\n faCrop: faCrop,\n faCropAlt: faCropAlt,\n faCross: faCross,\n faCrosshairs: faCrosshairs,\n faCrow: faCrow,\n faCrown: faCrown,\n faCrutch: faCrutch,\n faCube: faCube,\n faCubes: faCubes,\n faCut: faCut,\n faDatabase: faDatabase,\n faDeaf: faDeaf,\n faDemocrat: faDemocrat,\n faDesktop: faDesktop,\n faDharmachakra: faDharmachakra,\n faDiagnoses: faDiagnoses,\n faDice: faDice,\n faDiceD20: faDiceD20,\n faDiceD6: faDiceD6,\n faDiceFive: faDiceFive,\n faDiceFour: faDiceFour,\n faDiceOne: faDiceOne,\n faDiceSix: faDiceSix,\n faDiceThree: faDiceThree,\n faDiceTwo: faDiceTwo,\n faDigitalTachograph: faDigitalTachograph,\n faDirections: faDirections,\n faDivide: faDivide,\n faDizzy: faDizzy,\n faDna: faDna,\n faDog: faDog,\n faDollarSign: faDollarSign,\n faDolly: faDolly,\n faDollyFlatbed: faDollyFlatbed,\n faDonate: faDonate,\n faDoorClosed: faDoorClosed,\n faDoorOpen: faDoorOpen,\n faDotCircle: faDotCircle,\n faDove: faDove,\n faDownload: faDownload,\n faDraftingCompass: faDraftingCompass,\n faDragon: faDragon,\n faDrawPolygon: faDrawPolygon,\n faDrum: faDrum,\n faDrumSteelpan: faDrumSteelpan,\n faDrumstickBite: faDrumstickBite,\n faDumbbell: faDumbbell,\n faDumpster: faDumpster,\n faDumpsterFire: faDumpsterFire,\n faDungeon: faDungeon,\n faEdit: faEdit,\n faEgg: faEgg,\n faEject: faEject,\n faEllipsisH: faEllipsisH,\n faEllipsisV: faEllipsisV,\n faEnvelope: faEnvelope,\n faEnvelopeOpen: faEnvelopeOpen,\n faEnvelopeOpenText: faEnvelopeOpenText,\n faEnvelopeSquare: faEnvelopeSquare,\n faEquals: faEquals,\n faEraser: faEraser,\n faEthernet: faEthernet,\n faEuroSign: faEuroSign,\n faExchangeAlt: faExchangeAlt,\n faExclamation: faExclamation,\n faExclamationCircle: faExclamationCircle,\n faExclamationTriangle: faExclamationTriangle,\n faExpand: faExpand,\n faExpandArrowsAlt: faExpandArrowsAlt,\n faExternalLinkAlt: faExternalLinkAlt,\n faExternalLinkSquareAlt: faExternalLinkSquareAlt,\n faEye: faEye,\n faEyeDropper: faEyeDropper,\n faEyeSlash: faEyeSlash,\n faFan: faFan,\n faFastBackward: faFastBackward,\n faFastForward: faFastForward,\n faFax: faFax,\n faFeather: faFeather,\n faFeatherAlt: faFeatherAlt,\n faFemale: faFemale,\n faFighterJet: faFighterJet,\n faFile: faFile,\n faFileAlt: faFileAlt,\n faFileArchive: faFileArchive,\n faFileAudio: faFileAudio,\n faFileCode: faFileCode,\n faFileContract: faFileContract,\n faFileCsv: faFileCsv,\n faFileDownload: faFileDownload,\n faFileExcel: faFileExcel,\n faFileExport: faFileExport,\n faFileImage: faFileImage,\n faFileImport: faFileImport,\n faFileInvoice: faFileInvoice,\n faFileInvoiceDollar: faFileInvoiceDollar,\n faFileMedical: faFileMedical,\n faFileMedicalAlt: faFileMedicalAlt,\n faFilePdf: faFilePdf,\n faFilePowerpoint: faFilePowerpoint,\n faFilePrescription: faFilePrescription,\n faFileSignature: faFileSignature,\n faFileUpload: faFileUpload,\n faFileVideo: faFileVideo,\n faFileWord: faFileWord,\n faFill: faFill,\n faFillDrip: faFillDrip,\n faFilm: faFilm,\n faFilter: faFilter,\n faFingerprint: faFingerprint,\n faFire: faFire,\n faFireAlt: faFireAlt,\n faFireExtinguisher: faFireExtinguisher,\n faFirstAid: faFirstAid,\n faFish: faFish,\n faFistRaised: faFistRaised,\n faFlag: faFlag,\n faFlagCheckered: faFlagCheckered,\n faFlagUsa: faFlagUsa,\n faFlask: faFlask,\n faFlushed: faFlushed,\n faFolder: faFolder,\n faFolderMinus: faFolderMinus,\n faFolderOpen: faFolderOpen,\n faFolderPlus: faFolderPlus,\n faFont: faFont,\n faFontAwesomeLogoFull: faFontAwesomeLogoFull,\n faFootballBall: faFootballBall,\n faForward: faForward,\n faFrog: faFrog,\n faFrown: faFrown,\n faFrownOpen: faFrownOpen,\n faFunnelDollar: faFunnelDollar,\n faFutbol: faFutbol,\n faGamepad: faGamepad,\n faGasPump: faGasPump,\n faGavel: faGavel,\n faGem: faGem,\n faGenderless: faGenderless,\n faGhost: faGhost,\n faGift: faGift,\n faGifts: faGifts,\n faGlassCheers: faGlassCheers,\n faGlassMartini: faGlassMartini,\n faGlassMartiniAlt: faGlassMartiniAlt,\n faGlassWhiskey: faGlassWhiskey,\n faGlasses: faGlasses,\n faGlobe: faGlobe,\n faGlobeAfrica: faGlobeAfrica,\n faGlobeAmericas: faGlobeAmericas,\n faGlobeAsia: faGlobeAsia,\n faGlobeEurope: faGlobeEurope,\n faGolfBall: faGolfBall,\n faGopuram: faGopuram,\n faGraduationCap: faGraduationCap,\n faGreaterThan: faGreaterThan,\n faGreaterThanEqual: faGreaterThanEqual,\n faGrimace: faGrimace,\n faGrin: faGrin,\n faGrinAlt: faGrinAlt,\n faGrinBeam: faGrinBeam,\n faGrinBeamSweat: faGrinBeamSweat,\n faGrinHearts: faGrinHearts,\n faGrinSquint: faGrinSquint,\n faGrinSquintTears: faGrinSquintTears,\n faGrinStars: faGrinStars,\n faGrinTears: faGrinTears,\n faGrinTongue: faGrinTongue,\n faGrinTongueSquint: faGrinTongueSquint,\n faGrinTongueWink: faGrinTongueWink,\n faGrinWink: faGrinWink,\n faGripHorizontal: faGripHorizontal,\n faGripLines: faGripLines,\n faGripLinesVertical: faGripLinesVertical,\n faGripVertical: faGripVertical,\n faGuitar: faGuitar,\n faHSquare: faHSquare,\n faHamburger: faHamburger,\n faHammer: faHammer,\n faHamsa: faHamsa,\n faHandHolding: faHandHolding,\n faHandHoldingHeart: faHandHoldingHeart,\n faHandHoldingUsd: faHandHoldingUsd,\n faHandLizard: faHandLizard,\n faHandMiddleFinger: faHandMiddleFinger,\n faHandPaper: faHandPaper,\n faHandPeace: faHandPeace,\n faHandPointDown: faHandPointDown,\n faHandPointLeft: faHandPointLeft,\n faHandPointRight: faHandPointRight,\n faHandPointUp: faHandPointUp,\n faHandPointer: faHandPointer,\n faHandRock: faHandRock,\n faHandScissors: faHandScissors,\n faHandSpock: faHandSpock,\n faHands: faHands,\n faHandsHelping: faHandsHelping,\n faHandshake: faHandshake,\n faHanukiah: faHanukiah,\n faHardHat: faHardHat,\n faHashtag: faHashtag,\n faHatWizard: faHatWizard,\n faHaykal: faHaykal,\n faHdd: faHdd,\n faHeading: faHeading,\n faHeadphones: faHeadphones,\n faHeadphonesAlt: faHeadphonesAlt,\n faHeadset: faHeadset,\n faHeart: faHeart,\n faHeartBroken: faHeartBroken,\n faHeartbeat: faHeartbeat,\n faHelicopter: faHelicopter,\n faHighlighter: faHighlighter,\n faHiking: faHiking,\n faHippo: faHippo,\n faHistory: faHistory,\n faHockeyPuck: faHockeyPuck,\n faHollyBerry: faHollyBerry,\n faHome: faHome,\n faHorse: faHorse,\n faHorseHead: faHorseHead,\n faHospital: faHospital,\n faHospitalAlt: faHospitalAlt,\n faHospitalSymbol: faHospitalSymbol,\n faHotTub: faHotTub,\n faHotdog: faHotdog,\n faHotel: faHotel,\n faHourglass: faHourglass,\n faHourglassEnd: faHourglassEnd,\n faHourglassHalf: faHourglassHalf,\n faHourglassStart: faHourglassStart,\n faHouseDamage: faHouseDamage,\n faHryvnia: faHryvnia,\n faICursor: faICursor,\n faIceCream: faIceCream,\n faIcicles: faIcicles,\n faIcons: faIcons,\n faIdBadge: faIdBadge,\n faIdCard: faIdCard,\n faIdCardAlt: faIdCardAlt,\n faIgloo: faIgloo,\n faImage: faImage,\n faImages: faImages,\n faInbox: faInbox,\n faIndent: faIndent,\n faIndustry: faIndustry,\n faInfinity: faInfinity,\n faInfo: faInfo,\n faInfoCircle: faInfoCircle,\n faItalic: faItalic,\n faJedi: faJedi,\n faJoint: faJoint,\n faJournalWhills: faJournalWhills,\n faKaaba: faKaaba,\n faKey: faKey,\n faKeyboard: faKeyboard,\n faKhanda: faKhanda,\n faKiss: faKiss,\n faKissBeam: faKissBeam,\n faKissWinkHeart: faKissWinkHeart,\n faKiwiBird: faKiwiBird,\n faLandmark: faLandmark,\n faLanguage: faLanguage,\n faLaptop: faLaptop,\n faLaptopCode: faLaptopCode,\n faLaptopMedical: faLaptopMedical,\n faLaugh: faLaugh,\n faLaughBeam: faLaughBeam,\n faLaughSquint: faLaughSquint,\n faLaughWink: faLaughWink,\n faLayerGroup: faLayerGroup,\n faLeaf: faLeaf,\n faLemon: faLemon,\n faLessThan: faLessThan,\n faLessThanEqual: faLessThanEqual,\n faLevelDownAlt: faLevelDownAlt,\n faLevelUpAlt: faLevelUpAlt,\n faLifeRing: faLifeRing,\n faLightbulb: faLightbulb,\n faLink: faLink,\n faLiraSign: faLiraSign,\n faList: faList,\n faListAlt: faListAlt,\n faListOl: faListOl,\n faListUl: faListUl,\n faLocationArrow: faLocationArrow,\n faLock: faLock,\n faLockOpen: faLockOpen,\n faLongArrowAltDown: faLongArrowAltDown,\n faLongArrowAltLeft: faLongArrowAltLeft,\n faLongArrowAltRight: faLongArrowAltRight,\n faLongArrowAltUp: faLongArrowAltUp,\n faLowVision: faLowVision,\n faLuggageCart: faLuggageCart,\n faMagic: faMagic,\n faMagnet: faMagnet,\n faMailBulk: faMailBulk,\n faMale: faMale,\n faMap: faMap,\n faMapMarked: faMapMarked,\n faMapMarkedAlt: faMapMarkedAlt,\n faMapMarker: faMapMarker,\n faMapMarkerAlt: faMapMarkerAlt,\n faMapPin: faMapPin,\n faMapSigns: faMapSigns,\n faMarker: faMarker,\n faMars: faMars,\n faMarsDouble: faMarsDouble,\n faMarsStroke: faMarsStroke,\n faMarsStrokeH: faMarsStrokeH,\n faMarsStrokeV: faMarsStrokeV,\n faMask: faMask,\n faMedal: faMedal,\n faMedkit: faMedkit,\n faMeh: faMeh,\n faMehBlank: faMehBlank,\n faMehRollingEyes: faMehRollingEyes,\n faMemory: faMemory,\n faMenorah: faMenorah,\n faMercury: faMercury,\n faMeteor: faMeteor,\n faMicrochip: faMicrochip,\n faMicrophone: faMicrophone,\n faMicrophoneAlt: faMicrophoneAlt,\n faMicrophoneAltSlash: faMicrophoneAltSlash,\n faMicrophoneSlash: faMicrophoneSlash,\n faMicroscope: faMicroscope,\n faMinus: faMinus,\n faMinusCircle: faMinusCircle,\n faMinusSquare: faMinusSquare,\n faMitten: faMitten,\n faMobile: faMobile,\n faMobileAlt: faMobileAlt,\n faMoneyBill: faMoneyBill,\n faMoneyBillAlt: faMoneyBillAlt,\n faMoneyBillWave: faMoneyBillWave,\n faMoneyBillWaveAlt: faMoneyBillWaveAlt,\n faMoneyCheck: faMoneyCheck,\n faMoneyCheckAlt: faMoneyCheckAlt,\n faMonument: faMonument,\n faMoon: faMoon,\n faMortarPestle: faMortarPestle,\n faMosque: faMosque,\n faMotorcycle: faMotorcycle,\n faMountain: faMountain,\n faMousePointer: faMousePointer,\n faMugHot: faMugHot,\n faMusic: faMusic,\n faNetworkWired: faNetworkWired,\n faNeuter: faNeuter,\n faNewspaper: faNewspaper,\n faNotEqual: faNotEqual,\n faNotesMedical: faNotesMedical,\n faObjectGroup: faObjectGroup,\n faObjectUngroup: faObjectUngroup,\n faOilCan: faOilCan,\n faOm: faOm,\n faOtter: faOtter,\n faOutdent: faOutdent,\n faPager: faPager,\n faPaintBrush: faPaintBrush,\n faPaintRoller: faPaintRoller,\n faPalette: faPalette,\n faPallet: faPallet,\n faPaperPlane: faPaperPlane,\n faPaperclip: faPaperclip,\n faParachuteBox: faParachuteBox,\n faParagraph: faParagraph,\n faParking: faParking,\n faPassport: faPassport,\n faPastafarianism: faPastafarianism,\n faPaste: faPaste,\n faPause: faPause,\n faPauseCircle: faPauseCircle,\n faPaw: faPaw,\n faPeace: faPeace,\n faPen: faPen,\n faPenAlt: faPenAlt,\n faPenFancy: faPenFancy,\n faPenNib: faPenNib,\n faPenSquare: faPenSquare,\n faPencilAlt: faPencilAlt,\n faPencilRuler: faPencilRuler,\n faPeopleCarry: faPeopleCarry,\n faPepperHot: faPepperHot,\n faPercent: faPercent,\n faPercentage: faPercentage,\n faPersonBooth: faPersonBooth,\n faPhone: faPhone,\n faPhoneAlt: faPhoneAlt,\n faPhoneSlash: faPhoneSlash,\n faPhoneSquare: faPhoneSquare,\n faPhoneSquareAlt: faPhoneSquareAlt,\n faPhoneVolume: faPhoneVolume,\n faPhotoVideo: faPhotoVideo,\n faPiggyBank: faPiggyBank,\n faPills: faPills,\n faPizzaSlice: faPizzaSlice,\n faPlaceOfWorship: faPlaceOfWorship,\n faPlane: faPlane,\n faPlaneArrival: faPlaneArrival,\n faPlaneDeparture: faPlaneDeparture,\n faPlay: faPlay,\n faPlayCircle: faPlayCircle,\n faPlug: faPlug,\n faPlus: faPlus,\n faPlusCircle: faPlusCircle,\n faPlusSquare: faPlusSquare,\n faPodcast: faPodcast,\n faPoll: faPoll,\n faPollH: faPollH,\n faPoo: faPoo,\n faPooStorm: faPooStorm,\n faPoop: faPoop,\n faPortrait: faPortrait,\n faPoundSign: faPoundSign,\n faPowerOff: faPowerOff,\n faPray: faPray,\n faPrayingHands: faPrayingHands,\n faPrescription: faPrescription,\n faPrescriptionBottle: faPrescriptionBottle,\n faPrescriptionBottleAlt: faPrescriptionBottleAlt,\n faPrint: faPrint,\n faProcedures: faProcedures,\n faProjectDiagram: faProjectDiagram,\n faPuzzlePiece: faPuzzlePiece,\n faQrcode: faQrcode,\n faQuestion: faQuestion,\n faQuestionCircle: faQuestionCircle,\n faQuidditch: faQuidditch,\n faQuoteLeft: faQuoteLeft,\n faQuoteRight: faQuoteRight,\n faQuran: faQuran,\n faRadiation: faRadiation,\n faRadiationAlt: faRadiationAlt,\n faRainbow: faRainbow,\n faRandom: faRandom,\n faReceipt: faReceipt,\n faRecycle: faRecycle,\n faRedo: faRedo,\n faRedoAlt: faRedoAlt,\n faRegistered: faRegistered,\n faRemoveFormat: faRemoveFormat,\n faReply: faReply,\n faReplyAll: faReplyAll,\n faRepublican: faRepublican,\n faRestroom: faRestroom,\n faRetweet: faRetweet,\n faRibbon: faRibbon,\n faRing: faRing,\n faRoad: faRoad,\n faRobot: faRobot,\n faRocket: faRocket,\n faRoute: faRoute,\n faRss: faRss,\n faRssSquare: faRssSquare,\n faRubleSign: faRubleSign,\n faRuler: faRuler,\n faRulerCombined: faRulerCombined,\n faRulerHorizontal: faRulerHorizontal,\n faRulerVertical: faRulerVertical,\n faRunning: faRunning,\n faRupeeSign: faRupeeSign,\n faSadCry: faSadCry,\n faSadTear: faSadTear,\n faSatellite: faSatellite,\n faSatelliteDish: faSatelliteDish,\n faSave: faSave,\n faSchool: faSchool,\n faScrewdriver: faScrewdriver,\n faScroll: faScroll,\n faSdCard: faSdCard,\n faSearch: faSearch,\n faSearchDollar: faSearchDollar,\n faSearchLocation: faSearchLocation,\n faSearchMinus: faSearchMinus,\n faSearchPlus: faSearchPlus,\n faSeedling: faSeedling,\n faServer: faServer,\n faShapes: faShapes,\n faShare: faShare,\n faShareAlt: faShareAlt,\n faShareAltSquare: faShareAltSquare,\n faShareSquare: faShareSquare,\n faShekelSign: faShekelSign,\n faShieldAlt: faShieldAlt,\n faShip: faShip,\n faShippingFast: faShippingFast,\n faShoePrints: faShoePrints,\n faShoppingBag: faShoppingBag,\n faShoppingBasket: faShoppingBasket,\n faShoppingCart: faShoppingCart,\n faShower: faShower,\n faShuttleVan: faShuttleVan,\n faSign: faSign,\n faSignInAlt: faSignInAlt,\n faSignLanguage: faSignLanguage,\n faSignOutAlt: faSignOutAlt,\n faSignal: faSignal,\n faSignature: faSignature,\n faSimCard: faSimCard,\n faSitemap: faSitemap,\n faSkating: faSkating,\n faSkiing: faSkiing,\n faSkiingNordic: faSkiingNordic,\n faSkull: faSkull,\n faSkullCrossbones: faSkullCrossbones,\n faSlash: faSlash,\n faSleigh: faSleigh,\n faSlidersH: faSlidersH,\n faSmile: faSmile,\n faSmileBeam: faSmileBeam,\n faSmileWink: faSmileWink,\n faSmog: faSmog,\n faSmoking: faSmoking,\n faSmokingBan: faSmokingBan,\n faSms: faSms,\n faSnowboarding: faSnowboarding,\n faSnowflake: faSnowflake,\n faSnowman: faSnowman,\n faSnowplow: faSnowplow,\n faSocks: faSocks,\n faSolarPanel: faSolarPanel,\n faSort: faSort,\n faSortAlphaDown: faSortAlphaDown,\n faSortAlphaDownAlt: faSortAlphaDownAlt,\n faSortAlphaUp: faSortAlphaUp,\n faSortAlphaUpAlt: faSortAlphaUpAlt,\n faSortAmountDown: faSortAmountDown,\n faSortAmountDownAlt: faSortAmountDownAlt,\n faSortAmountUp: faSortAmountUp,\n faSortAmountUpAlt: faSortAmountUpAlt,\n faSortDown: faSortDown,\n faSortNumericDown: faSortNumericDown,\n faSortNumericDownAlt: faSortNumericDownAlt,\n faSortNumericUp: faSortNumericUp,\n faSortNumericUpAlt: faSortNumericUpAlt,\n faSortUp: faSortUp,\n faSpa: faSpa,\n faSpaceShuttle: faSpaceShuttle,\n faSpellCheck: faSpellCheck,\n faSpider: faSpider,\n faSpinner: faSpinner,\n faSplotch: faSplotch,\n faSprayCan: faSprayCan,\n faSquare: faSquare,\n faSquareFull: faSquareFull,\n faSquareRootAlt: faSquareRootAlt,\n faStamp: faStamp,\n faStar: faStar,\n faStarAndCrescent: faStarAndCrescent,\n faStarHalf: faStarHalf,\n faStarHalfAlt: faStarHalfAlt,\n faStarOfDavid: faStarOfDavid,\n faStarOfLife: faStarOfLife,\n faStepBackward: faStepBackward,\n faStepForward: faStepForward,\n faStethoscope: faStethoscope,\n faStickyNote: faStickyNote,\n faStop: faStop,\n faStopCircle: faStopCircle,\n faStopwatch: faStopwatch,\n faStore: faStore,\n faStoreAlt: faStoreAlt,\n faStream: faStream,\n faStreetView: faStreetView,\n faStrikethrough: faStrikethrough,\n faStroopwafel: faStroopwafel,\n faSubscript: faSubscript,\n faSubway: faSubway,\n faSuitcase: faSuitcase,\n faSuitcaseRolling: faSuitcaseRolling,\n faSun: faSun,\n faSuperscript: faSuperscript,\n faSurprise: faSurprise,\n faSwatchbook: faSwatchbook,\n faSwimmer: faSwimmer,\n faSwimmingPool: faSwimmingPool,\n faSynagogue: faSynagogue,\n faSync: faSync,\n faSyncAlt: faSyncAlt,\n faSyringe: faSyringe,\n faTable: faTable,\n faTableTennis: faTableTennis,\n faTablet: faTablet,\n faTabletAlt: faTabletAlt,\n faTablets: faTablets,\n faTachometerAlt: faTachometerAlt,\n faTag: faTag,\n faTags: faTags,\n faTape: faTape,\n faTasks: faTasks,\n faTaxi: faTaxi,\n faTeeth: faTeeth,\n faTeethOpen: faTeethOpen,\n faTemperatureHigh: faTemperatureHigh,\n faTemperatureLow: faTemperatureLow,\n faTenge: faTenge,\n faTerminal: faTerminal,\n faTextHeight: faTextHeight,\n faTextWidth: faTextWidth,\n faTh: faTh,\n faThLarge: faThLarge,\n faThList: faThList,\n faTheaterMasks: faTheaterMasks,\n faThermometer: faThermometer,\n faThermometerEmpty: faThermometerEmpty,\n faThermometerFull: faThermometerFull,\n faThermometerHalf: faThermometerHalf,\n faThermometerQuarter: faThermometerQuarter,\n faThermometerThreeQuarters: faThermometerThreeQuarters,\n faThumbsDown: faThumbsDown,\n faThumbsUp: faThumbsUp,\n faThumbtack: faThumbtack,\n faTicketAlt: faTicketAlt,\n faTimes: faTimes,\n faTimesCircle: faTimesCircle,\n faTint: faTint,\n faTintSlash: faTintSlash,\n faTired: faTired,\n faToggleOff: faToggleOff,\n faToggleOn: faToggleOn,\n faToilet: faToilet,\n faToiletPaper: faToiletPaper,\n faToolbox: faToolbox,\n faTools: faTools,\n faTooth: faTooth,\n faTorah: faTorah,\n faToriiGate: faToriiGate,\n faTractor: faTractor,\n faTrademark: faTrademark,\n faTrafficLight: faTrafficLight,\n faTrain: faTrain,\n faTram: faTram,\n faTransgender: faTransgender,\n faTransgenderAlt: faTransgenderAlt,\n faTrash: faTrash,\n faTrashAlt: faTrashAlt,\n faTrashRestore: faTrashRestore,\n faTrashRestoreAlt: faTrashRestoreAlt,\n faTree: faTree,\n faTrophy: faTrophy,\n faTruck: faTruck,\n faTruckLoading: faTruckLoading,\n faTruckMonster: faTruckMonster,\n faTruckMoving: faTruckMoving,\n faTruckPickup: faTruckPickup,\n faTshirt: faTshirt,\n faTty: faTty,\n faTv: faTv,\n faUmbrella: faUmbrella,\n faUmbrellaBeach: faUmbrellaBeach,\n faUnderline: faUnderline,\n faUndo: faUndo,\n faUndoAlt: faUndoAlt,\n faUniversalAccess: faUniversalAccess,\n faUniversity: faUniversity,\n faUnlink: faUnlink,\n faUnlock: faUnlock,\n faUnlockAlt: faUnlockAlt,\n faUpload: faUpload,\n faUser: faUser,\n faUserAlt: faUserAlt,\n faUserAltSlash: faUserAltSlash,\n faUserAstronaut: faUserAstronaut,\n faUserCheck: faUserCheck,\n faUserCircle: faUserCircle,\n faUserClock: faUserClock,\n faUserCog: faUserCog,\n faUserEdit: faUserEdit,\n faUserFriends: faUserFriends,\n faUserGraduate: faUserGraduate,\n faUserInjured: faUserInjured,\n faUserLock: faUserLock,\n faUserMd: faUserMd,\n faUserMinus: faUserMinus,\n faUserNinja: faUserNinja,\n faUserNurse: faUserNurse,\n faUserPlus: faUserPlus,\n faUserSecret: faUserSecret,\n faUserShield: faUserShield,\n faUserSlash: faUserSlash,\n faUserTag: faUserTag,\n faUserTie: faUserTie,\n faUserTimes: faUserTimes,\n faUsers: faUsers,\n faUsersCog: faUsersCog,\n faUtensilSpoon: faUtensilSpoon,\n faUtensils: faUtensils,\n faVectorSquare: faVectorSquare,\n faVenus: faVenus,\n faVenusDouble: faVenusDouble,\n faVenusMars: faVenusMars,\n faVial: faVial,\n faVials: faVials,\n faVideo: faVideo,\n faVideoSlash: faVideoSlash,\n faVihara: faVihara,\n faVoicemail: faVoicemail,\n faVolleyballBall: faVolleyballBall,\n faVolumeDown: faVolumeDown,\n faVolumeMute: faVolumeMute,\n faVolumeOff: faVolumeOff,\n faVolumeUp: faVolumeUp,\n faVoteYea: faVoteYea,\n faVrCardboard: faVrCardboard,\n faWalking: faWalking,\n faWallet: faWallet,\n faWarehouse: faWarehouse,\n faWater: faWater,\n faWaveSquare: faWaveSquare,\n faWeight: faWeight,\n faWeightHanging: faWeightHanging,\n faWheelchair: faWheelchair,\n faWifi: faWifi,\n faWind: faWind,\n faWindowClose: faWindowClose,\n faWindowMaximize: faWindowMaximize,\n faWindowMinimize: faWindowMinimize,\n faWindowRestore: faWindowRestore,\n faWineBottle: faWineBottle,\n faWineGlass: faWineGlass,\n faWineGlassAlt: faWineGlassAlt,\n faWonSign: faWonSign,\n faWrench: faWrench,\n faXRay: faXRay,\n faYenSign: faYenSign,\n faYinYang: faYinYang\n};\n\nexport { _iconsCache as fas, prefix, faAd, faAddressBook, faAddressCard, faAdjust, faAirFreshener, faAlignCenter, faAlignJustify, faAlignLeft, faAlignRight, faAllergies, faAmbulance, faAmericanSignLanguageInterpreting, faAnchor, faAngleDoubleDown, faAngleDoubleLeft, faAngleDoubleRight, faAngleDoubleUp, faAngleDown, faAngleLeft, faAngleRight, faAngleUp, faAngry, faAnkh, faAppleAlt, faArchive, faArchway, faArrowAltCircleDown, faArrowAltCircleLeft, faArrowAltCircleRight, faArrowAltCircleUp, faArrowCircleDown, faArrowCircleLeft, faArrowCircleRight, faArrowCircleUp, faArrowDown, faArrowLeft, faArrowRight, faArrowUp, faArrowsAlt, faArrowsAltH, faArrowsAltV, faAssistiveListeningSystems, faAsterisk, faAt, faAtlas, faAtom, faAudioDescription, faAward, faBaby, faBabyCarriage, faBackspace, faBackward, faBacon, faBalanceScale, faBalanceScaleLeft, faBalanceScaleRight, faBan, faBandAid, faBarcode, faBars, faBaseballBall, faBasketballBall, faBath, faBatteryEmpty, faBatteryFull, faBatteryHalf, faBatteryQuarter, faBatteryThreeQuarters, faBed, faBeer, faBell, faBellSlash, faBezierCurve, faBible, faBicycle, faBiking, faBinoculars, faBiohazard, faBirthdayCake, faBlender, faBlenderPhone, faBlind, faBlog, faBold, faBolt, faBomb, faBone, faBong, faBook, faBookDead, faBookMedical, faBookOpen, faBookReader, faBookmark, faBorderAll, faBorderNone, faBorderStyle, faBowlingBall, faBox, faBoxOpen, faBoxes, faBraille, faBrain, faBreadSlice, faBriefcase, faBriefcaseMedical, faBroadcastTower, faBroom, faBrush, faBug, faBuilding, faBullhorn, faBullseye, faBurn, faBus, faBusAlt, faBusinessTime, faCalculator, faCalendar, faCalendarAlt, faCalendarCheck, faCalendarDay, faCalendarMinus, faCalendarPlus, faCalendarTimes, faCalendarWeek, faCamera, faCameraRetro, faCampground, faCandyCane, faCannabis, faCapsules, faCar, faCarAlt, faCarBattery, faCarCrash, faCarSide, faCaretDown, faCaretLeft, faCaretRight, faCaretSquareDown, faCaretSquareLeft, faCaretSquareRight, faCaretSquareUp, faCaretUp, faCarrot, faCartArrowDown, faCartPlus, faCashRegister, faCat, faCertificate, faChair, faChalkboard, faChalkboardTeacher, faChargingStation, faChartArea, faChartBar, faChartLine, faChartPie, faCheck, faCheckCircle, faCheckDouble, faCheckSquare, faCheese, faChess, faChessBishop, faChessBoard, faChessKing, faChessKnight, faChessPawn, faChessQueen, faChessRook, faChevronCircleDown, faChevronCircleLeft, faChevronCircleRight, faChevronCircleUp, faChevronDown, faChevronLeft, faChevronRight, faChevronUp, faChild, faChurch, faCircle, faCircleNotch, faCity, faClinicMedical, faClipboard, faClipboardCheck, faClipboardList, faClock, faClone, faClosedCaptioning, faCloud, faCloudDownloadAlt, faCloudMeatball, faCloudMoon, faCloudMoonRain, faCloudRain, faCloudShowersHeavy, faCloudSun, faCloudSunRain, faCloudUploadAlt, faCocktail, faCode, faCodeBranch, faCoffee, faCog, faCogs, faCoins, faColumns, faComment, faCommentAlt, faCommentDollar, faCommentDots, faCommentMedical, faCommentSlash, faComments, faCommentsDollar, faCompactDisc, faCompass, faCompress, faCompressArrowsAlt, faConciergeBell, faCookie, faCookieBite, faCopy, faCopyright, faCouch, faCreditCard, faCrop, faCropAlt, faCross, faCrosshairs, faCrow, faCrown, faCrutch, faCube, faCubes, faCut, faDatabase, faDeaf, faDemocrat, faDesktop, faDharmachakra, faDiagnoses, faDice, faDiceD20, faDiceD6, faDiceFive, faDiceFour, faDiceOne, faDiceSix, faDiceThree, faDiceTwo, faDigitalTachograph, faDirections, faDivide, faDizzy, faDna, faDog, faDollarSign, faDolly, faDollyFlatbed, faDonate, faDoorClosed, faDoorOpen, faDotCircle, faDove, faDownload, faDraftingCompass, faDragon, faDrawPolygon, faDrum, faDrumSteelpan, faDrumstickBite, faDumbbell, faDumpster, faDumpsterFire, faDungeon, faEdit, faEgg, faEject, faEllipsisH, faEllipsisV, faEnvelope, faEnvelopeOpen, faEnvelopeOpenText, faEnvelopeSquare, faEquals, faEraser, faEthernet, faEuroSign, faExchangeAlt, faExclamation, faExclamationCircle, faExclamationTriangle, faExpand, faExpandArrowsAlt, faExternalLinkAlt, faExternalLinkSquareAlt, faEye, faEyeDropper, faEyeSlash, faFan, faFastBackward, faFastForward, faFax, faFeather, faFeatherAlt, faFemale, faFighterJet, faFile, faFileAlt, faFileArchive, faFileAudio, faFileCode, faFileContract, faFileCsv, faFileDownload, faFileExcel, faFileExport, faFileImage, faFileImport, faFileInvoice, faFileInvoiceDollar, faFileMedical, faFileMedicalAlt, faFilePdf, faFilePowerpoint, faFilePrescription, faFileSignature, faFileUpload, faFileVideo, faFileWord, faFill, faFillDrip, faFilm, faFilter, faFingerprint, faFire, faFireAlt, faFireExtinguisher, faFirstAid, faFish, faFistRaised, faFlag, faFlagCheckered, faFlagUsa, faFlask, faFlushed, faFolder, faFolderMinus, faFolderOpen, faFolderPlus, faFont, faFontAwesomeLogoFull, faFootballBall, faForward, faFrog, faFrown, faFrownOpen, faFunnelDollar, faFutbol, faGamepad, faGasPump, faGavel, faGem, faGenderless, faGhost, faGift, faGifts, faGlassCheers, faGlassMartini, faGlassMartiniAlt, faGlassWhiskey, faGlasses, faGlobe, faGlobeAfrica, faGlobeAmericas, faGlobeAsia, faGlobeEurope, faGolfBall, faGopuram, faGraduationCap, faGreaterThan, faGreaterThanEqual, faGrimace, faGrin, faGrinAlt, faGrinBeam, faGrinBeamSweat, faGrinHearts, faGrinSquint, faGrinSquintTears, faGrinStars, faGrinTears, faGrinTongue, faGrinTongueSquint, faGrinTongueWink, faGrinWink, faGripHorizontal, faGripLines, faGripLinesVertical, faGripVertical, faGuitar, faHSquare, faHamburger, faHammer, faHamsa, faHandHolding, faHandHoldingHeart, faHandHoldingUsd, faHandLizard, faHandMiddleFinger, faHandPaper, faHandPeace, faHandPointDown, faHandPointLeft, faHandPointRight, faHandPointUp, faHandPointer, faHandRock, faHandScissors, faHandSpock, faHands, faHandsHelping, faHandshake, faHanukiah, faHardHat, faHashtag, faHatWizard, faHaykal, faHdd, faHeading, faHeadphones, faHeadphonesAlt, faHeadset, faHeart, faHeartBroken, faHeartbeat, faHelicopter, faHighlighter, faHiking, faHippo, faHistory, faHockeyPuck, faHollyBerry, faHome, faHorse, faHorseHead, faHospital, faHospitalAlt, faHospitalSymbol, faHotTub, faHotdog, faHotel, faHourglass, faHourglassEnd, faHourglassHalf, faHourglassStart, faHouseDamage, faHryvnia, faICursor, faIceCream, faIcicles, faIcons, faIdBadge, faIdCard, faIdCardAlt, faIgloo, faImage, faImages, faInbox, faIndent, faIndustry, faInfinity, faInfo, faInfoCircle, faItalic, faJedi, faJoint, faJournalWhills, faKaaba, faKey, faKeyboard, faKhanda, faKiss, faKissBeam, faKissWinkHeart, faKiwiBird, faLandmark, faLanguage, faLaptop, faLaptopCode, faLaptopMedical, faLaugh, faLaughBeam, faLaughSquint, faLaughWink, faLayerGroup, faLeaf, faLemon, faLessThan, faLessThanEqual, faLevelDownAlt, faLevelUpAlt, faLifeRing, faLightbulb, faLink, faLiraSign, faList, faListAlt, faListOl, faListUl, faLocationArrow, faLock, faLockOpen, faLongArrowAltDown, faLongArrowAltLeft, faLongArrowAltRight, faLongArrowAltUp, faLowVision, faLuggageCart, faMagic, faMagnet, faMailBulk, faMale, faMap, faMapMarked, faMapMarkedAlt, faMapMarker, faMapMarkerAlt, faMapPin, faMapSigns, faMarker, faMars, faMarsDouble, faMarsStroke, faMarsStrokeH, faMarsStrokeV, faMask, faMedal, faMedkit, faMeh, faMehBlank, faMehRollingEyes, faMemory, faMenorah, faMercury, faMeteor, faMicrochip, faMicrophone, faMicrophoneAlt, faMicrophoneAltSlash, faMicrophoneSlash, faMicroscope, faMinus, faMinusCircle, faMinusSquare, faMitten, faMobile, faMobileAlt, faMoneyBill, faMoneyBillAlt, faMoneyBillWave, faMoneyBillWaveAlt, faMoneyCheck, faMoneyCheckAlt, faMonument, faMoon, faMortarPestle, faMosque, faMotorcycle, faMountain, faMousePointer, faMugHot, faMusic, faNetworkWired, faNeuter, faNewspaper, faNotEqual, faNotesMedical, faObjectGroup, faObjectUngroup, faOilCan, faOm, faOtter, faOutdent, faPager, faPaintBrush, faPaintRoller, faPalette, faPallet, faPaperPlane, faPaperclip, faParachuteBox, faParagraph, faParking, faPassport, faPastafarianism, faPaste, faPause, faPauseCircle, faPaw, faPeace, faPen, faPenAlt, faPenFancy, faPenNib, faPenSquare, faPencilAlt, faPencilRuler, faPeopleCarry, faPepperHot, faPercent, faPercentage, faPersonBooth, faPhone, faPhoneAlt, faPhoneSlash, faPhoneSquare, faPhoneSquareAlt, faPhoneVolume, faPhotoVideo, faPiggyBank, faPills, faPizzaSlice, faPlaceOfWorship, faPlane, faPlaneArrival, faPlaneDeparture, faPlay, faPlayCircle, faPlug, faPlus, faPlusCircle, faPlusSquare, faPodcast, faPoll, faPollH, faPoo, faPooStorm, faPoop, faPortrait, faPoundSign, faPowerOff, faPray, faPrayingHands, faPrescription, faPrescriptionBottle, faPrescriptionBottleAlt, faPrint, faProcedures, faProjectDiagram, faPuzzlePiece, faQrcode, faQuestion, faQuestionCircle, faQuidditch, faQuoteLeft, faQuoteRight, faQuran, faRadiation, faRadiationAlt, faRainbow, faRandom, faReceipt, faRecycle, faRedo, faRedoAlt, faRegistered, faRemoveFormat, faReply, faReplyAll, faRepublican, faRestroom, faRetweet, faRibbon, faRing, faRoad, faRobot, faRocket, faRoute, faRss, faRssSquare, faRubleSign, faRuler, faRulerCombined, faRulerHorizontal, faRulerVertical, faRunning, faRupeeSign, faSadCry, faSadTear, faSatellite, faSatelliteDish, faSave, faSchool, faScrewdriver, faScroll, faSdCard, faSearch, faSearchDollar, faSearchLocation, faSearchMinus, faSearchPlus, faSeedling, faServer, faShapes, faShare, faShareAlt, faShareAltSquare, faShareSquare, faShekelSign, faShieldAlt, faShip, faShippingFast, faShoePrints, faShoppingBag, faShoppingBasket, faShoppingCart, faShower, faShuttleVan, faSign, faSignInAlt, faSignLanguage, faSignOutAlt, faSignal, faSignature, faSimCard, faSitemap, faSkating, faSkiing, faSkiingNordic, faSkull, faSkullCrossbones, faSlash, faSleigh, faSlidersH, faSmile, faSmileBeam, faSmileWink, faSmog, faSmoking, faSmokingBan, faSms, faSnowboarding, faSnowflake, faSnowman, faSnowplow, faSocks, faSolarPanel, faSort, faSortAlphaDown, faSortAlphaDownAlt, faSortAlphaUp, faSortAlphaUpAlt, faSortAmountDown, faSortAmountDownAlt, faSortAmountUp, faSortAmountUpAlt, faSortDown, faSortNumericDown, faSortNumericDownAlt, faSortNumericUp, faSortNumericUpAlt, faSortUp, faSpa, faSpaceShuttle, faSpellCheck, faSpider, faSpinner, faSplotch, faSprayCan, faSquare, faSquareFull, faSquareRootAlt, faStamp, faStar, faStarAndCrescent, faStarHalf, faStarHalfAlt, faStarOfDavid, faStarOfLife, faStepBackward, faStepForward, faStethoscope, faStickyNote, faStop, faStopCircle, faStopwatch, faStore, faStoreAlt, faStream, faStreetView, faStrikethrough, faStroopwafel, faSubscript, faSubway, faSuitcase, faSuitcaseRolling, faSun, faSuperscript, faSurprise, faSwatchbook, faSwimmer, faSwimmingPool, faSynagogue, faSync, faSyncAlt, faSyringe, faTable, faTableTennis, faTablet, faTabletAlt, faTablets, faTachometerAlt, faTag, faTags, faTape, faTasks, faTaxi, faTeeth, faTeethOpen, faTemperatureHigh, faTemperatureLow, faTenge, faTerminal, faTextHeight, faTextWidth, faTh, faThLarge, faThList, faTheaterMasks, faThermometer, faThermometerEmpty, faThermometerFull, faThermometerHalf, faThermometerQuarter, faThermometerThreeQuarters, faThumbsDown, faThumbsUp, faThumbtack, faTicketAlt, faTimes, faTimesCircle, faTint, faTintSlash, faTired, faToggleOff, faToggleOn, faToilet, faToiletPaper, faToolbox, faTools, faTooth, faTorah, faToriiGate, faTractor, faTrademark, faTrafficLight, faTrain, faTram, faTransgender, faTransgenderAlt, faTrash, faTrashAlt, faTrashRestore, faTrashRestoreAlt, faTree, faTrophy, faTruck, faTruckLoading, faTruckMonster, faTruckMoving, faTruckPickup, faTshirt, faTty, faTv, faUmbrella, faUmbrellaBeach, faUnderline, faUndo, faUndoAlt, faUniversalAccess, faUniversity, faUnlink, faUnlock, faUnlockAlt, faUpload, faUser, faUserAlt, faUserAltSlash, faUserAstronaut, faUserCheck, faUserCircle, faUserClock, faUserCog, faUserEdit, faUserFriends, faUserGraduate, faUserInjured, faUserLock, faUserMd, faUserMinus, faUserNinja, faUserNurse, faUserPlus, faUserSecret, faUserShield, faUserSlash, faUserTag, faUserTie, faUserTimes, faUsers, faUsersCog, faUtensilSpoon, faUtensils, faVectorSquare, faVenus, faVenusDouble, faVenusMars, faVial, faVials, faVideo, faVideoSlash, faVihara, faVoicemail, faVolleyballBall, faVolumeDown, faVolumeMute, faVolumeOff, faVolumeUp, faVoteYea, faVrCardboard, faWalking, faWallet, faWarehouse, faWater, faWaveSquare, faWeight, faWeightHanging, faWheelchair, faWifi, faWind, faWindowClose, faWindowMaximize, faWindowMinimize, faWindowRestore, faWineBottle, faWineGlass, faWineGlassAlt, faWonSign, faWrench, faXRay, faYenSign, faYinYang };\n", "import { parse, icon } from '@fortawesome/fontawesome-svg-core';\nimport PropTypes from 'prop-types';\nimport React from 'react';\n\nfunction _typeof(obj) {\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n _typeof = function (obj) {\n return typeof obj;\n };\n } else {\n _typeof = function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n }\n\n return _typeof(obj);\n}\n\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}\n\nfunction _objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n var ownKeys = Object.keys(source);\n\n if (typeof Object.getOwnPropertySymbols === 'function') {\n ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) {\n return Object.getOwnPropertyDescriptor(source, sym).enumerable;\n }));\n }\n\n ownKeys.forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n }\n\n return target;\n}\n\nfunction _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n\n return target;\n}\n\nfunction _objectWithoutProperties(source, excluded) {\n if (source == null) return {};\n\n var target = _objectWithoutPropertiesLoose(source, excluded);\n\n var key, i;\n\n if (Object.getOwnPropertySymbols) {\n var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n\n for (i = 0; i < sourceSymbolKeys.length; i++) {\n key = sourceSymbolKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n }\n\n return target;\n}\n\nfunction _toConsumableArray(arr) {\n return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread();\n}\n\nfunction _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) {\n for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];\n\n return arr2;\n }\n}\n\nfunction _iterableToArray(iter) {\n if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === \"[object Arguments]\") return Array.from(iter);\n}\n\nfunction _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance\");\n}\n\nvar commonjsGlobal = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n\nfunction createCommonjsModule(fn, module) {\n\treturn module = { exports: {} }, fn(module, module.exports), module.exports;\n}\n\nvar humps = createCommonjsModule(function (module) {\n(function(global) {\n\n var _processKeys = function(convert, obj, options) {\n if(!_isObject(obj) || _isDate(obj) || _isRegExp(obj) || _isBoolean(obj) || _isFunction(obj)) {\n return obj;\n }\n\n var output,\n i = 0,\n l = 0;\n\n if(_isArray(obj)) {\n output = [];\n for(l=obj.length; i 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n if (typeof element === 'string') {\n return element;\n }\n\n var children = (element.children || []).map(function (child) {\n return convert(createElement, child);\n });\n var mixins = Object.keys(element.attributes || {}).reduce(function (acc, key) {\n var val = element.attributes[key];\n\n switch (key) {\n case 'class':\n acc.attrs['className'] = val;\n delete element.attributes['class'];\n break;\n\n case 'style':\n acc.attrs['style'] = styleToObject(val);\n break;\n\n default:\n if (key.indexOf('aria-') === 0 || key.indexOf('data-') === 0) {\n acc.attrs[key.toLowerCase()] = val;\n } else {\n acc.attrs[humps.camelize(key)] = val;\n }\n\n }\n\n return acc;\n }, {\n attrs: {}\n });\n\n var _extraProps$style = extraProps.style,\n existingStyle = _extraProps$style === void 0 ? {} : _extraProps$style,\n remaining = _objectWithoutProperties(extraProps, [\"style\"]);\n\n mixins.attrs['style'] = _objectSpread({}, mixins.attrs['style'], existingStyle);\n return createElement.apply(void 0, [element.tag, _objectSpread({}, mixins.attrs, remaining)].concat(_toConsumableArray(children)));\n}\n\nvar PRODUCTION = false;\n\ntry {\n PRODUCTION = process.env.NODE_ENV === 'production';\n} catch (e) {}\n\nfunction log () {\n if (!PRODUCTION && console && typeof console.error === 'function') {\n var _console;\n\n (_console = console).error.apply(_console, arguments);\n }\n}\n\nfunction objectWithKey(key, value) {\n return Array.isArray(value) && value.length > 0 || !Array.isArray(value) && value ? _defineProperty({}, key, value) : {};\n}\n\nfunction classList(props) {\n var _classes;\n\n var classes = (_classes = {\n 'fa-spin': props.spin,\n 'fa-pulse': props.pulse,\n 'fa-fw': props.fixedWidth,\n 'fa-inverse': props.inverse,\n 'fa-border': props.border,\n 'fa-li': props.listItem,\n 'fa-flip-horizontal': props.flip === 'horizontal' || props.flip === 'both',\n 'fa-flip-vertical': props.flip === 'vertical' || props.flip === 'both'\n }, _defineProperty(_classes, \"fa-\".concat(props.size), props.size !== null), _defineProperty(_classes, \"fa-rotate-\".concat(props.rotation), props.rotation !== null), _defineProperty(_classes, \"fa-pull-\".concat(props.pull), props.pull !== null), _classes);\n return Object.keys(classes).map(function (key) {\n return classes[key] ? key : null;\n }).filter(function (key) {\n return key;\n });\n}\n\nfunction normalizeIconArgs(icon$$1) {\n if (icon$$1 === null) {\n return null;\n }\n\n if (_typeof(icon$$1) === 'object' && icon$$1.prefix && icon$$1.iconName) {\n return icon$$1;\n }\n\n if (Array.isArray(icon$$1) && icon$$1.length === 2) {\n return {\n prefix: icon$$1[0],\n iconName: icon$$1[1]\n };\n }\n\n if (typeof icon$$1 === 'string') {\n return {\n prefix: 'fas',\n iconName: icon$$1\n };\n }\n}\n\nfunction FontAwesomeIcon(props) {\n var iconArgs = props.icon,\n maskArgs = props.mask,\n symbol = props.symbol,\n className = props.className,\n title = props.title;\n var iconLookup = normalizeIconArgs(iconArgs);\n var classes = objectWithKey('classes', [].concat(_toConsumableArray(classList(props)), _toConsumableArray(className.split(' '))));\n var transform = objectWithKey('transform', typeof props.transform === 'string' ? parse.transform(props.transform) : props.transform);\n var mask = objectWithKey('mask', normalizeIconArgs(maskArgs));\n var renderedIcon = icon(iconLookup, _objectSpread({}, classes, transform, mask, {\n symbol: symbol,\n title: title\n }));\n\n if (!renderedIcon) {\n log('Could not find icon', iconLookup);\n return null;\n }\n\n var abstract = renderedIcon.abstract;\n var extraProps = {};\n Object.keys(props).forEach(function (key) {\n if (!FontAwesomeIcon.defaultProps.hasOwnProperty(key)) {\n extraProps[key] = props[key];\n }\n });\n return convertCurry(abstract[0], extraProps);\n}\nFontAwesomeIcon.displayName = 'FontAwesomeIcon';\nFontAwesomeIcon.propTypes = {\n border: PropTypes.bool,\n className: PropTypes.string,\n mask: PropTypes.oneOfType([PropTypes.object, PropTypes.array, PropTypes.string]),\n fixedWidth: PropTypes.bool,\n inverse: PropTypes.bool,\n flip: PropTypes.oneOf(['horizontal', 'vertical', 'both']),\n icon: PropTypes.oneOfType([PropTypes.object, PropTypes.array, PropTypes.string]),\n listItem: PropTypes.bool,\n pull: PropTypes.oneOf(['right', 'left']),\n pulse: PropTypes.bool,\n rotation: PropTypes.oneOf([90, 180, 270]),\n size: PropTypes.oneOf(['lg', 'xs', 'sm', '1x', '2x', '3x', '4x', '5x', '6x', '7x', '8x', '9x', '10x']),\n spin: PropTypes.bool,\n symbol: PropTypes.oneOfType([PropTypes.bool, PropTypes.string]),\n title: PropTypes.string,\n transform: PropTypes.oneOfType([PropTypes.string, PropTypes.object])\n};\nFontAwesomeIcon.defaultProps = {\n border: false,\n className: '',\n mask: null,\n fixedWidth: false,\n inverse: false,\n flip: null,\n icon: null,\n listItem: false,\n pull: null,\n pulse: false,\n rotation: null,\n size: null,\n spin: false,\n symbol: false,\n title: '',\n transform: null\n};\nvar convertCurry = convert.bind(null, React.createElement);\n\nexport { FontAwesomeIcon };\n", - "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = exports.styles = void 0;\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/defineProperty\"));\n\nvar _objectWithoutProperties2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectWithoutProperties\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _classnames = _interopRequireDefault(require(\"classnames\"));\n\nvar _withStyles = _interopRequireDefault(require(\"../styles/withStyles\"));\n\nvar _helpers = require(\"../utils/helpers\");\n\nvar _Paper = _interopRequireDefault(require(\"../Paper\"));\n\n// @inheritedComponent Paper\nvar styles = function styles(theme) {\n var backgroundColorDefault = theme.palette.type === 'light' ? theme.palette.grey[100] : theme.palette.grey[900];\n return {\n /* Styles applied to the root element. */\n root: {\n display: 'flex',\n flexDirection: 'column',\n width: '100%',\n boxSizing: 'border-box',\n // Prevent padding issue with the Modal and fixed positioned AppBar.\n zIndex: theme.zIndex.appBar,\n flexShrink: 0\n },\n\n /* Styles applied to the root element if `)))) + ((("`" + (`position=\"fixed\"` + "`")) + (`. */\n positionFixed: {\n position: 'fixed',\n top: 0,\n left: 'auto',\n right: 0\n },\n\n /* Styles applied to the root element if ` + ("`" + `position=\"absolute\"`))) + (("`" + (`. */\n positionAbsolute: {\n position: 'absolute',\n top: 0,\n left: 'auto',\n right: 0\n },\n\n /* Styles applied to the root element if ` + "`")) + (`position=\"sticky\"` + ("`" + `. */\n positionSticky: {\n position: 'sticky',\n top: 0,\n left: 'auto',\n right: 0\n },\n\n /* Styles applied to the root element if `)))))))) + ((((((("`" + `position=\"static\"`) + ("`" + (`. */\n positionStatic: {\n position: 'static'\n },\n\n /* Styles applied to the root element if ` + "`"))) + ((`position=\"relative\"` + ("`" + `. */\n positionRelative: {\n position: 'relative'\n },\n\n /* Styles applied to the root element if `)) + ("`" + (`color=\"default\"` + "`")))) + (((`. */\n colorDefault: {\n backgroundColor: backgroundColorDefault,\n color: theme.palette.getContrastText(backgroundColorDefault)\n },\n\n /* Styles applied to the root element if ` + "`") + (`color=\"primary\"` + ("`" + `. */\n colorPrimary: {\n backgroundColor: theme.palette.primary.main,\n color: theme.palette.primary.contrastText\n },\n\n /* Styles applied to the root element if `))) + (("`" + (`color=\"secondary\"` + "`")) + (`. */\n colorSecondary: {\n backgroundColor: theme.palette.secondary.main,\n color: theme.palette.secondary.contrastText\n }\n };\n};\n\nexports.styles = styles;\n\nfunction AppBar(props) {\n var _classNames;\n\n var children = props.children,\n classes = props.classes,\n classNameProp = props.className,\n color = props.color,\n position = props.position,\n other = (0, _objectWithoutProperties2.default)(props, [\"children\", \"classes\", \"className\", \"color\", \"position\"]);\n var className = (0, _classnames.default)(classes.root, classes[\"position\".concat((0, _helpers.capitalize)(position))], (_classNames = {}, (0, _defineProperty2.default)(_classNames, classes[\"color\".concat((0, _helpers.capitalize)(color))], color !== 'inherit'), (0, _defineProperty2.default)(_classNames, 'mui-fixed', position === 'fixed'), _classNames), classNameProp);\n return _react.default.createElement(_Paper.default, (0, _extends2.default)({\n square: true,\n component: \"header\",\n elevation: 4,\n className: className\n }, other), children);\n}\n\nprocess.env.NODE_ENV !== \"production\" ? AppBar.propTypes = {\n /**\r\n * The content of the component.\r\n */\n children: _propTypes.default.node.isRequired,\n\n /**\r\n * Override or extend the styles applied to the component.\r\n * See [CSS API](#css-api) below for more details.\r\n */\n classes: _propTypes.default.object.isRequired,\n\n /**\r\n * @ignore\r\n */\n className: _propTypes.default.string,\n\n /**\r\n * The color of the component. It supports those theme colors that make sense for this component.\r\n */\n color: _propTypes.default.oneOf(['inherit', 'primary', 'secondary', 'default']),\n\n /**\r\n * The positioning type. The behavior of the different options is described\r\n * [in the MDN web docs](https://developer.mozilla.org/en-US/docs/Learn/CSS/CSS_layout/Positioning).\r\n * Note: ` + ("`" + `sticky`))))) + (((("`" + ` is not universally supported and will fall back to `) + ("`" + (`static` + "`"))) + ((` when unavailable.\r\n */\n position: _propTypes.default.oneOf(['fixed', 'absolute', 'sticky', 'static', 'relative'])\n} : void 0;\nAppBar.defaultProps = {\n color: 'primary',\n position: 'fixed'\n};\n\nvar _default = (0, _withStyles.default)(styles, {\n name: 'MuiAppBar'\n})(AppBar);\n\nexports.default = _default;", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = exports.styles = void 0;\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/defineProperty\"));\n\nvar _objectWithoutProperties2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectWithoutProperties\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _classnames = _interopRequireDefault(require(\"classnames\"));\n\nvar _withStyles = _interopRequireDefault(require(\"../styles/withStyles\"));\n\nvar _helpers = require(\"../utils/helpers\");\n\nvar _Paper = _interopRequireDefault(require(\"../Paper\"));\n\n// @inheritedComponent Paper\nvar styles = function styles(theme) {\n var backgroundColorDefault = theme.palette.type === 'light' ? theme.palette.grey[100] : theme.palette.grey[900];\n return {\n /* Styles applied to the root element. */\n root: {\n display: 'flex',\n flexDirection: 'column',\n width: '100%',\n boxSizing: 'border-box',\n // Prevent padding issue with the Modal and fixed positioned AppBar.\n zIndex: theme.zIndex.appBar,\n flexShrink: 0\n },\n\n /* Styles applied to the root element if ` + "`"))) + ((`position=\"fixed\"` + ("`" + `. */\n positionFixed: {\n position: 'fixed',\n top: 0,\n left: 'auto',\n right: 0\n },\n\n /* Styles applied to the root element if `)) + (("`" + `position=\"absolute\"`) + ("`" + `. */\n positionAbsolute: {\n position: 'absolute',\n top: 0,\n left: 'auto',\n right: 0\n },\n\n /* Styles applied to the root element if `))))) + (((("`" + (`position=\"sticky\"` + "`")) + (`. */\n positionSticky: {\n position: 'sticky',\n top: 0,\n left: 'auto',\n right: 0\n },\n\n /* Styles applied to the root element if ` + ("`" + `position=\"static\"`))) + (("`" + (`. */\n positionStatic: {\n position: 'static'\n },\n\n /* Styles applied to the root element if ` + "`")) + (`position=\"relative\"` + ("`" + `. */\n positionRelative: {\n position: 'relative'\n },\n\n /* Styles applied to the root element if `)))) + ((("`" + (`color=\"default\"` + "`")) + (`. */\n colorDefault: {\n backgroundColor: backgroundColorDefault,\n color: theme.palette.getContrastText(backgroundColorDefault)\n },\n\n /* Styles applied to the root element if ` + ("`" + `color=\"primary\"`))) + (("`" + (`. */\n colorPrimary: {\n backgroundColor: theme.palette.primary.main,\n color: theme.palette.primary.contrastText\n },\n\n /* Styles applied to the root element if ` + "`")) + ((`color=\"secondary\"` + "`") + (`. */\n colorSecondary: {\n backgroundColor: theme.palette.secondary.main,\n color: theme.palette.secondary.contrastText\n }\n };\n};\n\nexports.styles = styles;\n\nfunction AppBar(props) {\n var _classNames;\n\n var children = props.children,\n classes = props.classes,\n classNameProp = props.className,\n color = props.color,\n position = props.position,\n other = (0, _objectWithoutProperties2.default)(props, [\"children\", \"classes\", \"className\", \"color\", \"position\"]);\n var className = (0, _classnames.default)(classes.root, classes[\"position\".concat((0, _helpers.capitalize)(position))], (_classNames = {}, (0, _defineProperty2.default)(_classNames, classes[\"color\".concat((0, _helpers.capitalize)(color))], color !== 'inherit'), (0, _defineProperty2.default)(_classNames, 'mui-fixed', position === 'fixed'), _classNames), classNameProp);\n return _react.default.createElement(_Paper.default, (0, _extends2.default)({\n square: true,\n component: \"header\",\n elevation: 4,\n className: className\n }, other), children);\n}\n\nprocess.env.NODE_ENV !== \"production\" ? AppBar.propTypes = {\n /**\r\n * The content of the component.\r\n */\n children: _propTypes.default.node.isRequired,\n\n /**\r\n * Override or extend the styles applied to the component.\r\n * See [CSS API](#css-api) below for more details.\r\n */\n classes: _propTypes.default.object.isRequired,\n\n /**\r\n * @ignore\r\n */\n className: _propTypes.default.string,\n\n /**\r\n * The color of the component. It supports those theme colors that make sense for this component.\r\n */\n color: _propTypes.default.oneOf(['inherit', 'primary', 'secondary', 'default']),\n\n /**\r\n * The positioning type. The behavior of the different options is described\r\n * [in the MDN web docs](https://developer.mozilla.org/en-US/docs/Learn/CSS/CSS_layout/Positioning).\r\n * Note: ` + "`")))))))) + (((((((`sticky` + ("`" + ` is not universally supported and will fall back to `)) + ("`" + (`static` + "`"))) + ((` when unavailable.\r\n */\n position: _propTypes.default.oneOf(['fixed', 'absolute', 'sticky', 'static', 'relative'])\n} : void 0;\nAppBar.defaultProps = {\n color: 'primary',\n position: 'fixed'\n};\n\nvar _default = (0, _withStyles.default)(styles, {\n name: 'MuiAppBar'\n})(AppBar);\n\nexports.default = _default;", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nObject.defineProperty(exports, \"default\", {\n enumerable: true,\n get: function get() {\n return _AppBar.default;\n }\n});\n\nvar _AppBar = _interopRequireDefault(require(\"./AppBar\"));", - "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = exports.styles = void 0;\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/defineProperty\"));\n\nvar _objectWithoutProperties2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectWithoutProperties\"));\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/classCallCheck\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/createClass\"));\n\nvar _possibleConstructorReturn2 = _interopRequireDefault(require(\"@babel/runtime/helpers/possibleConstructorReturn\"));\n\nvar _getPrototypeOf3 = _interopRequireDefault(require(\"@babel/runtime/helpers/getPrototypeOf\"));\n\nvar _inherits2 = _interopRequireDefault(require(\"@babel/runtime/helpers/inherits\"));\n\nvar _assertThisInitialized2 = _interopRequireDefault(require(\"@babel/runtime/helpers/assertThisInitialized\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _reactDom = _interopRequireDefault(require(\"react-dom\"));\n\nvar _classnames = _interopRequireDefault(require(\"classnames\"));\n\nvar _utils = require(\"@material-ui/utils\");\n\nvar _ownerWindow = _interopRequireDefault(require(\"../utils/ownerWindow\"));\n\nvar _withStyles = _interopRequireDefault(require(\"../styles/withStyles\"));\n\nvar _NoSsr = _interopRequireDefault(require(\"../NoSsr\"));\n\nvar _focusVisible = require(\"./focusVisible\");\n\nvar _TouchRipple = _interopRequireDefault(require(\"./TouchRipple\"));\n\nvar _createRippleHandler = _interopRequireDefault(require(\"./createRippleHandler\"));\n\nvar styles = {\n /* Styles applied to the root element. */\n root: {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n position: 'relative',\n // Remove grey highlight\n WebkitTapHighlightColor: 'transparent',\n backgroundColor: 'transparent',\n // Reset default value\n // We disable the focus ring for mouse, touch and keyboard users.\n outline: 'none',\n border: 0,\n margin: 0,\n // Remove the margin in Safari\n borderRadius: 0,\n padding: 0,\n // Remove the padding in Firefox\n cursor: 'pointer',\n userSelect: 'none',\n verticalAlign: 'middle',\n '-moz-appearance': 'none',\n // Reset\n '-webkit-appearance': 'none',\n // Reset\n textDecoration: 'none',\n // So we take precedent over the style of a native element.\n color: 'inherit',\n '&::-moz-focus-inner': {\n borderStyle: 'none' // Remove Firefox dotted outline.\n\n },\n '&$disabled': {\n pointerEvents: 'none',\n // Disable link interactions\n cursor: 'default'\n }\n },\n\n /* Styles applied to the root element if ` + ("`" + `disabled={true}`)) + ("`" + (`. */\n disabled: {},\n\n /* Styles applied to the root element if keyboard focused. */\n focusVisible: {}\n};\n/* istanbul ignore if */\n\nexports.styles = styles;\n\nif (process.env.NODE_ENV !== 'production' && !_react.default.createContext) {\n throw new Error('Material-UI: react@16.3.0 or greater is required.');\n}\n/**\r\n * ` + "`")))) + (((`ButtonBase` + "`") + (` contains as few styles as possible.\r\n * It aims to be a simple building block for creating a button.\r\n * It contains a load of style reset and some focus/ripple logic.\r\n */\n\n\nvar ButtonBase =\n/*#__PURE__*/\nfunction (_React$Component) {\n (0, _inherits2.default)(ButtonBase, _React$Component);\n\n function ButtonBase() {\n var _getPrototypeOf2;\n\n var _this;\n\n (0, _classCallCheck2.default)(this, ButtonBase);\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n _this = (0, _possibleConstructorReturn2.default)(this, (_getPrototypeOf2 = (0, _getPrototypeOf3.default)(ButtonBase)).call.apply(_getPrototypeOf2, [this].concat(args)));\n _this.state = {};\n _this.keyDown = false;\n _this.focusVisibleCheckTime = 50;\n _this.focusVisibleMaxCheckTimes = 5;\n _this.handleMouseDown = (0, _createRippleHandler.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), 'MouseDown', 'start', function () {\n clearTimeout(_this.focusVisibleTimeout);\n\n if (_this.state.focusVisible) {\n _this.setState({\n focusVisible: false\n });\n }\n });\n _this.handleMouseUp = (0, _createRippleHandler.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), 'MouseUp', 'stop');\n _this.handleMouseLeave = (0, _createRippleHandler.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), 'MouseLeave', 'stop', function (event) {\n if (_this.state.focusVisible) {\n event.preventDefault();\n }\n });\n _this.handleTouchStart = (0, _createRippleHandler.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), 'TouchStart', 'start');\n _this.handleTouchEnd = (0, _createRippleHandler.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), 'TouchEnd', 'stop');\n _this.handleTouchMove = (0, _createRippleHandler.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), 'TouchMove', 'stop');\n _this.handleContextMenu = (0, _createRippleHandler.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), 'ContextMenu', 'stop');\n _this.handleBlur = (0, _createRippleHandler.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), 'Blur', 'stop', function () {\n clearTimeout(_this.focusVisibleTimeout);\n\n if (_this.state.focusVisible) {\n _this.setState({\n focusVisible: false\n });\n }\n });\n\n _this.onRippleRef = function (node) {\n _this.ripple = node;\n };\n\n _this.onFocusVisibleHandler = function (event) {\n _this.keyDown = false;\n\n _this.setState({\n focusVisible: true\n });\n\n if (_this.props.onFocusVisible) {\n _this.props.onFocusVisible(event);\n }\n };\n\n _this.handleKeyDown = function (event) {\n var _this$props = _this.props,\n component = _this$props.component,\n focusRipple = _this$props.focusRipple,\n onKeyDown = _this$props.onKeyDown,\n onClick = _this$props.onClick; // Check if key is already down to avoid repeats being counted as multiple activations\n\n if (focusRipple && !_this.keyDown && _this.state.focusVisible && _this.ripple && event.key === ' ') {\n _this.keyDown = true;\n event.persist();\n\n _this.ripple.stop(event, function () {\n _this.ripple.start(event);\n });\n }\n\n if (onKeyDown) {\n onKeyDown(event);\n } // Keyboard accessibility for non interactive elements\n\n\n if (event.target === event.currentTarget && component && component !== 'button' && (event.key === ' ' || event.key === 'Enter') && !(_this.button.tagName === 'A' && _this.button.href)) {\n event.preventDefault();\n\n if (onClick) {\n onClick(event);\n }\n }\n };\n\n _this.handleKeyUp = function (event) {\n if (_this.props.focusRipple && event.key === ' ' && _this.ripple && _this.state.focusVisible) {\n _this.keyDown = false;\n event.persist();\n\n _this.ripple.stop(event, function () {\n _this.ripple.pulsate(event);\n });\n }\n\n if (_this.props.onKeyUp) {\n _this.props.onKeyUp(event);\n }\n };\n\n _this.handleFocus = function (event) {\n if (_this.props.disabled) {\n return;\n } // Fix for https://github.com/facebook/react/issues/7769\n\n\n if (!_this.button) {\n _this.button = event.currentTarget;\n }\n\n event.persist();\n (0, _focusVisible.detectFocusVisible)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), _this.button, function () {\n _this.onFocusVisibleHandler(event);\n });\n\n if (_this.props.onFocus) {\n _this.props.onFocus(event);\n }\n };\n\n return _this;\n }\n\n (0, _createClass2.default)(ButtonBase, [{\n key: \"componentDidMount\",\n value: function componentDidMount() {\n var _this2 = this;\n\n this.button = _reactDom.default.findDOMNode(this);\n (0, _focusVisible.listenForFocusKeys)((0, _ownerWindow.default)(this.button));\n\n if (this.props.action) {\n this.props.action({\n focusVisible: function focusVisible() {\n _this2.setState({\n focusVisible: true\n });\n\n _this2.button.focus();\n }\n });\n }\n }\n }, {\n key: \"componentDidUpdate\",\n value: function componentDidUpdate(prevProps, prevState) {\n if (this.props.focusRipple && !this.props.disableRipple && !prevState.focusVisible && this.state.focusVisible) {\n this.ripple.pulsate();\n }\n }\n }, {\n key: \"componentWillUnmount\",\n value: function componentWillUnmount() {\n clearTimeout(this.focusVisibleTimeout);\n }\n }, {\n key: \"render\",\n value: function render() {\n var _classNames;\n\n var _this$props2 = this.props,\n action = _this$props2.action,\n buttonRef = _this$props2.buttonRef,\n centerRipple = _this$props2.centerRipple,\n children = _this$props2.children,\n classes = _this$props2.classes,\n classNameProp = _this$props2.className,\n component = _this$props2.component,\n disabled = _this$props2.disabled,\n disableRipple = _this$props2.disableRipple,\n disableTouchRipple = _this$props2.disableTouchRipple,\n focusRipple = _this$props2.focusRipple,\n focusVisibleClassName = _this$props2.focusVisibleClassName,\n onBlur = _this$props2.onBlur,\n onFocus = _this$props2.onFocus,\n onFocusVisible = _this$props2.onFocusVisible,\n onKeyDown = _this$props2.onKeyDown,\n onKeyUp = _this$props2.onKeyUp,\n onMouseDown = _this$props2.onMouseDown,\n onMouseLeave = _this$props2.onMouseLeave,\n onMouseUp = _this$props2.onMouseUp,\n onTouchEnd = _this$props2.onTouchEnd,\n onTouchMove = _this$props2.onTouchMove,\n onTouchStart = _this$props2.onTouchStart,\n tabIndex = _this$props2.tabIndex,\n TouchRippleProps = _this$props2.TouchRippleProps,\n type = _this$props2.type,\n other = (0, _objectWithoutProperties2.default)(_this$props2, [\"action\", \"buttonRef\", \"centerRipple\", \"children\", \"classes\", \"className\", \"component\", \"disabled\", \"disableRipple\", \"disableTouchRipple\", \"focusRipple\", \"focusVisibleClassName\", \"onBlur\", \"onFocus\", \"onFocusVisible\", \"onKeyDown\", \"onKeyUp\", \"onMouseDown\", \"onMouseLeave\", \"onMouseUp\", \"onTouchEnd\", \"onTouchMove\", \"onTouchStart\", \"tabIndex\", \"TouchRippleProps\", \"type\"]);\n var className = (0, _classnames.default)(classes.root, (_classNames = {}, (0, _defineProperty2.default)(_classNames, classes.disabled, disabled), (0, _defineProperty2.default)(_classNames, classes.focusVisible, this.state.focusVisible), (0, _defineProperty2.default)(_classNames, focusVisibleClassName, this.state.focusVisible), _classNames), classNameProp);\n var ComponentProp = component;\n\n if (ComponentProp === 'button' && other.href) {\n ComponentProp = 'a';\n }\n\n var buttonProps = {};\n\n if (ComponentProp === 'button') {\n buttonProps.type = type || 'button';\n buttonProps.disabled = disabled;\n } else {\n buttonProps.role = 'button';\n }\n\n return _react.default.createElement(ComponentProp, (0, _extends2.default)({\n className: className,\n onBlur: this.handleBlur,\n onFocus: this.handleFocus,\n onKeyDown: this.handleKeyDown,\n onKeyUp: this.handleKeyUp,\n onMouseDown: this.handleMouseDown,\n onMouseLeave: this.handleMouseLeave,\n onMouseUp: this.handleMouseUp,\n onTouchEnd: this.handleTouchEnd,\n onTouchMove: this.handleTouchMove,\n onTouchStart: this.handleTouchStart,\n onContextMenu: this.handleContextMenu,\n ref: buttonRef,\n tabIndex: disabled ? '-1' : tabIndex\n }, buttonProps, other), children, !disableRipple && !disabled ? _react.default.createElement(_NoSsr.default, null, _react.default.createElement(_TouchRipple.default, (0, _extends2.default)({\n innerRef: this.onRippleRef,\n center: centerRipple\n }, TouchRippleProps))) : null);\n }\n }], [{\n key: \"getDerivedStateFromProps\",\n value: function getDerivedStateFromProps(nextProps, prevState) {\n if (typeof prevState.focusVisible === 'undefined') {\n return {\n focusVisible: false,\n lastDisabled: nextProps.disabled\n };\n } // The blur won't fire when the disabled state is set on a focused input.\n // We need to book keep the focused state manually.\n\n\n if (!prevState.prevState && nextProps.disabled && prevState.focusVisible) {\n return {\n focusVisible: false,\n lastDisabled: nextProps.disabled\n };\n }\n\n return {\n lastDisabled: nextProps.disabled\n };\n }\n }]);\n return ButtonBase;\n}(_react.default.Component);\n\nprocess.env.NODE_ENV !== \"production\" ? ButtonBase.propTypes = {\n /**\r\n * Callback fired when the component mounts.\r\n * This is useful when you want to trigger an action programmatically.\r\n * It currently only supports ` + ("`" + `focusVisible()`))) + (("`" + (` action.\r\n *\r\n * @param {object} actions This object contains all possible actions\r\n * that can be triggered programmatically.\r\n */\n action: _propTypes.default.func,\n\n /**\r\n * Use that property to pass a ref callback to the native button component.\r\n */\n buttonRef: _propTypes.default.oneOfType([_propTypes.default.func, _propTypes.default.object]),\n\n /**\r\n * If ` + "`")) + (`true` + ("`" + `, the ripples will be centered.\r\n * They won't start at the cursor interaction position.\r\n */\n centerRipple: _propTypes.default.bool,\n\n /**\r\n * The content of the component.\r\n */\n children: _propTypes.default.node,\n\n /**\r\n * Override or extend the styles applied to the component.\r\n * See [CSS API](#css-api) below for more details.\r\n */\n classes: _propTypes.default.object.isRequired,\n\n /**\r\n * @ignore\r\n */\n className: _propTypes.default.string,\n\n /**\r\n * The component used for the root node.\r\n * Either a string to use a DOM element or a component.\r\n */\n component: _utils.componentPropType,\n\n /**\r\n * If `)))))) + ((((("`" + `true`) + ("`" + (`, the base button will be disabled.\r\n */\n disabled: _propTypes.default.bool,\n\n /**\r\n * If ` + "`"))) + ((`true` + ("`" + `, the ripple effect will be disabled.\r\n */\n disableRipple: _propTypes.default.bool,\n\n /**\r\n * If `)) + ("`" + (`true` + "`")))) + (((`, the touch ripple effect will be disabled.\r\n */\n disableTouchRipple: _propTypes.default.bool,\n\n /**\r\n * If ` + "`") + (`true` + ("`" + `, the base button will have a keyboard focus ripple.\r\n * `))) + (("`" + (`disableRipple` + "`")) + (` must also be ` + ("`" + `false`))))) + (((("`" + `.\r\n */\n focusRipple: _propTypes.default.bool,\n\n /**\r\n * This property can help a person know which element has the keyboard focus.\r\n * The class name will be applied when the element gain the focus through a keyboard interaction.\r\n * It's a polyfill for the [CSS :focus-visible selector](https://drafts.csswg.org/selectors-4/#the-focus-visible-pseudo).\r\n * The rationale for using this feature [is explained here](https://github.com/WICG/focus-visible/blob/master/explainer.md).\r\n * A [polyfill can be used](https://github.com/WICG/focus-visible) to apply a `) + ("`" + (`focus-visible` + "`"))) + ((` class to other components\r\n * if needed.\r\n */\n focusVisibleClassName: _propTypes.default.string,\n\n /**\r\n * @ignore\r\n */\n onBlur: _propTypes.default.func,\n\n /**\r\n * @ignore\r\n */\n onClick: _propTypes.default.func,\n\n /**\r\n * @ignore\r\n */\n onFocus: _propTypes.default.func,\n\n /**\r\n * Callback fired when the component is focused with a keyboard.\r\n * We trigger a ` + ("`" + `onFocus`)) + ("`" + (` callback too.\r\n */\n onFocusVisible: _propTypes.default.func,\n\n /**\r\n * @ignore\r\n */\n onKeyDown: _propTypes.default.func,\n\n /**\r\n * @ignore\r\n */\n onKeyUp: _propTypes.default.func,\n\n /**\r\n * @ignore\r\n */\n onMouseDown: _propTypes.default.func,\n\n /**\r\n * @ignore\r\n */\n onMouseLeave: _propTypes.default.func,\n\n /**\r\n * @ignore\r\n */\n onMouseUp: _propTypes.default.func,\n\n /**\r\n * @ignore\r\n */\n onTouchEnd: _propTypes.default.func,\n\n /**\r\n * @ignore\r\n */\n onTouchMove: _propTypes.default.func,\n\n /**\r\n * @ignore\r\n */\n onTouchStart: _propTypes.default.func,\n\n /**\r\n * @ignore\r\n */\n role: _propTypes.default.string,\n\n /**\r\n * @ignore\r\n */\n tabIndex: _propTypes.default.oneOfType([_propTypes.default.number, _propTypes.default.string]),\n\n /**\r\n * Properties applied to the ` + "`")))) + (((`TouchRipple` + "`") + (` element.\r\n */\n TouchRippleProps: _propTypes.default.object,\n\n /**\r\n * Used to control the button's purpose.\r\n * This property passes the value to the ` + ("`" + `type`))) + (("`" + (` attribute of the native button component.\r\n * Valid property values include ` + "`")) + (`button` + ("`" + `, `))))))) + (((((("`" + `submit`) + ("`" + (`, and ` + "`"))) + ((`reset` + ("`" + `.\r\n */\n type: _propTypes.default.string\n} : void 0;\nButtonBase.defaultProps = {\n centerRipple: false,\n component: 'button',\n disableRipple: false,\n disableTouchRipple: false,\n focusRipple: false,\n tabIndex: '0',\n type: 'button'\n};\n\nvar _default = (0, _withStyles.default)(styles, {\n name: 'MuiButtonBase'\n})(ButtonBase);\n\nexports.default = _default;", - "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/defineProperty\"));\n\nvar _objectWithoutProperties2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectWithoutProperties\"));\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/classCallCheck\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/createClass\"));\n\nvar _possibleConstructorReturn2 = _interopRequireDefault(require(\"@babel/runtime/helpers/possibleConstructorReturn\"));\n\nvar _getPrototypeOf3 = _interopRequireDefault(require(\"@babel/runtime/helpers/getPrototypeOf\"));\n\nvar _inherits2 = _interopRequireDefault(require(\"@babel/runtime/helpers/inherits\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _classnames = _interopRequireDefault(require(\"classnames\"));\n\nvar _Transition = _interopRequireDefault(require(\"react-transition-group/Transition\"));\n\n/**\r\n * @ignore - internal component.\r\n */\nvar Ripple =\n/*#__PURE__*/\nfunction (_React$Component) {\n (0, _inherits2.default)(Ripple, _React$Component);\n\n function Ripple() {\n var _getPrototypeOf2;\n\n var _this;\n\n (0, _classCallCheck2.default)(this, Ripple);\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n _this = (0, _possibleConstructorReturn2.default)(this, (_getPrototypeOf2 = (0, _getPrototypeOf3.default)(Ripple)).call.apply(_getPrototypeOf2, [this].concat(args)));\n _this.state = {\n visible: false,\n leaving: false\n };\n\n _this.handleEnter = function () {\n _this.setState({\n visible: true\n });\n };\n\n _this.handleExit = function () {\n _this.setState({\n leaving: true\n });\n };\n\n return _this;\n }\n\n (0, _createClass2.default)(Ripple, [{\n key: \"render\",\n value: function render() {\n var _classNames, _classNames2;\n\n var _this$props = this.props,\n classes = _this$props.classes,\n classNameProp = _this$props.className,\n pulsate = _this$props.pulsate,\n rippleX = _this$props.rippleX,\n rippleY = _this$props.rippleY,\n rippleSize = _this$props.rippleSize,\n other = (0, _objectWithoutProperties2.default)(_this$props, [\"classes\", \"className\", \"pulsate\", \"rippleX\", \"rippleY\", \"rippleSize\"]);\n var _this$state = this.state,\n visible = _this$state.visible,\n leaving = _this$state.leaving;\n var rippleClassName = (0, _classnames.default)(classes.ripple, (_classNames = {}, (0, _defineProperty2.default)(_classNames, classes.rippleVisible, visible), (0, _defineProperty2.default)(_classNames, classes.ripplePulsate, pulsate), _classNames), classNameProp);\n var rippleStyles = {\n width: rippleSize,\n height: rippleSize,\n top: -(rippleSize / 2) + rippleY,\n left: -(rippleSize / 2) + rippleX\n };\n var childClassName = (0, _classnames.default)(classes.child, (_classNames2 = {}, (0, _defineProperty2.default)(_classNames2, classes.childLeaving, leaving), (0, _defineProperty2.default)(_classNames2, classes.childPulsate, pulsate), _classNames2));\n return _react.default.createElement(_Transition.default, (0, _extends2.default)({\n onEnter: this.handleEnter,\n onExit: this.handleExit\n }, other), _react.default.createElement(\"span\", {\n className: rippleClassName,\n style: rippleStyles\n }, _react.default.createElement(\"span\", {\n className: childClassName\n })));\n }\n }]);\n return Ripple;\n}(_react.default.Component);\n\nprocess.env.NODE_ENV !== \"production\" ? Ripple.propTypes = {\n /**\r\n * Override or extend the styles applied to the component.\r\n * See [CSS API](#css-api) below for more details.\r\n */\n classes: _propTypes.default.object.isRequired,\n\n /**\r\n * @ignore\r\n */\n className: _propTypes.default.string,\n\n /**\r\n * If `)) + ("`" + (`true` + "`")))) + (((`, the ripple pulsates, typically indicating the keyboard focus state of an element.\r\n */\n pulsate: _propTypes.default.bool,\n\n /**\r\n * Diameter of the ripple.\r\n */\n rippleSize: _propTypes.default.number,\n\n /**\r\n * Horizontal position of the ripple center.\r\n */\n rippleX: _propTypes.default.number,\n\n /**\r\n * Vertical position of the ripple center.\r\n */\n rippleY: _propTypes.default.number\n} : void 0;\nRipple.defaultProps = {\n pulsate: false\n};\nvar _default = Ripple;\nexports.default = _default;", - "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = exports.styles = exports.DELAY_RIPPLE = void 0;\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _objectWithoutProperties2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectWithoutProperties\"));\n\nvar _toConsumableArray2 = _interopRequireDefault(require(\"@babel/runtime/helpers/toConsumableArray\"));\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/classCallCheck\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/createClass\"));\n\nvar _possibleConstructorReturn2 = _interopRequireDefault(require(\"@babel/runtime/helpers/possibleConstructorReturn\"));\n\nvar _getPrototypeOf3 = _interopRequireDefault(require(\"@babel/runtime/helpers/getPrototypeOf\"));\n\nvar _inherits2 = _interopRequireDefault(require(\"@babel/runtime/helpers/inherits\"));\n\nvar _assertThisInitialized2 = _interopRequireDefault(require(\"@babel/runtime/helpers/assertThisInitialized\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _reactDom = _interopRequireDefault(require(\"react-dom\"));\n\nvar _TransitionGroup = _interopRequireDefault(require(\"react-transition-group/TransitionGroup\"));\n\nvar _classnames = _interopRequireDefault(require(\"classnames\"));\n\nvar _withStyles = _interopRequireDefault(require(\"../styles/withStyles\"));\n\nvar _Ripple = _interopRequireDefault(require(\"./Ripple\"));\n\nvar DURATION = 550;\nvar DELAY_RIPPLE = 80;\nexports.DELAY_RIPPLE = DELAY_RIPPLE;\n\nvar styles = function styles(theme) {\n return {\n /* Styles applied to the root element. */\n root: {\n display: 'block',\n position: 'absolute',\n overflow: 'hidden',\n borderRadius: 'inherit',\n width: '100%',\n height: '100%',\n left: 0,\n top: 0,\n pointerEvents: 'none',\n zIndex: 0\n },\n\n /* Styles applied to the internal ` + "`") + (`Ripple` + ("`" + ` components `))) + (("`" + (`ripple` + "`")) + (` class. */\n ripple: {\n width: 50,\n height: 50,\n left: 0,\n top: 0,\n opacity: 0,\n position: 'absolute'\n },\n\n /* Styles applied to the internal ` + ("`" + `Ripple`))))) + (((("`" + ` components `) + ("`" + (`rippleVisible` + "`"))) + ((` class. */\n rippleVisible: {\n opacity: 0.3,\n transform: 'scale(1)',\n animation: \"mui-ripple-enter \".concat(DURATION, \"ms \").concat(theme.transitions.easing.easeInOut),\n // Backward compatible logic between JSS v9 and v10.\n // To remove with the release of Material-UI v4\n animationName: '$mui-ripple-enter'\n },\n\n /* Styles applied to the internal ` + ("`" + `Ripple`)) + ("`" + (` components ` + "`")))) + (((`ripplePulsate` + "`") + (` class. */\n ripplePulsate: {\n animationDuration: \"\".concat(theme.transitions.duration.shorter, \"ms\")\n },\n\n /* Styles applied to the internal ` + ("`" + `Ripple`))) + (("`" + (` components ` + "`")) + (`child` + ("`" + ` class. */\n child: {\n opacity: 1,\n display: 'block',\n width: '100%',\n height: '100%',\n borderRadius: '50%',\n backgroundColor: 'currentColor'\n },\n\n /* Styles applied to the internal `)))))) + ((((("`" + `Ripple`) + ("`" + (` components ` + "`"))) + ((`childLeaving` + ("`" + ` class. */\n childLeaving: {\n opacity: 0,\n animation: \"mui-ripple-exit \".concat(DURATION, \"ms \").concat(theme.transitions.easing.easeInOut),\n // Backward compatible logic between JSS v9 and v10.\n // To remove with the release of Material-UI v4\n animationName: '$mui-ripple-exit'\n },\n\n /* Styles applied to the internal `)) + ("`" + (`Ripple` + "`")))) + (((` components ` + "`") + (`childPulsate` + ("`" + ` class. */\n childPulsate: {\n position: 'absolute',\n left: 0,\n top: 0,\n animation: \"mui-ripple-pulsate 2500ms \".concat(theme.transitions.easing.easeInOut, \" 200ms infinite\"),\n // Backward compatible logic between JSS v9 and v10.\n // To remove with the release of Material-UI v4\n animationName: '$mui-ripple-pulsate'\n },\n '@keyframes mui-ripple-enter': {\n '0%': {\n transform: 'scale(0)',\n opacity: 0.1\n },\n '100%': {\n transform: 'scale(1)',\n opacity: 0.3\n }\n },\n '@keyframes mui-ripple-exit': {\n '0%': {\n opacity: 1\n },\n '100%': {\n opacity: 0\n }\n },\n '@keyframes mui-ripple-pulsate': {\n '0%': {\n transform: 'scale(1)'\n },\n '50%': {\n transform: 'scale(0.92)'\n },\n '100%': {\n transform: 'scale(1)'\n }\n }\n };\n};\n\nexports.styles = styles;\n\nvar TouchRipple =\n/*#__PURE__*/\nfunction (_React$PureComponent) {\n (0, _inherits2.default)(TouchRipple, _React$PureComponent);\n\n function TouchRipple() {\n var _getPrototypeOf2;\n\n var _this;\n\n (0, _classCallCheck2.default)(this, TouchRipple);\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n _this = (0, _possibleConstructorReturn2.default)(this, (_getPrototypeOf2 = (0, _getPrototypeOf3.default)(TouchRipple)).call.apply(_getPrototypeOf2, [this].concat(args)));\n _this.state = {\n nextKey: 0,\n ripples: []\n };\n\n _this.pulsate = function () {\n _this.start({}, {\n pulsate: true\n });\n };\n\n _this.start = function () {\n var event = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var cb = arguments.length > 2 ? arguments[2] : undefined;\n var _options$pulsate = options.pulsate,\n pulsate = _options$pulsate === void 0 ? false : _options$pulsate,\n _options$center = options.center,\n center = _options$center === void 0 ? _this.props.center || options.pulsate : _options$center,\n _options$fakeElement = options.fakeElement,\n fakeElement = _options$fakeElement === void 0 ? false : _options$fakeElement;\n\n if (event.type === 'mousedown' && _this.ignoringMouseDown) {\n _this.ignoringMouseDown = false;\n return;\n }\n\n if (event.type === 'touchstart') {\n _this.ignoringMouseDown = true;\n }\n\n var element = fakeElement ? null : _reactDom.default.findDOMNode((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)));\n var rect = element ? element.getBoundingClientRect() : {\n width: 0,\n height: 0,\n left: 0,\n top: 0\n }; // Get the size of the ripple\n\n var rippleX;\n var rippleY;\n var rippleSize;\n\n if (center || event.clientX === 0 && event.clientY === 0 || !event.clientX && !event.touches) {\n rippleX = Math.round(rect.width / 2);\n rippleY = Math.round(rect.height / 2);\n } else {\n var clientX = event.clientX ? event.clientX : event.touches[0].clientX;\n var clientY = event.clientY ? event.clientY : event.touches[0].clientY;\n rippleX = Math.round(clientX - rect.left);\n rippleY = Math.round(clientY - rect.top);\n }\n\n if (center) {\n rippleSize = Math.sqrt((2 * Math.pow(rect.width, 2) + Math.pow(rect.height, 2)) / 3); // For some reason the animation is broken on Mobile Chrome if the size if even.\n\n if (rippleSize % 2 === 0) {\n rippleSize += 1;\n }\n } else {\n var sizeX = Math.max(Math.abs((element ? element.clientWidth : 0) - rippleX), rippleX) * 2 + 2;\n var sizeY = Math.max(Math.abs((element ? element.clientHeight : 0) - rippleY), rippleY) * 2 + 2;\n rippleSize = Math.sqrt(Math.pow(sizeX, 2) + Math.pow(sizeY, 2));\n } // Touche devices\n\n\n if (event.touches) {\n // Prepare the ripple effect.\n _this.startTimerCommit = function () {\n _this.startCommit({\n pulsate: pulsate,\n rippleX: rippleX,\n rippleY: rippleY,\n rippleSize: rippleSize,\n cb: cb\n });\n }; // Delay the execution of the ripple effect.\n\n\n _this.startTimer = setTimeout(function () {\n if (_this.startTimerCommit) {\n _this.startTimerCommit();\n\n _this.startTimerCommit = null;\n }\n }, DELAY_RIPPLE); // We have to make a tradeoff with this value.\n } else {\n _this.startCommit({\n pulsate: pulsate,\n rippleX: rippleX,\n rippleY: rippleY,\n rippleSize: rippleSize,\n cb: cb\n });\n }\n };\n\n _this.startCommit = function (params) {\n var pulsate = params.pulsate,\n rippleX = params.rippleX,\n rippleY = params.rippleY,\n rippleSize = params.rippleSize,\n cb = params.cb;\n\n _this.setState(function (state) {\n return {\n nextKey: state.nextKey + 1,\n ripples: [].concat((0, _toConsumableArray2.default)(state.ripples), [_react.default.createElement(_Ripple.default, {\n key: state.nextKey,\n classes: _this.props.classes,\n timeout: {\n exit: DURATION,\n enter: DURATION\n },\n pulsate: pulsate,\n rippleX: rippleX,\n rippleY: rippleY,\n rippleSize: rippleSize\n })])\n };\n }, cb);\n };\n\n _this.stop = function (event, cb) {\n clearTimeout(_this.startTimer);\n var ripples = _this.state.ripples; // The touch interaction occurs too quickly.\n // We still want to show ripple effect.\n\n if (event.type === 'touchend' && _this.startTimerCommit) {\n event.persist();\n\n _this.startTimerCommit();\n\n _this.startTimerCommit = null;\n _this.startTimer = setTimeout(function () {\n _this.stop(event, cb);\n });\n return;\n }\n\n _this.startTimerCommit = null;\n\n if (ripples && ripples.length) {\n _this.setState({\n ripples: ripples.slice(1)\n }, cb);\n }\n };\n\n return _this;\n }\n\n (0, _createClass2.default)(TouchRipple, [{\n key: \"componentWillUnmount\",\n value: function componentWillUnmount() {\n clearTimeout(this.startTimer);\n }\n }, {\n key: \"render\",\n value: function render() {\n var _this$props = this.props,\n center = _this$props.center,\n classes = _this$props.classes,\n className = _this$props.className,\n other = (0, _objectWithoutProperties2.default)(_this$props, [\"center\", \"classes\", \"className\"]);\n return _react.default.createElement(_TransitionGroup.default, (0, _extends2.default)({\n component: \"span\",\n enter: true,\n exit: true,\n className: (0, _classnames.default)(classes.root, className)\n }, other), this.state.ripples);\n }\n }]);\n return TouchRipple;\n}(_react.default.PureComponent);\n\nprocess.env.NODE_ENV !== \"production\" ? TouchRipple.propTypes = {\n /**\r\n * If `))) + (("`" + (`true` + "`")) + (`, the ripple starts at the center of the component\r\n * rather than at the point of interaction.\r\n */\n center: _propTypes.default.bool,\n\n /**\r\n * Override or extend the styles applied to the component.\r\n * See [CSS API](#css-api) below for more details.\r\n */\n classes: _propTypes.default.object.isRequired,\n\n /**\r\n * @ignore\r\n */\n className: _propTypes.default.string\n} : void 0;\nTouchRipple.defaultProps = {\n center: false\n};\n\nvar _default = (0, _withStyles.default)(styles, {\n flip: false,\n name: 'MuiTouchRipple'\n})(TouchRipple);\n\nexports.default = _default;", - "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\n/* eslint-disable import/no-mutable-exports */\nvar createRippleHandler = function createRippleHandler(instance, eventName, action, cb) {\n return function (event) {\n if (cb) {\n cb.call(instance, event);\n }\n\n var ignore = false; // Ignore events that have been ` + ("`" + `event.preventDefault()`))))) + (((("`" + ` marked.\n\n if (event.defaultPrevented) {\n ignore = true;\n }\n\n if (instance.props.disableTouchRipple && eventName !== 'Blur') {\n ignore = true;\n }\n\n if (!ignore && instance.ripple) {\n instance.ripple[action](event);\n }\n\n if (typeof instance.props[\"on\".concat(eventName)] === 'function') {\n instance.props[\"on\".concat(eventName)](event);\n }\n\n return true;\n };\n};\n/* istanbul ignore if */\n\n\nif (typeof window === 'undefined') {\n createRippleHandler = function createRippleHandler() {\n return function () {};\n };\n}\n\nvar _default = createRippleHandler;\nexports.default = _default;", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = exports.styles = void 0;\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/defineProperty\"));\n\nvar _objectWithoutProperties2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectWithoutProperties\"));\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/classCallCheck\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/createClass\"));\n\nvar _possibleConstructorReturn2 = _interopRequireDefault(require(\"@babel/runtime/helpers/possibleConstructorReturn\"));\n\nvar _getPrototypeOf3 = _interopRequireDefault(require(\"@babel/runtime/helpers/getPrototypeOf\"));\n\nvar _inherits2 = _interopRequireDefault(require(\"@babel/runtime/helpers/inherits\"));\n\nvar _assertThisInitialized2 = _interopRequireDefault(require(\"@babel/runtime/helpers/assertThisInitialized\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _reactDom = _interopRequireDefault(require(\"react-dom\"));\n\nvar _classnames = _interopRequireDefault(require(\"classnames\"));\n\nvar _utils = require(\"@material-ui/utils\");\n\nvar _ownerWindow = _interopRequireDefault(require(\"../utils/ownerWindow\"));\n\nvar _withStyles = _interopRequireDefault(require(\"../styles/withStyles\"));\n\nvar _NoSsr = _interopRequireDefault(require(\"../NoSsr\"));\n\nvar _focusVisible = require(\"./focusVisible\");\n\nvar _TouchRipple = _interopRequireDefault(require(\"./TouchRipple\"));\n\nvar _createRippleHandler = _interopRequireDefault(require(\"./createRippleHandler\"));\n\nvar styles = {\n /* Styles applied to the root element. */\n root: {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n position: 'relative',\n // Remove grey highlight\n WebkitTapHighlightColor: 'transparent',\n backgroundColor: 'transparent',\n // Reset default value\n // We disable the focus ring for mouse, touch and keyboard users.\n outline: 'none',\n border: 0,\n margin: 0,\n // Remove the margin in Safari\n borderRadius: 0,\n padding: 0,\n // Remove the padding in Firefox\n cursor: 'pointer',\n userSelect: 'none',\n verticalAlign: 'middle',\n '-moz-appearance': 'none',\n // Reset\n '-webkit-appearance': 'none',\n // Reset\n textDecoration: 'none',\n // So we take precedent over the style of a native element.\n color: 'inherit',\n '&::-moz-focus-inner': {\n borderStyle: 'none' // Remove Firefox dotted outline.\n\n },\n '&$disabled': {\n pointerEvents: 'none',\n // Disable link interactions\n cursor: 'default'\n }\n },\n\n /* Styles applied to the root element if ` + ("`" + `disabled={true}`)) + ("`" + (`. */\n disabled: {},\n\n /* Styles applied to the root element if keyboard focused. */\n focusVisible: {}\n};\n/* istanbul ignore if */\n\nexports.styles = styles;\n\nif (process.env.NODE_ENV !== 'production' && !_react.default.createContext) {\n throw new Error('Material-UI: react@16.3.0 or greater is required.');\n}\n/**\r\n * ` + "`")))) + (((`ButtonBase` + ("`" + ` contains as few styles as possible.\r\n * It aims to be a simple building block for creating a button.\r\n * It contains a load of style reset and some focus/ripple logic.\r\n */\n\n\nvar ButtonBase =\n/*#__PURE__*/\nfunction (_React$Component) {\n (0, _inherits2.default)(ButtonBase, _React$Component);\n\n function ButtonBase() {\n var _getPrototypeOf2;\n\n var _this;\n\n (0, _classCallCheck2.default)(this, ButtonBase);\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n _this = (0, _possibleConstructorReturn2.default)(this, (_getPrototypeOf2 = (0, _getPrototypeOf3.default)(ButtonBase)).call.apply(_getPrototypeOf2, [this].concat(args)));\n _this.state = {};\n _this.keyDown = false;\n _this.focusVisibleCheckTime = 50;\n _this.focusVisibleMaxCheckTimes = 5;\n _this.handleMouseDown = (0, _createRippleHandler.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), 'MouseDown', 'start', function () {\n clearTimeout(_this.focusVisibleTimeout);\n\n if (_this.state.focusVisible) {\n _this.setState({\n focusVisible: false\n });\n }\n });\n _this.handleMouseUp = (0, _createRippleHandler.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), 'MouseUp', 'stop');\n _this.handleMouseLeave = (0, _createRippleHandler.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), 'MouseLeave', 'stop', function (event) {\n if (_this.state.focusVisible) {\n event.preventDefault();\n }\n });\n _this.handleTouchStart = (0, _createRippleHandler.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), 'TouchStart', 'start');\n _this.handleTouchEnd = (0, _createRippleHandler.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), 'TouchEnd', 'stop');\n _this.handleTouchMove = (0, _createRippleHandler.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), 'TouchMove', 'stop');\n _this.handleContextMenu = (0, _createRippleHandler.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), 'ContextMenu', 'stop');\n _this.handleBlur = (0, _createRippleHandler.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), 'Blur', 'stop', function () {\n clearTimeout(_this.focusVisibleTimeout);\n\n if (_this.state.focusVisible) {\n _this.setState({\n focusVisible: false\n });\n }\n });\n\n _this.onRippleRef = function (node) {\n _this.ripple = node;\n };\n\n _this.onFocusVisibleHandler = function (event) {\n _this.keyDown = false;\n\n _this.setState({\n focusVisible: true\n });\n\n if (_this.props.onFocusVisible) {\n _this.props.onFocusVisible(event);\n }\n };\n\n _this.handleKeyDown = function (event) {\n var _this$props = _this.props,\n component = _this$props.component,\n focusRipple = _this$props.focusRipple,\n onKeyDown = _this$props.onKeyDown,\n onClick = _this$props.onClick; // Check if key is already down to avoid repeats being counted as multiple activations\n\n if (focusRipple && !_this.keyDown && _this.state.focusVisible && _this.ripple && event.key === ' ') {\n _this.keyDown = true;\n event.persist();\n\n _this.ripple.stop(event, function () {\n _this.ripple.start(event);\n });\n }\n\n if (onKeyDown) {\n onKeyDown(event);\n } // Keyboard accessibility for non interactive elements\n\n\n if (event.target === event.currentTarget && component && component !== 'button' && (event.key === ' ' || event.key === 'Enter') && !(_this.button.tagName === 'A' && _this.button.href)) {\n event.preventDefault();\n\n if (onClick) {\n onClick(event);\n }\n }\n };\n\n _this.handleKeyUp = function (event) {\n if (_this.props.focusRipple && event.key === ' ' && _this.ripple && _this.state.focusVisible) {\n _this.keyDown = false;\n event.persist();\n\n _this.ripple.stop(event, function () {\n _this.ripple.pulsate(event);\n });\n }\n\n if (_this.props.onKeyUp) {\n _this.props.onKeyUp(event);\n }\n };\n\n _this.handleFocus = function (event) {\n if (_this.props.disabled) {\n return;\n } // Fix for https://github.com/facebook/react/issues/7769\n\n\n if (!_this.button) {\n _this.button = event.currentTarget;\n }\n\n event.persist();\n (0, _focusVisible.detectFocusVisible)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), _this.button, function () {\n _this.onFocusVisibleHandler(event);\n });\n\n if (_this.props.onFocus) {\n _this.props.onFocus(event);\n }\n };\n\n return _this;\n }\n\n (0, _createClass2.default)(ButtonBase, [{\n key: \"componentDidMount\",\n value: function componentDidMount() {\n var _this2 = this;\n\n this.button = _reactDom.default.findDOMNode(this);\n (0, _focusVisible.listenForFocusKeys)((0, _ownerWindow.default)(this.button));\n\n if (this.props.action) {\n this.props.action({\n focusVisible: function focusVisible() {\n _this2.setState({\n focusVisible: true\n });\n\n _this2.button.focus();\n }\n });\n }\n }\n }, {\n key: \"componentDidUpdate\",\n value: function componentDidUpdate(prevProps, prevState) {\n if (this.props.focusRipple && !this.props.disableRipple && !prevState.focusVisible && this.state.focusVisible) {\n this.ripple.pulsate();\n }\n }\n }, {\n key: \"componentWillUnmount\",\n value: function componentWillUnmount() {\n clearTimeout(this.focusVisibleTimeout);\n }\n }, {\n key: \"render\",\n value: function render() {\n var _classNames;\n\n var _this$props2 = this.props,\n action = _this$props2.action,\n buttonRef = _this$props2.buttonRef,\n centerRipple = _this$props2.centerRipple,\n children = _this$props2.children,\n classes = _this$props2.classes,\n classNameProp = _this$props2.className,\n component = _this$props2.component,\n disabled = _this$props2.disabled,\n disableRipple = _this$props2.disableRipple,\n disableTouchRipple = _this$props2.disableTouchRipple,\n focusRipple = _this$props2.focusRipple,\n focusVisibleClassName = _this$props2.focusVisibleClassName,\n onBlur = _this$props2.onBlur,\n onFocus = _this$props2.onFocus,\n onFocusVisible = _this$props2.onFocusVisible,\n onKeyDown = _this$props2.onKeyDown,\n onKeyUp = _this$props2.onKeyUp,\n onMouseDown = _this$props2.onMouseDown,\n onMouseLeave = _this$props2.onMouseLeave,\n onMouseUp = _this$props2.onMouseUp,\n onTouchEnd = _this$props2.onTouchEnd,\n onTouchMove = _this$props2.onTouchMove,\n onTouchStart = _this$props2.onTouchStart,\n tabIndex = _this$props2.tabIndex,\n TouchRippleProps = _this$props2.TouchRippleProps,\n type = _this$props2.type,\n other = (0, _objectWithoutProperties2.default)(_this$props2, [\"action\", \"buttonRef\", \"centerRipple\", \"children\", \"classes\", \"className\", \"component\", \"disabled\", \"disableRipple\", \"disableTouchRipple\", \"focusRipple\", \"focusVisibleClassName\", \"onBlur\", \"onFocus\", \"onFocusVisible\", \"onKeyDown\", \"onKeyUp\", \"onMouseDown\", \"onMouseLeave\", \"onMouseUp\", \"onTouchEnd\", \"onTouchMove\", \"onTouchStart\", \"tabIndex\", \"TouchRippleProps\", \"type\"]);\n var className = (0, _classnames.default)(classes.root, (_classNames = {}, (0, _defineProperty2.default)(_classNames, classes.disabled, disabled), (0, _defineProperty2.default)(_classNames, classes.focusVisible, this.state.focusVisible), (0, _defineProperty2.default)(_classNames, focusVisibleClassName, this.state.focusVisible), _classNames), classNameProp);\n var ComponentProp = component;\n\n if (ComponentProp === 'button' && other.href) {\n ComponentProp = 'a';\n }\n\n var buttonProps = {};\n\n if (ComponentProp === 'button') {\n buttonProps.type = type || 'button';\n buttonProps.disabled = disabled;\n } else {\n buttonProps.role = 'button';\n }\n\n return _react.default.createElement(ComponentProp, (0, _extends2.default)({\n className: className,\n onBlur: this.handleBlur,\n onFocus: this.handleFocus,\n onKeyDown: this.handleKeyDown,\n onKeyUp: this.handleKeyUp,\n onMouseDown: this.handleMouseDown,\n onMouseLeave: this.handleMouseLeave,\n onMouseUp: this.handleMouseUp,\n onTouchEnd: this.handleTouchEnd,\n onTouchMove: this.handleTouchMove,\n onTouchStart: this.handleTouchStart,\n onContextMenu: this.handleContextMenu,\n ref: buttonRef,\n tabIndex: disabled ? '-1' : tabIndex\n }, buttonProps, other), children, !disableRipple && !disabled ? _react.default.createElement(_NoSsr.default, null, _react.default.createElement(_TouchRipple.default, (0, _extends2.default)({\n innerRef: this.onRippleRef,\n center: centerRipple\n }, TouchRippleProps))) : null);\n }\n }], [{\n key: \"getDerivedStateFromProps\",\n value: function getDerivedStateFromProps(nextProps, prevState) {\n if (typeof prevState.focusVisible === 'undefined') {\n return {\n focusVisible: false,\n lastDisabled: nextProps.disabled\n };\n } // The blur won't fire when the disabled state is set on a focused input.\n // We need to book keep the focused state manually.\n\n\n if (!prevState.prevState && nextProps.disabled && prevState.focusVisible) {\n return {\n focusVisible: false,\n lastDisabled: nextProps.disabled\n };\n }\n\n return {\n lastDisabled: nextProps.disabled\n };\n }\n }]);\n return ButtonBase;\n}(_react.default.Component);\n\nprocess.env.NODE_ENV !== \"production\" ? ButtonBase.propTypes = {\n /**\r\n * Callback fired when the component mounts.\r\n * This is useful when you want to trigger an action programmatically.\r\n * It currently only supports `)) + ("`" + (`focusVisible()` + "`"))) + ((` action.\r\n *\r\n * @param {object} actions This object contains all possible actions\r\n * that can be triggered programmatically.\r\n */\n action: _propTypes.default.func,\n\n /**\r\n * Use that property to pass a ref callback to the native button component.\r\n */\n buttonRef: _propTypes.default.oneOfType([_propTypes.default.func, _propTypes.default.object]),\n\n /**\r\n * If ` + ("`" + `true`)) + ("`" + (`, the ripples will be centered.\r\n * They won't start at the cursor interaction position.\r\n */\n centerRipple: _propTypes.default.bool,\n\n /**\r\n * The content of the component.\r\n */\n children: _propTypes.default.node,\n\n /**\r\n * Override or extend the styles applied to the component.\r\n * See [CSS API](#css-api) below for more details.\r\n */\n classes: _propTypes.default.object.isRequired,\n\n /**\r\n * @ignore\r\n */\n className: _propTypes.default.string,\n\n /**\r\n * The component used for the root node.\r\n * Either a string to use a DOM element or a component.\r\n */\n component: _utils.componentPropType,\n\n /**\r\n * If ` + "`"))))) + ((((`true` + ("`" + `, the base button will be disabled.\r\n */\n disabled: _propTypes.default.bool,\n\n /**\r\n * If `)) + ("`" + (`true` + "`"))) + ((`, the ripple effect will be disabled.\r\n */\n disableRipple: _propTypes.default.bool,\n\n /**\r\n * If ` + ("`" + `true`)) + ("`" + (`, the touch ripple effect will be disabled.\r\n */\n disableTouchRipple: _propTypes.default.bool,\n\n /**\r\n * If ` + "`")))) + (((`true` + ("`" + `, the base button will have a keyboard focus ripple.\r\n * `)) + ("`" + (`disableRipple` + "`"))) + ((` must also be ` + ("`" + `false`)) + (("`" + `.\r\n */\n focusRipple: _propTypes.default.bool,\n\n /**\r\n * This property can help a person know which element has the keyboard focus.\r\n * The class name will be applied when the element gain the focus through a keyboard interaction.\r\n * It's a polyfill for the [CSS :focus-visible selector](https://drafts.csswg.org/selectors-4/#the-focus-visible-pseudo).\r\n * The rationale for using this feature [is explained here](https://github.com/WICG/focus-visible/blob/master/explainer.md).\r\n * A [polyfill can be used](https://github.com/WICG/focus-visible) to apply a `) + ("`" + `focus-visible`)))))) + ((((("`" + (` class to other components\r\n * if needed.\r\n */\n focusVisibleClassName: _propTypes.default.string,\n\n /**\r\n * @ignore\r\n */\n onBlur: _propTypes.default.func,\n\n /**\r\n * @ignore\r\n */\n onClick: _propTypes.default.func,\n\n /**\r\n * @ignore\r\n */\n onFocus: _propTypes.default.func,\n\n /**\r\n * Callback fired when the component is focused with a keyboard.\r\n * We trigger a ` + "`")) + (`onFocus` + ("`" + ` callback too.\r\n */\n onFocusVisible: _propTypes.default.func,\n\n /**\r\n * @ignore\r\n */\n onKeyDown: _propTypes.default.func,\n\n /**\r\n * @ignore\r\n */\n onKeyUp: _propTypes.default.func,\n\n /**\r\n * @ignore\r\n */\n onMouseDown: _propTypes.default.func,\n\n /**\r\n * @ignore\r\n */\n onMouseLeave: _propTypes.default.func,\n\n /**\r\n * @ignore\r\n */\n onMouseUp: _propTypes.default.func,\n\n /**\r\n * @ignore\r\n */\n onTouchEnd: _propTypes.default.func,\n\n /**\r\n * @ignore\r\n */\n onTouchMove: _propTypes.default.func,\n\n /**\r\n * @ignore\r\n */\n onTouchStart: _propTypes.default.func,\n\n /**\r\n * @ignore\r\n */\n role: _propTypes.default.string,\n\n /**\r\n * @ignore\r\n */\n tabIndex: _propTypes.default.oneOfType([_propTypes.default.number, _propTypes.default.string]),\n\n /**\r\n * Properties applied to the `))) + (("`" + (`TouchRipple` + "`")) + (` element.\r\n */\n TouchRippleProps: _propTypes.default.object,\n\n /**\r\n * Used to control the button's purpose.\r\n * This property passes the value to the ` + ("`" + `type`)))) + ((("`" + (` attribute of the native button component.\r\n * Valid property values include ` + "`")) + (`button` + ("`" + `, `))) + (("`" + (`submit` + "`")) + ((`, and ` + "`") + (`reset` + "`"))))) + ((((`.\r\n */\n type: _propTypes.default.string\n} : void 0;\nButtonBase.defaultProps = {\n centerRipple: false,\n component: 'button',\n disableRipple: false,\n disableTouchRipple: false,\n focusRipple: false,\n tabIndex: '0',\n type: 'button'\n};\n\nvar _default = (0, _withStyles.default)(styles, {\n name: 'MuiButtonBase'\n})(ButtonBase);\n\nexports.default = _default;", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/defineProperty\"));\n\nvar _objectWithoutProperties2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectWithoutProperties\"));\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/classCallCheck\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/createClass\"));\n\nvar _possibleConstructorReturn2 = _interopRequireDefault(require(\"@babel/runtime/helpers/possibleConstructorReturn\"));\n\nvar _getPrototypeOf3 = _interopRequireDefault(require(\"@babel/runtime/helpers/getPrototypeOf\"));\n\nvar _inherits2 = _interopRequireDefault(require(\"@babel/runtime/helpers/inherits\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _classnames = _interopRequireDefault(require(\"classnames\"));\n\nvar _Transition = _interopRequireDefault(require(\"react-transition-group/Transition\"));\n\n/**\r\n * @ignore - internal component.\r\n */\nvar Ripple =\n/*#__PURE__*/\nfunction (_React$Component) {\n (0, _inherits2.default)(Ripple, _React$Component);\n\n function Ripple() {\n var _getPrototypeOf2;\n\n var _this;\n\n (0, _classCallCheck2.default)(this, Ripple);\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n _this = (0, _possibleConstructorReturn2.default)(this, (_getPrototypeOf2 = (0, _getPrototypeOf3.default)(Ripple)).call.apply(_getPrototypeOf2, [this].concat(args)));\n _this.state = {\n visible: false,\n leaving: false\n };\n\n _this.handleEnter = function () {\n _this.setState({\n visible: true\n });\n };\n\n _this.handleExit = function () {\n _this.setState({\n leaving: true\n });\n };\n\n return _this;\n }\n\n (0, _createClass2.default)(Ripple, [{\n key: \"render\",\n value: function render() {\n var _classNames, _classNames2;\n\n var _this$props = this.props,\n classes = _this$props.classes,\n classNameProp = _this$props.className,\n pulsate = _this$props.pulsate,\n rippleX = _this$props.rippleX,\n rippleY = _this$props.rippleY,\n rippleSize = _this$props.rippleSize,\n other = (0, _objectWithoutProperties2.default)(_this$props, [\"classes\", \"className\", \"pulsate\", \"rippleX\", \"rippleY\", \"rippleSize\"]);\n var _this$state = this.state,\n visible = _this$state.visible,\n leaving = _this$state.leaving;\n var rippleClassName = (0, _classnames.default)(classes.ripple, (_classNames = {}, (0, _defineProperty2.default)(_classNames, classes.rippleVisible, visible), (0, _defineProperty2.default)(_classNames, classes.ripplePulsate, pulsate), _classNames), classNameProp);\n var rippleStyles = {\n width: rippleSize,\n height: rippleSize,\n top: -(rippleSize / 2) + rippleY,\n left: -(rippleSize / 2) + rippleX\n };\n var childClassName = (0, _classnames.default)(classes.child, (_classNames2 = {}, (0, _defineProperty2.default)(_classNames2, classes.childLeaving, leaving), (0, _defineProperty2.default)(_classNames2, classes.childPulsate, pulsate), _classNames2));\n return _react.default.createElement(_Transition.default, (0, _extends2.default)({\n onEnter: this.handleEnter,\n onExit: this.handleExit\n }, other), _react.default.createElement(\"span\", {\n className: rippleClassName,\n style: rippleStyles\n }, _react.default.createElement(\"span\", {\n className: childClassName\n })));\n }\n }]);\n return Ripple;\n}(_react.default.Component);\n\nprocess.env.NODE_ENV !== \"production\" ? Ripple.propTypes = {\n /**\r\n * Override or extend the styles applied to the component.\r\n * See [CSS API](#css-api) below for more details.\r\n */\n classes: _propTypes.default.object.isRequired,\n\n /**\r\n * @ignore\r\n */\n className: _propTypes.default.string,\n\n /**\r\n * If ` + ("`" + `true`)) + ("`" + (`, the ripple pulsates, typically indicating the keyboard focus state of an element.\r\n */\n pulsate: _propTypes.default.bool,\n\n /**\r\n * Diameter of the ripple.\r\n */\n rippleSize: _propTypes.default.number,\n\n /**\r\n * Horizontal position of the ripple center.\r\n */\n rippleX: _propTypes.default.number,\n\n /**\r\n * Vertical position of the ripple center.\r\n */\n rippleY: _propTypes.default.number\n} : void 0;\nRipple.defaultProps = {\n pulsate: false\n};\nvar _default = Ripple;\nexports.default = _default;", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = exports.styles = exports.DELAY_RIPPLE = void 0;\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _objectWithoutProperties2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectWithoutProperties\"));\n\nvar _toConsumableArray2 = _interopRequireDefault(require(\"@babel/runtime/helpers/toConsumableArray\"));\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/classCallCheck\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/createClass\"));\n\nvar _possibleConstructorReturn2 = _interopRequireDefault(require(\"@babel/runtime/helpers/possibleConstructorReturn\"));\n\nvar _getPrototypeOf3 = _interopRequireDefault(require(\"@babel/runtime/helpers/getPrototypeOf\"));\n\nvar _inherits2 = _interopRequireDefault(require(\"@babel/runtime/helpers/inherits\"));\n\nvar _assertThisInitialized2 = _interopRequireDefault(require(\"@babel/runtime/helpers/assertThisInitialized\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _reactDom = _interopRequireDefault(require(\"react-dom\"));\n\nvar _TransitionGroup = _interopRequireDefault(require(\"react-transition-group/TransitionGroup\"));\n\nvar _classnames = _interopRequireDefault(require(\"classnames\"));\n\nvar _withStyles = _interopRequireDefault(require(\"../styles/withStyles\"));\n\nvar _Ripple = _interopRequireDefault(require(\"./Ripple\"));\n\nvar DURATION = 550;\nvar DELAY_RIPPLE = 80;\nexports.DELAY_RIPPLE = DELAY_RIPPLE;\n\nvar styles = function styles(theme) {\n return {\n /* Styles applied to the root element. */\n root: {\n display: 'block',\n position: 'absolute',\n overflow: 'hidden',\n borderRadius: 'inherit',\n width: '100%',\n height: '100%',\n left: 0,\n top: 0,\n pointerEvents: 'none',\n zIndex: 0\n },\n\n /* Styles applied to the internal ` + "`"))) + ((`Ripple` + ("`" + ` components `)) + ("`" + (`ripple` + "`")))) + (((` class. */\n ripple: {\n width: 50,\n height: 50,\n left: 0,\n top: 0,\n opacity: 0,\n position: 'absolute'\n },\n\n /* Styles applied to the internal ` + ("`" + `Ripple`)) + ("`" + (` components ` + "`"))) + ((`rippleVisible` + ("`" + ` class. */\n rippleVisible: {\n opacity: 0.3,\n transform: 'scale(1)',\n animation: \"mui-ripple-enter \".concat(DURATION, \"ms \").concat(theme.transitions.easing.easeInOut),\n // Backward compatible logic between JSS v9 and v10.\n // To remove with the release of Material-UI v4\n animationName: '$mui-ripple-enter'\n },\n\n /* Styles applied to the internal `)) + (("`" + `Ripple`) + ("`" + ` components `))))))) + (((((("`" + (`ripplePulsate` + "`")) + (` class. */\n ripplePulsate: {\n animationDuration: \"\".concat(theme.transitions.duration.shorter, \"ms\")\n },\n\n /* Styles applied to the internal ` + ("`" + `Ripple`))) + (("`" + (` components ` + "`")) + (`child` + ("`" + ` class. */\n child: {\n opacity: 1,\n display: 'block',\n width: '100%',\n height: '100%',\n borderRadius: '50%',\n backgroundColor: 'currentColor'\n },\n\n /* Styles applied to the internal `)))) + ((("`" + (`Ripple` + "`")) + (` components ` + ("`" + `childLeaving`))) + (("`" + (` class. */\n childLeaving: {\n opacity: 0,\n animation: \"mui-ripple-exit \".concat(DURATION, \"ms \").concat(theme.transitions.easing.easeInOut),\n // Backward compatible logic between JSS v9 and v10.\n // To remove with the release of Material-UI v4\n animationName: '$mui-ripple-exit'\n },\n\n /* Styles applied to the internal ` + "`")) + (`Ripple` + ("`" + ` components `))))) + (((("`" + (`childPulsate` + "`")) + (` class. */\n childPulsate: {\n position: 'absolute',\n left: 0,\n top: 0,\n animation: \"mui-ripple-pulsate 2500ms \".concat(theme.transitions.easing.easeInOut, \" 200ms infinite\"),\n // Backward compatible logic between JSS v9 and v10.\n // To remove with the release of Material-UI v4\n animationName: '$mui-ripple-pulsate'\n },\n '@keyframes mui-ripple-enter': {\n '0%': {\n transform: 'scale(0)',\n opacity: 0.1\n },\n '100%': {\n transform: 'scale(1)',\n opacity: 0.3\n }\n },\n '@keyframes mui-ripple-exit': {\n '0%': {\n opacity: 1\n },\n '100%': {\n opacity: 0\n }\n },\n '@keyframes mui-ripple-pulsate': {\n '0%': {\n transform: 'scale(1)'\n },\n '50%': {\n transform: 'scale(0.92)'\n },\n '100%': {\n transform: 'scale(1)'\n }\n }\n };\n};\n\nexports.styles = styles;\n\nvar TouchRipple =\n/*#__PURE__*/\nfunction (_React$PureComponent) {\n (0, _inherits2.default)(TouchRipple, _React$PureComponent);\n\n function TouchRipple() {\n var _getPrototypeOf2;\n\n var _this;\n\n (0, _classCallCheck2.default)(this, TouchRipple);\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n _this = (0, _possibleConstructorReturn2.default)(this, (_getPrototypeOf2 = (0, _getPrototypeOf3.default)(TouchRipple)).call.apply(_getPrototypeOf2, [this].concat(args)));\n _this.state = {\n nextKey: 0,\n ripples: []\n };\n\n _this.pulsate = function () {\n _this.start({}, {\n pulsate: true\n });\n };\n\n _this.start = function () {\n var event = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var cb = arguments.length > 2 ? arguments[2] : undefined;\n var _options$pulsate = options.pulsate,\n pulsate = _options$pulsate === void 0 ? false : _options$pulsate,\n _options$center = options.center,\n center = _options$center === void 0 ? _this.props.center || options.pulsate : _options$center,\n _options$fakeElement = options.fakeElement,\n fakeElement = _options$fakeElement === void 0 ? false : _options$fakeElement;\n\n if (event.type === 'mousedown' && _this.ignoringMouseDown) {\n _this.ignoringMouseDown = false;\n return;\n }\n\n if (event.type === 'touchstart') {\n _this.ignoringMouseDown = true;\n }\n\n var element = fakeElement ? null : _reactDom.default.findDOMNode((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)));\n var rect = element ? element.getBoundingClientRect() : {\n width: 0,\n height: 0,\n left: 0,\n top: 0\n }; // Get the size of the ripple\n\n var rippleX;\n var rippleY;\n var rippleSize;\n\n if (center || event.clientX === 0 && event.clientY === 0 || !event.clientX && !event.touches) {\n rippleX = Math.round(rect.width / 2);\n rippleY = Math.round(rect.height / 2);\n } else {\n var clientX = event.clientX ? event.clientX : event.touches[0].clientX;\n var clientY = event.clientY ? event.clientY : event.touches[0].clientY;\n rippleX = Math.round(clientX - rect.left);\n rippleY = Math.round(clientY - rect.top);\n }\n\n if (center) {\n rippleSize = Math.sqrt((2 * Math.pow(rect.width, 2) + Math.pow(rect.height, 2)) / 3); // For some reason the animation is broken on Mobile Chrome if the size if even.\n\n if (rippleSize % 2 === 0) {\n rippleSize += 1;\n }\n } else {\n var sizeX = Math.max(Math.abs((element ? element.clientWidth : 0) - rippleX), rippleX) * 2 + 2;\n var sizeY = Math.max(Math.abs((element ? element.clientHeight : 0) - rippleY), rippleY) * 2 + 2;\n rippleSize = Math.sqrt(Math.pow(sizeX, 2) + Math.pow(sizeY, 2));\n } // Touche devices\n\n\n if (event.touches) {\n // Prepare the ripple effect.\n _this.startTimerCommit = function () {\n _this.startCommit({\n pulsate: pulsate,\n rippleX: rippleX,\n rippleY: rippleY,\n rippleSize: rippleSize,\n cb: cb\n });\n }; // Delay the execution of the ripple effect.\n\n\n _this.startTimer = setTimeout(function () {\n if (_this.startTimerCommit) {\n _this.startTimerCommit();\n\n _this.startTimerCommit = null;\n }\n }, DELAY_RIPPLE); // We have to make a tradeoff with this value.\n } else {\n _this.startCommit({\n pulsate: pulsate,\n rippleX: rippleX,\n rippleY: rippleY,\n rippleSize: rippleSize,\n cb: cb\n });\n }\n };\n\n _this.startCommit = function (params) {\n var pulsate = params.pulsate,\n rippleX = params.rippleX,\n rippleY = params.rippleY,\n rippleSize = params.rippleSize,\n cb = params.cb;\n\n _this.setState(function (state) {\n return {\n nextKey: state.nextKey + 1,\n ripples: [].concat((0, _toConsumableArray2.default)(state.ripples), [_react.default.createElement(_Ripple.default, {\n key: state.nextKey,\n classes: _this.props.classes,\n timeout: {\n exit: DURATION,\n enter: DURATION\n },\n pulsate: pulsate,\n rippleX: rippleX,\n rippleY: rippleY,\n rippleSize: rippleSize\n })])\n };\n }, cb);\n };\n\n _this.stop = function (event, cb) {\n clearTimeout(_this.startTimer);\n var ripples = _this.state.ripples; // The touch interaction occurs too quickly.\n // We still want to show ripple effect.\n\n if (event.type === 'touchend' && _this.startTimerCommit) {\n event.persist();\n\n _this.startTimerCommit();\n\n _this.startTimerCommit = null;\n _this.startTimer = setTimeout(function () {\n _this.stop(event, cb);\n });\n return;\n }\n\n _this.startTimerCommit = null;\n\n if (ripples && ripples.length) {\n _this.setState({\n ripples: ripples.slice(1)\n }, cb);\n }\n };\n\n return _this;\n }\n\n (0, _createClass2.default)(TouchRipple, [{\n key: \"componentWillUnmount\",\n value: function componentWillUnmount() {\n clearTimeout(this.startTimer);\n }\n }, {\n key: \"render\",\n value: function render() {\n var _this$props = this.props,\n center = _this$props.center,\n classes = _this$props.classes,\n className = _this$props.className,\n other = (0, _objectWithoutProperties2.default)(_this$props, [\"center\", \"classes\", \"className\"]);\n return _react.default.createElement(_TransitionGroup.default, (0, _extends2.default)({\n component: \"span\",\n enter: true,\n exit: true,\n className: (0, _classnames.default)(classes.root, className)\n }, other), this.state.ripples);\n }\n }]);\n return TouchRipple;\n}(_react.default.PureComponent);\n\nprocess.env.NODE_ENV !== \"production\" ? TouchRipple.propTypes = {\n /**\r\n * If ` + ("`" + `true`))) + (("`" + (`, the ripple starts at the center of the component\r\n * rather than at the point of interaction.\r\n */\n center: _propTypes.default.bool,\n\n /**\r\n * Override or extend the styles applied to the component.\r\n * See [CSS API](#css-api) below for more details.\r\n */\n classes: _propTypes.default.object.isRequired,\n\n /**\r\n * @ignore\r\n */\n className: _propTypes.default.string\n} : void 0;\nTouchRipple.defaultProps = {\n center: false\n};\n\nvar _default = (0, _withStyles.default)(styles, {\n flip: false,\n name: 'MuiTouchRipple'\n})(TouchRipple);\n\nexports.default = _default;", + "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\n/* eslint-disable import/no-mutable-exports */\nvar createRippleHandler = function createRippleHandler(instance, eventName, action, cb) {\n return function (event) {\n if (cb) {\n cb.call(instance, event);\n }\n\n var ignore = false; // Ignore events that have been ` + "`")) + (`event.preventDefault()` + ("`" + ` marked.\n\n if (event.defaultPrevented) {\n ignore = true;\n }\n\n if (instance.props.disableTouchRipple && eventName !== 'Blur') {\n ignore = true;\n }\n\n if (!ignore && instance.ripple) {\n instance.ripple[action](event);\n }\n\n if (typeof instance.props[\"on\".concat(eventName)] === 'function') {\n instance.props[\"on\".concat(eventName)](event);\n }\n\n return true;\n };\n};\n/* istanbul ignore if */\n\n\nif (typeof window === 'undefined') {\n createRippleHandler = function createRippleHandler() {\n return function () {};\n };\n}\n\nvar _default = createRippleHandler;\nexports.default = _default;", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.detectFocusVisible = detectFocusVisible;\nexports.listenForFocusKeys = listenForFocusKeys;\n\nvar _warning = _interopRequireDefault(require(\"warning\"));\n\nvar _ownerDocument = _interopRequireDefault(require(\"../utils/ownerDocument\"));\n\nvar internal = {\n focusKeyPressed: false,\n keyUpEventTimeout: -1\n};\n\nfunction findActiveElement(doc) {\n var activeElement = doc.activeElement;\n\n while (activeElement && activeElement.shadowRoot && activeElement.shadowRoot.activeElement) {\n activeElement = activeElement.shadowRoot.activeElement;\n }\n\n return activeElement;\n}\n\nfunction detectFocusVisible(instance, element, callback) {\n var attempt = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 1;\n process.env.NODE_ENV !== \"production\" ? (0, _warning.default)(instance.focusVisibleCheckTime, 'Material-UI: missing instance.focusVisibleCheckTime.') : void 0;\n process.env.NODE_ENV !== \"production\" ? (0, _warning.default)(instance.focusVisibleMaxCheckTimes, 'Material-UI: missing instance.focusVisibleMaxCheckTimes.') : void 0;\n instance.focusVisibleTimeout = setTimeout(function () {\n var doc = (0, _ownerDocument.default)(element);\n var activeElement = findActiveElement(doc);\n\n if (internal.focusKeyPressed && (activeElement === element || element.contains(activeElement))) {\n callback();\n } else if (attempt < instance.focusVisibleMaxCheckTimes) {\n detectFocusVisible(instance, element, callback, attempt + 1);\n }\n }, instance.focusVisibleCheckTime);\n}\n\nvar FOCUS_KEYS = [9, // 'Tab',\n13, // 'Enter',\n27, // 'Escape',\n32, // ' ',\n37, // 'ArrowLeft',\n38, // 'ArrowUp',\n39, // 'ArrowRight',\n40];\n\nfunction isFocusKey(event) {\n // Use event.keyCode to support IE 11\n return FOCUS_KEYS.indexOf(event.keyCode) > -1;\n}\n\nvar handleKeyUpEvent = function handleKeyUpEvent(event) {\n if (isFocusKey(event)) {\n internal.focusKeyPressed = true; // Let's consider that the user is using a keyboard during a window frame of 500ms.\n\n clearTimeout(internal.keyUpEventTimeout);\n internal.keyUpEventTimeout = setTimeout(function () {\n internal.focusKeyPressed = false;\n }, 500);\n }\n};\n\nfunction listenForFocusKeys(win) {\n // The event listener will only be added once per window.\n // Duplicate event listeners will be ignored by addEventListener.\n // Also, this logic is client side only, we don't need a teardown.\n win.addEventListener('keyup', handleKeyUpEvent);\n}", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nObject.defineProperty(exports, \"default\", {\n enumerable: true,\n get: function get() {\n return _ButtonBase.default;\n }\n});\n\nvar _ButtonBase = _interopRequireDefault(require(\"./ButtonBase\"));", - "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = exports.styles = void 0;\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/defineProperty\"));\n\nvar _objectWithoutProperties2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectWithoutProperties\"));\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _classnames = _interopRequireDefault(require(\"classnames\"));\n\nvar _utils = require(\"@material-ui/utils\");\n\nvar _withStyles = _interopRequireDefault(require(\"../styles/withStyles\"));\n\nvar _createBreakpoints = require(\"../styles/createBreakpoints\");\n\nvar _requirePropFactory = _interopRequireDefault(require(\"../utils/requirePropFactory\"));\n\n// A grid component using the following libs as inspiration.\n//\n// For the implementation:\n// - http://v4-alpha.getbootstrap.com/layout/flexbox-grid/\n// - https://github.com/kristoferjoseph/flexboxgrid/blob/master/src/css/flexboxgrid.css\n// - https://github.com/roylee0704/react-flexbox-grid\n// - https://material.angularjs.org/latest/layout/introduction\n//\n// Follow this flexbox Guide to better understand the underlying model:\n// - https://css-tricks.com/snippets/css/a-guide-to-flexbox/\nvar GUTTERS = [0, 8, 16, 24, 32, 40];\nvar GRID_SIZES = ['auto', true, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];\n\nfunction generateGrid(globalStyles, theme, breakpoint) {\n var styles = {};\n GRID_SIZES.forEach(function (size) {\n var key = \"grid-\".concat(breakpoint, \"-\").concat(size);\n\n if (size === true) {\n // For the auto layouting\n styles[key] = {\n flexBasis: 0,\n flexGrow: 1,\n maxWidth: '100%'\n };\n return;\n }\n\n if (size === 'auto') {\n styles[key] = {\n flexBasis: 'auto',\n flexGrow: 0,\n maxWidth: 'none'\n };\n return;\n } // Keep 7 significant numbers.\n\n\n var width = \"\".concat(Math.round(size / 12 * 10e7) / 10e5, \"%\"); // Close to the bootstrap implementation:\n // https://github.com/twbs/bootstrap/blob/8fccaa2439e97ec72a4b7dc42ccc1f649790adb0/scss/mixins/_grid.scss#L41\n\n styles[key] = {\n flexBasis: width,\n flexGrow: 0,\n maxWidth: width\n };\n }); // No need for a media query for the first size.\n\n if (breakpoint === 'xs') {\n (0, _extends2.default)(globalStyles, styles);\n } else {\n globalStyles[theme.breakpoints.up(breakpoint)] = styles;\n }\n}\n\nfunction generateGutter(theme, breakpoint) {\n var styles = {};\n GUTTERS.forEach(function (spacing, index) {\n if (index === 0) {\n // Skip the default style.\n return;\n }\n\n styles[\"spacing-\".concat(breakpoint, \"-\").concat(spacing)] = {\n margin: -spacing / 2,\n width: \"calc(100% + \".concat(spacing, \"px)\"),\n '& > $item': {\n padding: spacing / 2\n }\n };\n });\n return styles;\n} // Default CSS values\n// flex: '0 1 auto',\n// flexDirection: 'row',\n// alignItems: 'flex-start',\n// flexWrap: 'nowrap',\n// justifyContent: 'flex-start',\n\n\nvar styles = function styles(theme) {\n return (0, _extends2.default)({\n /* Styles applied to the root element if `) + ("`" + (`container={true}` + "`"))) + ((`. */\n container: {\n boxSizing: 'border-box',\n display: 'flex',\n flexWrap: 'wrap',\n width: '100%'\n },\n\n /* Styles applied to the root element if ` + ("`" + `item={true}`)) + ("`" + (`. */\n item: {\n boxSizing: 'border-box',\n margin: '0' // For instance, it's useful when used with a ` + "`")))) + (((`figure` + ("`" + ` element.\n\n },\n\n /* Styles applied to the root element if `)) + ("`" + (`zeroMinWidth={true}` + "`"))) + ((`. */\n zeroMinWidth: {\n minWidth: 0\n },\n\n /* Styles applied to the root element if ` + ("`" + `direction=\"column\"`)) + ("`" + (`. */\n 'direction-xs-column': {\n flexDirection: 'column'\n },\n\n /* Styles applied to the root element if ` + "`"))))))))) + ((((((((`direction=\"column-reverse\"` + "`") + (`. */\n 'direction-xs-column-reverse': {\n flexDirection: 'column-reverse'\n },\n\n /* Styles applied to the root element if ` + ("`" + `direction=\"rwo-reverse\"`))) + (("`" + (`. */\n 'direction-xs-row-reverse': {\n flexDirection: 'row-reverse'\n },\n\n /* Styles applied to the root element if ` + "`")) + (`wrap=\"nowrap\"` + ("`" + `. */\n 'wrap-xs-nowrap': {\n flexWrap: 'nowrap'\n },\n\n /* Styles applied to the root element if `)))) + ((("`" + `wrap=\"reverse\"`) + ("`" + (`. */\n 'wrap-xs-wrap-reverse': {\n flexWrap: 'wrap-reverse'\n },\n\n /* Styles applied to the root element if ` + "`"))) + ((`alignItems=\"center\"` + ("`" + `. */\n 'align-items-xs-center': {\n alignItems: 'center'\n },\n\n /* Styles applied to the root element if `)) + ("`" + (`alignItems=\"flex-start\"` + "`"))))) + ((((`. */\n 'align-items-xs-flex-start': {\n alignItems: 'flex-start'\n },\n\n /* Styles applied to the root element if ` + "`") + (`alignItems=\"flex-end\"` + ("`" + `. */\n 'align-items-xs-flex-end': {\n alignItems: 'flex-end'\n },\n\n /* Styles applied to the root element if `))) + (("`" + (`alignItems=\"baseline\"` + "`")) + (`. */\n 'align-items-xs-baseline': {\n alignItems: 'baseline'\n },\n\n /* Styles applied to the root element if ` + ("`" + `alignContent=\"center\"`)))) + ((("`" + `. */\n 'align-content-xs-center': {\n alignContent: 'center'\n },\n\n /* Styles applied to the root element if `) + ("`" + (`alignContent=\"flex-start\"` + "`"))) + ((`. */\n 'align-content-xs-flex-start': {\n alignContent: 'flex-start'\n },\n\n /* Styles applied to the root element if ` + ("`" + `alignContent=\"flex-end\"`)) + ("`" + (`. */\n 'align-content-xs-flex-end': {\n alignContent: 'flex-end'\n },\n\n /* Styles applied to the root element if ` + "`")))))) + (((((`alignContent=\"space-between\"` + "`") + (`. */\n 'align-content-xs-space-between': {\n alignContent: 'space-between'\n },\n\n /* Styles applied to the root element if ` + ("`" + `alignContent=\"space-around\"`))) + (("`" + (`. */\n 'align-content-xs-space-around': {\n alignContent: 'space-around'\n },\n\n /* Styles applied to the root element if ` + "`")) + (`justify=\"center\"` + ("`" + `. */\n 'justify-xs-center': {\n justifyContent: 'center'\n },\n\n /* Styles applied to the root element if `)))) + ((("`" + `justify=\"flex-end\"`) + ("`" + (`. */\n 'justify-xs-flex-end': {\n justifyContent: 'flex-end'\n },\n\n /* Styles applied to the root element if ` + "`"))) + ((`justify=\"space-between\"` + ("`" + `. */\n 'justify-xs-space-between': {\n justifyContent: 'space-between'\n },\n\n /* Styles applied to the root element if `)) + ("`" + (`justify=\"space-around\"` + "`"))))) + ((((`. */\n 'justify-xs-space-around': {\n justifyContent: 'space-around'\n },\n\n /* Styles applied to the root element if ` + "`") + (`justify=\"space-evenly\"` + ("`" + `. */\n 'justify-xs-space-evenly': {\n justifyContent: 'space-evenly'\n }\n }, generateGutter(theme, 'xs'), _createBreakpoints.keys.reduce(function (accumulator, key) {\n // Use side effect over immutability for better performance.\n generateGrid(accumulator, theme, key);\n return accumulator;\n }, {}));\n};\n\nexports.styles = styles;\n\nfunction Grid(props) {\n var _classNames;\n\n var alignContent = props.alignContent,\n alignItems = props.alignItems,\n classes = props.classes,\n classNameProp = props.className,\n Component = props.component,\n container = props.container,\n direction = props.direction,\n item = props.item,\n justify = props.justify,\n lg = props.lg,\n md = props.md,\n sm = props.sm,\n spacing = props.spacing,\n wrap = props.wrap,\n xl = props.xl,\n xs = props.xs,\n zeroMinWidth = props.zeroMinWidth,\n other = (0, _objectWithoutProperties2.default)(props, [\"alignContent\", \"alignItems\", \"classes\", \"className\", \"component\", \"container\", \"direction\", \"item\", \"justify\", \"lg\", \"md\", \"sm\", \"spacing\", \"wrap\", \"xl\", \"xs\", \"zeroMinWidth\"]);\n var className = (0, _classnames.default)((_classNames = {}, (0, _defineProperty2.default)(_classNames, classes.container, container), (0, _defineProperty2.default)(_classNames, classes.item, item), (0, _defineProperty2.default)(_classNames, classes.zeroMinWidth, zeroMinWidth), (0, _defineProperty2.default)(_classNames, classes[\"spacing-xs-\".concat(String(spacing))], container && spacing !== 0), (0, _defineProperty2.default)(_classNames, classes[\"direction-xs-\".concat(String(direction))], direction !== Grid.defaultProps.direction), (0, _defineProperty2.default)(_classNames, classes[\"wrap-xs-\".concat(String(wrap))], wrap !== Grid.defaultProps.wrap), (0, _defineProperty2.default)(_classNames, classes[\"align-items-xs-\".concat(String(alignItems))], alignItems !== Grid.defaultProps.alignItems), (0, _defineProperty2.default)(_classNames, classes[\"align-content-xs-\".concat(String(alignContent))], alignContent !== Grid.defaultProps.alignContent), (0, _defineProperty2.default)(_classNames, classes[\"justify-xs-\".concat(String(justify))], justify !== Grid.defaultProps.justify), (0, _defineProperty2.default)(_classNames, classes[\"grid-xs-\".concat(String(xs))], xs !== false), (0, _defineProperty2.default)(_classNames, classes[\"grid-sm-\".concat(String(sm))], sm !== false), (0, _defineProperty2.default)(_classNames, classes[\"grid-md-\".concat(String(md))], md !== false), (0, _defineProperty2.default)(_classNames, classes[\"grid-lg-\".concat(String(lg))], lg !== false), (0, _defineProperty2.default)(_classNames, classes[\"grid-xl-\".concat(String(xl))], xl !== false), _classNames), classNameProp);\n return _react.default.createElement(Component, (0, _extends2.default)({\n className: className\n }, other));\n}\n\nprocess.env.NODE_ENV !== \"production\" ? Grid.propTypes = {\n /**\r\n * Defines the `))) + (("`" + (`align-content` + "`")) + (` style property.\r\n * It's applied for all screen sizes.\r\n */\n alignContent: _propTypes.default.oneOf(['stretch', 'center', 'flex-start', 'flex-end', 'space-between', 'space-around']),\n\n /**\r\n * Defines the ` + ("`" + `align-items`)))) + ((("`" + ` style property.\r\n * It's applied for all screen sizes.\r\n */\n alignItems: _propTypes.default.oneOf(['flex-start', 'center', 'flex-end', 'stretch', 'baseline']),\n\n /**\r\n * The content of the component.\r\n */\n children: _propTypes.default.node,\n\n /**\r\n * Override or extend the styles applied to the component.\r\n * See [CSS API](#css-api) below for more details.\r\n */\n classes: _propTypes.default.object.isRequired,\n\n /**\r\n * @ignore\r\n */\n className: _propTypes.default.string,\n\n /**\r\n * The component used for the root node.\r\n * Either a string to use a DOM element or a component.\r\n */\n component: _utils.componentPropType,\n\n /**\r\n * If `) + ("`" + (`true` + "`"))) + ((`, the component will have the flex *container* behavior.\r\n * You should be wrapping *items* with a *container*.\r\n */\n container: _propTypes.default.bool,\n\n /**\r\n * Defines the ` + ("`" + `flex-direction`)) + ("`" + (` style property.\r\n * It is applied for all screen sizes.\r\n */\n direction: _propTypes.default.oneOf(['row', 'row-reverse', 'column', 'column-reverse']),\n\n /**\r\n * If ` + "`"))))))) + ((((((`true` + "`") + (`, the component will have the flex *item* behavior.\r\n * You should be wrapping *items* with a *container*.\r\n */\n item: _propTypes.default.bool,\n\n /**\r\n * Defines the ` + ("`" + `justify-content`))) + (("`" + (` style property.\r\n * It is applied for all screen sizes.\r\n */\n justify: _propTypes.default.oneOf(['flex-start', 'center', 'flex-end', 'space-between', 'space-around', 'space-evenly']),\n\n /**\r\n * Defines the number of grids the component is going to use.\r\n * It's applied for the ` + "`")) + (`lg` + ("`" + ` breakpoint and wider screens if not overridden.\r\n */\n lg: _propTypes.default.oneOf([false, 'auto', true, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]),\n\n /**\r\n * Defines the number of grids the component is going to use.\r\n * It's applied for the `)))) + ((("`" + `md`) + ("`" + (` breakpoint and wider screens if not overridden.\r\n */\n md: _propTypes.default.oneOf([false, 'auto', true, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]),\n\n /**\r\n * Defines the number of grids the component is going to use.\r\n * It's applied for the ` + "`"))) + ((`sm` + ("`" + ` breakpoint and wider screens if not overridden.\r\n */\n sm: _propTypes.default.oneOf([false, 'auto', true, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]),\n\n /**\r\n * Defines the space between the type `)) + ("`" + (`item` + "`"))))) + ((((` component.\r\n * It can only be used on a type ` + "`") + (`container` + ("`" + ` component.\r\n */\n spacing: _propTypes.default.oneOf(GUTTERS),\n\n /**\r\n * Defines the `))) + (("`" + (`flex-wrap` + "`")) + (` style property.\r\n * It's applied for all screen sizes.\r\n */\n wrap: _propTypes.default.oneOf(['nowrap', 'wrap', 'wrap-reverse']),\n\n /**\r\n * Defines the number of grids the component is going to use.\r\n * It's applied for the ` + ("`" + `xl`)))) + ((("`" + ` breakpoint and wider screens.\r\n */\n xl: _propTypes.default.oneOf([false, 'auto', true, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]),\n\n /**\r\n * Defines the number of grids the component is going to use.\r\n * It's applied for all the screen sizes with the lowest priority.\r\n */\n xs: _propTypes.default.oneOf([false, 'auto', true, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]),\n\n /**\r\n * If `) + ("`" + (`true` + "`"))) + ((`, it sets ` + ("`" + `min-width: 0`)) + ("`" + (` on the item.\r\n * Refer to the limitations section of the documentation to better understand the use case.\r\n */\n zeroMinWidth: _propTypes.default.bool\n} : void 0;\nGrid.defaultProps = {\n alignContent: 'stretch',\n alignItems: 'stretch',\n component: 'div',\n container: false,\n direction: 'row',\n item: false,\n justify: 'flex-start',\n lg: false,\n md: false,\n sm: false,\n spacing: 0,\n wrap: 'wrap',\n xl: false,\n xs: false,\n zeroMinWidth: false\n};\nvar StyledGrid = (0, _withStyles.default)(styles, {\n name: 'MuiGrid'\n})(Grid);\n\nif (process.env.NODE_ENV !== 'production') {\n var requireProp = (0, _requirePropFactory.default)('Grid');\n StyledGrid.propTypes = (0, _extends2.default)({}, StyledGrid.propTypes, {\n alignContent: requireProp('container'),\n alignItems: requireProp('container'),\n direction: requireProp('container'),\n justify: requireProp('container'),\n lg: requireProp('item'),\n md: requireProp('item'),\n sm: requireProp('item'),\n spacing: requireProp('container'),\n wrap: requireProp('container'),\n xs: requireProp('item'),\n zeroMinWidth: requireProp('zeroMinWidth')\n });\n}\n\nvar _default = StyledGrid;\nexports.default = _default;", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = exports.styles = void 0;\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/defineProperty\"));\n\nvar _objectWithoutProperties2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectWithoutProperties\"));\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _classnames = _interopRequireDefault(require(\"classnames\"));\n\nvar _utils = require(\"@material-ui/utils\");\n\nvar _withStyles = _interopRequireDefault(require(\"../styles/withStyles\"));\n\nvar _createBreakpoints = require(\"../styles/createBreakpoints\");\n\nvar _requirePropFactory = _interopRequireDefault(require(\"../utils/requirePropFactory\"));\n\n// A grid component using the following libs as inspiration.\n//\n// For the implementation:\n// - http://v4-alpha.getbootstrap.com/layout/flexbox-grid/\n// - https://github.com/kristoferjoseph/flexboxgrid/blob/master/src/css/flexboxgrid.css\n// - https://github.com/roylee0704/react-flexbox-grid\n// - https://material.angularjs.org/latest/layout/introduction\n//\n// Follow this flexbox Guide to better understand the underlying model:\n// - https://css-tricks.com/snippets/css/a-guide-to-flexbox/\nvar GUTTERS = [0, 8, 16, 24, 32, 40];\nvar GRID_SIZES = ['auto', true, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];\n\nfunction generateGrid(globalStyles, theme, breakpoint) {\n var styles = {};\n GRID_SIZES.forEach(function (size) {\n var key = \"grid-\".concat(breakpoint, \"-\").concat(size);\n\n if (size === true) {\n // For the auto layouting\n styles[key] = {\n flexBasis: 0,\n flexGrow: 1,\n maxWidth: '100%'\n };\n return;\n }\n\n if (size === 'auto') {\n styles[key] = {\n flexBasis: 'auto',\n flexGrow: 0,\n maxWidth: 'none'\n };\n return;\n } // Keep 7 significant numbers.\n\n\n var width = \"\".concat(Math.round(size / 12 * 10e7) / 10e5, \"%\"); // Close to the bootstrap implementation:\n // https://github.com/twbs/bootstrap/blob/8fccaa2439e97ec72a4b7dc42ccc1f649790adb0/scss/mixins/_grid.scss#L41\n\n styles[key] = {\n flexBasis: width,\n flexGrow: 0,\n maxWidth: width\n };\n }); // No need for a media query for the first size.\n\n if (breakpoint === 'xs') {\n (0, _extends2.default)(globalStyles, styles);\n } else {\n globalStyles[theme.breakpoints.up(breakpoint)] = styles;\n }\n}\n\nfunction generateGutter(theme, breakpoint) {\n var styles = {};\n GUTTERS.forEach(function (spacing, index) {\n if (index === 0) {\n // Skip the default style.\n return;\n }\n\n styles[\"spacing-\".concat(breakpoint, \"-\").concat(spacing)] = {\n margin: -spacing / 2,\n width: \"calc(100% + \".concat(spacing, \"px)\"),\n '& > $item': {\n padding: spacing / 2\n }\n };\n });\n return styles;\n} // Default CSS values\n// flex: '0 1 auto',\n// flexDirection: 'row',\n// alignItems: 'flex-start',\n// flexWrap: 'nowrap',\n// justifyContent: 'flex-start',\n\n\nvar styles = function styles(theme) {\n return (0, _extends2.default)({\n /* Styles applied to the root element if `)))) + ((("`" + (`container={true}` + "`")) + (`. */\n container: {\n boxSizing: 'border-box',\n display: 'flex',\n flexWrap: 'wrap',\n width: '100%'\n },\n\n /* Styles applied to the root element if ` + ("`" + `item={true}`))) + (("`" + (`. */\n item: {\n boxSizing: 'border-box',\n margin: '0' // For instance, it's useful when used with a ` + "`")) + ((`figure` + "`") + (` element.\n\n },\n\n /* Styles applied to the root element if ` + "`")))))) + (((((`zeroMinWidth={true}` + ("`" + `. */\n zeroMinWidth: {\n minWidth: 0\n },\n\n /* Styles applied to the root element if `)) + ("`" + (`direction=\"column\"` + "`"))) + ((`. */\n 'direction-xs-column': {\n flexDirection: 'column'\n },\n\n /* Styles applied to the root element if ` + ("`" + `direction=\"column-reverse\"`)) + ("`" + (`. */\n 'direction-xs-column-reverse': {\n flexDirection: 'column-reverse'\n },\n\n /* Styles applied to the root element if ` + "`")))) + (((`direction=\"rwo-reverse\"` + ("`" + `. */\n 'direction-xs-row-reverse': {\n flexDirection: 'row-reverse'\n },\n\n /* Styles applied to the root element if `)) + ("`" + (`wrap=\"nowrap\"` + "`"))) + ((`. */\n 'wrap-xs-nowrap': {\n flexWrap: 'nowrap'\n },\n\n /* Styles applied to the root element if ` + ("`" + `wrap=\"reverse\"`)) + (("`" + `. */\n 'wrap-xs-wrap-reverse': {\n flexWrap: 'wrap-reverse'\n },\n\n /* Styles applied to the root element if `) + ("`" + `alignItems=\"center\"`))))) + (((("`" + (`. */\n 'align-items-xs-center': {\n alignItems: 'center'\n },\n\n /* Styles applied to the root element if ` + "`")) + (`alignItems=\"flex-start\"` + ("`" + `. */\n 'align-items-xs-flex-start': {\n alignItems: 'flex-start'\n },\n\n /* Styles applied to the root element if `))) + (("`" + (`alignItems=\"flex-end\"` + "`")) + (`. */\n 'align-items-xs-flex-end': {\n alignItems: 'flex-end'\n },\n\n /* Styles applied to the root element if ` + ("`" + `alignItems=\"baseline\"`)))) + ((("`" + (`. */\n 'align-items-xs-baseline': {\n alignItems: 'baseline'\n },\n\n /* Styles applied to the root element if ` + "`")) + (`alignContent=\"center\"` + ("`" + `. */\n 'align-content-xs-center': {\n alignContent: 'center'\n },\n\n /* Styles applied to the root element if `))) + (("`" + (`alignContent=\"flex-start\"` + "`")) + ((`. */\n 'align-content-xs-flex-start': {\n alignContent: 'flex-start'\n },\n\n /* Styles applied to the root element if ` + "`") + (`alignContent=\"flex-end\"` + "`"))))))))) + ((((((((`. */\n 'align-content-xs-flex-end': {\n alignContent: 'flex-end'\n },\n\n /* Styles applied to the root element if ` + ("`" + `alignContent=\"space-between\"`)) + ("`" + (`. */\n 'align-content-xs-space-between': {\n alignContent: 'space-between'\n },\n\n /* Styles applied to the root element if ` + "`"))) + ((`alignContent=\"space-around\"` + ("`" + `. */\n 'align-content-xs-space-around': {\n alignContent: 'space-around'\n },\n\n /* Styles applied to the root element if `)) + ("`" + (`justify=\"center\"` + "`")))) + (((`. */\n 'justify-xs-center': {\n justifyContent: 'center'\n },\n\n /* Styles applied to the root element if ` + ("`" + `justify=\"flex-end\"`)) + ("`" + (`. */\n 'justify-xs-flex-end': {\n justifyContent: 'flex-end'\n },\n\n /* Styles applied to the root element if ` + "`"))) + ((`justify=\"space-between\"` + ("`" + `. */\n 'justify-xs-space-between': {\n justifyContent: 'space-between'\n },\n\n /* Styles applied to the root element if `)) + ("`" + (`justify=\"space-around\"` + "`"))))) + ((((`. */\n 'justify-xs-space-around': {\n justifyContent: 'space-around'\n },\n\n /* Styles applied to the root element if ` + ("`" + `justify=\"space-evenly\"`)) + ("`" + (`. */\n 'justify-xs-space-evenly': {\n justifyContent: 'space-evenly'\n }\n }, generateGutter(theme, 'xs'), _createBreakpoints.keys.reduce(function (accumulator, key) {\n // Use side effect over immutability for better performance.\n generateGrid(accumulator, theme, key);\n return accumulator;\n }, {}));\n};\n\nexports.styles = styles;\n\nfunction Grid(props) {\n var _classNames;\n\n var alignContent = props.alignContent,\n alignItems = props.alignItems,\n classes = props.classes,\n classNameProp = props.className,\n Component = props.component,\n container = props.container,\n direction = props.direction,\n item = props.item,\n justify = props.justify,\n lg = props.lg,\n md = props.md,\n sm = props.sm,\n spacing = props.spacing,\n wrap = props.wrap,\n xl = props.xl,\n xs = props.xs,\n zeroMinWidth = props.zeroMinWidth,\n other = (0, _objectWithoutProperties2.default)(props, [\"alignContent\", \"alignItems\", \"classes\", \"className\", \"component\", \"container\", \"direction\", \"item\", \"justify\", \"lg\", \"md\", \"sm\", \"spacing\", \"wrap\", \"xl\", \"xs\", \"zeroMinWidth\"]);\n var className = (0, _classnames.default)((_classNames = {}, (0, _defineProperty2.default)(_classNames, classes.container, container), (0, _defineProperty2.default)(_classNames, classes.item, item), (0, _defineProperty2.default)(_classNames, classes.zeroMinWidth, zeroMinWidth), (0, _defineProperty2.default)(_classNames, classes[\"spacing-xs-\".concat(String(spacing))], container && spacing !== 0), (0, _defineProperty2.default)(_classNames, classes[\"direction-xs-\".concat(String(direction))], direction !== Grid.defaultProps.direction), (0, _defineProperty2.default)(_classNames, classes[\"wrap-xs-\".concat(String(wrap))], wrap !== Grid.defaultProps.wrap), (0, _defineProperty2.default)(_classNames, classes[\"align-items-xs-\".concat(String(alignItems))], alignItems !== Grid.defaultProps.alignItems), (0, _defineProperty2.default)(_classNames, classes[\"align-content-xs-\".concat(String(alignContent))], alignContent !== Grid.defaultProps.alignContent), (0, _defineProperty2.default)(_classNames, classes[\"justify-xs-\".concat(String(justify))], justify !== Grid.defaultProps.justify), (0, _defineProperty2.default)(_classNames, classes[\"grid-xs-\".concat(String(xs))], xs !== false), (0, _defineProperty2.default)(_classNames, classes[\"grid-sm-\".concat(String(sm))], sm !== false), (0, _defineProperty2.default)(_classNames, classes[\"grid-md-\".concat(String(md))], md !== false), (0, _defineProperty2.default)(_classNames, classes[\"grid-lg-\".concat(String(lg))], lg !== false), (0, _defineProperty2.default)(_classNames, classes[\"grid-xl-\".concat(String(xl))], xl !== false), _classNames), classNameProp);\n return _react.default.createElement(Component, (0, _extends2.default)({\n className: className\n }, other));\n}\n\nprocess.env.NODE_ENV !== \"production\" ? Grid.propTypes = {\n /**\r\n * Defines the ` + "`"))) + ((`align-content` + ("`" + ` style property.\r\n * It's applied for all screen sizes.\r\n */\n alignContent: _propTypes.default.oneOf(['stretch', 'center', 'flex-start', 'flex-end', 'space-between', 'space-around']),\n\n /**\r\n * Defines the `)) + ("`" + (`align-items` + "`")))) + (((` style property.\r\n * It's applied for all screen sizes.\r\n */\n alignItems: _propTypes.default.oneOf(['flex-start', 'center', 'flex-end', 'stretch', 'baseline']),\n\n /**\r\n * The content of the component.\r\n */\n children: _propTypes.default.node,\n\n /**\r\n * Override or extend the styles applied to the component.\r\n * See [CSS API](#css-api) below for more details.\r\n */\n classes: _propTypes.default.object.isRequired,\n\n /**\r\n * @ignore\r\n */\n className: _propTypes.default.string,\n\n /**\r\n * The component used for the root node.\r\n * Either a string to use a DOM element or a component.\r\n */\n component: _utils.componentPropType,\n\n /**\r\n * If ` + ("`" + `true`)) + ("`" + (`, the component will have the flex *container* behavior.\r\n * You should be wrapping *items* with a *container*.\r\n */\n container: _propTypes.default.bool,\n\n /**\r\n * Defines the ` + "`"))) + ((`flex-direction` + ("`" + ` style property.\r\n * It is applied for all screen sizes.\r\n */\n direction: _propTypes.default.oneOf(['row', 'row-reverse', 'column', 'column-reverse']),\n\n /**\r\n * If `)) + (("`" + `true`) + ("`" + `, the component will have the flex *item* behavior.\r\n * You should be wrapping *items* with a *container*.\r\n */\n item: _propTypes.default.bool,\n\n /**\r\n * Defines the `)))))) + ((((("`" + (`justify-content` + "`")) + (` style property.\r\n * It is applied for all screen sizes.\r\n */\n justify: _propTypes.default.oneOf(['flex-start', 'center', 'flex-end', 'space-between', 'space-around', 'space-evenly']),\n\n /**\r\n * Defines the number of grids the component is going to use.\r\n * It's applied for the ` + ("`" + `lg`))) + (("`" + (` breakpoint and wider screens if not overridden.\r\n */\n lg: _propTypes.default.oneOf([false, 'auto', true, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]),\n\n /**\r\n * Defines the number of grids the component is going to use.\r\n * It's applied for the ` + "`")) + (`md` + ("`" + ` breakpoint and wider screens if not overridden.\r\n */\n md: _propTypes.default.oneOf([false, 'auto', true, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]),\n\n /**\r\n * Defines the number of grids the component is going to use.\r\n * It's applied for the `)))) + ((("`" + (`sm` + "`")) + (` breakpoint and wider screens if not overridden.\r\n */\n sm: _propTypes.default.oneOf([false, 'auto', true, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]),\n\n /**\r\n * Defines the space between the type ` + ("`" + `item`))) + (("`" + (` component.\r\n * It can only be used on a type ` + "`")) + ((`container` + "`") + (` component.\r\n */\n spacing: _propTypes.default.oneOf(GUTTERS),\n\n /**\r\n * Defines the ` + "`"))))) + ((((`flex-wrap` + ("`" + ` style property.\r\n * It's applied for all screen sizes.\r\n */\n wrap: _propTypes.default.oneOf(['nowrap', 'wrap', 'wrap-reverse']),\n\n /**\r\n * Defines the number of grids the component is going to use.\r\n * It's applied for the `)) + ("`" + (`xl` + "`"))) + ((` breakpoint and wider screens.\r\n */\n xl: _propTypes.default.oneOf([false, 'auto', true, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]),\n\n /**\r\n * Defines the number of grids the component is going to use.\r\n * It's applied for all the screen sizes with the lowest priority.\r\n */\n xs: _propTypes.default.oneOf([false, 'auto', true, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]),\n\n /**\r\n * If ` + ("`" + `true`)) + ("`" + (`, it sets ` + "`")))) + (((`min-width: 0` + ("`" + ` on the item.\r\n * Refer to the limitations section of the documentation to better understand the use case.\r\n */\n zeroMinWidth: _propTypes.default.bool\n} : void 0;\nGrid.defaultProps = {\n alignContent: 'stretch',\n alignItems: 'stretch',\n component: 'div',\n container: false,\n direction: 'row',\n item: false,\n justify: 'flex-start',\n lg: false,\n md: false,\n sm: false,\n spacing: 0,\n wrap: 'wrap',\n xl: false,\n xs: false,\n zeroMinWidth: false\n};\nvar StyledGrid = (0, _withStyles.default)(styles, {\n name: 'MuiGrid'\n})(Grid);\n\nif (process.env.NODE_ENV !== 'production') {\n var requireProp = (0, _requirePropFactory.default)('Grid');\n StyledGrid.propTypes = (0, _extends2.default)({}, StyledGrid.propTypes, {\n alignContent: requireProp('container'),\n alignItems: requireProp('container'),\n direction: requireProp('container'),\n justify: requireProp('container'),\n lg: requireProp('item'),\n md: requireProp('item'),\n sm: requireProp('item'),\n spacing: requireProp('container'),\n wrap: requireProp('container'),\n xs: requireProp('item'),\n zeroMinWidth: requireProp('zeroMinWidth')\n });\n}\n\nvar _default = StyledGrid;\nexports.default = _default;", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nObject.defineProperty(exports, \"default\", {\n enumerable: true,\n get: function get() {\n return _Grid.default;\n }\n});\n\nvar _Grid = _interopRequireDefault(require(\"./Grid\"));", - "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = exports.styles = void 0;\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/defineProperty\"));\n\nvar _objectWithoutProperties2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectWithoutProperties\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _classnames = _interopRequireDefault(require(\"classnames\"));\n\nvar _utils = require(\"@material-ui/utils\");\n\nvar _withStyles = _interopRequireDefault(require(\"../styles/withStyles\"));\n\nvar _helpers = require(\"../utils/helpers\");\n\nvar styles = function styles(theme) {\n return {\n /* Styles applied to the root element. */\n root: {\n userSelect: 'none',\n fontSize: 24,\n width: '1em',\n height: '1em',\n // Chrome fix for https://bugs.chromium.org/p/chromium/issues/detail?id=820541\n // To remove at some point.\n overflow: 'hidden',\n flexShrink: 0\n },\n\n /* Styles applied to the root element if ` + "`")))))) + (((((`color=\"primary\"` + "`") + (`. */\n colorPrimary: {\n color: theme.palette.primary.main\n },\n\n /* Styles applied to the root element if ` + ("`" + `color=\"secondary\"`))) + (("`" + (`. */\n colorSecondary: {\n color: theme.palette.secondary.main\n },\n\n /* Styles applied to the root element if ` + "`")) + (`color=\"action\"` + ("`" + `. */\n colorAction: {\n color: theme.palette.action.active\n },\n\n /* Styles applied to the root element if `)))) + ((("`" + `color=\"error\"`) + ("`" + (`. */\n colorError: {\n color: theme.palette.error.main\n },\n\n /* Styles applied to the root element if ` + "`"))) + ((`color=\"disabled\"` + ("`" + `. */\n colorDisabled: {\n color: theme.palette.action.disabled\n },\n fontSizeInherit: {\n fontSize: 'inherit'\n },\n\n /* Styles applied to the root element if `)) + ("`" + (`fontSize=\"small\"` + "`"))))) + ((((`. */\n fontSizeSmall: {\n fontSize: 20\n },\n\n /* Styles applied to the root element if ` + "`") + (`fontSize=\"large\"` + ("`" + `. */\n fontSizeLarge: {\n fontSize: 36\n }\n };\n};\n\nexports.styles = styles;\n\nfunction Icon(props) {\n var _classNames;\n\n var children = props.children,\n classes = props.classes,\n className = props.className,\n color = props.color,\n Component = props.component,\n fontSize = props.fontSize,\n other = (0, _objectWithoutProperties2.default)(props, [\"children\", \"classes\", \"className\", \"color\", \"component\", \"fontSize\"]);\n return _react.default.createElement(Component, (0, _extends2.default)({\n className: (0, _classnames.default)('material-icons', classes.root, (_classNames = {}, (0, _defineProperty2.default)(_classNames, classes[\"color\".concat((0, _helpers.capitalize)(color))], color !== 'inherit'), (0, _defineProperty2.default)(_classNames, classes[\"fontSize\".concat((0, _helpers.capitalize)(fontSize))], fontSize !== 'default'), _classNames), className),\n \"aria-hidden\": \"true\"\n }, other), children);\n}\n\nprocess.env.NODE_ENV !== \"production\" ? Icon.propTypes = {\n /**\r\n * The name of the icon font ligature.\r\n */\n children: _propTypes.default.node,\n\n /**\r\n * Override or extend the styles applied to the component.\r\n * See [CSS API](#css-api) below for more details.\r\n */\n classes: _propTypes.default.object.isRequired,\n\n /**\r\n * @ignore\r\n */\n className: _propTypes.default.string,\n\n /**\r\n * The color of the component. It supports those theme colors that make sense for this component.\r\n */\n color: _propTypes.default.oneOf(['inherit', 'primary', 'secondary', 'action', 'error', 'disabled']),\n\n /**\r\n * The component used for the root node.\r\n * Either a string to use a DOM element or a component.\r\n */\n component: _utils.componentPropType,\n\n /**\r\n * The fontSize applied to the icon. Defaults to 24px, but can be configure to inherit font size.\r\n */\n fontSize: _propTypes.default.oneOf(['inherit', 'default', 'small', 'large'])\n} : void 0;\nIcon.defaultProps = {\n color: 'inherit',\n component: 'span',\n fontSize: 'default'\n};\nIcon.muiName = 'Icon';\n\nvar _default = (0, _withStyles.default)(styles, {\n name: 'MuiIcon'\n})(Icon);\n\nexports.default = _default;", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = exports.styles = void 0;\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/defineProperty\"));\n\nvar _objectWithoutProperties2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectWithoutProperties\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _classnames = _interopRequireDefault(require(\"classnames\"));\n\nvar _utils = require(\"@material-ui/utils\");\n\nvar _withStyles = _interopRequireDefault(require(\"../styles/withStyles\"));\n\nvar _helpers = require(\"../utils/helpers\");\n\nvar styles = function styles(theme) {\n return {\n /* Styles applied to the root element. */\n root: {\n userSelect: 'none',\n fontSize: 24,\n width: '1em',\n height: '1em',\n // Chrome fix for https://bugs.chromium.org/p/chromium/issues/detail?id=820541\n // To remove at some point.\n overflow: 'hidden',\n flexShrink: 0\n },\n\n /* Styles applied to the root element if `)) + ("`" + (`color=\"primary\"` + "`"))) + ((`. */\n colorPrimary: {\n color: theme.palette.primary.main\n },\n\n /* Styles applied to the root element if ` + ("`" + `color=\"secondary\"`)) + (("`" + `. */\n colorSecondary: {\n color: theme.palette.secondary.main\n },\n\n /* Styles applied to the root element if `) + ("`" + `color=\"action\"`))))))) + (((((("`" + (`. */\n colorAction: {\n color: theme.palette.action.active\n },\n\n /* Styles applied to the root element if ` + "`")) + (`color=\"error\"` + ("`" + `. */\n colorError: {\n color: theme.palette.error.main\n },\n\n /* Styles applied to the root element if `))) + (("`" + (`color=\"disabled\"` + "`")) + (`. */\n colorDisabled: {\n color: theme.palette.action.disabled\n },\n fontSizeInherit: {\n fontSize: 'inherit'\n },\n\n /* Styles applied to the root element if ` + ("`" + `fontSize=\"small\"`)))) + ((("`" + (`. */\n fontSizeSmall: {\n fontSize: 20\n },\n\n /* Styles applied to the root element if ` + "`")) + (`fontSize=\"large\"` + ("`" + `. */\n fontSizeLarge: {\n fontSize: 36\n }\n };\n};\n\nexports.styles = styles;\n\nfunction Icon(props) {\n var _classNames;\n\n var children = props.children,\n classes = props.classes,\n className = props.className,\n color = props.color,\n Component = props.component,\n fontSize = props.fontSize,\n other = (0, _objectWithoutProperties2.default)(props, [\"children\", \"classes\", \"className\", \"color\", \"component\", \"fontSize\"]);\n return _react.default.createElement(Component, (0, _extends2.default)({\n className: (0, _classnames.default)('material-icons', classes.root, (_classNames = {}, (0, _defineProperty2.default)(_classNames, classes[\"color\".concat((0, _helpers.capitalize)(color))], color !== 'inherit'), (0, _defineProperty2.default)(_classNames, classes[\"fontSize\".concat((0, _helpers.capitalize)(fontSize))], fontSize !== 'default'), _classNames), className),\n \"aria-hidden\": \"true\"\n }, other), children);\n}\n\nprocess.env.NODE_ENV !== \"production\" ? Icon.propTypes = {\n /**\r\n * The name of the icon font ligature.\r\n */\n children: _propTypes.default.node,\n\n /**\r\n * Override or extend the styles applied to the component.\r\n * See [CSS API](#css-api) below for more details.\r\n */\n classes: _propTypes.default.object.isRequired,\n\n /**\r\n * @ignore\r\n */\n className: _propTypes.default.string,\n\n /**\r\n * The color of the component. It supports those theme colors that make sense for this component.\r\n */\n color: _propTypes.default.oneOf(['inherit', 'primary', 'secondary', 'action', 'error', 'disabled']),\n\n /**\r\n * The component used for the root node.\r\n * Either a string to use a DOM element or a component.\r\n */\n component: _utils.componentPropType,\n\n /**\r\n * The fontSize applied to the icon. Defaults to 24px, but can be configure to inherit font size.\r\n */\n fontSize: _propTypes.default.oneOf(['inherit', 'default', 'small', 'large'])\n} : void 0;\nIcon.defaultProps = {\n color: 'inherit',\n component: 'span',\n fontSize: 'default'\n};\nIcon.muiName = 'Icon';\n\nvar _default = (0, _withStyles.default)(styles, {\n name: 'MuiIcon'\n})(Icon);\n\nexports.default = _default;", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nObject.defineProperty(exports, \"default\", {\n enumerable: true,\n get: function get() {\n return _Icon.default;\n }\n});\n\nvar _Icon = _interopRequireDefault(require(\"./Icon\"));", - "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = exports.styles = void 0;\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/defineProperty\"));\n\nvar _objectWithoutProperties2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectWithoutProperties\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _classnames = _interopRequireDefault(require(\"classnames\"));\n\nvar _utils = require(\"@material-ui/utils\");\n\nvar _withStyles = _interopRequireDefault(require(\"../styles/withStyles\"));\n\nvar _colorManipulator = require(\"../styles/colorManipulator\");\n\nvar _ButtonBase = _interopRequireDefault(require(\"../ButtonBase\"));\n\nvar _helpers = require(\"../utils/helpers\");\n\n// @inheritedComponent ButtonBase\nvar styles = function styles(theme) {\n return {\n /* Styles applied to the root element. */\n root: {\n textAlign: 'center',\n flex: '0 0 auto',\n fontSize: theme.typography.pxToRem(24),\n padding: 12,\n borderRadius: '50%',\n overflow: 'visible',\n // Explicitly set the default value to solve a bug on IE 11.\n color: theme.palette.action.active,\n transition: theme.transitions.create('background-color', {\n duration: theme.transitions.duration.shortest\n }),\n '&:hover': {\n backgroundColor: (0, _colorManipulator.fade)(theme.palette.action.active, theme.palette.action.hoverOpacity),\n // Reset on touch devices, it doesn't add specificity\n '@media (hover: none)': {\n backgroundColor: 'transparent'\n },\n '&$disabled': {\n backgroundColor: 'transparent'\n }\n },\n '&$disabled': {\n color: theme.palette.action.disabled\n }\n },\n\n /* Styles applied to the root element if `))) + (("`" + (`color=\"inherit\"` + "`")) + (`. */\n colorInherit: {\n color: 'inherit'\n },\n\n /* Styles applied to the root element if ` + ("`" + `color=\"primary\"`)))) + ((("`" + (`. */\n colorPrimary: {\n color: theme.palette.primary.main,\n '&:hover': {\n backgroundColor: (0, _colorManipulator.fade)(theme.palette.primary.main, theme.palette.action.hoverOpacity),\n // Reset on touch devices, it doesn't add specificity\n '@media (hover: none)': {\n backgroundColor: 'transparent'\n }\n }\n },\n\n /* Styles applied to the root element if ` + "`")) + (`color=\"secondary\"` + ("`" + `. */\n colorSecondary: {\n color: theme.palette.secondary.main,\n '&:hover': {\n backgroundColor: (0, _colorManipulator.fade)(theme.palette.secondary.main, theme.palette.action.hoverOpacity),\n // Reset on touch devices, it doesn't add specificity\n '@media (hover: none)': {\n backgroundColor: 'transparent'\n }\n }\n },\n\n /* Styles applied to the root element if `))) + (("`" + (`disabled={true}` + "`")) + (`. */\n disabled: {},\n\n /* Styles applied to the children container element. */\n label: {\n width: '100%',\n display: 'flex',\n alignItems: 'inherit',\n justifyContent: 'inherit'\n }\n };\n};\n/**\r\n * Refer to the [Icons](/style/icons/) section of the documentation\r\n * regarding the available icon options.\r\n */\n\n\nexports.styles = styles;\n\nfunction IconButton(props) {\n var _classNames;\n\n var children = props.children,\n classes = props.classes,\n className = props.className,\n color = props.color,\n disabled = props.disabled,\n other = (0, _objectWithoutProperties2.default)(props, [\"children\", \"classes\", \"className\", \"color\", \"disabled\"]);\n return _react.default.createElement(_ButtonBase.default, (0, _extends2.default)({\n className: (0, _classnames.default)(classes.root, (_classNames = {}, (0, _defineProperty2.default)(_classNames, classes[\"color\".concat((0, _helpers.capitalize)(color))], color !== 'default'), (0, _defineProperty2.default)(_classNames, classes.disabled, disabled), _classNames), className),\n centerRipple: true,\n focusRipple: true,\n disabled: disabled\n }, other), _react.default.createElement(\"span\", {\n className: classes.label\n }, children));\n}\n\nprocess.env.NODE_ENV !== \"production\" ? IconButton.propTypes = {\n /**\r\n * The icon element.\r\n */\n children: (0, _utils.chainPropTypes)(_propTypes.default.node, function (props) {\n var found = _react.default.Children.toArray(props.children).some(function (child) {\n return _react.default.isValidElement(child) && child.props.onClick;\n });\n\n if (found) {\n return new Error(['Material-UI: you are providing an onClick event listener ' + 'to a child of a button element.', 'Firefox will never trigger the event.', 'You should move the onClick listener to the parent button element.', 'https://github.com/mui-org/material-ui/issues/13957', // Change error message slightly on every check to prevent caching when testing\n // which would not trigger console errors on subsequent fails\n process.env.NODE_ENV === 'test' ? Date.now() : ''].join('\\n'));\n }\n\n return null;\n }),\n\n /**\r\n * Override or extend the styles applied to the component.\r\n * See [CSS API](#css-api) below for more details.\r\n */\n classes: _propTypes.default.object.isRequired,\n\n /**\r\n * @ignore\r\n */\n className: _propTypes.default.string,\n\n /**\r\n * The color of the component. It supports those theme colors that make sense for this component.\r\n */\n color: _propTypes.default.oneOf(['default', 'inherit', 'primary', 'secondary']),\n\n /**\r\n * If ` + ("`" + `true`)))))))) + ((((((("`" + `, the button will be disabled.\r\n */\n disabled: _propTypes.default.bool,\n\n /**\r\n * If `) + ("`" + (`true` + "`"))) + ((`, the ripple will be disabled.\r\n */\n disableRipple: _propTypes.default.bool\n} : void 0;\nIconButton.defaultProps = {\n color: 'default',\n disabled: false\n};\n\nvar _default = (0, _withStyles.default)(styles, {\n name: 'MuiIconButton'\n})(IconButton);\n\nexports.default = _default;", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = exports.styles = void 0;\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/defineProperty\"));\n\nvar _objectWithoutProperties2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectWithoutProperties\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _classnames = _interopRequireDefault(require(\"classnames\"));\n\nvar _utils = require(\"@material-ui/utils\");\n\nvar _withStyles = _interopRequireDefault(require(\"../styles/withStyles\"));\n\nvar _colorManipulator = require(\"../styles/colorManipulator\");\n\nvar _ButtonBase = _interopRequireDefault(require(\"../ButtonBase\"));\n\nvar _helpers = require(\"../utils/helpers\");\n\n// @inheritedComponent ButtonBase\nvar styles = function styles(theme) {\n return {\n /* Styles applied to the root element. */\n root: {\n textAlign: 'center',\n flex: '0 0 auto',\n fontSize: theme.typography.pxToRem(24),\n padding: 12,\n borderRadius: '50%',\n overflow: 'visible',\n // Explicitly set the default value to solve a bug on IE 11.\n color: theme.palette.action.active,\n transition: theme.transitions.create('background-color', {\n duration: theme.transitions.duration.shortest\n }),\n '&:hover': {\n backgroundColor: (0, _colorManipulator.fade)(theme.palette.action.active, theme.palette.action.hoverOpacity),\n // Reset on touch devices, it doesn't add specificity\n '@media (hover: none)': {\n backgroundColor: 'transparent'\n },\n '&$disabled': {\n backgroundColor: 'transparent'\n }\n },\n '&$disabled': {\n color: theme.palette.action.disabled\n }\n },\n\n /* Styles applied to the root element if `))) + (("`" + (`color=\"inherit\"` + "`")) + (`. */\n colorInherit: {\n color: 'inherit'\n },\n\n /* Styles applied to the root element if ` + ("`" + `color=\"primary\"`))))) + (((("`" + (`. */\n colorPrimary: {\n color: theme.palette.primary.main,\n '&:hover': {\n backgroundColor: (0, _colorManipulator.fade)(theme.palette.primary.main, theme.palette.action.hoverOpacity),\n // Reset on touch devices, it doesn't add specificity\n '@media (hover: none)': {\n backgroundColor: 'transparent'\n }\n }\n },\n\n /* Styles applied to the root element if ` + "`")) + (`color=\"secondary\"` + ("`" + `. */\n colorSecondary: {\n color: theme.palette.secondary.main,\n '&:hover': {\n backgroundColor: (0, _colorManipulator.fade)(theme.palette.secondary.main, theme.palette.action.hoverOpacity),\n // Reset on touch devices, it doesn't add specificity\n '@media (hover: none)': {\n backgroundColor: 'transparent'\n }\n }\n },\n\n /* Styles applied to the root element if `))) + (("`" + (`disabled={true}` + "`")) + (`. */\n disabled: {},\n\n /* Styles applied to the children container element. */\n label: {\n width: '100%',\n display: 'flex',\n alignItems: 'inherit',\n justifyContent: 'inherit'\n }\n };\n};\n/**\r\n * Refer to the [Icons](/style/icons/) section of the documentation\r\n * regarding the available icon options.\r\n */\n\n\nexports.styles = styles;\n\nfunction IconButton(props) {\n var _classNames;\n\n var children = props.children,\n classes = props.classes,\n className = props.className,\n color = props.color,\n disabled = props.disabled,\n other = (0, _objectWithoutProperties2.default)(props, [\"children\", \"classes\", \"className\", \"color\", \"disabled\"]);\n return _react.default.createElement(_ButtonBase.default, (0, _extends2.default)({\n className: (0, _classnames.default)(classes.root, (_classNames = {}, (0, _defineProperty2.default)(_classNames, classes[\"color\".concat((0, _helpers.capitalize)(color))], color !== 'default'), (0, _defineProperty2.default)(_classNames, classes.disabled, disabled), _classNames), className),\n centerRipple: true,\n focusRipple: true,\n disabled: disabled\n }, other), _react.default.createElement(\"span\", {\n className: classes.label\n }, children));\n}\n\nprocess.env.NODE_ENV !== \"production\" ? IconButton.propTypes = {\n /**\r\n * The icon element.\r\n */\n children: (0, _utils.chainPropTypes)(_propTypes.default.node, function (props) {\n var found = _react.default.Children.toArray(props.children).some(function (child) {\n return _react.default.isValidElement(child) && child.props.onClick;\n });\n\n if (found) {\n return new Error(['Material-UI: you are providing an onClick event listener ' + 'to a child of a button element.', 'Firefox will never trigger the event.', 'You should move the onClick listener to the parent button element.', 'https://github.com/mui-org/material-ui/issues/13957', // Change error message slightly on every check to prevent caching when testing\n // which would not trigger console errors on subsequent fails\n process.env.NODE_ENV === 'test' ? Date.now() : ''].join('\\n'));\n }\n\n return null;\n }),\n\n /**\r\n * Override or extend the styles applied to the component.\r\n * See [CSS API](#css-api) below for more details.\r\n */\n classes: _propTypes.default.object.isRequired,\n\n /**\r\n * @ignore\r\n */\n className: _propTypes.default.string,\n\n /**\r\n * The color of the component. It supports those theme colors that make sense for this component.\r\n */\n color: _propTypes.default.oneOf(['default', 'inherit', 'primary', 'secondary']),\n\n /**\r\n * If ` + ("`" + `true`)))) + ((("`" + (`, the button will be disabled.\r\n */\n disabled: _propTypes.default.bool,\n\n /**\r\n * If ` + "`")) + (`true` + ("`" + `, the ripple will be disabled.\r\n */\n disableRipple: _propTypes.default.bool\n} : void 0;\nIconButton.defaultProps = {\n color: 'default',\n disabled: false\n};\n\nvar _default = (0, _withStyles.default)(styles, {\n name: 'MuiIconButton'\n})(IconButton);\n\nexports.default = _default;", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nObject.defineProperty(exports, \"default\", {\n enumerable: true,\n get: function get() {\n return _IconButton.default;\n }\n});\n\nvar _IconButton = _interopRequireDefault(require(\"./IconButton\"));", - "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = exports.styles = void 0;\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/defineProperty\"));\n\nvar _objectWithoutProperties2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectWithoutProperties\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _classnames = _interopRequireDefault(require(\"classnames\"));\n\nvar _utils = require(\"@material-ui/utils\");\n\nvar _withStyles = _interopRequireDefault(require(\"../styles/withStyles\"));\n\nvar _ListContext = _interopRequireDefault(require(\"./ListContext\"));\n\nvar styles = {\n /* Styles applied to the root element. */\n root: {\n listStyle: 'none',\n margin: 0,\n padding: 0,\n position: 'relative'\n },\n\n /* Styles applied to the root element if ` + ("`" + `disablePadding={false}`)) + ("`" + (`. */\n padding: {\n paddingTop: 8,\n paddingBottom: 8\n },\n\n /* Styles applied to the root element if ` + "`")))) + (((`dense={true}` + "`") + (` & ` + ("`" + `disablePadding={false}`))) + (("`" + (`. */\n dense: {\n paddingTop: 4,\n paddingBottom: 4\n },\n\n /* Styles applied to the root element if a ` + "`")) + (`subheader` + ("`" + ` is provided. */\n subheader: {\n paddingTop: 0\n }\n};\nexports.styles = styles;\n\nfunction List(props) {\n var _classNames;\n\n var children = props.children,\n classes = props.classes,\n className = props.className,\n Component = props.component,\n dense = props.dense,\n disablePadding = props.disablePadding,\n subheader = props.subheader,\n other = (0, _objectWithoutProperties2.default)(props, [\"children\", \"classes\", \"className\", \"component\", \"dense\", \"disablePadding\", \"subheader\"]);\n return _react.default.createElement(Component, (0, _extends2.default)({\n className: (0, _classnames.default)(classes.root, (_classNames = {}, (0, _defineProperty2.default)(_classNames, classes.dense, dense && !disablePadding), (0, _defineProperty2.default)(_classNames, classes.padding, !disablePadding), (0, _defineProperty2.default)(_classNames, classes.subheader, subheader), _classNames), className)\n }, other), _react.default.createElement(_ListContext.default.Provider, {\n value: {\n dense: dense\n }\n }, subheader, children));\n}\n\nprocess.env.NODE_ENV !== \"production\" ? List.propTypes = {\n /**\r\n * The content of the component.\r\n */\n children: _propTypes.default.node,\n\n /**\r\n * Override or extend the styles applied to the component.\r\n * See [CSS API](#css-api) below for more details.\r\n */\n classes: _propTypes.default.object.isRequired,\n\n /**\r\n * @ignore\r\n */\n className: _propTypes.default.string,\n\n /**\r\n * The component used for the root node.\r\n * Either a string to use a DOM element or a component.\r\n */\n component: _utils.componentPropType,\n\n /**\r\n * If `))))) + (((("`" + `true`) + ("`" + (`, compact vertical padding designed for keyboard and mouse input will be used for\r\n * the list and list items. The property is available to descendant components as the\r\n * ` + "`"))) + ((`dense` + ("`" + ` context.\r\n */\n dense: _propTypes.default.bool,\n\n /**\r\n * If `)) + ("`" + (`true` + "`")))) + (((`, vertical padding will be removed from the list.\r\n */\n disablePadding: _propTypes.default.bool,\n\n /**\r\n * The content of the subheader, normally ` + "`") + (`ListSubheader` + ("`" + `.\r\n */\n subheader: _propTypes.default.node\n} : void 0;\nList.defaultProps = {\n component: 'ul',\n dense: false,\n disablePadding: false\n};\n\nvar _default = (0, _withStyles.default)(styles, {\n name: 'MuiList'\n})(List);\n\nexports.default = _default;", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = exports.styles = void 0;\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/defineProperty\"));\n\nvar _objectWithoutProperties2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectWithoutProperties\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _classnames = _interopRequireDefault(require(\"classnames\"));\n\nvar _utils = require(\"@material-ui/utils\");\n\nvar _withStyles = _interopRequireDefault(require(\"../styles/withStyles\"));\n\nvar _ListContext = _interopRequireDefault(require(\"./ListContext\"));\n\nvar styles = {\n /* Styles applied to the root element. */\n root: {\n listStyle: 'none',\n margin: 0,\n padding: 0,\n position: 'relative'\n },\n\n /* Styles applied to the root element if `))) + (("`" + (`disablePadding={false}` + "`")) + ((`. */\n padding: {\n paddingTop: 8,\n paddingBottom: 8\n },\n\n /* Styles applied to the root element if ` + "`") + (`dense={true}` + "`")))))) + (((((` & ` + ("`" + `disablePadding={false}`)) + ("`" + (`. */\n dense: {\n paddingTop: 4,\n paddingBottom: 4\n },\n\n /* Styles applied to the root element if a ` + "`"))) + ((`subheader` + ("`" + ` is provided. */\n subheader: {\n paddingTop: 0\n }\n};\nexports.styles = styles;\n\nfunction List(props) {\n var _classNames;\n\n var children = props.children,\n classes = props.classes,\n className = props.className,\n Component = props.component,\n dense = props.dense,\n disablePadding = props.disablePadding,\n subheader = props.subheader,\n other = (0, _objectWithoutProperties2.default)(props, [\"children\", \"classes\", \"className\", \"component\", \"dense\", \"disablePadding\", \"subheader\"]);\n return _react.default.createElement(Component, (0, _extends2.default)({\n className: (0, _classnames.default)(classes.root, (_classNames = {}, (0, _defineProperty2.default)(_classNames, classes.dense, dense && !disablePadding), (0, _defineProperty2.default)(_classNames, classes.padding, !disablePadding), (0, _defineProperty2.default)(_classNames, classes.subheader, subheader), _classNames), className)\n }, other), _react.default.createElement(_ListContext.default.Provider, {\n value: {\n dense: dense\n }\n }, subheader, children));\n}\n\nprocess.env.NODE_ENV !== \"production\" ? List.propTypes = {\n /**\r\n * The content of the component.\r\n */\n children: _propTypes.default.node,\n\n /**\r\n * Override or extend the styles applied to the component.\r\n * See [CSS API](#css-api) below for more details.\r\n */\n classes: _propTypes.default.object.isRequired,\n\n /**\r\n * @ignore\r\n */\n className: _propTypes.default.string,\n\n /**\r\n * The component used for the root node.\r\n * Either a string to use a DOM element or a component.\r\n */\n component: _utils.componentPropType,\n\n /**\r\n * If `)) + ("`" + (`true` + "`")))) + (((`, compact vertical padding designed for keyboard and mouse input will be used for\r\n * the list and list items. The property is available to descendant components as the\r\n * ` + ("`" + `dense`)) + ("`" + (` context.\r\n */\n dense: _propTypes.default.bool,\n\n /**\r\n * If ` + "`"))) + ((`true` + ("`" + `, vertical padding will be removed from the list.\r\n */\n disablePadding: _propTypes.default.bool,\n\n /**\r\n * The content of the subheader, normally `)) + (("`" + `ListSubheader`) + ("`" + `.\r\n */\n subheader: _propTypes.default.node\n} : void 0;\nList.defaultProps = {\n component: 'ul',\n dense: false,\n disablePadding: false\n};\n\nvar _default = (0, _withStyles.default)(styles, {\n name: 'MuiList'\n})(List);\n\nexports.default = _default;", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\n/**\r\n * @ignore - internal component.\r\n */\nvar ListContext = _react.default.createContext({});\n\nvar _default = ListContext;\nexports.default = _default;", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nObject.defineProperty(exports, \"default\", {\n enumerable: true,\n get: function get() {\n return _List.default;\n }\n});\n\nvar _List = _interopRequireDefault(require(\"./List\"));", - "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = exports.styles = void 0;\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/defineProperty\"));\n\nvar _objectWithoutProperties2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectWithoutProperties\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _classnames = _interopRequireDefault(require(\"classnames\"));\n\nvar _utils = require(\"@material-ui/utils\");\n\nvar _withStyles = _interopRequireDefault(require(\"../styles/withStyles\"));\n\nvar _ButtonBase = _interopRequireDefault(require(\"../ButtonBase\"));\n\nvar _reactHelpers = require(\"../utils/reactHelpers\");\n\nvar _MergeListContext = _interopRequireDefault(require(\"./MergeListContext\"));\n\nvar styles = function styles(theme) {\n return {\n /* Styles applied to the (normally root) `))) + (("`" + (`component` + "`")) + (` element. May be wrapped by a ` + ("`" + `container`)))))) + ((((("`" + `. */\n root: {\n display: 'flex',\n justifyContent: 'flex-start',\n alignItems: 'center',\n position: 'relative',\n textDecoration: 'none',\n width: '100%',\n boxSizing: 'border-box',\n textAlign: 'left',\n paddingTop: 11,\n // To use 10px in v4\n paddingBottom: 11,\n // To use 10px in v4\n '&$selected, &$selected:hover, &$selected:focus': {\n backgroundColor: theme.palette.action.selected\n }\n },\n\n /* Styles applied to the `) + ("`" + (`container` + "`"))) + ((` element if ` + ("`" + `children`)) + ("`" + (` includes ` + "`")))) + (((`ListItemSecondaryAction` + "`") + (`. */\n container: {\n position: 'relative'\n },\n // To remove in v4\n\n /* Styles applied to the ` + ("`" + `component`))) + (("`" + (`'s ` + "`")) + (`focusVisibleClassName` + ("`" + ` property if `))))) + (((("`" + `button={true}`) + ("`" + (`. */\n focusVisible: {},\n\n /* Legacy styles applied to the root element. Use ` + "`"))) + ((`root` + ("`" + ` instead. */\n default: {},\n\n /* Styles applied to the `)) + ("`" + (`component` + "`")))) + (((` element if ` + ("`" + `dense={true}`)) + ("`" + (` or ` + "`"))) + ((`children` + ("`" + ` includes `)) + ("`" + (`Avatar` + "`"))))))) + ((((((`. */\n dense: {\n paddingTop: 8,\n paddingBottom: 8\n },\n\n /* Styles applied to the ` + "`") + (`component` + ("`" + ` element if `))) + (("`" + (`alignItems=\"flex-start\"` + "`")) + (`. */\n alignItemsFlexStart: {\n alignItems: 'flex-start'\n },\n\n /* Styles applied to the inner ` + ("`" + `component`)))) + ((("`" + ` element if `) + ("`" + (`disabled={true}` + "`"))) + ((`. */\n disabled: {\n opacity: 0.5\n },\n\n /* Styles applied to the inner ` + ("`" + `component`)) + ("`" + (` element if ` + "`"))))) + ((((`divider={true}` + "`") + (`. */\n divider: {\n borderBottom: \"1px solid \".concat(theme.palette.divider),\n backgroundClip: 'padding-box'\n },\n\n /* Styles applied to the inner ` + ("`" + `component`))) + (("`" + (` element if ` + "`")) + (`disableGutters={false}` + ("`" + `. */\n gutters: {\n paddingLeft: 16,\n paddingRight: 16\n },\n\n /* Styles applied to the inner `)))) + ((("`" + `component`) + ("`" + (` element if ` + "`"))) + ((`button={true}` + ("`" + `. */\n button: {\n transition: theme.transitions.create('background-color', {\n duration: theme.transitions.duration.shortest\n }),\n '&:hover': {\n textDecoration: 'none',\n backgroundColor: theme.palette.action.hover,\n // Reset on touch devices, it doesn't add specificity\n '@media (hover: none)': {\n backgroundColor: 'transparent'\n }\n },\n '&:focus': {\n backgroundColor: theme.palette.action.hover\n }\n },\n\n /* Styles applied to the `)) + ("`" + (`component` + "`")))))) + (((((` element if ` + "`") + (`children` + ("`" + ` includes `))) + (("`" + (`ListItemSecondaryAction` + "`")) + (`. */\n secondaryAction: {\n // Add some space to avoid collision as ` + ("`" + `ListItemSecondaryAction`)))) + ((("`" + `\n // is absolutely positioned.\n paddingRight: 32\n },\n\n /* Styles applied to the root element if `) + ("`" + (`selected={true}` + "`"))) + ((`. */\n selected: {}\n };\n};\n/**\r\n * Uses an additional container component if ` + ("`" + `ListItemSecondaryAction`)) + ("`" + (` is the last child.\r\n */\n\n\nexports.styles = styles;\n\nfunction ListItem(props) {\n var alignItems = props.alignItems,\n button = props.button,\n childrenProp = props.children,\n classes = props.classes,\n classNameProp = props.className,\n componentProp = props.component,\n ContainerComponent = props.ContainerComponent,\n _props$ContainerProps = props.ContainerProps;\n _props$ContainerProps = _props$ContainerProps === void 0 ? {} : _props$ContainerProps;\n var ContainerClassName = _props$ContainerProps.className,\n ContainerProps = (0, _objectWithoutProperties2.default)(_props$ContainerProps, [\"className\"]),\n denseProp = props.dense,\n disabled = props.disabled,\n disableGutters = props.disableGutters,\n divider = props.divider,\n focusVisibleClassName = props.focusVisibleClassName,\n selected = props.selected,\n other = (0, _objectWithoutProperties2.default)(props, [\"alignItems\", \"button\", \"children\", \"classes\", \"className\", \"component\", \"ContainerComponent\", \"ContainerProps\", \"dense\", \"disabled\", \"disableGutters\", \"divider\", \"focusVisibleClassName\", \"selected\"]);\n return _react.default.createElement(_MergeListContext.default, {\n dense: denseProp,\n alignItems: alignItems\n }, function (_ref) {\n var _classNames;\n\n var dense = _ref.dense;\n\n var children = _react.default.Children.toArray(childrenProp);\n\n var hasAvatar = children.some(function (value) {\n return (0, _reactHelpers.isMuiElement)(value, ['ListItemAvatar']);\n });\n var hasSecondaryAction = children.length && (0, _reactHelpers.isMuiElement)(children[children.length - 1], ['ListItemSecondaryAction']);\n var className = (0, _classnames.default)(classes.root, classes.default, (_classNames = {}, (0, _defineProperty2.default)(_classNames, classes.dense, dense || hasAvatar), (0, _defineProperty2.default)(_classNames, classes.gutters, !disableGutters), (0, _defineProperty2.default)(_classNames, classes.divider, divider), (0, _defineProperty2.default)(_classNames, classes.disabled, disabled), (0, _defineProperty2.default)(_classNames, classes.button, button), (0, _defineProperty2.default)(_classNames, classes.alignItemsFlexStart, alignItems === 'flex-start'), (0, _defineProperty2.default)(_classNames, classes.secondaryAction, hasSecondaryAction), (0, _defineProperty2.default)(_classNames, classes.selected, selected), _classNames), classNameProp);\n var componentProps = (0, _extends2.default)({\n className: className,\n disabled: disabled\n }, other);\n var Component = componentProp || 'li';\n\n if (button) {\n componentProps.component = componentProp || 'div';\n componentProps.focusVisibleClassName = (0, _classnames.default)(classes.focusVisible, focusVisibleClassName);\n Component = _ButtonBase.default;\n }\n\n if (hasSecondaryAction) {\n // Use div by default.\n Component = !componentProps.component && !componentProp ? 'div' : Component; // Avoid nesting of li > li.\n\n if (ContainerComponent === 'li') {\n if (Component === 'li') {\n Component = 'div';\n } else if (componentProps.component === 'li') {\n componentProps.component = 'div';\n }\n }\n\n return _react.default.createElement(ContainerComponent, (0, _extends2.default)({\n className: (0, _classnames.default)(classes.container, ContainerClassName)\n }, ContainerProps), _react.default.createElement(Component, componentProps, children), children.pop());\n }\n\n return _react.default.createElement(Component, componentProps, children);\n });\n}\n\nprocess.env.NODE_ENV !== \"production\" ? ListItem.propTypes = {\n /**\r\n * Defines the ` + "`"))))) + ((((`align-items` + "`") + (` style property.\r\n */\n alignItems: _propTypes.default.oneOf(['flex-start', 'center']),\n\n /**\r\n * If ` + ("`" + `true`))) + (("`" + (`, the list item will be a button (using ` + "`")) + (`ButtonBase` + ("`" + `).\r\n */\n button: _propTypes.default.bool,\n\n /**\r\n * The content of the component. If a `)))) + ((("`" + (`ListItemSecondaryAction` + "`")) + (` is used it must\r\n * be the last child.\r\n */\n children: (0, _utils.chainPropTypes)(_propTypes.default.node, function (props) {\n var children = _react.default.Children.toArray(props.children); // React.Children.toArray(props.children).findLastIndex(isListItemSecondaryAction)\n\n\n var secondaryActionIndex = -1;\n\n for (var i = children.length - 1; i >= 0; i -= 1) {\n var child = children[i];\n\n if ((0, _reactHelpers.isMuiElement)(child, ['ListItemSecondaryAction'])) {\n secondaryActionIndex = i;\n break;\n }\n } // is ListItemSecondaryAction the last child of ListItem\n\n\n if (secondaryActionIndex !== -1 && secondaryActionIndex !== children.length - 1) {\n return new Error('Material-UI: you used an element after ListItemSecondaryAction. ' + 'For ListItem to detect that it has a secondary action ' + \"you must pass it has the last children to ListItem.\".concat(process.env.NODE_ENV === 'test' ? Date.now() : ''));\n }\n\n return null;\n }),\n\n /**\r\n * Override or extend the styles applied to the component.\r\n * See [CSS API](#css-api) below for more details.\r\n */\n classes: _propTypes.default.object.isRequired,\n\n /**\r\n * @ignore\r\n */\n className: _propTypes.default.string,\n\n /**\r\n * The component used for the root node.\r\n * Either a string to use a DOM element or a component.\r\n * By default, it's a ` + ("`" + `li`))) + (("`" + (` when ` + "`")) + (`button` + ("`" + ` is `)))))))))) + ((((((((("`" + `false`) + ("`" + (` and a ` + "`"))) + ((`div` + ("`" + ` when `)) + ("`" + (`button` + "`")))) + (((` is ` + "`") + (`true` + ("`" + `.\r\n */\n component: _utils.componentPropType,\n\n /**\r\n * The container component used when a `))) + (("`" + (`ListItemSecondaryAction` + "`")) + (` is the last child.\r\n */\n ContainerComponent: _utils.componentPropType,\n\n /**\r\n * Properties applied to the container component if used.\r\n */\n ContainerProps: _propTypes.default.object,\n\n /**\r\n * If ` + ("`" + `true`))))) + (((("`" + `, compact vertical padding designed for keyboard and mouse input will be used.\r\n */\n dense: _propTypes.default.bool,\n\n /**\r\n * If `) + ("`" + (`true` + "`"))) + ((`, the list item will be disabled.\r\n */\n disabled: _propTypes.default.bool,\n\n /**\r\n * If ` + ("`" + `true`)) + ("`" + (`, the left and right padding is removed.\r\n */\n disableGutters: _propTypes.default.bool,\n\n /**\r\n * If ` + "`")))) + (((`true` + "`") + (`, a 1px light border is added to the bottom of the list item.\r\n */\n divider: _propTypes.default.bool,\n\n /**\r\n * @ignore\r\n */\n focusVisibleClassName: _propTypes.default.string,\n\n /**\r\n * Use to apply selected styling.\r\n */\n selected: _propTypes.default.bool\n} : void 0;\nListItem.defaultProps = {\n alignItems: 'center',\n button: false,\n ContainerComponent: 'li',\n dense: false,\n disabled: false,\n disableGutters: false,\n divider: false,\n selected: false\n};\n\nvar _default = (0, _withStyles.default)(styles, {\n name: 'MuiListItem'\n})(ListItem);\n\nexports.default = _default;", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = exports.styles = void 0;\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/defineProperty\"));\n\nvar _objectWithoutProperties2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectWithoutProperties\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _classnames = _interopRequireDefault(require(\"classnames\"));\n\nvar _utils = require(\"@material-ui/utils\");\n\nvar _withStyles = _interopRequireDefault(require(\"../styles/withStyles\"));\n\nvar _ButtonBase = _interopRequireDefault(require(\"../ButtonBase\"));\n\nvar _reactHelpers = require(\"../utils/reactHelpers\");\n\nvar _MergeListContext = _interopRequireDefault(require(\"./MergeListContext\"));\n\nvar styles = function styles(theme) {\n return {\n /* Styles applied to the (normally root) `))))) + (((("`" + (`component` + "`")) + (` element. May be wrapped by a ` + ("`" + `container`))) + (("`" + (`. */\n root: {\n display: 'flex',\n justifyContent: 'flex-start',\n alignItems: 'center',\n position: 'relative',\n textDecoration: 'none',\n width: '100%',\n boxSizing: 'border-box',\n textAlign: 'left',\n paddingTop: 11,\n // To use 10px in v4\n paddingBottom: 11,\n // To use 10px in v4\n '&$selected, &$selected:hover, &$selected:focus': {\n backgroundColor: theme.palette.action.selected\n }\n },\n\n /* Styles applied to the ` + "`")) + (`container` + ("`" + ` element if `)))) + ((("`" + (`children` + "`")) + (` includes ` + ("`" + `ListItemSecondaryAction`))) + (("`" + (`. */\n container: {\n position: 'relative'\n },\n // To remove in v4\n\n /* Styles applied to the ` + "`")) + ((`component` + "`") + (`'s ` + "`")))))))) + (((((((`focusVisibleClassName` + ("`" + ` property if `)) + ("`" + (`button={true}` + "`"))) + ((`. */\n focusVisible: {},\n\n /* Legacy styles applied to the root element. Use ` + ("`" + `root`)) + ("`" + (` instead. */\n default: {},\n\n /* Styles applied to the ` + "`")))) + (((`component` + ("`" + ` element if `)) + ("`" + (`dense={true}` + "`"))) + ((` or ` + ("`" + `children`)) + ("`" + (` includes ` + "`"))))) + ((((`Avatar` + ("`" + `. */\n dense: {\n paddingTop: 8,\n paddingBottom: 8\n },\n\n /* Styles applied to the `)) + ("`" + (`component` + "`"))) + ((` element if ` + ("`" + `alignItems=\"flex-start\"`)) + ("`" + (`. */\n alignItemsFlexStart: {\n alignItems: 'flex-start'\n },\n\n /* Styles applied to the inner ` + "`")))) + (((`component` + ("`" + ` element if `)) + ("`" + (`disabled={true}` + "`"))) + ((`. */\n disabled: {\n opacity: 0.5\n },\n\n /* Styles applied to the inner ` + ("`" + `component`)) + (("`" + ` element if `) + ("`" + `divider={true}`)))))) + ((((("`" + (`. */\n divider: {\n borderBottom: \"1px solid \".concat(theme.palette.divider),\n backgroundClip: 'padding-box'\n },\n\n /* Styles applied to the inner ` + "`")) + (`component` + ("`" + ` element if `))) + (("`" + (`disableGutters={false}` + "`")) + (`. */\n gutters: {\n paddingLeft: 16,\n paddingRight: 16\n },\n\n /* Styles applied to the inner ` + ("`" + `component`)))) + ((("`" + (` element if ` + "`")) + (`button={true}` + ("`" + `. */\n button: {\n transition: theme.transitions.create('background-color', {\n duration: theme.transitions.duration.shortest\n }),\n '&:hover': {\n textDecoration: 'none',\n backgroundColor: theme.palette.action.hover,\n // Reset on touch devices, it doesn't add specificity\n '@media (hover: none)': {\n backgroundColor: 'transparent'\n }\n },\n '&:focus': {\n backgroundColor: theme.palette.action.hover\n }\n },\n\n /* Styles applied to the `))) + (("`" + (`component` + "`")) + ((` element if ` + "`") + (`children` + "`"))))) + ((((` includes ` + ("`" + `ListItemSecondaryAction`)) + ("`" + (`. */\n secondaryAction: {\n // Add some space to avoid collision as ` + "`"))) + ((`ListItemSecondaryAction` + ("`" + `\n // is absolutely positioned.\n paddingRight: 32\n },\n\n /* Styles applied to the root element if `)) + ("`" + (`selected={true}` + "`")))) + (((`. */\n selected: {}\n };\n};\n/**\r\n * Uses an additional container component if ` + ("`" + `ListItemSecondaryAction`)) + ("`" + (` is the last child.\r\n */\n\n\nexports.styles = styles;\n\nfunction ListItem(props) {\n var alignItems = props.alignItems,\n button = props.button,\n childrenProp = props.children,\n classes = props.classes,\n classNameProp = props.className,\n componentProp = props.component,\n ContainerComponent = props.ContainerComponent,\n _props$ContainerProps = props.ContainerProps;\n _props$ContainerProps = _props$ContainerProps === void 0 ? {} : _props$ContainerProps;\n var ContainerClassName = _props$ContainerProps.className,\n ContainerProps = (0, _objectWithoutProperties2.default)(_props$ContainerProps, [\"className\"]),\n denseProp = props.dense,\n disabled = props.disabled,\n disableGutters = props.disableGutters,\n divider = props.divider,\n focusVisibleClassName = props.focusVisibleClassName,\n selected = props.selected,\n other = (0, _objectWithoutProperties2.default)(props, [\"alignItems\", \"button\", \"children\", \"classes\", \"className\", \"component\", \"ContainerComponent\", \"ContainerProps\", \"dense\", \"disabled\", \"disableGutters\", \"divider\", \"focusVisibleClassName\", \"selected\"]);\n return _react.default.createElement(_MergeListContext.default, {\n dense: denseProp,\n alignItems: alignItems\n }, function (_ref) {\n var _classNames;\n\n var dense = _ref.dense;\n\n var children = _react.default.Children.toArray(childrenProp);\n\n var hasAvatar = children.some(function (value) {\n return (0, _reactHelpers.isMuiElement)(value, ['ListItemAvatar']);\n });\n var hasSecondaryAction = children.length && (0, _reactHelpers.isMuiElement)(children[children.length - 1], ['ListItemSecondaryAction']);\n var className = (0, _classnames.default)(classes.root, classes.default, (_classNames = {}, (0, _defineProperty2.default)(_classNames, classes.dense, dense || hasAvatar), (0, _defineProperty2.default)(_classNames, classes.gutters, !disableGutters), (0, _defineProperty2.default)(_classNames, classes.divider, divider), (0, _defineProperty2.default)(_classNames, classes.disabled, disabled), (0, _defineProperty2.default)(_classNames, classes.button, button), (0, _defineProperty2.default)(_classNames, classes.alignItemsFlexStart, alignItems === 'flex-start'), (0, _defineProperty2.default)(_classNames, classes.secondaryAction, hasSecondaryAction), (0, _defineProperty2.default)(_classNames, classes.selected, selected), _classNames), classNameProp);\n var componentProps = (0, _extends2.default)({\n className: className,\n disabled: disabled\n }, other);\n var Component = componentProp || 'li';\n\n if (button) {\n componentProps.component = componentProp || 'div';\n componentProps.focusVisibleClassName = (0, _classnames.default)(classes.focusVisible, focusVisibleClassName);\n Component = _ButtonBase.default;\n }\n\n if (hasSecondaryAction) {\n // Use div by default.\n Component = !componentProps.component && !componentProp ? 'div' : Component; // Avoid nesting of li > li.\n\n if (ContainerComponent === 'li') {\n if (Component === 'li') {\n Component = 'div';\n } else if (componentProps.component === 'li') {\n componentProps.component = 'div';\n }\n }\n\n return _react.default.createElement(ContainerComponent, (0, _extends2.default)({\n className: (0, _classnames.default)(classes.container, ContainerClassName)\n }, ContainerProps), _react.default.createElement(Component, componentProps, children), children.pop());\n }\n\n return _react.default.createElement(Component, componentProps, children);\n });\n}\n\nprocess.env.NODE_ENV !== \"production\" ? ListItem.propTypes = {\n /**\r\n * Defines the ` + "`"))) + ((`align-items` + ("`" + ` style property.\r\n */\n alignItems: _propTypes.default.oneOf(['flex-start', 'center']),\n\n /**\r\n * If `)) + (("`" + `true`) + ("`" + `, the list item will be a button (using `))))))) + (((((("`" + (`ButtonBase` + "`")) + (`).\r\n */\n button: _propTypes.default.bool,\n\n /**\r\n * The content of the component. If a ` + ("`" + `ListItemSecondaryAction`))) + (("`" + (` is used it must\r\n * be the last child.\r\n */\n children: (0, _utils.chainPropTypes)(_propTypes.default.node, function (props) {\n var children = _react.default.Children.toArray(props.children); // React.Children.toArray(props.children).findLastIndex(isListItemSecondaryAction)\n\n\n var secondaryActionIndex = -1;\n\n for (var i = children.length - 1; i >= 0; i -= 1) {\n var child = children[i];\n\n if ((0, _reactHelpers.isMuiElement)(child, ['ListItemSecondaryAction'])) {\n secondaryActionIndex = i;\n break;\n }\n } // is ListItemSecondaryAction the last child of ListItem\n\n\n if (secondaryActionIndex !== -1 && secondaryActionIndex !== children.length - 1) {\n return new Error('Material-UI: you used an element after ListItemSecondaryAction. ' + 'For ListItem to detect that it has a secondary action ' + \"you must pass it has the last children to ListItem.\".concat(process.env.NODE_ENV === 'test' ? Date.now() : ''));\n }\n\n return null;\n }),\n\n /**\r\n * Override or extend the styles applied to the component.\r\n * See [CSS API](#css-api) below for more details.\r\n */\n classes: _propTypes.default.object.isRequired,\n\n /**\r\n * @ignore\r\n */\n className: _propTypes.default.string,\n\n /**\r\n * The component used for the root node.\r\n * Either a string to use a DOM element or a component.\r\n * By default, it's a ` + "`")) + (`li` + ("`" + ` when `)))) + ((("`" + (`button` + "`")) + (` is ` + ("`" + `false`))) + (("`" + (` and a ` + "`")) + ((`div` + "`") + (` when ` + "`"))))) + ((((`button` + ("`" + ` is `)) + ("`" + (`true` + "`"))) + ((`.\r\n */\n component: _utils.componentPropType,\n\n /**\r\n * The container component used when a ` + ("`" + `ListItemSecondaryAction`)) + ("`" + (` is the last child.\r\n */\n ContainerComponent: _utils.componentPropType,\n\n /**\r\n * Properties applied to the container component if used.\r\n */\n ContainerProps: _propTypes.default.object,\n\n /**\r\n * If ` + "`")))) + (((`true` + ("`" + `, compact vertical padding designed for keyboard and mouse input will be used.\r\n */\n dense: _propTypes.default.bool,\n\n /**\r\n * If `)) + ("`" + (`true` + "`"))) + ((`, the list item will be disabled.\r\n */\n disabled: _propTypes.default.bool,\n\n /**\r\n * If ` + ("`" + `true`)) + (("`" + `, the left and right padding is removed.\r\n */\n disableGutters: _propTypes.default.bool,\n\n /**\r\n * If `) + ("`" + `true`)))))) + ((((("`" + (`, a 1px light border is added to the bottom of the list item.\r\n */\n divider: _propTypes.default.bool,\n\n /**\r\n * @ignore\r\n */\n focusVisibleClassName: _propTypes.default.string,\n\n /**\r\n * Use to apply selected styling.\r\n */\n selected: _propTypes.default.bool\n} : void 0;\nListItem.defaultProps = {\n alignItems: 'center',\n button: false,\n ContainerComponent: 'li',\n dense: false,\n disabled: false,\n disableGutters: false,\n divider: false,\n selected: false\n};\n\nvar _default = (0, _withStyles.default)(styles, {\n name: 'MuiListItem'\n})(ListItem);\n\nexports.default = _default;", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _ListContext = _interopRequireDefault(require(\"../List/ListContext\"));\n\n/**\r\n * @ignore - internal component.\r\n *\r\n * Consumes a context and passes that context merged with its props.\r\n */\nfunction MergeListContext(props) {\n var alignItems = props.alignItems,\n children = props.children,\n dense = props.dense;\n return _react.default.createElement(_ListContext.default.Consumer, null, function (context) {\n var childContext = {\n dense: dense || context.dense || false,\n alignItems: alignItems\n };\n return _react.default.createElement(_ListContext.default.Provider, {\n value: childContext\n }, children(childContext));\n });\n}\n\nprocess.env.NODE_ENV !== \"production\" ? MergeListContext.propTypes = {\n alignItems: _propTypes.default.oneOf(['flex-start', 'center']).isRequired,\n children: _propTypes.default.func.isRequired,\n dense: _propTypes.default.bool.isRequired\n} : void 0;\nvar _default = MergeListContext;\nexports.default = _default;", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nObject.defineProperty(exports, \"default\", {\n enumerable: true,\n get: function get() {\n return _ListItem.default;\n }\n});\n\nvar _ListItem = _interopRequireDefault(require(\"./ListItem\"));", - "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = exports.styles = void 0;\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _objectWithoutProperties2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectWithoutProperties\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _classnames = _interopRequireDefault(require(\"classnames\"));\n\nvar _withStyles = _interopRequireDefault(require(\"../styles/withStyles\"));\n\nvar styles = function styles(theme) {\n return {\n /* Styles applied to the root element. */\n root: {\n marginRight: 16,\n color: theme.palette.action.active,\n flexShrink: 0,\n display: 'inline-flex'\n }\n };\n};\n/**\r\n * A simple wrapper to apply ` + ("`" + `List`))) + (("`" + (` styles to an ` + "`")) + (`Icon` + ("`" + ` or `)))))) + ((((("`" + `SvgIcon`) + ("`" + (`.\r\n */\n\n\nexports.styles = styles;\n\nfunction ListItemIcon(props) {\n var children = props.children,\n classes = props.classes,\n classNameProp = props.className,\n other = (0, _objectWithoutProperties2.default)(props, [\"children\", \"classes\", \"className\"]);\n return _react.default.createElement(\"div\", (0, _extends2.default)({\n className: (0, _classnames.default)(classes.root, classNameProp)\n }, other), children);\n}\n\nprocess.env.NODE_ENV !== \"production\" ? ListItemIcon.propTypes = {\n /**\r\n * The content of the component, normally ` + "`"))) + ((`Icon` + ("`" + `, `)) + ("`" + (`SvgIcon` + "`")))) + (((`,\r\n * or a ` + "`") + (`@material-ui/icons` + ("`" + ` SVG icon element.\r\n */\n children: _propTypes.default.element.isRequired,\n\n /**\r\n * Override or extend the styles applied to the component.\r\n * See [CSS API](#css-api) below for more details.\r\n */\n classes: _propTypes.default.object.isRequired,\n\n /**\r\n * @ignore\r\n */\n className: _propTypes.default.string\n} : void 0;\n\nvar _default = (0, _withStyles.default)(styles, {\n name: 'MuiListItemIcon'\n})(ListItemIcon);\n\nexports.default = _default;", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = exports.styles = void 0;\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _objectWithoutProperties2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectWithoutProperties\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _classnames = _interopRequireDefault(require(\"classnames\"));\n\nvar _withStyles = _interopRequireDefault(require(\"../styles/withStyles\"));\n\nvar styles = function styles(theme) {\n return {\n /* Styles applied to the root element. */\n root: {\n marginRight: 16,\n color: theme.palette.action.active,\n flexShrink: 0,\n display: 'inline-flex'\n }\n };\n};\n/**\r\n * A simple wrapper to apply ` + "`")) + (`List` + ("`" + ` styles to an `))) + (("`" + (`Icon` + "`")) + (` or ` + ("`" + `SvgIcon`)))) + ((("`" + (`.\r\n */\n\n\nexports.styles = styles;\n\nfunction ListItemIcon(props) {\n var children = props.children,\n classes = props.classes,\n classNameProp = props.className,\n other = (0, _objectWithoutProperties2.default)(props, [\"children\", \"classes\", \"className\"]);\n return _react.default.createElement(\"div\", (0, _extends2.default)({\n className: (0, _classnames.default)(classes.root, classNameProp)\n }, other), children);\n}\n\nprocess.env.NODE_ENV !== \"production\" ? ListItemIcon.propTypes = {\n /**\r\n * The content of the component, normally ` + "`")) + (`Icon` + ("`" + `, `))) + (("`" + (`SvgIcon` + "`")) + ((`,\r\n * or a ` + "`") + (`@material-ui/icons` + "`"))))) + ((((` SVG icon element.\r\n */\n children: _propTypes.default.element.isRequired,\n\n /**\r\n * Override or extend the styles applied to the component.\r\n * See [CSS API](#css-api) below for more details.\r\n */\n classes: _propTypes.default.object.isRequired,\n\n /**\r\n * @ignore\r\n */\n className: _propTypes.default.string\n} : void 0;\n\nvar _default = (0, _withStyles.default)(styles, {\n name: 'MuiListItemIcon'\n})(ListItemIcon);\n\nexports.default = _default;", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nObject.defineProperty(exports, \"default\", {\n enumerable: true,\n get: function get() {\n return _ListItemIcon.default;\n }\n});\n\nvar _ListItemIcon = _interopRequireDefault(require(\"./ListItemIcon\"));", - "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = exports.styles = void 0;\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/defineProperty\"));\n\nvar _objectWithoutProperties2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectWithoutProperties\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _classnames = _interopRequireDefault(require(\"classnames\"));\n\nvar _withStyles = _interopRequireDefault(require(\"../styles/withStyles\"));\n\nvar _Typography = _interopRequireDefault(require(\"../Typography\"));\n\nvar _ListContext = _interopRequireDefault(require(\"../List/ListContext\"));\n\nvar styles = function styles(theme) {\n return {\n /* Styles applied to the root element. */\n root: {\n flex: '1 1 auto',\n minWidth: 0,\n padding: '0 16px',\n '&:first-child': {\n paddingLeft: 0\n }\n },\n\n /* Styles applied to the root element if `))) + (("`" + (`inset={true}` + "`")) + (`. */\n inset: {\n '&:first-child': {\n paddingLeft: 56\n }\n },\n\n /* Styles applied to the root element if ` + ("`" + `context.dense`))))) + (((("`" + ` is `) + ("`" + (`true` + "`"))) + ((`. */\n dense: {\n fontSize: theme.typography.pxToRem(13)\n },\n\n /* Styles applied to the primary ` + ("`" + `Typography`)) + ("`" + (` component. */\n primary: {\n '&$textDense': {\n fontSize: 'inherit'\n }\n },\n\n /* Styles applied to the secondary ` + "`")))) + (((`Typography` + "`") + (` component. */\n secondary: {\n '&$textDense': {\n fontSize: 'inherit'\n }\n },\n\n /* Styles applied to the ` + ("`" + `Typography`))) + (("`" + (` components if ` + "`")) + (`context.dense` + ("`" + ` is `))))))) + (((((("`" + `true`) + ("`" + (`. */\n textDense: {}\n };\n};\n\nexports.styles = styles;\n\nfunction ListItemText(props) {\n var children = props.children,\n classes = props.classes,\n classNameProp = props.className,\n disableTypography = props.disableTypography,\n inset = props.inset,\n primaryProp = props.primary,\n primaryTypographyProps = props.primaryTypographyProps,\n secondaryProp = props.secondary,\n secondaryTypographyProps = props.secondaryTypographyProps,\n theme = props.theme,\n other = (0, _objectWithoutProperties2.default)(props, [\"children\", \"classes\", \"className\", \"disableTypography\", \"inset\", \"primary\", \"primaryTypographyProps\", \"secondary\", \"secondaryTypographyProps\", \"theme\"]);\n return _react.default.createElement(_ListContext.default.Consumer, null, function (_ref) {\n var _classNames3;\n\n var dense = _ref.dense;\n var primary = primaryProp != null ? primaryProp : children;\n\n if (primary != null && primary.type !== _Typography.default && !disableTypography) {\n primary = _react.default.createElement(_Typography.default, (0, _extends2.default)({\n variant: theme.typography.useNextVariants ? 'body1' : 'subheading',\n className: (0, _classnames.default)(classes.primary, (0, _defineProperty2.default)({}, classes.textDense, dense)),\n component: \"span\"\n }, primaryTypographyProps), primary);\n }\n\n var secondary = secondaryProp;\n\n if (secondary != null && secondary.type !== _Typography.default && !disableTypography) {\n secondary = _react.default.createElement(_Typography.default, (0, _extends2.default)({\n className: (0, _classnames.default)(classes.secondary, (0, _defineProperty2.default)({}, classes.textDense, dense)),\n color: \"textSecondary\"\n }, secondaryTypographyProps), secondary);\n }\n\n return _react.default.createElement(\"div\", (0, _extends2.default)({\n className: (0, _classnames.default)(classes.root, (_classNames3 = {}, (0, _defineProperty2.default)(_classNames3, classes.dense, dense), (0, _defineProperty2.default)(_classNames3, classes.inset, inset), _classNames3), classNameProp)\n }, other), primary, secondary);\n });\n}\n\nprocess.env.NODE_ENV !== \"production\" ? ListItemText.propTypes = {\n /**\r\n * Alias for the ` + "`"))) + ((`primary` + ("`" + ` property.\r\n */\n children: _propTypes.default.node,\n\n /**\r\n * Override or extend the styles applied to the component.\r\n * See [CSS API](#css-api) below for more details.\r\n */\n classes: _propTypes.default.object.isRequired,\n\n /**\r\n * @ignore\r\n */\n className: _propTypes.default.string,\n\n /**\r\n * If `)) + ("`" + (`true` + "`")))) + (((`, the children won't be wrapped by a Typography component.\r\n * This can be useful to render an alternative Typography variant by wrapping\r\n * the ` + "`") + (`children` + ("`" + ` (or `))) + (("`" + (`primary` + "`")) + (`) text, and optional ` + ("`" + `secondary`))))) + (((("`" + ` text\r\n * with the Typography component.\r\n */\n disableTypography: _propTypes.default.bool,\n\n /**\r\n * If `) + ("`" + (`true` + "`"))) + ((`, the children will be indented.\r\n * This should be used if there is no left avatar or left icon.\r\n */\n inset: _propTypes.default.bool,\n\n /**\r\n * The main content element.\r\n */\n primary: _propTypes.default.node,\n\n /**\r\n * These props will be forwarded to the primary typography component\r\n * (as long as disableTypography is not ` + ("`" + `true`)) + ("`" + (`).\r\n */\n primaryTypographyProps: _propTypes.default.object,\n\n /**\r\n * The secondary content element.\r\n */\n secondary: _propTypes.default.node,\n\n /**\r\n * These props will be forwarded to the secondary typography component\r\n * (as long as disableTypography is not ` + "`")))) + (((`true` + "`") + (`).\r\n */\n secondaryTypographyProps: _propTypes.default.object,\n\n /**\r\n * @ignore\r\n */\n theme: _propTypes.default.object.isRequired\n} : void 0;\nListItemText.defaultProps = {\n disableTypography: false,\n inset: false\n};\n\nvar _default = (0, _withStyles.default)(styles, {\n name: 'MuiListItemText',\n withTheme: true\n})(ListItemText);\n\nexports.default = _default;", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = exports.styles = void 0;\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/defineProperty\"));\n\nvar _objectWithoutProperties2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectWithoutProperties\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _classnames = _interopRequireDefault(require(\"classnames\"));\n\nvar _withStyles = _interopRequireDefault(require(\"../styles/withStyles\"));\n\nvar _Typography = _interopRequireDefault(require(\"../Typography\"));\n\nvar _ListContext = _interopRequireDefault(require(\"../List/ListContext\"));\n\nvar styles = function styles(theme) {\n return {\n /* Styles applied to the root element. */\n root: {\n flex: '1 1 auto',\n minWidth: 0,\n padding: '0 16px',\n '&:first-child': {\n paddingLeft: 0\n }\n },\n\n /* Styles applied to the root element if ` + ("`" + `inset={true}`)) + ("`" + (`. */\n inset: {\n '&:first-child': {\n paddingLeft: 56\n }\n },\n\n /* Styles applied to the root element if ` + "`"))) + ((`context.dense` + ("`" + ` is `)) + ("`" + (`true` + "`")))) + (((`. */\n dense: {\n fontSize: theme.typography.pxToRem(13)\n },\n\n /* Styles applied to the primary ` + ("`" + `Typography`)) + ("`" + (` component. */\n primary: {\n '&$textDense': {\n fontSize: 'inherit'\n }\n },\n\n /* Styles applied to the secondary ` + "`"))) + ((`Typography` + ("`" + ` component. */\n secondary: {\n '&$textDense': {\n fontSize: 'inherit'\n }\n },\n\n /* Styles applied to the `)) + (("`" + `Typography`) + ("`" + ` components if `)))))))))) + ((((((((("`" + (`context.dense` + "`")) + (` is ` + ("`" + `true`))) + (("`" + (`. */\n textDense: {}\n };\n};\n\nexports.styles = styles;\n\nfunction ListItemText(props) {\n var children = props.children,\n classes = props.classes,\n classNameProp = props.className,\n disableTypography = props.disableTypography,\n inset = props.inset,\n primaryProp = props.primary,\n primaryTypographyProps = props.primaryTypographyProps,\n secondaryProp = props.secondary,\n secondaryTypographyProps = props.secondaryTypographyProps,\n theme = props.theme,\n other = (0, _objectWithoutProperties2.default)(props, [\"children\", \"classes\", \"className\", \"disableTypography\", \"inset\", \"primary\", \"primaryTypographyProps\", \"secondary\", \"secondaryTypographyProps\", \"theme\"]);\n return _react.default.createElement(_ListContext.default.Consumer, null, function (_ref) {\n var _classNames3;\n\n var dense = _ref.dense;\n var primary = primaryProp != null ? primaryProp : children;\n\n if (primary != null && primary.type !== _Typography.default && !disableTypography) {\n primary = _react.default.createElement(_Typography.default, (0, _extends2.default)({\n variant: theme.typography.useNextVariants ? 'body1' : 'subheading',\n className: (0, _classnames.default)(classes.primary, (0, _defineProperty2.default)({}, classes.textDense, dense)),\n component: \"span\"\n }, primaryTypographyProps), primary);\n }\n\n var secondary = secondaryProp;\n\n if (secondary != null && secondary.type !== _Typography.default && !disableTypography) {\n secondary = _react.default.createElement(_Typography.default, (0, _extends2.default)({\n className: (0, _classnames.default)(classes.secondary, (0, _defineProperty2.default)({}, classes.textDense, dense)),\n color: \"textSecondary\"\n }, secondaryTypographyProps), secondary);\n }\n\n return _react.default.createElement(\"div\", (0, _extends2.default)({\n className: (0, _classnames.default)(classes.root, (_classNames3 = {}, (0, _defineProperty2.default)(_classNames3, classes.dense, dense), (0, _defineProperty2.default)(_classNames3, classes.inset, inset), _classNames3), classNameProp)\n }, other), primary, secondary);\n });\n}\n\nprocess.env.NODE_ENV !== \"production\" ? ListItemText.propTypes = {\n /**\r\n * Alias for the ` + "`")) + (`primary` + ("`" + ` property.\r\n */\n children: _propTypes.default.node,\n\n /**\r\n * Override or extend the styles applied to the component.\r\n * See [CSS API](#css-api) below for more details.\r\n */\n classes: _propTypes.default.object.isRequired,\n\n /**\r\n * @ignore\r\n */\n className: _propTypes.default.string,\n\n /**\r\n * If `)))) + ((("`" + (`true` + "`")) + (`, the children won't be wrapped by a Typography component.\r\n * This can be useful to render an alternative Typography variant by wrapping\r\n * the ` + ("`" + `children`))) + (("`" + (` (or ` + "`")) + (`primary` + ("`" + `) text, and optional `))))) + (((("`" + (`secondary` + "`")) + (` text\r\n * with the Typography component.\r\n */\n disableTypography: _propTypes.default.bool,\n\n /**\r\n * If ` + ("`" + `true`))) + (("`" + (`, the children will be indented.\r\n * This should be used if there is no left avatar or left icon.\r\n */\n inset: _propTypes.default.bool,\n\n /**\r\n * The main content element.\r\n */\n primary: _propTypes.default.node,\n\n /**\r\n * These props will be forwarded to the primary typography component\r\n * (as long as disableTypography is not ` + "`")) + (`true` + ("`" + `).\r\n */\n primaryTypographyProps: _propTypes.default.object,\n\n /**\r\n * The secondary content element.\r\n */\n secondary: _propTypes.default.node,\n\n /**\r\n * These props will be forwarded to the secondary typography component\r\n * (as long as disableTypography is not `)))) + ((("`" + (`true` + "`")) + (`).\r\n */\n secondaryTypographyProps: _propTypes.default.object,\n\n /**\r\n * @ignore\r\n */\n theme: _propTypes.default.object.isRequired\n} : void 0;\nListItemText.defaultProps = {\n disableTypography: false,\n inset: false\n};\n\nvar _default = (0, _withStyles.default)(styles, {\n name: 'MuiListItemText',\n withTheme: true\n})(ListItemText);\n\nexports.default = _default;", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nObject.defineProperty(exports, \"default\", {\n enumerable: true,\n get: function get() {\n return _ListItemText.default;\n }\n});\n\nvar _ListItemText = _interopRequireDefault(require(\"./ListItemText\"));", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/classCallCheck\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/createClass\"));\n\nvar _possibleConstructorReturn2 = _interopRequireDefault(require(\"@babel/runtime/helpers/possibleConstructorReturn\"));\n\nvar _getPrototypeOf3 = _interopRequireDefault(require(\"@babel/runtime/helpers/getPrototypeOf\"));\n\nvar _inherits2 = _interopRequireDefault(require(\"@babel/runtime/helpers/inherits\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _utils = require(\"@material-ui/utils\");\n\n/**\r\n * NoSsr purposely removes components from the subject of Server Side Rendering (SSR).\r\n *\r\n * This component can be useful in a variety of situations:\r\n * - Escape hatch for broken dependencies not supporting SSR.\r\n * - Improve the time-to-first paint on the client by only rendering above the fold.\r\n * - Reduce the rendering time on the server.\r\n * - Under too heavy server load, you can turn on service degradation.\r\n */\nvar NoSsr =\n/*#__PURE__*/\nfunction (_React$Component) {\n (0, _inherits2.default)(NoSsr, _React$Component);\n\n function NoSsr() {\n var _getPrototypeOf2;\n\n var _this;\n\n (0, _classCallCheck2.default)(this, NoSsr);\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n _this = (0, _possibleConstructorReturn2.default)(this, (_getPrototypeOf2 = (0, _getPrototypeOf3.default)(NoSsr)).call.apply(_getPrototypeOf2, [this].concat(args)));\n _this.mounted = false;\n _this.state = {\n mounted: false\n };\n return _this;\n }\n\n (0, _createClass2.default)(NoSsr, [{\n key: \"componentDidMount\",\n value: function componentDidMount() {\n var _this2 = this;\n\n this.mounted = true;\n\n if (this.props.defer) {\n // Wondering why we use two RAFs? Check this video out:\n // https://www.youtube.com/watch?v=cCOL7MC4Pl0\n //\n // The componentDidMount() method is called after the DOM nodes are inserted.\n // The UI might not have rendering the changes. We request a frame.\n requestAnimationFrame(function () {\n // The browser should be about to render the DOM nodes\n // that React committed at this point.\n // We don't want to interrupt. Let's wait the next frame.\n requestAnimationFrame(function () {\n // The UI is up-to-date at this point.\n // We can continue rendering the children.\n if (_this2.mounted) {\n _this2.setState({\n mounted: true\n });\n }\n });\n });\n } else {\n this.setState({\n mounted: true\n });\n }\n }\n }, {\n key: \"componentWillUnmount\",\n value: function componentWillUnmount() {\n this.mounted = false;\n }\n }, {\n key: \"render\",\n value: function render() {\n var _this$props = this.props,\n children = _this$props.children,\n fallback = _this$props.fallback;\n return this.state.mounted ? children : fallback;\n }\n }]);\n return NoSsr;\n}(_react.default.Component);\n\nprocess.env.NODE_ENV !== \"production\" ? NoSsr.propTypes = {\n children: _propTypes.default.node.isRequired,\n\n /**\r\n * If ` + ("`" + `true`))) + (("`" + (`, the component will not only prevent server-side rendering.\r\n * It will also defer the rendering of the children into a different screen frame.\r\n */\n defer: _propTypes.default.bool,\n\n /**\r\n * The fallback content to display.\r\n */\n fallback: _propTypes.default.node\n} : void 0;\n\nif (process.env.NODE_ENV !== 'production') {\n process.env.NODE_ENV !== \"production\" ? NoSsr.propTypes = (0, _utils.exactProp)(NoSsr.propTypes) : void 0;\n}\n\nNoSsr.defaultProps = {\n defer: false,\n fallback: null\n};\nvar _default = NoSsr;\nexports.default = _default;", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nObject.defineProperty(exports, \"default\", {\n enumerable: true,\n get: function get() {\n return _NoSsr.default;\n }\n});\n\nvar _NoSsr = _interopRequireDefault(require(\"./NoSsr\"));", - "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = exports.styles = void 0;\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/defineProperty\"));\n\nvar _objectWithoutProperties2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectWithoutProperties\"));\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _classnames = _interopRequireDefault(require(\"classnames\"));\n\nvar _warning = _interopRequireDefault(require(\"warning\"));\n\nvar _utils = require(\"@material-ui/utils\");\n\nvar _withStyles = _interopRequireDefault(require(\"../styles/withStyles\"));\n\nvar styles = function styles(theme) {\n var elevations = {};\n theme.shadows.forEach(function (shadow, index) {\n elevations[\"elevation\".concat(index)] = {\n boxShadow: shadow\n };\n });\n return (0, _extends2.default)({\n /* Styles applied to the root element. */\n root: {\n backgroundColor: theme.palette.background.paper\n },\n\n /* Styles applied to the root element if ` + "`")) + (`square={false}` + ("`" + `. */\n rounded: {\n borderRadius: theme.shape.borderRadius\n }\n }, elevations);\n};\n\nexports.styles = styles;\n\nfunction Paper(props) {\n var classes = props.classes,\n classNameProp = props.className,\n Component = props.component,\n square = props.square,\n elevation = props.elevation,\n other = (0, _objectWithoutProperties2.default)(props, [\"classes\", \"className\", \"component\", \"square\", \"elevation\"]);\n process.env.NODE_ENV !== \"production\" ? (0, _warning.default)(elevation >= 0 && elevation < 25, \"Material-UI: this elevation `)))))) + ((((("`" + `\".concat(elevation, \"`) + ("`" + (` is not implemented.\")) : void 0;\n var className = (0, _classnames.default)(classes.root, classes[\"elevation\".concat(elevation)], (0, _defineProperty2.default)({}, classes.rounded, !square), classNameProp);\n return _react.default.createElement(Component, (0, _extends2.default)({\n className: className\n }, other));\n}\n\nprocess.env.NODE_ENV !== \"production\" ? Paper.propTypes = {\n /**\r\n * The content of the component.\r\n */\n children: _propTypes.default.node,\n\n /**\r\n * Override or extend the styles applied to the component.\r\n * See [CSS API](#css-api) below for more details.\r\n */\n classes: _propTypes.default.object.isRequired,\n\n /**\r\n * @ignore\r\n */\n className: _propTypes.default.string,\n\n /**\r\n * The component used for the root node.\r\n * Either a string to use a DOM element or a component.\r\n */\n component: _utils.componentPropType,\n\n /**\r\n * Shadow depth, corresponds to ` + "`"))) + ((`dp` + ("`" + ` in the spec.\r\n * It's accepting values between 0 and 24 inclusive.\r\n */\n elevation: _propTypes.default.number,\n\n /**\r\n * If `)) + ("`" + (`true` + "`")))) + (((`, rounded corners are disabled.\r\n */\n square: _propTypes.default.bool\n} : void 0;\nPaper.defaultProps = {\n component: 'div',\n elevation: 2,\n square: false\n};\n\nvar _default = (0, _withStyles.default)(styles, {\n name: 'MuiPaper'\n})(Paper);\n\nexports.default = _default;", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = exports.styles = void 0;\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/defineProperty\"));\n\nvar _objectWithoutProperties2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectWithoutProperties\"));\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _classnames = _interopRequireDefault(require(\"classnames\"));\n\nvar _warning = _interopRequireDefault(require(\"warning\"));\n\nvar _utils = require(\"@material-ui/utils\");\n\nvar _withStyles = _interopRequireDefault(require(\"../styles/withStyles\"));\n\nvar styles = function styles(theme) {\n var elevations = {};\n theme.shadows.forEach(function (shadow, index) {\n elevations[\"elevation\".concat(index)] = {\n boxShadow: shadow\n };\n });\n return (0, _extends2.default)({\n /* Styles applied to the root element. */\n root: {\n backgroundColor: theme.palette.background.paper\n },\n\n /* Styles applied to the root element if ` + "`")) + ((`square={false}` + "`") + (`. */\n rounded: {\n borderRadius: theme.shape.borderRadius\n }\n }, elevations);\n};\n\nexports.styles = styles;\n\nfunction Paper(props) {\n var classes = props.classes,\n classNameProp = props.className,\n Component = props.component,\n square = props.square,\n elevation = props.elevation,\n other = (0, _objectWithoutProperties2.default)(props, [\"classes\", \"className\", \"component\", \"square\", \"elevation\"]);\n process.env.NODE_ENV !== \"production\" ? (0, _warning.default)(elevation >= 0 && elevation < 25, \"Material-UI: this elevation ` + "`")))))) + (((((`\".concat(elevation, \"` + ("`" + ` is not implemented.\")) : void 0;\n var className = (0, _classnames.default)(classes.root, classes[\"elevation\".concat(elevation)], (0, _defineProperty2.default)({}, classes.rounded, !square), classNameProp);\n return _react.default.createElement(Component, (0, _extends2.default)({\n className: className\n }, other));\n}\n\nprocess.env.NODE_ENV !== \"production\" ? Paper.propTypes = {\n /**\r\n * The content of the component.\r\n */\n children: _propTypes.default.node,\n\n /**\r\n * Override or extend the styles applied to the component.\r\n * See [CSS API](#css-api) below for more details.\r\n */\n classes: _propTypes.default.object.isRequired,\n\n /**\r\n * @ignore\r\n */\n className: _propTypes.default.string,\n\n /**\r\n * The component used for the root node.\r\n * Either a string to use a DOM element or a component.\r\n */\n component: _utils.componentPropType,\n\n /**\r\n * Shadow depth, corresponds to `)) + ("`" + (`dp` + "`"))) + ((` in the spec.\r\n * It's accepting values between 0 and 24 inclusive.\r\n */\n elevation: _propTypes.default.number,\n\n /**\r\n * If ` + ("`" + `true`)) + ("`" + (`, rounded corners are disabled.\r\n */\n square: _propTypes.default.bool\n} : void 0;\nPaper.defaultProps = {\n component: 'div',\n elevation: 2,\n square: false\n};\n\nvar _default = (0, _withStyles.default)(styles, {\n name: 'MuiPaper'\n})(Paper);\n\nexports.default = _default;", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nObject.defineProperty(exports, \"default\", {\n enumerable: true,\n get: function get() {\n return _Paper.default;\n }\n});\n\nvar _Paper = _interopRequireDefault(require(\"./Paper\"));", - "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = exports.styles = void 0;\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _objectWithoutProperties2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectWithoutProperties\"));\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/classCallCheck\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/createClass\"));\n\nvar _possibleConstructorReturn2 = _interopRequireDefault(require(\"@babel/runtime/helpers/possibleConstructorReturn\"));\n\nvar _getPrototypeOf3 = _interopRequireDefault(require(\"@babel/runtime/helpers/getPrototypeOf\"));\n\nvar _inherits2 = _interopRequireDefault(require(\"@babel/runtime/helpers/inherits\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _classnames = _interopRequireDefault(require(\"classnames\"));\n\nvar _utils = require(\"@material-ui/utils\");\n\nvar _withStyles = _interopRequireDefault(require(\"../styles/withStyles\"));\n\nvar _TableContext = _interopRequireDefault(require(\"./TableContext\"));\n\nvar styles = function styles(theme) {\n return {\n /* Styles applied to the root element. */\n root: {\n display: 'table',\n fontFamily: theme.typography.fontFamily,\n width: '100%',\n borderCollapse: 'collapse',\n borderSpacing: 0\n }\n };\n};\n\nexports.styles = styles;\n\nvar Table =\n/*#__PURE__*/\nfunction (_React$Component) {\n (0, _inherits2.default)(Table, _React$Component);\n\n function Table() {\n var _getPrototypeOf2;\n\n var _this;\n\n (0, _classCallCheck2.default)(this, Table);\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n _this = (0, _possibleConstructorReturn2.default)(this, (_getPrototypeOf2 = (0, _getPrototypeOf3.default)(Table)).call.apply(_getPrototypeOf2, [this].concat(args)));\n _this.memoizedContextValue = {};\n return _this;\n }\n\n (0, _createClass2.default)(Table, [{\n key: \"useMemo\",\n // To replace with the corresponding Hook once Material-UI v4 is out:\n // https://reactjs.org/docs/hooks-reference.html#usememo\n value: function useMemo(contextValue) {\n var objectKeys = Object.keys(contextValue);\n\n for (var i = 0; i < objectKeys.length; i += 1) {\n var objectKey = objectKeys[i];\n\n if (contextValue[objectKey] !== this.memoizedContextValue[objectKey]) {\n this.memoizedContextValue = contextValue;\n break;\n }\n }\n\n return this.memoizedContextValue;\n }\n }, {\n key: \"render\",\n value: function render() {\n var _this$props = this.props,\n classes = _this$props.classes,\n className = _this$props.className,\n Component = _this$props.component,\n padding = _this$props.padding,\n other = (0, _objectWithoutProperties2.default)(_this$props, [\"classes\", \"className\", \"component\", \"padding\"]);\n return _react.default.createElement(_TableContext.default.Provider, {\n value: this.useMemo({\n padding: padding\n })\n }, _react.default.createElement(Component, (0, _extends2.default)({\n className: (0, _classnames.default)(classes.root, className)\n }, other)));\n }\n }]);\n return Table;\n}(_react.default.Component);\n\nprocess.env.NODE_ENV !== \"production\" ? Table.propTypes = {\n /**\r\n * The content of the table, normally ` + "`") + (`TableHead` + ("`" + ` and `))) + (("`" + (`TableBody` + "`")) + (`.\r\n */\n children: _propTypes.default.node.isRequired,\n\n /**\r\n * Override or extend the styles applied to the component.\r\n * See [CSS API](#css-api) below for more details.\r\n */\n classes: _propTypes.default.object.isRequired,\n\n /**\r\n * @ignore\r\n */\n className: _propTypes.default.string,\n\n /**\r\n * The component used for the root node.\r\n * Either a string to use a DOM element or a component.\r\n */\n component: _utils.componentPropType,\n\n /**\r\n * Allows TableCells to inherit padding of the Table.\r\n */\n padding: _propTypes.default.oneOf(['default', 'checkbox', 'dense', 'none'])\n} : void 0;\nTable.defaultProps = {\n component: 'table',\n padding: 'default'\n};\n\nvar _default = (0, _withStyles.default)(styles, {\n name: 'MuiTable'\n})(Table);\n\nexports.default = _default;", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = exports.styles = void 0;\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _objectWithoutProperties2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectWithoutProperties\"));\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/classCallCheck\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/createClass\"));\n\nvar _possibleConstructorReturn2 = _interopRequireDefault(require(\"@babel/runtime/helpers/possibleConstructorReturn\"));\n\nvar _getPrototypeOf3 = _interopRequireDefault(require(\"@babel/runtime/helpers/getPrototypeOf\"));\n\nvar _inherits2 = _interopRequireDefault(require(\"@babel/runtime/helpers/inherits\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _classnames = _interopRequireDefault(require(\"classnames\"));\n\nvar _utils = require(\"@material-ui/utils\");\n\nvar _withStyles = _interopRequireDefault(require(\"../styles/withStyles\"));\n\nvar _TableContext = _interopRequireDefault(require(\"./TableContext\"));\n\nvar styles = function styles(theme) {\n return {\n /* Styles applied to the root element. */\n root: {\n display: 'table',\n fontFamily: theme.typography.fontFamily,\n width: '100%',\n borderCollapse: 'collapse',\n borderSpacing: 0\n }\n };\n};\n\nexports.styles = styles;\n\nvar Table =\n/*#__PURE__*/\nfunction (_React$Component) {\n (0, _inherits2.default)(Table, _React$Component);\n\n function Table() {\n var _getPrototypeOf2;\n\n var _this;\n\n (0, _classCallCheck2.default)(this, Table);\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n _this = (0, _possibleConstructorReturn2.default)(this, (_getPrototypeOf2 = (0, _getPrototypeOf3.default)(Table)).call.apply(_getPrototypeOf2, [this].concat(args)));\n _this.memoizedContextValue = {};\n return _this;\n }\n\n (0, _createClass2.default)(Table, [{\n key: \"useMemo\",\n // To replace with the corresponding Hook once Material-UI v4 is out:\n // https://reactjs.org/docs/hooks-reference.html#usememo\n value: function useMemo(contextValue) {\n var objectKeys = Object.keys(contextValue);\n\n for (var i = 0; i < objectKeys.length; i += 1) {\n var objectKey = objectKeys[i];\n\n if (contextValue[objectKey] !== this.memoizedContextValue[objectKey]) {\n this.memoizedContextValue = contextValue;\n break;\n }\n }\n\n return this.memoizedContextValue;\n }\n }, {\n key: \"render\",\n value: function render() {\n var _this$props = this.props,\n classes = _this$props.classes,\n className = _this$props.className,\n Component = _this$props.component,\n padding = _this$props.padding,\n other = (0, _objectWithoutProperties2.default)(_this$props, [\"classes\", \"className\", \"component\", \"padding\"]);\n return _react.default.createElement(_TableContext.default.Provider, {\n value: this.useMemo({\n padding: padding\n })\n }, _react.default.createElement(Component, (0, _extends2.default)({\n className: (0, _classnames.default)(classes.root, className)\n }, other)));\n }\n }]);\n return Table;\n}(_react.default.Component);\n\nprocess.env.NODE_ENV !== \"production\" ? Table.propTypes = {\n /**\r\n * The content of the table, normally ` + "`")))) + (((`TableHead` + ("`" + ` and `)) + ("`" + (`TableBody` + "`"))) + ((`.\r\n */\n children: _propTypes.default.node.isRequired,\n\n /**\r\n * Override or extend the styles applied to the component.\r\n * See [CSS API](#css-api) below for more details.\r\n */\n classes: _propTypes.default.object.isRequired,\n\n /**\r\n * @ignore\r\n */\n className: _propTypes.default.string,\n\n /**\r\n * The component used for the root node.\r\n * Either a string to use a DOM element or a component.\r\n */\n component: _utils.componentPropType,\n\n /**\r\n * Allows TableCells to inherit padding of the Table.\r\n */\n padding: _propTypes.default.oneOf(['default', 'checkbox', 'dense', 'none'])\n} : void 0;\nTable.defaultProps = {\n component: 'table',\n padding: 'default'\n};\n\nvar _default = (0, _withStyles.default)(styles, {\n name: 'MuiTable'\n})(Table);\n\nexports.default = _default;", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\n/**\r\n * @ignore - internal component.\r\n */\nvar TableContext = _react.default.createContext();\n\nvar _default = TableContext;\nexports.default = _default;", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\n/**\r\n * @ignore - internal component.\r\n */\nvar Tablelvl2Context = _react.default.createContext();\n\nvar _default = Tablelvl2Context;\nexports.default = _default;", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nObject.defineProperty(exports, \"default\", {\n enumerable: true,\n get: function get() {\n return _Table.default;\n }\n});\n\nvar _Table = _interopRequireDefault(require(\"./Table\"));", - "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = exports.styles = void 0;\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _objectWithoutProperties2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectWithoutProperties\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _classnames = _interopRequireDefault(require(\"classnames\"));\n\nvar _utils = require(\"@material-ui/utils\");\n\nvar _withStyles = _interopRequireDefault(require(\"../styles/withStyles\"));\n\nvar _Tablelvl2Context = _interopRequireDefault(require(\"../Table/Tablelvl2Context\"));\n\nvar styles = {\n /* Styles applied to the root element. */\n root: {\n display: 'table-row-group'\n }\n};\nexports.styles = styles;\nvar contextValue = {\n variant: 'body'\n};\n\nfunction TableBody(props) {\n var classes = props.classes,\n className = props.className,\n Component = props.component,\n other = (0, _objectWithoutProperties2.default)(props, [\"classes\", \"className\", \"component\"]);\n return _react.default.createElement(_Tablelvl2Context.default.Provider, {\n value: contextValue\n }, _react.default.createElement(Component, (0, _extends2.default)({\n className: (0, _classnames.default)(classes.root, className)\n }, other)));\n}\n\nprocess.env.NODE_ENV !== \"production\" ? TableBody.propTypes = {\n /**\r\n * The content of the component, normally ` + ("`" + `TableRow`))))) + (((("`" + `.\r\n */\n children: _propTypes.default.node,\n\n /**\r\n * Override or extend the styles applied to the component.\r\n * See [CSS API](#css-api) below for more details.\r\n */\n classes: _propTypes.default.object.isRequired,\n\n /**\r\n * @ignore\r\n */\n className: _propTypes.default.string,\n\n /**\r\n * The component used for the root node.\r\n * Either a string to use a DOM element or a component.\r\n */\n component: _utils.componentPropType\n} : void 0;\nTableBody.defaultProps = {\n component: 'tbody'\n};\n\nvar _default = (0, _withStyles.default)(styles, {\n name: 'MuiTableBody'\n})(TableBody);\n\nexports.default = _default;", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = exports.styles = void 0;\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _objectWithoutProperties2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectWithoutProperties\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _classnames = _interopRequireDefault(require(\"classnames\"));\n\nvar _utils = require(\"@material-ui/utils\");\n\nvar _withStyles = _interopRequireDefault(require(\"../styles/withStyles\"));\n\nvar _Tablelvl2Context = _interopRequireDefault(require(\"../Table/Tablelvl2Context\"));\n\nvar styles = {\n /* Styles applied to the root element. */\n root: {\n display: 'table-row-group'\n }\n};\nexports.styles = styles;\nvar contextValue = {\n variant: 'body'\n};\n\nfunction TableBody(props) {\n var classes = props.classes,\n className = props.className,\n Component = props.component,\n other = (0, _objectWithoutProperties2.default)(props, [\"classes\", \"className\", \"component\"]);\n return _react.default.createElement(_Tablelvl2Context.default.Provider, {\n value: contextValue\n }, _react.default.createElement(Component, (0, _extends2.default)({\n className: (0, _classnames.default)(classes.root, className)\n }, other)));\n}\n\nprocess.env.NODE_ENV !== \"production\" ? TableBody.propTypes = {\n /**\r\n * The content of the component, normally ` + ("`" + `TableRow`)) + (("`" + `.\r\n */\n children: _propTypes.default.node,\n\n /**\r\n * Override or extend the styles applied to the component.\r\n * See [CSS API](#css-api) below for more details.\r\n */\n classes: _propTypes.default.object.isRequired,\n\n /**\r\n * @ignore\r\n */\n className: _propTypes.default.string,\n\n /**\r\n * The component used for the root node.\r\n * Either a string to use a DOM element or a component.\r\n */\n component: _utils.componentPropType\n} : void 0;\nTableBody.defaultProps = {\n component: 'tbody'\n};\n\nvar _default = (0, _withStyles.default)(styles, {\n name: 'MuiTableBody'\n})(TableBody);\n\nexports.default = _default;", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nObject.defineProperty(exports, \"default\", {\n enumerable: true,\n get: function get() {\n return _TableBody.default;\n }\n});\n\nvar _TableBody = _interopRequireDefault(require(\"./TableBody\"));", - "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = exports.styles = void 0;\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/defineProperty\"));\n\nvar _objectWithoutProperties2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectWithoutProperties\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _classnames = _interopRequireDefault(require(\"classnames\"));\n\nvar _utils = require(\"@material-ui/utils\");\n\nvar _withStyles = _interopRequireDefault(require(\"../styles/withStyles\"));\n\nvar _helpers = require(\"../utils/helpers\");\n\nvar _deprecatedPropType = _interopRequireDefault(require(\"../utils/deprecatedPropType\"));\n\nvar _colorManipulator = require(\"../styles/colorManipulator\");\n\nvar _TableContext = _interopRequireDefault(require(\"../Table/TableContext\"));\n\nvar _Tablelvl2Context = _interopRequireDefault(require(\"../Table/Tablelvl2Context\"));\n\nvar styles = function styles(theme) {\n return {\n /* Styles applied to the root element. */\n root: {\n display: 'table-cell',\n verticalAlign: 'inherit',\n // Workaround for a rendering bug with spanned columns in Chrome 62.0.\n // Removes the alpha (sets it to 1), and lightens or darkens the theme color.\n borderBottom: \"1px solid\\n \".concat(theme.palette.type === 'light' ? (0, _colorManipulator.lighten)((0, _colorManipulator.fade)(theme.palette.divider, 1), 0.88) : (0, _colorManipulator.darken)((0, _colorManipulator.fade)(theme.palette.divider, 1), 0.68)),\n textAlign: 'left',\n padding: '4px 56px 4px 24px',\n '&:last-child': {\n paddingRight: 24\n }\n },\n\n /* Styles applied to the root element if `) + ("`" + (`variant=\"head\"` + "`"))) + ((` or ` + ("`" + `context.table.head`)) + ("`" + (`. */\n head: {\n color: theme.palette.text.secondary,\n fontSize: theme.typography.pxToRem(12),\n fontWeight: theme.typography.fontWeightMedium\n },\n\n /* Styles applied to the root element if ` + "`")))) + (((`variant=\"body\"` + ("`" + ` or `)) + ("`" + (`context.table.body` + "`"))) + ((`. */\n body: {\n color: theme.palette.text.primary,\n fontSize: theme.typography.pxToRem(13),\n fontWeight: theme.typography.fontWeightRegular\n },\n\n /* Styles applied to the root element if ` + ("`" + `variant=\"footer\"`)) + ("`" + (` or ` + "`")))))))) + (((((((`context.table.footer` + "`") + (`. */\n footer: {\n borderBottom: 0,\n color: theme.palette.text.secondary,\n fontSize: theme.typography.pxToRem(12)\n },\n\n /* Styles applied to the root element if ` + ("`" + `numeric={true}`))) + (("`" + (`. */\n numeric: {\n textAlign: 'right',\n flexDirection: 'row-reverse' // can be dynamically inherited at runtime by contents\n\n },\n\n /* Styles applied to the root element if ` + "`")) + (`padding=\"dense\"` + ("`" + `. */\n paddingDense: {\n paddingRight: 24\n },\n\n /* Styles applied to the root element if `)))) + ((("`" + `padding=\"checkbox\"`) + ("`" + (`. */\n paddingCheckbox: {\n padding: '0 12px',\n '&:last-child': {\n paddingRight: 12\n }\n },\n\n /* Styles applied to the root element if ` + "`"))) + ((`padding=\"none\"` + ("`" + `. */\n paddingNone: {\n padding: 0,\n '&:last-child': {\n padding: 0\n }\n },\n\n /* Styles applied to the root element if `)) + ("`" + (`align=\"left\"` + "`"))))) + ((((`. */\n alignLeft: {\n textAlign: 'left'\n },\n\n /* Styles applied to the root element if ` + "`") + (`align=\"center\"` + ("`" + `. */\n alignCenter: {\n textAlign: 'center'\n },\n\n /* Styles applied to the root element if `))) + (("`" + (`align=\"right\"` + "`")) + (`. */\n alignRight: {\n textAlign: 'right',\n flexDirection: 'row-reverse'\n },\n\n /* Styles applied to the root element if ` + ("`" + `align=\"justify\"`)))) + ((("`" + `. */\n alignJustify: {\n textAlign: 'justify'\n }\n };\n};\n\nexports.styles = styles;\n\nfunction TableCell(props) {\n var align = props.align,\n children = props.children,\n classes = props.classes,\n classNameProp = props.className,\n component = props.component,\n sortDirection = props.sortDirection,\n _props$numeric = props.numeric,\n numeric = _props$numeric === void 0 ? false : _props$numeric,\n paddingProp = props.padding,\n scopeProp = props.scope,\n variant = props.variant,\n other = (0, _objectWithoutProperties2.default)(props, [\"align\", \"children\", \"classes\", \"className\", \"component\", \"sortDirection\", \"numeric\", \"padding\", \"scope\", \"variant\"]);\n return _react.default.createElement(_TableContext.default.Consumer, null, function (table) {\n return _react.default.createElement(_Tablelvl2Context.default.Consumer, null, function (tablelvl2) {\n var _classNames;\n\n var Component;\n\n if (component) {\n Component = component;\n } else {\n Component = tablelvl2 && tablelvl2.variant === 'head' ? 'th' : 'td';\n }\n\n var scope = scopeProp;\n\n if (!scope && tablelvl2 && tablelvl2.variant === 'head') {\n scope = 'col';\n }\n\n var padding = paddingProp || (table && table.padding ? table.padding : 'default');\n var className = (0, _classnames.default)(classes.root, (_classNames = {}, (0, _defineProperty2.default)(_classNames, classes.head, variant ? variant === 'head' : tablelvl2 && tablelvl2.variant === 'head'), (0, _defineProperty2.default)(_classNames, classes.body, variant ? variant === 'body' : tablelvl2 && tablelvl2.variant === 'body'), (0, _defineProperty2.default)(_classNames, classes.footer, variant ? variant === 'footer' : tablelvl2 && tablelvl2.variant === 'footer'), (0, _defineProperty2.default)(_classNames, classes[\"align\".concat((0, _helpers.capitalize)(align))], align !== 'inherit'), (0, _defineProperty2.default)(_classNames, classes.numeric, numeric), (0, _defineProperty2.default)(_classNames, classes[\"padding\".concat((0, _helpers.capitalize)(padding))], padding !== 'default'), _classNames), classNameProp);\n var ariaSort = null;\n\n if (sortDirection) {\n ariaSort = sortDirection === 'asc' ? 'ascending' : 'descending';\n }\n\n return _react.default.createElement(Component, (0, _extends2.default)({\n className: className,\n \"aria-sort\": ariaSort,\n scope: scope\n }, other), children);\n });\n });\n}\n\nprocess.env.NODE_ENV !== \"production\" ? TableCell.propTypes = {\n /**\r\n * Set the text-align on the table cell content.\r\n *\r\n * Monetary or generally number fields **should be right aligned** as that allows\r\n * you to add them up quickly in your head without having to worry about decimals.\r\n */\n align: _propTypes.default.oneOf(['inherit', 'left', 'center', 'right', 'justify']),\n\n /**\r\n * The table cell contents.\r\n */\n children: _propTypes.default.node,\n\n /**\r\n * Override or extend the styles applied to the component.\r\n * See [CSS API](#css-api) below for more details.\r\n */\n classes: _propTypes.default.object.isRequired,\n\n /**\r\n * @ignore\r\n */\n className: _propTypes.default.string,\n\n /**\r\n * The component used for the root node.\r\n * Either a string to use a DOM element or a component.\r\n */\n component: _utils.componentPropType,\n\n /**\r\n * If `) + ("`" + (`true` + "`"))) + ((`, content will align to the right.\r\n */\n numeric: (0, _deprecatedPropType.default)(_propTypes.default.bool, 'Instead, use the ` + ("`" + `align`)) + ("`" + (` property.'),\n\n /**\r\n * Sets the padding applied to the cell.\r\n * By default, the Table parent component set the value.\r\n */\n padding: _propTypes.default.oneOf(['default', 'checkbox', 'dense', 'none']),\n\n /**\r\n * Set scope attribute.\r\n */\n scope: _propTypes.default.string,\n\n /**\r\n * Set aria-sort direction.\r\n */\n sortDirection: _propTypes.default.oneOf(['asc', 'desc', false]),\n\n /**\r\n * Specify the cell type.\r\n * By default, the TableHead, TableBody or TableFooter parent component set the value.\r\n */\n variant: _propTypes.default.oneOf(['head', 'body', 'footer'])\n} : void 0;\nTableCell.defaultProps = {\n align: 'inherit'\n};\n\nvar _default = (0, _withStyles.default)(styles, {\n name: 'MuiTableCell'\n})(TableCell);\n\nexports.default = _default;", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = exports.styles = void 0;\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/defineProperty\"));\n\nvar _objectWithoutProperties2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectWithoutProperties\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _classnames = _interopRequireDefault(require(\"classnames\"));\n\nvar _utils = require(\"@material-ui/utils\");\n\nvar _withStyles = _interopRequireDefault(require(\"../styles/withStyles\"));\n\nvar _helpers = require(\"../utils/helpers\");\n\nvar _deprecatedPropType = _interopRequireDefault(require(\"../utils/deprecatedPropType\"));\n\nvar _colorManipulator = require(\"../styles/colorManipulator\");\n\nvar _TableContext = _interopRequireDefault(require(\"../Table/TableContext\"));\n\nvar _Tablelvl2Context = _interopRequireDefault(require(\"../Table/Tablelvl2Context\"));\n\nvar styles = function styles(theme) {\n return {\n /* Styles applied to the root element. */\n root: {\n display: 'table-cell',\n verticalAlign: 'inherit',\n // Workaround for a rendering bug with spanned columns in Chrome 62.0.\n // Removes the alpha (sets it to 1), and lightens or darkens the theme color.\n borderBottom: \"1px solid\\n \".concat(theme.palette.type === 'light' ? (0, _colorManipulator.lighten)((0, _colorManipulator.fade)(theme.palette.divider, 1), 0.88) : (0, _colorManipulator.darken)((0, _colorManipulator.fade)(theme.palette.divider, 1), 0.68)),\n textAlign: 'left',\n padding: '4px 56px 4px 24px',\n '&:last-child': {\n paddingRight: 24\n }\n },\n\n /* Styles applied to the root element if `) + ("`" + `variant=\"head\"`))))) + (((("`" + (` or ` + "`")) + (`context.table.head` + ("`" + `. */\n head: {\n color: theme.palette.text.secondary,\n fontSize: theme.typography.pxToRem(12),\n fontWeight: theme.typography.fontWeightMedium\n },\n\n /* Styles applied to the root element if `))) + (("`" + (`variant=\"body\"` + "`")) + (` or ` + ("`" + `context.table.body`)))) + ((("`" + (`. */\n body: {\n color: theme.palette.text.primary,\n fontSize: theme.typography.pxToRem(13),\n fontWeight: theme.typography.fontWeightRegular\n },\n\n /* Styles applied to the root element if ` + "`")) + (`variant=\"footer\"` + ("`" + ` or `))) + (("`" + (`context.table.footer` + "`")) + ((`. */\n footer: {\n borderBottom: 0,\n color: theme.palette.text.secondary,\n fontSize: theme.typography.pxToRem(12)\n },\n\n /* Styles applied to the root element if ` + "`") + (`numeric={true}` + "`"))))))) + ((((((`. */\n numeric: {\n textAlign: 'right',\n flexDirection: 'row-reverse' // can be dynamically inherited at runtime by contents\n\n },\n\n /* Styles applied to the root element if ` + ("`" + `padding=\"dense\"`)) + ("`" + (`. */\n paddingDense: {\n paddingRight: 24\n },\n\n /* Styles applied to the root element if ` + "`"))) + ((`padding=\"checkbox\"` + ("`" + `. */\n paddingCheckbox: {\n padding: '0 12px',\n '&:last-child': {\n paddingRight: 12\n }\n },\n\n /* Styles applied to the root element if `)) + ("`" + (`padding=\"none\"` + "`")))) + (((`. */\n paddingNone: {\n padding: 0,\n '&:last-child': {\n padding: 0\n }\n },\n\n /* Styles applied to the root element if ` + ("`" + `align=\"left\"`)) + ("`" + (`. */\n alignLeft: {\n textAlign: 'left'\n },\n\n /* Styles applied to the root element if ` + "`"))) + ((`align=\"center\"` + ("`" + `. */\n alignCenter: {\n textAlign: 'center'\n },\n\n /* Styles applied to the root element if `)) + ("`" + (`align=\"right\"` + "`"))))) + ((((`. */\n alignRight: {\n textAlign: 'right',\n flexDirection: 'row-reverse'\n },\n\n /* Styles applied to the root element if ` + ("`" + `align=\"justify\"`)) + ("`" + (`. */\n alignJustify: {\n textAlign: 'justify'\n }\n };\n};\n\nexports.styles = styles;\n\nfunction TableCell(props) {\n var align = props.align,\n children = props.children,\n classes = props.classes,\n classNameProp = props.className,\n component = props.component,\n sortDirection = props.sortDirection,\n _props$numeric = props.numeric,\n numeric = _props$numeric === void 0 ? false : _props$numeric,\n paddingProp = props.padding,\n scopeProp = props.scope,\n variant = props.variant,\n other = (0, _objectWithoutProperties2.default)(props, [\"align\", \"children\", \"classes\", \"className\", \"component\", \"sortDirection\", \"numeric\", \"padding\", \"scope\", \"variant\"]);\n return _react.default.createElement(_TableContext.default.Consumer, null, function (table) {\n return _react.default.createElement(_Tablelvl2Context.default.Consumer, null, function (tablelvl2) {\n var _classNames;\n\n var Component;\n\n if (component) {\n Component = component;\n } else {\n Component = tablelvl2 && tablelvl2.variant === 'head' ? 'th' : 'td';\n }\n\n var scope = scopeProp;\n\n if (!scope && tablelvl2 && tablelvl2.variant === 'head') {\n scope = 'col';\n }\n\n var padding = paddingProp || (table && table.padding ? table.padding : 'default');\n var className = (0, _classnames.default)(classes.root, (_classNames = {}, (0, _defineProperty2.default)(_classNames, classes.head, variant ? variant === 'head' : tablelvl2 && tablelvl2.variant === 'head'), (0, _defineProperty2.default)(_classNames, classes.body, variant ? variant === 'body' : tablelvl2 && tablelvl2.variant === 'body'), (0, _defineProperty2.default)(_classNames, classes.footer, variant ? variant === 'footer' : tablelvl2 && tablelvl2.variant === 'footer'), (0, _defineProperty2.default)(_classNames, classes[\"align\".concat((0, _helpers.capitalize)(align))], align !== 'inherit'), (0, _defineProperty2.default)(_classNames, classes.numeric, numeric), (0, _defineProperty2.default)(_classNames, classes[\"padding\".concat((0, _helpers.capitalize)(padding))], padding !== 'default'), _classNames), classNameProp);\n var ariaSort = null;\n\n if (sortDirection) {\n ariaSort = sortDirection === 'asc' ? 'ascending' : 'descending';\n }\n\n return _react.default.createElement(Component, (0, _extends2.default)({\n className: className,\n \"aria-sort\": ariaSort,\n scope: scope\n }, other), children);\n });\n });\n}\n\nprocess.env.NODE_ENV !== \"production\" ? TableCell.propTypes = {\n /**\r\n * Set the text-align on the table cell content.\r\n *\r\n * Monetary or generally number fields **should be right aligned** as that allows\r\n * you to add them up quickly in your head without having to worry about decimals.\r\n */\n align: _propTypes.default.oneOf(['inherit', 'left', 'center', 'right', 'justify']),\n\n /**\r\n * The table cell contents.\r\n */\n children: _propTypes.default.node,\n\n /**\r\n * Override or extend the styles applied to the component.\r\n * See [CSS API](#css-api) below for more details.\r\n */\n classes: _propTypes.default.object.isRequired,\n\n /**\r\n * @ignore\r\n */\n className: _propTypes.default.string,\n\n /**\r\n * The component used for the root node.\r\n * Either a string to use a DOM element or a component.\r\n */\n component: _utils.componentPropType,\n\n /**\r\n * If ` + "`"))) + ((`true` + ("`" + `, content will align to the right.\r\n */\n numeric: (0, _deprecatedPropType.default)(_propTypes.default.bool, 'Instead, use the `)) + ("`" + (`align` + "`")))) + (((` property.'),\n\n /**\r\n * Sets the padding applied to the cell.\r\n * By default, the Table parent component set the value.\r\n */\n padding: _propTypes.default.oneOf(['default', 'checkbox', 'dense', 'none']),\n\n /**\r\n * Set scope attribute.\r\n */\n scope: _propTypes.default.string,\n\n /**\r\n * Set aria-sort direction.\r\n */\n sortDirection: _propTypes.default.oneOf(['asc', 'desc', false]),\n\n /**\r\n * Specify the cell type.\r\n * By default, the TableHead, TableBody or TableFooter parent component set the value.\r\n */\n variant: _propTypes.default.oneOf(['head', 'body', 'footer'])\n} : void 0;\nTableCell.defaultProps = {\n align: 'inherit'\n};\n\nvar _default = (0, _withStyles.default)(styles, {\n name: 'MuiTableCell'\n})(TableCell);\n\nexports.default = _default;", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nObject.defineProperty(exports, \"default\", {\n enumerable: true,\n get: function get() {\n return _TableCell.default;\n }\n});\n\nvar _TableCell = _interopRequireDefault(require(\"./TableCell\"));", - "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = exports.styles = void 0;\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _objectWithoutProperties2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectWithoutProperties\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _classnames = _interopRequireDefault(require(\"classnames\"));\n\nvar _utils = require(\"@material-ui/utils\");\n\nvar _withStyles = _interopRequireDefault(require(\"../styles/withStyles\"));\n\nvar _Tablelvl2Context = _interopRequireDefault(require(\"../Table/Tablelvl2Context\"));\n\nvar styles = {\n /* Styles applied to the root element. */\n root: {\n display: 'table-header-group'\n }\n};\nexports.styles = styles;\nvar contextValue = {\n variant: 'head'\n};\n\nfunction TableHead(props) {\n var classes = props.classes,\n className = props.className,\n Component = props.component,\n other = (0, _objectWithoutProperties2.default)(props, [\"classes\", \"className\", \"component\"]);\n return _react.default.createElement(_Tablelvl2Context.default.Provider, {\n value: contextValue\n }, _react.default.createElement(Component, (0, _extends2.default)({\n className: (0, _classnames.default)(classes.root, className)\n }, other)));\n}\n\nprocess.env.NODE_ENV !== \"production\" ? TableHead.propTypes = {\n /**\r\n * The content of the component, normally ` + "`")))))) + (((((`TableRow` + "`") + (`.\r\n */\n children: _propTypes.default.node,\n\n /**\r\n * Override or extend the styles applied to the component.\r\n * See [CSS API](#css-api) below for more details.\r\n */\n classes: _propTypes.default.object.isRequired,\n\n /**\r\n * @ignore\r\n */\n className: _propTypes.default.string,\n\n /**\r\n * The component used for the root node.\r\n * Either a string to use a DOM element or a component.\r\n */\n component: _utils.componentPropType\n} : void 0;\nTableHead.defaultProps = {\n component: 'thead'\n};\n\nvar _default = (0, _withStyles.default)(styles, {\n name: 'MuiTableHead'\n})(TableHead);\n\nexports.default = _default;", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = exports.styles = void 0;\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _objectWithoutProperties2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectWithoutProperties\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _classnames = _interopRequireDefault(require(\"classnames\"));\n\nvar _utils = require(\"@material-ui/utils\");\n\nvar _withStyles = _interopRequireDefault(require(\"../styles/withStyles\"));\n\nvar _Tablelvl2Context = _interopRequireDefault(require(\"../Table/Tablelvl2Context\"));\n\nvar styles = {\n /* Styles applied to the root element. */\n root: {\n display: 'table-header-group'\n }\n};\nexports.styles = styles;\nvar contextValue = {\n variant: 'head'\n};\n\nfunction TableHead(props) {\n var classes = props.classes,\n className = props.className,\n Component = props.component,\n other = (0, _objectWithoutProperties2.default)(props, [\"classes\", \"className\", \"component\"]);\n return _react.default.createElement(_Tablelvl2Context.default.Provider, {\n value: contextValue\n }, _react.default.createElement(Component, (0, _extends2.default)({\n className: (0, _classnames.default)(classes.root, className)\n }, other)));\n}\n\nprocess.env.NODE_ENV !== \"production\" ? TableHead.propTypes = {\n /**\r\n * The content of the component, normally ` + ("`" + `TableRow`)) + ("`" + (`.\r\n */\n children: _propTypes.default.node,\n\n /**\r\n * Override or extend the styles applied to the component.\r\n * See [CSS API](#css-api) below for more details.\r\n */\n classes: _propTypes.default.object.isRequired,\n\n /**\r\n * @ignore\r\n */\n className: _propTypes.default.string,\n\n /**\r\n * The component used for the root node.\r\n * Either a string to use a DOM element or a component.\r\n */\n component: _utils.componentPropType\n} : void 0;\nTableHead.defaultProps = {\n component: 'thead'\n};\n\nvar _default = (0, _withStyles.default)(styles, {\n name: 'MuiTableHead'\n})(TableHead);\n\nexports.default = _default;", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nObject.defineProperty(exports, \"default\", {\n enumerable: true,\n get: function get() {\n return _TableHead.default;\n }\n});\n\nvar _TableHead = _interopRequireDefault(require(\"./TableHead\"));", - "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = exports.styles = void 0;\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/defineProperty\"));\n\nvar _objectWithoutProperties2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectWithoutProperties\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _classnames = _interopRequireDefault(require(\"classnames\"));\n\nvar _utils = require(\"@material-ui/utils\");\n\nvar _withStyles = _interopRequireDefault(require(\"../styles/withStyles\"));\n\nvar _Tablelvl2Context = _interopRequireDefault(require(\"../Table/Tablelvl2Context\"));\n\nvar styles = function styles(theme) {\n return {\n /* Styles applied to the root element. */\n root: {\n color: 'inherit',\n display: 'table-row',\n height: 48,\n verticalAlign: 'middle',\n // We disable the focus ring for mouse, touch and keyboard users.\n outline: 'none',\n '&$selected': {\n backgroundColor: theme.palette.type === 'light' ? 'rgba(0, 0, 0, 0.04)' // grey[100]\n : 'rgba(255, 255, 255, 0.08)'\n },\n '&$hover:hover': {\n backgroundColor: theme.palette.type === 'light' ? 'rgba(0, 0, 0, 0.07)' // grey[200]\n : 'rgba(255, 255, 255, 0.14)'\n }\n },\n\n /* Styles applied to the root element if ` + ("`" + `selected={true}`))) + (("`" + (`. */\n selected: {},\n\n /* Styles applied to the root element if ` + "`")) + (`hover={true}` + ("`" + `. */\n hover: {},\n\n /* Styles applied to the root element if table variant = 'head'. */\n head: {\n height: 56\n },\n\n /* Styles applied to the root element if table variant = 'footer'. */\n footer: {\n height: 56\n }\n };\n};\n/**\r\n * Will automatically set dynamic row height\r\n * based on the material table element parent (head, body, etc).\r\n */\n\n\nexports.styles = styles;\n\nfunction TableRow(props) {\n var classes = props.classes,\n classNameProp = props.className,\n Component = props.component,\n hover = props.hover,\n selected = props.selected,\n other = (0, _objectWithoutProperties2.default)(props, [\"classes\", \"className\", \"component\", \"hover\", \"selected\"]);\n return _react.default.createElement(_Tablelvl2Context.default.Consumer, null, function (tablelvl2) {\n var _classNames;\n\n var className = (0, _classnames.default)(classes.root, (_classNames = {}, (0, _defineProperty2.default)(_classNames, classes.head, tablelvl2 && tablelvl2.variant === 'head'), (0, _defineProperty2.default)(_classNames, classes.footer, tablelvl2 && tablelvl2.variant === 'footer'), (0, _defineProperty2.default)(_classNames, classes.hover, hover), (0, _defineProperty2.default)(_classNames, classes.selected, selected), _classNames), classNameProp);\n return _react.default.createElement(Component, (0, _extends2.default)({\n className: className\n }, other));\n });\n}\n\nprocess.env.NODE_ENV !== \"production\" ? TableRow.propTypes = {\n /**\r\n * Should be valid children such as `)))) + ((("`" + `TableCell`) + ("`" + (`.\r\n */\n children: _propTypes.default.node,\n\n /**\r\n * Override or extend the styles applied to the component.\r\n * See [CSS API](#css-api) below for more details.\r\n */\n classes: _propTypes.default.object.isRequired,\n\n /**\r\n * @ignore\r\n */\n className: _propTypes.default.string,\n\n /**\r\n * The component used for the root node.\r\n * Either a string to use a DOM element or a component.\r\n */\n component: _utils.componentPropType,\n\n /**\r\n * If ` + "`"))) + ((`true` + ("`" + `, the table row will shade on hover.\r\n */\n hover: _propTypes.default.bool,\n\n /**\r\n * If `)) + ("`" + (`true` + "`"))))) + ((((`, the table row will have the selected shading.\r\n */\n selected: _propTypes.default.bool\n} : void 0;\nTableRow.defaultProps = {\n component: 'tr',\n hover: false,\n selected: false\n};\n\nvar _default = (0, _withStyles.default)(styles, {\n name: 'MuiTableRow'\n})(TableRow);\n\nexports.default = _default;", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = exports.styles = void 0;\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/defineProperty\"));\n\nvar _objectWithoutProperties2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectWithoutProperties\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _classnames = _interopRequireDefault(require(\"classnames\"));\n\nvar _utils = require(\"@material-ui/utils\");\n\nvar _withStyles = _interopRequireDefault(require(\"../styles/withStyles\"));\n\nvar _Tablelvl2Context = _interopRequireDefault(require(\"../Table/Tablelvl2Context\"));\n\nvar styles = function styles(theme) {\n return {\n /* Styles applied to the root element. */\n root: {\n color: 'inherit',\n display: 'table-row',\n height: 48,\n verticalAlign: 'middle',\n // We disable the focus ring for mouse, touch and keyboard users.\n outline: 'none',\n '&$selected': {\n backgroundColor: theme.palette.type === 'light' ? 'rgba(0, 0, 0, 0.04)' // grey[100]\n : 'rgba(255, 255, 255, 0.08)'\n },\n '&$hover:hover': {\n backgroundColor: theme.palette.type === 'light' ? 'rgba(0, 0, 0, 0.07)' // grey[200]\n : 'rgba(255, 255, 255, 0.14)'\n }\n },\n\n /* Styles applied to the root element if ` + "`"))) + ((`selected={true}` + ("`" + `. */\n selected: {},\n\n /* Styles applied to the root element if `)) + (("`" + `hover={true}`) + ("`" + `. */\n hover: {},\n\n /* Styles applied to the root element if table variant = 'head'. */\n head: {\n height: 56\n },\n\n /* Styles applied to the root element if table variant = 'footer'. */\n footer: {\n height: 56\n }\n };\n};\n/**\r\n * Will automatically set dynamic row height\r\n * based on the material table element parent (head, body, etc).\r\n */\n\n\nexports.styles = styles;\n\nfunction TableRow(props) {\n var classes = props.classes,\n classNameProp = props.className,\n Component = props.component,\n hover = props.hover,\n selected = props.selected,\n other = (0, _objectWithoutProperties2.default)(props, [\"classes\", \"className\", \"component\", \"hover\", \"selected\"]);\n return _react.default.createElement(_Tablelvl2Context.default.Consumer, null, function (tablelvl2) {\n var _classNames;\n\n var className = (0, _classnames.default)(classes.root, (_classNames = {}, (0, _defineProperty2.default)(_classNames, classes.head, tablelvl2 && tablelvl2.variant === 'head'), (0, _defineProperty2.default)(_classNames, classes.footer, tablelvl2 && tablelvl2.variant === 'footer'), (0, _defineProperty2.default)(_classNames, classes.hover, hover), (0, _defineProperty2.default)(_classNames, classes.selected, selected), _classNames), classNameProp);\n return _react.default.createElement(Component, (0, _extends2.default)({\n className: className\n }, other));\n });\n}\n\nprocess.env.NODE_ENV !== \"production\" ? TableRow.propTypes = {\n /**\r\n * Should be valid children such as `)))))) + ((((("`" + (`TableCell` + "`")) + (`.\r\n */\n children: _propTypes.default.node,\n\n /**\r\n * Override or extend the styles applied to the component.\r\n * See [CSS API](#css-api) below for more details.\r\n */\n classes: _propTypes.default.object.isRequired,\n\n /**\r\n * @ignore\r\n */\n className: _propTypes.default.string,\n\n /**\r\n * The component used for the root node.\r\n * Either a string to use a DOM element or a component.\r\n */\n component: _utils.componentPropType,\n\n /**\r\n * If ` + ("`" + `true`))) + (("`" + (`, the table row will shade on hover.\r\n */\n hover: _propTypes.default.bool,\n\n /**\r\n * If ` + "`")) + (`true` + ("`" + `, the table row will have the selected shading.\r\n */\n selected: _propTypes.default.bool\n} : void 0;\nTableRow.defaultProps = {\n component: 'tr',\n hover: false,\n selected: false\n};\n\nvar _default = (0, _withStyles.default)(styles, {\n name: 'MuiTableRow'\n})(TableRow);\n\nexports.default = _default;", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nObject.defineProperty(exports, \"default\", {\n enumerable: true,\n get: function get() {\n return _TableRow.default;\n }\n});\n\nvar _TableRow = _interopRequireDefault(require(\"./TableRow\"));", - "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = exports.styles = void 0;\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/defineProperty\"));\n\nvar _objectWithoutProperties2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectWithoutProperties\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _classnames = _interopRequireDefault(require(\"classnames\"));\n\nvar _withStyles = _interopRequireDefault(require(\"../styles/withStyles\"));\n\nvar styles = function styles(theme) {\n return {\n /* Styles applied to the root element. */\n root: {\n position: 'relative',\n display: 'flex',\n alignItems: 'center'\n },\n\n /* Styles applied to the root element if ` + "`") + (`disableGutters={false}` + ("`" + `. */\n gutters: theme.mixins.gutters(),\n\n /* Styles applied to the root element if `))) + (("`" + (`variant=\"regular\"` + "`")) + (`. */\n regular: theme.mixins.toolbar,\n\n /* Styles applied to the root element if ` + ("`" + `variant=\"dense\"`)))) + ((("`" + `. */\n dense: {\n minHeight: 48\n }\n };\n};\n\nexports.styles = styles;\n\nfunction Toolbar(props) {\n var children = props.children,\n classes = props.classes,\n classNameProp = props.className,\n disableGutters = props.disableGutters,\n variant = props.variant,\n other = (0, _objectWithoutProperties2.default)(props, [\"children\", \"classes\", \"className\", \"disableGutters\", \"variant\"]);\n var className = (0, _classnames.default)(classes.root, classes[variant], (0, _defineProperty2.default)({}, classes.gutters, !disableGutters), classNameProp);\n return _react.default.createElement(\"div\", (0, _extends2.default)({\n className: className\n }, other), children);\n}\n\nprocess.env.NODE_ENV !== \"production\" ? Toolbar.propTypes = {\n /**\r\n * Toolbar children, usually a mixture of `) + ("`" + (`IconButton` + "`"))) + ((`, ` + ("`" + `Button`)) + ("`" + (` and ` + "`"))))))) + ((((((`Typography` + "`") + (`.\r\n */\n children: _propTypes.default.node,\n\n /**\r\n * Override or extend the styles applied to the component.\r\n * See [CSS API](#css-api) below for more details.\r\n */\n classes: _propTypes.default.object.isRequired,\n\n /**\r\n * @ignore\r\n */\n className: _propTypes.default.string,\n\n /**\r\n * If ` + ("`" + `true`))) + (("`" + (`, disables gutter padding.\r\n */\n disableGutters: _propTypes.default.bool,\n\n /**\r\n * The variant to use.\r\n */\n variant: _propTypes.default.oneOf(['regular', 'dense'])\n} : void 0;\nToolbar.defaultProps = {\n disableGutters: false,\n variant: 'regular'\n};\n\nvar _default = (0, _withStyles.default)(styles, {\n name: 'MuiToolbar'\n})(Toolbar);\n\nexports.default = _default;", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = exports.styles = void 0;\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/defineProperty\"));\n\nvar _objectWithoutProperties2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectWithoutProperties\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _classnames = _interopRequireDefault(require(\"classnames\"));\n\nvar _withStyles = _interopRequireDefault(require(\"../styles/withStyles\"));\n\nvar styles = function styles(theme) {\n return {\n /* Styles applied to the root element. */\n root: {\n position: 'relative',\n display: 'flex',\n alignItems: 'center'\n },\n\n /* Styles applied to the root element if `)))) + ((("`" + (`disableGutters={false}` + "`")) + (`. */\n gutters: theme.mixins.gutters(),\n\n /* Styles applied to the root element if ` + ("`" + `variant=\"regular\"`))) + (("`" + (`. */\n regular: theme.mixins.toolbar,\n\n /* Styles applied to the root element if ` + "`")) + ((`variant=\"dense\"` + "`") + (`. */\n dense: {\n minHeight: 48\n }\n };\n};\n\nexports.styles = styles;\n\nfunction Toolbar(props) {\n var children = props.children,\n classes = props.classes,\n classNameProp = props.className,\n disableGutters = props.disableGutters,\n variant = props.variant,\n other = (0, _objectWithoutProperties2.default)(props, [\"children\", \"classes\", \"className\", \"disableGutters\", \"variant\"]);\n var className = (0, _classnames.default)(classes.root, classes[variant], (0, _defineProperty2.default)({}, classes.gutters, !disableGutters), classNameProp);\n return _react.default.createElement(\"div\", (0, _extends2.default)({\n className: className\n }, other), children);\n}\n\nprocess.env.NODE_ENV !== \"production\" ? Toolbar.propTypes = {\n /**\r\n * Toolbar children, usually a mixture of ` + "`"))))) + ((((`IconButton` + ("`" + `, `)) + ("`" + (`Button` + "`"))) + ((` and ` + ("`" + `Typography`)) + ("`" + (`.\r\n */\n children: _propTypes.default.node,\n\n /**\r\n * Override or extend the styles applied to the component.\r\n * See [CSS API](#css-api) below for more details.\r\n */\n classes: _propTypes.default.object.isRequired,\n\n /**\r\n * @ignore\r\n */\n className: _propTypes.default.string,\n\n /**\r\n * If ` + "`")))) + (((`true` + ("`" + `, disables gutter padding.\r\n */\n disableGutters: _propTypes.default.bool,\n\n /**\r\n * The variant to use.\r\n */\n variant: _propTypes.default.oneOf(['regular', 'dense'])\n} : void 0;\nToolbar.defaultProps = {\n disableGutters: false,\n variant: 'regular'\n};\n\nvar _default = (0, _withStyles.default)(styles, {\n name: 'MuiToolbar'\n})(Toolbar);\n\nexports.default = _default;", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nObject.defineProperty(exports, \"default\", {\n enumerable: true,\n get: function get() {\n return _Toolbar.default;\n }\n});\n\nvar _Toolbar = _interopRequireDefault(require(\"./Toolbar\"));", - "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = exports.styles = void 0;\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/defineProperty\"));\n\nvar _objectWithoutProperties2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectWithoutProperties\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _classnames = _interopRequireDefault(require(\"classnames\"));\n\nvar _utils = require(\"@material-ui/utils\");\n\nvar _withStyles = _interopRequireDefault(require(\"../styles/withStyles\"));\n\nvar _helpers = require(\"../utils/helpers\");\n\nvar styles = function styles(theme) {\n return {\n /* Styles applied to the root element. */\n root: {\n display: 'block',\n margin: 0\n },\n\n /* Styles applied to the root element if ` + "`")) + (`variant=\"display4\"` + ("`" + `. */\n display4: theme.typography.display4,\n\n /* Styles applied to the root element if `)))) + ((("`" + `variant=\"display3\"`) + ("`" + (`. */\n display3: theme.typography.display3,\n\n /* Styles applied to the root element if ` + "`"))) + ((`variant=\"display2\"` + ("`" + `. */\n display2: theme.typography.display2,\n\n /* Styles applied to the root element if `)) + ("`" + (`variant=\"display1\"` + "`"))))) + ((((`. */\n display1: theme.typography.display1,\n\n /* Styles applied to the root element if ` + "`") + (`variant=\"headline\"` + ("`" + `. */\n headline: theme.typography.headline,\n\n /* Styles applied to the root element if `))) + (("`" + (`variant=\"title\"` + "`")) + (`. */\n title: theme.typography.title,\n\n /* Styles applied to the root element if ` + ("`" + `variant=\"subheading\"`)))) + ((("`" + `. */\n subheading: theme.typography.subheading,\n\n /* Styles applied to the root element if `) + ("`" + (`variant=\"body2\"` + "`"))) + ((`. */\n body2: theme.typography.body2,\n\n /* Styles applied to the root element if ` + ("`" + `variant=\"body1\"`)) + ("`" + (`. */\n body1: theme.typography.body1,\n\n /* Styles applied to the root element if ` + "`")))))) + (((((`variant=\"caption\"` + "`") + (`. */\n caption: theme.typography.caption,\n\n /* Styles applied to the root element if ` + ("`" + `variant=\"button\"`))) + (("`" + (`. */\n button: theme.typography.button,\n\n /* Styles applied to the root element if ` + "`")) + (`variant=\"h1\"` + ("`" + `. */\n h1: theme.typography.h1,\n\n /* Styles applied to the root element if `)))) + ((("`" + `variant=\"h2\"`) + ("`" + (`. */\n h2: theme.typography.h2,\n\n /* Styles applied to the root element if ` + "`"))) + ((`variant=\"h3\"` + ("`" + `. */\n h3: theme.typography.h3,\n\n /* Styles applied to the root element if `)) + ("`" + (`variant=\"h4\"` + "`"))))) + ((((`. */\n h4: theme.typography.h4,\n\n /* Styles applied to the root element if ` + "`") + (`variant=\"h5\"` + ("`" + `. */\n h5: theme.typography.h5,\n\n /* Styles applied to the root element if `))) + (("`" + (`variant=\"h6\"` + "`")) + (`. */\n h6: theme.typography.h6,\n\n /* Styles applied to the root element if ` + ("`" + `variant=\"subtitle1\"`)))) + ((("`" + (`. */\n subtitle1: theme.typography.subtitle1,\n\n /* Styles applied to the root element if ` + "`")) + (`variant=\"subtitle2\"` + ("`" + `. */\n subtitle2: theme.typography.subtitle2,\n\n /* Styles applied to the root element if `))) + (("`" + (`variant=\"overline\"` + "`")) + (`. */\n overline: theme.typography.overline,\n\n /* Styles applied to the root element if ` + ("`" + `variant=\"srOnly\"`))))))))) + (((((((("`" + `. Only accessible to screen readers. */\n srOnly: {\n position: 'absolute',\n height: 1,\n width: 1,\n overflow: 'hidden'\n },\n\n /* Styles applied to the root element if `) + ("`" + (`align=\"left\"` + "`"))) + ((`. */\n alignLeft: {\n textAlign: 'left'\n },\n\n /* Styles applied to the root element if ` + ("`" + `align=\"center\"`)) + ("`" + (`. */\n alignCenter: {\n textAlign: 'center'\n },\n\n /* Styles applied to the root element if ` + "`")))) + (((`align=\"right\"` + "`") + (`. */\n alignRight: {\n textAlign: 'right'\n },\n\n /* Styles applied to the root element if ` + ("`" + `align=\"justify\"`))) + (("`" + (`. */\n alignJustify: {\n textAlign: 'justify'\n },\n\n /* Styles applied to the root element if ` + "`")) + (`align=\"nowrap\"` + ("`" + `. */\n noWrap: {\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap'\n },\n\n /* Styles applied to the root element if `))))) + (((("`" + `gutterBottom={true}`) + ("`" + (`. */\n gutterBottom: {\n marginBottom: '0.35em'\n },\n\n /* Styles applied to the root element if ` + "`"))) + ((`paragraph={true}` + ("`" + `. */\n paragraph: {\n marginBottom: 16\n },\n\n /* Styles applied to the root element if `)) + ("`" + (`color=\"inherit\"` + "`")))) + (((`. */\n colorInherit: {\n color: 'inherit'\n },\n\n /* Styles applied to the root element if ` + "`") + (`color=\"primary\"` + ("`" + `. */\n colorPrimary: {\n color: theme.palette.primary.main\n },\n\n /* Styles applied to the root element if `))) + (("`" + (`color=\"secondary\"` + "`")) + (`. */\n colorSecondary: {\n color: theme.palette.secondary.main\n },\n\n /* Styles applied to the root element if ` + ("`" + `color=\"textPrimary\"`)))))) + ((((("`" + `. */\n colorTextPrimary: {\n color: theme.palette.text.primary\n },\n\n /* Styles applied to the root element if `) + ("`" + (`color=\"textSecondary\"` + "`"))) + ((`. */\n colorTextSecondary: {\n color: theme.palette.text.secondary\n },\n\n /* Styles applied to the root element if ` + ("`" + `color=\"error\"`)) + ("`" + (`. */\n colorError: {\n color: theme.palette.error.main\n },\n\n /* Styles applied to the root element if ` + "`")))) + (((`inline={true}` + "`") + (`. */\n inline: {\n display: 'inline'\n }\n };\n};\n\nexports.styles = styles;\nvar nextVariants = {\n display4: 'h1',\n display3: 'h2',\n display2: 'h3',\n display1: 'h4',\n headline: 'h5',\n title: 'h6',\n subheading: 'subtitle1'\n};\n\nfunction getVariant(theme, variantProp) {\n var typography = theme.typography;\n var variant = variantProp;\n\n if (!variant) {\n variant = typography.useNextVariants ? 'body2' : 'body1';\n } // complete v2 switch\n\n\n if (typography.useNextVariants) {\n variant = nextVariants[variant] || variant;\n }\n\n return variant;\n}\n\nvar defaultHeadlineMapping = {\n h1: 'h1',\n h2: 'h2',\n h3: 'h3',\n h4: 'h4',\n h5: 'h5',\n h6: 'h6',\n subtitle1: 'h6',\n subtitle2: 'h6',\n body1: 'p',\n body2: 'p',\n // deprecated\n display4: 'h1',\n display3: 'h1',\n display2: 'h1',\n display1: 'h1',\n headline: 'h1',\n title: 'h2',\n subheading: 'h3'\n};\n\nfunction Typography(props) {\n var _classNames;\n\n var align = props.align,\n classes = props.classes,\n classNameProp = props.className,\n color = props.color,\n componentProp = props.component,\n gutterBottom = props.gutterBottom,\n headlineMapping = props.headlineMapping,\n inline = props.inline,\n internalDeprecatedVariant = props.internalDeprecatedVariant,\n noWrap = props.noWrap,\n paragraph = props.paragraph,\n theme = props.theme,\n variantProp = props.variant,\n other = (0, _objectWithoutProperties2.default)(props, [\"align\", \"classes\", \"className\", \"color\", \"component\", \"gutterBottom\", \"headlineMapping\", \"inline\", \"internalDeprecatedVariant\", \"noWrap\", \"paragraph\", \"theme\", \"variant\"]);\n var variant = getVariant(theme, variantProp);\n var className = (0, _classnames.default)(classes.root, (_classNames = {}, (0, _defineProperty2.default)(_classNames, classes[variant], variant !== 'inherit'), (0, _defineProperty2.default)(_classNames, classes[\"color\".concat((0, _helpers.capitalize)(color))], color !== 'default'), (0, _defineProperty2.default)(_classNames, classes.noWrap, noWrap), (0, _defineProperty2.default)(_classNames, classes.gutterBottom, gutterBottom), (0, _defineProperty2.default)(_classNames, classes.paragraph, paragraph), (0, _defineProperty2.default)(_classNames, classes[\"align\".concat((0, _helpers.capitalize)(align))], align !== 'inherit'), (0, _defineProperty2.default)(_classNames, classes.inline, inline), _classNames), classNameProp);\n var Component = componentProp || (paragraph ? 'p' : headlineMapping[variant] || defaultHeadlineMapping[variant]) || 'span';\n return _react.default.createElement(Component, (0, _extends2.default)({\n className: className\n }, other));\n}\n\nprocess.env.NODE_ENV !== \"production\" ? Typography.propTypes = {\n /**\r\n * Set the text-align on the component.\r\n */\n align: _propTypes.default.oneOf(['inherit', 'left', 'center', 'right', 'justify']),\n\n /**\r\n * The content of the component.\r\n */\n children: _propTypes.default.node,\n\n /**\r\n * Override or extend the styles applied to the component.\r\n * See [CSS API](#css-api) below for more details.\r\n */\n classes: _propTypes.default.object.isRequired,\n\n /**\r\n * @ignore\r\n */\n className: _propTypes.default.string,\n\n /**\r\n * The color of the component. It supports those theme colors that make sense for this component.\r\n */\n color: _propTypes.default.oneOf(['default', 'error', 'inherit', 'primary', 'secondary', 'textPrimary', 'textSecondary']),\n\n /**\r\n * The component used for the root node.\r\n * Either a string to use a DOM element or a component.\r\n * By default, it maps the variant to a good default headline component.\r\n */\n component: _utils.componentPropType,\n\n /**\r\n * If ` + ("`" + `true`))) + (("`" + (`, the text will have a bottom margin.\r\n */\n gutterBottom: _propTypes.default.bool,\n\n /**\r\n * We are empirically mapping the variant property to a range of different DOM element types.\r\n * For instance, subtitle1 to ` + "`")) + (`
` + ("`" + `.\r\n * If you wish to change that mapping, you can provide your own.\r\n * Alternatively, you can use the `))))) + (((("`" + `component`) + ("`" + (` property.\r\n * The default mapping is the following:\r\n */\n headlineMapping: _propTypes.default.object,\n\n /**\r\n * Controls whether the Typography is inline or not.\r\n */\n inline: _propTypes.default.bool,\n\n /**\r\n * A deprecated variant is used from an internal component. Users don't need\r\n * a deprecation warning here if they switched to the v2 theme. They already\r\n * get the mapping that will be applied in the next major release.\r\n *\r\n * @internal\r\n */\n internalDeprecatedVariant: _propTypes.default.bool,\n\n /**\r\n * If ` + "`"))) + ((`true` + ("`" + `, the text will not wrap, but instead will truncate with an ellipsis.\r\n */\n noWrap: _propTypes.default.bool,\n\n /**\r\n * If `)) + ("`" + (`true` + "`")))) + (((`, the text will have a bottom margin.\r\n */\n paragraph: _propTypes.default.bool,\n\n /**\r\n * @ignore\r\n */\n theme: _propTypes.default.object.isRequired,\n\n /**\r\n * Applies the theme typography styles.\r\n * Use ` + "`") + (`body1` + ("`" + ` as the default value with the legacy implementation and `))) + (("`" + (`body2` + "`")) + (` with the new one.\r\n */\n variant: (0, _utils.chainPropTypes)(_propTypes.default.oneOf(['h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'subtitle1', 'subtitle2', 'body1', 'body2', 'caption', 'button', 'overline', 'srOnly', 'inherit', // deprecated\n 'display4', 'display3', 'display2', 'display1', 'headline', 'title', 'subheading']), function (props) {\n var deprecatedVariants = ['display4', 'display3', 'display2', 'display1', 'headline', 'title', 'subheading'];\n\n if (props.theme.typography.useNextVariants && !props.internalDeprecatedVariant && deprecatedVariants.indexOf(props.variant) !== -1) {\n return new Error('Material-UI: you are using a deprecated typography variant: ' + \"` + ("`" + `\".concat(props.variant, \"`))))))) + (((((("`" + ` that will be removed in the next major release.\\n\") + 'Please read the migration guide under https://material-ui.com/style/typography#migration-to-typography-v2.');\n }\n\n return null;\n })\n} : void 0;\nTypography.defaultProps = {\n align: 'inherit',\n color: 'default',\n gutterBottom: false,\n headlineMapping: defaultHeadlineMapping,\n inline: false,\n noWrap: false,\n paragraph: false\n};\n\nvar _default = (0, _withStyles.default)(styles, {\n name: 'MuiTypography',\n withTheme: true\n})(Typography);\n\nexports.default = _default;", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = exports.styles = void 0;\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/defineProperty\"));\n\nvar _objectWithoutProperties2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectWithoutProperties\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _classnames = _interopRequireDefault(require(\"classnames\"));\n\nvar _utils = require(\"@material-ui/utils\");\n\nvar _withStyles = _interopRequireDefault(require(\"../styles/withStyles\"));\n\nvar _helpers = require(\"../utils/helpers\");\n\nvar styles = function styles(theme) {\n return {\n /* Styles applied to the root element. */\n root: {\n display: 'block',\n margin: 0\n },\n\n /* Styles applied to the root element if `)) + ("`" + (`variant=\"display4\"` + "`"))) + ((`. */\n display4: theme.typography.display4,\n\n /* Styles applied to the root element if ` + ("`" + `variant=\"display3\"`)) + (("`" + `. */\n display3: theme.typography.display3,\n\n /* Styles applied to the root element if `) + ("`" + `variant=\"display2\"`)))))))) + ((((((("`" + (`. */\n display2: theme.typography.display2,\n\n /* Styles applied to the root element if ` + "`")) + (`variant=\"display1\"` + ("`" + `. */\n display1: theme.typography.display1,\n\n /* Styles applied to the root element if `))) + (("`" + (`variant=\"headline\"` + "`")) + (`. */\n headline: theme.typography.headline,\n\n /* Styles applied to the root element if ` + ("`" + `variant=\"title\"`)))) + ((("`" + (`. */\n title: theme.typography.title,\n\n /* Styles applied to the root element if ` + "`")) + (`variant=\"subheading\"` + ("`" + `. */\n subheading: theme.typography.subheading,\n\n /* Styles applied to the root element if `))) + (("`" + (`variant=\"body2\"` + "`")) + (`. */\n body2: theme.typography.body2,\n\n /* Styles applied to the root element if ` + ("`" + `variant=\"body1\"`))))) + (((("`" + (`. */\n body1: theme.typography.body1,\n\n /* Styles applied to the root element if ` + "`")) + (`variant=\"caption\"` + ("`" + `. */\n caption: theme.typography.caption,\n\n /* Styles applied to the root element if `))) + (("`" + (`variant=\"button\"` + "`")) + (`. */\n button: theme.typography.button,\n\n /* Styles applied to the root element if ` + ("`" + `variant=\"h1\"`)))) + ((("`" + (`. */\n h1: theme.typography.h1,\n\n /* Styles applied to the root element if ` + "`")) + (`variant=\"h2\"` + ("`" + `. */\n h2: theme.typography.h2,\n\n /* Styles applied to the root element if `))) + (("`" + (`variant=\"h3\"` + "`")) + ((`. */\n h3: theme.typography.h3,\n\n /* Styles applied to the root element if ` + "`") + (`variant=\"h4\"` + "`")))))) + (((((`. */\n h4: theme.typography.h4,\n\n /* Styles applied to the root element if ` + ("`" + `variant=\"h5\"`)) + ("`" + (`. */\n h5: theme.typography.h5,\n\n /* Styles applied to the root element if ` + "`"))) + ((`variant=\"h6\"` + ("`" + `. */\n h6: theme.typography.h6,\n\n /* Styles applied to the root element if `)) + ("`" + (`variant=\"subtitle1\"` + "`")))) + (((`. */\n subtitle1: theme.typography.subtitle1,\n\n /* Styles applied to the root element if ` + ("`" + `variant=\"subtitle2\"`)) + ("`" + (`. */\n subtitle2: theme.typography.subtitle2,\n\n /* Styles applied to the root element if ` + "`"))) + ((`variant=\"overline\"` + ("`" + `. */\n overline: theme.typography.overline,\n\n /* Styles applied to the root element if `)) + (("`" + `variant=\"srOnly\"`) + ("`" + `. Only accessible to screen readers. */\n srOnly: {\n position: 'absolute',\n height: 1,\n width: 1,\n overflow: 'hidden'\n },\n\n /* Styles applied to the root element if `))))) + (((("`" + (`align=\"left\"` + "`")) + (`. */\n alignLeft: {\n textAlign: 'left'\n },\n\n /* Styles applied to the root element if ` + ("`" + `align=\"center\"`))) + (("`" + (`. */\n alignCenter: {\n textAlign: 'center'\n },\n\n /* Styles applied to the root element if ` + "`")) + (`align=\"right\"` + ("`" + `. */\n alignRight: {\n textAlign: 'right'\n },\n\n /* Styles applied to the root element if `)))) + ((("`" + (`align=\"justify\"` + "`")) + (`. */\n alignJustify: {\n textAlign: 'justify'\n },\n\n /* Styles applied to the root element if ` + ("`" + `align=\"nowrap\"`))) + (("`" + (`. */\n noWrap: {\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap'\n },\n\n /* Styles applied to the root element if ` + "`")) + ((`gutterBottom={true}` + "`") + (`. */\n gutterBottom: {\n marginBottom: '0.35em'\n },\n\n /* Styles applied to the root element if ` + "`"))))))) + ((((((`paragraph={true}` + ("`" + `. */\n paragraph: {\n marginBottom: 16\n },\n\n /* Styles applied to the root element if `)) + ("`" + (`color=\"inherit\"` + "`"))) + ((`. */\n colorInherit: {\n color: 'inherit'\n },\n\n /* Styles applied to the root element if ` + ("`" + `color=\"primary\"`)) + ("`" + (`. */\n colorPrimary: {\n color: theme.palette.primary.main\n },\n\n /* Styles applied to the root element if ` + "`")))) + (((`color=\"secondary\"` + ("`" + `. */\n colorSecondary: {\n color: theme.palette.secondary.main\n },\n\n /* Styles applied to the root element if `)) + ("`" + (`color=\"textPrimary\"` + "`"))) + ((`. */\n colorTextPrimary: {\n color: theme.palette.text.primary\n },\n\n /* Styles applied to the root element if ` + ("`" + `color=\"textSecondary\"`)) + (("`" + `. */\n colorTextSecondary: {\n color: theme.palette.text.secondary\n },\n\n /* Styles applied to the root element if `) + ("`" + `color=\"error\"`))))) + (((("`" + (`. */\n colorError: {\n color: theme.palette.error.main\n },\n\n /* Styles applied to the root element if ` + "`")) + (`inline={true}` + ("`" + `. */\n inline: {\n display: 'inline'\n }\n };\n};\n\nexports.styles = styles;\nvar nextVariants = {\n display4: 'h1',\n display3: 'h2',\n display2: 'h3',\n display1: 'h4',\n headline: 'h5',\n title: 'h6',\n subheading: 'subtitle1'\n};\n\nfunction getVariant(theme, variantProp) {\n var typography = theme.typography;\n var variant = variantProp;\n\n if (!variant) {\n variant = typography.useNextVariants ? 'body2' : 'body1';\n } // complete v2 switch\n\n\n if (typography.useNextVariants) {\n variant = nextVariants[variant] || variant;\n }\n\n return variant;\n}\n\nvar defaultHeadlineMapping = {\n h1: 'h1',\n h2: 'h2',\n h3: 'h3',\n h4: 'h4',\n h5: 'h5',\n h6: 'h6',\n subtitle1: 'h6',\n subtitle2: 'h6',\n body1: 'p',\n body2: 'p',\n // deprecated\n display4: 'h1',\n display3: 'h1',\n display2: 'h1',\n display1: 'h1',\n headline: 'h1',\n title: 'h2',\n subheading: 'h3'\n};\n\nfunction Typography(props) {\n var _classNames;\n\n var align = props.align,\n classes = props.classes,\n classNameProp = props.className,\n color = props.color,\n componentProp = props.component,\n gutterBottom = props.gutterBottom,\n headlineMapping = props.headlineMapping,\n inline = props.inline,\n internalDeprecatedVariant = props.internalDeprecatedVariant,\n noWrap = props.noWrap,\n paragraph = props.paragraph,\n theme = props.theme,\n variantProp = props.variant,\n other = (0, _objectWithoutProperties2.default)(props, [\"align\", \"classes\", \"className\", \"color\", \"component\", \"gutterBottom\", \"headlineMapping\", \"inline\", \"internalDeprecatedVariant\", \"noWrap\", \"paragraph\", \"theme\", \"variant\"]);\n var variant = getVariant(theme, variantProp);\n var className = (0, _classnames.default)(classes.root, (_classNames = {}, (0, _defineProperty2.default)(_classNames, classes[variant], variant !== 'inherit'), (0, _defineProperty2.default)(_classNames, classes[\"color\".concat((0, _helpers.capitalize)(color))], color !== 'default'), (0, _defineProperty2.default)(_classNames, classes.noWrap, noWrap), (0, _defineProperty2.default)(_classNames, classes.gutterBottom, gutterBottom), (0, _defineProperty2.default)(_classNames, classes.paragraph, paragraph), (0, _defineProperty2.default)(_classNames, classes[\"align\".concat((0, _helpers.capitalize)(align))], align !== 'inherit'), (0, _defineProperty2.default)(_classNames, classes.inline, inline), _classNames), classNameProp);\n var Component = componentProp || (paragraph ? 'p' : headlineMapping[variant] || defaultHeadlineMapping[variant]) || 'span';\n return _react.default.createElement(Component, (0, _extends2.default)({\n className: className\n }, other));\n}\n\nprocess.env.NODE_ENV !== \"production\" ? Typography.propTypes = {\n /**\r\n * Set the text-align on the component.\r\n */\n align: _propTypes.default.oneOf(['inherit', 'left', 'center', 'right', 'justify']),\n\n /**\r\n * The content of the component.\r\n */\n children: _propTypes.default.node,\n\n /**\r\n * Override or extend the styles applied to the component.\r\n * See [CSS API](#css-api) below for more details.\r\n */\n classes: _propTypes.default.object.isRequired,\n\n /**\r\n * @ignore\r\n */\n className: _propTypes.default.string,\n\n /**\r\n * The color of the component. It supports those theme colors that make sense for this component.\r\n */\n color: _propTypes.default.oneOf(['default', 'error', 'inherit', 'primary', 'secondary', 'textPrimary', 'textSecondary']),\n\n /**\r\n * The component used for the root node.\r\n * Either a string to use a DOM element or a component.\r\n * By default, it maps the variant to a good default headline component.\r\n */\n component: _utils.componentPropType,\n\n /**\r\n * If `))) + (("`" + (`true` + "`")) + (`, the text will have a bottom margin.\r\n */\n gutterBottom: _propTypes.default.bool,\n\n /**\r\n * We are empirically mapping the variant property to a range of different DOM element types.\r\n * For instance, subtitle1 to ` + ("`" + `
`)))) + ((("`" + (`.\r\n * If you wish to change that mapping, you can provide your own.\r\n * Alternatively, you can use the ` + "`")) + (`component` + ("`" + ` property.\r\n * The default mapping is the following:\r\n */\n headlineMapping: _propTypes.default.object,\n\n /**\r\n * Controls whether the Typography is inline or not.\r\n */\n inline: _propTypes.default.bool,\n\n /**\r\n * A deprecated variant is used from an internal component. Users don't need\r\n * a deprecation warning here if they switched to the v2 theme. They already\r\n * get the mapping that will be applied in the next major release.\r\n *\r\n * @internal\r\n */\n internalDeprecatedVariant: _propTypes.default.bool,\n\n /**\r\n * If `))) + (("`" + (`true` + "`")) + ((`, the text will not wrap, but instead will truncate with an ellipsis.\r\n */\n noWrap: _propTypes.default.bool,\n\n /**\r\n * If ` + "`") + (`true` + "`")))))) + (((((`, the text will have a bottom margin.\r\n */\n paragraph: _propTypes.default.bool,\n\n /**\r\n * @ignore\r\n */\n theme: _propTypes.default.object.isRequired,\n\n /**\r\n * Applies the theme typography styles.\r\n * Use ` + ("`" + `body1`)) + ("`" + (` as the default value with the legacy implementation and ` + "`"))) + ((`body2` + ("`" + ` with the new one.\r\n */\n variant: (0, _utils.chainPropTypes)(_propTypes.default.oneOf(['h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'subtitle1', 'subtitle2', 'body1', 'body2', 'caption', 'button', 'overline', 'srOnly', 'inherit', // deprecated\n 'display4', 'display3', 'display2', 'display1', 'headline', 'title', 'subheading']), function (props) {\n var deprecatedVariants = ['display4', 'display3', 'display2', 'display1', 'headline', 'title', 'subheading'];\n\n if (props.theme.typography.useNextVariants && !props.internalDeprecatedVariant && deprecatedVariants.indexOf(props.variant) !== -1) {\n return new Error('Material-UI: you are using a deprecated typography variant: ' + \"`)) + ("`" + (`\".concat(props.variant, \"` + "`")))) + (((` that will be removed in the next major release.\\n\") + 'Please read the migration guide under https://material-ui.com/style/typography#migration-to-typography-v2.');\n }\n\n return null;\n })\n} : void 0;\nTypography.defaultProps = {\n align: 'inherit',\n color: 'default',\n gutterBottom: false,\n headlineMapping: defaultHeadlineMapping,\n inline: false,\n noWrap: false,\n paragraph: false\n};\n\nvar _default = (0, _withStyles.default)(styles, {\n name: 'MuiTypography',\n withTheme: true\n})(Typography);\n\nexports.default = _default;", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nObject.defineProperty(exports, \"default\", {\n enumerable: true,\n get: function get() {\n return _Typography.default;\n }\n});\n\nvar _Typography = _interopRequireDefault(require(\"./Typography\"));", "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar common = {\n black: '#000',\n white: '#fff'\n};\nvar _default = common;\nexports.default = _default;", "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar grey = {\n 50: '#fafafa',\n 100: '#f5f5f5',\n 200: '#eeeeee',\n 300: '#e0e0e0',\n 400: '#bdbdbd',\n 500: '#9e9e9e',\n 600: '#757575',\n 700: '#616161',\n 800: '#424242',\n 900: '#212121',\n A100: '#d5d5d5',\n A200: '#aaaaaa',\n A400: '#303030',\n A700: '#616161'\n};\nvar _default = grey;\nexports.default = _default;", "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar indigo = {\n 50: '#e8eaf6',\n 100: '#c5cae9',\n 200: '#9fa8da',\n 300: '#7986cb',\n 400: '#5c6bc0',\n 500: '#3f51b5',\n 600: '#3949ab',\n 700: '#303f9f',\n 800: '#283593',\n 900: '#1a237e',\n A100: '#8c9eff',\n A200: '#536dfe',\n A400: '#3d5afe',\n A700: '#304ffe'\n};\nvar _default = indigo;\nexports.default = _default;", "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar pink = {\n 50: '#fce4ec',\n 100: '#f8bbd0',\n 200: '#f48fb1',\n 300: '#f06292',\n 400: '#ec407a',\n 500: '#e91e63',\n 600: '#d81b60',\n 700: '#c2185b',\n 800: '#ad1457',\n 900: '#880e4f',\n A100: '#ff80ab',\n A200: '#ff4081',\n A400: '#f50057',\n A700: '#c51162'\n};\nvar _default = pink;\nexports.default = _default;", "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar red = {\n 50: '#ffebee',\n 100: '#ffcdd2',\n 200: '#ef9a9a',\n 300: '#e57373',\n 400: '#ef5350',\n 500: '#f44336',\n 600: '#e53935',\n 700: '#d32f2f',\n 800: '#c62828',\n 900: '#b71c1c',\n A100: '#ff8a80',\n A200: '#ff5252',\n A400: '#ff1744',\n A700: '#d50000'\n};\nvar _default = red;\nexports.default = _default;", - "\"use strict\";\n\nvar _interopRequireWildcard = require(\"@babel/runtime/helpers/interopRequireWildcard\");\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = exports.MuiThemeProviderOld = void 0;\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/defineProperty\"));\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/classCallCheck\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/createClass\"));\n\nvar _possibleConstructorReturn2 = _interopRequireDefault(require(\"@babel/runtime/helpers/possibleConstructorReturn\"));\n\nvar _getPrototypeOf2 = _interopRequireDefault(require(\"@babel/runtime/helpers/getPrototypeOf\"));\n\nvar _inherits2 = _interopRequireDefault(require(\"@babel/runtime/helpers/inherits\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _warning = _interopRequireDefault(require(\"warning\"));\n\nvar _brcast = _interopRequireDefault(require(\"brcast\"));\n\nvar _utils = require(\"@material-ui/utils\");\n\nvar _themeListener = _interopRequireWildcard(require(\"./themeListener\"));\n\n/* eslint-disable no-underscore-dangle */\n\n/**\r\n * This component takes a `) + ("`" + (`theme` + "`"))) + ((` property.\r\n * It makes the ` + ("`" + `theme`)) + ("`" + (` available down the React tree thanks to React context.\r\n * This component should preferably be used at **the root of your component tree**.\r\n */\nvar MuiThemeProviderOld =\n/*#__PURE__*/\nfunction (_React$Component) {\n (0, _inherits2.default)(MuiThemeProviderOld, _React$Component);\n\n // We are not using the React state in order to avoid unnecessary rerender.\n function MuiThemeProviderOld(props, context) {\n var _this;\n\n (0, _classCallCheck2.default)(this, MuiThemeProviderOld);\n _this = (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(MuiThemeProviderOld).call(this)); // Get the outer theme from the context, can be null\n\n _this.broadcast = (0, _brcast.default)();\n _this.outerTheme = _themeListener.default.initial(context); // Propagate the theme so it can be accessed by the children\n\n _this.broadcast.setState(_this.mergeOuterLocalTheme(props.theme));\n\n return _this;\n }\n\n (0, _createClass2.default)(MuiThemeProviderOld, [{\n key: \"getChildContext\",\n value: function getChildContext() {\n var _ref;\n\n var _this$props = this.props,\n disableStylesGeneration = _this$props.disableStylesGeneration,\n sheetsCache = _this$props.sheetsCache,\n sheetsManager = _this$props.sheetsManager;\n var muiThemeProviderOptions = this.context.muiThemeProviderOptions || {};\n\n if (disableStylesGeneration !== undefined) {\n muiThemeProviderOptions.disableStylesGeneration = disableStylesGeneration;\n }\n\n if (sheetsCache !== undefined) {\n muiThemeProviderOptions.sheetsCache = sheetsCache;\n }\n\n if (sheetsManager !== undefined) {\n muiThemeProviderOptions.sheetsManager = sheetsManager;\n }\n\n return _ref = {}, (0, _defineProperty2.default)(_ref, _themeListener.CHANNEL, this.broadcast), (0, _defineProperty2.default)(_ref, \"muiThemeProviderOptions\", muiThemeProviderOptions), _ref;\n }\n }, {\n key: \"componentDidMount\",\n value: function componentDidMount() {\n var _this2 = this;\n\n // Subscribe on the outer theme, if present\n this.unsubscribeId = _themeListener.default.subscribe(this.context, function (outerTheme) {\n _this2.outerTheme = outerTheme; // Forward the parent theme update to the children\n\n _this2.broadcast.setState(_this2.mergeOuterLocalTheme(_this2.props.theme));\n });\n }\n }, {\n key: \"componentDidUpdate\",\n value: function componentDidUpdate(prevProps) {\n // Propagate a local theme update\n if (this.props.theme !== prevProps.theme) {\n this.broadcast.setState(this.mergeOuterLocalTheme(this.props.theme));\n }\n }\n }, {\n key: \"componentWillUnmount\",\n value: function componentWillUnmount() {\n if (this.unsubscribeId !== null) {\n _themeListener.default.unsubscribe(this.context, this.unsubscribeId);\n }\n } // Simple merge between the outer theme and the local theme\n\n }, {\n key: \"mergeOuterLocalTheme\",\n value: function mergeOuterLocalTheme(localTheme) {\n // To support composition of theme.\n if (typeof localTheme === 'function') {\n process.env.NODE_ENV !== \"production\" ? (0, _warning.default)(this.outerTheme, ['Material-UI: you are providing a theme function property ' + 'to the MuiThemeProvider component:', ' outerTheme} />', 'However, no outer theme is present.', 'Make sure a theme is already injected higher in the React tree ' + 'or provide a theme object.'].join('\\n')) : void 0;\n return localTheme(this.outerTheme);\n }\n\n if (!this.outerTheme) {\n return localTheme;\n }\n\n return (0, _extends2.default)({}, this.outerTheme, localTheme);\n }\n }, {\n key: \"render\",\n value: function render() {\n // TODO move the sheetsManager property to a different component.\n // warning(\n // typeof window !== 'undefined' || this.props.sheetsManager,\n // [\n // 'Material-UI: you need to provide a sheetsManager to the MuiThemeProvider ' +\n // 'when rendering on the server.',\n // 'If you do not, you might experience a memory leak',\n // ].join('\\n'),\n // );\n return this.props.children;\n }\n }]);\n return MuiThemeProviderOld;\n}(_react.default.Component);\n\nexports.MuiThemeProviderOld = MuiThemeProviderOld;\nprocess.env.NODE_ENV !== \"production\" ? MuiThemeProviderOld.propTypes = {\n /**\r\n * You can wrap a node.\r\n */\n children: _propTypes.default.node.isRequired,\n\n /**\r\n * You can disable the generation of the styles with this option.\r\n * It can be useful when traversing the React tree outside of the HTML\r\n * rendering step on the server.\r\n * Let's say you are using react-apollo to extract all\r\n * the queries made by the interface server-side.\r\n * You can significantly speed up the traversal with this property.\r\n */\n disableStylesGeneration: _propTypes.default.bool,\n\n /**\r\n * @ignore\r\n *\r\n * In beta.\r\n */\n sheetsCache: _propTypes.default.object,\n\n /**\r\n * The sheetsManager is used to deduplicate style sheet injection in the page.\r\n * It's deduplicating using the (theme, styles) couple.\r\n * On the server, you should provide a new instance for each request.\r\n */\n sheetsManager: _propTypes.default.object,\n\n /**\r\n * A theme object.\r\n */\n theme: _propTypes.default.oneOfType([_propTypes.default.object, _propTypes.default.func]).isRequired\n} : void 0;\n\nif (process.env.NODE_ENV !== 'production') {\n process.env.NODE_ENV !== \"production\" ? MuiThemeProviderOld.propTypes = (0, _utils.exactProp)(MuiThemeProviderOld.propTypes) : void 0;\n}\n\nMuiThemeProviderOld.childContextTypes = (0, _extends2.default)({}, _themeListener.default.contextTypes, {\n muiThemeProviderOptions: _propTypes.default.object\n});\nMuiThemeProviderOld.contextTypes = (0, _extends2.default)({}, _themeListener.default.contextTypes, {\n muiThemeProviderOptions: _propTypes.default.object\n});\n/* istanbul ignore if */\n\nif (!_utils.ponyfillGlobal.__MUI_STYLES__) {\n _utils.ponyfillGlobal.__MUI_STYLES__ = {};\n}\n\nif (!_utils.ponyfillGlobal.__MUI_STYLES__.MuiThemeProvider) {\n _utils.ponyfillGlobal.__MUI_STYLES__.MuiThemeProvider = MuiThemeProviderOld;\n}\n\nvar _default = _utils.ponyfillGlobal.__MUI_STYLES__.MuiThemeProvider;\nexports.default = _default;", - "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.convertHexToRGB = convertHexToRGB;\nexports.rgbToHex = rgbToHex;\nexports.decomposeColor = decomposeColor;\nexports.recomposeColor = recomposeColor;\nexports.getContrastRatio = getContrastRatio;\nexports.getLuminance = getLuminance;\nexports.emphasize = emphasize;\nexports.fade = fade;\nexports.darken = darken;\nexports.lighten = lighten;\n\nvar _warning = _interopRequireDefault(require(\"warning\"));\n\n/* eslint-disable no-use-before-define */\n\n/**\r\n * Returns a number whose value is limited to the given range.\r\n *\r\n * @param {number} value The value to be clamped\r\n * @param {number} min The lower boundary of the output range\r\n * @param {number} max The upper boundary of the output range\r\n * @returns {number} A number in the range [min, max]\r\n */\nfunction clamp(value) {\n var min = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var max = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;\n process.env.NODE_ENV !== \"production\" ? (0, _warning.default)(value >= min && value <= max, \"Material-UI: the value provided \".concat(value, \" is out of range [\").concat(min, \", \").concat(max, \"].\")) : void 0;\n\n if (value < min) {\n return min;\n }\n\n if (value > max) {\n return max;\n }\n\n return value;\n}\n/**\r\n * Converts a color from CSS hex format to CSS rgb format.\r\n *\r\n * @param {string} color - Hex color, i.e. #nnn or #nnnnnn\r\n * @returns {string} A CSS rgb color string\r\n */\n\n\nfunction convertHexToRGB(color) {\n color = color.substr(1);\n var re = new RegExp(\".{1,\".concat(color.length / 3, \"}\"), 'g');\n var colors = color.match(re);\n\n if (colors && colors[0].length === 1) {\n colors = colors.map(function (n) {\n return n + n;\n });\n }\n\n return colors ? \"rgb(\".concat(colors.map(function (n) {\n return parseInt(n, 16);\n }).join(', '), \")\") : '';\n}\n/**\r\n * Converts a color from CSS rgb format to CSS hex format.\r\n *\r\n * @param {string} color - RGB color, i.e. rgb(n, n, n)\r\n * @returns {string} A CSS rgb color string, i.e. #nnnnnn\r\n */\n\n\nfunction rgbToHex(color) {\n // Pass hex straight through\n if (color.indexOf('#') === 0) {\n return color;\n }\n\n function intToHex(c) {\n var hex = c.toString(16);\n return hex.length === 1 ? \"0\".concat(hex) : hex;\n }\n\n var _decomposeColor = decomposeColor(color),\n values = _decomposeColor.values;\n\n values = values.map(function (n) {\n return intToHex(n);\n });\n return \"#\".concat(values.join(''));\n}\n/**\r\n * Returns an object with the type and values of a color.\r\n *\r\n * Note: Does not support rgb % values.\r\n *\r\n * @param {string} color - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla()\r\n * @returns {object} - A MUI color object: {type: string, values: number[]}\r\n */\n\n\nfunction decomposeColor(color) {\n if (color.charAt(0) === '#') {\n return decomposeColor(convertHexToRGB(color));\n }\n\n var marker = color.indexOf('(');\n var type = color.substring(0, marker);\n var values = color.substring(marker + 1, color.length - 1).split(',');\n values = values.map(function (value) {\n return parseFloat(value);\n });\n\n if (process.env.NODE_ENV !== 'production') {\n if (['rgb', 'rgba', 'hsl', 'hsla'].indexOf(type) === -1) {\n throw new Error([\"Material-UI: unsupported ` + "`")))) + (((`\".concat(color, \"` + "`") + (` color.\"), 'We support the following formats: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla().'].join('\\n'));\n }\n }\n\n return {\n type: type,\n values: values\n };\n}\n/**\r\n * Converts a color object with type and values to a string.\r\n *\r\n * @param {object} color - Decomposed color\r\n * @param {string} color.type - One of: 'rgb', 'rgba', 'hsl', 'hsla'\r\n * @param {array} color.values - [n,n,n] or [n,n,n,n]\r\n * @returns {string} A CSS color string\r\n */\n\n\nfunction recomposeColor(color) {\n var type = color.type;\n var values = color.values;\n\n if (type.indexOf('rgb') !== -1) {\n // Only convert the first 3 values to int (i.e. not alpha)\n values = values.map(function (n, i) {\n return i < 3 ? parseInt(n, 10) : n;\n });\n }\n\n if (type.indexOf('hsl') !== -1) {\n values[1] = \"\".concat(values[1], \"%\");\n values[2] = \"\".concat(values[2], \"%\");\n }\n\n return \"\".concat(color.type, \"(\").concat(values.join(', '), \")\");\n}\n/**\r\n * Calculates the contrast ratio between two colors.\r\n *\r\n * Formula: https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests\r\n *\r\n * @param {string} foreground - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla()\r\n * @param {string} background - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla()\r\n * @returns {number} A contrast ratio value in the range 0 - 21.\r\n */\n\n\nfunction getContrastRatio(foreground, background) {\n var lumA = getLuminance(foreground);\n var lumB = getLuminance(background);\n return (Math.max(lumA, lumB) + 0.05) / (Math.min(lumA, lumB) + 0.05);\n}\n/**\r\n * The relative brightness of any point in a color space,\r\n * normalized to 0 for darkest black and 1 for lightest white.\r\n *\r\n * Formula: https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests\r\n *\r\n * @param {string} color - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla()\r\n * @returns {number} The relative brightness of the color in the range 0 - 1\r\n */\n\n\nfunction getLuminance(color) {\n var decomposedColor = decomposeColor(color);\n\n if (decomposedColor.type.indexOf('rgb') !== -1) {\n var rgb = decomposedColor.values.map(function (val) {\n val /= 255; // normalized\n\n return val <= 0.03928 ? val / 12.92 : Math.pow((val + 0.055) / 1.055, 2.4);\n }); // Truncate at 3 digits\n\n return Number((0.2126 * rgb[0] + 0.7152 * rgb[1] + 0.0722 * rgb[2]).toFixed(3));\n } // else if (decomposedColor.type.indexOf('hsl') !== -1)\n\n\n return decomposedColor.values[2] / 100;\n}\n/**\r\n * Darken or lighten a colour, depending on its luminance.\r\n * Light colors are darkened, dark colors are lightened.\r\n *\r\n * @param {string} color - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla()\r\n * @param {number} coefficient=0.15 - multiplier in the range 0 - 1\r\n * @returns {string} A CSS color string. Hex input values are returned as rgb\r\n */\n\n\nfunction emphasize(color) {\n var coefficient = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0.15;\n return getLuminance(color) > 0.5 ? darken(color, coefficient) : lighten(color, coefficient);\n}\n/**\r\n * Set the absolute transparency of a color.\r\n * Any existing alpha values are overwritten.\r\n *\r\n * @param {string} color - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla()\r\n * @param {number} value - value to set the alpha channel to in the range 0 -1\r\n * @returns {string} A CSS color string. Hex input values are returned as rgb\r\n */\n\n\nfunction fade(color, value) {\n process.env.NODE_ENV !== \"production\" ? (0, _warning.default)(color, \"Material-UI: missing color argument in fade(\".concat(color, \", \").concat(value, \").\")) : void 0;\n if (!color) return color;\n color = decomposeColor(color);\n value = clamp(value);\n\n if (color.type === 'rgb' || color.type === 'hsl') {\n color.type += 'a';\n }\n\n color.values[3] = value;\n return recomposeColor(color);\n}\n/**\r\n * Darkens a color.\r\n *\r\n * @param {string} color - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla()\r\n * @param {number} coefficient - multiplier in the range 0 - 1\r\n * @returns {string} A CSS color string. Hex input values are returned as rgb\r\n */\n\n\nfunction darken(color, coefficient) {\n process.env.NODE_ENV !== \"production\" ? (0, _warning.default)(color, \"Material-UI: missing color argument in darken(\".concat(color, \", \").concat(coefficient, \").\")) : void 0;\n if (!color) return color;\n color = decomposeColor(color);\n coefficient = clamp(coefficient);\n\n if (color.type.indexOf('hsl') !== -1) {\n color.values[2] *= 1 - coefficient;\n } else if (color.type.indexOf('rgb') !== -1) {\n for (var i = 0; i < 3; i += 1) {\n color.values[i] *= 1 - coefficient;\n }\n }\n\n return recomposeColor(color);\n}\n/**\r\n * Lightens a color.\r\n *\r\n * @param {string} color - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla()\r\n * @param {number} coefficient - multiplier in the range 0 - 1\r\n * @returns {string} A CSS color string. Hex input values are returned as rgb\r\n */\n\n\nfunction lighten(color, coefficient) {\n process.env.NODE_ENV !== \"production\" ? (0, _warning.default)(color, \"Material-UI: missing color argument in lighten(\".concat(color, \", \").concat(coefficient, \").\")) : void 0;\n if (!color) return color;\n color = decomposeColor(color);\n coefficient = clamp(coefficient);\n\n if (color.type.indexOf('hsl') !== -1) {\n color.values[2] += (100 - color.values[2]) * coefficient;\n } else if (color.type.indexOf('rgb') !== -1) {\n for (var i = 0; i < 3; i += 1) {\n color.values[i] += (255 - color.values[i]) * coefficient;\n }\n }\n\n return recomposeColor(color);\n}", + "\"use strict\";\n\nexports.__esModule = true;\nexports.default = exports.EXITING = exports.ENTERED = exports.ENTERING = exports.EXITED = exports.UNMOUNTED = void 0;\n\nvar PropTypes = _interopRequireWildcard(require(\"prop-types\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _reactDom = _interopRequireDefault(require(\"react-dom\"));\n\nvar _reactLifecyclesCompat = require(\"react-lifecycles-compat\");\n\nvar _PropTypes = require(\"./utils/PropTypes\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nfunction _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }\n\nvar UNMOUNTED = 'unmounted';\nexports.UNMOUNTED = UNMOUNTED;\nvar EXITED = 'exited';\nexports.EXITED = EXITED;\nvar ENTERING = 'entering';\nexports.ENTERING = ENTERING;\nvar ENTERED = 'entered';\nexports.ENTERED = ENTERED;\nvar EXITING = 'exiting';\n/**\n * The Transition component lets you describe a transition from one component\n * state to another _over time_ with a simple declarative API. Most commonly\n * it's used to animate the mounting and unmounting of a component, but can also\n * be used to describe in-place transition states as well.\n *\n * ---\n *\n * **Note**: ` + ("`" + `Transition`)) + ("`" + (` is a platform-agnostic base component. If you're using\n * transitions in CSS, you'll probably want to use\n * [` + "`"))) + ((`CSSTransition` + ("`" + `](https://reactcommunity.org/react-transition-group/css-transition)\n * instead. It inherits all the features of `)) + (("`" + `Transition`) + ("`" + `, but contains\n * additional features necessary to play nice with CSS transitions (hence the\n * name of the component).\n *\n * ---\n *\n * By default the `))))) + (((("`" + (`Transition` + "`")) + (` component does not alter the behavior of the\n * component it renders, it only tracks \"enter\" and \"exit\" states for the\n * components. It's up to you to give meaning and effect to those states. For\n * example we can add styles to a component when it enters or exits:\n *\n * ` + ("`" + "`"))) + (("`" + (`jsx\n * import { Transition } from 'react-transition-group';\n *\n * const duration = 300;\n *\n * const defaultStyle = {\n * transition: ` + "`")) + (`opacity ${duration}ms ease-in-out` + ("`" + `,\n * opacity: 0,\n * }\n *\n * const transitionStyles = {\n * entering: { opacity: 0 },\n * entered: { opacity: 1 },\n * };\n *\n * const Fade = ({ in: inProp }) => (\n * \n * {state => (\n *
\n * I'm a fade Transition!\n *
\n * )}\n *
\n * );\n * `)))) + ((("`" + ("`" + "`")) + (`\n *\n * There are 4 main states a Transition can be in:\n * - ` + ("`" + `'entering'`))) + (("`" + (`\n * - ` + "`")) + ((`'entered'` + "`") + (`\n * - ` + "`"))))))))) + ((((((((`'exiting'` + ("`" + `\n * - `)) + ("`" + (`'exited'` + "`"))) + ((`\n *\n * Transition state is toggled via the ` + ("`" + `in`)) + ("`" + (` prop. When ` + "`")))) + (((`true` + ("`" + ` the component\n * begins the \"Enter\" stage. During this stage, the component will shift from\n * its current transition state, to `)) + ("`" + (`'entering'` + "`"))) + ((` for the duration of the\n * transition and then to the ` + ("`" + `'entered'`)) + ("`" + (` stage once it's complete. Let's take\n * the following example (we'll use the\n * [useState](https://reactjs.org/docs/hooks-reference.html#usestate) hook):\n *\n * ` + "`"))))) + (((("`" + ("`" + `jsx\n * function App() {\n * const [inProp, setInProp] = useState(false);\n * return (\n *
\n * \n * {state => (\n * // ...\n * )}\n * \n * \n *
\n * );\n * }\n * `)) + ("`" + ("`" + "`"))) + ((`\n *\n * When the button is clicked the component will shift to the ` + ("`" + `'entering'`)) + ("`" + (` state\n * and stay there for 500ms (the value of ` + "`")))) + (((`timeout` + ("`" + `) before it finally switches\n * to `)) + ("`" + (`'entered'` + "`"))) + ((`.\n *\n * When ` + ("`" + `in`)) + (("`" + ` is `) + ("`" + `false`)))))) + ((((("`" + (` the same thing happens except the state moves from\n * ` + "`")) + (`'exiting'` + ("`" + ` to `))) + (("`" + (`'exited'` + "`")) + (`.\n */\n\nexports.EXITING = EXITING;\n\nvar Transition =\n/*#__PURE__*/\nfunction (_React$Component) {\n _inheritsLoose(Transition, _React$Component);\n\n function Transition(props, context) {\n var _this;\n\n _this = _React$Component.call(this, props, context) || this;\n var parentGroup = context.transitionGroup; // In the context of a TransitionGroup all enters are really appears\n\n var appear = parentGroup && !parentGroup.isMounting ? props.enter : props.appear;\n var initialStatus;\n _this.appearStatus = null;\n\n if (props.in) {\n if (appear) {\n initialStatus = EXITED;\n _this.appearStatus = ENTERING;\n } else {\n initialStatus = ENTERED;\n }\n } else {\n if (props.unmountOnExit || props.mountOnEnter) {\n initialStatus = UNMOUNTED;\n } else {\n initialStatus = EXITED;\n }\n }\n\n _this.state = {\n status: initialStatus\n };\n _this.nextCallback = null;\n return _this;\n }\n\n var _proto = Transition.prototype;\n\n _proto.getChildContext = function getChildContext() {\n return {\n transitionGroup: null // allows for nested Transitions\n\n };\n };\n\n Transition.getDerivedStateFromProps = function getDerivedStateFromProps(_ref, prevState) {\n var nextIn = _ref.in;\n\n if (nextIn && prevState.status === UNMOUNTED) {\n return {\n status: EXITED\n };\n }\n\n return null;\n }; // getSnapshotBeforeUpdate(prevProps) {\n // let nextStatus = null\n // if (prevProps !== this.props) {\n // const { status } = this.state\n // if (this.props.in) {\n // if (status !== ENTERING && status !== ENTERED) {\n // nextStatus = ENTERING\n // }\n // } else {\n // if (status === ENTERING || status === ENTERED) {\n // nextStatus = EXITING\n // }\n // }\n // }\n // return { nextStatus }\n // }\n\n\n _proto.componentDidMount = function componentDidMount() {\n this.updateStatus(true, this.appearStatus);\n };\n\n _proto.componentDidUpdate = function componentDidUpdate(prevProps) {\n var nextStatus = null;\n\n if (prevProps !== this.props) {\n var status = this.state.status;\n\n if (this.props.in) {\n if (status !== ENTERING && status !== ENTERED) {\n nextStatus = ENTERING;\n }\n } else {\n if (status === ENTERING || status === ENTERED) {\n nextStatus = EXITING;\n }\n }\n }\n\n this.updateStatus(false, nextStatus);\n };\n\n _proto.componentWillUnmount = function componentWillUnmount() {\n this.cancelNextCallback();\n };\n\n _proto.getTimeouts = function getTimeouts() {\n var timeout = this.props.timeout;\n var exit, enter, appear;\n exit = enter = appear = timeout;\n\n if (timeout != null && typeof timeout !== 'number') {\n exit = timeout.exit;\n enter = timeout.enter; // TODO: remove fallback for next major\n\n appear = timeout.appear !== undefined ? timeout.appear : enter;\n }\n\n return {\n exit: exit,\n enter: enter,\n appear: appear\n };\n };\n\n _proto.updateStatus = function updateStatus(mounting, nextStatus) {\n if (mounting === void 0) {\n mounting = false;\n }\n\n if (nextStatus !== null) {\n // nextStatus will always be ENTERING or EXITING.\n this.cancelNextCallback();\n\n var node = _reactDom.default.findDOMNode(this);\n\n if (nextStatus === ENTERING) {\n this.performEnter(node, mounting);\n } else {\n this.performExit(node);\n }\n } else if (this.props.unmountOnExit && this.state.status === EXITED) {\n this.setState({\n status: UNMOUNTED\n });\n }\n };\n\n _proto.performEnter = function performEnter(node, mounting) {\n var _this2 = this;\n\n var enter = this.props.enter;\n var appearing = this.context.transitionGroup ? this.context.transitionGroup.isMounting : mounting;\n var timeouts = this.getTimeouts();\n var enterTimeout = appearing ? timeouts.appear : timeouts.enter; // no enter animation skip right to ENTERED\n // if we are mounting and running this it means appear _must_ be set\n\n if (!mounting && !enter) {\n this.safeSetState({\n status: ENTERED\n }, function () {\n _this2.props.onEntered(node);\n });\n return;\n }\n\n this.props.onEnter(node, appearing);\n this.safeSetState({\n status: ENTERING\n }, function () {\n _this2.props.onEntering(node, appearing);\n\n _this2.onTransitionEnd(node, enterTimeout, function () {\n _this2.safeSetState({\n status: ENTERED\n }, function () {\n _this2.props.onEntered(node, appearing);\n });\n });\n });\n };\n\n _proto.performExit = function performExit(node) {\n var _this3 = this;\n\n var exit = this.props.exit;\n var timeouts = this.getTimeouts(); // no exit animation skip right to EXITED\n\n if (!exit) {\n this.safeSetState({\n status: EXITED\n }, function () {\n _this3.props.onExited(node);\n });\n return;\n }\n\n this.props.onExit(node);\n this.safeSetState({\n status: EXITING\n }, function () {\n _this3.props.onExiting(node);\n\n _this3.onTransitionEnd(node, timeouts.exit, function () {\n _this3.safeSetState({\n status: EXITED\n }, function () {\n _this3.props.onExited(node);\n });\n });\n });\n };\n\n _proto.cancelNextCallback = function cancelNextCallback() {\n if (this.nextCallback !== null) {\n this.nextCallback.cancel();\n this.nextCallback = null;\n }\n };\n\n _proto.safeSetState = function safeSetState(nextState, callback) {\n // This shouldn't be necessary, but there are weird race conditions with\n // setState callbacks and unmounting in testing, so always make sure that\n // we can cancel any pending setState callbacks after we unmount.\n callback = this.setNextCallback(callback);\n this.setState(nextState, callback);\n };\n\n _proto.setNextCallback = function setNextCallback(callback) {\n var _this4 = this;\n\n var active = true;\n\n this.nextCallback = function (event) {\n if (active) {\n active = false;\n _this4.nextCallback = null;\n callback(event);\n }\n };\n\n this.nextCallback.cancel = function () {\n active = false;\n };\n\n return this.nextCallback;\n };\n\n _proto.onTransitionEnd = function onTransitionEnd(node, timeout, handler) {\n this.setNextCallback(handler);\n var doesNotHaveTimeoutOrListener = timeout == null && !this.props.addEndListener;\n\n if (!node || doesNotHaveTimeoutOrListener) {\n setTimeout(this.nextCallback, 0);\n return;\n }\n\n if (this.props.addEndListener) {\n this.props.addEndListener(node, this.nextCallback);\n }\n\n if (timeout != null) {\n setTimeout(this.nextCallback, timeout);\n }\n };\n\n _proto.render = function render() {\n var status = this.state.status;\n\n if (status === UNMOUNTED) {\n return null;\n }\n\n var _this$props = this.props,\n children = _this$props.children,\n childProps = _objectWithoutPropertiesLoose(_this$props, [\"children\"]); // filter props for Transtition\n\n\n delete childProps.in;\n delete childProps.mountOnEnter;\n delete childProps.unmountOnExit;\n delete childProps.appear;\n delete childProps.enter;\n delete childProps.exit;\n delete childProps.timeout;\n delete childProps.addEndListener;\n delete childProps.onEnter;\n delete childProps.onEntering;\n delete childProps.onEntered;\n delete childProps.onExit;\n delete childProps.onExiting;\n delete childProps.onExited;\n\n if (typeof children === 'function') {\n return children(status, childProps);\n }\n\n var child = _react.default.Children.only(children);\n\n return _react.default.cloneElement(child, childProps);\n };\n\n return Transition;\n}(_react.default.Component);\n\nTransition.contextTypes = {\n transitionGroup: PropTypes.object\n};\nTransition.childContextTypes = {\n transitionGroup: function transitionGroup() {}\n};\nTransition.propTypes = process.env.NODE_ENV !== \"production\" ? {\n /**\n * A ` + ("`" + `function`)))) + ((("`" + (` child can be used instead of a React element. This function is\n * called with the current transition status (` + "`")) + (`'entering'` + ("`" + `, `))) + (("`" + (`'entered'` + "`")) + ((`,\n * ` + "`") + (`'exiting'` + "`"))))) + ((((`, ` + ("`" + `'exited'`)) + ("`" + (`, ` + "`"))) + ((`'unmounted'` + ("`" + `), which can be used to apply context\n * specific props to a component.\n *\n * `)) + ("`" + ("`" + "`")))) + (((`jsx\n * \n * {state => (\n * \n * )}\n * \n * ` + "`"))) + (("`" + ("`" + `\n */\n children: PropTypes.oneOfType([PropTypes.func.isRequired, PropTypes.element.isRequired]).isRequired,\n\n /**\n * Show the component; triggers the enter or exit states\n */\n in: PropTypes.bool,\n\n /**\n * By default the child component is mounted immediately along with\n * the parent `)) + (("`" + `Transition`) + ("`" + ` component. If you want to \"lazy mount\" the component on the\n * first `))))))) + (((((("`" + (`in={true}` + "`")) + (` you can set ` + ("`" + `mountOnEnter`))) + (("`" + (`. After the first enter transition the component will stay\n * mounted, even on \"exited\", unless you also specify ` + "`")) + (`unmountOnExit` + ("`" + `.\n */\n mountOnEnter: PropTypes.bool,\n\n /**\n * By default the child component stays mounted after it reaches the `)))) + ((("`" + (`'exited'` + "`")) + (` state.\n * Set ` + ("`" + `unmountOnExit`))) + (("`" + (` if you'd prefer to unmount the component after it finishes exiting.\n */\n unmountOnExit: PropTypes.bool,\n\n /**\n * Normally a component is not transitioned if it is shown when the ` + "`")) + (`` + ("`" + ` component mounts.\n * If you want to transition on the first mount set `))))) + (((("`" + (`appear` + "`")) + (` to ` + ("`" + `true`))) + (("`" + (`, and the\n * component will transition in as soon as the ` + "`")) + (`` + ("`" + ` mounts.\n *\n * > Note: there are no specific \"appear\" states. `)))) + ((("`" + (`appear` + "`")) + (` only adds an additional ` + ("`" + `enter`))) + (("`" + (` transition.\n */\n appear: PropTypes.bool,\n\n /**\n * Enable or disable enter transitions.\n */\n enter: PropTypes.bool,\n\n /**\n * Enable or disable exit transitions.\n */\n exit: PropTypes.bool,\n\n /**\n * The duration of the transition, in milliseconds.\n * Required unless ` + "`")) + ((`addEndListener` + "`") + (` is provided.\n *\n * You may specify a single timeout for all transitions:\n *\n * ` + "`")))))) + ((((("`" + ("`" + `jsx\n * timeout={500}\n * `)) + ("`" + ("`" + "`"))) + ((`\n *\n * or individually:\n *\n * ` + ("`" + "`")) + ("`" + (`jsx\n * timeout={{\n * appear: 500,\n * enter: 300,\n * exit: 500,\n * }}\n * ` + "`")))) + ((("`" + ("`" + `\n *\n * - `)) + ("`" + (`appear` + "`"))) + ((` defaults to the value of ` + ("`" + `enter`)) + (("`" + `\n * - `) + ("`" + `enter`))))) + (((("`" + (` defaults to ` + "`")) + (`0` + ("`" + `\n * - `))) + (("`" + (`exit` + "`")) + (` defaults to ` + ("`" + `0`)))) + ((("`" + (`\n *\n * @type {number | { enter?: number, exit?: number, appear?: number }}\n */\n timeout: function timeout(props) {\n var pt = _PropTypes.timeoutsShape;\n if (!props.addEndListener) pt = pt.isRequired;\n\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n return pt.apply(void 0, [props].concat(args));\n },\n\n /**\n * Add a custom transition end trigger. Called with the transitioning\n * DOM node and a ` + "`")) + (`done` + ("`" + ` callback. Allows for more fine grained transition end\n * logic. **Note:** Timeouts are still used as a fallback if provided.\n *\n * `))) + (("`" + ("`" + "`")) + ((`jsx\n * addEndListener={(node, done) => {\n * // use the css transitionend event to mark the finish of a transition\n * node.addEventListener('transitionend', done, false);\n * }}\n * ` + "`") + ("`" + "`")))))))) + (((((((`\n */\n addEndListener: PropTypes.func,\n\n /**\n * Callback fired before the \"entering\" status is applied. An extra parameter\n * ` + ("`" + `isAppearing`)) + ("`" + (` is supplied to indicate if the enter stage is occurring on the initial mount\n *\n * @type Function(node: HtmlElement, isAppearing: bool) -> void\n */\n onEnter: PropTypes.func,\n\n /**\n * Callback fired after the \"entering\" status is applied. An extra parameter\n * ` + "`"))) + ((`isAppearing` + ("`" + ` is supplied to indicate if the enter stage is occurring on the initial mount\n *\n * @type Function(node: HtmlElement, isAppearing: bool)\n */\n onEntering: PropTypes.func,\n\n /**\n * Callback fired after the \"entered\" status is applied. An extra parameter\n * `)) + ("`" + (`isAppearing` + "`")))) + (((` is supplied to indicate if the enter stage is occurring on the initial mount\n *\n * @type Function(node: HtmlElement, isAppearing: bool) -> void\n */\n onEntered: PropTypes.func,\n\n /**\n * Callback fired before the \"exiting\" status is applied.\n *\n * @type Function(node: HtmlElement) -> void\n */\n onExit: PropTypes.func,\n\n /**\n * Callback fired after the \"exiting\" status is applied.\n *\n * @type Function(node: HtmlElement) -> void\n */\n onExiting: PropTypes.func,\n\n /**\n * Callback fired after the \"exited\" status is applied.\n *\n * @type Function(node: HtmlElement) -> void\n */\n onExited: PropTypes.func // Name the function so it is clearer in the documentation\n\n} : {};\n\nfunction noop() {}\n\nTransition.defaultProps = {\n in: false,\n mountOnEnter: false,\n unmountOnExit: false,\n appear: false,\n enter: true,\n exit: true,\n onEnter: noop,\n onEntering: noop,\n onEntered: noop,\n onExit: noop,\n onExiting: noop,\n onExited: noop\n};\nTransition.UNMOUNTED = 0;\nTransition.EXITED = 1;\nTransition.ENTERING = 2;\nTransition.ENTERED = 3;\nTransition.EXITING = 4;\n\nvar _default = (0, _reactLifecyclesCompat.polyfill)(Transition);\n\nexports.default = _default;", + "\"use strict\";\n\nexports.__esModule = true;\nexports.default = void 0;\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _reactLifecyclesCompat = require(\"react-lifecycles-compat\");\n\nvar _ChildMapping = require(\"./utils/ChildMapping\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nvar values = Object.values || function (obj) {\n return Object.keys(obj).map(function (k) {\n return obj[k];\n });\n};\n\nvar defaultProps = {\n component: 'div',\n childFactory: function childFactory(child) {\n return child;\n }\n /**\n * The ` + ("`" + ``)) + ("`" + (` component manages a set of transition components\n * (` + "`"))) + ((`` + ("`" + ` and `)) + ("`" + (`` + "`"))))) + ((((`) in a list. Like with the transition\n * components, ` + ("`" + ``)) + ("`" + (` is a state machine for managing the mounting\n * and unmounting of components over time.\n *\n * Consider the example below. As items are removed or added to the TodoList the\n * ` + "`"))) + ((`in` + ("`" + ` prop is toggled automatically by the `)) + ("`" + (`` + "`")))) + (((`.\n *\n * Note that ` + ("`" + ``)) + ("`" + (` does not define any animation behavior!\n * Exactly _how_ a list item animates is up to the individual transition\n * component. This means you can mix and match animations across different list\n * items.\n */\n\n};\n\nvar TransitionGroup =\n/*#__PURE__*/\nfunction (_React$Component) {\n _inheritsLoose(TransitionGroup, _React$Component);\n\n function TransitionGroup(props, context) {\n var _this;\n\n _this = _React$Component.call(this, props, context) || this;\n\n var handleExited = _this.handleExited.bind(_assertThisInitialized(_assertThisInitialized(_this))); // Initial children should all be entering, dependent on appear\n\n\n _this.state = {\n handleExited: handleExited,\n firstRender: true\n };\n return _this;\n }\n\n var _proto = TransitionGroup.prototype;\n\n _proto.getChildContext = function getChildContext() {\n return {\n transitionGroup: {\n isMounting: !this.appeared\n }\n };\n };\n\n _proto.componentDidMount = function componentDidMount() {\n this.appeared = true;\n this.mounted = true;\n };\n\n _proto.componentWillUnmount = function componentWillUnmount() {\n this.mounted = false;\n };\n\n TransitionGroup.getDerivedStateFromProps = function getDerivedStateFromProps(nextProps, _ref) {\n var prevChildMapping = _ref.children,\n handleExited = _ref.handleExited,\n firstRender = _ref.firstRender;\n return {\n children: firstRender ? (0, _ChildMapping.getInitialChildMapping)(nextProps, handleExited) : (0, _ChildMapping.getNextChildMapping)(nextProps, prevChildMapping, handleExited),\n firstRender: false\n };\n };\n\n _proto.handleExited = function handleExited(child, node) {\n var currentChildMapping = (0, _ChildMapping.getChildMapping)(this.props.children);\n if (child.key in currentChildMapping) return;\n\n if (child.props.onExited) {\n child.props.onExited(node);\n }\n\n if (this.mounted) {\n this.setState(function (state) {\n var children = _extends({}, state.children);\n\n delete children[child.key];\n return {\n children: children\n };\n });\n }\n };\n\n _proto.render = function render() {\n var _this$props = this.props,\n Component = _this$props.component,\n childFactory = _this$props.childFactory,\n props = _objectWithoutPropertiesLoose(_this$props, [\"component\", \"childFactory\"]);\n\n var children = values(this.state.children).map(childFactory);\n delete props.appear;\n delete props.enter;\n delete props.exit;\n\n if (Component === null) {\n return children;\n }\n\n return _react.default.createElement(Component, props, children);\n };\n\n return TransitionGroup;\n}(_react.default.Component);\n\nTransitionGroup.childContextTypes = {\n transitionGroup: _propTypes.default.object.isRequired\n};\nTransitionGroup.propTypes = process.env.NODE_ENV !== \"production\" ? {\n /**\n * ` + "`"))) + ((`` + ("`" + ` renders a `)) + (("`" + `
`) + ("`" + ` by default. You can change this\n * behavior by providing a `)))))) + ((((("`" + (`component` + "`")) + (` prop.\n * If you use React v16+ and would like to avoid a wrapping ` + ("`" + `
`))) + (("`" + (` element\n * you can pass in ` + "`")) + (`component={null}` + ("`" + `. This is useful if the wrapping div\n * borks your css styles.\n */\n component: _propTypes.default.any,\n\n /**\n * A set of `)))) + ((("`" + (`` + "`")) + (` components, that are toggled ` + ("`" + `in`))) + (("`" + (` and out as they\n * leave. the ` + "`")) + ((`` + "`") + (` will inject specific transition props, so\n * remember to spread them through if you are wrapping the ` + "`"))))) + ((((`` + ("`" + ` as\n * with our `)) + ("`" + (`` + "`"))) + ((` example.\n *\n * While this component is meant for multiple ` + ("`" + `Transition`)) + ("`" + (` or ` + "`")))) + (((`CSSTransition` + ("`" + `\n * children, sometimes you may want to have a single transition child with\n * content that you want to be transitioned out and in when you change it\n * (e.g. routes, images etc.) In that case you can change the `)) + ("`" + (`key` + "`"))) + ((` prop of\n * the transition child as you change its content, this will cause\n * ` + ("`" + `TransitionGroup`)) + (("`" + ` to transition the child out and back in.\n */\n children: _propTypes.default.node,\n\n /**\n * A convenience prop that enables or disables appear animations\n * for all children. Note that specifying this will override any defaults set\n * on individual children Transitions.\n */\n appear: _propTypes.default.bool,\n\n /**\n * A convenience prop that enables or disables enter animations\n * for all children. Note that specifying this will override any defaults set\n * on individual children Transitions.\n */\n enter: _propTypes.default.bool,\n\n /**\n * A convenience prop that enables or disables exit animations\n * for all children. Note that specifying this will override any defaults set\n * on individual children Transitions.\n */\n exit: _propTypes.default.bool,\n\n /**\n * You may need to apply reactive updates to a child as it is exiting.\n * This is generally done by using `) + ("`" + `cloneElement`))))))) + (((((("`" + (` however in the case of an exiting\n * child the element has already been removed and not accessible to the consumer.\n *\n * If you do need to update a child as it leaves you can provide a ` + "`")) + (`childFactory` + ("`" + `\n * to wrap every child, even the ones that are leaving.\n *\n * @type Function(child: ReactElement) -> ReactElement\n */\n childFactory: _propTypes.default.func\n} : {};\nTransitionGroup.defaultProps = defaultProps;\n\nvar _default = (0, _reactLifecyclesCompat.polyfill)(TransitionGroup);\n\nexports.default = _default;\nmodule.exports = exports[\"default\"];", + "\"use strict\";\n\nexports.__esModule = true;\nexports.getChildMapping = getChildMapping;\nexports.mergeChildMappings = mergeChildMappings;\nexports.getInitialChildMapping = getInitialChildMapping;\nexports.getNextChildMapping = getNextChildMapping;\n\nvar _react = require(\"react\");\n\n/**\n * Given `))) + (("`" + (`this.props.children` + "`")) + (`, return an object mapping key to child.\n *\n * @param {*} children ` + ("`" + `this.props.children`)))) + ((("`" + (`\n * @return {object} Mapping of key to child\n */\nfunction getChildMapping(children, mapFn) {\n var mapper = function mapper(child) {\n return mapFn && (0, _react.isValidElement)(child) ? mapFn(child) : child;\n };\n\n var result = Object.create(null);\n if (children) _react.Children.map(children, function (c) {\n return c;\n }).forEach(function (child) {\n // run the map function here instead so that the key is the computed one\n result[child.key] = mapper(child);\n });\n return result;\n}\n/**\n * When you're adding or removing children some may be added or removed in the\n * same render pass. We want to show *both* since we want to simultaneously\n * animate elements in and out. This function takes a previous set of keys\n * and a new set of keys and merges them with its best guess of the correct\n * ordering. In the future we may expose some of the utilities in\n * ReactMultiChild to make this easy, but for now React itself does not\n * directly have this concept of the union of prevChildren and nextChildren\n * so we implement it here.\n *\n * @param {object} prev prev children as returned from\n * ` + "`")) + (`ReactTransitionChildMapping.getChildMapping()` + ("`" + `.\n * @param {object} next next children as returned from\n * `))) + (("`" + (`ReactTransitionChildMapping.getChildMapping()` + "`")) + ((`.\n * @return {object} a key set that contains all keys in ` + "`") + (`prev` + "`"))))) + ((((` and all keys\n * in ` + ("`" + `next`)) + ("`" + (` in a reasonable order.\n */\n\n\nfunction mergeChildMappings(prev, next) {\n prev = prev || {};\n next = next || {};\n\n function getValueForKey(key) {\n return key in next ? next[key] : prev[key];\n } // For each key of ` + "`"))) + ((`next` + ("`" + `, the list of keys to insert before that key in\n // the combined list\n\n\n var nextKeysPending = Object.create(null);\n var pendingKeys = [];\n\n for (var prevKey in prev) {\n if (prevKey in next) {\n if (pendingKeys.length) {\n nextKeysPending[prevKey] = pendingKeys;\n pendingKeys = [];\n }\n } else {\n pendingKeys.push(prevKey);\n }\n }\n\n var i;\n var childMapping = {};\n\n for (var nextKey in next) {\n if (nextKeysPending[nextKey]) {\n for (i = 0; i < nextKeysPending[nextKey].length; i++) {\n var pendingNextKey = nextKeysPending[nextKey][i];\n childMapping[nextKeysPending[nextKey][i]] = getValueForKey(pendingNextKey);\n }\n }\n\n childMapping[nextKey] = getValueForKey(nextKey);\n } // Finally, add the keys which didn't appear before any key in `)) + ("`" + (`next` + "`")))) + (((`\n\n\n for (i = 0; i < pendingKeys.length; i++) {\n childMapping[pendingKeys[i]] = getValueForKey(pendingKeys[i]);\n }\n\n return childMapping;\n}\n\nfunction getProp(child, prop, props) {\n return props[prop] != null ? props[prop] : child.props[prop];\n}\n\nfunction getInitialChildMapping(props, onExited) {\n return getChildMapping(props.children, function (child) {\n return (0, _react.cloneElement)(child, {\n onExited: onExited.bind(null, child),\n in: true,\n appear: getProp(child, 'appear', props),\n enter: getProp(child, 'enter', props),\n exit: getProp(child, 'exit', props)\n });\n });\n}\n\nfunction getNextChildMapping(nextProps, prevChildMapping, onExited) {\n var nextChildMapping = getChildMapping(nextProps.children);\n var children = mergeChildMappings(prevChildMapping, nextChildMapping);\n Object.keys(children).forEach(function (key) {\n var child = children[key];\n if (!(0, _react.isValidElement)(child)) return;\n var hasPrev = key in prevChildMapping;\n var hasNext = key in nextChildMapping;\n var prevChild = prevChildMapping[key];\n var isLeaving = (0, _react.isValidElement)(prevChild) && !prevChild.props.in; // item is new (entering)\n\n if (hasNext && (!hasPrev || isLeaving)) {\n // console.log('entering', key)\n children[key] = (0, _react.cloneElement)(child, {\n onExited: onExited.bind(null, child),\n in: true,\n exit: getProp(child, 'exit', nextProps),\n enter: getProp(child, 'enter', nextProps)\n });\n } else if (!hasNext && hasPrev && !isLeaving) {\n // item is old (exiting)\n // console.log('leaving', key)\n children[key] = (0, _react.cloneElement)(child, {\n in: false\n });\n } else if (hasNext && hasPrev && (0, _react.isValidElement)(prevChild)) {\n // item hasn't changed transition states\n // copy over the last transition props;\n // console.log('unchanged', key)\n children[key] = (0, _react.cloneElement)(child, {\n onExited: onExited.bind(null, child),\n in: prevChild.props.in,\n exit: getProp(child, 'exit', nextProps),\n enter: getProp(child, 'enter', nextProps)\n });\n }\n });\n return children;\n}", + "\"use strict\";\n\nexports.__esModule = true;\nexports.classNamesShape = exports.timeoutsShape = void 0;\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar timeoutsShape = process.env.NODE_ENV !== 'production' ? _propTypes.default.oneOfType([_propTypes.default.number, _propTypes.default.shape({\n enter: _propTypes.default.number,\n exit: _propTypes.default.number,\n appear: _propTypes.default.number\n}).isRequired]) : null;\nexports.timeoutsShape = timeoutsShape;\nvar classNamesShape = process.env.NODE_ENV !== 'production' ? _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.shape({\n enter: _propTypes.default.string,\n exit: _propTypes.default.string,\n active: _propTypes.default.string\n}), _propTypes.default.shape({\n enter: _propTypes.default.string,\n enterDone: _propTypes.default.string,\n enterActive: _propTypes.default.string,\n exit: _propTypes.default.string,\n exitDone: _propTypes.default.string,\n exitActive: _propTypes.default.string\n})]) : null;\nexports.classNamesShape = classNamesShape;", + "\"use strict\";\n\nvar _interopRequireWildcard = require(\"@babel/runtime/helpers/interopRequireWildcard\");\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = exports.MuiThemeProviderOld = void 0;\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/defineProperty\"));\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/classCallCheck\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/createClass\"));\n\nvar _possibleConstructorReturn2 = _interopRequireDefault(require(\"@babel/runtime/helpers/possibleConstructorReturn\"));\n\nvar _getPrototypeOf2 = _interopRequireDefault(require(\"@babel/runtime/helpers/getPrototypeOf\"));\n\nvar _inherits2 = _interopRequireDefault(require(\"@babel/runtime/helpers/inherits\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _warning = _interopRequireDefault(require(\"warning\"));\n\nvar _brcast = _interopRequireDefault(require(\"brcast\"));\n\nvar _utils = require(\"@material-ui/utils\");\n\nvar _themeListener = _interopRequireWildcard(require(\"./themeListener\"));\n\n/* eslint-disable no-underscore-dangle */\n\n/**\r\n * This component takes a ` + ("`" + `theme`)) + ("`" + (` property.\r\n * It makes the ` + "`"))) + ((`theme` + ("`" + ` available down the React tree thanks to React context.\r\n * This component should preferably be used at **the root of your component tree**.\r\n */\nvar MuiThemeProviderOld =\n/*#__PURE__*/\nfunction (_React$Component) {\n (0, _inherits2.default)(MuiThemeProviderOld, _React$Component);\n\n // We are not using the React state in order to avoid unnecessary rerender.\n function MuiThemeProviderOld(props, context) {\n var _this;\n\n (0, _classCallCheck2.default)(this, MuiThemeProviderOld);\n _this = (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(MuiThemeProviderOld).call(this)); // Get the outer theme from the context, can be null\n\n _this.broadcast = (0, _brcast.default)();\n _this.outerTheme = _themeListener.default.initial(context); // Propagate the theme so it can be accessed by the children\n\n _this.broadcast.setState(_this.mergeOuterLocalTheme(props.theme));\n\n return _this;\n }\n\n (0, _createClass2.default)(MuiThemeProviderOld, [{\n key: \"getChildContext\",\n value: function getChildContext() {\n var _ref;\n\n var _this$props = this.props,\n disableStylesGeneration = _this$props.disableStylesGeneration,\n sheetsCache = _this$props.sheetsCache,\n sheetsManager = _this$props.sheetsManager;\n var muiThemeProviderOptions = this.context.muiThemeProviderOptions || {};\n\n if (disableStylesGeneration !== undefined) {\n muiThemeProviderOptions.disableStylesGeneration = disableStylesGeneration;\n }\n\n if (sheetsCache !== undefined) {\n muiThemeProviderOptions.sheetsCache = sheetsCache;\n }\n\n if (sheetsManager !== undefined) {\n muiThemeProviderOptions.sheetsManager = sheetsManager;\n }\n\n return _ref = {}, (0, _defineProperty2.default)(_ref, _themeListener.CHANNEL, this.broadcast), (0, _defineProperty2.default)(_ref, \"muiThemeProviderOptions\", muiThemeProviderOptions), _ref;\n }\n }, {\n key: \"componentDidMount\",\n value: function componentDidMount() {\n var _this2 = this;\n\n // Subscribe on the outer theme, if present\n this.unsubscribeId = _themeListener.default.subscribe(this.context, function (outerTheme) {\n _this2.outerTheme = outerTheme; // Forward the parent theme update to the children\n\n _this2.broadcast.setState(_this2.mergeOuterLocalTheme(_this2.props.theme));\n });\n }\n }, {\n key: \"componentDidUpdate\",\n value: function componentDidUpdate(prevProps) {\n // Propagate a local theme update\n if (this.props.theme !== prevProps.theme) {\n this.broadcast.setState(this.mergeOuterLocalTheme(this.props.theme));\n }\n }\n }, {\n key: \"componentWillUnmount\",\n value: function componentWillUnmount() {\n if (this.unsubscribeId !== null) {\n _themeListener.default.unsubscribe(this.context, this.unsubscribeId);\n }\n } // Simple merge between the outer theme and the local theme\n\n }, {\n key: \"mergeOuterLocalTheme\",\n value: function mergeOuterLocalTheme(localTheme) {\n // To support composition of theme.\n if (typeof localTheme === 'function') {\n process.env.NODE_ENV !== \"production\" ? (0, _warning.default)(this.outerTheme, ['Material-UI: you are providing a theme function property ' + 'to the MuiThemeProvider component:', ' outerTheme} />', 'However, no outer theme is present.', 'Make sure a theme is already injected higher in the React tree ' + 'or provide a theme object.'].join('\\n')) : void 0;\n return localTheme(this.outerTheme);\n }\n\n if (!this.outerTheme) {\n return localTheme;\n }\n\n return (0, _extends2.default)({}, this.outerTheme, localTheme);\n }\n }, {\n key: \"render\",\n value: function render() {\n // TODO move the sheetsManager property to a different component.\n // warning(\n // typeof window !== 'undefined' || this.props.sheetsManager,\n // [\n // 'Material-UI: you need to provide a sheetsManager to the MuiThemeProvider ' +\n // 'when rendering on the server.',\n // 'If you do not, you might experience a memory leak',\n // ].join('\\n'),\n // );\n return this.props.children;\n }\n }]);\n return MuiThemeProviderOld;\n}(_react.default.Component);\n\nexports.MuiThemeProviderOld = MuiThemeProviderOld;\nprocess.env.NODE_ENV !== \"production\" ? MuiThemeProviderOld.propTypes = {\n /**\r\n * You can wrap a node.\r\n */\n children: _propTypes.default.node.isRequired,\n\n /**\r\n * You can disable the generation of the styles with this option.\r\n * It can be useful when traversing the React tree outside of the HTML\r\n * rendering step on the server.\r\n * Let's say you are using react-apollo to extract all\r\n * the queries made by the interface server-side.\r\n * You can significantly speed up the traversal with this property.\r\n */\n disableStylesGeneration: _propTypes.default.bool,\n\n /**\r\n * @ignore\r\n *\r\n * In beta.\r\n */\n sheetsCache: _propTypes.default.object,\n\n /**\r\n * The sheetsManager is used to deduplicate style sheet injection in the page.\r\n * It's deduplicating using the (theme, styles) couple.\r\n * On the server, you should provide a new instance for each request.\r\n */\n sheetsManager: _propTypes.default.object,\n\n /**\r\n * A theme object.\r\n */\n theme: _propTypes.default.oneOfType([_propTypes.default.object, _propTypes.default.func]).isRequired\n} : void 0;\n\nif (process.env.NODE_ENV !== 'production') {\n process.env.NODE_ENV !== \"production\" ? MuiThemeProviderOld.propTypes = (0, _utils.exactProp)(MuiThemeProviderOld.propTypes) : void 0;\n}\n\nMuiThemeProviderOld.childContextTypes = (0, _extends2.default)({}, _themeListener.default.contextTypes, {\n muiThemeProviderOptions: _propTypes.default.object\n});\nMuiThemeProviderOld.contextTypes = (0, _extends2.default)({}, _themeListener.default.contextTypes, {\n muiThemeProviderOptions: _propTypes.default.object\n});\n/* istanbul ignore if */\n\nif (!_utils.ponyfillGlobal.__MUI_STYLES__) {\n _utils.ponyfillGlobal.__MUI_STYLES__ = {};\n}\n\nif (!_utils.ponyfillGlobal.__MUI_STYLES__.MuiThemeProvider) {\n _utils.ponyfillGlobal.__MUI_STYLES__.MuiThemeProvider = MuiThemeProviderOld;\n}\n\nvar _default = _utils.ponyfillGlobal.__MUI_STYLES__.MuiThemeProvider;\nexports.default = _default;", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.convertHexToRGB = convertHexToRGB;\nexports.rgbToHex = rgbToHex;\nexports.decomposeColor = decomposeColor;\nexports.recomposeColor = recomposeColor;\nexports.getContrastRatio = getContrastRatio;\nexports.getLuminance = getLuminance;\nexports.emphasize = emphasize;\nexports.fade = fade;\nexports.darken = darken;\nexports.lighten = lighten;\n\nvar _warning = _interopRequireDefault(require(\"warning\"));\n\n/* eslint-disable no-use-before-define */\n\n/**\r\n * Returns a number whose value is limited to the given range.\r\n *\r\n * @param {number} value The value to be clamped\r\n * @param {number} min The lower boundary of the output range\r\n * @param {number} max The upper boundary of the output range\r\n * @returns {number} A number in the range [min, max]\r\n */\nfunction clamp(value) {\n var min = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var max = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;\n process.env.NODE_ENV !== \"production\" ? (0, _warning.default)(value >= min && value <= max, \"Material-UI: the value provided \".concat(value, \" is out of range [\").concat(min, \", \").concat(max, \"].\")) : void 0;\n\n if (value < min) {\n return min;\n }\n\n if (value > max) {\n return max;\n }\n\n return value;\n}\n/**\r\n * Converts a color from CSS hex format to CSS rgb format.\r\n *\r\n * @param {string} color - Hex color, i.e. #nnn or #nnnnnn\r\n * @returns {string} A CSS rgb color string\r\n */\n\n\nfunction convertHexToRGB(color) {\n color = color.substr(1);\n var re = new RegExp(\".{1,\".concat(color.length / 3, \"}\"), 'g');\n var colors = color.match(re);\n\n if (colors && colors[0].length === 1) {\n colors = colors.map(function (n) {\n return n + n;\n });\n }\n\n return colors ? \"rgb(\".concat(colors.map(function (n) {\n return parseInt(n, 16);\n }).join(', '), \")\") : '';\n}\n/**\r\n * Converts a color from CSS rgb format to CSS hex format.\r\n *\r\n * @param {string} color - RGB color, i.e. rgb(n, n, n)\r\n * @returns {string} A CSS rgb color string, i.e. #nnnnnn\r\n */\n\n\nfunction rgbToHex(color) {\n // Pass hex straight through\n if (color.indexOf('#') === 0) {\n return color;\n }\n\n function intToHex(c) {\n var hex = c.toString(16);\n return hex.length === 1 ? \"0\".concat(hex) : hex;\n }\n\n var _decomposeColor = decomposeColor(color),\n values = _decomposeColor.values;\n\n values = values.map(function (n) {\n return intToHex(n);\n });\n return \"#\".concat(values.join(''));\n}\n/**\r\n * Returns an object with the type and values of a color.\r\n *\r\n * Note: Does not support rgb % values.\r\n *\r\n * @param {string} color - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla()\r\n * @returns {object} - A MUI color object: {type: string, values: number[]}\r\n */\n\n\nfunction decomposeColor(color) {\n if (color.charAt(0) === '#') {\n return decomposeColor(convertHexToRGB(color));\n }\n\n var marker = color.indexOf('(');\n var type = color.substring(0, marker);\n var values = color.substring(marker + 1, color.length - 1).split(',');\n values = values.map(function (value) {\n return parseFloat(value);\n });\n\n if (process.env.NODE_ENV !== 'production') {\n if (['rgb', 'rgba', 'hsl', 'hsla'].indexOf(type) === -1) {\n throw new Error([\"Material-UI: unsupported `)) + (("`" + `\".concat(color, \"`) + ("`" + ` color.\"), 'We support the following formats: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla().'].join('\\n'));\n }\n }\n\n return {\n type: type,\n values: values\n };\n}\n/**\r\n * Converts a color object with type and values to a string.\r\n *\r\n * @param {object} color - Decomposed color\r\n * @param {string} color.type - One of: 'rgb', 'rgba', 'hsl', 'hsla'\r\n * @param {array} color.values - [n,n,n] or [n,n,n,n]\r\n * @returns {string} A CSS color string\r\n */\n\n\nfunction recomposeColor(color) {\n var type = color.type;\n var values = color.values;\n\n if (type.indexOf('rgb') !== -1) {\n // Only convert the first 3 values to int (i.e. not alpha)\n values = values.map(function (n, i) {\n return i < 3 ? parseInt(n, 10) : n;\n });\n }\n\n if (type.indexOf('hsl') !== -1) {\n values[1] = \"\".concat(values[1], \"%\");\n values[2] = \"\".concat(values[2], \"%\");\n }\n\n return \"\".concat(color.type, \"(\").concat(values.join(', '), \")\");\n}\n/**\r\n * Calculates the contrast ratio between two colors.\r\n *\r\n * Formula: https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests\r\n *\r\n * @param {string} foreground - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla()\r\n * @param {string} background - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla()\r\n * @returns {number} A contrast ratio value in the range 0 - 21.\r\n */\n\n\nfunction getContrastRatio(foreground, background) {\n var lumA = getLuminance(foreground);\n var lumB = getLuminance(background);\n return (Math.max(lumA, lumB) + 0.05) / (Math.min(lumA, lumB) + 0.05);\n}\n/**\r\n * The relative brightness of any point in a color space,\r\n * normalized to 0 for darkest black and 1 for lightest white.\r\n *\r\n * Formula: https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests\r\n *\r\n * @param {string} color - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla()\r\n * @returns {number} The relative brightness of the color in the range 0 - 1\r\n */\n\n\nfunction getLuminance(color) {\n var decomposedColor = decomposeColor(color);\n\n if (decomposedColor.type.indexOf('rgb') !== -1) {\n var rgb = decomposedColor.values.map(function (val) {\n val /= 255; // normalized\n\n return val <= 0.03928 ? val / 12.92 : Math.pow((val + 0.055) / 1.055, 2.4);\n }); // Truncate at 3 digits\n\n return Number((0.2126 * rgb[0] + 0.7152 * rgb[1] + 0.0722 * rgb[2]).toFixed(3));\n } // else if (decomposedColor.type.indexOf('hsl') !== -1)\n\n\n return decomposedColor.values[2] / 100;\n}\n/**\r\n * Darken or lighten a colour, depending on its luminance.\r\n * Light colors are darkened, dark colors are lightened.\r\n *\r\n * @param {string} color - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla()\r\n * @param {number} coefficient=0.15 - multiplier in the range 0 - 1\r\n * @returns {string} A CSS color string. Hex input values are returned as rgb\r\n */\n\n\nfunction emphasize(color) {\n var coefficient = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0.15;\n return getLuminance(color) > 0.5 ? darken(color, coefficient) : lighten(color, coefficient);\n}\n/**\r\n * Set the absolute transparency of a color.\r\n * Any existing alpha values are overwritten.\r\n *\r\n * @param {string} color - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla()\r\n * @param {number} value - value to set the alpha channel to in the range 0 -1\r\n * @returns {string} A CSS color string. Hex input values are returned as rgb\r\n */\n\n\nfunction fade(color, value) {\n process.env.NODE_ENV !== \"production\" ? (0, _warning.default)(color, \"Material-UI: missing color argument in fade(\".concat(color, \", \").concat(value, \").\")) : void 0;\n if (!color) return color;\n color = decomposeColor(color);\n value = clamp(value);\n\n if (color.type === 'rgb' || color.type === 'hsl') {\n color.type += 'a';\n }\n\n color.values[3] = value;\n return recomposeColor(color);\n}\n/**\r\n * Darkens a color.\r\n *\r\n * @param {string} color - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla()\r\n * @param {number} coefficient - multiplier in the range 0 - 1\r\n * @returns {string} A CSS color string. Hex input values are returned as rgb\r\n */\n\n\nfunction darken(color, coefficient) {\n process.env.NODE_ENV !== \"production\" ? (0, _warning.default)(color, \"Material-UI: missing color argument in darken(\".concat(color, \", \").concat(coefficient, \").\")) : void 0;\n if (!color) return color;\n color = decomposeColor(color);\n coefficient = clamp(coefficient);\n\n if (color.type.indexOf('hsl') !== -1) {\n color.values[2] *= 1 - coefficient;\n } else if (color.type.indexOf('rgb') !== -1) {\n for (var i = 0; i < 3; i += 1) {\n color.values[i] *= 1 - coefficient;\n }\n }\n\n return recomposeColor(color);\n}\n/**\r\n * Lightens a color.\r\n *\r\n * @param {string} color - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla()\r\n * @param {number} coefficient - multiplier in the range 0 - 1\r\n * @returns {string} A CSS color string. Hex input values are returned as rgb\r\n */\n\n\nfunction lighten(color, coefficient) {\n process.env.NODE_ENV !== \"production\" ? (0, _warning.default)(color, \"Material-UI: missing color argument in lighten(\".concat(color, \", \").concat(coefficient, \").\")) : void 0;\n if (!color) return color;\n color = decomposeColor(color);\n coefficient = clamp(coefficient);\n\n if (color.type.indexOf('hsl') !== -1) {\n color.values[2] += (100 - color.values[2]) * coefficient;\n } else if (color.type.indexOf('rgb') !== -1) {\n for (var i = 0; i < 3; i += 1) {\n color.values[i] += (255 - color.values[i]) * coefficient;\n }\n }\n\n return recomposeColor(color);\n}", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = createBreakpoints;\nexports.keys = void 0;\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _objectWithoutProperties2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectWithoutProperties\"));\n\n// Sorted ASC by size. That's important.\n// It can't be configured as it's used statically for propTypes.\nvar keys = ['xs', 'sm', 'md', 'lg', 'xl']; // Keep in mind that @media is inclusive by the CSS specification.\n\nexports.keys = keys;\n\nfunction createBreakpoints(breakpoints) {\n var _breakpoints$values = breakpoints.values,\n values = _breakpoints$values === void 0 ? {\n xs: 0,\n sm: 600,\n md: 960,\n lg: 1280,\n xl: 1920\n } : _breakpoints$values,\n _breakpoints$unit = breakpoints.unit,\n unit = _breakpoints$unit === void 0 ? 'px' : _breakpoints$unit,\n _breakpoints$step = breakpoints.step,\n step = _breakpoints$step === void 0 ? 5 : _breakpoints$step,\n other = (0, _objectWithoutProperties2.default)(breakpoints, [\"values\", \"unit\", \"step\"]);\n\n function up(key) {\n var value = typeof values[key] === 'number' ? values[key] : key;\n return \"@media (min-width:\".concat(value).concat(unit, \")\");\n }\n\n function down(key) {\n var endIndex = keys.indexOf(key) + 1;\n var upperbound = values[keys[endIndex]];\n\n if (endIndex === keys.length) {\n // xl down applies to all sizes\n return up('xs');\n }\n\n var value = typeof upperbound === 'number' && endIndex > 0 ? upperbound : key;\n return \"@media (max-width:\".concat(value - step / 100).concat(unit, \")\");\n }\n\n function between(start, end) {\n var endIndex = keys.indexOf(end) + 1;\n\n if (endIndex === keys.length) {\n return up(start);\n }\n\n return \"@media (min-width:\".concat(values[start]).concat(unit, \") and \") + \"(max-width:\".concat(values[keys[endIndex]] - step / 100).concat(unit, \")\");\n }\n\n function only(key) {\n return between(key, key);\n }\n\n function width(key) {\n return values[key];\n }\n\n return (0, _extends2.default)({\n keys: keys,\n values: values,\n up: up,\n down: down,\n between: between,\n only: only,\n width: width\n }, other);\n}", - "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = createGenerateClassName;\n\nvar _warning = _interopRequireDefault(require(\"warning\"));\n\nvar escapeRegex = /([[\\].#*$><+~=|^:(),\"'` + ("`" + `\\s])/g;\n\nfunction safePrefix(classNamePrefix) {\n var prefix = String(classNamePrefix);\n process.env.NODE_ENV !== \"production\" ? (0, _warning.default)(prefix.length < 256, \"Material-UI: the class name prefix is too long: \".concat(prefix, \".\")) : void 0; // Sanitize the string as will be used to prefix the generated class name.\n\n return prefix.replace(escapeRegex, '-');\n} // Returns a function which generates unique class names based on counters.\n// When new generator function is created, rule counter is reset.\n// We need to reset the rule counter for SSR for each request.\n//\n// It's inspired by\n// https://github.com/cssinjs/jss/blob/4e6a05dd3f7b6572fdd3ab216861d9e446c20331/src/utils/createGenerateClassName.js\n\n\nfunction createGenerateClassName() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var _options$dangerouslyU = options.dangerouslyUseGlobalCSS,\n dangerouslyUseGlobalCSS = _options$dangerouslyU === void 0 ? false : _options$dangerouslyU,\n _options$productionPr = options.productionPrefix,\n productionPrefix = _options$productionPr === void 0 ? 'jss' : _options$productionPr,\n _options$seed = options.seed,\n seed = _options$seed === void 0 ? '' : _options$seed;\n var ruleCounter = 0;\n return function (rule, styleSheet) {\n ruleCounter += 1;\n process.env.NODE_ENV !== \"production\" ? (0, _warning.default)(ruleCounter < 1e10, ['Material-UI: you might have a memory leak.', 'The ruleCounter is not supposed to grow that much.'].join('')) : void 0;\n\n if (dangerouslyUseGlobalCSS && styleSheet && styleSheet.options.name) {\n return \"\".concat(safePrefix(styleSheet.options.name), \"-\").concat(rule.key);\n }\n\n if (process.env.NODE_ENV === 'production') {\n return \"\".concat(productionPrefix).concat(seed).concat(ruleCounter);\n } // Help with debuggability.\n\n\n if (styleSheet && styleSheet.options.classNamePrefix) {\n return \"\".concat(safePrefix(styleSheet.options.classNamePrefix), \"-\").concat(rule.key, \"-\").concat(seed).concat(ruleCounter);\n }\n\n return \"\".concat(rule.key, \"-\").concat(seed).concat(ruleCounter);\n };\n}", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = createGenerateClassName;\n\nvar _warning = _interopRequireDefault(require(\"warning\"));\n\nvar escapeRegex = /([[\\].#*$><+~=|^:(),\"'`)))))) + ((((("`" + (`\\s])/g;\n\nfunction safePrefix(classNamePrefix) {\n var prefix = String(classNamePrefix);\n process.env.NODE_ENV !== \"production\" ? (0, _warning.default)(prefix.length < 256, \"Material-UI: the class name prefix is too long: \".concat(prefix, \".\")) : void 0; // Sanitize the string as will be used to prefix the generated class name.\n\n return prefix.replace(escapeRegex, '-');\n} // Returns a function which generates unique class names based on counters.\n// When new generator function is created, rule counter is reset.\n// We need to reset the rule counter for SSR for each request.\n//\n// It's inspired by\n// https://github.com/cssinjs/jss/blob/4e6a05dd3f7b6572fdd3ab216861d9e446c20331/src/utils/createGenerateClassName.js\n\n\nfunction createGenerateClassName() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var _options$dangerouslyU = options.dangerouslyUseGlobalCSS,\n dangerouslyUseGlobalCSS = _options$dangerouslyU === void 0 ? false : _options$dangerouslyU,\n _options$productionPr = options.productionPrefix,\n productionPrefix = _options$productionPr === void 0 ? 'jss' : _options$productionPr,\n _options$seed = options.seed,\n seed = _options$seed === void 0 ? '' : _options$seed;\n var ruleCounter = 0;\n return function (rule, styleSheet) {\n ruleCounter += 1;\n process.env.NODE_ENV !== \"production\" ? (0, _warning.default)(ruleCounter < 1e10, ['Material-UI: you might have a memory leak.', 'The ruleCounter is not supposed to grow that much.'].join('')) : void 0;\n\n if (dangerouslyUseGlobalCSS && styleSheet && styleSheet.options.name) {\n return \"\".concat(safePrefix(styleSheet.options.name), \"-\").concat(rule.key);\n }\n\n if (process.env.NODE_ENV === 'production') {\n return \"\".concat(productionPrefix).concat(seed).concat(ruleCounter);\n } // Help with debuggability.\n\n\n if (styleSheet && styleSheet.options.classNamePrefix) {\n return \"\".concat(safePrefix(styleSheet.options.classNamePrefix), \"-\").concat(rule.key, \"-\").concat(seed).concat(ruleCounter);\n }\n\n return \"\".concat(rule.key, \"-\").concat(seed).concat(ruleCounter);\n };\n}", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = createMixins;\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/defineProperty\"));\n\nvar _extends3 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nfunction createMixins(breakpoints, spacing, mixins) {\n var _toolbar;\n\n return (0, _extends3.default)({\n gutters: function gutters() {\n var styles = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n return (0, _extends3.default)({\n paddingLeft: spacing.unit * 2,\n paddingRight: spacing.unit * 2\n }, styles, (0, _defineProperty2.default)({}, breakpoints.up('sm'), (0, _extends3.default)({\n paddingLeft: spacing.unit * 3,\n paddingRight: spacing.unit * 3\n }, styles[breakpoints.up('sm')])));\n },\n toolbar: (_toolbar = {\n minHeight: 56\n }, (0, _defineProperty2.default)(_toolbar, \"\".concat(breakpoints.up('xs'), \" and (orientation: landscape)\"), {\n minHeight: 48\n }), (0, _defineProperty2.default)(_toolbar, breakpoints.up('sm'), {\n minHeight: 64\n }), _toolbar)\n }, mixins);\n}", - "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/defineProperty\"));\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _objectWithoutProperties2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectWithoutProperties\"));\n\nvar _deepmerge = _interopRequireDefault(require(\"deepmerge\"));\n\nvar _isPlainObject = _interopRequireDefault(require(\"is-plain-object\"));\n\nvar _warning = _interopRequireDefault(require(\"warning\"));\n\nvar _createBreakpoints = _interopRequireDefault(require(\"./createBreakpoints\"));\n\nvar _createMixins = _interopRequireDefault(require(\"./createMixins\"));\n\nvar _createPalette = _interopRequireDefault(require(\"./createPalette\"));\n\nvar _createTypography = _interopRequireDefault(require(\"./createTypography\"));\n\nvar _shadows = _interopRequireDefault(require(\"./shadows\"));\n\nvar _shape = _interopRequireDefault(require(\"./shape\"));\n\nvar _spacing = _interopRequireDefault(require(\"./spacing\"));\n\nvar _transitions = _interopRequireDefault(require(\"./transitions\"));\n\nvar _zIndex = _interopRequireDefault(require(\"./zIndex\"));\n\n// < 1kb payload overhead when lodash/merge is > 3kb.\nfunction createMuiTheme() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var _options$breakpoints = options.breakpoints,\n breakpointsInput = _options$breakpoints === void 0 ? {} : _options$breakpoints,\n _options$mixins = options.mixins,\n mixinsInput = _options$mixins === void 0 ? {} : _options$mixins,\n _options$palette = options.palette,\n paletteInput = _options$palette === void 0 ? {} : _options$palette,\n shadowsInput = options.shadows,\n _options$spacing = options.spacing,\n spacingInput = _options$spacing === void 0 ? {} : _options$spacing,\n _options$typography = options.typography,\n typographyInput = _options$typography === void 0 ? {} : _options$typography,\n other = (0, _objectWithoutProperties2.default)(options, [\"breakpoints\", \"mixins\", \"palette\", \"shadows\", \"spacing\", \"typography\"]);\n var palette = (0, _createPalette.default)(paletteInput);\n var breakpoints = (0, _createBreakpoints.default)(breakpointsInput);\n var spacing = (0, _extends2.default)({}, _spacing.default, spacingInput);\n var muiTheme = (0, _extends2.default)({\n breakpoints: breakpoints,\n direction: 'ltr',\n mixins: (0, _createMixins.default)(breakpoints, spacing, mixinsInput),\n overrides: {},\n // Inject custom styles\n palette: palette,\n props: {},\n // Inject custom properties\n shadows: shadowsInput || _shadows.default,\n typography: (0, _createTypography.default)(palette, typographyInput)\n }, (0, _deepmerge.default)({\n shape: _shape.default,\n spacing: spacing,\n transitions: _transitions.default,\n zIndex: _zIndex.default\n }, other, {\n isMergeableObject: _isPlainObject.default\n }));\n\n if (process.env.NODE_ENV !== 'production') {\n var statesWarning = ['disabled', 'focused', 'selected', 'checked'];\n\n var traverse = function traverse(node, parentKey) {\n var depth = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;\n var key; // eslint-disable-next-line guard-for-in, no-restricted-syntax\n\n for (key in node) {\n var child = node[key];\n\n if (depth === 1) {\n if (key.indexOf('Mui') === 0 && child) {\n traverse(child, key, depth + 1);\n }\n } else if (statesWarning.indexOf(key) !== -1 && Object.keys(child).length > 0) {\n process.env.NODE_ENV !== \"production\" ? (0, _warning.default)(false, [\"Material-UI: the `))) + (("`" + (`\".concat(parentKey, \"` + "`")) + (` component increases \") + \"the CSS specificity of the ` + ("`" + `\".concat(key, \"`))))) + (((("`" + ` internal state.\"), 'You can not override it like this: ', JSON.stringify(node, null, 2), '', 'Instead, you need to use the $ruleName syntax:', JSON.stringify((0, _defineProperty2.default)({}, \"&$\".concat(key), child), null, 2), '', 'https://material-ui.com/customization/overrides#internal-states'].join('\\n')) : void 0;\n }\n }\n };\n\n traverse(other.overrides);\n }\n\n process.env.NODE_ENV !== \"production\" ? (0, _warning.default)(muiTheme.shadows.length === 25, 'Material-UI: the shadows array provided to createMuiTheme should support 25 elevations.') : void 0;\n return muiTheme;\n}\n\nvar _default = createMuiTheme;\nexports.default = _default;", - "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = createPalette;\nexports.dark = exports.light = void 0;\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _objectWithoutProperties2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectWithoutProperties\"));\n\nvar _warning = _interopRequireDefault(require(\"warning\"));\n\nvar _deepmerge = _interopRequireDefault(require(\"deepmerge\"));\n\nvar _indigo = _interopRequireDefault(require(\"../colors/indigo\"));\n\nvar _pink = _interopRequireDefault(require(\"../colors/pink\"));\n\nvar _grey = _interopRequireDefault(require(\"../colors/grey\"));\n\nvar _red = _interopRequireDefault(require(\"../colors/red\"));\n\nvar _common = _interopRequireDefault(require(\"../colors/common\"));\n\nvar _colorManipulator = require(\"./colorManipulator\");\n\n// < 1kb payload overhead when lodash/merge is > 3kb.\nvar light = {\n // The colors used to style the text.\n text: {\n // The most important text.\n primary: 'rgba(0, 0, 0, 0.87)',\n // Secondary text.\n secondary: 'rgba(0, 0, 0, 0.54)',\n // Disabled text have even lower visual prominence.\n disabled: 'rgba(0, 0, 0, 0.38)',\n // Text hints.\n hint: 'rgba(0, 0, 0, 0.38)'\n },\n // The color used to divide different elements.\n divider: 'rgba(0, 0, 0, 0.12)',\n // The background colors used to style the surfaces.\n // Consistency between these values is important.\n background: {\n paper: _common.default.white,\n default: _grey.default[50]\n },\n // The colors used to style the action elements.\n action: {\n // The color of an active action like an icon button.\n active: 'rgba(0, 0, 0, 0.54)',\n // The color of an hovered action.\n hover: 'rgba(0, 0, 0, 0.08)',\n hoverOpacity: 0.08,\n // The color of a selected action.\n selected: 'rgba(0, 0, 0, 0.14)',\n // The color of a disabled action.\n disabled: 'rgba(0, 0, 0, 0.26)',\n // The background color of a disabled action.\n disabledBackground: 'rgba(0, 0, 0, 0.12)'\n }\n};\nexports.light = light;\nvar dark = {\n text: {\n primary: _common.default.white,\n secondary: 'rgba(255, 255, 255, 0.7)',\n disabled: 'rgba(255, 255, 255, 0.5)',\n hint: 'rgba(255, 255, 255, 0.5)',\n icon: 'rgba(255, 255, 255, 0.5)'\n },\n divider: 'rgba(255, 255, 255, 0.12)',\n background: {\n paper: _grey.default[800],\n default: '#303030'\n },\n action: {\n active: _common.default.white,\n hover: 'rgba(255, 255, 255, 0.1)',\n hoverOpacity: 0.1,\n selected: 'rgba(255, 255, 255, 0.2)',\n disabled: 'rgba(255, 255, 255, 0.3)',\n disabledBackground: 'rgba(255, 255, 255, 0.12)'\n }\n};\nexports.dark = dark;\n\nfunction addLightOrDark(intent, direction, shade, tonalOffset) {\n if (!intent[direction]) {\n if (intent.hasOwnProperty(shade)) {\n intent[direction] = intent[shade];\n } else if (direction === 'light') {\n intent.light = (0, _colorManipulator.lighten)(intent.main, tonalOffset);\n } else if (direction === 'dark') {\n intent.dark = (0, _colorManipulator.darken)(intent.main, tonalOffset * 1.5);\n }\n }\n}\n\nfunction createPalette(palette) {\n var _palette$primary = palette.primary,\n primary = _palette$primary === void 0 ? {\n light: _indigo.default[300],\n main: _indigo.default[500],\n dark: _indigo.default[700]\n } : _palette$primary,\n _palette$secondary = palette.secondary,\n secondary = _palette$secondary === void 0 ? {\n light: _pink.default.A200,\n main: _pink.default.A400,\n dark: _pink.default.A700\n } : _palette$secondary,\n _palette$error = palette.error,\n error = _palette$error === void 0 ? {\n light: _red.default[300],\n main: _red.default[500],\n dark: _red.default[700]\n } : _palette$error,\n _palette$type = palette.type,\n type = _palette$type === void 0 ? 'light' : _palette$type,\n _palette$contrastThre = palette.contrastThreshold,\n contrastThreshold = _palette$contrastThre === void 0 ? 3 : _palette$contrastThre,\n _palette$tonalOffset = palette.tonalOffset,\n tonalOffset = _palette$tonalOffset === void 0 ? 0.2 : _palette$tonalOffset,\n other = (0, _objectWithoutProperties2.default)(palette, [\"primary\", \"secondary\", \"error\", \"type\", \"contrastThreshold\", \"tonalOffset\"]);\n\n function getContrastText(background) {\n // Use the same logic as\n // Bootstrap: https://github.com/twbs/bootstrap/blob/1d6e3710dd447de1a200f29e8fa521f8a0908f70/scss/_functions.scss#L59\n // and material-components-web https://github.com/material-components/material-components-web/blob/ac46b8863c4dab9fc22c4c662dc6bd1b65dd652f/packages/mdc-theme/_functions.scss#L54\n var contrastText = (0, _colorManipulator.getContrastRatio)(background, dark.text.primary) >= contrastThreshold ? dark.text.primary : light.text.primary;\n\n if (process.env.NODE_ENV !== 'production') {\n var contrast = (0, _colorManipulator.getContrastRatio)(background, contrastText);\n process.env.NODE_ENV !== \"production\" ? (0, _warning.default)(contrast >= 3, [\"Material-UI: the contrast ratio of \".concat(contrast, \":1 for \").concat(contrastText, \" on \").concat(background), 'falls below the WACG recommended absolute minimum contrast ratio of 3:1.', 'https://www.w3.org/TR/2008/REC-WCAG20-20081211/#visual-audio-contrast-contrast'].join('\\n')) : void 0;\n }\n\n return contrastText;\n }\n\n function augmentColor(color) {\n var mainShade = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 500;\n var lightShade = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 300;\n var darkShade = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 700;\n\n if (!color.main && color[mainShade]) {\n color.main = color[mainShade];\n }\n\n if (process.env.NODE_ENV !== 'production' && !color.main) {\n throw new Error(['Material-UI: the color provided to augmentColor(color) is invalid.', \"The color object needs to have a `) + ("`" + (`main` + "`"))) + ((` property or a ` + ("`" + `\".concat(mainShade, \"`)) + ("`" + (` property.\")].join('\\n'));\n }\n\n addLightOrDark(color, 'light', lightShade, tonalOffset);\n addLightOrDark(color, 'dark', darkShade, tonalOffset);\n\n if (!color.contrastText) {\n color.contrastText = getContrastText(color.main);\n }\n\n return color;\n }\n\n augmentColor(primary);\n augmentColor(secondary, 'A400', 'A200', 'A700');\n augmentColor(error);\n var types = {\n dark: dark,\n light: light\n };\n process.env.NODE_ENV !== \"production\" ? (0, _warning.default)(types[type], \"Material-UI: the palette type ` + "`")))) + (((`\".concat(type, \"` + "`") + (` is not supported.\")) : void 0;\n var paletteOutput = (0, _deepmerge.default)((0, _extends2.default)({\n // A collection of common colors.\n common: _common.default,\n // The palette type, can be light or dark.\n type: type,\n // The colors used to represent primary interface elements for a user.\n primary: primary,\n // The colors used to represent secondary interface elements for a user.\n secondary: secondary,\n // The colors used to represent interface elements that the user should be made aware of.\n error: error,\n // The grey colors.\n grey: _grey.default,\n // Used by ` + ("`" + `getContrastText()`))) + (("`" + (` to maximize the contrast between the background and\n // the text.\n contrastThreshold: contrastThreshold,\n // Take a background color and return the color of the text to maximize the contrast.\n getContrastText: getContrastText,\n // Generate a rich color object.\n augmentColor: augmentColor,\n // Used by the functions below to shift a color's luminance by approximately\n // two indexes within its tonal palette.\n // E.g., shift from Red 500 to Red 300 or Red 700.\n tonalOffset: tonalOffset\n }, types[type]), other, {\n clone: false // No need to clone deep\n\n });\n return paletteOutput;\n}", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/defineProperty\"));\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _objectWithoutProperties2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectWithoutProperties\"));\n\nvar _deepmerge = _interopRequireDefault(require(\"deepmerge\"));\n\nvar _isPlainObject = _interopRequireDefault(require(\"is-plain-object\"));\n\nvar _warning = _interopRequireDefault(require(\"warning\"));\n\nvar _createBreakpoints = _interopRequireDefault(require(\"./createBreakpoints\"));\n\nvar _createMixins = _interopRequireDefault(require(\"./createMixins\"));\n\nvar _createPalette = _interopRequireDefault(require(\"./createPalette\"));\n\nvar _createTypography = _interopRequireDefault(require(\"./createTypography\"));\n\nvar _shadows = _interopRequireDefault(require(\"./shadows\"));\n\nvar _shape = _interopRequireDefault(require(\"./shape\"));\n\nvar _spacing = _interopRequireDefault(require(\"./spacing\"));\n\nvar _transitions = _interopRequireDefault(require(\"./transitions\"));\n\nvar _zIndex = _interopRequireDefault(require(\"./zIndex\"));\n\n// < 1kb payload overhead when lodash/merge is > 3kb.\nfunction createMuiTheme() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var _options$breakpoints = options.breakpoints,\n breakpointsInput = _options$breakpoints === void 0 ? {} : _options$breakpoints,\n _options$mixins = options.mixins,\n mixinsInput = _options$mixins === void 0 ? {} : _options$mixins,\n _options$palette = options.palette,\n paletteInput = _options$palette === void 0 ? {} : _options$palette,\n shadowsInput = options.shadows,\n _options$spacing = options.spacing,\n spacingInput = _options$spacing === void 0 ? {} : _options$spacing,\n _options$typography = options.typography,\n typographyInput = _options$typography === void 0 ? {} : _options$typography,\n other = (0, _objectWithoutProperties2.default)(options, [\"breakpoints\", \"mixins\", \"palette\", \"shadows\", \"spacing\", \"typography\"]);\n var palette = (0, _createPalette.default)(paletteInput);\n var breakpoints = (0, _createBreakpoints.default)(breakpointsInput);\n var spacing = (0, _extends2.default)({}, _spacing.default, spacingInput);\n var muiTheme = (0, _extends2.default)({\n breakpoints: breakpoints,\n direction: 'ltr',\n mixins: (0, _createMixins.default)(breakpoints, spacing, mixinsInput),\n overrides: {},\n // Inject custom styles\n palette: palette,\n props: {},\n // Inject custom properties\n shadows: shadowsInput || _shadows.default,\n typography: (0, _createTypography.default)(palette, typographyInput)\n }, (0, _deepmerge.default)({\n shape: _shape.default,\n spacing: spacing,\n transitions: _transitions.default,\n zIndex: _zIndex.default\n }, other, {\n isMergeableObject: _isPlainObject.default\n }));\n\n if (process.env.NODE_ENV !== 'production') {\n var statesWarning = ['disabled', 'focused', 'selected', 'checked'];\n\n var traverse = function traverse(node, parentKey) {\n var depth = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;\n var key; // eslint-disable-next-line guard-for-in, no-restricted-syntax\n\n for (key in node) {\n var child = node[key];\n\n if (depth === 1) {\n if (key.indexOf('Mui') === 0 && child) {\n traverse(child, key, depth + 1);\n }\n } else if (statesWarning.indexOf(key) !== -1 && Object.keys(child).length > 0) {\n process.env.NODE_ENV !== \"production\" ? (0, _warning.default)(false, [\"Material-UI: the ` + "`")) + (`\".concat(parentKey, \"` + ("`" + ` component increases \") + \"the CSS specificity of the `))) + (("`" + (`\".concat(key, \"` + "`")) + (` internal state.\"), 'You can not override it like this: ', JSON.stringify(node, null, 2), '', 'Instead, you need to use the $ruleName syntax:', JSON.stringify((0, _defineProperty2.default)({}, \"&$\".concat(key), child), null, 2), '', 'https://material-ui.com/customization/overrides#internal-states'].join('\\n')) : void 0;\n }\n }\n };\n\n traverse(other.overrides);\n }\n\n process.env.NODE_ENV !== \"production\" ? (0, _warning.default)(muiTheme.shadows.length === 25, 'Material-UI: the shadows array provided to createMuiTheme should support 25 elevations.') : void 0;\n return muiTheme;\n}\n\nvar _default = createMuiTheme;\nexports.default = _default;", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = createPalette;\nexports.dark = exports.light = void 0;\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _objectWithoutProperties2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectWithoutProperties\"));\n\nvar _warning = _interopRequireDefault(require(\"warning\"));\n\nvar _deepmerge = _interopRequireDefault(require(\"deepmerge\"));\n\nvar _indigo = _interopRequireDefault(require(\"../colors/indigo\"));\n\nvar _pink = _interopRequireDefault(require(\"../colors/pink\"));\n\nvar _grey = _interopRequireDefault(require(\"../colors/grey\"));\n\nvar _red = _interopRequireDefault(require(\"../colors/red\"));\n\nvar _common = _interopRequireDefault(require(\"../colors/common\"));\n\nvar _colorManipulator = require(\"./colorManipulator\");\n\n// < 1kb payload overhead when lodash/merge is > 3kb.\nvar light = {\n // The colors used to style the text.\n text: {\n // The most important text.\n primary: 'rgba(0, 0, 0, 0.87)',\n // Secondary text.\n secondary: 'rgba(0, 0, 0, 0.54)',\n // Disabled text have even lower visual prominence.\n disabled: 'rgba(0, 0, 0, 0.38)',\n // Text hints.\n hint: 'rgba(0, 0, 0, 0.38)'\n },\n // The color used to divide different elements.\n divider: 'rgba(0, 0, 0, 0.12)',\n // The background colors used to style the surfaces.\n // Consistency between these values is important.\n background: {\n paper: _common.default.white,\n default: _grey.default[50]\n },\n // The colors used to style the action elements.\n action: {\n // The color of an active action like an icon button.\n active: 'rgba(0, 0, 0, 0.54)',\n // The color of an hovered action.\n hover: 'rgba(0, 0, 0, 0.08)',\n hoverOpacity: 0.08,\n // The color of a selected action.\n selected: 'rgba(0, 0, 0, 0.14)',\n // The color of a disabled action.\n disabled: 'rgba(0, 0, 0, 0.26)',\n // The background color of a disabled action.\n disabledBackground: 'rgba(0, 0, 0, 0.12)'\n }\n};\nexports.light = light;\nvar dark = {\n text: {\n primary: _common.default.white,\n secondary: 'rgba(255, 255, 255, 0.7)',\n disabled: 'rgba(255, 255, 255, 0.5)',\n hint: 'rgba(255, 255, 255, 0.5)',\n icon: 'rgba(255, 255, 255, 0.5)'\n },\n divider: 'rgba(255, 255, 255, 0.12)',\n background: {\n paper: _grey.default[800],\n default: '#303030'\n },\n action: {\n active: _common.default.white,\n hover: 'rgba(255, 255, 255, 0.1)',\n hoverOpacity: 0.1,\n selected: 'rgba(255, 255, 255, 0.2)',\n disabled: 'rgba(255, 255, 255, 0.3)',\n disabledBackground: 'rgba(255, 255, 255, 0.12)'\n }\n};\nexports.dark = dark;\n\nfunction addLightOrDark(intent, direction, shade, tonalOffset) {\n if (!intent[direction]) {\n if (intent.hasOwnProperty(shade)) {\n intent[direction] = intent[shade];\n } else if (direction === 'light') {\n intent.light = (0, _colorManipulator.lighten)(intent.main, tonalOffset);\n } else if (direction === 'dark') {\n intent.dark = (0, _colorManipulator.darken)(intent.main, tonalOffset * 1.5);\n }\n }\n}\n\nfunction createPalette(palette) {\n var _palette$primary = palette.primary,\n primary = _palette$primary === void 0 ? {\n light: _indigo.default[300],\n main: _indigo.default[500],\n dark: _indigo.default[700]\n } : _palette$primary,\n _palette$secondary = palette.secondary,\n secondary = _palette$secondary === void 0 ? {\n light: _pink.default.A200,\n main: _pink.default.A400,\n dark: _pink.default.A700\n } : _palette$secondary,\n _palette$error = palette.error,\n error = _palette$error === void 0 ? {\n light: _red.default[300],\n main: _red.default[500],\n dark: _red.default[700]\n } : _palette$error,\n _palette$type = palette.type,\n type = _palette$type === void 0 ? 'light' : _palette$type,\n _palette$contrastThre = palette.contrastThreshold,\n contrastThreshold = _palette$contrastThre === void 0 ? 3 : _palette$contrastThre,\n _palette$tonalOffset = palette.tonalOffset,\n tonalOffset = _palette$tonalOffset === void 0 ? 0.2 : _palette$tonalOffset,\n other = (0, _objectWithoutProperties2.default)(palette, [\"primary\", \"secondary\", \"error\", \"type\", \"contrastThreshold\", \"tonalOffset\"]);\n\n function getContrastText(background) {\n // Use the same logic as\n // Bootstrap: https://github.com/twbs/bootstrap/blob/1d6e3710dd447de1a200f29e8fa521f8a0908f70/scss/_functions.scss#L59\n // and material-components-web https://github.com/material-components/material-components-web/blob/ac46b8863c4dab9fc22c4c662dc6bd1b65dd652f/packages/mdc-theme/_functions.scss#L54\n var contrastText = (0, _colorManipulator.getContrastRatio)(background, dark.text.primary) >= contrastThreshold ? dark.text.primary : light.text.primary;\n\n if (process.env.NODE_ENV !== 'production') {\n var contrast = (0, _colorManipulator.getContrastRatio)(background, contrastText);\n process.env.NODE_ENV !== \"production\" ? (0, _warning.default)(contrast >= 3, [\"Material-UI: the contrast ratio of \".concat(contrast, \":1 for \").concat(contrastText, \" on \").concat(background), 'falls below the WACG recommended absolute minimum contrast ratio of 3:1.', 'https://www.w3.org/TR/2008/REC-WCAG20-20081211/#visual-audio-contrast-contrast'].join('\\n')) : void 0;\n }\n\n return contrastText;\n }\n\n function augmentColor(color) {\n var mainShade = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 500;\n var lightShade = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 300;\n var darkShade = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 700;\n\n if (!color.main && color[mainShade]) {\n color.main = color[mainShade];\n }\n\n if (process.env.NODE_ENV !== 'production' && !color.main) {\n throw new Error(['Material-UI: the color provided to augmentColor(color) is invalid.', \"The color object needs to have a ` + ("`" + `main`)))) + ((("`" + (` property or a ` + "`")) + (`\".concat(mainShade, \"` + ("`" + ` property.\")].join('\\n'));\n }\n\n addLightOrDark(color, 'light', lightShade, tonalOffset);\n addLightOrDark(color, 'dark', darkShade, tonalOffset);\n\n if (!color.contrastText) {\n color.contrastText = getContrastText(color.main);\n }\n\n return color;\n }\n\n augmentColor(primary);\n augmentColor(secondary, 'A400', 'A200', 'A700');\n augmentColor(error);\n var types = {\n dark: dark,\n light: light\n };\n process.env.NODE_ENV !== \"production\" ? (0, _warning.default)(types[type], \"Material-UI: the palette type `))) + (("`" + (`\".concat(type, \"` + "`")) + ((` is not supported.\")) : void 0;\n var paletteOutput = (0, _deepmerge.default)((0, _extends2.default)({\n // A collection of common colors.\n common: _common.default,\n // The palette type, can be light or dark.\n type: type,\n // The colors used to represent primary interface elements for a user.\n primary: primary,\n // The colors used to represent secondary interface elements for a user.\n secondary: secondary,\n // The colors used to represent interface elements that the user should be made aware of.\n error: error,\n // The grey colors.\n grey: _grey.default,\n // Used by ` + "`") + (`getContrastText()` + "`"))))) + ((((` to maximize the contrast between the background and\n // the text.\n contrastThreshold: contrastThreshold,\n // Take a background color and return the color of the text to maximize the contrast.\n getContrastText: getContrastText,\n // Generate a rich color object.\n augmentColor: augmentColor,\n // Used by the functions below to shift a color's luminance by approximately\n // two indexes within its tonal palette.\n // E.g., shift from Red 500 to Red 300 or Red 700.\n tonalOffset: tonalOffset\n }, types[type]), other, {\n clone: false // No need to clone deep\n\n });\n return paletteOutput;\n}", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = createTypography;\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _objectWithoutProperties2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectWithoutProperties\"));\n\nvar _deepmerge = _interopRequireDefault(require(\"deepmerge\"));\n\nvar _warning = _interopRequireDefault(require(\"warning\"));\n\nvar _utils = require(\"@material-ui/utils\");\n\n// < 1kb payload overhead when lodash/merge is > 3kb.\nfunction round(value) {\n return Math.round(value * 1e5) / 1e5;\n}\n\nvar caseAllCaps = {\n textTransform: 'uppercase'\n};\nvar defaultFontFamily = '\"Roboto\", \"Helvetica\", \"Arial\", sans-serif';\n/**\r\n * @see @link{https://material.io/design/typography/the-type-system.html}\r\n * @see @link{https://material.io/design/typography/understanding-typography.html}\r\n */\n\nfunction createTypography(palette, typography) {\n var _ref = typeof typography === 'function' ? typography(palette) : typography,\n _ref$fontFamily = _ref.fontFamily,\n fontFamily = _ref$fontFamily === void 0 ? defaultFontFamily : _ref$fontFamily,\n _ref$fontSize = _ref.fontSize,\n fontSize = _ref$fontSize === void 0 ? 14 : _ref$fontSize,\n _ref$fontWeightLight = _ref.fontWeightLight,\n fontWeightLight = _ref$fontWeightLight === void 0 ? 300 : _ref$fontWeightLight,\n _ref$fontWeightRegula = _ref.fontWeightRegular,\n fontWeightRegular = _ref$fontWeightRegula === void 0 ? 400 : _ref$fontWeightRegula,\n _ref$fontWeightMedium = _ref.fontWeightMedium,\n fontWeightMedium = _ref$fontWeightMedium === void 0 ? 500 : _ref$fontWeightMedium,\n _ref$htmlFontSize = _ref.htmlFontSize,\n htmlFontSize = _ref$htmlFontSize === void 0 ? 16 : _ref$htmlFontSize,\n _ref$useNextVariants = _ref.useNextVariants,\n useNextVariants = _ref$useNextVariants === void 0 ? Boolean(_utils.ponyfillGlobal.__MUI_USE_NEXT_TYPOGRAPHY_VARIANTS__) : _ref$useNextVariants,\n _ref$suppressWarning = _ref.suppressWarning,\n suppressWarning = _ref$suppressWarning === void 0 ? false : _ref$suppressWarning,\n allVariants = _ref.allVariants,\n other = (0, _objectWithoutProperties2.default)(_ref, [\"fontFamily\", \"fontSize\", \"fontWeightLight\", \"fontWeightRegular\", \"fontWeightMedium\", \"htmlFontSize\", \"useNextVariants\", \"suppressWarning\", \"allVariants\"]);\n\n process.env.NODE_ENV !== \"production\" ? (0, _warning.default)(useNextVariants || suppressWarning, 'Material-UI: you are using the deprecated typography variants ' + 'that will be removed in the next major release.' + '\\nPlease read the migration guide under https://material-ui.com/style/typography#migration-to-typography-v2') : void 0;\n var coef = fontSize / 14;\n\n var pxToRem = function pxToRem(size) {\n return \"\".concat(size / htmlFontSize * coef, \"rem\");\n };\n\n var buildVariant = function buildVariant(fontWeight, size, lineHeight, letterSpacing, casing) {\n return (0, _extends2.default)({\n color: palette.text.primary,\n fontFamily: fontFamily,\n fontWeight: fontWeight,\n fontSize: pxToRem(size),\n // Unitless following http://meyerweb.com/eric/thoughts/2006/02/08/unitless-line-heights/\n lineHeight: lineHeight\n }, fontFamily === defaultFontFamily ? {\n letterSpacing: \"\".concat(round(letterSpacing / size), \"em\")\n } : {}, casing, allVariants);\n };\n\n var nextVariants = {\n h1: buildVariant(fontWeightLight, 96, 1, -1.5),\n h2: buildVariant(fontWeightLight, 60, 1, -0.5),\n h3: buildVariant(fontWeightRegular, 48, 1.04, 0),\n h4: buildVariant(fontWeightRegular, 34, 1.17, 0.25),\n h5: buildVariant(fontWeightRegular, 24, 1.33, 0),\n h6: buildVariant(fontWeightMedium, 20, 1.6, 0.15),\n subtitle1: buildVariant(fontWeightRegular, 16, 1.75, 0.15),\n subtitle2: buildVariant(fontWeightMedium, 14, 1.57, 0.1),\n body1Next: buildVariant(fontWeightRegular, 16, 1.5, 0.15),\n body2Next: buildVariant(fontWeightRegular, 14, 1.5, 0.15),\n buttonNext: buildVariant(fontWeightMedium, 14, 1.75, 0.4, caseAllCaps),\n captionNext: buildVariant(fontWeightRegular, 12, 1.66, 0.4),\n overline: buildVariant(fontWeightRegular, 12, 2.66, 1, caseAllCaps)\n }; // To remove in v4\n\n var oldVariants = {\n display4: (0, _extends2.default)({\n fontSize: pxToRem(112),\n fontWeight: fontWeightLight,\n fontFamily: fontFamily,\n letterSpacing: '-.04em',\n lineHeight: \"\".concat(round(128 / 112), \"em\"),\n marginLeft: '-.04em',\n color: palette.text.secondary\n }, allVariants),\n display3: (0, _extends2.default)({\n fontSize: pxToRem(56),\n fontWeight: fontWeightRegular,\n fontFamily: fontFamily,\n letterSpacing: '-.02em',\n lineHeight: \"\".concat(round(73 / 56), \"em\"),\n marginLeft: '-.02em',\n color: palette.text.secondary\n }, allVariants),\n display2: (0, _extends2.default)({\n fontSize: pxToRem(45),\n fontWeight: fontWeightRegular,\n fontFamily: fontFamily,\n lineHeight: \"\".concat(round(51 / 45), \"em\"),\n marginLeft: '-.02em',\n color: palette.text.secondary\n }, allVariants),\n display1: (0, _extends2.default)({\n fontSize: pxToRem(34),\n fontWeight: fontWeightRegular,\n fontFamily: fontFamily,\n lineHeight: \"\".concat(round(41 / 34), \"em\"),\n color: palette.text.secondary\n }, allVariants),\n headline: (0, _extends2.default)({\n fontSize: pxToRem(24),\n fontWeight: fontWeightRegular,\n fontFamily: fontFamily,\n lineHeight: \"\".concat(round(32.5 / 24), \"em\"),\n color: palette.text.primary\n }, allVariants),\n title: (0, _extends2.default)({\n fontSize: pxToRem(21),\n fontWeight: fontWeightMedium,\n fontFamily: fontFamily,\n lineHeight: \"\".concat(round(24.5 / 21), \"em\"),\n color: palette.text.primary\n }, allVariants),\n subheading: (0, _extends2.default)({\n fontSize: pxToRem(16),\n fontWeight: fontWeightRegular,\n fontFamily: fontFamily,\n lineHeight: \"\".concat(round(24 / 16), \"em\"),\n color: palette.text.primary\n }, allVariants),\n body2: (0, _extends2.default)({\n fontSize: pxToRem(14),\n fontWeight: fontWeightMedium,\n fontFamily: fontFamily,\n lineHeight: \"\".concat(round(24 / 14), \"em\"),\n color: palette.text.primary\n }, allVariants),\n body1: (0, _extends2.default)({\n fontSize: pxToRem(14),\n fontWeight: fontWeightRegular,\n fontFamily: fontFamily,\n lineHeight: \"\".concat(round(20.5 / 14), \"em\"),\n color: palette.text.primary\n }, allVariants),\n caption: (0, _extends2.default)({\n fontSize: pxToRem(12),\n fontWeight: fontWeightRegular,\n fontFamily: fontFamily,\n lineHeight: \"\".concat(round(16.5 / 12), \"em\"),\n color: palette.text.secondary\n }, allVariants),\n button: (0, _extends2.default)({\n fontSize: pxToRem(14),\n textTransform: 'uppercase',\n fontWeight: fontWeightMedium,\n fontFamily: fontFamily,\n color: palette.text.primary\n }, allVariants)\n };\n return (0, _deepmerge.default)((0, _extends2.default)({\n pxToRem: pxToRem,\n round: round,\n fontFamily: fontFamily,\n fontSize: fontSize,\n fontWeightLight: fontWeightLight,\n fontWeightRegular: fontWeightRegular,\n fontWeightMedium: fontWeightMedium\n }, oldVariants, nextVariants, useNextVariants ? {\n body1: nextVariants.body1Next,\n body2: nextVariants.body2Next,\n button: nextVariants.buttonNext,\n caption: nextVariants.captionNext\n } : {}, {\n useNextVariants: useNextVariants\n }), other, {\n clone: false // No need to clone deep\n\n });\n}", - "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _typeof2 = _interopRequireDefault(require(\"@babel/runtime/helpers/typeof\"));\n\nvar _warning = _interopRequireDefault(require(\"warning\"));\n\nvar _deepmerge = _interopRequireDefault(require(\"deepmerge\"));\n\n// < 1kb payload overhead when lodash/merge is > 3kb.\n// Support for the jss-expand plugin.\nfunction arrayMerge(destination, source) {\n return source;\n}\n\nfunction getStylesCreator(stylesOrCreator) {\n var themingEnabled = typeof stylesOrCreator === 'function';\n process.env.NODE_ENV !== \"production\" ? (0, _warning.default)((0, _typeof2.default)(stylesOrCreator) === 'object' || themingEnabled, ['Material-UI: the first argument provided to withStyles() is invalid.', 'You need to provide a function generating the styles or a styles object.'].join('\\n')) : void 0;\n\n function create(theme, name) {\n var styles = themingEnabled ? stylesOrCreator(theme) : stylesOrCreator;\n\n if (!name || !theme.overrides || !theme.overrides[name]) {\n return styles;\n }\n\n var overrides = theme.overrides[name];\n var stylesWithOverrides = (0, _extends2.default)({}, styles);\n Object.keys(overrides).forEach(function (key) {\n process.env.NODE_ENV !== \"production\" ? (0, _warning.default)(stylesWithOverrides[key], ['Material-UI: you are trying to override a style that does not exist.', \"Fix the ` + "`")) + (`\".concat(key, \"` + ("`" + ` key of `)))))) + ((((("`" + `theme.overrides.\").concat(name, \"`) + ("`" + (`.\")].join('\\n')) : void 0;\n stylesWithOverrides[key] = (0, _deepmerge.default)(stylesWithOverrides[key], overrides[key], {\n arrayMerge: arrayMerge\n });\n });\n return stylesWithOverrides;\n }\n\n return {\n create: create,\n options: {},\n themingEnabled: themingEnabled\n };\n}\n\nvar _default = getStylesCreator;\nexports.default = _default;", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _typeof2 = _interopRequireDefault(require(\"@babel/runtime/helpers/typeof\"));\n\nvar _warning = _interopRequireDefault(require(\"warning\"));\n\nvar _deepmerge = _interopRequireDefault(require(\"deepmerge\"));\n\n// < 1kb payload overhead when lodash/merge is > 3kb.\n// Support for the jss-expand plugin.\nfunction arrayMerge(destination, source) {\n return source;\n}\n\nfunction getStylesCreator(stylesOrCreator) {\n var themingEnabled = typeof stylesOrCreator === 'function';\n process.env.NODE_ENV !== \"production\" ? (0, _warning.default)((0, _typeof2.default)(stylesOrCreator) === 'object' || themingEnabled, ['Material-UI: the first argument provided to withStyles() is invalid.', 'You need to provide a function generating the styles or a styles object.'].join('\\n')) : void 0;\n\n function create(theme, name) {\n var styles = themingEnabled ? stylesOrCreator(theme) : stylesOrCreator;\n\n if (!name || !theme.overrides || !theme.overrides[name]) {\n return styles;\n }\n\n var overrides = theme.overrides[name];\n var stylesWithOverrides = (0, _extends2.default)({}, styles);\n Object.keys(overrides).forEach(function (key) {\n process.env.NODE_ENV !== \"production\" ? (0, _warning.default)(stylesWithOverrides[key], ['Material-UI: you are trying to override a style that does not exist.', \"Fix the ` + ("`" + `\".concat(key, \"`)) + ("`" + (` key of ` + "`"))) + ((`theme.overrides.\").concat(name, \"` + ("`" + `.\")].join('\\n')) : void 0;\n stylesWithOverrides[key] = (0, _deepmerge.default)(stylesWithOverrides[key], overrides[key], {\n arrayMerge: arrayMerge\n });\n });\n return stylesWithOverrides;\n }\n\n return {\n create: create,\n options: {},\n themingEnabled: themingEnabled\n };\n}\n\nvar _default = getStylesCreator;\nexports.default = _default;", "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\n/* eslint-disable no-restricted-syntax */\nfunction getThemeProps(params) {\n var theme = params.theme,\n name = params.name,\n props = params.props;\n\n if (!theme.props || !name || !theme.props[name]) {\n return props;\n } // Resolve default props, code borrow from React source.\n // https://github.com/facebook/react/blob/15a8f031838a553e41c0b66eb1bcf1da8448104d/packages/react/src/ReactElement.js#L221\n\n\n var defaultProps = theme.props[name];\n var propName;\n\n for (propName in defaultProps) {\n if (props[propName] === undefined) {\n props[propName] = defaultProps[propName];\n }\n }\n\n return props;\n}\n\nvar _default = getThemeProps;\nexports.default = _default;", - "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _jssGlobal = _interopRequireDefault(require(\"jss-global\"));\n\nvar _jssNested = _interopRequireDefault(require(\"jss-nested\"));\n\nvar _jssCamelCase = _interopRequireDefault(require(\"jss-camel-case\"));\n\nvar _jssDefaultUnit = _interopRequireDefault(require(\"jss-default-unit\"));\n\nvar _jssVendorPrefixer = _interopRequireDefault(require(\"jss-vendor-prefixer\"));\n\nvar _jssPropsSort = _interopRequireDefault(require(\"jss-props-sort\"));\n\n// Subset of jss-preset-default with only the plugins the Material-UI components are using.\nfunction jssPreset() {\n return {\n plugins: [(0, _jssGlobal.default)(), (0, _jssNested.default)(), (0, _jssCamelCase.default)(), (0, _jssDefaultUnit.default)(), // Disable the vendor prefixer server-side, it does nothing.\n // This way, we can get a performance boost.\n // In the documentation, we are using ` + "`"))) + ((`autoprefixer` + ("`" + ` to solve this problem.\n typeof window === 'undefined' ? null : (0, _jssVendorPrefixer.default)(), (0, _jssPropsSort.default)()]\n };\n}\n\nvar _default = jssPreset;\nexports.default = _default;", - "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _warning = _interopRequireDefault(require(\"warning\"));\n\nvar _utils = require(\"@material-ui/utils\");\n\nfunction mergeClasses() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var baseClasses = options.baseClasses,\n newClasses = options.newClasses,\n Component = options.Component;\n\n if (!newClasses) {\n return baseClasses;\n }\n\n var nextClasses = (0, _extends2.default)({}, baseClasses);\n\n if (process.env.NODE_ENV !== 'production' && typeof newClasses === 'string') {\n process.env.NODE_ENV !== \"production\" ? (0, _warning.default)(false, [\"Material-UI: the value `)) + ("`" + (`\".concat(newClasses, \"` + "`")))) + (((` \") + \"provided to the classes property of \".concat((0, _utils.getDisplayName)(Component), \" is incorrect.\"), 'You might want to use the className property instead.'].join('\\n')) : void 0;\n return baseClasses;\n }\n\n Object.keys(newClasses).forEach(function (key) {\n process.env.NODE_ENV !== \"production\" ? (0, _warning.default)(baseClasses[key] || !newClasses[key], [\"Material-UI: the key ` + "`") + (`\".concat(key, \"` + ("`" + ` \") + \"provided to the classes property is not implemented in \".concat((0, _utils.getDisplayName)(Component), \".\"), \"You can only override one of the following: \".concat(Object.keys(baseClasses).join(','), \".\")].join('\\n')) : void 0;\n process.env.NODE_ENV !== \"production\" ? (0, _warning.default)(!newClasses[key] || typeof newClasses[key] === 'string', [\"Material-UI: the key `))) + (("`" + (`\".concat(key, \"` + "`")) + (` \") + \"provided to the classes property is not valid for \".concat((0, _utils.getDisplayName)(Component), \".\"), \"You need to provide a non empty string instead of: \".concat(newClasses[key], \".\")].join('\\n')) : void 0;\n\n if (newClasses[key]) {\n nextClasses[key] = \"\".concat(baseClasses[key], \" \").concat(newClasses[key]);\n }\n });\n return nextClasses;\n}\n\nvar _default = mergeClasses;\nexports.default = _default;", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _jssGlobal = _interopRequireDefault(require(\"jss-global\"));\n\nvar _jssNested = _interopRequireDefault(require(\"jss-nested\"));\n\nvar _jssCamelCase = _interopRequireDefault(require(\"jss-camel-case\"));\n\nvar _jssDefaultUnit = _interopRequireDefault(require(\"jss-default-unit\"));\n\nvar _jssVendorPrefixer = _interopRequireDefault(require(\"jss-vendor-prefixer\"));\n\nvar _jssPropsSort = _interopRequireDefault(require(\"jss-props-sort\"));\n\n// Subset of jss-preset-default with only the plugins the Material-UI components are using.\nfunction jssPreset() {\n return {\n plugins: [(0, _jssGlobal.default)(), (0, _jssNested.default)(), (0, _jssCamelCase.default)(), (0, _jssDefaultUnit.default)(), // Disable the vendor prefixer server-side, it does nothing.\n // This way, we can get a performance boost.\n // In the documentation, we are using `)) + ("`" + (`autoprefixer` + "`")))) + (((` to solve this problem.\n typeof window === 'undefined' ? null : (0, _jssVendorPrefixer.default)(), (0, _jssPropsSort.default)()]\n };\n}\n\nvar _default = jssPreset;\nexports.default = _default;", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _warning = _interopRequireDefault(require(\"warning\"));\n\nvar _utils = require(\"@material-ui/utils\");\n\nfunction mergeClasses() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var baseClasses = options.baseClasses,\n newClasses = options.newClasses,\n Component = options.Component;\n\n if (!newClasses) {\n return baseClasses;\n }\n\n var nextClasses = (0, _extends2.default)({}, baseClasses);\n\n if (process.env.NODE_ENV !== 'production' && typeof newClasses === 'string') {\n process.env.NODE_ENV !== \"production\" ? (0, _warning.default)(false, [\"Material-UI: the value ` + ("`" + `\".concat(newClasses, \"`)) + ("`" + (` \") + \"provided to the classes property of \".concat((0, _utils.getDisplayName)(Component), \" is incorrect.\"), 'You might want to use the className property instead.'].join('\\n')) : void 0;\n return baseClasses;\n }\n\n Object.keys(newClasses).forEach(function (key) {\n process.env.NODE_ENV !== \"production\" ? (0, _warning.default)(baseClasses[key] || !newClasses[key], [\"Material-UI: the key ` + "`"))) + ((`\".concat(key, \"` + ("`" + ` \") + \"provided to the classes property is not implemented in \".concat((0, _utils.getDisplayName)(Component), \".\"), \"You can only override one of the following: \".concat(Object.keys(baseClasses).join(','), \".\")].join('\\n')) : void 0;\n process.env.NODE_ENV !== \"production\" ? (0, _warning.default)(!newClasses[key] || typeof newClasses[key] === 'string', [\"Material-UI: the key `)) + (("`" + `\".concat(key, \"`) + ("`" + ` \") + \"provided to the classes property is not valid for \".concat((0, _utils.getDisplayName)(Component), \".\"), \"You need to provide a non empty string instead of: \".concat(newClasses[key], \".\")].join('\\n')) : void 0;\n\n if (newClasses[key]) {\n nextClasses[key] = \"\".concat(baseClasses[key], \" \").concat(newClasses[key]);\n }\n });\n return nextClasses;\n}\n\nvar _default = mergeClasses;\nexports.default = _default;", "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n// Used https://github.com/thinkloop/multi-key-cache as inspiration\nvar multiKeyStore = {\n set: function set(cache, key1, key2, value) {\n var subCache = cache.get(key1);\n\n if (!subCache) {\n subCache = new Map();\n cache.set(key1, subCache);\n }\n\n subCache.set(key2, value);\n },\n get: function get(cache, key1, key2) {\n var subCache = cache.get(key1);\n return subCache ? subCache.get(key2) : undefined;\n },\n delete: function _delete(cache, key1, key2) {\n var subCache = cache.get(key1);\n subCache.delete(key2);\n }\n};\nvar _default = multiKeyStore;\nexports.default = _default;", "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n// Share the same values than in\n// https://github.com/cssinjs/jss/blob/master/packages/react-jss/src/ns.js\nvar ns = {\n jss: '64a55d578f856d258dc345b094a2a2b3',\n sheetsRegistry: 'd4bd0baacbc52bbd48bbb9eb24344ecd',\n sheetOptions: '6fc570d6bd61383819d0f9e7407c452d'\n};\nvar _default = ns;\nexports.default = _default;", "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar shadowKeyUmbraOpacity = 0.2;\nvar shadowKeyPenumbraOpacity = 0.14;\nvar shadowAmbientShadowOpacity = 0.12;\n\nfunction createShadow() {\n return [\"\".concat(arguments.length <= 0 ? undefined : arguments[0], \"px \").concat(arguments.length <= 1 ? undefined : arguments[1], \"px \").concat(arguments.length <= 2 ? undefined : arguments[2], \"px \").concat(arguments.length <= 3 ? undefined : arguments[3], \"px rgba(0,0,0,\").concat(shadowKeyUmbraOpacity, \")\"), \"\".concat(arguments.length <= 4 ? undefined : arguments[4], \"px \").concat(arguments.length <= 5 ? undefined : arguments[5], \"px \").concat(arguments.length <= 6 ? undefined : arguments[6], \"px \").concat(arguments.length <= 7 ? undefined : arguments[7], \"px rgba(0,0,0,\").concat(shadowKeyPenumbraOpacity, \")\"), \"\".concat(arguments.length <= 8 ? undefined : arguments[8], \"px \").concat(arguments.length <= 9 ? undefined : arguments[9], \"px \").concat(arguments.length <= 10 ? undefined : arguments[10], \"px \").concat(arguments.length <= 11 ? undefined : arguments[11], \"px rgba(0,0,0,\").concat(shadowAmbientShadowOpacity, \")\")].join(',');\n}\n\nvar shadows = ['none', createShadow(0, 1, 3, 0, 0, 1, 1, 0, 0, 2, 1, -1), createShadow(0, 1, 5, 0, 0, 2, 2, 0, 0, 3, 1, -2), createShadow(0, 1, 8, 0, 0, 3, 4, 0, 0, 3, 3, -2), createShadow(0, 2, 4, -1, 0, 4, 5, 0, 0, 1, 10, 0), createShadow(0, 3, 5, -1, 0, 5, 8, 0, 0, 1, 14, 0), createShadow(0, 3, 5, -1, 0, 6, 10, 0, 0, 1, 18, 0), createShadow(0, 4, 5, -2, 0, 7, 10, 1, 0, 2, 16, 1), createShadow(0, 5, 5, -3, 0, 8, 10, 1, 0, 3, 14, 2), createShadow(0, 5, 6, -3, 0, 9, 12, 1, 0, 3, 16, 2), createShadow(0, 6, 6, -3, 0, 10, 14, 1, 0, 4, 18, 3), createShadow(0, 6, 7, -4, 0, 11, 15, 1, 0, 4, 20, 3), createShadow(0, 7, 8, -4, 0, 12, 17, 2, 0, 5, 22, 4), createShadow(0, 7, 8, -4, 0, 13, 19, 2, 0, 5, 24, 4), createShadow(0, 7, 9, -4, 0, 14, 21, 2, 0, 5, 26, 4), createShadow(0, 8, 9, -5, 0, 15, 22, 2, 0, 6, 28, 5), createShadow(0, 8, 10, -5, 0, 16, 24, 2, 0, 6, 30, 5), createShadow(0, 8, 11, -5, 0, 17, 26, 2, 0, 6, 32, 5), createShadow(0, 9, 11, -5, 0, 18, 28, 2, 0, 7, 34, 6), createShadow(0, 9, 12, -6, 0, 19, 29, 2, 0, 7, 36, 6), createShadow(0, 10, 13, -6, 0, 20, 31, 3, 0, 8, 38, 7), createShadow(0, 10, 13, -6, 0, 21, 33, 3, 0, 8, 40, 7), createShadow(0, 10, 14, -6, 0, 22, 35, 3, 0, 8, 42, 7), createShadow(0, 11, 14, -7, 0, 23, 36, 3, 0, 9, 44, 8), createShadow(0, 11, 15, -7, 0, 24, 38, 3, 0, 9, 46, 8)];\nvar _default = shadows;\nexports.default = _default;", @@ -37357,32 +37879,114 @@ var _bundleJsMap = []byte(((((((((((((`{ "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar spacing = {\n // All components align to an 8dp square baseline grid for mobile, tablet, and desktop.\n // https://material.io/design/layout/understanding-layout.html#pixel-density\n unit: 8\n};\nvar _default = spacing;\nexports.default = _default;", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = exports.CHANNEL = void 0;\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/defineProperty\"));\n\n// Same value used by react-jss\nvar CHANNEL = '__THEMING__';\nexports.CHANNEL = CHANNEL;\nvar themeListener = {\n contextTypes: (0, _defineProperty2.default)({}, CHANNEL, function () {}),\n initial: function initial(context) {\n if (!context[CHANNEL]) {\n return null;\n }\n\n return context[CHANNEL].getState();\n },\n subscribe: function subscribe(context, cb) {\n if (!context[CHANNEL]) {\n return null;\n }\n\n return context[CHANNEL].subscribe(cb);\n },\n unsubscribe: function unsubscribe(context, subscriptionId) {\n if (context[CHANNEL]) {\n context[CHANNEL].unsubscribe(subscriptionId);\n }\n }\n};\nvar _default = themeListener;\nexports.default = _default;", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = exports.isNumber = exports.isString = exports.formatMs = exports.duration = exports.easing = void 0;\n\nvar _objectWithoutProperties2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectWithoutProperties\"));\n\nvar _warning = _interopRequireDefault(require(\"warning\"));\n\n/* eslint-disable no-restricted-globals */\n// Follow https://material.google.com/motion/duration-easing.html#duration-easing-natural-easing-curves\n// to learn the context in which each easing should be used.\nvar easing = {\n // This is the most common easing curve.\n easeInOut: 'cubic-bezier(0.4, 0, 0.2, 1)',\n // Objects enter the screen at full velocity from off-screen and\n // slowly decelerate to a resting point.\n easeOut: 'cubic-bezier(0.0, 0, 0.2, 1)',\n // Objects leave the screen at full velocity. They do not decelerate when off-screen.\n easeIn: 'cubic-bezier(0.4, 0, 1, 1)',\n // The sharp curve is used by objects that may return to the screen at any time.\n sharp: 'cubic-bezier(0.4, 0, 0.6, 1)'\n}; // Follow https://material.io/guidelines/motion/duration-easing.html#duration-easing-common-durations\n// to learn when use what timing\n\nexports.easing = easing;\nvar duration = {\n shortest: 150,\n shorter: 200,\n short: 250,\n // most basic recommended timing\n standard: 300,\n // this is to be used in complex animations\n complex: 375,\n // recommended when something is entering screen\n enteringScreen: 225,\n // recommended when something is leaving screen\n leavingScreen: 195\n};\nexports.duration = duration;\n\nvar formatMs = function formatMs(milliseconds) {\n return \"\".concat(Math.round(milliseconds), \"ms\");\n};\n\nexports.formatMs = formatMs;\n\nvar isString = function isString(value) {\n return typeof value === 'string';\n};\n\nexports.isString = isString;\n\nvar isNumber = function isNumber(value) {\n return !isNaN(parseFloat(value));\n};\n/**\r\n * @param {string|Array} props\r\n * @param {object} param\r\n * @param {string} param.prop\r\n * @param {number} param.duration\r\n * @param {string} param.easing\r\n * @param {number} param.delay\r\n */\n\n\nexports.isNumber = isNumber;\nvar _default = {\n easing: easing,\n duration: duration,\n create: function create() {\n var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ['all'];\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var _options$duration = options.duration,\n durationOption = _options$duration === void 0 ? duration.standard : _options$duration,\n _options$easing = options.easing,\n easingOption = _options$easing === void 0 ? easing.easeInOut : _options$easing,\n _options$delay = options.delay,\n delay = _options$delay === void 0 ? 0 : _options$delay,\n other = (0, _objectWithoutProperties2.default)(options, [\"duration\", \"easing\", \"delay\"]);\n process.env.NODE_ENV !== \"production\" ? (0, _warning.default)(isString(props) || Array.isArray(props), 'Material-UI: argument \"props\" must be a string or Array.') : void 0;\n process.env.NODE_ENV !== \"production\" ? (0, _warning.default)(isNumber(durationOption) || isString(durationOption), \"Material-UI: argument \\\"duration\\\" must be a number or a string but found \".concat(durationOption, \".\")) : void 0;\n process.env.NODE_ENV !== \"production\" ? (0, _warning.default)(isString(easingOption), 'Material-UI: argument \"easing\" must be a string.') : void 0;\n process.env.NODE_ENV !== \"production\" ? (0, _warning.default)(isNumber(delay) || isString(delay), 'Material-UI: argument \"delay\" must be a number or a string.') : void 0;\n process.env.NODE_ENV !== \"production\" ? (0, _warning.default)(Object.keys(other).length === 0, \"Material-UI: unrecognized argument(s) [\".concat(Object.keys(other).join(','), \"]\")) : void 0;\n return (Array.isArray(props) ? props : [props]).map(function (animatedProp) {\n return \"\".concat(animatedProp, \" \").concat(typeof durationOption === 'string' ? durationOption : formatMs(durationOption), \" \").concat(easingOption, \" \").concat(typeof delay === 'string' ? delay : formatMs(delay));\n }).join(',');\n },\n getAutoHeightDuration: function getAutoHeightDuration(height) {\n if (!height) {\n return 0;\n }\n\n var constant = height / 36; // https://www.wolframalpha.com/input/?i=(4+%2B+15+*+(x+%2F+36+)+**+0.25+%2B+(x+%2F+36)+%2F+5)+*+10\n\n return Math.round((4 + 15 * Math.pow(constant, 0.25) + constant / 5) * 10);\n }\n};\nexports.default = _default;", - "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = exports.sheetsManager = void 0;\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/defineProperty\"));\n\nvar _extends3 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/classCallCheck\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/createClass\"));\n\nvar _possibleConstructorReturn2 = _interopRequireDefault(require(\"@babel/runtime/helpers/possibleConstructorReturn\"));\n\nvar _getPrototypeOf2 = _interopRequireDefault(require(\"@babel/runtime/helpers/getPrototypeOf\"));\n\nvar _inherits2 = _interopRequireDefault(require(\"@babel/runtime/helpers/inherits\"));\n\nvar _objectWithoutProperties2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectWithoutProperties\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _warning = _interopRequireDefault(require(\"warning\"));\n\nvar _hoistNonReactStatics = _interopRequireDefault(require(\"hoist-non-react-statics\"));\n\nvar _utils = require(\"@material-ui/utils\");\n\nvar _jss = require(\"jss\");\n\nvar _reactJssContext = _interopRequireDefault(require(\"./reactJssContext\"));\n\nvar _jssPreset = _interopRequireDefault(require(\"./jssPreset\"));\n\nvar _mergeClasses = _interopRequireDefault(require(\"./mergeClasses\"));\n\nvar _multiKeyStore = _interopRequireDefault(require(\"./multiKeyStore\"));\n\nvar _createMuiTheme = _interopRequireDefault(require(\"./createMuiTheme\"));\n\nvar _themeListener = _interopRequireDefault(require(\"./themeListener\"));\n\nvar _createGenerateClassName = _interopRequireDefault(require(\"./createGenerateClassName\"));\n\nvar _getStylesCreator = _interopRequireDefault(require(\"./getStylesCreator\"));\n\nvar _getThemeProps = _interopRequireDefault(require(\"./getThemeProps\"));\n\n/* eslint-disable no-underscore-dangle */\n// Default JSS instance.\nvar jss = (0, _jss.create)((0, _jssPreset.default)()); // Use a singleton or the provided one by the context.\n//\n// The counter-based approach doesn't tolerate any mistake.\n// It's much safer to use the same counter everywhere.\n\nvar generateClassName = (0, _createGenerateClassName.default)(); // Global index counter to preserve source order.\n// We create the style sheet during at the creation of the component,\n// children are handled after the parents, so the order of style elements would be parent->child.\n// It is a problem though when a parent passes a className\n// which needs to override any child's styles.\n// StyleSheet of the child has a higher specificity, because of the source order.\n// So our solution is to render sheets them in the reverse order child->sheet, so\n// that parent has a higher specificity.\n\nvar indexCounter = -10e10; // Exported for test purposes\n\nvar sheetsManager = new Map(); // We use the same empty object to ref count the styles that don't need a theme object.\n\nexports.sheetsManager = sheetsManager;\nvar noopTheme = {}; // In order to have self-supporting components, we rely on default theme when not provided.\n\nvar defaultTheme = (0, _createMuiTheme.default)({\n typography: {\n suppressWarning: true\n }\n}); // Link a style sheet with a component.\n// It does not modify the component passed to it;\n// instead, it returns a new component, with a ` + ("`" + `classes`))))) + (((("`" + ` property.\n\nvar withStylesOld = function withStylesOld(stylesOrCreator) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n return function (Component) {\n var _extends2;\n\n var _options$withTheme = options.withTheme,\n withTheme = _options$withTheme === void 0 ? false : _options$withTheme,\n _options$flip = options.flip,\n flip = _options$flip === void 0 ? null : _options$flip,\n name = options.name,\n styleSheetOptions = (0, _objectWithoutProperties2.default)(options, [\"withTheme\", \"flip\", \"name\"]);\n var stylesCreator = (0, _getStylesCreator.default)(stylesOrCreator);\n var listenToTheme = stylesCreator.themingEnabled || typeof name === 'string' || withTheme;\n indexCounter += 1;\n stylesCreator.options.index = indexCounter;\n process.env.NODE_ENV !== \"production\" ? (0, _warning.default)(indexCounter < 0, ['Material-UI: you might have a memory leak.', 'The indexCounter is not supposed to grow that much.'].join('\\n')) : void 0;\n\n var WithStyles =\n /*#__PURE__*/\n function (_React$Component) {\n (0, _inherits2.default)(WithStyles, _React$Component);\n\n function WithStyles(props, context) {\n var _this;\n\n (0, _classCallCheck2.default)(this, WithStyles);\n _this = (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(WithStyles).call(this, props, context));\n _this.jss = context[_reactJssContext.default.jss] || jss;\n _this.sheetsManager = sheetsManager;\n _this.unsubscribeId = null;\n var muiThemeProviderOptions = context.muiThemeProviderOptions;\n\n if (muiThemeProviderOptions) {\n if (muiThemeProviderOptions.sheetsManager) {\n _this.sheetsManager = muiThemeProviderOptions.sheetsManager;\n }\n\n _this.sheetsCache = muiThemeProviderOptions.sheetsCache;\n _this.disableStylesGeneration = muiThemeProviderOptions.disableStylesGeneration;\n } // Attach the stylesCreator to the instance of the component as in the context\n // of react-hot-loader the hooks can be executed in a different closure context:\n // https://github.com/gaearon/react-hot-loader/blob/master/src/patch.dev.js#L107\n\n\n _this.stylesCreatorSaved = stylesCreator;\n _this.sheetOptions = (0, _extends3.default)({\n generateClassName: generateClassName\n }, context[_reactJssContext.default.sheetOptions]); // We use || as the function call is lazy evaluated.\n\n _this.theme = listenToTheme ? _themeListener.default.initial(context) || defaultTheme : noopTheme;\n\n _this.attach(_this.theme);\n\n _this.cacheClasses = {\n // Cache for the finalized classes value.\n value: null,\n // Cache for the last used classes prop pointer.\n lastProp: null,\n // Cache for the last used rendered classes pointer.\n lastJSS: {}\n };\n return _this;\n }\n\n (0, _createClass2.default)(WithStyles, [{\n key: \"componentDidMount\",\n value: function componentDidMount() {\n var _this2 = this;\n\n if (!listenToTheme) {\n return;\n }\n\n this.unsubscribeId = _themeListener.default.subscribe(this.context, function (theme) {\n var oldTheme = _this2.theme;\n _this2.theme = theme;\n\n _this2.attach(_this2.theme); // Rerender the component so the underlying component gets the theme update.\n // By theme update we mean receiving and applying the new class names.\n\n\n _this2.setState({}, function () {\n _this2.detach(oldTheme);\n });\n });\n }\n }, {\n key: \"componentDidUpdate\",\n value: function componentDidUpdate() {\n // react-hot-loader specific logic\n if (this.stylesCreatorSaved === stylesCreator || process.env.NODE_ENV === 'production') {\n return;\n }\n\n this.detach(this.theme);\n this.stylesCreatorSaved = stylesCreator;\n this.attach(this.theme);\n this.forceUpdate();\n }\n }, {\n key: \"componentWillUnmount\",\n value: function componentWillUnmount() {\n this.detach(this.theme);\n\n if (this.unsubscribeId !== null) {\n _themeListener.default.unsubscribe(this.context, this.unsubscribeId);\n }\n }\n }, {\n key: \"getClasses\",\n value: function getClasses() {\n if (this.disableStylesGeneration) {\n return this.props.classes || {};\n } // Tracks if either the rendered classes or classes prop has changed,\n // requiring the generation of a new finalized classes object.\n\n\n var generate = false;\n\n var sheetManager = _multiKeyStore.default.get(this.sheetsManager, this.stylesCreatorSaved, this.theme);\n\n if (sheetManager.sheet.classes !== this.cacheClasses.lastJSS) {\n this.cacheClasses.lastJSS = sheetManager.sheet.classes;\n generate = true;\n }\n\n if (this.props.classes !== this.cacheClasses.lastProp) {\n this.cacheClasses.lastProp = this.props.classes;\n generate = true;\n }\n\n if (generate) {\n this.cacheClasses.value = (0, _mergeClasses.default)({\n baseClasses: this.cacheClasses.lastJSS,\n newClasses: this.props.classes,\n Component: Component\n });\n }\n\n return this.cacheClasses.value;\n }\n }, {\n key: \"attach\",\n value: function attach(theme) {\n if (this.disableStylesGeneration) {\n return;\n }\n\n var stylesCreatorSaved = this.stylesCreatorSaved;\n\n var sheetManager = _multiKeyStore.default.get(this.sheetsManager, stylesCreatorSaved, theme);\n\n if (!sheetManager) {\n sheetManager = {\n refs: 0,\n sheet: null\n };\n\n _multiKeyStore.default.set(this.sheetsManager, stylesCreatorSaved, theme, sheetManager);\n }\n\n if (sheetManager.refs === 0) {\n var sheet;\n\n if (this.sheetsCache) {\n sheet = _multiKeyStore.default.get(this.sheetsCache, stylesCreatorSaved, theme);\n }\n\n if (!sheet) {\n sheet = this.createSheet(theme);\n sheet.attach();\n\n if (this.sheetsCache) {\n _multiKeyStore.default.set(this.sheetsCache, stylesCreatorSaved, theme, sheet);\n }\n }\n\n sheetManager.sheet = sheet;\n var sheetsRegistry = this.context[_reactJssContext.default.sheetsRegistry];\n\n if (sheetsRegistry) {\n sheetsRegistry.add(sheet);\n }\n }\n\n sheetManager.refs += 1;\n }\n }, {\n key: \"createSheet\",\n value: function createSheet(theme) {\n var styles = this.stylesCreatorSaved.create(theme, name);\n var meta = name;\n\n if (process.env.NODE_ENV !== 'production' && !meta) {\n // Provide a better DX outside production.\n meta = (0, _utils.getDisplayName)(Component);\n process.env.NODE_ENV !== \"production\" ? (0, _warning.default)(typeof meta === 'string', ['Material-UI: the component displayName is invalid. It needs to be a string.', \"Please fix the following component: \".concat(Component, \".\")].join('\\n')) : void 0;\n }\n\n var sheet = this.jss.createStyleSheet(styles, (0, _extends3.default)({\n meta: meta,\n classNamePrefix: meta,\n flip: typeof flip === 'boolean' ? flip : theme.direction === 'rtl',\n link: false\n }, this.sheetOptions, this.stylesCreatorSaved.options, {\n name: name || Component.displayName\n }, styleSheetOptions));\n return sheet;\n }\n }, {\n key: \"detach\",\n value: function detach(theme) {\n if (this.disableStylesGeneration) {\n return;\n }\n\n var sheetManager = _multiKeyStore.default.get(this.sheetsManager, this.stylesCreatorSaved, theme);\n\n sheetManager.refs -= 1;\n\n if (sheetManager.refs === 0) {\n _multiKeyStore.default.delete(this.sheetsManager, this.stylesCreatorSaved, theme);\n\n this.jss.removeStyleSheet(sheetManager.sheet);\n var sheetsRegistry = this.context[_reactJssContext.default.sheetsRegistry];\n\n if (sheetsRegistry) {\n sheetsRegistry.remove(sheetManager.sheet);\n }\n }\n }\n }, {\n key: \"render\",\n value: function render() {\n var _this$props = this.props,\n classes = _this$props.classes,\n innerRef = _this$props.innerRef,\n other = (0, _objectWithoutProperties2.default)(_this$props, [\"classes\", \"innerRef\"]);\n var more = (0, _getThemeProps.default)({\n theme: this.theme,\n name: name,\n props: other\n }); // Provide the theme to the wrapped component.\n // So we don't have to use the `) + ("`" + (`withTheme()` + "`"))) + ((` Higher-order Component.\n\n if (withTheme && !more.theme) {\n more.theme = this.theme;\n }\n\n return _react.default.createElement(Component, (0, _extends3.default)({}, more, {\n classes: this.getClasses(),\n ref: innerRef\n }));\n }\n }]);\n return WithStyles;\n }(_react.default.Component);\n\n process.env.NODE_ENV !== \"production\" ? WithStyles.propTypes = {\n /**\r\n * Override or extend the styles applied to the component.\r\n */\n classes: _propTypes.default.object,\n\n /**\r\n * Use that property to pass a ref callback to the decorated component.\r\n */\n innerRef: _propTypes.default.oneOfType([_propTypes.default.func, _propTypes.default.object])\n } : void 0;\n WithStyles.contextTypes = (0, _extends3.default)((_extends2 = {\n muiThemeProviderOptions: _propTypes.default.object\n }, (0, _defineProperty2.default)(_extends2, _reactJssContext.default.jss, _propTypes.default.object), (0, _defineProperty2.default)(_extends2, _reactJssContext.default.sheetOptions, _propTypes.default.object), (0, _defineProperty2.default)(_extends2, _reactJssContext.default.sheetsRegistry, _propTypes.default.object), _extends2), listenToTheme ? _themeListener.default.contextTypes : {});\n\n if (process.env.NODE_ENV !== 'production') {\n WithStyles.displayName = \"WithStyles(\".concat((0, _utils.getDisplayName)(Component), \")\");\n }\n\n (0, _hoistNonReactStatics.default)(WithStyles, Component);\n\n if (process.env.NODE_ENV !== 'production') {\n // Exposed for test purposes.\n WithStyles.Naked = Component;\n WithStyles.options = options;\n }\n\n return WithStyles;\n };\n};\n/* istanbul ignore if */\n\n\nif (!_utils.ponyfillGlobal.__MUI_STYLES__) {\n _utils.ponyfillGlobal.__MUI_STYLES__ = {};\n}\n\nif (!_utils.ponyfillGlobal.__MUI_STYLES__.withStyles) {\n _utils.ponyfillGlobal.__MUI_STYLES__.withStyles = withStylesOld;\n}\n\nvar _default = function _default(styles, options) {\n return _utils.ponyfillGlobal.__MUI_STYLES__.withStyles(styles, (0, _extends3.default)({\n defaultTheme: defaultTheme\n }, options));\n};\n\nexports.default = _default;", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = exports.sheetsManager = void 0;\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/defineProperty\"));\n\nvar _extends3 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/classCallCheck\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/createClass\"));\n\nvar _possibleConstructorReturn2 = _interopRequireDefault(require(\"@babel/runtime/helpers/possibleConstructorReturn\"));\n\nvar _getPrototypeOf2 = _interopRequireDefault(require(\"@babel/runtime/helpers/getPrototypeOf\"));\n\nvar _inherits2 = _interopRequireDefault(require(\"@babel/runtime/helpers/inherits\"));\n\nvar _objectWithoutProperties2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectWithoutProperties\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _warning = _interopRequireDefault(require(\"warning\"));\n\nvar _hoistNonReactStatics = _interopRequireDefault(require(\"hoist-non-react-statics\"));\n\nvar _utils = require(\"@material-ui/utils\");\n\nvar _jss = require(\"jss\");\n\nvar _reactJssContext = _interopRequireDefault(require(\"./reactJssContext\"));\n\nvar _jssPreset = _interopRequireDefault(require(\"./jssPreset\"));\n\nvar _mergeClasses = _interopRequireDefault(require(\"./mergeClasses\"));\n\nvar _multiKeyStore = _interopRequireDefault(require(\"./multiKeyStore\"));\n\nvar _createMuiTheme = _interopRequireDefault(require(\"./createMuiTheme\"));\n\nvar _themeListener = _interopRequireDefault(require(\"./themeListener\"));\n\nvar _createGenerateClassName = _interopRequireDefault(require(\"./createGenerateClassName\"));\n\nvar _getStylesCreator = _interopRequireDefault(require(\"./getStylesCreator\"));\n\nvar _getThemeProps = _interopRequireDefault(require(\"./getThemeProps\"));\n\n/* eslint-disable no-underscore-dangle */\n// Default JSS instance.\nvar jss = (0, _jss.create)((0, _jssPreset.default)()); // Use a singleton or the provided one by the context.\n//\n// The counter-based approach doesn't tolerate any mistake.\n// It's much safer to use the same counter everywhere.\n\nvar generateClassName = (0, _createGenerateClassName.default)(); // Global index counter to preserve source order.\n// We create the style sheet during at the creation of the component,\n// children are handled after the parents, so the order of style elements would be parent->child.\n// It is a problem though when a parent passes a className\n// which needs to override any child's styles.\n// StyleSheet of the child has a higher specificity, because of the source order.\n// So our solution is to render sheets them in the reverse order child->sheet, so\n// that parent has a higher specificity.\n\nvar indexCounter = -10e10; // Exported for test purposes\n\nvar sheetsManager = new Map(); // We use the same empty object to ref count the styles that don't need a theme object.\n\nexports.sheetsManager = sheetsManager;\nvar noopTheme = {}; // In order to have self-supporting components, we rely on default theme when not provided.\n\nvar defaultTheme = (0, _createMuiTheme.default)({\n typography: {\n suppressWarning: true\n }\n}); // Link a style sheet with a component.\n// It does not modify the component passed to it;\n// instead, it returns a new component, with a `))))))))))) + (((((((((("`" + (`classes` + "`")) + (` property.\n\nvar withStylesOld = function withStylesOld(stylesOrCreator) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n return function (Component) {\n var _extends2;\n\n var _options$withTheme = options.withTheme,\n withTheme = _options$withTheme === void 0 ? false : _options$withTheme,\n _options$flip = options.flip,\n flip = _options$flip === void 0 ? null : _options$flip,\n name = options.name,\n styleSheetOptions = (0, _objectWithoutProperties2.default)(options, [\"withTheme\", \"flip\", \"name\"]);\n var stylesCreator = (0, _getStylesCreator.default)(stylesOrCreator);\n var listenToTheme = stylesCreator.themingEnabled || typeof name === 'string' || withTheme;\n indexCounter += 1;\n stylesCreator.options.index = indexCounter;\n process.env.NODE_ENV !== \"production\" ? (0, _warning.default)(indexCounter < 0, ['Material-UI: you might have a memory leak.', 'The indexCounter is not supposed to grow that much.'].join('\\n')) : void 0;\n\n var WithStyles =\n /*#__PURE__*/\n function (_React$Component) {\n (0, _inherits2.default)(WithStyles, _React$Component);\n\n function WithStyles(props, context) {\n var _this;\n\n (0, _classCallCheck2.default)(this, WithStyles);\n _this = (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(WithStyles).call(this, props, context));\n _this.jss = context[_reactJssContext.default.jss] || jss;\n _this.sheetsManager = sheetsManager;\n _this.unsubscribeId = null;\n var muiThemeProviderOptions = context.muiThemeProviderOptions;\n\n if (muiThemeProviderOptions) {\n if (muiThemeProviderOptions.sheetsManager) {\n _this.sheetsManager = muiThemeProviderOptions.sheetsManager;\n }\n\n _this.sheetsCache = muiThemeProviderOptions.sheetsCache;\n _this.disableStylesGeneration = muiThemeProviderOptions.disableStylesGeneration;\n } // Attach the stylesCreator to the instance of the component as in the context\n // of react-hot-loader the hooks can be executed in a different closure context:\n // https://github.com/gaearon/react-hot-loader/blob/master/src/patch.dev.js#L107\n\n\n _this.stylesCreatorSaved = stylesCreator;\n _this.sheetOptions = (0, _extends3.default)({\n generateClassName: generateClassName\n }, context[_reactJssContext.default.sheetOptions]); // We use || as the function call is lazy evaluated.\n\n _this.theme = listenToTheme ? _themeListener.default.initial(context) || defaultTheme : noopTheme;\n\n _this.attach(_this.theme);\n\n _this.cacheClasses = {\n // Cache for the finalized classes value.\n value: null,\n // Cache for the last used classes prop pointer.\n lastProp: null,\n // Cache for the last used rendered classes pointer.\n lastJSS: {}\n };\n return _this;\n }\n\n (0, _createClass2.default)(WithStyles, [{\n key: \"componentDidMount\",\n value: function componentDidMount() {\n var _this2 = this;\n\n if (!listenToTheme) {\n return;\n }\n\n this.unsubscribeId = _themeListener.default.subscribe(this.context, function (theme) {\n var oldTheme = _this2.theme;\n _this2.theme = theme;\n\n _this2.attach(_this2.theme); // Rerender the component so the underlying component gets the theme update.\n // By theme update we mean receiving and applying the new class names.\n\n\n _this2.setState({}, function () {\n _this2.detach(oldTheme);\n });\n });\n }\n }, {\n key: \"componentDidUpdate\",\n value: function componentDidUpdate() {\n // react-hot-loader specific logic\n if (this.stylesCreatorSaved === stylesCreator || process.env.NODE_ENV === 'production') {\n return;\n }\n\n this.detach(this.theme);\n this.stylesCreatorSaved = stylesCreator;\n this.attach(this.theme);\n this.forceUpdate();\n }\n }, {\n key: \"componentWillUnmount\",\n value: function componentWillUnmount() {\n this.detach(this.theme);\n\n if (this.unsubscribeId !== null) {\n _themeListener.default.unsubscribe(this.context, this.unsubscribeId);\n }\n }\n }, {\n key: \"getClasses\",\n value: function getClasses() {\n if (this.disableStylesGeneration) {\n return this.props.classes || {};\n } // Tracks if either the rendered classes or classes prop has changed,\n // requiring the generation of a new finalized classes object.\n\n\n var generate = false;\n\n var sheetManager = _multiKeyStore.default.get(this.sheetsManager, this.stylesCreatorSaved, this.theme);\n\n if (sheetManager.sheet.classes !== this.cacheClasses.lastJSS) {\n this.cacheClasses.lastJSS = sheetManager.sheet.classes;\n generate = true;\n }\n\n if (this.props.classes !== this.cacheClasses.lastProp) {\n this.cacheClasses.lastProp = this.props.classes;\n generate = true;\n }\n\n if (generate) {\n this.cacheClasses.value = (0, _mergeClasses.default)({\n baseClasses: this.cacheClasses.lastJSS,\n newClasses: this.props.classes,\n Component: Component\n });\n }\n\n return this.cacheClasses.value;\n }\n }, {\n key: \"attach\",\n value: function attach(theme) {\n if (this.disableStylesGeneration) {\n return;\n }\n\n var stylesCreatorSaved = this.stylesCreatorSaved;\n\n var sheetManager = _multiKeyStore.default.get(this.sheetsManager, stylesCreatorSaved, theme);\n\n if (!sheetManager) {\n sheetManager = {\n refs: 0,\n sheet: null\n };\n\n _multiKeyStore.default.set(this.sheetsManager, stylesCreatorSaved, theme, sheetManager);\n }\n\n if (sheetManager.refs === 0) {\n var sheet;\n\n if (this.sheetsCache) {\n sheet = _multiKeyStore.default.get(this.sheetsCache, stylesCreatorSaved, theme);\n }\n\n if (!sheet) {\n sheet = this.createSheet(theme);\n sheet.attach();\n\n if (this.sheetsCache) {\n _multiKeyStore.default.set(this.sheetsCache, stylesCreatorSaved, theme, sheet);\n }\n }\n\n sheetManager.sheet = sheet;\n var sheetsRegistry = this.context[_reactJssContext.default.sheetsRegistry];\n\n if (sheetsRegistry) {\n sheetsRegistry.add(sheet);\n }\n }\n\n sheetManager.refs += 1;\n }\n }, {\n key: \"createSheet\",\n value: function createSheet(theme) {\n var styles = this.stylesCreatorSaved.create(theme, name);\n var meta = name;\n\n if (process.env.NODE_ENV !== 'production' && !meta) {\n // Provide a better DX outside production.\n meta = (0, _utils.getDisplayName)(Component);\n process.env.NODE_ENV !== \"production\" ? (0, _warning.default)(typeof meta === 'string', ['Material-UI: the component displayName is invalid. It needs to be a string.', \"Please fix the following component: \".concat(Component, \".\")].join('\\n')) : void 0;\n }\n\n var sheet = this.jss.createStyleSheet(styles, (0, _extends3.default)({\n meta: meta,\n classNamePrefix: meta,\n flip: typeof flip === 'boolean' ? flip : theme.direction === 'rtl',\n link: false\n }, this.sheetOptions, this.stylesCreatorSaved.options, {\n name: name || Component.displayName\n }, styleSheetOptions));\n return sheet;\n }\n }, {\n key: \"detach\",\n value: function detach(theme) {\n if (this.disableStylesGeneration) {\n return;\n }\n\n var sheetManager = _multiKeyStore.default.get(this.sheetsManager, this.stylesCreatorSaved, theme);\n\n sheetManager.refs -= 1;\n\n if (sheetManager.refs === 0) {\n _multiKeyStore.default.delete(this.sheetsManager, this.stylesCreatorSaved, theme);\n\n this.jss.removeStyleSheet(sheetManager.sheet);\n var sheetsRegistry = this.context[_reactJssContext.default.sheetsRegistry];\n\n if (sheetsRegistry) {\n sheetsRegistry.remove(sheetManager.sheet);\n }\n }\n }\n }, {\n key: \"render\",\n value: function render() {\n var _this$props = this.props,\n classes = _this$props.classes,\n innerRef = _this$props.innerRef,\n other = (0, _objectWithoutProperties2.default)(_this$props, [\"classes\", \"innerRef\"]);\n var more = (0, _getThemeProps.default)({\n theme: this.theme,\n name: name,\n props: other\n }); // Provide the theme to the wrapped component.\n // So we don't have to use the ` + ("`" + `withTheme()`))) + (("`" + (` Higher-order Component.\n\n if (withTheme && !more.theme) {\n more.theme = this.theme;\n }\n\n return _react.default.createElement(Component, (0, _extends3.default)({}, more, {\n classes: this.getClasses(),\n ref: innerRef\n }));\n }\n }]);\n return WithStyles;\n }(_react.default.Component);\n\n process.env.NODE_ENV !== \"production\" ? WithStyles.propTypes = {\n /**\r\n * Override or extend the styles applied to the component.\r\n */\n classes: _propTypes.default.object,\n\n /**\r\n * Use that property to pass a ref callback to the decorated component.\r\n */\n innerRef: _propTypes.default.oneOfType([_propTypes.default.func, _propTypes.default.object])\n } : void 0;\n WithStyles.contextTypes = (0, _extends3.default)((_extends2 = {\n muiThemeProviderOptions: _propTypes.default.object\n }, (0, _defineProperty2.default)(_extends2, _reactJssContext.default.jss, _propTypes.default.object), (0, _defineProperty2.default)(_extends2, _reactJssContext.default.sheetOptions, _propTypes.default.object), (0, _defineProperty2.default)(_extends2, _reactJssContext.default.sheetsRegistry, _propTypes.default.object), _extends2), listenToTheme ? _themeListener.default.contextTypes : {});\n\n if (process.env.NODE_ENV !== 'production') {\n WithStyles.displayName = \"WithStyles(\".concat((0, _utils.getDisplayName)(Component), \")\");\n }\n\n (0, _hoistNonReactStatics.default)(WithStyles, Component);\n\n if (process.env.NODE_ENV !== 'production') {\n // Exposed for test purposes.\n WithStyles.Naked = Component;\n WithStyles.options = options;\n }\n\n return WithStyles;\n };\n};\n/* istanbul ignore if */\n\n\nif (!_utils.ponyfillGlobal.__MUI_STYLES__) {\n _utils.ponyfillGlobal.__MUI_STYLES__ = {};\n}\n\nif (!_utils.ponyfillGlobal.__MUI_STYLES__.withStyles) {\n _utils.ponyfillGlobal.__MUI_STYLES__.withStyles = withStylesOld;\n}\n\nvar _default = function _default(styles, options) {\n return _utils.ponyfillGlobal.__MUI_STYLES__.withStyles(styles, (0, _extends3.default)({\n defaultTheme: defaultTheme\n }, options));\n};\n\nexports.default = _default;", "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n// We need to centralize the zIndex definitions as they work\n// like global values in the browser.\nvar zIndex = {\n mobileStepper: 1000,\n appBar: 1100,\n drawer: 1200,\n modal: 1300,\n snackbar: 1400,\n tooltip: 1500\n};\nvar _default = zIndex;\nexports.default = _default;", - "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nfunction deprecatedPropType(validator, reason) {\n /* istanbul ignore if */\n if (process.env.NODE_ENV === 'production') {\n return function () {\n return null;\n };\n }\n\n return function (props, propName, componentName, location, propFullName) {\n var componentNameSafe = componentName || '<>';\n var propFullNameSafe = propFullName || propName;\n\n if (typeof props[propName] !== 'undefined') {\n return new Error(\"The \".concat(location, \" ` + ("`" + `\").concat(propFullNameSafe, \"`)) + ("`" + (` of \") + \"` + "`")))) + (((`\".concat(componentNameSafe, \"` + ("`" + ` is deprecated. \").concat(reason));\n }\n\n return null;\n };\n}\n\nvar _default = deprecatedPropType;\nexports.default = _default;", - "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.capitalize = capitalize;\nexports.contains = contains;\nexports.findIndex = findIndex;\nexports.find = find;\nexports.createChainedFunction = createChainedFunction;\n\nvar _typeof2 = _interopRequireDefault(require(\"@babel/runtime/helpers/typeof\"));\n\nvar _warning = _interopRequireDefault(require(\"warning\"));\n\n// It should to be noted that this function isn't equivalent to `)) + ("`" + (`text-transform: capitalize` + "`"))) + ((`.\n//\n// A strict capitalization should uppercase the first letter of each word a the sentence.\n// We only handle the first word.\nfunction capitalize(string) {\n if (process.env.NODE_ENV !== 'production' && typeof string !== 'string') {\n throw new Error('Material-UI: capitalize(string) expects a string argument.');\n }\n\n return string.charAt(0).toUpperCase() + string.slice(1);\n}\n\nfunction contains(obj, pred) {\n return Object.keys(pred).every(function (key) {\n return obj.hasOwnProperty(key) && obj[key] === pred[key];\n });\n}\n\nfunction findIndex(arr, pred) {\n var predType = (0, _typeof2.default)(pred);\n\n for (var i = 0; i < arr.length; i += 1) {\n if (predType === 'function' && !!pred(arr[i], i, arr) === true) {\n return i;\n }\n\n if (predType === 'object' && contains(arr[i], pred)) {\n return i;\n }\n\n if (['string', 'number', 'boolean'].indexOf(predType) !== -1) {\n return arr.indexOf(pred);\n }\n }\n\n return -1;\n}\n\nfunction find(arr, pred) {\n var index = findIndex(arr, pred);\n return index > -1 ? arr[index] : undefined;\n}\n/**\r\n * Safe chained function\r\n *\r\n * Will only create a new function if needed,\r\n * otherwise will pass back existing functions or null.\r\n *\r\n * @param {function} functions to chain\r\n * @returns {function|null}\r\n */\n\n\nfunction createChainedFunction() {\n for (var _len = arguments.length, funcs = new Array(_len), _key = 0; _key < _len; _key++) {\n funcs[_key] = arguments[_key];\n }\n\n return funcs.reduce(function (acc, func) {\n if (func == null) {\n return acc;\n }\n\n process.env.NODE_ENV !== \"production\" ? (0, _warning.default)(typeof func === 'function', 'Material-UI: invalid Argument Type, must only provide functions, undefined, or null.') : void 0;\n return function chainedFunction() {\n for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n\n acc.apply(this, args);\n func.apply(this, args);\n };\n }, function () {});\n}", + "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nfunction deprecatedPropType(validator, reason) {\n /* istanbul ignore if */\n if (process.env.NODE_ENV === 'production') {\n return function () {\n return null;\n };\n }\n\n return function (props, propName, componentName, location, propFullName) {\n var componentNameSafe = componentName || '<>';\n var propFullNameSafe = propFullName || propName;\n\n if (typeof props[propName] !== 'undefined') {\n return new Error(\"The \".concat(location, \" ` + "`")) + (`\").concat(propFullNameSafe, \"` + ("`" + ` of \") + \"`)))) + ((("`" + (`\".concat(componentNameSafe, \"` + "`")) + (` is deprecated. \").concat(reason));\n }\n\n return null;\n };\n}\n\nvar _default = deprecatedPropType;\nexports.default = _default;", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.capitalize = capitalize;\nexports.contains = contains;\nexports.findIndex = findIndex;\nexports.find = find;\nexports.createChainedFunction = createChainedFunction;\n\nvar _typeof2 = _interopRequireDefault(require(\"@babel/runtime/helpers/typeof\"));\n\nvar _warning = _interopRequireDefault(require(\"warning\"));\n\n// It should to be noted that this function isn't equivalent to ` + ("`" + `text-transform: capitalize`))) + (("`" + (`.\n//\n// A strict capitalization should uppercase the first letter of each word a the sentence.\n// We only handle the first word.\nfunction capitalize(string) {\n if (process.env.NODE_ENV !== 'production' && typeof string !== 'string') {\n throw new Error('Material-UI: capitalize(string) expects a string argument.');\n }\n\n return string.charAt(0).toUpperCase() + string.slice(1);\n}\n\nfunction contains(obj, pred) {\n return Object.keys(pred).every(function (key) {\n return obj.hasOwnProperty(key) && obj[key] === pred[key];\n });\n}\n\nfunction findIndex(arr, pred) {\n var predType = (0, _typeof2.default)(pred);\n\n for (var i = 0; i < arr.length; i += 1) {\n if (predType === 'function' && !!pred(arr[i], i, arr) === true) {\n return i;\n }\n\n if (predType === 'object' && contains(arr[i], pred)) {\n return i;\n }\n\n if (['string', 'number', 'boolean'].indexOf(predType) !== -1) {\n return arr.indexOf(pred);\n }\n }\n\n return -1;\n}\n\nfunction find(arr, pred) {\n var index = findIndex(arr, pred);\n return index > -1 ? arr[index] : undefined;\n}\n/**\r\n * Safe chained function\r\n *\r\n * Will only create a new function if needed,\r\n * otherwise will pass back existing functions or null.\r\n *\r\n * @param {function} functions to chain\r\n * @returns {function|null}\r\n */\n\n\nfunction createChainedFunction() {\n for (var _len = arguments.length, funcs = new Array(_len), _key = 0; _key < _len; _key++) {\n funcs[_key] = arguments[_key];\n }\n\n return funcs.reduce(function (acc, func) {\n if (func == null) {\n return acc;\n }\n\n process.env.NODE_ENV !== \"production\" ? (0, _warning.default)(typeof func === 'function', 'Material-UI: invalid Argument Type, must only provide functions, undefined, or null.') : void 0;\n return function chainedFunction() {\n for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n\n acc.apply(this, args);\n func.apply(this, args);\n };\n }, function () {});\n}", "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nfunction ownerDocument(node) {\n return node && node.ownerDocument || document;\n}\n\nvar _default = ownerDocument;\nexports.default = _default;", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _ownerDocument = _interopRequireDefault(require(\"./ownerDocument\"));\n\nfunction ownerWindow(node) {\n var fallback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : window;\n var doc = (0, _ownerDocument.default)(node);\n return doc.defaultView || doc.parentView || fallback;\n}\n\nvar _default = ownerWindow;\nexports.default = _default;", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.cloneElementWithClassName = cloneElementWithClassName;\nexports.cloneChildrenWithClassName = cloneChildrenWithClassName;\nexports.isMuiElement = isMuiElement;\nexports.setRef = setRef;\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _classnames = _interopRequireDefault(require(\"classnames\"));\n\nfunction cloneElementWithClassName(child, className) {\n return _react.default.cloneElement(child, {\n className: (0, _classnames.default)(child.props.className, className)\n });\n}\n\nfunction cloneChildrenWithClassName(children, className) {\n return _react.default.Children.map(children, function (child) {\n return _react.default.isValidElement(child) && cloneElementWithClassName(child, className);\n });\n}\n\nfunction isMuiElement(element, muiNames) {\n return _react.default.isValidElement(element) && muiNames.indexOf(element.type.muiName) !== -1;\n}\n\nfunction setRef(ref, value) {\n if (typeof ref === 'function') {\n ref(value);\n } else if (ref) {\n ref.current = value;\n }\n}", - "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nfunction requirePropFactory(componentNameInError) {\n /* istanbul ignore if */\n if (process.env.NODE_ENV === 'production') {\n return function () {\n return null;\n };\n }\n\n var requireProp = function requireProp(requiredProp) {\n return function (props, propName, componentName, location, propFullName) {\n var propFullNameSafe = propFullName || propName;\n\n if (typeof props[propName] !== 'undefined' && !props[requiredProp]) {\n return new Error(\"The property ` + ("`" + `\".concat(propFullNameSafe, \"`)) + ("`" + (` of \") + \"` + "`")))))))) + (((((((`\".concat(componentNameInError, \"` + "`") + (` must be used on ` + ("`" + `\").concat(requiredProp, \"`))) + (("`" + (`.\"));\n }\n\n return null;\n };\n };\n\n return requireProp;\n}\n\nvar _default = requirePropFactory;\nexports.default = _default;", + "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nfunction requirePropFactory(componentNameInError) {\n /* istanbul ignore if */\n if (process.env.NODE_ENV === 'production') {\n return function () {\n return null;\n };\n }\n\n var requireProp = function requireProp(requiredProp) {\n return function (props, propName, componentName, location, propFullName) {\n var propFullNameSafe = propFullName || propName;\n\n if (typeof props[propName] !== 'undefined' && !props[requiredProp]) {\n return new Error(\"The property ` + "`")) + (`\".concat(propFullNameSafe, \"` + ("`" + ` of \") + \"`))))) + (((("`" + (`\".concat(componentNameInError, \"` + "`")) + (` must be used on ` + ("`" + `\").concat(requiredProp, \"`))) + (("`" + (`.\"));\n }\n\n return null;\n };\n };\n\n return requireProp;\n}\n\nvar _default = requirePropFactory;\nexports.default = _default;", "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nfunction chainPropTypes(propType1, propType2) {\n /* istanbul ignore if */\n if (process.env.NODE_ENV === 'production') {\n return function () {\n return null;\n };\n }\n\n return function validate() {\n return propType1.apply(void 0, arguments) || propType2.apply(void 0, arguments);\n };\n}\n\nvar _default = chainPropTypes;\nexports.default = _default;", - "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _typeof2 = _interopRequireDefault(require(\"@babel/runtime/helpers/typeof\"));\n\nvar _reactIs = require(\"react-is\");\n\n/**\n * A factory that returns a propTypes validator that only accepts values that\n * are also accepted by React.createElement\n * e.g. \"div\", functional, class components, forwardRef etc.\n *\n * @param {boolean} isRequired If ` + "`")) + (`true` + ("`" + ` returns a validator\n * that will throw if nullish values are passed\n */\nfunction createComponentProp(isRequired) {\n /* istanbul ignore if */\n if (process.env.NODE_ENV === 'production') {\n return function () {\n return null;\n };\n }\n\n return function componentPropType(props, key, componentName, location, propFullName) {\n var prop = props[key];\n var propName = propFullName || key;\n var message;\n\n if (prop == null) {\n if (isRequired) {\n message = \"The \".concat(location, \" `)))) + ((("`" + `\").concat(propName, \"`) + ("`" + (` is marked as required in ` + "`"))) + ((`\").concat(componentName, \"` + ("`" + `, \") + \"but its value is `)) + ("`" + (`\".concat((0, _typeof2.default)(prop), \"` + "`"))))) + ((((`.\");\n }\n } else if (!(0, _reactIs.isValidElementType)(prop)) {\n var preciseType = (0, _typeof2.default)(prop);\n message = \"Invalid \".concat(location, \" ` + "`") + (`\").concat(propName, \"` + ("`" + ` of type `))) + (("`" + (`\").concat(preciseType, \"` + "`")) + (` \") + \"supplied to ` + ("`" + `\".concat(componentName, \"`)))) + ((("`" + `, expected a component.\");\n }\n\n if (message != null) {\n // change error message slightly on every check to prevent caching when testing\n // which would not trigger console errors on subsequent fails\n return new Error(\"\".concat(message).concat(process.env.NODE_ENV === 'test' ? Date.now() : ''));\n }\n\n return null;\n };\n}\n\nvar componentPropType = createComponentProp(false);\ncomponentPropType.isRequired = createComponentProp(true);\nvar _default = componentPropType;\nexports.default = _default;", - "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = exports.specialProperty = void 0;\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/defineProperty\"));\n\nvar _extends3 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\n// This module is based on https://github.com/airbnb/prop-types-exact repository.\n// However, in order to reduce the number of dependencies and to remove some extra safe checks\n// the module was forked.\n// Only exported for test purposes.\nvar specialProperty = \"exact-prop: \\u200B\";\nexports.specialProperty = specialProperty;\n\nfunction exactProp(propTypes) {\n /* istanbul ignore if */\n if (process.env.NODE_ENV === 'production') {\n return propTypes;\n }\n\n return (0, _extends3.default)({}, propTypes, (0, _defineProperty2.default)({}, specialProperty, function (props) {\n var unsupportedProps = Object.keys(props).filter(function (prop) {\n return !propTypes.hasOwnProperty(prop);\n });\n\n if (unsupportedProps.length > 0) {\n return new Error(\"The following properties are not supported: \".concat(unsupportedProps.map(function (prop) {\n return \"`) + ("`" + (`\".concat(prop, \"` + "`"))) + ((`\");\n }).join(', '), \". Please remove them.\"));\n }\n\n return null;\n }));\n}\n\nvar _default = exactProp;\nexports.default = _default;", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _typeof2 = _interopRequireDefault(require(\"@babel/runtime/helpers/typeof\"));\n\nvar _reactIs = require(\"react-is\");\n\n/**\n * A factory that returns a propTypes validator that only accepts values that\n * are also accepted by React.createElement\n * e.g. \"div\", functional, class components, forwardRef etc.\n *\n * @param {boolean} isRequired If ` + "`")) + (`true` + ("`" + ` returns a validator\n * that will throw if nullish values are passed\n */\nfunction createComponentProp(isRequired) {\n /* istanbul ignore if */\n if (process.env.NODE_ENV === 'production') {\n return function () {\n return null;\n };\n }\n\n return function componentPropType(props, key, componentName, location, propFullName) {\n var prop = props[key];\n var propName = propFullName || key;\n var message;\n\n if (prop == null) {\n if (isRequired) {\n message = \"The \".concat(location, \" `)))) + ((("`" + (`\").concat(propName, \"` + "`")) + (` is marked as required in ` + ("`" + `\").concat(componentName, \"`))) + (("`" + (`, \") + \"but its value is ` + "`")) + ((`\".concat((0, _typeof2.default)(prop), \"` + "`") + (`.\");\n }\n } else if (!(0, _reactIs.isValidElementType)(prop)) {\n var preciseType = (0, _typeof2.default)(prop);\n message = \"Invalid \".concat(location, \" ` + "`")))))) + (((((`\").concat(propName, \"` + ("`" + ` of type `)) + ("`" + (`\").concat(preciseType, \"` + "`"))) + ((` \") + \"supplied to ` + ("`" + `\".concat(componentName, \"`)) + ("`" + (`, expected a component.\");\n }\n\n if (message != null) {\n // change error message slightly on every check to prevent caching when testing\n // which would not trigger console errors on subsequent fails\n return new Error(\"\".concat(message).concat(process.env.NODE_ENV === 'test' ? Date.now() : ''));\n }\n\n return null;\n };\n}\n\nvar componentPropType = createComponentProp(false);\ncomponentPropType.isRequired = createComponentProp(true);\nvar _default = componentPropType;\nexports.default = _default;", + "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = exports.specialProperty = void 0;\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/defineProperty\"));\n\nvar _extends3 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\n// This module is based on https://github.com/airbnb/prop-types-exact repository.\n// However, in order to reduce the number of dependencies and to remove some extra safe checks\n// the module was forked.\n// Only exported for test purposes.\nvar specialProperty = \"exact-prop: \\u200B\";\nexports.specialProperty = specialProperty;\n\nfunction exactProp(propTypes) {\n /* istanbul ignore if */\n if (process.env.NODE_ENV === 'production') {\n return propTypes;\n }\n\n return (0, _extends3.default)({}, propTypes, (0, _defineProperty2.default)({}, specialProperty, function (props) {\n var unsupportedProps = Object.keys(props).filter(function (prop) {\n return !propTypes.hasOwnProperty(prop);\n });\n\n if (unsupportedProps.length > 0) {\n return new Error(\"The following properties are not supported: \".concat(unsupportedProps.map(function (prop) {\n return \"` + "`")))) + (((`\".concat(prop, \"` + ("`" + `\");\n }).join(', '), \". Please remove them.\"));\n }\n\n return null;\n }));\n}\n\nvar _default = exactProp;\nexports.default = _default;", "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.getFunctionName = getFunctionName;\nexports.default = void 0;\n// Fork of recompose/getDisplayName with added IE 11 support\n// Simplified polyfill for IE 11 support\n// https://github.com/JamesMGreene/Function.name/blob/58b314d4a983110c3682f1228f845d39ccca1817/Function.name.js#L3\nvar fnNameMatchRegex = /^\\s*function(?:\\s|\\s*\\/\\*.*\\*\\/\\s*)+([^(\\s/]*)\\s*/;\n\nfunction getFunctionName(fn) {\n var match = \"\".concat(fn).match(fnNameMatchRegex);\n var name = match && match[1];\n return name || '';\n}\n\nfunction getDisplayName(Component) {\n if (typeof Component === 'string') {\n return Component;\n }\n\n if (!Component) {\n return undefined;\n }\n\n return Component.displayName || Component.name || getFunctionName(Component) || 'Component';\n}\n\nvar _default = getDisplayName;\nexports.default = _default;", "/** @license Material-UI v3.0.0-alpha.3\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nexport { default as componentPropType } from './componentPropType';\nexport { default as chainPropTypes } from './chainPropTypes';\nexport { default as exactProp } from './exactProp';\nexport { default as getDisplayName } from './getDisplayName';\nexport { default as ponyfillGlobal } from './ponyfillGlobal';\n", "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\n/* eslint-disable */\n// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nvar _default = typeof window != 'undefined' && window.Math == Math ? window : typeof self != 'undefined' && self.Math == Math ? self : Function('return this')();\n\nexports.default = _default;", "module.exports = balanced;\nfunction balanced(a, b, str) {\n if (a instanceof RegExp) a = maybeMatch(a, str);\n if (b instanceof RegExp) b = maybeMatch(b, str);\n\n var r = range(a, b, str);\n\n return r && {\n start: r[0],\n end: r[1],\n pre: str.slice(0, r[0]),\n body: str.slice(r[0] + a.length, r[1]),\n post: str.slice(r[1] + b.length)\n };\n}\n\nfunction maybeMatch(reg, str) {\n var m = str.match(reg);\n return m ? m[0] : null;\n}\n\nbalanced.range = range;\nfunction range(a, b, str) {\n var begs, beg, left, right, result;\n var ai = str.indexOf(a);\n var bi = str.indexOf(b, ai + 1);\n var i = ai;\n\n if (ai >= 0 && bi > 0) {\n begs = [];\n left = str.length;\n\n while (i >= 0 && !result) {\n if (i == ai) {\n begs.push(i);\n ai = str.indexOf(a, i + 1);\n } else if (begs.length == 1) {\n result = [ begs.pop(), bi ];\n } else {\n beg = begs.pop();\n if (beg < left) {\n left = beg;\n right = bi;\n }\n\n bi = str.indexOf(b, i + 1);\n }\n\n i = ai < bi && ai >= 0 ? ai : bi;\n }\n\n if (begs.length) {\n result = [ left, right ];\n }\n }\n\n return result;\n}\n", "function createBroadcast (initialState) {\n var listeners = {};\n var id = 1;\n var _state = initialState;\n\n function getState () {\n return _state\n }\n\n function setState (state) {\n _state = state;\n var keys = Object.keys(listeners);\n var i = 0;\n var len = keys.length;\n for (; i < len; i++) {\n // if a listener gets unsubscribed during setState we just skip it\n if (listeners[keys[i]]) { listeners[keys[i]](state); }\n }\n }\n\n // subscribe to changes and return the subscriptionId\n function subscribe (listener) {\n if (typeof listener !== 'function') {\n throw new Error('listener must be a function.')\n }\n var currentId = id;\n listeners[currentId] = listener;\n id += 1;\n return currentId\n }\n\n // remove subscription by removing the listener function\n function unsubscribe (id) {\n listeners[id] = undefined;\n }\n\n return { getState: getState, setState: setState, subscribe: subscribe, unsubscribe: unsubscribe }\n}\n\nexport default createBroadcast;\n", "/*!\n Copyright (c) 2017 Jed Watson.\n Licensed under the MIT License (MIT), see\n http://jedwatson.github.io/classnames\n*/\n/* global define */\n\n(function () {\n\t'use strict';\n\n\tvar hasOwn = {}.hasOwnProperty;\n\n\tfunction classNames () {\n\t\tvar classes = [];\n\n\t\tfor (var i = 0; i < arguments.length; i++) {\n\t\t\tvar arg = arguments[i];\n\t\t\tif (!arg) continue;\n\n\t\t\tvar argType = typeof arg;\n\n\t\t\tif (argType === 'string' || argType === 'number') {\n\t\t\t\tclasses.push(arg);\n\t\t\t} else if (Array.isArray(arg) && arg.length) {\n\t\t\t\tvar inner = classNames.apply(null, arg);\n\t\t\t\tif (inner) {\n\t\t\t\t\tclasses.push(inner);\n\t\t\t\t}\n\t\t\t} else if (argType === 'object') {\n\t\t\t\tfor (var key in arg) {\n\t\t\t\t\tif (hasOwn.call(arg, key) && arg[key]) {\n\t\t\t\t\t\tclasses.push(key);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn classes.join(' ');\n\t}\n\n\tif (typeof module !== 'undefined' && module.exports) {\n\t\tclassNames.default = classNames;\n\t\tmodule.exports = classNames;\n\t} else if (typeof define === 'function' && typeof define.amd === 'object' && define.amd) {\n\t\t// register as 'classnames', consistent with npm package name\n\t\tdefine('classnames', [], function () {\n\t\t\treturn classNames;\n\t\t});\n\t} else {\n\t\twindow.classNames = classNames;\n\t}\n}());\n", - "/* MIT license */\n/* eslint-disable no-mixed-operators */\nconst cssKeywords = require('color-name');\n\n// NOTE: conversions should only return primitive values (i.e. arrays, or\n// values that give correct ` + ("`" + `typeof`)) + ("`" + (` results).\n// do not use box values types (i.e. Number(), String(), etc.)\n\nconst reverseKeywords = {};\nfor (const key of Object.keys(cssKeywords)) {\n\treverseKeywords[cssKeywords[key]] = key;\n}\n\nconst convert = {\n\trgb: {channels: 3, labels: 'rgb'},\n\thsl: {channels: 3, labels: 'hsl'},\n\thsv: {channels: 3, labels: 'hsv'},\n\thwb: {channels: 3, labels: 'hwb'},\n\tcmyk: {channels: 4, labels: 'cmyk'},\n\txyz: {channels: 3, labels: 'xyz'},\n\tlab: {channels: 3, labels: 'lab'},\n\tlch: {channels: 3, labels: 'lch'},\n\thex: {channels: 1, labels: ['hex']},\n\tkeyword: {channels: 1, labels: ['keyword']},\n\tansi16: {channels: 1, labels: ['ansi16']},\n\tansi256: {channels: 1, labels: ['ansi256']},\n\thcg: {channels: 3, labels: ['h', 'c', 'g']},\n\tapple: {channels: 3, labels: ['r16', 'g16', 'b16']},\n\tgray: {channels: 1, labels: ['gray']}\n};\n\nmodule.exports = convert;\n\n// Hide .channels and .labels properties\nfor (const model of Object.keys(convert)) {\n\tif (!('channels' in convert[model])) {\n\t\tthrow new Error('missing channels property: ' + model);\n\t}\n\n\tif (!('labels' in convert[model])) {\n\t\tthrow new Error('missing channel labels property: ' + model);\n\t}\n\n\tif (convert[model].labels.length !== convert[model].channels) {\n\t\tthrow new Error('channel and label counts mismatch: ' + model);\n\t}\n\n\tconst {channels, labels} = convert[model];\n\tdelete convert[model].channels;\n\tdelete convert[model].labels;\n\tObject.defineProperty(convert[model], 'channels', {value: channels});\n\tObject.defineProperty(convert[model], 'labels', {value: labels});\n}\n\nconvert.rgb.hsl = function (rgb) {\n\tconst r = rgb[0] / 255;\n\tconst g = rgb[1] / 255;\n\tconst b = rgb[2] / 255;\n\tconst min = Math.min(r, g, b);\n\tconst max = Math.max(r, g, b);\n\tconst delta = max - min;\n\tlet h;\n\tlet s;\n\n\tif (max === min) {\n\t\th = 0;\n\t} else if (r === max) {\n\t\th = (g - b) / delta;\n\t} else if (g === max) {\n\t\th = 2 + (b - r) / delta;\n\t} else if (b === max) {\n\t\th = 4 + (r - g) / delta;\n\t}\n\n\th = Math.min(h * 60, 360);\n\n\tif (h < 0) {\n\t\th += 360;\n\t}\n\n\tconst l = (min + max) / 2;\n\n\tif (max === min) {\n\t\ts = 0;\n\t} else if (l <= 0.5) {\n\t\ts = delta / (max + min);\n\t} else {\n\t\ts = delta / (2 - max - min);\n\t}\n\n\treturn [h, s * 100, l * 100];\n};\n\nconvert.rgb.hsv = function (rgb) {\n\tlet rdif;\n\tlet gdif;\n\tlet bdif;\n\tlet h;\n\tlet s;\n\n\tconst r = rgb[0] / 255;\n\tconst g = rgb[1] / 255;\n\tconst b = rgb[2] / 255;\n\tconst v = Math.max(r, g, b);\n\tconst diff = v - Math.min(r, g, b);\n\tconst diffc = function (c) {\n\t\treturn (v - c) / 6 / diff + 1 / 2;\n\t};\n\n\tif (diff === 0) {\n\t\th = 0;\n\t\ts = 0;\n\t} else {\n\t\ts = diff / v;\n\t\trdif = diffc(r);\n\t\tgdif = diffc(g);\n\t\tbdif = diffc(b);\n\n\t\tif (r === v) {\n\t\t\th = bdif - gdif;\n\t\t} else if (g === v) {\n\t\t\th = (1 / 3) + rdif - bdif;\n\t\t} else if (b === v) {\n\t\t\th = (2 / 3) + gdif - rdif;\n\t\t}\n\n\t\tif (h < 0) {\n\t\t\th += 1;\n\t\t} else if (h > 1) {\n\t\t\th -= 1;\n\t\t}\n\t}\n\n\treturn [\n\t\th * 360,\n\t\ts * 100,\n\t\tv * 100\n\t];\n};\n\nconvert.rgb.hwb = function (rgb) {\n\tconst r = rgb[0];\n\tconst g = rgb[1];\n\tlet b = rgb[2];\n\tconst h = convert.rgb.hsl(rgb)[0];\n\tconst w = 1 / 255 * Math.min(r, Math.min(g, b));\n\n\tb = 1 - 1 / 255 * Math.max(r, Math.max(g, b));\n\n\treturn [h, w * 100, b * 100];\n};\n\nconvert.rgb.cmyk = function (rgb) {\n\tconst r = rgb[0] / 255;\n\tconst g = rgb[1] / 255;\n\tconst b = rgb[2] / 255;\n\n\tconst k = Math.min(1 - r, 1 - g, 1 - b);\n\tconst c = (1 - r - k) / (1 - k) || 0;\n\tconst m = (1 - g - k) / (1 - k) || 0;\n\tconst y = (1 - b - k) / (1 - k) || 0;\n\n\treturn [c * 100, m * 100, y * 100, k * 100];\n};\n\nfunction comparativeDistance(x, y) {\n\t/*\n\t\tSee https://en.m.wikipedia.org/wiki/Euclidean_distance#Squared_Euclidean_distance\n\t*/\n\treturn (\n\t\t((x[0] - y[0]) ** 2) +\n\t\t((x[1] - y[1]) ** 2) +\n\t\t((x[2] - y[2]) ** 2)\n\t);\n}\n\nconvert.rgb.keyword = function (rgb) {\n\tconst reversed = reverseKeywords[rgb];\n\tif (reversed) {\n\t\treturn reversed;\n\t}\n\n\tlet currentClosestDistance = Infinity;\n\tlet currentClosestKeyword;\n\n\tfor (const keyword of Object.keys(cssKeywords)) {\n\t\tconst value = cssKeywords[keyword];\n\n\t\t// Compute comparative distance\n\t\tconst distance = comparativeDistance(rgb, value);\n\n\t\t// Check if its less, if so set as closest\n\t\tif (distance < currentClosestDistance) {\n\t\t\tcurrentClosestDistance = distance;\n\t\t\tcurrentClosestKeyword = keyword;\n\t\t}\n\t}\n\n\treturn currentClosestKeyword;\n};\n\nconvert.keyword.rgb = function (keyword) {\n\treturn cssKeywords[keyword];\n};\n\nconvert.rgb.xyz = function (rgb) {\n\tlet r = rgb[0] / 255;\n\tlet g = rgb[1] / 255;\n\tlet b = rgb[2] / 255;\n\n\t// Assume sRGB\n\tr = r > 0.04045 ? (((r + 0.055) / 1.055) ** 2.4) : (r / 12.92);\n\tg = g > 0.04045 ? (((g + 0.055) / 1.055) ** 2.4) : (g / 12.92);\n\tb = b > 0.04045 ? (((b + 0.055) / 1.055) ** 2.4) : (b / 12.92);\n\n\tconst x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805);\n\tconst y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722);\n\tconst z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505);\n\n\treturn [x * 100, y * 100, z * 100];\n};\n\nconvert.rgb.lab = function (rgb) {\n\tconst xyz = convert.rgb.xyz(rgb);\n\tlet x = xyz[0];\n\tlet y = xyz[1];\n\tlet z = xyz[2];\n\n\tx /= 95.047;\n\ty /= 100;\n\tz /= 108.883;\n\n\tx = x > 0.008856 ? (x ** (1 / 3)) : (7.787 * x) + (16 / 116);\n\ty = y > 0.008856 ? (y ** (1 / 3)) : (7.787 * y) + (16 / 116);\n\tz = z > 0.008856 ? (z ** (1 / 3)) : (7.787 * z) + (16 / 116);\n\n\tconst l = (116 * y) - 16;\n\tconst a = 500 * (x - y);\n\tconst b = 200 * (y - z);\n\n\treturn [l, a, b];\n};\n\nconvert.hsl.rgb = function (hsl) {\n\tconst h = hsl[0] / 360;\n\tconst s = hsl[1] / 100;\n\tconst l = hsl[2] / 100;\n\tlet t2;\n\tlet t3;\n\tlet val;\n\n\tif (s === 0) {\n\t\tval = l * 255;\n\t\treturn [val, val, val];\n\t}\n\n\tif (l < 0.5) {\n\t\tt2 = l * (1 + s);\n\t} else {\n\t\tt2 = l + s - l * s;\n\t}\n\n\tconst t1 = 2 * l - t2;\n\n\tconst rgb = [0, 0, 0];\n\tfor (let i = 0; i < 3; i++) {\n\t\tt3 = h + 1 / 3 * -(i - 1);\n\t\tif (t3 < 0) {\n\t\t\tt3++;\n\t\t}\n\n\t\tif (t3 > 1) {\n\t\t\tt3--;\n\t\t}\n\n\t\tif (6 * t3 < 1) {\n\t\t\tval = t1 + (t2 - t1) * 6 * t3;\n\t\t} else if (2 * t3 < 1) {\n\t\t\tval = t2;\n\t\t} else if (3 * t3 < 2) {\n\t\t\tval = t1 + (t2 - t1) * (2 / 3 - t3) * 6;\n\t\t} else {\n\t\t\tval = t1;\n\t\t}\n\n\t\trgb[i] = val * 255;\n\t}\n\n\treturn rgb;\n};\n\nconvert.hsl.hsv = function (hsl) {\n\tconst h = hsl[0];\n\tlet s = hsl[1] / 100;\n\tlet l = hsl[2] / 100;\n\tlet smin = s;\n\tconst lmin = Math.max(l, 0.01);\n\n\tl *= 2;\n\ts *= (l <= 1) ? l : 2 - l;\n\tsmin *= lmin <= 1 ? lmin : 2 - lmin;\n\tconst v = (l + s) / 2;\n\tconst sv = l === 0 ? (2 * smin) / (lmin + smin) : (2 * s) / (l + s);\n\n\treturn [h, sv * 100, v * 100];\n};\n\nconvert.hsv.rgb = function (hsv) {\n\tconst h = hsv[0] / 60;\n\tconst s = hsv[1] / 100;\n\tlet v = hsv[2] / 100;\n\tconst hi = Math.floor(h) % 6;\n\n\tconst f = h - Math.floor(h);\n\tconst p = 255 * v * (1 - s);\n\tconst q = 255 * v * (1 - (s * f));\n\tconst t = 255 * v * (1 - (s * (1 - f)));\n\tv *= 255;\n\n\tswitch (hi) {\n\t\tcase 0:\n\t\t\treturn [v, t, p];\n\t\tcase 1:\n\t\t\treturn [q, v, p];\n\t\tcase 2:\n\t\t\treturn [p, v, t];\n\t\tcase 3:\n\t\t\treturn [p, q, v];\n\t\tcase 4:\n\t\t\treturn [t, p, v];\n\t\tcase 5:\n\t\t\treturn [v, p, q];\n\t}\n};\n\nconvert.hsv.hsl = function (hsv) {\n\tconst h = hsv[0];\n\tconst s = hsv[1] / 100;\n\tconst v = hsv[2] / 100;\n\tconst vmin = Math.max(v, 0.01);\n\tlet sl;\n\tlet l;\n\n\tl = (2 - s) * v;\n\tconst lmin = (2 - s) * vmin;\n\tsl = s * vmin;\n\tsl /= (lmin <= 1) ? lmin : 2 - lmin;\n\tsl = sl || 0;\n\tl /= 2;\n\n\treturn [h, sl * 100, l * 100];\n};\n\n// http://dev.w3.org/csswg/css-color/#hwb-to-rgb\nconvert.hwb.rgb = function (hwb) {\n\tconst h = hwb[0] / 360;\n\tlet wh = hwb[1] / 100;\n\tlet bl = hwb[2] / 100;\n\tconst ratio = wh + bl;\n\tlet f;\n\n\t// Wh + bl cant be > 1\n\tif (ratio > 1) {\n\t\twh /= ratio;\n\t\tbl /= ratio;\n\t}\n\n\tconst i = Math.floor(6 * h);\n\tconst v = 1 - bl;\n\tf = 6 * h - i;\n\n\tif ((i & 0x01) !== 0) {\n\t\tf = 1 - f;\n\t}\n\n\tconst n = wh + f * (v - wh); // Linear interpolation\n\n\tlet r;\n\tlet g;\n\tlet b;\n\t/* eslint-disable max-statements-per-line,no-multi-spaces */\n\tswitch (i) {\n\t\tdefault:\n\t\tcase 6:\n\t\tcase 0: r = v; g = n; b = wh; break;\n\t\tcase 1: r = n; g = v; b = wh; break;\n\t\tcase 2: r = wh; g = v; b = n; break;\n\t\tcase 3: r = wh; g = n; b = v; break;\n\t\tcase 4: r = n; g = wh; b = v; break;\n\t\tcase 5: r = v; g = wh; b = n; break;\n\t}\n\t/* eslint-enable max-statements-per-line,no-multi-spaces */\n\n\treturn [r * 255, g * 255, b * 255];\n};\n\nconvert.cmyk.rgb = function (cmyk) {\n\tconst c = cmyk[0] / 100;\n\tconst m = cmyk[1] / 100;\n\tconst y = cmyk[2] / 100;\n\tconst k = cmyk[3] / 100;\n\n\tconst r = 1 - Math.min(1, c * (1 - k) + k);\n\tconst g = 1 - Math.min(1, m * (1 - k) + k);\n\tconst b = 1 - Math.min(1, y * (1 - k) + k);\n\n\treturn [r * 255, g * 255, b * 255];\n};\n\nconvert.xyz.rgb = function (xyz) {\n\tconst x = xyz[0] / 100;\n\tconst y = xyz[1] / 100;\n\tconst z = xyz[2] / 100;\n\tlet r;\n\tlet g;\n\tlet b;\n\n\tr = (x * 3.2406) + (y * -1.5372) + (z * -0.4986);\n\tg = (x * -0.9689) + (y * 1.8758) + (z * 0.0415);\n\tb = (x * 0.0557) + (y * -0.2040) + (z * 1.0570);\n\n\t// Assume sRGB\n\tr = r > 0.0031308\n\t\t? ((1.055 * (r ** (1.0 / 2.4))) - 0.055)\n\t\t: r * 12.92;\n\n\tg = g > 0.0031308\n\t\t? ((1.055 * (g ** (1.0 / 2.4))) - 0.055)\n\t\t: g * 12.92;\n\n\tb = b > 0.0031308\n\t\t? ((1.055 * (b ** (1.0 / 2.4))) - 0.055)\n\t\t: b * 12.92;\n\n\tr = Math.min(Math.max(0, r), 1);\n\tg = Math.min(Math.max(0, g), 1);\n\tb = Math.min(Math.max(0, b), 1);\n\n\treturn [r * 255, g * 255, b * 255];\n};\n\nconvert.xyz.lab = function (xyz) {\n\tlet x = xyz[0];\n\tlet y = xyz[1];\n\tlet z = xyz[2];\n\n\tx /= 95.047;\n\ty /= 100;\n\tz /= 108.883;\n\n\tx = x > 0.008856 ? (x ** (1 / 3)) : (7.787 * x) + (16 / 116);\n\ty = y > 0.008856 ? (y ** (1 / 3)) : (7.787 * y) + (16 / 116);\n\tz = z > 0.008856 ? (z ** (1 / 3)) : (7.787 * z) + (16 / 116);\n\n\tconst l = (116 * y) - 16;\n\tconst a = 500 * (x - y);\n\tconst b = 200 * (y - z);\n\n\treturn [l, a, b];\n};\n\nconvert.lab.xyz = function (lab) {\n\tconst l = lab[0];\n\tconst a = lab[1];\n\tconst b = lab[2];\n\tlet x;\n\tlet y;\n\tlet z;\n\n\ty = (l + 16) / 116;\n\tx = a / 500 + y;\n\tz = y - b / 200;\n\n\tconst y2 = y ** 3;\n\tconst x2 = x ** 3;\n\tconst z2 = z ** 3;\n\ty = y2 > 0.008856 ? y2 : (y - 16 / 116) / 7.787;\n\tx = x2 > 0.008856 ? x2 : (x - 16 / 116) / 7.787;\n\tz = z2 > 0.008856 ? z2 : (z - 16 / 116) / 7.787;\n\n\tx *= 95.047;\n\ty *= 100;\n\tz *= 108.883;\n\n\treturn [x, y, z];\n};\n\nconvert.lab.lch = function (lab) {\n\tconst l = lab[0];\n\tconst a = lab[1];\n\tconst b = lab[2];\n\tlet h;\n\n\tconst hr = Math.atan2(b, a);\n\th = hr * 360 / 2 / Math.PI;\n\n\tif (h < 0) {\n\t\th += 360;\n\t}\n\n\tconst c = Math.sqrt(a * a + b * b);\n\n\treturn [l, c, h];\n};\n\nconvert.lch.lab = function (lch) {\n\tconst l = lch[0];\n\tconst c = lch[1];\n\tconst h = lch[2];\n\n\tconst hr = h / 360 * 2 * Math.PI;\n\tconst a = c * Math.cos(hr);\n\tconst b = c * Math.sin(hr);\n\n\treturn [l, a, b];\n};\n\nconvert.rgb.ansi16 = function (args, saturation = null) {\n\tconst [r, g, b] = args;\n\tlet value = saturation === null ? convert.rgb.hsv(args)[2] : saturation; // Hsv -> ansi16 optimization\n\n\tvalue = Math.round(value / 50);\n\n\tif (value === 0) {\n\t\treturn 30;\n\t}\n\n\tlet ansi = 30\n\t\t+ ((Math.round(b / 255) << 2)\n\t\t| (Math.round(g / 255) << 1)\n\t\t| Math.round(r / 255));\n\n\tif (value === 2) {\n\t\tansi += 60;\n\t}\n\n\treturn ansi;\n};\n\nconvert.hsv.ansi16 = function (args) {\n\t// Optimization here; we already know the value and don't need to get\n\t// it converted for us.\n\treturn convert.rgb.ansi16(convert.hsv.rgb(args), args[2]);\n};\n\nconvert.rgb.ansi256 = function (args) {\n\tconst r = args[0];\n\tconst g = args[1];\n\tconst b = args[2];\n\n\t// We use the extended greyscale palette here, with the exception of\n\t// black and white. normal palette only has 4 greyscale shades.\n\tif (r === g && g === b) {\n\t\tif (r < 8) {\n\t\t\treturn 16;\n\t\t}\n\n\t\tif (r > 248) {\n\t\t\treturn 231;\n\t\t}\n\n\t\treturn Math.round(((r - 8) / 247) * 24) + 232;\n\t}\n\n\tconst ansi = 16\n\t\t+ (36 * Math.round(r / 255 * 5))\n\t\t+ (6 * Math.round(g / 255 * 5))\n\t\t+ Math.round(b / 255 * 5);\n\n\treturn ansi;\n};\n\nconvert.ansi16.rgb = function (args) {\n\tlet color = args % 10;\n\n\t// Handle greyscale\n\tif (color === 0 || color === 7) {\n\t\tif (args > 50) {\n\t\t\tcolor += 3.5;\n\t\t}\n\n\t\tcolor = color / 10.5 * 255;\n\n\t\treturn [color, color, color];\n\t}\n\n\tconst mult = (~~(args > 50) + 1) * 0.5;\n\tconst r = ((color & 1) * mult) * 255;\n\tconst g = (((color >> 1) & 1) * mult) * 255;\n\tconst b = (((color >> 2) & 1) * mult) * 255;\n\n\treturn [r, g, b];\n};\n\nconvert.ansi256.rgb = function (args) {\n\t// Handle greyscale\n\tif (args >= 232) {\n\t\tconst c = (args - 232) * 10 + 8;\n\t\treturn [c, c, c];\n\t}\n\n\targs -= 16;\n\n\tlet rem;\n\tconst r = Math.floor(args / 36) / 5 * 255;\n\tconst g = Math.floor((rem = args % 36) / 6) / 5 * 255;\n\tconst b = (rem % 6) / 5 * 255;\n\n\treturn [r, g, b];\n};\n\nconvert.rgb.hex = function (args) {\n\tconst integer = ((Math.round(args[0]) & 0xFF) << 16)\n\t\t+ ((Math.round(args[1]) & 0xFF) << 8)\n\t\t+ (Math.round(args[2]) & 0xFF);\n\n\tconst string = integer.toString(16).toUpperCase();\n\treturn '000000'.substring(string.length) + string;\n};\n\nconvert.hex.rgb = function (args) {\n\tconst match = args.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);\n\tif (!match) {\n\t\treturn [0, 0, 0];\n\t}\n\n\tlet colorString = match[0];\n\n\tif (match[0].length === 3) {\n\t\tcolorString = colorString.split('').map(char => {\n\t\t\treturn char + char;\n\t\t}).join('');\n\t}\n\n\tconst integer = parseInt(colorString, 16);\n\tconst r = (integer >> 16) & 0xFF;\n\tconst g = (integer >> 8) & 0xFF;\n\tconst b = integer & 0xFF;\n\n\treturn [r, g, b];\n};\n\nconvert.rgb.hcg = function (rgb) {\n\tconst r = rgb[0] / 255;\n\tconst g = rgb[1] / 255;\n\tconst b = rgb[2] / 255;\n\tconst max = Math.max(Math.max(r, g), b);\n\tconst min = Math.min(Math.min(r, g), b);\n\tconst chroma = (max - min);\n\tlet grayscale;\n\tlet hue;\n\n\tif (chroma < 1) {\n\t\tgrayscale = min / (1 - chroma);\n\t} else {\n\t\tgrayscale = 0;\n\t}\n\n\tif (chroma <= 0) {\n\t\thue = 0;\n\t} else\n\tif (max === r) {\n\t\thue = ((g - b) / chroma) % 6;\n\t} else\n\tif (max === g) {\n\t\thue = 2 + (b - r) / chroma;\n\t} else {\n\t\thue = 4 + (r - g) / chroma + 4;\n\t}\n\n\thue /= 6;\n\thue %= 1;\n\n\treturn [hue * 360, chroma * 100, grayscale * 100];\n};\n\nconvert.hsl.hcg = function (hsl) {\n\tconst s = hsl[1] / 100;\n\tconst l = hsl[2] / 100;\n\n\tconst c = l < 0.5 ? (2.0 * s * l) : (2.0 * s * (1.0 - l));\n\n\tlet f = 0;\n\tif (c < 1.0) {\n\t\tf = (l - 0.5 * c) / (1.0 - c);\n\t}\n\n\treturn [hsl[0], c * 100, f * 100];\n};\n\nconvert.hsv.hcg = function (hsv) {\n\tconst s = hsv[1] / 100;\n\tconst v = hsv[2] / 100;\n\n\tconst c = s * v;\n\tlet f = 0;\n\n\tif (c < 1.0) {\n\t\tf = (v - c) / (1 - c);\n\t}\n\n\treturn [hsv[0], c * 100, f * 100];\n};\n\nconvert.hcg.rgb = function (hcg) {\n\tconst h = hcg[0] / 360;\n\tconst c = hcg[1] / 100;\n\tconst g = hcg[2] / 100;\n\n\tif (c === 0.0) {\n\t\treturn [g * 255, g * 255, g * 255];\n\t}\n\n\tconst pure = [0, 0, 0];\n\tconst hi = (h % 1) * 6;\n\tconst v = hi % 1;\n\tconst w = 1 - v;\n\tlet mg = 0;\n\n\t/* eslint-disable max-statements-per-line */\n\tswitch (Math.floor(hi)) {\n\t\tcase 0:\n\t\t\tpure[0] = 1; pure[1] = v; pure[2] = 0; break;\n\t\tcase 1:\n\t\t\tpure[0] = w; pure[1] = 1; pure[2] = 0; break;\n\t\tcase 2:\n\t\t\tpure[0] = 0; pure[1] = 1; pure[2] = v; break;\n\t\tcase 3:\n\t\t\tpure[0] = 0; pure[1] = w; pure[2] = 1; break;\n\t\tcase 4:\n\t\t\tpure[0] = v; pure[1] = 0; pure[2] = 1; break;\n\t\tdefault:\n\t\t\tpure[0] = 1; pure[1] = 0; pure[2] = w;\n\t}\n\t/* eslint-enable max-statements-per-line */\n\n\tmg = (1.0 - c) * g;\n\n\treturn [\n\t\t(c * pure[0] + mg) * 255,\n\t\t(c * pure[1] + mg) * 255,\n\t\t(c * pure[2] + mg) * 255\n\t];\n};\n\nconvert.hcg.hsv = function (hcg) {\n\tconst c = hcg[1] / 100;\n\tconst g = hcg[2] / 100;\n\n\tconst v = c + g * (1.0 - c);\n\tlet f = 0;\n\n\tif (v > 0.0) {\n\t\tf = c / v;\n\t}\n\n\treturn [hcg[0], f * 100, v * 100];\n};\n\nconvert.hcg.hsl = function (hcg) {\n\tconst c = hcg[1] / 100;\n\tconst g = hcg[2] / 100;\n\n\tconst l = g * (1.0 - c) + 0.5 * c;\n\tlet s = 0;\n\n\tif (l > 0.0 && l < 0.5) {\n\t\ts = c / (2 * l);\n\t} else\n\tif (l >= 0.5 && l < 1.0) {\n\t\ts = c / (2 * (1 - l));\n\t}\n\n\treturn [hcg[0], s * 100, l * 100];\n};\n\nconvert.hcg.hwb = function (hcg) {\n\tconst c = hcg[1] / 100;\n\tconst g = hcg[2] / 100;\n\tconst v = c + g * (1.0 - c);\n\treturn [hcg[0], (v - c) * 100, (1 - v) * 100];\n};\n\nconvert.hwb.hcg = function (hwb) {\n\tconst w = hwb[1] / 100;\n\tconst b = hwb[2] / 100;\n\tconst v = 1 - b;\n\tconst c = v - w;\n\tlet g = 0;\n\n\tif (c < 1) {\n\t\tg = (v - c) / (1 - c);\n\t}\n\n\treturn [hwb[0], c * 100, g * 100];\n};\n\nconvert.apple.rgb = function (apple) {\n\treturn [(apple[0] / 65535) * 255, (apple[1] / 65535) * 255, (apple[2] / 65535) * 255];\n};\n\nconvert.rgb.apple = function (rgb) {\n\treturn [(rgb[0] / 255) * 65535, (rgb[1] / 255) * 65535, (rgb[2] / 255) * 65535];\n};\n\nconvert.gray.rgb = function (args) {\n\treturn [args[0] / 100 * 255, args[0] / 100 * 255, args[0] / 100 * 255];\n};\n\nconvert.gray.hsl = function (args) {\n\treturn [0, 0, args[0]];\n};\n\nconvert.gray.hsv = convert.gray.hsl;\n\nconvert.gray.hwb = function (gray) {\n\treturn [0, 100, gray[0]];\n};\n\nconvert.gray.cmyk = function (gray) {\n\treturn [0, 0, 0, gray[0]];\n};\n\nconvert.gray.lab = function (gray) {\n\treturn [gray[0], 0, 0];\n};\n\nconvert.gray.hex = function (gray) {\n\tconst val = Math.round(gray[0] / 100 * 255) & 0xFF;\n\tconst integer = (val << 16) + (val << 8) + val;\n\n\tconst string = integer.toString(16).toUpperCase();\n\treturn '000000'.substring(string.length) + string;\n};\n\nconvert.rgb.gray = function (rgb) {\n\tconst val = (rgb[0] + rgb[1] + rgb[2]) / 3;\n\treturn [val / 255 * 100];\n};\n", + "/* MIT license */\n/* eslint-disable no-mixed-operators */\nconst cssKeywords = require('color-name');\n\n// NOTE: conversions should only return primitive values (i.e. arrays, or\n// values that give correct `)) + ("`" + (`typeof` + "`"))) + ((` results).\n// do not use box values types (i.e. Number(), String(), etc.)\n\nconst reverseKeywords = {};\nfor (const key of Object.keys(cssKeywords)) {\n\treverseKeywords[cssKeywords[key]] = key;\n}\n\nconst convert = {\n\trgb: {channels: 3, labels: 'rgb'},\n\thsl: {channels: 3, labels: 'hsl'},\n\thsv: {channels: 3, labels: 'hsv'},\n\thwb: {channels: 3, labels: 'hwb'},\n\tcmyk: {channels: 4, labels: 'cmyk'},\n\txyz: {channels: 3, labels: 'xyz'},\n\tlab: {channels: 3, labels: 'lab'},\n\tlch: {channels: 3, labels: 'lch'},\n\thex: {channels: 1, labels: ['hex']},\n\tkeyword: {channels: 1, labels: ['keyword']},\n\tansi16: {channels: 1, labels: ['ansi16']},\n\tansi256: {channels: 1, labels: ['ansi256']},\n\thcg: {channels: 3, labels: ['h', 'c', 'g']},\n\tapple: {channels: 3, labels: ['r16', 'g16', 'b16']},\n\tgray: {channels: 1, labels: ['gray']}\n};\n\nmodule.exports = convert;\n\n// Hide .channels and .labels properties\nfor (const model of Object.keys(convert)) {\n\tif (!('channels' in convert[model])) {\n\t\tthrow new Error('missing channels property: ' + model);\n\t}\n\n\tif (!('labels' in convert[model])) {\n\t\tthrow new Error('missing channel labels property: ' + model);\n\t}\n\n\tif (convert[model].labels.length !== convert[model].channels) {\n\t\tthrow new Error('channel and label counts mismatch: ' + model);\n\t}\n\n\tconst {channels, labels} = convert[model];\n\tdelete convert[model].channels;\n\tdelete convert[model].labels;\n\tObject.defineProperty(convert[model], 'channels', {value: channels});\n\tObject.defineProperty(convert[model], 'labels', {value: labels});\n}\n\nconvert.rgb.hsl = function (rgb) {\n\tconst r = rgb[0] / 255;\n\tconst g = rgb[1] / 255;\n\tconst b = rgb[2] / 255;\n\tconst min = Math.min(r, g, b);\n\tconst max = Math.max(r, g, b);\n\tconst delta = max - min;\n\tlet h;\n\tlet s;\n\n\tif (max === min) {\n\t\th = 0;\n\t} else if (r === max) {\n\t\th = (g - b) / delta;\n\t} else if (g === max) {\n\t\th = 2 + (b - r) / delta;\n\t} else if (b === max) {\n\t\th = 4 + (r - g) / delta;\n\t}\n\n\th = Math.min(h * 60, 360);\n\n\tif (h < 0) {\n\t\th += 360;\n\t}\n\n\tconst l = (min + max) / 2;\n\n\tif (max === min) {\n\t\ts = 0;\n\t} else if (l <= 0.5) {\n\t\ts = delta / (max + min);\n\t} else {\n\t\ts = delta / (2 - max - min);\n\t}\n\n\treturn [h, s * 100, l * 100];\n};\n\nconvert.rgb.hsv = function (rgb) {\n\tlet rdif;\n\tlet gdif;\n\tlet bdif;\n\tlet h;\n\tlet s;\n\n\tconst r = rgb[0] / 255;\n\tconst g = rgb[1] / 255;\n\tconst b = rgb[2] / 255;\n\tconst v = Math.max(r, g, b);\n\tconst diff = v - Math.min(r, g, b);\n\tconst diffc = function (c) {\n\t\treturn (v - c) / 6 / diff + 1 / 2;\n\t};\n\n\tif (diff === 0) {\n\t\th = 0;\n\t\ts = 0;\n\t} else {\n\t\ts = diff / v;\n\t\trdif = diffc(r);\n\t\tgdif = diffc(g);\n\t\tbdif = diffc(b);\n\n\t\tif (r === v) {\n\t\t\th = bdif - gdif;\n\t\t} else if (g === v) {\n\t\t\th = (1 / 3) + rdif - bdif;\n\t\t} else if (b === v) {\n\t\t\th = (2 / 3) + gdif - rdif;\n\t\t}\n\n\t\tif (h < 0) {\n\t\t\th += 1;\n\t\t} else if (h > 1) {\n\t\t\th -= 1;\n\t\t}\n\t}\n\n\treturn [\n\t\th * 360,\n\t\ts * 100,\n\t\tv * 100\n\t];\n};\n\nconvert.rgb.hwb = function (rgb) {\n\tconst r = rgb[0];\n\tconst g = rgb[1];\n\tlet b = rgb[2];\n\tconst h = convert.rgb.hsl(rgb)[0];\n\tconst w = 1 / 255 * Math.min(r, Math.min(g, b));\n\n\tb = 1 - 1 / 255 * Math.max(r, Math.max(g, b));\n\n\treturn [h, w * 100, b * 100];\n};\n\nconvert.rgb.cmyk = function (rgb) {\n\tconst r = rgb[0] / 255;\n\tconst g = rgb[1] / 255;\n\tconst b = rgb[2] / 255;\n\n\tconst k = Math.min(1 - r, 1 - g, 1 - b);\n\tconst c = (1 - r - k) / (1 - k) || 0;\n\tconst m = (1 - g - k) / (1 - k) || 0;\n\tconst y = (1 - b - k) / (1 - k) || 0;\n\n\treturn [c * 100, m * 100, y * 100, k * 100];\n};\n\nfunction comparativeDistance(x, y) {\n\t/*\n\t\tSee https://en.m.wikipedia.org/wiki/Euclidean_distance#Squared_Euclidean_distance\n\t*/\n\treturn (\n\t\t((x[0] - y[0]) ** 2) +\n\t\t((x[1] - y[1]) ** 2) +\n\t\t((x[2] - y[2]) ** 2)\n\t);\n}\n\nconvert.rgb.keyword = function (rgb) {\n\tconst reversed = reverseKeywords[rgb];\n\tif (reversed) {\n\t\treturn reversed;\n\t}\n\n\tlet currentClosestDistance = Infinity;\n\tlet currentClosestKeyword;\n\n\tfor (const keyword of Object.keys(cssKeywords)) {\n\t\tconst value = cssKeywords[keyword];\n\n\t\t// Compute comparative distance\n\t\tconst distance = comparativeDistance(rgb, value);\n\n\t\t// Check if its less, if so set as closest\n\t\tif (distance < currentClosestDistance) {\n\t\t\tcurrentClosestDistance = distance;\n\t\t\tcurrentClosestKeyword = keyword;\n\t\t}\n\t}\n\n\treturn currentClosestKeyword;\n};\n\nconvert.keyword.rgb = function (keyword) {\n\treturn cssKeywords[keyword];\n};\n\nconvert.rgb.xyz = function (rgb) {\n\tlet r = rgb[0] / 255;\n\tlet g = rgb[1] / 255;\n\tlet b = rgb[2] / 255;\n\n\t// Assume sRGB\n\tr = r > 0.04045 ? (((r + 0.055) / 1.055) ** 2.4) : (r / 12.92);\n\tg = g > 0.04045 ? (((g + 0.055) / 1.055) ** 2.4) : (g / 12.92);\n\tb = b > 0.04045 ? (((b + 0.055) / 1.055) ** 2.4) : (b / 12.92);\n\n\tconst x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805);\n\tconst y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722);\n\tconst z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505);\n\n\treturn [x * 100, y * 100, z * 100];\n};\n\nconvert.rgb.lab = function (rgb) {\n\tconst xyz = convert.rgb.xyz(rgb);\n\tlet x = xyz[0];\n\tlet y = xyz[1];\n\tlet z = xyz[2];\n\n\tx /= 95.047;\n\ty /= 100;\n\tz /= 108.883;\n\n\tx = x > 0.008856 ? (x ** (1 / 3)) : (7.787 * x) + (16 / 116);\n\ty = y > 0.008856 ? (y ** (1 / 3)) : (7.787 * y) + (16 / 116);\n\tz = z > 0.008856 ? (z ** (1 / 3)) : (7.787 * z) + (16 / 116);\n\n\tconst l = (116 * y) - 16;\n\tconst a = 500 * (x - y);\n\tconst b = 200 * (y - z);\n\n\treturn [l, a, b];\n};\n\nconvert.hsl.rgb = function (hsl) {\n\tconst h = hsl[0] / 360;\n\tconst s = hsl[1] / 100;\n\tconst l = hsl[2] / 100;\n\tlet t2;\n\tlet t3;\n\tlet val;\n\n\tif (s === 0) {\n\t\tval = l * 255;\n\t\treturn [val, val, val];\n\t}\n\n\tif (l < 0.5) {\n\t\tt2 = l * (1 + s);\n\t} else {\n\t\tt2 = l + s - l * s;\n\t}\n\n\tconst t1 = 2 * l - t2;\n\n\tconst rgb = [0, 0, 0];\n\tfor (let i = 0; i < 3; i++) {\n\t\tt3 = h + 1 / 3 * -(i - 1);\n\t\tif (t3 < 0) {\n\t\t\tt3++;\n\t\t}\n\n\t\tif (t3 > 1) {\n\t\t\tt3--;\n\t\t}\n\n\t\tif (6 * t3 < 1) {\n\t\t\tval = t1 + (t2 - t1) * 6 * t3;\n\t\t} else if (2 * t3 < 1) {\n\t\t\tval = t2;\n\t\t} else if (3 * t3 < 2) {\n\t\t\tval = t1 + (t2 - t1) * (2 / 3 - t3) * 6;\n\t\t} else {\n\t\t\tval = t1;\n\t\t}\n\n\t\trgb[i] = val * 255;\n\t}\n\n\treturn rgb;\n};\n\nconvert.hsl.hsv = function (hsl) {\n\tconst h = hsl[0];\n\tlet s = hsl[1] / 100;\n\tlet l = hsl[2] / 100;\n\tlet smin = s;\n\tconst lmin = Math.max(l, 0.01);\n\n\tl *= 2;\n\ts *= (l <= 1) ? l : 2 - l;\n\tsmin *= lmin <= 1 ? lmin : 2 - lmin;\n\tconst v = (l + s) / 2;\n\tconst sv = l === 0 ? (2 * smin) / (lmin + smin) : (2 * s) / (l + s);\n\n\treturn [h, sv * 100, v * 100];\n};\n\nconvert.hsv.rgb = function (hsv) {\n\tconst h = hsv[0] / 60;\n\tconst s = hsv[1] / 100;\n\tlet v = hsv[2] / 100;\n\tconst hi = Math.floor(h) % 6;\n\n\tconst f = h - Math.floor(h);\n\tconst p = 255 * v * (1 - s);\n\tconst q = 255 * v * (1 - (s * f));\n\tconst t = 255 * v * (1 - (s * (1 - f)));\n\tv *= 255;\n\n\tswitch (hi) {\n\t\tcase 0:\n\t\t\treturn [v, t, p];\n\t\tcase 1:\n\t\t\treturn [q, v, p];\n\t\tcase 2:\n\t\t\treturn [p, v, t];\n\t\tcase 3:\n\t\t\treturn [p, q, v];\n\t\tcase 4:\n\t\t\treturn [t, p, v];\n\t\tcase 5:\n\t\t\treturn [v, p, q];\n\t}\n};\n\nconvert.hsv.hsl = function (hsv) {\n\tconst h = hsv[0];\n\tconst s = hsv[1] / 100;\n\tconst v = hsv[2] / 100;\n\tconst vmin = Math.max(v, 0.01);\n\tlet sl;\n\tlet l;\n\n\tl = (2 - s) * v;\n\tconst lmin = (2 - s) * vmin;\n\tsl = s * vmin;\n\tsl /= (lmin <= 1) ? lmin : 2 - lmin;\n\tsl = sl || 0;\n\tl /= 2;\n\n\treturn [h, sl * 100, l * 100];\n};\n\n// http://dev.w3.org/csswg/css-color/#hwb-to-rgb\nconvert.hwb.rgb = function (hwb) {\n\tconst h = hwb[0] / 360;\n\tlet wh = hwb[1] / 100;\n\tlet bl = hwb[2] / 100;\n\tconst ratio = wh + bl;\n\tlet f;\n\n\t// Wh + bl cant be > 1\n\tif (ratio > 1) {\n\t\twh /= ratio;\n\t\tbl /= ratio;\n\t}\n\n\tconst i = Math.floor(6 * h);\n\tconst v = 1 - bl;\n\tf = 6 * h - i;\n\n\tif ((i & 0x01) !== 0) {\n\t\tf = 1 - f;\n\t}\n\n\tconst n = wh + f * (v - wh); // Linear interpolation\n\n\tlet r;\n\tlet g;\n\tlet b;\n\t/* eslint-disable max-statements-per-line,no-multi-spaces */\n\tswitch (i) {\n\t\tdefault:\n\t\tcase 6:\n\t\tcase 0: r = v; g = n; b = wh; break;\n\t\tcase 1: r = n; g = v; b = wh; break;\n\t\tcase 2: r = wh; g = v; b = n; break;\n\t\tcase 3: r = wh; g = n; b = v; break;\n\t\tcase 4: r = n; g = wh; b = v; break;\n\t\tcase 5: r = v; g = wh; b = n; break;\n\t}\n\t/* eslint-enable max-statements-per-line,no-multi-spaces */\n\n\treturn [r * 255, g * 255, b * 255];\n};\n\nconvert.cmyk.rgb = function (cmyk) {\n\tconst c = cmyk[0] / 100;\n\tconst m = cmyk[1] / 100;\n\tconst y = cmyk[2] / 100;\n\tconst k = cmyk[3] / 100;\n\n\tconst r = 1 - Math.min(1, c * (1 - k) + k);\n\tconst g = 1 - Math.min(1, m * (1 - k) + k);\n\tconst b = 1 - Math.min(1, y * (1 - k) + k);\n\n\treturn [r * 255, g * 255, b * 255];\n};\n\nconvert.xyz.rgb = function (xyz) {\n\tconst x = xyz[0] / 100;\n\tconst y = xyz[1] / 100;\n\tconst z = xyz[2] / 100;\n\tlet r;\n\tlet g;\n\tlet b;\n\n\tr = (x * 3.2406) + (y * -1.5372) + (z * -0.4986);\n\tg = (x * -0.9689) + (y * 1.8758) + (z * 0.0415);\n\tb = (x * 0.0557) + (y * -0.2040) + (z * 1.0570);\n\n\t// Assume sRGB\n\tr = r > 0.0031308\n\t\t? ((1.055 * (r ** (1.0 / 2.4))) - 0.055)\n\t\t: r * 12.92;\n\n\tg = g > 0.0031308\n\t\t? ((1.055 * (g ** (1.0 / 2.4))) - 0.055)\n\t\t: g * 12.92;\n\n\tb = b > 0.0031308\n\t\t? ((1.055 * (b ** (1.0 / 2.4))) - 0.055)\n\t\t: b * 12.92;\n\n\tr = Math.min(Math.max(0, r), 1);\n\tg = Math.min(Math.max(0, g), 1);\n\tb = Math.min(Math.max(0, b), 1);\n\n\treturn [r * 255, g * 255, b * 255];\n};\n\nconvert.xyz.lab = function (xyz) {\n\tlet x = xyz[0];\n\tlet y = xyz[1];\n\tlet z = xyz[2];\n\n\tx /= 95.047;\n\ty /= 100;\n\tz /= 108.883;\n\n\tx = x > 0.008856 ? (x ** (1 / 3)) : (7.787 * x) + (16 / 116);\n\ty = y > 0.008856 ? (y ** (1 / 3)) : (7.787 * y) + (16 / 116);\n\tz = z > 0.008856 ? (z ** (1 / 3)) : (7.787 * z) + (16 / 116);\n\n\tconst l = (116 * y) - 16;\n\tconst a = 500 * (x - y);\n\tconst b = 200 * (y - z);\n\n\treturn [l, a, b];\n};\n\nconvert.lab.xyz = function (lab) {\n\tconst l = lab[0];\n\tconst a = lab[1];\n\tconst b = lab[2];\n\tlet x;\n\tlet y;\n\tlet z;\n\n\ty = (l + 16) / 116;\n\tx = a / 500 + y;\n\tz = y - b / 200;\n\n\tconst y2 = y ** 3;\n\tconst x2 = x ** 3;\n\tconst z2 = z ** 3;\n\ty = y2 > 0.008856 ? y2 : (y - 16 / 116) / 7.787;\n\tx = x2 > 0.008856 ? x2 : (x - 16 / 116) / 7.787;\n\tz = z2 > 0.008856 ? z2 : (z - 16 / 116) / 7.787;\n\n\tx *= 95.047;\n\ty *= 100;\n\tz *= 108.883;\n\n\treturn [x, y, z];\n};\n\nconvert.lab.lch = function (lab) {\n\tconst l = lab[0];\n\tconst a = lab[1];\n\tconst b = lab[2];\n\tlet h;\n\n\tconst hr = Math.atan2(b, a);\n\th = hr * 360 / 2 / Math.PI;\n\n\tif (h < 0) {\n\t\th += 360;\n\t}\n\n\tconst c = Math.sqrt(a * a + b * b);\n\n\treturn [l, c, h];\n};\n\nconvert.lch.lab = function (lch) {\n\tconst l = lch[0];\n\tconst c = lch[1];\n\tconst h = lch[2];\n\n\tconst hr = h / 360 * 2 * Math.PI;\n\tconst a = c * Math.cos(hr);\n\tconst b = c * Math.sin(hr);\n\n\treturn [l, a, b];\n};\n\nconvert.rgb.ansi16 = function (args, saturation = null) {\n\tconst [r, g, b] = args;\n\tlet value = saturation === null ? convert.rgb.hsv(args)[2] : saturation; // Hsv -> ansi16 optimization\n\n\tvalue = Math.round(value / 50);\n\n\tif (value === 0) {\n\t\treturn 30;\n\t}\n\n\tlet ansi = 30\n\t\t+ ((Math.round(b / 255) << 2)\n\t\t| (Math.round(g / 255) << 1)\n\t\t| Math.round(r / 255));\n\n\tif (value === 2) {\n\t\tansi += 60;\n\t}\n\n\treturn ansi;\n};\n\nconvert.hsv.ansi16 = function (args) {\n\t// Optimization here; we already know the value and don't need to get\n\t// it converted for us.\n\treturn convert.rgb.ansi16(convert.hsv.rgb(args), args[2]);\n};\n\nconvert.rgb.ansi256 = function (args) {\n\tconst r = args[0];\n\tconst g = args[1];\n\tconst b = args[2];\n\n\t// We use the extended greyscale palette here, with the exception of\n\t// black and white. normal palette only has 4 greyscale shades.\n\tif (r === g && g === b) {\n\t\tif (r < 8) {\n\t\t\treturn 16;\n\t\t}\n\n\t\tif (r > 248) {\n\t\t\treturn 231;\n\t\t}\n\n\t\treturn Math.round(((r - 8) / 247) * 24) + 232;\n\t}\n\n\tconst ansi = 16\n\t\t+ (36 * Math.round(r / 255 * 5))\n\t\t+ (6 * Math.round(g / 255 * 5))\n\t\t+ Math.round(b / 255 * 5);\n\n\treturn ansi;\n};\n\nconvert.ansi16.rgb = function (args) {\n\tlet color = args % 10;\n\n\t// Handle greyscale\n\tif (color === 0 || color === 7) {\n\t\tif (args > 50) {\n\t\t\tcolor += 3.5;\n\t\t}\n\n\t\tcolor = color / 10.5 * 255;\n\n\t\treturn [color, color, color];\n\t}\n\n\tconst mult = (~~(args > 50) + 1) * 0.5;\n\tconst r = ((color & 1) * mult) * 255;\n\tconst g = (((color >> 1) & 1) * mult) * 255;\n\tconst b = (((color >> 2) & 1) * mult) * 255;\n\n\treturn [r, g, b];\n};\n\nconvert.ansi256.rgb = function (args) {\n\t// Handle greyscale\n\tif (args >= 232) {\n\t\tconst c = (args - 232) * 10 + 8;\n\t\treturn [c, c, c];\n\t}\n\n\targs -= 16;\n\n\tlet rem;\n\tconst r = Math.floor(args / 36) / 5 * 255;\n\tconst g = Math.floor((rem = args % 36) / 6) / 5 * 255;\n\tconst b = (rem % 6) / 5 * 255;\n\n\treturn [r, g, b];\n};\n\nconvert.rgb.hex = function (args) {\n\tconst integer = ((Math.round(args[0]) & 0xFF) << 16)\n\t\t+ ((Math.round(args[1]) & 0xFF) << 8)\n\t\t+ (Math.round(args[2]) & 0xFF);\n\n\tconst string = integer.toString(16).toUpperCase();\n\treturn '000000'.substring(string.length) + string;\n};\n\nconvert.hex.rgb = function (args) {\n\tconst match = args.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);\n\tif (!match) {\n\t\treturn [0, 0, 0];\n\t}\n\n\tlet colorString = match[0];\n\n\tif (match[0].length === 3) {\n\t\tcolorString = colorString.split('').map(char => {\n\t\t\treturn char + char;\n\t\t}).join('');\n\t}\n\n\tconst integer = parseInt(colorString, 16);\n\tconst r = (integer >> 16) & 0xFF;\n\tconst g = (integer >> 8) & 0xFF;\n\tconst b = integer & 0xFF;\n\n\treturn [r, g, b];\n};\n\nconvert.rgb.hcg = function (rgb) {\n\tconst r = rgb[0] / 255;\n\tconst g = rgb[1] / 255;\n\tconst b = rgb[2] / 255;\n\tconst max = Math.max(Math.max(r, g), b);\n\tconst min = Math.min(Math.min(r, g), b);\n\tconst chroma = (max - min);\n\tlet grayscale;\n\tlet hue;\n\n\tif (chroma < 1) {\n\t\tgrayscale = min / (1 - chroma);\n\t} else {\n\t\tgrayscale = 0;\n\t}\n\n\tif (chroma <= 0) {\n\t\thue = 0;\n\t} else\n\tif (max === r) {\n\t\thue = ((g - b) / chroma) % 6;\n\t} else\n\tif (max === g) {\n\t\thue = 2 + (b - r) / chroma;\n\t} else {\n\t\thue = 4 + (r - g) / chroma + 4;\n\t}\n\n\thue /= 6;\n\thue %= 1;\n\n\treturn [hue * 360, chroma * 100, grayscale * 100];\n};\n\nconvert.hsl.hcg = function (hsl) {\n\tconst s = hsl[1] / 100;\n\tconst l = hsl[2] / 100;\n\n\tconst c = l < 0.5 ? (2.0 * s * l) : (2.0 * s * (1.0 - l));\n\n\tlet f = 0;\n\tif (c < 1.0) {\n\t\tf = (l - 0.5 * c) / (1.0 - c);\n\t}\n\n\treturn [hsl[0], c * 100, f * 100];\n};\n\nconvert.hsv.hcg = function (hsv) {\n\tconst s = hsv[1] / 100;\n\tconst v = hsv[2] / 100;\n\n\tconst c = s * v;\n\tlet f = 0;\n\n\tif (c < 1.0) {\n\t\tf = (v - c) / (1 - c);\n\t}\n\n\treturn [hsv[0], c * 100, f * 100];\n};\n\nconvert.hcg.rgb = function (hcg) {\n\tconst h = hcg[0] / 360;\n\tconst c = hcg[1] / 100;\n\tconst g = hcg[2] / 100;\n\n\tif (c === 0.0) {\n\t\treturn [g * 255, g * 255, g * 255];\n\t}\n\n\tconst pure = [0, 0, 0];\n\tconst hi = (h % 1) * 6;\n\tconst v = hi % 1;\n\tconst w = 1 - v;\n\tlet mg = 0;\n\n\t/* eslint-disable max-statements-per-line */\n\tswitch (Math.floor(hi)) {\n\t\tcase 0:\n\t\t\tpure[0] = 1; pure[1] = v; pure[2] = 0; break;\n\t\tcase 1:\n\t\t\tpure[0] = w; pure[1] = 1; pure[2] = 0; break;\n\t\tcase 2:\n\t\t\tpure[0] = 0; pure[1] = 1; pure[2] = v; break;\n\t\tcase 3:\n\t\t\tpure[0] = 0; pure[1] = w; pure[2] = 1; break;\n\t\tcase 4:\n\t\t\tpure[0] = v; pure[1] = 0; pure[2] = 1; break;\n\t\tdefault:\n\t\t\tpure[0] = 1; pure[1] = 0; pure[2] = w;\n\t}\n\t/* eslint-enable max-statements-per-line */\n\n\tmg = (1.0 - c) * g;\n\n\treturn [\n\t\t(c * pure[0] + mg) * 255,\n\t\t(c * pure[1] + mg) * 255,\n\t\t(c * pure[2] + mg) * 255\n\t];\n};\n\nconvert.hcg.hsv = function (hcg) {\n\tconst c = hcg[1] / 100;\n\tconst g = hcg[2] / 100;\n\n\tconst v = c + g * (1.0 - c);\n\tlet f = 0;\n\n\tif (v > 0.0) {\n\t\tf = c / v;\n\t}\n\n\treturn [hcg[0], f * 100, v * 100];\n};\n\nconvert.hcg.hsl = function (hcg) {\n\tconst c = hcg[1] / 100;\n\tconst g = hcg[2] / 100;\n\n\tconst l = g * (1.0 - c) + 0.5 * c;\n\tlet s = 0;\n\n\tif (l > 0.0 && l < 0.5) {\n\t\ts = c / (2 * l);\n\t} else\n\tif (l >= 0.5 && l < 1.0) {\n\t\ts = c / (2 * (1 - l));\n\t}\n\n\treturn [hcg[0], s * 100, l * 100];\n};\n\nconvert.hcg.hwb = function (hcg) {\n\tconst c = hcg[1] / 100;\n\tconst g = hcg[2] / 100;\n\tconst v = c + g * (1.0 - c);\n\treturn [hcg[0], (v - c) * 100, (1 - v) * 100];\n};\n\nconvert.hwb.hcg = function (hwb) {\n\tconst w = hwb[1] / 100;\n\tconst b = hwb[2] / 100;\n\tconst v = 1 - b;\n\tconst c = v - w;\n\tlet g = 0;\n\n\tif (c < 1) {\n\t\tg = (v - c) / (1 - c);\n\t}\n\n\treturn [hwb[0], c * 100, g * 100];\n};\n\nconvert.apple.rgb = function (apple) {\n\treturn [(apple[0] / 65535) * 255, (apple[1] / 65535) * 255, (apple[2] / 65535) * 255];\n};\n\nconvert.rgb.apple = function (rgb) {\n\treturn [(rgb[0] / 255) * 65535, (rgb[1] / 255) * 65535, (rgb[2] / 255) * 65535];\n};\n\nconvert.gray.rgb = function (args) {\n\treturn [args[0] / 100 * 255, args[0] / 100 * 255, args[0] / 100 * 255];\n};\n\nconvert.gray.hsl = function (args) {\n\treturn [0, 0, args[0]];\n};\n\nconvert.gray.hsv = convert.gray.hsl;\n\nconvert.gray.hwb = function (gray) {\n\treturn [0, 100, gray[0]];\n};\n\nconvert.gray.cmyk = function (gray) {\n\treturn [0, 0, 0, gray[0]];\n};\n\nconvert.gray.lab = function (gray) {\n\treturn [gray[0], 0, 0];\n};\n\nconvert.gray.hex = function (gray) {\n\tconst val = Math.round(gray[0] / 100 * 255) & 0xFF;\n\tconst integer = (val << 16) + (val << 8) + val;\n\n\tconst string = integer.toString(16).toUpperCase();\n\treturn '000000'.substring(string.length) + string;\n};\n\nconvert.rgb.gray = function (rgb) {\n\tconst val = (rgb[0] + rgb[1] + rgb[2]) / 3;\n\treturn [val / 255 * 100];\n};\n", "const conversions = require('./conversions');\nconst route = require('./route');\n\nconst convert = {};\n\nconst models = Object.keys(conversions);\n\nfunction wrapRaw(fn) {\n\tconst wrappedFn = function (...args) {\n\t\tconst arg0 = args[0];\n\t\tif (arg0 === undefined || arg0 === null) {\n\t\t\treturn arg0;\n\t\t}\n\n\t\tif (arg0.length > 1) {\n\t\t\targs = arg0;\n\t\t}\n\n\t\treturn fn(args);\n\t};\n\n\t// Preserve .conversion property if there is one\n\tif ('conversion' in fn) {\n\t\twrappedFn.conversion = fn.conversion;\n\t}\n\n\treturn wrappedFn;\n}\n\nfunction wrapRounded(fn) {\n\tconst wrappedFn = function (...args) {\n\t\tconst arg0 = args[0];\n\n\t\tif (arg0 === undefined || arg0 === null) {\n\t\t\treturn arg0;\n\t\t}\n\n\t\tif (arg0.length > 1) {\n\t\t\targs = arg0;\n\t\t}\n\n\t\tconst result = fn(args);\n\n\t\t// We're assuming the result is an array here.\n\t\t// see notice in conversions.js; don't use box types\n\t\t// in conversion functions.\n\t\tif (typeof result === 'object') {\n\t\t\tfor (let len = result.length, i = 0; i < len; i++) {\n\t\t\t\tresult[i] = Math.round(result[i]);\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t};\n\n\t// Preserve .conversion property if there is one\n\tif ('conversion' in fn) {\n\t\twrappedFn.conversion = fn.conversion;\n\t}\n\n\treturn wrappedFn;\n}\n\nmodels.forEach(fromModel => {\n\tconvert[fromModel] = {};\n\n\tObject.defineProperty(convert[fromModel], 'channels', {value: conversions[fromModel].channels});\n\tObject.defineProperty(convert[fromModel], 'labels', {value: conversions[fromModel].labels});\n\n\tconst routes = route(fromModel);\n\tconst routeModels = Object.keys(routes);\n\n\trouteModels.forEach(toModel => {\n\t\tconst fn = routes[toModel];\n\n\t\tconvert[fromModel][toModel] = wrapRounded(fn);\n\t\tconvert[fromModel][toModel].raw = wrapRaw(fn);\n\t});\n});\n\nmodule.exports = convert;\n", - "const conversions = require('./conversions');\n\n/*\n\tThis function routes a model to all other models.\n\n\tall functions that are routed have a property ` + "`")))))) + (((((`.conversion` + "`") + (` attached\n\tto the returned synthetic function. This property is an array\n\tof strings, each with the steps in between the 'from' and 'to'\n\tcolor models (inclusive).\n\n\tconversions that are not possible simply are not included.\n*/\n\nfunction buildGraph() {\n\tconst graph = {};\n\t// https://jsperf.com/object-keys-vs-for-in-with-closure/3\n\tconst models = Object.keys(conversions);\n\n\tfor (let len = models.length, i = 0; i < len; i++) {\n\t\tgraph[models[i]] = {\n\t\t\t// http://jsperf.com/1-vs-infinity\n\t\t\t// micro-opt, but this is simple.\n\t\t\tdistance: -1,\n\t\t\tparent: null\n\t\t};\n\t}\n\n\treturn graph;\n}\n\n// https://en.wikipedia.org/wiki/Breadth-first_search\nfunction deriveBFS(fromModel) {\n\tconst graph = buildGraph();\n\tconst queue = [fromModel]; // Unshift -> queue -> pop\n\n\tgraph[fromModel].distance = 0;\n\n\twhile (queue.length) {\n\t\tconst current = queue.pop();\n\t\tconst adjacents = Object.keys(conversions[current]);\n\n\t\tfor (let len = adjacents.length, i = 0; i < len; i++) {\n\t\t\tconst adjacent = adjacents[i];\n\t\t\tconst node = graph[adjacent];\n\n\t\t\tif (node.distance === -1) {\n\t\t\t\tnode.distance = graph[current].distance + 1;\n\t\t\t\tnode.parent = current;\n\t\t\t\tqueue.unshift(adjacent);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn graph;\n}\n\nfunction link(from, to) {\n\treturn function (args) {\n\t\treturn to(from(args));\n\t};\n}\n\nfunction wrapConversion(toModel, graph) {\n\tconst path = [graph[toModel].parent, toModel];\n\tlet fn = conversions[graph[toModel].parent][toModel];\n\n\tlet cur = graph[toModel].parent;\n\twhile (graph[cur].parent) {\n\t\tpath.unshift(graph[cur].parent);\n\t\tfn = link(conversions[graph[cur].parent][cur], fn);\n\t\tcur = graph[cur].parent;\n\t}\n\n\tfn.conversion = path;\n\treturn fn;\n}\n\nmodule.exports = function (fromModel) {\n\tconst graph = deriveBFS(fromModel);\n\tconst conversion = {};\n\n\tconst models = Object.keys(graph);\n\tfor (let len = models.length, i = 0; i < len; i++) {\n\t\tconst toModel = models[i];\n\t\tconst node = graph[toModel];\n\n\t\tif (node.parent === null) {\n\t\t\t// No possible conversion, or this node is the source model.\n\t\t\tcontinue;\n\t\t}\n\n\t\tconversion[toModel] = wrapConversion(toModel, graph);\n\t}\n\n\treturn conversion;\n};\n\n", + "const conversions = require('./conversions');\n\n/*\n\tThis function routes a model to all other models.\n\n\tall functions that are routed have a property ` + ("`" + `.conversion`)) + (("`" + ` attached\n\tto the returned synthetic function. This property is an array\n\tof strings, each with the steps in between the 'from' and 'to'\n\tcolor models (inclusive).\n\n\tconversions that are not possible simply are not included.\n*/\n\nfunction buildGraph() {\n\tconst graph = {};\n\t// https://jsperf.com/object-keys-vs-for-in-with-closure/3\n\tconst models = Object.keys(conversions);\n\n\tfor (let len = models.length, i = 0; i < len; i++) {\n\t\tgraph[models[i]] = {\n\t\t\t// http://jsperf.com/1-vs-infinity\n\t\t\t// micro-opt, but this is simple.\n\t\t\tdistance: -1,\n\t\t\tparent: null\n\t\t};\n\t}\n\n\treturn graph;\n}\n\n// https://en.wikipedia.org/wiki/Breadth-first_search\nfunction deriveBFS(fromModel) {\n\tconst graph = buildGraph();\n\tconst queue = [fromModel]; // Unshift -> queue -> pop\n\n\tgraph[fromModel].distance = 0;\n\n\twhile (queue.length) {\n\t\tconst current = queue.pop();\n\t\tconst adjacents = Object.keys(conversions[current]);\n\n\t\tfor (let len = adjacents.length, i = 0; i < len; i++) {\n\t\t\tconst adjacent = adjacents[i];\n\t\t\tconst node = graph[adjacent];\n\n\t\t\tif (node.distance === -1) {\n\t\t\t\tnode.distance = graph[current].distance + 1;\n\t\t\t\tnode.parent = current;\n\t\t\t\tqueue.unshift(adjacent);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn graph;\n}\n\nfunction link(from, to) {\n\treturn function (args) {\n\t\treturn to(from(args));\n\t};\n}\n\nfunction wrapConversion(toModel, graph) {\n\tconst path = [graph[toModel].parent, toModel];\n\tlet fn = conversions[graph[toModel].parent][toModel];\n\n\tlet cur = graph[toModel].parent;\n\twhile (graph[cur].parent) {\n\t\tpath.unshift(graph[cur].parent);\n\t\tfn = link(conversions[graph[cur].parent][cur], fn);\n\t\tcur = graph[cur].parent;\n\t}\n\n\tfn.conversion = path;\n\treturn fn;\n}\n\nmodule.exports = function (fromModel) {\n\tconst graph = deriveBFS(fromModel);\n\tconst conversion = {};\n\n\tconst models = Object.keys(graph);\n\tfor (let len = models.length, i = 0; i < len; i++) {\n\t\tconst toModel = models[i];\n\t\tconst node = graph[toModel];\n\n\t\tif (node.parent === null) {\n\t\t\t// No possible conversion, or this node is the source model.\n\t\t\tcontinue;\n\t\t}\n\n\t\tconversion[toModel] = wrapConversion(toModel, graph);\n\t}\n\n\treturn conversion;\n};\n\n", "'use strict'\r\n\r\nmodule.exports = {\r\n\t\"aliceblue\": [240, 248, 255],\r\n\t\"antiquewhite\": [250, 235, 215],\r\n\t\"aqua\": [0, 255, 255],\r\n\t\"aquamarine\": [127, 255, 212],\r\n\t\"azure\": [240, 255, 255],\r\n\t\"beige\": [245, 245, 220],\r\n\t\"bisque\": [255, 228, 196],\r\n\t\"black\": [0, 0, 0],\r\n\t\"blanchedalmond\": [255, 235, 205],\r\n\t\"blue\": [0, 0, 255],\r\n\t\"blueviolet\": [138, 43, 226],\r\n\t\"brown\": [165, 42, 42],\r\n\t\"burlywood\": [222, 184, 135],\r\n\t\"cadetblue\": [95, 158, 160],\r\n\t\"chartreuse\": [127, 255, 0],\r\n\t\"chocolate\": [210, 105, 30],\r\n\t\"coral\": [255, 127, 80],\r\n\t\"cornflowerblue\": [100, 149, 237],\r\n\t\"cornsilk\": [255, 248, 220],\r\n\t\"crimson\": [220, 20, 60],\r\n\t\"cyan\": [0, 255, 255],\r\n\t\"darkblue\": [0, 0, 139],\r\n\t\"darkcyan\": [0, 139, 139],\r\n\t\"darkgoldenrod\": [184, 134, 11],\r\n\t\"darkgray\": [169, 169, 169],\r\n\t\"darkgreen\": [0, 100, 0],\r\n\t\"darkgrey\": [169, 169, 169],\r\n\t\"darkkhaki\": [189, 183, 107],\r\n\t\"darkmagenta\": [139, 0, 139],\r\n\t\"darkolivegreen\": [85, 107, 47],\r\n\t\"darkorange\": [255, 140, 0],\r\n\t\"darkorchid\": [153, 50, 204],\r\n\t\"darkred\": [139, 0, 0],\r\n\t\"darksalmon\": [233, 150, 122],\r\n\t\"darkseagreen\": [143, 188, 143],\r\n\t\"darkslateblue\": [72, 61, 139],\r\n\t\"darkslategray\": [47, 79, 79],\r\n\t\"darkslategrey\": [47, 79, 79],\r\n\t\"darkturquoise\": [0, 206, 209],\r\n\t\"darkviolet\": [148, 0, 211],\r\n\t\"deeppink\": [255, 20, 147],\r\n\t\"deepskyblue\": [0, 191, 255],\r\n\t\"dimgray\": [105, 105, 105],\r\n\t\"dimgrey\": [105, 105, 105],\r\n\t\"dodgerblue\": [30, 144, 255],\r\n\t\"firebrick\": [178, 34, 34],\r\n\t\"floralwhite\": [255, 250, 240],\r\n\t\"forestgreen\": [34, 139, 34],\r\n\t\"fuchsia\": [255, 0, 255],\r\n\t\"gainsboro\": [220, 220, 220],\r\n\t\"ghostwhite\": [248, 248, 255],\r\n\t\"gold\": [255, 215, 0],\r\n\t\"goldenrod\": [218, 165, 32],\r\n\t\"gray\": [128, 128, 128],\r\n\t\"green\": [0, 128, 0],\r\n\t\"greenyellow\": [173, 255, 47],\r\n\t\"grey\": [128, 128, 128],\r\n\t\"honeydew\": [240, 255, 240],\r\n\t\"hotpink\": [255, 105, 180],\r\n\t\"indianred\": [205, 92, 92],\r\n\t\"indigo\": [75, 0, 130],\r\n\t\"ivory\": [255, 255, 240],\r\n\t\"khaki\": [240, 230, 140],\r\n\t\"lavender\": [230, 230, 250],\r\n\t\"lavenderblush\": [255, 240, 245],\r\n\t\"lawngreen\": [124, 252, 0],\r\n\t\"lemonchiffon\": [255, 250, 205],\r\n\t\"lightblue\": [173, 216, 230],\r\n\t\"lightcoral\": [240, 128, 128],\r\n\t\"lightcyan\": [224, 255, 255],\r\n\t\"lightgoldenrodyellow\": [250, 250, 210],\r\n\t\"lightgray\": [211, 211, 211],\r\n\t\"lightgreen\": [144, 238, 144],\r\n\t\"lightgrey\": [211, 211, 211],\r\n\t\"lightpink\": [255, 182, 193],\r\n\t\"lightsalmon\": [255, 160, 122],\r\n\t\"lightseagreen\": [32, 178, 170],\r\n\t\"lightskyblue\": [135, 206, 250],\r\n\t\"lightslategray\": [119, 136, 153],\r\n\t\"lightslategrey\": [119, 136, 153],\r\n\t\"lightsteelblue\": [176, 196, 222],\r\n\t\"lightyellow\": [255, 255, 224],\r\n\t\"lime\": [0, 255, 0],\r\n\t\"limegreen\": [50, 205, 50],\r\n\t\"linen\": [250, 240, 230],\r\n\t\"magenta\": [255, 0, 255],\r\n\t\"maroon\": [128, 0, 0],\r\n\t\"mediumaquamarine\": [102, 205, 170],\r\n\t\"mediumblue\": [0, 0, 205],\r\n\t\"mediumorchid\": [186, 85, 211],\r\n\t\"mediumpurple\": [147, 112, 219],\r\n\t\"mediumseagreen\": [60, 179, 113],\r\n\t\"mediumslateblue\": [123, 104, 238],\r\n\t\"mediumspringgreen\": [0, 250, 154],\r\n\t\"mediumturquoise\": [72, 209, 204],\r\n\t\"mediumvioletred\": [199, 21, 133],\r\n\t\"midnightblue\": [25, 25, 112],\r\n\t\"mintcream\": [245, 255, 250],\r\n\t\"mistyrose\": [255, 228, 225],\r\n\t\"moccasin\": [255, 228, 181],\r\n\t\"navajowhite\": [255, 222, 173],\r\n\t\"navy\": [0, 0, 128],\r\n\t\"oldlace\": [253, 245, 230],\r\n\t\"olive\": [128, 128, 0],\r\n\t\"olivedrab\": [107, 142, 35],\r\n\t\"orange\": [255, 165, 0],\r\n\t\"orangered\": [255, 69, 0],\r\n\t\"orchid\": [218, 112, 214],\r\n\t\"palegoldenrod\": [238, 232, 170],\r\n\t\"palegreen\": [152, 251, 152],\r\n\t\"paleturquoise\": [175, 238, 238],\r\n\t\"palevioletred\": [219, 112, 147],\r\n\t\"papayawhip\": [255, 239, 213],\r\n\t\"peachpuff\": [255, 218, 185],\r\n\t\"peru\": [205, 133, 63],\r\n\t\"pink\": [255, 192, 203],\r\n\t\"plum\": [221, 160, 221],\r\n\t\"powderblue\": [176, 224, 230],\r\n\t\"purple\": [128, 0, 128],\r\n\t\"rebeccapurple\": [102, 51, 153],\r\n\t\"red\": [255, 0, 0],\r\n\t\"rosybrown\": [188, 143, 143],\r\n\t\"royalblue\": [65, 105, 225],\r\n\t\"saddlebrown\": [139, 69, 19],\r\n\t\"salmon\": [250, 128, 114],\r\n\t\"sandybrown\": [244, 164, 96],\r\n\t\"seagreen\": [46, 139, 87],\r\n\t\"seashell\": [255, 245, 238],\r\n\t\"sienna\": [160, 82, 45],\r\n\t\"silver\": [192, 192, 192],\r\n\t\"skyblue\": [135, 206, 235],\r\n\t\"slateblue\": [106, 90, 205],\r\n\t\"slategray\": [112, 128, 144],\r\n\t\"slategrey\": [112, 128, 144],\r\n\t\"snow\": [255, 250, 250],\r\n\t\"springgreen\": [0, 255, 127],\r\n\t\"steelblue\": [70, 130, 180],\r\n\t\"tan\": [210, 180, 140],\r\n\t\"teal\": [0, 128, 128],\r\n\t\"thistle\": [216, 191, 216],\r\n\t\"tomato\": [255, 99, 71],\r\n\t\"turquoise\": [64, 224, 208],\r\n\t\"violet\": [238, 130, 238],\r\n\t\"wheat\": [245, 222, 179],\r\n\t\"white\": [255, 255, 255],\r\n\t\"whitesmoke\": [245, 245, 245],\r\n\t\"yellow\": [255, 255, 0],\r\n\t\"yellowgreen\": [154, 205, 50]\r\n};\r\n", + "require('../modules/es6.math.acosh');\nrequire('../modules/es6.math.asinh');\nrequire('../modules/es6.math.atanh');\nrequire('../modules/es6.math.cbrt');\nrequire('../modules/es6.math.clz32');\nrequire('../modules/es6.math.cosh');\nrequire('../modules/es6.math.expm1');\nrequire('../modules/es6.math.fround');\nrequire('../modules/es6.math.hypot');\nrequire('../modules/es6.math.imul');\nrequire('../modules/es6.math.log10');\nrequire('../modules/es6.math.log1p');\nrequire('../modules/es6.math.log2');\nrequire('../modules/es6.math.sign');\nrequire('../modules/es6.math.sinh');\nrequire('../modules/es6.math.tanh');\nrequire('../modules/es6.math.trunc');\nmodule.exports = require('../modules/_core').Math;\n", + "require('../modules/es6.number.constructor');\nrequire('../modules/es6.number.to-fixed');\nrequire('../modules/es6.number.to-precision');\nrequire('../modules/es6.number.epsilon');\nrequire('../modules/es6.number.is-finite');\nrequire('../modules/es6.number.is-integer');\nrequire('../modules/es6.number.is-nan');\nrequire('../modules/es6.number.is-safe-integer');\nrequire('../modules/es6.number.max-safe-integer');\nrequire('../modules/es6.number.min-safe-integer');\nrequire('../modules/es6.number.parse-float');\nrequire('../modules/es6.number.parse-int');\nmodule.exports = require('../modules/_core').Number;\n", + "module.exports = function (it) {\n if (typeof it != 'function') throw TypeError(it + ' is not a function!');\n return it;\n};\n", + "var cof = require('./_cof');\nmodule.exports = function (it, msg) {\n if (typeof it != 'number' && cof(it) != 'Number') throw TypeError(msg);\n return +it;\n};\n", + "var isObject = require('./_is-object');\nmodule.exports = function (it) {\n if (!isObject(it)) throw TypeError(it + ' is not an object!');\n return it;\n};\n", + "// false -> Array#indexOf\n// true -> Array#includes\nvar toIObject = require('./_to-iobject');\nvar toLength = require('./_to-length');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nmodule.exports = function (IS_INCLUDES) {\n return function ($this, el, fromIndex) {\n var O = toIObject($this);\n var length = toLength(O.length);\n var index = toAbsoluteIndex(fromIndex, length);\n var value;\n // Array#includes uses SameValueZero equality algorithm\n // eslint-disable-next-line no-self-compare\n if (IS_INCLUDES && el != el) while (length > index) {\n value = O[index++];\n // eslint-disable-next-line no-self-compare\n if (value != value) return true;\n // Array#indexOf ignores holes, Array#includes - not\n } else for (;length > index; index++) if (IS_INCLUDES || index in O) {\n if (O[index] === el) return IS_INCLUDES || index || 0;\n } return !IS_INCLUDES && -1;\n };\n};\n", + "var toString = {}.toString;\n\nmodule.exports = function (it) {\n return toString.call(it).slice(8, -1);\n};\n", + "var core = module.exports = { version: '2.5.7' };\nif (typeof __e == 'number') __e = core; // eslint-disable-line no-undef\n", + "// optional / simple context binding\nvar aFunction = require('./_a-function');\nmodule.exports = function (fn, that, length) {\n aFunction(fn);\n if (that === undefined) return fn;\n switch (length) {\n case 1: return function (a) {\n return fn.call(that, a);\n };\n case 2: return function (a, b) {\n return fn.call(that, a, b);\n };\n case 3: return function (a, b, c) {\n return fn.call(that, a, b, c);\n };\n }\n return function (/* ...args */) {\n return fn.apply(that, arguments);\n };\n};\n", + "// 7.2.1 RequireObjectCoercible(argument)\nmodule.exports = function (it) {\n if (it == undefined) throw TypeError(\"Can't call method on \" + it);\n return it;\n};\n", + "// Thank's IE8 for his funny defineProperty\nmodule.exports = !require('./_fails')(function () {\n return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;\n});\n", + "var isObject = require('./_is-object');\nvar document = require('./_global').document;\n// typeof document.createElement is 'object' in old IE\nvar is = isObject(document) && isObject(document.createElement);\nmodule.exports = function (it) {\n return is ? document.createElement(it) : {};\n};\n", + "// IE 8- don't enum bug keys\nmodule.exports = (\n 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'\n).split(',');\n", + "var global = require('./_global');\nvar core = require('./_core');\nvar hide = require('./_hide');\nvar redefine = require('./_redefine');\nvar ctx = require('./_ctx');\nvar PROTOTYPE = 'prototype';\n\nvar $export = function (type, name, source) {\n var IS_FORCED = type & $export.F;\n var IS_GLOBAL = type & $export.G;\n var IS_STATIC = type & $export.S;\n var IS_PROTO = type & $export.P;\n var IS_BIND = type & $export.B;\n var target = IS_GLOBAL ? global : IS_STATIC ? global[name] || (global[name] = {}) : (global[name] || {})[PROTOTYPE];\n var exports = IS_GLOBAL ? core : core[name] || (core[name] = {});\n var expProto = exports[PROTOTYPE] || (exports[PROTOTYPE] = {});\n var key, own, out, exp;\n if (IS_GLOBAL) source = name;\n for (key in source) {\n // contains in native\n own = !IS_FORCED && target && target[key] !== undefined;\n // export native or passed\n out = (own ? target : source)[key];\n // bind timers to global for call from export context\n exp = IS_BIND && own ? ctx(out, global) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;\n // extend global\n if (target) redefine(target, key, out, type & $export.U);\n // export\n if (exports[key] != out) hide(exports, key, exp);\n if (IS_PROTO && expProto[key] != out) expProto[key] = out;\n }\n};\nglobal.core = core;\n// type bitmap\n$export.F = 1; // forced\n$export.G = 2; // global\n$export.S = 4; // static\n$export.P = 8; // proto\n$export.B = 16; // bind\n$export.W = 32; // wrap\n$export.U = 64; // safe\n$export.R = 128; // real proto method for `) + ("`" + `library`))))) + (((("`" + (`\nmodule.exports = $export;\n", + "module.exports = function (exec) {\n try {\n return !!exec();\n } catch (e) {\n return true;\n }\n};\n", + "// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nvar global = module.exports = typeof window != 'undefined' && window.Math == Math\n ? window : typeof self != 'undefined' && self.Math == Math ? self\n // eslint-disable-next-line no-new-func\n : Function('return this')();\nif (typeof __g == 'number') __g = global; // eslint-disable-line no-undef\n", + "var hasOwnProperty = {}.hasOwnProperty;\nmodule.exports = function (it, key) {\n return hasOwnProperty.call(it, key);\n};\n", + "var dP = require('./_object-dp');\nvar createDesc = require('./_property-desc');\nmodule.exports = require('./_descriptors') ? function (object, key, value) {\n return dP.f(object, key, createDesc(1, value));\n} : function (object, key, value) {\n object[key] = value;\n return object;\n};\n", + "var document = require('./_global').document;\nmodule.exports = document && document.documentElement;\n", + "module.exports = !require('./_descriptors') && !require('./_fails')(function () {\n return Object.defineProperty(require('./_dom-create')('div'), 'a', { get: function () { return 7; } }).a != 7;\n});\n", + "var isObject = require('./_is-object');\nvar setPrototypeOf = require('./_set-proto').set;\nmodule.exports = function (that, target, C) {\n var S = target.constructor;\n var P;\n if (S !== C && typeof S == 'function' && (P = S.prototype) !== C.prototype && isObject(P) && setPrototypeOf) {\n setPrototypeOf(that, P);\n } return that;\n};\n", + "// fallback for non-array-like ES3 and non-enumerable old V8 strings\nvar cof = require('./_cof');\n// eslint-disable-next-line no-prototype-builtins\nmodule.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) {\n return cof(it) == 'String' ? it.split('') : Object(it);\n};\n", + "// 20.1.2.3 Number.isInteger(number)\nvar isObject = require('./_is-object');\nvar floor = Math.floor;\nmodule.exports = function isInteger(it) {\n return !isObject(it) && isFinite(it) && floor(it) === it;\n};\n", + "module.exports = function (it) {\n return typeof it === 'object' ? it !== null : typeof it === 'function';\n};\n", + "module.exports = false;\n", + "// 20.2.2.14 Math.expm1(x)\nvar $expm1 = Math.expm1;\nmodule.exports = (!$expm1\n // Old FF bug\n || $expm1(10) > 22025.465794806719 || $expm1(10) < 22025.4657948067165168\n // Tor Browser bug\n || $expm1(-2e-17) != -2e-17\n) ? function expm1(x) {\n return (x = +x) == 0 ? x : x > -1e-6 && x < 1e-6 ? x + x * x / 2 : Math.exp(x) - 1;\n} : $expm1;\n", + "// 20.2.2.16 Math.fround(x)\nvar sign = require('./_math-sign');\nvar pow = Math.pow;\nvar EPSILON = pow(2, -52);\nvar EPSILON32 = pow(2, -23);\nvar MAX32 = pow(2, 127) * (2 - EPSILON32);\nvar MIN32 = pow(2, -126);\n\nvar roundTiesToEven = function (n) {\n return n + 1 / EPSILON - 1 / EPSILON;\n};\n\nmodule.exports = Math.fround || function fround(x) {\n var $abs = Math.abs(x);\n var $sign = sign(x);\n var a, result;\n if ($abs < MIN32) return $sign * roundTiesToEven($abs / MIN32 / EPSILON32) * MIN32 * EPSILON32;\n a = (1 + EPSILON32 / EPSILON) * $abs;\n result = a - (a - $abs);\n // eslint-disable-next-line no-self-compare\n if (result > MAX32 || result != result) return $sign * Infinity;\n return $sign * result;\n};\n", + "// 20.2.2.20 Math.log1p(x)\nmodule.exports = Math.log1p || function log1p(x) {\n return (x = +x) > -1e-8 && x < 1e-8 ? x - x * x / 2 : Math.log(1 + x);\n};\n", + "// 20.2.2.28 Math.sign(x)\nmodule.exports = Math.sign || function sign(x) {\n // eslint-disable-next-line no-self-compare\n return (x = +x) == 0 || x != x ? x : x < 0 ? -1 : 1;\n};\n", + "// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])\nvar anObject = require('./_an-object');\nvar dPs = require('./_object-dps');\nvar enumBugKeys = require('./_enum-bug-keys');\nvar IE_PROTO = require('./_shared-key')('IE_PROTO');\nvar Empty = function () { /* empty */ };\nvar PROTOTYPE = 'prototype';\n\n// Create object with fake ` + "`")) + (`null` + ("`" + ` prototype: use iframe Object with cleared prototype\nvar createDict = function () {\n // Thrash, waste and sodomy: IE GC bug\n var iframe = require('./_dom-create')('iframe');\n var i = enumBugKeys.length;\n var lt = '<';\n var gt = '>';\n var iframeDocument;\n iframe.style.display = 'none';\n require('./_html').appendChild(iframe);\n iframe.src = 'javascript:'; // eslint-disable-line no-script-url\n // createDict = iframe.contentWindow.Object;\n // html.removeChild(iframe);\n iframeDocument = iframe.contentWindow.document;\n iframeDocument.open();\n iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);\n iframeDocument.close();\n createDict = iframeDocument.F;\n while (i--) delete createDict[PROTOTYPE][enumBugKeys[i]];\n return createDict();\n};\n\nmodule.exports = Object.create || function create(O, Properties) {\n var result;\n if (O !== null) {\n Empty[PROTOTYPE] = anObject(O);\n result = new Empty();\n Empty[PROTOTYPE] = null;\n // add \"__proto__\" for Object.getPrototypeOf polyfill\n result[IE_PROTO] = O;\n } else result = createDict();\n return Properties === undefined ? result : dPs(result, Properties);\n};\n", + "var anObject = require('./_an-object');\nvar IE8_DOM_DEFINE = require('./_ie8-dom-define');\nvar toPrimitive = require('./_to-primitive');\nvar dP = Object.defineProperty;\n\nexports.f = require('./_descriptors') ? Object.defineProperty : function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPrimitive(P, true);\n anObject(Attributes);\n if (IE8_DOM_DEFINE) try {\n return dP(O, P, Attributes);\n } catch (e) { /* empty */ }\n if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');\n if ('value' in Attributes) O[P] = Attributes.value;\n return O;\n};\n", + "var dP = require('./_object-dp');\nvar anObject = require('./_an-object');\nvar getKeys = require('./_object-keys');\n\nmodule.exports = require('./_descriptors') ? Object.defineProperties : function defineProperties(O, Properties) {\n anObject(O);\n var keys = getKeys(Properties);\n var length = keys.length;\n var i = 0;\n var P;\n while (length > i) dP.f(O, P = keys[i++], Properties[P]);\n return O;\n};\n", + "var pIE = require('./_object-pie');\nvar createDesc = require('./_property-desc');\nvar toIObject = require('./_to-iobject');\nvar toPrimitive = require('./_to-primitive');\nvar has = require('./_has');\nvar IE8_DOM_DEFINE = require('./_ie8-dom-define');\nvar gOPD = Object.getOwnPropertyDescriptor;\n\nexports.f = require('./_descriptors') ? gOPD : function getOwnPropertyDescriptor(O, P) {\n O = toIObject(O);\n P = toPrimitive(P, true);\n if (IE8_DOM_DEFINE) try {\n return gOPD(O, P);\n } catch (e) { /* empty */ }\n if (has(O, P)) return createDesc(!pIE.f.call(O, P), O[P]);\n};\n", + "// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)\nvar $keys = require('./_object-keys-internal');\nvar hiddenKeys = require('./_enum-bug-keys').concat('length', 'prototype');\n\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n return $keys(O, hiddenKeys);\n};\n", + "var has = require('./_has');\nvar toIObject = require('./_to-iobject');\nvar arrayIndexOf = require('./_array-includes')(false);\nvar IE_PROTO = require('./_shared-key')('IE_PROTO');\n\nmodule.exports = function (object, names) {\n var O = toIObject(object);\n var i = 0;\n var result = [];\n var key;\n for (key in O) if (key != IE_PROTO) has(O, key) && result.push(key);\n // Don't enum bug & hidden keys\n while (names.length > i) if (has(O, key = names[i++])) {\n ~arrayIndexOf(result, key) || result.push(key);\n }\n return result;\n};\n", + "// 19.1.2.14 / 15.2.3.14 Object.keys(O)\nvar $keys = require('./_object-keys-internal');\nvar enumBugKeys = require('./_enum-bug-keys');\n\nmodule.exports = Object.keys || function keys(O) {\n return $keys(O, enumBugKeys);\n};\n", + "exports.f = {}.propertyIsEnumerable;\n", + "var $parseFloat = require('./_global').parseFloat;\nvar $trim = require('./_string-trim').trim;\n\nmodule.exports = 1 / $parseFloat(require('./_string-ws') + '-0') !== -Infinity ? function parseFloat(str) {\n var string = $trim(String(str), 3);\n var result = $parseFloat(string);\n return result === 0 && string.charAt(0) == '-' ? -0 : result;\n} : $parseFloat;\n", + "var $parseInt = require('./_global').parseInt;\nvar $trim = require('./_string-trim').trim;\nvar ws = require('./_string-ws');\nvar hex = /^[-+]?0[xX]/;\n\nmodule.exports = $parseInt(ws + '08') !== 8 || $parseInt(ws + '0x16') !== 22 ? function parseInt(str, radix) {\n var string = $trim(String(str), 3);\n return $parseInt(string, (radix >>> 0) || (hex.test(string) ? 16 : 10));\n} : $parseInt;\n", + "module.exports = function (bitmap, value) {\n return {\n enumerable: !(bitmap & 1),\n configurable: !(bitmap & 2),\n writable: !(bitmap & 4),\n value: value\n };\n};\n", + "var global = require('./_global');\nvar hide = require('./_hide');\nvar has = require('./_has');\nvar SRC = require('./_uid')('src');\nvar TO_STRING = 'toString';\nvar $toString = Function[TO_STRING];\nvar TPL = ('' + $toString).split(TO_STRING);\n\nrequire('./_core').inspectSource = function (it) {\n return $toString.call(it);\n};\n\n(module.exports = function (O, key, val, safe) {\n var isFunction = typeof val == 'function';\n if (isFunction) has(val, 'name') || hide(val, 'name', key);\n if (O[key] === val) return;\n if (isFunction) has(val, SRC) || hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key)));\n if (O === global) {\n O[key] = val;\n } else if (!safe) {\n delete O[key];\n hide(O, key, val);\n } else if (O[key]) {\n O[key] = val;\n } else {\n hide(O, key, val);\n }\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n})(Function.prototype, TO_STRING, function toString() {\n return typeof this == 'function' && this[SRC] || $toString.call(this);\n});\n", + "// Works with __proto__ only. Old v8 can't work with null proto objects.\n/* eslint-disable no-proto */\nvar isObject = require('./_is-object');\nvar anObject = require('./_an-object');\nvar check = function (O, proto) {\n anObject(O);\n if (!isObject(proto) && proto !== null) throw TypeError(proto + \": can't set as prototype!\");\n};\nmodule.exports = {\n set: Object.setPrototypeOf || ('__proto__' in {} ? // eslint-disable-line\n function (test, buggy, set) {\n try {\n set = require('./_ctx')(Function.call, require('./_object-gopd').f(Object.prototype, '__proto__').set, 2);\n set(test, []);\n buggy = !(test instanceof Array);\n } catch (e) { buggy = true; }\n return function setPrototypeOf(O, proto) {\n check(O, proto);\n if (buggy) O.__proto__ = proto;\n else set(O, proto);\n return O;\n };\n }({}, false) : undefined),\n check: check\n};\n", + "var shared = require('./_shared')('keys');\nvar uid = require('./_uid');\nmodule.exports = function (key) {\n return shared[key] || (shared[key] = uid(key));\n};\n", + "var core = require('./_core');\nvar global = require('./_global');\nvar SHARED = '__core-js_shared__';\nvar store = global[SHARED] || (global[SHARED] = {});\n\n(module.exports = function (key, value) {\n return store[key] || (store[key] = value !== undefined ? value : {});\n})('versions', []).push({\n version: core.version,\n mode: require('./_library') ? 'pure' : 'global',\n copyright: '© 2018 Denis Pushkarev (zloirock.ru)'\n});\n", + "'use strict';\nvar toInteger = require('./_to-integer');\nvar defined = require('./_defined');\n\nmodule.exports = function repeat(count) {\n var str = String(defined(this));\n var res = '';\n var n = toInteger(count);\n if (n < 0 || n == Infinity) throw RangeError(\"Count can't be negative\");\n for (;n > 0; (n >>>= 1) && (str += str)) if (n & 1) res += str;\n return res;\n};\n", + "var $export = require('./_export');\nvar defined = require('./_defined');\nvar fails = require('./_fails');\nvar spaces = require('./_string-ws');\nvar space = '[' + spaces + ']';\nvar non = '\\u200b\\u0085';\nvar ltrim = RegExp('^' + space + space + '*');\nvar rtrim = RegExp(space + space + '*$');\n\nvar exporter = function (KEY, exec, ALIAS) {\n var exp = {};\n var FORCE = fails(function () {\n return !!spaces[KEY]() || non[KEY]() != non;\n });\n var fn = exp[KEY] = FORCE ? exec(trim) : spaces[KEY];\n if (ALIAS) exp[ALIAS] = fn;\n $export($export.P + $export.F * FORCE, 'String', exp);\n};\n\n// 1 -> String#trimLeft\n// 2 -> String#trimRight\n// 3 -> String#trim\nvar trim = exporter.trim = function (string, TYPE) {\n string = String(defined(string));\n if (TYPE & 1) string = string.replace(ltrim, '');\n if (TYPE & 2) string = string.replace(rtrim, '');\n return string;\n};\n\nmodule.exports = exporter;\n", + "module.exports = '\\x09\\x0A\\x0B\\x0C\\x0D\\x20\\xA0\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003' +\n '\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\\u2029\\uFEFF';\n", + "var toInteger = require('./_to-integer');\nvar max = Math.max;\nvar min = Math.min;\nmodule.exports = function (index, length) {\n index = toInteger(index);\n return index < 0 ? max(index + length, 0) : min(index, length);\n};\n", + "// 7.1.4 ToInteger\nvar ceil = Math.ceil;\nvar floor = Math.floor;\nmodule.exports = function (it) {\n return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);\n};\n", + "// to indexed object, toObject with fallback for non-array-like ES3 strings\nvar IObject = require('./_iobject');\nvar defined = require('./_defined');\nmodule.exports = function (it) {\n return IObject(defined(it));\n};\n", + "// 7.1.15 ToLength\nvar toInteger = require('./_to-integer');\nvar min = Math.min;\nmodule.exports = function (it) {\n return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991\n};\n", + "// 7.1.1 ToPrimitive(input [, PreferredType])\nvar isObject = require('./_is-object');\n// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n// and the second argument - flag - preferred type is a string\nmodule.exports = function (it, S) {\n if (!isObject(it)) return it;\n var fn, val;\n if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val;\n if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n throw TypeError(\"Can't convert object to primitive value\");\n};\n", + "var id = 0;\nvar px = Math.random();\nmodule.exports = function (key) {\n return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));\n};\n", + "// 20.2.2.3 Math.acosh(x)\nvar $export = require('./_export');\nvar log1p = require('./_math-log1p');\nvar sqrt = Math.sqrt;\nvar $acosh = Math.acosh;\n\n$export($export.S + $export.F * !($acosh\n // V8 bug: https://code.google.com/p/v8/issues/detail?id=3509\n && Math.floor($acosh(Number.MAX_VALUE)) == 710\n // Tor Browser bug: Math.acosh(Infinity) -> NaN\n && $acosh(Infinity) == Infinity\n), 'Math', {\n acosh: function acosh(x) {\n return (x = +x) < 1 ? NaN : x > 94906265.62425156\n ? Math.log(x) + Math.LN2\n : log1p(x - 1 + sqrt(x - 1) * sqrt(x + 1));\n }\n});\n", + "// 20.2.2.5 Math.asinh(x)\nvar $export = require('./_export');\nvar $asinh = Math.asinh;\n\nfunction asinh(x) {\n return !isFinite(x = +x) || x == 0 ? x : x < 0 ? -asinh(-x) : Math.log(x + Math.sqrt(x * x + 1));\n}\n\n// Tor Browser bug: Math.asinh(0) -> -0\n$export($export.S + $export.F * !($asinh && 1 / $asinh(0) > 0), 'Math', { asinh: asinh });\n", + "// 20.2.2.7 Math.atanh(x)\nvar $export = require('./_export');\nvar $atanh = Math.atanh;\n\n// Tor Browser bug: Math.atanh(-0) -> 0\n$export($export.S + $export.F * !($atanh && 1 / $atanh(-0) < 0), 'Math', {\n atanh: function atanh(x) {\n return (x = +x) == 0 ? x : Math.log((1 + x) / (1 - x)) / 2;\n }\n});\n", + "// 20.2.2.9 Math.cbrt(x)\nvar $export = require('./_export');\nvar sign = require('./_math-sign');\n\n$export($export.S, 'Math', {\n cbrt: function cbrt(x) {\n return sign(x = +x) * Math.pow(Math.abs(x), 1 / 3);\n }\n});\n", + "// 20.2.2.11 Math.clz32(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', {\n clz32: function clz32(x) {\n return (x >>>= 0) ? 31 - Math.floor(Math.log(x + 0.5) * Math.LOG2E) : 32;\n }\n});\n", + "// 20.2.2.12 Math.cosh(x)\nvar $export = require('./_export');\nvar exp = Math.exp;\n\n$export($export.S, 'Math', {\n cosh: function cosh(x) {\n return (exp(x = +x) + exp(-x)) / 2;\n }\n});\n", + "// 20.2.2.14 Math.expm1(x)\nvar $export = require('./_export');\nvar $expm1 = require('./_math-expm1');\n\n$export($export.S + $export.F * ($expm1 != Math.expm1), 'Math', { expm1: $expm1 });\n", + "// 20.2.2.16 Math.fround(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', { fround: require('./_math-fround') });\n", + "// 20.2.2.17 Math.hypot([value1[, value2[, … ]]])\nvar $export = require('./_export');\nvar abs = Math.abs;\n\n$export($export.S, 'Math', {\n hypot: function hypot(value1, value2) { // eslint-disable-line no-unused-vars\n var sum = 0;\n var i = 0;\n var aLen = arguments.length;\n var larg = 0;\n var arg, div;\n while (i < aLen) {\n arg = abs(arguments[i++]);\n if (larg < arg) {\n div = larg / arg;\n sum = sum * div * div + 1;\n larg = arg;\n } else if (arg > 0) {\n div = arg / larg;\n sum += div * div;\n } else sum += arg;\n }\n return larg === Infinity ? Infinity : larg * Math.sqrt(sum);\n }\n});\n", + "// 20.2.2.18 Math.imul(x, y)\nvar $export = require('./_export');\nvar $imul = Math.imul;\n\n// some WebKit versions fails with big numbers, some has wrong arity\n$export($export.S + $export.F * require('./_fails')(function () {\n return $imul(0xffffffff, 5) != -5 || $imul.length != 2;\n}), 'Math', {\n imul: function imul(x, y) {\n var UINT16 = 0xffff;\n var xn = +x;\n var yn = +y;\n var xl = UINT16 & xn;\n var yl = UINT16 & yn;\n return 0 | xl * yl + ((UINT16 & xn >>> 16) * yl + xl * (UINT16 & yn >>> 16) << 16 >>> 0);\n }\n});\n", + "// 20.2.2.21 Math.log10(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', {\n log10: function log10(x) {\n return Math.log(x) * Math.LOG10E;\n }\n});\n", + "// 20.2.2.20 Math.log1p(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', { log1p: require('./_math-log1p') });\n", + "// 20.2.2.22 Math.log2(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', {\n log2: function log2(x) {\n return Math.log(x) / Math.LN2;\n }\n});\n", + "// 20.2.2.28 Math.sign(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', { sign: require('./_math-sign') });\n", + "// 20.2.2.30 Math.sinh(x)\nvar $export = require('./_export');\nvar expm1 = require('./_math-expm1');\nvar exp = Math.exp;\n\n// V8 near Chromium 38 has a problem with very small numbers\n$export($export.S + $export.F * require('./_fails')(function () {\n return !Math.sinh(-2e-17) != -2e-17;\n}), 'Math', {\n sinh: function sinh(x) {\n return Math.abs(x = +x) < 1\n ? (expm1(x) - expm1(-x)) / 2\n : (exp(x - 1) - exp(-x - 1)) * (Math.E / 2);\n }\n});\n", + "// 20.2.2.33 Math.tanh(x)\nvar $export = require('./_export');\nvar expm1 = require('./_math-expm1');\nvar exp = Math.exp;\n\n$export($export.S, 'Math', {\n tanh: function tanh(x) {\n var a = expm1(x = +x);\n var b = expm1(-x);\n return a == Infinity ? 1 : b == Infinity ? -1 : (a - b) / (exp(x) + exp(-x));\n }\n});\n", + "// 20.2.2.34 Math.trunc(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', {\n trunc: function trunc(it) {\n return (it > 0 ? Math.floor : Math.ceil)(it);\n }\n});\n", + "'use strict';\nvar global = require('./_global');\nvar has = require('./_has');\nvar cof = require('./_cof');\nvar inheritIfRequired = require('./_inherit-if-required');\nvar toPrimitive = require('./_to-primitive');\nvar fails = require('./_fails');\nvar gOPN = require('./_object-gopn').f;\nvar gOPD = require('./_object-gopd').f;\nvar dP = require('./_object-dp').f;\nvar $trim = require('./_string-trim').trim;\nvar NUMBER = 'Number';\nvar $Number = global[NUMBER];\nvar Base = $Number;\nvar proto = $Number.prototype;\n// Opera ~12 has broken Object#toString\nvar BROKEN_COF = cof(require('./_object-create')(proto)) == NUMBER;\nvar TRIM = 'trim' in String.prototype;\n\n// 7.1.3 ToNumber(argument)\nvar toNumber = function (argument) {\n var it = toPrimitive(argument, false);\n if (typeof it == 'string' && it.length > 2) {\n it = TRIM ? it.trim() : $trim(it, 3);\n var first = it.charCodeAt(0);\n var third, radix, maxCode;\n if (first === 43 || first === 45) {\n third = it.charCodeAt(2);\n if (third === 88 || third === 120) return NaN; // Number('+0x1') should be NaN, old V8 fix\n } else if (first === 48) {\n switch (it.charCodeAt(1)) {\n case 66: case 98: radix = 2; maxCode = 49; break; // fast equal /^0b[01]+$/i\n case 79: case 111: radix = 8; maxCode = 55; break; // fast equal /^0o[0-7]+$/i\n default: return +it;\n }\n for (var digits = it.slice(2), i = 0, l = digits.length, code; i < l; i++) {\n code = digits.charCodeAt(i);\n // parseInt parses a string to a first unavailable symbol\n // but ToNumber should return NaN if a string contains unavailable symbols\n if (code < 48 || code > maxCode) return NaN;\n } return parseInt(digits, radix);\n }\n } return +it;\n};\n\nif (!$Number(' 0o1') || !$Number('0b1') || $Number('+0x1')) {\n $Number = function Number(value) {\n var it = arguments.length < 1 ? 0 : value;\n var that = this;\n return that instanceof $Number\n // check on 1..constructor(foo) case\n && (BROKEN_COF ? fails(function () { proto.valueOf.call(that); }) : cof(that) != NUMBER)\n ? inheritIfRequired(new Base(toNumber(it)), that, $Number) : toNumber(it);\n };\n for (var keys = require('./_descriptors') ? gOPN(Base) : (\n // ES3:\n 'MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,' +\n // ES6 (in case, if modules with ES6 Number statics required before):\n 'EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,' +\n 'MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger'\n ).split(','), j = 0, key; keys.length > j; j++) {\n if (has(Base, key = keys[j]) && !has($Number, key)) {\n dP($Number, key, gOPD(Base, key));\n }\n }\n $Number.prototype = proto;\n proto.constructor = $Number;\n require('./_redefine')(global, NUMBER, $Number);\n}\n", + "// 20.1.2.1 Number.EPSILON\nvar $export = require('./_export');\n\n$export($export.S, 'Number', { EPSILON: Math.pow(2, -52) });\n", + "// 20.1.2.2 Number.isFinite(number)\nvar $export = require('./_export');\nvar _isFinite = require('./_global').isFinite;\n\n$export($export.S, 'Number', {\n isFinite: function isFinite(it) {\n return typeof it == 'number' && _isFinite(it);\n }\n});\n", + "// 20.1.2.3 Number.isInteger(number)\nvar $export = require('./_export');\n\n$export($export.S, 'Number', { isInteger: require('./_is-integer') });\n", + "// 20.1.2.4 Number.isNaN(number)\nvar $export = require('./_export');\n\n$export($export.S, 'Number', {\n isNaN: function isNaN(number) {\n // eslint-disable-next-line no-self-compare\n return number != number;\n }\n});\n", + "// 20.1.2.5 Number.isSafeInteger(number)\nvar $export = require('./_export');\nvar isInteger = require('./_is-integer');\nvar abs = Math.abs;\n\n$export($export.S, 'Number', {\n isSafeInteger: function isSafeInteger(number) {\n return isInteger(number) && abs(number) <= 0x1fffffffffffff;\n }\n});\n", + "// 20.1.2.6 Number.MAX_SAFE_INTEGER\nvar $export = require('./_export');\n\n$export($export.S, 'Number', { MAX_SAFE_INTEGER: 0x1fffffffffffff });\n", + "// 20.1.2.10 Number.MIN_SAFE_INTEGER\nvar $export = require('./_export');\n\n$export($export.S, 'Number', { MIN_SAFE_INTEGER: -0x1fffffffffffff });\n", + "var $export = require('./_export');\nvar $parseFloat = require('./_parse-float');\n// 20.1.2.12 Number.parseFloat(string)\n$export($export.S + $export.F * (Number.parseFloat != $parseFloat), 'Number', { parseFloat: $parseFloat });\n", + "var $export = require('./_export');\nvar $parseInt = require('./_parse-int');\n// 20.1.2.13 Number.parseInt(string, radix)\n$export($export.S + $export.F * (Number.parseInt != $parseInt), 'Number', { parseInt: $parseInt });\n", + "'use strict';\nvar $export = require('./_export');\nvar toInteger = require('./_to-integer');\nvar aNumberValue = require('./_a-number-value');\nvar repeat = require('./_string-repeat');\nvar $toFixed = 1.0.toFixed;\nvar floor = Math.floor;\nvar data = [0, 0, 0, 0, 0, 0];\nvar ERROR = 'Number.toFixed: incorrect invocation!';\nvar ZERO = '0';\n\nvar multiply = function (n, c) {\n var i = -1;\n var c2 = c;\n while (++i < 6) {\n c2 += n * data[i];\n data[i] = c2 % 1e7;\n c2 = floor(c2 / 1e7);\n }\n};\nvar divide = function (n) {\n var i = 6;\n var c = 0;\n while (--i >= 0) {\n c += data[i];\n data[i] = floor(c / n);\n c = (c % n) * 1e7;\n }\n};\nvar numToString = function () {\n var i = 6;\n var s = '';\n while (--i >= 0) {\n if (s !== '' || i === 0 || data[i] !== 0) {\n var t = String(data[i]);\n s = s === '' ? t : s + repeat.call(ZERO, 7 - t.length) + t;\n }\n } return s;\n};\nvar pow = function (x, n, acc) {\n return n === 0 ? acc : n % 2 === 1 ? pow(x, n - 1, acc * x) : pow(x * x, n / 2, acc);\n};\nvar log = function (x) {\n var n = 0;\n var x2 = x;\n while (x2 >= 4096) {\n n += 12;\n x2 /= 4096;\n }\n while (x2 >= 2) {\n n += 1;\n x2 /= 2;\n } return n;\n};\n\n$export($export.P + $export.F * (!!$toFixed && (\n 0.00008.toFixed(3) !== '0.000' ||\n 0.9.toFixed(0) !== '1' ||\n 1.255.toFixed(2) !== '1.25' ||\n 1000000000000000128.0.toFixed(0) !== '1000000000000000128'\n) || !require('./_fails')(function () {\n // V8 ~ Android 4.3-\n $toFixed.call({});\n})), 'Number', {\n toFixed: function toFixed(fractionDigits) {\n var x = aNumberValue(this, ERROR);\n var f = toInteger(fractionDigits);\n var s = '';\n var m = ZERO;\n var e, z, j, k;\n if (f < 0 || f > 20) throw RangeError(ERROR);\n // eslint-disable-next-line no-self-compare\n if (x != x) return 'NaN';\n if (x <= -1e21 || x >= 1e21) return String(x);\n if (x < 0) {\n s = '-';\n x = -x;\n }\n if (x > 1e-21) {\n e = log(x * pow(2, 69, 1)) - 69;\n z = e < 0 ? x * pow(2, -e, 1) : x / pow(2, e, 1);\n z *= 0x10000000000000;\n e = 52 - e;\n if (e > 0) {\n multiply(0, z);\n j = f;\n while (j >= 7) {\n multiply(1e7, 0);\n j -= 7;\n }\n multiply(pow(10, j, 1), 0);\n j = e - 1;\n while (j >= 23) {\n divide(1 << 23);\n j -= 23;\n }\n divide(1 << j);\n multiply(1, 1);\n divide(2);\n m = numToString();\n } else {\n multiply(0, z);\n multiply(1 << -e, 0);\n m = numToString() + repeat.call(ZERO, f);\n }\n }\n if (f > 0) {\n k = m.length;\n m = s + (k <= f ? '0.' + repeat.call(ZERO, f - k) + m : m.slice(0, k - f) + '.' + m.slice(k - f));\n } else {\n m = s + m;\n } return m;\n }\n});\n", + "'use strict';\nvar $export = require('./_export');\nvar $fails = require('./_fails');\nvar aNumberValue = require('./_a-number-value');\nvar $toPrecision = 1.0.toPrecision;\n\n$export($export.P + $export.F * ($fails(function () {\n // IE7-\n return $toPrecision.call(1, undefined) !== '1';\n}) || !$fails(function () {\n // V8 ~ Android 4.3-\n $toPrecision.call({});\n})), 'Number', {\n toPrecision: function toPrecision(precision) {\n var that = aNumberValue(this, 'Number#toPrecision: incorrect invocation!');\n return precision === undefined ? $toPrecision.call(that) : $toPrecision.call(that, precision);\n }\n});\n", "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports['default'] = camelize;\nvar regExp = /[-\\s]+(.)?/g;\n\n/**\n * Convert dash separated strings to camel cased.\n *\n * @param {String} str\n * @return {String}\n */\nfunction camelize(str) {\n return str.replace(regExp, toUpper);\n}\n\nfunction toUpper(match, c) {\n return c ? c.toUpperCase() : '';\n}", "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.supportedValue = exports.supportedProperty = exports.prefix = undefined;\n\nvar _prefix = require('./prefix');\n\nvar _prefix2 = _interopRequireDefault(_prefix);\n\nvar _supportedProperty = require('./supported-property');\n\nvar _supportedProperty2 = _interopRequireDefault(_supportedProperty);\n\nvar _supportedValue = require('./supported-value');\n\nvar _supportedValue2 = _interopRequireDefault(_supportedValue);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nexports['default'] = {\n prefix: _prefix2['default'],\n supportedProperty: _supportedProperty2['default'],\n supportedValue: _supportedValue2['default']\n}; /**\n * CSS Vendor prefix detection and property feature testing.\n *\n * @copyright Oleg Slobodskoi 2015\n * @website https://github.com/jsstyles/css-vendor\n * @license MIT\n */\n\nexports.prefix = _prefix2['default'];\nexports.supportedProperty = _supportedProperty2['default'];\nexports.supportedValue = _supportedValue2['default'];", "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _isInBrowser = require('is-in-browser');\n\nvar _isInBrowser2 = _interopRequireDefault(_isInBrowser);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nvar js = ''; /**\n * Export javascript style and css style vendor prefixes.\n * Based on \"transform\" support test.\n */\n\nvar css = '';\n\n// We should not do anything if required serverside.\nif (_isInBrowser2['default']) {\n // Order matters. We need to check Webkit the last one because\n // other vendors use to add Webkit prefixes to some properties\n var jsCssMap = {\n Moz: '-moz-',\n // IE did it wrong again ...\n ms: '-ms-',\n O: '-o-',\n Webkit: '-webkit-'\n };\n var style = document.createElement('p').style;\n var testProp = 'Transform';\n\n for (var key in jsCssMap) {\n if (key + testProp in style) {\n js = key;\n css = jsCssMap[key];\n break;\n }\n }\n}\n\n/**\n * Vendor prefix string for the current browser.\n *\n * @type {{js: String, css: String}}\n * @api public\n */\nexports['default'] = { js: js, css: css };", - "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports['default'] = supportedProperty;\n\nvar _isInBrowser = require('is-in-browser');\n\nvar _isInBrowser2 = _interopRequireDefault(_isInBrowser);\n\nvar _prefix = require('./prefix');\n\nvar _prefix2 = _interopRequireDefault(_prefix);\n\nvar _camelize = require('./camelize');\n\nvar _camelize2 = _interopRequireDefault(_camelize);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nvar el = void 0;\nvar cache = {};\n\nif (_isInBrowser2['default']) {\n el = document.createElement('p');\n\n /**\n * We test every property on vendor prefix requirement.\n * Once tested, result is cached. It gives us up to 70% perf boost.\n * http://jsperf.com/element-style-object-access-vs-plain-object\n *\n * Prefill cache with known css properties to reduce amount of\n * properties we need to feature test at runtime.\n * http://davidwalsh.name/vendor-prefix\n */\n var computed = window.getComputedStyle(document.documentElement, '');\n for (var key in computed) {\n if (!isNaN(key)) cache[computed[key]] = computed[key];\n }\n}\n\n/**\n * Test if a property is supported, returns supported property with vendor\n * prefix if required. Returns ` + ("`" + `false`))) + (("`" + (` if not supported.\n *\n * @param {String} prop dash separated\n * @return {String|Boolean}\n * @api public\n */\nfunction supportedProperty(prop) {\n // For server-side rendering.\n if (!el) return prop;\n\n // We have not tested this prop yet, lets do the test.\n if (cache[prop] != null) return cache[prop];\n\n // Camelization is required because we can't test using\n // css syntax for e.g. in FF.\n // Test if property is supported as it is.\n if ((0, _camelize2['default'])(prop) in el.style) {\n cache[prop] = prop;\n }\n // Test if property is supported with vendor prefix.\n else if (_prefix2['default'].js + (0, _camelize2['default'])('-' + prop) in el.style) {\n cache[prop] = _prefix2['default'].css + prop;\n } else {\n cache[prop] = false;\n }\n\n return cache[prop];\n}", - "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports['default'] = supportedValue;\n\nvar _isInBrowser = require('is-in-browser');\n\nvar _isInBrowser2 = _interopRequireDefault(_isInBrowser);\n\nvar _prefix = require('./prefix');\n\nvar _prefix2 = _interopRequireDefault(_prefix);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nvar cache = {};\nvar el = void 0;\n\nif (_isInBrowser2['default']) el = document.createElement('p');\n\n/**\n * Returns prefixed value if needed. Returns ` + "`")) + (`false` + ("`" + ` if value is not supported.\n *\n * @param {String} property\n * @param {String} value\n * @return {String|Boolean}\n * @api public\n */\nfunction supportedValue(property, value) {\n // For server-side rendering.\n if (!el) return value;\n\n // It is a string or a number as a string like '1'.\n // We want only prefixable values here.\n if (typeof value !== 'string' || !isNaN(parseInt(value, 10))) return value;\n\n var cacheKey = property + value;\n\n if (cache[cacheKey] != null) return cache[cacheKey];\n\n // IE can even throw an error in some cases, for e.g. style.content = 'bar'\n try {\n // Test value as it is.\n el.style[property] = value;\n } catch (err) {\n cache[cacheKey] = false;\n return false;\n }\n\n // Value is supported as it is.\n if (el.style[property] !== '') {\n cache[cacheKey] = value;\n } else {\n // Test value with vendor prefix.\n value = _prefix2['default'].css + value;\n\n // Hardcode test to convert \"flex\" to \"-ms-flexbox\" for IE10.\n if (value === '-ms-flex') value = '-ms-flexbox';\n\n el.style[property] = value;\n\n // Value is supported with vendor prefix.\n if (el.style[property] !== '') cache[cacheKey] = value;\n }\n\n if (!cache[cacheKey]) cache[cacheKey] = false;\n\n // Reset style value.\n el.style[property] = '';\n\n return cache[cacheKey];\n}", + "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports['default'] = supportedProperty;\n\nvar _isInBrowser = require('is-in-browser');\n\nvar _isInBrowser2 = _interopRequireDefault(_isInBrowser);\n\nvar _prefix = require('./prefix');\n\nvar _prefix2 = _interopRequireDefault(_prefix);\n\nvar _camelize = require('./camelize');\n\nvar _camelize2 = _interopRequireDefault(_camelize);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nvar el = void 0;\nvar cache = {};\n\nif (_isInBrowser2['default']) {\n el = document.createElement('p');\n\n /**\n * We test every property on vendor prefix requirement.\n * Once tested, result is cached. It gives us up to 70% perf boost.\n * http://jsperf.com/element-style-object-access-vs-plain-object\n *\n * Prefill cache with known css properties to reduce amount of\n * properties we need to feature test at runtime.\n * http://davidwalsh.name/vendor-prefix\n */\n var computed = window.getComputedStyle(document.documentElement, '');\n for (var key in computed) {\n if (!isNaN(key)) cache[computed[key]] = computed[key];\n }\n}\n\n/**\n * Test if a property is supported, returns supported property with vendor\n * prefix if required. Returns `))) + (("`" + (`false` + "`")) + (` if not supported.\n *\n * @param {String} prop dash separated\n * @return {String|Boolean}\n * @api public\n */\nfunction supportedProperty(prop) {\n // For server-side rendering.\n if (!el) return prop;\n\n // We have not tested this prop yet, lets do the test.\n if (cache[prop] != null) return cache[prop];\n\n // Camelization is required because we can't test using\n // css syntax for e.g. in FF.\n // Test if property is supported as it is.\n if ((0, _camelize2['default'])(prop) in el.style) {\n cache[prop] = prop;\n }\n // Test if property is supported with vendor prefix.\n else if (_prefix2['default'].js + (0, _camelize2['default'])('-' + prop) in el.style) {\n cache[prop] = _prefix2['default'].css + prop;\n } else {\n cache[prop] = false;\n }\n\n return cache[prop];\n}", + "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports['default'] = supportedValue;\n\nvar _isInBrowser = require('is-in-browser');\n\nvar _isInBrowser2 = _interopRequireDefault(_isInBrowser);\n\nvar _prefix = require('./prefix');\n\nvar _prefix2 = _interopRequireDefault(_prefix);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nvar cache = {};\nvar el = void 0;\n\nif (_isInBrowser2['default']) el = document.createElement('p');\n\n/**\n * Returns prefixed value if needed. Returns ` + ("`" + `false`)))) + ((("`" + (` if value is not supported.\n *\n * @param {String} property\n * @param {String} value\n * @return {String|Boolean}\n * @api public\n */\nfunction supportedValue(property, value) {\n // For server-side rendering.\n if (!el) return value;\n\n // It is a string or a number as a string like '1'.\n // We want only prefixable values here.\n if (typeof value !== 'string' || !isNaN(parseInt(value, 10))) return value;\n\n var cacheKey = property + value;\n\n if (cache[cacheKey] != null) return cache[cacheKey];\n\n // IE can even throw an error in some cases, for e.g. style.content = 'bar'\n try {\n // Test value as it is.\n el.style[property] = value;\n } catch (err) {\n cache[cacheKey] = false;\n return false;\n }\n\n // Value is supported as it is.\n if (el.style[property] !== '') {\n cache[cacheKey] = value;\n } else {\n // Test value with vendor prefix.\n value = _prefix2['default'].css + value;\n\n // Hardcode test to convert \"flex\" to \"-ms-flexbox\" for IE10.\n if (value === '-ms-flex') value = '-ms-flexbox';\n\n el.style[property] = value;\n\n // Value is supported with vendor prefix.\n if (el.style[property] !== '') cache[cacheKey] = value;\n }\n\n if (!cache[cacheKey]) cache[cacheKey] = false;\n\n // Reset style value.\n el.style[property] = '';\n\n return cache[cacheKey];\n}", "export default function(a, b) {\n return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n}\n", "import ascending from \"./ascending\";\n\nexport default function(compare) {\n if (compare.length === 1) compare = ascendingComparator(compare);\n return {\n left: function(a, x, lo, hi) {\n if (lo == null) lo = 0;\n if (hi == null) hi = a.length;\n while (lo < hi) {\n var mid = lo + hi >>> 1;\n if (compare(a[mid], x) < 0) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n },\n right: function(a, x, lo, hi) {\n if (lo == null) lo = 0;\n if (hi == null) hi = a.length;\n while (lo < hi) {\n var mid = lo + hi >>> 1;\n if (compare(a[mid], x) > 0) hi = mid;\n else lo = mid + 1;\n }\n return lo;\n }\n };\n}\n\nfunction ascendingComparator(f) {\n return function(d, x) {\n return ascending(f(d), x);\n };\n}\n", "import ascending from \"./ascending\";\nimport bisector from \"./bisector\";\n\nvar ascendingBisect = bisector(ascending);\nexport var bisectRight = ascendingBisect.right;\nexport var bisectLeft = ascendingBisect.left;\nexport default bisectRight;\n", @@ -37515,13 +38119,13 @@ var _bundleJsMap = []byte(((((((((((((`{ "import none from \"./none\";\n\nexport default function(series, order) {\n if (!((n = series.length) > 0)) return;\n for (var j = 0, s0 = series[order[0]], n, m = s0.length; j < m; ++j) {\n for (var i = 0, y = 0; i < n; ++i) y += series[i][j][1] || 0;\n s0[j][1] += s0[j][0] = -y / 2;\n }\n none(series, order);\n}\n", "import none from \"./none\";\n\nexport default function(series, order) {\n if (!((n = series.length) > 0) || !((m = (s0 = series[order[0]]).length) > 0)) return;\n for (var y = 0, j = 1, s0, m, n; j < m; ++j) {\n for (var i = 0, s1 = 0, s2 = 0; i < n; ++i) {\n var si = series[order[i]],\n sij0 = si[j][1] || 0,\n sij1 = si[j - 1][1] || 0,\n s3 = (sij0 - sij1) / 2;\n for (var k = 0; k < i; ++k) {\n var sk = series[order[k]],\n skj0 = sk[j][1] || 0,\n skj1 = sk[j - 1][1] || 0;\n s3 += skj0 - skj1;\n }\n s1 += sij0, s2 += s3 * sij0;\n }\n s0[j - 1][1] += s0[j - 1][0] = y;\n if (s1) y -= s2 / s1;\n }\n s0[j - 1][1] += s0[j - 1][0] = y;\n none(series, order);\n}\n", "export {default as arc} from \"./arc\";\nexport {default as area} from \"./area\";\nexport {default as line} from \"./line\";\nexport {default as pie} from \"./pie\";\nexport {default as areaRadial, default as radialArea} from \"./areaRadial\"; // Note: radialArea is deprecated!\nexport {default as lineRadial, default as radialLine} from \"./lineRadial\"; // Note: radialLine is deprecated!\nexport {default as pointRadial} from \"./pointRadial\";\nexport {linkHorizontal, linkVertical, linkRadial} from \"./link/index\";\n\nexport {default as symbol, symbols} from \"./symbol\";\nexport {default as symbolCircle} from \"./symbol/circle\";\nexport {default as symbolCross} from \"./symbol/cross\";\nexport {default as symbolDiamond} from \"./symbol/diamond\";\nexport {default as symbolSquare} from \"./symbol/square\";\nexport {default as symbolStar} from \"./symbol/star\";\nexport {default as symbolTriangle} from \"./symbol/triangle\";\nexport {default as symbolWye} from \"./symbol/wye\";\n\nexport {default as curveBasisClosed} from \"./curve/basisClosed\";\nexport {default as curveBasisOpen} from \"./curve/basisOpen\";\nexport {default as curveBasis} from \"./curve/basis\";\nexport {default as curveBundle} from \"./curve/bundle\";\nexport {default as curveCardinalClosed} from \"./curve/cardinalClosed\";\nexport {default as curveCardinalOpen} from \"./curve/cardinalOpen\";\nexport {default as curveCardinal} from \"./curve/cardinal\";\nexport {default as curveCatmullRomClosed} from \"./curve/catmullRomClosed\";\nexport {default as curveCatmullRomOpen} from \"./curve/catmullRomOpen\";\nexport {default as curveCatmullRom} from \"./curve/catmullRom\";\nexport {default as curveLinearClosed} from \"./curve/linearClosed\";\nexport {default as curveLinear} from \"./curve/linear\";\nexport {monotoneX as curveMonotoneX, monotoneY as curveMonotoneY} from \"./curve/monotone\";\nexport {default as curveNatural} from \"./curve/natural\";\nexport {default as curveStep, stepAfter as curveStepAfter, stepBefore as curveStepBefore} from \"./curve/step\";\n\nexport {default as stack} from \"./stack\";\nexport {default as stackOffsetExpand} from \"./offset/expand\";\nexport {default as stackOffsetDiverging} from \"./offset/diverging\";\nexport {default as stackOffsetNone} from \"./offset/none\";\nexport {default as stackOffsetSilhouette} from \"./offset/silhouette\";\nexport {default as stackOffsetWiggle} from \"./offset/wiggle\";\nexport {default as stackOrderAscending} from \"./order/ascending\";\nexport {default as stackOrderDescending} from \"./order/descending\";\nexport {default as stackOrderInsideOut} from \"./order/insideOut\";\nexport {default as stackOrderNone} from \"./order/none\";\nexport {default as stackOrderReverse} from \"./order/reverse\";\n", - "/*! decimal.js-light v2.5.0 https://github.com/MikeMcl/decimal.js-light/LICENCE */\r\n;(function (globalScope) {\r\n 'use strict';\r\n\r\n\r\n /*\r\n * decimal.js-light v2.5.0\r\n * An arbitrary-precision Decimal type for JavaScript.\r\n * https://github.com/MikeMcl/decimal.js-light\r\n * Copyright (c) 2018 Michael Mclaughlin \r\n * MIT Expat Licence\r\n */\r\n\r\n\r\n // ----------------------------------- EDITABLE DEFAULTS ------------------------------------ //\r\n\r\n\r\n // The limit on the value of `)))) + ((("`" + `precision`) + ("`" + (`, and on the value of the first argument to\r\n // ` + "`"))) + ((`toDecimalPlaces` + ("`" + `, `)) + ("`" + (`toExponential` + "`"))))) + ((((`, ` + "`") + (`toFixed` + ("`" + `, `))) + (("`" + (`toPrecision` + "`")) + (` and ` + ("`" + `toSignificantDigits`)))) + ((("`" + (`.\r\n var MAX_DIGITS = 1e9, // 0 to 1e9\r\n\r\n\r\n // The initial configuration properties of the Decimal constructor.\r\n Decimal = {\r\n\r\n // These values must be integers within the stated ranges (inclusive).\r\n // Most of these values can be changed during run-time using ` + "`")) + (`Decimal.config` + ("`" + `.\r\n\r\n // The maximum number of significant digits of the result of a calculation or base conversion.\r\n // E.g. `))) + (("`" + (`Decimal.config({ precision: 20 });` + "`")) + (`\r\n precision: 20, // 1 to MAX_DIGITS\r\n\r\n // The rounding mode used by default by ` + ("`" + `toInteger`))))))) + (((((("`" + `, `) + ("`" + (`toDecimalPlaces` + "`"))) + ((`, ` + ("`" + `toExponential`)) + ("`" + (`,\r\n // ` + "`")))) + (((`toFixed` + "`") + (`, ` + ("`" + `toPrecision`))) + (("`" + (` and ` + "`")) + (`toSignificantDigits` + ("`" + `.\r\n //\r\n // ROUND_UP 0 Away from zero.\r\n // ROUND_DOWN 1 Towards zero.\r\n // ROUND_CEIL 2 Towards +Infinity.\r\n // ROUND_FLOOR 3 Towards -Infinity.\r\n // ROUND_HALF_UP 4 Towards nearest neighbour. If equidistant, up.\r\n // ROUND_HALF_DOWN 5 Towards nearest neighbour. If equidistant, down.\r\n // ROUND_HALF_EVEN 6 Towards nearest neighbour. If equidistant, towards even neighbour.\r\n // ROUND_HALF_CEIL 7 Towards nearest neighbour. If equidistant, towards +Infinity.\r\n // ROUND_HALF_FLOOR 8 Towards nearest neighbour. If equidistant, towards -Infinity.\r\n //\r\n // E.g.\r\n // `))))) + (((("`" + `Decimal.rounding = 4;`) + ("`" + (`\r\n // ` + "`"))) + ((`Decimal.rounding = Decimal.ROUND_HALF_UP;` + ("`" + `\r\n rounding: 4, // 0 to 8\r\n\r\n // The exponent value at and beneath which `)) + ("`" + (`toString` + "`")))) + (((` returns exponential notation.\r\n // JavaScript numbers: -7\r\n toExpNeg: -7, // 0 to -MAX_E\r\n\r\n // The exponent value at and above which ` + "`") + (`toString` + ("`" + ` returns exponential notation.\r\n // JavaScript numbers: 21\r\n toExpPos: 21, // 0 to MAX_E\r\n\r\n // The natural logarithm of 10.\r\n // 115 digits\r\n LN10: '2.302585092994045684017991454684364207601101488628772976033327900967572609677352480235997205089598298341967784042286'\r\n },\r\n\r\n\r\n // ----------------------------------- END OF EDITABLE DEFAULTS ------------------------------- //\r\n\r\n\r\n external = true,\r\n\r\n decimalError = '[DecimalError] ',\r\n invalidArgument = decimalError + 'Invalid argument: ',\r\n exponentOutOfRange = decimalError + 'Exponent out of range: ',\r\n\r\n mathfloor = Math.floor,\r\n mathpow = Math.pow,\r\n\r\n isDecimal = /^(\\d+(\\.\\d*)?|\\.\\d+)(e[+-]?\\d+)?$/i,\r\n\r\n ONE,\r\n BASE = 1e7,\r\n LOG_BASE = 7,\r\n MAX_SAFE_INTEGER = 9007199254740991,\r\n MAX_E = mathfloor(MAX_SAFE_INTEGER / LOG_BASE), // 1286742750677284\r\n\r\n // Decimal.prototype object\r\n P = {};\r\n\r\n\r\n // Decimal prototype methods\r\n\r\n\r\n /*\r\n * absoluteValue abs\r\n * comparedTo cmp\r\n * decimalPlaces dp\r\n * dividedBy div\r\n * dividedToIntegerBy idiv\r\n * equals eq\r\n * exponent\r\n * greaterThan gt\r\n * greaterThanOrEqualTo gte\r\n * isInteger isint\r\n * isNegative isneg\r\n * isPositive ispos\r\n * isZero\r\n * lessThan lt\r\n * lessThanOrEqualTo lte\r\n * logarithm log\r\n * minus sub\r\n * modulo mod\r\n * naturalExponential exp\r\n * naturalLogarithm ln\r\n * negated neg\r\n * plus add\r\n * precision sd\r\n * squareRoot sqrt\r\n * times mul\r\n * toDecimalPlaces todp\r\n * toExponential\r\n * toFixed\r\n * toInteger toint\r\n * toNumber\r\n * toPower pow\r\n * toPrecision\r\n * toSignificantDigits tosd\r\n * toString\r\n * valueOf val\r\n */\r\n\r\n\r\n /*\r\n * Return a new Decimal whose value is the absolute value of this Decimal.\r\n *\r\n */\r\n P.absoluteValue = P.abs = function () {\r\n var x = new this.constructor(this);\r\n if (x.s) x.s = 1;\r\n return x;\r\n };\r\n\r\n\r\n /*\r\n * Return\r\n * 1 if the value of this Decimal is greater than the value of `))) + (("`" + (`y` + "`")) + (`,\r\n * -1 if the value of this Decimal is less than the value of ` + ("`" + `y`)))))) + ((((("`" + `,\r\n * 0 if they have the same value\r\n *\r\n */\r\n P.comparedTo = P.cmp = function (y) {\r\n var i, j, xdL, ydL,\r\n x = this;\r\n\r\n y = new x.constructor(y);\r\n\r\n // Signs differ?\r\n if (x.s !== y.s) return x.s || -y.s;\r\n\r\n // Compare exponents.\r\n if (x.e !== y.e) return x.e > y.e ^ x.s < 0 ? 1 : -1;\r\n\r\n xdL = x.d.length;\r\n ydL = y.d.length;\r\n\r\n // Compare digit by digit.\r\n for (i = 0, j = xdL < ydL ? xdL : ydL; i < j; ++i) {\r\n if (x.d[i] !== y.d[i]) return x.d[i] > y.d[i] ^ x.s < 0 ? 1 : -1;\r\n }\r\n\r\n // Compare lengths.\r\n return xdL === ydL ? 0 : xdL > ydL ^ x.s < 0 ? 1 : -1;\r\n };\r\n\r\n\r\n /*\r\n * Return the number of decimal places of the value of this Decimal.\r\n *\r\n */\r\n P.decimalPlaces = P.dp = function () {\r\n var x = this,\r\n w = x.d.length - 1,\r\n dp = (w - x.e) * LOG_BASE;\r\n\r\n // Subtract the number of trailing zeros of the last word.\r\n w = x.d[w];\r\n if (w) for (; w % 10 == 0; w /= 10) dp--;\r\n\r\n return dp < 0 ? 0 : dp;\r\n };\r\n\r\n\r\n /*\r\n * Return a new Decimal whose value is the value of this Decimal divided by `) + ("`" + (`y` + "`"))) + ((`, truncated to\r\n * ` + ("`" + `precision`)) + ("`" + (` significant digits.\r\n *\r\n */\r\n P.dividedBy = P.div = function (y) {\r\n return divide(this, new this.constructor(y));\r\n };\r\n\r\n\r\n /*\r\n * Return a new Decimal whose value is the integer part of dividing the value of this Decimal\r\n * by the value of ` + "`")))) + (((`y` + "`") + (`, truncated to ` + ("`" + `precision`))) + (("`" + (` significant digits.\r\n *\r\n */\r\n P.dividedToIntegerBy = P.idiv = function (y) {\r\n var x = this,\r\n Ctor = x.constructor;\r\n return round(divide(x, new Ctor(y), 0, 1), Ctor.precision);\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this Decimal is equal to the value of ` + "`")) + (`y` + ("`" + `, otherwise return false.\r\n *\r\n */\r\n P.equals = P.eq = function (y) {\r\n return !this.cmp(y);\r\n };\r\n\r\n\r\n /*\r\n * Return the (base 10) exponent value of this Decimal (this.e is the base 10000000 exponent).\r\n *\r\n */\r\n P.exponent = function () {\r\n return getBase10Exponent(this);\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this Decimal is greater than the value of `))))) + (((("`" + `y`) + ("`" + (`, otherwise return\r\n * false.\r\n *\r\n */\r\n P.greaterThan = P.gt = function (y) {\r\n return this.cmp(y) > 0;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this Decimal is greater than or equal to the value of ` + "`"))) + ((`y` + ("`" + `,\r\n * otherwise return false.\r\n *\r\n */\r\n P.greaterThanOrEqualTo = P.gte = function (y) {\r\n return this.cmp(y) >= 0;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this Decimal is an integer, otherwise return false.\r\n *\r\n */\r\n P.isInteger = P.isint = function () {\r\n return this.e > this.d.length - 2;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this Decimal is negative, otherwise return false.\r\n *\r\n */\r\n P.isNegative = P.isneg = function () {\r\n return this.s < 0;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this Decimal is positive, otherwise return false.\r\n *\r\n */\r\n P.isPositive = P.ispos = function () {\r\n return this.s > 0;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this Decimal is 0, otherwise return false.\r\n *\r\n */\r\n P.isZero = function () {\r\n return this.s === 0;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this Decimal is less than `)) + ("`" + (`y` + "`")))) + (((`, otherwise return false.\r\n *\r\n */\r\n P.lessThan = P.lt = function (y) {\r\n return this.cmp(y) < 0;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this Decimal is less than or equal to ` + ("`" + `y`)) + ("`" + (`, otherwise return false.\r\n *\r\n */\r\n P.lessThanOrEqualTo = P.lte = function (y) {\r\n return this.cmp(y) < 1;\r\n };\r\n\r\n\r\n /*\r\n * Return the logarithm of the value of this Decimal to the specified base, truncated to\r\n * ` + "`"))) + ((`precision` + ("`" + ` significant digits.\r\n *\r\n * If no base is specified, return log[10](x).\r\n *\r\n * log[base](x) = ln(x) / ln(base)\r\n *\r\n * The maximum error of the result is 1 ulp (unit in the last place).\r\n *\r\n * [base] {number|string|Decimal} The base of the logarithm.\r\n *\r\n */\r\n P.logarithm = P.log = function (base) {\r\n var r,\r\n x = this,\r\n Ctor = x.constructor,\r\n pr = Ctor.precision,\r\n wpr = pr + 5;\r\n\r\n // Default base is 10.\r\n if (base === void 0) {\r\n base = new Ctor(10);\r\n } else {\r\n base = new Ctor(base);\r\n\r\n // log[-b](x) = NaN\r\n // log[0](x) = NaN\r\n // log[1](x) = NaN\r\n if (base.s < 1 || base.eq(ONE)) throw Error(decimalError + 'NaN');\r\n }\r\n\r\n // log[b](-x) = NaN\r\n // log[b](0) = -Infinity\r\n if (x.s < 1) throw Error(decimalError + (x.s ? 'NaN' : '-Infinity'));\r\n\r\n // log[b](1) = 0\r\n if (x.eq(ONE)) return new Ctor(0);\r\n\r\n external = false;\r\n r = divide(ln(x, wpr), ln(base, wpr), wpr);\r\n external = true;\r\n\r\n return round(r, pr);\r\n };\r\n\r\n\r\n /*\r\n * Return a new Decimal whose value is the value of this Decimal minus `)) + ("`" + (`y` + "`"))))))))))) + ((((((((((`, truncated to\r\n * ` + "`") + (`precision` + ("`" + ` significant digits.\r\n *\r\n */\r\n P.minus = P.sub = function (y) {\r\n var x = this;\r\n y = new x.constructor(y);\r\n return x.s == y.s ? subtract(x, y) : add(x, (y.s = -y.s, y));\r\n };\r\n\r\n\r\n /*\r\n * Return a new Decimal whose value is the value of this Decimal modulo `))) + (("`" + (`y` + "`")) + (`, truncated to\r\n * ` + ("`" + `precision`)))) + ((("`" + ` significant digits.\r\n *\r\n */\r\n P.modulo = P.mod = function (y) {\r\n var q,\r\n x = this,\r\n Ctor = x.constructor,\r\n pr = Ctor.precision;\r\n\r\n y = new Ctor(y);\r\n\r\n // x % 0 = NaN\r\n if (!y.s) throw Error(decimalError + 'NaN');\r\n\r\n // Return x if x is 0.\r\n if (!x.s) return round(new Ctor(x), pr);\r\n\r\n // Prevent rounding of intermediate calculations.\r\n external = false;\r\n q = divide(x, y, 0, 1).times(y);\r\n external = true;\r\n\r\n return x.minus(q);\r\n };\r\n\r\n\r\n /*\r\n * Return a new Decimal whose value is the natural exponential of the value of this Decimal,\r\n * i.e. the base e raised to the power the value of this Decimal, truncated to `) + ("`" + (`precision` + "`"))) + ((`\r\n * significant digits.\r\n *\r\n */\r\n P.naturalExponential = P.exp = function () {\r\n return exp(this);\r\n };\r\n\r\n\r\n /*\r\n * Return a new Decimal whose value is the natural logarithm of the value of this Decimal,\r\n * truncated to ` + ("`" + `precision`)) + ("`" + (` significant digits.\r\n *\r\n */\r\n P.naturalLogarithm = P.ln = function () {\r\n return ln(this);\r\n };\r\n\r\n\r\n /*\r\n * Return a new Decimal whose value is the value of this Decimal negated, i.e. as if multiplied by\r\n * -1.\r\n *\r\n */\r\n P.negated = P.neg = function () {\r\n var x = new this.constructor(this);\r\n x.s = -x.s || 0;\r\n return x;\r\n };\r\n\r\n\r\n /*\r\n * Return a new Decimal whose value is the value of this Decimal plus ` + "`"))))) + ((((`y` + "`") + (`, truncated to\r\n * ` + ("`" + `precision`))) + (("`" + (` significant digits.\r\n *\r\n */\r\n P.plus = P.add = function (y) {\r\n var x = this;\r\n y = new x.constructor(y);\r\n return x.s == y.s ? add(x, y) : subtract(x, (y.s = -y.s, y));\r\n };\r\n\r\n\r\n /*\r\n * Return the number of significant digits of the value of this Decimal.\r\n *\r\n * [z] {boolean|number} Whether to count integer-part trailing zeros: true, false, 1 or 0.\r\n *\r\n */\r\n P.precision = P.sd = function (z) {\r\n var e, sd, w,\r\n x = this;\r\n\r\n if (z !== void 0 && z !== !!z && z !== 1 && z !== 0) throw Error(invalidArgument + z);\r\n\r\n e = getBase10Exponent(x) + 1;\r\n w = x.d.length - 1;\r\n sd = w * LOG_BASE + 1;\r\n w = x.d[w];\r\n\r\n // If non-zero...\r\n if (w) {\r\n\r\n // Subtract the number of trailing zeros of the last word.\r\n for (; w % 10 == 0; w /= 10) sd--;\r\n\r\n // Add the number of digits of the first word.\r\n for (w = x.d[0]; w >= 10; w /= 10) sd++;\r\n }\r\n\r\n return z && e > sd ? e : sd;\r\n };\r\n\r\n\r\n /*\r\n * Return a new Decimal whose value is the square root of this Decimal, truncated to ` + "`")) + (`precision` + ("`" + `\r\n * significant digits.\r\n *\r\n */\r\n P.squareRoot = P.sqrt = function () {\r\n var e, n, pr, r, s, t, wpr,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n // Negative or zero?\r\n if (x.s < 1) {\r\n if (!x.s) return new Ctor(0);\r\n\r\n // sqrt(-x) = NaN\r\n throw Error(decimalError + 'NaN');\r\n }\r\n\r\n e = getBase10Exponent(x);\r\n external = false;\r\n\r\n // Initial estimate.\r\n s = Math.sqrt(+x);\r\n\r\n // Math.sqrt underflow/overflow?\r\n // Pass x to Math.sqrt as integer, then adjust the exponent of the result.\r\n if (s == 0 || s == 1 / 0) {\r\n n = digitsToString(x.d);\r\n if ((n.length + e) % 2 == 0) n += '0';\r\n s = Math.sqrt(n);\r\n e = mathfloor((e + 1) / 2) - (e < 0 || e % 2);\r\n\r\n if (s == 1 / 0) {\r\n n = '1e' + e;\r\n } else {\r\n n = s.toExponential();\r\n n = n.slice(0, n.indexOf('e') + 1) + e;\r\n }\r\n\r\n r = new Ctor(n);\r\n } else {\r\n r = new Ctor(s.toString());\r\n }\r\n\r\n pr = Ctor.precision;\r\n s = wpr = pr + 3;\r\n\r\n // Newton-Raphson iteration.\r\n for (;;) {\r\n t = r;\r\n r = t.plus(divide(x, t, wpr + 2)).times(0.5);\r\n\r\n if (digitsToString(t.d).slice(0, wpr) === (n = digitsToString(r.d)).slice(0, wpr)) {\r\n n = n.slice(wpr - 3, wpr + 1);\r\n\r\n // The 4th rounding digit may be in error by -1 so if the 4 rounding digits are 9999 or\r\n // 4999, i.e. approaching a rounding boundary, continue the iteration.\r\n if (s == wpr && n == '4999') {\r\n\r\n // On the first iteration only, check to see if rounding up gives the exact result as the\r\n // nines may infinitely repeat.\r\n round(t, pr + 1, 0);\r\n\r\n if (t.times(t).eq(x)) {\r\n r = t;\r\n break;\r\n }\r\n } else if (n != '9999') {\r\n break;\r\n }\r\n\r\n wpr += 4;\r\n }\r\n }\r\n\r\n external = true;\r\n\r\n return round(r, pr);\r\n };\r\n\r\n\r\n /*\r\n * Return a new Decimal whose value is the value of this Decimal times `)))) + ((("`" + `y`) + ("`" + (`, truncated to\r\n * ` + "`"))) + ((`precision` + ("`" + ` significant digits.\r\n *\r\n */\r\n P.times = P.mul = function (y) {\r\n var carry, e, i, k, r, rL, t, xdL, ydL,\r\n x = this,\r\n Ctor = x.constructor,\r\n xd = x.d,\r\n yd = (y = new Ctor(y)).d;\r\n\r\n // Return 0 if either is 0.\r\n if (!x.s || !y.s) return new Ctor(0);\r\n\r\n y.s *= x.s;\r\n e = x.e + y.e;\r\n xdL = xd.length;\r\n ydL = yd.length;\r\n\r\n // Ensure xd points to the longer array.\r\n if (xdL < ydL) {\r\n r = xd;\r\n xd = yd;\r\n yd = r;\r\n rL = xdL;\r\n xdL = ydL;\r\n ydL = rL;\r\n }\r\n\r\n // Initialise the result array with zeros.\r\n r = [];\r\n rL = xdL + ydL;\r\n for (i = rL; i--;) r.push(0);\r\n\r\n // Multiply!\r\n for (i = ydL; --i >= 0;) {\r\n carry = 0;\r\n for (k = xdL + i; k > i;) {\r\n t = r[k] + yd[i] * xd[k - i - 1] + carry;\r\n r[k--] = t % BASE | 0;\r\n carry = t / BASE | 0;\r\n }\r\n\r\n r[k] = (r[k] + carry) % BASE | 0;\r\n }\r\n\r\n // Remove trailing zeros.\r\n for (; !r[--rL];) r.pop();\r\n\r\n if (carry) ++e;\r\n else r.shift();\r\n\r\n y.d = r;\r\n y.e = e;\r\n\r\n return external ? round(y, Ctor.precision) : y;\r\n };\r\n\r\n\r\n /*\r\n * Return a new Decimal whose value is the value of this Decimal rounded to a maximum of `)) + ("`" + (`dp` + "`")))))) + (((((`\r\n * decimal places using rounding mode ` + "`") + (`rm` + ("`" + ` or `))) + (("`" + (`rounding` + "`")) + (` if ` + ("`" + `rm`)))) + ((("`" + ` is omitted.\r\n *\r\n * If `) + ("`" + (`dp` + "`"))) + ((` is omitted, return a new Decimal whose value is the value of this Decimal.\r\n *\r\n * [dp] {number} Decimal places. Integer, 0 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n */\r\n P.toDecimalPlaces = P.todp = function (dp, rm) {\r\n var x = this,\r\n Ctor = x.constructor;\r\n\r\n x = new Ctor(x);\r\n if (dp === void 0) return x;\r\n\r\n checkInt32(dp, 0, MAX_DIGITS);\r\n\r\n if (rm === void 0) rm = Ctor.rounding;\r\n else checkInt32(rm, 0, 8);\r\n\r\n return round(x, dp + getBase10Exponent(x) + 1, rm);\r\n };\r\n\r\n\r\n /*\r\n * Return a string representing the value of this Decimal in exponential notation rounded to\r\n * ` + ("`" + `dp`)) + ("`" + (` fixed decimal places using rounding mode ` + "`"))))) + ((((`rounding` + "`") + (`.\r\n *\r\n * [dp] {number} Decimal places. Integer, 0 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n */\r\n P.toExponential = function (dp, rm) {\r\n var str,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (dp === void 0) {\r\n str = toString(x, true);\r\n } else {\r\n checkInt32(dp, 0, MAX_DIGITS);\r\n\r\n if (rm === void 0) rm = Ctor.rounding;\r\n else checkInt32(rm, 0, 8);\r\n\r\n x = round(new Ctor(x), dp + 1, rm);\r\n str = toString(x, true, dp + 1);\r\n }\r\n\r\n return str;\r\n };\r\n\r\n\r\n /*\r\n * Return a string representing the value of this Decimal in normal (fixed-point) notation to\r\n * ` + ("`" + `dp`))) + (("`" + (` fixed decimal places and rounded using rounding mode ` + "`")) + (`rm` + ("`" + ` or `)))) + ((("`" + `rounding`) + ("`" + (` if ` + "`"))) + ((`rm` + ("`" + ` is\r\n * omitted.\r\n *\r\n * As with JavaScript numbers, (-0).toFixed(0) is '0', but e.g. (-0.00001).toFixed(0) is '-0'.\r\n *\r\n * [dp] {number} Decimal places. Integer, 0 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * (-0).toFixed(0) is '0', but (-0.1).toFixed(0) is '-0'.\r\n * (-0).toFixed(1) is '0.0', but (-0.01).toFixed(1) is '-0.0'.\r\n * (-0).toFixed(3) is '0.000'.\r\n * (-0.5).toFixed(0) is '-0'.\r\n *\r\n */\r\n P.toFixed = function (dp, rm) {\r\n var str, y,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (dp === void 0) return toString(x);\r\n\r\n checkInt32(dp, 0, MAX_DIGITS);\r\n\r\n if (rm === void 0) rm = Ctor.rounding;\r\n else checkInt32(rm, 0, 8);\r\n\r\n y = round(new Ctor(x), dp + getBase10Exponent(x) + 1, rm);\r\n str = toString(y.abs(), false, dp + getBase10Exponent(y) + 1);\r\n\r\n // To determine whether to add the minus sign look at the value before it was rounded,\r\n // i.e. look at `)) + ("`" + (`x` + "`"))))))) + ((((((` rather than ` + "`") + (`y` + ("`" + `.\r\n return x.isneg() && !x.isZero() ? '-' + str : str;\r\n };\r\n\r\n\r\n /*\r\n * Return a new Decimal whose value is the value of this Decimal rounded to a whole number using\r\n * rounding mode `))) + (("`" + (`rounding` + "`")) + (`.\r\n *\r\n */\r\n P.toInteger = P.toint = function () {\r\n var x = this,\r\n Ctor = x.constructor;\r\n return round(new Ctor(x), getBase10Exponent(x) + 1, Ctor.rounding);\r\n };\r\n\r\n\r\n /*\r\n * Return the value of this Decimal converted to a number primitive.\r\n *\r\n */\r\n P.toNumber = function () {\r\n return +this;\r\n };\r\n\r\n\r\n /*\r\n * Return a new Decimal whose value is the value of this Decimal raised to the power ` + ("`" + `y`)))) + ((("`" + `,\r\n * truncated to `) + ("`" + (`precision` + "`"))) + ((` significant digits.\r\n *\r\n * For non-integer or very large exponents pow(x, y) is calculated using\r\n *\r\n * x^y = exp(y*ln(x))\r\n *\r\n * The maximum error is 1 ulp (unit in last place).\r\n *\r\n * y {number|string|Decimal} The power to which to raise this Decimal.\r\n *\r\n */\r\n P.toPower = P.pow = function (y) {\r\n var e, k, pr, r, sign, yIsInt,\r\n x = this,\r\n Ctor = x.constructor,\r\n guard = 12,\r\n yn = +(y = new Ctor(y));\r\n\r\n // pow(x, 0) = 1\r\n if (!y.s) return new Ctor(ONE);\r\n\r\n x = new Ctor(x);\r\n\r\n // pow(0, y > 0) = 0\r\n // pow(0, y < 0) = Infinity\r\n if (!x.s) {\r\n if (y.s < 1) throw Error(decimalError + 'Infinity');\r\n return x;\r\n }\r\n\r\n // pow(1, y) = 1\r\n if (x.eq(ONE)) return x;\r\n\r\n pr = Ctor.precision;\r\n\r\n // pow(x, 1) = x\r\n if (y.eq(ONE)) return round(x, pr);\r\n\r\n e = y.e;\r\n k = y.d.length - 1;\r\n yIsInt = e >= k;\r\n sign = x.s;\r\n\r\n if (!yIsInt) {\r\n\r\n // pow(x < 0, y non-integer) = NaN\r\n if (sign < 0) throw Error(decimalError + 'NaN');\r\n\r\n // If y is a small integer use the 'exponentiation by squaring' algorithm.\r\n } else if ((k = yn < 0 ? -yn : yn) <= MAX_SAFE_INTEGER) {\r\n r = new Ctor(ONE);\r\n\r\n // Max k of 9007199254740991 takes 53 loop iterations.\r\n // Maximum digits array length; leaves [28, 34] guard digits.\r\n e = Math.ceil(pr / LOG_BASE + 4);\r\n\r\n external = false;\r\n\r\n for (;;) {\r\n if (k % 2) {\r\n r = r.times(x);\r\n truncate(r.d, e);\r\n }\r\n\r\n k = mathfloor(k / 2);\r\n if (k === 0) break;\r\n\r\n x = x.times(x);\r\n truncate(x.d, e);\r\n }\r\n\r\n external = true;\r\n\r\n return y.s < 0 ? new Ctor(ONE).div(r) : round(r, pr);\r\n }\r\n\r\n // Result is negative if x is negative and the last digit of integer y is odd.\r\n sign = sign < 0 && y.d[Math.max(e, k)] & 1 ? -1 : 1;\r\n\r\n x.s = 1;\r\n external = false;\r\n r = y.times(ln(x, pr + guard));\r\n external = true;\r\n r = exp(r);\r\n r.s = sign;\r\n\r\n return r;\r\n };\r\n\r\n\r\n /*\r\n * Return a string representing the value of this Decimal rounded to ` + ("`" + `sd`)) + ("`" + (` significant digits\r\n * using rounding mode ` + "`"))))) + ((((`rounding` + "`") + (`.\r\n *\r\n * Return exponential notation if ` + ("`" + `sd`))) + (("`" + (` is less than the number of digits necessary to represent\r\n * the integer part of the value in normal notation.\r\n *\r\n * [sd] {number} Significant digits. Integer, 1 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n */\r\n P.toPrecision = function (sd, rm) {\r\n var e, str,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (sd === void 0) {\r\n e = getBase10Exponent(x);\r\n str = toString(x, e <= Ctor.toExpNeg || e >= Ctor.toExpPos);\r\n } else {\r\n checkInt32(sd, 1, MAX_DIGITS);\r\n\r\n if (rm === void 0) rm = Ctor.rounding;\r\n else checkInt32(rm, 0, 8);\r\n\r\n x = round(new Ctor(x), sd, rm);\r\n e = getBase10Exponent(x);\r\n str = toString(x, sd <= e || e <= Ctor.toExpNeg, sd);\r\n }\r\n\r\n return str;\r\n };\r\n\r\n\r\n /*\r\n * Return a new Decimal whose value is the value of this Decimal rounded to a maximum of ` + "`")) + (`sd` + ("`" + `\r\n * significant digits using rounding mode `)))) + ((("`" + `rm`) + ("`" + (`, or to ` + "`"))) + ((`precision` + ("`" + ` and `)) + ("`" + (`rounding` + "`")))))) + (((((` respectively if\r\n * omitted.\r\n *\r\n * [sd] {number} Significant digits. Integer, 1 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n */\r\n P.toSignificantDigits = P.tosd = function (sd, rm) {\r\n var x = this,\r\n Ctor = x.constructor;\r\n\r\n if (sd === void 0) {\r\n sd = Ctor.precision;\r\n rm = Ctor.rounding;\r\n } else {\r\n checkInt32(sd, 1, MAX_DIGITS);\r\n\r\n if (rm === void 0) rm = Ctor.rounding;\r\n else checkInt32(rm, 0, 8);\r\n }\r\n\r\n return round(new Ctor(x), sd, rm);\r\n };\r\n\r\n\r\n /*\r\n * Return a string representing the value of this Decimal.\r\n *\r\n * Return exponential notation if this Decimal has a positive exponent equal to or greater than\r\n * ` + "`") + (`toExpPos` + ("`" + `, or a negative exponent equal to or less than `))) + (("`" + (`toExpNeg` + "`")) + (`.\r\n *\r\n */\r\n P.toString = P.valueOf = P.val = P.toJSON = function () {\r\n var x = this,\r\n e = getBase10Exponent(x),\r\n Ctor = x.constructor;\r\n\r\n return toString(x, e <= Ctor.toExpNeg || e >= Ctor.toExpPos);\r\n };\r\n\r\n\r\n // Helper functions for Decimal.prototype (P) and/or Decimal methods, and their callers.\r\n\r\n\r\n /*\r\n * add P.minus, P.plus\r\n * checkInt32 P.todp, P.toExponential, P.toFixed, P.toPrecision, P.tosd\r\n * digitsToString P.log, P.sqrt, P.pow, toString, exp, ln\r\n * divide P.div, P.idiv, P.log, P.mod, P.sqrt, exp, ln\r\n * exp P.exp, P.pow\r\n * getBase10Exponent P.exponent, P.sd, P.toint, P.sqrt, P.todp, P.toFixed, P.toPrecision,\r\n * P.toString, divide, round, toString, exp, ln\r\n * getLn10 P.log, ln\r\n * getZeroString digitsToString, toString\r\n * ln P.log, P.ln, P.pow, exp\r\n * parseDecimal Decimal\r\n * round P.abs, P.idiv, P.log, P.minus, P.mod, P.neg, P.plus, P.toint, P.sqrt,\r\n * P.times, P.todp, P.toExponential, P.toFixed, P.pow, P.toPrecision, P.tosd,\r\n * divide, getLn10, exp, ln\r\n * subtract P.minus, P.plus\r\n * toString P.toExponential, P.toFixed, P.toPrecision, P.toString, P.valueOf\r\n * truncate P.pow\r\n *\r\n * Throws: P.log, P.mod, P.sd, P.sqrt, P.pow, checkInt32, divide, round,\r\n * getLn10, exp, ln, parseDecimal, Decimal, config\r\n */\r\n\r\n\r\n function add(x, y) {\r\n var carry, d, e, i, k, len, xd, yd,\r\n Ctor = x.constructor,\r\n pr = Ctor.precision;\r\n\r\n // If either is zero...\r\n if (!x.s || !y.s) {\r\n\r\n // Return x if y is zero.\r\n // Return y if y is non-zero.\r\n if (!y.s) y = new Ctor(x);\r\n return external ? round(y, pr) : y;\r\n }\r\n\r\n xd = x.d;\r\n yd = y.d;\r\n\r\n // x and y are finite, non-zero numbers with the same sign.\r\n\r\n k = x.e;\r\n e = y.e;\r\n xd = xd.slice();\r\n i = k - e;\r\n\r\n // If base 1e7 exponents differ...\r\n if (i) {\r\n if (i < 0) {\r\n d = xd;\r\n i = -i;\r\n len = yd.length;\r\n } else {\r\n d = yd;\r\n e = k;\r\n len = xd.length;\r\n }\r\n\r\n // Limit number of zeros prepended to max(ceil(pr / LOG_BASE), len) + 1.\r\n k = Math.ceil(pr / LOG_BASE);\r\n len = k > len ? k + 1 : len + 1;\r\n\r\n if (i > len) {\r\n i = len;\r\n d.length = 1;\r\n }\r\n\r\n // Prepend zeros to equalise exponents. Note: Faster to use reverse then do unshifts.\r\n d.reverse();\r\n for (; i--;) d.push(0);\r\n d.reverse();\r\n }\r\n\r\n len = xd.length;\r\n i = yd.length;\r\n\r\n // If yd is longer than xd, swap xd and yd so xd points to the longer array.\r\n if (len - i < 0) {\r\n i = len;\r\n d = yd;\r\n yd = xd;\r\n xd = d;\r\n }\r\n\r\n // Only start adding at yd.length - 1 as the further digits of xd can be left as they are.\r\n for (carry = 0; i;) {\r\n carry = (xd[--i] = xd[i] + yd[i] + carry) / BASE | 0;\r\n xd[i] %= BASE;\r\n }\r\n\r\n if (carry) {\r\n xd.unshift(carry);\r\n ++e;\r\n }\r\n\r\n // Remove trailing zeros.\r\n // No need to check for zero, as +x + +y != 0 && -x + -y != 0\r\n for (len = xd.length; xd[--len] == 0;) xd.pop();\r\n\r\n y.d = xd;\r\n y.e = e;\r\n\r\n return external ? round(y, pr) : y;\r\n }\r\n\r\n\r\n function checkInt32(i, min, max) {\r\n if (i !== ~~i || i < min || i > max) {\r\n throw Error(invalidArgument + i);\r\n }\r\n }\r\n\r\n\r\n function digitsToString(d) {\r\n var i, k, ws,\r\n indexOfLastWord = d.length - 1,\r\n str = '',\r\n w = d[0];\r\n\r\n if (indexOfLastWord > 0) {\r\n str += w;\r\n for (i = 1; i < indexOfLastWord; i++) {\r\n ws = d[i] + '';\r\n k = LOG_BASE - ws.length;\r\n if (k) str += getZeroString(k);\r\n str += ws;\r\n }\r\n\r\n w = d[i];\r\n ws = w + '';\r\n k = LOG_BASE - ws.length;\r\n if (k) str += getZeroString(k);\r\n } else if (w === 0) {\r\n return '0';\r\n }\r\n\r\n // Remove trailing zeros of last w.\r\n for (; w % 10 === 0;) w /= 10;\r\n\r\n return str + w;\r\n }\r\n\r\n\r\n var divide = (function () {\r\n\r\n // Assumes non-zero x and k, and hence non-zero result.\r\n function multiplyInteger(x, k) {\r\n var temp,\r\n carry = 0,\r\n i = x.length;\r\n\r\n for (x = x.slice(); i--;) {\r\n temp = x[i] * k + carry;\r\n x[i] = temp % BASE | 0;\r\n carry = temp / BASE | 0;\r\n }\r\n\r\n if (carry) x.unshift(carry);\r\n\r\n return x;\r\n }\r\n\r\n function compare(a, b, aL, bL) {\r\n var i, r;\r\n\r\n if (aL != bL) {\r\n r = aL > bL ? 1 : -1;\r\n } else {\r\n for (i = r = 0; i < aL; i++) {\r\n if (a[i] != b[i]) {\r\n r = a[i] > b[i] ? 1 : -1;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return r;\r\n }\r\n\r\n function subtract(a, b, aL) {\r\n var i = 0;\r\n\r\n // Subtract b from a.\r\n for (; aL--;) {\r\n a[aL] -= i;\r\n i = a[aL] < b[aL] ? 1 : 0;\r\n a[aL] = i * BASE + a[aL] - b[aL];\r\n }\r\n\r\n // Remove leading zeros.\r\n for (; !a[0] && a.length > 1;) a.shift();\r\n }\r\n\r\n return function (x, y, pr, dp) {\r\n var cmp, e, i, k, prod, prodL, q, qd, rem, remL, rem0, sd, t, xi, xL, yd0, yL, yz,\r\n Ctor = x.constructor,\r\n sign = x.s == y.s ? 1 : -1,\r\n xd = x.d,\r\n yd = y.d;\r\n\r\n // Either 0?\r\n if (!x.s) return new Ctor(x);\r\n if (!y.s) throw Error(decimalError + 'Division by zero');\r\n\r\n e = x.e - y.e;\r\n yL = yd.length;\r\n xL = xd.length;\r\n q = new Ctor(sign);\r\n qd = q.d = [];\r\n\r\n // Result exponent may be one less than e.\r\n for (i = 0; yd[i] == (xd[i] || 0); ) ++i;\r\n if (yd[i] > (xd[i] || 0)) --e;\r\n\r\n if (pr == null) {\r\n sd = pr = Ctor.precision;\r\n } else if (dp) {\r\n sd = pr + (getBase10Exponent(x) - getBase10Exponent(y)) + 1;\r\n } else {\r\n sd = pr;\r\n }\r\n\r\n if (sd < 0) return new Ctor(0);\r\n\r\n // Convert precision in number of base 10 digits to base 1e7 digits.\r\n sd = sd / LOG_BASE + 2 | 0;\r\n i = 0;\r\n\r\n // divisor < 1e7\r\n if (yL == 1) {\r\n k = 0;\r\n yd = yd[0];\r\n sd++;\r\n\r\n // k is the carry.\r\n for (; (i < xL || k) && sd--; i++) {\r\n t = k * BASE + (xd[i] || 0);\r\n qd[i] = t / yd | 0;\r\n k = t % yd | 0;\r\n }\r\n\r\n // divisor >= 1e7\r\n } else {\r\n\r\n // Normalise xd and yd so highest order digit of yd is >= BASE/2\r\n k = BASE / (yd[0] + 1) | 0;\r\n\r\n if (k > 1) {\r\n yd = multiplyInteger(yd, k);\r\n xd = multiplyInteger(xd, k);\r\n yL = yd.length;\r\n xL = xd.length;\r\n }\r\n\r\n xi = yL;\r\n rem = xd.slice(0, yL);\r\n remL = rem.length;\r\n\r\n // Add zeros to make remainder as long as divisor.\r\n for (; remL < yL;) rem[remL++] = 0;\r\n\r\n yz = yd.slice();\r\n yz.unshift(0);\r\n yd0 = yd[0];\r\n\r\n if (yd[1] >= BASE / 2) ++yd0;\r\n\r\n do {\r\n k = 0;\r\n\r\n // Compare divisor and remainder.\r\n cmp = compare(yd, rem, yL, remL);\r\n\r\n // If divisor < remainder.\r\n if (cmp < 0) {\r\n\r\n // Calculate trial digit, k.\r\n rem0 = rem[0];\r\n if (yL != remL) rem0 = rem0 * BASE + (rem[1] || 0);\r\n\r\n // k will be how many times the divisor goes into the current remainder.\r\n k = rem0 / yd0 | 0;\r\n\r\n // Algorithm:\r\n // 1. product = divisor * trial digit (k)\r\n // 2. if product > remainder: product -= divisor, k--\r\n // 3. remainder -= product\r\n // 4. if product was < remainder at 2:\r\n // 5. compare new remainder and divisor\r\n // 6. If remainder > divisor: remainder -= divisor, k++\r\n\r\n if (k > 1) {\r\n if (k >= BASE) k = BASE - 1;\r\n\r\n // product = divisor * trial digit.\r\n prod = multiplyInteger(yd, k);\r\n prodL = prod.length;\r\n remL = rem.length;\r\n\r\n // Compare product and remainder.\r\n cmp = compare(prod, rem, prodL, remL);\r\n\r\n // product > remainder.\r\n if (cmp == 1) {\r\n k--;\r\n\r\n // Subtract divisor from product.\r\n subtract(prod, yL < prodL ? yz : yd, prodL);\r\n }\r\n } else {\r\n\r\n // cmp is -1.\r\n // If k is 0, there is no need to compare yd and rem again below, so change cmp to 1\r\n // to avoid it. If k is 1 there is a need to compare yd and rem again below.\r\n if (k == 0) cmp = k = 1;\r\n prod = yd.slice();\r\n }\r\n\r\n prodL = prod.length;\r\n if (prodL < remL) prod.unshift(0);\r\n\r\n // Subtract product from remainder.\r\n subtract(rem, prod, remL);\r\n\r\n // If product was < previous remainder.\r\n if (cmp == -1) {\r\n remL = rem.length;\r\n\r\n // Compare divisor and new remainder.\r\n cmp = compare(yd, rem, yL, remL);\r\n\r\n // If divisor < new remainder, subtract divisor from remainder.\r\n if (cmp < 1) {\r\n k++;\r\n\r\n // Subtract divisor from remainder.\r\n subtract(rem, yL < remL ? yz : yd, remL);\r\n }\r\n }\r\n\r\n remL = rem.length;\r\n } else if (cmp === 0) {\r\n k++;\r\n rem = [0];\r\n } // if cmp === 1, k will be 0\r\n\r\n // Add the next digit, k, to the result array.\r\n qd[i++] = k;\r\n\r\n // Update the remainder.\r\n if (cmp && rem[0]) {\r\n rem[remL++] = xd[xi] || 0;\r\n } else {\r\n rem = [xd[xi]];\r\n remL = 1;\r\n }\r\n\r\n } while ((xi++ < xL || rem[0] !== void 0) && sd--);\r\n }\r\n\r\n // Leading zero?\r\n if (!qd[0]) qd.shift();\r\n\r\n q.e = e;\r\n\r\n return round(q, dp ? pr + getBase10Exponent(q) + 1 : pr);\r\n };\r\n })();\r\n\r\n\r\n /*\r\n * Return a new Decimal whose value is the natural exponential of ` + ("`" + `x`)))) + ((("`" + ` truncated to `) + ("`" + (`sd` + "`"))) + ((`\r\n * significant digits.\r\n *\r\n * Taylor/Maclaurin series.\r\n *\r\n * exp(x) = x^0/0! + x^1/1! + x^2/2! + x^3/3! + ...\r\n *\r\n * Argument reduction:\r\n * Repeat x = x / 32, k += 5, until |x| < 0.1\r\n * exp(x) = exp(x / 2^k)^(2^k)\r\n *\r\n * Previously, the argument was initially reduced by\r\n * exp(x) = exp(r) * 10^k where r = x - k * ln10, k = floor(x / ln10)\r\n * to first put r in the range [0, ln10], before dividing by 32 until |x| < 0.1, but this was\r\n * found to be slower than just dividing repeatedly by 32 as above.\r\n *\r\n * (Math object integer min/max: Math.exp(709) = 8.2e+307, Math.exp(-745) = 5e-324)\r\n *\r\n * exp(x) is non-terminating for any finite, non-zero x.\r\n *\r\n */\r\n function exp(x, sd) {\r\n var denominator, guard, pow, sum, t, wpr,\r\n i = 0,\r\n k = 0,\r\n Ctor = x.constructor,\r\n pr = Ctor.precision;\r\n\r\n if (getBase10Exponent(x) > 16) throw Error(exponentOutOfRange + getBase10Exponent(x));\r\n\r\n // exp(0) = 1\r\n if (!x.s) return new Ctor(ONE);\r\n\r\n if (sd == null) {\r\n external = false;\r\n wpr = pr;\r\n } else {\r\n wpr = sd;\r\n }\r\n\r\n t = new Ctor(0.03125);\r\n\r\n while (x.abs().gte(0.1)) {\r\n x = x.times(t); // x = x / 2^5\r\n k += 5;\r\n }\r\n\r\n // Estimate the precision increase necessary to ensure the first 4 rounding digits are correct.\r\n guard = Math.log(mathpow(2, k)) / Math.LN10 * 2 + 5 | 0;\r\n wpr += guard;\r\n denominator = pow = sum = new Ctor(ONE);\r\n Ctor.precision = wpr;\r\n\r\n for (;;) {\r\n pow = round(pow.times(x), wpr);\r\n denominator = denominator.times(++i);\r\n t = sum.plus(divide(pow, denominator, wpr));\r\n\r\n if (digitsToString(t.d).slice(0, wpr) === digitsToString(sum.d).slice(0, wpr)) {\r\n while (k--) sum = round(sum.times(sum), wpr);\r\n Ctor.precision = pr;\r\n return sd == null ? (external = true, round(sum, pr)) : sum;\r\n }\r\n\r\n sum = t;\r\n }\r\n }\r\n\r\n\r\n // Calculate the base 10 exponent from the base 1e7 exponent.\r\n function getBase10Exponent(x) {\r\n var e = x.e * LOG_BASE,\r\n w = x.d[0];\r\n\r\n // Add the number of digits of the first word of the digits array.\r\n for (; w >= 10; w /= 10) e++;\r\n return e;\r\n }\r\n\r\n\r\n function getLn10(Ctor, sd, pr) {\r\n\r\n if (sd > Ctor.LN10.sd()) {\r\n\r\n\r\n // Reset global state in case the exception is caught.\r\n external = true;\r\n if (pr) Ctor.precision = pr;\r\n throw Error(decimalError + 'LN10 precision limit exceeded');\r\n }\r\n\r\n return round(new Ctor(Ctor.LN10), sd);\r\n }\r\n\r\n\r\n function getZeroString(k) {\r\n var zs = '';\r\n for (; k--;) zs += '0';\r\n return zs;\r\n }\r\n\r\n\r\n /*\r\n * Return a new Decimal whose value is the natural logarithm of ` + ("`" + `x`)) + ("`" + (` truncated to ` + "`"))))) + ((((`sd` + "`") + (` significant\r\n * digits.\r\n *\r\n * ln(n) is non-terminating (n != 1)\r\n *\r\n */\r\n function ln(y, sd) {\r\n var c, c0, denominator, e, numerator, sum, t, wpr, x2,\r\n n = 1,\r\n guard = 10,\r\n x = y,\r\n xd = x.d,\r\n Ctor = x.constructor,\r\n pr = Ctor.precision;\r\n\r\n // ln(-x) = NaN\r\n // ln(0) = -Infinity\r\n if (x.s < 1) throw Error(decimalError + (x.s ? 'NaN' : '-Infinity'));\r\n\r\n // ln(1) = 0\r\n if (x.eq(ONE)) return new Ctor(0);\r\n\r\n if (sd == null) {\r\n external = false;\r\n wpr = pr;\r\n } else {\r\n wpr = sd;\r\n }\r\n\r\n if (x.eq(10)) {\r\n if (sd == null) external = true;\r\n return getLn10(Ctor, wpr);\r\n }\r\n\r\n wpr += guard;\r\n Ctor.precision = wpr;\r\n c = digitsToString(xd);\r\n c0 = c.charAt(0);\r\n e = getBase10Exponent(x);\r\n\r\n if (Math.abs(e) < 1.5e15) {\r\n\r\n // Argument reduction.\r\n // The series converges faster the closer the argument is to 1, so using\r\n // ln(a^b) = b * ln(a), ln(a) = ln(a^b) / b\r\n // multiply the argument by itself until the leading digits of the significand are 7, 8, 9,\r\n // 10, 11, 12 or 13, recording the number of multiplications so the sum of the series can\r\n // later be divided by this number, then separate out the power of 10 using\r\n // ln(a*10^b) = ln(a) + b*ln(10).\r\n\r\n // max n is 21 (gives 0.9, 1.0 or 1.1) (9e15 / 21 = 4.2e14).\r\n //while (c0 < 9 && c0 != 1 || c0 == 1 && c.charAt(1) > 1) {\r\n // max n is 6 (gives 0.7 - 1.3)\r\n while (c0 < 7 && c0 != 1 || c0 == 1 && c.charAt(1) > 3) {\r\n x = x.times(y);\r\n c = digitsToString(x.d);\r\n c0 = c.charAt(0);\r\n n++;\r\n }\r\n\r\n e = getBase10Exponent(x);\r\n\r\n if (c0 > 1) {\r\n x = new Ctor('0.' + c);\r\n e++;\r\n } else {\r\n x = new Ctor(c0 + '.' + c.slice(1));\r\n }\r\n } else {\r\n\r\n // The argument reduction method above may result in overflow if the argument y is a massive\r\n // number with exponent >= 1500000000000000 (9e15 / 6 = 1.5e15), so instead recall this\r\n // function using ln(x*10^e) = ln(x) + e*ln(10).\r\n t = getLn10(Ctor, wpr + 2, pr).times(e + '');\r\n x = ln(new Ctor(c0 + '.' + c.slice(1)), wpr - guard).plus(t);\r\n\r\n Ctor.precision = pr;\r\n return sd == null ? (external = true, round(x, pr)) : x;\r\n }\r\n\r\n // x is reduced to a value near 1.\r\n\r\n // Taylor series.\r\n // ln(y) = ln((1 + x)/(1 - x)) = 2(x + x^3/3 + x^5/5 + x^7/7 + ...)\r\n // where x = (y - 1)/(y + 1) (|x| < 1)\r\n sum = numerator = x = divide(x.minus(ONE), x.plus(ONE), wpr);\r\n x2 = round(x.times(x), wpr);\r\n denominator = 3;\r\n\r\n for (;;) {\r\n numerator = round(numerator.times(x2), wpr);\r\n t = sum.plus(divide(numerator, new Ctor(denominator), wpr));\r\n\r\n if (digitsToString(t.d).slice(0, wpr) === digitsToString(sum.d).slice(0, wpr)) {\r\n sum = sum.times(2);\r\n\r\n // Reverse the argument reduction.\r\n if (e !== 0) sum = sum.plus(getLn10(Ctor, wpr + 2, pr).times(e + ''));\r\n sum = divide(sum, new Ctor(n), wpr);\r\n\r\n Ctor.precision = pr;\r\n return sd == null ? (external = true, round(sum, pr)) : sum;\r\n }\r\n\r\n sum = t;\r\n denominator += 2;\r\n }\r\n }\r\n\r\n\r\n /*\r\n * Parse the value of a new Decimal ` + ("`" + `x`))) + (("`" + (` from string ` + "`")) + (`str` + ("`" + `.\r\n */\r\n function parseDecimal(x, str) {\r\n var e, i, len;\r\n\r\n // Decimal point?\r\n if ((e = str.indexOf('.')) > -1) str = str.replace('.', '');\r\n\r\n // Exponential form?\r\n if ((i = str.search(/e/i)) > 0) {\r\n\r\n // Determine exponent.\r\n if (e < 0) e = i;\r\n e += +str.slice(i + 1);\r\n str = str.substring(0, i);\r\n } else if (e < 0) {\r\n\r\n // Integer.\r\n e = str.length;\r\n }\r\n\r\n // Determine leading zeros.\r\n for (i = 0; str.charCodeAt(i) === 48;) ++i;\r\n\r\n // Determine trailing zeros.\r\n for (len = str.length; str.charCodeAt(len - 1) === 48;) --len;\r\n str = str.slice(i, len);\r\n\r\n if (str) {\r\n len -= i;\r\n e = e - i - 1;\r\n x.e = mathfloor(e / LOG_BASE);\r\n x.d = [];\r\n\r\n // Transform base\r\n\r\n // e is the base 10 exponent.\r\n // i is where to slice str to get the first word of the digits array.\r\n i = (e + 1) % LOG_BASE;\r\n if (e < 0) i += LOG_BASE;\r\n\r\n if (i < len) {\r\n if (i) x.d.push(+str.slice(0, i));\r\n for (len -= LOG_BASE; i < len;) x.d.push(+str.slice(i, i += LOG_BASE));\r\n str = str.slice(i);\r\n i = LOG_BASE - str.length;\r\n } else {\r\n i -= len;\r\n }\r\n\r\n for (; i--;) str += '0';\r\n x.d.push(+str);\r\n\r\n if (external && (x.e > MAX_E || x.e < -MAX_E)) throw Error(exponentOutOfRange + e);\r\n } else {\r\n\r\n // Zero.\r\n x.s = 0;\r\n x.e = 0;\r\n x.d = [0];\r\n }\r\n\r\n return x;\r\n }\r\n\r\n\r\n /*\r\n * Round `)))) + ((("`" + (`x` + "`")) + (` to ` + ("`" + `sd`))) + (("`" + (` significant digits, using rounding mode ` + "`")) + (`rm` + ("`" + ` if present (truncate otherwise).\r\n */\r\n function round(x, sd, rm) {\r\n var i, j, k, n, rd, doRound, w, xdi,\r\n xd = x.d;\r\n\r\n // rd: the rounding digit, i.e. the digit after the digit that may be rounded up.\r\n // w: the word of xd which contains the rounding digit, a base 1e7 number.\r\n // xdi: the index of w within xd.\r\n // n: the number of digits of w.\r\n // i: what would be the index of rd within w if all the numbers were 7 digits long (i.e. if\r\n // they had leading zeros)\r\n // j: if > 0, the actual index of rd within w (if < 0, rd is a leading zero).\r\n\r\n // Get the length of the first word of the digits array xd.\r\n for (n = 1, k = xd[0]; k >= 10; k /= 10) n++;\r\n i = sd - n;\r\n\r\n // Is the rounding digit in the first word of xd?\r\n if (i < 0) {\r\n i += LOG_BASE;\r\n j = sd;\r\n w = xd[xdi = 0];\r\n } else {\r\n xdi = Math.ceil((i + 1) / LOG_BASE);\r\n k = xd.length;\r\n if (xdi >= k) return x;\r\n w = k = xd[xdi];\r\n\r\n // Get the number of digits of w.\r\n for (n = 1; k >= 10; k /= 10) n++;\r\n\r\n // Get the index of rd within w.\r\n i %= LOG_BASE;\r\n\r\n // Get the index of rd within w, adjusted for leading zeros.\r\n // The number of leading zeros of w is given by LOG_BASE - n.\r\n j = i - LOG_BASE + n;\r\n }\r\n\r\n if (rm !== void 0) {\r\n k = mathpow(10, n - j - 1);\r\n\r\n // Get the rounding digit at index j of w.\r\n rd = w / k % 10 | 0;\r\n\r\n // Are there any non-zero digits after the rounding digit?\r\n doRound = sd < 0 || xd[xdi + 1] !== void 0 || w % k;\r\n\r\n // The expression `)))))))) + ((((((("`" + `w % mathpow(10, n - j - 1)`) + ("`" + (` returns all the digits of w to the right of the\r\n // digit at (left-to-right) index j, e.g. if w is 908714 and j is 2, the expression will give\r\n // 714.\r\n\r\n doRound = rm < 4\r\n ? (rd || doRound) && (rm == 0 || rm == (x.s < 0 ? 3 : 2))\r\n : rd > 5 || rd == 5 && (rm == 4 || doRound || rm == 6 &&\r\n\r\n // Check whether the digit to the left of the rounding digit is odd.\r\n ((i > 0 ? j > 0 ? w / mathpow(10, n - j) : 0 : xd[xdi - 1]) % 10) & 1 ||\r\n rm == (x.s < 0 ? 8 : 7));\r\n }\r\n\r\n if (sd < 1 || !xd[0]) {\r\n if (doRound) {\r\n k = getBase10Exponent(x);\r\n xd.length = 1;\r\n\r\n // Convert sd to decimal places.\r\n sd = sd - k - 1;\r\n\r\n // 1, 0.1, 0.01, 0.001, 0.0001 etc.\r\n xd[0] = mathpow(10, (LOG_BASE - sd % LOG_BASE) % LOG_BASE);\r\n x.e = mathfloor(-sd / LOG_BASE) || 0;\r\n } else {\r\n xd.length = 1;\r\n\r\n // Zero.\r\n xd[0] = x.e = x.s = 0;\r\n }\r\n\r\n return x;\r\n }\r\n\r\n // Remove excess digits.\r\n if (i == 0) {\r\n xd.length = xdi;\r\n k = 1;\r\n xdi--;\r\n } else {\r\n xd.length = xdi + 1;\r\n k = mathpow(10, LOG_BASE - i);\r\n\r\n // E.g. 56700 becomes 56000 if 7 is the rounding digit.\r\n // j > 0 means i > number of leading zeros of w.\r\n xd[xdi] = j > 0 ? (w / mathpow(10, n - j) % mathpow(10, j) | 0) * k : 0;\r\n }\r\n\r\n if (doRound) {\r\n for (;;) {\r\n\r\n // Is the digit to be rounded up in the first word of xd?\r\n if (xdi == 0) {\r\n if ((xd[0] += k) == BASE) {\r\n xd[0] = 1;\r\n ++x.e;\r\n }\r\n\r\n break;\r\n } else {\r\n xd[xdi] += k;\r\n if (xd[xdi] != BASE) break;\r\n xd[xdi--] = 0;\r\n k = 1;\r\n }\r\n }\r\n }\r\n\r\n // Remove trailing zeros.\r\n for (i = xd.length; xd[--i] === 0;) xd.pop();\r\n\r\n if (external && (x.e > MAX_E || x.e < -MAX_E)) {\r\n throw Error(exponentOutOfRange + getBase10Exponent(x));\r\n }\r\n\r\n return x;\r\n }\r\n\r\n\r\n function subtract(x, y) {\r\n var d, e, i, j, k, len, xd, xe, xLTy, yd,\r\n Ctor = x.constructor,\r\n pr = Ctor.precision;\r\n\r\n // Return y negated if x is zero.\r\n // Return x if y is zero and x is non-zero.\r\n if (!x.s || !y.s) {\r\n if (y.s) y.s = -y.s;\r\n else y = new Ctor(x);\r\n return external ? round(y, pr) : y;\r\n }\r\n\r\n xd = x.d;\r\n yd = y.d;\r\n\r\n // x and y are non-zero numbers with the same sign.\r\n\r\n e = y.e;\r\n xe = x.e;\r\n xd = xd.slice();\r\n k = xe - e;\r\n\r\n // If exponents differ...\r\n if (k) {\r\n xLTy = k < 0;\r\n\r\n if (xLTy) {\r\n d = xd;\r\n k = -k;\r\n len = yd.length;\r\n } else {\r\n d = yd;\r\n e = xe;\r\n len = xd.length;\r\n }\r\n\r\n // Numbers with massively different exponents would result in a very high number of zeros\r\n // needing to be prepended, but this can be avoided while still ensuring correct rounding by\r\n // limiting the number of zeros to ` + "`"))) + ((`Math.ceil(pr / LOG_BASE) + 2` + ("`" + `.\r\n i = Math.max(Math.ceil(pr / LOG_BASE), len) + 2;\r\n\r\n if (k > i) {\r\n k = i;\r\n d.length = 1;\r\n }\r\n\r\n // Prepend zeros to equalise exponents.\r\n d.reverse();\r\n for (i = k; i--;) d.push(0);\r\n d.reverse();\r\n\r\n // Base 1e7 exponents equal.\r\n } else {\r\n\r\n // Check digits to determine which is the bigger number.\r\n\r\n i = xd.length;\r\n len = yd.length;\r\n xLTy = i < len;\r\n if (xLTy) len = i;\r\n\r\n for (i = 0; i < len; i++) {\r\n if (xd[i] != yd[i]) {\r\n xLTy = xd[i] < yd[i];\r\n break;\r\n }\r\n }\r\n\r\n k = 0;\r\n }\r\n\r\n if (xLTy) {\r\n d = xd;\r\n xd = yd;\r\n yd = d;\r\n y.s = -y.s;\r\n }\r\n\r\n len = xd.length;\r\n\r\n // Append zeros to xd if shorter.\r\n // Don't add zeros to yd if shorter as subtraction only needs to start at yd length.\r\n for (i = yd.length - len; i > 0; --i) xd[len++] = 0;\r\n\r\n // Subtract yd from xd.\r\n for (i = yd.length; i > k;) {\r\n if (xd[--i] < yd[i]) {\r\n for (j = i; j && xd[--j] === 0;) xd[j] = BASE - 1;\r\n --xd[j];\r\n xd[i] += BASE;\r\n }\r\n\r\n xd[i] -= yd[i];\r\n }\r\n\r\n // Remove trailing zeros.\r\n for (; xd[--len] === 0;) xd.pop();\r\n\r\n // Remove leading zeros and adjust exponent accordingly.\r\n for (; xd[0] === 0; xd.shift()) --e;\r\n\r\n // Zero?\r\n if (!xd[0]) return new Ctor(0);\r\n\r\n y.d = xd;\r\n y.e = e;\r\n\r\n //return external && xd.length >= pr / LOG_BASE ? round(y, pr) : y;\r\n return external ? round(y, pr) : y;\r\n }\r\n\r\n\r\n function toString(x, isExp, sd) {\r\n var k,\r\n e = getBase10Exponent(x),\r\n str = digitsToString(x.d),\r\n len = str.length;\r\n\r\n if (isExp) {\r\n if (sd && (k = sd - len) > 0) {\r\n str = str.charAt(0) + '.' + str.slice(1) + getZeroString(k);\r\n } else if (len > 1) {\r\n str = str.charAt(0) + '.' + str.slice(1);\r\n }\r\n\r\n str = str + (e < 0 ? 'e' : 'e+') + e;\r\n } else if (e < 0) {\r\n str = '0.' + getZeroString(-e - 1) + str;\r\n if (sd && (k = sd - len) > 0) str += getZeroString(k);\r\n } else if (e >= len) {\r\n str += getZeroString(e + 1 - len);\r\n if (sd && (k = sd - e - 1) > 0) str = str + '.' + getZeroString(k);\r\n } else {\r\n if ((k = e + 1) < len) str = str.slice(0, k) + '.' + str.slice(k);\r\n if (sd && (k = sd - len) > 0) {\r\n if (e + 1 === len) str += '.';\r\n str += getZeroString(k);\r\n }\r\n }\r\n\r\n return x.s < 0 ? '-' + str : str;\r\n }\r\n\r\n\r\n // Does not strip trailing zeros.\r\n function truncate(arr, len) {\r\n if (arr.length > len) {\r\n arr.length = len;\r\n return true;\r\n }\r\n }\r\n\r\n\r\n // Decimal methods\r\n\r\n\r\n /*\r\n * clone\r\n * config/set\r\n */\r\n\r\n\r\n /*\r\n * Create and return a Decimal constructor with the same configuration properties as this Decimal\r\n * constructor.\r\n *\r\n */\r\n function clone(obj) {\r\n var i, p, ps;\r\n\r\n /*\r\n * The Decimal constructor and exported function.\r\n * Return a new Decimal instance.\r\n *\r\n * value {number|string|Decimal} A numeric value.\r\n *\r\n */\r\n function Decimal(value) {\r\n var x = this;\r\n\r\n // Decimal called without new.\r\n if (!(x instanceof Decimal)) return new Decimal(value);\r\n\r\n // Retain a reference to this Decimal constructor, and shadow Decimal.prototype.constructor\r\n // which points to Object.\r\n x.constructor = Decimal;\r\n\r\n // Duplicate.\r\n if (value instanceof Decimal) {\r\n x.s = value.s;\r\n x.e = value.e;\r\n x.d = (value = value.d) ? value.slice() : value;\r\n return;\r\n }\r\n\r\n if (typeof value === 'number') {\r\n\r\n // Reject Infinity/NaN.\r\n if (value * 0 !== 0) {\r\n throw Error(invalidArgument + value);\r\n }\r\n\r\n if (value > 0) {\r\n x.s = 1;\r\n } else if (value < 0) {\r\n value = -value;\r\n x.s = -1;\r\n } else {\r\n x.s = 0;\r\n x.e = 0;\r\n x.d = [0];\r\n return;\r\n }\r\n\r\n // Fast path for small integers.\r\n if (value === ~~value && value < 1e7) {\r\n x.e = 0;\r\n x.d = [value];\r\n return;\r\n }\r\n\r\n return parseDecimal(x, value.toString());\r\n } else if (typeof value !== 'string') {\r\n throw Error(invalidArgument + value);\r\n }\r\n\r\n // Minus sign?\r\n if (value.charCodeAt(0) === 45) {\r\n value = value.slice(1);\r\n x.s = -1;\r\n } else {\r\n x.s = 1;\r\n }\r\n\r\n if (isDecimal.test(value)) parseDecimal(x, value);\r\n else throw Error(invalidArgument + value);\r\n }\r\n\r\n Decimal.prototype = P;\r\n\r\n Decimal.ROUND_UP = 0;\r\n Decimal.ROUND_DOWN = 1;\r\n Decimal.ROUND_CEIL = 2;\r\n Decimal.ROUND_FLOOR = 3;\r\n Decimal.ROUND_HALF_UP = 4;\r\n Decimal.ROUND_HALF_DOWN = 5;\r\n Decimal.ROUND_HALF_EVEN = 6;\r\n Decimal.ROUND_HALF_CEIL = 7;\r\n Decimal.ROUND_HALF_FLOOR = 8;\r\n\r\n Decimal.clone = clone;\r\n Decimal.config = Decimal.set = config;\r\n\r\n if (obj === void 0) obj = {};\r\n if (obj) {\r\n ps = ['precision', 'rounding', 'toExpNeg', 'toExpPos', 'LN10'];\r\n for (i = 0; i < ps.length;) if (!obj.hasOwnProperty(p = ps[i++])) obj[p] = this[p];\r\n }\r\n\r\n Decimal.config(obj);\r\n\r\n return Decimal;\r\n }\r\n\r\n\r\n /*\r\n * Configure global settings for a Decimal constructor.\r\n *\r\n * `)) + ("`" + (`obj` + "`")))) + (((` is an object with one or more of the following properties,\r\n *\r\n * precision {number}\r\n * rounding {number}\r\n * toExpNeg {number}\r\n * toExpPos {number}\r\n *\r\n * E.g. Decimal.config({ precision: 20, rounding: 4 })\r\n *\r\n */\r\n function config(obj) {\r\n if (!obj || typeof obj !== 'object') {\r\n throw Error(decimalError + 'Object expected');\r\n }\r\n var i, p, v,\r\n ps = [\r\n 'precision', 1, MAX_DIGITS,\r\n 'rounding', 0, 8,\r\n 'toExpNeg', -1 / 0, 0,\r\n 'toExpPos', 0, 1 / 0\r\n ];\r\n\r\n for (i = 0; i < ps.length; i += 3) {\r\n if ((v = obj[p = ps[i]]) !== void 0) {\r\n if (mathfloor(v) === v && v >= ps[i + 1] && v <= ps[i + 2]) this[p] = v;\r\n else throw Error(invalidArgument + p + ': ' + v);\r\n }\r\n }\r\n\r\n if ((v = obj[p = 'LN10']) !== void 0) {\r\n if (v == Math.LN10) this[p] = new this(v);\r\n else throw Error(invalidArgument + p + ': ' + v);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n\r\n // Create and configure initial Decimal constructor.\r\n Decimal = clone(Decimal);\r\n\r\n Decimal['default'] = Decimal.Decimal = Decimal;\r\n\r\n // Internal constant.\r\n ONE = new Decimal(1);\r\n\r\n\r\n // Export.\r\n\r\n\r\n // AMD.\r\n if (typeof define == 'function' && define.amd) {\r\n define(function () {\r\n return Decimal;\r\n });\r\n\r\n // Node and other environments that support module.exports.\r\n } else if (typeof module != 'undefined' && module.exports) {\r\n module.exports = Decimal;\r\n\r\n // Browser.\r\n } else {\r\n if (!globalScope) {\r\n globalScope = typeof self != 'undefined' && self && self.self == self\r\n ? self : Function('return this')();\r\n }\r\n\r\n globalScope.Decimal = Decimal;\r\n }\r\n})(this);\r\n", + "/*! decimal.js-light v2.5.0 https://github.com/MikeMcl/decimal.js-light/LICENCE */\r\n;(function (globalScope) {\r\n 'use strict';\r\n\r\n\r\n /*\r\n * decimal.js-light v2.5.0\r\n * An arbitrary-precision Decimal type for JavaScript.\r\n * https://github.com/MikeMcl/decimal.js-light\r\n * Copyright (c) 2018 Michael Mclaughlin \r\n * MIT Expat Licence\r\n */\r\n\r\n\r\n // ----------------------------------- EDITABLE DEFAULTS ------------------------------------ //\r\n\r\n\r\n // The limit on the value of ` + "`")) + (`precision` + ("`" + `, and on the value of the first argument to\r\n // `))) + (("`" + (`toDecimalPlaces` + "`")) + ((`, ` + "`") + (`toExponential` + "`"))))))) + ((((((`, ` + ("`" + `toFixed`)) + ("`" + (`, ` + "`"))) + ((`toPrecision` + ("`" + ` and `)) + ("`" + (`toSignificantDigits` + "`")))) + (((`.\r\n var MAX_DIGITS = 1e9, // 0 to 1e9\r\n\r\n\r\n // The initial configuration properties of the Decimal constructor.\r\n Decimal = {\r\n\r\n // These values must be integers within the stated ranges (inclusive).\r\n // Most of these values can be changed during run-time using ` + ("`" + `Decimal.config`)) + ("`" + (`.\r\n\r\n // The maximum number of significant digits of the result of a calculation or base conversion.\r\n // E.g. ` + "`"))) + ((`Decimal.config({ precision: 20 });` + ("`" + `\r\n precision: 20, // 1 to MAX_DIGITS\r\n\r\n // The rounding mode used by default by `)) + ("`" + (`toInteger` + "`"))))) + ((((`, ` + ("`" + `toDecimalPlaces`)) + ("`" + (`, ` + "`"))) + ((`toExponential` + ("`" + `,\r\n // `)) + ("`" + (`toFixed` + "`")))) + (((`, ` + ("`" + `toPrecision`)) + ("`" + (` and ` + "`"))) + ((`toSignificantDigits` + ("`" + `.\r\n //\r\n // ROUND_UP 0 Away from zero.\r\n // ROUND_DOWN 1 Towards zero.\r\n // ROUND_CEIL 2 Towards +Infinity.\r\n // ROUND_FLOOR 3 Towards -Infinity.\r\n // ROUND_HALF_UP 4 Towards nearest neighbour. If equidistant, up.\r\n // ROUND_HALF_DOWN 5 Towards nearest neighbour. If equidistant, down.\r\n // ROUND_HALF_EVEN 6 Towards nearest neighbour. If equidistant, towards even neighbour.\r\n // ROUND_HALF_CEIL 7 Towards nearest neighbour. If equidistant, towards +Infinity.\r\n // ROUND_HALF_FLOOR 8 Towards nearest neighbour. If equidistant, towards -Infinity.\r\n //\r\n // E.g.\r\n // `)) + (("`" + `Decimal.rounding = 4;`) + ("`" + `\r\n // `)))))) + ((((("`" + (`Decimal.rounding = Decimal.ROUND_HALF_UP;` + "`")) + (`\r\n rounding: 4, // 0 to 8\r\n\r\n // The exponent value at and beneath which ` + ("`" + `toString`))) + (("`" + (` returns exponential notation.\r\n // JavaScript numbers: -7\r\n toExpNeg: -7, // 0 to -MAX_E\r\n\r\n // The exponent value at and above which ` + "`")) + (`toString` + ("`" + ` returns exponential notation.\r\n // JavaScript numbers: 21\r\n toExpPos: 21, // 0 to MAX_E\r\n\r\n // The natural logarithm of 10.\r\n // 115 digits\r\n LN10: '2.302585092994045684017991454684364207601101488628772976033327900967572609677352480235997205089598298341967784042286'\r\n },\r\n\r\n\r\n // ----------------------------------- END OF EDITABLE DEFAULTS ------------------------------- //\r\n\r\n\r\n external = true,\r\n\r\n decimalError = '[DecimalError] ',\r\n invalidArgument = decimalError + 'Invalid argument: ',\r\n exponentOutOfRange = decimalError + 'Exponent out of range: ',\r\n\r\n mathfloor = Math.floor,\r\n mathpow = Math.pow,\r\n\r\n isDecimal = /^(\\d+(\\.\\d*)?|\\.\\d+)(e[+-]?\\d+)?$/i,\r\n\r\n ONE,\r\n BASE = 1e7,\r\n LOG_BASE = 7,\r\n MAX_SAFE_INTEGER = 9007199254740991,\r\n MAX_E = mathfloor(MAX_SAFE_INTEGER / LOG_BASE), // 1286742750677284\r\n\r\n // Decimal.prototype object\r\n P = {};\r\n\r\n\r\n // Decimal prototype methods\r\n\r\n\r\n /*\r\n * absoluteValue abs\r\n * comparedTo cmp\r\n * decimalPlaces dp\r\n * dividedBy div\r\n * dividedToIntegerBy idiv\r\n * equals eq\r\n * exponent\r\n * greaterThan gt\r\n * greaterThanOrEqualTo gte\r\n * isInteger isint\r\n * isNegative isneg\r\n * isPositive ispos\r\n * isZero\r\n * lessThan lt\r\n * lessThanOrEqualTo lte\r\n * logarithm log\r\n * minus sub\r\n * modulo mod\r\n * naturalExponential exp\r\n * naturalLogarithm ln\r\n * negated neg\r\n * plus add\r\n * precision sd\r\n * squareRoot sqrt\r\n * times mul\r\n * toDecimalPlaces todp\r\n * toExponential\r\n * toFixed\r\n * toInteger toint\r\n * toNumber\r\n * toPower pow\r\n * toPrecision\r\n * toSignificantDigits tosd\r\n * toString\r\n * valueOf val\r\n */\r\n\r\n\r\n /*\r\n * Return a new Decimal whose value is the absolute value of this Decimal.\r\n *\r\n */\r\n P.absoluteValue = P.abs = function () {\r\n var x = new this.constructor(this);\r\n if (x.s) x.s = 1;\r\n return x;\r\n };\r\n\r\n\r\n /*\r\n * Return\r\n * 1 if the value of this Decimal is greater than the value of `)))) + ((("`" + (`y` + "`")) + (`,\r\n * -1 if the value of this Decimal is less than the value of ` + ("`" + `y`))) + (("`" + (`,\r\n * 0 if they have the same value\r\n *\r\n */\r\n P.comparedTo = P.cmp = function (y) {\r\n var i, j, xdL, ydL,\r\n x = this;\r\n\r\n y = new x.constructor(y);\r\n\r\n // Signs differ?\r\n if (x.s !== y.s) return x.s || -y.s;\r\n\r\n // Compare exponents.\r\n if (x.e !== y.e) return x.e > y.e ^ x.s < 0 ? 1 : -1;\r\n\r\n xdL = x.d.length;\r\n ydL = y.d.length;\r\n\r\n // Compare digit by digit.\r\n for (i = 0, j = xdL < ydL ? xdL : ydL; i < j; ++i) {\r\n if (x.d[i] !== y.d[i]) return x.d[i] > y.d[i] ^ x.s < 0 ? 1 : -1;\r\n }\r\n\r\n // Compare lengths.\r\n return xdL === ydL ? 0 : xdL > ydL ^ x.s < 0 ? 1 : -1;\r\n };\r\n\r\n\r\n /*\r\n * Return the number of decimal places of the value of this Decimal.\r\n *\r\n */\r\n P.decimalPlaces = P.dp = function () {\r\n var x = this,\r\n w = x.d.length - 1,\r\n dp = (w - x.e) * LOG_BASE;\r\n\r\n // Subtract the number of trailing zeros of the last word.\r\n w = x.d[w];\r\n if (w) for (; w % 10 == 0; w /= 10) dp--;\r\n\r\n return dp < 0 ? 0 : dp;\r\n };\r\n\r\n\r\n /*\r\n * Return a new Decimal whose value is the value of this Decimal divided by ` + "`")) + ((`y` + "`") + (`, truncated to\r\n * ` + "`"))))) + ((((`precision` + ("`" + ` significant digits.\r\n *\r\n */\r\n P.dividedBy = P.div = function (y) {\r\n return divide(this, new this.constructor(y));\r\n };\r\n\r\n\r\n /*\r\n * Return a new Decimal whose value is the integer part of dividing the value of this Decimal\r\n * by the value of `)) + ("`" + (`y` + "`"))) + ((`, truncated to ` + ("`" + `precision`)) + ("`" + (` significant digits.\r\n *\r\n */\r\n P.dividedToIntegerBy = P.idiv = function (y) {\r\n var x = this,\r\n Ctor = x.constructor;\r\n return round(divide(x, new Ctor(y), 0, 1), Ctor.precision);\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this Decimal is equal to the value of ` + "`")))) + (((`y` + ("`" + `, otherwise return false.\r\n *\r\n */\r\n P.equals = P.eq = function (y) {\r\n return !this.cmp(y);\r\n };\r\n\r\n\r\n /*\r\n * Return the (base 10) exponent value of this Decimal (this.e is the base 10000000 exponent).\r\n *\r\n */\r\n P.exponent = function () {\r\n return getBase10Exponent(this);\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this Decimal is greater than the value of `)) + ("`" + (`y` + "`"))) + ((`, otherwise return\r\n * false.\r\n *\r\n */\r\n P.greaterThan = P.gt = function (y) {\r\n return this.cmp(y) > 0;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this Decimal is greater than or equal to the value of ` + ("`" + `y`)) + (("`" + `,\r\n * otherwise return false.\r\n *\r\n */\r\n P.greaterThanOrEqualTo = P.gte = function (y) {\r\n return this.cmp(y) >= 0;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this Decimal is an integer, otherwise return false.\r\n *\r\n */\r\n P.isInteger = P.isint = function () {\r\n return this.e > this.d.length - 2;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this Decimal is negative, otherwise return false.\r\n *\r\n */\r\n P.isNegative = P.isneg = function () {\r\n return this.s < 0;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this Decimal is positive, otherwise return false.\r\n *\r\n */\r\n P.isPositive = P.ispos = function () {\r\n return this.s > 0;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this Decimal is 0, otherwise return false.\r\n *\r\n */\r\n P.isZero = function () {\r\n return this.s === 0;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this Decimal is less than `) + ("`" + `y`)))))))) + ((((((("`" + (`, otherwise return false.\r\n *\r\n */\r\n P.lessThan = P.lt = function (y) {\r\n return this.cmp(y) < 0;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this Decimal is less than or equal to ` + "`")) + (`y` + ("`" + `, otherwise return false.\r\n *\r\n */\r\n P.lessThanOrEqualTo = P.lte = function (y) {\r\n return this.cmp(y) < 1;\r\n };\r\n\r\n\r\n /*\r\n * Return the logarithm of the value of this Decimal to the specified base, truncated to\r\n * `))) + (("`" + (`precision` + "`")) + (` significant digits.\r\n *\r\n * If no base is specified, return log[10](x).\r\n *\r\n * log[base](x) = ln(x) / ln(base)\r\n *\r\n * The maximum error of the result is 1 ulp (unit in the last place).\r\n *\r\n * [base] {number|string|Decimal} The base of the logarithm.\r\n *\r\n */\r\n P.logarithm = P.log = function (base) {\r\n var r,\r\n x = this,\r\n Ctor = x.constructor,\r\n pr = Ctor.precision,\r\n wpr = pr + 5;\r\n\r\n // Default base is 10.\r\n if (base === void 0) {\r\n base = new Ctor(10);\r\n } else {\r\n base = new Ctor(base);\r\n\r\n // log[-b](x) = NaN\r\n // log[0](x) = NaN\r\n // log[1](x) = NaN\r\n if (base.s < 1 || base.eq(ONE)) throw Error(decimalError + 'NaN');\r\n }\r\n\r\n // log[b](-x) = NaN\r\n // log[b](0) = -Infinity\r\n if (x.s < 1) throw Error(decimalError + (x.s ? 'NaN' : '-Infinity'));\r\n\r\n // log[b](1) = 0\r\n if (x.eq(ONE)) return new Ctor(0);\r\n\r\n external = false;\r\n r = divide(ln(x, wpr), ln(base, wpr), wpr);\r\n external = true;\r\n\r\n return round(r, pr);\r\n };\r\n\r\n\r\n /*\r\n * Return a new Decimal whose value is the value of this Decimal minus ` + ("`" + `y`)))) + ((("`" + (`, truncated to\r\n * ` + "`")) + (`precision` + ("`" + ` significant digits.\r\n *\r\n */\r\n P.minus = P.sub = function (y) {\r\n var x = this;\r\n y = new x.constructor(y);\r\n return x.s == y.s ? subtract(x, y) : add(x, (y.s = -y.s, y));\r\n };\r\n\r\n\r\n /*\r\n * Return a new Decimal whose value is the value of this Decimal modulo `))) + (("`" + (`y` + "`")) + (`, truncated to\r\n * ` + ("`" + `precision`))))) + (((("`" + (` significant digits.\r\n *\r\n */\r\n P.modulo = P.mod = function (y) {\r\n var q,\r\n x = this,\r\n Ctor = x.constructor,\r\n pr = Ctor.precision;\r\n\r\n y = new Ctor(y);\r\n\r\n // x % 0 = NaN\r\n if (!y.s) throw Error(decimalError + 'NaN');\r\n\r\n // Return x if x is 0.\r\n if (!x.s) return round(new Ctor(x), pr);\r\n\r\n // Prevent rounding of intermediate calculations.\r\n external = false;\r\n q = divide(x, y, 0, 1).times(y);\r\n external = true;\r\n\r\n return x.minus(q);\r\n };\r\n\r\n\r\n /*\r\n * Return a new Decimal whose value is the natural exponential of the value of this Decimal,\r\n * i.e. the base e raised to the power the value of this Decimal, truncated to ` + "`")) + (`precision` + ("`" + `\r\n * significant digits.\r\n *\r\n */\r\n P.naturalExponential = P.exp = function () {\r\n return exp(this);\r\n };\r\n\r\n\r\n /*\r\n * Return a new Decimal whose value is the natural logarithm of the value of this Decimal,\r\n * truncated to `))) + (("`" + (`precision` + "`")) + (` significant digits.\r\n *\r\n */\r\n P.naturalLogarithm = P.ln = function () {\r\n return ln(this);\r\n };\r\n\r\n\r\n /*\r\n * Return a new Decimal whose value is the value of this Decimal negated, i.e. as if multiplied by\r\n * -1.\r\n *\r\n */\r\n P.negated = P.neg = function () {\r\n var x = new this.constructor(this);\r\n x.s = -x.s || 0;\r\n return x;\r\n };\r\n\r\n\r\n /*\r\n * Return a new Decimal whose value is the value of this Decimal plus ` + ("`" + `y`)))) + ((("`" + (`, truncated to\r\n * ` + "`")) + (`precision` + ("`" + ` significant digits.\r\n *\r\n */\r\n P.plus = P.add = function (y) {\r\n var x = this;\r\n y = new x.constructor(y);\r\n return x.s == y.s ? add(x, y) : subtract(x, (y.s = -y.s, y));\r\n };\r\n\r\n\r\n /*\r\n * Return the number of significant digits of the value of this Decimal.\r\n *\r\n * [z] {boolean|number} Whether to count integer-part trailing zeros: true, false, 1 or 0.\r\n *\r\n */\r\n P.precision = P.sd = function (z) {\r\n var e, sd, w,\r\n x = this;\r\n\r\n if (z !== void 0 && z !== !!z && z !== 1 && z !== 0) throw Error(invalidArgument + z);\r\n\r\n e = getBase10Exponent(x) + 1;\r\n w = x.d.length - 1;\r\n sd = w * LOG_BASE + 1;\r\n w = x.d[w];\r\n\r\n // If non-zero...\r\n if (w) {\r\n\r\n // Subtract the number of trailing zeros of the last word.\r\n for (; w % 10 == 0; w /= 10) sd--;\r\n\r\n // Add the number of digits of the first word.\r\n for (w = x.d[0]; w >= 10; w /= 10) sd++;\r\n }\r\n\r\n return z && e > sd ? e : sd;\r\n };\r\n\r\n\r\n /*\r\n * Return a new Decimal whose value is the square root of this Decimal, truncated to `))) + (("`" + (`precision` + "`")) + ((`\r\n * significant digits.\r\n *\r\n */\r\n P.squareRoot = P.sqrt = function () {\r\n var e, n, pr, r, s, t, wpr,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n // Negative or zero?\r\n if (x.s < 1) {\r\n if (!x.s) return new Ctor(0);\r\n\r\n // sqrt(-x) = NaN\r\n throw Error(decimalError + 'NaN');\r\n }\r\n\r\n e = getBase10Exponent(x);\r\n external = false;\r\n\r\n // Initial estimate.\r\n s = Math.sqrt(+x);\r\n\r\n // Math.sqrt underflow/overflow?\r\n // Pass x to Math.sqrt as integer, then adjust the exponent of the result.\r\n if (s == 0 || s == 1 / 0) {\r\n n = digitsToString(x.d);\r\n if ((n.length + e) % 2 == 0) n += '0';\r\n s = Math.sqrt(n);\r\n e = mathfloor((e + 1) / 2) - (e < 0 || e % 2);\r\n\r\n if (s == 1 / 0) {\r\n n = '1e' + e;\r\n } else {\r\n n = s.toExponential();\r\n n = n.slice(0, n.indexOf('e') + 1) + e;\r\n }\r\n\r\n r = new Ctor(n);\r\n } else {\r\n r = new Ctor(s.toString());\r\n }\r\n\r\n pr = Ctor.precision;\r\n s = wpr = pr + 3;\r\n\r\n // Newton-Raphson iteration.\r\n for (;;) {\r\n t = r;\r\n r = t.plus(divide(x, t, wpr + 2)).times(0.5);\r\n\r\n if (digitsToString(t.d).slice(0, wpr) === (n = digitsToString(r.d)).slice(0, wpr)) {\r\n n = n.slice(wpr - 3, wpr + 1);\r\n\r\n // The 4th rounding digit may be in error by -1 so if the 4 rounding digits are 9999 or\r\n // 4999, i.e. approaching a rounding boundary, continue the iteration.\r\n if (s == wpr && n == '4999') {\r\n\r\n // On the first iteration only, check to see if rounding up gives the exact result as the\r\n // nines may infinitely repeat.\r\n round(t, pr + 1, 0);\r\n\r\n if (t.times(t).eq(x)) {\r\n r = t;\r\n break;\r\n }\r\n } else if (n != '9999') {\r\n break;\r\n }\r\n\r\n wpr += 4;\r\n }\r\n }\r\n\r\n external = true;\r\n\r\n return round(r, pr);\r\n };\r\n\r\n\r\n /*\r\n * Return a new Decimal whose value is the value of this Decimal times ` + "`") + (`y` + "`")))))) + (((((`, truncated to\r\n * ` + ("`" + `precision`)) + ("`" + (` significant digits.\r\n *\r\n */\r\n P.times = P.mul = function (y) {\r\n var carry, e, i, k, r, rL, t, xdL, ydL,\r\n x = this,\r\n Ctor = x.constructor,\r\n xd = x.d,\r\n yd = (y = new Ctor(y)).d;\r\n\r\n // Return 0 if either is 0.\r\n if (!x.s || !y.s) return new Ctor(0);\r\n\r\n y.s *= x.s;\r\n e = x.e + y.e;\r\n xdL = xd.length;\r\n ydL = yd.length;\r\n\r\n // Ensure xd points to the longer array.\r\n if (xdL < ydL) {\r\n r = xd;\r\n xd = yd;\r\n yd = r;\r\n rL = xdL;\r\n xdL = ydL;\r\n ydL = rL;\r\n }\r\n\r\n // Initialise the result array with zeros.\r\n r = [];\r\n rL = xdL + ydL;\r\n for (i = rL; i--;) r.push(0);\r\n\r\n // Multiply!\r\n for (i = ydL; --i >= 0;) {\r\n carry = 0;\r\n for (k = xdL + i; k > i;) {\r\n t = r[k] + yd[i] * xd[k - i - 1] + carry;\r\n r[k--] = t % BASE | 0;\r\n carry = t / BASE | 0;\r\n }\r\n\r\n r[k] = (r[k] + carry) % BASE | 0;\r\n }\r\n\r\n // Remove trailing zeros.\r\n for (; !r[--rL];) r.pop();\r\n\r\n if (carry) ++e;\r\n else r.shift();\r\n\r\n y.d = r;\r\n y.e = e;\r\n\r\n return external ? round(y, Ctor.precision) : y;\r\n };\r\n\r\n\r\n /*\r\n * Return a new Decimal whose value is the value of this Decimal rounded to a maximum of ` + "`"))) + ((`dp` + ("`" + `\r\n * decimal places using rounding mode `)) + ("`" + (`rm` + "`")))) + (((` or ` + ("`" + `rounding`)) + ("`" + (` if ` + "`"))) + ((`rm` + ("`" + ` is omitted.\r\n *\r\n * If `)) + (("`" + `dp`) + ("`" + ` is omitted, return a new Decimal whose value is the value of this Decimal.\r\n *\r\n * [dp] {number} Decimal places. Integer, 0 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n */\r\n P.toDecimalPlaces = P.todp = function (dp, rm) {\r\n var x = this,\r\n Ctor = x.constructor;\r\n\r\n x = new Ctor(x);\r\n if (dp === void 0) return x;\r\n\r\n checkInt32(dp, 0, MAX_DIGITS);\r\n\r\n if (rm === void 0) rm = Ctor.rounding;\r\n else checkInt32(rm, 0, 8);\r\n\r\n return round(x, dp + getBase10Exponent(x) + 1, rm);\r\n };\r\n\r\n\r\n /*\r\n * Return a string representing the value of this Decimal in exponential notation rounded to\r\n * `))))) + (((("`" + (`dp` + "`")) + (` fixed decimal places using rounding mode ` + ("`" + `rounding`))) + (("`" + (`.\r\n *\r\n * [dp] {number} Decimal places. Integer, 0 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n */\r\n P.toExponential = function (dp, rm) {\r\n var str,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (dp === void 0) {\r\n str = toString(x, true);\r\n } else {\r\n checkInt32(dp, 0, MAX_DIGITS);\r\n\r\n if (rm === void 0) rm = Ctor.rounding;\r\n else checkInt32(rm, 0, 8);\r\n\r\n x = round(new Ctor(x), dp + 1, rm);\r\n str = toString(x, true, dp + 1);\r\n }\r\n\r\n return str;\r\n };\r\n\r\n\r\n /*\r\n * Return a string representing the value of this Decimal in normal (fixed-point) notation to\r\n * ` + "`")) + (`dp` + ("`" + ` fixed decimal places and rounded using rounding mode `)))) + ((("`" + (`rm` + "`")) + (` or ` + ("`" + `rounding`))) + (("`" + (` if ` + "`")) + ((`rm` + "`") + (` is\r\n * omitted.\r\n *\r\n * As with JavaScript numbers, (-0).toFixed(0) is '0', but e.g. (-0.00001).toFixed(0) is '-0'.\r\n *\r\n * [dp] {number} Decimal places. Integer, 0 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * (-0).toFixed(0) is '0', but (-0.1).toFixed(0) is '-0'.\r\n * (-0).toFixed(1) is '0.0', but (-0.01).toFixed(1) is '-0.0'.\r\n * (-0).toFixed(3) is '0.000'.\r\n * (-0.5).toFixed(0) is '-0'.\r\n *\r\n */\r\n P.toFixed = function (dp, rm) {\r\n var str, y,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (dp === void 0) return toString(x);\r\n\r\n checkInt32(dp, 0, MAX_DIGITS);\r\n\r\n if (rm === void 0) rm = Ctor.rounding;\r\n else checkInt32(rm, 0, 8);\r\n\r\n y = round(new Ctor(x), dp + getBase10Exponent(x) + 1, rm);\r\n str = toString(y.abs(), false, dp + getBase10Exponent(y) + 1);\r\n\r\n // To determine whether to add the minus sign look at the value before it was rounded,\r\n // i.e. look at ` + "`"))))))) + ((((((`x` + ("`" + ` rather than `)) + ("`" + (`y` + "`"))) + ((`.\r\n return x.isneg() && !x.isZero() ? '-' + str : str;\r\n };\r\n\r\n\r\n /*\r\n * Return a new Decimal whose value is the value of this Decimal rounded to a whole number using\r\n * rounding mode ` + ("`" + `rounding`)) + ("`" + (`.\r\n *\r\n */\r\n P.toInteger = P.toint = function () {\r\n var x = this,\r\n Ctor = x.constructor;\r\n return round(new Ctor(x), getBase10Exponent(x) + 1, Ctor.rounding);\r\n };\r\n\r\n\r\n /*\r\n * Return the value of this Decimal converted to a number primitive.\r\n *\r\n */\r\n P.toNumber = function () {\r\n return +this;\r\n };\r\n\r\n\r\n /*\r\n * Return a new Decimal whose value is the value of this Decimal raised to the power ` + "`")))) + (((`y` + ("`" + `,\r\n * truncated to `)) + ("`" + (`precision` + "`"))) + ((` significant digits.\r\n *\r\n * For non-integer or very large exponents pow(x, y) is calculated using\r\n *\r\n * x^y = exp(y*ln(x))\r\n *\r\n * The maximum error is 1 ulp (unit in last place).\r\n *\r\n * y {number|string|Decimal} The power to which to raise this Decimal.\r\n *\r\n */\r\n P.toPower = P.pow = function (y) {\r\n var e, k, pr, r, sign, yIsInt,\r\n x = this,\r\n Ctor = x.constructor,\r\n guard = 12,\r\n yn = +(y = new Ctor(y));\r\n\r\n // pow(x, 0) = 1\r\n if (!y.s) return new Ctor(ONE);\r\n\r\n x = new Ctor(x);\r\n\r\n // pow(0, y > 0) = 0\r\n // pow(0, y < 0) = Infinity\r\n if (!x.s) {\r\n if (y.s < 1) throw Error(decimalError + 'Infinity');\r\n return x;\r\n }\r\n\r\n // pow(1, y) = 1\r\n if (x.eq(ONE)) return x;\r\n\r\n pr = Ctor.precision;\r\n\r\n // pow(x, 1) = x\r\n if (y.eq(ONE)) return round(x, pr);\r\n\r\n e = y.e;\r\n k = y.d.length - 1;\r\n yIsInt = e >= k;\r\n sign = x.s;\r\n\r\n if (!yIsInt) {\r\n\r\n // pow(x < 0, y non-integer) = NaN\r\n if (sign < 0) throw Error(decimalError + 'NaN');\r\n\r\n // If y is a small integer use the 'exponentiation by squaring' algorithm.\r\n } else if ((k = yn < 0 ? -yn : yn) <= MAX_SAFE_INTEGER) {\r\n r = new Ctor(ONE);\r\n\r\n // Max k of 9007199254740991 takes 53 loop iterations.\r\n // Maximum digits array length; leaves [28, 34] guard digits.\r\n e = Math.ceil(pr / LOG_BASE + 4);\r\n\r\n external = false;\r\n\r\n for (;;) {\r\n if (k % 2) {\r\n r = r.times(x);\r\n truncate(r.d, e);\r\n }\r\n\r\n k = mathfloor(k / 2);\r\n if (k === 0) break;\r\n\r\n x = x.times(x);\r\n truncate(x.d, e);\r\n }\r\n\r\n external = true;\r\n\r\n return y.s < 0 ? new Ctor(ONE).div(r) : round(r, pr);\r\n }\r\n\r\n // Result is negative if x is negative and the last digit of integer y is odd.\r\n sign = sign < 0 && y.d[Math.max(e, k)] & 1 ? -1 : 1;\r\n\r\n x.s = 1;\r\n external = false;\r\n r = y.times(ln(x, pr + guard));\r\n external = true;\r\n r = exp(r);\r\n r.s = sign;\r\n\r\n return r;\r\n };\r\n\r\n\r\n /*\r\n * Return a string representing the value of this Decimal rounded to ` + ("`" + `sd`)) + ("`" + (` significant digits\r\n * using rounding mode ` + "`"))))) + ((((`rounding` + ("`" + `.\r\n *\r\n * Return exponential notation if `)) + ("`" + (`sd` + "`"))) + ((` is less than the number of digits necessary to represent\r\n * the integer part of the value in normal notation.\r\n *\r\n * [sd] {number} Significant digits. Integer, 1 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n */\r\n P.toPrecision = function (sd, rm) {\r\n var e, str,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (sd === void 0) {\r\n e = getBase10Exponent(x);\r\n str = toString(x, e <= Ctor.toExpNeg || e >= Ctor.toExpPos);\r\n } else {\r\n checkInt32(sd, 1, MAX_DIGITS);\r\n\r\n if (rm === void 0) rm = Ctor.rounding;\r\n else checkInt32(rm, 0, 8);\r\n\r\n x = round(new Ctor(x), sd, rm);\r\n e = getBase10Exponent(x);\r\n str = toString(x, sd <= e || e <= Ctor.toExpNeg, sd);\r\n }\r\n\r\n return str;\r\n };\r\n\r\n\r\n /*\r\n * Return a new Decimal whose value is the value of this Decimal rounded to a maximum of ` + ("`" + `sd`)) + ("`" + (`\r\n * significant digits using rounding mode ` + "`")))) + (((`rm` + ("`" + `, or to `)) + ("`" + (`precision` + "`"))) + ((` and ` + ("`" + `rounding`)) + (("`" + ` respectively if\r\n * omitted.\r\n *\r\n * [sd] {number} Significant digits. Integer, 1 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n */\r\n P.toSignificantDigits = P.tosd = function (sd, rm) {\r\n var x = this,\r\n Ctor = x.constructor;\r\n\r\n if (sd === void 0) {\r\n sd = Ctor.precision;\r\n rm = Ctor.rounding;\r\n } else {\r\n checkInt32(sd, 1, MAX_DIGITS);\r\n\r\n if (rm === void 0) rm = Ctor.rounding;\r\n else checkInt32(rm, 0, 8);\r\n }\r\n\r\n return round(new Ctor(x), sd, rm);\r\n };\r\n\r\n\r\n /*\r\n * Return a string representing the value of this Decimal.\r\n *\r\n * Return exponential notation if this Decimal has a positive exponent equal to or greater than\r\n * `) + ("`" + `toExpPos`)))))) + ((((("`" + (`, or a negative exponent equal to or less than ` + "`")) + (`toExpNeg` + ("`" + `.\r\n *\r\n */\r\n P.toString = P.valueOf = P.val = P.toJSON = function () {\r\n var x = this,\r\n e = getBase10Exponent(x),\r\n Ctor = x.constructor;\r\n\r\n return toString(x, e <= Ctor.toExpNeg || e >= Ctor.toExpPos);\r\n };\r\n\r\n\r\n // Helper functions for Decimal.prototype (P) and/or Decimal methods, and their callers.\r\n\r\n\r\n /*\r\n * add P.minus, P.plus\r\n * checkInt32 P.todp, P.toExponential, P.toFixed, P.toPrecision, P.tosd\r\n * digitsToString P.log, P.sqrt, P.pow, toString, exp, ln\r\n * divide P.div, P.idiv, P.log, P.mod, P.sqrt, exp, ln\r\n * exp P.exp, P.pow\r\n * getBase10Exponent P.exponent, P.sd, P.toint, P.sqrt, P.todp, P.toFixed, P.toPrecision,\r\n * P.toString, divide, round, toString, exp, ln\r\n * getLn10 P.log, ln\r\n * getZeroString digitsToString, toString\r\n * ln P.log, P.ln, P.pow, exp\r\n * parseDecimal Decimal\r\n * round P.abs, P.idiv, P.log, P.minus, P.mod, P.neg, P.plus, P.toint, P.sqrt,\r\n * P.times, P.todp, P.toExponential, P.toFixed, P.pow, P.toPrecision, P.tosd,\r\n * divide, getLn10, exp, ln\r\n * subtract P.minus, P.plus\r\n * toString P.toExponential, P.toFixed, P.toPrecision, P.toString, P.valueOf\r\n * truncate P.pow\r\n *\r\n * Throws: P.log, P.mod, P.sd, P.sqrt, P.pow, checkInt32, divide, round,\r\n * getLn10, exp, ln, parseDecimal, Decimal, config\r\n */\r\n\r\n\r\n function add(x, y) {\r\n var carry, d, e, i, k, len, xd, yd,\r\n Ctor = x.constructor,\r\n pr = Ctor.precision;\r\n\r\n // If either is zero...\r\n if (!x.s || !y.s) {\r\n\r\n // Return x if y is zero.\r\n // Return y if y is non-zero.\r\n if (!y.s) y = new Ctor(x);\r\n return external ? round(y, pr) : y;\r\n }\r\n\r\n xd = x.d;\r\n yd = y.d;\r\n\r\n // x and y are finite, non-zero numbers with the same sign.\r\n\r\n k = x.e;\r\n e = y.e;\r\n xd = xd.slice();\r\n i = k - e;\r\n\r\n // If base 1e7 exponents differ...\r\n if (i) {\r\n if (i < 0) {\r\n d = xd;\r\n i = -i;\r\n len = yd.length;\r\n } else {\r\n d = yd;\r\n e = k;\r\n len = xd.length;\r\n }\r\n\r\n // Limit number of zeros prepended to max(ceil(pr / LOG_BASE), len) + 1.\r\n k = Math.ceil(pr / LOG_BASE);\r\n len = k > len ? k + 1 : len + 1;\r\n\r\n if (i > len) {\r\n i = len;\r\n d.length = 1;\r\n }\r\n\r\n // Prepend zeros to equalise exponents. Note: Faster to use reverse then do unshifts.\r\n d.reverse();\r\n for (; i--;) d.push(0);\r\n d.reverse();\r\n }\r\n\r\n len = xd.length;\r\n i = yd.length;\r\n\r\n // If yd is longer than xd, swap xd and yd so xd points to the longer array.\r\n if (len - i < 0) {\r\n i = len;\r\n d = yd;\r\n yd = xd;\r\n xd = d;\r\n }\r\n\r\n // Only start adding at yd.length - 1 as the further digits of xd can be left as they are.\r\n for (carry = 0; i;) {\r\n carry = (xd[--i] = xd[i] + yd[i] + carry) / BASE | 0;\r\n xd[i] %= BASE;\r\n }\r\n\r\n if (carry) {\r\n xd.unshift(carry);\r\n ++e;\r\n }\r\n\r\n // Remove trailing zeros.\r\n // No need to check for zero, as +x + +y != 0 && -x + -y != 0\r\n for (len = xd.length; xd[--len] == 0;) xd.pop();\r\n\r\n y.d = xd;\r\n y.e = e;\r\n\r\n return external ? round(y, pr) : y;\r\n }\r\n\r\n\r\n function checkInt32(i, min, max) {\r\n if (i !== ~~i || i < min || i > max) {\r\n throw Error(invalidArgument + i);\r\n }\r\n }\r\n\r\n\r\n function digitsToString(d) {\r\n var i, k, ws,\r\n indexOfLastWord = d.length - 1,\r\n str = '',\r\n w = d[0];\r\n\r\n if (indexOfLastWord > 0) {\r\n str += w;\r\n for (i = 1; i < indexOfLastWord; i++) {\r\n ws = d[i] + '';\r\n k = LOG_BASE - ws.length;\r\n if (k) str += getZeroString(k);\r\n str += ws;\r\n }\r\n\r\n w = d[i];\r\n ws = w + '';\r\n k = LOG_BASE - ws.length;\r\n if (k) str += getZeroString(k);\r\n } else if (w === 0) {\r\n return '0';\r\n }\r\n\r\n // Remove trailing zeros of last w.\r\n for (; w % 10 === 0;) w /= 10;\r\n\r\n return str + w;\r\n }\r\n\r\n\r\n var divide = (function () {\r\n\r\n // Assumes non-zero x and k, and hence non-zero result.\r\n function multiplyInteger(x, k) {\r\n var temp,\r\n carry = 0,\r\n i = x.length;\r\n\r\n for (x = x.slice(); i--;) {\r\n temp = x[i] * k + carry;\r\n x[i] = temp % BASE | 0;\r\n carry = temp / BASE | 0;\r\n }\r\n\r\n if (carry) x.unshift(carry);\r\n\r\n return x;\r\n }\r\n\r\n function compare(a, b, aL, bL) {\r\n var i, r;\r\n\r\n if (aL != bL) {\r\n r = aL > bL ? 1 : -1;\r\n } else {\r\n for (i = r = 0; i < aL; i++) {\r\n if (a[i] != b[i]) {\r\n r = a[i] > b[i] ? 1 : -1;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return r;\r\n }\r\n\r\n function subtract(a, b, aL) {\r\n var i = 0;\r\n\r\n // Subtract b from a.\r\n for (; aL--;) {\r\n a[aL] -= i;\r\n i = a[aL] < b[aL] ? 1 : 0;\r\n a[aL] = i * BASE + a[aL] - b[aL];\r\n }\r\n\r\n // Remove leading zeros.\r\n for (; !a[0] && a.length > 1;) a.shift();\r\n }\r\n\r\n return function (x, y, pr, dp) {\r\n var cmp, e, i, k, prod, prodL, q, qd, rem, remL, rem0, sd, t, xi, xL, yd0, yL, yz,\r\n Ctor = x.constructor,\r\n sign = x.s == y.s ? 1 : -1,\r\n xd = x.d,\r\n yd = y.d;\r\n\r\n // Either 0?\r\n if (!x.s) return new Ctor(x);\r\n if (!y.s) throw Error(decimalError + 'Division by zero');\r\n\r\n e = x.e - y.e;\r\n yL = yd.length;\r\n xL = xd.length;\r\n q = new Ctor(sign);\r\n qd = q.d = [];\r\n\r\n // Result exponent may be one less than e.\r\n for (i = 0; yd[i] == (xd[i] || 0); ) ++i;\r\n if (yd[i] > (xd[i] || 0)) --e;\r\n\r\n if (pr == null) {\r\n sd = pr = Ctor.precision;\r\n } else if (dp) {\r\n sd = pr + (getBase10Exponent(x) - getBase10Exponent(y)) + 1;\r\n } else {\r\n sd = pr;\r\n }\r\n\r\n if (sd < 0) return new Ctor(0);\r\n\r\n // Convert precision in number of base 10 digits to base 1e7 digits.\r\n sd = sd / LOG_BASE + 2 | 0;\r\n i = 0;\r\n\r\n // divisor < 1e7\r\n if (yL == 1) {\r\n k = 0;\r\n yd = yd[0];\r\n sd++;\r\n\r\n // k is the carry.\r\n for (; (i < xL || k) && sd--; i++) {\r\n t = k * BASE + (xd[i] || 0);\r\n qd[i] = t / yd | 0;\r\n k = t % yd | 0;\r\n }\r\n\r\n // divisor >= 1e7\r\n } else {\r\n\r\n // Normalise xd and yd so highest order digit of yd is >= BASE/2\r\n k = BASE / (yd[0] + 1) | 0;\r\n\r\n if (k > 1) {\r\n yd = multiplyInteger(yd, k);\r\n xd = multiplyInteger(xd, k);\r\n yL = yd.length;\r\n xL = xd.length;\r\n }\r\n\r\n xi = yL;\r\n rem = xd.slice(0, yL);\r\n remL = rem.length;\r\n\r\n // Add zeros to make remainder as long as divisor.\r\n for (; remL < yL;) rem[remL++] = 0;\r\n\r\n yz = yd.slice();\r\n yz.unshift(0);\r\n yd0 = yd[0];\r\n\r\n if (yd[1] >= BASE / 2) ++yd0;\r\n\r\n do {\r\n k = 0;\r\n\r\n // Compare divisor and remainder.\r\n cmp = compare(yd, rem, yL, remL);\r\n\r\n // If divisor < remainder.\r\n if (cmp < 0) {\r\n\r\n // Calculate trial digit, k.\r\n rem0 = rem[0];\r\n if (yL != remL) rem0 = rem0 * BASE + (rem[1] || 0);\r\n\r\n // k will be how many times the divisor goes into the current remainder.\r\n k = rem0 / yd0 | 0;\r\n\r\n // Algorithm:\r\n // 1. product = divisor * trial digit (k)\r\n // 2. if product > remainder: product -= divisor, k--\r\n // 3. remainder -= product\r\n // 4. if product was < remainder at 2:\r\n // 5. compare new remainder and divisor\r\n // 6. If remainder > divisor: remainder -= divisor, k++\r\n\r\n if (k > 1) {\r\n if (k >= BASE) k = BASE - 1;\r\n\r\n // product = divisor * trial digit.\r\n prod = multiplyInteger(yd, k);\r\n prodL = prod.length;\r\n remL = rem.length;\r\n\r\n // Compare product and remainder.\r\n cmp = compare(prod, rem, prodL, remL);\r\n\r\n // product > remainder.\r\n if (cmp == 1) {\r\n k--;\r\n\r\n // Subtract divisor from product.\r\n subtract(prod, yL < prodL ? yz : yd, prodL);\r\n }\r\n } else {\r\n\r\n // cmp is -1.\r\n // If k is 0, there is no need to compare yd and rem again below, so change cmp to 1\r\n // to avoid it. If k is 1 there is a need to compare yd and rem again below.\r\n if (k == 0) cmp = k = 1;\r\n prod = yd.slice();\r\n }\r\n\r\n prodL = prod.length;\r\n if (prodL < remL) prod.unshift(0);\r\n\r\n // Subtract product from remainder.\r\n subtract(rem, prod, remL);\r\n\r\n // If product was < previous remainder.\r\n if (cmp == -1) {\r\n remL = rem.length;\r\n\r\n // Compare divisor and new remainder.\r\n cmp = compare(yd, rem, yL, remL);\r\n\r\n // If divisor < new remainder, subtract divisor from remainder.\r\n if (cmp < 1) {\r\n k++;\r\n\r\n // Subtract divisor from remainder.\r\n subtract(rem, yL < remL ? yz : yd, remL);\r\n }\r\n }\r\n\r\n remL = rem.length;\r\n } else if (cmp === 0) {\r\n k++;\r\n rem = [0];\r\n } // if cmp === 1, k will be 0\r\n\r\n // Add the next digit, k, to the result array.\r\n qd[i++] = k;\r\n\r\n // Update the remainder.\r\n if (cmp && rem[0]) {\r\n rem[remL++] = xd[xi] || 0;\r\n } else {\r\n rem = [xd[xi]];\r\n remL = 1;\r\n }\r\n\r\n } while ((xi++ < xL || rem[0] !== void 0) && sd--);\r\n }\r\n\r\n // Leading zero?\r\n if (!qd[0]) qd.shift();\r\n\r\n q.e = e;\r\n\r\n return round(q, dp ? pr + getBase10Exponent(q) + 1 : pr);\r\n };\r\n })();\r\n\r\n\r\n /*\r\n * Return a new Decimal whose value is the natural exponential of `))) + (("`" + (`x` + "`")) + (` truncated to ` + ("`" + `sd`)))) + ((("`" + (`\r\n * significant digits.\r\n *\r\n * Taylor/Maclaurin series.\r\n *\r\n * exp(x) = x^0/0! + x^1/1! + x^2/2! + x^3/3! + ...\r\n *\r\n * Argument reduction:\r\n * Repeat x = x / 32, k += 5, until |x| < 0.1\r\n * exp(x) = exp(x / 2^k)^(2^k)\r\n *\r\n * Previously, the argument was initially reduced by\r\n * exp(x) = exp(r) * 10^k where r = x - k * ln10, k = floor(x / ln10)\r\n * to first put r in the range [0, ln10], before dividing by 32 until |x| < 0.1, but this was\r\n * found to be slower than just dividing repeatedly by 32 as above.\r\n *\r\n * (Math object integer min/max: Math.exp(709) = 8.2e+307, Math.exp(-745) = 5e-324)\r\n *\r\n * exp(x) is non-terminating for any finite, non-zero x.\r\n *\r\n */\r\n function exp(x, sd) {\r\n var denominator, guard, pow, sum, t, wpr,\r\n i = 0,\r\n k = 0,\r\n Ctor = x.constructor,\r\n pr = Ctor.precision;\r\n\r\n if (getBase10Exponent(x) > 16) throw Error(exponentOutOfRange + getBase10Exponent(x));\r\n\r\n // exp(0) = 1\r\n if (!x.s) return new Ctor(ONE);\r\n\r\n if (sd == null) {\r\n external = false;\r\n wpr = pr;\r\n } else {\r\n wpr = sd;\r\n }\r\n\r\n t = new Ctor(0.03125);\r\n\r\n while (x.abs().gte(0.1)) {\r\n x = x.times(t); // x = x / 2^5\r\n k += 5;\r\n }\r\n\r\n // Estimate the precision increase necessary to ensure the first 4 rounding digits are correct.\r\n guard = Math.log(mathpow(2, k)) / Math.LN10 * 2 + 5 | 0;\r\n wpr += guard;\r\n denominator = pow = sum = new Ctor(ONE);\r\n Ctor.precision = wpr;\r\n\r\n for (;;) {\r\n pow = round(pow.times(x), wpr);\r\n denominator = denominator.times(++i);\r\n t = sum.plus(divide(pow, denominator, wpr));\r\n\r\n if (digitsToString(t.d).slice(0, wpr) === digitsToString(sum.d).slice(0, wpr)) {\r\n while (k--) sum = round(sum.times(sum), wpr);\r\n Ctor.precision = pr;\r\n return sd == null ? (external = true, round(sum, pr)) : sum;\r\n }\r\n\r\n sum = t;\r\n }\r\n }\r\n\r\n\r\n // Calculate the base 10 exponent from the base 1e7 exponent.\r\n function getBase10Exponent(x) {\r\n var e = x.e * LOG_BASE,\r\n w = x.d[0];\r\n\r\n // Add the number of digits of the first word of the digits array.\r\n for (; w >= 10; w /= 10) e++;\r\n return e;\r\n }\r\n\r\n\r\n function getLn10(Ctor, sd, pr) {\r\n\r\n if (sd > Ctor.LN10.sd()) {\r\n\r\n\r\n // Reset global state in case the exception is caught.\r\n external = true;\r\n if (pr) Ctor.precision = pr;\r\n throw Error(decimalError + 'LN10 precision limit exceeded');\r\n }\r\n\r\n return round(new Ctor(Ctor.LN10), sd);\r\n }\r\n\r\n\r\n function getZeroString(k) {\r\n var zs = '';\r\n for (; k--;) zs += '0';\r\n return zs;\r\n }\r\n\r\n\r\n /*\r\n * Return a new Decimal whose value is the natural logarithm of ` + "`")) + (`x` + ("`" + ` truncated to `))) + (("`" + (`sd` + "`")) + ((` significant\r\n * digits.\r\n *\r\n * ln(n) is non-terminating (n != 1)\r\n *\r\n */\r\n function ln(y, sd) {\r\n var c, c0, denominator, e, numerator, sum, t, wpr, x2,\r\n n = 1,\r\n guard = 10,\r\n x = y,\r\n xd = x.d,\r\n Ctor = x.constructor,\r\n pr = Ctor.precision;\r\n\r\n // ln(-x) = NaN\r\n // ln(0) = -Infinity\r\n if (x.s < 1) throw Error(decimalError + (x.s ? 'NaN' : '-Infinity'));\r\n\r\n // ln(1) = 0\r\n if (x.eq(ONE)) return new Ctor(0);\r\n\r\n if (sd == null) {\r\n external = false;\r\n wpr = pr;\r\n } else {\r\n wpr = sd;\r\n }\r\n\r\n if (x.eq(10)) {\r\n if (sd == null) external = true;\r\n return getLn10(Ctor, wpr);\r\n }\r\n\r\n wpr += guard;\r\n Ctor.precision = wpr;\r\n c = digitsToString(xd);\r\n c0 = c.charAt(0);\r\n e = getBase10Exponent(x);\r\n\r\n if (Math.abs(e) < 1.5e15) {\r\n\r\n // Argument reduction.\r\n // The series converges faster the closer the argument is to 1, so using\r\n // ln(a^b) = b * ln(a), ln(a) = ln(a^b) / b\r\n // multiply the argument by itself until the leading digits of the significand are 7, 8, 9,\r\n // 10, 11, 12 or 13, recording the number of multiplications so the sum of the series can\r\n // later be divided by this number, then separate out the power of 10 using\r\n // ln(a*10^b) = ln(a) + b*ln(10).\r\n\r\n // max n is 21 (gives 0.9, 1.0 or 1.1) (9e15 / 21 = 4.2e14).\r\n //while (c0 < 9 && c0 != 1 || c0 == 1 && c.charAt(1) > 1) {\r\n // max n is 6 (gives 0.7 - 1.3)\r\n while (c0 < 7 && c0 != 1 || c0 == 1 && c.charAt(1) > 3) {\r\n x = x.times(y);\r\n c = digitsToString(x.d);\r\n c0 = c.charAt(0);\r\n n++;\r\n }\r\n\r\n e = getBase10Exponent(x);\r\n\r\n if (c0 > 1) {\r\n x = new Ctor('0.' + c);\r\n e++;\r\n } else {\r\n x = new Ctor(c0 + '.' + c.slice(1));\r\n }\r\n } else {\r\n\r\n // The argument reduction method above may result in overflow if the argument y is a massive\r\n // number with exponent >= 1500000000000000 (9e15 / 6 = 1.5e15), so instead recall this\r\n // function using ln(x*10^e) = ln(x) + e*ln(10).\r\n t = getLn10(Ctor, wpr + 2, pr).times(e + '');\r\n x = ln(new Ctor(c0 + '.' + c.slice(1)), wpr - guard).plus(t);\r\n\r\n Ctor.precision = pr;\r\n return sd == null ? (external = true, round(x, pr)) : x;\r\n }\r\n\r\n // x is reduced to a value near 1.\r\n\r\n // Taylor series.\r\n // ln(y) = ln((1 + x)/(1 - x)) = 2(x + x^3/3 + x^5/5 + x^7/7 + ...)\r\n // where x = (y - 1)/(y + 1) (|x| < 1)\r\n sum = numerator = x = divide(x.minus(ONE), x.plus(ONE), wpr);\r\n x2 = round(x.times(x), wpr);\r\n denominator = 3;\r\n\r\n for (;;) {\r\n numerator = round(numerator.times(x2), wpr);\r\n t = sum.plus(divide(numerator, new Ctor(denominator), wpr));\r\n\r\n if (digitsToString(t.d).slice(0, wpr) === digitsToString(sum.d).slice(0, wpr)) {\r\n sum = sum.times(2);\r\n\r\n // Reverse the argument reduction.\r\n if (e !== 0) sum = sum.plus(getLn10(Ctor, wpr + 2, pr).times(e + ''));\r\n sum = divide(sum, new Ctor(n), wpr);\r\n\r\n Ctor.precision = pr;\r\n return sd == null ? (external = true, round(sum, pr)) : sum;\r\n }\r\n\r\n sum = t;\r\n denominator += 2;\r\n }\r\n }\r\n\r\n\r\n /*\r\n * Parse the value of a new Decimal ` + "`") + (`x` + "`"))))) + ((((` from string ` + ("`" + `str`)) + ("`" + (`.\r\n */\r\n function parseDecimal(x, str) {\r\n var e, i, len;\r\n\r\n // Decimal point?\r\n if ((e = str.indexOf('.')) > -1) str = str.replace('.', '');\r\n\r\n // Exponential form?\r\n if ((i = str.search(/e/i)) > 0) {\r\n\r\n // Determine exponent.\r\n if (e < 0) e = i;\r\n e += +str.slice(i + 1);\r\n str = str.substring(0, i);\r\n } else if (e < 0) {\r\n\r\n // Integer.\r\n e = str.length;\r\n }\r\n\r\n // Determine leading zeros.\r\n for (i = 0; str.charCodeAt(i) === 48;) ++i;\r\n\r\n // Determine trailing zeros.\r\n for (len = str.length; str.charCodeAt(len - 1) === 48;) --len;\r\n str = str.slice(i, len);\r\n\r\n if (str) {\r\n len -= i;\r\n e = e - i - 1;\r\n x.e = mathfloor(e / LOG_BASE);\r\n x.d = [];\r\n\r\n // Transform base\r\n\r\n // e is the base 10 exponent.\r\n // i is where to slice str to get the first word of the digits array.\r\n i = (e + 1) % LOG_BASE;\r\n if (e < 0) i += LOG_BASE;\r\n\r\n if (i < len) {\r\n if (i) x.d.push(+str.slice(0, i));\r\n for (len -= LOG_BASE; i < len;) x.d.push(+str.slice(i, i += LOG_BASE));\r\n str = str.slice(i);\r\n i = LOG_BASE - str.length;\r\n } else {\r\n i -= len;\r\n }\r\n\r\n for (; i--;) str += '0';\r\n x.d.push(+str);\r\n\r\n if (external && (x.e > MAX_E || x.e < -MAX_E)) throw Error(exponentOutOfRange + e);\r\n } else {\r\n\r\n // Zero.\r\n x.s = 0;\r\n x.e = 0;\r\n x.d = [0];\r\n }\r\n\r\n return x;\r\n }\r\n\r\n\r\n /*\r\n * Round ` + "`"))) + ((`x` + ("`" + ` to `)) + ("`" + (`sd` + "`")))) + (((` significant digits, using rounding mode ` + ("`" + `rm`)) + ("`" + (` if present (truncate otherwise).\r\n */\r\n function round(x, sd, rm) {\r\n var i, j, k, n, rd, doRound, w, xdi,\r\n xd = x.d;\r\n\r\n // rd: the rounding digit, i.e. the digit after the digit that may be rounded up.\r\n // w: the word of xd which contains the rounding digit, a base 1e7 number.\r\n // xdi: the index of w within xd.\r\n // n: the number of digits of w.\r\n // i: what would be the index of rd within w if all the numbers were 7 digits long (i.e. if\r\n // they had leading zeros)\r\n // j: if > 0, the actual index of rd within w (if < 0, rd is a leading zero).\r\n\r\n // Get the length of the first word of the digits array xd.\r\n for (n = 1, k = xd[0]; k >= 10; k /= 10) n++;\r\n i = sd - n;\r\n\r\n // Is the rounding digit in the first word of xd?\r\n if (i < 0) {\r\n i += LOG_BASE;\r\n j = sd;\r\n w = xd[xdi = 0];\r\n } else {\r\n xdi = Math.ceil((i + 1) / LOG_BASE);\r\n k = xd.length;\r\n if (xdi >= k) return x;\r\n w = k = xd[xdi];\r\n\r\n // Get the number of digits of w.\r\n for (n = 1; k >= 10; k /= 10) n++;\r\n\r\n // Get the index of rd within w.\r\n i %= LOG_BASE;\r\n\r\n // Get the index of rd within w, adjusted for leading zeros.\r\n // The number of leading zeros of w is given by LOG_BASE - n.\r\n j = i - LOG_BASE + n;\r\n }\r\n\r\n if (rm !== void 0) {\r\n k = mathpow(10, n - j - 1);\r\n\r\n // Get the rounding digit at index j of w.\r\n rd = w / k % 10 | 0;\r\n\r\n // Are there any non-zero digits after the rounding digit?\r\n doRound = sd < 0 || xd[xdi + 1] !== void 0 || w % k;\r\n\r\n // The expression ` + "`"))) + ((`w % mathpow(10, n - j - 1)` + ("`" + ` returns all the digits of w to the right of the\r\n // digit at (left-to-right) index j, e.g. if w is 908714 and j is 2, the expression will give\r\n // 714.\r\n\r\n doRound = rm < 4\r\n ? (rd || doRound) && (rm == 0 || rm == (x.s < 0 ? 3 : 2))\r\n : rd > 5 || rd == 5 && (rm == 4 || doRound || rm == 6 &&\r\n\r\n // Check whether the digit to the left of the rounding digit is odd.\r\n ((i > 0 ? j > 0 ? w / mathpow(10, n - j) : 0 : xd[xdi - 1]) % 10) & 1 ||\r\n rm == (x.s < 0 ? 8 : 7));\r\n }\r\n\r\n if (sd < 1 || !xd[0]) {\r\n if (doRound) {\r\n k = getBase10Exponent(x);\r\n xd.length = 1;\r\n\r\n // Convert sd to decimal places.\r\n sd = sd - k - 1;\r\n\r\n // 1, 0.1, 0.01, 0.001, 0.0001 etc.\r\n xd[0] = mathpow(10, (LOG_BASE - sd % LOG_BASE) % LOG_BASE);\r\n x.e = mathfloor(-sd / LOG_BASE) || 0;\r\n } else {\r\n xd.length = 1;\r\n\r\n // Zero.\r\n xd[0] = x.e = x.s = 0;\r\n }\r\n\r\n return x;\r\n }\r\n\r\n // Remove excess digits.\r\n if (i == 0) {\r\n xd.length = xdi;\r\n k = 1;\r\n xdi--;\r\n } else {\r\n xd.length = xdi + 1;\r\n k = mathpow(10, LOG_BASE - i);\r\n\r\n // E.g. 56700 becomes 56000 if 7 is the rounding digit.\r\n // j > 0 means i > number of leading zeros of w.\r\n xd[xdi] = j > 0 ? (w / mathpow(10, n - j) % mathpow(10, j) | 0) * k : 0;\r\n }\r\n\r\n if (doRound) {\r\n for (;;) {\r\n\r\n // Is the digit to be rounded up in the first word of xd?\r\n if (xdi == 0) {\r\n if ((xd[0] += k) == BASE) {\r\n xd[0] = 1;\r\n ++x.e;\r\n }\r\n\r\n break;\r\n } else {\r\n xd[xdi] += k;\r\n if (xd[xdi] != BASE) break;\r\n xd[xdi--] = 0;\r\n k = 1;\r\n }\r\n }\r\n }\r\n\r\n // Remove trailing zeros.\r\n for (i = xd.length; xd[--i] === 0;) xd.pop();\r\n\r\n if (external && (x.e > MAX_E || x.e < -MAX_E)) {\r\n throw Error(exponentOutOfRange + getBase10Exponent(x));\r\n }\r\n\r\n return x;\r\n }\r\n\r\n\r\n function subtract(x, y) {\r\n var d, e, i, j, k, len, xd, xe, xLTy, yd,\r\n Ctor = x.constructor,\r\n pr = Ctor.precision;\r\n\r\n // Return y negated if x is zero.\r\n // Return x if y is zero and x is non-zero.\r\n if (!x.s || !y.s) {\r\n if (y.s) y.s = -y.s;\r\n else y = new Ctor(x);\r\n return external ? round(y, pr) : y;\r\n }\r\n\r\n xd = x.d;\r\n yd = y.d;\r\n\r\n // x and y are non-zero numbers with the same sign.\r\n\r\n e = y.e;\r\n xe = x.e;\r\n xd = xd.slice();\r\n k = xe - e;\r\n\r\n // If exponents differ...\r\n if (k) {\r\n xLTy = k < 0;\r\n\r\n if (xLTy) {\r\n d = xd;\r\n k = -k;\r\n len = yd.length;\r\n } else {\r\n d = yd;\r\n e = xe;\r\n len = xd.length;\r\n }\r\n\r\n // Numbers with massively different exponents would result in a very high number of zeros\r\n // needing to be prepended, but this can be avoided while still ensuring correct rounding by\r\n // limiting the number of zeros to `)) + (("`" + `Math.ceil(pr / LOG_BASE) + 2`) + ("`" + `.\r\n i = Math.max(Math.ceil(pr / LOG_BASE), len) + 2;\r\n\r\n if (k > i) {\r\n k = i;\r\n d.length = 1;\r\n }\r\n\r\n // Prepend zeros to equalise exponents.\r\n d.reverse();\r\n for (i = k; i--;) d.push(0);\r\n d.reverse();\r\n\r\n // Base 1e7 exponents equal.\r\n } else {\r\n\r\n // Check digits to determine which is the bigger number.\r\n\r\n i = xd.length;\r\n len = yd.length;\r\n xLTy = i < len;\r\n if (xLTy) len = i;\r\n\r\n for (i = 0; i < len; i++) {\r\n if (xd[i] != yd[i]) {\r\n xLTy = xd[i] < yd[i];\r\n break;\r\n }\r\n }\r\n\r\n k = 0;\r\n }\r\n\r\n if (xLTy) {\r\n d = xd;\r\n xd = yd;\r\n yd = d;\r\n y.s = -y.s;\r\n }\r\n\r\n len = xd.length;\r\n\r\n // Append zeros to xd if shorter.\r\n // Don't add zeros to yd if shorter as subtraction only needs to start at yd length.\r\n for (i = yd.length - len; i > 0; --i) xd[len++] = 0;\r\n\r\n // Subtract yd from xd.\r\n for (i = yd.length; i > k;) {\r\n if (xd[--i] < yd[i]) {\r\n for (j = i; j && xd[--j] === 0;) xd[j] = BASE - 1;\r\n --xd[j];\r\n xd[i] += BASE;\r\n }\r\n\r\n xd[i] -= yd[i];\r\n }\r\n\r\n // Remove trailing zeros.\r\n for (; xd[--len] === 0;) xd.pop();\r\n\r\n // Remove leading zeros and adjust exponent accordingly.\r\n for (; xd[0] === 0; xd.shift()) --e;\r\n\r\n // Zero?\r\n if (!xd[0]) return new Ctor(0);\r\n\r\n y.d = xd;\r\n y.e = e;\r\n\r\n //return external && xd.length >= pr / LOG_BASE ? round(y, pr) : y;\r\n return external ? round(y, pr) : y;\r\n }\r\n\r\n\r\n function toString(x, isExp, sd) {\r\n var k,\r\n e = getBase10Exponent(x),\r\n str = digitsToString(x.d),\r\n len = str.length;\r\n\r\n if (isExp) {\r\n if (sd && (k = sd - len) > 0) {\r\n str = str.charAt(0) + '.' + str.slice(1) + getZeroString(k);\r\n } else if (len > 1) {\r\n str = str.charAt(0) + '.' + str.slice(1);\r\n }\r\n\r\n str = str + (e < 0 ? 'e' : 'e+') + e;\r\n } else if (e < 0) {\r\n str = '0.' + getZeroString(-e - 1) + str;\r\n if (sd && (k = sd - len) > 0) str += getZeroString(k);\r\n } else if (e >= len) {\r\n str += getZeroString(e + 1 - len);\r\n if (sd && (k = sd - e - 1) > 0) str = str + '.' + getZeroString(k);\r\n } else {\r\n if ((k = e + 1) < len) str = str.slice(0, k) + '.' + str.slice(k);\r\n if (sd && (k = sd - len) > 0) {\r\n if (e + 1 === len) str += '.';\r\n str += getZeroString(k);\r\n }\r\n }\r\n\r\n return x.s < 0 ? '-' + str : str;\r\n }\r\n\r\n\r\n // Does not strip trailing zeros.\r\n function truncate(arr, len) {\r\n if (arr.length > len) {\r\n arr.length = len;\r\n return true;\r\n }\r\n }\r\n\r\n\r\n // Decimal methods\r\n\r\n\r\n /*\r\n * clone\r\n * config/set\r\n */\r\n\r\n\r\n /*\r\n * Create and return a Decimal constructor with the same configuration properties as this Decimal\r\n * constructor.\r\n *\r\n */\r\n function clone(obj) {\r\n var i, p, ps;\r\n\r\n /*\r\n * The Decimal constructor and exported function.\r\n * Return a new Decimal instance.\r\n *\r\n * value {number|string|Decimal} A numeric value.\r\n *\r\n */\r\n function Decimal(value) {\r\n var x = this;\r\n\r\n // Decimal called without new.\r\n if (!(x instanceof Decimal)) return new Decimal(value);\r\n\r\n // Retain a reference to this Decimal constructor, and shadow Decimal.prototype.constructor\r\n // which points to Object.\r\n x.constructor = Decimal;\r\n\r\n // Duplicate.\r\n if (value instanceof Decimal) {\r\n x.s = value.s;\r\n x.e = value.e;\r\n x.d = (value = value.d) ? value.slice() : value;\r\n return;\r\n }\r\n\r\n if (typeof value === 'number') {\r\n\r\n // Reject Infinity/NaN.\r\n if (value * 0 !== 0) {\r\n throw Error(invalidArgument + value);\r\n }\r\n\r\n if (value > 0) {\r\n x.s = 1;\r\n } else if (value < 0) {\r\n value = -value;\r\n x.s = -1;\r\n } else {\r\n x.s = 0;\r\n x.e = 0;\r\n x.d = [0];\r\n return;\r\n }\r\n\r\n // Fast path for small integers.\r\n if (value === ~~value && value < 1e7) {\r\n x.e = 0;\r\n x.d = [value];\r\n return;\r\n }\r\n\r\n return parseDecimal(x, value.toString());\r\n } else if (typeof value !== 'string') {\r\n throw Error(invalidArgument + value);\r\n }\r\n\r\n // Minus sign?\r\n if (value.charCodeAt(0) === 45) {\r\n value = value.slice(1);\r\n x.s = -1;\r\n } else {\r\n x.s = 1;\r\n }\r\n\r\n if (isDecimal.test(value)) parseDecimal(x, value);\r\n else throw Error(invalidArgument + value);\r\n }\r\n\r\n Decimal.prototype = P;\r\n\r\n Decimal.ROUND_UP = 0;\r\n Decimal.ROUND_DOWN = 1;\r\n Decimal.ROUND_CEIL = 2;\r\n Decimal.ROUND_FLOOR = 3;\r\n Decimal.ROUND_HALF_UP = 4;\r\n Decimal.ROUND_HALF_DOWN = 5;\r\n Decimal.ROUND_HALF_EVEN = 6;\r\n Decimal.ROUND_HALF_CEIL = 7;\r\n Decimal.ROUND_HALF_FLOOR = 8;\r\n\r\n Decimal.clone = clone;\r\n Decimal.config = Decimal.set = config;\r\n\r\n if (obj === void 0) obj = {};\r\n if (obj) {\r\n ps = ['precision', 'rounding', 'toExpNeg', 'toExpPos', 'LN10'];\r\n for (i = 0; i < ps.length;) if (!obj.hasOwnProperty(p = ps[i++])) obj[p] = this[p];\r\n }\r\n\r\n Decimal.config(obj);\r\n\r\n return Decimal;\r\n }\r\n\r\n\r\n /*\r\n * Configure global settings for a Decimal constructor.\r\n *\r\n * `))))))))) + (((((((("`" + (`obj` + "`")) + (` is an object with one or more of the following properties,\r\n *\r\n * precision {number}\r\n * rounding {number}\r\n * toExpNeg {number}\r\n * toExpPos {number}\r\n *\r\n * E.g. Decimal.config({ precision: 20, rounding: 4 })\r\n *\r\n */\r\n function config(obj) {\r\n if (!obj || typeof obj !== 'object') {\r\n throw Error(decimalError + 'Object expected');\r\n }\r\n var i, p, v,\r\n ps = [\r\n 'precision', 1, MAX_DIGITS,\r\n 'rounding', 0, 8,\r\n 'toExpNeg', -1 / 0, 0,\r\n 'toExpPos', 0, 1 / 0\r\n ];\r\n\r\n for (i = 0; i < ps.length; i += 3) {\r\n if ((v = obj[p = ps[i]]) !== void 0) {\r\n if (mathfloor(v) === v && v >= ps[i + 1] && v <= ps[i + 2]) this[p] = v;\r\n else throw Error(invalidArgument + p + ': ' + v);\r\n }\r\n }\r\n\r\n if ((v = obj[p = 'LN10']) !== void 0) {\r\n if (v == Math.LN10) this[p] = new this(v);\r\n else throw Error(invalidArgument + p + ': ' + v);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n\r\n // Create and configure initial Decimal constructor.\r\n Decimal = clone(Decimal);\r\n\r\n Decimal['default'] = Decimal.Decimal = Decimal;\r\n\r\n // Internal constant.\r\n ONE = new Decimal(1);\r\n\r\n\r\n // Export.\r\n\r\n\r\n // AMD.\r\n if (typeof define == 'function' && define.amd) {\r\n define(function () {\r\n return Decimal;\r\n });\r\n\r\n // Node and other environments that support module.exports.\r\n } else if (typeof module != 'undefined' && module.exports) {\r\n module.exports = Decimal;\r\n\r\n // Browser.\r\n } else {\r\n if (!globalScope) {\r\n globalScope = typeof self != 'undefined' && self && self.self == self\r\n ? self : Function('return this')();\r\n }\r\n\r\n globalScope.Decimal = Decimal;\r\n }\r\n})(this);\r\n", "(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n\ttypeof define === 'function' && define.amd ? define(factory) :\n\t(global.deepmerge = factory());\n}(this, (function () { 'use strict';\n\nvar isMergeableObject = function isMergeableObject(value) {\n\treturn isNonNullObject(value)\n\t\t&& !isSpecial(value)\n};\n\nfunction isNonNullObject(value) {\n\treturn !!value && typeof value === 'object'\n}\n\nfunction isSpecial(value) {\n\tvar stringValue = Object.prototype.toString.call(value);\n\n\treturn stringValue === '[object RegExp]'\n\t\t|| stringValue === '[object Date]'\n\t\t|| isReactElement(value)\n}\n\n// see https://github.com/facebook/react/blob/b5ac963fb791d1298e7f396236383bc955f916c1/src/isomorphic/classic/element/ReactElement.js#L21-L25\nvar canUseSymbol = typeof Symbol === 'function' && Symbol.for;\nvar REACT_ELEMENT_TYPE = canUseSymbol ? Symbol.for('react.element') : 0xeac7;\n\nfunction isReactElement(value) {\n\treturn value.$$typeof === REACT_ELEMENT_TYPE\n}\n\nfunction emptyTarget(val) {\n\treturn Array.isArray(val) ? [] : {}\n}\n\nfunction cloneUnlessOtherwiseSpecified(value, options) {\n\treturn (options.clone !== false && options.isMergeableObject(value))\n\t\t? deepmerge(emptyTarget(value), value, options)\n\t\t: value\n}\n\nfunction defaultArrayMerge(target, source, options) {\n\treturn target.concat(source).map(function(element) {\n\t\treturn cloneUnlessOtherwiseSpecified(element, options)\n\t})\n}\n\nfunction getMergeFunction(key, options) {\n\tif (!options.customMerge) {\n\t\treturn deepmerge\n\t}\n\tvar customMerge = options.customMerge(key);\n\treturn typeof customMerge === 'function' ? customMerge : deepmerge\n}\n\nfunction mergeObject(target, source, options) {\n\tvar destination = {};\n\tif (options.isMergeableObject(target)) {\n\t\tObject.keys(target).forEach(function(key) {\n\t\t\tdestination[key] = cloneUnlessOtherwiseSpecified(target[key], options);\n\t\t});\n\t}\n\tObject.keys(source).forEach(function(key) {\n\t\tif (!options.isMergeableObject(source[key]) || !target[key]) {\n\t\t\tdestination[key] = cloneUnlessOtherwiseSpecified(source[key], options);\n\t\t} else {\n\t\t\tdestination[key] = getMergeFunction(key, options)(target[key], source[key], options);\n\t\t}\n\t});\n\treturn destination\n}\n\nfunction deepmerge(target, source, options) {\n\toptions = options || {};\n\toptions.arrayMerge = options.arrayMerge || defaultArrayMerge;\n\toptions.isMergeableObject = options.isMergeableObject || isMergeableObject;\n\n\tvar sourceIsArray = Array.isArray(source);\n\tvar targetIsArray = Array.isArray(target);\n\tvar sourceAndTargetTypesMatch = sourceIsArray === targetIsArray;\n\n\tif (!sourceAndTargetTypesMatch) {\n\t\treturn cloneUnlessOtherwiseSpecified(source, options)\n\t} else if (sourceIsArray) {\n\t\treturn options.arrayMerge(target, source, options)\n\t} else {\n\t\treturn mergeObject(target, source, options)\n\t}\n}\n\ndeepmerge.all = function deepmergeAll(array, options) {\n\tif (!Array.isArray(array)) {\n\t\tthrow new Error('first argument should be an array')\n\t}\n\n\treturn array.reduce(function(prev, next) {\n\t\treturn deepmerge(prev, next, options)\n\t}, {})\n};\n\nvar deepmerge_1 = deepmerge;\n\nreturn deepmerge_1;\n\n})));\n", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nexports.__esModule = true;\nexports.default = addClass;\n\nvar _hasClass = _interopRequireDefault(require(\"./hasClass\"));\n\nfunction addClass(element, className) {\n if (element.classList) element.classList.add(className);else if (!(0, _hasClass.default)(element, className)) if (typeof element.className === 'string') element.className = element.className + ' ' + className;else element.setAttribute('class', (element.className && element.className.baseVal || '') + ' ' + className);\n}\n\nmodule.exports = exports[\"default\"];", "\"use strict\";\n\nexports.__esModule = true;\nexports.default = hasClass;\n\nfunction hasClass(element, className) {\n if (element.classList) return !!className && element.classList.contains(className);else return (\" \" + (element.className.baseVal || element.className) + \" \").indexOf(\" \" + className + \" \") !== -1;\n}\n\nmodule.exports = exports[\"default\"];", "'use strict';\n\nfunction replaceClassName(origClass, classToRemove) {\n return origClass.replace(new RegExp('(^|\\\\s)' + classToRemove + '(?:\\\\s|$)', 'g'), '$1').replace(/\\s+/g, ' ').replace(/^\\s*|\\s*$/g, '');\n}\n\nmodule.exports = function removeClass(element, className) {\n if (element.classList) element.classList.remove(className);else if (typeof element.className === 'string') element.className = replaceClassName(element.className, className);else element.setAttribute('class', replaceClassName(element.className && element.className.baseVal || '', className));\n};", "/*!\n * escape-html\n * Copyright(c) 2012-2013 TJ Holowaychuk\n * Copyright(c) 2015 Andreas Lubbe\n * Copyright(c) 2015 Tiancheng \"Timothy\" Gu\n * MIT Licensed\n */\n\n'use strict';\n\n/**\n * Module variables.\n * @private\n */\n\nvar matchHtmlRegExp = /[\"'&<>]/;\n\n/**\n * Module exports.\n * @public\n */\n\nmodule.exports = escapeHtml;\n\n/**\n * Escape special characters in the given string of html.\n *\n * @param {string} string The string to escape for inserting into HTML\n * @return {string}\n * @public\n */\n\nfunction escapeHtml(string) {\n var str = '' + string;\n var match = matchHtmlRegExp.exec(str);\n\n if (!match) {\n return str;\n }\n\n var escape;\n var html = '';\n var index = 0;\n var lastIndex = 0;\n\n for (index = match.index; index < str.length; index++) {\n switch (str.charCodeAt(index)) {\n case 34: // \"\n escape = '"';\n break;\n case 38: // &\n escape = '&';\n break;\n case 39: // '\n escape = ''';\n break;\n case 60: // <\n escape = '<';\n break;\n case 62: // >\n escape = '>';\n break;\n default:\n continue;\n }\n\n if (lastIndex !== index) {\n html += str.substring(lastIndex, index);\n }\n\n lastIndex = index + 1;\n html += escape;\n }\n\n return lastIndex !== index\n ? html + str.substring(lastIndex, index)\n : html;\n}\n", - "// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\nvar R = typeof Reflect === 'object' ? Reflect : null\nvar ReflectApply = R && typeof R.apply === 'function'\n ? R.apply\n : function ReflectApply(target, receiver, args) {\n return Function.prototype.apply.call(target, receiver, args);\n }\n\nvar ReflectOwnKeys\nif (R && typeof R.ownKeys === 'function') {\n ReflectOwnKeys = R.ownKeys\n} else if (Object.getOwnPropertySymbols) {\n ReflectOwnKeys = function ReflectOwnKeys(target) {\n return Object.getOwnPropertyNames(target)\n .concat(Object.getOwnPropertySymbols(target));\n };\n} else {\n ReflectOwnKeys = function ReflectOwnKeys(target) {\n return Object.getOwnPropertyNames(target);\n };\n}\n\nfunction ProcessEmitWarning(warning) {\n if (console && console.warn) console.warn(warning);\n}\n\nvar NumberIsNaN = Number.isNaN || function NumberIsNaN(value) {\n return value !== value;\n}\n\nfunction EventEmitter() {\n EventEmitter.init.call(this);\n}\nmodule.exports = EventEmitter;\n\n// Backwards-compat with node 0.10.x\nEventEmitter.EventEmitter = EventEmitter;\n\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._eventsCount = 0;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nvar defaultMaxListeners = 10;\n\nObject.defineProperty(EventEmitter, 'defaultMaxListeners', {\n enumerable: true,\n get: function() {\n return defaultMaxListeners;\n },\n set: function(arg) {\n if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) {\n throw new RangeError('The value of \"defaultMaxListeners\" is out of range. It must be a non-negative number. Received ' + arg + '.');\n }\n defaultMaxListeners = arg;\n }\n});\n\nEventEmitter.init = function() {\n\n if (this._events === undefined ||\n this._events === Object.getPrototypeOf(this)._events) {\n this._events = Object.create(null);\n this._eventsCount = 0;\n }\n\n this._maxListeners = this._maxListeners || undefined;\n};\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {\n if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) {\n throw new RangeError('The value of \"n\" is out of range. It must be a non-negative number. Received ' + n + '.');\n }\n this._maxListeners = n;\n return this;\n};\n\nfunction $getMaxListeners(that) {\n if (that._maxListeners === undefined)\n return EventEmitter.defaultMaxListeners;\n return that._maxListeners;\n}\n\nEventEmitter.prototype.getMaxListeners = function getMaxListeners() {\n return $getMaxListeners(this);\n};\n\nEventEmitter.prototype.emit = function emit(type) {\n var args = [];\n for (var i = 1; i < arguments.length; i++) args.push(arguments[i]);\n var doError = (type === 'error');\n\n var events = this._events;\n if (events !== undefined)\n doError = (doError && events.error === undefined);\n else if (!doError)\n return false;\n\n // If there is no 'error' event listener then throw.\n if (doError) {\n var er;\n if (args.length > 0)\n er = args[0];\n if (er instanceof Error) {\n // Note: The comments on the ` + "`") + (`throw` + ("`" + ` lines are intentional, they show\n // up in Node's output if this results in an unhandled exception.\n throw er; // Unhandled 'error' event\n }\n // At least give some kind of context to the user\n var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : ''));\n err.context = er;\n throw err; // Unhandled 'error' event\n }\n\n var handler = events[type];\n\n if (handler === undefined)\n return false;\n\n if (typeof handler === 'function') {\n ReflectApply(handler, this, args);\n } else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i)\n ReflectApply(listeners[i], this, args);\n }\n\n return true;\n};\n\nfunction _addListener(target, type, listener, prepend) {\n var m;\n var events;\n var existing;\n\n if (typeof listener !== 'function') {\n throw new TypeError('The \"listener\" argument must be of type Function. Received type ' + typeof listener);\n }\n\n events = target._events;\n if (events === undefined) {\n events = target._events = Object.create(null);\n target._eventsCount = 0;\n } else {\n // To avoid recursion in the case that type === \"newListener\"! Before\n // adding it to the listeners, first emit \"newListener\".\n if (events.newListener !== undefined) {\n target.emit('newListener', type,\n listener.listener ? listener.listener : listener);\n\n // Re-assign `))) + (("`" + (`events` + "`")) + (` because a newListener handler could have caused the\n // this._events to be assigned to a new object\n events = target._events;\n }\n existing = events[type];\n }\n\n if (existing === undefined) {\n // Optimize the case of one listener. Don't need the extra array object.\n existing = events[type] = listener;\n ++target._eventsCount;\n } else {\n if (typeof existing === 'function') {\n // Adding the second element, need to change to array.\n existing = events[type] =\n prepend ? [listener, existing] : [existing, listener];\n // If we've already got an array, just append.\n } else if (prepend) {\n existing.unshift(listener);\n } else {\n existing.push(listener);\n }\n\n // Check for listener leak\n m = $getMaxListeners(target);\n if (m > 0 && existing.length > m && !existing.warned) {\n existing.warned = true;\n // No error code for this since it is a Warning\n // eslint-disable-next-line no-restricted-syntax\n var w = new Error('Possible EventEmitter memory leak detected. ' +\n existing.length + ' ' + String(type) + ' listeners ' +\n 'added. Use emitter.setMaxListeners() to ' +\n 'increase limit');\n w.name = 'MaxListenersExceededWarning';\n w.emitter = target;\n w.type = type;\n w.count = existing.length;\n ProcessEmitWarning(w);\n }\n }\n\n return target;\n}\n\nEventEmitter.prototype.addListener = function addListener(type, listener) {\n return _addListener(this, type, listener, false);\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.prependListener =\n function prependListener(type, listener) {\n return _addListener(this, type, listener, true);\n };\n\nfunction onceWrapper() {\n var args = [];\n for (var i = 0; i < arguments.length; i++) args.push(arguments[i]);\n if (!this.fired) {\n this.target.removeListener(this.type, this.wrapFn);\n this.fired = true;\n ReflectApply(this.listener, this.target, args);\n }\n}\n\nfunction _onceWrap(target, type, listener) {\n var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener };\n var wrapped = onceWrapper.bind(state);\n wrapped.listener = listener;\n state.wrapFn = wrapped;\n return wrapped;\n}\n\nEventEmitter.prototype.once = function once(type, listener) {\n if (typeof listener !== 'function') {\n throw new TypeError('The \"listener\" argument must be of type Function. Received type ' + typeof listener);\n }\n this.on(type, _onceWrap(this, type, listener));\n return this;\n};\n\nEventEmitter.prototype.prependOnceListener =\n function prependOnceListener(type, listener) {\n if (typeof listener !== 'function') {\n throw new TypeError('The \"listener\" argument must be of type Function. Received type ' + typeof listener);\n }\n this.prependListener(type, _onceWrap(this, type, listener));\n return this;\n };\n\n// Emits a 'removeListener' event if and only if the listener was removed.\nEventEmitter.prototype.removeListener =\n function removeListener(type, listener) {\n var list, events, position, i, originalListener;\n\n if (typeof listener !== 'function') {\n throw new TypeError('The \"listener\" argument must be of type Function. Received type ' + typeof listener);\n }\n\n events = this._events;\n if (events === undefined)\n return this;\n\n list = events[type];\n if (list === undefined)\n return this;\n\n if (list === listener || list.listener === listener) {\n if (--this._eventsCount === 0)\n this._events = Object.create(null);\n else {\n delete events[type];\n if (events.removeListener)\n this.emit('removeListener', type, list.listener || listener);\n }\n } else if (typeof list !== 'function') {\n position = -1;\n\n for (i = list.length - 1; i >= 0; i--) {\n if (list[i] === listener || list[i].listener === listener) {\n originalListener = list[i].listener;\n position = i;\n break;\n }\n }\n\n if (position < 0)\n return this;\n\n if (position === 0)\n list.shift();\n else {\n spliceOne(list, position);\n }\n\n if (list.length === 1)\n events[type] = list[0];\n\n if (events.removeListener !== undefined)\n this.emit('removeListener', type, originalListener || listener);\n }\n\n return this;\n };\n\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\n\nEventEmitter.prototype.removeAllListeners =\n function removeAllListeners(type) {\n var listeners, events, i;\n\n events = this._events;\n if (events === undefined)\n return this;\n\n // not listening for removeListener, no need to emit\n if (events.removeListener === undefined) {\n if (arguments.length === 0) {\n this._events = Object.create(null);\n this._eventsCount = 0;\n } else if (events[type] !== undefined) {\n if (--this._eventsCount === 0)\n this._events = Object.create(null);\n else\n delete events[type];\n }\n return this;\n }\n\n // emit removeListener for all listeners on all events\n if (arguments.length === 0) {\n var keys = Object.keys(events);\n var key;\n for (i = 0; i < keys.length; ++i) {\n key = keys[i];\n if (key === 'removeListener') continue;\n this.removeAllListeners(key);\n }\n this.removeAllListeners('removeListener');\n this._events = Object.create(null);\n this._eventsCount = 0;\n return this;\n }\n\n listeners = events[type];\n\n if (typeof listeners === 'function') {\n this.removeListener(type, listeners);\n } else if (listeners !== undefined) {\n // LIFO order\n for (i = listeners.length - 1; i >= 0; i--) {\n this.removeListener(type, listeners[i]);\n }\n }\n\n return this;\n };\n\nfunction _listeners(target, type, unwrap) {\n var events = target._events;\n\n if (events === undefined)\n return [];\n\n var evlistener = events[type];\n if (evlistener === undefined)\n return [];\n\n if (typeof evlistener === 'function')\n return unwrap ? [evlistener.listener || evlistener] : [evlistener];\n\n return unwrap ?\n unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length);\n}\n\nEventEmitter.prototype.listeners = function listeners(type) {\n return _listeners(this, type, true);\n};\n\nEventEmitter.prototype.rawListeners = function rawListeners(type) {\n return _listeners(this, type, false);\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n if (typeof emitter.listenerCount === 'function') {\n return emitter.listenerCount(type);\n } else {\n return listenerCount.call(emitter, type);\n }\n};\n\nEventEmitter.prototype.listenerCount = listenerCount;\nfunction listenerCount(type) {\n var events = this._events;\n\n if (events !== undefined) {\n var evlistener = events[type];\n\n if (typeof evlistener === 'function') {\n return 1;\n } else if (evlistener !== undefined) {\n return evlistener.length;\n }\n }\n\n return 0;\n}\n\nEventEmitter.prototype.eventNames = function eventNames() {\n return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : [];\n};\n\nfunction arrayClone(arr, n) {\n var copy = new Array(n);\n for (var i = 0; i < n; ++i)\n copy[i] = arr[i];\n return copy;\n}\n\nfunction spliceOne(list, index) {\n for (; index + 1 < list.length; index++)\n list[index] = list[index + 1];\n list.pop();\n}\n\nfunction unwrapListeners(arr) {\n var ret = new Array(arr.length);\n for (var i = 0; i < ret.length; ++i) {\n ret[i] = arr[i].listener || arr[i];\n }\n return ret;\n}\n", + "// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\nvar R = typeof Reflect === 'object' ? Reflect : null\nvar ReflectApply = R && typeof R.apply === 'function'\n ? R.apply\n : function ReflectApply(target, receiver, args) {\n return Function.prototype.apply.call(target, receiver, args);\n }\n\nvar ReflectOwnKeys\nif (R && typeof R.ownKeys === 'function') {\n ReflectOwnKeys = R.ownKeys\n} else if (Object.getOwnPropertySymbols) {\n ReflectOwnKeys = function ReflectOwnKeys(target) {\n return Object.getOwnPropertyNames(target)\n .concat(Object.getOwnPropertySymbols(target));\n };\n} else {\n ReflectOwnKeys = function ReflectOwnKeys(target) {\n return Object.getOwnPropertyNames(target);\n };\n}\n\nfunction ProcessEmitWarning(warning) {\n if (console && console.warn) console.warn(warning);\n}\n\nvar NumberIsNaN = Number.isNaN || function NumberIsNaN(value) {\n return value !== value;\n}\n\nfunction EventEmitter() {\n EventEmitter.init.call(this);\n}\nmodule.exports = EventEmitter;\n\n// Backwards-compat with node 0.10.x\nEventEmitter.EventEmitter = EventEmitter;\n\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._eventsCount = 0;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nvar defaultMaxListeners = 10;\n\nObject.defineProperty(EventEmitter, 'defaultMaxListeners', {\n enumerable: true,\n get: function() {\n return defaultMaxListeners;\n },\n set: function(arg) {\n if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) {\n throw new RangeError('The value of \"defaultMaxListeners\" is out of range. It must be a non-negative number. Received ' + arg + '.');\n }\n defaultMaxListeners = arg;\n }\n});\n\nEventEmitter.init = function() {\n\n if (this._events === undefined ||\n this._events === Object.getPrototypeOf(this)._events) {\n this._events = Object.create(null);\n this._eventsCount = 0;\n }\n\n this._maxListeners = this._maxListeners || undefined;\n};\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {\n if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) {\n throw new RangeError('The value of \"n\" is out of range. It must be a non-negative number. Received ' + n + '.');\n }\n this._maxListeners = n;\n return this;\n};\n\nfunction $getMaxListeners(that) {\n if (that._maxListeners === undefined)\n return EventEmitter.defaultMaxListeners;\n return that._maxListeners;\n}\n\nEventEmitter.prototype.getMaxListeners = function getMaxListeners() {\n return $getMaxListeners(this);\n};\n\nEventEmitter.prototype.emit = function emit(type) {\n var args = [];\n for (var i = 1; i < arguments.length; i++) args.push(arguments[i]);\n var doError = (type === 'error');\n\n var events = this._events;\n if (events !== undefined)\n doError = (doError && events.error === undefined);\n else if (!doError)\n return false;\n\n // If there is no 'error' event listener then throw.\n if (doError) {\n var er;\n if (args.length > 0)\n er = args[0];\n if (er instanceof Error) {\n // Note: The comments on the ` + ("`" + `throw`))) + (("`" + (` lines are intentional, they show\n // up in Node's output if this results in an unhandled exception.\n throw er; // Unhandled 'error' event\n }\n // At least give some kind of context to the user\n var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : ''));\n err.context = er;\n throw err; // Unhandled 'error' event\n }\n\n var handler = events[type];\n\n if (handler === undefined)\n return false;\n\n if (typeof handler === 'function') {\n ReflectApply(handler, this, args);\n } else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i)\n ReflectApply(listeners[i], this, args);\n }\n\n return true;\n};\n\nfunction _addListener(target, type, listener, prepend) {\n var m;\n var events;\n var existing;\n\n if (typeof listener !== 'function') {\n throw new TypeError('The \"listener\" argument must be of type Function. Received type ' + typeof listener);\n }\n\n events = target._events;\n if (events === undefined) {\n events = target._events = Object.create(null);\n target._eventsCount = 0;\n } else {\n // To avoid recursion in the case that type === \"newListener\"! Before\n // adding it to the listeners, first emit \"newListener\".\n if (events.newListener !== undefined) {\n target.emit('newListener', type,\n listener.listener ? listener.listener : listener);\n\n // Re-assign ` + "`")) + (`events` + ("`" + ` because a newListener handler could have caused the\n // this._events to be assigned to a new object\n events = target._events;\n }\n existing = events[type];\n }\n\n if (existing === undefined) {\n // Optimize the case of one listener. Don't need the extra array object.\n existing = events[type] = listener;\n ++target._eventsCount;\n } else {\n if (typeof existing === 'function') {\n // Adding the second element, need to change to array.\n existing = events[type] =\n prepend ? [listener, existing] : [existing, listener];\n // If we've already got an array, just append.\n } else if (prepend) {\n existing.unshift(listener);\n } else {\n existing.push(listener);\n }\n\n // Check for listener leak\n m = $getMaxListeners(target);\n if (m > 0 && existing.length > m && !existing.warned) {\n existing.warned = true;\n // No error code for this since it is a Warning\n // eslint-disable-next-line no-restricted-syntax\n var w = new Error('Possible EventEmitter memory leak detected. ' +\n existing.length + ' ' + String(type) + ' listeners ' +\n 'added. Use emitter.setMaxListeners() to ' +\n 'increase limit');\n w.name = 'MaxListenersExceededWarning';\n w.emitter = target;\n w.type = type;\n w.count = existing.length;\n ProcessEmitWarning(w);\n }\n }\n\n return target;\n}\n\nEventEmitter.prototype.addListener = function addListener(type, listener) {\n return _addListener(this, type, listener, false);\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.prependListener =\n function prependListener(type, listener) {\n return _addListener(this, type, listener, true);\n };\n\nfunction onceWrapper() {\n var args = [];\n for (var i = 0; i < arguments.length; i++) args.push(arguments[i]);\n if (!this.fired) {\n this.target.removeListener(this.type, this.wrapFn);\n this.fired = true;\n ReflectApply(this.listener, this.target, args);\n }\n}\n\nfunction _onceWrap(target, type, listener) {\n var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener };\n var wrapped = onceWrapper.bind(state);\n wrapped.listener = listener;\n state.wrapFn = wrapped;\n return wrapped;\n}\n\nEventEmitter.prototype.once = function once(type, listener) {\n if (typeof listener !== 'function') {\n throw new TypeError('The \"listener\" argument must be of type Function. Received type ' + typeof listener);\n }\n this.on(type, _onceWrap(this, type, listener));\n return this;\n};\n\nEventEmitter.prototype.prependOnceListener =\n function prependOnceListener(type, listener) {\n if (typeof listener !== 'function') {\n throw new TypeError('The \"listener\" argument must be of type Function. Received type ' + typeof listener);\n }\n this.prependListener(type, _onceWrap(this, type, listener));\n return this;\n };\n\n// Emits a 'removeListener' event if and only if the listener was removed.\nEventEmitter.prototype.removeListener =\n function removeListener(type, listener) {\n var list, events, position, i, originalListener;\n\n if (typeof listener !== 'function') {\n throw new TypeError('The \"listener\" argument must be of type Function. Received type ' + typeof listener);\n }\n\n events = this._events;\n if (events === undefined)\n return this;\n\n list = events[type];\n if (list === undefined)\n return this;\n\n if (list === listener || list.listener === listener) {\n if (--this._eventsCount === 0)\n this._events = Object.create(null);\n else {\n delete events[type];\n if (events.removeListener)\n this.emit('removeListener', type, list.listener || listener);\n }\n } else if (typeof list !== 'function') {\n position = -1;\n\n for (i = list.length - 1; i >= 0; i--) {\n if (list[i] === listener || list[i].listener === listener) {\n originalListener = list[i].listener;\n position = i;\n break;\n }\n }\n\n if (position < 0)\n return this;\n\n if (position === 0)\n list.shift();\n else {\n spliceOne(list, position);\n }\n\n if (list.length === 1)\n events[type] = list[0];\n\n if (events.removeListener !== undefined)\n this.emit('removeListener', type, originalListener || listener);\n }\n\n return this;\n };\n\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\n\nEventEmitter.prototype.removeAllListeners =\n function removeAllListeners(type) {\n var listeners, events, i;\n\n events = this._events;\n if (events === undefined)\n return this;\n\n // not listening for removeListener, no need to emit\n if (events.removeListener === undefined) {\n if (arguments.length === 0) {\n this._events = Object.create(null);\n this._eventsCount = 0;\n } else if (events[type] !== undefined) {\n if (--this._eventsCount === 0)\n this._events = Object.create(null);\n else\n delete events[type];\n }\n return this;\n }\n\n // emit removeListener for all listeners on all events\n if (arguments.length === 0) {\n var keys = Object.keys(events);\n var key;\n for (i = 0; i < keys.length; ++i) {\n key = keys[i];\n if (key === 'removeListener') continue;\n this.removeAllListeners(key);\n }\n this.removeAllListeners('removeListener');\n this._events = Object.create(null);\n this._eventsCount = 0;\n return this;\n }\n\n listeners = events[type];\n\n if (typeof listeners === 'function') {\n this.removeListener(type, listeners);\n } else if (listeners !== undefined) {\n // LIFO order\n for (i = listeners.length - 1; i >= 0; i--) {\n this.removeListener(type, listeners[i]);\n }\n }\n\n return this;\n };\n\nfunction _listeners(target, type, unwrap) {\n var events = target._events;\n\n if (events === undefined)\n return [];\n\n var evlistener = events[type];\n if (evlistener === undefined)\n return [];\n\n if (typeof evlistener === 'function')\n return unwrap ? [evlistener.listener || evlistener] : [evlistener];\n\n return unwrap ?\n unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length);\n}\n\nEventEmitter.prototype.listeners = function listeners(type) {\n return _listeners(this, type, true);\n};\n\nEventEmitter.prototype.rawListeners = function rawListeners(type) {\n return _listeners(this, type, false);\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n if (typeof emitter.listenerCount === 'function') {\n return emitter.listenerCount(type);\n } else {\n return listenerCount.call(emitter, type);\n }\n};\n\nEventEmitter.prototype.listenerCount = listenerCount;\nfunction listenerCount(type) {\n var events = this._events;\n\n if (events !== undefined) {\n var evlistener = events[type];\n\n if (typeof evlistener === 'function') {\n return 1;\n } else if (evlistener !== undefined) {\n return evlistener.length;\n }\n }\n\n return 0;\n}\n\nEventEmitter.prototype.eventNames = function eventNames() {\n return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : [];\n};\n\nfunction arrayClone(arr, n) {\n var copy = new Array(n);\n for (var i = 0; i < n; ++i)\n copy[i] = arr[i];\n return copy;\n}\n\nfunction spliceOne(list, index) {\n for (; index + 1 < list.length; index++)\n list[index] = list[index + 1];\n list.pop();\n}\n\nfunction unwrapListeners(arr) {\n var ret = new Array(arr.length);\n for (var i = 0; i < ret.length; ++i) {\n ret[i] = arr[i].listener || arr[i];\n }\n return ret;\n}\n", "'use strict';\n\n/**\n * Copyright 2015, Yahoo! Inc.\n * Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms.\n */\nvar ReactIs = require('react-is');\nvar REACT_STATICS = {\n childContextTypes: true,\n contextType: true,\n contextTypes: true,\n defaultProps: true,\n displayName: true,\n getDefaultProps: true,\n getDerivedStateFromError: true,\n getDerivedStateFromProps: true,\n mixins: true,\n propTypes: true,\n type: true\n};\n\nvar KNOWN_STATICS = {\n name: true,\n length: true,\n prototype: true,\n caller: true,\n callee: true,\n arguments: true,\n arity: true\n};\n\nvar FORWARD_REF_STATICS = {\n '$$typeof': true,\n render: true,\n defaultProps: true,\n displayName: true,\n propTypes: true\n};\n\nvar MEMO_STATICS = {\n '$$typeof': true,\n compare: true,\n defaultProps: true,\n displayName: true,\n propTypes: true,\n type: true\n};\n\nvar TYPE_STATICS = {};\nTYPE_STATICS[ReactIs.ForwardRef] = FORWARD_REF_STATICS;\n\nfunction getStatics(component) {\n if (ReactIs.isMemo(component)) {\n return MEMO_STATICS;\n }\n return TYPE_STATICS[component['$$typeof']] || REACT_STATICS;\n}\n\nvar defineProperty = Object.defineProperty;\nvar getOwnPropertyNames = Object.getOwnPropertyNames;\nvar getOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\nvar getPrototypeOf = Object.getPrototypeOf;\nvar objectPrototype = Object.prototype;\n\nfunction hoistNonReactStatics(targetComponent, sourceComponent, blacklist) {\n if (typeof sourceComponent !== 'string') {\n // don't hoist over string (html) components\n\n if (objectPrototype) {\n var inheritedComponent = getPrototypeOf(sourceComponent);\n if (inheritedComponent && inheritedComponent !== objectPrototype) {\n hoistNonReactStatics(targetComponent, inheritedComponent, blacklist);\n }\n }\n\n var keys = getOwnPropertyNames(sourceComponent);\n\n if (getOwnPropertySymbols) {\n keys = keys.concat(getOwnPropertySymbols(sourceComponent));\n }\n\n var targetStatics = getStatics(targetComponent);\n var sourceStatics = getStatics(sourceComponent);\n\n for (var i = 0; i < keys.length; ++i) {\n var key = keys[i];\n if (!KNOWN_STATICS[key] && !(blacklist && blacklist[key]) && !(sourceStatics && sourceStatics[key]) && !(targetStatics && targetStatics[key])) {\n var descriptor = getOwnPropertyDescriptor(sourceComponent, key);\n try {\n // Avoid failures from read-only properties\n defineProperty(targetComponent, key, descriptor);\n } catch (e) {}\n }\n }\n\n return targetComponent;\n }\n\n return targetComponent;\n}\n\nmodule.exports = hoistNonReactStatics;\n", "/* eslint-disable no-var, prefer-template */\nvar uppercasePattern = /[A-Z]/g\nvar msPattern = /^ms-/\nvar cache = {}\n\nfunction toHyphenLower(match) {\n return '-' + match.toLowerCase()\n}\n\nfunction hyphenateStyleName(name) {\n if (cache.hasOwnProperty(name)) {\n return cache[name]\n }\n\n var hName = name.replace(uppercasePattern, toHyphenLower)\n return (cache[name] = msPattern.test(hName) ? '-' + hName : hName)\n}\n\nexport default hyphenateStyleName\n", "var _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nexport var isBrowser = (typeof window === \"undefined\" ? \"undefined\" : _typeof(window)) === \"object\" && (typeof document === \"undefined\" ? \"undefined\" : _typeof(document)) === 'object' && document.nodeType === 9;\n\nexport default isBrowser;\n", @@ -37532,227 +38136,227 @@ var _bundleJsMap = []byte(((((((((((((`{ "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nexports['default'] = defaultUnit;\n\nvar _defaultUnits = require('./defaultUnits');\n\nvar _defaultUnits2 = _interopRequireDefault(_defaultUnits);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\n/**\n * Clones the object and adds a camel cased property version.\n */\nfunction addCamelCasedVersion(obj) {\n var regExp = /(-[a-z])/g;\n var replace = function replace(str) {\n return str[1].toUpperCase();\n };\n var newObj = {};\n for (var key in obj) {\n newObj[key] = obj[key];\n newObj[key.replace(regExp, replace)] = obj[key];\n }\n return newObj;\n}\n\nvar units = addCamelCasedVersion(_defaultUnits2['default']);\n\n/**\n * Recursive deep style passing function\n *\n * @param {String} current property\n * @param {(Object|Array|Number|String)} property value\n * @param {Object} options\n * @return {(Object|Array|Number|String)} resulting value\n */\nfunction iterate(prop, value, options) {\n if (!value) return value;\n\n var convertedValue = value;\n\n var type = typeof value === 'undefined' ? 'undefined' : _typeof(value);\n if (type === 'object' && Array.isArray(value)) type = 'array';\n\n switch (type) {\n case 'object':\n if (prop === 'fallbacks') {\n for (var innerProp in value) {\n value[innerProp] = iterate(innerProp, value[innerProp], options);\n }\n break;\n }\n for (var _innerProp in value) {\n value[_innerProp] = iterate(prop + '-' + _innerProp, value[_innerProp], options);\n }\n break;\n case 'array':\n for (var i = 0; i < value.length; i++) {\n value[i] = iterate(prop, value[i], options);\n }\n break;\n case 'number':\n if (value !== 0) {\n convertedValue = value + (options[prop] || units[prop] || '');\n }\n break;\n default:\n break;\n }\n\n return convertedValue;\n}\n\n/**\n * Add unit to numeric values.\n */\nfunction defaultUnit() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n var camelCasedOptions = addCamelCasedVersion(options);\n\n function onProcessStyle(style, rule) {\n if (rule.type !== 'style') return style;\n\n for (var prop in style) {\n style[prop] = iterate(prop, style[prop], camelCasedOptions);\n }\n\n return style;\n }\n\n function onChangeValue(value, prop) {\n return iterate(prop, value, camelCasedOptions);\n }\n\n return { onProcessStyle: onProcessStyle, onChangeValue: onChangeValue };\n}", "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nexports['default'] = jssGlobal;\n\nvar _jss = require('jss');\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar propKey = '@global';\nvar prefixKey = '@global ';\n\nvar GlobalContainerRule = function () {\n function GlobalContainerRule(key, styles, options) {\n _classCallCheck(this, GlobalContainerRule);\n\n this.type = 'global';\n\n this.key = key;\n this.options = options;\n this.rules = new _jss.RuleList(_extends({}, options, {\n parent: this\n }));\n\n for (var selector in styles) {\n this.rules.add(selector, styles[selector], { selector: selector });\n }\n\n this.rules.process();\n }\n\n /**\n * Get a rule.\n */\n\n\n _createClass(GlobalContainerRule, [{\n key: 'getRule',\n value: function getRule(name) {\n return this.rules.get(name);\n }\n\n /**\n * Create and register rule, run plugins.\n */\n\n }, {\n key: 'addRule',\n value: function addRule(name, style, options) {\n var rule = this.rules.add(name, style, options);\n this.options.jss.plugins.onProcessRule(rule);\n return rule;\n }\n\n /**\n * Get index of a rule.\n */\n\n }, {\n key: 'indexOf',\n value: function indexOf(rule) {\n return this.rules.indexOf(rule);\n }\n\n /**\n * Generates a CSS string.\n */\n\n }, {\n key: 'toString',\n value: function toString() {\n return this.rules.toString();\n }\n }]);\n\n return GlobalContainerRule;\n}();\n\nvar GlobalPrefixedRule = function () {\n function GlobalPrefixedRule(name, style, options) {\n _classCallCheck(this, GlobalPrefixedRule);\n\n this.name = name;\n this.options = options;\n var selector = name.substr(prefixKey.length);\n this.rule = options.jss.createRule(selector, style, _extends({}, options, {\n parent: this,\n selector: selector\n }));\n }\n\n _createClass(GlobalPrefixedRule, [{\n key: 'toString',\n value: function toString(options) {\n return this.rule.toString(options);\n }\n }]);\n\n return GlobalPrefixedRule;\n}();\n\nvar separatorRegExp = /\\s*,\\s*/g;\n\nfunction addScope(selector, scope) {\n var parts = selector.split(separatorRegExp);\n var scoped = '';\n for (var i = 0; i < parts.length; i++) {\n scoped += scope + ' ' + parts[i].trim();\n if (parts[i + 1]) scoped += ', ';\n }\n return scoped;\n}\n\nfunction handleNestedGlobalContainerRule(rule) {\n var options = rule.options,\n style = rule.style;\n\n var rules = style[propKey];\n\n if (!rules) return;\n\n for (var name in rules) {\n options.sheet.addRule(name, rules[name], _extends({}, options, {\n selector: addScope(name, rule.selector)\n }));\n }\n\n delete style[propKey];\n}\n\nfunction handlePrefixedGlobalRule(rule) {\n var options = rule.options,\n style = rule.style;\n\n for (var prop in style) {\n if (prop.substr(0, propKey.length) !== propKey) continue;\n\n var selector = addScope(prop.substr(propKey.length), rule.selector);\n options.sheet.addRule(selector, style[prop], _extends({}, options, {\n selector: selector\n }));\n delete style[prop];\n }\n}\n\n/**\n * Convert nested rules to separate, remove them from original styles.\n *\n * @param {Rule} rule\n * @api public\n */\nfunction jssGlobal() {\n function onCreateRule(name, styles, options) {\n if (name === propKey) {\n return new GlobalContainerRule(name, styles, options);\n }\n\n if (name[0] === '@' && name.substr(0, prefixKey.length) === prefixKey) {\n return new GlobalPrefixedRule(name, styles, options);\n }\n\n var parent = options.parent;\n\n\n if (parent) {\n if (parent.type === 'global' || parent.options.parent.type === 'global') {\n options.global = true;\n }\n }\n\n if (options.global) options.selector = name;\n\n return null;\n }\n\n function onProcessRule(rule) {\n if (rule.type !== 'style') return;\n\n handleNestedGlobalContainerRule(rule);\n handlePrefixedGlobalRule(rule);\n }\n\n return { onCreateRule: onCreateRule, onProcessRule: onProcessRule };\n}", "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nexports.default = jssNested;\n\nvar _warning = require('warning');\n\nvar _warning2 = _interopRequireDefault(_warning);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar separatorRegExp = /\\s*,\\s*/g;\nvar parentRegExp = /&/g;\nvar refRegExp = /\\$([\\w-]+)/g;\n\n/**\n * Convert nested rules to separate, remove them from original styles.\n *\n * @param {Rule} rule\n * @api public\n */\nfunction jssNested() {\n // Get a function to be used for $ref replacement.\n function getReplaceRef(container) {\n return function (match, key) {\n var rule = container.getRule(key);\n if (rule) return rule.selector;\n (0, _warning2.default)(false, '[JSS] Could not find the referenced rule %s in %s.', key, container.options.meta || container);\n return key;\n };\n }\n\n var hasAnd = function hasAnd(str) {\n return str.indexOf('&') !== -1;\n };\n\n function replaceParentRefs(nestedProp, parentProp) {\n var parentSelectors = parentProp.split(separatorRegExp);\n var nestedSelectors = nestedProp.split(separatorRegExp);\n\n var result = '';\n\n for (var i = 0; i < parentSelectors.length; i++) {\n var parent = parentSelectors[i];\n\n for (var j = 0; j < nestedSelectors.length; j++) {\n var nested = nestedSelectors[j];\n if (result) result += ', ';\n // Replace all & by the parent or prefix & with the parent.\n result += hasAnd(nested) ? nested.replace(parentRegExp, parent) : parent + ' ' + nested;\n }\n }\n\n return result;\n }\n\n function getOptions(rule, container, options) {\n // Options has been already created, now we only increase index.\n if (options) return _extends({}, options, { index: options.index + 1 });\n\n var nestingLevel = rule.options.nestingLevel;\n\n nestingLevel = nestingLevel === undefined ? 1 : nestingLevel + 1;\n\n return _extends({}, rule.options, {\n nestingLevel: nestingLevel,\n index: container.indexOf(rule) + 1\n });\n }\n\n function onProcessStyle(style, rule) {\n if (rule.type !== 'style') return style;\n var container = rule.options.parent;\n var options = void 0;\n var replaceRef = void 0;\n for (var prop in style) {\n var isNested = hasAnd(prop);\n var isNestedConditional = prop[0] === '@';\n\n if (!isNested && !isNestedConditional) continue;\n\n options = getOptions(rule, container, options);\n\n if (isNested) {\n var selector = replaceParentRefs(prop, rule.selector\n // Lazily create the ref replacer function just once for\n // all nested rules within the sheet.\n );if (!replaceRef) replaceRef = getReplaceRef(container\n // Replace all $refs.\n );selector = selector.replace(refRegExp, replaceRef);\n\n container.addRule(selector, style[prop], _extends({}, options, { selector: selector }));\n } else if (isNestedConditional) {\n container\n // Place conditional right after the parent rule to ensure right ordering.\n .addRule(prop, null, options).addRule(rule.key, style[prop], { selector: rule.selector });\n }\n\n delete style[prop];\n }\n\n return style;\n }\n\n return { onProcessStyle: onProcessStyle };\n}", - "/**\n * Copyright 2014-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n */\n\n'use strict';\n\n/**\n * Similar to invariant but only logs a warning if the condition is not met.\n * This can be used to log issues in development environments in critical\n * paths. Removing the logging code for production environments will keep the\n * same logic and follow the same code paths.\n */\n\nvar warning = function() {};\n\nif (process.env.NODE_ENV !== 'production') {\n warning = function(condition, format, args) {\n var len = arguments.length;\n args = new Array(len > 2 ? len - 2 : 0);\n for (var key = 2; key < len; key++) {\n args[key - 2] = arguments[key];\n }\n if (format === undefined) {\n throw new Error(\n '` + ("`" + `warning(condition, format, ...args)`))))) + (((("`" + ` requires a warning ' +\n 'message argument'\n );\n }\n\n if (format.length < 10 || (/^[s\\W]*$/).test(format)) {\n throw new Error(\n 'The warning format should be able to uniquely identify this ' +\n 'warning. Please, use a more descriptive format than: ' + format\n );\n }\n\n if (!condition) {\n var argIndex = 0;\n var message = 'Warning: ' +\n format.replace(/%s/g, function() {\n return args[argIndex++];\n });\n if (typeof console !== 'undefined') {\n console.error(message);\n }\n try {\n // This error was thrown as a convenience so that you can use this stack\n // to find the callsite that caused this warning to fire.\n throw new Error(message);\n } catch(x) {}\n }\n };\n}\n\nmodule.exports = warning;\n", + "/**\n * Copyright 2014-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n */\n\n'use strict';\n\n/**\n * Similar to invariant but only logs a warning if the condition is not met.\n * This can be used to log issues in development environments in critical\n * paths. Removing the logging code for production environments will keep the\n * same logic and follow the same code paths.\n */\n\nvar warning = function() {};\n\nif (process.env.NODE_ENV !== 'production') {\n warning = function(condition, format, args) {\n var len = arguments.length;\n args = new Array(len > 2 ? len - 2 : 0);\n for (var key = 2; key < len; key++) {\n args[key - 2] = arguments[key];\n }\n if (format === undefined) {\n throw new Error(\n '`)))) + ((("`" + (`warning(condition, format, ...args)` + "`")) + (` requires a warning ' +\n 'message argument'\n );\n }\n\n if (format.length < 10 || (/^[s\\W]*$/).test(format)) {\n throw new Error(\n 'The warning format should be able to uniquely identify this ' +\n 'warning. Please, use a more descriptive format than: ' + format\n );\n }\n\n if (!condition) {\n var argIndex = 0;\n var message = 'Warning: ' +\n format.replace(/%s/g, function() {\n return args[argIndex++];\n });\n if (typeof console !== 'undefined') {\n console.error(message);\n }\n try {\n // This error was thrown as a convenience so that you can use this stack\n // to find the callsite that caused this warning to fire.\n throw new Error(message);\n } catch(x) {}\n }\n };\n}\n\nmodule.exports = warning;\n", "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports['default'] = jssPropsSort;\n/**\n * Sort props by length.\n */\nfunction jssPropsSort() {\n function sort(prop0, prop1) {\n return prop0.length - prop1.length;\n }\n\n function onProcessStyle(style, rule) {\n if (rule.type !== 'style') return style;\n\n var newStyle = {};\n var props = Object.keys(style).sort(sort);\n for (var prop in props) {\n newStyle[props[prop]] = style[props[prop]];\n }\n return newStyle;\n }\n\n return { onProcessStyle: onProcessStyle };\n}", "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports['default'] = jssVendorPrefixer;\n\nvar _cssVendor = require('css-vendor');\n\nvar vendor = _interopRequireWildcard(_cssVendor);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }\n\n/**\n * Add vendor prefix to a property name when needed.\n *\n * @param {Rule} rule\n * @api public\n */\nfunction jssVendorPrefixer() {\n function onProcessRule(rule) {\n if (rule.type === 'keyframes') {\n rule.key = '@' + vendor.prefix.css + rule.key.substr(1);\n }\n }\n\n function onProcessStyle(style, rule) {\n if (rule.type !== 'style') return style;\n\n for (var prop in style) {\n var value = style[prop];\n\n var changeProp = false;\n var supportedProp = vendor.supportedProperty(prop);\n if (supportedProp && supportedProp !== prop) changeProp = true;\n\n var changeValue = false;\n var supportedValue = vendor.supportedValue(supportedProp, value);\n if (supportedValue && supportedValue !== value) changeValue = true;\n\n if (changeProp || changeValue) {\n if (changeProp) delete style[prop];\n style[supportedProp || prop] = supportedValue || value;\n }\n }\n\n return style;\n }\n\n function onChangeValue(value, prop) {\n return vendor.supportedValue(prop, value);\n }\n\n return { onProcessRule: onProcessRule, onProcessStyle: onProcessStyle, onChangeValue: onChangeValue };\n}", "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _isInBrowser = require('is-in-browser');\n\nvar _isInBrowser2 = _interopRequireDefault(_isInBrowser);\n\nvar _StyleSheet = require('./StyleSheet');\n\nvar _StyleSheet2 = _interopRequireDefault(_StyleSheet);\n\nvar _PluginsRegistry = require('./PluginsRegistry');\n\nvar _PluginsRegistry2 = _interopRequireDefault(_PluginsRegistry);\n\nvar _rules = require('./plugins/rules');\n\nvar _rules2 = _interopRequireDefault(_rules);\n\nvar _observables = require('./plugins/observables');\n\nvar _observables2 = _interopRequireDefault(_observables);\n\nvar _functions = require('./plugins/functions');\n\nvar _functions2 = _interopRequireDefault(_functions);\n\nvar _sheets = require('./sheets');\n\nvar _sheets2 = _interopRequireDefault(_sheets);\n\nvar _StyleRule = require('./rules/StyleRule');\n\nvar _StyleRule2 = _interopRequireDefault(_StyleRule);\n\nvar _createGenerateClassName = require('./utils/createGenerateClassName');\n\nvar _createGenerateClassName2 = _interopRequireDefault(_createGenerateClassName);\n\nvar _createRule2 = require('./utils/createRule');\n\nvar _createRule3 = _interopRequireDefault(_createRule2);\n\nvar _DomRenderer = require('./renderers/DomRenderer');\n\nvar _DomRenderer2 = _interopRequireDefault(_DomRenderer);\n\nvar _VirtualRenderer = require('./renderers/VirtualRenderer');\n\nvar _VirtualRenderer2 = _interopRequireDefault(_VirtualRenderer);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar defaultPlugins = _rules2['default'].concat([_observables2['default'], _functions2['default']]);\n\nvar instanceCounter = 0;\n\nvar Jss = function () {\n function Jss(options) {\n _classCallCheck(this, Jss);\n\n this.id = instanceCounter++;\n this.version = \"9.8.7\";\n this.plugins = new _PluginsRegistry2['default']();\n this.options = {\n createGenerateClassName: _createGenerateClassName2['default'],\n Renderer: _isInBrowser2['default'] ? _DomRenderer2['default'] : _VirtualRenderer2['default'],\n plugins: []\n };\n this.generateClassName = (0, _createGenerateClassName2['default'])();\n\n // eslint-disable-next-line prefer-spread\n this.use.apply(this, defaultPlugins);\n this.setup(options);\n }\n\n _createClass(Jss, [{\n key: 'setup',\n value: function setup() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n if (options.createGenerateClassName) {\n this.options.createGenerateClassName = options.createGenerateClassName;\n // $FlowFixMe\n this.generateClassName = options.createGenerateClassName();\n }\n\n if (options.insertionPoint != null) this.options.insertionPoint = options.insertionPoint;\n if (options.virtual || options.Renderer) {\n this.options.Renderer = options.Renderer || (options.virtual ? _VirtualRenderer2['default'] : _DomRenderer2['default']);\n }\n\n // eslint-disable-next-line prefer-spread\n if (options.plugins) this.use.apply(this, options.plugins);\n\n return this;\n }\n\n /**\n * Create a Style Sheet.\n */\n\n }, {\n key: 'createStyleSheet',\n value: function createStyleSheet(styles) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n var index = options.index;\n if (typeof index !== 'number') {\n index = _sheets2['default'].index === 0 ? 0 : _sheets2['default'].index + 1;\n }\n var sheet = new _StyleSheet2['default'](styles, _extends({}, options, {\n jss: this,\n generateClassName: options.generateClassName || this.generateClassName,\n insertionPoint: this.options.insertionPoint,\n Renderer: this.options.Renderer,\n index: index\n }));\n this.plugins.onProcessSheet(sheet);\n\n return sheet;\n }\n\n /**\n * Detach the Style Sheet and remove it from the registry.\n */\n\n }, {\n key: 'removeStyleSheet',\n value: function removeStyleSheet(sheet) {\n sheet.detach();\n _sheets2['default'].remove(sheet);\n return this;\n }\n\n /**\n * Create a rule without a Style Sheet.\n */\n\n }, {\n key: 'createRule',\n value: function createRule(name) {\n var style = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n // Enable rule without name for inline styles.\n if ((typeof name === 'undefined' ? 'undefined' : _typeof(name)) === 'object') {\n options = style;\n style = name;\n name = undefined;\n }\n\n // Cast from RuleFactoryOptions to RuleOptions\n // https://stackoverflow.com/questions/41328728/force-casting-in-flow\n var ruleOptions = options;\n\n ruleOptions.jss = this;\n ruleOptions.Renderer = this.options.Renderer;\n if (!ruleOptions.generateClassName) ruleOptions.generateClassName = this.generateClassName;\n if (!ruleOptions.classes) ruleOptions.classes = {};\n var rule = (0, _createRule3['default'])(name, style, ruleOptions);\n\n if (!ruleOptions.selector && rule instanceof _StyleRule2['default']) {\n rule.selector = '.' + ruleOptions.generateClassName(rule);\n }\n\n this.plugins.onProcessRule(rule);\n\n return rule;\n }\n\n /**\n * Register plugin. Passed function will be invoked with a rule instance.\n */\n\n }, {\n key: 'use',\n value: function use() {\n var _this = this;\n\n for (var _len = arguments.length, plugins = Array(_len), _key = 0; _key < _len; _key++) {\n plugins[_key] = arguments[_key];\n }\n\n plugins.forEach(function (plugin) {\n // Avoids applying same plugin twice, at least based on ref.\n if (_this.options.plugins.indexOf(plugin) === -1) {\n _this.options.plugins.push(plugin);\n _this.plugins.use(plugin);\n }\n });\n\n return this;\n }\n }]);\n\n return Jss;\n}();\n\nexports['default'] = Jss;", - "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _warning = require('warning');\n\nvar _warning2 = _interopRequireDefault(_warning);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar PluginsRegistry = function () {\n function PluginsRegistry() {\n _classCallCheck(this, PluginsRegistry);\n\n this.hooks = {\n onCreateRule: [],\n onProcessRule: [],\n onProcessStyle: [],\n onProcessSheet: [],\n onChangeValue: [],\n onUpdate: []\n\n /**\n * Call `) + ("`" + (`onCreateRule` + "`"))) + ((` hooks and return an object if returned by a hook.\n */\n };\n }\n\n _createClass(PluginsRegistry, [{\n key: 'onCreateRule',\n value: function onCreateRule(name, decl, options) {\n for (var i = 0; i < this.hooks.onCreateRule.length; i++) {\n var rule = this.hooks.onCreateRule[i](name, decl, options);\n if (rule) return rule;\n }\n return null;\n }\n\n /**\n * Call ` + ("`" + `onProcessRule`)) + ("`" + (` hooks.\n */\n\n }, {\n key: 'onProcessRule',\n value: function onProcessRule(rule) {\n if (rule.isProcessed) return;\n var sheet = rule.options.sheet;\n\n for (var i = 0; i < this.hooks.onProcessRule.length; i++) {\n this.hooks.onProcessRule[i](rule, sheet);\n }\n\n // $FlowFixMe\n if (rule.style) this.onProcessStyle(rule.style, rule, sheet);\n\n rule.isProcessed = true;\n }\n\n /**\n * Call ` + "`")))) + (((`onProcessStyle` + "`") + (` hooks.\n */\n\n }, {\n key: 'onProcessStyle',\n value: function onProcessStyle(style, rule, sheet) {\n var nextStyle = style;\n\n for (var i = 0; i < this.hooks.onProcessStyle.length; i++) {\n nextStyle = this.hooks.onProcessStyle[i](nextStyle, rule, sheet);\n // $FlowFixMe\n rule.style = nextStyle;\n }\n }\n\n /**\n * Call ` + ("`" + `onProcessSheet`))) + (("`" + (` hooks.\n */\n\n }, {\n key: 'onProcessSheet',\n value: function onProcessSheet(sheet) {\n for (var i = 0; i < this.hooks.onProcessSheet.length; i++) {\n this.hooks.onProcessSheet[i](sheet);\n }\n }\n\n /**\n * Call ` + "`")) + (`onUpdate` + ("`" + ` hooks.\n */\n\n }, {\n key: 'onUpdate',\n value: function onUpdate(data, rule, sheet) {\n for (var i = 0; i < this.hooks.onUpdate.length; i++) {\n this.hooks.onUpdate[i](data, rule, sheet);\n }\n }\n\n /**\n * Call `)))))) + ((((("`" + `onChangeValue`) + ("`" + (` hooks.\n */\n\n }, {\n key: 'onChangeValue',\n value: function onChangeValue(value, prop, rule) {\n var processedValue = value;\n for (var i = 0; i < this.hooks.onChangeValue.length; i++) {\n processedValue = this.hooks.onChangeValue[i](processedValue, prop, rule);\n }\n return processedValue;\n }\n\n /**\n * Register a plugin.\n * If function is passed, it is a shortcut for ` + "`"))) + ((`{onProcessRule}` + ("`" + `.\n */\n\n }, {\n key: 'use',\n value: function use(plugin) {\n for (var name in plugin) {\n if (this.hooks[name]) this.hooks[name].push(plugin[name]);else (0, _warning2['default'])(false, '[JSS] Unknown hook \"%s\".', name);\n }\n }\n }]);\n\n return PluginsRegistry;\n}();\n\nexports['default'] = PluginsRegistry;", - "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _createRule = require('./utils/createRule');\n\nvar _createRule2 = _interopRequireDefault(_createRule);\n\nvar _linkRule = require('./utils/linkRule');\n\nvar _linkRule2 = _interopRequireDefault(_linkRule);\n\nvar _StyleRule = require('./rules/StyleRule');\n\nvar _StyleRule2 = _interopRequireDefault(_StyleRule);\n\nvar _escape = require('./utils/escape');\n\nvar _escape2 = _interopRequireDefault(_escape);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * Contains rules objects and allows adding/removing etc.\n * Is used for e.g. by `)) + ("`" + (`StyleSheet` + "`")))) + (((` or ` + "`") + (`ConditionalRule` + ("`" + `.\n */\nvar RuleList = function () {\n\n // Original styles object.\n function RuleList(options) {\n var _this = this;\n\n _classCallCheck(this, RuleList);\n\n this.map = {};\n this.raw = {};\n this.index = [];\n\n this.update = function (name, data) {\n var _options = _this.options,\n plugins = _options.jss.plugins,\n sheet = _options.sheet;\n\n if (typeof name === 'string') {\n plugins.onUpdate(data, _this.get(name), sheet);\n } else {\n for (var index = 0; index < _this.index.length; index++) {\n plugins.onUpdate(name, _this.index[index], sheet);\n }\n }\n };\n\n this.options = options;\n this.classes = options.classes;\n }\n\n /**\n * Create and register rule.\n *\n * Will not render after Style Sheet was rendered the first time.\n */\n\n\n // Used to ensure correct rules order.\n\n // Rules registry for access by .get() method.\n // It contains the same rule registered by name and by selector.\n\n\n _createClass(RuleList, [{\n key: 'add',\n value: function add(name, decl, options) {\n var _options2 = this.options,\n parent = _options2.parent,\n sheet = _options2.sheet,\n jss = _options2.jss,\n Renderer = _options2.Renderer,\n generateClassName = _options2.generateClassName;\n\n\n options = _extends({\n classes: this.classes,\n parent: parent,\n sheet: sheet,\n jss: jss,\n Renderer: Renderer,\n generateClassName: generateClassName\n }, options);\n\n if (!options.selector && this.classes[name]) {\n options.selector = '.' + (0, _escape2['default'])(this.classes[name]);\n }\n\n this.raw[name] = decl;\n\n var rule = (0, _createRule2['default'])(name, decl, options);\n\n var className = void 0;\n\n if (!options.selector && rule instanceof _StyleRule2['default']) {\n className = generateClassName(rule, sheet);\n rule.selector = '.' + (0, _escape2['default'])(className);\n }\n\n this.register(rule, className);\n\n var index = options.index === undefined ? this.index.length : options.index;\n this.index.splice(index, 0, rule);\n\n return rule;\n }\n\n /**\n * Get a rule.\n */\n\n }, {\n key: 'get',\n value: function get(name) {\n return this.map[name];\n }\n\n /**\n * Delete a rule.\n */\n\n }, {\n key: 'remove',\n value: function remove(rule) {\n this.unregister(rule);\n this.index.splice(this.indexOf(rule), 1);\n }\n\n /**\n * Get index of a rule.\n */\n\n }, {\n key: 'indexOf',\n value: function indexOf(rule) {\n return this.index.indexOf(rule);\n }\n\n /**\n * Run `))) + (("`" + (`onProcessRule()` + "`")) + (` plugins on every rule.\n */\n\n }, {\n key: 'process',\n value: function process() {\n var plugins = this.options.jss.plugins;\n // We need to clone array because if we modify the index somewhere else during a loop\n // we end up with very hard-to-track-down side effects.\n\n this.index.slice(0).forEach(plugins.onProcessRule, plugins);\n }\n\n /**\n * Register a rule in ` + ("`" + `.map`))))) + (((("`" + ` and `) + ("`" + (`.classes` + "`"))) + ((` maps.\n */\n\n }, {\n key: 'register',\n value: function register(rule, className) {\n this.map[rule.key] = rule;\n if (rule instanceof _StyleRule2['default']) {\n this.map[rule.selector] = rule;\n if (className) this.classes[rule.key] = className;\n }\n }\n\n /**\n * Unregister a rule.\n */\n\n }, {\n key: 'unregister',\n value: function unregister(rule) {\n delete this.map[rule.key];\n if (rule instanceof _StyleRule2['default']) {\n delete this.map[rule.selector];\n delete this.classes[rule.key];\n }\n }\n\n /**\n * Update the function values with a new data.\n */\n\n }, {\n key: 'link',\n\n\n /**\n * Link renderable rules with CSSRuleList.\n */\n value: function link(cssRules) {\n var map = this.options.sheet.renderer.getUnescapedKeysMap(this.index);\n\n for (var i = 0; i < cssRules.length; i++) {\n var cssRule = cssRules[i];\n var _key = this.options.sheet.renderer.getKey(cssRule);\n if (map[_key]) _key = map[_key];\n var rule = this.map[_key];\n if (rule) (0, _linkRule2['default'])(rule, cssRule);\n }\n }\n\n /**\n * Convert rules to a CSS string.\n */\n\n }, {\n key: 'toString',\n value: function toString(options) {\n var str = '';\n var sheet = this.options.sheet;\n\n var link = sheet ? sheet.options.link : false;\n\n for (var index = 0; index < this.index.length; index++) {\n var rule = this.index[index];\n var css = rule.toString(options);\n\n // No need to render an empty rule.\n if (!css && !link) continue;\n\n if (str) str += '\\n';\n str += css;\n }\n\n return str;\n }\n }]);\n\n return RuleList;\n}();\n\nexports['default'] = RuleList;", + "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _warning = require('warning');\n\nvar _warning2 = _interopRequireDefault(_warning);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar PluginsRegistry = function () {\n function PluginsRegistry() {\n _classCallCheck(this, PluginsRegistry);\n\n this.hooks = {\n onCreateRule: [],\n onProcessRule: [],\n onProcessStyle: [],\n onProcessSheet: [],\n onChangeValue: [],\n onUpdate: []\n\n /**\n * Call ` + ("`" + `onCreateRule`))) + (("`" + (` hooks and return an object if returned by a hook.\n */\n };\n }\n\n _createClass(PluginsRegistry, [{\n key: 'onCreateRule',\n value: function onCreateRule(name, decl, options) {\n for (var i = 0; i < this.hooks.onCreateRule.length; i++) {\n var rule = this.hooks.onCreateRule[i](name, decl, options);\n if (rule) return rule;\n }\n return null;\n }\n\n /**\n * Call ` + "`")) + (`onProcessRule` + ("`" + ` hooks.\n */\n\n }, {\n key: 'onProcessRule',\n value: function onProcessRule(rule) {\n if (rule.isProcessed) return;\n var sheet = rule.options.sheet;\n\n for (var i = 0; i < this.hooks.onProcessRule.length; i++) {\n this.hooks.onProcessRule[i](rule, sheet);\n }\n\n // $FlowFixMe\n if (rule.style) this.onProcessStyle(rule.style, rule, sheet);\n\n rule.isProcessed = true;\n }\n\n /**\n * Call `))))) + (((("`" + (`onProcessStyle` + "`")) + (` hooks.\n */\n\n }, {\n key: 'onProcessStyle',\n value: function onProcessStyle(style, rule, sheet) {\n var nextStyle = style;\n\n for (var i = 0; i < this.hooks.onProcessStyle.length; i++) {\n nextStyle = this.hooks.onProcessStyle[i](nextStyle, rule, sheet);\n // $FlowFixMe\n rule.style = nextStyle;\n }\n }\n\n /**\n * Call ` + ("`" + `onProcessSheet`))) + (("`" + (` hooks.\n */\n\n }, {\n key: 'onProcessSheet',\n value: function onProcessSheet(sheet) {\n for (var i = 0; i < this.hooks.onProcessSheet.length; i++) {\n this.hooks.onProcessSheet[i](sheet);\n }\n }\n\n /**\n * Call ` + "`")) + (`onUpdate` + ("`" + ` hooks.\n */\n\n }, {\n key: 'onUpdate',\n value: function onUpdate(data, rule, sheet) {\n for (var i = 0; i < this.hooks.onUpdate.length; i++) {\n this.hooks.onUpdate[i](data, rule, sheet);\n }\n }\n\n /**\n * Call `)))) + ((("`" + (`onChangeValue` + "`")) + (` hooks.\n */\n\n }, {\n key: 'onChangeValue',\n value: function onChangeValue(value, prop, rule) {\n var processedValue = value;\n for (var i = 0; i < this.hooks.onChangeValue.length; i++) {\n processedValue = this.hooks.onChangeValue[i](processedValue, prop, rule);\n }\n return processedValue;\n }\n\n /**\n * Register a plugin.\n * If function is passed, it is a shortcut for ` + ("`" + `{onProcessRule}`))) + (("`" + (`.\n */\n\n }, {\n key: 'use',\n value: function use(plugin) {\n for (var name in plugin) {\n if (this.hooks[name]) this.hooks[name].push(plugin[name]);else (0, _warning2['default'])(false, '[JSS] Unknown hook \"%s\".', name);\n }\n }\n }]);\n\n return PluginsRegistry;\n}();\n\nexports['default'] = PluginsRegistry;", + "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _createRule = require('./utils/createRule');\n\nvar _createRule2 = _interopRequireDefault(_createRule);\n\nvar _linkRule = require('./utils/linkRule');\n\nvar _linkRule2 = _interopRequireDefault(_linkRule);\n\nvar _StyleRule = require('./rules/StyleRule');\n\nvar _StyleRule2 = _interopRequireDefault(_StyleRule);\n\nvar _escape = require('./utils/escape');\n\nvar _escape2 = _interopRequireDefault(_escape);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * Contains rules objects and allows adding/removing etc.\n * Is used for e.g. by ` + "`")) + ((`StyleSheet` + "`") + (` or ` + "`")))))) + (((((`ConditionalRule` + ("`" + `.\n */\nvar RuleList = function () {\n\n // Original styles object.\n function RuleList(options) {\n var _this = this;\n\n _classCallCheck(this, RuleList);\n\n this.map = {};\n this.raw = {};\n this.index = [];\n\n this.update = function (name, data) {\n var _options = _this.options,\n plugins = _options.jss.plugins,\n sheet = _options.sheet;\n\n if (typeof name === 'string') {\n plugins.onUpdate(data, _this.get(name), sheet);\n } else {\n for (var index = 0; index < _this.index.length; index++) {\n plugins.onUpdate(name, _this.index[index], sheet);\n }\n }\n };\n\n this.options = options;\n this.classes = options.classes;\n }\n\n /**\n * Create and register rule.\n *\n * Will not render after Style Sheet was rendered the first time.\n */\n\n\n // Used to ensure correct rules order.\n\n // Rules registry for access by .get() method.\n // It contains the same rule registered by name and by selector.\n\n\n _createClass(RuleList, [{\n key: 'add',\n value: function add(name, decl, options) {\n var _options2 = this.options,\n parent = _options2.parent,\n sheet = _options2.sheet,\n jss = _options2.jss,\n Renderer = _options2.Renderer,\n generateClassName = _options2.generateClassName;\n\n\n options = _extends({\n classes: this.classes,\n parent: parent,\n sheet: sheet,\n jss: jss,\n Renderer: Renderer,\n generateClassName: generateClassName\n }, options);\n\n if (!options.selector && this.classes[name]) {\n options.selector = '.' + (0, _escape2['default'])(this.classes[name]);\n }\n\n this.raw[name] = decl;\n\n var rule = (0, _createRule2['default'])(name, decl, options);\n\n var className = void 0;\n\n if (!options.selector && rule instanceof _StyleRule2['default']) {\n className = generateClassName(rule, sheet);\n rule.selector = '.' + (0, _escape2['default'])(className);\n }\n\n this.register(rule, className);\n\n var index = options.index === undefined ? this.index.length : options.index;\n this.index.splice(index, 0, rule);\n\n return rule;\n }\n\n /**\n * Get a rule.\n */\n\n }, {\n key: 'get',\n value: function get(name) {\n return this.map[name];\n }\n\n /**\n * Delete a rule.\n */\n\n }, {\n key: 'remove',\n value: function remove(rule) {\n this.unregister(rule);\n this.index.splice(this.indexOf(rule), 1);\n }\n\n /**\n * Get index of a rule.\n */\n\n }, {\n key: 'indexOf',\n value: function indexOf(rule) {\n return this.index.indexOf(rule);\n }\n\n /**\n * Run `)) + ("`" + (`onProcessRule()` + "`"))) + ((` plugins on every rule.\n */\n\n }, {\n key: 'process',\n value: function process() {\n var plugins = this.options.jss.plugins;\n // We need to clone array because if we modify the index somewhere else during a loop\n // we end up with very hard-to-track-down side effects.\n\n this.index.slice(0).forEach(plugins.onProcessRule, plugins);\n }\n\n /**\n * Register a rule in ` + ("`" + `.map`)) + ("`" + (` and ` + "`")))) + (((`.classes` + ("`" + ` maps.\n */\n\n }, {\n key: 'register',\n value: function register(rule, className) {\n this.map[rule.key] = rule;\n if (rule instanceof _StyleRule2['default']) {\n this.map[rule.selector] = rule;\n if (className) this.classes[rule.key] = className;\n }\n }\n\n /**\n * Unregister a rule.\n */\n\n }, {\n key: 'unregister',\n value: function unregister(rule) {\n delete this.map[rule.key];\n if (rule instanceof _StyleRule2['default']) {\n delete this.map[rule.selector];\n delete this.classes[rule.key];\n }\n }\n\n /**\n * Update the function values with a new data.\n */\n\n }, {\n key: 'link',\n\n\n /**\n * Link renderable rules with CSSRuleList.\n */\n value: function link(cssRules) {\n var map = this.options.sheet.renderer.getUnescapedKeysMap(this.index);\n\n for (var i = 0; i < cssRules.length; i++) {\n var cssRule = cssRules[i];\n var _key = this.options.sheet.renderer.getKey(cssRule);\n if (map[_key]) _key = map[_key];\n var rule = this.map[_key];\n if (rule) (0, _linkRule2['default'])(rule, cssRule);\n }\n }\n\n /**\n * Convert rules to a CSS string.\n */\n\n }, {\n key: 'toString',\n value: function toString(options) {\n var str = '';\n var sheet = this.options.sheet;\n\n var link = sheet ? sheet.options.link : false;\n\n for (var index = 0; index < this.index.length; index++) {\n var rule = this.index[index];\n var css = rule.toString(options);\n\n // No need to render an empty rule.\n if (!css && !link) continue;\n\n if (str) str += '\\n';\n str += css;\n }\n\n return str;\n }\n }]);\n\n return RuleList;\n}();\n\nexports['default'] = RuleList;", "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _warning = require('warning');\n\nvar _warning2 = _interopRequireDefault(_warning);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * SheetsManager is like a WeakMap which is designed to count StyleSheet\n * instances and attach/detach automatically.\n */\nvar SheetsManager = function () {\n function SheetsManager() {\n _classCallCheck(this, SheetsManager);\n\n this.sheets = [];\n this.refs = [];\n this.keys = [];\n }\n\n _createClass(SheetsManager, [{\n key: 'get',\n value: function get(key) {\n var index = this.keys.indexOf(key);\n return this.sheets[index];\n }\n }, {\n key: 'add',\n value: function add(key, sheet) {\n var sheets = this.sheets,\n refs = this.refs,\n keys = this.keys;\n\n var index = sheets.indexOf(sheet);\n\n if (index !== -1) return index;\n\n sheets.push(sheet);\n refs.push(0);\n keys.push(key);\n\n return sheets.length - 1;\n }\n }, {\n key: 'manage',\n value: function manage(key) {\n var index = this.keys.indexOf(key);\n var sheet = this.sheets[index];\n if (this.refs[index] === 0) sheet.attach();\n this.refs[index]++;\n if (!this.keys[index]) this.keys.splice(index, 0, key);\n return sheet;\n }\n }, {\n key: 'unmanage',\n value: function unmanage(key) {\n var index = this.keys.indexOf(key);\n if (index === -1) {\n // eslint-ignore-next-line no-console\n (0, _warning2['default'])(false, \"SheetsManager: can't find sheet to unmanage\");\n return;\n }\n if (this.refs[index] > 0) {\n this.refs[index]--;\n if (this.refs[index] === 0) this.sheets[index].detach();\n }\n }\n }, {\n key: 'size',\n get: function get() {\n return this.keys.length;\n }\n }]);\n\n return SheetsManager;\n}();\n\nexports['default'] = SheetsManager;", "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * Sheets registry to access them all at one place.\n */\nvar SheetsRegistry = function () {\n function SheetsRegistry() {\n _classCallCheck(this, SheetsRegistry);\n\n this.registry = [];\n }\n\n _createClass(SheetsRegistry, [{\n key: 'add',\n\n\n /**\n * Register a Style Sheet.\n */\n value: function add(sheet) {\n var registry = this.registry;\n var index = sheet.options.index;\n\n\n if (registry.indexOf(sheet) !== -1) return;\n\n if (registry.length === 0 || index >= this.index) {\n registry.push(sheet);\n return;\n }\n\n // Find a position.\n for (var i = 0; i < registry.length; i++) {\n if (registry[i].options.index > index) {\n registry.splice(i, 0, sheet);\n return;\n }\n }\n }\n\n /**\n * Reset the registry.\n */\n\n }, {\n key: 'reset',\n value: function reset() {\n this.registry = [];\n }\n\n /**\n * Remove a Style Sheet.\n */\n\n }, {\n key: 'remove',\n value: function remove(sheet) {\n var index = this.registry.indexOf(sheet);\n this.registry.splice(index, 1);\n }\n\n /**\n * Convert all attached sheets to a CSS string.\n */\n\n }, {\n key: 'toString',\n value: function toString(options) {\n return this.registry.filter(function (sheet) {\n return sheet.attached;\n }).map(function (sheet) {\n return sheet.toString(options);\n }).join('\\n');\n }\n }, {\n key: 'index',\n\n\n /**\n * Current highest index number.\n */\n get: function get() {\n return this.registry.length === 0 ? 0 : this.registry[this.registry.length - 1].options.index;\n }\n }]);\n\n return SheetsRegistry;\n}();\n\nexports['default'] = SheetsRegistry;", - "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _linkRule = require('./utils/linkRule');\n\nvar _linkRule2 = _interopRequireDefault(_linkRule);\n\nvar _RuleList = require('./RuleList');\n\nvar _RuleList2 = _interopRequireDefault(_RuleList);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/* eslint-disable-next-line no-use-before-define */\nvar StyleSheet = function () {\n function StyleSheet(styles, options) {\n var _this = this;\n\n _classCallCheck(this, StyleSheet);\n\n this.update = function (name, data) {\n if (typeof name === 'string') {\n _this.rules.update(name, data);\n } else {\n _this.rules.update(name);\n }\n return _this;\n };\n\n this.attached = false;\n this.deployed = false;\n this.linked = false;\n this.classes = {};\n this.options = _extends({}, options, {\n sheet: this,\n parent: this,\n classes: this.classes\n });\n this.renderer = new options.Renderer(this);\n this.rules = new _RuleList2['default'](this.options);\n\n for (var _name in styles) {\n this.rules.add(_name, styles[_name]);\n }\n\n this.rules.process();\n }\n\n /**\n * Attach renderable to the render tree.\n */\n\n\n _createClass(StyleSheet, [{\n key: 'attach',\n value: function attach() {\n if (this.attached) return this;\n if (!this.deployed) this.deploy();\n this.renderer.attach();\n if (!this.linked && this.options.link) this.link();\n this.attached = true;\n return this;\n }\n\n /**\n * Remove renderable from render tree.\n */\n\n }, {\n key: 'detach',\n value: function detach() {\n if (!this.attached) return this;\n this.renderer.detach();\n this.attached = false;\n return this;\n }\n\n /**\n * Add a rule to the current stylesheet.\n * Will insert a rule also after the stylesheet has been rendered first time.\n */\n\n }, {\n key: 'addRule',\n value: function addRule(name, decl, options) {\n var queue = this.queue;\n\n // Plugins can create rules.\n // In order to preserve the right order, we need to queue all ` + ("`" + `.addRule`)) + ("`" + (` calls,\n // which happen after the first ` + "`")))) + (((`rules.add()` + "`") + (` call.\n\n if (this.attached && !queue) this.queue = [];\n\n var rule = this.rules.add(name, decl, options);\n this.options.jss.plugins.onProcessRule(rule);\n\n if (this.attached) {\n if (!this.deployed) return rule;\n // Don't insert rule directly if there is no stringified version yet.\n // It will be inserted all together when .attach is called.\n if (queue) queue.push(rule);else {\n this.insertRule(rule);\n if (this.queue) {\n this.queue.forEach(this.insertRule, this);\n this.queue = undefined;\n }\n }\n return rule;\n }\n\n // We can't add rules to a detached style node.\n // We will redeploy the sheet once user will attach it.\n this.deployed = false;\n\n return rule;\n }\n\n /**\n * Insert rule into the StyleSheet\n */\n\n }, {\n key: 'insertRule',\n value: function insertRule(rule) {\n var renderable = this.renderer.insertRule(rule);\n if (renderable && this.options.link) (0, _linkRule2['default'])(rule, renderable);\n }\n\n /**\n * Create and add rules.\n * Will render also after Style Sheet was rendered the first time.\n */\n\n }, {\n key: 'addRules',\n value: function addRules(styles, options) {\n var added = [];\n for (var _name2 in styles) {\n added.push(this.addRule(_name2, styles[_name2], options));\n }\n return added;\n }\n\n /**\n * Get a rule by name.\n */\n\n }, {\n key: 'getRule',\n value: function getRule(name) {\n return this.rules.get(name);\n }\n\n /**\n * Delete a rule by name.\n * Returns ` + ("`" + `true`))) + (("`" + (`: if rule has been deleted from the DOM.\n */\n\n }, {\n key: 'deleteRule',\n value: function deleteRule(name) {\n var rule = this.rules.get(name);\n\n if (!rule) return false;\n\n this.rules.remove(rule);\n\n if (this.attached && rule.renderable) {\n return this.renderer.deleteRule(rule.renderable);\n }\n\n return true;\n }\n\n /**\n * Get index of a rule.\n */\n\n }, {\n key: 'indexOf',\n value: function indexOf(rule) {\n return this.rules.indexOf(rule);\n }\n\n /**\n * Deploy pure CSS string to a renderable.\n */\n\n }, {\n key: 'deploy',\n value: function deploy() {\n this.renderer.deploy();\n this.deployed = true;\n return this;\n }\n\n /**\n * Link renderable CSS rules from sheet with their corresponding models.\n */\n\n }, {\n key: 'link',\n value: function link() {\n var cssRules = this.renderer.getRules();\n\n // Is undefined when VirtualRenderer is used.\n if (cssRules) this.rules.link(cssRules);\n this.linked = true;\n return this;\n }\n\n /**\n * Update the function values with a new data.\n */\n\n }, {\n key: 'toString',\n\n\n /**\n * Convert rules to a CSS string.\n */\n value: function toString(options) {\n return this.rules.toString(options);\n }\n }]);\n\n return StyleSheet;\n}();\n\nexports['default'] = StyleSheet;", + "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _linkRule = require('./utils/linkRule');\n\nvar _linkRule2 = _interopRequireDefault(_linkRule);\n\nvar _RuleList = require('./RuleList');\n\nvar _RuleList2 = _interopRequireDefault(_RuleList);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/* eslint-disable-next-line no-use-before-define */\nvar StyleSheet = function () {\n function StyleSheet(styles, options) {\n var _this = this;\n\n _classCallCheck(this, StyleSheet);\n\n this.update = function (name, data) {\n if (typeof name === 'string') {\n _this.rules.update(name, data);\n } else {\n _this.rules.update(name);\n }\n return _this;\n };\n\n this.attached = false;\n this.deployed = false;\n this.linked = false;\n this.classes = {};\n this.options = _extends({}, options, {\n sheet: this,\n parent: this,\n classes: this.classes\n });\n this.renderer = new options.Renderer(this);\n this.rules = new _RuleList2['default'](this.options);\n\n for (var _name in styles) {\n this.rules.add(_name, styles[_name]);\n }\n\n this.rules.process();\n }\n\n /**\n * Attach renderable to the render tree.\n */\n\n\n _createClass(StyleSheet, [{\n key: 'attach',\n value: function attach() {\n if (this.attached) return this;\n if (!this.deployed) this.deploy();\n this.renderer.attach();\n if (!this.linked && this.options.link) this.link();\n this.attached = true;\n return this;\n }\n\n /**\n * Remove renderable from render tree.\n */\n\n }, {\n key: 'detach',\n value: function detach() {\n if (!this.attached) return this;\n this.renderer.detach();\n this.attached = false;\n return this;\n }\n\n /**\n * Add a rule to the current stylesheet.\n * Will insert a rule also after the stylesheet has been rendered first time.\n */\n\n }, {\n key: 'addRule',\n value: function addRule(name, decl, options) {\n var queue = this.queue;\n\n // Plugins can create rules.\n // In order to preserve the right order, we need to queue all `)) + ("`" + (`.addRule` + "`"))) + ((` calls,\n // which happen after the first ` + ("`" + `rules.add()`)) + (("`" + ` call.\n\n if (this.attached && !queue) this.queue = [];\n\n var rule = this.rules.add(name, decl, options);\n this.options.jss.plugins.onProcessRule(rule);\n\n if (this.attached) {\n if (!this.deployed) return rule;\n // Don't insert rule directly if there is no stringified version yet.\n // It will be inserted all together when .attach is called.\n if (queue) queue.push(rule);else {\n this.insertRule(rule);\n if (this.queue) {\n this.queue.forEach(this.insertRule, this);\n this.queue = undefined;\n }\n }\n return rule;\n }\n\n // We can't add rules to a detached style node.\n // We will redeploy the sheet once user will attach it.\n this.deployed = false;\n\n return rule;\n }\n\n /**\n * Insert rule into the StyleSheet\n */\n\n }, {\n key: 'insertRule',\n value: function insertRule(rule) {\n var renderable = this.renderer.insertRule(rule);\n if (renderable && this.options.link) (0, _linkRule2['default'])(rule, renderable);\n }\n\n /**\n * Create and add rules.\n * Will render also after Style Sheet was rendered the first time.\n */\n\n }, {\n key: 'addRules',\n value: function addRules(styles, options) {\n var added = [];\n for (var _name2 in styles) {\n added.push(this.addRule(_name2, styles[_name2], options));\n }\n return added;\n }\n\n /**\n * Get a rule by name.\n */\n\n }, {\n key: 'getRule',\n value: function getRule(name) {\n return this.rules.get(name);\n }\n\n /**\n * Delete a rule by name.\n * Returns `) + ("`" + `true`))))) + (((("`" + (`: if rule has been deleted from the DOM.\n */\n\n }, {\n key: 'deleteRule',\n value: function deleteRule(name) {\n var rule = this.rules.get(name);\n\n if (!rule) return false;\n\n this.rules.remove(rule);\n\n if (this.attached && rule.renderable) {\n return this.renderer.deleteRule(rule.renderable);\n }\n\n return true;\n }\n\n /**\n * Get index of a rule.\n */\n\n }, {\n key: 'indexOf',\n value: function indexOf(rule) {\n return this.rules.indexOf(rule);\n }\n\n /**\n * Deploy pure CSS string to a renderable.\n */\n\n }, {\n key: 'deploy',\n value: function deploy() {\n this.renderer.deploy();\n this.deployed = true;\n return this;\n }\n\n /**\n * Link renderable CSS rules from sheet with their corresponding models.\n */\n\n }, {\n key: 'link',\n value: function link() {\n var cssRules = this.renderer.getRules();\n\n // Is undefined when VirtualRenderer is used.\n if (cssRules) this.rules.link(cssRules);\n this.linked = true;\n return this;\n }\n\n /**\n * Update the function values with a new data.\n */\n\n }, {\n key: 'toString',\n\n\n /**\n * Convert rules to a CSS string.\n */\n value: function toString(options) {\n return this.rules.toString(options);\n }\n }]);\n\n return StyleSheet;\n}();\n\nexports['default'] = StyleSheet;", "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.create = exports.createGenerateClassName = exports.sheets = exports.RuleList = exports.SheetsManager = exports.SheetsRegistry = exports.toCssValue = exports.getDynamicStyles = undefined;\n\nvar _getDynamicStyles = require('./utils/getDynamicStyles');\n\nObject.defineProperty(exports, 'getDynamicStyles', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_getDynamicStyles)['default'];\n }\n});\n\nvar _toCssValue = require('./utils/toCssValue');\n\nObject.defineProperty(exports, 'toCssValue', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_toCssValue)['default'];\n }\n});\n\nvar _SheetsRegistry = require('./SheetsRegistry');\n\nObject.defineProperty(exports, 'SheetsRegistry', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_SheetsRegistry)['default'];\n }\n});\n\nvar _SheetsManager = require('./SheetsManager');\n\nObject.defineProperty(exports, 'SheetsManager', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_SheetsManager)['default'];\n }\n});\n\nvar _RuleList = require('./RuleList');\n\nObject.defineProperty(exports, 'RuleList', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_RuleList)['default'];\n }\n});\n\nvar _sheets = require('./sheets');\n\nObject.defineProperty(exports, 'sheets', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_sheets)['default'];\n }\n});\n\nvar _createGenerateClassName = require('./utils/createGenerateClassName');\n\nObject.defineProperty(exports, 'createGenerateClassName', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_createGenerateClassName)['default'];\n }\n});\n\nvar _Jss = require('./Jss');\n\nvar _Jss2 = _interopRequireDefault(_Jss);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\n/**\n * Creates a new instance of Jss.\n */\nvar create = exports.create = function create(options) {\n return new _Jss2['default'](options);\n};\n\n/**\n * A global Jss instance.\n */\nexports['default'] = create();", "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _RuleList = require('../RuleList');\n\nvar _RuleList2 = _interopRequireDefault(_RuleList);\n\nvar _StyleRule = require('../rules/StyleRule');\n\nvar _StyleRule2 = _interopRequireDefault(_StyleRule);\n\nvar _createRule = require('../utils/createRule');\n\nvar _createRule2 = _interopRequireDefault(_createRule);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\n// A symbol replacement.\nvar now = Date.now();\n\nvar fnValuesNs = 'fnValues' + now;\nvar fnStyleNs = 'fnStyle' + ++now;\n\nexports['default'] = {\n onCreateRule: function onCreateRule(name, decl, options) {\n if (typeof decl !== 'function') return null;\n var rule = (0, _createRule2['default'])(name, {}, options);\n rule[fnStyleNs] = decl;\n return rule;\n },\n onProcessStyle: function onProcessStyle(style, rule) {\n var fn = {};\n for (var prop in style) {\n var value = style[prop];\n if (typeof value !== 'function') continue;\n delete style[prop];\n fn[prop] = value;\n }\n rule = rule;\n rule[fnValuesNs] = fn;\n return style;\n },\n onUpdate: function onUpdate(data, rule) {\n // It is a rules container like for e.g. ConditionalRule.\n if (rule.rules instanceof _RuleList2['default']) {\n rule.rules.update(data);\n return;\n }\n if (!(rule instanceof _StyleRule2['default'])) return;\n\n rule = rule;\n\n // If we have a fn values map, it is a rule with function values.\n if (rule[fnValuesNs]) {\n for (var prop in rule[fnValuesNs]) {\n rule.prop(prop, rule[fnValuesNs][prop](data));\n }\n }\n\n rule = rule;\n\n var fnStyle = rule[fnStyleNs];\n\n // If we have a style function, the entire rule is dynamic and style object\n // will be returned from that function.\n if (fnStyle) {\n var style = fnStyle(data);\n for (var _prop in style) {\n rule.prop(_prop, style[_prop]);\n }\n }\n }\n};", - "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _StyleRule = require('../rules/StyleRule');\n\nvar _StyleRule2 = _interopRequireDefault(_StyleRule);\n\nvar _createRule = require('../utils/createRule');\n\nvar _createRule2 = _interopRequireDefault(_createRule);\n\nvar _isObservable = require('../utils/isObservable');\n\nvar _isObservable2 = _interopRequireDefault(_isObservable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nexports['default'] = {\n onCreateRule: function onCreateRule(name, decl, options) {\n if (!(0, _isObservable2['default'])(decl)) return null;\n\n // Cast ` + "`")) + (`decl` + ("`" + ` to `))))))) + (((((("`" + `Observable`) + ("`" + (`, since it passed the type guard.\n var style$ = decl;\n\n var rule = (0, _createRule2['default'])(name, {}, options);\n\n // TODO\n // Call ` + "`"))) + ((`stream.subscribe()` + ("`" + ` returns a subscription, which should be explicitly\n // unsubscribed from when we know this sheet is no longer needed.\n style$.subscribe(function (style) {\n for (var prop in style) {\n rule.prop(prop, style[prop]);\n }\n });\n\n return rule;\n },\n onProcessRule: function onProcessRule(rule) {\n if (!(rule instanceof _StyleRule2['default'])) return;\n var styleRule = rule;\n var style = styleRule.style;\n\n var _loop = function _loop(prop) {\n var value = style[prop];\n if (!(0, _isObservable2['default'])(value)) return 'continue';\n delete style[prop];\n value.subscribe({\n next: function next(nextValue) {\n styleRule.prop(prop, nextValue);\n }\n });\n };\n\n for (var prop in style) {\n var _ret = _loop(prop);\n\n if (_ret === 'continue') continue;\n }\n }\n};", + "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _StyleRule = require('../rules/StyleRule');\n\nvar _StyleRule2 = _interopRequireDefault(_StyleRule);\n\nvar _createRule = require('../utils/createRule');\n\nvar _createRule2 = _interopRequireDefault(_createRule);\n\nvar _isObservable = require('../utils/isObservable');\n\nvar _isObservable2 = _interopRequireDefault(_isObservable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nexports['default'] = {\n onCreateRule: function onCreateRule(name, decl, options) {\n if (!(0, _isObservable2['default'])(decl)) return null;\n\n // Cast ` + "`")) + (`decl` + ("`" + ` to `))) + (("`" + (`Observable` + "`")) + (`, since it passed the type guard.\n var style$ = decl;\n\n var rule = (0, _createRule2['default'])(name, {}, options);\n\n // TODO\n // Call ` + ("`" + `stream.subscribe()`)))) + ((("`" + (` returns a subscription, which should be explicitly\n // unsubscribed from when we know this sheet is no longer needed.\n style$.subscribe(function (style) {\n for (var prop in style) {\n rule.prop(prop, style[prop]);\n }\n });\n\n return rule;\n },\n onProcessRule: function onProcessRule(rule) {\n if (!(rule instanceof _StyleRule2['default'])) return;\n var styleRule = rule;\n var style = styleRule.style;\n\n var _loop = function _loop(prop) {\n var value = style[prop];\n if (!(0, _isObservable2['default'])(value)) return 'continue';\n delete style[prop];\n value.subscribe({\n next: function next(nextValue) {\n styleRule.prop(prop, nextValue);\n }\n });\n };\n\n for (var prop in style) {\n var _ret = _loop(prop);\n\n if (_ret === 'continue') continue;\n }\n }\n};", "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _SimpleRule = require('../rules/SimpleRule');\n\nvar _SimpleRule2 = _interopRequireDefault(_SimpleRule);\n\nvar _KeyframesRule = require('../rules/KeyframesRule');\n\nvar _KeyframesRule2 = _interopRequireDefault(_KeyframesRule);\n\nvar _ConditionalRule = require('../rules/ConditionalRule');\n\nvar _ConditionalRule2 = _interopRequireDefault(_ConditionalRule);\n\nvar _FontFaceRule = require('../rules/FontFaceRule');\n\nvar _FontFaceRule2 = _interopRequireDefault(_FontFaceRule);\n\nvar _ViewportRule = require('../rules/ViewportRule');\n\nvar _ViewportRule2 = _interopRequireDefault(_ViewportRule);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nvar classes = {\n '@charset': _SimpleRule2['default'],\n '@import': _SimpleRule2['default'],\n '@namespace': _SimpleRule2['default'],\n '@keyframes': _KeyframesRule2['default'],\n '@media': _ConditionalRule2['default'],\n '@supports': _ConditionalRule2['default'],\n '@font-face': _FontFaceRule2['default'],\n '@viewport': _ViewportRule2['default'],\n '@-ms-viewport': _ViewportRule2['default']\n\n /**\n * Generate plugins which will register all rules.\n */\n};\nvar plugins = Object.keys(classes).map(function (key) {\n // https://jsperf.com/indexof-vs-substr-vs-regex-at-the-beginning-3\n var re = new RegExp('^' + key);\n var RuleClass = classes[key];\n var onCreateRule = function onCreateRule(name, decl, options) {\n return re.test(name) ? new RuleClass(name, decl, options) : null;\n };\n return { onCreateRule: onCreateRule };\n});\n\nexports['default'] = plugins;", - "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _warning = require('warning');\n\nvar _warning2 = _interopRequireDefault(_warning);\n\nvar _sheets = require('../sheets');\n\nvar _sheets2 = _interopRequireDefault(_sheets);\n\nvar _StyleRule = require('../rules/StyleRule');\n\nvar _StyleRule2 = _interopRequireDefault(_StyleRule);\n\nvar _toCssValue = require('../utils/toCssValue');\n\nvar _toCssValue2 = _interopRequireDefault(_toCssValue);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * Cache the value from the first time a function is called.\n */\nvar memoize = function memoize(fn) {\n var value = void 0;\n return function () {\n if (!value) value = fn();\n return value;\n };\n};\n\n/**\n * Get a style property value.\n */\nfunction getPropertyValue(cssRule, prop) {\n try {\n return cssRule.style.getPropertyValue(prop);\n } catch (err) {\n // IE may throw if property is unknown.\n return '';\n }\n}\n\n/**\n * Set a style property.\n */\nfunction setProperty(cssRule, prop, value) {\n try {\n var cssValue = value;\n\n if (Array.isArray(value)) {\n cssValue = (0, _toCssValue2['default'])(value, true);\n\n if (value[value.length - 1] === '!important') {\n cssRule.style.setProperty(prop, cssValue, 'important');\n return true;\n }\n }\n\n cssRule.style.setProperty(prop, cssValue);\n } catch (err) {\n // IE may throw if property is unknown.\n return false;\n }\n return true;\n}\n\n/**\n * Remove a style property.\n */\nfunction removeProperty(cssRule, prop) {\n try {\n cssRule.style.removeProperty(prop);\n } catch (err) {\n (0, _warning2['default'])(false, '[JSS] DOMException \"%s\" was thrown. Tried to remove property \"%s\".', err.message, prop);\n }\n}\n\nvar CSSRuleTypes = {\n STYLE_RULE: 1,\n KEYFRAMES_RULE: 7\n\n /**\n * Get the CSS Rule key.\n */\n\n};var getKey = function () {\n var extractKey = function extractKey(cssText) {\n var from = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n return cssText.substr(from, cssText.indexOf('{') - 1);\n };\n\n return function (cssRule) {\n if (cssRule.type === CSSRuleTypes.STYLE_RULE) return cssRule.selectorText;\n if (cssRule.type === CSSRuleTypes.KEYFRAMES_RULE) {\n var name = cssRule.name;\n\n if (name) return '@keyframes ' + name;\n\n // There is no rule.name in the following browsers:\n // - IE 9\n // - Safari 7.1.8\n // - Mobile Safari 9.0.0\n var cssText = cssRule.cssText;\n\n return '@' + extractKey(cssText, cssText.indexOf('keyframes'));\n }\n\n // Conditionals.\n return extractKey(cssRule.cssText);\n };\n}();\n\n/**\n * Set the selector.\n */\nfunction setSelector(cssRule, selectorText) {\n cssRule.selectorText = selectorText;\n\n // Return false if setter was not successful.\n // Currently works in chrome only.\n return cssRule.selectorText === selectorText;\n}\n\n/**\n * Gets the `)) + ("`" + (`head` + "`")))) + (((` element upon the first call and caches it.\n */\nvar getHead = memoize(function () {\n return document.head || document.getElementsByTagName('head')[0];\n});\n\n/**\n * Gets a map of rule keys, where the property is an unescaped key and value\n * is a potentially escaped one.\n * It is used to identify CSS rules and the corresponding JSS rules. As an identifier\n * for CSSStyleRule we normally use ` + "`") + (`selectorText` + ("`" + `. Though if original selector text\n * contains escaped code points e.g. `))) + (("`" + (`:not(#\\\\20)` + "`")) + (`, CSSOM will compile it to ` + ("`" + `:not(# )`))))) + (((("`" + `\n * and so CSS rule's `) + ("`" + (`selectorText` + "`"))) + ((` won't match JSS rule selector.\n *\n * https://www.w3.org/International/questions/qa-escapes#cssescapes\n */\nvar getUnescapedKeysMap = function () {\n var style = void 0;\n var isAttached = false;\n\n return function (rules) {\n var map = {};\n // https://github.com/facebook/flow/issues/2696\n if (!style) style = document.createElement('style');\n for (var i = 0; i < rules.length; i++) {\n var rule = rules[i];\n if (!(rule instanceof _StyleRule2['default'])) continue;\n var selector = rule.selector;\n // Only unescape selector over CSSOM if it contains a back slash.\n\n if (selector && selector.indexOf('\\\\') !== -1) {\n // Lazilly attach when needed.\n if (!isAttached) {\n getHead().appendChild(style);\n isAttached = true;\n }\n style.textContent = selector + ' {}';\n var _style = style,\n sheet = _style.sheet;\n\n if (sheet) {\n var cssRules = sheet.cssRules;\n\n if (cssRules) map[cssRules[0].selectorText] = rule.key;\n }\n }\n }\n if (isAttached) {\n getHead().removeChild(style);\n isAttached = false;\n }\n return map;\n };\n}();\n\n/**\n * Find attached sheet with an index higher than the passed one.\n */\nfunction findHigherSheet(registry, options) {\n for (var i = 0; i < registry.length; i++) {\n var sheet = registry[i];\n if (sheet.attached && sheet.options.index > options.index && sheet.options.insertionPoint === options.insertionPoint) {\n return sheet;\n }\n }\n return null;\n}\n\n/**\n * Find attached sheet with the highest index.\n */\nfunction findHighestSheet(registry, options) {\n for (var i = registry.length - 1; i >= 0; i--) {\n var sheet = registry[i];\n if (sheet.attached && sheet.options.insertionPoint === options.insertionPoint) {\n return sheet;\n }\n }\n return null;\n}\n\n/**\n * Find a comment with \"jss\" inside.\n */\nfunction findCommentNode(text) {\n var head = getHead();\n for (var i = 0; i < head.childNodes.length; i++) {\n var node = head.childNodes[i];\n if (node.nodeType === 8 && node.nodeValue.trim() === text) {\n return node;\n }\n }\n return null;\n}\n\n/**\n * Find a node before which we can insert the sheet.\n */\nfunction findPrevNode(options) {\n var registry = _sheets2['default'].registry;\n\n\n if (registry.length > 0) {\n // Try to insert before the next higher sheet.\n var sheet = findHigherSheet(registry, options);\n if (sheet) return sheet.renderer.element;\n\n // Otherwise insert after the last attached.\n sheet = findHighestSheet(registry, options);\n if (sheet) return sheet.renderer.element.nextElementSibling;\n }\n\n // Try to find a comment placeholder if registry is empty.\n var insertionPoint = options.insertionPoint;\n\n if (insertionPoint && typeof insertionPoint === 'string') {\n var comment = findCommentNode(insertionPoint);\n if (comment) return comment.nextSibling;\n // If user specifies an insertion point and it can't be found in the document -\n // bad specificity issues may appear.\n (0, _warning2['default'])(insertionPoint === 'jss', '[JSS] Insertion point \"%s\" not found.', insertionPoint);\n }\n\n return null;\n}\n\n/**\n * Insert style element into the DOM.\n */\nfunction insertStyle(style, options) {\n var insertionPoint = options.insertionPoint;\n\n var prevNode = findPrevNode(options);\n\n if (prevNode) {\n var parentNode = prevNode.parentNode;\n\n if (parentNode) parentNode.insertBefore(style, prevNode);\n return;\n }\n\n // Works with iframes and any node types.\n if (insertionPoint && typeof insertionPoint.nodeType === 'number') {\n // https://stackoverflow.com/questions/41328728/force-casting-in-flow\n var insertionPointElement = insertionPoint;\n var _parentNode = insertionPointElement.parentNode;\n\n if (_parentNode) _parentNode.insertBefore(style, insertionPointElement.nextSibling);else (0, _warning2['default'])(false, '[JSS] Insertion point is not in the DOM.');\n return;\n }\n\n getHead().insertBefore(style, prevNode);\n}\n\n/**\n * Read jss nonce setting from the page if the user has set it.\n */\nvar getNonce = memoize(function () {\n var node = document.querySelector('meta[property=\"csp-nonce\"]');\n return node ? node.getAttribute('content') : null;\n});\n\nvar DomRenderer = function () {\n function DomRenderer(sheet) {\n _classCallCheck(this, DomRenderer);\n\n this.getPropertyValue = getPropertyValue;\n this.setProperty = setProperty;\n this.removeProperty = removeProperty;\n this.setSelector = setSelector;\n this.getKey = getKey;\n this.getUnescapedKeysMap = getUnescapedKeysMap;\n this.hasInsertedRules = false;\n\n // There is no sheet when the renderer is used from a standalone StyleRule.\n if (sheet) _sheets2['default'].add(sheet);\n\n this.sheet = sheet;\n\n var _ref = this.sheet ? this.sheet.options : {},\n media = _ref.media,\n meta = _ref.meta,\n element = _ref.element;\n\n this.element = element || document.createElement('style');\n this.element.setAttribute('data-jss', '');\n if (media) this.element.setAttribute('media', media);\n if (meta) this.element.setAttribute('data-meta', meta);\n var nonce = getNonce();\n if (nonce) this.element.setAttribute('nonce', nonce);\n }\n\n /**\n * Insert style element into render tree.\n */\n\n\n // HTMLStyleElement needs fixing https://github.com/facebook/flow/issues/2696\n\n\n _createClass(DomRenderer, [{\n key: 'attach',\n value: function attach() {\n // In the case the element node is external and it is already in the DOM.\n if (this.element.parentNode || !this.sheet) return;\n\n // When rules are inserted using ` + ("`" + `insertRule`)) + ("`" + (` API, after ` + "`")))) + (((`sheet.detach().attach()` + "`") + (`\n // browsers remove those rules.\n // TODO figure out if its a bug and if it is known.\n // Workaround is to redeploy the sheet before attaching as a string.\n if (this.hasInsertedRules) {\n this.deploy();\n this.hasInsertedRules = false;\n }\n\n insertStyle(this.element, this.sheet.options);\n }\n\n /**\n * Remove style element from render tree.\n */\n\n }, {\n key: 'detach',\n value: function detach() {\n this.element.parentNode.removeChild(this.element);\n }\n\n /**\n * Inject CSS string into element.\n */\n\n }, {\n key: 'deploy',\n value: function deploy() {\n if (!this.sheet) return;\n this.element.textContent = '\\n' + this.sheet.toString() + '\\n';\n }\n\n /**\n * Insert a rule into element.\n */\n\n }, {\n key: 'insertRule',\n value: function insertRule(rule, index) {\n var sheet = this.element.sheet;\n var cssRules = sheet.cssRules;\n\n var str = rule.toString();\n if (!index) index = cssRules.length;\n\n if (!str) return false;\n\n try {\n sheet.insertRule(str, index);\n } catch (err) {\n (0, _warning2['default'])(false, '[JSS] Can not insert an unsupported rule \\n\\r%s', rule);\n return false;\n }\n this.hasInsertedRules = true;\n\n return cssRules[index];\n }\n\n /**\n * Delete a rule.\n */\n\n }, {\n key: 'deleteRule',\n value: function deleteRule(cssRule) {\n var sheet = this.element.sheet;\n\n var index = this.indexOf(cssRule);\n if (index === -1) return false;\n sheet.deleteRule(index);\n return true;\n }\n\n /**\n * Get index of a CSS Rule.\n */\n\n }, {\n key: 'indexOf',\n value: function indexOf(cssRule) {\n var cssRules = this.element.sheet.cssRules;\n\n for (var _index = 0; _index < cssRules.length; _index++) {\n if (cssRule === cssRules[_index]) return _index;\n }\n return -1;\n }\n\n /**\n * Generate a new CSS rule and replace the existing one.\n */\n\n }, {\n key: 'replaceRule',\n value: function replaceRule(cssRule, rule) {\n var index = this.indexOf(cssRule);\n var newCssRule = this.insertRule(rule, index);\n this.element.sheet.deleteRule(index);\n return newCssRule;\n }\n\n /**\n * Get all rules elements.\n */\n\n }, {\n key: 'getRules',\n value: function getRules() {\n return this.element.sheet.cssRules;\n }\n }]);\n\n return DomRenderer;\n}();\n\nexports['default'] = DomRenderer;", + "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _warning = require('warning');\n\nvar _warning2 = _interopRequireDefault(_warning);\n\nvar _sheets = require('../sheets');\n\nvar _sheets2 = _interopRequireDefault(_sheets);\n\nvar _StyleRule = require('../rules/StyleRule');\n\nvar _StyleRule2 = _interopRequireDefault(_StyleRule);\n\nvar _toCssValue = require('../utils/toCssValue');\n\nvar _toCssValue2 = _interopRequireDefault(_toCssValue);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * Cache the value from the first time a function is called.\n */\nvar memoize = function memoize(fn) {\n var value = void 0;\n return function () {\n if (!value) value = fn();\n return value;\n };\n};\n\n/**\n * Get a style property value.\n */\nfunction getPropertyValue(cssRule, prop) {\n try {\n return cssRule.style.getPropertyValue(prop);\n } catch (err) {\n // IE may throw if property is unknown.\n return '';\n }\n}\n\n/**\n * Set a style property.\n */\nfunction setProperty(cssRule, prop, value) {\n try {\n var cssValue = value;\n\n if (Array.isArray(value)) {\n cssValue = (0, _toCssValue2['default'])(value, true);\n\n if (value[value.length - 1] === '!important') {\n cssRule.style.setProperty(prop, cssValue, 'important');\n return true;\n }\n }\n\n cssRule.style.setProperty(prop, cssValue);\n } catch (err) {\n // IE may throw if property is unknown.\n return false;\n }\n return true;\n}\n\n/**\n * Remove a style property.\n */\nfunction removeProperty(cssRule, prop) {\n try {\n cssRule.style.removeProperty(prop);\n } catch (err) {\n (0, _warning2['default'])(false, '[JSS] DOMException \"%s\" was thrown. Tried to remove property \"%s\".', err.message, prop);\n }\n}\n\nvar CSSRuleTypes = {\n STYLE_RULE: 1,\n KEYFRAMES_RULE: 7\n\n /**\n * Get the CSS Rule key.\n */\n\n};var getKey = function () {\n var extractKey = function extractKey(cssText) {\n var from = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n return cssText.substr(from, cssText.indexOf('{') - 1);\n };\n\n return function (cssRule) {\n if (cssRule.type === CSSRuleTypes.STYLE_RULE) return cssRule.selectorText;\n if (cssRule.type === CSSRuleTypes.KEYFRAMES_RULE) {\n var name = cssRule.name;\n\n if (name) return '@keyframes ' + name;\n\n // There is no rule.name in the following browsers:\n // - IE 9\n // - Safari 7.1.8\n // - Mobile Safari 9.0.0\n var cssText = cssRule.cssText;\n\n return '@' + extractKey(cssText, cssText.indexOf('keyframes'));\n }\n\n // Conditionals.\n return extractKey(cssRule.cssText);\n };\n}();\n\n/**\n * Set the selector.\n */\nfunction setSelector(cssRule, selectorText) {\n cssRule.selectorText = selectorText;\n\n // Return false if setter was not successful.\n // Currently works in chrome only.\n return cssRule.selectorText === selectorText;\n}\n\n/**\n * Gets the ` + "`")) + (`head` + ("`" + ` element upon the first call and caches it.\n */\nvar getHead = memoize(function () {\n return document.head || document.getElementsByTagName('head')[0];\n});\n\n/**\n * Gets a map of rule keys, where the property is an unescaped key and value\n * is a potentially escaped one.\n * It is used to identify CSS rules and the corresponding JSS rules. As an identifier\n * for CSSStyleRule we normally use `))) + (("`" + (`selectorText` + "`")) + ((`. Though if original selector text\n * contains escaped code points e.g. ` + "`") + (`:not(#\\\\20)` + "`"))))))) + ((((((`, CSSOM will compile it to ` + ("`" + `:not(# )`)) + ("`" + (`\n * and so CSS rule's ` + "`"))) + ((`selectorText` + ("`" + ` won't match JSS rule selector.\n *\n * https://www.w3.org/International/questions/qa-escapes#cssescapes\n */\nvar getUnescapedKeysMap = function () {\n var style = void 0;\n var isAttached = false;\n\n return function (rules) {\n var map = {};\n // https://github.com/facebook/flow/issues/2696\n if (!style) style = document.createElement('style');\n for (var i = 0; i < rules.length; i++) {\n var rule = rules[i];\n if (!(rule instanceof _StyleRule2['default'])) continue;\n var selector = rule.selector;\n // Only unescape selector over CSSOM if it contains a back slash.\n\n if (selector && selector.indexOf('\\\\') !== -1) {\n // Lazilly attach when needed.\n if (!isAttached) {\n getHead().appendChild(style);\n isAttached = true;\n }\n style.textContent = selector + ' {}';\n var _style = style,\n sheet = _style.sheet;\n\n if (sheet) {\n var cssRules = sheet.cssRules;\n\n if (cssRules) map[cssRules[0].selectorText] = rule.key;\n }\n }\n }\n if (isAttached) {\n getHead().removeChild(style);\n isAttached = false;\n }\n return map;\n };\n}();\n\n/**\n * Find attached sheet with an index higher than the passed one.\n */\nfunction findHigherSheet(registry, options) {\n for (var i = 0; i < registry.length; i++) {\n var sheet = registry[i];\n if (sheet.attached && sheet.options.index > options.index && sheet.options.insertionPoint === options.insertionPoint) {\n return sheet;\n }\n }\n return null;\n}\n\n/**\n * Find attached sheet with the highest index.\n */\nfunction findHighestSheet(registry, options) {\n for (var i = registry.length - 1; i >= 0; i--) {\n var sheet = registry[i];\n if (sheet.attached && sheet.options.insertionPoint === options.insertionPoint) {\n return sheet;\n }\n }\n return null;\n}\n\n/**\n * Find a comment with \"jss\" inside.\n */\nfunction findCommentNode(text) {\n var head = getHead();\n for (var i = 0; i < head.childNodes.length; i++) {\n var node = head.childNodes[i];\n if (node.nodeType === 8 && node.nodeValue.trim() === text) {\n return node;\n }\n }\n return null;\n}\n\n/**\n * Find a node before which we can insert the sheet.\n */\nfunction findPrevNode(options) {\n var registry = _sheets2['default'].registry;\n\n\n if (registry.length > 0) {\n // Try to insert before the next higher sheet.\n var sheet = findHigherSheet(registry, options);\n if (sheet) return sheet.renderer.element;\n\n // Otherwise insert after the last attached.\n sheet = findHighestSheet(registry, options);\n if (sheet) return sheet.renderer.element.nextElementSibling;\n }\n\n // Try to find a comment placeholder if registry is empty.\n var insertionPoint = options.insertionPoint;\n\n if (insertionPoint && typeof insertionPoint === 'string') {\n var comment = findCommentNode(insertionPoint);\n if (comment) return comment.nextSibling;\n // If user specifies an insertion point and it can't be found in the document -\n // bad specificity issues may appear.\n (0, _warning2['default'])(insertionPoint === 'jss', '[JSS] Insertion point \"%s\" not found.', insertionPoint);\n }\n\n return null;\n}\n\n/**\n * Insert style element into the DOM.\n */\nfunction insertStyle(style, options) {\n var insertionPoint = options.insertionPoint;\n\n var prevNode = findPrevNode(options);\n\n if (prevNode) {\n var parentNode = prevNode.parentNode;\n\n if (parentNode) parentNode.insertBefore(style, prevNode);\n return;\n }\n\n // Works with iframes and any node types.\n if (insertionPoint && typeof insertionPoint.nodeType === 'number') {\n // https://stackoverflow.com/questions/41328728/force-casting-in-flow\n var insertionPointElement = insertionPoint;\n var _parentNode = insertionPointElement.parentNode;\n\n if (_parentNode) _parentNode.insertBefore(style, insertionPointElement.nextSibling);else (0, _warning2['default'])(false, '[JSS] Insertion point is not in the DOM.');\n return;\n }\n\n getHead().insertBefore(style, prevNode);\n}\n\n/**\n * Read jss nonce setting from the page if the user has set it.\n */\nvar getNonce = memoize(function () {\n var node = document.querySelector('meta[property=\"csp-nonce\"]');\n return node ? node.getAttribute('content') : null;\n});\n\nvar DomRenderer = function () {\n function DomRenderer(sheet) {\n _classCallCheck(this, DomRenderer);\n\n this.getPropertyValue = getPropertyValue;\n this.setProperty = setProperty;\n this.removeProperty = removeProperty;\n this.setSelector = setSelector;\n this.getKey = getKey;\n this.getUnescapedKeysMap = getUnescapedKeysMap;\n this.hasInsertedRules = false;\n\n // There is no sheet when the renderer is used from a standalone StyleRule.\n if (sheet) _sheets2['default'].add(sheet);\n\n this.sheet = sheet;\n\n var _ref = this.sheet ? this.sheet.options : {},\n media = _ref.media,\n meta = _ref.meta,\n element = _ref.element;\n\n this.element = element || document.createElement('style');\n this.element.setAttribute('data-jss', '');\n if (media) this.element.setAttribute('media', media);\n if (meta) this.element.setAttribute('data-meta', meta);\n var nonce = getNonce();\n if (nonce) this.element.setAttribute('nonce', nonce);\n }\n\n /**\n * Insert style element into render tree.\n */\n\n\n // HTMLStyleElement needs fixing https://github.com/facebook/flow/issues/2696\n\n\n _createClass(DomRenderer, [{\n key: 'attach',\n value: function attach() {\n // In the case the element node is external and it is already in the DOM.\n if (this.element.parentNode || !this.sheet) return;\n\n // When rules are inserted using `)) + ("`" + (`insertRule` + "`")))) + (((` API, after ` + ("`" + `sheet.detach().attach()`)) + ("`" + (`\n // browsers remove those rules.\n // TODO figure out if its a bug and if it is known.\n // Workaround is to redeploy the sheet before attaching as a string.\n if (this.hasInsertedRules) {\n this.deploy();\n this.hasInsertedRules = false;\n }\n\n insertStyle(this.element, this.sheet.options);\n }\n\n /**\n * Remove style element from render tree.\n */\n\n }, {\n key: 'detach',\n value: function detach() {\n this.element.parentNode.removeChild(this.element);\n }\n\n /**\n * Inject CSS string into element.\n */\n\n }, {\n key: 'deploy',\n value: function deploy() {\n if (!this.sheet) return;\n this.element.textContent = '\\n' + this.sheet.toString() + '\\n';\n }\n\n /**\n * Insert a rule into element.\n */\n\n }, {\n key: 'insertRule',\n value: function insertRule(rule, index) {\n var sheet = this.element.sheet;\n var cssRules = sheet.cssRules;\n\n var str = rule.toString();\n if (!index) index = cssRules.length;\n\n if (!str) return false;\n\n try {\n sheet.insertRule(str, index);\n } catch (err) {\n (0, _warning2['default'])(false, '[JSS] Can not insert an unsupported rule \\n\\r%s', rule);\n return false;\n }\n this.hasInsertedRules = true;\n\n return cssRules[index];\n }\n\n /**\n * Delete a rule.\n */\n\n }, {\n key: 'deleteRule',\n value: function deleteRule(cssRule) {\n var sheet = this.element.sheet;\n\n var index = this.indexOf(cssRule);\n if (index === -1) return false;\n sheet.deleteRule(index);\n return true;\n }\n\n /**\n * Get index of a CSS Rule.\n */\n\n }, {\n key: 'indexOf',\n value: function indexOf(cssRule) {\n var cssRules = this.element.sheet.cssRules;\n\n for (var _index = 0; _index < cssRules.length; _index++) {\n if (cssRule === cssRules[_index]) return _index;\n }\n return -1;\n }\n\n /**\n * Generate a new CSS rule and replace the existing one.\n */\n\n }, {\n key: 'replaceRule',\n value: function replaceRule(cssRule, rule) {\n var index = this.indexOf(cssRule);\n var newCssRule = this.insertRule(rule, index);\n this.element.sheet.deleteRule(index);\n return newCssRule;\n }\n\n /**\n * Get all rules elements.\n */\n\n }, {\n key: 'getRules',\n value: function getRules() {\n return this.element.sheet.cssRules;\n }\n }]);\n\n return DomRenderer;\n}();\n\nexports['default'] = DomRenderer;", "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/* eslint-disable class-methods-use-this */\n\n/**\n * Rendering backend to do nothing in nodejs.\n */\nvar VirtualRenderer = function () {\n function VirtualRenderer() {\n _classCallCheck(this, VirtualRenderer);\n }\n\n _createClass(VirtualRenderer, [{\n key: 'setProperty',\n value: function setProperty() {\n return true;\n }\n }, {\n key: 'getPropertyValue',\n value: function getPropertyValue() {\n return '';\n }\n }, {\n key: 'removeProperty',\n value: function removeProperty() {}\n }, {\n key: 'setSelector',\n value: function setSelector() {\n return true;\n }\n }, {\n key: 'getKey',\n value: function getKey() {\n return '';\n }\n }, {\n key: 'attach',\n value: function attach() {}\n }, {\n key: 'detach',\n value: function detach() {}\n }, {\n key: 'deploy',\n value: function deploy() {}\n }, {\n key: 'insertRule',\n value: function insertRule() {\n return false;\n }\n }, {\n key: 'deleteRule',\n value: function deleteRule() {\n return true;\n }\n }, {\n key: 'replaceRule',\n value: function replaceRule() {\n return false;\n }\n }, {\n key: 'getRules',\n value: function getRules() {}\n }, {\n key: 'indexOf',\n value: function indexOf() {\n return -1;\n }\n }]);\n\n return VirtualRenderer;\n}();\n\nexports['default'] = VirtualRenderer;", "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _RuleList = require('../RuleList');\n\nvar _RuleList2 = _interopRequireDefault(_RuleList);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * Conditional rule for @media, @supports\n */\nvar ConditionalRule = function () {\n function ConditionalRule(key, styles, options) {\n _classCallCheck(this, ConditionalRule);\n\n this.type = 'conditional';\n this.isProcessed = false;\n\n this.key = key;\n this.options = options;\n this.rules = new _RuleList2['default'](_extends({}, options, { parent: this }));\n\n for (var name in styles) {\n this.rules.add(name, styles[name]);\n }\n\n this.rules.process();\n }\n\n /**\n * Get a rule.\n */\n\n\n _createClass(ConditionalRule, [{\n key: 'getRule',\n value: function getRule(name) {\n return this.rules.get(name);\n }\n\n /**\n * Get index of a rule.\n */\n\n }, {\n key: 'indexOf',\n value: function indexOf(rule) {\n return this.rules.indexOf(rule);\n }\n\n /**\n * Create and register rule, run plugins.\n */\n\n }, {\n key: 'addRule',\n value: function addRule(name, style, options) {\n var rule = this.rules.add(name, style, options);\n this.options.jss.plugins.onProcessRule(rule);\n return rule;\n }\n\n /**\n * Generates a CSS string.\n */\n\n }, {\n key: 'toString',\n value: function toString() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { indent: 1 };\n\n var inner = this.rules.toString(options);\n return inner ? this.key + ' {\\n' + inner + '\\n}' : '';\n }\n }]);\n\n return ConditionalRule;\n}();\n\nexports['default'] = ConditionalRule;", "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _toCss = require('../utils/toCss');\n\nvar _toCss2 = _interopRequireDefault(_toCss);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar FontFaceRule = function () {\n function FontFaceRule(key, style, options) {\n _classCallCheck(this, FontFaceRule);\n\n this.type = 'font-face';\n this.isProcessed = false;\n\n this.key = key;\n this.style = style;\n this.options = options;\n }\n\n /**\n * Generates a CSS string.\n */\n\n\n _createClass(FontFaceRule, [{\n key: 'toString',\n value: function toString(options) {\n if (Array.isArray(this.style)) {\n var str = '';\n for (var index = 0; index < this.style.length; index++) {\n str += (0, _toCss2['default'])(this.key, this.style[index]);\n if (this.style[index + 1]) str += '\\n';\n }\n return str;\n }\n\n return (0, _toCss2['default'])(this.key, this.style, options);\n }\n }]);\n\n return FontFaceRule;\n}();\n\nexports['default'] = FontFaceRule;", "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _RuleList = require('../RuleList');\n\nvar _RuleList2 = _interopRequireDefault(_RuleList);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * Rule for @keyframes\n */\nvar KeyframesRule = function () {\n function KeyframesRule(key, frames, options) {\n _classCallCheck(this, KeyframesRule);\n\n this.type = 'keyframes';\n this.isProcessed = false;\n\n this.key = key;\n this.options = options;\n this.rules = new _RuleList2['default'](_extends({}, options, { parent: this }));\n\n for (var name in frames) {\n this.rules.add(name, frames[name], _extends({}, this.options, {\n parent: this,\n selector: name\n }));\n }\n\n this.rules.process();\n }\n\n /**\n * Generates a CSS string.\n */\n\n\n _createClass(KeyframesRule, [{\n key: 'toString',\n value: function toString() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { indent: 1 };\n\n var inner = this.rules.toString(options);\n if (inner) inner += '\\n';\n return this.key + ' {\\n' + inner + '}';\n }\n }]);\n\n return KeyframesRule;\n}();\n\nexports['default'] = KeyframesRule;", "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar SimpleRule = function () {\n function SimpleRule(key, value, options) {\n _classCallCheck(this, SimpleRule);\n\n this.type = 'simple';\n this.isProcessed = false;\n\n this.key = key;\n this.value = value;\n this.options = options;\n }\n\n /**\n * Generates a CSS string.\n */\n // eslint-disable-next-line no-unused-vars\n\n\n _createClass(SimpleRule, [{\n key: 'toString',\n value: function toString(options) {\n if (Array.isArray(this.value)) {\n var str = '';\n for (var index = 0; index < this.value.length; index++) {\n str += this.key + ' ' + this.value[index] + ';';\n if (this.value[index + 1]) str += '\\n';\n }\n return str;\n }\n\n return this.key + ' ' + this.value + ';';\n }\n }]);\n\n return SimpleRule;\n}();\n\nexports['default'] = SimpleRule;", - "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _warning = require('warning');\n\nvar _warning2 = _interopRequireDefault(_warning);\n\nvar _toCss = require('../utils/toCss');\n\nvar _toCss2 = _interopRequireDefault(_toCss);\n\nvar _toCssValue = require('../utils/toCssValue');\n\nvar _toCssValue2 = _interopRequireDefault(_toCssValue);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar StyleRule = function () {\n function StyleRule(key, style, options) {\n _classCallCheck(this, StyleRule);\n\n this.type = 'style';\n this.isProcessed = false;\n var sheet = options.sheet,\n Renderer = options.Renderer,\n selector = options.selector;\n\n this.key = key;\n this.options = options;\n this.style = style;\n if (selector) this.selectorText = selector;\n this.renderer = sheet ? sheet.renderer : new Renderer();\n }\n\n /**\n * Set selector string.\n * Attention: use this with caution. Most browsers didn't implement\n * selectorText setter, so this may result in rerendering of entire Style Sheet.\n */\n\n\n _createClass(StyleRule, [{\n key: 'prop',\n\n\n /**\n * Get or set a style property.\n */\n value: function prop(name, value) {\n // It's a getter.\n if (value === undefined) return this.style[name];\n\n // Don't do anything if the value has not changed.\n if (this.style[name] === value) return this;\n\n value = this.options.jss.plugins.onChangeValue(value, name, this);\n\n var isEmpty = value == null || value === false;\n var isDefined = name in this.style;\n\n // Value is empty and wasn't defined before.\n if (isEmpty && !isDefined) return this;\n\n // We are going to remove this value.\n var remove = isEmpty && isDefined;\n\n if (remove) delete this.style[name];else this.style[name] = value;\n\n // Renderable is defined if StyleSheet option ` + ("`" + `link`))) + (("`" + (` is true.\n if (this.renderable) {\n if (remove) this.renderer.removeProperty(this.renderable, name);else this.renderer.setProperty(this.renderable, name, value);\n return this;\n }\n\n var sheet = this.options.sheet;\n\n if (sheet && sheet.attached) {\n (0, _warning2['default'])(false, 'Rule is not linked. Missing sheet option \"link: true\".');\n }\n return this;\n }\n\n /**\n * Apply rule to an element inline.\n */\n\n }, {\n key: 'applyTo',\n value: function applyTo(renderable) {\n var json = this.toJSON();\n for (var prop in json) {\n this.renderer.setProperty(renderable, prop, json[prop]);\n }return this;\n }\n\n /**\n * Returns JSON representation of the rule.\n * Fallbacks are not supported.\n * Useful for inline styles.\n */\n\n }, {\n key: 'toJSON',\n value: function toJSON() {\n var json = {};\n for (var prop in this.style) {\n var value = this.style[prop];\n if ((typeof value === 'undefined' ? 'undefined' : _typeof(value)) !== 'object') json[prop] = value;else if (Array.isArray(value)) json[prop] = (0, _toCssValue2['default'])(value);\n }\n return json;\n }\n\n /**\n * Generates a CSS string.\n */\n\n }, {\n key: 'toString',\n value: function toString(options) {\n var sheet = this.options.sheet;\n\n var link = sheet ? sheet.options.link : false;\n var opts = link ? _extends({}, options, { allowEmpty: true }) : options;\n return (0, _toCss2['default'])(this.selector, this.style, opts);\n }\n }, {\n key: 'selector',\n set: function set(selector) {\n if (selector === this.selectorText) return;\n\n this.selectorText = selector;\n\n if (!this.renderable) return;\n\n var hasChanged = this.renderer.setSelector(this.renderable, selector);\n\n // If selector setter is not implemented, rerender the rule.\n if (!hasChanged && this.renderable) {\n var renderable = this.renderer.replaceRule(this.renderable, this);\n if (renderable) this.renderable = renderable;\n }\n }\n\n /**\n * Get selector string.\n */\n ,\n get: function get() {\n return this.selectorText;\n }\n }]);\n\n return StyleRule;\n}();\n\nexports['default'] = StyleRule;", + "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _warning = require('warning');\n\nvar _warning2 = _interopRequireDefault(_warning);\n\nvar _toCss = require('../utils/toCss');\n\nvar _toCss2 = _interopRequireDefault(_toCss);\n\nvar _toCssValue = require('../utils/toCssValue');\n\nvar _toCssValue2 = _interopRequireDefault(_toCssValue);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar StyleRule = function () {\n function StyleRule(key, style, options) {\n _classCallCheck(this, StyleRule);\n\n this.type = 'style';\n this.isProcessed = false;\n var sheet = options.sheet,\n Renderer = options.Renderer,\n selector = options.selector;\n\n this.key = key;\n this.options = options;\n this.style = style;\n if (selector) this.selectorText = selector;\n this.renderer = sheet ? sheet.renderer : new Renderer();\n }\n\n /**\n * Set selector string.\n * Attention: use this with caution. Most browsers didn't implement\n * selectorText setter, so this may result in rerendering of entire Style Sheet.\n */\n\n\n _createClass(StyleRule, [{\n key: 'prop',\n\n\n /**\n * Get or set a style property.\n */\n value: function prop(name, value) {\n // It's a getter.\n if (value === undefined) return this.style[name];\n\n // Don't do anything if the value has not changed.\n if (this.style[name] === value) return this;\n\n value = this.options.jss.plugins.onChangeValue(value, name, this);\n\n var isEmpty = value == null || value === false;\n var isDefined = name in this.style;\n\n // Value is empty and wasn't defined before.\n if (isEmpty && !isDefined) return this;\n\n // We are going to remove this value.\n var remove = isEmpty && isDefined;\n\n if (remove) delete this.style[name];else this.style[name] = value;\n\n // Renderable is defined if StyleSheet option ` + "`"))) + ((`link` + ("`" + ` is true.\n if (this.renderable) {\n if (remove) this.renderer.removeProperty(this.renderable, name);else this.renderer.setProperty(this.renderable, name, value);\n return this;\n }\n\n var sheet = this.options.sheet;\n\n if (sheet && sheet.attached) {\n (0, _warning2['default'])(false, 'Rule is not linked. Missing sheet option \"link: true\".');\n }\n return this;\n }\n\n /**\n * Apply rule to an element inline.\n */\n\n }, {\n key: 'applyTo',\n value: function applyTo(renderable) {\n var json = this.toJSON();\n for (var prop in json) {\n this.renderer.setProperty(renderable, prop, json[prop]);\n }return this;\n }\n\n /**\n * Returns JSON representation of the rule.\n * Fallbacks are not supported.\n * Useful for inline styles.\n */\n\n }, {\n key: 'toJSON',\n value: function toJSON() {\n var json = {};\n for (var prop in this.style) {\n var value = this.style[prop];\n if ((typeof value === 'undefined' ? 'undefined' : _typeof(value)) !== 'object') json[prop] = value;else if (Array.isArray(value)) json[prop] = (0, _toCssValue2['default'])(value);\n }\n return json;\n }\n\n /**\n * Generates a CSS string.\n */\n\n }, {\n key: 'toString',\n value: function toString(options) {\n var sheet = this.options.sheet;\n\n var link = sheet ? sheet.options.link : false;\n var opts = link ? _extends({}, options, { allowEmpty: true }) : options;\n return (0, _toCss2['default'])(this.selector, this.style, opts);\n }\n }, {\n key: 'selector',\n set: function set(selector) {\n if (selector === this.selectorText) return;\n\n this.selectorText = selector;\n\n if (!this.renderable) return;\n\n var hasChanged = this.renderer.setSelector(this.renderable, selector);\n\n // If selector setter is not implemented, rerender the rule.\n if (!hasChanged && this.renderable) {\n var renderable = this.renderer.replaceRule(this.renderable, this);\n if (renderable) this.renderable = renderable;\n }\n }\n\n /**\n * Get selector string.\n */\n ,\n get: function get() {\n return this.selectorText;\n }\n }]);\n\n return StyleRule;\n}();\n\nexports['default'] = StyleRule;", "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _toCss = require('../utils/toCss');\n\nvar _toCss2 = _interopRequireDefault(_toCss);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar ViewportRule = function () {\n function ViewportRule(key, style, options) {\n _classCallCheck(this, ViewportRule);\n\n this.type = 'viewport';\n this.isProcessed = false;\n\n this.key = key;\n this.style = style;\n this.options = options;\n }\n\n /**\n * Generates a CSS string.\n */\n\n\n _createClass(ViewportRule, [{\n key: 'toString',\n value: function toString(options) {\n return (0, _toCss2['default'])(this.key, this.style, options);\n }\n }]);\n\n return ViewportRule;\n}();\n\nexports['default'] = ViewportRule;", "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _SheetsRegistry = require('./SheetsRegistry');\n\nvar _SheetsRegistry2 = _interopRequireDefault(_SheetsRegistry);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\n/**\n * This is a global sheets registry. Only DomRenderer will add sheets to it.\n * On the server one should use an own SheetsRegistry instance and add the\n * sheets to it, because you need to make sure to create a new registry for\n * each request in order to not leak sheets across requests.\n */\nexports['default'] = new _SheetsRegistry2['default']();", "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nexports['default'] = cloneStyle;\n\nvar _isObservable = require('./isObservable');\n\nvar _isObservable2 = _interopRequireDefault(_isObservable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nvar isArray = Array.isArray;\nfunction cloneStyle(style) {\n // Support empty values in case user ends up with them by accident.\n if (style == null) return style;\n\n // Support string value for SimpleRule.\n var typeOfStyle = typeof style === 'undefined' ? 'undefined' : _typeof(style);\n\n if (typeOfStyle === 'string' || typeOfStyle === 'number' || typeOfStyle === 'function') {\n return style;\n }\n\n // Support array for FontFaceRule.\n if (isArray(style)) return style.map(cloneStyle);\n\n // Support Observable styles. Observables are immutable, so we don't need to\n // copy them.\n if ((0, _isObservable2['default'])(style)) return style;\n\n var newStyle = {};\n for (var name in style) {\n var value = style[name];\n if ((typeof value === 'undefined' ? 'undefined' : _typeof(value)) === 'object') {\n newStyle[name] = cloneStyle(value);\n continue;\n }\n newStyle[name] = value;\n }\n\n return newStyle;\n}", "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _warning = require('warning');\n\nvar _warning2 = _interopRequireDefault(_warning);\n\nvar _StyleSheet = require('../StyleSheet');\n\nvar _StyleSheet2 = _interopRequireDefault(_StyleSheet);\n\nvar _moduleId = require('./moduleId');\n\nvar _moduleId2 = _interopRequireDefault(_moduleId);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nvar maxRules = 1e10;\n\n\nvar env = process.env.NODE_ENV;\n\n/**\n * Returns a function which generates unique class names based on counters.\n * When new generator function is created, rule counter is reseted.\n * We need to reset the rule counter for SSR for each request.\n */\n\nexports['default'] = function () {\n var ruleCounter = 0;\n var defaultPrefix = env === 'production' ? 'c' : '';\n\n return function (rule, sheet) {\n ruleCounter += 1;\n\n if (ruleCounter > maxRules) {\n (0, _warning2['default'])(false, '[JSS] You might have a memory leak. Rule counter is at %s.', ruleCounter);\n }\n\n var prefix = defaultPrefix;\n var jssId = '';\n\n if (sheet) {\n prefix = sheet.options.classNamePrefix || defaultPrefix;\n if (sheet.options.jss.id != null) jssId += sheet.options.jss.id;\n }\n\n if (env === 'production') {\n return '' + prefix + _moduleId2['default'] + jssId + ruleCounter;\n }\n\n return prefix + rule.key + '-' + _moduleId2['default'] + (jssId && '-' + jssId) + '-' + ruleCounter;\n };\n};", "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports['default'] = createRule;\n\nvar _warning = require('warning');\n\nvar _warning2 = _interopRequireDefault(_warning);\n\nvar _StyleRule = require('../rules/StyleRule');\n\nvar _StyleRule2 = _interopRequireDefault(_StyleRule);\n\nvar _cloneStyle = require('../utils/cloneStyle');\n\nvar _cloneStyle2 = _interopRequireDefault(_cloneStyle);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\n/**\n * Create a rule instance.\n */\nfunction createRule() {\n var name = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'unnamed';\n var decl = arguments[1];\n var options = arguments[2];\n var jss = options.jss;\n\n var declCopy = (0, _cloneStyle2['default'])(decl);\n\n var rule = jss.plugins.onCreateRule(name, declCopy, options);\n if (rule) return rule;\n\n // It is an at-rule and it has no instance.\n if (name[0] === '@') {\n (0, _warning2['default'])(false, '[JSS] Unknown at-rule %s', name);\n }\n\n return new _StyleRule2['default'](name, declCopy, options);\n}", - "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nvar CSS = global.CSS;\n\nvar env = process.env.NODE_ENV;\n\nvar escapeRegex = /([[\\].#*$><+~=|^:(),\"'` + "`")) + (`])/g;\n\nexports['default'] = function (str) {\n // We don't need to escape it in production, because we are not using user's\n // input for selectors, we are generating a valid selector.\n if (env === 'production') return str;\n\n if (!CSS || !CSS.escape) {\n return str.replace(escapeRegex, '\\\\$1');\n }\n\n return CSS.escape(str);\n};", + "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nvar CSS = global.CSS;\n\nvar env = process.env.NODE_ENV;\n\nvar escapeRegex = /([[\\].#*$><+~=|^:(),\"'`)) + ("`" + (`])/g;\n\nexports['default'] = function (str) {\n // We don't need to escape it in production, because we are not using user's\n // input for selectors, we are generating a valid selector.\n if (env === 'production') return str;\n\n if (!CSS || !CSS.escape) {\n return str.replace(escapeRegex, '\\\\$1');\n }\n\n return CSS.escape(str);\n};", "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nexports['default'] = getDynamicStyles;\n/**\n * Extracts a styles object with only props that contain function values.\n */\nfunction getDynamicStyles(styles) {\n var to = null;\n\n for (var key in styles) {\n var value = styles[key];\n var type = typeof value === 'undefined' ? 'undefined' : _typeof(value);\n\n if (type === 'function') {\n if (!to) to = {};\n to[key] = value;\n } else if (type === 'object' && value !== null && !Array.isArray(value)) {\n var extracted = getDynamicStyles(value);\n if (extracted) {\n if (!to) to = {};\n to[key] = extracted;\n }\n }\n }\n\n return to;\n}", "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _symbolObservable = require('symbol-observable');\n\nvar _symbolObservable2 = _interopRequireDefault(_symbolObservable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nexports['default'] = function (value) {\n return value && value[_symbolObservable2['default']] && value === value[_symbolObservable2['default']]();\n};", "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = linkRule;\n/**\n * Link rule with CSSStyleRule and nested rules with corresponding nested cssRules if both exists.\n */\nfunction linkRule(rule, cssRule) {\n rule.renderable = cssRule;\n if (rule.rules && cssRule.cssRules) rule.rules.link(cssRule.cssRules);\n}", "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nvar ns = '2f1acc6c3a606b082e5eef5e54414ffb';\nif (global[ns] == null) global[ns] = 0;\n\n// Bundle may contain multiple JSS versions at the same time. In order to identify\n// the current version with just one short number and use it for classes generation\n// we use a counter. Also it is more accurate, because user can manually reevaluate\n// the module.\nexports['default'] = global[ns]++;", "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports['default'] = toCss;\n\nvar _toCssValue = require('./toCssValue');\n\nvar _toCssValue2 = _interopRequireDefault(_toCssValue);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\n/**\n * Indent a string.\n * http://jsperf.com/array-join-vs-for\n */\nfunction indentStr(str, indent) {\n var result = '';\n for (var index = 0; index < indent; index++) {\n result += ' ';\n }return result + str;\n}\n\n/**\n * Converts a Rule to CSS string.\n */\n\nfunction toCss(selector, style) {\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n var result = '';\n\n if (!style) return result;\n\n var _options$indent = options.indent,\n indent = _options$indent === undefined ? 0 : _options$indent;\n var fallbacks = style.fallbacks;\n\n\n indent++;\n\n // Apply fallbacks first.\n if (fallbacks) {\n // Array syntax {fallbacks: [{prop: value}]}\n if (Array.isArray(fallbacks)) {\n for (var index = 0; index < fallbacks.length; index++) {\n var fallback = fallbacks[index];\n for (var prop in fallback) {\n var value = fallback[prop];\n if (value != null) {\n result += '\\n' + indentStr(prop + ': ' + (0, _toCssValue2['default'])(value) + ';', indent);\n }\n }\n }\n } else {\n // Object syntax {fallbacks: {prop: value}}\n for (var _prop in fallbacks) {\n var _value = fallbacks[_prop];\n if (_value != null) {\n result += '\\n' + indentStr(_prop + ': ' + (0, _toCssValue2['default'])(_value) + ';', indent);\n }\n }\n }\n }\n\n for (var _prop2 in style) {\n var _value2 = style[_prop2];\n if (_value2 != null && _prop2 !== 'fallbacks') {\n result += '\\n' + indentStr(_prop2 + ': ' + (0, _toCssValue2['default'])(_value2) + ';', indent);\n }\n }\n\n // Allow empty style in this case, because properties will be added dynamically.\n if (!result && !options.allowEmpty) return result;\n\n indent--;\n result = indentStr(selector + ' {' + result + '\\n', indent) + indentStr('}', indent);\n\n return result;\n}", - "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports['default'] = toCssValue;\nvar join = function join(value, by) {\n var result = '';\n for (var i = 0; i < value.length; i++) {\n // Remove !important from the value, it will be readded later.\n if (value[i] === '!important') break;\n if (result) result += by;\n result += value[i];\n }\n return result;\n};\n\n/**\n * Converts array values to string.\n *\n * ` + ("`" + `margin: [['5px', '10px']]`)))))) + ((((("`" + ` > `) + ("`" + (`margin: 5px 10px;` + "`"))) + ((`\n * ` + ("`" + `border: ['1px', '2px']`)) + ("`" + (` > ` + "`")))) + (((`border: 1px, 2px;` + "`") + (`\n * ` + ("`" + `margin: [['5px', '10px'], '!important']`))) + (("`" + (` > ` + "`")) + (`margin: 5px 10px !important;` + ("`" + `\n * `))))) + (((("`" + `color: ['red', !important]`) + ("`" + (` > ` + "`"))) + ((`color: red !important;` + ("`" + `\n */\nfunction toCssValue(value) {\n var ignoreImportant = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n if (!Array.isArray(value)) return value;\n\n var cssValue = '';\n\n // Support space separated values via `)) + ("`" + (`[['5px', '10px']]` + "`")))) + (((`.\n if (Array.isArray(value[0])) {\n for (var i = 0; i < value.length; i++) {\n if (value[i] === '!important') break;\n if (cssValue) cssValue += ', ';\n cssValue += join(value[i], ' ');\n }\n } else cssValue = join(value, ', ');\n\n // Add !important, because it was ignored.\n if (!ignoreImportant && value[value.length - 1] === '!important') {\n cssValue += ' !important';\n }\n\n return cssValue;\n}", - "/**\n * Copyright 2014-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n */\n\n'use strict';\n\n/**\n * Similar to invariant but only logs a warning if the condition is not met.\n * This can be used to log issues in development environments in critical\n * paths. Removing the logging code for production environments will keep the\n * same logic and follow the same code paths.\n */\n\nvar warning = function() {};\n\nif (process.env.NODE_ENV !== 'production') {\n warning = function(condition, format, args) {\n var len = arguments.length;\n args = new Array(len > 2 ? len - 2 : 0);\n for (var key = 2; key < len; key++) {\n args[key - 2] = arguments[key];\n }\n if (format === undefined) {\n throw new Error(\n '` + ("`" + `warning(condition, format, ...args)`)) + ("`" + (` requires a warning ' +\n 'message argument'\n );\n }\n\n if (format.length < 10 || (/^[s\\W]*$/).test(format)) {\n throw new Error(\n 'The warning format should be able to uniquely identify this ' +\n 'warning. Please, use a more descriptive format than: ' + format\n );\n }\n\n if (!condition) {\n var argIndex = 0;\n var message = 'Warning: ' +\n format.replace(/%s/g, function() {\n return args[argIndex++];\n });\n if (typeof console !== 'undefined') {\n console.error(message);\n }\n try {\n // This error was thrown as a convenience so that you can use this stack\n // to find the callsite that caused this warning to fire.\n throw new Error(message);\n } catch(x) {}\n }\n };\n}\n\nmodule.exports = warning;\n", - "/**\n * lodash (Custom Build) \n * Build: ` + "`"))) + ((`lodash modularize exports=\"npm\" -o ./` + ("`" + `\n * Copyright jQuery Foundation and other contributors \n * Released under MIT license \n * Based on Underscore.js 1.8.3 \n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as the `)) + ("`" + (`TypeError` + "`"))))))))) + ((((((((` message for \"Functions\" methods. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/** Used as references for various ` + "`") + (`Number` + ("`" + ` constants. */\nvar NAN = 0 / 0;\n\n/** `))) + (("`" + (`Object#toString` + "`")) + (` result references. */\nvar symbolTag = '[object Symbol]';\n\n/** Used to match leading and trailing whitespace. */\nvar reTrim = /^\\s+|\\s+$/g;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on ` + ("`" + `root`)))) + ((("`" + `. */\nvar freeParseInt = parseInt;\n\n/** Detect free variable `) + ("`" + (`global` + "`"))) + ((` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n/** Detect free variable ` + ("`" + `self`)) + ("`" + (`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [` + "`"))))) + ((((`toStringTag` + "`") + (`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/* Built-in method references for those with the same name as other ` + ("`" + `lodash`))) + (("`" + (` methods. */\nvar nativeMax = Math.max,\n nativeMin = Math.min;\n\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n * console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\nvar now = function() {\n return root.Date.now();\n};\n\n/**\n * Creates a debounced function that delays invoking ` + "`")) + (`func` + ("`" + ` until after `)))) + ((("`" + `wait`) + ("`" + (`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a ` + "`"))) + ((`cancel` + ("`" + ` method to cancel\n * delayed `)) + ("`" + (`func` + "`")))))) + (((((` invocations and a ` + "`") + (`flush` + ("`" + ` method to immediately invoke them.\n * Provide `))) + (("`" + (`options` + "`")) + (` to indicate whether ` + ("`" + `func`)))) + ((("`" + ` should be invoked on the\n * leading and/or trailing edge of the `) + ("`" + (`wait` + "`"))) + ((` timeout. The ` + ("`" + `func`)) + ("`" + (` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last ` + "`"))))) + ((((`func` + "`") + (`\n * invocation.\n *\n * **Note:** If ` + ("`" + `leading`))) + (("`" + (` and ` + "`")) + (`trailing` + ("`" + ` options are `)))) + ((("`" + `true`) + ("`" + (`, ` + "`"))) + ((`func` + ("`" + ` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the `)) + ("`" + (`wait` + "`"))))))) + ((((((` timeout.\n *\n * If ` + "`") + (`wait` + ("`" + ` is `))) + (("`" + (`0` + "`")) + (` and ` + ("`" + `leading`)))) + ((("`" + ` is `) + ("`" + (`false` + "`"))) + ((`, ` + ("`" + `func`)) + ("`" + (` invocation is deferred\n * until to the next tick, similar to ` + "`"))))) + ((((`setTimeout` + "`") + (` with a timeout of ` + ("`" + `0`))) + (("`" + (`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between ` + "`")) + (`_.debounce` + ("`" + ` and `)))) + ((("`" + `_.throttle`) + ("`" + (`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n * Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n * The maximum time ` + "`"))) + ((`func` + ("`" + ` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `)) + ("`" + (`sendMail` + "`")))))) + (((((` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n * 'leading': true,\n * 'trailing': false\n * }));\n *\n * // Ensure ` + "`") + (`batchLog` + ("`" + ` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\nfunction debounce(func, wait, options) {\n var lastArgs,\n lastThis,\n maxWait,\n result,\n timerId,\n lastCallTime,\n lastInvokeTime = 0,\n leading = false,\n maxing = false,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n wait = toNumber(wait) || 0;\n if (isObject(options)) {\n leading = !!options.leading;\n maxing = 'maxWait' in options;\n maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n\n function invokeFunc(time) {\n var args = lastArgs,\n thisArg = lastThis;\n\n lastArgs = lastThis = undefined;\n lastInvokeTime = time;\n result = func.apply(thisArg, args);\n return result;\n }\n\n function leadingEdge(time) {\n // Reset any `))) + (("`" + (`maxWait` + "`")) + (` timer.\n lastInvokeTime = time;\n // Start the timer for the trailing edge.\n timerId = setTimeout(timerExpired, wait);\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result;\n }\n\n function remainingWait(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime,\n result = wait - timeSinceLastCall;\n\n return maxing ? nativeMin(result, maxWait - timeSinceLastInvoke) : result;\n }\n\n function shouldInvoke(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime;\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the ` + ("`" + `maxWait`)))) + ((("`" + ` limit.\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n }\n\n function timerExpired() {\n var time = now();\n if (shouldInvoke(time)) {\n return trailingEdge(time);\n }\n // Restart the timer.\n timerId = setTimeout(timerExpired, remainingWait(time));\n }\n\n function trailingEdge(time) {\n timerId = undefined;\n\n // Only invoke if we have `) + ("`" + (`lastArgs` + "`"))) + ((` which means ` + ("`" + `func`)) + ("`" + (` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time);\n }\n lastArgs = lastThis = undefined;\n return result;\n }\n\n function cancel() {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n }\n lastInvokeTime = 0;\n lastArgs = lastCallTime = lastThis = timerId = undefined;\n }\n\n function flush() {\n return timerId === undefined ? result : trailingEdge(now());\n }\n\n function debounced() {\n var time = now(),\n isInvoking = shouldInvoke(time);\n\n lastArgs = arguments;\n lastThis = this;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime);\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n timerId = setTimeout(timerExpired, wait);\n return invokeFunc(lastCallTime);\n }\n }\n if (timerId === undefined) {\n timerId = setTimeout(timerExpired, wait);\n }\n return result;\n }\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n}\n\n/**\n * Checks if ` + "`"))))) + ((((`value` + "`") + (` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of ` + ("`" + `Object`))) + (("`" + (`. (e.g. arrays, functions, objects, regexes, ` + "`")) + (`new Number(0)` + ("`" + `, and `)))) + ((("`" + (`new String('')` + "`")) + (`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns ` + ("`" + `true`))) + (("`" + (` if ` + "`")) + (`value` + ("`" + ` is an object, else `)))))))) + ((((((("`" + `false`) + ("`" + (`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if ` + "`"))) + ((`value` + ("`" + ` is object-like. A value is object-like if it's not `)) + ("`" + (`null` + "`")))) + (((`\n * and has a ` + "`") + (`typeof` + ("`" + ` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `))) + (("`" + (`true` + "`")) + (` if ` + ("`" + `value`))))) + (((("`" + ` is object-like, else `) + ("`" + (`false` + "`"))) + ((`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\n/**\n * Checks if ` + ("`" + `value`)) + ("`" + (` is classified as a ` + "`")))) + (((`Symbol` + "`") + (` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns ` + ("`" + `true`))) + (("`" + (` if ` + "`")) + (`value` + ("`" + ` is a symbol, else `)))))) + ((((("`" + `false`) + ("`" + (`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && objectToString.call(value) == symbolTag);\n}\n\n/**\n * Converts ` + "`"))) + ((`value` + ("`" + ` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = value.replace(reTrim, '');\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = debounce;\n", - "/**\n * lodash (Custom Build) \n * Build: `)) + ("`" + (`lodash modularize exports=\"npm\" -o ./` + "`")))) + (((`\n * Copyright jQuery Foundation and other contributors \n * Released under MIT license \n * Based on Underscore.js 1.8.3 \n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as the ` + "`") + (`TypeError` + ("`" + ` message for \"Functions\" methods. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/** Used as references for various `))) + (("`" + (`Number` + "`")) + (` constants. */\nvar NAN = 0 / 0;\n\n/** ` + ("`" + `Object#toString`))))) + (((("`" + ` result references. */\nvar symbolTag = '[object Symbol]';\n\n/** Used to match leading and trailing whitespace. */\nvar reTrim = /^\\s+|\\s+$/g;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `) + ("`" + (`root` + "`"))) + ((`. */\nvar freeParseInt = parseInt;\n\n/** Detect free variable ` + ("`" + `global`)) + ("`" + (` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n/** Detect free variable ` + "`")))) + (((`self` + ("`" + `. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`)) + ("`" + (`toStringTag` + "`"))) + ((`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/* Built-in method references for those with the same name as other ` + ("`" + `lodash`)) + ("`" + (` methods. */\nvar nativeMax = Math.max,\n nativeMin = Math.min;\n\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n * console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\nvar now = function() {\n return root.Date.now();\n};\n\n/**\n * Creates a debounced function that delays invoking ` + "`"))))))) + ((((((`func` + "`") + (` until after ` + ("`" + `wait`))) + (("`" + (`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a ` + "`")) + (`cancel` + ("`" + ` method to cancel\n * delayed `)))) + ((("`" + `func`) + ("`" + (` invocations and a ` + "`"))) + ((`flush` + ("`" + ` method to immediately invoke them.\n * Provide `)) + ("`" + (`options` + "`"))))) + ((((` to indicate whether ` + "`") + (`func` + ("`" + ` should be invoked on the\n * leading and/or trailing edge of the `))) + (("`" + (`wait` + "`")) + (` timeout. The ` + ("`" + `func`)))) + ((("`" + ` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last `) + ("`" + (`func` + "`"))) + ((`\n * invocation.\n *\n * **Note:** If ` + ("`" + `leading`)) + ("`" + (` and ` + "`")))))) + (((((`trailing` + "`") + (` options are ` + ("`" + `true`))) + (("`" + (`, ` + "`")) + (`func` + ("`" + ` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the `)))) + ((("`" + `wait`) + ("`" + (` timeout.\n *\n * If ` + "`"))) + ((`wait` + ("`" + ` is `)) + ("`" + (`0` + "`"))))) + ((((` and ` + "`") + (`leading` + ("`" + ` is `))) + (("`" + (`false` + "`")) + (`, ` + ("`" + `func`)))) + ((("`" + (` invocation is deferred\n * until to the next tick, similar to ` + "`")) + (`setTimeout` + ("`" + ` with a timeout of `))) + (("`" + (`0` + "`")) + (`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between ` + ("`" + `_.debounce`)))))))))) + ((((((((("`" + ` and `) + ("`" + (`_.throttle` + "`"))) + ((`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n * Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n * The maximum time ` + ("`" + `func`)) + ("`" + (` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke ` + "`")))) + (((`sendMail` + "`") + (` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n * 'leading': true,\n * 'trailing': false\n * }));\n *\n * // Ensure ` + ("`" + `batchLog`))) + (("`" + (` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\nfunction debounce(func, wait, options) {\n var lastArgs,\n lastThis,\n maxWait,\n result,\n timerId,\n lastCallTime,\n lastInvokeTime = 0,\n leading = false,\n maxing = false,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n wait = toNumber(wait) || 0;\n if (isObject(options)) {\n leading = !!options.leading;\n maxing = 'maxWait' in options;\n maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n\n function invokeFunc(time) {\n var args = lastArgs,\n thisArg = lastThis;\n\n lastArgs = lastThis = undefined;\n lastInvokeTime = time;\n result = func.apply(thisArg, args);\n return result;\n }\n\n function leadingEdge(time) {\n // Reset any ` + "`")) + (`maxWait` + ("`" + ` timer.\n lastInvokeTime = time;\n // Start the timer for the trailing edge.\n timerId = setTimeout(timerExpired, wait);\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result;\n }\n\n function remainingWait(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime,\n result = wait - timeSinceLastCall;\n\n return maxing ? nativeMin(result, maxWait - timeSinceLastInvoke) : result;\n }\n\n function shouldInvoke(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime;\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the `))))) + (((("`" + `maxWait`) + ("`" + (` limit.\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n }\n\n function timerExpired() {\n var time = now();\n if (shouldInvoke(time)) {\n return trailingEdge(time);\n }\n // Restart the timer.\n timerId = setTimeout(timerExpired, remainingWait(time));\n }\n\n function trailingEdge(time) {\n timerId = undefined;\n\n // Only invoke if we have ` + "`"))) + ((`lastArgs` + ("`" + ` which means `)) + ("`" + (`func` + "`")))) + (((` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time);\n }\n lastArgs = lastThis = undefined;\n return result;\n }\n\n function cancel() {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n }\n lastInvokeTime = 0;\n lastArgs = lastCallTime = lastThis = timerId = undefined;\n }\n\n function flush() {\n return timerId === undefined ? result : trailingEdge(now());\n }\n\n function debounced() {\n var time = now(),\n isInvoking = shouldInvoke(time);\n\n lastArgs = arguments;\n lastThis = this;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime);\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n timerId = setTimeout(timerExpired, wait);\n return invokeFunc(lastCallTime);\n }\n }\n if (timerId === undefined) {\n timerId = setTimeout(timerExpired, wait);\n }\n return result;\n }\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n}\n\n/**\n * Creates a throttled function that only invokes ` + "`") + (`func` + ("`" + ` at most once per\n * every `))) + (("`" + (`wait` + "`")) + (` milliseconds. The throttled function comes with a ` + ("`" + `cancel`)))))) + ((((("`" + `\n * method to cancel delayed `) + ("`" + (`func` + "`"))) + ((` invocations and a ` + ("`" + `flush`)) + ("`" + (` method to\n * immediately invoke them. Provide ` + "`")))) + (((`options` + "`") + (` to indicate whether ` + ("`" + `func`))) + (("`" + (`\n * should be invoked on the leading and/or trailing edge of the ` + "`")) + (`wait` + ("`" + `\n * timeout. The `))))) + (((("`" + `func`) + ("`" + (` is invoked with the last arguments provided to the\n * throttled function. Subsequent calls to the throttled function return the\n * result of the last ` + "`"))) + ((`func` + ("`" + ` invocation.\n *\n * **Note:** If `)) + ("`" + (`leading` + "`")))) + (((` and ` + "`") + (`trailing` + ("`" + ` options are `))) + (("`" + (`true` + "`")) + (`, ` + ("`" + `func`))))))) + (((((("`" + ` is\n * invoked on the trailing edge of the timeout only if the throttled function\n * is invoked more than once during the `) + ("`" + (`wait` + "`"))) + ((` timeout.\n *\n * If ` + ("`" + `wait`)) + ("`" + (` is ` + "`")))) + (((`0` + "`") + (` and ` + ("`" + `leading`))) + (("`" + (` is ` + "`")) + (`false` + ("`" + `, `))))) + (((("`" + `func`) + ("`" + (` invocation is deferred\n * until to the next tick, similar to ` + "`"))) + ((`setTimeout` + ("`" + ` with a timeout of `)) + ("`" + (`0` + "`")))) + (((`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between ` + "`") + (`_.throttle` + ("`" + ` and `))) + (("`" + (`_.debounce` + "`")) + (`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to throttle.\n * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=true]\n * Specify invoking on the leading edge of the timeout.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new throttled function.\n * @example\n *\n * // Avoid excessively updating the position while scrolling.\n * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\n *\n * // Invoke ` + ("`" + `renewToken`)))))) + ((((("`" + ` when the click event is fired, but not more than once every 5 minutes.\n * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });\n * jQuery(element).on('click', throttled);\n *\n * // Cancel the trailing throttled invocation.\n * jQuery(window).on('popstate', throttled.cancel);\n */\nfunction throttle(func, wait, options) {\n var leading = true,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n if (isObject(options)) {\n leading = 'leading' in options ? !!options.leading : leading;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n return debounce(func, wait, {\n 'leading': leading,\n 'maxWait': wait,\n 'trailing': trailing\n });\n}\n\n/**\n * Checks if `) + ("`" + (`value` + "`"))) + ((` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of ` + ("`" + `Object`)) + ("`" + (`. (e.g. arrays, functions, objects, regexes, ` + "`")))) + (((`new Number(0)` + "`") + (`, and ` + ("`" + `new String('')`))) + (("`" + (`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns ` + "`")) + (`true` + ("`" + ` if `))))) + (((("`" + `value`) + ("`" + (` is an object, else ` + "`"))) + ((`false` + ("`" + `.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `)) + ("`" + (`value` + "`")))) + (((` is object-like. A value is object-like if it's not ` + ("`" + `null`)) + ("`" + (`\n * and has a ` + "`"))) + ((`typeof` + ("`" + ` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `)) + ("`" + (`true` + "`")))))))) + (((((((` if ` + "`") + (`value` + ("`" + ` is object-like, else `))) + (("`" + (`false` + "`")) + (`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\n/**\n * Checks if ` + ("`" + `value`)))) + ((("`" + ` is classified as a `) + ("`" + (`Symbol` + "`"))) + ((` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns ` + ("`" + `true`)) + ("`" + (` if ` + "`"))))) + ((((`value` + "`") + (` is a symbol, else ` + ("`" + `false`))) + (("`" + (`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && objectToString.call(value) == symbolTag);\n}\n\n/**\n * Converts ` + "`")) + (`value` + ("`" + ` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = value.replace(reTrim, '');\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = throttle;\n", + "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports['default'] = toCssValue;\nvar join = function join(value, by) {\n var result = '';\n for (var i = 0; i < value.length; i++) {\n // Remove !important from the value, it will be readded later.\n if (value[i] === '!important') break;\n if (result) result += by;\n result += value[i];\n }\n return result;\n};\n\n/**\n * Converts array values to string.\n *\n * ` + "`"))))) + ((((`margin: [['5px', '10px']]` + ("`" + ` > `)) + ("`" + (`margin: 5px 10px;` + "`"))) + ((`\n * ` + ("`" + `border: ['1px', '2px']`)) + ("`" + (` > ` + "`")))) + (((`border: 1px, 2px;` + ("`" + `\n * `)) + ("`" + (`margin: [['5px', '10px'], '!important']` + "`"))) + ((` > ` + ("`" + `margin: 5px 10px !important;`)) + (("`" + `\n * `) + ("`" + `color: ['red', !important]`)))))) + ((((("`" + (` > ` + "`")) + (`color: red !important;` + ("`" + `\n */\nfunction toCssValue(value) {\n var ignoreImportant = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n if (!Array.isArray(value)) return value;\n\n var cssValue = '';\n\n // Support space separated values via `))) + (("`" + (`[['5px', '10px']]` + "`")) + (`.\n if (Array.isArray(value[0])) {\n for (var i = 0; i < value.length; i++) {\n if (value[i] === '!important') break;\n if (cssValue) cssValue += ', ';\n cssValue += join(value[i], ' ');\n }\n } else cssValue = join(value, ', ');\n\n // Add !important, because it was ignored.\n if (!ignoreImportant && value[value.length - 1] === '!important') {\n cssValue += ' !important';\n }\n\n return cssValue;\n}", + "/**\n * Copyright 2014-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n */\n\n'use strict';\n\n/**\n * Similar to invariant but only logs a warning if the condition is not met.\n * This can be used to log issues in development environments in critical\n * paths. Removing the logging code for production environments will keep the\n * same logic and follow the same code paths.\n */\n\nvar warning = function() {};\n\nif (process.env.NODE_ENV !== 'production') {\n warning = function(condition, format, args) {\n var len = arguments.length;\n args = new Array(len > 2 ? len - 2 : 0);\n for (var key = 2; key < len; key++) {\n args[key - 2] = arguments[key];\n }\n if (format === undefined) {\n throw new Error(\n '` + ("`" + `warning(condition, format, ...args)`)))) + ((("`" + (` requires a warning ' +\n 'message argument'\n );\n }\n\n if (format.length < 10 || (/^[s\\W]*$/).test(format)) {\n throw new Error(\n 'The warning format should be able to uniquely identify this ' +\n 'warning. Please, use a more descriptive format than: ' + format\n );\n }\n\n if (!condition) {\n var argIndex = 0;\n var message = 'Warning: ' +\n format.replace(/%s/g, function() {\n return args[argIndex++];\n });\n if (typeof console !== 'undefined') {\n console.error(message);\n }\n try {\n // This error was thrown as a convenience so that you can use this stack\n // to find the callsite that caused this warning to fire.\n throw new Error(message);\n } catch(x) {}\n }\n };\n}\n\nmodule.exports = warning;\n", + "/**\n * lodash (Custom Build) \n * Build: ` + "`")) + (`lodash modularize exports=\"npm\" -o ./` + ("`" + `\n * Copyright jQuery Foundation and other contributors \n * Released under MIT license \n * Based on Underscore.js 1.8.3 \n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as the `))) + (("`" + (`TypeError` + "`")) + ((` message for \"Functions\" methods. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/** Used as references for various ` + "`") + (`Number` + "`"))))) + ((((` constants. */\nvar NAN = 0 / 0;\n\n/** ` + ("`" + `Object#toString`)) + ("`" + (` result references. */\nvar symbolTag = '[object Symbol]';\n\n/** Used to match leading and trailing whitespace. */\nvar reTrim = /^\\s+|\\s+$/g;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on ` + "`"))) + ((`root` + ("`" + `. */\nvar freeParseInt = parseInt;\n\n/** Detect free variable `)) + ("`" + (`global` + "`")))) + (((` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n/** Detect free variable ` + ("`" + `self`)) + ("`" + (`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [` + "`"))) + ((`toStringTag` + ("`" + `](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/* Built-in method references for those with the same name as other `)) + (("`" + `lodash`) + ("`" + ` methods. */\nvar nativeMax = Math.max,\n nativeMin = Math.min;\n\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n * console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\nvar now = function() {\n return root.Date.now();\n};\n\n/**\n * Creates a debounced function that delays invoking `)))))))) + ((((((("`" + (`func` + "`")) + (` until after ` + ("`" + `wait`))) + (("`" + (`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a ` + "`")) + (`cancel` + ("`" + ` method to cancel\n * delayed `)))) + ((("`" + (`func` + "`")) + (` invocations and a ` + ("`" + `flush`))) + (("`" + (` method to immediately invoke them.\n * Provide ` + "`")) + (`options` + ("`" + ` to indicate whether `))))) + (((("`" + (`func` + "`")) + (` should be invoked on the\n * leading and/or trailing edge of the ` + ("`" + `wait`))) + (("`" + (` timeout. The ` + "`")) + (`func` + ("`" + ` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last `)))) + ((("`" + (`func` + "`")) + (`\n * invocation.\n *\n * **Note:** If ` + ("`" + `leading`))) + (("`" + (` and ` + "`")) + ((`trailing` + "`") + (` options are ` + "`")))))) + (((((`true` + ("`" + `, `)) + ("`" + (`func` + "`"))) + ((` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the ` + ("`" + `wait`)) + ("`" + (` timeout.\n *\n * If ` + "`")))) + (((`wait` + ("`" + ` is `)) + ("`" + (`0` + "`"))) + ((` and ` + ("`" + `leading`)) + (("`" + ` is `) + ("`" + `false`))))) + (((("`" + (`, ` + "`")) + (`func` + ("`" + ` invocation is deferred\n * until to the next tick, similar to `))) + (("`" + (`setTimeout` + "`")) + (` with a timeout of ` + ("`" + `0`)))) + ((("`" + (`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between ` + "`")) + (`_.debounce` + ("`" + ` and `))) + (("`" + (`_.throttle` + "`")) + ((`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n * Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n * The maximum time ` + "`") + (`func` + "`"))))))) + ((((((` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke ` + ("`" + `sendMail`)) + ("`" + (` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n * 'leading': true,\n * 'trailing': false\n * }));\n *\n * // Ensure ` + "`"))) + ((`batchLog` + ("`" + ` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\nfunction debounce(func, wait, options) {\n var lastArgs,\n lastThis,\n maxWait,\n result,\n timerId,\n lastCallTime,\n lastInvokeTime = 0,\n leading = false,\n maxing = false,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n wait = toNumber(wait) || 0;\n if (isObject(options)) {\n leading = !!options.leading;\n maxing = 'maxWait' in options;\n maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n\n function invokeFunc(time) {\n var args = lastArgs,\n thisArg = lastThis;\n\n lastArgs = lastThis = undefined;\n lastInvokeTime = time;\n result = func.apply(thisArg, args);\n return result;\n }\n\n function leadingEdge(time) {\n // Reset any `)) + ("`" + (`maxWait` + "`")))) + (((` timer.\n lastInvokeTime = time;\n // Start the timer for the trailing edge.\n timerId = setTimeout(timerExpired, wait);\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result;\n }\n\n function remainingWait(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime,\n result = wait - timeSinceLastCall;\n\n return maxing ? nativeMin(result, maxWait - timeSinceLastInvoke) : result;\n }\n\n function shouldInvoke(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime;\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the ` + ("`" + `maxWait`)) + ("`" + (` limit.\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n }\n\n function timerExpired() {\n var time = now();\n if (shouldInvoke(time)) {\n return trailingEdge(time);\n }\n // Restart the timer.\n timerId = setTimeout(timerExpired, remainingWait(time));\n }\n\n function trailingEdge(time) {\n timerId = undefined;\n\n // Only invoke if we have ` + "`"))) + ((`lastArgs` + ("`" + ` which means `)) + (("`" + `func`) + ("`" + ` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time);\n }\n lastArgs = lastThis = undefined;\n return result;\n }\n\n function cancel() {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n }\n lastInvokeTime = 0;\n lastArgs = lastCallTime = lastThis = timerId = undefined;\n }\n\n function flush() {\n return timerId === undefined ? result : trailingEdge(now());\n }\n\n function debounced() {\n var time = now(),\n isInvoking = shouldInvoke(time);\n\n lastArgs = arguments;\n lastThis = this;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime);\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n timerId = setTimeout(timerExpired, wait);\n return invokeFunc(lastCallTime);\n }\n }\n if (timerId === undefined) {\n timerId = setTimeout(timerExpired, wait);\n }\n return result;\n }\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n}\n\n/**\n * Checks if `))))) + (((("`" + (`value` + "`")) + (` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of ` + ("`" + `Object`))) + (("`" + (`. (e.g. arrays, functions, objects, regexes, ` + "`")) + (`new Number(0)` + ("`" + `, and `)))) + ((("`" + (`new String('')` + "`")) + (`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns ` + ("`" + `true`))) + (("`" + (` if ` + "`")) + ((`value` + "`") + (` is an object, else ` + "`")))))) + (((((`false` + ("`" + `.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `)) + ("`" + (`value` + "`"))) + ((` is object-like. A value is object-like if it's not ` + ("`" + `null`)) + ("`" + (`\n * and has a ` + "`")))) + (((`typeof` + ("`" + ` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `)) + ("`" + (`true` + "`"))) + ((` if ` + ("`" + `value`)) + (("`" + ` is object-like, else `) + ("`" + `false`))))) + (((("`" + (`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\n/**\n * Checks if ` + "`")) + (`value` + ("`" + ` is classified as a `))) + (("`" + (`Symbol` + "`")) + (` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns ` + ("`" + `true`)))) + ((("`" + (` if ` + "`")) + (`value` + ("`" + ` is a symbol, else `))) + (("`" + (`false` + "`")) + ((`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && objectToString.call(value) == symbolTag);\n}\n\n/**\n * Converts ` + "`") + (`value` + "`")))))))))) + (((((((((` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = value.replace(reTrim, '');\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = debounce;\n", + "/**\n * lodash (Custom Build) \n * Build: ` + ("`" + `lodash modularize exports=\"npm\" -o ./`)) + ("`" + (`\n * Copyright jQuery Foundation and other contributors \n * Released under MIT license \n * Based on Underscore.js 1.8.3 \n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as the ` + "`"))) + ((`TypeError` + ("`" + ` message for \"Functions\" methods. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/** Used as references for various `)) + ("`" + (`Number` + "`")))) + (((` constants. */\nvar NAN = 0 / 0;\n\n/** ` + ("`" + `Object#toString`)) + ("`" + (` result references. */\nvar symbolTag = '[object Symbol]';\n\n/** Used to match leading and trailing whitespace. */\nvar reTrim = /^\\s+|\\s+$/g;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on ` + "`"))) + ((`root` + ("`" + `. */\nvar freeParseInt = parseInt;\n\n/** Detect free variable `)) + ("`" + (`global` + "`"))))) + ((((` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n/** Detect free variable ` + ("`" + `self`)) + ("`" + (`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [` + "`"))) + ((`toStringTag` + ("`" + `](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/* Built-in method references for those with the same name as other `)) + ("`" + (`lodash` + "`")))) + (((` methods. */\nvar nativeMax = Math.max,\n nativeMin = Math.min;\n\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n * console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\nvar now = function() {\n return root.Date.now();\n};\n\n/**\n * Creates a debounced function that delays invoking ` + ("`" + `func`)) + ("`" + (` until after ` + "`"))) + ((`wait` + ("`" + `\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `)) + (("`" + `cancel`) + ("`" + ` method to cancel\n * delayed `)))))) + ((((("`" + (`func` + "`")) + (` invocations and a ` + ("`" + `flush`))) + (("`" + (` method to immediately invoke them.\n * Provide ` + "`")) + (`options` + ("`" + ` to indicate whether `)))) + ((("`" + (`func` + "`")) + (` should be invoked on the\n * leading and/or trailing edge of the ` + ("`" + `wait`))) + (("`" + (` timeout. The ` + "`")) + ((`func` + "`") + (` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last ` + "`"))))) + ((((`func` + ("`" + `\n * invocation.\n *\n * **Note:** If `)) + ("`" + (`leading` + "`"))) + ((` and ` + ("`" + `trailing`)) + ("`" + (` options are ` + "`")))) + (((`true` + ("`" + `, `)) + ("`" + (`func` + "`"))) + ((` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the ` + ("`" + `wait`)) + (("`" + ` timeout.\n *\n * If `) + ("`" + `wait`))))))) + (((((("`" + (` is ` + "`")) + (`0` + ("`" + ` and `))) + (("`" + (`leading` + "`")) + (` is ` + ("`" + `false`)))) + ((("`" + (`, ` + "`")) + (`func` + ("`" + ` invocation is deferred\n * until to the next tick, similar to `))) + (("`" + (`setTimeout` + "`")) + (` with a timeout of ` + ("`" + `0`))))) + (((("`" + (`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between ` + "`")) + (`_.debounce` + ("`" + ` and `))) + (("`" + (`_.throttle` + "`")) + (`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n * Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n * The maximum time ` + ("`" + `func`)))) + ((("`" + (` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke ` + "`")) + (`sendMail` + ("`" + ` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n * 'leading': true,\n * 'trailing': false\n * }));\n *\n * // Ensure `))) + (("`" + (`batchLog` + "`")) + ((` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\nfunction debounce(func, wait, options) {\n var lastArgs,\n lastThis,\n maxWait,\n result,\n timerId,\n lastCallTime,\n lastInvokeTime = 0,\n leading = false,\n maxing = false,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n wait = toNumber(wait) || 0;\n if (isObject(options)) {\n leading = !!options.leading;\n maxing = 'maxWait' in options;\n maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n\n function invokeFunc(time) {\n var args = lastArgs,\n thisArg = lastThis;\n\n lastArgs = lastThis = undefined;\n lastInvokeTime = time;\n result = func.apply(thisArg, args);\n return result;\n }\n\n function leadingEdge(time) {\n // Reset any ` + "`") + (`maxWait` + "`")))))) + (((((` timer.\n lastInvokeTime = time;\n // Start the timer for the trailing edge.\n timerId = setTimeout(timerExpired, wait);\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result;\n }\n\n function remainingWait(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime,\n result = wait - timeSinceLastCall;\n\n return maxing ? nativeMin(result, maxWait - timeSinceLastInvoke) : result;\n }\n\n function shouldInvoke(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime;\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the ` + ("`" + `maxWait`)) + ("`" + (` limit.\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n }\n\n function timerExpired() {\n var time = now();\n if (shouldInvoke(time)) {\n return trailingEdge(time);\n }\n // Restart the timer.\n timerId = setTimeout(timerExpired, remainingWait(time));\n }\n\n function trailingEdge(time) {\n timerId = undefined;\n\n // Only invoke if we have ` + "`"))) + ((`lastArgs` + ("`" + ` which means `)) + ("`" + (`func` + "`")))) + (((` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time);\n }\n lastArgs = lastThis = undefined;\n return result;\n }\n\n function cancel() {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n }\n lastInvokeTime = 0;\n lastArgs = lastCallTime = lastThis = timerId = undefined;\n }\n\n function flush() {\n return timerId === undefined ? result : trailingEdge(now());\n }\n\n function debounced() {\n var time = now(),\n isInvoking = shouldInvoke(time);\n\n lastArgs = arguments;\n lastThis = this;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime);\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n timerId = setTimeout(timerExpired, wait);\n return invokeFunc(lastCallTime);\n }\n }\n if (timerId === undefined) {\n timerId = setTimeout(timerExpired, wait);\n }\n return result;\n }\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n}\n\n/**\n * Creates a throttled function that only invokes ` + ("`" + `func`)) + ("`" + (` at most once per\n * every ` + "`"))) + ((`wait` + ("`" + ` milliseconds. The throttled function comes with a `)) + (("`" + `cancel`) + ("`" + `\n * method to cancel delayed `))))) + (((("`" + (`func` + "`")) + (` invocations and a ` + ("`" + `flush`))) + (("`" + (` method to\n * immediately invoke them. Provide ` + "`")) + (`options` + ("`" + ` to indicate whether `)))) + ((("`" + (`func` + "`")) + (`\n * should be invoked on the leading and/or trailing edge of the ` + ("`" + `wait`))) + (("`" + (`\n * timeout. The ` + "`")) + ((`func` + "`") + (` is invoked with the last arguments provided to the\n * throttled function. Subsequent calls to the throttled function return the\n * result of the last ` + "`")))))))) + (((((((`func` + ("`" + ` invocation.\n *\n * **Note:** If `)) + ("`" + (`leading` + "`"))) + ((` and ` + ("`" + `trailing`)) + ("`" + (` options are ` + "`")))) + (((`true` + ("`" + `, `)) + ("`" + (`func` + "`"))) + ((` is\n * invoked on the trailing edge of the timeout only if the throttled function\n * is invoked more than once during the ` + ("`" + `wait`)) + ("`" + (` timeout.\n *\n * If ` + "`"))))) + ((((`wait` + ("`" + ` is `)) + ("`" + (`0` + "`"))) + ((` and ` + ("`" + `leading`)) + ("`" + (` is ` + "`")))) + (((`false` + ("`" + `, `)) + ("`" + (`func` + "`"))) + ((` invocation is deferred\n * until to the next tick, similar to ` + ("`" + `setTimeout`)) + (("`" + ` with a timeout of `) + ("`" + `0`)))))) + ((((("`" + (`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between ` + "`")) + (`_.throttle` + ("`" + ` and `))) + (("`" + (`_.debounce` + "`")) + (`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to throttle.\n * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=true]\n * Specify invoking on the leading edge of the timeout.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new throttled function.\n * @example\n *\n * // Avoid excessively updating the position while scrolling.\n * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\n *\n * // Invoke ` + ("`" + `renewToken`)))) + ((("`" + (` when the click event is fired, but not more than once every 5 minutes.\n * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });\n * jQuery(element).on('click', throttled);\n *\n * // Cancel the trailing throttled invocation.\n * jQuery(window).on('popstate', throttled.cancel);\n */\nfunction throttle(func, wait, options) {\n var leading = true,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n if (isObject(options)) {\n leading = 'leading' in options ? !!options.leading : leading;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n return debounce(func, wait, {\n 'leading': leading,\n 'maxWait': wait,\n 'trailing': trailing\n });\n}\n\n/**\n * Checks if ` + "`")) + (`value` + ("`" + ` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `))) + (("`" + (`Object` + "`")) + ((`. (e.g. arrays, functions, objects, regexes, ` + "`") + (`new Number(0)` + "`"))))) + ((((`, and ` + ("`" + `new String('')`)) + ("`" + (`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns ` + "`"))) + ((`true` + ("`" + ` if `)) + ("`" + (`value` + "`")))) + (((` is an object, else ` + ("`" + `false`)) + ("`" + (`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if ` + "`"))) + ((`value` + ("`" + ` is object-like. A value is object-like if it's not `)) + (("`" + `null`) + ("`" + `\n * and has a `))))))) + (((((("`" + (`typeof` + "`")) + (` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns ` + ("`" + `true`))) + (("`" + (` if ` + "`")) + (`value` + ("`" + ` is object-like, else `)))) + ((("`" + (`false` + "`")) + (`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\n/**\n * Checks if ` + ("`" + `value`))) + (("`" + (` is classified as a ` + "`")) + ((`Symbol` + "`") + (` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns ` + "`"))))) + ((((`true` + ("`" + ` if `)) + ("`" + (`value` + "`"))) + ((` is a symbol, else ` + ("`" + `false`)) + ("`" + (`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && objectToString.call(value) == symbolTag);\n}\n\n/**\n * Converts ` + "`")))) + (((`value` + ("`" + ` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = value.replace(reTrim, '');\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = throttle;\n", "var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar DataView = getNative(root, 'DataView');\n\nmodule.exports = DataView;\n", - "var hashClear = require('./_hashClear'),\n hashDelete = require('./_hashDelete'),\n hashGet = require('./_hashGet'),\n hashHas = require('./_hashHas'),\n hashSet = require('./_hashSet');\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `)))) + ((("`" + `Hash`) + ("`" + (`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\nmodule.exports = Hash;\n", - "var listCacheClear = require('./_listCacheClear'),\n listCacheDelete = require('./_listCacheDelete'),\n listCacheGet = require('./_listCacheGet'),\n listCacheHas = require('./_listCacheHas'),\n listCacheSet = require('./_listCacheSet');\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to ` + "`"))) + ((`ListCache` + ("`" + `.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\nmodule.exports = ListCache;\n", + "var hashClear = require('./_hashClear'),\n hashDelete = require('./_hashDelete'),\n hashGet = require('./_hashGet'),\n hashHas = require('./_hashHas'),\n hashSet = require('./_hashSet');\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `)) + ("`" + (`Hash` + "`"))) + ((`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\nmodule.exports = Hash;\n", + "var listCacheClear = require('./_listCacheClear'),\n listCacheDelete = require('./_listCacheDelete'),\n listCacheGet = require('./_listCacheGet'),\n listCacheHas = require('./_listCacheHas'),\n listCacheSet = require('./_listCacheSet');\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to ` + ("`" + `ListCache`)) + (("`" + `.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\nmodule.exports = ListCache;\n", "var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Map = getNative(root, 'Map');\n\nmodule.exports = Map;\n", - "var mapCacheClear = require('./_mapCacheClear'),\n mapCacheDelete = require('./_mapCacheDelete'),\n mapCacheGet = require('./_mapCacheGet'),\n mapCacheHas = require('./_mapCacheHas'),\n mapCacheSet = require('./_mapCacheSet');\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `)) + ("`" + (`MapCache` + "`")))))) + (((((`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\nmodule.exports = MapCache;\n", + "var mapCacheClear = require('./_mapCacheClear'),\n mapCacheDelete = require('./_mapCacheDelete'),\n mapCacheGet = require('./_mapCacheGet'),\n mapCacheHas = require('./_mapCacheHas'),\n mapCacheSet = require('./_mapCacheSet');\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `) + ("`" + `MapCache`)))))) + ((((("`" + (`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\nmodule.exports = MapCache;\n", "var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Promise = getNative(root, 'Promise');\n\nmodule.exports = Promise;\n", "var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Set = getNative(root, 'Set');\n\nmodule.exports = Set;\n", - "var MapCache = require('./_MapCache'),\n setCacheAdd = require('./_setCacheAdd'),\n setCacheHas = require('./_setCacheHas');\n\n/**\n *\n * Creates an array cache object to store unique values.\n *\n * @private\n * @constructor\n * @param {Array} [values] The values to cache.\n */\nfunction SetCache(values) {\n var index = -1,\n length = values == null ? 0 : values.length;\n\n this.__data__ = new MapCache;\n while (++index < length) {\n this.add(values[index]);\n }\n}\n\n// Add methods to ` + "`") + (`SetCache` + ("`" + `.\nSetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\nSetCache.prototype.has = setCacheHas;\n\nmodule.exports = SetCache;\n", + "var MapCache = require('./_MapCache'),\n setCacheAdd = require('./_setCacheAdd'),\n setCacheHas = require('./_setCacheHas');\n\n/**\n *\n * Creates an array cache object to store unique values.\n *\n * @private\n * @constructor\n * @param {Array} [values] The values to cache.\n */\nfunction SetCache(values) {\n var index = -1,\n length = values == null ? 0 : values.length;\n\n this.__data__ = new MapCache;\n while (++index < length) {\n this.add(values[index]);\n }\n}\n\n// Add methods to ` + "`")) + (`SetCache` + ("`" + `.\nSetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\nSetCache.prototype.has = setCacheHas;\n\nmodule.exports = SetCache;\n", "var ListCache = require('./_ListCache'),\n stackClear = require('./_stackClear'),\n stackDelete = require('./_stackDelete'),\n stackGet = require('./_stackGet'),\n stackHas = require('./_stackHas'),\n stackSet = require('./_stackSet');\n\n/**\n * Creates a stack cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Stack(entries) {\n var data = this.__data__ = new ListCache(entries);\n this.size = data.size;\n}\n\n// Add methods to `))) + (("`" + (`Stack` + "`")) + (`.\nStack.prototype.clear = stackClear;\nStack.prototype['delete'] = stackDelete;\nStack.prototype.get = stackGet;\nStack.prototype.has = stackHas;\nStack.prototype.set = stackSet;\n\nmodule.exports = Stack;\n", "var root = require('./_root');\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nmodule.exports = Symbol;\n", "var root = require('./_root');\n\n/** Built-in value references. */\nvar Uint8Array = root.Uint8Array;\n\nmodule.exports = Uint8Array;\n", "var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar WeakMap = getNative(root, 'WeakMap');\n\nmodule.exports = WeakMap;\n", - "/**\n * A faster alternative to ` + ("`" + `Function#apply`)))) + ((("`" + `, this function invokes `) + ("`" + (`func` + "`"))) + ((`\n * with the ` + ("`" + `this`)) + ("`" + (` binding of ` + "`"))))) + ((((`thisArg` + "`") + (` and the arguments of ` + ("`" + `args`))) + (("`" + (`.\n *\n * @private\n * @param {Function} func The function to invoke.\n * @param {*} thisArg The ` + "`")) + (`this` + ("`" + ` binding of `)))) + ((("`" + `func`) + ("`" + (`.\n * @param {Array} args The arguments to invoke ` + "`"))) + ((`func` + ("`" + ` with.\n * @returns {*} Returns the result of `)) + ("`" + (`func` + "`"))))))) + ((((((`.\n */\nfunction apply(func, thisArg, args) {\n switch (args.length) {\n case 0: return func.call(thisArg);\n case 1: return func.call(thisArg, args[0]);\n case 2: return func.call(thisArg, args[0], args[1]);\n case 3: return func.call(thisArg, args[0], args[1], args[2]);\n }\n return func.apply(thisArg, args);\n}\n\nmodule.exports = apply;\n", - "/**\n * A specialized version of ` + "`") + (`_.every` + ("`" + ` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `))) + (("`" + (`true` + "`")) + (` if all elements pass the predicate check,\n * else ` + ("`" + `false`)))) + ((("`" + `.\n */\nfunction arrayEvery(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (!predicate(array[index], index, array)) {\n return false;\n }\n }\n return true;\n}\n\nmodule.exports = arrayEvery;\n", - "/**\n * A specialized version of `) + ("`" + (`_.filter` + "`"))) + ((` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\nfunction arrayFilter(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length,\n resIndex = 0,\n result = [];\n\n while (++index < length) {\n var value = array[index];\n if (predicate(value, index, array)) {\n result[resIndex++] = value;\n }\n }\n return result;\n}\n\nmodule.exports = arrayFilter;\n", - "var baseIndexOf = require('./_baseIndexOf');\n\n/**\n * A specialized version of ` + ("`" + `_.includes`)) + ("`" + (` for arrays without support for\n * specifying an index to search from.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @returns {boolean} Returns ` + "`"))))) + ((((`true` + "`") + (` if ` + ("`" + `target`))) + (("`" + (` is found, else ` + "`")) + (`false` + ("`" + `.\n */\nfunction arrayIncludes(array, value) {\n var length = array == null ? 0 : array.length;\n return !!length && baseIndexOf(array, value, 0) > -1;\n}\n\nmodule.exports = arrayIncludes;\n", - "/**\n * This function is like `)))) + ((("`" + `arrayIncludes`) + ("`" + (` except that it accepts a comparator.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @param {Function} comparator The comparator invoked per element.\n * @returns {boolean} Returns ` + "`"))) + ((`true` + ("`" + ` if `)) + ("`" + (`target` + "`")))))) + (((((` is found, else ` + "`") + (`false` + ("`" + `.\n */\nfunction arrayIncludesWith(array, value, comparator) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (comparator(value, array[index])) {\n return true;\n }\n }\n return false;\n}\n\nmodule.exports = arrayIncludesWith;\n", - "var baseTimes = require('./_baseTimes'),\n isArguments = require('./isArguments'),\n isArray = require('./isArray'),\n isBuffer = require('./isBuffer'),\n isIndex = require('./_isIndex'),\n isTypedArray = require('./isTypedArray');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Creates an array of the enumerable property names of the array-like `))) + (("`" + (`value` + "`")) + (`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\nfunction arrayLikeKeys(value, inherited) {\n var isArr = isArray(value),\n isArg = !isArr && isArguments(value),\n isBuff = !isArr && !isArg && isBuffer(value),\n isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n skipIndexes = isArr || isArg || isBuff || isType,\n result = skipIndexes ? baseTimes(value.length, String) : [],\n length = result.length;\n\n for (var key in value) {\n if ((inherited || hasOwnProperty.call(value, key)) &&\n !(skipIndexes && (\n // Safari 9 has enumerable ` + ("`" + `arguments.length`)))) + ((("`" + ` in strict mode.\n key == 'length' ||\n // Node.js 0.10 has enumerable non-index properties on buffers.\n (isBuff && (key == 'offset' || key == 'parent')) ||\n // PhantomJS 2 has enumerable non-index properties on typed arrays.\n (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n // Skip index properties.\n isIndex(key, length)\n ))) {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = arrayLikeKeys;\n", - "/**\n * A specialized version of `) + ("`" + (`_.map` + "`"))) + ((` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction arrayMap(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length,\n result = Array(length);\n\n while (++index < length) {\n result[index] = iteratee(array[index], index, array);\n }\n return result;\n}\n\nmodule.exports = arrayMap;\n", - "/**\n * Appends the elements of ` + ("`" + `values`)) + ("`" + (` to ` + "`"))))) + ((((`array` + "`") + (`.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to append.\n * @returns {Array} Returns ` + ("`" + `array`))) + (("`" + (`.\n */\nfunction arrayPush(array, values) {\n var index = -1,\n length = values.length,\n offset = array.length;\n\n while (++index < length) {\n array[offset + index] = values[index];\n }\n return array;\n}\n\nmodule.exports = arrayPush;\n", - "/**\n * A specialized version of ` + "`")) + (`_.some` + ("`" + ` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `)))) + ((("`" + (`true` + "`")) + (` if any element passes the predicate check,\n * else ` + ("`" + `false`))) + (("`" + (`.\n */\nfunction arraySome(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (predicate(array[index], index, array)) {\n return true;\n }\n }\n return false;\n}\n\nmodule.exports = arraySome;\n", - "var eq = require('./eq');\n\n/**\n * Gets the index at which the ` + "`")) + (`key` + ("`" + ` is found in `))))))))) + (((((((("`" + `array`) + ("`" + (` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else ` + "`"))) + ((`-1` + ("`" + `.\n */\nfunction assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n}\n\nmodule.exports = assocIndexOf;\n", - "var defineProperty = require('./_defineProperty');\n\n/**\n * The base implementation of `)) + ("`" + (`assignValue` + "`")))) + (((` and ` + "`") + (`assignMergeValue` + ("`" + ` without\n * value checks.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction baseAssignValue(object, key, value) {\n if (key == '__proto__' && defineProperty) {\n defineProperty(object, key, {\n 'configurable': true,\n 'enumerable': true,\n 'value': value,\n 'writable': true\n });\n } else {\n object[key] = value;\n }\n}\n\nmodule.exports = baseAssignValue;\n", - "var baseForOwn = require('./_baseForOwn'),\n createBaseEach = require('./_createBaseEach');\n\n/**\n * The base implementation of `))) + (("`" + (`_.forEach` + "`")) + (` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array|Object} Returns ` + ("`" + `collection`))))) + (((("`" + `.\n */\nvar baseEach = createBaseEach(baseForOwn);\n\nmodule.exports = baseEach;\n", - "var baseEach = require('./_baseEach');\n\n/**\n * The base implementation of `) + ("`" + (`_.every` + "`"))) + ((` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns ` + ("`" + `true`)) + ("`" + (` if all elements pass the predicate check,\n * else ` + "`")))) + (((`false` + "`") + (`\n */\nfunction baseEvery(collection, predicate) {\n var result = true;\n baseEach(collection, function(value, index, collection) {\n result = !!predicate(value, index, collection);\n return result;\n });\n return result;\n}\n\nmodule.exports = baseEvery;\n", - "var isSymbol = require('./isSymbol');\n\n/**\n * The base implementation of methods like ` + ("`" + `_.max`))) + (("`" + (` and ` + "`")) + (`_.min` + ("`" + ` which accepts a\n * `)))))) + ((((("`" + `comparator`) + ("`" + (` to determine the extremum value.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} iteratee The iteratee invoked per iteration.\n * @param {Function} comparator The comparator used to compare values.\n * @returns {*} Returns the extremum value.\n */\nfunction baseExtremum(array, iteratee, comparator) {\n var index = -1,\n length = array.length;\n\n while (++index < length) {\n var value = array[index],\n current = iteratee(value);\n\n if (current != null && (computed === undefined\n ? (current === current && !isSymbol(current))\n : comparator(current, computed)\n )) {\n var computed = current,\n result = value;\n }\n }\n return result;\n}\n\nmodule.exports = baseExtremum;\n", - "var baseEach = require('./_baseEach');\n\n/**\n * The base implementation of ` + "`"))) + ((`_.filter` + ("`" + ` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\nfunction baseFilter(collection, predicate) {\n var result = [];\n baseEach(collection, function(value, index, collection) {\n if (predicate(value, index, collection)) {\n result.push(value);\n }\n });\n return result;\n}\n\nmodule.exports = baseFilter;\n", - "/**\n * The base implementation of `)) + ("`" + (`_.findIndex` + "`")))) + (((` and ` + "`") + (`_.findLastIndex` + ("`" + ` without\n * support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} predicate The function invoked per iteration.\n * @param {number} fromIndex The index to search from.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {number} Returns the index of the matched value, else `))) + (("`" + (`-1` + "`")) + (`.\n */\nfunction baseFindIndex(array, predicate, fromIndex, fromRight) {\n var length = array.length,\n index = fromIndex + (fromRight ? 1 : -1);\n\n while ((fromRight ? index-- : ++index < length)) {\n if (predicate(array[index], index, array)) {\n return index;\n }\n }\n return -1;\n}\n\nmodule.exports = baseFindIndex;\n", - "var arrayPush = require('./_arrayPush'),\n isFlattenable = require('./_isFlattenable');\n\n/**\n * The base implementation of ` + ("`" + `_.flatten`))))) + (((("`" + ` with support for restricting flattening.\n *\n * @private\n * @param {Array} array The array to flatten.\n * @param {number} depth The maximum recursion depth.\n * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.\n * @param {boolean} [isStrict] Restrict to values that pass `) + ("`" + (`predicate` + "`"))) + ((` checks.\n * @param {Array} [result=[]] The initial result value.\n * @returns {Array} Returns the new flattened array.\n */\nfunction baseFlatten(array, depth, predicate, isStrict, result) {\n var index = -1,\n length = array.length;\n\n predicate || (predicate = isFlattenable);\n result || (result = []);\n\n while (++index < length) {\n var value = array[index];\n if (depth > 0 && predicate(value)) {\n if (depth > 1) {\n // Recursively flatten arrays (susceptible to call stack limits).\n baseFlatten(value, depth - 1, predicate, isStrict, result);\n } else {\n arrayPush(result, value);\n }\n } else if (!isStrict) {\n result[result.length] = value;\n }\n }\n return result;\n}\n\nmodule.exports = baseFlatten;\n", - "var createBaseFor = require('./_createBaseFor');\n\n/**\n * The base implementation of ` + ("`" + `baseForOwn`)) + ("`" + (` which iterates over ` + "`")))) + (((`object` + "`") + (`\n * properties returned by ` + ("`" + `keysFunc`))) + (("`" + (` and invokes ` + "`")) + (`iteratee` + ("`" + ` for each property.\n * Iteratee functions may exit iteration early by explicitly returning `))))))) + (((((("`" + `false`) + ("`" + (`.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} keysFunc The function to get the keys of ` + "`"))) + ((`object` + ("`" + `.\n * @returns {Object} Returns `)) + ("`" + (`object` + "`")))) + (((`.\n */\nvar baseFor = createBaseFor();\n\nmodule.exports = baseFor;\n", - "var baseFor = require('./_baseFor'),\n keys = require('./keys');\n\n/**\n * The base implementation of ` + "`") + (`_.forOwn` + ("`" + ` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Object} Returns `))) + (("`" + (`object` + "`")) + (`.\n */\nfunction baseForOwn(object, iteratee) {\n return object && baseFor(object, iteratee, keys);\n}\n\nmodule.exports = baseForOwn;\n", - "var castPath = require('./_castPath'),\n toKey = require('./_toKey');\n\n/**\n * The base implementation of ` + ("`" + `_.get`))))) + (((("`" + ` without support for default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @returns {*} Returns the resolved value.\n */\nfunction baseGet(object, path) {\n path = castPath(path, object);\n\n var index = 0,\n length = path.length;\n\n while (object != null && index < length) {\n object = object[toKey(path[index++])];\n }\n return (index && index == length) ? object : undefined;\n}\n\nmodule.exports = baseGet;\n", - "var arrayPush = require('./_arrayPush'),\n isArray = require('./isArray');\n\n/**\n * The base implementation of `) + ("`" + (`getAllKeys` + "`"))) + ((` and ` + ("`" + `getAllKeysIn`)) + ("`" + (` which uses\n * ` + "`")))) + (((`keysFunc` + "`") + (` and ` + ("`" + `symbolsFunc`))) + (("`" + (` to get the enumerable property names and\n * symbols of ` + "`")) + (`object` + ("`" + `.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Function} keysFunc The function to get the keys of `)))))) + ((((("`" + `object`) + ("`" + (`.\n * @param {Function} symbolsFunc The function to get the symbols of ` + "`"))) + ((`object` + ("`" + `.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction baseGetAllKeys(object, keysFunc, symbolsFunc) {\n var result = keysFunc(object);\n return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n}\n\nmodule.exports = baseGetAllKeys;\n", - "var Symbol = require('./_Symbol'),\n getRawTag = require('./_getRawTag'),\n objectToString = require('./_objectToString');\n\n/** `)) + ("`" + (`Object#toString` + "`")))) + (((` result references. */\nvar nullTag = '[object Null]',\n undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of ` + "`") + (`getTag` + ("`" + ` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `))) + (("`" + (`toStringTag` + "`")) + (`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\nmodule.exports = baseGetTag;\n", - "/**\n * The base implementation of ` + ("`" + `_.gt`))))) + (((("`" + ` which doesn't coerce arguments.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `) + ("`" + (`true` + "`"))) + ((` if ` + ("`" + `value`)) + ("`" + (` is greater than ` + "`")))) + (((`other` + ("`" + `,\n * else `)) + ("`" + (`false` + "`"))) + ((`.\n */\nfunction baseGt(value, other) {\n return value > other;\n}\n\nmodule.exports = baseGt;\n", - "/**\n * The base implementation of ` + ("`" + `_.hasIn`)) + ("`" + (` without support for deep paths.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns ` + "`")))))))) + (((((((`true` + "`") + (` if ` + ("`" + `key`))) + (("`" + (` exists, else ` + "`")) + (`false` + ("`" + `.\n */\nfunction baseHasIn(object, key) {\n return object != null && key in Object(object);\n}\n\nmodule.exports = baseHasIn;\n", - "var baseFindIndex = require('./_baseFindIndex'),\n baseIsNaN = require('./_baseIsNaN'),\n strictIndexOf = require('./_strictIndexOf');\n\n/**\n * The base implementation of `)))) + ((("`" + `_.indexOf`) + ("`" + (` without ` + "`"))) + ((`fromIndex` + ("`" + ` bounds checks.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `)) + ("`" + (`-1` + "`"))))) + ((((`.\n */\nfunction baseIndexOf(array, value, fromIndex) {\n return value === value\n ? strictIndexOf(array, value, fromIndex)\n : baseFindIndex(array, baseIsNaN, fromIndex);\n}\n\nmodule.exports = baseIndexOf;\n", - "var SetCache = require('./_SetCache'),\n arrayIncludes = require('./_arrayIncludes'),\n arrayIncludesWith = require('./_arrayIncludesWith'),\n arrayMap = require('./_arrayMap'),\n baseUnary = require('./_baseUnary'),\n cacheHas = require('./_cacheHas');\n\n/* Built-in method references for those with the same name as other ` + "`") + (`lodash` + ("`" + ` methods. */\nvar nativeMin = Math.min;\n\n/**\n * The base implementation of methods like `))) + (("`" + (`_.intersection` + "`")) + (`, without support\n * for iteratee shorthands, that accepts an array of arrays to inspect.\n *\n * @private\n * @param {Array} arrays The arrays to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of shared values.\n */\nfunction baseIntersection(arrays, iteratee, comparator) {\n var includes = comparator ? arrayIncludesWith : arrayIncludes,\n length = arrays[0].length,\n othLength = arrays.length,\n othIndex = othLength,\n caches = Array(othLength),\n maxLength = Infinity,\n result = [];\n\n while (othIndex--) {\n var array = arrays[othIndex];\n if (othIndex && iteratee) {\n array = arrayMap(array, baseUnary(iteratee));\n }\n maxLength = nativeMin(array.length, maxLength);\n caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120))\n ? new SetCache(othIndex && array)\n : undefined;\n }\n array = arrays[0];\n\n var index = -1,\n seen = caches[0];\n\n outer:\n while (++index < length && result.length < maxLength) {\n var value = array[index],\n computed = iteratee ? iteratee(value) : value;\n\n value = (comparator || value !== 0) ? value : 0;\n if (!(seen\n ? cacheHas(seen, computed)\n : includes(result, computed, comparator)\n )) {\n othIndex = othLength;\n while (--othIndex) {\n var cache = caches[othIndex];\n if (!(cache\n ? cacheHas(cache, computed)\n : includes(arrays[othIndex], computed, comparator))\n ) {\n continue outer;\n }\n }\n if (seen) {\n seen.push(computed);\n }\n result.push(value);\n }\n }\n return result;\n}\n\nmodule.exports = baseIntersection;\n", - "var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** ` + ("`" + `Object#toString`)))) + ((("`" + ` result references. */\nvar argsTag = '[object Arguments]';\n\n/**\n * The base implementation of `) + ("`" + (`_.isArguments` + "`"))) + ((`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns ` + ("`" + `true`)) + ("`" + (` if ` + "`")))))) + (((((`value` + "`") + (` is an ` + ("`" + `arguments`))) + (("`" + (` object,\n */\nfunction baseIsArguments(value) {\n return isObjectLike(value) && baseGetTag(value) == argsTag;\n}\n\nmodule.exports = baseIsArguments;\n", - "var baseIsEqualDeep = require('./_baseIsEqualDeep'),\n isObjectLike = require('./isObjectLike');\n\n/**\n * The base implementation of ` + "`")) + (`_.isEqual` + ("`" + ` which supports partial comparisons\n * and tracks traversed objects.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {boolean} bitmask The bitmask flags.\n * 1 - Unordered comparison\n * 2 - Partial comparison\n * @param {Function} [customizer] The function to customize comparisons.\n * @param {Object} [stack] Tracks traversed `)))) + ((("`" + `value`) + ("`" + (` and ` + "`"))) + ((`other` + ("`" + ` objects.\n * @returns {boolean} Returns `)) + ("`" + (`true` + "`"))))) + ((((` if the values are equivalent, else ` + "`") + (`false` + ("`" + `.\n */\nfunction baseIsEqual(value, other, bitmask, customizer, stack) {\n if (value === other) {\n return true;\n }\n if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {\n return value !== value && other !== other;\n }\n return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);\n}\n\nmodule.exports = baseIsEqual;\n", - "var Stack = require('./_Stack'),\n equalArrays = require('./_equalArrays'),\n equalByTag = require('./_equalByTag'),\n equalObjects = require('./_equalObjects'),\n getTag = require('./_getTag'),\n isArray = require('./isArray'),\n isBuffer = require('./isBuffer'),\n isTypedArray = require('./isTypedArray');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1;\n\n/** `))) + (("`" + (`Object#toString` + "`")) + (` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n objectTag = '[object Object]';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A specialized version of ` + ("`" + `baseIsEqual`)))) + ((("`" + (` for arrays and objects which performs\n * deep comparisons and tracks traversed objects enabling objects with circular\n * references to be compared.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See ` + "`")) + (`baseIsEqual` + ("`" + ` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} [stack] Tracks traversed `))) + (("`" + (`object` + "`")) + (` and ` + ("`" + `other`))))))) + (((((("`" + ` objects.\n * @returns {boolean} Returns `) + ("`" + (`true` + "`"))) + ((` if the objects are equivalent, else ` + ("`" + `false`)) + ("`" + (`.\n */\nfunction baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\n var objIsArr = isArray(object),\n othIsArr = isArray(other),\n objTag = objIsArr ? arrayTag : getTag(object),\n othTag = othIsArr ? arrayTag : getTag(other);\n\n objTag = objTag == argsTag ? objectTag : objTag;\n othTag = othTag == argsTag ? objectTag : othTag;\n\n var objIsObj = objTag == objectTag,\n othIsObj = othTag == objectTag,\n isSameTag = objTag == othTag;\n\n if (isSameTag && isBuffer(object)) {\n if (!isBuffer(other)) {\n return false;\n }\n objIsArr = true;\n objIsObj = false;\n }\n if (isSameTag && !objIsObj) {\n stack || (stack = new Stack);\n return (objIsArr || isTypedArray(object))\n ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)\n : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\n }\n if (!(bitmask & COMPARE_PARTIAL_FLAG)) {\n var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n if (objIsWrapped || othIsWrapped) {\n var objUnwrapped = objIsWrapped ? object.value() : object,\n othUnwrapped = othIsWrapped ? other.value() : other;\n\n stack || (stack = new Stack);\n return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\n }\n }\n if (!isSameTag) {\n return false;\n }\n stack || (stack = new Stack);\n return equalObjects(object, other, bitmask, customizer, equalFunc, stack);\n}\n\nmodule.exports = baseIsEqualDeep;\n", - "var Stack = require('./_Stack'),\n baseIsEqual = require('./_baseIsEqual');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * The base implementation of ` + "`")))) + (((`_.isMatch` + "`") + (` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property values to match.\n * @param {Array} matchData The property names, values, and compare flags to match.\n * @param {Function} [customizer] The function to customize comparisons.\n * @returns {boolean} Returns ` + ("`" + `true`))) + (("`" + (` if ` + "`")) + (`object` + ("`" + ` is a match, else `))))) + (((("`" + `false`) + ("`" + (`.\n */\nfunction baseIsMatch(object, source, matchData, customizer) {\n var index = matchData.length,\n length = index,\n noCustomizer = !customizer;\n\n if (object == null) {\n return !length;\n }\n object = Object(object);\n while (index--) {\n var data = matchData[index];\n if ((noCustomizer && data[2])\n ? data[1] !== object[data[0]]\n : !(data[0] in object)\n ) {\n return false;\n }\n }\n while (++index < length) {\n data = matchData[index];\n var key = data[0],\n objValue = object[key],\n srcValue = data[1];\n\n if (noCustomizer && data[2]) {\n if (objValue === undefined && !(key in object)) {\n return false;\n }\n } else {\n var stack = new Stack;\n if (customizer) {\n var result = customizer(objValue, srcValue, key, object, source, stack);\n }\n if (!(result === undefined\n ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack)\n : result\n )) {\n return false;\n }\n }\n }\n return true;\n}\n\nmodule.exports = baseIsMatch;\n", - "/**\n * The base implementation of ` + "`"))) + ((`_.isNaN` + ("`" + ` without support for number objects.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `)) + ("`" + (`true` + "`")))) + (((` if ` + "`") + (`value` + ("`" + ` is `))) + (("`" + (`NaN` + "`")) + (`, else ` + ("`" + `false`)))))) + ((((("`" + `.\n */\nfunction baseIsNaN(value) {\n return value !== value;\n}\n\nmodule.exports = baseIsNaN;\n", - "var isFunction = require('./isFunction'),\n isMasked = require('./_isMasked'),\n isObject = require('./isObject'),\n toSource = require('./_toSource');\n\n/**\n * Used to match `) + ("`" + (`RegExp` + "`"))) + ((`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/**\n * The base implementation of ` + ("`" + `_.isNative`)) + ("`" + (` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns ` + "`")))) + (((`true` + "`") + (` if ` + ("`" + `value`))) + (("`" + (` is a native function,\n * else ` + "`")) + (`false` + ("`" + `.\n */\nfunction baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n}\n\nmodule.exports = baseIsNative;\n", - "var baseGetTag = require('./_baseGetTag'),\n isLength = require('./isLength'),\n isObjectLike = require('./isObjectLike');\n\n/** `))))) + (((("`" + `Object#toString`) + ("`" + (` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n objectTag = '[object Object]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/** Used to identify ` + "`"))) + ((`toStringTag` + ("`" + ` values of typed arrays. */\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\ntypedArrayTags[errorTag] = typedArrayTags[funcTag] =\ntypedArrayTags[mapTag] = typedArrayTags[numberTag] =\ntypedArrayTags[objectTag] = typedArrayTags[regexpTag] =\ntypedArrayTags[setTag] = typedArrayTags[stringTag] =\ntypedArrayTags[weakMapTag] = false;\n\n/**\n * The base implementation of `)) + ("`" + (`_.isTypedArray` + "`")))) + (((` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns ` + ("`" + `true`)) + ("`" + (` if ` + "`"))) + ((`value` + ("`" + ` is a typed array, else `)) + ("`" + (`false` + "`")))))))))))) + (((((((((((`.\n */\nfunction baseIsTypedArray(value) {\n return isObjectLike(value) &&\n isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n}\n\nmodule.exports = baseIsTypedArray;\n", - "var baseMatches = require('./_baseMatches'),\n baseMatchesProperty = require('./_baseMatchesProperty'),\n identity = require('./identity'),\n isArray = require('./isArray'),\n property = require('./property');\n\n/**\n * The base implementation of ` + "`") + (`_.iteratee` + ("`" + `.\n *\n * @private\n * @param {*} [value=_.identity] The value to convert to an iteratee.\n * @returns {Function} Returns the iteratee.\n */\nfunction baseIteratee(value) {\n // Don't store the `))) + (("`" + (`typeof` + "`")) + (` result in a variable to avoid a JIT bug in Safari 9.\n // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.\n if (typeof value == 'function') {\n return value;\n }\n if (value == null) {\n return identity;\n }\n if (typeof value == 'object') {\n return isArray(value)\n ? baseMatchesProperty(value[0], value[1])\n : baseMatches(value);\n }\n return property(value);\n}\n\nmodule.exports = baseIteratee;\n", - "var isPrototype = require('./_isPrototype'),\n nativeKeys = require('./_nativeKeys');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of ` + ("`" + `_.keys`)))) + ((("`" + ` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeys(object) {\n if (!isPrototype(object)) {\n return nativeKeys(object);\n }\n var result = [];\n for (var key in Object(object)) {\n if (hasOwnProperty.call(object, key) && key != 'constructor') {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = baseKeys;\n", - "/**\n * The base implementation of `) + ("`" + (`_.lt` + "`"))) + ((` which doesn't coerce arguments.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns ` + ("`" + `true`)) + ("`" + (` if ` + "`"))))) + ((((`value` + "`") + (` is less than ` + ("`" + `other`))) + (("`" + (`,\n * else ` + "`")) + (`false` + ("`" + `.\n */\nfunction baseLt(value, other) {\n return value < other;\n}\n\nmodule.exports = baseLt;\n", - "var baseEach = require('./_baseEach'),\n isArrayLike = require('./isArrayLike');\n\n/**\n * The base implementation of `)))) + ((("`" + `_.map`) + ("`" + (` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction baseMap(collection, iteratee) {\n var index = -1,\n result = isArrayLike(collection) ? Array(collection.length) : [];\n\n baseEach(collection, function(value, key, collection) {\n result[++index] = iteratee(value, key, collection);\n });\n return result;\n}\n\nmodule.exports = baseMap;\n", - "var baseIsMatch = require('./_baseIsMatch'),\n getMatchData = require('./_getMatchData'),\n matchesStrictComparable = require('./_matchesStrictComparable');\n\n/**\n * The base implementation of ` + "`"))) + ((`_.matches` + ("`" + ` which doesn't clone `)) + ("`" + (`source` + "`")))))) + (((((`.\n *\n * @private\n * @param {Object} source The object of property values to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction baseMatches(source) {\n var matchData = getMatchData(source);\n if (matchData.length == 1 && matchData[0][2]) {\n return matchesStrictComparable(matchData[0][0], matchData[0][1]);\n }\n return function(object) {\n return object === source || baseIsMatch(object, source, matchData);\n };\n}\n\nmodule.exports = baseMatches;\n", - "var baseIsEqual = require('./_baseIsEqual'),\n get = require('./get'),\n hasIn = require('./hasIn'),\n isKey = require('./_isKey'),\n isStrictComparable = require('./_isStrictComparable'),\n matchesStrictComparable = require('./_matchesStrictComparable'),\n toKey = require('./_toKey');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * The base implementation of ` + "`") + (`_.matchesProperty` + ("`" + ` which doesn't clone `))) + (("`" + (`srcValue` + "`")) + (`.\n *\n * @private\n * @param {string} path The path of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction baseMatchesProperty(path, srcValue) {\n if (isKey(path) && isStrictComparable(srcValue)) {\n return matchesStrictComparable(toKey(path), srcValue);\n }\n return function(object) {\n var objValue = get(object, path);\n return (objValue === undefined && objValue === srcValue)\n ? hasIn(object, path)\n : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);\n };\n}\n\nmodule.exports = baseMatchesProperty;\n", - "var arrayMap = require('./_arrayMap'),\n baseIteratee = require('./_baseIteratee'),\n baseMap = require('./_baseMap'),\n baseSortBy = require('./_baseSortBy'),\n baseUnary = require('./_baseUnary'),\n compareMultiple = require('./_compareMultiple'),\n identity = require('./identity');\n\n/**\n * The base implementation of ` + ("`" + `_.orderBy`)))) + ((("`" + ` without param guards.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.\n * @param {string[]} orders The sort orders of `) + ("`" + (`iteratees` + "`"))) + ((`.\n * @returns {Array} Returns the new sorted array.\n */\nfunction baseOrderBy(collection, iteratees, orders) {\n var index = -1;\n iteratees = arrayMap(iteratees.length ? iteratees : [identity], baseUnary(baseIteratee));\n\n var result = baseMap(collection, function(value, key, collection) {\n var criteria = arrayMap(iteratees, function(iteratee) {\n return iteratee(value);\n });\n return { 'criteria': criteria, 'index': ++index, 'value': value };\n });\n\n return baseSortBy(result, function(object, other) {\n return compareMultiple(object, other, orders);\n });\n}\n\nmodule.exports = baseOrderBy;\n", - "/**\n * The base implementation of ` + ("`" + `_.property`)) + ("`" + (` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction baseProperty(key) {\n return function(object) {\n return object == null ? undefined : object[key];\n };\n}\n\nmodule.exports = baseProperty;\n", - "var baseGet = require('./_baseGet');\n\n/**\n * A specialized version of ` + "`"))))) + ((((`baseProperty` + "`") + (` which supports deep paths.\n *\n * @private\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction basePropertyDeep(path) {\n return function(object) {\n return baseGet(object, path);\n };\n}\n\nmodule.exports = basePropertyDeep;\n", - "/* Built-in method references for those with the same name as other ` + ("`" + `lodash`))) + (("`" + (` methods. */\nvar nativeCeil = Math.ceil,\n nativeMax = Math.max;\n\n/**\n * The base implementation of ` + "`")) + (`_.range` + ("`" + ` and `)))) + ((("`" + `_.rangeRight`) + ("`" + (` which doesn't\n * coerce arguments.\n *\n * @private\n * @param {number} start The start of the range.\n * @param {number} end The end of the range.\n * @param {number} step The value to increment or decrement by.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Array} Returns the range of numbers.\n */\nfunction baseRange(start, end, step, fromRight) {\n var index = -1,\n length = nativeMax(nativeCeil((end - start) / (step || 1)), 0),\n result = Array(length);\n\n while (length--) {\n result[fromRight ? length : ++index] = start;\n start += step;\n }\n return result;\n}\n\nmodule.exports = baseRange;\n", - "var identity = require('./identity'),\n overRest = require('./_overRest'),\n setToString = require('./_setToString');\n\n/**\n * The base implementation of ` + "`"))) + ((`_.rest` + ("`" + ` which doesn't validate or coerce arguments.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n */\nfunction baseRest(func, start) {\n return setToString(overRest(func, start, identity), func + '');\n}\n\nmodule.exports = baseRest;\n", - "var constant = require('./constant'),\n defineProperty = require('./_defineProperty'),\n identity = require('./identity');\n\n/**\n * The base implementation of `)) + ("`" + (`setToString` + "`"))))))) + ((((((` without support for hot loop shorting.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The ` + "`") + (`toString` + ("`" + ` result.\n * @returns {Function} Returns `))) + (("`" + (`func` + "`")) + (`.\n */\nvar baseSetToString = !defineProperty ? identity : function(func, string) {\n return defineProperty(func, 'toString', {\n 'configurable': true,\n 'enumerable': false,\n 'value': constant(string),\n 'writable': true\n });\n};\n\nmodule.exports = baseSetToString;\n", - "var baseEach = require('./_baseEach');\n\n/**\n * The base implementation of ` + ("`" + `_.some`)))) + ((("`" + ` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `) + ("`" + (`true` + "`"))) + ((` if any element passes the predicate check,\n * else ` + ("`" + `false`)) + ("`" + (`.\n */\nfunction baseSome(collection, predicate) {\n var result;\n\n baseEach(collection, function(value, index, collection) {\n result = predicate(value, index, collection);\n return !result;\n });\n return !!result;\n}\n\nmodule.exports = baseSome;\n", - "/**\n * The base implementation of ` + "`"))))) + ((((`_.sortBy` + "`") + (` which uses ` + ("`" + `comparer`))) + (("`" + (` to define the\n * sort order of ` + "`")) + (`array` + ("`" + ` and replaces criteria objects with their corresponding\n * values.\n *\n * @private\n * @param {Array} array The array to sort.\n * @param {Function} comparer The function to define sort order.\n * @returns {Array} Returns `)))) + ((("`" + `array`) + ("`" + (`.\n */\nfunction baseSortBy(array, comparer) {\n var length = array.length;\n\n array.sort(comparer);\n while (length--) {\n array[length] = array[length].value;\n }\n return array;\n}\n\nmodule.exports = baseSortBy;\n", - "/**\n * The base implementation of ` + "`"))) + ((`_.times` + ("`" + ` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `)) + ("`" + (`iteratee` + "`")))))) + (((((`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n var index = -1,\n result = Array(n);\n\n while (++index < n) {\n result[index] = iteratee(index);\n }\n return result;\n}\n\nmodule.exports = baseTimes;\n", - "var Symbol = require('./_Symbol'),\n arrayMap = require('./_arrayMap'),\n isArray = require('./isArray'),\n isSymbol = require('./isSymbol');\n\n/** Used as references for various ` + "`") + (`Number` + ("`" + ` constants. */\nvar INFINITY = 1 / 0;\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n/**\n * The base implementation of `))) + (("`" + (`_.toString` + "`")) + (` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value;\n }\n if (isArray(value)) {\n // Recursively convert values (susceptible to call stack limits).\n return arrayMap(value, baseToString) + '';\n }\n if (isSymbol(value)) {\n return symbolToString ? symbolToString.call(value) : '';\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = baseToString;\n", - "/**\n * The base implementation of ` + ("`" + `_.unary`)))) + ((("`" + ` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n return function(value) {\n return func(value);\n };\n}\n\nmodule.exports = baseUnary;\n", - "var SetCache = require('./_SetCache'),\n arrayIncludes = require('./_arrayIncludes'),\n arrayIncludesWith = require('./_arrayIncludesWith'),\n cacheHas = require('./_cacheHas'),\n createSet = require('./_createSet'),\n setToArray = require('./_setToArray');\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * The base implementation of `) + ("`" + (`_.uniqBy` + "`"))) + ((` without support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n */\nfunction baseUniq(array, iteratee, comparator) {\n var index = -1,\n includes = arrayIncludes,\n length = array.length,\n isCommon = true,\n result = [],\n seen = result;\n\n if (comparator) {\n isCommon = false;\n includes = arrayIncludesWith;\n }\n else if (length >= LARGE_ARRAY_SIZE) {\n var set = iteratee ? null : createSet(array);\n if (set) {\n return setToArray(set);\n }\n isCommon = false;\n includes = cacheHas;\n seen = new SetCache;\n }\n else {\n seen = iteratee ? [] : result;\n }\n outer:\n while (++index < length) {\n var value = array[index],\n computed = iteratee ? iteratee(value) : value;\n\n value = (comparator || value !== 0) ? value : 0;\n if (isCommon && computed === computed) {\n var seenIndex = seen.length;\n while (seenIndex--) {\n if (seen[seenIndex] === computed) {\n continue outer;\n }\n }\n if (iteratee) {\n seen.push(computed);\n }\n result.push(value);\n }\n else if (!includes(seen, computed, comparator)) {\n if (seen !== result) {\n seen.push(computed);\n }\n result.push(value);\n }\n }\n return result;\n}\n\nmodule.exports = baseUniq;\n", - "/**\n * Checks if a ` + ("`" + `cache`)) + ("`" + (` value for ` + "`"))))) + ((((`key` + "`") + (` exists.\n *\n * @private\n * @param {Object} cache The cache to query.\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns ` + ("`" + `true`))) + (("`" + (` if an entry for ` + "`")) + (`key` + ("`" + ` exists, else `)))) + ((("`" + (`false` + "`")) + (`.\n */\nfunction cacheHas(cache, key) {\n return cache.has(key);\n}\n\nmodule.exports = cacheHas;\n", - "var isArrayLikeObject = require('./isArrayLikeObject');\n\n/**\n * Casts ` + ("`" + `value`))) + (("`" + (` to an empty array if it's not an array like object.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {Array|Object} Returns the cast array-like object.\n */\nfunction castArrayLikeObject(value) {\n return isArrayLikeObject(value) ? value : [];\n}\n\nmodule.exports = castArrayLikeObject;\n", - "var isArray = require('./isArray'),\n isKey = require('./_isKey'),\n stringToPath = require('./_stringToPath'),\n toString = require('./toString');\n\n/**\n * Casts ` + "`")) + (`value` + ("`" + ` to a path array if it's not one.\n *\n * @private\n * @param {*} value The value to inspect.\n * @param {Object} [object] The object to query keys on.\n * @returns {Array} Returns the cast property path array.\n */\nfunction castPath(value, object) {\n if (isArray(value)) {\n return value;\n }\n return isKey(value, object) ? [value] : stringToPath(toString(value));\n}\n\nmodule.exports = castPath;\n", - "var isSymbol = require('./isSymbol');\n\n/**\n * Compares values to sort them in ascending order.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {number} Returns the sort order indicator for `)))))))) + ((((((("`" + `value`) + ("`" + (`.\n */\nfunction compareAscending(value, other) {\n if (value !== other) {\n var valIsDefined = value !== undefined,\n valIsNull = value === null,\n valIsReflexive = value === value,\n valIsSymbol = isSymbol(value);\n\n var othIsDefined = other !== undefined,\n othIsNull = other === null,\n othIsReflexive = other === other,\n othIsSymbol = isSymbol(other);\n\n if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) ||\n (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) ||\n (valIsNull && othIsDefined && othIsReflexive) ||\n (!valIsDefined && othIsReflexive) ||\n !valIsReflexive) {\n return 1;\n }\n if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) ||\n (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) ||\n (othIsNull && valIsDefined && valIsReflexive) ||\n (!othIsDefined && valIsReflexive) ||\n !othIsReflexive) {\n return -1;\n }\n }\n return 0;\n}\n\nmodule.exports = compareAscending;\n", - "var compareAscending = require('./_compareAscending');\n\n/**\n * Used by ` + "`"))) + ((`_.orderBy` + ("`" + ` to compare multiple properties of a value to another\n * and stable sort them.\n *\n * If `)) + ("`" + (`orders` + "`")))) + (((` is unspecified, all values are sorted in ascending order. Otherwise,\n * specify an order of \"desc\" for descending or \"asc\" for ascending sort order\n * of corresponding values.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {boolean[]|string[]} orders The order to sort by for each property.\n * @returns {number} Returns the sort order indicator for ` + "`") + (`object` + ("`" + `.\n */\nfunction compareMultiple(object, other, orders) {\n var index = -1,\n objCriteria = object.criteria,\n othCriteria = other.criteria,\n length = objCriteria.length,\n ordersLength = orders.length;\n\n while (++index < length) {\n var result = compareAscending(objCriteria[index], othCriteria[index]);\n if (result) {\n if (index >= ordersLength) {\n return result;\n }\n var order = orders[index];\n return result * (order == 'desc' ? -1 : 1);\n }\n }\n // Fixes an `))) + (("`" + (`Array#sort` + "`")) + (` bug in the JS engine embedded in Adobe applications\n // that causes it, under certain circumstances, to provide the same value for\n // ` + ("`" + `object`))))) + (((("`" + ` and `) + ("`" + (`other` + "`"))) + ((`. See https://github.com/jashkenas/underscore/pull/1247\n // for more details.\n //\n // This also ensures a stable sort in V8 and other engines.\n // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details.\n return object.index - other.index;\n}\n\nmodule.exports = compareMultiple;\n", + "/**\n * A faster alternative to ` + ("`" + `Function#apply`)))) + ((("`" + (`, this function invokes ` + "`")) + (`func` + ("`" + `\n * with the `))) + (("`" + (`this` + "`")) + ((` binding of ` + "`") + (`thisArg` + "`"))))) + ((((` and the arguments of ` + ("`" + `args`)) + ("`" + (`.\n *\n * @private\n * @param {Function} func The function to invoke.\n * @param {*} thisArg The ` + "`"))) + ((`this` + ("`" + ` binding of `)) + ("`" + (`func` + "`")))) + (((`.\n * @param {Array} args The arguments to invoke ` + ("`" + `func`)) + ("`" + (` with.\n * @returns {*} Returns the result of ` + "`"))) + ((`func` + ("`" + `.\n */\nfunction apply(func, thisArg, args) {\n switch (args.length) {\n case 0: return func.call(thisArg);\n case 1: return func.call(thisArg, args[0]);\n case 2: return func.call(thisArg, args[0], args[1]);\n case 3: return func.call(thisArg, args[0], args[1], args[2]);\n }\n return func.apply(thisArg, args);\n}\n\nmodule.exports = apply;\n", + "/**\n * A specialized version of `)) + (("`" + `_.every`) + ("`" + ` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `))))))))) + (((((((("`" + (`true` + "`")) + (` if all elements pass the predicate check,\n * else ` + ("`" + `false`))) + (("`" + (`.\n */\nfunction arrayEvery(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (!predicate(array[index], index, array)) {\n return false;\n }\n }\n return true;\n}\n\nmodule.exports = arrayEvery;\n", + "/**\n * A specialized version of ` + "`")) + (`_.filter` + ("`" + ` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\nfunction arrayFilter(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length,\n resIndex = 0,\n result = [];\n\n while (++index < length) {\n var value = array[index];\n if (predicate(value, index, array)) {\n result[resIndex++] = value;\n }\n }\n return result;\n}\n\nmodule.exports = arrayFilter;\n", + "var baseIndexOf = require('./_baseIndexOf');\n\n/**\n * A specialized version of `)))) + ((("`" + (`_.includes` + "`")) + (` for arrays without support for\n * specifying an index to search from.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @returns {boolean} Returns ` + ("`" + `true`))) + (("`" + (` if ` + "`")) + (`target` + ("`" + ` is found, else `))))) + (((("`" + (`false` + "`")) + (`.\n */\nfunction arrayIncludes(array, value) {\n var length = array == null ? 0 : array.length;\n return !!length && baseIndexOf(array, value, 0) > -1;\n}\n\nmodule.exports = arrayIncludes;\n", + "/**\n * This function is like ` + ("`" + `arrayIncludes`))) + (("`" + (` except that it accepts a comparator.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @param {Function} comparator The comparator invoked per element.\n * @returns {boolean} Returns ` + "`")) + (`true` + ("`" + ` if `)))) + ((("`" + (`target` + "`")) + (` is found, else ` + ("`" + `false`))) + (("`" + (`.\n */\nfunction arrayIncludesWith(array, value, comparator) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (comparator(value, array[index])) {\n return true;\n }\n }\n return false;\n}\n\nmodule.exports = arrayIncludesWith;\n", + "var baseTimes = require('./_baseTimes'),\n isArguments = require('./isArguments'),\n isArray = require('./isArray'),\n isBuffer = require('./isBuffer'),\n isIndex = require('./_isIndex'),\n isTypedArray = require('./isTypedArray');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Creates an array of the enumerable property names of the array-like ` + "`")) + ((`value` + "`") + (`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\nfunction arrayLikeKeys(value, inherited) {\n var isArr = isArray(value),\n isArg = !isArr && isArguments(value),\n isBuff = !isArr && !isArg && isBuffer(value),\n isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n skipIndexes = isArr || isArg || isBuff || isType,\n result = skipIndexes ? baseTimes(value.length, String) : [],\n length = result.length;\n\n for (var key in value) {\n if ((inherited || hasOwnProperty.call(value, key)) &&\n !(skipIndexes && (\n // Safari 9 has enumerable ` + "`")))))) + (((((`arguments.length` + ("`" + ` in strict mode.\n key == 'length' ||\n // Node.js 0.10 has enumerable non-index properties on buffers.\n (isBuff && (key == 'offset' || key == 'parent')) ||\n // PhantomJS 2 has enumerable non-index properties on typed arrays.\n (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n // Skip index properties.\n isIndex(key, length)\n ))) {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = arrayLikeKeys;\n", + "/**\n * A specialized version of `)) + ("`" + (`_.map` + "`"))) + ((` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction arrayMap(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length,\n result = Array(length);\n\n while (++index < length) {\n result[index] = iteratee(array[index], index, array);\n }\n return result;\n}\n\nmodule.exports = arrayMap;\n", + "/**\n * Appends the elements of ` + ("`" + `values`)) + ("`" + (` to ` + "`")))) + (((`array` + ("`" + `.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to append.\n * @returns {Array} Returns `)) + ("`" + (`array` + "`"))) + ((`.\n */\nfunction arrayPush(array, values) {\n var index = -1,\n length = values.length,\n offset = array.length;\n\n while (++index < length) {\n array[offset + index] = values[index];\n }\n return array;\n}\n\nmodule.exports = arrayPush;\n", + "/**\n * A specialized version of ` + ("`" + `_.some`)) + (("`" + ` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `) + ("`" + `true`))))) + (((("`" + (` if any element passes the predicate check,\n * else ` + "`")) + (`false` + ("`" + `.\n */\nfunction arraySome(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (predicate(array[index], index, array)) {\n return true;\n }\n }\n return false;\n}\n\nmodule.exports = arraySome;\n", + "var eq = require('./eq');\n\n/**\n * Gets the index at which the `))) + (("`" + (`key` + "`")) + (` is found in ` + ("`" + `array`)))) + ((("`" + (` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else ` + "`")) + (`-1` + ("`" + `.\n */\nfunction assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n}\n\nmodule.exports = assocIndexOf;\n", + "var defineProperty = require('./_defineProperty');\n\n/**\n * The base implementation of `))) + (("`" + (`assignValue` + "`")) + ((` and ` + "`") + (`assignMergeValue` + "`"))))))) + ((((((` without\n * value checks.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction baseAssignValue(object, key, value) {\n if (key == '__proto__' && defineProperty) {\n defineProperty(object, key, {\n 'configurable': true,\n 'enumerable': true,\n 'value': value,\n 'writable': true\n });\n } else {\n object[key] = value;\n }\n}\n\nmodule.exports = baseAssignValue;\n", + "var baseForOwn = require('./_baseForOwn'),\n createBaseEach = require('./_createBaseEach');\n\n/**\n * The base implementation of ` + ("`" + `_.forEach`)) + ("`" + (` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array|Object} Returns ` + "`"))) + ((`collection` + ("`" + `.\n */\nvar baseEach = createBaseEach(baseForOwn);\n\nmodule.exports = baseEach;\n", + "var baseEach = require('./_baseEach');\n\n/**\n * The base implementation of `)) + ("`" + (`_.every` + "`")))) + (((` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns ` + ("`" + `true`)) + ("`" + (` if all elements pass the predicate check,\n * else ` + "`"))) + ((`false` + ("`" + `\n */\nfunction baseEvery(collection, predicate) {\n var result = true;\n baseEach(collection, function(value, index, collection) {\n result = !!predicate(value, index, collection);\n return result;\n });\n return result;\n}\n\nmodule.exports = baseEvery;\n", + "var isSymbol = require('./isSymbol');\n\n/**\n * The base implementation of methods like `)) + ("`" + (`_.max` + "`"))))) + ((((` and ` + ("`" + `_.min`)) + ("`" + (` which accepts a\n * ` + "`"))) + ((`comparator` + ("`" + ` to determine the extremum value.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} iteratee The iteratee invoked per iteration.\n * @param {Function} comparator The comparator used to compare values.\n * @returns {*} Returns the extremum value.\n */\nfunction baseExtremum(array, iteratee, comparator) {\n var index = -1,\n length = array.length;\n\n while (++index < length) {\n var value = array[index],\n current = iteratee(value);\n\n if (current != null && (computed === undefined\n ? (current === current && !isSymbol(current))\n : comparator(current, computed)\n )) {\n var computed = current,\n result = value;\n }\n }\n return result;\n}\n\nmodule.exports = baseExtremum;\n", + "var baseEach = require('./_baseEach');\n\n/**\n * The base implementation of `)) + ("`" + (`_.filter` + "`")))) + (((` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\nfunction baseFilter(collection, predicate) {\n var result = [];\n baseEach(collection, function(value, index, collection) {\n if (predicate(value, index, collection)) {\n result.push(value);\n }\n });\n return result;\n}\n\nmodule.exports = baseFilter;\n", + "/**\n * The base implementation of ` + ("`" + `_.findIndex`)) + ("`" + (` and ` + "`"))) + ((`_.findLastIndex` + ("`" + ` without\n * support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} predicate The function invoked per iteration.\n * @param {number} fromIndex The index to search from.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {number} Returns the index of the matched value, else `)) + (("`" + `-1`) + ("`" + `.\n */\nfunction baseFindIndex(array, predicate, fromIndex, fromRight) {\n var length = array.length,\n index = fromIndex + (fromRight ? 1 : -1);\n\n while ((fromRight ? index-- : ++index < length)) {\n if (predicate(array[index], index, array)) {\n return index;\n }\n }\n return -1;\n}\n\nmodule.exports = baseFindIndex;\n", + "var arrayPush = require('./_arrayPush'),\n isFlattenable = require('./_isFlattenable');\n\n/**\n * The base implementation of `)))))) + ((((("`" + (`_.flatten` + "`")) + (` with support for restricting flattening.\n *\n * @private\n * @param {Array} array The array to flatten.\n * @param {number} depth The maximum recursion depth.\n * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.\n * @param {boolean} [isStrict] Restrict to values that pass ` + ("`" + `predicate`))) + (("`" + (` checks.\n * @param {Array} [result=[]] The initial result value.\n * @returns {Array} Returns the new flattened array.\n */\nfunction baseFlatten(array, depth, predicate, isStrict, result) {\n var index = -1,\n length = array.length;\n\n predicate || (predicate = isFlattenable);\n result || (result = []);\n\n while (++index < length) {\n var value = array[index];\n if (depth > 0 && predicate(value)) {\n if (depth > 1) {\n // Recursively flatten arrays (susceptible to call stack limits).\n baseFlatten(value, depth - 1, predicate, isStrict, result);\n } else {\n arrayPush(result, value);\n }\n } else if (!isStrict) {\n result[result.length] = value;\n }\n }\n return result;\n}\n\nmodule.exports = baseFlatten;\n", + "var createBaseFor = require('./_createBaseFor');\n\n/**\n * The base implementation of ` + "`")) + (`baseForOwn` + ("`" + ` which iterates over `)))) + ((("`" + (`object` + "`")) + (`\n * properties returned by ` + ("`" + `keysFunc`))) + (("`" + (` and invokes ` + "`")) + ((`iteratee` + "`") + (` for each property.\n * Iteratee functions may exit iteration early by explicitly returning ` + "`"))))) + ((((`false` + ("`" + `.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} keysFunc The function to get the keys of `)) + ("`" + (`object` + "`"))) + ((`.\n * @returns {Object} Returns ` + ("`" + `object`)) + ("`" + (`.\n */\nvar baseFor = createBaseFor();\n\nmodule.exports = baseFor;\n", + "var baseFor = require('./_baseFor'),\n keys = require('./keys');\n\n/**\n * The base implementation of ` + "`")))) + (((`_.forOwn` + ("`" + ` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Object} Returns `)) + ("`" + (`object` + "`"))) + ((`.\n */\nfunction baseForOwn(object, iteratee) {\n return object && baseFor(object, iteratee, keys);\n}\n\nmodule.exports = baseForOwn;\n", + "var castPath = require('./_castPath'),\n toKey = require('./_toKey');\n\n/**\n * The base implementation of ` + ("`" + `_.get`)) + (("`" + ` without support for default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @returns {*} Returns the resolved value.\n */\nfunction baseGet(object, path) {\n path = castPath(path, object);\n\n var index = 0,\n length = path.length;\n\n while (object != null && index < length) {\n object = object[toKey(path[index++])];\n }\n return (index && index == length) ? object : undefined;\n}\n\nmodule.exports = baseGet;\n", + "var arrayPush = require('./_arrayPush'),\n isArray = require('./isArray');\n\n/**\n * The base implementation of `) + ("`" + `getAllKeys`)))))))) + ((((((("`" + (` and ` + "`")) + (`getAllKeysIn` + ("`" + ` which uses\n * `))) + (("`" + (`keysFunc` + "`")) + (` and ` + ("`" + `symbolsFunc`)))) + ((("`" + (` to get the enumerable property names and\n * symbols of ` + "`")) + (`object` + ("`" + `.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Function} keysFunc The function to get the keys of `))) + (("`" + (`object` + "`")) + (`.\n * @param {Function} symbolsFunc The function to get the symbols of ` + ("`" + `object`))))) + (((("`" + (`.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction baseGetAllKeys(object, keysFunc, symbolsFunc) {\n var result = keysFunc(object);\n return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n}\n\nmodule.exports = baseGetAllKeys;\n", + "var Symbol = require('./_Symbol'),\n getRawTag = require('./_getRawTag'),\n objectToString = require('./_objectToString');\n\n/** ` + "`")) + (`Object#toString` + ("`" + ` result references. */\nvar nullTag = '[object Null]',\n undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `))) + (("`" + (`getTag` + "`")) + (` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the ` + ("`" + `toStringTag`)))) + ((("`" + (`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\nmodule.exports = baseGetTag;\n", + "/**\n * The base implementation of ` + "`")) + (`_.gt` + ("`" + ` which doesn't coerce arguments.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `))) + (("`" + (`true` + "`")) + ((` if ` + "`") + (`value` + "`")))))) + (((((` is greater than ` + ("`" + `other`)) + ("`" + (`,\n * else ` + "`"))) + ((`false` + ("`" + `.\n */\nfunction baseGt(value, other) {\n return value > other;\n}\n\nmodule.exports = baseGt;\n", + "/**\n * The base implementation of `)) + ("`" + (`_.hasIn` + "`")))) + (((` without support for deep paths.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns ` + ("`" + `true`)) + ("`" + (` if ` + "`"))) + ((`key` + ("`" + ` exists, else `)) + (("`" + `false`) + ("`" + `.\n */\nfunction baseHasIn(object, key) {\n return object != null && key in Object(object);\n}\n\nmodule.exports = baseHasIn;\n", + "var baseFindIndex = require('./_baseFindIndex'),\n baseIsNaN = require('./_baseIsNaN'),\n strictIndexOf = require('./_strictIndexOf');\n\n/**\n * The base implementation of `))))) + (((("`" + (`_.indexOf` + "`")) + (` without ` + ("`" + `fromIndex`))) + (("`" + (` bounds checks.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else ` + "`")) + (`-1` + ("`" + `.\n */\nfunction baseIndexOf(array, value, fromIndex) {\n return value === value\n ? strictIndexOf(array, value, fromIndex)\n : baseFindIndex(array, baseIsNaN, fromIndex);\n}\n\nmodule.exports = baseIndexOf;\n", + "var SetCache = require('./_SetCache'),\n arrayIncludes = require('./_arrayIncludes'),\n arrayIncludesWith = require('./_arrayIncludesWith'),\n arrayMap = require('./_arrayMap'),\n baseUnary = require('./_baseUnary'),\n cacheHas = require('./_cacheHas');\n\n/* Built-in method references for those with the same name as other `)))) + ((("`" + (`lodash` + "`")) + (` methods. */\nvar nativeMin = Math.min;\n\n/**\n * The base implementation of methods like ` + ("`" + `_.intersection`))) + (("`" + (`, without support\n * for iteratee shorthands, that accepts an array of arrays to inspect.\n *\n * @private\n * @param {Array} arrays The arrays to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of shared values.\n */\nfunction baseIntersection(arrays, iteratee, comparator) {\n var includes = comparator ? arrayIncludesWith : arrayIncludes,\n length = arrays[0].length,\n othLength = arrays.length,\n othIndex = othLength,\n caches = Array(othLength),\n maxLength = Infinity,\n result = [];\n\n while (othIndex--) {\n var array = arrays[othIndex];\n if (othIndex && iteratee) {\n array = arrayMap(array, baseUnary(iteratee));\n }\n maxLength = nativeMin(array.length, maxLength);\n caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120))\n ? new SetCache(othIndex && array)\n : undefined;\n }\n array = arrays[0];\n\n var index = -1,\n seen = caches[0];\n\n outer:\n while (++index < length && result.length < maxLength) {\n var value = array[index],\n computed = iteratee ? iteratee(value) : value;\n\n value = (comparator || value !== 0) ? value : 0;\n if (!(seen\n ? cacheHas(seen, computed)\n : includes(result, computed, comparator)\n )) {\n othIndex = othLength;\n while (--othIndex) {\n var cache = caches[othIndex];\n if (!(cache\n ? cacheHas(cache, computed)\n : includes(arrays[othIndex], computed, comparator))\n ) {\n continue outer;\n }\n }\n if (seen) {\n seen.push(computed);\n }\n result.push(value);\n }\n }\n return result;\n}\n\nmodule.exports = baseIntersection;\n", + "var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** ` + "`")) + ((`Object#toString` + "`") + (` result references. */\nvar argsTag = '[object Arguments]';\n\n/**\n * The base implementation of ` + "`"))))))) + ((((((`_.isArguments` + ("`" + `.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `)) + ("`" + (`true` + "`"))) + ((` if ` + ("`" + `value`)) + ("`" + (` is an ` + "`")))) + (((`arguments` + ("`" + ` object,\n */\nfunction baseIsArguments(value) {\n return isObjectLike(value) && baseGetTag(value) == argsTag;\n}\n\nmodule.exports = baseIsArguments;\n", + "var baseIsEqualDeep = require('./_baseIsEqualDeep'),\n isObjectLike = require('./isObjectLike');\n\n/**\n * The base implementation of `)) + ("`" + (`_.isEqual` + "`"))) + ((` which supports partial comparisons\n * and tracks traversed objects.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {boolean} bitmask The bitmask flags.\n * 1 - Unordered comparison\n * 2 - Partial comparison\n * @param {Function} [customizer] The function to customize comparisons.\n * @param {Object} [stack] Tracks traversed ` + ("`" + `value`)) + (("`" + ` and `) + ("`" + `other`))))) + (((("`" + (` objects.\n * @returns {boolean} Returns ` + "`")) + (`true` + ("`" + ` if the values are equivalent, else `))) + (("`" + (`false` + "`")) + (`.\n */\nfunction baseIsEqual(value, other, bitmask, customizer, stack) {\n if (value === other) {\n return true;\n }\n if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {\n return value !== value && other !== other;\n }\n return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);\n}\n\nmodule.exports = baseIsEqual;\n", + "var Stack = require('./_Stack'),\n equalArrays = require('./_equalArrays'),\n equalByTag = require('./_equalByTag'),\n equalObjects = require('./_equalObjects'),\n getTag = require('./_getTag'),\n isArray = require('./isArray'),\n isBuffer = require('./isBuffer'),\n isTypedArray = require('./isTypedArray');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1;\n\n/** ` + ("`" + `Object#toString`)))) + ((("`" + (` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n objectTag = '[object Object]';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A specialized version of ` + "`")) + (`baseIsEqual` + ("`" + ` for arrays and objects which performs\n * deep comparisons and tracks traversed objects enabling objects with circular\n * references to be compared.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `))) + (("`" + (`baseIsEqual` + "`")) + ((` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} [stack] Tracks traversed ` + "`") + (`object` + "`")))))) + (((((` and ` + ("`" + `other`)) + ("`" + (` objects.\n * @returns {boolean} Returns ` + "`"))) + ((`true` + ("`" + ` if the objects are equivalent, else `)) + ("`" + (`false` + "`")))) + (((`.\n */\nfunction baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\n var objIsArr = isArray(object),\n othIsArr = isArray(other),\n objTag = objIsArr ? arrayTag : getTag(object),\n othTag = othIsArr ? arrayTag : getTag(other);\n\n objTag = objTag == argsTag ? objectTag : objTag;\n othTag = othTag == argsTag ? objectTag : othTag;\n\n var objIsObj = objTag == objectTag,\n othIsObj = othTag == objectTag,\n isSameTag = objTag == othTag;\n\n if (isSameTag && isBuffer(object)) {\n if (!isBuffer(other)) {\n return false;\n }\n objIsArr = true;\n objIsObj = false;\n }\n if (isSameTag && !objIsObj) {\n stack || (stack = new Stack);\n return (objIsArr || isTypedArray(object))\n ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)\n : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\n }\n if (!(bitmask & COMPARE_PARTIAL_FLAG)) {\n var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n if (objIsWrapped || othIsWrapped) {\n var objUnwrapped = objIsWrapped ? object.value() : object,\n othUnwrapped = othIsWrapped ? other.value() : other;\n\n stack || (stack = new Stack);\n return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\n }\n }\n if (!isSameTag) {\n return false;\n }\n stack || (stack = new Stack);\n return equalObjects(object, other, bitmask, customizer, equalFunc, stack);\n}\n\nmodule.exports = baseIsEqualDeep;\n", + "var Stack = require('./_Stack'),\n baseIsEqual = require('./_baseIsEqual');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * The base implementation of ` + ("`" + `_.isMatch`)) + ("`" + (` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property values to match.\n * @param {Array} matchData The property names, values, and compare flags to match.\n * @param {Function} [customizer] The function to customize comparisons.\n * @returns {boolean} Returns ` + "`"))) + ((`true` + ("`" + ` if `)) + (("`" + `object`) + ("`" + ` is a match, else `))))) + (((("`" + (`false` + "`")) + (`.\n */\nfunction baseIsMatch(object, source, matchData, customizer) {\n var index = matchData.length,\n length = index,\n noCustomizer = !customizer;\n\n if (object == null) {\n return !length;\n }\n object = Object(object);\n while (index--) {\n var data = matchData[index];\n if ((noCustomizer && data[2])\n ? data[1] !== object[data[0]]\n : !(data[0] in object)\n ) {\n return false;\n }\n }\n while (++index < length) {\n data = matchData[index];\n var key = data[0],\n objValue = object[key],\n srcValue = data[1];\n\n if (noCustomizer && data[2]) {\n if (objValue === undefined && !(key in object)) {\n return false;\n }\n } else {\n var stack = new Stack;\n if (customizer) {\n var result = customizer(objValue, srcValue, key, object, source, stack);\n }\n if (!(result === undefined\n ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack)\n : result\n )) {\n return false;\n }\n }\n }\n return true;\n}\n\nmodule.exports = baseIsMatch;\n", + "/**\n * The base implementation of ` + ("`" + `_.isNaN`))) + (("`" + (` without support for number objects.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns ` + "`")) + (`true` + ("`" + ` if `)))) + ((("`" + (`value` + "`")) + (` is ` + ("`" + `NaN`))) + (("`" + (`, else ` + "`")) + ((`false` + "`") + (`.\n */\nfunction baseIsNaN(value) {\n return value !== value;\n}\n\nmodule.exports = baseIsNaN;\n", + "var isFunction = require('./isFunction'),\n isMasked = require('./_isMasked'),\n isObject = require('./isObject'),\n toSource = require('./_toSource');\n\n/**\n * Used to match ` + "`")))))))))))) + (((((((((((`RegExp` + ("`" + `\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/**\n * The base implementation of `)) + ("`" + (`_.isNative` + "`"))) + ((` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns ` + ("`" + `true`)) + ("`" + (` if ` + "`")))) + (((`value` + ("`" + ` is a native function,\n * else `)) + ("`" + (`false` + "`"))) + ((`.\n */\nfunction baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n}\n\nmodule.exports = baseIsNative;\n", + "var baseGetTag = require('./_baseGetTag'),\n isLength = require('./isLength'),\n isObjectLike = require('./isObjectLike');\n\n/** ` + ("`" + `Object#toString`)) + ("`" + (` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n objectTag = '[object Object]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/** Used to identify ` + "`"))))) + ((((`toStringTag` + ("`" + ` values of typed arrays. */\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\ntypedArrayTags[errorTag] = typedArrayTags[funcTag] =\ntypedArrayTags[mapTag] = typedArrayTags[numberTag] =\ntypedArrayTags[objectTag] = typedArrayTags[regexpTag] =\ntypedArrayTags[setTag] = typedArrayTags[stringTag] =\ntypedArrayTags[weakMapTag] = false;\n\n/**\n * The base implementation of `)) + ("`" + (`_.isTypedArray` + "`"))) + ((` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns ` + ("`" + `true`)) + ("`" + (` if ` + "`")))) + (((`value` + ("`" + ` is a typed array, else `)) + ("`" + (`false` + "`"))) + ((`.\n */\nfunction baseIsTypedArray(value) {\n return isObjectLike(value) &&\n isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n}\n\nmodule.exports = baseIsTypedArray;\n", + "var baseMatches = require('./_baseMatches'),\n baseMatchesProperty = require('./_baseMatchesProperty'),\n identity = require('./identity'),\n isArray = require('./isArray'),\n property = require('./property');\n\n/**\n * The base implementation of ` + ("`" + `_.iteratee`)) + (("`" + `.\n *\n * @private\n * @param {*} [value=_.identity] The value to convert to an iteratee.\n * @returns {Function} Returns the iteratee.\n */\nfunction baseIteratee(value) {\n // Don't store the `) + ("`" + `typeof`)))))) + ((((("`" + (` result in a variable to avoid a JIT bug in Safari 9.\n // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.\n if (typeof value == 'function') {\n return value;\n }\n if (value == null) {\n return identity;\n }\n if (typeof value == 'object') {\n return isArray(value)\n ? baseMatchesProperty(value[0], value[1])\n : baseMatches(value);\n }\n return property(value);\n}\n\nmodule.exports = baseIteratee;\n", + "var isPrototype = require('./_isPrototype'),\n nativeKeys = require('./_nativeKeys');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of ` + "`")) + (`_.keys` + ("`" + ` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeys(object) {\n if (!isPrototype(object)) {\n return nativeKeys(object);\n }\n var result = [];\n for (var key in Object(object)) {\n if (hasOwnProperty.call(object, key) && key != 'constructor') {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = baseKeys;\n", + "/**\n * The base implementation of `))) + (("`" + (`_.lt` + "`")) + (` which doesn't coerce arguments.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns ` + ("`" + `true`)))) + ((("`" + (` if ` + "`")) + (`value` + ("`" + ` is less than `))) + (("`" + (`other` + "`")) + ((`,\n * else ` + "`") + (`false` + "`"))))) + ((((`.\n */\nfunction baseLt(value, other) {\n return value < other;\n}\n\nmodule.exports = baseLt;\n", + "var baseEach = require('./_baseEach'),\n isArrayLike = require('./isArrayLike');\n\n/**\n * The base implementation of ` + ("`" + `_.map`)) + ("`" + (` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction baseMap(collection, iteratee) {\n var index = -1,\n result = isArrayLike(collection) ? Array(collection.length) : [];\n\n baseEach(collection, function(value, key, collection) {\n result[++index] = iteratee(value, key, collection);\n });\n return result;\n}\n\nmodule.exports = baseMap;\n", + "var baseIsMatch = require('./_baseIsMatch'),\n getMatchData = require('./_getMatchData'),\n matchesStrictComparable = require('./_matchesStrictComparable');\n\n/**\n * The base implementation of ` + "`"))) + ((`_.matches` + ("`" + ` which doesn't clone `)) + ("`" + (`source` + "`")))) + (((`.\n *\n * @private\n * @param {Object} source The object of property values to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction baseMatches(source) {\n var matchData = getMatchData(source);\n if (matchData.length == 1 && matchData[0][2]) {\n return matchesStrictComparable(matchData[0][0], matchData[0][1]);\n }\n return function(object) {\n return object === source || baseIsMatch(object, source, matchData);\n };\n}\n\nmodule.exports = baseMatches;\n", + "var baseIsEqual = require('./_baseIsEqual'),\n get = require('./get'),\n hasIn = require('./hasIn'),\n isKey = require('./_isKey'),\n isStrictComparable = require('./_isStrictComparable'),\n matchesStrictComparable = require('./_matchesStrictComparable'),\n toKey = require('./_toKey');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * The base implementation of ` + ("`" + `_.matchesProperty`)) + ("`" + (` which doesn't clone ` + "`"))) + ((`srcValue` + ("`" + `.\n *\n * @private\n * @param {string} path The path of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction baseMatchesProperty(path, srcValue) {\n if (isKey(path) && isStrictComparable(srcValue)) {\n return matchesStrictComparable(toKey(path), srcValue);\n }\n return function(object) {\n var objValue = get(object, path);\n return (objValue === undefined && objValue === srcValue)\n ? hasIn(object, path)\n : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);\n };\n}\n\nmodule.exports = baseMatchesProperty;\n", + "var arrayMap = require('./_arrayMap'),\n baseIteratee = require('./_baseIteratee'),\n baseMap = require('./_baseMap'),\n baseSortBy = require('./_baseSortBy'),\n baseUnary = require('./_baseUnary'),\n compareMultiple = require('./_compareMultiple'),\n identity = require('./identity');\n\n/**\n * The base implementation of `)) + (("`" + `_.orderBy`) + ("`" + ` without param guards.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.\n * @param {string[]} orders The sort orders of `))))))) + (((((("`" + (`iteratees` + "`")) + (`.\n * @returns {Array} Returns the new sorted array.\n */\nfunction baseOrderBy(collection, iteratees, orders) {\n var index = -1;\n iteratees = arrayMap(iteratees.length ? iteratees : [identity], baseUnary(baseIteratee));\n\n var result = baseMap(collection, function(value, key, collection) {\n var criteria = arrayMap(iteratees, function(iteratee) {\n return iteratee(value);\n });\n return { 'criteria': criteria, 'index': ++index, 'value': value };\n });\n\n return baseSortBy(result, function(object, other) {\n return compareMultiple(object, other, orders);\n });\n}\n\nmodule.exports = baseOrderBy;\n", + "/**\n * The base implementation of ` + ("`" + `_.property`))) + (("`" + (` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction baseProperty(key) {\n return function(object) {\n return object == null ? undefined : object[key];\n };\n}\n\nmodule.exports = baseProperty;\n", + "var baseGet = require('./_baseGet');\n\n/**\n * A specialized version of ` + "`")) + (`baseProperty` + ("`" + ` which supports deep paths.\n *\n * @private\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction basePropertyDeep(path) {\n return function(object) {\n return baseGet(object, path);\n };\n}\n\nmodule.exports = basePropertyDeep;\n", + "/* Built-in method references for those with the same name as other `)))) + ((("`" + (`lodash` + "`")) + (` methods. */\nvar nativeCeil = Math.ceil,\n nativeMax = Math.max;\n\n/**\n * The base implementation of ` + ("`" + `_.range`))) + (("`" + (` and ` + "`")) + (`_.rangeRight` + ("`" + ` which doesn't\n * coerce arguments.\n *\n * @private\n * @param {number} start The start of the range.\n * @param {number} end The end of the range.\n * @param {number} step The value to increment or decrement by.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Array} Returns the range of numbers.\n */\nfunction baseRange(start, end, step, fromRight) {\n var index = -1,\n length = nativeMax(nativeCeil((end - start) / (step || 1)), 0),\n result = Array(length);\n\n while (length--) {\n result[fromRight ? length : ++index] = start;\n start += step;\n }\n return result;\n}\n\nmodule.exports = baseRange;\n", + "var identity = require('./identity'),\n overRest = require('./_overRest'),\n setToString = require('./_setToString');\n\n/**\n * The base implementation of `))))) + (((("`" + (`_.rest` + "`")) + (` which doesn't validate or coerce arguments.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n */\nfunction baseRest(func, start) {\n return setToString(overRest(func, start, identity), func + '');\n}\n\nmodule.exports = baseRest;\n", + "var constant = require('./constant'),\n defineProperty = require('./_defineProperty'),\n identity = require('./identity');\n\n/**\n * The base implementation of ` + ("`" + `setToString`))) + (("`" + (` without support for hot loop shorting.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The ` + "`")) + (`toString` + ("`" + ` result.\n * @returns {Function} Returns `)))) + ((("`" + (`func` + "`")) + (`.\n */\nvar baseSetToString = !defineProperty ? identity : function(func, string) {\n return defineProperty(func, 'toString', {\n 'configurable': true,\n 'enumerable': false,\n 'value': constant(string),\n 'writable': true\n });\n};\n\nmodule.exports = baseSetToString;\n", + "var baseEach = require('./_baseEach');\n\n/**\n * The base implementation of ` + ("`" + `_.some`))) + (("`" + (` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns ` + "`")) + ((`true` + "`") + (` if any element passes the predicate check,\n * else ` + "`")))))) + (((((`false` + ("`" + `.\n */\nfunction baseSome(collection, predicate) {\n var result;\n\n baseEach(collection, function(value, index, collection) {\n result = predicate(value, index, collection);\n return !result;\n });\n return !!result;\n}\n\nmodule.exports = baseSome;\n", + "/**\n * The base implementation of `)) + ("`" + (`_.sortBy` + "`"))) + ((` which uses ` + ("`" + `comparer`)) + ("`" + (` to define the\n * sort order of ` + "`")))) + (((`array` + ("`" + ` and replaces criteria objects with their corresponding\n * values.\n *\n * @private\n * @param {Array} array The array to sort.\n * @param {Function} comparer The function to define sort order.\n * @returns {Array} Returns `)) + ("`" + (`array` + "`"))) + ((`.\n */\nfunction baseSortBy(array, comparer) {\n var length = array.length;\n\n array.sort(comparer);\n while (length--) {\n array[length] = array[length].value;\n }\n return array;\n}\n\nmodule.exports = baseSortBy;\n", + "/**\n * The base implementation of ` + ("`" + `_.times`)) + (("`" + ` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `) + ("`" + `iteratee`))))) + (((("`" + (`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n var index = -1,\n result = Array(n);\n\n while (++index < n) {\n result[index] = iteratee(index);\n }\n return result;\n}\n\nmodule.exports = baseTimes;\n", + "var Symbol = require('./_Symbol'),\n arrayMap = require('./_arrayMap'),\n isArray = require('./isArray'),\n isSymbol = require('./isSymbol');\n\n/** Used as references for various ` + "`")) + (`Number` + ("`" + ` constants. */\nvar INFINITY = 1 / 0;\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n/**\n * The base implementation of `))) + (("`" + (`_.toString` + "`")) + (` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value;\n }\n if (isArray(value)) {\n // Recursively convert values (susceptible to call stack limits).\n return arrayMap(value, baseToString) + '';\n }\n if (isSymbol(value)) {\n return symbolToString ? symbolToString.call(value) : '';\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = baseToString;\n", + "/**\n * The base implementation of ` + ("`" + `_.unary`)))) + ((("`" + (` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n return function(value) {\n return func(value);\n };\n}\n\nmodule.exports = baseUnary;\n", + "var SetCache = require('./_SetCache'),\n arrayIncludes = require('./_arrayIncludes'),\n arrayIncludesWith = require('./_arrayIncludesWith'),\n cacheHas = require('./_cacheHas'),\n createSet = require('./_createSet'),\n setToArray = require('./_setToArray');\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * The base implementation of ` + "`")) + (`_.uniqBy` + ("`" + ` without support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n */\nfunction baseUniq(array, iteratee, comparator) {\n var index = -1,\n includes = arrayIncludes,\n length = array.length,\n isCommon = true,\n result = [],\n seen = result;\n\n if (comparator) {\n isCommon = false;\n includes = arrayIncludesWith;\n }\n else if (length >= LARGE_ARRAY_SIZE) {\n var set = iteratee ? null : createSet(array);\n if (set) {\n return setToArray(set);\n }\n isCommon = false;\n includes = cacheHas;\n seen = new SetCache;\n }\n else {\n seen = iteratee ? [] : result;\n }\n outer:\n while (++index < length) {\n var value = array[index],\n computed = iteratee ? iteratee(value) : value;\n\n value = (comparator || value !== 0) ? value : 0;\n if (isCommon && computed === computed) {\n var seenIndex = seen.length;\n while (seenIndex--) {\n if (seen[seenIndex] === computed) {\n continue outer;\n }\n }\n if (iteratee) {\n seen.push(computed);\n }\n result.push(value);\n }\n else if (!includes(seen, computed, comparator)) {\n if (seen !== result) {\n seen.push(computed);\n }\n result.push(value);\n }\n }\n return result;\n}\n\nmodule.exports = baseUniq;\n", + "/**\n * Checks if a `))) + (("`" + (`cache` + "`")) + ((` value for ` + "`") + (`key` + "`")))))))) + (((((((` exists.\n *\n * @private\n * @param {Object} cache The cache to query.\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns ` + ("`" + `true`)) + ("`" + (` if an entry for ` + "`"))) + ((`key` + ("`" + ` exists, else `)) + ("`" + (`false` + "`")))) + (((`.\n */\nfunction cacheHas(cache, key) {\n return cache.has(key);\n}\n\nmodule.exports = cacheHas;\n", + "var isArrayLikeObject = require('./isArrayLikeObject');\n\n/**\n * Casts ` + ("`" + `value`)) + ("`" + (` to an empty array if it's not an array like object.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {Array|Object} Returns the cast array-like object.\n */\nfunction castArrayLikeObject(value) {\n return isArrayLikeObject(value) ? value : [];\n}\n\nmodule.exports = castArrayLikeObject;\n", + "var isArray = require('./isArray'),\n isKey = require('./_isKey'),\n stringToPath = require('./_stringToPath'),\n toString = require('./toString');\n\n/**\n * Casts ` + "`"))) + ((`value` + ("`" + ` to a path array if it's not one.\n *\n * @private\n * @param {*} value The value to inspect.\n * @param {Object} [object] The object to query keys on.\n * @returns {Array} Returns the cast property path array.\n */\nfunction castPath(value, object) {\n if (isArray(value)) {\n return value;\n }\n return isKey(value, object) ? [value] : stringToPath(toString(value));\n}\n\nmodule.exports = castPath;\n", + "var isSymbol = require('./isSymbol');\n\n/**\n * Compares values to sort them in ascending order.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {number} Returns the sort order indicator for `)) + ("`" + (`value` + "`"))))) + ((((`.\n */\nfunction compareAscending(value, other) {\n if (value !== other) {\n var valIsDefined = value !== undefined,\n valIsNull = value === null,\n valIsReflexive = value === value,\n valIsSymbol = isSymbol(value);\n\n var othIsDefined = other !== undefined,\n othIsNull = other === null,\n othIsReflexive = other === other,\n othIsSymbol = isSymbol(other);\n\n if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) ||\n (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) ||\n (valIsNull && othIsDefined && othIsReflexive) ||\n (!valIsDefined && othIsReflexive) ||\n !valIsReflexive) {\n return 1;\n }\n if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) ||\n (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) ||\n (othIsNull && valIsDefined && valIsReflexive) ||\n (!othIsDefined && valIsReflexive) ||\n !othIsReflexive) {\n return -1;\n }\n }\n return 0;\n}\n\nmodule.exports = compareAscending;\n", + "var compareAscending = require('./_compareAscending');\n\n/**\n * Used by ` + ("`" + `_.orderBy`)) + ("`" + (` to compare multiple properties of a value to another\n * and stable sort them.\n *\n * If ` + "`"))) + ((`orders` + ("`" + ` is unspecified, all values are sorted in ascending order. Otherwise,\n * specify an order of \"desc\" for descending or \"asc\" for ascending sort order\n * of corresponding values.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {boolean[]|string[]} orders The order to sort by for each property.\n * @returns {number} Returns the sort order indicator for `)) + ("`" + (`object` + "`")))) + (((`.\n */\nfunction compareMultiple(object, other, orders) {\n var index = -1,\n objCriteria = object.criteria,\n othCriteria = other.criteria,\n length = objCriteria.length,\n ordersLength = orders.length;\n\n while (++index < length) {\n var result = compareAscending(objCriteria[index], othCriteria[index]);\n if (result) {\n if (index >= ordersLength) {\n return result;\n }\n var order = orders[index];\n return result * (order == 'desc' ? -1 : 1);\n }\n }\n // Fixes an ` + ("`" + `Array#sort`)) + ("`" + (` bug in the JS engine embedded in Adobe applications\n // that causes it, under certain circumstances, to provide the same value for\n // ` + "`"))) + ((`object` + ("`" + ` and `)) + (("`" + `other`) + ("`" + `. See https://github.com/jashkenas/underscore/pull/1247\n // for more details.\n //\n // This also ensures a stable sort in V8 and other engines.\n // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details.\n return object.index - other.index;\n}\n\nmodule.exports = compareMultiple;\n", "var root = require('./_root');\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\nmodule.exports = coreJsData;\n", - "var isArrayLike = require('./isArrayLike');\n\n/**\n * Creates a ` + ("`" + `baseEach`)) + ("`" + (` or ` + "`")))) + (((`baseEachRight` + "`") + (` function.\n *\n * @private\n * @param {Function} eachFunc The function to iterate over a collection.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseEach(eachFunc, fromRight) {\n return function(collection, iteratee) {\n if (collection == null) {\n return collection;\n }\n if (!isArrayLike(collection)) {\n return eachFunc(collection, iteratee);\n }\n var length = collection.length,\n index = fromRight ? length : -1,\n iterable = Object(collection);\n\n while ((fromRight ? index-- : ++index < length)) {\n if (iteratee(iterable[index], index, iterable) === false) {\n break;\n }\n }\n return collection;\n };\n}\n\nmodule.exports = createBaseEach;\n", - "/**\n * Creates a base function for methods like ` + ("`" + `_.forIn`))) + (("`" + (` and ` + "`")) + (`_.forOwn` + ("`" + `.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseFor(fromRight) {\n return function(object, iteratee, keysFunc) {\n var index = -1,\n iterable = Object(object),\n props = keysFunc(object),\n length = props.length;\n\n while (length--) {\n var key = props[fromRight ? length : ++index];\n if (iteratee(iterable[key], key, iterable) === false) {\n break;\n }\n }\n return object;\n };\n}\n\nmodule.exports = createBaseFor;\n", - "var baseIteratee = require('./_baseIteratee'),\n isArrayLike = require('./isArrayLike'),\n keys = require('./keys');\n\n/**\n * Creates a `)))))) + ((((("`" + `_.find`) + ("`" + (` or ` + "`"))) + ((`_.findLast` + ("`" + ` function.\n *\n * @private\n * @param {Function} findIndexFunc The function to find the collection index.\n * @returns {Function} Returns the new find function.\n */\nfunction createFind(findIndexFunc) {\n return function(collection, predicate, fromIndex) {\n var iterable = Object(collection);\n if (!isArrayLike(collection)) {\n var iteratee = baseIteratee(predicate, 3);\n collection = keys(collection);\n predicate = function(key) { return iteratee(iterable[key], key, iterable); };\n }\n var index = findIndexFunc(collection, predicate, fromIndex);\n return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;\n };\n}\n\nmodule.exports = createFind;\n", - "var baseRange = require('./_baseRange'),\n isIterateeCall = require('./_isIterateeCall'),\n toFinite = require('./toFinite');\n\n/**\n * Creates a `)) + ("`" + (`_.range` + "`")))) + (((` or ` + "`") + (`_.rangeRight` + ("`" + ` function.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new range function.\n */\nfunction createRange(fromRight) {\n return function(start, end, step) {\n if (step && typeof step != 'number' && isIterateeCall(start, end, step)) {\n end = step = undefined;\n }\n // Ensure the sign of `))) + (("`" + (`-0` + "`")) + (` is preserved.\n start = toFinite(start);\n if (end === undefined) {\n end = start;\n start = 0;\n } else {\n end = toFinite(end);\n }\n step = step === undefined ? (start < end ? 1 : -1) : toFinite(step);\n return baseRange(start, end, step, fromRight);\n };\n}\n\nmodule.exports = createRange;\n", - "var Set = require('./_Set'),\n noop = require('./noop'),\n setToArray = require('./_setToArray');\n\n/** Used as references for various ` + ("`" + `Number`))))) + (((("`" + ` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Creates a set object of `) + ("`" + (`values` + "`"))) + ((`.\n *\n * @private\n * @param {Array} values The values to add to the set.\n * @returns {Object} Returns the new set.\n */\nvar createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) {\n return new Set(values);\n};\n\nmodule.exports = createSet;\n", + "var isArrayLike = require('./isArrayLike');\n\n/**\n * Creates a `)))))) + ((((("`" + (`baseEach` + "`")) + (` or ` + ("`" + `baseEachRight`))) + (("`" + (` function.\n *\n * @private\n * @param {Function} eachFunc The function to iterate over a collection.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseEach(eachFunc, fromRight) {\n return function(collection, iteratee) {\n if (collection == null) {\n return collection;\n }\n if (!isArrayLike(collection)) {\n return eachFunc(collection, iteratee);\n }\n var length = collection.length,\n index = fromRight ? length : -1,\n iterable = Object(collection);\n\n while ((fromRight ? index-- : ++index < length)) {\n if (iteratee(iterable[index], index, iterable) === false) {\n break;\n }\n }\n return collection;\n };\n}\n\nmodule.exports = createBaseEach;\n", + "/**\n * Creates a base function for methods like ` + "`")) + (`_.forIn` + ("`" + ` and `)))) + ((("`" + (`_.forOwn` + "`")) + (`.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseFor(fromRight) {\n return function(object, iteratee, keysFunc) {\n var index = -1,\n iterable = Object(object),\n props = keysFunc(object),\n length = props.length;\n\n while (length--) {\n var key = props[fromRight ? length : ++index];\n if (iteratee(iterable[key], key, iterable) === false) {\n break;\n }\n }\n return object;\n };\n}\n\nmodule.exports = createBaseFor;\n", + "var baseIteratee = require('./_baseIteratee'),\n isArrayLike = require('./isArrayLike'),\n keys = require('./keys');\n\n/**\n * Creates a ` + ("`" + `_.find`))) + (("`" + (` or ` + "`")) + ((`_.findLast` + "`") + (` function.\n *\n * @private\n * @param {Function} findIndexFunc The function to find the collection index.\n * @returns {Function} Returns the new find function.\n */\nfunction createFind(findIndexFunc) {\n return function(collection, predicate, fromIndex) {\n var iterable = Object(collection);\n if (!isArrayLike(collection)) {\n var iteratee = baseIteratee(predicate, 3);\n collection = keys(collection);\n predicate = function(key) { return iteratee(iterable[key], key, iterable); };\n }\n var index = findIndexFunc(collection, predicate, fromIndex);\n return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;\n };\n}\n\nmodule.exports = createFind;\n", + "var baseRange = require('./_baseRange'),\n isIterateeCall = require('./_isIterateeCall'),\n toFinite = require('./toFinite');\n\n/**\n * Creates a ` + "`"))))) + ((((`_.range` + ("`" + ` or `)) + ("`" + (`_.rangeRight` + "`"))) + ((` function.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new range function.\n */\nfunction createRange(fromRight) {\n return function(start, end, step) {\n if (step && typeof step != 'number' && isIterateeCall(start, end, step)) {\n end = step = undefined;\n }\n // Ensure the sign of ` + ("`" + `-0`)) + ("`" + (` is preserved.\n start = toFinite(start);\n if (end === undefined) {\n end = start;\n start = 0;\n } else {\n end = toFinite(end);\n }\n step = step === undefined ? (start < end ? 1 : -1) : toFinite(step);\n return baseRange(start, end, step, fromRight);\n };\n}\n\nmodule.exports = createRange;\n", + "var Set = require('./_Set'),\n noop = require('./noop'),\n setToArray = require('./_setToArray');\n\n/** Used as references for various ` + "`")))) + (((`Number` + ("`" + ` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Creates a set object of `)) + ("`" + (`values` + "`"))) + ((`.\n *\n * @private\n * @param {Array} values The values to add to the set.\n * @returns {Object} Returns the new set.\n */\nvar createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) {\n return new Set(values);\n};\n\nmodule.exports = createSet;\n", "var getNative = require('./_getNative');\n\nvar defineProperty = (function() {\n try {\n var func = getNative(Object, 'defineProperty');\n func({}, '', {});\n return func;\n } catch (e) {}\n}());\n\nmodule.exports = defineProperty;\n", - "var SetCache = require('./_SetCache'),\n arraySome = require('./_arraySome'),\n cacheHas = require('./_cacheHas');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * A specialized version of ` + ("`" + `baseIsEqualDeep`)) + ("`" + (` for arrays with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Array} array The array to compare.\n * @param {Array} other The other array to compare.\n * @param {number} bitmask The bitmask flags. See ` + "`")))) + (((`baseIsEqual` + "`") + (` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed ` + ("`" + `array`))) + (("`" + (` and ` + "`")) + (`other` + ("`" + ` objects.\n * @returns {boolean} Returns `))))))) + (((((("`" + `true`) + ("`" + (` if the arrays are equivalent, else ` + "`"))) + ((`false` + ("`" + `.\n */\nfunction equalArrays(array, other, bitmask, customizer, equalFunc, stack) {\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n arrLength = array.length,\n othLength = other.length;\n\n if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\n return false;\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(array);\n if (stacked && stack.get(other)) {\n return stacked == other;\n }\n var index = -1,\n result = true,\n seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;\n\n stack.set(array, other);\n stack.set(other, array);\n\n // Ignore non-index properties.\n while (++index < arrLength) {\n var arrValue = array[index],\n othValue = other[index];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, arrValue, index, other, array, stack)\n : customizer(arrValue, othValue, index, array, other, stack);\n }\n if (compared !== undefined) {\n if (compared) {\n continue;\n }\n result = false;\n break;\n }\n // Recursively compare arrays (susceptible to call stack limits).\n if (seen) {\n if (!arraySome(other, function(othValue, othIndex) {\n if (!cacheHas(seen, othIndex) &&\n (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\n return seen.push(othIndex);\n }\n })) {\n result = false;\n break;\n }\n } else if (!(\n arrValue === othValue ||\n equalFunc(arrValue, othValue, bitmask, customizer, stack)\n )) {\n result = false;\n break;\n }\n }\n stack['delete'](array);\n stack['delete'](other);\n return result;\n}\n\nmodule.exports = equalArrays;\n", - "var Symbol = require('./_Symbol'),\n Uint8Array = require('./_Uint8Array'),\n eq = require('./eq'),\n equalArrays = require('./_equalArrays'),\n mapToArray = require('./_mapToArray'),\n setToArray = require('./_setToArray');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/** `)) + ("`" + (`Object#toString` + "`")))) + (((` result references. */\nvar boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]';\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\n\n/**\n * A specialized version of ` + "`") + (`baseIsEqualDeep` + ("`" + ` for comparing objects of\n * the same `))) + (("`" + (`toStringTag` + "`")) + (`.\n *\n * **Note:** This function only supports comparing values with tags of\n * ` + ("`" + `Boolean`))))) + (((("`" + `, `) + ("`" + (`Date` + "`"))) + ((`, ` + ("`" + `Error`)) + ("`" + (`, ` + "`")))) + (((`Number` + "`") + (`, ` + ("`" + `RegExp`))) + (("`" + (`, or ` + "`")) + (`String` + ("`" + `.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {string} tag The `)))))) + ((((("`" + `toStringTag`) + ("`" + (` of the objects to compare.\n * @param {number} bitmask The bitmask flags. See ` + "`"))) + ((`baseIsEqual` + ("`" + ` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `)) + ("`" + (`object` + "`")))) + (((` and ` + "`") + (`other` + ("`" + ` objects.\n * @returns {boolean} Returns `))) + (("`" + (`true` + "`")) + (` if the objects are equivalent, else ` + ("`" + `false`))))) + (((("`" + `.\n */\nfunction equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {\n switch (tag) {\n case dataViewTag:\n if ((object.byteLength != other.byteLength) ||\n (object.byteOffset != other.byteOffset)) {\n return false;\n }\n object = object.buffer;\n other = other.buffer;\n\n case arrayBufferTag:\n if ((object.byteLength != other.byteLength) ||\n !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\n return false;\n }\n return true;\n\n case boolTag:\n case dateTag:\n case numberTag:\n // Coerce booleans to `) + ("`" + (`1` + "`"))) + ((` or ` + ("`" + `0`)) + ("`" + (` and dates to milliseconds.\n // Invalid dates are coerced to ` + "`")))) + (((`NaN` + ("`" + `.\n return eq(+object, +other);\n\n case errorTag:\n return object.name == other.name && object.message == other.message;\n\n case regexpTag:\n case stringTag:\n // Coerce regexes to strings and treat strings, primitives and objects,\n // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\n // for more details.\n return object == (other + '');\n\n case mapTag:\n var convert = mapToArray;\n\n case setTag:\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG;\n convert || (convert = setToArray);\n\n if (object.size != other.size && !isPartial) {\n return false;\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(object);\n if (stacked) {\n return stacked == other;\n }\n bitmask |= COMPARE_UNORDERED_FLAG;\n\n // Recursively compare objects (susceptible to call stack limits).\n stack.set(object, other);\n var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);\n stack['delete'](object);\n return result;\n\n case symbolTag:\n if (symbolValueOf) {\n return symbolValueOf.call(object) == symbolValueOf.call(other);\n }\n }\n return false;\n}\n\nmodule.exports = equalByTag;\n", - "var getAllKeys = require('./_getAllKeys');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1;\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A specialized version of `)) + ("`" + (`baseIsEqualDeep` + "`"))) + ((` for objects with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See ` + ("`" + `baseIsEqual`)) + ("`" + (` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed ` + "`"))))))))) + ((((((((`object` + "`") + (` and ` + ("`" + `other`))) + (("`" + (` objects.\n * @returns {boolean} Returns ` + "`")) + (`true` + ("`" + ` if the objects are equivalent, else `)))) + ((("`" + `false`) + ("`" + (`.\n */\nfunction equalObjects(object, other, bitmask, customizer, equalFunc, stack) {\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n objProps = getAllKeys(object),\n objLength = objProps.length,\n othProps = getAllKeys(other),\n othLength = othProps.length;\n\n if (objLength != othLength && !isPartial) {\n return false;\n }\n var index = objLength;\n while (index--) {\n var key = objProps[index];\n if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\n return false;\n }\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(object);\n if (stacked && stack.get(other)) {\n return stacked == other;\n }\n var result = true;\n stack.set(object, other);\n stack.set(other, object);\n\n var skipCtor = isPartial;\n while (++index < objLength) {\n key = objProps[index];\n var objValue = object[key],\n othValue = other[key];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, objValue, key, other, object, stack)\n : customizer(objValue, othValue, key, object, other, stack);\n }\n // Recursively compare objects (susceptible to call stack limits).\n if (!(compared === undefined\n ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))\n : compared\n )) {\n result = false;\n break;\n }\n skipCtor || (skipCtor = key == 'constructor');\n }\n if (result && !skipCtor) {\n var objCtor = object.constructor,\n othCtor = other.constructor;\n\n // Non ` + "`"))) + ((`Object` + ("`" + ` object instances with different constructors are not equal.\n if (objCtor != othCtor &&\n ('constructor' in object && 'constructor' in other) &&\n !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\n typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n result = false;\n }\n }\n stack['delete'](object);\n stack['delete'](other);\n return result;\n}\n\nmodule.exports = equalObjects;\n", - "/** Detect free variable `)) + ("`" + (`global` + "`"))))) + ((((` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nmodule.exports = freeGlobal;\n", - "var baseGetAllKeys = require('./_baseGetAllKeys'),\n getSymbols = require('./_getSymbols'),\n keys = require('./keys');\n\n/**\n * Creates an array of own enumerable property names and symbols of ` + "`") + (`object` + ("`" + `.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction getAllKeys(object) {\n return baseGetAllKeys(object, keys, getSymbols);\n}\n\nmodule.exports = getAllKeys;\n", - "var isKeyable = require('./_isKeyable');\n\n/**\n * Gets the data for `))) + (("`" + (`map` + "`")) + (`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key)\n ? data[typeof key == 'string' ? 'string' : 'hash']\n : data.map;\n}\n\nmodule.exports = getMapData;\n", - "var isStrictComparable = require('./_isStrictComparable'),\n keys = require('./keys');\n\n/**\n * Gets the property names, values, and compare flags of ` + ("`" + `object`)))) + ((("`" + `.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the match data of `) + ("`" + (`object` + "`"))) + ((`.\n */\nfunction getMatchData(object) {\n var result = keys(object),\n length = result.length;\n\n while (length--) {\n var key = result[length],\n value = object[key];\n\n result[length] = [key, value, isStrictComparable(value)];\n }\n return result;\n}\n\nmodule.exports = getMatchData;\n", - "var baseIsNative = require('./_baseIsNative'),\n getValue = require('./_getValue');\n\n/**\n * Gets the native function at ` + ("`" + `key`)) + ("`" + (` of ` + "`")))))) + (((((`object` + "`") + (`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else ` + ("`" + `undefined`))) + (("`" + (`.\n */\nfunction getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n}\n\nmodule.exports = getNative;\n", + "var SetCache = require('./_SetCache'),\n arraySome = require('./_arraySome'),\n cacheHas = require('./_cacheHas');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * A specialized version of ` + ("`" + `baseIsEqualDeep`)) + (("`" + ` for arrays with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Array} array The array to compare.\n * @param {Array} other The other array to compare.\n * @param {number} bitmask The bitmask flags. See `) + ("`" + `baseIsEqual`))))))) + (((((("`" + (` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed ` + "`")) + (`array` + ("`" + ` and `))) + (("`" + (`other` + "`")) + (` objects.\n * @returns {boolean} Returns ` + ("`" + `true`)))) + ((("`" + (` if the arrays are equivalent, else ` + "`")) + (`false` + ("`" + `.\n */\nfunction equalArrays(array, other, bitmask, customizer, equalFunc, stack) {\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n arrLength = array.length,\n othLength = other.length;\n\n if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\n return false;\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(array);\n if (stacked && stack.get(other)) {\n return stacked == other;\n }\n var index = -1,\n result = true,\n seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;\n\n stack.set(array, other);\n stack.set(other, array);\n\n // Ignore non-index properties.\n while (++index < arrLength) {\n var arrValue = array[index],\n othValue = other[index];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, arrValue, index, other, array, stack)\n : customizer(arrValue, othValue, index, array, other, stack);\n }\n if (compared !== undefined) {\n if (compared) {\n continue;\n }\n result = false;\n break;\n }\n // Recursively compare arrays (susceptible to call stack limits).\n if (seen) {\n if (!arraySome(other, function(othValue, othIndex) {\n if (!cacheHas(seen, othIndex) &&\n (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\n return seen.push(othIndex);\n }\n })) {\n result = false;\n break;\n }\n } else if (!(\n arrValue === othValue ||\n equalFunc(arrValue, othValue, bitmask, customizer, stack)\n )) {\n result = false;\n break;\n }\n }\n stack['delete'](array);\n stack['delete'](other);\n return result;\n}\n\nmodule.exports = equalArrays;\n", + "var Symbol = require('./_Symbol'),\n Uint8Array = require('./_Uint8Array'),\n eq = require('./eq'),\n equalArrays = require('./_equalArrays'),\n mapToArray = require('./_mapToArray'),\n setToArray = require('./_setToArray');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/** `))) + (("`" + (`Object#toString` + "`")) + (` result references. */\nvar boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]';\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\n\n/**\n * A specialized version of ` + ("`" + `baseIsEqualDeep`))))) + (((("`" + (` for comparing objects of\n * the same ` + "`")) + (`toStringTag` + ("`" + `.\n *\n * **Note:** This function only supports comparing values with tags of\n * `))) + (("`" + (`Boolean` + "`")) + (`, ` + ("`" + `Date`)))) + ((("`" + (`, ` + "`")) + (`Error` + ("`" + `, `))) + (("`" + (`Number` + "`")) + ((`, ` + "`") + (`RegExp` + "`")))))) + (((((`, or ` + ("`" + `String`)) + ("`" + (`.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {string} tag The ` + "`"))) + ((`toStringTag` + ("`" + ` of the objects to compare.\n * @param {number} bitmask The bitmask flags. See `)) + ("`" + (`baseIsEqual` + "`")))) + (((` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed ` + ("`" + `object`)) + ("`" + (` and ` + "`"))) + ((`other` + ("`" + ` objects.\n * @returns {boolean} Returns `)) + (("`" + `true`) + ("`" + ` if the objects are equivalent, else `))))) + (((("`" + (`false` + "`")) + (`.\n */\nfunction equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {\n switch (tag) {\n case dataViewTag:\n if ((object.byteLength != other.byteLength) ||\n (object.byteOffset != other.byteOffset)) {\n return false;\n }\n object = object.buffer;\n other = other.buffer;\n\n case arrayBufferTag:\n if ((object.byteLength != other.byteLength) ||\n !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\n return false;\n }\n return true;\n\n case boolTag:\n case dateTag:\n case numberTag:\n // Coerce booleans to ` + ("`" + `1`))) + (("`" + (` or ` + "`")) + (`0` + ("`" + ` and dates to milliseconds.\n // Invalid dates are coerced to `)))) + ((("`" + (`NaN` + "`")) + (`.\n return eq(+object, +other);\n\n case errorTag:\n return object.name == other.name && object.message == other.message;\n\n case regexpTag:\n case stringTag:\n // Coerce regexes to strings and treat strings, primitives and objects,\n // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\n // for more details.\n return object == (other + '');\n\n case mapTag:\n var convert = mapToArray;\n\n case setTag:\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG;\n convert || (convert = setToArray);\n\n if (object.size != other.size && !isPartial) {\n return false;\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(object);\n if (stacked) {\n return stacked == other;\n }\n bitmask |= COMPARE_UNORDERED_FLAG;\n\n // Recursively compare objects (susceptible to call stack limits).\n stack.set(object, other);\n var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);\n stack['delete'](object);\n return result;\n\n case symbolTag:\n if (symbolValueOf) {\n return symbolValueOf.call(object) == symbolValueOf.call(other);\n }\n }\n return false;\n}\n\nmodule.exports = equalByTag;\n", + "var getAllKeys = require('./_getAllKeys');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1;\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A specialized version of ` + ("`" + `baseIsEqualDeep`))) + (("`" + (` for objects with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See ` + "`")) + ((`baseIsEqual` + "`") + (` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed ` + "`"))))))))) + ((((((((`object` + ("`" + ` and `)) + ("`" + (`other` + "`"))) + ((` objects.\n * @returns {boolean} Returns ` + ("`" + `true`)) + ("`" + (` if the objects are equivalent, else ` + "`")))) + (((`false` + ("`" + `.\n */\nfunction equalObjects(object, other, bitmask, customizer, equalFunc, stack) {\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n objProps = getAllKeys(object),\n objLength = objProps.length,\n othProps = getAllKeys(other),\n othLength = othProps.length;\n\n if (objLength != othLength && !isPartial) {\n return false;\n }\n var index = objLength;\n while (index--) {\n var key = objProps[index];\n if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\n return false;\n }\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(object);\n if (stacked && stack.get(other)) {\n return stacked == other;\n }\n var result = true;\n stack.set(object, other);\n stack.set(other, object);\n\n var skipCtor = isPartial;\n while (++index < objLength) {\n key = objProps[index];\n var objValue = object[key],\n othValue = other[key];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, objValue, key, other, object, stack)\n : customizer(objValue, othValue, key, object, other, stack);\n }\n // Recursively compare objects (susceptible to call stack limits).\n if (!(compared === undefined\n ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))\n : compared\n )) {\n result = false;\n break;\n }\n skipCtor || (skipCtor = key == 'constructor');\n }\n if (result && !skipCtor) {\n var objCtor = object.constructor,\n othCtor = other.constructor;\n\n // Non `)) + ("`" + (`Object` + "`"))) + ((` object instances with different constructors are not equal.\n if (objCtor != othCtor &&\n ('constructor' in object && 'constructor' in other) &&\n !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\n typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n result = false;\n }\n }\n stack['delete'](object);\n stack['delete'](other);\n return result;\n}\n\nmodule.exports = equalObjects;\n", + "/** Detect free variable ` + ("`" + `global`)) + ("`" + (` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nmodule.exports = freeGlobal;\n", + "var baseGetAllKeys = require('./_baseGetAllKeys'),\n getSymbols = require('./_getSymbols'),\n keys = require('./keys');\n\n/**\n * Creates an array of own enumerable property names and symbols of ` + "`"))))) + ((((`object` + ("`" + `.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction getAllKeys(object) {\n return baseGetAllKeys(object, keys, getSymbols);\n}\n\nmodule.exports = getAllKeys;\n", + "var isKeyable = require('./_isKeyable');\n\n/**\n * Gets the data for `)) + ("`" + (`map` + "`"))) + ((`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key)\n ? data[typeof key == 'string' ? 'string' : 'hash']\n : data.map;\n}\n\nmodule.exports = getMapData;\n", + "var isStrictComparable = require('./_isStrictComparable'),\n keys = require('./keys');\n\n/**\n * Gets the property names, values, and compare flags of ` + ("`" + `object`)) + ("`" + (`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the match data of ` + "`")))) + (((`object` + ("`" + `.\n */\nfunction getMatchData(object) {\n var result = keys(object),\n length = result.length;\n\n while (length--) {\n var key = result[length],\n value = object[key];\n\n result[length] = [key, value, isStrictComparable(value)];\n }\n return result;\n}\n\nmodule.exports = getMatchData;\n", + "var baseIsNative = require('./_baseIsNative'),\n getValue = require('./_getValue');\n\n/**\n * Gets the native function at `)) + ("`" + (`key` + "`"))) + ((` of ` + ("`" + `object`)) + (("`" + `.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `) + ("`" + `undefined`)))))) + ((((("`" + (`.\n */\nfunction getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n}\n\nmodule.exports = getNative;\n", "var overArg = require('./_overArg');\n\n/** Built-in value references. */\nvar getPrototype = overArg(Object.getPrototypeOf, Object);\n\nmodule.exports = getPrototype;\n", - "var Symbol = require('./_Symbol');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [` + "`")) + (`toStringTag` + ("`" + `](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `)))) + ((("`" + `baseGetTag`) + ("`" + (` which ignores ` + "`"))) + ((`Symbol.toStringTag` + ("`" + ` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `)) + ("`" + (`toStringTag` + "`"))))) + ((((`.\n */\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n}\n\nmodule.exports = getRawTag;\n", - "var arrayFilter = require('./_arrayFilter'),\n stubArray = require('./stubArray');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/* Built-in method references for those with the same name as other ` + "`") + (`lodash` + ("`" + ` methods. */\nvar nativeGetSymbols = Object.getOwnPropertySymbols;\n\n/**\n * Creates an array of the own enumerable symbols of `))) + (("`" + (`object` + "`")) + (`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\nvar getSymbols = !nativeGetSymbols ? stubArray : function(object) {\n if (object == null) {\n return [];\n }\n object = Object(object);\n return arrayFilter(nativeGetSymbols(object), function(symbol) {\n return propertyIsEnumerable.call(object, symbol);\n });\n};\n\nmodule.exports = getSymbols;\n", - "var DataView = require('./_DataView'),\n Map = require('./_Map'),\n Promise = require('./_Promise'),\n Set = require('./_Set'),\n WeakMap = require('./_WeakMap'),\n baseGetTag = require('./_baseGetTag'),\n toSource = require('./_toSource');\n\n/** ` + ("`" + `Object#toString`)))) + ((("`" + ` result references. */\nvar mapTag = '[object Map]',\n objectTag = '[object Object]',\n promiseTag = '[object Promise]',\n setTag = '[object Set]',\n weakMapTag = '[object WeakMap]';\n\nvar dataViewTag = '[object DataView]';\n\n/** Used to detect maps, sets, and weakmaps. */\nvar dataViewCtorString = toSource(DataView),\n mapCtorString = toSource(Map),\n promiseCtorString = toSource(Promise),\n setCtorString = toSource(Set),\n weakMapCtorString = toSource(WeakMap);\n\n/**\n * Gets the `) + ("`" + (`toStringTag` + "`"))) + ((` of ` + ("`" + `value`)) + ("`" + (`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the ` + "`"))))))) + ((((((`toStringTag` + "`") + (`.\n */\nvar getTag = baseGetTag;\n\n// Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\nif ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n (Map && getTag(new Map) != mapTag) ||\n (Promise && getTag(Promise.resolve()) != promiseTag) ||\n (Set && getTag(new Set) != setTag) ||\n (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n getTag = function(value) {\n var result = baseGetTag(value),\n Ctor = result == objectTag ? value.constructor : undefined,\n ctorString = Ctor ? toSource(Ctor) : '';\n\n if (ctorString) {\n switch (ctorString) {\n case dataViewCtorString: return dataViewTag;\n case mapCtorString: return mapTag;\n case promiseCtorString: return promiseTag;\n case setCtorString: return setTag;\n case weakMapCtorString: return weakMapTag;\n }\n }\n return result;\n };\n}\n\nmodule.exports = getTag;\n", - "/**\n * Gets the value at ` + ("`" + `key`))) + (("`" + (` of ` + "`")) + (`object` + ("`" + `.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n return object == null ? undefined : object[key];\n}\n\nmodule.exports = getValue;\n", - "var castPath = require('./_castPath'),\n isArguments = require('./isArguments'),\n isArray = require('./isArray'),\n isIndex = require('./_isIndex'),\n isLength = require('./isLength'),\n toKey = require('./_toKey');\n\n/**\n * Checks if `)))) + ((("`" + `path`) + ("`" + (` exists on ` + "`"))) + ((`object` + ("`" + `.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @param {Function} hasFunc The function to check properties.\n * @returns {boolean} Returns `)) + ("`" + (`true` + "`"))))) + ((((` if ` + "`") + (`path` + ("`" + ` exists, else `))) + (("`" + (`false` + "`")) + (`.\n */\nfunction hasPath(object, path, hasFunc) {\n path = castPath(path, object);\n\n var index = -1,\n length = path.length,\n result = false;\n\n while (++index < length) {\n var key = toKey(path[index]);\n if (!(result = object != null && hasFunc(object, key))) {\n break;\n }\n object = object[key];\n }\n if (result || ++index != length) {\n return result;\n }\n length = object == null ? 0 : object.length;\n return !!length && isLength(length) && isIndex(key, length) &&\n (isArray(object) || isArguments(object));\n}\n\nmodule.exports = hasPath;\n", + "var Symbol = require('./_Symbol');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [` + "`")) + (`toStringTag` + ("`" + `](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `))) + (("`" + (`baseGetTag` + "`")) + (` which ignores ` + ("`" + `Symbol.toStringTag`)))) + ((("`" + (` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw ` + "`")) + (`toStringTag` + ("`" + `.\n */\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n}\n\nmodule.exports = getRawTag;\n", + "var arrayFilter = require('./_arrayFilter'),\n stubArray = require('./stubArray');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/* Built-in method references for those with the same name as other `))) + (("`" + (`lodash` + "`")) + ((` methods. */\nvar nativeGetSymbols = Object.getOwnPropertySymbols;\n\n/**\n * Creates an array of the own enumerable symbols of ` + "`") + (`object` + "`"))))) + ((((`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\nvar getSymbols = !nativeGetSymbols ? stubArray : function(object) {\n if (object == null) {\n return [];\n }\n object = Object(object);\n return arrayFilter(nativeGetSymbols(object), function(symbol) {\n return propertyIsEnumerable.call(object, symbol);\n });\n};\n\nmodule.exports = getSymbols;\n", + "var DataView = require('./_DataView'),\n Map = require('./_Map'),\n Promise = require('./_Promise'),\n Set = require('./_Set'),\n WeakMap = require('./_WeakMap'),\n baseGetTag = require('./_baseGetTag'),\n toSource = require('./_toSource');\n\n/** ` + ("`" + `Object#toString`)) + ("`" + (` result references. */\nvar mapTag = '[object Map]',\n objectTag = '[object Object]',\n promiseTag = '[object Promise]',\n setTag = '[object Set]',\n weakMapTag = '[object WeakMap]';\n\nvar dataViewTag = '[object DataView]';\n\n/** Used to detect maps, sets, and weakmaps. */\nvar dataViewCtorString = toSource(DataView),\n mapCtorString = toSource(Map),\n promiseCtorString = toSource(Promise),\n setCtorString = toSource(Set),\n weakMapCtorString = toSource(WeakMap);\n\n/**\n * Gets the ` + "`"))) + ((`toStringTag` + ("`" + ` of `)) + ("`" + (`value` + "`")))) + (((`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the ` + ("`" + `toStringTag`)) + ("`" + (`.\n */\nvar getTag = baseGetTag;\n\n// Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\nif ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n (Map && getTag(new Map) != mapTag) ||\n (Promise && getTag(Promise.resolve()) != promiseTag) ||\n (Set && getTag(new Set) != setTag) ||\n (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n getTag = function(value) {\n var result = baseGetTag(value),\n Ctor = result == objectTag ? value.constructor : undefined,\n ctorString = Ctor ? toSource(Ctor) : '';\n\n if (ctorString) {\n switch (ctorString) {\n case dataViewCtorString: return dataViewTag;\n case mapCtorString: return mapTag;\n case promiseCtorString: return promiseTag;\n case setCtorString: return setTag;\n case weakMapCtorString: return weakMapTag;\n }\n }\n return result;\n };\n}\n\nmodule.exports = getTag;\n", + "/**\n * Gets the value at ` + "`"))) + ((`key` + ("`" + ` of `)) + (("`" + `object`) + ("`" + `.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n return object == null ? undefined : object[key];\n}\n\nmodule.exports = getValue;\n", + "var castPath = require('./_castPath'),\n isArguments = require('./isArguments'),\n isArray = require('./isArray'),\n isIndex = require('./_isIndex'),\n isLength = require('./isLength'),\n toKey = require('./_toKey');\n\n/**\n * Checks if `))))))) + (((((("`" + (`path` + "`")) + (` exists on ` + ("`" + `object`))) + (("`" + (`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @param {Function} hasFunc The function to check properties.\n * @returns {boolean} Returns ` + "`")) + (`true` + ("`" + ` if `)))) + ((("`" + (`path` + "`")) + (` exists, else ` + ("`" + `false`))) + (("`" + (`.\n */\nfunction hasPath(object, path, hasFunc) {\n path = castPath(path, object);\n\n var index = -1,\n length = path.length,\n result = false;\n\n while (++index < length) {\n var key = toKey(path[index]);\n if (!(result = object != null && hasFunc(object, key))) {\n break;\n }\n object = object[key];\n }\n if (result || ++index != length) {\n return result;\n }\n length = object == null ? 0 : object.length;\n return !!length && isLength(length) && isIndex(key, length) &&\n (isArray(object) || isArguments(object));\n}\n\nmodule.exports = hasPath;\n", "var nativeCreate = require('./_nativeCreate');\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n this.size = 0;\n}\n\nmodule.exports = hashClear;\n", - "/**\n * Removes ` + ("`" + `key`)))) + ((("`" + ` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `) + ("`" + (`true` + "`"))) + ((` if the entry was removed, else ` + ("`" + `false`)) + ("`" + (`.\n */\nfunction hashDelete(key) {\n var result = this.has(key) && delete this.__data__[key];\n this.size -= result ? 1 : 0;\n return result;\n}\n\nmodule.exports = hashDelete;\n", - "var nativeCreate = require('./_nativeCreate');\n\n/** Used to stand-in for ` + "`")))))) + (((((`undefined` + "`") + (` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Gets the hash value for ` + ("`" + `key`))) + (("`" + (`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n var data = this.__data__;\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\nmodule.exports = hashGet;\n", - "var nativeCreate = require('./_nativeCreate');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Checks if a hash value for ` + "`")) + (`key` + ("`" + ` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `)))) + ((("`" + `true`) + ("`" + (` if an entry for ` + "`"))) + ((`key` + ("`" + ` exists, else `)) + ("`" + (`false` + "`"))))) + ((((`.\n */\nfunction hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n}\n\nmodule.exports = hashHas;\n", - "var nativeCreate = require('./_nativeCreate');\n\n/** Used to stand-in for ` + "`") + (`undefined` + ("`" + ` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Sets the hash `))) + (("`" + (`key` + "`")) + (` to ` + ("`" + `value`)))) + ((("`" + (`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n var data = this.__data__;\n this.size += this.has(key) ? 0 : 1;\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n return this;\n}\n\nmodule.exports = hashSet;\n", - "var Symbol = require('./_Symbol'),\n isArguments = require('./isArguments'),\n isArray = require('./isArray');\n\n/** Built-in value references. */\nvar spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined;\n\n/**\n * Checks if ` + "`")) + (`value` + ("`" + ` is a flattenable `))) + (("`" + (`arguments` + "`")) + (` object or array.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns ` + ("`" + `true`)))))))) + ((((((("`" + ` if `) + ("`" + (`value` + "`"))) + ((` is flattenable, else ` + ("`" + `false`)) + ("`" + (`.\n */\nfunction isFlattenable(value) {\n return isArray(value) || isArguments(value) ||\n !!(spreadableSymbol && value && value[spreadableSymbol]);\n}\n\nmodule.exports = isFlattenable;\n", - "/** Used as references for various ` + "`")))) + (((`Number` + "`") + (` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/**\n * Checks if ` + ("`" + `value`))) + (("`" + (` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns ` + "`")) + (`true` + ("`" + ` if `))))) + (((("`" + `value`) + ("`" + (` is a valid index, else ` + "`"))) + ((`false` + ("`" + `.\n */\nfunction isIndex(value, length) {\n var type = typeof value;\n length = length == null ? MAX_SAFE_INTEGER : length;\n\n return !!length &&\n (type == 'number' ||\n (type != 'symbol' && reIsUint.test(value))) &&\n (value > -1 && value % 1 == 0 && value < length);\n}\n\nmodule.exports = isIndex;\n", - "var eq = require('./eq'),\n isArrayLike = require('./isArrayLike'),\n isIndex = require('./_isIndex'),\n isObject = require('./isObject');\n\n/**\n * Checks if the given arguments are from an iteratee call.\n *\n * @private\n * @param {*} value The potential iteratee value argument.\n * @param {*} index The potential iteratee index or key argument.\n * @param {*} object The potential iteratee object argument.\n * @returns {boolean} Returns `)) + ("`" + (`true` + "`")))) + (((` if the arguments are from an iteratee call,\n * else ` + "`") + (`false` + ("`" + `.\n */\nfunction isIterateeCall(value, index, object) {\n if (!isObject(object)) {\n return false;\n }\n var type = typeof index;\n if (type == 'number'\n ? (isArrayLike(object) && isIndex(index, object.length))\n : (type == 'string' && index in object)\n ) {\n return eq(object[index], value);\n }\n return false;\n}\n\nmodule.exports = isIterateeCall;\n", - "var isArray = require('./isArray'),\n isSymbol = require('./isSymbol');\n\n/** Used to match property names within property paths. */\nvar reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n reIsPlainProp = /^\\w*$/;\n\n/**\n * Checks if `))) + (("`" + (`value` + "`")) + (` is a property name and not a property path.\n *\n * @private\n * @param {*} value The value to check.\n * @param {Object} [object] The object to query keys on.\n * @returns {boolean} Returns ` + ("`" + `true`)))))) + ((((("`" + ` if `) + ("`" + (`value` + "`"))) + ((` is a property name, else ` + ("`" + `false`)) + ("`" + (`.\n */\nfunction isKey(value, object) {\n if (isArray(value)) {\n return false;\n }\n var type = typeof value;\n if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n value == null || isSymbol(value)) {\n return true;\n }\n return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n (object != null && value in Object(object));\n}\n\nmodule.exports = isKey;\n", - "/**\n * Checks if ` + "`")))) + (((`value` + "`") + (` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns ` + ("`" + `true`))) + (("`" + (` if ` + "`")) + (`value` + ("`" + ` is suitable, else `))))) + (((("`" + `false`) + ("`" + (`.\n */\nfunction isKeyable(value) {\n var type = typeof value;\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n ? (value !== '__proto__')\n : (value === null);\n}\n\nmodule.exports = isKeyable;\n", - "var coreJsData = require('./_coreJsData');\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/**\n * Checks if ` + "`"))) + ((`func` + ("`" + ` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `)) + ("`" + (`true` + "`")))) + (((` if ` + ("`" + `func`)) + ("`" + (` is masked, else ` + "`"))) + ((`false` + ("`" + `.\n */\nfunction isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n}\n\nmodule.exports = isMasked;\n", - "/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Checks if `)) + ("`" + (`value` + "`"))))))) + ((((((` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns ` + "`") + (`true` + ("`" + ` if `))) + (("`" + (`value` + "`")) + (` is a prototype, else ` + ("`" + `false`)))) + ((("`" + `.\n */\nfunction isPrototype(value) {\n var Ctor = value && value.constructor,\n proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n return value === proto;\n}\n\nmodule.exports = isPrototype;\n", - "var isObject = require('./isObject');\n\n/**\n * Checks if `) + ("`" + (`value` + "`"))) + ((` is suitable for strict equality comparisons, i.e. ` + ("`" + `===`)) + ("`" + (`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns ` + "`"))))) + ((((`true` + "`") + (` if ` + ("`" + `value`))) + (("`" + (` if suitable for strict\n * equality comparisons, else ` + "`")) + (`false` + ("`" + `.\n */\nfunction isStrictComparable(value) {\n return value === value && !isObject(value);\n}\n\nmodule.exports = isStrictComparable;\n", + "/**\n * Removes ` + "`")) + (`key` + ("`" + ` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `))))) + (((("`" + (`true` + "`")) + (` if the entry was removed, else ` + ("`" + `false`))) + (("`" + (`.\n */\nfunction hashDelete(key) {\n var result = this.has(key) && delete this.__data__[key];\n this.size -= result ? 1 : 0;\n return result;\n}\n\nmodule.exports = hashDelete;\n", + "var nativeCreate = require('./_nativeCreate');\n\n/** Used to stand-in for ` + "`")) + (`undefined` + ("`" + ` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Gets the hash value for `)))) + ((("`" + (`key` + "`")) + (`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n var data = this.__data__;\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\nmodule.exports = hashGet;\n", + "var nativeCreate = require('./_nativeCreate');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Checks if a hash value for ` + ("`" + `key`))) + (("`" + (` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns ` + "`")) + ((`true` + "`") + (` if an entry for ` + "`")))))) + (((((`key` + ("`" + ` exists, else `)) + ("`" + (`false` + "`"))) + ((`.\n */\nfunction hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n}\n\nmodule.exports = hashHas;\n", + "var nativeCreate = require('./_nativeCreate');\n\n/** Used to stand-in for ` + ("`" + `undefined`)) + ("`" + (` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Sets the hash ` + "`")))) + (((`key` + ("`" + ` to `)) + ("`" + (`value` + "`"))) + ((`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n var data = this.__data__;\n this.size += this.has(key) ? 0 : 1;\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n return this;\n}\n\nmodule.exports = hashSet;\n", + "var Symbol = require('./_Symbol'),\n isArguments = require('./isArguments'),\n isArray = require('./isArray');\n\n/** Built-in value references. */\nvar spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined;\n\n/**\n * Checks if ` + ("`" + `value`)) + (("`" + ` is a flattenable `) + ("`" + `arguments`))))) + (((("`" + (` object or array.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns ` + "`")) + (`true` + ("`" + ` if `))) + (("`" + (`value` + "`")) + (` is flattenable, else ` + ("`" + `false`)))) + ((("`" + (`.\n */\nfunction isFlattenable(value) {\n return isArray(value) || isArguments(value) ||\n !!(spreadableSymbol && value && value[spreadableSymbol]);\n}\n\nmodule.exports = isFlattenable;\n", + "/** Used as references for various ` + "`")) + (`Number` + ("`" + ` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/**\n * Checks if `))) + (("`" + (`value` + "`")) + ((` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns ` + "`") + (`true` + "`")))))))) + (((((((` if ` + ("`" + `value`)) + ("`" + (` is a valid index, else ` + "`"))) + ((`false` + ("`" + `.\n */\nfunction isIndex(value, length) {\n var type = typeof value;\n length = length == null ? MAX_SAFE_INTEGER : length;\n\n return !!length &&\n (type == 'number' ||\n (type != 'symbol' && reIsUint.test(value))) &&\n (value > -1 && value % 1 == 0 && value < length);\n}\n\nmodule.exports = isIndex;\n", + "var eq = require('./eq'),\n isArrayLike = require('./isArrayLike'),\n isIndex = require('./_isIndex'),\n isObject = require('./isObject');\n\n/**\n * Checks if the given arguments are from an iteratee call.\n *\n * @private\n * @param {*} value The potential iteratee value argument.\n * @param {*} index The potential iteratee index or key argument.\n * @param {*} object The potential iteratee object argument.\n * @returns {boolean} Returns `)) + ("`" + (`true` + "`")))) + (((` if the arguments are from an iteratee call,\n * else ` + ("`" + `false`)) + ("`" + (`.\n */\nfunction isIterateeCall(value, index, object) {\n if (!isObject(object)) {\n return false;\n }\n var type = typeof index;\n if (type == 'number'\n ? (isArrayLike(object) && isIndex(index, object.length))\n : (type == 'string' && index in object)\n ) {\n return eq(object[index], value);\n }\n return false;\n}\n\nmodule.exports = isIterateeCall;\n", + "var isArray = require('./isArray'),\n isSymbol = require('./isSymbol');\n\n/** Used to match property names within property paths. */\nvar reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n reIsPlainProp = /^\\w*$/;\n\n/**\n * Checks if ` + "`"))) + ((`value` + ("`" + ` is a property name and not a property path.\n *\n * @private\n * @param {*} value The value to check.\n * @param {Object} [object] The object to query keys on.\n * @returns {boolean} Returns `)) + ("`" + (`true` + "`"))))) + ((((` if ` + ("`" + `value`)) + ("`" + (` is a property name, else ` + "`"))) + ((`false` + ("`" + `.\n */\nfunction isKey(value, object) {\n if (isArray(value)) {\n return false;\n }\n var type = typeof value;\n if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n value == null || isSymbol(value)) {\n return true;\n }\n return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n (object != null && value in Object(object));\n}\n\nmodule.exports = isKey;\n", + "/**\n * Checks if `)) + ("`" + (`value` + "`")))) + (((` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns ` + ("`" + `true`)) + ("`" + (` if ` + "`"))) + ((`value` + ("`" + ` is suitable, else `)) + (("`" + `false`) + ("`" + `.\n */\nfunction isKeyable(value) {\n var type = typeof value;\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n ? (value !== '__proto__')\n : (value === null);\n}\n\nmodule.exports = isKeyable;\n", + "var coreJsData = require('./_coreJsData');\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/**\n * Checks if `)))))) + ((((("`" + (`func` + "`")) + (` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns ` + ("`" + `true`))) + (("`" + (` if ` + "`")) + (`func` + ("`" + ` is masked, else `)))) + ((("`" + (`false` + "`")) + (`.\n */\nfunction isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n}\n\nmodule.exports = isMasked;\n", + "/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Checks if ` + ("`" + `value`))) + (("`" + (` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns ` + "`")) + ((`true` + "`") + (` if ` + "`"))))) + ((((`value` + ("`" + ` is a prototype, else `)) + ("`" + (`false` + "`"))) + ((`.\n */\nfunction isPrototype(value) {\n var Ctor = value && value.constructor,\n proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n return value === proto;\n}\n\nmodule.exports = isPrototype;\n", + "var isObject = require('./isObject');\n\n/**\n * Checks if ` + ("`" + `value`)) + ("`" + (` is suitable for strict equality comparisons, i.e. ` + "`")))) + (((`===` + ("`" + `.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `)) + ("`" + (`true` + "`"))) + ((` if ` + ("`" + `value`)) + (("`" + ` if suitable for strict\n * equality comparisons, else `) + ("`" + `false`))))))) + (((((("`" + (`.\n */\nfunction isStrictComparable(value) {\n return value === value && !isObject(value);\n}\n\nmodule.exports = isStrictComparable;\n", "/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n this.__data__ = [];\n this.size = 0;\n}\n\nmodule.exports = listCacheClear;\n", - "var assocIndexOf = require('./_assocIndexOf');\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype;\n\n/** Built-in value references. */\nvar splice = arrayProto.splice;\n\n/**\n * Removes `)))) + ((("`" + `key`) + ("`" + (` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns ` + "`"))) + ((`true` + ("`" + ` if the entry was removed, else `)) + ("`" + (`false` + "`")))))) + (((((`.\n */\nfunction listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n return false;\n }\n var lastIndex = data.length - 1;\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n --this.size;\n return true;\n}\n\nmodule.exports = listCacheDelete;\n", - "var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Gets the list cache value for ` + "`") + (`key` + ("`" + `.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n return index < 0 ? undefined : data[index][1];\n}\n\nmodule.exports = listCacheGet;\n", - "var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Checks if a list cache value for `))) + (("`" + (`key` + "`")) + (` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns ` + ("`" + `true`)))) + ((("`" + ` if an entry for `) + ("`" + (`key` + "`"))) + ((` exists, else ` + ("`" + `false`)) + ("`" + (`.\n */\nfunction listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n}\n\nmodule.exports = listCacheHas;\n", - "var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Sets the list cache ` + "`"))))) + ((((`key` + "`") + (` to ` + ("`" + `value`))) + (("`" + (`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n ++this.size;\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n return this;\n}\n\nmodule.exports = listCacheSet;\n", + "var assocIndexOf = require('./_assocIndexOf');\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype;\n\n/** Built-in value references. */\nvar splice = arrayProto.splice;\n\n/**\n * Removes ` + "`")) + (`key` + ("`" + ` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `))) + (("`" + (`true` + "`")) + (` if the entry was removed, else ` + ("`" + `false`)))) + ((("`" + (`.\n */\nfunction listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n return false;\n }\n var lastIndex = data.length - 1;\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n --this.size;\n return true;\n}\n\nmodule.exports = listCacheDelete;\n", + "var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Gets the list cache value for ` + "`")) + (`key` + ("`" + `.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n return index < 0 ? undefined : data[index][1];\n}\n\nmodule.exports = listCacheGet;\n", + "var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Checks if a list cache value for `))) + (("`" + (`key` + "`")) + ((` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns ` + "`") + (`true` + "`"))))) + ((((` if an entry for ` + ("`" + `key`)) + ("`" + (` exists, else ` + "`"))) + ((`false` + ("`" + `.\n */\nfunction listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n}\n\nmodule.exports = listCacheHas;\n", + "var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Sets the list cache `)) + ("`" + (`key` + "`")))) + (((` to ` + ("`" + `value`)) + ("`" + (`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n ++this.size;\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n return this;\n}\n\nmodule.exports = listCacheSet;\n", "var Hash = require('./_Hash'),\n ListCache = require('./_ListCache'),\n Map = require('./_Map');\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n this.size = 0;\n this.__data__ = {\n 'hash': new Hash,\n 'map': new (Map || ListCache),\n 'string': new Hash\n };\n}\n\nmodule.exports = mapCacheClear;\n", - "var getMapData = require('./_getMapData');\n\n/**\n * Removes ` + "`")) + (`key` + ("`" + ` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `)))) + ((("`" + (`true` + "`")) + (` if the entry was removed, else ` + ("`" + `false`))) + (("`" + (`.\n */\nfunction mapCacheDelete(key) {\n var result = getMapData(this, key)['delete'](key);\n this.size -= result ? 1 : 0;\n return result;\n}\n\nmodule.exports = mapCacheDelete;\n", - "var getMapData = require('./_getMapData');\n\n/**\n * Gets the map value for ` + "`")) + (`key` + ("`" + `.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n return getMapData(this, key).get(key);\n}\n\nmodule.exports = mapCacheGet;\n", - "var getMapData = require('./_getMapData');\n\n/**\n * Checks if a map value for `)))))))))) + ((((((((("`" + `key`) + ("`" + (` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns ` + "`"))) + ((`true` + ("`" + ` if an entry for `)) + ("`" + (`key` + "`")))) + (((` exists, else ` + "`") + (`false` + ("`" + `.\n */\nfunction mapCacheHas(key) {\n return getMapData(this, key).has(key);\n}\n\nmodule.exports = mapCacheHas;\n", - "var getMapData = require('./_getMapData');\n\n/**\n * Sets the map `))) + (("`" + (`key` + "`")) + (` to ` + ("`" + `value`))))) + (((("`" + `.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n var data = getMapData(this, key),\n size = data.size;\n\n data.set(key, value);\n this.size += data.size == size ? 0 : 1;\n return this;\n}\n\nmodule.exports = mapCacheSet;\n", - "/**\n * Converts `) + ("`" + (`map` + "`"))) + ((` to its key-value pairs.\n *\n * @private\n * @param {Object} map The map to convert.\n * @returns {Array} Returns the key-value pairs.\n */\nfunction mapToArray(map) {\n var index = -1,\n result = Array(map.size);\n\n map.forEach(function(value, key) {\n result[++index] = [key, value];\n });\n return result;\n}\n\nmodule.exports = mapToArray;\n", - "/**\n * A specialized version of ` + ("`" + `matchesProperty`)) + ("`" + (` for source values suitable\n * for strict equality comparisons, i.e. ` + "`")))) + (((`===` + "`") + (`.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction matchesStrictComparable(key, srcValue) {\n return function(object) {\n if (object == null) {\n return false;\n }\n return object[key] === srcValue &&\n (srcValue !== undefined || (key in Object(object)));\n };\n}\n\nmodule.exports = matchesStrictComparable;\n", - "var memoize = require('./memoize');\n\n/** Used as the maximum memoize cache size. */\nvar MAX_MEMOIZE_SIZE = 500;\n\n/**\n * A specialized version of ` + ("`" + `_.memoize`))) + (("`" + (` which clears the memoized function's\n * cache when it exceeds ` + "`")) + (`MAX_MEMOIZE_SIZE` + ("`" + `.\n *\n * @private\n * @param {Function} func The function to have its output memoized.\n * @returns {Function} Returns the new memoized function.\n */\nfunction memoizeCapped(func) {\n var result = memoize(func, function(key) {\n if (cache.size === MAX_MEMOIZE_SIZE) {\n cache.clear();\n }\n return key;\n });\n\n var cache = result.cache;\n return result;\n}\n\nmodule.exports = memoizeCapped;\n", + "var getMapData = require('./_getMapData');\n\n/**\n * Removes ` + "`"))) + ((`key` + ("`" + ` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `)) + (("`" + `true`) + ("`" + ` if the entry was removed, else `)))))) + ((((("`" + (`false` + "`")) + (`.\n */\nfunction mapCacheDelete(key) {\n var result = getMapData(this, key)['delete'](key);\n this.size -= result ? 1 : 0;\n return result;\n}\n\nmodule.exports = mapCacheDelete;\n", + "var getMapData = require('./_getMapData');\n\n/**\n * Gets the map value for ` + ("`" + `key`))) + (("`" + (`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n return getMapData(this, key).get(key);\n}\n\nmodule.exports = mapCacheGet;\n", + "var getMapData = require('./_getMapData');\n\n/**\n * Checks if a map value for ` + "`")) + (`key` + ("`" + ` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `)))) + ((("`" + (`true` + "`")) + (` if an entry for ` + ("`" + `key`))) + (("`" + (` exists, else ` + "`")) + ((`false` + "`") + (`.\n */\nfunction mapCacheHas(key) {\n return getMapData(this, key).has(key);\n}\n\nmodule.exports = mapCacheHas;\n", + "var getMapData = require('./_getMapData');\n\n/**\n * Sets the map ` + "`"))))) + ((((`key` + ("`" + ` to `)) + ("`" + (`value` + "`"))) + ((`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n var data = getMapData(this, key),\n size = data.size;\n\n data.set(key, value);\n this.size += data.size == size ? 0 : 1;\n return this;\n}\n\nmodule.exports = mapCacheSet;\n", + "/**\n * Converts ` + ("`" + `map`)) + ("`" + (` to its key-value pairs.\n *\n * @private\n * @param {Object} map The map to convert.\n * @returns {Array} Returns the key-value pairs.\n */\nfunction mapToArray(map) {\n var index = -1,\n result = Array(map.size);\n\n map.forEach(function(value, key) {\n result[++index] = [key, value];\n });\n return result;\n}\n\nmodule.exports = mapToArray;\n", + "/**\n * A specialized version of ` + "`")))) + (((`matchesProperty` + ("`" + ` for source values suitable\n * for strict equality comparisons, i.e. `)) + ("`" + (`===` + "`"))) + ((`.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction matchesStrictComparable(key, srcValue) {\n return function(object) {\n if (object == null) {\n return false;\n }\n return object[key] === srcValue &&\n (srcValue !== undefined || (key in Object(object)));\n };\n}\n\nmodule.exports = matchesStrictComparable;\n", + "var memoize = require('./memoize');\n\n/** Used as the maximum memoize cache size. */\nvar MAX_MEMOIZE_SIZE = 500;\n\n/**\n * A specialized version of ` + ("`" + `_.memoize`)) + (("`" + ` which clears the memoized function's\n * cache when it exceeds `) + ("`" + `MAX_MEMOIZE_SIZE`)))))))))) + ((((((((("`" + (`.\n *\n * @private\n * @param {Function} func The function to have its output memoized.\n * @returns {Function} Returns the new memoized function.\n */\nfunction memoizeCapped(func) {\n var result = memoize(func, function(key) {\n if (cache.size === MAX_MEMOIZE_SIZE) {\n cache.clear();\n }\n return key;\n });\n\n var cache = result.cache;\n return result;\n}\n\nmodule.exports = memoizeCapped;\n", "var getNative = require('./_getNative');\n\n/* Built-in method references that are verified to be native. */\nvar nativeCreate = getNative(Object, 'create');\n\nmodule.exports = nativeCreate;\n", - "var overArg = require('./_overArg');\n\n/* Built-in method references for those with the same name as other `)))))) + ((((("`" + `lodash`) + ("`" + (` methods. */\nvar nativeKeys = overArg(Object.keys, Object);\n\nmodule.exports = nativeKeys;\n", - "var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable ` + "`"))) + ((`exports` + ("`" + `. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `)) + ("`" + (`module` + "`")))) + (((`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension ` + "`") + (`module.exports` + ("`" + `. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Detect free variable `))) + (("`" + (`process` + "`")) + (` from Node.js. */\nvar freeProcess = moduleExports && freeGlobal.process;\n\n/** Used to access faster Node.js helpers. */\nvar nodeUtil = (function() {\n try {\n // Use ` + ("`" + `util.types`))))) + (((("`" + ` for Node.js 10+.\n var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n if (types) {\n return types;\n }\n\n // Legacy `) + ("`" + (`process.binding('util')` + "`"))) + ((` for Node.js < 10.\n return freeProcess && freeProcess.binding && freeProcess.binding('util');\n } catch (e) {}\n}());\n\nmodule.exports = nodeUtil;\n", - "/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [` + ("`" + `toStringTag`)) + ("`" + (`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts ` + "`")))) + (((`value` + "`") + (` to a string using ` + ("`" + `Object.prototype.toString`))) + (("`" + (`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\nmodule.exports = objectToString;\n", - "/**\n * Creates a unary function that invokes ` + "`")) + (`func` + ("`" + ` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n return function(arg) {\n return func(transform(arg));\n };\n}\n\nmodule.exports = overArg;\n", - "var apply = require('./_apply');\n\n/* Built-in method references for those with the same name as other `))))))) + (((((("`" + `lodash`) + ("`" + (` methods. */\nvar nativeMax = Math.max;\n\n/**\n * A specialized version of ` + "`"))) + ((`baseRest` + ("`" + ` which transforms the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @param {Function} transform The rest array transform.\n * @returns {Function} Returns the new function.\n */\nfunction overRest(func, start, transform) {\n start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n return function() {\n var args = arguments,\n index = -1,\n length = nativeMax(args.length - start, 0),\n array = Array(length);\n\n while (++index < length) {\n array[index] = args[start + index];\n }\n index = -1;\n var otherArgs = Array(start + 1);\n while (++index < start) {\n otherArgs[index] = args[index];\n }\n otherArgs[start] = transform(array);\n return apply(func, this, otherArgs);\n };\n}\n\nmodule.exports = overRest;\n", - "var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `)) + ("`" + (`self` + "`")))) + (((`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nmodule.exports = root;\n", - "/** Used to stand-in for ` + "`") + (`undefined` + ("`" + ` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Adds `))) + (("`" + (`value` + "`")) + (` to the array cache.\n *\n * @private\n * @name add\n * @memberOf SetCache\n * @alias push\n * @param {*} value The value to cache.\n * @returns {Object} Returns the cache instance.\n */\nfunction setCacheAdd(value) {\n this.__data__.set(value, HASH_UNDEFINED);\n return this;\n}\n\nmodule.exports = setCacheAdd;\n", - "/**\n * Checks if ` + ("`" + `value`))))) + (((("`" + ` is in the array cache.\n *\n * @private\n * @name has\n * @memberOf SetCache\n * @param {*} value The value to search for.\n * @returns {number} Returns `) + ("`" + (`true` + "`"))) + ((` if ` + ("`" + `value`)) + ("`" + (` is found, else ` + "`")))) + (((`false` + "`") + (`.\n */\nfunction setCacheHas(value) {\n return this.__data__.has(value);\n}\n\nmodule.exports = setCacheHas;\n", - "/**\n * Converts ` + ("`" + `set`))) + (("`" + (` to an array of its values.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the values.\n */\nfunction setToArray(set) {\n var index = -1,\n result = Array(set.size);\n\n set.forEach(function(value) {\n result[++index] = value;\n });\n return result;\n}\n\nmodule.exports = setToArray;\n", - "var baseSetToString = require('./_baseSetToString'),\n shortOut = require('./_shortOut');\n\n/**\n * Sets the ` + "`")) + (`toString` + ("`" + ` method of `)))))) + ((((("`" + `func`) + ("`" + (` to return ` + "`"))) + ((`string` + ("`" + `.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `)) + ("`" + (`toString` + "`")))) + (((` result.\n * @returns {Function} Returns ` + "`") + (`func` + ("`" + `.\n */\nvar setToString = shortOut(baseSetToString);\n\nmodule.exports = setToString;\n", - "/** Used to detect hot functions by number of calls within a span of milliseconds. */\nvar HOT_COUNT = 800,\n HOT_SPAN = 16;\n\n/* Built-in method references for those with the same name as other `))) + (("`" + (`lodash` + "`")) + (` methods. */\nvar nativeNow = Date.now;\n\n/**\n * Creates a function that'll short out and invoke ` + ("`" + `identity`))))) + (((("`" + ` instead\n * of `) + ("`" + (`func` + "`"))) + ((` when it's called ` + ("`" + `HOT_COUNT`)) + ("`" + (` or more times in ` + "`")))) + (((`HOT_SPAN` + ("`" + `\n * milliseconds.\n *\n * @private\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new shortable function.\n */\nfunction shortOut(func) {\n var count = 0,\n lastCalled = 0;\n\n return function() {\n var stamp = nativeNow(),\n remaining = HOT_SPAN - (stamp - lastCalled);\n\n lastCalled = stamp;\n if (remaining > 0) {\n if (++count >= HOT_COUNT) {\n return arguments[0];\n }\n } else {\n count = 0;\n }\n return func.apply(undefined, arguments);\n };\n}\n\nmodule.exports = shortOut;\n", + "var overArg = require('./_overArg');\n\n/* Built-in method references for those with the same name as other ` + "`")) + (`lodash` + ("`" + ` methods. */\nvar nativeKeys = overArg(Object.keys, Object);\n\nmodule.exports = nativeKeys;\n", + "var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `))) + (("`" + (`exports` + "`")) + (`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable ` + ("`" + `module`)))) + ((("`" + (`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension ` + "`")) + (`module.exports` + ("`" + `. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Detect free variable `))) + (("`" + (`process` + "`")) + (` from Node.js. */\nvar freeProcess = moduleExports && freeGlobal.process;\n\n/** Used to access faster Node.js helpers. */\nvar nodeUtil = (function() {\n try {\n // Use ` + ("`" + `util.types`))))) + (((("`" + (` for Node.js 10+.\n var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n if (types) {\n return types;\n }\n\n // Legacy ` + "`")) + (`process.binding('util')` + ("`" + ` for Node.js < 10.\n return freeProcess && freeProcess.binding && freeProcess.binding('util');\n } catch (e) {}\n}());\n\nmodule.exports = nodeUtil;\n", + "/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`))) + (("`" + (`toStringTag` + "`")) + (`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts ` + ("`" + `value`)))) + ((("`" + (` to a string using ` + "`")) + (`Object.prototype.toString` + ("`" + `.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\nmodule.exports = objectToString;\n", + "/**\n * Creates a unary function that invokes `))) + (("`" + (`func` + "`")) + ((` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n return function(arg) {\n return func(transform(arg));\n };\n}\n\nmodule.exports = overArg;\n", + "var apply = require('./_apply');\n\n/* Built-in method references for those with the same name as other ` + "`") + (`lodash` + "`")))))) + (((((` methods. */\nvar nativeMax = Math.max;\n\n/**\n * A specialized version of ` + ("`" + `baseRest`)) + ("`" + (` which transforms the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @param {Function} transform The rest array transform.\n * @returns {Function} Returns the new function.\n */\nfunction overRest(func, start, transform) {\n start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n return function() {\n var args = arguments,\n index = -1,\n length = nativeMax(args.length - start, 0),\n array = Array(length);\n\n while (++index < length) {\n array[index] = args[start + index];\n }\n index = -1;\n var otherArgs = Array(start + 1);\n while (++index < start) {\n otherArgs[index] = args[index];\n }\n otherArgs[start] = transform(array);\n return apply(func, this, otherArgs);\n };\n}\n\nmodule.exports = overRest;\n", + "var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable ` + "`"))) + ((`self` + ("`" + `. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nmodule.exports = root;\n", + "/** Used to stand-in for `)) + ("`" + (`undefined` + "`")))) + (((` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Adds ` + ("`" + `value`)) + ("`" + (` to the array cache.\n *\n * @private\n * @name add\n * @memberOf SetCache\n * @alias push\n * @param {*} value The value to cache.\n * @returns {Object} Returns the cache instance.\n */\nfunction setCacheAdd(value) {\n this.__data__.set(value, HASH_UNDEFINED);\n return this;\n}\n\nmodule.exports = setCacheAdd;\n", + "/**\n * Checks if ` + "`"))) + ((`value` + ("`" + ` is in the array cache.\n *\n * @private\n * @name has\n * @memberOf SetCache\n * @param {*} value The value to search for.\n * @returns {number} Returns `)) + (("`" + `true`) + ("`" + ` if `))))) + (((("`" + (`value` + "`")) + (` is found, else ` + ("`" + `false`))) + (("`" + (`.\n */\nfunction setCacheHas(value) {\n return this.__data__.has(value);\n}\n\nmodule.exports = setCacheHas;\n", + "/**\n * Converts ` + "`")) + (`set` + ("`" + ` to an array of its values.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the values.\n */\nfunction setToArray(set) {\n var index = -1,\n result = Array(set.size);\n\n set.forEach(function(value) {\n result[++index] = value;\n });\n return result;\n}\n\nmodule.exports = setToArray;\n", + "var baseSetToString = require('./_baseSetToString'),\n shortOut = require('./_shortOut');\n\n/**\n * Sets the `)))) + ((("`" + (`toString` + "`")) + (` method of ` + ("`" + `func`))) + (("`" + (` to return ` + "`")) + ((`string` + "`") + (`.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The ` + "`"))))))) + ((((((`toString` + ("`" + ` result.\n * @returns {Function} Returns `)) + ("`" + (`func` + "`"))) + ((`.\n */\nvar setToString = shortOut(baseSetToString);\n\nmodule.exports = setToString;\n", + "/** Used to detect hot functions by number of calls within a span of milliseconds. */\nvar HOT_COUNT = 800,\n HOT_SPAN = 16;\n\n/* Built-in method references for those with the same name as other ` + ("`" + `lodash`)) + ("`" + (` methods. */\nvar nativeNow = Date.now;\n\n/**\n * Creates a function that'll short out and invoke ` + "`")))) + (((`identity` + ("`" + ` instead\n * of `)) + ("`" + (`func` + "`"))) + ((` when it's called ` + ("`" + `HOT_COUNT`)) + ("`" + (` or more times in ` + "`"))))) + ((((`HOT_SPAN` + ("`" + `\n * milliseconds.\n *\n * @private\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new shortable function.\n */\nfunction shortOut(func) {\n var count = 0,\n lastCalled = 0;\n\n return function() {\n var stamp = nativeNow(),\n remaining = HOT_SPAN - (stamp - lastCalled);\n\n lastCalled = stamp;\n if (remaining > 0) {\n if (++count >= HOT_COUNT) {\n return arguments[0];\n }\n } else {\n count = 0;\n }\n return func.apply(undefined, arguments);\n };\n}\n\nmodule.exports = shortOut;\n", "var ListCache = require('./_ListCache');\n\n/**\n * Removes all key-value entries from the stack.\n *\n * @private\n * @name clear\n * @memberOf Stack\n */\nfunction stackClear() {\n this.__data__ = new ListCache;\n this.size = 0;\n}\n\nmodule.exports = stackClear;\n", - "/**\n * Removes `)) + ("`" + (`key` + "`"))) + ((` and its value from the stack.\n *\n * @private\n * @name delete\n * @memberOf Stack\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns ` + ("`" + `true`)) + ("`" + (` if the entry was removed, else ` + "`")))))))) + (((((((`false` + "`") + (`.\n */\nfunction stackDelete(key) {\n var data = this.__data__,\n result = data['delete'](key);\n\n this.size = data.size;\n return result;\n}\n\nmodule.exports = stackDelete;\n", - "/**\n * Gets the stack value for ` + ("`" + `key`))) + (("`" + (`.\n *\n * @private\n * @name get\n * @memberOf Stack\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction stackGet(key) {\n return this.__data__.get(key);\n}\n\nmodule.exports = stackGet;\n", - "/**\n * Checks if a stack value for ` + "`")) + (`key` + ("`" + ` exists.\n *\n * @private\n * @name has\n * @memberOf Stack\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `)))) + ((("`" + `true`) + ("`" + (` if an entry for ` + "`"))) + ((`key` + ("`" + ` exists, else `)) + ("`" + (`false` + "`"))))) + ((((`.\n */\nfunction stackHas(key) {\n return this.__data__.has(key);\n}\n\nmodule.exports = stackHas;\n", - "var ListCache = require('./_ListCache'),\n Map = require('./_Map'),\n MapCache = require('./_MapCache');\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * Sets the stack ` + "`") + (`key` + ("`" + ` to `))) + (("`" + (`value` + "`")) + (`.\n *\n * @private\n * @name set\n * @memberOf Stack\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the stack cache instance.\n */\nfunction stackSet(key, value) {\n var data = this.__data__;\n if (data instanceof ListCache) {\n var pairs = data.__data__;\n if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n pairs.push([key, value]);\n this.size = ++data.size;\n return this;\n }\n data = this.__data__ = new MapCache(pairs);\n }\n data.set(key, value);\n this.size = data.size;\n return this;\n}\n\nmodule.exports = stackSet;\n", - "/**\n * A specialized version of ` + ("`" + `_.indexOf`)))) + ((("`" + ` which performs strict equality\n * comparisons of values, i.e. `) + ("`" + (`===` + "`"))) + ((`.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else ` + ("`" + `-1`)) + ("`" + (`.\n */\nfunction strictIndexOf(array, value, fromIndex) {\n var index = fromIndex - 1,\n length = array.length;\n\n while (++index < length) {\n if (array[index] === value) {\n return index;\n }\n }\n return -1;\n}\n\nmodule.exports = strictIndexOf;\n", - "var memoizeCapped = require('./_memoizeCapped');\n\n/** Used to match property names within property paths. */\nvar rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n/** Used to match backslashes in property paths. */\nvar reEscapeChar = /\\\\(\\\\)?/g;\n\n/**\n * Converts ` + "`")))))) + (((((`string` + "`") + (` to a property path array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the property path array.\n */\nvar stringToPath = memoizeCapped(function(string) {\n var result = [];\n if (string.charCodeAt(0) === 46 /* . */) {\n result.push('');\n }\n string.replace(rePropName, function(match, number, quote, subString) {\n result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));\n });\n return result;\n});\n\nmodule.exports = stringToPath;\n", - "var isSymbol = require('./isSymbol');\n\n/** Used as references for various ` + ("`" + `Number`))) + (("`" + (` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Converts ` + "`")) + (`value` + ("`" + ` to a string key if it's not a string or symbol.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {string|symbol} Returns the key.\n */\nfunction toKey(value) {\n if (typeof value == 'string' || isSymbol(value)) {\n return value;\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = toKey;\n", - "/** Used for built-in method references. */\nvar funcProto = Function.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/**\n * Converts `)))) + ((("`" + `func`) + ("`" + (` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n}\n\nmodule.exports = toSource;\n", - "/**\n * Creates a function that returns ` + "`"))) + ((`value` + ("`" + `.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {*} value The value to return from the new function.\n * @returns {Function} Returns the new constant function.\n * @example\n *\n * var objects = _.times(2, _.constant({ 'a': 1 }));\n *\n * console.log(objects);\n * // => [{ 'a': 1 }, { 'a': 1 }]\n *\n * console.log(objects[0] === objects[1]);\n * // => true\n */\nfunction constant(value) {\n return function() {\n return value;\n };\n}\n\nmodule.exports = constant;\n", - "var isObject = require('./isObject'),\n now = require('./now'),\n toNumber = require('./toNumber');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/* Built-in method references for those with the same name as other `)) + ("`" + (`lodash` + "`"))))) + ((((` methods. */\nvar nativeMax = Math.max,\n nativeMin = Math.min;\n\n/**\n * Creates a debounced function that delays invoking ` + "`") + (`func` + ("`" + ` until after `))) + (("`" + (`wait` + "`")) + (`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a ` + ("`" + `cancel`)))) + ((("`" + ` method to cancel\n * delayed `) + ("`" + (`func` + "`"))) + ((` invocations and a ` + ("`" + `flush`)) + ("`" + (` method to immediately invoke them.\n * Provide ` + "`"))))))) + ((((((`options` + "`") + (` to indicate whether ` + ("`" + `func`))) + (("`" + (` should be invoked on the\n * leading and/or trailing edge of the ` + "`")) + (`wait` + ("`" + ` timeout. The `)))) + ((("`" + `func`) + ("`" + (` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last ` + "`"))) + ((`func` + ("`" + `\n * invocation.\n *\n * **Note:** If `)) + ("`" + (`leading` + "`"))))) + ((((` and ` + "`") + (`trailing` + ("`" + ` options are `))) + (("`" + (`true` + "`")) + (`, ` + ("`" + `func`)))) + ((("`" + ` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the `) + ("`" + (`wait` + "`"))) + ((` timeout.\n *\n * If ` + ("`" + `wait`)) + ("`" + (` is ` + "`")))))) + (((((`0` + "`") + (` and ` + ("`" + `leading`))) + (("`" + (` is ` + "`")) + (`false` + ("`" + `, `)))) + ((("`" + `func`) + ("`" + (` invocation is deferred\n * until to the next tick, similar to ` + "`"))) + ((`setTimeout` + ("`" + ` with a timeout of `)) + ("`" + (`0` + "`"))))) + ((((`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between ` + "`") + (`_.debounce` + ("`" + ` and `))) + (("`" + (`_.throttle` + "`")) + (`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n * Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n * The maximum time ` + ("`" + `func`)))) + ((("`" + (` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke ` + "`")) + (`sendMail` + ("`" + ` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n * 'leading': true,\n * 'trailing': false\n * }));\n *\n * // Ensure `))) + (("`" + (`batchLog` + "`")) + (` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\nfunction debounce(func, wait, options) {\n var lastArgs,\n lastThis,\n maxWait,\n result,\n timerId,\n lastCallTime,\n lastInvokeTime = 0,\n leading = false,\n maxing = false,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n wait = toNumber(wait) || 0;\n if (isObject(options)) {\n leading = !!options.leading;\n maxing = 'maxWait' in options;\n maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n\n function invokeFunc(time) {\n var args = lastArgs,\n thisArg = lastThis;\n\n lastArgs = lastThis = undefined;\n lastInvokeTime = time;\n result = func.apply(thisArg, args);\n return result;\n }\n\n function leadingEdge(time) {\n // Reset any ` + ("`" + `maxWait`))))))))) + (((((((("`" + ` timer.\n lastInvokeTime = time;\n // Start the timer for the trailing edge.\n timerId = setTimeout(timerExpired, wait);\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result;\n }\n\n function remainingWait(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime,\n timeWaiting = wait - timeSinceLastCall;\n\n return maxing\n ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)\n : timeWaiting;\n }\n\n function shouldInvoke(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime;\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the `) + ("`" + (`maxWait` + "`"))) + ((` limit.\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n }\n\n function timerExpired() {\n var time = now();\n if (shouldInvoke(time)) {\n return trailingEdge(time);\n }\n // Restart the timer.\n timerId = setTimeout(timerExpired, remainingWait(time));\n }\n\n function trailingEdge(time) {\n timerId = undefined;\n\n // Only invoke if we have ` + ("`" + `lastArgs`)) + ("`" + (` which means ` + "`")))) + (((`func` + "`") + (` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time);\n }\n lastArgs = lastThis = undefined;\n return result;\n }\n\n function cancel() {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n }\n lastInvokeTime = 0;\n lastArgs = lastCallTime = lastThis = timerId = undefined;\n }\n\n function flush() {\n return timerId === undefined ? result : trailingEdge(now());\n }\n\n function debounced() {\n var time = now(),\n isInvoking = shouldInvoke(time);\n\n lastArgs = arguments;\n lastThis = this;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime);\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n timerId = setTimeout(timerExpired, wait);\n return invokeFunc(lastCallTime);\n }\n }\n if (timerId === undefined) {\n timerId = setTimeout(timerExpired, wait);\n }\n return result;\n }\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n}\n\nmodule.exports = debounce;\n", - "/**\n * Performs a\n * [` + ("`" + `SameValueZero`))) + (("`" + (`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns ` + "`")) + (`true` + ("`" + ` if the values are equivalent, else `))))) + (((("`" + `false`) + ("`" + (`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\nmodule.exports = eq;\n", - "var arrayEvery = require('./_arrayEvery'),\n baseEvery = require('./_baseEvery'),\n baseIteratee = require('./_baseIteratee'),\n isArray = require('./isArray'),\n isIterateeCall = require('./_isIterateeCall');\n\n/**\n * Checks if ` + "`"))) + ((`predicate` + ("`" + ` returns truthy for **all** elements of `)) + ("`" + (`collection` + "`")))) + (((`.\n * Iteration is stopped once ` + "`") + (`predicate` + ("`" + ` returns falsey. The predicate is\n * invoked with three arguments: (value, index|key, collection).\n *\n * **Note:** This method returns `))) + (("`" + (`true` + "`")) + (` for\n * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because\n * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of\n * elements of empty collections.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param- {Object} [guard] Enables use as an iteratee for methods like ` + ("`" + `_.map`)))))) + ((((("`" + `.\n * @returns {boolean} Returns `) + ("`" + (`true` + "`"))) + ((` if all elements pass the predicate check,\n * else ` + ("`" + `false`)) + ("`" + (`.\n * @example\n *\n * _.every([true, 1, null, 'yes'], Boolean);\n * // => false\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': false },\n * { 'user': 'fred', 'age': 40, 'active': false }\n * ];\n *\n * // The ` + "`")))) + (((`_.matches` + "`") + (` iteratee shorthand.\n * _.every(users, { 'user': 'barney', 'active': false });\n * // => false\n *\n * // The ` + ("`" + `_.matchesProperty`))) + (("`" + (` iteratee shorthand.\n * _.every(users, ['active', false]);\n * // => true\n *\n * // The ` + "`")) + (`_.property` + ("`" + ` iteratee shorthand.\n * _.every(users, 'active');\n * // => false\n */\nfunction every(collection, predicate, guard) {\n var func = isArray(collection) ? arrayEvery : baseEvery;\n if (guard && isIterateeCall(collection, predicate, guard)) {\n predicate = undefined;\n }\n return func(collection, baseIteratee(predicate, 3));\n}\n\nmodule.exports = every;\n", - "var arrayFilter = require('./_arrayFilter'),\n baseFilter = require('./_baseFilter'),\n baseIteratee = require('./_baseIteratee'),\n isArray = require('./isArray');\n\n/**\n * Iterates over elements of `))))) + (((("`" + `collection`) + ("`" + (`, returning an array of all elements\n * ` + "`"))) + ((`predicate` + ("`" + ` returns truthy for. The predicate is invoked with three\n * arguments: (value, index|key, collection).\n *\n * **Note:** Unlike `)) + ("`" + (`_.remove` + "`")))) + (((`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n * @see _.reject\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': true },\n * { 'user': 'fred', 'age': 40, 'active': false }\n * ];\n *\n * _.filter(users, function(o) { return !o.active; });\n * // => objects for ['fred']\n *\n * // The ` + "`") + (`_.matches` + ("`" + ` iteratee shorthand.\n * _.filter(users, { 'age': 36, 'active': true });\n * // => objects for ['barney']\n *\n * // The `))) + (("`" + (`_.matchesProperty` + "`")) + (` iteratee shorthand.\n * _.filter(users, ['active', false]);\n * // => objects for ['fred']\n *\n * // The ` + ("`" + `_.property`))))))) + (((((("`" + ` iteratee shorthand.\n * _.filter(users, 'active');\n * // => objects for ['barney']\n */\nfunction filter(collection, predicate) {\n var func = isArray(collection) ? arrayFilter : baseFilter;\n return func(collection, baseIteratee(predicate, 3));\n}\n\nmodule.exports = filter;\n", - "var createFind = require('./_createFind'),\n findIndex = require('./findIndex');\n\n/**\n * Iterates over elements of `) + ("`" + (`collection` + "`"))) + ((`, returning the first element\n * ` + ("`" + `predicate`)) + ("`" + (` returns truthy for. The predicate is invoked with three\n * arguments: (value, index|key, collection).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param {number} [fromIndex=0] The index to search from.\n * @returns {*} Returns the matched element, else ` + "`")))) + (((`undefined` + "`") + (`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': true },\n * { 'user': 'fred', 'age': 40, 'active': false },\n * { 'user': 'pebbles', 'age': 1, 'active': true }\n * ];\n *\n * _.find(users, function(o) { return o.age < 40; });\n * // => object for 'barney'\n *\n * // The ` + ("`" + `_.matches`))) + (("`" + (` iteratee shorthand.\n * _.find(users, { 'age': 1, 'active': true });\n * // => object for 'pebbles'\n *\n * // The ` + "`")) + (`_.matchesProperty` + ("`" + ` iteratee shorthand.\n * _.find(users, ['active', false]);\n * // => object for 'fred'\n *\n * // The `))))) + (((("`" + `_.property`) + ("`" + (` iteratee shorthand.\n * _.find(users, 'active');\n * // => object for 'barney'\n */\nvar find = createFind(findIndex);\n\nmodule.exports = find;\n", - "var baseFindIndex = require('./_baseFindIndex'),\n baseIteratee = require('./_baseIteratee'),\n toInteger = require('./toInteger');\n\n/* Built-in method references for those with the same name as other ` + "`"))) + ((`lodash` + ("`" + ` methods. */\nvar nativeMax = Math.max;\n\n/**\n * This method is like `)) + ("`" + (`_.find` + "`")))) + (((` except that it returns the index of the first\n * element ` + "`") + (`predicate` + ("`" + ` returns truthy for instead of the element itself.\n *\n * @static\n * @memberOf _\n * @since 1.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param {number} [fromIndex=0] The index to search from.\n * @returns {number} Returns the index of the found element, else `))) + (("`" + (`-1` + "`")) + (`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'active': false },\n * { 'user': 'fred', 'active': false },\n * { 'user': 'pebbles', 'active': true }\n * ];\n *\n * _.findIndex(users, function(o) { return o.user == 'barney'; });\n * // => 0\n *\n * // The ` + ("`" + `_.matches`)))))) + ((((("`" + ` iteratee shorthand.\n * _.findIndex(users, { 'user': 'fred', 'active': false });\n * // => 1\n *\n * // The `) + ("`" + (`_.matchesProperty` + "`"))) + ((` iteratee shorthand.\n * _.findIndex(users, ['active', false]);\n * // => 0\n *\n * // The ` + ("`" + `_.property`)) + ("`" + (` iteratee shorthand.\n * _.findIndex(users, 'active');\n * // => 2\n */\nfunction findIndex(array, predicate, fromIndex) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return -1;\n }\n var index = fromIndex == null ? 0 : toInteger(fromIndex);\n if (index < 0) {\n index = nativeMax(length + index, 0);\n }\n return baseFindIndex(array, baseIteratee(predicate, 3), index);\n}\n\nmodule.exports = findIndex;\n", - "var baseFlatten = require('./_baseFlatten'),\n map = require('./map');\n\n/**\n * Creates a flattened array of values by running each element in ` + "`")))) + (((`collection` + "`") + (`\n * thru ` + ("`" + `iteratee`))) + (("`" + (` and flattening the mapped results. The iteratee is invoked\n * with three arguments: (value, index|key, collection).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * function duplicate(n) {\n * return [n, n];\n * }\n *\n * _.flatMap([1, 2], duplicate);\n * // => [1, 1, 2, 2]\n */\nfunction flatMap(collection, iteratee) {\n return baseFlatten(map(collection, iteratee), 1);\n}\n\nmodule.exports = flatMap;\n", - "var baseGet = require('./_baseGet');\n\n/**\n * Gets the value at ` + "`")) + (`path` + ("`" + ` of `))))) + (((("`" + `object`) + ("`" + (`. If the resolved value is\n * ` + "`"))) + ((`undefined` + ("`" + `, the `)) + ("`" + (`defaultValue` + "`")))) + (((` is returned in its place.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @param {*} [defaultValue] The value returned for ` + ("`" + `undefined`)) + ("`" + (` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.get(object, 'a[0].b.c');\n * // => 3\n *\n * _.get(object, ['a', '0', 'b', 'c']);\n * // => 3\n *\n * _.get(object, 'a.b.c', 'default');\n * // => 'default'\n */\nfunction get(object, path, defaultValue) {\n var result = object == null ? undefined : baseGet(object, path);\n return result === undefined ? defaultValue : result;\n}\n\nmodule.exports = get;\n", - "var baseHasIn = require('./_baseHasIn'),\n hasPath = require('./_hasPath');\n\n/**\n * Checks if ` + "`"))) + ((`path` + ("`" + ` is a direct or inherited property of `)) + ("`" + (`object` + "`")))))))) + (((((((`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns ` + "`") + (`true` + ("`" + ` if `))) + (("`" + (`path` + "`")) + (` exists, else ` + ("`" + `false`)))) + ((("`" + `.\n * @example\n *\n * var object = _.create({ 'a': _.create({ 'b': 2 }) });\n *\n * _.hasIn(object, 'a');\n * // => true\n *\n * _.hasIn(object, 'a.b');\n * // => true\n *\n * _.hasIn(object, ['a', 'b']);\n * // => true\n *\n * _.hasIn(object, 'b');\n * // => false\n */\nfunction hasIn(object, path) {\n return object != null && hasPath(object, path, baseHasIn);\n}\n\nmodule.exports = hasIn;\n", - "/**\n * This method returns the first argument it receives.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {*} value Any value.\n * @returns {*} Returns `) + ("`" + (`value` + "`"))) + ((`.\n * @example\n *\n * var object = { 'a': 1 };\n *\n * console.log(_.identity(object) === object);\n * // => true\n */\nfunction identity(value) {\n return value;\n}\n\nmodule.exports = identity;\n", - "var arrayMap = require('./_arrayMap'),\n baseIntersection = require('./_baseIntersection'),\n baseRest = require('./_baseRest'),\n castArrayLikeObject = require('./_castArrayLikeObject');\n\n/**\n * Creates an array of unique values that are included in all given arrays\n * using [` + ("`" + `SameValueZero`)) + ("`" + (`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons. The order and references of result values are\n * determined by the first array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @returns {Array} Returns the new array of intersecting values.\n * @example\n *\n * _.intersection([2, 1], [2, 3]);\n * // => [2]\n */\nvar intersection = baseRest(function(arrays) {\n var mapped = arrayMap(arrays, castArrayLikeObject);\n return (mapped.length && mapped[0] === arrays[0])\n ? baseIntersection(mapped)\n : [];\n});\n\nmodule.exports = intersection;\n", - "var baseIsArguments = require('./_baseIsArguments'),\n isObjectLike = require('./isObjectLike');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/**\n * Checks if ` + "`"))))) + ((((`value` + "`") + (` is likely an ` + ("`" + `arguments`))) + (("`" + (` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns ` + "`")) + (`true` + ("`" + ` if `)))) + ((("`" + `value`) + ("`" + (` is an ` + "`"))) + ((`arguments` + ("`" + ` object,\n * else `)) + ("`" + (`false` + "`")))))) + (((((`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nvar isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n !propertyIsEnumerable.call(value, 'callee');\n};\n\nmodule.exports = isArguments;\n", - "/**\n * Checks if ` + "`") + (`value` + ("`" + ` is classified as an `))) + (("`" + (`Array` + "`")) + (` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns ` + ("`" + `true`)))) + ((("`" + ` if `) + ("`" + (`value` + "`"))) + ((` is an array, else ` + ("`" + `false`)) + ("`" + (`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nmodule.exports = isArray;\n", - "var isFunction = require('./isFunction'),\n isLength = require('./isLength');\n\n/**\n * Checks if ` + "`"))))) + ((((`value` + "`") + (` is array-like. A value is considered array-like if it's\n * not a function and has a ` + ("`" + `value.length`))) + (("`" + (` that's an integer greater than or\n * equal to ` + "`")) + (`0` + ("`" + ` and less than or equal to `)))) + ((("`" + (`Number.MAX_SAFE_INTEGER` + "`")) + (`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns ` + ("`" + `true`))) + (("`" + (` if ` + "`")) + (`value` + ("`" + ` is array-like, else `))))))) + (((((("`" + `false`) + ("`" + (`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n}\n\nmodule.exports = isArrayLike;\n", - "var isArrayLike = require('./isArrayLike'),\n isObjectLike = require('./isObjectLike');\n\n/**\n * This method is like ` + "`"))) + ((`_.isArrayLike` + ("`" + ` except that it also checks if `)) + ("`" + (`value` + "`")))) + (((`\n * is an object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns ` + "`") + (`true` + ("`" + ` if `))) + (("`" + (`value` + "`")) + (` is an array-like object,\n * else ` + ("`" + `false`))))) + (((("`" + `.\n * @example\n *\n * _.isArrayLikeObject([1, 2, 3]);\n * // => true\n *\n * _.isArrayLikeObject(document.body.children);\n * // => true\n *\n * _.isArrayLikeObject('abc');\n * // => false\n *\n * _.isArrayLikeObject(_.noop);\n * // => false\n */\nfunction isArrayLikeObject(value) {\n return isObjectLike(value) && isArrayLike(value);\n}\n\nmodule.exports = isArrayLikeObject;\n", - "var root = require('./_root'),\n stubFalse = require('./stubFalse');\n\n/** Detect free variable `) + ("`" + (`exports` + "`"))) + ((`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable ` + ("`" + `module`)) + ("`" + (`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension ` + "`")))) + (((`module.exports` + "`") + (`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined;\n\n/* Built-in method references for those with the same name as other ` + ("`" + `lodash`))) + (("`" + (` methods. */\nvar nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined;\n\n/**\n * Checks if ` + "`")) + (`value` + ("`" + ` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `)))))) + ((((("`" + `true`) + ("`" + (` if ` + "`"))) + ((`value` + ("`" + ` is a buffer, else `)) + ("`" + (`false` + "`")))) + (((`.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */\nvar isBuffer = nativeIsBuffer || stubFalse;\n\nmodule.exports = isBuffer;\n", - "var baseIsEqual = require('./_baseIsEqual');\n\n/**\n * Performs a deep comparison between two values to determine if they are\n * equivalent.\n *\n * **Note:** This method supports comparing arrays, array buffers, booleans,\n * date objects, error objects, maps, numbers, ` + "`") + (`Object` + ("`" + ` objects, regexes,\n * sets, strings, symbols, and typed arrays. `))) + (("`" + (`Object` + "`")) + (` objects are compared\n * by their own, not inherited, enumerable properties. Functions and DOM\n * nodes are compared by strict equality, i.e. ` + ("`" + `===`))))) + (((("`" + `.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `) + ("`" + (`true` + "`"))) + ((` if the values are equivalent, else ` + ("`" + `false`)) + ("`" + (`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.isEqual(object, other);\n * // => true\n *\n * object === other;\n * // => false\n */\nfunction isEqual(value, other) {\n return baseIsEqual(value, other);\n}\n\nmodule.exports = isEqual;\n", - "var baseGetTag = require('./_baseGetTag'),\n isObject = require('./isObject');\n\n/** ` + "`")))) + (((`Object#toString` + ("`" + ` result references. */\nvar asyncTag = '[object AsyncFunction]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n proxyTag = '[object Proxy]';\n\n/**\n * Checks if `)) + ("`" + (`value` + "`"))) + ((` is classified as a ` + ("`" + `Function`)) + ("`" + (` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns ` + "`"))))))))))) + ((((((((((`true` + "`") + (` if ` + ("`" + `value`))) + (("`" + (` is a function, else ` + "`")) + (`false` + ("`" + `.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n if (!isObject(value)) {\n return false;\n }\n // The use of `)))) + ((("`" + `Object#toString`) + ("`" + (` avoids issues with the ` + "`"))) + ((`typeof` + ("`" + ` operator\n // in Safari 9 which returns 'object' for typed arrays and other constructors.\n var tag = baseGetTag(value);\n return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n}\n\nmodule.exports = isFunction;\n", - "/** Used as references for various `)) + ("`" + (`Number` + "`"))))) + ((((` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * Checks if ` + "`") + (`value` + ("`" + ` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`))) + (("`" + (`ToLength` + "`")) + (`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns ` + ("`" + `true`)))) + ((("`" + ` if `) + ("`" + (`value` + "`"))) + ((` is a valid length, else ` + ("`" + `false`)) + ("`" + (`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\nmodule.exports = isLength;\n", - "var isNumber = require('./isNumber');\n\n/**\n * Checks if ` + "`")))))) + (((((`value` + "`") + (` is ` + ("`" + `NaN`))) + (("`" + (`.\n *\n * **Note:** This method is based on\n * [` + "`")) + (`Number.isNaN` + ("`" + `](https://mdn.io/Number/isNaN) and is not the same as\n * global [`)))) + ((("`" + `isNaN`) + ("`" + (`](https://mdn.io/isNaN) which returns ` + "`"))) + ((`true` + ("`" + ` for\n * `)) + ("`" + (`undefined` + "`"))))) + ((((` and other non-number values.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns ` + "`") + (`true` + ("`" + ` if `))) + (("`" + (`value` + "`")) + (` is ` + ("`" + `NaN`)))) + ((("`" + `, else `) + ("`" + (`false` + "`"))) + ((`.\n * @example\n *\n * _.isNaN(NaN);\n * // => true\n *\n * _.isNaN(new Number(NaN));\n * // => true\n *\n * isNaN(undefined);\n * // => true\n *\n * _.isNaN(undefined);\n * // => false\n */\nfunction isNaN(value) {\n // An ` + ("`" + `NaN`)) + ("`" + (` primitive is the only value that is not equal to itself.\n // Perform the ` + "`"))))))) + ((((((`toStringTag` + "`") + (` check first to avoid errors with some\n // ActiveX objects in IE.\n return isNumber(value) && value != +value;\n}\n\nmodule.exports = isNaN;\n", - "/**\n * Checks if ` + ("`" + `value`))) + (("`" + (` is ` + "`")) + (`null` + ("`" + ` or `)))) + ((("`" + `undefined`) + ("`" + (`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns ` + "`"))) + ((`true` + ("`" + ` if `)) + ("`" + (`value` + "`"))))) + ((((` is nullish, else ` + "`") + (`false` + ("`" + `.\n * @example\n *\n * _.isNil(null);\n * // => true\n *\n * _.isNil(void 0);\n * // => true\n *\n * _.isNil(NaN);\n * // => false\n */\nfunction isNil(value) {\n return value == null;\n}\n\nmodule.exports = isNil;\n", - "var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `))) + (("`" + (`Object#toString` + "`")) + (` result references. */\nvar numberTag = '[object Number]';\n\n/**\n * Checks if ` + ("`" + `value`)))) + ((("`" + ` is classified as a `) + ("`" + (`Number` + "`"))) + ((` primitive or object.\n *\n * **Note:** To exclude ` + ("`" + `Infinity`)) + ("`" + (`, ` + "`")))))) + (((((`-Infinity` + "`") + (`, and ` + ("`" + `NaN`))) + (("`" + (`, which are\n * classified as numbers, use the ` + "`")) + (`_.isFinite` + ("`" + ` method.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `)))) + ((("`" + `true`) + ("`" + (` if ` + "`"))) + ((`value` + ("`" + ` is a number, else `)) + ("`" + (`false` + "`"))))) + ((((`.\n * @example\n *\n * _.isNumber(3);\n * // => true\n *\n * _.isNumber(Number.MIN_VALUE);\n * // => true\n *\n * _.isNumber(Infinity);\n * // => true\n *\n * _.isNumber('3');\n * // => false\n */\nfunction isNumber(value) {\n return typeof value == 'number' ||\n (isObjectLike(value) && baseGetTag(value) == numberTag);\n}\n\nmodule.exports = isNumber;\n", - "/**\n * Checks if ` + "`") + (`value` + ("`" + ` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `))) + (("`" + (`Object` + "`")) + (`. (e.g. arrays, functions, objects, regexes, ` + ("`" + `new Number(0)`)))) + ((("`" + (`, and ` + "`")) + (`new String('')` + ("`" + `)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `))) + (("`" + (`true` + "`")) + (` if ` + ("`" + `value`)))))))) + ((((((("`" + ` is an object, else `) + ("`" + (`false` + "`"))) + ((`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n}\n\nmodule.exports = isObject;\n", - "/**\n * Checks if ` + ("`" + `value`)) + ("`" + (` is object-like. A value is object-like if it's not ` + "`")))) + (((`null` + "`") + (`\n * and has a ` + ("`" + `typeof`))) + (("`" + (` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns ` + "`")) + (`true` + ("`" + ` if `))))) + (((("`" + `value`) + ("`" + (` is object-like, else ` + "`"))) + ((`false` + ("`" + `.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n", - "var baseGetTag = require('./_baseGetTag'),\n getPrototype = require('./_getPrototype'),\n isObjectLike = require('./isObjectLike');\n\n/** `)) + ("`" + (`Object#toString` + "`")))) + (((` result references. */\nvar objectTag = '[object Object]';\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to infer the ` + "`") + (`Object` + ("`" + ` constructor. */\nvar objectCtorString = funcToString.call(Object);\n\n/**\n * Checks if `))) + (("`" + (`value` + "`")) + (` is a plain object, that is, an object created by the\n * ` + ("`" + `Object`)))))) + ((((("`" + ` constructor or one with a `) + ("`" + (`[[Prototype]]` + "`"))) + ((` of ` + ("`" + `null`)) + ("`" + (`.\n *\n * @static\n * @memberOf _\n * @since 0.8.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns ` + "`")))) + (((`true` + "`") + (` if ` + ("`" + `value`))) + (("`" + (` is a plain object, else ` + "`")) + (`false` + ("`" + `.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * }\n *\n * _.isPlainObject(new Foo);\n * // => false\n *\n * _.isPlainObject([1, 2, 3]);\n * // => false\n *\n * _.isPlainObject({ 'x': 0, 'y': 0 });\n * // => true\n *\n * _.isPlainObject(Object.create(null));\n * // => true\n */\nfunction isPlainObject(value) {\n if (!isObjectLike(value) || baseGetTag(value) != objectTag) {\n return false;\n }\n var proto = getPrototype(value);\n if (proto === null) {\n return true;\n }\n var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;\n return typeof Ctor == 'function' && Ctor instanceof Ctor &&\n funcToString.call(Ctor) == objectCtorString;\n}\n\nmodule.exports = isPlainObject;\n", - "var baseGetTag = require('./_baseGetTag'),\n isArray = require('./isArray'),\n isObjectLike = require('./isObjectLike');\n\n/** `))))) + (((("`" + `Object#toString`) + ("`" + (` result references. */\nvar stringTag = '[object String]';\n\n/**\n * Checks if ` + "`"))) + ((`value` + ("`" + ` is classified as a `)) + ("`" + (`String` + "`")))) + (((` primitive or object.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns ` + "`") + (`true` + ("`" + ` if `))) + (("`" + (`value` + "`")) + (` is a string, else ` + ("`" + `false`))))))) + (((((("`" + `.\n * @example\n *\n * _.isString('abc');\n * // => true\n *\n * _.isString(1);\n * // => false\n */\nfunction isString(value) {\n return typeof value == 'string' ||\n (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);\n}\n\nmodule.exports = isString;\n", - "var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `) + ("`" + (`Object#toString` + "`"))) + ((` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Checks if ` + ("`" + `value`)) + ("`" + (` is classified as a ` + "`")))) + (((`Symbol` + "`") + (` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns ` + ("`" + `true`))) + (("`" + (` if ` + "`")) + (`value` + ("`" + ` is a symbol, else `))))) + (((("`" + `false`) + ("`" + (`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\n}\n\nmodule.exports = isSymbol;\n", - "var baseIsTypedArray = require('./_baseIsTypedArray'),\n baseUnary = require('./_baseUnary'),\n nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n/**\n * Checks if ` + "`"))) + ((`value` + ("`" + ` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `)) + ("`" + (`true` + "`")))) + (((` if ` + "`") + (`value` + ("`" + ` is a typed array, else `))) + (("`" + (`false` + "`")) + (`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\nvar isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\nmodule.exports = isTypedArray;\n", - "var arrayLikeKeys = require('./_arrayLikeKeys'),\n baseKeys = require('./_baseKeys'),\n isArrayLike = require('./isArrayLike');\n\n/**\n * Creates an array of the own enumerable property names of ` + ("`" + `object`)))))) + ((((("`" + `.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\nfunction keys(object) {\n return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n}\n\nmodule.exports = keys;\n", - "/**\n * Gets the last element of `) + ("`" + (`array` + "`"))) + ((`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to query.\n * @returns {*} Returns the last element of ` + ("`" + `array`)) + ("`" + (`.\n * @example\n *\n * _.last([1, 2, 3]);\n * // => 3\n */\nfunction last(array) {\n var length = array == null ? 0 : array.length;\n return length ? array[length - 1] : undefined;\n}\n\nmodule.exports = last;\n", - "var arrayMap = require('./_arrayMap'),\n baseIteratee = require('./_baseIteratee'),\n baseMap = require('./_baseMap'),\n isArray = require('./isArray');\n\n/**\n * Creates an array of values by running each element in ` + "`")))) + (((`collection` + "`") + (` thru\n * ` + ("`" + `iteratee`))) + (("`" + (`. The iteratee is invoked with three arguments:\n * (value, index|key, collection).\n *\n * Many lodash methods are guarded to work as iteratees for methods like\n * ` + "`")) + (`_.every` + ("`" + `, `))))) + (((("`" + `_.filter`) + ("`" + (`, ` + "`"))) + ((`_.map` + ("`" + `, `)) + ("`" + (`_.mapValues` + "`")))) + (((`, ` + ("`" + `_.reject`)) + ("`" + (`, and ` + "`"))) + ((`_.some` + ("`" + `.\n *\n * The guarded methods are:\n * `)) + ("`" + (`ary` + "`"))))))))) + ((((((((`, ` + "`") + (`chunk` + ("`" + `, `))) + (("`" + (`curry` + "`")) + (`, ` + ("`" + `curryRight`)))) + ((("`" + `, `) + ("`" + (`drop` + "`"))) + ((`, ` + ("`" + `dropRight`)) + ("`" + (`, ` + "`"))))) + ((((`every` + "`") + (`,\n * ` + ("`" + `fill`))) + (("`" + (`, ` + "`")) + (`invert` + ("`" + `, `)))) + ((("`" + `parseInt`) + ("`" + (`, ` + "`"))) + ((`random` + ("`" + `, `)) + ("`" + (`range` + "`")))))) + (((((`, ` + "`") + (`rangeRight` + ("`" + `, `))) + (("`" + (`repeat` + "`")) + (`,\n * ` + ("`" + `sampleSize`)))) + ((("`" + `, `) + ("`" + (`slice` + "`"))) + ((`, ` + ("`" + `some`)) + ("`" + (`, ` + "`"))))) + ((((`sortBy` + "`") + (`, ` + ("`" + `split`))) + (("`" + (`, ` + "`")) + (`take` + ("`" + `, `)))) + ((("`" + `takeRight`) + ("`" + (`,\n * ` + "`"))) + ((`template` + ("`" + `, `)) + ("`" + (`trim` + "`"))))))) + ((((((`, ` + "`") + (`trimEnd` + ("`" + `, `))) + (("`" + (`trimStart` + "`")) + (`, and ` + ("`" + `words`)))) + ((("`" + `\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n * @example\n *\n * function square(n) {\n * return n * n;\n * }\n *\n * _.map([4, 8], square);\n * // => [16, 64]\n *\n * _.map({ 'a': 4, 'b': 8 }, square);\n * // => [16, 64] (iteration order is not guaranteed)\n *\n * var users = [\n * { 'user': 'barney' },\n * { 'user': 'fred' }\n * ];\n *\n * // The `) + ("`" + (`_.property` + "`"))) + ((` iteratee shorthand.\n * _.map(users, 'user');\n * // => ['barney', 'fred']\n */\nfunction map(collection, iteratee) {\n var func = isArray(collection) ? arrayMap : baseMap;\n return func(collection, baseIteratee(iteratee, 3));\n}\n\nmodule.exports = map;\n", - "var baseAssignValue = require('./_baseAssignValue'),\n baseForOwn = require('./_baseForOwn'),\n baseIteratee = require('./_baseIteratee');\n\n/**\n * Creates an object with the same keys as ` + ("`" + `object`)) + ("`" + (` and values generated\n * by running each own enumerable string keyed property of ` + "`"))))) + ((((`object` + "`") + (` thru\n * ` + ("`" + `iteratee`))) + (("`" + (`. The iteratee is invoked with three arguments:\n * (value, key, object).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns the new mapped object.\n * @see _.mapKeys\n * @example\n *\n * var users = {\n * 'fred': { 'user': 'fred', 'age': 40 },\n * 'pebbles': { 'user': 'pebbles', 'age': 1 }\n * };\n *\n * _.mapValues(users, function(o) { return o.age; });\n * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\n *\n * // The ` + "`")) + (`_.property` + ("`" + ` iteratee shorthand.\n * _.mapValues(users, 'age');\n * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\n */\nfunction mapValues(object, iteratee) {\n var result = {};\n iteratee = baseIteratee(iteratee, 3);\n\n baseForOwn(object, function(value, key, object) {\n baseAssignValue(result, key, iteratee(value, key, object));\n });\n return result;\n}\n\nmodule.exports = mapValues;\n", - "var baseExtremum = require('./_baseExtremum'),\n baseGt = require('./_baseGt'),\n identity = require('./identity');\n\n/**\n * Computes the maximum value of `)))) + ((("`" + `array`) + ("`" + (`. If ` + "`"))) + ((`array` + ("`" + ` is empty or falsey,\n * `)) + ("`" + (`undefined` + "`")))))) + (((((` is returned.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Math\n * @param {Array} array The array to iterate over.\n * @returns {*} Returns the maximum value.\n * @example\n *\n * _.max([4, 2, 8, 6]);\n * // => 8\n *\n * _.max([]);\n * // => undefined\n */\nfunction max(array) {\n return (array && array.length)\n ? baseExtremum(array, identity, baseGt)\n : undefined;\n}\n\nmodule.exports = max;\n", - "var MapCache = require('./_MapCache');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a function that memoizes the result of ` + "`") + (`func` + ("`" + `. If `))) + (("`" + (`resolver` + "`")) + (` is\n * provided, it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, the first argument\n * provided to the memoized function is used as the map cache key. The ` + ("`" + `func`)))) + ((("`" + `\n * is invoked with the `) + ("`" + (`this` + "`"))) + ((` binding of the memoized function.\n *\n * **Note:** The cache is exposed as the ` + ("`" + `cache`)) + ("`" + (` property on the memoized\n * function. Its creation may be customized by replacing the ` + "`"))))) + ((((`_.memoize.Cache` + "`") + (`\n * constructor with one whose instances implement the\n * [` + ("`" + `Map`))) + (("`" + (`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n * method interface of ` + "`")) + (`clear` + ("`" + `, `)))) + ((("`" + (`delete` + "`")) + (`, ` + ("`" + `get`))) + (("`" + (`, ` + "`")) + (`has` + ("`" + `, and `)))))))) + ((((((("`" + `set`) + ("`" + (`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to have its output memoized.\n * @param {Function} [resolver] The function to resolve the cache key.\n * @returns {Function} Returns the new memoized function.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n * var other = { 'c': 3, 'd': 4 };\n *\n * var values = _.memoize(_.values);\n * values(object);\n * // => [1, 2]\n *\n * values(other);\n * // => [3, 4]\n *\n * object.a = 2;\n * values(object);\n * // => [1, 2]\n *\n * // Modify the result cache.\n * values.cache.set(object, ['a', 'b']);\n * values(object);\n * // => ['a', 'b']\n *\n * // Replace ` + "`"))) + ((`_.memoize.Cache` + ("`" + `.\n * _.memoize.Cache = WeakMap;\n */\nfunction memoize(func, resolver) {\n if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n var memoized = function() {\n var args = arguments,\n key = resolver ? resolver.apply(this, args) : args[0],\n cache = memoized.cache;\n\n if (cache.has(key)) {\n return cache.get(key);\n }\n var result = func.apply(this, args);\n memoized.cache = cache.set(key, result) || cache;\n return result;\n };\n memoized.cache = new (memoize.Cache || MapCache);\n return memoized;\n}\n\n// Expose `)) + ("`" + (`MapCache` + "`")))) + (((`.\nmemoize.Cache = MapCache;\n\nmodule.exports = memoize;\n", - "var baseExtremum = require('./_baseExtremum'),\n baseLt = require('./_baseLt'),\n identity = require('./identity');\n\n/**\n * Computes the minimum value of ` + "`") + (`array` + ("`" + `. If `))) + (("`" + (`array` + "`")) + (` is empty or falsey,\n * ` + ("`" + `undefined`))))) + (((("`" + ` is returned.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Math\n * @param {Array} array The array to iterate over.\n * @returns {*} Returns the minimum value.\n * @example\n *\n * _.min([4, 2, 8, 6]);\n * // => 2\n *\n * _.min([]);\n * // => undefined\n */\nfunction min(array) {\n return (array && array.length)\n ? baseExtremum(array, identity, baseLt)\n : undefined;\n}\n\nmodule.exports = min;\n", - "/**\n * This method returns `) + ("`" + (`undefined` + "`"))) + ((`.\n *\n * @static\n * @memberOf _\n * @since 2.3.0\n * @category Util\n * @example\n *\n * _.times(2, _.noop);\n * // => [undefined, undefined]\n */\nfunction noop() {\n // No operation performed.\n}\n\nmodule.exports = noop;\n", + "/**\n * Removes `)) + ("`" + (`key` + "`"))) + ((` and its value from the stack.\n *\n * @private\n * @name delete\n * @memberOf Stack\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns ` + ("`" + `true`)) + ("`" + (` if the entry was removed, else ` + "`")))) + (((`false` + ("`" + `.\n */\nfunction stackDelete(key) {\n var data = this.__data__,\n result = data['delete'](key);\n\n this.size = data.size;\n return result;\n}\n\nmodule.exports = stackDelete;\n", + "/**\n * Gets the stack value for `)) + ("`" + (`key` + "`"))) + ((`.\n *\n * @private\n * @name get\n * @memberOf Stack\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction stackGet(key) {\n return this.__data__.get(key);\n}\n\nmodule.exports = stackGet;\n", + "/**\n * Checks if a stack value for ` + ("`" + `key`)) + (("`" + ` exists.\n *\n * @private\n * @name has\n * @memberOf Stack\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `) + ("`" + `true`)))))) + ((((("`" + (` if an entry for ` + "`")) + (`key` + ("`" + ` exists, else `))) + (("`" + (`false` + "`")) + (`.\n */\nfunction stackHas(key) {\n return this.__data__.has(key);\n}\n\nmodule.exports = stackHas;\n", + "var ListCache = require('./_ListCache'),\n Map = require('./_Map'),\n MapCache = require('./_MapCache');\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * Sets the stack ` + ("`" + `key`)))) + ((("`" + (` to ` + "`")) + (`value` + ("`" + `.\n *\n * @private\n * @name set\n * @memberOf Stack\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the stack cache instance.\n */\nfunction stackSet(key, value) {\n var data = this.__data__;\n if (data instanceof ListCache) {\n var pairs = data.__data__;\n if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n pairs.push([key, value]);\n this.size = ++data.size;\n return this;\n }\n data = this.__data__ = new MapCache(pairs);\n }\n data.set(key, value);\n this.size = data.size;\n return this;\n}\n\nmodule.exports = stackSet;\n", + "/**\n * A specialized version of `))) + (("`" + (`_.indexOf` + "`")) + ((` which performs strict equality\n * comparisons of values, i.e. ` + "`") + (`===` + "`"))))) + ((((`.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else ` + ("`" + `-1`)) + ("`" + (`.\n */\nfunction strictIndexOf(array, value, fromIndex) {\n var index = fromIndex - 1,\n length = array.length;\n\n while (++index < length) {\n if (array[index] === value) {\n return index;\n }\n }\n return -1;\n}\n\nmodule.exports = strictIndexOf;\n", + "var memoizeCapped = require('./_memoizeCapped');\n\n/** Used to match property names within property paths. */\nvar rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n/** Used to match backslashes in property paths. */\nvar reEscapeChar = /\\\\(\\\\)?/g;\n\n/**\n * Converts ` + "`"))) + ((`string` + ("`" + ` to a property path array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the property path array.\n */\nvar stringToPath = memoizeCapped(function(string) {\n var result = [];\n if (string.charCodeAt(0) === 46 /* . */) {\n result.push('');\n }\n string.replace(rePropName, function(match, number, quote, subString) {\n result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));\n });\n return result;\n});\n\nmodule.exports = stringToPath;\n", + "var isSymbol = require('./isSymbol');\n\n/** Used as references for various `)) + ("`" + (`Number` + "`")))) + (((` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Converts ` + ("`" + `value`)) + ("`" + (` to a string key if it's not a string or symbol.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {string|symbol} Returns the key.\n */\nfunction toKey(value) {\n if (typeof value == 'string' || isSymbol(value)) {\n return value;\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = toKey;\n", + "/** Used for built-in method references. */\nvar funcProto = Function.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/**\n * Converts ` + "`"))) + ((`func` + ("`" + ` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n}\n\nmodule.exports = toSource;\n", + "/**\n * Creates a function that returns `)) + (("`" + `value`) + ("`" + `.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {*} value The value to return from the new function.\n * @returns {Function} Returns the new constant function.\n * @example\n *\n * var objects = _.times(2, _.constant({ 'a': 1 }));\n *\n * console.log(objects);\n * // => [{ 'a': 1 }, { 'a': 1 }]\n *\n * console.log(objects[0] === objects[1]);\n * // => true\n */\nfunction constant(value) {\n return function() {\n return value;\n };\n}\n\nmodule.exports = constant;\n", + "var isObject = require('./isObject'),\n now = require('./now'),\n toNumber = require('./toNumber');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/* Built-in method references for those with the same name as other `)))))))) + ((((((("`" + (`lodash` + "`")) + (` methods. */\nvar nativeMax = Math.max,\n nativeMin = Math.min;\n\n/**\n * Creates a debounced function that delays invoking ` + ("`" + `func`))) + (("`" + (` until after ` + "`")) + (`wait` + ("`" + `\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `)))) + ((("`" + (`cancel` + "`")) + (` method to cancel\n * delayed ` + ("`" + `func`))) + (("`" + (` invocations and a ` + "`")) + (`flush` + ("`" + ` method to immediately invoke them.\n * Provide `))))) + (((("`" + (`options` + "`")) + (` to indicate whether ` + ("`" + `func`))) + (("`" + (` should be invoked on the\n * leading and/or trailing edge of the ` + "`")) + (`wait` + ("`" + ` timeout. The `)))) + ((("`" + (`func` + "`")) + (` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last ` + ("`" + `func`))) + (("`" + (`\n * invocation.\n *\n * **Note:** If ` + "`")) + ((`leading` + "`") + (` and ` + "`")))))) + (((((`trailing` + ("`" + ` options are `)) + ("`" + (`true` + "`"))) + ((`, ` + ("`" + `func`)) + ("`" + (` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the ` + "`")))) + (((`wait` + ("`" + ` timeout.\n *\n * If `)) + ("`" + (`wait` + "`"))) + ((` is ` + ("`" + `0`)) + (("`" + ` and `) + ("`" + `leading`))))) + (((("`" + (` is ` + "`")) + (`false` + ("`" + `, `))) + (("`" + (`func` + "`")) + (` invocation is deferred\n * until to the next tick, similar to ` + ("`" + `setTimeout`)))) + ((("`" + (` with a timeout of ` + "`")) + (`0` + ("`" + `.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `))) + (("`" + (`_.debounce` + "`")) + ((` and ` + "`") + (`_.throttle` + "`"))))))) + ((((((`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n * Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n * The maximum time ` + ("`" + `func`)) + ("`" + (` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke ` + "`"))) + ((`sendMail` + ("`" + ` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n * 'leading': true,\n * 'trailing': false\n * }));\n *\n * // Ensure `)) + ("`" + (`batchLog` + "`")))) + (((` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\nfunction debounce(func, wait, options) {\n var lastArgs,\n lastThis,\n maxWait,\n result,\n timerId,\n lastCallTime,\n lastInvokeTime = 0,\n leading = false,\n maxing = false,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n wait = toNumber(wait) || 0;\n if (isObject(options)) {\n leading = !!options.leading;\n maxing = 'maxWait' in options;\n maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n\n function invokeFunc(time) {\n var args = lastArgs,\n thisArg = lastThis;\n\n lastArgs = lastThis = undefined;\n lastInvokeTime = time;\n result = func.apply(thisArg, args);\n return result;\n }\n\n function leadingEdge(time) {\n // Reset any ` + ("`" + `maxWait`)) + ("`" + (` timer.\n lastInvokeTime = time;\n // Start the timer for the trailing edge.\n timerId = setTimeout(timerExpired, wait);\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result;\n }\n\n function remainingWait(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime,\n timeWaiting = wait - timeSinceLastCall;\n\n return maxing\n ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)\n : timeWaiting;\n }\n\n function shouldInvoke(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime;\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the ` + "`"))) + ((`maxWait` + ("`" + ` limit.\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n }\n\n function timerExpired() {\n var time = now();\n if (shouldInvoke(time)) {\n return trailingEdge(time);\n }\n // Restart the timer.\n timerId = setTimeout(timerExpired, remainingWait(time));\n }\n\n function trailingEdge(time) {\n timerId = undefined;\n\n // Only invoke if we have `)) + (("`" + `lastArgs`) + ("`" + ` which means `))))) + (((("`" + (`func` + "`")) + (` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time);\n }\n lastArgs = lastThis = undefined;\n return result;\n }\n\n function cancel() {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n }\n lastInvokeTime = 0;\n lastArgs = lastCallTime = lastThis = timerId = undefined;\n }\n\n function flush() {\n return timerId === undefined ? result : trailingEdge(now());\n }\n\n function debounced() {\n var time = now(),\n isInvoking = shouldInvoke(time);\n\n lastArgs = arguments;\n lastThis = this;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime);\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n timerId = setTimeout(timerExpired, wait);\n return invokeFunc(lastCallTime);\n }\n }\n if (timerId === undefined) {\n timerId = setTimeout(timerExpired, wait);\n }\n return result;\n }\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n}\n\nmodule.exports = debounce;\n", + "/**\n * Performs a\n * [` + ("`" + `SameValueZero`))) + (("`" + (`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns ` + "`")) + (`true` + ("`" + ` if the values are equivalent, else `)))) + ((("`" + (`false` + "`")) + (`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\nmodule.exports = eq;\n", + "var arrayEvery = require('./_arrayEvery'),\n baseEvery = require('./_baseEvery'),\n baseIteratee = require('./_baseIteratee'),\n isArray = require('./isArray'),\n isIterateeCall = require('./_isIterateeCall');\n\n/**\n * Checks if ` + ("`" + `predicate`))) + (("`" + (` returns truthy for **all** elements of ` + "`")) + ((`collection` + "`") + (`.\n * Iteration is stopped once ` + "`")))))) + (((((`predicate` + ("`" + ` returns falsey. The predicate is\n * invoked with three arguments: (value, index|key, collection).\n *\n * **Note:** This method returns `)) + ("`" + (`true` + "`"))) + ((` for\n * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because\n * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of\n * elements of empty collections.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param- {Object} [guard] Enables use as an iteratee for methods like ` + ("`" + `_.map`)) + ("`" + (`.\n * @returns {boolean} Returns ` + "`")))) + (((`true` + ("`" + ` if all elements pass the predicate check,\n * else `)) + ("`" + (`false` + "`"))) + ((`.\n * @example\n *\n * _.every([true, 1, null, 'yes'], Boolean);\n * // => false\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': false },\n * { 'user': 'fred', 'age': 40, 'active': false }\n * ];\n *\n * // The ` + ("`" + `_.matches`)) + (("`" + ` iteratee shorthand.\n * _.every(users, { 'user': 'barney', 'active': false });\n * // => false\n *\n * // The `) + ("`" + `_.matchesProperty`))))) + (((("`" + (` iteratee shorthand.\n * _.every(users, ['active', false]);\n * // => true\n *\n * // The ` + "`")) + (`_.property` + ("`" + ` iteratee shorthand.\n * _.every(users, 'active');\n * // => false\n */\nfunction every(collection, predicate, guard) {\n var func = isArray(collection) ? arrayEvery : baseEvery;\n if (guard && isIterateeCall(collection, predicate, guard)) {\n predicate = undefined;\n }\n return func(collection, baseIteratee(predicate, 3));\n}\n\nmodule.exports = every;\n", + "var arrayFilter = require('./_arrayFilter'),\n baseFilter = require('./_baseFilter'),\n baseIteratee = require('./_baseIteratee'),\n isArray = require('./isArray');\n\n/**\n * Iterates over elements of `))) + (("`" + (`collection` + "`")) + (`, returning an array of all elements\n * ` + ("`" + `predicate`)))) + ((("`" + (` returns truthy for. The predicate is invoked with three\n * arguments: (value, index|key, collection).\n *\n * **Note:** Unlike ` + "`")) + (`_.remove` + ("`" + `, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n * @see _.reject\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': true },\n * { 'user': 'fred', 'age': 40, 'active': false }\n * ];\n *\n * _.filter(users, function(o) { return !o.active; });\n * // => objects for ['fred']\n *\n * // The `))) + (("`" + (`_.matches` + "`")) + ((` iteratee shorthand.\n * _.filter(users, { 'age': 36, 'active': true });\n * // => objects for ['barney']\n *\n * // The ` + "`") + (`_.matchesProperty` + "`"))))))))) + ((((((((` iteratee shorthand.\n * _.filter(users, ['active', false]);\n * // => objects for ['fred']\n *\n * // The ` + ("`" + `_.property`)) + ("`" + (` iteratee shorthand.\n * _.filter(users, 'active');\n * // => objects for ['barney']\n */\nfunction filter(collection, predicate) {\n var func = isArray(collection) ? arrayFilter : baseFilter;\n return func(collection, baseIteratee(predicate, 3));\n}\n\nmodule.exports = filter;\n", + "var createFind = require('./_createFind'),\n findIndex = require('./findIndex');\n\n/**\n * Iterates over elements of ` + "`"))) + ((`collection` + ("`" + `, returning the first element\n * `)) + ("`" + (`predicate` + "`")))) + (((` returns truthy for. The predicate is invoked with three\n * arguments: (value, index|key, collection).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param {number} [fromIndex=0] The index to search from.\n * @returns {*} Returns the matched element, else ` + ("`" + `undefined`)) + ("`" + (`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': true },\n * { 'user': 'fred', 'age': 40, 'active': false },\n * { 'user': 'pebbles', 'age': 1, 'active': true }\n * ];\n *\n * _.find(users, function(o) { return o.age < 40; });\n * // => object for 'barney'\n *\n * // The ` + "`"))) + ((`_.matches` + ("`" + ` iteratee shorthand.\n * _.find(users, { 'age': 1, 'active': true });\n * // => object for 'pebbles'\n *\n * // The `)) + ("`" + (`_.matchesProperty` + "`"))))) + ((((` iteratee shorthand.\n * _.find(users, ['active', false]);\n * // => object for 'fred'\n *\n * // The ` + ("`" + `_.property`)) + ("`" + (` iteratee shorthand.\n * _.find(users, 'active');\n * // => object for 'barney'\n */\nvar find = createFind(findIndex);\n\nmodule.exports = find;\n", + "var baseFindIndex = require('./_baseFindIndex'),\n baseIteratee = require('./_baseIteratee'),\n toInteger = require('./toInteger');\n\n/* Built-in method references for those with the same name as other ` + "`"))) + ((`lodash` + ("`" + ` methods. */\nvar nativeMax = Math.max;\n\n/**\n * This method is like `)) + ("`" + (`_.find` + "`")))) + (((` except that it returns the index of the first\n * element ` + ("`" + `predicate`)) + ("`" + (` returns truthy for instead of the element itself.\n *\n * @static\n * @memberOf _\n * @since 1.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param {number} [fromIndex=0] The index to search from.\n * @returns {number} Returns the index of the found element, else ` + "`"))) + ((`-1` + ("`" + `.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'active': false },\n * { 'user': 'fred', 'active': false },\n * { 'user': 'pebbles', 'active': true }\n * ];\n *\n * _.findIndex(users, function(o) { return o.user == 'barney'; });\n * // => 0\n *\n * // The `)) + (("`" + `_.matches`) + ("`" + ` iteratee shorthand.\n * _.findIndex(users, { 'user': 'fred', 'active': false });\n * // => 1\n *\n * // The `)))))) + ((((("`" + (`_.matchesProperty` + "`")) + (` iteratee shorthand.\n * _.findIndex(users, ['active', false]);\n * // => 0\n *\n * // The ` + ("`" + `_.property`))) + (("`" + (` iteratee shorthand.\n * _.findIndex(users, 'active');\n * // => 2\n */\nfunction findIndex(array, predicate, fromIndex) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return -1;\n }\n var index = fromIndex == null ? 0 : toInteger(fromIndex);\n if (index < 0) {\n index = nativeMax(length + index, 0);\n }\n return baseFindIndex(array, baseIteratee(predicate, 3), index);\n}\n\nmodule.exports = findIndex;\n", + "var baseFlatten = require('./_baseFlatten'),\n map = require('./map');\n\n/**\n * Creates a flattened array of values by running each element in ` + "`")) + (`collection` + ("`" + `\n * thru `)))) + ((("`" + (`iteratee` + "`")) + (` and flattening the mapped results. The iteratee is invoked\n * with three arguments: (value, index|key, collection).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * function duplicate(n) {\n * return [n, n];\n * }\n *\n * _.flatMap([1, 2], duplicate);\n * // => [1, 1, 2, 2]\n */\nfunction flatMap(collection, iteratee) {\n return baseFlatten(map(collection, iteratee), 1);\n}\n\nmodule.exports = flatMap;\n", + "var baseGet = require('./_baseGet');\n\n/**\n * Gets the value at ` + ("`" + `path`))) + (("`" + (` of ` + "`")) + ((`object` + "`") + (`. If the resolved value is\n * ` + "`"))))) + ((((`undefined` + ("`" + `, the `)) + ("`" + (`defaultValue` + "`"))) + ((` is returned in its place.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @param {*} [defaultValue] The value returned for ` + ("`" + `undefined`)) + ("`" + (` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.get(object, 'a[0].b.c');\n * // => 3\n *\n * _.get(object, ['a', '0', 'b', 'c']);\n * // => 3\n *\n * _.get(object, 'a.b.c', 'default');\n * // => 'default'\n */\nfunction get(object, path, defaultValue) {\n var result = object == null ? undefined : baseGet(object, path);\n return result === undefined ? defaultValue : result;\n}\n\nmodule.exports = get;\n", + "var baseHasIn = require('./_baseHasIn'),\n hasPath = require('./_hasPath');\n\n/**\n * Checks if ` + "`")))) + (((`path` + ("`" + ` is a direct or inherited property of `)) + ("`" + (`object` + "`"))) + ((`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns ` + ("`" + `true`)) + (("`" + ` if `) + ("`" + `path`))))))) + (((((("`" + (` exists, else ` + "`")) + (`false` + ("`" + `.\n * @example\n *\n * var object = _.create({ 'a': _.create({ 'b': 2 }) });\n *\n * _.hasIn(object, 'a');\n * // => true\n *\n * _.hasIn(object, 'a.b');\n * // => true\n *\n * _.hasIn(object, ['a', 'b']);\n * // => true\n *\n * _.hasIn(object, 'b');\n * // => false\n */\nfunction hasIn(object, path) {\n return object != null && hasPath(object, path, baseHasIn);\n}\n\nmodule.exports = hasIn;\n", + "/**\n * This method returns the first argument it receives.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {*} value Any value.\n * @returns {*} Returns `))) + (("`" + (`value` + "`")) + (`.\n * @example\n *\n * var object = { 'a': 1 };\n *\n * console.log(_.identity(object) === object);\n * // => true\n */\nfunction identity(value) {\n return value;\n}\n\nmodule.exports = identity;\n", + "var arrayMap = require('./_arrayMap'),\n baseIntersection = require('./_baseIntersection'),\n baseRest = require('./_baseRest'),\n castArrayLikeObject = require('./_castArrayLikeObject');\n\n/**\n * Creates an array of unique values that are included in all given arrays\n * using [` + ("`" + `SameValueZero`)))) + ((("`" + (`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons. The order and references of result values are\n * determined by the first array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @returns {Array} Returns the new array of intersecting values.\n * @example\n *\n * _.intersection([2, 1], [2, 3]);\n * // => [2]\n */\nvar intersection = baseRest(function(arrays) {\n var mapped = arrayMap(arrays, castArrayLikeObject);\n return (mapped.length && mapped[0] === arrays[0])\n ? baseIntersection(mapped)\n : [];\n});\n\nmodule.exports = intersection;\n", + "var baseIsArguments = require('./_baseIsArguments'),\n isObjectLike = require('./isObjectLike');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/**\n * Checks if ` + "`")) + (`value` + ("`" + ` is likely an `))) + (("`" + (`arguments` + "`")) + (` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns ` + ("`" + `true`))))) + (((("`" + (` if ` + "`")) + (`value` + ("`" + ` is an `))) + (("`" + (`arguments` + "`")) + (` object,\n * else ` + ("`" + `false`)))) + ((("`" + (`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nvar isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n !propertyIsEnumerable.call(value, 'callee');\n};\n\nmodule.exports = isArguments;\n", + "/**\n * Checks if ` + "`")) + (`value` + ("`" + ` is classified as an `))) + (("`" + (`Array` + "`")) + ((` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns ` + "`") + (`true` + "`")))))) + (((((` if ` + ("`" + `value`)) + ("`" + (` is an array, else ` + "`"))) + ((`false` + ("`" + `.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nmodule.exports = isArray;\n", + "var isFunction = require('./isFunction'),\n isLength = require('./isLength');\n\n/**\n * Checks if `)) + ("`" + (`value` + "`")))) + (((` is array-like. A value is considered array-like if it's\n * not a function and has a ` + ("`" + `value.length`)) + ("`" + (` that's an integer greater than or\n * equal to ` + "`"))) + ((`0` + ("`" + ` and less than or equal to `)) + (("`" + `Number.MAX_SAFE_INTEGER`) + ("`" + `.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `))))) + (((("`" + (`true` + "`")) + (` if ` + ("`" + `value`))) + (("`" + (` is array-like, else ` + "`")) + (`false` + ("`" + `.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n}\n\nmodule.exports = isArrayLike;\n", + "var isArrayLike = require('./isArrayLike'),\n isObjectLike = require('./isObjectLike');\n\n/**\n * This method is like `)))) + ((("`" + (`_.isArrayLike` + "`")) + (` except that it also checks if ` + ("`" + `value`))) + (("`" + (`\n * is an object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns ` + "`")) + ((`true` + "`") + (` if ` + "`")))))))) + (((((((`value` + ("`" + ` is an array-like object,\n * else `)) + ("`" + (`false` + "`"))) + ((`.\n * @example\n *\n * _.isArrayLikeObject([1, 2, 3]);\n * // => true\n *\n * _.isArrayLikeObject(document.body.children);\n * // => true\n *\n * _.isArrayLikeObject('abc');\n * // => false\n *\n * _.isArrayLikeObject(_.noop);\n * // => false\n */\nfunction isArrayLikeObject(value) {\n return isObjectLike(value) && isArrayLike(value);\n}\n\nmodule.exports = isArrayLikeObject;\n", + "var root = require('./_root'),\n stubFalse = require('./stubFalse');\n\n/** Detect free variable ` + ("`" + `exports`)) + ("`" + (`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable ` + "`")))) + (((`module` + ("`" + `. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `)) + ("`" + (`module.exports` + "`"))) + ((`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined;\n\n/* Built-in method references for those with the same name as other ` + ("`" + `lodash`)) + ("`" + (` methods. */\nvar nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined;\n\n/**\n * Checks if ` + "`"))))) + ((((`value` + ("`" + ` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `)) + ("`" + (`true` + "`"))) + ((` if ` + ("`" + `value`)) + ("`" + (` is a buffer, else ` + "`")))) + (((`false` + ("`" + `.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */\nvar isBuffer = nativeIsBuffer || stubFalse;\n\nmodule.exports = isBuffer;\n", + "var baseIsEqual = require('./_baseIsEqual');\n\n/**\n * Performs a deep comparison between two values to determine if they are\n * equivalent.\n *\n * **Note:** This method supports comparing arrays, array buffers, booleans,\n * date objects, error objects, maps, numbers, `)) + ("`" + (`Object` + "`"))) + ((` objects, regexes,\n * sets, strings, symbols, and typed arrays. ` + ("`" + `Object`)) + (("`" + ` objects are compared\n * by their own, not inherited, enumerable properties. Functions and DOM\n * nodes are compared by strict equality, i.e. `) + ("`" + `===`)))))) + ((((("`" + (`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns ` + "`")) + (`true` + ("`" + ` if the values are equivalent, else `))) + (("`" + (`false` + "`")) + (`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.isEqual(object, other);\n * // => true\n *\n * object === other;\n * // => false\n */\nfunction isEqual(value, other) {\n return baseIsEqual(value, other);\n}\n\nmodule.exports = isEqual;\n", + "var baseGetTag = require('./_baseGetTag'),\n isObject = require('./isObject');\n\n/** ` + ("`" + `Object#toString`)))) + ((("`" + (` result references. */\nvar asyncTag = '[object AsyncFunction]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n proxyTag = '[object Proxy]';\n\n/**\n * Checks if ` + "`")) + (`value` + ("`" + ` is classified as a `))) + (("`" + (`Function` + "`")) + ((` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns ` + "`") + (`true` + "`"))))) + ((((` if ` + ("`" + `value`)) + ("`" + (` is a function, else ` + "`"))) + ((`false` + ("`" + `.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n if (!isObject(value)) {\n return false;\n }\n // The use of `)) + ("`" + (`Object#toString` + "`")))) + (((` avoids issues with the ` + ("`" + `typeof`)) + ("`" + (` operator\n // in Safari 9 which returns 'object' for typed arrays and other constructors.\n var tag = baseGetTag(value);\n return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n}\n\nmodule.exports = isFunction;\n", + "/** Used as references for various ` + "`"))) + ((`Number` + ("`" + ` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * Checks if `)) + (("`" + `value`) + ("`" + ` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`))))))) + (((((("`" + (`ToLength` + "`")) + (`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns ` + ("`" + `true`))) + (("`" + (` if ` + "`")) + (`value` + ("`" + ` is a valid length, else `)))) + ((("`" + (`false` + "`")) + (`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\nmodule.exports = isLength;\n", + "var isNumber = require('./isNumber');\n\n/**\n * Checks if ` + ("`" + `value`))) + (("`" + (` is ` + "`")) + ((`NaN` + "`") + (`.\n *\n * **Note:** This method is based on\n * [` + "`"))))) + ((((`Number.isNaN` + ("`" + `](https://mdn.io/Number/isNaN) and is not the same as\n * global [`)) + ("`" + (`isNaN` + "`"))) + ((`](https://mdn.io/isNaN) which returns ` + ("`" + `true`)) + ("`" + (` for\n * ` + "`")))) + (((`undefined` + ("`" + ` and other non-number values.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `)) + ("`" + (`true` + "`"))) + ((` if ` + ("`" + `value`)) + (("`" + ` is `) + ("`" + `NaN`)))))) + ((((("`" + (`, else ` + "`")) + (`false` + ("`" + `.\n * @example\n *\n * _.isNaN(NaN);\n * // => true\n *\n * _.isNaN(new Number(NaN));\n * // => true\n *\n * isNaN(undefined);\n * // => true\n *\n * _.isNaN(undefined);\n * // => false\n */\nfunction isNaN(value) {\n // An `))) + (("`" + (`NaN` + "`")) + (` primitive is the only value that is not equal to itself.\n // Perform the ` + ("`" + `toStringTag`)))) + ((("`" + (` check first to avoid errors with some\n // ActiveX objects in IE.\n return isNumber(value) && value != +value;\n}\n\nmodule.exports = isNaN;\n", + "/**\n * Checks if ` + "`")) + (`value` + ("`" + ` is `))) + (("`" + (`null` + "`")) + ((` or ` + "`") + (`undefined` + "`"))))) + ((((`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns ` + ("`" + `true`)) + ("`" + (` if ` + "`"))) + ((`value` + ("`" + ` is nullish, else `)) + ("`" + (`false` + "`")))) + (((`.\n * @example\n *\n * _.isNil(null);\n * // => true\n *\n * _.isNil(void 0);\n * // => true\n *\n * _.isNil(NaN);\n * // => false\n */\nfunction isNil(value) {\n return value == null;\n}\n\nmodule.exports = isNil;\n", + "var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** ` + ("`" + `Object#toString`)) + ("`" + (` result references. */\nvar numberTag = '[object Number]';\n\n/**\n * Checks if ` + "`"))) + ((`value` + ("`" + ` is classified as a `)) + (("`" + `Number`) + ("`" + ` primitive or object.\n *\n * **Note:** To exclude `))))))))))) + (((((((((("`" + (`Infinity` + "`")) + (`, ` + ("`" + `-Infinity`))) + (("`" + (`, and ` + "`")) + (`NaN` + ("`" + `, which are\n * classified as numbers, use the `)))) + ((("`" + (`_.isFinite` + "`")) + (` method.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns ` + ("`" + `true`))) + (("`" + (` if ` + "`")) + (`value` + ("`" + ` is a number, else `))))) + (((("`" + (`false` + "`")) + (`.\n * @example\n *\n * _.isNumber(3);\n * // => true\n *\n * _.isNumber(Number.MIN_VALUE);\n * // => true\n *\n * _.isNumber(Infinity);\n * // => true\n *\n * _.isNumber('3');\n * // => false\n */\nfunction isNumber(value) {\n return typeof value == 'number' ||\n (isObjectLike(value) && baseGetTag(value) == numberTag);\n}\n\nmodule.exports = isNumber;\n", + "/**\n * Checks if ` + ("`" + `value`))) + (("`" + (` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of ` + "`")) + (`Object` + ("`" + `. (e.g. arrays, functions, objects, regexes, `)))) + ((("`" + (`new Number(0)` + "`")) + (`, and ` + ("`" + `new String('')`))) + (("`" + (`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns ` + "`")) + ((`true` + "`") + (` if ` + "`")))))) + (((((`value` + ("`" + ` is an object, else `)) + ("`" + (`false` + "`"))) + ((`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n}\n\nmodule.exports = isObject;\n", + "/**\n * Checks if ` + ("`" + `value`)) + ("`" + (` is object-like. A value is object-like if it's not ` + "`")))) + (((`null` + ("`" + `\n * and has a `)) + ("`" + (`typeof` + "`"))) + ((` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns ` + ("`" + `true`)) + (("`" + ` if `) + ("`" + `value`))))) + (((("`" + (` is object-like, else ` + "`")) + (`false` + ("`" + `.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n", + "var baseGetTag = require('./_baseGetTag'),\n getPrototype = require('./_getPrototype'),\n isObjectLike = require('./isObjectLike');\n\n/** `))) + (("`" + (`Object#toString` + "`")) + (` result references. */\nvar objectTag = '[object Object]';\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to infer the ` + ("`" + `Object`)))) + ((("`" + (` constructor. */\nvar objectCtorString = funcToString.call(Object);\n\n/**\n * Checks if ` + "`")) + (`value` + ("`" + ` is a plain object, that is, an object created by the\n * `))) + (("`" + (`Object` + "`")) + ((` constructor or one with a ` + "`") + (`[[Prototype]]` + "`"))))))) + ((((((` of ` + ("`" + `null`)) + ("`" + (`.\n *\n * @static\n * @memberOf _\n * @since 0.8.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns ` + "`"))) + ((`true` + ("`" + ` if `)) + ("`" + (`value` + "`")))) + (((` is a plain object, else ` + ("`" + `false`)) + ("`" + (`.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * }\n *\n * _.isPlainObject(new Foo);\n * // => false\n *\n * _.isPlainObject([1, 2, 3]);\n * // => false\n *\n * _.isPlainObject({ 'x': 0, 'y': 0 });\n * // => true\n *\n * _.isPlainObject(Object.create(null));\n * // => true\n */\nfunction isPlainObject(value) {\n if (!isObjectLike(value) || baseGetTag(value) != objectTag) {\n return false;\n }\n var proto = getPrototype(value);\n if (proto === null) {\n return true;\n }\n var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;\n return typeof Ctor == 'function' && Ctor instanceof Ctor &&\n funcToString.call(Ctor) == objectCtorString;\n}\n\nmodule.exports = isPlainObject;\n", + "var baseGetTag = require('./_baseGetTag'),\n isArray = require('./isArray'),\n isObjectLike = require('./isObjectLike');\n\n/** ` + "`"))) + ((`Object#toString` + ("`" + ` result references. */\nvar stringTag = '[object String]';\n\n/**\n * Checks if `)) + ("`" + (`value` + "`"))))) + ((((` is classified as a ` + ("`" + `String`)) + ("`" + (` primitive or object.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns ` + "`"))) + ((`true` + ("`" + ` if `)) + ("`" + (`value` + "`")))) + (((` is a string, else ` + ("`" + `false`)) + ("`" + (`.\n * @example\n *\n * _.isString('abc');\n * // => true\n *\n * _.isString(1);\n * // => false\n */\nfunction isString(value) {\n return typeof value == 'string' ||\n (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);\n}\n\nmodule.exports = isString;\n", + "var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** ` + "`"))) + ((`Object#toString` + ("`" + ` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Checks if `)) + (("`" + `value`) + ("`" + ` is classified as a `)))))) + ((((("`" + (`Symbol` + "`")) + (` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns ` + ("`" + `true`))) + (("`" + (` if ` + "`")) + (`value` + ("`" + ` is a symbol, else `)))) + ((("`" + (`false` + "`")) + (`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\n}\n\nmodule.exports = isSymbol;\n", + "var baseIsTypedArray = require('./_baseIsTypedArray'),\n baseUnary = require('./_baseUnary'),\n nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n/**\n * Checks if ` + ("`" + `value`))) + (("`" + (` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns ` + "`")) + ((`true` + "`") + (` if ` + "`"))))) + ((((`value` + ("`" + ` is a typed array, else `)) + ("`" + (`false` + "`"))) + ((`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\nvar isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\nmodule.exports = isTypedArray;\n", + "var arrayLikeKeys = require('./_arrayLikeKeys'),\n baseKeys = require('./_baseKeys'),\n isArrayLike = require('./isArrayLike');\n\n/**\n * Creates an array of the own enumerable property names of ` + ("`" + `object`)) + ("`" + (`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\nfunction keys(object) {\n return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n}\n\nmodule.exports = keys;\n", + "/**\n * Gets the last element of ` + "`")))) + (((`array` + ("`" + `.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to query.\n * @returns {*} Returns the last element of `)) + ("`" + (`array` + "`"))) + ((`.\n * @example\n *\n * _.last([1, 2, 3]);\n * // => 3\n */\nfunction last(array) {\n var length = array == null ? 0 : array.length;\n return length ? array[length - 1] : undefined;\n}\n\nmodule.exports = last;\n", + "var arrayMap = require('./_arrayMap'),\n baseIteratee = require('./_baseIteratee'),\n baseMap = require('./_baseMap'),\n isArray = require('./isArray');\n\n/**\n * Creates an array of values by running each element in ` + ("`" + `collection`)) + (("`" + ` thru\n * `) + ("`" + `iteratee`)))))))) + ((((((("`" + (`. The iteratee is invoked with three arguments:\n * (value, index|key, collection).\n *\n * Many lodash methods are guarded to work as iteratees for methods like\n * ` + "`")) + (`_.every` + ("`" + `, `))) + (("`" + (`_.filter` + "`")) + (`, ` + ("`" + `_.map`)))) + ((("`" + (`, ` + "`")) + (`_.mapValues` + ("`" + `, `))) + (("`" + (`_.reject` + "`")) + (`, and ` + ("`" + `_.some`))))) + (((("`" + (`.\n *\n * The guarded methods are:\n * ` + "`")) + (`ary` + ("`" + `, `))) + (("`" + (`chunk` + "`")) + (`, ` + ("`" + `curry`)))) + ((("`" + (`, ` + "`")) + (`curryRight` + ("`" + `, `))) + (("`" + (`drop` + "`")) + ((`, ` + "`") + (`dropRight` + "`")))))) + (((((`, ` + ("`" + `every`)) + ("`" + (`,\n * ` + "`"))) + ((`fill` + ("`" + `, `)) + ("`" + (`invert` + "`")))) + (((`, ` + ("`" + `parseInt`)) + ("`" + (`, ` + "`"))) + ((`random` + ("`" + `, `)) + (("`" + `range`) + ("`" + `, `))))) + (((("`" + (`rangeRight` + "`")) + (`, ` + ("`" + `repeat`))) + (("`" + (`,\n * ` + "`")) + (`sampleSize` + ("`" + `, `)))) + ((("`" + (`slice` + "`")) + (`, ` + ("`" + `some`))) + (("`" + (`, ` + "`")) + ((`sortBy` + "`") + (`, ` + "`"))))))) + ((((((`split` + ("`" + `, `)) + ("`" + (`take` + "`"))) + ((`, ` + ("`" + `takeRight`)) + ("`" + (`,\n * ` + "`")))) + (((`template` + ("`" + `, `)) + ("`" + (`trim` + "`"))) + ((`, ` + ("`" + `trimEnd`)) + (("`" + `, `) + ("`" + `trimStart`))))) + (((("`" + (`, and ` + "`")) + (`words` + ("`" + `\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n * @example\n *\n * function square(n) {\n * return n * n;\n * }\n *\n * _.map([4, 8], square);\n * // => [16, 64]\n *\n * _.map({ 'a': 4, 'b': 8 }, square);\n * // => [16, 64] (iteration order is not guaranteed)\n *\n * var users = [\n * { 'user': 'barney' },\n * { 'user': 'fred' }\n * ];\n *\n * // The `))) + (("`" + (`_.property` + "`")) + (` iteratee shorthand.\n * _.map(users, 'user');\n * // => ['barney', 'fred']\n */\nfunction map(collection, iteratee) {\n var func = isArray(collection) ? arrayMap : baseMap;\n return func(collection, baseIteratee(iteratee, 3));\n}\n\nmodule.exports = map;\n", + "var baseAssignValue = require('./_baseAssignValue'),\n baseForOwn = require('./_baseForOwn'),\n baseIteratee = require('./_baseIteratee');\n\n/**\n * Creates an object with the same keys as ` + ("`" + `object`)))) + ((("`" + (` and values generated\n * by running each own enumerable string keyed property of ` + "`")) + (`object` + ("`" + ` thru\n * `))) + (("`" + (`iteratee` + "`")) + ((`. The iteratee is invoked with three arguments:\n * (value, key, object).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns the new mapped object.\n * @see _.mapKeys\n * @example\n *\n * var users = {\n * 'fred': { 'user': 'fred', 'age': 40 },\n * 'pebbles': { 'user': 'pebbles', 'age': 1 }\n * };\n *\n * _.mapValues(users, function(o) { return o.age; });\n * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\n *\n * // The ` + "`") + (`_.property` + "`")))))) + (((((` iteratee shorthand.\n * _.mapValues(users, 'age');\n * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\n */\nfunction mapValues(object, iteratee) {\n var result = {};\n iteratee = baseIteratee(iteratee, 3);\n\n baseForOwn(object, function(value, key, object) {\n baseAssignValue(result, key, iteratee(value, key, object));\n });\n return result;\n}\n\nmodule.exports = mapValues;\n", + "var baseExtremum = require('./_baseExtremum'),\n baseGt = require('./_baseGt'),\n identity = require('./identity');\n\n/**\n * Computes the maximum value of ` + ("`" + `array`)) + ("`" + (`. If ` + "`"))) + ((`array` + ("`" + ` is empty or falsey,\n * `)) + ("`" + (`undefined` + "`")))) + (((` is returned.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Math\n * @param {Array} array The array to iterate over.\n * @returns {*} Returns the maximum value.\n * @example\n *\n * _.max([4, 2, 8, 6]);\n * // => 8\n *\n * _.max([]);\n * // => undefined\n */\nfunction max(array) {\n return (array && array.length)\n ? baseExtremum(array, identity, baseGt)\n : undefined;\n}\n\nmodule.exports = max;\n", + "var MapCache = require('./_MapCache');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a function that memoizes the result of ` + ("`" + `func`)) + ("`" + (`. If ` + "`"))) + ((`resolver` + ("`" + ` is\n * provided, it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, the first argument\n * provided to the memoized function is used as the map cache key. The `)) + (("`" + `func`) + ("`" + `\n * is invoked with the `))))) + (((("`" + (`this` + "`")) + (` binding of the memoized function.\n *\n * **Note:** The cache is exposed as the ` + ("`" + `cache`))) + (("`" + (` property on the memoized\n * function. Its creation may be customized by replacing the ` + "`")) + (`_.memoize.Cache` + ("`" + `\n * constructor with one whose instances implement the\n * [`)))) + ((("`" + (`Map` + "`")) + (`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n * method interface of ` + ("`" + `clear`))) + (("`" + (`, ` + "`")) + ((`delete` + "`") + (`, ` + "`"))))))))) + ((((((((`get` + ("`" + `, `)) + ("`" + (`has` + "`"))) + ((`, and ` + ("`" + `set`)) + ("`" + (`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to have its output memoized.\n * @param {Function} [resolver] The function to resolve the cache key.\n * @returns {Function} Returns the new memoized function.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n * var other = { 'c': 3, 'd': 4 };\n *\n * var values = _.memoize(_.values);\n * values(object);\n * // => [1, 2]\n *\n * values(other);\n * // => [3, 4]\n *\n * object.a = 2;\n * values(object);\n * // => [1, 2]\n *\n * // Modify the result cache.\n * values.cache.set(object, ['a', 'b']);\n * values(object);\n * // => ['a', 'b']\n *\n * // Replace ` + "`")))) + (((`_.memoize.Cache` + ("`" + `.\n * _.memoize.Cache = WeakMap;\n */\nfunction memoize(func, resolver) {\n if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n var memoized = function() {\n var args = arguments,\n key = resolver ? resolver.apply(this, args) : args[0],\n cache = memoized.cache;\n\n if (cache.has(key)) {\n return cache.get(key);\n }\n var result = func.apply(this, args);\n memoized.cache = cache.set(key, result) || cache;\n return result;\n };\n memoized.cache = new (memoize.Cache || MapCache);\n return memoized;\n}\n\n// Expose `)) + ("`" + (`MapCache` + "`"))) + ((`.\nmemoize.Cache = MapCache;\n\nmodule.exports = memoize;\n", + "var baseExtremum = require('./_baseExtremum'),\n baseLt = require('./_baseLt'),\n identity = require('./identity');\n\n/**\n * Computes the minimum value of ` + ("`" + `array`)) + ("`" + (`. If ` + "`"))))) + ((((`array` + ("`" + ` is empty or falsey,\n * `)) + ("`" + (`undefined` + "`"))) + ((` is returned.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Math\n * @param {Array} array The array to iterate over.\n * @returns {*} Returns the minimum value.\n * @example\n *\n * _.min([4, 2, 8, 6]);\n * // => 2\n *\n * _.min([]);\n * // => undefined\n */\nfunction min(array) {\n return (array && array.length)\n ? baseExtremum(array, identity, baseLt)\n : undefined;\n}\n\nmodule.exports = min;\n", + "/**\n * This method returns ` + ("`" + `undefined`)) + ("`" + (`.\n *\n * @static\n * @memberOf _\n * @since 2.3.0\n * @category Util\n * @example\n *\n * _.times(2, _.noop);\n * // => [undefined, undefined]\n */\nfunction noop() {\n // No operation performed.\n}\n\nmodule.exports = noop;\n", "var root = require('./_root');\n\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n * console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\nvar now = function() {\n return root.Date.now();\n};\n\nmodule.exports = now;\n", - "var baseProperty = require('./_baseProperty'),\n basePropertyDeep = require('./_basePropertyDeep'),\n isKey = require('./_isKey'),\n toKey = require('./_toKey');\n\n/**\n * Creates a function that returns the value at ` + ("`" + `path`)) + ("`" + (` of a given object.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n * @example\n *\n * var objects = [\n * { 'a': { 'b': 2 } },\n * { 'a': { 'b': 1 } }\n * ];\n *\n * _.map(objects, _.property('a.b'));\n * // => [2, 1]\n *\n * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');\n * // => [1, 2]\n */\nfunction property(path) {\n return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);\n}\n\nmodule.exports = property;\n", - "var createRange = require('./_createRange');\n\n/**\n * Creates an array of numbers (positive and/or negative) progressing from\n * ` + "`")))) + (((`start` + "`") + (` up to, but not including, ` + ("`" + `end`))) + (("`" + (`. A step of ` + "`")) + (`-1` + ("`" + ` is used if a negative\n * `)))))) + ((((("`" + `start`) + ("`" + (` is specified without an ` + "`"))) + ((`end` + ("`" + ` or `)) + ("`" + (`step` + "`")))) + (((`. If ` + "`") + (`end` + ("`" + ` is not specified,\n * it's set to `))) + (("`" + (`start` + "`")) + (` with ` + ("`" + `start`))))) + (((("`" + ` then set to `) + ("`" + (`0` + "`"))) + ((`.\n *\n * **Note:** JavaScript follows the IEEE-754 standard for resolving\n * floating-point values which can produce unexpected results.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {number} [start=0] The start of the range.\n * @param {number} end The end of the range.\n * @param {number} [step=1] The value to increment or decrement by.\n * @returns {Array} Returns the range of numbers.\n * @see _.inRange, _.rangeRight\n * @example\n *\n * _.range(4);\n * // => [0, 1, 2, 3]\n *\n * _.range(-4);\n * // => [0, -1, -2, -3]\n *\n * _.range(1, 5);\n * // => [1, 2, 3, 4]\n *\n * _.range(0, 20, 5);\n * // => [0, 5, 10, 15]\n *\n * _.range(0, -4, -1);\n * // => [0, -1, -2, -3]\n *\n * _.range(1, 4, 0);\n * // => [1, 1, 1]\n *\n * _.range(0);\n * // => []\n */\nvar range = createRange();\n\nmodule.exports = range;\n", - "var arraySome = require('./_arraySome'),\n baseIteratee = require('./_baseIteratee'),\n baseSome = require('./_baseSome'),\n isArray = require('./isArray'),\n isIterateeCall = require('./_isIterateeCall');\n\n/**\n * Checks if ` + ("`" + `predicate`)) + ("`" + (` returns truthy for **any** element of ` + "`")))) + (((`collection` + ("`" + `.\n * Iteration is stopped once `)) + ("`" + (`predicate` + "`"))) + ((` returns truthy. The predicate is\n * invoked with three arguments: (value, index|key, collection).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param- {Object} [guard] Enables use as an iteratee for methods like ` + ("`" + `_.map`)) + ("`" + (`.\n * @returns {boolean} Returns ` + "`"))))))) + ((((((`true` + "`") + (` if any element passes the predicate check,\n * else ` + ("`" + `false`))) + (("`" + (`.\n * @example\n *\n * _.some([null, 0, 'yes', false], Boolean);\n * // => true\n *\n * var users = [\n * { 'user': 'barney', 'active': true },\n * { 'user': 'fred', 'active': false }\n * ];\n *\n * // The ` + "`")) + (`_.matches` + ("`" + ` iteratee shorthand.\n * _.some(users, { 'user': 'barney', 'active': false });\n * // => false\n *\n * // The `)))) + ((("`" + `_.matchesProperty`) + ("`" + (` iteratee shorthand.\n * _.some(users, ['active', false]);\n * // => true\n *\n * // The ` + "`"))) + ((`_.property` + ("`" + ` iteratee shorthand.\n * _.some(users, 'active');\n * // => true\n */\nfunction some(collection, predicate, guard) {\n var func = isArray(collection) ? arraySome : baseSome;\n if (guard && isIterateeCall(collection, predicate, guard)) {\n predicate = undefined;\n }\n return func(collection, baseIteratee(predicate, 3));\n}\n\nmodule.exports = some;\n", + "var baseProperty = require('./_baseProperty'),\n basePropertyDeep = require('./_basePropertyDeep'),\n isKey = require('./_isKey'),\n toKey = require('./_toKey');\n\n/**\n * Creates a function that returns the value at ` + "`")))) + (((`path` + ("`" + ` of a given object.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n * @example\n *\n * var objects = [\n * { 'a': { 'b': 2 } },\n * { 'a': { 'b': 1 } }\n * ];\n *\n * _.map(objects, _.property('a.b'));\n * // => [2, 1]\n *\n * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');\n * // => [1, 2]\n */\nfunction property(path) {\n return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);\n}\n\nmodule.exports = property;\n", + "var createRange = require('./_createRange');\n\n/**\n * Creates an array of numbers (positive and/or negative) progressing from\n * `)) + ("`" + (`start` + "`"))) + ((` up to, but not including, ` + ("`" + `end`)) + (("`" + `. A step of `) + ("`" + `-1`)))))) + ((((("`" + (` is used if a negative\n * ` + "`")) + (`start` + ("`" + ` is specified without an `))) + (("`" + (`end` + "`")) + (` or ` + ("`" + `step`)))) + ((("`" + (`. If ` + "`")) + (`end` + ("`" + ` is not specified,\n * it's set to `))) + (("`" + (`start` + "`")) + ((` with ` + "`") + (`start` + "`"))))) + ((((` then set to ` + ("`" + `0`)) + ("`" + (`.\n *\n * **Note:** JavaScript follows the IEEE-754 standard for resolving\n * floating-point values which can produce unexpected results.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {number} [start=0] The start of the range.\n * @param {number} end The end of the range.\n * @param {number} [step=1] The value to increment or decrement by.\n * @returns {Array} Returns the range of numbers.\n * @see _.inRange, _.rangeRight\n * @example\n *\n * _.range(4);\n * // => [0, 1, 2, 3]\n *\n * _.range(-4);\n * // => [0, -1, -2, -3]\n *\n * _.range(1, 5);\n * // => [1, 2, 3, 4]\n *\n * _.range(0, 20, 5);\n * // => [0, 5, 10, 15]\n *\n * _.range(0, -4, -1);\n * // => [0, -1, -2, -3]\n *\n * _.range(1, 4, 0);\n * // => [1, 1, 1]\n *\n * _.range(0);\n * // => []\n */\nvar range = createRange();\n\nmodule.exports = range;\n", + "var arraySome = require('./_arraySome'),\n baseIteratee = require('./_baseIteratee'),\n baseSome = require('./_baseSome'),\n isArray = require('./isArray'),\n isIterateeCall = require('./_isIterateeCall');\n\n/**\n * Checks if ` + "`"))) + ((`predicate` + ("`" + ` returns truthy for **any** element of `)) + ("`" + (`collection` + "`")))) + (((`.\n * Iteration is stopped once ` + ("`" + `predicate`)) + ("`" + (` returns truthy. The predicate is\n * invoked with three arguments: (value, index|key, collection).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param- {Object} [guard] Enables use as an iteratee for methods like ` + "`"))) + ((`_.map` + ("`" + `.\n * @returns {boolean} Returns `)) + (("`" + `true`) + ("`" + ` if any element passes the predicate check,\n * else `))))))) + (((((("`" + (`false` + "`")) + (`.\n * @example\n *\n * _.some([null, 0, 'yes', false], Boolean);\n * // => true\n *\n * var users = [\n * { 'user': 'barney', 'active': true },\n * { 'user': 'fred', 'active': false }\n * ];\n *\n * // The ` + ("`" + `_.matches`))) + (("`" + (` iteratee shorthand.\n * _.some(users, { 'user': 'barney', 'active': false });\n * // => false\n *\n * // The ` + "`")) + (`_.matchesProperty` + ("`" + ` iteratee shorthand.\n * _.some(users, ['active', false]);\n * // => true\n *\n * // The `)))) + ((("`" + (`_.property` + "`")) + (` iteratee shorthand.\n * _.some(users, 'active');\n * // => true\n */\nfunction some(collection, predicate, guard) {\n var func = isArray(collection) ? arraySome : baseSome;\n if (guard && isIterateeCall(collection, predicate, guard)) {\n predicate = undefined;\n }\n return func(collection, baseIteratee(predicate, 3));\n}\n\nmodule.exports = some;\n", "var baseFlatten = require('./_baseFlatten'),\n baseOrderBy = require('./_baseOrderBy'),\n baseRest = require('./_baseRest'),\n isIterateeCall = require('./_isIterateeCall');\n\n/**\n * Creates an array of elements, sorted in ascending order by the results of\n * running each element in a collection thru each iteratee. This method\n * performs a stable sort, that is, it preserves the original sort order of\n * equal elements. The iteratees are invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {...(Function|Function[])} [iteratees=[_.identity]]\n * The iteratees to sort by.\n * @returns {Array} Returns the new sorted array.\n * @example\n *\n * var users = [\n * { 'user': 'fred', 'age': 48 },\n * { 'user': 'barney', 'age': 36 },\n * { 'user': 'fred', 'age': 40 },\n * { 'user': 'barney', 'age': 34 }\n * ];\n *\n * _.sortBy(users, [function(o) { return o.user; }]);\n * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]\n *\n * _.sortBy(users, ['user', 'age']);\n * // => objects for [['barney', 34], ['barney', 36], ['fred', 40], ['fred', 48]]\n */\nvar sortBy = baseRest(function(collection, iteratees) {\n if (collection == null) {\n return [];\n }\n var length = iteratees.length;\n if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) {\n iteratees = [];\n } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) {\n iteratees = [iteratees[0]];\n }\n return baseOrderBy(collection, baseFlatten(iteratees, 1), []);\n});\n\nmodule.exports = sortBy;\n", "/**\n * This method returns a new empty array.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {Array} Returns the new empty array.\n * @example\n *\n * var arrays = _.times(2, _.stubArray);\n *\n * console.log(arrays);\n * // => [[], []]\n *\n * console.log(arrays[0] === arrays[1]);\n * // => false\n */\nfunction stubArray() {\n return [];\n}\n\nmodule.exports = stubArray;\n", - "/**\n * This method returns `)) + ("`" + (`false` + "`"))))) + ((((`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns ` + "`") + (`false` + ("`" + `.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\nfunction stubFalse() {\n return false;\n}\n\nmodule.exports = stubFalse;\n", - "var debounce = require('./debounce'),\n isObject = require('./isObject');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a throttled function that only invokes `))) + (("`" + (`func` + "`")) + (` at most once per\n * every ` + ("`" + `wait`)))) + ((("`" + ` milliseconds. The throttled function comes with a `) + ("`" + (`cancel` + "`"))) + ((`\n * method to cancel delayed ` + ("`" + `func`)) + ("`" + (` invocations and a ` + "`")))))) + (((((`flush` + "`") + (` method to\n * immediately invoke them. Provide ` + ("`" + `options`))) + (("`" + (` to indicate whether ` + "`")) + (`func` + ("`" + `\n * should be invoked on the leading and/or trailing edge of the `)))) + ((("`" + `wait`) + ("`" + (`\n * timeout. The ` + "`"))) + ((`func` + ("`" + ` is invoked with the last arguments provided to the\n * throttled function. Subsequent calls to the throttled function return the\n * result of the last `)) + ("`" + (`func` + "`"))))) + ((((` invocation.\n *\n * **Note:** If ` + "`") + (`leading` + ("`" + ` and `))) + (("`" + (`trailing` + "`")) + (` options are ` + ("`" + `true`)))) + ((("`" + (`, ` + "`")) + (`func` + ("`" + ` is\n * invoked on the trailing edge of the timeout only if the throttled function\n * is invoked more than once during the `))) + (("`" + (`wait` + "`")) + (` timeout.\n *\n * If ` + ("`" + `wait`)))))))))) + ((((((((("`" + ` is `) + ("`" + (`0` + "`"))) + ((` and ` + ("`" + `leading`)) + ("`" + (` is ` + "`")))) + (((`false` + "`") + (`, ` + ("`" + `func`))) + (("`" + (` invocation is deferred\n * until to the next tick, similar to ` + "`")) + (`setTimeout` + ("`" + ` with a timeout of `))))) + (((("`" + `0`) + ("`" + (`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between ` + "`"))) + ((`_.throttle` + ("`" + ` and `)) + ("`" + (`_.debounce` + "`")))) + (((`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to throttle.\n * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=true]\n * Specify invoking on the leading edge of the timeout.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new throttled function.\n * @example\n *\n * // Avoid excessively updating the position while scrolling.\n * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\n *\n * // Invoke ` + "`") + (`renewToken` + ("`" + ` when the click event is fired, but not more than once every 5 minutes.\n * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });\n * jQuery(element).on('click', throttled);\n *\n * // Cancel the trailing throttled invocation.\n * jQuery(window).on('popstate', throttled.cancel);\n */\nfunction throttle(func, wait, options) {\n var leading = true,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n if (isObject(options)) {\n leading = 'leading' in options ? !!options.leading : leading;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n return debounce(func, wait, {\n 'leading': leading,\n 'maxWait': wait,\n 'trailing': trailing\n });\n}\n\nmodule.exports = throttle;\n", - "var toNumber = require('./toNumber');\n\n/** Used as references for various `))) + (("`" + (`Number` + "`")) + (` constants. */\nvar INFINITY = 1 / 0,\n MAX_INTEGER = 1.7976931348623157e+308;\n\n/**\n * Converts ` + ("`" + `value`)))))) + ((((("`" + ` to a finite number.\n *\n * @static\n * @memberOf _\n * @since 4.12.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted number.\n * @example\n *\n * _.toFinite(3.2);\n * // => 3.2\n *\n * _.toFinite(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toFinite(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toFinite('3.2');\n * // => 3.2\n */\nfunction toFinite(value) {\n if (!value) {\n return value === 0 ? value : 0;\n }\n value = toNumber(value);\n if (value === INFINITY || value === -INFINITY) {\n var sign = (value < 0 ? -1 : 1);\n return sign * MAX_INTEGER;\n }\n return value === value ? value : 0;\n}\n\nmodule.exports = toFinite;\n", - "var toFinite = require('./toFinite');\n\n/**\n * Converts `) + ("`" + (`value` + "`"))) + ((` to an integer.\n *\n * **Note:** This method is loosely based on\n * [` + ("`" + `ToInteger`)) + ("`" + (`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.toInteger(3.2);\n * // => 3\n *\n * _.toInteger(Number.MIN_VALUE);\n * // => 0\n *\n * _.toInteger(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toInteger('3.2');\n * // => 3\n */\nfunction toInteger(value) {\n var result = toFinite(value),\n remainder = result % 1;\n\n return result === result ? (remainder ? result - remainder : result) : 0;\n}\n\nmodule.exports = toInteger;\n", - "var isObject = require('./isObject'),\n isSymbol = require('./isSymbol');\n\n/** Used as references for various ` + "`")))) + (((`Number` + "`") + (` constants. */\nvar NAN = 0 / 0;\n\n/** Used to match leading and trailing whitespace. */\nvar reTrim = /^\\s+|\\s+$/g;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on ` + ("`" + `root`))) + (("`" + (`. */\nvar freeParseInt = parseInt;\n\n/**\n * Converts ` + "`")) + (`value` + ("`" + ` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = value.replace(reTrim, '');\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = toNumber;\n", - "var baseToString = require('./_baseToString');\n\n/**\n * Converts `))))) + (((("`" + `value`) + ("`" + (` to a string. An empty string is returned for ` + "`"))) + ((`null` + ("`" + `\n * and `)) + ("`" + (`undefined` + "`")))) + (((` values. The sign of ` + "`") + (`-0` + ("`" + ` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\nfunction toString(value) {\n return value == null ? '' : baseToString(value);\n}\n\nmodule.exports = toString;\n", - "var baseIteratee = require('./_baseIteratee'),\n baseUniq = require('./_baseUniq');\n\n/**\n * This method is like `))) + (("`" + (`_.uniq` + "`")) + (` except that it accepts ` + ("`" + `iteratee`))))))) + (((((("`" + ` which is\n * invoked for each element in `) + ("`" + (`array` + "`"))) + ((` to generate the criterion by which\n * uniqueness is computed. The order of result values is determined by the\n * order they occur in the array. The iteratee is invoked with one argument:\n * (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n * @example\n *\n * _.uniqBy([2.1, 1.2, 2.3], Math.floor);\n * // => [2.1, 1.2]\n *\n * // The ` + ("`" + `_.property`)) + ("`" + (` iteratee shorthand.\n * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');\n * // => [{ 'x': 1 }, { 'x': 2 }]\n */\nfunction uniqBy(array, iteratee) {\n return (array && array.length) ? baseUniq(array, baseIteratee(iteratee, 2)) : [];\n}\n\nmodule.exports = uniqBy;\n", + "/**\n * This method returns ` + ("`" + `false`))) + (("`" + (`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns ` + "`")) + (`false` + ("`" + `.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\nfunction stubFalse() {\n return false;\n}\n\nmodule.exports = stubFalse;\n", + "var debounce = require('./debounce'),\n isObject = require('./isObject');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a throttled function that only invokes `))))) + (((("`" + (`func` + "`")) + (` at most once per\n * every ` + ("`" + `wait`))) + (("`" + (` milliseconds. The throttled function comes with a ` + "`")) + (`cancel` + ("`" + `\n * method to cancel delayed `)))) + ((("`" + (`func` + "`")) + (` invocations and a ` + ("`" + `flush`))) + (("`" + (` method to\n * immediately invoke them. Provide ` + "`")) + ((`options` + "`") + (` to indicate whether ` + "`")))))) + (((((`func` + ("`" + `\n * should be invoked on the leading and/or trailing edge of the `)) + ("`" + (`wait` + "`"))) + ((`\n * timeout. The ` + ("`" + `func`)) + ("`" + (` is invoked with the last arguments provided to the\n * throttled function. Subsequent calls to the throttled function return the\n * result of the last ` + "`")))) + (((`func` + ("`" + ` invocation.\n *\n * **Note:** If `)) + ("`" + (`leading` + "`"))) + ((` and ` + ("`" + `trailing`)) + (("`" + ` options are `) + ("`" + `true`))))) + (((("`" + (`, ` + "`")) + (`func` + ("`" + ` is\n * invoked on the trailing edge of the timeout only if the throttled function\n * is invoked more than once during the `))) + (("`" + (`wait` + "`")) + (` timeout.\n *\n * If ` + ("`" + `wait`)))) + ((("`" + (` is ` + "`")) + (`0` + ("`" + ` and `))) + (("`" + (`leading` + "`")) + ((` is ` + "`") + (`false` + "`")))))))) + (((((((`, ` + ("`" + `func`)) + ("`" + (` invocation is deferred\n * until to the next tick, similar to ` + "`"))) + ((`setTimeout` + ("`" + ` with a timeout of `)) + ("`" + (`0` + "`")))) + (((`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between ` + ("`" + `_.throttle`)) + ("`" + (` and ` + "`"))) + ((`_.debounce` + ("`" + `.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to throttle.\n * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=true]\n * Specify invoking on the leading edge of the timeout.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new throttled function.\n * @example\n *\n * // Avoid excessively updating the position while scrolling.\n * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\n *\n * // Invoke `)) + ("`" + (`renewToken` + "`"))))) + ((((` when the click event is fired, but not more than once every 5 minutes.\n * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });\n * jQuery(element).on('click', throttled);\n *\n * // Cancel the trailing throttled invocation.\n * jQuery(window).on('popstate', throttled.cancel);\n */\nfunction throttle(func, wait, options) {\n var leading = true,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n if (isObject(options)) {\n leading = 'leading' in options ? !!options.leading : leading;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n return debounce(func, wait, {\n 'leading': leading,\n 'maxWait': wait,\n 'trailing': trailing\n });\n}\n\nmodule.exports = throttle;\n", + "var toNumber = require('./toNumber');\n\n/** Used as references for various ` + ("`" + `Number`)) + ("`" + (` constants. */\nvar INFINITY = 1 / 0,\n MAX_INTEGER = 1.7976931348623157e+308;\n\n/**\n * Converts ` + "`"))) + ((`value` + ("`" + ` to a finite number.\n *\n * @static\n * @memberOf _\n * @since 4.12.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted number.\n * @example\n *\n * _.toFinite(3.2);\n * // => 3.2\n *\n * _.toFinite(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toFinite(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toFinite('3.2');\n * // => 3.2\n */\nfunction toFinite(value) {\n if (!value) {\n return value === 0 ? value : 0;\n }\n value = toNumber(value);\n if (value === INFINITY || value === -INFINITY) {\n var sign = (value < 0 ? -1 : 1);\n return sign * MAX_INTEGER;\n }\n return value === value ? value : 0;\n}\n\nmodule.exports = toFinite;\n", + "var toFinite = require('./toFinite');\n\n/**\n * Converts `)) + ("`" + (`value` + "`")))) + (((` to an integer.\n *\n * **Note:** This method is loosely based on\n * [` + ("`" + `ToInteger`)) + ("`" + (`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.toInteger(3.2);\n * // => 3\n *\n * _.toInteger(Number.MIN_VALUE);\n * // => 0\n *\n * _.toInteger(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toInteger('3.2');\n * // => 3\n */\nfunction toInteger(value) {\n var result = toFinite(value),\n remainder = result % 1;\n\n return result === result ? (remainder ? result - remainder : result) : 0;\n}\n\nmodule.exports = toInteger;\n", + "var isObject = require('./isObject'),\n isSymbol = require('./isSymbol');\n\n/** Used as references for various ` + "`"))) + ((`Number` + ("`" + ` constants. */\nvar NAN = 0 / 0;\n\n/** Used to match leading and trailing whitespace. */\nvar reTrim = /^\\s+|\\s+$/g;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `)) + (("`" + `root`) + ("`" + `. */\nvar freeParseInt = parseInt;\n\n/**\n * Converts `)))))) + ((((("`" + (`value` + "`")) + (` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = value.replace(reTrim, '');\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = toNumber;\n", + "var baseToString = require('./_baseToString');\n\n/**\n * Converts ` + ("`" + `value`))) + (("`" + (` to a string. An empty string is returned for ` + "`")) + (`null` + ("`" + `\n * and `)))) + ((("`" + (`undefined` + "`")) + (` values. The sign of ` + ("`" + `-0`))) + (("`" + (` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\nfunction toString(value) {\n return value == null ? '' : baseToString(value);\n}\n\nmodule.exports = toString;\n", + "var baseIteratee = require('./_baseIteratee'),\n baseUniq = require('./_baseUniq');\n\n/**\n * This method is like ` + "`")) + ((`_.uniq` + "`") + (` except that it accepts ` + "`"))))) + ((((`iteratee` + ("`" + ` which is\n * invoked for each element in `)) + ("`" + (`array` + "`"))) + ((` to generate the criterion by which\n * uniqueness is computed. The order of result values is determined by the\n * order they occur in the array. The iteratee is invoked with one argument:\n * (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n * @example\n *\n * _.uniqBy([2.1, 1.2, 2.3], Math.floor);\n * // => [2.1, 1.2]\n *\n * // The ` + ("`" + `_.property`)) + ("`" + (` iteratee shorthand.\n * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');\n * // => [{ 'x': 1 }, { 'x': 2 }]\n */\nfunction uniqBy(array, iteratee) {\n return (array && array.length) ? baseUniq(array, baseIteratee(iteratee, 2)) : [];\n}\n\nmodule.exports = uniqBy;\n", "var Mexp=require('./postfix_evaluator.js');\r\nMexp.prototype.formulaEval = function () {\r\n\t\"use strict\";\r\n\tvar stack=[],pop1,pop2,pop3;\r\n\tvar disp=[];\r\n\tvar temp='';\r\n\tvar arr=this.value;\r\n\tfor(var i=0;i\"+pop2.value+\"\"+arr[i].show+\"\"+pop1.value+\"\",type:10});\r\n\t\t\telse disp.push({value:(pop2.type!=1?\"(\":\"\")+pop2.value+(pop2.type!=1?\")\":\"\")+\"\"+pop1.value+\"\",type:1});\r\n\t\t}\r\n\t\telse if(arr[i].type===2||arr[i].type===9){\r\n\t\t\tpop1=disp.pop();\r\n\t\t\tpop2=disp.pop();\r\n\t\t\tdisp.push({value:(pop2.type!=1?\"(\":\"\")+pop2.value+(pop2.type!=1?\")\":\"\")+arr[i].show+(pop1.type!=1?\"(\":\"\")+pop1.value+(pop1.type!=1?\")\":\"\"),type:arr[i].type});\r\n\t\t}\r\n\t\telse if(arr[i].type===12){\r\n\t\t\tpop1=disp.pop();\r\n\t\t\tpop2=disp.pop();\r\n\t\t\tpop3=disp.pop();\r\n\t\t\tdisp.push({value:arr[i].show+\"(\"+pop3.value+\",\"+pop2.value+\",\"+pop1.value+\")\",type:12});\r\n\t\t}\r\n\t}\r\n\treturn disp[0].value;\r\n};\r\nmodule.exports=Mexp;", "var Mexp=require('./math_function.js');\r\n\tfunction inc(arr,val){\r\n\t\tfor(var i=0;i(newAr.length-2)?newAr.length-1:inpStr.length-i);x>0;x--){\r\n\t\t\t\tfor(y=0;y 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n", - "/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = require('./lib/ReactPropTypesSecret');\n\nfunction emptyFunction() {}\nfunction emptyFunctionWithReset() {}\nemptyFunctionWithReset.resetWarningCache = emptyFunction;\n\nmodule.exports = function() {\n function shim(props, propName, componentName, location, propFullName, secret) {\n if (secret === ReactPropTypesSecret) {\n // It is still safe when called from React.\n return;\n }\n var err = new Error(\n 'Calling PropTypes validators directly is not supported by the ` + "`")))) + (((`prop-types` + "`") + (` package. ' +\n 'Use PropTypes.checkPropTypes() to call them. ' +\n 'Read more at http://fb.me/use-check-prop-types'\n );\n err.name = 'Invariant Violation';\n throw err;\n };\n shim.isRequired = shim;\n function getShim() {\n return shim;\n };\n // Important!\n // Keep this list in sync with production version in ` + ("`" + `./factoryWithTypeCheckers.js`))) + (("`" + (`.\n var ReactPropTypes = {\n array: shim,\n bool: shim,\n func: shim,\n number: shim,\n object: shim,\n string: shim,\n symbol: shim,\n\n any: shim,\n arrayOf: getShim,\n element: shim,\n elementType: shim,\n instanceOf: getShim,\n node: shim,\n objectOf: getShim,\n oneOf: getShim,\n oneOfType: getShim,\n shape: getShim,\n exact: getShim,\n\n checkPropTypes: emptyFunctionWithReset,\n resetWarningCache: emptyFunction\n };\n\n ReactPropTypes.PropTypes = ReactPropTypes;\n\n return ReactPropTypes;\n};\n", - "/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nif (process.env.NODE_ENV !== 'production') {\n var ReactIs = require('react-is');\n\n // By explicitly using ` + "`")) + (`prop-types` + ("`" + ` you are opting into new development behavior.\n // http://fb.me/prop-types-in-prod\n var throwOnDirectAccess = true;\n module.exports = require('./factoryWithTypeCheckers')(ReactIs.isElement, throwOnDirectAccess);\n} else {\n // By explicitly using `))))) + (((("`" + `prop-types`) + ("`" + (` you are opting into new production behavior.\n // http://fb.me/prop-types-in-prod\n module.exports = require('./factoryWithThrowingShims')();\n}\n", + "/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = require('./lib/ReactPropTypesSecret');\n\nfunction emptyFunction() {}\nfunction emptyFunctionWithReset() {}\nemptyFunctionWithReset.resetWarningCache = emptyFunction;\n\nmodule.exports = function() {\n function shim(props, propName, componentName, location, propFullName, secret) {\n if (secret === ReactPropTypesSecret) {\n // It is still safe when called from React.\n return;\n }\n var err = new Error(\n 'Calling PropTypes validators directly is not supported by the ` + "`")))) + (((`prop-types` + ("`" + ` package. ' +\n 'Use PropTypes.checkPropTypes() to call them. ' +\n 'Read more at http://fb.me/use-check-prop-types'\n );\n err.name = 'Invariant Violation';\n throw err;\n };\n shim.isRequired = shim;\n function getShim() {\n return shim;\n };\n // Important!\n // Keep this list in sync with production version in `)) + ("`" + (`./factoryWithTypeCheckers.js` + "`"))) + ((`.\n var ReactPropTypes = {\n array: shim,\n bool: shim,\n func: shim,\n number: shim,\n object: shim,\n string: shim,\n symbol: shim,\n\n any: shim,\n arrayOf: getShim,\n element: shim,\n elementType: shim,\n instanceOf: getShim,\n node: shim,\n objectOf: getShim,\n oneOf: getShim,\n oneOfType: getShim,\n shape: getShim,\n exact: getShim,\n\n checkPropTypes: emptyFunctionWithReset,\n resetWarningCache: emptyFunction\n };\n\n ReactPropTypes.PropTypes = ReactPropTypes;\n\n return ReactPropTypes;\n};\n", + "/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nif (process.env.NODE_ENV !== 'production') {\n var ReactIs = require('react-is');\n\n // By explicitly using ` + ("`" + `prop-types`)) + (("`" + ` you are opting into new development behavior.\n // http://fb.me/prop-types-in-prod\n var throwOnDirectAccess = true;\n module.exports = require('./factoryWithTypeCheckers')(ReactIs.isElement, throwOnDirectAccess);\n} else {\n // By explicitly using `) + ("`" + `prop-types`))))))) + (((((("`" + (` you are opting into new production behavior.\n // http://fb.me/prop-types-in-prod\n module.exports = require('./factoryWithThrowingShims')();\n}\n", "/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';\n\nmodule.exports = ReactPropTypesSecret;\n", - "var now = require('performance-now')\n , root = typeof window === 'undefined' ? global : window\n , vendors = ['moz', 'webkit']\n , suffix = 'AnimationFrame'\n , raf = root['request' + suffix]\n , caf = root['cancel' + suffix] || root['cancelRequest' + suffix]\n\nfor(var i = 0; !raf && i < vendors.length; i++) {\n raf = root[vendors[i] + 'Request' + suffix]\n caf = root[vendors[i] + 'Cancel' + suffix]\n || root[vendors[i] + 'CancelRequest' + suffix]\n}\n\n// Some versions of FF have rAF but not cAF\nif(!raf || !caf) {\n var last = 0\n , id = 0\n , queue = []\n , frameDuration = 1000 / 60\n\n raf = function(callback) {\n if(queue.length === 0) {\n var _now = now()\n , next = Math.max(0, frameDuration - (_now - last))\n last = next + _now\n setTimeout(function() {\n var cp = queue.slice(0)\n // Clear queue here to prevent\n // callbacks from appending listeners\n // to the current frame's queue\n queue.length = 0\n for(var i = 0; i < cp.length; i++) {\n if(!cp[i].cancelled) {\n try{\n cp[i].callback(last)\n } catch(e) {\n setTimeout(function() { throw e }, 0)\n }\n }\n }\n }, Math.round(next))\n }\n queue.push({\n handle: ++id,\n callback: callback,\n cancelled: false\n })\n return id\n }\n\n caf = function(handle) {\n for(var i = 0; i < queue.length; i++) {\n if(queue[i].handle === handle) {\n queue[i].cancelled = true\n }\n }\n }\n}\n\nmodule.exports = function(fn) {\n // Wrap in a new function to prevent\n // ` + "`"))) + ((`cancel` + ("`" + ` potentially being assigned\n // to the native rAF function\n return raf.call(root, fn)\n}\nmodule.exports.cancel = function() {\n caf.apply(root, arguments)\n}\nmodule.exports.polyfill = function(object) {\n if (!object) {\n object = root;\n }\n object.requestAnimationFrame = raf\n object.cancelAnimationFrame = caf\n}\n", + "var now = require('performance-now')\n , root = typeof window === 'undefined' ? global : window\n , vendors = ['moz', 'webkit']\n , suffix = 'AnimationFrame'\n , raf = root['request' + suffix]\n , caf = root['cancel' + suffix] || root['cancelRequest' + suffix]\n\nfor(var i = 0; !raf && i < vendors.length; i++) {\n raf = root[vendors[i] + 'Request' + suffix]\n caf = root[vendors[i] + 'Cancel' + suffix]\n || root[vendors[i] + 'CancelRequest' + suffix]\n}\n\n// Some versions of FF have rAF but not cAF\nif(!raf || !caf) {\n var last = 0\n , id = 0\n , queue = []\n , frameDuration = 1000 / 60\n\n raf = function(callback) {\n if(queue.length === 0) {\n var _now = now()\n , next = Math.max(0, frameDuration - (_now - last))\n last = next + _now\n setTimeout(function() {\n var cp = queue.slice(0)\n // Clear queue here to prevent\n // callbacks from appending listeners\n // to the current frame's queue\n queue.length = 0\n for(var i = 0; i < cp.length; i++) {\n if(!cp[i].cancelled) {\n try{\n cp[i].callback(last)\n } catch(e) {\n setTimeout(function() { throw e }, 0)\n }\n }\n }\n }, Math.round(next))\n }\n queue.push({\n handle: ++id,\n callback: callback,\n cancelled: false\n })\n return id\n }\n\n caf = function(handle) {\n for(var i = 0; i < queue.length; i++) {\n if(queue[i].handle === handle) {\n queue[i].cancelled = true\n }\n }\n }\n}\n\nmodule.exports = function(fn) {\n // Wrap in a new function to prevent\n // ` + "`")) + (`cancel` + ("`" + ` potentially being assigned\n // to the native rAF function\n return raf.call(root, fn)\n}\nmodule.exports.cancel = function() {\n caf.apply(root, arguments)\n}\nmodule.exports.polyfill = function(object) {\n if (!object) {\n object = root;\n }\n object.requestAnimationFrame = raf\n object.cancelAnimationFrame = caf\n}\n", "/** @license React v16.8.4\n * react-dom.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n/*\n Modernizr 3.0.0pre (Custom Build) | MIT\n*/\n'use strict';var aa=require(\"react\"),n=require(\"object-assign\"),r=require(\"scheduler\");function ba(a,b,c,d,e,f,g,h){if(!a){a=void 0;if(void 0===b)a=Error(\"Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.\");else{var l=[c,d,e,f,g,h],k=0;a=Error(b.replace(/%s/g,function(){return l[k++]}));a.name=\"Invariant Violation\"}a.framesToPop=1;throw a;}}\nfunction x(a){for(var b=arguments.length-1,c=\"https://reactjs.org/docs/error-decoder.html?invariant=\"+a,d=0;dthis.eventPool.length&&this.eventPool.push(a)}\nfunction hb(a){a.eventPool=[];a.getPooled=ib;a.release=jb}var kb=y.extend({data:null}),lb=y.extend({data:null}),mb=[9,13,27,32],nb=Ra&&\"CompositionEvent\"in window,ob=null;Ra&&\"documentMode\"in document&&(ob=document.documentMode);\nvar pb=Ra&&\"TextEvent\"in window&&!ob,qb=Ra&&(!nb||ob&&8=ob),rb=String.fromCharCode(32),sb={beforeInput:{phasedRegistrationNames:{bubbled:\"onBeforeInput\",captured:\"onBeforeInputCapture\"},dependencies:[\"compositionend\",\"keypress\",\"textInput\",\"paste\"]},compositionEnd:{phasedRegistrationNames:{bubbled:\"onCompositionEnd\",captured:\"onCompositionEndCapture\"},dependencies:\"blur compositionend keydown keypress keyup mousedown\".split(\" \")},compositionStart:{phasedRegistrationNames:{bubbled:\"onCompositionStart\",\ncaptured:\"onCompositionStartCapture\"},dependencies:\"blur compositionstart keydown keypress keyup mousedown\".split(\" \")},compositionUpdate:{phasedRegistrationNames:{bubbled:\"onCompositionUpdate\",captured:\"onCompositionUpdateCapture\"},dependencies:\"blur compositionupdate keydown keypress keyup mousedown\".split(\" \")}},tb=!1;\nfunction ub(a,b){switch(a){case \"keyup\":return-1!==mb.indexOf(b.keyCode);case \"keydown\":return 229!==b.keyCode;case \"keypress\":case \"mousedown\":case \"blur\":return!0;default:return!1}}function vb(a){a=a.detail;return\"object\"===typeof a&&\"data\"in a?a.data:null}var wb=!1;function xb(a,b){switch(a){case \"compositionend\":return vb(b);case \"keypress\":if(32!==b.which)return null;tb=!0;return rb;case \"textInput\":return a=b.data,a===rb&&tb?null:a;default:return null}}\nfunction yb(a,b){if(wb)return\"compositionend\"===a||!nb&&ub(a,b)?(a=eb(),db=cb=bb=null,wb=!1,a):null;switch(a){case \"paste\":return null;case \"keypress\":if(!(b.ctrlKey||b.altKey||b.metaKey)||b.ctrlKey&&b.altKey){if(b.char&&1b}return!1}function C(a,b,c,d,e){this.acceptsBooleans=2===b||3===b||4===b;this.attributeName=d;this.attributeNamespace=e;this.mustUseProperty=c;this.propertyName=a;this.type=b}var D={};\n\"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style\".split(\" \").forEach(function(a){D[a]=new C(a,0,!1,a,null)});[[\"acceptCharset\",\"accept-charset\"],[\"className\",\"class\"],[\"htmlFor\",\"for\"],[\"httpEquiv\",\"http-equiv\"]].forEach(function(a){var b=a[0];D[b]=new C(b,1,!1,a[1],null)});[\"contentEditable\",\"draggable\",\"spellCheck\",\"value\"].forEach(function(a){D[a]=new C(a,2,!1,a.toLowerCase(),null)});\n[\"autoReverse\",\"externalResourcesRequired\",\"focusable\",\"preserveAlpha\"].forEach(function(a){D[a]=new C(a,2,!1,a,null)});\"allowFullScreen async autoFocus autoPlay controls default defer disabled formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope\".split(\" \").forEach(function(a){D[a]=new C(a,3,!1,a.toLowerCase(),null)});[\"checked\",\"multiple\",\"muted\",\"selected\"].forEach(function(a){D[a]=new C(a,3,!0,a,null)});\n[\"capture\",\"download\"].forEach(function(a){D[a]=new C(a,4,!1,a,null)});[\"cols\",\"rows\",\"size\",\"span\"].forEach(function(a){D[a]=new C(a,6,!1,a,null)});[\"rowSpan\",\"start\"].forEach(function(a){D[a]=new C(a,5,!1,a.toLowerCase(),null)});var rc=/[\\-:]([a-z])/g;function sc(a){return a[1].toUpperCase()}\n\"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height\".split(\" \").forEach(function(a){var b=a.replace(rc,\nsc);D[b]=new C(b,1,!1,a,null)});\"xlink:actuate xlink:arcrole xlink:href xlink:role xlink:show xlink:title xlink:type\".split(\" \").forEach(function(a){var b=a.replace(rc,sc);D[b]=new C(b,1,!1,a,\"http://www.w3.org/1999/xlink\")});[\"xml:base\",\"xml:lang\",\"xml:space\"].forEach(function(a){var b=a.replace(rc,sc);D[b]=new C(b,1,!1,a,\"http://www.w3.org/XML/1998/namespace\")});[\"tabIndex\",\"crossOrigin\"].forEach(function(a){D[a]=new C(a,1,!1,a.toLowerCase(),null)});\nfunction tc(a,b,c,d){var e=D.hasOwnProperty(b)?D[b]:null;var f=null!==e?0===e.type:d?!1:!(2zd.length&&zd.push(a)}}}var Fd={},Gd=0,Hd=\"_reactListenersID\"+(\"\"+Math.random()).slice(2);\nfunction Id(a){Object.prototype.hasOwnProperty.call(a,Hd)||(a[Hd]=Gd++,Fd[a[Hd]]={});return Fd[a[Hd]]}function Jd(a){a=a||(\"undefined\"!==typeof document?document:void 0);if(\"undefined\"===typeof a)return null;try{return a.activeElement||a.body}catch(b){return a.body}}function Kd(a){for(;a&&a.firstChild;)a=a.firstChild;return a}\nfunction Ld(a,b){var c=Kd(a);a=0;for(var d;c;){if(3===c.nodeType){d=a+c.textContent.length;if(a<=b&&d>=b)return{node:c,offset:b-a};a=d}a:{for(;c;){if(c.nextSibling){c=c.nextSibling;break a}c=c.parentNode}c=void 0}c=Kd(c)}}function Md(a,b){return a&&b?a===b?!0:a&&3===a.nodeType?!1:b&&3===b.nodeType?Md(a,b.parentNode):\"contains\"in a?a.contains(b):a.compareDocumentPosition?!!(a.compareDocumentPosition(b)&16):!1:!1}\nfunction Nd(){for(var a=window,b=Jd();b instanceof a.HTMLIFrameElement;){try{a=b.contentDocument.defaultView}catch(c){break}b=Jd(a.document)}return b}function Od(a){var b=a&&a.nodeName&&a.nodeName.toLowerCase();return b&&(\"input\"===b&&(\"text\"===a.type||\"search\"===a.type||\"tel\"===a.type||\"url\"===a.type||\"password\"===a.type)||\"textarea\"===b||\"true\"===a.contentEditable)}\nfunction Pd(){var a=Nd();if(Od(a)){if(\"selectionStart\"in a)var b={start:a.selectionStart,end:a.selectionEnd};else a:{b=(b=a.ownerDocument)&&b.defaultView||window;var c=b.getSelection&&b.getSelection();if(c&&0!==c.rangeCount){b=c.anchorNode;var d=c.anchorOffset,e=c.focusNode;c=c.focusOffset;try{b.nodeType,e.nodeType}catch(A){b=null;break a}var f=0,g=-1,h=-1,l=0,k=0,m=a,p=null;b:for(;;){for(var t;;){m!==b||0!==d&&3!==m.nodeType||(g=f+d);m!==e||0!==c&&3!==m.nodeType||(h=f+c);3===m.nodeType&&(f+=m.nodeValue.length);\nif(null===(t=m.firstChild))break;p=m;m=t}for(;;){if(m===a)break b;p===b&&++l===d&&(g=f);p===e&&++k===c&&(h=f);if(null!==(t=m.nextSibling))break;m=p;p=m.parentNode}m=t}b=-1===g||-1===h?null:{start:g,end:h}}else b=null}b=b||{start:0,end:0}}else b=null;return{focusedElem:a,selectionRange:b}}\nfunction Qd(a){var b=Nd(),c=a.focusedElem,d=a.selectionRange;if(b!==c&&c&&c.ownerDocument&&Md(c.ownerDocument.documentElement,c)){if(null!==d&&Od(c))if(b=d.start,a=d.end,void 0===a&&(a=b),\"selectionStart\"in c)c.selectionStart=b,c.selectionEnd=Math.min(a,c.value.length);else if(a=(b=c.ownerDocument||document)&&b.defaultView||window,a.getSelection){a=a.getSelection();var e=c.textContent.length,f=Math.min(d.start,e);d=void 0===d.end?f:Math.min(d.end,e);!a.extend&&f>d&&(e=d,d=f,f=e);e=Ld(c,f);var g=Ld(c,\nd);e&&g&&(1!==a.rangeCount||a.anchorNode!==e.node||a.anchorOffset!==e.offset||a.focusNode!==g.node||a.focusOffset!==g.offset)&&(b=b.createRange(),b.setStart(e.node,e.offset),a.removeAllRanges(),f>d?(a.addRange(b),a.extend(g.node,g.offset)):(b.setEnd(g.node,g.offset),a.addRange(b)))}b=[];for(a=c;a=a.parentNode;)1===a.nodeType&&b.push({element:a,left:a.scrollLeft,top:a.scrollTop});\"function\"===typeof c.focus&&c.focus();for(c=0;c=document.documentMode,Sd={select:{phasedRegistrationNames:{bubbled:\"onSelect\",captured:\"onSelectCapture\"},dependencies:\"blur contextmenu dragend focus keydown keyup mousedown mouseup selectionchange\".split(\" \")}},Td=null,Ud=null,Vd=null,Wd=!1;\nfunction Xd(a,b){var c=b.window===b?b.document:9===b.nodeType?b:b.ownerDocument;if(Wd||null==Td||Td!==Jd(c))return null;c=Td;\"selectionStart\"in c&&Od(c)?c={start:c.selectionStart,end:c.selectionEnd}:(c=(c.ownerDocument&&c.ownerDocument.defaultView||window).getSelection(),c={anchorNode:c.anchorNode,anchorOffset:c.anchorOffset,focusNode:c.focusNode,focusOffset:c.focusOffset});return Vd&&dd(Vd,c)?null:(Vd=c,a=y.getPooled(Sd.select,Ud,a,b),a.type=\"select\",a.target=Td,Qa(a),a)}\nvar Yd={eventTypes:Sd,extractEvents:function(a,b,c,d){var e=d.window===d?d.document:9===d.nodeType?d:d.ownerDocument,f;if(!(f=!e)){a:{e=Id(e);f=sa.onSelect;for(var g=0;g=b.length?void 0:x(\"93\"),b=b[0]),c=b),null==c&&(c=\"\"));a._wrapperState={initialValue:uc(c)}}\nfunction de(a,b){var c=uc(b.value),d=uc(b.defaultValue);null!=c&&(c=\"\"+c,c!==a.value&&(a.value=c),null==b.defaultValue&&a.defaultValue!==c&&(a.defaultValue=c));null!=d&&(a.defaultValue=\"\"+d)}function ee(a){var b=a.textContent;b===a._wrapperState.initialValue&&(a.value=b)}var fe={html:\"http://www.w3.org/1999/xhtml\",mathml:\"http://www.w3.org/1998/Math/MathML\",svg:\"http://www.w3.org/2000/svg\"};\nfunction ge(a){switch(a){case \"svg\":return\"http://www.w3.org/2000/svg\";case \"math\":return\"http://www.w3.org/1998/Math/MathML\";default:return\"http://www.w3.org/1999/xhtml\"}}function he(a,b){return null==a||\"http://www.w3.org/1999/xhtml\"===a?ge(b):\"http://www.w3.org/2000/svg\"===a&&\"foreignObject\"===b?\"http://www.w3.org/1999/xhtml\":a}\nvar ie=void 0,je=function(a){return\"undefined\"!==typeof MSApp&&MSApp.execUnsafeLocalFunction?function(b,c,d,e){MSApp.execUnsafeLocalFunction(function(){return a(b,c,d,e)})}:a}(function(a,b){if(a.namespaceURI!==fe.svg||\"innerHTML\"in a)a.innerHTML=b;else{ie=ie||document.createElement(\"div\");ie.innerHTML=\"\"+b+\"\";for(b=ie.firstChild;a.firstChild;)a.removeChild(a.firstChild);for(;b.firstChild;)a.appendChild(b.firstChild)}});\nfunction ke(a,b){if(b){var c=a.firstChild;if(c&&c===a.lastChild&&3===c.nodeType){c.nodeValue=b;return}}a.textContent=b}\nvar le={animationIterationCount:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,\nfloodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},me=[\"Webkit\",\"ms\",\"Moz\",\"O\"];Object.keys(le).forEach(function(a){me.forEach(function(b){b=b+a.charAt(0).toUpperCase()+a.substring(1);le[b]=le[a]})});function ne(a,b,c){return null==b||\"boolean\"===typeof b||\"\"===b?\"\":c||\"number\"!==typeof b||0===b||le.hasOwnProperty(a)&&le[a]?(\"\"+b).trim():b+\"px\"}\nfunction oe(a,b){a=a.style;for(var c in b)if(b.hasOwnProperty(c)){var d=0===c.indexOf(\"--\"),e=ne(c,b[c],d);\"float\"===c&&(c=\"cssFloat\");d?a.setProperty(c,e):a[c]=e}}var pe=n({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});\nfunction qe(a,b){b&&(pe[a]&&(null!=b.children||null!=b.dangerouslySetInnerHTML?x(\"137\",a,\"\"):void 0),null!=b.dangerouslySetInnerHTML&&(null!=b.children?x(\"60\"):void 0,\"object\"===typeof b.dangerouslySetInnerHTML&&\"__html\"in b.dangerouslySetInnerHTML?void 0:x(\"61\")),null!=b.style&&\"object\"!==typeof b.style?x(\"62\",\"\"):void 0)}\nfunction re(a,b){if(-1===a.indexOf(\"-\"))return\"string\"===typeof b.is;switch(a){case \"annotation-xml\":case \"color-profile\":case \"font-face\":case \"font-face-src\":case \"font-face-uri\":case \"font-face-format\":case \"font-face-name\":case \"missing-glyph\":return!1;default:return!0}}\nfunction se(a,b){a=9===a.nodeType||11===a.nodeType?a:a.ownerDocument;var c=Id(a);b=sa[b];for(var d=0;dGe||(a.current=Fe[Ge],Fe[Ge]=null,Ge--)}function G(a,b){Ge++;Fe[Ge]=a.current;a.current=b}var He={},H={current:He},I={current:!1},Ie=He;\nfunction Je(a,b){var c=a.type.contextTypes;if(!c)return He;var d=a.stateNode;if(d&&d.__reactInternalMemoizedUnmaskedChildContext===b)return d.__reactInternalMemoizedMaskedChildContext;var e={},f;for(f in c)e[f]=b[f];d&&(a=a.stateNode,a.__reactInternalMemoizedUnmaskedChildContext=b,a.__reactInternalMemoizedMaskedChildContext=e);return e}function J(a){a=a.childContextTypes;return null!==a&&void 0!==a}function Ke(a){F(I,a);F(H,a)}function Le(a){F(I,a);F(H,a)}\nfunction Me(a,b,c){H.current!==He?x(\"168\"):void 0;G(H,b,a);G(I,c,a)}function Ne(a,b,c){var d=a.stateNode;a=b.childContextTypes;if(\"function\"!==typeof d.getChildContext)return c;d=d.getChildContext();for(var e in d)e in a?void 0:x(\"108\",ic(b)||\"Unknown\",e);return n({},c,d)}function Oe(a){var b=a.stateNode;b=b&&b.__reactInternalMemoizedMergedChildContext||He;Ie=H.current;G(H,b,a);G(I,I.current,a);return!0}\nfunction Pe(a,b,c){var d=a.stateNode;d?void 0:x(\"169\");c?(b=Ne(a,b,Ie),d.__reactInternalMemoizedMergedChildContext=b,F(I,a),F(H,a),G(H,b,a)):F(I,a);G(I,c,a)}var Qe=null,Re=null;function Se(a){return function(b){try{return a(b)}catch(c){}}}\nfunction Te(a){if(\"undefined\"===typeof __REACT_DEVTOOLS_GLOBAL_HOOK__)return!1;var b=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(b.isDisabled||!b.supportsFiber)return!0;try{var c=b.inject(a);Qe=Se(function(a){return b.onCommitFiberRoot(c,a)});Re=Se(function(a){return b.onCommitFiberUnmount(c,a)})}catch(d){}return!0}\nfunction Ue(a,b,c,d){this.tag=a;this.key=c;this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null;this.index=0;this.ref=null;this.pendingProps=b;this.contextDependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null;this.mode=d;this.effectTag=0;this.lastEffect=this.firstEffect=this.nextEffect=null;this.childExpirationTime=this.expirationTime=0;this.alternate=null}function K(a,b,c,d){return new Ue(a,b,c,d)}\nfunction Ve(a){a=a.prototype;return!(!a||!a.isReactComponent)}function We(a){if(\"function\"===typeof a)return Ve(a)?1:0;if(void 0!==a&&null!==a){a=a.$$typeof;if(a===cc)return 11;if(a===ec)return 14}return 2}\nfunction Xe(a,b){var c=a.alternate;null===c?(c=K(a.tag,b,a.key,a.mode),c.elementType=a.elementType,c.type=a.type,c.stateNode=a.stateNode,c.alternate=a,a.alternate=c):(c.pendingProps=b,c.effectTag=0,c.nextEffect=null,c.firstEffect=null,c.lastEffect=null);c.childExpirationTime=a.childExpirationTime;c.expirationTime=a.expirationTime;c.child=a.child;c.memoizedProps=a.memoizedProps;c.memoizedState=a.memoizedState;c.updateQueue=a.updateQueue;c.contextDependencies=a.contextDependencies;c.sibling=a.sibling;\nc.index=a.index;c.ref=a.ref;return c}\nfunction Ye(a,b,c,d,e,f){var g=2;d=a;if(\"function\"===typeof a)Ve(a)&&(g=1);else if(\"string\"===typeof a)g=5;else a:switch(a){case Xb:return Ze(c.children,e,f,b);case bc:return $e(c,e|3,f,b);case Yb:return $e(c,e|2,f,b);case Zb:return a=K(12,c,b,e|4),a.elementType=Zb,a.type=Zb,a.expirationTime=f,a;case dc:return a=K(13,c,b,e),a.elementType=dc,a.type=dc,a.expirationTime=f,a;default:if(\"object\"===typeof a&&null!==a)switch(a.$$typeof){case $b:g=10;break a;case ac:g=9;break a;case cc:g=11;break a;case ec:g=\n14;break a;case fc:g=16;d=null;break a}x(\"130\",null==a?a:typeof a,\"\")}b=K(g,c,b,e);b.elementType=a;b.type=d;b.expirationTime=f;return b}function Ze(a,b,c,d){a=K(7,a,d,b);a.expirationTime=c;return a}function $e(a,b,c,d){a=K(8,a,d,b);b=0===(b&1)?Yb:bc;a.elementType=b;a.type=b;a.expirationTime=c;return a}function af(a,b,c){a=K(6,a,null,b);a.expirationTime=c;return a}\nfunction bf(a,b,c){b=K(4,null!==a.children?a.children:[],a.key,b);b.expirationTime=c;b.stateNode={containerInfo:a.containerInfo,pendingChildren:null,implementation:a.implementation};return b}function cf(a,b){a.didError=!1;var c=a.earliestPendingTime;0===c?a.earliestPendingTime=a.latestPendingTime=b:cb&&(a.latestPendingTime=b);df(b,a)}\nfunction ef(a,b){a.didError=!1;if(0===b)a.earliestPendingTime=0,a.latestPendingTime=0,a.earliestSuspendedTime=0,a.latestSuspendedTime=0,a.latestPingedTime=0;else{bb?a.earliestPendingTime=a.latestPendingTime=0:a.earliestPendingTime>b&&(a.earliestPendingTime=a.latestPendingTime));c=a.earliestSuspendedTime;0===c?cf(a,b):bc&&cf(a,b)}df(0,a)}function ff(a,b){a.didError=!1;a.latestPingedTime>=b&&(a.latestPingedTime=0);var c=a.earliestPendingTime,d=a.latestPendingTime;c===b?a.earliestPendingTime=d===b?a.latestPendingTime=0:d:d===b&&(a.latestPendingTime=c);c=a.earliestSuspendedTime;d=a.latestSuspendedTime;0===c?a.earliestSuspendedTime=a.latestSuspendedTime=b:cb&&(a.latestSuspendedTime=b);df(b,a)}\nfunction gf(a,b){var c=a.earliestPendingTime;a=a.earliestSuspendedTime;c>b&&(b=c);a>b&&(b=a);return b}function df(a,b){var c=b.earliestSuspendedTime,d=b.latestSuspendedTime,e=b.earliestPendingTime,f=b.latestPingedTime;e=0!==e?e:f;0===e&&(0===a||da&&(a=c);b.nextExpirationTimeToWorkOn=e;b.expirationTime=a}function L(a,b){if(a&&a.defaultProps){b=n({},b);a=a.defaultProps;for(var c in a)void 0===b[c]&&(b[c]=a[c])}return b}\nfunction hf(a){var b=a._result;switch(a._status){case 1:return b;case 2:throw b;case 0:throw b;default:a._status=0;b=a._ctor;b=b();b.then(function(b){0===a._status&&(b=b.default,a._status=1,a._result=b)},function(b){0===a._status&&(a._status=2,a._result=b)});switch(a._status){case 1:return a._result;case 2:throw a._result;}a._result=b;throw b;}}var jf=(new aa.Component).refs;\nfunction kf(a,b,c,d){b=a.memoizedState;c=c(d,b);c=null===c||void 0===c?b:n({},b,c);a.memoizedState=c;d=a.updateQueue;null!==d&&0===a.expirationTime&&(d.baseState=c)}\nvar tf={isMounted:function(a){return(a=a._reactInternalFiber)?2===ed(a):!1},enqueueSetState:function(a,b,c){a=a._reactInternalFiber;var d=lf();d=mf(d,a);var e=nf(d);e.payload=b;void 0!==c&&null!==c&&(e.callback=c);of();pf(a,e);qf(a,d)},enqueueReplaceState:function(a,b,c){a=a._reactInternalFiber;var d=lf();d=mf(d,a);var e=nf(d);e.tag=rf;e.payload=b;void 0!==c&&null!==c&&(e.callback=c);of();pf(a,e);qf(a,d)},enqueueForceUpdate:function(a,b){a=a._reactInternalFiber;var c=lf();c=mf(c,a);var d=nf(c);d.tag=\nsf;void 0!==b&&null!==b&&(d.callback=b);of();pf(a,d);qf(a,c)}};function uf(a,b,c,d,e,f,g){a=a.stateNode;return\"function\"===typeof a.shouldComponentUpdate?a.shouldComponentUpdate(d,f,g):b.prototype&&b.prototype.isPureReactComponent?!dd(c,d)||!dd(e,f):!0}\nfunction vf(a,b,c){var d=!1,e=He;var f=b.contextType;\"object\"===typeof f&&null!==f?f=M(f):(e=J(b)?Ie:H.current,d=b.contextTypes,f=(d=null!==d&&void 0!==d)?Je(a,e):He);b=new b(c,f);a.memoizedState=null!==b.state&&void 0!==b.state?b.state:null;b.updater=tf;a.stateNode=b;b._reactInternalFiber=a;d&&(a=a.stateNode,a.__reactInternalMemoizedUnmaskedChildContext=e,a.__reactInternalMemoizedMaskedChildContext=f);return b}\nfunction wf(a,b,c,d){a=b.state;\"function\"===typeof b.componentWillReceiveProps&&b.componentWillReceiveProps(c,d);\"function\"===typeof b.UNSAFE_componentWillReceiveProps&&b.UNSAFE_componentWillReceiveProps(c,d);b.state!==a&&tf.enqueueReplaceState(b,b.state,null)}\nfunction xf(a,b,c,d){var e=a.stateNode;e.props=c;e.state=a.memoizedState;e.refs=jf;var f=b.contextType;\"object\"===typeof f&&null!==f?e.context=M(f):(f=J(b)?Ie:H.current,e.context=Je(a,f));f=a.updateQueue;null!==f&&(yf(a,f,c,e,d),e.state=a.memoizedState);f=b.getDerivedStateFromProps;\"function\"===typeof f&&(kf(a,b,f,c),e.state=a.memoizedState);\"function\"===typeof b.getDerivedStateFromProps||\"function\"===typeof e.getSnapshotBeforeUpdate||\"function\"!==typeof e.UNSAFE_componentWillMount&&\"function\"!==\ntypeof e.componentWillMount||(b=e.state,\"function\"===typeof e.componentWillMount&&e.componentWillMount(),\"function\"===typeof e.UNSAFE_componentWillMount&&e.UNSAFE_componentWillMount(),b!==e.state&&tf.enqueueReplaceState(e,e.state,null),f=a.updateQueue,null!==f&&(yf(a,f,c,e,d),e.state=a.memoizedState));\"function\"===typeof e.componentDidMount&&(a.effectTag|=4)}var zf=Array.isArray;\nfunction Af(a,b,c){a=c.ref;if(null!==a&&\"function\"!==typeof a&&\"object\"!==typeof a){if(c._owner){c=c._owner;var d=void 0;c&&(1!==c.tag?x(\"309\"):void 0,d=c.stateNode);d?void 0:x(\"147\",a);var e=\"\"+a;if(null!==b&&null!==b.ref&&\"function\"===typeof b.ref&&b.ref._stringRef===e)return b.ref;b=function(a){var b=d.refs;b===jf&&(b=d.refs={});null===a?delete b[e]:b[e]=a};b._stringRef=e;return b}\"string\"!==typeof a?x(\"284\"):void 0;c._owner?void 0:x(\"290\",a)}return a}\nfunction Bf(a,b){\"textarea\"!==a.type&&x(\"31\",\"[object Object]\"===Object.prototype.toString.call(b)?\"object with keys {\"+Object.keys(b).join(\", \")+\"}\":b,\"\")}\nfunction Cf(a){function b(b,c){if(a){var d=b.lastEffect;null!==d?(d.nextEffect=c,b.lastEffect=c):b.firstEffect=b.lastEffect=c;c.nextEffect=null;c.effectTag=8}}function c(c,d){if(!a)return null;for(;null!==d;)b(c,d),d=d.sibling;return null}function d(a,b){for(a=new Map;null!==b;)null!==b.key?a.set(b.key,b):a.set(b.index,b),b=b.sibling;return a}function e(a,b,c){a=Xe(a,b,c);a.index=0;a.sibling=null;return a}function f(b,c,d){b.index=d;if(!a)return c;d=b.alternate;if(null!==d)return d=d.index,du?(B=q,q=null):B=q.sibling;var w=t(e,q,h[u],k);if(null===w){null===q&&(q=B);break}a&&\nq&&null===w.alternate&&b(e,q);g=f(w,g,u);null===m?l=w:m.sibling=w;m=w;q=B}if(u===h.length)return c(e,q),l;if(null===q){for(;uu?(B=q,q=null):B=q.sibling;var v=t(e,q,w.value,k);if(null===v){q||(q=B);break}a&&q&&null===v.alternate&&b(e,q);g=f(v,g,u);null===m?l=v:m.sibling=v;m=v;q=B}if(w.done)return c(e,q),l;if(null===q){for(;!w.done;u++,w=h.next())w=p(e,w.value,k),null!==w&&(g=f(w,g,u),null===m?l=w:m.sibling=w,m=w);return l}for(q=d(e,q);!w.done;u++,w=h.next())w=A(q,e,u,w.value,k),null!==w&&(a&&null!==w.alternate&&q.delete(null===w.key?u:\nw.key),g=f(w,g,u),null===m?l=w:m.sibling=w,m=w);a&&q.forEach(function(a){return b(e,a)});return l}return function(a,d,f,h){var k=\"object\"===typeof f&&null!==f&&f.type===Xb&&null===f.key;k&&(f=f.props.children);var l=\"object\"===typeof f&&null!==f;if(l)switch(f.$$typeof){case Vb:a:{l=f.key;for(k=d;null!==k;){if(k.key===l)if(7===k.tag?f.type===Xb:k.elementType===f.type){c(a,k.sibling);d=e(k,f.type===Xb?f.props.children:f.props,h);d.ref=Af(a,k,f);d.return=a;a=d;break a}else{c(a,k);break}else b(a,k);k=\nk.sibling}f.type===Xb?(d=Ze(f.props.children,a.mode,h,f.key),d.return=a,a=d):(h=Ye(f.type,f.key,f.props,null,a.mode,h),h.ref=Af(a,d,f),h.return=a,a=h)}return g(a);case Wb:a:{for(k=f.key;null!==d;){if(d.key===k)if(4===d.tag&&d.stateNode.containerInfo===f.containerInfo&&d.stateNode.implementation===f.implementation){c(a,d.sibling);d=e(d,f.children||[],h);d.return=a;a=d;break a}else{c(a,d);break}else b(a,d);d=d.sibling}d=bf(f,a.mode,h);d.return=a;a=d}return g(a)}if(\"string\"===typeof f||\"number\"===typeof f)return f=\n\"\"+f,null!==d&&6===d.tag?(c(a,d.sibling),d=e(d,f,h),d.return=a,a=d):(c(a,d),d=af(f,a.mode,h),d.return=a,a=d),g(a);if(zf(f))return v(a,d,f,h);if(hc(f))return R(a,d,f,h);l&&Bf(a,f);if(\"undefined\"===typeof f&&!k)switch(a.tag){case 1:case 0:h=a.type,x(\"152\",h.displayName||h.name||\"Component\")}return c(a,d)}}var Df=Cf(!0),Ef=Cf(!1),Ff={},N={current:Ff},Gf={current:Ff},Hf={current:Ff};function If(a){a===Ff?x(\"174\"):void 0;return a}\nfunction Jf(a,b){G(Hf,b,a);G(Gf,a,a);G(N,Ff,a);var c=b.nodeType;switch(c){case 9:case 11:b=(b=b.documentElement)?b.namespaceURI:he(null,\"\");break;default:c=8===c?b.parentNode:b,b=c.namespaceURI||null,c=c.tagName,b=he(b,c)}F(N,a);G(N,b,a)}function Kf(a){F(N,a);F(Gf,a);F(Hf,a)}function Lf(a){If(Hf.current);var b=If(N.current);var c=he(b,a.type);b!==c&&(G(Gf,a,a),G(N,c,a))}function Mf(a){Gf.current===a&&(F(N,a),F(Gf,a))}\nvar Nf=0,Of=2,Pf=4,Qf=8,Rf=16,Sf=32,Tf=64,Uf=128,Vf=Tb.ReactCurrentDispatcher,Wf=0,Xf=null,O=null,P=null,Yf=null,Q=null,Zf=null,$f=0,ag=null,bg=0,cg=!1,dg=null,eg=0;function fg(){x(\"307\")}function gg(a,b){if(null===b)return!1;for(var c=0;c$f&&($f=m)):f=l.eagerReducer===a?l.eagerState:a(f,l.action);g=l;l=l.next}while(null!==l&&l!==d);k||(h=g,e=f);bd(f,b.memoizedState)||(qg=!0);b.memoizedState=f;b.baseUpdate=h;b.baseState=e;c.eagerReducer=a;c.eagerState=f}return[b.memoizedState,c.dispatch]}\nfunction rg(a,b,c,d){a={tag:a,create:b,destroy:c,deps:d,next:null};null===ag?(ag={lastEffect:null},ag.lastEffect=a.next=a):(b=ag.lastEffect,null===b?ag.lastEffect=a.next=a:(c=b.next,b.next=a,a.next=c,ag.lastEffect=a));return a}function sg(a,b,c,d){var e=mg();bg|=a;e.memoizedState=rg(b,c,void 0,void 0===d?null:d)}\nfunction tg(a,b,c,d){var e=ng();d=void 0===d?null:d;var f=void 0;if(null!==O){var g=O.memoizedState;f=g.destroy;if(null!==d&&gg(d,g.deps)){rg(Nf,c,f,d);return}}bg|=a;e.memoizedState=rg(b,c,f,d)}function ug(a,b){if(\"function\"===typeof b)return a=a(),b(a),function(){b(null)};if(null!==b&&void 0!==b)return a=a(),b.current=a,function(){b.current=null}}function vg(){}\nfunction wg(a,b,c){25>eg?void 0:x(\"301\");var d=a.alternate;if(a===Xf||null!==d&&d===Xf)if(cg=!0,a={expirationTime:Wf,action:c,eagerReducer:null,eagerState:null,next:null},null===dg&&(dg=new Map),c=dg.get(b),void 0===c)dg.set(b,a);else{for(b=c;null!==b.next;)b=b.next;b.next=a}else{of();var e=lf();e=mf(e,a);var f={expirationTime:e,action:c,eagerReducer:null,eagerState:null,next:null},g=b.last;if(null===g)f.next=f;else{var h=g.next;null!==h&&(f.next=h);g.next=f}b.last=f;if(0===a.expirationTime&&(null===\nd||0===d.expirationTime)&&(d=b.eagerReducer,null!==d))try{var l=b.eagerState,k=d(l,c);f.eagerReducer=d;f.eagerState=k;if(bd(k,l))return}catch(m){}finally{}qf(a,e)}}\nvar kg={readContext:M,useCallback:fg,useContext:fg,useEffect:fg,useImperativeHandle:fg,useLayoutEffect:fg,useMemo:fg,useReducer:fg,useRef:fg,useState:fg,useDebugValue:fg},ig={readContext:M,useCallback:function(a,b){mg().memoizedState=[a,void 0===b?null:b];return a},useContext:M,useEffect:function(a,b){return sg(516,Uf|Tf,a,b)},useImperativeHandle:function(a,b,c){c=null!==c&&void 0!==c?c.concat([a]):null;return sg(4,Pf|Sf,ug.bind(null,b,a),c)},useLayoutEffect:function(a,b){return sg(4,Pf|Sf,a,b)},\nuseMemo:function(a,b){var c=mg();b=void 0===b?null:b;a=a();c.memoizedState=[a,b];return a},useReducer:function(a,b,c){var d=mg();b=void 0!==c?c(b):b;d.memoizedState=d.baseState=b;a=d.queue={last:null,dispatch:null,eagerReducer:a,eagerState:b};a=a.dispatch=wg.bind(null,Xf,a);return[d.memoizedState,a]},useRef:function(a){var b=mg();a={current:a};return b.memoizedState=a},useState:function(a){var b=mg();\"function\"===typeof a&&(a=a());b.memoizedState=b.baseState=a;a=b.queue={last:null,dispatch:null,eagerReducer:og,\neagerState:a};a=a.dispatch=wg.bind(null,Xf,a);return[b.memoizedState,a]},useDebugValue:vg},jg={readContext:M,useCallback:function(a,b){var c=ng();b=void 0===b?null:b;var d=c.memoizedState;if(null!==d&&null!==b&&gg(b,d[1]))return d[0];c.memoizedState=[a,b];return a},useContext:M,useEffect:function(a,b){return tg(516,Uf|Tf,a,b)},useImperativeHandle:function(a,b,c){c=null!==c&&void 0!==c?c.concat([a]):null;return tg(4,Pf|Sf,ug.bind(null,b,a),c)},useLayoutEffect:function(a,b){return tg(4,Pf|Sf,a,b)},\nuseMemo:function(a,b){var c=ng();b=void 0===b?null:b;var d=c.memoizedState;if(null!==d&&null!==b&&gg(b,d[1]))return d[0];a=a();c.memoizedState=[a,b];return a},useReducer:pg,useRef:function(){return ng().memoizedState},useState:function(a){return pg(og,a)},useDebugValue:vg},xg=null,yg=null,zg=!1;\nfunction Ag(a,b){var c=K(5,null,null,0);c.elementType=\"DELETED\";c.type=\"DELETED\";c.stateNode=b;c.return=a;c.effectTag=8;null!==a.lastEffect?(a.lastEffect.nextEffect=c,a.lastEffect=c):a.firstEffect=a.lastEffect=c}function Bg(a,b){switch(a.tag){case 5:var c=a.type;b=1!==b.nodeType||c.toLowerCase()!==b.nodeName.toLowerCase()?null:b;return null!==b?(a.stateNode=b,!0):!1;case 6:return b=\"\"===a.pendingProps||3!==b.nodeType?null:b,null!==b?(a.stateNode=b,!0):!1;case 13:return!1;default:return!1}}\nfunction Cg(a){if(zg){var b=yg;if(b){var c=b;if(!Bg(a,b)){b=De(c);if(!b||!Bg(a,b)){a.effectTag|=2;zg=!1;xg=a;return}Ag(xg,c)}xg=a;yg=Ee(b)}else a.effectTag|=2,zg=!1,xg=a}}function Dg(a){for(a=a.return;null!==a&&5!==a.tag&&3!==a.tag&&18!==a.tag;)a=a.return;xg=a}function Eg(a){if(a!==xg)return!1;if(!zg)return Dg(a),zg=!0,!1;var b=a.type;if(5!==a.tag||\"head\"!==b&&\"body\"!==b&&!xe(b,a.memoizedProps))for(b=yg;b;)Ag(a,b),b=De(b);Dg(a);yg=xg?De(a.stateNode):null;return!0}function Fg(){yg=xg=null;zg=!1}\nvar Gg=Tb.ReactCurrentOwner,qg=!1;function S(a,b,c,d){b.child=null===a?Ef(b,null,c,d):Df(b,a.child,c,d)}function Hg(a,b,c,d,e){c=c.render;var f=b.ref;Ig(b,e);d=hg(a,b,c,d,f,e);if(null!==a&&!qg)return b.updateQueue=a.updateQueue,b.effectTag&=-517,a.expirationTime<=e&&(a.expirationTime=0),Jg(a,b,e);b.effectTag|=1;S(a,b,d,e);return b.child}\nfunction Kg(a,b,c,d,e,f){if(null===a){var g=c.type;if(\"function\"===typeof g&&!Ve(g)&&void 0===g.defaultProps&&null===c.compare&&void 0===c.defaultProps)return b.tag=15,b.type=g,Lg(a,b,g,d,e,f);a=Ye(c.type,null,d,null,b.mode,f);a.ref=b.ref;a.return=b;return b.child=a}g=a.child;if(e=c)return Sg(a,b,c);b=Jg(a,b,c);return null!==b?b.sibling:null}}return Jg(a,b,c)}}else qg=!1;b.expirationTime=0;switch(b.tag){case 2:d=\nb.elementType;null!==a&&(a.alternate=null,b.alternate=null,b.effectTag|=2);a=b.pendingProps;var e=Je(b,H.current);Ig(b,c);e=hg(null,b,d,a,e,c);b.effectTag|=1;if(\"object\"===typeof e&&null!==e&&\"function\"===typeof e.render&&void 0===e.$$typeof){b.tag=1;lg();if(J(d)){var f=!0;Oe(b)}else f=!1;b.memoizedState=null!==e.state&&void 0!==e.state?e.state:null;var g=d.getDerivedStateFromProps;\"function\"===typeof g&&kf(b,d,g,a);e.updater=tf;b.stateNode=e;e._reactInternalFiber=b;xf(b,d,a,c);b=Qg(null,b,d,!0,f,\nc)}else b.tag=0,S(null,b,e,c),b=b.child;return b;case 16:e=b.elementType;null!==a&&(a.alternate=null,b.alternate=null,b.effectTag|=2);f=b.pendingProps;a=hf(e);b.type=a;e=b.tag=We(a);f=L(a,f);g=void 0;switch(e){case 0:g=Mg(null,b,a,f,c);break;case 1:g=Og(null,b,a,f,c);break;case 11:g=Hg(null,b,a,f,c);break;case 14:g=Kg(null,b,a,L(a.type,f),d,c);break;default:x(\"306\",a,\"\")}return g;case 0:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:L(d,e),Mg(a,b,d,e,c);case 1:return d=b.type,e=b.pendingProps,\ne=b.elementType===d?e:L(d,e),Og(a,b,d,e,c);case 3:Rg(b);d=b.updateQueue;null===d?x(\"282\"):void 0;e=b.memoizedState;e=null!==e?e.element:null;yf(b,d,b.pendingProps,null,c);d=b.memoizedState.element;if(d===e)Fg(),b=Jg(a,b,c);else{e=b.stateNode;if(e=(null===a||null===a.child)&&e.hydrate)yg=Ee(b.stateNode.containerInfo),xg=b,e=zg=!0;e?(b.effectTag|=2,b.child=Ef(b,null,d,c)):(S(a,b,d,c),Fg());b=b.child}return b;case 5:return Lf(b),null===a&&Cg(b),d=b.type,e=b.pendingProps,f=null!==a?a.memoizedProps:null,\ng=e.children,xe(d,e)?g=null:null!==f&&xe(d,f)&&(b.effectTag|=16),Ng(a,b),1!==c&&b.mode&1&&e.hidden?(b.expirationTime=b.childExpirationTime=1,b=null):(S(a,b,g,c),b=b.child),b;case 6:return null===a&&Cg(b),null;case 13:return Sg(a,b,c);case 4:return Jf(b,b.stateNode.containerInfo),d=b.pendingProps,null===a?b.child=Df(b,null,d,c):S(a,b,d,c),b.child;case 11:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:L(d,e),Hg(a,b,d,e,c);case 7:return S(a,b,b.pendingProps,c),b.child;case 8:return S(a,b,b.pendingProps.children,\nc),b.child;case 12:return S(a,b,b.pendingProps.children,c),b.child;case 10:a:{d=b.type._context;e=b.pendingProps;g=b.memoizedProps;f=e.value;Ug(b,f);if(null!==g){var h=g.value;f=bd(h,f)?0:(\"function\"===typeof d._calculateChangedBits?d._calculateChangedBits(h,f):1073741823)|0;if(0===f){if(g.children===e.children&&!I.current){b=Jg(a,b,c);break a}}else for(h=b.child,null!==h&&(h.return=b);null!==h;){var l=h.contextDependencies;if(null!==l){g=h.child;for(var k=l.first;null!==k;){if(k.context===d&&0!==\n(k.observedBits&f)){1===h.tag&&(k=nf(c),k.tag=sf,pf(h,k));h.expirationTime=b&&(qg=!0);a.contextDependencies=null}\nfunction M(a,b){if(Yg!==a&&!1!==b&&0!==b){if(\"number\"!==typeof b||1073741823===b)Yg=a,b=1073741823;b={context:a,observedBits:b,next:null};null===Xg?(null===Wg?x(\"308\"):void 0,Xg=b,Wg.contextDependencies={first:b,expirationTime:0}):Xg=Xg.next=b}return a._currentValue}var $g=0,rf=1,sf=2,ah=3,Pg=!1;function bh(a){return{baseState:a,firstUpdate:null,lastUpdate:null,firstCapturedUpdate:null,lastCapturedUpdate:null,firstEffect:null,lastEffect:null,firstCapturedEffect:null,lastCapturedEffect:null}}\nfunction ch(a){return{baseState:a.baseState,firstUpdate:a.firstUpdate,lastUpdate:a.lastUpdate,firstCapturedUpdate:null,lastCapturedUpdate:null,firstEffect:null,lastEffect:null,firstCapturedEffect:null,lastCapturedEffect:null}}function nf(a){return{expirationTime:a,tag:$g,payload:null,callback:null,next:null,nextEffect:null}}function dh(a,b){null===a.lastUpdate?a.firstUpdate=a.lastUpdate=b:(a.lastUpdate.next=b,a.lastUpdate=b)}\nfunction pf(a,b){var c=a.alternate;if(null===c){var d=a.updateQueue;var e=null;null===d&&(d=a.updateQueue=bh(a.memoizedState))}else d=a.updateQueue,e=c.updateQueue,null===d?null===e?(d=a.updateQueue=bh(a.memoizedState),e=c.updateQueue=bh(c.memoizedState)):d=a.updateQueue=ch(e):null===e&&(e=c.updateQueue=ch(d));null===e||d===e?dh(d,b):null===d.lastUpdate||null===e.lastUpdate?(dh(d,b),dh(e,b)):(dh(d,b),e.lastUpdate=b)}\nfunction eh(a,b){var c=a.updateQueue;c=null===c?a.updateQueue=bh(a.memoizedState):fh(a,c);null===c.lastCapturedUpdate?c.firstCapturedUpdate=c.lastCapturedUpdate=b:(c.lastCapturedUpdate.next=b,c.lastCapturedUpdate=b)}function fh(a,b){var c=a.alternate;null!==c&&b===c.updateQueue&&(b=a.updateQueue=ch(b));return b}\nfunction gh(a,b,c,d,e,f){switch(c.tag){case rf:return a=c.payload,\"function\"===typeof a?a.call(f,d,e):a;case ah:a.effectTag=a.effectTag&-2049|64;case $g:a=c.payload;e=\"function\"===typeof a?a.call(f,d,e):a;if(null===e||void 0===e)break;return n({},d,e);case sf:Pg=!0}return d}\nfunction yf(a,b,c,d,e){Pg=!1;b=fh(a,b);for(var f=b.baseState,g=null,h=0,l=b.firstUpdate,k=f;null!==l;){var m=l.expirationTime;md?e:d);Ih.current=null;d=void 0;1c?b:c;0===b&&(Fh=null);$h(a,b)}\nfunction ai(a){for(;;){var b=a.alternate,c=a.return,d=a.sibling;if(0===(a.effectTag&1024)){T=a;a:{var e=b;b=a;var f=U;var g=b.pendingProps;switch(b.tag){case 2:break;case 16:break;case 15:case 0:break;case 1:J(b.type)&&Ke(b);break;case 3:Kf(b);Le(b);g=b.stateNode;g.pendingContext&&(g.context=g.pendingContext,g.pendingContext=null);if(null===e||null===e.child)Eg(b),b.effectTag&=-3;mh(b);break;case 5:Mf(b);var h=If(Hf.current);f=b.type;if(null!==e&&null!=b.stateNode)nh(e,b,f,g,h),e.ref!==b.ref&&(b.effectTag|=\n128);else if(g){var l=If(N.current);if(Eg(b)){g=b;e=g.stateNode;var k=g.type,m=g.memoizedProps,p=h;e[Fa]=g;e[Ga]=m;f=void 0;h=k;switch(h){case \"iframe\":case \"object\":E(\"load\",e);break;case \"video\":case \"audio\":for(k=0;k\\x3c/script>\",k=e.removeChild(e.firstChild)):\"string\"===typeof p.is?k=k.createElement(e,{is:p.is}):(k=k.createElement(e),\"select\"===e&&p.multiple&&(k.multiple=!0)):k=k.createElementNS(l,e);e=k;e[Fa]=m;e[Ga]=g;lh(e,b,!1,!1);p=e;k=f;m=g;var t=h,A=re(k,m);switch(k){case \"iframe\":case \"object\":E(\"load\",\np);h=m;break;case \"video\":case \"audio\":for(h=0;hg&&(g=e),h>g&&(g=h),f=f.sibling;b.childExpirationTime=g}if(null!==T)return T;null!==c&&0===(c.effectTag&1024)&&(null===c.firstEffect&&\n(c.firstEffect=a.firstEffect),null!==a.lastEffect&&(null!==c.lastEffect&&(c.lastEffect.nextEffect=a.firstEffect),c.lastEffect=a.lastEffect),1=v)t=0;else if(-1===t||v component higher in the tree to provide a loading indicator or placeholder to display.\"+jc(k))}Nh=!0;m=jh(m,k);h=l;do{switch(h.tag){case 3:h.effectTag|=2048;h.expirationTime=g;g=Ch(h,m,g);eh(h,g);break a;case 1:if(t=m,A=h.type,k=h.stateNode,0===(h.effectTag&64)&&(\"function\"===typeof A.getDerivedStateFromError||null!==k&&\"function\"===typeof k.componentDidCatch&&(null===Fh||!Fh.has(k)))){h.effectTag|=2048;\nh.expirationTime=g;g=Eh(h,t,g);eh(h,g);break a}}h=h.return}while(null!==h)}T=ai(f);continue}}}break}while(1);Kh=!1;Hh.current=c;Yg=Xg=Wg=null;lg();if(e)Lh=null,a.finishedWork=null;else if(null!==T)a.finishedWork=null;else{c=a.current.alternate;null===c?x(\"281\"):void 0;Lh=null;if(Nh){e=a.latestPendingTime;f=a.latestSuspendedTime;g=a.latestPingedTime;if(0!==e&&eb?0:b)):(a.pendingCommitExpirationTime=d,a.finishedWork=c)}}\nfunction sh(a,b){for(var c=a.return;null!==c;){switch(c.tag){case 1:var d=c.stateNode;if(\"function\"===typeof c.type.getDerivedStateFromError||\"function\"===typeof d.componentDidCatch&&(null===Fh||!Fh.has(d))){a=jh(b,a);a=Eh(c,a,1073741823);pf(c,a);qf(c,1073741823);return}break;case 3:a=jh(b,a);a=Ch(c,a,1073741823);pf(c,a);qf(c,1073741823);return}c=c.return}3===a.tag&&(c=jh(b,a),c=Ch(a,c,1073741823),pf(a,c),qf(a,1073741823))}\nfunction mf(a,b){var c=r.unstable_getCurrentPriorityLevel(),d=void 0;if(0===(b.mode&1))d=1073741823;else if(Kh&&!Oh)d=U;else{switch(c){case r.unstable_ImmediatePriority:d=1073741823;break;case r.unstable_UserBlockingPriority:d=1073741822-10*(((1073741822-a+15)/10|0)+1);break;case r.unstable_NormalPriority:d=1073741822-25*(((1073741822-a+500)/25|0)+1);break;case r.unstable_LowPriority:case r.unstable_IdlePriority:d=1;break;default:x(\"313\")}null!==Lh&&d===U&&--d}c===r.unstable_UserBlockingPriority&&\n(0===gi||d=d){a.didError=!1;b=a.latestPingedTime;if(0===b||b>c)a.latestPingedTime=c;df(c,a);c=a.expirationTime;0!==c&&Xh(a,c)}}function Ah(a,b){var c=a.stateNode;null!==c&&c.delete(b);b=lf();b=mf(b,a);a=hi(a,b);null!==a&&(cf(a,b),b=a.expirationTime,0!==b&&Xh(a,b))}\nfunction hi(a,b){a.expirationTimeU&&Sh(),cf(a,b),Kh&&!Oh&&Lh===a||Xh(a,a.expirationTime),ii>ji&&(ii=0,x(\"185\")))}function ki(a,b,c,d,e){return r.unstable_runWithPriority(r.unstable_ImmediatePriority,function(){return a(b,c,d,e)})}var li=null,Y=null,mi=0,ni=void 0,W=!1,oi=null,Z=0,gi=0,pi=!1,qi=null,X=!1,ri=!1,si=null,ti=r.unstable_now(),ui=1073741822-(ti/10|0),vi=ui,ji=50,ii=0,wi=null;function xi(){ui=1073741822-((r.unstable_now()-ti)/10|0)}\nfunction yi(a,b){if(0!==mi){if(ba.expirationTime&&(a.expirationTime=b);W||(X?ri&&(oi=a,Z=1073741823,Di(a,1073741823,!1)):1073741823===b?Yh(1073741823,!1):yi(a,b))}\nfunction Ci(){var a=0,b=null;if(null!==Y)for(var c=Y,d=li;null!==d;){var e=d.expirationTime;if(0===e){null===c||null===Y?x(\"244\"):void 0;if(d===d.nextScheduledRoot){li=Y=d.nextScheduledRoot=null;break}else if(d===li)li=e=d.nextScheduledRoot,Y.nextScheduledRoot=e,d.nextScheduledRoot=null;else if(d===Y){Y=c;Y.nextScheduledRoot=li;d.nextScheduledRoot=null;break}else c.nextScheduledRoot=d.nextScheduledRoot,d.nextScheduledRoot=null;d=c.nextScheduledRoot}else{e>a&&(a=e,b=d);if(d===Y)break;if(1073741823===\na)break;c=d;d=d.nextScheduledRoot}}oi=b;Z=a}var Ei=!1;function di(){return Ei?!0:r.unstable_shouldYield()?Ei=!0:!1}function zi(){try{if(!di()&&null!==li){xi();var a=li;do{var b=a.expirationTime;0!==b&&ui<=b&&(a.nextExpirationTimeToWorkOn=ui);a=a.nextScheduledRoot}while(a!==li)}Yh(0,!0)}finally{Ei=!1}}\nfunction Yh(a,b){Ci();if(b)for(xi(),vi=ui;null!==oi&&0!==Z&&a<=Z&&!(Ei&&ui>Z);)Di(oi,Z,ui>Z),Ci(),xi(),vi=ui;else for(;null!==oi&&0!==Z&&a<=Z;)Di(oi,Z,!1),Ci();b&&(mi=0,ni=null);0!==Z&&yi(oi,Z);ii=0;wi=null;if(null!==si)for(a=si,si=null,b=0;b=c&&(null===si?si=[d]:si.push(d),d._defer)){a.finishedWork=b;a.expirationTime=0;return}a.finishedWork=null;a===wi?ii++:(wi=a,ii=0);r.unstable_runWithPriority(r.unstable_ImmediatePriority,function(){Zh(a,b)})}function Dh(a){null===oi?x(\"246\"):void 0;oi.expirationTime=0;pi||(pi=!0,qi=a)}function Gi(a,b){var c=X;X=!0;try{return a(b)}finally{(X=c)||W||Yh(1073741823,!1)}}\nfunction Hi(a,b){if(X&&!ri){ri=!0;try{return a(b)}finally{ri=!1}}return a(b)}function Ii(a,b,c){X||W||0===gi||(Yh(gi,!1),gi=0);var d=X;X=!0;try{return r.unstable_runWithPriority(r.unstable_UserBlockingPriority,function(){return a(b,c)})}finally{(X=d)||W||Yh(1073741823,!1)}}\nfunction Ji(a,b,c,d,e){var f=b.current;a:if(c){c=c._reactInternalFiber;b:{2===ed(c)&&1===c.tag?void 0:x(\"170\");var g=c;do{switch(g.tag){case 3:g=g.stateNode.context;break b;case 1:if(J(g.type)){g=g.stateNode.__reactInternalMemoizedMergedChildContext;break b}}g=g.return}while(null!==g);x(\"171\");g=void 0}if(1===c.tag){var h=c.type;if(J(h)){c=Ne(c,h,g);break a}}c=g}else c=He;null===b.context?b.context=c:b.pendingContext=c;b=e;e=nf(d);e.payload={element:a};b=void 0===b?null:b;null!==b&&(e.callback=b);\nof();pf(f,e);qf(f,d);return d}function Ki(a,b,c,d){var e=b.current,f=lf();e=mf(f,e);return Ji(a,b,c,e,d)}function Li(a){a=a.current;if(!a.child)return null;switch(a.child.tag){case 5:return a.child.stateNode;default:return a.child.stateNode}}function Mi(a,b,c){var d=3=Jh&&(b=Jh-1);this._expirationTime=Jh=b;this._root=a;this._callbacks=this._next=null;this._hasChildren=this._didComplete=!1;this._children=null;this._defer=!0}Ni.prototype.render=function(a){this._defer?void 0:x(\"250\");this._hasChildren=!0;this._children=a;var b=this._root._internalRoot,c=this._expirationTime,d=new Oi;Ji(a,b,null,c,d._onCommit);return d};\nNi.prototype.then=function(a){if(this._didComplete)a();else{var b=this._callbacks;null===b&&(b=this._callbacks=[]);b.push(a)}};\nNi.prototype.commit=function(){var a=this._root._internalRoot,b=a.firstBatch;this._defer&&null!==b?void 0:x(\"251\");if(this._hasChildren){var c=this._expirationTime;if(b!==this){this._hasChildren&&(c=this._expirationTime=b._expirationTime,this.render(this._children));for(var d=null,e=b;e!==this;)d=e,e=e._next;null===d?x(\"251\"):void 0;d._next=e._next;this._next=b;a.firstBatch=this}this._defer=!1;Bi(a,c);b=this._next;this._next=null;b=a.firstBatch=b;null!==b&&b._hasChildren&&b.render(b._children)}else this._next=\nnull,this._defer=!1};Ni.prototype._onComplete=function(){if(!this._didComplete){this._didComplete=!0;var a=this._callbacks;if(null!==a)for(var b=0;b=b;)c=d,d=d._next;a._next=d;null!==c&&(c._next=a)}return a};function Qi(a){return!(!a||1!==a.nodeType&&9!==a.nodeType&&11!==a.nodeType&&(8!==a.nodeType||\" react-mount-point-unstable \"!==a.nodeValue))}Gb=Gi;Hb=Ii;Ib=function(){W||0===gi||(Yh(gi,!1),gi=0)};\nfunction Ri(a,b){b||(b=a?9===a.nodeType?a.documentElement:a.firstChild:null,b=!(!b||1!==b.nodeType||!b.hasAttribute(\"data-reactroot\")));if(!b)for(var c;c=a.lastChild;)a.removeChild(c);return new Pi(a,!1,b)}\nfunction Si(a,b,c,d,e){var f=c._reactRootContainer;if(f){if(\"function\"===typeof e){var g=e;e=function(){var a=Li(f._internalRoot);g.call(a)}}null!=a?f.legacy_renderSubtreeIntoContainer(a,b,e):f.render(b,e)}else{f=c._reactRootContainer=Ri(c,d);if(\"function\"===typeof e){var h=e;e=function(){var a=Li(f._internalRoot);h.call(a)}}Hi(function(){null!=a?f.legacy_renderSubtreeIntoContainer(a,b,e):f.render(b,e)})}return Li(f._internalRoot)}\nfunction Ti(a,b){var c=2= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nimport React, { Component, Children } from 'react';\nimport { Transition } from 'react-transition-group';\nimport PropTypes from 'prop-types';\nimport Animate from './Animate';\n\nvar parseDurationOfSingleTransition = function parseDurationOfSingleTransition() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var steps = options.steps,\n duration = options.duration;\n\n if (steps && steps.length) {\n return steps.reduce(function (result, entry) {\n return result + (_isNumber(entry.duration) && entry.duration > 0 ? entry.duration : 0);\n }, 0);\n }\n\n if (_isNumber(duration)) {\n return duration;\n }\n\n return 0;\n};\n\nvar AnimateGroupChild =\n/*#__PURE__*/\nfunction (_Component) {\n _inherits(AnimateGroupChild, _Component);\n\n function AnimateGroupChild() {\n var _getPrototypeOf2;\n\n var _this;\n\n _classCallCheck(this, AnimateGroupChild);\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n _this = _possibleConstructorReturn(this, (_getPrototypeOf2 = _getPrototypeOf(AnimateGroupChild)).call.apply(_getPrototypeOf2, [this].concat(args)));\n _this.state = {\n isActive: false\n };\n\n _this.handleEnter = function (node, isAppearing) {\n var _this$props = _this.props,\n appearOptions = _this$props.appearOptions,\n enterOptions = _this$props.enterOptions;\n\n _this.handleStyleActive(isAppearing ? appearOptions : enterOptions);\n };\n\n _this.handleExit = function () {\n _this.handleStyleActive(_this.props.leaveOptions);\n };\n\n return _this;\n }\n\n _createClass(AnimateGroupChild, [{\n key: \"handleStyleActive\",\n value: function handleStyleActive(style) {\n if (style) {\n var onAnimationEnd = style.onAnimationEnd ? function () {\n style.onAnimationEnd();\n } : null;\n this.setState(_objectSpread({}, style, {\n onAnimationEnd: onAnimationEnd,\n isActive: true\n }));\n }\n }\n }, {\n key: \"parseTimeout\",\n value: function parseTimeout() {\n var _this$props2 = this.props,\n appearOptions = _this$props2.appearOptions,\n enterOptions = _this$props2.enterOptions,\n leaveOptions = _this$props2.leaveOptions;\n return parseDurationOfSingleTransition(appearOptions) + parseDurationOfSingleTransition(enterOptions) + parseDurationOfSingleTransition(leaveOptions);\n }\n }, {\n key: \"render\",\n value: function render() {\n var _this2 = this;\n\n var _this$props3 = this.props,\n children = _this$props3.children,\n appearOptions = _this$props3.appearOptions,\n enterOptions = _this$props3.enterOptions,\n leaveOptions = _this$props3.leaveOptions,\n props = _objectWithoutProperties(_this$props3, [\"children\", \"appearOptions\", \"enterOptions\", \"leaveOptions\"]);\n\n return React.createElement(Transition, _extends({}, props, {\n onEnter: this.handleEnter,\n onExit: this.handleExit,\n timeout: this.parseTimeout()\n }), function () {\n return React.createElement(Animate, _this2.state, Children.only(children));\n });\n }\n }]);\n\n return AnimateGroupChild;\n}(Component);\n\nAnimateGroupChild.propTypes = {\n appearOptions: PropTypes.object,\n enterOptions: PropTypes.object,\n leaveOptions: PropTypes.object,\n children: PropTypes.element\n};\nexport default AnimateGroupChild;", "import React, { Children } from 'react';\nimport { TransitionGroup } from 'react-transition-group';\nimport PropTypes from 'prop-types';\nimport AnimateGroupChild from './AnimateGroupChild';\n\nfunction AnimateGroup(props) {\n var component = props.component,\n children = props.children,\n appear = props.appear,\n enter = props.enter,\n leave = props.leave;\n return React.createElement(TransitionGroup, {\n component: component\n }, Children.map(children, function (child, index) {\n return React.createElement(AnimateGroupChild, {\n appearOptions: appear,\n enterOptions: enter,\n leaveOptions: leave,\n key: \"child-\".concat(index)\n }, child);\n }));\n}\n\nAnimateGroup.propTypes = {\n appear: PropTypes.object,\n enter: PropTypes.object,\n leave: PropTypes.object,\n children: PropTypes.oneOfType([PropTypes.array, PropTypes.element]),\n component: PropTypes.any\n};\nAnimateGroup.defaultProps = {\n component: 'span'\n};\nexport default AnimateGroup;", "import Animate from './Animate';\nimport { configBezier, configSpring } from './easing';\nimport { translateStyle } from './util';\nimport AnimateGroup from './AnimateGroup';\nexport { configSpring, configBezier, AnimateGroup, translateStyle };\nexport default Animate;", - "\"use strict\";\n\nexports.__esModule = true;\nexports.default = void 0;\n\nvar PropTypes = _interopRequireWildcard(require(\"prop-types\"));\n\nvar _addClass = _interopRequireDefault(require(\"dom-helpers/class/addClass\"));\n\nvar _removeClass = _interopRequireDefault(require(\"dom-helpers/class/removeClass\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _Transition = _interopRequireDefault(require(\"./Transition\"));\n\nvar _PropTypes = require(\"./utils/PropTypes\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }\n\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }\n\nvar addClass = function addClass(node, classes) {\n return node && classes && classes.split(' ').forEach(function (c) {\n return (0, _addClass.default)(node, c);\n });\n};\n\nvar removeClass = function removeClass(node, classes) {\n return node && classes && classes.split(' ').forEach(function (c) {\n return (0, _removeClass.default)(node, c);\n });\n};\n/**\n * A `)) + ("`" + (`Transition` + "`")))) + (((` component using CSS transitions and animations.\n * It's inspired by the excellent [ng-animate](http://www.nganimate.org/) library.\n *\n * ` + "`") + (`CSSTransition` + ("`" + ` applies a pair of class names during the `))) + (("`" + (`appear` + "`")) + (`, ` + ("`" + `enter`)))))) + ((((("`" + `,\n * and `) + ("`" + (`exit` + "`"))) + ((` stages of the transition. The first class is applied and then a\n * second \"active\" class in order to activate the css animation. After the animation,\n * matching ` + ("`" + `done`)) + ("`" + (` class names are applied to persist the animation state.\n *\n * When the ` + "`")))) + (((`in` + "`") + (` prop is toggled to ` + ("`" + `true`))) + (("`" + (` the Component will get\n * the ` + "`")) + (`example-enter` + ("`" + ` CSS class and the `))))) + (((("`" + `example-enter-active`) + ("`" + (` CSS class\n * added in the next tick. This is a convention based on the ` + "`"))) + ((`classNames` + ("`" + ` prop.\n */\n\n\nvar CSSTransition =\n/*#__PURE__*/\nfunction (_React$Component) {\n _inheritsLoose(CSSTransition, _React$Component);\n\n function CSSTransition() {\n var _this;\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n _this = _React$Component.call.apply(_React$Component, [this].concat(args)) || this;\n\n _this.onEnter = function (node, appearing) {\n var _this$getClassNames = _this.getClassNames(appearing ? 'appear' : 'enter'),\n className = _this$getClassNames.className;\n\n _this.removeClasses(node, 'exit');\n\n addClass(node, className);\n\n if (_this.props.onEnter) {\n _this.props.onEnter(node, appearing);\n }\n };\n\n _this.onEntering = function (node, appearing) {\n var _this$getClassNames2 = _this.getClassNames(appearing ? 'appear' : 'enter'),\n activeClassName = _this$getClassNames2.activeClassName;\n\n _this.reflowAndAddClass(node, activeClassName);\n\n if (_this.props.onEntering) {\n _this.props.onEntering(node, appearing);\n }\n };\n\n _this.onEntered = function (node, appearing) {\n var _this$getClassNames3 = _this.getClassNames('enter'),\n doneClassName = _this$getClassNames3.doneClassName;\n\n _this.removeClasses(node, appearing ? 'appear' : 'enter');\n\n addClass(node, doneClassName);\n\n if (_this.props.onEntered) {\n _this.props.onEntered(node, appearing);\n }\n };\n\n _this.onExit = function (node) {\n var _this$getClassNames4 = _this.getClassNames('exit'),\n className = _this$getClassNames4.className;\n\n _this.removeClasses(node, 'appear');\n\n _this.removeClasses(node, 'enter');\n\n addClass(node, className);\n\n if (_this.props.onExit) {\n _this.props.onExit(node);\n }\n };\n\n _this.onExiting = function (node) {\n var _this$getClassNames5 = _this.getClassNames('exit'),\n activeClassName = _this$getClassNames5.activeClassName;\n\n _this.reflowAndAddClass(node, activeClassName);\n\n if (_this.props.onExiting) {\n _this.props.onExiting(node);\n }\n };\n\n _this.onExited = function (node) {\n var _this$getClassNames6 = _this.getClassNames('exit'),\n doneClassName = _this$getClassNames6.doneClassName;\n\n _this.removeClasses(node, 'exit');\n\n addClass(node, doneClassName);\n\n if (_this.props.onExited) {\n _this.props.onExited(node);\n }\n };\n\n _this.getClassNames = function (type) {\n var classNames = _this.props.classNames;\n var className = typeof classNames !== 'string' ? classNames[type] : classNames + '-' + type;\n var activeClassName = typeof classNames !== 'string' ? classNames[type + 'Active'] : className + '-active';\n var doneClassName = typeof classNames !== 'string' ? classNames[type + 'Done'] : className + '-done';\n return {\n className: className,\n activeClassName: activeClassName,\n doneClassName: doneClassName\n };\n };\n\n return _this;\n }\n\n var _proto = CSSTransition.prototype;\n\n _proto.removeClasses = function removeClasses(node, type) {\n var _this$getClassNames7 = this.getClassNames(type),\n className = _this$getClassNames7.className,\n activeClassName = _this$getClassNames7.activeClassName,\n doneClassName = _this$getClassNames7.doneClassName;\n\n className && removeClass(node, className);\n activeClassName && removeClass(node, activeClassName);\n doneClassName && removeClass(node, doneClassName);\n };\n\n _proto.reflowAndAddClass = function reflowAndAddClass(node, className) {\n // This is for to force a repaint,\n // which is necessary in order to transition styles when adding a class name.\n if (className) {\n /* eslint-disable no-unused-expressions */\n node && node.scrollTop;\n /* eslint-enable no-unused-expressions */\n\n addClass(node, className);\n }\n };\n\n _proto.render = function render() {\n var props = _extends({}, this.props);\n\n delete props.classNames;\n return _react.default.createElement(_Transition.default, _extends({}, props, {\n onEnter: this.onEnter,\n onEntered: this.onEntered,\n onEntering: this.onEntering,\n onExit: this.onExit,\n onExiting: this.onExiting,\n onExited: this.onExited\n }));\n };\n\n return CSSTransition;\n}(_react.default.Component);\n\nCSSTransition.propTypes = process.env.NODE_ENV !== \"production\" ? _extends({}, _Transition.default.propTypes, {\n /**\n * The animation classNames applied to the component as it enters, exits or has finished the transition.\n * A single name can be provided and it will be suffixed for each stage: e.g.\n *\n * `)) + ("`" + (`classNames=\"fade\"` + "`")))) + (((` applies ` + ("`" + `fade-enter`)) + ("`" + (`, ` + "`"))) + ((`fade-enter-active` + ("`" + `, `)) + ("`" + (`fade-enter-done` + "`")))))))) + (((((((`,\n * ` + "`") + (`fade-exit` + ("`" + `, `))) + (("`" + (`fade-exit-active` + "`")) + (`, ` + ("`" + `fade-exit-done`)))) + ((("`" + `, `) + ("`" + (`fade-appear` + "`"))) + ((`, and ` + ("`" + `fade-appear-active`)) + ("`" + (`.\n * Each individual classNames can also be specified independently like:\n *\n * ` + "`"))))) + (((("`" + "`") + (`js\n * classNames={{\n * appear: 'my-appear',\n * appearActive: 'my-active-appear',\n * enter: 'my-enter',\n * enterActive: 'my-active-enter',\n * enterDone: 'my-done-enter',\n * exit: 'my-exit',\n * exitActive: 'my-active-exit',\n * exitDone: 'my-done-exit',\n * }}\n * ` + ("`" + "`"))) + (("`" + (`\n *\n * If you want to set these classes using CSS Modules:\n *\n * ` + "`")) + ("`" + ("`" + `js\n * import styles from './styles.css';\n * `)))) + ((("`" + "`") + ("`" + (`\n *\n * you might want to use camelCase in your CSS file, that way could simply spread\n * them instead of listing them one by one:\n *\n * ` + "`"))) + (("`" + ("`" + `js\n * classNames={{ ...styles }}\n * `)) + ("`" + ("`" + "`")))))) + (((((`\n *\n * @type {string | {\n * appear?: string,\n * appearActive?: string,\n * enter?: string,\n * enterActive?: string,\n * enterDone?: string,\n * exit?: string,\n * exitActive?: string,\n * exitDone?: string,\n * }}\n */\n classNames: _PropTypes.classNamesShape,\n\n /**\n * A ` + "`") + (`` + ("`" + ` callback fired immediately after the 'enter' or 'appear' class is\n * applied.\n *\n * @type Function(node: HtmlElement, isAppearing: bool)\n */\n onEnter: PropTypes.func,\n\n /**\n * A `))) + (("`" + (`` + "`")) + (` callback fired immediately after the 'enter-active' or\n * 'appear-active' class is applied.\n *\n * @type Function(node: HtmlElement, isAppearing: bool)\n */\n onEntering: PropTypes.func,\n\n /**\n * A ` + ("`" + ``)))) + ((("`" + ` callback fired immediately after the 'enter' or\n * 'appear' classes are **removed** and the `) + ("`" + (`done` + "`"))) + ((` class is added to the DOM node.\n *\n * @type Function(node: HtmlElement, isAppearing: bool)\n */\n onEntered: PropTypes.func,\n\n /**\n * A ` + ("`" + ``)) + ("`" + (` callback fired immediately after the 'exit' class is\n * applied.\n *\n * @type Function(node: HtmlElement)\n */\n onExit: PropTypes.func,\n\n /**\n * A ` + "`"))))) + ((((`` + "`") + (` callback fired immediately after the 'exit-active' is applied.\n *\n * @type Function(node: HtmlElement)\n */\n onExiting: PropTypes.func,\n\n /**\n * A ` + ("`" + ``))) + (("`" + (` callback fired immediately after the 'exit' classes\n * are **removed** and the ` + "`")) + (`exit-done` + ("`" + ` class is added to the DOM node.\n *\n * @type Function(node: HtmlElement)\n */\n onExited: PropTypes.func\n}) : {};\nvar _default = CSSTransition;\nexports.default = _default;\nmodule.exports = exports[\"default\"];", - "\"use strict\";\n\nexports.__esModule = true;\nexports.default = void 0;\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _reactDom = require(\"react-dom\");\n\nvar _TransitionGroup = _interopRequireDefault(require(\"./TransitionGroup\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nfunction _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }\n\n/**\n * The `)))) + ((("`" + (`` + "`")) + (` component is a specialized ` + ("`" + `Transition`))) + (("`" + (` component\n * that animates between two children.\n *\n * ` + "`")) + ("`" + ("`" + `jsx\n * \n *
I appear first
\n *
I replace the above
\n *
\n * `))))))) + (((((("`" + "`") + ("`" + (`\n */\nvar ReplaceTransition =\n/*#__PURE__*/\nfunction (_React$Component) {\n _inheritsLoose(ReplaceTransition, _React$Component);\n\n function ReplaceTransition() {\n var _this;\n\n for (var _len = arguments.length, _args = new Array(_len), _key = 0; _key < _len; _key++) {\n _args[_key] = arguments[_key];\n }\n\n _this = _React$Component.call.apply(_React$Component, [this].concat(_args)) || this;\n\n _this.handleEnter = function () {\n for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n\n return _this.handleLifecycle('onEnter', 0, args);\n };\n\n _this.handleEntering = function () {\n for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n args[_key3] = arguments[_key3];\n }\n\n return _this.handleLifecycle('onEntering', 0, args);\n };\n\n _this.handleEntered = function () {\n for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {\n args[_key4] = arguments[_key4];\n }\n\n return _this.handleLifecycle('onEntered', 0, args);\n };\n\n _this.handleExit = function () {\n for (var _len5 = arguments.length, args = new Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {\n args[_key5] = arguments[_key5];\n }\n\n return _this.handleLifecycle('onExit', 1, args);\n };\n\n _this.handleExiting = function () {\n for (var _len6 = arguments.length, args = new Array(_len6), _key6 = 0; _key6 < _len6; _key6++) {\n args[_key6] = arguments[_key6];\n }\n\n return _this.handleLifecycle('onExiting', 1, args);\n };\n\n _this.handleExited = function () {\n for (var _len7 = arguments.length, args = new Array(_len7), _key7 = 0; _key7 < _len7; _key7++) {\n args[_key7] = arguments[_key7];\n }\n\n return _this.handleLifecycle('onExited', 1, args);\n };\n\n return _this;\n }\n\n var _proto = ReplaceTransition.prototype;\n\n _proto.handleLifecycle = function handleLifecycle(handler, idx, originalArgs) {\n var _child$props;\n\n var children = this.props.children;\n\n var child = _react.default.Children.toArray(children)[idx];\n\n if (child.props[handler]) (_child$props = child.props)[handler].apply(_child$props, originalArgs);\n if (this.props[handler]) this.props[handler]((0, _reactDom.findDOMNode)(this));\n };\n\n _proto.render = function render() {\n var _this$props = this.props,\n children = _this$props.children,\n inProp = _this$props.in,\n props = _objectWithoutPropertiesLoose(_this$props, [\"children\", \"in\"]);\n\n var _React$Children$toArr = _react.default.Children.toArray(children),\n first = _React$Children$toArr[0],\n second = _React$Children$toArr[1];\n\n delete props.onEnter;\n delete props.onEntering;\n delete props.onEntered;\n delete props.onExit;\n delete props.onExiting;\n delete props.onExited;\n return _react.default.createElement(_TransitionGroup.default, props, inProp ? _react.default.cloneElement(first, {\n key: 'first',\n onEnter: this.handleEnter,\n onEntering: this.handleEntering,\n onEntered: this.handleEntered\n }) : _react.default.cloneElement(second, {\n key: 'second',\n onEnter: this.handleExit,\n onEntering: this.handleExiting,\n onEntered: this.handleExited\n }));\n };\n\n return ReplaceTransition;\n}(_react.default.Component);\n\nReplaceTransition.propTypes = process.env.NODE_ENV !== \"production\" ? {\n in: _propTypes.default.bool.isRequired,\n children: function children(props, propName) {\n if (_react.default.Children.count(props[propName]) !== 2) return new Error(\"\\\"\" + propName + \"\\\" must be exactly two transition components.\");\n return null;\n }\n} : {};\nvar _default = ReplaceTransition;\nexports.default = _default;\nmodule.exports = exports[\"default\"];", - "\"use strict\";\n\nexports.__esModule = true;\nexports.default = exports.EXITING = exports.ENTERED = exports.ENTERING = exports.EXITED = exports.UNMOUNTED = void 0;\n\nvar PropTypes = _interopRequireWildcard(require(\"prop-types\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _reactDom = _interopRequireDefault(require(\"react-dom\"));\n\nvar _reactLifecyclesCompat = require(\"react-lifecycles-compat\");\n\nvar _PropTypes = require(\"./utils/PropTypes\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nfunction _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }\n\nvar UNMOUNTED = 'unmounted';\nexports.UNMOUNTED = UNMOUNTED;\nvar EXITED = 'exited';\nexports.EXITED = EXITED;\nvar ENTERING = 'entering';\nexports.ENTERING = ENTERING;\nvar ENTERED = 'entered';\nexports.ENTERED = ENTERED;\nvar EXITING = 'exiting';\n/**\n * The Transition component lets you describe a transition from one component\n * state to another _over time_ with a simple declarative API. Most commonly\n * it's used to animate the mounting and unmounting of a component, but can also\n * be used to describe in-place transition states as well.\n *\n * By default the ` + "`"))) + ((`Transition` + ("`" + ` component does not alter the behavior of the\n * component it renders, it only tracks \"enter\" and \"exit\" states for the components.\n * It's up to you to give meaning and effect to those states. For example we can\n * add styles to a component when it enters or exits:\n *\n * `)) + ("`" + ("`" + "`")))) + (((`jsx\n * import Transition from 'react-transition-group/Transition';\n *\n * const duration = 300;\n *\n * const defaultStyle = {\n * transition: ` + "`") + (`opacity ${duration}ms ease-in-out` + ("`" + `,\n * opacity: 0,\n * }\n *\n * const transitionStyles = {\n * entering: { opacity: 0 },\n * entered: { opacity: 1 },\n * };\n *\n * const Fade = ({ in: inProp }) => (\n * \n * {(state) => (\n *
\n * I'm a fade Transition!\n *
\n * )}\n *
\n * );\n * `))) + (("`" + ("`" + "`")) + (`\n *\n * As noted the ` + ("`" + `Transition`))))) + (((("`" + ` component doesn't _do_ anything by itself to its child component.\n * What it does do is track transition states over time so you can update the\n * component (such as by adding styles or classes) when it changes states.\n *\n * There are 4 main states a Transition can be in:\n * - `) + ("`" + (`'entering'` + "`"))) + ((`\n * - ` + ("`" + `'entered'`)) + ("`" + (`\n * - ` + "`")))) + (((`'exiting'` + "`") + (`\n * - ` + ("`" + `'exited'`))) + (("`" + (`\n *\n * Transition state is toggled via the ` + "`")) + (`in` + ("`" + ` prop. When `)))))) + ((((("`" + `true`) + ("`" + (` the component begins the\n * \"Enter\" stage. During this stage, the component will shift from its current transition state,\n * to ` + "`"))) + ((`'entering'` + ("`" + ` for the duration of the transition and then to the `)) + ("`" + (`'entered'` + "`")))) + (((` stage once\n * it's complete. Let's take the following example:\n *\n * ` + "`") + ("`" + ("`" + `jsx\n * state = { in: false };\n *\n * toggleEnterState = () => {\n * this.setState({ in: true });\n * }\n *\n * render() {\n * return (\n *
\n * \n * \n *
\n * );\n * }\n * `))) + (("`" + ("`" + "`")) + (`\n *\n * When the button is clicked the component will shift to the ` + ("`" + `'entering'`))))) + (((("`" + ` state and\n * stay there for 500ms (the value of `) + ("`" + (`timeout` + "`"))) + ((`) before it finally switches to ` + ("`" + `'entered'`)) + ("`" + (`.\n *\n * When ` + "`")))) + (((`in` + ("`" + ` is `)) + ("`" + (`false` + "`"))) + ((` the same thing happens except the state moves from ` + ("`" + `'exiting'`)) + ("`" + (` to ` + "`"))))))))) + ((((((((`'exited'` + "`") + (`.\n *\n * ## Timing\n *\n * Timing is often the trickiest part of animation, mistakes can result in slight delays\n * that are hard to pin down. A common example is when you want to add an exit transition,\n * you should set the desired final styles when the state is ` + ("`" + `'exiting'`))) + (("`" + (`. That's when the\n * transition to those styles will start and, if you matched the ` + "`")) + (`timeout` + ("`" + ` prop with the\n * CSS Transition duration, it will end exactly when the state changes to `)))) + ((("`" + `'exited'`) + ("`" + (`.\n *\n * > **Note**: For simpler transitions the ` + "`"))) + ((`Transition` + ("`" + ` component might be enough, but\n * > take into account that it's platform-agnostic, while the `)) + ("`" + (`CSSTransition` + "`"))))) + ((((` component\n * > [forces reflows](https://github.com/reactjs/react-transition-group/blob/5007303e729a74be66a21c3e2205e4916821524b/src/CSSTransition.js#L208-L215)\n * > in order to make more complex transitions more predictable. For example, even though\n * > classes ` + "`") + (`example-enter` + ("`" + ` and `))) + (("`" + (`example-enter-active` + "`")) + (` are applied immediately one after\n * > another, you can still transition from one to the other because of the forced reflow\n * > (read [this issue](https://github.com/reactjs/react-transition-group/issues/159#issuecomment-322761171)\n * > for more info). Take this into account when choosing between ` + ("`" + `Transition`)))) + ((("`" + ` and\n * > `) + ("`" + (`CSSTransition` + "`"))) + ((`.\n */\n\nexports.EXITING = EXITING;\n\nvar Transition =\n/*#__PURE__*/\nfunction (_React$Component) {\n _inheritsLoose(Transition, _React$Component);\n\n function Transition(props, context) {\n var _this;\n\n _this = _React$Component.call(this, props, context) || this;\n var parentGroup = context.transitionGroup; // In the context of a TransitionGroup all enters are really appears\n\n var appear = parentGroup && !parentGroup.isMounting ? props.enter : props.appear;\n var initialStatus;\n _this.appearStatus = null;\n\n if (props.in) {\n if (appear) {\n initialStatus = EXITED;\n _this.appearStatus = ENTERING;\n } else {\n initialStatus = ENTERED;\n }\n } else {\n if (props.unmountOnExit || props.mountOnEnter) {\n initialStatus = UNMOUNTED;\n } else {\n initialStatus = EXITED;\n }\n }\n\n _this.state = {\n status: initialStatus\n };\n _this.nextCallback = null;\n return _this;\n }\n\n var _proto = Transition.prototype;\n\n _proto.getChildContext = function getChildContext() {\n return {\n transitionGroup: null // allows for nested Transitions\n\n };\n };\n\n Transition.getDerivedStateFromProps = function getDerivedStateFromProps(_ref, prevState) {\n var nextIn = _ref.in;\n\n if (nextIn && prevState.status === UNMOUNTED) {\n return {\n status: EXITED\n };\n }\n\n return null;\n }; // getSnapshotBeforeUpdate(prevProps) {\n // let nextStatus = null\n // if (prevProps !== this.props) {\n // const { status } = this.state\n // if (this.props.in) {\n // if (status !== ENTERING && status !== ENTERED) {\n // nextStatus = ENTERING\n // }\n // } else {\n // if (status === ENTERING || status === ENTERED) {\n // nextStatus = EXITING\n // }\n // }\n // }\n // return { nextStatus }\n // }\n\n\n _proto.componentDidMount = function componentDidMount() {\n this.updateStatus(true, this.appearStatus);\n };\n\n _proto.componentDidUpdate = function componentDidUpdate(prevProps) {\n var nextStatus = null;\n\n if (prevProps !== this.props) {\n var status = this.state.status;\n\n if (this.props.in) {\n if (status !== ENTERING && status !== ENTERED) {\n nextStatus = ENTERING;\n }\n } else {\n if (status === ENTERING || status === ENTERED) {\n nextStatus = EXITING;\n }\n }\n }\n\n this.updateStatus(false, nextStatus);\n };\n\n _proto.componentWillUnmount = function componentWillUnmount() {\n this.cancelNextCallback();\n };\n\n _proto.getTimeouts = function getTimeouts() {\n var timeout = this.props.timeout;\n var exit, enter, appear;\n exit = enter = appear = timeout;\n\n if (timeout != null && typeof timeout !== 'number') {\n exit = timeout.exit;\n enter = timeout.enter; // TODO: remove fallback for next major\n\n appear = timeout.appear !== undefined ? timeout.appear : enter;\n }\n\n return {\n exit: exit,\n enter: enter,\n appear: appear\n };\n };\n\n _proto.updateStatus = function updateStatus(mounting, nextStatus) {\n if (mounting === void 0) {\n mounting = false;\n }\n\n if (nextStatus !== null) {\n // nextStatus will always be ENTERING or EXITING.\n this.cancelNextCallback();\n\n var node = _reactDom.default.findDOMNode(this);\n\n if (nextStatus === ENTERING) {\n this.performEnter(node, mounting);\n } else {\n this.performExit(node);\n }\n } else if (this.props.unmountOnExit && this.state.status === EXITED) {\n this.setState({\n status: UNMOUNTED\n });\n }\n };\n\n _proto.performEnter = function performEnter(node, mounting) {\n var _this2 = this;\n\n var enter = this.props.enter;\n var appearing = this.context.transitionGroup ? this.context.transitionGroup.isMounting : mounting;\n var timeouts = this.getTimeouts();\n var enterTimeout = appearing ? timeouts.appear : timeouts.enter; // no enter animation skip right to ENTERED\n // if we are mounting and running this it means appear _must_ be set\n\n if (!mounting && !enter) {\n this.safeSetState({\n status: ENTERED\n }, function () {\n _this2.props.onEntered(node);\n });\n return;\n }\n\n this.props.onEnter(node, appearing);\n this.safeSetState({\n status: ENTERING\n }, function () {\n _this2.props.onEntering(node, appearing);\n\n _this2.onTransitionEnd(node, enterTimeout, function () {\n _this2.safeSetState({\n status: ENTERED\n }, function () {\n _this2.props.onEntered(node, appearing);\n });\n });\n });\n };\n\n _proto.performExit = function performExit(node) {\n var _this3 = this;\n\n var exit = this.props.exit;\n var timeouts = this.getTimeouts(); // no exit animation skip right to EXITED\n\n if (!exit) {\n this.safeSetState({\n status: EXITED\n }, function () {\n _this3.props.onExited(node);\n });\n return;\n }\n\n this.props.onExit(node);\n this.safeSetState({\n status: EXITING\n }, function () {\n _this3.props.onExiting(node);\n\n _this3.onTransitionEnd(node, timeouts.exit, function () {\n _this3.safeSetState({\n status: EXITED\n }, function () {\n _this3.props.onExited(node);\n });\n });\n });\n };\n\n _proto.cancelNextCallback = function cancelNextCallback() {\n if (this.nextCallback !== null) {\n this.nextCallback.cancel();\n this.nextCallback = null;\n }\n };\n\n _proto.safeSetState = function safeSetState(nextState, callback) {\n // This shouldn't be necessary, but there are weird race conditions with\n // setState callbacks and unmounting in testing, so always make sure that\n // we can cancel any pending setState callbacks after we unmount.\n callback = this.setNextCallback(callback);\n this.setState(nextState, callback);\n };\n\n _proto.setNextCallback = function setNextCallback(callback) {\n var _this4 = this;\n\n var active = true;\n\n this.nextCallback = function (event) {\n if (active) {\n active = false;\n _this4.nextCallback = null;\n callback(event);\n }\n };\n\n this.nextCallback.cancel = function () {\n active = false;\n };\n\n return this.nextCallback;\n };\n\n _proto.onTransitionEnd = function onTransitionEnd(node, timeout, handler) {\n this.setNextCallback(handler);\n var doesNotHaveTimeoutOrListener = timeout == null && !this.props.addEndListener;\n\n if (!node || doesNotHaveTimeoutOrListener) {\n setTimeout(this.nextCallback, 0);\n return;\n }\n\n if (this.props.addEndListener) {\n this.props.addEndListener(node, this.nextCallback);\n }\n\n if (timeout != null) {\n setTimeout(this.nextCallback, timeout);\n }\n };\n\n _proto.render = function render() {\n var status = this.state.status;\n\n if (status === UNMOUNTED) {\n return null;\n }\n\n var _this$props = this.props,\n children = _this$props.children,\n childProps = _objectWithoutPropertiesLoose(_this$props, [\"children\"]); // filter props for Transtition\n\n\n delete childProps.in;\n delete childProps.mountOnEnter;\n delete childProps.unmountOnExit;\n delete childProps.appear;\n delete childProps.enter;\n delete childProps.exit;\n delete childProps.timeout;\n delete childProps.addEndListener;\n delete childProps.onEnter;\n delete childProps.onEntering;\n delete childProps.onEntered;\n delete childProps.onExit;\n delete childProps.onExiting;\n delete childProps.onExited;\n\n if (typeof children === 'function') {\n return children(status, childProps);\n }\n\n var child = _react.default.Children.only(children);\n\n return _react.default.cloneElement(child, childProps);\n };\n\n return Transition;\n}(_react.default.Component);\n\nTransition.contextTypes = {\n transitionGroup: PropTypes.object\n};\nTransition.childContextTypes = {\n transitionGroup: function transitionGroup() {}\n};\nTransition.propTypes = process.env.NODE_ENV !== \"production\" ? {\n /**\n * A ` + ("`" + `function`)) + ("`" + (` child can be used instead of a React element.\n * This function is called with the current transition status\n * ('entering', 'entered', 'exiting', 'exited', 'unmounted'), which can be used\n * to apply context specific props to a component.\n *\n * ` + "`")))))) + ((((("`" + "`") + (`jsx\n * \n * {(status) => (\n * \n * )}\n * \n * ` + "`")) + ("`" + ("`" + `\n */\n children: PropTypes.oneOfType([PropTypes.func.isRequired, PropTypes.element.isRequired]).isRequired,\n\n /**\n * Show the component; triggers the enter or exit states\n */\n in: PropTypes.bool,\n\n /**\n * By default the child component is mounted immediately along with\n * the parent `)))) + ((("`" + `Transition`) + ("`" + (` component. If you want to \"lazy mount\" the component on the\n * first ` + "`"))) + ((`in={true}` + ("`" + ` you can set `)) + ("`" + (`mountOnEnter` + "`"))))) + ((((`. After the first enter transition the component will stay\n * mounted, even on \"exited\", unless you also specify ` + "`") + (`unmountOnExit` + ("`" + `.\n */\n mountOnEnter: PropTypes.bool,\n\n /**\n * By default the child component stays mounted after it reaches the `))) + (("`" + (`'exited'` + "`")) + (` state.\n * Set ` + ("`" + `unmountOnExit`)))) + ((("`" + ` if you'd prefer to unmount the component after it finishes exiting.\n */\n unmountOnExit: PropTypes.bool,\n\n /**\n * Normally a component is not transitioned if it is shown when the `) + ("`" + (`` + "`"))) + ((` component mounts.\n * If you want to transition on the first mount set ` + ("`" + `appear`)) + ("`" + (` to ` + "`"))))))) + ((((((`true` + "`") + (`, and the\n * component will transition in as soon as the ` + ("`" + ``))) + (("`" + (` mounts.\n *\n * > Note: there are no specific \"appear\" states. ` + "`")) + (`appear` + ("`" + ` only adds an additional `)))) + ((("`" + `enter`) + ("`" + (` transition.\n */\n appear: PropTypes.bool,\n\n /**\n * Enable or disable enter transitions.\n */\n enter: PropTypes.bool,\n\n /**\n * Enable or disable exit transitions.\n */\n exit: PropTypes.bool,\n\n /**\n * The duration of the transition, in milliseconds.\n * Required unless ` + "`"))) + ((`addEndListener` + ("`" + ` is provided\n *\n * You may specify a single timeout for all transitions like: `)) + ("`" + (`timeout={500}` + "`"))))) + ((((`,\n * or individually like:\n *\n * ` + "`") + ("`" + ("`" + `jsx\n * timeout={{\n * enter: 300,\n * exit: 500,\n * appear: 500,\n * }}\n * `))) + (("`" + ("`" + "`")) + (`\n *\n * If the value of ` + ("`" + `appear`)))) + ((("`" + ` is not set, then the value from enter is taken.\n *\n * If the `) + ("`" + (`enter` + "`"))) + ((` or ` + ("`" + `exit`)) + ("`" + (` value is ` + "`")))))) + (((((`null` + "`") + (` or ` + ("`" + `undefined`))) + (("`" + (`, then the timer is set to ` + "`")) + (`0` + ("`" + `\n *\n * @type {number | { enter?: number, exit?: number, appear?: number }}\n */\n timeout: function timeout(props) {\n var pt = process.env.NODE_ENV !== \"production\" ? _PropTypes.timeoutsShape : {};;\n if (!props.addEndListener) pt = pt.isRequired;\n\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n return pt.apply(void 0, [props].concat(args));\n },\n\n /**\n * Add a custom transition end trigger. Called with the transitioning\n * DOM node and a `)))) + ((("`" + `done`) + ("`" + (` callback. Allows for more fine grained transition end\n * logic. **Note:** Timeouts are still used as a fallback if provided.\n *\n * ` + "`"))) + (("`" + ("`" + `jsx\n * addEndListener={(node, done) => {\n * // use the css transitionend event to mark the finish of a transition\n * node.addEventListener('transitionend', done, false);\n * }}\n * `)) + ("`" + ("`" + "`"))))) + ((((`\n */\n addEndListener: PropTypes.func,\n\n /**\n * Callback fired before the \"entering\" status is applied. An extra parameter\n * ` + "`") + (`isAppearing` + ("`" + ` is supplied to indicate if the enter stage is occurring on the initial mount\n *\n * @type Function(node: HtmlElement, isAppearing: bool) -> void\n */\n onEnter: PropTypes.func,\n\n /**\n * Callback fired after the \"entering\" status is applied. An extra parameter\n * `))) + (("`" + (`isAppearing` + "`")) + (` is supplied to indicate if the enter stage is occurring on the initial mount\n *\n * @type Function(node: HtmlElement, isAppearing: bool)\n */\n onEntering: PropTypes.func,\n\n /**\n * Callback fired after the \"entered\" status is applied. An extra parameter\n * ` + ("`" + `isAppearing`)))) + ((("`" + (` is supplied to indicate if the enter stage is occurring on the initial mount\n *\n * @type Function(node: HtmlElement, isAppearing: bool) -> void\n */\n onEntered: PropTypes.func,\n\n /**\n * Callback fired before the \"exiting\" status is applied.\n *\n * @type Function(node: HtmlElement) -> void\n */\n onExit: PropTypes.func,\n\n /**\n * Callback fired after the \"exiting\" status is applied.\n *\n * @type Function(node: HtmlElement) -> void\n */\n onExiting: PropTypes.func,\n\n /**\n * Callback fired after the \"exited\" status is applied.\n *\n * @type Function(node: HtmlElement) -> void\n */\n onExited: PropTypes.func // Name the function so it is clearer in the documentation\n\n} : {};\n\nfunction noop() {}\n\nTransition.defaultProps = {\n in: false,\n mountOnEnter: false,\n unmountOnExit: false,\n appear: false,\n enter: true,\n exit: true,\n onEnter: noop,\n onEntering: noop,\n onEntered: noop,\n onExit: noop,\n onExiting: noop,\n onExited: noop\n};\nTransition.UNMOUNTED = 0;\nTransition.EXITED = 1;\nTransition.ENTERING = 2;\nTransition.ENTERED = 3;\nTransition.EXITING = 4;\n\nvar _default = (0, _reactLifecyclesCompat.polyfill)(Transition);\n\nexports.default = _default;", - "\"use strict\";\n\nexports.__esModule = true;\nexports.default = void 0;\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _reactLifecyclesCompat = require(\"react-lifecycles-compat\");\n\nvar _ChildMapping = require(\"./utils/ChildMapping\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nvar values = Object.values || function (obj) {\n return Object.keys(obj).map(function (k) {\n return obj[k];\n });\n};\n\nvar defaultProps = {\n component: 'div',\n childFactory: function childFactory(child) {\n return child;\n }\n /**\n * The ` + "`")) + (`` + ("`" + ` component manages a set of transition components\n * (`))) + (("`" + (`` + "`")) + (` and ` + ("`" + ``)))))))) + ((((((("`" + `) in a list. Like with the transition\n * components, `) + ("`" + (`` + "`"))) + ((` is a state machine for managing the mounting\n * and unmounting of components over time.\n *\n * Consider the example below. As items are removed or added to the TodoList the\n * ` + ("`" + `in`)) + ("`" + (` prop is toggled automatically by the ` + "`")))) + (((`` + "`") + (`.\n *\n * Note that ` + ("`" + ``))) + (("`" + (` does not define any animation behavior!\n * Exactly _how_ a list item animates is up to the individual transition\n * component. This means you can mix and match animations across different list\n * items.\n */\n\n};\n\nvar TransitionGroup =\n/*#__PURE__*/\nfunction (_React$Component) {\n _inheritsLoose(TransitionGroup, _React$Component);\n\n function TransitionGroup(props, context) {\n var _this;\n\n _this = _React$Component.call(this, props, context) || this;\n\n var handleExited = _this.handleExited.bind(_assertThisInitialized(_assertThisInitialized(_this))); // Initial children should all be entering, dependent on appear\n\n\n _this.state = {\n handleExited: handleExited,\n firstRender: true\n };\n return _this;\n }\n\n var _proto = TransitionGroup.prototype;\n\n _proto.getChildContext = function getChildContext() {\n return {\n transitionGroup: {\n isMounting: !this.appeared\n }\n };\n };\n\n _proto.componentDidMount = function componentDidMount() {\n this.appeared = true;\n this.mounted = true;\n };\n\n _proto.componentWillUnmount = function componentWillUnmount() {\n this.mounted = false;\n };\n\n TransitionGroup.getDerivedStateFromProps = function getDerivedStateFromProps(nextProps, _ref) {\n var prevChildMapping = _ref.children,\n handleExited = _ref.handleExited,\n firstRender = _ref.firstRender;\n return {\n children: firstRender ? (0, _ChildMapping.getInitialChildMapping)(nextProps, handleExited) : (0, _ChildMapping.getNextChildMapping)(nextProps, prevChildMapping, handleExited),\n firstRender: false\n };\n };\n\n _proto.handleExited = function handleExited(child, node) {\n var currentChildMapping = (0, _ChildMapping.getChildMapping)(this.props.children);\n if (child.key in currentChildMapping) return;\n\n if (child.props.onExited) {\n child.props.onExited(node);\n }\n\n if (this.mounted) {\n this.setState(function (state) {\n var children = _extends({}, state.children);\n\n delete children[child.key];\n return {\n children: children\n };\n });\n }\n };\n\n _proto.render = function render() {\n var _this$props = this.props,\n Component = _this$props.component,\n childFactory = _this$props.childFactory,\n props = _objectWithoutPropertiesLoose(_this$props, [\"component\", \"childFactory\"]);\n\n var children = values(this.state.children).map(childFactory);\n delete props.appear;\n delete props.enter;\n delete props.exit;\n\n if (Component === null) {\n return children;\n }\n\n return _react.default.createElement(Component, props, children);\n };\n\n return TransitionGroup;\n}(_react.default.Component);\n\nTransitionGroup.childContextTypes = {\n transitionGroup: _propTypes.default.object.isRequired\n};\nTransitionGroup.propTypes = process.env.NODE_ENV !== \"production\" ? {\n /**\n * ` + "`")) + (`` + ("`" + ` renders a `))))) + (((("`" + `
`) + ("`" + (` by default. You can change this\n * behavior by providing a ` + "`"))) + ((`component` + ("`" + ` prop.\n * If you use React v16+ and would like to avoid a wrapping `)) + ("`" + (`
` + "`")))) + (((` element\n * you can pass in ` + "`") + (`component={null}` + ("`" + `. This is useful if the wrapping div\n * borks your css styles.\n */\n component: _propTypes.default.any,\n\n /**\n * A set of `))) + (("`" + (`` + "`")) + (` components, that are toggled ` + ("`" + `in`)))))) + ((((("`" + ` and out as they\n * leave. the `) + ("`" + (`` + "`"))) + ((` will inject specific transition props, so\n * remember to spread them through if you are wrapping the ` + ("`" + ``)) + ("`" + (` as\n * with our ` + "`")))) + (((`` + "`") + (` example.\n *\n * While this component is meant to make it easier to animate multiple\n * ` + ("`" + `Transition`))) + (("`" + (` or ` + "`")) + (`CSSTransition` + ("`" + ` children, sometimes you want to transition a\n * single child by changing its content, e.g. routes, slides, images in a\n * carousel etc. In that case you can change the `))))) + (((("`" + `key`) + ("`" + (` prop of the child\n * component along with its content, that way ` + "`"))) + ((`TransitionGroup` + ("`" + ` will know that\n * it should transition the child.\n */\n children: _propTypes.default.node,\n\n /**\n * A convenience prop that enables or disables appear animations\n * for all children. Note that specifying this will override any defaults set\n * on individual children Transitions.\n */\n appear: _propTypes.default.bool,\n\n /**\n * A convenience prop that enables or disables enter animations\n * for all children. Note that specifying this will override any defaults set\n * on individual children Transitions.\n */\n enter: _propTypes.default.bool,\n\n /**\n * A convenience prop that enables or disables exit animations\n * for all children. Note that specifying this will override any defaults set\n * on individual children Transitions.\n */\n exit: _propTypes.default.bool,\n\n /**\n * You may need to apply reactive updates to a child as it is exiting.\n * This is generally done by using `)) + ("`" + (`cloneElement` + "`")))) + (((` however in the case of an exiting\n * child the element has already been removed and not accessible to the consumer.\n *\n * If you do need to update a child as it leaves you can provide a ` + ("`" + `childFactory`)) + ("`" + (`\n * to wrap every child, even the ones that are leaving.\n *\n * @type Function(child: ReactElement) -> ReactElement\n */\n childFactory: _propTypes.default.func\n} : {};\nTransitionGroup.defaultProps = defaultProps;\n\nvar _default = (0, _reactLifecyclesCompat.polyfill)(TransitionGroup);\n\nexports.default = _default;\nmodule.exports = exports[\"default\"];", + "\"use strict\";\n\nexports.__esModule = true;\nexports.default = void 0;\n\nvar PropTypes = _interopRequireWildcard(require(\"prop-types\"));\n\nvar _addClass = _interopRequireDefault(require(\"dom-helpers/class/addClass\"));\n\nvar _removeClass = _interopRequireDefault(require(\"dom-helpers/class/removeClass\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _Transition = _interopRequireDefault(require(\"./Transition\"));\n\nvar _PropTypes = require(\"./utils/PropTypes\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }\n\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }\n\nvar addClass = function addClass(node, classes) {\n return node && classes && classes.split(' ').forEach(function (c) {\n return (0, _addClass.default)(node, c);\n });\n};\n\nvar removeClass = function removeClass(node, classes) {\n return node && classes && classes.split(' ').forEach(function (c) {\n return (0, _removeClass.default)(node, c);\n });\n};\n/**\n * A transition component inspired by the excellent\n * [ng-animate](http://www.nganimate.org/) library, you should use it if you're\n * using CSS transitions or animations. It's built upon the\n * [`))) + (("`" + (`Transition` + "`")) + (`](https://reactcommunity.org/react-transition-group/transition)\n * component, so it inherits all of its props.\n *\n * ` + ("`" + `CSSTransition`)))) + ((("`" + (` applies a pair of class names during the ` + "`")) + (`appear` + ("`" + `, `))) + (("`" + (`enter` + "`")) + ((`,\n * and ` + "`") + (`exit` + "`"))))) + ((((` states of the transition. The first class is applied and then a\n * second ` + ("`" + `*-active`)) + ("`" + (` class in order to activate the CSSS transition. After the\n * transition, matching ` + "`"))) + ((`*-done` + ("`" + ` class names are applied to persist the\n * transition state.\n *\n * `)) + ("`" + ("`" + "`")))) + (((`jsx\n * function App() {\n * const [inProp, setInProp] = useState(false);\n * return (\n *
\n * \n *
\n * {\"I'll receive my-node-* classes\"}\n *
\n *
\n * \n *
\n * );\n * }\n * ` + ("`" + "`")) + ("`" + (`\n *\n * When the ` + "`"))) + ((`in` + ("`" + ` prop is set to `)) + (("`" + `true`) + ("`" + `, the child component will first receive\n * the class `)))))) + ((((("`" + (`example-enter` + "`")) + (`, then the ` + ("`" + `example-enter-active`))) + (("`" + (` will be added in\n * the next tick. ` + "`")) + (`CSSTransition` + ("`" + ` [forces a\n * reflow](https://github.com/reactjs/react-transition-group/blob/5007303e729a74be66a21c3e2205e4916821524b/src/CSSTransition.js#L208-L215)\n * between before adding the `)))) + ((("`" + (`example-enter-active` + "`")) + (`. This is an important trick\n * because it allows us to transition between ` + ("`" + `example-enter`))) + (("`" + (` and\n * ` + "`")) + ((`example-enter-active` + "`") + (` even though they were added immediately one after\n * another. Most notably, this is what makes it possible for us to animate\n * _appearance_.\n *\n * ` + "`"))))) + (((("`" + ("`" + `css\n * .my-node-enter {\n * opacity: 0;\n * }\n * .my-node-enter-active {\n * opacity: 1;\n * transition: opacity 200ms;\n * }\n * .my-node-exit {\n * opacity: 1;\n * }\n * .my-node-exit-active {\n * opacity: 0;\n * transition: opacity: 200ms;\n * }\n * `)) + ("`" + ("`" + "`"))) + ((`\n *\n * ` + ("`" + `*-active`)) + ("`" + (` classes represent which styles you want to animate **to**.\n */\n\n\nvar CSSTransition =\n/*#__PURE__*/\nfunction (_React$Component) {\n _inheritsLoose(CSSTransition, _React$Component);\n\n function CSSTransition() {\n var _this;\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n _this = _React$Component.call.apply(_React$Component, [this].concat(args)) || this;\n\n _this.onEnter = function (node, appearing) {\n var _this$getClassNames = _this.getClassNames(appearing ? 'appear' : 'enter'),\n className = _this$getClassNames.className;\n\n _this.removeClasses(node, 'exit');\n\n addClass(node, className);\n\n if (_this.props.onEnter) {\n _this.props.onEnter(node, appearing);\n }\n };\n\n _this.onEntering = function (node, appearing) {\n var _this$getClassNames2 = _this.getClassNames(appearing ? 'appear' : 'enter'),\n activeClassName = _this$getClassNames2.activeClassName;\n\n _this.reflowAndAddClass(node, activeClassName);\n\n if (_this.props.onEntering) {\n _this.props.onEntering(node, appearing);\n }\n };\n\n _this.onEntered = function (node, appearing) {\n var appearClassName = _this.getClassNames('appear').doneClassName;\n\n var enterClassName = _this.getClassNames('enter').doneClassName;\n\n var doneClassName = appearing ? appearClassName + \" \" + enterClassName : enterClassName;\n\n _this.removeClasses(node, appearing ? 'appear' : 'enter');\n\n addClass(node, doneClassName);\n\n if (_this.props.onEntered) {\n _this.props.onEntered(node, appearing);\n }\n };\n\n _this.onExit = function (node) {\n var _this$getClassNames3 = _this.getClassNames('exit'),\n className = _this$getClassNames3.className;\n\n _this.removeClasses(node, 'appear');\n\n _this.removeClasses(node, 'enter');\n\n addClass(node, className);\n\n if (_this.props.onExit) {\n _this.props.onExit(node);\n }\n };\n\n _this.onExiting = function (node) {\n var _this$getClassNames4 = _this.getClassNames('exit'),\n activeClassName = _this$getClassNames4.activeClassName;\n\n _this.reflowAndAddClass(node, activeClassName);\n\n if (_this.props.onExiting) {\n _this.props.onExiting(node);\n }\n };\n\n _this.onExited = function (node) {\n var _this$getClassNames5 = _this.getClassNames('exit'),\n doneClassName = _this$getClassNames5.doneClassName;\n\n _this.removeClasses(node, 'exit');\n\n addClass(node, doneClassName);\n\n if (_this.props.onExited) {\n _this.props.onExited(node);\n }\n };\n\n _this.getClassNames = function (type) {\n var classNames = _this.props.classNames;\n var isStringClassNames = typeof classNames === 'string';\n var prefix = isStringClassNames && classNames ? classNames + '-' : '';\n var className = isStringClassNames ? prefix + type : classNames[type];\n var activeClassName = isStringClassNames ? className + '-active' : classNames[type + 'Active'];\n var doneClassName = isStringClassNames ? className + '-done' : classNames[type + 'Done'];\n return {\n className: className,\n activeClassName: activeClassName,\n doneClassName: doneClassName\n };\n };\n\n return _this;\n }\n\n var _proto = CSSTransition.prototype;\n\n _proto.removeClasses = function removeClasses(node, type) {\n var _this$getClassNames6 = this.getClassNames(type),\n className = _this$getClassNames6.className,\n activeClassName = _this$getClassNames6.activeClassName,\n doneClassName = _this$getClassNames6.doneClassName;\n\n className && removeClass(node, className);\n activeClassName && removeClass(node, activeClassName);\n doneClassName && removeClass(node, doneClassName);\n };\n\n _proto.reflowAndAddClass = function reflowAndAddClass(node, className) {\n // This is for to force a repaint,\n // which is necessary in order to transition styles when adding a class name.\n if (className) {\n /* eslint-disable no-unused-expressions */\n node && node.scrollTop;\n /* eslint-enable no-unused-expressions */\n\n addClass(node, className);\n }\n };\n\n _proto.render = function render() {\n var props = _extends({}, this.props);\n\n delete props.classNames;\n return _react.default.createElement(_Transition.default, _extends({}, props, {\n onEnter: this.onEnter,\n onEntered: this.onEntered,\n onEntering: this.onEntering,\n onExit: this.onExit,\n onExiting: this.onExiting,\n onExited: this.onExited\n }));\n };\n\n return CSSTransition;\n}(_react.default.Component);\n\nCSSTransition.defaultProps = {\n classNames: ''\n};\nCSSTransition.propTypes = process.env.NODE_ENV !== \"production\" ? _extends({}, _Transition.default.propTypes, {\n /**\n * The animation classNames applied to the component as it enters, exits or\n * has finished the transition. A single name can be provided and it will be\n * suffixed for each stage: e.g.\n *\n * ` + "`")))) + (((`classNames=\"fade\"` + ("`" + ` applies `)) + ("`" + (`fade-enter` + "`"))) + ((`, ` + ("`" + `fade-enter-active`)) + (("`" + `,\n * `) + ("`" + `fade-enter-done`)))))))))) + ((((((((("`" + (`, ` + "`")) + (`fade-exit` + ("`" + `, `))) + (("`" + (`fade-exit-active` + "`")) + (`, ` + ("`" + `fade-exit-done`)))) + ((("`" + (`,\n * ` + "`")) + (`fade-appear` + ("`" + `, `))) + (("`" + (`fade-appear-active` + "`")) + (`, and ` + ("`" + `fade-appear-done`))))) + (((("`" + (`.\n *\n * **Note**: ` + "`")) + (`fade-appear-done` + ("`" + ` and `))) + (("`" + (`fade-enter-done` + "`")) + (` will _both_ be applied.\n * This allows you to define different behavior for when appearing is done and\n * when regular entering is done, using selectors like\n * ` + ("`" + `.fade-enter-done:not(.fade-appear-done)`)))) + ((("`" + (`. For example, you could apply an\n * epic entrance animation when element first appears in the DOM using\n * [Animate.css](https://daneden.github.io/animate.css/). Otherwise you can\n * simply use ` + "`")) + (`fade-enter-done` + ("`" + ` for defining both cases.\n *\n * Each individual classNames can also be specified independently like:\n *\n * `))) + (("`" + ("`" + "`")) + ((`js\n * classNames={{\n * appear: 'my-appear',\n * appearActive: 'my-active-appear',\n * appearDone: 'my-done-appear',\n * enter: 'my-enter',\n * enterActive: 'my-active-enter',\n * enterDone: 'my-done-enter',\n * exit: 'my-exit',\n * exitActive: 'my-active-exit',\n * exitDone: 'my-done-exit',\n * }}\n * ` + "`") + ("`" + "`")))))) + (((((`\n *\n * If you want to set these classes using CSS Modules:\n *\n * ` + ("`" + "`")) + ("`" + (`js\n * import styles from './styles.css';\n * ` + "`"))) + (("`" + ("`" + `\n *\n * you might want to use camelCase in your CSS file, that way could simply\n * spread them instead of listing them one by one:\n *\n * `)) + ("`" + ("`" + "`")))) + (((`js\n * classNames={{ ...styles }}\n * ` + ("`" + "`")) + ("`" + (`\n *\n * @type {string | {\n * appear?: string,\n * appearActive?: string,\n * appearDone?: string,\n * enter?: string,\n * enterActive?: string,\n * enterDone?: string,\n * exit?: string,\n * exitActive?: string,\n * exitDone?: string,\n * }}\n */\n classNames: _PropTypes.classNamesShape,\n\n /**\n * A ` + "`"))) + ((`` + ("`" + ` callback fired immediately after the 'enter' or 'appear' class is\n * applied.\n *\n * @type Function(node: HtmlElement, isAppearing: bool)\n */\n onEnter: PropTypes.func,\n\n /**\n * A `)) + (("`" + ``) + ("`" + ` callback fired immediately after the 'enter-active' or\n * 'appear-active' class is applied.\n *\n * @type Function(node: HtmlElement, isAppearing: bool)\n */\n onEntering: PropTypes.func,\n\n /**\n * A `))))) + (((("`" + (`` + "`")) + (` callback fired immediately after the 'enter' or\n * 'appear' classes are **removed** and the ` + ("`" + `done`))) + (("`" + (` class is added to the DOM node.\n *\n * @type Function(node: HtmlElement, isAppearing: bool)\n */\n onEntered: PropTypes.func,\n\n /**\n * A ` + "`")) + (`` + ("`" + ` callback fired immediately after the 'exit' class is\n * applied.\n *\n * @type Function(node: HtmlElement)\n */\n onExit: PropTypes.func,\n\n /**\n * A `)))) + ((("`" + (`` + "`")) + (` callback fired immediately after the 'exit-active' is applied.\n *\n * @type Function(node: HtmlElement)\n */\n onExiting: PropTypes.func,\n\n /**\n * A ` + ("`" + ``))) + (("`" + (` callback fired immediately after the 'exit' classes\n * are **removed** and the ` + "`")) + ((`exit-done` + "`") + (` class is added to the DOM node.\n *\n * @type Function(node: HtmlElement)\n */\n onExited: PropTypes.func\n}) : {};\nvar _default = CSSTransition;\nexports.default = _default;\nmodule.exports = exports[\"default\"];", + "\"use strict\";\n\nexports.__esModule = true;\nexports.default = void 0;\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _reactDom = require(\"react-dom\");\n\nvar _TransitionGroup = _interopRequireDefault(require(\"./TransitionGroup\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nfunction _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }\n\n/**\n * The ` + "`"))))))) + ((((((`` + ("`" + ` component is a specialized `)) + ("`" + (`Transition` + "`"))) + ((` component\n * that animates between two children.\n *\n * ` + ("`" + "`")) + ("`" + (`jsx\n * \n *
I appear first
\n *
I replace the above
\n *
\n * ` + "`")))) + ((("`" + ("`" + `\n */\nvar ReplaceTransition =\n/*#__PURE__*/\nfunction (_React$Component) {\n _inheritsLoose(ReplaceTransition, _React$Component);\n\n function ReplaceTransition() {\n var _this;\n\n for (var _len = arguments.length, _args = new Array(_len), _key = 0; _key < _len; _key++) {\n _args[_key] = arguments[_key];\n }\n\n _this = _React$Component.call.apply(_React$Component, [this].concat(_args)) || this;\n\n _this.handleEnter = function () {\n for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n\n return _this.handleLifecycle('onEnter', 0, args);\n };\n\n _this.handleEntering = function () {\n for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n args[_key3] = arguments[_key3];\n }\n\n return _this.handleLifecycle('onEntering', 0, args);\n };\n\n _this.handleEntered = function () {\n for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {\n args[_key4] = arguments[_key4];\n }\n\n return _this.handleLifecycle('onEntered', 0, args);\n };\n\n _this.handleExit = function () {\n for (var _len5 = arguments.length, args = new Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {\n args[_key5] = arguments[_key5];\n }\n\n return _this.handleLifecycle('onExit', 1, args);\n };\n\n _this.handleExiting = function () {\n for (var _len6 = arguments.length, args = new Array(_len6), _key6 = 0; _key6 < _len6; _key6++) {\n args[_key6] = arguments[_key6];\n }\n\n return _this.handleLifecycle('onExiting', 1, args);\n };\n\n _this.handleExited = function () {\n for (var _len7 = arguments.length, args = new Array(_len7), _key7 = 0; _key7 < _len7; _key7++) {\n args[_key7] = arguments[_key7];\n }\n\n return _this.handleLifecycle('onExited', 1, args);\n };\n\n return _this;\n }\n\n var _proto = ReplaceTransition.prototype;\n\n _proto.handleLifecycle = function handleLifecycle(handler, idx, originalArgs) {\n var _child$props;\n\n var children = this.props.children;\n\n var child = _react.default.Children.toArray(children)[idx];\n\n if (child.props[handler]) (_child$props = child.props)[handler].apply(_child$props, originalArgs);\n if (this.props[handler]) this.props[handler]((0, _reactDom.findDOMNode)(this));\n };\n\n _proto.render = function render() {\n var _this$props = this.props,\n children = _this$props.children,\n inProp = _this$props.in,\n props = _objectWithoutPropertiesLoose(_this$props, [\"children\", \"in\"]);\n\n var _React$Children$toArr = _react.default.Children.toArray(children),\n first = _React$Children$toArr[0],\n second = _React$Children$toArr[1];\n\n delete props.onEnter;\n delete props.onEntering;\n delete props.onEntered;\n delete props.onExit;\n delete props.onExiting;\n delete props.onExited;\n return _react.default.createElement(_TransitionGroup.default, props, inProp ? _react.default.cloneElement(first, {\n key: 'first',\n onEnter: this.handleEnter,\n onEntering: this.handleEntering,\n onEntered: this.handleEntered\n }) : _react.default.cloneElement(second, {\n key: 'second',\n onEnter: this.handleExit,\n onEntering: this.handleExiting,\n onEntered: this.handleExited\n }));\n };\n\n return ReplaceTransition;\n}(_react.default.Component);\n\nReplaceTransition.propTypes = process.env.NODE_ENV !== \"production\" ? {\n in: _propTypes.default.bool.isRequired,\n children: function children(props, propName) {\n if (_react.default.Children.count(props[propName]) !== 2) return new Error(\"\\\"\" + propName + \"\\\" must be exactly two transition components.\");\n return null;\n }\n} : {};\nvar _default = ReplaceTransition;\nexports.default = _default;\nmodule.exports = exports[\"default\"];", + "\"use strict\";\n\nexports.__esModule = true;\nexports.default = exports.EXITING = exports.ENTERED = exports.ENTERING = exports.EXITED = exports.UNMOUNTED = void 0;\n\nvar PropTypes = _interopRequireWildcard(require(\"prop-types\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _reactDom = _interopRequireDefault(require(\"react-dom\"));\n\nvar _reactLifecyclesCompat = require(\"react-lifecycles-compat\");\n\nvar _PropTypes = require(\"./utils/PropTypes\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nfunction _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }\n\nvar UNMOUNTED = 'unmounted';\nexports.UNMOUNTED = UNMOUNTED;\nvar EXITED = 'exited';\nexports.EXITED = EXITED;\nvar ENTERING = 'entering';\nexports.ENTERING = ENTERING;\nvar ENTERED = 'entered';\nexports.ENTERED = ENTERED;\nvar EXITING = 'exiting';\n/**\n * The Transition component lets you describe a transition from one component\n * state to another _over time_ with a simple declarative API. Most commonly\n * it's used to animate the mounting and unmounting of a component, but can also\n * be used to describe in-place transition states as well.\n *\n * ---\n *\n * **Note**: `)) + ("`" + (`Transition` + "`"))) + ((` is a platform-agnostic base component. If you're using\n * transitions in CSS, you'll probably want to use\n * [` + ("`" + `CSSTransition`)) + ("`" + (`](https://reactcommunity.org/react-transition-group/css-transition)\n * instead. It inherits all the features of ` + "`"))))) + ((((`Transition` + ("`" + `, but contains\n * additional features necessary to play nice with CSS transitions (hence the\n * name of the component).\n *\n * ---\n *\n * By default the `)) + ("`" + (`Transition` + "`"))) + ((` component does not alter the behavior of the\n * component it renders, it only tracks \"enter\" and \"exit\" states for the\n * components. It's up to you to give meaning and effect to those states. For\n * example we can add styles to a component when it enters or exits:\n *\n * ` + ("`" + "`")) + ("`" + (`jsx\n * import { Transition } from 'react-transition-group';\n *\n * const duration = 300;\n *\n * const defaultStyle = {\n * transition: ` + "`")))) + (((`opacity ${duration}ms ease-in-out` + ("`" + `,\n * opacity: 0,\n * }\n *\n * const transitionStyles = {\n * entering: { opacity: 0 },\n * entered: { opacity: 1 },\n * };\n *\n * const Fade = ({ in: inProp }) => (\n * \n * {state => (\n *
\n * I'm a fade Transition!\n *
\n * )}\n *
\n * );\n * `)) + ("`" + ("`" + "`"))) + ((`\n *\n * There are 4 main states a Transition can be in:\n * - ` + ("`" + `'entering'`)) + (("`" + `\n * - `) + ("`" + `'entered'`)))))) + ((((("`" + (`\n * - ` + "`")) + (`'exiting'` + ("`" + `\n * - `))) + (("`" + (`'exited'` + "`")) + (`\n *\n * Transition state is toggled via the ` + ("`" + `in`)))) + ((("`" + (` prop. When ` + "`")) + (`true` + ("`" + ` the component\n * begins the \"Enter\" stage. During this stage, the component will shift from\n * its current transition state, to `))) + (("`" + (`'entering'` + "`")) + ((` for the duration of the\n * transition and then to the ` + "`") + (`'entered'` + "`"))))) + ((((` stage once it's complete. Let's take\n * the following example (we'll use the\n * [useState](https://reactjs.org/docs/hooks-reference.html#usestate) hook):\n *\n * ` + ("`" + "`")) + ("`" + (`jsx\n * function App() {\n * const [inProp, setInProp] = useState(false);\n * return (\n *
\n * \n * {state => (\n * // ...\n * )}\n * \n * \n *
\n * );\n * }\n * ` + "`"))) + (("`" + ("`" + `\n *\n * When the button is clicked the component will shift to the `)) + ("`" + (`'entering'` + "`")))) + (((` state\n * and stay there for 500ms (the value of ` + ("`" + `timeout`)) + ("`" + (`) before it finally switches\n * to ` + "`"))) + ((`'entered'` + ("`" + `.\n *\n * When `)) + (("`" + `in`) + ("`" + ` is `)))))))) + ((((((("`" + (`false` + "`")) + (` the same thing happens except the state moves from\n * ` + ("`" + `'exiting'`))) + (("`" + (` to ` + "`")) + (`'exited'` + ("`" + `.\n */\n\nexports.EXITING = EXITING;\n\nvar Transition =\n/*#__PURE__*/\nfunction (_React$Component) {\n _inheritsLoose(Transition, _React$Component);\n\n function Transition(props, context) {\n var _this;\n\n _this = _React$Component.call(this, props, context) || this;\n var parentGroup = context.transitionGroup; // In the context of a TransitionGroup all enters are really appears\n\n var appear = parentGroup && !parentGroup.isMounting ? props.enter : props.appear;\n var initialStatus;\n _this.appearStatus = null;\n\n if (props.in) {\n if (appear) {\n initialStatus = EXITED;\n _this.appearStatus = ENTERING;\n } else {\n initialStatus = ENTERED;\n }\n } else {\n if (props.unmountOnExit || props.mountOnEnter) {\n initialStatus = UNMOUNTED;\n } else {\n initialStatus = EXITED;\n }\n }\n\n _this.state = {\n status: initialStatus\n };\n _this.nextCallback = null;\n return _this;\n }\n\n var _proto = Transition.prototype;\n\n _proto.getChildContext = function getChildContext() {\n return {\n transitionGroup: null // allows for nested Transitions\n\n };\n };\n\n Transition.getDerivedStateFromProps = function getDerivedStateFromProps(_ref, prevState) {\n var nextIn = _ref.in;\n\n if (nextIn && prevState.status === UNMOUNTED) {\n return {\n status: EXITED\n };\n }\n\n return null;\n }; // getSnapshotBeforeUpdate(prevProps) {\n // let nextStatus = null\n // if (prevProps !== this.props) {\n // const { status } = this.state\n // if (this.props.in) {\n // if (status !== ENTERING && status !== ENTERED) {\n // nextStatus = ENTERING\n // }\n // } else {\n // if (status === ENTERING || status === ENTERED) {\n // nextStatus = EXITING\n // }\n // }\n // }\n // return { nextStatus }\n // }\n\n\n _proto.componentDidMount = function componentDidMount() {\n this.updateStatus(true, this.appearStatus);\n };\n\n _proto.componentDidUpdate = function componentDidUpdate(prevProps) {\n var nextStatus = null;\n\n if (prevProps !== this.props) {\n var status = this.state.status;\n\n if (this.props.in) {\n if (status !== ENTERING && status !== ENTERED) {\n nextStatus = ENTERING;\n }\n } else {\n if (status === ENTERING || status === ENTERED) {\n nextStatus = EXITING;\n }\n }\n }\n\n this.updateStatus(false, nextStatus);\n };\n\n _proto.componentWillUnmount = function componentWillUnmount() {\n this.cancelNextCallback();\n };\n\n _proto.getTimeouts = function getTimeouts() {\n var timeout = this.props.timeout;\n var exit, enter, appear;\n exit = enter = appear = timeout;\n\n if (timeout != null && typeof timeout !== 'number') {\n exit = timeout.exit;\n enter = timeout.enter; // TODO: remove fallback for next major\n\n appear = timeout.appear !== undefined ? timeout.appear : enter;\n }\n\n return {\n exit: exit,\n enter: enter,\n appear: appear\n };\n };\n\n _proto.updateStatus = function updateStatus(mounting, nextStatus) {\n if (mounting === void 0) {\n mounting = false;\n }\n\n if (nextStatus !== null) {\n // nextStatus will always be ENTERING or EXITING.\n this.cancelNextCallback();\n\n var node = _reactDom.default.findDOMNode(this);\n\n if (nextStatus === ENTERING) {\n this.performEnter(node, mounting);\n } else {\n this.performExit(node);\n }\n } else if (this.props.unmountOnExit && this.state.status === EXITED) {\n this.setState({\n status: UNMOUNTED\n });\n }\n };\n\n _proto.performEnter = function performEnter(node, mounting) {\n var _this2 = this;\n\n var enter = this.props.enter;\n var appearing = this.context.transitionGroup ? this.context.transitionGroup.isMounting : mounting;\n var timeouts = this.getTimeouts();\n var enterTimeout = appearing ? timeouts.appear : timeouts.enter; // no enter animation skip right to ENTERED\n // if we are mounting and running this it means appear _must_ be set\n\n if (!mounting && !enter) {\n this.safeSetState({\n status: ENTERED\n }, function () {\n _this2.props.onEntered(node);\n });\n return;\n }\n\n this.props.onEnter(node, appearing);\n this.safeSetState({\n status: ENTERING\n }, function () {\n _this2.props.onEntering(node, appearing);\n\n _this2.onTransitionEnd(node, enterTimeout, function () {\n _this2.safeSetState({\n status: ENTERED\n }, function () {\n _this2.props.onEntered(node, appearing);\n });\n });\n });\n };\n\n _proto.performExit = function performExit(node) {\n var _this3 = this;\n\n var exit = this.props.exit;\n var timeouts = this.getTimeouts(); // no exit animation skip right to EXITED\n\n if (!exit) {\n this.safeSetState({\n status: EXITED\n }, function () {\n _this3.props.onExited(node);\n });\n return;\n }\n\n this.props.onExit(node);\n this.safeSetState({\n status: EXITING\n }, function () {\n _this3.props.onExiting(node);\n\n _this3.onTransitionEnd(node, timeouts.exit, function () {\n _this3.safeSetState({\n status: EXITED\n }, function () {\n _this3.props.onExited(node);\n });\n });\n });\n };\n\n _proto.cancelNextCallback = function cancelNextCallback() {\n if (this.nextCallback !== null) {\n this.nextCallback.cancel();\n this.nextCallback = null;\n }\n };\n\n _proto.safeSetState = function safeSetState(nextState, callback) {\n // This shouldn't be necessary, but there are weird race conditions with\n // setState callbacks and unmounting in testing, so always make sure that\n // we can cancel any pending setState callbacks after we unmount.\n callback = this.setNextCallback(callback);\n this.setState(nextState, callback);\n };\n\n _proto.setNextCallback = function setNextCallback(callback) {\n var _this4 = this;\n\n var active = true;\n\n this.nextCallback = function (event) {\n if (active) {\n active = false;\n _this4.nextCallback = null;\n callback(event);\n }\n };\n\n this.nextCallback.cancel = function () {\n active = false;\n };\n\n return this.nextCallback;\n };\n\n _proto.onTransitionEnd = function onTransitionEnd(node, timeout, handler) {\n this.setNextCallback(handler);\n var doesNotHaveTimeoutOrListener = timeout == null && !this.props.addEndListener;\n\n if (!node || doesNotHaveTimeoutOrListener) {\n setTimeout(this.nextCallback, 0);\n return;\n }\n\n if (this.props.addEndListener) {\n this.props.addEndListener(node, this.nextCallback);\n }\n\n if (timeout != null) {\n setTimeout(this.nextCallback, timeout);\n }\n };\n\n _proto.render = function render() {\n var status = this.state.status;\n\n if (status === UNMOUNTED) {\n return null;\n }\n\n var _this$props = this.props,\n children = _this$props.children,\n childProps = _objectWithoutPropertiesLoose(_this$props, [\"children\"]); // filter props for Transtition\n\n\n delete childProps.in;\n delete childProps.mountOnEnter;\n delete childProps.unmountOnExit;\n delete childProps.appear;\n delete childProps.enter;\n delete childProps.exit;\n delete childProps.timeout;\n delete childProps.addEndListener;\n delete childProps.onEnter;\n delete childProps.onEntering;\n delete childProps.onEntered;\n delete childProps.onExit;\n delete childProps.onExiting;\n delete childProps.onExited;\n\n if (typeof children === 'function') {\n return children(status, childProps);\n }\n\n var child = _react.default.Children.only(children);\n\n return _react.default.cloneElement(child, childProps);\n };\n\n return Transition;\n}(_react.default.Component);\n\nTransition.contextTypes = {\n transitionGroup: PropTypes.object\n};\nTransition.childContextTypes = {\n transitionGroup: function transitionGroup() {}\n};\nTransition.propTypes = process.env.NODE_ENV !== \"production\" ? {\n /**\n * A `)))) + ((("`" + (`function` + "`")) + (` child can be used instead of a React element. This function is\n * called with the current transition status (` + ("`" + `'entering'`))) + (("`" + (`, ` + "`")) + (`'entered'` + ("`" + `,\n * `))))) + (((("`" + (`'exiting'` + "`")) + (`, ` + ("`" + `'exited'`))) + (("`" + (`, ` + "`")) + (`'unmounted'` + ("`" + `), which can be used to apply context\n * specific props to a component.\n *\n * `)))) + ((("`" + ("`" + "`")) + (`jsx\n * \n * {state => (\n * \n * )}\n * \n * ` + "`")) + (("`" + "`") + (`\n */\n children: PropTypes.oneOfType([PropTypes.func.isRequired, PropTypes.element.isRequired]).isRequired,\n\n /**\n * Show the component; triggers the enter or exit states\n */\n in: PropTypes.bool,\n\n /**\n * By default the child component is mounted immediately along with\n * the parent ` + "`")))))) + (((((`Transition` + ("`" + ` component. If you want to \"lazy mount\" the component on the\n * first `)) + ("`" + (`in={true}` + "`"))) + ((` you can set ` + ("`" + `mountOnEnter`)) + ("`" + (`. After the first enter transition the component will stay\n * mounted, even on \"exited\", unless you also specify ` + "`")))) + (((`unmountOnExit` + ("`" + `.\n */\n mountOnEnter: PropTypes.bool,\n\n /**\n * By default the child component stays mounted after it reaches the `)) + ("`" + (`'exited'` + "`"))) + ((` state.\n * Set ` + ("`" + `unmountOnExit`)) + (("`" + ` if you'd prefer to unmount the component after it finishes exiting.\n */\n unmountOnExit: PropTypes.bool,\n\n /**\n * Normally a component is not transitioned if it is shown when the `) + ("`" + ``))))) + (((("`" + (` component mounts.\n * If you want to transition on the first mount set ` + "`")) + (`appear` + ("`" + ` to `))) + (("`" + (`true` + "`")) + (`, and the\n * component will transition in as soon as the ` + ("`" + ``)))) + ((("`" + (` mounts.\n *\n * > Note: there are no specific \"appear\" states. ` + "`")) + (`appear` + ("`" + ` only adds an additional `))) + (("`" + (`enter` + "`")) + ((` transition.\n */\n appear: PropTypes.bool,\n\n /**\n * Enable or disable enter transitions.\n */\n enter: PropTypes.bool,\n\n /**\n * Enable or disable exit transitions.\n */\n exit: PropTypes.bool,\n\n /**\n * The duration of the transition, in milliseconds.\n * Required unless ` + "`") + (`addEndListener` + "`"))))))) + ((((((` is provided.\n *\n * You may specify a single timeout for all transitions:\n *\n * ` + ("`" + "`")) + ("`" + (`jsx\n * timeout={500}\n * ` + "`"))) + (("`" + ("`" + `\n *\n * or individually:\n *\n * `)) + ("`" + ("`" + "`")))) + (((`jsx\n * timeout={{\n * appear: 500,\n * enter: 300,\n * exit: 500,\n * }}\n * ` + ("`" + "`")) + ("`" + (`\n *\n * - ` + "`"))) + ((`appear` + ("`" + ` defaults to the value of `)) + (("`" + `enter`) + ("`" + `\n * - `))))) + (((("`" + (`enter` + "`")) + (` defaults to ` + ("`" + `0`))) + (("`" + (`\n * - ` + "`")) + (`exit` + ("`" + ` defaults to `)))) + ((("`" + (`0` + "`")) + (`\n *\n * @type {number | { enter?: number, exit?: number, appear?: number }}\n */\n timeout: function timeout(props) {\n var pt = _PropTypes.timeoutsShape;\n if (!props.addEndListener) pt = pt.isRequired;\n\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n return pt.apply(void 0, [props].concat(args));\n },\n\n /**\n * Add a custom transition end trigger. Called with the transitioning\n * DOM node and a ` + ("`" + `done`))) + (("`" + (` callback. Allows for more fine grained transition end\n * logic. **Note:** Timeouts are still used as a fallback if provided.\n *\n * ` + "`")) + (("`" + "`") + (`jsx\n * addEndListener={(node, done) => {\n * // use the css transitionend event to mark the finish of a transition\n * node.addEventListener('transitionend', done, false);\n * }}\n * ` + "`")))))) + ((((("`" + ("`" + `\n */\n addEndListener: PropTypes.func,\n\n /**\n * Callback fired before the \"entering\" status is applied. An extra parameter\n * `)) + ("`" + (`isAppearing` + "`"))) + ((` is supplied to indicate if the enter stage is occurring on the initial mount\n *\n * @type Function(node: HtmlElement, isAppearing: bool) -> void\n */\n onEnter: PropTypes.func,\n\n /**\n * Callback fired after the \"entering\" status is applied. An extra parameter\n * ` + ("`" + `isAppearing`)) + ("`" + (` is supplied to indicate if the enter stage is occurring on the initial mount\n *\n * @type Function(node: HtmlElement, isAppearing: bool)\n */\n onEntering: PropTypes.func,\n\n /**\n * Callback fired after the \"entered\" status is applied. An extra parameter\n * ` + "`")))) + (((`isAppearing` + ("`" + ` is supplied to indicate if the enter stage is occurring on the initial mount\n *\n * @type Function(node: HtmlElement, isAppearing: bool) -> void\n */\n onEntered: PropTypes.func,\n\n /**\n * Callback fired before the \"exiting\" status is applied.\n *\n * @type Function(node: HtmlElement) -> void\n */\n onExit: PropTypes.func,\n\n /**\n * Callback fired after the \"exiting\" status is applied.\n *\n * @type Function(node: HtmlElement) -> void\n */\n onExiting: PropTypes.func,\n\n /**\n * Callback fired after the \"exited\" status is applied.\n *\n * @type Function(node: HtmlElement) -> void\n */\n onExited: PropTypes.func // Name the function so it is clearer in the documentation\n\n} : {};\n\nfunction noop() {}\n\nTransition.defaultProps = {\n in: false,\n mountOnEnter: false,\n unmountOnExit: false,\n appear: false,\n enter: true,\n exit: true,\n onEnter: noop,\n onEntering: noop,\n onEntered: noop,\n onExit: noop,\n onExiting: noop,\n onExited: noop\n};\nTransition.UNMOUNTED = 0;\nTransition.EXITED = 1;\nTransition.ENTERING = 2;\nTransition.ENTERED = 3;\nTransition.EXITING = 4;\n\nvar _default = (0, _reactLifecyclesCompat.polyfill)(Transition);\n\nexports.default = _default;", + "\"use strict\";\n\nexports.__esModule = true;\nexports.default = void 0;\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _reactLifecyclesCompat = require(\"react-lifecycles-compat\");\n\nvar _ChildMapping = require(\"./utils/ChildMapping\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nvar values = Object.values || function (obj) {\n return Object.keys(obj).map(function (k) {\n return obj[k];\n });\n};\n\nvar defaultProps = {\n component: 'div',\n childFactory: function childFactory(child) {\n return child;\n }\n /**\n * The `)) + ("`" + (`` + "`"))) + ((` component manages a set of transition components\n * (` + ("`" + ``)) + (("`" + ` and `) + ("`" + ``))))) + (((("`" + (`) in a list. Like with the transition\n * components, ` + "`")) + (`` + ("`" + ` is a state machine for managing the mounting\n * and unmounting of components over time.\n *\n * Consider the example below. As items are removed or added to the TodoList the\n * `))) + (("`" + (`in` + "`")) + (` prop is toggled automatically by the ` + ("`" + ``)))) + ((("`" + (`.\n *\n * Note that ` + "`")) + (`` + ("`" + ` does not define any animation behavior!\n * Exactly _how_ a list item animates is up to the individual transition\n * component. This means you can mix and match animations across different list\n * items.\n */\n\n};\n\nvar TransitionGroup =\n/*#__PURE__*/\nfunction (_React$Component) {\n _inheritsLoose(TransitionGroup, _React$Component);\n\n function TransitionGroup(props, context) {\n var _this;\n\n _this = _React$Component.call(this, props, context) || this;\n\n var handleExited = _this.handleExited.bind(_assertThisInitialized(_assertThisInitialized(_this))); // Initial children should all be entering, dependent on appear\n\n\n _this.state = {\n handleExited: handleExited,\n firstRender: true\n };\n return _this;\n }\n\n var _proto = TransitionGroup.prototype;\n\n _proto.getChildContext = function getChildContext() {\n return {\n transitionGroup: {\n isMounting: !this.appeared\n }\n };\n };\n\n _proto.componentDidMount = function componentDidMount() {\n this.appeared = true;\n this.mounted = true;\n };\n\n _proto.componentWillUnmount = function componentWillUnmount() {\n this.mounted = false;\n };\n\n TransitionGroup.getDerivedStateFromProps = function getDerivedStateFromProps(nextProps, _ref) {\n var prevChildMapping = _ref.children,\n handleExited = _ref.handleExited,\n firstRender = _ref.firstRender;\n return {\n children: firstRender ? (0, _ChildMapping.getInitialChildMapping)(nextProps, handleExited) : (0, _ChildMapping.getNextChildMapping)(nextProps, prevChildMapping, handleExited),\n firstRender: false\n };\n };\n\n _proto.handleExited = function handleExited(child, node) {\n var currentChildMapping = (0, _ChildMapping.getChildMapping)(this.props.children);\n if (child.key in currentChildMapping) return;\n\n if (child.props.onExited) {\n child.props.onExited(node);\n }\n\n if (this.mounted) {\n this.setState(function (state) {\n var children = _extends({}, state.children);\n\n delete children[child.key];\n return {\n children: children\n };\n });\n }\n };\n\n _proto.render = function render() {\n var _this$props = this.props,\n Component = _this$props.component,\n childFactory = _this$props.childFactory,\n props = _objectWithoutPropertiesLoose(_this$props, [\"component\", \"childFactory\"]);\n\n var children = values(this.state.children).map(childFactory);\n delete props.appear;\n delete props.enter;\n delete props.exit;\n\n if (Component === null) {\n return children;\n }\n\n return _react.default.createElement(Component, props, children);\n };\n\n return TransitionGroup;\n}(_react.default.Component);\n\nTransitionGroup.childContextTypes = {\n transitionGroup: _propTypes.default.object.isRequired\n};\nTransitionGroup.propTypes = process.env.NODE_ENV !== \"production\" ? {\n /**\n * `))) + (("`" + (`` + "`")) + ((` renders a ` + "`") + (`
` + "`"))))))))) + ((((((((` by default. You can change this\n * behavior by providing a ` + ("`" + `component`)) + ("`" + (` prop.\n * If you use React v16+ and would like to avoid a wrapping ` + "`"))) + ((`
` + ("`" + ` element\n * you can pass in `)) + ("`" + (`component={null}` + "`")))) + (((`. This is useful if the wrapping div\n * borks your css styles.\n */\n component: _propTypes.default.any,\n\n /**\n * A set of ` + ("`" + ``)) + ("`" + (` components, that are toggled ` + "`"))) + ((`in` + ("`" + ` and out as they\n * leave. the `)) + ("`" + (`` + "`"))))) + ((((` will inject specific transition props, so\n * remember to spread them through if you are wrapping the ` + ("`" + ``)) + ("`" + (` as\n * with our ` + "`"))) + ((`` + ("`" + ` example.\n *\n * While this component is meant for multiple `)) + ("`" + (`Transition` + "`")))) + (((` or ` + ("`" + `CSSTransition`)) + ("`" + (`\n * children, sometimes you may want to have a single transition child with\n * content that you want to be transitioned out and in when you change it\n * (e.g. routes, images etc.) In that case you can change the ` + "`"))) + ((`key` + ("`" + ` prop of\n * the transition child as you change its content, this will cause\n * `)) + (("`" + `TransitionGroup`) + ("`" + ` to transition the child out and back in.\n */\n children: _propTypes.default.node,\n\n /**\n * A convenience prop that enables or disables appear animations\n * for all children. Note that specifying this will override any defaults set\n * on individual children Transitions.\n */\n appear: _propTypes.default.bool,\n\n /**\n * A convenience prop that enables or disables enter animations\n * for all children. Note that specifying this will override any defaults set\n * on individual children Transitions.\n */\n enter: _propTypes.default.bool,\n\n /**\n * A convenience prop that enables or disables exit animations\n * for all children. Note that specifying this will override any defaults set\n * on individual children Transitions.\n */\n exit: _propTypes.default.bool,\n\n /**\n * You may need to apply reactive updates to a child as it is exiting.\n * This is generally done by using `)))))) + ((((("`" + (`cloneElement` + "`")) + (` however in the case of an exiting\n * child the element has already been removed and not accessible to the consumer.\n *\n * If you do need to update a child as it leaves you can provide a ` + ("`" + `childFactory`))) + (("`" + (`\n * to wrap every child, even the ones that are leaving.\n *\n * @type Function(child: ReactElement) -> ReactElement\n */\n childFactory: _propTypes.default.func\n} : {};\nTransitionGroup.defaultProps = defaultProps;\n\nvar _default = (0, _reactLifecyclesCompat.polyfill)(TransitionGroup);\n\nexports.default = _default;\nmodule.exports = exports[\"default\"];", "\"use strict\";\n\nvar _CSSTransition = _interopRequireDefault(require(\"./CSSTransition\"));\n\nvar _ReplaceTransition = _interopRequireDefault(require(\"./ReplaceTransition\"));\n\nvar _TransitionGroup = _interopRequireDefault(require(\"./TransitionGroup\"));\n\nvar _Transition = _interopRequireDefault(require(\"./Transition\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nmodule.exports = {\n Transition: _Transition.default,\n TransitionGroup: _TransitionGroup.default,\n ReplaceTransition: _ReplaceTransition.default,\n CSSTransition: _CSSTransition.default\n};", - "\"use strict\";\n\nexports.__esModule = true;\nexports.getChildMapping = getChildMapping;\nexports.mergeChildMappings = mergeChildMappings;\nexports.getInitialChildMapping = getInitialChildMapping;\nexports.getNextChildMapping = getNextChildMapping;\n\nvar _react = require(\"react\");\n\n/**\n * Given ` + "`"))) + ((`this.props.children` + ("`" + `, return an object mapping key to child.\n *\n * @param {*} children `)) + ("`" + (`this.props.children` + "`"))))))) + ((((((`\n * @return {object} Mapping of key to child\n */\nfunction getChildMapping(children, mapFn) {\n var mapper = function mapper(child) {\n return mapFn && (0, _react.isValidElement)(child) ? mapFn(child) : child;\n };\n\n var result = Object.create(null);\n if (children) _react.Children.map(children, function (c) {\n return c;\n }).forEach(function (child) {\n // run the map function here instead so that the key is the computed one\n result[child.key] = mapper(child);\n });\n return result;\n}\n/**\n * When you're adding or removing children some may be added or removed in the\n * same render pass. We want to show *both* since we want to simultaneously\n * animate elements in and out. This function takes a previous set of keys\n * and a new set of keys and merges them with its best guess of the correct\n * ordering. In the future we may expose some of the utilities in\n * ReactMultiChild to make this easy, but for now React itself does not\n * directly have this concept of the union of prevChildren and nextChildren\n * so we implement it here.\n *\n * @param {object} prev prev children as returned from\n * ` + "`") + (`ReactTransitionChildMapping.getChildMapping()` + ("`" + `.\n * @param {object} next next children as returned from\n * `))) + (("`" + (`ReactTransitionChildMapping.getChildMapping()` + "`")) + (`.\n * @return {object} a key set that contains all keys in ` + ("`" + `prev`)))) + ((("`" + ` and all keys\n * in `) + ("`" + (`next` + "`"))) + ((` in a reasonable order.\n */\n\n\nfunction mergeChildMappings(prev, next) {\n prev = prev || {};\n next = next || {};\n\n function getValueForKey(key) {\n return key in next ? next[key] : prev[key];\n } // For each key of ` + ("`" + `next`)) + ("`" + (`, the list of keys to insert before that key in\n // the combined list\n\n\n var nextKeysPending = Object.create(null);\n var pendingKeys = [];\n\n for (var prevKey in prev) {\n if (prevKey in next) {\n if (pendingKeys.length) {\n nextKeysPending[prevKey] = pendingKeys;\n pendingKeys = [];\n }\n } else {\n pendingKeys.push(prevKey);\n }\n }\n\n var i;\n var childMapping = {};\n\n for (var nextKey in next) {\n if (nextKeysPending[nextKey]) {\n for (i = 0; i < nextKeysPending[nextKey].length; i++) {\n var pendingNextKey = nextKeysPending[nextKey][i];\n childMapping[nextKeysPending[nextKey][i]] = getValueForKey(pendingNextKey);\n }\n }\n\n childMapping[nextKey] = getValueForKey(nextKey);\n } // Finally, add the keys which didn't appear before any key in ` + "`"))))) + ((((`next` + "`") + (`\n\n\n for (i = 0; i < pendingKeys.length; i++) {\n childMapping[pendingKeys[i]] = getValueForKey(pendingKeys[i]);\n }\n\n return childMapping;\n}\n\nfunction getProp(child, prop, props) {\n return props[prop] != null ? props[prop] : child.props[prop];\n}\n\nfunction getInitialChildMapping(props, onExited) {\n return getChildMapping(props.children, function (child) {\n return (0, _react.cloneElement)(child, {\n onExited: onExited.bind(null, child),\n in: true,\n appear: getProp(child, 'appear', props),\n enter: getProp(child, 'enter', props),\n exit: getProp(child, 'exit', props)\n });\n });\n}\n\nfunction getNextChildMapping(nextProps, prevChildMapping, onExited) {\n var nextChildMapping = getChildMapping(nextProps.children);\n var children = mergeChildMappings(prevChildMapping, nextChildMapping);\n Object.keys(children).forEach(function (key) {\n var child = children[key];\n if (!(0, _react.isValidElement)(child)) return;\n var hasPrev = key in prevChildMapping;\n var hasNext = key in nextChildMapping;\n var prevChild = prevChildMapping[key];\n var isLeaving = (0, _react.isValidElement)(prevChild) && !prevChild.props.in; // item is new (entering)\n\n if (hasNext && (!hasPrev || isLeaving)) {\n // console.log('entering', key)\n children[key] = (0, _react.cloneElement)(child, {\n onExited: onExited.bind(null, child),\n in: true,\n exit: getProp(child, 'exit', nextProps),\n enter: getProp(child, 'enter', nextProps)\n });\n } else if (!hasNext && hasPrev && !isLeaving) {\n // item is old (exiting)\n // console.log('leaving', key)\n children[key] = (0, _react.cloneElement)(child, {\n in: false\n });\n } else if (hasNext && hasPrev && (0, _react.isValidElement)(prevChild)) {\n // item hasn't changed transition states\n // copy over the last transition props;\n // console.log('unchanged', key)\n children[key] = (0, _react.cloneElement)(child, {\n onExited: onExited.bind(null, child),\n in: prevChild.props.in,\n exit: getProp(child, 'exit', nextProps),\n enter: getProp(child, 'enter', nextProps)\n });\n }\n });\n return children;\n}", + "\"use strict\";\n\nexports.__esModule = true;\nexports.getChildMapping = getChildMapping;\nexports.mergeChildMappings = mergeChildMappings;\nexports.getInitialChildMapping = getInitialChildMapping;\nexports.getNextChildMapping = getNextChildMapping;\n\nvar _react = require(\"react\");\n\n/**\n * Given ` + "`")) + (`this.props.children` + ("`" + `, return an object mapping key to child.\n *\n * @param {*} children `)))) + ((("`" + (`this.props.children` + "`")) + (`\n * @return {object} Mapping of key to child\n */\nfunction getChildMapping(children, mapFn) {\n var mapper = function mapper(child) {\n return mapFn && (0, _react.isValidElement)(child) ? mapFn(child) : child;\n };\n\n var result = Object.create(null);\n if (children) _react.Children.map(children, function (c) {\n return c;\n }).forEach(function (child) {\n // run the map function here instead so that the key is the computed one\n result[child.key] = mapper(child);\n });\n return result;\n}\n/**\n * When you're adding or removing children some may be added or removed in the\n * same render pass. We want to show *both* since we want to simultaneously\n * animate elements in and out. This function takes a previous set of keys\n * and a new set of keys and merges them with its best guess of the correct\n * ordering. In the future we may expose some of the utilities in\n * ReactMultiChild to make this easy, but for now React itself does not\n * directly have this concept of the union of prevChildren and nextChildren\n * so we implement it here.\n *\n * @param {object} prev prev children as returned from\n * ` + ("`" + `ReactTransitionChildMapping.getChildMapping()`))) + (("`" + (`.\n * @param {object} next next children as returned from\n * ` + "`")) + ((`ReactTransitionChildMapping.getChildMapping()` + "`") + (`.\n * @return {object} a key set that contains all keys in ` + "`"))))) + ((((`prev` + ("`" + ` and all keys\n * in `)) + ("`" + (`next` + "`"))) + ((` in a reasonable order.\n */\n\n\nfunction mergeChildMappings(prev, next) {\n prev = prev || {};\n next = next || {};\n\n function getValueForKey(key) {\n return key in next ? next[key] : prev[key];\n } // For each key of ` + ("`" + `next`)) + ("`" + (`, the list of keys to insert before that key in\n // the combined list\n\n\n var nextKeysPending = Object.create(null);\n var pendingKeys = [];\n\n for (var prevKey in prev) {\n if (prevKey in next) {\n if (pendingKeys.length) {\n nextKeysPending[prevKey] = pendingKeys;\n pendingKeys = [];\n }\n } else {\n pendingKeys.push(prevKey);\n }\n }\n\n var i;\n var childMapping = {};\n\n for (var nextKey in next) {\n if (nextKeysPending[nextKey]) {\n for (i = 0; i < nextKeysPending[nextKey].length; i++) {\n var pendingNextKey = nextKeysPending[nextKey][i];\n childMapping[nextKeysPending[nextKey][i]] = getValueForKey(pendingNextKey);\n }\n }\n\n childMapping[nextKey] = getValueForKey(nextKey);\n } // Finally, add the keys which didn't appear before any key in ` + "`")))) + (((`next` + ("`" + `\n\n\n for (i = 0; i < pendingKeys.length; i++) {\n childMapping[pendingKeys[i]] = getValueForKey(pendingKeys[i]);\n }\n\n return childMapping;\n}\n\nfunction getProp(child, prop, props) {\n return props[prop] != null ? props[prop] : child.props[prop];\n}\n\nfunction getInitialChildMapping(props, onExited) {\n return getChildMapping(props.children, function (child) {\n return (0, _react.cloneElement)(child, {\n onExited: onExited.bind(null, child),\n in: true,\n appear: getProp(child, 'appear', props),\n enter: getProp(child, 'enter', props),\n exit: getProp(child, 'exit', props)\n });\n });\n}\n\nfunction getNextChildMapping(nextProps, prevChildMapping, onExited) {\n var nextChildMapping = getChildMapping(nextProps.children);\n var children = mergeChildMappings(prevChildMapping, nextChildMapping);\n Object.keys(children).forEach(function (key) {\n var child = children[key];\n if (!(0, _react.isValidElement)(child)) return;\n var hasPrev = key in prevChildMapping;\n var hasNext = key in nextChildMapping;\n var prevChild = prevChildMapping[key];\n var isLeaving = (0, _react.isValidElement)(prevChild) && !prevChild.props.in; // item is new (entering)\n\n if (hasNext && (!hasPrev || isLeaving)) {\n // console.log('entering', key)\n children[key] = (0, _react.cloneElement)(child, {\n onExited: onExited.bind(null, child),\n in: true,\n exit: getProp(child, 'exit', nextProps),\n enter: getProp(child, 'enter', nextProps)\n });\n } else if (!hasNext && hasPrev && !isLeaving) {\n // item is old (exiting)\n // console.log('leaving', key)\n children[key] = (0, _react.cloneElement)(child, {\n in: false\n });\n } else if (hasNext && hasPrev && (0, _react.isValidElement)(prevChild)) {\n // item hasn't changed transition states\n // copy over the last transition props;\n // console.log('unchanged', key)\n children[key] = (0, _react.cloneElement)(child, {\n onExited: onExited.bind(null, child),\n in: prevChild.props.in,\n exit: getProp(child, 'exit', nextProps),\n enter: getProp(child, 'enter', nextProps)\n });\n }\n });\n return children;\n}", + "\"use strict\";\n\nexports.__esModule = true;\nexports.classNamesShape = exports.timeoutsShape = void 0;\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar timeoutsShape = process.env.NODE_ENV !== 'production' ? _propTypes.default.oneOfType([_propTypes.default.number, _propTypes.default.shape({\n enter: _propTypes.default.number,\n exit: _propTypes.default.number,\n appear: _propTypes.default.number\n}).isRequired]) : null;\nexports.timeoutsShape = timeoutsShape;\nvar classNamesShape = process.env.NODE_ENV !== 'production' ? _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.shape({\n enter: _propTypes.default.string,\n exit: _propTypes.default.string,\n active: _propTypes.default.string\n}), _propTypes.default.shape({\n enter: _propTypes.default.string,\n enterDone: _propTypes.default.string,\n enterActive: _propTypes.default.string,\n exit: _propTypes.default.string,\n exitDone: _propTypes.default.string,\n exitActive: _propTypes.default.string\n})]) : null;\nexports.classNamesShape = classNamesShape;", + "\"use strict\";\n\nexports.__esModule = true;\nexports.default = exports.EXITING = exports.ENTERED = exports.ENTERING = exports.EXITED = exports.UNMOUNTED = void 0;\n\nvar PropTypes = _interopRequireWildcard(require(\"prop-types\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _reactDom = _interopRequireDefault(require(\"react-dom\"));\n\nvar _reactLifecyclesCompat = require(\"react-lifecycles-compat\");\n\nvar _PropTypes = require(\"./utils/PropTypes\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nfunction _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }\n\nvar UNMOUNTED = 'unmounted';\nexports.UNMOUNTED = UNMOUNTED;\nvar EXITED = 'exited';\nexports.EXITED = EXITED;\nvar ENTERING = 'entering';\nexports.ENTERING = ENTERING;\nvar ENTERED = 'entered';\nexports.ENTERED = ENTERED;\nvar EXITING = 'exiting';\n/**\n * The Transition component lets you describe a transition from one component\n * state to another _over time_ with a simple declarative API. Most commonly\n * it's used to animate the mounting and unmounting of a component, but can also\n * be used to describe in-place transition states as well.\n *\n * By default the `)) + ("`" + (`Transition` + "`"))) + ((` component does not alter the behavior of the\n * component it renders, it only tracks \"enter\" and \"exit\" states for the components.\n * It's up to you to give meaning and effect to those states. For example we can\n * add styles to a component when it enters or exits:\n *\n * ` + ("`" + "`")) + (("`" + `jsx\n * import Transition from 'react-transition-group/Transition';\n *\n * const duration = 300;\n *\n * const defaultStyle = {\n * transition: `) + ("`" + `opacity ${duration}ms ease-in-out`))))))) + (((((("`" + (`,\n * opacity: 0,\n * }\n *\n * const transitionStyles = {\n * entering: { opacity: 0 },\n * entered: { opacity: 1 },\n * };\n *\n * const Fade = ({ in: inProp }) => (\n * \n * {(state) => (\n *
\n * I'm a fade Transition!\n *
\n * )}\n *
\n * );\n * ` + "`")) + ("`" + ("`" + `\n *\n * As noted the `))) + (("`" + (`Transition` + "`")) + (` component doesn't _do_ anything by itself to its child component.\n * What it does do is track transition states over time so you can update the\n * component (such as by adding styles or classes) when it changes states.\n *\n * There are 4 main states a Transition can be in:\n * - ` + ("`" + `'entering'`)))) + ((("`" + (`\n * - ` + "`")) + (`'entered'` + ("`" + `\n * - `))) + (("`" + (`'exiting'` + "`")) + (`\n * - ` + ("`" + `'exited'`))))) + (((("`" + (`\n *\n * Transition state is toggled via the ` + "`")) + (`in` + ("`" + ` prop. When `))) + (("`" + (`true` + "`")) + (` the component begins the\n * \"Enter\" stage. During this stage, the component will shift from its current transition state,\n * to ` + ("`" + `'entering'`)))) + ((("`" + (` for the duration of the transition and then to the ` + "`")) + (`'entered'` + ("`" + ` stage once\n * it's complete. Let's take the following example:\n *\n * `))) + (("`" + ("`" + "`")) + ((`jsx\n * state = { in: false };\n *\n * toggleEnterState = () => {\n * this.setState({ in: true });\n * }\n *\n * render() {\n * return (\n *
\n * \n * \n *
\n * );\n * }\n * ` + "`") + ("`" + "`")))))) + (((((`\n *\n * When the button is clicked the component will shift to the ` + ("`" + `'entering'`)) + ("`" + (` state and\n * stay there for 500ms (the value of ` + "`"))) + ((`timeout` + ("`" + `) before it finally switches to `)) + ("`" + (`'entered'` + "`")))) + (((`.\n *\n * When ` + ("`" + `in`)) + ("`" + (` is ` + "`"))) + ((`false` + ("`" + ` the same thing happens except the state moves from `)) + (("`" + `'exiting'`) + ("`" + ` to `))))) + (((("`" + (`'exited'` + "`")) + (`.\n *\n * ## Timing\n *\n * Timing is often the trickiest part of animation, mistakes can result in slight delays\n * that are hard to pin down. A common example is when you want to add an exit transition,\n * you should set the desired final styles when the state is ` + ("`" + `'exiting'`))) + (("`" + (`. That's when the\n * transition to those styles will start and, if you matched the ` + "`")) + (`timeout` + ("`" + ` prop with the\n * CSS Transition duration, it will end exactly when the state changes to `)))) + ((("`" + (`'exited'` + "`")) + (`.\n *\n * > **Note**: For simpler transitions the ` + ("`" + `Transition`))) + (("`" + (` component might be enough, but\n * > take into account that it's platform-agnostic, while the ` + "`")) + ((`CSSTransition` + "`") + (` component\n * > [forces reflows](https://github.com/reactjs/react-transition-group/blob/5007303e729a74be66a21c3e2205e4916821524b/src/CSSTransition.js#L208-L215)\n * > in order to make more complex transitions more predictable. For example, even though\n * > classes ` + "`")))))))) + (((((((`example-enter` + ("`" + ` and `)) + ("`" + (`example-enter-active` + "`"))) + ((` are applied immediately one after\n * > another, you can still transition from one to the other because of the forced reflow\n * > (read [this issue](https://github.com/reactjs/react-transition-group/issues/159#issuecomment-322761171)\n * > for more info). Take this into account when choosing between ` + ("`" + `Transition`)) + ("`" + (` and\n * > ` + "`")))) + (((`CSSTransition` + ("`" + `.\n */\n\nexports.EXITING = EXITING;\n\nvar Transition =\n/*#__PURE__*/\nfunction (_React$Component) {\n _inheritsLoose(Transition, _React$Component);\n\n function Transition(props, context) {\n var _this;\n\n _this = _React$Component.call(this, props, context) || this;\n var parentGroup = context.transitionGroup; // In the context of a TransitionGroup all enters are really appears\n\n var appear = parentGroup && !parentGroup.isMounting ? props.enter : props.appear;\n var initialStatus;\n _this.appearStatus = null;\n\n if (props.in) {\n if (appear) {\n initialStatus = EXITED;\n _this.appearStatus = ENTERING;\n } else {\n initialStatus = ENTERED;\n }\n } else {\n if (props.unmountOnExit || props.mountOnEnter) {\n initialStatus = UNMOUNTED;\n } else {\n initialStatus = EXITED;\n }\n }\n\n _this.state = {\n status: initialStatus\n };\n _this.nextCallback = null;\n return _this;\n }\n\n var _proto = Transition.prototype;\n\n _proto.getChildContext = function getChildContext() {\n return {\n transitionGroup: null // allows for nested Transitions\n\n };\n };\n\n Transition.getDerivedStateFromProps = function getDerivedStateFromProps(_ref, prevState) {\n var nextIn = _ref.in;\n\n if (nextIn && prevState.status === UNMOUNTED) {\n return {\n status: EXITED\n };\n }\n\n return null;\n }; // getSnapshotBeforeUpdate(prevProps) {\n // let nextStatus = null\n // if (prevProps !== this.props) {\n // const { status } = this.state\n // if (this.props.in) {\n // if (status !== ENTERING && status !== ENTERED) {\n // nextStatus = ENTERING\n // }\n // } else {\n // if (status === ENTERING || status === ENTERED) {\n // nextStatus = EXITING\n // }\n // }\n // }\n // return { nextStatus }\n // }\n\n\n _proto.componentDidMount = function componentDidMount() {\n this.updateStatus(true, this.appearStatus);\n };\n\n _proto.componentDidUpdate = function componentDidUpdate(prevProps) {\n var nextStatus = null;\n\n if (prevProps !== this.props) {\n var status = this.state.status;\n\n if (this.props.in) {\n if (status !== ENTERING && status !== ENTERED) {\n nextStatus = ENTERING;\n }\n } else {\n if (status === ENTERING || status === ENTERED) {\n nextStatus = EXITING;\n }\n }\n }\n\n this.updateStatus(false, nextStatus);\n };\n\n _proto.componentWillUnmount = function componentWillUnmount() {\n this.cancelNextCallback();\n };\n\n _proto.getTimeouts = function getTimeouts() {\n var timeout = this.props.timeout;\n var exit, enter, appear;\n exit = enter = appear = timeout;\n\n if (timeout != null && typeof timeout !== 'number') {\n exit = timeout.exit;\n enter = timeout.enter; // TODO: remove fallback for next major\n\n appear = timeout.appear !== undefined ? timeout.appear : enter;\n }\n\n return {\n exit: exit,\n enter: enter,\n appear: appear\n };\n };\n\n _proto.updateStatus = function updateStatus(mounting, nextStatus) {\n if (mounting === void 0) {\n mounting = false;\n }\n\n if (nextStatus !== null) {\n // nextStatus will always be ENTERING or EXITING.\n this.cancelNextCallback();\n\n var node = _reactDom.default.findDOMNode(this);\n\n if (nextStatus === ENTERING) {\n this.performEnter(node, mounting);\n } else {\n this.performExit(node);\n }\n } else if (this.props.unmountOnExit && this.state.status === EXITED) {\n this.setState({\n status: UNMOUNTED\n });\n }\n };\n\n _proto.performEnter = function performEnter(node, mounting) {\n var _this2 = this;\n\n var enter = this.props.enter;\n var appearing = this.context.transitionGroup ? this.context.transitionGroup.isMounting : mounting;\n var timeouts = this.getTimeouts();\n var enterTimeout = appearing ? timeouts.appear : timeouts.enter; // no enter animation skip right to ENTERED\n // if we are mounting and running this it means appear _must_ be set\n\n if (!mounting && !enter) {\n this.safeSetState({\n status: ENTERED\n }, function () {\n _this2.props.onEntered(node);\n });\n return;\n }\n\n this.props.onEnter(node, appearing);\n this.safeSetState({\n status: ENTERING\n }, function () {\n _this2.props.onEntering(node, appearing);\n\n _this2.onTransitionEnd(node, enterTimeout, function () {\n _this2.safeSetState({\n status: ENTERED\n }, function () {\n _this2.props.onEntered(node, appearing);\n });\n });\n });\n };\n\n _proto.performExit = function performExit(node) {\n var _this3 = this;\n\n var exit = this.props.exit;\n var timeouts = this.getTimeouts(); // no exit animation skip right to EXITED\n\n if (!exit) {\n this.safeSetState({\n status: EXITED\n }, function () {\n _this3.props.onExited(node);\n });\n return;\n }\n\n this.props.onExit(node);\n this.safeSetState({\n status: EXITING\n }, function () {\n _this3.props.onExiting(node);\n\n _this3.onTransitionEnd(node, timeouts.exit, function () {\n _this3.safeSetState({\n status: EXITED\n }, function () {\n _this3.props.onExited(node);\n });\n });\n });\n };\n\n _proto.cancelNextCallback = function cancelNextCallback() {\n if (this.nextCallback !== null) {\n this.nextCallback.cancel();\n this.nextCallback = null;\n }\n };\n\n _proto.safeSetState = function safeSetState(nextState, callback) {\n // This shouldn't be necessary, but there are weird race conditions with\n // setState callbacks and unmounting in testing, so always make sure that\n // we can cancel any pending setState callbacks after we unmount.\n callback = this.setNextCallback(callback);\n this.setState(nextState, callback);\n };\n\n _proto.setNextCallback = function setNextCallback(callback) {\n var _this4 = this;\n\n var active = true;\n\n this.nextCallback = function (event) {\n if (active) {\n active = false;\n _this4.nextCallback = null;\n callback(event);\n }\n };\n\n this.nextCallback.cancel = function () {\n active = false;\n };\n\n return this.nextCallback;\n };\n\n _proto.onTransitionEnd = function onTransitionEnd(node, timeout, handler) {\n this.setNextCallback(handler);\n var doesNotHaveTimeoutOrListener = timeout == null && !this.props.addEndListener;\n\n if (!node || doesNotHaveTimeoutOrListener) {\n setTimeout(this.nextCallback, 0);\n return;\n }\n\n if (this.props.addEndListener) {\n this.props.addEndListener(node, this.nextCallback);\n }\n\n if (timeout != null) {\n setTimeout(this.nextCallback, timeout);\n }\n };\n\n _proto.render = function render() {\n var status = this.state.status;\n\n if (status === UNMOUNTED) {\n return null;\n }\n\n var _this$props = this.props,\n children = _this$props.children,\n childProps = _objectWithoutPropertiesLoose(_this$props, [\"children\"]); // filter props for Transtition\n\n\n delete childProps.in;\n delete childProps.mountOnEnter;\n delete childProps.unmountOnExit;\n delete childProps.appear;\n delete childProps.enter;\n delete childProps.exit;\n delete childProps.timeout;\n delete childProps.addEndListener;\n delete childProps.onEnter;\n delete childProps.onEntering;\n delete childProps.onEntered;\n delete childProps.onExit;\n delete childProps.onExiting;\n delete childProps.onExited;\n\n if (typeof children === 'function') {\n return children(status, childProps);\n }\n\n var child = _react.default.Children.only(children);\n\n return _react.default.cloneElement(child, childProps);\n };\n\n return Transition;\n}(_react.default.Component);\n\nTransition.contextTypes = {\n transitionGroup: PropTypes.object\n};\nTransition.childContextTypes = {\n transitionGroup: function transitionGroup() {}\n};\nTransition.propTypes = process.env.NODE_ENV !== \"production\" ? {\n /**\n * A `)) + ("`" + (`function` + "`"))) + ((` child can be used instead of a React element.\n * This function is called with the current transition status\n * ('entering', 'entered', 'exiting', 'exited', 'unmounted'), which can be used\n * to apply context specific props to a component.\n *\n * ` + ("`" + "`")) + ("`" + (`jsx\n * \n * {(status) => (\n * \n * )}\n * \n * `)) + ("`" + ("`" + "`"))) + ((`\n */\n children: PropTypes.oneOfType([PropTypes.func.isRequired, PropTypes.element.isRequired]).isRequired,\n\n /**\n * Show the component; triggers the enter or exit states\n */\n in: PropTypes.bool,\n\n /**\n * By default the child component is mounted immediately along with\n * the parent ` + ("`" + `Transition`)) + ("`" + (` component. If you want to \"lazy mount\" the component on the\n * first ` + "`")))) + (((`in={true}` + ("`" + ` you can set `)) + ("`" + (`mountOnEnter` + "`"))) + ((`. After the first enter transition the component will stay\n * mounted, even on \"exited\", unless you also specify ` + ("`" + `unmountOnExit`)) + (("`" + `.\n */\n mountOnEnter: PropTypes.bool,\n\n /**\n * By default the child component stays mounted after it reaches the `) + ("`" + `'exited'`)))))) + ((((("`" + (` state.\n * Set ` + "`")) + (`unmountOnExit` + ("`" + ` if you'd prefer to unmount the component after it finishes exiting.\n */\n unmountOnExit: PropTypes.bool,\n\n /**\n * Normally a component is not transitioned if it is shown when the `))) + (("`" + (`` + "`")) + (` component mounts.\n * If you want to transition on the first mount set ` + ("`" + `appear`)))) + ((("`" + (` to ` + "`")) + (`true` + ("`" + `, and the\n * component will transition in as soon as the `))) + (("`" + (`` + "`")) + ((` mounts.\n *\n * > Note: there are no specific \"appear\" states. ` + "`") + (`appear` + "`"))))) + ((((` only adds an additional ` + ("`" + `enter`)) + ("`" + (` transition.\n */\n appear: PropTypes.bool,\n\n /**\n * Enable or disable enter transitions.\n */\n enter: PropTypes.bool,\n\n /**\n * Enable or disable exit transitions.\n */\n exit: PropTypes.bool,\n\n /**\n * The duration of the transition, in milliseconds.\n * Required unless ` + "`"))) + ((`addEndListener` + ("`" + ` is provided\n *\n * You may specify a single timeout for all transitions like: `)) + ("`" + (`timeout={500}` + "`")))) + (((`,\n * or individually like:\n *\n * ` + ("`" + "`")) + ("`" + (`jsx\n * timeout={{\n * enter: 300,\n * exit: 500,\n * appear: 500,\n * }}\n * ` + "`"))) + (("`" + ("`" + `\n *\n * If the value of `)) + (("`" + `appear`) + ("`" + ` is not set, then the value from enter is taken.\n *\n * If the `))))))) + (((((("`" + (`enter` + "`")) + (` or ` + ("`" + `exit`))) + (("`" + (` value is ` + "`")) + (`null` + ("`" + ` or `)))) + ((("`" + (`undefined` + "`")) + (`, then the timer is set to ` + ("`" + `0`))) + (("`" + (`\n *\n * @type {number | { enter?: number, exit?: number, appear?: number }}\n */\n timeout: function timeout(props) {\n var pt = process.env.NODE_ENV !== \"production\" ? _PropTypes.timeoutsShape : {};;\n if (!props.addEndListener) pt = pt.isRequired;\n\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n return pt.apply(void 0, [props].concat(args));\n },\n\n /**\n * Add a custom transition end trigger. Called with the transitioning\n * DOM node and a ` + "`")) + ((`done` + "`") + (` callback. Allows for more fine grained transition end\n * logic. **Note:** Timeouts are still used as a fallback if provided.\n *\n * ` + "`"))))) + (((("`" + ("`" + `jsx\n * addEndListener={(node, done) => {\n * // use the css transitionend event to mark the finish of a transition\n * node.addEventListener('transitionend', done, false);\n * }}\n * `)) + ("`" + ("`" + "`"))) + ((`\n */\n addEndListener: PropTypes.func,\n\n /**\n * Callback fired before the \"entering\" status is applied. An extra parameter\n * ` + ("`" + `isAppearing`)) + ("`" + (` is supplied to indicate if the enter stage is occurring on the initial mount\n *\n * @type Function(node: HtmlElement, isAppearing: bool) -> void\n */\n onEnter: PropTypes.func,\n\n /**\n * Callback fired after the \"entering\" status is applied. An extra parameter\n * ` + "`")))) + (((`isAppearing` + ("`" + ` is supplied to indicate if the enter stage is occurring on the initial mount\n *\n * @type Function(node: HtmlElement, isAppearing: bool)\n */\n onEntering: PropTypes.func,\n\n /**\n * Callback fired after the \"entered\" status is applied. An extra parameter\n * `)) + ("`" + (`isAppearing` + "`"))) + ((` is supplied to indicate if the enter stage is occurring on the initial mount\n *\n * @type Function(node: HtmlElement, isAppearing: bool) -> void\n */\n onEntered: PropTypes.func,\n\n /**\n * Callback fired before the \"exiting\" status is applied.\n *\n * @type Function(node: HtmlElement) -> void\n */\n onExit: PropTypes.func,\n\n /**\n * Callback fired after the \"exiting\" status is applied.\n *\n * @type Function(node: HtmlElement) -> void\n */\n onExiting: PropTypes.func,\n\n /**\n * Callback fired after the \"exited\" status is applied.\n *\n * @type Function(node: HtmlElement) -> void\n */\n onExited: PropTypes.func // Name the function so it is clearer in the documentation\n\n} : {};\n\nfunction noop() {}\n\nTransition.defaultProps = {\n in: false,\n mountOnEnter: false,\n unmountOnExit: false,\n appear: false,\n enter: true,\n exit: true,\n onEnter: noop,\n onEntering: noop,\n onEntered: noop,\n onExit: noop,\n onExiting: noop,\n onExited: noop\n};\nTransition.UNMOUNTED = 0;\nTransition.EXITED = 1;\nTransition.ENTERING = 2;\nTransition.ENTERED = 3;\nTransition.EXITING = 4;\n\nvar _default = (0, _reactLifecyclesCompat.polyfill)(Transition);\n\nexports.default = _default;", "\"use strict\";\n\nexports.__esModule = true;\nexports.classNamesShape = exports.timeoutsShape = void 0;\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar timeoutsShape = process.env.NODE_ENV !== 'production' ? _propTypes.default.oneOfType([_propTypes.default.number, _propTypes.default.shape({\n enter: _propTypes.default.number,\n exit: _propTypes.default.number,\n appear: _propTypes.default.number\n}).isRequired]) : null;\nexports.timeoutsShape = timeoutsShape;\nvar classNamesShape = process.env.NODE_ENV !== 'production' ? _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.shape({\n enter: _propTypes.default.string,\n exit: _propTypes.default.string,\n active: _propTypes.default.string\n}), _propTypes.default.shape({\n enter: _propTypes.default.string,\n enterDone: _propTypes.default.string,\n enterActive: _propTypes.default.string,\n exit: _propTypes.default.string,\n exitDone: _propTypes.default.string,\n exitActive: _propTypes.default.string\n})]) : null;\nexports.classNamesShape = classNamesShape;", "/** @license React v16.8.4\n * react.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';var k=require(\"object-assign\"),n=\"function\"===typeof Symbol&&Symbol.for,p=n?Symbol.for(\"react.element\"):60103,q=n?Symbol.for(\"react.portal\"):60106,r=n?Symbol.for(\"react.fragment\"):60107,t=n?Symbol.for(\"react.strict_mode\"):60108,u=n?Symbol.for(\"react.profiler\"):60114,v=n?Symbol.for(\"react.provider\"):60109,w=n?Symbol.for(\"react.context\"):60110,x=n?Symbol.for(\"react.concurrent_mode\"):60111,y=n?Symbol.for(\"react.forward_ref\"):60112,z=n?Symbol.for(\"react.suspense\"):60113,aa=n?Symbol.for(\"react.memo\"):\n60115,ba=n?Symbol.for(\"react.lazy\"):60116,A=\"function\"===typeof Symbol&&Symbol.iterator;function ca(a,b,d,c,e,g,h,f){if(!a){a=void 0;if(void 0===b)a=Error(\"Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.\");else{var l=[d,c,e,g,h,f],m=0;a=Error(b.replace(/%s/g,function(){return l[m++]}));a.name=\"Invariant Violation\"}a.framesToPop=1;throw a;}}\nfunction B(a){for(var b=arguments.length-1,d=\"https://reactjs.org/docs/error-decoder.html?invariant=\"+a,c=0;cP.length&&P.push(a)}\nfunction S(a,b,d,c){var e=typeof a;if(\"undefined\"===e||\"boolean\"===e)a=null;var g=!1;if(null===a)g=!0;else switch(e){case \"string\":case \"number\":g=!0;break;case \"object\":switch(a.$$typeof){case p:case q:g=!0}}if(g)return d(c,a,\"\"===b?\".\"+T(a,0):b),1;g=0;b=\"\"===b?\".\":b+\":\";if(Array.isArray(a))for(var h=0;h 2 && arguments[2] !== undefined ? arguments[2] : {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n };\n return Math.min(Math.abs(width - (offset.left || 0) - (offset.right || 0)), Math.abs(height - (offset.top || 0) - (offset.bottom || 0))) / 2;\n};\n/**\n * Calculate the scale function, position, width, height of axes\n * @param {Object} props Latest props\n * @param {Object} axisMap The configuration of axes\n * @param {Object} offset The offset of main part in the svg element\n * @param {Object} axisType The type of axes, radius-axis or angle-axis\n * @param {String} chartName The name of chart\n * @return {Object} Configuration\n */\n\nexport var formatAxisMap = function formatAxisMap(props, axisMap, offset, axisType, chartName) {\n var width = props.width,\n height = props.height;\n var startAngle = props.startAngle,\n endAngle = props.endAngle;\n var cx = getPercentValue(props.cx, width, width / 2);\n var cy = getPercentValue(props.cy, height, height / 2);\n var maxRadius = getMaxRadius(width, height, offset);\n var innerRadius = getPercentValue(props.innerRadius, maxRadius, 0);\n var outerRadius = getPercentValue(props.outerRadius, maxRadius, maxRadius * 0.8);\n var ids = Object.keys(axisMap);\n return ids.reduce(function (result, id) {\n var axis = axisMap[id];\n var domain = axis.domain,\n reversed = axis.reversed;\n var range;\n\n if (_isNil(axis.range)) {\n if (axisType === 'angleAxis') {\n range = [startAngle, endAngle];\n } else if (axisType === 'radiusAxis') {\n range = [innerRadius, outerRadius];\n }\n\n if (reversed) {\n range = [range[1], range[0]];\n }\n } else {\n range = axis.range;\n var _range = range;\n\n var _range2 = _slicedToArray(_range, 2);\n\n startAngle = _range2[0];\n endAngle = _range2[1];\n }\n\n var _parseScale = parseScale(axis, chartName),\n realScaleType = _parseScale.realScaleType,\n scale = _parseScale.scale;\n\n scale.domain(domain).range(range);\n checkDomainOfScale(scale);\n var ticks = getTicksOfScale(scale, _objectSpread({}, axis, {\n realScaleType: realScaleType\n }));\n\n var finalAxis = _objectSpread({}, axis, ticks, {\n range: range,\n radius: outerRadius,\n realScaleType: realScaleType,\n scale: scale,\n cx: cx,\n cy: cy,\n innerRadius: innerRadius,\n outerRadius: outerRadius,\n startAngle: startAngle,\n endAngle: endAngle\n });\n\n return _objectSpread({}, result, _defineProperty({}, id, finalAxis));\n }, {});\n};\nexport var distanceBetweenPoints = function distanceBetweenPoints(point, anotherPoint) {\n var x1 = point.x,\n y1 = point.y;\n var x2 = anotherPoint.x,\n y2 = anotherPoint.y;\n return Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2));\n};\nexport var getAngleOfPoint = function getAngleOfPoint(_ref, _ref2) {\n var x = _ref.x,\n y = _ref.y;\n var cx = _ref2.cx,\n cy = _ref2.cy;\n var radius = distanceBetweenPoints({\n x: x,\n y: y\n }, {\n x: cx,\n y: cy\n });\n\n if (radius <= 0) {\n return {\n radius: radius\n };\n }\n\n var cos = (x - cx) / radius;\n var angleInRadian = Math.acos(cos);\n\n if (y > cy) {\n angleInRadian = 2 * Math.PI - angleInRadian;\n }\n\n return {\n radius: radius,\n angle: radianToDegree(angleInRadian),\n angleInRadian: angleInRadian\n };\n};\nexport var formatAngleOfSector = function formatAngleOfSector(_ref3) {\n var startAngle = _ref3.startAngle,\n endAngle = _ref3.endAngle;\n var startCnt = Math.floor(startAngle / 360);\n var endCnt = Math.floor(endAngle / 360);\n var min = Math.min(startCnt, endCnt);\n return {\n startAngle: startAngle - min * 360,\n endAngle: endAngle - min * 360\n };\n};\n\nvar reverseFormatAngleOfSetor = function reverseFormatAngleOfSetor(angle, _ref4) {\n var startAngle = _ref4.startAngle,\n endAngle = _ref4.endAngle;\n var startCnt = Math.floor(startAngle / 360);\n var endCnt = Math.floor(endAngle / 360);\n var min = Math.min(startCnt, endCnt);\n return angle + min * 360;\n};\n\nexport var inRangeOfSector = function inRangeOfSector(_ref5, sector) {\n var x = _ref5.x,\n y = _ref5.y;\n\n var _getAngleOfPoint = getAngleOfPoint({\n x: x,\n y: y\n }, sector),\n radius = _getAngleOfPoint.radius,\n angle = _getAngleOfPoint.angle;\n\n var innerRadius = sector.innerRadius,\n outerRadius = sector.outerRadius;\n\n if (radius < innerRadius || radius > outerRadius) {\n return false;\n }\n\n if (radius === 0) {\n return true;\n }\n\n var _formatAngleOfSector = formatAngleOfSector(sector),\n startAngle = _formatAngleOfSector.startAngle,\n endAngle = _formatAngleOfSector.endAngle;\n\n var formatAngle = angle;\n var inRange;\n\n if (startAngle <= endAngle) {\n while (formatAngle > endAngle) {\n formatAngle -= 360;\n }\n\n while (formatAngle < startAngle) {\n formatAngle += 360;\n }\n\n inRange = formatAngle >= startAngle && formatAngle <= endAngle;\n } else {\n while (formatAngle > startAngle) {\n formatAngle -= 360;\n }\n\n while (formatAngle < endAngle) {\n formatAngle += 360;\n }\n\n inRange = formatAngle >= endAngle && formatAngle <= startAngle;\n }\n\n if (inRange) {\n return _objectSpread({}, sector, {\n radius: radius,\n angle: reverseFormatAngleOfSetor(formatAngle, sector)\n });\n }\n\n return null;\n};", "export function shallowEqual(a, b) {\n /* eslint-disable no-restricted-syntax */\n for (var key in a) {\n if ({}.hasOwnProperty.call(a, key) && (!{}.hasOwnProperty.call(b, key) || a[key] !== b[key])) {\n return false;\n }\n }\n\n for (var _key in b) {\n if ({}.hasOwnProperty.call(b, _key) && !{}.hasOwnProperty.call(a, _key)) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction shouldComponentUpdate(props, state) {\n return !shallowEqual(props, this.props) || !shallowEqual(state, this.state);\n}\n\nexport default function pureRenderDecorator(component) {\n // eslint-disable-next-line no-param-reassign\n component.prototype.shouldComponentUpdate = shouldComponentUpdate;\n}", - "import _isNil from \"lodash/isNil\";\nimport _isString from \"lodash/isString\";\nimport _isObject from \"lodash/isObject\";\nimport _isFunction from \"lodash/isFunction\";\nimport _isArray from \"lodash/isArray\";\n\nfunction _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); }\n\nfunction _nonIterableSpread() { throw new TypeError(\"Invalid attempt to spread non-iterable instance\"); }\n\nfunction _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === \"[object Arguments]\") return Array.from(iter); }\n\nfunction _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nimport React, { Children } from 'react';\nimport PropTypes from 'prop-types';\nimport { isNumber } from './DataUtils';\nimport { shallowEqual } from './PureRender';\nexport var PRESENTATION_ATTRIBUTES = {\n 'aria-current': PropTypes.string,\n // state\n 'aria-details': PropTypes.any,\n 'aria-disabled': PropTypes.any,\n // state\n 'aria-hidden': PropTypes.any,\n // state\n 'aria-invalid': PropTypes.any,\n // state\n 'aria-keyshortcuts': PropTypes.any,\n 'aria-label': PropTypes.any,\n 'aria-roledescription': PropTypes.any,\n // Widget Attributes\n 'aria-autocomplete': PropTypes.any,\n 'aria-checked': PropTypes.any,\n 'aria-expanded': PropTypes.any,\n 'aria-haspopup': PropTypes.any,\n 'aria-level': PropTypes.any,\n 'aria-modal': PropTypes.any,\n 'aria-multiline': PropTypes.any,\n 'aria-multiselectable': PropTypes.any,\n 'aria-orientation': PropTypes.any,\n 'aria-placeholder': PropTypes.any,\n 'aria-pressed': PropTypes.any,\n 'aria-readonly': PropTypes.any,\n 'aria-required': PropTypes.any,\n 'aria-selected': PropTypes.any,\n 'aria-sort': PropTypes.any,\n 'aria-valuemax': PropTypes.any,\n 'aria-valuemin': PropTypes.any,\n 'aria-valuenow': PropTypes.any,\n 'aria-valuetext': PropTypes.any,\n // Live Region Attributes\n 'aria-atomic': PropTypes.any,\n 'aria-busy': PropTypes.any,\n 'aria-live': PropTypes.any,\n 'aria-relevant': PropTypes.any,\n // Drag-and-Drop Attributes\n 'aria-dropeffect': PropTypes.any,\n 'aria-grabbed': PropTypes.any,\n // Relationship Attributes\n 'aria-activedescendant': PropTypes.any,\n 'aria-colcount': PropTypes.any,\n 'aria-colindex': PropTypes.any,\n 'aria-colspan': PropTypes.any,\n 'aria-controls': PropTypes.any,\n 'aria-describedby': PropTypes.any,\n 'aria-errormessage': PropTypes.any,\n 'aria-flowto': PropTypes.any,\n 'aria-labelledby': PropTypes.any,\n 'aria-owns': PropTypes.any,\n 'aria-posinset': PropTypes.any,\n 'aria-rowcount': PropTypes.any,\n 'aria-rowindex': PropTypes.any,\n 'aria-rowspan': PropTypes.any,\n 'aria-setsize': PropTypes.any,\n alignmentBaseline: PropTypes.string,\n angle: PropTypes.number,\n baselineShift: PropTypes.string,\n clip: PropTypes.string,\n clipPath: PropTypes.string,\n clipRule: PropTypes.string,\n color: PropTypes.string,\n colorInterpolation: PropTypes.string,\n colorInterpolationFilters: PropTypes.string,\n colorProfile: PropTypes.string,\n colorRendering: PropTypes.string,\n cursor: PropTypes.string,\n direction: PropTypes.oneOf(['ltr', 'rtl', 'inherit']),\n display: PropTypes.string,\n dominantBaseline: PropTypes.string,\n enableBackground: PropTypes.string,\n fill: PropTypes.string,\n fillOpacity: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n fillRule: PropTypes.oneOf(['nonzero', 'evenodd', 'inherit']),\n filter: PropTypes.string,\n floodColor: PropTypes.string,\n floodOpacity: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n font: PropTypes.string,\n fontFamily: PropTypes.string,\n fontSize: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n fontSizeAdjust: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n fontStretch: PropTypes.oneOf(['normal', 'wider', 'narrower', 'ultra-condensed', 'extra-condensed', 'condensed', 'semi-condensed', 'semi-expanded', 'expanded', 'extra-expanded', 'ultra-expanded', 'inherit']),\n fontStyle: PropTypes.oneOf(['normal', 'italic', 'oblique', 'inherit']),\n fontVariant: PropTypes.oneOf(['normal', 'small-caps', 'inherit']),\n fontWeight: PropTypes.oneOf(['normal', 'bold', 'bolder', 'lighter', 100, 200, 300, 400, 500, 600, 700, 800, 900, 'inherit']),\n glyphOrientationHorizontal: PropTypes.string,\n glyphOrientationVertical: PropTypes.string,\n imageRendering: PropTypes.oneOf(['auto', 'optimizeSpeed', 'optimizeQuality', 'inherit']),\n kerning: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n letterSpacing: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n lightingColor: PropTypes.string,\n lineHeight: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n markerEnd: PropTypes.string,\n markerMid: PropTypes.string,\n markerStart: PropTypes.string,\n mask: PropTypes.string,\n opacity: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n overflow: PropTypes.oneOf(['visible', 'hidden', 'scroll', 'auto', 'inherit']),\n pointerEvents: PropTypes.oneOf(['visiblePainted', 'visibleFill', 'visibleStroke', 'visible', 'painted', 'fill', 'stroke', 'all', 'none', 'inherit']),\n shapeRendering: PropTypes.oneOf(['auto', 'optimizeSpeed', 'crispEdges', 'geometricPrecision', 'inherit']),\n stopColor: PropTypes.string,\n stopOpacity: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n stroke: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n strokeDasharray: PropTypes.string,\n strokeDashoffset: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n strokeLinecap: PropTypes.oneOf(['butt', 'round', 'square', 'inherit']),\n strokeLinejoin: PropTypes.oneOf(['miter', 'round', 'bevel', 'inherit']),\n strokeMiterlimit: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n strokeOpacity: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n strokeWidth: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n textAnchor: PropTypes.oneOf(['start', 'middle', 'end', 'inherit']),\n textDecoration: PropTypes.oneOf(['none', 'underline', 'overline', 'line-through', 'blink', 'inherit']),\n textRendering: PropTypes.oneOf(['auto', 'optimizeSpeed', 'optimizeLegibility', 'geometricPrecision', 'inherit']),\n unicodeBidi: PropTypes.oneOf(['normal', 'embed', 'bidi-override', 'inherit']),\n visibility: PropTypes.oneOf(['visible', 'hidden', 'collapse', 'inherit']),\n wordSpacing: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n writingMode: PropTypes.oneOf(['lr-tb', 'rl-tb', 'tb-rl', 'lr', 'rl', 'tb', 'inherit']),\n transform: PropTypes.string,\n role: PropTypes.string,\n focusable: PropTypes.string,\n tabIndex: PropTypes.string,\n style: PropTypes.object,\n width: PropTypes.number,\n height: PropTypes.number,\n dx: PropTypes.number,\n dy: PropTypes.number,\n x: PropTypes.number,\n y: PropTypes.number,\n r: PropTypes.number,\n // The radius of Rectangle\n radius: PropTypes.oneOfType([PropTypes.number, PropTypes.array])\n};\nexport var EVENT_ATTRIBUTES = {\n onClick: PropTypes.func,\n onMouseDown: PropTypes.func,\n onMouseUp: PropTypes.func,\n onMouseOver: PropTypes.func,\n onMouseMove: PropTypes.func,\n onMouseOut: PropTypes.func,\n onMouseEnter: PropTypes.func,\n onMouseLeave: PropTypes.func,\n onTouchEnd: PropTypes.func,\n onTouchMove: PropTypes.func,\n onTouchStart: PropTypes.func,\n onTouchCancel: PropTypes.func\n};\nvar REACT_BROWSER_EVENT_MAP = {\n click: 'onClick',\n mousedown: 'onMouseDown',\n mouseup: 'onMouseUp',\n mouseover: 'onMouseOver',\n mousemove: 'onMouseMove',\n mouseout: 'onMouseOut',\n mouseenter: 'onMouseEnter',\n mouseleave: 'onMouseLeave',\n touchcancel: 'onTouchCancel',\n touchend: 'onTouchEnd',\n touchmove: 'onTouchMove',\n touchstart: 'onTouchStart'\n};\nexport var SCALE_TYPES = ['auto', 'linear', 'pow', 'sqrt', 'log', 'identity', 'time', 'band', 'point', 'ordinal', 'quantile', 'quantize', 'utc', 'sequential', 'threshold'];\nexport var LEGEND_TYPES = ['plainline', 'line', 'square', 'rect', 'circle', 'cross', 'diamond', 'star', 'triangle', 'wye', 'none'];\n/**\n * Get the display name of a component\n * @param {Object} Comp Specified Component\n * @return {String} Display name of Component\n */\n\nexport var getDisplayName = function getDisplayName(Comp) {\n if (typeof Comp === 'string') {\n return Comp;\n }\n\n if (!Comp) {\n return '';\n }\n\n return Comp.displayName || Comp.name || 'Component';\n};\n/*\n * Find and return all matched children by type. ` + ("`" + `type`))) + (("`" + (` can be a React element class or\n * string\n */\n\nexport var findAllByType = function findAllByType(children, type) {\n var result = [];\n var types = [];\n\n if (_isArray(type)) {\n types = type.map(function (t) {\n return getDisplayName(t);\n });\n } else {\n types = [getDisplayName(type)];\n }\n\n React.Children.forEach(children, function (child) {\n var childType = child && child.type && (child.type.displayName || child.type.name);\n\n if (types.indexOf(childType) !== -1) {\n result.push(child);\n }\n });\n return result;\n};\n/*\n * Return the first matched child by type, return null otherwise.\n * ` + "`")) + (`type` + ("`" + ` can be a React element class or string.\n */\n\nexport var findChildByType = function findChildByType(children, type) {\n var result = findAllByType(children, type);\n return result && result[0];\n};\n/*\n * Create a new array of children excluding the ones matched the type\n */\n\nexport var withoutType = function withoutType(children, type) {\n var newChildren = [];\n var types;\n\n if (_isArray(type)) {\n types = type.map(function (t) {\n return getDisplayName(t);\n });\n } else {\n types = [getDisplayName(type)];\n }\n\n React.Children.forEach(children, function (child) {\n if (child && child.type && child.type.displayName && types.indexOf(child.type.displayName) !== -1) {\n return;\n }\n\n newChildren.push(child);\n });\n return newChildren;\n};\n/**\n * get all the presentation attribute of svg element\n * @param {Object} el A react element or the props of a react element\n * @return {Object} attributes or null\n */\n\nexport var getPresentationAttributes = function getPresentationAttributes(el) {\n if (!el || _isFunction(el)) {\n return null;\n }\n\n var props = React.isValidElement(el) ? el.props : el;\n\n if (!_isObject(props)) {\n return null;\n }\n\n var out = null; // eslint-disable-next-line no-restricted-syntax\n\n for (var i in props) {\n if ({}.hasOwnProperty.call(props, i) && PRESENTATION_ATTRIBUTES[i]) {\n if (!out) out = {};\n out[i] = props[i];\n }\n }\n\n return out;\n};\n\nvar getEventHandlerOfElement = function getEventHandlerOfElement(originalHandler, props) {\n return function (e) {\n originalHandler(props, e);\n return null;\n };\n};\n/**\n * get all the event attribute of svg element\n * @param {Object} el A react element or the props of a react element\n * @param {Function} newHandler New handler of event\n * @param {Boolean} wrapCallback Wrap callback and return more parameters or not\n * @return {Object} attributes or null\n */\n\n\nexport var filterEventAttributes = function filterEventAttributes(el, newHandler) {\n var wrapCallback = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n if (!el || _isFunction(el)) {\n return null;\n }\n\n var props = React.isValidElement(el) ? el.props : el;\n\n if (!_isObject(props)) {\n return null;\n }\n\n var out = null; // eslint-disable-next-line no-restricted-syntax\n\n for (var i in props) {\n if ({}.hasOwnProperty.call(props, i) && EVENT_ATTRIBUTES[i]) {\n if (!out) out = {};\n out[i] = newHandler || (wrapCallback ? getEventHandlerOfElement(props[i], props) : props[i]);\n }\n }\n\n return out;\n};\n\nvar getEventHandlerOfChild = function getEventHandlerOfChild(originalHandler, data, index) {\n return function (e) {\n originalHandler(data, index, e);\n return null;\n };\n};\n\nexport var filterEventsOfChild = function filterEventsOfChild(props, data, index) {\n if (!_isObject(props)) {\n return null;\n }\n\n var out = null; // eslint-disable-next-line no-restricted-syntax\n\n for (var i in props) {\n if ({}.hasOwnProperty.call(props, i) && EVENT_ATTRIBUTES[i] && _isFunction(props[i])) {\n if (!out) out = {};\n out[i] = getEventHandlerOfChild(props[i], data, index);\n }\n }\n\n return out;\n};\n/**\n * validate the width and height props of a chart element\n * @param {Object} el A chart element\n * @return {Boolean} true If the props width and height are number, and greater than 0\n */\n\nexport var validateWidthHeight = function validateWidthHeight(el) {\n if (!el || !el.props) {\n return false;\n }\n\n var _el$props = el.props,\n width = _el$props.width,\n height = _el$props.height;\n\n if (!isNumber(width) || width <= 0 || !isNumber(height) || height <= 0) {\n return false;\n }\n\n return true;\n};\nexport var isSsr = function isSsr() {\n return !(typeof window !== 'undefined' && window.document && window.document.createElement && window.setTimeout);\n};\nvar 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'];\n\nvar isSvgElement = function isSvgElement(child) {\n return child && child.type && _isString(child.type) && SVG_TAGS.indexOf(child.type) >= 0;\n};\n/**\n * Filter all the svg elements of children\n * @param {Array} children The children of a react element\n * @return {Array} All the svg elements\n */\n\n\nexport var filterSvgElements = function filterSvgElements(children) {\n var svgElements = [];\n React.Children.forEach(children, function (entry) {\n if (entry && entry.type && _isString(entry.type) && SVG_TAGS.indexOf(entry.type) >= 0) {\n svgElements.push(entry);\n }\n });\n return svgElements;\n};\nexport var isSingleChildEqual = function isSingleChildEqual(nextChild, prevChild) {\n if (_isNil(nextChild) && _isNil(prevChild)) {\n return true;\n }\n\n if (!_isNil(nextChild) && !_isNil(prevChild)) {\n var _ref = nextChild.props || {},\n nextChildren = _ref.children,\n nextProps = _objectWithoutProperties(_ref, [\"children\"]);\n\n var _ref2 = prevChild.props || {},\n prevChildren = _ref2.children,\n prevProps = _objectWithoutProperties(_ref2, [\"children\"]);\n\n if (nextChildren && prevChildren) {\n // eslint-disable-next-line no-use-before-define\n return shallowEqual(nextProps, prevProps) && isChildrenEqual(nextChildren, prevChildren);\n }\n\n if (!nextChildren && !prevChildren) {\n return shallowEqual(nextProps, prevProps);\n }\n\n return false;\n }\n\n return false;\n};\n/**\n * Wether props of children changed\n * @param {Object} nextChildren The latest children\n * @param {Object} prevChildren The prev children\n * @return {Boolean} equal or not\n */\n\nexport var isChildrenEqual = function isChildrenEqual(nextChildren, prevChildren) {\n if (nextChildren === prevChildren) {\n return true;\n }\n\n if (Children.count(nextChildren) !== Children.count(prevChildren)) {\n return false;\n }\n\n var count = Children.count(nextChildren);\n\n if (count === 0) {\n return true;\n }\n\n if (count === 1) {\n return isSingleChildEqual(_isArray(nextChildren) ? nextChildren[0] : nextChildren, _isArray(prevChildren) ? prevChildren[0] : prevChildren);\n }\n\n for (var i = 0; i < count; i++) {\n var nextChild = nextChildren[i];\n var prevChild = prevChildren[i];\n\n if (_isArray(nextChild) || _isArray(prevChild)) {\n if (!isChildrenEqual(nextChild, prevChild)) {\n return false;\n }\n } else if (!isSingleChildEqual(nextChild, prevChild)) {\n return false;\n }\n }\n\n return true;\n};\nexport var renderByOrder = function renderByOrder(children, renderMap) {\n var elements = [];\n var record = {};\n Children.forEach(children, function (child, index) {\n if (child && isSvgElement(child)) {\n elements.push(child);\n } else if (child && renderMap[getDisplayName(child.type)]) {\n var displayName = getDisplayName(child.type);\n var _renderMap$displayNam = renderMap[displayName],\n handler = _renderMap$displayNam.handler,\n once = _renderMap$displayNam.once;\n\n if (once && !record[displayName] || !once) {\n var results = handler(child, displayName, index);\n\n if (_isArray(results)) {\n elements = [elements].concat(_toConsumableArray(results));\n } else {\n elements.push(results);\n }\n\n record[displayName] = true;\n }\n }\n });\n return elements;\n};\nexport var getReactEventByType = function getReactEventByType(e) {\n var type = e && e.type;\n\n if (type && REACT_BROWSER_EVENT_MAP[type]) {\n return REACT_BROWSER_EVENT_MAP[type];\n }\n\n return null;\n};\nexport var parseChildIndex = function parseChildIndex(child, children) {\n var result = -1;\n Children.forEach(children, function (entry, index) {\n if (entry === child) {\n result = index;\n }\n });\n return result;\n};", - "require('../modules/es6.math.acosh');\nrequire('../modules/es6.math.asinh');\nrequire('../modules/es6.math.atanh');\nrequire('../modules/es6.math.cbrt');\nrequire('../modules/es6.math.clz32');\nrequire('../modules/es6.math.cosh');\nrequire('../modules/es6.math.expm1');\nrequire('../modules/es6.math.fround');\nrequire('../modules/es6.math.hypot');\nrequire('../modules/es6.math.imul');\nrequire('../modules/es6.math.log10');\nrequire('../modules/es6.math.log1p');\nrequire('../modules/es6.math.log2');\nrequire('../modules/es6.math.sign');\nrequire('../modules/es6.math.sinh');\nrequire('../modules/es6.math.tanh');\nrequire('../modules/es6.math.trunc');\nmodule.exports = require('../modules/_core').Math;\n", - "require('../modules/es6.number.constructor');\nrequire('../modules/es6.number.to-fixed');\nrequire('../modules/es6.number.to-precision');\nrequire('../modules/es6.number.epsilon');\nrequire('../modules/es6.number.is-finite');\nrequire('../modules/es6.number.is-integer');\nrequire('../modules/es6.number.is-nan');\nrequire('../modules/es6.number.is-safe-integer');\nrequire('../modules/es6.number.max-safe-integer');\nrequire('../modules/es6.number.min-safe-integer');\nrequire('../modules/es6.number.parse-float');\nrequire('../modules/es6.number.parse-int');\nmodule.exports = require('../modules/_core').Number;\n", - "module.exports = function (it) {\n if (typeof it != 'function') throw TypeError(it + ' is not a function!');\n return it;\n};\n", - "var cof = require('./_cof');\nmodule.exports = function (it, msg) {\n if (typeof it != 'number' && cof(it) != 'Number') throw TypeError(msg);\n return +it;\n};\n", - "var isObject = require('./_is-object');\nmodule.exports = function (it) {\n if (!isObject(it)) throw TypeError(it + ' is not an object!');\n return it;\n};\n", - "// false -> Array#indexOf\n// true -> Array#includes\nvar toIObject = require('./_to-iobject');\nvar toLength = require('./_to-length');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nmodule.exports = function (IS_INCLUDES) {\n return function ($this, el, fromIndex) {\n var O = toIObject($this);\n var length = toLength(O.length);\n var index = toAbsoluteIndex(fromIndex, length);\n var value;\n // Array#includes uses SameValueZero equality algorithm\n // eslint-disable-next-line no-self-compare\n if (IS_INCLUDES && el != el) while (length > index) {\n value = O[index++];\n // eslint-disable-next-line no-self-compare\n if (value != value) return true;\n // Array#indexOf ignores holes, Array#includes - not\n } else for (;length > index; index++) if (IS_INCLUDES || index in O) {\n if (O[index] === el) return IS_INCLUDES || index || 0;\n } return !IS_INCLUDES && -1;\n };\n};\n", - "var toString = {}.toString;\n\nmodule.exports = function (it) {\n return toString.call(it).slice(8, -1);\n};\n", - "var core = module.exports = { version: '2.5.7' };\nif (typeof __e == 'number') __e = core; // eslint-disable-line no-undef\n", - "// optional / simple context binding\nvar aFunction = require('./_a-function');\nmodule.exports = function (fn, that, length) {\n aFunction(fn);\n if (that === undefined) return fn;\n switch (length) {\n case 1: return function (a) {\n return fn.call(that, a);\n };\n case 2: return function (a, b) {\n return fn.call(that, a, b);\n };\n case 3: return function (a, b, c) {\n return fn.call(that, a, b, c);\n };\n }\n return function (/* ...args */) {\n return fn.apply(that, arguments);\n };\n};\n", - "// 7.2.1 RequireObjectCoercible(argument)\nmodule.exports = function (it) {\n if (it == undefined) throw TypeError(\"Can't call method on \" + it);\n return it;\n};\n", - "// Thank's IE8 for his funny defineProperty\nmodule.exports = !require('./_fails')(function () {\n return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;\n});\n", - "var isObject = require('./_is-object');\nvar document = require('./_global').document;\n// typeof document.createElement is 'object' in old IE\nvar is = isObject(document) && isObject(document.createElement);\nmodule.exports = function (it) {\n return is ? document.createElement(it) : {};\n};\n", - "// IE 8- don't enum bug keys\nmodule.exports = (\n 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'\n).split(',');\n", - "var global = require('./_global');\nvar core = require('./_core');\nvar hide = require('./_hide');\nvar redefine = require('./_redefine');\nvar ctx = require('./_ctx');\nvar PROTOTYPE = 'prototype';\n\nvar $export = function (type, name, source) {\n var IS_FORCED = type & $export.F;\n var IS_GLOBAL = type & $export.G;\n var IS_STATIC = type & $export.S;\n var IS_PROTO = type & $export.P;\n var IS_BIND = type & $export.B;\n var target = IS_GLOBAL ? global : IS_STATIC ? global[name] || (global[name] = {}) : (global[name] || {})[PROTOTYPE];\n var exports = IS_GLOBAL ? core : core[name] || (core[name] = {});\n var expProto = exports[PROTOTYPE] || (exports[PROTOTYPE] = {});\n var key, own, out, exp;\n if (IS_GLOBAL) source = name;\n for (key in source) {\n // contains in native\n own = !IS_FORCED && target && target[key] !== undefined;\n // export native or passed\n out = (own ? target : source)[key];\n // bind timers to global for call from export context\n exp = IS_BIND && own ? ctx(out, global) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;\n // extend global\n if (target) redefine(target, key, out, type & $export.U);\n // export\n if (exports[key] != out) hide(exports, key, exp);\n if (IS_PROTO && expProto[key] != out) expProto[key] = out;\n }\n};\nglobal.core = core;\n// type bitmap\n$export.F = 1; // forced\n$export.G = 2; // global\n$export.S = 4; // static\n$export.P = 8; // proto\n$export.B = 16; // bind\n$export.W = 32; // wrap\n$export.U = 64; // safe\n$export.R = 128; // real proto method for `)))) + ((("`" + `library`) + ("`" + (`\nmodule.exports = $export;\n", - "module.exports = function (exec) {\n try {\n return !!exec();\n } catch (e) {\n return true;\n }\n};\n", - "// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nvar global = module.exports = typeof window != 'undefined' && window.Math == Math\n ? window : typeof self != 'undefined' && self.Math == Math ? self\n // eslint-disable-next-line no-new-func\n : Function('return this')();\nif (typeof __g == 'number') __g = global; // eslint-disable-line no-undef\n", - "var hasOwnProperty = {}.hasOwnProperty;\nmodule.exports = function (it, key) {\n return hasOwnProperty.call(it, key);\n};\n", - "var dP = require('./_object-dp');\nvar createDesc = require('./_property-desc');\nmodule.exports = require('./_descriptors') ? function (object, key, value) {\n return dP.f(object, key, createDesc(1, value));\n} : function (object, key, value) {\n object[key] = value;\n return object;\n};\n", - "var document = require('./_global').document;\nmodule.exports = document && document.documentElement;\n", - "module.exports = !require('./_descriptors') && !require('./_fails')(function () {\n return Object.defineProperty(require('./_dom-create')('div'), 'a', { get: function () { return 7; } }).a != 7;\n});\n", - "var isObject = require('./_is-object');\nvar setPrototypeOf = require('./_set-proto').set;\nmodule.exports = function (that, target, C) {\n var S = target.constructor;\n var P;\n if (S !== C && typeof S == 'function' && (P = S.prototype) !== C.prototype && isObject(P) && setPrototypeOf) {\n setPrototypeOf(that, P);\n } return that;\n};\n", - "// fallback for non-array-like ES3 and non-enumerable old V8 strings\nvar cof = require('./_cof');\n// eslint-disable-next-line no-prototype-builtins\nmodule.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) {\n return cof(it) == 'String' ? it.split('') : Object(it);\n};\n", - "// 20.1.2.3 Number.isInteger(number)\nvar isObject = require('./_is-object');\nvar floor = Math.floor;\nmodule.exports = function isInteger(it) {\n return !isObject(it) && isFinite(it) && floor(it) === it;\n};\n", - "module.exports = function (it) {\n return typeof it === 'object' ? it !== null : typeof it === 'function';\n};\n", - "module.exports = false;\n", - "// 20.2.2.14 Math.expm1(x)\nvar $expm1 = Math.expm1;\nmodule.exports = (!$expm1\n // Old FF bug\n || $expm1(10) > 22025.465794806719 || $expm1(10) < 22025.4657948067165168\n // Tor Browser bug\n || $expm1(-2e-17) != -2e-17\n) ? function expm1(x) {\n return (x = +x) == 0 ? x : x > -1e-6 && x < 1e-6 ? x + x * x / 2 : Math.exp(x) - 1;\n} : $expm1;\n", - "// 20.2.2.16 Math.fround(x)\nvar sign = require('./_math-sign');\nvar pow = Math.pow;\nvar EPSILON = pow(2, -52);\nvar EPSILON32 = pow(2, -23);\nvar MAX32 = pow(2, 127) * (2 - EPSILON32);\nvar MIN32 = pow(2, -126);\n\nvar roundTiesToEven = function (n) {\n return n + 1 / EPSILON - 1 / EPSILON;\n};\n\nmodule.exports = Math.fround || function fround(x) {\n var $abs = Math.abs(x);\n var $sign = sign(x);\n var a, result;\n if ($abs < MIN32) return $sign * roundTiesToEven($abs / MIN32 / EPSILON32) * MIN32 * EPSILON32;\n a = (1 + EPSILON32 / EPSILON) * $abs;\n result = a - (a - $abs);\n // eslint-disable-next-line no-self-compare\n if (result > MAX32 || result != result) return $sign * Infinity;\n return $sign * result;\n};\n", - "// 20.2.2.20 Math.log1p(x)\nmodule.exports = Math.log1p || function log1p(x) {\n return (x = +x) > -1e-8 && x < 1e-8 ? x - x * x / 2 : Math.log(1 + x);\n};\n", - "// 20.2.2.28 Math.sign(x)\nmodule.exports = Math.sign || function sign(x) {\n // eslint-disable-next-line no-self-compare\n return (x = +x) == 0 || x != x ? x : x < 0 ? -1 : 1;\n};\n", - "// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])\nvar anObject = require('./_an-object');\nvar dPs = require('./_object-dps');\nvar enumBugKeys = require('./_enum-bug-keys');\nvar IE_PROTO = require('./_shared-key')('IE_PROTO');\nvar Empty = function () { /* empty */ };\nvar PROTOTYPE = 'prototype';\n\n// Create object with fake ` + "`"))) + ((`null` + ("`" + ` prototype: use iframe Object with cleared prototype\nvar createDict = function () {\n // Thrash, waste and sodomy: IE GC bug\n var iframe = require('./_dom-create')('iframe');\n var i = enumBugKeys.length;\n var lt = '<';\n var gt = '>';\n var iframeDocument;\n iframe.style.display = 'none';\n require('./_html').appendChild(iframe);\n iframe.src = 'javascript:'; // eslint-disable-line no-script-url\n // createDict = iframe.contentWindow.Object;\n // html.removeChild(iframe);\n iframeDocument = iframe.contentWindow.document;\n iframeDocument.open();\n iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);\n iframeDocument.close();\n createDict = iframeDocument.F;\n while (i--) delete createDict[PROTOTYPE][enumBugKeys[i]];\n return createDict();\n};\n\nmodule.exports = Object.create || function create(O, Properties) {\n var result;\n if (O !== null) {\n Empty[PROTOTYPE] = anObject(O);\n result = new Empty();\n Empty[PROTOTYPE] = null;\n // add \"__proto__\" for Object.getPrototypeOf polyfill\n result[IE_PROTO] = O;\n } else result = createDict();\n return Properties === undefined ? result : dPs(result, Properties);\n};\n", - "var anObject = require('./_an-object');\nvar IE8_DOM_DEFINE = require('./_ie8-dom-define');\nvar toPrimitive = require('./_to-primitive');\nvar dP = Object.defineProperty;\n\nexports.f = require('./_descriptors') ? Object.defineProperty : function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPrimitive(P, true);\n anObject(Attributes);\n if (IE8_DOM_DEFINE) try {\n return dP(O, P, Attributes);\n } catch (e) { /* empty */ }\n if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');\n if ('value' in Attributes) O[P] = Attributes.value;\n return O;\n};\n", - "var dP = require('./_object-dp');\nvar anObject = require('./_an-object');\nvar getKeys = require('./_object-keys');\n\nmodule.exports = require('./_descriptors') ? Object.defineProperties : function defineProperties(O, Properties) {\n anObject(O);\n var keys = getKeys(Properties);\n var length = keys.length;\n var i = 0;\n var P;\n while (length > i) dP.f(O, P = keys[i++], Properties[P]);\n return O;\n};\n", - "var pIE = require('./_object-pie');\nvar createDesc = require('./_property-desc');\nvar toIObject = require('./_to-iobject');\nvar toPrimitive = require('./_to-primitive');\nvar has = require('./_has');\nvar IE8_DOM_DEFINE = require('./_ie8-dom-define');\nvar gOPD = Object.getOwnPropertyDescriptor;\n\nexports.f = require('./_descriptors') ? gOPD : function getOwnPropertyDescriptor(O, P) {\n O = toIObject(O);\n P = toPrimitive(P, true);\n if (IE8_DOM_DEFINE) try {\n return gOPD(O, P);\n } catch (e) { /* empty */ }\n if (has(O, P)) return createDesc(!pIE.f.call(O, P), O[P]);\n};\n", - "// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)\nvar $keys = require('./_object-keys-internal');\nvar hiddenKeys = require('./_enum-bug-keys').concat('length', 'prototype');\n\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n return $keys(O, hiddenKeys);\n};\n", - "var has = require('./_has');\nvar toIObject = require('./_to-iobject');\nvar arrayIndexOf = require('./_array-includes')(false);\nvar IE_PROTO = require('./_shared-key')('IE_PROTO');\n\nmodule.exports = function (object, names) {\n var O = toIObject(object);\n var i = 0;\n var result = [];\n var key;\n for (key in O) if (key != IE_PROTO) has(O, key) && result.push(key);\n // Don't enum bug & hidden keys\n while (names.length > i) if (has(O, key = names[i++])) {\n ~arrayIndexOf(result, key) || result.push(key);\n }\n return result;\n};\n", - "// 19.1.2.14 / 15.2.3.14 Object.keys(O)\nvar $keys = require('./_object-keys-internal');\nvar enumBugKeys = require('./_enum-bug-keys');\n\nmodule.exports = Object.keys || function keys(O) {\n return $keys(O, enumBugKeys);\n};\n", - "exports.f = {}.propertyIsEnumerable;\n", - "var $parseFloat = require('./_global').parseFloat;\nvar $trim = require('./_string-trim').trim;\n\nmodule.exports = 1 / $parseFloat(require('./_string-ws') + '-0') !== -Infinity ? function parseFloat(str) {\n var string = $trim(String(str), 3);\n var result = $parseFloat(string);\n return result === 0 && string.charAt(0) == '-' ? -0 : result;\n} : $parseFloat;\n", - "var $parseInt = require('./_global').parseInt;\nvar $trim = require('./_string-trim').trim;\nvar ws = require('./_string-ws');\nvar hex = /^[-+]?0[xX]/;\n\nmodule.exports = $parseInt(ws + '08') !== 8 || $parseInt(ws + '0x16') !== 22 ? function parseInt(str, radix) {\n var string = $trim(String(str), 3);\n return $parseInt(string, (radix >>> 0) || (hex.test(string) ? 16 : 10));\n} : $parseInt;\n", - "module.exports = function (bitmap, value) {\n return {\n enumerable: !(bitmap & 1),\n configurable: !(bitmap & 2),\n writable: !(bitmap & 4),\n value: value\n };\n};\n", - "var global = require('./_global');\nvar hide = require('./_hide');\nvar has = require('./_has');\nvar SRC = require('./_uid')('src');\nvar TO_STRING = 'toString';\nvar $toString = Function[TO_STRING];\nvar TPL = ('' + $toString).split(TO_STRING);\n\nrequire('./_core').inspectSource = function (it) {\n return $toString.call(it);\n};\n\n(module.exports = function (O, key, val, safe) {\n var isFunction = typeof val == 'function';\n if (isFunction) has(val, 'name') || hide(val, 'name', key);\n if (O[key] === val) return;\n if (isFunction) has(val, SRC) || hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key)));\n if (O === global) {\n O[key] = val;\n } else if (!safe) {\n delete O[key];\n hide(O, key, val);\n } else if (O[key]) {\n O[key] = val;\n } else {\n hide(O, key, val);\n }\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n})(Function.prototype, TO_STRING, function toString() {\n return typeof this == 'function' && this[SRC] || $toString.call(this);\n});\n", - "// Works with __proto__ only. Old v8 can't work with null proto objects.\n/* eslint-disable no-proto */\nvar isObject = require('./_is-object');\nvar anObject = require('./_an-object');\nvar check = function (O, proto) {\n anObject(O);\n if (!isObject(proto) && proto !== null) throw TypeError(proto + \": can't set as prototype!\");\n};\nmodule.exports = {\n set: Object.setPrototypeOf || ('__proto__' in {} ? // eslint-disable-line\n function (test, buggy, set) {\n try {\n set = require('./_ctx')(Function.call, require('./_object-gopd').f(Object.prototype, '__proto__').set, 2);\n set(test, []);\n buggy = !(test instanceof Array);\n } catch (e) { buggy = true; }\n return function setPrototypeOf(O, proto) {\n check(O, proto);\n if (buggy) O.__proto__ = proto;\n else set(O, proto);\n return O;\n };\n }({}, false) : undefined),\n check: check\n};\n", - "var shared = require('./_shared')('keys');\nvar uid = require('./_uid');\nmodule.exports = function (key) {\n return shared[key] || (shared[key] = uid(key));\n};\n", - "var core = require('./_core');\nvar global = require('./_global');\nvar SHARED = '__core-js_shared__';\nvar store = global[SHARED] || (global[SHARED] = {});\n\n(module.exports = function (key, value) {\n return store[key] || (store[key] = value !== undefined ? value : {});\n})('versions', []).push({\n version: core.version,\n mode: require('./_library') ? 'pure' : 'global',\n copyright: '© 2018 Denis Pushkarev (zloirock.ru)'\n});\n", - "'use strict';\nvar toInteger = require('./_to-integer');\nvar defined = require('./_defined');\n\nmodule.exports = function repeat(count) {\n var str = String(defined(this));\n var res = '';\n var n = toInteger(count);\n if (n < 0 || n == Infinity) throw RangeError(\"Count can't be negative\");\n for (;n > 0; (n >>>= 1) && (str += str)) if (n & 1) res += str;\n return res;\n};\n", - "var $export = require('./_export');\nvar defined = require('./_defined');\nvar fails = require('./_fails');\nvar spaces = require('./_string-ws');\nvar space = '[' + spaces + ']';\nvar non = '\\u200b\\u0085';\nvar ltrim = RegExp('^' + space + space + '*');\nvar rtrim = RegExp(space + space + '*$');\n\nvar exporter = function (KEY, exec, ALIAS) {\n var exp = {};\n var FORCE = fails(function () {\n return !!spaces[KEY]() || non[KEY]() != non;\n });\n var fn = exp[KEY] = FORCE ? exec(trim) : spaces[KEY];\n if (ALIAS) exp[ALIAS] = fn;\n $export($export.P + $export.F * FORCE, 'String', exp);\n};\n\n// 1 -> String#trimLeft\n// 2 -> String#trimRight\n// 3 -> String#trim\nvar trim = exporter.trim = function (string, TYPE) {\n string = String(defined(string));\n if (TYPE & 1) string = string.replace(ltrim, '');\n if (TYPE & 2) string = string.replace(rtrim, '');\n return string;\n};\n\nmodule.exports = exporter;\n", - "module.exports = '\\x09\\x0A\\x0B\\x0C\\x0D\\x20\\xA0\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003' +\n '\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\\u2029\\uFEFF';\n", - "var toInteger = require('./_to-integer');\nvar max = Math.max;\nvar min = Math.min;\nmodule.exports = function (index, length) {\n index = toInteger(index);\n return index < 0 ? max(index + length, 0) : min(index, length);\n};\n", - "// 7.1.4 ToInteger\nvar ceil = Math.ceil;\nvar floor = Math.floor;\nmodule.exports = function (it) {\n return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);\n};\n", - "// to indexed object, toObject with fallback for non-array-like ES3 strings\nvar IObject = require('./_iobject');\nvar defined = require('./_defined');\nmodule.exports = function (it) {\n return IObject(defined(it));\n};\n", - "// 7.1.15 ToLength\nvar toInteger = require('./_to-integer');\nvar min = Math.min;\nmodule.exports = function (it) {\n return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991\n};\n", - "// 7.1.1 ToPrimitive(input [, PreferredType])\nvar isObject = require('./_is-object');\n// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n// and the second argument - flag - preferred type is a string\nmodule.exports = function (it, S) {\n if (!isObject(it)) return it;\n var fn, val;\n if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val;\n if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n throw TypeError(\"Can't convert object to primitive value\");\n};\n", - "var id = 0;\nvar px = Math.random();\nmodule.exports = function (key) {\n return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));\n};\n", - "// 20.2.2.3 Math.acosh(x)\nvar $export = require('./_export');\nvar log1p = require('./_math-log1p');\nvar sqrt = Math.sqrt;\nvar $acosh = Math.acosh;\n\n$export($export.S + $export.F * !($acosh\n // V8 bug: https://code.google.com/p/v8/issues/detail?id=3509\n && Math.floor($acosh(Number.MAX_VALUE)) == 710\n // Tor Browser bug: Math.acosh(Infinity) -> NaN\n && $acosh(Infinity) == Infinity\n), 'Math', {\n acosh: function acosh(x) {\n return (x = +x) < 1 ? NaN : x > 94906265.62425156\n ? Math.log(x) + Math.LN2\n : log1p(x - 1 + sqrt(x - 1) * sqrt(x + 1));\n }\n});\n", - "// 20.2.2.5 Math.asinh(x)\nvar $export = require('./_export');\nvar $asinh = Math.asinh;\n\nfunction asinh(x) {\n return !isFinite(x = +x) || x == 0 ? x : x < 0 ? -asinh(-x) : Math.log(x + Math.sqrt(x * x + 1));\n}\n\n// Tor Browser bug: Math.asinh(0) -> -0\n$export($export.S + $export.F * !($asinh && 1 / $asinh(0) > 0), 'Math', { asinh: asinh });\n", - "// 20.2.2.7 Math.atanh(x)\nvar $export = require('./_export');\nvar $atanh = Math.atanh;\n\n// Tor Browser bug: Math.atanh(-0) -> 0\n$export($export.S + $export.F * !($atanh && 1 / $atanh(-0) < 0), 'Math', {\n atanh: function atanh(x) {\n return (x = +x) == 0 ? x : Math.log((1 + x) / (1 - x)) / 2;\n }\n});\n", - "// 20.2.2.9 Math.cbrt(x)\nvar $export = require('./_export');\nvar sign = require('./_math-sign');\n\n$export($export.S, 'Math', {\n cbrt: function cbrt(x) {\n return sign(x = +x) * Math.pow(Math.abs(x), 1 / 3);\n }\n});\n", - "// 20.2.2.11 Math.clz32(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', {\n clz32: function clz32(x) {\n return (x >>>= 0) ? 31 - Math.floor(Math.log(x + 0.5) * Math.LOG2E) : 32;\n }\n});\n", - "// 20.2.2.12 Math.cosh(x)\nvar $export = require('./_export');\nvar exp = Math.exp;\n\n$export($export.S, 'Math', {\n cosh: function cosh(x) {\n return (exp(x = +x) + exp(-x)) / 2;\n }\n});\n", - "// 20.2.2.14 Math.expm1(x)\nvar $export = require('./_export');\nvar $expm1 = require('./_math-expm1');\n\n$export($export.S + $export.F * ($expm1 != Math.expm1), 'Math', { expm1: $expm1 });\n", - "// 20.2.2.16 Math.fround(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', { fround: require('./_math-fround') });\n", - "// 20.2.2.17 Math.hypot([value1[, value2[, … ]]])\nvar $export = require('./_export');\nvar abs = Math.abs;\n\n$export($export.S, 'Math', {\n hypot: function hypot(value1, value2) { // eslint-disable-line no-unused-vars\n var sum = 0;\n var i = 0;\n var aLen = arguments.length;\n var larg = 0;\n var arg, div;\n while (i < aLen) {\n arg = abs(arguments[i++]);\n if (larg < arg) {\n div = larg / arg;\n sum = sum * div * div + 1;\n larg = arg;\n } else if (arg > 0) {\n div = arg / larg;\n sum += div * div;\n } else sum += arg;\n }\n return larg === Infinity ? Infinity : larg * Math.sqrt(sum);\n }\n});\n", - "// 20.2.2.18 Math.imul(x, y)\nvar $export = require('./_export');\nvar $imul = Math.imul;\n\n// some WebKit versions fails with big numbers, some has wrong arity\n$export($export.S + $export.F * require('./_fails')(function () {\n return $imul(0xffffffff, 5) != -5 || $imul.length != 2;\n}), 'Math', {\n imul: function imul(x, y) {\n var UINT16 = 0xffff;\n var xn = +x;\n var yn = +y;\n var xl = UINT16 & xn;\n var yl = UINT16 & yn;\n return 0 | xl * yl + ((UINT16 & xn >>> 16) * yl + xl * (UINT16 & yn >>> 16) << 16 >>> 0);\n }\n});\n", - "// 20.2.2.21 Math.log10(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', {\n log10: function log10(x) {\n return Math.log(x) * Math.LOG10E;\n }\n});\n", - "// 20.2.2.20 Math.log1p(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', { log1p: require('./_math-log1p') });\n", - "// 20.2.2.22 Math.log2(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', {\n log2: function log2(x) {\n return Math.log(x) / Math.LN2;\n }\n});\n", - "// 20.2.2.28 Math.sign(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', { sign: require('./_math-sign') });\n", - "// 20.2.2.30 Math.sinh(x)\nvar $export = require('./_export');\nvar expm1 = require('./_math-expm1');\nvar exp = Math.exp;\n\n// V8 near Chromium 38 has a problem with very small numbers\n$export($export.S + $export.F * require('./_fails')(function () {\n return !Math.sinh(-2e-17) != -2e-17;\n}), 'Math', {\n sinh: function sinh(x) {\n return Math.abs(x = +x) < 1\n ? (expm1(x) - expm1(-x)) / 2\n : (exp(x - 1) - exp(-x - 1)) * (Math.E / 2);\n }\n});\n", - "// 20.2.2.33 Math.tanh(x)\nvar $export = require('./_export');\nvar expm1 = require('./_math-expm1');\nvar exp = Math.exp;\n\n$export($export.S, 'Math', {\n tanh: function tanh(x) {\n var a = expm1(x = +x);\n var b = expm1(-x);\n return a == Infinity ? 1 : b == Infinity ? -1 : (a - b) / (exp(x) + exp(-x));\n }\n});\n", - "// 20.2.2.34 Math.trunc(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', {\n trunc: function trunc(it) {\n return (it > 0 ? Math.floor : Math.ceil)(it);\n }\n});\n", - "'use strict';\nvar global = require('./_global');\nvar has = require('./_has');\nvar cof = require('./_cof');\nvar inheritIfRequired = require('./_inherit-if-required');\nvar toPrimitive = require('./_to-primitive');\nvar fails = require('./_fails');\nvar gOPN = require('./_object-gopn').f;\nvar gOPD = require('./_object-gopd').f;\nvar dP = require('./_object-dp').f;\nvar $trim = require('./_string-trim').trim;\nvar NUMBER = 'Number';\nvar $Number = global[NUMBER];\nvar Base = $Number;\nvar proto = $Number.prototype;\n// Opera ~12 has broken Object#toString\nvar BROKEN_COF = cof(require('./_object-create')(proto)) == NUMBER;\nvar TRIM = 'trim' in String.prototype;\n\n// 7.1.3 ToNumber(argument)\nvar toNumber = function (argument) {\n var it = toPrimitive(argument, false);\n if (typeof it == 'string' && it.length > 2) {\n it = TRIM ? it.trim() : $trim(it, 3);\n var first = it.charCodeAt(0);\n var third, radix, maxCode;\n if (first === 43 || first === 45) {\n third = it.charCodeAt(2);\n if (third === 88 || third === 120) return NaN; // Number('+0x1') should be NaN, old V8 fix\n } else if (first === 48) {\n switch (it.charCodeAt(1)) {\n case 66: case 98: radix = 2; maxCode = 49; break; // fast equal /^0b[01]+$/i\n case 79: case 111: radix = 8; maxCode = 55; break; // fast equal /^0o[0-7]+$/i\n default: return +it;\n }\n for (var digits = it.slice(2), i = 0, l = digits.length, code; i < l; i++) {\n code = digits.charCodeAt(i);\n // parseInt parses a string to a first unavailable symbol\n // but ToNumber should return NaN if a string contains unavailable symbols\n if (code < 48 || code > maxCode) return NaN;\n } return parseInt(digits, radix);\n }\n } return +it;\n};\n\nif (!$Number(' 0o1') || !$Number('0b1') || $Number('+0x1')) {\n $Number = function Number(value) {\n var it = arguments.length < 1 ? 0 : value;\n var that = this;\n return that instanceof $Number\n // check on 1..constructor(foo) case\n && (BROKEN_COF ? fails(function () { proto.valueOf.call(that); }) : cof(that) != NUMBER)\n ? inheritIfRequired(new Base(toNumber(it)), that, $Number) : toNumber(it);\n };\n for (var keys = require('./_descriptors') ? gOPN(Base) : (\n // ES3:\n 'MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,' +\n // ES6 (in case, if modules with ES6 Number statics required before):\n 'EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,' +\n 'MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger'\n ).split(','), j = 0, key; keys.length > j; j++) {\n if (has(Base, key = keys[j]) && !has($Number, key)) {\n dP($Number, key, gOPD(Base, key));\n }\n }\n $Number.prototype = proto;\n proto.constructor = $Number;\n require('./_redefine')(global, NUMBER, $Number);\n}\n", - "// 20.1.2.1 Number.EPSILON\nvar $export = require('./_export');\n\n$export($export.S, 'Number', { EPSILON: Math.pow(2, -52) });\n", - "// 20.1.2.2 Number.isFinite(number)\nvar $export = require('./_export');\nvar _isFinite = require('./_global').isFinite;\n\n$export($export.S, 'Number', {\n isFinite: function isFinite(it) {\n return typeof it == 'number' && _isFinite(it);\n }\n});\n", - "// 20.1.2.3 Number.isInteger(number)\nvar $export = require('./_export');\n\n$export($export.S, 'Number', { isInteger: require('./_is-integer') });\n", - "// 20.1.2.4 Number.isNaN(number)\nvar $export = require('./_export');\n\n$export($export.S, 'Number', {\n isNaN: function isNaN(number) {\n // eslint-disable-next-line no-self-compare\n return number != number;\n }\n});\n", - "// 20.1.2.5 Number.isSafeInteger(number)\nvar $export = require('./_export');\nvar isInteger = require('./_is-integer');\nvar abs = Math.abs;\n\n$export($export.S, 'Number', {\n isSafeInteger: function isSafeInteger(number) {\n return isInteger(number) && abs(number) <= 0x1fffffffffffff;\n }\n});\n", - "// 20.1.2.6 Number.MAX_SAFE_INTEGER\nvar $export = require('./_export');\n\n$export($export.S, 'Number', { MAX_SAFE_INTEGER: 0x1fffffffffffff });\n", - "// 20.1.2.10 Number.MIN_SAFE_INTEGER\nvar $export = require('./_export');\n\n$export($export.S, 'Number', { MIN_SAFE_INTEGER: -0x1fffffffffffff });\n", - "var $export = require('./_export');\nvar $parseFloat = require('./_parse-float');\n// 20.1.2.12 Number.parseFloat(string)\n$export($export.S + $export.F * (Number.parseFloat != $parseFloat), 'Number', { parseFloat: $parseFloat });\n", - "var $export = require('./_export');\nvar $parseInt = require('./_parse-int');\n// 20.1.2.13 Number.parseInt(string, radix)\n$export($export.S + $export.F * (Number.parseInt != $parseInt), 'Number', { parseInt: $parseInt });\n", - "'use strict';\nvar $export = require('./_export');\nvar toInteger = require('./_to-integer');\nvar aNumberValue = require('./_a-number-value');\nvar repeat = require('./_string-repeat');\nvar $toFixed = 1.0.toFixed;\nvar floor = Math.floor;\nvar data = [0, 0, 0, 0, 0, 0];\nvar ERROR = 'Number.toFixed: incorrect invocation!';\nvar ZERO = '0';\n\nvar multiply = function (n, c) {\n var i = -1;\n var c2 = c;\n while (++i < 6) {\n c2 += n * data[i];\n data[i] = c2 % 1e7;\n c2 = floor(c2 / 1e7);\n }\n};\nvar divide = function (n) {\n var i = 6;\n var c = 0;\n while (--i >= 0) {\n c += data[i];\n data[i] = floor(c / n);\n c = (c % n) * 1e7;\n }\n};\nvar numToString = function () {\n var i = 6;\n var s = '';\n while (--i >= 0) {\n if (s !== '' || i === 0 || data[i] !== 0) {\n var t = String(data[i]);\n s = s === '' ? t : s + repeat.call(ZERO, 7 - t.length) + t;\n }\n } return s;\n};\nvar pow = function (x, n, acc) {\n return n === 0 ? acc : n % 2 === 1 ? pow(x, n - 1, acc * x) : pow(x * x, n / 2, acc);\n};\nvar log = function (x) {\n var n = 0;\n var x2 = x;\n while (x2 >= 4096) {\n n += 12;\n x2 /= 4096;\n }\n while (x2 >= 2) {\n n += 1;\n x2 /= 2;\n } return n;\n};\n\n$export($export.P + $export.F * (!!$toFixed && (\n 0.00008.toFixed(3) !== '0.000' ||\n 0.9.toFixed(0) !== '1' ||\n 1.255.toFixed(2) !== '1.25' ||\n 1000000000000000128.0.toFixed(0) !== '1000000000000000128'\n) || !require('./_fails')(function () {\n // V8 ~ Android 4.3-\n $toFixed.call({});\n})), 'Number', {\n toFixed: function toFixed(fractionDigits) {\n var x = aNumberValue(this, ERROR);\n var f = toInteger(fractionDigits);\n var s = '';\n var m = ZERO;\n var e, z, j, k;\n if (f < 0 || f > 20) throw RangeError(ERROR);\n // eslint-disable-next-line no-self-compare\n if (x != x) return 'NaN';\n if (x <= -1e21 || x >= 1e21) return String(x);\n if (x < 0) {\n s = '-';\n x = -x;\n }\n if (x > 1e-21) {\n e = log(x * pow(2, 69, 1)) - 69;\n z = e < 0 ? x * pow(2, -e, 1) : x / pow(2, e, 1);\n z *= 0x10000000000000;\n e = 52 - e;\n if (e > 0) {\n multiply(0, z);\n j = f;\n while (j >= 7) {\n multiply(1e7, 0);\n j -= 7;\n }\n multiply(pow(10, j, 1), 0);\n j = e - 1;\n while (j >= 23) {\n divide(1 << 23);\n j -= 23;\n }\n divide(1 << j);\n multiply(1, 1);\n divide(2);\n m = numToString();\n } else {\n multiply(0, z);\n multiply(1 << -e, 0);\n m = numToString() + repeat.call(ZERO, f);\n }\n }\n if (f > 0) {\n k = m.length;\n m = s + (k <= f ? '0.' + repeat.call(ZERO, f - k) + m : m.slice(0, k - f) + '.' + m.slice(k - f));\n } else {\n m = s + m;\n } return m;\n }\n});\n", - "'use strict';\nvar $export = require('./_export');\nvar $fails = require('./_fails');\nvar aNumberValue = require('./_a-number-value');\nvar $toPrecision = 1.0.toPrecision;\n\n$export($export.P + $export.F * ($fails(function () {\n // IE7-\n return $toPrecision.call(1, undefined) !== '1';\n}) || !$fails(function () {\n // V8 ~ Android 4.3-\n $toPrecision.call({});\n})), 'Number', {\n toPrecision: function toPrecision(precision) {\n var that = aNumberValue(this, 'Number#toPrecision: incorrect invocation!');\n return precision === undefined ? $toPrecision.call(that) : $toPrecision.call(that, precision);\n }\n});\n", - "/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = require('./lib/ReactPropTypesSecret');\n\nfunction emptyFunction() {}\n\nmodule.exports = function() {\n function shim(props, propName, componentName, location, propFullName, secret) {\n if (secret === ReactPropTypesSecret) {\n // It is still safe when called from React.\n return;\n }\n var err = new Error(\n 'Calling PropTypes validators directly is not supported by the `)) + ("`" + (`prop-types` + "`")))))) + (((((` package. ' +\n 'Use PropTypes.checkPropTypes() to call them. ' +\n 'Read more at http://fb.me/use-check-prop-types'\n );\n err.name = 'Invariant Violation';\n throw err;\n };\n shim.isRequired = shim;\n function getShim() {\n return shim;\n };\n // Important!\n // Keep this list in sync with production version in ` + "`") + (`./factoryWithTypeCheckers.js` + ("`" + `.\n var ReactPropTypes = {\n array: shim,\n bool: shim,\n func: shim,\n number: shim,\n object: shim,\n string: shim,\n symbol: shim,\n\n any: shim,\n arrayOf: getShim,\n element: shim,\n instanceOf: getShim,\n node: shim,\n objectOf: getShim,\n oneOf: getShim,\n oneOfType: getShim,\n shape: getShim,\n exact: getShim\n };\n\n ReactPropTypes.checkPropTypes = emptyFunction;\n ReactPropTypes.PropTypes = ReactPropTypes;\n\n return ReactPropTypes;\n};\n", - "/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nif (process.env.NODE_ENV !== 'production') {\n var REACT_ELEMENT_TYPE = (typeof Symbol === 'function' &&\n Symbol.for &&\n Symbol.for('react.element')) ||\n 0xeac7;\n\n var isValidElement = function(object) {\n return typeof object === 'object' &&\n object !== null &&\n object.$$typeof === REACT_ELEMENT_TYPE;\n };\n\n // By explicitly using `))) + (("`" + (`prop-types` + "`")) + (` you are opting into new development behavior.\n // http://fb.me/prop-types-in-prod\n var throwOnDirectAccess = true;\n module.exports = require('./factoryWithTypeCheckers')(isValidElement, throwOnDirectAccess);\n} else {\n // By explicitly using ` + ("`" + `prop-types`)))) + ((("`" + ` you are opting into new production behavior.\n // http://fb.me/prop-types-in-prod\n module.exports = require('./factoryWithThrowingShims')();\n}\n", + "import _isNil from \"lodash/isNil\";\nimport _isString from \"lodash/isString\";\nimport _isObject from \"lodash/isObject\";\nimport _isFunction from \"lodash/isFunction\";\nimport _isArray from \"lodash/isArray\";\n\nfunction _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); }\n\nfunction _nonIterableSpread() { throw new TypeError(\"Invalid attempt to spread non-iterable instance\"); }\n\nfunction _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === \"[object Arguments]\") return Array.from(iter); }\n\nfunction _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nimport React, { Children } from 'react';\nimport PropTypes from 'prop-types';\nimport { isNumber } from './DataUtils';\nimport { shallowEqual } from './PureRender';\nexport var PRESENTATION_ATTRIBUTES = {\n 'aria-current': PropTypes.string,\n // state\n 'aria-details': PropTypes.any,\n 'aria-disabled': PropTypes.any,\n // state\n 'aria-hidden': PropTypes.any,\n // state\n 'aria-invalid': PropTypes.any,\n // state\n 'aria-keyshortcuts': PropTypes.any,\n 'aria-label': PropTypes.any,\n 'aria-roledescription': PropTypes.any,\n // Widget Attributes\n 'aria-autocomplete': PropTypes.any,\n 'aria-checked': PropTypes.any,\n 'aria-expanded': PropTypes.any,\n 'aria-haspopup': PropTypes.any,\n 'aria-level': PropTypes.any,\n 'aria-modal': PropTypes.any,\n 'aria-multiline': PropTypes.any,\n 'aria-multiselectable': PropTypes.any,\n 'aria-orientation': PropTypes.any,\n 'aria-placeholder': PropTypes.any,\n 'aria-pressed': PropTypes.any,\n 'aria-readonly': PropTypes.any,\n 'aria-required': PropTypes.any,\n 'aria-selected': PropTypes.any,\n 'aria-sort': PropTypes.any,\n 'aria-valuemax': PropTypes.any,\n 'aria-valuemin': PropTypes.any,\n 'aria-valuenow': PropTypes.any,\n 'aria-valuetext': PropTypes.any,\n // Live Region Attributes\n 'aria-atomic': PropTypes.any,\n 'aria-busy': PropTypes.any,\n 'aria-live': PropTypes.any,\n 'aria-relevant': PropTypes.any,\n // Drag-and-Drop Attributes\n 'aria-dropeffect': PropTypes.any,\n 'aria-grabbed': PropTypes.any,\n // Relationship Attributes\n 'aria-activedescendant': PropTypes.any,\n 'aria-colcount': PropTypes.any,\n 'aria-colindex': PropTypes.any,\n 'aria-colspan': PropTypes.any,\n 'aria-controls': PropTypes.any,\n 'aria-describedby': PropTypes.any,\n 'aria-errormessage': PropTypes.any,\n 'aria-flowto': PropTypes.any,\n 'aria-labelledby': PropTypes.any,\n 'aria-owns': PropTypes.any,\n 'aria-posinset': PropTypes.any,\n 'aria-rowcount': PropTypes.any,\n 'aria-rowindex': PropTypes.any,\n 'aria-rowspan': PropTypes.any,\n 'aria-setsize': PropTypes.any,\n alignmentBaseline: PropTypes.string,\n angle: PropTypes.number,\n baselineShift: PropTypes.string,\n clip: PropTypes.string,\n clipPath: PropTypes.string,\n clipRule: PropTypes.string,\n color: PropTypes.string,\n colorInterpolation: PropTypes.string,\n colorInterpolationFilters: PropTypes.string,\n colorProfile: PropTypes.string,\n colorRendering: PropTypes.string,\n cursor: PropTypes.string,\n direction: PropTypes.oneOf(['ltr', 'rtl', 'inherit']),\n display: PropTypes.string,\n dominantBaseline: PropTypes.string,\n enableBackground: PropTypes.string,\n fill: PropTypes.string,\n fillOpacity: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n fillRule: PropTypes.oneOf(['nonzero', 'evenodd', 'inherit']),\n filter: PropTypes.string,\n floodColor: PropTypes.string,\n floodOpacity: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n font: PropTypes.string,\n fontFamily: PropTypes.string,\n fontSize: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n fontSizeAdjust: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n fontStretch: PropTypes.oneOf(['normal', 'wider', 'narrower', 'ultra-condensed', 'extra-condensed', 'condensed', 'semi-condensed', 'semi-expanded', 'expanded', 'extra-expanded', 'ultra-expanded', 'inherit']),\n fontStyle: PropTypes.oneOf(['normal', 'italic', 'oblique', 'inherit']),\n fontVariant: PropTypes.oneOf(['normal', 'small-caps', 'inherit']),\n fontWeight: PropTypes.oneOf(['normal', 'bold', 'bolder', 'lighter', 100, 200, 300, 400, 500, 600, 700, 800, 900, 'inherit']),\n glyphOrientationHorizontal: PropTypes.string,\n glyphOrientationVertical: PropTypes.string,\n imageRendering: PropTypes.oneOf(['auto', 'optimizeSpeed', 'optimizeQuality', 'inherit']),\n kerning: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n letterSpacing: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n lightingColor: PropTypes.string,\n lineHeight: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n markerEnd: PropTypes.string,\n markerMid: PropTypes.string,\n markerStart: PropTypes.string,\n mask: PropTypes.string,\n opacity: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n overflow: PropTypes.oneOf(['visible', 'hidden', 'scroll', 'auto', 'inherit']),\n pointerEvents: PropTypes.oneOf(['visiblePainted', 'visibleFill', 'visibleStroke', 'visible', 'painted', 'fill', 'stroke', 'all', 'none', 'inherit']),\n shapeRendering: PropTypes.oneOf(['auto', 'optimizeSpeed', 'crispEdges', 'geometricPrecision', 'inherit']),\n stopColor: PropTypes.string,\n stopOpacity: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n stroke: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n strokeDasharray: PropTypes.string,\n strokeDashoffset: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n strokeLinecap: PropTypes.oneOf(['butt', 'round', 'square', 'inherit']),\n strokeLinejoin: PropTypes.oneOf(['miter', 'round', 'bevel', 'inherit']),\n strokeMiterlimit: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n strokeOpacity: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n strokeWidth: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n textAnchor: PropTypes.oneOf(['start', 'middle', 'end', 'inherit']),\n textDecoration: PropTypes.oneOf(['none', 'underline', 'overline', 'line-through', 'blink', 'inherit']),\n textRendering: PropTypes.oneOf(['auto', 'optimizeSpeed', 'optimizeLegibility', 'geometricPrecision', 'inherit']),\n unicodeBidi: PropTypes.oneOf(['normal', 'embed', 'bidi-override', 'inherit']),\n visibility: PropTypes.oneOf(['visible', 'hidden', 'collapse', 'inherit']),\n wordSpacing: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n writingMode: PropTypes.oneOf(['lr-tb', 'rl-tb', 'tb-rl', 'lr', 'rl', 'tb', 'inherit']),\n transform: PropTypes.string,\n role: PropTypes.string,\n focusable: PropTypes.string,\n tabIndex: PropTypes.string,\n style: PropTypes.object,\n width: PropTypes.number,\n height: PropTypes.number,\n dx: PropTypes.number,\n dy: PropTypes.number,\n x: PropTypes.number,\n y: PropTypes.number,\n r: PropTypes.number,\n // The radius of Rectangle\n radius: PropTypes.oneOfType([PropTypes.number, PropTypes.array])\n};\nexport var EVENT_ATTRIBUTES = {\n onClick: PropTypes.func,\n onMouseDown: PropTypes.func,\n onMouseUp: PropTypes.func,\n onMouseOver: PropTypes.func,\n onMouseMove: PropTypes.func,\n onMouseOut: PropTypes.func,\n onMouseEnter: PropTypes.func,\n onMouseLeave: PropTypes.func,\n onTouchEnd: PropTypes.func,\n onTouchMove: PropTypes.func,\n onTouchStart: PropTypes.func,\n onTouchCancel: PropTypes.func\n};\nvar REACT_BROWSER_EVENT_MAP = {\n click: 'onClick',\n mousedown: 'onMouseDown',\n mouseup: 'onMouseUp',\n mouseover: 'onMouseOver',\n mousemove: 'onMouseMove',\n mouseout: 'onMouseOut',\n mouseenter: 'onMouseEnter',\n mouseleave: 'onMouseLeave',\n touchcancel: 'onTouchCancel',\n touchend: 'onTouchEnd',\n touchmove: 'onTouchMove',\n touchstart: 'onTouchStart'\n};\nexport var SCALE_TYPES = ['auto', 'linear', 'pow', 'sqrt', 'log', 'identity', 'time', 'band', 'point', 'ordinal', 'quantile', 'quantize', 'utc', 'sequential', 'threshold'];\nexport var LEGEND_TYPES = ['plainline', 'line', 'square', 'rect', 'circle', 'cross', 'diamond', 'star', 'triangle', 'wye', 'none'];\n/**\n * Get the display name of a component\n * @param {Object} Comp Specified Component\n * @return {String} Display name of Component\n */\n\nexport var getDisplayName = function getDisplayName(Comp) {\n if (typeof Comp === 'string') {\n return Comp;\n }\n\n if (!Comp) {\n return '';\n }\n\n return Comp.displayName || Comp.name || 'Component';\n};\n/*\n * Find and return all matched children by type. ` + ("`" + `type`)) + (("`" + ` can be a React element class or\n * string\n */\n\nexport var findAllByType = function findAllByType(children, type) {\n var result = [];\n var types = [];\n\n if (_isArray(type)) {\n types = type.map(function (t) {\n return getDisplayName(t);\n });\n } else {\n types = [getDisplayName(type)];\n }\n\n React.Children.forEach(children, function (child) {\n var childType = child && child.type && (child.type.displayName || child.type.name);\n\n if (types.indexOf(childType) !== -1) {\n result.push(child);\n }\n });\n return result;\n};\n/*\n * Return the first matched child by type, return null otherwise.\n * `) + ("`" + `type`)))))) + ((((("`" + (` can be a React element class or string.\n */\n\nexport var findChildByType = function findChildByType(children, type) {\n var result = findAllByType(children, type);\n return result && result[0];\n};\n/*\n * Create a new array of children excluding the ones matched the type\n */\n\nexport var withoutType = function withoutType(children, type) {\n var newChildren = [];\n var types;\n\n if (_isArray(type)) {\n types = type.map(function (t) {\n return getDisplayName(t);\n });\n } else {\n types = [getDisplayName(type)];\n }\n\n React.Children.forEach(children, function (child) {\n if (child && child.type && child.type.displayName && types.indexOf(child.type.displayName) !== -1) {\n return;\n }\n\n newChildren.push(child);\n });\n return newChildren;\n};\n/**\n * get all the presentation attribute of svg element\n * @param {Object} el A react element or the props of a react element\n * @return {Object} attributes or null\n */\n\nexport var getPresentationAttributes = function getPresentationAttributes(el) {\n if (!el || _isFunction(el)) {\n return null;\n }\n\n var props = React.isValidElement(el) ? el.props : el;\n\n if (!_isObject(props)) {\n return null;\n }\n\n var out = null; // eslint-disable-next-line no-restricted-syntax\n\n for (var i in props) {\n if ({}.hasOwnProperty.call(props, i) && PRESENTATION_ATTRIBUTES[i]) {\n if (!out) out = {};\n out[i] = props[i];\n }\n }\n\n return out;\n};\n\nvar getEventHandlerOfElement = function getEventHandlerOfElement(originalHandler, props) {\n return function (e) {\n originalHandler(props, e);\n return null;\n };\n};\n/**\n * get all the event attribute of svg element\n * @param {Object} el A react element or the props of a react element\n * @param {Function} newHandler New handler of event\n * @param {Boolean} wrapCallback Wrap callback and return more parameters or not\n * @return {Object} attributes or null\n */\n\n\nexport var filterEventAttributes = function filterEventAttributes(el, newHandler) {\n var wrapCallback = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n if (!el || _isFunction(el)) {\n return null;\n }\n\n var props = React.isValidElement(el) ? el.props : el;\n\n if (!_isObject(props)) {\n return null;\n }\n\n var out = null; // eslint-disable-next-line no-restricted-syntax\n\n for (var i in props) {\n if ({}.hasOwnProperty.call(props, i) && EVENT_ATTRIBUTES[i]) {\n if (!out) out = {};\n out[i] = newHandler || (wrapCallback ? getEventHandlerOfElement(props[i], props) : props[i]);\n }\n }\n\n return out;\n};\n\nvar getEventHandlerOfChild = function getEventHandlerOfChild(originalHandler, data, index) {\n return function (e) {\n originalHandler(data, index, e);\n return null;\n };\n};\n\nexport var filterEventsOfChild = function filterEventsOfChild(props, data, index) {\n if (!_isObject(props)) {\n return null;\n }\n\n var out = null; // eslint-disable-next-line no-restricted-syntax\n\n for (var i in props) {\n if ({}.hasOwnProperty.call(props, i) && EVENT_ATTRIBUTES[i] && _isFunction(props[i])) {\n if (!out) out = {};\n out[i] = getEventHandlerOfChild(props[i], data, index);\n }\n }\n\n return out;\n};\n/**\n * validate the width and height props of a chart element\n * @param {Object} el A chart element\n * @return {Boolean} true If the props width and height are number, and greater than 0\n */\n\nexport var validateWidthHeight = function validateWidthHeight(el) {\n if (!el || !el.props) {\n return false;\n }\n\n var _el$props = el.props,\n width = _el$props.width,\n height = _el$props.height;\n\n if (!isNumber(width) || width <= 0 || !isNumber(height) || height <= 0) {\n return false;\n }\n\n return true;\n};\nexport var isSsr = function isSsr() {\n return !(typeof window !== 'undefined' && window.document && window.document.createElement && window.setTimeout);\n};\nvar 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'];\n\nvar isSvgElement = function isSvgElement(child) {\n return child && child.type && _isString(child.type) && SVG_TAGS.indexOf(child.type) >= 0;\n};\n/**\n * Filter all the svg elements of children\n * @param {Array} children The children of a react element\n * @return {Array} All the svg elements\n */\n\n\nexport var filterSvgElements = function filterSvgElements(children) {\n var svgElements = [];\n React.Children.forEach(children, function (entry) {\n if (entry && entry.type && _isString(entry.type) && SVG_TAGS.indexOf(entry.type) >= 0) {\n svgElements.push(entry);\n }\n });\n return svgElements;\n};\nexport var isSingleChildEqual = function isSingleChildEqual(nextChild, prevChild) {\n if (_isNil(nextChild) && _isNil(prevChild)) {\n return true;\n }\n\n if (!_isNil(nextChild) && !_isNil(prevChild)) {\n var _ref = nextChild.props || {},\n nextChildren = _ref.children,\n nextProps = _objectWithoutProperties(_ref, [\"children\"]);\n\n var _ref2 = prevChild.props || {},\n prevChildren = _ref2.children,\n prevProps = _objectWithoutProperties(_ref2, [\"children\"]);\n\n if (nextChildren && prevChildren) {\n // eslint-disable-next-line no-use-before-define\n return shallowEqual(nextProps, prevProps) && isChildrenEqual(nextChildren, prevChildren);\n }\n\n if (!nextChildren && !prevChildren) {\n return shallowEqual(nextProps, prevProps);\n }\n\n return false;\n }\n\n return false;\n};\n/**\n * Wether props of children changed\n * @param {Object} nextChildren The latest children\n * @param {Object} prevChildren The prev children\n * @return {Boolean} equal or not\n */\n\nexport var isChildrenEqual = function isChildrenEqual(nextChildren, prevChildren) {\n if (nextChildren === prevChildren) {\n return true;\n }\n\n if (Children.count(nextChildren) !== Children.count(prevChildren)) {\n return false;\n }\n\n var count = Children.count(nextChildren);\n\n if (count === 0) {\n return true;\n }\n\n if (count === 1) {\n return isSingleChildEqual(_isArray(nextChildren) ? nextChildren[0] : nextChildren, _isArray(prevChildren) ? prevChildren[0] : prevChildren);\n }\n\n for (var i = 0; i < count; i++) {\n var nextChild = nextChildren[i];\n var prevChild = prevChildren[i];\n\n if (_isArray(nextChild) || _isArray(prevChild)) {\n if (!isChildrenEqual(nextChild, prevChild)) {\n return false;\n }\n } else if (!isSingleChildEqual(nextChild, prevChild)) {\n return false;\n }\n }\n\n return true;\n};\nexport var renderByOrder = function renderByOrder(children, renderMap) {\n var elements = [];\n var record = {};\n Children.forEach(children, function (child, index) {\n if (child && isSvgElement(child)) {\n elements.push(child);\n } else if (child && renderMap[getDisplayName(child.type)]) {\n var displayName = getDisplayName(child.type);\n var _renderMap$displayNam = renderMap[displayName],\n handler = _renderMap$displayNam.handler,\n once = _renderMap$displayNam.once;\n\n if (once && !record[displayName] || !once) {\n var results = handler(child, displayName, index);\n\n if (_isArray(results)) {\n elements = [elements].concat(_toConsumableArray(results));\n } else {\n elements.push(results);\n }\n\n record[displayName] = true;\n }\n }\n });\n return elements;\n};\nexport var getReactEventByType = function getReactEventByType(e) {\n var type = e && e.type;\n\n if (type && REACT_BROWSER_EVENT_MAP[type]) {\n return REACT_BROWSER_EVENT_MAP[type];\n }\n\n return null;\n};\nexport var parseChildIndex = function parseChildIndex(child, children) {\n var result = -1;\n Children.forEach(children, function (entry, index) {\n if (entry === child) {\n result = index;\n }\n });\n return result;\n};", + "/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = require('./lib/ReactPropTypesSecret');\n\nfunction emptyFunction() {}\n\nmodule.exports = function() {\n function shim(props, propName, componentName, location, propFullName, secret) {\n if (secret === ReactPropTypesSecret) {\n // It is still safe when called from React.\n return;\n }\n var err = new Error(\n 'Calling PropTypes validators directly is not supported by the ` + "`")) + (`prop-types` + ("`" + ` package. ' +\n 'Use PropTypes.checkPropTypes() to call them. ' +\n 'Read more at http://fb.me/use-check-prop-types'\n );\n err.name = 'Invariant Violation';\n throw err;\n };\n shim.isRequired = shim;\n function getShim() {\n return shim;\n };\n // Important!\n // Keep this list in sync with production version in `))) + (("`" + (`./factoryWithTypeCheckers.js` + "`")) + (`.\n var ReactPropTypes = {\n array: shim,\n bool: shim,\n func: shim,\n number: shim,\n object: shim,\n string: shim,\n symbol: shim,\n\n any: shim,\n arrayOf: getShim,\n element: shim,\n instanceOf: getShim,\n node: shim,\n objectOf: getShim,\n oneOf: getShim,\n oneOfType: getShim,\n shape: getShim,\n exact: getShim\n };\n\n ReactPropTypes.checkPropTypes = emptyFunction;\n ReactPropTypes.PropTypes = ReactPropTypes;\n\n return ReactPropTypes;\n};\n", + "/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nif (process.env.NODE_ENV !== 'production') {\n var REACT_ELEMENT_TYPE = (typeof Symbol === 'function' &&\n Symbol.for &&\n Symbol.for('react.element')) ||\n 0xeac7;\n\n var isValidElement = function(object) {\n return typeof object === 'object' &&\n object !== null &&\n object.$$typeof === REACT_ELEMENT_TYPE;\n };\n\n // By explicitly using ` + ("`" + `prop-types`)))) + ((("`" + (` you are opting into new development behavior.\n // http://fb.me/prop-types-in-prod\n var throwOnDirectAccess = true;\n module.exports = require('./factoryWithTypeCheckers')(isValidElement, throwOnDirectAccess);\n} else {\n // By explicitly using ` + "`")) + (`prop-types` + ("`" + ` you are opting into new production behavior.\n // http://fb.me/prop-types-in-prod\n module.exports = require('./factoryWithThrowingShims')();\n}\n", "/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';\n\nmodule.exports = ReactPropTypesSecret;\n", "/**\n * Module dependencies\n */\nvar balanced = require(\"balanced-match\")\nvar reduceFunctionCall = require(\"reduce-function-call\")\nvar mexp = require(\"math-expression-evaluator\")\n\n/**\n * Constantes\n */\nvar MAX_STACK = 100 // should be enough for a single calc()...\nvar NESTED_CALC_RE = /(\\+|\\-|\\*|\\\\|[^a-z]|)(\\s*)(\\()/g\n\n/**\n * Global variables\n */\nvar stack\n\n/**\n * Expose reduceCSSCalc plugin\n *\n * @type {Function}\n */\nmodule.exports = reduceCSSCalc\n\n/**\n * Reduce CSS calc() in a string, whenever it's possible\n *\n * @param {String} value css input\n */\nfunction reduceCSSCalc(value, decimalPrecision) {\n stack = 0\n decimalPrecision = Math.pow(10, decimalPrecision === undefined ? 5 : decimalPrecision)\n\n // Allow calc() on multiple lines\n value = value.replace(/\\n+/g, \" \")\n\n /**\n * Evaluates an expression\n *\n * @param {String} expression\n * @returns {String}\n */\n function evaluateExpression (expression, functionIdentifier, call) {\n if (stack++ > MAX_STACK) {\n stack = 0\n throw new Error(\"Call stack overflow for \" + call)\n }\n\n if (expression === \"\") {\n throw new Error(functionIdentifier + \"(): '\" + call + \"' must contain a non-whitespace string\")\n }\n\n expression = evaluateNestedExpression(expression, call)\n\n var units = getUnitsInExpression(expression)\n\n // If the expression contains multiple units or CSS variables,\n // then let the expression be (i.e. browser calc())\n if (units.length > 1 || expression.indexOf(\"var(\") > -1) {\n return functionIdentifier + \"(\" + expression + \")\"\n }\n\n var unit = units[0] || \"\"\n\n if (unit === \"%\") {\n // Convert percentages to numbers, to handle expressions like: 50% * 50% (will become: 25%):\n // console.log(expression)\n expression = expression.replace(/\\b[0-9\\.]+%/g, function(percent) {\n return parseFloat(percent.slice(0, -1)) * 0.01\n })\n }\n\n // Remove units in expression:\n var toEvaluate = expression.replace(new RegExp(unit, \"gi\"), \"\")\n var result\n\n try {\n result = mexp.eval(toEvaluate)\n }\n catch (e) {\n return functionIdentifier + \"(\" + expression + \")\"\n }\n\n // Transform back to a percentage result:\n if (unit === \"%\") {\n result *= 100\n }\n\n // adjust rounding shit\n // (0.1 * 0.2 === 0.020000000000000004)\n if (functionIdentifier.length || unit === \"%\") {\n result = Math.round(result * decimalPrecision) / decimalPrecision\n }\n\n // Add unit\n result += unit\n\n return result\n }\n\n /**\n * Evaluates nested expressions\n *\n * @param {String} expression\n * @returns {String}\n */\n function evaluateNestedExpression(expression, call) {\n // Remove the calc part from nested expressions to ensure\n // better browser compatibility\n expression = expression.replace(/((?:\\-[a-z]+\\-)?calc)/g, \"\")\n var evaluatedPart = \"\"\n var nonEvaluatedPart = expression\n var matches\n while ((matches = NESTED_CALC_RE.exec(nonEvaluatedPart))) {\n if (matches[0].index > 0) {\n evaluatedPart += nonEvaluatedPart.substring(0, matches[0].index)\n }\n\n var balancedExpr = balanced(\"(\", \")\", nonEvaluatedPart.substring([0].index))\n if (balancedExpr.body === \"\") {\n throw new Error(\"'\" + expression + \"' must contain a non-whitespace string\")\n }\n\n var evaluated = evaluateExpression(balancedExpr.body, \"\", call)\n\n evaluatedPart += balancedExpr.pre + evaluated\n nonEvaluatedPart = balancedExpr.post\n }\n\n return evaluatedPart + nonEvaluatedPart\n }\n\n return reduceFunctionCall(value, /((?:\\-[a-z]+\\-)?calc)\\(/, evaluateExpression)\n}\n\n/**\n * Checks what units are used in an expression\n *\n * @param {String} expression\n * @returns {Array}\n */\n\nfunction getUnitsInExpression(expression) {\n var uniqueUnits = []\n var uniqueLowerCaseUnits = []\n var unitRegEx = /[\\.0-9]([%a-z]+)/gi\n var matches = unitRegEx.exec(expression)\n\n while (matches) {\n if (!matches || !matches[1]) {\n continue\n }\n\n if (uniqueLowerCaseUnits.indexOf(matches[1].toLowerCase()) === -1) {\n uniqueUnits.push(matches[1])\n uniqueLowerCaseUnits.push(matches[1].toLowerCase())\n }\n\n matches = unitRegEx.exec(expression)\n }\n\n return uniqueUnits\n}\n", - "/*\n * Module dependencies\n */\nvar balanced = require(\"balanced-match\")\n\n/**\n * Expose `) + ("`" + (`reduceFunctionCall` + "`"))) + ((`\n *\n * @type {Function}\n */\nmodule.exports = reduceFunctionCall\n\n/**\n * Walkthrough all expressions, evaluate them and insert them into the declaration\n *\n * @param {Array} expressions\n * @param {Object} declaration\n */\n\nfunction reduceFunctionCall(string, functionRE, callback) {\n var call = string\n return getFunctionCalls(string, functionRE).reduce(function(string, obj) {\n return string.replace(obj.functionIdentifier + \"(\" + obj.matches.body + \")\", evalFunctionCall(obj.matches.body, obj.functionIdentifier, callback, call, functionRE))\n }, string)\n}\n\n/**\n * Parses expressions in a value\n *\n * @param {String} value\n * @returns {Array}\n * @api private\n */\n\nfunction getFunctionCalls(call, functionRE) {\n var expressions = []\n\n var fnRE = typeof functionRE === \"string\" ? new RegExp(\"\\\\b(\" + functionRE + \")\\\\(\") : functionRE\n do {\n var searchMatch = fnRE.exec(call)\n if (!searchMatch) {\n return expressions\n }\n if (searchMatch[1] === undefined) {\n throw new Error(\"Missing the first couple of parenthesis to get the function identifier in \" + functionRE)\n }\n var fn = searchMatch[1]\n var startIndex = searchMatch.index\n var matches = balanced(\"(\", \")\", call.substring(startIndex))\n\n if (!matches || matches.start !== searchMatch[0].length - 1) {\n throw new SyntaxError(fn + \"(): missing closing ')' in the value '\" + call + \"'\")\n }\n\n expressions.push({matches: matches, functionIdentifier: fn})\n call = matches.post\n }\n while (fnRE.test(call))\n\n return expressions\n}\n\n/**\n * Evaluates an expression\n *\n * @param {String} expression\n * @returns {String}\n * @api private\n */\n\nfunction evalFunctionCall (string, functionIdentifier, callback, call, functionRE) {\n // allow recursivity\n return callback(reduceFunctionCall(string, functionRE, callback), functionIdentifier, call)\n}\n", + "/*\n * Module dependencies\n */\nvar balanced = require(\"balanced-match\")\n\n/**\n * Expose `))) + (("`" + (`reduceFunctionCall` + "`")) + ((`\n *\n * @type {Function}\n */\nmodule.exports = reduceFunctionCall\n\n/**\n * Walkthrough all expressions, evaluate them and insert them into the declaration\n *\n * @param {Array} expressions\n * @param {Object} declaration\n */\n\nfunction reduceFunctionCall(string, functionRE, callback) {\n var call = string\n return getFunctionCalls(string, functionRE).reduce(function(string, obj) {\n return string.replace(obj.functionIdentifier + \"(\" + obj.matches.body + \")\", evalFunctionCall(obj.matches.body, obj.functionIdentifier, callback, call, functionRE))\n }, string)\n}\n\n/**\n * Parses expressions in a value\n *\n * @param {String} value\n * @returns {Array}\n * @api private\n */\n\nfunction getFunctionCalls(call, functionRE) {\n var expressions = []\n\n var fnRE = typeof functionRE === \"string\" ? new RegExp(\"\\\\b(\" + functionRE + \")\\\\(\") : functionRE\n do {\n var searchMatch = fnRE.exec(call)\n if (!searchMatch) {\n return expressions\n }\n if (searchMatch[1] === undefined) {\n throw new Error(\"Missing the first couple of parenthesis to get the function identifier in \" + functionRE)\n }\n var fn = searchMatch[1]\n var startIndex = searchMatch.index\n var matches = balanced(\"(\", \")\", call.substring(startIndex))\n\n if (!matches || matches.start !== searchMatch[0].length - 1) {\n throw new SyntaxError(fn + \"(): missing closing ')' in the value '\" + call + \"'\")\n }\n\n expressions.push({matches: matches, functionIdentifier: fn})\n call = matches.post\n }\n while (fnRE.test(call))\n\n return expressions\n}\n\n/**\n * Evaluates an expression\n *\n * @param {String} expression\n * @returns {String}\n * @api private\n */\n\nfunction evalFunctionCall (string, functionIdentifier, callback, call, functionRE) {\n // allow recursivity\n return callback(reduceFunctionCall(string, functionRE, callback), functionIdentifier, call)\n}\n", "/**\r\n * A collection of shims that provide minimal functionality of the ES6 collections.\r\n *\r\n * These implementations are not meant to be used outside of the ResizeObserver\r\n * modules as they cover only a limited range of use cases.\r\n */\r\n/* eslint-disable require-jsdoc, valid-jsdoc */\r\nvar MapShim = (function () {\r\n if (typeof Map !== 'undefined') {\r\n return Map;\r\n }\r\n /**\r\n * Returns index in provided array that matches the specified key.\r\n *\r\n * @param {Array} arr\r\n * @param {*} key\r\n * @returns {number}\r\n */\r\n function getIndex(arr, key) {\r\n var result = -1;\r\n arr.some(function (entry, index) {\r\n if (entry[0] === key) {\r\n result = index;\r\n return true;\r\n }\r\n return false;\r\n });\r\n return result;\r\n }\r\n return /** @class */ (function () {\r\n function class_1() {\r\n this.__entries__ = [];\r\n }\r\n Object.defineProperty(class_1.prototype, \"size\", {\r\n /**\r\n * @returns {boolean}\r\n */\r\n get: function () {\r\n return this.__entries__.length;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n /**\r\n * @param {*} key\r\n * @returns {*}\r\n */\r\n class_1.prototype.get = function (key) {\r\n var index = getIndex(this.__entries__, key);\r\n var entry = this.__entries__[index];\r\n return entry && entry[1];\r\n };\r\n /**\r\n * @param {*} key\r\n * @param {*} value\r\n * @returns {void}\r\n */\r\n class_1.prototype.set = function (key, value) {\r\n var index = getIndex(this.__entries__, key);\r\n if (~index) {\r\n this.__entries__[index][1] = value;\r\n }\r\n else {\r\n this.__entries__.push([key, value]);\r\n }\r\n };\r\n /**\r\n * @param {*} key\r\n * @returns {void}\r\n */\r\n class_1.prototype.delete = function (key) {\r\n var entries = this.__entries__;\r\n var index = getIndex(entries, key);\r\n if (~index) {\r\n entries.splice(index, 1);\r\n }\r\n };\r\n /**\r\n * @param {*} key\r\n * @returns {void}\r\n */\r\n class_1.prototype.has = function (key) {\r\n return !!~getIndex(this.__entries__, key);\r\n };\r\n /**\r\n * @returns {void}\r\n */\r\n class_1.prototype.clear = function () {\r\n this.__entries__.splice(0);\r\n };\r\n /**\r\n * @param {Function} callback\r\n * @param {*} [ctx=null]\r\n * @returns {void}\r\n */\r\n class_1.prototype.forEach = function (callback, ctx) {\r\n if (ctx === void 0) { ctx = null; }\r\n for (var _i = 0, _a = this.__entries__; _i < _a.length; _i++) {\r\n var entry = _a[_i];\r\n callback.call(ctx, entry[1], entry[0]);\r\n }\r\n };\r\n return class_1;\r\n }());\r\n})();\n\n/**\r\n * Detects whether window and document objects are available in current environment.\r\n */\r\nvar isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined' && window.document === document;\n\n// Returns global object of a current environment.\r\nvar global$1 = (function () {\r\n if (typeof global !== 'undefined' && global.Math === Math) {\r\n return global;\r\n }\r\n if (typeof self !== 'undefined' && self.Math === Math) {\r\n return self;\r\n }\r\n if (typeof window !== 'undefined' && window.Math === Math) {\r\n return window;\r\n }\r\n // eslint-disable-next-line no-new-func\r\n return Function('return this')();\r\n})();\n\n/**\r\n * A shim for the requestAnimationFrame which falls back to the setTimeout if\r\n * first one is not supported.\r\n *\r\n * @returns {number} Requests' identifier.\r\n */\r\nvar requestAnimationFrame$1 = (function () {\r\n if (typeof requestAnimationFrame === 'function') {\r\n // It's required to use a bounded function because IE sometimes throws\r\n // an \"Invalid calling object\" error if rAF is invoked without the global\r\n // object on the left hand side.\r\n return requestAnimationFrame.bind(global$1);\r\n }\r\n return function (callback) { return setTimeout(function () { return callback(Date.now()); }, 1000 / 60); };\r\n})();\n\n// Defines minimum timeout before adding a trailing call.\r\nvar trailingTimeout = 2;\r\n/**\r\n * Creates a wrapper function which ensures that provided callback will be\r\n * invoked only once during the specified delay period.\r\n *\r\n * @param {Function} callback - Function to be invoked after the delay period.\r\n * @param {number} delay - Delay after which to invoke callback.\r\n * @returns {Function}\r\n */\r\nfunction throttle (callback, delay) {\r\n var leadingCall = false, trailingCall = false, lastCallTime = 0;\r\n /**\r\n * Invokes the original callback function and schedules new invocation if\r\n * the \"proxy\" was called during current request.\r\n *\r\n * @returns {void}\r\n */\r\n function resolvePending() {\r\n if (leadingCall) {\r\n leadingCall = false;\r\n callback();\r\n }\r\n if (trailingCall) {\r\n proxy();\r\n }\r\n }\r\n /**\r\n * Callback invoked after the specified delay. It will further postpone\r\n * invocation of the original function delegating it to the\r\n * requestAnimationFrame.\r\n *\r\n * @returns {void}\r\n */\r\n function timeoutCallback() {\r\n requestAnimationFrame$1(resolvePending);\r\n }\r\n /**\r\n * Schedules invocation of the original function.\r\n *\r\n * @returns {void}\r\n */\r\n function proxy() {\r\n var timeStamp = Date.now();\r\n if (leadingCall) {\r\n // Reject immediately following calls.\r\n if (timeStamp - lastCallTime < trailingTimeout) {\r\n return;\r\n }\r\n // Schedule new call to be in invoked when the pending one is resolved.\r\n // This is important for \"transitions\" which never actually start\r\n // immediately so there is a chance that we might miss one if change\r\n // happens amids the pending invocation.\r\n trailingCall = true;\r\n }\r\n else {\r\n leadingCall = true;\r\n trailingCall = false;\r\n setTimeout(timeoutCallback, delay);\r\n }\r\n lastCallTime = timeStamp;\r\n }\r\n return proxy;\r\n}\n\n// Minimum delay before invoking the update of observers.\r\nvar REFRESH_DELAY = 20;\r\n// A list of substrings of CSS properties used to find transition events that\r\n// might affect dimensions of observed elements.\r\nvar transitionKeys = ['top', 'right', 'bottom', 'left', 'width', 'height', 'size', 'weight'];\r\n// Check if MutationObserver is available.\r\nvar mutationObserverSupported = typeof MutationObserver !== 'undefined';\r\n/**\r\n * Singleton controller class which handles updates of ResizeObserver instances.\r\n */\r\nvar ResizeObserverController = /** @class */ (function () {\r\n /**\r\n * Creates a new instance of ResizeObserverController.\r\n *\r\n * @private\r\n */\r\n function ResizeObserverController() {\r\n /**\r\n * Indicates whether DOM listeners have been added.\r\n *\r\n * @private {boolean}\r\n */\r\n this.connected_ = false;\r\n /**\r\n * Tells that controller has subscribed for Mutation Events.\r\n *\r\n * @private {boolean}\r\n */\r\n this.mutationEventsAdded_ = false;\r\n /**\r\n * Keeps reference to the instance of MutationObserver.\r\n *\r\n * @private {MutationObserver}\r\n */\r\n this.mutationsObserver_ = null;\r\n /**\r\n * A list of connected observers.\r\n *\r\n * @private {Array}\r\n */\r\n this.observers_ = [];\r\n this.onTransitionEnd_ = this.onTransitionEnd_.bind(this);\r\n this.refresh = throttle(this.refresh.bind(this), REFRESH_DELAY);\r\n }\r\n /**\r\n * Adds observer to observers list.\r\n *\r\n * @param {ResizeObserverSPI} observer - Observer to be added.\r\n * @returns {void}\r\n */\r\n ResizeObserverController.prototype.addObserver = function (observer) {\r\n if (!~this.observers_.indexOf(observer)) {\r\n this.observers_.push(observer);\r\n }\r\n // Add listeners if they haven't been added yet.\r\n if (!this.connected_) {\r\n this.connect_();\r\n }\r\n };\r\n /**\r\n * Removes observer from observers list.\r\n *\r\n * @param {ResizeObserverSPI} observer - Observer to be removed.\r\n * @returns {void}\r\n */\r\n ResizeObserverController.prototype.removeObserver = function (observer) {\r\n var observers = this.observers_;\r\n var index = observers.indexOf(observer);\r\n // Remove observer if it's present in registry.\r\n if (~index) {\r\n observers.splice(index, 1);\r\n }\r\n // Remove listeners if controller has no connected observers.\r\n if (!observers.length && this.connected_) {\r\n this.disconnect_();\r\n }\r\n };\r\n /**\r\n * Invokes the update of observers. It will continue running updates insofar\r\n * it detects changes.\r\n *\r\n * @returns {void}\r\n */\r\n ResizeObserverController.prototype.refresh = function () {\r\n var changesDetected = this.updateObservers_();\r\n // Continue running updates if changes have been detected as there might\r\n // be future ones caused by CSS transitions.\r\n if (changesDetected) {\r\n this.refresh();\r\n }\r\n };\r\n /**\r\n * Updates every observer from observers list and notifies them of queued\r\n * entries.\r\n *\r\n * @private\r\n * @returns {boolean} Returns \"true\" if any observer has detected changes in\r\n * dimensions of it's elements.\r\n */\r\n ResizeObserverController.prototype.updateObservers_ = function () {\r\n // Collect observers that have active observations.\r\n var activeObservers = this.observers_.filter(function (observer) {\r\n return observer.gatherActive(), observer.hasActive();\r\n });\r\n // Deliver notifications in a separate cycle in order to avoid any\r\n // collisions between observers, e.g. when multiple instances of\r\n // ResizeObserver are tracking the same element and the callback of one\r\n // of them changes content dimensions of the observed target. Sometimes\r\n // this may result in notifications being blocked for the rest of observers.\r\n activeObservers.forEach(function (observer) { return observer.broadcastActive(); });\r\n return activeObservers.length > 0;\r\n };\r\n /**\r\n * Initializes DOM listeners.\r\n *\r\n * @private\r\n * @returns {void}\r\n */\r\n ResizeObserverController.prototype.connect_ = function () {\r\n // Do nothing if running in a non-browser environment or if listeners\r\n // have been already added.\r\n if (!isBrowser || this.connected_) {\r\n return;\r\n }\r\n // Subscription to the \"Transitionend\" event is used as a workaround for\r\n // delayed transitions. This way it's possible to capture at least the\r\n // final state of an element.\r\n document.addEventListener('transitionend', this.onTransitionEnd_);\r\n window.addEventListener('resize', this.refresh);\r\n if (mutationObserverSupported) {\r\n this.mutationsObserver_ = new MutationObserver(this.refresh);\r\n this.mutationsObserver_.observe(document, {\r\n attributes: true,\r\n childList: true,\r\n characterData: true,\r\n subtree: true\r\n });\r\n }\r\n else {\r\n document.addEventListener('DOMSubtreeModified', this.refresh);\r\n this.mutationEventsAdded_ = true;\r\n }\r\n this.connected_ = true;\r\n };\r\n /**\r\n * Removes DOM listeners.\r\n *\r\n * @private\r\n * @returns {void}\r\n */\r\n ResizeObserverController.prototype.disconnect_ = function () {\r\n // Do nothing if running in a non-browser environment or if listeners\r\n // have been already removed.\r\n if (!isBrowser || !this.connected_) {\r\n return;\r\n }\r\n document.removeEventListener('transitionend', this.onTransitionEnd_);\r\n window.removeEventListener('resize', this.refresh);\r\n if (this.mutationsObserver_) {\r\n this.mutationsObserver_.disconnect();\r\n }\r\n if (this.mutationEventsAdded_) {\r\n document.removeEventListener('DOMSubtreeModified', this.refresh);\r\n }\r\n this.mutationsObserver_ = null;\r\n this.mutationEventsAdded_ = false;\r\n this.connected_ = false;\r\n };\r\n /**\r\n * \"Transitionend\" event handler.\r\n *\r\n * @private\r\n * @param {TransitionEvent} event\r\n * @returns {void}\r\n */\r\n ResizeObserverController.prototype.onTransitionEnd_ = function (_a) {\r\n var _b = _a.propertyName, propertyName = _b === void 0 ? '' : _b;\r\n // Detect whether transition may affect dimensions of an element.\r\n var isReflowProperty = transitionKeys.some(function (key) {\r\n return !!~propertyName.indexOf(key);\r\n });\r\n if (isReflowProperty) {\r\n this.refresh();\r\n }\r\n };\r\n /**\r\n * Returns instance of the ResizeObserverController.\r\n *\r\n * @returns {ResizeObserverController}\r\n */\r\n ResizeObserverController.getInstance = function () {\r\n if (!this.instance_) {\r\n this.instance_ = new ResizeObserverController();\r\n }\r\n return this.instance_;\r\n };\r\n /**\r\n * Holds reference to the controller's instance.\r\n *\r\n * @private {ResizeObserverController}\r\n */\r\n ResizeObserverController.instance_ = null;\r\n return ResizeObserverController;\r\n}());\n\n/**\r\n * Defines non-writable/enumerable properties of the provided target object.\r\n *\r\n * @param {Object} target - Object for which to define properties.\r\n * @param {Object} props - Properties to be defined.\r\n * @returns {Object} Target object.\r\n */\r\nvar defineConfigurable = (function (target, props) {\r\n for (var _i = 0, _a = Object.keys(props); _i < _a.length; _i++) {\r\n var key = _a[_i];\r\n Object.defineProperty(target, key, {\r\n value: props[key],\r\n enumerable: false,\r\n writable: false,\r\n configurable: true\r\n });\r\n }\r\n return target;\r\n});\n\n/**\r\n * Returns the global object associated with provided element.\r\n *\r\n * @param {Object} target\r\n * @returns {Object}\r\n */\r\nvar getWindowOf = (function (target) {\r\n // Assume that the element is an instance of Node, which means that it\r\n // has the \"ownerDocument\" property from which we can retrieve a\r\n // corresponding global object.\r\n var ownerGlobal = target && target.ownerDocument && target.ownerDocument.defaultView;\r\n // Return the local global object if it's not possible extract one from\r\n // provided element.\r\n return ownerGlobal || global$1;\r\n});\n\n// Placeholder of an empty content rectangle.\r\nvar emptyRect = createRectInit(0, 0, 0, 0);\r\n/**\r\n * Converts provided string to a number.\r\n *\r\n * @param {number|string} value\r\n * @returns {number}\r\n */\r\nfunction toFloat(value) {\r\n return parseFloat(value) || 0;\r\n}\r\n/**\r\n * Extracts borders size from provided styles.\r\n *\r\n * @param {CSSStyleDeclaration} styles\r\n * @param {...string} positions - Borders positions (top, right, ...)\r\n * @returns {number}\r\n */\r\nfunction getBordersSize(styles) {\r\n var positions = [];\r\n for (var _i = 1; _i < arguments.length; _i++) {\r\n positions[_i - 1] = arguments[_i];\r\n }\r\n return positions.reduce(function (size, position) {\r\n var value = styles['border-' + position + '-width'];\r\n return size + toFloat(value);\r\n }, 0);\r\n}\r\n/**\r\n * Extracts paddings sizes from provided styles.\r\n *\r\n * @param {CSSStyleDeclaration} styles\r\n * @returns {Object} Paddings box.\r\n */\r\nfunction getPaddings(styles) {\r\n var positions = ['top', 'right', 'bottom', 'left'];\r\n var paddings = {};\r\n for (var _i = 0, positions_1 = positions; _i < positions_1.length; _i++) {\r\n var position = positions_1[_i];\r\n var value = styles['padding-' + position];\r\n paddings[position] = toFloat(value);\r\n }\r\n return paddings;\r\n}\r\n/**\r\n * Calculates content rectangle of provided SVG element.\r\n *\r\n * @param {SVGGraphicsElement} target - Element content rectangle of which needs\r\n * to be calculated.\r\n * @returns {DOMRectInit}\r\n */\r\nfunction getSVGContentRect(target) {\r\n var bbox = target.getBBox();\r\n return createRectInit(0, 0, bbox.width, bbox.height);\r\n}\r\n/**\r\n * Calculates content rectangle of provided HTMLElement.\r\n *\r\n * @param {HTMLElement} target - Element for which to calculate the content rectangle.\r\n * @returns {DOMRectInit}\r\n */\r\nfunction getHTMLElementContentRect(target) {\r\n // Client width & height properties can't be\r\n // used exclusively as they provide rounded values.\r\n var clientWidth = target.clientWidth, clientHeight = target.clientHeight;\r\n // By this condition we can catch all non-replaced inline, hidden and\r\n // detached elements. Though elements with width & height properties less\r\n // than 0.5 will be discarded as well.\r\n //\r\n // Without it we would need to implement separate methods for each of\r\n // those cases and it's not possible to perform a precise and performance\r\n // effective test for hidden elements. E.g. even jQuery's ':visible' filter\r\n // gives wrong results for elements with width & height less than 0.5.\r\n if (!clientWidth && !clientHeight) {\r\n return emptyRect;\r\n }\r\n var styles = getWindowOf(target).getComputedStyle(target);\r\n var paddings = getPaddings(styles);\r\n var horizPad = paddings.left + paddings.right;\r\n var vertPad = paddings.top + paddings.bottom;\r\n // Computed styles of width & height are being used because they are the\r\n // only dimensions available to JS that contain non-rounded values. It could\r\n // be possible to utilize the getBoundingClientRect if only it's data wasn't\r\n // affected by CSS transformations let alone paddings, borders and scroll bars.\r\n var width = toFloat(styles.width), height = toFloat(styles.height);\r\n // Width & height include paddings and borders when the 'border-box' box\r\n // model is applied (except for IE).\r\n if (styles.boxSizing === 'border-box') {\r\n // Following conditions are required to handle Internet Explorer which\r\n // doesn't include paddings and borders to computed CSS dimensions.\r\n //\r\n // We can say that if CSS dimensions + paddings are equal to the \"client\"\r\n // properties then it's either IE, and thus we don't need to subtract\r\n // anything, or an element merely doesn't have paddings/borders styles.\r\n if (Math.round(width + horizPad) !== clientWidth) {\r\n width -= getBordersSize(styles, 'left', 'right') + horizPad;\r\n }\r\n if (Math.round(height + vertPad) !== clientHeight) {\r\n height -= getBordersSize(styles, 'top', 'bottom') + vertPad;\r\n }\r\n }\r\n // Following steps can't be applied to the document's root element as its\r\n // client[Width/Height] properties represent viewport area of the window.\r\n // Besides, it's as well not necessary as the itself neither has\r\n // rendered scroll bars nor it can be clipped.\r\n if (!isDocumentElement(target)) {\r\n // In some browsers (only in Firefox, actually) CSS width & height\r\n // include scroll bars size which can be removed at this step as scroll\r\n // bars are the only difference between rounded dimensions + paddings\r\n // and \"client\" properties, though that is not always true in Chrome.\r\n var vertScrollbar = Math.round(width + horizPad) - clientWidth;\r\n var horizScrollbar = Math.round(height + vertPad) - clientHeight;\r\n // Chrome has a rather weird rounding of \"client\" properties.\r\n // E.g. for an element with content width of 314.2px it sometimes gives\r\n // the client width of 315px and for the width of 314.7px it may give\r\n // 314px. And it doesn't happen all the time. So just ignore this delta\r\n // as a non-relevant.\r\n if (Math.abs(vertScrollbar) !== 1) {\r\n width -= vertScrollbar;\r\n }\r\n if (Math.abs(horizScrollbar) !== 1) {\r\n height -= horizScrollbar;\r\n }\r\n }\r\n return createRectInit(paddings.left, paddings.top, width, height);\r\n}\r\n/**\r\n * Checks whether provided element is an instance of the SVGGraphicsElement.\r\n *\r\n * @param {Element} target - Element to be checked.\r\n * @returns {boolean}\r\n */\r\nvar isSVGGraphicsElement = (function () {\r\n // Some browsers, namely IE and Edge, don't have the SVGGraphicsElement\r\n // interface.\r\n if (typeof SVGGraphicsElement !== 'undefined') {\r\n return function (target) { return target instanceof getWindowOf(target).SVGGraphicsElement; };\r\n }\r\n // If it's so, then check that element is at least an instance of the\r\n // SVGElement and that it has the \"getBBox\" method.\r\n // eslint-disable-next-line no-extra-parens\r\n return function (target) { return (target instanceof getWindowOf(target).SVGElement &&\r\n typeof target.getBBox === 'function'); };\r\n})();\r\n/**\r\n * Checks whether provided element is a document element ().\r\n *\r\n * @param {Element} target - Element to be checked.\r\n * @returns {boolean}\r\n */\r\nfunction isDocumentElement(target) {\r\n return target === getWindowOf(target).document.documentElement;\r\n}\r\n/**\r\n * Calculates an appropriate content rectangle for provided html or svg element.\r\n *\r\n * @param {Element} target - Element content rectangle of which needs to be calculated.\r\n * @returns {DOMRectInit}\r\n */\r\nfunction getContentRect(target) {\r\n if (!isBrowser) {\r\n return emptyRect;\r\n }\r\n if (isSVGGraphicsElement(target)) {\r\n return getSVGContentRect(target);\r\n }\r\n return getHTMLElementContentRect(target);\r\n}\r\n/**\r\n * Creates rectangle with an interface of the DOMRectReadOnly.\r\n * Spec: https://drafts.fxtf.org/geometry/#domrectreadonly\r\n *\r\n * @param {DOMRectInit} rectInit - Object with rectangle's x/y coordinates and dimensions.\r\n * @returns {DOMRectReadOnly}\r\n */\r\nfunction createReadOnlyRect(_a) {\r\n var x = _a.x, y = _a.y, width = _a.width, height = _a.height;\r\n // If DOMRectReadOnly is available use it as a prototype for the rectangle.\r\n var Constr = typeof DOMRectReadOnly !== 'undefined' ? DOMRectReadOnly : Object;\r\n var rect = Object.create(Constr.prototype);\r\n // Rectangle's properties are not writable and non-enumerable.\r\n defineConfigurable(rect, {\r\n x: x, y: y, width: width, height: height,\r\n top: y,\r\n right: x + width,\r\n bottom: height + y,\r\n left: x\r\n });\r\n return rect;\r\n}\r\n/**\r\n * Creates DOMRectInit object based on the provided dimensions and the x/y coordinates.\r\n * Spec: https://drafts.fxtf.org/geometry/#dictdef-domrectinit\r\n *\r\n * @param {number} x - X coordinate.\r\n * @param {number} y - Y coordinate.\r\n * @param {number} width - Rectangle's width.\r\n * @param {number} height - Rectangle's height.\r\n * @returns {DOMRectInit}\r\n */\r\nfunction createRectInit(x, y, width, height) {\r\n return { x: x, y: y, width: width, height: height };\r\n}\n\n/**\r\n * Class that is responsible for computations of the content rectangle of\r\n * provided DOM element and for keeping track of it's changes.\r\n */\r\nvar ResizeObservation = /** @class */ (function () {\r\n /**\r\n * Creates an instance of ResizeObservation.\r\n *\r\n * @param {Element} target - Element to be observed.\r\n */\r\n function ResizeObservation(target) {\r\n /**\r\n * Broadcasted width of content rectangle.\r\n *\r\n * @type {number}\r\n */\r\n this.broadcastWidth = 0;\r\n /**\r\n * Broadcasted height of content rectangle.\r\n *\r\n * @type {number}\r\n */\r\n this.broadcastHeight = 0;\r\n /**\r\n * Reference to the last observed content rectangle.\r\n *\r\n * @private {DOMRectInit}\r\n */\r\n this.contentRect_ = createRectInit(0, 0, 0, 0);\r\n this.target = target;\r\n }\r\n /**\r\n * Updates content rectangle and tells whether it's width or height properties\r\n * have changed since the last broadcast.\r\n *\r\n * @returns {boolean}\r\n */\r\n ResizeObservation.prototype.isActive = function () {\r\n var rect = getContentRect(this.target);\r\n this.contentRect_ = rect;\r\n return (rect.width !== this.broadcastWidth ||\r\n rect.height !== this.broadcastHeight);\r\n };\r\n /**\r\n * Updates 'broadcastWidth' and 'broadcastHeight' properties with a data\r\n * from the corresponding properties of the last observed content rectangle.\r\n *\r\n * @returns {DOMRectInit} Last observed content rectangle.\r\n */\r\n ResizeObservation.prototype.broadcastRect = function () {\r\n var rect = this.contentRect_;\r\n this.broadcastWidth = rect.width;\r\n this.broadcastHeight = rect.height;\r\n return rect;\r\n };\r\n return ResizeObservation;\r\n}());\n\nvar ResizeObserverEntry = /** @class */ (function () {\r\n /**\r\n * Creates an instance of ResizeObserverEntry.\r\n *\r\n * @param {Element} target - Element that is being observed.\r\n * @param {DOMRectInit} rectInit - Data of the element's content rectangle.\r\n */\r\n function ResizeObserverEntry(target, rectInit) {\r\n var contentRect = createReadOnlyRect(rectInit);\r\n // According to the specification following properties are not writable\r\n // and are also not enumerable in the native implementation.\r\n //\r\n // Property accessors are not being used as they'd require to define a\r\n // private WeakMap storage which may cause memory leaks in browsers that\r\n // don't support this type of collections.\r\n defineConfigurable(this, { target: target, contentRect: contentRect });\r\n }\r\n return ResizeObserverEntry;\r\n}());\n\nvar ResizeObserverSPI = /** @class */ (function () {\r\n /**\r\n * Creates a new instance of ResizeObserver.\r\n *\r\n * @param {ResizeObserverCallback} callback - Callback function that is invoked\r\n * when one of the observed elements changes it's content dimensions.\r\n * @param {ResizeObserverController} controller - Controller instance which\r\n * is responsible for the updates of observer.\r\n * @param {ResizeObserver} callbackCtx - Reference to the public\r\n * ResizeObserver instance which will be passed to callback function.\r\n */\r\n function ResizeObserverSPI(callback, controller, callbackCtx) {\r\n /**\r\n * Collection of resize observations that have detected changes in dimensions\r\n * of elements.\r\n *\r\n * @private {Array}\r\n */\r\n this.activeObservations_ = [];\r\n /**\r\n * Registry of the ResizeObservation instances.\r\n *\r\n * @private {Map}\r\n */\r\n this.observations_ = new MapShim();\r\n if (typeof callback !== 'function') {\r\n throw new TypeError('The callback provided as parameter 1 is not a function.');\r\n }\r\n this.callback_ = callback;\r\n this.controller_ = controller;\r\n this.callbackCtx_ = callbackCtx;\r\n }\r\n /**\r\n * Starts observing provided element.\r\n *\r\n * @param {Element} target - Element to be observed.\r\n * @returns {void}\r\n */\r\n ResizeObserverSPI.prototype.observe = function (target) {\r\n if (!arguments.length) {\r\n throw new TypeError('1 argument required, but only 0 present.');\r\n }\r\n // Do nothing if current environment doesn't have the Element interface.\r\n if (typeof Element === 'undefined' || !(Element instanceof Object)) {\r\n return;\r\n }\r\n if (!(target instanceof getWindowOf(target).Element)) {\r\n throw new TypeError('parameter 1 is not of type \"Element\".');\r\n }\r\n var observations = this.observations_;\r\n // Do nothing if element is already being observed.\r\n if (observations.has(target)) {\r\n return;\r\n }\r\n observations.set(target, new ResizeObservation(target));\r\n this.controller_.addObserver(this);\r\n // Force the update of observations.\r\n this.controller_.refresh();\r\n };\r\n /**\r\n * Stops observing provided element.\r\n *\r\n * @param {Element} target - Element to stop observing.\r\n * @returns {void}\r\n */\r\n ResizeObserverSPI.prototype.unobserve = function (target) {\r\n if (!arguments.length) {\r\n throw new TypeError('1 argument required, but only 0 present.');\r\n }\r\n // Do nothing if current environment doesn't have the Element interface.\r\n if (typeof Element === 'undefined' || !(Element instanceof Object)) {\r\n return;\r\n }\r\n if (!(target instanceof getWindowOf(target).Element)) {\r\n throw new TypeError('parameter 1 is not of type \"Element\".');\r\n }\r\n var observations = this.observations_;\r\n // Do nothing if element is not being observed.\r\n if (!observations.has(target)) {\r\n return;\r\n }\r\n observations.delete(target);\r\n if (!observations.size) {\r\n this.controller_.removeObserver(this);\r\n }\r\n };\r\n /**\r\n * Stops observing all elements.\r\n *\r\n * @returns {void}\r\n */\r\n ResizeObserverSPI.prototype.disconnect = function () {\r\n this.clearActive();\r\n this.observations_.clear();\r\n this.controller_.removeObserver(this);\r\n };\r\n /**\r\n * Collects observation instances the associated element of which has changed\r\n * it's content rectangle.\r\n *\r\n * @returns {void}\r\n */\r\n ResizeObserverSPI.prototype.gatherActive = function () {\r\n var _this = this;\r\n this.clearActive();\r\n this.observations_.forEach(function (observation) {\r\n if (observation.isActive()) {\r\n _this.activeObservations_.push(observation);\r\n }\r\n });\r\n };\r\n /**\r\n * Invokes initial callback function with a list of ResizeObserverEntry\r\n * instances collected from active resize observations.\r\n *\r\n * @returns {void}\r\n */\r\n ResizeObserverSPI.prototype.broadcastActive = function () {\r\n // Do nothing if observer doesn't have active observations.\r\n if (!this.hasActive()) {\r\n return;\r\n }\r\n var ctx = this.callbackCtx_;\r\n // Create ResizeObserverEntry instance for every active observation.\r\n var entries = this.activeObservations_.map(function (observation) {\r\n return new ResizeObserverEntry(observation.target, observation.broadcastRect());\r\n });\r\n this.callback_.call(ctx, entries, ctx);\r\n this.clearActive();\r\n };\r\n /**\r\n * Clears the collection of active observations.\r\n *\r\n * @returns {void}\r\n */\r\n ResizeObserverSPI.prototype.clearActive = function () {\r\n this.activeObservations_.splice(0);\r\n };\r\n /**\r\n * Tells whether observer has active observations.\r\n *\r\n * @returns {boolean}\r\n */\r\n ResizeObserverSPI.prototype.hasActive = function () {\r\n return this.activeObservations_.length > 0;\r\n };\r\n return ResizeObserverSPI;\r\n}());\n\n// Registry of internal observers. If WeakMap is not available use current shim\r\n// for the Map collection as it has all required methods and because WeakMap\r\n// can't be fully polyfilled anyway.\r\nvar observers = typeof WeakMap !== 'undefined' ? new WeakMap() : new MapShim();\r\n/**\r\n * ResizeObserver API. Encapsulates the ResizeObserver SPI implementation\r\n * exposing only those methods and properties that are defined in the spec.\r\n */\r\nvar ResizeObserver = /** @class */ (function () {\r\n /**\r\n * Creates a new instance of ResizeObserver.\r\n *\r\n * @param {ResizeObserverCallback} callback - Callback that is invoked when\r\n * dimensions of the observed elements change.\r\n */\r\n function ResizeObserver(callback) {\r\n if (!(this instanceof ResizeObserver)) {\r\n throw new TypeError('Cannot call a class as a function.');\r\n }\r\n if (!arguments.length) {\r\n throw new TypeError('1 argument required, but only 0 present.');\r\n }\r\n var controller = ResizeObserverController.getInstance();\r\n var observer = new ResizeObserverSPI(callback, controller, this);\r\n observers.set(this, observer);\r\n }\r\n return ResizeObserver;\r\n}());\r\n// Expose public methods of ResizeObserver.\r\n[\r\n 'observe',\r\n 'unobserve',\r\n 'disconnect'\r\n].forEach(function (method) {\r\n ResizeObserver.prototype[method] = function () {\r\n var _a;\r\n return (_a = observers.get(this))[method].apply(_a, arguments);\r\n };\r\n});\n\nvar index = (function () {\r\n // Export existing implementation if available.\r\n if (typeof global$1.ResizeObserver !== 'undefined') {\r\n return global$1.ResizeObserver;\r\n }\r\n return ResizeObserver;\r\n})();\n\nexport default index;\n", - "/** @license React v0.13.4\n * scheduler.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';Object.defineProperty(exports,\"__esModule\",{value:!0});var d=null,e=!1,g=3,k=-1,l=-1,m=!1,n=!1;function p(){if(!m){var a=d.expirationTime;n?q():n=!0;r(t,a)}}\nfunction u(){var a=d,b=d.next;if(d===b)d=null;else{var c=d.previous;d=c.next=b;b.previous=c}a.next=a.previous=null;c=a.callback;b=a.expirationTime;a=a.priorityLevel;var f=g,Q=l;g=a;l=b;try{var h=c()}finally{g=f,l=Q}if(\"function\"===typeof h)if(h={callback:h,priorityLevel:a,expirationTime:b,next:null,previous:null},null===d)d=h.next=h.previous=h;else{c=null;a=d;do{if(a.expirationTime>=b){c=a;break}a=a.next}while(a!==d);null===c?c=d:c===d&&(d=h,p());b=c.previous;b.next=c.previous=h;h.next=c;h.previous=\nb}}function v(){if(-1===k&&null!==d&&1===d.priorityLevel){m=!0;try{do u();while(null!==d&&1===d.priorityLevel)}finally{m=!1,null!==d?p():n=!1}}}function t(a){m=!0;var b=e;e=a;try{if(a)for(;null!==d;){var c=exports.unstable_now();if(d.expirationTime<=c){do u();while(null!==d&&d.expirationTime<=c)}else break}else if(null!==d){do u();while(null!==d&&!w())}}finally{m=!1,e=b,null!==d?p():n=!1,v()}}\nvar x=Date,y=\"function\"===typeof setTimeout?setTimeout:void 0,z=\"function\"===typeof clearTimeout?clearTimeout:void 0,A=\"function\"===typeof requestAnimationFrame?requestAnimationFrame:void 0,B=\"function\"===typeof cancelAnimationFrame?cancelAnimationFrame:void 0,C,D;function E(a){C=A(function(b){z(D);a(b)});D=y(function(){B(C);a(exports.unstable_now())},100)}\nif(\"object\"===typeof performance&&\"function\"===typeof performance.now){var F=performance;exports.unstable_now=function(){return F.now()}}else exports.unstable_now=function(){return x.now()};var r,q,w,G=null;\"undefined\"!==typeof window?G=window:\"undefined\"!==typeof global&&(G=global);\nif(G&&G._schedMock){var H=G._schedMock;r=H[0];q=H[1];w=H[2];exports.unstable_now=H[3]}else if(\"undefined\"===typeof window||\"function\"!==typeof MessageChannel){var I=null,J=function(a){if(null!==I)try{I(a)}finally{I=null}};r=function(a){null!==I?setTimeout(r,0,a):(I=a,setTimeout(J,0,!1))};q=function(){I=null};w=function(){return!1}}else{\"undefined\"!==typeof console&&(\"function\"!==typeof A&&console.error(\"This browser doesn't support requestAnimationFrame. Make sure that you load a polyfill in older browsers. https://fb.me/react-polyfills\"),\n\"function\"!==typeof B&&console.error(\"This browser doesn't support cancelAnimationFrame. Make sure that you load a polyfill in older browsers. https://fb.me/react-polyfills\"));var K=null,L=!1,M=-1,N=!1,O=!1,P=0,R=33,S=33;w=function(){return P<=exports.unstable_now()};var T=new MessageChannel,U=T.port2;T.port1.onmessage=function(){L=!1;var a=K,b=M;K=null;M=-1;var c=exports.unstable_now(),f=!1;if(0>=P-c)if(-1!==b&&b<=c)f=!0;else{N||(N=!0,E(V));K=a;M=b;return}if(null!==a){O=!0;try{a(f)}finally{O=!1}}};\nvar V=function(a){if(null!==K){E(V);var b=a-P+S;bb&&(b=8),S=bb?U.postMessage(void 0):N||(N=!0,E(V))};q=function(){K=null;L=!1;M=-1}}exports.unstable_ImmediatePriority=1;exports.unstable_UserBlockingPriority=2;exports.unstable_NormalPriority=3;exports.unstable_IdlePriority=5;exports.unstable_LowPriority=4;\nexports.unstable_runWithPriority=function(a,b){switch(a){case 1:case 2:case 3:case 4:case 5:break;default:a=3}var c=g,f=k;g=a;k=exports.unstable_now();try{return b()}finally{g=c,k=f,v()}};exports.unstable_next=function(a){switch(g){case 1:case 2:case 3:var b=3;break;default:b=g}var c=g,f=k;g=b;k=exports.unstable_now();try{return a()}finally{g=c,k=f,v()}};\nexports.unstable_scheduleCallback=function(a,b){var c=-1!==k?k:exports.unstable_now();if(\"object\"===typeof b&&null!==b&&\"number\"===typeof b.timeout)b=c+b.timeout;else switch(g){case 1:b=c+-1;break;case 2:b=c+250;break;case 5:b=c+1073741823;break;case 4:b=c+1E4;break;default:b=c+5E3}a={callback:a,priorityLevel:g,expirationTime:b,next:null,previous:null};if(null===d)d=a.next=a.previous=a,p();else{c=null;var f=d;do{if(f.expirationTime>b){c=f;break}f=f.next}while(f!==d);null===c?c=d:c===d&&(d=a,p());\nb=c.previous;b.next=c.previous=a;a.next=c;a.previous=b}return a};exports.unstable_cancelCallback=function(a){var b=a.next;if(null!==b){if(b===a)d=null;else{a===d&&(d=b);var c=a.previous;c.next=b;b.previous=c}a.next=a.previous=null}};exports.unstable_wrapCallback=function(a){var b=g;return function(){var c=g,f=k;g=b;k=exports.unstable_now();try{return a.apply(this,arguments)}finally{g=c,k=f,v()}}};exports.unstable_getCurrentPriorityLevel=function(){return g};\nexports.unstable_shouldYield=function(){return!e&&(null!==d&&d.expirationTime=b){c=a;break}a=a.next}while(a!==d);null===c?c=d:c===d&&(d=h,p());b=c.previous;b.next=c.previous=h;h.next=c;h.previous=\nb}}function v(){if(-1===k&&null!==d&&1===d.priorityLevel){m=!0;try{do u();while(null!==d&&1===d.priorityLevel)}finally{m=!1,null!==d?p():n=!1}}}function t(a){m=!0;var b=e;e=a;try{if(a)for(;null!==d;){var c=exports.unstable_now();if(d.expirationTime<=c){do u();while(null!==d&&d.expirationTime<=c)}else break}else if(null!==d){do u();while(null!==d&&!w())}}finally{m=!1,e=b,null!==d?p():n=!1,v()}}\nvar x=Date,y=\"function\"===typeof setTimeout?setTimeout:void 0,z=\"function\"===typeof clearTimeout?clearTimeout:void 0,A=\"function\"===typeof requestAnimationFrame?requestAnimationFrame:void 0,B=\"function\"===typeof cancelAnimationFrame?cancelAnimationFrame:void 0,C,D;function E(a){C=A(function(b){z(D);a(b)});D=y(function(){B(C);a(exports.unstable_now())},100)}\nif(\"object\"===typeof performance&&\"function\"===typeof performance.now){var F=performance;exports.unstable_now=function(){return F.now()}}else exports.unstable_now=function(){return x.now()};var r,q,w,G=null;\"undefined\"!==typeof window?G=window:\"undefined\"!==typeof global&&(G=global);\nif(G&&G._schedMock){var H=G._schedMock;r=H[0];q=H[1];w=H[2];exports.unstable_now=H[3]}else if(\"undefined\"===typeof window||\"function\"!==typeof MessageChannel){var I=null,J=function(a){if(null!==I)try{I(a)}finally{I=null}};r=function(a){null!==I?setTimeout(r,0,a):(I=a,setTimeout(J,0,!1))};q=function(){I=null};w=function(){return!1}}else{\"undefined\"!==typeof console&&(\"function\"!==typeof A&&console.error(\"This browser doesn't support requestAnimationFrame. Make sure that you load a polyfill in older browsers. https://fb.me/react-polyfills\"),\n\"function\"!==typeof B&&console.error(\"This browser doesn't support cancelAnimationFrame. Make sure that you load a polyfill in older browsers. https://fb.me/react-polyfills\"));var K=null,L=!1,M=-1,N=!1,O=!1,P=0,R=33,S=33;w=function(){return P<=exports.unstable_now()};var T=new MessageChannel,U=T.port2;T.port1.onmessage=function(){L=!1;var a=K,b=M;K=null;M=-1;var c=exports.unstable_now(),f=!1;if(0>=P-c)if(-1!==b&&b<=c)f=!0;else{N||(N=!0,E(V));K=a;M=b;return}if(null!==a){O=!0;try{a(f)}finally{O=!1}}};\nvar V=function(a){if(null!==K){E(V);var b=a-P+S;bb&&(b=8),S=bb?U.postMessage(void 0):N||(N=!0,E(V))};q=function(){K=null;L=!1;M=-1}}exports.unstable_ImmediatePriority=1;exports.unstable_UserBlockingPriority=2;exports.unstable_NormalPriority=3;exports.unstable_IdlePriority=5;exports.unstable_LowPriority=4;\nexports.unstable_runWithPriority=function(a,b){switch(a){case 1:case 2:case 3:case 4:case 5:break;default:a=3}var c=g,f=k;g=a;k=exports.unstable_now();try{return b()}finally{g=c,k=f,v()}};exports.unstable_next=function(a){switch(g){case 1:case 2:case 3:var b=3;break;default:b=g}var c=g,f=k;g=b;k=exports.unstable_now();try{return a()}finally{g=c,k=f,v()}};\nexports.unstable_scheduleCallback=function(a,b){var c=-1!==k?k:exports.unstable_now();if(\"object\"===typeof b&&null!==b&&\"number\"===typeof b.timeout)b=c+b.timeout;else switch(g){case 1:b=c+-1;break;case 2:b=c+250;break;case 5:b=c+1073741823;break;case 4:b=c+1E4;break;default:b=c+5E3}a={callback:a,priorityLevel:g,expirationTime:b,next:null,previous:null};if(null===d)d=a.next=a.previous=a,p();else{c=null;var f=d;do{if(f.expirationTime>b){c=f;break}f=f.next}while(f!==d);null===c?c=d:c===d&&(d=a,p());\nb=c.previous;b.next=c.previous=a;a.next=c;a.previous=b}return a};exports.unstable_cancelCallback=function(a){var b=a.next;if(null!==b){if(b===a)d=null;else{a===d&&(d=b);var c=a.previous;c.next=b;b.previous=c}a.next=a.previous=null}};exports.unstable_wrapCallback=function(a){var b=g;return function(){var c=g,f=k;g=b;k=exports.unstable_now();try{return a.apply(this,arguments)}finally{g=c,k=f,v()}}};exports.unstable_getCurrentPriorityLevel=function(){return g};\nexports.unstable_shouldYield=function(){return!e&&(null!==d&&d.expirationTime element; its readystatechange event will be fired asynchronously once it is inserted\n // into the document. Do so, thus queuing up the task. Remember to clean up once it's been called.\n var script = doc.createElement(\"script\");\n script.onreadystatechange = function () {\n runIfPresent(handle);\n script.onreadystatechange = null;\n html.removeChild(script);\n script = null;\n };\n html.appendChild(script);\n };\n }\n\n function installSetTimeoutImplementation() {\n registerImmediate = function(handle) {\n setTimeout(runIfPresent, 0, handle);\n };\n }\n\n // If supported, we should attach to the prototype of global, since that is where setTimeout et al. live.\n var attachTo = Object.getPrototypeOf && Object.getPrototypeOf(global);\n attachTo = attachTo && attachTo.setTimeout ? attachTo : global;\n\n // Don't get fooled by e.g. browserify environments.\n if ({}.toString.call(global.process) === \"[object process]\") {\n // For Node.js before 0.9\n installNextTickImplementation();\n\n } else if (canUsePostMessage()) {\n // For non-IE10 modern browsers\n installPostMessageImplementation();\n\n } else if (global.MessageChannel) {\n // For web workers, where supported\n installMessageChannelImplementation();\n\n } else if (doc && \"onreadystatechange\" in doc.createElement(\"script\")) {\n // For IE 6–8\n installReadyStateChangeImplementation();\n\n } else {\n // For older browsers\n installSetTimeoutImplementation();\n }\n\n attachTo.setImmediate = setImmediate;\n attachTo.clearImmediate = clearImmediate;\n}(typeof self === \"undefined\" ? typeof global === \"undefined\" ? this : global : self));\n", + "(function (global, undefined) {\n \"use strict\";\n\n if (global.setImmediate) {\n return;\n }\n\n var nextHandle = 1; // Spec says greater than zero\n var tasksByHandle = {};\n var currentlyRunningATask = false;\n var doc = global.document;\n var registerImmediate;\n\n function setImmediate(callback) {\n // Callback can either be a function or a string\n if (typeof callback !== \"function\") {\n callback = new Function(\"\" + callback);\n }\n // Copy function arguments\n var args = new Array(arguments.length - 1);\n for (var i = 0; i < args.length; i++) {\n args[i] = arguments[i + 1];\n }\n // Store and register the task\n var task = { callback: callback, args: args };\n tasksByHandle[nextHandle] = task;\n registerImmediate(nextHandle);\n return nextHandle++;\n }\n\n function clearImmediate(handle) {\n delete tasksByHandle[handle];\n }\n\n function run(task) {\n var callback = task.callback;\n var args = task.args;\n switch (args.length) {\n case 0:\n callback();\n break;\n case 1:\n callback(args[0]);\n break;\n case 2:\n callback(args[0], args[1]);\n break;\n case 3:\n callback(args[0], args[1], args[2]);\n break;\n default:\n callback.apply(undefined, args);\n break;\n }\n }\n\n function runIfPresent(handle) {\n // From the spec: \"Wait until any invocations of this algorithm started before this one have completed.\"\n // So if we're currently running a task, we'll need to delay this invocation.\n if (currentlyRunningATask) {\n // Delay by doing a setTimeout. setImmediate was tried instead, but in Firefox 7 it generated a\n // \"too much recursion\" error.\n setTimeout(runIfPresent, 0, handle);\n } else {\n var task = tasksByHandle[handle];\n if (task) {\n currentlyRunningATask = true;\n try {\n run(task);\n } finally {\n clearImmediate(handle);\n currentlyRunningATask = false;\n }\n }\n }\n }\n\n function installNextTickImplementation() {\n registerImmediate = function(handle) {\n process.nextTick(function () { runIfPresent(handle); });\n };\n }\n\n function canUsePostMessage() {\n // The test against ` + "`") + (`importScripts` + "`"))))) + ((((` prevents this implementation from being installed inside a web worker,\n // where ` + ("`" + `global.postMessage`)) + ("`" + (` means something completely different and can't be used for this purpose.\n if (global.postMessage && !global.importScripts) {\n var postMessageIsAsynchronous = true;\n var oldOnMessage = global.onmessage;\n global.onmessage = function() {\n postMessageIsAsynchronous = false;\n };\n global.postMessage(\"\", \"*\");\n global.onmessage = oldOnMessage;\n return postMessageIsAsynchronous;\n }\n }\n\n function installPostMessageImplementation() {\n // Installs an event handler on ` + "`"))) + ((`global` + ("`" + ` for the `)) + ("`" + (`message` + "`")))) + (((` event: see\n // * https://developer.mozilla.org/en/DOM/window.postMessage\n // * http://www.whatwg.org/specs/web-apps/current-work/multipage/comms.html#crossDocumentMessages\n\n var messagePrefix = \"setImmediate$\" + Math.random() + \"$\";\n var onGlobalMessage = function(event) {\n if (event.source === global &&\n typeof event.data === \"string\" &&\n event.data.indexOf(messagePrefix) === 0) {\n runIfPresent(+event.data.slice(messagePrefix.length));\n }\n };\n\n if (global.addEventListener) {\n global.addEventListener(\"message\", onGlobalMessage, false);\n } else {\n global.attachEvent(\"onmessage\", onGlobalMessage);\n }\n\n registerImmediate = function(handle) {\n global.postMessage(messagePrefix + handle, \"*\");\n };\n }\n\n function installMessageChannelImplementation() {\n var channel = new MessageChannel();\n channel.port1.onmessage = function(event) {\n var handle = event.data;\n runIfPresent(handle);\n };\n\n registerImmediate = function(handle) {\n channel.port2.postMessage(handle);\n };\n }\n\n function installReadyStateChangeImplementation() {\n var html = doc.documentElement;\n registerImmediate = function(handle) {\n // Create a `, "/"+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/vendor/github.com/ethereum/go-ethereum/swarm/api/http/response.go b/vendor/github.com/ethereum/go-ethereum/swarm/api/http/response.go deleted file mode 100644 index d4e81d7f..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/metrics" - "github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/swarm/api/http/roundtripper.go b/vendor/github.com/ethereum/go-ethereum/swarm/api/http/roundtripper.go deleted file mode 100644 index be8ea398..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/swarm/api/http/sctx.go b/vendor/github.com/ethereum/go-ethereum/swarm/api/http/sctx.go deleted file mode 100644 index b8dafab0..00000000 --- a/vendor/github.com/ethereum/go-ethereum/swarm/api/http/sctx.go +++ /dev/null @@ -1,34 +0,0 @@ -package http - -import ( - "context" - - "github.com/ethereum/go-ethereum/swarm/api" - "github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/swarm/api/http/server.go b/vendor/github.com/ethereum/go-ethereum/swarm/api/http/server.go deleted file mode 100644 index 3c6735a7..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/metrics" - "github.com/ethereum/go-ethereum/swarm/api" - "github.com/ethereum/go-ethereum/swarm/log" - "github.com/ethereum/go-ethereum/swarm/storage" - "github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/swarm/api/http/templates.go b/vendor/github.com/ethereum/go-ethereum/swarm/api/http/templates.go deleted file mode 100644 index 986f5f88..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/swarm/api/http/test_server.go b/vendor/github.com/ethereum/go-ethereum/swarm/api/http/test_server.go deleted file mode 100644 index 97fdf0d8..00000000 --- a/vendor/github.com/ethereum/go-ethereum/swarm/api/http/test_server.go +++ /dev/null @@ -1,98 +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/ethereum/go-ethereum/swarm/api" - "github.com/ethereum/go-ethereum/swarm/storage" - "github.com/ethereum/go-ethereum/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 { - swarmDir, err := ioutil.TempDir("", "swarm-storage-test") - if err != nil { - t.Fatal(err) - } - - storeParams := storage.NewDefaultLocalStoreParams() - storeParams.DbCapacity = 5000000 - storeParams.CacheCapacity = 5000 - storeParams.Init(swarmDir) - localStore, err := storage.NewLocalStore(storeParams, nil) - if err != nil { - os.RemoveAll(swarmDir) - 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) - } - - feeds, err := feed.NewTestHandler(feedsDir, &feed.HandlerParams{}) - if err != nil { - t.Fatal(err) - } - - swarmApi := api.NewAPI(fileStore, resolver, feeds.Handler, nil) - apiServer := httptest.NewServer(serverFunc(swarmApi)) - - tss := &TestSwarmServer{ - Server: apiServer, - FileStore: fileStore, - dir: swarmDir, - Hasher: storage.MakeHashFunc(storage.DefaultHash)(), - cleanup: func() { - apiServer.Close() - fileStore.Close() - feeds.Close() - os.RemoveAll(swarmDir) - 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/vendor/github.com/ethereum/go-ethereum/swarm/api/inspector.go b/vendor/github.com/ethereum/go-ethereum/swarm/api/inspector.go deleted file mode 100644 index ea3c4c04..00000000 --- a/vendor/github.com/ethereum/go-ethereum/swarm/api/inspector.go +++ /dev/null @@ -1,67 +0,0 @@ -// 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 api - -import ( - "context" - "fmt" - - "github.com/ethereum/go-ethereum/swarm/network" - "github.com/ethereum/go-ethereum/swarm/storage" -) - -type Inspector struct { - api *API - hive *network.Hive - netStore *storage.NetStore -} - -func NewInspector(api *API, hive *network.Hive, netStore *storage.NetStore) *Inspector { - return &Inspector{api, hive, netStore} -} - -// Hive prints the kademlia table -func (inspector *Inspector) Hive() string { - return inspector.hive.String() -} - -func (inspector *Inspector) ListKnown() []string { - res := []string{} - for _, v := range inspector.hive.Kademlia.ListKnown() { - res = append(res, fmt.Sprintf("%v", v)) - } - return res -} - -type HasInfo struct { - Addr string `json:"address"` - Has bool `json:"has"` -} - -// Has checks whether each chunk address is present in the underlying datastore, -// the bool in the returned structs indicates if the underlying datastore has -// the chunk stored with the given address (true), or not (false) -func (inspector *Inspector) Has(chunkAddresses []storage.Address) []HasInfo { - results := make([]HasInfo, 0) - for _, addr := range chunkAddresses { - res := HasInfo{} - res.Addr = addr.String() - res.Has = inspector.netStore.Has(context.Background(), addr) - results = append(results, res) - } - return results -} diff --git a/vendor/github.com/ethereum/go-ethereum/swarm/api/manifest.go b/vendor/github.com/ethereum/go-ethereum/swarm/api/manifest.go deleted file mode 100644 index 890ed88b..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/ethereum/go-ethereum/swarm/storage/feed" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/swarm/log" - "github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/swarm/api/storage.go b/vendor/github.com/ethereum/go-ethereum/swarm/api/storage.go deleted file mode 100644 index 254375b7..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/swarm/api/testdata/test0/img/logo.png b/vendor/github.com/ethereum/go-ethereum/swarm/api/testdata/test0/img/logo.png deleted file mode 100644 index 9557f960535d520687f69a9a65b35e3637828dd9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4119 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 diff --git a/vendor/github.com/ethereum/go-ethereum/swarm/api/testdata/test0/index.css b/vendor/github.com/ethereum/go-ethereum/swarm/api/testdata/test0/index.css deleted file mode 100644 index 693b13a3..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/swarm/api/testdata/test0/index.html b/vendor/github.com/ethereum/go-ethereum/swarm/api/testdata/test0/index.html deleted file mode 100644 index 321e910d..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/swarm/api/uri.go b/vendor/github.com/ethereum/go-ethereum/swarm/api/uri.go deleted file mode 100644 index 09cfa450..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/swarm/bmt/bmt.go b/vendor/github.com/ethereum/go-ethereum/swarm/bmt/bmt.go deleted file mode 100644 index 18eab5a2..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/swarm/bmt/bmt_r.go b/vendor/github.com/ethereum/go-ethereum/swarm/bmt/bmt_r.go deleted file mode 100644 index 0cb6c146..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/swarm/chunk/chunk.go b/vendor/github.com/ethereum/go-ethereum/swarm/chunk/chunk.go deleted file mode 100644 index 7540af8c..00000000 --- a/vendor/github.com/ethereum/go-ethereum/swarm/chunk/chunk.go +++ /dev/null @@ -1,109 +0,0 @@ -package chunk - -import ( - "errors" - "fmt" - - "github.com/ethereum/go-ethereum/common" -) - -const ( - DefaultSize = 4096 - MaxPO = 16 - AddressLength = 32 -) - -var ( - ErrChunkNotFound = errors.New("chunk not found") - ErrChunkInvalid = errors.New("invalid chunk") -) - -type Chunk interface { - Address() Address - Data() []byte -} - -type chunk struct { - addr Address - sdata []byte -} - -func NewChunk(addr Address, data []byte) *chunk { - return &chunk{ - addr: addr, - sdata: data, - } -} - -func (c *chunk) Address() Address { - return c.addr -} - -func (c *chunk) Data() []byte { - return c.sdata -} - -func (self *chunk) String() string { - return fmt.Sprintf("Address: %v Chunksize: %v", self.addr.Log(), len(self.sdata)) -} - -type Address []byte - -var ZeroAddr = Address(common.Hash{}.Bytes()) - -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 -} - -// Proximity 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 -} diff --git a/vendor/github.com/ethereum/go-ethereum/swarm/dev/.dockerignore b/vendor/github.com/ethereum/go-ethereum/swarm/dev/.dockerignore deleted file mode 100644 index f9e69b37..00000000 --- a/vendor/github.com/ethereum/go-ethereum/swarm/dev/.dockerignore +++ /dev/null @@ -1,2 +0,0 @@ -bin/* -cluster/* diff --git a/vendor/github.com/ethereum/go-ethereum/swarm/dev/.gitignore b/vendor/github.com/ethereum/go-ethereum/swarm/dev/.gitignore deleted file mode 100644 index f9e69b37..00000000 --- a/vendor/github.com/ethereum/go-ethereum/swarm/dev/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -bin/* -cluster/* diff --git a/vendor/github.com/ethereum/go-ethereum/swarm/dev/Dockerfile b/vendor/github.com/ethereum/go-ethereum/swarm/dev/Dockerfile deleted file mode 100644 index 728bdab1..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/swarm/dev/Makefile b/vendor/github.com/ethereum/go-ethereum/swarm/dev/Makefile deleted file mode 100644 index 365964b7..00000000 --- a/vendor/github.com/ethereum/go-ethereum/swarm/dev/Makefile +++ /dev/null @@ -1,14 +0,0 @@ -.PHONY: build cluster test - -default: build - -build: - go build -o bin/swarm github.com/ethereum/go-ethereum/cmd/swarm - go build -o bin/geth github.com/ethereum/go-ethereum/cmd/geth - go build -o bin/bootnode github.com/ethereum/go-ethereum/cmd/bootnode - -cluster: build - scripts/boot-cluster.sh - -test: - go test -v github.com/ethereum/go-ethereum/swarm/... diff --git a/vendor/github.com/ethereum/go-ethereum/swarm/dev/README.md b/vendor/github.com/ethereum/go-ethereum/swarm/dev/README.md deleted file mode 100644 index 81e3b535..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/swarm/dev/bashrc b/vendor/github.com/ethereum/go-ethereum/swarm/dev/bashrc deleted file mode 100644 index efb504fa..00000000 --- a/vendor/github.com/ethereum/go-ethereum/swarm/dev/bashrc +++ /dev/null @@ -1,21 +0,0 @@ -export ROOT="${GOPATH}/src/github.com/ethereum/go-ethereum" -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/ethereum/go-ethereum" \ - --volume "/var/run/docker.sock:/var/run/docker.sock" \ - ${docker_args} \ - "${name}" \ - /bin/bash -} - -main "$@" diff --git a/vendor/github.com/ethereum/go-ethereum/swarm/dev/scripts/boot-cluster.sh b/vendor/github.com/ethereum/go-ethereum/swarm/dev/scripts/boot-cluster.sh deleted file mode 100755 index 98ae3c80..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/swarm/dev/scripts/random-uploads.sh b/vendor/github.com/ethereum/go-ethereum/swarm/dev/scripts/random-uploads.sh deleted file mode 100755 index 563a51be..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/swarm/dev/scripts/stop-cluster.sh b/vendor/github.com/ethereum/go-ethereum/swarm/dev/scripts/stop-cluster.sh deleted file mode 100755 index 89cb7b0c..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/swarm/dev/scripts/util.sh b/vendor/github.com/ethereum/go-ethereum/swarm/dev/scripts/util.sh deleted file mode 100644 index f17a12e4..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/swarm/docker/Dockerfile b/vendor/github.com/ethereum/go-ethereum/swarm/docker/Dockerfile deleted file mode 100644 index 9450609d..00000000 --- a/vendor/github.com/ethereum/go-ethereum/swarm/docker/Dockerfile +++ /dev/null @@ -1,32 +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/swarm/global-store && \ - go install -ldflags "-X main.gitCommit=${VERSION}" ./cmd/geth - - -FROM alpine:3.8 as swarm-smoke -WORKDIR / -COPY --from=builder /go/bin/swarm-smoke / -ADD run-smoke.sh /run-smoke.sh -ENTRYPOINT ["/run-smoke.sh"] - -FROM alpine:3.8 as swarm-global-store -WORKDIR / -COPY --from=builder /go/bin/global-store / -ENTRYPOINT ["/global-store"] - -FROM alpine:3.8 as swarm -WORKDIR / -COPY --from=builder /go/bin/swarm /go/bin/geth / -ADD run.sh /run.sh -ENTRYPOINT ["/run.sh"] diff --git a/vendor/github.com/ethereum/go-ethereum/swarm/docker/run-smoke.sh b/vendor/github.com/ethereum/go-ethereum/swarm/docker/run-smoke.sh deleted file mode 100755 index ba57a7ec..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/swarm/docker/run.sh b/vendor/github.com/ethereum/go-ethereum/swarm/docker/run.sh deleted file mode 100755 index 3e613b56..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/swarm/fuse/fuse_dir.go b/vendor/github.com/ethereum/go-ethereum/swarm/fuse/fuse_dir.go deleted file mode 100644 index 7f66451f..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/swarm/fuse/fuse_file.go b/vendor/github.com/ethereum/go-ethereum/swarm/fuse/fuse_file.go deleted file mode 100644 index ca04f737..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/ethereum/go-ethereum/swarm/log" - "github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/swarm/fuse/swarmfs.go b/vendor/github.com/ethereum/go-ethereum/swarm/fuse/swarmfs.go deleted file mode 100644 index db6aefb5..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/ethereum/go-ethereum/swarm/api" -) - -const ( - SwarmFSVersion = "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/vendor/github.com/ethereum/go-ethereum/swarm/fuse/swarmfs_unix.go b/vendor/github.com/ethereum/go-ethereum/swarm/fuse/swarmfs_unix.go deleted file mode 100644 index 54b879a4..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/swarm/api" - "github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/swarm/fuse/swarmfs_util.go b/vendor/github.com/ethereum/go-ethereum/swarm/fuse/swarmfs_util.go deleted file mode 100644 index 4f2e1416..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/swarm/log/log.go b/vendor/github.com/ethereum/go-ethereum/swarm/log/log.go deleted file mode 100644 index ce372632..00000000 --- a/vendor/github.com/ethereum/go-ethereum/swarm/log/log.go +++ /dev/null @@ -1,48 +0,0 @@ -package log - -import ( - l "github.com/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/swarm/metrics/flags.go b/vendor/github.com/ethereum/go-ethereum/swarm/metrics/flags.go deleted file mode 100644 index d348dc3e..00000000 --- a/vendor/github.com/ethereum/go-ethereum/swarm/metrics/flags.go +++ /dev/null @@ -1,108 +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/ethereum/go-ethereum/cmd/utils" - gethmetrics "github.com/ethereum/go-ethereum/metrics" - "github.com/ethereum/go-ethereum/metrics/influxdb" - "github.com/ethereum/go-ethereum/swarm/log" - cli "gopkg.in/urfave/cli.v1" -) - -var ( - MetricsEnableInfluxDBExportFlag = cli.BoolFlag{ - Name: "metrics.influxdb.export", - Usage: "Enable metrics export/push to an external InfluxDB database", - } - MetricsEnableInfluxDBAccountingExportFlag = cli.BoolFlag{ - Name: "metrics.influxdb.accounting", - Usage: "Enable accounting 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: "", - } - // 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 - MetricsInfluxDBTagsFlag = cli.StringFlag{ - Name: "metrics.influxdb.tags", - Usage: "Comma-separated InfluxDB tags (key/values) attached to all measurements", - Value: "host=localhost", - } -) - -// Flags holds all command-line flags required for metrics collection. -var Flags = []cli.Flag{ - utils.MetricsEnabledFlag, - MetricsEnableInfluxDBExportFlag, - MetricsEnableInfluxDBAccountingExportFlag, - MetricsInfluxDBEndpointFlag, - MetricsInfluxDBDatabaseFlag, - MetricsInfluxDBUsernameFlag, - MetricsInfluxDBPasswordFlag, - MetricsInfluxDBTagsFlag, -} - -func Setup(ctx *cli.Context) { - if gethmetrics.Enabled { - log.Info("Enabling swarm metrics collection") - var ( - endpoint = ctx.GlobalString(MetricsInfluxDBEndpointFlag.Name) - database = ctx.GlobalString(MetricsInfluxDBDatabaseFlag.Name) - username = ctx.GlobalString(MetricsInfluxDBUsernameFlag.Name) - password = ctx.GlobalString(MetricsInfluxDBPasswordFlag.Name) - enableExport = ctx.GlobalBool(MetricsEnableInfluxDBExportFlag.Name) - enableAccountingExport = ctx.GlobalBool(MetricsEnableInfluxDBAccountingExportFlag.Name) - ) - - // Start system runtime metrics collection - go gethmetrics.CollectProcessMetrics(2 * time.Second) - - tagsMap := utils.SplitTagsFlag(ctx.GlobalString(MetricsInfluxDBTagsFlag.Name)) - - if enableExport { - log.Info("Enabling swarm metrics export to InfluxDB") - go influxdb.InfluxDBWithTags(gethmetrics.DefaultRegistry, 10*time.Second, endpoint, database, username, password, "swarm.", tagsMap) - } - - if enableAccountingExport { - log.Info("Exporting swarm accounting metrics to InfluxDB") - go influxdb.InfluxDBWithTags(gethmetrics.AccountingRegistry, 10*time.Second, endpoint, database, username, password, "accounting.", tagsMap) - } - } -} diff --git a/vendor/github.com/ethereum/go-ethereum/swarm/network/README.md b/vendor/github.com/ethereum/go-ethereum/swarm/network/README.md deleted file mode 100644 index 684ad0c8..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/swarm/network/bitvector/bitvector.go b/vendor/github.com/ethereum/go-ethereum/swarm/network/bitvector/bitvector.go deleted file mode 100644 index 95832850..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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 network - -import ( - "context" - "fmt" - "sync" - - "github.com/ethereum/go-ethereum/swarm/pot" -) - -// discovery bzz extension for requesting and relaying node address records - -var sortPeers = noSortPeers - -// 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) -} - -// handleSubPeersMsg handles incoming subPeersMsg -// this message represents the saturation depth of the remote peer -// saturation depth is the radius within which the peer subscribes to peers -// the first time this is received we send peer info on all -// our connected peers that fall within peers saturation depth -// otherwise this depth is just recorded on the peer, so that -// subsequent new connections are sent iff they fall within the radius -func (d *Peer) handleSubPeersMsg(msg *subPeersMsg) error { - d.setDepth(msg.Depth) - // only send peers after the initial subPeersMsg - if !d.sentPeers { - var peers []*BzzAddr - // iterate connection in ascending order of disctance from the remote address - d.kad.EachConn(d.Over(), 255, func(p *Peer, po int) bool { - // terminate if we are beyond the radius - if uint8(po) < msg.Depth { - return false - } - if !d.seen(p.BzzAddr) { // here just records the peer sent - peers = append(peers, p.BzzAddr) - } - return true - }) - // if useful peers are found, send them over - if len(peers) > 0 { - go d.Send(context.TODO(), &peersMsg{Peers: sortPeers(peers)}) - } - } - d.sentPeers = true - return nil -} - -// seen takes a 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 -} - -func noSortPeers(peers []*BzzAddr) []*BzzAddr { - return peers -} diff --git a/vendor/github.com/ethereum/go-ethereum/swarm/network/enr.go b/vendor/github.com/ethereum/go-ethereum/swarm/network/enr.go deleted file mode 100644 index 6d7fa2ae..00000000 --- a/vendor/github.com/ethereum/go-ethereum/swarm/network/enr.go +++ /dev/null @@ -1,93 +0,0 @@ -package network - -import ( - "fmt" - "io" - - "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/rlp" - "github.com/ethereum/go-ethereum/swarm/log" -) - -// ENRAddrEntry is the entry type to store the bzz key in the enode -type ENRAddrEntry struct { - data []byte -} - -func NewENRAddrEntry(addr []byte) *ENRAddrEntry { - return &ENRAddrEntry{ - data: addr, - } -} - -func (b ENRAddrEntry) Address() []byte { - return b.data -} - -// ENRKey implements enr.Entry -func (b ENRAddrEntry) ENRKey() string { - return "bzzkey" -} - -// EncodeRLP implements rlp.Encoder -func (b ENRAddrEntry) EncodeRLP(w io.Writer) error { - log.Debug("in encoderlp", "b", b, "p", fmt.Sprintf("%p", &b)) - return rlp.Encode(w, &b.data) -} - -// DecodeRLP implements rlp.Decoder -func (b *ENRAddrEntry) DecodeRLP(s *rlp.Stream) error { - byt, err := s.Bytes() - if err != nil { - return err - } - b.data = byt - log.Debug("in decoderlp", "b", b, "p", fmt.Sprintf("%p", &b)) - return nil -} - -type ENRLightNodeEntry bool - -func (b ENRLightNodeEntry) ENRKey() string { - return "bzzlightnode" -} - -type ENRBootNodeEntry bool - -func (b ENRBootNodeEntry) ENRKey() string { - return "bzzbootnode" -} - -func getENRBzzPeer(p *p2p.Peer, rw p2p.MsgReadWriter, spec *protocols.Spec) *BzzPeer { - var lightnode ENRLightNodeEntry - var bootnode ENRBootNodeEntry - - // retrieve the ENR Record data - record := p.Node().Record() - record.Load(&lightnode) - record.Load(&bootnode) - - // get the address; separate function as long as we need swarm/network:NewAddr() to call it - addr := getENRBzzAddr(p.Node()) - - // build the peer using the retrieved data - return &BzzPeer{ - Peer: protocols.NewPeer(p, rw, spec), - LightNode: bool(lightnode), - BzzAddr: addr, - } -} - -func getENRBzzAddr(nod *enode.Node) *BzzAddr { - var addr ENRAddrEntry - - record := nod.Record() - record.Load(&addr) - - return &BzzAddr{ - OAddr: addr.data, - UAddr: []byte(nod.String()), - } -} diff --git a/vendor/github.com/ethereum/go-ethereum/swarm/network/fetcher.go b/vendor/github.com/ethereum/go-ethereum/swarm/network/fetcher.go deleted file mode 100644 index 5c0dfefc..00000000 --- a/vendor/github.com/ethereum/go-ethereum/swarm/network/fetcher.go +++ /dev/null @@ -1,336 +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" - "fmt" - "sync" - "time" - - "github.com/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/p2p/enode" - "github.com/ethereum/go-ethereum/swarm/storage" - "github.com/ethereum/go-ethereum/swarm/tracing" - olog "github.com/opentracing/opentracing-go/log" -) - -const ( - defaultSearchTimeout = 1 * time.Second - // maximum number of forwarded requests (hops), to make sure requests are not - // forwarded forever in peer loops - maxHopCount uint8 = 20 -) - -// Time to consider peer to be skipped. -// Also used in stream delivery. -var RequestTimeout = 10 * time.Second - -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 because the requester 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) - searchTimeout time.Duration - skipCheck bool - ctx context.Context -} - -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)) { - // deadline 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 constructs 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, peers *sync.Map) storage.NetFetcher { - fetcher := NewFetcher(ctx, source, f.request, f.skipCheck) - go fetcher.run(peers) - return fetcher -} - -// NewFetcher creates a new Fetcher for the given chunk address using the given request function. -func NewFetcher(ctx context.Context, addr storage.Address, rf RequestFunc, skipCheck bool) *Fetcher { - return &Fetcher{ - addr: addr, - protoRequestFunc: rf, - offerC: make(chan *enode.ID), - requestC: make(chan uint8), - searchTimeout: defaultSearchTimeout, - skipCheck: skipCheck, - ctx: ctx, - } -} - -// 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(source *enode.ID) { - // First we need to have this select to make sure that we return if context is done - select { - case <-f.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 <-f.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(hopCount uint8) { - // First we need to have this select to make sure that we return if context is done - select { - case <-f.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 <-f.ctx.Done(): - } -} - -// start prepares the Fetcher -// it keeps the Fetcher alive within the lifecycle of the passed context -func (f *Fetcher) run(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 - // requesting again 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: - // 2) chunk is requested, set requested flag - // launch a request iff none been launched yet - doRequest = !requested - log.Trace("new request", "request addr", f.addr, "doRequest", doRequest) - requested = true - - // peer we requested from is gone. fall back to another - // and remove the peer from the peers map - case id := <-gone: - peers.Delete(id.String()) - doRequest = requested - log.Trace("peer gone", "peer id", id.String(), "request addr", f.addr, "doRequest", doRequest) - - // search timeout: too much time passed since the last request, - // extend the search to a new peer if we can find one - case <-waitC: - doRequest = requested - log.Trace("search timed out: requesting", "request addr", f.addr, "doRequest", doRequest) - - // all Fetcher context closed, can quit - case <-f.ctx.Done(): - log.Trace("terminate fetcher", "request addr", f.addr) - // TODO: send cancellations 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(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(f.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 defaultSearchTimeout - wait.Reset(f.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(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 - log.Trace("fetcher.doRequest", "request addr", f.addr, "peer", req.Source.String()) - sourceID, quit, err = f.protoRequestFunc(f.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(f.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 <-f.ctx.Done(): - } - - // finish the request span - spanId := fmt.Sprintf("stream.send.request.%v.%v", *sourceID, req.Addr) - span := tracing.ShiftSpanByKey(spanId) - - if span != nil { - span.LogFields(olog.String("finish", "from doRequest")) - span.Finish() - } - }() - return sources, nil -} diff --git a/vendor/github.com/ethereum/go-ethereum/swarm/network/hive.go b/vendor/github.com/ethereum/go-ethereum/swarm/network/hive.go deleted file mode 100644 index a0b6b988..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/p2p" - "github.com/ethereum/go-ethereum/p2p/enode" - "github.com/ethereum/go-ethereum/swarm/log" - "github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/swarm/network/kademlia.go b/vendor/github.com/ethereum/go-ethereum/swarm/network/kademlia.go deleted file mode 100644 index 304f9cd7..00000000 --- a/vendor/github.com/ethereum/go-ethereum/swarm/network/kademlia.go +++ /dev/null @@ -1,919 +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/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/swarm/log" - "github.com/ethereum/go-ethereum/swarm/pot" - sv "github.com/ethereum/go-ethereum/swarm/version" -) - -/* - -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 { - log.Trace("kademlia trying to register", "addr", p) - // 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 { - log.Trace("registering new peer", "addr", p) - // insert new offline peer into conns - return newEntry(p) - } - - e := v.(*entry) - - // if underlay address is different, still add - if !bytes.Equal(e.BzzAddr.UAddr, p.UAddr) { - log.Trace("underlay addr is different, so add again", "new", p, "old", e.BzzAddr) - // insert new offline peer into conns - return newEntry(p) - } - - log.Trace("found among known peers, underlay addr is same, do nothing", "new", p, "old", e.BzzAddr) - - 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 an unconnected peer address as a peer suggestion for connection -func (k *Kademlia) SuggestPeer() (suggestedPeer *BzzAddr, saturationDepth int, changed bool) { - k.lock.Lock() - defer k.lock.Unlock() - radius := neighbourhoodRadiusForPot(k.conns, k.NeighbourhoodSize, k.base) - // collect undersaturated bins in ascending order of number of connected peers - // and from shallow to deep (ascending order of PO) - // insert them in a map of bin arrays, keyed with the number of connected peers - saturation := make(map[int][]int) - var lastPO int // the last non-empty PO bin in the iteration - saturationDepth = -1 // the deepest PO such that all shallower bins have >= k.MinBinSize peers - var pastDepth bool // whether po of iteration >= depth - k.conns.EachBin(k.base, Pof, 0, func(po, size int, f func(func(val pot.Val) bool) bool) bool { - // process skipped empty bins - for ; lastPO < po; lastPO++ { - // find the lowest unsaturated bin - if saturationDepth == -1 { - saturationDepth = lastPO - } - // if there is an empty bin, depth is surely passed - pastDepth = true - saturation[0] = append(saturation[0], lastPO) - } - lastPO = po + 1 - // past radius, depth is surely passed - if po >= radius { - pastDepth = true - } - // beyond depth the bin is treated as unsaturated even if size >= k.MinBinSize - // in order to achieve full connectivity to all neighbours - if pastDepth && size >= k.MinBinSize { - size = k.MinBinSize - 1 - } - // process non-empty unsaturated bins - if size < k.MinBinSize { - // find the lowest unsaturated bin - if saturationDepth == -1 { - saturationDepth = po - } - saturation[size] = append(saturation[size], po) - } - return true - }) - // to trigger peer requests for peers closer than closest connection, include - // all bins from nearest connection upto nearest address as unsaturated - var nearestAddrAt int - k.addrs.EachNeighbour(k.base, Pof, func(_ pot.Val, po int) bool { - nearestAddrAt = po - return false - }) - // including bins as size 0 has the effect that requesting connection - // is prioritised over non-empty shallower bins - for ; lastPO <= nearestAddrAt; lastPO++ { - saturation[0] = append(saturation[0], lastPO) - } - // all PO bins are saturated, ie., minsize >= k.MinBinSize, no peer suggested - if len(saturation) == 0 { - return nil, 0, false - } - // find the first callable peer in the address book - // starting from the bins with smallest size proceeding from shallow to deep - // for each bin (up until neighbourhood radius) we find callable candidate peers - for size := 0; size < k.MinBinSize && suggestedPeer == nil; size++ { - bins, ok := saturation[size] - if !ok { - // no bin with this size - continue - } - cur := 0 - curPO := bins[0] - k.addrs.EachBin(k.base, Pof, curPO, func(po, _ int, f func(func(pot.Val) bool) bool) bool { - curPO = bins[cur] - // find the next bin that has size size - if curPO == po { - cur++ - } else { - // skip bins that have no addresses - for ; cur < len(bins) && curPO < po; cur++ { - curPO = bins[cur] - } - if po < curPO { - cur-- - return true - } - // stop if there are no addresses - if curPO < po { - return false - } - } - // curPO found - // find a callable peer out of the addresses in the unsaturated bin - // stop if found - f(func(val pot.Val) bool { - e := val.(*entry) - if k.callable(e) { - suggestedPeer = e.BzzAddr - return false - } - return true - }) - return cur < len(bins) && suggestedPeer == nil - }) - } - - if uint8(saturationDepth) < k.depth { - k.depth = uint8(saturationDepth) - return suggestedPeer, saturationDepth, true - } - return suggestedPeer, 0, false -} - -// 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 -} - -// CloseNeighbourhoodDepthC closes the channel returned by -// NeighbourhoodDepthC and stops sending neighbourhood change. -func (k *Kademlia) CloseNeighbourhoodDepthC() { - k.lock.Lock() - defer k.lock.Unlock() - - if k.nDepthC != nil { - close(k.nDepthC) - k.nDepthC = nil - } -} - -// 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 { - k.lock.Lock() - defer k.lock.Unlock() - - if k.addrCountC == nil { - k.addrCountC = make(chan int) - } - return k.addrCountC -} - -// CloseAddrCountC closes the channel returned by -// AddrCountC and stops sending address count change. -func (k *Kademlia) CloseAddrCountC() { - k.lock.Lock() - defer k.lock.Unlock() - - if k.addrCountC != nil { - close(k.addrCountC) - k.addrCountC = nil - } -} - -// 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() - } -} - -func (k *Kademlia) ListKnown() []*BzzAddr { - res := []*BzzAddr{} - - k.addrs.Each(func(val pot.Val) bool { - e := val.(*entry) - res = append(res, e.BzzAddr) - return true - }) - - return res -} - -// 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) - }) -} - -// NeighbourhoodDepth returns the depth for the pot, see depthForPot -func (k *Kademlia) NeighbourhoodDepth() (depth int) { - k.lock.RLock() - defer k.lock.RUnlock() - return depthForPot(k.conns, k.NeighbourhoodSize, k.base) -} - -// neighbourhoodRadiusForPot returns the neighbourhood radius of the kademlia -// neighbourhood radius encloses the nearest neighbour set with size >= neighbourhoodSize -// i.e., neighbourhood radius is the deepest PO such that all bins not shallower altogether -// contain at least neighbourhoodSize connected peers -// if there is altogether less than neighbourhoodSize peers connected, it returns 0 -// caller must hold the lock -func neighbourhoodRadiusForPot(p *pot.Pot, neighbourhoodSize int, pivotAddr []byte) (depth int) { - if p.Size() <= neighbourhoodSize { - return 0 - } - // total number of peers in iteration - var size 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 { - depth = i - return false - } - - return true - } - p.EachNeighbour(pivotAddr, Pof, f) - return depth -} - -// depthForPot returns the depth for the pot -// depth is the radius of the minimal extension of nearest neighbourhood that -// includes all empty PO bins. I.e., depth is the deepest PO such that -// - it is not deeper than neighbourhood radius -// - all bins shallower than depth are not empty -// caller must hold the lock -func depthForPot(p *pot.Pot, neighbourhoodSize int, pivotAddr []byte) (depth int) { - if p.Size() <= neighbourhoodSize { - return 0 - } - // 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 - maxDepth := neighbourhoodRadiusForPot(p, neighbourhoodSize, pivotAddr) - - // 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, "=========================================================================") - if len(sv.GitCommit) > 0 { - rows = append(rows, fmt.Sprintf("commit hash: %s", sv.GitCommit)) - } - 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 - PeersPerBin []int -} - -// 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 - peersPerBin := make([]int, depth) - - // 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) - } else { - // for peers < depth, we just count the number in each bin - // the bin is the index of the slice - peersPerBin[po]++ - } - return true - }) - - log.Trace(fmt.Sprintf("%x PeerPotMap NNS: %s, peersPerBin", addrs[i][:4], LogAddrs(nns))) - ppmap[common.Bytes2Hex(a)] = &PeerPot{ - NNSet: nns, - PeersPerBin: peersPerBin, - } - } - return ppmap -} - -// saturation returns the smallest po value in which the node has less than MinBinSize peers -// if the iterator reaches neighbourhood radius, then the last bin + 1 is returned -func (k *Kademlia) saturation() int { - prev := -1 - radius := neighbourhoodRadiusForPot(k.conns, k.NeighbourhoodSize, k.base) - k.conns.EachBin(k.base, Pof, 0, func(po, size int, f func(func(val pot.Val) bool) bool) bool { - prev++ - if po >= radius { - return false - } - return prev == po && size >= k.MinBinSize - }) - if prev < 0 { - return 0 - } - return prev -} - -// isSaturated returns true if the kademlia is considered saturated, or false if not. -// It checks this by checking an array of ints called unsaturatedBins; each item in that array corresponds -// to the bin which is unsaturated (number of connections < k.MinBinSize). -// The bin is considered unsaturated only if there are actual peers in that PeerPot's bin (peersPerBin) -// (if there is no peer for a given bin, then no connection could ever be established; -// in a God's view this is relevant as no more peers will ever appear on that bin) -func (k *Kademlia) isSaturated(peersPerBin []int, depth int) bool { - // depth could be calculated from k but as this is called from `GetHealthInfo()`, - // the depth has already been calculated so we can require it as a parameter - - // early check for depth - if depth != len(peersPerBin) { - return false - } - unsaturatedBins := make([]int, 0) - k.conns.EachBin(k.base, Pof, 0, func(po, size int, f func(func(val pot.Val) bool) bool) bool { - - if po >= depth { - return false - } - log.Trace("peers per bin", "peersPerBin[po]", peersPerBin[po], "po", po) - // if there are actually peers in the PeerPot who can fulfill k.MinBinSize - if size < k.MinBinSize && size < peersPerBin[po] { - log.Trace("connections for po", "po", po, "size", size) - unsaturatedBins = append(unsaturatedBins, po) - } - return true - }) - - log.Trace("list of unsaturated bins", "unsaturatedBins", unsaturatedBins) - return len(unsaturatedBins) == 0 -} - -// 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: if in all bins < depth number of connections >= MinBinsize or, - // if number of connections < MinBinSize, to the number of available peers in that bin - Saturated bool - Hive string -} - -// GetHealthInfo 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) GetHealthInfo(pp *PeerPot) *Health { - k.lock.RLock() - defer k.lock.RUnlock() - if len(pp.NNSet) < k.NeighbourhoodSize { - log.Warn("peerpot NNSet < NeighbourhoodSize") - } - gotnn, countgotnn, culpritsgotnn := k.connectedNeighbours(pp.NNSet) - knownn, countknownn, culpritsknownn := k.knowNeighbours(pp.NNSet) - depth := depthForPot(k.conns, k.NeighbourhoodSize, k.base) - - // check saturation - saturated := k.isSaturated(pp.PeersPerBin, 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(), - } -} - -// Healthy return the strict interpretation of `Healthy` given a `Health` struct -// definition of strict health: all conditions must be true: -// - we at least know one peer -// - we know all neighbors -// - we are connected to all known neighbors -// - it is saturated -func (h *Health) Healthy() bool { - return h.KnowNN && h.ConnectNN && h.CountKnowNN > 0 && h.Saturated -} diff --git a/vendor/github.com/ethereum/go-ethereum/swarm/network/network.go b/vendor/github.com/ethereum/go-ethereum/swarm/network/network.go deleted file mode 100644 index c5c7e9b2..00000000 --- a/vendor/github.com/ethereum/go-ethereum/swarm/network/network.go +++ /dev/null @@ -1,105 +0,0 @@ -package network - -import ( - "crypto/ecdsa" - "fmt" - "net" - - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/p2p/enode" - "github.com/ethereum/go-ethereum/p2p/enr" -) - -// 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}, 30303, 30303) - 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())} -} - -func PrivateKeyToBzzKey(prvKey *ecdsa.PrivateKey) []byte { - pubkeyBytes := crypto.FromECDSAPub(&prvKey.PublicKey) - return crypto.Keccak256Hash(pubkeyBytes).Bytes() -} - -type EnodeParams struct { - PrivateKey *ecdsa.PrivateKey - EnodeKey *ecdsa.PrivateKey - Lightnode bool - Bootnode bool -} - -func NewEnodeRecord(params *EnodeParams) (*enr.Record, error) { - - if params.PrivateKey == nil { - return nil, fmt.Errorf("all param private keys must be defined") - } - - bzzkeybytes := PrivateKeyToBzzKey(params.PrivateKey) - - var record enr.Record - record.Set(NewENRAddrEntry(bzzkeybytes)) - record.Set(ENRLightNodeEntry(params.Lightnode)) - record.Set(ENRBootNodeEntry(params.Bootnode)) - return &record, nil -} - -func NewEnode(params *EnodeParams) (*enode.Node, error) { - record, err := NewEnodeRecord(params) - if err != nil { - return nil, err - } - err = enode.SignV4(record, params.EnodeKey) - if err != nil { - return nil, fmt.Errorf("ENR create fail: %v", err) - } - return enode.New(enode.V4ID{}, record) -} diff --git a/vendor/github.com/ethereum/go-ethereum/swarm/network/priorityqueue/priorityqueue.go b/vendor/github.com/ethereum/go-ethereum/swarm/network/priorityqueue/priorityqueue.go deleted file mode 100644 index 056e85ec..00000000 --- a/vendor/github.com/ethereum/go-ethereum/swarm/network/priorityqueue/priorityqueue.go +++ /dev/null @@ -1,118 +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" - "time" - - "github.com/ethereum/go-ethereum/metrics" -) - -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: - val := x.(struct { - v interface{} - t time.Time - }) - f(val.v) - metrics.GetOrRegisterResettingTimer("pq.run", nil).UpdateSince(val.t) - p = top - default: - if p > 0 { - p-- - continue READ - } - p = top - select { - case <-ctx.Done(): - return - case <-pq.wakeup: - } - } - } -} - -// 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 - } - val := struct { - v interface{} - t time.Time - }{ - x, - time.Now(), - } - select { - case pq.Queues[p] <- val: - default: - return ErrContention - } - select { - case pq.wakeup <- wakey: - default: - } - return nil -} diff --git a/vendor/github.com/ethereum/go-ethereum/swarm/network/protocol.go b/vendor/github.com/ethereum/go-ethereum/swarm/network/protocol.go deleted file mode 100644 index ad3f8df8..00000000 --- a/vendor/github.com/ethereum/go-ethereum/swarm/network/protocol.go +++ /dev/null @@ -1,335 +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" - "math/rand" - "sync" - "time" - - "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/rpc" - "github.com/ethereum/go-ethereum/swarm/log" - "github.com/ethereum/go-ethereum/swarm/state" -) - -const ( - DefaultNetworkID = 3 - // timeout for waiting - bzzHandshakeTimeout = 3000 * time.Millisecond -) - -var DefaultTestNetworkID = rand.Uint64() - -// 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 - BootnodeMode 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 { - bzz := &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, - } - - if config.BootnodeMode { - bzz.streamerRun = nil - bzz.streamerSpec = nil - } - - return bzz -} - -// 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.GetOrCreateHandshake(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.GetOrCreateHandshake(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) GetOrCreateHandshake(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 -} diff --git a/vendor/github.com/ethereum/go-ethereum/swarm/network/simulation/bucket.go b/vendor/github.com/ethereum/go-ethereum/swarm/network/simulation/bucket.go deleted file mode 100644 index 49a1f430..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/swarm/network/simulation/events.go b/vendor/github.com/ethereum/go-ethereum/swarm/network/simulation/events.go deleted file mode 100644 index d73c3af4..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/ethereum/go-ethereum/p2p/enode" - "github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/swarm/network/simulation/http.go b/vendor/github.com/ethereum/go-ethereum/swarm/network/simulation/http.go deleted file mode 100644 index 69ae3bae..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/swarm/network/simulation/kademlia.go b/vendor/github.com/ethereum/go-ethereum/swarm/network/simulation/kademlia.go deleted file mode 100644 index 00e870a0..00000000 --- a/vendor/github.com/ethereum/go-ethereum/swarm/network/simulation/kademlia.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" - "encoding/binary" - "encoding/hex" - "time" - - "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/simulations" - "github.com/ethereum/go-ethereum/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), "kad len", len(kademlias)) - for id, k := range kademlias { - //PeerPot for this node - addr := common.Bytes2Hex(k.BaseAddr()) - pp := ppmap[addr] - //call Healthy RPC - h := k.GetHealthInfo(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.Healthy() { - 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) - log.Debug("kademlia len items", "len", len(items)) - 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 -} - -// WaitTillSnapshotRecreated is blocking until all the connections specified -// in the snapshot are registered in the kademlia. -// It differs from WaitTillHealthy, which waits only until all the kademlias are -// healthy (it might happen even before all the connections are established). -func (s *Simulation) WaitTillSnapshotRecreated(ctx context.Context, snap *simulations.Snapshot) error { - expected := getSnapshotConnections(snap.Conns) - ticker := time.NewTicker(150 * time.Millisecond) - defer ticker.Stop() - - for { - select { - case <-ctx.Done(): - return ctx.Err() - case <-ticker.C: - actual := s.getActualConnections() - if isAllDeployed(expected, actual) { - return nil - } - } - } -} - -func (s *Simulation) getActualConnections() (res []uint64) { - kademlias := s.kademlias() - for base, k := range kademlias { - k.EachConn(base[:], 256, func(p *network.Peer, _ int) bool { - res = append(res, getConnectionHash(base, p.ID())) - return true - }) - } - - // only list those connections that appear twice (both peers should recognize connection as active) - res = removeDuplicatesAndSingletons(res) - return res -} - -func getSnapshotConnections(conns []simulations.Conn) (res []uint64) { - for _, c := range conns { - res = append(res, getConnectionHash(c.One, c.Other)) - } - return res -} - -// returns an integer connection identifier (similar to 8-byte hash) -func getConnectionHash(a, b enode.ID) uint64 { - var h [8]byte - for i := 0; i < 8; i++ { - h[i] = a[i] ^ b[i] - } - res := binary.LittleEndian.Uint64(h[:]) - return res -} - -// returns true if all connections in expected are listed in actual -func isAllDeployed(expected []uint64, actual []uint64) bool { - if len(expected) == 0 { - return true - } - - exp := make([]uint64, len(expected)) - copy(exp, expected) - for _, c := range actual { - // remove value c from exp - for i := 0; i < len(exp); i++ { - if exp[i] == c { - exp = removeListElement(exp, i) - if len(exp) == 0 { - return true - } - } - } - } - return len(exp) == 0 -} - -func removeListElement(arr []uint64, i int) []uint64 { - last := len(arr) - 1 - arr[i] = arr[last] - arr = arr[:last] - return arr -} - -func removeDuplicatesAndSingletons(arr []uint64) []uint64 { - for i := 0; i < len(arr); { - found := false - for j := i + 1; j < len(arr); j++ { - if arr[i] == arr[j] { - arr = removeListElement(arr, j) // remove duplicate - found = true - break - } - } - - if found { - i++ - } else { - arr = removeListElement(arr, i) // remove singleton - } - } - - return arr -} diff --git a/vendor/github.com/ethereum/go-ethereum/swarm/network/simulation/node.go b/vendor/github.com/ethereum/go-ethereum/swarm/network/simulation/node.go deleted file mode 100644 index 46c2bb86..00000000 --- a/vendor/github.com/ethereum/go-ethereum/swarm/network/simulation/node.go +++ /dev/null @@ -1,341 +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 ( - "bytes" - "context" - "crypto/ecdsa" - "encoding/json" - "errors" - "io/ioutil" - "math/rand" - "os" - "sync" - "time" - - "github.com/ethereum/go-ethereum/crypto" - "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/swarm/network" -) - -var ( - BucketKeyBzzPrivateKey BucketKey = "bzzprivkey" -) - -// 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 - } - - // add ENR records to the underlying node - // most importantly the bzz overlay address - // - // for now we have no way of setting bootnodes or lightnodes in sims - // so we just let them be set to false - // they should perhaps be possible to override them with AddNodeOption - bzzPrivateKey, err := BzzPrivateKeyFromConfig(conf) - if err != nil { - return enode.ID{}, err - } - - enodeParams := &network.EnodeParams{ - PrivateKey: bzzPrivateKey, - } - record, err := network.NewEnodeRecord(enodeParams) - conf.Record = *record - - // Add the bzz address to the node config - node, err := s.Net.NewNodeWithConfig(conf) - if err != nil { - return id, err - } - s.buckets[node.ID()] = new(sync.Map) - s.SetNodeItem(node.ID(), BucketKeyBzzPrivateKey, bzzPrivateKey) - - 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(ctx context.Context, snapshotFile string, opts ...AddNodeOption) error { - f, err := os.Open(snapshotFile) - if err != nil { - return err - } - defer f.Close() - - jsonbyte, err := ioutil.ReadAll(f) - if err != nil { - return err - } - var snap simulations.Snapshot - if err := json.Unmarshal(jsonbyte, &snap); err != nil { - return err - } - - //the snapshot probably has the property EnableMsgEvents not set - //set it to true (we need this to wait for messages before uploading) - for i := range snap.Nodes { - snap.Nodes[i].Node.Config.EnableMsgEvents = true - snap.Nodes[i].Node.Config.Services = s.serviceNames - for _, o := range opts { - o(snap.Nodes[i].Node.Config) - } - } - - if err := s.Net.Load(&snap); err != nil { - return err - } - return s.WaitTillSnapshotRecreated(ctx, &snap) -} - -// 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()) -} - -// derive a private key for swarm for the node key -// returns the private key used to generate the bzz key -func BzzPrivateKeyFromConfig(conf *adapters.NodeConfig) (*ecdsa.PrivateKey, error) { - // pad the seed key some arbitrary data as ecdsa.GenerateKey takes 40 bytes seed data - privKeyBuf := append(crypto.FromECDSA(conf.PrivateKey), []byte{0x62, 0x7a, 0x7a, 0x62, 0x7a, 0x7a, 0x62, 0x7a}...) - bzzPrivateKey, err := ecdsa.GenerateKey(crypto.S256(), bytes.NewReader(privKeyBuf)) - if err != nil { - return nil, err - } - return bzzPrivateKey, nil -} diff --git a/vendor/github.com/ethereum/go-ethereum/swarm/network/simulation/service.go b/vendor/github.com/ethereum/go-ethereum/swarm/network/simulation/service.go deleted file mode 100644 index 0ac8149a..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/ethereum/go-ethereum/node" - "github.com/ethereum/go-ethereum/p2p/enode" - "github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/swarm/network/simulation/simulation.go b/vendor/github.com/ethereum/go-ethereum/swarm/network/simulation/simulation.go deleted file mode 100644 index 5787cafd..00000000 --- a/vendor/github.com/ethereum/go-ethereum/swarm/network/simulation/simulation.go +++ /dev/null @@ -1,218 +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/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/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) { - s.mu.Lock() - defer s.mu.Unlock() - b, ok := s.buckets[ctx.Config.ID] - if !ok { - b = new(sync.Map) - } - service, cleanup, err := serviceFunc(ctx, b) - if err != nil { - return nil, err - } - 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/vendor/github.com/ethereum/go-ethereum/swarm/network/simulations/discovery/discovery.go b/vendor/github.com/ethereum/go-ethereum/swarm/network/simulations/discovery/discovery.go deleted file mode 100644 index a6ff5fd4..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/swarm/network/simulations/discovery/snapshot.json b/vendor/github.com/ethereum/go-ethereum/swarm/network/simulations/discovery/snapshot.json deleted file mode 100755 index f7f400eb..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/swarm/network/simulations/overlay.go b/vendor/github.com/ethereum/go-ethereum/swarm/network/simulations/overlay.go deleted file mode 100644 index 63938809..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/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/swarm/network" - "github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/swarm/network/stream/delivery.go b/vendor/github.com/ethereum/go-ethereum/swarm/network/stream/delivery.go deleted file mode 100644 index bc4f1f66..00000000 --- a/vendor/github.com/ethereum/go-ethereum/swarm/network/stream/delivery.go +++ /dev/null @@ -1,310 +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/ethereum/go-ethereum/metrics" - "github.com/ethereum/go-ethereum/p2p/enode" - "github.com/ethereum/go-ethereum/swarm/log" - "github.com/ethereum/go-ethereum/swarm/network" - "github.com/ethereum/go-ethereum/swarm/spancontext" - "github.com/ethereum/go-ethereum/swarm/storage" - "github.com/ethereum/go-ethereum/swarm/tracing" - opentracing "github.com/opentracing/opentracing-go" - olog "github.com/opentracing/opentracing-go/log" -) - -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, - "stream.handle.retrieve") - - osp.LogFields(olog.String("ref", req.Addr.String())) - - 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() { - defer osp.Finish() - 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 - osp.LogFields(olog.Bool("skipCheck", true)) - - err = sp.Deliver(ctx, chunk, s.priority, syncing) - if err != nil { - log.Warn("ERROR in handleRetrieveRequestMsg", "err", err) - } - osp.LogFields(olog.Bool("delivered", true)) - return - } - osp.LogFields(olog.Bool("skipCheck", false)) - 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 - -// chunk delivery msg is response to retrieverequest msg -func (d *Delivery) handleChunkDeliveryMsg(ctx context.Context, sp *Peer, req *ChunkDeliveryMsg) error { - var osp opentracing.Span - ctx, osp = spancontext.StartSpan( - ctx, - "handle.chunk.delivery") - - processReceivedChunksCount.Inc(1) - - // retrieve the span for the originating retrieverequest - spanId := fmt.Sprintf("stream.send.request.%v.%v", sp.ID(), req.Addr) - span := tracing.ShiftSpanByKey(spanId) - - log.Trace("handle.chunk.delivery", "ref", req.Addr, "from peer", sp.ID()) - - go func() { - defer osp.Finish() - - if span != nil { - span.LogFields(olog.String("finish", "from handleChunkDeliveryMsg")) - defer span.Finish() - } - - req.peer = sp - log.Trace("handle.chunk.delivery", "put", req.Addr) - 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) - } - } - log.Trace("handle.chunk.delivery", "done put", req.Addr, "err", err) - }() - return nil -} - -// RequestFromPeers sends a chunk retrieve request to a peer -// The most eligible peer that hasn't already been sent to is chosen -// TODO: define "eligible" -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) - // sp is nil, when we encounter a peer that is not registered for delivery, i.e. doesn't support the `stream` protocol - if sp == nil { - return true - } - spID = &id - return false - }) - if sp == nil { - return nil, nil, errors.New("no peer found") - } - } - - // setting this value in the context creates a new span that can persist across the sendpriority queue and the network roundtrip - // this span will finish only when delivery is handled (or times out) - ctx = context.WithValue(ctx, tracing.StoreLabelId, "stream.send.request") - ctx = context.WithValue(ctx, tracing.StoreLabelMeta, fmt.Sprintf("%v.%v", sp.ID(), req.Addr)) - log.Trace("request.from.peers", "peer", sp.ID(), "ref", req.Addr) - 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/vendor/github.com/ethereum/go-ethereum/swarm/network/stream/intervals/intervals.go b/vendor/github.com/ethereum/go-ethereum/swarm/network/stream/intervals/intervals.go deleted file mode 100644 index 562c3df9..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/swarm/network/stream/messages.go b/vendor/github.com/ethereum/go-ethereum/swarm/network/stream/messages.go deleted file mode 100644 index b293724c..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/ethereum/go-ethereum/metrics" - "github.com/ethereum/go-ethereum/swarm/log" - bv "github.com/ethereum/go-ethereum/swarm/network/bitvector" - "github.com/ethereum/go-ethereum/swarm/spancontext" - "github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/swarm/network/stream/peer.go b/vendor/github.com/ethereum/go-ethereum/swarm/network/stream/peer.go deleted file mode 100644 index 152814bd..00000000 --- a/vendor/github.com/ethereum/go-ethereum/swarm/network/stream/peer.go +++ /dev/null @@ -1,422 +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/ethereum/go-ethereum/metrics" - "github.com/ethereum/go-ethereum/p2p/protocols" - "github.com/ethereum/go-ethereum/swarm/log" - pq "github.com/ethereum/go-ethereum/swarm/network/priorityqueue" - "github.com/ethereum/go-ethereum/swarm/network/stream/intervals" - "github.com/ethereum/go-ethereum/swarm/spancontext" - "github.com/ethereum/go-ethereum/swarm/state" - "github.com/ethereum/go-ethereum/swarm/storage" - "github.com/ethereum/go-ethereum/swarm/tracing" - 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 lenMaxi int - var capMaxi int - for k := range pq.Queues { - if lenMaxi < len(pq.Queues[k]) { - lenMaxi = len(pq.Queues[k]) - } - - if capMaxi < cap(pq.Queues[k]) { - capMaxi = cap(pq.Queues[k]) - } - } - - metrics.GetOrRegisterGauge(fmt.Sprintf("pq_len_%s", p.ID().TerminalString()), nil).Update(int64(lenMaxi)) - metrics.GetOrRegisterGauge(fmt.Sprintf("pq_cap_%s", p.ID().TerminalString()), nil).Update(int64(capMaxi)) - 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 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 = context.WithValue(ctx, "stream_send_tag", nil) - 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()) - ctx = tracing.StartSaveSpan(ctx) - 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 != nil { - log.Error("err on p.pq.Push", "err", err, "peer", p.ID()) - } - 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() - - defer metrics.GetOrRegisterResettingTimer("send.offered.hashes", nil).UpdateSince(time.Now()) - - 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) - ctx = context.WithValue(ctx, "stream_send_tag", "send.offered.hashes") - 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/vendor/github.com/ethereum/go-ethereum/swarm/network/stream/stream.go b/vendor/github.com/ethereum/go-ethereum/swarm/network/stream/stream.go deleted file mode 100644 index 1038e52d..00000000 --- a/vendor/github.com/ethereum/go-ethereum/swarm/network/stream/stream.go +++ /dev/null @@ -1,999 +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/ethereum/go-ethereum/metrics" - "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/rpc" - "github.com/ethereum/go-ethereum/swarm/log" - "github.com/ethereum/go-ethereum/swarm/network" - "github.com/ethereum/go-ethereum/swarm/network/stream/intervals" - "github.com/ethereum/go-ethereum/swarm/state" - "github.com/ethereum/go-ethereum/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 = 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 - quit chan struct{} // terminates registry goroutines -} - -// 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 - - quit := make(chan struct{}) - - 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, - quit: quit, - } - - 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 { - select { - case i, ok := <-in: - if !ok { - return - } - select { - case <-out: - default: - } - out <- i - case <-quit: - return - } - } - }() - - return out - } - - kad := streamer.delivery.kad - // get notification channels from Kademlia before returning - // from this function to avoid race with Close method and - // the goroutine created below - depthC := latestIntC(kad.NeighbourhoodDepthC()) - addressBookSizeC := latestIntC(kad.AddrCountC()) - - go func() { - // wait for kademlia table to be healthy - // but return if Registry is closed before - select { - case <-time.After(options.SyncUpdateDelay): - case <-quit: - return - } - - // 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) - case <-quit: - break loop - } - } - 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 { - // Stop sending neighborhood depth change and address count - // change from Kademlia that were initiated in NewRegistry constructor. - r.delivery.kad.CloseNeighbourhoodDepthC() - r.delivery.kad.CloseAddrCountC() - close(r.quit) - 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 { - // nodes that do not provide stream protocol - // should not be subscribed, e.g. bootnodes - if !p.HasCap("stream") { - return true - } - //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 { - select { - case <-p.streamer.quit: - log.Trace("message received after the streamer is closed", "peer", p.ID()) - // return without an error since streamer is closed and - // no messages should be handled as other subcomponents like - // storage leveldb may be closed - return nil - default: - } - - 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{} - if err = c.intervalsStore.Get(c.intervalsKey, i); 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 - } - return c.AddInterval(req.From, req.To) -} - -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: false, - }, - } -} - -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) -} - -/* -GetPeerSubscriptions is a API function which allows to query a peer for stream subscriptions it has. -It can be called via RPC. -It returns a map of node IDs with an array of string representations of Stream objects. -*/ -func (api *API) GetPeerSubscriptions() map[string][]string { - //create the empty map - pstreams := make(map[string][]string) - - //iterate all streamer peers - api.streamer.peersMu.RLock() - defer api.streamer.peersMu.RUnlock() - - for id, p := range api.streamer.peers { - var streams []string - //every peer has a map of stream servers - //every stream server represents a subscription - p.serverMu.RLock() - for s := range p.servers { - //append the string representation of the stream - //to the list for this peer - streams = append(streams, s.String()) - } - p.serverMu.RUnlock() - //set the array of stream servers to the map - pstreams[id.String()] = streams - } - return pstreams -} diff --git a/vendor/github.com/ethereum/go-ethereum/swarm/network/stream/syncer.go b/vendor/github.com/ethereum/go-ethereum/swarm/network/stream/syncer.go deleted file mode 100644 index 5f03dcff..00000000 --- a/vendor/github.com/ethereum/go-ethereum/swarm/network/stream/syncer.go +++ /dev/null @@ -1,227 +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/ethereum/go-ethereum/metrics" - "github.com/ethereum/go-ethereum/swarm/log" - "github.com/ethereum/go-ethereum/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 { - select { - case <-s.quit: - return false - default: - } - 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/vendor/github.com/ethereum/go-ethereum/swarm/network/stream/testing/snapshot_128.json b/vendor/github.com/ethereum/go-ethereum/swarm/network/stream/testing/snapshot_128.json deleted file mode 100644 index d25fa51c..00000000 --- a/vendor/github.com/ethereum/go-ethereum/swarm/network/stream/testing/snapshot_128.json +++ /dev/null @@ -1 +0,0 @@ -{"nodes":[{"node":{"info":{"id":"dd92b3d42414fd5eff5c1e4ca55c63cd7036634049995b72a20cdf7ca1321978","name":"node_dd92b3d42414fd5eff5c1e4ca55c63cd7036634049995b72a20cdf7ca1321978","enode":"enode://dfc47747201ccdd02b200ec672c3884626a10fd4d395d729cd67e3172635873cbb9f20e1a9d402fe058c43705671b2b7b51b4fda33b1c71f67dc48fc8f80c93e@127.0.0.1:0","enr":"0xf88fb840de2ad283128b20ac2fb81c51ce7b4cc5e0fa78eee1fe7f79570a47d850263a8a1aa7e04415d06c9e35cfb89705a7574d3bc05b7881ace913df570dc72bdc27d10183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102dfc47747201ccdd02b200ec672c3884626a10fd4d395d729cd67e3172635873c","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"3ZKz1CQU/V7/XB5MpVxjzXA2Y0BJmVtyogzffKEyGXg=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: dd92b3\npopulation: 29 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 0f31 5c62 64e6 | 68 55fd (0) 5008 (0) 51c2 (0) 52b4 (0)\n001 7 b4e2 a9fa a861 957e | 29 9472 (0) 957e (0) 8b35 (0) 8d3e (0)\n002 8 ea3d ed12 ed2e efd6 | 17 efd6 (0) ee2b (0) eceb (0) ed12 (0)\n003 6 c2f9 c0ad cabf ce01 | 8 c52a (0) c2f9 (0) c0ad (0) ce01 (0)\n004 3 d125 d18a d23c | 3 d18a (0) d125 (0) d23c (0)\n============ DEPTH: 5 ==========================================\n005 1 d9d3 | 1 d9d3 (0)\n006 1 deec | 1 deec (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"dd92b3d42414fd5eff5c1e4ca55c63cd7036634049995b72a20cdf7ca1321978","private_key":"009fe52f1950de37f99e7888e92c1d26717ca84232a756701b4a642f2b642869","name":"node_dd92b3d42414fd5eff5c1e4ca55c63cd7036634049995b72a20cdf7ca1321978","services":["streamer"],"enable_msg_events":true,"port":45169},"up":true}},{"node":{"info":{"id":"fac808b79923931febd54e3611b79811b3973c777e7502bd56b9803d0c4bf785","name":"node_fac808b79923931febd54e3611b79811b3973c777e7502bd56b9803d0c4bf785","enode":"enode://d70fb3399dab49d5d0085dad53fc1383a10fe708bdbc54abcd67fe3207984bcb145ce8859b7576b0a6faa795fdf64eeb6c63759bac66f5c5baba4e6e522cead7@127.0.0.1:0","enr":"0xf88fb840f7f08be963b0a1326da55df415a377468da1b99d0e12583ab97b3af05ea36f930c3913e7e58b6154d71478ccf5836a56140d9ad60b819d94197d4c4892a10b870183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103d70fb3399dab49d5d0085dad53fc1383a10fe708bdbc54abcd67fe3207984bcb","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"+sgIt5kjkx/r1U42EbeYEbOXPHd+dQK9VrmAPQxL94U=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: fac808\npopulation: 37 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 14 3775 4746 4775 4589 | 68 55fd (0) 5008 (0) 51c2 (0) 52b4 (0)\n001 6 836e a861 a192 b245 | 29 9472 (0) 957e (0) 8b35 (0) 8fb8 (0)\n002 4 ce01 d18a deec dd92 | 14 c52a (0) c2f9 (0) c0ad (0) ce01 (0)\n003 5 eb01 efd6 ee2b eceb | 8 efd6 (0) ee2b (0) eceb (0) ed12 (0)\n004 6 f4a0 f611 f177 f005 | 6 f177 (0) f005 (0) f33c (0) f3d5 (0)\n============ DEPTH: 5 ==========================================\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 1 fa65 | 1 fa65 (0)\n009 1 fa9a | 1 fa9a (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"fac808b79923931febd54e3611b79811b3973c777e7502bd56b9803d0c4bf785","private_key":"59a3d47a5b2fa0f6cff34a3b7923fe5bd5bcd027704761ffaa4d22752484fe79","name":"node_fac808b79923931febd54e3611b79811b3973c777e7502bd56b9803d0c4bf785","services":["streamer"],"enable_msg_events":true,"port":34267},"up":true}},{"node":{"info":{"id":"b8695bec6c8e1e6794bb943b83629cd2c910067e6e178f6f8e33c4f0fa2d74f4","name":"node_b8695bec6c8e1e6794bb943b83629cd2c910067e6e178f6f8e33c4f0fa2d74f4","enode":"enode://f9fa2390fdb8807909e77cb819962e0e99aff947653d98f8214cd66694386f1ddb1902f61be1598592f66184534da5b7519cf7eacbdcde753ff8e9359f1ad7cd@127.0.0.1:0","enr":"0xf88fb8407259bd30798ce82b8b4d9dd309e5fa69a46bc8d320221016d5cc98922b865e5968fbe4704097f55dee037fe7f3638efec032c6fb00f2e850035a729c1407bd850183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103f9fa2390fdb8807909e77cb819962e0e99aff947653d98f8214cd66694386f1d","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"uGlb7GyOHmeUu5Q7g2Kc0skQBn5uF49vjjPE8PotdPQ=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: b8695b\npopulation: 28 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 3e19 4d75 72a5 | 68 0639 (0) 01a6 (0) 03eb (0) 034d (0)\n001 7 cabf ee2b ed2e f611 | 31 c52a (0) c2f9 (0) c0ad (0) c9ef (0)\n002 2 8012 8330 | 9 9472 (0) 957e (0) 8b35 (0) 8d3e (0)\n003 4 a9fa a861 acf8 a192 | 6 aedc (0) acf8 (0) aba7 (0) a861 (0)\n004 4 b5fc b4e2 b355 b245 | 5 b245 (0) b355 (0) b60e (0) b5fc (0)\n============ DEPTH: 5 ==========================================\n005 7 be0f bc71 bc29 bd48 | 7 be0f (0) bd48 (0) bd96 (0) bddb (0)\n006 0 | 0\n007 1 b9d9 | 1 b9d9 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"b8695bec6c8e1e6794bb943b83629cd2c910067e6e178f6f8e33c4f0fa2d74f4","private_key":"097a05bf51118f924f1adb26e6a452bb90533346ba3a28a13f3d0d984eccf2b6","name":"node_b8695bec6c8e1e6794bb943b83629cd2c910067e6e178f6f8e33c4f0fa2d74f4","services":["streamer"],"enable_msg_events":true,"port":44203},"up":true}},{"node":{"info":{"id":"72a53f0fb1b51855cb4054a39cbd1309a76a862d36e18af9ba0456a60325c06e","name":"node_72a53f0fb1b51855cb4054a39cbd1309a76a862d36e18af9ba0456a60325c06e","enode":"enode://05e3a75ccb0d9a1554a071d18873ceef4aec0d0ecb15840824ce3826f6c07e9e3fc43284c66bcbc0a57268a6efef655d7cf4cd12d9052f071e8c8374907716ef@127.0.0.1:0","enr":"0xf88fb840c57b532df76cb5be5b002107b74ba9b52855af33fe4d5233521e04bd89496c5472f49ace6d880f2d12d87c4e9296883a61ed286682e8e4cebe6a0092268f49770183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10305e3a75ccb0d9a1554a071d18873ceef4aec0d0ecb15840824ce3826f6c07e9e","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"cqU/D7G1GFXLQFSjnL0TCadqhi024Yr5ugRWpgMlwG4=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 72a53f\npopulation: 35 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 9 c0ad eb01 ee2b fac8 | 60 c52a (0) c2f9 (0) c0ad (0) c9ef (0)\n001 4 0807 0a21 27b5 3e19 | 30 03eb (0) 034d (0) 01a6 (0) 0639 (0)\n002 9 4a37 4bc8 4efa 4746 | 20 55fd (0) 5008 (0) 51c2 (0) 52b4 (0)\n003 5 6975 68a6 62f0 672a | 9 6daa (0) 6975 (0) 68a6 (0) 6379 (0)\n004 3 7a68 7bcb 7bee | 3 7a68 (0) 7bcb (0) 7bee (0)\n005 3 75e2 772a 77ee | 3 772a (0) 77ee (0) 75e2 (0)\n============ DEPTH: 6 ==========================================\n006 0 | 0\n007 1 73d0 | 1 73d0 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 1 72a7 | 1 72a7 (0)\n015 0 | 0\n========================================================================="}},"config":{"id":"72a53f0fb1b51855cb4054a39cbd1309a76a862d36e18af9ba0456a60325c06e","private_key":"b43306b3e3a12c45a24bacbc053382c7c985c642252fd778f0397ba9b30bfb78","name":"node_72a53f0fb1b51855cb4054a39cbd1309a76a862d36e18af9ba0456a60325c06e","services":["streamer"],"enable_msg_events":true,"port":40757},"up":true}},{"node":{"info":{"id":"f3d50811ef10661d3ef9978077cd7181387298f306833ab6e27f25cbb77435cd","name":"node_f3d50811ef10661d3ef9978077cd7181387298f306833ab6e27f25cbb77435cd","enode":"enode://935e2d2fb4ec2899b4a4fae26ea6325ff296a698da7c81b5a67870eba307c1869c91558f7b8835a8d6e78ff772a4330447bc3a1e94298a2e15733bc0272b4ad0@127.0.0.1:0","enr":"0xf88fb8406b3720141a112476eb8640a2b4253f2f73929aca065cf93cb76e6b04cc2e2b890c1657f0755ff355ad24af42636fcd866c96e5431800daa692711baa906569e20183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102935e2d2fb4ec2899b4a4fae26ea6325ff296a698da7c81b5a67870eba307c186","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"89UIEe8QZh0++ZeAd81xgThymPMGgzq24n8ly7d0Nc0=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: f3d508\npopulation: 26 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 3e19 72a5 | 68 0639 (0) 01a6 (0) 03eb (0) 034d (0)\n001 9 957e 8330 8012 a9fa | 29 9472 (0) 957e (0) 8b35 (0) 8d3e (0)\n002 2 d23c cabf | 14 c52a (0) c2f9 (0) c0ad (0) c9ef (0)\n003 6 ea3d eb01 ed2e ee2b | 8 e06f (0) efd6 (0) ee2b (0) eceb (0)\n004 2 fa65 fac8 | 3 fa9a (0) fac8 (0) fa65 (0)\n005 2 f4a0 f611 | 2 f611 (0) f4a0 (0)\n============ DEPTH: 6 ==========================================\n006 2 f177 f005 | 2 f177 (0) f005 (0)\n007 0 | 0\n008 1 f33c | 1 f33c (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"f3d50811ef10661d3ef9978077cd7181387298f306833ab6e27f25cbb77435cd","private_key":"1400f36ad2ebedcf9c8897f84d4c1145757c0b829eeead178385d6e58b8af6d2","name":"node_f3d50811ef10661d3ef9978077cd7181387298f306833ab6e27f25cbb77435cd","services":["streamer"],"enable_msg_events":true,"port":44709},"up":true}},{"node":{"info":{"id":"3e1959b29bbacb3ce7dccfa41c3e51b87f1afc700a3c6e4713c38cc0fe3790df","name":"node_3e1959b29bbacb3ce7dccfa41c3e51b87f1afc700a3c6e4713c38cc0fe3790df","enode":"enode://7dd2bef04deecdcb459658589d12dd5ccd1e8946309bac3a44e77161a25762e2eca61c3f151d0502c1d87a6617b91e39007101f5b9cad7b3c72ec216f566f436@127.0.0.1:0","enr":"0xf88fb840ff54e5bf97acf0f558d8bdda0e66ded18a9a0147bb097d7e18a3107d9b0720f13117a5b72582ebb9c81320b0ed489e15b31d85ae5c31684331caefd43e3173a00183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1027dd2bef04deecdcb459658589d12dd5ccd1e8946309bac3a44e77161a25762e2","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"PhlZspu6yzzn3M+kHD5RuH8a/HAKPG5HE8OMwP43kN8=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 3e1959\npopulation: 32 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 b355 b869 d23c e06f | 60 9472 (0) 957e (0) 8b35 (0) 8fb8 (0)\n001 9 4589 4775 52b4 62f0 | 38 55fd (0) 51c2 (0) 5008 (0) 52b4 (0)\n002 7 184e 1929 1740 127c | 13 0639 (0) 03eb (0) 034d (0) 01a6 (0)\n003 5 27b5 2471 2354 2803 | 11 2803 (0) 2dd4 (0) 2d53 (0) 21dc (0)\n004 3 36d5 3775 3590 | 3 3590 (0) 3775 (0) 36d5 (0)\n============ DEPTH: 5 ==========================================\n005 2 3871 3b83 | 2 3871 (0) 3b83 (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"3e1959b29bbacb3ce7dccfa41c3e51b87f1afc700a3c6e4713c38cc0fe3790df","private_key":"79b77704fc404ea988a22902c0829368cc662928cff0a0cd1da58204d8798187","name":"node_3e1959b29bbacb3ce7dccfa41c3e51b87f1afc700a3c6e4713c38cc0fe3790df","services":["streamer"],"enable_msg_events":true,"port":45515},"up":true}},{"node":{"info":{"id":"fa655b4882579e65937a14ab1c6bcba021580f0a5ebc04c48424f5ae72b7d5b4","name":"node_fa655b4882579e65937a14ab1c6bcba021580f0a5ebc04c48424f5ae72b7d5b4","enode":"enode://1bd15b81ce9c254be30f589cb832521a921c02c85d2816b7908cac8f0087244fb472c89900fdd6295768deef48504061995e3912039a46881d149fd5f38eebe0@127.0.0.1:0","enr":"0xf88fb84006acad544c50bd08be034b2ed91454d521ae949b4a8420cac9aa8a44849871fc14b06caa330bfc823a926ae6b2af2ec87c9d78a9ddd222cf1f35ef26518baf300183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1021bd15b81ce9c254be30f589cb832521a921c02c85d2816b7908cac8f0087244f","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"+mVbSIJXnmWTehSrHGvLoCFYDwpevATEhCT1rnK31bQ=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: fa655b\npopulation: 30 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 7bcb 4a3c 4589 27b5 | 68 55fd (0) 51c2 (0) 5008 (0) 52b4 (0)\n001 4 836e a192 b245 bc71 | 29 9472 (0) 957e (0) 8b35 (0) 8d3e (0)\n002 5 d18a d125 cc9f cabf | 14 c52a (0) c2f9 (0) c0ad (0) c9ef (0)\n003 7 e06f eb01 ee2b efd6 | 8 e06f (0) efd6 (0) ee2b (0) eceb (0)\n004 6 f177 f005 f33c f3d5 | 6 f611 (0) f4a0 (0) f177 (0) f005 (0)\n============ DEPTH: 5 ==========================================\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 2 fa9a fac8 | 2 fa9a (0) fac8 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"fa655b4882579e65937a14ab1c6bcba021580f0a5ebc04c48424f5ae72b7d5b4","private_key":"57a4b89b8685312b36e106e0ad52cb8ee76e8ded6c198f02a1ec38b354c211e5","name":"node_fa655b4882579e65937a14ab1c6bcba021580f0a5ebc04c48424f5ae72b7d5b4","services":["streamer"],"enable_msg_events":true,"port":42203},"up":true}},{"node":{"info":{"id":"2471776037d55a05df2b15bcefe52cb1f4c942e9e15113abc2a0c1fcbaa5d626","name":"node_2471776037d55a05df2b15bcefe52cb1f4c942e9e15113abc2a0c1fcbaa5d626","enode":"enode://782260bab233d14554e8f786b5415ffd70ac89c7c221556fdb89ffb4e8f6977ab28d8918a8255aecfcc50ac131dd44231c431d6bf85229f36f8f095b62a91bbe@127.0.0.1:0","enr":"0xf88fb84089e932678501d708a5f4b9ffb2523f4716179e653f829dc22d15905cea0441b67ab9de8d2d9e91914f5ff28e37867036b36714fa1ea6e017dd084e64029850c50183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102782260bab233d14554e8f786b5415ffd70ac89c7c221556fdb89ffb4e8f6977a","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"JHF3YDfVWgXfKxW87+UssfTJQunhUROrwqDB/Lql1iY=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 247177\npopulation: 33 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 10 a192 acf8 a9fa a861 | 60 9472 (0) 957e (0) 8b35 (0) 8fb8 (0)\n001 5 4775 5c62 62f0 64e6 | 38 55fd (0) 51c2 (0) 5008 (0) 52b4 (0)\n002 5 0e34 0a21 127c 1929 | 13 0639 (0) 01a6 (0) 034d (0) 03eb (0)\n003 3 36d5 3871 3e19 | 6 3590 (0) 3775 (0) 36d5 (0) 3b83 (0)\n004 3 2803 2dd4 2d53 | 3 2803 (0) 2dd4 (0) 2d53 (0)\n005 5 216e 21dc 221c 22bb | 5 216e (0) 21dc (0) 22bb (0) 221c (0)\n============ DEPTH: 6 ==========================================\n006 2 27db 27b5 | 2 27db (0) 27b5 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"2471776037d55a05df2b15bcefe52cb1f4c942e9e15113abc2a0c1fcbaa5d626","private_key":"4fb235ecc4c97edf33736a85d3641e652e3713b0c77d9870ab993eb9d10afcc2","name":"node_2471776037d55a05df2b15bcefe52cb1f4c942e9e15113abc2a0c1fcbaa5d626","services":["streamer"],"enable_msg_events":true,"port":41591},"up":true}},{"node":{"info":{"id":"27b56302a89605a83563ba7b66d491ec25edfad0ea1010937fcadeab4d3ae582","name":"node_27b56302a89605a83563ba7b66d491ec25edfad0ea1010937fcadeab4d3ae582","enode":"enode://2c8d76747698073fd7707081b9c643e9bd58242098e91b191f417fbbcc60dc236b8df6bb2011488880af007b77f3f826285fb2ce1ff1bcbe04c21d6fb373c111@127.0.0.1:0","enr":"0xf88fb8400b8f821da1310d4ecd5caff36e8ddaa69544654cd1241aa92aae063aac2a9f9472aa9f4b065c3a29a54feff65021b136e635a9379f9af99e57923535df10c73c0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1032c8d76747698073fd7707081b9c643e9bd58242098e91b191f417fbbcc60dc23","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"J7VjAqiWBag1Y7p7ZtSR7CXt+tDqEBCTf8req0065YI=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 27b563\npopulation: 26 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 fa65 ea3d | 60 9472 (0) 957e (0) 8b35 (0) 8fb8 (0)\n001 8 7bee 72a5 64e6 672a | 38 55fd (0) 51c2 (0) 5008 (0) 52b4 (0)\n002 5 184e 127c 0e34 0807 | 13 0639 (0) 034d (0) 03eb (0) 01a6 (0)\n003 2 3e19 36d5 | 6 3590 (0) 3775 (0) 36d5 (0) 3b83 (0)\n004 2 2803 2d53 | 3 2803 (0) 2dd4 (0) 2d53 (0)\n005 5 216e 21dc 2354 221c | 5 216e (0) 21dc (0) 221c (0) 22bb (0)\n============ DEPTH: 6 ==========================================\n006 1 2471 | 1 2471 (0)\n007 0 | 0\n008 0 | 0\n009 1 27db | 1 27db (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"27b56302a89605a83563ba7b66d491ec25edfad0ea1010937fcadeab4d3ae582","private_key":"e230f8ba6e49724537db8be23422f340405faa744171eda44d4414b8841f8d65","name":"node_27b56302a89605a83563ba7b66d491ec25edfad0ea1010937fcadeab4d3ae582","services":["streamer"],"enable_msg_events":true,"port":37611},"up":true}},{"node":{"info":{"id":"ea3d6aa50ad5a1d5647d213f9b5cfe6718339eec7eef8644487eb3c223c7bcde","name":"node_ea3d6aa50ad5a1d5647d213f9b5cfe6718339eec7eef8644487eb3c223c7bcde","enode":"enode://e3382fa3db3fda2f1f3729fc5eab5747a80c97abf5536b24fe20890ac988d61c0e3df2f91553c2768db16fdd48bfa36ec3c3e2ac4696137162859d238e4d8509@127.0.0.1:0","enr":"0xf88fb8409cf06d414b5b67bcf1e38e69f509a14cb0dcbb61db09fab4ce36203ef99b5a287b96c3febcbc9686f75736cdc30446d392ac7ad1e3cae7afece3d609b3c964f00183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103e3382fa3db3fda2f1f3729fc5eab5747a80c97abf5536b24fe20890ac988d61c","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"6j1qpQrVodVkfSE/m1z+Zxgznux+74ZESH6zwiPHvN4=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: ea3d6a\npopulation: 31 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 8 4d75 4775 4746 4589 | 68 55fd (0) 51c2 (0) 5008 (0) 52b4 (0)\n001 4 a9fa a192 8330 8012 | 29 9472 (0) 957e (0) 8fb8 (0) 8d3e (0)\n002 7 c52a c2f9 d9d3 dd92 | 14 d18a (0) d125 (0) d23c (0) d9d3 (0)\n003 5 fa9a f3d5 f33c f177 | 9 fa9a (0) fac8 (0) fa65 (0) f33c (0)\n004 1 e06f | 1 e06f (0)\n============ DEPTH: 5 ==========================================\n005 5 eceb ed12 ed2e efd6 | 5 eceb (0) ed12 (0) ed2e (0) efd6 (0)\n006 0 | 0\n007 1 eb01 | 1 eb01 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"ea3d6aa50ad5a1d5647d213f9b5cfe6718339eec7eef8644487eb3c223c7bcde","private_key":"7c2c7b1ed36aa7347eb5dd1069e933f2226e857d909980a5d78571de6aeb6867","name":"node_ea3d6aa50ad5a1d5647d213f9b5cfe6718339eec7eef8644487eb3c223c7bcde","services":["streamer"],"enable_msg_events":true,"port":46599},"up":true}},{"node":{"info":{"id":"f4a0f76b30bcf5987cfa3f4f4b0aa3445f39d60a1f51519fa660c27b5d833dde","name":"node_f4a0f76b30bcf5987cfa3f4f4b0aa3445f39d60a1f51519fa660c27b5d833dde","enode":"enode://71e720933310fdd429e11130816957617b45fd95d2e8bb1ac6e70b351c3bf2e1ad4934cef5497f766939836952bc939d6c4d694db17ee23aa22e687f7e4f1e61@127.0.0.1:0","enr":"0xf88fb840f9c7fe83c3c9fd5157e8e3320ab57aa3c67f6e1c4330581593214ef13e34ec42370db0c4aeed95c3133bf33247f122a93905351c98c5558e6d7274dd63258c0a0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10371e720933310fdd429e11130816957617b45fd95d2e8bb1ac6e70b351c3bf2e1","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"9KD3azC89Zh8+j9PSwqjRF851gofUVGfpmDCe12DPd4=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: f4a0f7\npopulation: 32 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 11 72a5 4efa 4bc8 4a37 | 68 55fd (0) 52b4 (0) 51c2 (0) 5008 (0)\n001 4 b245 a192 836e 8330 | 29 9472 (0) 957e (0) 8fb8 (0) 8d3e (0)\n002 5 cc5f c2f9 c0ad d23c | 14 d18a (0) d125 (0) d23c (0) d9d3 (0)\n003 4 efd6 ee2b eb01 ea3d | 8 e06f (0) eceb (0) ed12 (0) ed2e (0)\n004 3 fac8 fa9a fa65 | 3 fa9a (0) fac8 (0) fa65 (0)\n============ DEPTH: 5 ==========================================\n005 4 f005 f177 f33c f3d5 | 4 f005 (0) f177 (0) f33c (0) f3d5 (0)\n006 1 f611 | 1 f611 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"f4a0f76b30bcf5987cfa3f4f4b0aa3445f39d60a1f51519fa660c27b5d833dde","private_key":"ea1b57ee39036543e929539274921246c082c626d3338b562352e1570697b380","name":"node_f4a0f76b30bcf5987cfa3f4f4b0aa3445f39d60a1f51519fa660c27b5d833dde","services":["streamer"],"enable_msg_events":true,"port":36907},"up":true}},{"node":{"info":{"id":"184e9e00ab4fe1669d4d99fb33d418d33eff927da38cc997f69679443c24b20b","name":"node_184e9e00ab4fe1669d4d99fb33d418d33eff927da38cc997f69679443c24b20b","enode":"enode://e7521d45b3c81db4b1bfc556f89dbdbc47fc7ac609fe1eafc0a7e830bee2b50f8b128616da05f3eeed91033d64402dbec46238c619da3c159c67c715fcc42c96@127.0.0.1:0","enr":"0xf88fb84045617828d5c7c09265f7dd67603ac0e5cb3e13bfd1aa995f4fa2f933c1257a6476590491ceb0211c9174c55e57d0a600bc20d608f2b1ced80363254101b91a290183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102e7521d45b3c81db4b1bfc556f89dbdbc47fc7ac609fe1eafc0a7e830bee2b50f","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"GE6eAKtP4WadTZn7M9QY0z7/kn2jjMmX9pZ5RDwksgs=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 184e9e\npopulation: 33 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 b355 a192 d23c e06f | 60 9472 (0) 957e (0) 8b35 (0) 8fb8 (0)\n001 9 5c62 52b4 4746 4d75 | 38 55fd (0) 5008 (0) 51c2 (0) 52b4 (0)\n002 8 2354 27b5 2471 2803 | 17 3590 (0) 3775 (0) 36d5 (0) 3b83 (0)\n003 7 0639 034d 03eb 01a6 | 8 0639 (0) 03eb (0) 034d (0) 01a6 (0)\n============ DEPTH: 4 ==========================================\n004 3 1740 1385 127c | 3 1740 (0) 1385 (0) 127c (0)\n005 0 | 0\n006 0 | 0\n007 1 1929 | 1 1929 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"184e9e00ab4fe1669d4d99fb33d418d33eff927da38cc997f69679443c24b20b","private_key":"3d7c42c0ee77391c165bc551bc1353809a10a3dc98a861729720d549f7b63386","name":"node_184e9e00ab4fe1669d4d99fb33d418d33eff927da38cc997f69679443c24b20b","services":["streamer"],"enable_msg_events":true,"port":43977},"up":true}},{"node":{"info":{"id":"64e642de2667a7563c774050d368858d99aff433efbd1cb68361e3e244629b03","name":"node_64e642de2667a7563c774050d368858d99aff433efbd1cb68361e3e244629b03","enode":"enode://78910b44088439d364d5486fd9eee45c43f910ad4e7a1fa7bd925bef18455f7f3e21397047344aa0abca519d7f19211c5998fb9d1977c9eb0c3586a7f3cd6c9a@127.0.0.1:0","enr":"0xf88fb8402ae44f0913233c76e5590653b9801497737a50b397a877f4bf3e49c453aa41f57cbc4a5fc6a128aa2726ea9f4bac6411fd90ef86c39ad02424c4842187c11ce30183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10278910b44088439d364d5486fd9eee45c43f910ad4e7a1fa7bd925bef18455f7f","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"ZOZC3iZnp1Y8d0BQ02iFjZmv9DPvvRy2g2Hj4kRimwM=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 64e642\npopulation: 24 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 ee2b dd92 bc71 | 60 d23c (0) d18a (0) d125 (0) d9d3 (0)\n001 9 2354 2471 27b5 2d53 | 30 3590 (0) 3775 (0) 36d5 (0) 3b83 (0)\n002 2 4746 4a3c | 20 55fd (0) 51c2 (0) 5008 (0) 52b4 (0)\n003 3 7bee 75e2 72a5 | 9 7a68 (0) 7bcb (0) 7bee (0) 73d0 (0)\n004 2 68a6 6975 | 3 6daa (0) 6975 (0) 68a6 (0)\n005 2 62f0 6379 | 2 6379 (0) 62f0 (0)\n006 1 672a | 1 672a (0)\n============ DEPTH: 7 ==========================================\n007 0 | 0\n008 2 6450 641a | 2 6450 (0) 641a (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"64e642de2667a7563c774050d368858d99aff433efbd1cb68361e3e244629b03","private_key":"01c1a76aef076f97db9bf60e66af44d4d529abe0f71f0b856c4508431e1792c9","name":"node_64e642de2667a7563c774050d368858d99aff433efbd1cb68361e3e244629b03","services":["streamer"],"enable_msg_events":true,"port":41283},"up":true}},{"node":{"info":{"id":"bc71f3e409edb989e26607448491530c5451053b582ea64d882525451ac940bb","name":"node_bc71f3e409edb989e26607448491530c5451053b582ea64d882525451ac940bb","enode":"enode://0f1575d3b450347bb3500ed09bb0e0ff0fbf252b802e2a0e8e1ede7fedf7f6b64e2326928de87bb45800a8498d20b6bdfdd80fbd0041d7bbed546c86cbe8953e@127.0.0.1:0","enr":"0xf88fb840a158d2da63bc36da645177c654f2ca0a6cec837921556ecb04a65d57509dc46f66b7c4edfbefc8233e72992e4a8a3e41523af33e57ccd3966ae53be8491f3d3e0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1020f1575d3b450347bb3500ed09bb0e0ff0fbf252b802e2a0e8e1ede7fedf7f6b6","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"vHHz5AntuYniZgdEhJFTDFRRBTtYLqZNiCUlRRrJQLs=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: bc71f3\npopulation: 26 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 64e6 75e2 | 68 3590 (0) 3775 (0) 36d5 (0) 3871 (0)\n001 3 cabf f3d5 fa65 | 31 f33c (0) f3d5 (0) f177 (0) f005 (0)\n002 7 957e 9472 8fb8 8284 | 9 9472 (0) 957e (0) 8b35 (0) 8d3e (0)\n003 3 a861 a9fa a192 | 6 aedc (0) acf8 (0) aba7 (0) a9fa (0)\n004 3 b4e2 b355 b245 | 5 b60e (0) b5fc (0) b4e2 (0) b355 (0)\n005 2 b869 b9d9 | 2 b9d9 (0) b869 (0)\n006 1 be0f | 1 be0f (0)\n============ DEPTH: 7 ==========================================\n007 4 bd48 bd96 bddb bde9 | 4 bd48 (0) bd96 (0) bddb (0) bde9 (0)\n008 0 | 0\n009 1 bc29 | 1 bc29 (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"bc71f3e409edb989e26607448491530c5451053b582ea64d882525451ac940bb","private_key":"6dccee837e7d946fc35f7afeb74d1977abaa3488cdf673d9e8a0a0d9d6ed0c21","name":"node_bc71f3e409edb989e26607448491530c5451053b582ea64d882525451ac940bb","services":["streamer"],"enable_msg_events":true,"port":36167},"up":true}},{"node":{"info":{"id":"75e282c0f3d355a40573e6578c5aac98e7262970a9239f4dcefd26d6f008b553","name":"node_75e282c0f3d355a40573e6578c5aac98e7262970a9239f4dcefd26d6f008b553","enode":"enode://0929c1d89eedea4cba85836dfc498319bbc4fa3a811ad84aef807af863b80365d86fc93e87d85f44822c9930d62eb6668cc64ad0fab431c7afe2824529e934f7@127.0.0.1:0","enr":"0xf88fb840d80d8a682e3360189c74b617f133ec7585e50d9dbed3329e8625c30c1d7471353fdf1a49ca51ca63b7c0dff86d48c2bd2d19f6c45fae4b5587fe23c6781bee3f0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1030929c1d89eedea4cba85836dfc498319bbc4fa3a811ad84aef807af863b80365","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"deKCwPPTVaQFc+ZXjFqsmOcmKXCpI59Nzv0m1vAItVM=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 75e282\npopulation: 42 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 8 ee2b eb01 c0ad cc5f | 60 f33c (0) f3d5 (0) f005 (0) f177 (0)\n001 5 0807 0a21 3e19 2d53 | 30 3590 (0) 3775 (0) 36d5 (0) 3871 (0)\n002 12 5008 52b4 5a8b 5c62 | 20 55fd (0) 51c2 (0) 5008 (0) 52b4 (0)\n003 9 64e6 6450 641a 672a | 9 6daa (0) 6975 (0) 68a6 (0) 6379 (0)\n004 3 7a68 7bcb 7bee | 3 7a68 (0) 7bcb (0) 7bee (0)\n005 3 73d0 72a5 72a7 | 3 73d0 (0) 72a7 (0) 72a5 (0)\n============ DEPTH: 6 ==========================================\n006 2 772a 77ee | 2 772a (0) 77ee (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"75e282c0f3d355a40573e6578c5aac98e7262970a9239f4dcefd26d6f008b553","private_key":"cdafa79406c7b344d079038e1495604987c7c5cb47cc80bb494dc78d10085474","name":"node_75e282c0f3d355a40573e6578c5aac98e7262970a9239f4dcefd26d6f008b553","services":["streamer"],"enable_msg_events":true,"port":39125},"up":true}},{"node":{"info":{"id":"cc5fa2d49210e240983b0853ff15003f0d366f05cb1f6486bae2862cca852cc5","name":"node_cc5fa2d49210e240983b0853ff15003f0d366f05cb1f6486bae2862cca852cc5","enode":"enode://1a24350591770da447d5dbf6fba74dd85dd27050cc1a68603b8cb89e76b2eb77b4022b9d2cfbadc9d4a727b883104cc0b56287d9675b33d8c4d0f4f32f75e4e4@127.0.0.1:0","enr":"0xf88fb840b98c3132ab4d278a63670e3ae4432632206c358799c769ff7083d4b91cbad7d65f7b5fd6d79c96d8841b3e81ce9c3e58d82837512f7cfdd3619ddebea6e926e00183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1021a24350591770da447d5dbf6fba74dd85dd27050cc1a68603b8cb89e76b2eb77","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"zF+i1JIQ4kCYOwhT/xUAPw02bwXLH2SGuuKGLMqFLMU=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: cc5fa2\npopulation: 27 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 0f31 01a6 68a6 75e2 | 68 3590 (0) 3775 (0) 36d5 (0) 3871 (0)\n001 4 be0f b4e2 a9fa 8012 | 29 9472 (0) 957e (0) 8b35 (0) 8d3e (0)\n002 6 eceb ed12 ed2e f177 | 17 f33c (0) f3d5 (0) f177 (0) f005 (0)\n003 6 deec dd92 d9d3 d23c | 6 d18a (0) d125 (0) d23c (0) d9d3 (0)\n004 3 c52a c0ad c2f9 | 3 c52a (0) c2f9 (0) c0ad (0)\n005 2 c9ef cabf | 2 c9ef (0) cabf (0)\n============ DEPTH: 6 ==========================================\n006 1 ce01 | 1 ce01 (0)\n007 0 | 0\n008 1 cc9f | 1 cc9f (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"cc5fa2d49210e240983b0853ff15003f0d366f05cb1f6486bae2862cca852cc5","private_key":"e1260778d751d38a387d4a88c5e115edf9e5478423866b27485a2292dc8e8c5a","name":"node_cc5fa2d49210e240983b0853ff15003f0d366f05cb1f6486bae2862cca852cc5","services":["streamer"],"enable_msg_events":true,"port":35235},"up":true}},{"node":{"info":{"id":"68a63ebc4833dedfdb6d534438ffcccd042f60434bee0e39f4cb3726e7413e7a","name":"node_68a63ebc4833dedfdb6d534438ffcccd042f60434bee0e39f4cb3726e7413e7a","enode":"enode://45b4b209ea27a1478d3439b7b1c5e07f0f8021590ce28e6e498788ffc5a97d2372743f9b838796df1a3784a7e7d36abacf6f765e69941f4735b52eeab4bbcac5@127.0.0.1:0","enr":"0xf88fb840adb223ccf956ef0b48ac44f1fb4955cd78f315fae65a8a26fe14a6b0516b68982cd7f7c163fd51357a9c9f8cf8b7d7a8b002b933909fa33e717cb15e8a9e5bbb0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10345b4b209ea27a1478d3439b7b1c5e07f0f8021590ce28e6e498788ffc5a97d23","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"aKY+vEgz3t/bbVNEOP/MzQQvYENL7g459Ms3JudBPno=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 68a63e\npopulation: 27 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 8 b9d9 a192 a861 a9fa | 60 a192 (0) aedc (0) acf8 (0) aba7 (0)\n001 4 0807 03eb 27b5 3e19 | 30 3590 (0) 3775 (0) 36d5 (0) 3871 (0)\n002 4 52b4 5a8b 4bc8 4a3c | 20 55fd (0) 51c2 (0) 5008 (0) 52b4 (0)\n003 3 7bee 75e2 72a5 | 9 7a68 (0) 7bcb (0) 7bee (0) 73d0 (0)\n004 6 6379 62f0 672a 6450 | 6 6379 (0) 62f0 (0) 672a (0) 6450 (0)\n============ DEPTH: 5 ==========================================\n005 1 6daa | 1 6daa (0)\n006 0 | 0\n007 1 6975 | 1 6975 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"68a63ebc4833dedfdb6d534438ffcccd042f60434bee0e39f4cb3726e7413e7a","private_key":"5b70dd7e5dac1e6c7338aa2968162aec253e332ea3599bec657be6d04f612da6","name":"node_68a63ebc4833dedfdb6d534438ffcccd042f60434bee0e39f4cb3726e7413e7a","services":["streamer"],"enable_msg_events":true,"port":33311},"up":true}},{"node":{"info":{"id":"4a3c39f044c425c153d4900db30f839d7866c8e0f4f4d38d9205e67fb540988e","name":"node_4a3c39f044c425c153d4900db30f839d7866c8e0f4f4d38d9205e67fb540988e","enode":"enode://4ab4e0bfbba774d3dff10d02b4464d3a06ef1a9c14fd4084ec4c239a398653aa3e6c1a58462ffd6fe0d0d27c3dc284999c3560886891b362e8e99ad385747b84@127.0.0.1:0","enr":"0xf88fb840b36e6eecac0592d08346ad3d82fd3b0879b1b73d47026222ac4afb89289daf5504012dd22594a354b108a7396d8c509bc3b373adcd376aa441dc778d6c2c72ea0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1024ab4e0bfbba774d3dff10d02b4464d3a06ef1a9c14fd4084ec4c239a398653aa","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"Sjw58ETEJcFT1JANsw+DnXhmyOD09NONkgXmf7VAmI4=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 4a3c39\npopulation: 24 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 8 e06f eb01 fa65 fac8 | 60 f3d5 (0) f33c (0) f177 (0) f005 (0)\n001 2 184e 27b5 | 30 0639 (0) 03eb (0) 034d (0) 01a6 (0)\n002 3 75e2 64e6 68a6 | 18 7a68 (0) 7bcb (0) 7bee (0) 73d0 (0)\n003 4 5008 52b4 5a8b 5c62 | 9 55fd (0) 51c2 (0) 5008 (0) 52b4 (0)\n004 3 4746 459b 4589 | 4 459b (0) 4589 (0) 4746 (0) 4775 (0)\n005 2 4d75 4efa | 4 4c21 (0) 4cc2 (0) 4d75 (0) 4efa (0)\n============ DEPTH: 6 ==========================================\n006 0 | 0\n007 1 4bc8 | 1 4bc8 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 1 4a37 | 1 4a37 (0)\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"4a3c39f044c425c153d4900db30f839d7866c8e0f4f4d38d9205e67fb540988e","private_key":"1dfd38b15db0c055f13b2e98bdef34c32d745b817c9f37516af52c78e2ba2a3e","name":"node_4a3c39f044c425c153d4900db30f839d7866c8e0f4f4d38d9205e67fb540988e","services":["streamer"],"enable_msg_events":true,"port":34469},"up":true}},{"node":{"info":{"id":"8330e2b8ae2f184bb8dc5e153fafa4dafe86f84ec692d3ee91413cc07b1cd9e2","name":"node_8330e2b8ae2f184bb8dc5e153fafa4dafe86f84ec692d3ee91413cc07b1cd9e2","enode":"enode://3fc2da9e04199b0c080846d5f56ed8ab73bed014a03c242832e9be303880d706f671d59b5e15d134f4da9410d101204d0567afcde9ab261c83461744ce520751@127.0.0.1:0","enr":"0xf88fb84072d464b640b8c4621eea600036ab5b62f29ca3e9b26135a37947d95f54e9890f6559c3a84ea0b623de61d0d0ad41f9b85abe44906f2bf8e22df934c061fe6cd90183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1033fc2da9e04199b0c080846d5f56ed8ab73bed014a03c242832e9be303880d706","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"gzDiuK4vGEu43F4VP6+k2v6G+E7GktPukUE8wHsc2eI=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 8330e2\npopulation: 36 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 2471 127c 0e34 0807 | 68 0639 (0) 03eb (0) 034d (0) 01a6 (0)\n001 10 d125 dd92 c2f9 cabf | 31 f177 (0) f005 (0) f33c (0) f3d5 (0)\n002 12 a861 acf8 a192 bc71 | 20 a192 (0) aedc (0) acf8 (0) aba7 (0)\n003 2 9472 957e | 2 9472 (0) 957e (0)\n004 3 8fb8 8d3e 8b35 | 3 8b35 (0) 8d3e (0) 8fb8 (0)\n============ DEPTH: 5 ==========================================\n005 0 | 0\n006 1 8012 | 1 8012 (0)\n007 1 8284 | 1 8284 (0)\n008 0 | 0\n009 1 836e | 1 836e (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"8330e2b8ae2f184bb8dc5e153fafa4dafe86f84ec692d3ee91413cc07b1cd9e2","private_key":"655f2ae9378e87cd580544c9cb99036bcfb2795b603d200b06e0df9f41438877","name":"node_8330e2b8ae2f184bb8dc5e153fafa4dafe86f84ec692d3ee91413cc07b1cd9e2","services":["streamer"],"enable_msg_events":true,"port":46233},"up":true}},{"node":{"info":{"id":"b2453c6e755a30efb91194fa607b3352d75b6905c448b09af4aeadf3a445b633","name":"node_b2453c6e755a30efb91194fa607b3352d75b6905c448b09af4aeadf3a445b633","enode":"enode://d3a39529d6f6310edfbbecde895c8a3024336ed33e9904646e9e3e86718ed5248faaa14fd06beb2acbc38689cef3d1d7235845d431d25deb99ca91471a529092@127.0.0.1:0","enr":"0xf88fb840f566ab01e80bef9b69c5c6341ef1ee20605368864011471a8ae8bb9a47a27b434331d6c7e2b361e2766764ed97aacb871ec2912f49c7f45f1e90f321c4c9c02a0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102d3a39529d6f6310edfbbecde895c8a3024336ed33e9904646e9e3e86718ed524","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"skU8bnVaMO+5EZT6YHszUtdbaQXESLCa9K6t86RFtjM=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: b2453c\npopulation: 35 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 10 672a 75e2 72a5 5c62 | 68 58a9 (0) 5a8b (0) 5be6 (0) 5cc1 (0)\n001 8 e06f fa65 fac8 f4a0 | 31 f005 (0) f177 (0) f3d5 (0) f33c (0)\n002 4 8d3e 8012 836e 8330 | 9 9472 (0) 957e (0) 8b35 (0) 8fb8 (0)\n003 4 a192 acf8 a9fa a861 | 6 a192 (0) aedc (0) acf8 (0) aba7 (0)\n004 5 b9d9 b869 bc71 bde9 | 9 b9d9 (0) b869 (0) be0f (0) bd48 (0)\n============ DEPTH: 5 ==========================================\n005 3 b60e b5fc b4e2 | 3 b60e (0) b5fc (0) b4e2 (0)\n006 0 | 0\n007 1 b355 | 1 b355 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"b2453c6e755a30efb91194fa607b3352d75b6905c448b09af4aeadf3a445b633","private_key":"34a8d5008ee38c02fa2deffed8ac1eb5e4238f26925bba625642248ee6f4b502","name":"node_b2453c6e755a30efb91194fa607b3352d75b6905c448b09af4aeadf3a445b633","services":["streamer"],"enable_msg_events":true,"port":44445},"up":true}},{"node":{"info":{"id":"c0adf394af7d5670c1ce8c6bea292fbc03c56ae2b636e2f303311a455bb3500f","name":"node_c0adf394af7d5670c1ce8c6bea292fbc03c56ae2b636e2f303311a455bb3500f","enode":"enode://e8139ca6fd25a63ec0226a7e0d1b3e24dd4a64e28de32b96e967dce072e64ca1eda7974197edb2b54bce2bff0c78543b0d9b29eb6ea9610bad964a9177b0f40a@127.0.0.1:0","enr":"0xf88fb840ea7ff8e5655a5641139c8258f6ea2d2fcaf6b7e83105a5a3489aa0c3611a21c5763a5b6a12671c24fd597686f485cdcc17d168e4ec02458d74c3be1cf0455d480183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102e8139ca6fd25a63ec0226a7e0d1b3e24dd4a64e28de32b96e967dce072e64ca1","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"wK3zlK99VnDBzoxr6ikvvAPFauK2NuLzAzEaRVuzUA8=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: c0adf3\npopulation: 28 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 62f0 672a 7bee 75e2 | 68 7a68 (0) 7bcb (0) 7bee (0) 73d0 (0)\n001 5 9472 8b35 a9fa b4e2 | 29 957e (0) 9472 (0) 8fb8 (0) 8d3e (0)\n002 5 f4a0 fa65 ed12 ed2e | 17 f3d5 (0) f33c (0) f177 (0) f005 (0)\n003 5 d23c d18a d125 dd92 | 6 d18a (0) d125 (0) d23c (0) deec (0)\n004 5 ce01 cc5f cc9f c9ef | 5 c9ef (0) cabf (0) ce01 (0) cc5f (0)\n============ DEPTH: 5 ==========================================\n005 1 c52a | 1 c52a (0)\n006 1 c2f9 | 1 c2f9 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"c0adf394af7d5670c1ce8c6bea292fbc03c56ae2b636e2f303311a455bb3500f","private_key":"269f2338eae4174d5d03bcc681f76dc898907e6bcaa160114424dc97aa7307b8","name":"node_c0adf394af7d5670c1ce8c6bea292fbc03c56ae2b636e2f303311a455bb3500f","services":["streamer"],"enable_msg_events":true,"port":36773},"up":true}},{"node":{"info":{"id":"2d531c50183f0115269b3feaecf45927a3ac44e1be2a263c7e5d2274d8379b1c","name":"node_2d531c50183f0115269b3feaecf45927a3ac44e1be2a263c7e5d2274d8379b1c","enode":"enode://3f4db397fc277b2e70200ee0df565958becb600266ad3362cb2fcf934318cca69ae8ac6ecf3040c7bc23192473e12a8828383ac4106878567e97fc0c3ff63339@127.0.0.1:0","enr":"0xf88fb840e7c428cebdf711272fc568f71b015bf4dcf2c02936b88067d975ddf1d00fd52a28c15718e1c7dd0120d9614b4063392c515e52ffdf2c222ea70d6651df4cc9830183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1033f4db397fc277b2e70200ee0df565958becb600266ad3362cb2fcf934318cca6","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"LVMcUBg/ARUmmz/q7PRZJ6OsROG+KiY8fl0idNg3mxw=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 2d531c\npopulation: 28 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 e06f ee2b c0ad | 60 a192 (0) aedc (0) acf8 (0) aba7 (0)\n001 7 4775 5c62 64e6 672a | 38 7a68 (0) 7bcb (0) 7bee (0) 73d0 (0)\n002 6 0639 03eb 0a21 0e34 | 13 0639 (0) 034d (0) 03eb (0) 01a6 (0)\n003 3 36d5 3b83 3e19 | 6 3590 (0) 3775 (0) 36d5 (0) 3871 (0)\n004 7 2471 27db 27b5 216e | 8 216e (0) 21dc (0) 22bb (0) 221c (0)\n============ DEPTH: 5 ==========================================\n005 1 2803 | 1 2803 (0)\n006 0 | 0\n007 0 | 0\n008 1 2dd4 | 1 2dd4 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"2d531c50183f0115269b3feaecf45927a3ac44e1be2a263c7e5d2274d8379b1c","private_key":"ee9db292a301dd892d1aedca4ef8a90d737b64e572c05b6cca13f334c41ba6dd","name":"node_2d531c50183f0115269b3feaecf45927a3ac44e1be2a263c7e5d2274d8379b1c","services":["streamer"],"enable_msg_events":true,"port":45347},"up":true}},{"node":{"info":{"id":"ee2b0aff61a9846d13de3a72712ef0bf3ca42ad8da57e81759c242797258efec","name":"node_ee2b0aff61a9846d13de3a72712ef0bf3ca42ad8da57e81759c242797258efec","enode":"enode://82b34fd84b01efb9af41bd124c2681e968807afaca2443d11d60658225bdd803500d87c13fa9c5211d1653afd9bf44755a722f01f91e518459780203fad0cd43@127.0.0.1:0","enr":"0xf88fb840f0a7a792a4415787d483eb211eff11116792290e2670e5a0bd87f67c81f5dc54301614339b1960d225318d4f7745e6af895493e42d6c270f429fd4def2e241560183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10382b34fd84b01efb9af41bd124c2681e968807afaca2443d11d60658225bdd803","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"7isK/2GphG0T3jpycS7wvzykKtjaV+gXWcJCeXJY7+w=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: ee2b0a\npopulation: 35 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 9 6975 68a6 62f0 672a | 68 7a68 (0) 7bcb (0) 7bee (0) 73d0 (0)\n001 10 bc29 be0f b9d9 b869 | 29 a192 (0) aedc (0) acf8 (0) aba7 (0)\n002 3 d125 d9d3 cc9f | 14 d23c (0) d18a (0) d125 (0) deec (0)\n003 6 f33c f3d5 f611 f4a0 | 9 f3d5 (0) f33c (0) f177 (0) f005 (0)\n004 1 e06f | 1 e06f (0)\n005 2 ea3d eb01 | 2 ea3d (0) eb01 (0)\n============ DEPTH: 6 ==========================================\n006 3 eceb ed12 ed2e | 3 ed12 (0) ed2e (0) eceb (0)\n007 1 efd6 | 1 efd6 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"ee2b0aff61a9846d13de3a72712ef0bf3ca42ad8da57e81759c242797258efec","private_key":"51ff90bcd8f1d150186f82b07c3bf74723a2111416020b1205876876d1456e91","name":"node_ee2b0aff61a9846d13de3a72712ef0bf3ca42ad8da57e81759c242797258efec","services":["streamer"],"enable_msg_events":true,"port":34721},"up":true}},{"node":{"info":{"id":"8012a7af71d76d882202cf9372523478ccebea23443006c7f29c2a83106cd1b3","name":"node_8012a7af71d76d882202cf9372523478ccebea23443006c7f29c2a83106cd1b3","enode":"enode://638906e18d86b361cea53902fae144fb0a7bbe1c7f674a34e10247c074d176f58a797837069d5a21666ffb9476348fb394b80ecc0b1023d2111a85eb5c1952fb@127.0.0.1:0","enr":"0xf88fb84024f9e170931c28fb70978c7ce403865edd91dde7ffbb04e68f03512bf8ed726d5db895185177805ad4e5c9c73717ea1e97430505269dd32916cc5949aa72e7410183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103638906e18d86b361cea53902fae144fb0a7bbe1c7f674a34e10247c074d176f5","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"gBKnr3HXbYgiAs+TclI0eMzr6iNEMAbH8pwqgxBs0bM=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 8012a7\npopulation: 37 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 2471 0a21 4775 | 68 21dc (0) 216e (0) 221c (0) 22bb (0)\n001 14 dd92 d23c d125 c2f9 | 31 d23c (0) d18a (0) d125 (0) deec (0)\n002 12 acf8 a861 a9fa a192 | 20 a192 (0) aedc (0) acf8 (0) aba7 (0)\n003 2 9472 957e | 2 9472 (0) 957e (0)\n004 3 8b35 8d3e 8fb8 | 3 8b35 (0) 8d3e (0) 8fb8 (0)\n============ DEPTH: 5 ==========================================\n005 0 | 0\n006 3 8284 836e 8330 | 3 8284 (0) 836e (0) 8330 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"8012a7af71d76d882202cf9372523478ccebea23443006c7f29c2a83106cd1b3","private_key":"9a9f5d8e07fc393a86b48129afcd4aa66dda3b5ff3498c7239e89572c4f218a1","name":"node_8012a7af71d76d882202cf9372523478ccebea23443006c7f29c2a83106cd1b3","services":["streamer"],"enable_msg_events":true,"port":33055},"up":true}},{"node":{"info":{"id":"47753fdca855ea79abf667b50aa9c90a132d44bdd1572c3e3c411c8ee7e5b5f4","name":"node_47753fdca855ea79abf667b50aa9c90a132d44bdd1572c3e3c411c8ee7e5b5f4","enode":"enode://ea98a4cc6d36e0a9e09061c40743fd14032109b1a0d8d20d2e20b419275c526f99c5c19b6123a6e78d21c5497e16fb49ca279795954f2ceac05ea01c772c83a4@127.0.0.1:0","enr":"0xf88fb8403249a6dba1fd864f716568258f1c1c1044871b1ab897dfccb42a89c5ad14ee743a196a92533717f40d4e17de9d9a9cd2cd14cc87855f4c270ac5407a6c8e0e530183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102ea98a4cc6d36e0a9e09061c40743fd14032109b1a0d8d20d2e20b419275c526f","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"R3U/3KhV6nmr9me1CqnJChMtRL3RVyw+PEEcjufltfQ=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 47753f\npopulation: 30 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 fac8 f4a0 ea3d efd6 | 60 d23c (0) d18a (0) d125 (0) deec (0)\n001 9 27b5 2471 2354 2d53 | 30 3b83 (0) 3871 (0) 3e19 (0) 3590 (0)\n002 4 672a 62f0 72a5 75e2 | 18 7a68 (0) 7bcb (0) 7bee (0) 73d0 (0)\n003 3 5c62 5a8b 5008 | 9 58a9 (0) 5be6 (0) 5a8b (0) 5cc1 (0)\n004 5 4a37 4bc8 4d75 4c21 | 7 4cc2 (0) 4c21 (0) 4d75 (0) 4efa (0)\n============ DEPTH: 5 ==========================================\n005 0 | 0\n006 2 459b 4589 | 2 459b (0) 4589 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 1 4746 | 1 4746 (0)\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"47753fdca855ea79abf667b50aa9c90a132d44bdd1572c3e3c411c8ee7e5b5f4","private_key":"3f946790db720a1aff2dcaef0a931c26359587ade7dbbd5611d6e4e4c48b45a7","name":"node_47753fdca855ea79abf667b50aa9c90a132d44bdd1572c3e3c411c8ee7e5b5f4","services":["streamer"],"enable_msg_events":true,"port":39017},"up":true}},{"node":{"info":{"id":"efd68d2c99346ca085c9ef896bee6125ad8638413295108f3a92b247a41ca629","name":"node_efd68d2c99346ca085c9ef896bee6125ad8638413295108f3a92b247a41ca629","enode":"enode://36e15237c01d8907bd512448e053510123d7742258fc18294dd99bc2dd171d87f1f14fd30584dff7196d37ab49ee7eb689238aeb159e0162efb3c35ba47d4723@127.0.0.1:0","enr":"0xf88fb84010215926d38f4b9af18d9d9e2831fd468800ada49bcdf6dcf9254373c72e00187ee5495c9979f3684cd5ee9750204e55dd9154ae90f78e9775578a2a221c8fd20183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10336e15237c01d8907bd512448e053510123d7742258fc18294dd99bc2dd171d87","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"79aNLJk0bKCFye+Ja+5hJa2GOEEylRCPOpKyR6Qcpik=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: efd68d\npopulation: 22 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 127c 4775 | 68 3871 (0) 3b83 (0) 3e19 (0) 3590 (0)\n001 2 8012 8330 | 29 9472 (0) 957e (0) 8b35 (0) 8fb8 (0)\n002 5 c9ef cabf d23c d9d3 | 14 d18a (0) d125 (0) d23c (0) deec (0)\n003 6 f3d5 f4a0 f611 fac8 | 9 f177 (0) f005 (0) f33c (0) f3d5 (0)\n004 1 e06f | 1 e06f (0)\n005 2 ea3d eb01 | 2 ea3d (0) eb01 (0)\n============ DEPTH: 6 ==========================================\n006 3 eceb ed12 ed2e | 3 eceb (0) ed12 (0) ed2e (0)\n007 1 ee2b | 1 ee2b (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"efd68d2c99346ca085c9ef896bee6125ad8638413295108f3a92b247a41ca629","private_key":"245b148ec129e7a6491d45cc5c65217870ae2de275e5b688021b636011178055","name":"node_efd68d2c99346ca085c9ef896bee6125ad8638413295108f3a92b247a41ca629","services":["streamer"],"enable_msg_events":true,"port":34239},"up":true}},{"node":{"info":{"id":"127c89eae94b195df2eb5eb7b44f634adb73c114d2089cd904b56988c8674e11","name":"node_127c89eae94b195df2eb5eb7b44f634adb73c114d2089cd904b56988c8674e11","enode":"enode://7db629e8af234327ae65a632ab973188f8d44b4dc9336cc42246df45a87caa6a64c3a3b41a68f623e284a4bf0462a85ab81b0a51c28dedf1cb3357451a56d5c6@127.0.0.1:0","enr":"0xf88fb840acbb379c02f6b49e0fcc45220b6ed91e7e13bfc2beaf4a0ef7644b445216a379260871c4d3b022edab98a8cd70bbc4ca98623ea4c3b365840e157dd64c2147470183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1027db629e8af234327ae65a632ab973188f8d44b4dc9336cc42246df45a87caa6a","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"EnyJ6ulLGV3y6163tE9jSttzwRTSCJzZBLVpiMhnThE=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 127c89\npopulation: 28 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 7 b355 8d3e 836e 8330 | 60 9472 (0) 957e (0) 8b35 (0) 8fb8 (0)\n001 5 4d75 4746 5008 7bcb | 38 5cc1 (0) 5c62 (0) 58a9 (0) 5be6 (0)\n002 6 36d5 3e19 2d53 2471 | 17 3e19 (0) 3871 (0) 3b83 (0) 3590 (0)\n003 6 01a6 03eb 0a21 0807 | 8 0639 (0) 01a6 (0) 034d (0) 03eb (0)\n004 2 1929 184e | 2 1929 (0) 184e (0)\n============ DEPTH: 5 ==========================================\n005 1 1740 | 1 1740 (0)\n006 0 | 0\n007 1 1385 | 1 1385 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"127c89eae94b195df2eb5eb7b44f634adb73c114d2089cd904b56988c8674e11","private_key":"54a20d22b4654e13d2547690e34e3de3cae15187e8034f587fe718896fa946f7","name":"node_127c89eae94b195df2eb5eb7b44f634adb73c114d2089cd904b56988c8674e11","services":["streamer"],"enable_msg_events":true,"port":45857},"up":true}},{"node":{"info":{"id":"69753865aacaaf72d9bf6d265c885d3f705804ff4b2675f7aa860641dacab2a0","name":"node_69753865aacaaf72d9bf6d265c885d3f705804ff4b2675f7aa860641dacab2a0","enode":"enode://08a249844dec3d48a57ec53c79310b2f24cc27fedf91464cc30bd2213ec844437a00e3cc7d5e2f97b99516b21901ffe2e2a451340f594023bfac4463750c1ccf@127.0.0.1:0","enr":"0xf88fb84026ec31c1451ae3cc1ab533f52d87c62368080c439aff174f1f0a67fe50b956cc31c5260e382dcee5546e815dfa2dc26802922227f77d4bb25e5b47975222653a0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10308a249844dec3d48a57ec53c79310b2f24cc27fedf91464cc30bd2213ec84443","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"aXU4ZarKr3LZv20mXIhdP3BYBP9LJnX3qoYGQdrKsqA=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 697538\npopulation: 26 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 ee2b cc9f 836e bd96 | 60 f177 (0) f005 (0) f3d5 (0) f33c (0)\n001 6 2d53 03eb 0e34 0807 | 30 3871 (0) 3b83 (0) 3e19 (0) 3590 (0)\n002 5 5a8b 52b4 5008 4bc8 | 20 5cc1 (0) 5c62 (0) 58a9 (0) 5be6 (0)\n003 3 72a5 77ee 75e2 | 9 7a68 (0) 7bcb (0) 7bee (0) 73d0 (0)\n004 6 6379 62f0 672a 641a | 6 672a (0) 641a (0) 6450 (0) 64e6 (0)\n============ DEPTH: 5 ==========================================\n005 1 6daa | 1 6daa (0)\n006 0 | 0\n007 1 68a6 | 1 68a6 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"69753865aacaaf72d9bf6d265c885d3f705804ff4b2675f7aa860641dacab2a0","private_key":"ce7b2f3ec596e7541804d73b0233cf93b061d33437fded3aae42df7d2fed2431","name":"node_69753865aacaaf72d9bf6d265c885d3f705804ff4b2675f7aa860641dacab2a0","services":["streamer"],"enable_msg_events":true,"port":42103},"up":true}},{"node":{"info":{"id":"bd9607d5f57f7b6f74f4ad981be368988ef48b5f31e3fd96cab3bb790d568150","name":"node_bd9607d5f57f7b6f74f4ad981be368988ef48b5f31e3fd96cab3bb790d568150","enode":"enode://6ff77126c9946af5efe7c6850f8e59fa25bf6b808b00fade65d30e736f8eae7cc9fa35eb0f4382f95e5408b1cb030919d4f43e911ad1019ea5908d31ace54fb0@127.0.0.1:0","enr":"0xf88fb84047976194f9b1bbc1d405c1f0db707474b3b32a9a96750e1efcc39c5af51fa41213297557f076cbdd35bde4e8f909eeafe16d9694c5ce304ebcec675c7b7e11ba0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1026ff77126c9946af5efe7c6850f8e59fa25bf6b808b00fade65d30e736f8eae7c","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"vZYH1fV/e2909K2YG+NomI70i18x4/2WyrO7eQ1WgVA=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: bd9607\npopulation: 28 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 4589 6975 | 68 3871 (0) 3b83 (0) 3e19 (0) 3590 (0)\n001 5 cabf f611 f33c f005 | 31 f177 (0) f005 (0) f3d5 (0) f33c (0)\n002 4 8d3e 8012 836e 8330 | 9 9472 (0) 957e (0) 8b35 (0) 8fb8 (0)\n003 4 a192 a9fa a861 acf8 | 6 a192 (0) aedc (0) acf8 (0) aba7 (0)\n004 5 b4e2 b5fc b60e b355 | 5 b60e (0) b5fc (0) b4e2 (0) b355 (0)\n005 2 b9d9 b869 | 2 b869 (0) b9d9 (0)\n006 1 be0f | 1 be0f (0)\n007 2 bc29 bc71 | 2 bc29 (0) bc71 (0)\n008 1 bd48 | 1 bd48 (0)\n============ DEPTH: 9 ==========================================\n009 2 bddb bde9 | 2 bddb (0) bde9 (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"bd9607d5f57f7b6f74f4ad981be368988ef48b5f31e3fd96cab3bb790d568150","private_key":"cbe3758f2717e1a3a9e53818d435eee8edc340e4e3d507cee9efdab8eddab838","name":"node_bd9607d5f57f7b6f74f4ad981be368988ef48b5f31e3fd96cab3bb790d568150","services":["streamer"],"enable_msg_events":true,"port":40601},"up":true}},{"node":{"info":{"id":"45895aff674079f6be02e4cc74914d63125c3fe48bb69056c070c71319fea1fa","name":"node_45895aff674079f6be02e4cc74914d63125c3fe48bb69056c070c71319fea1fa","enode":"enode://99d33a9f9eebfa22c429478e4a0a01fa06d35e27b162331e8e4464a87d2adf5ec35e26697560f760cc58c5afd36ced8e1be393168089020b5881a44264fe609d@127.0.0.1:0","enr":"0xf88fb840b358458a817fa640619f1d3a7f3aaa81f7de7b7830255d88d70eb1aaf9b3c921433aea9123e9756df8724646634423960203427b8ff8e7f8929a6a501a51c6740183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10399d33a9f9eebfa22c429478e4a0a01fa06d35e27b162331e8e4464a87d2adf5e","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"RYla/2dAefa+AuTMdJFNYxJcP+SLtpBWwHDHExn+ofo=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 45895a\npopulation: 36 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 12 ed2e eceb ea3d e06f | 60 f3d5 (0) f33c (0) f177 (0) f005 (0)\n001 9 2dd4 2803 36d5 3e19 | 30 3871 (0) 3b83 (0) 3e19 (0) 3590 (0)\n002 4 75e2 72a5 672a 6975 | 18 7a68 (0) 7bcb (0) 7bee (0) 73d0 (0)\n003 4 55fd 5008 5c62 5a8b | 9 5cc1 (0) 5c62 (0) 58a9 (0) 5be6 (0)\n004 4 4d75 4efa 4bc8 4a3c | 7 4cc2 (0) 4c21 (0) 4d75 (0) 4efa (0)\n============ DEPTH: 5 ==========================================\n005 0 | 0\n006 2 4775 4746 | 2 4746 (0) 4775 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 1 459b | 1 459b (0)\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"45895aff674079f6be02e4cc74914d63125c3fe48bb69056c070c71319fea1fa","private_key":"4be326b4bad9ec6d897672d72f86d7c21742af31459c61ff9d29a7c4f2b87288","name":"node_45895aff674079f6be02e4cc74914d63125c3fe48bb69056c070c71319fea1fa","services":["streamer"],"enable_msg_events":true,"port":35991},"up":true}},{"node":{"info":{"id":"0a215c7765be2caebf76ad3e8017bbc2aaadf8e0dd4859af781953a0564c5d59","name":"node_0a215c7765be2caebf76ad3e8017bbc2aaadf8e0dd4859af781953a0564c5d59","enode":"enode://55140e8f1873f8006a1e1a309e31669c0442eb381ea30f7e4261c7979760b5b10030ca2c72d35492c2c3d456c560f898249944dfbd3d408c456b3ded66c13e5d@127.0.0.1:0","enr":"0xf88fb840a3583d99fad5b4703c5847493453e0b451c4d555d6ee5a8833671be976378a823cf88dd213ebdd319ff433e569d46dd3d19c6e06e909f79ce6d847f6145a430b0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10355140e8f1873f8006a1e1a309e31669c0442eb381ea30f7e4261c7979760b5b1","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"CiFcd2W+LK6/dq0+gBe7wqqt+ODdSFmveBlToFZMXVk=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 0a215c\npopulation: 32 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 d23c fa9a e06f 8d3e | 60 9472 (0) 957e (0) 8b35 (0) 8fb8 (0)\n001 7 672a 64e6 75e2 72a7 | 38 7a68 (0) 7bcb (0) 7bee (0) 73d0 (0)\n002 7 3e19 3871 36d5 2d53 | 17 3871 (0) 3b83 (0) 3e19 (0) 3590 (0)\n003 5 1385 127c 1740 1929 | 5 1929 (0) 184e (0) 1740 (0) 1385 (0)\n004 4 0639 01a6 034d 03eb | 4 0639 (0) 01a6 (0) 034d (0) 03eb (0)\n============ DEPTH: 5 ==========================================\n005 2 0f31 0e34 | 2 0f31 (0) 0e34 (0)\n006 1 0807 | 1 0807 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"0a215c7765be2caebf76ad3e8017bbc2aaadf8e0dd4859af781953a0564c5d59","private_key":"48398a9192cbe71d3dae01f8cd736bd6fa81f40d86363732910ab557934ac32a","name":"node_0a215c7765be2caebf76ad3e8017bbc2aaadf8e0dd4859af781953a0564c5d59","services":["streamer"],"enable_msg_events":true,"port":32803},"up":true}},{"node":{"info":{"id":"0e344c6e27c23bd36bdd3ddcefa4e577fdc9461e52c7ce20135733a08b987b82","name":"node_0e344c6e27c23bd36bdd3ddcefa4e577fdc9461e52c7ce20135733a08b987b82","enode":"enode://a657bea94ef83334a2eb69fa819e389faa047abb53fdce1ada5de9f2ad8577331fc88094fd258ff4dfb4ecc38e37cc65b0807dc8c13d0f933d0975b4930a152a@127.0.0.1:0","enr":"0xf88fb840e7a038b940736e411d390aa7ac6e0d5380fb096ac5b06fb69e561038d33eece64602defd9da5012d991e93b78ce269e66ae7083c78fa635400a7941b55511bd50183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102a657bea94ef83334a2eb69fa819e389faa047abb53fdce1ada5de9f2ad857733","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"DjRMbifCO9Nr3T3c76Tld/3JRh5Sx84gE1czoIuYe4I=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 0e344c\npopulation: 25 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 d23c e06f b355 8330 | 60 f3d5 (0) f33c (0) f177 (0) f005 (0)\n001 4 7bcb 6975 4746 4775 | 38 7a68 (0) 7bcb (0) 7bee (0) 73d0 (0)\n002 6 36d5 3e19 2d53 2471 | 17 3590 (0) 3775 (0) 36d5 (0) 3b83 (0)\n003 4 1929 184e 1740 127c | 5 1929 (0) 184e (0) 1740 (0) 1385 (0)\n004 3 034d 03eb 01a6 | 4 0639 (0) 01a6 (0) 034d (0) 03eb (0)\n============ DEPTH: 5 ==========================================\n005 2 0807 0a21 | 2 0807 (0) 0a21 (0)\n006 0 | 0\n007 1 0f31 | 1 0f31 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"0e344c6e27c23bd36bdd3ddcefa4e577fdc9461e52c7ce20135733a08b987b82","private_key":"bd217ea07881a97e7c8d265ab1ea058cd33f23e29d61169327cafa40e7eb7e35","name":"node_0e344c6e27c23bd36bdd3ddcefa4e577fdc9461e52c7ce20135733a08b987b82","services":["streamer"],"enable_msg_events":true,"port":32907},"up":true}},{"node":{"info":{"id":"836e65dfe6f01e1d2934655c1846cb86fed6e41ea951a109d7a20bb14cb4c10a","name":"node_836e65dfe6f01e1d2934655c1846cb86fed6e41ea951a109d7a20bb14cb4c10a","enode":"enode://7955513f0867be5484a68700771fab5ed2bcaff4c5fe81e88b07b95e273742fe920d733d44b7b187d1d5ddca6eccb92921a69f1a5f1874d9eee4d61f4e849f3d@127.0.0.1:0","enr":"0xf88fb840e3fdd157b8d17ad9462935700437f5e3379cc6b910e447979420623db2209a132159463905a57dace86b0516654cfb2e39b3e9c5a376652fd559309c05dcf4410183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1037955513f0867be5484a68700771fab5ed2bcaff4c5fe81e88b07b95e273742fe","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"g25l3+bwHh0pNGVcGEbLhv7W5B6pUaEJ16ILsUy0wQo=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 836e65\npopulation: 31 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 9 4589 6975 68a6 62f0 | 68 7bcb (0) 7bee (0) 7a68 (0) 73d0 (0)\n001 8 fac8 fa9a fa65 f4a0 | 31 f177 (0) f005 (0) f3d5 (0) f33c (0)\n002 6 b9d9 bc71 bd96 b245 | 20 be0f (0) bc29 (0) bc71 (0) bd48 (0)\n003 2 9472 957e | 2 9472 (0) 957e (0)\n004 3 8b35 8fb8 8d3e | 3 8b35 (0) 8fb8 (0) 8d3e (0)\n============ DEPTH: 5 ==========================================\n005 0 | 0\n006 1 8012 | 1 8012 (0)\n007 1 8284 | 1 8284 (0)\n008 0 | 0\n009 1 8330 | 1 8330 (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"836e65dfe6f01e1d2934655c1846cb86fed6e41ea951a109d7a20bb14cb4c10a","private_key":"828792ee935c8a9739d8fffdccb73fdb38a998850e0a4e5f3a67fad91701cc2c","name":"node_836e65dfe6f01e1d2934655c1846cb86fed6e41ea951a109d7a20bb14cb4c10a","services":["streamer"],"enable_msg_events":true,"port":46599},"up":true}},{"node":{"info":{"id":"cc9f65d734f1a3bbc6019e166fe355bd7fc33bb4887043a5ccf532a9ba356379","name":"node_cc9f65d734f1a3bbc6019e166fe355bd7fc33bb4887043a5ccf532a9ba356379","enode":"enode://fcd2ab0c2237f9a09130eef63262c5dbe407ec25a8ff88d55dae0c65c7352a829f879f303aebfdc8d979b2843b7b61933608d4f89ebe778995455c135371ba78@127.0.0.1:0","enr":"0xf88fb840ebf4dbd2665552b22575e2991f43e3d416eff9488c23d9f3580a78a225117d891a35ec6b32c752922b70470cc162564533cd54db06d6b9cf023e19932ef864e10183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102fcd2ab0c2237f9a09130eef63262c5dbe407ec25a8ff88d55dae0c65c7352a82","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"zJ9l1zTxo7vGAZ4Wb+NVvX/DO7SIcEOlzPUyqbo1Y3k=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: cc9f65\npopulation: 25 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 6975 62f0 0f31 01a6 | 68 7a68 (0) 7bcb (0) 7bee (0) 772a (0)\n001 2 acf8 836e | 29 b4e2 (0) b5fc (0) b60e (0) b355 (0)\n002 6 f33c fa65 eceb ed2e | 17 f177 (0) f005 (0) f3d5 (0) f33c (0)\n003 5 d125 d23c deec dd92 | 6 d23c (0) d18a (0) d125 (0) deec (0)\n004 3 c0ad c2f9 c52a | 3 c52a (0) c2f9 (0) c0ad (0)\n005 2 cabf c9ef | 2 c9ef (0) cabf (0)\n============ DEPTH: 6 ==========================================\n006 1 ce01 | 1 ce01 (0)\n007 0 | 0\n008 1 cc5f | 1 cc5f (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"cc9f65d734f1a3bbc6019e166fe355bd7fc33bb4887043a5ccf532a9ba356379","private_key":"4a1901aae6d17a696581fa1df5fb404606b4894884e5ce2ae52f014c1f7ab1ec","name":"node_cc9f65d734f1a3bbc6019e166fe355bd7fc33bb4887043a5ccf532a9ba356379","services":["streamer"],"enable_msg_events":true,"port":45379},"up":true}},{"node":{"info":{"id":"eb01ff80307afbfc7457c96594cd4ba4d00acb7fd25a7571d1223168bd66ff09","name":"node_eb01ff80307afbfc7457c96594cd4ba4d00acb7fd25a7571d1223168bd66ff09","enode":"enode://6570b12362a67ae69eb59bbb7ef187f002e9d8c189bc44e7a66d49e48442754fb3c332e796a34094a0c32ca763a56bf77272b15090ea404f1fde0f8f02f69d9a@127.0.0.1:0","enr":"0xf88fb840a0eb32cba24198285bd35892feb415dc76bca095952a0b36d8b453aadb7c61fc63195b1956ee0ca78f7e50df142ed78fea1741090dc0988605592bd8b167af1a0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1026570b12362a67ae69eb59bbb7ef187f002e9d8c189bc44e7a66d49e48442754f","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"6wH/gDB6+/x0V8lllM1LpNAKy3/SWnVx0SIxaL1m/wk=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: eb01ff\npopulation: 28 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 7 4a3c 7bee 72a7 72a5 | 68 7a68 (0) 7bcb (0) 7bee (0) 772a (0)\n001 3 8012 a861 bd96 | 29 9472 (0) 957e (0) 8b35 (0) 8fb8 (0)\n002 4 c52a c0ad c9ef cc9f | 14 d18a (0) d125 (0) d23c (0) deec (0)\n003 7 f4a0 f611 f3d5 f33c | 9 f177 (0) f005 (0) f3d5 (0) f33c (0)\n004 1 e06f | 1 e06f (0)\n============ DEPTH: 5 ==========================================\n005 5 ed12 ed2e eceb efd6 | 5 efd6 (0) ee2b (0) ed12 (0) ed2e (0)\n006 0 | 0\n007 1 ea3d | 1 ea3d (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"eb01ff80307afbfc7457c96594cd4ba4d00acb7fd25a7571d1223168bd66ff09","private_key":"e5be2c35a1499c508166c81de8a45fd1cda4bea223164bf47ba8c974725fdf75","name":"node_eb01ff80307afbfc7457c96594cd4ba4d00acb7fd25a7571d1223168bd66ff09","services":["streamer"],"enable_msg_events":true,"port":33263},"up":true}},{"node":{"info":{"id":"08077c0ce8d4130c14464493e9164a8bae61b4646b1ec48899e75f2f6f9b8c66","name":"node_08077c0ce8d4130c14464493e9164a8bae61b4646b1ec48899e75f2f6f9b8c66","enode":"enode://7d4f4b1f1c3dc1f6418391214afa500757d43f64aea2f11d7694de79d243af3e1c1c1662233b71306cc1c060ddf7e21dbdbbac53d0bcfe2fd3b6f29c7656e69f@127.0.0.1:0","enr":"0xf88fb840da1dfdefbe43711df3887e5825a698e2931b2e4fda60051803d6402f11fe21a14ee3b5bac8cf9543cad98736a88ae0734609ac9b8ba3d04815d21c44e5c2551e0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1037d4f4b1f1c3dc1f6418391214afa500757d43f64aea2f11d7694de79d243af3e","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"CAd8DOjUEwwURkST6RZKi65htGRrHsSImedfL2+bjGY=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 08077c\npopulation: 30 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 eb01 8d3e 8330 a861 | 60 c52a (0) c2f9 (0) c0ad (0) cabf (0)\n001 10 4589 4775 4746 7bcb | 38 7bee (0) 7bcb (0) 7a68 (0) 73d0 (0)\n002 5 3e19 3871 3b83 27b5 | 17 3590 (0) 3775 (0) 36d5 (0) 3e19 (0)\n003 4 1740 1385 127c 184e | 5 1929 (0) 184e (0) 1385 (0) 127c (0)\n004 4 0639 01a6 034d 03eb | 4 0639 (0) 01a6 (0) 034d (0) 03eb (0)\n============ DEPTH: 5 ==========================================\n005 2 0f31 0e34 | 2 0e34 (0) 0f31 (0)\n006 1 0a21 | 1 0a21 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"08077c0ce8d4130c14464493e9164a8bae61b4646b1ec48899e75f2f6f9b8c66","private_key":"97f4ac0685f5a566c69307b57852116db766c3319995e5a30c98d0b770d9ebf8","name":"node_08077c0ce8d4130c14464493e9164a8bae61b4646b1ec48899e75f2f6f9b8c66","services":["streamer"],"enable_msg_events":true,"port":34207},"up":true}},{"node":{"info":{"id":"a86117147b78f20a6d883d37715da85178cad89eff650a74aa89e7bc11bc45a7","name":"node_a86117147b78f20a6d883d37715da85178cad89eff650a74aa89e7bc11bc45a7","enode":"enode://288eb859b2b3db8e349860a6324c65887218b6162fb33a09fc8b18ae24bfc20a7f490f036a7c5b889d68f8eb9efe590b77d3983019b8f8ef4d3cfa76dafc655e@127.0.0.1:0","enr":"0xf88fb8404a25f16978fe1fb9671930db81e544e0cff37050b6c6325193d7feccf29e22c45e8bef40ecda5b29e9cea5d10e7e70ee0a8a02744a915a78858248804e87186e0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102288eb859b2b3db8e349860a6324c65887218b6162fb33a09fc8b18ae24bfc20a","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"qGEXFHt48gptiD03cV2oUXjK2J7/ZQp0qonnvBG8Rac=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: a86117\npopulation: 31 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 73d0 68a6 5008 2471 | 68 7bee (0) 7bcb (0) 7a68 (0) 73d0 (0)\n001 8 dd92 c2f9 f3d5 f611 | 31 f611 (0) f4a0 (0) f177 (0) f005 (0)\n002 4 8d3e 8012 8330 836e | 9 9472 (0) 957e (0) 8b35 (0) 8fb8 (0)\n003 9 b9d9 b869 bd48 bde9 | 14 b355 (0) b245 (0) b5fc (0) b4e2 (0)\n004 1 a192 | 1 a192 (0)\n005 2 aedc acf8 | 2 aedc (0) acf8 (0)\n============ DEPTH: 6 ==========================================\n006 1 aba7 | 1 aba7 (0)\n007 1 a9fa | 1 a9fa (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"a86117147b78f20a6d883d37715da85178cad89eff650a74aa89e7bc11bc45a7","private_key":"e91c4e7ef86a9d2c9e2d4949d79f0188a6fe4c317a21ff93d7517b08b03a84ad","name":"node_a86117147b78f20a6d883d37715da85178cad89eff650a74aa89e7bc11bc45a7","services":["streamer"],"enable_msg_events":true,"port":42373},"up":true}},{"node":{"info":{"id":"5008ef55ad8088f70643b0f93bcb479531bcb0afe8e01b215dbf8597ec866369","name":"node_5008ef55ad8088f70643b0f93bcb479531bcb0afe8e01b215dbf8597ec866369","enode":"enode://4352662356e5f6fed37ae1e0853e8f9d1d52e8c8291718bd69f73ff06f3a3904f070a2ee34d6b3c4ce86429317a48c1aae1ee3a95565f2164240c1289d49d409@127.0.0.1:0","enr":"0xf88fb84075269349b759660c79167f80db6ab17f351f923baab541b3fc9a2b78dd6577a7610b64e2d804fe4670d11df5a743a6d4e2c73b726a72c4539f380470c2795c300183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1034352662356e5f6fed37ae1e0853e8f9d1d52e8c8291718bd69f73ff06f3a3904","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"UAjvVa2AiPcGQ7D5O8tHlTG8sK/o4BshXb+Fl+yGY2k=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 5008ef\npopulation: 24 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 ea3d f4a0 d9d3 b245 | 60 f611 (0) f4a0 (0) f177 (0) f005 (0)\n001 5 1740 127c 03eb 01a6 | 30 3590 (0) 3775 (0) 36d5 (0) 3e19 (0)\n002 3 75e2 62f0 6975 | 18 7a68 (0) 7bcb (0) 7bee (0) 73d0 (0)\n003 4 4a3c 459b 4589 4775 | 11 4efa (0) 4c21 (0) 4cc2 (0) 4d75 (0)\n004 4 5c62 5cc1 58a9 5a8b | 5 5cc1 (0) 5c62 (0) 58a9 (0) 5be6 (0)\n005 1 55fd | 1 55fd (0)\n============ DEPTH: 6 ==========================================\n006 1 52b4 | 1 52b4 (0)\n007 1 51c2 | 1 51c2 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"5008ef55ad8088f70643b0f93bcb479531bcb0afe8e01b215dbf8597ec866369","private_key":"40ffe414c67c7872869542bbaf010af4e063dbc9e734ec01ebc6ffe7f09a289b","name":"node_5008ef55ad8088f70643b0f93bcb479531bcb0afe8e01b215dbf8597ec866369","services":["streamer"],"enable_msg_events":true,"port":42611},"up":true}},{"node":{"info":{"id":"d9d30b9b212bd4811a44ebe304ba3935ead3abe3247f99893faf65664131c29d","name":"node_d9d30b9b212bd4811a44ebe304ba3935ead3abe3247f99893faf65664131c29d","enode":"enode://10520254bae35bd2c92f66f483de02b78d1753df0d2969aa22382c5dfb51a967e47e6189437e2326a96b6f902faa6ae5cf59af59f3b0cd4021dc6ecb0dbe0ed7@127.0.0.1:0","enr":"0xf88fb8406d769c006c5ed31a452a2a90135f9d37fea25bd1eff0888fcf8d995e9994b13437c02d2f21b826af8f36fff78e9f23b13e1af4851c0df81af662729cd81cccb40183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10310520254bae35bd2c92f66f483de02b78d1753df0d2969aa22382c5dfb51a967","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"2dMLmyEr1IEaROvjBLo5NerTq+Mkf5mJP69lZkExwp0=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: d9d30b\npopulation: 23 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 0f31 01a6 03eb 5008 | 68 3775 (0) 36d5 (0) 3590 (0) 3e19 (0)\n001 2 acf8 b9d9 | 29 957e (0) 9472 (0) 8b35 (0) 8fb8 (0)\n002 6 ea3d eceb efd6 ee2b | 17 f611 (0) f4a0 (0) f177 (0) f005 (0)\n003 6 c9ef cc5f cc9f c52a | 8 c52a (0) c0ad (0) c2f9 (0) cabf (0)\n004 3 d125 d18a d23c | 3 d125 (0) d18a (0) d23c (0)\n============ DEPTH: 5 ==========================================\n005 2 dd92 deec | 2 dd92 (0) deec (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"d9d30b9b212bd4811a44ebe304ba3935ead3abe3247f99893faf65664131c29d","private_key":"70b8e572ba811ae79bbcaffd1421381dc00b020737f2e6f4c1311ebe984fa426","name":"node_d9d30b9b212bd4811a44ebe304ba3935ead3abe3247f99893faf65664131c29d","services":["streamer"],"enable_msg_events":true,"port":36959},"up":true}},{"node":{"info":{"id":"03eb2e92ed0923f696269e7a03fec731d8c3f8df278023a9cb00867b533a3ca3","name":"node_03eb2e92ed0923f696269e7a03fec731d8c3f8df278023a9cb00867b533a3ca3","enode":"enode://118cbd671c6e8b583a18aa14af1eeddb499047376ff5e84c160f3eec13f5b5d33f390b65cf2428621ced70ec419935c37ef4236a8f63f7b5cf81f58a0dfb59f3@127.0.0.1:0","enr":"0xf88fb840c91599a2365e987a7355bef1ad535065e3c907887c577bfbf22416ec8c60a63e28c13dfc44d51262f3a3514757c2ff8c315eb57f44ce1c58397816c8e8bd2fea0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103118cbd671c6e8b583a18aa14af1eeddb499047376ff5e84c160f3eec13f5b5d3","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"A+suku0JI/aWJp56A/7HMdjD+N8ngCOpywCGe1M6PKM=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 03eb2e\npopulation: 29 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 fa9a c9ef c2f9 d9d3 | 60 957e (0) 9472 (0) 8b35 (0) 8fb8 (0)\n001 11 62f0 6975 68a6 72a7 | 38 7a68 (0) 7bcb (0) 7bee (0) 73d0 (0)\n002 4 2dd4 2d53 22bb 2354 | 17 3590 (0) 3775 (0) 36d5 (0) 3e19 (0)\n003 3 184e 1740 127c | 5 1929 (0) 184e (0) 1385 (0) 127c (0)\n004 4 0e34 0f31 0807 0a21 | 4 0a21 (0) 0807 (0) 0e34 (0) 0f31 (0)\n005 1 0639 | 1 0639 (0)\n============ DEPTH: 6 ==========================================\n006 1 01a6 | 1 01a6 (0)\n007 0 | 0\n008 1 034d | 1 034d (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"03eb2e92ed0923f696269e7a03fec731d8c3f8df278023a9cb00867b533a3ca3","private_key":"bb068a5ae255ce7c42cb5928785a16dd2b717db214b975dc7af82a56d1465fa4","name":"node_03eb2e92ed0923f696269e7a03fec731d8c3f8df278023a9cb00867b533a3ca3","services":["streamer"],"enable_msg_events":true,"port":41317},"up":true}},{"node":{"info":{"id":"5a8ba4047c4456e825bd1b34c961f5c7f37bf7c27bc48bee71b8430c7d135486","name":"node_5a8ba4047c4456e825bd1b34c961f5c7f37bf7c27bc48bee71b8430c7d135486","enode":"enode://1e7d80f4aab757649946e09a942ec9dc561f7fab556def6e20e6449f154eddd1d6acc7d2e24db2f0951152d4ccd3eaa9ad32b54b1dedc60eb4c15078f2281cc6@127.0.0.1:0","enr":"0xf88fb8404b1fe1c4ca1bb536ead1b7c7fa4e49b2514aaa26ad2076329d9316b78adc03db18a0e3c270a9cfd2e61e06f850436d2bd103ae39b7c61106619bef3f3fdfb8a90183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1021e7d80f4aab757649946e09a942ec9dc561f7fab556def6e20e6449f154eddd1","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"WoukBHxEVuglvRs0yWH1x/N798J7xIvucbhDDH0TVIY=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 5a8ba4\npopulation: 23 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 c9ef c2f9 | 60 d23c (0) d18a (0) d125 (0) deec (0)\n001 3 1740 03eb 2354 | 30 1929 (0) 184e (0) 1385 (0) 127c (0)\n002 7 62f0 6975 68a6 73d0 | 18 7a68 (0) 7bcb (0) 7bee (0) 73d0 (0)\n003 4 4bc8 4a3c 4775 4589 | 11 4efa (0) 4c21 (0) 4cc2 (0) 4d75 (0)\n004 3 55fd 52b4 5008 | 4 55fd (0) 52b4 (0) 51c2 (0) 5008 (0)\n005 2 5cc1 5c62 | 2 5cc1 (0) 5c62 (0)\n============ DEPTH: 6 ==========================================\n006 1 58a9 | 1 58a9 (0)\n007 1 5be6 | 1 5be6 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"5a8ba4047c4456e825bd1b34c961f5c7f37bf7c27bc48bee71b8430c7d135486","private_key":"dbec70bb9a08cabd1e7f19877731d486591fa448c65d8e48175658b5a46d7708","name":"node_5a8ba4047c4456e825bd1b34c961f5c7f37bf7c27bc48bee71b8430c7d135486","services":["streamer"],"enable_msg_events":true,"port":35767},"up":true}},{"node":{"info":{"id":"2354d3af5c6dca05d7dc212b100112f37ab29fb8b3f4319887230a4d420f5d9d","name":"node_2354d3af5c6dca05d7dc212b100112f37ab29fb8b3f4319887230a4d420f5d9d","enode":"enode://5f6d6715804fb0fa79d11569c038c51fdb2c154b06f8403d57d7362c87b361147a3bbf7d990c650a857a7aed53df21bc7a6d08540b1d0894db1cd83e1e69d0bd@127.0.0.1:0","enr":"0xf88fb8400295eb2dd56032a5f0ef15321413956120d8ea0924e56ebba770b064f823e42c015ddb67c6964e293c937f596999883d7a6d3c8b1fd7364e6afe36b4c0ca679f0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1035f6d6715804fb0fa79d11569c038c51fdb2c154b06f8403d57d7362c87b36114","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"I1TTr1xtygXX3CErEAES83qyn7iz9DGYhyMKTUIPXZ0=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 2354d3\npopulation: 28 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 c9ef cc9f | 60 d23c (0) d18a (0) d125 (0) deec (0)\n001 5 64e6 4d75 4775 5008 | 38 7a68 (0) 7bcb (0) 7bee (0) 73d0 (0)\n002 7 0e34 0807 01a6 03eb | 13 0a21 (0) 0807 (0) 0e34 (0) 0f31 (0)\n003 4 36d5 3e19 3871 3b83 | 6 3590 (0) 3775 (0) 36d5 (0) 3e19 (0)\n004 3 2803 2dd4 2d53 | 3 2803 (0) 2d53 (0) 2dd4 (0)\n005 3 27b5 27db 2471 | 3 27db (0) 27b5 (0) 2471 (0)\n006 2 21dc 216e | 2 21dc (0) 216e (0)\n============ DEPTH: 7 ==========================================\n007 2 221c 22bb | 2 221c (0) 22bb (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"2354d3af5c6dca05d7dc212b100112f37ab29fb8b3f4319887230a4d420f5d9d","private_key":"33f99c8fc27af3dfbab6afb6eca5cf61ff93788a211883b10a12d2696ebc18a5","name":"node_2354d3af5c6dca05d7dc212b100112f37ab29fb8b3f4319887230a4d420f5d9d","services":["streamer"],"enable_msg_events":true,"port":37965},"up":true}},{"node":{"info":{"id":"17406dea5046f00e27eaf74e166a945c9485139d6edcdfcd84f5b03f50eedd0a","name":"node_17406dea5046f00e27eaf74e166a945c9485139d6edcdfcd84f5b03f50eedd0a","enode":"enode://0163c2caaad749b2a1877dee27794e363304a8dfa3af56d253c7021217545cd1f31f24a821594b340e18ef78a6498656b65c7a12ba99a7e1a2ef34ef9da4c04d@127.0.0.1:0","enr":"0xf88fb840737226882bb1d943eb2e9cd4dfcfa63deca2a52dc312ea55f2cb29cf6f44704976ad5889976d9d00a3e0b745a7870999b20eb3a8f915f0c0b797c878cbe77fdf0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1030163c2caaad749b2a1877dee27794e363304a8dfa3af56d253c7021217545cd1","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"F0Bt6lBG8A4n6vdOFmqUXJSFE51u3N/NhPWwP1Du3Qo=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 17406d\npopulation: 29 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 be0f 8d3e fa9a c2f9 | 60 d23c (0) d125 (0) d18a (0) dd92 (0)\n001 6 6975 73d0 77ee 5a8b | 38 4a37 (0) 4a3c (0) 4bc8 (0) 4efa (0)\n002 7 3e19 3b83 3871 2dd4 | 17 3590 (0) 36d5 (0) 3775 (0) 3e19 (0)\n003 7 0a21 0807 0e34 0f31 | 8 0a21 (0) 0807 (0) 0e34 (0) 0f31 (0)\n004 2 1929 184e | 2 184e (0) 1929 (0)\n============ DEPTH: 5 ==========================================\n005 2 1385 127c | 2 1385 (0) 127c (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"17406dea5046f00e27eaf74e166a945c9485139d6edcdfcd84f5b03f50eedd0a","private_key":"96f0245c4b78bbf5a569ca11e55db6399d83ce08e6ec692e63acaebac837a9ea","name":"node_17406dea5046f00e27eaf74e166a945c9485139d6edcdfcd84f5b03f50eedd0a","services":["streamer"],"enable_msg_events":true,"port":33857},"up":true}},{"node":{"info":{"id":"01a63575c384f686e5739e1bd079e4a4c55421cd6d89b944e2c61dd174fa2bf6","name":"node_01a63575c384f686e5739e1bd079e4a4c55421cd6d89b944e2c61dd174fa2bf6","enode":"enode://946ba7faf16b78557ada55aa61d2ce4df1f255db899d3719d93c2005e88fd20aba59f9cdb4bc62d86b4b405a24bd310a8af3f1e4baf9cf5dbd548cf4e8d35557@127.0.0.1:0","enr":"0xf88fb8403960e3e45dce252d35faa9910dff31d41ef445f18ea2ff3d8fdeffb2716ef6fe40bdf310ee963cc581fc397dcd35c02571b7ff73bad2e0f63fde62678c392aa50183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103946ba7faf16b78557ada55aa61d2ce4df1f255db899d3719d93c2005e88fd20a","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"AaY1dcOE9oblc54b0HnkpMVUIc1tiblE4sYd0XT6K/Y=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 01a635\npopulation: 30 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 8 fa9a c9ef cc9f cc5f | 60 d18a (0) d125 (0) d23c (0) dd92 (0)\n001 4 6450 4d75 5008 55fd | 38 4a37 (0) 4a3c (0) 4bc8 (0) 4efa (0)\n002 7 2dd4 22bb 2354 216e | 17 3590 (0) 3775 (0) 36d5 (0) 3e19 (0)\n003 4 184e 1385 127c 1740 | 5 1929 (0) 184e (0) 1385 (0) 127c (0)\n004 4 0a21 0807 0f31 0e34 | 4 0a21 (0) 0807 (0) 0e34 (0) 0f31 (0)\n005 1 0639 | 1 0639 (0)\n============ DEPTH: 6 ==========================================\n006 2 034d 03eb | 2 034d (0) 03eb (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"01a63575c384f686e5739e1bd079e4a4c55421cd6d89b944e2c61dd174fa2bf6","private_key":"cc2f52f2da8baa58e999a96ec31dc946b081f0fc546742bfe885a4d65048f0ba","name":"node_01a63575c384f686e5739e1bd079e4a4c55421cd6d89b944e2c61dd174fa2bf6","services":["streamer"],"enable_msg_events":true,"port":32789},"up":true}},{"node":{"info":{"id":"acf888ed781f5358493e2e5048691acc39eac3240ca9e9093bb4052b1f624325","name":"node_acf888ed781f5358493e2e5048691acc39eac3240ca9e9093bb4052b1f624325","enode":"enode://2051ad3d9ecac3a9242bc33d92f20eb0265d19c75f91c5541715e4125dbc793b8cbbfaae8f549e0526d334b28142f61dd82fef168e2078e10046d42de98a8d84@127.0.0.1:0","enr":"0xf88fb840633de8fb5d405d72f5575e854e513bca5fa24ec6fb1e75838c27118b118fc3334af4ce9f07c4717bcd139c61925a6ad329754aad8fc5a3a441bbbe120d6386270183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1022051ad3d9ecac3a9242bc33d92f20eb0265d19c75f91c5541715e4125dbc793b","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"rPiI7XgfU1hJPi5QSGkazDnqwyQMqekJO7QFKx9iQyU=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: acf888\npopulation: 27 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 73d0 68a6 2471 0f31 | 68 4a37 (0) 4a3c (0) 4bc8 (0) 4efa (0)\n001 6 ee2b f33c d9d3 c2f9 | 31 d23c (0) d125 (0) d18a (0) dd92 (0)\n002 4 8012 8330 836e 8d3e | 9 957e (0) 9472 (0) 8284 (0) 8330 (0)\n003 7 b869 b9d9 bd48 bd96 | 14 b355 (0) b245 (0) b60e (0) b4e2 (0)\n004 1 a192 | 1 a192 (0)\n============ DEPTH: 5 ==========================================\n005 3 aba7 a9fa a861 | 3 aba7 (0) a9fa (0) a861 (0)\n006 1 aedc | 1 aedc (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"acf888ed781f5358493e2e5048691acc39eac3240ca9e9093bb4052b1f624325","private_key":"e3da942e1ebba4519becee21a2285ae952467d7639501faab88c017ed66d238e","name":"node_acf888ed781f5358493e2e5048691acc39eac3240ca9e9093bb4052b1f624325","services":["streamer"],"enable_msg_events":true,"port":35297},"up":true}},{"node":{"info":{"id":"0f3106adfe70aefb474c4a98a95932307391de2cb70fbd2e11dd31c9e695ed83","name":"node_0f3106adfe70aefb474c4a98a95932307391de2cb70fbd2e11dd31c9e695ed83","enode":"enode://5c476e3ae360f530756888a27af18afcec729c3d9485832d85b55f4910e22be32fe20aff65f08973bdb22a46239654a0b9ff97c4d3dbef485d21d6fbf2d21a25@127.0.0.1:0","enr":"0xf88fb8402d28c83dbd79c5e95b11079daad1069cecc4337f35abae0ff0a87d06300a14aa33ea3dde14e4082892622446978b18063fe5621c543b4392139e8066ebf634b50183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1035c476e3ae360f530756888a27af18afcec729c3d9485832d85b55f4910e22be3","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"DzEGrf5wrvtHTEqYqVkyMHOR3iy3D70uEd0xyeaV7YM=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 0f3106\npopulation: 29 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 9 cc9f cc5f d23c d9d3 | 60 d23c (0) d125 (0) d18a (0) dd92 (0)\n001 5 459b 7bcb 6daa 6450 | 38 4a3c (0) 4a37 (0) 4bc8 (0) 4efa (0)\n002 5 3b83 3871 2dd4 221c | 17 36d5 (0) 3775 (0) 3590 (0) 3e19 (0)\n003 3 1385 127c 1740 | 5 1929 (0) 184e (0) 1385 (0) 127c (0)\n004 4 0639 01a6 034d 03eb | 4 0639 (0) 034d (0) 03eb (0) 01a6 (0)\n============ DEPTH: 5 ==========================================\n005 2 0807 0a21 | 2 0a21 (0) 0807 (0)\n006 0 | 0\n007 1 0e34 | 1 0e34 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"0f3106adfe70aefb474c4a98a95932307391de2cb70fbd2e11dd31c9e695ed83","private_key":"6241837c865bfdb4b5200d2c76fbd45a87b9de82bb790d1ac679ceb517449a82","name":"node_0f3106adfe70aefb474c4a98a95932307391de2cb70fbd2e11dd31c9e695ed83","services":["streamer"],"enable_msg_events":true,"port":37821},"up":true}},{"node":{"info":{"id":"62f007c92a8af466e90ed0b1e5e71a955ad273ec793948ddfc03977f131ed2d1","name":"node_62f007c92a8af466e90ed0b1e5e71a955ad273ec793948ddfc03977f131ed2d1","enode":"enode://6a42ebbfda57a4727b4f686c785b5030992d3a2ecba2aa780527153ed432dc4a779c1a0c496e6503ec67f7063c21eaf924c996c37a2eb1dd29b86afddc735518@127.0.0.1:0","enr":"0xf88fb840844c5f5293365e47b6ea31282d2a2bcab345eb98290e20d878c868cf51faef74771a2271eef6d5e86d681144a1b449acbea967e03cc390b2d2472e714054391a0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1026a42ebbfda57a4727b4f686c785b5030992d3a2ecba2aa780527153ed432dc4a","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"YvAHySqK9GbpDtCx5ecalVrSc+x5OUjd/AOXfxMe0tE=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 62f007\npopulation: 30 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 ee2b c0ad cc9f 836e | 60 d23c (0) d18a (0) d125 (0) dd92 (0)\n001 8 2471 2dd4 3e19 3b83 | 30 3590 (0) 3775 (0) 36d5 (0) 3e19 (0)\n002 4 4775 5a8b 55fd 5008 | 20 4a3c (0) 4a37 (0) 4bc8 (0) 4efa (0)\n003 5 75e2 77ee 72a7 72a5 | 9 7a68 (0) 7bee (0) 7bcb (0) 72a5 (0)\n004 3 6daa 68a6 6975 | 3 6daa (0) 6975 (0) 68a6 (0)\n============ DEPTH: 5 ==========================================\n005 4 6450 641a 64e6 672a | 4 672a (0) 64e6 (0) 6450 (0) 641a (0)\n006 0 | 0\n007 1 6379 | 1 6379 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"62f007c92a8af466e90ed0b1e5e71a955ad273ec793948ddfc03977f131ed2d1","private_key":"ebf64acc962af28b6b8ed56078a7ae4726b851e322cebb1c852e24267f1c4a1d","name":"node_62f007c92a8af466e90ed0b1e5e71a955ad273ec793948ddfc03977f131ed2d1","services":["streamer"],"enable_msg_events":true,"port":43977},"up":true}},{"node":{"info":{"id":"b9d906e406b0fc6078c22bbc173043df1f7581061b4f6ccd769bc568d94b4339","name":"node_b9d906e406b0fc6078c22bbc173043df1f7581061b4f6ccd769bc568d94b4339","enode":"enode://d97b0fcc83cc71942a961140d70fbed0f9819f50795a64dce5d018ea28bcc04486d39682cb07a8f2084f401a987298d2a5385a1068133929a838255afd71df1b@127.0.0.1:0","enr":"0xf88fb84000536ff0e44a6e9ea1b978d39a2b2b4c28b4c30d63cc253d1996f9c000c0cee949b1904a5eee67b25704fbb2ba12b15f995cc6b9ac5717d610cc101ed5e3e75a0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103d97b0fcc83cc71942a961140d70fbed0f9819f50795a64dce5d018ea28bcc044","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"udkG5Aaw/GB4wiu8FzBD3x91gQYbT2zNdpvFaNlLQzk=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: b9d906\npopulation: 31 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 22bb 55fd 73d0 68a6 | 68 3775 (0) 36d5 (0) 3590 (0) 3e19 (0)\n001 4 c52a d9d3 ee2b eceb | 31 d23c (0) d125 (0) d18a (0) dd92 (0)\n002 4 8012 8330 836e 8d3e | 9 957e (0) 9472 (0) 8012 (0) 8284 (0)\n003 5 a861 a9fa aba7 acf8 | 6 a192 (0) aba7 (0) a9fa (0) a861 (0)\n004 5 b355 b245 b4e2 b5fc | 5 b355 (0) b245 (0) b4e2 (0) b5fc (0)\n============ DEPTH: 5 ==========================================\n005 7 be0f bd48 bddb bde9 | 7 be0f (0) bc29 (0) bc71 (0) bd48 (0)\n006 0 | 0\n007 1 b869 | 1 b869 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"b9d906e406b0fc6078c22bbc173043df1f7581061b4f6ccd769bc568d94b4339","private_key":"908ebb48b37c8f9239e22db00fb7161ba4a14b3f5857a1142bcaf9d46586ad23","name":"node_b9d906e406b0fc6078c22bbc173043df1f7581061b4f6ccd769bc568d94b4339","services":["streamer"],"enable_msg_events":true,"port":34371},"up":true}},{"node":{"info":{"id":"eceb7dc532596e8b68074113db9605e3d15cb15e2e80f75f1a66d95a1221c7dc","name":"node_eceb7dc532596e8b68074113db9605e3d15cb15e2e80f75f1a66d95a1221c7dc","enode":"enode://3419c9288c2eff070d8db3ecdf0c5675a6978ff0ca5e459886f451fb7c6a1c79f40f74557de8e513ea6e3db67a52a99933260c4838d0c88e1329e8c23f8e367b@127.0.0.1:0","enr":"0xf88fb840d19d680dca990e3894d8e63f0c7e053bb4beccc2b28b26e2156c3de7cfd0293637e634f6f398e2c52a3767d0f82b356f5387e7cbd65eb778d17d253d500eb9f00183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1033419c9288c2eff070d8db3ecdf0c5675a6978ff0ca5e459886f451fb7c6a1c79","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"7Ot9xTJZbotoB0ET25YF49FcsV4ugPdfGmbZWhIhx9w=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: eceb7d\npopulation: 32 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 772a 4589 58a9 216e | 68 3590 (0) 36d5 (0) 3775 (0) 3e19 (0)\n001 7 8d3e 8012 836e aba7 | 29 9472 (0) 957e (0) 8284 (0) 8330 (0)\n002 7 deec d9d3 cc9f cc5f | 14 d23c (0) d18a (0) d125 (0) dd92 (0)\n003 6 f33c f177 f005 fa9a | 9 f4a0 (0) f611 (0) f177 (0) f005 (0)\n004 1 e06f | 1 e06f (0)\n005 2 ea3d eb01 | 2 ea3d (0) eb01 (0)\n006 2 efd6 ee2b | 2 efd6 (0) ee2b (0)\n============ DEPTH: 7 ==========================================\n007 2 ed2e ed12 | 2 ed2e (0) ed12 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"eceb7dc532596e8b68074113db9605e3d15cb15e2e80f75f1a66d95a1221c7dc","private_key":"ebb9302277d87e1d7ead59e5bcd7f4c125c61b0d09ede9e8a3a87f788b8cb3ab","name":"node_eceb7dc532596e8b68074113db9605e3d15cb15e2e80f75f1a66d95a1221c7dc","services":["streamer"],"enable_msg_events":true,"port":39661},"up":true}},{"node":{"info":{"id":"c2f9b4abed9c6a839fe4c03a80bd396fd187a8784ba47a83687d3a54b7e2eddf","name":"node_c2f9b4abed9c6a839fe4c03a80bd396fd187a8784ba47a83687d3a54b7e2eddf","enode":"enode://3e0ee81dad3d6e6b7e146766e689ca44b20c076cd0dac90a0b937c80ffe51e87a731bb789fe07f1e3781e5aa25ea70150eb3b053fe0b179e7f7d94fbc180ed2a@127.0.0.1:0","enr":"0xf88fb84019f7283cf95d09b72f63e06b3411e0b049c15d2b86dfd18369f70d4ee944372e5c12e658b704f83f4482400458b31a516d5604fa0469210d467fe77d8e64f7dd0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1023e0ee81dad3d6e6b7e146766e689ca44b20c076cd0dac90a0b937c80ffe51e87","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"wvm0q+2caoOf5MA6gL05b9GHqHhLpHqDaH06VLfi7d8=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: c2f9b4\npopulation: 27 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 7 0639 03eb 1740 772a | 68 1929 (0) 184e (0) 127c (0) 1385 (0)\n001 6 acf8 aba7 a861 8330 | 29 957e (0) 9472 (0) 8284 (0) 836e (0)\n002 4 f33c f4a0 ea3d eceb | 17 f611 (0) f4a0 (0) f005 (0) f177 (0)\n003 4 d23c d9d3 dd92 deec | 6 d18a (0) d125 (0) d23c (0) dd92 (0)\n004 4 cc5f cc9f cabf c9ef | 5 ce01 (0) cc5f (0) cc9f (0) cabf (0)\n============ DEPTH: 5 ==========================================\n005 1 c52a | 1 c52a (0)\n006 1 c0ad | 1 c0ad (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"c2f9b4abed9c6a839fe4c03a80bd396fd187a8784ba47a83687d3a54b7e2eddf","private_key":"f980e9ba4f79f9f79e3659e3ba6dd1900868076a78a0cb0390b5c13fdfc2e105","name":"node_c2f9b4abed9c6a839fe4c03a80bd396fd187a8784ba47a83687d3a54b7e2eddf","services":["streamer"],"enable_msg_events":true,"port":37679},"up":true}},{"node":{"info":{"id":"c9ef56afed2d40db396ad39d6f5f5f38f4058b6b0d1e02b71d6aa92dbeaf7df7","name":"node_c9ef56afed2d40db396ad39d6f5f5f38f4058b6b0d1e02b71d6aa92dbeaf7df7","enode":"enode://b88aef73e2d38fb6fd1c0be8112453bc96dac9df272e9366494bb266ab6591c01482a93613d919a26bf6a4f62920343fe26b4dd5b8f13c4642fccd588d1b6407@127.0.0.1:0","enr":"0xf88fb8403c2ce4e2ffb11a365ec4903ac72a546b354de5dceec18acb0ce931dfdf593c9364716fab2b08ab7d23681b95c4ea160944780a2fb5eda9a5186c40196ed6fd350183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103b88aef73e2d38fb6fd1c0be8112453bc96dac9df272e9366494bb266ab6591c0","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"ye9Wr+0tQNs5atOdb19fOPQFi2sNHgK3HWqpLb6vffc=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: c9ef56\npopulation: 26 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 10 772a 72a7 4cc2 58a9 | 68 184e (0) 1929 (0) 127c (0) 1385 (0)\n001 2 b60e acf8 | 29 b869 (0) b9d9 (0) be0f (0) bc71 (0)\n002 5 eb01 efd6 eceb f33c | 17 e06f (0) ee2b (0) efd6 (0) ed2e (0)\n003 2 deec d9d3 | 6 d23c (0) d125 (0) d18a (0) dd92 (0)\n004 3 c52a c0ad c2f9 | 3 c52a (0) c0ad (0) c2f9 (0)\n============ DEPTH: 5 ==========================================\n005 3 ce01 cc9f cc5f | 3 ce01 (0) cc5f (0) cc9f (0)\n006 1 cabf | 1 cabf (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"c9ef56afed2d40db396ad39d6f5f5f38f4058b6b0d1e02b71d6aa92dbeaf7df7","private_key":"e39438d65893f9aa29c4f0b62c56230930d90dcaab3cbb07ea3c19d0cad5136e","name":"node_c9ef56afed2d40db396ad39d6f5f5f38f4058b6b0d1e02b71d6aa92dbeaf7df7","services":["streamer"],"enable_msg_events":true,"port":36083},"up":true}},{"node":{"info":{"id":"fa9a809f016097d949fa1463a1c8f08871c7d38e60b7df6d3e28ab04ccd3a143","name":"node_fa9a809f016097d949fa1463a1c8f08871c7d38e60b7df6d3e28ab04ccd3a143","enode":"enode://d27fa62643cd7eea1b635af3b3ce578baf185fffc47830a4c13ec296f90c46d2663dc1789046b5a79d796c57546e1ef68a15dbc440d08cc6644a8fa0ae887549@127.0.0.1:0","enr":"0xf88fb840f341ded7be4fe1c85a832c0eebf0214215e6fa10536fb974fad93566458010b2239adb66b6817d8493b1ec12ac407bb97cb2b1fbf6c36bb8809e809809df05c10183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103d27fa62643cd7eea1b635af3b3ce578baf185fffc47830a4c13ec296f90c46d2","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"+pqAnwFgl9lJ+hRjocjwiHHH045gt99tPiirBMzToUM=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: fa9a80\npopulation: 31 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 11 0a21 01a6 03eb 034d | 68 184e (0) 1929 (0) 127c (0) 1385 (0)\n001 5 836e be0f b60e aba7 | 29 be0f (0) bc71 (0) bc29 (0) bde9 (0)\n002 4 deec d9d3 c52a c9ef | 14 d23c (0) d125 (0) d18a (0) dd92 (0)\n003 5 eceb ed2e efd6 ea3d | 8 e06f (0) ee2b (0) efd6 (0) ed12 (0)\n004 4 f4a0 f611 f177 f33c | 6 f611 (0) f4a0 (0) f005 (0) f177 (0)\n============ DEPTH: 5 ==========================================\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 1 fa65 | 1 fa65 (0)\n009 1 fac8 | 1 fac8 (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"fa9a809f016097d949fa1463a1c8f08871c7d38e60b7df6d3e28ab04ccd3a143","private_key":"d7298e7ba76d8700d47fe74a50ac92478020ce786a9d1c343e118f94dd564864","name":"node_fa9a809f016097d949fa1463a1c8f08871c7d38e60b7df6d3e28ab04ccd3a143","services":["streamer"],"enable_msg_events":true,"port":41357},"up":true}},{"node":{"info":{"id":"55fdad03303a746920773217c568a37d2004869ff34096fbe45197f71eba2b63","name":"node_55fdad03303a746920773217c568a37d2004869ff34096fbe45197f71eba2b63","enode":"enode://3eae4ff354105cae615e8ed7499a263aab368017815886ccf3875219dfb6ae72174bc5241ef3c91c0c7baa54a3e833da1c27f41b8861dbb86b34351780ce8b18@127.0.0.1:0","enr":"0xf88fb8403c706e742e24e2e3e8bfcc48604544f9b4593b9fac94f97664fe76d2d9a02a183b24baf1ebfac2e908c29886fb61952983d054555cc677f2b4795e38cf5768dd0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1023eae4ff354105cae615e8ed7499a263aab368017815886ccf3875219dfb6ae72","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"Vf2tAzA6dGkgdzIXxWijfSAEhp/zQJb75FGX9x66K2M=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 55fdad\npopulation: 27 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 b5fc b245 bd48 b9d9 | 60 be0f (0) bc71 (0) bc29 (0) bde9 (0)\n001 6 1740 03eb 01a6 3b83 | 30 184e (0) 1929 (0) 127c (0) 1385 (0)\n002 4 6daa 62f0 73d0 77ee | 18 672a (0) 64e6 (0) 6450 (0) 641a (0)\n003 4 4c21 4cc2 4589 459b | 11 4bc8 (0) 4a3c (0) 4a37 (0) 4efa (0)\n004 5 5be6 5a8b 58a9 5c62 | 5 58a9 (0) 5be6 (0) 5a8b (0) 5c62 (0)\n============ DEPTH: 5 ==========================================\n005 3 5008 51c2 52b4 | 3 52b4 (0) 51c2 (0) 5008 (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"55fdad03303a746920773217c568a37d2004869ff34096fbe45197f71eba2b63","private_key":"9ffae4eb3efdf717dce58938868a5816422239bac33c7d104cae4e18b73feaa8","name":"node_55fdad03303a746920773217c568a37d2004869ff34096fbe45197f71eba2b63","services":["streamer"],"enable_msg_events":true,"port":37795},"up":true}},{"node":{"info":{"id":"22bbb3236a5e0a1947a1c4735aaacf9122173789a02a06e7653103bdcae2f823","name":"node_22bbb3236a5e0a1947a1c4735aaacf9122173789a02a06e7653103bdcae2f823","enode":"enode://0fcdb40b9980223ca221f90fca68efae8db086998c519d8725f451e9e351346836103fb5aa037e39188b71cb4b3f0625b313e7aee625e297edb036c44566f728@127.0.0.1:0","enr":"0xf88fb840d0cc3284ff4f87d20c3a83d7047fd8ab950c8bda00565839b26d7c9d24e7abf205c14a5d4714dbea74bf7a6de1731a8f80b41519fdf01063bbf6ed3322b874be0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1020fcdb40b9980223ca221f90fca68efae8db086998c519d8725f451e9e3513468","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"IruzI2peChlHocRzWqrPkSIXN4mgKgbnZTEDvcri+CM=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 22bbb3\npopulation: 25 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 b5fc b60e b9d9 | 60 be0f (0) bc71 (0) bc29 (0) bde9 (0)\n001 2 77ee 55fd | 38 6975 (0) 68a6 (0) 6daa (0) 672a (0)\n002 8 1385 1740 0639 01a6 | 13 1929 (0) 184e (0) 127c (0) 1385 (0)\n003 2 3871 3b83 | 6 36d5 (0) 3775 (0) 3590 (0) 3e19 (0)\n004 3 2803 2d53 2dd4 | 3 2803 (0) 2d53 (0) 2dd4 (0)\n005 3 2471 27db 27b5 | 3 2471 (0) 27b5 (0) 27db (0)\n006 2 216e 21dc | 2 21dc (0) 216e (0)\n============ DEPTH: 7 ==========================================\n007 1 2354 | 1 2354 (0)\n008 1 221c | 1 221c (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"22bbb3236a5e0a1947a1c4735aaacf9122173789a02a06e7653103bdcae2f823","private_key":"cce6899e27a53e544f7f5b8aad86ab94d88cb44d56c3990527df6186741b5448","name":"node_22bbb3236a5e0a1947a1c4735aaacf9122173789a02a06e7653103bdcae2f823","services":["streamer"],"enable_msg_events":true,"port":46859},"up":true}},{"node":{"info":{"id":"77eedcac0c847b1d693ddff07c5868afb1c2008b2dcb48a0299143ab14611969","name":"node_77eedcac0c847b1d693ddff07c5868afb1c2008b2dcb48a0299143ab14611969","enode":"enode://30c18cf67d3de082cf0bf79b9f1722fa4816434fd18609381488df512c8f3759e7c9bbccea6cd0e592c81ac1169d277e6b45beb59dec2f4678ba549b19370751@127.0.0.1:0","enr":"0xf88fb840054a553fdf6785422e9ba595a831b259bb7cc62c4c3a41861f937338904e08c1117e88ce97c436f3ea15af9cd139711452a589831e746d9b174c404df5b9b6130183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10330c18cf67d3de082cf0bf79b9f1722fa4816434fd18609381488df512c8f3759","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"d+7crAyEex1pPd/wfFhor7HCAIsty0igKZFDqxRhGWk=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 77eedc\npopulation: 26 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 eb01 f33c 8d3e | 60 e06f (0) ea3d (0) eb01 (0) efd6 (0)\n001 7 0807 0639 034d 03eb | 30 1929 (0) 184e (0) 127c (0) 1385 (0)\n002 3 459b 5a8b 55fd | 20 4a3c (0) 4a37 (0) 4bc8 (0) 4efa (0)\n003 5 6450 641a 62f0 6975 | 9 6379 (0) 62f0 (0) 672a (0) 64e6 (0)\n004 3 7bcb 7bee 7a68 | 3 7bee (0) 7bcb (0) 7a68 (0)\n005 3 72a5 72a7 73d0 | 3 72a5 (0) 72a7 (0) 73d0 (0)\n============ DEPTH: 6 ==========================================\n006 1 75e2 | 1 75e2 (0)\n007 0 | 0\n008 1 772a | 1 772a (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"77eedcac0c847b1d693ddff07c5868afb1c2008b2dcb48a0299143ab14611969","private_key":"e1e6b3e6225cad6b1df7fc028cf8a745346a7c26d5dea6825108ae2f483d8c04","name":"node_77eedcac0c847b1d693ddff07c5868afb1c2008b2dcb48a0299143ab14611969","services":["streamer"],"enable_msg_events":true,"port":44643},"up":true}},{"node":{"info":{"id":"8d3e0d9c6932d3422024394998e943309b679d667394d0eb622f0e208e7fcf0a","name":"node_8d3e0d9c6932d3422024394998e943309b679d667394d0eb622f0e208e7fcf0a","enode":"enode://ba544e97e0b245ef40d6515136e3b0b9af76a2d9f7eadfb8fde90b979079abcf9c60d1c43f5ab07731dc0d72a59a501b9cb7c951d9f5da576f16e19c5b1fdfbc@127.0.0.1:0","enr":"0xf88fb8400a1d7ba92c3ca031f366592c2d92fdb57881f30a2584f776614e94451218ba5a10ece049d25fcc363f9f3f26915edc173410d3a2393d5b83e18893e89e6a074f0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102ba544e97e0b245ef40d6515136e3b0b9af76a2d9f7eadfb8fde90b979079abcf","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"jT4NnGky00IgJDlJmOlDMJtnnWZzlNDrYi8OII5/zwo=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 8d3e0d\npopulation: 31 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 8 0f31 0807 0a21 127c | 68 184e (0) 1929 (0) 127c (0) 1385 (0)\n001 4 eceb f33c c2f9 c52a | 31 e06f (0) ea3d (0) eb01 (0) efd6 (0)\n002 12 a9fa a861 aba7 acf8 | 20 b869 (0) b9d9 (0) be0f (0) bc29 (0)\n003 2 957e 9472 | 2 957e (0) 9472 (0)\n004 3 8012 8330 836e | 4 8012 (0) 8284 (0) 836e (0) 8330 (0)\n============ DEPTH: 5 ==========================================\n005 1 8b35 | 1 8b35 (0)\n006 1 8fb8 | 1 8fb8 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"8d3e0d9c6932d3422024394998e943309b679d667394d0eb622f0e208e7fcf0a","private_key":"f2b2db3ab3bb25ad92063630dd8898f4437d0af687073abd25e341b1649e41cf","name":"node_8d3e0d9c6932d3422024394998e943309b679d667394d0eb622f0e208e7fcf0a","services":["streamer"],"enable_msg_events":true,"port":35799},"up":true}},{"node":{"info":{"id":"c52a68d8388a21013e4eecef9ea866db1f5eb16bbe0ecc82b8bfafd33e4e014f","name":"node_c52a68d8388a21013e4eecef9ea866db1f5eb16bbe0ecc82b8bfafd33e4e014f","enode":"enode://d0cbe2c3073b8e2da7f2d750d97719714b354e4a823141560a5c7e6bcc460dfe7a1fbab94d94d8bf48a64cb16c59489ef1d6b9a47d6f9e7e96bce190cc7f8d4d@127.0.0.1:0","enr":"0xf88fb8403bf91f39e315b53cdc4b2dbbf4b41e95542ff5660d7a2916fe2ee858ecc2c5723462999e9c22d592f05fe322d42caddf25eee3e855d5d9599b6f438f7627589c0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103d0cbe2c3073b8e2da7f2d750d97719714b354e4a823141560a5c7e6bcc460dfe","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"xSpo2DiKIQE+Tuzvnqhm2x9esWu+DsyCuL+v0z5OAU8=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: c52a68\npopulation: 29 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 9 7bcb 72a7 641a 58a9 | 68 184e (0) 1929 (0) 127c (0) 1385 (0)\n001 3 b9d9 b5fc 8d3e | 29 b869 (0) b9d9 (0) bc71 (0) bc29 (0)\n002 6 ea3d eb01 eceb fa9a | 17 e06f (0) ea3d (0) eb01 (0) ee2b (0)\n003 4 d18a d125 deec d9d3 | 6 d23c (0) d125 (0) d18a (0) d9d3 (0)\n004 5 ce01 cc5f cc9f cabf | 5 ce01 (0) cc5f (0) cc9f (0) cabf (0)\n============ DEPTH: 5 ==========================================\n005 2 c0ad c2f9 | 2 c0ad (0) c2f9 (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"c52a68d8388a21013e4eecef9ea866db1f5eb16bbe0ecc82b8bfafd33e4e014f","private_key":"f49dc248179df01ec6c8b426228f64aaa30b16ea7f8e9e9bf4f933d061d58bb6","name":"node_c52a68d8388a21013e4eecef9ea866db1f5eb16bbe0ecc82b8bfafd33e4e014f","services":["streamer"],"enable_msg_events":true,"port":42373},"up":true}},{"node":{"info":{"id":"3871492c8c62cd74cbe65a993669e4978cc641879a5223dd6b9e687f050a1c40","name":"node_3871492c8c62cd74cbe65a993669e4978cc641879a5223dd6b9e687f050a1c40","enode":"enode://8d83c109e42a329f480a3a51a9dde5516d6731233ddd28de467ff3ef255a8e5342765c79c446fdb28e14ead4c4c590b2ba5ba740b3f96be1eee5bbc837ee5963@127.0.0.1:0","enr":"0xf88fb84031a328c351d984beccbc346fa806f81c52b5e33a6ca23e3c378b6ce2cf71e60f7936466c5c8ef78d0cbbef2c09fa6b3fc77fafb99cdb8bcbf90a26a50dc0d0580183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1038d83c109e42a329f480a3a51a9dde5516d6731233ddd28de467ff3ef255a8e53","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"OHFJLIxizXTL5lqZNmnkl4zGQYeaUiPda55ofwUKHEA=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 387149\npopulation: 33 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 eceb c52a 8b35 aedc | 60 e06f (0) ea3d (0) eb01 (0) efd6 (0)\n001 8 6daa 62f0 7bcb 772a | 38 4bc8 (0) 4a37 (0) 4a3c (0) 4efa (0)\n002 8 1929 1385 1740 034d | 13 184e (0) 1929 (0) 127c (0) 1385 (0)\n003 8 2dd4 2471 27db 21dc | 11 2803 (0) 2d53 (0) 2dd4 (0) 27b5 (0)\n004 3 36d5 3775 3590 | 3 36d5 (0) 3775 (0) 3590 (0)\n============ DEPTH: 5 ==========================================\n005 1 3e19 | 1 3e19 (0)\n006 1 3b83 | 1 3b83 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"3871492c8c62cd74cbe65a993669e4978cc641879a5223dd6b9e687f050a1c40","private_key":"834f76d47474f2c89e8e0405186442df99beaa572593e766307382a90766efae","name":"node_3871492c8c62cd74cbe65a993669e4978cc641879a5223dd6b9e687f050a1c40","services":["streamer"],"enable_msg_events":true,"port":44349},"up":true}},{"node":{"info":{"id":"aedc9b478204effdcbad1a892333f15c061fbd1423b370f8a50f929b2a2f6952","name":"node_aedc9b478204effdcbad1a892333f15c061fbd1423b370f8a50f929b2a2f6952","enode":"enode://de0a47f289a5e5d540db8adc0ef05baf590d55abad62f68a25d5262181ce611b0a3aa703cdf027fc666dd62e66ce6be0ebc78179e341b06fa407ffee34176330@127.0.0.1:0","enr":"0xf88fb840870ed3339b049cab40a19dacd5afe7e4f8139c5f9da6053b795be3d6ac9447070011c7efbcdf83ab755f08ffcd03df0cabffa76734712b57822864e8514bce850183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102de0a47f289a5e5d540db8adc0ef05baf590d55abad62f68a25d5262181ce611b","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"rtybR4IE7/3LrRqJIzPxXAYfvRQjs3D4pQ+SmyovaVI=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: aedc9b\npopulation: 21 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 73d0 216e 3871 | 68 4a3c (0) 4a37 (0) 4bc8 (0) 4efa (0)\n001 3 deec f33c fa9a | 31 e06f (0) ea3d (0) eb01 (0) efd6 (0)\n002 4 9472 8284 8b35 8d3e | 9 957e (0) 9472 (0) 8012 (0) 836e (0)\n003 6 b60e b5fc b9d9 bc29 | 14 b869 (0) b9d9 (0) bc71 (0) bc29 (0)\n004 1 a192 | 1 a192 (0)\n============ DEPTH: 5 ==========================================\n005 3 a9fa a861 aba7 | 3 a9fa (0) a861 (0) aba7 (0)\n006 1 acf8 | 1 acf8 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"aedc9b478204effdcbad1a892333f15c061fbd1423b370f8a50f929b2a2f6952","private_key":"d0b21651e7458eb9235717900d45d5d655a60530764fcc4ca99ade40d39e4f0c","name":"node_aedc9b478204effdcbad1a892333f15c061fbd1423b370f8a50f929b2a2f6952","services":["streamer"],"enable_msg_events":true,"port":34417},"up":true}},{"node":{"info":{"id":"216e0370111e2e03927b803ae788f9947de8e241d41dbf6a70983cf0ecd68af1","name":"node_216e0370111e2e03927b803ae788f9947de8e241d41dbf6a70983cf0ecd68af1","enode":"enode://683e4c5a8d928aee37c2f41441e3d7550c42d486625db97883eb2046e9bafc9713f50ee269f4801f3a3c6220af6b097c4100ae92a1970333d9253f86d23c8a0c@127.0.0.1:0","enr":"0xf88fb8401dfe814edc9bad85208abd4a89df104f3d8a58386eb8a593a97d41fa5b72ae395106fc13f4897da7efe6c140ffef9097cd2f468a4920b060d8ea5bc13a46c2940183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102683e4c5a8d928aee37c2f41441e3d7550c42d486625db97883eb2046e9bafc97","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"IW4DcBEeLgOSe4A654j5lH3o4kHUHb9qcJg88OzWivE=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 216e03\npopulation: 29 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 eceb aedc | 60 d23c (0) d18a (0) d125 (0) d9d3 (0)\n001 8 4d75 4c21 4efa 4bc8 | 38 4a3c (0) 4a37 (0) 4bc8 (0) 4efa (0)\n002 4 1929 1385 01a6 0639 | 13 184e (0) 1929 (0) 1740 (0) 127c (0)\n003 5 3590 36d5 3775 3871 | 6 3590 (0) 36d5 (0) 3775 (0) 3e19 (0)\n004 3 2803 2d53 2dd4 | 3 2803 (0) 2d53 (0) 2dd4 (0)\n005 3 2471 27b5 27db | 3 2471 (0) 27b5 (0) 27db (0)\n============ DEPTH: 6 ==========================================\n006 3 2354 221c 22bb | 3 2354 (0) 22bb (0) 221c (0)\n007 0 | 0\n008 1 21dc | 1 21dc (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"216e0370111e2e03927b803ae788f9947de8e241d41dbf6a70983cf0ecd68af1","private_key":"03956bb84d1d10be6b5626b2c0175cefa443ca6cafbff149baba36309c2be8fd","name":"node_216e0370111e2e03927b803ae788f9947de8e241d41dbf6a70983cf0ecd68af1","services":["streamer"],"enable_msg_events":true,"port":44971},"up":true}},{"node":{"info":{"id":"73d0d1d4a2b7250f51e57c13cc48bc6b20682320ce12ee8e5765afeef7d9de42","name":"node_73d0d1d4a2b7250f51e57c13cc48bc6b20682320ce12ee8e5765afeef7d9de42","enode":"enode://9ac8ba21114f8c40f21f83d7747cd65cc99c986ab59bb477956d068c8cd04001712f8a843e0101b065abbcb2c3b2bd5472dc79345af64d86af2442b35eb0fb68@127.0.0.1:0","enr":"0xf88fb8405197213d021e7a00219b2701909e28eea2507aacb71f2ac2ead5dca945e66d7d1ba4dfa641f44981ca3e8b71b479abb37209113213d5e81f5fb709dead3663300183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1029ac8ba21114f8c40f21f83d7747cd65cc99c986ab59bb477956d068c8cd04001","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"c9DR1KK3JQ9R5XwTzEi8ayBoIyDOEu6OV2Wv7vfZ3kI=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 73d0d1\npopulation: 33 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 12 b60e b5fc be0f bd48 | 60 957e (0) 9472 (0) 8012 (0) 8330 (0)\n001 2 1740 216e | 30 1929 (0) 184e (0) 1740 (0) 127c (0)\n002 7 4a37 4cc2 459b 5cc1 | 20 4bc8 (0) 4a3c (0) 4a37 (0) 4efa (0)\n003 4 6450 6379 62f0 6daa | 9 672a (0) 64e6 (0) 6450 (0) 641a (0)\n004 3 7bee 7bcb 7a68 | 3 7bee (0) 7bcb (0) 7a68 (0)\n005 3 75e2 772a 77ee | 3 75e2 (0) 77ee (0) 772a (0)\n============ DEPTH: 6 ==========================================\n006 0 | 0\n007 2 72a5 72a7 | 2 72a5 (0) 72a7 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"73d0d1d4a2b7250f51e57c13cc48bc6b20682320ce12ee8e5765afeef7d9de42","private_key":"5c8a42c979ee0b2447144c7dd26b2c6e8a98d27f055aa74c3e8e5559e2cb46bf","name":"node_73d0d1d4a2b7250f51e57c13cc48bc6b20682320ce12ee8e5765afeef7d9de42","services":["streamer"],"enable_msg_events":true,"port":39577},"up":true}},{"node":{"info":{"id":"f33c07a818863a358358989ec71504abad3ca0a7c81b54aad59075a766fad501","name":"node_f33c07a818863a358358989ec71504abad3ca0a7c81b54aad59075a766fad501","enode":"enode://bb701e37ec5c4eb7faf97cc3aeb366de572c8d5d69e00eb267fecf7d1057eae9b583d3c64a9c0cd2374c0386113db63a61c256ab2b7cf358a6d90a7e9794260d@127.0.0.1:0","enr":"0xf88fb8406c2273c5e5619bccbf0c95225591124b18297b1ae02303095104b37745795d1b4b1d98f175c9198c719d3e2039226b02017e0d5a579e852f53ab0abcbb6a63c30183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103bb701e37ec5c4eb7faf97cc3aeb366de572c8d5d69e00eb267fecf7d1057eae9","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"8zwHqBiGOjWDWJiexxUEq608oKfIG1Sq1ZB1p2b61QE=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: f33c07\npopulation: 41 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 13 034d 27db 221c 2dd4 | 68 184e (0) 1929 (0) 1740 (0) 127c (0)\n001 8 9472 8d3e b245 be0f | 29 957e (0) 9472 (0) 8012 (0) 8284 (0)\n002 6 deec d9d3 c9ef cc9f | 14 d23c (0) d18a (0) d125 (0) d9d3 (0)\n003 6 eceb ed2e ed12 ee2b | 8 e06f (0) ea3d (0) eb01 (0) efd6 (0)\n004 3 fa65 fac8 fa9a | 3 fa65 (0) fac8 (0) fa9a (0)\n005 2 f4a0 f611 | 2 f4a0 (0) f611 (0)\n============ DEPTH: 6 ==========================================\n006 2 f005 f177 | 2 f005 (0) f177 (0)\n007 0 | 0\n008 1 f3d5 | 1 f3d5 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"f33c07a818863a358358989ec71504abad3ca0a7c81b54aad59075a766fad501","private_key":"cc252064f7892875bcbb546a3d781327da4ab0042adaa0dd77dda609e9dbeacc","name":"node_f33c07a818863a358358989ec71504abad3ca0a7c81b54aad59075a766fad501","services":["streamer"],"enable_msg_events":true,"port":40171},"up":true}},{"node":{"info":{"id":"3b830c2ae5463ca2f2260176b77b8dda23048257aa780255c69cf1bbbc6fb64c","name":"node_3b830c2ae5463ca2f2260176b77b8dda23048257aa780255c69cf1bbbc6fb64c","enode":"enode://0009f6f563c6452d012e984f5cbe5de59f3838507fa83b32de8e12fc72d7abc3722c4b2b439eb90ccb5268e246b24cd30b2f317e7d1c855c25ef4d429d5b867b@127.0.0.1:0","enr":"0xf88fb8400938dcfa0fa11e741c028a9b8cbcb9e6b12b58464a8c5d0b8581f6103d56571352e10574431842737cf1f8e857b861b51a7b4094d046eac4cc42a317b5fbcd260183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1030009f6f563c6452d012e984f5cbe5de59f3838507fa83b32de8e12fc72d7abc3","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"O4MMKuVGPKLyJgF2t3uN2iMEgleqeAJVxpzxu7xvtkw=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 3b830c\npopulation: 28 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 b60e f33c | 60 957e (0) 9472 (0) 8330 (0) 836e (0)\n001 7 7bcb 6daa 62f0 4589 | 38 52b4 (0) 5008 (0) 51c2 (0) 55fd (0)\n002 6 0f31 0807 034d 01a6 | 13 184e (0) 1929 (0) 1740 (0) 127c (0)\n003 8 2d53 2dd4 27db 21dc | 11 2803 (0) 2d53 (0) 2dd4 (0) 2471 (0)\n004 3 36d5 3775 3590 | 3 36d5 (0) 3775 (0) 3590 (0)\n============ DEPTH: 5 ==========================================\n005 1 3e19 | 1 3e19 (0)\n006 1 3871 | 1 3871 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"3b830c2ae5463ca2f2260176b77b8dda23048257aa780255c69cf1bbbc6fb64c","private_key":"a26abbb5971ae2f14bf7f9cf3604375ed01076a0a5f87bdb169a057aba393510","name":"node_3b830c2ae5463ca2f2260176b77b8dda23048257aa780255c69cf1bbbc6fb64c","services":["streamer"],"enable_msg_events":true,"port":44047},"up":true}},{"node":{"info":{"id":"b60e77c40ddc9dc78a4ad346add37e60f10f2999de836615db53524487d1ede9","name":"node_b60e77c40ddc9dc78a4ad346add37e60f10f2999de836615db53524487d1ede9","enode":"enode://8056da3baf80eb4e505b24fa85d6983cd0c08e57ff29de4fcd7cc5265957b4b951f2c346254e6476b70b57f3d47a2acd98577851778d4f96c6cf16f3cbcef6bd@127.0.0.1:0","enr":"0xf88fb840dc084998ced183bd31314071c4467df4b73013e165b0d232050ea6a34da27200541f9558182b77822222c499c6e0dac4fce02d7e39368547197e7f396dbcc66d0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1038056da3baf80eb4e505b24fa85d6983cd0c08e57ff29de4fcd7cc5265957b4b9","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"tg53xA3cnceKStNGrdN+YPEPKZneg2YV21NSRIfR7ek=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: b60e77\npopulation: 23 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 73d0 6daa 22bb 3b83 | 68 52b4 (0) 5008 (0) 51c2 (0) 55fd (0)\n001 3 fa9a c9ef deec | 31 d23c (0) d125 (0) d18a (0) d9d3 (0)\n002 3 9472 8b35 8d3e | 9 957e (0) 9472 (0) 8012 (0) 8330 (0)\n003 5 acf8 aedc a9fa a861 | 6 a192 (0) acf8 (0) aedc (0) a9fa (0)\n004 4 b9d9 bd96 bd48 be0f | 9 b869 (0) b9d9 (0) bc29 (0) bc71 (0)\n005 2 b355 b245 | 2 b355 (0) b245 (0)\n============ DEPTH: 6 ==========================================\n006 2 b4e2 b5fc | 2 b4e2 (0) b5fc (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"b60e77c40ddc9dc78a4ad346add37e60f10f2999de836615db53524487d1ede9","private_key":"a9b81b86acde80334419f584fa1f17b478272a646091fd3c7250f8b10ba99c10","name":"node_b60e77c40ddc9dc78a4ad346add37e60f10f2999de836615db53524487d1ede9","services":["streamer"],"enable_msg_events":true,"port":36265},"up":true}},{"node":{"info":{"id":"b5fc43e8c0df3279d6a12cd8b03012cb8d2205208324018c7ae725745a99a2f3","name":"node_b5fc43e8c0df3279d6a12cd8b03012cb8d2205208324018c7ae725745a99a2f3","enode":"enode://ad94d5da30a8e6fa7eed9bdffb921e1092d69a95a807d03810dc03bc57ead17b20c03d139f43048113b82ef53df5e92169655c100e4f408de936364aa731dda4@127.0.0.1:0","enr":"0xf88fb840ee7e922aec199035d2d62046ea3b1a19143ec54359003e49b68d8cbd84b539f27d0e7caf904f7f220035c6210d38e15b618abecbfb9c4db3d503b741aa37f6dc0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102ad94d5da30a8e6fa7eed9bdffb921e1092d69a95a807d03810dc03bc57ead17b","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"tfxD6MDfMnnWoSzYsDASy40iBSCDJAGMeucldFqZovM=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: b5fc43\npopulation: 24 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 55fd 73d0 6450 22bb | 68 52b4 (0) 51c2 (0) 5008 (0) 55fd (0)\n001 2 c52a deec | 31 d23c (0) d18a (0) d125 (0) d9d3 (0)\n002 3 9472 8b35 8d3e | 9 957e (0) 9472 (0) 8012 (0) 8330 (0)\n003 3 aedc acf8 aba7 | 6 a192 (0) acf8 (0) aedc (0) a9fa (0)\n004 7 b869 b9d9 bc29 bd96 | 9 b869 (0) b9d9 (0) bc71 (0) bc29 (0)\n005 2 b355 b245 | 2 b245 (0) b355 (0)\n============ DEPTH: 6 ==========================================\n006 1 b60e | 1 b60e (0)\n007 1 b4e2 | 1 b4e2 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"b5fc43e8c0df3279d6a12cd8b03012cb8d2205208324018c7ae725745a99a2f3","private_key":"0134c954441986806c11920e8f351540b3c6bdd309245a07f647cc4e169a81da","name":"node_b5fc43e8c0df3279d6a12cd8b03012cb8d2205208324018c7ae725745a99a2f3","services":["streamer"],"enable_msg_events":true,"port":38321},"up":true}},{"node":{"info":{"id":"0639f010834f5bc497798f2d275bbc60bfbcd53c83e38986b7260310c6001420","name":"node_0639f010834f5bc497798f2d275bbc60bfbcd53c83e38986b7260310c6001420","enode":"enode://2d6b0e5f0d91f9894a0dabb941a7d6dc48de6b6554cfb6d7a8a9cec18c826ee0e655dae74f3e10a713ab5f85c916b579dddf8520a9921fab3f12b73a87e6f701@127.0.0.1:0","enr":"0xf88fb840dfa210d668f3a2c36acd290f3d30342b0e7d83f74443a6c6a50ea14f016dc5ec5ecf5395805d6322a9ff4fe28ee4f0d3b5cca2fc3be0fe8ac43f39650231ef750183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1032d6b0e5f0d91f9894a0dabb941a7d6dc48de6b6554cfb6d7a8a9cec18c826ee0","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"BjnwEINPW8SXeY8tJ1u8YL+81TyD44mGtyYDEMYAFCA=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 0639f0\npopulation: 31 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 fa9a c2f9 c9ef 8b35 | 60 cc9f (0) cc5f (0) ce01 (0) cabf (0)\n001 7 5be6 6daa 6450 77ee | 38 6975 (0) 68a6 (0) 6daa (0) 62f0 (0)\n002 8 3775 3590 2d53 2dd4 | 17 3590 (0) 36d5 (0) 3775 (0) 3e19 (0)\n003 4 184e 1929 1740 1385 | 5 184e (0) 1929 (0) 1740 (0) 127c (0)\n004 3 0f31 0807 0a21 | 4 0a21 (0) 0807 (0) 0e34 (0) 0f31 (0)\n============ DEPTH: 5 ==========================================\n005 3 01a6 03eb 034d | 3 01a6 (0) 03eb (0) 034d (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"0639f010834f5bc497798f2d275bbc60bfbcd53c83e38986b7260310c6001420","private_key":"77308f10c71498c40a49e4aeb7c93c863895a490407505b02a488c452abf01e9","name":"node_0639f010834f5bc497798f2d275bbc60bfbcd53c83e38986b7260310c6001420","services":["streamer"],"enable_msg_events":true,"port":38359},"up":true}},{"node":{"info":{"id":"221cd8ea0a26f0d3f81f782f1de390282415ecd9cf40224b4945a00897895b4e","name":"node_221cd8ea0a26f0d3f81f782f1de390282415ecd9cf40224b4945a00897895b4e","enode":"enode://4c0f14e6659005f725d17c49e95e9bba43b97f7a4c2cec6f8ae665dca6f9113e7a8b8f561014b4b2f850b5f135e0f0189d7efb4e74795d3dee5848cf6d07e6aa@127.0.0.1:0","enr":"0xf88fb840aa25c219ac37cc27c5582211fa9de0891c9aab80d7e185863532cc15a1c8eda84507ccbc3f09570329c6d2c0eacb3910cf2c29d9299eef9ce1a8ceffbeb4b0880183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1024c0f14e6659005f725d17c49e95e9bba43b97f7a4c2cec6f8ae665dca6f9113e","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"IhzY6gom8NP4H3gvHeOQKCQV7NnPQCJLSUWgCJeJW04=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 221cd8\npopulation: 24 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 c52a f33c | 60 e06f (0) ea3d (0) eb01 (0) efd6 (0)\n001 3 5cc1 7a68 772a | 38 62f0 (0) 6379 (0) 672a (0) 64e6 (0)\n002 5 1385 1740 1929 0f31 | 13 184e (0) 1929 (0) 1740 (0) 127c (0)\n003 4 3590 3775 3871 3b83 | 6 3590 (0) 36d5 (0) 3775 (0) 3e19 (0)\n004 3 2803 2d53 2dd4 | 3 2803 (0) 2d53 (0) 2dd4 (0)\n005 3 2471 27b5 27db | 3 2471 (0) 27b5 (0) 27db (0)\n006 2 216e 21dc | 2 21dc (0) 216e (0)\n============ DEPTH: 7 ==========================================\n007 1 2354 | 1 2354 (0)\n008 1 22bb | 1 22bb (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"221cd8ea0a26f0d3f81f782f1de390282415ecd9cf40224b4945a00897895b4e","private_key":"c103c3cd8b3ec73103ecffab8a4778ba17c4ef1c7764c4edae06bb253bb4a1c7","name":"node_221cd8ea0a26f0d3f81f782f1de390282415ecd9cf40224b4945a00897895b4e","services":["streamer"],"enable_msg_events":true,"port":34123},"up":true}},{"node":{"info":{"id":"2dd4ad83effc3ba73e72f5659583e5987241bda563563200b50c46cce00a1d9b","name":"node_2dd4ad83effc3ba73e72f5659583e5987241bda563563200b50c46cce00a1d9b","enode":"enode://2185c184311e0733ef3b385df4a2aaa3999aff53d34d3eef8fd026b46623c06a22c8ed8af0ec2827ea684193eb59cf3f6983f8c15a76b59a1fd8f2ee927f7070@127.0.0.1:0","enr":"0xf88fb8407c20d1f26dca6179ace9bc2df0f2e49e8ce46a9ab6ffc3ebc4b70f5448c300b604be2f148e16830139c9afb09d266af5fee0f6826901a4fcb31a79a39a3e48f10183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1022185c184311e0733ef3b385df4a2aaa3999aff53d34d3eef8fd026b46623c06a","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"LdStg+/8O6c+cvVllYPlmHJBvaVjVjIAtQxGzOAKHZs=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 2dd4ad\npopulation: 27 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 c52a f33c | 60 e06f (0) eb01 (0) ea3d (0) efd6 (0)\n001 4 62f0 5cc1 4589 459b | 38 6379 (0) 62f0 (0) 672a (0) 64e6 (0)\n002 7 1385 1740 0639 01a6 | 13 0807 (0) 0a21 (0) 0e34 (0) 0f31 (0)\n003 5 36d5 3775 3590 3b83 | 6 36d5 (0) 3775 (0) 3590 (0) 3e19 (0)\n004 7 2471 27db 21dc 216e | 8 2471 (0) 27b5 (0) 27db (0) 21dc (0)\n============ DEPTH: 5 ==========================================\n005 1 2803 | 1 2803 (0)\n006 0 | 0\n007 0 | 0\n008 1 2d53 | 1 2d53 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"2dd4ad83effc3ba73e72f5659583e5987241bda563563200b50c46cce00a1d9b","private_key":"7780b155f127c1e2df9bd24187ab68f6bcfbc96c9ef1d8e6bfb2453180d4d177","name":"node_2dd4ad83effc3ba73e72f5659583e5987241bda563563200b50c46cce00a1d9b","services":["streamer"],"enable_msg_events":true,"port":41059},"up":true}},{"node":{"info":{"id":"459b9fb2b7f4e396de8cf8740a6804c8e5b96ca11ffa2b5106c14dfbbab65c95","name":"node_459b9fb2b7f4e396de8cf8740a6804c8e5b96ca11ffa2b5106c14dfbbab65c95","enode":"enode://596d8f8a3f115e739480cfc90bc3ed52bd3c6db976e8b44dd13b7c598ae1592b213998fcd92d010932001f405ea0d17a35cf0ee9dbd4d27cf7f5a665cec3dc63@127.0.0.1:0","enr":"0xf88fb8409cc2805d0639562a229301ca59a539f4a081f7b38ac8f293061de8340bca1d2645d0c65b2fc1170fff5f9386d3ab9f0357bfab057f46159767025ca2d20a0cf70183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103596d8f8a3f115e739480cfc90bc3ed52bd3c6db976e8b44dd13b7c598ae1592b","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"RZufsrf045bejPh0CmgEyOW5bKEf+itRBsFN+7q2XJU=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 459b9f\npopulation: 25 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 c52a f33c | 60 e06f (0) ea3d (0) eb01 (0) efd6 (0)\n001 4 03eb 0f31 3871 2dd4 | 30 0807 (0) 0a21 (0) 0e34 (0) 0f31 (0)\n002 8 6daa 6450 641a 7a68 | 18 6379 (0) 62f0 (0) 672a (0) 64e6 (0)\n003 3 5008 55fd 58a9 | 9 52b4 (0) 5008 (0) 51c2 (0) 55fd (0)\n004 5 4a3c 4efa 4d75 4c21 | 7 4bc8 (0) 4a37 (0) 4a3c (0) 4efa (0)\n============ DEPTH: 5 ==========================================\n005 0 | 0\n006 2 4775 4746 | 2 4775 (0) 4746 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 1 4589 | 1 4589 (0)\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"459b9fb2b7f4e396de8cf8740a6804c8e5b96ca11ffa2b5106c14dfbbab65c95","private_key":"a5637f6dfe5f01c6cc2f881f665ff337c05147527c551e16933839046d2f0402","name":"node_459b9fb2b7f4e396de8cf8740a6804c8e5b96ca11ffa2b5106c14dfbbab65c95","services":["streamer"],"enable_msg_events":true,"port":43667},"up":true}},{"node":{"info":{"id":"58a90b58858417a4e972626421ed8e78b1b3e5ac69fcedd22c58a8ab4c6147df","name":"node_58a90b58858417a4e972626421ed8e78b1b3e5ac69fcedd22c58a8ab4c6147df","enode":"enode://a316c9e7d1d346e81a1fec594ce6e35c607b9c61382ae1d43ee823bff44691073f86d5d9c0855bc150802216453072291e4fcf13a75b9e7c24f4c050c5b8f383@127.0.0.1:0","enr":"0xf88fb840989fd084c3dc88c500954c17cbe02ddeb37aec1afd002fbec87e88f3efa1758b10901f9c502b0e252254124e32464db5744f524bf2e090d035e4cb986373579c0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103a316c9e7d1d346e81a1fec594ce6e35c607b9c61382ae1d43ee823bff4469107","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"WKkLWIWEF6TpcmJkIe2OeLGz5axp/O3SLFioq0xhR98=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 58a90b\npopulation: 27 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 9 deec c9ef c52a c2f9 | 60 e06f (0) ea3d (0) eb01 (0) efd6 (0)\n001 3 1385 034d 3b83 | 30 0807 (0) 0a21 (0) 0e34 (0) 0f31 (0)\n002 5 73d0 6379 6450 641a | 18 62f0 (0) 6379 (0) 672a (0) 64e6 (0)\n003 3 4a37 4c21 459b | 11 4a3c (0) 4a37 (0) 4bc8 (0) 4efa (0)\n004 3 5008 51c2 55fd | 4 55fd (0) 52b4 (0) 5008 (0) 51c2 (0)\n005 2 5c62 5cc1 | 2 5c62 (0) 5cc1 (0)\n============ DEPTH: 6 ==========================================\n006 2 5a8b 5be6 | 2 5a8b (0) 5be6 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"58a90b58858417a4e972626421ed8e78b1b3e5ac69fcedd22c58a8ab4c6147df","private_key":"f76a3f3cb8f63a53ab4db362f8c406b8b64c653bfeb32a8e730eb9386f52f057","name":"node_58a90b58858417a4e972626421ed8e78b1b3e5ac69fcedd22c58a8ab4c6147df","services":["streamer"],"enable_msg_events":true,"port":43195},"up":true}},{"node":{"info":{"id":"be0fb2b440b91e719c20f51b673eb9f2f66c7af77b0b0ade312998cdffcc5045","name":"node_be0fb2b440b91e719c20f51b673eb9f2f66c7af77b0b0ade312998cdffcc5045","enode":"enode://eeded07e99fa4ff2d426439e42dc4604dd4b1b48d79b02496e61ff86d21658dc4ece7ba599e544ef99d326c12c01c70509c8cfd486228c14db2d8c2b15648571@127.0.0.1:0","enr":"0xf88fb840bf0cf1c25f6277811da44fc4d073295fcffa375500de088bd154cff1aa9770737b9e677865a1873a4a10103f43db1289382f15e37cebe4e4d8cc60b013ff2a1c0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103eeded07e99fa4ff2d426439e42dc4604dd4b1b48d79b02496e61ff86d21658dc","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"vg+ytEC5HnGcIPUbZz658vZsevd7CwreMSmYzf/MUEU=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: be0fb2\npopulation: 38 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 10 3775 1740 1385 034d | 68 0807 (0) 0a21 (0) 0e34 (0) 0f31 (0)\n001 12 f611 f177 f33c f3d5 | 31 e06f (0) eb01 (0) ea3d (0) efd6 (0)\n002 3 9472 8b35 8d3e | 9 957e (0) 9472 (0) 8012 (0) 836e (0)\n003 2 aedc aba7 | 6 a192 (0) acf8 (0) aedc (0) a861 (0)\n004 3 b355 b60e b5fc | 5 b245 (0) b355 (0) b4e2 (0) b5fc (0)\n005 2 b869 b9d9 | 2 b869 (0) b9d9 (0)\n============ DEPTH: 6 ==========================================\n006 6 bc71 bc29 bd96 bde9 | 6 bc71 (0) bc29 (0) bd96 (0) bde9 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"be0fb2b440b91e719c20f51b673eb9f2f66c7af77b0b0ade312998cdffcc5045","private_key":"38ca3287eddd306f53a09e7f411c72cd416a6fea9372c3be4307ffa2b66a5e84","name":"node_be0fb2b440b91e719c20f51b673eb9f2f66c7af77b0b0ade312998cdffcc5045","services":["streamer"],"enable_msg_events":true,"port":33661},"up":true}},{"node":{"info":{"id":"deec6a8beb4e5e441dd42311354194c3bef9448e8859b4ccd401645b69217d12","name":"node_deec6a8beb4e5e441dd42311354194c3bef9448e8859b4ccd401645b69217d12","enode":"enode://f76349ec766de9d4431151d18ef460cbf69350f3bfa572661117e66b942e7c43605b02eb8805192c15a2c6a5fa47fefe5f4faf57cff643dffd13cfe84d80dcd2@127.0.0.1:0","enr":"0xf88fb840a8e8b269bcf4e00811769f0b731ba2d12904fea4ba28727d8c02b71eb17799531e0b15265ed663ef981c53c77bcbd0a2bb3e8607ade87aef661238ac26892bfb0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102f76349ec766de9d4431151d18ef460cbf69350f3bfa572661117e66b942e7c43","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"3uxqi+tOXkQd1CMRNUGUw775RI6IWbTM1AFkW2khfRI=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: deec6a\npopulation: 38 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 12 58a9 5cc1 4c21 7bcb | 68 55fd (0) 52b4 (0) 5008 (0) 51c2 (0)\n001 7 9472 aedc aba7 b60e | 29 957e (0) 9472 (0) 8012 (0) 836e (0)\n002 8 eceb ed12 ed2e fa9a | 17 e06f (0) eb01 (0) ea3d (0) efd6 (0)\n003 6 c52a c2f9 c9ef ce01 | 8 cc5f (0) cc9f (0) ce01 (0) cabf (0)\n004 3 d23c d18a d125 | 3 d23c (0) d18a (0) d125 (0)\n============ DEPTH: 5 ==========================================\n005 1 d9d3 | 1 d9d3 (0)\n006 1 dd92 | 1 dd92 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"deec6a8beb4e5e441dd42311354194c3bef9448e8859b4ccd401645b69217d12","private_key":"e937ad3db719737f604c22bd1bc3702c56cab3b5ef6aeddadad798027099af81","name":"node_deec6a8beb4e5e441dd42311354194c3bef9448e8859b4ccd401645b69217d12","services":["streamer"],"enable_msg_events":true,"port":42029},"up":true}},{"node":{"info":{"id":"13853407d278a45e15d4b148fc38ebb35c4f58ee552ee0e4401c6c98c45b8e3e","name":"node_13853407d278a45e15d4b148fc38ebb35c4f58ee552ee0e4401c6c98c45b8e3e","enode":"enode://233f1ef8d53ba1f2f35253d6fd30975d21193041f84c41e99efa3680301dbd2dc630d0ac490193182b8f32036c6cc7fd56f8396c42f02d6797074cabfec0aa1c@127.0.0.1:0","enr":"0xf88fb8404cb34513bd8303f7d3bf75384dd785ab45af5e1ddb4087f14b97cb418a03dcac17b596bc11aec73cbf0795c77a2d1b84f895a76f54d0ee90d842fc74759bace40183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102233f1ef8d53ba1f2f35253d6fd30975d21193041f84c41e99efa3680301dbd2d","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"E4U0B9J4pF4V1LFI/Djrs1xPWO5VLuDkQBxsmMRbjj4=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 138534\npopulation: 37 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 7 8b35 8d3e b355 be0f | 60 8012 (0) 8284 (0) 836e (0) 8330 (0)\n001 10 6450 6daa 7bcb 77ee | 38 55fd (0) 52b4 (0) 5008 (0) 51c2 (0)\n002 10 3775 3590 3871 3b83 | 17 3e19 (0) 3b83 (0) 3871 (0) 36d5 (0)\n003 6 0f31 0a21 0807 01a6 | 8 0a21 (0) 0807 (0) 0e34 (0) 0f31 (0)\n004 2 184e 1929 | 2 184e (0) 1929 (0)\n============ DEPTH: 5 ==========================================\n005 1 1740 | 1 1740 (0)\n006 0 | 0\n007 1 127c | 1 127c (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"13853407d278a45e15d4b148fc38ebb35c4f58ee552ee0e4401c6c98c45b8e3e","private_key":"7da06589109c392355e1be112c5b857ab81263c8a0d024f4bb9a295c1e7e7835","name":"node_13853407d278a45e15d4b148fc38ebb35c4f58ee552ee0e4401c6c98c45b8e3e","services":["streamer"],"enable_msg_events":true,"port":46227},"up":true}},{"node":{"info":{"id":"aba793e635f71169105ad073225cc8db914de6b711fe9f22c5d94ac8cb85e2eb","name":"node_aba793e635f71169105ad073225cc8db914de6b711fe9f22c5d94ac8cb85e2eb","enode":"enode://682bf60eaccc8c0ea6b95167841aee6e412a1d544017d3a9a894ed557cf576fb38146ddd775e94eedff062a3ef8030515beeea9982f8904c148790d6ff5ca40b@127.0.0.1:0","enr":"0xf88fb840ca36c7659c737b8ebbb2cf6ae6954a5dc378e4a3ba74cdf832186b307b46ab6942e82c3c7562eb653e7dc998e912f2a78935d1573fd6f2faa4e0366888622e0e0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103682bf60eaccc8c0ea6b95167841aee6e412a1d544017d3a9a894ed557cf576fb","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"q6eT5jX3EWkQWtBzIlzI25FN5rcR/p8ixdlKyMuF4us=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: aba793\npopulation: 25 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 73d0 772a 1385 | 68 55fd (0) 52b4 (0) 5008 (0) 51c2 (0)\n001 8 ee2b eceb fa9a f611 | 31 e06f (0) eb01 (0) ea3d (0) efd6 (0)\n002 2 8d3e 9472 | 9 8012 (0) 8284 (0) 836e (0) 8330 (0)\n003 7 b5fc b60e b9d9 bc29 | 14 b245 (0) b355 (0) b4e2 (0) b5fc (0)\n004 1 a192 | 1 a192 (0)\n005 2 acf8 aedc | 2 acf8 (0) aedc (0)\n============ DEPTH: 6 ==========================================\n006 2 a861 a9fa | 2 a861 (0) a9fa (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"aba793e635f71169105ad073225cc8db914de6b711fe9f22c5d94ac8cb85e2eb","private_key":"2fedc92f155f2df9c7680e003208e896d4afe676f8d42a34e9c052876a8eba05","name":"node_aba793e635f71169105ad073225cc8db914de6b711fe9f22c5d94ac8cb85e2eb","services":["streamer"],"enable_msg_events":true,"port":44069},"up":true}},{"node":{"info":{"id":"772a79302528fdce6a216c98c95e281333292c81dfe490aeaa4a78bfeb1980c8","name":"node_772a79302528fdce6a216c98c95e281333292c81dfe490aeaa4a78bfeb1980c8","enode":"enode://705fa39aa2e54e3cf627d29d6b986190ac5c50c3ef5702ebf41f048db0b691596ce6cf281898420112ed749a1dbeb4ad5160a62cb8cac2fc23aafc9eeeeaab54@127.0.0.1:0","enr":"0xf88fb8404f14a1ec789a7e2c007912c3209baae1e1b9bdb005a66efc25bcf1e48324aab522e9eddebd99b287bc2240719d578f848243a42d5e6ed9b0db297261eceb6fde0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102705fa39aa2e54e3cf627d29d6b986190ac5c50c3ef5702ebf41f048db0b69159","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"dyp5MCUo/c5qIWyYyV4oEzMpLIHf5JCuqkp4v+sZgMg=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 772a79\npopulation: 34 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 10 c2f9 c9ef ce01 f33c | 60 e06f (0) eb01 (0) ea3d (0) efd6 (0)\n001 4 3871 3590 221c 0639 | 30 3e19 (0) 3b83 (0) 3871 (0) 36d5 (0)\n002 8 5cc1 51c2 459b 4bc8 | 20 55fd (0) 52b4 (0) 5008 (0) 51c2 (0)\n003 4 6daa 6379 641a 6450 | 9 62f0 (0) 6379 (0) 672a (0) 64e6 (0)\n004 3 7bee 7bcb 7a68 | 3 7bee (0) 7bcb (0) 7a68 (0)\n005 3 72a7 72a5 73d0 | 3 73d0 (0) 72a5 (0) 72a7 (0)\n============ DEPTH: 6 ==========================================\n006 1 75e2 | 1 75e2 (0)\n007 0 | 0\n008 1 77ee | 1 77ee (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"772a79302528fdce6a216c98c95e281333292c81dfe490aeaa4a78bfeb1980c8","private_key":"20f8e29f129c023ce09631a3c2b173e7f73cf8040aa372de1eca8d2b5d6aa3f6","name":"node_772a79302528fdce6a216c98c95e281333292c81dfe490aeaa4a78bfeb1980c8","services":["streamer"],"enable_msg_events":true,"port":34307},"up":true}},{"node":{"info":{"id":"7a68fa44bbec187272e2d5dfbd6ed8af31a1a365aa72aa50db02350ebe98c859","name":"node_7a68fa44bbec187272e2d5dfbd6ed8af31a1a365aa72aa50db02350ebe98c859","enode":"enode://3c14067242581a41318e20b5bf461a2010c6163ce865664c0846d3c020ec076876b38593cb72579d5e5d1c5eda4182195bbacda4a6cd6f75246d0dac4b348f88@127.0.0.1:0","enr":"0xf88fb84015230ae1b2f1e7e93185930792b34197809d010451d124ef701f64630aec586a16d0a8cd37cdeaeef002bef58bd34243cf3c0a97216cb08ec2e4937ed48313b10183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1023c14067242581a41318e20b5bf461a2010c6163ce865664c0846d3c020ec0768","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"emj6RLvsGHJy4tXfvW7YrzGho2WqcqpQ2wI1Dr6YyFk=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 7a68fa\npopulation: 24 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 8284 9472 f33c deec | 60 e06f (0) ea3d (0) eb01 (0) efd6 (0)\n001 3 221c 0639 034d | 30 3e19 (0) 3b83 (0) 3871 (0) 36d5 (0)\n002 5 5cc1 459b 4a37 4cc2 | 20 55fd (0) 52b4 (0) 5008 (0) 51c2 (0)\n003 4 6daa 6379 641a 6450 | 9 62f0 (0) 6379 (0) 672a (0) 64e6 (0)\n004 6 72a5 72a7 73d0 75e2 | 6 73d0 (0) 72a5 (0) 72a7 (0) 75e2 (0)\n============ DEPTH: 5 ==========================================\n005 0 | 0\n006 0 | 0\n007 2 7bee 7bcb | 2 7bee (0) 7bcb (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"7a68fa44bbec187272e2d5dfbd6ed8af31a1a365aa72aa50db02350ebe98c859","private_key":"55bb3e30ef20d49d0cfe74562140bde2e178fe9c68c22a323aee1342c262a374","name":"node_7a68fa44bbec187272e2d5dfbd6ed8af31a1a365aa72aa50db02350ebe98c859","services":["streamer"],"enable_msg_events":true,"port":33619},"up":true}},{"node":{"info":{"id":"034de66774eda26b93e342c9b94b9deaeb6297650c819b144a5832bebfe6b02f","name":"node_034de66774eda26b93e342c9b94b9deaeb6297650c819b144a5832bebfe6b02f","enode":"enode://e6424d57236a8e78654448dbacf849545ea5f8d8963a1839bda9e7e2ed7b9f75235ce65da8cd8658f6907052e5ff7500aab3d5bf41e7ef55cf6a0c51d0531da1@127.0.0.1:0","enr":"0xf88fb84031fe742fa635670041f5fe96872983f924cd30e5949074833ecf42feafa3d792135e91a69af260875cb6b8e0b99148175b0570494dc64dfed550c4b594b2be780183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103e6424d57236a8e78654448dbacf849545ea5f8d8963a1839bda9e7e2ed7b9f75","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"A03mZ3TtomuT40LJuUud6util2UMgZsUSlgyvr/msC8=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 034de6\npopulation: 38 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 9 b355 be0f 8b35 957e | 60 e06f (0) eb01 (0) ea3d (0) efd6 (0)\n001 10 58a9 4d75 4cc2 6daa | 38 55fd (0) 52b4 (0) 5008 (0) 51c2 (0)\n002 9 2803 2dd4 27db 22bb | 17 3e19 (0) 3b83 (0) 3871 (0) 36d5 (0)\n003 3 1385 184e 1929 | 5 184e (0) 1929 (0) 1740 (0) 127c (0)\n004 4 0807 0a21 0e34 0f31 | 4 0e34 (0) 0f31 (0) 0807 (0) 0a21 (0)\n005 1 0639 | 1 0639 (0)\n============ DEPTH: 6 ==========================================\n006 1 01a6 | 1 01a6 (0)\n007 0 | 0\n008 1 03eb | 1 03eb (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"034de66774eda26b93e342c9b94b9deaeb6297650c819b144a5832bebfe6b02f","private_key":"85899df9a7c186468ac564ef2a386b2657c6d63c3f0751f128882d292dbda09a","name":"node_034de66774eda26b93e342c9b94b9deaeb6297650c819b144a5832bebfe6b02f","services":["streamer"],"enable_msg_events":true,"port":37491},"up":true}},{"node":{"info":{"id":"72a76f668d9b923914860eb4f8577bc98c153f6dd222cd36a0bbdef2bab7f068","name":"node_72a76f668d9b923914860eb4f8577bc98c153f6dd222cd36a0bbdef2bab7f068","enode":"enode://f0232c32322d105dcc559017d690018c44958df27f400c2da47688421eb9446788c84dc8f1295f282f2af16f62dcb6cc6e25d06c58031bbe1179d859904b568a@127.0.0.1:0","enr":"0xf88fb840d8f5c3b3a865e6fb673db1e14223e95eebbf821ed0ebedb85ca36ed6d7b8e8b810af20b72f1321af49040b9636f9f653b88821f970089c882da2faf5ae94cb590183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102f0232c32322d105dcc559017d690018c44958df27f400c2da47688421eb94467","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"cqdvZo2bkjkUhg60+Fd7yYwVP23SIs02oLve8rq38Gg=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 72a76f\npopulation: 37 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 11 d125 c52a ce01 c9ef | 60 e06f (0) ea3d (0) eb01 (0) ee2b (0)\n001 4 3e19 0a21 03eb 034d | 30 3e19 (0) 3b83 (0) 3871 (0) 36d5 (0)\n002 8 459b 4bc8 4a37 4cc2 | 20 55fd (0) 52b4 (0) 5008 (0) 51c2 (0)\n003 6 6daa 62f0 6379 672a | 9 62f0 (0) 6379 (0) 672a (0) 64e6 (0)\n004 3 7a68 7bee 7bcb | 3 7bee (0) 7bcb (0) 7a68 (0)\n005 3 75e2 772a 77ee | 3 75e2 (0) 77ee (0) 772a (0)\n============ DEPTH: 6 ==========================================\n006 0 | 0\n007 1 73d0 | 1 73d0 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 1 72a5 | 1 72a5 (0)\n015 0 | 0\n========================================================================="}},"config":{"id":"72a76f668d9b923914860eb4f8577bc98c153f6dd222cd36a0bbdef2bab7f068","private_key":"2dbcb1f5dc3a4230a4b221acbcb0ddd1e7178bd47ef73c82eed7ffecc7740e8f","name":"node_72a76f668d9b923914860eb4f8577bc98c153f6dd222cd36a0bbdef2bab7f068","services":["streamer"],"enable_msg_events":true,"port":36137},"up":true}},{"node":{"info":{"id":"bd486e1e15df4c7539b1ad5b54f7566dd4836a430e9f7d3503881fa79e258d9b","name":"node_bd486e1e15df4c7539b1ad5b54f7566dd4836a430e9f7d3503881fa79e258d9b","enode":"enode://d1614db3ef30a1d4e4082531616f3fe131a586eacc407b1d4041e9714d0dc98600467eaa2d408b5686dbb3cace24919099715a04a8e829bc0a0eac80f3d8fda5@127.0.0.1:0","enr":"0xf88fb8409b8ce0903002c146be1f872e039e3a98a5226c19fa7fab111327cc0f7d31fa6f0abde0b02ff8f05e228e94511987c311a2c0a577eb3196f305e3a5ed95b97bc60183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103d1614db3ef30a1d4e4082531616f3fe131a586eacc407b1d4041e9714d0dc986","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"vUhuHhXfTHU5sa1bVPdWbdSDakMOn301A4gfp54ljZs=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: bd486e\npopulation: 27 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 55fd 4c21 73d0 72a7 | 68 3e19 (0) 3871 (0) 3b83 (0) 36d5 (0)\n001 2 f177 deec | 31 e06f (0) eb01 (0) ea3d (0) ee2b (0)\n002 4 9472 8b35 8d3e 8fb8 | 9 8012 (0) 836e (0) 8330 (0) 8284 (0)\n003 5 a861 a9fa aba7 acf8 | 6 a192 (0) acf8 (0) aedc (0) a861 (0)\n004 4 b355 b60e b4e2 b5fc | 5 b355 (0) b245 (0) b4e2 (0) b5fc (0)\n005 2 b869 b9d9 | 2 b869 (0) b9d9 (0)\n006 1 be0f | 1 be0f (0)\n007 2 bc71 bc29 | 2 bc71 (0) bc29 (0)\n============ DEPTH: 8 ==========================================\n008 3 bd96 bde9 bddb | 3 bd96 (0) bde9 (0) bddb (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"bd486e1e15df4c7539b1ad5b54f7566dd4836a430e9f7d3503881fa79e258d9b","private_key":"7caa80d81addc9906ff055f89b4f28d67c666b90d9fd0030cf4a4a9e2372f478","name":"node_bd486e1e15df4c7539b1ad5b54f7566dd4836a430e9f7d3503881fa79e258d9b","services":["streamer"],"enable_msg_events":true,"port":45371},"up":true}},{"node":{"info":{"id":"4c211c117e555c2ac831d5688615b6b4c5e31f1d7c7906b34f0cbcdbc45482b4","name":"node_4c211c117e555c2ac831d5688615b6b4c5e31f1d7c7906b34f0cbcdbc45482b4","enode":"enode://6fbec307bce183850f96a0e0401fe05f26abb60c34295c692aecaaf353766314ccece95987b85ab3cf2c43c4fc8090823c86539f548ba5727d9030c99f049180@127.0.0.1:0","enr":"0xf88fb840a324b4bf2450128b22b8e99d9e7863140c8d4deab6e51d53891a5eab787249f45bbd942c8a73aa78acd0d87997764ddee5241040c712f0633281cbc5bb2dca790183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1026fbec307bce183850f96a0e0401fe05f26abb60c34295c692aecaaf353766314","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"TCEcEX5VXCrIMdVohhW2tMXjHx18eQazTwy828RUgrQ=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 4c211c\npopulation: 23 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 deec 8fb8 bd48 | 60 e06f (0) ea3d (0) eb01 (0) ee2b (0)\n001 3 1385 216e 21dc | 30 184e (0) 1929 (0) 1740 (0) 127c (0)\n002 3 772a 7a68 6450 | 18 7bee (0) 7bcb (0) 7a68 (0) 75e2 (0)\n003 6 5cc1 58a9 5be6 55fd | 9 55fd (0) 52b4 (0) 5008 (0) 51c2 (0)\n004 3 4775 4746 459b | 4 4775 (0) 4746 (0) 4589 (0) 459b (0)\n005 2 4bc8 4a37 | 3 4a3c (0) 4a37 (0) 4bc8 (0)\n006 1 4efa | 1 4efa (0)\n============ DEPTH: 7 ==========================================\n007 1 4d75 | 1 4d75 (0)\n008 1 4cc2 | 1 4cc2 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"4c211c117e555c2ac831d5688615b6b4c5e31f1d7c7906b34f0cbcdbc45482b4","private_key":"7534963388dc983ea5464538eec56a62b0acd0fc995c8549f2679755d385c2e8","name":"node_4c211c117e555c2ac831d5688615b6b4c5e31f1d7c7906b34f0cbcdbc45482b4","services":["streamer"],"enable_msg_events":true,"port":45341},"up":true}},{"node":{"info":{"id":"21dcfb893a54cb56d21355fc564583057fc51b32503a8627e7575660725a7627","name":"node_21dcfb893a54cb56d21355fc564583057fc51b32503a8627e7575660725a7627","enode":"enode://88a1d0469479ab5a39001ece4f2c99ead3dc557053ca176ac22316ff7ed86ae4388683a54c38ba0f1bd78859cce8e650171fff2fa49006461c4c0d3ccff806fa@127.0.0.1:0","enr":"0xf88fb84056e42be02ea67947908fe9561498acbc10dddbec310fabfefb996e2eea72b4572e347aa61c0cab4658f9d6e382d08411d5da74a9f076c5a9f9d79e4242a9678e0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10288a1d0469479ab5a39001ece4f2c99ead3dc557053ca176ac22316ff7ed86ae4","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"Idz7iTpUy1bSE1X8VkWDBX/FGzJQOoYn51dWYHJadic=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 21dcfb\npopulation: 24 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 deec f177 | 60 e06f (0) eb01 (0) ea3d (0) efd6 (0)\n001 4 6daa 5cc1 4d75 4c21 | 38 7bee (0) 7bcb (0) 7a68 (0) 75e2 (0)\n002 4 01a6 034d 1929 1385 | 13 184e (0) 1929 (0) 1740 (0) 127c (0)\n003 5 3871 3b83 3590 36d5 | 6 3e19 (0) 3b83 (0) 3871 (0) 36d5 (0)\n004 2 2dd4 2803 | 3 2803 (0) 2d53 (0) 2dd4 (0)\n005 3 2471 27b5 27db | 3 2471 (0) 27b5 (0) 27db (0)\n============ DEPTH: 6 ==========================================\n006 3 2354 221c 22bb | 3 2354 (0) 22bb (0) 221c (0)\n007 0 | 0\n008 1 216e | 1 216e (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"21dcfb893a54cb56d21355fc564583057fc51b32503a8627e7575660725a7627","private_key":"f08efc99ef01728ff510e5f92b7180a1367519e8326761e78161233efa455123","name":"node_21dcfb893a54cb56d21355fc564583057fc51b32503a8627e7575660725a7627","services":["streamer"],"enable_msg_events":true,"port":42527},"up":true}},{"node":{"info":{"id":"6daaf515999c9a3491c963f76be82ed6005616bf7ba98247b01d6a89a9af1d71","name":"node_6daaf515999c9a3491c963f76be82ed6005616bf7ba98247b01d6a89a9af1d71","enode":"enode://9a9ce2e0b9a084ec93e5bf364d61450a6f630e3fcaf89692e6c084ef927d2c6acb1d0f5c3f0df97fd53807055774ed027dff214b337e644f766673ee959d6691@127.0.0.1:0","enr":"0xf88fb84044d9d55ee6ab6484a0a3ddabbc5227af358b46ebb1f61eb0155d882e31e9cd2010a81e6d888667b79f2121cd96793570539b6ec00410f3e171a61bef9431fb480183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1039a9ce2e0b9a084ec93e5bf364d61450a6f630e3fcaf89692e6c084ef927d2c6a","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"bar1FZmcmjSRyWP3a+gu1gBWFr97qYJHsB1qiamvHXE=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 6daaf5\npopulation: 31 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 b60e f177 deec | 60 cabf (0) c9ef (0) cc9f (0) cc5f (0)\n001 9 0f31 0639 034d 1385 | 30 184e (0) 1929 (0) 1740 (0) 127c (0)\n002 4 459b 55fd 58a9 5cc1 | 20 4775 (0) 4746 (0) 4589 (0) 459b (0)\n003 8 7a68 7bee 7bcb 75e2 | 9 7bee (0) 7bcb (0) 7a68 (0) 75e2 (0)\n004 5 6379 62f0 672a 6450 | 6 62f0 (0) 6379 (0) 672a (0) 64e6 (0)\n============ DEPTH: 5 ==========================================\n005 2 6975 68a6 | 2 68a6 (0) 6975 (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"6daaf515999c9a3491c963f76be82ed6005616bf7ba98247b01d6a89a9af1d71","private_key":"cddadd9acb99e1d405844e54f8c99b3b8971ab5210eafaba25db3fe4f8fcd91d","name":"node_6daaf515999c9a3491c963f76be82ed6005616bf7ba98247b01d6a89a9af1d71","services":["streamer"],"enable_msg_events":true,"port":44965},"up":true}},{"node":{"info":{"id":"5cc1c28eafd9758e807a28159a1a7a6ea313fa7e878fde5d47fcc8f5a5c25172","name":"node_5cc1c28eafd9758e807a28159a1a7a6ea313fa7e878fde5d47fcc8f5a5c25172","enode":"enode://c734583d55ba85edc61b6e6737e43bce10a56dba57f05d4fc8bd3ade2e47a0eefabac7e83bda748a41c8b90a8a4bd965aa9da73b25b50b2ae9b57dfdd330ae7a@127.0.0.1:0","enr":"0xf88fb8403795468f0460cb1e3426dae834bdf0a6407814c00628447ad37ea9cdd7ad51535c32b9ef97d29a71a3958d034f6a01527a5b2c6230934e8f27c513f758b3d58e0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102c734583d55ba85edc61b6e6737e43bce10a56dba57f05d4fc8bd3ade2e47a0ee","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"XMHCjq/ZdY6AeigVmhp6bqMT+n6Hj95dR/zI9aXCUXI=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 5cc1c2\npopulation: 30 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 8fb8 ce01 deec f177 | 60 c0ad (0) c2f9 (0) c52a (0) cabf (0)\n001 7 3871 3b83 27db 216e | 30 2803 (0) 2d53 (0) 2dd4 (0) 2354 (0)\n002 7 72a7 73d0 772a 7a68 | 18 7bee (0) 7bcb (0) 7a68 (0) 75e2 (0)\n003 4 4a37 4efa 4c21 4cc2 | 11 4775 (0) 4746 (0) 4589 (0) 459b (0)\n004 4 51c2 5008 52b4 55fd | 4 55fd (0) 52b4 (0) 5008 (0) 51c2 (0)\n============ DEPTH: 5 ==========================================\n005 3 58a9 5a8b 5be6 | 3 58a9 (0) 5a8b (0) 5be6 (0)\n006 0 | 0\n007 0 | 0\n008 1 5c62 | 1 5c62 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"5cc1c28eafd9758e807a28159a1a7a6ea313fa7e878fde5d47fcc8f5a5c25172","private_key":"e9b5e89040faaac07a9024be985c1b6a79cda66a0910b7a2ffa0a5c78b9afe61","name":"node_5cc1c28eafd9758e807a28159a1a7a6ea313fa7e878fde5d47fcc8f5a5c25172","services":["streamer"],"enable_msg_events":true,"port":45281},"up":true}},{"node":{"info":{"id":"4cc2386a86fd210bf699c6d93173b0879c3210d46f572a62bb154cb60a7d2cb1","name":"node_4cc2386a86fd210bf699c6d93173b0879c3210d46f572a62bb154cb60a7d2cb1","enode":"enode://d7ef3fd82861a99d09be17b9ed57768a386d22fbde25e097e376cb18f34b8b8e0bee1e3478fbd5fe0910f2306d0b0fa4df665e27e5a12611abc392c179d239e9@127.0.0.1:0","enr":"0xf88fb840289078a8d405c68188e3f1a163789ae0179de25d0af8223e4979d2ae17c304985bc8f4d436fab339c12b3f5ef00c5a2fda52f8622285df4f76335f4402dcf9170183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103d7ef3fd82861a99d09be17b9ed57768a386d22fbde25e097e376cb18f34b8b8e","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"TMI4aob9IQv2mcbZMXOwh5wyENRvVypiuxVMtgp9LLE=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 4cc238\npopulation: 23 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 c9ef c2f9 c52a 9472 | 60 c0ad (0) c2f9 (0) c52a (0) cabf (0)\n001 2 1385 034d | 30 184e (0) 1929 (0) 1740 (0) 127c (0)\n002 7 6450 6379 72a7 73d0 | 18 7bee (0) 7bcb (0) 7a68 (0) 75e2 (0)\n003 3 51c2 55fd 5cc1 | 9 55fd (0) 52b4 (0) 5008 (0) 51c2 (0)\n004 2 4746 459b | 4 4775 (0) 4746 (0) 4589 (0) 459b (0)\n005 2 4bc8 4a37 | 3 4bc8 (0) 4a3c (0) 4a37 (0)\n006 1 4efa | 1 4efa (0)\n============ DEPTH: 7 ==========================================\n007 1 4d75 | 1 4d75 (0)\n008 1 4c21 | 1 4c21 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"4cc2386a86fd210bf699c6d93173b0879c3210d46f572a62bb154cb60a7d2cb1","private_key":"ab042a555a4b63b145f4de3bbfccdf1f9b84b6cb627f349b61aa1180b6fe933f","name":"node_4cc2386a86fd210bf699c6d93173b0879c3210d46f572a62bb154cb60a7d2cb1","services":["streamer"],"enable_msg_events":true,"port":36183},"up":true}},{"node":{"info":{"id":"947205fd85a17330a6d5c51a66548c5f69779c76ab12408f8fc6d33d7c6b8e9d","name":"node_947205fd85a17330a6d5c51a66548c5f69779c76ab12408f8fc6d33d7c6b8e9d","enode":"enode://3ca90095f93c4f83cffc3cf6da5e155328580ae3f82119872f3088143f19bcc006916f2dddcf8f4325de936f67e88f96446e448c4a59def92228dfade44c5901@127.0.0.1:0","enr":"0xf88fb84036ea2f3f5156386eb2d22329ca9cb82df354d2411a505c41eb3cd0455f9f4e706903cbbe26ecebe77942a1650c5475a289f05cbeaca4a648322982b30b84a2a60183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1033ca90095f93c4f83cffc3cf6da5e155328580ae3f82119872f3088143f19bcc0","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"lHIF/YWhczCm1cUaZlSMX2l3nHarEkCPj8bTPXxrjp0=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 947205\npopulation: 33 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 7 034d 5be6 4cc2 73d0 | 68 184e (0) 1929 (0) 1740 (0) 127c (0)\n001 6 c0ad ce01 d18a deec | 31 c2f9 (0) c0ad (0) c52a (0) c9ef (0)\n002 12 b60e b5fc b4e2 be0f | 20 a192 (0) acf8 (0) aedc (0) aba7 (0)\n============ DEPTH: 3 ==========================================\n003 7 8fb8 8d3e 8b35 8012 | 7 8012 (0) 836e (0) 8330 (0) 8284 (0)\n004 0 | 0\n005 0 | 0\n006 0 | 0\n007 1 957e | 1 957e (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"947205fd85a17330a6d5c51a66548c5f69779c76ab12408f8fc6d33d7c6b8e9d","private_key":"eaf46b142d5bbbd82ca1980c2bf40b52e6c63c995e5e99fb80517e644adea556","name":"node_947205fd85a17330a6d5c51a66548c5f69779c76ab12408f8fc6d33d7c6b8e9d","services":["streamer"],"enable_msg_events":true,"port":33771},"up":true}},{"node":{"info":{"id":"641a165f8be0eee36f53c12bae8e2a34a709adb8d1dcd667e88e4e90c9ee2401","name":"node_641a165f8be0eee36f53c12bae8e2a34a709adb8d1dcd667e88e4e90c9ee2401","enode":"enode://97de2f10991b84b4170cadcc248b4222bd846e91b5212930b3a721cb99af24894df3ba5ba33a7b6cc18dd6cbfba935526b69cb0a5e6b93dec26a696f32c580ea@127.0.0.1:0","enr":"0xf88fb840dd1c643add167311c80939c5d5ff43fac27e87b7bff2726cb3d5e156638744383d3370833f2730acccd609cd6d0813ed5993951c83b59cc7b51fe835f7a457d10183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10297de2f10991b84b4170cadcc248b4222bd846e91b5212930b3a721cb99af2489","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"ZBoWX4vg7uNvU8Erro4qNKcJrbjR3NZn6I5OkMnuJAE=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 641a16\npopulation: 29 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 9 ed12 f611 ce01 c52a | 60 d23c (0) d125 (0) d18a (0) d9d3 (0)\n001 2 1929 034d | 30 1740 (0) 127c (0) 1385 (0) 184e (0)\n002 4 4bc8 459b 58a9 51c2 | 20 5c62 (0) 5cc1 (0) 58a9 (0) 5a8b (0)\n003 6 75e2 772a 77ee 72a7 | 9 75e2 (0) 77ee (0) 772a (0) 73d0 (0)\n004 3 6975 68a6 6daa | 3 6975 (0) 68a6 (0) 6daa (0)\n005 2 62f0 6379 | 2 62f0 (0) 6379 (0)\n006 1 672a | 1 672a (0)\n============ DEPTH: 7 ==========================================\n007 0 | 0\n008 1 64e6 | 1 64e6 (0)\n009 1 6450 | 1 6450 (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"641a165f8be0eee36f53c12bae8e2a34a709adb8d1dcd667e88e4e90c9ee2401","private_key":"f38953abdf59b216747d7c22e600d0f55aa03853782359e4f1d890ee6ccd3795","name":"node_641a165f8be0eee36f53c12bae8e2a34a709adb8d1dcd667e88e4e90c9ee2401","services":["streamer"],"enable_msg_events":true,"port":45833},"up":true}},{"node":{"info":{"id":"51c285489ff14628268ae886945e1cd2da64c6a0a8cb184aada98567ab429b6e","name":"node_51c285489ff14628268ae886945e1cd2da64c6a0a8cb184aada98567ab429b6e","enode":"enode://19c4efcab79f59b42b632f546d5075b30aebe0cf70b190e194aa53b3cb07a57e054266625288519f7f1ec51933e8a173ee31de9ae1c3ed7a3e52e881e1320bc2@127.0.0.1:0","enr":"0xf88fb840a924d32fa5c0500800c3babdaeff831b1c13855d864a74e91f06b59765c5112f7d5587255be9743f22305b6b734594f50af53545f49998d89400accb44da1a7c0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10219c4efcab79f59b42b632f546d5075b30aebe0cf70b190e194aa53b3cb07a57e","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"UcKFSJ/xRigmiuiGlF4c0tpkxqCoyxhKramFZ6tCm24=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 51c285\npopulation: 27 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 ce01 8fb8 957e bddb | 60 a192 (0) acf8 (0) aedc (0) aba7 (0)\n001 3 1385 1929 3590 | 30 1740 (0) 127c (0) 1385 (0) 184e (0)\n002 5 7bee 772a 72a7 6379 | 18 75e2 (0) 77ee (0) 772a (0) 73d0 (0)\n003 7 4746 4efa 4d75 4cc2 | 11 4589 (0) 459b (0) 4775 (0) 4746 (0)\n004 4 5cc1 5c62 58a9 5be6 | 5 5c62 (0) 5cc1 (0) 58a9 (0) 5a8b (0)\n005 1 55fd | 1 55fd (0)\n============ DEPTH: 6 ==========================================\n006 1 52b4 | 1 52b4 (0)\n007 1 5008 | 1 5008 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"51c285489ff14628268ae886945e1cd2da64c6a0a8cb184aada98567ab429b6e","private_key":"21aeef42b1bca1386305b8a2618ef22c9d57c0a69e14dacf5e9b23b4bd23b510","name":"node_51c285489ff14628268ae886945e1cd2da64c6a0a8cb184aada98567ab429b6e","services":["streamer"],"enable_msg_events":true,"port":34421},"up":true}},{"node":{"info":{"id":"3590afcd10fb8f58c39f72068661d9a772b77e0efd57bbd60306632fb048fa3a","name":"node_3590afcd10fb8f58c39f72068661d9a772b77e0efd57bbd60306632fb048fa3a","enode":"enode://dd24910cfba19349898ab2b4cf2312f77e8c9cbaecebe966a4a599e93acd4ab317c4f64219c14c87eff8676c5f7fba8c5077c9bab707839809585cf3c19e6128@127.0.0.1:0","enr":"0xf88fb8402ed923c581464c45b4e676ff07c79106b7ceff7a57d96353d044e4d884c8a90116f8ec71e379e0311d071f53601855786da347a3d69d1aae9b1d3a07292ecd090183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102dd24910cfba19349898ab2b4cf2312f77e8c9cbaecebe966a4a599e93acd4ab3","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"NZCvzRD7j1jDn3IGhmHZp3K3fg79V7vWAwZjL7BI+jo=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 3590af\npopulation: 27 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 8b35 957e a9fa bddb | 60 a192 (0) acf8 (0) aedc (0) aba7 (0)\n001 7 7bcb 7bee 772a 6379 | 38 75e2 (0) 77ee (0) 772a (0) 73d0 (0)\n002 4 0639 034d 1385 1929 | 13 1740 (0) 127c (0) 1385 (0) 184e (0)\n003 6 2dd4 2803 221c 216e | 11 2dd4 (0) 2d53 (0) 2803 (0) 2354 (0)\n004 3 3e19 3871 3b83 | 3 3e19 (0) 3b83 (0) 3871 (0)\n============ DEPTH: 5 ==========================================\n005 0 | 0\n006 2 36d5 3775 | 2 36d5 (0) 3775 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"3590afcd10fb8f58c39f72068661d9a772b77e0efd57bbd60306632fb048fa3a","private_key":"1835770333937be27e295723616d36666fa8de13a77c315e3b4697160def434c","name":"node_3590afcd10fb8f58c39f72068661d9a772b77e0efd57bbd60306632fb048fa3a","services":["streamer"],"enable_msg_events":true,"port":32919},"up":true}},{"node":{"info":{"id":"6450bb5e880411abcb60258d8560949f6f70d92ba7bfa9a4d7845463c48dab30","name":"node_6450bb5e880411abcb60258d8560949f6f70d92ba7bfa9a4d7845463c48dab30","enode":"enode://6d3336dba794e0658e4fcbecdb6aa6751876ce7d97023c4c68f1c6cf7fa19f6df34069acfdbbd0df6374dad95a86536fa70adefe67496703bc6cc0ca00bc0d6b@127.0.0.1:0","enr":"0xf88fb840a5c366f1069400f50edc7a3dcf5ced0b5f36fc8ac4add80658a7ae4e069e242d0e234a304d1f3f0906667c9331ecc0ea06215873ca2359615ea2539b09849b710183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1036d3336dba794e0658e4fcbecdb6aa6751876ce7d97023c4c68f1c6cf7fa19f6d","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"ZFC7XogEEavLYCWNhWCUn29w2Sunv6mk14RUY8SNqzA=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 6450bb\npopulation: 37 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 7 b355 b4e2 b5fc a9fa | 60 a192 (0) acf8 (0) aedc (0) aba7 (0)\n001 9 1929 1385 0f31 01a6 | 30 0a21 (0) 0807 (0) 0e34 (0) 0f31 (0)\n002 6 58a9 459b 4bc8 4d75 | 20 4746 (0) 4775 (0) 4589 (0) 459b (0)\n003 7 75e2 77ee 772a 73d0 | 9 75e2 (0) 77ee (0) 772a (0) 73d0 (0)\n004 3 6daa 68a6 6975 | 3 68a6 (0) 6975 (0) 6daa (0)\n005 2 62f0 6379 | 2 62f0 (0) 6379 (0)\n006 1 672a | 1 672a (0)\n============ DEPTH: 7 ==========================================\n007 0 | 0\n008 1 64e6 | 1 64e6 (0)\n009 1 641a | 1 641a (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"6450bb5e880411abcb60258d8560949f6f70d92ba7bfa9a4d7845463c48dab30","private_key":"d9d71e00271234db6e058d9dd56ff836e602ba475c91f715471e599e1bed5a5c","name":"node_6450bb5e880411abcb60258d8560949f6f70d92ba7bfa9a4d7845463c48dab30","services":["streamer"],"enable_msg_events":true,"port":40239},"up":true}},{"node":{"info":{"id":"f177ee6767a78a57b725dbe67ec377f507f5777d345a28892b0fbfb800dc443a","name":"node_f177ee6767a78a57b725dbe67ec377f507f5777d345a28892b0fbfb800dc443a","enode":"enode://29ba5c4d8b75150f0c292d475cbafdcad1c6083b68404ea2c937aff1d74a2c8a718c535eaa698de476e4023d6a8dff115d7a6a18d4ef2df8919f5c0af5369179@127.0.0.1:0","enr":"0xf88fb840c816b422b2f4e87c16b25211009de1d65a9e678d98a60bf481a498341d8bf07f11c27a00cac462bf811b306a3b6f7178df60428c1069862f6eba19f0827d7e8c0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10329ba5c4d8b75150f0c292d475cbafdcad1c6083b68404ea2c937aff1d74a2c8a","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"8XfuZ2enile3JdvmfsN39Qf1d300WiiJKw+/uADcRDo=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: f177ee\npopulation: 35 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 11 3775 27db 21dc 5cc1 | 68 0807 (0) 0a21 (0) 0f31 (0) 0e34 (0)\n001 5 aba7 be0f bd48 bddb | 29 a192 (0) acf8 (0) aedc (0) aba7 (0)\n002 6 c52a cc5f ce01 deec | 14 d9d3 (0) dd92 (0) deec (0) d23c (0)\n003 5 eceb ed12 ed2e ea3d | 8 e06f (0) eb01 (0) ea3d (0) efd6 (0)\n004 3 fa9a fac8 fa65 | 3 fa65 (0) fa9a (0) fac8 (0)\n005 2 f611 f4a0 | 2 f4a0 (0) f611 (0)\n============ DEPTH: 6 ==========================================\n006 2 f3d5 f33c | 2 f33c (0) f3d5 (0)\n007 1 f005 | 1 f005 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"f177ee6767a78a57b725dbe67ec377f507f5777d345a28892b0fbfb800dc443a","private_key":"025f98a103e82b260c7f1e0786cc7c7b322ecac23e4bf433a8c3b6ca3c0a7ce1","name":"node_f177ee6767a78a57b725dbe67ec377f507f5777d345a28892b0fbfb800dc443a","services":["streamer"],"enable_msg_events":true,"port":40657},"up":true}},{"node":{"info":{"id":"5be6df23201fc5c00be650849c8bfe5581e44033ef19012836f97c98f3954471","name":"node_5be6df23201fc5c00be650849c8bfe5581e44033ef19012836f97c98f3954471","enode":"enode://0411dc978683dba8f21f9b8342e621825888fc4937c3657235a2544564af2cf596f918e981af49789225b6548f0476ddcb2c478c561a7ccf2de5cf175b2bd667@127.0.0.1:0","enr":"0xf88fb8402bd016128d16428094936d2baa4cea722a02b856589d60f027fb7ea3cf0d2d312ea4efc1fb1cc49b83d8d28e225fc859c87d2d63e94977820e53d6c4793e95850183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1030411dc978683dba8f21f9b8342e621825888fc4937c3657235a2544564af2cf5","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"W+bfIyAfxcAL5lCEnIv+VYHkQDPvGQEoNvl8mPOVRHE=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 5be6df\npopulation: 29 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 13 957e 9472 bc29 bddb | 60 a192 (0) acf8 (0) aedc (0) aba7 (0)\n001 3 0639 1385 3775 | 30 0a21 (0) 0807 (0) 0f31 (0) 0e34 (0)\n002 2 72a7 7bcb | 18 75e2 (0) 77ee (0) 772a (0) 73d0 (0)\n003 4 4a37 4efa 4c21 4d75 | 11 4775 (0) 4746 (0) 459b (0) 4589 (0)\n004 3 55fd 52b4 51c2 | 4 55fd (0) 52b4 (0) 5008 (0) 51c2 (0)\n005 2 5c62 5cc1 | 2 5c62 (0) 5cc1 (0)\n============ DEPTH: 6 ==========================================\n006 1 58a9 | 1 58a9 (0)\n007 1 5a8b | 1 5a8b (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"5be6df23201fc5c00be650849c8bfe5581e44033ef19012836f97c98f3954471","private_key":"b70a8c0d588327194e8b81c1f09b2403aa37aa56914bbfd6ef7e9b7c383a61f7","name":"node_5be6df23201fc5c00be650849c8bfe5581e44033ef19012836f97c98f3954471","services":["streamer"],"enable_msg_events":true,"port":39601},"up":true}},{"node":{"info":{"id":"37751f279493dc5ce5b5c3c55a6ec2e4119eedefe1069b283f6ff8c7bc9d1411","name":"node_37751f279493dc5ce5b5c3c55a6ec2e4119eedefe1069b283f6ff8c7bc9d1411","enode":"enode://9a0c7c70a6abc8d8d6312e26526241fbaac88e2599c2e8ddc70a0d82155c8a19e306a320af2a0b0ba2a91333c804b1d9aaf1ff34059e1560391b141ec0195be3@127.0.0.1:0","enr":"0xf88fb840299e881f43f4d0b0fc892936f7f58feda81693023bf5890163c50e85520efc40047960a98b178845a87a28261d6fd072ea58cc313c5caa59e80ba89e01ca917c0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1039a0c7c70a6abc8d8d6312e26526241fbaac88e2599c2e8ddc70a0d82155c8a19","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"N3UfJ5ST3FzltcPFWm7C5BGe7e/hBpsoP2/4x7ydFBE=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 37751f\npopulation: 31 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 9 ed2e fac8 f611 f177 | 60 fa65 (0) fa9a (0) fac8 (0) f4a0 (0)\n001 6 6daa 7bcb 7bee 4d75 | 38 6975 (0) 68a6 (0) 6daa (0) 62f0 (0)\n002 5 0639 034d 1385 184e | 13 0e34 (0) 0f31 (0) 0807 (0) 0a21 (0)\n003 6 2803 2dd4 27db 221c | 11 2dd4 (0) 2d53 (0) 2803 (0) 2354 (0)\n004 3 3e19 3871 3b83 | 3 3e19 (0) 3b83 (0) 3871 (0)\n============ DEPTH: 5 ==========================================\n005 0 | 0\n006 1 3590 | 1 3590 (0)\n007 1 36d5 | 1 36d5 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"37751f279493dc5ce5b5c3c55a6ec2e4119eedefe1069b283f6ff8c7bc9d1411","private_key":"bbe213c9c2af2fb4cf312a148364ca68ebecd37b64368e153ea9e51c67042ad5","name":"node_37751f279493dc5ce5b5c3c55a6ec2e4119eedefe1069b283f6ff8c7bc9d1411","services":["streamer"],"enable_msg_events":true,"port":35275},"up":true}},{"node":{"info":{"id":"8fb8208b7167dd06cc08778b507ccd856751d3df6dfbaeac18b9f527b6628523","name":"node_8fb8208b7167dd06cc08778b507ccd856751d3df6dfbaeac18b9f527b6628523","enode":"enode://d73cda92a018755888f77a3e564e7551c42f9b0293dce5f7926ad51f152e0608a98f76043b29a2ccee8b56829e6abb11f11bcc8f37138dcff09a22e9883b5da0@127.0.0.1:0","enr":"0xf88fb8406aaa1bd0ce40aedb00ca17a8b54f37666e5fda8c5fd73f70cb28d4f94789bbdd28ccfa1a85414025663af2b020c3b3d80b719d4163d059196efeb1c35caf0e8a0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102d73cda92a018755888f77a3e564e7551c42f9b0293dce5f7926ad51f152e0608","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"j7ggi3Fn3QbMCHeLUHzNhWdR099t+66sGLn1J7ZihSM=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 8fb820\npopulation: 29 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 9 51c2 5cc1 5c62 4efa | 68 4589 (0) 459b (0) 4746 (0) 4775 (0)\n001 5 f005 f611 ed12 d18a | 31 fa9a (0) fac8 (0) fa65 (0) f4a0 (0)\n002 7 b4e2 bc71 bc29 bde9 | 20 a192 (0) acf8 (0) aedc (0) aba7 (0)\n003 2 9472 957e | 2 9472 (0) 957e (0)\n004 4 8012 836e 8330 8284 | 4 8012 (0) 8330 (0) 836e (0) 8284 (0)\n============ DEPTH: 5 ==========================================\n005 1 8b35 | 1 8b35 (0)\n006 1 8d3e | 1 8d3e (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"8fb8208b7167dd06cc08778b507ccd856751d3df6dfbaeac18b9f527b6628523","private_key":"278f3a6445da6b4d5dace451a1c2a3561bdef9784b8326ca0bcae3a8028ed69f","name":"node_8fb8208b7167dd06cc08778b507ccd856751d3df6dfbaeac18b9f527b6628523","services":["streamer"],"enable_msg_events":true,"port":36235},"up":true}},{"node":{"info":{"id":"8b35236da99930bf8f5ef6c7555bb18b80ce2e34361bbbfd6baf55a6483e54ff","name":"node_8b35236da99930bf8f5ef6c7555bb18b80ce2e34361bbbfd6baf55a6483e54ff","enode":"enode://5e607646d00042ef14c4f21aea45ea5bd505be570b97f2b1b4ef73a22adf25cde1a8964defec14140b92ef5121092f391b5f2dff5345edd747ebff330059a77f@127.0.0.1:0","enr":"0xf88fb8400a07d6729478c8bd73bee4a5c31564b940112b25c41614e61d55d98ef2e09178170274aae5097d373ef2e01384f6b60f630c75a3185e1254b5a02193b3a74aa90183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1035e607646d00042ef14c4f21aea45ea5bd505be570b97f2b1b4ef73a22adf25cd","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"izUjbamZML+PXvbHVVuxi4DOLjQ2G7v9a69Vpkg+VP8=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 8b3523\npopulation: 29 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 7 3590 3871 1929 1385 | 68 0807 (0) 0a21 (0) 0e34 (0) 0f31 (0)\n001 3 ed12 c0ad ce01 | 31 fa9a (0) fac8 (0) fa65 (0) f4a0 (0)\n002 11 aedc a9fa b60e b5fc | 20 a192 (0) aedc (0) acf8 (0) aba7 (0)\n003 2 957e 9472 | 2 9472 (0) 957e (0)\n004 4 8012 836e 8330 8284 | 4 8012 (0) 836e (0) 8330 (0) 8284 (0)\n============ DEPTH: 5 ==========================================\n005 2 8d3e 8fb8 | 2 8d3e (0) 8fb8 (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"8b35236da99930bf8f5ef6c7555bb18b80ce2e34361bbbfd6baf55a6483e54ff","private_key":"3322d061eb98b1819a131c74f1241090bf160874985ca4e58cc11e1286ac0c3a","name":"node_8b35236da99930bf8f5ef6c7555bb18b80ce2e34361bbbfd6baf55a6483e54ff","services":["streamer"],"enable_msg_events":true,"port":40641},"up":true}},{"node":{"info":{"id":"7bcb0d7b9f84aed413cf9b2a7851ba6d1138d85382aa20e6c939a43c8e59c034","name":"node_7bcb0d7b9f84aed413cf9b2a7851ba6d1138d85382aa20e6c939a43c8e59c034","enode":"enode://466c01046515dee738d0579e73a747c68ced8223155312c012c3f51c97298abc594772c6662ce7511bc515aac473d52bb9bbcf8e44b04576ed927cdcc214dab9@127.0.0.1:0","enr":"0xf88fb840fe0d278bd98464c794a3d0874a16b75432ba8b26f9011bfccc1461bc081260dc5b2fad42936698153126bd2792daec579d9481ecf3c53f7a9efaf80cb867b9240183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103466c01046515dee738d0579e73a747c68ced8223155312c012c3f51c97298abc","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"e8sNe5+ErtQTz5sqeFG6bRE42FOCqiDmyTmkPI5ZwDQ=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 7bcb0d\npopulation: 46 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 14 c52a ce01 d18a d125 | 60 fac8 (0) fa9a (0) fa65 (0) f4a0 (0)\n001 14 1929 127c 1385 034d | 30 0a21 (0) 0807 (0) 0e34 (0) 0f31 (0)\n002 6 4a37 4bc8 4efa 4cc2 | 20 459b (0) 4589 (0) 4775 (0) 4746 (0)\n003 4 6daa 672a 6450 641a | 9 6975 (0) 68a6 (0) 6daa (0) 672a (0)\n004 6 73d0 72a5 72a7 75e2 | 6 75e2 (0) 77ee (0) 772a (0) 73d0 (0)\n============ DEPTH: 5 ==========================================\n005 0 | 0\n006 0 | 0\n007 1 7a68 | 1 7a68 (0)\n008 0 | 0\n009 0 | 0\n010 1 7bee | 1 7bee (0)\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"7bcb0d7b9f84aed413cf9b2a7851ba6d1138d85382aa20e6c939a43c8e59c034","private_key":"a18a91aea9caebd371fccc6f16fbdbae7309ab0a75d82690d6762dfbf43e8237","name":"node_7bcb0d7b9f84aed413cf9b2a7851ba6d1138d85382aa20e6c939a43c8e59c034","services":["streamer"],"enable_msg_events":true,"port":34329},"up":true}},{"node":{"info":{"id":"27db66d13ee8168aca89786febd6971dd1d6c554bca8501052065cb47631560d","name":"node_27db66d13ee8168aca89786febd6971dd1d6c554bca8501052065cb47631560d","enode":"enode://81447592a9952d8e82cbde99d9a3a804c8251313e257587d4fd1441ccab4589209ef2eca6be2a90dd162a15afa8fa1c46112377c94317e710a692ebf3ecab3f5@127.0.0.1:0","enr":"0xf88fb84050691fa1ed8df80d90662ae933a8efbb5e3a89c1e11702c156c0c4d86c410f626a9409a01ad627a3bf48c1f787d9e70306cb6bc2068a36b1d5a6fb5c814b171b0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10381447592a9952d8e82cbde99d9a3a804c8251313e257587d4fd1441ccab45892","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"J9tm0T7oForKiXhv69aXHdHWxVS8qFAQUgZctHYxVg0=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 27db66\npopulation: 30 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 f611 f177 f33c 957e | 60 fa65 (0) fa9a (0) fac8 (0) f4a0 (0)\n001 6 4d75 4efa 4bc8 4a37 | 38 459b (0) 4589 (0) 4775 (0) 4746 (0)\n002 4 034d 0639 1385 1929 | 13 0807 (0) 0a21 (0) 0e34 (0) 0f31 (0)\n003 5 3871 3b83 3775 36d5 | 6 3e19 (0) 3b83 (0) 3871 (0) 3590 (0)\n004 3 2d53 2dd4 2803 | 3 2dd4 (0) 2d53 (0) 2803 (0)\n005 5 2354 22bb 221c 216e | 5 2354 (0) 22bb (0) 221c (0) 216e (0)\n============ DEPTH: 6 ==========================================\n006 1 2471 | 1 2471 (0)\n007 0 | 0\n008 0 | 0\n009 1 27b5 | 1 27b5 (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"27db66d13ee8168aca89786febd6971dd1d6c554bca8501052065cb47631560d","private_key":"0a5ec02539f87d3f1bbe5e084133ad7fc6656fcc73cc18afb174f48e0bf9d670","name":"node_27db66d13ee8168aca89786febd6971dd1d6c554bca8501052065cb47631560d","services":["streamer"],"enable_msg_events":true,"port":35267},"up":true}},{"node":{"info":{"id":"bc29a0d9b60f3e2c34224cec187cf44eadc4628086d5594666ed025da71e7e7a","name":"node_bc29a0d9b60f3e2c34224cec187cf44eadc4628086d5594666ed025da71e7e7a","enode":"enode://838a4d55191548d17c665566c483b72340302b64549e2745f5e0d48c4e0e76359349919ae4cd0afacd5a4d9da24aebb15ca6d9bf5a028223df52d12f3aa2b77e@127.0.0.1:0","enr":"0xf88fb840ed735da037c65b1531755f40ecb8315e80fed6331af749996e684fbbf86560aa2ffdad12f343a38edb1feefc8de2de8de90416ea256ed794d06e29aa212e9cf00183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102838a4d55191548d17c665566c483b72340302b64549e2745f5e0d48c4e0e7635","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"vCmg2bYPPiw0IkzsGHz0Tq3EYoCG1VlGZu0CXacefno=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: bc29a0\npopulation: 33 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 4d75 5be6 51c2 1929 | 68 4589 (0) 459b (0) 4775 (0) 4746 (0)\n001 6 cabf d18a f005 f611 | 31 fa65 (0) fa9a (0) fac8 (0) f4a0 (0)\n002 6 8330 8284 8b35 8fb8 | 9 9472 (0) 957e (0) 8012 (0) 836e (0)\n003 4 aedc aba7 a9fa a192 | 6 a192 (0) acf8 (0) aedc (0) aba7 (0)\n004 3 b355 b5fc b4e2 | 5 b60e (0) b5fc (0) b4e2 (0) b245 (0)\n005 2 b9d9 b869 | 2 b9d9 (0) b869 (0)\n006 1 be0f | 1 be0f (0)\n============ DEPTH: 7 ==========================================\n007 4 bd48 bd96 bde9 bddb | 4 bd48 (0) bd96 (0) bde9 (0) bddb (0)\n008 0 | 0\n009 1 bc71 | 1 bc71 (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"bc29a0d9b60f3e2c34224cec187cf44eadc4628086d5594666ed025da71e7e7a","private_key":"2cf6d0e467db44e155c5ad07c701eba3784d380456d0bd1e248e88e4bd50db52","name":"node_bc29a0d9b60f3e2c34224cec187cf44eadc4628086d5594666ed025da71e7e7a","services":["streamer"],"enable_msg_events":true,"port":43139},"up":true}},{"node":{"info":{"id":"1929b01c0f85af7452a0f358b54f6b36640a196b366909172af594a1648fe64c","name":"node_1929b01c0f85af7452a0f358b54f6b36640a196b366909172af594a1648fe64c","enode":"enode://faa781fe46eab677d200731251f2be1aede682a047df2f555335072653b2cf1ad6b90a43c223c2567e8eb00b40a89e31b5d22ddd20563a80e01232f1ba4e151b@127.0.0.1:0","enr":"0xf88fb84098c7e67161c619f0c3c62c007544d6ea9adb3dbc6b48de51b49786232388fca74a3c88c994b07222dfcbba9fb8dbdd2711d9aa0c33c94ecef3d10b9e0e9ab7e20183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103faa781fe46eab677d200731251f2be1aede682a047df2f555335072653b2cf1a","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"GSmwHA+Fr3RSoPNYtU9rNmQKGWs2aQkXKvWUoWSP5kw=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 1929b0\npopulation: 39 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 7 f005 d23c ce01 8b35 | 60 fa65 (0) fa9a (0) fac8 (0) f4a0 (0)\n001 13 4746 4d75 4efa 4a37 | 38 55fd (0) 52b4 (0) 5008 (0) 51c2 (0)\n002 11 3871 3e19 3590 36d5 | 17 3b83 (0) 3871 (0) 3e19 (0) 3590 (0)\n003 4 0e34 0a21 0639 034d | 8 0f31 (0) 0e34 (0) 0807 (0) 0a21 (0)\n============ DEPTH: 4 ==========================================\n004 3 1740 127c 1385 | 3 1740 (0) 127c (0) 1385 (0)\n005 0 | 0\n006 0 | 0\n007 1 184e | 1 184e (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"1929b01c0f85af7452a0f358b54f6b36640a196b366909172af594a1648fe64c","private_key":"f3de60891a8eef22fd764c76d7b6d43b2af723a9731661df6e11020da0718b7c","name":"node_1929b01c0f85af7452a0f358b54f6b36640a196b366909172af594a1648fe64c","services":["streamer"],"enable_msg_events":true,"port":41623},"up":true}},{"node":{"info":{"id":"ce01234661309127bb872d69d38dc5bf19bc4de2e0a0b5041cd362d073df4ff8","name":"node_ce01234661309127bb872d69d38dc5bf19bc4de2e0a0b5041cd362d073df4ff8","enode":"enode://1c368e379ede78380a9710e4d82c88489f66cbc28792aff7702313c087a47b0289a9c8db20c4181b75184f84aac33116cb707ffe2e01e033f014f7f14a082ef1@127.0.0.1:0","enr":"0xf88fb84077b68fee63a81bffa263efd74f643a807ceacce488968c34836eeedf7883e9da6c52dcd816863207878248ea60ba2d67c99473148fe275966dad15341798430d0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1031c368e379ede78380a9710e4d82c88489f66cbc28792aff7702313c087a47b02","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"zgEjRmEwkSe7hy1p043Fvxm8TeLgoLUEHNNi0HPfT/g=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: ce0123\npopulation: 33 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 10 7bcb 772a 72a7 641a | 68 55fd (0) 52b4 (0) 5008 (0) 51c2 (0)\n001 6 b4e2 a9fa 8fb8 8b35 | 29 a192 (0) acf8 (0) aedc (0) aba7 (0)\n002 6 fac8 f611 f177 f005 | 17 fa65 (0) fa9a (0) fac8 (0) f4a0 (0)\n003 5 deec dd92 d23c d18a | 6 d9d3 (0) dd92 (0) deec (0) d23c (0)\n004 2 c52a c0ad | 3 c52a (0) c2f9 (0) c0ad (0)\n005 2 c9ef cabf | 2 c9ef (0) cabf (0)\n============ DEPTH: 6 ==========================================\n006 2 cc9f cc5f | 2 cc5f (0) cc9f (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"ce01234661309127bb872d69d38dc5bf19bc4de2e0a0b5041cd362d073df4ff8","private_key":"95cc1ce48219ce51e9d9520f9ed3968f753d9bce3da5e3bd7ea9362f1f51a509","name":"node_ce01234661309127bb872d69d38dc5bf19bc4de2e0a0b5041cd362d073df4ff8","services":["streamer"],"enable_msg_events":true,"port":45409},"up":true}},{"node":{"info":{"id":"957ed6194e6ef56e9696be43a1a0258f2ba4f48f56d790e42bd0663c3fc6aaae","name":"node_957ed6194e6ef56e9696be43a1a0258f2ba4f48f56d790e42bd0663c3fc6aaae","enode":"enode://8b3a82a0b62bf9f4fe01d9c72712b70dd78140dfd808de3b5d4e2daa6d1e0bc78137035a1c4888ca82d1ae29cd2ed1e42db6210f629a415080082cacbcf3bf48@127.0.0.1:0","enr":"0xf88fb84018ff9330c436aa3ccef762f9c9a9d020113f1b7b955b454631d5bcc2c441ce99132e51acf27ba2589be6a6d018a52f3110342b94391caa43e26f3ba790a0248f0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1028b3a82a0b62bf9f4fe01d9c72712b70dd78140dfd808de3b5d4e2daa6d1e0bc7","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"lX7WGU5u9W6Wlr5DoaAljyuk9I9W15DkK9BmPD/Gqq4=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 957ed6\npopulation: 35 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 13 1929 034d 2803 2471 | 68 3e19 (0) 3b83 (0) 3871 (0) 3590 (0)\n001 7 f005 f3d5 f611 dd92 | 31 fa65 (0) fa9a (0) fac8 (0) f4a0 (0)\n002 7 a9fa b4e2 b355 bc71 | 20 a192 (0) aedc (0) acf8 (0) aba7 (0)\n============ DEPTH: 3 ==========================================\n003 7 8b35 8d3e 8fb8 8012 | 7 8b35 (0) 8d3e (0) 8fb8 (0) 8012 (0)\n004 0 | 0\n005 0 | 0\n006 0 | 0\n007 1 9472 | 1 9472 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"957ed6194e6ef56e9696be43a1a0258f2ba4f48f56d790e42bd0663c3fc6aaae","private_key":"c249537590c459e98e22f7a70786699bfd3c23aef26288b9f589ee97574d33cc","name":"node_957ed6194e6ef56e9696be43a1a0258f2ba4f48f56d790e42bd0663c3fc6aaae","services":["streamer"],"enable_msg_events":true,"port":42809},"up":true}},{"node":{"info":{"id":"6379b4d611cdd6e360480c14b3f6784360f28f702b5a6f375eda4ef3bde7ef33","name":"node_6379b4d611cdd6e360480c14b3f6784360f28f702b5a6f375eda4ef3bde7ef33","enode":"enode://9b66200ba83d63d75740082432f6c3831ad635f6d3fe228458bd67d7e49cbaa1df293dffbf9406b165a041c7d284b6979057355ab46f925a4ae75a21e35fdf2e@127.0.0.1:0","enr":"0xf88fb8403156b1191369fe50cd749c6aac2c8795c35461c3f5bcc76313ab9a54c9248041081d5084353de2c4357294d870533e298b6954e3d9ca93644323f9cbaefb2a5b0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1029b66200ba83d63d75740082432f6c3831ad635f6d3fe228458bd67d7e49cbaa1","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"Y3m01hHN1uNgSAwUs/Z4Q2Dyj3ArWm83XtpO873n7zM=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 6379b4\npopulation: 23 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 bddb 957e | 60 fa65 (0) fa9a (0) fac8 (0) f4a0 (0)\n001 2 3590 1929 | 30 0807 (0) 0a21 (0) 0f31 (0) 0e34 (0)\n002 6 4cc2 58a9 5cc1 5c62 | 20 55fd (0) 52b4 (0) 5008 (0) 51c2 (0)\n003 5 7a68 75e2 772a 73d0 | 9 75e2 (0) 77ee (0) 772a (0) 73d0 (0)\n004 3 6daa 68a6 6975 | 3 6975 (0) 68a6 (0) 6daa (0)\n============ DEPTH: 5 ==========================================\n005 4 672a 64e6 6450 641a | 4 672a (0) 64e6 (0) 641a (0) 6450 (0)\n006 0 | 0\n007 1 62f0 | 1 62f0 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"6379b4d611cdd6e360480c14b3f6784360f28f702b5a6f375eda4ef3bde7ef33","private_key":"024d0a70b86bc13cf4efc5e5bd5144a351300f43a58a6e6b95684a79ddd6fa69","name":"node_6379b4d611cdd6e360480c14b3f6784360f28f702b5a6f375eda4ef3bde7ef33","services":["streamer"],"enable_msg_events":true,"port":38231},"up":true}},{"node":{"info":{"id":"bddbdff3cbd22fcedddc07de27125819aac72be72c3126ba898621c496cb95a2","name":"node_bddbdff3cbd22fcedddc07de27125819aac72be72c3126ba898621c496cb95a2","enode":"enode://fee39a564023c233a4363d4b025275561497b7b7c8e82b20160ec71631ec4adebe8afa63a77c3eb4a2d29f8c5038d08cc1ae180ea5bc95ed479297b2eaf84354@127.0.0.1:0","enr":"0xf88fb8408b6f5d1b485209e0c27b986c8f1f4356f21252247a203ff1e10fe4d511299bb01096acece8f2bf01e7674f4a3b9f315ecced47e671df32ae11bc7dcde6c0636d0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102fee39a564023c233a4363d4b025275561497b7b7c8e82b20160ec71631ec4ade","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"vdvf88vSL87d3AfeJxJYGarHK+csMSa6iYYhxJbLlaI=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: bddbdf\npopulation: 26 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 3590 4d75 5be6 51c2 | 68 0f31 (0) 0e34 (0) 0807 (0) 0a21 (0)\n001 2 f177 ed12 | 31 d9d3 (0) dd92 (0) deec (0) d23c (0)\n002 5 9472 957e 8fb8 8b35 | 9 9472 (0) 957e (0) 8b35 (0) 8d3e (0)\n003 3 a192 aba7 a9fa | 6 a192 (0) aedc (0) acf8 (0) aba7 (0)\n004 3 b5fc b4e2 b355 | 5 b60e (0) b5fc (0) b4e2 (0) b245 (0)\n005 2 b9d9 b869 | 2 b9d9 (0) b869 (0)\n006 1 be0f | 1 be0f (0)\n007 2 bc71 bc29 | 2 bc71 (0) bc29 (0)\n008 1 bd48 | 1 bd48 (0)\n============ DEPTH: 9 ==========================================\n009 1 bd96 | 1 bd96 (0)\n010 1 bde9 | 1 bde9 (0)\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"bddbdff3cbd22fcedddc07de27125819aac72be72c3126ba898621c496cb95a2","private_key":"4d7f0353e69c74cd0ffd1788c11c34ed5bf024705a9d91fcc91364dcc0170d44","name":"node_bddbdff3cbd22fcedddc07de27125819aac72be72c3126ba898621c496cb95a2","services":["streamer"],"enable_msg_events":true,"port":40129},"up":true}},{"node":{"info":{"id":"82847a4af4f50622650d035f69151b202bccd5fc92302a617602c974603ed997","name":"node_82847a4af4f50622650d035f69151b202bccd5fc92302a617602c974603ed997","enode":"enode://e2446d4ba20cf04f7587b21f065505bf06a0b763ad10228db7fac2f3d0ce85b065c6ae7856d0cf0de33e54f769d982a19db0166690996d05cfe8789eefcd061c@127.0.0.1:0","enr":"0xf88fb840390e501e8aea6582161ebc4735fea5ea709f34fdce68c3bea1d8ac01a9bee38b1f74f6c9802e7101930fa56f8379569b9e68aeca2f58c3af3f64fc0346e8bf000183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102e2446d4ba20cf04f7587b21f065505bf06a0b763ad10228db7fac2f3d0ce85b0","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"goR6SvT1BiJlDQNfaRUbICvM1fySMCphdgLJdGA+2Zc=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 82847a\npopulation: 33 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 11 72a7 75e2 772a 7a68 | 68 6975 (0) 68a6 (0) 6daa (0) 62f0 (0)\n001 7 dd92 d23c d18a d125 | 31 c52a (0) c2f9 (0) c0ad (0) c9ef (0)\n002 8 aedc a9fa b355 b4e2 | 20 a192 (0) acf8 (0) aedc (0) aba7 (0)\n003 2 9472 957e | 2 9472 (0) 957e (0)\n004 2 8b35 8fb8 | 3 8b35 (0) 8d3e (0) 8fb8 (0)\n============ DEPTH: 5 ==========================================\n005 0 | 0\n006 1 8012 | 1 8012 (0)\n007 2 836e 8330 | 2 8330 (0) 836e (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"82847a4af4f50622650d035f69151b202bccd5fc92302a617602c974603ed997","private_key":"8ad165530adf15657647eec0c9ad139e69f7656f1deca7792c1fc0de289a1add","name":"node_82847a4af4f50622650d035f69151b202bccd5fc92302a617602c974603ed997","services":["streamer"],"enable_msg_events":true,"port":45695},"up":true}},{"node":{"info":{"id":"2803f212eb4aa4f49224b16b2de88ba8652ad115321ee1e60cdbd926ecdad38a","name":"node_2803f212eb4aa4f49224b16b2de88ba8652ad115321ee1e60cdbd926ecdad38a","enode":"enode://89fa1305c12aff15670cc1bd8b563b83fe9f1674d1001a07b9603e7da4f267a84dfb81b00c1b2a8b6515fa90ad36b8790ed0d0bca1509e9bf434327d50ff6375@127.0.0.1:0","enr":"0xf88fb840f7c3b1530907dfcb9ba22825a0bac829dd204d31f686d97d7f4481599308bb0536112276a86c5ce46f913fb6817457bd19a2b684046c47fcbd14827391e52f080183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10389fa1305c12aff15670cc1bd8b563b83fe9f1674d1001a07b9603e7da4f267a8","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"KAPyEutKpPSSJLFrLeiLqGUq0RUyHuHmDNvZJuza04o=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 2803f2\npopulation: 31 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 957e 8284 f005 e06f | 60 a192 (0) aedc (0) acf8 (0) aba7 (0)\n001 9 6450 64e6 672a 7bee | 38 6daa (0) 68a6 (0) 6975 (0) 62f0 (0)\n002 3 034d 184e 1929 | 13 0f31 (0) 0e34 (0) 0a21 (0) 0807 (0)\n003 4 3e19 3590 3775 36d5 | 6 3e19 (0) 3871 (0) 3b83 (0) 3590 (0)\n004 8 22bb 221c 2354 216e | 8 2471 (0) 27b5 (0) 27db (0) 2354 (0)\n============ DEPTH: 5 ==========================================\n005 2 2dd4 2d53 | 2 2dd4 (0) 2d53 (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"2803f212eb4aa4f49224b16b2de88ba8652ad115321ee1e60cdbd926ecdad38a","private_key":"b37365e96591f61ba1f1f4c9438ef43bd78f2207737972de4ecc9bc85640c7c5","name":"node_2803f212eb4aa4f49224b16b2de88ba8652ad115321ee1e60cdbd926ecdad38a","services":["streamer"],"enable_msg_events":true,"port":46045},"up":true}},{"node":{"info":{"id":"ed12c78e700bf805669c48a5d62f1e56791263c4b2ce5bd34587ea9bc931a3e5","name":"node_ed12c78e700bf805669c48a5d62f1e56791263c4b2ce5bd34587ea9bc931a3e5","enode":"enode://0b74c99f74b309c85f91b8ac4c7ebd527e900a0e3ec1355dfbfcc3f9e3bdeba8f75f27696f1412ccfa6d1580c769641f74289f5ac39347e2af880b54dbe1bdb4@127.0.0.1:0","enr":"0xf88fb840d82da58cd4d87e8a9a7bc9fa59302a31d713ec01ba8a8a0f3c989a2975ed12a41cec56ba3214c6dff113d27ed34285dd89654def2164131e72eb4d7fa553aacb0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1020b74c99f74b309c85f91b8ac4c7ebd527e900a0e3ec1355dfbfcc3f9e3bdeba8","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"7RLHjnAL+AVmnEil1i8eVnkSY8SyzlvTRYfqm8kxo+U=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: ed12c7\npopulation: 32 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 641a 72a7 7bcb 4d75 | 68 6daa (0) 68a6 (0) 6975 (0) 6379 (0)\n001 6 be0f bc29 bddb 8fb8 | 29 a192 (0) aedc (0) acf8 (0) aba7 (0)\n002 9 d23c d125 d18a dd92 | 14 c52a (0) c2f9 (0) c0ad (0) c9ef (0)\n003 5 fa65 f33c f177 f005 | 9 fa65 (0) fa9a (0) fac8 (0) f4a0 (0)\n004 1 e06f | 1 e06f (0)\n005 2 eb01 ea3d | 2 eb01 (0) ea3d (0)\n006 2 efd6 ee2b | 2 efd6 (0) ee2b (0)\n============ DEPTH: 7 ==========================================\n007 1 eceb | 1 eceb (0)\n008 0 | 0\n009 0 | 0\n010 1 ed2e | 1 ed2e (0)\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"ed12c78e700bf805669c48a5d62f1e56791263c4b2ce5bd34587ea9bc931a3e5","private_key":"f54883fc517f0e3c2eddab9bdc23da7263abbb18620926ea60fdc8e1c54f341e","name":"node_ed12c78e700bf805669c48a5d62f1e56791263c4b2ce5bd34587ea9bc931a3e5","services":["streamer"],"enable_msg_events":true,"port":41603},"up":true}},{"node":{"info":{"id":"4d750666dc0e9e2c244c43492801c1d7ec6208954a0cb5f8bb793b912440753a","name":"node_4d750666dc0e9e2c244c43492801c1d7ec6208954a0cb5f8bb793b912440753a","enode":"enode://ed37ba950278a3c20524b27d1e9a25e94d01f5fa944c8c34d28feea810dc7c9ff037e34daa95ad6d532439949b2f4ce551f3e01eb652ca662e40b561560bf690@127.0.0.1:0","enr":"0xf88fb84074cdf17f902a07b1fe1cf0d4977a986ae645bb8d982f6feeae2a955a91b8eb3b25a8c65e204fbb42b090a2ca073f7de07f6fe8bb3ae3dc993c9f193ce5f800930183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102ed37ba950278a3c20524b27d1e9a25e94d01f5fa944c8c34d28feea810dc7c9f","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"TXUGZtwOniwkTENJKAHB1+xiCJVKDLX4u3k7kSRAdTo=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 4d7506\npopulation: 45 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 13 957e 8fb8 b869 bddb | 60 a192 (0) aedc (0) acf8 (0) aba7 (0)\n001 14 127c 1385 1929 184e | 30 0a21 (0) 0807 (0) 0f31 (0) 0e34 (0)\n002 4 672a 6450 75e2 7bee | 18 6daa (0) 6975 (0) 68a6 (0) 6379 (0)\n003 4 52b4 51c2 5c62 5be6 | 9 55fd (0) 52b4 (0) 5008 (0) 51c2 (0)\n004 4 4589 459b 4775 4746 | 4 459b (0) 4589 (0) 4775 (0) 4746 (0)\n005 3 4bc8 4a3c 4a37 | 3 4a3c (0) 4a37 (0) 4bc8 (0)\n006 1 4efa | 1 4efa (0)\n============ DEPTH: 7 ==========================================\n007 2 4c21 4cc2 | 2 4cc2 (0) 4c21 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"4d750666dc0e9e2c244c43492801c1d7ec6208954a0cb5f8bb793b912440753a","private_key":"86b527d54feaa68feaa47006bfdddb5ed3db2af4f2d2c66c08442c78bfddeb4a","name":"node_4d750666dc0e9e2c244c43492801c1d7ec6208954a0cb5f8bb793b912440753a","services":["streamer"],"enable_msg_events":true,"port":43481},"up":true}},{"node":{"info":{"id":"7bee7967ff7b07243bed55b6d060d5ec2a1f28b530ed65cd055dc5b468a0f878","name":"node_7bee7967ff7b07243bed55b6d060d5ec2a1f28b530ed65cd055dc5b468a0f878","enode":"enode://ee6f1a851bbd2d48a78f56ee08516649226a2b2c490ecede0f8144fd1bd0c94113ed85d0f117ed7d577e6ca4fc62f21ff3f1bc4fda1504ef8f9120b7836fa78b@127.0.0.1:0","enr":"0xf88fb840d7c73ae301629d49e06baa43aba331e7eabb685bf4c4d420b746acdbf05acb7b2468e5c944470383ac2d8aeb608a478c483b1d7fd866cec2f9b38244934394260183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103ee6f1a851bbd2d48a78f56ee08516649226a2b2c490ecede0f8144fd1bd0c941","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"e+55Z/97ByQ77VW20GDV7CofKLUw7WXNBV3FtGig+Hg=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 7bee79\npopulation: 33 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 9 b4e2 8284 8fb8 9472 | 60 9472 (0) 957e (0) 8b35 (0) 8d3e (0)\n001 7 184e 1929 3590 3775 | 30 0a21 (0) 0807 (0) 0f31 (0) 0e34 (0)\n002 5 51c2 52b4 4bc8 4efa | 20 55fd (0) 5008 (0) 51c2 (0) 52b4 (0)\n003 4 6daa 68a6 64e6 672a | 9 6daa (0) 6975 (0) 68a6 (0) 6379 (0)\n004 6 77ee 772a 75e2 73d0 | 6 77ee (0) 772a (0) 75e2 (0) 73d0 (0)\n============ DEPTH: 5 ==========================================\n005 0 | 0\n006 0 | 0\n007 1 7a68 | 1 7a68 (0)\n008 0 | 0\n009 0 | 0\n010 1 7bcb | 1 7bcb (0)\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"7bee7967ff7b07243bed55b6d060d5ec2a1f28b530ed65cd055dc5b468a0f878","private_key":"2ba96f376fb0ff9f7f829af5f4ac836ee1973e1a0198f5e9fcdfd002aa55f7db","name":"node_7bee7967ff7b07243bed55b6d060d5ec2a1f28b530ed65cd055dc5b468a0f878","services":["streamer"],"enable_msg_events":true,"port":45185},"up":true}},{"node":{"info":{"id":"d18a1edd26661069fb401fee8aa85a9614a3188e2e0666bfe9307f91d29aad49","name":"node_d18a1edd26661069fb401fee8aa85a9614a3188e2e0666bfe9307f91d29aad49","enode":"enode://111a2f319dc9db157c329c910ac39ad991b4a51e524947cdef3771765b1de028196a000955e727277027e2120a5fc6a1ad482b9b905988222c43895d74b496da@127.0.0.1:0","enr":"0xf88fb8404522aa5ddd38e1612c0c481686380332cc9624a872608456ad811feebe30a98e417d969aa10b1db80af028c334406d20531319decbc1dc63339222303e8379a50183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102111a2f319dc9db157c329c910ac39ad991b4a51e524947cdef3771765b1de028","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"0Yoe3SZmEGn7QB/uiqhalhSjGI4uBma/6TB/kdKarUk=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: d18a1e\npopulation: 30 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 4a37 641a 7bcb 7bee | 68 0e34 (0) 0f31 (0) 0a21 (0) 0807 (0)\n001 7 a9fa b4e2 bc29 8284 | 29 9472 (0) 957e (0) 8b35 (0) 8d3e (0)\n002 9 e06f ed2e ed12 ea3d | 17 e06f (0) eb01 (0) ea3d (0) efd6 (0)\n003 5 c52a c0ad cabf cc5f | 8 c52a (0) c2f9 (0) c0ad (0) c9ef (0)\n004 3 d9d3 deec dd92 | 3 d9d3 (0) deec (0) dd92 (0)\n============ DEPTH: 5 ==========================================\n005 0 | 0\n006 1 d23c | 1 d23c (0)\n007 0 | 0\n008 1 d125 | 1 d125 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"d18a1edd26661069fb401fee8aa85a9614a3188e2e0666bfe9307f91d29aad49","private_key":"1254e1b68ce774b5f389113becbac1ac48e7cd670611899a781849e45f626f93","name":"node_d18a1edd26661069fb401fee8aa85a9614a3188e2e0666bfe9307f91d29aad49","services":["streamer"],"enable_msg_events":true,"port":36067},"up":true}},{"node":{"info":{"id":"f005a4d3453d52434f2b5be4006e653b50b52ad31926d654722fc3df00f1689c","name":"node_f005a4d3453d52434f2b5be4006e653b50b52ad31926d654722fc3df00f1689c","enode":"enode://44c0501c60e75da3cff66ec0cc1f38a048f0236760ae5a715e180477166acef0f3861d57d16ece9860e9ab79f1d0c0d8d2e72d224b7b2efeaef3851ee781dd2c@127.0.0.1:0","enr":"0xf88fb840c322770a94cf0d299ed2c66f6698f6cc8cf2c1297f7f1f0f4db86c08c7eb44b2451dc9ee8f9f0e2a30068eb28c80097b8413bfb5bbbb41ec8bb3f2b3d9a384e30183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10244c0501c60e75da3cff66ec0cc1f38a048f0236760ae5a715e180477166acef0","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"8AWk00U9UkNPK1vkAG5lO1C1KtMZJtZUci/D3wDxaJw=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: f005a4\npopulation: 32 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 8 2803 3775 36d5 034d | 68 0807 (0) 0a21 (0) 0f31 (0) 0e34 (0)\n001 12 8fb8 8012 8330 8284 | 29 9472 (0) 957e (0) 8b35 (0) 8d3e (0)\n002 2 ce01 d18a | 14 c52a (0) c2f9 (0) c0ad (0) c9ef (0)\n003 3 eceb ed12 ed2e | 8 e06f (0) eb01 (0) ea3d (0) efd6 (0)\n004 2 fa65 fac8 | 3 fa65 (0) fa9a (0) fac8 (0)\n005 2 f4a0 f611 | 2 f4a0 (0) f611 (0)\n============ DEPTH: 6 ==========================================\n006 2 f33c f3d5 | 2 f33c (0) f3d5 (0)\n007 1 f177 | 1 f177 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"f005a4d3453d52434f2b5be4006e653b50b52ad31926d654722fc3df00f1689c","private_key":"22efd63c6544702dc87aeb332bfd579220f67ee8aeb6de7e8d074f5c0bc7406d","name":"node_f005a4d3453d52434f2b5be4006e653b50b52ad31926d654722fc3df00f1689c","services":["streamer"],"enable_msg_events":true,"port":35571},"up":true}},{"node":{"info":{"id":"4a373571475e2b4c280d2d4b22f10a249ee09fcf907f52081ec0398a8b5ea6f2","name":"node_4a373571475e2b4c280d2d4b22f10a249ee09fcf907f52081ec0398a8b5ea6f2","enode":"enode://8932a57b3a5d0667185be53dfc1c53a171fb4ed6de334b49c24440e48bd85288cb827ff2141fedab03949eaaac6340211b64e434f80dc83e4c21b24e907b54aa@127.0.0.1:0","enr":"0xf88fb84026d7e9844328cc3aead03b756a7922f94121db28001850d34df1b7f2513ec69e30437cc7a321d10338c447945422db8b68c70409fd74fb560da1a45823fa40840183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1028932a57b3a5d0667185be53dfc1c53a171fb4ed6de334b49c24440e48bd85288","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"Sjc1cUdeK0woDS1LIvEKJJ7gn8+Qf1IIHsA5iotepvI=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 4a3735\npopulation: 32 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 8fb8 a9fa d18a fac8 | 60 9472 (0) 957e (0) 8b35 (0) 8d3e (0)\n001 5 216e 27db 36d5 3775 | 30 0e34 (0) 0f31 (0) 0807 (0) 0a21 (0)\n002 7 7bcb 7a68 73d0 72a7 | 18 75e2 (0) 77ee (0) 772a (0) 73d0 (0)\n003 6 5cc1 5c62 58a9 5be6 | 9 55fd (0) 5008 (0) 51c2 (0) 52b4 (0)\n004 2 4775 4746 | 4 459b (0) 4589 (0) 4775 (0) 4746 (0)\n005 4 4efa 4cc2 4c21 4d75 | 4 4cc2 (0) 4c21 (0) 4d75 (0) 4efa (0)\n============ DEPTH: 6 ==========================================\n006 0 | 0\n007 1 4bc8 | 1 4bc8 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 1 4a3c | 1 4a3c (0)\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"4a373571475e2b4c280d2d4b22f10a249ee09fcf907f52081ec0398a8b5ea6f2","private_key":"01b16147c78c71594879cbc9eace48bccf5f46f6c50604ec8fee98e1e91914b2","name":"node_4a373571475e2b4c280d2d4b22f10a249ee09fcf907f52081ec0398a8b5ea6f2","services":["streamer"],"enable_msg_events":true,"port":43203},"up":true}},{"node":{"info":{"id":"a9fa28117a4b6906b5ce3931573e0a19eec3cb4fcd9141be2d258a2be06f3b61","name":"node_a9fa28117a4b6906b5ce3931573e0a19eec3cb4fcd9141be2d258a2be06f3b61","enode":"enode://37b1fbaed8a69d74dcb79c7269e934ef02b048bc42b77b82e5e62866160ba5cad476950f99f99285f882b0a904a19b9cc97400347dd8913ebdbf6698e62f4490@127.0.0.1:0","enr":"0xf88fb840651a030a5371bc567448dc8f7027e7e4d9aca1dffba13e9503cbd1be66c51de02e5ee41bbc0d27c11c4d68d95ed088f1108e358ae435ebb57803627f6d7712ac0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10237b1fbaed8a69d74dcb79c7269e934ef02b048bc42b77b82e5e62866160ba5ca","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"qfooEXpLaQa1zjkxVz4KGe7Dy0/NkUG+LSWKK+BvO2E=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: a9fa28\npopulation: 46 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 8 2471 3590 68a6 6450 | 68 0a21 (0) 0807 (0) 0f31 (0) 0e34 (0)\n001 14 d18a d125 d23c dd92 | 31 c52a (0) c2f9 (0) c0ad (0) cc9f (0)\n002 7 9472 957e 8b35 8d3e | 9 8b35 (0) 8d3e (0) 8fb8 (0) 8012 (0)\n003 12 b245 b355 b60e b4e2 | 14 b60e (0) b5fc (0) b4e2 (0) b245 (0)\n004 1 a192 | 1 a192 (0)\n005 2 aedc acf8 | 2 aedc (0) acf8 (0)\n============ DEPTH: 6 ==========================================\n006 1 aba7 | 1 aba7 (0)\n007 1 a861 | 1 a861 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"a9fa28117a4b6906b5ce3931573e0a19eec3cb4fcd9141be2d258a2be06f3b61","private_key":"eea6155ca80745d78b3a9c8c63fc2618254022771e70abd50cc80a7bcee4129c","name":"node_a9fa28117a4b6906b5ce3931573e0a19eec3cb4fcd9141be2d258a2be06f3b61","services":["streamer"],"enable_msg_events":true,"port":35285},"up":true}},{"node":{"info":{"id":"4efaabab0d5dc59f098aee4dba3868263411a55615a2c474a73e6eec2211decc","name":"node_4efaabab0d5dc59f098aee4dba3868263411a55615a2c474a73e6eec2211decc","enode":"enode://83716365bf8c5748254c76a38079e43293468d4a67d489df3092fc33447390a566e18708a5ef396134e35ca5f2ff58e96ea27ed6941bc20dc6c3d1be57960d9b@127.0.0.1:0","enr":"0xf88fb840beee55803b074f7f9ec59bf2276feeb7849256026ecb0b230f47905554a0b7721dc5f36ac09fcad8662a9da7962463ba1c8380d27ebc363edf966b1b4fffd7970183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10383716365bf8c5748254c76a38079e43293468d4a67d489df3092fc33447390a5","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"Tvqrqw1dxZ8Jiu5NujhoJjQRpVYVosR0pz5u7CIR3sw=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 4efaab\npopulation: 30 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 f4a0 fac8 8fb8 bde9 | 60 e06f (0) eb01 (0) ea3d (0) efd6 (0)\n001 4 1929 216e 27db 2803 | 30 0a21 (0) 0807 (0) 0f31 (0) 0e34 (0)\n002 6 7bee 7bcb 72a7 72a5 | 18 73d0 (0) 72a7 (0) 72a5 (0) 77ee (0)\n003 5 52b4 51c2 5cc1 5c62 | 9 55fd (0) 5008 (0) 51c2 (0) 52b4 (0)\n004 4 459b 4589 4775 4746 | 4 459b (0) 4589 (0) 4775 (0) 4746 (0)\n005 3 4bc8 4a37 4a3c | 3 4a3c (0) 4a37 (0) 4bc8 (0)\n============ DEPTH: 6 ==========================================\n006 3 4cc2 4c21 4d75 | 3 4cc2 (0) 4c21 (0) 4d75 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"4efaabab0d5dc59f098aee4dba3868263411a55615a2c474a73e6eec2211decc","private_key":"9adb7214565c62d93b6daada5fb947a4aa641f07396dc29def6a399d06534b3f","name":"node_4efaabab0d5dc59f098aee4dba3868263411a55615a2c474a73e6eec2211decc","services":["streamer"],"enable_msg_events":true,"port":41679},"up":true}},{"node":{"info":{"id":"bde90aaa0f1f7a7eb965ff308718d29b55a80b1ca84dfba16c169eabe2b0d5de","name":"node_bde90aaa0f1f7a7eb965ff308718d29b55a80b1ca84dfba16c169eabe2b0d5de","enode":"enode://18c5769fcc3cebeb0f8151e2f4b84902c268fe8db07c01b90e0992abf123891768735738fa07913a22d143ae1b0852d830f7b49fd9b022b48765b518bccf8166@127.0.0.1:0","enr":"0xf88fb84006231adc86baddad575a6b04c656320bf5c226c2f4907c98a80d09ffd30a9c5e5f4ef4e17a92c907e3fa90a57634dec8277905a2298a73fea645bf359a400e910183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10218c5769fcc3cebeb0f8151e2f4b84902c268fe8db07c01b90e0992abf1238917","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"vekKqg8fen65Zf8whxjSm1WoCxyoTfuhbBaeq+Kw1d4=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: bde90a\npopulation: 26 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 5be6 4bc8 4d75 4efa | 68 0639 (0) 01a6 (0) 03eb (0) 034d (0)\n001 2 e06f ed2e | 31 e06f (0) eb01 (0) ea3d (0) efd6 (0)\n002 6 957e 8fb8 8b35 8012 | 9 8b35 (0) 8d3e (0) 8fb8 (0) 8012 (0)\n003 3 a9fa a861 a192 | 6 a192 (0) aedc (0) acf8 (0) aba7 (0)\n004 3 b4e2 b245 b355 | 5 b60e (0) b5fc (0) b4e2 (0) b245 (0)\n005 2 b9d9 b869 | 2 b9d9 (0) b869 (0)\n006 1 be0f | 1 be0f (0)\n007 2 bc71 bc29 | 2 bc71 (0) bc29 (0)\n008 1 bd48 | 1 bd48 (0)\n============ DEPTH: 9 ==========================================\n009 1 bd96 | 1 bd96 (0)\n010 1 bddb | 1 bddb (0)\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"bde90aaa0f1f7a7eb965ff308718d29b55a80b1ca84dfba16c169eabe2b0d5de","private_key":"5c9ecf07c02ad229e4278ffee6d3f401fd8e6605ec8cda65cd1de164bdb2c4c9","name":"node_bde90aaa0f1f7a7eb965ff308718d29b55a80b1ca84dfba16c169eabe2b0d5de","services":["streamer"],"enable_msg_events":true,"port":37049},"up":true}},{"node":{"info":{"id":"b3555baa764c4562935b93533ee6c5a6df631e846c3ab512fdb1d6b901a68c60","name":"node_b3555baa764c4562935b93533ee6c5a6df631e846c3ab512fdb1d6b901a68c60","enode":"enode://05ec349b77cce593afc87d277f22c4664825e5cda0f4685461bf1161b262a3c29837580c1f80a96fd1953be71e7083284fbb28a7cbd63df5ceea63f89d1c429d@127.0.0.1:0","enr":"0xf88fb8403b39c4a274c55d5fda8b8b8e52dfdb970bff69c0055370a4553ff68fd90d149f41ff2b874b4b9c2258a91d1256de830ec8c0ea3cf7881acab5e8dce0fff835bb0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10305ec349b77cce593afc87d277f22c4664825e5cda0f4685461bf1161b262a3c2","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"s1VbqnZMRWKTW5NTPubFpt9jHoRsOrUS/bHWuQGmjGA=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: b3555b\npopulation: 36 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 12 3775 3e19 184e 1929 | 68 0639 (0) 01a6 (0) 03eb (0) 034d (0)\n001 3 f005 e06f ed2e | 31 e06f (0) eb01 (0) ea3d (0) efd6 (0)\n002 5 957e 8b35 8012 8284 | 9 8b35 (0) 8d3e (0) 8fb8 (0) 8012 (0)\n003 3 a9fa a861 a192 | 6 a192 (0) acf8 (0) aedc (0) aba7 (0)\n004 9 b9d9 b869 be0f bc29 | 9 b9d9 (0) b869 (0) be0f (0) bc71 (0)\n============ DEPTH: 5 ==========================================\n005 3 b60e b4e2 b5fc | 3 b60e (0) b5fc (0) b4e2 (0)\n006 0 | 0\n007 1 b245 | 1 b245 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"b3555baa764c4562935b93533ee6c5a6df631e846c3ab512fdb1d6b901a68c60","private_key":"590969da498fe95b0a99340a0c185e65d4cc9eb3ee04b3629e91bdc6b8ce18c6","name":"node_b3555baa764c4562935b93533ee6c5a6df631e846c3ab512fdb1d6b901a68c60","services":["streamer"],"enable_msg_events":true,"port":39871},"up":true}},{"node":{"info":{"id":"4bc8dfbf84794d26d7a573c9d898974eaa3a2167e19cb7a8aa460807a603acd4","name":"node_4bc8dfbf84794d26d7a573c9d898974eaa3a2167e19cb7a8aa460807a603acd4","enode":"enode://29d89497ada4c78fa702d02812539dddff2d5b2a38b2eabf3ccca262ca18d8a7781a78b87287b1d2e204171814e04a54d268c692c64f9da0079ff9b143f8b386@127.0.0.1:0","enr":"0xf88fb840933154156e40944b295ca276bd44fdccde6fa8f9ca5ec52169c14e3d609078a3554a271fdcc0e539e728506b39331131141632c216ce5728688f16aa2367a0590183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10229d89497ada4c78fa702d02812539dddff2d5b2a38b2eabf3ccca262ca18d8a7","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"S8jfv4R5TSbXpXPJ2JiXTqo6IWfhnLeoqkYIB6YDrNQ=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 4bc8df\npopulation: 33 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 f4a0 fac8 d125 bde9 | 60 e06f (0) eb01 (0) ea3d (0) efd6 (0)\n001 4 184e 216e 27db 36d5 | 30 0639 (0) 01a6 (0) 03eb (0) 034d (0)\n002 10 6450 641a 6975 68a6 | 18 73d0 (0) 72a7 (0) 72a5 (0) 77ee (0)\n003 4 5a8b 5c62 52b4 51c2 | 9 55fd (0) 5008 (0) 51c2 (0) 52b4 (0)\n004 3 4589 4775 4746 | 4 459b (0) 4589 (0) 4775 (0) 4746 (0)\n005 4 4efa 4d75 4cc2 4c21 | 4 4cc2 (0) 4c21 (0) 4d75 (0) 4efa (0)\n============ DEPTH: 6 ==========================================\n006 0 | 0\n007 2 4a37 4a3c | 2 4a3c (0) 4a37 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"4bc8dfbf84794d26d7a573c9d898974eaa3a2167e19cb7a8aa460807a603acd4","private_key":"2b3a544890fa52405c7779653a8a4e5269283d9f341ab7aa99823d9135a96263","name":"node_4bc8dfbf84794d26d7a573c9d898974eaa3a2167e19cb7a8aa460807a603acd4","services":["streamer"],"enable_msg_events":true,"port":44129},"up":true}},{"node":{"info":{"id":"d125317b492df46a7dd496d30c6d07839ed6bfa196abde4886ce7bc8f9b5c01f","name":"node_d125317b492df46a7dd496d30c6d07839ed6bfa196abde4886ce7bc8f9b5c01f","enode":"enode://d2dec9507d007942f28636ef9f81f1a1a872649603fd6a91663cd0130f4cda18defe6e621a84a16b090128c8f34cb74030ccb6da91c4d4f738ef2fc72fa7a14a@127.0.0.1:0","enr":"0xf88fb840625c10b99f412c5021f6b462a097936033b6ce377281de62adfcf031f36be69c099ffbd4039c05d2c01fd4020579a384db855daf9ddae3b84112d2ba0fd359000183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102d2dec9507d007942f28636ef9f81f1a1a872649603fd6a91663cd0130f4cda18","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"0SUxe0kt9Gp91JbTDG0Hg57Wv6GWq95Ihs57yPm1wB8=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: d12531\npopulation: 29 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 72a7 7bcb 641a 672a | 68 03eb (0) 034d (0) 01a6 (0) 0639 (0)\n001 6 8012 8330 8284 b4e2 | 29 8b35 (0) 8d3e (0) 8fb8 (0) 8012 (0)\n002 7 ea3d ed12 ed2e ee2b | 17 e06f (0) eb01 (0) ea3d (0) efd6 (0)\n003 6 c52a c0ad cabf cc5f | 8 c52a (0) c2f9 (0) c0ad (0) ce01 (0)\n004 3 d9d3 deec dd92 | 3 d9d3 (0) deec (0) dd92 (0)\n============ DEPTH: 5 ==========================================\n005 0 | 0\n006 1 d23c | 1 d23c (0)\n007 0 | 0\n008 1 d18a | 1 d18a (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"d125317b492df46a7dd496d30c6d07839ed6bfa196abde4886ce7bc8f9b5c01f","private_key":"f481929f9772f78b97a8f3aec412d8fcce1c6413a74f05ae88a2a1f966ac73ea","name":"node_d125317b492df46a7dd496d30c6d07839ed6bfa196abde4886ce7bc8f9b5c01f","services":["streamer"],"enable_msg_events":true,"port":35019},"up":true}},{"node":{"info":{"id":"672a566c7c2aeb1d91e6ee4e43984050df8b9560d923d60dc1fb23fb73b1a046","name":"node_672a566c7c2aeb1d91e6ee4e43984050df8b9560d923d60dc1fb23fb73b1a046","enode":"enode://7b6be04d1749751b5092a9e161b023476c969249f8f813aaa7d55bb11ea59589a48186fdbd5669729d96c2e6aa36e602be0dd2affbb4f9b746cffe9d6ce980c6@127.0.0.1:0","enr":"0xf88fb840a265ed80e2605099ff7573c1400c1e72f63aeba4a2ab3fa32bcd5983f0f0bd89046d176ca64735155279f50bfabb42326955276866cdb505549743cee3f0e7190183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1027b6be04d1749751b5092a9e161b023476c969249f8f813aaa7d55bb11ea59589","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"ZypWbHwq6x2R5u5OQ5hAUN+LlWDZI9YNwfsj+3OxoEY=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 672a56\npopulation: 31 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 ee2b c0ad d125 8284 | 60 e06f (0) eb01 (0) ea3d (0) efd6 (0)\n001 6 27b5 2d53 2803 0a21 | 30 0639 (0) 01a6 (0) 03eb (0) 034d (0)\n002 6 4d75 4589 4746 4775 | 20 459b (0) 4589 (0) 4775 (0) 4746 (0)\n003 5 75e2 72a7 72a5 7bcb | 9 7a68 (0) 7bcb (0) 7bee (0) 73d0 (0)\n004 3 6daa 6975 68a6 | 3 6daa (0) 6975 (0) 68a6 (0)\n005 2 62f0 6379 | 2 6379 (0) 62f0 (0)\n============ DEPTH: 6 ==========================================\n006 3 64e6 641a 6450 | 3 641a (0) 6450 (0) 64e6 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"672a566c7c2aeb1d91e6ee4e43984050df8b9560d923d60dc1fb23fb73b1a046","private_key":"310d5355dc6d53293d04e7e253fbbc07b4f8990b7da8ed4a43b288b8091dae9a","name":"node_672a566c7c2aeb1d91e6ee4e43984050df8b9560d923d60dc1fb23fb73b1a046","services":["streamer"],"enable_msg_events":true,"port":38621},"up":true}},{"node":{"info":{"id":"b4e29de4bd5751f31195ead8aa1548d305a53fb4f99be9931850e6273de8f359","name":"node_b4e29de4bd5751f31195ead8aa1548d305a53fb4f99be9931850e6273de8f359","enode":"enode://34eec1960cf31fc2dbdcebf909d70107e4589b1136173b360bd9428e5403683b9cbf3d075784c2059942ece65d262f429c184c07f0ca0b3e9cf609484e99b01f@127.0.0.1:0","enr":"0xf88fb840328330bce745f0a6aecebf965760649d16f77adfe7dc13e07094a7d3d2238d1304692cb5d4fbbac1caf45e4c5ca08e54fcfd1a30d2a8e9d6fefe7108a3355d010183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10334eec1960cf31fc2dbdcebf909d70107e4589b1136173b360bd9428e5403683b","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"tOKd5L1XUfMRlerYqhVI0wWlP7T5m+mTGFDmJz3o81k=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: b4e29d\npopulation: 38 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 4d75 5be6 5c62 7bee | 68 01a6 (0) 03eb (0) 034d (0) 0639 (0)\n001 11 d125 d18a d23c dd92 | 31 c52a (0) c2f9 (0) c0ad (0) ce01 (0)\n002 7 957e 9472 8b35 8fb8 | 9 8b35 (0) 8d3e (0) 8fb8 (0) 8012 (0)\n003 2 a192 a9fa | 6 aedc (0) acf8 (0) aba7 (0) a861 (0)\n004 8 b9d9 b869 bc29 bc71 | 9 b9d9 (0) b869 (0) be0f (0) bc29 (0)\n005 2 b355 b245 | 2 b245 (0) b355 (0)\n============ DEPTH: 6 ==========================================\n006 1 b60e | 1 b60e (0)\n007 1 b5fc | 1 b5fc (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"b4e29de4bd5751f31195ead8aa1548d305a53fb4f99be9931850e6273de8f359","private_key":"91d529071d81ab2bdb9e196080d3e71c4e0b1489d32f062fed6384af3da301ba","name":"node_b4e29de4bd5751f31195ead8aa1548d305a53fb4f99be9931850e6273de8f359","services":["streamer"],"enable_msg_events":true,"port":43795},"up":true}},{"node":{"info":{"id":"f611d8039385ad56260ab391763e3627aadd2756565fedc3ec95f76124da0efc","name":"node_f611d8039385ad56260ab391763e3627aadd2756565fedc3ec95f76124da0efc","enode":"enode://7c45bf66c718bd1786d40d630447ad12d162cab1cda004e9cda42d46e902793a21486f69dc05cbdf2668185e67b050e7a0201cb4795acf046008819e31bf0b3a@127.0.0.1:0","enr":"0xf88fb840ecb85cd88a5e53a505d6f8fc3bfba676551879609d7600f44cf989c3954b6b295b9001b005ec206366f0e2e2b4568301bdd7800a4931e26d253ea68cb93da85a0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1027c45bf66c718bd1786d40d630447ad12d162cab1cda004e9cda42d46e902793a","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"9hHYA5OFrVYmCrORdj42J6rdJ1ZWX+3D7JX3YSTaDvw=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: f611d8\npopulation: 45 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 8 27db 3775 641a 7bcb | 68 0639 (0) 01a6 (0) 03eb (0) 034d (0)\n001 16 8fb8 8330 836e 8284 | 29 9472 (0) 957e (0) 8b35 (0) 8d3e (0)\n002 7 d18a d23c deec dd92 | 14 c52a (0) c2f9 (0) c0ad (0) ce01 (0)\n003 6 e06f eb01 efd6 ee2b | 8 e06f (0) eb01 (0) ea3d (0) efd6 (0)\n004 3 fac8 fa9a fa65 | 3 fa65 (0) fa9a (0) fac8 (0)\n============ DEPTH: 5 ==========================================\n005 4 f33c f3d5 f177 f005 | 4 f177 (0) f005 (0) f33c (0) f3d5 (0)\n006 1 f4a0 | 1 f4a0 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"f611d8039385ad56260ab391763e3627aadd2756565fedc3ec95f76124da0efc","private_key":"7ab918155f49b16772c29096b650cf6baa603a51b6d2bde3aa338c699ac4bcff","name":"node_f611d8039385ad56260ab391763e3627aadd2756565fedc3ec95f76124da0efc","services":["streamer"],"enable_msg_events":true,"port":40431},"up":true}},{"node":{"info":{"id":"5c623fa0103108d0b1e24e6d01a6624ce3b59a9e7c422c45dfc1211676785542","name":"node_5c623fa0103108d0b1e24e6d01a6624ce3b59a9e7c422c45dfc1211676785542","enode":"enode://233c4654af0c29a6d9f1fd643f00e4c77b24df2f4a388dc96f185a6492c67af3875580e0e3df923cfc1857baf0933fcfc451fd1af522d0ae636212c787ac549a@127.0.0.1:0","enr":"0xf88fb8409ba9b9726a6f75d6349a441f7afacdfcd153e89635e530e301aba363979b95be152ab2b042540762f8e738257928ed7cb0e1dcc276af3f5a178dc3cdf78733c70183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102233c4654af0c29a6d9f1fd643f00e4c77b24df2f4a388dc96f185a6492c67af3","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"XGI/oBAxCNCx4k5tAaZiTOO1mp58QixF38EhFnZ4VUI=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 5c623f\npopulation: 37 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 10 8fb8 957e b245 b4e2 | 60 8b35 (0) 8d3e (0) 8fb8 (0) 8012 (0)\n001 7 1929 184e 2471 27b5 | 30 03eb (0) 034d (0) 01a6 (0) 0639 (0)\n002 4 75e2 72a5 6379 672a | 18 7a68 (0) 7bcb (0) 7bee (0) 73d0 (0)\n003 8 4bc8 4a37 4a3c 4efa | 11 4cc2 (0) 4c21 (0) 4d75 (0) 4efa (0)\n004 4 55fd 5008 51c2 52b4 | 4 55fd (0) 5008 (0) 51c2 (0) 52b4 (0)\n============ DEPTH: 5 ==========================================\n005 3 58a9 5a8b 5be6 | 3 58a9 (0) 5a8b (0) 5be6 (0)\n006 0 | 0\n007 0 | 0\n008 1 5cc1 | 1 5cc1 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"5c623fa0103108d0b1e24e6d01a6624ce3b59a9e7c422c45dfc1211676785542","private_key":"59601d5a451dc893a0eacd7c9a58064f127f7a6006cb91d3ce285e840eba9ccb","name":"node_5c623fa0103108d0b1e24e6d01a6624ce3b59a9e7c422c45dfc1211676785542","services":["streamer"],"enable_msg_events":true,"port":44553},"up":true}},{"node":{"info":{"id":"4746379212b91ee1c13c1336e8f3a73a84408b7636c222c11bd27ce7d724e6c6","name":"node_4746379212b91ee1c13c1336e8f3a73a84408b7636c222c11bd27ce7d724e6c6","enode":"enode://da0cf3977228d65352ccef3b882334d901b72fbb167e3f5b4c45f62e52526ed3eb3d50ec8227e9d6b8c14a9d43a769265337e2a228575b810b885e3db5eb2f49@127.0.0.1:0","enr":"0xf88fb84051a2a5e0e8760be8f291be6f24a97796a1aee5a826d1d5b7b7736aba877749a15622871be3c2e8363c03a126114650ad0459f143f01b34abc25b3c1c909a34d50183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103da0cf3977228d65352ccef3b882334d901b72fbb167e3f5b4c45f62e52526ed3","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"R0Y3khK5HuHBPBM26POnOoRAi3Y2wiLBG9J859ck5sY=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 474637\npopulation: 30 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 7 b245 ce01 fac8 f4a0 | 60 9472 (0) 957e (0) 8b35 (0) 8d3e (0)\n001 7 184e 1929 127c 0e34 | 30 0639 (0) 01a6 (0) 03eb (0) 034d (0)\n002 4 672a 64e6 72a5 75e2 | 18 7a68 (0) 7bcb (0) 7bee (0) 73d0 (0)\n003 2 51c2 5c62 | 9 55fd (0) 5008 (0) 51c2 (0) 52b4 (0)\n004 7 4bc8 4a37 4a3c 4efa | 7 4cc2 (0) 4c21 (0) 4d75 (0) 4efa (0)\n============ DEPTH: 5 ==========================================\n005 0 | 0\n006 2 459b 4589 | 2 459b (0) 4589 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 1 4775 | 1 4775 (0)\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"4746379212b91ee1c13c1336e8f3a73a84408b7636c222c11bd27ce7d724e6c6","private_key":"7f51642b5475141f99f5c1b1ae83d37f562df9bc05930b615f2d9e36c631eb09","name":"node_4746379212b91ee1c13c1336e8f3a73a84408b7636c222c11bd27ce7d724e6c6","services":["streamer"],"enable_msg_events":true,"port":42479},"up":true}},{"node":{"info":{"id":"ed2ec6681bf325887768703779ccf3a6278731118cd3ec890490a3de50f689ac","name":"node_ed2ec6681bf325887768703779ccf3a6278731118cd3ec890490a3de50f689ac","enode":"enode://69f46f822ed108a3341c1b99942e66e6fdcd74e0d37a20ab54831a0ef22b1686782dd6547d34e038a8402a5d39fca494365e445c5e24646340677ee07478b1d1@127.0.0.1:0","enr":"0xf88fb8403cf3999ab1acccd527ca14d5712142e6de9dbe055b041c09ed9a97c8c904c3615dd568f79fba4871ebba52e4d28fc8645c9db1fe5fa6bcb3534dc7ed8079b5d80183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10369f46f822ed108a3341c1b99942e66e6fdcd74e0d37a20ab54831a0ef22b1686","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"7S7GaBvzJYh3aHA3eczzpieHMRGM0+yJBJCj3lD2iaw=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: ed2ec6\npopulation: 34 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 3775 36d5 72a7 4589 | 68 0639 (0) 03eb (0) 034d (0) 01a6 (0)\n001 4 b355 b869 be0f bde9 | 29 9472 (0) 957e (0) 8b35 (0) 8d3e (0)\n002 10 d23c d18a d125 dd92 | 14 c52a (0) c2f9 (0) c0ad (0) ce01 (0)\n003 8 fa65 fa9a fac8 f33c | 9 fa65 (0) fa9a (0) fac8 (0) f177 (0)\n004 1 e06f | 1 e06f (0)\n005 2 eb01 ea3d | 2 eb01 (0) ea3d (0)\n006 2 efd6 ee2b | 2 efd6 (0) ee2b (0)\n============ DEPTH: 7 ==========================================\n007 1 eceb | 1 eceb (0)\n008 0 | 0\n009 0 | 0\n010 1 ed12 | 1 ed12 (0)\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"ed2ec6681bf325887768703779ccf3a6278731118cd3ec890490a3de50f689ac","private_key":"1f0f2deaf715e265a0dc7e04ebce7f7ab8f71ce370739dbb27f3a69c46cf5ed5","name":"node_ed2ec6681bf325887768703779ccf3a6278731118cd3ec890490a3de50f689ac","services":["streamer"],"enable_msg_events":true,"port":36339},"up":true}},{"node":{"info":{"id":"36d5952685c95e42bef14f77b63705897ca71d24d21e4e9efc772d9cabd21122","name":"node_36d5952685c95e42bef14f77b63705897ca71d24d21e4e9efc772d9cabd21122","enode":"enode://ece93da9ec83a6c37b2bd0240c13c80cf1a175d1883e1881c7cc9122756be72dc17964a01f72b5e570f8948296665c11f34a28691feb337825be71830dd71aa4@127.0.0.1:0","enr":"0xf88fb8400bb1875a3bb9340c4f3442f8cb86cc57892d5c1f6f6149b97ce85a88fe97d6bf3fcef5348de2c000530c8320f52890fd28a31a6393aa7f7d304e3574646bf6ac0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102ece93da9ec83a6c37b2bd0240c13c80cf1a175d1883e1881c7cc9122756be72d","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"NtWVJoXJXkK+8U93tjcFiXynHSTSHk6e/HctnKvSESI=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 36d595\npopulation: 34 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 f005 e06f ed2e d23c | 60 9472 (0) 957e (0) 8d3e (0) 8fb8 (0)\n001 10 64e6 7bee 4d75 4a37 | 38 7a68 (0) 7bcb (0) 7bee (0) 73d0 (0)\n002 5 0e34 0a21 127c 1929 | 13 01a6 (0) 03eb (0) 034d (0) 0639 (0)\n003 9 21dc 216e 2354 2471 | 11 2dd4 (0) 2d53 (0) 2803 (0) 21dc (0)\n004 3 3e19 3871 3b83 | 3 3871 (0) 3b83 (0) 3e19 (0)\n============ DEPTH: 5 ==========================================\n005 0 | 0\n006 1 3590 | 1 3590 (0)\n007 1 3775 | 1 3775 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"36d5952685c95e42bef14f77b63705897ca71d24d21e4e9efc772d9cabd21122","private_key":"6f7f6fa8cf239e96150cce6db5caa458629888f8f5f726b8cc6bbcbe09dfcb2c","name":"node_36d5952685c95e42bef14f77b63705897ca71d24d21e4e9efc772d9cabd21122","services":["streamer"],"enable_msg_events":true,"port":34495},"up":true}},{"node":{"info":{"id":"cabfdfb789cc20962eaba1dbe68d6dc0466e699d22dc5b29f27a5cd555398795","name":"node_cabfdfb789cc20962eaba1dbe68d6dc0466e699d22dc5b29f27a5cd555398795","enode":"enode://49eae8779e617a7104cbd74223738ff9b987295433994660ab89955cd4e1fb8bbce3608ed7e0acb995c78f652e038d6b6ae87a9ce968bd82de552f8b86994ff2@127.0.0.1:0","enr":"0xf88fb840c2b4c4f501dbf7f98654d927a7fb975ad27786b3cbc874c1994dfc8cd97b89522e882d0fc4258d3d6c928f131df7e96aff65485d5b56a5f54d0e0938ea80751f0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10249eae8779e617a7104cbd74223738ff9b987295433994660ab89955cd4e1fb8b","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"yr/ft4nMIJYuq6Hb5o1twEZuaZ0i3Fsp8npc1VU5h5U=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: cabfdf\npopulation: 28 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 52b4 36d5 | 68 6daa (0) 6975 (0) 68a6 (0) 6379 (0)\n001 9 8012 8330 b4e2 bd96 | 29 9472 (0) 957e (0) 8b35 (0) 8d3e (0)\n002 6 fa65 f611 f3d5 efd6 | 17 fa65 (0) fa9a (0) fac8 (0) f177 (0)\n003 4 dd92 d125 d18a d23c | 6 d9d3 (0) deec (0) dd92 (0) d18a (0)\n004 3 c52a c2f9 c0ad | 3 c52a (0) c2f9 (0) c0ad (0)\n============ DEPTH: 5 ==========================================\n005 3 ce01 cc9f cc5f | 3 ce01 (0) cc9f (0) cc5f (0)\n006 1 c9ef | 1 c9ef (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"cabfdfb789cc20962eaba1dbe68d6dc0466e699d22dc5b29f27a5cd555398795","private_key":"50c1b7e67b07c5e3e977aa0690b20a2bcc1ffea472bef560311f987eda352d1d","name":"node_cabfdfb789cc20962eaba1dbe68d6dc0466e699d22dc5b29f27a5cd555398795","services":["streamer"],"enable_msg_events":true,"port":32801},"up":true}},{"node":{"info":{"id":"d23c97bebcde26f5e351c4b975c76aaf604fd206f9b9063ecbda538e7a52f514","name":"node_d23c97bebcde26f5e351c4b975c76aaf604fd206f9b9063ecbda538e7a52f514","enode":"enode://59e6798c8baabbf319576e50e1a709538aa094df1468e5a787b1593fc175622fdb8c56a5b1fea1b6ddfdb8099c602aa7d542cfcc0736b0f8e90761c1672a0057@127.0.0.1:0","enr":"0xf88fb8406107c3f070686e09872ca8a041ab9bbb404d2aca874e09f6dc628aa7efcfe23f671b20e5d229ff36fce675f9954b02e453337d800619251a0ffa0a997c4604ed0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10359e6798c8baabbf319576e50e1a709538aa094df1468e5a787b1593fc175622f","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"0jyXvrzeJvXjUcS5dcdqr2BP0gb5uQY+y9pTjnpS9RQ=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: d23c97\npopulation: 33 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 9 3e19 36d5 184e 1929 | 68 0639 (0) 034d (0) 03eb (0) 01a6 (0)\n001 6 8284 8012 957e b4e2 | 29 9472 (0) 957e (0) 8b35 (0) 8fb8 (0)\n002 7 ea3d ed12 ed2e efd6 | 17 f177 (0) f005 (0) f33c (0) f3d5 (0)\n003 6 c2f9 c0ad ce01 cc5f | 8 c52a (0) c2f9 (0) c0ad (0) ce01 (0)\n004 3 d9d3 deec dd92 | 3 d9d3 (0) deec (0) dd92 (0)\n============ DEPTH: 5 ==========================================\n005 0 | 0\n006 2 d18a d125 | 2 d18a (0) d125 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"d23c97bebcde26f5e351c4b975c76aaf604fd206f9b9063ecbda538e7a52f514","private_key":"7ef7bc7466fca587aab3f839ece8ec307619523af4dc22ab14b3129c81978144","name":"node_d23c97bebcde26f5e351c4b975c76aaf604fd206f9b9063ecbda538e7a52f514","services":["streamer"],"enable_msg_events":true,"port":39477},"up":true}},{"node":{"info":{"id":"a1929f704664ca85d829ac3bab62e688647a7cfdcbc9f03c61b0124cf9093505","name":"node_a1929f704664ca85d829ac3bab62e688647a7cfdcbc9f03c61b0124cf9093505","enode":"enode://3c5d51d426ffa9069eae24c2f0c108b2f543255bbef13b8ddf2a2dfdd34bf1fee87505e6163e90fa9f7432ec9865f90490aefc0bbd8049fddf18d8eecd8bb076@127.0.0.1:0","enr":"0xf88fb840c935263f2fe7bcceed68a1f97aa98b1f4898056415975bfe6af3a937a3e8afbc664cfe541a801aa79c8a84efac3ec10512e3c34b32d5fa16b9383f850a5ca9bc0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1023c5d51d426ffa9069eae24c2f0c108b2f543255bbef13b8ddf2a2dfdd34bf1fe","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"oZKfcEZkyoXYKaw7q2LmiGR6fP3LyfA8YbASTPkJNQU=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: a1929f\npopulation: 35 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 7 2471 184e 68a6 6450 | 68 0639 (0) 034d (0) 03eb (0) 01a6 (0)\n001 11 ee2b ea3d e06f f611 | 31 f177 (0) f005 (0) f33c (0) f3d5 (0)\n002 3 9472 8012 8330 | 9 957e (0) 9472 (0) 8b35 (0) 8d3e (0)\n003 9 b355 b245 b4e2 bde9 | 14 b245 (0) b355 (0) b60e (0) b5fc (0)\n============ DEPTH: 4 ==========================================\n004 5 aba7 a9fa a861 aedc | 5 aedc (0) acf8 (0) aba7 (0) a861 (0)\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"a1929f704664ca85d829ac3bab62e688647a7cfdcbc9f03c61b0124cf9093505","private_key":"9037f029de76f869c02e95928a58d061068ff690b7a5ce42fe021987910ec074","name":"node_a1929f704664ca85d829ac3bab62e688647a7cfdcbc9f03c61b0124cf9093505","services":["streamer"],"enable_msg_events":true,"port":42239},"up":true}},{"node":{"info":{"id":"52b47d52bf4a1afda1604b7942019c8d2ac4c760c5eb4597e1ce2dd7a8e1cf4d","name":"node_52b47d52bf4a1afda1604b7942019c8d2ac4c760c5eb4597e1ce2dd7a8e1cf4d","enode":"enode://fc05173b55aa81517b3ac06d2d7c2c6a7f3ce4a2b37780ab5111f90a2d537c3081147d82c05d274eee69f1576a40da8d1065dd9f951547cb1c072f2748bae488@127.0.0.1:0","enr":"0xf88fb840b0c717a2ac8079ccf35009302f2fdb71fc7d427791e0db68bd05457b484f738c6c8cba664f215e4772f08a743818e428827b0dbb2e2b213bd427367bd64659900183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102fc05173b55aa81517b3ac06d2d7c2c6a7f3ce4a2b37780ab5111f90a2d537c30","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"UrR9Ur9KGv2hYEt5QgGcjSrEx2DF60WX4c4t16jhz00=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 52b47d\npopulation: 30 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 cabf d23c fac8 ea3d | 60 c52a (0) c2f9 (0) c0ad (0) ce01 (0)\n001 4 2803 36d5 3e19 184e | 30 03eb (0) 034d (0) 01a6 (0) 0639 (0)\n002 7 7bee 75e2 72a5 68a6 | 18 7a68 (0) 7bcb (0) 7bee (0) 73d0 (0)\n003 6 4efa 4c21 4d75 4bc8 | 11 4cc2 (0) 4c21 (0) 4d75 (0) 4efa (0)\n004 4 5be6 5a8b 5cc1 5c62 | 5 58a9 (0) 5be6 (0) 5a8b (0) 5cc1 (0)\n005 1 55fd | 1 55fd (0)\n============ DEPTH: 6 ==========================================\n006 2 5008 51c2 | 2 5008 (0) 51c2 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"52b47d52bf4a1afda1604b7942019c8d2ac4c760c5eb4597e1ce2dd7a8e1cf4d","private_key":"a160ffd0d147d08006e444e85b70fb9e8f982c3e0a7ad72f8005d6a040a65682","name":"node_52b47d52bf4a1afda1604b7942019c8d2ac4c760c5eb4597e1ce2dd7a8e1cf4d","services":["streamer"],"enable_msg_events":true,"port":37611},"up":true}},{"node":{"info":{"id":"e06f58b144faa650f96465825d253b63d7e061e3a3c4228ad5e1b665afbccc37","name":"node_e06f58b144faa650f96465825d253b63d7e061e3a3c4228ad5e1b665afbccc37","enode":"enode://c527957ba9cb7743e768b25580478414c9740bf57540523a69f55a7e40c6e1d5f2f53b2d72c9e017219e008e4c68cc9f6f9209d12dbe5e617557b73b0c465cab@127.0.0.1:0","enr":"0xf88fb84055bcf73035487cb5632f8ed4d3f298da2d47da173342acd58a537bec7b17f1981d6d0060dff9891b4f3b79168a713b0ea134bf4a724cea40a0a0a20e9df661980183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103c527957ba9cb7743e768b25580478414c9740bf57540523a69f55a7e40c6e1d5","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"4G9YsUT6plD5ZGWCXSU7Y9fgYeOjxCKK1eG2Za+8zDc=","hive":"\n=========================================================================\nThu Feb 28 18:08:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: e06f58\npopulation: 33 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 12 2d53 2803 3e19 36d5 | 68 0639 (0) 03eb (0) 034d (0) 01a6 (0)\n001 7 836e bde9 b4e2 b245 | 29 9472 (0) 957e (0) 8b35 (0) 8d3e (0)\n002 3 d18a d125 dd92 | 14 c52a (0) c2f9 (0) c0ad (0) ce01 (0)\n003 4 fa65 f611 f177 f3d5 | 9 f177 (0) f005 (0) f33c (0) f3d5 (0)\n============ DEPTH: 4 ==========================================\n004 7 ea3d eb01 efd6 ee2b | 7 efd6 (0) ee2b (0) eceb (0) ed12 (0)\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"e06f58b144faa650f96465825d253b63d7e061e3a3c4228ad5e1b665afbccc37","private_key":"1fb267b5c56dc43486cd338b223dbdd81bbe0d2ca10ce150e87fafd8ea7fb55d","name":"node_e06f58b144faa650f96465825d253b63d7e061e3a3c4228ad5e1b665afbccc37","services":["streamer"],"enable_msg_events":true,"port":36611},"up":true}}],"conns":[{"one":"dd92b3d42414fd5eff5c1e4ca55c63cd7036634049995b72a20cdf7ca1321978","other":"fac808b79923931febd54e3611b79811b3973c777e7502bd56b9803d0c4bf785","up":true},{"one":"fac808b79923931febd54e3611b79811b3973c777e7502bd56b9803d0c4bf785","other":"b8695bec6c8e1e6794bb943b83629cd2c910067e6e178f6f8e33c4f0fa2d74f4","up":true},{"one":"b8695bec6c8e1e6794bb943b83629cd2c910067e6e178f6f8e33c4f0fa2d74f4","other":"72a53f0fb1b51855cb4054a39cbd1309a76a862d36e18af9ba0456a60325c06e","up":true},{"one":"72a53f0fb1b51855cb4054a39cbd1309a76a862d36e18af9ba0456a60325c06e","other":"f3d50811ef10661d3ef9978077cd7181387298f306833ab6e27f25cbb77435cd","up":true},{"one":"f3d50811ef10661d3ef9978077cd7181387298f306833ab6e27f25cbb77435cd","other":"3e1959b29bbacb3ce7dccfa41c3e51b87f1afc700a3c6e4713c38cc0fe3790df","up":true},{"one":"3e1959b29bbacb3ce7dccfa41c3e51b87f1afc700a3c6e4713c38cc0fe3790df","other":"fa655b4882579e65937a14ab1c6bcba021580f0a5ebc04c48424f5ae72b7d5b4","up":true},{"one":"fa655b4882579e65937a14ab1c6bcba021580f0a5ebc04c48424f5ae72b7d5b4","other":"2471776037d55a05df2b15bcefe52cb1f4c942e9e15113abc2a0c1fcbaa5d626","up":true},{"one":"2471776037d55a05df2b15bcefe52cb1f4c942e9e15113abc2a0c1fcbaa5d626","other":"27b56302a89605a83563ba7b66d491ec25edfad0ea1010937fcadeab4d3ae582","up":true},{"one":"27b56302a89605a83563ba7b66d491ec25edfad0ea1010937fcadeab4d3ae582","other":"ea3d6aa50ad5a1d5647d213f9b5cfe6718339eec7eef8644487eb3c223c7bcde","up":true},{"one":"ea3d6aa50ad5a1d5647d213f9b5cfe6718339eec7eef8644487eb3c223c7bcde","other":"f4a0f76b30bcf5987cfa3f4f4b0aa3445f39d60a1f51519fa660c27b5d833dde","up":true},{"one":"f4a0f76b30bcf5987cfa3f4f4b0aa3445f39d60a1f51519fa660c27b5d833dde","other":"184e9e00ab4fe1669d4d99fb33d418d33eff927da38cc997f69679443c24b20b","up":true},{"one":"184e9e00ab4fe1669d4d99fb33d418d33eff927da38cc997f69679443c24b20b","other":"64e642de2667a7563c774050d368858d99aff433efbd1cb68361e3e244629b03","up":true},{"one":"64e642de2667a7563c774050d368858d99aff433efbd1cb68361e3e244629b03","other":"bc71f3e409edb989e26607448491530c5451053b582ea64d882525451ac940bb","up":true},{"one":"bc71f3e409edb989e26607448491530c5451053b582ea64d882525451ac940bb","other":"75e282c0f3d355a40573e6578c5aac98e7262970a9239f4dcefd26d6f008b553","up":true},{"one":"75e282c0f3d355a40573e6578c5aac98e7262970a9239f4dcefd26d6f008b553","other":"cc5fa2d49210e240983b0853ff15003f0d366f05cb1f6486bae2862cca852cc5","up":true},{"one":"cc5fa2d49210e240983b0853ff15003f0d366f05cb1f6486bae2862cca852cc5","other":"68a63ebc4833dedfdb6d534438ffcccd042f60434bee0e39f4cb3726e7413e7a","up":true},{"one":"68a63ebc4833dedfdb6d534438ffcccd042f60434bee0e39f4cb3726e7413e7a","other":"4a3c39f044c425c153d4900db30f839d7866c8e0f4f4d38d9205e67fb540988e","up":true},{"one":"4a3c39f044c425c153d4900db30f839d7866c8e0f4f4d38d9205e67fb540988e","other":"8330e2b8ae2f184bb8dc5e153fafa4dafe86f84ec692d3ee91413cc07b1cd9e2","up":true},{"one":"8330e2b8ae2f184bb8dc5e153fafa4dafe86f84ec692d3ee91413cc07b1cd9e2","other":"b2453c6e755a30efb91194fa607b3352d75b6905c448b09af4aeadf3a445b633","up":true},{"one":"b2453c6e755a30efb91194fa607b3352d75b6905c448b09af4aeadf3a445b633","other":"c0adf394af7d5670c1ce8c6bea292fbc03c56ae2b636e2f303311a455bb3500f","up":true},{"one":"c0adf394af7d5670c1ce8c6bea292fbc03c56ae2b636e2f303311a455bb3500f","other":"2d531c50183f0115269b3feaecf45927a3ac44e1be2a263c7e5d2274d8379b1c","up":true},{"one":"2d531c50183f0115269b3feaecf45927a3ac44e1be2a263c7e5d2274d8379b1c","other":"ee2b0aff61a9846d13de3a72712ef0bf3ca42ad8da57e81759c242797258efec","up":true},{"one":"ee2b0aff61a9846d13de3a72712ef0bf3ca42ad8da57e81759c242797258efec","other":"8012a7af71d76d882202cf9372523478ccebea23443006c7f29c2a83106cd1b3","up":true},{"one":"8012a7af71d76d882202cf9372523478ccebea23443006c7f29c2a83106cd1b3","other":"47753fdca855ea79abf667b50aa9c90a132d44bdd1572c3e3c411c8ee7e5b5f4","up":true},{"one":"47753fdca855ea79abf667b50aa9c90a132d44bdd1572c3e3c411c8ee7e5b5f4","other":"efd68d2c99346ca085c9ef896bee6125ad8638413295108f3a92b247a41ca629","up":true},{"one":"efd68d2c99346ca085c9ef896bee6125ad8638413295108f3a92b247a41ca629","other":"127c89eae94b195df2eb5eb7b44f634adb73c114d2089cd904b56988c8674e11","up":true},{"one":"127c89eae94b195df2eb5eb7b44f634adb73c114d2089cd904b56988c8674e11","other":"69753865aacaaf72d9bf6d265c885d3f705804ff4b2675f7aa860641dacab2a0","up":true},{"one":"69753865aacaaf72d9bf6d265c885d3f705804ff4b2675f7aa860641dacab2a0","other":"bd9607d5f57f7b6f74f4ad981be368988ef48b5f31e3fd96cab3bb790d568150","up":true},{"one":"bd9607d5f57f7b6f74f4ad981be368988ef48b5f31e3fd96cab3bb790d568150","other":"45895aff674079f6be02e4cc74914d63125c3fe48bb69056c070c71319fea1fa","up":true},{"one":"45895aff674079f6be02e4cc74914d63125c3fe48bb69056c070c71319fea1fa","other":"0a215c7765be2caebf76ad3e8017bbc2aaadf8e0dd4859af781953a0564c5d59","up":true},{"one":"0a215c7765be2caebf76ad3e8017bbc2aaadf8e0dd4859af781953a0564c5d59","other":"0e344c6e27c23bd36bdd3ddcefa4e577fdc9461e52c7ce20135733a08b987b82","up":true},{"one":"0e344c6e27c23bd36bdd3ddcefa4e577fdc9461e52c7ce20135733a08b987b82","other":"836e65dfe6f01e1d2934655c1846cb86fed6e41ea951a109d7a20bb14cb4c10a","up":true},{"one":"836e65dfe6f01e1d2934655c1846cb86fed6e41ea951a109d7a20bb14cb4c10a","other":"cc9f65d734f1a3bbc6019e166fe355bd7fc33bb4887043a5ccf532a9ba356379","up":true},{"one":"cc9f65d734f1a3bbc6019e166fe355bd7fc33bb4887043a5ccf532a9ba356379","other":"eb01ff80307afbfc7457c96594cd4ba4d00acb7fd25a7571d1223168bd66ff09","up":true},{"one":"eb01ff80307afbfc7457c96594cd4ba4d00acb7fd25a7571d1223168bd66ff09","other":"08077c0ce8d4130c14464493e9164a8bae61b4646b1ec48899e75f2f6f9b8c66","up":true},{"one":"08077c0ce8d4130c14464493e9164a8bae61b4646b1ec48899e75f2f6f9b8c66","other":"a86117147b78f20a6d883d37715da85178cad89eff650a74aa89e7bc11bc45a7","up":true},{"one":"a86117147b78f20a6d883d37715da85178cad89eff650a74aa89e7bc11bc45a7","other":"5008ef55ad8088f70643b0f93bcb479531bcb0afe8e01b215dbf8597ec866369","up":true},{"one":"5008ef55ad8088f70643b0f93bcb479531bcb0afe8e01b215dbf8597ec866369","other":"d9d30b9b212bd4811a44ebe304ba3935ead3abe3247f99893faf65664131c29d","up":true},{"one":"d9d30b9b212bd4811a44ebe304ba3935ead3abe3247f99893faf65664131c29d","other":"03eb2e92ed0923f696269e7a03fec731d8c3f8df278023a9cb00867b533a3ca3","up":true},{"one":"03eb2e92ed0923f696269e7a03fec731d8c3f8df278023a9cb00867b533a3ca3","other":"5a8ba4047c4456e825bd1b34c961f5c7f37bf7c27bc48bee71b8430c7d135486","up":true},{"one":"5a8ba4047c4456e825bd1b34c961f5c7f37bf7c27bc48bee71b8430c7d135486","other":"2354d3af5c6dca05d7dc212b100112f37ab29fb8b3f4319887230a4d420f5d9d","up":true},{"one":"2354d3af5c6dca05d7dc212b100112f37ab29fb8b3f4319887230a4d420f5d9d","other":"17406dea5046f00e27eaf74e166a945c9485139d6edcdfcd84f5b03f50eedd0a","up":true},{"one":"17406dea5046f00e27eaf74e166a945c9485139d6edcdfcd84f5b03f50eedd0a","other":"01a63575c384f686e5739e1bd079e4a4c55421cd6d89b944e2c61dd174fa2bf6","up":true},{"one":"01a63575c384f686e5739e1bd079e4a4c55421cd6d89b944e2c61dd174fa2bf6","other":"acf888ed781f5358493e2e5048691acc39eac3240ca9e9093bb4052b1f624325","up":true},{"one":"acf888ed781f5358493e2e5048691acc39eac3240ca9e9093bb4052b1f624325","other":"0f3106adfe70aefb474c4a98a95932307391de2cb70fbd2e11dd31c9e695ed83","up":true},{"one":"0f3106adfe70aefb474c4a98a95932307391de2cb70fbd2e11dd31c9e695ed83","other":"62f007c92a8af466e90ed0b1e5e71a955ad273ec793948ddfc03977f131ed2d1","up":true},{"one":"62f007c92a8af466e90ed0b1e5e71a955ad273ec793948ddfc03977f131ed2d1","other":"b9d906e406b0fc6078c22bbc173043df1f7581061b4f6ccd769bc568d94b4339","up":true},{"one":"b9d906e406b0fc6078c22bbc173043df1f7581061b4f6ccd769bc568d94b4339","other":"eceb7dc532596e8b68074113db9605e3d15cb15e2e80f75f1a66d95a1221c7dc","up":true},{"one":"eceb7dc532596e8b68074113db9605e3d15cb15e2e80f75f1a66d95a1221c7dc","other":"c2f9b4abed9c6a839fe4c03a80bd396fd187a8784ba47a83687d3a54b7e2eddf","up":true},{"one":"c2f9b4abed9c6a839fe4c03a80bd396fd187a8784ba47a83687d3a54b7e2eddf","other":"c9ef56afed2d40db396ad39d6f5f5f38f4058b6b0d1e02b71d6aa92dbeaf7df7","up":true},{"one":"c9ef56afed2d40db396ad39d6f5f5f38f4058b6b0d1e02b71d6aa92dbeaf7df7","other":"fa9a809f016097d949fa1463a1c8f08871c7d38e60b7df6d3e28ab04ccd3a143","up":true},{"one":"fa9a809f016097d949fa1463a1c8f08871c7d38e60b7df6d3e28ab04ccd3a143","other":"55fdad03303a746920773217c568a37d2004869ff34096fbe45197f71eba2b63","up":true},{"one":"55fdad03303a746920773217c568a37d2004869ff34096fbe45197f71eba2b63","other":"22bbb3236a5e0a1947a1c4735aaacf9122173789a02a06e7653103bdcae2f823","up":true},{"one":"22bbb3236a5e0a1947a1c4735aaacf9122173789a02a06e7653103bdcae2f823","other":"77eedcac0c847b1d693ddff07c5868afb1c2008b2dcb48a0299143ab14611969","up":true},{"one":"77eedcac0c847b1d693ddff07c5868afb1c2008b2dcb48a0299143ab14611969","other":"8d3e0d9c6932d3422024394998e943309b679d667394d0eb622f0e208e7fcf0a","up":true},{"one":"8d3e0d9c6932d3422024394998e943309b679d667394d0eb622f0e208e7fcf0a","other":"c52a68d8388a21013e4eecef9ea866db1f5eb16bbe0ecc82b8bfafd33e4e014f","up":true},{"one":"c52a68d8388a21013e4eecef9ea866db1f5eb16bbe0ecc82b8bfafd33e4e014f","other":"3871492c8c62cd74cbe65a993669e4978cc641879a5223dd6b9e687f050a1c40","up":true},{"one":"3871492c8c62cd74cbe65a993669e4978cc641879a5223dd6b9e687f050a1c40","other":"aedc9b478204effdcbad1a892333f15c061fbd1423b370f8a50f929b2a2f6952","up":true},{"one":"aedc9b478204effdcbad1a892333f15c061fbd1423b370f8a50f929b2a2f6952","other":"216e0370111e2e03927b803ae788f9947de8e241d41dbf6a70983cf0ecd68af1","up":true},{"one":"216e0370111e2e03927b803ae788f9947de8e241d41dbf6a70983cf0ecd68af1","other":"73d0d1d4a2b7250f51e57c13cc48bc6b20682320ce12ee8e5765afeef7d9de42","up":true},{"one":"73d0d1d4a2b7250f51e57c13cc48bc6b20682320ce12ee8e5765afeef7d9de42","other":"f33c07a818863a358358989ec71504abad3ca0a7c81b54aad59075a766fad501","up":true},{"one":"f33c07a818863a358358989ec71504abad3ca0a7c81b54aad59075a766fad501","other":"3b830c2ae5463ca2f2260176b77b8dda23048257aa780255c69cf1bbbc6fb64c","up":true},{"one":"3b830c2ae5463ca2f2260176b77b8dda23048257aa780255c69cf1bbbc6fb64c","other":"b60e77c40ddc9dc78a4ad346add37e60f10f2999de836615db53524487d1ede9","up":true},{"one":"b60e77c40ddc9dc78a4ad346add37e60f10f2999de836615db53524487d1ede9","other":"b5fc43e8c0df3279d6a12cd8b03012cb8d2205208324018c7ae725745a99a2f3","up":true},{"one":"b5fc43e8c0df3279d6a12cd8b03012cb8d2205208324018c7ae725745a99a2f3","other":"0639f010834f5bc497798f2d275bbc60bfbcd53c83e38986b7260310c6001420","up":true},{"one":"0639f010834f5bc497798f2d275bbc60bfbcd53c83e38986b7260310c6001420","other":"221cd8ea0a26f0d3f81f782f1de390282415ecd9cf40224b4945a00897895b4e","up":true},{"one":"221cd8ea0a26f0d3f81f782f1de390282415ecd9cf40224b4945a00897895b4e","other":"2dd4ad83effc3ba73e72f5659583e5987241bda563563200b50c46cce00a1d9b","up":true},{"one":"2dd4ad83effc3ba73e72f5659583e5987241bda563563200b50c46cce00a1d9b","other":"459b9fb2b7f4e396de8cf8740a6804c8e5b96ca11ffa2b5106c14dfbbab65c95","up":true},{"one":"459b9fb2b7f4e396de8cf8740a6804c8e5b96ca11ffa2b5106c14dfbbab65c95","other":"58a90b58858417a4e972626421ed8e78b1b3e5ac69fcedd22c58a8ab4c6147df","up":true},{"one":"58a90b58858417a4e972626421ed8e78b1b3e5ac69fcedd22c58a8ab4c6147df","other":"be0fb2b440b91e719c20f51b673eb9f2f66c7af77b0b0ade312998cdffcc5045","up":true},{"one":"be0fb2b440b91e719c20f51b673eb9f2f66c7af77b0b0ade312998cdffcc5045","other":"deec6a8beb4e5e441dd42311354194c3bef9448e8859b4ccd401645b69217d12","up":true},{"one":"deec6a8beb4e5e441dd42311354194c3bef9448e8859b4ccd401645b69217d12","other":"13853407d278a45e15d4b148fc38ebb35c4f58ee552ee0e4401c6c98c45b8e3e","up":true},{"one":"13853407d278a45e15d4b148fc38ebb35c4f58ee552ee0e4401c6c98c45b8e3e","other":"aba793e635f71169105ad073225cc8db914de6b711fe9f22c5d94ac8cb85e2eb","up":true},{"one":"aba793e635f71169105ad073225cc8db914de6b711fe9f22c5d94ac8cb85e2eb","other":"772a79302528fdce6a216c98c95e281333292c81dfe490aeaa4a78bfeb1980c8","up":true},{"one":"772a79302528fdce6a216c98c95e281333292c81dfe490aeaa4a78bfeb1980c8","other":"7a68fa44bbec187272e2d5dfbd6ed8af31a1a365aa72aa50db02350ebe98c859","up":true},{"one":"7a68fa44bbec187272e2d5dfbd6ed8af31a1a365aa72aa50db02350ebe98c859","other":"034de66774eda26b93e342c9b94b9deaeb6297650c819b144a5832bebfe6b02f","up":true},{"one":"034de66774eda26b93e342c9b94b9deaeb6297650c819b144a5832bebfe6b02f","other":"72a76f668d9b923914860eb4f8577bc98c153f6dd222cd36a0bbdef2bab7f068","up":true},{"one":"72a76f668d9b923914860eb4f8577bc98c153f6dd222cd36a0bbdef2bab7f068","other":"bd486e1e15df4c7539b1ad5b54f7566dd4836a430e9f7d3503881fa79e258d9b","up":true},{"one":"bd486e1e15df4c7539b1ad5b54f7566dd4836a430e9f7d3503881fa79e258d9b","other":"4c211c117e555c2ac831d5688615b6b4c5e31f1d7c7906b34f0cbcdbc45482b4","up":true},{"one":"4c211c117e555c2ac831d5688615b6b4c5e31f1d7c7906b34f0cbcdbc45482b4","other":"21dcfb893a54cb56d21355fc564583057fc51b32503a8627e7575660725a7627","up":true},{"one":"21dcfb893a54cb56d21355fc564583057fc51b32503a8627e7575660725a7627","other":"6daaf515999c9a3491c963f76be82ed6005616bf7ba98247b01d6a89a9af1d71","up":true},{"one":"6daaf515999c9a3491c963f76be82ed6005616bf7ba98247b01d6a89a9af1d71","other":"5cc1c28eafd9758e807a28159a1a7a6ea313fa7e878fde5d47fcc8f5a5c25172","up":true},{"one":"5cc1c28eafd9758e807a28159a1a7a6ea313fa7e878fde5d47fcc8f5a5c25172","other":"4cc2386a86fd210bf699c6d93173b0879c3210d46f572a62bb154cb60a7d2cb1","up":true},{"one":"4cc2386a86fd210bf699c6d93173b0879c3210d46f572a62bb154cb60a7d2cb1","other":"947205fd85a17330a6d5c51a66548c5f69779c76ab12408f8fc6d33d7c6b8e9d","up":true},{"one":"947205fd85a17330a6d5c51a66548c5f69779c76ab12408f8fc6d33d7c6b8e9d","other":"641a165f8be0eee36f53c12bae8e2a34a709adb8d1dcd667e88e4e90c9ee2401","up":true},{"one":"641a165f8be0eee36f53c12bae8e2a34a709adb8d1dcd667e88e4e90c9ee2401","other":"51c285489ff14628268ae886945e1cd2da64c6a0a8cb184aada98567ab429b6e","up":true},{"one":"51c285489ff14628268ae886945e1cd2da64c6a0a8cb184aada98567ab429b6e","other":"3590afcd10fb8f58c39f72068661d9a772b77e0efd57bbd60306632fb048fa3a","up":true},{"one":"3590afcd10fb8f58c39f72068661d9a772b77e0efd57bbd60306632fb048fa3a","other":"6450bb5e880411abcb60258d8560949f6f70d92ba7bfa9a4d7845463c48dab30","up":true},{"one":"6450bb5e880411abcb60258d8560949f6f70d92ba7bfa9a4d7845463c48dab30","other":"f177ee6767a78a57b725dbe67ec377f507f5777d345a28892b0fbfb800dc443a","up":true},{"one":"f177ee6767a78a57b725dbe67ec377f507f5777d345a28892b0fbfb800dc443a","other":"5be6df23201fc5c00be650849c8bfe5581e44033ef19012836f97c98f3954471","up":true},{"one":"5be6df23201fc5c00be650849c8bfe5581e44033ef19012836f97c98f3954471","other":"37751f279493dc5ce5b5c3c55a6ec2e4119eedefe1069b283f6ff8c7bc9d1411","up":true},{"one":"37751f279493dc5ce5b5c3c55a6ec2e4119eedefe1069b283f6ff8c7bc9d1411","other":"8fb8208b7167dd06cc08778b507ccd856751d3df6dfbaeac18b9f527b6628523","up":true},{"one":"8fb8208b7167dd06cc08778b507ccd856751d3df6dfbaeac18b9f527b6628523","other":"8b35236da99930bf8f5ef6c7555bb18b80ce2e34361bbbfd6baf55a6483e54ff","up":true},{"one":"8b35236da99930bf8f5ef6c7555bb18b80ce2e34361bbbfd6baf55a6483e54ff","other":"7bcb0d7b9f84aed413cf9b2a7851ba6d1138d85382aa20e6c939a43c8e59c034","up":true},{"one":"7bcb0d7b9f84aed413cf9b2a7851ba6d1138d85382aa20e6c939a43c8e59c034","other":"27db66d13ee8168aca89786febd6971dd1d6c554bca8501052065cb47631560d","up":true},{"one":"27db66d13ee8168aca89786febd6971dd1d6c554bca8501052065cb47631560d","other":"bc29a0d9b60f3e2c34224cec187cf44eadc4628086d5594666ed025da71e7e7a","up":true},{"one":"bc29a0d9b60f3e2c34224cec187cf44eadc4628086d5594666ed025da71e7e7a","other":"1929b01c0f85af7452a0f358b54f6b36640a196b366909172af594a1648fe64c","up":true},{"one":"1929b01c0f85af7452a0f358b54f6b36640a196b366909172af594a1648fe64c","other":"ce01234661309127bb872d69d38dc5bf19bc4de2e0a0b5041cd362d073df4ff8","up":true},{"one":"ce01234661309127bb872d69d38dc5bf19bc4de2e0a0b5041cd362d073df4ff8","other":"957ed6194e6ef56e9696be43a1a0258f2ba4f48f56d790e42bd0663c3fc6aaae","up":true},{"one":"957ed6194e6ef56e9696be43a1a0258f2ba4f48f56d790e42bd0663c3fc6aaae","other":"6379b4d611cdd6e360480c14b3f6784360f28f702b5a6f375eda4ef3bde7ef33","up":true},{"one":"6379b4d611cdd6e360480c14b3f6784360f28f702b5a6f375eda4ef3bde7ef33","other":"bddbdff3cbd22fcedddc07de27125819aac72be72c3126ba898621c496cb95a2","up":true},{"one":"bddbdff3cbd22fcedddc07de27125819aac72be72c3126ba898621c496cb95a2","other":"82847a4af4f50622650d035f69151b202bccd5fc92302a617602c974603ed997","up":true},{"one":"82847a4af4f50622650d035f69151b202bccd5fc92302a617602c974603ed997","other":"2803f212eb4aa4f49224b16b2de88ba8652ad115321ee1e60cdbd926ecdad38a","up":true},{"one":"2803f212eb4aa4f49224b16b2de88ba8652ad115321ee1e60cdbd926ecdad38a","other":"ed12c78e700bf805669c48a5d62f1e56791263c4b2ce5bd34587ea9bc931a3e5","up":true},{"one":"ed12c78e700bf805669c48a5d62f1e56791263c4b2ce5bd34587ea9bc931a3e5","other":"4d750666dc0e9e2c244c43492801c1d7ec6208954a0cb5f8bb793b912440753a","up":true},{"one":"4d750666dc0e9e2c244c43492801c1d7ec6208954a0cb5f8bb793b912440753a","other":"7bee7967ff7b07243bed55b6d060d5ec2a1f28b530ed65cd055dc5b468a0f878","up":true},{"one":"7bee7967ff7b07243bed55b6d060d5ec2a1f28b530ed65cd055dc5b468a0f878","other":"d18a1edd26661069fb401fee8aa85a9614a3188e2e0666bfe9307f91d29aad49","up":true},{"one":"d18a1edd26661069fb401fee8aa85a9614a3188e2e0666bfe9307f91d29aad49","other":"f005a4d3453d52434f2b5be4006e653b50b52ad31926d654722fc3df00f1689c","up":true},{"one":"f005a4d3453d52434f2b5be4006e653b50b52ad31926d654722fc3df00f1689c","other":"4a373571475e2b4c280d2d4b22f10a249ee09fcf907f52081ec0398a8b5ea6f2","up":true},{"one":"4a373571475e2b4c280d2d4b22f10a249ee09fcf907f52081ec0398a8b5ea6f2","other":"a9fa28117a4b6906b5ce3931573e0a19eec3cb4fcd9141be2d258a2be06f3b61","up":true},{"one":"a9fa28117a4b6906b5ce3931573e0a19eec3cb4fcd9141be2d258a2be06f3b61","other":"4efaabab0d5dc59f098aee4dba3868263411a55615a2c474a73e6eec2211decc","up":true},{"one":"4efaabab0d5dc59f098aee4dba3868263411a55615a2c474a73e6eec2211decc","other":"bde90aaa0f1f7a7eb965ff308718d29b55a80b1ca84dfba16c169eabe2b0d5de","up":true},{"one":"bde90aaa0f1f7a7eb965ff308718d29b55a80b1ca84dfba16c169eabe2b0d5de","other":"b3555baa764c4562935b93533ee6c5a6df631e846c3ab512fdb1d6b901a68c60","up":true},{"one":"b3555baa764c4562935b93533ee6c5a6df631e846c3ab512fdb1d6b901a68c60","other":"4bc8dfbf84794d26d7a573c9d898974eaa3a2167e19cb7a8aa460807a603acd4","up":true},{"one":"4bc8dfbf84794d26d7a573c9d898974eaa3a2167e19cb7a8aa460807a603acd4","other":"d125317b492df46a7dd496d30c6d07839ed6bfa196abde4886ce7bc8f9b5c01f","up":true},{"one":"d125317b492df46a7dd496d30c6d07839ed6bfa196abde4886ce7bc8f9b5c01f","other":"672a566c7c2aeb1d91e6ee4e43984050df8b9560d923d60dc1fb23fb73b1a046","up":true},{"one":"672a566c7c2aeb1d91e6ee4e43984050df8b9560d923d60dc1fb23fb73b1a046","other":"b4e29de4bd5751f31195ead8aa1548d305a53fb4f99be9931850e6273de8f359","up":true},{"one":"b4e29de4bd5751f31195ead8aa1548d305a53fb4f99be9931850e6273de8f359","other":"f611d8039385ad56260ab391763e3627aadd2756565fedc3ec95f76124da0efc","up":true},{"one":"f611d8039385ad56260ab391763e3627aadd2756565fedc3ec95f76124da0efc","other":"5c623fa0103108d0b1e24e6d01a6624ce3b59a9e7c422c45dfc1211676785542","up":true},{"one":"5c623fa0103108d0b1e24e6d01a6624ce3b59a9e7c422c45dfc1211676785542","other":"4746379212b91ee1c13c1336e8f3a73a84408b7636c222c11bd27ce7d724e6c6","up":true},{"one":"4746379212b91ee1c13c1336e8f3a73a84408b7636c222c11bd27ce7d724e6c6","other":"ed2ec6681bf325887768703779ccf3a6278731118cd3ec890490a3de50f689ac","up":true},{"one":"ed2ec6681bf325887768703779ccf3a6278731118cd3ec890490a3de50f689ac","other":"36d5952685c95e42bef14f77b63705897ca71d24d21e4e9efc772d9cabd21122","up":true},{"one":"36d5952685c95e42bef14f77b63705897ca71d24d21e4e9efc772d9cabd21122","other":"cabfdfb789cc20962eaba1dbe68d6dc0466e699d22dc5b29f27a5cd555398795","up":true},{"one":"cabfdfb789cc20962eaba1dbe68d6dc0466e699d22dc5b29f27a5cd555398795","other":"d23c97bebcde26f5e351c4b975c76aaf604fd206f9b9063ecbda538e7a52f514","up":true},{"one":"d23c97bebcde26f5e351c4b975c76aaf604fd206f9b9063ecbda538e7a52f514","other":"a1929f704664ca85d829ac3bab62e688647a7cfdcbc9f03c61b0124cf9093505","up":true},{"one":"a1929f704664ca85d829ac3bab62e688647a7cfdcbc9f03c61b0124cf9093505","other":"52b47d52bf4a1afda1604b7942019c8d2ac4c760c5eb4597e1ce2dd7a8e1cf4d","up":true},{"one":"52b47d52bf4a1afda1604b7942019c8d2ac4c760c5eb4597e1ce2dd7a8e1cf4d","other":"e06f58b144faa650f96465825d253b63d7e061e3a3c4228ad5e1b665afbccc37","up":true},{"one":"e06f58b144faa650f96465825d253b63d7e061e3a3c4228ad5e1b665afbccc37","other":"dd92b3d42414fd5eff5c1e4ca55c63cd7036634049995b72a20cdf7ca1321978","up":true},{"one":"72a53f0fb1b51855cb4054a39cbd1309a76a862d36e18af9ba0456a60325c06e","other":"3e1959b29bbacb3ce7dccfa41c3e51b87f1afc700a3c6e4713c38cc0fe3790df","up":true},{"one":"f3d50811ef10661d3ef9978077cd7181387298f306833ab6e27f25cbb77435cd","other":"b8695bec6c8e1e6794bb943b83629cd2c910067e6e178f6f8e33c4f0fa2d74f4","up":true},{"one":"27b56302a89605a83563ba7b66d491ec25edfad0ea1010937fcadeab4d3ae582","other":"fa655b4882579e65937a14ab1c6bcba021580f0a5ebc04c48424f5ae72b7d5b4","up":true},{"one":"b8695bec6c8e1e6794bb943b83629cd2c910067e6e178f6f8e33c4f0fa2d74f4","other":"3e1959b29bbacb3ce7dccfa41c3e51b87f1afc700a3c6e4713c38cc0fe3790df","up":true},{"one":"957ed6194e6ef56e9696be43a1a0258f2ba4f48f56d790e42bd0663c3fc6aaae","other":"bddbdff3cbd22fcedddc07de27125819aac72be72c3126ba898621c496cb95a2","up":true},{"one":"bde90aaa0f1f7a7eb965ff308718d29b55a80b1ca84dfba16c169eabe2b0d5de","other":"4bc8dfbf84794d26d7a573c9d898974eaa3a2167e19cb7a8aa460807a603acd4","up":true},{"one":"b4e29de4bd5751f31195ead8aa1548d305a53fb4f99be9931850e6273de8f359","other":"5c623fa0103108d0b1e24e6d01a6624ce3b59a9e7c422c45dfc1211676785542","up":true},{"one":"a1929f704664ca85d829ac3bab62e688647a7cfdcbc9f03c61b0124cf9093505","other":"fac808b79923931febd54e3611b79811b3973c777e7502bd56b9803d0c4bf785","up":true},{"one":"ed12c78e700bf805669c48a5d62f1e56791263c4b2ce5bd34587ea9bc931a3e5","other":"bddbdff3cbd22fcedddc07de27125819aac72be72c3126ba898621c496cb95a2","up":true},{"one":"4d750666dc0e9e2c244c43492801c1d7ec6208954a0cb5f8bb793b912440753a","other":"2803f212eb4aa4f49224b16b2de88ba8652ad115321ee1e60cdbd926ecdad38a","up":true},{"one":"ed2ec6681bf325887768703779ccf3a6278731118cd3ec890490a3de50f689ac","other":"f611d8039385ad56260ab391763e3627aadd2756565fedc3ec95f76124da0efc","up":true},{"one":"d23c97bebcde26f5e351c4b975c76aaf604fd206f9b9063ecbda538e7a52f514","other":"52b47d52bf4a1afda1604b7942019c8d2ac4c760c5eb4597e1ce2dd7a8e1cf4d","up":true},{"one":"4746379212b91ee1c13c1336e8f3a73a84408b7636c222c11bd27ce7d724e6c6","other":"f611d8039385ad56260ab391763e3627aadd2756565fedc3ec95f76124da0efc","up":true},{"one":"5be6df23201fc5c00be650849c8bfe5581e44033ef19012836f97c98f3954471","other":"7bcb0d7b9f84aed413cf9b2a7851ba6d1138d85382aa20e6c939a43c8e59c034","up":true},{"one":"672a566c7c2aeb1d91e6ee4e43984050df8b9560d923d60dc1fb23fb73b1a046","other":"5c623fa0103108d0b1e24e6d01a6624ce3b59a9e7c422c45dfc1211676785542","up":true},{"one":"52b47d52bf4a1afda1604b7942019c8d2ac4c760c5eb4597e1ce2dd7a8e1cf4d","other":"cabfdfb789cc20962eaba1dbe68d6dc0466e699d22dc5b29f27a5cd555398795","up":true},{"one":"5c623fa0103108d0b1e24e6d01a6624ce3b59a9e7c422c45dfc1211676785542","other":"36d5952685c95e42bef14f77b63705897ca71d24d21e4e9efc772d9cabd21122","up":true},{"one":"ed2ec6681bf325887768703779ccf3a6278731118cd3ec890490a3de50f689ac","other":"cabfdfb789cc20962eaba1dbe68d6dc0466e699d22dc5b29f27a5cd555398795","up":true},{"one":"f005a4d3453d52434f2b5be4006e653b50b52ad31926d654722fc3df00f1689c","other":"a9fa28117a4b6906b5ce3931573e0a19eec3cb4fcd9141be2d258a2be06f3b61","up":true},{"one":"cabfdfb789cc20962eaba1dbe68d6dc0466e699d22dc5b29f27a5cd555398795","other":"a1929f704664ca85d829ac3bab62e688647a7cfdcbc9f03c61b0124cf9093505","up":true},{"one":"2803f212eb4aa4f49224b16b2de88ba8652ad115321ee1e60cdbd926ecdad38a","other":"7bee7967ff7b07243bed55b6d060d5ec2a1f28b530ed65cd055dc5b468a0f878","up":true},{"one":"82847a4af4f50622650d035f69151b202bccd5fc92302a617602c974603ed997","other":"ed12c78e700bf805669c48a5d62f1e56791263c4b2ce5bd34587ea9bc931a3e5","up":true},{"one":"4a373571475e2b4c280d2d4b22f10a249ee09fcf907f52081ec0398a8b5ea6f2","other":"d18a1edd26661069fb401fee8aa85a9614a3188e2e0666bfe9307f91d29aad49","up":true},{"one":"36d5952685c95e42bef14f77b63705897ca71d24d21e4e9efc772d9cabd21122","other":"4746379212b91ee1c13c1336e8f3a73a84408b7636c222c11bd27ce7d724e6c6","up":true},{"one":"a9fa28117a4b6906b5ce3931573e0a19eec3cb4fcd9141be2d258a2be06f3b61","other":"d18a1edd26661069fb401fee8aa85a9614a3188e2e0666bfe9307f91d29aad49","up":true},{"one":"e06f58b144faa650f96465825d253b63d7e061e3a3c4228ad5e1b665afbccc37","other":"a1929f704664ca85d829ac3bab62e688647a7cfdcbc9f03c61b0124cf9093505","up":true},{"one":"f4a0f76b30bcf5987cfa3f4f4b0aa3445f39d60a1f51519fa660c27b5d833dde","other":"8330e2b8ae2f184bb8dc5e153fafa4dafe86f84ec692d3ee91413cc07b1cd9e2","up":true},{"one":"64e642de2667a7563c774050d368858d99aff433efbd1cb68361e3e244629b03","other":"4a3c39f044c425c153d4900db30f839d7866c8e0f4f4d38d9205e67fb540988e","up":true},{"one":"cc5fa2d49210e240983b0853ff15003f0d366f05cb1f6486bae2862cca852cc5","other":"8012a7af71d76d882202cf9372523478ccebea23443006c7f29c2a83106cd1b3","up":true},{"one":"fac808b79923931febd54e3611b79811b3973c777e7502bd56b9803d0c4bf785","other":"72a53f0fb1b51855cb4054a39cbd1309a76a862d36e18af9ba0456a60325c06e","up":true},{"one":"bc71f3e409edb989e26607448491530c5451053b582ea64d882525451ac940bb","other":"fa655b4882579e65937a14ab1c6bcba021580f0a5ebc04c48424f5ae72b7d5b4","up":true},{"one":"2471776037d55a05df2b15bcefe52cb1f4c942e9e15113abc2a0c1fcbaa5d626","other":"75e282c0f3d355a40573e6578c5aac98e7262970a9239f4dcefd26d6f008b553","up":true},{"one":"75e282c0f3d355a40573e6578c5aac98e7262970a9239f4dcefd26d6f008b553","other":"3e1959b29bbacb3ce7dccfa41c3e51b87f1afc700a3c6e4713c38cc0fe3790df","up":true},{"one":"27b56302a89605a83563ba7b66d491ec25edfad0ea1010937fcadeab4d3ae582","other":"4a3c39f044c425c153d4900db30f839d7866c8e0f4f4d38d9205e67fb540988e","up":true},{"one":"ea3d6aa50ad5a1d5647d213f9b5cfe6718339eec7eef8644487eb3c223c7bcde","other":"8330e2b8ae2f184bb8dc5e153fafa4dafe86f84ec692d3ee91413cc07b1cd9e2","up":true},{"one":"8012a7af71d76d882202cf9372523478ccebea23443006c7f29c2a83106cd1b3","other":"bc71f3e409edb989e26607448491530c5451053b582ea64d882525451ac940bb","up":true},{"one":"47753fdca855ea79abf667b50aa9c90a132d44bdd1572c3e3c411c8ee7e5b5f4","other":"0e344c6e27c23bd36bdd3ddcefa4e577fdc9461e52c7ce20135733a08b987b82","up":true},{"one":"fa655b4882579e65937a14ab1c6bcba021580f0a5ebc04c48424f5ae72b7d5b4","other":"a1929f704664ca85d829ac3bab62e688647a7cfdcbc9f03c61b0124cf9093505","up":true},{"one":"184e9e00ab4fe1669d4d99fb33d418d33eff927da38cc997f69679443c24b20b","other":"3e1959b29bbacb3ce7dccfa41c3e51b87f1afc700a3c6e4713c38cc0fe3790df","up":true},{"one":"b8695bec6c8e1e6794bb943b83629cd2c910067e6e178f6f8e33c4f0fa2d74f4","other":"a1929f704664ca85d829ac3bab62e688647a7cfdcbc9f03c61b0124cf9093505","up":true},{"one":"b2453c6e755a30efb91194fa607b3352d75b6905c448b09af4aeadf3a445b633","other":"47753fdca855ea79abf667b50aa9c90a132d44bdd1572c3e3c411c8ee7e5b5f4","up":true},{"one":"72a53f0fb1b51855cb4054a39cbd1309a76a862d36e18af9ba0456a60325c06e","other":"64e642de2667a7563c774050d368858d99aff433efbd1cb68361e3e244629b03","up":true},{"one":"ee2b0aff61a9846d13de3a72712ef0bf3ca42ad8da57e81759c242797258efec","other":"cc9f65d734f1a3bbc6019e166fe355bd7fc33bb4887043a5ccf532a9ba356379","up":true},{"one":"f3d50811ef10661d3ef9978077cd7181387298f306833ab6e27f25cbb77435cd","other":"cabfdfb789cc20962eaba1dbe68d6dc0466e699d22dc5b29f27a5cd555398795","up":true},{"one":"dd92b3d42414fd5eff5c1e4ca55c63cd7036634049995b72a20cdf7ca1321978","other":"64e642de2667a7563c774050d368858d99aff433efbd1cb68361e3e244629b03","up":true},{"one":"aba793e635f71169105ad073225cc8db914de6b711fe9f22c5d94ac8cb85e2eb","other":"deec6a8beb4e5e441dd42311354194c3bef9448e8859b4ccd401645b69217d12","up":true},{"one":"17406dea5046f00e27eaf74e166a945c9485139d6edcdfcd84f5b03f50eedd0a","other":"c9ef56afed2d40db396ad39d6f5f5f38f4058b6b0d1e02b71d6aa92dbeaf7df7","up":true},{"one":"eb01ff80307afbfc7457c96594cd4ba4d00acb7fd25a7571d1223168bd66ff09","other":"8012a7af71d76d882202cf9372523478ccebea23443006c7f29c2a83106cd1b3","up":true},{"one":"cc9f65d734f1a3bbc6019e166fe355bd7fc33bb4887043a5ccf532a9ba356379","other":"62f007c92a8af466e90ed0b1e5e71a955ad273ec793948ddfc03977f131ed2d1","up":true},{"one":"0f3106adfe70aefb474c4a98a95932307391de2cb70fbd2e11dd31c9e695ed83","other":"22bbb3236a5e0a1947a1c4735aaacf9122173789a02a06e7653103bdcae2f823","up":true},{"one":"0e344c6e27c23bd36bdd3ddcefa4e577fdc9461e52c7ce20135733a08b987b82","other":"69753865aacaaf72d9bf6d265c885d3f705804ff4b2675f7aa860641dacab2a0","up":true},{"one":"0a215c7765be2caebf76ad3e8017bbc2aaadf8e0dd4859af781953a0564c5d59","other":"8012a7af71d76d882202cf9372523478ccebea23443006c7f29c2a83106cd1b3","up":true},{"one":"45895aff674079f6be02e4cc74914d63125c3fe48bb69056c070c71319fea1fa","other":"69753865aacaaf72d9bf6d265c885d3f705804ff4b2675f7aa860641dacab2a0","up":true},{"one":"be0fb2b440b91e719c20f51b673eb9f2f66c7af77b0b0ade312998cdffcc5045","other":"aba793e635f71169105ad073225cc8db914de6b711fe9f22c5d94ac8cb85e2eb","up":true},{"one":"127c89eae94b195df2eb5eb7b44f634adb73c114d2089cd904b56988c8674e11","other":"0e344c6e27c23bd36bdd3ddcefa4e577fdc9461e52c7ce20135733a08b987b82","up":true},{"one":"3b830c2ae5463ca2f2260176b77b8dda23048257aa780255c69cf1bbbc6fb64c","other":"58a90b58858417a4e972626421ed8e78b1b3e5ac69fcedd22c58a8ab4c6147df","up":true},{"one":"08077c0ce8d4130c14464493e9164a8bae61b4646b1ec48899e75f2f6f9b8c66","other":"69753865aacaaf72d9bf6d265c885d3f705804ff4b2675f7aa860641dacab2a0","up":true},{"one":"c0adf394af7d5670c1ce8c6bea292fbc03c56ae2b636e2f303311a455bb3500f","other":"eb01ff80307afbfc7457c96594cd4ba4d00acb7fd25a7571d1223168bd66ff09","up":true},{"one":"2d531c50183f0115269b3feaecf45927a3ac44e1be2a263c7e5d2274d8379b1c","other":"75e282c0f3d355a40573e6578c5aac98e7262970a9239f4dcefd26d6f008b553","up":true},{"one":"836e65dfe6f01e1d2934655c1846cb86fed6e41ea951a109d7a20bb14cb4c10a","other":"a86117147b78f20a6d883d37715da85178cad89eff650a74aa89e7bc11bc45a7","up":true},{"one":"216e0370111e2e03927b803ae788f9947de8e241d41dbf6a70983cf0ecd68af1","other":"0639f010834f5bc497798f2d275bbc60bfbcd53c83e38986b7260310c6001420","up":true},{"one":"01a63575c384f686e5739e1bd079e4a4c55421cd6d89b944e2c61dd174fa2bf6","other":"55fdad03303a746920773217c568a37d2004869ff34096fbe45197f71eba2b63","up":true},{"one":"69753865aacaaf72d9bf6d265c885d3f705804ff4b2675f7aa860641dacab2a0","other":"5008ef55ad8088f70643b0f93bcb479531bcb0afe8e01b215dbf8597ec866369","up":true},{"one":"acf888ed781f5358493e2e5048691acc39eac3240ca9e9093bb4052b1f624325","other":"c9ef56afed2d40db396ad39d6f5f5f38f4058b6b0d1e02b71d6aa92dbeaf7df7","up":true},{"one":"bd9607d5f57f7b6f74f4ad981be368988ef48b5f31e3fd96cab3bb790d568150","other":"eb01ff80307afbfc7457c96594cd4ba4d00acb7fd25a7571d1223168bd66ff09","up":true},{"one":"5be6df23201fc5c00be650849c8bfe5581e44033ef19012836f97c98f3954471","other":"51c285489ff14628268ae886945e1cd2da64c6a0a8cb184aada98567ab429b6e","up":true},{"one":"aedc9b478204effdcbad1a892333f15c061fbd1423b370f8a50f929b2a2f6952","other":"f33c07a818863a358358989ec71504abad3ca0a7c81b54aad59075a766fad501","up":true},{"one":"deec6a8beb4e5e441dd42311354194c3bef9448e8859b4ccd401645b69217d12","other":"4c211c117e555c2ac831d5688615b6b4c5e31f1d7c7906b34f0cbcdbc45482b4","up":true},{"one":"13853407d278a45e15d4b148fc38ebb35c4f58ee552ee0e4401c6c98c45b8e3e","other":"4c211c117e555c2ac831d5688615b6b4c5e31f1d7c7906b34f0cbcdbc45482b4","up":true},{"one":"efd68d2c99346ca085c9ef896bee6125ad8638413295108f3a92b247a41ca629","other":"8330e2b8ae2f184bb8dc5e153fafa4dafe86f84ec692d3ee91413cc07b1cd9e2","up":true},{"one":"b5fc43e8c0df3279d6a12cd8b03012cb8d2205208324018c7ae725745a99a2f3","other":"deec6a8beb4e5e441dd42311354194c3bef9448e8859b4ccd401645b69217d12","up":true},{"one":"8d3e0d9c6932d3422024394998e943309b679d667394d0eb622f0e208e7fcf0a","other":"b60e77c40ddc9dc78a4ad346add37e60f10f2999de836615db53524487d1ede9","up":true},{"one":"77eedcac0c847b1d693ddff07c5868afb1c2008b2dcb48a0299143ab14611969","other":"55fdad03303a746920773217c568a37d2004869ff34096fbe45197f71eba2b63","up":true},{"one":"5a8ba4047c4456e825bd1b34c961f5c7f37bf7c27bc48bee71b8430c7d135486","other":"c2f9b4abed9c6a839fe4c03a80bd396fd187a8784ba47a83687d3a54b7e2eddf","up":true},{"one":"2354d3af5c6dca05d7dc212b100112f37ab29fb8b3f4319887230a4d420f5d9d","other":"cc9f65d734f1a3bbc6019e166fe355bd7fc33bb4887043a5ccf532a9ba356379","up":true},{"one":"4a3c39f044c425c153d4900db30f839d7866c8e0f4f4d38d9205e67fb540988e","other":"184e9e00ab4fe1669d4d99fb33d418d33eff927da38cc997f69679443c24b20b","up":true},{"one":"f33c07a818863a358358989ec71504abad3ca0a7c81b54aad59075a766fad501","other":"8d3e0d9c6932d3422024394998e943309b679d667394d0eb622f0e208e7fcf0a","up":true},{"one":"221cd8ea0a26f0d3f81f782f1de390282415ecd9cf40224b4945a00897895b4e","other":"f33c07a818863a358358989ec71504abad3ca0a7c81b54aad59075a766fad501","up":true},{"one":"0639f010834f5bc497798f2d275bbc60bfbcd53c83e38986b7260310c6001420","other":"7a68fa44bbec187272e2d5dfbd6ed8af31a1a365aa72aa50db02350ebe98c859","up":true},{"one":"459b9fb2b7f4e396de8cf8740a6804c8e5b96ca11ffa2b5106c14dfbbab65c95","other":"f33c07a818863a358358989ec71504abad3ca0a7c81b54aad59075a766fad501","up":true},{"one":"2dd4ad83effc3ba73e72f5659583e5987241bda563563200b50c46cce00a1d9b","other":"f33c07a818863a358358989ec71504abad3ca0a7c81b54aad59075a766fad501","up":true},{"one":"3871492c8c62cd74cbe65a993669e4978cc641879a5223dd6b9e687f050a1c40","other":"55fdad03303a746920773217c568a37d2004869ff34096fbe45197f71eba2b63","up":true},{"one":"55fdad03303a746920773217c568a37d2004869ff34096fbe45197f71eba2b63","other":"73d0d1d4a2b7250f51e57c13cc48bc6b20682320ce12ee8e5765afeef7d9de42","up":true},{"one":"22bbb3236a5e0a1947a1c4735aaacf9122173789a02a06e7653103bdcae2f823","other":"b60e77c40ddc9dc78a4ad346add37e60f10f2999de836615db53524487d1ede9","up":true},{"one":"73d0d1d4a2b7250f51e57c13cc48bc6b20682320ce12ee8e5765afeef7d9de42","other":"459b9fb2b7f4e396de8cf8740a6804c8e5b96ca11ffa2b5106c14dfbbab65c95","up":true},{"one":"62f007c92a8af466e90ed0b1e5e71a955ad273ec793948ddfc03977f131ed2d1","other":"5008ef55ad8088f70643b0f93bcb479531bcb0afe8e01b215dbf8597ec866369","up":true},{"one":"68a63ebc4833dedfdb6d534438ffcccd042f60434bee0e39f4cb3726e7413e7a","other":"3e1959b29bbacb3ce7dccfa41c3e51b87f1afc700a3c6e4713c38cc0fe3790df","up":true},{"one":"58a90b58858417a4e972626421ed8e78b1b3e5ac69fcedd22c58a8ab4c6147df","other":"034de66774eda26b93e342c9b94b9deaeb6297650c819b144a5832bebfe6b02f","up":true},{"one":"c52a68d8388a21013e4eecef9ea866db1f5eb16bbe0ecc82b8bfafd33e4e014f","other":"f33c07a818863a358358989ec71504abad3ca0a7c81b54aad59075a766fad501","up":true},{"one":"b9d906e406b0fc6078c22bbc173043df1f7581061b4f6ccd769bc568d94b4339","other":"22bbb3236a5e0a1947a1c4735aaacf9122173789a02a06e7653103bdcae2f823","up":true},{"one":"f177ee6767a78a57b725dbe67ec377f507f5777d345a28892b0fbfb800dc443a","other":"bddbdff3cbd22fcedddc07de27125819aac72be72c3126ba898621c496cb95a2","up":true},{"one":"bde90aaa0f1f7a7eb965ff308718d29b55a80b1ca84dfba16c169eabe2b0d5de","other":"ed2ec6681bf325887768703779ccf3a6278731118cd3ec890490a3de50f689ac","up":true},{"one":"b60e77c40ddc9dc78a4ad346add37e60f10f2999de836615db53524487d1ede9","other":"deec6a8beb4e5e441dd42311354194c3bef9448e8859b4ccd401645b69217d12","up":true},{"one":"27db66d13ee8168aca89786febd6971dd1d6c554bca8501052065cb47631560d","other":"1929b01c0f85af7452a0f358b54f6b36640a196b366909172af594a1648fe64c","up":true},{"one":"a86117147b78f20a6d883d37715da85178cad89eff650a74aa89e7bc11bc45a7","other":"eb01ff80307afbfc7457c96594cd4ba4d00acb7fd25a7571d1223168bd66ff09","up":true},{"one":"5008ef55ad8088f70643b0f93bcb479531bcb0afe8e01b215dbf8597ec866369","other":"2354d3af5c6dca05d7dc212b100112f37ab29fb8b3f4319887230a4d420f5d9d","up":true},{"one":"fa9a809f016097d949fa1463a1c8f08871c7d38e60b7df6d3e28ab04ccd3a143","other":"aedc9b478204effdcbad1a892333f15c061fbd1423b370f8a50f929b2a2f6952","up":true},{"one":"b3555baa764c4562935b93533ee6c5a6df631e846c3ab512fdb1d6b901a68c60","other":"ed2ec6681bf325887768703779ccf3a6278731118cd3ec890490a3de50f689ac","up":true},{"one":"4cc2386a86fd210bf699c6d93173b0879c3210d46f572a62bb154cb60a7d2cb1","other":"034de66774eda26b93e342c9b94b9deaeb6297650c819b144a5832bebfe6b02f","up":true},{"one":"03eb2e92ed0923f696269e7a03fec731d8c3f8df278023a9cb00867b533a3ca3","other":"2354d3af5c6dca05d7dc212b100112f37ab29fb8b3f4319887230a4d420f5d9d","up":true},{"one":"3590afcd10fb8f58c39f72068661d9a772b77e0efd57bbd60306632fb048fa3a","other":"bc29a0d9b60f3e2c34224cec187cf44eadc4628086d5594666ed025da71e7e7a","up":true},{"one":"d9d30b9b212bd4811a44ebe304ba3935ead3abe3247f99893faf65664131c29d","other":"b9d906e406b0fc6078c22bbc173043df1f7581061b4f6ccd769bc568d94b4339","up":true},{"one":"5cc1c28eafd9758e807a28159a1a7a6ea313fa7e878fde5d47fcc8f5a5c25172","other":"f177ee6767a78a57b725dbe67ec377f507f5777d345a28892b0fbfb800dc443a","up":true},{"one":"4bc8dfbf84794d26d7a573c9d898974eaa3a2167e19cb7a8aa460807a603acd4","other":"36d5952685c95e42bef14f77b63705897ca71d24d21e4e9efc772d9cabd21122","up":true},{"one":"21dcfb893a54cb56d21355fc564583057fc51b32503a8627e7575660725a7627","other":"f177ee6767a78a57b725dbe67ec377f507f5777d345a28892b0fbfb800dc443a","up":true},{"one":"8fb8208b7167dd06cc08778b507ccd856751d3df6dfbaeac18b9f527b6628523","other":"ce01234661309127bb872d69d38dc5bf19bc4de2e0a0b5041cd362d073df4ff8","up":true},{"one":"8b35236da99930bf8f5ef6c7555bb18b80ce2e34361bbbfd6baf55a6483e54ff","other":"ce01234661309127bb872d69d38dc5bf19bc4de2e0a0b5041cd362d073df4ff8","up":true},{"one":"6daaf515999c9a3491c963f76be82ed6005616bf7ba98247b01d6a89a9af1d71","other":"deec6a8beb4e5e441dd42311354194c3bef9448e8859b4ccd401645b69217d12","up":true},{"one":"72a76f668d9b923914860eb4f8577bc98c153f6dd222cd36a0bbdef2bab7f068","other":"51c285489ff14628268ae886945e1cd2da64c6a0a8cb184aada98567ab429b6e","up":true},{"one":"eceb7dc532596e8b68074113db9605e3d15cb15e2e80f75f1a66d95a1221c7dc","other":"3871492c8c62cd74cbe65a993669e4978cc641879a5223dd6b9e687f050a1c40","up":true},{"one":"957ed6194e6ef56e9696be43a1a0258f2ba4f48f56d790e42bd0663c3fc6aaae","other":"8fb8208b7167dd06cc08778b507ccd856751d3df6dfbaeac18b9f527b6628523","up":true},{"one":"6379b4d611cdd6e360480c14b3f6784360f28f702b5a6f375eda4ef3bde7ef33","other":"1929b01c0f85af7452a0f358b54f6b36640a196b366909172af594a1648fe64c","up":true},{"one":"947205fd85a17330a6d5c51a66548c5f69779c76ab12408f8fc6d33d7c6b8e9d","other":"f177ee6767a78a57b725dbe67ec377f507f5777d345a28892b0fbfb800dc443a","up":true},{"one":"bddbdff3cbd22fcedddc07de27125819aac72be72c3126ba898621c496cb95a2","other":"a9fa28117a4b6906b5ce3931573e0a19eec3cb4fcd9141be2d258a2be06f3b61","up":true},{"one":"7bcb0d7b9f84aed413cf9b2a7851ba6d1138d85382aa20e6c939a43c8e59c034","other":"641a165f8be0eee36f53c12bae8e2a34a709adb8d1dcd667e88e4e90c9ee2401","up":true},{"one":"ce01234661309127bb872d69d38dc5bf19bc4de2e0a0b5041cd362d073df4ff8","other":"ed12c78e700bf805669c48a5d62f1e56791263c4b2ce5bd34587ea9bc931a3e5","up":true},{"one":"4efaabab0d5dc59f098aee4dba3868263411a55615a2c474a73e6eec2211decc","other":"2803f212eb4aa4f49224b16b2de88ba8652ad115321ee1e60cdbd926ecdad38a","up":true},{"one":"51c285489ff14628268ae886945e1cd2da64c6a0a8cb184aada98567ab429b6e","other":"bc29a0d9b60f3e2c34224cec187cf44eadc4628086d5594666ed025da71e7e7a","up":true},{"one":"1929b01c0f85af7452a0f358b54f6b36640a196b366909172af594a1648fe64c","other":"51c285489ff14628268ae886945e1cd2da64c6a0a8cb184aada98567ab429b6e","up":true},{"one":"bc29a0d9b60f3e2c34224cec187cf44eadc4628086d5594666ed025da71e7e7a","other":"ed12c78e700bf805669c48a5d62f1e56791263c4b2ce5bd34587ea9bc931a3e5","up":true},{"one":"6450bb5e880411abcb60258d8560949f6f70d92ba7bfa9a4d7845463c48dab30","other":"4c211c117e555c2ac831d5688615b6b4c5e31f1d7c7906b34f0cbcdbc45482b4","up":true},{"one":"c2f9b4abed9c6a839fe4c03a80bd396fd187a8784ba47a83687d3a54b7e2eddf","other":"17406dea5046f00e27eaf74e166a945c9485139d6edcdfcd84f5b03f50eedd0a","up":true},{"one":"bd486e1e15df4c7539b1ad5b54f7566dd4836a430e9f7d3503881fa79e258d9b","other":"deec6a8beb4e5e441dd42311354194c3bef9448e8859b4ccd401645b69217d12","up":true},{"one":"4c211c117e555c2ac831d5688615b6b4c5e31f1d7c7906b34f0cbcdbc45482b4","other":"7a68fa44bbec187272e2d5dfbd6ed8af31a1a365aa72aa50db02350ebe98c859","up":true},{"one":"641a165f8be0eee36f53c12bae8e2a34a709adb8d1dcd667e88e4e90c9ee2401","other":"034de66774eda26b93e342c9b94b9deaeb6297650c819b144a5832bebfe6b02f","up":true},{"one":"37751f279493dc5ce5b5c3c55a6ec2e4119eedefe1069b283f6ff8c7bc9d1411","other":"1929b01c0f85af7452a0f358b54f6b36640a196b366909172af594a1648fe64c","up":true},{"one":"e06f58b144faa650f96465825d253b63d7e061e3a3c4228ad5e1b665afbccc37","other":"f3d50811ef10661d3ef9978077cd7181387298f306833ab6e27f25cbb77435cd","up":true},{"one":"f005a4d3453d52434f2b5be4006e653b50b52ad31926d654722fc3df00f1689c","other":"ed2ec6681bf325887768703779ccf3a6278731118cd3ec890490a3de50f689ac","up":true},{"one":"82847a4af4f50622650d035f69151b202bccd5fc92302a617602c974603ed997","other":"957ed6194e6ef56e9696be43a1a0258f2ba4f48f56d790e42bd0663c3fc6aaae","up":true},{"one":"2803f212eb4aa4f49224b16b2de88ba8652ad115321ee1e60cdbd926ecdad38a","other":"1929b01c0f85af7452a0f358b54f6b36640a196b366909172af594a1648fe64c","up":true},{"one":"4a373571475e2b4c280d2d4b22f10a249ee09fcf907f52081ec0398a8b5ea6f2","other":"1929b01c0f85af7452a0f358b54f6b36640a196b366909172af594a1648fe64c","up":true},{"one":"7bee7967ff7b07243bed55b6d060d5ec2a1f28b530ed65cd055dc5b468a0f878","other":"672a566c7c2aeb1d91e6ee4e43984050df8b9560d923d60dc1fb23fb73b1a046","up":true},{"one":"d18a1edd26661069fb401fee8aa85a9614a3188e2e0666bfe9307f91d29aad49","other":"957ed6194e6ef56e9696be43a1a0258f2ba4f48f56d790e42bd0663c3fc6aaae","up":true},{"one":"7a68fa44bbec187272e2d5dfbd6ed8af31a1a365aa72aa50db02350ebe98c859","other":"deec6a8beb4e5e441dd42311354194c3bef9448e8859b4ccd401645b69217d12","up":true},{"one":"4d750666dc0e9e2c244c43492801c1d7ec6208954a0cb5f8bb793b912440753a","other":"4a373571475e2b4c280d2d4b22f10a249ee09fcf907f52081ec0398a8b5ea6f2","up":true},{"one":"772a79302528fdce6a216c98c95e281333292c81dfe490aeaa4a78bfeb1980c8","other":"221cd8ea0a26f0d3f81f782f1de390282415ecd9cf40224b4945a00897895b4e","up":true},{"one":"b4e29de4bd5751f31195ead8aa1548d305a53fb4f99be9931850e6273de8f359","other":"a9fa28117a4b6906b5ce3931573e0a19eec3cb4fcd9141be2d258a2be06f3b61","up":true},{"one":"d125317b492df46a7dd496d30c6d07839ed6bfa196abde4886ce7bc8f9b5c01f","other":"a1929f704664ca85d829ac3bab62e688647a7cfdcbc9f03c61b0124cf9093505","up":true},{"one":"ed2ec6681bf325887768703779ccf3a6278731118cd3ec890490a3de50f689ac","other":"b8695bec6c8e1e6794bb943b83629cd2c910067e6e178f6f8e33c4f0fa2d74f4","up":true},{"one":"5c623fa0103108d0b1e24e6d01a6624ce3b59a9e7c422c45dfc1211676785542","other":"52b47d52bf4a1afda1604b7942019c8d2ac4c760c5eb4597e1ce2dd7a8e1cf4d","up":true},{"one":"672a566c7c2aeb1d91e6ee4e43984050df8b9560d923d60dc1fb23fb73b1a046","other":"184e9e00ab4fe1669d4d99fb33d418d33eff927da38cc997f69679443c24b20b","up":true},{"one":"4746379212b91ee1c13c1336e8f3a73a84408b7636c222c11bd27ce7d724e6c6","other":"75e282c0f3d355a40573e6578c5aac98e7262970a9239f4dcefd26d6f008b553","up":true},{"one":"36d5952685c95e42bef14f77b63705897ca71d24d21e4e9efc772d9cabd21122","other":"184e9e00ab4fe1669d4d99fb33d418d33eff927da38cc997f69679443c24b20b","up":true},{"one":"034de66774eda26b93e342c9b94b9deaeb6297650c819b144a5832bebfe6b02f","other":"deec6a8beb4e5e441dd42311354194c3bef9448e8859b4ccd401645b69217d12","up":true},{"one":"f611d8039385ad56260ab391763e3627aadd2756565fedc3ec95f76124da0efc","other":"cc5fa2d49210e240983b0853ff15003f0d366f05cb1f6486bae2862cca852cc5","up":true},{"one":"72a53f0fb1b51855cb4054a39cbd1309a76a862d36e18af9ba0456a60325c06e","other":"5c623fa0103108d0b1e24e6d01a6624ce3b59a9e7c422c45dfc1211676785542","up":true},{"one":"a9fa28117a4b6906b5ce3931573e0a19eec3cb4fcd9141be2d258a2be06f3b61","other":"82847a4af4f50622650d035f69151b202bccd5fc92302a617602c974603ed997","up":true},{"one":"27b56302a89605a83563ba7b66d491ec25edfad0ea1010937fcadeab4d3ae582","other":"72a53f0fb1b51855cb4054a39cbd1309a76a862d36e18af9ba0456a60325c06e","up":true},{"one":"d23c97bebcde26f5e351c4b975c76aaf604fd206f9b9063ecbda538e7a52f514","other":"f3d50811ef10661d3ef9978077cd7181387298f306833ab6e27f25cbb77435cd","up":true},{"one":"ea3d6aa50ad5a1d5647d213f9b5cfe6718339eec7eef8644487eb3c223c7bcde","other":"8012a7af71d76d882202cf9372523478ccebea23443006c7f29c2a83106cd1b3","up":true},{"one":"a1929f704664ca85d829ac3bab62e688647a7cfdcbc9f03c61b0124cf9093505","other":"184e9e00ab4fe1669d4d99fb33d418d33eff927da38cc997f69679443c24b20b","up":true},{"one":"52b47d52bf4a1afda1604b7942019c8d2ac4c760c5eb4597e1ce2dd7a8e1cf4d","other":"184e9e00ab4fe1669d4d99fb33d418d33eff927da38cc997f69679443c24b20b","up":true},{"one":"5cc1c28eafd9758e807a28159a1a7a6ea313fa7e878fde5d47fcc8f5a5c25172","other":"deec6a8beb4e5e441dd42311354194c3bef9448e8859b4ccd401645b69217d12","up":true},{"one":"b2453c6e755a30efb91194fa607b3352d75b6905c448b09af4aeadf3a445b633","other":"a86117147b78f20a6d883d37715da85178cad89eff650a74aa89e7bc11bc45a7","up":true},{"one":"4a3c39f044c425c153d4900db30f839d7866c8e0f4f4d38d9205e67fb540988e","other":"45895aff674079f6be02e4cc74914d63125c3fe48bb69056c070c71319fea1fa","up":true},{"one":"cabfdfb789cc20962eaba1dbe68d6dc0466e699d22dc5b29f27a5cd555398795","other":"cc5fa2d49210e240983b0853ff15003f0d366f05cb1f6486bae2862cca852cc5","up":true},{"one":"08077c0ce8d4130c14464493e9164a8bae61b4646b1ec48899e75f2f6f9b8c66","other":"2354d3af5c6dca05d7dc212b100112f37ab29fb8b3f4319887230a4d420f5d9d","up":true},{"one":"be0fb2b440b91e719c20f51b673eb9f2f66c7af77b0b0ade312998cdffcc5045","other":"8d3e0d9c6932d3422024394998e943309b679d667394d0eb622f0e208e7fcf0a","up":true},{"one":"cc9f65d734f1a3bbc6019e166fe355bd7fc33bb4887043a5ccf532a9ba356379","other":"69753865aacaaf72d9bf6d265c885d3f705804ff4b2675f7aa860641dacab2a0","up":true},{"one":"3b830c2ae5463ca2f2260176b77b8dda23048257aa780255c69cf1bbbc6fb64c","other":"55fdad03303a746920773217c568a37d2004869ff34096fbe45197f71eba2b63","up":true},{"one":"216e0370111e2e03927b803ae788f9947de8e241d41dbf6a70983cf0ecd68af1","other":"13853407d278a45e15d4b148fc38ebb35c4f58ee552ee0e4401c6c98c45b8e3e","up":true},{"one":"8b35236da99930bf8f5ef6c7555bb18b80ce2e34361bbbfd6baf55a6483e54ff","other":"ed12c78e700bf805669c48a5d62f1e56791263c4b2ce5bd34587ea9bc931a3e5","up":true},{"one":"459b9fb2b7f4e396de8cf8740a6804c8e5b96ca11ffa2b5106c14dfbbab65c95","other":"c52a68d8388a21013e4eecef9ea866db1f5eb16bbe0ecc82b8bfafd33e4e014f","up":true},{"one":"dd92b3d42414fd5eff5c1e4ca55c63cd7036634049995b72a20cdf7ca1321978","other":"5c623fa0103108d0b1e24e6d01a6624ce3b59a9e7c422c45dfc1211676785542","up":true},{"one":"221cd8ea0a26f0d3f81f782f1de390282415ecd9cf40224b4945a00897895b4e","other":"c52a68d8388a21013e4eecef9ea866db1f5eb16bbe0ecc82b8bfafd33e4e014f","up":true},{"one":"8fb8208b7167dd06cc08778b507ccd856751d3df6dfbaeac18b9f527b6628523","other":"ed12c78e700bf805669c48a5d62f1e56791263c4b2ce5bd34587ea9bc931a3e5","up":true},{"one":"2d531c50183f0115269b3feaecf45927a3ac44e1be2a263c7e5d2274d8379b1c","other":"69753865aacaaf72d9bf6d265c885d3f705804ff4b2675f7aa860641dacab2a0","up":true},{"one":"c0adf394af7d5670c1ce8c6bea292fbc03c56ae2b636e2f303311a455bb3500f","other":"f4a0f76b30bcf5987cfa3f4f4b0aa3445f39d60a1f51519fa660c27b5d833dde","up":true},{"one":"73d0d1d4a2b7250f51e57c13cc48bc6b20682320ce12ee8e5765afeef7d9de42","other":"58a90b58858417a4e972626421ed8e78b1b3e5ac69fcedd22c58a8ab4c6147df","up":true},{"one":"3e1959b29bbacb3ce7dccfa41c3e51b87f1afc700a3c6e4713c38cc0fe3790df","other":"2d531c50183f0115269b3feaecf45927a3ac44e1be2a263c7e5d2274d8379b1c","up":true},{"one":"fac808b79923931febd54e3611b79811b3973c777e7502bd56b9803d0c4bf785","other":"ed2ec6681bf325887768703779ccf3a6278731118cd3ec890490a3de50f689ac","up":true},{"one":"68a63ebc4833dedfdb6d534438ffcccd042f60434bee0e39f4cb3726e7413e7a","other":"27b56302a89605a83563ba7b66d491ec25edfad0ea1010937fcadeab4d3ae582","up":true},{"one":"eb01ff80307afbfc7457c96594cd4ba4d00acb7fd25a7571d1223168bd66ff09","other":"ee2b0aff61a9846d13de3a72712ef0bf3ca42ad8da57e81759c242797258efec","up":true},{"one":"836e65dfe6f01e1d2934655c1846cb86fed6e41ea951a109d7a20bb14cb4c10a","other":"b2453c6e755a30efb91194fa607b3352d75b6905c448b09af4aeadf3a445b633","up":true},{"one":"b5fc43e8c0df3279d6a12cd8b03012cb8d2205208324018c7ae725745a99a2f3","other":"c52a68d8388a21013e4eecef9ea866db1f5eb16bbe0ecc82b8bfafd33e4e014f","up":true},{"one":"f33c07a818863a358358989ec71504abad3ca0a7c81b54aad59075a766fad501","other":"deec6a8beb4e5e441dd42311354194c3bef9448e8859b4ccd401645b69217d12","up":true},{"one":"37751f279493dc5ce5b5c3c55a6ec2e4119eedefe1069b283f6ff8c7bc9d1411","other":"2803f212eb4aa4f49224b16b2de88ba8652ad115321ee1e60cdbd926ecdad38a","up":true},{"one":"58a90b58858417a4e972626421ed8e78b1b3e5ac69fcedd22c58a8ab4c6147df","other":"6daaf515999c9a3491c963f76be82ed6005616bf7ba98247b01d6a89a9af1d71","up":true},{"one":"b8695bec6c8e1e6794bb943b83629cd2c910067e6e178f6f8e33c4f0fa2d74f4","other":"8330e2b8ae2f184bb8dc5e153fafa4dafe86f84ec692d3ee91413cc07b1cd9e2","up":true},{"one":"fa9a809f016097d949fa1463a1c8f08871c7d38e60b7df6d3e28ab04ccd3a143","other":"b60e77c40ddc9dc78a4ad346add37e60f10f2999de836615db53524487d1ede9","up":true},{"one":"c2f9b4abed9c6a839fe4c03a80bd396fd187a8784ba47a83687d3a54b7e2eddf","other":"03eb2e92ed0923f696269e7a03fec731d8c3f8df278023a9cb00867b533a3ca3","up":true},{"one":"8330e2b8ae2f184bb8dc5e153fafa4dafe86f84ec692d3ee91413cc07b1cd9e2","other":"8012a7af71d76d882202cf9372523478ccebea23443006c7f29c2a83106cd1b3","up":true},{"one":"0639f010834f5bc497798f2d275bbc60bfbcd53c83e38986b7260310c6001420","other":"772a79302528fdce6a216c98c95e281333292c81dfe490aeaa4a78bfeb1980c8","up":true},{"one":"64e642de2667a7563c774050d368858d99aff433efbd1cb68361e3e244629b03","other":"69753865aacaaf72d9bf6d265c885d3f705804ff4b2675f7aa860641dacab2a0","up":true},{"one":"b60e77c40ddc9dc78a4ad346add37e60f10f2999de836615db53524487d1ede9","other":"c9ef56afed2d40db396ad39d6f5f5f38f4058b6b0d1e02b71d6aa92dbeaf7df7","up":true},{"one":"bc71f3e409edb989e26607448491530c5451053b582ea64d882525451ac940bb","other":"a1929f704664ca85d829ac3bab62e688647a7cfdcbc9f03c61b0124cf9093505","up":true},{"one":"75e282c0f3d355a40573e6578c5aac98e7262970a9239f4dcefd26d6f008b553","other":"5c623fa0103108d0b1e24e6d01a6624ce3b59a9e7c422c45dfc1211676785542","up":true},{"one":"eceb7dc532596e8b68074113db9605e3d15cb15e2e80f75f1a66d95a1221c7dc","other":"216e0370111e2e03927b803ae788f9947de8e241d41dbf6a70983cf0ecd68af1","up":true},{"one":"c9ef56afed2d40db396ad39d6f5f5f38f4058b6b0d1e02b71d6aa92dbeaf7df7","other":"03eb2e92ed0923f696269e7a03fec731d8c3f8df278023a9cb00867b533a3ca3","up":true},{"one":"fa655b4882579e65937a14ab1c6bcba021580f0a5ebc04c48424f5ae72b7d5b4","other":"c0adf394af7d5670c1ce8c6bea292fbc03c56ae2b636e2f303311a455bb3500f","up":true},{"one":"f4a0f76b30bcf5987cfa3f4f4b0aa3445f39d60a1f51519fa660c27b5d833dde","other":"dd92b3d42414fd5eff5c1e4ca55c63cd7036634049995b72a20cdf7ca1321978","up":true},{"one":"b9d906e406b0fc6078c22bbc173043df1f7581061b4f6ccd769bc568d94b4339","other":"8d3e0d9c6932d3422024394998e943309b679d667394d0eb622f0e208e7fcf0a","up":true},{"one":"01a63575c384f686e5739e1bd079e4a4c55421cd6d89b944e2c61dd174fa2bf6","other":"5008ef55ad8088f70643b0f93bcb479531bcb0afe8e01b215dbf8597ec866369","up":true},{"one":"0f3106adfe70aefb474c4a98a95932307391de2cb70fbd2e11dd31c9e695ed83","other":"3871492c8c62cd74cbe65a993669e4978cc641879a5223dd6b9e687f050a1c40","up":true},{"one":"acf888ed781f5358493e2e5048691acc39eac3240ca9e9093bb4052b1f624325","other":"cc9f65d734f1a3bbc6019e166fe355bd7fc33bb4887043a5ccf532a9ba356379","up":true},{"one":"184e9e00ab4fe1669d4d99fb33d418d33eff927da38cc997f69679443c24b20b","other":"2d531c50183f0115269b3feaecf45927a3ac44e1be2a263c7e5d2274d8379b1c","up":true},{"one":"127c89eae94b195df2eb5eb7b44f634adb73c114d2089cd904b56988c8674e11","other":"184e9e00ab4fe1669d4d99fb33d418d33eff927da38cc997f69679443c24b20b","up":true},{"one":"bd9607d5f57f7b6f74f4ad981be368988ef48b5f31e3fd96cab3bb790d568150","other":"8330e2b8ae2f184bb8dc5e153fafa4dafe86f84ec692d3ee91413cc07b1cd9e2","up":true},{"one":"69753865aacaaf72d9bf6d265c885d3f705804ff4b2675f7aa860641dacab2a0","other":"75e282c0f3d355a40573e6578c5aac98e7262970a9239f4dcefd26d6f008b553","up":true},{"one":"45895aff674079f6be02e4cc74914d63125c3fe48bb69056c070c71319fea1fa","other":"5a8ba4047c4456e825bd1b34c961f5c7f37bf7c27bc48bee71b8430c7d135486","up":true},{"one":"5a8ba4047c4456e825bd1b34c961f5c7f37bf7c27bc48bee71b8430c7d135486","other":"c9ef56afed2d40db396ad39d6f5f5f38f4058b6b0d1e02b71d6aa92dbeaf7df7","up":true},{"one":"2471776037d55a05df2b15bcefe52cb1f4c942e9e15113abc2a0c1fcbaa5d626","other":"184e9e00ab4fe1669d4d99fb33d418d33eff927da38cc997f69679443c24b20b","up":true},{"one":"6379b4d611cdd6e360480c14b3f6784360f28f702b5a6f375eda4ef3bde7ef33","other":"3590afcd10fb8f58c39f72068661d9a772b77e0efd57bbd60306632fb048fa3a","up":true},{"one":"4d750666dc0e9e2c244c43492801c1d7ec6208954a0cb5f8bb793b912440753a","other":"5c623fa0103108d0b1e24e6d01a6624ce3b59a9e7c422c45dfc1211676785542","up":true},{"one":"5be6df23201fc5c00be650849c8bfe5581e44033ef19012836f97c98f3954471","other":"4d750666dc0e9e2c244c43492801c1d7ec6208954a0cb5f8bb793b912440753a","up":true},{"one":"ed12c78e700bf805669c48a5d62f1e56791263c4b2ce5bd34587ea9bc931a3e5","other":"f611d8039385ad56260ab391763e3627aadd2756565fedc3ec95f76124da0efc","up":true},{"one":"bd486e1e15df4c7539b1ad5b54f7566dd4836a430e9f7d3503881fa79e258d9b","other":"f177ee6767a78a57b725dbe67ec377f507f5777d345a28892b0fbfb800dc443a","up":true},{"one":"21dcfb893a54cb56d21355fc564583057fc51b32503a8627e7575660725a7627","other":"deec6a8beb4e5e441dd42311354194c3bef9448e8859b4ccd401645b69217d12","up":true},{"one":"aba793e635f71169105ad073225cc8db914de6b711fe9f22c5d94ac8cb85e2eb","other":"947205fd85a17330a6d5c51a66548c5f69779c76ab12408f8fc6d33d7c6b8e9d","up":true},{"one":"4c211c117e555c2ac831d5688615b6b4c5e31f1d7c7906b34f0cbcdbc45482b4","other":"772a79302528fdce6a216c98c95e281333292c81dfe490aeaa4a78bfeb1980c8","up":true},{"one":"2354d3af5c6dca05d7dc212b100112f37ab29fb8b3f4319887230a4d420f5d9d","other":"c9ef56afed2d40db396ad39d6f5f5f38f4058b6b0d1e02b71d6aa92dbeaf7df7","up":true},{"one":"034de66774eda26b93e342c9b94b9deaeb6297650c819b144a5832bebfe6b02f","other":"947205fd85a17330a6d5c51a66548c5f69779c76ab12408f8fc6d33d7c6b8e9d","up":true},{"one":"ce01234661309127bb872d69d38dc5bf19bc4de2e0a0b5041cd362d073df4ff8","other":"f005a4d3453d52434f2b5be4006e653b50b52ad31926d654722fc3df00f1689c","up":true},{"one":"2dd4ad83effc3ba73e72f5659583e5987241bda563563200b50c46cce00a1d9b","other":"c52a68d8388a21013e4eecef9ea866db1f5eb16bbe0ecc82b8bfafd33e4e014f","up":true},{"one":"6450bb5e880411abcb60258d8560949f6f70d92ba7bfa9a4d7845463c48dab30","other":"4d750666dc0e9e2c244c43492801c1d7ec6208954a0cb5f8bb793b912440753a","up":true},{"one":"6daaf515999c9a3491c963f76be82ed6005616bf7ba98247b01d6a89a9af1d71","other":"f177ee6767a78a57b725dbe67ec377f507f5777d345a28892b0fbfb800dc443a","up":true},{"one":"1929b01c0f85af7452a0f358b54f6b36640a196b366909172af594a1648fe64c","other":"3590afcd10fb8f58c39f72068661d9a772b77e0efd57bbd60306632fb048fa3a","up":true},{"one":"7bcb0d7b9f84aed413cf9b2a7851ba6d1138d85382aa20e6c939a43c8e59c034","other":"6450bb5e880411abcb60258d8560949f6f70d92ba7bfa9a4d7845463c48dab30","up":true},{"one":"e06f58b144faa650f96465825d253b63d7e061e3a3c4228ad5e1b665afbccc37","other":"f611d8039385ad56260ab391763e3627aadd2756565fedc3ec95f76124da0efc","up":true},{"one":"772a79302528fdce6a216c98c95e281333292c81dfe490aeaa4a78bfeb1980c8","other":"3590afcd10fb8f58c39f72068661d9a772b77e0efd57bbd60306632fb048fa3a","up":true},{"one":"7a68fa44bbec187272e2d5dfbd6ed8af31a1a365aa72aa50db02350ebe98c859","other":"947205fd85a17330a6d5c51a66548c5f69779c76ab12408f8fc6d33d7c6b8e9d","up":true},{"one":"3590afcd10fb8f58c39f72068661d9a772b77e0efd57bbd60306632fb048fa3a","other":"bddbdff3cbd22fcedddc07de27125819aac72be72c3126ba898621c496cb95a2","up":true},{"one":"efd68d2c99346ca085c9ef896bee6125ad8638413295108f3a92b247a41ca629","other":"8012a7af71d76d882202cf9372523478ccebea23443006c7f29c2a83106cd1b3","up":true},{"one":"d125317b492df46a7dd496d30c6d07839ed6bfa196abde4886ce7bc8f9b5c01f","other":"82847a4af4f50622650d035f69151b202bccd5fc92302a617602c974603ed997","up":true},{"one":"f177ee6767a78a57b725dbe67ec377f507f5777d345a28892b0fbfb800dc443a","other":"d18a1edd26661069fb401fee8aa85a9614a3188e2e0666bfe9307f91d29aad49","up":true},{"one":"13853407d278a45e15d4b148fc38ebb35c4f58ee552ee0e4401c6c98c45b8e3e","other":"51c285489ff14628268ae886945e1cd2da64c6a0a8cb184aada98567ab429b6e","up":true},{"one":"17406dea5046f00e27eaf74e166a945c9485139d6edcdfcd84f5b03f50eedd0a","other":"55fdad03303a746920773217c568a37d2004869ff34096fbe45197f71eba2b63","up":true},{"one":"bc29a0d9b60f3e2c34224cec187cf44eadc4628086d5594666ed025da71e7e7a","other":"d18a1edd26661069fb401fee8aa85a9614a3188e2e0666bfe9307f91d29aad49","up":true},{"one":"36d5952685c95e42bef14f77b63705897ca71d24d21e4e9efc772d9cabd21122","other":"2803f212eb4aa4f49224b16b2de88ba8652ad115321ee1e60cdbd926ecdad38a","up":true},{"one":"a9fa28117a4b6906b5ce3931573e0a19eec3cb4fcd9141be2d258a2be06f3b61","other":"957ed6194e6ef56e9696be43a1a0258f2ba4f48f56d790e42bd0663c3fc6aaae","up":true},{"one":"672a566c7c2aeb1d91e6ee4e43984050df8b9560d923d60dc1fb23fb73b1a046","other":"2803f212eb4aa4f49224b16b2de88ba8652ad115321ee1e60cdbd926ecdad38a","up":true},{"one":"8d3e0d9c6932d3422024394998e943309b679d667394d0eb622f0e208e7fcf0a","other":"b5fc43e8c0df3279d6a12cd8b03012cb8d2205208324018c7ae725745a99a2f3","up":true},{"one":"c52a68d8388a21013e4eecef9ea866db1f5eb16bbe0ecc82b8bfafd33e4e014f","other":"c9ef56afed2d40db396ad39d6f5f5f38f4058b6b0d1e02b71d6aa92dbeaf7df7","up":true},{"one":"5c623fa0103108d0b1e24e6d01a6624ce3b59a9e7c422c45dfc1211676785542","other":"184e9e00ab4fe1669d4d99fb33d418d33eff927da38cc997f69679443c24b20b","up":true},{"one":"3871492c8c62cd74cbe65a993669e4978cc641879a5223dd6b9e687f050a1c40","other":"459b9fb2b7f4e396de8cf8740a6804c8e5b96ca11ffa2b5106c14dfbbab65c95","up":true},{"one":"4bc8dfbf84794d26d7a573c9d898974eaa3a2167e19cb7a8aa460807a603acd4","other":"184e9e00ab4fe1669d4d99fb33d418d33eff927da38cc997f69679443c24b20b","up":true},{"one":"bde90aaa0f1f7a7eb965ff308718d29b55a80b1ca84dfba16c169eabe2b0d5de","other":"e06f58b144faa650f96465825d253b63d7e061e3a3c4228ad5e1b665afbccc37","up":true},{"one":"ed2ec6681bf325887768703779ccf3a6278731118cd3ec890490a3de50f689ac","other":"e06f58b144faa650f96465825d253b63d7e061e3a3c4228ad5e1b665afbccc37","up":true},{"one":"d9d30b9b212bd4811a44ebe304ba3935ead3abe3247f99893faf65664131c29d","other":"acf888ed781f5358493e2e5048691acc39eac3240ca9e9093bb4052b1f624325","up":true},{"one":"82847a4af4f50622650d035f69151b202bccd5fc92302a617602c974603ed997","other":"8fb8208b7167dd06cc08778b507ccd856751d3df6dfbaeac18b9f527b6628523","up":true},{"one":"4cc2386a86fd210bf699c6d93173b0879c3210d46f572a62bb154cb60a7d2cb1","other":"13853407d278a45e15d4b148fc38ebb35c4f58ee552ee0e4401c6c98c45b8e3e","up":true},{"one":"947205fd85a17330a6d5c51a66548c5f69779c76ab12408f8fc6d33d7c6b8e9d","other":"deec6a8beb4e5e441dd42311354194c3bef9448e8859b4ccd401645b69217d12","up":true},{"one":"51c285489ff14628268ae886945e1cd2da64c6a0a8cb184aada98567ab429b6e","other":"bddbdff3cbd22fcedddc07de27125819aac72be72c3126ba898621c496cb95a2","up":true},{"one":"72a76f668d9b923914860eb4f8577bc98c153f6dd222cd36a0bbdef2bab7f068","other":"5be6df23201fc5c00be650849c8bfe5581e44033ef19012836f97c98f3954471","up":true},{"one":"aedc9b478204effdcbad1a892333f15c061fbd1423b370f8a50f929b2a2f6952","other":"deec6a8beb4e5e441dd42311354194c3bef9448e8859b4ccd401645b69217d12","up":true},{"one":"77eedcac0c847b1d693ddff07c5868afb1c2008b2dcb48a0299143ab14611969","other":"73d0d1d4a2b7250f51e57c13cc48bc6b20682320ce12ee8e5765afeef7d9de42","up":true},{"one":"bddbdff3cbd22fcedddc07de27125819aac72be72c3126ba898621c496cb95a2","other":"b3555baa764c4562935b93533ee6c5a6df631e846c3ab512fdb1d6b901a68c60","up":true},{"one":"4a373571475e2b4c280d2d4b22f10a249ee09fcf907f52081ec0398a8b5ea6f2","other":"37751f279493dc5ce5b5c3c55a6ec2e4119eedefe1069b283f6ff8c7bc9d1411","up":true},{"one":"d18a1edd26661069fb401fee8aa85a9614a3188e2e0666bfe9307f91d29aad49","other":"8fb8208b7167dd06cc08778b507ccd856751d3df6dfbaeac18b9f527b6628523","up":true},{"one":"03eb2e92ed0923f696269e7a03fec731d8c3f8df278023a9cb00867b533a3ca3","other":"127c89eae94b195df2eb5eb7b44f634adb73c114d2089cd904b56988c8674e11","up":true},{"one":"4efaabab0d5dc59f098aee4dba3868263411a55615a2c474a73e6eec2211decc","other":"1929b01c0f85af7452a0f358b54f6b36640a196b366909172af594a1648fe64c","up":true},{"one":"62f007c92a8af466e90ed0b1e5e71a955ad273ec793948ddfc03977f131ed2d1","other":"55fdad03303a746920773217c568a37d2004869ff34096fbe45197f71eba2b63","up":true},{"one":"27db66d13ee8168aca89786febd6971dd1d6c554bca8501052065cb47631560d","other":"3590afcd10fb8f58c39f72068661d9a772b77e0efd57bbd60306632fb048fa3a","up":true},{"one":"b3555baa764c4562935b93533ee6c5a6df631e846c3ab512fdb1d6b901a68c60","other":"e06f58b144faa650f96465825d253b63d7e061e3a3c4228ad5e1b665afbccc37","up":true},{"one":"22bbb3236a5e0a1947a1c4735aaacf9122173789a02a06e7653103bdcae2f823","other":"b5fc43e8c0df3279d6a12cd8b03012cb8d2205208324018c7ae725745a99a2f3","up":true},{"one":"641a165f8be0eee36f53c12bae8e2a34a709adb8d1dcd667e88e4e90c9ee2401","other":"1929b01c0f85af7452a0f358b54f6b36640a196b366909172af594a1648fe64c","up":true},{"one":"f005a4d3453d52434f2b5be4006e653b50b52ad31926d654722fc3df00f1689c","other":"f611d8039385ad56260ab391763e3627aadd2756565fedc3ec95f76124da0efc","up":true},{"one":"7bee7967ff7b07243bed55b6d060d5ec2a1f28b530ed65cd055dc5b468a0f878","other":"7bcb0d7b9f84aed413cf9b2a7851ba6d1138d85382aa20e6c939a43c8e59c034","up":true},{"one":"0a215c7765be2caebf76ad3e8017bbc2aaadf8e0dd4859af781953a0564c5d59","other":"8330e2b8ae2f184bb8dc5e153fafa4dafe86f84ec692d3ee91413cc07b1cd9e2","up":true},{"one":"ee2b0aff61a9846d13de3a72712ef0bf3ca42ad8da57e81759c242797258efec","other":"ea3d6aa50ad5a1d5647d213f9b5cfe6718339eec7eef8644487eb3c223c7bcde","up":true},{"one":"47753fdca855ea79abf667b50aa9c90a132d44bdd1572c3e3c411c8ee7e5b5f4","other":"75e282c0f3d355a40573e6578c5aac98e7262970a9239f4dcefd26d6f008b553","up":true},{"one":"a86117147b78f20a6d883d37715da85178cad89eff650a74aa89e7bc11bc45a7","other":"eceb7dc532596e8b68074113db9605e3d15cb15e2e80f75f1a66d95a1221c7dc","up":true},{"one":"0e344c6e27c23bd36bdd3ddcefa4e577fdc9461e52c7ce20135733a08b987b82","other":"2354d3af5c6dca05d7dc212b100112f37ab29fb8b3f4319887230a4d420f5d9d","up":true},{"one":"5008ef55ad8088f70643b0f93bcb479531bcb0afe8e01b215dbf8597ec866369","other":"127c89eae94b195df2eb5eb7b44f634adb73c114d2089cd904b56988c8674e11","up":true},{"one":"d23c97bebcde26f5e351c4b975c76aaf604fd206f9b9063ecbda538e7a52f514","other":"f4a0f76b30bcf5987cfa3f4f4b0aa3445f39d60a1f51519fa660c27b5d833dde","up":true},{"one":"b4e29de4bd5751f31195ead8aa1548d305a53fb4f99be9931850e6273de8f359","other":"a1929f704664ca85d829ac3bab62e688647a7cfdcbc9f03c61b0124cf9093505","up":true},{"one":"cabfdfb789cc20962eaba1dbe68d6dc0466e699d22dc5b29f27a5cd555398795","other":"8330e2b8ae2f184bb8dc5e153fafa4dafe86f84ec692d3ee91413cc07b1cd9e2","up":true},{"one":"77eedcac0c847b1d693ddff07c5868afb1c2008b2dcb48a0299143ab14611969","other":"f33c07a818863a358358989ec71504abad3ca0a7c81b54aad59075a766fad501","up":true},{"one":"772a79302528fdce6a216c98c95e281333292c81dfe490aeaa4a78bfeb1980c8","other":"3871492c8c62cd74cbe65a993669e4978cc641879a5223dd6b9e687f050a1c40","up":true},{"one":"f611d8039385ad56260ab391763e3627aadd2756565fedc3ec95f76124da0efc","other":"cabfdfb789cc20962eaba1dbe68d6dc0466e699d22dc5b29f27a5cd555398795","up":true},{"one":"0a215c7765be2caebf76ad3e8017bbc2aaadf8e0dd4859af781953a0564c5d59","other":"36d5952685c95e42bef14f77b63705897ca71d24d21e4e9efc772d9cabd21122","up":true},{"one":"aba793e635f71169105ad073225cc8db914de6b711fe9f22c5d94ac8cb85e2eb","other":"8d3e0d9c6932d3422024394998e943309b679d667394d0eb622f0e208e7fcf0a","up":true},{"one":"fac808b79923931febd54e3611b79811b3973c777e7502bd56b9803d0c4bf785","other":"ee2b0aff61a9846d13de3a72712ef0bf3ca42ad8da57e81759c242797258efec","up":true},{"one":"deec6a8beb4e5e441dd42311354194c3bef9448e8859b4ccd401645b69217d12","other":"c52a68d8388a21013e4eecef9ea866db1f5eb16bbe0ecc82b8bfafd33e4e014f","up":true},{"one":"8d3e0d9c6932d3422024394998e943309b679d667394d0eb622f0e208e7fcf0a","other":"17406dea5046f00e27eaf74e166a945c9485139d6edcdfcd84f5b03f50eedd0a","up":true},{"one":"4746379212b91ee1c13c1336e8f3a73a84408b7636c222c11bd27ce7d724e6c6","other":"64e642de2667a7563c774050d368858d99aff433efbd1cb68361e3e244629b03","up":true},{"one":"d9d30b9b212bd4811a44ebe304ba3935ead3abe3247f99893faf65664131c29d","other":"fa9a809f016097d949fa1463a1c8f08871c7d38e60b7df6d3e28ab04ccd3a143","up":true},{"one":"51c285489ff14628268ae886945e1cd2da64c6a0a8cb184aada98567ab429b6e","other":"4a373571475e2b4c280d2d4b22f10a249ee09fcf907f52081ec0398a8b5ea6f2","up":true},{"one":"4c211c117e555c2ac831d5688615b6b4c5e31f1d7c7906b34f0cbcdbc45482b4","other":"51c285489ff14628268ae886945e1cd2da64c6a0a8cb184aada98567ab429b6e","up":true},{"one":"52b47d52bf4a1afda1604b7942019c8d2ac4c760c5eb4597e1ce2dd7a8e1cf4d","other":"36d5952685c95e42bef14f77b63705897ca71d24d21e4e9efc772d9cabd21122","up":true},{"one":"bc71f3e409edb989e26607448491530c5451053b582ea64d882525451ac940bb","other":"a9fa28117a4b6906b5ce3931573e0a19eec3cb4fcd9141be2d258a2be06f3b61","up":true},{"one":"3e1959b29bbacb3ce7dccfa41c3e51b87f1afc700a3c6e4713c38cc0fe3790df","other":"0e344c6e27c23bd36bdd3ddcefa4e577fdc9461e52c7ce20135733a08b987b82","up":true},{"one":"27b56302a89605a83563ba7b66d491ec25edfad0ea1010937fcadeab4d3ae582","other":"0e344c6e27c23bd36bdd3ddcefa4e577fdc9461e52c7ce20135733a08b987b82","up":true},{"one":"ea3d6aa50ad5a1d5647d213f9b5cfe6718339eec7eef8644487eb3c223c7bcde","other":"a1929f704664ca85d829ac3bab62e688647a7cfdcbc9f03c61b0124cf9093505","up":true},{"one":"2d531c50183f0115269b3feaecf45927a3ac44e1be2a263c7e5d2274d8379b1c","other":"0e344c6e27c23bd36bdd3ddcefa4e577fdc9461e52c7ce20135733a08b987b82","up":true},{"one":"b8695bec6c8e1e6794bb943b83629cd2c910067e6e178f6f8e33c4f0fa2d74f4","other":"8012a7af71d76d882202cf9372523478ccebea23443006c7f29c2a83106cd1b3","up":true},{"one":"cc5fa2d49210e240983b0853ff15003f0d366f05cb1f6486bae2862cca852cc5","other":"f4a0f76b30bcf5987cfa3f4f4b0aa3445f39d60a1f51519fa660c27b5d833dde","up":true},{"one":"72a76f668d9b923914860eb4f8577bc98c153f6dd222cd36a0bbdef2bab7f068","other":"6450bb5e880411abcb60258d8560949f6f70d92ba7bfa9a4d7845463c48dab30","up":true},{"one":"6450bb5e880411abcb60258d8560949f6f70d92ba7bfa9a4d7845463c48dab30","other":"772a79302528fdce6a216c98c95e281333292c81dfe490aeaa4a78bfeb1980c8","up":true},{"one":"47753fdca855ea79abf667b50aa9c90a132d44bdd1572c3e3c411c8ee7e5b5f4","other":"72a53f0fb1b51855cb4054a39cbd1309a76a862d36e18af9ba0456a60325c06e","up":true},{"one":"68a63ebc4833dedfdb6d534438ffcccd042f60434bee0e39f4cb3726e7413e7a","other":"72a53f0fb1b51855cb4054a39cbd1309a76a862d36e18af9ba0456a60325c06e","up":true},{"one":"13853407d278a45e15d4b148fc38ebb35c4f58ee552ee0e4401c6c98c45b8e3e","other":"3871492c8c62cd74cbe65a993669e4978cc641879a5223dd6b9e687f050a1c40","up":true},{"one":"7a68fa44bbec187272e2d5dfbd6ed8af31a1a365aa72aa50db02350ebe98c859","other":"f33c07a818863a358358989ec71504abad3ca0a7c81b54aad59075a766fad501","up":true},{"one":"ee2b0aff61a9846d13de3a72712ef0bf3ca42ad8da57e81759c242797258efec","other":"f611d8039385ad56260ab391763e3627aadd2756565fedc3ec95f76124da0efc","up":true},{"one":"dd92b3d42414fd5eff5c1e4ca55c63cd7036634049995b72a20cdf7ca1321978","other":"8330e2b8ae2f184bb8dc5e153fafa4dafe86f84ec692d3ee91413cc07b1cd9e2","up":true},{"one":"c0adf394af7d5670c1ce8c6bea292fbc03c56ae2b636e2f303311a455bb3500f","other":"d9d30b9b212bd4811a44ebe304ba3935ead3abe3247f99893faf65664131c29d","up":true},{"one":"36d5952685c95e42bef14f77b63705897ca71d24d21e4e9efc772d9cabd21122","other":"27b56302a89605a83563ba7b66d491ec25edfad0ea1010937fcadeab4d3ae582","up":true},{"one":"4a3c39f044c425c153d4900db30f839d7866c8e0f4f4d38d9205e67fb540988e","other":"5c623fa0103108d0b1e24e6d01a6624ce3b59a9e7c422c45dfc1211676785542","up":true},{"one":"fa655b4882579e65937a14ab1c6bcba021580f0a5ebc04c48424f5ae72b7d5b4","other":"cabfdfb789cc20962eaba1dbe68d6dc0466e699d22dc5b29f27a5cd555398795","up":true},{"one":"4cc2386a86fd210bf699c6d93173b0879c3210d46f572a62bb154cb60a7d2cb1","other":"7bcb0d7b9f84aed413cf9b2a7851ba6d1138d85382aa20e6c939a43c8e59c034","up":true},{"one":"bd486e1e15df4c7539b1ad5b54f7566dd4836a430e9f7d3503881fa79e258d9b","other":"8fb8208b7167dd06cc08778b507ccd856751d3df6dfbaeac18b9f527b6628523","up":true},{"one":"64e642de2667a7563c774050d368858d99aff433efbd1cb68361e3e244629b03","other":"68a63ebc4833dedfdb6d534438ffcccd042f60434bee0e39f4cb3726e7413e7a","up":true},{"one":"034de66774eda26b93e342c9b94b9deaeb6297650c819b144a5832bebfe6b02f","other":"f33c07a818863a358358989ec71504abad3ca0a7c81b54aad59075a766fad501","up":true},{"one":"641a165f8be0eee36f53c12bae8e2a34a709adb8d1dcd667e88e4e90c9ee2401","other":"6379b4d611cdd6e360480c14b3f6784360f28f702b5a6f375eda4ef3bde7ef33","up":true},{"one":"836e65dfe6f01e1d2934655c1846cb86fed6e41ea951a109d7a20bb14cb4c10a","other":"8012a7af71d76d882202cf9372523478ccebea23443006c7f29c2a83106cd1b3","up":true},{"one":"6daaf515999c9a3491c963f76be82ed6005616bf7ba98247b01d6a89a9af1d71","other":"b60e77c40ddc9dc78a4ad346add37e60f10f2999de836615db53524487d1ede9","up":true},{"one":"4746379212b91ee1c13c1336e8f3a73a84408b7636c222c11bd27ce7d724e6c6","other":"72a53f0fb1b51855cb4054a39cbd1309a76a862d36e18af9ba0456a60325c06e","up":true},{"one":"21dcfb893a54cb56d21355fc564583057fc51b32503a8627e7575660725a7627","other":"13853407d278a45e15d4b148fc38ebb35c4f58ee552ee0e4401c6c98c45b8e3e","up":true},{"one":"b2453c6e755a30efb91194fa607b3352d75b6905c448b09af4aeadf3a445b633","other":"bd9607d5f57f7b6f74f4ad981be368988ef48b5f31e3fd96cab3bb790d568150","up":true},{"one":"72a53f0fb1b51855cb4054a39cbd1309a76a862d36e18af9ba0456a60325c06e","other":"45895aff674079f6be02e4cc74914d63125c3fe48bb69056c070c71319fea1fa","up":true},{"one":"947205fd85a17330a6d5c51a66548c5f69779c76ab12408f8fc6d33d7c6b8e9d","other":"be0fb2b440b91e719c20f51b673eb9f2f66c7af77b0b0ade312998cdffcc5045","up":true},{"one":"aedc9b478204effdcbad1a892333f15c061fbd1423b370f8a50f929b2a2f6952","other":"8d3e0d9c6932d3422024394998e943309b679d667394d0eb622f0e208e7fcf0a","up":true},{"one":"a1929f704664ca85d829ac3bab62e688647a7cfdcbc9f03c61b0124cf9093505","other":"8330e2b8ae2f184bb8dc5e153fafa4dafe86f84ec692d3ee91413cc07b1cd9e2","up":true},{"one":"e06f58b144faa650f96465825d253b63d7e061e3a3c4228ad5e1b665afbccc37","other":"ee2b0aff61a9846d13de3a72712ef0bf3ca42ad8da57e81759c242797258efec","up":true},{"one":"b3555baa764c4562935b93533ee6c5a6df631e846c3ab512fdb1d6b901a68c60","other":"82847a4af4f50622650d035f69151b202bccd5fc92302a617602c974603ed997","up":true},{"one":"8330e2b8ae2f184bb8dc5e153fafa4dafe86f84ec692d3ee91413cc07b1cd9e2","other":"0e344c6e27c23bd36bdd3ddcefa4e577fdc9461e52c7ce20135733a08b987b82","up":true},{"one":"5a8ba4047c4456e825bd1b34c961f5c7f37bf7c27bc48bee71b8430c7d135486","other":"77eedcac0c847b1d693ddff07c5868afb1c2008b2dcb48a0299143ab14611969","up":true},{"one":"5cc1c28eafd9758e807a28159a1a7a6ea313fa7e878fde5d47fcc8f5a5c25172","other":"2dd4ad83effc3ba73e72f5659583e5987241bda563563200b50c46cce00a1d9b","up":true},{"one":"22bbb3236a5e0a1947a1c4735aaacf9122173789a02a06e7653103bdcae2f823","other":"3b830c2ae5463ca2f2260176b77b8dda23048257aa780255c69cf1bbbc6fb64c","up":true},{"one":"45895aff674079f6be02e4cc74914d63125c3fe48bb69056c070c71319fea1fa","other":"55fdad03303a746920773217c568a37d2004869ff34096fbe45197f71eba2b63","up":true},{"one":"672a566c7c2aeb1d91e6ee4e43984050df8b9560d923d60dc1fb23fb73b1a046","other":"27b56302a89605a83563ba7b66d491ec25edfad0ea1010937fcadeab4d3ae582","up":true},{"one":"eceb7dc532596e8b68074113db9605e3d15cb15e2e80f75f1a66d95a1221c7dc","other":"f33c07a818863a358358989ec71504abad3ca0a7c81b54aad59075a766fad501","up":true},{"one":"fa9a809f016097d949fa1463a1c8f08871c7d38e60b7df6d3e28ab04ccd3a143","other":"eb01ff80307afbfc7457c96594cd4ba4d00acb7fd25a7571d1223168bd66ff09","up":true},{"one":"0f3106adfe70aefb474c4a98a95932307391de2cb70fbd2e11dd31c9e695ed83","other":"17406dea5046f00e27eaf74e166a945c9485139d6edcdfcd84f5b03f50eedd0a","up":true},{"one":"b9d906e406b0fc6078c22bbc173043df1f7581061b4f6ccd769bc568d94b4339","other":"a86117147b78f20a6d883d37715da85178cad89eff650a74aa89e7bc11bc45a7","up":true},{"one":"d23c97bebcde26f5e351c4b975c76aaf604fd206f9b9063ecbda538e7a52f514","other":"f611d8039385ad56260ab391763e3627aadd2756565fedc3ec95f76124da0efc","up":true},{"one":"216e0370111e2e03927b803ae788f9947de8e241d41dbf6a70983cf0ecd68af1","other":"3b830c2ae5463ca2f2260176b77b8dda23048257aa780255c69cf1bbbc6fb64c","up":true},{"one":"bd9607d5f57f7b6f74f4ad981be368988ef48b5f31e3fd96cab3bb790d568150","other":"836e65dfe6f01e1d2934655c1846cb86fed6e41ea951a109d7a20bb14cb4c10a","up":true},{"one":"08077c0ce8d4130c14464493e9164a8bae61b4646b1ec48899e75f2f6f9b8c66","other":"184e9e00ab4fe1669d4d99fb33d418d33eff927da38cc997f69679443c24b20b","up":true},{"one":"f3d50811ef10661d3ef9978077cd7181387298f306833ab6e27f25cbb77435cd","other":"fac808b79923931febd54e3611b79811b3973c777e7502bd56b9803d0c4bf785","up":true},{"one":"5008ef55ad8088f70643b0f93bcb479531bcb0afe8e01b215dbf8597ec866369","other":"47753fdca855ea79abf667b50aa9c90a132d44bdd1572c3e3c411c8ee7e5b5f4","up":true},{"one":"4a373571475e2b4c280d2d4b22f10a249ee09fcf907f52081ec0398a8b5ea6f2","other":"36d5952685c95e42bef14f77b63705897ca71d24d21e4e9efc772d9cabd21122","up":true},{"one":"6379b4d611cdd6e360480c14b3f6784360f28f702b5a6f375eda4ef3bde7ef33","other":"51c285489ff14628268ae886945e1cd2da64c6a0a8cb184aada98567ab429b6e","up":true},{"one":"d125317b492df46a7dd496d30c6d07839ed6bfa196abde4886ce7bc8f9b5c01f","other":"8330e2b8ae2f184bb8dc5e153fafa4dafe86f84ec692d3ee91413cc07b1cd9e2","up":true},{"one":"3b830c2ae5463ca2f2260176b77b8dda23048257aa780255c69cf1bbbc6fb64c","other":"13853407d278a45e15d4b148fc38ebb35c4f58ee552ee0e4401c6c98c45b8e3e","up":true},{"one":"4bc8dfbf84794d26d7a573c9d898974eaa3a2167e19cb7a8aa460807a603acd4","other":"75e282c0f3d355a40573e6578c5aac98e7262970a9239f4dcefd26d6f008b553","up":true},{"one":"ed12c78e700bf805669c48a5d62f1e56791263c4b2ce5bd34587ea9bc931a3e5","other":"f005a4d3453d52434f2b5be4006e653b50b52ad31926d654722fc3df00f1689c","up":true},{"one":"2471776037d55a05df2b15bcefe52cb1f4c942e9e15113abc2a0c1fcbaa5d626","other":"0e344c6e27c23bd36bdd3ddcefa4e577fdc9461e52c7ce20135733a08b987b82","up":true},{"one":"eb01ff80307afbfc7457c96594cd4ba4d00acb7fd25a7571d1223168bd66ff09","other":"fac808b79923931febd54e3611b79811b3973c777e7502bd56b9803d0c4bf785","up":true},{"one":"52b47d52bf4a1afda1604b7942019c8d2ac4c760c5eb4597e1ce2dd7a8e1cf4d","other":"3e1959b29bbacb3ce7dccfa41c3e51b87f1afc700a3c6e4713c38cc0fe3790df","up":true},{"one":"69753865aacaaf72d9bf6d265c885d3f705804ff4b2675f7aa860641dacab2a0","other":"62f007c92a8af466e90ed0b1e5e71a955ad273ec793948ddfc03977f131ed2d1","up":true},{"one":"acf888ed781f5358493e2e5048691acc39eac3240ca9e9093bb4052b1f624325","other":"8d3e0d9c6932d3422024394998e943309b679d667394d0eb622f0e208e7fcf0a","up":true},{"one":"127c89eae94b195df2eb5eb7b44f634adb73c114d2089cd904b56988c8674e11","other":"2354d3af5c6dca05d7dc212b100112f37ab29fb8b3f4319887230a4d420f5d9d","up":true},{"one":"bde90aaa0f1f7a7eb965ff308718d29b55a80b1ca84dfba16c169eabe2b0d5de","other":"82847a4af4f50622650d035f69151b202bccd5fc92302a617602c974603ed997","up":true},{"one":"f33c07a818863a358358989ec71504abad3ca0a7c81b54aad59075a766fad501","other":"fa9a809f016097d949fa1463a1c8f08871c7d38e60b7df6d3e28ab04ccd3a143","up":true},{"one":"5c623fa0103108d0b1e24e6d01a6624ce3b59a9e7c422c45dfc1211676785542","other":"2803f212eb4aa4f49224b16b2de88ba8652ad115321ee1e60cdbd926ecdad38a","up":true},{"one":"0e344c6e27c23bd36bdd3ddcefa4e577fdc9461e52c7ce20135733a08b987b82","other":"01a63575c384f686e5739e1bd079e4a4c55421cd6d89b944e2c61dd174fa2bf6","up":true},{"one":"8b35236da99930bf8f5ef6c7555bb18b80ce2e34361bbbfd6baf55a6483e54ff","other":"bddbdff3cbd22fcedddc07de27125819aac72be72c3126ba898621c496cb95a2","up":true},{"one":"cabfdfb789cc20962eaba1dbe68d6dc0466e699d22dc5b29f27a5cd555398795","other":"c0adf394af7d5670c1ce8c6bea292fbc03c56ae2b636e2f303311a455bb3500f","up":true},{"one":"4efaabab0d5dc59f098aee4dba3868263411a55615a2c474a73e6eec2211decc","other":"75e282c0f3d355a40573e6578c5aac98e7262970a9239f4dcefd26d6f008b553","up":true},{"one":"c2f9b4abed9c6a839fe4c03a80bd396fd187a8784ba47a83687d3a54b7e2eddf","other":"8d3e0d9c6932d3422024394998e943309b679d667394d0eb622f0e208e7fcf0a","up":true},{"one":"bc29a0d9b60f3e2c34224cec187cf44eadc4628086d5594666ed025da71e7e7a","other":"957ed6194e6ef56e9696be43a1a0258f2ba4f48f56d790e42bd0663c3fc6aaae","up":true},{"one":"27db66d13ee8168aca89786febd6971dd1d6c554bca8501052065cb47631560d","other":"37751f279493dc5ce5b5c3c55a6ec2e4119eedefe1069b283f6ff8c7bc9d1411","up":true},{"one":"62f007c92a8af466e90ed0b1e5e71a955ad273ec793948ddfc03977f131ed2d1","other":"73d0d1d4a2b7250f51e57c13cc48bc6b20682320ce12ee8e5765afeef7d9de42","up":true},{"one":"b4e29de4bd5751f31195ead8aa1548d305a53fb4f99be9931850e6273de8f359","other":"82847a4af4f50622650d035f69151b202bccd5fc92302a617602c974603ed997","up":true},{"one":"cc9f65d734f1a3bbc6019e166fe355bd7fc33bb4887043a5ccf532a9ba356379","other":"d9d30b9b212bd4811a44ebe304ba3935ead3abe3247f99893faf65664131c29d","up":true},{"one":"01a63575c384f686e5739e1bd079e4a4c55421cd6d89b944e2c61dd174fa2bf6","other":"3871492c8c62cd74cbe65a993669e4978cc641879a5223dd6b9e687f050a1c40","up":true},{"one":"d125317b492df46a7dd496d30c6d07839ed6bfa196abde4886ce7bc8f9b5c01f","other":"8012a7af71d76d882202cf9372523478ccebea23443006c7f29c2a83106cd1b3","up":true},{"one":"184e9e00ab4fe1669d4d99fb33d418d33eff927da38cc997f69679443c24b20b","other":"0e344c6e27c23bd36bdd3ddcefa4e577fdc9461e52c7ce20135733a08b987b82","up":true},{"one":"fa9a809f016097d949fa1463a1c8f08871c7d38e60b7df6d3e28ab04ccd3a143","other":"eceb7dc532596e8b68074113db9605e3d15cb15e2e80f75f1a66d95a1221c7dc","up":true},{"one":"2354d3af5c6dca05d7dc212b100112f37ab29fb8b3f4319887230a4d420f5d9d","other":"3b830c2ae5463ca2f2260176b77b8dda23048257aa780255c69cf1bbbc6fb64c","up":true},{"one":"efd68d2c99346ca085c9ef896bee6125ad8638413295108f3a92b247a41ca629","other":"dd92b3d42414fd5eff5c1e4ca55c63cd7036634049995b72a20cdf7ca1321978","up":true},{"one":"7bee7967ff7b07243bed55b6d060d5ec2a1f28b530ed65cd055dc5b468a0f878","other":"957ed6194e6ef56e9696be43a1a0258f2ba4f48f56d790e42bd0663c3fc6aaae","up":true},{"one":"73d0d1d4a2b7250f51e57c13cc48bc6b20682320ce12ee8e5765afeef7d9de42","other":"6daaf515999c9a3491c963f76be82ed6005616bf7ba98247b01d6a89a9af1d71","up":true},{"one":"2dd4ad83effc3ba73e72f5659583e5987241bda563563200b50c46cce00a1d9b","other":"034de66774eda26b93e342c9b94b9deaeb6297650c819b144a5832bebfe6b02f","up":true},{"one":"7bcb0d7b9f84aed413cf9b2a7851ba6d1138d85382aa20e6c939a43c8e59c034","other":"772a79302528fdce6a216c98c95e281333292c81dfe490aeaa4a78bfeb1980c8","up":true},{"one":"d125317b492df46a7dd496d30c6d07839ed6bfa196abde4886ce7bc8f9b5c01f","other":"e06f58b144faa650f96465825d253b63d7e061e3a3c4228ad5e1b665afbccc37","up":true},{"one":"ea3d6aa50ad5a1d5647d213f9b5cfe6718339eec7eef8644487eb3c223c7bcde","other":"ed2ec6681bf325887768703779ccf3a6278731118cd3ec890490a3de50f689ac","up":true},{"one":"77eedcac0c847b1d693ddff07c5868afb1c2008b2dcb48a0299143ab14611969","other":"6daaf515999c9a3491c963f76be82ed6005616bf7ba98247b01d6a89a9af1d71","up":true},{"one":"03eb2e92ed0923f696269e7a03fec731d8c3f8df278023a9cb00867b533a3ca3","other":"17406dea5046f00e27eaf74e166a945c9485139d6edcdfcd84f5b03f50eedd0a","up":true},{"one":"0a215c7765be2caebf76ad3e8017bbc2aaadf8e0dd4859af781953a0564c5d59","other":"3e1959b29bbacb3ce7dccfa41c3e51b87f1afc700a3c6e4713c38cc0fe3790df","up":true},{"one":"4bc8dfbf84794d26d7a573c9d898974eaa3a2167e19cb7a8aa460807a603acd4","other":"72a53f0fb1b51855cb4054a39cbd1309a76a862d36e18af9ba0456a60325c06e","up":true},{"one":"d18a1edd26661069fb401fee8aa85a9614a3188e2e0666bfe9307f91d29aad49","other":"82847a4af4f50622650d035f69151b202bccd5fc92302a617602c974603ed997","up":true},{"one":"bd9607d5f57f7b6f74f4ad981be368988ef48b5f31e3fd96cab3bb790d568150","other":"8012a7af71d76d882202cf9372523478ccebea23443006c7f29c2a83106cd1b3","up":true},{"one":"d9d30b9b212bd4811a44ebe304ba3935ead3abe3247f99893faf65664131c29d","other":"f33c07a818863a358358989ec71504abad3ca0a7c81b54aad59075a766fad501","up":true},{"one":"fa655b4882579e65937a14ab1c6bcba021580f0a5ebc04c48424f5ae72b7d5b4","other":"cc9f65d734f1a3bbc6019e166fe355bd7fc33bb4887043a5ccf532a9ba356379","up":true},{"one":"ce01234661309127bb872d69d38dc5bf19bc4de2e0a0b5041cd362d073df4ff8","other":"d18a1edd26661069fb401fee8aa85a9614a3188e2e0666bfe9307f91d29aad49","up":true},{"one":"221cd8ea0a26f0d3f81f782f1de390282415ecd9cf40224b4945a00897895b4e","other":"7a68fa44bbec187272e2d5dfbd6ed8af31a1a365aa72aa50db02350ebe98c859","up":true},{"one":"1929b01c0f85af7452a0f358b54f6b36640a196b366909172af594a1648fe64c","other":"034de66774eda26b93e342c9b94b9deaeb6297650c819b144a5832bebfe6b02f","up":true},{"one":"d23c97bebcde26f5e351c4b975c76aaf604fd206f9b9063ecbda538e7a52f514","other":"dd92b3d42414fd5eff5c1e4ca55c63cd7036634049995b72a20cdf7ca1321978","up":true},{"one":"4efaabab0d5dc59f098aee4dba3868263411a55615a2c474a73e6eec2211decc","other":"72a53f0fb1b51855cb4054a39cbd1309a76a862d36e18af9ba0456a60325c06e","up":true},{"one":"2471776037d55a05df2b15bcefe52cb1f4c942e9e15113abc2a0c1fcbaa5d626","other":"0a215c7765be2caebf76ad3e8017bbc2aaadf8e0dd4859af781953a0564c5d59","up":true},{"one":"17406dea5046f00e27eaf74e166a945c9485139d6edcdfcd84f5b03f50eedd0a","other":"5008ef55ad8088f70643b0f93bcb479531bcb0afe8e01b215dbf8597ec866369","up":true},{"one":"aba793e635f71169105ad073225cc8db914de6b711fe9f22c5d94ac8cb85e2eb","other":"b60e77c40ddc9dc78a4ad346add37e60f10f2999de836615db53524487d1ede9","up":true},{"one":"5be6df23201fc5c00be650849c8bfe5581e44033ef19012836f97c98f3954471","other":"4c211c117e555c2ac831d5688615b6b4c5e31f1d7c7906b34f0cbcdbc45482b4","up":true},{"one":"aba793e635f71169105ad073225cc8db914de6b711fe9f22c5d94ac8cb85e2eb","other":"f177ee6767a78a57b725dbe67ec377f507f5777d345a28892b0fbfb800dc443a","up":true},{"one":"f611d8039385ad56260ab391763e3627aadd2756565fedc3ec95f76124da0efc","other":"dd92b3d42414fd5eff5c1e4ca55c63cd7036634049995b72a20cdf7ca1321978","up":true},{"one":"f005a4d3453d52434f2b5be4006e653b50b52ad31926d654722fc3df00f1689c","other":"1929b01c0f85af7452a0f358b54f6b36640a196b366909172af594a1648fe64c","up":true},{"one":"c9ef56afed2d40db396ad39d6f5f5f38f4058b6b0d1e02b71d6aa92dbeaf7df7","other":"0639f010834f5bc497798f2d275bbc60bfbcd53c83e38986b7260310c6001420","up":true},{"one":"8fb8208b7167dd06cc08778b507ccd856751d3df6dfbaeac18b9f527b6628523","other":"bddbdff3cbd22fcedddc07de27125819aac72be72c3126ba898621c496cb95a2","up":true},{"one":"3b830c2ae5463ca2f2260176b77b8dda23048257aa780255c69cf1bbbc6fb64c","other":"17406dea5046f00e27eaf74e166a945c9485139d6edcdfcd84f5b03f50eedd0a","up":true},{"one":"47753fdca855ea79abf667b50aa9c90a132d44bdd1572c3e3c411c8ee7e5b5f4","other":"62f007c92a8af466e90ed0b1e5e71a955ad273ec793948ddfc03977f131ed2d1","up":true},{"one":"82847a4af4f50622650d035f69151b202bccd5fc92302a617602c974603ed997","other":"641a165f8be0eee36f53c12bae8e2a34a709adb8d1dcd667e88e4e90c9ee2401","up":true},{"one":"a9fa28117a4b6906b5ce3931573e0a19eec3cb4fcd9141be2d258a2be06f3b61","other":"8fb8208b7167dd06cc08778b507ccd856751d3df6dfbaeac18b9f527b6628523","up":true},{"one":"459b9fb2b7f4e396de8cf8740a6804c8e5b96ca11ffa2b5106c14dfbbab65c95","other":"4cc2386a86fd210bf699c6d93173b0879c3210d46f572a62bb154cb60a7d2cb1","up":true},{"one":"01a63575c384f686e5739e1bd079e4a4c55421cd6d89b944e2c61dd174fa2bf6","other":"3b830c2ae5463ca2f2260176b77b8dda23048257aa780255c69cf1bbbc6fb64c","up":true},{"one":"b8695bec6c8e1e6794bb943b83629cd2c910067e6e178f6f8e33c4f0fa2d74f4","other":"b2453c6e755a30efb91194fa607b3352d75b6905c448b09af4aeadf3a445b633","up":true},{"one":"ed12c78e700bf805669c48a5d62f1e56791263c4b2ce5bd34587ea9bc931a3e5","other":"fa655b4882579e65937a14ab1c6bcba021580f0a5ebc04c48424f5ae72b7d5b4","up":true},{"one":"58a90b58858417a4e972626421ed8e78b1b3e5ac69fcedd22c58a8ab4c6147df","other":"641a165f8be0eee36f53c12bae8e2a34a709adb8d1dcd667e88e4e90c9ee2401","up":true},{"one":"d125317b492df46a7dd496d30c6d07839ed6bfa196abde4886ce7bc8f9b5c01f","other":"f177ee6767a78a57b725dbe67ec377f507f5777d345a28892b0fbfb800dc443a","up":true},{"one":"bddbdff3cbd22fcedddc07de27125819aac72be72c3126ba898621c496cb95a2","other":"b4e29de4bd5751f31195ead8aa1548d305a53fb4f99be9931850e6273de8f359","up":true},{"one":"72a76f668d9b923914860eb4f8577bc98c153f6dd222cd36a0bbdef2bab7f068","other":"641a165f8be0eee36f53c12bae8e2a34a709adb8d1dcd667e88e4e90c9ee2401","up":true},{"one":"ea3d6aa50ad5a1d5647d213f9b5cfe6718339eec7eef8644487eb3c223c7bcde","other":"d18a1edd26661069fb401fee8aa85a9614a3188e2e0666bfe9307f91d29aad49","up":true},{"one":"0f3106adfe70aefb474c4a98a95932307391de2cb70fbd2e11dd31c9e695ed83","other":"0639f010834f5bc497798f2d275bbc60bfbcd53c83e38986b7260310c6001420","up":true},{"one":"bd486e1e15df4c7539b1ad5b54f7566dd4836a430e9f7d3503881fa79e258d9b","other":"8d3e0d9c6932d3422024394998e943309b679d667394d0eb622f0e208e7fcf0a","up":true},{"one":"6379b4d611cdd6e360480c14b3f6784360f28f702b5a6f375eda4ef3bde7ef33","other":"52b47d52bf4a1afda1604b7942019c8d2ac4c760c5eb4597e1ce2dd7a8e1cf4d","up":true},{"one":"8b35236da99930bf8f5ef6c7555bb18b80ce2e34361bbbfd6baf55a6483e54ff","other":"be0fb2b440b91e719c20f51b673eb9f2f66c7af77b0b0ade312998cdffcc5045","up":true},{"one":"21dcfb893a54cb56d21355fc564583057fc51b32503a8627e7575660725a7627","other":"034de66774eda26b93e342c9b94b9deaeb6297650c819b144a5832bebfe6b02f","up":true},{"one":"5a8ba4047c4456e825bd1b34c961f5c7f37bf7c27bc48bee71b8430c7d135486","other":"72a53f0fb1b51855cb4054a39cbd1309a76a862d36e18af9ba0456a60325c06e","up":true},{"one":"68a63ebc4833dedfdb6d534438ffcccd042f60434bee0e39f4cb3726e7413e7a","other":"672a566c7c2aeb1d91e6ee4e43984050df8b9560d923d60dc1fb23fb73b1a046","up":true},{"one":"b2453c6e755a30efb91194fa607b3352d75b6905c448b09af4aeadf3a445b633","other":"a1929f704664ca85d829ac3bab62e688647a7cfdcbc9f03c61b0124cf9093505","up":true},{"one":"deec6a8beb4e5e441dd42311354194c3bef9448e8859b4ccd401645b69217d12","other":"f177ee6767a78a57b725dbe67ec377f507f5777d345a28892b0fbfb800dc443a","up":true},{"one":"957ed6194e6ef56e9696be43a1a0258f2ba4f48f56d790e42bd0663c3fc6aaae","other":"3590afcd10fb8f58c39f72068661d9a772b77e0efd57bbd60306632fb048fa3a","up":true},{"one":"6450bb5e880411abcb60258d8560949f6f70d92ba7bfa9a4d7845463c48dab30","other":"73d0d1d4a2b7250f51e57c13cc48bc6b20682320ce12ee8e5765afeef7d9de42","up":true},{"one":"d23c97bebcde26f5e351c4b975c76aaf604fd206f9b9063ecbda538e7a52f514","other":"efd68d2c99346ca085c9ef896bee6125ad8638413295108f3a92b247a41ca629","up":true},{"one":"dd92b3d42414fd5eff5c1e4ca55c63cd7036634049995b72a20cdf7ca1321978","other":"8012a7af71d76d882202cf9372523478ccebea23443006c7f29c2a83106cd1b3","up":true},{"one":"6379b4d611cdd6e360480c14b3f6784360f28f702b5a6f375eda4ef3bde7ef33","other":"5c623fa0103108d0b1e24e6d01a6624ce3b59a9e7c422c45dfc1211676785542","up":true},{"one":"bde90aaa0f1f7a7eb965ff308718d29b55a80b1ca84dfba16c169eabe2b0d5de","other":"8330e2b8ae2f184bb8dc5e153fafa4dafe86f84ec692d3ee91413cc07b1cd9e2","up":true},{"one":"4a373571475e2b4c280d2d4b22f10a249ee09fcf907f52081ec0398a8b5ea6f2","other":"75e282c0f3d355a40573e6578c5aac98e7262970a9239f4dcefd26d6f008b553","up":true},{"one":"f611d8039385ad56260ab391763e3627aadd2756565fedc3ec95f76124da0efc","other":"fa655b4882579e65937a14ab1c6bcba021580f0a5ebc04c48424f5ae72b7d5b4","up":true},{"one":"27db66d13ee8168aca89786febd6971dd1d6c554bca8501052065cb47631560d","other":"2803f212eb4aa4f49224b16b2de88ba8652ad115321ee1e60cdbd926ecdad38a","up":true},{"one":"52b47d52bf4a1afda1604b7942019c8d2ac4c760c5eb4597e1ce2dd7a8e1cf4d","other":"2803f212eb4aa4f49224b16b2de88ba8652ad115321ee1e60cdbd926ecdad38a","up":true},{"one":"73d0d1d4a2b7250f51e57c13cc48bc6b20682320ce12ee8e5765afeef7d9de42","other":"7a68fa44bbec187272e2d5dfbd6ed8af31a1a365aa72aa50db02350ebe98c859","up":true},{"one":"27b56302a89605a83563ba7b66d491ec25edfad0ea1010937fcadeab4d3ae582","other":"0a215c7765be2caebf76ad3e8017bbc2aaadf8e0dd4859af781953a0564c5d59","up":true},{"one":"4746379212b91ee1c13c1336e8f3a73a84408b7636c222c11bd27ce7d724e6c6","other":"4d750666dc0e9e2c244c43492801c1d7ec6208954a0cb5f8bb793b912440753a","up":true},{"one":"7a68fa44bbec187272e2d5dfbd6ed8af31a1a365aa72aa50db02350ebe98c859","other":"6450bb5e880411abcb60258d8560949f6f70d92ba7bfa9a4d7845463c48dab30","up":true},{"one":"0639f010834f5bc497798f2d275bbc60bfbcd53c83e38986b7260310c6001420","other":"13853407d278a45e15d4b148fc38ebb35c4f58ee552ee0e4401c6c98c45b8e3e","up":true},{"one":"bc29a0d9b60f3e2c34224cec187cf44eadc4628086d5594666ed025da71e7e7a","other":"947205fd85a17330a6d5c51a66548c5f69779c76ab12408f8fc6d33d7c6b8e9d","up":true},{"one":"03eb2e92ed0923f696269e7a03fec731d8c3f8df278023a9cb00867b533a3ca3","other":"0a215c7765be2caebf76ad3e8017bbc2aaadf8e0dd4859af781953a0564c5d59","up":true},{"one":"772a79302528fdce6a216c98c95e281333292c81dfe490aeaa4a78bfeb1980c8","other":"51c285489ff14628268ae886945e1cd2da64c6a0a8cb184aada98567ab429b6e","up":true},{"one":"37751f279493dc5ce5b5c3c55a6ec2e4119eedefe1069b283f6ff8c7bc9d1411","other":"21dcfb893a54cb56d21355fc564583057fc51b32503a8627e7575660725a7627","up":true},{"one":"127c89eae94b195df2eb5eb7b44f634adb73c114d2089cd904b56988c8674e11","other":"27b56302a89605a83563ba7b66d491ec25edfad0ea1010937fcadeab4d3ae582","up":true},{"one":"1929b01c0f85af7452a0f358b54f6b36640a196b366909172af594a1648fe64c","other":"21dcfb893a54cb56d21355fc564583057fc51b32503a8627e7575660725a7627","up":true},{"one":"3b830c2ae5463ca2f2260176b77b8dda23048257aa780255c69cf1bbbc6fb64c","other":"034de66774eda26b93e342c9b94b9deaeb6297650c819b144a5832bebfe6b02f","up":true},{"one":"fa655b4882579e65937a14ab1c6bcba021580f0a5ebc04c48424f5ae72b7d5b4","other":"f3d50811ef10661d3ef9978077cd7181387298f306833ab6e27f25cbb77435cd","up":true},{"one":"8fb8208b7167dd06cc08778b507ccd856751d3df6dfbaeac18b9f527b6628523","other":"bc29a0d9b60f3e2c34224cec187cf44eadc4628086d5594666ed025da71e7e7a","up":true},{"one":"2d531c50183f0115269b3feaecf45927a3ac44e1be2a263c7e5d2274d8379b1c","other":"5c623fa0103108d0b1e24e6d01a6624ce3b59a9e7c422c45dfc1211676785542","up":true},{"one":"68a63ebc4833dedfdb6d534438ffcccd042f60434bee0e39f4cb3726e7413e7a","other":"75e282c0f3d355a40573e6578c5aac98e7262970a9239f4dcefd26d6f008b553","up":true},{"one":"acf888ed781f5358493e2e5048691acc39eac3240ca9e9093bb4052b1f624325","other":"b5fc43e8c0df3279d6a12cd8b03012cb8d2205208324018c7ae725745a99a2f3","up":true},{"one":"bc71f3e409edb989e26607448491530c5451053b582ea64d882525451ac940bb","other":"a86117147b78f20a6d883d37715da85178cad89eff650a74aa89e7bc11bc45a7","up":true},{"one":"ee2b0aff61a9846d13de3a72712ef0bf3ca42ad8da57e81759c242797258efec","other":"f4a0f76b30bcf5987cfa3f4f4b0aa3445f39d60a1f51519fa660c27b5d833dde","up":true},{"one":"acf888ed781f5358493e2e5048691acc39eac3240ca9e9093bb4052b1f624325","other":"b60e77c40ddc9dc78a4ad346add37e60f10f2999de836615db53524487d1ede9","up":true},{"one":"b5fc43e8c0df3279d6a12cd8b03012cb8d2205208324018c7ae725745a99a2f3","other":"aba793e635f71169105ad073225cc8db914de6b711fe9f22c5d94ac8cb85e2eb","up":true},{"one":"69753865aacaaf72d9bf6d265c885d3f705804ff4b2675f7aa860641dacab2a0","other":"72a53f0fb1b51855cb4054a39cbd1309a76a862d36e18af9ba0456a60325c06e","up":true},{"one":"13853407d278a45e15d4b148fc38ebb35c4f58ee552ee0e4401c6c98c45b8e3e","other":"034de66774eda26b93e342c9b94b9deaeb6297650c819b144a5832bebfe6b02f","up":true},{"one":"4efaabab0d5dc59f098aee4dba3868263411a55615a2c474a73e6eec2211decc","other":"72a76f668d9b923914860eb4f8577bc98c153f6dd222cd36a0bbdef2bab7f068","up":true},{"one":"0a215c7765be2caebf76ad3e8017bbc2aaadf8e0dd4859af781953a0564c5d59","other":"184e9e00ab4fe1669d4d99fb33d418d33eff927da38cc997f69679443c24b20b","up":true},{"one":"eb01ff80307afbfc7457c96594cd4ba4d00acb7fd25a7571d1223168bd66ff09","other":"f611d8039385ad56260ab391763e3627aadd2756565fedc3ec95f76124da0efc","up":true},{"one":"ed12c78e700bf805669c48a5d62f1e56791263c4b2ce5bd34587ea9bc931a3e5","other":"e06f58b144faa650f96465825d253b63d7e061e3a3c4228ad5e1b665afbccc37","up":true},{"one":"b3555baa764c4562935b93533ee6c5a6df631e846c3ab512fdb1d6b901a68c60","other":"8330e2b8ae2f184bb8dc5e153fafa4dafe86f84ec692d3ee91413cc07b1cd9e2","up":true},{"one":"a86117147b78f20a6d883d37715da85178cad89eff650a74aa89e7bc11bc45a7","other":"b60e77c40ddc9dc78a4ad346add37e60f10f2999de836615db53524487d1ede9","up":true},{"one":"45895aff674079f6be02e4cc74914d63125c3fe48bb69056c070c71319fea1fa","other":"5c623fa0103108d0b1e24e6d01a6624ce3b59a9e7c422c45dfc1211676785542","up":true},{"one":"bde90aaa0f1f7a7eb965ff308718d29b55a80b1ca84dfba16c169eabe2b0d5de","other":"8fb8208b7167dd06cc08778b507ccd856751d3df6dfbaeac18b9f527b6628523","up":true},{"one":"216e0370111e2e03927b803ae788f9947de8e241d41dbf6a70983cf0ecd68af1","other":"3871492c8c62cd74cbe65a993669e4978cc641879a5223dd6b9e687f050a1c40","up":true},{"one":"0f3106adfe70aefb474c4a98a95932307391de2cb70fbd2e11dd31c9e695ed83","other":"034de66774eda26b93e342c9b94b9deaeb6297650c819b144a5832bebfe6b02f","up":true},{"one":"ce01234661309127bb872d69d38dc5bf19bc4de2e0a0b5041cd362d073df4ff8","other":"51c285489ff14628268ae886945e1cd2da64c6a0a8cb184aada98567ab429b6e","up":true},{"one":"22bbb3236a5e0a1947a1c4735aaacf9122173789a02a06e7653103bdcae2f823","other":"3871492c8c62cd74cbe65a993669e4978cc641879a5223dd6b9e687f050a1c40","up":true},{"one":"459b9fb2b7f4e396de8cf8740a6804c8e5b96ca11ffa2b5106c14dfbbab65c95","other":"4c211c117e555c2ac831d5688615b6b4c5e31f1d7c7906b34f0cbcdbc45482b4","up":true},{"one":"5008ef55ad8088f70643b0f93bcb479531bcb0afe8e01b215dbf8597ec866369","other":"45895aff674079f6be02e4cc74914d63125c3fe48bb69056c070c71319fea1fa","up":true},{"one":"55fdad03303a746920773217c568a37d2004869ff34096fbe45197f71eba2b63","other":"b9d906e406b0fc6078c22bbc173043df1f7581061b4f6ccd769bc568d94b4339","up":true},{"one":"ee2b0aff61a9846d13de3a72712ef0bf3ca42ad8da57e81759c242797258efec","other":"ed2ec6681bf325887768703779ccf3a6278731118cd3ec890490a3de50f689ac","up":true},{"one":"4d750666dc0e9e2c244c43492801c1d7ec6208954a0cb5f8bb793b912440753a","other":"51c285489ff14628268ae886945e1cd2da64c6a0a8cb184aada98567ab429b6e","up":true},{"one":"641a165f8be0eee36f53c12bae8e2a34a709adb8d1dcd667e88e4e90c9ee2401","other":"6450bb5e880411abcb60258d8560949f6f70d92ba7bfa9a4d7845463c48dab30","up":true},{"one":"0639f010834f5bc497798f2d275bbc60bfbcd53c83e38986b7260310c6001420","other":"034de66774eda26b93e342c9b94b9deaeb6297650c819b144a5832bebfe6b02f","up":true},{"one":"c52a68d8388a21013e4eecef9ea866db1f5eb16bbe0ecc82b8bfafd33e4e014f","other":"c2f9b4abed9c6a839fe4c03a80bd396fd187a8784ba47a83687d3a54b7e2eddf","up":true},{"one":"72a76f668d9b923914860eb4f8577bc98c153f6dd222cd36a0bbdef2bab7f068","other":"7bcb0d7b9f84aed413cf9b2a7851ba6d1138d85382aa20e6c939a43c8e59c034","up":true},{"one":"2354d3af5c6dca05d7dc212b100112f37ab29fb8b3f4319887230a4d420f5d9d","other":"36d5952685c95e42bef14f77b63705897ca71d24d21e4e9efc772d9cabd21122","up":true},{"one":"72a53f0fb1b51855cb4054a39cbd1309a76a862d36e18af9ba0456a60325c06e","other":"7bee7967ff7b07243bed55b6d060d5ec2a1f28b530ed65cd055dc5b468a0f878","up":true},{"one":"cabfdfb789cc20962eaba1dbe68d6dc0466e699d22dc5b29f27a5cd555398795","other":"8012a7af71d76d882202cf9372523478ccebea23443006c7f29c2a83106cd1b3","up":true},{"one":"bddbdff3cbd22fcedddc07de27125819aac72be72c3126ba898621c496cb95a2","other":"bc29a0d9b60f3e2c34224cec187cf44eadc4628086d5594666ed025da71e7e7a","up":true},{"one":"c2f9b4abed9c6a839fe4c03a80bd396fd187a8784ba47a83687d3a54b7e2eddf","other":"a86117147b78f20a6d883d37715da85178cad89eff650a74aa89e7bc11bc45a7","up":true},{"one":"cc5fa2d49210e240983b0853ff15003f0d366f05cb1f6486bae2862cca852cc5","other":"d18a1edd26661069fb401fee8aa85a9614a3188e2e0666bfe9307f91d29aad49","up":true},{"one":"27db66d13ee8168aca89786febd6971dd1d6c554bca8501052065cb47631560d","other":"21dcfb893a54cb56d21355fc564583057fc51b32503a8627e7575660725a7627","up":true},{"one":"17406dea5046f00e27eaf74e166a945c9485139d6edcdfcd84f5b03f50eedd0a","other":"5a8ba4047c4456e825bd1b34c961f5c7f37bf7c27bc48bee71b8430c7d135486","up":true},{"one":"6450bb5e880411abcb60258d8560949f6f70d92ba7bfa9a4d7845463c48dab30","other":"58a90b58858417a4e972626421ed8e78b1b3e5ac69fcedd22c58a8ab4c6147df","up":true},{"one":"7bee7967ff7b07243bed55b6d060d5ec2a1f28b530ed65cd055dc5b468a0f878","other":"8fb8208b7167dd06cc08778b507ccd856751d3df6dfbaeac18b9f527b6628523","up":true},{"one":"aedc9b478204effdcbad1a892333f15c061fbd1423b370f8a50f929b2a2f6952","other":"be0fb2b440b91e719c20f51b673eb9f2f66c7af77b0b0ade312998cdffcc5045","up":true},{"one":"be0fb2b440b91e719c20f51b673eb9f2f66c7af77b0b0ade312998cdffcc5045","other":"b5fc43e8c0df3279d6a12cd8b03012cb8d2205208324018c7ae725745a99a2f3","up":true},{"one":"4a373571475e2b4c280d2d4b22f10a249ee09fcf907f52081ec0398a8b5ea6f2","other":"5be6df23201fc5c00be650849c8bfe5581e44033ef19012836f97c98f3954471","up":true},{"one":"4cc2386a86fd210bf699c6d93173b0879c3210d46f572a62bb154cb60a7d2cb1","other":"7a68fa44bbec187272e2d5dfbd6ed8af31a1a365aa72aa50db02350ebe98c859","up":true},{"one":"2d531c50183f0115269b3feaecf45927a3ac44e1be2a263c7e5d2274d8379b1c","other":"2354d3af5c6dca05d7dc212b100112f37ab29fb8b3f4319887230a4d420f5d9d","up":true},{"one":"8b35236da99930bf8f5ef6c7555bb18b80ce2e34361bbbfd6baf55a6483e54ff","other":"82847a4af4f50622650d035f69151b202bccd5fc92302a617602c974603ed997","up":true},{"one":"957ed6194e6ef56e9696be43a1a0258f2ba4f48f56d790e42bd0663c3fc6aaae","other":"37751f279493dc5ce5b5c3c55a6ec2e4119eedefe1069b283f6ff8c7bc9d1411","up":true},{"one":"4bc8dfbf84794d26d7a573c9d898974eaa3a2167e19cb7a8aa460807a603acd4","other":"51c285489ff14628268ae886945e1cd2da64c6a0a8cb184aada98567ab429b6e","up":true},{"one":"4a3c39f044c425c153d4900db30f839d7866c8e0f4f4d38d9205e67fb540988e","other":"52b47d52bf4a1afda1604b7942019c8d2ac4c760c5eb4597e1ce2dd7a8e1cf4d","up":true},{"one":"a1929f704664ca85d829ac3bab62e688647a7cfdcbc9f03c61b0124cf9093505","other":"8012a7af71d76d882202cf9372523478ccebea23443006c7f29c2a83106cd1b3","up":true},{"one":"01a63575c384f686e5739e1bd079e4a4c55421cd6d89b944e2c61dd174fa2bf6","other":"2dd4ad83effc3ba73e72f5659583e5987241bda563563200b50c46cce00a1d9b","up":true},{"one":"8d3e0d9c6932d3422024394998e943309b679d667394d0eb622f0e208e7fcf0a","other":"13853407d278a45e15d4b148fc38ebb35c4f58ee552ee0e4401c6c98c45b8e3e","up":true},{"one":"bc71f3e409edb989e26607448491530c5451053b582ea64d882525451ac940bb","other":"b4e29de4bd5751f31195ead8aa1548d305a53fb4f99be9931850e6273de8f359","up":true},{"one":"0f3106adfe70aefb474c4a98a95932307391de2cb70fbd2e11dd31c9e695ed83","other":"459b9fb2b7f4e396de8cf8740a6804c8e5b96ca11ffa2b5106c14dfbbab65c95","up":true},{"one":"b9d906e406b0fc6078c22bbc173043df1f7581061b4f6ccd769bc568d94b4339","other":"aedc9b478204effdcbad1a892333f15c061fbd1423b370f8a50f929b2a2f6952","up":true},{"one":"f005a4d3453d52434f2b5be4006e653b50b52ad31926d654722fc3df00f1689c","other":"fac808b79923931febd54e3611b79811b3973c777e7502bd56b9803d0c4bf785","up":true},{"one":"221cd8ea0a26f0d3f81f782f1de390282415ecd9cf40224b4945a00897895b4e","other":"3b830c2ae5463ca2f2260176b77b8dda23048257aa780255c69cf1bbbc6fb64c","up":true},{"one":"eb01ff80307afbfc7457c96594cd4ba4d00acb7fd25a7571d1223168bd66ff09","other":"f4a0f76b30bcf5987cfa3f4f4b0aa3445f39d60a1f51519fa660c27b5d833dde","up":true},{"one":"672a566c7c2aeb1d91e6ee4e43984050df8b9560d923d60dc1fb23fb73b1a046","other":"64e642de2667a7563c774050d368858d99aff433efbd1cb68361e3e244629b03","up":true},{"one":"b3555baa764c4562935b93533ee6c5a6df631e846c3ab512fdb1d6b901a68c60","other":"8012a7af71d76d882202cf9372523478ccebea23443006c7f29c2a83106cd1b3","up":true},{"one":"b4e29de4bd5751f31195ead8aa1548d305a53fb4f99be9931850e6273de8f359","other":"8330e2b8ae2f184bb8dc5e153fafa4dafe86f84ec692d3ee91413cc07b1cd9e2","up":true},{"one":"f177ee6767a78a57b725dbe67ec377f507f5777d345a28892b0fbfb800dc443a","other":"ce01234661309127bb872d69d38dc5bf19bc4de2e0a0b5041cd362d073df4ff8","up":true},{"one":"bd486e1e15df4c7539b1ad5b54f7566dd4836a430e9f7d3503881fa79e258d9b","other":"8b35236da99930bf8f5ef6c7555bb18b80ce2e34361bbbfd6baf55a6483e54ff","up":true},{"one":"ce01234661309127bb872d69d38dc5bf19bc4de2e0a0b5041cd362d073df4ff8","other":"d125317b492df46a7dd496d30c6d07839ed6bfa196abde4886ce7bc8f9b5c01f","up":true},{"one":"b8695bec6c8e1e6794bb943b83629cd2c910067e6e178f6f8e33c4f0fa2d74f4","other":"b3555baa764c4562935b93533ee6c5a6df631e846c3ab512fdb1d6b901a68c60","up":true},{"one":"7bcb0d7b9f84aed413cf9b2a7851ba6d1138d85382aa20e6c939a43c8e59c034","other":"73d0d1d4a2b7250f51e57c13cc48bc6b20682320ce12ee8e5765afeef7d9de42","up":true},{"one":"2471776037d55a05df2b15bcefe52cb1f4c942e9e15113abc2a0c1fcbaa5d626","other":"127c89eae94b195df2eb5eb7b44f634adb73c114d2089cd904b56988c8674e11","up":true},{"one":"c0adf394af7d5670c1ce8c6bea292fbc03c56ae2b636e2f303311a455bb3500f","other":"d125317b492df46a7dd496d30c6d07839ed6bfa196abde4886ce7bc8f9b5c01f","up":true},{"one":"8b35236da99930bf8f5ef6c7555bb18b80ce2e34361bbbfd6baf55a6483e54ff","other":"bde90aaa0f1f7a7eb965ff308718d29b55a80b1ca84dfba16c169eabe2b0d5de","up":true},{"one":"4a373571475e2b4c280d2d4b22f10a249ee09fcf907f52081ec0398a8b5ea6f2","other":"772a79302528fdce6a216c98c95e281333292c81dfe490aeaa4a78bfeb1980c8","up":true},{"one":"08077c0ce8d4130c14464493e9164a8bae61b4646b1ec48899e75f2f6f9b8c66","other":"127c89eae94b195df2eb5eb7b44f634adb73c114d2089cd904b56988c8674e11","up":true},{"one":"8330e2b8ae2f184bb8dc5e153fafa4dafe86f84ec692d3ee91413cc07b1cd9e2","other":"08077c0ce8d4130c14464493e9164a8bae61b4646b1ec48899e75f2f6f9b8c66","up":true},{"one":"55fdad03303a746920773217c568a37d2004869ff34096fbe45197f71eba2b63","other":"459b9fb2b7f4e396de8cf8740a6804c8e5b96ca11ffa2b5106c14dfbbab65c95","up":true},{"one":"cc9f65d734f1a3bbc6019e166fe355bd7fc33bb4887043a5ccf532a9ba356379","other":"d23c97bebcde26f5e351c4b975c76aaf604fd206f9b9063ecbda538e7a52f514","up":true},{"one":"5cc1c28eafd9758e807a28159a1a7a6ea313fa7e878fde5d47fcc8f5a5c25172","other":"221cd8ea0a26f0d3f81f782f1de390282415ecd9cf40224b4945a00897895b4e","up":true},{"one":"bddbdff3cbd22fcedddc07de27125819aac72be72c3126ba898621c496cb95a2","other":"bde90aaa0f1f7a7eb965ff308718d29b55a80b1ca84dfba16c169eabe2b0d5de","up":true},{"one":"2dd4ad83effc3ba73e72f5659583e5987241bda563563200b50c46cce00a1d9b","other":"0f3106adfe70aefb474c4a98a95932307391de2cb70fbd2e11dd31c9e695ed83","up":true},{"one":"37751f279493dc5ce5b5c3c55a6ec2e4119eedefe1069b283f6ff8c7bc9d1411","other":"3590afcd10fb8f58c39f72068661d9a772b77e0efd57bbd60306632fb048fa3a","up":true},{"one":"3871492c8c62cd74cbe65a993669e4978cc641879a5223dd6b9e687f050a1c40","other":"17406dea5046f00e27eaf74e166a945c9485139d6edcdfcd84f5b03f50eedd0a","up":true},{"one":"eceb7dc532596e8b68074113db9605e3d15cb15e2e80f75f1a66d95a1221c7dc","other":"eb01ff80307afbfc7457c96594cd4ba4d00acb7fd25a7571d1223168bd66ff09","up":true},{"one":"836e65dfe6f01e1d2934655c1846cb86fed6e41ea951a109d7a20bb14cb4c10a","other":"8330e2b8ae2f184bb8dc5e153fafa4dafe86f84ec692d3ee91413cc07b1cd9e2","up":true},{"one":"bc29a0d9b60f3e2c34224cec187cf44eadc4628086d5594666ed025da71e7e7a","other":"82847a4af4f50622650d035f69151b202bccd5fc92302a617602c974603ed997","up":true},{"one":"cc5fa2d49210e240983b0853ff15003f0d366f05cb1f6486bae2862cca852cc5","other":"d125317b492df46a7dd496d30c6d07839ed6bfa196abde4886ce7bc8f9b5c01f","up":true},{"one":"62f007c92a8af466e90ed0b1e5e71a955ad273ec793948ddfc03977f131ed2d1","other":"77eedcac0c847b1d693ddff07c5868afb1c2008b2dcb48a0299143ab14611969","up":true},{"one":"2471776037d55a05df2b15bcefe52cb1f4c942e9e15113abc2a0c1fcbaa5d626","other":"36d5952685c95e42bef14f77b63705897ca71d24d21e4e9efc772d9cabd21122","up":true},{"one":"be0fb2b440b91e719c20f51b673eb9f2f66c7af77b0b0ade312998cdffcc5045","other":"b60e77c40ddc9dc78a4ad346add37e60f10f2999de836615db53524487d1ede9","up":true},{"one":"ea3d6aa50ad5a1d5647d213f9b5cfe6718339eec7eef8644487eb3c223c7bcde","other":"d125317b492df46a7dd496d30c6d07839ed6bfa196abde4886ce7bc8f9b5c01f","up":true},{"one":"0a215c7765be2caebf76ad3e8017bbc2aaadf8e0dd4859af781953a0564c5d59","other":"e06f58b144faa650f96465825d253b63d7e061e3a3c4228ad5e1b665afbccc37","up":true},{"one":"0a215c7765be2caebf76ad3e8017bbc2aaadf8e0dd4859af781953a0564c5d59","other":"2d531c50183f0115269b3feaecf45927a3ac44e1be2a263c7e5d2274d8379b1c","up":true},{"one":"c2f9b4abed9c6a839fe4c03a80bd396fd187a8784ba47a83687d3a54b7e2eddf","other":"8012a7af71d76d882202cf9372523478ccebea23443006c7f29c2a83106cd1b3","up":true},{"one":"62f007c92a8af466e90ed0b1e5e71a955ad273ec793948ddfc03977f131ed2d1","other":"3871492c8c62cd74cbe65a993669e4978cc641879a5223dd6b9e687f050a1c40","up":true},{"one":"72a76f668d9b923914860eb4f8577bc98c153f6dd222cd36a0bbdef2bab7f068","other":"6379b4d611cdd6e360480c14b3f6784360f28f702b5a6f375eda4ef3bde7ef33","up":true},{"one":"5a8ba4047c4456e825bd1b34c961f5c7f37bf7c27bc48bee71b8430c7d135486","other":"68a63ebc4833dedfdb6d534438ffcccd042f60434bee0e39f4cb3726e7413e7a","up":true},{"one":"6450bb5e880411abcb60258d8560949f6f70d92ba7bfa9a4d7845463c48dab30","other":"6379b4d611cdd6e360480c14b3f6784360f28f702b5a6f375eda4ef3bde7ef33","up":true},{"one":"3e1959b29bbacb3ce7dccfa41c3e51b87f1afc700a3c6e4713c38cc0fe3790df","other":"127c89eae94b195df2eb5eb7b44f634adb73c114d2089cd904b56988c8674e11","up":true},{"one":"a1929f704664ca85d829ac3bab62e688647a7cfdcbc9f03c61b0124cf9093505","other":"a9fa28117a4b6906b5ce3931573e0a19eec3cb4fcd9141be2d258a2be06f3b61","up":true},{"one":"bd9607d5f57f7b6f74f4ad981be368988ef48b5f31e3fd96cab3bb790d568150","other":"a1929f704664ca85d829ac3bab62e688647a7cfdcbc9f03c61b0124cf9093505","up":true},{"one":"947205fd85a17330a6d5c51a66548c5f69779c76ab12408f8fc6d33d7c6b8e9d","other":"a9fa28117a4b6906b5ce3931573e0a19eec3cb4fcd9141be2d258a2be06f3b61","up":true},{"one":"1929b01c0f85af7452a0f358b54f6b36640a196b366909172af594a1648fe64c","other":"0639f010834f5bc497798f2d275bbc60bfbcd53c83e38986b7260310c6001420","up":true},{"one":"cc5fa2d49210e240983b0853ff15003f0d366f05cb1f6486bae2862cca852cc5","other":"c9ef56afed2d40db396ad39d6f5f5f38f4058b6b0d1e02b71d6aa92dbeaf7df7","up":true},{"one":"4bc8dfbf84794d26d7a573c9d898974eaa3a2167e19cb7a8aa460807a603acd4","other":"7bcb0d7b9f84aed413cf9b2a7851ba6d1138d85382aa20e6c939a43c8e59c034","up":true},{"one":"6daaf515999c9a3491c963f76be82ed6005616bf7ba98247b01d6a89a9af1d71","other":"7bcb0d7b9f84aed413cf9b2a7851ba6d1138d85382aa20e6c939a43c8e59c034","up":true},{"one":"47753fdca855ea79abf667b50aa9c90a132d44bdd1572c3e3c411c8ee7e5b5f4","other":"672a566c7c2aeb1d91e6ee4e43984050df8b9560d923d60dc1fb23fb73b1a046","up":true},{"one":"fa655b4882579e65937a14ab1c6bcba021580f0a5ebc04c48424f5ae72b7d5b4","other":"e06f58b144faa650f96465825d253b63d7e061e3a3c4228ad5e1b665afbccc37","up":true},{"one":"dd92b3d42414fd5eff5c1e4ca55c63cd7036634049995b72a20cdf7ca1321978","other":"a86117147b78f20a6d883d37715da85178cad89eff650a74aa89e7bc11bc45a7","up":true},{"one":"4cc2386a86fd210bf699c6d93173b0879c3210d46f572a62bb154cb60a7d2cb1","other":"772a79302528fdce6a216c98c95e281333292c81dfe490aeaa4a78bfeb1980c8","up":true},{"one":"127c89eae94b195df2eb5eb7b44f634adb73c114d2089cd904b56988c8674e11","other":"17406dea5046f00e27eaf74e166a945c9485139d6edcdfcd84f5b03f50eedd0a","up":true},{"one":"4a3c39f044c425c153d4900db30f839d7866c8e0f4f4d38d9205e67fb540988e","other":"5008ef55ad8088f70643b0f93bcb479531bcb0afe8e01b215dbf8597ec866369","up":true},{"one":"2d531c50183f0115269b3feaecf45927a3ac44e1be2a263c7e5d2274d8379b1c","other":"36d5952685c95e42bef14f77b63705897ca71d24d21e4e9efc772d9cabd21122","up":true},{"one":"13853407d278a45e15d4b148fc38ebb35c4f58ee552ee0e4401c6c98c45b8e3e","other":"3590afcd10fb8f58c39f72068661d9a772b77e0efd57bbd60306632fb048fa3a","up":true},{"one":"4c211c117e555c2ac831d5688615b6b4c5e31f1d7c7906b34f0cbcdbc45482b4","other":"58a90b58858417a4e972626421ed8e78b1b3e5ac69fcedd22c58a8ab4c6147df","up":true},{"one":"4a373571475e2b4c280d2d4b22f10a249ee09fcf907f52081ec0398a8b5ea6f2","other":"72a53f0fb1b51855cb4054a39cbd1309a76a862d36e18af9ba0456a60325c06e","up":true},{"one":"fac808b79923931febd54e3611b79811b3973c777e7502bd56b9803d0c4bf785","other":"f611d8039385ad56260ab391763e3627aadd2756565fedc3ec95f76124da0efc","up":true},{"one":"2803f212eb4aa4f49224b16b2de88ba8652ad115321ee1e60cdbd926ecdad38a","other":"3590afcd10fb8f58c39f72068661d9a772b77e0efd57bbd60306632fb048fa3a","up":true},{"one":"d9d30b9b212bd4811a44ebe304ba3935ead3abe3247f99893faf65664131c29d","other":"ee2b0aff61a9846d13de3a72712ef0bf3ca42ad8da57e81759c242797258efec","up":true},{"one":"dd92b3d42414fd5eff5c1e4ca55c63cd7036634049995b72a20cdf7ca1321978","other":"957ed6194e6ef56e9696be43a1a0258f2ba4f48f56d790e42bd0663c3fc6aaae","up":true},{"one":"c9ef56afed2d40db396ad39d6f5f5f38f4058b6b0d1e02b71d6aa92dbeaf7df7","other":"d9d30b9b212bd4811a44ebe304ba3935ead3abe3247f99893faf65664131c29d","up":true},{"one":"2d531c50183f0115269b3feaecf45927a3ac44e1be2a263c7e5d2274d8379b1c","other":"27b56302a89605a83563ba7b66d491ec25edfad0ea1010937fcadeab4d3ae582","up":true},{"one":"d18a1edd26661069fb401fee8aa85a9614a3188e2e0666bfe9307f91d29aad49","other":"cabfdfb789cc20962eaba1dbe68d6dc0466e699d22dc5b29f27a5cd555398795","up":true},{"one":"b5fc43e8c0df3279d6a12cd8b03012cb8d2205208324018c7ae725745a99a2f3","other":"aedc9b478204effdcbad1a892333f15c061fbd1423b370f8a50f929b2a2f6952","up":true},{"one":"5cc1c28eafd9758e807a28159a1a7a6ea313fa7e878fde5d47fcc8f5a5c25172","other":"21dcfb893a54cb56d21355fc564583057fc51b32503a8627e7575660725a7627","up":true},{"one":"2803f212eb4aa4f49224b16b2de88ba8652ad115321ee1e60cdbd926ecdad38a","other":"21dcfb893a54cb56d21355fc564583057fc51b32503a8627e7575660725a7627","up":true},{"one":"b9d906e406b0fc6078c22bbc173043df1f7581061b4f6ccd769bc568d94b4339","other":"836e65dfe6f01e1d2934655c1846cb86fed6e41ea951a109d7a20bb14cb4c10a","up":true},{"one":"8d3e0d9c6932d3422024394998e943309b679d667394d0eb622f0e208e7fcf0a","other":"947205fd85a17330a6d5c51a66548c5f69779c76ab12408f8fc6d33d7c6b8e9d","up":true},{"one":"836e65dfe6f01e1d2934655c1846cb86fed6e41ea951a109d7a20bb14cb4c10a","other":"72a53f0fb1b51855cb4054a39cbd1309a76a862d36e18af9ba0456a60325c06e","up":true},{"one":"957ed6194e6ef56e9696be43a1a0258f2ba4f48f56d790e42bd0663c3fc6aaae","other":"27db66d13ee8168aca89786febd6971dd1d6c554bca8501052065cb47631560d","up":true},{"one":"27b56302a89605a83563ba7b66d491ec25edfad0ea1010937fcadeab4d3ae582","other":"5c623fa0103108d0b1e24e6d01a6624ce3b59a9e7c422c45dfc1211676785542","up":true},{"one":"ed12c78e700bf805669c48a5d62f1e56791263c4b2ce5bd34587ea9bc931a3e5","other":"ea3d6aa50ad5a1d5647d213f9b5cfe6718339eec7eef8644487eb3c223c7bcde","up":true},{"one":"d23c97bebcde26f5e351c4b975c76aaf604fd206f9b9063ecbda538e7a52f514","other":"d18a1edd26661069fb401fee8aa85a9614a3188e2e0666bfe9307f91d29aad49","up":true},{"one":"4746379212b91ee1c13c1336e8f3a73a84408b7636c222c11bd27ce7d724e6c6","other":"4efaabab0d5dc59f098aee4dba3868263411a55615a2c474a73e6eec2211decc","up":true},{"one":"c0adf394af7d5670c1ce8c6bea292fbc03c56ae2b636e2f303311a455bb3500f","other":"d18a1edd26661069fb401fee8aa85a9614a3188e2e0666bfe9307f91d29aad49","up":true},{"one":"cc9f65d734f1a3bbc6019e166fe355bd7fc33bb4887043a5ccf532a9ba356379","other":"d125317b492df46a7dd496d30c6d07839ed6bfa196abde4886ce7bc8f9b5c01f","up":true},{"one":"c0adf394af7d5670c1ce8c6bea292fbc03c56ae2b636e2f303311a455bb3500f","other":"ed2ec6681bf325887768703779ccf3a6278731118cd3ec890490a3de50f689ac","up":true},{"one":"221cd8ea0a26f0d3f81f782f1de390282415ecd9cf40224b4945a00897895b4e","other":"3871492c8c62cd74cbe65a993669e4978cc641879a5223dd6b9e687f050a1c40","up":true},{"one":"5be6df23201fc5c00be650849c8bfe5581e44033ef19012836f97c98f3954471","other":"4efaabab0d5dc59f098aee4dba3868263411a55615a2c474a73e6eec2211decc","up":true},{"one":"64e642de2667a7563c774050d368858d99aff433efbd1cb68361e3e244629b03","other":"36d5952685c95e42bef14f77b63705897ca71d24d21e4e9efc772d9cabd21122","up":true},{"one":"b60e77c40ddc9dc78a4ad346add37e60f10f2999de836615db53524487d1ede9","other":"aedc9b478204effdcbad1a892333f15c061fbd1423b370f8a50f929b2a2f6952","up":true},{"one":"b2453c6e755a30efb91194fa607b3352d75b6905c448b09af4aeadf3a445b633","other":"bc71f3e409edb989e26607448491530c5451053b582ea64d882525451ac940bb","up":true},{"one":"f3d50811ef10661d3ef9978077cd7181387298f306833ab6e27f25cbb77435cd","other":"f611d8039385ad56260ab391763e3627aadd2756565fedc3ec95f76124da0efc","up":true},{"one":"f4a0f76b30bcf5987cfa3f4f4b0aa3445f39d60a1f51519fa660c27b5d833dde","other":"fac808b79923931febd54e3611b79811b3973c777e7502bd56b9803d0c4bf785","up":true},{"one":"efd68d2c99346ca085c9ef896bee6125ad8638413295108f3a92b247a41ca629","other":"d9d30b9b212bd4811a44ebe304ba3935ead3abe3247f99893faf65664131c29d","up":true},{"one":"b4e29de4bd5751f31195ead8aa1548d305a53fb4f99be9931850e6273de8f359","other":"8012a7af71d76d882202cf9372523478ccebea23443006c7f29c2a83106cd1b3","up":true},{"one":"58a90b58858417a4e972626421ed8e78b1b3e5ac69fcedd22c58a8ab4c6147df","other":"55fdad03303a746920773217c568a37d2004869ff34096fbe45197f71eba2b63","up":true},{"one":"cc5fa2d49210e240983b0853ff15003f0d366f05cb1f6486bae2862cca852cc5","other":"a9fa28117a4b6906b5ce3931573e0a19eec3cb4fcd9141be2d258a2be06f3b61","up":true},{"one":"f005a4d3453d52434f2b5be4006e653b50b52ad31926d654722fc3df00f1689c","other":"36d5952685c95e42bef14f77b63705897ca71d24d21e4e9efc772d9cabd21122","up":true},{"one":"f33c07a818863a358358989ec71504abad3ca0a7c81b54aad59075a766fad501","other":"eb01ff80307afbfc7457c96594cd4ba4d00acb7fd25a7571d1223168bd66ff09","up":true},{"one":"a86117147b78f20a6d883d37715da85178cad89eff650a74aa89e7bc11bc45a7","other":"acf888ed781f5358493e2e5048691acc39eac3240ca9e9093bb4052b1f624325","up":true},{"one":"82847a4af4f50622650d035f69151b202bccd5fc92302a617602c974603ed997","other":"6450bb5e880411abcb60258d8560949f6f70d92ba7bfa9a4d7845463c48dab30","up":true},{"one":"772a79302528fdce6a216c98c95e281333292c81dfe490aeaa4a78bfeb1980c8","other":"6379b4d611cdd6e360480c14b3f6784360f28f702b5a6f375eda4ef3bde7ef33","up":true},{"one":"22bbb3236a5e0a1947a1c4735aaacf9122173789a02a06e7653103bdcae2f823","other":"2dd4ad83effc3ba73e72f5659583e5987241bda563563200b50c46cce00a1d9b","up":true},{"one":"216e0370111e2e03927b803ae788f9947de8e241d41dbf6a70983cf0ecd68af1","other":"37751f279493dc5ce5b5c3c55a6ec2e4119eedefe1069b283f6ff8c7bc9d1411","up":true},{"one":"69753865aacaaf72d9bf6d265c885d3f705804ff4b2675f7aa860641dacab2a0","other":"68a63ebc4833dedfdb6d534438ffcccd042f60434bee0e39f4cb3726e7413e7a","up":true},{"one":"aedc9b478204effdcbad1a892333f15c061fbd1423b370f8a50f929b2a2f6952","other":"bd486e1e15df4c7539b1ad5b54f7566dd4836a430e9f7d3503881fa79e258d9b","up":true},{"one":"4efaabab0d5dc59f098aee4dba3868263411a55615a2c474a73e6eec2211decc","other":"7bcb0d7b9f84aed413cf9b2a7851ba6d1138d85382aa20e6c939a43c8e59c034","up":true},{"one":"bde90aaa0f1f7a7eb965ff308718d29b55a80b1ca84dfba16c169eabe2b0d5de","other":"8012a7af71d76d882202cf9372523478ccebea23443006c7f29c2a83106cd1b3","up":true},{"one":"641a165f8be0eee36f53c12bae8e2a34a709adb8d1dcd667e88e4e90c9ee2401","other":"d18a1edd26661069fb401fee8aa85a9614a3188e2e0666bfe9307f91d29aad49","up":true},{"one":"d9d30b9b212bd4811a44ebe304ba3935ead3abe3247f99893faf65664131c29d","other":"eceb7dc532596e8b68074113db9605e3d15cb15e2e80f75f1a66d95a1221c7dc","up":true},{"one":"b4e29de4bd5751f31195ead8aa1548d305a53fb4f99be9931850e6273de8f359","other":"947205fd85a17330a6d5c51a66548c5f69779c76ab12408f8fc6d33d7c6b8e9d","up":true},{"one":"51c285489ff14628268ae886945e1cd2da64c6a0a8cb184aada98567ab429b6e","other":"4746379212b91ee1c13c1336e8f3a73a84408b7636c222c11bd27ce7d724e6c6","up":true},{"one":"7a68fa44bbec187272e2d5dfbd6ed8af31a1a365aa72aa50db02350ebe98c859","other":"6379b4d611cdd6e360480c14b3f6784360f28f702b5a6f375eda4ef3bde7ef33","up":true},{"one":"672a566c7c2aeb1d91e6ee4e43984050df8b9560d923d60dc1fb23fb73b1a046","other":"1929b01c0f85af7452a0f358b54f6b36640a196b366909172af594a1648fe64c","up":true},{"one":"deec6a8beb4e5e441dd42311354194c3bef9448e8859b4ccd401645b69217d12","other":"ed2ec6681bf325887768703779ccf3a6278731118cd3ec890490a3de50f689ac","up":true},{"one":"77eedcac0c847b1d693ddff07c5868afb1c2008b2dcb48a0299143ab14611969","other":"641a165f8be0eee36f53c12bae8e2a34a709adb8d1dcd667e88e4e90c9ee2401","up":true},{"one":"3e1959b29bbacb3ce7dccfa41c3e51b87f1afc700a3c6e4713c38cc0fe3790df","other":"36d5952685c95e42bef14f77b63705897ca71d24d21e4e9efc772d9cabd21122","up":true},{"one":"3871492c8c62cd74cbe65a993669e4978cc641879a5223dd6b9e687f050a1c40","other":"2dd4ad83effc3ba73e72f5659583e5987241bda563563200b50c46cce00a1d9b","up":true},{"one":"52b47d52bf4a1afda1604b7942019c8d2ac4c760c5eb4597e1ce2dd7a8e1cf4d","other":"72a53f0fb1b51855cb4054a39cbd1309a76a862d36e18af9ba0456a60325c06e","up":true},{"one":"3b830c2ae5463ca2f2260176b77b8dda23048257aa780255c69cf1bbbc6fb64c","other":"08077c0ce8d4130c14464493e9164a8bae61b4646b1ec48899e75f2f6f9b8c66","up":true},{"one":"c52a68d8388a21013e4eecef9ea866db1f5eb16bbe0ecc82b8bfafd33e4e014f","other":"cc9f65d734f1a3bbc6019e166fe355bd7fc33bb4887043a5ccf532a9ba356379","up":true},{"one":"b8695bec6c8e1e6794bb943b83629cd2c910067e6e178f6f8e33c4f0fa2d74f4","other":"cabfdfb789cc20962eaba1dbe68d6dc0466e699d22dc5b29f27a5cd555398795","up":true},{"one":"eb01ff80307afbfc7457c96594cd4ba4d00acb7fd25a7571d1223168bd66ff09","other":"e06f58b144faa650f96465825d253b63d7e061e3a3c4228ad5e1b665afbccc37","up":true},{"one":"d23c97bebcde26f5e351c4b975c76aaf604fd206f9b9063ecbda538e7a52f514","other":"d125317b492df46a7dd496d30c6d07839ed6bfa196abde4886ce7bc8f9b5c01f","up":true},{"one":"b8695bec6c8e1e6794bb943b83629cd2c910067e6e178f6f8e33c4f0fa2d74f4","other":"b4e29de4bd5751f31195ead8aa1548d305a53fb4f99be9931850e6273de8f359","up":true},{"one":"0f3106adfe70aefb474c4a98a95932307391de2cb70fbd2e11dd31c9e695ed83","other":"03eb2e92ed0923f696269e7a03fec731d8c3f8df278023a9cb00867b533a3ca3","up":true},{"one":"55fdad03303a746920773217c568a37d2004869ff34096fbe45197f71eba2b63","other":"5cc1c28eafd9758e807a28159a1a7a6ea313fa7e878fde5d47fcc8f5a5c25172","up":true},{"one":"f177ee6767a78a57b725dbe67ec377f507f5777d345a28892b0fbfb800dc443a","other":"e06f58b144faa650f96465825d253b63d7e061e3a3c4228ad5e1b665afbccc37","up":true},{"one":"bd9607d5f57f7b6f74f4ad981be368988ef48b5f31e3fd96cab3bb790d568150","other":"acf888ed781f5358493e2e5048691acc39eac3240ca9e9093bb4052b1f624325","up":true},{"one":"4a373571475e2b4c280d2d4b22f10a249ee09fcf907f52081ec0398a8b5ea6f2","other":"72a76f668d9b923914860eb4f8577bc98c153f6dd222cd36a0bbdef2bab7f068","up":true},{"one":"bc71f3e409edb989e26607448491530c5451053b582ea64d882525451ac940bb","other":"b3555baa764c4562935b93533ee6c5a6df631e846c3ab512fdb1d6b901a68c60","up":true},{"one":"27db66d13ee8168aca89786febd6971dd1d6c554bca8501052065cb47631560d","other":"f33c07a818863a358358989ec71504abad3ca0a7c81b54aad59075a766fad501","up":true},{"one":"75e282c0f3d355a40573e6578c5aac98e7262970a9239f4dcefd26d6f008b553","other":"72a53f0fb1b51855cb4054a39cbd1309a76a862d36e18af9ba0456a60325c06e","up":true},{"one":"08077c0ce8d4130c14464493e9164a8bae61b4646b1ec48899e75f2f6f9b8c66","other":"17406dea5046f00e27eaf74e166a945c9485139d6edcdfcd84f5b03f50eedd0a","up":true},{"one":"5cc1c28eafd9758e807a28159a1a7a6ea313fa7e878fde5d47fcc8f5a5c25172","other":"3b830c2ae5463ca2f2260176b77b8dda23048257aa780255c69cf1bbbc6fb64c","up":true},{"one":"7bee7967ff7b07243bed55b6d060d5ec2a1f28b530ed65cd055dc5b468a0f878","other":"82847a4af4f50622650d035f69151b202bccd5fc92302a617602c974603ed997","up":true},{"one":"8b35236da99930bf8f5ef6c7555bb18b80ce2e34361bbbfd6baf55a6483e54ff","other":"b4e29de4bd5751f31195ead8aa1548d305a53fb4f99be9931850e6273de8f359","up":true},{"one":"2354d3af5c6dca05d7dc212b100112f37ab29fb8b3f4319887230a4d420f5d9d","other":"3e1959b29bbacb3ce7dccfa41c3e51b87f1afc700a3c6e4713c38cc0fe3790df","up":true},{"one":"ed12c78e700bf805669c48a5d62f1e56791263c4b2ce5bd34587ea9bc931a3e5","other":"ed2ec6681bf325887768703779ccf3a6278731118cd3ec890490a3de50f689ac","up":true},{"one":"b3555baa764c4562935b93533ee6c5a6df631e846c3ab512fdb1d6b901a68c60","other":"957ed6194e6ef56e9696be43a1a0258f2ba4f48f56d790e42bd0663c3fc6aaae","up":true},{"one":"aba793e635f71169105ad073225cc8db914de6b711fe9f22c5d94ac8cb85e2eb","other":"aedc9b478204effdcbad1a892333f15c061fbd1423b370f8a50f929b2a2f6952","up":true},{"one":"17406dea5046f00e27eaf74e166a945c9485139d6edcdfcd84f5b03f50eedd0a","other":"77eedcac0c847b1d693ddff07c5868afb1c2008b2dcb48a0299143ab14611969","up":true},{"one":"5c623fa0103108d0b1e24e6d01a6624ce3b59a9e7c422c45dfc1211676785542","other":"1929b01c0f85af7452a0f358b54f6b36640a196b366909172af594a1648fe64c","up":true},{"one":"4bc8dfbf84794d26d7a573c9d898974eaa3a2167e19cb7a8aa460807a603acd4","other":"7bee7967ff7b07243bed55b6d060d5ec2a1f28b530ed65cd055dc5b468a0f878","up":true},{"one":"03eb2e92ed0923f696269e7a03fec731d8c3f8df278023a9cb00867b533a3ca3","other":"08077c0ce8d4130c14464493e9164a8bae61b4646b1ec48899e75f2f6f9b8c66","up":true},{"one":"216e0370111e2e03927b803ae788f9947de8e241d41dbf6a70983cf0ecd68af1","other":"2dd4ad83effc3ba73e72f5659583e5987241bda563563200b50c46cce00a1d9b","up":true},{"one":"d125317b492df46a7dd496d30c6d07839ed6bfa196abde4886ce7bc8f9b5c01f","other":"ee2b0aff61a9846d13de3a72712ef0bf3ca42ad8da57e81759c242797258efec","up":true},{"one":"68a63ebc4833dedfdb6d534438ffcccd042f60434bee0e39f4cb3726e7413e7a","other":"7bee7967ff7b07243bed55b6d060d5ec2a1f28b530ed65cd055dc5b468a0f878","up":true},{"one":"6450bb5e880411abcb60258d8560949f6f70d92ba7bfa9a4d7845463c48dab30","other":"672a566c7c2aeb1d91e6ee4e43984050df8b9560d923d60dc1fb23fb73b1a046","up":true},{"one":"4cc2386a86fd210bf699c6d93173b0879c3210d46f572a62bb154cb60a7d2cb1","other":"73d0d1d4a2b7250f51e57c13cc48bc6b20682320ce12ee8e5765afeef7d9de42","up":true},{"one":"672a566c7c2aeb1d91e6ee4e43984050df8b9560d923d60dc1fb23fb73b1a046","other":"2d531c50183f0115269b3feaecf45927a3ac44e1be2a263c7e5d2274d8379b1c","up":true},{"one":"dd92b3d42414fd5eff5c1e4ca55c63cd7036634049995b72a20cdf7ca1321978","other":"d18a1edd26661069fb401fee8aa85a9614a3188e2e0666bfe9307f91d29aad49","up":true},{"one":"b4e29de4bd5751f31195ead8aa1548d305a53fb4f99be9931850e6273de8f359","other":"8fb8208b7167dd06cc08778b507ccd856751d3df6dfbaeac18b9f527b6628523","up":true},{"one":"5008ef55ad8088f70643b0f93bcb479531bcb0afe8e01b215dbf8597ec866369","other":"459b9fb2b7f4e396de8cf8740a6804c8e5b96ca11ffa2b5106c14dfbbab65c95","up":true},{"one":"4d750666dc0e9e2c244c43492801c1d7ec6208954a0cb5f8bb793b912440753a","other":"4efaabab0d5dc59f098aee4dba3868263411a55615a2c474a73e6eec2211decc","up":true},{"one":"e06f58b144faa650f96465825d253b63d7e061e3a3c4228ad5e1b665afbccc37","other":"127c89eae94b195df2eb5eb7b44f634adb73c114d2089cd904b56988c8674e11","up":true},{"one":"4cc2386a86fd210bf699c6d93173b0879c3210d46f572a62bb154cb60a7d2cb1","other":"72a76f668d9b923914860eb4f8577bc98c153f6dd222cd36a0bbdef2bab7f068","up":true},{"one":"51c285489ff14628268ae886945e1cd2da64c6a0a8cb184aada98567ab429b6e","other":"4efaabab0d5dc59f098aee4dba3868263411a55615a2c474a73e6eec2211decc","up":true},{"one":"5cc1c28eafd9758e807a28159a1a7a6ea313fa7e878fde5d47fcc8f5a5c25172","other":"27db66d13ee8168aca89786febd6971dd1d6c554bca8501052065cb47631560d","up":true},{"one":"bc29a0d9b60f3e2c34224cec187cf44eadc4628086d5594666ed025da71e7e7a","other":"8b35236da99930bf8f5ef6c7555bb18b80ce2e34361bbbfd6baf55a6483e54ff","up":true},{"one":"37751f279493dc5ce5b5c3c55a6ec2e4119eedefe1069b283f6ff8c7bc9d1411","other":"f005a4d3453d52434f2b5be4006e653b50b52ad31926d654722fc3df00f1689c","up":true},{"one":"672a566c7c2aeb1d91e6ee4e43984050df8b9560d923d60dc1fb23fb73b1a046","other":"82847a4af4f50622650d035f69151b202bccd5fc92302a617602c974603ed997","up":true},{"one":"034de66774eda26b93e342c9b94b9deaeb6297650c819b144a5832bebfe6b02f","other":"3871492c8c62cd74cbe65a993669e4978cc641879a5223dd6b9e687f050a1c40","up":true},{"one":"641a165f8be0eee36f53c12bae8e2a34a709adb8d1dcd667e88e4e90c9ee2401","other":"d125317b492df46a7dd496d30c6d07839ed6bfa196abde4886ce7bc8f9b5c01f","up":true},{"one":"a9fa28117a4b6906b5ce3931573e0a19eec3cb4fcd9141be2d258a2be06f3b61","other":"ce01234661309127bb872d69d38dc5bf19bc4de2e0a0b5041cd362d073df4ff8","up":true},{"one":"ce01234661309127bb872d69d38dc5bf19bc4de2e0a0b5041cd362d073df4ff8","other":"5c623fa0103108d0b1e24e6d01a6624ce3b59a9e7c422c45dfc1211676785542","up":true},{"one":"ea3d6aa50ad5a1d5647d213f9b5cfe6718339eec7eef8644487eb3c223c7bcde","other":"d23c97bebcde26f5e351c4b975c76aaf604fd206f9b9063ecbda538e7a52f514","up":true},{"one":"cc5fa2d49210e240983b0853ff15003f0d366f05cb1f6486bae2862cca852cc5","other":"d23c97bebcde26f5e351c4b975c76aaf604fd206f9b9063ecbda538e7a52f514","up":true},{"one":"bd486e1e15df4c7539b1ad5b54f7566dd4836a430e9f7d3503881fa79e258d9b","other":"947205fd85a17330a6d5c51a66548c5f69779c76ab12408f8fc6d33d7c6b8e9d","up":true},{"one":"acf888ed781f5358493e2e5048691acc39eac3240ca9e9093bb4052b1f624325","other":"8330e2b8ae2f184bb8dc5e153fafa4dafe86f84ec692d3ee91413cc07b1cd9e2","up":true},{"one":"45895aff674079f6be02e4cc74914d63125c3fe48bb69056c070c71319fea1fa","other":"4746379212b91ee1c13c1336e8f3a73a84408b7636c222c11bd27ce7d724e6c6","up":true},{"one":"6daaf515999c9a3491c963f76be82ed6005616bf7ba98247b01d6a89a9af1d71","other":"7a68fa44bbec187272e2d5dfbd6ed8af31a1a365aa72aa50db02350ebe98c859","up":true},{"one":"a86117147b78f20a6d883d37715da85178cad89eff650a74aa89e7bc11bc45a7","other":"fac808b79923931febd54e3611b79811b3973c777e7502bd56b9803d0c4bf785","up":true},{"one":"2dd4ad83effc3ba73e72f5659583e5987241bda563563200b50c46cce00a1d9b","other":"17406dea5046f00e27eaf74e166a945c9485139d6edcdfcd84f5b03f50eedd0a","up":true},{"one":"2471776037d55a05df2b15bcefe52cb1f4c942e9e15113abc2a0c1fcbaa5d626","other":"5c623fa0103108d0b1e24e6d01a6624ce3b59a9e7c422c45dfc1211676785542","up":true},{"one":"6379b4d611cdd6e360480c14b3f6784360f28f702b5a6f375eda4ef3bde7ef33","other":"58a90b58858417a4e972626421ed8e78b1b3e5ac69fcedd22c58a8ab4c6147df","up":true},{"one":"5008ef55ad8088f70643b0f93bcb479531bcb0afe8e01b215dbf8597ec866369","other":"5a8ba4047c4456e825bd1b34c961f5c7f37bf7c27bc48bee71b8430c7d135486","up":true},{"one":"27db66d13ee8168aca89786febd6971dd1d6c554bca8501052065cb47631560d","other":"216e0370111e2e03927b803ae788f9947de8e241d41dbf6a70983cf0ecd68af1","up":true},{"one":"58a90b58858417a4e972626421ed8e78b1b3e5ac69fcedd22c58a8ab4c6147df","other":"51c285489ff14628268ae886945e1cd2da64c6a0a8cb184aada98567ab429b6e","up":true},{"one":"4a3c39f044c425c153d4900db30f839d7866c8e0f4f4d38d9205e67fb540988e","other":"4efaabab0d5dc59f098aee4dba3868263411a55615a2c474a73e6eec2211decc","up":true},{"one":"5be6df23201fc5c00be650849c8bfe5581e44033ef19012836f97c98f3954471","other":"5cc1c28eafd9758e807a28159a1a7a6ea313fa7e878fde5d47fcc8f5a5c25172","up":true},{"one":"7bcb0d7b9f84aed413cf9b2a7851ba6d1138d85382aa20e6c939a43c8e59c034","other":"7a68fa44bbec187272e2d5dfbd6ed8af31a1a365aa72aa50db02350ebe98c859","up":true},{"one":"4746379212b91ee1c13c1336e8f3a73a84408b7636c222c11bd27ce7d724e6c6","other":"4a3c39f044c425c153d4900db30f839d7866c8e0f4f4d38d9205e67fb540988e","up":true},{"one":"4d750666dc0e9e2c244c43492801c1d7ec6208954a0cb5f8bb793b912440753a","other":"a1929f704664ca85d829ac3bab62e688647a7cfdcbc9f03c61b0124cf9093505","up":true},{"one":"bddbdff3cbd22fcedddc07de27125819aac72be72c3126ba898621c496cb95a2","other":"947205fd85a17330a6d5c51a66548c5f69779c76ab12408f8fc6d33d7c6b8e9d","up":true},{"one":"0a215c7765be2caebf76ad3e8017bbc2aaadf8e0dd4859af781953a0564c5d59","other":"8d3e0d9c6932d3422024394998e943309b679d667394d0eb622f0e208e7fcf0a","up":true},{"one":"3590afcd10fb8f58c39f72068661d9a772b77e0efd57bbd60306632fb048fa3a","other":"034de66774eda26b93e342c9b94b9deaeb6297650c819b144a5832bebfe6b02f","up":true},{"one":"eb01ff80307afbfc7457c96594cd4ba4d00acb7fd25a7571d1223168bd66ff09","other":"ea3d6aa50ad5a1d5647d213f9b5cfe6718339eec7eef8644487eb3c223c7bcde","up":true},{"one":"2803f212eb4aa4f49224b16b2de88ba8652ad115321ee1e60cdbd926ecdad38a","other":"034de66774eda26b93e342c9b94b9deaeb6297650c819b144a5832bebfe6b02f","up":true},{"one":"36d5952685c95e42bef14f77b63705897ca71d24d21e4e9efc772d9cabd21122","other":"7bee7967ff7b07243bed55b6d060d5ec2a1f28b530ed65cd055dc5b468a0f878","up":true},{"one":"aba793e635f71169105ad073225cc8db914de6b711fe9f22c5d94ac8cb85e2eb","other":"f33c07a818863a358358989ec71504abad3ca0a7c81b54aad59075a766fad501","up":true},{"one":"21dcfb893a54cb56d21355fc564583057fc51b32503a8627e7575660725a7627","other":"3b830c2ae5463ca2f2260176b77b8dda23048257aa780255c69cf1bbbc6fb64c","up":true},{"one":"22bbb3236a5e0a1947a1c4735aaacf9122173789a02a06e7653103bdcae2f823","other":"21dcfb893a54cb56d21355fc564583057fc51b32503a8627e7575660725a7627","up":true},{"one":"5a8ba4047c4456e825bd1b34c961f5c7f37bf7c27bc48bee71b8430c7d135486","other":"69753865aacaaf72d9bf6d265c885d3f705804ff4b2675f7aa860641dacab2a0","up":true},{"one":"2d531c50183f0115269b3feaecf45927a3ac44e1be2a263c7e5d2274d8379b1c","other":"2471776037d55a05df2b15bcefe52cb1f4c942e9e15113abc2a0c1fcbaa5d626","up":true},{"one":"fa655b4882579e65937a14ab1c6bcba021580f0a5ebc04c48424f5ae72b7d5b4","other":"efd68d2c99346ca085c9ef896bee6125ad8638413295108f3a92b247a41ca629","up":true},{"one":"52b47d52bf4a1afda1604b7942019c8d2ac4c760c5eb4597e1ce2dd7a8e1cf4d","other":"7bee7967ff7b07243bed55b6d060d5ec2a1f28b530ed65cd055dc5b468a0f878","up":true},{"one":"127c89eae94b195df2eb5eb7b44f634adb73c114d2089cd904b56988c8674e11","other":"2d531c50183f0115269b3feaecf45927a3ac44e1be2a263c7e5d2274d8379b1c","up":true},{"one":"be0fb2b440b91e719c20f51b673eb9f2f66c7af77b0b0ade312998cdffcc5045","other":"bd486e1e15df4c7539b1ad5b54f7566dd4836a430e9f7d3503881fa79e258d9b","up":true},{"one":"947205fd85a17330a6d5c51a66548c5f69779c76ab12408f8fc6d33d7c6b8e9d","other":"82847a4af4f50622650d035f69151b202bccd5fc92302a617602c974603ed997","up":true},{"one":"3b830c2ae5463ca2f2260176b77b8dda23048257aa780255c69cf1bbbc6fb64c","other":"0f3106adfe70aefb474c4a98a95932307391de2cb70fbd2e11dd31c9e695ed83","up":true},{"one":"f3d50811ef10661d3ef9978077cd7181387298f306833ab6e27f25cbb77435cd","other":"a1929f704664ca85d829ac3bab62e688647a7cfdcbc9f03c61b0124cf9093505","up":true},{"one":"08077c0ce8d4130c14464493e9164a8bae61b4646b1ec48899e75f2f6f9b8c66","other":"01a63575c384f686e5739e1bd079e4a4c55421cd6d89b944e2c61dd174fa2bf6","up":true},{"one":"6379b4d611cdd6e360480c14b3f6784360f28f702b5a6f375eda4ef3bde7ef33","other":"5cc1c28eafd9758e807a28159a1a7a6ea313fa7e878fde5d47fcc8f5a5c25172","up":true},{"one":"1929b01c0f85af7452a0f358b54f6b36640a196b366909172af594a1648fe64c","other":"13853407d278a45e15d4b148fc38ebb35c4f58ee552ee0e4401c6c98c45b8e3e","up":true},{"one":"cc9f65d734f1a3bbc6019e166fe355bd7fc33bb4887043a5ccf532a9ba356379","other":"dd92b3d42414fd5eff5c1e4ca55c63cd7036634049995b72a20cdf7ca1321978","up":true},{"one":"8b35236da99930bf8f5ef6c7555bb18b80ce2e34361bbbfd6baf55a6483e54ff","other":"b3555baa764c4562935b93533ee6c5a6df631e846c3ab512fdb1d6b901a68c60","up":true},{"one":"221cd8ea0a26f0d3f81f782f1de390282415ecd9cf40224b4945a00897895b4e","other":"21dcfb893a54cb56d21355fc564583057fc51b32503a8627e7575660725a7627","up":true},{"one":"957ed6194e6ef56e9696be43a1a0258f2ba4f48f56d790e42bd0663c3fc6aaae","other":"2803f212eb4aa4f49224b16b2de88ba8652ad115321ee1e60cdbd926ecdad38a","up":true},{"one":"17406dea5046f00e27eaf74e166a945c9485139d6edcdfcd84f5b03f50eedd0a","other":"73d0d1d4a2b7250f51e57c13cc48bc6b20682320ce12ee8e5765afeef7d9de42","up":true},{"one":"ce01234661309127bb872d69d38dc5bf19bc4de2e0a0b5041cd362d073df4ff8","other":"ed2ec6681bf325887768703779ccf3a6278731118cd3ec890490a3de50f689ac","up":true},{"one":"7a68fa44bbec187272e2d5dfbd6ed8af31a1a365aa72aa50db02350ebe98c859","other":"641a165f8be0eee36f53c12bae8e2a34a709adb8d1dcd667e88e4e90c9ee2401","up":true},{"one":"c52a68d8388a21013e4eecef9ea866db1f5eb16bbe0ecc82b8bfafd33e4e014f","other":"b9d906e406b0fc6078c22bbc173043df1f7581061b4f6ccd769bc568d94b4339","up":true},{"one":"836e65dfe6f01e1d2934655c1846cb86fed6e41ea951a109d7a20bb14cb4c10a","other":"75e282c0f3d355a40573e6578c5aac98e7262970a9239f4dcefd26d6f008b553","up":true},{"one":"b3555baa764c4562935b93533ee6c5a6df631e846c3ab512fdb1d6b901a68c60","other":"a1929f704664ca85d829ac3bab62e688647a7cfdcbc9f03c61b0124cf9093505","up":true},{"one":"37751f279493dc5ce5b5c3c55a6ec2e4119eedefe1069b283f6ff8c7bc9d1411","other":"f611d8039385ad56260ab391763e3627aadd2756565fedc3ec95f76124da0efc","up":true},{"one":"4a3c39f044c425c153d4900db30f839d7866c8e0f4f4d38d9205e67fb540988e","other":"4bc8dfbf84794d26d7a573c9d898974eaa3a2167e19cb7a8aa460807a603acd4","up":true},{"one":"f4a0f76b30bcf5987cfa3f4f4b0aa3445f39d60a1f51519fa660c27b5d833dde","other":"fa655b4882579e65937a14ab1c6bcba021580f0a5ebc04c48424f5ae72b7d5b4","up":true},{"one":"7bee7967ff7b07243bed55b6d060d5ec2a1f28b530ed65cd055dc5b468a0f878","other":"72a76f668d9b923914860eb4f8577bc98c153f6dd222cd36a0bbdef2bab7f068","up":true},{"one":"a9fa28117a4b6906b5ce3931573e0a19eec3cb4fcd9141be2d258a2be06f3b61","other":"cabfdfb789cc20962eaba1dbe68d6dc0466e699d22dc5b29f27a5cd555398795","up":true},{"one":"c0adf394af7d5670c1ce8c6bea292fbc03c56ae2b636e2f303311a455bb3500f","other":"d23c97bebcde26f5e351c4b975c76aaf604fd206f9b9063ecbda538e7a52f514","up":true},{"one":"6daaf515999c9a3491c963f76be82ed6005616bf7ba98247b01d6a89a9af1d71","other":"772a79302528fdce6a216c98c95e281333292c81dfe490aeaa4a78bfeb1980c8","up":true},{"one":"ce01234661309127bb872d69d38dc5bf19bc4de2e0a0b5041cd362d073df4ff8","other":"5cc1c28eafd9758e807a28159a1a7a6ea313fa7e878fde5d47fcc8f5a5c25172","up":true},{"one":"cc5fa2d49210e240983b0853ff15003f0d366f05cb1f6486bae2862cca852cc5","other":"d9d30b9b212bd4811a44ebe304ba3935ead3abe3247f99893faf65664131c29d","up":true},{"one":"deec6a8beb4e5e441dd42311354194c3bef9448e8859b4ccd401645b69217d12","other":"ed12c78e700bf805669c48a5d62f1e56791263c4b2ce5bd34587ea9bc931a3e5","up":true},{"one":"efd68d2c99346ca085c9ef896bee6125ad8638413295108f3a92b247a41ca629","other":"cabfdfb789cc20962eaba1dbe68d6dc0466e699d22dc5b29f27a5cd555398795","up":true},{"one":"ed2ec6681bf325887768703779ccf3a6278731118cd3ec890490a3de50f689ac","other":"cc5fa2d49210e240983b0853ff15003f0d366f05cb1f6486bae2862cca852cc5","up":true},{"one":"fa9a809f016097d949fa1463a1c8f08871c7d38e60b7df6d3e28ab04ccd3a143","other":"17406dea5046f00e27eaf74e166a945c9485139d6edcdfcd84f5b03f50eedd0a","up":true},{"one":"13853407d278a45e15d4b148fc38ebb35c4f58ee552ee0e4401c6c98c45b8e3e","other":"58a90b58858417a4e972626421ed8e78b1b3e5ac69fcedd22c58a8ab4c6147df","up":true},{"one":"4c211c117e555c2ac831d5688615b6b4c5e31f1d7c7906b34f0cbcdbc45482b4","other":"5cc1c28eafd9758e807a28159a1a7a6ea313fa7e878fde5d47fcc8f5a5c25172","up":true},{"one":"e06f58b144faa650f96465825d253b63d7e061e3a3c4228ad5e1b665afbccc37","other":"0e344c6e27c23bd36bdd3ddcefa4e577fdc9461e52c7ce20135733a08b987b82","up":true},{"one":"b8695bec6c8e1e6794bb943b83629cd2c910067e6e178f6f8e33c4f0fa2d74f4","other":"bde90aaa0f1f7a7eb965ff308718d29b55a80b1ca84dfba16c169eabe2b0d5de","up":true},{"one":"2dd4ad83effc3ba73e72f5659583e5987241bda563563200b50c46cce00a1d9b","other":"13853407d278a45e15d4b148fc38ebb35c4f58ee552ee0e4401c6c98c45b8e3e","up":true},{"one":"72a76f668d9b923914860eb4f8577bc98c153f6dd222cd36a0bbdef2bab7f068","other":"6daaf515999c9a3491c963f76be82ed6005616bf7ba98247b01d6a89a9af1d71","up":true},{"one":"69753865aacaaf72d9bf6d265c885d3f705804ff4b2675f7aa860641dacab2a0","other":"77eedcac0c847b1d693ddff07c5868afb1c2008b2dcb48a0299143ab14611969","up":true},{"one":"d125317b492df46a7dd496d30c6d07839ed6bfa196abde4886ce7bc8f9b5c01f","other":"ed2ec6681bf325887768703779ccf3a6278731118cd3ec890490a3de50f689ac","up":true},{"one":"947205fd85a17330a6d5c51a66548c5f69779c76ab12408f8fc6d33d7c6b8e9d","other":"8b35236da99930bf8f5ef6c7555bb18b80ce2e34361bbbfd6baf55a6483e54ff","up":true},{"one":"f611d8039385ad56260ab391763e3627aadd2756565fedc3ec95f76124da0efc","other":"f4a0f76b30bcf5987cfa3f4f4b0aa3445f39d60a1f51519fa660c27b5d833dde","up":true},{"one":"bc71f3e409edb989e26607448491530c5451053b582ea64d882525451ac940bb","other":"b9d906e406b0fc6078c22bbc173043df1f7581061b4f6ccd769bc568d94b4339","up":true},{"one":"eb01ff80307afbfc7457c96594cd4ba4d00acb7fd25a7571d1223168bd66ff09","other":"77eedcac0c847b1d693ddff07c5868afb1c2008b2dcb48a0299143ab14611969","up":true},{"one":"cc9f65d734f1a3bbc6019e166fe355bd7fc33bb4887043a5ccf532a9ba356379","other":"c2f9b4abed9c6a839fe4c03a80bd396fd187a8784ba47a83687d3a54b7e2eddf","up":true},{"one":"836e65dfe6f01e1d2934655c1846cb86fed6e41ea951a109d7a20bb14cb4c10a","other":"62f007c92a8af466e90ed0b1e5e71a955ad273ec793948ddfc03977f131ed2d1","up":true},{"one":"c2f9b4abed9c6a839fe4c03a80bd396fd187a8784ba47a83687d3a54b7e2eddf","other":"8330e2b8ae2f184bb8dc5e153fafa4dafe86f84ec692d3ee91413cc07b1cd9e2","up":true},{"one":"21dcfb893a54cb56d21355fc564583057fc51b32503a8627e7575660725a7627","other":"3871492c8c62cd74cbe65a993669e4978cc641879a5223dd6b9e687f050a1c40","up":true},{"one":"f3d50811ef10661d3ef9978077cd7181387298f306833ab6e27f25cbb77435cd","other":"f4a0f76b30bcf5987cfa3f4f4b0aa3445f39d60a1f51519fa660c27b5d833dde","up":true},{"one":"27b56302a89605a83563ba7b66d491ec25edfad0ea1010937fcadeab4d3ae582","other":"08077c0ce8d4130c14464493e9164a8bae61b4646b1ec48899e75f2f6f9b8c66","up":true},{"one":"5be6df23201fc5c00be650849c8bfe5581e44033ef19012836f97c98f3954471","other":"58a90b58858417a4e972626421ed8e78b1b3e5ac69fcedd22c58a8ab4c6147df","up":true},{"one":"4efaabab0d5dc59f098aee4dba3868263411a55615a2c474a73e6eec2211decc","other":"7bee7967ff7b07243bed55b6d060d5ec2a1f28b530ed65cd055dc5b468a0f878","up":true},{"one":"221cd8ea0a26f0d3f81f782f1de390282415ecd9cf40224b4945a00897895b4e","other":"37751f279493dc5ce5b5c3c55a6ec2e4119eedefe1069b283f6ff8c7bc9d1411","up":true},{"one":"957ed6194e6ef56e9696be43a1a0258f2ba4f48f56d790e42bd0663c3fc6aaae","other":"034de66774eda26b93e342c9b94b9deaeb6297650c819b144a5832bebfe6b02f","up":true},{"one":"bde90aaa0f1f7a7eb965ff308718d29b55a80b1ca84dfba16c169eabe2b0d5de","other":"957ed6194e6ef56e9696be43a1a0258f2ba4f48f56d790e42bd0663c3fc6aaae","up":true},{"one":"bd9607d5f57f7b6f74f4ad981be368988ef48b5f31e3fd96cab3bb790d568150","other":"a9fa28117a4b6906b5ce3931573e0a19eec3cb4fcd9141be2d258a2be06f3b61","up":true},{"one":"4bc8dfbf84794d26d7a573c9d898974eaa3a2167e19cb7a8aa460807a603acd4","other":"68a63ebc4833dedfdb6d534438ffcccd042f60434bee0e39f4cb3726e7413e7a","up":true},{"one":"034de66774eda26b93e342c9b94b9deaeb6297650c819b144a5832bebfe6b02f","other":"37751f279493dc5ce5b5c3c55a6ec2e4119eedefe1069b283f6ff8c7bc9d1411","up":true},{"one":"fa9a809f016097d949fa1463a1c8f08871c7d38e60b7df6d3e28ab04ccd3a143","other":"0639f010834f5bc497798f2d275bbc60bfbcd53c83e38986b7260310c6001420","up":true},{"one":"f005a4d3453d52434f2b5be4006e653b50b52ad31926d654722fc3df00f1689c","other":"2803f212eb4aa4f49224b16b2de88ba8652ad115321ee1e60cdbd926ecdad38a","up":true},{"one":"bd9607d5f57f7b6f74f4ad981be368988ef48b5f31e3fd96cab3bb790d568150","other":"a86117147b78f20a6d883d37715da85178cad89eff650a74aa89e7bc11bc45a7","up":true},{"one":"7bcb0d7b9f84aed413cf9b2a7851ba6d1138d85382aa20e6c939a43c8e59c034","other":"f005a4d3453d52434f2b5be4006e653b50b52ad31926d654722fc3df00f1689c","up":true},{"one":"1929b01c0f85af7452a0f358b54f6b36640a196b366909172af594a1648fe64c","other":"184e9e00ab4fe1669d4d99fb33d418d33eff927da38cc997f69679443c24b20b","up":true},{"one":"8fb8208b7167dd06cc08778b507ccd856751d3df6dfbaeac18b9f527b6628523","other":"4a373571475e2b4c280d2d4b22f10a249ee09fcf907f52081ec0398a8b5ea6f2","up":true},{"one":"cabfdfb789cc20962eaba1dbe68d6dc0466e699d22dc5b29f27a5cd555398795","other":"bc29a0d9b60f3e2c34224cec187cf44eadc4628086d5594666ed025da71e7e7a","up":true},{"one":"6379b4d611cdd6e360480c14b3f6784360f28f702b5a6f375eda4ef3bde7ef33","other":"75e282c0f3d355a40573e6578c5aac98e7262970a9239f4dcefd26d6f008b553","up":true},{"one":"b4e29de4bd5751f31195ead8aa1548d305a53fb4f99be9931850e6273de8f359","other":"957ed6194e6ef56e9696be43a1a0258f2ba4f48f56d790e42bd0663c3fc6aaae","up":true},{"one":"ea3d6aa50ad5a1d5647d213f9b5cfe6718339eec7eef8644487eb3c223c7bcde","other":"dd92b3d42414fd5eff5c1e4ca55c63cd7036634049995b72a20cdf7ca1321978","up":true},{"one":"64e642de2667a7563c774050d368858d99aff433efbd1cb68361e3e244629b03","other":"3e1959b29bbacb3ce7dccfa41c3e51b87f1afc700a3c6e4713c38cc0fe3790df","up":true},{"one":"b9d906e406b0fc6078c22bbc173043df1f7581061b4f6ccd769bc568d94b4339","other":"aba793e635f71169105ad073225cc8db914de6b711fe9f22c5d94ac8cb85e2eb","up":true},{"one":"b60e77c40ddc9dc78a4ad346add37e60f10f2999de836615db53524487d1ede9","other":"b9d906e406b0fc6078c22bbc173043df1f7581061b4f6ccd769bc568d94b4339","up":true},{"one":"221cd8ea0a26f0d3f81f782f1de390282415ecd9cf40224b4945a00897895b4e","other":"216e0370111e2e03927b803ae788f9947de8e241d41dbf6a70983cf0ecd68af1","up":true},{"one":"bd486e1e15df4c7539b1ad5b54f7566dd4836a430e9f7d3503881fa79e258d9b","other":"b5fc43e8c0df3279d6a12cd8b03012cb8d2205208324018c7ae725745a99a2f3","up":true},{"one":"641a165f8be0eee36f53c12bae8e2a34a709adb8d1dcd667e88e4e90c9ee2401","other":"deec6a8beb4e5e441dd42311354194c3bef9448e8859b4ccd401645b69217d12","up":true},{"one":"62f007c92a8af466e90ed0b1e5e71a955ad273ec793948ddfc03977f131ed2d1","other":"68a63ebc4833dedfdb6d534438ffcccd042f60434bee0e39f4cb3726e7413e7a","up":true},{"one":"c2f9b4abed9c6a839fe4c03a80bd396fd187a8784ba47a83687d3a54b7e2eddf","other":"aba793e635f71169105ad073225cc8db914de6b711fe9f22c5d94ac8cb85e2eb","up":true},{"one":"d23c97bebcde26f5e351c4b975c76aaf604fd206f9b9063ecbda538e7a52f514","other":"0a215c7765be2caebf76ad3e8017bbc2aaadf8e0dd4859af781953a0564c5d59","up":true},{"one":"acf888ed781f5358493e2e5048691acc39eac3240ca9e9093bb4052b1f624325","other":"836e65dfe6f01e1d2934655c1846cb86fed6e41ea951a109d7a20bb14cb4c10a","up":true},{"one":"27db66d13ee8168aca89786febd6971dd1d6c554bca8501052065cb47631560d","other":"f177ee6767a78a57b725dbe67ec377f507f5777d345a28892b0fbfb800dc443a","up":true},{"one":"0639f010834f5bc497798f2d275bbc60bfbcd53c83e38986b7260310c6001420","other":"01a63575c384f686e5739e1bd079e4a4c55421cd6d89b944e2c61dd174fa2bf6","up":true},{"one":"01a63575c384f686e5739e1bd079e4a4c55421cd6d89b944e2c61dd174fa2bf6","other":"21dcfb893a54cb56d21355fc564583057fc51b32503a8627e7575660725a7627","up":true},{"one":"fa655b4882579e65937a14ab1c6bcba021580f0a5ebc04c48424f5ae72b7d5b4","other":"ee2b0aff61a9846d13de3a72712ef0bf3ca42ad8da57e81759c242797258efec","up":true},{"one":"2803f212eb4aa4f49224b16b2de88ba8652ad115321ee1e60cdbd926ecdad38a","other":"184e9e00ab4fe1669d4d99fb33d418d33eff927da38cc997f69679443c24b20b","up":true},{"one":"be0fb2b440b91e719c20f51b673eb9f2f66c7af77b0b0ade312998cdffcc5045","other":"0f3106adfe70aefb474c4a98a95932307391de2cb70fbd2e11dd31c9e695ed83","up":true},{"one":"75e282c0f3d355a40573e6578c5aac98e7262970a9239f4dcefd26d6f008b553","other":"45895aff674079f6be02e4cc74914d63125c3fe48bb69056c070c71319fea1fa","up":true},{"one":"2354d3af5c6dca05d7dc212b100112f37ab29fb8b3f4319887230a4d420f5d9d","other":"3871492c8c62cd74cbe65a993669e4978cc641879a5223dd6b9e687f050a1c40","up":true},{"one":"5a8ba4047c4456e825bd1b34c961f5c7f37bf7c27bc48bee71b8430c7d135486","other":"62f007c92a8af466e90ed0b1e5e71a955ad273ec793948ddfc03977f131ed2d1","up":true},{"one":"eceb7dc532596e8b68074113db9605e3d15cb15e2e80f75f1a66d95a1221c7dc","other":"8012a7af71d76d882202cf9372523478ccebea23443006c7f29c2a83106cd1b3","up":true},{"one":"bddbdff3cbd22fcedddc07de27125819aac72be72c3126ba898621c496cb95a2","other":"a1929f704664ca85d829ac3bab62e688647a7cfdcbc9f03c61b0124cf9093505","up":true},{"one":"73d0d1d4a2b7250f51e57c13cc48bc6b20682320ce12ee8e5765afeef7d9de42","other":"72a76f668d9b923914860eb4f8577bc98c153f6dd222cd36a0bbdef2bab7f068","up":true},{"one":"cc5fa2d49210e240983b0853ff15003f0d366f05cb1f6486bae2862cca852cc5","other":"f177ee6767a78a57b725dbe67ec377f507f5777d345a28892b0fbfb800dc443a","up":true},{"one":"bc71f3e409edb989e26607448491530c5451053b582ea64d882525451ac940bb","other":"cabfdfb789cc20962eaba1dbe68d6dc0466e699d22dc5b29f27a5cd555398795","up":true},{"one":"acf888ed781f5358493e2e5048691acc39eac3240ca9e9093bb4052b1f624325","other":"8012a7af71d76d882202cf9372523478ccebea23443006c7f29c2a83106cd1b3","up":true},{"one":"127c89eae94b195df2eb5eb7b44f634adb73c114d2089cd904b56988c8674e11","other":"36d5952685c95e42bef14f77b63705897ca71d24d21e4e9efc772d9cabd21122","up":true},{"one":"4cc2386a86fd210bf699c6d93173b0879c3210d46f572a62bb154cb60a7d2cb1","other":"6379b4d611cdd6e360480c14b3f6784360f28f702b5a6f375eda4ef3bde7ef33","up":true},{"one":"fa9a809f016097d949fa1463a1c8f08871c7d38e60b7df6d3e28ab04ccd3a143","other":"13853407d278a45e15d4b148fc38ebb35c4f58ee552ee0e4401c6c98c45b8e3e","up":true},{"one":"efd68d2c99346ca085c9ef896bee6125ad8638413295108f3a92b247a41ca629","other":"c9ef56afed2d40db396ad39d6f5f5f38f4058b6b0d1e02b71d6aa92dbeaf7df7","up":true},{"one":"216e0370111e2e03927b803ae788f9947de8e241d41dbf6a70983cf0ecd68af1","other":"22bbb3236a5e0a1947a1c4735aaacf9122173789a02a06e7653103bdcae2f823","up":true},{"one":"deec6a8beb4e5e441dd42311354194c3bef9448e8859b4ccd401645b69217d12","other":"eceb7dc532596e8b68074113db9605e3d15cb15e2e80f75f1a66d95a1221c7dc","up":true},{"one":"3590afcd10fb8f58c39f72068661d9a772b77e0efd57bbd60306632fb048fa3a","other":"a9fa28117a4b6906b5ce3931573e0a19eec3cb4fcd9141be2d258a2be06f3b61","up":true},{"one":"2d531c50183f0115269b3feaecf45927a3ac44e1be2a263c7e5d2274d8379b1c","other":"03eb2e92ed0923f696269e7a03fec731d8c3f8df278023a9cb00867b533a3ca3","up":true},{"one":"efd68d2c99346ca085c9ef896bee6125ad8638413295108f3a92b247a41ca629","other":"f611d8039385ad56260ab391763e3627aadd2756565fedc3ec95f76124da0efc","up":true},{"one":"0f3106adfe70aefb474c4a98a95932307391de2cb70fbd2e11dd31c9e695ed83","other":"127c89eae94b195df2eb5eb7b44f634adb73c114d2089cd904b56988c8674e11","up":true},{"one":"acf888ed781f5358493e2e5048691acc39eac3240ca9e9093bb4052b1f624325","other":"b9d906e406b0fc6078c22bbc173043df1f7581061b4f6ccd769bc568d94b4339","up":true},{"one":"b3555baa764c4562935b93533ee6c5a6df631e846c3ab512fdb1d6b901a68c60","other":"a86117147b78f20a6d883d37715da85178cad89eff650a74aa89e7bc11bc45a7","up":true},{"one":"37751f279493dc5ce5b5c3c55a6ec2e4119eedefe1069b283f6ff8c7bc9d1411","other":"f177ee6767a78a57b725dbe67ec377f507f5777d345a28892b0fbfb800dc443a","up":true},{"one":"2471776037d55a05df2b15bcefe52cb1f4c942e9e15113abc2a0c1fcbaa5d626","other":"3e1959b29bbacb3ce7dccfa41c3e51b87f1afc700a3c6e4713c38cc0fe3790df","up":true},{"one":"4cc2386a86fd210bf699c6d93173b0879c3210d46f572a62bb154cb60a7d2cb1","other":"6450bb5e880411abcb60258d8560949f6f70d92ba7bfa9a4d7845463c48dab30","up":true},{"one":"08077c0ce8d4130c14464493e9164a8bae61b4646b1ec48899e75f2f6f9b8c66","other":"0e344c6e27c23bd36bdd3ddcefa4e577fdc9461e52c7ce20135733a08b987b82","up":true},{"one":"45895aff674079f6be02e4cc74914d63125c3fe48bb69056c070c71319fea1fa","other":"47753fdca855ea79abf667b50aa9c90a132d44bdd1572c3e3c411c8ee7e5b5f4","up":true},{"one":"b8695bec6c8e1e6794bb943b83629cd2c910067e6e178f6f8e33c4f0fa2d74f4","other":"bc29a0d9b60f3e2c34224cec187cf44eadc4628086d5594666ed025da71e7e7a","up":true},{"one":"ea3d6aa50ad5a1d5647d213f9b5cfe6718339eec7eef8644487eb3c223c7bcde","other":"c2f9b4abed9c6a839fe4c03a80bd396fd187a8784ba47a83687d3a54b7e2eddf","up":true},{"one":"55fdad03303a746920773217c568a37d2004869ff34096fbe45197f71eba2b63","other":"4cc2386a86fd210bf699c6d93173b0879c3210d46f572a62bb154cb60a7d2cb1","up":true},{"one":"acf888ed781f5358493e2e5048691acc39eac3240ca9e9093bb4052b1f624325","other":"f33c07a818863a358358989ec71504abad3ca0a7c81b54aad59075a766fad501","up":true},{"one":"f3d50811ef10661d3ef9978077cd7181387298f306833ab6e27f25cbb77435cd","other":"f005a4d3453d52434f2b5be4006e653b50b52ad31926d654722fc3df00f1689c","up":true},{"one":"a1929f704664ca85d829ac3bab62e688647a7cfdcbc9f03c61b0124cf9093505","other":"f4a0f76b30bcf5987cfa3f4f4b0aa3445f39d60a1f51519fa660c27b5d833dde","up":true},{"one":"c0adf394af7d5670c1ce8c6bea292fbc03c56ae2b636e2f303311a455bb3500f","other":"72a53f0fb1b51855cb4054a39cbd1309a76a862d36e18af9ba0456a60325c06e","up":true},{"one":"d23c97bebcde26f5e351c4b975c76aaf604fd206f9b9063ecbda538e7a52f514","other":"127c89eae94b195df2eb5eb7b44f634adb73c114d2089cd904b56988c8674e11","up":true},{"one":"0f3106adfe70aefb474c4a98a95932307391de2cb70fbd2e11dd31c9e695ed83","other":"01a63575c384f686e5739e1bd079e4a4c55421cd6d89b944e2c61dd174fa2bf6","up":true},{"one":"dd92b3d42414fd5eff5c1e4ca55c63cd7036634049995b72a20cdf7ca1321978","other":"82847a4af4f50622650d035f69151b202bccd5fc92302a617602c974603ed997","up":true},{"one":"47753fdca855ea79abf667b50aa9c90a132d44bdd1572c3e3c411c8ee7e5b5f4","other":"5a8ba4047c4456e825bd1b34c961f5c7f37bf7c27bc48bee71b8430c7d135486","up":true},{"one":"c2f9b4abed9c6a839fe4c03a80bd396fd187a8784ba47a83687d3a54b7e2eddf","other":"acf888ed781f5358493e2e5048691acc39eac3240ca9e9093bb4052b1f624325","up":true},{"one":"fac808b79923931febd54e3611b79811b3973c777e7502bd56b9803d0c4bf785","other":"fa655b4882579e65937a14ab1c6bcba021580f0a5ebc04c48424f5ae72b7d5b4","up":true},{"one":"4746379212b91ee1c13c1336e8f3a73a84408b7636c222c11bd27ce7d724e6c6","other":"4a373571475e2b4c280d2d4b22f10a249ee09fcf907f52081ec0398a8b5ea6f2","up":true},{"one":"d9d30b9b212bd4811a44ebe304ba3935ead3abe3247f99893faf65664131c29d","other":"deec6a8beb4e5e441dd42311354194c3bef9448e8859b4ccd401645b69217d12","up":true},{"one":"b8695bec6c8e1e6794bb943b83629cd2c910067e6e178f6f8e33c4f0fa2d74f4","other":"bd9607d5f57f7b6f74f4ad981be368988ef48b5f31e3fd96cab3bb790d568150","up":true},{"one":"eb01ff80307afbfc7457c96594cd4ba4d00acb7fd25a7571d1223168bd66ff09","other":"c9ef56afed2d40db396ad39d6f5f5f38f4058b6b0d1e02b71d6aa92dbeaf7df7","up":true},{"one":"459b9fb2b7f4e396de8cf8740a6804c8e5b96ca11ffa2b5106c14dfbbab65c95","other":"641a165f8be0eee36f53c12bae8e2a34a709adb8d1dcd667e88e4e90c9ee2401","up":true},{"one":"c52a68d8388a21013e4eecef9ea866db1f5eb16bbe0ecc82b8bfafd33e4e014f","other":"eceb7dc532596e8b68074113db9605e3d15cb15e2e80f75f1a66d95a1221c7dc","up":true},{"one":"82847a4af4f50622650d035f69151b202bccd5fc92302a617602c974603ed997","other":"772a79302528fdce6a216c98c95e281333292c81dfe490aeaa4a78bfeb1980c8","up":true},{"one":"be0fb2b440b91e719c20f51b673eb9f2f66c7af77b0b0ade312998cdffcc5045","other":"0639f010834f5bc497798f2d275bbc60bfbcd53c83e38986b7260310c6001420","up":true},{"one":"77eedcac0c847b1d693ddff07c5868afb1c2008b2dcb48a0299143ab14611969","other":"6450bb5e880411abcb60258d8560949f6f70d92ba7bfa9a4d7845463c48dab30","up":true},{"one":"cc9f65d734f1a3bbc6019e166fe355bd7fc33bb4887043a5ccf532a9ba356379","other":"c0adf394af7d5670c1ce8c6bea292fbc03c56ae2b636e2f303311a455bb3500f","up":true},{"one":"37751f279493dc5ce5b5c3c55a6ec2e4119eedefe1069b283f6ff8c7bc9d1411","other":"fac808b79923931febd54e3611b79811b3973c777e7502bd56b9803d0c4bf785","up":true},{"one":"cc9f65d734f1a3bbc6019e166fe355bd7fc33bb4887043a5ccf532a9ba356379","other":"c9ef56afed2d40db396ad39d6f5f5f38f4058b6b0d1e02b71d6aa92dbeaf7df7","up":true},{"one":"ce01234661309127bb872d69d38dc5bf19bc4de2e0a0b5041cd362d073df4ff8","other":"5be6df23201fc5c00be650849c8bfe5581e44033ef19012836f97c98f3954471","up":true},{"one":"216e0370111e2e03927b803ae788f9947de8e241d41dbf6a70983cf0ecd68af1","other":"01a63575c384f686e5739e1bd079e4a4c55421cd6d89b944e2c61dd174fa2bf6","up":true},{"one":"64e642de2667a7563c774050d368858d99aff433efbd1cb68361e3e244629b03","other":"2803f212eb4aa4f49224b16b2de88ba8652ad115321ee1e60cdbd926ecdad38a","up":true},{"one":"b8695bec6c8e1e6794bb943b83629cd2c910067e6e178f6f8e33c4f0fa2d74f4","other":"bc71f3e409edb989e26607448491530c5451053b582ea64d882525451ac940bb","up":true},{"one":"eceb7dc532596e8b68074113db9605e3d15cb15e2e80f75f1a66d95a1221c7dc","other":"8d3e0d9c6932d3422024394998e943309b679d667394d0eb622f0e208e7fcf0a","up":true},{"one":"672a566c7c2aeb1d91e6ee4e43984050df8b9560d923d60dc1fb23fb73b1a046","other":"69753865aacaaf72d9bf6d265c885d3f705804ff4b2675f7aa860641dacab2a0","up":true},{"one":"5a8ba4047c4456e825bd1b34c961f5c7f37bf7c27bc48bee71b8430c7d135486","other":"55fdad03303a746920773217c568a37d2004869ff34096fbe45197f71eba2b63","up":true},{"one":"36d5952685c95e42bef14f77b63705897ca71d24d21e4e9efc772d9cabd21122","other":"0e344c6e27c23bd36bdd3ddcefa4e577fdc9461e52c7ce20135733a08b987b82","up":true},{"one":"4bc8dfbf84794d26d7a573c9d898974eaa3a2167e19cb7a8aa460807a603acd4","other":"69753865aacaaf72d9bf6d265c885d3f705804ff4b2675f7aa860641dacab2a0","up":true},{"one":"fa9a809f016097d949fa1463a1c8f08871c7d38e60b7df6d3e28ab04ccd3a143","other":"aba793e635f71169105ad073225cc8db914de6b711fe9f22c5d94ac8cb85e2eb","up":true},{"one":"216e0370111e2e03927b803ae788f9947de8e241d41dbf6a70983cf0ecd68af1","other":"5cc1c28eafd9758e807a28159a1a7a6ea313fa7e878fde5d47fcc8f5a5c25172","up":true},{"one":"0a215c7765be2caebf76ad3e8017bbc2aaadf8e0dd4859af781953a0564c5d59","other":"17406dea5046f00e27eaf74e166a945c9485139d6edcdfcd84f5b03f50eedd0a","up":true},{"one":"68a63ebc4833dedfdb6d534438ffcccd042f60434bee0e39f4cb3726e7413e7a","other":"836e65dfe6f01e1d2934655c1846cb86fed6e41ea951a109d7a20bb14cb4c10a","up":true},{"one":"bd486e1e15df4c7539b1ad5b54f7566dd4836a430e9f7d3503881fa79e258d9b","other":"55fdad03303a746920773217c568a37d2004869ff34096fbe45197f71eba2b63","up":true},{"one":"bd486e1e15df4c7539b1ad5b54f7566dd4836a430e9f7d3503881fa79e258d9b","other":"b60e77c40ddc9dc78a4ad346add37e60f10f2999de836615db53524487d1ede9","up":true},{"one":"fa9a809f016097d949fa1463a1c8f08871c7d38e60b7df6d3e28ab04ccd3a143","other":"c52a68d8388a21013e4eecef9ea866db1f5eb16bbe0ecc82b8bfafd33e4e014f","up":true},{"one":"4746379212b91ee1c13c1336e8f3a73a84408b7636c222c11bd27ce7d724e6c6","other":"4bc8dfbf84794d26d7a573c9d898974eaa3a2167e19cb7a8aa460807a603acd4","up":true},{"one":"c2f9b4abed9c6a839fe4c03a80bd396fd187a8784ba47a83687d3a54b7e2eddf","other":"0639f010834f5bc497798f2d275bbc60bfbcd53c83e38986b7260310c6001420","up":true},{"one":"d23c97bebcde26f5e351c4b975c76aaf604fd206f9b9063ecbda538e7a52f514","other":"a9fa28117a4b6906b5ce3931573e0a19eec3cb4fcd9141be2d258a2be06f3b61","up":true},{"one":"4a373571475e2b4c280d2d4b22f10a249ee09fcf907f52081ec0398a8b5ea6f2","other":"7a68fa44bbec187272e2d5dfbd6ed8af31a1a365aa72aa50db02350ebe98c859","up":true},{"one":"3b830c2ae5463ca2f2260176b77b8dda23048257aa780255c69cf1bbbc6fb64c","other":"3590afcd10fb8f58c39f72068661d9a772b77e0efd57bbd60306632fb048fa3a","up":true},{"one":"bd9607d5f57f7b6f74f4ad981be368988ef48b5f31e3fd96cab3bb790d568150","other":"cabfdfb789cc20962eaba1dbe68d6dc0466e699d22dc5b29f27a5cd555398795","up":true},{"one":"08077c0ce8d4130c14464493e9164a8bae61b4646b1ec48899e75f2f6f9b8c66","other":"8d3e0d9c6932d3422024394998e943309b679d667394d0eb622f0e208e7fcf0a","up":true},{"one":"459b9fb2b7f4e396de8cf8740a6804c8e5b96ca11ffa2b5106c14dfbbab65c95","other":"6daaf515999c9a3491c963f76be82ed6005616bf7ba98247b01d6a89a9af1d71","up":true},{"one":"d23c97bebcde26f5e351c4b975c76aaf604fd206f9b9063ecbda538e7a52f514","other":"0e344c6e27c23bd36bdd3ddcefa4e577fdc9461e52c7ce20135733a08b987b82","up":true},{"one":"ce01234661309127bb872d69d38dc5bf19bc4de2e0a0b5041cd362d073df4ff8","other":"4746379212b91ee1c13c1336e8f3a73a84408b7636c222c11bd27ce7d724e6c6","up":true},{"one":"4a3c39f044c425c153d4900db30f839d7866c8e0f4f4d38d9205e67fb540988e","other":"4d750666dc0e9e2c244c43492801c1d7ec6208954a0cb5f8bb793b912440753a","up":true},{"one":"52b47d52bf4a1afda1604b7942019c8d2ac4c760c5eb4597e1ce2dd7a8e1cf4d","other":"69753865aacaaf72d9bf6d265c885d3f705804ff4b2675f7aa860641dacab2a0","up":true},{"one":"a86117147b78f20a6d883d37715da85178cad89eff650a74aa89e7bc11bc45a7","other":"8012a7af71d76d882202cf9372523478ccebea23443006c7f29c2a83106cd1b3","up":true},{"one":"27db66d13ee8168aca89786febd6971dd1d6c554bca8501052065cb47631560d","other":"f611d8039385ad56260ab391763e3627aadd2756565fedc3ec95f76124da0efc","up":true},{"one":"d9d30b9b212bd4811a44ebe304ba3935ead3abe3247f99893faf65664131c29d","other":"ea3d6aa50ad5a1d5647d213f9b5cfe6718339eec7eef8644487eb3c223c7bcde","up":true},{"one":"45895aff674079f6be02e4cc74914d63125c3fe48bb69056c070c71319fea1fa","other":"f611d8039385ad56260ab391763e3627aadd2756565fedc3ec95f76124da0efc","up":true},{"one":"8b35236da99930bf8f5ef6c7555bb18b80ce2e34361bbbfd6baf55a6483e54ff","other":"a9fa28117a4b6906b5ce3931573e0a19eec3cb4fcd9141be2d258a2be06f3b61","up":true},{"one":"ea3d6aa50ad5a1d5647d213f9b5cfe6718339eec7eef8644487eb3c223c7bcde","other":"f177ee6767a78a57b725dbe67ec377f507f5777d345a28892b0fbfb800dc443a","up":true},{"one":"01a63575c384f686e5739e1bd079e4a4c55421cd6d89b944e2c61dd174fa2bf6","other":"2354d3af5c6dca05d7dc212b100112f37ab29fb8b3f4319887230a4d420f5d9d","up":true},{"one":"c0adf394af7d5670c1ce8c6bea292fbc03c56ae2b636e2f303311a455bb3500f","other":"ed12c78e700bf805669c48a5d62f1e56791263c4b2ce5bd34587ea9bc931a3e5","up":true},{"one":"f33c07a818863a358358989ec71504abad3ca0a7c81b54aad59075a766fad501","other":"947205fd85a17330a6d5c51a66548c5f69779c76ab12408f8fc6d33d7c6b8e9d","up":true},{"one":"68a63ebc4833dedfdb6d534438ffcccd042f60434bee0e39f4cb3726e7413e7a","other":"52b47d52bf4a1afda1604b7942019c8d2ac4c760c5eb4597e1ce2dd7a8e1cf4d","up":true},{"one":"5be6df23201fc5c00be650849c8bfe5581e44033ef19012836f97c98f3954471","other":"5c623fa0103108d0b1e24e6d01a6624ce3b59a9e7c422c45dfc1211676785542","up":true},{"one":"dd92b3d42414fd5eff5c1e4ca55c63cd7036634049995b72a20cdf7ca1321978","other":"ed2ec6681bf325887768703779ccf3a6278731118cd3ec890490a3de50f689ac","up":true},{"one":"bc29a0d9b60f3e2c34224cec187cf44eadc4628086d5594666ed025da71e7e7a","other":"a1929f704664ca85d829ac3bab62e688647a7cfdcbc9f03c61b0124cf9093505","up":true},{"one":"dd92b3d42414fd5eff5c1e4ca55c63cd7036634049995b72a20cdf7ca1321978","other":"a9fa28117a4b6906b5ce3931573e0a19eec3cb4fcd9141be2d258a2be06f3b61","up":true},{"one":"68a63ebc4833dedfdb6d534438ffcccd042f60434bee0e39f4cb3726e7413e7a","other":"a1929f704664ca85d829ac3bab62e688647a7cfdcbc9f03c61b0124cf9093505","up":true},{"one":"2d531c50183f0115269b3feaecf45927a3ac44e1be2a263c7e5d2274d8379b1c","other":"0639f010834f5bc497798f2d275bbc60bfbcd53c83e38986b7260310c6001420","up":true},{"one":"459b9fb2b7f4e396de8cf8740a6804c8e5b96ca11ffa2b5106c14dfbbab65c95","other":"6450bb5e880411abcb60258d8560949f6f70d92ba7bfa9a4d7845463c48dab30","up":true},{"one":"4bc8dfbf84794d26d7a573c9d898974eaa3a2167e19cb7a8aa460807a603acd4","other":"772a79302528fdce6a216c98c95e281333292c81dfe490aeaa4a78bfeb1980c8","up":true},{"one":"d125317b492df46a7dd496d30c6d07839ed6bfa196abde4886ce7bc8f9b5c01f","other":"d18a1edd26661069fb401fee8aa85a9614a3188e2e0666bfe9307f91d29aad49","up":true},{"one":"f611d8039385ad56260ab391763e3627aadd2756565fedc3ec95f76124da0efc","other":"957ed6194e6ef56e9696be43a1a0258f2ba4f48f56d790e42bd0663c3fc6aaae","up":true},{"one":"2dd4ad83effc3ba73e72f5659583e5987241bda563563200b50c46cce00a1d9b","other":"0639f010834f5bc497798f2d275bbc60bfbcd53c83e38986b7260310c6001420","up":true},{"one":"aba793e635f71169105ad073225cc8db914de6b711fe9f22c5d94ac8cb85e2eb","other":"a9fa28117a4b6906b5ce3931573e0a19eec3cb4fcd9141be2d258a2be06f3b61","up":true},{"one":"64e642de2667a7563c774050d368858d99aff433efbd1cb68361e3e244629b03","other":"2d531c50183f0115269b3feaecf45927a3ac44e1be2a263c7e5d2274d8379b1c","up":true},{"one":"127c89eae94b195df2eb5eb7b44f634adb73c114d2089cd904b56988c8674e11","other":"8330e2b8ae2f184bb8dc5e153fafa4dafe86f84ec692d3ee91413cc07b1cd9e2","up":true},{"one":"47753fdca855ea79abf667b50aa9c90a132d44bdd1572c3e3c411c8ee7e5b5f4","other":"4efaabab0d5dc59f098aee4dba3868263411a55615a2c474a73e6eec2211decc","up":true},{"one":"5cc1c28eafd9758e807a28159a1a7a6ea313fa7e878fde5d47fcc8f5a5c25172","other":"3871492c8c62cd74cbe65a993669e4978cc641879a5223dd6b9e687f050a1c40","up":true},{"one":"216e0370111e2e03927b803ae788f9947de8e241d41dbf6a70983cf0ecd68af1","other":"2354d3af5c6dca05d7dc212b100112f37ab29fb8b3f4319887230a4d420f5d9d","up":true},{"one":"3b830c2ae5463ca2f2260176b77b8dda23048257aa780255c69cf1bbbc6fb64c","other":"62f007c92a8af466e90ed0b1e5e71a955ad273ec793948ddfc03977f131ed2d1","up":true},{"one":"f611d8039385ad56260ab391763e3627aadd2756565fedc3ec95f76124da0efc","other":"8012a7af71d76d882202cf9372523478ccebea23443006c7f29c2a83106cd1b3","up":true},{"one":"5be6df23201fc5c00be650849c8bfe5581e44033ef19012836f97c98f3954471","other":"a9fa28117a4b6906b5ce3931573e0a19eec3cb4fcd9141be2d258a2be06f3b61","up":true},{"one":"37751f279493dc5ce5b5c3c55a6ec2e4119eedefe1069b283f6ff8c7bc9d1411","other":"ed2ec6681bf325887768703779ccf3a6278731118cd3ec890490a3de50f689ac","up":true},{"one":"fa9a809f016097d949fa1463a1c8f08871c7d38e60b7df6d3e28ab04ccd3a143","other":"58a90b58858417a4e972626421ed8e78b1b3e5ac69fcedd22c58a8ab4c6147df","up":true},{"one":"b9d906e406b0fc6078c22bbc173043df1f7581061b4f6ccd769bc568d94b4339","other":"b2453c6e755a30efb91194fa607b3352d75b6905c448b09af4aeadf3a445b633","up":true},{"one":"7bee7967ff7b07243bed55b6d060d5ec2a1f28b530ed65cd055dc5b468a0f878","other":"b4e29de4bd5751f31195ead8aa1548d305a53fb4f99be9931850e6273de8f359","up":true},{"one":"dd92b3d42414fd5eff5c1e4ca55c63cd7036634049995b72a20cdf7ca1321978","other":"c0adf394af7d5670c1ce8c6bea292fbc03c56ae2b636e2f303311a455bb3500f","up":true},{"one":"eceb7dc532596e8b68074113db9605e3d15cb15e2e80f75f1a66d95a1221c7dc","other":"836e65dfe6f01e1d2934655c1846cb86fed6e41ea951a109d7a20bb14cb4c10a","up":true},{"one":"b3555baa764c4562935b93533ee6c5a6df631e846c3ab512fdb1d6b901a68c60","other":"b2453c6e755a30efb91194fa607b3352d75b6905c448b09af4aeadf3a445b633","up":true},{"one":"b4e29de4bd5751f31195ead8aa1548d305a53fb4f99be9931850e6273de8f359","other":"b2453c6e755a30efb91194fa607b3352d75b6905c448b09af4aeadf3a445b633","up":true},{"one":"58a90b58858417a4e972626421ed8e78b1b3e5ac69fcedd22c58a8ab4c6147df","other":"5cc1c28eafd9758e807a28159a1a7a6ea313fa7e878fde5d47fcc8f5a5c25172","up":true},{"one":"8fb8208b7167dd06cc08778b507ccd856751d3df6dfbaeac18b9f527b6628523","other":"4d750666dc0e9e2c244c43492801c1d7ec6208954a0cb5f8bb793b912440753a","up":true},{"one":"957ed6194e6ef56e9696be43a1a0258f2ba4f48f56d790e42bd0663c3fc6aaae","other":"1929b01c0f85af7452a0f358b54f6b36640a196b366909172af594a1648fe64c","up":true},{"one":"5c623fa0103108d0b1e24e6d01a6624ce3b59a9e7c422c45dfc1211676785542","other":"4efaabab0d5dc59f098aee4dba3868263411a55615a2c474a73e6eec2211decc","up":true},{"one":"c52a68d8388a21013e4eecef9ea866db1f5eb16bbe0ecc82b8bfafd33e4e014f","other":"641a165f8be0eee36f53c12bae8e2a34a709adb8d1dcd667e88e4e90c9ee2401","up":true},{"one":"221cd8ea0a26f0d3f81f782f1de390282415ecd9cf40224b4945a00897895b4e","other":"2354d3af5c6dca05d7dc212b100112f37ab29fb8b3f4319887230a4d420f5d9d","up":true},{"one":"4a3c39f044c425c153d4900db30f839d7866c8e0f4f4d38d9205e67fb540988e","other":"4a373571475e2b4c280d2d4b22f10a249ee09fcf907f52081ec0398a8b5ea6f2","up":true},{"one":"1929b01c0f85af7452a0f358b54f6b36640a196b366909172af594a1648fe64c","other":"3e1959b29bbacb3ce7dccfa41c3e51b87f1afc700a3c6e4713c38cc0fe3790df","up":true},{"one":"37751f279493dc5ce5b5c3c55a6ec2e4119eedefe1069b283f6ff8c7bc9d1411","other":"13853407d278a45e15d4b148fc38ebb35c4f58ee552ee0e4401c6c98c45b8e3e","up":true},{"one":"4efaabab0d5dc59f098aee4dba3868263411a55615a2c474a73e6eec2211decc","other":"8fb8208b7167dd06cc08778b507ccd856751d3df6dfbaeac18b9f527b6628523","up":true},{"one":"01a63575c384f686e5739e1bd079e4a4c55421cd6d89b944e2c61dd174fa2bf6","other":"03eb2e92ed0923f696269e7a03fec731d8c3f8df278023a9cb00867b533a3ca3","up":true},{"one":"f33c07a818863a358358989ec71504abad3ca0a7c81b54aad59075a766fad501","other":"f177ee6767a78a57b725dbe67ec377f507f5777d345a28892b0fbfb800dc443a","up":true},{"one":"e06f58b144faa650f96465825d253b63d7e061e3a3c4228ad5e1b665afbccc37","other":"184e9e00ab4fe1669d4d99fb33d418d33eff927da38cc997f69679443c24b20b","up":true},{"one":"f3d50811ef10661d3ef9978077cd7181387298f306833ab6e27f25cbb77435cd","other":"8012a7af71d76d882202cf9372523478ccebea23443006c7f29c2a83106cd1b3","up":true},{"one":"4746379212b91ee1c13c1336e8f3a73a84408b7636c222c11bd27ce7d724e6c6","other":"0e344c6e27c23bd36bdd3ddcefa4e577fdc9461e52c7ce20135733a08b987b82","up":true},{"one":"fac808b79923931febd54e3611b79811b3973c777e7502bd56b9803d0c4bf785","other":"52b47d52bf4a1afda1604b7942019c8d2ac4c760c5eb4597e1ce2dd7a8e1cf4d","up":true},{"one":"4a373571475e2b4c280d2d4b22f10a249ee09fcf907f52081ec0398a8b5ea6f2","other":"7bcb0d7b9f84aed413cf9b2a7851ba6d1138d85382aa20e6c939a43c8e59c034","up":true},{"one":"dd92b3d42414fd5eff5c1e4ca55c63cd7036634049995b72a20cdf7ca1321978","other":"cc5fa2d49210e240983b0853ff15003f0d366f05cb1f6486bae2862cca852cc5","up":true},{"one":"4cc2386a86fd210bf699c6d93173b0879c3210d46f572a62bb154cb60a7d2cb1","other":"4d750666dc0e9e2c244c43492801c1d7ec6208954a0cb5f8bb793b912440753a","up":true},{"one":"17406dea5046f00e27eaf74e166a945c9485139d6edcdfcd84f5b03f50eedd0a","other":"69753865aacaaf72d9bf6d265c885d3f705804ff4b2675f7aa860641dacab2a0","up":true},{"one":"bde90aaa0f1f7a7eb965ff308718d29b55a80b1ca84dfba16c169eabe2b0d5de","other":"a1929f704664ca85d829ac3bab62e688647a7cfdcbc9f03c61b0124cf9093505","up":true},{"one":"4d750666dc0e9e2c244c43492801c1d7ec6208954a0cb5f8bb793b912440753a","other":"a9fa28117a4b6906b5ce3931573e0a19eec3cb4fcd9141be2d258a2be06f3b61","up":true},{"one":"62f007c92a8af466e90ed0b1e5e71a955ad273ec793948ddfc03977f131ed2d1","other":"3e1959b29bbacb3ce7dccfa41c3e51b87f1afc700a3c6e4713c38cc0fe3790df","up":true},{"one":"eb01ff80307afbfc7457c96594cd4ba4d00acb7fd25a7571d1223168bd66ff09","other":"7bee7967ff7b07243bed55b6d060d5ec2a1f28b530ed65cd055dc5b468a0f878","up":true},{"one":"f33c07a818863a358358989ec71504abad3ca0a7c81b54aad59075a766fad501","other":"7bcb0d7b9f84aed413cf9b2a7851ba6d1138d85382aa20e6c939a43c8e59c034","up":true},{"one":"5c623fa0103108d0b1e24e6d01a6624ce3b59a9e7c422c45dfc1211676785542","other":"f4a0f76b30bcf5987cfa3f4f4b0aa3445f39d60a1f51519fa660c27b5d833dde","up":true},{"one":"77eedcac0c847b1d693ddff07c5868afb1c2008b2dcb48a0299143ab14611969","other":"7a68fa44bbec187272e2d5dfbd6ed8af31a1a365aa72aa50db02350ebe98c859","up":true},{"one":"4a373571475e2b4c280d2d4b22f10a249ee09fcf907f52081ec0398a8b5ea6f2","other":"4c211c117e555c2ac831d5688615b6b4c5e31f1d7c7906b34f0cbcdbc45482b4","up":true},{"one":"dd92b3d42414fd5eff5c1e4ca55c63cd7036634049995b72a20cdf7ca1321978","other":"cabfdfb789cc20962eaba1dbe68d6dc0466e699d22dc5b29f27a5cd555398795","up":true},{"one":"bd486e1e15df4c7539b1ad5b54f7566dd4836a430e9f7d3503881fa79e258d9b","other":"aba793e635f71169105ad073225cc8db914de6b711fe9f22c5d94ac8cb85e2eb","up":true},{"one":"3590afcd10fb8f58c39f72068661d9a772b77e0efd57bbd60306632fb048fa3a","other":"21dcfb893a54cb56d21355fc564583057fc51b32503a8627e7575660725a7627","up":true},{"one":"6450bb5e880411abcb60258d8560949f6f70d92ba7bfa9a4d7845463c48dab30","other":"a9fa28117a4b6906b5ce3931573e0a19eec3cb4fcd9141be2d258a2be06f3b61","up":true},{"one":"fa655b4882579e65937a14ab1c6bcba021580f0a5ebc04c48424f5ae72b7d5b4","other":"f005a4d3453d52434f2b5be4006e653b50b52ad31926d654722fc3df00f1689c","up":true},{"one":"b3555baa764c4562935b93533ee6c5a6df631e846c3ab512fdb1d6b901a68c60","other":"a9fa28117a4b6906b5ce3931573e0a19eec3cb4fcd9141be2d258a2be06f3b61","up":true},{"one":"fa655b4882579e65937a14ab1c6bcba021580f0a5ebc04c48424f5ae72b7d5b4","other":"d125317b492df46a7dd496d30c6d07839ed6bfa196abde4886ce7bc8f9b5c01f","up":true},{"one":"0f3106adfe70aefb474c4a98a95932307391de2cb70fbd2e11dd31c9e695ed83","other":"0e344c6e27c23bd36bdd3ddcefa4e577fdc9461e52c7ce20135733a08b987b82","up":true},{"one":"77eedcac0c847b1d693ddff07c5868afb1c2008b2dcb48a0299143ab14611969","other":"03eb2e92ed0923f696269e7a03fec731d8c3f8df278023a9cb00867b533a3ca3","up":true},{"one":"bc29a0d9b60f3e2c34224cec187cf44eadc4628086d5594666ed025da71e7e7a","other":"a9fa28117a4b6906b5ce3931573e0a19eec3cb4fcd9141be2d258a2be06f3b61","up":true},{"one":"641a165f8be0eee36f53c12bae8e2a34a709adb8d1dcd667e88e4e90c9ee2401","other":"ce01234661309127bb872d69d38dc5bf19bc4de2e0a0b5041cd362d073df4ff8","up":true},{"one":"37751f279493dc5ce5b5c3c55a6ec2e4119eedefe1069b283f6ff8c7bc9d1411","other":"36d5952685c95e42bef14f77b63705897ca71d24d21e4e9efc772d9cabd21122","up":true},{"one":"c9ef56afed2d40db396ad39d6f5f5f38f4058b6b0d1e02b71d6aa92dbeaf7df7","other":"eceb7dc532596e8b68074113db9605e3d15cb15e2e80f75f1a66d95a1221c7dc","up":true},{"one":"f177ee6767a78a57b725dbe67ec377f507f5777d345a28892b0fbfb800dc443a","other":"ed2ec6681bf325887768703779ccf3a6278731118cd3ec890490a3de50f689ac","up":true},{"one":"68a63ebc4833dedfdb6d534438ffcccd042f60434bee0e39f4cb3726e7413e7a","other":"a9fa28117a4b6906b5ce3931573e0a19eec3cb4fcd9141be2d258a2be06f3b61","up":true},{"one":"1929b01c0f85af7452a0f358b54f6b36640a196b366909172af594a1648fe64c","other":"36d5952685c95e42bef14f77b63705897ca71d24d21e4e9efc772d9cabd21122","up":true},{"one":"4d750666dc0e9e2c244c43492801c1d7ec6208954a0cb5f8bb793b912440753a","other":"b4e29de4bd5751f31195ead8aa1548d305a53fb4f99be9931850e6273de8f359","up":true},{"one":"72a76f668d9b923914860eb4f8577bc98c153f6dd222cd36a0bbdef2bab7f068","other":"82847a4af4f50622650d035f69151b202bccd5fc92302a617602c974603ed997","up":true},{"one":"0f3106adfe70aefb474c4a98a95932307391de2cb70fbd2e11dd31c9e695ed83","other":"8d3e0d9c6932d3422024394998e943309b679d667394d0eb622f0e208e7fcf0a","up":true},{"one":"eb01ff80307afbfc7457c96594cd4ba4d00acb7fd25a7571d1223168bd66ff09","other":"c52a68d8388a21013e4eecef9ea866db1f5eb16bbe0ecc82b8bfafd33e4e014f","up":true},{"one":"27b56302a89605a83563ba7b66d491ec25edfad0ea1010937fcadeab4d3ae582","other":"184e9e00ab4fe1669d4d99fb33d418d33eff927da38cc997f69679443c24b20b","up":true},{"one":"bd486e1e15df4c7539b1ad5b54f7566dd4836a430e9f7d3503881fa79e258d9b","other":"a9fa28117a4b6906b5ce3931573e0a19eec3cb4fcd9141be2d258a2be06f3b61","up":true},{"one":"82847a4af4f50622650d035f69151b202bccd5fc92302a617602c974603ed997","other":"75e282c0f3d355a40573e6578c5aac98e7262970a9239f4dcefd26d6f008b553","up":true},{"one":"fa9a809f016097d949fa1463a1c8f08871c7d38e60b7df6d3e28ab04ccd3a143","other":"034de66774eda26b93e342c9b94b9deaeb6297650c819b144a5832bebfe6b02f","up":true},{"one":"4cc2386a86fd210bf699c6d93173b0879c3210d46f572a62bb154cb60a7d2cb1","other":"4a373571475e2b4c280d2d4b22f10a249ee09fcf907f52081ec0398a8b5ea6f2","up":true},{"one":"2dd4ad83effc3ba73e72f5659583e5987241bda563563200b50c46cce00a1d9b","other":"2354d3af5c6dca05d7dc212b100112f37ab29fb8b3f4319887230a4d420f5d9d","up":true},{"one":"4efaabab0d5dc59f098aee4dba3868263411a55615a2c474a73e6eec2211decc","other":"772a79302528fdce6a216c98c95e281333292c81dfe490aeaa4a78bfeb1980c8","up":true},{"one":"3590afcd10fb8f58c39f72068661d9a772b77e0efd57bbd60306632fb048fa3a","other":"0639f010834f5bc497798f2d275bbc60bfbcd53c83e38986b7260310c6001420","up":true},{"one":"221cd8ea0a26f0d3f81f782f1de390282415ecd9cf40224b4945a00897895b4e","other":"3590afcd10fb8f58c39f72068661d9a772b77e0efd57bbd60306632fb048fa3a","up":true},{"one":"957ed6194e6ef56e9696be43a1a0258f2ba4f48f56d790e42bd0663c3fc6aaae","other":"51c285489ff14628268ae886945e1cd2da64c6a0a8cb184aada98567ab429b6e","up":true},{"one":"947205fd85a17330a6d5c51a66548c5f69779c76ab12408f8fc6d33d7c6b8e9d","other":"8fb8208b7167dd06cc08778b507ccd856751d3df6dfbaeac18b9f527b6628523","up":true},{"one":"d23c97bebcde26f5e351c4b975c76aaf604fd206f9b9063ecbda538e7a52f514","other":"184e9e00ab4fe1669d4d99fb33d418d33eff927da38cc997f69679443c24b20b","up":true},{"one":"6379b4d611cdd6e360480c14b3f6784360f28f702b5a6f375eda4ef3bde7ef33","other":"73d0d1d4a2b7250f51e57c13cc48bc6b20682320ce12ee8e5765afeef7d9de42","up":true},{"one":"5008ef55ad8088f70643b0f93bcb479531bcb0afe8e01b215dbf8597ec866369","other":"55fdad03303a746920773217c568a37d2004869ff34096fbe45197f71eba2b63","up":true},{"one":"22bbb3236a5e0a1947a1c4735aaacf9122173789a02a06e7653103bdcae2f823","other":"2354d3af5c6dca05d7dc212b100112f37ab29fb8b3f4319887230a4d420f5d9d","up":true},{"one":"75e282c0f3d355a40573e6578c5aac98e7262970a9239f4dcefd26d6f008b553","other":"7bee7967ff7b07243bed55b6d060d5ec2a1f28b530ed65cd055dc5b468a0f878","up":true},{"one":"fa9a809f016097d949fa1463a1c8f08871c7d38e60b7df6d3e28ab04ccd3a143","other":"deec6a8beb4e5e441dd42311354194c3bef9448e8859b4ccd401645b69217d12","up":true},{"one":"acf888ed781f5358493e2e5048691acc39eac3240ca9e9093bb4052b1f624325","other":"a1929f704664ca85d829ac3bab62e688647a7cfdcbc9f03c61b0124cf9093505","up":true},{"one":"6379b4d611cdd6e360480c14b3f6784360f28f702b5a6f375eda4ef3bde7ef33","other":"6daaf515999c9a3491c963f76be82ed6005616bf7ba98247b01d6a89a9af1d71","up":true},{"one":"efd68d2c99346ca085c9ef896bee6125ad8638413295108f3a92b247a41ca629","other":"f4a0f76b30bcf5987cfa3f4f4b0aa3445f39d60a1f51519fa660c27b5d833dde","up":true},{"one":"c0adf394af7d5670c1ce8c6bea292fbc03c56ae2b636e2f303311a455bb3500f","other":"7bee7967ff7b07243bed55b6d060d5ec2a1f28b530ed65cd055dc5b468a0f878","up":true},{"one":"ea3d6aa50ad5a1d5647d213f9b5cfe6718339eec7eef8644487eb3c223c7bcde","other":"e06f58b144faa650f96465825d253b63d7e061e3a3c4228ad5e1b665afbccc37","up":true},{"one":"5be6df23201fc5c00be650849c8bfe5581e44033ef19012836f97c98f3954471","other":"13853407d278a45e15d4b148fc38ebb35c4f58ee552ee0e4401c6c98c45b8e3e","up":true},{"one":"947205fd85a17330a6d5c51a66548c5f69779c76ab12408f8fc6d33d7c6b8e9d","other":"957ed6194e6ef56e9696be43a1a0258f2ba4f48f56d790e42bd0663c3fc6aaae","up":true},{"one":"221cd8ea0a26f0d3f81f782f1de390282415ecd9cf40224b4945a00897895b4e","other":"2d531c50183f0115269b3feaecf45927a3ac44e1be2a263c7e5d2274d8379b1c","up":true},{"one":"47753fdca855ea79abf667b50aa9c90a132d44bdd1572c3e3c411c8ee7e5b5f4","other":"4bc8dfbf84794d26d7a573c9d898974eaa3a2167e19cb7a8aa460807a603acd4","up":true},{"one":"0a215c7765be2caebf76ad3e8017bbc2aaadf8e0dd4859af781953a0564c5d59","other":"72a53f0fb1b51855cb4054a39cbd1309a76a862d36e18af9ba0456a60325c06e","up":true},{"one":"2471776037d55a05df2b15bcefe52cb1f4c942e9e15113abc2a0c1fcbaa5d626","other":"2354d3af5c6dca05d7dc212b100112f37ab29fb8b3f4319887230a4d420f5d9d","up":true},{"one":"641a165f8be0eee36f53c12bae8e2a34a709adb8d1dcd667e88e4e90c9ee2401","other":"772a79302528fdce6a216c98c95e281333292c81dfe490aeaa4a78bfeb1980c8","up":true},{"one":"73d0d1d4a2b7250f51e57c13cc48bc6b20682320ce12ee8e5765afeef7d9de42","other":"947205fd85a17330a6d5c51a66548c5f69779c76ab12408f8fc6d33d7c6b8e9d","up":true},{"one":"4746379212b91ee1c13c1336e8f3a73a84408b7636c222c11bd27ce7d724e6c6","other":"0a215c7765be2caebf76ad3e8017bbc2aaadf8e0dd4859af781953a0564c5d59","up":true},{"one":"8b35236da99930bf8f5ef6c7555bb18b80ce2e34361bbbfd6baf55a6483e54ff","other":"957ed6194e6ef56e9696be43a1a0258f2ba4f48f56d790e42bd0663c3fc6aaae","up":true},{"one":"36d5952685c95e42bef14f77b63705897ca71d24d21e4e9efc772d9cabd21122","other":"e06f58b144faa650f96465825d253b63d7e061e3a3c4228ad5e1b665afbccc37","up":true},{"one":"0e344c6e27c23bd36bdd3ddcefa4e577fdc9461e52c7ce20135733a08b987b82","other":"03eb2e92ed0923f696269e7a03fec731d8c3f8df278023a9cb00867b533a3ca3","up":true},{"one":"73d0d1d4a2b7250f51e57c13cc48bc6b20682320ce12ee8e5765afeef7d9de42","other":"8d3e0d9c6932d3422024394998e943309b679d667394d0eb622f0e208e7fcf0a","up":true},{"one":"127c89eae94b195df2eb5eb7b44f634adb73c114d2089cd904b56988c8674e11","other":"836e65dfe6f01e1d2934655c1846cb86fed6e41ea951a109d7a20bb14cb4c10a","up":true},{"one":"034de66774eda26b93e342c9b94b9deaeb6297650c819b144a5832bebfe6b02f","other":"f005a4d3453d52434f2b5be4006e653b50b52ad31926d654722fc3df00f1689c","up":true},{"one":"d23c97bebcde26f5e351c4b975c76aaf604fd206f9b9063ecbda538e7a52f514","other":"1929b01c0f85af7452a0f358b54f6b36640a196b366909172af594a1648fe64c","up":true},{"one":"deec6a8beb4e5e441dd42311354194c3bef9448e8859b4ccd401645b69217d12","other":"fac808b79923931febd54e3611b79811b3973c777e7502bd56b9803d0c4bf785","up":true},{"one":"ed2ec6681bf325887768703779ccf3a6278731118cd3ec890490a3de50f689ac","other":"d18a1edd26661069fb401fee8aa85a9614a3188e2e0666bfe9307f91d29aad49","up":true},{"one":"51c285489ff14628268ae886945e1cd2da64c6a0a8cb184aada98567ab429b6e","other":"52b47d52bf4a1afda1604b7942019c8d2ac4c760c5eb4597e1ce2dd7a8e1cf4d","up":true},{"one":"4a373571475e2b4c280d2d4b22f10a249ee09fcf907f52081ec0398a8b5ea6f2","other":"4bc8dfbf84794d26d7a573c9d898974eaa3a2167e19cb7a8aa460807a603acd4","up":true},{"one":"672a566c7c2aeb1d91e6ee4e43984050df8b9560d923d60dc1fb23fb73b1a046","other":"4746379212b91ee1c13c1336e8f3a73a84408b7636c222c11bd27ce7d724e6c6","up":true},{"one":"ed12c78e700bf805669c48a5d62f1e56791263c4b2ce5bd34587ea9bc931a3e5","other":"cabfdfb789cc20962eaba1dbe68d6dc0466e699d22dc5b29f27a5cd555398795","up":true},{"one":"8b35236da99930bf8f5ef6c7555bb18b80ce2e34361bbbfd6baf55a6483e54ff","other":"b5fc43e8c0df3279d6a12cd8b03012cb8d2205208324018c7ae725745a99a2f3","up":true},{"one":"aba793e635f71169105ad073225cc8db914de6b711fe9f22c5d94ac8cb85e2eb","other":"eceb7dc532596e8b68074113db9605e3d15cb15e2e80f75f1a66d95a1221c7dc","up":true},{"one":"d18a1edd26661069fb401fee8aa85a9614a3188e2e0666bfe9307f91d29aad49","other":"ed12c78e700bf805669c48a5d62f1e56791263c4b2ce5bd34587ea9bc931a3e5","up":true},{"one":"221cd8ea0a26f0d3f81f782f1de390282415ecd9cf40224b4945a00897895b4e","other":"22bbb3236a5e0a1947a1c4735aaacf9122173789a02a06e7653103bdcae2f823","up":true},{"one":"bde90aaa0f1f7a7eb965ff308718d29b55a80b1ca84dfba16c169eabe2b0d5de","other":"a9fa28117a4b6906b5ce3931573e0a19eec3cb4fcd9141be2d258a2be06f3b61","up":true},{"one":"fa9a809f016097d949fa1463a1c8f08871c7d38e60b7df6d3e28ab04ccd3a143","other":"fac808b79923931febd54e3611b79811b3973c777e7502bd56b9803d0c4bf785","up":true},{"one":"5c623fa0103108d0b1e24e6d01a6624ce3b59a9e7c422c45dfc1211676785542","other":"4bc8dfbf84794d26d7a573c9d898974eaa3a2167e19cb7a8aa460807a603acd4","up":true},{"one":"52b47d52bf4a1afda1604b7942019c8d2ac4c760c5eb4597e1ce2dd7a8e1cf4d","other":"75e282c0f3d355a40573e6578c5aac98e7262970a9239f4dcefd26d6f008b553","up":true},{"one":"c0adf394af7d5670c1ce8c6bea292fbc03c56ae2b636e2f303311a455bb3500f","other":"b4e29de4bd5751f31195ead8aa1548d305a53fb4f99be9931850e6273de8f359","up":true},{"one":"b9d906e406b0fc6078c22bbc173043df1f7581061b4f6ccd769bc568d94b4339","other":"b5fc43e8c0df3279d6a12cd8b03012cb8d2205208324018c7ae725745a99a2f3","up":true},{"one":"08077c0ce8d4130c14464493e9164a8bae61b4646b1ec48899e75f2f6f9b8c66","other":"0f3106adfe70aefb474c4a98a95932307391de2cb70fbd2e11dd31c9e695ed83","up":true},{"one":"27db66d13ee8168aca89786febd6971dd1d6c554bca8501052065cb47631560d","other":"4a373571475e2b4c280d2d4b22f10a249ee09fcf907f52081ec0398a8b5ea6f2","up":true},{"one":"c2f9b4abed9c6a839fe4c03a80bd396fd187a8784ba47a83687d3a54b7e2eddf","other":"d9d30b9b212bd4811a44ebe304ba3935ead3abe3247f99893faf65664131c29d","up":true},{"one":"f33c07a818863a358358989ec71504abad3ca0a7c81b54aad59075a766fad501","other":"cc9f65d734f1a3bbc6019e166fe355bd7fc33bb4887043a5ccf532a9ba356379","up":true},{"one":"27b56302a89605a83563ba7b66d491ec25edfad0ea1010937fcadeab4d3ae582","other":"2354d3af5c6dca05d7dc212b100112f37ab29fb8b3f4319887230a4d420f5d9d","up":true},{"one":"672a566c7c2aeb1d91e6ee4e43984050df8b9560d923d60dc1fb23fb73b1a046","other":"45895aff674079f6be02e4cc74914d63125c3fe48bb69056c070c71319fea1fa","up":true},{"one":"bde90aaa0f1f7a7eb965ff308718d29b55a80b1ca84dfba16c169eabe2b0d5de","other":"a86117147b78f20a6d883d37715da85178cad89eff650a74aa89e7bc11bc45a7","up":true},{"one":"acf888ed781f5358493e2e5048691acc39eac3240ca9e9093bb4052b1f624325","other":"73d0d1d4a2b7250f51e57c13cc48bc6b20682320ce12ee8e5765afeef7d9de42","up":true},{"one":"aba793e635f71169105ad073225cc8db914de6b711fe9f22c5d94ac8cb85e2eb","other":"a86117147b78f20a6d883d37715da85178cad89eff650a74aa89e7bc11bc45a7","up":true},{"one":"7bee7967ff7b07243bed55b6d060d5ec2a1f28b530ed65cd055dc5b468a0f878","other":"947205fd85a17330a6d5c51a66548c5f69779c76ab12408f8fc6d33d7c6b8e9d","up":true},{"one":"4d750666dc0e9e2c244c43492801c1d7ec6208954a0cb5f8bb793b912440753a","other":"bc29a0d9b60f3e2c34224cec187cf44eadc4628086d5594666ed025da71e7e7a","up":true},{"one":"7bcb0d7b9f84aed413cf9b2a7851ba6d1138d85382aa20e6c939a43c8e59c034","other":"f611d8039385ad56260ab391763e3627aadd2756565fedc3ec95f76124da0efc","up":true},{"one":"c0adf394af7d5670c1ce8c6bea292fbc03c56ae2b636e2f303311a455bb3500f","other":"a9fa28117a4b6906b5ce3931573e0a19eec3cb4fcd9141be2d258a2be06f3b61","up":true},{"one":"3b830c2ae5463ca2f2260176b77b8dda23048257aa780255c69cf1bbbc6fb64c","other":"3871492c8c62cd74cbe65a993669e4978cc641879a5223dd6b9e687f050a1c40","up":true},{"one":"8b35236da99930bf8f5ef6c7555bb18b80ce2e34361bbbfd6baf55a6483e54ff","other":"0639f010834f5bc497798f2d275bbc60bfbcd53c83e38986b7260310c6001420","up":true},{"one":"bc71f3e409edb989e26607448491530c5451053b582ea64d882525451ac940bb","other":"bd9607d5f57f7b6f74f4ad981be368988ef48b5f31e3fd96cab3bb790d568150","up":true},{"one":"68a63ebc4833dedfdb6d534438ffcccd042f60434bee0e39f4cb3726e7413e7a","other":"a86117147b78f20a6d883d37715da85178cad89eff650a74aa89e7bc11bc45a7","up":true},{"one":"ee2b0aff61a9846d13de3a72712ef0bf3ca42ad8da57e81759c242797258efec","other":"7bee7967ff7b07243bed55b6d060d5ec2a1f28b530ed65cd055dc5b468a0f878","up":true},{"one":"2d531c50183f0115269b3feaecf45927a3ac44e1be2a263c7e5d2274d8379b1c","other":"2dd4ad83effc3ba73e72f5659583e5987241bda563563200b50c46cce00a1d9b","up":true},{"one":"f611d8039385ad56260ab391763e3627aadd2756565fedc3ec95f76124da0efc","other":"8fb8208b7167dd06cc08778b507ccd856751d3df6dfbaeac18b9f527b6628523","up":true},{"one":"b8695bec6c8e1e6794bb943b83629cd2c910067e6e178f6f8e33c4f0fa2d74f4","other":"bddbdff3cbd22fcedddc07de27125819aac72be72c3126ba898621c496cb95a2","up":true},{"one":"4d750666dc0e9e2c244c43492801c1d7ec6208954a0cb5f8bb793b912440753a","other":"b3555baa764c4562935b93533ee6c5a6df631e846c3ab512fdb1d6b901a68c60","up":true},{"one":"bc29a0d9b60f3e2c34224cec187cf44eadc4628086d5594666ed025da71e7e7a","other":"b4e29de4bd5751f31195ead8aa1548d305a53fb4f99be9931850e6273de8f359","up":true},{"one":"4a3c39f044c425c153d4900db30f839d7866c8e0f4f4d38d9205e67fb540988e","other":"f005a4d3453d52434f2b5be4006e653b50b52ad31926d654722fc3df00f1689c","up":true},{"one":"27db66d13ee8168aca89786febd6971dd1d6c554bca8501052065cb47631560d","other":"4bc8dfbf84794d26d7a573c9d898974eaa3a2167e19cb7a8aa460807a603acd4","up":true},{"one":"bc29a0d9b60f3e2c34224cec187cf44eadc4628086d5594666ed025da71e7e7a","other":"b3555baa764c4562935b93533ee6c5a6df631e846c3ab512fdb1d6b901a68c60","up":true},{"one":"68a63ebc4833dedfdb6d534438ffcccd042f60434bee0e39f4cb3726e7413e7a","other":"03eb2e92ed0923f696269e7a03fec731d8c3f8df278023a9cb00867b533a3ca3","up":true},{"one":"5c623fa0103108d0b1e24e6d01a6624ce3b59a9e7c422c45dfc1211676785542","other":"4a373571475e2b4c280d2d4b22f10a249ee09fcf907f52081ec0398a8b5ea6f2","up":true},{"one":"be0fb2b440b91e719c20f51b673eb9f2f66c7af77b0b0ade312998cdffcc5045","other":"bc29a0d9b60f3e2c34224cec187cf44eadc4628086d5594666ed025da71e7e7a","up":true},{"one":"836e65dfe6f01e1d2934655c1846cb86fed6e41ea951a109d7a20bb14cb4c10a","other":"69753865aacaaf72d9bf6d265c885d3f705804ff4b2675f7aa860641dacab2a0","up":true},{"one":"5008ef55ad8088f70643b0f93bcb479531bcb0afe8e01b215dbf8597ec866369","other":"75e282c0f3d355a40573e6578c5aac98e7262970a9239f4dcefd26d6f008b553","up":true},{"one":"6450bb5e880411abcb60258d8560949f6f70d92ba7bfa9a4d7845463c48dab30","other":"a1929f704664ca85d829ac3bab62e688647a7cfdcbc9f03c61b0124cf9093505","up":true},{"one":"f33c07a818863a358358989ec71504abad3ca0a7c81b54aad59075a766fad501","other":"c9ef56afed2d40db396ad39d6f5f5f38f4058b6b0d1e02b71d6aa92dbeaf7df7","up":true},{"one":"4746379212b91ee1c13c1336e8f3a73a84408b7636c222c11bd27ce7d724e6c6","other":"127c89eae94b195df2eb5eb7b44f634adb73c114d2089cd904b56988c8674e11","up":true},{"one":"0a215c7765be2caebf76ad3e8017bbc2aaadf8e0dd4859af781953a0564c5d59","other":"08077c0ce8d4130c14464493e9164a8bae61b4646b1ec48899e75f2f6f9b8c66","up":true},{"one":"f611d8039385ad56260ab391763e3627aadd2756565fedc3ec95f76124da0efc","other":"a1929f704664ca85d829ac3bab62e688647a7cfdcbc9f03c61b0124cf9093505","up":true},{"one":"52b47d52bf4a1afda1604b7942019c8d2ac4c760c5eb4597e1ce2dd7a8e1cf4d","other":"4efaabab0d5dc59f098aee4dba3868263411a55615a2c474a73e6eec2211decc","up":true},{"one":"0a215c7765be2caebf76ad3e8017bbc2aaadf8e0dd4859af781953a0564c5d59","other":"0f3106adfe70aefb474c4a98a95932307391de2cb70fbd2e11dd31c9e695ed83","up":true},{"one":"d125317b492df46a7dd496d30c6d07839ed6bfa196abde4886ce7bc8f9b5c01f","other":"dd92b3d42414fd5eff5c1e4ca55c63cd7036634049995b72a20cdf7ca1321978","up":true},{"one":"eb01ff80307afbfc7457c96594cd4ba4d00acb7fd25a7571d1223168bd66ff09","other":"75e282c0f3d355a40573e6578c5aac98e7262970a9239f4dcefd26d6f008b553","up":true},{"one":"8fb8208b7167dd06cc08778b507ccd856751d3df6dfbaeac18b9f527b6628523","other":"4c211c117e555c2ac831d5688615b6b4c5e31f1d7c7906b34f0cbcdbc45482b4","up":true},{"one":"c2f9b4abed9c6a839fe4c03a80bd396fd187a8784ba47a83687d3a54b7e2eddf","other":"cc5fa2d49210e240983b0853ff15003f0d366f05cb1f6486bae2862cca852cc5","up":true},{"one":"0a215c7765be2caebf76ad3e8017bbc2aaadf8e0dd4859af781953a0564c5d59","other":"75e282c0f3d355a40573e6578c5aac98e7262970a9239f4dcefd26d6f008b553","up":true},{"one":"27b56302a89605a83563ba7b66d491ec25edfad0ea1010937fcadeab4d3ae582","other":"3e1959b29bbacb3ce7dccfa41c3e51b87f1afc700a3c6e4713c38cc0fe3790df","up":true},{"one":"6daaf515999c9a3491c963f76be82ed6005616bf7ba98247b01d6a89a9af1d71","other":"6450bb5e880411abcb60258d8560949f6f70d92ba7bfa9a4d7845463c48dab30","up":true},{"one":"ed12c78e700bf805669c48a5d62f1e56791263c4b2ce5bd34587ea9bc931a3e5","other":"cc5fa2d49210e240983b0853ff15003f0d366f05cb1f6486bae2862cca852cc5","up":true},{"one":"deec6a8beb4e5e441dd42311354194c3bef9448e8859b4ccd401645b69217d12","other":"f611d8039385ad56260ab391763e3627aadd2756565fedc3ec95f76124da0efc","up":true},{"one":"52b47d52bf4a1afda1604b7942019c8d2ac4c760c5eb4597e1ce2dd7a8e1cf4d","other":"4d750666dc0e9e2c244c43492801c1d7ec6208954a0cb5f8bb793b912440753a","up":true},{"one":"3b830c2ae5463ca2f2260176b77b8dda23048257aa780255c69cf1bbbc6fb64c","other":"2dd4ad83effc3ba73e72f5659583e5987241bda563563200b50c46cce00a1d9b","up":true},{"one":"bd486e1e15df4c7539b1ad5b54f7566dd4836a430e9f7d3503881fa79e258d9b","other":"b4e29de4bd5751f31195ead8aa1548d305a53fb4f99be9931850e6273de8f359","up":true},{"one":"ee2b0aff61a9846d13de3a72712ef0bf3ca42ad8da57e81759c242797258efec","other":"efd68d2c99346ca085c9ef896bee6125ad8638413295108f3a92b247a41ca629","up":true},{"one":"acf888ed781f5358493e2e5048691acc39eac3240ca9e9093bb4052b1f624325","other":"aedc9b478204effdcbad1a892333f15c061fbd1423b370f8a50f929b2a2f6952","up":true},{"one":"b8695bec6c8e1e6794bb943b83629cd2c910067e6e178f6f8e33c4f0fa2d74f4","other":"b9d906e406b0fc6078c22bbc173043df1f7581061b4f6ccd769bc568d94b4339","up":true},{"one":"4cc2386a86fd210bf699c6d93173b0879c3210d46f572a62bb154cb60a7d2cb1","other":"4c211c117e555c2ac831d5688615b6b4c5e31f1d7c7906b34f0cbcdbc45482b4","up":true},{"one":"ed12c78e700bf805669c48a5d62f1e56791263c4b2ce5bd34587ea9bc931a3e5","other":"ee2b0aff61a9846d13de3a72712ef0bf3ca42ad8da57e81759c242797258efec","up":true},{"one":"2d531c50183f0115269b3feaecf45927a3ac44e1be2a263c7e5d2274d8379b1c","other":"e06f58b144faa650f96465825d253b63d7e061e3a3c4228ad5e1b665afbccc37","up":true},{"one":"3e1959b29bbacb3ce7dccfa41c3e51b87f1afc700a3c6e4713c38cc0fe3790df","other":"e06f58b144faa650f96465825d253b63d7e061e3a3c4228ad5e1b665afbccc37","up":true},{"one":"37751f279493dc5ce5b5c3c55a6ec2e4119eedefe1069b283f6ff8c7bc9d1411","other":"0639f010834f5bc497798f2d275bbc60bfbcd53c83e38986b7260310c6001420","up":true},{"one":"5c623fa0103108d0b1e24e6d01a6624ce3b59a9e7c422c45dfc1211676785542","other":"957ed6194e6ef56e9696be43a1a0258f2ba4f48f56d790e42bd0663c3fc6aaae","up":true},{"one":"eceb7dc532596e8b68074113db9605e3d15cb15e2e80f75f1a66d95a1221c7dc","other":"ee2b0aff61a9846d13de3a72712ef0bf3ca42ad8da57e81759c242797258efec","up":true},{"one":"be0fb2b440b91e719c20f51b673eb9f2f66c7af77b0b0ade312998cdffcc5045","other":"01a63575c384f686e5739e1bd079e4a4c55421cd6d89b944e2c61dd174fa2bf6","up":true},{"one":"68a63ebc4833dedfdb6d534438ffcccd042f60434bee0e39f4cb3726e7413e7a","other":"acf888ed781f5358493e2e5048691acc39eac3240ca9e9093bb4052b1f624325","up":true},{"one":"5a8ba4047c4456e825bd1b34c961f5c7f37bf7c27bc48bee71b8430c7d135486","other":"5c623fa0103108d0b1e24e6d01a6624ce3b59a9e7c422c45dfc1211676785542","up":true},{"one":"672a566c7c2aeb1d91e6ee4e43984050df8b9560d923d60dc1fb23fb73b1a046","other":"72a53f0fb1b51855cb4054a39cbd1309a76a862d36e18af9ba0456a60325c06e","up":true},{"one":"ee2b0aff61a9846d13de3a72712ef0bf3ca42ad8da57e81759c242797258efec","other":"72a53f0fb1b51855cb4054a39cbd1309a76a862d36e18af9ba0456a60325c06e","up":true},{"one":"d23c97bebcde26f5e351c4b975c76aaf604fd206f9b9063ecbda538e7a52f514","other":"36d5952685c95e42bef14f77b63705897ca71d24d21e4e9efc772d9cabd21122","up":true},{"one":"1929b01c0f85af7452a0f358b54f6b36640a196b366909172af594a1648fe64c","other":"3871492c8c62cd74cbe65a993669e4978cc641879a5223dd6b9e687f050a1c40","up":true},{"one":"fa9a809f016097d949fa1463a1c8f08871c7d38e60b7df6d3e28ab04ccd3a143","other":"efd68d2c99346ca085c9ef896bee6125ad8638413295108f3a92b247a41ca629","up":true},{"one":"f177ee6767a78a57b725dbe67ec377f507f5777d345a28892b0fbfb800dc443a","other":"fa655b4882579e65937a14ab1c6bcba021580f0a5ebc04c48424f5ae72b7d5b4","up":true},{"one":"eb01ff80307afbfc7457c96594cd4ba4d00acb7fd25a7571d1223168bd66ff09","other":"72a76f668d9b923914860eb4f8577bc98c153f6dd222cd36a0bbdef2bab7f068","up":true},{"one":"4d750666dc0e9e2c244c43492801c1d7ec6208954a0cb5f8bb793b912440753a","other":"fac808b79923931febd54e3611b79811b3973c777e7502bd56b9803d0c4bf785","up":true},{"one":"c0adf394af7d5670c1ce8c6bea292fbc03c56ae2b636e2f303311a455bb3500f","other":"75e282c0f3d355a40573e6578c5aac98e7262970a9239f4dcefd26d6f008b553","up":true},{"one":"672a566c7c2aeb1d91e6ee4e43984050df8b9560d923d60dc1fb23fb73b1a046","other":"62f007c92a8af466e90ed0b1e5e71a955ad273ec793948ddfc03977f131ed2d1","up":true},{"one":"5c623fa0103108d0b1e24e6d01a6624ce3b59a9e7c422c45dfc1211676785542","other":"8fb8208b7167dd06cc08778b507ccd856751d3df6dfbaeac18b9f527b6628523","up":true},{"one":"1929b01c0f85af7452a0f358b54f6b36640a196b366909172af594a1648fe64c","other":"216e0370111e2e03927b803ae788f9947de8e241d41dbf6a70983cf0ecd68af1","up":true},{"one":"1929b01c0f85af7452a0f358b54f6b36640a196b366909172af594a1648fe64c","other":"7bee7967ff7b07243bed55b6d060d5ec2a1f28b530ed65cd055dc5b468a0f878","up":true},{"one":"221cd8ea0a26f0d3f81f782f1de390282415ecd9cf40224b4945a00897895b4e","other":"1929b01c0f85af7452a0f358b54f6b36640a196b366909172af594a1648fe64c","up":true},{"one":"6450bb5e880411abcb60258d8560949f6f70d92ba7bfa9a4d7845463c48dab30","other":"b5fc43e8c0df3279d6a12cd8b03012cb8d2205208324018c7ae725745a99a2f3","up":true},{"one":"13853407d278a45e15d4b148fc38ebb35c4f58ee552ee0e4401c6c98c45b8e3e","other":"0f3106adfe70aefb474c4a98a95932307391de2cb70fbd2e11dd31c9e695ed83","up":true},{"one":"dd92b3d42414fd5eff5c1e4ca55c63cd7036634049995b72a20cdf7ca1321978","other":"ce01234661309127bb872d69d38dc5bf19bc4de2e0a0b5041cd362d073df4ff8","up":true},{"one":"d125317b492df46a7dd496d30c6d07839ed6bfa196abde4886ce7bc8f9b5c01f","other":"a9fa28117a4b6906b5ce3931573e0a19eec3cb4fcd9141be2d258a2be06f3b61","up":true},{"one":"fa9a809f016097d949fa1463a1c8f08871c7d38e60b7df6d3e28ab04ccd3a143","other":"03eb2e92ed0923f696269e7a03fec731d8c3f8df278023a9cb00867b533a3ca3","up":true},{"one":"4746379212b91ee1c13c1336e8f3a73a84408b7636c222c11bd27ce7d724e6c6","other":"47753fdca855ea79abf667b50aa9c90a132d44bdd1572c3e3c411c8ee7e5b5f4","up":true},{"one":"4746379212b91ee1c13c1336e8f3a73a84408b7636c222c11bd27ce7d724e6c6","other":"f4a0f76b30bcf5987cfa3f4f4b0aa3445f39d60a1f51519fa660c27b5d833dde","up":true},{"one":"4cc2386a86fd210bf699c6d93173b0879c3210d46f572a62bb154cb60a7d2cb1","other":"4efaabab0d5dc59f098aee4dba3868263411a55615a2c474a73e6eec2211decc","up":true},{"one":"bc71f3e409edb989e26607448491530c5451053b582ea64d882525451ac940bb","other":"bde90aaa0f1f7a7eb965ff308718d29b55a80b1ca84dfba16c169eabe2b0d5de","up":true},{"one":"fa9a809f016097d949fa1463a1c8f08871c7d38e60b7df6d3e28ab04ccd3a143","other":"772a79302528fdce6a216c98c95e281333292c81dfe490aeaa4a78bfeb1980c8","up":true},{"one":"68a63ebc4833dedfdb6d534438ffcccd042f60434bee0e39f4cb3726e7413e7a","other":"b9d906e406b0fc6078c22bbc173043df1f7581061b4f6ccd769bc568d94b4339","up":true},{"one":"d125317b492df46a7dd496d30c6d07839ed6bfa196abde4886ce7bc8f9b5c01f","other":"cabfdfb789cc20962eaba1dbe68d6dc0466e699d22dc5b29f27a5cd555398795","up":true},{"one":"8b35236da99930bf8f5ef6c7555bb18b80ce2e34361bbbfd6baf55a6483e54ff","other":"034de66774eda26b93e342c9b94b9deaeb6297650c819b144a5832bebfe6b02f","up":true},{"one":"aba793e635f71169105ad073225cc8db914de6b711fe9f22c5d94ac8cb85e2eb","other":"f611d8039385ad56260ab391763e3627aadd2756565fedc3ec95f76124da0efc","up":true},{"one":"13853407d278a45e15d4b148fc38ebb35c4f58ee552ee0e4401c6c98c45b8e3e","other":"08077c0ce8d4130c14464493e9164a8bae61b4646b1ec48899e75f2f6f9b8c66","up":true},{"one":"27b56302a89605a83563ba7b66d491ec25edfad0ea1010937fcadeab4d3ae582","other":"64e642de2667a7563c774050d368858d99aff433efbd1cb68361e3e244629b03","up":true},{"one":"77eedcac0c847b1d693ddff07c5868afb1c2008b2dcb48a0299143ab14611969","other":"13853407d278a45e15d4b148fc38ebb35c4f58ee552ee0e4401c6c98c45b8e3e","up":true},{"one":"672a566c7c2aeb1d91e6ee4e43984050df8b9560d923d60dc1fb23fb73b1a046","other":"641a165f8be0eee36f53c12bae8e2a34a709adb8d1dcd667e88e4e90c9ee2401","up":true},{"one":"5a8ba4047c4456e825bd1b34c961f5c7f37bf7c27bc48bee71b8430c7d135486","other":"58a90b58858417a4e972626421ed8e78b1b3e5ac69fcedd22c58a8ab4c6147df","up":true},{"one":"c0adf394af7d5670c1ce8c6bea292fbc03c56ae2b636e2f303311a455bb3500f","other":"c9ef56afed2d40db396ad39d6f5f5f38f4058b6b0d1e02b71d6aa92dbeaf7df7","up":true},{"one":"ed2ec6681bf325887768703779ccf3a6278731118cd3ec890490a3de50f689ac","other":"cc9f65d734f1a3bbc6019e166fe355bd7fc33bb4887043a5ccf532a9ba356379","up":true},{"one":"b2453c6e755a30efb91194fa607b3352d75b6905c448b09af4aeadf3a445b633","other":"55fdad03303a746920773217c568a37d2004869ff34096fbe45197f71eba2b63","up":true},{"one":"221cd8ea0a26f0d3f81f782f1de390282415ecd9cf40224b4945a00897895b4e","other":"17406dea5046f00e27eaf74e166a945c9485139d6edcdfcd84f5b03f50eedd0a","up":true},{"one":"4746379212b91ee1c13c1336e8f3a73a84408b7636c222c11bd27ce7d724e6c6","other":"1929b01c0f85af7452a0f358b54f6b36640a196b366909172af594a1648fe64c","up":true},{"one":"b8695bec6c8e1e6794bb943b83629cd2c910067e6e178f6f8e33c4f0fa2d74f4","other":"a86117147b78f20a6d883d37715da85178cad89eff650a74aa89e7bc11bc45a7","up":true},{"one":"c2f9b4abed9c6a839fe4c03a80bd396fd187a8784ba47a83687d3a54b7e2eddf","other":"c0adf394af7d5670c1ce8c6bea292fbc03c56ae2b636e2f303311a455bb3500f","up":true},{"one":"fa655b4882579e65937a14ab1c6bcba021580f0a5ebc04c48424f5ae72b7d5b4","other":"eceb7dc532596e8b68074113db9605e3d15cb15e2e80f75f1a66d95a1221c7dc","up":true},{"one":"acf888ed781f5358493e2e5048691acc39eac3240ca9e9093bb4052b1f624325","other":"b2453c6e755a30efb91194fa607b3352d75b6905c448b09af4aeadf3a445b633","up":true},{"one":"2471776037d55a05df2b15bcefe52cb1f4c942e9e15113abc2a0c1fcbaa5d626","other":"957ed6194e6ef56e9696be43a1a0258f2ba4f48f56d790e42bd0663c3fc6aaae","up":true},{"one":"f611d8039385ad56260ab391763e3627aadd2756565fedc3ec95f76124da0efc","other":"8330e2b8ae2f184bb8dc5e153fafa4dafe86f84ec692d3ee91413cc07b1cd9e2","up":true},{"one":"f611d8039385ad56260ab391763e3627aadd2756565fedc3ec95f76124da0efc","other":"82847a4af4f50622650d035f69151b202bccd5fc92302a617602c974603ed997","up":true},{"one":"c0adf394af7d5670c1ce8c6bea292fbc03c56ae2b636e2f303311a455bb3500f","other":"cc5fa2d49210e240983b0853ff15003f0d366f05cb1f6486bae2862cca852cc5","up":true},{"one":"0a215c7765be2caebf76ad3e8017bbc2aaadf8e0dd4859af781953a0564c5d59","other":"64e642de2667a7563c774050d368858d99aff433efbd1cb68361e3e244629b03","up":true},{"one":"f177ee6767a78a57b725dbe67ec377f507f5777d345a28892b0fbfb800dc443a","other":"ed12c78e700bf805669c48a5d62f1e56791263c4b2ce5bd34587ea9bc931a3e5","up":true},{"one":"672a566c7c2aeb1d91e6ee4e43984050df8b9560d923d60dc1fb23fb73b1a046","other":"6379b4d611cdd6e360480c14b3f6784360f28f702b5a6f375eda4ef3bde7ef33","up":true},{"one":"bd486e1e15df4c7539b1ad5b54f7566dd4836a430e9f7d3503881fa79e258d9b","other":"acf888ed781f5358493e2e5048691acc39eac3240ca9e9093bb4052b1f624325","up":true},{"one":"fa9a809f016097d949fa1463a1c8f08871c7d38e60b7df6d3e28ab04ccd3a143","other":"01a63575c384f686e5739e1bd079e4a4c55421cd6d89b944e2c61dd174fa2bf6","up":true},{"one":"0a215c7765be2caebf76ad3e8017bbc2aaadf8e0dd4859af781953a0564c5d59","other":"3871492c8c62cd74cbe65a993669e4978cc641879a5223dd6b9e687f050a1c40","up":true},{"one":"bc29a0d9b60f3e2c34224cec187cf44eadc4628086d5594666ed025da71e7e7a","other":"bde90aaa0f1f7a7eb965ff308718d29b55a80b1ca84dfba16c169eabe2b0d5de","up":true},{"one":"2d531c50183f0115269b3feaecf45927a3ac44e1be2a263c7e5d2274d8379b1c","other":"2803f212eb4aa4f49224b16b2de88ba8652ad115321ee1e60cdbd926ecdad38a","up":true},{"one":"5cc1c28eafd9758e807a28159a1a7a6ea313fa7e878fde5d47fcc8f5a5c25172","other":"51c285489ff14628268ae886945e1cd2da64c6a0a8cb184aada98567ab429b6e","up":true},{"one":"f611d8039385ad56260ab391763e3627aadd2756565fedc3ec95f76124da0efc","other":"641a165f8be0eee36f53c12bae8e2a34a709adb8d1dcd667e88e4e90c9ee2401","up":true},{"one":"bde90aaa0f1f7a7eb965ff308718d29b55a80b1ca84dfba16c169eabe2b0d5de","other":"4d750666dc0e9e2c244c43492801c1d7ec6208954a0cb5f8bb793b912440753a","up":true},{"one":"eb01ff80307afbfc7457c96594cd4ba4d00acb7fd25a7571d1223168bd66ff09","other":"ed2ec6681bf325887768703779ccf3a6278731118cd3ec890490a3de50f689ac","up":true},{"one":"4a3c39f044c425c153d4900db30f839d7866c8e0f4f4d38d9205e67fb540988e","other":"f611d8039385ad56260ab391763e3627aadd2756565fedc3ec95f76124da0efc","up":true},{"one":"64e642de2667a7563c774050d368858d99aff433efbd1cb68361e3e244629b03","other":"2354d3af5c6dca05d7dc212b100112f37ab29fb8b3f4319887230a4d420f5d9d","up":true},{"one":"c0adf394af7d5670c1ce8c6bea292fbc03c56ae2b636e2f303311a455bb3500f","other":"62f007c92a8af466e90ed0b1e5e71a955ad273ec793948ddfc03977f131ed2d1","up":true},{"one":"bc71f3e409edb989e26607448491530c5451053b582ea64d882525451ac940bb","other":"bc29a0d9b60f3e2c34224cec187cf44eadc4628086d5594666ed025da71e7e7a","up":true},{"one":"45895aff674079f6be02e4cc74914d63125c3fe48bb69056c070c71319fea1fa","other":"f4a0f76b30bcf5987cfa3f4f4b0aa3445f39d60a1f51519fa660c27b5d833dde","up":true},{"one":"77eedcac0c847b1d693ddff07c5868afb1c2008b2dcb48a0299143ab14611969","other":"772a79302528fdce6a216c98c95e281333292c81dfe490aeaa4a78bfeb1980c8","up":true},{"one":"4746379212b91ee1c13c1336e8f3a73a84408b7636c222c11bd27ce7d724e6c6","other":"184e9e00ab4fe1669d4d99fb33d418d33eff927da38cc997f69679443c24b20b","up":true},{"one":"eb01ff80307afbfc7457c96594cd4ba4d00acb7fd25a7571d1223168bd66ff09","other":"72a53f0fb1b51855cb4054a39cbd1309a76a862d36e18af9ba0456a60325c06e","up":true},{"one":"8b35236da99930bf8f5ef6c7555bb18b80ce2e34361bbbfd6baf55a6483e54ff","other":"13853407d278a45e15d4b148fc38ebb35c4f58ee552ee0e4401c6c98c45b8e3e","up":true},{"one":"2d531c50183f0115269b3feaecf45927a3ac44e1be2a263c7e5d2274d8379b1c","other":"3b830c2ae5463ca2f2260176b77b8dda23048257aa780255c69cf1bbbc6fb64c","up":true},{"one":"0a215c7765be2caebf76ad3e8017bbc2aaadf8e0dd4859af781953a0564c5d59","other":"72a76f668d9b923914860eb4f8577bc98c153f6dd222cd36a0bbdef2bab7f068","up":true},{"one":"5be6df23201fc5c00be650849c8bfe5581e44033ef19012836f97c98f3954471","other":"b3555baa764c4562935b93533ee6c5a6df631e846c3ab512fdb1d6b901a68c60","up":true},{"one":"bc71f3e409edb989e26607448491530c5451053b582ea64d882525451ac940bb","other":"8330e2b8ae2f184bb8dc5e153fafa4dafe86f84ec692d3ee91413cc07b1cd9e2","up":true},{"one":"52b47d52bf4a1afda1604b7942019c8d2ac4c760c5eb4597e1ce2dd7a8e1cf4d","other":"672a566c7c2aeb1d91e6ee4e43984050df8b9560d923d60dc1fb23fb73b1a046","up":true},{"one":"fa9a809f016097d949fa1463a1c8f08871c7d38e60b7df6d3e28ab04ccd3a143","other":"45895aff674079f6be02e4cc74914d63125c3fe48bb69056c070c71319fea1fa","up":true},{"one":"aba793e635f71169105ad073225cc8db914de6b711fe9f22c5d94ac8cb85e2eb","other":"bc29a0d9b60f3e2c34224cec187cf44eadc4628086d5594666ed025da71e7e7a","up":true},{"one":"eb01ff80307afbfc7457c96594cd4ba4d00acb7fd25a7571d1223168bd66ff09","other":"fa655b4882579e65937a14ab1c6bcba021580f0a5ebc04c48424f5ae72b7d5b4","up":true},{"one":"bc29a0d9b60f3e2c34224cec187cf44eadc4628086d5594666ed025da71e7e7a","other":"8330e2b8ae2f184bb8dc5e153fafa4dafe86f84ec692d3ee91413cc07b1cd9e2","up":true},{"one":"52b47d52bf4a1afda1604b7942019c8d2ac4c760c5eb4597e1ce2dd7a8e1cf4d","other":"4a373571475e2b4c280d2d4b22f10a249ee09fcf907f52081ec0398a8b5ea6f2","up":true},{"one":"deec6a8beb4e5e441dd42311354194c3bef9448e8859b4ccd401645b69217d12","other":"cc9f65d734f1a3bbc6019e166fe355bd7fc33bb4887043a5ccf532a9ba356379","up":true},{"one":"7a68fa44bbec187272e2d5dfbd6ed8af31a1a365aa72aa50db02350ebe98c859","other":"72a76f668d9b923914860eb4f8577bc98c153f6dd222cd36a0bbdef2bab7f068","up":true},{"one":"4a3c39f044c425c153d4900db30f839d7866c8e0f4f4d38d9205e67fb540988e","other":"75e282c0f3d355a40573e6578c5aac98e7262970a9239f4dcefd26d6f008b553","up":true},{"one":"47753fdca855ea79abf667b50aa9c90a132d44bdd1572c3e3c411c8ee7e5b5f4","other":"4a373571475e2b4c280d2d4b22f10a249ee09fcf907f52081ec0398a8b5ea6f2","up":true},{"one":"5a8ba4047c4456e825bd1b34c961f5c7f37bf7c27bc48bee71b8430c7d135486","other":"73d0d1d4a2b7250f51e57c13cc48bc6b20682320ce12ee8e5765afeef7d9de42","up":true},{"one":"aba793e635f71169105ad073225cc8db914de6b711fe9f22c5d94ac8cb85e2eb","other":"bddbdff3cbd22fcedddc07de27125819aac72be72c3126ba898621c496cb95a2","up":true},{"one":"deec6a8beb4e5e441dd42311354194c3bef9448e8859b4ccd401645b69217d12","other":"7bcb0d7b9f84aed413cf9b2a7851ba6d1138d85382aa20e6c939a43c8e59c034","up":true},{"one":"4cc2386a86fd210bf699c6d93173b0879c3210d46f572a62bb154cb60a7d2cb1","other":"c52a68d8388a21013e4eecef9ea866db1f5eb16bbe0ecc82b8bfafd33e4e014f","up":true},{"one":"f611d8039385ad56260ab391763e3627aadd2756565fedc3ec95f76124da0efc","other":"ce01234661309127bb872d69d38dc5bf19bc4de2e0a0b5041cd362d073df4ff8","up":true},{"one":"c2f9b4abed9c6a839fe4c03a80bd396fd187a8784ba47a83687d3a54b7e2eddf","other":"deec6a8beb4e5e441dd42311354194c3bef9448e8859b4ccd401645b69217d12","up":true},{"one":"ed2ec6681bf325887768703779ccf3a6278731118cd3ec890490a3de50f689ac","other":"d23c97bebcde26f5e351c4b975c76aaf604fd206f9b9063ecbda538e7a52f514","up":true},{"one":"fa655b4882579e65937a14ab1c6bcba021580f0a5ebc04c48424f5ae72b7d5b4","other":"45895aff674079f6be02e4cc74914d63125c3fe48bb69056c070c71319fea1fa","up":true},{"one":"b2453c6e755a30efb91194fa607b3352d75b6905c448b09af4aeadf3a445b633","other":"5c623fa0103108d0b1e24e6d01a6624ce3b59a9e7c422c45dfc1211676785542","up":true},{"one":"2dd4ad83effc3ba73e72f5659583e5987241bda563563200b50c46cce00a1d9b","other":"3590afcd10fb8f58c39f72068661d9a772b77e0efd57bbd60306632fb048fa3a","up":true},{"one":"f3d50811ef10661d3ef9978077cd7181387298f306833ab6e27f25cbb77435cd","other":"957ed6194e6ef56e9696be43a1a0258f2ba4f48f56d790e42bd0663c3fc6aaae","up":true},{"one":"aba793e635f71169105ad073225cc8db914de6b711fe9f22c5d94ac8cb85e2eb","other":"73d0d1d4a2b7250f51e57c13cc48bc6b20682320ce12ee8e5765afeef7d9de42","up":true},{"one":"5c623fa0103108d0b1e24e6d01a6624ce3b59a9e7c422c45dfc1211676785542","other":"51c285489ff14628268ae886945e1cd2da64c6a0a8cb184aada98567ab429b6e","up":true},{"one":"bc29a0d9b60f3e2c34224cec187cf44eadc4628086d5594666ed025da71e7e7a","other":"aedc9b478204effdcbad1a892333f15c061fbd1423b370f8a50f929b2a2f6952","up":true},{"one":"ed2ec6681bf325887768703779ccf3a6278731118cd3ec890490a3de50f689ac","other":"72a76f668d9b923914860eb4f8577bc98c153f6dd222cd36a0bbdef2bab7f068","up":true},{"one":"4d750666dc0e9e2c244c43492801c1d7ec6208954a0cb5f8bb793b912440753a","other":"75e282c0f3d355a40573e6578c5aac98e7262970a9239f4dcefd26d6f008b553","up":true},{"one":"fa655b4882579e65937a14ab1c6bcba021580f0a5ebc04c48424f5ae72b7d5b4","other":"ed2ec6681bf325887768703779ccf3a6278731118cd3ec890490a3de50f689ac","up":true},{"one":"cc9f65d734f1a3bbc6019e166fe355bd7fc33bb4887043a5ccf532a9ba356379","other":"cabfdfb789cc20962eaba1dbe68d6dc0466e699d22dc5b29f27a5cd555398795","up":true},{"one":"52b47d52bf4a1afda1604b7942019c8d2ac4c760c5eb4597e1ce2dd7a8e1cf4d","other":"ea3d6aa50ad5a1d5647d213f9b5cfe6718339eec7eef8644487eb3c223c7bcde","up":true},{"one":"b3555baa764c4562935b93533ee6c5a6df631e846c3ab512fdb1d6b901a68c60","other":"b4e29de4bd5751f31195ead8aa1548d305a53fb4f99be9931850e6273de8f359","up":true},{"one":"6450bb5e880411abcb60258d8560949f6f70d92ba7bfa9a4d7845463c48dab30","other":"b4e29de4bd5751f31195ead8aa1548d305a53fb4f99be9931850e6273de8f359","up":true},{"one":"5c623fa0103108d0b1e24e6d01a6624ce3b59a9e7c422c45dfc1211676785542","other":"fac808b79923931febd54e3611b79811b3973c777e7502bd56b9803d0c4bf785","up":true},{"one":"fa655b4882579e65937a14ab1c6bcba021580f0a5ebc04c48424f5ae72b7d5b4","other":"d18a1edd26661069fb401fee8aa85a9614a3188e2e0666bfe9307f91d29aad49","up":true},{"one":"7a68fa44bbec187272e2d5dfbd6ed8af31a1a365aa72aa50db02350ebe98c859","other":"82847a4af4f50622650d035f69151b202bccd5fc92302a617602c974603ed997","up":true},{"one":"f611d8039385ad56260ab391763e3627aadd2756565fedc3ec95f76124da0efc","other":"a86117147b78f20a6d883d37715da85178cad89eff650a74aa89e7bc11bc45a7","up":true},{"one":"58a90b58858417a4e972626421ed8e78b1b3e5ac69fcedd22c58a8ab4c6147df","other":"5008ef55ad8088f70643b0f93bcb479531bcb0afe8e01b215dbf8597ec866369","up":true},{"one":"52b47d52bf4a1afda1604b7942019c8d2ac4c760c5eb4597e1ce2dd7a8e1cf4d","other":"4c211c117e555c2ac831d5688615b6b4c5e31f1d7c7906b34f0cbcdbc45482b4","up":true},{"one":"be0fb2b440b91e719c20f51b673eb9f2f66c7af77b0b0ade312998cdffcc5045","other":"034de66774eda26b93e342c9b94b9deaeb6297650c819b144a5832bebfe6b02f","up":true},{"one":"f33c07a818863a358358989ec71504abad3ca0a7c81b54aad59075a766fad501","other":"72a76f668d9b923914860eb4f8577bc98c153f6dd222cd36a0bbdef2bab7f068","up":true},{"one":"f33c07a818863a358358989ec71504abad3ca0a7c81b54aad59075a766fad501","other":"58a90b58858417a4e972626421ed8e78b1b3e5ac69fcedd22c58a8ab4c6147df","up":true},{"one":"f4a0f76b30bcf5987cfa3f4f4b0aa3445f39d60a1f51519fa660c27b5d833dde","other":"5008ef55ad8088f70643b0f93bcb479531bcb0afe8e01b215dbf8597ec866369","up":true},{"one":"1929b01c0f85af7452a0f358b54f6b36640a196b366909172af594a1648fe64c","other":"2471776037d55a05df2b15bcefe52cb1f4c942e9e15113abc2a0c1fcbaa5d626","up":true},{"one":"03eb2e92ed0923f696269e7a03fec731d8c3f8df278023a9cb00867b533a3ca3","other":"72a76f668d9b923914860eb4f8577bc98c153f6dd222cd36a0bbdef2bab7f068","up":true},{"one":"7a68fa44bbec187272e2d5dfbd6ed8af31a1a365aa72aa50db02350ebe98c859","other":"459b9fb2b7f4e396de8cf8740a6804c8e5b96ca11ffa2b5106c14dfbbab65c95","up":true},{"one":"6450bb5e880411abcb60258d8560949f6f70d92ba7bfa9a4d7845463c48dab30","other":"b3555baa764c4562935b93533ee6c5a6df631e846c3ab512fdb1d6b901a68c60","up":true},{"one":"c2f9b4abed9c6a839fe4c03a80bd396fd187a8784ba47a83687d3a54b7e2eddf","other":"f4a0f76b30bcf5987cfa3f4f4b0aa3445f39d60a1f51519fa660c27b5d833dde","up":true},{"one":"bde90aaa0f1f7a7eb965ff308718d29b55a80b1ca84dfba16c169eabe2b0d5de","other":"bd9607d5f57f7b6f74f4ad981be368988ef48b5f31e3fd96cab3bb790d568150","up":true},{"one":"bddbdff3cbd22fcedddc07de27125819aac72be72c3126ba898621c496cb95a2","other":"4d750666dc0e9e2c244c43492801c1d7ec6208954a0cb5f8bb793b912440753a","up":true},{"one":"672a566c7c2aeb1d91e6ee4e43984050df8b9560d923d60dc1fb23fb73b1a046","other":"4d750666dc0e9e2c244c43492801c1d7ec6208954a0cb5f8bb793b912440753a","up":true},{"one":"2803f212eb4aa4f49224b16b2de88ba8652ad115321ee1e60cdbd926ecdad38a","other":"e06f58b144faa650f96465825d253b63d7e061e3a3c4228ad5e1b665afbccc37","up":true},{"one":"d9d30b9b212bd4811a44ebe304ba3935ead3abe3247f99893faf65664131c29d","other":"dd92b3d42414fd5eff5c1e4ca55c63cd7036634049995b72a20cdf7ca1321978","up":true},{"one":"cc9f65d734f1a3bbc6019e166fe355bd7fc33bb4887043a5ccf532a9ba356379","other":"cc5fa2d49210e240983b0853ff15003f0d366f05cb1f6486bae2862cca852cc5","up":true},{"one":"4d750666dc0e9e2c244c43492801c1d7ec6208954a0cb5f8bb793b912440753a","other":"4bc8dfbf84794d26d7a573c9d898974eaa3a2167e19cb7a8aa460807a603acd4","up":true},{"one":"bde90aaa0f1f7a7eb965ff308718d29b55a80b1ca84dfba16c169eabe2b0d5de","other":"5be6df23201fc5c00be650849c8bfe5581e44033ef19012836f97c98f3954471","up":true},{"one":"ee2b0aff61a9846d13de3a72712ef0bf3ca42ad8da57e81759c242797258efec","other":"75e282c0f3d355a40573e6578c5aac98e7262970a9239f4dcefd26d6f008b553","up":true},{"one":"6379b4d611cdd6e360480c14b3f6784360f28f702b5a6f375eda4ef3bde7ef33","other":"64e642de2667a7563c774050d368858d99aff433efbd1cb68361e3e244629b03","up":true},{"one":"459b9fb2b7f4e396de8cf8740a6804c8e5b96ca11ffa2b5106c14dfbbab65c95","other":"72a76f668d9b923914860eb4f8577bc98c153f6dd222cd36a0bbdef2bab7f068","up":true},{"one":"d23c97bebcde26f5e351c4b975c76aaf604fd206f9b9063ecbda538e7a52f514","other":"3e1959b29bbacb3ce7dccfa41c3e51b87f1afc700a3c6e4713c38cc0fe3790df","up":true},{"one":"69753865aacaaf72d9bf6d265c885d3f705804ff4b2675f7aa860641dacab2a0","other":"03eb2e92ed0923f696269e7a03fec731d8c3f8df278023a9cb00867b533a3ca3","up":true},{"one":"4bc8dfbf84794d26d7a573c9d898974eaa3a2167e19cb7a8aa460807a603acd4","other":"45895aff674079f6be02e4cc74914d63125c3fe48bb69056c070c71319fea1fa","up":true},{"one":"bddbdff3cbd22fcedddc07de27125819aac72be72c3126ba898621c496cb95a2","other":"be0fb2b440b91e719c20f51b673eb9f2f66c7af77b0b0ade312998cdffcc5045","up":true},{"one":"b2453c6e755a30efb91194fa607b3352d75b6905c448b09af4aeadf3a445b633","other":"5008ef55ad8088f70643b0f93bcb479531bcb0afe8e01b215dbf8597ec866369","up":true},{"one":"13853407d278a45e15d4b148fc38ebb35c4f58ee552ee0e4401c6c98c45b8e3e","other":"be0fb2b440b91e719c20f51b673eb9f2f66c7af77b0b0ade312998cdffcc5045","up":true},{"one":"4a3c39f044c425c153d4900db30f839d7866c8e0f4f4d38d9205e67fb540988e","other":"f4a0f76b30bcf5987cfa3f4f4b0aa3445f39d60a1f51519fa660c27b5d833dde","up":true},{"one":"1929b01c0f85af7452a0f358b54f6b36640a196b366909172af594a1648fe64c","other":"6daaf515999c9a3491c963f76be82ed6005616bf7ba98247b01d6a89a9af1d71","up":true},{"one":"f177ee6767a78a57b725dbe67ec377f507f5777d345a28892b0fbfb800dc443a","other":"fac808b79923931febd54e3611b79811b3973c777e7502bd56b9803d0c4bf785","up":true},{"one":"deec6a8beb4e5e441dd42311354194c3bef9448e8859b4ccd401645b69217d12","other":"ce01234661309127bb872d69d38dc5bf19bc4de2e0a0b5041cd362d073df4ff8","up":true},{"one":"f611d8039385ad56260ab391763e3627aadd2756565fedc3ec95f76124da0efc","other":"a9fa28117a4b6906b5ce3931573e0a19eec3cb4fcd9141be2d258a2be06f3b61","up":true},{"one":"4a3c39f044c425c153d4900db30f839d7866c8e0f4f4d38d9205e67fb540988e","other":"fac808b79923931febd54e3611b79811b3973c777e7502bd56b9803d0c4bf785","up":true},{"one":"22bbb3236a5e0a1947a1c4735aaacf9122173789a02a06e7653103bdcae2f823","other":"17406dea5046f00e27eaf74e166a945c9485139d6edcdfcd84f5b03f50eedd0a","up":true},{"one":"3590afcd10fb8f58c39f72068661d9a772b77e0efd57bbd60306632fb048fa3a","other":"216e0370111e2e03927b803ae788f9947de8e241d41dbf6a70983cf0ecd68af1","up":true},{"one":"bd9607d5f57f7b6f74f4ad981be368988ef48b5f31e3fd96cab3bb790d568150","other":"b9d906e406b0fc6078c22bbc173043df1f7581061b4f6ccd769bc568d94b4339","up":true},{"one":"aedc9b478204effdcbad1a892333f15c061fbd1423b370f8a50f929b2a2f6952","other":"a86117147b78f20a6d883d37715da85178cad89eff650a74aa89e7bc11bc45a7","up":true},{"one":"127c89eae94b195df2eb5eb7b44f634adb73c114d2089cd904b56988c8674e11","other":"8d3e0d9c6932d3422024394998e943309b679d667394d0eb622f0e208e7fcf0a","up":true},{"one":"f611d8039385ad56260ab391763e3627aadd2756565fedc3ec95f76124da0efc","other":"836e65dfe6f01e1d2934655c1846cb86fed6e41ea951a109d7a20bb14cb4c10a","up":true},{"one":"51c285489ff14628268ae886945e1cd2da64c6a0a8cb184aada98567ab429b6e","other":"8fb8208b7167dd06cc08778b507ccd856751d3df6dfbaeac18b9f527b6628523","up":true},{"one":"4a373571475e2b4c280d2d4b22f10a249ee09fcf907f52081ec0398a8b5ea6f2","other":"73d0d1d4a2b7250f51e57c13cc48bc6b20682320ce12ee8e5765afeef7d9de42","up":true},{"one":"d23c97bebcde26f5e351c4b975c76aaf604fd206f9b9063ecbda538e7a52f514","other":"ed12c78e700bf805669c48a5d62f1e56791263c4b2ce5bd34587ea9bc931a3e5","up":true},{"one":"034de66774eda26b93e342c9b94b9deaeb6297650c819b144a5832bebfe6b02f","other":"01a63575c384f686e5739e1bd079e4a4c55421cd6d89b944e2c61dd174fa2bf6","up":true},{"one":"034de66774eda26b93e342c9b94b9deaeb6297650c819b144a5832bebfe6b02f","other":"22bbb3236a5e0a1947a1c4735aaacf9122173789a02a06e7653103bdcae2f823","up":true},{"one":"d23c97bebcde26f5e351c4b975c76aaf604fd206f9b9063ecbda538e7a52f514","other":"0f3106adfe70aefb474c4a98a95932307391de2cb70fbd2e11dd31c9e695ed83","up":true},{"one":"03eb2e92ed0923f696269e7a03fec731d8c3f8df278023a9cb00867b533a3ca3","other":"0639f010834f5bc497798f2d275bbc60bfbcd53c83e38986b7260310c6001420","up":true},{"one":"f611d8039385ad56260ab391763e3627aadd2756565fedc3ec95f76124da0efc","other":"f177ee6767a78a57b725dbe67ec377f507f5777d345a28892b0fbfb800dc443a","up":true},{"one":"ee2b0aff61a9846d13de3a72712ef0bf3ca42ad8da57e81759c242797258efec","other":"64e642de2667a7563c774050d368858d99aff433efbd1cb68361e3e244629b03","up":true},{"one":"d125317b492df46a7dd496d30c6d07839ed6bfa196abde4886ce7bc8f9b5c01f","other":"7bcb0d7b9f84aed413cf9b2a7851ba6d1138d85382aa20e6c939a43c8e59c034","up":true},{"one":"f611d8039385ad56260ab391763e3627aadd2756565fedc3ec95f76124da0efc","other":"d18a1edd26661069fb401fee8aa85a9614a3188e2e0666bfe9307f91d29aad49","up":true},{"one":"f177ee6767a78a57b725dbe67ec377f507f5777d345a28892b0fbfb800dc443a","other":"f4a0f76b30bcf5987cfa3f4f4b0aa3445f39d60a1f51519fa660c27b5d833dde","up":true},{"one":"f177ee6767a78a57b725dbe67ec377f507f5777d345a28892b0fbfb800dc443a","other":"58a90b58858417a4e972626421ed8e78b1b3e5ac69fcedd22c58a8ab4c6147df","up":true},{"one":"62f007c92a8af466e90ed0b1e5e71a955ad273ec793948ddfc03977f131ed2d1","other":"2dd4ad83effc3ba73e72f5659583e5987241bda563563200b50c46cce00a1d9b","up":true},{"one":"6450bb5e880411abcb60258d8560949f6f70d92ba7bfa9a4d7845463c48dab30","other":"0639f010834f5bc497798f2d275bbc60bfbcd53c83e38986b7260310c6001420","up":true},{"one":"5be6df23201fc5c00be650849c8bfe5581e44033ef19012836f97c98f3954471","other":"a1929f704664ca85d829ac3bab62e688647a7cfdcbc9f03c61b0124cf9093505","up":true},{"one":"034de66774eda26b93e342c9b94b9deaeb6297650c819b144a5832bebfe6b02f","other":"b3555baa764c4562935b93533ee6c5a6df631e846c3ab512fdb1d6b901a68c60","up":true},{"one":"a86117147b78f20a6d883d37715da85178cad89eff650a74aa89e7bc11bc45a7","other":"8d3e0d9c6932d3422024394998e943309b679d667394d0eb622f0e208e7fcf0a","up":true},{"one":"82847a4af4f50622650d035f69151b202bccd5fc92302a617602c974603ed997","other":"7bcb0d7b9f84aed413cf9b2a7851ba6d1138d85382aa20e6c939a43c8e59c034","up":true},{"one":"a86117147b78f20a6d883d37715da85178cad89eff650a74aa89e7bc11bc45a7","other":"8330e2b8ae2f184bb8dc5e153fafa4dafe86f84ec692d3ee91413cc07b1cd9e2","up":true},{"one":"034de66774eda26b93e342c9b94b9deaeb6297650c819b144a5832bebfe6b02f","other":"77eedcac0c847b1d693ddff07c5868afb1c2008b2dcb48a0299143ab14611969","up":true},{"one":"aedc9b478204effdcbad1a892333f15c061fbd1423b370f8a50f929b2a2f6952","other":"73d0d1d4a2b7250f51e57c13cc48bc6b20682320ce12ee8e5765afeef7d9de42","up":true},{"one":"836e65dfe6f01e1d2934655c1846cb86fed6e41ea951a109d7a20bb14cb4c10a","other":"45895aff674079f6be02e4cc74914d63125c3fe48bb69056c070c71319fea1fa","up":true},{"one":"2471776037d55a05df2b15bcefe52cb1f4c942e9e15113abc2a0c1fcbaa5d626","other":"62f007c92a8af466e90ed0b1e5e71a955ad273ec793948ddfc03977f131ed2d1","up":true},{"one":"fac808b79923931febd54e3611b79811b3973c777e7502bd56b9803d0c4bf785","other":"4efaabab0d5dc59f098aee4dba3868263411a55615a2c474a73e6eec2211decc","up":true},{"one":"4efaabab0d5dc59f098aee4dba3868263411a55615a2c474a73e6eec2211decc","other":"4c211c117e555c2ac831d5688615b6b4c5e31f1d7c7906b34f0cbcdbc45482b4","up":true},{"one":"f3d50811ef10661d3ef9978077cd7181387298f306833ab6e27f25cbb77435cd","other":"8330e2b8ae2f184bb8dc5e153fafa4dafe86f84ec692d3ee91413cc07b1cd9e2","up":true},{"one":"eceb7dc532596e8b68074113db9605e3d15cb15e2e80f75f1a66d95a1221c7dc","other":"58a90b58858417a4e972626421ed8e78b1b3e5ac69fcedd22c58a8ab4c6147df","up":true},{"one":"b8695bec6c8e1e6794bb943b83629cd2c910067e6e178f6f8e33c4f0fa2d74f4","other":"a9fa28117a4b6906b5ce3931573e0a19eec3cb4fcd9141be2d258a2be06f3b61","up":true},{"one":"dd92b3d42414fd5eff5c1e4ca55c63cd7036634049995b72a20cdf7ca1321978","other":"ed12c78e700bf805669c48a5d62f1e56791263c4b2ce5bd34587ea9bc931a3e5","up":true},{"one":"034de66774eda26b93e342c9b94b9deaeb6297650c819b144a5832bebfe6b02f","other":"27db66d13ee8168aca89786febd6971dd1d6c554bca8501052065cb47631560d","up":true},{"one":"4d750666dc0e9e2c244c43492801c1d7ec6208954a0cb5f8bb793b912440753a","other":"957ed6194e6ef56e9696be43a1a0258f2ba4f48f56d790e42bd0663c3fc6aaae","up":true},{"one":"7bee7967ff7b07243bed55b6d060d5ec2a1f28b530ed65cd055dc5b468a0f878","other":"184e9e00ab4fe1669d4d99fb33d418d33eff927da38cc997f69679443c24b20b","up":true},{"one":"6daaf515999c9a3491c963f76be82ed6005616bf7ba98247b01d6a89a9af1d71","other":"641a165f8be0eee36f53c12bae8e2a34a709adb8d1dcd667e88e4e90c9ee2401","up":true},{"one":"ed12c78e700bf805669c48a5d62f1e56791263c4b2ce5bd34587ea9bc931a3e5","other":"7bcb0d7b9f84aed413cf9b2a7851ba6d1138d85382aa20e6c939a43c8e59c034","up":true},{"one":"21dcfb893a54cb56d21355fc564583057fc51b32503a8627e7575660725a7627","other":"2dd4ad83effc3ba73e72f5659583e5987241bda563563200b50c46cce00a1d9b","up":true},{"one":"d18a1edd26661069fb401fee8aa85a9614a3188e2e0666bfe9307f91d29aad49","other":"e06f58b144faa650f96465825d253b63d7e061e3a3c4228ad5e1b665afbccc37","up":true},{"one":"f005a4d3453d52434f2b5be4006e653b50b52ad31926d654722fc3df00f1689c","other":"8fb8208b7167dd06cc08778b507ccd856751d3df6dfbaeac18b9f527b6628523","up":true},{"one":"eceb7dc532596e8b68074113db9605e3d15cb15e2e80f75f1a66d95a1221c7dc","other":"772a79302528fdce6a216c98c95e281333292c81dfe490aeaa4a78bfeb1980c8","up":true},{"one":"2471776037d55a05df2b15bcefe52cb1f4c942e9e15113abc2a0c1fcbaa5d626","other":"8012a7af71d76d882202cf9372523478ccebea23443006c7f29c2a83106cd1b3","up":true},{"one":"13853407d278a45e15d4b148fc38ebb35c4f58ee552ee0e4401c6c98c45b8e3e","other":"6daaf515999c9a3491c963f76be82ed6005616bf7ba98247b01d6a89a9af1d71","up":true},{"one":"f005a4d3453d52434f2b5be4006e653b50b52ad31926d654722fc3df00f1689c","other":"957ed6194e6ef56e9696be43a1a0258f2ba4f48f56d790e42bd0663c3fc6aaae","up":true},{"one":"72a76f668d9b923914860eb4f8577bc98c153f6dd222cd36a0bbdef2bab7f068","other":"772a79302528fdce6a216c98c95e281333292c81dfe490aeaa4a78bfeb1980c8","up":true},{"one":"2471776037d55a05df2b15bcefe52cb1f4c942e9e15113abc2a0c1fcbaa5d626","other":"64e642de2667a7563c774050d368858d99aff433efbd1cb68361e3e244629b03","up":true},{"one":"b4e29de4bd5751f31195ead8aa1548d305a53fb4f99be9931850e6273de8f359","other":"ce01234661309127bb872d69d38dc5bf19bc4de2e0a0b5041cd362d073df4ff8","up":true},{"one":"deec6a8beb4e5e441dd42311354194c3bef9448e8859b4ccd401645b69217d12","other":"c9ef56afed2d40db396ad39d6f5f5f38f4058b6b0d1e02b71d6aa92dbeaf7df7","up":true},{"one":"dd92b3d42414fd5eff5c1e4ca55c63cd7036634049995b72a20cdf7ca1321978","other":"0f3106adfe70aefb474c4a98a95932307391de2cb70fbd2e11dd31c9e695ed83","up":true},{"one":"641a165f8be0eee36f53c12bae8e2a34a709adb8d1dcd667e88e4e90c9ee2401","other":"ed12c78e700bf805669c48a5d62f1e56791263c4b2ce5bd34587ea9bc931a3e5","up":true},{"one":"127c89eae94b195df2eb5eb7b44f634adb73c114d2089cd904b56988c8674e11","other":"01a63575c384f686e5739e1bd079e4a4c55421cd6d89b944e2c61dd174fa2bf6","up":true},{"one":"4a373571475e2b4c280d2d4b22f10a249ee09fcf907f52081ec0398a8b5ea6f2","other":"fac808b79923931febd54e3611b79811b3973c777e7502bd56b9803d0c4bf785","up":true},{"one":"deec6a8beb4e5e441dd42311354194c3bef9448e8859b4ccd401645b69217d12","other":"01a63575c384f686e5739e1bd079e4a4c55421cd6d89b944e2c61dd174fa2bf6","up":true},{"one":"b3555baa764c4562935b93533ee6c5a6df631e846c3ab512fdb1d6b901a68c60","other":"0e344c6e27c23bd36bdd3ddcefa4e577fdc9461e52c7ce20135733a08b987b82","up":true},{"one":"27db66d13ee8168aca89786febd6971dd1d6c554bca8501052065cb47631560d","other":"4efaabab0d5dc59f098aee4dba3868263411a55615a2c474a73e6eec2211decc","up":true},{"one":"c0adf394af7d5670c1ce8c6bea292fbc03c56ae2b636e2f303311a455bb3500f","other":"672a566c7c2aeb1d91e6ee4e43984050df8b9560d923d60dc1fb23fb73b1a046","up":true},{"one":"f177ee6767a78a57b725dbe67ec377f507f5777d345a28892b0fbfb800dc443a","other":"772a79302528fdce6a216c98c95e281333292c81dfe490aeaa4a78bfeb1980c8","up":true},{"one":"bc71f3e409edb989e26607448491530c5451053b582ea64d882525451ac940bb","other":"f3d50811ef10661d3ef9978077cd7181387298f306833ab6e27f25cbb77435cd","up":true},{"one":"27b56302a89605a83563ba7b66d491ec25edfad0ea1010937fcadeab4d3ae582","other":"2803f212eb4aa4f49224b16b2de88ba8652ad115321ee1e60cdbd926ecdad38a","up":true},{"one":"5c623fa0103108d0b1e24e6d01a6624ce3b59a9e7c422c45dfc1211676785542","other":"47753fdca855ea79abf667b50aa9c90a132d44bdd1572c3e3c411c8ee7e5b5f4","up":true},{"one":"3e1959b29bbacb3ce7dccfa41c3e51b87f1afc700a3c6e4713c38cc0fe3790df","other":"17406dea5046f00e27eaf74e166a945c9485139d6edcdfcd84f5b03f50eedd0a","up":true},{"one":"fa9a809f016097d949fa1463a1c8f08871c7d38e60b7df6d3e28ab04ccd3a143","other":"0a215c7765be2caebf76ad3e8017bbc2aaadf8e0dd4859af781953a0564c5d59","up":true},{"one":"f177ee6767a78a57b725dbe67ec377f507f5777d345a28892b0fbfb800dc443a","other":"7bcb0d7b9f84aed413cf9b2a7851ba6d1138d85382aa20e6c939a43c8e59c034","up":true},{"one":"b9d906e406b0fc6078c22bbc173043df1f7581061b4f6ccd769bc568d94b4339","other":"8012a7af71d76d882202cf9372523478ccebea23443006c7f29c2a83106cd1b3","up":true},{"one":"4bc8dfbf84794d26d7a573c9d898974eaa3a2167e19cb7a8aa460807a603acd4","other":"4c211c117e555c2ac831d5688615b6b4c5e31f1d7c7906b34f0cbcdbc45482b4","up":true},{"one":"127c89eae94b195df2eb5eb7b44f634adb73c114d2089cd904b56988c8674e11","other":"b3555baa764c4562935b93533ee6c5a6df631e846c3ab512fdb1d6b901a68c60","up":true},{"one":"4a373571475e2b4c280d2d4b22f10a249ee09fcf907f52081ec0398a8b5ea6f2","other":"216e0370111e2e03927b803ae788f9947de8e241d41dbf6a70983cf0ecd68af1","up":true},{"one":"0639f010834f5bc497798f2d275bbc60bfbcd53c83e38986b7260310c6001420","other":"17406dea5046f00e27eaf74e166a945c9485139d6edcdfcd84f5b03f50eedd0a","up":true},{"one":"7bcb0d7b9f84aed413cf9b2a7851ba6d1138d85382aa20e6c939a43c8e59c034","other":"e06f58b144faa650f96465825d253b63d7e061e3a3c4228ad5e1b665afbccc37","up":true},{"one":"4a373571475e2b4c280d2d4b22f10a249ee09fcf907f52081ec0398a8b5ea6f2","other":"58a90b58858417a4e972626421ed8e78b1b3e5ac69fcedd22c58a8ab4c6147df","up":true},{"one":"216e0370111e2e03927b803ae788f9947de8e241d41dbf6a70983cf0ecd68af1","other":"21dcfb893a54cb56d21355fc564583057fc51b32503a8627e7575660725a7627","up":true},{"one":"55fdad03303a746920773217c568a37d2004869ff34096fbe45197f71eba2b63","other":"4c211c117e555c2ac831d5688615b6b4c5e31f1d7c7906b34f0cbcdbc45482b4","up":true},{"one":"4a373571475e2b4c280d2d4b22f10a249ee09fcf907f52081ec0398a8b5ea6f2","other":"4efaabab0d5dc59f098aee4dba3868263411a55615a2c474a73e6eec2211decc","up":true},{"one":"7a68fa44bbec187272e2d5dfbd6ed8af31a1a365aa72aa50db02350ebe98c859","other":"5cc1c28eafd9758e807a28159a1a7a6ea313fa7e878fde5d47fcc8f5a5c25172","up":true},{"one":"72a53f0fb1b51855cb4054a39cbd1309a76a862d36e18af9ba0456a60325c06e","other":"08077c0ce8d4130c14464493e9164a8bae61b4646b1ec48899e75f2f6f9b8c66","up":true},{"one":"3590afcd10fb8f58c39f72068661d9a772b77e0efd57bbd60306632fb048fa3a","other":"3871492c8c62cd74cbe65a993669e4978cc641879a5223dd6b9e687f050a1c40","up":true},{"one":"f3d50811ef10661d3ef9978077cd7181387298f306833ab6e27f25cbb77435cd","other":"a86117147b78f20a6d883d37715da85178cad89eff650a74aa89e7bc11bc45a7","up":true},{"one":"0a215c7765be2caebf76ad3e8017bbc2aaadf8e0dd4859af781953a0564c5d59","other":"672a566c7c2aeb1d91e6ee4e43984050df8b9560d923d60dc1fb23fb73b1a046","up":true},{"one":"22bbb3236a5e0a1947a1c4735aaacf9122173789a02a06e7653103bdcae2f823","other":"0639f010834f5bc497798f2d275bbc60bfbcd53c83e38986b7260310c6001420","up":true},{"one":"221cd8ea0a26f0d3f81f782f1de390282415ecd9cf40224b4945a00897895b4e","other":"13853407d278a45e15d4b148fc38ebb35c4f58ee552ee0e4401c6c98c45b8e3e","up":true},{"one":"77eedcac0c847b1d693ddff07c5868afb1c2008b2dcb48a0299143ab14611969","other":"0639f010834f5bc497798f2d275bbc60bfbcd53c83e38986b7260310c6001420","up":true},{"one":"b2453c6e755a30efb91194fa607b3352d75b6905c448b09af4aeadf3a445b633","other":"4bc8dfbf84794d26d7a573c9d898974eaa3a2167e19cb7a8aa460807a603acd4","up":true},{"one":"aedc9b478204effdcbad1a892333f15c061fbd1423b370f8a50f929b2a2f6952","other":"947205fd85a17330a6d5c51a66548c5f69779c76ab12408f8fc6d33d7c6b8e9d","up":true},{"one":"d18a1edd26661069fb401fee8aa85a9614a3188e2e0666bfe9307f91d29aad49","other":"947205fd85a17330a6d5c51a66548c5f69779c76ab12408f8fc6d33d7c6b8e9d","up":true},{"one":"672a566c7c2aeb1d91e6ee4e43984050df8b9560d923d60dc1fb23fb73b1a046","other":"75e282c0f3d355a40573e6578c5aac98e7262970a9239f4dcefd26d6f008b553","up":true},{"one":"fac808b79923931febd54e3611b79811b3973c777e7502bd56b9803d0c4bf785","other":"ce01234661309127bb872d69d38dc5bf19bc4de2e0a0b5041cd362d073df4ff8","up":true},{"one":"efd68d2c99346ca085c9ef896bee6125ad8638413295108f3a92b247a41ca629","other":"fac808b79923931febd54e3611b79811b3973c777e7502bd56b9803d0c4bf785","up":true},{"one":"ea3d6aa50ad5a1d5647d213f9b5cfe6718339eec7eef8644487eb3c223c7bcde","other":"5008ef55ad8088f70643b0f93bcb479531bcb0afe8e01b215dbf8597ec866369","up":true},{"one":"03eb2e92ed0923f696269e7a03fec731d8c3f8df278023a9cb00867b533a3ca3","other":"2dd4ad83effc3ba73e72f5659583e5987241bda563563200b50c46cce00a1d9b","up":true},{"one":"b8695bec6c8e1e6794bb943b83629cd2c910067e6e178f6f8e33c4f0fa2d74f4","other":"acf888ed781f5358493e2e5048691acc39eac3240ca9e9093bb4052b1f624325","up":true},{"one":"3e1959b29bbacb3ce7dccfa41c3e51b87f1afc700a3c6e4713c38cc0fe3790df","other":"08077c0ce8d4130c14464493e9164a8bae61b4646b1ec48899e75f2f6f9b8c66","up":true},{"one":"ea3d6aa50ad5a1d5647d213f9b5cfe6718339eec7eef8644487eb3c223c7bcde","other":"a9fa28117a4b6906b5ce3931573e0a19eec3cb4fcd9141be2d258a2be06f3b61","up":true},{"one":"45895aff674079f6be02e4cc74914d63125c3fe48bb69056c070c71319fea1fa","other":"fac808b79923931febd54e3611b79811b3973c777e7502bd56b9803d0c4bf785","up":true},{"one":"672a566c7c2aeb1d91e6ee4e43984050df8b9560d923d60dc1fb23fb73b1a046","other":"ee2b0aff61a9846d13de3a72712ef0bf3ca42ad8da57e81759c242797258efec","up":true},{"one":"37751f279493dc5ce5b5c3c55a6ec2e4119eedefe1069b283f6ff8c7bc9d1411","other":"184e9e00ab4fe1669d4d99fb33d418d33eff927da38cc997f69679443c24b20b","up":true},{"one":"2471776037d55a05df2b15bcefe52cb1f4c942e9e15113abc2a0c1fcbaa5d626","other":"82847a4af4f50622650d035f69151b202bccd5fc92302a617602c974603ed997","up":true},{"one":"947205fd85a17330a6d5c51a66548c5f69779c76ab12408f8fc6d33d7c6b8e9d","other":"ce01234661309127bb872d69d38dc5bf19bc4de2e0a0b5041cd362d073df4ff8","up":true},{"one":"b4e29de4bd5751f31195ead8aa1548d305a53fb4f99be9931850e6273de8f359","other":"5be6df23201fc5c00be650849c8bfe5581e44033ef19012836f97c98f3954471","up":true},{"one":"5a8ba4047c4456e825bd1b34c961f5c7f37bf7c27bc48bee71b8430c7d135486","other":"4a3c39f044c425c153d4900db30f839d7866c8e0f4f4d38d9205e67fb540988e","up":true},{"one":"27db66d13ee8168aca89786febd6971dd1d6c554bca8501052065cb47631560d","other":"0639f010834f5bc497798f2d275bbc60bfbcd53c83e38986b7260310c6001420","up":true},{"one":"f005a4d3453d52434f2b5be4006e653b50b52ad31926d654722fc3df00f1689c","other":"8012a7af71d76d882202cf9372523478ccebea23443006c7f29c2a83106cd1b3","up":true},{"one":"64e642de2667a7563c774050d368858d99aff433efbd1cb68361e3e244629b03","other":"7bee7967ff7b07243bed55b6d060d5ec2a1f28b530ed65cd055dc5b468a0f878","up":true},{"one":"459b9fb2b7f4e396de8cf8740a6804c8e5b96ca11ffa2b5106c14dfbbab65c95","other":"772a79302528fdce6a216c98c95e281333292c81dfe490aeaa4a78bfeb1980c8","up":true},{"one":"eceb7dc532596e8b68074113db9605e3d15cb15e2e80f75f1a66d95a1221c7dc","other":"cc5fa2d49210e240983b0853ff15003f0d366f05cb1f6486bae2862cca852cc5","up":true},{"one":"b9d906e406b0fc6078c22bbc173043df1f7581061b4f6ccd769bc568d94b4339","other":"be0fb2b440b91e719c20f51b673eb9f2f66c7af77b0b0ade312998cdffcc5045","up":true},{"one":"f3d50811ef10661d3ef9978077cd7181387298f306833ab6e27f25cbb77435cd","other":"a9fa28117a4b6906b5ce3931573e0a19eec3cb4fcd9141be2d258a2be06f3b61","up":true},{"one":"b5fc43e8c0df3279d6a12cd8b03012cb8d2205208324018c7ae725745a99a2f3","other":"55fdad03303a746920773217c568a37d2004869ff34096fbe45197f71eba2b63","up":true},{"one":"cabfdfb789cc20962eaba1dbe68d6dc0466e699d22dc5b29f27a5cd555398795","other":"ce01234661309127bb872d69d38dc5bf19bc4de2e0a0b5041cd362d073df4ff8","up":true},{"one":"4cc2386a86fd210bf699c6d93173b0879c3210d46f572a62bb154cb60a7d2cb1","other":"c2f9b4abed9c6a839fe4c03a80bd396fd187a8784ba47a83687d3a54b7e2eddf","up":true},{"one":"4efaabab0d5dc59f098aee4dba3868263411a55615a2c474a73e6eec2211decc","other":"5cc1c28eafd9758e807a28159a1a7a6ea313fa7e878fde5d47fcc8f5a5c25172","up":true},{"one":"772a79302528fdce6a216c98c95e281333292c81dfe490aeaa4a78bfeb1980c8","other":"73d0d1d4a2b7250f51e57c13cc48bc6b20682320ce12ee8e5765afeef7d9de42","up":true},{"one":"47753fdca855ea79abf667b50aa9c90a132d44bdd1572c3e3c411c8ee7e5b5f4","other":"3e1959b29bbacb3ce7dccfa41c3e51b87f1afc700a3c6e4713c38cc0fe3790df","up":true},{"one":"03eb2e92ed0923f696269e7a03fec731d8c3f8df278023a9cb00867b533a3ca3","other":"62f007c92a8af466e90ed0b1e5e71a955ad273ec793948ddfc03977f131ed2d1","up":true},{"one":"7bee7967ff7b07243bed55b6d060d5ec2a1f28b530ed65cd055dc5b468a0f878","other":"3590afcd10fb8f58c39f72068661d9a772b77e0efd57bbd60306632fb048fa3a","up":true},{"one":"cc5fa2d49210e240983b0853ff15003f0d366f05cb1f6486bae2862cca852cc5","other":"ce01234661309127bb872d69d38dc5bf19bc4de2e0a0b5041cd362d073df4ff8","up":true},{"one":"77eedcac0c847b1d693ddff07c5868afb1c2008b2dcb48a0299143ab14611969","other":"08077c0ce8d4130c14464493e9164a8bae61b4646b1ec48899e75f2f6f9b8c66","up":true},{"one":"03eb2e92ed0923f696269e7a03fec731d8c3f8df278023a9cb00867b533a3ca3","other":"22bbb3236a5e0a1947a1c4735aaacf9122173789a02a06e7653103bdcae2f823","up":true},{"one":"b4e29de4bd5751f31195ead8aa1548d305a53fb4f99be9931850e6273de8f359","other":"cc5fa2d49210e240983b0853ff15003f0d366f05cb1f6486bae2862cca852cc5","up":true},{"one":"6daaf515999c9a3491c963f76be82ed6005616bf7ba98247b01d6a89a9af1d71","other":"55fdad03303a746920773217c568a37d2004869ff34096fbe45197f71eba2b63","up":true},{"one":"ea3d6aa50ad5a1d5647d213f9b5cfe6718339eec7eef8644487eb3c223c7bcde","other":"5c623fa0103108d0b1e24e6d01a6624ce3b59a9e7c422c45dfc1211676785542","up":true},{"one":"b2453c6e755a30efb91194fa607b3352d75b6905c448b09af4aeadf3a445b633","other":"b60e77c40ddc9dc78a4ad346add37e60f10f2999de836615db53524487d1ede9","up":true},{"one":"be0fb2b440b91e719c20f51b673eb9f2f66c7af77b0b0ade312998cdffcc5045","other":"5be6df23201fc5c00be650849c8bfe5581e44033ef19012836f97c98f3954471","up":true},{"one":"72a76f668d9b923914860eb4f8577bc98c153f6dd222cd36a0bbdef2bab7f068","other":"ed12c78e700bf805669c48a5d62f1e56791263c4b2ce5bd34587ea9bc931a3e5","up":true},{"one":"eb01ff80307afbfc7457c96594cd4ba4d00acb7fd25a7571d1223168bd66ff09","other":"efd68d2c99346ca085c9ef896bee6125ad8638413295108f3a92b247a41ca629","up":true},{"one":"f005a4d3453d52434f2b5be4006e653b50b52ad31926d654722fc3df00f1689c","other":"8330e2b8ae2f184bb8dc5e153fafa4dafe86f84ec692d3ee91413cc07b1cd9e2","up":true},{"one":"2354d3af5c6dca05d7dc212b100112f37ab29fb8b3f4319887230a4d420f5d9d","other":"184e9e00ab4fe1669d4d99fb33d418d33eff927da38cc997f69679443c24b20b","up":true},{"one":"3b830c2ae5463ca2f2260176b77b8dda23048257aa780255c69cf1bbbc6fb64c","other":"27db66d13ee8168aca89786febd6971dd1d6c554bca8501052065cb47631560d","up":true},{"one":"4bc8dfbf84794d26d7a573c9d898974eaa3a2167e19cb7a8aa460807a603acd4","other":"4efaabab0d5dc59f098aee4dba3868263411a55615a2c474a73e6eec2211decc","up":true},{"one":"7bee7967ff7b07243bed55b6d060d5ec2a1f28b530ed65cd055dc5b468a0f878","other":"37751f279493dc5ce5b5c3c55a6ec2e4119eedefe1069b283f6ff8c7bc9d1411","up":true},{"one":"f4a0f76b30bcf5987cfa3f4f4b0aa3445f39d60a1f51519fa660c27b5d833dde","other":"47753fdca855ea79abf667b50aa9c90a132d44bdd1572c3e3c411c8ee7e5b5f4","up":true},{"one":"c52a68d8388a21013e4eecef9ea866db1f5eb16bbe0ecc82b8bfafd33e4e014f","other":"ea3d6aa50ad5a1d5647d213f9b5cfe6718339eec7eef8644487eb3c223c7bcde","up":true},{"one":"947205fd85a17330a6d5c51a66548c5f69779c76ab12408f8fc6d33d7c6b8e9d","other":"a1929f704664ca85d829ac3bab62e688647a7cfdcbc9f03c61b0124cf9093505","up":true},{"one":"5cc1c28eafd9758e807a28159a1a7a6ea313fa7e878fde5d47fcc8f5a5c25172","other":"8fb8208b7167dd06cc08778b507ccd856751d3df6dfbaeac18b9f527b6628523","up":true},{"one":"f4a0f76b30bcf5987cfa3f4f4b0aa3445f39d60a1f51519fa660c27b5d833dde","other":"836e65dfe6f01e1d2934655c1846cb86fed6e41ea951a109d7a20bb14cb4c10a","up":true},{"one":"d18a1edd26661069fb401fee8aa85a9614a3188e2e0666bfe9307f91d29aad49","other":"fac808b79923931febd54e3611b79811b3973c777e7502bd56b9803d0c4bf785","up":true},{"one":"bd486e1e15df4c7539b1ad5b54f7566dd4836a430e9f7d3503881fa79e258d9b","other":"bc29a0d9b60f3e2c34224cec187cf44eadc4628086d5594666ed025da71e7e7a","up":true},{"one":"b9d906e406b0fc6078c22bbc173043df1f7581061b4f6ccd769bc568d94b4339","other":"8330e2b8ae2f184bb8dc5e153fafa4dafe86f84ec692d3ee91413cc07b1cd9e2","up":true},{"one":"b2453c6e755a30efb91194fa607b3352d75b6905c448b09af4aeadf3a445b633","other":"a9fa28117a4b6906b5ce3931573e0a19eec3cb4fcd9141be2d258a2be06f3b61","up":true},{"one":"f005a4d3453d52434f2b5be4006e653b50b52ad31926d654722fc3df00f1689c","other":"82847a4af4f50622650d035f69151b202bccd5fc92302a617602c974603ed997","up":true},{"one":"a9fa28117a4b6906b5ce3931573e0a19eec3cb4fcd9141be2d258a2be06f3b61","other":"8012a7af71d76d882202cf9372523478ccebea23443006c7f29c2a83106cd1b3","up":true},{"one":"08077c0ce8d4130c14464493e9164a8bae61b4646b1ec48899e75f2f6f9b8c66","other":"3871492c8c62cd74cbe65a993669e4978cc641879a5223dd6b9e687f050a1c40","up":true},{"one":"64e642de2667a7563c774050d368858d99aff433efbd1cb68361e3e244629b03","other":"62f007c92a8af466e90ed0b1e5e71a955ad273ec793948ddfc03977f131ed2d1","up":true},{"one":"01a63575c384f686e5739e1bd079e4a4c55421cd6d89b944e2c61dd174fa2bf6","other":"d9d30b9b212bd4811a44ebe304ba3935ead3abe3247f99893faf65664131c29d","up":true},{"one":"73d0d1d4a2b7250f51e57c13cc48bc6b20682320ce12ee8e5765afeef7d9de42","other":"a86117147b78f20a6d883d37715da85178cad89eff650a74aa89e7bc11bc45a7","up":true},{"one":"b4e29de4bd5751f31195ead8aa1548d305a53fb4f99be9931850e6273de8f359","other":"cabfdfb789cc20962eaba1dbe68d6dc0466e699d22dc5b29f27a5cd555398795","up":true},{"one":"36d5952685c95e42bef14f77b63705897ca71d24d21e4e9efc772d9cabd21122","other":"47753fdca855ea79abf667b50aa9c90a132d44bdd1572c3e3c411c8ee7e5b5f4","up":true},{"one":"a9fa28117a4b6906b5ce3931573e0a19eec3cb4fcd9141be2d258a2be06f3b61","other":"e06f58b144faa650f96465825d253b63d7e061e3a3c4228ad5e1b665afbccc37","up":true},{"one":"2471776037d55a05df2b15bcefe52cb1f4c942e9e15113abc2a0c1fcbaa5d626","other":"836e65dfe6f01e1d2934655c1846cb86fed6e41ea951a109d7a20bb14cb4c10a","up":true},{"one":"a86117147b78f20a6d883d37715da85178cad89eff650a74aa89e7bc11bc45a7","other":"a1929f704664ca85d829ac3bab62e688647a7cfdcbc9f03c61b0124cf9093505","up":true},{"one":"62f007c92a8af466e90ed0b1e5e71a955ad273ec793948ddfc03977f131ed2d1","other":"75e282c0f3d355a40573e6578c5aac98e7262970a9239f4dcefd26d6f008b553","up":true},{"one":"22bbb3236a5e0a1947a1c4735aaacf9122173789a02a06e7653103bdcae2f823","other":"01a63575c384f686e5739e1bd079e4a4c55421cd6d89b944e2c61dd174fa2bf6","up":true},{"one":"deec6a8beb4e5e441dd42311354194c3bef9448e8859b4ccd401645b69217d12","other":"0f3106adfe70aefb474c4a98a95932307391de2cb70fbd2e11dd31c9e695ed83","up":true},{"one":"5cc1c28eafd9758e807a28159a1a7a6ea313fa7e878fde5d47fcc8f5a5c25172","other":"7bcb0d7b9f84aed413cf9b2a7851ba6d1138d85382aa20e6c939a43c8e59c034","up":true},{"one":"bd9607d5f57f7b6f74f4ad981be368988ef48b5f31e3fd96cab3bb790d568150","other":"f005a4d3453d52434f2b5be4006e653b50b52ad31926d654722fc3df00f1689c","up":true},{"one":"8b35236da99930bf8f5ef6c7555bb18b80ce2e34361bbbfd6baf55a6483e54ff","other":"1929b01c0f85af7452a0f358b54f6b36640a196b366909172af594a1648fe64c","up":true},{"one":"7bee7967ff7b07243bed55b6d060d5ec2a1f28b530ed65cd055dc5b468a0f878","other":"27b56302a89605a83563ba7b66d491ec25edfad0ea1010937fcadeab4d3ae582","up":true},{"one":"efd68d2c99346ca085c9ef896bee6125ad8638413295108f3a92b247a41ca629","other":"e06f58b144faa650f96465825d253b63d7e061e3a3c4228ad5e1b665afbccc37","up":true},{"one":"b2453c6e755a30efb91194fa607b3352d75b6905c448b09af4aeadf3a445b633","other":"45895aff674079f6be02e4cc74914d63125c3fe48bb69056c070c71319fea1fa","up":true},{"one":"672a566c7c2aeb1d91e6ee4e43984050df8b9560d923d60dc1fb23fb73b1a046","other":"7bcb0d7b9f84aed413cf9b2a7851ba6d1138d85382aa20e6c939a43c8e59c034","up":true},{"one":"eceb7dc532596e8b68074113db9605e3d15cb15e2e80f75f1a66d95a1221c7dc","other":"e06f58b144faa650f96465825d253b63d7e061e3a3c4228ad5e1b665afbccc37","up":true},{"one":"52b47d52bf4a1afda1604b7942019c8d2ac4c760c5eb4597e1ce2dd7a8e1cf4d","other":"4bc8dfbf84794d26d7a573c9d898974eaa3a2167e19cb7a8aa460807a603acd4","up":true},{"one":"be0fb2b440b91e719c20f51b673eb9f2f66c7af77b0b0ade312998cdffcc5045","other":"17406dea5046f00e27eaf74e166a945c9485139d6edcdfcd84f5b03f50eedd0a","up":true},{"one":"c2f9b4abed9c6a839fe4c03a80bd396fd187a8784ba47a83687d3a54b7e2eddf","other":"f33c07a818863a358358989ec71504abad3ca0a7c81b54aad59075a766fad501","up":true},{"one":"01a63575c384f686e5739e1bd079e4a4c55421cd6d89b944e2c61dd174fa2bf6","other":"13853407d278a45e15d4b148fc38ebb35c4f58ee552ee0e4401c6c98c45b8e3e","up":true},{"one":"f4a0f76b30bcf5987cfa3f4f4b0aa3445f39d60a1f51519fa660c27b5d833dde","other":"4efaabab0d5dc59f098aee4dba3868263411a55615a2c474a73e6eec2211decc","up":true},{"one":"4a373571475e2b4c280d2d4b22f10a249ee09fcf907f52081ec0398a8b5ea6f2","other":"5cc1c28eafd9758e807a28159a1a7a6ea313fa7e878fde5d47fcc8f5a5c25172","up":true},{"one":"4bc8dfbf84794d26d7a573c9d898974eaa3a2167e19cb7a8aa460807a603acd4","other":"fac808b79923931febd54e3611b79811b3973c777e7502bd56b9803d0c4bf785","up":true},{"one":"836e65dfe6f01e1d2934655c1846cb86fed6e41ea951a109d7a20bb14cb4c10a","other":"fa655b4882579e65937a14ab1c6bcba021580f0a5ebc04c48424f5ae72b7d5b4","up":true},{"one":"4cc2386a86fd210bf699c6d93173b0879c3210d46f572a62bb154cb60a7d2cb1","other":"c9ef56afed2d40db396ad39d6f5f5f38f4058b6b0d1e02b71d6aa92dbeaf7df7","up":true},{"one":"b8695bec6c8e1e6794bb943b83629cd2c910067e6e178f6f8e33c4f0fa2d74f4","other":"4d750666dc0e9e2c244c43492801c1d7ec6208954a0cb5f8bb793b912440753a","up":true},{"one":"45895aff674079f6be02e4cc74914d63125c3fe48bb69056c070c71319fea1fa","other":"e06f58b144faa650f96465825d253b63d7e061e3a3c4228ad5e1b665afbccc37","up":true},{"one":"f005a4d3453d52434f2b5be4006e653b50b52ad31926d654722fc3df00f1689c","other":"b4e29de4bd5751f31195ead8aa1548d305a53fb4f99be9931850e6273de8f359","up":true},{"one":"58a90b58858417a4e972626421ed8e78b1b3e5ac69fcedd22c58a8ab4c6147df","other":"c2f9b4abed9c6a839fe4c03a80bd396fd187a8784ba47a83687d3a54b7e2eddf","up":true},{"one":"216e0370111e2e03927b803ae788f9947de8e241d41dbf6a70983cf0ecd68af1","other":"4bc8dfbf84794d26d7a573c9d898974eaa3a2167e19cb7a8aa460807a603acd4","up":true},{"one":"d23c97bebcde26f5e351c4b975c76aaf604fd206f9b9063ecbda538e7a52f514","other":"957ed6194e6ef56e9696be43a1a0258f2ba4f48f56d790e42bd0663c3fc6aaae","up":true},{"one":"f177ee6767a78a57b725dbe67ec377f507f5777d345a28892b0fbfb800dc443a","other":"f3d50811ef10661d3ef9978077cd7181387298f306833ab6e27f25cbb77435cd","up":true},{"one":"3e1959b29bbacb3ce7dccfa41c3e51b87f1afc700a3c6e4713c38cc0fe3790df","other":"3590afcd10fb8f58c39f72068661d9a772b77e0efd57bbd60306632fb048fa3a","up":true},{"one":"03eb2e92ed0923f696269e7a03fec731d8c3f8df278023a9cb00867b533a3ca3","other":"45895aff674079f6be02e4cc74914d63125c3fe48bb69056c070c71319fea1fa","up":true},{"one":"5be6df23201fc5c00be650849c8bfe5581e44033ef19012836f97c98f3954471","other":"bddbdff3cbd22fcedddc07de27125819aac72be72c3126ba898621c496cb95a2","up":true},{"one":"bd486e1e15df4c7539b1ad5b54f7566dd4836a430e9f7d3503881fa79e258d9b","other":"bddbdff3cbd22fcedddc07de27125819aac72be72c3126ba898621c496cb95a2","up":true},{"one":"b8695bec6c8e1e6794bb943b83629cd2c910067e6e178f6f8e33c4f0fa2d74f4","other":"f611d8039385ad56260ab391763e3627aadd2756565fedc3ec95f76124da0efc","up":true},{"one":"77eedcac0c847b1d693ddff07c5868afb1c2008b2dcb48a0299143ab14611969","other":"72a76f668d9b923914860eb4f8577bc98c153f6dd222cd36a0bbdef2bab7f068","up":true},{"one":"6450bb5e880411abcb60258d8560949f6f70d92ba7bfa9a4d7845463c48dab30","other":"034de66774eda26b93e342c9b94b9deaeb6297650c819b144a5832bebfe6b02f","up":true},{"one":"08077c0ce8d4130c14464493e9164a8bae61b4646b1ec48899e75f2f6f9b8c66","other":"75e282c0f3d355a40573e6578c5aac98e7262970a9239f4dcefd26d6f008b553","up":true},{"one":"27db66d13ee8168aca89786febd6971dd1d6c554bca8501052065cb47631560d","other":"13853407d278a45e15d4b148fc38ebb35c4f58ee552ee0e4401c6c98c45b8e3e","up":true},{"one":"73d0d1d4a2b7250f51e57c13cc48bc6b20682320ce12ee8e5765afeef7d9de42","other":"b9d906e406b0fc6078c22bbc173043df1f7581061b4f6ccd769bc568d94b4339","up":true},{"one":"6daaf515999c9a3491c963f76be82ed6005616bf7ba98247b01d6a89a9af1d71","other":"034de66774eda26b93e342c9b94b9deaeb6297650c819b144a5832bebfe6b02f","up":true},{"one":"72a76f668d9b923914860eb4f8577bc98c153f6dd222cd36a0bbdef2bab7f068","other":"f177ee6767a78a57b725dbe67ec377f507f5777d345a28892b0fbfb800dc443a","up":true},{"one":"b3555baa764c4562935b93533ee6c5a6df631e846c3ab512fdb1d6b901a68c60","other":"1929b01c0f85af7452a0f358b54f6b36640a196b366909172af594a1648fe64c","up":true},{"one":"f3d50811ef10661d3ef9978077cd7181387298f306833ab6e27f25cbb77435cd","other":"efd68d2c99346ca085c9ef896bee6125ad8638413295108f3a92b247a41ca629","up":true},{"one":"ea3d6aa50ad5a1d5647d213f9b5cfe6718339eec7eef8644487eb3c223c7bcde","other":"45895aff674079f6be02e4cc74914d63125c3fe48bb69056c070c71319fea1fa","up":true},{"one":"4746379212b91ee1c13c1336e8f3a73a84408b7636c222c11bd27ce7d724e6c6","other":"08077c0ce8d4130c14464493e9164a8bae61b4646b1ec48899e75f2f6f9b8c66","up":true},{"one":"ed12c78e700bf805669c48a5d62f1e56791263c4b2ce5bd34587ea9bc931a3e5","other":"d125317b492df46a7dd496d30c6d07839ed6bfa196abde4886ce7bc8f9b5c01f","up":true},{"one":"957ed6194e6ef56e9696be43a1a0258f2ba4f48f56d790e42bd0663c3fc6aaae","other":"8330e2b8ae2f184bb8dc5e153fafa4dafe86f84ec692d3ee91413cc07b1cd9e2","up":true},{"one":"5cc1c28eafd9758e807a28159a1a7a6ea313fa7e878fde5d47fcc8f5a5c25172","other":"772a79302528fdce6a216c98c95e281333292c81dfe490aeaa4a78bfeb1980c8","up":true},{"one":"7bcb0d7b9f84aed413cf9b2a7851ba6d1138d85382aa20e6c939a43c8e59c034","other":"d18a1edd26661069fb401fee8aa85a9614a3188e2e0666bfe9307f91d29aad49","up":true},{"one":"fac808b79923931febd54e3611b79811b3973c777e7502bd56b9803d0c4bf785","other":"772a79302528fdce6a216c98c95e281333292c81dfe490aeaa4a78bfeb1980c8","up":true},{"one":"b4e29de4bd5751f31195ead8aa1548d305a53fb4f99be9931850e6273de8f359","other":"dd92b3d42414fd5eff5c1e4ca55c63cd7036634049995b72a20cdf7ca1321978","up":true},{"one":"2471776037d55a05df2b15bcefe52cb1f4c942e9e15113abc2a0c1fcbaa5d626","other":"8330e2b8ae2f184bb8dc5e153fafa4dafe86f84ec692d3ee91413cc07b1cd9e2","up":true},{"one":"0f3106adfe70aefb474c4a98a95932307391de2cb70fbd2e11dd31c9e695ed83","other":"d9d30b9b212bd4811a44ebe304ba3935ead3abe3247f99893faf65664131c29d","up":true},{"one":"acf888ed781f5358493e2e5048691acc39eac3240ca9e9093bb4052b1f624325","other":"aba793e635f71169105ad073225cc8db914de6b711fe9f22c5d94ac8cb85e2eb","up":true},{"one":"01a63575c384f686e5739e1bd079e4a4c55421cd6d89b944e2c61dd174fa2bf6","other":"cc5fa2d49210e240983b0853ff15003f0d366f05cb1f6486bae2862cca852cc5","up":true},{"one":"6daaf515999c9a3491c963f76be82ed6005616bf7ba98247b01d6a89a9af1d71","other":"3871492c8c62cd74cbe65a993669e4978cc641879a5223dd6b9e687f050a1c40","up":true},{"one":"5be6df23201fc5c00be650849c8bfe5581e44033ef19012836f97c98f3954471","other":"bc29a0d9b60f3e2c34224cec187cf44eadc4628086d5594666ed025da71e7e7a","up":true},{"one":"8b35236da99930bf8f5ef6c7555bb18b80ce2e34361bbbfd6baf55a6483e54ff","other":"3871492c8c62cd74cbe65a993669e4978cc641879a5223dd6b9e687f050a1c40","up":true},{"one":"27db66d13ee8168aca89786febd6971dd1d6c554bca8501052065cb47631560d","other":"3871492c8c62cd74cbe65a993669e4978cc641879a5223dd6b9e687f050a1c40","up":true},{"one":"22bbb3236a5e0a1947a1c4735aaacf9122173789a02a06e7653103bdcae2f823","other":"0a215c7765be2caebf76ad3e8017bbc2aaadf8e0dd4859af781953a0564c5d59","up":true},{"one":"bde90aaa0f1f7a7eb965ff308718d29b55a80b1ca84dfba16c169eabe2b0d5de","other":"b4e29de4bd5751f31195ead8aa1548d305a53fb4f99be9931850e6273de8f359","up":true},{"one":"b2453c6e755a30efb91194fa607b3352d75b6905c448b09af4aeadf3a445b633","other":"4746379212b91ee1c13c1336e8f3a73a84408b7636c222c11bd27ce7d724e6c6","up":true},{"one":"64e642de2667a7563c774050d368858d99aff433efbd1cb68361e3e244629b03","other":"75e282c0f3d355a40573e6578c5aac98e7262970a9239f4dcefd26d6f008b553","up":true},{"one":"be0fb2b440b91e719c20f51b673eb9f2f66c7af77b0b0ade312998cdffcc5045","other":"37751f279493dc5ce5b5c3c55a6ec2e4119eedefe1069b283f6ff8c7bc9d1411","up":true},{"one":"fa9a809f016097d949fa1463a1c8f08871c7d38e60b7df6d3e28ab04ccd3a143","other":"ed2ec6681bf325887768703779ccf3a6278731118cd3ec890490a3de50f689ac","up":true},{"one":"d18a1edd26661069fb401fee8aa85a9614a3188e2e0666bfe9307f91d29aad49","other":"deec6a8beb4e5e441dd42311354194c3bef9448e8859b4ccd401645b69217d12","up":true},{"one":"b5fc43e8c0df3279d6a12cd8b03012cb8d2205208324018c7ae725745a99a2f3","other":"947205fd85a17330a6d5c51a66548c5f69779c76ab12408f8fc6d33d7c6b8e9d","up":true},{"one":"f005a4d3453d52434f2b5be4006e653b50b52ad31926d654722fc3df00f1689c","other":"b2453c6e755a30efb91194fa607b3352d75b6905c448b09af4aeadf3a445b633","up":true},{"one":"bc71f3e409edb989e26607448491530c5451053b582ea64d882525451ac940bb","other":"bddbdff3cbd22fcedddc07de27125819aac72be72c3126ba898621c496cb95a2","up":true},{"one":"f3d50811ef10661d3ef9978077cd7181387298f306833ab6e27f25cbb77435cd","other":"ee2b0aff61a9846d13de3a72712ef0bf3ca42ad8da57e81759c242797258efec","up":true},{"one":"b60e77c40ddc9dc78a4ad346add37e60f10f2999de836615db53524487d1ede9","other":"947205fd85a17330a6d5c51a66548c5f69779c76ab12408f8fc6d33d7c6b8e9d","up":true},{"one":"62f007c92a8af466e90ed0b1e5e71a955ad273ec793948ddfc03977f131ed2d1","other":"72a53f0fb1b51855cb4054a39cbd1309a76a862d36e18af9ba0456a60325c06e","up":true},{"one":"ea3d6aa50ad5a1d5647d213f9b5cfe6718339eec7eef8644487eb3c223c7bcde","other":"4746379212b91ee1c13c1336e8f3a73a84408b7636c222c11bd27ce7d724e6c6","up":true},{"one":"efd68d2c99346ca085c9ef896bee6125ad8638413295108f3a92b247a41ca629","other":"ea3d6aa50ad5a1d5647d213f9b5cfe6718339eec7eef8644487eb3c223c7bcde","up":true},{"one":"6450bb5e880411abcb60258d8560949f6f70d92ba7bfa9a4d7845463c48dab30","other":"13853407d278a45e15d4b148fc38ebb35c4f58ee552ee0e4401c6c98c45b8e3e","up":true},{"one":"4a3c39f044c425c153d4900db30f839d7866c8e0f4f4d38d9205e67fb540988e","other":"fa655b4882579e65937a14ab1c6bcba021580f0a5ebc04c48424f5ae72b7d5b4","up":true},{"one":"221cd8ea0a26f0d3f81f782f1de390282415ecd9cf40224b4945a00897895b4e","other":"0f3106adfe70aefb474c4a98a95932307391de2cb70fbd2e11dd31c9e695ed83","up":true},{"one":"5a8ba4047c4456e825bd1b34c961f5c7f37bf7c27bc48bee71b8430c7d135486","other":"4bc8dfbf84794d26d7a573c9d898974eaa3a2167e19cb7a8aa460807a603acd4","up":true},{"one":"672a566c7c2aeb1d91e6ee4e43984050df8b9560d923d60dc1fb23fb73b1a046","other":"72a76f668d9b923914860eb4f8577bc98c153f6dd222cd36a0bbdef2bab7f068","up":true},{"one":"c0adf394af7d5670c1ce8c6bea292fbc03c56ae2b636e2f303311a455bb3500f","other":"8b35236da99930bf8f5ef6c7555bb18b80ce2e34361bbbfd6baf55a6483e54ff","up":true},{"one":"08077c0ce8d4130c14464493e9164a8bae61b4646b1ec48899e75f2f6f9b8c66","other":"68a63ebc4833dedfdb6d534438ffcccd042f60434bee0e39f4cb3726e7413e7a","up":true},{"one":"7bee7967ff7b07243bed55b6d060d5ec2a1f28b530ed65cd055dc5b468a0f878","other":"51c285489ff14628268ae886945e1cd2da64c6a0a8cb184aada98567ab429b6e","up":true},{"one":"bc71f3e409edb989e26607448491530c5451053b582ea64d882525451ac940bb","other":"947205fd85a17330a6d5c51a66548c5f69779c76ab12408f8fc6d33d7c6b8e9d","up":true},{"one":"836e65dfe6f01e1d2934655c1846cb86fed6e41ea951a109d7a20bb14cb4c10a","other":"fa9a809f016097d949fa1463a1c8f08871c7d38e60b7df6d3e28ab04ccd3a143","up":true},{"one":"bd9607d5f57f7b6f74f4ad981be368988ef48b5f31e3fd96cab3bb790d568150","other":"f33c07a818863a358358989ec71504abad3ca0a7c81b54aad59075a766fad501","up":true},{"one":"4a3c39f044c425c153d4900db30f839d7866c8e0f4f4d38d9205e67fb540988e","other":"e06f58b144faa650f96465825d253b63d7e061e3a3c4228ad5e1b665afbccc37","up":true},{"one":"b3555baa764c4562935b93533ee6c5a6df631e846c3ab512fdb1d6b901a68c60","other":"184e9e00ab4fe1669d4d99fb33d418d33eff927da38cc997f69679443c24b20b","up":true},{"one":"5cc1c28eafd9758e807a28159a1a7a6ea313fa7e878fde5d47fcc8f5a5c25172","other":"73d0d1d4a2b7250f51e57c13cc48bc6b20682320ce12ee8e5765afeef7d9de42","up":true},{"one":"2dd4ad83effc3ba73e72f5659583e5987241bda563563200b50c46cce00a1d9b","other":"37751f279493dc5ce5b5c3c55a6ec2e4119eedefe1069b283f6ff8c7bc9d1411","up":true},{"one":"221cd8ea0a26f0d3f81f782f1de390282415ecd9cf40224b4945a00897895b4e","other":"27db66d13ee8168aca89786febd6971dd1d6c554bca8501052065cb47631560d","up":true},{"one":"47753fdca855ea79abf667b50aa9c90a132d44bdd1572c3e3c411c8ee7e5b5f4","other":"2d531c50183f0115269b3feaecf45927a3ac44e1be2a263c7e5d2274d8379b1c","up":true},{"one":"03eb2e92ed0923f696269e7a03fec731d8c3f8df278023a9cb00867b533a3ca3","other":"459b9fb2b7f4e396de8cf8740a6804c8e5b96ca11ffa2b5106c14dfbbab65c95","up":true},{"one":"4bc8dfbf84794d26d7a573c9d898974eaa3a2167e19cb7a8aa460807a603acd4","other":"72a76f668d9b923914860eb4f8577bc98c153f6dd222cd36a0bbdef2bab7f068","up":true},{"one":"b4e29de4bd5751f31195ead8aa1548d305a53fb4f99be9931850e6273de8f359","other":"d23c97bebcde26f5e351c4b975c76aaf604fd206f9b9063ecbda538e7a52f514","up":true},{"one":"4d750666dc0e9e2c244c43492801c1d7ec6208954a0cb5f8bb793b912440753a","other":"4c211c117e555c2ac831d5688615b6b4c5e31f1d7c7906b34f0cbcdbc45482b4","up":true},{"one":"45895aff674079f6be02e4cc74914d63125c3fe48bb69056c070c71319fea1fa","other":"eceb7dc532596e8b68074113db9605e3d15cb15e2e80f75f1a66d95a1221c7dc","up":true},{"one":"bd486e1e15df4c7539b1ad5b54f7566dd4836a430e9f7d3503881fa79e258d9b","other":"b9d906e406b0fc6078c22bbc173043df1f7581061b4f6ccd769bc568d94b4339","up":true},{"one":"5be6df23201fc5c00be650849c8bfe5581e44033ef19012836f97c98f3954471","other":"947205fd85a17330a6d5c51a66548c5f69779c76ab12408f8fc6d33d7c6b8e9d","up":true},{"one":"2471776037d55a05df2b15bcefe52cb1f4c942e9e15113abc2a0c1fcbaa5d626","other":"a86117147b78f20a6d883d37715da85178cad89eff650a74aa89e7bc11bc45a7","up":true},{"one":"0a215c7765be2caebf76ad3e8017bbc2aaadf8e0dd4859af781953a0564c5d59","other":"127c89eae94b195df2eb5eb7b44f634adb73c114d2089cd904b56988c8674e11","up":true},{"one":"03eb2e92ed0923f696269e7a03fec731d8c3f8df278023a9cb00867b533a3ca3","other":"47753fdca855ea79abf667b50aa9c90a132d44bdd1572c3e3c411c8ee7e5b5f4","up":true},{"one":"c0adf394af7d5670c1ce8c6bea292fbc03c56ae2b636e2f303311a455bb3500f","other":"947205fd85a17330a6d5c51a66548c5f69779c76ab12408f8fc6d33d7c6b8e9d","up":true},{"one":"72a76f668d9b923914860eb4f8577bc98c153f6dd222cd36a0bbdef2bab7f068","other":"c9ef56afed2d40db396ad39d6f5f5f38f4058b6b0d1e02b71d6aa92dbeaf7df7","up":true},{"one":"bd9607d5f57f7b6f74f4ad981be368988ef48b5f31e3fd96cab3bb790d568150","other":"f611d8039385ad56260ab391763e3627aadd2756565fedc3ec95f76124da0efc","up":true},{"one":"b2453c6e755a30efb91194fa607b3352d75b6905c448b09af4aeadf3a445b633","other":"72a53f0fb1b51855cb4054a39cbd1309a76a862d36e18af9ba0456a60325c06e","up":true},{"one":"47753fdca855ea79abf667b50aa9c90a132d44bdd1572c3e3c411c8ee7e5b5f4","other":"2354d3af5c6dca05d7dc212b100112f37ab29fb8b3f4319887230a4d420f5d9d","up":true},{"one":"5a8ba4047c4456e825bd1b34c961f5c7f37bf7c27bc48bee71b8430c7d135486","other":"52b47d52bf4a1afda1604b7942019c8d2ac4c760c5eb4597e1ce2dd7a8e1cf4d","up":true},{"one":"08077c0ce8d4130c14464493e9164a8bae61b4646b1ec48899e75f2f6f9b8c66","other":"62f007c92a8af466e90ed0b1e5e71a955ad273ec793948ddfc03977f131ed2d1","up":true},{"one":"216e0370111e2e03927b803ae788f9947de8e241d41dbf6a70983cf0ecd68af1","other":"4efaabab0d5dc59f098aee4dba3868263411a55615a2c474a73e6eec2211decc","up":true},{"one":"836e65dfe6f01e1d2934655c1846cb86fed6e41ea951a109d7a20bb14cb4c10a","other":"fac808b79923931febd54e3611b79811b3973c777e7502bd56b9803d0c4bf785","up":true},{"one":"4efaabab0d5dc59f098aee4dba3868263411a55615a2c474a73e6eec2211decc","other":"45895aff674079f6be02e4cc74914d63125c3fe48bb69056c070c71319fea1fa","up":true},{"one":"d23c97bebcde26f5e351c4b975c76aaf604fd206f9b9063ecbda538e7a52f514","other":"8012a7af71d76d882202cf9372523478ccebea23443006c7f29c2a83106cd1b3","up":true},{"one":"6daaf515999c9a3491c963f76be82ed6005616bf7ba98247b01d6a89a9af1d71","other":"3b830c2ae5463ca2f2260176b77b8dda23048257aa780255c69cf1bbbc6fb64c","up":true},{"one":"772a79302528fdce6a216c98c95e281333292c81dfe490aeaa4a78bfeb1980c8","other":"f33c07a818863a358358989ec71504abad3ca0a7c81b54aad59075a766fad501","up":true},{"one":"fac808b79923931febd54e3611b79811b3973c777e7502bd56b9803d0c4bf785","other":"47753fdca855ea79abf667b50aa9c90a132d44bdd1572c3e3c411c8ee7e5b5f4","up":true},{"one":"ee2b0aff61a9846d13de3a72712ef0bf3ca42ad8da57e81759c242797258efec","other":"62f007c92a8af466e90ed0b1e5e71a955ad273ec793948ddfc03977f131ed2d1","up":true},{"one":"7bcb0d7b9f84aed413cf9b2a7851ba6d1138d85382aa20e6c939a43c8e59c034","other":"fa655b4882579e65937a14ab1c6bcba021580f0a5ebc04c48424f5ae72b7d5b4","up":true},{"one":"0a215c7765be2caebf76ad3e8017bbc2aaadf8e0dd4859af781953a0564c5d59","other":"0639f010834f5bc497798f2d275bbc60bfbcd53c83e38986b7260310c6001420","up":true},{"one":"f005a4d3453d52434f2b5be4006e653b50b52ad31926d654722fc3df00f1689c","other":"b3555baa764c4562935b93533ee6c5a6df631e846c3ab512fdb1d6b901a68c60","up":true},{"one":"f4a0f76b30bcf5987cfa3f4f4b0aa3445f39d60a1f51519fa660c27b5d833dde","other":"4bc8dfbf84794d26d7a573c9d898974eaa3a2167e19cb7a8aa460807a603acd4","up":true},{"one":"f177ee6767a78a57b725dbe67ec377f507f5777d345a28892b0fbfb800dc443a","other":"f005a4d3453d52434f2b5be4006e653b50b52ad31926d654722fc3df00f1689c","up":true},{"one":"73d0d1d4a2b7250f51e57c13cc48bc6b20682320ce12ee8e5765afeef7d9de42","other":"bd486e1e15df4c7539b1ad5b54f7566dd4836a430e9f7d3503881fa79e258d9b","up":true},{"one":"459b9fb2b7f4e396de8cf8740a6804c8e5b96ca11ffa2b5106c14dfbbab65c95","other":"77eedcac0c847b1d693ddff07c5868afb1c2008b2dcb48a0299143ab14611969","up":true},{"one":"c52a68d8388a21013e4eecef9ea866db1f5eb16bbe0ecc82b8bfafd33e4e014f","other":"58a90b58858417a4e972626421ed8e78b1b3e5ac69fcedd22c58a8ab4c6147df","up":true},{"one":"f3d50811ef10661d3ef9978077cd7181387298f306833ab6e27f25cbb77435cd","other":"ed2ec6681bf325887768703779ccf3a6278731118cd3ec890490a3de50f689ac","up":true},{"one":"be0fb2b440b91e719c20f51b673eb9f2f66c7af77b0b0ade312998cdffcc5045","other":"ed2ec6681bf325887768703779ccf3a6278731118cd3ec890490a3de50f689ac","up":true},{"one":"acf888ed781f5358493e2e5048691acc39eac3240ca9e9093bb4052b1f624325","other":"a9fa28117a4b6906b5ce3931573e0a19eec3cb4fcd9141be2d258a2be06f3b61","up":true},{"one":"8b35236da99930bf8f5ef6c7555bb18b80ce2e34361bbbfd6baf55a6483e54ff","other":"3590afcd10fb8f58c39f72068661d9a772b77e0efd57bbd60306632fb048fa3a","up":true},{"one":"45895aff674079f6be02e4cc74914d63125c3fe48bb69056c070c71319fea1fa","other":"ed2ec6681bf325887768703779ccf3a6278731118cd3ec890490a3de50f689ac","up":true},{"one":"f4a0f76b30bcf5987cfa3f4f4b0aa3445f39d60a1f51519fa660c27b5d833dde","other":"4a373571475e2b4c280d2d4b22f10a249ee09fcf907f52081ec0398a8b5ea6f2","up":true},{"one":"72a76f668d9b923914860eb4f8577bc98c153f6dd222cd36a0bbdef2bab7f068","other":"ce01234661309127bb872d69d38dc5bf19bc4de2e0a0b5041cd362d073df4ff8","up":true},{"one":"4a3c39f044c425c153d4900db30f839d7866c8e0f4f4d38d9205e67fb540988e","other":"eb01ff80307afbfc7457c96594cd4ba4d00acb7fd25a7571d1223168bd66ff09","up":true},{"one":"216e0370111e2e03927b803ae788f9947de8e241d41dbf6a70983cf0ecd68af1","other":"4c211c117e555c2ac831d5688615b6b4c5e31f1d7c7906b34f0cbcdbc45482b4","up":true},{"one":"aba793e635f71169105ad073225cc8db914de6b711fe9f22c5d94ac8cb85e2eb","other":"a1929f704664ca85d829ac3bab62e688647a7cfdcbc9f03c61b0124cf9093505","up":true},{"one":"0f3106adfe70aefb474c4a98a95932307391de2cb70fbd2e11dd31c9e695ed83","other":"cc5fa2d49210e240983b0853ff15003f0d366f05cb1f6486bae2862cca852cc5","up":true},{"one":"772a79302528fdce6a216c98c95e281333292c81dfe490aeaa4a78bfeb1980c8","other":"ce01234661309127bb872d69d38dc5bf19bc4de2e0a0b5041cd362d073df4ff8","up":true},{"one":"73d0d1d4a2b7250f51e57c13cc48bc6b20682320ce12ee8e5765afeef7d9de42","other":"be0fb2b440b91e719c20f51b673eb9f2f66c7af77b0b0ade312998cdffcc5045","up":true},{"one":"bc71f3e409edb989e26607448491530c5451053b582ea64d882525451ac940bb","other":"957ed6194e6ef56e9696be43a1a0258f2ba4f48f56d790e42bd0663c3fc6aaae","up":true},{"one":"fa9a809f016097d949fa1463a1c8f08871c7d38e60b7df6d3e28ab04ccd3a143","other":"ea3d6aa50ad5a1d5647d213f9b5cfe6718339eec7eef8644487eb3c223c7bcde","up":true},{"one":"ee2b0aff61a9846d13de3a72712ef0bf3ca42ad8da57e81759c242797258efec","other":"68a63ebc4833dedfdb6d534438ffcccd042f60434bee0e39f4cb3726e7413e7a","up":true},{"one":"4bc8dfbf84794d26d7a573c9d898974eaa3a2167e19cb7a8aa460807a603acd4","other":"641a165f8be0eee36f53c12bae8e2a34a709adb8d1dcd667e88e4e90c9ee2401","up":true},{"one":"bd486e1e15df4c7539b1ad5b54f7566dd4836a430e9f7d3503881fa79e258d9b","other":"bde90aaa0f1f7a7eb965ff308718d29b55a80b1ca84dfba16c169eabe2b0d5de","up":true},{"one":"bde90aaa0f1f7a7eb965ff308718d29b55a80b1ca84dfba16c169eabe2b0d5de","other":"b2453c6e755a30efb91194fa607b3352d75b6905c448b09af4aeadf3a445b633","up":true},{"one":"b3555baa764c4562935b93533ee6c5a6df631e846c3ab512fdb1d6b901a68c60","other":"3e1959b29bbacb3ce7dccfa41c3e51b87f1afc700a3c6e4713c38cc0fe3790df","up":true},{"one":"ea3d6aa50ad5a1d5647d213f9b5cfe6718339eec7eef8644487eb3c223c7bcde","other":"47753fdca855ea79abf667b50aa9c90a132d44bdd1572c3e3c411c8ee7e5b5f4","up":true},{"one":"efd68d2c99346ca085c9ef896bee6125ad8638413295108f3a92b247a41ca629","other":"eceb7dc532596e8b68074113db9605e3d15cb15e2e80f75f1a66d95a1221c7dc","up":true},{"one":"6450bb5e880411abcb60258d8560949f6f70d92ba7bfa9a4d7845463c48dab30","other":"1929b01c0f85af7452a0f358b54f6b36640a196b366909172af594a1648fe64c","up":true},{"one":"47753fdca855ea79abf667b50aa9c90a132d44bdd1572c3e3c411c8ee7e5b5f4","other":"2471776037d55a05df2b15bcefe52cb1f4c942e9e15113abc2a0c1fcbaa5d626","up":true},{"one":"c52a68d8388a21013e4eecef9ea866db1f5eb16bbe0ecc82b8bfafd33e4e014f","other":"f177ee6767a78a57b725dbe67ec377f507f5777d345a28892b0fbfb800dc443a","up":true},{"one":"51c285489ff14628268ae886945e1cd2da64c6a0a8cb184aada98567ab429b6e","other":"4cc2386a86fd210bf699c6d93173b0879c3210d46f572a62bb154cb60a7d2cb1","up":true},{"one":"034de66774eda26b93e342c9b94b9deaeb6297650c819b144a5832bebfe6b02f","other":"0a215c7765be2caebf76ad3e8017bbc2aaadf8e0dd4859af781953a0564c5d59","up":true},{"one":"bc71f3e409edb989e26607448491530c5451053b582ea64d882525451ac940bb","other":"82847a4af4f50622650d035f69151b202bccd5fc92302a617602c974603ed997","up":true},{"one":"01a63575c384f686e5739e1bd079e4a4c55421cd6d89b944e2c61dd174fa2bf6","other":"cc9f65d734f1a3bbc6019e166fe355bd7fc33bb4887043a5ccf532a9ba356379","up":true},{"one":"08077c0ce8d4130c14464493e9164a8bae61b4646b1ec48899e75f2f6f9b8c66","other":"45895aff674079f6be02e4cc74914d63125c3fe48bb69056c070c71319fea1fa","up":true},{"one":"b60e77c40ddc9dc78a4ad346add37e60f10f2999de836615db53524487d1ede9","other":"bd9607d5f57f7b6f74f4ad981be368988ef48b5f31e3fd96cab3bb790d568150","up":true},{"one":"836e65dfe6f01e1d2934655c1846cb86fed6e41ea951a109d7a20bb14cb4c10a","other":"e06f58b144faa650f96465825d253b63d7e061e3a3c4228ad5e1b665afbccc37","up":true},{"one":"b5fc43e8c0df3279d6a12cd8b03012cb8d2205208324018c7ae725745a99a2f3","other":"bc29a0d9b60f3e2c34224cec187cf44eadc4628086d5594666ed025da71e7e7a","up":true},{"one":"d23c97bebcde26f5e351c4b975c76aaf604fd206f9b9063ecbda538e7a52f514","other":"82847a4af4f50622650d035f69151b202bccd5fc92302a617602c974603ed997","up":true},{"one":"6daaf515999c9a3491c963f76be82ed6005616bf7ba98247b01d6a89a9af1d71","other":"37751f279493dc5ce5b5c3c55a6ec2e4119eedefe1069b283f6ff8c7bc9d1411","up":true},{"one":"7bcb0d7b9f84aed413cf9b2a7851ba6d1138d85382aa20e6c939a43c8e59c034","other":"c52a68d8388a21013e4eecef9ea866db1f5eb16bbe0ecc82b8bfafd33e4e014f","up":true},{"one":"f611d8039385ad56260ab391763e3627aadd2756565fedc3ec95f76124da0efc","other":"bc29a0d9b60f3e2c34224cec187cf44eadc4628086d5594666ed025da71e7e7a","up":true},{"one":"772a79302528fdce6a216c98c95e281333292c81dfe490aeaa4a78bfeb1980c8","other":"c9ef56afed2d40db396ad39d6f5f5f38f4058b6b0d1e02b71d6aa92dbeaf7df7","up":true},{"one":"eceb7dc532596e8b68074113db9605e3d15cb15e2e80f75f1a66d95a1221c7dc","other":"fac808b79923931febd54e3611b79811b3973c777e7502bd56b9803d0c4bf785","up":true},{"one":"184e9e00ab4fe1669d4d99fb33d418d33eff927da38cc997f69679443c24b20b","other":"4d750666dc0e9e2c244c43492801c1d7ec6208954a0cb5f8bb793b912440753a","up":true},{"one":"22bbb3236a5e0a1947a1c4735aaacf9122173789a02a06e7653103bdcae2f823","other":"13853407d278a45e15d4b148fc38ebb35c4f58ee552ee0e4401c6c98c45b8e3e","up":true},{"one":"4cc2386a86fd210bf699c6d93173b0879c3210d46f572a62bb154cb60a7d2cb1","other":"4bc8dfbf84794d26d7a573c9d898974eaa3a2167e19cb7a8aa460807a603acd4","up":true},{"one":"0f3106adfe70aefb474c4a98a95932307391de2cb70fbd2e11dd31c9e695ed83","other":"cc9f65d734f1a3bbc6019e166fe355bd7fc33bb4887043a5ccf532a9ba356379","up":true},{"one":"f3d50811ef10661d3ef9978077cd7181387298f306833ab6e27f25cbb77435cd","other":"eb01ff80307afbfc7457c96594cd4ba4d00acb7fd25a7571d1223168bd66ff09","up":true},{"one":"f33c07a818863a358358989ec71504abad3ca0a7c81b54aad59075a766fad501","other":"f611d8039385ad56260ab391763e3627aadd2756565fedc3ec95f76124da0efc","up":true},{"one":"bc71f3e409edb989e26607448491530c5451053b582ea64d882525451ac940bb","other":"8fb8208b7167dd06cc08778b507ccd856751d3df6dfbaeac18b9f527b6628523","up":true},{"one":"fac808b79923931febd54e3611b79811b3973c777e7502bd56b9803d0c4bf785","other":"5be6df23201fc5c00be650849c8bfe5581e44033ef19012836f97c98f3954471","up":true},{"one":"2471776037d55a05df2b15bcefe52cb1f4c942e9e15113abc2a0c1fcbaa5d626","other":"acf888ed781f5358493e2e5048691acc39eac3240ca9e9093bb4052b1f624325","up":true},{"one":"5be6df23201fc5c00be650849c8bfe5581e44033ef19012836f97c98f3954471","other":"957ed6194e6ef56e9696be43a1a0258f2ba4f48f56d790e42bd0663c3fc6aaae","up":true},{"one":"8012a7af71d76d882202cf9372523478ccebea23443006c7f29c2a83106cd1b3","other":"b2453c6e755a30efb91194fa607b3352d75b6905c448b09af4aeadf3a445b633","up":true},{"one":"b4e29de4bd5751f31195ead8aa1548d305a53fb4f99be9931850e6273de8f359","other":"d18a1edd26661069fb401fee8aa85a9614a3188e2e0666bfe9307f91d29aad49","up":true},{"one":"5008ef55ad8088f70643b0f93bcb479531bcb0afe8e01b215dbf8597ec866369","other":"03eb2e92ed0923f696269e7a03fec731d8c3f8df278023a9cb00867b533a3ca3","up":true},{"one":"efd68d2c99346ca085c9ef896bee6125ad8638413295108f3a92b247a41ca629","other":"ed2ec6681bf325887768703779ccf3a6278731118cd3ec890490a3de50f689ac","up":true},{"one":"45895aff674079f6be02e4cc74914d63125c3fe48bb69056c070c71319fea1fa","other":"3b830c2ae5463ca2f2260176b77b8dda23048257aa780255c69cf1bbbc6fb64c","up":true},{"one":"bd9607d5f57f7b6f74f4ad981be368988ef48b5f31e3fd96cab3bb790d568150","other":"bc29a0d9b60f3e2c34224cec187cf44eadc4628086d5594666ed025da71e7e7a","up":true},{"one":"bc71f3e409edb989e26607448491530c5451053b582ea64d882525451ac940bb","other":"836e65dfe6f01e1d2934655c1846cb86fed6e41ea951a109d7a20bb14cb4c10a","up":true},{"one":"6daaf515999c9a3491c963f76be82ed6005616bf7ba98247b01d6a89a9af1d71","other":"0f3106adfe70aefb474c4a98a95932307391de2cb70fbd2e11dd31c9e695ed83","up":true},{"one":"4d750666dc0e9e2c244c43492801c1d7ec6208954a0cb5f8bb793b912440753a","other":"034de66774eda26b93e342c9b94b9deaeb6297650c819b144a5832bebfe6b02f","up":true},{"one":"73d0d1d4a2b7250f51e57c13cc48bc6b20682320ce12ee8e5765afeef7d9de42","other":"b5fc43e8c0df3279d6a12cd8b03012cb8d2205208324018c7ae725745a99a2f3","up":true},{"one":"f4a0f76b30bcf5987cfa3f4f4b0aa3445f39d60a1f51519fa660c27b5d833dde","other":"72a53f0fb1b51855cb4054a39cbd1309a76a862d36e18af9ba0456a60325c06e","up":true},{"one":"772a79302528fdce6a216c98c95e281333292c81dfe490aeaa4a78bfeb1980c8","other":"c2f9b4abed9c6a839fe4c03a80bd396fd187a8784ba47a83687d3a54b7e2eddf","up":true},{"one":"d125317b492df46a7dd496d30c6d07839ed6bfa196abde4886ce7bc8f9b5c01f","other":"deec6a8beb4e5e441dd42311354194c3bef9448e8859b4ccd401645b69217d12","up":true},{"one":"03eb2e92ed0923f696269e7a03fec731d8c3f8df278023a9cb00867b533a3ca3","other":"55fdad03303a746920773217c568a37d2004869ff34096fbe45197f71eba2b63","up":true},{"one":"72a76f668d9b923914860eb4f8577bc98c153f6dd222cd36a0bbdef2bab7f068","other":"c52a68d8388a21013e4eecef9ea866db1f5eb16bbe0ecc82b8bfafd33e4e014f","up":true},{"one":"b3555baa764c4562935b93533ee6c5a6df631e846c3ab512fdb1d6b901a68c60","other":"37751f279493dc5ce5b5c3c55a6ec2e4119eedefe1069b283f6ff8c7bc9d1411","up":true},{"one":"b2453c6e755a30efb91194fa607b3352d75b6905c448b09af4aeadf3a445b633","other":"75e282c0f3d355a40573e6578c5aac98e7262970a9239f4dcefd26d6f008b553","up":true},{"one":"58a90b58858417a4e972626421ed8e78b1b3e5ac69fcedd22c58a8ab4c6147df","other":"deec6a8beb4e5e441dd42311354194c3bef9448e8859b4ccd401645b69217d12","up":true},{"one":"5cc1c28eafd9758e807a28159a1a7a6ea313fa7e878fde5d47fcc8f5a5c25172","other":"72a76f668d9b923914860eb4f8577bc98c153f6dd222cd36a0bbdef2bab7f068","up":true},{"one":"2803f212eb4aa4f49224b16b2de88ba8652ad115321ee1e60cdbd926ecdad38a","other":"6450bb5e880411abcb60258d8560949f6f70d92ba7bfa9a4d7845463c48dab30","up":true},{"one":"0a215c7765be2caebf76ad3e8017bbc2aaadf8e0dd4859af781953a0564c5d59","other":"01a63575c384f686e5739e1bd079e4a4c55421cd6d89b944e2c61dd174fa2bf6","up":true},{"one":"69753865aacaaf72d9bf6d265c885d3f705804ff4b2675f7aa860641dacab2a0","other":"ee2b0aff61a9846d13de3a72712ef0bf3ca42ad8da57e81759c242797258efec","up":true},{"one":"8d3e0d9c6932d3422024394998e943309b679d667394d0eb622f0e208e7fcf0a","other":"bd9607d5f57f7b6f74f4ad981be368988ef48b5f31e3fd96cab3bb790d568150","up":true},{"one":"8d3e0d9c6932d3422024394998e943309b679d667394d0eb622f0e208e7fcf0a","other":"836e65dfe6f01e1d2934655c1846cb86fed6e41ea951a109d7a20bb14cb4c10a","up":true},{"one":"aedc9b478204effdcbad1a892333f15c061fbd1423b370f8a50f929b2a2f6952","other":"82847a4af4f50622650d035f69151b202bccd5fc92302a617602c974603ed997","up":true},{"one":"4bc8dfbf84794d26d7a573c9d898974eaa3a2167e19cb7a8aa460807a603acd4","other":"6450bb5e880411abcb60258d8560949f6f70d92ba7bfa9a4d7845463c48dab30","up":true},{"one":"eceb7dc532596e8b68074113db9605e3d15cb15e2e80f75f1a66d95a1221c7dc","other":"cc9f65d734f1a3bbc6019e166fe355bd7fc33bb4887043a5ccf532a9ba356379","up":true},{"one":"b5fc43e8c0df3279d6a12cd8b03012cb8d2205208324018c7ae725745a99a2f3","other":"bddbdff3cbd22fcedddc07de27125819aac72be72c3126ba898621c496cb95a2","up":true},{"one":"be0fb2b440b91e719c20f51b673eb9f2f66c7af77b0b0ade312998cdffcc5045","other":"eceb7dc532596e8b68074113db9605e3d15cb15e2e80f75f1a66d95a1221c7dc","up":true},{"one":"fa9a809f016097d949fa1463a1c8f08871c7d38e60b7df6d3e28ab04ccd3a143","other":"f177ee6767a78a57b725dbe67ec377f507f5777d345a28892b0fbfb800dc443a","up":true},{"one":"7bcb0d7b9f84aed413cf9b2a7851ba6d1138d85382aa20e6c939a43c8e59c034","other":"ce01234661309127bb872d69d38dc5bf19bc4de2e0a0b5041cd362d073df4ff8","up":true},{"one":"73d0d1d4a2b7250f51e57c13cc48bc6b20682320ce12ee8e5765afeef7d9de42","other":"b60e77c40ddc9dc78a4ad346add37e60f10f2999de836615db53524487d1ede9","up":true},{"one":"5cc1c28eafd9758e807a28159a1a7a6ea313fa7e878fde5d47fcc8f5a5c25172","other":"52b47d52bf4a1afda1604b7942019c8d2ac4c760c5eb4597e1ce2dd7a8e1cf4d","up":true},{"one":"6daaf515999c9a3491c963f76be82ed6005616bf7ba98247b01d6a89a9af1d71","other":"0639f010834f5bc497798f2d275bbc60bfbcd53c83e38986b7260310c6001420","up":true},{"one":"62f007c92a8af466e90ed0b1e5e71a955ad273ec793948ddfc03977f131ed2d1","other":"72a76f668d9b923914860eb4f8577bc98c153f6dd222cd36a0bbdef2bab7f068","up":true},{"one":"5be6df23201fc5c00be650849c8bfe5581e44033ef19012836f97c98f3954471","other":"0639f010834f5bc497798f2d275bbc60bfbcd53c83e38986b7260310c6001420","up":true},{"one":"58a90b58858417a4e972626421ed8e78b1b3e5ac69fcedd22c58a8ab4c6147df","other":"c9ef56afed2d40db396ad39d6f5f5f38f4058b6b0d1e02b71d6aa92dbeaf7df7","up":true},{"one":"2471776037d55a05df2b15bcefe52cb1f4c942e9e15113abc2a0c1fcbaa5d626","other":"a9fa28117a4b6906b5ce3931573e0a19eec3cb4fcd9141be2d258a2be06f3b61","up":true},{"one":"7a68fa44bbec187272e2d5dfbd6ed8af31a1a365aa72aa50db02350ebe98c859","other":"7bee7967ff7b07243bed55b6d060d5ec2a1f28b530ed65cd055dc5b468a0f878","up":true},{"one":"216e0370111e2e03927b803ae788f9947de8e241d41dbf6a70983cf0ecd68af1","other":"6450bb5e880411abcb60258d8560949f6f70d92ba7bfa9a4d7845463c48dab30","up":true},{"one":"ea3d6aa50ad5a1d5647d213f9b5cfe6718339eec7eef8644487eb3c223c7bcde","other":"4d750666dc0e9e2c244c43492801c1d7ec6208954a0cb5f8bb793b912440753a","up":true},{"one":"bd9607d5f57f7b6f74f4ad981be368988ef48b5f31e3fd96cab3bb790d568150","other":"b5fc43e8c0df3279d6a12cd8b03012cb8d2205208324018c7ae725745a99a2f3","up":true},{"one":"459b9fb2b7f4e396de8cf8740a6804c8e5b96ca11ffa2b5106c14dfbbab65c95","other":"45895aff674079f6be02e4cc74914d63125c3fe48bb69056c070c71319fea1fa","up":true},{"one":"13853407d278a45e15d4b148fc38ebb35c4f58ee552ee0e4401c6c98c45b8e3e","other":"0a215c7765be2caebf76ad3e8017bbc2aaadf8e0dd4859af781953a0564c5d59","up":true},{"one":"2471776037d55a05df2b15bcefe52cb1f4c942e9e15113abc2a0c1fcbaa5d626","other":"21dcfb893a54cb56d21355fc564583057fc51b32503a8627e7575660725a7627","up":true},{"one":"2471776037d55a05df2b15bcefe52cb1f4c942e9e15113abc2a0c1fcbaa5d626","other":"a1929f704664ca85d829ac3bab62e688647a7cfdcbc9f03c61b0124cf9093505","up":true},{"one":"bd9607d5f57f7b6f74f4ad981be368988ef48b5f31e3fd96cab3bb790d568150","other":"b4e29de4bd5751f31195ead8aa1548d305a53fb4f99be9931850e6273de8f359","up":true},{"one":"b2453c6e755a30efb91194fa607b3352d75b6905c448b09af4aeadf3a445b633","other":"672a566c7c2aeb1d91e6ee4e43984050df8b9560d923d60dc1fb23fb73b1a046","up":true},{"one":"47753fdca855ea79abf667b50aa9c90a132d44bdd1572c3e3c411c8ee7e5b5f4","other":"27b56302a89605a83563ba7b66d491ec25edfad0ea1010937fcadeab4d3ae582","up":true},{"one":"c52a68d8388a21013e4eecef9ea866db1f5eb16bbe0ecc82b8bfafd33e4e014f","other":"c0adf394af7d5670c1ce8c6bea292fbc03c56ae2b636e2f303311a455bb3500f","up":true},{"one":"d23c97bebcde26f5e351c4b975c76aaf604fd206f9b9063ecbda538e7a52f514","other":"d9d30b9b212bd4811a44ebe304ba3935ead3abe3247f99893faf65664131c29d","up":true},{"one":"5008ef55ad8088f70643b0f93bcb479531bcb0afe8e01b215dbf8597ec866369","other":"52b47d52bf4a1afda1604b7942019c8d2ac4c760c5eb4597e1ce2dd7a8e1cf4d","up":true},{"one":"aedc9b478204effdcbad1a892333f15c061fbd1423b370f8a50f929b2a2f6952","other":"8b35236da99930bf8f5ef6c7555bb18b80ce2e34361bbbfd6baf55a6483e54ff","up":true},{"one":"27db66d13ee8168aca89786febd6971dd1d6c554bca8501052065cb47631560d","other":"2dd4ad83effc3ba73e72f5659583e5987241bda563563200b50c46cce00a1d9b","up":true},{"one":"b3555baa764c4562935b93533ee6c5a6df631e846c3ab512fdb1d6b901a68c60","other":"13853407d278a45e15d4b148fc38ebb35c4f58ee552ee0e4401c6c98c45b8e3e","up":true},{"one":"b4e29de4bd5751f31195ead8aa1548d305a53fb4f99be9931850e6273de8f359","other":"d125317b492df46a7dd496d30c6d07839ed6bfa196abde4886ce7bc8f9b5c01f","up":true},{"one":"01a63575c384f686e5739e1bd079e4a4c55421cd6d89b944e2c61dd174fa2bf6","other":"c9ef56afed2d40db396ad39d6f5f5f38f4058b6b0d1e02b71d6aa92dbeaf7df7","up":true},{"one":"bd9607d5f57f7b6f74f4ad981be368988ef48b5f31e3fd96cab3bb790d568150","other":"b3555baa764c4562935b93533ee6c5a6df631e846c3ab512fdb1d6b901a68c60","up":true},{"one":"75e282c0f3d355a40573e6578c5aac98e7262970a9239f4dcefd26d6f008b553","other":"5a8ba4047c4456e825bd1b34c961f5c7f37bf7c27bc48bee71b8430c7d135486","up":true},{"one":"ee2b0aff61a9846d13de3a72712ef0bf3ca42ad8da57e81759c242797258efec","other":"a1929f704664ca85d829ac3bab62e688647a7cfdcbc9f03c61b0124cf9093505","up":true},{"one":"3b830c2ae5463ca2f2260176b77b8dda23048257aa780255c69cf1bbbc6fb64c","other":"3e1959b29bbacb3ce7dccfa41c3e51b87f1afc700a3c6e4713c38cc0fe3790df","up":true},{"one":"ce01234661309127bb872d69d38dc5bf19bc4de2e0a0b5041cd362d073df4ff8","other":"c0adf394af7d5670c1ce8c6bea292fbc03c56ae2b636e2f303311a455bb3500f","up":true},{"one":"6daaf515999c9a3491c963f76be82ed6005616bf7ba98247b01d6a89a9af1d71","other":"62f007c92a8af466e90ed0b1e5e71a955ad273ec793948ddfc03977f131ed2d1","up":true},{"one":"fa9a809f016097d949fa1463a1c8f08871c7d38e60b7df6d3e28ab04ccd3a143","other":"fa655b4882579e65937a14ab1c6bcba021580f0a5ebc04c48424f5ae72b7d5b4","up":true},{"one":"eceb7dc532596e8b68074113db9605e3d15cb15e2e80f75f1a66d95a1221c7dc","other":"ea3d6aa50ad5a1d5647d213f9b5cfe6718339eec7eef8644487eb3c223c7bcde","up":true},{"one":"a9fa28117a4b6906b5ce3931573e0a19eec3cb4fcd9141be2d258a2be06f3b61","other":"ee2b0aff61a9846d13de3a72712ef0bf3ca42ad8da57e81759c242797258efec","up":true},{"one":"45895aff674079f6be02e4cc74914d63125c3fe48bb69056c070c71319fea1fa","other":"3e1959b29bbacb3ce7dccfa41c3e51b87f1afc700a3c6e4713c38cc0fe3790df","up":true},{"one":"2471776037d55a05df2b15bcefe52cb1f4c942e9e15113abc2a0c1fcbaa5d626","other":"3871492c8c62cd74cbe65a993669e4978cc641879a5223dd6b9e687f050a1c40","up":true},{"one":"f3d50811ef10661d3ef9978077cd7181387298f306833ab6e27f25cbb77435cd","other":"ea3d6aa50ad5a1d5647d213f9b5cfe6718339eec7eef8644487eb3c223c7bcde","up":true},{"one":"8b35236da99930bf8f5ef6c7555bb18b80ce2e34361bbbfd6baf55a6483e54ff","other":"8330e2b8ae2f184bb8dc5e153fafa4dafe86f84ec692d3ee91413cc07b1cd9e2","up":true},{"one":"be0fb2b440b91e719c20f51b673eb9f2f66c7af77b0b0ade312998cdffcc5045","other":"fa9a809f016097d949fa1463a1c8f08871c7d38e60b7df6d3e28ab04ccd3a143","up":true},{"one":"72a76f668d9b923914860eb4f8577bc98c153f6dd222cd36a0bbdef2bab7f068","other":"d125317b492df46a7dd496d30c6d07839ed6bfa196abde4886ce7bc8f9b5c01f","up":true},{"one":"f33c07a818863a358358989ec71504abad3ca0a7c81b54aad59075a766fad501","other":"ea3d6aa50ad5a1d5647d213f9b5cfe6718339eec7eef8644487eb3c223c7bcde","up":true},{"one":"fac808b79923931febd54e3611b79811b3973c777e7502bd56b9803d0c4bf785","other":"4746379212b91ee1c13c1336e8f3a73a84408b7636c222c11bd27ce7d724e6c6","up":true},{"one":"b4e29de4bd5751f31195ead8aa1548d305a53fb4f99be9931850e6273de8f359","other":"e06f58b144faa650f96465825d253b63d7e061e3a3c4228ad5e1b665afbccc37","up":true},{"one":"08077c0ce8d4130c14464493e9164a8bae61b4646b1ec48899e75f2f6f9b8c66","other":"47753fdca855ea79abf667b50aa9c90a132d44bdd1572c3e3c411c8ee7e5b5f4","up":true},{"one":"6daaf515999c9a3491c963f76be82ed6005616bf7ba98247b01d6a89a9af1d71","other":"672a566c7c2aeb1d91e6ee4e43984050df8b9560d923d60dc1fb23fb73b1a046","up":true},{"one":"ed12c78e700bf805669c48a5d62f1e56791263c4b2ce5bd34587ea9bc931a3e5","other":"eb01ff80307afbfc7457c96594cd4ba4d00acb7fd25a7571d1223168bd66ff09","up":true},{"one":"b2453c6e755a30efb91194fa607b3352d75b6905c448b09af4aeadf3a445b633","other":"f33c07a818863a358358989ec71504abad3ca0a7c81b54aad59075a766fad501","up":true},{"one":"f005a4d3453d52434f2b5be4006e653b50b52ad31926d654722fc3df00f1689c","other":"b8695bec6c8e1e6794bb943b83629cd2c910067e6e178f6f8e33c4f0fa2d74f4","up":true},{"one":"0f3106adfe70aefb474c4a98a95932307391de2cb70fbd2e11dd31c9e695ed83","other":"7bcb0d7b9f84aed413cf9b2a7851ba6d1138d85382aa20e6c939a43c8e59c034","up":true},{"one":"8d3e0d9c6932d3422024394998e943309b679d667394d0eb622f0e208e7fcf0a","other":"b2453c6e755a30efb91194fa607b3352d75b6905c448b09af4aeadf3a445b633","up":true},{"one":"8d3e0d9c6932d3422024394998e943309b679d667394d0eb622f0e208e7fcf0a","other":"8b35236da99930bf8f5ef6c7555bb18b80ce2e34361bbbfd6baf55a6483e54ff","up":true},{"one":"2803f212eb4aa4f49224b16b2de88ba8652ad115321ee1e60cdbd926ecdad38a","other":"3e1959b29bbacb3ce7dccfa41c3e51b87f1afc700a3c6e4713c38cc0fe3790df","up":true},{"one":"5be6df23201fc5c00be650849c8bfe5581e44033ef19012836f97c98f3954471","other":"55fdad03303a746920773217c568a37d2004869ff34096fbe45197f71eba2b63","up":true},{"one":"17406dea5046f00e27eaf74e166a945c9485139d6edcdfcd84f5b03f50eedd0a","other":"13853407d278a45e15d4b148fc38ebb35c4f58ee552ee0e4401c6c98c45b8e3e","up":true},{"one":"8012a7af71d76d882202cf9372523478ccebea23443006c7f29c2a83106cd1b3","other":"82847a4af4f50622650d035f69151b202bccd5fc92302a617602c974603ed997","up":true},{"one":"45895aff674079f6be02e4cc74914d63125c3fe48bb69056c070c71319fea1fa","other":"36d5952685c95e42bef14f77b63705897ca71d24d21e4e9efc772d9cabd21122","up":true},{"one":"72a53f0fb1b51855cb4054a39cbd1309a76a862d36e18af9ba0456a60325c06e","other":"72a76f668d9b923914860eb4f8577bc98c153f6dd222cd36a0bbdef2bab7f068","up":true},{"one":"0f3106adfe70aefb474c4a98a95932307391de2cb70fbd2e11dd31c9e695ed83","other":"6450bb5e880411abcb60258d8560949f6f70d92ba7bfa9a4d7845463c48dab30","up":true},{"one":"27db66d13ee8168aca89786febd6971dd1d6c554bca8501052065cb47631560d","other":"2d531c50183f0115269b3feaecf45927a3ac44e1be2a263c7e5d2274d8379b1c","up":true},{"one":"ce01234661309127bb872d69d38dc5bf19bc4de2e0a0b5041cd362d073df4ff8","other":"cc9f65d734f1a3bbc6019e166fe355bd7fc33bb4887043a5ccf532a9ba356379","up":true},{"one":"b2453c6e755a30efb91194fa607b3352d75b6905c448b09af4aeadf3a445b633","other":"f611d8039385ad56260ab391763e3627aadd2756565fedc3ec95f76124da0efc","up":true},{"one":"be0fb2b440b91e719c20f51b673eb9f2f66c7af77b0b0ade312998cdffcc5045","other":"f611d8039385ad56260ab391763e3627aadd2756565fedc3ec95f76124da0efc","up":true},{"one":"459b9fb2b7f4e396de8cf8740a6804c8e5b96ca11ffa2b5106c14dfbbab65c95","other":"4746379212b91ee1c13c1336e8f3a73a84408b7636c222c11bd27ce7d724e6c6","up":true},{"one":"772a79302528fdce6a216c98c95e281333292c81dfe490aeaa4a78bfeb1980c8","other":"7bee7967ff7b07243bed55b6d060d5ec2a1f28b530ed65cd055dc5b468a0f878","up":true},{"one":"72a76f668d9b923914860eb4f8577bc98c153f6dd222cd36a0bbdef2bab7f068","other":"3e1959b29bbacb3ce7dccfa41c3e51b87f1afc700a3c6e4713c38cc0fe3790df","up":true},{"one":"27b56302a89605a83563ba7b66d491ec25edfad0ea1010937fcadeab4d3ae582","other":"22bbb3236a5e0a1947a1c4735aaacf9122173789a02a06e7653103bdcae2f823","up":true},{"one":"ce01234661309127bb872d69d38dc5bf19bc4de2e0a0b5041cd362d073df4ff8","other":"d23c97bebcde26f5e351c4b975c76aaf604fd206f9b9063ecbda538e7a52f514","up":true},{"one":"acf888ed781f5358493e2e5048691acc39eac3240ca9e9093bb4052b1f624325","other":"ee2b0aff61a9846d13de3a72712ef0bf3ca42ad8da57e81759c242797258efec","up":true},{"one":"641a165f8be0eee36f53c12bae8e2a34a709adb8d1dcd667e88e4e90c9ee2401","other":"62f007c92a8af466e90ed0b1e5e71a955ad273ec793948ddfc03977f131ed2d1","up":true},{"one":"459b9fb2b7f4e396de8cf8740a6804c8e5b96ca11ffa2b5106c14dfbbab65c95","other":"4d750666dc0e9e2c244c43492801c1d7ec6208954a0cb5f8bb793b912440753a","up":true},{"one":"5be6df23201fc5c00be650849c8bfe5581e44033ef19012836f97c98f3954471","other":"52b47d52bf4a1afda1604b7942019c8d2ac4c760c5eb4597e1ce2dd7a8e1cf4d","up":true},{"one":"37751f279493dc5ce5b5c3c55a6ec2e4119eedefe1069b283f6ff8c7bc9d1411","other":"3b830c2ae5463ca2f2260176b77b8dda23048257aa780255c69cf1bbbc6fb64c","up":true},{"one":"957ed6194e6ef56e9696be43a1a0258f2ba4f48f56d790e42bd0663c3fc6aaae","other":"836e65dfe6f01e1d2934655c1846cb86fed6e41ea951a109d7a20bb14cb4c10a","up":true},{"one":"f33c07a818863a358358989ec71504abad3ca0a7c81b54aad59075a766fad501","other":"fac808b79923931febd54e3611b79811b3973c777e7502bd56b9803d0c4bf785","up":true},{"one":"be0fb2b440b91e719c20f51b673eb9f2f66c7af77b0b0ade312998cdffcc5045","other":"f177ee6767a78a57b725dbe67ec377f507f5777d345a28892b0fbfb800dc443a","up":true},{"one":"b9d906e406b0fc6078c22bbc173043df1f7581061b4f6ccd769bc568d94b4339","other":"bc29a0d9b60f3e2c34224cec187cf44eadc4628086d5594666ed025da71e7e7a","up":true},{"one":"45895aff674079f6be02e4cc74914d63125c3fe48bb69056c070c71319fea1fa","other":"2dd4ad83effc3ba73e72f5659583e5987241bda563563200b50c46cce00a1d9b","up":true},{"one":"45895aff674079f6be02e4cc74914d63125c3fe48bb69056c070c71319fea1fa","other":"3871492c8c62cd74cbe65a993669e4978cc641879a5223dd6b9e687f050a1c40","up":true},{"one":"4d750666dc0e9e2c244c43492801c1d7ec6208954a0cb5f8bb793b912440753a","other":"1929b01c0f85af7452a0f358b54f6b36640a196b366909172af594a1648fe64c","up":true},{"one":"f3d50811ef10661d3ef9978077cd7181387298f306833ab6e27f25cbb77435cd","other":"be0fb2b440b91e719c20f51b673eb9f2f66c7af77b0b0ade312998cdffcc5045","up":true},{"one":"eceb7dc532596e8b68074113db9605e3d15cb15e2e80f75f1a66d95a1221c7dc","other":"f005a4d3453d52434f2b5be4006e653b50b52ad31926d654722fc3df00f1689c","up":true},{"one":"f005a4d3453d52434f2b5be4006e653b50b52ad31926d654722fc3df00f1689c","other":"bc29a0d9b60f3e2c34224cec187cf44eadc4628086d5594666ed025da71e7e7a","up":true},{"one":"459b9fb2b7f4e396de8cf8740a6804c8e5b96ca11ffa2b5106c14dfbbab65c95","other":"4efaabab0d5dc59f098aee4dba3868263411a55615a2c474a73e6eec2211decc","up":true},{"one":"a86117147b78f20a6d883d37715da85178cad89eff650a74aa89e7bc11bc45a7","other":"bd486e1e15df4c7539b1ad5b54f7566dd4836a430e9f7d3503881fa79e258d9b","up":true},{"one":"b2453c6e755a30efb91194fa607b3352d75b6905c448b09af4aeadf3a445b633","other":"f4a0f76b30bcf5987cfa3f4f4b0aa3445f39d60a1f51519fa660c27b5d833dde","up":true},{"one":"4d750666dc0e9e2c244c43492801c1d7ec6208954a0cb5f8bb793b912440753a","other":"3590afcd10fb8f58c39f72068661d9a772b77e0efd57bbd60306632fb048fa3a","up":true},{"one":"be0fb2b440b91e719c20f51b673eb9f2f66c7af77b0b0ade312998cdffcc5045","other":"f33c07a818863a358358989ec71504abad3ca0a7c81b54aad59075a766fad501","up":true},{"one":"0e344c6e27c23bd36bdd3ddcefa4e577fdc9461e52c7ce20135733a08b987b82","other":"034de66774eda26b93e342c9b94b9deaeb6297650c819b144a5832bebfe6b02f","up":true},{"one":"f4a0f76b30bcf5987cfa3f4f4b0aa3445f39d60a1f51519fa660c27b5d833dde","other":"f005a4d3453d52434f2b5be4006e653b50b52ad31926d654722fc3df00f1689c","up":true},{"one":"7bcb0d7b9f84aed413cf9b2a7851ba6d1138d85382aa20e6c939a43c8e59c034","other":"0639f010834f5bc497798f2d275bbc60bfbcd53c83e38986b7260310c6001420","up":true},{"one":"69753865aacaaf72d9bf6d265c885d3f705804ff4b2675f7aa860641dacab2a0","other":"6450bb5e880411abcb60258d8560949f6f70d92ba7bfa9a4d7845463c48dab30","up":true},{"one":"45895aff674079f6be02e4cc74914d63125c3fe48bb69056c070c71319fea1fa","other":"2803f212eb4aa4f49224b16b2de88ba8652ad115321ee1e60cdbd926ecdad38a","up":true},{"one":"01a63575c384f686e5739e1bd079e4a4c55421cd6d89b944e2c61dd174fa2bf6","other":"6450bb5e880411abcb60258d8560949f6f70d92ba7bfa9a4d7845463c48dab30","up":true},{"one":"36d5952685c95e42bef14f77b63705897ca71d24d21e4e9efc772d9cabd21122","other":"4d750666dc0e9e2c244c43492801c1d7ec6208954a0cb5f8bb793b912440753a","up":true},{"one":"eceb7dc532596e8b68074113db9605e3d15cb15e2e80f75f1a66d95a1221c7dc","other":"ed12c78e700bf805669c48a5d62f1e56791263c4b2ce5bd34587ea9bc931a3e5","up":true},{"one":"641a165f8be0eee36f53c12bae8e2a34a709adb8d1dcd667e88e4e90c9ee2401","other":"64e642de2667a7563c774050d368858d99aff433efbd1cb68361e3e244629b03","up":true},{"one":"ee2b0aff61a9846d13de3a72712ef0bf3ca42ad8da57e81759c242797258efec","other":"f33c07a818863a358358989ec71504abad3ca0a7c81b54aad59075a766fad501","up":true},{"one":"2354d3af5c6dca05d7dc212b100112f37ab29fb8b3f4319887230a4d420f5d9d","other":"21dcfb893a54cb56d21355fc564583057fc51b32503a8627e7575660725a7627","up":true},{"one":"be0fb2b440b91e719c20f51b673eb9f2f66c7af77b0b0ade312998cdffcc5045","other":"bde90aaa0f1f7a7eb965ff308718d29b55a80b1ca84dfba16c169eabe2b0d5de","up":true},{"one":"127c89eae94b195df2eb5eb7b44f634adb73c114d2089cd904b56988c8674e11","other":"1929b01c0f85af7452a0f358b54f6b36640a196b366909172af594a1648fe64c","up":true},{"one":"72a53f0fb1b51855cb4054a39cbd1309a76a862d36e18af9ba0456a60325c06e","other":"7bcb0d7b9f84aed413cf9b2a7851ba6d1138d85382aa20e6c939a43c8e59c034","up":true},{"one":"ee2b0aff61a9846d13de3a72712ef0bf3ca42ad8da57e81759c242797258efec","other":"a86117147b78f20a6d883d37715da85178cad89eff650a74aa89e7bc11bc45a7","up":true},{"one":"8b35236da99930bf8f5ef6c7555bb18b80ce2e34361bbbfd6baf55a6483e54ff","other":"b60e77c40ddc9dc78a4ad346add37e60f10f2999de836615db53524487d1ede9","up":true},{"one":"ed12c78e700bf805669c48a5d62f1e56791263c4b2ce5bd34587ea9bc931a3e5","other":"f33c07a818863a358358989ec71504abad3ca0a7c81b54aad59075a766fad501","up":true},{"one":"8d3e0d9c6932d3422024394998e943309b679d667394d0eb622f0e208e7fcf0a","other":"a9fa28117a4b6906b5ce3931573e0a19eec3cb4fcd9141be2d258a2be06f3b61","up":true},{"one":"37751f279493dc5ce5b5c3c55a6ec2e4119eedefe1069b283f6ff8c7bc9d1411","other":"4d750666dc0e9e2c244c43492801c1d7ec6208954a0cb5f8bb793b912440753a","up":true},{"one":"fa655b4882579e65937a14ab1c6bcba021580f0a5ebc04c48424f5ae72b7d5b4","other":"f33c07a818863a358358989ec71504abad3ca0a7c81b54aad59075a766fad501","up":true},{"one":"be0fb2b440b91e719c20f51b673eb9f2f66c7af77b0b0ade312998cdffcc5045","other":"fac808b79923931febd54e3611b79811b3973c777e7502bd56b9803d0c4bf785","up":true},{"one":"37751f279493dc5ce5b5c3c55a6ec2e4119eedefe1069b283f6ff8c7bc9d1411","other":"3e1959b29bbacb3ce7dccfa41c3e51b87f1afc700a3c6e4713c38cc0fe3790df","up":true},{"one":"221cd8ea0a26f0d3f81f782f1de390282415ecd9cf40224b4945a00897895b4e","other":"2803f212eb4aa4f49224b16b2de88ba8652ad115321ee1e60cdbd926ecdad38a","up":true},{"one":"7bcb0d7b9f84aed413cf9b2a7851ba6d1138d85382aa20e6c939a43c8e59c034","other":"034de66774eda26b93e342c9b94b9deaeb6297650c819b144a5832bebfe6b02f","up":true},{"one":"b2453c6e755a30efb91194fa607b3352d75b6905c448b09af4aeadf3a445b633","other":"fac808b79923931febd54e3611b79811b3973c777e7502bd56b9803d0c4bf785","up":true},{"one":"5cc1c28eafd9758e807a28159a1a7a6ea313fa7e878fde5d47fcc8f5a5c25172","other":"5c623fa0103108d0b1e24e6d01a6624ce3b59a9e7c422c45dfc1211676785542","up":true},{"one":"a86117147b78f20a6d883d37715da85178cad89eff650a74aa89e7bc11bc45a7","other":"a9fa28117a4b6906b5ce3931573e0a19eec3cb4fcd9141be2d258a2be06f3b61","up":true},{"one":"221cd8ea0a26f0d3f81f782f1de390282415ecd9cf40224b4945a00897895b4e","other":"2471776037d55a05df2b15bcefe52cb1f4c942e9e15113abc2a0c1fcbaa5d626","up":true},{"one":"2dd4ad83effc3ba73e72f5659583e5987241bda563563200b50c46cce00a1d9b","other":"36d5952685c95e42bef14f77b63705897ca71d24d21e4e9efc772d9cabd21122","up":true},{"one":"37751f279493dc5ce5b5c3c55a6ec2e4119eedefe1069b283f6ff8c7bc9d1411","other":"3871492c8c62cd74cbe65a993669e4978cc641879a5223dd6b9e687f050a1c40","up":true},{"one":"772a79302528fdce6a216c98c95e281333292c81dfe490aeaa4a78bfeb1980c8","other":"72a53f0fb1b51855cb4054a39cbd1309a76a862d36e18af9ba0456a60325c06e","up":true},{"one":"b5fc43e8c0df3279d6a12cd8b03012cb8d2205208324018c7ae725745a99a2f3","other":"b8695bec6c8e1e6794bb943b83629cd2c910067e6e178f6f8e33c4f0fa2d74f4","up":true},{"one":"77eedcac0c847b1d693ddff07c5868afb1c2008b2dcb48a0299143ab14611969","other":"72a53f0fb1b51855cb4054a39cbd1309a76a862d36e18af9ba0456a60325c06e","up":true},{"one":"efd68d2c99346ca085c9ef896bee6125ad8638413295108f3a92b247a41ca629","other":"ed12c78e700bf805669c48a5d62f1e56791263c4b2ce5bd34587ea9bc931a3e5","up":true},{"one":"c52a68d8388a21013e4eecef9ea866db1f5eb16bbe0ecc82b8bfafd33e4e014f","other":"ce01234661309127bb872d69d38dc5bf19bc4de2e0a0b5041cd362d073df4ff8","up":true},{"one":"b2453c6e755a30efb91194fa607b3352d75b6905c448b09af4aeadf3a445b633","other":"fa655b4882579e65937a14ab1c6bcba021580f0a5ebc04c48424f5ae72b7d5b4","up":true},{"one":"4cc2386a86fd210bf699c6d93173b0879c3210d46f572a62bb154cb60a7d2cb1","other":"4746379212b91ee1c13c1336e8f3a73a84408b7636c222c11bd27ce7d724e6c6","up":true},{"one":"b60e77c40ddc9dc78a4ad346add37e60f10f2999de836615db53524487d1ede9","other":"b4e29de4bd5751f31195ead8aa1548d305a53fb4f99be9931850e6273de8f359","up":true},{"one":"55fdad03303a746920773217c568a37d2004869ff34096fbe45197f71eba2b63","other":"52b47d52bf4a1afda1604b7942019c8d2ac4c760c5eb4597e1ce2dd7a8e1cf4d","up":true},{"one":"127c89eae94b195df2eb5eb7b44f634adb73c114d2089cd904b56988c8674e11","other":"4d750666dc0e9e2c244c43492801c1d7ec6208954a0cb5f8bb793b912440753a","up":true},{"one":"7bcb0d7b9f84aed413cf9b2a7851ba6d1138d85382aa20e6c939a43c8e59c034","other":"13853407d278a45e15d4b148fc38ebb35c4f58ee552ee0e4401c6c98c45b8e3e","up":true},{"one":"27db66d13ee8168aca89786febd6971dd1d6c554bca8501052065cb47631560d","other":"22bbb3236a5e0a1947a1c4735aaacf9122173789a02a06e7653103bdcae2f823","up":true},{"one":"c52a68d8388a21013e4eecef9ea866db1f5eb16bbe0ecc82b8bfafd33e4e014f","other":"d9d30b9b212bd4811a44ebe304ba3935ead3abe3247f99893faf65664131c29d","up":true},{"one":"be0fb2b440b91e719c20f51b673eb9f2f66c7af77b0b0ade312998cdffcc5045","other":"b8695bec6c8e1e6794bb943b83629cd2c910067e6e178f6f8e33c4f0fa2d74f4","up":true},{"one":"be0fb2b440b91e719c20f51b673eb9f2f66c7af77b0b0ade312998cdffcc5045","other":"cc5fa2d49210e240983b0853ff15003f0d366f05cb1f6486bae2862cca852cc5","up":true},{"one":"1929b01c0f85af7452a0f358b54f6b36640a196b366909172af594a1648fe64c","other":"0a215c7765be2caebf76ad3e8017bbc2aaadf8e0dd4859af781953a0564c5d59","up":true},{"one":"127c89eae94b195df2eb5eb7b44f634adb73c114d2089cd904b56988c8674e11","other":"7bcb0d7b9f84aed413cf9b2a7851ba6d1138d85382aa20e6c939a43c8e59c034","up":true},{"one":"08077c0ce8d4130c14464493e9164a8bae61b4646b1ec48899e75f2f6f9b8c66","other":"7bcb0d7b9f84aed413cf9b2a7851ba6d1138d85382aa20e6c939a43c8e59c034","up":true},{"one":"221cd8ea0a26f0d3f81f782f1de390282415ecd9cf40224b4945a00897895b4e","other":"27b56302a89605a83563ba7b66d491ec25edfad0ea1010937fcadeab4d3ae582","up":true},{"one":"216e0370111e2e03927b803ae788f9947de8e241d41dbf6a70983cf0ecd68af1","other":"4d750666dc0e9e2c244c43492801c1d7ec6208954a0cb5f8bb793b912440753a","up":true},{"one":"ee2b0aff61a9846d13de3a72712ef0bf3ca42ad8da57e81759c242797258efec","other":"b8695bec6c8e1e6794bb943b83629cd2c910067e6e178f6f8e33c4f0fa2d74f4","up":true},{"one":"69753865aacaaf72d9bf6d265c885d3f705804ff4b2675f7aa860641dacab2a0","other":"6379b4d611cdd6e360480c14b3f6784360f28f702b5a6f375eda4ef3bde7ef33","up":true},{"one":"bde90aaa0f1f7a7eb965ff308718d29b55a80b1ca84dfba16c169eabe2b0d5de","other":"b9d906e406b0fc6078c22bbc173043df1f7581061b4f6ccd769bc568d94b4339","up":true},{"one":"3b830c2ae5463ca2f2260176b77b8dda23048257aa780255c69cf1bbbc6fb64c","other":"36d5952685c95e42bef14f77b63705897ca71d24d21e4e9efc772d9cabd21122","up":true},{"one":"4a3c39f044c425c153d4900db30f839d7866c8e0f4f4d38d9205e67fb540988e","other":"459b9fb2b7f4e396de8cf8740a6804c8e5b96ca11ffa2b5106c14dfbbab65c95","up":true},{"one":"c52a68d8388a21013e4eecef9ea866db1f5eb16bbe0ecc82b8bfafd33e4e014f","other":"cc5fa2d49210e240983b0853ff15003f0d366f05cb1f6486bae2862cca852cc5","up":true},{"one":"b2453c6e755a30efb91194fa607b3352d75b6905c448b09af4aeadf3a445b633","other":"e06f58b144faa650f96465825d253b63d7e061e3a3c4228ad5e1b665afbccc37","up":true},{"one":"bddbdff3cbd22fcedddc07de27125819aac72be72c3126ba898621c496cb95a2","other":"b9d906e406b0fc6078c22bbc173043df1f7581061b4f6ccd769bc568d94b4339","up":true},{"one":"dd92b3d42414fd5eff5c1e4ca55c63cd7036634049995b72a20cdf7ca1321978","other":"c2f9b4abed9c6a839fe4c03a80bd396fd187a8784ba47a83687d3a54b7e2eddf","up":true},{"one":"5a8ba4047c4456e825bd1b34c961f5c7f37bf7c27bc48bee71b8430c7d135486","other":"5be6df23201fc5c00be650849c8bfe5581e44033ef19012836f97c98f3954471","up":true},{"one":"641a165f8be0eee36f53c12bae8e2a34a709adb8d1dcd667e88e4e90c9ee2401","other":"68a63ebc4833dedfdb6d534438ffcccd042f60434bee0e39f4cb3726e7413e7a","up":true},{"one":"aedc9b478204effdcbad1a892333f15c061fbd1423b370f8a50f929b2a2f6952","other":"a9fa28117a4b6906b5ce3931573e0a19eec3cb4fcd9141be2d258a2be06f3b61","up":true},{"one":"27db66d13ee8168aca89786febd6971dd1d6c554bca8501052065cb47631560d","other":"27b56302a89605a83563ba7b66d491ec25edfad0ea1010937fcadeab4d3ae582","up":true},{"one":"2803f212eb4aa4f49224b16b2de88ba8652ad115321ee1e60cdbd926ecdad38a","other":"2471776037d55a05df2b15bcefe52cb1f4c942e9e15113abc2a0c1fcbaa5d626","up":true},{"one":"8012a7af71d76d882202cf9372523478ccebea23443006c7f29c2a83106cd1b3","other":"957ed6194e6ef56e9696be43a1a0258f2ba4f48f56d790e42bd0663c3fc6aaae","up":true},{"one":"947205fd85a17330a6d5c51a66548c5f69779c76ab12408f8fc6d33d7c6b8e9d","other":"8330e2b8ae2f184bb8dc5e153fafa4dafe86f84ec692d3ee91413cc07b1cd9e2","up":true},{"one":"62f007c92a8af466e90ed0b1e5e71a955ad273ec793948ddfc03977f131ed2d1","other":"6450bb5e880411abcb60258d8560949f6f70d92ba7bfa9a4d7845463c48dab30","up":true},{"one":"08077c0ce8d4130c14464493e9164a8bae61b4646b1ec48899e75f2f6f9b8c66","other":"034de66774eda26b93e342c9b94b9deaeb6297650c819b144a5832bebfe6b02f","up":true},{"one":"be0fb2b440b91e719c20f51b673eb9f2f66c7af77b0b0ade312998cdffcc5045","other":"ee2b0aff61a9846d13de3a72712ef0bf3ca42ad8da57e81759c242797258efec","up":true},{"one":"c2f9b4abed9c6a839fe4c03a80bd396fd187a8784ba47a83687d3a54b7e2eddf","other":"d23c97bebcde26f5e351c4b975c76aaf604fd206f9b9063ecbda538e7a52f514","up":true},{"one":"127c89eae94b195df2eb5eb7b44f634adb73c114d2089cd904b56988c8674e11","other":"13853407d278a45e15d4b148fc38ebb35c4f58ee552ee0e4401c6c98c45b8e3e","up":true},{"one":"27b56302a89605a83563ba7b66d491ec25edfad0ea1010937fcadeab4d3ae582","other":"21dcfb893a54cb56d21355fc564583057fc51b32503a8627e7575660725a7627","up":true},{"one":"27db66d13ee8168aca89786febd6971dd1d6c554bca8501052065cb47631560d","other":"36d5952685c95e42bef14f77b63705897ca71d24d21e4e9efc772d9cabd21122","up":true},{"one":"bd486e1e15df4c7539b1ad5b54f7566dd4836a430e9f7d3503881fa79e258d9b","other":"b8695bec6c8e1e6794bb943b83629cd2c910067e6e178f6f8e33c4f0fa2d74f4","up":true},{"one":"7bcb0d7b9f84aed413cf9b2a7851ba6d1138d85382aa20e6c939a43c8e59c034","other":"1929b01c0f85af7452a0f358b54f6b36640a196b366909172af594a1648fe64c","up":true},{"one":"2354d3af5c6dca05d7dc212b100112f37ab29fb8b3f4319887230a4d420f5d9d","other":"2803f212eb4aa4f49224b16b2de88ba8652ad115321ee1e60cdbd926ecdad38a","up":true},{"one":"184e9e00ab4fe1669d4d99fb33d418d33eff927da38cc997f69679443c24b20b","other":"0639f010834f5bc497798f2d275bbc60bfbcd53c83e38986b7260310c6001420","up":true},{"one":"08077c0ce8d4130c14464493e9164a8bae61b4646b1ec48899e75f2f6f9b8c66","other":"0639f010834f5bc497798f2d275bbc60bfbcd53c83e38986b7260310c6001420","up":true},{"one":"0e344c6e27c23bd36bdd3ddcefa4e577fdc9461e52c7ce20135733a08b987b82","other":"17406dea5046f00e27eaf74e166a945c9485139d6edcdfcd84f5b03f50eedd0a","up":true},{"one":"aba793e635f71169105ad073225cc8db914de6b711fe9f22c5d94ac8cb85e2eb","other":"ee2b0aff61a9846d13de3a72712ef0bf3ca42ad8da57e81759c242797258efec","up":true},{"one":"55fdad03303a746920773217c568a37d2004869ff34096fbe45197f71eba2b63","other":"5c623fa0103108d0b1e24e6d01a6624ce3b59a9e7c422c45dfc1211676785542","up":true},{"one":"641a165f8be0eee36f53c12bae8e2a34a709adb8d1dcd667e88e4e90c9ee2401","other":"75e282c0f3d355a40573e6578c5aac98e7262970a9239f4dcefd26d6f008b553","up":true},{"one":"216e0370111e2e03927b803ae788f9947de8e241d41dbf6a70983cf0ecd68af1","other":"36d5952685c95e42bef14f77b63705897ca71d24d21e4e9efc772d9cabd21122","up":true},{"one":"77eedcac0c847b1d693ddff07c5868afb1c2008b2dcb48a0299143ab14611969","other":"75e282c0f3d355a40573e6578c5aac98e7262970a9239f4dcefd26d6f008b553","up":true},{"one":"d125317b492df46a7dd496d30c6d07839ed6bfa196abde4886ce7bc8f9b5c01f","other":"d9d30b9b212bd4811a44ebe304ba3935ead3abe3247f99893faf65664131c29d","up":true},{"one":"7bcb0d7b9f84aed413cf9b2a7851ba6d1138d85382aa20e6c939a43c8e59c034","other":"75e282c0f3d355a40573e6578c5aac98e7262970a9239f4dcefd26d6f008b553","up":true},{"one":"be0fb2b440b91e719c20f51b673eb9f2f66c7af77b0b0ade312998cdffcc5045","other":"ed12c78e700bf805669c48a5d62f1e56791263c4b2ce5bd34587ea9bc931a3e5","up":true},{"one":"216e0370111e2e03927b803ae788f9947de8e241d41dbf6a70983cf0ecd68af1","other":"27b56302a89605a83563ba7b66d491ec25edfad0ea1010937fcadeab4d3ae582","up":true},{"one":"2354d3af5c6dca05d7dc212b100112f37ab29fb8b3f4319887230a4d420f5d9d","other":"4d750666dc0e9e2c244c43492801c1d7ec6208954a0cb5f8bb793b912440753a","up":true},{"one":"deec6a8beb4e5e441dd42311354194c3bef9448e8859b4ccd401645b69217d12","other":"cc5fa2d49210e240983b0853ff15003f0d366f05cb1f6486bae2862cca852cc5","up":true},{"one":"2dd4ad83effc3ba73e72f5659583e5987241bda563563200b50c46cce00a1d9b","other":"2803f212eb4aa4f49224b16b2de88ba8652ad115321ee1e60cdbd926ecdad38a","up":true},{"one":"3871492c8c62cd74cbe65a993669e4978cc641879a5223dd6b9e687f050a1c40","other":"3e1959b29bbacb3ce7dccfa41c3e51b87f1afc700a3c6e4713c38cc0fe3790df","up":true},{"one":"8d3e0d9c6932d3422024394998e943309b679d667394d0eb622f0e208e7fcf0a","other":"957ed6194e6ef56e9696be43a1a0258f2ba4f48f56d790e42bd0663c3fc6aaae","up":true},{"one":"7a68fa44bbec187272e2d5dfbd6ed8af31a1a365aa72aa50db02350ebe98c859","other":"75e282c0f3d355a40573e6578c5aac98e7262970a9239f4dcefd26d6f008b553","up":true},{"one":"ee2b0aff61a9846d13de3a72712ef0bf3ca42ad8da57e81759c242797258efec","other":"b9d906e406b0fc6078c22bbc173043df1f7581061b4f6ccd769bc568d94b4339","up":true},{"one":"184e9e00ab4fe1669d4d99fb33d418d33eff927da38cc997f69679443c24b20b","other":"13853407d278a45e15d4b148fc38ebb35c4f58ee552ee0e4401c6c98c45b8e3e","up":true},{"one":"184e9e00ab4fe1669d4d99fb33d418d33eff927da38cc997f69679443c24b20b","other":"01a63575c384f686e5739e1bd079e4a4c55421cd6d89b944e2c61dd174fa2bf6","up":true},{"one":"7bcb0d7b9f84aed413cf9b2a7851ba6d1138d85382aa20e6c939a43c8e59c034","other":"3b830c2ae5463ca2f2260176b77b8dda23048257aa780255c69cf1bbbc6fb64c","up":true},{"one":"2dd4ad83effc3ba73e72f5659583e5987241bda563563200b50c46cce00a1d9b","other":"2471776037d55a05df2b15bcefe52cb1f4c942e9e15113abc2a0c1fcbaa5d626","up":true},{"one":"21dcfb893a54cb56d21355fc564583057fc51b32503a8627e7575660725a7627","other":"4d750666dc0e9e2c244c43492801c1d7ec6208954a0cb5f8bb793b912440753a","up":true},{"one":"36d5952685c95e42bef14f77b63705897ca71d24d21e4e9efc772d9cabd21122","other":"3590afcd10fb8f58c39f72068661d9a772b77e0efd57bbd60306632fb048fa3a","up":true},{"one":"eceb7dc532596e8b68074113db9605e3d15cb15e2e80f75f1a66d95a1221c7dc","other":"f177ee6767a78a57b725dbe67ec377f507f5777d345a28892b0fbfb800dc443a","up":true},{"one":"b3555baa764c4562935b93533ee6c5a6df631e846c3ab512fdb1d6b901a68c60","other":"b9d906e406b0fc6078c22bbc173043df1f7581061b4f6ccd769bc568d94b4339","up":true},{"one":"7bcb0d7b9f84aed413cf9b2a7851ba6d1138d85382aa20e6c939a43c8e59c034","other":"3871492c8c62cd74cbe65a993669e4978cc641879a5223dd6b9e687f050a1c40","up":true},{"one":"51c285489ff14628268ae886945e1cd2da64c6a0a8cb184aada98567ab429b6e","other":"5008ef55ad8088f70643b0f93bcb479531bcb0afe8e01b215dbf8597ec866369","up":true},{"one":"6379b4d611cdd6e360480c14b3f6784360f28f702b5a6f375eda4ef3bde7ef33","other":"68a63ebc4833dedfdb6d534438ffcccd042f60434bee0e39f4cb3726e7413e7a","up":true},{"one":"c9ef56afed2d40db396ad39d6f5f5f38f4058b6b0d1e02b71d6aa92dbeaf7df7","other":"ce01234661309127bb872d69d38dc5bf19bc4de2e0a0b5041cd362d073df4ff8","up":true},{"one":"0e344c6e27c23bd36bdd3ddcefa4e577fdc9461e52c7ce20135733a08b987b82","other":"1929b01c0f85af7452a0f358b54f6b36640a196b366909172af594a1648fe64c","up":true},{"one":"184e9e00ab4fe1669d4d99fb33d418d33eff927da38cc997f69679443c24b20b","other":"17406dea5046f00e27eaf74e166a945c9485139d6edcdfcd84f5b03f50eedd0a","up":true},{"one":"01a63575c384f686e5739e1bd079e4a4c55421cd6d89b944e2c61dd174fa2bf6","other":"4d750666dc0e9e2c244c43492801c1d7ec6208954a0cb5f8bb793b912440753a","up":true},{"one":"22bbb3236a5e0a1947a1c4735aaacf9122173789a02a06e7653103bdcae2f823","other":"2471776037d55a05df2b15bcefe52cb1f4c942e9e15113abc2a0c1fcbaa5d626","up":true},{"one":"03eb2e92ed0923f696269e7a03fec731d8c3f8df278023a9cb00867b533a3ca3","other":"034de66774eda26b93e342c9b94b9deaeb6297650c819b144a5832bebfe6b02f","up":true},{"one":"37751f279493dc5ce5b5c3c55a6ec2e4119eedefe1069b283f6ff8c7bc9d1411","other":"7bcb0d7b9f84aed413cf9b2a7851ba6d1138d85382aa20e6c939a43c8e59c034","up":true},{"one":"8d3e0d9c6932d3422024394998e943309b679d667394d0eb622f0e208e7fcf0a","other":"8330e2b8ae2f184bb8dc5e153fafa4dafe86f84ec692d3ee91413cc07b1cd9e2","up":true},{"one":"bd486e1e15df4c7539b1ad5b54f7566dd4836a430e9f7d3503881fa79e258d9b","other":"bd9607d5f57f7b6f74f4ad981be368988ef48b5f31e3fd96cab3bb790d568150","up":true},{"one":"d9d30b9b212bd4811a44ebe304ba3935ead3abe3247f99893faf65664131c29d","other":"d18a1edd26661069fb401fee8aa85a9614a3188e2e0666bfe9307f91d29aad49","up":true},{"one":"bc29a0d9b60f3e2c34224cec187cf44eadc4628086d5594666ed025da71e7e7a","other":"ee2b0aff61a9846d13de3a72712ef0bf3ca42ad8da57e81759c242797258efec","up":true},{"one":"7bcb0d7b9f84aed413cf9b2a7851ba6d1138d85382aa20e6c939a43c8e59c034","other":"3590afcd10fb8f58c39f72068661d9a772b77e0efd57bbd60306632fb048fa3a","up":true},{"one":"641a165f8be0eee36f53c12bae8e2a34a709adb8d1dcd667e88e4e90c9ee2401","other":"69753865aacaaf72d9bf6d265c885d3f705804ff4b2675f7aa860641dacab2a0","up":true},{"one":"bd486e1e15df4c7539b1ad5b54f7566dd4836a430e9f7d3503881fa79e258d9b","other":"bc71f3e409edb989e26607448491530c5451053b582ea64d882525451ac940bb","up":true},{"one":"27db66d13ee8168aca89786febd6971dd1d6c554bca8501052065cb47631560d","other":"4d750666dc0e9e2c244c43492801c1d7ec6208954a0cb5f8bb793b912440753a","up":true},{"one":"216e0370111e2e03927b803ae788f9947de8e241d41dbf6a70983cf0ecd68af1","other":"2471776037d55a05df2b15bcefe52cb1f4c942e9e15113abc2a0c1fcbaa5d626","up":true},{"one":"03eb2e92ed0923f696269e7a03fec731d8c3f8df278023a9cb00867b533a3ca3","other":"184e9e00ab4fe1669d4d99fb33d418d33eff927da38cc997f69679443c24b20b","up":true},{"one":"4d750666dc0e9e2c244c43492801c1d7ec6208954a0cb5f8bb793b912440753a","other":"13853407d278a45e15d4b148fc38ebb35c4f58ee552ee0e4401c6c98c45b8e3e","up":true},{"one":"459b9fb2b7f4e396de8cf8740a6804c8e5b96ca11ffa2b5106c14dfbbab65c95","other":"47753fdca855ea79abf667b50aa9c90a132d44bdd1572c3e3c411c8ee7e5b5f4","up":true},{"one":"51c285489ff14628268ae886945e1cd2da64c6a0a8cb184aada98567ab429b6e","other":"55fdad03303a746920773217c568a37d2004869ff34096fbe45197f71eba2b63","up":true},{"one":"45895aff674079f6be02e4cc74914d63125c3fe48bb69056c070c71319fea1fa","other":"4d750666dc0e9e2c244c43492801c1d7ec6208954a0cb5f8bb793b912440753a","up":true},{"one":"c9ef56afed2d40db396ad39d6f5f5f38f4058b6b0d1e02b71d6aa92dbeaf7df7","other":"cabfdfb789cc20962eaba1dbe68d6dc0466e699d22dc5b29f27a5cd555398795","up":true},{"one":"8fb8208b7167dd06cc08778b507ccd856751d3df6dfbaeac18b9f527b6628523","other":"8012a7af71d76d882202cf9372523478ccebea23443006c7f29c2a83106cd1b3","up":true},{"one":"b5fc43e8c0df3279d6a12cd8b03012cb8d2205208324018c7ae725745a99a2f3","other":"b4e29de4bd5751f31195ead8aa1548d305a53fb4f99be9931850e6273de8f359","up":true},{"one":"f33c07a818863a358358989ec71504abad3ca0a7c81b54aad59075a766fad501","other":"ed2ec6681bf325887768703779ccf3a6278731118cd3ec890490a3de50f689ac","up":true},{"one":"5a8ba4047c4456e825bd1b34c961f5c7f37bf7c27bc48bee71b8430c7d135486","other":"5cc1c28eafd9758e807a28159a1a7a6ea313fa7e878fde5d47fcc8f5a5c25172","up":true},{"one":"947205fd85a17330a6d5c51a66548c5f69779c76ab12408f8fc6d33d7c6b8e9d","other":"8012a7af71d76d882202cf9372523478ccebea23443006c7f29c2a83106cd1b3","up":true},{"one":"7bee7967ff7b07243bed55b6d060d5ec2a1f28b530ed65cd055dc5b468a0f878","other":"6daaf515999c9a3491c963f76be82ed6005616bf7ba98247b01d6a89a9af1d71","up":true},{"one":"be0fb2b440b91e719c20f51b673eb9f2f66c7af77b0b0ade312998cdffcc5045","other":"bd9607d5f57f7b6f74f4ad981be368988ef48b5f31e3fd96cab3bb790d568150","up":true},{"one":"b4e29de4bd5751f31195ead8aa1548d305a53fb4f99be9931850e6273de8f359","other":"b9d906e406b0fc6078c22bbc173043df1f7581061b4f6ccd769bc568d94b4339","up":true},{"one":"2d531c50183f0115269b3feaecf45927a3ac44e1be2a263c7e5d2274d8379b1c","other":"7bcb0d7b9f84aed413cf9b2a7851ba6d1138d85382aa20e6c939a43c8e59c034","up":true},{"one":"b60e77c40ddc9dc78a4ad346add37e60f10f2999de836615db53524487d1ede9","other":"a9fa28117a4b6906b5ce3931573e0a19eec3cb4fcd9141be2d258a2be06f3b61","up":true},{"one":"21dcfb893a54cb56d21355fc564583057fc51b32503a8627e7575660725a7627","other":"36d5952685c95e42bef14f77b63705897ca71d24d21e4e9efc772d9cabd21122","up":true},{"one":"22bbb3236a5e0a1947a1c4735aaacf9122173789a02a06e7653103bdcae2f823","other":"2803f212eb4aa4f49224b16b2de88ba8652ad115321ee1e60cdbd926ecdad38a","up":true},{"one":"2354d3af5c6dca05d7dc212b100112f37ab29fb8b3f4319887230a4d420f5d9d","other":"27db66d13ee8168aca89786febd6971dd1d6c554bca8501052065cb47631560d","up":true},{"one":"8b35236da99930bf8f5ef6c7555bb18b80ce2e34361bbbfd6baf55a6483e54ff","other":"8012a7af71d76d882202cf9372523478ccebea23443006c7f29c2a83106cd1b3","up":true},{"one":"8330e2b8ae2f184bb8dc5e153fafa4dafe86f84ec692d3ee91413cc07b1cd9e2","other":"8fb8208b7167dd06cc08778b507ccd856751d3df6dfbaeac18b9f527b6628523","up":true},{"one":"aedc9b478204effdcbad1a892333f15c061fbd1423b370f8a50f929b2a2f6952","other":"a1929f704664ca85d829ac3bab62e688647a7cfdcbc9f03c61b0124cf9093505","up":true},{"one":"5cc1c28eafd9758e807a28159a1a7a6ea313fa7e878fde5d47fcc8f5a5c25172","other":"5008ef55ad8088f70643b0f93bcb479531bcb0afe8e01b215dbf8597ec866369","up":true},{"one":"772a79302528fdce6a216c98c95e281333292c81dfe490aeaa4a78bfeb1980c8","other":"75e282c0f3d355a40573e6578c5aac98e7262970a9239f4dcefd26d6f008b553","up":true},{"one":"5c623fa0103108d0b1e24e6d01a6624ce3b59a9e7c422c45dfc1211676785542","other":"5008ef55ad8088f70643b0f93bcb479531bcb0afe8e01b215dbf8597ec866369","up":true},{"one":"b5fc43e8c0df3279d6a12cd8b03012cb8d2205208324018c7ae725745a99a2f3","other":"b2453c6e755a30efb91194fa607b3352d75b6905c448b09af4aeadf3a445b633","up":true},{"one":"eceb7dc532596e8b68074113db9605e3d15cb15e2e80f75f1a66d95a1221c7dc","other":"ed2ec6681bf325887768703779ccf3a6278731118cd3ec890490a3de50f689ac","up":true},{"one":"72a53f0fb1b51855cb4054a39cbd1309a76a862d36e18af9ba0456a60325c06e","other":"73d0d1d4a2b7250f51e57c13cc48bc6b20682320ce12ee8e5765afeef7d9de42","up":true},{"one":"6450bb5e880411abcb60258d8560949f6f70d92ba7bfa9a4d7845463c48dab30","other":"75e282c0f3d355a40573e6578c5aac98e7262970a9239f4dcefd26d6f008b553","up":true},{"one":"68a63ebc4833dedfdb6d534438ffcccd042f60434bee0e39f4cb3726e7413e7a","other":"6450bb5e880411abcb60258d8560949f6f70d92ba7bfa9a4d7845463c48dab30","up":true},{"one":"b9d906e406b0fc6078c22bbc173043df1f7581061b4f6ccd769bc568d94b4339","other":"a9fa28117a4b6906b5ce3931573e0a19eec3cb4fcd9141be2d258a2be06f3b61","up":true},{"one":"f4a0f76b30bcf5987cfa3f4f4b0aa3445f39d60a1f51519fa660c27b5d833dde","other":"f33c07a818863a358358989ec71504abad3ca0a7c81b54aad59075a766fad501","up":true},{"one":"77eedcac0c847b1d693ddff07c5868afb1c2008b2dcb48a0299143ab14611969","other":"7bcb0d7b9f84aed413cf9b2a7851ba6d1138d85382aa20e6c939a43c8e59c034","up":true},{"one":"8d3e0d9c6932d3422024394998e943309b679d667394d0eb622f0e208e7fcf0a","other":"8fb8208b7167dd06cc08778b507ccd856751d3df6dfbaeac18b9f527b6628523","up":true},{"one":"c52a68d8388a21013e4eecef9ea866db1f5eb16bbe0ecc82b8bfafd33e4e014f","other":"cabfdfb789cc20962eaba1dbe68d6dc0466e699d22dc5b29f27a5cd555398795","up":true},{"one":"8d3e0d9c6932d3422024394998e943309b679d667394d0eb622f0e208e7fcf0a","other":"8012a7af71d76d882202cf9372523478ccebea23443006c7f29c2a83106cd1b3","up":true},{"one":"62f007c92a8af466e90ed0b1e5e71a955ad273ec793948ddfc03977f131ed2d1","other":"6379b4d611cdd6e360480c14b3f6784360f28f702b5a6f375eda4ef3bde7ef33","up":true},{"one":"2d531c50183f0115269b3feaecf45927a3ac44e1be2a263c7e5d2274d8379b1c","other":"22bbb3236a5e0a1947a1c4735aaacf9122173789a02a06e7653103bdcae2f823","up":true},{"one":"c52a68d8388a21013e4eecef9ea866db1f5eb16bbe0ecc82b8bfafd33e4e014f","other":"d125317b492df46a7dd496d30c6d07839ed6bfa196abde4886ce7bc8f9b5c01f","up":true},{"one":"c52a68d8388a21013e4eecef9ea866db1f5eb16bbe0ecc82b8bfafd33e4e014f","other":"d18a1edd26661069fb401fee8aa85a9614a3188e2e0666bfe9307f91d29aad49","up":true},{"one":"bddbdff3cbd22fcedddc07de27125819aac72be72c3126ba898621c496cb95a2","other":"bd9607d5f57f7b6f74f4ad981be368988ef48b5f31e3fd96cab3bb790d568150","up":true},{"one":"4c211c117e555c2ac831d5688615b6b4c5e31f1d7c7906b34f0cbcdbc45482b4","other":"4746379212b91ee1c13c1336e8f3a73a84408b7636c222c11bd27ce7d724e6c6","up":true},{"one":"77eedcac0c847b1d693ddff07c5868afb1c2008b2dcb48a0299143ab14611969","other":"7bee7967ff7b07243bed55b6d060d5ec2a1f28b530ed65cd055dc5b468a0f878","up":true},{"one":"75e282c0f3d355a40573e6578c5aac98e7262970a9239f4dcefd26d6f008b553","other":"72a76f668d9b923914860eb4f8577bc98c153f6dd222cd36a0bbdef2bab7f068","up":true},{"one":"17406dea5046f00e27eaf74e166a945c9485139d6edcdfcd84f5b03f50eedd0a","other":"1929b01c0f85af7452a0f358b54f6b36640a196b366909172af594a1648fe64c","up":true},{"one":"184e9e00ab4fe1669d4d99fb33d418d33eff927da38cc997f69679443c24b20b","other":"034de66774eda26b93e342c9b94b9deaeb6297650c819b144a5832bebfe6b02f","up":true},{"one":"82847a4af4f50622650d035f69151b202bccd5fc92302a617602c974603ed997","other":"8330e2b8ae2f184bb8dc5e153fafa4dafe86f84ec692d3ee91413cc07b1cd9e2","up":true},{"one":"c2f9b4abed9c6a839fe4c03a80bd396fd187a8784ba47a83687d3a54b7e2eddf","other":"cabfdfb789cc20962eaba1dbe68d6dc0466e699d22dc5b29f27a5cd555398795","up":true},{"one":"dd92b3d42414fd5eff5c1e4ca55c63cd7036634049995b72a20cdf7ca1321978","other":"deec6a8beb4e5e441dd42311354194c3bef9448e8859b4ccd401645b69217d12","up":true},{"one":"6450bb5e880411abcb60258d8560949f6f70d92ba7bfa9a4d7845463c48dab30","other":"64e642de2667a7563c774050d368858d99aff433efbd1cb68361e3e244629b03","up":true},{"one":"be0fb2b440b91e719c20f51b673eb9f2f66c7af77b0b0ade312998cdffcc5045","other":"b3555baa764c4562935b93533ee6c5a6df631e846c3ab512fdb1d6b901a68c60","up":true},{"one":"5c623fa0103108d0b1e24e6d01a6624ce3b59a9e7c422c45dfc1211676785542","other":"58a90b58858417a4e972626421ed8e78b1b3e5ac69fcedd22c58a8ab4c6147df","up":true},{"one":"6daaf515999c9a3491c963f76be82ed6005616bf7ba98247b01d6a89a9af1d71","other":"75e282c0f3d355a40573e6578c5aac98e7262970a9239f4dcefd26d6f008b553","up":true},{"one":"68a63ebc4833dedfdb6d534438ffcccd042f60434bee0e39f4cb3726e7413e7a","other":"6daaf515999c9a3491c963f76be82ed6005616bf7ba98247b01d6a89a9af1d71","up":true},{"one":"216e0370111e2e03927b803ae788f9947de8e241d41dbf6a70983cf0ecd68af1","other":"2803f212eb4aa4f49224b16b2de88ba8652ad115321ee1e60cdbd926ecdad38a","up":true},{"one":"216e0370111e2e03927b803ae788f9947de8e241d41dbf6a70983cf0ecd68af1","other":"2d531c50183f0115269b3feaecf45927a3ac44e1be2a263c7e5d2274d8379b1c","up":true},{"one":"4c211c117e555c2ac831d5688615b6b4c5e31f1d7c7906b34f0cbcdbc45482b4","other":"47753fdca855ea79abf667b50aa9c90a132d44bdd1572c3e3c411c8ee7e5b5f4","up":true},{"one":"69753865aacaaf72d9bf6d265c885d3f705804ff4b2675f7aa860641dacab2a0","other":"6daaf515999c9a3491c963f76be82ed6005616bf7ba98247b01d6a89a9af1d71","up":true},{"one":"f005a4d3453d52434f2b5be4006e653b50b52ad31926d654722fc3df00f1689c","other":"f33c07a818863a358358989ec71504abad3ca0a7c81b54aad59075a766fad501","up":true},{"one":"f33c07a818863a358358989ec71504abad3ca0a7c81b54aad59075a766fad501","other":"f3d50811ef10661d3ef9978077cd7181387298f306833ab6e27f25cbb77435cd","up":true},{"one":"27db66d13ee8168aca89786febd6971dd1d6c554bca8501052065cb47631560d","other":"2471776037d55a05df2b15bcefe52cb1f4c942e9e15113abc2a0c1fcbaa5d626","up":true},{"one":"b3555baa764c4562935b93533ee6c5a6df631e846c3ab512fdb1d6b901a68c60","other":"b60e77c40ddc9dc78a4ad346add37e60f10f2999de836615db53524487d1ede9","up":true},{"one":"7bcb0d7b9f84aed413cf9b2a7851ba6d1138d85382aa20e6c939a43c8e59c034","other":"0e344c6e27c23bd36bdd3ddcefa4e577fdc9461e52c7ce20135733a08b987b82","up":true},{"one":"f4a0f76b30bcf5987cfa3f4f4b0aa3445f39d60a1f51519fa660c27b5d833dde","other":"fa9a809f016097d949fa1463a1c8f08871c7d38e60b7df6d3e28ab04ccd3a143","up":true},{"one":"bc71f3e409edb989e26607448491530c5451053b582ea64d882525451ac940bb","other":"be0fb2b440b91e719c20f51b673eb9f2f66c7af77b0b0ade312998cdffcc5045","up":true},{"one":"7a68fa44bbec187272e2d5dfbd6ed8af31a1a365aa72aa50db02350ebe98c859","other":"72a53f0fb1b51855cb4054a39cbd1309a76a862d36e18af9ba0456a60325c06e","up":true},{"one":"36d5952685c95e42bef14f77b63705897ca71d24d21e4e9efc772d9cabd21122","other":"3871492c8c62cd74cbe65a993669e4978cc641879a5223dd6b9e687f050a1c40","up":true},{"one":"deec6a8beb4e5e441dd42311354194c3bef9448e8859b4ccd401645b69217d12","other":"d23c97bebcde26f5e351c4b975c76aaf604fd206f9b9063ecbda538e7a52f514","up":true},{"one":"bd486e1e15df4c7539b1ad5b54f7566dd4836a430e9f7d3503881fa79e258d9b","other":"b3555baa764c4562935b93533ee6c5a6df631e846c3ab512fdb1d6b901a68c60","up":true},{"one":"82847a4af4f50622650d035f69151b202bccd5fc92302a617602c974603ed997","other":"836e65dfe6f01e1d2934655c1846cb86fed6e41ea951a109d7a20bb14cb4c10a","up":true},{"one":"7bee7967ff7b07243bed55b6d060d5ec2a1f28b530ed65cd055dc5b468a0f878","other":"73d0d1d4a2b7250f51e57c13cc48bc6b20682320ce12ee8e5765afeef7d9de42","up":true},{"one":"73d0d1d4a2b7250f51e57c13cc48bc6b20682320ce12ee8e5765afeef7d9de42","other":"75e282c0f3d355a40573e6578c5aac98e7262970a9239f4dcefd26d6f008b553","up":true},{"one":"47753fdca855ea79abf667b50aa9c90a132d44bdd1572c3e3c411c8ee7e5b5f4","other":"4d750666dc0e9e2c244c43492801c1d7ec6208954a0cb5f8bb793b912440753a","up":true},{"one":"b3555baa764c4562935b93533ee6c5a6df631e846c3ab512fdb1d6b901a68c60","other":"b5fc43e8c0df3279d6a12cd8b03012cb8d2205208324018c7ae725745a99a2f3","up":true},{"one":"f611d8039385ad56260ab391763e3627aadd2756565fedc3ec95f76124da0efc","other":"fa9a809f016097d949fa1463a1c8f08871c7d38e60b7df6d3e28ab04ccd3a143","up":true},{"one":"947205fd85a17330a6d5c51a66548c5f69779c76ab12408f8fc6d33d7c6b8e9d","other":"836e65dfe6f01e1d2934655c1846cb86fed6e41ea951a109d7a20bb14cb4c10a","up":true},{"one":"8b35236da99930bf8f5ef6c7555bb18b80ce2e34361bbbfd6baf55a6483e54ff","other":"836e65dfe6f01e1d2934655c1846cb86fed6e41ea951a109d7a20bb14cb4c10a","up":true},{"one":"836e65dfe6f01e1d2934655c1846cb86fed6e41ea951a109d7a20bb14cb4c10a","other":"8fb8208b7167dd06cc08778b507ccd856751d3df6dfbaeac18b9f527b6628523","up":true}]} \ No newline at end of file diff --git a/vendor/github.com/ethereum/go-ethereum/swarm/network/stream/testing/snapshot_16.json b/vendor/github.com/ethereum/go-ethereum/swarm/network/stream/testing/snapshot_16.json deleted file mode 100644 index e209f568..00000000 --- a/vendor/github.com/ethereum/go-ethereum/swarm/network/stream/testing/snapshot_16.json +++ /dev/null @@ -1 +0,0 @@ -{"nodes":[{"node":{"info":{"id":"427e0288b5a474d9704df47bf2eb97b8af979bda199f86b7bd58824933958127","name":"node_427e0288b5a474d9704df47bf2eb97b8af979bda199f86b7bd58824933958127","enode":"enode://7f2eecc4ffd81993f1f7f961ca00f52eacd77fb52f215cea32246a5742deb627c6b2be0a2112d7114b5d26a898de7c6dcfe18595458e0f50181497fe5631ba8a@127.0.0.1:0","enr":"0xf88fb8408e4b56b8de4863c72f40c38f16925319181e8079bc13b5b14c5ac1626070b4670ff42821d18b044558b1a6e81c4e6afacbcd917915b9c26b325e1775ec15fea00183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1027f2eecc4ffd81993f1f7f961ca00f52eacd77fb52f215cea32246a5742deb627","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"Qn4CiLWkdNlwTfR78uuXuK+Xm9oZn4a3vViCSTOVgSc=","hive":"\n=========================================================================\nThu Feb 28 18:00:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 427e02\npopulation: 8 (15), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 a010 c55a | 9 a010 (0) a61c (0) bdf0 (0) 95b4 (0)\n001 2 2653 0d52 | 2 0d52 (0) 2653 (0)\n002 1 6ff9 | 1 6ff9 (0)\n003 1 5942 | 1 5942 (0)\n============ DEPTH: 4 ==========================================\n004 2 4ebd 4c14 | 2 4ebd (0) 4c14 (0)\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"427e0288b5a474d9704df47bf2eb97b8af979bda199f86b7bd58824933958127","private_key":"2939b9a1fe2ce1f27e9d22f9f00cb77563507ca8b5a62bb93fe2a7e1dd5daf4b","name":"node_427e0288b5a474d9704df47bf2eb97b8af979bda199f86b7bd58824933958127","services":["streamer"],"enable_msg_events":true,"port":39289},"up":true}},{"node":{"info":{"id":"c55a176b1c185e526e17d2ac2556e59796bc1d3a6b814eecdb0ca9519c8c5163","name":"node_c55a176b1c185e526e17d2ac2556e59796bc1d3a6b814eecdb0ca9519c8c5163","enode":"enode://0e17a602ec55b9499390093d13ef045635eb8b755783f80b0bd57c784cc2a6d52901b4170ec9202ce13084de51eafb9ab6d225f9e83266f280649eecbe332b47@127.0.0.1:0","enr":"0xf88fb8408658caccb6f16b440efbf35061f2e13adc4b3b4469df310a00d8801f752ceed24190e9a75879b496bb999add5be68c8d03127351456f69a3e45a6810f3f1e2900183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1030e17a602ec55b9499390093d13ef045635eb8b755783f80b0bd57c784cc2a6d5","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"xVoXaxwYXlJuF9KsJVbll5a8HTprgU7s2wypUZyMUWM=","hive":"\n=========================================================================\nThu Feb 28 18:00:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: c55a17\npopulation: 8 (15), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 2653 427e | 7 0d52 (0) 2653 (0) 6ff9 (0) 5942 (0)\n001 2 bdf0 a010 | 4 a010 (0) a61c (0) bdf0 (0) 95b4 (0)\n002 1 edd7 | 1 edd7 (0)\n============ DEPTH: 3 ==========================================\n003 2 d6f7 dd12 | 2 dd12 (0) d6f7 (0)\n004 0 | 0\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 1 c5bf | 1 c5bf (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"c55a176b1c185e526e17d2ac2556e59796bc1d3a6b814eecdb0ca9519c8c5163","private_key":"0cb4fe0b34f942bcabc5485300829a5110c4ed6571e8064f63c88fcd1669485f","name":"node_c55a176b1c185e526e17d2ac2556e59796bc1d3a6b814eecdb0ca9519c8c5163","services":["streamer"],"enable_msg_events":true,"port":46727},"up":true}},{"node":{"info":{"id":"2653c3d78d1c11fd3a9e8043ae5c77037b01e05ddd2a3d4f6284844d098a23e5","name":"node_2653c3d78d1c11fd3a9e8043ae5c77037b01e05ddd2a3d4f6284844d098a23e5","enode":"enode://fd7a5476ddb69019642a906aa79f22a853228df3bc57104c329683b8dd0c70f2a329ef7ec24ef92baa6a39c8abac12cf16a916cc605aecc84e4ab1fc52bbd87b@127.0.0.1:0","enr":"0xf88fb840b9c3ae42b41ec15fee9985def0ab98f7ddf14501eb0963671e974ced1c9f4ad963ed4466ac5d767f55188b6ab91097e0848f8d7a65d532f5d31bd1d78f36c2570183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103fd7a5476ddb69019642a906aa79f22a853228df3bc57104c329683b8dd0c70f2","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"JlPD140cEf06noBDrlx3A3sB4F3dKj1PYoSETQmKI+U=","hive":"\n=========================================================================\nThu Feb 28 18:00:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 2653c3\npopulation: 11 (15), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 95b4 edd7 dd12 c5bf | 9 bdf0 (0) a010 (0) a61c (0) 95b4 (0)\n============ DEPTH: 1 ==========================================\n001 5 427e 4c14 4ebd 5942 | 5 6ff9 (0) 5942 (0) 4ebd (0) 4c14 (0)\n002 1 0d52 | 1 0d52 (0)\n003 0 | 0\n004 0 | 0\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"2653c3d78d1c11fd3a9e8043ae5c77037b01e05ddd2a3d4f6284844d098a23e5","private_key":"35e97c6f9bf750dbe7d8d2c5bb9c3021af68e2d9143010fabf1934073a446c5d","name":"node_2653c3d78d1c11fd3a9e8043ae5c77037b01e05ddd2a3d4f6284844d098a23e5","services":["streamer"],"enable_msg_events":true,"port":36223},"up":true}},{"node":{"info":{"id":"95b48a9d194f42b8f19ef8ccde337cd221525e04848431a6d843ff968a5f4df5","name":"node_95b48a9d194f42b8f19ef8ccde337cd221525e04848431a6d843ff968a5f4df5","enode":"enode://3903c8019e85c8d7fe4bca9363b929984a2dcda6c45c42bd8deb02e8128dc87b22db7eb84d96815d349e4cc6e7aeebca10fcf2303783e19b4601e36970874caf@127.0.0.1:0","enr":"0xf88fb8407a344f969c3c14d7152c36b0e5fff71c51a514bbb1725b08f74462b88f3e9d197e473c1d43512ee405d57c7a77b17f38e61e96315f31afa03ec6d07390a839c60183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1033903c8019e85c8d7fe4bca9363b929984a2dcda6c45c42bd8deb02e8128dc87b","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"lbSKnRlPQrjxnvjM3jN80iFSXgSEhDGm2EP/lopfTfU=","hive":"\n=========================================================================\nThu Feb 28 18:00:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 95b48a\npopulation: 8 (15), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 5942 2653 | 7 6ff9 (0) 4c14 (0) 4ebd (0) 427e (0)\n001 3 dd12 c5bf edd7 | 5 edd7 (0) dd12 (0) d6f7 (0) c5bf (0)\n============ DEPTH: 2 ==========================================\n002 3 bdf0 a010 a61c | 3 bdf0 (0) a010 (0) a61c (0)\n003 0 | 0\n004 0 | 0\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"95b48a9d194f42b8f19ef8ccde337cd221525e04848431a6d843ff968a5f4df5","private_key":"d3b3aee83368bb48feefe0e7782a19a55e4d210864402337e2117313dcd5b189","name":"node_95b48a9d194f42b8f19ef8ccde337cd221525e04848431a6d843ff968a5f4df5","services":["streamer"],"enable_msg_events":true,"port":38325},"up":true}},{"node":{"info":{"id":"594203c8fa170bece1eb12ac569b1731b86a603d07f5022a7d7b2bf205fc6151","name":"node_594203c8fa170bece1eb12ac569b1731b86a603d07f5022a7d7b2bf205fc6151","enode":"enode://6718e290bc219c921b7b7fa26a7c29176e3175c6eaf273a80bb13b4edc560ff829385aba50dd0171f098716ad83eece60222801b9a074f9c926980dd93813aa3@127.0.0.1:0","enr":"0xf88fb84035a56b10844271058e2d9ca9b3e3c67de90a8c8323d7e5f8531f02952e855a5c0aa53aeb41b6de4638cf94d7301476ccd46e9bdea86f61ef61d97d22957a23a50183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1036718e290bc219c921b7b7fa26a7c29176e3175c6eaf273a80bb13b4edc560ff8","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"WUIDyPoXC+zh6xKsVpsXMbhqYD0H9QIqfXsr8gX8YVE=","hive":"\n=========================================================================\nThu Feb 28 18:00:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 594203\npopulation: 8 (15), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 edd7 95b4 | 9 edd7 (0) dd12 (0) d6f7 (0) c5bf (0)\n001 2 2653 0d52 | 2 0d52 (0) 2653 (0)\n002 1 6ff9 | 1 6ff9 (0)\n============ DEPTH: 3 ==========================================\n003 3 427e 4c14 4ebd | 3 427e (0) 4c14 (0) 4ebd (0)\n004 0 | 0\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"594203c8fa170bece1eb12ac569b1731b86a603d07f5022a7d7b2bf205fc6151","private_key":"fefef9454f2f776b9e1f7baffba1b6008e32ec48486a4183819a5d611d5a4928","name":"node_594203c8fa170bece1eb12ac569b1731b86a603d07f5022a7d7b2bf205fc6151","services":["streamer"],"enable_msg_events":true,"port":37077},"up":true}},{"node":{"info":{"id":"4ebda1ce79761129ce872f50bea9ae2df39d47e4cd7a1d8f1bb988c82b8667a9","name":"node_4ebda1ce79761129ce872f50bea9ae2df39d47e4cd7a1d8f1bb988c82b8667a9","enode":"enode://4d2df1c9d3ed42f561416caf0af60ff21b68e7a24e706595f10893a5cad5c13f5f4f0fe27897ed3eb1717b4e3444574b129900211652b85a56bd9c7bd13cc460@127.0.0.1:0","enr":"0xf88fb840633f9b9c1dce11bb4eb9f00b99b7f31aecc61374fc1ed19ceb3bd40f45a3ba4236f7623af2e69b74ca218e371d317023ae589c23ca11949cb431bfe36defd40f0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1024d2df1c9d3ed42f561416caf0af60ff21b68e7a24e706595f10893a5cad5c13f","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"Tr2hznl2ESnOhy9QvqmuLfOdR+TNeh2PG7mIyCuGZ6k=","hive":"\n=========================================================================\nThu Feb 28 18:00:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 4ebda1\npopulation: 8 (15), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 edd7 a61c | 9 edd7 (0) d6f7 (0) dd12 (0) c5bf (0)\n001 2 2653 0d52 | 2 0d52 (0) 2653 (0)\n002 1 6ff9 | 1 6ff9 (0)\n003 1 5942 | 1 5942 (0)\n============ DEPTH: 4 ==========================================\n004 1 427e | 1 427e (0)\n005 0 | 0\n006 1 4c14 | 1 4c14 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"4ebda1ce79761129ce872f50bea9ae2df39d47e4cd7a1d8f1bb988c82b8667a9","private_key":"1f13487aa3f685a730149f567e1e95ab7ea53d54717151390b1bf8d236ac93c1","name":"node_4ebda1ce79761129ce872f50bea9ae2df39d47e4cd7a1d8f1bb988c82b8667a9","services":["streamer"],"enable_msg_events":true,"port":45609},"up":true}},{"node":{"info":{"id":"a61c0fe541a562b08d92fabd643a48694fbfbaf704d1c782595ad0e9377a06b6","name":"node_a61c0fe541a562b08d92fabd643a48694fbfbaf704d1c782595ad0e9377a06b6","enode":"enode://16e487d4bc68f28f54477a9bf864b80c62a2802f4f902e69be114c51e8c756ee5e4cda3d522050beb554d731c791ca777cf2a0db1612513434577336ce2f6a16@127.0.0.1:0","enr":"0xf88fb8404beea9a3e5a8fddfbb54ee788fd2b1c2908f9d0c50c1807416315024e491dc9702a1a7a778d302e03937e2bde114fb8d8246f39b32e8e5785147f7eb15f988d30183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10216e487d4bc68f28f54477a9bf864b80c62a2802f4f902e69be114c51e8c756ee","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"phwP5UGlYrCNkvq9ZDpIaU+/uvcE0ceCWVrQ6Td6BrY=","hive":"\n=========================================================================\nThu Feb 28 18:00:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: a61c0f\npopulation: 7 (15), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 0d52 4ebd | 7 0d52 (0) 2653 (0) 6ff9 (0) 5942 (0)\n001 2 d6f7 edd7 | 5 edd7 (0) d6f7 (0) dd12 (0) c5bf (0)\n002 1 95b4 | 1 95b4 (0)\n============ DEPTH: 3 ==========================================\n003 1 bdf0 | 1 bdf0 (0)\n004 0 | 0\n005 1 a010 | 1 a010 (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"a61c0fe541a562b08d92fabd643a48694fbfbaf704d1c782595ad0e9377a06b6","private_key":"aca753870ec0d4820df685f13895e1e883e0c533dd949d7957b54a7278e2fa2f","name":"node_a61c0fe541a562b08d92fabd643a48694fbfbaf704d1c782595ad0e9377a06b6","services":["streamer"],"enable_msg_events":true,"port":36847},"up":true}},{"node":{"info":{"id":"a0109d6c41a317e857f329f30898f7328dd3812d1fc7008a68fe38e6d804b7a2","name":"node_a0109d6c41a317e857f329f30898f7328dd3812d1fc7008a68fe38e6d804b7a2","enode":"enode://da90e12ec1d6737b50a34a3ee3e75fa3e164a4c510506bad503721813291f09bad6b8f3008810a6e738d31e6365ca2a56a278477d23fd18e86e258dce44ab378@127.0.0.1:0","enr":"0xf88fb8404256771ae0b0cd6d23b73a6df956fef179cccc697e78699e807513021fa9c80a4ddd2398cd82f160a433345b7ca8f651ef08d43e87416be27744f146f325e7c10183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102da90e12ec1d6737b50a34a3ee3e75fa3e164a4c510506bad503721813291f09b","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"oBCdbEGjF+hX8ynzCJj3Mo3TgS0fxwCKaP445tgEt6I=","hive":"\n=========================================================================\nThu Feb 28 18:00:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: a0109d\npopulation: 11 (15), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 6ff9 4c14 427e 0d52 | 7 6ff9 (0) 5942 (0) 427e (0) 4c14 (0)\n001 4 dd12 d6f7 c5bf c55a | 5 c5bf (0) c55a (0) d6f7 (0) dd12 (0)\n002 1 95b4 | 1 95b4 (0)\n============ DEPTH: 3 ==========================================\n003 1 bdf0 | 1 bdf0 (0)\n004 0 | 0\n005 1 a61c | 1 a61c (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"a0109d6c41a317e857f329f30898f7328dd3812d1fc7008a68fe38e6d804b7a2","private_key":"2def6be33926ceb95119b6eef9b225e963b37378a26743dd6dea6f52e6b188ed","name":"node_a0109d6c41a317e857f329f30898f7328dd3812d1fc7008a68fe38e6d804b7a2","services":["streamer"],"enable_msg_events":true,"port":46777},"up":true}},{"node":{"info":{"id":"0d529d1464743675d91fc4049d70f428b326f384e88ea14c53ff23a2e45a65be","name":"node_0d529d1464743675d91fc4049d70f428b326f384e88ea14c53ff23a2e45a65be","enode":"enode://3c12b2884039d0d47926d5fe5fe932ed2231c1df1e29c39ec02452bdfd172fee3db62b4568adc560ddbf71cce469b473e124fff10b3f083910526d18b33c42b2@127.0.0.1:0","enr":"0xf88fb84051550b2edf140f46ee64c9c9fad39caafba3103379cfc9b363025cdafb9002d0665ba3a2c0f0701f0e80299e78c9ab7930d8e19fb5251a0406408d5d5bf95cae0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1023c12b2884039d0d47926d5fe5fe932ed2231c1df1e29c39ec02452bdfd172fee","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"DVKdFGR0NnXZH8QEnXD0KLMm84TojqFMU/8jouRaZb4=","hive":"\n=========================================================================\nThu Feb 28 18:00:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 0d529d\npopulation: 12 (15), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 d6f7 dd12 edd7 bdf0 | 9 c55a (0) c5bf (0) d6f7 (0) dd12 (0)\n============ DEPTH: 1 ==========================================\n001 5 6ff9 5942 4ebd 4c14 | 5 5942 (0) 427e (0) 4c14 (0) 4ebd (0)\n002 1 2653 | 1 2653 (0)\n003 0 | 0\n004 0 | 0\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"0d529d1464743675d91fc4049d70f428b326f384e88ea14c53ff23a2e45a65be","private_key":"be1de243c5450fb51af634ada17a96c06515fbca77202cdd848c126934749c1b","name":"node_0d529d1464743675d91fc4049d70f428b326f384e88ea14c53ff23a2e45a65be","services":["streamer"],"enable_msg_events":true,"port":34387},"up":true}},{"node":{"info":{"id":"bdf0122698c9da313740d2c9854ac5c177c63cdcc95e3ab415eed6eebd6614b6","name":"node_bdf0122698c9da313740d2c9854ac5c177c63cdcc95e3ab415eed6eebd6614b6","enode":"enode://4410ea88db94cde9ffbf85ead5e867e226979f908d82cb1f3d8583ead0e2ca4a3ba5a2f016df89ec0f0d76c3dccddc0b68a9df33783ed942d3df6f138e8169d8@127.0.0.1:0","enr":"0xf88fb8406f933c472c99bd51a9e066d03732148e70013d2eadb5a57bf1ca3d7f0c2266140e8626ff05a46e283a22ff5e16c10fecd00ae7bcbd2e746440733bbeca6c78940183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1024410ea88db94cde9ffbf85ead5e867e226979f908d82cb1f3d8583ead0e2ca4a","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"vfASJpjJ2jE3QNLJhUrFwXfGPNzJXjq0Fe7W7r1mFLY=","hive":"\n=========================================================================\nThu Feb 28 18:00:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: bdf012\npopulation: 7 (15), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 6ff9 0d52 | 7 5942 (0) 427e (0) 4c14 (0) 4ebd (0)\n001 2 c5bf c55a | 5 c55a (0) c5bf (0) d6f7 (0) dd12 (0)\n002 1 95b4 | 1 95b4 (0)\n============ DEPTH: 3 ==========================================\n003 2 a61c a010 | 2 a61c (0) a010 (0)\n004 0 | 0\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"bdf0122698c9da313740d2c9854ac5c177c63cdcc95e3ab415eed6eebd6614b6","private_key":"f89bc000169f6a15dd6881cb70ec8f841a60aceddbde85af267a2515c91e394b","name":"node_bdf0122698c9da313740d2c9854ac5c177c63cdcc95e3ab415eed6eebd6614b6","services":["streamer"],"enable_msg_events":true,"port":40993},"up":true}},{"node":{"info":{"id":"6ff9a3f6f1f8019e366b59cce07e3737b1e6e4ba2b4ed9012cdd2b683908b004","name":"node_6ff9a3f6f1f8019e366b59cce07e3737b1e6e4ba2b4ed9012cdd2b683908b004","enode":"enode://6936d2429208f3e456ef654a7a0511e310ec4fb728a62d03861c0a4a8e9d22f5f0f3a90b8bf03d3654afb675e371e2bb5f7065f2662292078a5e3c73a0c9ee04@127.0.0.1:0","enr":"0xf88fb840f98c7122fa9802971ba1acc50caa9e447e49b0dbe4372fc40405128ca954f4dd07b794976a20880bfdd2a586adc2438ddd9e35fc93e6106371af5363ede39d2b0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1026936d2429208f3e456ef654a7a0511e310ec4fb728a62d03861c0a4a8e9d22f5","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"b/mj9vH4AZ42a1nM4H43N7Hm5LorTtkBLN0raDkIsAQ=","hive":"\n=========================================================================\nThu Feb 28 18:00:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 6ff9a3\npopulation: 9 (15), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 a010 bdf0 c5bf | 9 95b4 (0) a010 (0) a61c (0) bdf0 (0)\n001 2 0d52 2653 | 2 2653 (0) 0d52 (0)\n============ DEPTH: 2 ==========================================\n002 4 5942 427e 4c14 4ebd | 4 5942 (0) 427e (0) 4c14 (0) 4ebd (0)\n003 0 | 0\n004 0 | 0\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"6ff9a3f6f1f8019e366b59cce07e3737b1e6e4ba2b4ed9012cdd2b683908b004","private_key":"1dd45d1d581cf612c3b51e58a8a76daac07d6c3e6060e9ebed1d697999257945","name":"node_6ff9a3f6f1f8019e366b59cce07e3737b1e6e4ba2b4ed9012cdd2b683908b004","services":["streamer"],"enable_msg_events":true,"port":33543},"up":true}},{"node":{"info":{"id":"c5bf867c9ee0db831504395b444a7bf6c5f6c6d8d0b6c741296fcab03208491f","name":"node_c5bf867c9ee0db831504395b444a7bf6c5f6c6d8d0b6c741296fcab03208491f","enode":"enode://939e9a819895e0193947e390c9d561c3b1bca8eb6e19eaaef503a49b811b4e436932430dec5d7e01184cc7c7f4680964ccd2d7d1f31e6284148cb65190aea8fc@127.0.0.1:0","enr":"0xf88fb840aa054cfdc1388722d83c8026d2d2c4a9a79187fbcfef0e7cd0454597a55ce9e3129ffec027b96b03efabc975a4461caa27973336fd65caeb105a861e825e72b20183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102939e9a819895e0193947e390c9d561c3b1bca8eb6e19eaaef503a49b811b4e43","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"xb+GfJ7g24MVBDlbREp79sX2xtjQtsdBKW/KsDIISR8=","hive":"\n=========================================================================\nThu Feb 28 18:00:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: c5bf86\npopulation: 9 (15), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 2653 6ff9 | 7 2653 (0) 0d52 (0) 5942 (0) 427e (0)\n001 3 95b4 bdf0 a010 | 4 95b4 (0) a010 (0) a61c (0) bdf0 (0)\n002 1 edd7 | 1 edd7 (0)\n============ DEPTH: 3 ==========================================\n003 2 dd12 d6f7 | 2 d6f7 (0) dd12 (0)\n004 0 | 0\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 1 c55a | 1 c55a (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"c5bf867c9ee0db831504395b444a7bf6c5f6c6d8d0b6c741296fcab03208491f","private_key":"f55426e1ac52ab19cd155aeec3bf75415a3c75bfe89987b9747b3bb5cfe2ab54","name":"node_c5bf867c9ee0db831504395b444a7bf6c5f6c6d8d0b6c741296fcab03208491f","services":["streamer"],"enable_msg_events":true,"port":38361},"up":true}},{"node":{"info":{"id":"edd7b22a17fec3824d77db882b5fb4e82b08beca8d59e0f2dc8924f7bd6f8cee","name":"node_edd7b22a17fec3824d77db882b5fb4e82b08beca8d59e0f2dc8924f7bd6f8cee","enode":"enode://4db77ce0656ae19063ee88a21dab483fc39b82eab3ce8a5a60287a32acd7585f163ee6ec724f66bcf40f40fec9cdb9e4e4c28ec4b7342960eeb505ac8de2d14a@127.0.0.1:0","enr":"0xf88fb840a6875960f8077f6e6a7f474110885c3e4748b3cf61e6348bd9b42efb3def651d35ab2bf6b780587204f2ae2b56019cbbe01464e2b2e221a3bc50d27052b963bd0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1024db77ce0656ae19063ee88a21dab483fc39b82eab3ce8a5a60287a32acd7585f","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"7deyKhf+w4JNd9uIK1+06CsIvsqNWeDy3Ikk971vjO4=","hive":"\n=========================================================================\nThu Feb 28 18:00:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: edd7b2\npopulation: 10 (15), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 4ebd 5942 2653 0d52 | 7 0d52 (0) 2653 (0) 6ff9 (0) 5942 (0)\n001 2 a61c 95b4 | 4 95b4 (0) a010 (0) a61c (0) bdf0 (0)\n============ DEPTH: 2 ==========================================\n002 4 d6f7 dd12 c55a c5bf | 4 d6f7 (0) dd12 (0) c55a (0) c5bf (0)\n003 0 | 0\n004 0 | 0\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"edd7b22a17fec3824d77db882b5fb4e82b08beca8d59e0f2dc8924f7bd6f8cee","private_key":"e9fb7f15ab0c529f7fbd15c7fead7762c5ff8563f928d0c77e5fac982a5c6cb3","name":"node_edd7b22a17fec3824d77db882b5fb4e82b08beca8d59e0f2dc8924f7bd6f8cee","services":["streamer"],"enable_msg_events":true,"port":41753},"up":true}},{"node":{"info":{"id":"dd1203e0060db1a9c2d40052078756adfdb6ec485594e4116a997b9dbcaf9002","name":"node_dd1203e0060db1a9c2d40052078756adfdb6ec485594e4116a997b9dbcaf9002","enode":"enode://57d7341b933399ef218e3b4e9155299740435d8f39d51bcd55eb0e0206cf3872b5d8edeabcb29fc52a10fb13b2332945895992ed536818ae3d5ca724da435216@127.0.0.1:0","enr":"0xf88fb840be4d387446799bfc72ee406a3f5bff45cefff30cb27b353e2b5d804cffcf842f47af74326db8059b3f239b4aed3f7aaf70e88870dacc93c7700ecde11e125b2d0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10257d7341b933399ef218e3b4e9155299740435d8f39d51bcd55eb0e0206cf3872","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"3RID4AYNsanC1ABSB4dWrf227EhVlOQRapl7nbyvkAI=","hive":"\n=========================================================================\nThu Feb 28 18:00:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: dd1203\npopulation: 8 (15), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 2653 0d52 | 7 0d52 (0) 2653 (0) 6ff9 (0) 5942 (0)\n001 2 a010 95b4 | 4 95b4 (0) a010 (0) a61c (0) bdf0 (0)\n002 1 edd7 | 1 edd7 (0)\n============ DEPTH: 3 ==========================================\n003 2 c5bf c55a | 2 c5bf (0) c55a (0)\n004 1 d6f7 | 1 d6f7 (0)\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"dd1203e0060db1a9c2d40052078756adfdb6ec485594e4116a997b9dbcaf9002","private_key":"1d61966a5bf6ace65cb3663c40fcf26e51904e8ac267f799ba3804f58bc2515b","name":"node_dd1203e0060db1a9c2d40052078756adfdb6ec485594e4116a997b9dbcaf9002","services":["streamer"],"enable_msg_events":true,"port":36287},"up":true}},{"node":{"info":{"id":"d6f7abd4ef7d9144e276a5ba3fc4087eca1106dead333f3a219ca18e2ac49422","name":"node_d6f7abd4ef7d9144e276a5ba3fc4087eca1106dead333f3a219ca18e2ac49422","enode":"enode://ccca2d21c63669239abca558b432ffda2abd413d3b4564be1c878d3ef8658697d42ef55b3c5fd79afd363a5d60e776e162371e6f50f49b2d78005d54d1212ed7@127.0.0.1:0","enr":"0xf88fb840be7cf77f4591f92fcdb31616f1dd8a29cb45f576ab0ac5ca1336aa394c6c9aad15013911a39a06cf43a096dd158fe05af68f9b36e3e68ab1ffe4663d5519ce730183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103ccca2d21c63669239abca558b432ffda2abd413d3b4564be1c878d3ef8658697","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"1ver1O99kUTidqW6P8QIfsoRBt6tMz86IZyhjirElCI=","hive":"\n=========================================================================\nThu Feb 28 18:00:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: d6f7ab\npopulation: 8 (15), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 0d52 4c14 | 7 0d52 (0) 2653 (0) 6ff9 (0) 5942 (0)\n001 2 a61c a010 | 4 a010 (0) a61c (0) bdf0 (0) 95b4 (0)\n002 1 edd7 | 1 edd7 (0)\n============ DEPTH: 3 ==========================================\n003 2 c55a c5bf | 2 c5bf (0) c55a (0)\n004 1 dd12 | 1 dd12 (0)\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"d6f7abd4ef7d9144e276a5ba3fc4087eca1106dead333f3a219ca18e2ac49422","private_key":"689c424f352a14e065158f6edd016775422abd2ca2e3b67121797457f8cb6b57","name":"node_d6f7abd4ef7d9144e276a5ba3fc4087eca1106dead333f3a219ca18e2ac49422","services":["streamer"],"enable_msg_events":true,"port":45859},"up":true}},{"node":{"info":{"id":"4c144ac2f4ee4a8653a3605cec20160384cf471a1fdfaf694a721770a2925434","name":"node_4c144ac2f4ee4a8653a3605cec20160384cf471a1fdfaf694a721770a2925434","enode":"enode://55b49fb5af1798f20da9536cf2b6b9be5f8660d6def0b5ab2031ed6ae8e4041f0a8787aa1e58f5b493fcb8839bf95058e4955790e5723c6c088ae104d10b42c5@127.0.0.1:0","enr":"0xf88fb840b116a8086d357c160f4515a7f567b528bd41cbf6da84bc00623ea30cd4d4cf052ada52dcb295f404c509d1319cd51139b0d12e9ad279da4a31483922e11a73730183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10355b49fb5af1798f20da9536cf2b6b9be5f8660d6def0b5ab2031ed6ae8e4041f","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"TBRKwvTuSoZTo2Bc7CAWA4TPRxof369pSnIXcKKSVDQ=","hive":"\n=========================================================================\nThu Feb 28 18:00:04 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 4c144a\npopulation: 8 (15), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 a010 d6f7 | 9 a010 (0) a61c (0) bdf0 (0) 95b4 (0)\n001 2 2653 0d52 | 2 0d52 (0) 2653 (0)\n002 1 6ff9 | 1 6ff9 (0)\n003 1 5942 | 1 5942 (0)\n============ DEPTH: 4 ==========================================\n004 1 427e | 1 427e (0)\n005 0 | 0\n006 1 4ebd | 1 4ebd (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"4c144ac2f4ee4a8653a3605cec20160384cf471a1fdfaf694a721770a2925434","private_key":"20caf36455148590aefee286656630f80eaf3452f0e12a90d0bec13e3319653b","name":"node_4c144ac2f4ee4a8653a3605cec20160384cf471a1fdfaf694a721770a2925434","services":["streamer"],"enable_msg_events":true,"port":43573},"up":true}}],"conns":[{"one":"427e0288b5a474d9704df47bf2eb97b8af979bda199f86b7bd58824933958127","other":"c55a176b1c185e526e17d2ac2556e59796bc1d3a6b814eecdb0ca9519c8c5163","up":true},{"one":"c55a176b1c185e526e17d2ac2556e59796bc1d3a6b814eecdb0ca9519c8c5163","other":"2653c3d78d1c11fd3a9e8043ae5c77037b01e05ddd2a3d4f6284844d098a23e5","up":true},{"one":"2653c3d78d1c11fd3a9e8043ae5c77037b01e05ddd2a3d4f6284844d098a23e5","other":"95b48a9d194f42b8f19ef8ccde337cd221525e04848431a6d843ff968a5f4df5","up":true},{"one":"95b48a9d194f42b8f19ef8ccde337cd221525e04848431a6d843ff968a5f4df5","other":"594203c8fa170bece1eb12ac569b1731b86a603d07f5022a7d7b2bf205fc6151","up":true},{"one":"594203c8fa170bece1eb12ac569b1731b86a603d07f5022a7d7b2bf205fc6151","other":"4ebda1ce79761129ce872f50bea9ae2df39d47e4cd7a1d8f1bb988c82b8667a9","up":true},{"one":"4ebda1ce79761129ce872f50bea9ae2df39d47e4cd7a1d8f1bb988c82b8667a9","other":"a61c0fe541a562b08d92fabd643a48694fbfbaf704d1c782595ad0e9377a06b6","up":true},{"one":"a61c0fe541a562b08d92fabd643a48694fbfbaf704d1c782595ad0e9377a06b6","other":"a0109d6c41a317e857f329f30898f7328dd3812d1fc7008a68fe38e6d804b7a2","up":true},{"one":"a0109d6c41a317e857f329f30898f7328dd3812d1fc7008a68fe38e6d804b7a2","other":"0d529d1464743675d91fc4049d70f428b326f384e88ea14c53ff23a2e45a65be","up":true},{"one":"0d529d1464743675d91fc4049d70f428b326f384e88ea14c53ff23a2e45a65be","other":"bdf0122698c9da313740d2c9854ac5c177c63cdcc95e3ab415eed6eebd6614b6","up":true},{"one":"bdf0122698c9da313740d2c9854ac5c177c63cdcc95e3ab415eed6eebd6614b6","other":"6ff9a3f6f1f8019e366b59cce07e3737b1e6e4ba2b4ed9012cdd2b683908b004","up":true},{"one":"6ff9a3f6f1f8019e366b59cce07e3737b1e6e4ba2b4ed9012cdd2b683908b004","other":"c5bf867c9ee0db831504395b444a7bf6c5f6c6d8d0b6c741296fcab03208491f","up":true},{"one":"c5bf867c9ee0db831504395b444a7bf6c5f6c6d8d0b6c741296fcab03208491f","other":"edd7b22a17fec3824d77db882b5fb4e82b08beca8d59e0f2dc8924f7bd6f8cee","up":true},{"one":"edd7b22a17fec3824d77db882b5fb4e82b08beca8d59e0f2dc8924f7bd6f8cee","other":"dd1203e0060db1a9c2d40052078756adfdb6ec485594e4116a997b9dbcaf9002","up":true},{"one":"dd1203e0060db1a9c2d40052078756adfdb6ec485594e4116a997b9dbcaf9002","other":"d6f7abd4ef7d9144e276a5ba3fc4087eca1106dead333f3a219ca18e2ac49422","up":true},{"one":"d6f7abd4ef7d9144e276a5ba3fc4087eca1106dead333f3a219ca18e2ac49422","other":"4c144ac2f4ee4a8653a3605cec20160384cf471a1fdfaf694a721770a2925434","up":true},{"one":"4c144ac2f4ee4a8653a3605cec20160384cf471a1fdfaf694a721770a2925434","other":"427e0288b5a474d9704df47bf2eb97b8af979bda199f86b7bd58824933958127","up":true},{"one":"2653c3d78d1c11fd3a9e8043ae5c77037b01e05ddd2a3d4f6284844d098a23e5","other":"6ff9a3f6f1f8019e366b59cce07e3737b1e6e4ba2b4ed9012cdd2b683908b004","up":true},{"one":"a0109d6c41a317e857f329f30898f7328dd3812d1fc7008a68fe38e6d804b7a2","other":"c55a176b1c185e526e17d2ac2556e59796bc1d3a6b814eecdb0ca9519c8c5163","up":true},{"one":"edd7b22a17fec3824d77db882b5fb4e82b08beca8d59e0f2dc8924f7bd6f8cee","other":"95b48a9d194f42b8f19ef8ccde337cd221525e04848431a6d843ff968a5f4df5","up":true},{"one":"427e0288b5a474d9704df47bf2eb97b8af979bda199f86b7bd58824933958127","other":"0d529d1464743675d91fc4049d70f428b326f384e88ea14c53ff23a2e45a65be","up":true},{"one":"bdf0122698c9da313740d2c9854ac5c177c63cdcc95e3ab415eed6eebd6614b6","other":"c55a176b1c185e526e17d2ac2556e59796bc1d3a6b814eecdb0ca9519c8c5163","up":true},{"one":"a61c0fe541a562b08d92fabd643a48694fbfbaf704d1c782595ad0e9377a06b6","other":"edd7b22a17fec3824d77db882b5fb4e82b08beca8d59e0f2dc8924f7bd6f8cee","up":true},{"one":"edd7b22a17fec3824d77db882b5fb4e82b08beca8d59e0f2dc8924f7bd6f8cee","other":"0d529d1464743675d91fc4049d70f428b326f384e88ea14c53ff23a2e45a65be","up":true},{"one":"594203c8fa170bece1eb12ac569b1731b86a603d07f5022a7d7b2bf205fc6151","other":"0d529d1464743675d91fc4049d70f428b326f384e88ea14c53ff23a2e45a65be","up":true},{"one":"a0109d6c41a317e857f329f30898f7328dd3812d1fc7008a68fe38e6d804b7a2","other":"c5bf867c9ee0db831504395b444a7bf6c5f6c6d8d0b6c741296fcab03208491f","up":true},{"one":"4ebda1ce79761129ce872f50bea9ae2df39d47e4cd7a1d8f1bb988c82b8667a9","other":"0d529d1464743675d91fc4049d70f428b326f384e88ea14c53ff23a2e45a65be","up":true},{"one":"4c144ac2f4ee4a8653a3605cec20160384cf471a1fdfaf694a721770a2925434","other":"0d529d1464743675d91fc4049d70f428b326f384e88ea14c53ff23a2e45a65be","up":true},{"one":"dd1203e0060db1a9c2d40052078756adfdb6ec485594e4116a997b9dbcaf9002","other":"0d529d1464743675d91fc4049d70f428b326f384e88ea14c53ff23a2e45a65be","up":true},{"one":"d6f7abd4ef7d9144e276a5ba3fc4087eca1106dead333f3a219ca18e2ac49422","other":"a0109d6c41a317e857f329f30898f7328dd3812d1fc7008a68fe38e6d804b7a2","up":true},{"one":"c5bf867c9ee0db831504395b444a7bf6c5f6c6d8d0b6c741296fcab03208491f","other":"95b48a9d194f42b8f19ef8ccde337cd221525e04848431a6d843ff968a5f4df5","up":true},{"one":"2653c3d78d1c11fd3a9e8043ae5c77037b01e05ddd2a3d4f6284844d098a23e5","other":"0d529d1464743675d91fc4049d70f428b326f384e88ea14c53ff23a2e45a65be","up":true},{"one":"a61c0fe541a562b08d92fabd643a48694fbfbaf704d1c782595ad0e9377a06b6","other":"95b48a9d194f42b8f19ef8ccde337cd221525e04848431a6d843ff968a5f4df5","up":true},{"one":"4ebda1ce79761129ce872f50bea9ae2df39d47e4cd7a1d8f1bb988c82b8667a9","other":"6ff9a3f6f1f8019e366b59cce07e3737b1e6e4ba2b4ed9012cdd2b683908b004","up":true},{"one":"427e0288b5a474d9704df47bf2eb97b8af979bda199f86b7bd58824933958127","other":"6ff9a3f6f1f8019e366b59cce07e3737b1e6e4ba2b4ed9012cdd2b683908b004","up":true},{"one":"95b48a9d194f42b8f19ef8ccde337cd221525e04848431a6d843ff968a5f4df5","other":"bdf0122698c9da313740d2c9854ac5c177c63cdcc95e3ab415eed6eebd6614b6","up":true},{"one":"a0109d6c41a317e857f329f30898f7328dd3812d1fc7008a68fe38e6d804b7a2","other":"95b48a9d194f42b8f19ef8ccde337cd221525e04848431a6d843ff968a5f4df5","up":true},{"one":"c55a176b1c185e526e17d2ac2556e59796bc1d3a6b814eecdb0ca9519c8c5163","other":"edd7b22a17fec3824d77db882b5fb4e82b08beca8d59e0f2dc8924f7bd6f8cee","up":true},{"one":"594203c8fa170bece1eb12ac569b1731b86a603d07f5022a7d7b2bf205fc6151","other":"6ff9a3f6f1f8019e366b59cce07e3737b1e6e4ba2b4ed9012cdd2b683908b004","up":true},{"one":"4c144ac2f4ee4a8653a3605cec20160384cf471a1fdfaf694a721770a2925434","other":"6ff9a3f6f1f8019e366b59cce07e3737b1e6e4ba2b4ed9012cdd2b683908b004","up":true},{"one":"c5bf867c9ee0db831504395b444a7bf6c5f6c6d8d0b6c741296fcab03208491f","other":"d6f7abd4ef7d9144e276a5ba3fc4087eca1106dead333f3a219ca18e2ac49422","up":true},{"one":"d6f7abd4ef7d9144e276a5ba3fc4087eca1106dead333f3a219ca18e2ac49422","other":"edd7b22a17fec3824d77db882b5fb4e82b08beca8d59e0f2dc8924f7bd6f8cee","up":true},{"one":"dd1203e0060db1a9c2d40052078756adfdb6ec485594e4116a997b9dbcaf9002","other":"95b48a9d194f42b8f19ef8ccde337cd221525e04848431a6d843ff968a5f4df5","up":true},{"one":"2653c3d78d1c11fd3a9e8043ae5c77037b01e05ddd2a3d4f6284844d098a23e5","other":"edd7b22a17fec3824d77db882b5fb4e82b08beca8d59e0f2dc8924f7bd6f8cee","up":true},{"one":"2653c3d78d1c11fd3a9e8043ae5c77037b01e05ddd2a3d4f6284844d098a23e5","other":"594203c8fa170bece1eb12ac569b1731b86a603d07f5022a7d7b2bf205fc6151","up":true},{"one":"427e0288b5a474d9704df47bf2eb97b8af979bda199f86b7bd58824933958127","other":"594203c8fa170bece1eb12ac569b1731b86a603d07f5022a7d7b2bf205fc6151","up":true},{"one":"c55a176b1c185e526e17d2ac2556e59796bc1d3a6b814eecdb0ca9519c8c5163","other":"dd1203e0060db1a9c2d40052078756adfdb6ec485594e4116a997b9dbcaf9002","up":true},{"one":"c5bf867c9ee0db831504395b444a7bf6c5f6c6d8d0b6c741296fcab03208491f","other":"c55a176b1c185e526e17d2ac2556e59796bc1d3a6b814eecdb0ca9519c8c5163","up":true},{"one":"594203c8fa170bece1eb12ac569b1731b86a603d07f5022a7d7b2bf205fc6151","other":"edd7b22a17fec3824d77db882b5fb4e82b08beca8d59e0f2dc8924f7bd6f8cee","up":true},{"one":"4ebda1ce79761129ce872f50bea9ae2df39d47e4cd7a1d8f1bb988c82b8667a9","other":"427e0288b5a474d9704df47bf2eb97b8af979bda199f86b7bd58824933958127","up":true},{"one":"0d529d1464743675d91fc4049d70f428b326f384e88ea14c53ff23a2e45a65be","other":"6ff9a3f6f1f8019e366b59cce07e3737b1e6e4ba2b4ed9012cdd2b683908b004","up":true},{"one":"c5bf867c9ee0db831504395b444a7bf6c5f6c6d8d0b6c741296fcab03208491f","other":"dd1203e0060db1a9c2d40052078756adfdb6ec485594e4116a997b9dbcaf9002","up":true},{"one":"a61c0fe541a562b08d92fabd643a48694fbfbaf704d1c782595ad0e9377a06b6","other":"bdf0122698c9da313740d2c9854ac5c177c63cdcc95e3ab415eed6eebd6614b6","up":true},{"one":"d6f7abd4ef7d9144e276a5ba3fc4087eca1106dead333f3a219ca18e2ac49422","other":"0d529d1464743675d91fc4049d70f428b326f384e88ea14c53ff23a2e45a65be","up":true},{"one":"a0109d6c41a317e857f329f30898f7328dd3812d1fc7008a68fe38e6d804b7a2","other":"bdf0122698c9da313740d2c9854ac5c177c63cdcc95e3ab415eed6eebd6614b6","up":true},{"one":"4c144ac2f4ee4a8653a3605cec20160384cf471a1fdfaf694a721770a2925434","other":"594203c8fa170bece1eb12ac569b1731b86a603d07f5022a7d7b2bf205fc6151","up":true},{"one":"427e0288b5a474d9704df47bf2eb97b8af979bda199f86b7bd58824933958127","other":"a0109d6c41a317e857f329f30898f7328dd3812d1fc7008a68fe38e6d804b7a2","up":true},{"one":"2653c3d78d1c11fd3a9e8043ae5c77037b01e05ddd2a3d4f6284844d098a23e5","other":"4ebda1ce79761129ce872f50bea9ae2df39d47e4cd7a1d8f1bb988c82b8667a9","up":true},{"one":"4ebda1ce79761129ce872f50bea9ae2df39d47e4cd7a1d8f1bb988c82b8667a9","other":"4c144ac2f4ee4a8653a3605cec20160384cf471a1fdfaf694a721770a2925434","up":true},{"one":"c55a176b1c185e526e17d2ac2556e59796bc1d3a6b814eecdb0ca9519c8c5163","other":"d6f7abd4ef7d9144e276a5ba3fc4087eca1106dead333f3a219ca18e2ac49422","up":true},{"one":"c5bf867c9ee0db831504395b444a7bf6c5f6c6d8d0b6c741296fcab03208491f","other":"2653c3d78d1c11fd3a9e8043ae5c77037b01e05ddd2a3d4f6284844d098a23e5","up":true},{"one":"d6f7abd4ef7d9144e276a5ba3fc4087eca1106dead333f3a219ca18e2ac49422","other":"a61c0fe541a562b08d92fabd643a48694fbfbaf704d1c782595ad0e9377a06b6","up":true},{"one":"bdf0122698c9da313740d2c9854ac5c177c63cdcc95e3ab415eed6eebd6614b6","other":"c5bf867c9ee0db831504395b444a7bf6c5f6c6d8d0b6c741296fcab03208491f","up":true},{"one":"a0109d6c41a317e857f329f30898f7328dd3812d1fc7008a68fe38e6d804b7a2","other":"6ff9a3f6f1f8019e366b59cce07e3737b1e6e4ba2b4ed9012cdd2b683908b004","up":true},{"one":"dd1203e0060db1a9c2d40052078756adfdb6ec485594e4116a997b9dbcaf9002","other":"2653c3d78d1c11fd3a9e8043ae5c77037b01e05ddd2a3d4f6284844d098a23e5","up":true},{"one":"a61c0fe541a562b08d92fabd643a48694fbfbaf704d1c782595ad0e9377a06b6","other":"0d529d1464743675d91fc4049d70f428b326f384e88ea14c53ff23a2e45a65be","up":true},{"one":"427e0288b5a474d9704df47bf2eb97b8af979bda199f86b7bd58824933958127","other":"2653c3d78d1c11fd3a9e8043ae5c77037b01e05ddd2a3d4f6284844d098a23e5","up":true},{"one":"4c144ac2f4ee4a8653a3605cec20160384cf471a1fdfaf694a721770a2925434","other":"2653c3d78d1c11fd3a9e8043ae5c77037b01e05ddd2a3d4f6284844d098a23e5","up":true},{"one":"edd7b22a17fec3824d77db882b5fb4e82b08beca8d59e0f2dc8924f7bd6f8cee","other":"4ebda1ce79761129ce872f50bea9ae2df39d47e4cd7a1d8f1bb988c82b8667a9","up":true},{"one":"dd1203e0060db1a9c2d40052078756adfdb6ec485594e4116a997b9dbcaf9002","other":"a0109d6c41a317e857f329f30898f7328dd3812d1fc7008a68fe38e6d804b7a2","up":true},{"one":"4c144ac2f4ee4a8653a3605cec20160384cf471a1fdfaf694a721770a2925434","other":"a0109d6c41a317e857f329f30898f7328dd3812d1fc7008a68fe38e6d804b7a2","up":true}]} \ No newline at end of file diff --git a/vendor/github.com/ethereum/go-ethereum/swarm/network/stream/testing/snapshot_256.json b/vendor/github.com/ethereum/go-ethereum/swarm/network/stream/testing/snapshot_256.json deleted file mode 100644 index 5e400d92..00000000 --- a/vendor/github.com/ethereum/go-ethereum/swarm/network/stream/testing/snapshot_256.json +++ /dev/null @@ -1 +0,0 @@ -{"nodes":[{"node":{"info":{"id":"a46dd535e3bc8f111a8b2ce5594b62e87741c395e8a2b8fbae33edd29cb8caf8","name":"node_a46dd535e3bc8f111a8b2ce5594b62e87741c395e8a2b8fbae33edd29cb8caf8","enode":"enode://e70237456671b100c2341a568d85185f57c09cd699045f8c51f5a7bd09217bbf764379a2ad51b60e5671b978ee72cd33416e17520c75e471b4722f59533e3a4d@127.0.0.1:0","enr":"0xf88fb840ea2e2964e4c4bac440d5d5167638da0163abb3df513fa17601c4b04def5883ec78df971cc20ed10c00a8e9b5ba290305181507c49589c3c9026d28161f7dbe080183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103e70237456671b100c2341a568d85185f57c09cd699045f8c51f5a7bd09217bbf","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"pG3VNeO8jxEaiyzlWUti6HdBw5Xoorj7rjPt0py4yvg=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: a46dd5\npopulation: 31 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 605a 00c6 0ff2 154b | 146 4558 (0) 4559 (0) 4447 (0) 44a1 (0)\n001 6 eb98 e775 fbc8 fbf5 | 63 e027 (0) e5ad (0) e5d7 (0) e547 (0)\n002 6 8505 8f21 88a1 9076 | 20 849b (0) 8505 (0) 8025 (0) 82f9 (0)\n003 6 b2a5 b02b bcc6 bb90 | 17 bcc6 (0) baf2 (0) badd (0) ba88 (0)\n004 4 ad98 af02 ae2b aeb4 | 5 ac4d (0) ad98 (0) af02 (0) ae2b (0)\n005 2 a369 a34e | 2 a369 (0) a34e (0)\n============ DEPTH: 6 ==========================================\n006 2 a653 a6fb | 2 a653 (0) a6fb (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"a46dd535e3bc8f111a8b2ce5594b62e87741c395e8a2b8fbae33edd29cb8caf8","private_key":"1e57a9344381e01bf32e09a979ec63d899dde10dd84d70ecb6404de10ff2fae7","name":"node_a46dd535e3bc8f111a8b2ce5594b62e87741c395e8a2b8fbae33edd29cb8caf8","services":["streamer"],"enable_msg_events":true,"port":43161},"up":true}},{"node":{"info":{"id":"13d6cb9316e289923e2d1de7f3c966d0cbabce3acdb8017122944f4abb140912","name":"node_13d6cb9316e289923e2d1de7f3c966d0cbabce3acdb8017122944f4abb140912","enode":"enode://101db8d36d797326a36adc76ff41e54a39cfe68b7948bd87bab4e7658bd81db7a962be72ffe4d52e15e65a5605b4fd7b3c5faba7fbeffcf6ce906951a9c4c520@127.0.0.1:0","enr":"0xf88fb84015cb00dd3c456518171748d8926d78335c0854b346464bf9bded32abbcc19aef5852275615470f0fe25130dd8ee37eff80afaa0ef7c7d14ea0f4f60e98b56ce20183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102101db8d36d797326a36adc76ff41e54a39cfe68b7948bd87bab4e7658bd81db7","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"E9bLkxbiiZI+LR3n88lm0MurzjrNuAFxIpRPSrsUCRI=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 13d6cb\npopulation: 29 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 cc20 d3b0 a46d | 110 e027 (0) e5ad (0) e5d7 (0) e514 (0)\n001 4 53fe 4e5a 6e68 605a | 70 4558 (0) 4559 (0) 4447 (0) 44a1 (0)\n002 3 2f32 2c79 33b5 | 32 39d1 (0) 3b88 (0) 3b78 (0) 3f94 (0)\n003 5 0b72 0af9 0ff2 0fc5 | 22 0b72 (0) 0a00 (0) 0af9 (0) 0d8a (0)\n004 4 19fa 1e2a 1c8a 1c9c | 10 1a2a (0) 1b83 (0) 18f6 (0) 19fa (0)\n005 8 17db 179f 1672 165f | 9 1704 (0) 17db (0) 179f (0) 1672 (0)\n============ DEPTH: 6 ==========================================\n006 2 11d4 103b | 2 11d4 (0) 103b (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"13d6cb9316e289923e2d1de7f3c966d0cbabce3acdb8017122944f4abb140912","private_key":"37ebe30b2c356984a7e460228a022af51a6d955b24fb5e602226fc9b7cda2062","name":"node_13d6cb9316e289923e2d1de7f3c966d0cbabce3acdb8017122944f4abb140912","services":["streamer"],"enable_msg_events":true,"port":39877},"up":true}},{"node":{"info":{"id":"d3b0dea1dd3ac71e7e4a30941632eec53cb980aa7cb6cdac95042a5400a878c3","name":"node_d3b0dea1dd3ac71e7e4a30941632eec53cb980aa7cb6cdac95042a5400a878c3","enode":"enode://05700e757f48449baa479d9e9476883768725b33e1fc661afe18f3974b21d96fe414ceb6c1b7d6e501532e17c7ff740237837c2c812daabed849b5e7797917fe@127.0.0.1:0","enr":"0xf88fb840fac5d8d078a46572c426af0322faba829283795e739c471fc3d33d0395f8e49c52370fb9373e1c6299bc9c5b3716e5af57a39614e8848375d97a3687d2ee89480183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10205700e757f48449baa479d9e9476883768725b33e1fc661afe18f3974b21d96f","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"07Deod06xx5+SjCUFjLuxTy5gKp8ts2slQQqVACoeMM=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: d3b0de\npopulation: 32 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 53fe 7dd3 605a 13d6 | 146 4558 (0) 4559 (0) 4447 (0) 44a1 (0)\n001 5 9076 a46d a34e b911 | 47 849b (0) 8505 (0) 8025 (0) 82f9 (0)\n002 10 e54b e775 eb98 e883 | 37 e027 (0) e5ad (0) e5d7 (0) e514 (0)\n003 6 c1f9 c6cf c620 c832 | 15 c26f (0) c1f9 (0) c49c (0) c441 (0)\n004 3 daec db6a d887 | 6 df1e (0) d863 (0) d887 (0) db6a (0)\n005 2 d7ac d640 | 2 d7ac (0) d640 (0)\n============ DEPTH: 6 ==========================================\n006 1 d1d7 | 1 d1d7 (0)\n007 1 d299 | 1 d299 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"d3b0dea1dd3ac71e7e4a30941632eec53cb980aa7cb6cdac95042a5400a878c3","private_key":"ca03d9ece7d38bee50629933e237f3019a21e19182e1bd49826c89f10e625121","name":"node_d3b0dea1dd3ac71e7e4a30941632eec53cb980aa7cb6cdac95042a5400a878c3","services":["streamer"],"enable_msg_events":true,"port":42617},"up":true}},{"node":{"info":{"id":"605a46991af15cd60e67413c712b99ff8f21173c96a7990f2728ad6cac2bb9d8","name":"node_605a46991af15cd60e67413c712b99ff8f21173c96a7990f2728ad6cac2bb9d8","enode":"enode://a621f4d598855f913a837abe294df8a44fde676e99ed3976972afa30e977462ef16b40a84fb8f439031420d103f4021f5540aa0936b9d4d1e466aa23cae18e32@127.0.0.1:0","enr":"0xf88fb840ed422154098e8b2ec11a4d63bf0da7d8edd6aec4b81b5e574a6a95562ed8c0656a0983ebe8fba7fd52f8a50a73f3e705730466a0881af12efe9e510ad718fd680183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102a621f4d598855f913a837abe294df8a44fde676e99ed3976972afa30e977462e","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"YFpGmRrxXNYOZ0E8cSuZ/48hFzyWp5kPJyitbKwrudg=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 605a46\npopulation: 33 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 a46d d3b0 | 110 8f21 (0) 898d (0) 886a (0) 88fe (0)\n001 7 0ff2 154b 103b 13d6 | 76 0b72 (0) 0a00 (0) 0af9 (0) 0d8a (0)\n002 12 5efb 5cd2 5823 5308 | 38 4447 (0) 44a1 (0) 4558 (0) 4559 (0)\n003 3 7125 7920 7dd3 | 12 77d2 (0) 775e (0) 7290 (0) 738c (0)\n004 2 6c73 6e68 | 11 6831 (0) 6967 (0) 6c4d (0) 6c73 (0)\n005 2 67dc 66e7 | 3 67aa (0) 67dc (0) 66e7 (0)\n006 3 6337 6251 628e | 3 6337 (0) 6251 (0) 628e (0)\n============ DEPTH: 7 ==========================================\n007 1 6103 | 1 6103 (0)\n008 1 60d7 | 1 60d7 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"605a46991af15cd60e67413c712b99ff8f21173c96a7990f2728ad6cac2bb9d8","private_key":"09e7ba543ec6e7608729d561d0dfecef5bd8e50c9849d1baedfbf09f6be28e97","name":"node_605a46991af15cd60e67413c712b99ff8f21173c96a7990f2728ad6cac2bb9d8","services":["streamer"],"enable_msg_events":true,"port":40563},"up":true}},{"node":{"info":{"id":"2c79af7ea85f96db7897cf8cdb4d002ad2308194e03981876edb8d904ef65137","name":"node_2c79af7ea85f96db7897cf8cdb4d002ad2308194e03981876edb8d904ef65137","enode":"enode://09caa0d3176bb2ab29defcb47bc43b066d3f667c2b923fcec05025ee44028c3c8f8151181b4715a567bfe6442b1696c1b5d4436e2673dae648713c1ced646d9d@127.0.0.1:0","enr":"0xf88fb8407cecec0b472dc2d08e251d9584eb234456d972c76227ef38539f0041d03df5e22e4ba13445b3e93db9a066c6c96db30cee8dc4ded48f5cd06f2161f2c21a1fc80183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10309caa0d3176bb2ab29defcb47bc43b066d3f667c2b923fcec05025ee44028c3c","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"LHmvfqhfltt4l8+M200AKtIwgZTgOYGHbtuNkE72UTc=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 2c79af\npopulation: 34 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 c620 cc20 b911 | 110 e027 (0) e5ad (0) e5d7 (0) e514 (0)\n001 5 4e5a 53fe 6c73 6e68 | 70 4558 (0) 4559 (0) 4447 (0) 44a1 (0)\n002 8 00c6 0fc5 0ff2 1c9c | 44 0438 (0) 0451 (0) 045b (0) 07a8 (0)\n003 9 3e8e 39d1 3b78 3630 | 17 39d1 (0) 3b88 (0) 3b78 (0) 3f94 (0)\n004 2 2101 21a0 | 6 256e (0) 24b8 (0) 20ae (0) 217f (0)\n005 3 2995 2abb 2a97 | 4 2995 (0) 2a0a (0) 2a97 (0) 2abb (0)\n006 1 2f32 | 1 2f32 (0)\n007 1 2d36 | 1 2d36 (0)\n============ DEPTH: 8 ==========================================\n008 1 2ccf | 1 2ccf (0)\n009 1 2c38 | 1 2c38 (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"2c79af7ea85f96db7897cf8cdb4d002ad2308194e03981876edb8d904ef65137","private_key":"3721498524efb06914a5509b27d864ad186f58e36aab5c7593d0e9cd263282a7","name":"node_2c79af7ea85f96db7897cf8cdb4d002ad2308194e03981876edb8d904ef65137","services":["streamer"],"enable_msg_events":true,"port":43339},"up":true}},{"node":{"info":{"id":"33b5c521b4208e26414db2e05c9a8ccc001a524d928579d44d2e74d14a56593e","name":"node_33b5c521b4208e26414db2e05c9a8ccc001a524d928579d44d2e74d14a56593e","enode":"enode://7bd8d32df25aaea11952de45f43b3067ec805d9e5c021d0f3ef3ec8916a479dd7ecbfee5a23baed4b751b218c345dd7c9670b8838660d0f010cd1389511e67d5@127.0.0.1:0","enr":"0xf88fb840a37a97fe62ec10c3a463048f5dcaa531e72b6859a704ec6633378ca65afe843a02afe1d4678cd54a8f60a67f20f71a50363415c56c3e3107b4b11d493015e53e0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1037bd8d32df25aaea11952de45f43b3067ec805d9e5c021d0f3ef3ec8916a479dd","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"M7XFIbQgjiZBTbLgXJqMzAAaUk2ShXnUTS500UpWWT4=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 33b5c5\npopulation: 33 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 b02b b911 | 110 e027 (0) e5d7 (0) e5ad (0) e514 (0)\n001 7 6e68 6c73 605a 7dd3 | 70 67aa (0) 67dc (0) 66e7 (0) 6337 (0)\n002 6 00c6 0ff2 0fc5 1c9c | 44 0438 (0) 0451 (0) 045b (0) 07a8 (0)\n003 3 21a0 2f32 2c79 | 15 256e (0) 24b8 (0) 20ae (0) 217f (0)\n004 7 39d1 3b88 3b78 3f94 | 7 39d1 (0) 3b88 (0) 3b78 (0) 3f94 (0)\n005 3 3630 378e 35e6 | 4 35e6 (0) 3780 (0) 378e (0) 3630 (0)\n006 3 314a 30be 3089 | 3 30be (0) 3089 (0) 314a (0)\n============ DEPTH: 7 ==========================================\n007 1 3237 | 1 3237 (0)\n008 1 3373 | 1 3373 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"33b5c521b4208e26414db2e05c9a8ccc001a524d928579d44d2e74d14a56593e","private_key":"fa8a4740b23a1fa3955c662fee2883cc8d1a1e26853b72c3acc66583d6aa2898","name":"node_33b5c521b4208e26414db2e05c9a8ccc001a524d928579d44d2e74d14a56593e","services":["streamer"],"enable_msg_events":true,"port":39497},"up":true}},{"node":{"info":{"id":"b911b8e2d72532b7c66ff5f7bffa70f5ddbeea6903a86f9333399f0c4b5f0fe8","name":"node_b911b8e2d72532b7c66ff5f7bffa70f5ddbeea6903a86f9333399f0c4b5f0fe8","enode":"enode://f909dfa9cf0586fa20c170d7affbef6b9b835d1603c91ed04c0854b16fa42c4eff293cff2e695634d99bdd6ec5a61f219637eb7d885c25b232685d17bd3572b2@127.0.0.1:0","enr":"0xf88fb84004bc964ea8b933d6a3b0265d90808e3f4109cca5b450a732ab97fedfaa6a55b245cab741804fbe671adca5d7a5ad32223302e2908db90622ca8acdba2f84920b0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102f909dfa9cf0586fa20c170d7affbef6b9b835d1603c91ed04c0854b16fa42c4e","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"uRG44tclMrfGb/X3v/pw9d2+6mkDqG+TMzmfDEtfD+g=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: b911b8\npopulation: 26 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 4990 53fe 2c79 33b5 | 146 67aa (0) 67dc (0) 66e7 (0) 6337 (0)\n001 4 fbf5 d887 d3b0 cc20 | 63 e027 (0) e5d7 (0) e5ad (0) e547 (0)\n002 5 9852 9076 90a8 8f21 | 20 849b (0) 8505 (0) 8025 (0) 82f9 (0)\n003 2 a34e a46d | 10 ac4d (0) ad98 (0) af02 (0) ae2b (0)\n004 3 b7ca b2a5 b02b | 8 b5b2 (0) b502 (0) b626 (0) b65e (0)\n005 1 bcc6 | 1 bcc6 (0)\n006 4 baf2 badd ba88 bb90 | 4 baf2 (0) badd (0) ba88 (0) bb90 (0)\n============ DEPTH: 7 ==========================================\n007 2 b820 b897 | 2 b897 (0) b820 (0)\n008 0 | 0\n009 1 b95d | 1 b95d (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"b911b8e2d72532b7c66ff5f7bffa70f5ddbeea6903a86f9333399f0c4b5f0fe8","private_key":"2cb79ca016623c39541a82f657e334cd812977188909b562564102890d58ec54","name":"node_b911b8e2d72532b7c66ff5f7bffa70f5ddbeea6903a86f9333399f0c4b5f0fe8","services":["streamer"],"enable_msg_events":true,"port":45307},"up":true}},{"node":{"info":{"id":"53fe2c13926507a7a6c27d0fb30a2c358c4c7bfa40df8b5fa8ec8986c2450519","name":"node_53fe2c13926507a7a6c27d0fb30a2c358c4c7bfa40df8b5fa8ec8986c2450519","enode":"enode://b3104e6e79d026630bfe72e7d9efdb57be3f806110418652fb6840c1361f7d1e0e8521b82a7cf884571ce3b7bedf9787826e57b92e334766c65f24eb470f23ed@127.0.0.1:0","enr":"0xf88fb84015b01d0b7cd1ab6245a7bc8d8bb6c97f6032ed9a1ecc96eb5da3cbc3a3aa79f52a326ea510a5735c19c69a5ee802c07098946041df153aab94dad596c2bc21f50183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103b3104e6e79d026630bfe72e7d9efdb57be3f806110418652fb6840c1361f7d1e","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"U/4sE5JlB6emwn0PswosNYxMe/pA34tfqOyJhsJFBRk=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 53fe2c\npopulation: 31 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 cc20 d3b0 b02b b911 | 110 e027 (0) e5d7 (0) e5ad (0) e514 (0)\n001 5 33b5 2c79 0ff2 103b | 76 0438 (0) 0451 (0) 045b (0) 07a8 (0)\n002 5 6c73 628e 605a 7125 | 32 67aa (0) 67dc (0) 66e7 (0) 6337 (0)\n003 6 41d9 4109 4646 4c9e | 23 4558 (0) 4559 (0) 4447 (0) 44a1 (0)\n004 4 5efb 5cd2 58ed 5823 | 7 5db0 (0) 5cd2 (0) 5f00 (0) 5efb (0)\n005 1 574f | 1 574f (0)\n006 2 512e 51db | 2 512e (0) 51db (0)\n007 1 524d | 1 524d (0)\n============ DEPTH: 8 ==========================================\n008 2 5308 534b | 2 5308 (0) 534b (0)\n009 1 53a8 | 1 53a8 (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"53fe2c13926507a7a6c27d0fb30a2c358c4c7bfa40df8b5fa8ec8986c2450519","private_key":"70c31ba2f1ff647ffa877b174d1fe7441de6f4ed5e17bbd9857812f35ab10cba","name":"node_53fe2c13926507a7a6c27d0fb30a2c358c4c7bfa40df8b5fa8ec8986c2450519","services":["streamer"],"enable_msg_events":true,"port":46299},"up":true}},{"node":{"info":{"id":"4e5a46c004e85cf86a02fdfbf2243018825d015debfb9a077a1283d302293b3a","name":"node_4e5a46c004e85cf86a02fdfbf2243018825d015debfb9a077a1283d302293b3a","enode":"enode://2065647ff3dd80dc4e4ebc9a2a8be828f0efaefbb62e2d2b4ccd246f0cc30aa51459e66d352c9ed8b5126ea9e76aeab74cdf95dcad19c9c9cc2fc3706e83d12b@127.0.0.1:0","enr":"0xf88fb840822110c309aaded4c3d0d3c1fca5a0910e094971e98cd41b5225e201d8a965831ec1d234aeb2560ed5dd98a3db6a230653d4e43c14afb51e34bfbf8de69341d90183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1032065647ff3dd80dc4e4ebc9a2a8be828f0efaefbb62e2d2b4ccd246f0cc30aa5","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"TlpGwAToXPhqAv378iQwGIJdAV3r+5oHehKD0wIpOzo=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 4e5a46\npopulation: 30 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 b02b cc20 | 110 849b (0) 8505 (0) 8025 (0) 82f9 (0)\n001 5 154b 103b 13d6 2c79 | 76 0438 (0) 0451 (0) 045b (0) 07a8 (0)\n002 6 7920 7dd3 7125 6c73 | 32 67aa (0) 67dc (0) 66e7 (0) 6337 (0)\n003 5 5823 5cd2 5308 534b | 15 5db0 (0) 5cd2 (0) 5f00 (0) 5efb (0)\n004 4 4646 461c 4109 41d9 | 12 4558 (0) 4559 (0) 4447 (0) 44a1 (0)\n005 4 4bcf 49cd 49ea 4990 | 6 4ac7 (0) 4a8b (0) 4bcf (0) 4990 (0)\n============ DEPTH: 6 ==========================================\n006 4 4c9e 4d10 4d6b 4d59 | 4 4c9e (0) 4d10 (0) 4d6b (0) 4d59 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"4e5a46c004e85cf86a02fdfbf2243018825d015debfb9a077a1283d302293b3a","private_key":"cd1095af24a2b4f0a0fa3730f681b7d6c26b93a51081cc8f382764a83a73fb86","name":"node_4e5a46c004e85cf86a02fdfbf2243018825d015debfb9a077a1283d302293b3a","services":["streamer"],"enable_msg_events":true,"port":39501},"up":true}},{"node":{"info":{"id":"cc2037c08942a094df12f45831f28e0015fc3ac04d5b8f24ffea9bf3a0b02c39","name":"node_cc2037c08942a094df12f45831f28e0015fc3ac04d5b8f24ffea9bf3a0b02c39","enode":"enode://502433c8d1cf2f8fd7b92aefbf87918e268ee26b2850e20aeb3c4ce61c1cb2049af306124476e27a64b98fe49f9261b104ac5bc18643219c3718fd8c03296707@127.0.0.1:0","enr":"0xf88fb8404a286e1fcc023da2601459dc781096bc67a869b3de88ab00755589aa44b0389e18638b7526b4bb40b059179c918c417acbde016bb95edc6c9eefd89121cc42990183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103502433c8d1cf2f8fd7b92aefbf87918e268ee26b2850e20aeb3c4ce61c1cb204","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"zCA3wIlCoJTfEvRYMfKOABX8OsBNW48k/+qb86CwLDk=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: cc2037\npopulation: 32 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 00c6 13d6 2c79 7dd3 | 146 0438 (0) 0451 (0) 045b (0) 07a8 (0)\n001 5 9076 aeb4 a46d b911 | 47 8025 (0) 82f9 (0) 82dd (0) 849b (0)\n002 9 e775 e883 e854 eb98 | 37 e027 (0) e5d7 (0) e5ad (0) e514 (0)\n003 3 d887 daec d3b0 | 11 df1e (0) d863 (0) d887 (0) db6a (0)\n004 4 c1f9 c26f c6cf c620 | 9 c26f (0) c1f9 (0) c59e (0) c49c (0)\n============ DEPTH: 5 ==========================================\n005 5 ca04 caf6 c9f5 c832 | 5 ca04 (0) caf6 (0) c9f5 (0) c832 (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"cc2037c08942a094df12f45831f28e0015fc3ac04d5b8f24ffea9bf3a0b02c39","private_key":"d23c0a28f40bce284a142b72daad5397f586194601126aedc3df40587d9d45f6","name":"node_cc2037c08942a094df12f45831f28e0015fc3ac04d5b8f24ffea9bf3a0b02c39","services":["streamer"],"enable_msg_events":true,"port":35445},"up":true}},{"node":{"info":{"id":"b02b01a5c37cb05c287a3dc7d04e305de26f8d62dc388542eeb43e97db7b4282","name":"node_b02b01a5c37cb05c287a3dc7d04e305de26f8d62dc388542eeb43e97db7b4282","enode":"enode://08f5b135b35456f2574282474266d863656df0ef0eb157876e12d53c7d6e01e0260e147f6ba3f2b2a1119697aeb464cf61f20f648990b075b98572cb11685c0d@127.0.0.1:0","enr":"0xf88fb8406c19c1ab095388f46d4d6ef2da794ca56fc16daaece67a7e979009f62b74daee01fd0cea0017acf50b872bb9015ad225678c2ca166e45f0d74a1a305d7ded0110183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10308f5b135b35456f2574282474266d863656df0ef0eb157876e12d53c7d6e01e0","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"sCsBpcN8sFwoej3H0E4wXeJvjWLcOIVC7rQ+l9t7QoI=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: b02b01\npopulation: 40 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 33b5 6e68 53fe 4990 | 146 0438 (0) 0451 (0) 045b (0) 07a8 (0)\n001 8 e854 eb98 f925 fbf5 | 63 e027 (0) e5ad (0) e5d7 (0) e514 (0)\n002 9 90a8 9076 9fa0 9852 | 20 8f21 (0) 898d (0) 886a (0) 88fe (0)\n003 5 aeb4 ae2b a6fb a46d | 10 ac4d (0) ad98 (0) af02 (0) ae2b (0)\n004 7 bcc6 badd ba88 bb90 | 9 bcc6 (0) baf2 (0) badd (0) ba88 (0)\n005 4 b5b2 b626 b65e b7ca | 5 b5b2 (0) b502 (0) b626 (0) b65e (0)\n============ DEPTH: 6 ==========================================\n006 2 b2b5 b2a5 | 2 b2b5 (0) b2a5 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"b02b01a5c37cb05c287a3dc7d04e305de26f8d62dc388542eeb43e97db7b4282","private_key":"473b45c9196c27d9ae4135ac8cbc2ea31c3a7f7c0b77117fe484b2a4ecd3913e","name":"node_b02b01a5c37cb05c287a3dc7d04e305de26f8d62dc388542eeb43e97db7b4282","services":["streamer"],"enable_msg_events":true,"port":38045},"up":true}},{"node":{"info":{"id":"a34ea2e87d4c12adb27d66c2c95300603ff50415974e000bbcc69a5ae059dbf1","name":"node_a34ea2e87d4c12adb27d66c2c95300603ff50415974e000bbcc69a5ae059dbf1","enode":"enode://340c7a971a97f9d8f8868b1336bacbe73503e3e1088ac108d216a23c970b04c677ff52e704844600618f76887b06e7083345056961f77a396e2366191ae76f87@127.0.0.1:0","enr":"0xf88fb840f67e5492b185e03ad9fba3676256587139f92c1a0395454a66d28eab0ddfcd3f02717c57b13697f286929dc5ec9737a829e17a8632a202512d46dd89a8406a2c0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103340c7a971a97f9d8f8868b1336bacbe73503e3e1088ac108d216a23c970b04c6","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"o06i6H1MEq2yfWbCyVMAYD/1BBWXTgALvMaaWuBZ2/E=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: a34ea2\npopulation: 30 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 0ff2 1c9c 6e68 7dd3 | 146 1400 (0) 1436 (0) 14df (0) 154b (0)\n001 6 c620 daec d3b0 e775 | 63 df1e (0) d863 (0) d887 (0) db6a (0)\n002 6 82dd 8505 9076 9fa0 | 20 898d (0) 886a (0) 88fe (0) 88a1 (0)\n003 7 bcc6 b897 b820 b95d | 17 bcc6 (0) ba88 (0) baf2 (0) badd (0)\n004 3 ae2b aeb4 af02 | 5 ac4d (0) ad98 (0) af02 (0) ae2b (0)\n============ DEPTH: 5 ==========================================\n005 3 a653 a6fb a46d | 3 a653 (0) a6fb (0) a46d (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 1 a369 | 1 a369 (0)\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"a34ea2e87d4c12adb27d66c2c95300603ff50415974e000bbcc69a5ae059dbf1","private_key":"68b17ea93b738afd30952707cc7ba1bcc7dbb9a01631477f8d2b2a7f76a83fb5","name":"node_a34ea2e87d4c12adb27d66c2c95300603ff50415974e000bbcc69a5ae059dbf1","services":["streamer"],"enable_msg_events":true,"port":44293},"up":true}},{"node":{"info":{"id":"7dd3078c71087ab88d4d26a962820bcb79b8ce30e91c1f9a69d4bf8d38086960","name":"node_7dd3078c71087ab88d4d26a962820bcb79b8ce30e91c1f9a69d4bf8d38086960","enode":"enode://60f4239fd937907e183edf421b9d1df38ea30f43d5bee23ed23f4b7e9e7b801d14006d4e11987b57cd00d7470c31b17e35e6534bdb642b68fcb9f6becdbc4a41@127.0.0.1:0","enr":"0xf88fb84086961ac0d94caace96d4805f4c5c2470e4da31be8b2a85bde0d3ca0b156472865a13c690728f4e37c1986d173045b80d817727c2ebe0a139bffcdde97847468c0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10360f4239fd937907e183edf421b9d1df38ea30f43d5bee23ed23f4b7e9e7b801d","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"fdMHjHEIeriNTSapYoILy3m4zjDpHB+aadS/jTgIaWA=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 7dd307\npopulation: 43 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 d3b0 daec c620 cc20 | 110 df1e (0) d863 (0) d887 (0) db6a (0)\n001 6 39d1 33b5 2f32 11d4 | 76 256e (0) 24b8 (0) 20ae (0) 2101 (0)\n002 12 49ea 4990 4d59 4e5a | 38 4990 (0) 49cd (0) 49ea (0) 4ac7 (0)\n003 8 66e7 628e 6337 6103 | 20 67aa (0) 67dc (0) 66e7 (0) 6337 (0)\n004 5 7125 7290 738c 77d2 | 5 77d2 (0) 775e (0) 7290 (0) 738c (0)\n005 3 7b90 7a60 7920 | 3 7b90 (0) 7a60 (0) 7920 (0)\n006 1 7e04 | 1 7e04 (0)\n============ DEPTH: 7 ==========================================\n007 0 | 0\n008 0 | 0\n009 1 7dbb | 1 7dbb (0)\n010 0 | 0\n011 1 7dc2 | 1 7dc2 (0)\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"7dd3078c71087ab88d4d26a962820bcb79b8ce30e91c1f9a69d4bf8d38086960","private_key":"02f0e74d872f0a512a39d40801b92a40eb0a1e27e97da040a97c75e0af22af6f","name":"node_7dd3078c71087ab88d4d26a962820bcb79b8ce30e91c1f9a69d4bf8d38086960","services":["streamer"],"enable_msg_events":true,"port":35881},"up":true}},{"node":{"info":{"id":"6e68ea86440706a0d73a9508f2247492543163f8fa7e2dc2aa62b74d50261b8b","name":"node_6e68ea86440706a0d73a9508f2247492543163f8fa7e2dc2aa62b74d50261b8b","enode":"enode://6076aa2f272b91cbd2e5db03c497a76d92991b2fb747c5f3aeaef27c702b0e65edaea0879b23d0e37e2812ff67bc7a92c4131c69a912819fd4d2627fade5427a@127.0.0.1:0","enr":"0xf88fb8400138d5775c80387427a7dff700a0cc533dba63b5a23dd02a7fb85988266d0ce64206c9dc261a206b4784a306a82fe5f001cab02a87039a50c4ed1fec2a1f41250183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1026076aa2f272b91cbd2e5db03c497a76d92991b2fb747c5f3aeaef27c702b0e65","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"bmjqhkQHBqDXOpUI8iR0klQxY/j6fi3CqmK3TVAmG4s=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 6e68ea\npopulation: 39 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 b02b a34e fbf5 | 110 898d (0) 886a (0) 88fe (0) 88a1 (0)\n001 9 0ff2 1c9c 13d6 165f | 76 39d1 (0) 3b88 (0) 3b78 (0) 3f94 (0)\n002 9 5efb 5cd2 5823 4646 | 38 4990 (0) 49cd (0) 49ea (0) 4ac7 (0)\n003 2 7125 7dd3 | 12 77d2 (0) 775e (0) 7290 (0) 738c (0)\n004 6 67dc 66e7 628e 6251 | 9 67aa (0) 67dc (0) 66e7 (0) 6337 (0)\n005 2 6831 6967 | 2 6831 (0) 6967 (0)\n006 2 6c4d 6c73 | 2 6c4d (0) 6c73 (0)\n007 3 6fe9 6f2d 6f5f | 3 6fe9 (0) 6f2d (0) 6f5f (0)\n============ DEPTH: 8 ==========================================\n008 2 6ecb 6ea5 | 2 6ecb (0) 6ea5 (0)\n009 1 6e05 | 1 6e05 (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"6e68ea86440706a0d73a9508f2247492543163f8fa7e2dc2aa62b74d50261b8b","private_key":"b20c8d0606ea1db41eabd7ee0f74574539d2cb45d6d4241b6f259b11ac5c2d24","name":"node_6e68ea86440706a0d73a9508f2247492543163f8fa7e2dc2aa62b74d50261b8b","services":["streamer"],"enable_msg_events":true,"port":35593},"up":true}},{"node":{"info":{"id":"7125e05bf1bfe6df948c9276b62bc755fc6b0ec8d4ac7724b61ea49591adcf25","name":"node_7125e05bf1bfe6df948c9276b62bc755fc6b0ec8d4ac7724b61ea49591adcf25","enode":"enode://e0da25d10aa370ec66f23c45b05eb96ffd8c7378b53214086b29b8e7800cecdc291eb7be7c52ae40f148f79cc7f7417d37617a7dc017b52b4e7692cd22d59b94@127.0.0.1:0","enr":"0xf88fb8409127cf3b56541dad915db116d184cbf4b62a37124cc76bc88b18b2861040ba7f76dca86df9a3fd341069ce7f7e319d900b1fb1f423bfe91145a0347aceb60f3b0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102e0da25d10aa370ec66f23c45b05eb96ffd8c7378b53214086b29b8e7800cecdc","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"cSXgW/G/5t+UjJJ2tivHVfxrDsjUrHckth6klZGtzyU=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 7125e0\npopulation: 34 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 9076 8505 82dd fbf5 | 110 886a (0) 88fe (0) 88a1 (0) 898d (0)\n001 4 39d1 33b5 2f32 1c9c | 76 3b88 (0) 3b78 (0) 39d1 (0) 3f94 (0)\n002 11 5efb 5cd2 53fe 534b | 38 4990 (0) 49cd (0) 49ea (0) 4ac7 (0)\n003 6 66e7 628e 6103 605a | 20 67aa (0) 67dc (0) 66e7 (0) 6337 (0)\n004 5 7920 7e04 7dd3 7dc2 | 7 7a60 (0) 7b90 (0) 7920 (0) 7e04 (0)\n005 2 77d2 775e | 2 77d2 (0) 775e (0)\n============ DEPTH: 6 ==========================================\n006 2 7290 738c | 2 7290 (0) 738c (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"7125e05bf1bfe6df948c9276b62bc755fc6b0ec8d4ac7724b61ea49591adcf25","private_key":"0320cf6d59b1fdfd3bd90c7b0e801cb9f574b5bda4809f6842e344263d8a9c4c","name":"node_7125e05bf1bfe6df948c9276b62bc755fc6b0ec8d4ac7724b61ea49591adcf25","services":["streamer"],"enable_msg_events":true,"port":34651},"up":true}},{"node":{"info":{"id":"fbf5e917be45e909697a9393c4778206333cf1dd9a103978e8d71622ca3b1cc8","name":"node_fbf5e917be45e909697a9393c4778206333cf1dd9a103978e8d71622ca3b1cc8","enode":"enode://044552ed8018a3d7a6edcd78b62c7b776f3ea64af85049a170539a9353c32990f61afd5aed5a849eebb4c541418048952b2a969128241782caf66fff588c5576@127.0.0.1:0","enr":"0xf88fb840fb8c98615b2fd9a6ce30296aa151456746d7ff6f93f25567ad09135e11d5912567e796ddb7e02868851acd52d94dabe5f73d7421af7f4e91cb511b49744b23710183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102044552ed8018a3d7a6edcd78b62c7b776f3ea64af85049a170539a9353c32990","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"+/XpF75F6QlpepOTxHeCBjM88d2aEDl46NcWIso7HMg=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: fbf5e9\npopulation: 39 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 8 154b 1c9c 0ff2 0fc5 | 146 39d1 (0) 3b88 (0) 3b78 (0) 3f94 (0)\n001 7 8f21 9076 9852 b911 | 47 898d (0) 886a (0) 88fe (0) 88a1 (0)\n002 2 d3b0 cc20 | 26 c26f (0) c1f9 (0) c59e (0) c49c (0)\n003 5 e883 e854 eb98 e54b | 18 e027 (0) e5ad (0) e5d7 (0) e514 (0)\n004 12 f27f f31c f629 f7fa | 13 f629 (0) f7fa (0) f7ba (0) f773 (0)\n005 3 ff36 fe21 fe31 | 3 ff36 (0) fe31 (0) fe21 (0)\n============ DEPTH: 6 ==========================================\n006 1 f925 | 1 f925 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 1 fbc8 | 1 fbc8 (0)\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"fbf5e917be45e909697a9393c4778206333cf1dd9a103978e8d71622ca3b1cc8","private_key":"abe3a2c3b4d87e1896b5eeb333bb2fae65888f42d5708e88df6eec9d4d6f2a89","name":"node_fbf5e917be45e909697a9393c4778206333cf1dd9a103978e8d71622ca3b1cc8","services":["streamer"],"enable_msg_events":true,"port":42599},"up":true}},{"node":{"info":{"id":"0fc59bd04ac9de3195e3c9d0eb573952a5805dd2e7e572078b6e996778adec73","name":"node_0fc59bd04ac9de3195e3c9d0eb573952a5805dd2e7e572078b6e996778adec73","enode":"enode://22e0f016453557931968739b1927c6a2a96b3b3ef0720b9f574365f821ff4afa7d162aced052618c51e939baeec49bbda090ea6f2a5b14b3ced028e3587b4d51@127.0.0.1:0","enr":"0xf88fb8402397168cccae2be13f6646db7bd1f2d478d9124f8397e08ceae0045ca8baa3242f68f4c83fd1744b397234b474e6f46b048fd0d74acb55d3f44dc78d0dfede6b0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10322e0f016453557931968739b1927c6a2a96b3b3ef0720b9f574365f821ff4afa","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"D8Wb0ErJ3jGV48nQ61c5UqWAXdLn5XIHi26ZZ3it7HM=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 0fc59b\npopulation: 29 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 90a8 9076 82dd 8505 | 110 898d (0) 886a (0) 88fe (0) 88a1 (0)\n001 2 7dd3 41d9 | 70 67aa (0) 67dc (0) 66e7 (0) 6337 (0)\n002 4 3e8e 33b5 2c79 2f32 | 32 3b78 (0) 3b88 (0) 39d1 (0) 3f94 (0)\n003 4 165f 154b 13d6 1c9c | 22 14df (0) 1400 (0) 1436 (0) 154b (0)\n004 4 0328 00c6 045b 0661 | 11 0438 (0) 0451 (0) 045b (0) 07a8 (0)\n005 3 0b72 0a00 0af9 | 3 0b72 (0) 0a00 (0) 0af9 (0)\n006 5 0d8a 0de3 0cf5 0c64 | 5 0d8a (0) 0de3 (0) 0cf5 (0) 0c64 (0)\n============ DEPTH: 7 ==========================================\n007 1 0e5e | 1 0e5e (0)\n008 0 | 0\n009 0 | 0\n010 1 0ff2 | 1 0ff2 (0)\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"0fc59bd04ac9de3195e3c9d0eb573952a5805dd2e7e572078b6e996778adec73","private_key":"ab99d1389adc583c136dfe3f4569fbb9ce9ea477cc13a503e1a4aa3f557edffc","name":"node_0fc59bd04ac9de3195e3c9d0eb573952a5805dd2e7e572078b6e996778adec73","services":["streamer"],"enable_msg_events":true,"port":44559},"up":true}},{"node":{"info":{"id":"0ff2d2c49547eebc96675e0b88073dea5e9091bee1843ffe567127e34486c348","name":"node_0ff2d2c49547eebc96675e0b88073dea5e9091bee1843ffe567127e34486c348","enode":"enode://e62b09e34b132f4e59783ab65b9fb191398665c73b314a5fb36715728f869e8e608b374a91e22c4de5eae4fdff9ec4d2e9509c8e1a9c32e675fcf6fee76714f2@127.0.0.1:0","enr":"0xf88fb8409dc12163f250583e65c4c1bb7a368c6d27bbf9a62a49b5b3e99603fa802b0e227379f85879f46521bb12306b9d59b270796787b4da47ad4e0a1a688a4a5ac66c0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102e62b09e34b132f4e59783ab65b9fb191398665c73b314a5fb36715728f869e8e","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"D/LSxJVH7ryWZ14LiAc96l6Qkb7hhD/+VnEn40SGw0g=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 0ff2d2\npopulation: 35 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 a34e a46d 9076 9852 | 110 88fe (0) 88a1 (0) 886a (0) 898d (0)\n001 7 6e68 6c73 66e7 605a | 70 67aa (0) 67dc (0) 66e7 (0) 6337 (0)\n002 4 3e8e 33b5 2f32 2c79 | 32 39d1 (0) 3b88 (0) 3b78 (0) 3f94 (0)\n003 5 154b 179f 165f 13d6 | 22 11d4 (0) 103b (0) 13d6 (0) 1400 (0)\n004 5 0661 045b 0328 0067 | 11 0438 (0) 0451 (0) 045b (0) 0743 (0)\n005 3 0b72 0af9 0a00 | 3 0b72 (0) 0af9 (0) 0a00 (0)\n006 4 0d8a 0de3 0cf5 0c28 | 5 0d8a (0) 0de3 (0) 0cf5 (0) 0c64 (0)\n============ DEPTH: 7 ==========================================\n007 1 0e5e | 1 0e5e (0)\n008 0 | 0\n009 0 | 0\n010 1 0fc5 | 1 0fc5 (0)\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"0ff2d2c49547eebc96675e0b88073dea5e9091bee1843ffe567127e34486c348","private_key":"b07ba37d3566d0d06613c70c3b970828a35c02d35d3ef97c26f1e431564cbc71","name":"node_0ff2d2c49547eebc96675e0b88073dea5e9091bee1843ffe567127e34486c348","services":["streamer"],"enable_msg_events":true,"port":36663},"up":true}},{"node":{"info":{"id":"582330d8b8c49331b2aec790dc7325b9cd483fc8129323d31ec429d545042964","name":"node_582330d8b8c49331b2aec790dc7325b9cd483fc8129323d31ec429d545042964","enode":"enode://e1459426b83f1c65c5a4dac403ae9a8773d1fadf7f57014afe1f5632b40de446b925e309ac581a098f0a8597f54b231887ddef9fb033832546b7b1c438536514@127.0.0.1:0","enr":"0xf88fb84034a6c607747bfdaaddea35634f841a275979e6eb07a13c4806c7988076977d676c9cbe2a8b59da6776cf329633bf937933eebe202770e6b4cd1dc70b794785850183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102e1459426b83f1c65c5a4dac403ae9a8773d1fadf7f57014afe1f5632b40de446","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"WCMw2LjEkzGyrseQ3HMluc1IP8gSkyPTHsQp1UUEKWQ=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 582330\npopulation: 28 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 eb98 fbf5 | 110 8f21 (0) 898d (0) 886a (0) 88fe (0)\n001 2 1c9c 0ff2 | 76 39d1 (0) 3b88 (0) 3b78 (0) 3f94 (0)\n002 5 7920 7dd3 605a 6e68 | 32 67aa (0) 67dc (0) 66e7 (0) 6337 (0)\n003 7 4c9e 4d6b 4d59 4e5a | 23 4990 (0) 49cd (0) 49ea (0) 4ac7 (0)\n004 7 574f 51db 524d 5308 | 8 574f (0) 512e (0) 51db (0) 524d (0)\n005 3 5cd2 5db0 5efb | 4 5db0 (0) 5cd2 (0) 5f00 (0) 5efb (0)\n============ DEPTH: 6 ==========================================\n006 1 5b63 | 1 5b63 (0)\n007 0 | 0\n008 1 58ed | 1 58ed (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"582330d8b8c49331b2aec790dc7325b9cd483fc8129323d31ec429d545042964","private_key":"e0e4076ce60393be8ae8f561ab3bbb784e5d4b9cf9044cbea245608f94062e9f","name":"node_582330d8b8c49331b2aec790dc7325b9cd483fc8129323d31ec429d545042964","services":["streamer"],"enable_msg_events":true,"port":44383},"up":true}},{"node":{"info":{"id":"41d9c03e44bec3f84a6139ce40ef1e390530f38ed11860575acfad03a49db095","name":"node_41d9c03e44bec3f84a6139ce40ef1e390530f38ed11860575acfad03a49db095","enode":"enode://f68ed6030af61743ebafe811b9833a5cc29e35d00e6e0181d06feef9ca714898bed30f326a49a3c145cd1002a24d9c5ae79c2787464e58cd24dcf59fd0760bc1@127.0.0.1:0","enr":"0xf88fb8408b71d88c0475a30d0141a21ead67266d6a40391c609d4fbb1c376e0f05e920160e6dbbc8db17d82a85e5121346b02f6c670e28e88acba5d763a1986cea5bedf90183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103f68ed6030af61743ebafe811b9833a5cc29e35d00e6e0181d06feef9ca714898","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"QdnAPkS+w/hKYTnOQO8eOQUw847RGGBXWs+tA6SdsJU=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 41d9c0\npopulation: 37 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 daec eb98 fbf5 | 110 ad98 (0) ac4d (0) af02 (0) ae2b (0)\n001 3 314a 0fc5 1c9c | 76 39d1 (0) 3b88 (0) 3b78 (0) 3f94 (0)\n002 8 7125 7920 7dd3 66e7 | 32 67aa (0) 67dc (0) 66e7 (0) 6337 (0)\n003 5 534b 53fe 5efb 5cd2 | 15 574f (0) 512e (0) 51db (0) 524d (0)\n004 7 4990 49ea 4bcf 4c9e | 11 49cd (0) 49ea (0) 4990 (0) 4a8b (0)\n============ DEPTH: 5 ==========================================\n005 10 47bf 4782 46fe 4646 | 10 4447 (0) 44a1 (0) 4558 (0) 4559 (0)\n006 0 | 0\n007 0 | 0\n008 1 4109 | 1 4109 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"41d9c03e44bec3f84a6139ce40ef1e390530f38ed11860575acfad03a49db095","private_key":"1165ce19cad30464dac1767d11f8462ee17a275b99240f7757f516575dae8bd3","name":"node_41d9c03e44bec3f84a6139ce40ef1e390530f38ed11860575acfad03a49db095","services":["streamer"],"enable_msg_events":true,"port":39051},"up":true}},{"node":{"info":{"id":"1c9caf028df31681b1457a54d4b3ab20009f9fa5bd12417a1ba7efe0c660e6bd","name":"node_1c9caf028df31681b1457a54d4b3ab20009f9fa5bd12417a1ba7efe0c660e6bd","enode":"enode://27e2579492f09c50dbc56b6542114d27789897327092c0ddacbabe5f3916be86362afe3b61ec3ea54eb7d39401f7a9307901cacc84a5cb54ab868b4b8c28cbe0@127.0.0.1:0","enr":"0xf88fb840a0df68e76ebed32c21b033b1570b6dcdb45783053022b12bc2763acfd7929fbe3ac0306848c56ad630845f8c05dfc0b47d2976e01c8e1f91cc270fd9f6846edf0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10227e2579492f09c50dbc56b6542114d27789897327092c0ddacbabe5f3916be86","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"HJyvAo3zFoGxRXpU1LOrIACfn6W9EkF6G6fv4MZg5r0=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 1c9caf\npopulation: 39 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 a34e 9852 daec fbf5 | 110 ac4d (0) ad98 (0) af02 (0) ae2b (0)\n001 7 66e7 6e68 7125 534b | 70 7a60 (0) 7b90 (0) 7920 (0) 7e04 (0)\n002 5 314a 33b5 3e8e 2c79 | 32 39d1 (0) 3b88 (0) 3b78 (0) 3f94 (0)\n003 5 0661 00c6 0af9 0fc5 | 22 0438 (0) 0451 (0) 045b (0) 07a8 (0)\n004 10 154b 1400 1436 14df | 12 11d4 (0) 103b (0) 13d6 (0) 1400 (0)\n005 3 1a2a 18f6 19fa | 4 1a2a (0) 1b83 (0) 18f6 (0) 19fa (0)\n006 3 1f85 1f67 1e2a | 3 1f67 (0) 1f85 (0) 1e2a (0)\n============ DEPTH: 7 ==========================================\n007 0 | 0\n008 1 1c47 | 1 1c47 (0)\n009 0 | 0\n010 0 | 0\n011 1 1c8a | 1 1c8a (0)\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"1c9caf028df31681b1457a54d4b3ab20009f9fa5bd12417a1ba7efe0c660e6bd","private_key":"67941e3130de030151f98c59f040e588508b299893d26eede53fbfd0400f76a6","name":"node_1c9caf028df31681b1457a54d4b3ab20009f9fa5bd12417a1ba7efe0c660e6bd","services":["streamer"],"enable_msg_events":true,"port":40355},"up":true}},{"node":{"info":{"id":"4d59cf1aeecf370e94a7a231887450cef97053b9c88a7fd11e210840af070e29","name":"node_4d59cf1aeecf370e94a7a231887450cef97053b9c88a7fd11e210840af070e29","enode":"enode://eb61dee424d25e9ca5147121a89b8dfc8e186fd83ad973d590fe6f050e5ad71094b18d539d127b7699769bd08e722bf1d253c42d9dcd7bd744efb8d90b7517bc@127.0.0.1:0","enr":"0xf88fb8409303866ac69b06db6e9cd2c5bf37b2046d4ba9be08473191181141ebc1a822e37088c33aaa9d396ad7398756422d234de878117f2cce3bd9477b23860a9bcea00183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102eb61dee424d25e9ca5147121a89b8dfc8e186fd83ad973d590fe6f050e5ad710","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"TVnPGu7PNw6Up6IxiHRQzvlwU7nIin/RHiEIQK8HDik=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 4d59cf\npopulation: 25 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 9852 c898 eb98 | 110 ac4d (0) ad98 (0) af02 (0) ae2b (0)\n001 2 1c9c 2f32 | 76 02d8 (0) 03cc (0) 0328 (0) 0067 (0)\n002 6 7125 7dd3 7920 605a | 32 7a60 (0) 7b90 (0) 7920 (0) 7e04 (0)\n003 4 5823 5cd2 534b 53fe | 15 574f (0) 512e (0) 51db (0) 524d (0)\n004 3 4646 4109 41d9 | 12 4558 (0) 4559 (0) 4447 (0) 44a1 (0)\n005 3 4990 49ea 4bcf | 6 4990 (0) 49cd (0) 49ea (0) 4ac7 (0)\n006 1 4e5a | 1 4e5a (0)\n007 1 4c9e | 1 4c9e (0)\n============ DEPTH: 8 ==========================================\n008 0 | 0\n009 1 4d10 | 1 4d10 (0)\n010 1 4d6b | 1 4d6b (0)\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"4d59cf1aeecf370e94a7a231887450cef97053b9c88a7fd11e210840af070e29","private_key":"37294667aa7ef5913f670784ca64ca2422b73d30730798e5ba9d0dce067d5f04","name":"node_4d59cf1aeecf370e94a7a231887450cef97053b9c88a7fd11e210840af070e29","services":["streamer"],"enable_msg_events":true,"port":41171},"up":true}},{"node":{"info":{"id":"2f32d54f06989efb6ca5431b74cd759fba05dbef36ecff8fd506e662026af983","name":"node_2f32d54f06989efb6ca5431b74cd759fba05dbef36ecff8fd506e662026af983","enode":"enode://27ddb367d5d4a30ad5888523d743494926b5a27942077719cc6c537b73f04bb87f65cddfb3cfc09a733c1691c43c7a9afe8b9e268ee323af1f8d8a85beea4cb5@127.0.0.1:0","enr":"0xf88fb840772057c835ac9c84a2eaa07977982bbc77cdb5dbc67b095e1b64eba4bd7364362a8286caab1fac316b5f9c128103397f945e78d6d1f10dbe310fb1a21a5657680183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10327ddb367d5d4a30ad5888523d743494926b5a27942077719cc6c537b73f04bb8","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"LzLVTwaYnvtspUMbdM11n7oF2+827P+P1QbmYgJq+YM=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 2f32d5\npopulation: 31 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 9852 c620 daec eb98 | 110 ad98 (0) ac4d (0) af02 (0) ae2b (0)\n001 5 6e68 7125 7dd3 534b | 70 7b90 (0) 7a60 (0) 7920 (0) 7e04 (0)\n002 6 0661 0ff2 0fc5 13d6 | 44 02d8 (0) 03cc (0) 0328 (0) 0067 (0)\n003 6 314a 33b5 3b78 3efc | 17 3780 (0) 378e (0) 3630 (0) 35e6 (0)\n004 4 256e 24b8 2101 21a0 | 6 24b8 (0) 256e (0) 20ae (0) 217f (0)\n005 2 2a97 2abb | 4 2995 (0) 2a0a (0) 2a97 (0) 2abb (0)\n============ DEPTH: 6 ==========================================\n006 4 2d36 2ccf 2c38 2c79 | 4 2d36 (0) 2ccf (0) 2c38 (0) 2c79 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"2f32d54f06989efb6ca5431b74cd759fba05dbef36ecff8fd506e662026af983","private_key":"fb9c0c109d964d1f2840834912ab8fb4d275c821c47cbacf4865721f774ad246","name":"node_2f32d54f06989efb6ca5431b74cd759fba05dbef36ecff8fd506e662026af983","services":["streamer"],"enable_msg_events":true,"port":37983},"up":true}},{"node":{"info":{"id":"eb98fb45dd5754f24f9df0c9ecbb93932e3d9d7735cd6d0ddd4a8675bb4ef554","name":"node_eb98fb45dd5754f24f9df0c9ecbb93932e3d9d7735cd6d0ddd4a8675bb4ef554","enode":"enode://e478db1e6ae924395ba7c3eed4a3c1161fed7757938dbc6e802fca7e8daac58d16f9cf87017d684499f9aa2c5ea3ebbf74805e24b5454661a4f12af2bd9b4e69@127.0.0.1:0","enr":"0xf88fb84083fabf1c86dbfb7ea406905cb02c1a05b4cd8e41ee010679b981abb41d7ef8ba1e5f916713c12c739fd237f35952c0e01b65faf2bdffe581e53b602ef397cd470183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103e478db1e6ae924395ba7c3eed4a3c1161fed7757938dbc6e802fca7e8daac58d","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"65j7Rd1XVPJPnfDJ7LuTky49nXc1zW0N3UqGdbtO9VQ=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: eb98fb\npopulation: 38 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 5823 41d9 4d59 103b | 146 7a60 (0) 7b90 (0) 7920 (0) 7e04 (0)\n001 5 b820 b02b a46d a34e | 47 ac4d (0) ad98 (0) af02 (0) ae2b (0)\n002 6 d3b0 d887 daec c898 | 26 cc20 (0) ca04 (0) caf6 (0) c9f5 (0)\n003 9 fbc8 fbf5 f925 f773 | 19 f629 (0) f7fa (0) f7ba (0) f773 (0)\n004 5 e027 e775 e7fa e514 | 8 e027 (0) e5d7 (0) e5ad (0) e514 (0)\n005 5 ed2d ee5e ef1b ef07 | 6 ec52 (0) ed2d (0) ee5e (0) ef07 (0)\n============ DEPTH: 6 ==========================================\n006 3 e8ef e883 e854 | 3 e8ef (0) e883 (0) e854 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"eb98fb45dd5754f24f9df0c9ecbb93932e3d9d7735cd6d0ddd4a8675bb4ef554","private_key":"ab86a41209d246a5d6b5c8bf86ba8d32901ffa817d143a63719c1189703ae84f","name":"node_eb98fb45dd5754f24f9df0c9ecbb93932e3d9d7735cd6d0ddd4a8675bb4ef554","services":["streamer"],"enable_msg_events":true,"port":43213},"up":true}},{"node":{"info":{"id":"9852ce267d53106a6e584d6eddb08e0062eb4a422d2a8d39ad6dccaebac552ff","name":"node_9852ce267d53106a6e584d6eddb08e0062eb4a422d2a8d39ad6dccaebac552ff","enode":"enode://e78bf7b14baa9f968a1eab4abb0ffcc6aaf7f6a3152a59d6b404ef00232ff35cf55fa13f6190c6cb6bcfa4394bb912d7dab1d491f2d39ed7b43029d0f99319d0@127.0.0.1:0","enr":"0xf88fb84029d6cf3fe0d8101f62b9bf17bad9b25f903639962d22b9643a3a6216b8946f00593519afbe56588bbd1e0e52d3a0339778deb5c4c780a818db4c44140fd7bd930183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102e78bf7b14baa9f968a1eab4abb0ffcc6aaf7f6a3152a59d6b404ef00232ff35c","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"mFLOJn1TEGpuWE1u3bCOAGLrSkItKo05rW3MrrrFUv8=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 9852ce\npopulation: 30 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 0ff2 165f 1c9c 2f32 | 146 3780 (0) 378e (0) 3630 (0) 35e6 (0)\n001 4 daec fbc8 fbf5 eb98 | 63 cc20 (0) caf6 (0) ca04 (0) c9f5 (0)\n002 9 b02b b2a5 bcc6 b911 | 27 ac4d (0) ad98 (0) af02 (0) ae2b (0)\n003 5 8f21 88a1 8505 849b | 10 898d (0) 886a (0) 88fe (0) 88a1 (0)\n004 4 9076 90a8 976e 96fc | 6 959f (0) 976e (0) 96fc (0) 915d (0)\n============ DEPTH: 5 ==========================================\n005 2 9d0f 9fa0 | 2 9d0f (0) 9fa0 (0)\n006 0 | 0\n007 0 | 0\n008 1 9890 | 1 9890 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"9852ce267d53106a6e584d6eddb08e0062eb4a422d2a8d39ad6dccaebac552ff","private_key":"ce304c9eade55eb825a72feda5a3d11f9ae9261aadf2bdd54ccd8f3e963dc251","name":"node_9852ce267d53106a6e584d6eddb08e0062eb4a422d2a8d39ad6dccaebac552ff","services":["streamer"],"enable_msg_events":true,"port":43037},"up":true}},{"node":{"info":{"id":"daec45eca40f48843b41f70267c07e94996ced829f02710f15354fbe26e177e7","name":"node_daec45eca40f48843b41f70267c07e94996ced829f02710f15354fbe26e177e7","enode":"enode://8a808e57c6bcbab9333ebbeb571f922303b1bb3197db84c5ff936033294f12429f7b8b06da61e7c04ad7f7c039e2b765b324069428cf86ad8a2d4bddca8d9948@127.0.0.1:0","enr":"0xf88fb84027da20f74a296f9b64d09eb538af5e462aececd8a624e3ac95423f168b062f7c4c6368ee7acf0f9bed1ce235bef0b932517a9ff281c24a84ab5bb5a307b560fe0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1028a808e57c6bcbab9333ebbeb571f922303b1bb3197db84c5ff936033294f1242","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"2uxF7KQPSIQ7QfcCZ8B+lJls7YKfAnEPFTVPvibhd+c=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: daec45\npopulation: 39 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 9 7dd3 6c73 6251 41d9 | 146 256e (0) 24b8 (0) 20ae (0) 2101 (0)\n001 6 a34e b02b b2a5 b820 | 47 ac4d (0) ad98 (0) af02 (0) aeb4 (0)\n002 11 f456 f45f f773 f31c | 37 f629 (0) f7ba (0) f7fa (0) f773 (0)\n003 5 cc20 c9f5 c898 c1f9 | 15 cc20 (0) caf6 (0) ca04 (0) c9f5 (0)\n004 3 d1d7 d3b0 d299 | 5 d640 (0) d7ac (0) d1d7 (0) d299 (0)\n005 1 df1e | 1 df1e (0)\n006 2 d887 d863 | 2 d887 (0) d863 (0)\n============ DEPTH: 7 ==========================================\n007 1 db6a | 1 db6a (0)\n008 1 da67 | 1 da67 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"daec45eca40f48843b41f70267c07e94996ced829f02710f15354fbe26e177e7","private_key":"56866cfeb6cabc6b29d13eb7d3d7f08b4638fcf8f8d6c84303c8af5fa371a1a5","name":"node_daec45eca40f48843b41f70267c07e94996ced829f02710f15354fbe26e177e7","services":["streamer"],"enable_msg_events":true,"port":41737},"up":true}},{"node":{"info":{"id":"c620752a083ca1ff0398937235cf964133939452c293c799ce07ff8aa2bde420","name":"node_c620752a083ca1ff0398937235cf964133939452c293c799ce07ff8aa2bde420","enode":"enode://87345615c0805d99ec1ea2d9a2524323283810eec32d47fb14165619987edcb9c7d0cc052960238c4beda0cb4692412848cf083744f4287c1d3e3d3549ec8a17@127.0.0.1:0","enr":"0xf88fb84019bfcc1148e643a0381e48afe5c5e9d093b752843123d526ed1df4f62f0c9bdc3ccdc2c80c5be269b4a5674da87b07f2bfea41b969d01926921086864a6914940183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10387345615c0805d99ec1ea2d9a2524323283810eec32d47fb14165619987edcb9","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"xiB1Kgg8of8DmJNyNc+WQTOTlFLCk8eZzgf/iqK95CA=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: c62075\npopulation: 35 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 2c79 2f32 7dd3 6c73 | 146 24b8 (0) 256e (0) 20ae (0) 2101 (0)\n001 6 b2a5 b02b b820 a34e | 47 ac4d (0) ad98 (0) af02 (0) ae2b (0)\n002 11 fbc8 f925 f31c f773 | 37 f629 (0) f7ba (0) f7fa (0) f773 (0)\n003 3 d3b0 d887 daec | 11 d7ac (0) d640 (0) d1d7 (0) d299 (0)\n004 4 cc20 c9f5 c832 c898 | 6 cc20 (0) caf6 (0) ca04 (0) c9f5 (0)\n005 2 c26f c1f9 | 2 c26f (0) c1f9 (0)\n006 3 c59e c43f c441 | 4 c59e (0) c49c (0) c43f (0) c441 (0)\n============ DEPTH: 7 ==========================================\n007 1 c786 | 1 c786 (0)\n008 1 c6cf | 1 c6cf (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"c620752a083ca1ff0398937235cf964133939452c293c799ce07ff8aa2bde420","private_key":"6819c930fa19b056e7757bb4f0b87d2eba8bbd661c6bec9f68594559199669e9","name":"node_c620752a083ca1ff0398937235cf964133939452c293c799ce07ff8aa2bde420","services":["streamer"],"enable_msg_events":true,"port":39637},"up":true}},{"node":{"info":{"id":"6c73150490e8be9677c40086de0aefed1939581048e26f4a93f5ca26571a1a8f","name":"node_6c73150490e8be9677c40086de0aefed1939581048e26f4a93f5ca26571a1a8f","enode":"enode://80cc5420bd8d38bbd9b86077f10f27e11ac8ba32e9faa57dae75f0ebd5b605deaba207fc0912b1b93cbd29ad868bdcb0ecfc77c35f8d02e63729e09e8ccf1050@127.0.0.1:0","enr":"0xf88fb840f9be773757b0f5b1b3eecf7c1e53f23d4c24f84948d5fa49b2024cafcd7e7fce1dde3a795a557af1919771bb29869e79054b383ecb6413dbd5a7ad5637552c130183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10280cc5420bd8d38bbd9b86077f10f27e11ac8ba32e9faa57dae75f0ebd5b605de","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"bHMVBJDovpZ3xACG3grv7Rk5WBBI4m9Kk/XKJlcaGo8=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 6c7315\npopulation: 41 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 9076 e854 daec c620 | 110 ac4d (0) ad98 (0) af02 (0) aeb4 (0)\n001 6 21a0 2c79 3e8e 33b5 | 76 24b8 (0) 256e (0) 20ae (0) 217f (0)\n002 9 53fe 534b 5823 4646 | 38 5db0 (0) 5cd2 (0) 5f00 (0) 5efb (0)\n003 6 7125 738c 775e 7dbb | 12 77d2 (0) 775e (0) 7290 (0) 738c (0)\n004 6 67dc 66e7 60d7 605a | 9 6103 (0) 60d7 (0) 605a (0) 6337 (0)\n005 2 6967 6831 | 2 6967 (0) 6831 (0)\n============ DEPTH: 6 ==========================================\n006 7 6fe9 6f5f 6f2d 6ecb | 7 6fe9 (0) 6f5f (0) 6f2d (0) 6ecb (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 1 6c4d | 1 6c4d (0)\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"6c73150490e8be9677c40086de0aefed1939581048e26f4a93f5ca26571a1a8f","private_key":"1d02f4867632ec5b85fbb3116d676151cc62887e6c539870ba0c42f929299581","name":"node_6c73150490e8be9677c40086de0aefed1939581048e26f4a93f5ca26571a1a8f","services":["streamer"],"enable_msg_events":true,"port":34593},"up":true}},{"node":{"info":{"id":"e8548b5df15adf0f2a997ff5709827beb5e1d36bb08a2f2d017746d5c0e83fca","name":"node_e8548b5df15adf0f2a997ff5709827beb5e1d36bb08a2f2d017746d5c0e83fca","enode":"enode://427720d085bc2d3fdde2d55df27162448b78a2e49d4d68bd8566b41345c87af64019cab4042a4228010b78ccc0935eb8d1fbbd6e147127d103557cff767e43fe@127.0.0.1:0","enr":"0xf88fb8400983bdd51a44197b57c4edd3528554d739aeb0876d2c50da898b134a951aea4d0045cd49590984531c7ba95e99489cb0155a426655d50bc36483d8da6e90af5b0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102427720d085bc2d3fdde2d55df27162448b78a2e49d4d68bd8566b41345c87af6","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"6FSLXfFa3w8qmX/1cJgnvrXh02uwii8tAXdG1cDoP8o=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: e8548b\npopulation: 31 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 103b 165f 7920 6c73 | 146 24b8 (0) 256e (0) 20ae (0) 217f (0)\n001 3 b02b b820 9076 | 47 ac4d (0) ad98 (0) af02 (0) aeb4 (0)\n002 5 d3b0 daec c620 cc20 | 26 d640 (0) d7ac (0) d1d7 (0) d299 (0)\n003 7 fbc8 fbf5 f925 f27f | 19 f629 (0) f7fa (0) f7ba (0) f773 (0)\n004 3 e775 e7fa e54b | 8 e027 (0) e5d7 (0) e5ad (0) e514 (0)\n005 6 ec52 ed2d efea ef07 | 6 ec52 (0) ed2d (0) ee5e (0) efea (0)\n006 1 eb98 | 1 eb98 (0)\n============ DEPTH: 7 ==========================================\n007 0 | 0\n008 2 e8ef e883 | 2 e8ef (0) e883 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"e8548b5df15adf0f2a997ff5709827beb5e1d36bb08a2f2d017746d5c0e83fca","private_key":"a54bb672dc9321d27af926996f1bd8561f767a940f45b2ae7b50641aafc296b2","name":"node_e8548b5df15adf0f2a997ff5709827beb5e1d36bb08a2f2d017746d5c0e83fca","services":["streamer"],"enable_msg_events":true,"port":46437},"up":true}},{"node":{"info":{"id":"165f1af67aa1d24569e0bdff61d29b3c39e93250071d8f25b5be6face209ac6a","name":"node_165f1af67aa1d24569e0bdff61d29b3c39e93250071d8f25b5be6face209ac6a","enode":"enode://4201b86b495b4d95596ac23ba0cc4d0f467eb4570eae4bb2406f02acd483a0b590572cb93ff3d5e15951430b17eb765cfc57f0dd0f98d54facc4840a2f3c7446@127.0.0.1:0","enr":"0xf88fb8402d57c75cdbe7f54cfca4be2a9df2fd02b13b64e4abe4a8777dfcc5ac11a951a14393317578595f7833b5b2c12b361607c6f94305581f0499823944b40349d6d20183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1024201b86b495b4d95596ac23ba0cc4d0f467eb4570eae4bb2406f02acd483a0b5","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"Fl8a9nqh0kVp4L3/YdKbPDnpMlAHHY8ltb5vrOIJrGo=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 165f1a\npopulation: 34 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 9852 9076 daec e775 | 110 ac4d (0) ad98 (0) ae2b (0) aeb4 (0)\n001 5 66e7 6831 6e68 6c73 | 70 4558 (0) 4559 (0) 4447 (0) 44a1 (0)\n002 4 2c79 2f32 314a 3e8e | 32 256e (0) 24b8 (0) 20ae (0) 217f (0)\n003 6 0328 0661 045b 0b72 | 22 0b72 (0) 0af9 (0) 0a00 (0) 0d8a (0)\n004 4 1e2a 1c9c 1c8a 19fa | 10 1b83 (0) 1a2a (0) 18f6 (0) 19fa (0)\n005 3 11d4 103b 13d6 | 3 11d4 (0) 103b (0) 13d6 (0)\n006 3 1436 14df 154b | 4 1400 (0) 1436 (0) 14df (0) 154b (0)\n============ DEPTH: 7 ==========================================\n007 3 1704 17db 179f | 3 1704 (0) 17db (0) 179f (0)\n008 0 | 0\n009 0 | 0\n010 1 1672 | 1 1672 (0)\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"165f1af67aa1d24569e0bdff61d29b3c39e93250071d8f25b5be6face209ac6a","private_key":"a5255c5dfef55c549d9899c6086c1aa7f58eeab3dae94d863d16c3e8e5e6f308","name":"node_165f1af67aa1d24569e0bdff61d29b3c39e93250071d8f25b5be6face209ac6a","services":["streamer"],"enable_msg_events":true,"port":37147},"up":true}},{"node":{"info":{"id":"7920d69cf7e458fce0781ea1a4e07768e1a69f6818090eff0abf0b4a0c2c35f8","name":"node_7920d69cf7e458fce0781ea1a4e07768e1a69f6818090eff0abf0b4a0c2c35f8","enode":"enode://9abcce8e8480c2df00f55c8b10f7cbcc56979a41c870eb9fc81ebf37df92ee56d47d9a3d76b9e87204e7cb20d39b04d584ce00ac702f1328606752cabc70d246@127.0.0.1:0","enr":"0xf88fb840246ddc3f6e34e2c10b5ef70b569b15a2579675614e0994c18a8ebf51041a206f4a5a670c168fed69567e6ce63b8b4308bd28e430a270bf4c36bc8e090a29e4780183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1029abcce8e8480c2df00f55c8b10f7cbcc56979a41c870eb9fc81ebf37df92ee56","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"eSDWnPfkWPzgeB6hpOB3aOGmn2gYCQ7/Cr8LSgwsNfg=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 7920d6\npopulation: 29 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 b2a5 e854 e775 | 110 ac4d (0) ad98 (0) ae2b (0) aeb4 (0)\n001 2 3e8e 165f | 76 256e (0) 24b8 (0) 20ae (0) 2101 (0)\n002 6 524d 5823 41d9 4bcf | 38 4447 (0) 44a1 (0) 4558 (0) 4559 (0)\n003 9 67dc 66e7 6251 628e | 20 67aa (0) 67dc (0) 66e7 (0) 6103 (0)\n004 3 738c 7125 775e | 5 77d2 (0) 775e (0) 7290 (0) 738c (0)\n005 4 7e04 7dbb 7dc2 7dd3 | 4 7e04 (0) 7dbb (0) 7dc2 (0) 7dd3 (0)\n============ DEPTH: 6 ==========================================\n006 2 7a60 7b90 | 2 7a60 (0) 7b90 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"7920d69cf7e458fce0781ea1a4e07768e1a69f6818090eff0abf0b4a0c2c35f8","private_key":"9a81a3bcde96713d5d92389b259485aaaff9b59596864bb8933d09ef5ebb1d41","name":"node_7920d69cf7e458fce0781ea1a4e07768e1a69f6818090eff0abf0b4a0c2c35f8","services":["streamer"],"enable_msg_events":true,"port":42903},"up":true}},{"node":{"info":{"id":"e775e9759d4701bd9b43c22f1d1be73c1262b2752bb23cb3857485daf1dcad2d","name":"node_e775e9759d4701bd9b43c22f1d1be73c1262b2752bb23cb3857485daf1dcad2d","enode":"enode://beda928185a8d044cb7303a817ba03b2c76bcf663ef5e852bb6f1f00730bdc445f98b40f8e29f427d9a802c2a3b74ad3403a3d47efb577b555ed87c05ebf83f7@127.0.0.1:0","enr":"0xf88fb840f9fda3d64eba7bad62497dba8a4c99a8e256a8159a4d7b38855bea2e5055a81b7ac9f978137e928e9116c805cca511efdcc58fb9b2473f5c08c4f0d0061cc1e00183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103beda928185a8d044cb7303a817ba03b2c76bcf663ef5e852bb6f1f00730bdc44","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"53XpdZ1HAb2bQ8IvHRvnPBJisnUrsjyzhXSF2vHcrS0=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: e775e9\npopulation: 33 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 103b 165f 7920 | 146 256e (0) 24b8 (0) 20ae (0) 2101 (0)\n001 5 aeb4 af02 a34e a46d | 47 ac4d (0) ad98 (0) ae2b (0) aeb4 (0)\n002 4 d3b0 c1f9 cc20 c898 | 26 d640 (0) d7ac (0) d1d7 (0) d299 (0)\n003 8 f925 fbf5 fbc8 f773 | 19 f629 (0) f7fa (0) f7ba (0) f773 (0)\n004 6 ee5e ef1b efea eb98 | 10 ec52 (0) ed2d (0) ee5e (0) ef07 (0)\n005 1 e027 | 1 e027 (0)\n============ DEPTH: 6 ==========================================\n006 5 e5d7 e5ad e54b e547 | 5 e5d7 (0) e5ad (0) e514 (0) e547 (0)\n007 0 | 0\n008 1 e7fa | 1 e7fa (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"e775e9759d4701bd9b43c22f1d1be73c1262b2752bb23cb3857485daf1dcad2d","private_key":"6be6c403a2ff471a0099cbeee98c75dbf2d356237b388e44e9620413135bfe37","name":"node_e775e9759d4701bd9b43c22f1d1be73c1262b2752bb23cb3857485daf1dcad2d","services":["streamer"],"enable_msg_events":true,"port":46777},"up":true}},{"node":{"info":{"id":"90765b72283f59be4cf9bf7a9e9a22fd6db701c3603cbc0817b4adf2f8e9ce08","name":"node_90765b72283f59be4cf9bf7a9e9a22fd6db701c3603cbc0817b4adf2f8e9ce08","enode":"enode://475b303a40b4441c17f91b7ad399fa70524c60f241f66ac9139de672f06daa5b470a82c16372cb24c759bd76074ca5fb3161083dc6e1131d8f5f4de86ee8542e@127.0.0.1:0","enr":"0xf88fb84067ea7594026da51603b1294b65583b247f3a11286470ba680919f1cfd860bdd20a177b4b4dc916ba757482dac7f6f796677756f635eaa61bb8342f18bad700a20183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102475b303a40b4441c17f91b7ad399fa70524c60f241f66ac9139de672f06daa5b","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"kHZbcig/Wb5M+b96npoi/W23AcNgPLwIF7St8vjpzgg=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 90765b\npopulation: 42 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 3e8e 0fc5 0ff2 165f | 146 4990 (0) 49cd (0) 49ea (0) 4ac7 (0)\n001 9 fbc8 fbf5 f456 e854 | 63 f629 (0) f7ba (0) f7fa (0) f773 (0)\n002 13 a46d a34e ad98 af02 | 27 ac4d (0) ad98 (0) af02 (0) ae2b (0)\n003 5 8f21 88a1 8505 849b | 10 8f21 (0) 898d (0) 886a (0) 88fe (0)\n004 4 9852 9890 9fa0 9d0f | 4 9d0f (0) 9fa0 (0) 9890 (0) 9852 (0)\n005 3 959f 976e 96fc | 3 976e (0) 96fc (0) 959f (0)\n============ DEPTH: 6 ==========================================\n006 0 | 0\n007 1 915d | 1 915d (0)\n008 1 90a8 | 1 90a8 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"90765b72283f59be4cf9bf7a9e9a22fd6db701c3603cbc0817b4adf2f8e9ce08","private_key":"e212701e3a46630b79ca2e6bd4d1a4a4abe893d524fc5bb0327380b4c6ab4c0f","name":"node_90765b72283f59be4cf9bf7a9e9a22fd6db701c3603cbc0817b4adf2f8e9ce08","services":["streamer"],"enable_msg_events":true,"port":41311},"up":true}},{"node":{"info":{"id":"c8986871e46f001d15ed8b70f2aa0fea8ae309d5e5671a500f619e3b348c8c15","name":"node_c8986871e46f001d15ed8b70f2aa0fea8ae309d5e5671a500f619e3b348c8c15","enode":"enode://825fc662eadb1275f9fcd9e791cf12186b5446a81da414669c827c420f43b5550dc05c59267237d34248e57aa77bb1ca04b16a1667f06f1f277e76df0da74bd4@127.0.0.1:0","enr":"0xf88fb8405d639cdcd2181b1bbc1d50557f4ec79e187fddc491c03234d9b07f7968f78a8e49bc2c34d44a6790e07bdf309cb28c8fa1e0fa7ca95b2d5c9c2e34a676f4a9040183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102825fc662eadb1275f9fcd9e791cf12186b5446a81da414669c827c420f43b555","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"yJhoceRvAB0V7Ytw8qoP6orjCdXlZxpQD2GeOzSMjBU=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: c89868\npopulation: 35 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 7 7dd3 4bcf 4d6b 4d59 | 146 4e5a (0) 4c9e (0) 4d10 (0) 4d6b (0)\n001 4 b820 b2a5 82dd 9076 | 47 ac4d (0) ad98 (0) ae2b (0) aeb4 (0)\n002 12 fbc8 f773 f5dc f5b2 | 37 f629 (0) f7ba (0) f7fa (0) f773 (0)\n003 3 d3b0 d887 daec | 11 d640 (0) d7ac (0) d1d7 (0) d299 (0)\n004 4 c26f c1f9 c6cf c620 | 9 c26f (0) c1f9 (0) c59e (0) c43f (0)\n005 1 cc20 | 1 cc20 (0)\n006 2 caf6 ca04 | 2 caf6 (0) ca04 (0)\n============ DEPTH: 7 ==========================================\n007 1 c9f5 | 1 c9f5 (0)\n008 1 c832 | 1 c832 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"c8986871e46f001d15ed8b70f2aa0fea8ae309d5e5671a500f619e3b348c8c15","private_key":"6a52946fb72e66e0da1a45ae5641b7e4bd71cd109d0f8b0bd84c912f21a62a29","name":"node_c8986871e46f001d15ed8b70f2aa0fea8ae309d5e5671a500f619e3b348c8c15","services":["streamer"],"enable_msg_events":true,"port":42015},"up":true}},{"node":{"info":{"id":"3e8efcaf3002522b39065ea30c15426d1eb55916499eff8eb5a814e39d41853c","name":"node_3e8efcaf3002522b39065ea30c15426d1eb55916499eff8eb5a814e39d41853c","enode":"enode://eb36b8be16b143563e4e6a0d40a3059746dd4073e875a344c54ac9da33c5687b346497f5efcb5b8ae55c7c077ad93fa8ddd69dc4aca6f257f892f8f0535e83bd@127.0.0.1:0","enr":"0xf88fb840606ae288441ca25000384f3327aab7b6a889361a45eed00f010a8711ec569a9304f1c0084e167f0f4f050196deb0d8c3321fe2266446fa5e76b11908918001c60183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103eb36b8be16b143563e4e6a0d40a3059746dd4073e875a344c54ac9da33c5687b","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"Po78rzACUis5Bl6jDBVCbR61WRZJnv+OtagU451BhTw=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 3e8efc\npopulation: 30 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 9076 b2a5 fbc8 c898 | 110 a653 (0) a6fb (0) a46d (0) a369 (0)\n001 7 534b 7dbb 7920 6c73 | 70 77d2 (0) 775e (0) 7290 (0) 738c (0)\n002 6 0661 0328 0ff2 0fc5 | 44 1a2a (0) 1b83 (0) 18f6 (0) 19fa (0)\n003 4 21a0 2abb 2c79 2f32 | 15 2d36 (0) 2ccf (0) 2c38 (0) 2c79 (0)\n004 3 3373 33b5 314a | 10 35e6 (0) 3630 (0) 3780 (0) 378e (0)\n005 3 39d1 3b78 3b88 | 3 39d1 (0) 3b78 (0) 3b88 (0)\n============ DEPTH: 6 ==========================================\n006 0 | 0\n007 1 3f94 | 1 3f94 (0)\n008 0 | 0\n009 2 3ec5 3efc | 2 3ec5 (0) 3efc (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"3e8efcaf3002522b39065ea30c15426d1eb55916499eff8eb5a814e39d41853c","private_key":"4de210de6f44b43eebcea0e42a320de5fe4a52ee899ce93696e65018dff1943b","name":"node_3e8efcaf3002522b39065ea30c15426d1eb55916499eff8eb5a814e39d41853c","services":["streamer"],"enable_msg_events":true,"port":39127},"up":true}},{"node":{"info":{"id":"fbc8087a723c564ca0139329902e79748af46699ea7be24d57909a7e8e96f681","name":"node_fbc8087a723c564ca0139329902e79748af46699ea7be24d57909a7e8e96f681","enode":"enode://a017d5ec65ed0ff2bae902195ea9a509c51eade81c818bc111bd6e344ab51bbdb90239fbef510e247dd4917ee5be1cdee2b4f7206adccc675c6b1ef1ac1b70d6@127.0.0.1:0","enr":"0xf88fb840fb39a6e6bc63eb34afc956930c4bb747b7653c69db586b3e5e8986f527c8d08142c0bbc03752bb77e1109ac8a562274d065fd633c69ea3597394362919a720f70183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102a017d5ec65ed0ff2bae902195ea9a509c51eade81c818bc111bd6e344ab51bbd","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"+8gIenI8VkygE5MpkC55dIr0Zpnqe+JNV5Cafo6W9oE=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: fbc808\npopulation: 35 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 534b 179f 3e8e | 146 7290 (0) 738c (0) 7125 (0) 77d2 (0)\n001 9 8f21 8505 9076 9fa0 | 47 959f (0) 976e (0) 96fc (0) 915d (0)\n002 3 daec c620 c898 | 26 d640 (0) d7ac (0) d1d7 (0) d299 (0)\n003 6 ef1b eb98 e854 e883 | 18 ed2d (0) ec52 (0) ee5e (0) ef07 (0)\n004 9 f773 f456 f45f f4e0 | 13 f629 (0) f7fa (0) f7ba (0) f773 (0)\n005 3 fe31 fe21 ff36 | 3 fe31 (0) fe21 (0) ff36 (0)\n============ DEPTH: 6 ==========================================\n006 1 f925 | 1 f925 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 1 fbf5 | 1 fbf5 (0)\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"fbc8087a723c564ca0139329902e79748af46699ea7be24d57909a7e8e96f681","private_key":"459e90cfb3188b5829214e99ecdfdc92c3ca4a8df6a164a5c4c61f79eeefe059","name":"node_fbc8087a723c564ca0139329902e79748af46699ea7be24d57909a7e8e96f681","services":["streamer"],"enable_msg_events":true,"port":35587},"up":true}},{"node":{"info":{"id":"f27f1044777e05f3f60165d0d2fc3e7667fe148e0ca7a097805d60b9f61025f7","name":"node_f27f1044777e05f3f60165d0d2fc3e7667fe148e0ca7a097805d60b9f61025f7","enode":"enode://ad212ba24b9f1cd7ee7e5431309edc1714e9c5ff6610fc49c63be97528ebacc2013bdd5f987b388cb1d6a6a7645d8ea7c5a98b90c4b0f70f4fca6793eb1f01f4@127.0.0.1:0","enr":"0xf88fb840cdd1cdeb2532d9112faf9bdd13f0ab62954f54b6d55a30181ff5f719725dd1b3761a25fdd94173632cf3aa481a3430b30a1bb5341e26c05b8e0ae738e0ace46c0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102ad212ba24b9f1cd7ee7e5431309edc1714e9c5ff6610fc49c63be97528ebacc2","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"8n8QRHd+BfP2AWXQ0vw+dmf+FI4Mp6CXgF1gufYQJfc=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: f27f10\npopulation: 28 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 0661 534b | 146 2d36 (0) 2ccf (0) 2c38 (0) 2c79 (0)\n001 2 b820 b2a5 | 47 959f (0) 976e (0) 96fc (0) 915d (0)\n002 4 d3b0 daec c1f9 c898 | 26 d640 (0) d7ac (0) d1d7 (0) d299 (0)\n003 6 e54b e775 ef1b eb98 | 18 ec52 (0) ed2d (0) ee5e (0) ef1b (0)\n004 3 f925 fbf5 fbc8 | 6 ff36 (0) fe31 (0) fe21 (0) f925 (0)\n005 9 f629 f7ba f773 f528 | 10 f629 (0) f7fa (0) f7ba (0) f773 (0)\n============ DEPTH: 6 ==========================================\n006 0 | 0\n007 1 f31c | 1 f31c (0)\n008 1 f2d5 | 1 f2d5 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"f27f1044777e05f3f60165d0d2fc3e7667fe148e0ca7a097805d60b9f61025f7","private_key":"ce524e315364068c85c93ee7c34cfc6e5532742848a01bf543d213e2cf22f9ee","name":"node_f27f1044777e05f3f60165d0d2fc3e7667fe148e0ca7a097805d60b9f61025f7","services":["streamer"],"enable_msg_events":true,"port":40031},"up":true}},{"node":{"info":{"id":"b2a563ac59bab4dfddf7b6e27b80ee7afdeb2e4295411107903f484bcf9fc4f2","name":"node_b2a563ac59bab4dfddf7b6e27b80ee7afdeb2e4295411107903f484bcf9fc4f2","enode":"enode://a5a8a40f361adf355086fefe1a9d530ee072ff7dda43026954c2e20dfdcdc445873d72bf613dea981c6fe57941e79af6b837431625892eae841bcecec8fa5ea1@127.0.0.1:0","enr":"0xf88fb840a9cc6dfb9ffae8d02cc4343351e64345b21f117b53ef86ee469eed2d5d3929f67c1084a5e8b4ce788894461222a59beb00152452d61f6acc04724857718931030183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103a5a8a40f361adf355086fefe1a9d530ee072ff7dda43026954c2e20dfdcdc445","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"sqVjrFm6tN/d97bie4Duev3rLkKVQREHkD9IS8+fxPI=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: b2a563\npopulation: 35 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 0661 3e8e 7920 628e | 146 2d36 (0) 2ccf (0) 2c38 (0) 2c79 (0)\n001 6 daec c620 c898 fbc8 | 63 d7ac (0) d640 (0) d1d7 (0) d299 (0)\n002 6 9fa0 9852 9890 9076 | 20 959f (0) 976e (0) 96fc (0) 915d (0)\n003 5 af02 aeb4 a6fb a46d | 10 ac4d (0) ad98 (0) ae2b (0) aeb4 (0)\n004 8 bcc6 ba88 badd bb90 | 9 bcc6 (0) baf2 (0) badd (0) ba88 (0)\n005 3 b5b2 b502 b7ca | 5 b5b2 (0) b502 (0) b626 (0) b65e (0)\n============ DEPTH: 6 ==========================================\n006 1 b02b | 1 b02b (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 1 b2b5 | 1 b2b5 (0)\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"b2a563ac59bab4dfddf7b6e27b80ee7afdeb2e4295411107903f484bcf9fc4f2","private_key":"d311ffc3650bc45898ce1480ced3b3fabaed9a8a9877d26a97b2710c9318716f","name":"node_b2a563ac59bab4dfddf7b6e27b80ee7afdeb2e4295411107903f484bcf9fc4f2","services":["streamer"],"enable_msg_events":true,"port":44537},"up":true}},{"node":{"info":{"id":"b820e480354000c837b1781ec1c493e8776b4834252e6453425ac05b925b5a58","name":"node_b820e480354000c837b1781ec1c493e8776b4834252e6453425ac05b925b5a58","enode":"enode://7f841ce185c998f72468ded1e943d2a109a834b4b15c957132af2e5f364df4111c57d1b83651a4b899bf40a3131509505ff6d750e182af6b711511f92bc594a5@127.0.0.1:0","enr":"0xf88fb840c1a87287bf9a406351496453395ee3cc77e00b626375a7e86abedcd951c907f875178719162b1663979a6ec05a5f949286e03f2611eecf13bfb9caca0f670c200183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1037f841ce185c998f72468ded1e943d2a109a834b4b15c957132af2e5f364df411","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"uCDkgDVAAMg3sXgewcST6HdrSDQlLmRTQlrAW5JbWlg=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: b820e4\npopulation: 33 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 0661 66e7 628e 534b | 146 2d36 (0) 2ccf (0) 2c38 (0) 2c79 (0)\n001 11 c898 c620 daec e883 | 63 d640 (0) d7ac (0) d1d7 (0) d299 (0)\n002 6 9890 9852 9fa0 9076 | 20 959f (0) 976e (0) 96fc (0) 915d (0)\n003 3 a34e a46d af02 | 10 ac4d (0) ad98 (0) ae2b (0) aeb4 (0)\n004 2 b02b b2a5 | 8 b626 (0) b65e (0) b7ca (0) b5b2 (0)\n005 1 bcc6 | 1 bcc6 (0)\n006 3 badd ba88 bb90 | 4 baf2 (0) badd (0) ba88 (0) bb90 (0)\n============ DEPTH: 7 ==========================================\n007 2 b911 b95d | 2 b95d (0) b911 (0)\n008 1 b897 | 1 b897 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"b820e480354000c837b1781ec1c493e8776b4834252e6453425ac05b925b5a58","private_key":"61fe17d5be2ccee74b17d7c47a21cef62eea82042e68eb5bc32139b57bf6ee76","name":"node_b820e480354000c837b1781ec1c493e8776b4834252e6453425ac05b925b5a58","services":["streamer"],"enable_msg_events":true,"port":36559},"up":true}},{"node":{"info":{"id":"534bcaa98cf9192b35b6014c650ae067e74332c015ebb516d63601427d7376b8","name":"node_534bcaa98cf9192b35b6014c650ae067e74332c015ebb516d63601427d7376b8","enode":"enode://b948e96344e56ff7ae61c23f8751d2dcc3cb818bb11e981357d1acc94c3c662987cc236e5ecbac4288b68cac7f704edbd39a158a7ec1477817e6379b9d3f06ac@127.0.0.1:0","enr":"0xf88fb8408d7d8db1b2d8e46e0446181eb4d5f2d93967e8f7c55430e17ce80fa7269dbadc2a24bddd9024c14a94deea3ad1cfa69efd5b3e6156e87d8b0afaac9d3ff4a6680183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102b948e96344e56ff7ae61c23f8751d2dcc3cb818bb11e981357d1acc94c3c6629","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"U0vKqYz5GSs1tgFMZQrgZ+dDMsAV67UW1jYBQn1zdrg=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 534bca\npopulation: 35 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 c898 fbc8 f27f b2a5 | 110 d640 (0) d7ac (0) d1d7 (0) d299 (0)\n001 7 1c9c 0661 2abb 2f32 | 76 2d36 (0) 2ccf (0) 2c38 (0) 2c79 (0)\n002 6 7dc2 775e 7125 6c73 | 32 7290 (0) 738c (0) 7125 (0) 77d2 (0)\n003 7 41d9 44a1 4e5a 4c9e | 23 4782 (0) 47bf (0) 46fe (0) 461c (0)\n004 3 5efb 5cd2 5823 | 7 5db0 (0) 5cd2 (0) 5f00 (0) 5efb (0)\n005 1 574f | 1 574f (0)\n006 2 51db 512e | 2 512e (0) 51db (0)\n007 1 524d | 1 524d (0)\n============ DEPTH: 8 ==========================================\n008 2 53a8 53fe | 2 53a8 (0) 53fe (0)\n009 1 5308 | 1 5308 (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"534bcaa98cf9192b35b6014c650ae067e74332c015ebb516d63601427d7376b8","private_key":"c7f75190502386c9d3b3434c24956d84b4c9e41c91671f2b28496a7f4fcdc39e","name":"node_534bcaa98cf9192b35b6014c650ae067e74332c015ebb516d63601427d7376b8","services":["streamer"],"enable_msg_events":true,"port":45967},"up":true}},{"node":{"info":{"id":"66e7fc2df51f5df8d7329851fe9357d895e9d5dfdc25f8d92bdb10a960f7e15a","name":"node_66e7fc2df51f5df8d7329851fe9357d895e9d5dfdc25f8d92bdb10a960f7e15a","enode":"enode://71bc46e6ba9589ea0718de84c96b5d58b5d7f0781e021b003f14b1cda7ff7ccbe697f9d910349ec8830341cfc00ce73729b28d91bf6c66989a46e72d3c5853f7@127.0.0.1:0","enr":"0xf88fb8402f952b1b8ee3a0cdd608676ac1b0422c05695038e3da52824da26933ab776cae7a335c51043e1d2c6b35d878ed54ffa2c4acd71f3870c1ac2db03fdda4be24880183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10371bc46e6ba9589ea0718de84c96b5d58b5d7f0781e021b003f14b1cda7ff7ccb","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"Zuf8LfUfXfjXMphR/pNX2JXp1d/cJfjZK9sQqWD34Vo=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 66e7fc\npopulation: 33 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 b820 82dd | 110 959f (0) 976e (0) 96fc (0) 915d (0)\n001 8 0ff2 1c9c 165f 1672 | 76 2d36 (0) 2ccf (0) 2c38 (0) 2c79 (0)\n002 6 44a1 4109 41d9 4bcf | 38 4447 (0) 44a1 (0) 4558 (0) 4559 (0)\n003 4 7125 7920 7dd3 7dbb | 12 7125 (0) 7290 (0) 738c (0) 77d2 (0)\n004 5 6967 6fe9 6ea5 6e68 | 11 6831 (0) 6967 (0) 6f5f (0) 6f2d (0)\n005 6 6103 60d7 605a 6337 | 6 6103 (0) 60d7 (0) 605a (0) 6337 (0)\n============ DEPTH: 6 ==========================================\n006 0 | 0\n007 2 67aa 67dc | 2 67aa (0) 67dc (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"66e7fc2df51f5df8d7329851fe9357d895e9d5dfdc25f8d92bdb10a960f7e15a","private_key":"73edf61ff541e3a6ba465ffea56c19839af7e9bc3782ff09216905843c204e08","name":"node_66e7fc2df51f5df8d7329851fe9357d895e9d5dfdc25f8d92bdb10a960f7e15a","services":["streamer"],"enable_msg_events":true,"port":46675},"up":true}},{"node":{"info":{"id":"628e7da3359ed6d9dcfbafc7581966e4e09245c321ec78ca75587c9cbb44697f","name":"node_628e7da3359ed6d9dcfbafc7581966e4e09245c321ec78ca75587c9cbb44697f","enode":"enode://753579fc0f9683818e057900626e09327d6610fdbc6996be1b4faea9431977b3c78dd63e7e603523b19dd2b55c8a90b6ea21e91edd926513843de5fc1eea9b26@127.0.0.1:0","enr":"0xf88fb8406e4b52980cff25be487a37763583146103d0312687b7183e3dd02233a6f94b387c1b61ccb793d70ea879dedb92e32c45923debbec85a24bd00f68780acc0da170183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102753579fc0f9683818e057900626e09327d6610fdbc6996be1b4faea9431977b3","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"Yo59ozWe1tnc+6/HWBlm5OCSRcMh7HjKdVh8nLtEaX8=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 628e7d\npopulation: 35 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 e883 82dd b2a5 b820 | 110 ac4d (0) ad98 (0) ae2b (0) aeb4 (0)\n001 6 21a0 3e8e 1672 0ff2 | 76 2d36 (0) 2ccf (0) 2c38 (0) 2c79 (0)\n002 6 41d9 4bcf 4d6b 4d59 | 38 5db0 (0) 5cd2 (0) 5f00 (0) 5efb (0)\n003 7 775e 7125 738c 7920 | 12 7125 (0) 7290 (0) 738c (0) 77d2 (0)\n004 4 6967 6e68 6f2d 6c73 | 11 6831 (0) 6967 (0) 6fe9 (0) 6f5f (0)\n005 3 67aa 67dc 66e7 | 3 67aa (0) 67dc (0) 66e7 (0)\n006 3 6103 60d7 605a | 3 6103 (0) 60d7 (0) 605a (0)\n============ DEPTH: 7 ==========================================\n007 1 6337 | 1 6337 (0)\n008 1 6251 | 1 6251 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"628e7da3359ed6d9dcfbafc7581966e4e09245c321ec78ca75587c9cbb44697f","private_key":"83ebb4dfd7e07f53a417d7d2d026d506a6d45dc6ec03f3acc64b473cf238454a","name":"node_628e7da3359ed6d9dcfbafc7581966e4e09245c321ec78ca75587c9cbb44697f","services":["streamer"],"enable_msg_events":true,"port":39369},"up":true}},{"node":{"info":{"id":"06618d829a8a7317a98f1a40ecf8864e1c94c4e270a9e4c008229dc7cf937b7e","name":"node_06618d829a8a7317a98f1a40ecf8864e1c94c4e270a9e4c008229dc7cf937b7e","enode":"enode://299e207d28b61a8754f9056b7c66999601d85c166abf2d5e28b58bb9af5d07ae1191a60f6b7daa7f1db158847cf41042bacd8d65caced5aae6b785279c7db9c9@127.0.0.1:0","enr":"0xf88fb8405c00f8abb44fe6724d6ec81f03c33ed424ef532ff6d7f23711109c46205f12793e95b225e5830489b2b439f04128e4ee2e2aa0732db7eb8c69c53030da7f9b2f0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103299e207d28b61a8754f9056b7c66999601d85c166abf2d5e28b58bb9af5d07ae","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"BmGNgpqKcxepjxpA7PiGThyUxOJwqeTACCKdx8+Te34=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 06618d\npopulation: 34 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 b820 b2a5 8505 e54b | 110 a653 (0) a6fb (0) a46d (0) a369 (0)\n001 4 534b 4bcf 7dbb 628e | 70 5cd2 (0) 5db0 (0) 5f00 (0) 5efb (0)\n002 5 2abb 2f32 21a0 3e8e | 32 2d36 (0) 2ccf (0) 2c38 (0) 2c79 (0)\n003 5 1c9c 19fa 165f 1672 | 22 1b83 (0) 1a2a (0) 18f6 (0) 19fa (0)\n004 5 0af9 0de3 0c28 0ff2 | 11 0b72 (0) 0a00 (0) 0af9 (0) 0d8a (0)\n005 4 0067 00c6 03cc 0328 | 5 0067 (0) 00c6 (0) 02d8 (0) 03cc (0)\n006 3 0438 0451 045b | 3 0438 (0) 0451 (0) 045b (0)\n============ DEPTH: 7 ==========================================\n007 2 0743 07a8 | 2 0743 (0) 07a8 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"06618d829a8a7317a98f1a40ecf8864e1c94c4e270a9e4c008229dc7cf937b7e","private_key":"8d4e48a151d1f68c567c3be3325aab9baa3b0abb8bf08d65ce6cb448cf056f5b","name":"node_06618d829a8a7317a98f1a40ecf8864e1c94c4e270a9e4c008229dc7cf937b7e","services":["streamer"],"enable_msg_events":true,"port":35915},"up":true}},{"node":{"info":{"id":"f4565dd2c428c03d7a8d5fad87a6dd5f92ae706529eb6152d36fa584e7cdbe4d","name":"node_f4565dd2c428c03d7a8d5fad87a6dd5f92ae706529eb6152d36fa584e7cdbe4d","enode":"enode://5b2117cf5005122b31d4139c5ecffbfb0b3b5b3ccc04122ecee2b65ddc3b5f365fc02b4df864cce4b6b626a9c76bdee3d791ae0dd8acf96c0844b2a6e5641b39@127.0.0.1:0","enr":"0xf88fb840e2d50d151f647dccd99b24b546d0c033602555711b5e9b696b397c56e0301e34144f5201dc6446c2708545baa267d5ab59974b796a1af49a6cde843af933d35e0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1035b2117cf5005122b31d4139c5ecffbfb0b3b5b3ccc04122ecee2b65ddc3b5f36","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"9FZd0sQowD16jV+th6bdX5KucGUp62FS02+lhOfNvk0=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: f4565d\npopulation: 32 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 7dbb 4bcf 0661 | 146 7125 (0) 7290 (0) 738c (0) 77d2 (0)\n001 6 b820 b2a5 9fa0 9076 | 47 ac4d (0) ad98 (0) ae2b (0) aeb4 (0)\n002 5 daec d3b0 c620 c1f9 | 26 d640 (0) d7ac (0) d1d7 (0) d299 (0)\n003 6 ed2d eb98 e854 e883 | 18 e027 (0) e7fa (0) e775 (0) e5ad (0)\n004 3 f925 fbc8 fbf5 | 6 ff36 (0) fe31 (0) fe21 (0) f925 (0)\n005 2 f31c f27f | 3 f31c (0) f2d5 (0) f27f (0)\n006 2 f7ba f773 | 4 f629 (0) f7fa (0) f7ba (0) f773 (0)\n007 3 f528 f5b2 f5dc | 3 f528 (0) f5dc (0) f5b2 (0)\n============ DEPTH: 8 ==========================================\n008 1 f4e0 | 1 f4e0 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 1 f45f | 1 f45f (0)\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"f4565dd2c428c03d7a8d5fad87a6dd5f92ae706529eb6152d36fa584e7cdbe4d","private_key":"b9015ed803b33c63a30a8abe7812408ed9cc2ba7efcdb5fcd69f0a681d123675","name":"node_f4565dd2c428c03d7a8d5fad87a6dd5f92ae706529eb6152d36fa584e7cdbe4d","services":["streamer"],"enable_msg_events":true,"port":39127},"up":true}},{"node":{"info":{"id":"4bcf4eb531d5ec4b31d99e8354af03f976524c7858a1e7043e9b7055326f0952","name":"node_4bcf4eb531d5ec4b31d99e8354af03f976524c7858a1e7043e9b7055326f0952","enode":"enode://88c7ac31971ce995e22e0820ae73cd53e1bda565f636bea5b3c0472c44d54a66a23d6143ecad625bef9fb09e3e64da6fd629ead736b184981cb9052a1cb0489f@127.0.0.1:0","enr":"0xf88fb840c74ff09f194ac5d818ba51ea9fd29c00ac3ebd753d02ec50dfe7c1438f754d9c794455cf5ee526e53b257971614e8b756a1a4c0da3fbcac597cbf2044a14e7e20183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10388c7ac31971ce995e22e0820ae73cd53e1bda565f636bea5b3c0472c44d54a66","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"S89OtTHV7Esx2Z6DVK8D+XZSTHhYoecEPptwVTJvCVI=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 4bcf4e\npopulation: 37 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 82dd c898 e883 f456 | 110 a653 (0) a6fb (0) a46d (0) a369 (0)\n001 6 2abb 314a 179f 1672 | 76 1a2a (0) 1b83 (0) 18f6 (0) 19fa (0)\n002 10 6ea5 6c73 628e 67dc | 32 6831 (0) 6967 (0) 6fe9 (0) 6f5f (0)\n003 2 5823 534b | 15 5db0 (0) 5cd2 (0) 5f00 (0) 5efb (0)\n004 6 4636 4646 44a1 4559 | 12 4447 (0) 44a1 (0) 4558 (0) 4559 (0)\n005 4 4e5a 4d6b 4d59 4c9e | 5 4e5a (0) 4c9e (0) 4d10 (0) 4d59 (0)\n006 3 4990 49cd 49ea | 3 4990 (0) 49cd (0) 49ea (0)\n============ DEPTH: 7 ==========================================\n007 2 4ac7 4a8b | 2 4ac7 (0) 4a8b (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"4bcf4eb531d5ec4b31d99e8354af03f976524c7858a1e7043e9b7055326f0952","private_key":"4cc4751021f2e7e361f1abe34a0ae098305a4d7cfae9fff4e3d9c198f765536c","name":"node_4bcf4eb531d5ec4b31d99e8354af03f976524c7858a1e7043e9b7055326f0952","services":["streamer"],"enable_msg_events":true,"port":37843},"up":true}},{"node":{"info":{"id":"82dd83838cb982b89505ef249d353a20e434346dd78b71cd9b809f71d5c112da","name":"node_82dd83838cb982b89505ef249d353a20e434346dd78b71cd9b809f71d5c112da","enode":"enode://9e0bd5f9048e54e757f441f6e806f675359f125df0759d69c99dfa05b612264f47f2e4ef3b1e8c33ea12203b3539baa8e8f7112a42c09fba13c8088012abf854@127.0.0.1:0","enr":"0xf88fb840ce5cbe31c864fb919be4b8bbaeb4aac9af3baceddb264f0fc41711cfe79eac031fef6d0c4e5186833885990f4fb8bf788dfde9ec3140e53dd617c1a301f7da460183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1029e0bd5f9048e54e757f441f6e806f675359f125df0759d69c99dfa05b612264f","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"gt2Dg4y5griVBe8knTU6IOQ0NG3Xi3HNm4CfcdXBEto=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 82dd83\npopulation: 34 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 0fc5 66e7 628e 7125 | 146 1a2a (0) 1b83 (0) 18f6 (0) 19fa (0)\n001 8 daec c898 c1f9 f456 | 63 d7ac (0) d640 (0) d1d7 (0) d299 (0)\n002 6 b820 b2a5 b02b af02 | 27 ac4d (0) ad98 (0) ae2b (0) aeb4 (0)\n003 5 96fc 9076 9852 9890 | 10 959f (0) 976e (0) 96fc (0) 915d (0)\n004 5 8f21 898d 886a 88a1 | 5 8f21 (0) 898d (0) 886a (0) 88a1 (0)\n005 2 849b 8505 | 2 849b (0) 8505 (0)\n============ DEPTH: 6 ==========================================\n006 1 8025 | 1 8025 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 1 82f9 | 1 82f9 (0)\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"82dd83838cb982b89505ef249d353a20e434346dd78b71cd9b809f71d5c112da","private_key":"40b87f812144699438e8ce3203329a31e5e6fd191ccc6d632b53acd2dabf009a","name":"node_82dd83838cb982b89505ef249d353a20e434346dd78b71cd9b809f71d5c112da","services":["streamer"],"enable_msg_events":true,"port":36651},"up":true}},{"node":{"info":{"id":"7dbbdeba3731e1ff43072f8cbd86db147761e1b61753eea7024774dbf46914bd","name":"node_7dbbdeba3731e1ff43072f8cbd86db147761e1b61753eea7024774dbf46914bd","enode":"enode://c6f41778e207aa191bfcc7583d517dc276591cb6e4ea45a7f640b9e296d6ac32ed466e046bd8e3cd7213d78408c82594ab0d4f91fff4af306e45e91e25568f08@127.0.0.1:0","enr":"0xf88fb840cd11dd01b07641a3cc440cc6247d249d33f4f5f6f8812ff8f209b221f42611e934dd83397f8ce608353435eff2358217cfcee195e78947e92f7f10ae9c8dface0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102c6f41778e207aa191bfcc7583d517dc276591cb6e4ea45a7f640b9e296d6ac32","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"fbveujcx4f9DBy+MvYbbFHdh4bYXU+6nAkd02/RpFL0=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 7dbbde\npopulation: 33 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 f456 e54b 8505 82dd | 110 d7ac (0) d640 (0) d1d7 (0) d299 (0)\n001 8 1672 179f 0328 0661 | 76 1a2a (0) 1b83 (0) 18f6 (0) 19fa (0)\n002 3 524d 4d6b 4bcf | 38 5db0 (0) 5cd2 (0) 5f00 (0) 5efb (0)\n003 9 6ea5 6f2d 6c73 6c4d | 20 6831 (0) 6967 (0) 6fe9 (0) 6f5f (0)\n004 3 738c 7125 775e | 5 7125 (0) 7290 (0) 738c (0) 77d2 (0)\n005 3 7920 7b90 7a60 | 3 7a60 (0) 7b90 (0) 7920 (0)\n006 1 7e04 | 1 7e04 (0)\n============ DEPTH: 7 ==========================================\n007 0 | 0\n008 0 | 0\n009 2 7dd3 7dc2 | 2 7dd3 (0) 7dc2 (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"7dbbdeba3731e1ff43072f8cbd86db147761e1b61753eea7024774dbf46914bd","private_key":"30869970089e876f509073901dbe3a34c332d7a6755999e960da313f0d41bdda","name":"node_7dbbdeba3731e1ff43072f8cbd86db147761e1b61753eea7024774dbf46914bd","services":["streamer"],"enable_msg_events":true,"port":42487},"up":true}},{"node":{"info":{"id":"314a3530a5e0c37d5609149b3ae9c2e078573346bd8fce3c769ebaeb31726ec1","name":"node_314a3530a5e0c37d5609149b3ae9c2e078573346bd8fce3c769ebaeb31726ec1","enode":"enode://2ddf028c09516742c8f18d9dc30575448afbf80f0999e2cccc53671e4b12c97af49c3251151d20ff3c38c6e4885805039f3e31e32101cdb9ccb70596e29e6e97@127.0.0.1:0","enr":"0xf88fb84084eb7ae1c3f66517fa8698e26815ca4ddd8d95653248080c4cf1ae2af93c9ae76806cd1ba9bd6bce2079c1762ba8bc13a96e07869d8fc5fde206d61c694ac4010183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1032ddf028c09516742c8f18d9dc30575448afbf80f0999e2cccc53671e4b12c97a","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"MUo1MKXgw31WCRSbOunC4HhXM0a9j848dp666zFybsE=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 314a35\npopulation: 39 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 af02 8505 daec e54b | 110 a369 (0) a34e (0) a653 (0) a6fb (0)\n001 7 534b 41d9 4d6b 4bcf | 70 5db0 (0) 5cd2 (0) 5f00 (0) 5efb (0)\n002 6 1c9c 19fa 165f 0c28 | 44 1a2a (0) 1b83 (0) 18f6 (0) 19fa (0)\n003 6 2c79 2f32 2abb 256e | 15 2d36 (0) 2ccf (0) 2c38 (0) 2c79 (0)\n004 6 39d1 3b78 3b88 3efc | 7 39d1 (0) 3b78 (0) 3b88 (0) 3f94 (0)\n005 4 35e6 378e 3780 3630 | 4 35e6 (0) 3630 (0) 3780 (0) 378e (0)\n006 3 3237 33b5 3373 | 3 3237 (0) 3373 (0) 33b5 (0)\n============ DEPTH: 7 ==========================================\n007 2 3089 30be | 2 3089 (0) 30be (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"314a3530a5e0c37d5609149b3ae9c2e078573346bd8fce3c769ebaeb31726ec1","private_key":"65cff60a3a02082e25d44b652a89286c56814d6e8a124c9cd481c53d6bfc7d14","name":"node_314a3530a5e0c37d5609149b3ae9c2e078573346bd8fce3c769ebaeb31726ec1","services":["streamer"],"enable_msg_events":true,"port":34143},"up":true}},{"node":{"info":{"id":"e8830f2b2f7d08df15bd33f4b2841d01d9d62c1621234bd6ae86743e52360f3e","name":"node_e8830f2b2f7d08df15bd33f4b2841d01d9d62c1621234bd6ae86743e52360f3e","enode":"enode://2ff0f6983a8df852e410db35700f5eb2e9b6626b555eb6a0f46ed3b1039c11d99e30fa7fb8ef8a5e04f6747539a8fa3b422b0e167e3740bfd0dfc6f05b7811c0@127.0.0.1:0","enr":"0xf88fb84073d5865ea6eef52ccbd4fb0579988b8c89f10c04bf0aab24b530bccf20477019412b8e906f69332ba31a2b366d9cf41dc6b91c1c3dbf0201b5c1815aba93e7990183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1022ff0f6983a8df852e410db35700f5eb2e9b6626b555eb6a0f46ed3b1039c11d9","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"6IMPKy99CN8VvTP0soQdAdnWLBYhI0vWroZ0PlI2Dz4=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: e8830f\npopulation: 32 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 628e 4bcf 4d6b 103b | 146 5b63 (0) 58ed (0) 5823 (0) 5f00 (0)\n001 4 b820 9890 82dd 8505 | 47 a46d (0) a653 (0) a6fb (0) a369 (0)\n002 5 d3b0 daec c1f9 cc20 | 26 d7ac (0) d640 (0) d1d7 (0) d299 (0)\n003 6 fbf5 fbc8 f773 f456 | 19 ff36 (0) fe31 (0) fe21 (0) f925 (0)\n004 4 e027 e7fa e775 e54b | 8 e027 (0) e7fa (0) e775 (0) e5ad (0)\n005 4 ed2d efea ef07 ee5e | 6 ec52 (0) ed2d (0) ee5e (0) ef1b (0)\n006 1 eb98 | 1 eb98 (0)\n============ DEPTH: 7 ==========================================\n007 0 | 0\n008 1 e854 | 1 e854 (0)\n009 1 e8ef | 1 e8ef (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"e8830f2b2f7d08df15bd33f4b2841d01d9d62c1621234bd6ae86743e52360f3e","private_key":"300d395f69d29389b4951f1054ccdecbbb0aa4ee4359e0a42916d279feed61b9","name":"node_e8830f2b2f7d08df15bd33f4b2841d01d9d62c1621234bd6ae86743e52360f3e","services":["streamer"],"enable_msg_events":true,"port":44709},"up":true}},{"node":{"info":{"id":"e54b643cbc95d9f5d27ec3760d892b6802981bfabf4f9979267d66259df982c7","name":"node_e54b643cbc95d9f5d27ec3760d892b6802981bfabf4f9979267d66259df982c7","enode":"enode://88d397dae0a821bb3ade7f8b6934b521491617f1f55ce053be63153915a1d422f16ab186007929b0232d9a7fd420cf692a7df1d9f419a191a1e9e57698485728@127.0.0.1:0","enr":"0xf88fb8405030079ea6a64ac5c86f5eb9955181bb9c23d35cbc28ed8a13410b3c9e9a234928490232594c4773176af76896b5283dffb7979ca1082589e48a45d54473d9e70183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10288d397dae0a821bb3ade7f8b6934b521491617f1f55ce053be63153915a1d422","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"5UtkPLyV2fXSfsN2DYkraAKYG/q/T5l5Jn1mJZ35gsc=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: e54b64\npopulation: 35 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 4d6b 7dbb 1672 0661 | 146 1e2a (0) 1f67 (0) 1f85 (0) 1c47 (0)\n001 5 b820 9890 9fa0 82dd | 47 a653 (0) a6fb (0) a46d (0) a369 (0)\n002 5 daec d3b0 c898 c1f9 | 26 d640 (0) d7ac (0) d1d7 (0) d299 (0)\n003 6 fbf5 fbc8 f31c f27f | 19 ff36 (0) fe31 (0) fe21 (0) f925 (0)\n004 7 ed2d ee5e ef1b efea | 10 ec52 (0) ed2d (0) ee5e (0) ef07 (0)\n005 1 e027 | 1 e027 (0)\n006 2 e775 e7fa | 2 e7fa (0) e775 (0)\n============ DEPTH: 7 ==========================================\n007 0 | 0\n008 2 e5d7 e5ad | 2 e5d7 (0) e5ad (0)\n009 1 e514 | 1 e514 (0)\n010 0 | 0\n011 0 | 0\n012 1 e547 | 1 e547 (0)\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"e54b643cbc95d9f5d27ec3760d892b6802981bfabf4f9979267d66259df982c7","private_key":"727ffbf99e8a4a3259aa56178cd67759e1efcf9d6a0d1bbc5eced5778195a6bb","name":"node_e54b643cbc95d9f5d27ec3760d892b6802981bfabf4f9979267d66259df982c7","services":["streamer"],"enable_msg_events":true,"port":35117},"up":true}},{"node":{"info":{"id":"850575577d6b420a87aba388af481e0c044c2f75cf29ff934daf5674318a61ba","name":"node_850575577d6b420a87aba388af481e0c044c2f75cf29ff934daf5674318a61ba","enode":"enode://f96b8378f9a6fdb344b192c08fa716f806c81b10d9ff1be769f2f147f0a3e59be1d63e3458c6bb0be3826901cc82855dcb176ea550580ce3c1353f45411effa8@127.0.0.1:0","enr":"0xf88fb840e608377b110a66c37a6402a52005fab9cbbd1293d2faf8ac2f2d11f21c86074e65803f9af2fd8a4652da5a03c3a8f62c56bedc2b504966b9def8bec4d14aa6f10183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102f96b8378f9a6fdb344b192c08fa716f806c81b10d9ff1be769f2f147f0a3e59b","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"hQV1V31rQgqHq6OIr0geDARML3XPKf+TTa9WdDGKYbo=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 850575\npopulation: 35 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 0fc5 0661 314a 7125 | 146 0a00 (0) 0af9 (0) 0b72 (0) 0e5e (0)\n001 5 c620 fbc8 f456 e883 | 63 d7ac (0) d640 (0) d1d7 (0) d299 (0)\n002 9 af02 aeb4 a46d a6fb | 27 a369 (0) a34e (0) a653 (0) a6fb (0)\n003 6 9fa0 9852 9890 9076 | 10 959f (0) 976e (0) 96fc (0) 915d (0)\n004 5 898d 886a 88a1 88fe | 5 898d (0) 886a (0) 88fe (0) 88a1 (0)\n============ DEPTH: 5 ==========================================\n005 3 8025 82f9 82dd | 3 8025 (0) 82f9 (0) 82dd (0)\n006 0 | 0\n007 1 849b | 1 849b (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"850575577d6b420a87aba388af481e0c044c2f75cf29ff934daf5674318a61ba","private_key":"771aa77f7ed2c88cec05f7d2bbe77ca3b3baed77808bcede79d47430b855ef8c","name":"node_850575577d6b420a87aba388af481e0c044c2f75cf29ff934daf5674318a61ba","services":["streamer"],"enable_msg_events":true,"port":38191},"up":true}},{"node":{"info":{"id":"4d6b939fb67338c484948ab92b2ceea4d4b666d7e08773673cd7c8f83f495b89","name":"node_4d6b939fb67338c484948ab92b2ceea4d4b666d7e08773673cd7c8f83f495b89","enode":"enode://65fe4500b12d8a6300f6dfa00c6053c96a116b98d8c08d706534d0b0cd73def015021b00da0ea48952faaf26fb6860612ae6f05dc69e3152a60467c474513524@127.0.0.1:0","enr":"0xf88fb840e4f68b9d9c982c9d702d4e773ac1559d8ef54db673accfcab9b83cf5f16a0d191460f4acfcad1a8c86b72017692073a6ad12e178800fa4dd5c30f7958acfb4530183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10265fe4500b12d8a6300f6dfa00c6053c96a116b98d8c08d706534d0b0cd73def0","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"TWuTn7ZzOMSElIq5KyzupNS2Ztfgh3NnPNfI+D9JW4k=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 4d6b93\npopulation: 33 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 c898 e54b e883 8505 | 110 d7ac (0) d640 (0) d1d7 (0) d299 (0)\n001 4 314a 2abb 0328 179f | 76 39d1 (0) 3b78 (0) 3b88 (0) 3f94 (0)\n002 7 67dc 628e 6ea5 775e | 32 7125 (0) 7290 (0) 738c (0) 77d2 (0)\n003 2 5823 534b | 15 5f00 (0) 5efb (0) 5db0 (0) 5cd2 (0)\n004 5 4559 44a1 4646 4636 | 12 47bf (0) 4782 (0) 46fe (0) 4646 (0)\n005 6 4bcf 4ac7 4a8b 4990 | 6 4990 (0) 49cd (0) 49ea (0) 4ac7 (0)\n006 1 4e5a | 1 4e5a (0)\n007 1 4c9e | 1 4c9e (0)\n============ DEPTH: 8 ==========================================\n008 0 | 0\n009 1 4d10 | 1 4d10 (0)\n010 1 4d59 | 1 4d59 (0)\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"4d6b939fb67338c484948ab92b2ceea4d4b666d7e08773673cd7c8f83f495b89","private_key":"ec9be85f4525323e3e5fba6d38fddd6e2c490c51f04e40824f612945338ff314","name":"node_4d6b939fb67338c484948ab92b2ceea4d4b666d7e08773673cd7c8f83f495b89","services":["streamer"],"enable_msg_events":true,"port":33119},"up":true}},{"node":{"info":{"id":"9fa0215e980dc907df4cc47ab4937f36527d78f9837493016fd4fc51e617299c","name":"node_9fa0215e980dc907df4cc47ab4937f36527d78f9837493016fd4fc51e617299c","enode":"enode://74dcd08206970995c262f6fdc36f05eb33b2efd6a76f8dad6d50f4c990fdfff532b14e3a48ae9fdad2e8969bb28c472b5fa4e037266ed8ab1b223d351b00c58c@127.0.0.1:0","enr":"0xf88fb840e8a03ba6a2bd809293a3aa9fc2cd67a032f701eda802d05b9fed7988cd354f6228072d95e1279cfdbb332a0b3f7b6bcc772dd13ef98a3cab034c0beef16d15840183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10274dcd08206970995c262f6fdc36f05eb33b2efd6a76f8dad6d50f4c990fdfff5","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"n6AhXpgNyQffTMR6tJN/NlJ9ePmDdJMBb9T8UeYXKZw=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 9fa021\npopulation: 34 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 2abb 21a0 1672 179f | 146 39d1 (0) 3b78 (0) 3b88 (0) 3f94 (0)\n001 7 fbc8 f45f f456 f773 | 63 d640 (0) d7ac (0) d1d7 (0) d299 (0)\n002 8 af02 a6fb a34e b2a5 | 27 a369 (0) a34e (0) a46d (0) a653 (0)\n003 5 8505 849b 8025 82f9 | 10 898d (0) 886a (0) 88fe (0) 88a1 (0)\n004 6 9076 90a8 915d 959f | 6 959f (0) 976e (0) 96fc (0) 915d (0)\n============ DEPTH: 5 ==========================================\n005 2 9852 9890 | 2 9852 (0) 9890 (0)\n006 1 9d0f | 1 9d0f (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"9fa0215e980dc907df4cc47ab4937f36527d78f9837493016fd4fc51e617299c","private_key":"2151ae4bd0c0dbe72d08c6cc2dc2d42d45d5929d158953f98802508bcc7b6abc","name":"node_9fa0215e980dc907df4cc47ab4937f36527d78f9837493016fd4fc51e617299c","services":["streamer"],"enable_msg_events":true,"port":42793},"up":true}},{"node":{"info":{"id":"179f21d2e0421b8056ee9a260bc0985bfa64a52a36d0a8fbce4e03f3120d1d65","name":"node_179f21d2e0421b8056ee9a260bc0985bfa64a52a36d0a8fbce4e03f3120d1d65","enode":"enode://45316c9ce2f7458c2170694fa0458bb6bc612e0fe7e98d5776eaa2deb243090f2112f86d6378e3fbf2bc3581294561eba34c820855dde3c62fbbd0fb00d464bc@127.0.0.1:0","enr":"0xf88fb840ba7939a13853c684f0fbba8aabd321c8c18392c860e899d661b8ae62334778bc3a1cc6bd039962763203c07b6f86aa8b247af81fb2c72e4b1e9de83cd2f02d3e0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10245316c9ce2f7458c2170694fa0458bb6bc612e0fe7e98d5776eaa2deb243090f","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"F58h0uBCG4BW7pomC8CYW/pkpSo20Kj7zk4D8xINHWU=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 179f21\npopulation: 31 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 c1f9 c898 daec fbc8 | 110 d7ac (0) d640 (0) d1d7 (0) d299 (0)\n001 3 7dbb 4bcf 4d6b | 70 6fe9 (0) 6f5f (0) 6f2d (0) 6e05 (0)\n002 3 3b88 21a0 2abb | 32 39d1 (0) 3b78 (0) 3b88 (0) 3f94 (0)\n003 6 0ff2 0c28 00c6 0328 | 22 0b72 (0) 0a00 (0) 0af9 (0) 0e5e (0)\n004 3 19fa 1c9c 1c8a | 10 1f67 (0) 1f85 (0) 1e2a (0) 1c47 (0)\n005 3 13d6 11d4 103b | 3 13d6 (0) 11d4 (0) 103b (0)\n006 4 14df 1400 1436 154b | 4 14df (0) 1400 (0) 1436 (0) 154b (0)\n007 2 165f 1672 | 2 165f (0) 1672 (0)\n============ DEPTH: 8 ==========================================\n008 1 1704 | 1 1704 (0)\n009 1 17db | 1 17db (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"179f21d2e0421b8056ee9a260bc0985bfa64a52a36d0a8fbce4e03f3120d1d65","private_key":"6fc4e9abe82ac6f220359e1a24c752a8538ca3d77fa2a44721ec006e4dac96c8","name":"node_179f21d2e0421b8056ee9a260bc0985bfa64a52a36d0a8fbce4e03f3120d1d65","services":["streamer"],"enable_msg_events":true,"port":46579},"up":true}},{"node":{"info":{"id":"2abb938b889a2eb735134462985a56056be48f189b5b89d23b653864c76427f4","name":"node_2abb938b889a2eb735134462985a56056be48f189b5b89d23b653864c76427f4","enode":"enode://079b150d46590810199925ef6914c54c274297aa5ddbaec77e0e1881fb11e67c597e4310d3fa518e919ba3530c7863fb75e67892ba8a3ee5385446aded8bd46c@127.0.0.1:0","enr":"0xf88fb840e4c34bba2889adb60fd7f03da39f9172c73803337915b8a91a787ecd1e15f7ac32b8c5ebc60e9bc30a9f10e582b6c56955e330b874275d8f785b67b3d2b7ad7a0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102079b150d46590810199925ef6914c54c274297aa5ddbaec77e0e1881fb11e67c","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"KruTi4iaLrc1E0RimFpWBWvkjxibW4nSO2U4ZMdkJ/Q=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 2abb93\npopulation: 32 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 e883 c1f9 af02 9fa0 | 110 d7ac (0) d640 (0) d3b0 (0) d299 (0)\n001 6 7dbb 6967 66e7 534b | 70 6c4d (0) 6c73 (0) 6fe9 (0) 6f5f (0)\n002 6 0c28 0661 045b 19fa | 44 0b72 (0) 0a00 (0) 0af9 (0) 0e5e (0)\n003 5 3b88 3e8e 3ec5 3efc | 17 39d1 (0) 3b78 (0) 3b88 (0) 3f94 (0)\n004 3 256e 24b8 21a0 | 6 24b8 (0) 256e (0) 20ae (0) 2101 (0)\n005 5 2d36 2c79 2c38 2ccf | 5 2d36 (0) 2ccf (0) 2c38 (0) 2c79 (0)\n006 1 2995 | 1 2995 (0)\n============ DEPTH: 7 ==========================================\n007 0 | 0\n008 1 2a0a | 1 2a0a (0)\n009 0 | 0\n010 1 2a97 | 1 2a97 (0)\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"2abb938b889a2eb735134462985a56056be48f189b5b89d23b653864c76427f4","private_key":"5f2d2d97cebeab930620649942a1d9ff3fb18cfdfe20065c115c21fcc1736417","name":"node_2abb938b889a2eb735134462985a56056be48f189b5b89d23b653864c76427f4","services":["streamer"],"enable_msg_events":true,"port":46385},"up":true}},{"node":{"info":{"id":"16725e318322353befc2f2aba112f0984bc011821bb16c98e2cd8b39cd62aea1","name":"node_16725e318322353befc2f2aba112f0984bc011821bb16c98e2cd8b39cd62aea1","enode":"enode://e24763610f818132ec0e495f6371f3e94f8822100ee5956998fc7585d7e09a222bbdb9a02937e628ca33f6902fe511b8711405899f5cddfa93a1035ac09af4b8@127.0.0.1:0","enr":"0xf88fb840df13ef5dcc1c0cb21d197b2cdfd5d86b8bec8a3882f2c8ba0166a590276699446bccccceac9b5ccb0bcf42d3f59ee925945d58295588d35de7077b7910c5401f0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102e24763610f818132ec0e495f6371f3e94f8822100ee5956998fc7585d7e09a22","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"FnJeMYMiNTvvwvKroRLwmEvAEYIbsWyY4s2LOc1irqE=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 16725e\npopulation: 31 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 e54b c1f9 9fa0 | 110 d7ac (0) d640 (0) d1d7 (0) d299 (0)\n001 8 4bcf 6831 66e7 628e | 70 6831 (0) 6967 (0) 6c4d (0) 6c73 (0)\n002 3 3b88 21a0 2abb | 32 39d1 (0) 3b78 (0) 3b88 (0) 3f94 (0)\n003 4 0c28 045b 0661 0328 | 22 0b72 (0) 0af9 (0) 0a00 (0) 0e5e (0)\n004 2 1c9c 19fa | 10 1e2a (0) 1f67 (0) 1f85 (0) 1c47 (0)\n005 3 13d6 103b 11d4 | 3 13d6 (0) 103b (0) 11d4 (0)\n006 4 14df 1400 1436 154b | 4 14df (0) 1400 (0) 1436 (0) 154b (0)\n============ DEPTH: 7 ==========================================\n007 3 1704 17db 179f | 3 1704 (0) 17db (0) 179f (0)\n008 0 | 0\n009 0 | 0\n010 1 165f | 1 165f (0)\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"16725e318322353befc2f2aba112f0984bc011821bb16c98e2cd8b39cd62aea1","private_key":"0e22a97f0fa9df60515e999107287dd670bbfba6496b95e7419f1ae24ac1430f","name":"node_16725e318322353befc2f2aba112f0984bc011821bb16c98e2cd8b39cd62aea1","services":["streamer"],"enable_msg_events":true,"port":42487},"up":true}},{"node":{"info":{"id":"03285e06657032778feff0b43828c964dbf9de669f63171aeb587aa1a1facc0a","name":"node_03285e06657032778feff0b43828c964dbf9de669f63171aeb587aa1a1facc0a","enode":"enode://3960e88898c09e1856391d4ff8b0e413551efaa9d41b29dbe1d131c4c23d0f3debf2451b0019c3cd1a3cced4e5b0ead9dd73ca011cf6f319d3a6440623ce12c3@127.0.0.1:0","enr":"0xf88fb8403059f7dae44ef458aafb69f9b519e35847da261c7fc2415beb3027871fc5f55b0a37db22d9d2e503fae99b8dce9317e0aab1999b6dc73f581ac8fdabbc40cb7e0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1033960e88898c09e1856391d4ff8b0e413551efaa9d41b29dbe1d131c4c23d0f3d","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"AyheBmVwMneP7/C0OCjJZNv53mafYxca61h6oaH6zAo=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 03285e\npopulation: 31 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 c1f9 f31c | 110 d7ac (0) d640 (0) d3b0 (0) d299 (0)\n001 7 7dbb 7dc2 628e 6251 | 70 6831 (0) 6967 (0) 6c4d (0) 6c73 (0)\n002 4 3e8e 3ec5 3b88 21a0 | 32 39d1 (0) 3b78 (0) 3b88 (0) 3f94 (0)\n003 4 19fa 179f 165f 1672 | 22 1e2a (0) 1f67 (0) 1f85 (0) 1c47 (0)\n004 6 0a00 0af9 0c28 0de3 | 11 0b72 (0) 0a00 (0) 0af9 (0) 0e5e (0)\n005 4 045b 0438 07a8 0661 | 6 0743 (0) 07a8 (0) 0661 (0) 0438 (0)\n006 2 0067 00c6 | 2 0067 (0) 00c6 (0)\n============ DEPTH: 7 ==========================================\n007 1 02d8 | 1 02d8 (0)\n008 1 03cc | 1 03cc (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"03285e06657032778feff0b43828c964dbf9de669f63171aeb587aa1a1facc0a","private_key":"eb65890ae3df82c2a8355c7b7a50e258abb0c833e93aacc2a5dbd51ee15664d4","name":"node_03285e06657032778feff0b43828c964dbf9de669f63171aeb587aa1a1facc0a","services":["streamer"],"enable_msg_events":true,"port":37579},"up":true}},{"node":{"info":{"id":"21a044e772b7c955fe4a6fb7c3a9a20e95d48b7fd6b9518741782f04f5f1f5c2","name":"node_21a044e772b7c955fe4a6fb7c3a9a20e95d48b7fd6b9518741782f04f5f1f5c2","enode":"enode://af8cb83192683c7397ab76929a7a6ebd42a34f250c74baa77449624ec14ff1014486c342f70c70454d60192f7a52ad16cab58958b752e01feea05491ad7b7915@127.0.0.1:0","enr":"0xf88fb84060c1ac919d32f84d9c226ded0dc92ed0cb32034912167e68663f93a3644a8e6b1235368600a6006c4a63078fec8299adecdc0afc9a016fa9eace65a141581d610183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103af8cb83192683c7397ab76929a7a6ebd42a34f250c74baa77449624ec14ff101","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"IaBE53K3yVX+Sm+3w6miDpXUi3/WuVGHQXgvBPXx9cI=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 21a044\npopulation: 37 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 af02 9fa0 c1f9 ed2d | 110 b7ca (0) b65e (0) b626 (0) b5b2 (0)\n001 10 534b 6967 6c73 6ea5 | 70 6831 (0) 6967 (0) 6c4d (0) 6c73 (0)\n002 8 19fa 1436 179f 1672 | 44 1e2a (0) 1f67 (0) 1f85 (0) 1c47 (0)\n003 6 3ec5 3efc 3e8e 3b88 | 17 39d1 (0) 3b78 (0) 3b88 (0) 3f94 (0)\n004 3 2f32 2c79 2abb | 9 2d36 (0) 2ccf (0) 2c38 (0) 2c79 (0)\n005 2 256e 24b8 | 2 256e (0) 24b8 (0)\n============ DEPTH: 6 ==========================================\n006 0 | 0\n007 1 20ae | 1 20ae (0)\n008 2 217f 2101 | 2 217f (0) 2101 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"21a044e772b7c955fe4a6fb7c3a9a20e95d48b7fd6b9518741782f04f5f1f5c2","private_key":"e8c622b14e0b37df0fd9611ed22903fd62f8b8823866163156b933c17f3fc9b3","name":"node_21a044e772b7c955fe4a6fb7c3a9a20e95d48b7fd6b9518741782f04f5f1f5c2","services":["streamer"],"enable_msg_events":true,"port":40127},"up":true}},{"node":{"info":{"id":"f31cc744ea921fee8364c5269b1ce7ec6b5f0c0cbb6885efbf602de5b36f6169","name":"node_f31cc744ea921fee8364c5269b1ce7ec6b5f0c0cbb6885efbf602de5b36f6169","enode":"enode://2d511a834e682276a6f3a8650f3728bec644ab1efd34d504e37aeb317f3a3ee4c0ee0db1c4fa4fd0db73a1da15fef34b527a2587be73d68b35da971c09e6ad5e@127.0.0.1:0","enr":"0xf88fb840d947ce6d973f74d7e2c06e2aa7b0511cf2a30fb7f6565a76dd01220c3071d124635ae79845e4bf315d6a2e0e07acaf661c378ed6998c33219c8cf3158949cc840183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1022d511a834e682276a6f3a8650f3728bec644ab1efd34d504e37aeb317f3a3ee4","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"8xzHROqSH+6DZMUmmxzn7GtfDAy7aIXvv2At5bNvYWk=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: f31cc7\npopulation: 39 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 775e 0328 21a0 | 146 5db0 (0) 5cd2 (0) 5f00 (0) 5efb (0)\n001 6 b95d af02 82dd 849b | 47 b65e (0) b626 (0) b7ca (0) b5b2 (0)\n002 6 d1d7 daec c898 cc20 | 26 d640 (0) d7ac (0) d3b0 (0) d299 (0)\n003 8 e027 e54b e7fa ee5e | 18 ec52 (0) ed2d (0) ee5e (0) ef07 (0)\n004 5 f925 fbc8 fbf5 ff36 | 6 ff36 (0) fe31 (0) fe21 (0) f925 (0)\n005 9 f4e0 f45f f456 f528 | 10 f528 (0) f5b2 (0) f5dc (0) f4e0 (0)\n============ DEPTH: 6 ==========================================\n006 0 | 0\n007 2 f2d5 f27f | 2 f2d5 (0) f27f (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"f31cc744ea921fee8364c5269b1ce7ec6b5f0c0cbb6885efbf602de5b36f6169","private_key":"7b96931ae2b82181dbbf1ce714ef7dcd8a73ee4ba37b6cd3e5a38c185179b50a","name":"node_f31cc744ea921fee8364c5269b1ce7ec6b5f0c0cbb6885efbf602de5b36f6169","services":["streamer"],"enable_msg_events":true,"port":43987},"up":true}},{"node":{"info":{"id":"c1f9e8e1d509febdf1f267bb227741e513420048a2e669ac9eef4b05a29cf10b","name":"node_c1f9e8e1d509febdf1f267bb227741e513420048a2e669ac9eef4b05a29cf10b","enode":"enode://3e653640cb83949eb33046e1f53f3cea2dfc41dda2b5b820f8f519198a9ef5be60bb4feb02bcab43abc24d6283d318be1d4e79ff8530dfe9c9a0cd3b0583460f@127.0.0.1:0","enr":"0xf88fb84070b2190039d9877fc8133fa67fa8c4ce0339ca41fe322a61637d2f6a0501d7d41dfbf0f867138735e708a26fcc2df5419d72eb535ba75a4ab36df55305b825e40183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1033e653640cb83949eb33046e1f53f3cea2dfc41dda2b5b820f8f519198a9ef5be","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"wfno4dUJ/r3x8me7IndB5RNCAEii5mmsnu9LBaKc8Qs=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: c1f9e8\npopulation: 43 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 8 738c 6251 179f 1672 | 146 5b63 (0) 58ed (0) 5823 (0) 5db0 (0)\n001 6 b95d af02 82dd 849b | 47 b65e (0) b626 (0) b7ca (0) b5b2 (0)\n002 14 e883 efea ee5e ed2d | 37 ec52 (0) ed2d (0) ef07 (0) ef1b (0)\n003 4 d1d7 d3b0 d887 daec | 11 df1e (0) d863 (0) d887 (0) db6a (0)\n004 3 cc20 ca04 c898 | 6 cc20 (0) caf6 (0) ca04 (0) c9f5 (0)\n============ DEPTH: 5 ==========================================\n005 7 c59e c49c c441 c43f | 7 c59e (0) c49c (0) c441 (0) c43f (0)\n006 1 c26f | 1 c26f (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"c1f9e8e1d509febdf1f267bb227741e513420048a2e669ac9eef4b05a29cf10b","private_key":"d1af3c939ccb6fbd80b3e800e90fc304fe1a95e5093d4b8a8014d2c2bcc614ef","name":"node_c1f9e8e1d509febdf1f267bb227741e513420048a2e669ac9eef4b05a29cf10b","services":["streamer"],"enable_msg_events":true,"port":38941},"up":true}},{"node":{"info":{"id":"f773b83f1a1de2ab6660edb0b765cfccec6778061ee25c5a84f968625686ef60","name":"node_f773b83f1a1de2ab6660edb0b765cfccec6778061ee25c5a84f968625686ef60","enode":"enode://ebdf19a2508ec342f90a571ea57e25d9fe086842827fb7122f9040f247be1782a6f73e3830e0d4a6d15fb9ba45deaefdd93c4c7ff95d9062fc9fa64149f98e39@127.0.0.1:0","enr":"0xf88fb84074708297591a962a8f10e1c5023c61300d115facd722246df478257dcb61eab468084b00d42034c7472dc28fa7dd04a6e8c31f4478bfb790e7d6a45f9a011a6f0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103ebdf19a2508ec342f90a571ea57e25d9fe086842827fb7122f9040f247be1782","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"93O4Pxod4qtmYO2wt2XPzOxneAYe4lxahPloYlaG72A=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: f773b8\npopulation: 39 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 3ec5 045b 7dc2 | 146 35e6 (0) 3630 (0) 3780 (0) 378e (0)\n001 5 b95d af02 849b 9fa0 | 47 b626 (0) b65e (0) b7ca (0) b5b2 (0)\n002 7 daec d299 d1d7 c898 | 26 d7ac (0) d640 (0) d3b0 (0) d299 (0)\n003 8 ed2d ee5e eb98 e854 | 18 ec52 (0) ed2d (0) ef07 (0) ef1b (0)\n004 4 fe21 f925 fbf5 fbc8 | 6 fe31 (0) fe21 (0) ff36 (0) f925 (0)\n005 3 f2d5 f27f f31c | 3 f2d5 (0) f27f (0) f31c (0)\n006 6 f528 f5b2 f5dc f4e0 | 6 f528 (0) f5b2 (0) f5dc (0) f4e0 (0)\n007 1 f629 | 1 f629 (0)\n============ DEPTH: 8 ==========================================\n008 2 f7fa f7ba | 2 f7fa (0) f7ba (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"f773b83f1a1de2ab6660edb0b765cfccec6778061ee25c5a84f968625686ef60","private_key":"e898408c6a69bdbbb2b3d144d09beeb11db724b09c3b43d166192d7af9c168a9","name":"node_f773b83f1a1de2ab6660edb0b765cfccec6778061ee25c5a84f968625686ef60","services":["streamer"],"enable_msg_events":true,"port":37133},"up":true}},{"node":{"info":{"id":"7dc2a9573f253f362ef1b21bbfcc144b11a6febc58aa3c4430224160e9fa738c","name":"node_7dc2a9573f253f362ef1b21bbfcc144b11a6febc58aa3c4430224160e9fa738c","enode":"enode://ce63a767ab6f112649325e6862410a7e4788fec965925e83abcbc055deca8a04c3beb8619a415ae9a767691bbec01ec218ee44b8a1afd11a06ccbdd63e64d135@127.0.0.1:0","enr":"0xf88fb8400698b27f1b516079af94fb615edaac2e5afe70b2961bcf8525534071441b3b0409021a48a66ad2e700e4d9d46ee752d9aebb9a55dbcac1c6aa072024a7139b260183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103ce63a767ab6f112649325e6862410a7e4788fec965925e83abcbc055deca8a04","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"fcKpVz8lPzYu8bIbv8wUSxGm/rxYqjxEMCJBYOn6c4w=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 7dc2a9\npopulation: 32 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 9890 f45f f773 | 110 b502 (0) b5b2 (0) b7ca (0) b65e (0)\n001 3 1672 0328 045b | 76 35e6 (0) 3630 (0) 3780 (0) 378e (0)\n002 7 524d 534b 44a1 4559 | 38 58ed (0) 5823 (0) 5b63 (0) 5f00 (0)\n003 8 6c4d 6ea5 6f2d 6831 | 20 6c73 (0) 6c4d (0) 6fe9 (0) 6f5f (0)\n004 5 775e 77d2 7125 7290 | 5 7125 (0) 7290 (0) 738c (0) 77d2 (0)\n005 3 7a60 7b90 7920 | 3 7a60 (0) 7b90 (0) 7920 (0)\n006 1 7e04 | 1 7e04 (0)\n============ DEPTH: 7 ==========================================\n007 0 | 0\n008 0 | 0\n009 1 7dbb | 1 7dbb (0)\n010 0 | 0\n011 1 7dd3 | 1 7dd3 (0)\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"7dc2a9573f253f362ef1b21bbfcc144b11a6febc58aa3c4430224160e9fa738c","private_key":"202bed44b0e5747d57db0077e83d62aa8814b4a640a338a0b0e200d4231f69dc","name":"node_7dc2a9573f253f362ef1b21bbfcc144b11a6febc58aa3c4430224160e9fa738c","services":["streamer"],"enable_msg_events":true,"port":38091},"up":true}},{"node":{"info":{"id":"045ba8da4641da3f0b8058bb0d9d8aafbb81496dc1cae2a3fd9c039a7e1cafb6","name":"node_045ba8da4641da3f0b8058bb0d9d8aafbb81496dc1cae2a3fd9c039a7e1cafb6","enode":"enode://a8da5558c682d2a891ea880bbed34a14cb1087c5fe6ee20c66210ab1eac9fd69dc13a6fc924f84bb35b5dfb838f499895a1226efd887e3e0ac1e76b92ea358b8@127.0.0.1:0","enr":"0xf88fb840e00bd27f128a7ceab96f9085ff60dba7842de4f23816bc8e957a96a3d4807a3b209f5c0675fe420cd322fe7bcc131344e5aae695d4a6b95c0224634bcf102c0c0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102a8da5558c682d2a891ea880bbed34a14cb1087c5fe6ee20c66210ab1eac9fd69","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"BFuo2kZB2j8LgFi7DZ2Kr7uBSW3ByuKj/ZwDmn4cr7Y=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 045ba8\npopulation: 27 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 c1f9 f773 9890 | 110 ec52 (0) ed2d (0) ef1b (0) ef07 (0)\n001 2 775e 7dc2 | 70 5b63 (0) 58ed (0) 5823 (0) 5f00 (0)\n002 6 3b88 3efc 3ec5 314a | 32 39d1 (0) 3b78 (0) 3b88 (0) 3f94 (0)\n003 4 1672 165f 179f 19fa | 22 13d6 (0) 11d4 (0) 103b (0) 154b (0)\n004 4 0ff2 0fc5 0de3 0c28 | 11 0b72 (0) 0a00 (0) 0af9 (0) 0e5e (0)\n005 4 0328 02d8 0067 00c6 | 5 0067 (0) 00c6 (0) 02d8 (0) 03cc (0)\n006 2 07a8 0661 | 3 0743 (0) 07a8 (0) 0661 (0)\n============ DEPTH: 7 ==========================================\n007 0 | 0\n008 0 | 0\n009 1 0438 | 1 0438 (0)\n010 0 | 0\n011 0 | 0\n012 1 0451 | 1 0451 (0)\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"045ba8da4641da3f0b8058bb0d9d8aafbb81496dc1cae2a3fd9c039a7e1cafb6","private_key":"be4604105acf932a56aeb47b672aa90728f8e2a6b5e4eac4c582dd5646f61358","name":"node_045ba8da4641da3f0b8058bb0d9d8aafbb81496dc1cae2a3fd9c039a7e1cafb6","services":["streamer"],"enable_msg_events":true,"port":37847},"up":true}},{"node":{"info":{"id":"9890e6ebb2c6f9a7bec4c2778e077e3710ce3af356f82ae9b4d324832d159ef7","name":"node_9890e6ebb2c6f9a7bec4c2778e077e3710ce3af356f82ae9b4d324832d159ef7","enode":"enode://9ca38a60e6b0d6f83aca233c9b27c0817b0d3ab7644e05fc12cd158726f9a752b4904052a3ec36b45ed9cd04fa8563b84a94d384ce66831e18f71cd74f9c6951@127.0.0.1:0","enr":"0xf88fb840d0e03834031b00b0b1497f467bf9bca7abd4b7e83a8a6534025d2f58b88220556789b327681ded4921f921cd6711f0f7b181b548c87ffefc722fb53c5fdb7f210183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1039ca38a60e6b0d6f83aca233c9b27c0817b0d3ab7644e05fc12cd158726f9a752","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"mJDm67LG+ae+xMJ3jgd+NxDOOvNW+CrptNMkgy0Vnvc=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 9890e6\npopulation: 28 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 7dc2 775e 045b | 146 5db0 (0) 5cd2 (0) 5f00 (0) 5efb (0)\n001 7 c1f9 e54b e883 fbc8 | 63 ec52 (0) ed2d (0) ef1b (0) ef07 (0)\n002 7 af02 a34e b95d b897 | 27 b626 (0) b65e (0) b7ca (0) b5b2 (0)\n003 3 8505 849b 82dd | 10 898d (0) 886a (0) 88fe (0) 88a1 (0)\n004 5 9076 90a8 959f 976e | 6 959f (0) 976e (0) 96fc (0) 915d (0)\n============ DEPTH: 5 ==========================================\n005 2 9d0f 9fa0 | 2 9d0f (0) 9fa0 (0)\n006 0 | 0\n007 0 | 0\n008 1 9852 | 1 9852 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"9890e6ebb2c6f9a7bec4c2778e077e3710ce3af356f82ae9b4d324832d159ef7","private_key":"91c1cd51e3963ac4ebcb1fe6e859426d29a1872f98d56582b779f77a16d76109","name":"node_9890e6ebb2c6f9a7bec4c2778e077e3710ce3af356f82ae9b4d324832d159ef7","services":["streamer"],"enable_msg_events":true,"port":36407},"up":true}},{"node":{"info":{"id":"775e7be502df8fd938cf9c42ee4fac33e460a4b6992b9efeb8dc1ff7dde5c40f","name":"node_775e7be502df8fd938cf9c42ee4fac33e460a4b6992b9efeb8dc1ff7dde5c40f","enode":"enode://0fbe2eb4516d803819afa51e4a2f9d86b0e2500f1f9c664c51c812be957a1eb071e0ff91c18545685b7c8d58366451323dfd6e919071e515387c9a9be992b424@127.0.0.1:0","enr":"0xf88fb8407865c59fc952191a2f0320a38291d0936783b994a63bb99bcbbc58fadc871a32638de097c22553f495619842efee63e70aa5550fc1bf656088bd1938df45ed5d0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1020fbe2eb4516d803819afa51e4a2f9d86b0e2500f1f9c664c51c812be957a1eb0","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"d1575QLfj9k4z5xC7k+sM+RgpLaZK57+uNwf993lxA8=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 775e7b\npopulation: 29 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 f31c 9890 | 110 ec52 (0) ed2d (0) ef07 (0) ef1b (0)\n001 3 045b 1672 19fa | 76 2f32 (0) 2d36 (0) 2ccf (0) 2c38 (0)\n002 5 534b 524d 4bcf 4c9e | 38 5b63 (0) 58ed (0) 5823 (0) 5f00 (0)\n003 9 6ecb 6ea5 6c4d 6c73 | 20 6831 (0) 6967 (0) 6c73 (0) 6c4d (0)\n004 6 7b90 7920 7e04 7dc2 | 7 7a60 (0) 7b90 (0) 7920 (0) 7e04 (0)\n============ DEPTH: 5 ==========================================\n005 3 7125 7290 738c | 3 7125 (0) 7290 (0) 738c (0)\n006 0 | 0\n007 0 | 0\n008 1 77d2 | 1 77d2 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"775e7be502df8fd938cf9c42ee4fac33e460a4b6992b9efeb8dc1ff7dde5c40f","private_key":"1d0023ab98fa043da972badeee9fd4d8df9514307a8158fdddee5c7ba1df9405","name":"node_775e7be502df8fd938cf9c42ee4fac33e460a4b6992b9efeb8dc1ff7dde5c40f","services":["streamer"],"enable_msg_events":true,"port":38817},"up":true}},{"node":{"info":{"id":"738c2d42458965d03c8f9f055eaf0e3edf3dfa2a4de0a048ec05b78e7b765c90","name":"node_738c2d42458965d03c8f9f055eaf0e3edf3dfa2a4de0a048ec05b78e7b765c90","enode":"enode://cda9d251eca9ce01ba41a3c17fa3b1f665bd822176bb5e8713e9865c8aa07e087f75d33c65c897484f96471c8877a32f746463e4fb55a0bb3d2ec550abbf66d8@127.0.0.1:0","enr":"0xf88fb8406c67c864c9f890ffca30545b73befcd0c86f9fd8ad5e355d00b6a3c631ebdab07b4d54f271fd817f63f621d48593488c298ce9abf52c8ecdc08d65dbf149c5070183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102cda9d251eca9ce01ba41a3c17fa3b1f665bd822176bb5e8713e9865c8aa07e08","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"c4wtQkWJZdA8j58FXq8OPt89+ipN4KBI7AW3jnt2XJA=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 738c2d\npopulation: 34 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 af02 b897 849b c1f9 | 110 915d (0) 90a8 (0) 9076 (0) 959f (0)\n001 3 21a0 1672 19fa | 76 2f32 (0) 2d36 (0) 2ccf (0) 2c38 (0)\n002 6 524d 44a1 4559 4bcf | 38 4109 (0) 41d9 (0) 47bf (0) 4782 (0)\n003 9 6c73 6c4d 6ea5 6831 | 20 6831 (0) 6967 (0) 6c73 (0) 6c4d (0)\n004 6 7920 7b90 7e04 7dbb | 7 7a60 (0) 7b90 (0) 7920 (0) 7e04 (0)\n005 2 77d2 775e | 2 77d2 (0) 775e (0)\n============ DEPTH: 6 ==========================================\n006 1 7125 | 1 7125 (0)\n007 1 7290 | 1 7290 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"738c2d42458965d03c8f9f055eaf0e3edf3dfa2a4de0a048ec05b78e7b765c90","private_key":"728881169692d835251307412b70e5bf5bab2e025d4075c0571eb4575cd8fa0a","name":"node_738c2d42458965d03c8f9f055eaf0e3edf3dfa2a4de0a048ec05b78e7b765c90","services":["streamer"],"enable_msg_events":true,"port":44907},"up":true}},{"node":{"info":{"id":"e7fa7112adc7b023dd5965e620277122542153f87eaf5deeacc8a51f1778ba77","name":"node_e7fa7112adc7b023dd5965e620277122542153f87eaf5deeacc8a51f1778ba77","enode":"enode://f4feccd03c0ab9c061130b9bc469d72e44850b40c65c1dfca65ebd585d1ff154419ac9cae4b7253273128994742c14550d13d278cddc876adbe481e1a8acc07d@127.0.0.1:0","enr":"0xf88fb840c5269e2a1ffb34a29af3d3688ea0843b35546e0313938addaccbde1f97c82c823c987f0b038109c00a1a3552cef7c3dcdd95180fbe5ed39821c257e0a378f34d0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103f4feccd03c0ab9c061130b9bc469d72e44850b40c65c1dfca65ebd585d1ff154","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"5/pxEq3HsCPdWWXmICdxIlQhU/h+r13urMilHxd4unc=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: e7fa71\npopulation: 31 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 3efc 19fa 67dc 738c | 146 2d36 (0) 2ccf (0) 2c38 (0) 2c79 (0)\n001 4 849b b897 b95d af02 | 47 915d (0) 90a8 (0) 9076 (0) 959f (0)\n002 6 db6a daec d299 d1d7 | 26 df1e (0) d887 (0) d863 (0) db6a (0)\n003 3 f31c f528 f45f | 19 ff36 (0) fe31 (0) fe21 (0) f925 (0)\n004 7 eb98 e854 e8ef e883 | 10 eb98 (0) e854 (0) e8ef (0) e883 (0)\n005 1 e027 | 1 e027 (0)\n============ DEPTH: 6 ==========================================\n006 5 e5d7 e5ad e514 e547 | 5 e5d7 (0) e5ad (0) e514 (0) e547 (0)\n007 0 | 0\n008 1 e775 | 1 e775 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"e7fa7112adc7b023dd5965e620277122542153f87eaf5deeacc8a51f1778ba77","private_key":"3698971ede47de5ef29ce2ab0eb433184d7570578147e4189713e90a2cfc37a6","name":"node_e7fa7112adc7b023dd5965e620277122542153f87eaf5deeacc8a51f1778ba77","services":["streamer"],"enable_msg_events":true,"port":44579},"up":true}},{"node":{"info":{"id":"f45f1f2e59e947e04fa15bcf87f872ef6d73b73f778e12d1f9b8930ea166eefc","name":"node_f45f1f2e59e947e04fa15bcf87f872ef6d73b73f778e12d1f9b8930ea166eefc","enode":"enode://dbf1445ea421e785c6e095596b2a52a7179cd19f387200d9c0e855c53419fefcee80384b81636c5d042ef9bbebaaa11d1b32df623a942e01ab10692f3db30324@127.0.0.1:0","enr":"0xf88fb840946cc04d7fc58d61080fd4bb13dd8e38ec6b5e85d92296892845774c4a0a3b496587cd1807eda5a924c4eb9a6d9377f0ff6c65b98f0d35e0b8cebeb91c0c49350183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102dbf1445ea421e785c6e095596b2a52a7179cd19f387200d9c0e855c53419fefc","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"9F8fLlnpR+BPoVvPh/hy721ztz93jhLR+biTDqFm7vw=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: f45f1f\npopulation: 40 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 7 7dc2 738c 67dc 3ec5 | 146 4109 (0) 41d9 (0) 46fe (0) 461c (0)\n001 10 82dd 849b 96fc 9fa0 | 47 915d (0) 90a8 (0) 9076 (0) 959f (0)\n002 5 daec d1d7 d299 c620 | 26 df1e (0) d863 (0) d887 (0) db6a (0)\n003 5 ee5e eb98 e027 e775 | 18 eb98 (0) e854 (0) e8ef (0) e883 (0)\n004 4 fe21 fbf5 fbc8 f925 | 6 ff36 (0) fe31 (0) fe21 (0) f925 (0)\n005 2 f31c f27f | 3 f2d5 (0) f27f (0) f31c (0)\n006 2 f7ba f773 | 4 f629 (0) f7fa (0) f7ba (0) f773 (0)\n007 3 f528 f5dc f5b2 | 3 f528 (0) f5b2 (0) f5dc (0)\n============ DEPTH: 8 ==========================================\n008 1 f4e0 | 1 f4e0 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 1 f456 | 1 f456 (0)\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"f45f1f2e59e947e04fa15bcf87f872ef6d73b73f778e12d1f9b8930ea166eefc","private_key":"dbee637d6a6f6facfb47a418c9c1b36a97b04592930833d23aba31c3ca7d5c3d","name":"node_f45f1f2e59e947e04fa15bcf87f872ef6d73b73f778e12d1f9b8930ea166eefc","services":["streamer"],"enable_msg_events":true,"port":34023},"up":true}},{"node":{"info":{"id":"19faaf891eb6a716902ec29d201dc2094ee474acff188ae86faf9760674b2d37","name":"node_19faaf891eb6a716902ec29d201dc2094ee474acff188ae86faf9760674b2d37","enode":"enode://f6f1250fa9e6af3e6fd9195d9f8f7c0608e1afc6f538eecc930b507ee1225cac227a89b3bf1012473ba75ab38aa7a4147f2696b9f562aeda5bdd0ad29550f285@127.0.0.1:0","enr":"0xf88fb840d2cc7d831dfc47bb778b496762213f2d10d8f52b0403aff469b5adf2362312877560ab18951eae9326f58eeba05ce563d4e39a48953e8184de4f0f55d4447d260183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103f6f1250fa9e6af3e6fd9195d9f8f7c0608e1afc6f538eecc930b507ee1225cac","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"GfqviR62pxaQLsKdIB3CCU7kdKz/GIrob6+XYGdLLTc=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 19faaf\npopulation: 31 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 e7fa f45f | 110 959f (0) 976e (0) 96fc (0) 915d (0)\n001 4 524d 775e 738c 67dc | 70 4109 (0) 41d9 (0) 47bf (0) 4782 (0)\n002 5 2abb 21a0 314a 3ec5 | 32 2d36 (0) 2ccf (0) 2c38 (0) 2c79 (0)\n003 4 0c28 0328 0661 045b | 22 0b72 (0) 0a00 (0) 0af9 (0) 0fc5 (0)\n004 10 11d4 103b 13d6 154b | 12 13d6 (0) 11d4 (0) 103b (0) 154b (0)\n005 3 1f85 1c8a 1c9c | 6 1e2a (0) 1f67 (0) 1f85 (0) 1c47 (0)\n============ DEPTH: 6 ==========================================\n006 2 1a2a 1b83 | 2 1a2a (0) 1b83 (0)\n007 1 18f6 | 1 18f6 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"19faaf891eb6a716902ec29d201dc2094ee474acff188ae86faf9760674b2d37","private_key":"05c69a8793e77331075909934a1e61ac9f380584e32a35ecc8f42887d20cb77a","name":"node_19faaf891eb6a716902ec29d201dc2094ee474acff188ae86faf9760674b2d37","services":["streamer"],"enable_msg_events":true,"port":35641},"up":true}},{"node":{"info":{"id":"67dcfd21ece30b41a39bc55c0986fca8f401bb3acba821969519f09d0933e8bd","name":"node_67dcfd21ece30b41a39bc55c0986fca8f401bb3acba821969519f09d0933e8bd","enode":"enode://0f351aaf6a4b09eb918bb712e8a79718d083d4214c2406c36f0074d8ad70802689f53f164b38cb9e83e59edb887df1b27e57e48214a7070b32cdc903da0cfd38@127.0.0.1:0","enr":"0xf88fb8404bcca6e121f7562863b5b6ac375f6e953cdb6ab0c36f265ef3366ba7eefdf7ef01ad1990f3c942767f70f2e5d5887ffccb367ad0e344b78133814537196687920183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1020f351aaf6a4b09eb918bb712e8a79718d083d4214c2406c36f0074d8ad708026","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"Z9z9IezjC0Gjm8VcCYb8qPQBuzrLqCGWlRnwnQkz6L0=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 67dcfd\npopulation: 31 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 e7fa f45f af02 | 110 915d (0) 90a8 (0) 9076 (0) 959f (0)\n001 3 21a0 0328 19fa | 76 2d36 (0) 2ccf (0) 2c38 (0) 2c79 (0)\n002 5 524d 44a1 4bcf 4d6b | 38 4109 (0) 41d9 (0) 47bf (0) 4782 (0)\n003 7 7920 7e04 7dbb 7dc2 | 12 7a60 (0) 7b90 (0) 7920 (0) 7e04 (0)\n004 6 6c73 6c4d 6e68 6ea5 | 11 6831 (0) 6967 (0) 6c73 (0) 6c4d (0)\n005 5 6103 605a 6337 628e | 6 6103 (0) 60d7 (0) 605a (0) 6337 (0)\n============ DEPTH: 6 ==========================================\n006 0 | 0\n007 1 66e7 | 1 66e7 (0)\n008 0 | 0\n009 1 67aa | 1 67aa (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"67dcfd21ece30b41a39bc55c0986fca8f401bb3acba821969519f09d0933e8bd","private_key":"9f85db9ae6c9cd4db65d7ccb16a9d89efce6ec7d02aac8d35721d5a94ef55f76","name":"node_67dcfd21ece30b41a39bc55c0986fca8f401bb3acba821969519f09d0933e8bd","services":["streamer"],"enable_msg_events":true,"port":45525},"up":true}},{"node":{"info":{"id":"af02b5d107b3a17f539c7f9020ebe74322434634e70c420a7f56776eb5d9db73","name":"node_af02b5d107b3a17f539c7f9020ebe74322434634e70c420a7f56776eb5d9db73","enode":"enode://6b4c01daeddfe0f12d5f3bf6f1e60b261982605a1312d4ddacaa9f6a761f8d4da61c42c09410ac2eff9ab2f5b4a650fc3b92480df5822f85f07f632bc7ee2fd2@127.0.0.1:0","enr":"0xf88fb840c68f36e51ad8efcb6e966d5d8b2a31e1b13e6da82559ded1950420552c3f7c4770459222d11e203f7a841ae5148f9d021adbd26d94a04210def38224db50977c0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1026b4c01daeddfe0f12d5f3bf6f1e60b261982605a1312d4ddacaa9f6a761f8d4d","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"rwK10QezoX9TnH+QIOvnQyJDRjTnDEIKf1Z3brXZ23M=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: af02b5\npopulation: 38 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 9 0c28 21a0 2abb 314a | 146 2d36 (0) 2ccf (0) 2c38 (0) 2c79 (0)\n001 6 c1f9 f31c f45f f773 | 63 df1e (0) d887 (0) d863 (0) db6a (0)\n002 8 96fc 9076 9fa0 9890 | 20 959f (0) 976e (0) 96fc (0) 915d (0)\n003 6 b502 b2a5 b2b5 b897 | 17 b7ca (0) b626 (0) b65e (0) b5b2 (0)\n004 5 a369 a34e a46d a653 | 5 a369 (0) a34e (0) a46d (0) a653 (0)\n============ DEPTH: 5 ==========================================\n005 0 | 0\n006 2 ac4d ad98 | 2 ac4d (0) ad98 (0)\n007 2 ae2b aeb4 | 2 ae2b (0) aeb4 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"af02b5d107b3a17f539c7f9020ebe74322434634e70c420a7f56776eb5d9db73","private_key":"272d73cf1639238294e76d97933c731ba4d307d8b4551361e31c99a5548b352c","name":"node_af02b5d107b3a17f539c7f9020ebe74322434634e70c420a7f56776eb5d9db73","services":["streamer"],"enable_msg_events":true,"port":34209},"up":true}},{"node":{"info":{"id":"6251e9540448726a601699ef4cd19e50c969a746da27228967338cdc09d628bf","name":"node_6251e9540448726a601699ef4cd19e50c969a746da27228967338cdc09d628bf","enode":"enode://aacecc9f59aaf5f89dccbc0f54658dc28b0c01036b15e949465c69469611f86d685911890629199edbcc30c5f8c9de080fa95cdfc4bd9e4ba48ca6572b425efc@127.0.0.1:0","enr":"0xf88fb840466f1c17c93f63d6256f50ab183789dcb5f940f2f5965173b02e3411c452bf525d835c457a1e62bbb60313212f47c91f20e1042e0ec85130d9872724cd47b7890183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102aacecc9f59aaf5f89dccbc0f54658dc28b0c01036b15e949465c69469611f86d","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"YlHpVARIcmpgFpnvTNGeUMlpp0baJyKJZzOM3AnWKL8=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 6251e9\npopulation: 32 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 ee5e daec d1d7 c1f9 | 110 df1e (0) d863 (0) d887 (0) db6a (0)\n001 3 0328 21a0 3efc | 76 1e2a (0) 1f67 (0) 1f85 (0) 1c47 (0)\n002 3 44a1 4c9e 524d | 38 4109 (0) 41d9 (0) 47bf (0) 4782 (0)\n003 7 7920 7dc2 7dbb 7e04 | 12 7a60 (0) 7b90 (0) 7920 (0) 7e04 (0)\n004 6 6f2d 6e68 6c73 6c4d | 11 6831 (0) 6967 (0) 6c73 (0) 6c4d (0)\n005 3 66e7 67aa 67dc | 3 66e7 (0) 67aa (0) 67dc (0)\n006 3 6103 60d7 605a | 3 6103 (0) 60d7 (0) 605a (0)\n============ DEPTH: 7 ==========================================\n007 1 6337 | 1 6337 (0)\n008 1 628e | 1 628e (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"6251e9540448726a601699ef4cd19e50c969a746da27228967338cdc09d628bf","private_key":"60256936fed4be723c1215b22d031aac3b557568a1f9ad98436a946002f6ceb1","name":"node_6251e9540448726a601699ef4cd19e50c969a746da27228967338cdc09d628bf","services":["streamer"],"enable_msg_events":true,"port":42317},"up":true}},{"node":{"info":{"id":"3efc4b120b3eeeac186bf3a4cd42eb8c647f7edb08c23ee643e2bec9d72c5bed","name":"node_3efc4b120b3eeeac186bf3a4cd42eb8c647f7edb08c23ee643e2bec9d72c5bed","enode":"enode://c250393ff34081bb09b6ee97df2aa2fe93d7335b4623376a0ede17dd046719e32496e4a67a7e160efda5985e2d384b75b04416aaa0b99627c1fc87ba118e3033@127.0.0.1:0","enr":"0xf88fb840696ee67e59754db968f1147865e6fefc0faf7d85b54e7bcefbfa391263921be65b031de9a59d4b9285fea97cbdbdbfe81217ed0070911cf050644c3c4d0b2d590183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103c250393ff34081bb09b6ee97df2aa2fe93d7335b4623376a0ede17dd046719e3","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"PvxLEgs+7qwYa/OkzULrjGR/ftsIwj7mQ+K+ydcsW+0=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 3efc4b\npopulation: 26 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 e7fa f45f 849b af02 | 110 df1e (0) d887 (0) d863 (0) db6a (0)\n001 4 4c9e 524d 6ea5 6251 | 70 4109 (0) 41d9 (0) 46fe (0) 4646 (0)\n002 4 1c8a 19fa 045b 0c28 | 44 1e2a (0) 1f67 (0) 1f85 (0) 1c47 (0)\n003 5 21a0 256e 24b8 2f32 | 15 2d36 (0) 2ccf (0) 2c38 (0) 2c79 (0)\n004 4 314a 33b5 3780 378e | 10 35e6 (0) 3630 (0) 3780 (0) 378e (0)\n005 2 3b78 3b88 | 3 39d1 (0) 3b78 (0) 3b88 (0)\n============ DEPTH: 6 ==========================================\n006 0 | 0\n007 1 3f94 | 1 3f94 (0)\n008 0 | 0\n009 1 3e8e | 1 3e8e (0)\n010 1 3ec5 | 1 3ec5 (0)\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"3efc4b120b3eeeac186bf3a4cd42eb8c647f7edb08c23ee643e2bec9d72c5bed","private_key":"c5e74524cfda7833835e2f15a5bdb1a551e63bf87e2ba94faf778776acaa422e","name":"node_3efc4b120b3eeeac186bf3a4cd42eb8c647f7edb08c23ee643e2bec9d72c5bed","services":["streamer"],"enable_msg_events":true,"port":44145},"up":true}},{"node":{"info":{"id":"6ea51fb6e4783f351dbbfa47b508c78c73233ebaada409dfb55446217f92c4bd","name":"node_6ea51fb6e4783f351dbbfa47b508c78c73233ebaada409dfb55446217f92c4bd","enode":"enode://f87232a3077f74f8aadead28608baee93a2b0f196b7b40dbba13f3f3b68381bbe474b527aba8bf8df37c35ec861c9ca430a6fb1fd568aaf8ecc439e4638888bd@127.0.0.1:0","enr":"0xf88fb840e62f5938f4645beb16ccd0ff2cda19b29599be7deb95ca52b1e6c0cfe5c5d94742d1407950829383b339174f1b9927df3bda8368d7ac143d0fbc8e1e15290dd90183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103f87232a3077f74f8aadead28608baee93a2b0f196b7b40dbba13f3f3b68381bb","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"bqUftuR4PzUdu/pHtQjHjHMjPrqtpAnftVRGIX+SxL0=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 6ea51f\npopulation: 31 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 af02 b95d b897 | 110 df1e (0) d863 (0) d887 (0) da67 (0)\n001 3 0c28 21a0 3efc | 76 1e2a (0) 1f67 (0) 1f85 (0) 1c47 (0)\n002 5 524d 44a1 4bcf 4d6b | 38 4109 (0) 41d9 (0) 47bf (0) 4782 (0)\n003 6 775e 738c 7920 7dbb | 12 7a60 (0) 7b90 (0) 7920 (0) 7dbb (0)\n004 4 60d7 66e7 67aa 67dc | 9 66e7 (0) 67aa (0) 67dc (0) 6103 (0)\n005 2 6831 6967 | 2 6831 (0) 6967 (0)\n006 2 6c73 6c4d | 2 6c73 (0) 6c4d (0)\n007 3 6fe9 6f5f 6f2d | 3 6fe9 (0) 6f5f (0) 6f2d (0)\n============ DEPTH: 8 ==========================================\n008 2 6e05 6e68 | 2 6e05 (0) 6e68 (0)\n009 1 6ecb | 1 6ecb (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"6ea51fb6e4783f351dbbfa47b508c78c73233ebaada409dfb55446217f92c4bd","private_key":"ed77945ec41ca5949c86e0e85e2dcc36e3334a85b705187ec4227bcdb3122ea8","name":"node_6ea51fb6e4783f351dbbfa47b508c78c73233ebaada409dfb55446217f92c4bd","services":["streamer"],"enable_msg_events":true,"port":46181},"up":true}},{"node":{"info":{"id":"0c28cd1315890629896d0fe5517524d4eb788f7444709c135ea690ba4e6103d5","name":"node_0c28cd1315890629896d0fe5517524d4eb788f7444709c135ea690ba4e6103d5","enode":"enode://bec2d78f8d965930c57e3156c95b56aedc58439ffffea7b36857dcdfe54089c9cee8b61b907fcca85cbea54e1ccafd63b48eefd700e841fe21da9ea70d00c9a3@127.0.0.1:0","enr":"0xf88fb8407399470e3737fa8272666e8fbd34bdca814621e3e955369900b266e29c0fa58744c674080c49ca4e6b59676ee2486cb144a30a95904959d8b5878edb805a4faa0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103bec2d78f8d965930c57e3156c95b56aedc58439ffffea7b36857dcdfe54089c9","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"DCjNExWJBimJbQ/lUXUk1Ot4j3REcJwTXqaQuk5hA9U=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 0c28cd\npopulation: 37 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 ee5e f45f af02 b95d | 110 df1e (0) d863 (0) d887 (0) da67 (0)\n001 5 4c9e 44a1 524d 6967 | 70 4109 (0) 41d9 (0) 46fe (0) 4646 (0)\n002 7 21a0 256e 2abb 378e | 32 2d36 (0) 2ccf (0) 2c38 (0) 2c79 (0)\n003 6 1436 179f 1672 1f85 | 22 1e2a (0) 1f67 (0) 1f85 (0) 1c47 (0)\n004 5 0328 00c6 0661 07a8 | 11 0067 (0) 00c6 (0) 02d8 (0) 03cc (0)\n005 2 0a00 0af9 | 3 0b72 (0) 0a00 (0) 0af9 (0)\n006 2 0ff2 0fc5 | 3 0e5e (0) 0ff2 (0) 0fc5 (0)\n007 2 0d8a 0de3 | 2 0d8a (0) 0de3 (0)\n============ DEPTH: 8 ==========================================\n008 1 0cf5 | 1 0cf5 (0)\n009 1 0c64 | 1 0c64 (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"0c28cd1315890629896d0fe5517524d4eb788f7444709c135ea690ba4e6103d5","private_key":"e4f96de1ae6c788aee624501af093f341f540fac893f97ced8d5f1189c24c67f","name":"node_0c28cd1315890629896d0fe5517524d4eb788f7444709c135ea690ba4e6103d5","services":["streamer"],"enable_msg_events":true,"port":36203},"up":true}},{"node":{"info":{"id":"6967e7438125c2045d575eb9f407b4a38d1bf9dcd1c1c1a97f750da6a21aeff7","name":"node_6967e7438125c2045d575eb9f407b4a38d1bf9dcd1c1c1a97f750da6a21aeff7","enode":"enode://e505e79cdb3fcf2ca7c4f9dd26a2c8fe2b7f6ae9b788f6a904eaf8fbc4160d011c02333c5127215f980fba718d4b3a285c2e88a4fb44a15d266a91377d3b48e5@127.0.0.1:0","enr":"0xf88fb840d716acddd75f7eb58dd24dbcafe9a68ab943a8c16e6bd0e8c2895345b80d0a91716890cb91bd5d41bcaa60a862cb05a82b25fd626cda6d8930c48fb6619437e90183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103e505e79cdb3fcf2ca7c4f9dd26a2c8fe2b7f6ae9b788f6a904eaf8fbc4160d01","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"aWfnQ4ElwgRdV1659Ae0o40b+dzRwcGpf3UNpqIa7/c=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 6967e7\npopulation: 29 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 ee5e 849b | 110 df1e (0) d863 (0) d887 (0) db6a (0)\n001 5 3b88 314a 21a0 2abb | 76 2d36 (0) 2ccf (0) 2c38 (0) 2c79 (0)\n002 2 4c9e 524d | 38 4109 (0) 41d9 (0) 47bf (0) 4782 (0)\n003 5 7dc2 7e04 77d2 775e | 12 7a60 (0) 7b90 (0) 7920 (0) 7dbb (0)\n004 5 66e7 67aa 67dc 628e | 9 66e7 (0) 67aa (0) 67dc (0) 6103 (0)\n============ DEPTH: 5 ==========================================\n005 9 6c73 6c4d 6fe9 6f5f | 9 6c73 (0) 6c4d (0) 6fe9 (0) 6f5f (0)\n006 0 | 0\n007 1 6831 | 1 6831 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"6967e7438125c2045d575eb9f407b4a38d1bf9dcd1c1c1a97f750da6a21aeff7","private_key":"b2e4ecb1d88acc51fd5c7268060e5bc618f3e72b5b7c52f4e455216d80962dc0","name":"node_6967e7438125c2045d575eb9f407b4a38d1bf9dcd1c1c1a97f750da6a21aeff7","services":["streamer"],"enable_msg_events":true,"port":35593},"up":true}},{"node":{"info":{"id":"849bcbb9be43b799fefc5e689efc75125da27f536e97e5b7921031520ae6e5d8","name":"node_849bcbb9be43b799fefc5e689efc75125da27f536e97e5b7921031520ae6e5d8","enode":"enode://b0afa8b09566cfd0a41f4197f7997a219c84adac6259015ce3698a009fb6abf8d1cdbe5450429b7e05c28a0d49b2b9f8f2bdd7335fc98e834b8bb0628eae7fc7@127.0.0.1:0","enr":"0xf88fb840393a953e4ec2059acf7f9d3275f18559d6680009999862bd154f9fd1ee1f999d45494fe71181ffbc753878d558571d57d1b697d91b82b240075a2dcd39fefbfb0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103b0afa8b09566cfd0a41f4197f7997a219c84adac6259015ce3698a009fb6abf8","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"hJvLub5Dt5n+/F5onvx1El2if1Nul+W3khAxUgrm5dg=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 849bcb\npopulation: 37 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 10 0c28 3b88 3ec5 3efc | 146 1e2a (0) 1f67 (0) 1f85 (0) 1c47 (0)\n001 7 c1f9 f31c f773 f45f | 63 df1e (0) d887 (0) d863 (0) da67 (0)\n002 6 a6fb af02 b502 b2b5 | 27 a369 (0) a34e (0) a46d (0) a653 (0)\n003 6 9fa0 9852 9890 9076 | 10 915d (0) 90a8 (0) 9076 (0) 959f (0)\n004 4 8f21 898d 88a1 88fe | 5 8f21 (0) 898d (0) 886a (0) 88a1 (0)\n============ DEPTH: 5 ==========================================\n005 3 8025 82f9 82dd | 3 8025 (0) 82f9 (0) 82dd (0)\n006 0 | 0\n007 1 8505 | 1 8505 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"849bcbb9be43b799fefc5e689efc75125da27f536e97e5b7921031520ae6e5d8","private_key":"a069eed892fd44938d06d266a1b6e95863c80eac1fa44fccaeebc41efc5ed441","name":"node_849bcbb9be43b799fefc5e689efc75125da27f536e97e5b7921031520ae6e5d8","services":["streamer"],"enable_msg_events":true,"port":41647},"up":true}},{"node":{"info":{"id":"b89793c3ccd9ea642080728732ce7df33778653fed3d1d8f3a25e60670e33325","name":"node_b89793c3ccd9ea642080728732ce7df33778653fed3d1d8f3a25e60670e33325","enode":"enode://616dc404ad737ba64ed652df2d9b1eb7fbc7d27072123ffacbd5768b7b3a2808cc1ea3f7273bc1a8e881a0ed5cf764d793fc0ee1fda9a62a2e5219a90f7b97e4@127.0.0.1:0","enr":"0xf88fb8403b649d56e05ba7d5845e7dc235d0b38a8817441e5e2a7dae66c6959b44f3331a4718237e4751e5b45041e65998db19f244b263394f454f246db8d863a0b2f9a80183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102616dc404ad737ba64ed652df2d9b1eb7fbc7d27072123ffacbd5768b7b3a2808","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"uJeTw8zZ6mQggHKHMs598zd4ZT/tPR2POiXmBnDjMyU=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: b89793\npopulation: 34 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 8 7e04 738c 6ea5 44a1 | 146 77d2 (0) 775e (0) 7125 (0) 7290 (0)\n001 5 f45f f5dc e7fa efea | 63 df1e (0) d863 (0) d887 (0) da67 (0)\n002 5 96fc 9076 9890 9fa0 | 20 915d (0) 90a8 (0) 9076 (0) 959f (0)\n003 4 af02 a6fb a369 a34e | 10 ac4d (0) ad98 (0) aeb4 (0) ae2b (0)\n004 4 b502 b02b b2a5 b2b5 | 8 b65e (0) b626 (0) b7ca (0) b5b2 (0)\n005 1 bcc6 | 1 bcc6 (0)\n006 4 badd baf2 ba88 bb90 | 4 baf2 (0) badd (0) ba88 (0) bb90 (0)\n============ DEPTH: 7 ==========================================\n007 2 b911 b95d | 2 b911 (0) b95d (0)\n008 1 b820 | 1 b820 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"b89793c3ccd9ea642080728732ce7df33778653fed3d1d8f3a25e60670e33325","private_key":"0bc50a7b766d6bc874ba369321f3b4a7f46e967445811ba2511e2698ca848d6f","name":"node_b89793c3ccd9ea642080728732ce7df33778653fed3d1d8f3a25e60670e33325","services":["streamer"],"enable_msg_events":true,"port":37439},"up":true}},{"node":{"info":{"id":"3ec530761ddb87f930fda919be67df18074c6f0795292add1b2a91ff3d9c39e3","name":"node_3ec530761ddb87f930fda919be67df18074c6f0795292add1b2a91ff3d9c39e3","enode":"enode://21eeb4f1bb6f01a16243e4a426ed7cc92b6fbc6f8004c7bd662db3891b43f68ff5952440f106b72cac72fb55e0d2e9efa1696011cd33351094dc6c2e13fa3a67@127.0.0.1:0","enr":"0xf88fb840be1d0ed9539666492df4644d2aed2cad4aa9462d5e4bea665e163639db67f4da335d828dd4a5e24ed611a8d48ce089696a907d9a7f47829e9c5413c90360eeec0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10321eeb4f1bb6f01a16243e4a426ed7cc92b6fbc6f8004c7bd662db3891b43f68f","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"PsUwdh3bh/kw/akZvmffGAdMbweVKSrdGyqR/z2cOeM=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 3ec530\npopulation: 30 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 7 ee5e ed2d f773 f5dc | 110 df1e (0) d863 (0) d887 (0) da67 (0)\n001 2 4c9e 524d | 70 77d2 (0) 775e (0) 7125 (0) 7290 (0)\n002 7 1436 17db 19fa 0328 | 44 1e2a (0) 1f67 (0) 1f85 (0) 1c47 (0)\n003 5 21a0 24b8 256e 2f32 | 15 2d36 (0) 2ccf (0) 2c38 (0) 2c79 (0)\n004 4 378e 33b5 30be 314a | 10 35e6 (0) 3630 (0) 3780 (0) 378e (0)\n005 2 3b78 3b88 | 3 39d1 (0) 3b78 (0) 3b88 (0)\n============ DEPTH: 6 ==========================================\n006 0 | 0\n007 1 3f94 | 1 3f94 (0)\n008 0 | 0\n009 1 3e8e | 1 3e8e (0)\n010 1 3efc | 1 3efc (0)\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"3ec530761ddb87f930fda919be67df18074c6f0795292add1b2a91ff3d9c39e3","private_key":"c4b8862c8a0e3546078dca8083dcf8de77697d5dc9c4287a249fe5593f2ca90d","name":"node_3ec530761ddb87f930fda919be67df18074c6f0795292add1b2a91ff3d9c39e3","services":["streamer"],"enable_msg_events":true,"port":37999},"up":true}},{"node":{"info":{"id":"524db81b135af8dc309b942c082a7291dddb851866fc608753f937ee77015be0","name":"node_524db81b135af8dc309b942c082a7291dddb851866fc608753f937ee77015be0","enode":"enode://99f219a31926c42a84a19fd9aea063ef2ccb9f87f3f3ce40a8f04c86844559a054cd3b92341e71f2c349582310c55ba9d086a6f5c3306860778bedbb03528ec0@127.0.0.1:0","enr":"0xf88fb8402ab8e87c3dbe9a6ec2cac6b5b115117c51c3fa4a47a0cdb6eb173d6c313304c33d04648bd348128c2a2214fc92458c6056d91e66d8698ef94c65f0eecbe6c2320183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10299f219a31926c42a84a19fd9aea063ef2ccb9f87f3f3ce40a8f04c86844559a0","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"Uk24GxNa+Nwwm5QsCCpykd3bhRhm/GCHU/k37ncBW+A=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 524db8\npopulation: 36 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 ee5e b897 b95d | 110 df1e (0) d863 (0) d887 (0) da67 (0)\n001 5 19fa 0c28 3b88 3efc | 76 13d6 (0) 11d4 (0) 103b (0) 154b (0)\n002 15 7920 7dbb 7dc2 7e04 | 32 77d2 (0) 775e (0) 7125 (0) 7290 (0)\n003 4 4636 44a1 4559 4c9e | 23 4109 (0) 41d9 (0) 47bf (0) 4782 (0)\n004 2 5823 5cd2 | 7 5b63 (0) 58ed (0) 5823 (0) 5f00 (0)\n005 1 574f | 1 574f (0)\n006 2 51db 512e | 2 51db (0) 512e (0)\n============ DEPTH: 7 ==========================================\n007 4 53a8 53fe 5308 534b | 4 53a8 (0) 53fe (0) 5308 (0) 534b (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"524db81b135af8dc309b942c082a7291dddb851866fc608753f937ee77015be0","private_key":"2f5862456985e522a96e35955f2236ea2996dbc1ae46e4cd98b90a43a097da88","name":"node_524db81b135af8dc309b942c082a7291dddb851866fc608753f937ee77015be0","services":["streamer"],"enable_msg_events":true,"port":36823},"up":true}},{"node":{"info":{"id":"b95d88ff6512ef8eaaa6bd842fa44175c1484fc2e8601b83d50a5ffa992bfa3a","name":"node_b95d88ff6512ef8eaaa6bd842fa44175c1484fc2e8601b83d50a5ffa992bfa3a","enode":"enode://36447aeebafb12ba1c78c6a46a110934e1cd8927ed11dface43f85436177abde695118ad9a8539534b4f4141d990d917f905f7ecaa18baaebc0916b0205c8e2e@127.0.0.1:0","enr":"0xf88fb84085f456734d0dc37f56567ca4283aaf0355c1fa8925ff4c21ea20d7528816d28d2f74360586c27977522735076e9fd0f4e0c89ff5e78369ea4fefb33a06c132730183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10236447aeebafb12ba1c78c6a46a110934e1cd8927ed11dface43f85436177abde","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"uV2I/2US746qpr2EL6RBdcFIT8LoYBuD1Qpf+pkr+jo=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: b95d88\npopulation: 33 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 7 3b88 0c28 7e04 6ea5 | 146 103b (0) 11d4 (0) 13d6 (0) 154b (0)\n001 8 c1f9 ee5e ed2d e7fa | 63 df1e (0) d887 (0) d863 (0) db6a (0)\n002 4 9890 9fa0 96fc 849b | 20 915d (0) 90a8 (0) 9076 (0) 959f (0)\n003 3 af02 a34e a6fb | 10 ac4d (0) ad98 (0) ae2b (0) aeb4 (0)\n004 4 b2b5 b2a5 b626 b502 | 8 b7ca (0) b65e (0) b626 (0) b5b2 (0)\n005 1 bcc6 | 1 bcc6 (0)\n006 3 badd baf2 bb90 | 4 ba88 (0) badd (0) baf2 (0) bb90 (0)\n============ DEPTH: 7 ==========================================\n007 2 b820 b897 | 2 b820 (0) b897 (0)\n008 0 | 0\n009 1 b911 | 1 b911 (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"b95d88ff6512ef8eaaa6bd842fa44175c1484fc2e8601b83d50a5ffa992bfa3a","private_key":"7dd97b58fb51f901cffaf8552811e55ed1f745fbc8de989e59715731046e1c58","name":"node_b95d88ff6512ef8eaaa6bd842fa44175c1484fc2e8601b83d50a5ffa992bfa3a","services":["streamer"],"enable_msg_events":true,"port":40425},"up":true}},{"node":{"info":{"id":"4c9eab8ab45405a6d4bab46430efc04b8e6aec1d944f88435eca41361925f379","name":"node_4c9eab8ab45405a6d4bab46430efc04b8e6aec1d944f88435eca41361925f379","enode":"enode://403136530469a350901a30c33fc7c809363b53c13ca95dcd6a7080ec55a3b2fcbbd3f07db1278c257db628914b8b98ebfe5410a5359cd0b5c72fcdeb559100cf@127.0.0.1:0","enr":"0xf88fb8409ef5c3e51708bd096ce7dcdf5540f7e5db79918330956f05073be4da985467075fbed23d2dba3eeb49140ac47e83bf6d93b7353a47dd6d7fd4df928eb9dc79200183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103403136530469a350901a30c33fc7c809363b53c13ca95dcd6a7080ec55a3b2fc","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"TJ6rirRUBabUurRkMO/AS45q7B2UT4hDXspBNhkl83k=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 4c9eab\npopulation: 35 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 ee5e 849b b95d | 110 cc20 (0) c9f5 (0) c832 (0) c898 (0)\n001 4 0c28 3efc 3ec5 3b88 | 76 103b (0) 11d4 (0) 13d6 (0) 154b (0)\n002 10 7dc2 7e04 738c 775e | 32 77d2 (0) 775e (0) 7125 (0) 7290 (0)\n003 5 5823 574f 534b 53fe | 15 5db0 (0) 5cd2 (0) 5f00 (0) 5efb (0)\n004 5 4646 4636 44a1 4559 | 12 4109 (0) 41d9 (0) 47bf (0) 4782 (0)\n005 4 49cd 4ac7 4a8b 4bcf | 6 4990 (0) 49cd (0) 49ea (0) 4ac7 (0)\n006 1 4e5a | 1 4e5a (0)\n============ DEPTH: 7 ==========================================\n007 3 4d10 4d6b 4d59 | 3 4d10 (0) 4d59 (0) 4d6b (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"4c9eab8ab45405a6d4bab46430efc04b8e6aec1d944f88435eca41361925f379","private_key":"7a577f1da7e66657ebe473b20ef72d95fc90848f65d8f7227f9eedb8dd2d3e36","name":"node_4c9eab8ab45405a6d4bab46430efc04b8e6aec1d944f88435eca41361925f379","services":["streamer"],"enable_msg_events":true,"port":38639},"up":true}},{"node":{"info":{"id":"ee5e77df690329c132f2f7fca223cfd384b7bc34ec38763a4eb42780e0585656","name":"node_ee5e77df690329c132f2f7fca223cfd384b7bc34ec38763a4eb42780e0585656","enode":"enode://e66e86a0d8b4fe8bc6037006527db1566125b2f17053e993b1e6e0a5cf3096da8e44246fd1f52fa9c677d078df9bf67486a1f1a1a08a9a633b509a9a01cc0d52@127.0.0.1:0","enr":"0xf88fb8404bb9f05fb11c108c893d2acac05872631cf5338eb304846ac251737b9548d01240a48e2b9001871de694d6c2f671520f9e9ffbb8005f99e4f6e949e9fed7dadb0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102e66e86a0d8b4fe8bc6037006527db1566125b2f17053e993b1e6e0a5cf3096da","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"7l5332kDKcEy8vf8oiPP04S3vDTsOHY6TrQngOBYVlY=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: ee5e77\npopulation: 37 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 7 0c28 3ec5 524d 4c9e | 146 1a2a (0) 1b83 (0) 18f6 (0) 19fa (0)\n001 4 849b a6fb b95d b897 | 47 9890 (0) 9852 (0) 9d0f (0) 9fa0 (0)\n002 7 c6cf c43f c1f9 c26f | 26 cc20 (0) c9f5 (0) c832 (0) c898 (0)\n003 6 fe21 f31c f773 f45f | 19 f925 (0) fbc8 (0) fbf5 (0) ff36 (0)\n004 4 e027 e54b e775 e7fa | 8 e027 (0) e5d7 (0) e5ad (0) e514 (0)\n005 4 eb98 e854 e8ef e883 | 4 eb98 (0) e854 (0) e8ef (0) e883 (0)\n006 2 ec52 ed2d | 2 ec52 (0) ed2d (0)\n============ DEPTH: 7 ==========================================\n007 3 ef1b ef07 efea | 3 ef1b (0) ef07 (0) efea (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"ee5e77df690329c132f2f7fca223cfd384b7bc34ec38763a4eb42780e0585656","private_key":"5622bc6c32ee27ea32ea20654dd0ce86eaf3f03c76b7873bae6de889e3b89961","name":"node_ee5e77df690329c132f2f7fca223cfd384b7bc34ec38763a4eb42780e0585656","services":["streamer"],"enable_msg_events":true,"port":39579},"up":true}},{"node":{"info":{"id":"68317431e4fa55be4a700e35c6a578307cc32b72336679b5c5618b622ef0c602","name":"node_68317431e4fa55be4a700e35c6a578307cc32b72336679b5c5618b622ef0c602","enode":"enode://b128b6cecc8f2cf260a135b1c480349d02ac0d60843d4e5112e6b974c18ef523effc3437092835f6f1fa3db2059063ace1de775116568700f3058a2adb47dc7b@127.0.0.1:0","enr":"0xf88fb840ceddc27e475fd5b30430a62f464bf89b48b1cae471a6a1e058e20dbf6641057e1a29eaeb0a05c85c688b1f83254fcc847704c40740dfd0ee7942ad5792f29c780183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103b128b6cecc8f2cf260a135b1c480349d02ac0d60843d4e5112e6b974c18ef523","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"aDF0MeT6Vb5KcA41xqV4MHzDK3IzZnm1xWGLYi7wxgI=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 683174\npopulation: 29 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 a6fb 849b ee5e | 110 9852 (0) 9890 (0) 9d0f (0) 9fa0 (0)\n001 5 1436 165f 1672 17db | 76 13d6 (0) 11d4 (0) 103b (0) 154b (0)\n002 4 524d 4636 44a1 4c9e | 38 5db0 (0) 5cd2 (0) 5f00 (0) 5efb (0)\n003 4 7e04 7dc2 738c 775e | 12 77d2 (0) 775e (0) 7125 (0) 7290 (0)\n004 3 67aa 67dc 6251 | 9 66e7 (0) 67aa (0) 67dc (0) 6103 (0)\n============ DEPTH: 5 ==========================================\n005 9 6c73 6c4d 6fe9 6f5f | 9 6fe9 (0) 6f5f (0) 6f2d (0) 6e68 (0)\n006 0 | 0\n007 1 6967 | 1 6967 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"68317431e4fa55be4a700e35c6a578307cc32b72336679b5c5618b622ef0c602","private_key":"1411ce49011b5e54719d32b3c8ee30e4e193aca2197047ff1878ec787ac339ac","name":"node_68317431e4fa55be4a700e35c6a578307cc32b72336679b5c5618b622ef0c602","services":["streamer"],"enable_msg_events":true,"port":45763},"up":true}},{"node":{"info":{"id":"3b88a472beba4a18f8df45678888fd359bac3823900eecfe0037fdc9ad54d416","name":"node_3b88a472beba4a18f8df45678888fd359bac3823900eecfe0037fdc9ad54d416","enode":"enode://f83fbc7b2e60a5ff4336bb527a72e161cd34aa8263923321c51a04ac74a3e361817581c460f34af4383da37b22729b7ba4bf4c15d7cbe276e9c889012ed3914a@127.0.0.1:0","enr":"0xf88fb840d4647a73a557c64ec9967abd7177386635f95f0ca12c9448349e1ba7e51b526e0f5690e7a06679eb95a475414adb1a6bf0d787343a9310b45114284f99eda12a0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102f83fbc7b2e60a5ff4336bb527a72e161cd34aa8263923321c51a04ac74a3e361","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"O4ikcr66Shj430VniIj9NZusOCOQDuz+ADf9ya1U1BY=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 3b88a4\npopulation: 41 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 10 d1d7 f5dc e027 efea | 110 9852 (0) 9890 (0) 9d0f (0) 9fa0 (0)\n001 8 524d 49cd 4c9e 44a1 | 70 5b63 (0) 5823 (0) 58ed (0) 5db0 (0)\n002 8 0de3 045b 07a8 0328 | 44 13d6 (0) 11d4 (0) 103b (0) 154b (0)\n003 4 2abb 21a0 256e 24b8 | 15 256e (0) 24b8 (0) 20ae (0) 2101 (0)\n004 5 33b5 30be 314a 3780 | 10 3237 (0) 3373 (0) 33b5 (0) 3089 (0)\n005 4 3f94 3e8e 3efc 3ec5 | 4 3f94 (0) 3e8e (0) 3efc (0) 3ec5 (0)\n============ DEPTH: 6 ==========================================\n006 1 39d1 | 1 39d1 (0)\n007 0 | 0\n008 1 3b78 | 1 3b78 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"3b88a472beba4a18f8df45678888fd359bac3823900eecfe0037fdc9ad54d416","private_key":"375d6617b99adaf6d42a2645a0cf39107d821b1de2bd8a65b429b3a08f5a9bf5","name":"node_3b88a472beba4a18f8df45678888fd359bac3823900eecfe0037fdc9ad54d416","services":["streamer"],"enable_msg_events":true,"port":44069},"up":true}},{"node":{"info":{"id":"44a10530c376b215baff8531eeb2afb8d6714c4d0350d1a6f32761a97cd6c7ec","name":"node_44a10530c376b215baff8531eeb2afb8d6714c4d0350d1a6f32761a97cd6c7ec","enode":"enode://2a7158451573eff25378de21fbabcff17326a0fc8247f6458d8aa97d024f7a8323240b745cfe394201f1be22313612dcbaac070227f39a01884f31e654543103@127.0.0.1:0","enr":"0xf88fb8400c1b56475eeb14186a876e72f3a08af9d4bff9d3ef73358874e77af19f982809410403a991c8fdc1f40ffdbc049f9e227cbbe0c21be45c526004d08af4db1cee0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1032a7158451573eff25378de21fbabcff17326a0fc8247f6458d8aa97d024f7a83","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"RKEFMMN2shW6/4Ux7rKvuNZxTE0DUNGm8ydhqXzWx+w=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 44a105\npopulation: 39 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 7 a6fb b95d b897 849b | 110 9852 (0) 9890 (0) 9d0f (0) 9fa0 (0)\n001 3 0de3 0c28 3b88 | 76 13d6 (0) 11d4 (0) 103b (0) 154b (0)\n002 10 6251 66e7 67aa 67dc | 32 66e7 (0) 67aa (0) 67dc (0) 6103 (0)\n003 3 524d 534b 574f | 15 5db0 (0) 5cd2 (0) 5efb (0) 5f00 (0)\n004 5 49cd 4bcf 4a8b 4c9e | 11 4990 (0) 49ea (0) 49cd (0) 4ac7 (0)\n005 2 4109 41d9 | 2 4109 (0) 41d9 (0)\n006 6 47bf 4782 46fe 4646 | 6 47bf (0) 4782 (0) 46fe (0) 4646 (0)\n============ DEPTH: 7 ==========================================\n007 2 4558 4559 | 2 4558 (0) 4559 (0)\n008 1 4447 | 1 4447 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"44a10530c376b215baff8531eeb2afb8d6714c4d0350d1a6f32761a97cd6c7ec","private_key":"c92c1299282223ac7bd3a783268df8976213e2780f5b1fa979226ac67dc17d66","name":"node_44a10530c376b215baff8531eeb2afb8d6714c4d0350d1a6f32761a97cd6c7ec","services":["streamer"],"enable_msg_events":true,"port":38773},"up":true}},{"node":{"info":{"id":"7e0458ecdf7081443cab5412529f3948ece659facaca03208496c80dd136e704","name":"node_7e0458ecdf7081443cab5412529f3948ece659facaca03208496c80dd136e704","enode":"enode://bb02c7e6af72f5794c6c0e8f70aa4cb3f84690c0f191cd8a7826c0ffb077510cf3a26fd6ad876b06f2e5944db84ec2eae05a4d0d9a5096ec4efffe3f3e3a7afc@127.0.0.1:0","enr":"0xf88fb8409f4cf59b81d3287012b59795e4be8f109968bd13739a36e9aa83cd88d152dc653f4d5471a570a8b3b5edf29c145584dcc9a9c43c40eaf96267ad7030b77ce96b0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102bb02c7e6af72f5794c6c0e8f70aa4cb3f84690c0f191cd8a7826c0ffb077510c","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"fgRY7N9wgUQ8q1QSUp85SOzmWfrKygMghJbIDdE25wQ=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 7e0458\npopulation: 37 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 8 a6fb b897 b95d 849b | 110 9852 (0) 9890 (0) 9d0f (0) 9fa0 (0)\n001 5 0de3 1c8a 17db 1436 | 76 13d6 (0) 103b (0) 11d4 (0) 154b (0)\n002 6 574f 524d 4c9e 4636 | 38 5db0 (0) 5cd2 (0) 5efb (0) 5f00 (0)\n003 7 6251 67dc 6831 6967 | 20 66e7 (0) 67aa (0) 67dc (0) 6103 (0)\n004 5 7125 7290 738c 77d2 | 5 7125 (0) 7290 (0) 738c (0) 77d2 (0)\n005 3 7a60 7b90 7920 | 3 7920 (0) 7a60 (0) 7b90 (0)\n============ DEPTH: 6 ==========================================\n006 3 7dbb 7dd3 7dc2 | 3 7dbb (0) 7dd3 (0) 7dc2 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"7e0458ecdf7081443cab5412529f3948ece659facaca03208496c80dd136e704","private_key":"ea6c1bb2edf4d57e62ea561fcc9ba70c43c2a1090c7a34f31e047846d20e1ecd","name":"node_7e0458ecdf7081443cab5412529f3948ece659facaca03208496c80dd136e704","services":["streamer"],"enable_msg_events":true,"port":40827},"up":true}},{"node":{"info":{"id":"f5dc78ff71a63fc2014b9553723ee676c63fc078a32a46b7cb172f357a118140","name":"node_f5dc78ff71a63fc2014b9553723ee676c63fc078a32a46b7cb172f357a118140","enode":"enode://08d06f19a921d3ea71d5c21913f5a847342419531a220f0da8d9e08bcefd1a0378205d1540b494ce8614bf2735320a49b00e7e9b4c73bc7845cbb81de6b1bf3a@127.0.0.1:0","enr":"0xf88fb8408b284fdc213acbd87073a716711d397be5a8b101dd3611a4833b0871cb3afdac21356d090fbe7737468658f36f642f1e0a2dad2c4179385a98354e9c23d5669f0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10208d06f19a921d3ea71d5c21913f5a847342419531a220f0da8d9e08bcefd1a03","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"9dx4/3GmP8IBS5VTcj7mdsY/wHijKka3yxcvNXoRgUA=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: f5dc78\npopulation: 37 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 3b88 3ec5 17db 4559 | 146 103b (0) 11d4 (0) 13d6 (0) 154b (0)\n001 5 96fc 849b b897 b95d | 47 8f21 (0) 898d (0) 886a (0) 88a1 (0)\n002 7 c898 caf6 c786 c43f | 26 cc20 (0) c9f5 (0) c832 (0) c898 (0)\n003 4 e027 ee5e efea ed2d | 18 e5d7 (0) e5ad (0) e514 (0) e547 (0)\n004 4 fbf5 fbc8 ff36 fe21 | 6 f925 (0) fbf5 (0) fbc8 (0) ff36 (0)\n005 3 f2d5 f27f f31c | 3 f2d5 (0) f27f (0) f31c (0)\n006 3 f629 f7fa f773 | 4 f629 (0) f7ba (0) f7fa (0) f773 (0)\n007 3 f4e0 f45f f456 | 3 f456 (0) f45f (0) f4e0 (0)\n============ DEPTH: 8 ==========================================\n008 1 f528 | 1 f528 (0)\n009 1 f5b2 | 1 f5b2 (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"f5dc78ff71a63fc2014b9553723ee676c63fc078a32a46b7cb172f357a118140","private_key":"a6746718798088d317cd7d6225dda0a32b67a827b88d4a80a28bcde59066ed49","name":"node_f5dc78ff71a63fc2014b9553723ee676c63fc078a32a46b7cb172f357a118140","services":["streamer"],"enable_msg_events":true,"port":33297},"up":true}},{"node":{"info":{"id":"a6fbe16b81d240ff2f2ed6c93cfd9590731dfb2e7ec3fce1c098fe542bedf299","name":"node_a6fbe16b81d240ff2f2ed6c93cfd9590731dfb2e7ec3fce1c098fe542bedf299","enode":"enode://0f12517c087f26001777a74267986c3d70abd56b9d17bd9061733e04d502ac2e7e9feb69aa0ac8aaa716add8e77c398c539e99e4665d1a48c81b74b30caafde0@127.0.0.1:0","enr":"0xf88fb840ff6e1d2403a5021cfc7a38d52571942b9c94756c73ba48c5ed420b788bc58ece089b54204b870f0a6c6a56ba811234ec38f78bb09ac098bef92436427f751c410183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1020f12517c087f26001777a74267986c3d70abd56b9d17bd9061733e04d502ac2e","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"pvvha4HSQP8vLtbJPP2VkHMd+y5+w/zhwJj+VCvt8pk=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: a6fbe1\npopulation: 38 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 7 3b88 17db 1c8a 44a1 | 146 11d4 (0) 103b (0) 13d6 (0) 154b (0)\n001 9 c6cf d299 d1d7 f4e0 | 63 cc20 (0) c9f5 (0) c832 (0) c898 (0)\n002 7 96fc 9fa0 82dd 82f9 | 20 8f21 (0) 898d (0) 886a (0) 88a1 (0)\n003 8 b502 b5b2 b626 b02b | 17 b7ca (0) b65e (0) b626 (0) b5b2 (0)\n004 3 ad98 aeb4 af02 | 5 ac4d (0) ad98 (0) ae2b (0) aeb4 (0)\n005 2 a369 a34e | 2 a369 (0) a34e (0)\n============ DEPTH: 6 ==========================================\n006 1 a46d | 1 a46d (0)\n007 0 | 0\n008 1 a653 | 1 a653 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"a6fbe16b81d240ff2f2ed6c93cfd9590731dfb2e7ec3fce1c098fe542bedf299","private_key":"23841056b6597d35a5a91856ad166332b11761512af382f62b98d43b330c665d","name":"node_a6fbe16b81d240ff2f2ed6c93cfd9590731dfb2e7ec3fce1c098fe542bedf299","services":["streamer"],"enable_msg_events":true,"port":45043},"up":true}},{"node":{"info":{"id":"ed2d3e1e5693b44494808907c98ec54d6d08331945d2a2c03e31130fef1d2586","name":"node_ed2d3e1e5693b44494808907c98ec54d6d08331945d2a2c03e31130fef1d2586","enode":"enode://a21876606bf6da53567f80f07c547c2c1d78eec18c7a793474aa1e554ed619945557b52c8557ad72b0b0953245c3dccc6a7c2e6969fa67cdb47559104f684454@127.0.0.1:0","enr":"0xf88fb8402a854c764d8a54505e85302e872616bb82bc6a7a4b1449e2edb01bfe25178a005d5002aa7cc69c8483eacebcbcd5eba719144823d665af12e4fb859eceec2bce0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102a21876606bf6da53567f80f07c547c2c1d78eec18c7a793474aa1e554ed61994","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"7S0+HlaTtESUgIkHyY7FTW0IMxlF0qLAPjETD+8dJYY=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: ed2d3e\npopulation: 39 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 8 0de3 1436 1c8a 21a0 | 146 2d36 (0) 2ccf (0) 2c38 (0) 2c79 (0)\n001 3 96fc b95d a6fb | 47 8f21 (0) 898d (0) 886a (0) 88a1 (0)\n002 8 c6cf c43f c26f c1f9 | 26 c9f5 (0) c832 (0) c898 (0) ca04 (0)\n003 7 fe21 f31c f773 f4e0 | 19 f925 (0) fbc8 (0) fbf5 (0) ff36 (0)\n004 4 e7fa e54b e547 e027 | 8 e5d7 (0) e5ad (0) e514 (0) e54b (0)\n005 4 eb98 e854 e883 e8ef | 4 eb98 (0) e854 (0) e8ef (0) e883 (0)\n============ DEPTH: 6 ==========================================\n006 4 efea ef07 ef1b ee5e | 4 ee5e (0) ef07 (0) ef1b (0) efea (0)\n007 1 ec52 | 1 ec52 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"ed2d3e1e5693b44494808907c98ec54d6d08331945d2a2c03e31130fef1d2586","private_key":"2f00e9f328828c2ef1bbf37d3db3377e0b4a02e7b9f6c3c721de6b28d64e6524","name":"node_ed2d3e1e5693b44494808907c98ec54d6d08331945d2a2c03e31130fef1d2586","services":["streamer"],"enable_msg_events":true,"port":39543},"up":true}},{"node":{"info":{"id":"6c4dcdfdee0164a9a3f419430726dd51f9198c65ff6e7de7aaa6f632dcde6794","name":"node_6c4dcdfdee0164a9a3f419430726dd51f9198c65ff6e7de7aaa6f632dcde6794","enode":"enode://c17a20dfd7be57a18cf26dcd1c304d5d01f2bb6068e09de961e1e30ffe334f151dac48d199bf561c8521dd3eaaed28583b57f2d8aca1c073f06b13ac7c771e0f@127.0.0.1:0","enr":"0xf88fb840044d1bdf571743721ed4e147a3d9a181174532883199678affb2bc6db47eca1001a2b0b3f97cc98c720570887c8551261489998bce175bfc7e7c5148b30f4b510183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103c17a20dfd7be57a18cf26dcd1c304d5d01f2bb6068e09de961e1e30ffe334f15","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"bE3N/e4BZKmj9BlDBybdUfkZjGX/bn3nqqb2MtzeZ5Q=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 6c4dcd\npopulation: 38 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 96fc a6fb c6cf d1d7 | 110 8f21 (0) 898d (0) 886a (0) 88a1 (0)\n001 6 378e 3b88 0de3 1436 | 76 2f32 (0) 2d36 (0) 2c79 (0) 2c38 (0)\n002 5 574f 524d 4c9e 4636 | 38 58ed (0) 5823 (0) 5b63 (0) 5db0 (0)\n003 7 738c 775e 77d2 7b90 | 12 7125 (0) 7290 (0) 738c (0) 775e (0)\n004 4 67dc 67aa 60d7 6251 | 9 6103 (0) 605a (0) 60d7 (0) 6337 (0)\n005 2 6967 6831 | 2 6967 (0) 6831 (0)\n============ DEPTH: 6 ==========================================\n006 7 6e05 6e68 6ecb 6ea5 | 7 6e68 (0) 6e05 (0) 6ecb (0) 6ea5 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 1 6c73 | 1 6c73 (0)\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"6c4dcdfdee0164a9a3f419430726dd51f9198c65ff6e7de7aaa6f632dcde6794","private_key":"14959eff979bd6f1bd74aacbc23ad2c7cb285be7e1675fab6d17567cf10fad34","name":"node_6c4dcdfdee0164a9a3f419430726dd51f9198c65ff6e7de7aaa6f632dcde6794","services":["streamer"],"enable_msg_events":true,"port":35017},"up":true}},{"node":{"info":{"id":"efeae3b7f610dc10acc51068e7718876d147cd78a9a28788c5dba5bb3a6950dc","name":"node_efeae3b7f610dc10acc51068e7718876d147cd78a9a28788c5dba5bb3a6950dc","enode":"enode://ddf6985e527e42d2f0b37b8e4efc6da2a5f68c0dcb89c92077390d6d6710adc001c172965c9ad744734a92ac1538392df4a714953a5ac33ec6e68fe8c9b0e3a3@127.0.0.1:0","enr":"0xf88fb84018e335f1758ad544ccb9a6381d6f5eeab5d27dab2936bb0dfad1e1e9623305ba03de5b05753d9cc1598585baef377ec5c714e6f06d43b7ab651e5fa82cc2c27b0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103ddf6985e527e42d2f0b37b8e4efc6da2a5f68c0dcb89c92077390d6d6710adc0","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"7+rjt/YQ3BCsxRBo53GIdtFHzXipooeIxduluzppUNw=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: efeae3\npopulation: 33 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 1436 24b8 378e 3b88 | 146 2f32 (0) 2d36 (0) 2c79 (0) 2c38 (0)\n001 3 b502 b897 96fc | 47 b7ca (0) b65e (0) b626 (0) b5b2 (0)\n002 5 c6cf c43f c1f9 c26f | 26 cc20 (0) c9f5 (0) c832 (0) c898 (0)\n003 5 fe21 f31c f4e0 f528 | 19 f925 (0) fbf5 (0) fbc8 (0) ff36 (0)\n004 6 e027 e7fa e775 e5ad | 8 e5d7 (0) e5ad (0) e514 (0) e54b (0)\n005 4 eb98 e854 e883 e8ef | 4 eb98 (0) e854 (0) e8ef (0) e883 (0)\n006 2 ed2d ec52 | 2 ec52 (0) ed2d (0)\n007 1 ee5e | 1 ee5e (0)\n============ DEPTH: 8 ==========================================\n008 2 ef1b ef07 | 2 ef07 (0) ef1b (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"efeae3b7f610dc10acc51068e7718876d147cd78a9a28788c5dba5bb3a6950dc","private_key":"3551e1831fe811a97293215d19ab637fc344bb26a2e7c28837cc25d9d3052c96","name":"node_efeae3b7f610dc10acc51068e7718876d147cd78a9a28788c5dba5bb3a6950dc","services":["streamer"],"enable_msg_events":true,"port":41545},"up":true}},{"node":{"info":{"id":"96fcf14c7f90350091ac6fcb58306ccfb9e4a38d3da59f8ab656854332844cbd","name":"node_96fcf14c7f90350091ac6fcb58306ccfb9e4a38d3da59f8ab656854332844cbd","enode":"enode://72736087dff95f03e9af1a0bbdd5858d8f4a50191b1009fa72ad6139b18353b15f3279fefbc352d1152aeb84a63f03a86daada01292ac8355b7b2cc5c0bdbb80@127.0.0.1:0","enr":"0xf88fb840a74a4a8f60d5b3cc5affc9d1801b03958b73091bc0eae33da8a9ea19859e87aa7a447fe2e68fdd6cd94e10757d1d8ce01334922460cca97c80b2dc26a2c4dd380183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10272736087dff95f03e9af1a0bbdd5858d8f4a50191b1009fa72ad6139b18353b1","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"lvzxTH+QNQCRrG/LWDBsz7nko409pZ+KtlaFQzKETL0=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 96fcf1\npopulation: 43 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 10 4559 44a1 7e04 6c4d | 146 58ed (0) 5823 (0) 5b63 (0) 5db0 (0)\n001 11 c26f c786 c6cf d299 | 63 cc20 (0) c9f5 (0) c832 (0) c898 (0)\n002 7 a6fb af02 b2b5 b5b2 | 27 bcc6 (0) ba88 (0) badd (0) baf2 (0)\n003 6 88fe 8505 849b 82f9 | 10 8f21 (0) 898d (0) 886a (0) 88a1 (0)\n004 4 9d0f 9fa0 9852 9890 | 4 9852 (0) 9890 (0) 9d0f (0) 9fa0 (0)\n005 3 90a8 9076 915d | 3 90a8 (0) 9076 (0) 915d (0)\n============ DEPTH: 6 ==========================================\n006 1 959f | 1 959f (0)\n007 1 976e | 1 976e (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"96fcf14c7f90350091ac6fcb58306ccfb9e4a38d3da59f8ab656854332844cbd","private_key":"dfe1f61a9d85c8c6b37a649568512c4247752f892548a5d10128c68168c53fa0","name":"node_96fcf14c7f90350091ac6fcb58306ccfb9e4a38d3da59f8ab656854332844cbd","services":["streamer"],"enable_msg_events":true,"port":38025},"up":true}},{"node":{"info":{"id":"0de3915b0bcc68040c8aa76fbd2cfa0714e9b34c9dbe0838a7cba81c4f73581c","name":"node_0de3915b0bcc68040c8aa76fbd2cfa0714e9b34c9dbe0838a7cba81c4f73581c","enode":"enode://0ced9e64272a4cb6b4f08a7577cfb1318c6de0fc82b45829643a3864110c0b809d0431af3ccd8700544fb5b6bba382810ba02181f15aca5e3d22d19361ab6657@127.0.0.1:0","enr":"0xf88fb84043c00b34db2f00d166f5f835baedf82ade48ba0751e49942a1e43eea487b20731c17c117fd43602af8059005c27d4f1534b92e310f5e5c63e0a7cf7bc51ac0850183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1030ced9e64272a4cb6b4f08a7577cfb1318c6de0fc82b45829643a3864110c0b80","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"DeORWwvMaAQMiqdvvSz6BxTps0ydvgg4p8uoHE9zWBw=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 0de391\npopulation: 33 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 96fc d1d7 ed2d e027 | 110 bcc6 (0) bb90 (0) ba88 (0) badd (0)\n001 4 6c4d 7e04 44a1 4559 | 70 58ed (0) 5823 (0) 5b63 (0) 5db0 (0)\n002 5 378e 3ec5 3b88 256e | 32 2d36 (0) 2c79 (0) 2c38 (0) 2ccf (0)\n003 5 1400 1436 17db 1f85 | 22 103b (0) 11d4 (0) 13d6 (0) 154b (0)\n004 6 02d8 0328 045b 0438 | 11 0067 (0) 00c6 (0) 02d8 (0) 03cc (0)\n005 3 0b72 0a00 0af9 | 3 0b72 (0) 0a00 (0) 0af9 (0)\n006 2 0fc5 0ff2 | 3 0e5e (0) 0fc5 (0) 0ff2 (0)\n============ DEPTH: 7 ==========================================\n007 3 0cf5 0c64 0c28 | 3 0cf5 (0) 0c64 (0) 0c28 (0)\n008 0 | 0\n009 1 0d8a | 1 0d8a (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"0de3915b0bcc68040c8aa76fbd2cfa0714e9b34c9dbe0838a7cba81c4f73581c","private_key":"b229b8d1f2575dc4c211d64fbcf552eadcf00482f0c55c8dfa3336ffe81b010e","name":"node_0de3915b0bcc68040c8aa76fbd2cfa0714e9b34c9dbe0838a7cba81c4f73581c","services":["streamer"],"enable_msg_events":true,"port":38979},"up":true}},{"node":{"info":{"id":"e027a9f7152641c4a41154f8ce4dafd23895c312150efea86bf4152c88d0ca86","name":"node_e027a9f7152641c4a41154f8ce4dafd23895c312150efea86bf4152c88d0ca86","enode":"enode://42f4817eb446d17b96c18c2538bfdf9fee4b7d278972ce27ed86dda5d91ea3ec330cbb910a82891a66844c42127955360c97e744cd8c46592d82f0ae51f31845@127.0.0.1:0","enr":"0xf88fb840c0e372772fcb685e048c3e5fa6f01d0c119feb88cdc1cb7cdee06d41fd6b143c37da7e6ff58e2fdaa90c07a05779586aa7dd6e4678007678b886c09c39a532690183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10342f4817eb446d17b96c18c2538bfdf9fee4b7d278972ce27ed86dda5d91ea3ec","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"4Cep9xUmQcSkEVT4zk2v0jiVwxIVDv6oa/QVLIjQyoY=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: e027a9\npopulation: 30 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 7e04 3b88 1436 0de3 | 146 5db0 (0) 5cd2 (0) 5efb (0) 5f00 (0)\n001 2 a6fb 96fc | 47 bcc6 (0) bb90 (0) ba88 (0) badd (0)\n002 4 c43f c6cf db6a d1d7 | 26 cc20 (0) c9f5 (0) c832 (0) c898 (0)\n003 7 fe21 f31c f773 f4e0 | 19 f925 (0) fbc8 (0) fbf5 (0) ff36 (0)\n004 6 eb98 e8ef e883 efea | 10 eb98 (0) e854 (0) e8ef (0) e883 (0)\n============ DEPTH: 5 ==========================================\n005 7 e5d7 e5ad e514 e54b | 7 e5d7 (0) e5ad (0) e514 (0) e547 (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"e027a9f7152641c4a41154f8ce4dafd23895c312150efea86bf4152c88d0ca86","private_key":"42236a2ba130a7a24f34201b6bceda8e237a0e2e4c4780e6dd8c423e79719722","name":"node_e027a9f7152641c4a41154f8ce4dafd23895c312150efea86bf4152c88d0ca86","services":["streamer"],"enable_msg_events":true,"port":33483},"up":true}},{"node":{"info":{"id":"d1d719ce1dca507598449afe966396c160ad25ad632112ab268b1d913b490dbd","name":"node_d1d719ce1dca507598449afe966396c160ad25ad632112ab268b1d913b490dbd","enode":"enode://80bb1c84b9239a4dcaca4b19398c7a54833efb060f0491e8f5efdb7549edffa41a10442da7ce9a44959a7220411d56f2ca686b1d2351ec652d3074a9bbecd50a@127.0.0.1:0","enr":"0xf88fb84099d84c8e0b6d56c16e509e6809e9057dfe42891fff4ff8e974189245419b9371212e1e3ecd5c2ec314cafb25c996d8ef320486b364a58b8f1e533b4afb42de240183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10280bb1c84b9239a4dcaca4b19398c7a54833efb060f0491e8f5efdb7549edffa4","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"0dcZzh3KUHWYRJr+lmOWwWCtJa1jIRKrJosdkTtJDb0=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: d1d719\npopulation: 36 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 9 4559 44a1 7e04 6251 | 146 7125 (0) 7290 (0) 738c (0) 775e (0)\n001 3 b2b5 a6fb 96fc | 47 bcc6 (0) bb90 (0) ba88 (0) baf2 (0)\n002 11 fe21 f31c f773 f45f | 37 f925 (0) fbf5 (0) fbc8 (0) ff36 (0)\n003 4 c1f9 c26f c43f c6cf | 15 cc20 (0) caf6 (0) ca04 (0) c9f5 (0)\n004 5 df1e d887 daec da67 | 6 df1e (0) d887 (0) d863 (0) daec (0)\n005 2 d7ac d640 | 2 d7ac (0) d640 (0)\n============ DEPTH: 6 ==========================================\n006 2 d3b0 d299 | 2 d3b0 (0) d299 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"d1d719ce1dca507598449afe966396c160ad25ad632112ab268b1d913b490dbd","private_key":"c8c5ea87fb82c55c9d58f48496b2fd47c86008f9ed782575bb4d64dedd096136","name":"node_d1d719ce1dca507598449afe966396c160ad25ad632112ab268b1d913b490dbd","services":["streamer"],"enable_msg_events":true,"port":42295},"up":true}},{"node":{"info":{"id":"1c8a10ecbd72acb2bbbb8b77ea5404f9e90f4dbf306ec8134cfed70b40aef399","name":"node_1c8a10ecbd72acb2bbbb8b77ea5404f9e90f4dbf306ec8134cfed70b40aef399","enode":"enode://ccb62edd9cbb83630d2c5ca827a44633de8aa6a65c68b263563159e02cec0d8554ae6c1bbc6450aa60f4900f3acca4d2ba529b6462d17792e360a5256b0e7517@127.0.0.1:0","enr":"0xf88fb8402251f72e3876c375bdf5474dd9b47aa6a4ec1c1cb255bd976fb6a7607c35a8f45943221daba85c637fa764b89f1d4e637e7edfc5bfb242e35a690f9bc6c3109a0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103ccb62edd9cbb83630d2c5ca827a44633de8aa6a65c68b263563159e02cec0d85","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"HIoQ7L1yrLK7u4t36lQE+ekPTb8wbsgTTP7XC0Cu85k=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 1c8a10\npopulation: 35 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 96fc a6fb ed2d f4e0 | 110 bcc6 (0) bb90 (0) badd (0) baf2 (0)\n001 4 7e04 77d2 6c4d 4559 | 70 7920 (0) 7a60 (0) 7b90 (0) 7dd3 (0)\n002 6 256e 24b8 3efc 3b88 | 32 2f32 (0) 2d36 (0) 2ccf (0) 2c79 (0)\n003 4 07a8 0c28 0d8a 0de3 | 22 0067 (0) 00c6 (0) 02d8 (0) 03cc (0)\n004 7 13d6 154b 1400 1436 | 12 103b (0) 11d4 (0) 13d6 (0) 154b (0)\n005 3 19fa 1a2a 1b83 | 4 18f6 (0) 19fa (0) 1a2a (0) 1b83 (0)\n006 3 1e2a 1f67 1f85 | 3 1e2a (0) 1f67 (0) 1f85 (0)\n============ DEPTH: 7 ==========================================\n007 0 | 0\n008 1 1c47 | 1 1c47 (0)\n009 0 | 0\n010 0 | 0\n011 1 1c9c | 1 1c9c (0)\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"1c8a10ecbd72acb2bbbb8b77ea5404f9e90f4dbf306ec8134cfed70b40aef399","private_key":"530e6c41fc6e6889ceddd163a578f3db02856187b2f0466de53f7f29408159b3","name":"node_1c8a10ecbd72acb2bbbb8b77ea5404f9e90f4dbf306ec8134cfed70b40aef399","services":["streamer"],"enable_msg_events":true,"port":45657},"up":true}},{"node":{"info":{"id":"17db15893bf39b42593ee1de975aba6832046d9da5b4b493ec44272738a29cef","name":"node_17db15893bf39b42593ee1de975aba6832046d9da5b4b493ec44272738a29cef","enode":"enode://e7d8ae7faaa3f720519c1ea490e184f238bf3e3c0be1da066ff25d1814339b79b018b95285a4db1d0d13e73503d99f590591dc1258d7bec591ae354c82a53839@127.0.0.1:0","enr":"0xf88fb840cec78fd16c7bdeaeb29d0f2f4fe3acb0f668c0432a9dac2be2d42460e02005a7493749ccc7b1b4faa5e51dae74cb0f39aac4d54d801dd26bfc466b82b76984390183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103e7d8ae7faaa3f720519c1ea490e184f238bf3e3c0be1da066ff25d1814339b79","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"F9sViTvzm0JZPuHel1q6aDIEbZ2ltLST7EQnJziinO8=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 17db15\npopulation: 32 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 a6fb 96fc f4e0 f5dc | 110 bcc6 (0) bb90 (0) ba88 (0) badd (0)\n001 5 7e04 77d2 6831 6c4d | 70 7920 (0) 7a60 (0) 7b90 (0) 7dbb (0)\n002 5 24b8 256e 3b88 3ec5 | 32 2d36 (0) 2c79 (0) 2c38 (0) 2ccf (0)\n003 2 07a8 0de3 | 22 0067 (0) 00c6 (0) 02d8 (0) 03cc (0)\n004 4 19fa 1b83 1f85 1c8a | 10 18f6 (0) 19fa (0) 1a2a (0) 1b83 (0)\n005 3 13d6 11d4 103b | 3 13d6 (0) 11d4 (0) 103b (0)\n006 4 1436 1400 14df 154b | 4 154b (0) 14df (0) 1400 (0) 1436 (0)\n007 2 165f 1672 | 2 165f (0) 1672 (0)\n============ DEPTH: 8 ==========================================\n008 1 1704 | 1 1704 (0)\n009 1 179f | 1 179f (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"17db15893bf39b42593ee1de975aba6832046d9da5b4b493ec44272738a29cef","private_key":"2e941f41c9fc6b53b84ce73e68eaa0a486a0a2c4030d915897f04f366440d05e","name":"node_17db15893bf39b42593ee1de975aba6832046d9da5b4b493ec44272738a29cef","services":["streamer"],"enable_msg_events":true,"port":41487},"up":true}},{"node":{"info":{"id":"455936fd22c43794e6e2104fd91d3f5d246e3823e8ff8eaf8dc27aa9f3d2ee08","name":"node_455936fd22c43794e6e2104fd91d3f5d246e3823e8ff8eaf8dc27aa9f3d2ee08","enode":"enode://4dc18460e3997bb0a5e9952976154083a46b2bf6b0c7f2810f7eee10b4b2254a8489d82eaed18436650b62980b531b8b1fb1808cfcc121d7749d3af1d718b12f@127.0.0.1:0","enr":"0xf88fb8402972e719eafce249c1d6c5b0af19eba09f751e4788398e88be87ee8619739c1c7d34faa74943a0227a4606a4a1c7ec1ecefdfc40a4cb0eca51ee1aa0dcaf300d0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1034dc18460e3997bb0a5e9952976154083a46b2bf6b0c7f2810f7eee10b4b2254a","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"RVk2/SLEN5Tm4hBP2R0/XSRuOCPo/46vjcJ6qfPS7gg=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 455936\npopulation: 35 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 96fc f4e0 f5dc d1d7 | 110 bcc6 (0) bb90 (0) ba88 (0) badd (0)\n001 6 378e 07a8 0de3 1c8a | 76 2ccf (0) 2c38 (0) 2c79 (0) 2d36 (0)\n002 6 77d2 738c 7dc2 7e04 | 32 7920 (0) 7a60 (0) 7b90 (0) 7dbb (0)\n003 2 574f 524d | 15 5b63 (0) 58ed (0) 5823 (0) 5db0 (0)\n004 5 49cd 4bcf 4a8b 4d6b | 11 4e5a (0) 4d10 (0) 4d59 (0) 4d6b (0)\n005 2 4109 41d9 | 2 4109 (0) 41d9 (0)\n006 5 4646 4636 46fe 47bf | 6 47bf (0) 4782 (0) 46fe (0) 4646 (0)\n============ DEPTH: 7 ==========================================\n007 2 4447 44a1 | 2 4447 (0) 44a1 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 1 4558 | 1 4558 (0)\n========================================================================="}},"config":{"id":"455936fd22c43794e6e2104fd91d3f5d246e3823e8ff8eaf8dc27aa9f3d2ee08","private_key":"7dbb064b0d47a7fc81d65e512613d0f099b690b6148f3867d9a2a7b689e3ff0e","name":"node_455936fd22c43794e6e2104fd91d3f5d246e3823e8ff8eaf8dc27aa9f3d2ee08","services":["streamer"],"enable_msg_events":true,"port":44695},"up":true}},{"node":{"info":{"id":"1436aaa8770e9f1c6294e49f4066c16b1caa50524e9b8fd058059e41657d2a83","name":"node_1436aaa8770e9f1c6294e49f4066c16b1caa50524e9b8fd058059e41657d2a83","enode":"enode://c5e2dced64cebb7bcf961588b05aa6135f14b133db83b9f039adea823547e6ca6a4ae66dd060942b5ddf0e35a7cf9c23aeef18cfefb07822f52a3a0d6e01b12f@127.0.0.1:0","enr":"0xf88fb84093bfc5b68fff885df3ca3ca5159f4ac4816cd313e0880bd4b9fc9dc6642606263cdb0d436c19251deec31df9fe25f1d7038d04d44f93325c8f5ee48ed202a2540183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103c5e2dced64cebb7bcf961588b05aa6135f14b133db83b9f039adea823547e6ca","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"FDaqqHcOnxxilOSfQGbBaxyqUFJOm4/QWAWeQWV9KoM=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 1436aa\npopulation: 34 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 96fc d299 efea ed2d | 110 bcc6 (0) bb90 (0) ba88 (0) badd (0)\n001 5 7e04 6831 6c4d 4636 | 70 7920 (0) 7a60 (0) 7b90 (0) 7dbb (0)\n002 5 256e 24b8 21a0 3ec5 | 32 2d36 (0) 2c38 (0) 2c79 (0) 2ccf (0)\n003 3 07a8 0c28 0de3 | 22 0b72 (0) 0af9 (0) 0a00 (0) 0ff2 (0)\n004 5 1b83 19fa 1c9c 1c8a | 10 1a2a (0) 1b83 (0) 18f6 (0) 19fa (0)\n005 2 11d4 13d6 | 3 103b (0) 11d4 (0) 13d6 (0)\n006 5 165f 1672 1704 17db | 5 165f (0) 1672 (0) 1704 (0) 179f (0)\n007 1 154b | 1 154b (0)\n============ DEPTH: 8 ==========================================\n008 1 14df | 1 14df (0)\n009 0 | 0\n010 1 1400 | 1 1400 (0)\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"1436aaa8770e9f1c6294e49f4066c16b1caa50524e9b8fd058059e41657d2a83","private_key":"30f78566606a3588a6ae7452aae120e984a681f8c1dfe235806102b387d1b5e1","name":"node_1436aaa8770e9f1c6294e49f4066c16b1caa50524e9b8fd058059e41657d2a83","services":["streamer"],"enable_msg_events":true,"port":37199},"up":true}},{"node":{"info":{"id":"378e7af7cc019186d4f2699e753e2d71302f8f3565572c13b7a1b1c5cb47443c","name":"node_378e7af7cc019186d4f2699e753e2d71302f8f3565572c13b7a1b1c5cb47443c","enode":"enode://62d1a6cca7bfbd3f31cbd86708971f47cf9eab3c318a42ca0784a3c76ed5bb697a9f7ec6987f2456c84aeaf468b4a99277dd1c85fb850c51d91f683ec2bfd821@127.0.0.1:0","enr":"0xf88fb84096dbe71818bc9bff8cab39cad479b1e8be50f63de0e73a02ab147856d3a7eb6866b2acfcb4f171d75eb8d44e9075bd3fc106e373e87ecbb2424c2c443996816f0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10362d1a6cca7bfbd3f31cbd86708971f47cf9eab3c318a42ca0784a3c76ed5bb69","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"N45698wBkYbU8mmedT4tcTAvjzVlVywTt6GxxctHRDw=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 378e7a\npopulation: 32 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 ed2d efea f4e0 d299 | 110 bcc6 (0) bb90 (0) ba88 (0) badd (0)\n001 6 6c4d 6f2d 77d2 49cd | 70 5cd2 (0) 5db0 (0) 5efb (0) 5f00 (0)\n002 8 0c28 0de3 07a8 1f85 | 44 0b72 (0) 0af9 (0) 0a00 (0) 0e5e (0)\n003 2 256e 24b8 | 15 2d36 (0) 2ccf (0) 2c38 (0) 2c79 (0)\n004 3 3b88 3efc 3ec5 | 7 3f94 (0) 3e8e (0) 3efc (0) 3ec5 (0)\n005 5 3373 33b5 314a 3089 | 6 3237 (0) 3373 (0) 33b5 (0) 314a (0)\n006 1 35e6 | 1 35e6 (0)\n============ DEPTH: 7 ==========================================\n007 1 3630 | 1 3630 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 1 3780 | 1 3780 (0)\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"378e7af7cc019186d4f2699e753e2d71302f8f3565572c13b7a1b1c5cb47443c","private_key":"f87ae143c4de5fb51892f311d616d4800d4963ecf3e3d1db6a4e31639d894c37","name":"node_378e7af7cc019186d4f2699e753e2d71302f8f3565572c13b7a1b1c5cb47443c","services":["streamer"],"enable_msg_events":true,"port":42999},"up":true}},{"node":{"info":{"id":"c6cf46239078edfb343c645f039725fdee1bbba8b0a6da02e2cc456b9223c9a2","name":"node_c6cf46239078edfb343c645f039725fdee1bbba8b0a6da02e2cc456b9223c9a2","enode":"enode://445bc4dbafd666bb2218c9ec6a582bf6bfb2fadbc7624ea9f724fb35a0b58d12a074a968505f280eb85b7240f437aac8986ba15cae3fb075b916c7620784004e@127.0.0.1:0","enr":"0xf88fb840ac8583022ed007db510135b8c593b46044e897f3fee1fd57fc3b04847325b40c5166ebd8aa464b82755d700da0d197da02f5d7be64bc2a5df55409f7040a10610183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102445bc4dbafd666bb2218c9ec6a582bf6bfb2fadbc7624ea9f724fb35a0b58d12","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"xs9GI5B47fs0PGRfA5cl/e4bu6iwptoC4sxFa5IjyaI=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: c6cf46\npopulation: 33 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 7 77d2 6c4d 6f2d 4559 | 146 5db0 (0) 5cd2 (0) 5f00 (0) 5efb (0)\n001 4 a6fb b2b5 8025 96fc | 47 ac4d (0) ad98 (0) aeb4 (0) ae2b (0)\n002 5 ed2d ee5e efea e027 | 37 eb98 (0) e854 (0) e8ef (0) e883 (0)\n003 5 da67 db6a d299 d3b0 | 11 df1e (0) d863 (0) d887 (0) daec (0)\n004 4 cc20 c898 caf6 ca04 | 6 cc20 (0) caf6 (0) ca04 (0) c9f5 (0)\n005 2 c26f c1f9 | 2 c1f9 (0) c26f (0)\n006 4 c59e c49c c43f c441 | 4 c59e (0) c49c (0) c441 (0) c43f (0)\n============ DEPTH: 7 ==========================================\n007 1 c786 | 1 c786 (0)\n008 1 c620 | 1 c620 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"c6cf46239078edfb343c645f039725fdee1bbba8b0a6da02e2cc456b9223c9a2","private_key":"1227a7906f23478558c2ff562b54e86b2e16710eb7290823a1a7587ff14161e7","name":"node_c6cf46239078edfb343c645f039725fdee1bbba8b0a6da02e2cc456b9223c9a2","services":["streamer"],"enable_msg_events":true,"port":42921},"up":true}},{"node":{"info":{"id":"f4e09f89287bd1af7833acd85ba7cc71fdb3ff34f2f409e1cf2a878dcd3183dc","name":"node_f4e09f89287bd1af7833acd85ba7cc71fdb3ff34f2f409e1cf2a878dcd3183dc","enode":"enode://d57c1ed1af3de513ab3ca9168f80d3a51ffcb3af7a20c1f854d01312afa00097dd7257ccdc5bf0bed966eaabd495e22ee59207246b35d88a2f1027f2cb696b90@127.0.0.1:0","enr":"0xf88fb840ce18c84e0bf1b525d2a1ffc03cc7281c5c032526b3c258ba6e0c1b428e830b3b56b8c158871961b7f6fb5bcee112aa4bdba312e2c333b52e613e50ef0855ac980183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102d57c1ed1af3de513ab3ca9168f80d3a51ffcb3af7a20c1f854d01312afa00097","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"9OCfiSh70a94M6zYW6fMcf2z/zTy9AnhzyqHjc0xg9w=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: f4e09f\npopulation: 44 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 9 4559 6f2d 24b8 378e | 146 103b (0) 11d4 (0) 13d6 (0) 1672 (0)\n001 5 a6fb b502 b2b5 8025 | 47 ad98 (0) ac4d (0) aeb4 (0) ae2b (0)\n002 11 da67 db6a d7ac d1d7 | 26 df1e (0) d863 (0) d887 (0) daec (0)\n003 4 e027 ed2d ee5e efea | 18 eb98 (0) e854 (0) e8ef (0) e883 (0)\n004 4 fe21 ff36 fbf5 fbc8 | 6 f925 (0) fbf5 (0) fbc8 (0) ff36 (0)\n005 3 f2d5 f27f f31c | 3 f2d5 (0) f27f (0) f31c (0)\n006 3 f629 f7fa f773 | 4 f629 (0) f7ba (0) f7fa (0) f773 (0)\n007 3 f528 f5dc f5b2 | 3 f5b2 (0) f5dc (0) f528 (0)\n============ DEPTH: 8 ==========================================\n008 2 f45f f456 | 2 f456 (0) f45f (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"f4e09f89287bd1af7833acd85ba7cc71fdb3ff34f2f409e1cf2a878dcd3183dc","private_key":"068db7a4942ca7125ac96d19e14274fd6a94b300707941d0c28a2a334ec18d10","name":"node_f4e09f89287bd1af7833acd85ba7cc71fdb3ff34f2f409e1cf2a878dcd3183dc","services":["streamer"],"enable_msg_events":true,"port":39333},"up":true}},{"node":{"info":{"id":"d29941d6b8acd86cf32fd1c2181da3ab1da3c2083134b068ca49ce29aa86b783","name":"node_d29941d6b8acd86cf32fd1c2181da3ab1da3c2083134b068ca49ce29aa86b783","enode":"enode://9921bbce6608fb1ad3311caeaf2d70b08c24b0c5097af6a7702cf8d750b57627cdfc9327ded122c82ad215e428777e2bc5bf667722eb531e3ababb25ed49e0a5@127.0.0.1:0","enr":"0xf88fb840de77d70c78a672c75090aa9196c7f37e174342b0b89db3c3d8208df199e66ae61c6c9d6d0849f2e4283008fbb2df674c815c4fadcbc9c5b1a3f5205d19eb1cca0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1039921bbce6608fb1ad3311caeaf2d70b08c24b0c5097af6a7702cf8d750b57627","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"0plB1ris2GzzL9HCGB2jqx2jwggxNLBoyknOKaqGt4M=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: d29941\npopulation: 34 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 9 256e 378e 07a8 1436 | 146 13d6 (0) 11d4 (0) 103b (0) 165f (0)\n001 4 96fc 8025 a6fb b2b5 | 47 8f21 (0) 898d (0) 886a (0) 88a1 (0)\n002 7 e7fa ee5e ed2d fe21 | 37 eb98 (0) e854 (0) e883 (0) e8ef (0)\n003 5 ca04 c6cf c59e c43f | 15 cc20 (0) c9f5 (0) c832 (0) c898 (0)\n004 5 d887 d863 daec da67 | 6 df1e (0) d887 (0) d863 (0) daec (0)\n005 2 d640 d7ac | 2 d640 (0) d7ac (0)\n============ DEPTH: 6 ==========================================\n006 1 d1d7 | 1 d1d7 (0)\n007 1 d3b0 | 1 d3b0 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"d29941d6b8acd86cf32fd1c2181da3ab1da3c2083134b068ca49ce29aa86b783","private_key":"ed9cc2d516c3a37362d70e5337c6285651e7d1478038434939544e5f0a2558c5","name":"node_d29941d6b8acd86cf32fd1c2181da3ab1da3c2083134b068ca49ce29aa86b783","services":["streamer"],"enable_msg_events":true,"port":35669},"up":true}},{"node":{"info":{"id":"6f2d756566dd5b4a13ffeea9f687c785148f3407a502e28b9d6edfd03b905fdc","name":"node_6f2d756566dd5b4a13ffeea9f687c785148f3407a502e28b9d6edfd03b905fdc","enode":"enode://6cadca795e1a9332ff620a0fa3972acbc4701938fd9ee90a2e0e3b06e0c12bc10e743b1605698003c58cbb67f3f6695e5b4a7b939a5f95e29661fdbed5c174b2@127.0.0.1:0","enr":"0xf88fb84086f29094a4468911665b009f5ad2ec7bb6dd33e9faab8e89844e394b676e514d1f1765853026e1c53a16b6a854ac35880408fdda19598f40e0550620310caa9a0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1026cadca795e1a9332ff620a0fa3972acbc4701938fd9ee90a2e0e3b06e0c12bc1","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"by11ZWbdW0oT/+6p9ofHhRSPNAelAuKLnW7f0DuQX9w=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 6f2d75\npopulation: 32 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 f4e0 c6cf d299 | 110 8f21 (0) 898d (0) 886a (0) 88a1 (0)\n001 3 378e 24b8 07a8 | 76 3f94 (0) 3e8e (0) 3ec5 (0) 3efc (0)\n002 4 4636 44a1 4559 574f | 38 5db0 (0) 5cd2 (0) 5efb (0) 5f00 (0)\n003 8 7e04 7dbb 7dc2 7dd3 | 12 7920 (0) 7a60 (0) 7b90 (0) 7dd3 (0)\n004 4 60d7 6251 628e 67aa | 9 6337 (0) 628e (0) 6251 (0) 6103 (0)\n005 2 6967 6831 | 2 6967 (0) 6831 (0)\n006 2 6c73 6c4d | 2 6c73 (0) 6c4d (0)\n007 4 6e68 6e05 6ecb 6ea5 | 4 6e68 (0) 6e05 (0) 6ecb (0) 6ea5 (0)\n============ DEPTH: 8 ==========================================\n008 1 6fe9 | 1 6fe9 (0)\n009 1 6f5f | 1 6f5f (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"6f2d756566dd5b4a13ffeea9f687c785148f3407a502e28b9d6edfd03b905fdc","private_key":"3d64f67a082f7e4185e83ea4414849a0146c7104250ce8de6eb30c628b9b8459","name":"node_6f2d756566dd5b4a13ffeea9f687c785148f3407a502e28b9d6edfd03b905fdc","services":["streamer"],"enable_msg_events":true,"port":43877},"up":true}},{"node":{"info":{"id":"07a8c900fec6c477580ed5b38848a8681dc52a19e59fa4cd32f571fe7fb2383a","name":"node_07a8c900fec6c477580ed5b38848a8681dc52a19e59fa4cd32f571fe7fb2383a","enode":"enode://3f7f839709363b1db97fd83da689de1fe397a6c4574f1186f20116ae3674c3777d47487ba386136c9f90670450caaaa8d08942f2d5b57e66e54333609ea826fb@127.0.0.1:0","enr":"0xf88fb8407eb35279cb43bd4502b17e6cf9227e0948b7d39a193d9dd1a66d0718d0f3a9ee4998694774985993b7ac021e4705e12e04741158f1838372359ff61c5a7fea0b0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1033f7f839709363b1db97fd83da689de1fe397a6c4574f1186f20116ae3674c377","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"B6jJAP7GxHdYDtWziEioaB3FKhnln6TNMvVx/n+yODo=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 07a8c9\npopulation: 30 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 b2b5 c6cf d299 f4e0 | 110 8f21 (0) 898d (0) 886a (0) 88a1 (0)\n001 6 574f 53a8 4559 4636 | 70 5db0 (0) 5cd2 (0) 5efb (0) 5f00 (0)\n002 4 3b88 378e 256e 24b8 | 32 3f94 (0) 3e8e (0) 3ec5 (0) 3efc (0)\n003 6 1436 1400 17db 1b83 | 22 103b (0) 11d4 (0) 13d6 (0) 165f (0)\n004 3 0c28 0d8a 0de3 | 11 0b72 (0) 0a00 (0) 0af9 (0) 0e5e (0)\n005 3 00c6 02d8 0328 | 5 0067 (0) 00c6 (0) 02d8 (0) 03cc (0)\n006 2 0438 045b | 3 0438 (0) 0451 (0) 045b (0)\n============ DEPTH: 7 ==========================================\n007 1 0661 | 1 0661 (0)\n008 1 0743 | 1 0743 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"07a8c900fec6c477580ed5b38848a8681dc52a19e59fa4cd32f571fe7fb2383a","private_key":"57fbc15d67af2d8593073c689c611a38db6bde0721b57199615b19d8038b5653","name":"node_07a8c900fec6c477580ed5b38848a8681dc52a19e59fa4cd32f571fe7fb2383a","services":["streamer"],"enable_msg_events":true,"port":38689},"up":true}},{"node":{"info":{"id":"24b85c10f098725938ea7d87cd24a4b10358129906fca9790fc266ea8784b538","name":"node_24b85c10f098725938ea7d87cd24a4b10358129906fca9790fc266ea8784b538","enode":"enode://f4d9569b664ccde6dbfd8ffeb4524cf63fb038a8310e6faacf75999847a8a2aebf5463047743c0bbe50bfbf096cd1a88cc77c287c65777fe1aa700b92ff22931@127.0.0.1:0","enr":"0xf88fb84064a70dff70951c7ae9cd2b2c670490da42501b1011736ec633815cc654d0de98202748d2e22ba9fc5a5b006d005036985328ad38f7efe4ee0a095ed6983caa3a0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103f4d9569b664ccde6dbfd8ffeb4524cf63fb038a8310e6faacf75999847a8a2ae","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"JLhcEPCYclk46n2HzSSksQNYEpkG/Kl5D8Jm6oeEtTg=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 24b85c\npopulation: 31 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 8025 96fc b502 b2b5 | 110 8f21 (0) 898d (0) 886a (0) 88a1 (0)\n001 4 4636 49cd 6f2d 77d2 | 70 5cd2 (0) 5db0 (0) 5efb (0) 5f00 (0)\n002 7 17db 1436 1400 1c8a | 44 103b (0) 11d4 (0) 13d6 (0) 165f (0)\n003 6 3ec5 3efc 3b88 314a | 17 3f94 (0) 3e8e (0) 3efc (0) 3ec5 (0)\n004 3 2f32 2ccf 2abb | 9 2f32 (0) 2d36 (0) 2c79 (0) 2c38 (0)\n============ DEPTH: 5 ==========================================\n005 4 20ae 2101 217f 21a0 | 4 20ae (0) 2101 (0) 217f (0) 21a0 (0)\n006 0 | 0\n007 1 256e | 1 256e (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"24b85c10f098725938ea7d87cd24a4b10358129906fca9790fc266ea8784b538","private_key":"c43bfbf2bb506dcd5608000c4a2f2a4ad8be5b1c1d5ecb3bc1bc59109c0b6b16","name":"node_24b85c10f098725938ea7d87cd24a4b10358129906fca9790fc266ea8784b538","services":["streamer"],"enable_msg_events":true,"port":38967},"up":true}},{"node":{"info":{"id":"1f85b8c05e5dceff0bd8256f8f6d80d4b902a9754ceb952d95ea2e1150ef9e59","name":"node_1f85b8c05e5dceff0bd8256f8f6d80d4b902a9754ceb952d95ea2e1150ef9e59","enode":"enode://73040f7d8f962f54e6691a4b9f2c4b324d3dfbbe742387c453b5950b1adfc52a5f12c4a3b6511e824f9be6bf49cf996c448cff189ae3068d639a50438b0fbd22@127.0.0.1:0","enr":"0xf88fb840976c5a30ad5f6c348eaf3a368ab63084b1eae6ff36dfd982c5aeb47271554dc577959a9ce734707a16bc9bd64d23dca99b3c766c6b4243d75249708abd5189fd0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10273040f7d8f962f54e6691a4b9f2c4b324d3dfbbe742387c453b5950b1adfc52a","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"H4W4wF5dzv8L2CVvj22A1LkCqXVM65UtleouEVDvnlk=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 1f85b8\npopulation: 29 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 b2b5 fe21 f4e0 c26f | 110 8f21 (0) 898d (0) 886a (0) 88a1 (0)\n001 3 574f 4636 77d2 | 70 5823 (0) 58ed (0) 5b63 (0) 5cd2 (0)\n002 4 378e 30be 256e 24b8 | 32 3f94 (0) 3e8e (0) 3ec5 (0) 3efc (0)\n003 4 0c28 0de3 0d8a 07a8 | 22 0b72 (0) 0a00 (0) 0af9 (0) 0ff2 (0)\n004 3 17db 1400 1436 | 12 13d6 (0) 11d4 (0) 103b (0) 165f (0)\n005 4 19fa 18f6 1a2a 1b83 | 4 19fa (0) 18f6 (0) 1a2a (0) 1b83 (0)\n006 3 1c47 1c9c 1c8a | 3 1c47 (0) 1c9c (0) 1c8a (0)\n============ DEPTH: 7 ==========================================\n007 1 1e2a | 1 1e2a (0)\n008 1 1f67 | 1 1f67 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"1f85b8c05e5dceff0bd8256f8f6d80d4b902a9754ceb952d95ea2e1150ef9e59","private_key":"59c61bd4b5c1b4f8c1995c2c5162afae8f31e9c643be34f24fa05cc989be881e","name":"node_1f85b8c05e5dceff0bd8256f8f6d80d4b902a9754ceb952d95ea2e1150ef9e59","services":["streamer"],"enable_msg_events":true,"port":38831},"up":true}},{"node":{"info":{"id":"77d2ec52dabd5d7f326d4c6afd2aad110487c6bdffa2984060528716ba873462","name":"node_77d2ec52dabd5d7f326d4c6afd2aad110487c6bdffa2984060528716ba873462","enode":"enode://d75b2925001a8eeae3e6c484278d65e4c64b829e79e4f4f9ffbfbfda98e713f2c194160e65c7afd3241b956106959174badaa1127f984a992d0d653bafad1ef2@127.0.0.1:0","enr":"0xf88fb84090355b49c231a49d0a8588ce047d0541ad615d101206c5f0d3460bdd3cb0046703875d1527046828aaab5698f064414207e768132bd4c870cfdefbc386c1c61a0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102d75b2925001a8eeae3e6c484278d65e4c64b829e79e4f4f9ffbfbfda98e713f2","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"d9LsUtq9XX8ybUxq/SqtEQSHxr3/ophAYFKHFrqHNGI=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 77d2ec\npopulation: 39 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 d299 c26f c43f c6cf | 110 8f21 (0) 898d (0) 886a (0) 88a1 (0)\n001 7 07a8 17db 1c8a 1f85 | 76 0b72 (0) 0af9 (0) 0a00 (0) 0e5e (0)\n002 7 4636 4559 4a8b 5f00 | 38 5efb (0) 5f00 (0) 5db0 (0) 5cd2 (0)\n003 10 67aa 67dc 6251 6103 | 20 6337 (0) 628e (0) 6251 (0) 6103 (0)\n004 5 7b90 7a60 7dd3 7dc2 | 7 7dbb (0) 7dd3 (0) 7dc2 (0) 7e04 (0)\n============ DEPTH: 5 ==========================================\n005 3 7125 738c 7290 | 3 7125 (0) 738c (0) 7290 (0)\n006 0 | 0\n007 0 | 0\n008 1 775e | 1 775e (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"77d2ec52dabd5d7f326d4c6afd2aad110487c6bdffa2984060528716ba873462","private_key":"682c5165cd7b0aefc0947ef86781161eeab41ef910322502ffe6b2db732e6f00","name":"node_77d2ec52dabd5d7f326d4c6afd2aad110487c6bdffa2984060528716ba873462","services":["streamer"],"enable_msg_events":true,"port":36957},"up":true}},{"node":{"info":{"id":"256e81c5a6fb43bd343345477f8f96aa1947f07ac3297f631ab03f060147b062","name":"node_256e81c5a6fb43bd343345477f8f96aa1947f07ac3297f631ab03f060147b062","enode":"enode://53a39015a7a349078a4861f507013efbe2e42c44a48210c7f41dfad8fe09503c0d8604c8ba351fa6b5da4179e598f7987bd5a4f5072028ea6c35867f4e0e3452@127.0.0.1:0","enr":"0xf88fb84096ffa0a393f3fa959e87c33678cde0b74e73829a0e1cc5a53e580d06d9d9b14373e52acbfd14808c4cfdb02cb4f2511fd88bbe7fb76ff0c58d87afb2f286bd960183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10253a39015a7a349078a4861f507013efbe2e42c44a48210c7f41dfad8fe09503c","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"JW6Bxab7Q700M0VHf4+WqhlH8HrDKX9jGrA/BgFHsGI=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 256e81\npopulation: 35 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 fe21 c6cf d299 db6a | 110 df1e (0) d887 (0) d863 (0) daec (0)\n001 5 574f 49cd 4636 67aa | 70 5b63 (0) 58ed (0) 5823 (0) 5cd2 (0)\n002 9 0c28 0d8a 0de3 07a8 | 44 0a00 (0) 0af9 (0) 0b72 (0) 0e5e (0)\n003 7 3b88 3efc 3ec5 3780 | 17 39d1 (0) 3b78 (0) 3b88 (0) 3f94 (0)\n004 3 2f32 2ccf 2abb | 9 2f32 (0) 2d36 (0) 2c79 (0) 2c38 (0)\n============ DEPTH: 5 ==========================================\n005 4 20ae 217f 2101 21a0 | 4 20ae (0) 217f (0) 2101 (0) 21a0 (0)\n006 0 | 0\n007 1 24b8 | 1 24b8 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"256e81c5a6fb43bd343345477f8f96aa1947f07ac3297f631ab03f060147b062","private_key":"45dc210e5a7309cf6d363540be2d1d849e0f2dc92ab7bb5df059d521246f9ff1","name":"node_256e81c5a6fb43bd343345477f8f96aa1947f07ac3297f631ab03f060147b062","services":["streamer"],"enable_msg_events":true,"port":41465},"up":true}},{"node":{"info":{"id":"8025c1fcb98e53f92767d1d43a3057a0acd1e8994bb4a7e3f5e244110e0dcf91","name":"node_8025c1fcb98e53f92767d1d43a3057a0acd1e8994bb4a7e3f5e244110e0dcf91","enode":"enode://f14e1b9f746918024f3f3b5afb64d85f230790c5f8e6f530da3723875e1ba92922eec9c790e3bcf9a0266fa565f0af0d840edb1fa61b03c7f58196c038833999@127.0.0.1:0","enr":"0xf88fb840b4e407fbcca71bbbd27293f0aa73df4b38c2e5d75e916f3bb6f68b312823e00b6e349f5500dee5e74f29eff4153d436fabd7fbccfdd803ff167002ad2244b3450183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103f14e1b9f746918024f3f3b5afb64d85f230790c5f8e6f530da3723875e1ba929","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"gCXB/LmOU/knZ9HUOjBXoKzR6JlLtKfj9eJEEQ4Nz5E=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 8025c1\npopulation: 28 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 512e 574f 4558 4636 | 146 5db0 (0) 5cd2 (0) 5efb (0) 5f00 (0)\n001 7 c26f c43f c6cf d299 | 63 d640 (0) d7ac (0) d1d7 (0) d3b0 (0)\n002 3 a6fb b502 b2b5 | 27 ad98 (0) ac4d (0) ae2b (0) aeb4 (0)\n003 5 9d0f 9fa0 959f 96fc | 10 9852 (0) 9890 (0) 9d0f (0) 9fa0 (0)\n004 3 898d 886a 88fe | 5 8f21 (0) 898d (0) 886a (0) 88a1 (0)\n005 2 8505 849b | 2 8505 (0) 849b (0)\n============ DEPTH: 6 ==========================================\n006 2 82dd 82f9 | 2 82dd (0) 82f9 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"8025c1fcb98e53f92767d1d43a3057a0acd1e8994bb4a7e3f5e244110e0dcf91","private_key":"0c41aca505e0136ca72a3c58217ecd9a78eea3796b96dd546d96472f328cf37f","name":"node_8025c1fcb98e53f92767d1d43a3057a0acd1e8994bb4a7e3f5e244110e0dcf91","services":["streamer"],"enable_msg_events":true,"port":41367},"up":true}},{"node":{"info":{"id":"4636f00be60a9b494a3ebc9ab41cc7cb53ec0b0beff214db2d0a248dc3aeb6af","name":"node_4636f00be60a9b494a3ebc9ab41cc7cb53ec0b0beff214db2d0a248dc3aeb6af","enode":"enode://10f863a5bc8ec93dee6896e14260ef8642e83ee113ee0ed55e0ee9d2ad4feba5670b38d5e529811d454fffb530187992f11f0151ac5031122b0837f845acc95c@127.0.0.1:0","enr":"0xf88fb8405098b23b6301b63dedf00769712c97314e7c701599028eabebef4e123b8d775622dfd46163d23effb9dc9e0738d925989bb5b390f4fe66a740815305619af8b60183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10210f863a5bc8ec93dee6896e14260ef8642e83ee113ee0ed55e0ee9d2ad4feba5","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"RjbwC+YKm0lKPryatBzHy1PsCwvv8hTbLQokjcOutq8=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 4636f0\npopulation: 34 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 8025 b2b5 | 110 d640 (0) d7ac (0) d1d7 (0) d3b0 (0)\n001 6 378e 24b8 256e 07a8 | 76 0b72 (0) 0af9 (0) 0a00 (0) 0e5e (0)\n002 7 67aa 6f2d 6c4d 6831 | 32 7920 (0) 7a60 (0) 7b90 (0) 7dbb (0)\n003 3 5b63 524d 574f | 15 5db0 (0) 5cd2 (0) 5efb (0) 5f00 (0)\n004 5 49cd 4a8b 4bcf 4c9e | 11 4e5a (0) 4c9e (0) 4d10 (0) 4d59 (0)\n005 2 4109 41d9 | 2 4109 (0) 41d9 (0)\n006 4 4558 4559 4447 44a1 | 4 4447 (0) 44a1 (0) 4558 (0) 4559 (0)\n007 2 47bf 4782 | 2 47bf (0) 4782 (0)\n008 1 46fe | 1 46fe (0)\n============ DEPTH: 9 ==========================================\n009 1 4646 | 1 4646 (0)\n010 1 461c | 1 461c (0)\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"4636f00be60a9b494a3ebc9ab41cc7cb53ec0b0beff214db2d0a248dc3aeb6af","private_key":"c7fd7cc73cf8fe60e42f0df8dba49b5b7c12529c7fabb2b5b769965ce13afb0b","name":"node_4636f00be60a9b494a3ebc9ab41cc7cb53ec0b0beff214db2d0a248dc3aeb6af","services":["streamer"],"enable_msg_events":true,"port":40557},"up":true}},{"node":{"info":{"id":"b2b5ba1bb188f18f79b295f2c0d48c52c1d1d449ecb9b94b9984f3a6179732c7","name":"node_b2b5ba1bb188f18f79b295f2c0d48c52c1d1d449ecb9b94b9984f3a6179732c7","enode":"enode://d15330bc0ac2d05c53b502c8a5c9017e56f190332491742de058a920784f5ab943f482c2d1872603adc7d3bd42e77cb875434f3520ca93b47fe35a21fa62669a@127.0.0.1:0","enr":"0xf88fb840574761f8bb54fcd95cfa7b75775147cd15e5320d20cb64c70eda14db527c1ea24a6fde40dcbe9cd641f83d726c2d55878fbb2dfe0777ff514fd17b8bbfd106ee0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102d15330bc0ac2d05c53b502c8a5c9017e56f190332491742de058a920784f5ab9","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"srW6G7GI8Y95spXywNSMUsHR1EnsublLmYTzpheXMsc=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: b2b5ba\npopulation: 34 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 7 24b8 256e 07a8 1f85 | 146 0b72 (0) 0af9 (0) 0a00 (0) 0ff2 (0)\n001 9 ca04 c6cf c26f da67 | 63 d640 (0) d7ac (0) d1d7 (0) d3b0 (0)\n002 6 9076 96fc 976e 849b | 20 9852 (0) 9890 (0) 9d0f (0) 9fa0 (0)\n003 2 af02 a6fb | 10 ad98 (0) ac4d (0) aeb4 (0) ae2b (0)\n004 3 baf2 b95d b897 | 9 bcc6 (0) bb90 (0) ba88 (0) badd (0)\n005 5 b7ca b65e b626 b5b2 | 5 b7ca (0) b65e (0) b626 (0) b5b2 (0)\n============ DEPTH: 6 ==========================================\n006 1 b02b | 1 b02b (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 1 b2a5 | 1 b2a5 (0)\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"b2b5ba1bb188f18f79b295f2c0d48c52c1d1d449ecb9b94b9984f3a6179732c7","private_key":"6e70ae5c645585cea4f6e117e84118dcdc9efb654cc766a374ca297817172dc0","name":"node_b2b5ba1bb188f18f79b295f2c0d48c52c1d1d449ecb9b94b9984f3a6179732c7","services":["streamer"],"enable_msg_events":true,"port":33709},"up":true}},{"node":{"info":{"id":"fe2167fd33f383110eb3f6caa7bd905ca54fa0c810f1b8a34483a846f3cbddab","name":"node_fe2167fd33f383110eb3f6caa7bd905ca54fa0c810f1b8a34483a846f3cbddab","enode":"enode://efdfaaad939ceb845670e7c93e476a841dbc743aa1d3ba9836be214025381c0bf8fe8967634b433603fc4657ee30d1b0e860ac88f70406374d23c7b72532f3f5@127.0.0.1:0","enr":"0xf88fb8402b581c48bc9b046b1ac97ca1d73ba39bd09847eb3b4ccaee9cfb8cb46ef2d7393cde50a04a69fd36f4c6a06b66252d6372ff5781a97a9eba519a182ab6ff34ae0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103efdfaaad939ceb845670e7c93e476a841dbc743aa1d3ba9836be214025381c0b","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"/iFn/TPzgxEOs/bKp72QXKVPoMgQ8bijRIOoRvPL3as=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: fe2167\npopulation: 32 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 256e 1f85 574f | 146 0b72 (0) 0af9 (0) 0a00 (0) 0e5e (0)\n001 3 8025 b502 b2b5 | 47 9fa0 (0) 9d0f (0) 9852 (0) 9890 (0)\n002 7 d1d7 d299 da67 db6a | 26 d7ac (0) d640 (0) d1d7 (0) d3b0 (0)\n003 6 ed2d ee5e efea e5ad | 18 eb98 (0) e854 (0) e883 (0) e8ef (0)\n004 8 f2d5 f31c f773 f629 | 13 f31c (0) f27f (0) f2d5 (0) f629 (0)\n005 3 f925 fbf5 fbc8 | 3 f925 (0) fbf5 (0) fbc8 (0)\n============ DEPTH: 6 ==========================================\n006 0 | 0\n007 1 ff36 | 1 ff36 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 1 fe31 | 1 fe31 (0)\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"fe2167fd33f383110eb3f6caa7bd905ca54fa0c810f1b8a34483a846f3cbddab","private_key":"82f871774e58e78c4be095210436adb4fb35f177d17042837b069f1793339635","name":"node_fe2167fd33f383110eb3f6caa7bd905ca54fa0c810f1b8a34483a846f3cbddab","services":["streamer"],"enable_msg_events":true,"port":40051},"up":true}},{"node":{"info":{"id":"c26fd5e6504c7b3f0a6d9133ff87c98c110eb1c201c5f3bcf6b10653f2b972d2","name":"node_c26fd5e6504c7b3f0a6d9133ff87c98c110eb1c201c5f3bcf6b10653f2b972d2","enode":"enode://89a40b4828258a45ddffc2eeca354e23356b818fc965a12c6a7e026d0e8bf72b43c98d81e2fa73356eff0f6100ae19475e42fa933113c8767b13dd5b04b84f5a@127.0.0.1:0","enr":"0xf88fb840d5565171400508ba844253cef0a659a7007e98b0ea4ea1d3174005f982b12e0f5d79bc818df366da989fde409077401d9b95cabac335c1d33761dfb511833e550183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10289a40b4828258a45ddffc2eeca354e23356b818fc965a12c6a7e026d0e8bf72b","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"wm/V5lBMez8KbZEz/4fJjBEOscIBxfO89rEGU/K5ctI=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: c26fd5\npopulation: 37 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 1f85 67aa 77d2 574f | 146 0067 (0) 00c6 (0) 03cc (0) 0328 (0)\n001 6 96fc 976e 8025 82f9 | 47 ad98 (0) ac4d (0) ae2b (0) aeb4 (0)\n002 8 ed2d efea ee5e e547 | 37 eb98 (0) e854 (0) e883 (0) e8ef (0)\n003 7 da67 db6a d863 d640 | 11 d640 (0) d7ac (0) d1d7 (0) d3b0 (0)\n004 4 cc20 c898 caf6 ca04 | 6 cc20 (0) c9f5 (0) c832 (0) c898 (0)\n============ DEPTH: 5 ==========================================\n005 7 c49c c43f c441 c59e | 7 c786 (0) c620 (0) c6cf (0) c59e (0)\n006 1 c1f9 | 1 c1f9 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"c26fd5e6504c7b3f0a6d9133ff87c98c110eb1c201c5f3bcf6b10653f2b972d2","private_key":"736c6a6244885a1ad39fb0d125a7a2bf50d5515f38b1360dcf2c82a12f76fac5","name":"node_c26fd5e6504c7b3f0a6d9133ff87c98c110eb1c201c5f3bcf6b10653f2b972d2","services":["streamer"],"enable_msg_events":true,"port":39119},"up":true}},{"node":{"info":{"id":"574f65867482091aee2774033116c233525eea711706b5ae9ba09b54e896d302","name":"node_574f65867482091aee2774033116c233525eea711706b5ae9ba09b54e896d302","enode":"enode://5f9fe022355b31091330921e29c0ad61c9fdf8ee82f66c36fb03b2302f8fe2e3c32b931a30a66613a2c8f79c5788077e652cb6abdeeb0a330c9d264a8db6fad7@127.0.0.1:0","enr":"0xf88fb8404d529d52c3e76b4faa7d0a3bd82b1141a7a6c579aa512fc3f8a9d7d980c977a8626eb6d9c3351103f11cff3b7d222edf1f0c5c4b6ba304f2215882fc818b63bd0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1035f9fe022355b31091330921e29c0ad61c9fdf8ee82f66c36fb03b2302f8fe2e3","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"V09lhnSCCRruJ3QDMRbCM1Je6nEXBrWum6CbVOiW0wI=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 574f65\npopulation: 37 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 8 8025 b2b5 b502 f528 | 110 ad98 (0) ac4d (0) aeb4 (0) ae2b (0)\n001 4 256e 0d8a 07a8 1f85 | 76 0067 (0) 00c6 (0) 03cc (0) 0328 (0)\n002 7 7e04 7b90 7290 77d2 | 32 7dbb (0) 7dd3 (0) 7dc2 (0) 7e04 (0)\n003 9 4c9e 49cd 4a8b 44a1 | 23 4109 (0) 41d9 (0) 4559 (0) 4558 (0)\n004 2 5823 5b63 | 7 5cd2 (0) 5db0 (0) 5f00 (0) 5efb (0)\n============ DEPTH: 5 ==========================================\n005 7 51db 512e 5308 534b | 7 51db (0) 512e (0) 5308 (0) 534b (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"574f65867482091aee2774033116c233525eea711706b5ae9ba09b54e896d302","private_key":"d229f5b69bcdd60b64b4dbd3bbb0d8f06e4ce741c0ef2df9ccf7efa269b788e6","name":"node_574f65867482091aee2774033116c233525eea711706b5ae9ba09b54e896d302","services":["streamer"],"enable_msg_events":true,"port":34895},"up":true}},{"node":{"info":{"id":"db6a1f6b342f6be9517f8df01003797c11c837d9aee3cdba5b7859230b36c35d","name":"node_db6a1f6b342f6be9517f8df01003797c11c837d9aee3cdba5b7859230b36c35d","enode":"enode://5eafc16cce4d7660bd2fbb314e96cc2cf9eb8ea56939776d7278b6d59cc46da7f9bd3236f1171a955cf401d05ba08861cadec21cd434a8fb1be4d95ba9e8334a@127.0.0.1:0","enr":"0xf88fb8405f6b3f6d51114a126675f72d0b280db019f6e5068b71d72e5a522e4083436c64689a304c802a95d836e8f5e273f123dba269e9df3e99b8b9760e25b4fef30abc0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1025eafc16cce4d7660bd2fbb314e96cc2cf9eb8ea56939776d7278b6d59cc46da7","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"22ofazQva+lRf43wEAN5fBHIN9mu4826W3hZIws2w10=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: db6a1f\npopulation: 33 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 1f85 256e 574f | 146 0b72 (0) 0af9 (0) 0a00 (0) 0fc5 (0)\n001 5 b2b5 b502 976e 82f9 | 47 9890 (0) 9852 (0) 9d0f (0) 9fa0 (0)\n002 8 ed2d ee5e e7fa e547 | 37 eb98 (0) e854 (0) e883 (0) e8ef (0)\n003 7 c9f5 caf6 ca04 c26f | 15 cc20 (0) c9f5 (0) c832 (0) c898 (0)\n004 5 d7ac d640 d3b0 d299 | 5 d640 (0) d7ac (0) d1d7 (0) d3b0 (0)\n005 1 df1e | 1 df1e (0)\n006 2 d887 d863 | 2 d887 (0) d863 (0)\n============ DEPTH: 7 ==========================================\n007 2 daec da67 | 2 daec (0) da67 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"db6a1f6b342f6be9517f8df01003797c11c837d9aee3cdba5b7859230b36c35d","private_key":"dfd2fca92d5a4f222ac845159014d664d54ea1f9b33035068dc1f2572296fc46","name":"node_db6a1f6b342f6be9517f8df01003797c11c837d9aee3cdba5b7859230b36c35d","services":["streamer"],"enable_msg_events":true,"port":39263},"up":true}},{"node":{"info":{"id":"c43fbee95380007274b8f231fe34bcd59b5c0ef0830b174967d4702627984fc6","name":"node_c43fbee95380007274b8f231fe34bcd59b5c0ef0830b174967d4702627984fc6","enode":"enode://3fc6aafc24fea946b6e17b7a684b14df9e9eb28514b7332fa30fd325816de5cc8cc49b992cd85f654a3fac88deea0804c52317cc6de693cd9f057f26fddb4c5a@127.0.0.1:0","enr":"0xf88fb840f87236d325dbf8011e68c5678b19ce6e8c0f1f66642a6a0af4028d2d16dc012e4d16b88c631287a65df9c7a7cc2267c8da224e6c804be3d605675c79e68988940183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1023fc6aafc24fea946b6e17b7a684b14df9e9eb28514b7332fa30fd325816de5cc","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"xD++6VOAAHJ0uPIx/jS81ZtcDvCDCxdJZ9RwJieYT8Y=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: c43fbe\npopulation: 34 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 7 1400 0d8a 77d2 7290 | 146 00c6 (0) 0067 (0) 03cc (0) 0328 (0)\n001 4 976e 8025 82f9 b502 | 47 9890 (0) 9852 (0) 9d0f (0) 9fa0 (0)\n002 8 efea ee5e ed2d e027 | 37 ef07 (0) ef1b (0) efea (0) ee5e (0)\n003 5 d7ac d1d7 d299 da67 | 11 d640 (0) d7ac (0) d1d7 (0) d3b0 (0)\n004 2 caf6 ca04 | 6 cc20 (0) c9f5 (0) c898 (0) c832 (0)\n005 2 c26f c1f9 | 2 c1f9 (0) c26f (0)\n006 3 c6cf c620 c786 | 3 c786 (0) c620 (0) c6cf (0)\n007 1 c59e | 1 c59e (0)\n============ DEPTH: 8 ==========================================\n008 1 c49c | 1 c49c (0)\n009 1 c441 | 1 c441 (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"c43fbee95380007274b8f231fe34bcd59b5c0ef0830b174967d4702627984fc6","private_key":"6be49afc08c546676c011c401073a17e9b8840fa9edd1182f255e19073662d73","name":"node_c43fbee95380007274b8f231fe34bcd59b5c0ef0830b174967d4702627984fc6","services":["streamer"],"enable_msg_events":true,"port":46219},"up":true}},{"node":{"info":{"id":"b5025d153581d333b44df4b9bfa69d87de138905172e4fd317e16f7099a5fcf8","name":"node_b5025d153581d333b44df4b9bfa69d87de138905172e4fd317e16f7099a5fcf8","enode":"enode://9d7d6722f1a51680a6f8affc6d1a10ede4ab4b4aa4ae1a4d406eec85c93875f1def190fdb2692f50153e62406fba95d939b2ca56910888b306eb3c9d50d76250@127.0.0.1:0","enr":"0xf88fb840beb0423e5654bf643406b5a5c35aa97675d9d7c3fef9bb2ddf7a0bfdb63b17b24b0224e5c5a31332fdc59e32c64eea5e59861707e1baa864e3e439cd273fcd430183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1029d7d6722f1a51680a6f8affc6d1a10ede4ab4b4aa4ae1a4d406eec85c93875f1","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"tQJdFTWB0zO0TfS5v6adh94TiQUXLk/TF+FvcJml/Pg=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: b5025d\npopulation: 36 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 9 24b8 67aa 77d2 7290 | 146 3f94 (0) 3efc (0) 3ec5 (0) 3e8e (0)\n001 9 e5ad efea fe21 f4e0 | 63 eb98 (0) e854 (0) e883 (0) e8ef (0)\n002 6 88fe 849b 8025 82f9 | 20 9852 (0) 9890 (0) 9fa0 (0) 9d0f (0)\n003 3 a6fb a653 af02 | 10 ad98 (0) ac4d (0) ae2b (0) aeb4 (0)\n004 3 baf2 b95d b897 | 9 bcc6 (0) bb90 (0) ba88 (0) badd (0)\n005 2 b2a5 b2b5 | 3 b02b (0) b2a5 (0) b2b5 (0)\n============ DEPTH: 6 ==========================================\n006 3 b7ca b65e b626 | 3 b7ca (0) b65e (0) b626 (0)\n007 0 | 0\n008 1 b5b2 | 1 b5b2 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"b5025d153581d333b44df4b9bfa69d87de138905172e4fd317e16f7099a5fcf8","private_key":"3a7659e35466d850264b95d5726e83847b52c4fe2ef8e76a5feac0100809deb4","name":"node_b5025d153581d333b44df4b9bfa69d87de138905172e4fd317e16f7099a5fcf8","services":["streamer"],"enable_msg_events":true,"port":45515},"up":true}},{"node":{"info":{"id":"f528aaafd67b20dafdce101db224aa01c70f93bdc91c14f50fa8db1dbf9fc386","name":"node_f528aaafd67b20dafdce101db224aa01c70f93bdc91c14f50fa8db1dbf9fc386","enode":"enode://9684e28e4a62f154f17f11253fb9011cc96e2d0d4ba400d12cf1b503cf26af50e7a8bf6e7f70c1536728100d6130ed58e2df364130255fbebe0d5d04b1fd70ed@127.0.0.1:0","enr":"0xf88fb8402dba0c34158122d8574a009ad32db3fe3e685cb1ca434ffbb06840fdc6eedf0918916d137d709bfd379a9142fb8a368674eaa6a9069a88209fb456b34b32b26d0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1039684e28e4a62f154f17f11253fb9011cc96e2d0d4ba400d12cf1b503cf26af50","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"9Siqr9Z7INr9zhAdsiSqAccPk73JHBT1D6jbHb+fw4Y=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: f528aa\npopulation: 35 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 574f 49cd 67aa 7290 | 146 3f94 (0) 3e8e (0) 3ec5 (0) 3efc (0)\n001 3 b502 82f9 976e | 47 ad98 (0) ac4d (0) aeb4 (0) ae2b (0)\n002 5 db6a da67 ca04 c26f | 26 d1d7 (0) d3b0 (0) d299 (0) d640 (0)\n003 7 ed2d efea e8ef e027 | 18 ee5e (0) ef1b (0) ef07 (0) efea (0)\n004 5 fbc8 fbf5 ff36 fe31 | 6 f925 (0) fbf5 (0) fbc8 (0) ff36 (0)\n005 3 f31c f27f f2d5 | 3 f31c (0) f27f (0) f2d5 (0)\n006 3 f629 f7fa f773 | 4 f629 (0) f7ba (0) f7fa (0) f773 (0)\n007 3 f4e0 f45f f456 | 3 f456 (0) f45f (0) f4e0 (0)\n============ DEPTH: 8 ==========================================\n008 2 f5b2 f5dc | 2 f5b2 (0) f5dc (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"f528aaafd67b20dafdce101db224aa01c70f93bdc91c14f50fa8db1dbf9fc386","private_key":"0074e098350248a953ff96635c5646441ade6fbfa6928e7e7750f648e3b500ee","name":"node_f528aaafd67b20dafdce101db224aa01c70f93bdc91c14f50fa8db1dbf9fc386","services":["streamer"],"enable_msg_events":true,"port":43141},"up":true}},{"node":{"info":{"id":"976e57d0c32227222bfd0cbb802f269bdcd52d5d33cf689c66b12c023f5fa8bf","name":"node_976e57d0c32227222bfd0cbb802f269bdcd52d5d33cf689c66b12c023f5fa8bf","enode":"enode://f1a481f05b3add0348b325714cd13f8a882a8d2b664914693d9941f93594ca157866eea0d82ebc7cb2fe170adeff113230c00d363f046910cd52ab0d55492ebe@127.0.0.1:0","enr":"0xf88fb84014a108662ac31a996bb4e33b0cf7555059548c4001a3ef8a193d8466ea9d19560d11b9724d49c733a3cb7a33e6b586c3c1e7d29b5cfaec3a6ae783fc8cdd11100183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102f1a481f05b3add0348b325714cd13f8a882a8d2b664914693d9941f93594ca15","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"l25X0MMiJyIr/Qy7gC8mm9zVLV0zz2icZrEsAj9fqL8=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 976e57\npopulation: 32 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 7 512e 4558 46fe 4782 | 146 3f94 (0) 3e8e (0) 3ec5 (0) 3efc (0)\n001 7 ca04 c26f c786 c43f | 63 d1d7 (0) d3b0 (0) d299 (0) d640 (0)\n002 4 b2b5 b626 b5b2 b502 | 27 aeb4 (0) ae2b (0) af02 (0) ad98 (0)\n003 5 898d 88fe 849b 8025 | 10 8f21 (0) 898d (0) 886a (0) 88a1 (0)\n004 4 9852 9890 9fa0 9d0f | 4 9852 (0) 9890 (0) 9fa0 (0) 9d0f (0)\n005 3 90a8 9076 915d | 3 90a8 (0) 9076 (0) 915d (0)\n============ DEPTH: 6 ==========================================\n006 1 959f | 1 959f (0)\n007 1 96fc | 1 96fc (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"976e57d0c32227222bfd0cbb802f269bdcd52d5d33cf689c66b12c023f5fa8bf","private_key":"773efb429c0f38acad55b6036ac34ae481afe60385254d46a9bde06da2cb9688","name":"node_976e57d0c32227222bfd0cbb802f269bdcd52d5d33cf689c66b12c023f5fa8bf","services":["streamer"],"enable_msg_events":true,"port":34309},"up":true}},{"node":{"info":{"id":"7290cd3affade5f9e729d1b03549aceafb2576cdbc6789fd688c95495f10bacd","name":"node_7290cd3affade5f9e729d1b03549aceafb2576cdbc6789fd688c95495f10bacd","enode":"enode://5a17da2705e5b0debd1d99553696c4a5bbafb01aed9d25a59cc3138327b93cab177c0bcf0e776be1303d3ff5f00776f20c7014e244b21f403862867c778811b7@127.0.0.1:0","enr":"0xf88fb840e597671ce4248b4b2e417ca6323a8a567e7ef2d7410a33b01a359dbd7ecb815c2d88ee75860442c11680c729d27a72df1fb9720fae553a7935ef2d26436f68190183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1035a17da2705e5b0debd1d99553696c4a5bbafb01aed9d25a59cc3138327b93cab","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"cpDNOv+t5fnnKdGwNUms6vslds28Z4n9aIyVSV8Qus0=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 7290cd\npopulation: 32 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 c43f da67 f528 b502 | 110 cc20 (0) c9f5 (0) c832 (0) c898 (0)\n001 3 02d8 0d8a 1400 | 76 3f94 (0) 3e8e (0) 3efc (0) 3ec5 (0)\n002 9 5b63 53a8 574f 4558 | 38 51db (0) 512e (0) 524d (0) 5308 (0)\n003 5 6ecb 6fe9 6337 60d7 | 20 6967 (0) 6831 (0) 6c73 (0) 6c4d (0)\n004 5 7e04 7dd3 7dc2 7b90 | 7 7e04 (0) 7dbb (0) 7dd3 (0) 7dc2 (0)\n005 2 775e 77d2 | 2 775e (0) 77d2 (0)\n============ DEPTH: 6 ==========================================\n006 1 7125 | 1 7125 (0)\n007 1 738c | 1 738c (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"7290cd3affade5f9e729d1b03549aceafb2576cdbc6789fd688c95495f10bacd","private_key":"c64631a1d6a68b8a5627d9020f3e5b7139f946885d83e07bc5704da66d3166c7","name":"node_7290cd3affade5f9e729d1b03549aceafb2576cdbc6789fd688c95495f10bacd","services":["streamer"],"enable_msg_events":true,"port":41897},"up":true}},{"node":{"info":{"id":"82f9c9009f09de2d6a77b54976d14c14211eae65d886f6ed57560c700716dd5c","name":"node_82f9c9009f09de2d6a77b54976d14c14211eae65d886f6ed57560c700716dd5c","enode":"enode://491601ffb74c3a9ebf3de209bc241d4c92ac22845e14acc401f895473f0bc655a9cfea75088a8c844eb406d545723ae828d2f12c500b0b54af2dd1fa476fb492@127.0.0.1:0","enr":"0xf88fb8403595298556b2fc3d72aad1199b8884bb4964f0329c3e542b25cdb97b44aa51647ad064f3bb12519401f2d5e1a205f0437711a1a9ae0d7ced24515e75874358490183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102491601ffb74c3a9ebf3de209bc241d4c92ac22845e14acc401f895473f0bc655","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"gvnJAJ8J3i1qd7VJdtFMFCEermXYhvbtV1YMcAcW3Vw=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 82f9c9\npopulation: 30 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 4558 4a8b 49cd 67aa | 146 3f94 (0) 3e8e (0) 3ec5 (0) 3efc (0)\n001 6 ca04 c26f c43f db6a | 63 cc20 (0) c9f5 (0) c832 (0) c898 (0)\n002 5 a6fb b2b5 b626 b5b2 | 27 ad98 (0) ac4d (0) aeb4 (0) ae2b (0)\n003 6 9d0f 9fa0 915d 959f | 10 9890 (0) 9852 (0) 9d0f (0) 9fa0 (0)\n004 4 8f21 898d 886a 88fe | 5 8f21 (0) 898d (0) 886a (0) 88a1 (0)\n005 2 8505 849b | 2 8505 (0) 849b (0)\n============ DEPTH: 6 ==========================================\n006 1 8025 | 1 8025 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 1 82dd | 1 82dd (0)\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"82f9c9009f09de2d6a77b54976d14c14211eae65d886f6ed57560c700716dd5c","private_key":"0ef1f1623ac066de7c84777cf3fdec022dd693c8afd056e66d11862de46a6b46","name":"node_82f9c9009f09de2d6a77b54976d14c14211eae65d886f6ed57560c700716dd5c","services":["streamer"],"enable_msg_events":true,"port":35447},"up":true}},{"node":{"info":{"id":"67aa5463e4b32b363b3d01d2a41ccb03199411057276f4962d053160be29a6ef","name":"node_67aa5463e4b32b363b3d01d2a41ccb03199411057276f4962d053160be29a6ef","enode":"enode://df05a5d2153d7fb7c457936ec0e15ff559604a97443ea6452b72f52f0bf4f7141b33e639ea57beeef6f9a66105875690ff4b2ab4747566fd982574190e3de8ad@127.0.0.1:0","enr":"0xf88fb840a795f4ec6f1fdb826e6b2093cab7198649eb34d52ca4b62ce368e45ac4faa1f528a90244e6f7e816652c6b385873781f7c5100d927d40bba2c80f904ae4bfe140183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103df05a5d2153d7fb7c457936ec0e15ff559604a97443ea6452b72f52f0bf4f714","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"Z6pUY+SzKzY7PQHSpBzLAxmUEQVydvSWLQUxYL4ppu8=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 67aa54\npopulation: 36 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 f528 c26f c43f da67 | 110 ef1b (0) ef07 (0) efea (0) ee5e (0)\n001 5 256e 30be 02d8 0d8a | 76 2995 (0) 2a97 (0) 2abb (0) 2a0a (0)\n002 7 524d 53a8 574f 44a1 | 38 574f (0) 524d (0) 5308 (0) 534b (0)\n003 4 7a60 7b90 77d2 7290 | 12 7dd3 (0) 7dc2 (0) 7dbb (0) 7e04 (0)\n004 7 6831 6967 6c4d 6ea5 | 11 6831 (0) 6967 (0) 6c73 (0) 6c4d (0)\n005 5 6337 6251 628e 6103 | 6 628e (0) 6251 (0) 6337 (0) 6103 (0)\n============ DEPTH: 6 ==========================================\n006 0 | 0\n007 1 66e7 | 1 66e7 (0)\n008 0 | 0\n009 1 67dc | 1 67dc (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"67aa5463e4b32b363b3d01d2a41ccb03199411057276f4962d053160be29a6ef","private_key":"b796ff6a7ea6c2ded46cda26187abc9f36f967d9926239cfadb31eb97c349ca6","name":"node_67aa5463e4b32b363b3d01d2a41ccb03199411057276f4962d053160be29a6ef","services":["streamer"],"enable_msg_events":true,"port":41807},"up":true}},{"node":{"info":{"id":"49cd1efed6a56a78af4ea4ab40813013e76c6a5fb9d2029ee02db5d80f5e41a6","name":"node_49cd1efed6a56a78af4ea4ab40813013e76c6a5fb9d2029ee02db5d80f5e41a6","enode":"enode://3c3dd1934b208eb8c478606579f8392337b4793113196b083d2ab9599f30a2217b82e47b41b2446956ef7bc98a5c7017010d405e89625cfaa7ec82503202e598@127.0.0.1:0","enr":"0xf88fb840bef6e7ddcbe9097f31c066f2007867456dac705bcafc0d983fafa95339cf22cf0dbe62c98d695ab072cf52a83210e68e4ccd1ae28c315d504b31c18875a7a6280183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1023c3dd1934b208eb8c478606579f8392337b4793113196b083d2ab9599f30a221","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"Sc0e/talanivTqSrQIEwE+dsal+50gKe4C212A9eQaY=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 49cd1e\npopulation: 41 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 c43f ca04 f528 b502 | 110 ad98 (0) ac4d (0) ae2b (0) aeb4 (0)\n001 10 30be 378e 3780 3b88 | 76 2995 (0) 2a97 (0) 2abb (0) 2a0a (0)\n002 4 7b90 7290 60d7 67aa | 32 7dd3 (0) 7dc2 (0) 7dbb (0) 7e04 (0)\n003 5 512e 53a8 574f 5f00 | 15 574f (0) 524d (0) 5308 (0) 534b (0)\n004 8 4447 44a1 4559 4558 | 12 4109 (0) 41d9 (0) 44a1 (0) 4447 (0)\n005 3 4e5a 4c9e 4d6b | 5 4e5a (0) 4d10 (0) 4d59 (0) 4d6b (0)\n006 3 4bcf 4ac7 4a8b | 3 4bcf (0) 4ac7 (0) 4a8b (0)\n============ DEPTH: 7 ==========================================\n007 0 | 0\n008 0 | 0\n009 1 4990 | 1 4990 (0)\n010 1 49ea | 1 49ea (0)\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"49cd1efed6a56a78af4ea4ab40813013e76c6a5fb9d2029ee02db5d80f5e41a6","private_key":"563539e7699dfba87188db2ed5bd0040cfa037d5206f5a9aea1126ba8152310e","name":"node_49cd1efed6a56a78af4ea4ab40813013e76c6a5fb9d2029ee02db5d80f5e41a6","services":["streamer"],"enable_msg_events":true,"port":41057},"up":true}},{"node":{"info":{"id":"46fee69dad8b6a6a87d356d10db25d835a0c4e154bf179e88fb4cc65f97d72d7","name":"node_46fee69dad8b6a6a87d356d10db25d835a0c4e154bf179e88fb4cc65f97d72d7","enode":"enode://a0de85bf37f6c9a5f3721d82e07290b2aff2e6a485e2f5ddf83375faa1ce9e2d017ddc7b100b4380ed76cfdecc7b264e3c387ea994ae3e04084de10b9ce0debe@127.0.0.1:0","enr":"0xf88fb840a6baf80ae45dad3d244387e2e3306969fc26628f3f7f6d0c4db267ea2c532b6b2afab9ca8d89a8c3e90d540e1ddff77ea90e5a57af1485e6cdf579d33d54d8990183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102a0de85bf37f6c9a5f3721d82e07290b2aff2e6a485e2f5ddf83375faa1ce9e2d","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"Rv7mna2LamqH01bRDbJdg1oMThVL8Xnoj7TMZfl9ctc=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 46fee6\npopulation: 31 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 b502 976e ca04 da67 | 110 ad98 (0) ac4d (0) aeb4 (0) ae2b (0)\n001 3 0d8a 1b83 1400 | 76 2995 (0) 2a97 (0) 2abb (0) 2a0a (0)\n002 6 7290 7a60 7b90 6fe9 | 32 6967 (0) 6831 (0) 6c73 (0) 6c4d (0)\n003 4 5b63 574f 53a8 512e | 15 574f (0) 524d (0) 5308 (0) 534b (0)\n004 3 4ac7 4a8b 49cd | 11 4e5a (0) 4d10 (0) 4d59 (0) 4d6b (0)\n005 2 4109 41d9 | 2 4109 (0) 41d9 (0)\n006 4 4447 44a1 4559 4558 | 4 44a1 (0) 4447 (0) 4559 (0) 4558 (0)\n007 2 47bf 4782 | 2 47bf (0) 4782 (0)\n============ DEPTH: 8 ==========================================\n008 3 4646 461c 4636 | 3 4646 (0) 461c (0) 4636 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"46fee69dad8b6a6a87d356d10db25d835a0c4e154bf179e88fb4cc65f97d72d7","private_key":"6fc017c68b2b6d1e4693c27cfaf816ee8b7e583f9c28e3236413cc80fef9a431","name":"node_46fee69dad8b6a6a87d356d10db25d835a0c4e154bf179e88fb4cc65f97d72d7","services":["streamer"],"enable_msg_events":true,"port":44839},"up":true}},{"node":{"info":{"id":"4a8b610e09d35aa21c42ab8c3e38de600a944c094e6b86ea56828b5e6904f1f7","name":"node_4a8b610e09d35aa21c42ab8c3e38de600a944c094e6b86ea56828b5e6904f1f7","enode":"enode://de5cedf56d1615e739c3b5ca058d2eea156785daef1c7f6e902c2bff170ea20cf2d7bbb3675b4e578abc41a540756f95f3737dc19ebd04edabd1f16878ff499b@127.0.0.1:0","enr":"0xf88fb840020d593599f4d4fdd4b673eaa585fd98665cc182ed5584ba2d601525f0a039d052b21ad75071dad2b20f02fc88ac764fb23d96be4848d01c42922b552755b01d0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103de5cedf56d1615e739c3b5ca058d2eea156785daef1c7f6e902c2bff170ea20c","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"SothDgnTWqIcQquMPjjeYAqUTAlOa4bqVoKLXmkE8fc=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 4a8b61\npopulation: 31 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 b502 976e 82f9 da67 | 110 ad98 (0) ac4d (0) aeb4 (0) ae2b (0)\n001 2 0d8a 1400 | 76 2995 (0) 2a97 (0) 2abb (0) 2a0a (0)\n002 5 60d7 7b90 7a60 77d2 | 32 7dbb (0) 7dd3 (0) 7dc2 (0) 7e04 (0)\n003 4 512e 53a8 574f 5b63 | 15 574f (0) 524d (0) 5308 (0) 534b (0)\n004 8 4447 44a1 4559 4558 | 12 41d9 (0) 4109 (0) 44a1 (0) 4447 (0)\n005 2 4d6b 4c9e | 5 4e5a (0) 4c9e (0) 4d10 (0) 4d59 (0)\n006 3 4990 49ea 49cd | 3 4990 (0) 49ea (0) 49cd (0)\n============ DEPTH: 7 ==========================================\n007 1 4bcf | 1 4bcf (0)\n008 0 | 0\n009 1 4ac7 | 1 4ac7 (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"4a8b610e09d35aa21c42ab8c3e38de600a944c094e6b86ea56828b5e6904f1f7","private_key":"3deb6c6e230a0dae4c0fedc0272e1053d1abd2a0db710d50aef93887fa30a915","name":"node_4a8b610e09d35aa21c42ab8c3e38de600a944c094e6b86ea56828b5e6904f1f7","services":["streamer"],"enable_msg_events":true,"port":46571},"up":true}},{"node":{"info":{"id":"478278187cd9af799e83340a2f49b0b7f122fb8e08c0a372a87795426eab364b","name":"node_478278187cd9af799e83340a2f49b0b7f122fb8e08c0a372a87795426eab364b","enode":"enode://8fccdf07a7c9e466c0b785b6e7c08ab0f94389a6dd46b9a57854589a96a603e97aa8de47419c1d494b354330e85090d9c6caaeb9c4b9569614ed744bb18a812d@127.0.0.1:0","enr":"0xf88fb8405875381eb6fee735b5b8a7f7d40d20b341a0100ea48efe8538f28a4f40cd5a1323c240cd86add212d1642a4178d5f89048e6a9c2ddb9ff519e8baacfeffa0bbc0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1038fccdf07a7c9e466c0b785b6e7c08ab0f94389a6dd46b9a57854589a96a603e9","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"R4J4GHzZr3megzQKL0mwt/Ei+44IwKNyqHeVQm6rNks=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 478278\npopulation: 24 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 b502 976e da67 | 110 ac4d (0) ad98 (0) af02 (0) aeb4 (0)\n001 2 1400 0d8a | 76 2995 (0) 2a0a (0) 2a97 (0) 2abb (0)\n002 2 7290 60d7 | 32 775e (0) 77d2 (0) 7125 (0) 738c (0)\n003 4 5b63 574f 53a8 512e | 15 574f (0) 524d (0) 5308 (0) 534b (0)\n004 2 49cd 4a8b | 11 4e5a (0) 4d10 (0) 4d59 (0) 4d6b (0)\n005 2 4109 41d9 | 2 4109 (0) 41d9 (0)\n006 4 4447 44a1 4559 4558 | 4 44a1 (0) 4447 (0) 4559 (0) 4558 (0)\n============ DEPTH: 7 ==========================================\n007 4 4646 461c 4636 46fe | 4 4646 (0) 461c (0) 4636 (0) 46fe (0)\n008 0 | 0\n009 0 | 0\n010 1 47bf | 1 47bf (0)\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"478278187cd9af799e83340a2f49b0b7f122fb8e08c0a372a87795426eab364b","private_key":"7134099c68806e422529987394e8a1ad8f242e3afdeaae1cbfc9502144f217d7","name":"node_478278187cd9af799e83340a2f49b0b7f122fb8e08c0a372a87795426eab364b","services":["streamer"],"enable_msg_events":true,"port":34389},"up":true}},{"node":{"info":{"id":"da67ace34f7076a1d550bc61bc2a31da88d6cd9f9df43b142a8c6bbade1b4aee","name":"node_da67ace34f7076a1d550bc61bc2a31da88d6cd9f9df43b142a8c6bbade1b4aee","enode":"enode://09c17ada4739980768a07f0c58b53d5a85809644bfc0eec14c46c61dc3e49b9b0464027601e91df63272219003508fbadb50af0b1e50cbf277df9393cf564a43@127.0.0.1:0","enr":"0xf88fb84026df424d93a356c6547f1236e5f3bcc0d324405bae4298855c59614f051e780b5a8e7f8b31e16a6c03c68c5b14c7f57b56aeec3423be94288bd6122dc84744bf0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10309c17ada4739980768a07f0c58b53d5a85809644bfc0eec14c46c61dc3e49b9b","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"2mes409wdqHVULxhvCox2ojWzZ+d9DsUKoxrut4bSu4=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: da67ac\npopulation: 35 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 10 02d8 0d8a 1400 7290 | 146 2995 (0) 2a97 (0) 2abb (0) 2a0a (0)\n001 3 b2b5 976e 82f9 | 47 ad98 (0) ac4d (0) ae2b (0) aeb4 (0)\n002 6 e547 ed2d e8ef fe21 | 37 ee5e (0) ef1b (0) ef07 (0) efea (0)\n003 7 c26f c59e c43f c49c | 15 c1f9 (0) c26f (0) c620 (0) c6cf (0)\n004 4 d1d7 d299 d7ac d640 | 5 d1d7 (0) d3b0 (0) d299 (0) d640 (0)\n005 1 df1e | 1 df1e (0)\n006 2 d887 d863 | 2 d887 (0) d863 (0)\n============ DEPTH: 7 ==========================================\n007 1 db6a | 1 db6a (0)\n008 1 daec | 1 daec (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"da67ace34f7076a1d550bc61bc2a31da88d6cd9f9df43b142a8c6bbade1b4aee","private_key":"fe594383342620bd1c9a63e85f0d89178817a1ee319e2ae87883c4ea5095460e","name":"node_da67ace34f7076a1d550bc61bc2a31da88d6cd9f9df43b142a8c6bbade1b4aee","services":["streamer"],"enable_msg_events":true,"port":38619},"up":true}},{"node":{"info":{"id":"ca041da0dc514643d017458d08ff6962ec52c9e66571a239ec395dc8b2546709","name":"node_ca041da0dc514643d017458d08ff6962ec52c9e66571a239ec395dc8b2546709","enode":"enode://314cf099608d4d93ba78e270ccccdc14e79ba93f1a35a21f22026b5185704dac75d3be0c47fa7ec804e43c36778fa2465de371bc88b65f0fe0fe7a20fcad4d41@127.0.0.1:0","enr":"0xf88fb840991f1a646d5b8c7b7ac450787d726b85d140b857b28b860546b9845b01192b1d33b0a9e2e8c65650934640d7cfda928a758c700c424697626a27fb804accd7f70183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103314cf099608d4d93ba78e270ccccdc14e79ba93f1a35a21f22026b5185704dac","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"ygQdoNxRRkPQF0WNCP9pYuxSyeZlcaI57DldyLJUZwk=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: ca041d\npopulation: 36 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 7 1400 02d8 0d8a 46fe | 146 2a97 (0) 2abb (0) 2a0a (0) 2995 (0)\n001 7 82f9 976e baf2 b2b5 | 47 ad98 (0) ac4d (0) aeb4 (0) ae2b (0)\n002 4 e547 e5ad f4e0 f528 | 37 fbf5 (0) fbc8 (0) f925 (0) ff36 (0)\n003 5 d299 d7ac d640 db6a | 11 d1d7 (0) d3b0 (0) d299 (0) d640 (0)\n004 8 c6cf c786 c59e c49c | 9 c1f9 (0) c26f (0) c59e (0) c49c (0)\n005 1 cc20 | 1 cc20 (0)\n============ DEPTH: 6 ==========================================\n006 3 c9f5 c832 c898 | 3 c9f5 (0) c832 (0) c898 (0)\n007 0 | 0\n008 1 caf6 | 1 caf6 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"ca041da0dc514643d017458d08ff6962ec52c9e66571a239ec395dc8b2546709","private_key":"9cc996c03300b4fbea17d12fdd08e09b69c5fb6285146a6ba449e039c93eb995","name":"node_ca041da0dc514643d017458d08ff6962ec52c9e66571a239ec395dc8b2546709","services":["streamer"],"enable_msg_events":true,"port":43867},"up":true}},{"node":{"info":{"id":"60d7337ef806be95ccaf7b9d663a4289f9afc68edced62904ab50601cf113f45","name":"node_60d7337ef806be95ccaf7b9d663a4289f9afc68edced62904ab50601cf113f45","enode":"enode://a14e22f8e8c82419c10076d96cdbe472237999f2149eee60543d344bb340cc0aba0065b6d152c59b8c5e95b6c85aad12133aa728af74492d114c66589b78a993@127.0.0.1:0","enr":"0xf88fb8408bf40ac90d17fcdb8b9194819add563ad27402ad5360ee89d31cd70ecae375697c825f76d7f9ff1386c1f4effce6a27828d685ca5f67dbdbdeffb230ebac73700183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103a14e22f8e8c82419c10076d96cdbe472237999f2149eee60543d344bb340cc0a","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"YNczfvgGvpXMr3udZjpCifmvxo7c7WKQSrUGAc8RP0U=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 60d733\npopulation: 31 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 e547 e5ad da67 ca04 | 110 ad98 (0) ac4d (0) aeb4 (0) ae2b (0)\n001 3 1b83 1400 0d8a | 76 2995 (0) 2a97 (0) 2abb (0) 2a0a (0)\n002 7 512e 5b63 4a8b 49cd | 38 574f (0) 524d (0) 5308 (0) 534b (0)\n003 4 77d2 7290 7a60 7b90 | 12 775e (0) 77d2 (0) 7125 (0) 738c (0)\n004 6 6c73 6c4d 6ea5 6e05 | 11 6967 (0) 6831 (0) 6c73 (0) 6c4d (0)\n005 2 66e7 67aa | 3 66e7 (0) 67dc (0) 67aa (0)\n006 3 6337 628e 6251 | 3 6337 (0) 628e (0) 6251 (0)\n============ DEPTH: 7 ==========================================\n007 1 6103 | 1 6103 (0)\n008 1 605a | 1 605a (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"60d7337ef806be95ccaf7b9d663a4289f9afc68edced62904ab50601cf113f45","private_key":"d865723cac5fd73301f42e8bd68cfc9378898c91568207d80b7594237cbee540","name":"node_60d7337ef806be95ccaf7b9d663a4289f9afc68edced62904ab50601cf113f45","services":["streamer"],"enable_msg_events":true,"port":37363},"up":true}},{"node":{"info":{"id":"0d8a919207fb2d5718eab7da95f8efeb01a4e1ae39602d315f8ba2ff1752d9da","name":"node_0d8a919207fb2d5718eab7da95f8efeb01a4e1ae39602d315f8ba2ff1752d9da","enode":"enode://9f72dc03cfdcb02e051151d117994d208c6b1accb3fa75fd4c8f6973b90760fa21a742f873bbdd6abb98b45feab218b475d88600d83f3e155c0cd3a2bc8cd8e0@127.0.0.1:0","enr":"0xf88fb8401d3b8aa52b102a17d0ec1a0fbb92d0c4d45b8c64280e68a6de5c10d42ac23c57363fb8dd32efeb83e9578e85d240b6e9e6cb00753baf3d5a7877201720e406c60183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1029f72dc03cfdcb02e051151d117994d208c6b1accb3fa75fd4c8f6973b90760fa","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"DYqRkgf7LVcY6rfalfjv6wGk4a45YC0xX4ui/xdS2do=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 0d8a91\npopulation: 37 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 e547 da67 c43f ca04 | 110 aeb4 (0) ae2b (0) af02 (0) ad98 (0)\n001 12 53a8 574f 5b63 49cd | 70 574f (0) 524d (0) 534b (0) 5308 (0)\n002 4 256e 2ccf 3780 30be | 32 21a0 (0) 2101 (0) 217f (0) 20ae (0)\n003 4 1c8a 1f85 1b83 1400 | 22 1c47 (0) 1c9c (0) 1c8a (0) 1e2a (0)\n004 4 0438 0743 07a8 02d8 | 11 045b (0) 0451 (0) 0438 (0) 0661 (0)\n005 2 0af9 0b72 | 3 0b72 (0) 0a00 (0) 0af9 (0)\n006 3 0e5e 0fc5 0ff2 | 3 0e5e (0) 0fc5 (0) 0ff2 (0)\n============ DEPTH: 7 ==========================================\n007 3 0cf5 0c64 0c28 | 3 0cf5 (0) 0c64 (0) 0c28 (0)\n008 0 | 0\n009 1 0de3 | 1 0de3 (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"0d8a919207fb2d5718eab7da95f8efeb01a4e1ae39602d315f8ba2ff1752d9da","private_key":"714005eb63c1f681f6e6d248618fbb384992707e07292f666ee9d475997ad0fe","name":"node_0d8a919207fb2d5718eab7da95f8efeb01a4e1ae39602d315f8ba2ff1752d9da","services":["streamer"],"enable_msg_events":true,"port":36819},"up":true}},{"node":{"info":{"id":"140020a23a840b8840ba0c2c384f853a606330e9743885e9967cf49533db282e","name":"node_140020a23a840b8840ba0c2c384f853a606330e9743885e9967cf49533db282e","enode":"enode://e1ccb6417d15f6494ffafaa9d244c8b4dde696a72ca60fbd5dd6ad25d2b01530265fb2dff62548999fb9e9c7e4d8721cd1605b3e2259032ce3740e125a2724d9@127.0.0.1:0","enr":"0xf88fb840c1aba5fa71e995c2d05e38311251405e2aed69381bc4256421eefc3e58022db80bf4ee6dbb83cce873b18448ea8e2943c0c07ffcad5e79649279e3adec6b95d50183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103e1ccb6417d15f6494ffafaa9d244c8b4dde696a72ca60fbd5dd6ad25d2b01530","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"FAAgojqEC4hAugwsOE+FOmBjMOl0OIXplnz0lTPbKC4=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 140020\npopulation: 45 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 e5ad e547 c43f ca04 | 110 9852 (0) 9890 (0) 9fa0 (0) 9d0f (0)\n001 13 53a8 46fe 4782 4558 | 70 574f (0) 524d (0) 5308 (0) 534b (0)\n002 4 256e 24b8 378e 30be | 32 2995 (0) 2abb (0) 2a97 (0) 2a0a (0)\n003 6 0438 07a8 02d8 0cf5 | 22 045b (0) 0451 (0) 0438 (0) 0661 (0)\n004 8 1c47 1c9c 1c8a 1e2a | 10 1c47 (0) 1c9c (0) 1c8a (0) 1e2a (0)\n005 2 13d6 11d4 | 3 13d6 (0) 103b (0) 11d4 (0)\n006 4 1672 17db 179f 1704 | 5 165f (0) 1672 (0) 1704 (0) 179f (0)\n007 1 154b | 1 154b (0)\n============ DEPTH: 8 ==========================================\n008 1 14df | 1 14df (0)\n009 0 | 0\n010 1 1436 | 1 1436 (0)\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"140020a23a840b8840ba0c2c384f853a606330e9743885e9967cf49533db282e","private_key":"556950a90a1dad390b6fc5d9b5b1c233161f015de2d7fef6e8e6079733d4f698","name":"node_140020a23a840b8840ba0c2c384f853a606330e9743885e9967cf49533db282e","services":["streamer"],"enable_msg_events":true,"port":35227},"up":true}},{"node":{"info":{"id":"7b90e939ae2a240f0d74a923afb6bbf11f6d5b99a7bf85f1825b1ea36bce744c","name":"node_7b90e939ae2a240f0d74a923afb6bbf11f6d5b99a7bf85f1825b1ea36bce744c","enode":"enode://5d077c804ebd13e7fa79b13210a9f8eaf0a72b5eb61816e9b780eb88a9794cf264334213ab605cbd538f71e0d354cc87c7c65b6ca6d492ca04a11f64dc401ee2@127.0.0.1:0","enr":"0xf88fb84044f3dd1993ede3a59f643421431f806409d41c9f6212b331bac4586d156afc1f75c391daa990c8e52046f96d52133b6b52ac0607d88f47108c0cb28b4e2ccb990183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1025d077c804ebd13e7fa79b13210a9f8eaf0a72b5eb61816e9b780eb88a9794cf2","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"e5DpOa4qJA8NdKkjr7a78R9tW5mnv4Xxglseo2vOdEw=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 7b90e9\npopulation: 34 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 b626 da67 e547 | 110 9890 (0) 9852 (0) 9fa0 (0) 9d0f (0)\n001 3 1b83 1400 02d8 | 76 2995 (0) 2abb (0) 2a97 (0) 2a0a (0)\n002 10 4ac7 4a8b 49cd 46fe | 38 574f (0) 524d (0) 5308 (0) 534b (0)\n003 8 6c4d 6fe9 6f2d 6ecb | 20 66e7 (0) 67dc (0) 67aa (0) 628e (0)\n004 4 7290 738c 77d2 775e | 5 775e (0) 77d2 (0) 7125 (0) 738c (0)\n005 4 7e04 7dbb 7dd3 7dc2 | 4 7e04 (0) 7dbb (0) 7dd3 (0) 7dc2 (0)\n============ DEPTH: 6 ==========================================\n006 1 7920 | 1 7920 (0)\n007 1 7a60 | 1 7a60 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"7b90e939ae2a240f0d74a923afb6bbf11f6d5b99a7bf85f1825b1ea36bce744c","private_key":"e008f9a954df6848345e13074de64581f826eb05f1c85014a22afe07d7afd655","name":"node_7b90e939ae2a240f0d74a923afb6bbf11f6d5b99a7bf85f1825b1ea36bce744c","services":["streamer"],"enable_msg_events":true,"port":40801},"up":true}},{"node":{"info":{"id":"02d85b9f8e4776224ae5088683a87837b82b2bfb7e047cf373a28393e7aca6e1","name":"node_02d85b9f8e4776224ae5088683a87837b82b2bfb7e047cf373a28393e7aca6e1","enode":"enode://92a4724c2dc7a409c261888c4cd9cf6414fc6cf9df011f8877dcafb8a0f09fccc292ad4cea02561c68b2226b6058e8803230ac5adce4d829a6be49161e9672a6@127.0.0.1:0","enr":"0xf88fb840545027bb61080c38c187a5d84369aa4b4790c385613ee02331515b99e60b1dd8228951b517cb1ff48bf5de46057359f0dfa5c064e46b20ccfbe05526e9aa9daa0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10292a4724c2dc7a409c261888c4cd9cf6414fc6cf9df011f8877dcafb8a0f09fcc","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"Athbn45HdiJK5QiGg6h4N7grK/t+BHzzc6KDk+espuE=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 02d85b\npopulation: 32 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 b626 da67 ca04 e5ad | 110 9852 (0) 9890 (0) 9fa0 (0) 9d0f (0)\n001 9 53a8 512e 5b63 4558 | 70 574f (0) 524d (0) 534b (0) 5308 (0)\n002 4 2ccf 2995 3780 30be | 32 20ae (0) 21a0 (0) 2101 (0) 217f (0)\n003 2 1b83 1400 | 22 1c47 (0) 1c9c (0) 1c8a (0) 1e2a (0)\n004 3 0cf5 0de3 0d8a | 11 0b72 (0) 0a00 (0) 0af9 (0) 0fc5 (0)\n005 5 07a8 0743 0451 045b | 6 0661 (0) 07a8 (0) 0743 (0) 045b (0)\n006 2 00c6 0067 | 2 00c6 (0) 0067 (0)\n============ DEPTH: 7 ==========================================\n007 2 03cc 0328 | 2 03cc (0) 0328 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"02d85b9f8e4776224ae5088683a87837b82b2bfb7e047cf373a28393e7aca6e1","private_key":"e4ec3c40d474533d24394b73a40c70a533fdc023259146333c3ba30a6ef2e9ab","name":"node_02d85b9f8e4776224ae5088683a87837b82b2bfb7e047cf373a28393e7aca6e1","services":["streamer"],"enable_msg_events":true,"port":36493},"up":true}},{"node":{"info":{"id":"e54784cfbcd89c37c8f758aae70ece3ab4b7f8c30fb4ef7543e04aa89ff4386b","name":"node_e54784cfbcd89c37c8f758aae70ece3ab4b7f8c30fb4ef7543e04aa89ff4386b","enode":"enode://7171c11a093b51b6cc82078234ce48f2d0ebb3b56cc76ae5f988726c9857d7d69bc3fb5a01f4c6af0c862751c134804f1bdf13dc430fc007ae9c2dd5d0d6ff83@127.0.0.1:0","enr":"0xf88fb8408b53c905f3415f9c2c6e63f66a60385e30d6ff9285113905d760adb0db4eac275fefd5031cc64d050f70a502687314d59a1bd9c113edfd553d48a55a7a9c204e0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1037171c11a093b51b6cc82078234ce48f2d0ebb3b56cc76ae5f988726c9857d7d6","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"5UeEz7zYnDfI91iq5w7OOrS3+MMPtO91Q+BKqJ/0OGs=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: e54784\npopulation: 35 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 8 1400 1b83 0d8a 02d8 | 146 2995 (0) 2a97 (0) 2abb (0) 2a0a (0)\n001 4 9d0f 959f 915d b626 | 47 9852 (0) 9890 (0) 9fa0 (0) 9d0f (0)\n002 10 c26f c786 c49c c59e | 26 df1e (0) d887 (0) d863 (0) db6a (0)\n003 3 fe21 f2d5 f528 | 19 f925 (0) fbf5 (0) fbc8 (0) ff36 (0)\n004 3 e8ef ed2d efea | 10 ec52 (0) ed2d (0) ee5e (0) ef1b (0)\n005 1 e027 | 1 e027 (0)\n006 2 e775 e7fa | 2 e775 (0) e7fa (0)\n============ DEPTH: 7 ==========================================\n007 0 | 0\n008 2 e5d7 e5ad | 2 e5d7 (0) e5ad (0)\n009 1 e514 | 1 e514 (0)\n010 0 | 0\n011 0 | 0\n012 1 e54b | 1 e54b (0)\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"e54784cfbcd89c37c8f758aae70ece3ab4b7f8c30fb4ef7543e04aa89ff4386b","private_key":"6855155d7773437dde5625696c1fd21e0b93d11b8f418fe17b83735999241de6","name":"node_e54784cfbcd89c37c8f758aae70ece3ab4b7f8c30fb4ef7543e04aa89ff4386b","services":["streamer"],"enable_msg_events":true,"port":44601},"up":true}},{"node":{"info":{"id":"45584a4bebb948ef5f7b55d4846ec5549d7623682169c0edcab5b3523e68c7da","name":"node_45584a4bebb948ef5f7b55d4846ec5549d7623682169c0edcab5b3523e68c7da","enode":"enode://1d85f00468f786d1f65c994867636f183a120622cffb3f2934c00dba86d528843a0c8b82e64a43212e3cb8b496fd71390b505c78ab6e3be9415fd3c56318aff7@127.0.0.1:0","enr":"0xf88fb840afb40932bf66ca7c121a0c54ece652628981b3fae02dd8c65f5de31913ddfd985cc09c42a7843bf6fc85803cae0b508643b06bb46b9c38f9c7c4570dc325063c0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1031d85f00468f786d1f65c994867636f183a120622cffb3f2934c00dba86d52884","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"RVhKS+u5SO9fe1XUhG7FVJ12I2ghacDtyrWzUj5ox9o=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 45584a\npopulation: 33 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 8025 82f9 959f 976e | 110 9852 (0) 9890 (0) 9fa0 (0) 9d0f (0)\n001 4 30be 02d8 1400 1b83 | 76 2101 (0) 217f (0) 21a0 (0) 20ae (0)\n002 5 60d7 6fe9 7290 7a60 | 32 66e7 (0) 67dc (0) 67aa (0) 6251 (0)\n003 4 574f 53a8 512e 5b63 | 15 574f (0) 524d (0) 5308 (0) 534b (0)\n004 3 49cd 4a8b 4ac7 | 11 4e5a (0) 4d10 (0) 4d6b (0) 4d59 (0)\n005 2 4109 41d9 | 2 4109 (0) 41d9 (0)\n006 6 4646 4636 461c 46fe | 6 4646 (0) 461c (0) 4636 (0) 46fe (0)\n============ DEPTH: 7 ==========================================\n007 2 44a1 4447 | 2 44a1 (0) 4447 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 1 4559 | 1 4559 (0)\n========================================================================="}},"config":{"id":"45584a4bebb948ef5f7b55d4846ec5549d7623682169c0edcab5b3523e68c7da","private_key":"9608a1c360a2f5a546c575e523d9afd2b89f14ea1058b2f3be09cb1ba5ba4240","name":"node_45584a4bebb948ef5f7b55d4846ec5549d7623682169c0edcab5b3523e68c7da","services":["streamer"],"enable_msg_events":true,"port":44403},"up":true}},{"node":{"info":{"id":"1b830ed484b274a96ec7ba2f9a42b6859412b5334a564014ff3f11597ea3a32d","name":"node_1b830ed484b274a96ec7ba2f9a42b6859412b5334a564014ff3f11597ea3a32d","enode":"enode://73130b08d35d59e21a3991dc309b956f7bcd8dc6946b53bba74e40d612c993b6b8bfc34ee4e2cebfb54120afb070360aba61e91ebf845a4d0bc2f5a94f7918b2@127.0.0.1:0","enr":"0xf88fb84087efc4c166904eeedc3b6692d887773016e8af688980eff63dbd8053a6662a994b81ef2f726fb80b4fb522f0551ebbe913fedbb471e94c6e1b6c26882f9e963b0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10273130b08d35d59e21a3991dc309b956f7bcd8dc6946b53bba74e40d612c993b6","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"G4MO1ISydKlux7ovmkK2hZQStTNKVkAU/z8RWX6joy0=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 1b830e\npopulation: 29 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 c786 e547 | 110 9890 (0) 9852 (0) 9fa0 (0) 9d0f (0)\n001 8 60d7 6fe9 7b90 7a60 | 70 66e7 (0) 67dc (0) 67aa (0) 628e (0)\n002 3 2ccf 3780 30be | 32 20ae (0) 21a0 (0) 2101 (0) 217f (0)\n003 5 07a8 0438 02d8 0cf5 | 22 0b72 (0) 0af9 (0) 0a00 (0) 0ff2 (0)\n004 4 1704 17db 1436 1400 | 12 13d6 (0) 11d4 (0) 103b (0) 165f (0)\n005 4 1f67 1f85 1c47 1c8a | 6 1c47 (0) 1c9c (0) 1c8a (0) 1e2a (0)\n============ DEPTH: 6 ==========================================\n006 2 19fa 18f6 | 2 19fa (0) 18f6 (0)\n007 1 1a2a | 1 1a2a (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"1b830ed484b274a96ec7ba2f9a42b6859412b5334a564014ff3f11597ea3a32d","private_key":"9a7dd3d621d32ff5a718455ac877ef986e5aaa5f787e0c07a01221179c5655a6","name":"node_1b830ed484b274a96ec7ba2f9a42b6859412b5334a564014ff3f11597ea3a32d","services":["streamer"],"enable_msg_events":true,"port":44895},"up":true}},{"node":{"info":{"id":"5b632eaf700d173ff15f4727b85817e6173228c304b422434a08c2cad438b825","name":"node_5b632eaf700d173ff15f4727b85817e6173228c304b422434a08c2cad438b825","enode":"enode://7180d5a2452d8f6f57da742809146caacf5d03be267b31242048646bfa4961bf2284cfeab0b4af050aca2a42f14742163ac4fdfe364bb31111ee5aad221f17da@127.0.0.1:0","enr":"0xf88fb84057305ca13e6cae11290507a0fc500d9008b375e0f3e6c6a47714cc7fe9c0c390643b679806a97c42225f87daf53e3b30ee361ed30fb4980947d7d1734dfeb46e0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1027180d5a2452d8f6f57da742809146caacf5d03be267b31242048646bfa4961bf","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"W2Mur3ANFz/xX0cnuFgX5hcyKMMEtCJDSgjCytQ4uCU=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 5b632e\npopulation: 35 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 b626 e5ad e547 d7ac | 110 9890 (0) 9852 (0) 9fa0 (0) 9d0f (0)\n001 4 30be 0d8a 02d8 1b83 | 76 2f32 (0) 2d36 (0) 2c79 (0) 2c38 (0)\n002 8 6337 60d7 6e05 6fe9 | 32 66e7 (0) 67dc (0) 67aa (0) 6337 (0)\n003 9 49cd 4a8b 4ac7 4636 | 23 4e5a (0) 4c9e (0) 4d10 (0) 4d59 (0)\n004 4 574f 53a8 51db 512e | 8 574f (0) 524d (0) 534b (0) 5308 (0)\n005 3 5cd2 5db0 5f00 | 4 5cd2 (0) 5db0 (0) 5efb (0) 5f00 (0)\n============ DEPTH: 6 ==========================================\n006 2 5823 58ed | 2 5823 (0) 58ed (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"5b632eaf700d173ff15f4727b85817e6173228c304b422434a08c2cad438b825","private_key":"745b337c790505716596b24711aeb834f9da50436f3c21c469cc58d9ed44bade","name":"node_5b632eaf700d173ff15f4727b85817e6173228c304b422434a08c2cad438b825","services":["streamer"],"enable_msg_events":true,"port":39847},"up":true}},{"node":{"info":{"id":"512ec5c2e6b4d788482462d941117c81fcc0e73f0c15545794dd1b4e03bf2102","name":"node_512ec5c2e6b4d788482462d941117c81fcc0e73f0c15545794dd1b4e03bf2102","enode":"enode://1ab954a0243f9922c7cc2353fed4531e695ab0f6c7d1f8b71ad381ce5b816d82d3e28fec5e7c29b4803a212c4b95b2e36764a217983fe60077800f6cc1042e8f@127.0.0.1:0","enr":"0xf88fb84083fbd1c8452f3f73ce4a2b36c81e402e17ae6440d2848e50b2948a3e01e62a840e4e008afd0dbb92800b63a93d399149a0cf7181d700305c34a238931bf5eca00183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1031ab954a0243f9922c7cc2353fed4531e695ab0f6c7d1f8b71ad381ce5b816d82","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"US7Fwua014hIJGLZQRF8gfzA5z8MFVRXlN0bTgO/IQI=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 512ec5\npopulation: 29 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 915d 976e 959f 8025 | 110 9890 (0) 9852 (0) 9fa0 (0) 9d0f (0)\n001 2 02d8 30be | 76 13d6 (0) 103b (0) 11d4 (0) 1672 (0)\n002 4 60d7 6fe9 7b90 7a60 | 32 66e7 (0) 67dc (0) 67aa (0) 6251 (0)\n003 8 49cd 4ac7 4a8b 4447 | 23 4c9e (0) 4d10 (0) 4d59 (0) 4d6b (0)\n004 2 5f00 5b63 | 7 5cd2 (0) 5db0 (0) 5efb (0) 5f00 (0)\n005 1 574f | 1 574f (0)\n============ DEPTH: 6 ==========================================\n006 5 524d 5308 534b 53fe | 5 524d (0) 5308 (0) 534b (0) 53fe (0)\n007 0 | 0\n008 1 51db | 1 51db (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"512ec5c2e6b4d788482462d941117c81fcc0e73f0c15545794dd1b4e03bf2102","private_key":"a9936124e7fb45265f6f877d31652c355a01c95aafa0759b600b0b01bda446eb","name":"node_512ec5c2e6b4d788482462d941117c81fcc0e73f0c15545794dd1b4e03bf2102","services":["streamer"],"enable_msg_events":true,"port":42415},"up":true}},{"node":{"info":{"id":"c786ff8667f509b5a9519984c1d95c83a5d2e257500a71429e8f23af610ce771","name":"node_c786ff8667f509b5a9519984c1d95c83a5d2e257500a71429e8f23af610ce771","enode":"enode://0f947b6b5ef1e5851a56a3a6852d472207b64d611146bc3070524184aa3530da88475fb850affcc256762fd9be921202f017475ff8cd8ffaeed209ab886fff12@127.0.0.1:0","enr":"0xf88fb840f891417b94f031211a81ebabc83fda5d22dee1e76ffbf5ed206cdfdc2e0ad84110d709ff637d2b0727e8e5968902fd13220cd26f881e0b8b8cf2978d2cf78daf0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1020f947b6b5ef1e5851a56a3a6852d472207b64d611146bc3070524184aa3530da","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"x4b/hmf1CbWpUZmEwdlcg6XS4ldQCnFCno8jr2EM53E=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: c786ff\npopulation: 37 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 30be 1b83 5b63 512e | 146 13d6 (0) 103b (0) 11d4 (0) 165f (0)\n001 5 96fc 976e 959f 9d0f | 47 9852 (0) 9890 (0) 9fa0 (0) 9d0f (0)\n002 9 f5dc f4e0 f925 fe31 | 37 fbc8 (0) fbf5 (0) f925 (0) ff36 (0)\n003 5 d863 db6a da67 d640 | 11 df1e (0) d887 (0) d863 (0) db6a (0)\n004 4 c9f5 c832 ca04 caf6 | 6 cc20 (0) c9f5 (0) c898 (0) c832 (0)\n005 2 c1f9 c26f | 2 c1f9 (0) c26f (0)\n006 4 c59e c441 c43f c49c | 4 c43f (0) c441 (0) c49c (0) c59e (0)\n============ DEPTH: 7 ==========================================\n007 2 c620 c6cf | 2 c620 (0) c6cf (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"c786ff8667f509b5a9519984c1d95c83a5d2e257500a71429e8f23af610ce771","private_key":"ac3f95d0c0be51c8eb8e612f911fc75f2c7796eb845e974b365f8ca34e1cf47f","name":"node_c786ff8667f509b5a9519984c1d95c83a5d2e257500a71429e8f23af610ce771","services":["streamer"],"enable_msg_events":true,"port":33023},"up":true}},{"node":{"info":{"id":"7a608d2cf9d1d9c5819dc1f9e88e5cb2852aadea01c40e047c2e184b62e7163c","name":"node_7a608d2cf9d1d9c5819dc1f9e88e5cb2852aadea01c40e047c2e184b62e7163c","enode":"enode://bcc004d204a81c01d6723867a47b697318eb158b54dcd5ded13d8dcc571f81e8bb51e56b4f5d2dae98a48aa41e77429bf1aed102194df88ce7a4ec9761c78733@127.0.0.1:0","enr":"0xf88fb840cdabbbf5e1facab29f6e6f89d212c7fae606ccfa0ebe589ea48a109bc0e55ada757e2d5d4c65db8cb1a08f565d4a76dc5e565ba64f9411dfb4335217027c424f0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103bcc004d204a81c01d6723867a47b697318eb158b54dcd5ded13d8dcc571f81e8","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"emCNLPnR2cWBncH56I5csoUqreoBxA4EfC4YS2LnFjw=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 7a608d\npopulation: 37 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 b5b2 e8ef e5ad d7ac | 110 9fa0 (0) 9d0f (0) 9890 (0) 9852 (0)\n001 5 02d8 0d8a 1400 1b83 | 76 13d6 (0) 103b (0) 11d4 (0) 165f (0)\n002 9 4a8b 4ac7 4558 46fe | 38 4c9e (0) 4d10 (0) 4d59 (0) 4d6b (0)\n003 9 6103 60d7 6337 67aa | 20 66e7 (0) 67dc (0) 67aa (0) 628e (0)\n004 2 77d2 7290 | 5 775e (0) 77d2 (0) 7125 (0) 738c (0)\n005 4 7e04 7dbb 7dc2 7dd3 | 4 7e04 (0) 7dbb (0) 7dc2 (0) 7dd3 (0)\n============ DEPTH: 6 ==========================================\n006 1 7920 | 1 7920 (0)\n007 1 7b90 | 1 7b90 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"7a608d2cf9d1d9c5819dc1f9e88e5cb2852aadea01c40e047c2e184b62e7163c","private_key":"1482a769e4374b6a63d26c4cd99ac2a877d146de855386acc89bbbf8d92d634d","name":"node_7a608d2cf9d1d9c5819dc1f9e88e5cb2852aadea01c40e047c2e184b62e7163c","services":["streamer"],"enable_msg_events":true,"port":43929},"up":true}},{"node":{"info":{"id":"e5ada0415c92ef1511b15d04edf395976464afd9adc3e929c41d4d21d25e3182","name":"node_e5ada0415c92ef1511b15d04edf395976464afd9adc3e929c41d4d21d25e3182","enode":"enode://45396d74120c86243ba2a5201eb5c426df1e01a818cab326b1f835329328113dcbfc080c8d30f25d4b3100a6881df18cbedf46901fa1eba42e8b67217a03b6d4@127.0.0.1:0","enr":"0xf88fb840ef39cfe61b95ba34b613f30b0c843f8b08e7b8d7e1612460f235e2864e40110d59b1705cfc07c7f088345f97da1704cd0b1336fe5f79ef916551e2f99d9573240183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10245396d74120c86243ba2a5201eb5c426df1e01a818cab326b1f835329328113d","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"5a2gQVyS7xURsV0E7fOVl2Rkr9mtw+kpxB1NIdJeMYI=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: e5ada0\npopulation: 31 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 7 02d8 1400 30be 5b63 | 146 13d6 (0) 11d4 (0) 103b (0) 1672 (0)\n001 4 88fe b502 b5b2 b626 | 47 9890 (0) 9852 (0) 9fa0 (0) 9d0f (0)\n002 7 d7ac d640 caf6 ca04 | 26 df1e (0) d887 (0) d863 (0) db6a (0)\n003 3 fe21 f2d5 f528 | 19 f925 (0) fbf5 (0) fbc8 (0) ff36 (0)\n004 3 ec52 efea e8ef | 10 ee5e (0) ef1b (0) ef07 (0) efea (0)\n005 1 e027 | 1 e027 (0)\n006 2 e775 e7fa | 2 e775 (0) e7fa (0)\n============ DEPTH: 7 ==========================================\n007 0 | 0\n008 3 e514 e54b e547 | 3 e514 (0) e54b (0) e547 (0)\n009 1 e5d7 | 1 e5d7 (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"e5ada0415c92ef1511b15d04edf395976464afd9adc3e929c41d4d21d25e3182","private_key":"412a46a21e6ae42d21149e1e5a99ab8147be24ca5ca741bc0806394903c6a4e9","name":"node_e5ada0415c92ef1511b15d04edf395976464afd9adc3e929c41d4d21d25e3182","services":["streamer"],"enable_msg_events":true,"port":44795},"up":true}},{"node":{"info":{"id":"30bec7cd0a7d002839aed7654129bd2fe2e2ce7f42aa7bae1560e8bf718954c3","name":"node_30bec7cd0a7d002839aed7654129bd2fe2e2ce7f42aa7bae1560e8bf718954c3","enode":"enode://d4938f13c3e1a21366991a0040a5de8e8d3200ec4fa2e95ebd57bf291ae843e2e484f992690d2fbbc475b3fbf3d9ac44d29ff8b2bfaced1a76f0fca80a1e8499@127.0.0.1:0","enr":"0xf88fb840eff44640732004cd295f6d11cea92ed4934e714036a514bc63ea49a498010ad0630d6f351de844e1ad07c248cb15476b934e9ae674722be12109c12fceb667440183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103d4938f13c3e1a21366991a0040a5de8e8d3200ec4fa2e95ebd57bf291ae843e2","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"ML7HzQp9ACg5rtdlQSm9L+Lizn9CqnuuFWDov3GJVMM=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 30bec7\npopulation: 37 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 b626 d7ac c786 c59e | 110 9890 (0) 9852 (0) 9fa0 (0) 9d0f (0)\n001 10 5b63 53a8 512e 49cd | 70 5cd2 (0) 5db0 (0) 5efb (0) 5f00 (0)\n002 6 02d8 0d8a 1400 1f85 | 44 13d6 (0) 11d4 (0) 103b (0) 165f (0)\n003 6 20ae 217f 24b8 256e | 15 20ae (0) 21a0 (0) 2101 (0) 217f (0)\n004 2 3b88 3ec5 | 7 39d1 (0) 3b78 (0) 3b88 (0) 3f94 (0)\n005 3 3630 3780 378e | 4 35e6 (0) 3630 (0) 378e (0) 3780 (0)\n006 2 3237 33b5 | 3 3373 (0) 33b5 (0) 3237 (0)\n============ DEPTH: 7 ==========================================\n007 1 314a | 1 314a (0)\n008 0 | 0\n009 0 | 0\n010 1 3089 | 1 3089 (0)\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"30bec7cd0a7d002839aed7654129bd2fe2e2ce7f42aa7bae1560e8bf718954c3","private_key":"457e22ce24b3272b31f979367cff7d1675ce728dd8758a7e66779eab01b1f39a","name":"node_30bec7cd0a7d002839aed7654129bd2fe2e2ce7f42aa7bae1560e8bf718954c3","services":["streamer"],"enable_msg_events":true,"port":40077},"up":true}},{"node":{"info":{"id":"6fe9a02e950a5c3a5ff026b75922ed687d59795ba8eb9c092a8d09a5c64d2453","name":"node_6fe9a02e950a5c3a5ff026b75922ed687d59795ba8eb9c092a8d09a5c64d2453","enode":"enode://e2ff496895056d4524e8809a260658da6ceec4c10793af4bcb6c057c8e49b09e58f567ba6f5276f0b7f0a77d9fdf7faa3240a2bd679395fcedabee5b9f3351a7@127.0.0.1:0","enr":"0xf88fb84070b049df191da1faabfd595e42918747d388a4aefef434acda7b08e59e72eef27c77b287320a2242d7483326ca4c879b2a973a90e8de4f7d318ae7837f2485a20183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103e2ff496895056d4524e8809a260658da6ceec4c10793af4bcb6c057c8e49b09e","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"b+mgLpUKXDpf8Ca3WSLtaH1ZeVuo65wJKo0JpcZNJFM=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 6fe9a0\npopulation: 38 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 7 e8ef e5ad c49c c786 | 110 fbf5 (0) fbc8 (0) f925 (0) ff36 (0)\n001 4 02d8 1400 1b83 30be | 76 13d6 (0) 103b (0) 11d4 (0) 165f (0)\n002 9 53a8 512e 5f00 5b63 | 38 5cd2 (0) 5db0 (0) 5efb (0) 5f00 (0)\n003 3 7290 7b90 7a60 | 12 775e (0) 77d2 (0) 7125 (0) 738c (0)\n004 5 66e7 67aa 6337 6103 | 9 66e7 (0) 67dc (0) 67aa (0) 6251 (0)\n005 2 6967 6831 | 2 6967 (0) 6831 (0)\n006 2 6c73 6c4d | 2 6c73 (0) 6c4d (0)\n007 4 6e05 6e68 6ea5 6ecb | 4 6ea5 (0) 6ecb (0) 6e68 (0) 6e05 (0)\n============ DEPTH: 8 ==========================================\n008 2 6f5f 6f2d | 2 6f5f (0) 6f2d (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"6fe9a02e950a5c3a5ff026b75922ed687d59795ba8eb9c092a8d09a5c64d2453","private_key":"879ee7d6a5c3b9955ff62eaf879fe7b1cfccac856af66e529973919c66e623fc","name":"node_6fe9a02e950a5c3a5ff026b75922ed687d59795ba8eb9c092a8d09a5c64d2453","services":["streamer"],"enable_msg_events":true,"port":39807},"up":true}},{"node":{"info":{"id":"b626d472b555e6f950a7142783db8deb443a74e63ef6bd72a87eaf1af14ca805","name":"node_b626d472b555e6f950a7142783db8deb443a74e63ef6bd72a87eaf1af14ca805","enode":"enode://bcb24f203bc073123e592cbe910596246943b55a8b23f83c44d9a9792ce617b3881167f7ea10979b8e0edbb7477d3caa2536b87ab288635a7f606b7f12e6fdf6@127.0.0.1:0","enr":"0xf88fb840bb20ffbb4f9e317c0920fd1e3c9ab49f236431a644b4ed2d281206876654ea5175878382b830f9312bf112a8799f0609ac8d280355c23d6062b4299a6d4957d40183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102bcb24f203bc073123e592cbe910596246943b55a8b23f83c44d9a9792ce617b3","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"tibUcrVV5vlQpxQng9uN60Q6dOY+9r1yqH6vGvFMqAU=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: b626d4\npopulation: 37 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 8 02d8 30be 5b63 53a8 | 146 13d6 (0) 103b (0) 11d4 (0) 1672 (0)\n001 11 f2d5 e8ef e547 e5ad | 63 fbc8 (0) fbf5 (0) f925 (0) fe31 (0)\n002 5 915d 959f 976e 82f9 | 20 9852 (0) 9890 (0) 9fa0 (0) 9d0f (0)\n003 3 ac4d a6fb a653 | 10 af02 (0) ae2b (0) aeb4 (0) ad98 (0)\n004 4 b95d ba88 badd baf2 | 9 bcc6 (0) b820 (0) b897 (0) b911 (0)\n005 2 b02b b2b5 | 3 b02b (0) b2a5 (0) b2b5 (0)\n006 2 b5b2 b502 | 2 b502 (0) b5b2 (0)\n============ DEPTH: 7 ==========================================\n007 1 b7ca | 1 b7ca (0)\n008 0 | 0\n009 1 b65e | 1 b65e (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"b626d472b555e6f950a7142783db8deb443a74e63ef6bd72a87eaf1af14ca805","private_key":"a8c00eca98c6cb671796a4d64ed46a6e68a4299a429d774c69674a2844e1b7eb","name":"node_b626d472b555e6f950a7142783db8deb443a74e63ef6bd72a87eaf1af14ca805","services":["streamer"],"enable_msg_events":true,"port":45367},"up":true}},{"node":{"info":{"id":"d7aca8f2182bc625d2b3c942bd1161c85bcf1c2b34ecbe3e2fd23cfae6b8a871","name":"node_d7aca8f2182bc625d2b3c942bd1161c85bcf1c2b34ecbe3e2fd23cfae6b8a871","enode":"enode://af8ad49dda536a983269aeea2d7dca08e480fe8314968145e98dc97cd7b009ed461036eccaa3b638ee49d16e627b2234eb3f362ec7d15abc46e5c36b54e53638@127.0.0.1:0","enr":"0xf88fb840e94ce96dfda68df3191de91c495debd7006cfc51027649581bd11c598e9ab2f214d984a700cab94c2e6de920ccb7f73533a32c3f8dfb71f22d53f5e21ffd7b320183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102af8ad49dda536a983269aeea2d7dca08e480fe8314968145e98dc97cd7b009ed","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"16yo8hgrxiXSs8lCvRFhyFvPHCs07L4+L9I8+ua4qHE=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: d7aca8\npopulation: 33 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 30be 7a60 6fe9 5b63 | 146 13d6 (0) 11d4 (0) 103b (0) 165f (0)\n001 3 88fe b5b2 b626 | 47 9852 (0) 9890 (0) 9fa0 (0) 9d0f (0)\n002 9 e8ef ec52 e547 e5ad | 37 f925 (0) fbc8 (0) fbf5 (0) ff36 (0)\n003 8 ca04 caf6 c26f c786 | 15 cc20 (0) c898 (0) c832 (0) c9f5 (0)\n004 4 df1e d863 da67 db6a | 6 df1e (0) d887 (0) d863 (0) db6a (0)\n============ DEPTH: 5 ==========================================\n005 3 d1d7 d3b0 d299 | 3 d1d7 (0) d3b0 (0) d299 (0)\n006 0 | 0\n007 1 d640 | 1 d640 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"d7aca8f2182bc625d2b3c942bd1161c85bcf1c2b34ecbe3e2fd23cfae6b8a871","private_key":"0301a81bf982f07c1bb98bf99f353b8d2a82b03e69c21e1d74c8ceaad8396be0","name":"node_d7aca8f2182bc625d2b3c942bd1161c85bcf1c2b34ecbe3e2fd23cfae6b8a871","services":["streamer"],"enable_msg_events":true,"port":34989},"up":true}},{"node":{"info":{"id":"4ac755123dcc64ef44db9280311af51f3f7a93e0dee67370d673261220356eb9","name":"node_4ac755123dcc64ef44db9280311af51f3f7a93e0dee67370d673261220356eb9","enode":"enode://518d6f5949bd69109142c1b8c458304de346817905a7cffb3be16be375f045f0c8d104d1d8dfeb19c79400877a63ad2ee8e87d9a1f57ce8f80ae645cbf4eef67@127.0.0.1:0","enr":"0xf88fb8406bb867b351cac2f28189ea4e9784fdf036ef21c4f2f01e0e0219a597544f9e026023632fca76371095ae079ec4432604b31db489477ff2bcb07772cf56116cc20183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103518d6f5949bd69109142c1b8c458304de346817905a7cffb3be16be375f045f0","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"SsdVEj3MZO9E25KAMRr1Hz96k+De5nNw1nMmEiA1brk=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 4ac755\npopulation: 29 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 b5b2 b626 e8ef d7ac | 110 9890 (0) 9852 (0) 9fa0 (0) 9d0f (0)\n001 5 0d8a 1400 1b83 3780 | 76 13d6 (0) 11d4 (0) 103b (0) 1672 (0)\n002 3 7b90 7a60 6fe9 | 32 775e (0) 77d2 (0) 7125 (0) 738c (0)\n003 4 5f00 5b63 512e 53a8 | 15 5cd2 (0) 5db0 (0) 5efb (0) 5f00 (0)\n004 4 4447 4558 46fe 47bf | 12 41d9 (0) 4109 (0) 44a1 (0) 4447 (0)\n005 2 4c9e 4d6b | 5 4e5a (0) 4c9e (0) 4d10 (0) 4d59 (0)\n006 3 4990 49ea 49cd | 3 4990 (0) 49ea (0) 49cd (0)\n============ DEPTH: 7 ==========================================\n007 1 4bcf | 1 4bcf (0)\n008 0 | 0\n009 1 4a8b | 1 4a8b (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"4ac755123dcc64ef44db9280311af51f3f7a93e0dee67370d673261220356eb9","private_key":"f8fa80aec89f65eae7ced03937bb7d9ffb1cfecd1ac8217600cf47c3bff7bfed","name":"node_4ac755123dcc64ef44db9280311af51f3f7a93e0dee67370d673261220356eb9","services":["streamer"],"enable_msg_events":true,"port":38749},"up":true}},{"node":{"info":{"id":"c59e3953b64e5b9ffbe53990a358914f2fa8e3551d33f92b9e3a441bd1baf2cd","name":"node_c59e3953b64e5b9ffbe53990a358914f2fa8e3551d33f92b9e3a441bd1baf2cd","enode":"enode://3909a562bce9e929066fb8e20922518612b890356bb3e697259c816e2517f826e527c1899afe88e6b7c605624fb9260ec468201d8baa1e17fc0ca07e1629ac74@127.0.0.1:0","enr":"0xf88fb84055d8b49729febc40ab5a07b226db8df1a30bab38bbffbcdf525ad479d3d859e360ab5dcb1431b296f0eeaff955d7f74ddc76c4af156067256afe7dd5d718293e0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1023909a562bce9e929066fb8e20922518612b890356bb3e697259c816e2517f826","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"xZ45U7ZOW5/75TmQo1iRTy+o41UdM/krnjpEG9G68s0=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: c59e39\npopulation: 26 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 30be 47bf 4ac7 | 146 0b72 (0) 0a00 (0) 0af9 (0) 0fc5 (0)\n001 4 959f 88fe b5b2 b626 | 47 9890 (0) 9852 (0) 9fa0 (0) 9d0f (0)\n002 3 e8ef e547 e5ad | 37 f925 (0) fbf5 (0) fbc8 (0) ff36 (0)\n003 6 da67 d863 df1e d299 | 11 df1e (0) d887 (0) d863 (0) db6a (0)\n004 2 ca04 caf6 | 6 cc20 (0) c9f5 (0) c898 (0) c832 (0)\n005 2 c1f9 c26f | 2 c1f9 (0) c26f (0)\n006 3 c786 c620 c6cf | 3 c620 (0) c6cf (0) c786 (0)\n============ DEPTH: 7 ==========================================\n007 3 c43f c441 c49c | 3 c43f (0) c441 (0) c49c (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"c59e3953b64e5b9ffbe53990a358914f2fa8e3551d33f92b9e3a441bd1baf2cd","private_key":"2d2665fd12ac020bb8aa6997cba5174e95d07b7f2dd9687d68abd431a6133895","name":"node_c59e3953b64e5b9ffbe53990a358914f2fa8e3551d33f92b9e3a441bd1baf2cd","services":["streamer"],"enable_msg_events":true,"port":42839},"up":true}},{"node":{"info":{"id":"47bfa3767cefcc0831d410d5402e9396e8a412c8c96faf55b451d3ff310f3b02","name":"node_47bfa3767cefcc0831d410d5402e9396e8a412c8c96faf55b451d3ff310f3b02","enode":"enode://99a8f99fc0cfe5ad73c6d3c6784bd3c8a36e664d0c586724f2a5dacd88ae1de2c2b2afe39786236af913ea9ea1d6f81726598d4fedf4f9698bc4d622dfa74456@127.0.0.1:0","enr":"0xf88fb84003f4b14b4db4abd57728bdc34701e10c40aa56b4937b21e60de55c6e0dc32a4e429766f47337d209a05d753ba33fb2e781dbccc3dece305fca6b5aa020f556b10183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10299a8f99fc0cfe5ad73c6d3c6784bd3c8a36e664d0c586724f2a5dacd88ae1de2","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"R7+jdnzvzAgx1BDVQC6TluikEsjJb69VtFHT/zEPOwI=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 47bfa3\npopulation: 31 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 8 88fe b5b2 b626 e8ef | 110 9852 (0) 9890 (0) 9fa0 (0) 9d0f (0)\n001 2 3780 30be | 76 13d6 (0) 103b (0) 11d4 (0) 165f (0)\n002 3 6e05 6fe9 7a60 | 32 775e (0) 77d2 (0) 7125 (0) 738c (0)\n003 4 5f00 5b63 512e 53a8 | 15 5cd2 (0) 5db0 (0) 5efb (0) 5f00 (0)\n004 3 49cd 4a8b 4ac7 | 11 4e5a (0) 4c9e (0) 4d10 (0) 4d59 (0)\n005 2 41d9 4109 | 2 41d9 (0) 4109 (0)\n006 4 44a1 4447 4559 4558 | 4 4559 (0) 4558 (0) 44a1 (0) 4447 (0)\n============ DEPTH: 7 ==========================================\n007 4 4646 4636 461c 46fe | 4 4646 (0) 461c (0) 4636 (0) 46fe (0)\n008 0 | 0\n009 0 | 0\n010 1 4782 | 1 4782 (0)\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"47bfa3767cefcc0831d410d5402e9396e8a412c8c96faf55b451d3ff310f3b02","private_key":"e14e52fa9b610fd29123ec266b01cb4554f23f0985eaf4f397ee8e36da9fb734","name":"node_47bfa3767cefcc0831d410d5402e9396e8a412c8c96faf55b451d3ff310f3b02","services":["streamer"],"enable_msg_events":true,"port":36519},"up":true}},{"node":{"info":{"id":"53a885968d68d8ebf7ed514e662cc13fa03186d2361000a03576531fdca2a25f","name":"node_53a885968d68d8ebf7ed514e662cc13fa03186d2361000a03576531fdca2a25f","enode":"enode://7cb2f74beeafb23eb1c3733aa06b15fcf9ec81c7bcd0c7fca13880190575b2efc50576733e125720aa8ca507c8763d15fc8c6a2d45ece04586cec04a52cf219f@127.0.0.1:0","enr":"0xf88fb8406637aa6250f6d822fa890a388e4a0568c5ba66b7f182fc1e3bde5ea9387252335b403469fdffbc037d26e4abdb86926c506f134f6bb74408cd656037fe7f8a250183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1037cb2f74beeafb23eb1c3733aa06b15fcf9ec81c7bcd0c7fca13880190575b2ef","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"U6iFlo1o2Ov37VFOZizBP6AxhtI2EACgNXZTH9yiol8=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 53a885\npopulation: 39 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 7 88fe b5b2 b626 c49c | 110 9890 (0) 9852 (0) 9fa0 (0) 9d0f (0)\n001 7 1400 0d8a 02d8 0438 | 76 0661 (0) 0743 (0) 07a8 (0) 0451 (0)\n002 6 67aa 6fe9 6e05 7290 | 32 775e (0) 77d2 (0) 7125 (0) 738c (0)\n003 8 49cd 4a8b 4ac7 4558 | 23 4e5a (0) 4d10 (0) 4d6b (0) 4d59 (0)\n004 4 5f00 5efb 5b63 5823 | 7 5cd2 (0) 5db0 (0) 5efb (0) 5f00 (0)\n005 1 574f | 1 574f (0)\n006 2 51db 512e | 2 51db (0) 512e (0)\n007 1 524d | 1 524d (0)\n============ DEPTH: 8 ==========================================\n008 2 534b 5308 | 2 534b (0) 5308 (0)\n009 1 53fe | 1 53fe (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"53a885968d68d8ebf7ed514e662cc13fa03186d2361000a03576531fdca2a25f","private_key":"969e9079ff9417e9019194be48bd5ca8390e4b1da63300776d6ba493e5b0e3df","name":"node_53a885968d68d8ebf7ed514e662cc13fa03186d2361000a03576531fdca2a25f","services":["streamer"],"enable_msg_events":true,"port":34549},"up":true}},{"node":{"info":{"id":"e8efe8016fe6cf649b2755bee22da35ccc6c9c55d404d5385d61f6ea27b84380","name":"node_e8efe8016fe6cf649b2755bee22da35ccc6c9c55d404d5385d61f6ea27b84380","enode":"enode://61681c2fcd285866105bfa4d3e47a2c7d765368cde74a62218935aecf0fd15966a88226b5f12e371f41954a0063b806cce53468884b34e817120d5b41386fe22@127.0.0.1:0","enr":"0xf88fb840276c3036a03aa8627db3a54002f6257878aa8046c3174fd3a3052160dafc7a8445e68a88d8bfd35ff1174b47c53c3fec471867db75b9f0670a68993bcf09c1f40183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10261681c2fcd285866105bfa4d3e47a2c7d765368cde74a62218935aecf0fd1596","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"6O/oAW/mz2SbJ1W+4i2jXMxsnFXUBNU4XWH26ie4Q4A=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: e8efe8\npopulation: 34 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 30be 7a60 6fe9 4ac7 | 146 13d6 (0) 103b (0) 11d4 (0) 1704 (0)\n001 4 88fe baf2 b626 b5b2 | 47 9890 (0) 9852 (0) 9fa0 (0) 9d0f (0)\n002 6 caf6 c49c c59e da67 | 26 cc20 (0) c9f5 (0) c898 (0) c832 (0)\n003 4 f2d5 f629 f7fa f528 | 19 f925 (0) fbf5 (0) fbc8 (0) ff36 (0)\n004 5 e027 e7fa e547 e5d7 | 8 e027 (0) e775 (0) e7fa (0) e514 (0)\n005 6 ee5e ef1b ef07 efea | 6 ee5e (0) ef1b (0) ef07 (0) efea (0)\n006 1 eb98 | 1 eb98 (0)\n============ DEPTH: 7 ==========================================\n007 0 | 0\n008 1 e854 | 1 e854 (0)\n009 1 e883 | 1 e883 (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"e8efe8016fe6cf649b2755bee22da35ccc6c9c55d404d5385d61f6ea27b84380","private_key":"8ce9e530f5c91869432f678c7427fbcae8495679b569edd4de349825b348c94a","name":"node_e8efe8016fe6cf649b2755bee22da35ccc6c9c55d404d5385d61f6ea27b84380","services":["streamer"],"enable_msg_events":true,"port":41325},"up":true}},{"node":{"info":{"id":"d640472351969a5578e541aca72b7640c583b995fd62607ff3ee3f3f3139aafd","name":"node_d640472351969a5578e541aca72b7640c583b995fd62607ff3ee3f3f3139aafd","enode":"enode://17dda987ab35c708fe928fd6daff3da8a18784789c581cb861079dca3d05584c6516824bb15729d0d6e4ca77908c3ae96a4a8f8edfb415eef4f9f31481e0b2cf@127.0.0.1:0","enr":"0xf88fb8401e90e884b49904ec677447f4c5edbe69de30ec6df088f673b1b613313d66a2c30ec1b3b452bf12152b16f4361f665f5cbce63a6f2680effd69ef9dcda94114440183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10317dda987ab35c708fe928fd6daff3da8a18784789c581cb861079dca3d05584c","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"1kBHI1GWmlV45UGspyt2QMWDuZX9YmB/8+4/PzE5qv0=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: d64047\npopulation: 29 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 47bf 53a8 | 146 13d6 (0) 11d4 (0) 103b (0) 1672 (0)\n001 4 b626 b5b2 915d 88fe | 47 9852 (0) 9890 (0) 9fa0 (0) 9d0f (0)\n002 7 f629 f2d5 e5d7 e5ad | 37 fbc8 (0) fbf5 (0) f925 (0) fe31 (0)\n003 8 c9f5 ca04 caf6 c26f | 15 cc20 (0) c9f5 (0) c898 (0) c832 (0)\n004 4 df1e d863 db6a da67 | 6 df1e (0) d887 (0) d863 (0) db6a (0)\n============ DEPTH: 5 ==========================================\n005 3 d299 d3b0 d1d7 | 3 d1d7 (0) d3b0 (0) d299 (0)\n006 0 | 0\n007 1 d7ac | 1 d7ac (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"d640472351969a5578e541aca72b7640c583b995fd62607ff3ee3f3f3139aafd","private_key":"7dda4f1f1b00b27dcba963ca38a79091c69eacbc993590b9774b515e9138ddca","name":"node_d640472351969a5578e541aca72b7640c583b995fd62607ff3ee3f3f3139aafd","services":["streamer"],"enable_msg_events":true,"port":39283},"up":true}},{"node":{"info":{"id":"c49caff13862dc089f1f9b8180d6efa455648375662719272102c4f8028799d6","name":"node_c49caff13862dc089f1f9b8180d6efa455648375662719272102c4f8028799d6","enode":"enode://0c6d8311b47b26830eeecd5200414fb26fc1147f01b938dcc610c2407af63cf617079655416b03336b0695f7ed5d42efc11803d5dbee44fd5d05c487921f1548@127.0.0.1:0","enr":"0xf88fb840154c57974260b37e441e6874dff8009220b1b7cb71ed9271d0543f018a32274012616ddf46d4aec53d939099c377e0f189c1c9259858e7ec80a7c1e23fb1c6520183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1020c6d8311b47b26830eeecd5200414fb26fc1147f01b938dcc610c2407af63cf6","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"xJyv8Thi3AifH5uBgNbvpFVkg3VmJxknIQLE+AKHmdY=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: c49caf\npopulation: 34 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 7 7a60 6e05 6fe9 53a8 | 146 13d6 (0) 11d4 (0) 103b (0) 165f (0)\n001 5 915d 88fe b65e b626 | 47 9890 (0) 9852 (0) 9fa0 (0) 9d0f (0)\n002 8 f2d5 f629 f7fa e5d7 | 37 e027 (0) e775 (0) e7fa (0) e514 (0)\n003 5 df1e da67 d863 d7ac | 11 df1e (0) d887 (0) d863 (0) db6a (0)\n004 2 ca04 caf6 | 6 cc20 (0) c898 (0) c832 (0) c9f5 (0)\n005 2 c1f9 c26f | 2 c1f9 (0) c26f (0)\n006 2 c6cf c786 | 3 c620 (0) c6cf (0) c786 (0)\n007 1 c59e | 1 c59e (0)\n============ DEPTH: 8 ==========================================\n008 2 c441 c43f | 2 c43f (0) c441 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"c49caff13862dc089f1f9b8180d6efa455648375662719272102c4f8028799d6","private_key":"751d508bcd33604fcc32799146ee07845fc1159580d23d46d4c8f86939cfd368","name":"node_c49caff13862dc089f1f9b8180d6efa455648375662719272102c4f8028799d6","services":["streamer"],"enable_msg_events":true,"port":35349},"up":true}},{"node":{"info":{"id":"caf6a8e37fd41c1e6ad77a8575cd90354bb1693893952301c9caeb4779c338d3","name":"node_caf6a8e37fd41c1e6ad77a8575cd90354bb1693893952301c9caeb4779c338d3","enode":"enode://032b6cb479ba63501feaba6ea9a5a1c0a5952e228ce6223a71ce74de13ee98d0b1f5167229e9609313ed643e1dbf3ff6124ec3c1158ea76885378b1867f90d54@127.0.0.1:0","enr":"0xf88fb8405c6b6d2ebf985d21c8d0ac47d9fde8e7bb43b8b2dcc9731ed7adea09b973a34f1407c6d0801c18739521dc7e60fd663a0f8888a1dfd86e3d8284aab6b811246e0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102032b6cb479ba63501feaba6ea9a5a1c0a5952e228ce6223a71ce74de13ee98d0","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"yvao43/UHB5q13qFdc2QNUuxaTiTlSMBycrrR3nDONM=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: caf6a8\npopulation: 35 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 3780 6e05 53a8 4447 | 146 13d6 (0) 103b (0) 11d4 (0) 165f (0)\n001 5 915d 88fe b65e b626 | 47 9890 (0) 9852 (0) 9fa0 (0) 9d0f (0)\n002 9 e8ef ec52 e5ad e5d7 | 37 e027 (0) e775 (0) e7fa (0) e514 (0)\n003 4 d863 db6a d7ac d640 | 11 d887 (0) d863 (0) db6a (0) daec (0)\n004 7 c26f c6cf c786 c59e | 9 c1f9 (0) c26f (0) c620 (0) c6cf (0)\n005 1 cc20 | 1 cc20 (0)\n============ DEPTH: 6 ==========================================\n006 3 c9f5 c898 c832 | 3 c9f5 (0) c898 (0) c832 (0)\n007 0 | 0\n008 1 ca04 | 1 ca04 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"caf6a8e37fd41c1e6ad77a8575cd90354bb1693893952301c9caeb4779c338d3","private_key":"7404cb8ddf7d531f80b522df15471c04183be2225349a44f9f07d118e9b508be","name":"node_caf6a8e37fd41c1e6ad77a8575cd90354bb1693893952301c9caeb4779c338d3","services":["streamer"],"enable_msg_events":true,"port":37023},"up":true}},{"node":{"info":{"id":"b5b24532d2810e311e10b1d606baf6007f9124b88a178b32713cf1eddae089be","name":"node_b5b24532d2810e311e10b1d606baf6007f9124b88a178b32713cf1eddae089be","enode":"enode://6ba4f9939fe79c2fa62906da87f6145579ce26244c232ef3a0ee23ceb8298c98cefef00b37faae81fc5535255f16604e5be09f2a544cb2dd1007f489ca73d910@127.0.0.1:0","enr":"0xf88fb840a537a74b55567b80ec626e0a4a8e8e4515acc8a9fe9b893068e006a292c9609609a11873cee2c6bff37d1b5e2b0406d5b61c997e3a28f76fa0a3f561d6d293810183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1026ba4f9939fe79c2fa62906da87f6145579ce26244c232ef3a0ee23ceb8298c98","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"tbJFMtKBDjEeELHWBrr2AH+RJLiKF4sycTzx7drgib4=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: b5b245\npopulation: 36 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 7 53a8 4ac7 4447 47bf | 146 5cd2 (0) 5db0 (0) 5efb (0) 5f00 (0)\n001 9 f2d5 e5ad e8ef d7ac | 63 e027 (0) e775 (0) e7fa (0) e514 (0)\n002 6 959f 96fc 976e 915d | 20 9852 (0) 9890 (0) 9fa0 (0) 9d0f (0)\n003 4 ac4d ad98 a6fb a653 | 10 ae2b (0) aeb4 (0) af02 (0) ad98 (0)\n004 3 ba88 badd baf2 | 9 bcc6 (0) b911 (0) b95d (0) b820 (0)\n005 3 b02b b2a5 b2b5 | 3 b02b (0) b2a5 (0) b2b5 (0)\n============ DEPTH: 6 ==========================================\n006 3 b65e b626 b7ca | 3 b7ca (0) b65e (0) b626 (0)\n007 0 | 0\n008 1 b502 | 1 b502 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"b5b24532d2810e311e10b1d606baf6007f9124b88a178b32713cf1eddae089be","private_key":"bb9cccb7fbaaf1b02e691345fdc13fbfb49ed17129b679b20e4cd008ed173b26","name":"node_b5b24532d2810e311e10b1d606baf6007f9124b88a178b32713cf1eddae089be","services":["streamer"],"enable_msg_events":true,"port":35555},"up":true}},{"node":{"info":{"id":"88fefb7506105c0e269baf52955a01b19f55504b13133bac0beab41c9f6e6942","name":"node_88fefb7506105c0e269baf52955a01b19f55504b13133bac0beab41c9f6e6942","enode":"enode://d002db12f24e09a012d47d716f63576d836cb4e6af9bbc4c563fffdeb4fb138675904bd4ee8ae0325a2be23e1017032cbda9124ba121b6df6bf3f129d4101cf4@127.0.0.1:0","enr":"0xf88fb840595a1f1435cf159c616f21eb11caab1ff821b51aa99b5f08bccb592945e7e073140d4625a0d25290d1a867fe36afe9b7b9740c374a72727f3375d7c9b75013190183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102d002db12f24e09a012d47d716f63576d836cb4e6af9bbc4c563fffdeb4fb1386","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"iP77dQYQXA4mm69SlVoBsZ9VUEsTEzusC+q0HJ9uaUI=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 88fefb\npopulation: 35 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 6e05 512e 53a8 4447 | 146 5cd2 (0) 5db0 (0) 5efb (0) 5f00 (0)\n001 9 f7fa f2d5 e5ad e8ef | 63 d887 (0) d863 (0) db6a (0) daec (0)\n002 6 a653 baf2 b65e b626 | 27 af02 (0) ae2b (0) aeb4 (0) ad98 (0)\n003 5 9d0f 959f 96fc 976e | 10 9852 (0) 9890 (0) 9fa0 (0) 9d0f (0)\n004 5 849b 8505 8025 82dd | 5 8505 (0) 849b (0) 8025 (0) 82dd (0)\n005 1 8f21 | 1 8f21 (0)\n============ DEPTH: 6 ==========================================\n006 0 | 0\n007 1 898d | 1 898d (0)\n008 1 886a | 1 886a (0)\n009 1 88a1 | 1 88a1 (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"88fefb7506105c0e269baf52955a01b19f55504b13133bac0beab41c9f6e6942","private_key":"60486eb333333a142330c9bf765d7fb5ea28918c3185e0013df6b65a50992256","name":"node_88fefb7506105c0e269baf52955a01b19f55504b13133bac0beab41c9f6e6942","services":["streamer"],"enable_msg_events":true,"port":36621},"up":true}},{"node":{"info":{"id":"37801e8d7d46143f78924ed66099f658a94d37edfd2f58d02acb85add03e1894","name":"node_37801e8d7d46143f78924ed66099f658a94d37edfd2f58d02acb85add03e1894","enode":"enode://ebdc2cb76ffdb28b7bc171d5210f6b3747caf9ef2a30848b043adff7d009ffbbd7e98427ef4035a46cbd69fd4f3f584d1d8f3bb96e36d865e626e4d9c82e4a91@127.0.0.1:0","enr":"0xf88fb8407932c8f5686fbbe250ac8a2d185c457889e6e4a89dce92326c0617685aa6f95212bd56382e464dac57d4be61991248c9485e070205d6e4065e47d40a1ad024860183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103ebdc2cb76ffdb28b7bc171d5210f6b3747caf9ef2a30848b043adff7d009ffbb","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"N4AejX1GFD94kk7WYJn2WKlNN+39L1jQKsuFrdA+GJQ=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 37801e\npopulation: 34 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 7 f2d5 caf6 c441 c49c | 110 db6a (0) daec (0) da67 (0) d887 (0)\n001 6 53a8 4ac7 49cd 47bf | 70 5cd2 (0) 5db0 (0) 5efb (0) 5f00 (0)\n002 5 1b83 02d8 0438 0cf5 | 44 103b (0) 11d4 (0) 13d6 (0) 1672 (0)\n003 6 256e 20ae 217f 2a0a | 15 24b8 (0) 256e (0) 20ae (0) 21a0 (0)\n004 3 3b88 3efc 3f94 | 7 39d1 (0) 3b78 (0) 3b88 (0) 3e8e (0)\n005 4 3373 314a 3089 30be | 6 3237 (0) 33b5 (0) 3373 (0) 314a (0)\n006 1 35e6 | 1 35e6 (0)\n============ DEPTH: 7 ==========================================\n007 1 3630 | 1 3630 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 1 378e | 1 378e (0)\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"37801e8d7d46143f78924ed66099f658a94d37edfd2f58d02acb85add03e1894","private_key":"369eb71eeb7b71c096c321177228fa31e9c9a28aa40a86cbfa645ba35b159f4f","name":"node_37801e8d7d46143f78924ed66099f658a94d37edfd2f58d02acb85add03e1894","services":["streamer"],"enable_msg_events":true,"port":46281},"up":true}},{"node":{"info":{"id":"915d7a0510bad19266eef8f00ca0cb2efc340253775706495fca8b9160b512cc","name":"node_915d7a0510bad19266eef8f00ca0cb2efc340253775706495fca8b9160b512cc","enode":"enode://22e79b248e289cce0fc5fa7dca0ce3cfdb2050b0151cc1435e3c0023cd1a07de7719d47f0dd8db4755266a2ec1bac0074f9753c8999c21cc1bcb5bf2f3abcd24@127.0.0.1:0","enr":"0xf88fb84078cc030ac8045a0e60c0ae70e0eb9bb3fd12770df422402905e64920ed3a568e19abd70ff4ea28b81fd7266a1eda7bb7aa25062222117467acd36f13d37fd78a0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10222e79b248e289cce0fc5fa7dca0ce3cfdb2050b0151cc1435e3c0023cd1a07de","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"kV16BRC60ZJm7vjwDKDLLvw0AlN3VwZJX8qLkWC1Esw=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 915d7a\npopulation: 31 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 512e 4558 4447 6e05 | 146 5cd2 (0) 5db0 (0) 5efb (0) 5f00 (0)\n001 10 f2d5 f7fa f629 ec52 | 63 d887 (0) d863 (0) db6a (0) daec (0)\n002 4 a653 baf2 b626 b5b2 | 27 af02 (0) aeb4 (0) ae2b (0) ad98 (0)\n003 4 82f9 898d 886a 88fe | 10 8505 (0) 849b (0) 8025 (0) 82dd (0)\n004 2 9fa0 9d0f | 4 9890 (0) 9852 (0) 9fa0 (0) 9d0f (0)\n005 3 96fc 976e 959f | 3 96fc (0) 976e (0) 959f (0)\n============ DEPTH: 6 ==========================================\n006 0 | 0\n007 2 9076 90a8 | 2 9076 (0) 90a8 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"915d7a0510bad19266eef8f00ca0cb2efc340253775706495fca8b9160b512cc","private_key":"46f8ff7c336416d502bd2c3ba10235eec55193182d1b1c0e74fc4763e2f12cb2","name":"node_915d7a0510bad19266eef8f00ca0cb2efc340253775706495fca8b9160b512cc","services":["streamer"],"enable_msg_events":true,"port":37115},"up":true}},{"node":{"info":{"id":"6e05179dc90a8f6654d0c9a3f06173371dcfb18b852fdd77f35f75e38f273125","name":"node_6e05179dc90a8f6654d0c9a3f06173371dcfb18b852fdd77f35f75e38f273125","enode":"enode://6cb33a608378cb32052368b80030aab00ffa4d25aeab3b017a18abcc39e2a8ca270fc88bfbe418dd31d426abd53107fdd99fcc230eb92632b5444644f101ac7c@127.0.0.1:0","enr":"0xf88fb8408e844dc2f0db4b3e2208b2adec83b24a99e19229c8902879c8c81877e506b4e32d3209a9af0119e2aa59342192dba0e72b3c74064f9f23a08ae09aa91199fb080183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1026cb33a608378cb32052368b80030aab00ffa4d25aeab3b017a18abcc39e2a8ca","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"bgUXnckKj2ZU0Mmj8GFzNx3PsYuFL9138191448nMSU=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 6e0517\npopulation: 35 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 9 c49c c441 caf6 f2d5 | 110 db6a (0) daec (0) da67 (0) d887 (0)\n001 5 0743 0438 217f 2ccf | 76 103b (0) 11d4 (0) 13d6 (0) 1672 (0)\n002 5 53a8 5f00 5b63 47bf | 38 5823 (0) 58ed (0) 5b63 (0) 5cd2 (0)\n003 2 7b90 7a60 | 12 775e (0) 77d2 (0) 7125 (0) 738c (0)\n004 4 67aa 6103 60d7 6337 | 9 66e7 (0) 67dc (0) 67aa (0) 6103 (0)\n005 2 6967 6831 | 2 6967 (0) 6831 (0)\n006 2 6c73 6c4d | 2 6c73 (0) 6c4d (0)\n007 3 6fe9 6f2d 6f5f | 3 6f2d (0) 6f5f (0) 6fe9 (0)\n============ DEPTH: 8 ==========================================\n008 2 6ea5 6ecb | 2 6ea5 (0) 6ecb (0)\n009 1 6e68 | 1 6e68 (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"6e05179dc90a8f6654d0c9a3f06173371dcfb18b852fdd77f35f75e38f273125","private_key":"1b7026a2b010aecd3db0637e03b2e0cf0bddfa9b0ad9d677056e091a03970305","name":"node_6e05179dc90a8f6654d0c9a3f06173371dcfb18b852fdd77f35f75e38f273125","services":["streamer"],"enable_msg_events":true,"port":35543},"up":true}},{"node":{"info":{"id":"f2d5533eed4b0c184952d859d67e44abe5a75a5de6111c8c106b8f4b2d8ccfc4","name":"node_f2d5533eed4b0c184952d859d67e44abe5a75a5de6111c8c106b8f4b2d8ccfc4","enode":"enode://0bed55a524855cf4b0ffa7a813b7cbbe61499512bd4579832af6444cce55217dc68f57f430feed9ef8214a49dbe0779600980fe1fa51afe837f8a9185d799ee6@127.0.0.1:0","enr":"0xf88fb84037c16835f858e5ccd867b9239f718531d6980f0b8d13d0eb0407dee672e37425392b42e2a352333d146fbebe5306020187121998d97f4caa33944a2667c4010c0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1020bed55a524855cf4b0ffa7a813b7cbbe61499512bd4579832af6444cce55217d","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"8tVTPu1LDBhJUthZ1n5Eq+WnWl3mERyMEGuPSy2Mz8Q=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: f2d553\npopulation: 38 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 3780 217f 2ccf 4447 | 146 0b72 (0) 0af9 (0) 0a00 (0) 0fc5 (0)\n001 8 88fe 915d 959f a653 | 47 af02 (0) aeb4 (0) ae2b (0) ad98 (0)\n002 7 d863 d7ac d640 c49c | 26 d1d7 (0) d3b0 (0) d299 (0) d7ac (0)\n003 6 ef07 ef1b e8ef e547 | 18 e027 (0) e775 (0) e7fa (0) e514 (0)\n004 3 fe31 fe21 ff36 | 6 f925 (0) fbc8 (0) fbf5 (0) fe21 (0)\n005 7 f4e0 f5dc f528 f629 | 10 f456 (0) f45f (0) f4e0 (0) f5b2 (0)\n============ DEPTH: 6 ==========================================\n006 0 | 0\n007 1 f31c | 1 f31c (0)\n008 1 f27f | 1 f27f (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"f2d5533eed4b0c184952d859d67e44abe5a75a5de6111c8c106b8f4b2d8ccfc4","private_key":"6e3b2aeb1f3f715a86807af2cd2090519998b92df4dfd138d51b3cce2526dbb0","name":"node_f2d5533eed4b0c184952d859d67e44abe5a75a5de6111c8c106b8f4b2d8ccfc4","services":["streamer"],"enable_msg_events":true,"port":44807},"up":true}},{"node":{"info":{"id":"444722a15b01a0d8e6794798d239fe621d59bdfc08823ab47cbd8b9acebd23b4","name":"node_444722a15b01a0d8e6794798d239fe621d59bdfc08823ab47cbd8b9acebd23b4","enode":"enode://9ef94c855735b705843c447b2998afbb14eb30166ca1c8dbc09b763fa8e04e67376ebc830d745404753f08b76f454e3948b4546c340209c1d2e4739e170a8bec@127.0.0.1:0","enr":"0xf88fb84033c73ee216ccaa7cd66408fa60642ea37fcf44ff76073b098a962c13f1a4df8a4ce4188d4a34a26de1df6c40daa70adfb66850b5cf39eeda6218fabb91bf4ea70183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1029ef94c855735b705843c447b2998afbb14eb30166ca1c8dbc09b763fa8e04e67","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"REcioVsBoNjmeUeY0jn+Yh1ZvfwIgjq0fL2Lms69I7Q=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 444722\npopulation: 40 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 8 915d 88fe b5b2 b65e | 110 af02 (0) ae2b (0) aeb4 (0) ad98 (0)\n001 9 1a2a 0438 0cf5 3780 | 76 13d6 (0) 103b (0) 11d4 (0) 1672 (0)\n002 4 6337 6fe9 6ecb 6e05 | 32 775e (0) 77d2 (0) 7125 (0) 738c (0)\n003 5 5db0 5f00 5b63 512e | 15 5823 (0) 58ed (0) 5b63 (0) 5cd2 (0)\n004 3 49cd 4ac7 4a8b | 11 4e5a (0) 4d59 (0) 4d6b (0) 4d10 (0)\n005 2 4109 41d9 | 2 41d9 (0) 4109 (0)\n006 6 4646 4636 461c 46fe | 6 4646 (0) 4636 (0) 461c (0) 46fe (0)\n============ DEPTH: 7 ==========================================\n007 2 4559 4558 | 2 4559 (0) 4558 (0)\n008 1 44a1 | 1 44a1 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"444722a15b01a0d8e6794798d239fe621d59bdfc08823ab47cbd8b9acebd23b4","private_key":"1a57d82b5818ffcf64fda640f5ed8c9fc1578d29faabdd9297f9bafcedf16afc","name":"node_444722a15b01a0d8e6794798d239fe621d59bdfc08823ab47cbd8b9acebd23b4","services":["streamer"],"enable_msg_events":true,"port":36309},"up":true}},{"node":{"info":{"id":"c441d27a5f4abaa8e3b0f040a6ef85bb8c970031d6a57503a674e36b3d6915d9","name":"node_c441d27a5f4abaa8e3b0f040a6ef85bb8c970031d6a57503a674e36b3d6915d9","enode":"enode://9cef4cd1c3b7a978ced64f36c0c3a9098aba2c07c45787c884a7946e6d21976321f7c05ebe7abfd92c63f1ca54c46acddb27b2c6bfd01759cb09c78a4ec0544f@127.0.0.1:0","enr":"0xf88fb8400693860ca7cd4d67ebdb615eaaf42fa1ae8f5ff87a593cd0ad7e2a34020e6e2748358c72363e272974698017a897ccbb600b0be698450de6df9d6870ed976fa10183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1039cef4cd1c3b7a978ced64f36c0c3a9098aba2c07c45787c884a7946e6d219763","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"xEHSel9KuqjjsPBApu+Fu4yXADHWpXUDpnTjaz1pFdk=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: c441d2\npopulation: 31 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 2ccf 217f 3780 6e05 | 146 13d6 (0) 103b (0) 11d4 (0) 1672 (0)\n001 5 898d 959f 915d b65e | 47 8505 (0) 849b (0) 8025 (0) 82dd (0)\n002 5 f2d5 f629 f7fa ec52 | 37 ee5e (0) efea (0) ef1b (0) ef07 (0)\n003 4 d863 df1e d640 d7ac | 11 d3b0 (0) d299 (0) d1d7 (0) d7ac (0)\n004 4 ca04 caf6 c9f5 c832 | 6 cc20 (0) c9f5 (0) c898 (0) c832 (0)\n005 2 c1f9 c26f | 2 c1f9 (0) c26f (0)\n006 3 c620 c6cf c786 | 3 c620 (0) c6cf (0) c786 (0)\n007 1 c59e | 1 c59e (0)\n============ DEPTH: 8 ==========================================\n008 1 c49c | 1 c49c (0)\n009 1 c43f | 1 c43f (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"c441d27a5f4abaa8e3b0f040a6ef85bb8c970031d6a57503a674e36b3d6915d9","private_key":"a67d3fd0aeb245cdd802262166fd8226b4f6034f416053f7ef9956a99c473419","name":"node_c441d27a5f4abaa8e3b0f040a6ef85bb8c970031d6a57503a674e36b3d6915d9","services":["streamer"],"enable_msg_events":true,"port":37581},"up":true}},{"node":{"info":{"id":"baf219e9229921b773d1ad7eb7eb5216cfa60ccecaa3c5c487e3b71cb600ba12","name":"node_baf219e9229921b773d1ad7eb7eb5216cfa60ccecaa3c5c487e3b71cb600ba12","enode":"enode://1c3d285d17974092dcbdb97e35e1885bbf94addb9dba5954e71c3ffc7348c4c58fdbf99598683dd6298c32ebaa5e7220e01715f4f5d2907af981f3b3167bdcce@127.0.0.1:0","enr":"0xf88fb840753f3903e7fa19460a5e7e20abc7555ba49cf8d52c7bbccd74918fc7f82461cb1e68b9970b23609530b70fd3059329b633f8639230949e4fe2cbdcd6af87edc40183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1021c3d285d17974092dcbdb97e35e1885bbf94addb9dba5954e71c3ffc7348c4c5","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"uvIZ6SKZIbdz0a1+t+tSFs+mDM7Ko8XEh+O3HLYAuhI=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: baf219\npopulation: 29 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 6e05 4447 3780 217f | 146 7125 (0) 738c (0) 7290 (0) 77d2 (0)\n001 6 f2d5 e5d7 e8ef ec52 | 63 eb98 (0) e854 (0) e883 (0) e8ef (0)\n002 3 88fe 915d 959f | 20 8505 (0) 849b (0) 8025 (0) 82dd (0)\n003 3 ad98 ac4d a653 | 10 af02 (0) ae2b (0) aeb4 (0) ad98 (0)\n004 5 b2b5 b502 b5b2 b626 | 8 b02b (0) b2a5 (0) b2b5 (0) b502 (0)\n005 1 bcc6 | 1 bcc6 (0)\n006 3 b897 b95d b911 | 4 b820 (0) b897 (0) b95d (0) b911 (0)\n007 1 bb90 | 1 bb90 (0)\n============ DEPTH: 8 ==========================================\n008 0 | 0\n009 1 ba88 | 1 ba88 (0)\n010 1 badd | 1 badd (0)\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"baf219e9229921b773d1ad7eb7eb5216cfa60ccecaa3c5c487e3b71cb600ba12","private_key":"a5e1aa7f7374964afa85de3c3c1b2fa8a1caf2a27cf7be2844136deaf4f0ffa7","name":"node_baf219e9229921b773d1ad7eb7eb5216cfa60ccecaa3c5c487e3b71cb600ba12","services":["streamer"],"enable_msg_events":true,"port":40635},"up":true}},{"node":{"info":{"id":"2ccfb5b1f3923d35fef88838c508b98b5516c5d409643881d2304ae49e50eed3","name":"node_2ccfb5b1f3923d35fef88838c508b98b5516c5d409643881d2304ae49e50eed3","enode":"enode://f81b4d7e1b4722dad58825039b3c38ddbebefc1a236c2080a520401e9483f6584433e2692ec15fcdc707d03bb9a6bf0ff7c912be023789af49c0a309da7631d4@127.0.0.1:0","enr":"0xf88fb8408bebaa03804d729c21adf92503814a0abf62421bf5f9a3830e95f47bcbf6fdb235a690cfd4e81ca66a5934af140d762788ac0f9c110afd2a54400eb8429453320183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102f81b4d7e1b4722dad58825039b3c38ddbebefc1a236c2080a520401e9483f658","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"LM+1sfOSPTX++Ig4xQi5i1UWxdQJZDiB0jBK5J5Q7tM=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 2ccfb5\npopulation: 33 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 c441 ec52 f7fa f2d5 | 110 fbc8 (0) fbf5 (0) f925 (0) fe31 (0)\n001 4 6337 6e05 49cd 4447 | 70 775e (0) 77d2 (0) 7125 (0) 738c (0)\n002 7 1b83 1c47 0438 02d8 | 44 13d6 (0) 103b (0) 11d4 (0) 154b (0)\n003 3 30be 3089 3780 | 17 3e8e (0) 3efc (0) 3ec5 (0) 3f94 (0)\n004 5 256e 24b8 20ae 2101 | 6 256e (0) 24b8 (0) 20ae (0) 21a0 (0)\n005 4 2995 2a0a 2abb 2a97 | 4 2995 (0) 2abb (0) 2a97 (0) 2a0a (0)\n006 1 2f32 | 1 2f32 (0)\n007 1 2d36 | 1 2d36 (0)\n============ DEPTH: 8 ==========================================\n008 2 2c79 2c38 | 2 2c79 (0) 2c38 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"2ccfb5b1f3923d35fef88838c508b98b5516c5d409643881d2304ae49e50eed3","private_key":"056d524a765c48a6c1ab41c42f6cf836183cf10b73481f79cc49b79a3f6b5769","name":"node_2ccfb5b1f3923d35fef88838c508b98b5516c5d409643881d2304ae49e50eed3","services":["streamer"],"enable_msg_events":true,"port":43231},"up":true}},{"node":{"info":{"id":"217f9952af1eb58d5ca5ac7be763716cfe2c0a4f3cdd4ebe4b5df563f919e2d2","name":"node_217f9952af1eb58d5ca5ac7be763716cfe2c0a4f3cdd4ebe4b5df563f919e2d2","enode":"enode://37f0965106672daa2a8e343623357ad538b5115d0f80fe74ef78f1d21863978762f82a776b97a1ea718ac52944af0a9e3c616d9f0c89f719a5aa940dd5b27a05@127.0.0.1:0","enr":"0xf88fb840f5488dc6acca9725c22fa1877fdf275cc7fc44feb78fb19f3cc4d712b78fa4820df8834c815cd7f6aeda861ba2236c7d6b425861780f726bd4f1277b707c2f390183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10337f0965106672daa2a8e343623357ad538b5115d0f80fe74ef78f1d218639787","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"IX+ZUq8etY1cpax752NxbP4sCk883U6+S131Y/kZ4tI=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 217f99\npopulation: 30 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 8 c441 f7fa f2d5 ec52 | 110 d1d7 (0) d299 (0) d3b0 (0) d7ac (0)\n001 4 6337 6e05 49cd 4447 | 70 775e (0) 77d2 (0) 7125 (0) 738c (0)\n002 3 0cf5 03cc 0438 | 44 13d6 (0) 11d4 (0) 103b (0) 154b (0)\n003 4 3089 30be 3630 3780 | 17 39d1 (0) 3b88 (0) 3b78 (0) 3e8e (0)\n004 6 2995 2a97 2a0a 2d36 | 9 2995 (0) 2abb (0) 2a97 (0) 2a0a (0)\n005 2 256e 24b8 | 2 256e (0) 24b8 (0)\n============ DEPTH: 6 ==========================================\n006 0 | 0\n007 1 20ae | 1 20ae (0)\n008 1 21a0 | 1 21a0 (0)\n009 1 2101 | 1 2101 (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"217f9952af1eb58d5ca5ac7be763716cfe2c0a4f3cdd4ebe4b5df563f919e2d2","private_key":"2713b4b4549ba404d31cc2bc1f2bef523f8e70e0d00cca2667bb393532c2ec78","name":"node_217f9952af1eb58d5ca5ac7be763716cfe2c0a4f3cdd4ebe4b5df563f919e2d2","services":["streamer"],"enable_msg_events":true,"port":36795},"up":true}},{"node":{"info":{"id":"0438f567045d4556a0e7a697028d689ecfd0ae20f9e85c09b48d9f1fd0ee4765","name":"node_0438f567045d4556a0e7a697028d689ecfd0ae20f9e85c09b48d9f1fd0ee4765","enode":"enode://2a609a2f7bee18e9ace30fb43ae2c4440d114f3c4888ec0a34d24ebd1fa6156d633c4f2aa0f3eaed2db3abdc5fd1f634fb8a511fce8c719cde7248d202de66df@127.0.0.1:0","enr":"0xf88fb8408d5e6847e83be24d36a5259f7935a065f251552352ee158a5edfa798e6e86fbe00cbbc7bc7f90319931c1b7398f3e81894b504f3abfde6bcdec7daa4a90062350183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1032a609a2f7bee18e9ace30fb43ae2c4440d114f3c4888ec0a34d24ebd1fa6156d","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"BDj1ZwRdRVag56aXAo1ons/QriD56FwJtI2fH9DuR2U=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 0438f5\npopulation: 33 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 f7fa e5d7 b65e 959f | 110 cc20 (0) c9f5 (0) c898 (0) c832 (0)\n001 4 53a8 4447 6e05 6337 | 70 775e (0) 77d2 (0) 7125 (0) 738c (0)\n002 4 3780 3089 2ccf 217f | 32 3b88 (0) 3b78 (0) 39d1 (0) 3f94 (0)\n003 6 1704 1400 1b83 1a2a | 22 13d6 (0) 103b (0) 11d4 (0) 154b (0)\n004 5 0b72 0de3 0d8a 0c64 | 11 0b72 (0) 0af9 (0) 0a00 (0) 0ff2 (0)\n005 5 0067 00c6 03cc 0328 | 5 00c6 (0) 0067 (0) 02d8 (0) 0328 (0)\n006 3 0661 07a8 0743 | 3 0661 (0) 07a8 (0) 0743 (0)\n============ DEPTH: 7 ==========================================\n007 0 | 0\n008 0 | 0\n009 2 045b 0451 | 2 045b (0) 0451 (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"0438f567045d4556a0e7a697028d689ecfd0ae20f9e85c09b48d9f1fd0ee4765","private_key":"7550104c3b78bd70d311385917b9e119ce140cd3584dfe07f18913b06e289257","name":"node_0438f567045d4556a0e7a697028d689ecfd0ae20f9e85c09b48d9f1fd0ee4765","services":["streamer"],"enable_msg_events":true,"port":39107},"up":true}},{"node":{"info":{"id":"959fda0866d3c18e9399e98485d627044079d6f86b075edaea9315402f5d9395","name":"node_959fda0866d3c18e9399e98485d627044079d6f86b075edaea9315402f5d9395","enode":"enode://94c05c36e8bda926576025fad9d891d1ae55f406eadb1b2a7040191907ac20a4618ab4af002e997762e3f4a747f417b9c66d3341b0819cb39514b2cfcbf633f8@127.0.0.1:0","enr":"0xf88fb840de6c271ba449dd87a205230febdcc13445277635cb2fb770e1bc7d4df1a6d488210fe6caff9e998f66112dba40d39585301fd3e88f2e0493f3f02c71a684f6e10183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10294c05c36e8bda926576025fad9d891d1ae55f406eadb1b2a7040191907ac20a4","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"lZ/aCGbTwY6TmemEhdYnBEB51vhrB17a6pMVQC9dk5U=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 959fda\npopulation: 35 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 7 4558 512e 5f00 6337 | 146 574f (0) 524d (0) 534b (0) 5308 (0)\n001 9 c786 c59e c441 f7fa | 63 cc20 (0) c9f5 (0) c898 (0) c832 (0)\n002 6 ac4d a653 baf2 b5b2 | 27 aeb4 (0) ae2b (0) af02 (0) ad98 (0)\n003 5 8025 82f9 88fe 886a | 10 8505 (0) 849b (0) 8025 (0) 82dd (0)\n004 3 9890 9fa0 9d0f | 4 9852 (0) 9890 (0) 9fa0 (0) 9d0f (0)\n005 3 90a8 9076 915d | 3 9076 (0) 90a8 (0) 915d (0)\n============ DEPTH: 6 ==========================================\n006 2 96fc 976e | 2 96fc (0) 976e (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"959fda0866d3c18e9399e98485d627044079d6f86b075edaea9315402f5d9395","private_key":"a67fcf115dfe059791011d5d3825dec2155cabd72c208e838b3fbb2f28ac41a9","name":"node_959fda0866d3c18e9399e98485d627044079d6f86b075edaea9315402f5d9395","services":["streamer"],"enable_msg_events":true,"port":36529},"up":true}},{"node":{"info":{"id":"b65ee2549536a806ceef4a7ccc9544567cafe6204080929fc847df0a3781ccc9","name":"node_b65ee2549536a806ceef4a7ccc9544567cafe6204080929fc847df0a3781ccc9","enode":"enode://26664c55fa01411c68d45ee7e420631080f79cb0864dab6839e3fbd228061380f8d6ec4ed7e0d1fccfb3a6db94d25e49381fbd05f82d256e83694b44e75d326b@127.0.0.1:0","enr":"0xf88fb840b6133c0426dafd1efb3e89f6bc48cc63eca4c7bdf38f294f43a2805d2298640c241968809a87cf5d2889912bce5dbad860521fe9d6baf1a7b79d82530f26d4a00183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10326664c55fa01411c68d45ee7e420631080f79cb0864dab6839e3fbd228061380","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"tl7iVJU2qAbO70p8zJVEVnyv5iBAgJKfyEffCjeBzMk=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: b65ee2\npopulation: 31 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 6e05 5f00 4447 217f | 146 574f (0) 51db (0) 512e (0) 524d (0)\n001 9 df1e c441 c49c caf6 | 63 cc20 (0) c9f5 (0) c898 (0) c832 (0)\n002 5 898d 886a 88fe 9d0f | 20 8505 (0) 849b (0) 8025 (0) 82dd (0)\n003 2 ac4d a653 | 10 af02 (0) ae2b (0) aeb4 (0) ad98 (0)\n004 3 ba88 badd baf2 | 9 bcc6 (0) b897 (0) b820 (0) b95d (0)\n005 2 b02b b2b5 | 3 b2a5 (0) b2b5 (0) b02b (0)\n006 2 b5b2 b502 | 2 b502 (0) b5b2 (0)\n============ DEPTH: 7 ==========================================\n007 1 b7ca | 1 b7ca (0)\n008 0 | 0\n009 1 b626 | 1 b626 (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"b65ee2549536a806ceef4a7ccc9544567cafe6204080929fc847df0a3781ccc9","private_key":"318a101c039a46bd0175afcb703828e82134ecef76cdcb18287938d57831ee61","name":"node_b65ee2549536a806ceef4a7ccc9544567cafe6204080929fc847df0a3781ccc9","services":["streamer"],"enable_msg_events":true,"port":44539},"up":true}},{"node":{"info":{"id":"0cf596af91eb9b041fe6dbe6b288c5730413850321b5ab176c81447e34ef79c5","name":"node_0cf596af91eb9b041fe6dbe6b288c5730413850321b5ab176c81447e34ef79c5","enode":"enode://450a836838f2759b33e799ec371253efe81e90e74db6f41b868bacb6429d0683dcf1fa1a8b4b761114fbc8826a796bcfc02f6a1798640d4ca58d845f064cadfd@127.0.0.1:0","enr":"0xf88fb840a59d9bcd8c093e82d30493da5fae7fd2e389dcd1428aeb3e828ddecadc97eb861f318f3f6d9652abb3e775bd5fa6fd84f4eb2b2d5c72ddb8ed22919c30f07dab0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103450a836838f2759b33e799ec371253efe81e90e74db6f41b868bacb6429d0683","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"DPWWr5HrmwQf5tvmsojFcwQThQMhtasXbIFEfjTvecU=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 0cf596\npopulation: 32 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 e5d7 b65e | 110 cc20 (0) c9f5 (0) c898 (0) c832 (0)\n001 3 4447 5f00 6337 | 70 4e5a (0) 4c9e (0) 4d59 (0) 4d6b (0)\n002 5 3780 3089 20ae 217f | 32 39d1 (0) 3b88 (0) 3b78 (0) 3e8e (0)\n003 6 1c47 18f6 1a2a 1b83 | 22 13d6 (0) 103b (0) 11d4 (0) 154b (0)\n004 6 0067 02d8 03cc 0743 | 11 00c6 (0) 0067 (0) 02d8 (0) 0328 (0)\n005 3 0b72 0af9 0a00 | 3 0b72 (0) 0af9 (0) 0a00 (0)\n006 3 0fc5 0ff2 0e5e | 3 0fc5 (0) 0ff2 (0) 0e5e (0)\n007 2 0d8a 0de3 | 2 0de3 (0) 0d8a (0)\n============ DEPTH: 8 ==========================================\n008 2 0c28 0c64 | 2 0c28 (0) 0c64 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"0cf596af91eb9b041fe6dbe6b288c5730413850321b5ab176c81447e34ef79c5","private_key":"aa043f31ce0392fc2403ba8df2e8a31397d5e5f23c22dabce1e4f94a3ae1ae3a","name":"node_0cf596af91eb9b041fe6dbe6b288c5730413850321b5ab176c81447e34ef79c5","services":["streamer"],"enable_msg_events":true,"port":33613},"up":true}},{"node":{"info":{"id":"e5d794d64003725a74642f097c0ee76706d78419b6f3ea819d440bc0ad166eac","name":"node_e5d794d64003725a74642f097c0ee76706d78419b6f3ea819d440bc0ad166eac","enode":"enode://62058bc379f81fa123e4296db03c67338ae62a539937d7b70a28a703624cdd451e739398d8dc6ed3f1b8c73cbb334b5cb7784d308b033ec5a9e61bedd06b050f@127.0.0.1:0","enr":"0xf88fb840e8da211f089ba6f711e92e1ad129af4bb030723cd33a3e2ad4e50fe4b81095403bbe8888a9e5b4ce5c0100c564b97767d80733b74ee5bafd5fc702364ecab3a10183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10362058bc379f81fa123e4296db03c67338ae62a539937d7b70a28a703624cdd45","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"5deU1kADclp0ZC8JfA7nZwbXhBm28+qBnUQLwK0Wbqw=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: e5d794\npopulation: 36 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 7 5f00 6337 3089 217f | 146 4e5a (0) 4c9e (0) 4d10 (0) 4d6b (0)\n001 6 b65e baf2 a653 9d0f | 47 8505 (0) 849b (0) 82dd (0) 82f9 (0)\n002 8 d640 d7ac d863 df1e | 26 cc20 (0) c9f5 (0) c898 (0) c832 (0)\n003 4 ff36 f2d5 f629 f7fa | 19 fbc8 (0) fbf5 (0) f925 (0) fe21 (0)\n004 4 e8ef ef1b ef07 ec52 | 10 eb98 (0) e854 (0) e883 (0) e8ef (0)\n005 1 e027 | 1 e027 (0)\n006 2 e775 e7fa | 2 e775 (0) e7fa (0)\n============ DEPTH: 7 ==========================================\n007 0 | 0\n008 3 e514 e54b e547 | 3 e514 (0) e54b (0) e547 (0)\n009 1 e5ad | 1 e5ad (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"e5d794d64003725a74642f097c0ee76706d78419b6f3ea819d440bc0ad166eac","private_key":"d57174d811911d6109444b6859f566feda29464787037865b1e86f3d852d82c3","name":"node_e5d794d64003725a74642f097c0ee76706d78419b6f3ea819d440bc0ad166eac","services":["streamer"],"enable_msg_events":true,"port":33845},"up":true}},{"node":{"info":{"id":"ec52270604007673d1bfda1edbd8bfa945a21141efd85e42b684a9f30f8cddae","name":"node_ec52270604007673d1bfda1edbd8bfa945a21141efd85e42b684a9f30f8cddae","enode":"enode://78ada9ae0e9eeed303dfc34f560a3a254035857113ab0dd666ec66af33f65a057e050f3c0689eb1960f76f1cbd66ce97d03969c529ac8e264419b8c97aeb5b33@127.0.0.1:0","enr":"0xf88fb84019543c86b688b2e1ac9bb456d94ff1626ea0e8f1afe71fbd92ac278bc30265d850ecec065550473c16a03073e2eb1955d5307248437930167b599a69c298e7610183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10378ada9ae0e9eeed303dfc34f560a3a254035857113ab0dd666ec66af33f65a05","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"7FInBgQAdnPRv9oe29i/qUWiEUHv2F5CtoSp8w+M3a4=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: ec5227\npopulation: 36 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 217f 2ccf 0743 1c47 | 146 256e (0) 24b8 (0) 20ae (0) 21a0 (0)\n001 6 9d0f 959f 915d b65e | 47 8505 (0) 849b (0) 8025 (0) 82dd (0)\n002 10 c786 c441 c49c c9f5 | 26 cc20 (0) c9f5 (0) c898 (0) c832 (0)\n003 4 ff36 f629 f7ba f7fa | 19 fbc8 (0) fbf5 (0) f925 (0) fe21 (0)\n004 3 e514 e5ad e5d7 | 8 e027 (0) e775 (0) e7fa (0) e54b (0)\n005 2 e854 e8ef | 4 eb98 (0) e854 (0) e883 (0) e8ef (0)\n============ DEPTH: 6 ==========================================\n006 4 ee5e efea ef1b ef07 | 4 ee5e (0) efea (0) ef1b (0) ef07 (0)\n007 1 ed2d | 1 ed2d (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"ec52270604007673d1bfda1edbd8bfa945a21141efd85e42b684a9f30f8cddae","private_key":"2eef17b1cd655ba656219906144f6dd5423e5c13fb8cfa3888a3fd60cc378cbd","name":"node_ec52270604007673d1bfda1edbd8bfa945a21141efd85e42b684a9f30f8cddae","services":["streamer"],"enable_msg_events":true,"port":43813},"up":true}},{"node":{"info":{"id":"63370e288ab2e4b8403c6678e9c44ae5c7496b5ead614306fceb85986ed29d18","name":"node_63370e288ab2e4b8403c6678e9c44ae5c7496b5ead614306fceb85986ed29d18","enode":"enode://e8a75bd7d2c0fa2c24d5e2505d6498a8158fa26cb0d97c3b4b68beb3abc827f44a87c3ecf11c56c0378c0572dd72d089765fe6598de6d897bb96cf033f27e730@127.0.0.1:0","enr":"0xf88fb8402480841002b2349bc7b775205391159f0d46294fd74c074f0e498aa92ba083f758bfa4f1b5b909441c0ac5304e35b6fb23b60d61ac7ca6a63cc099dae63215e40183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102e8a75bd7d2c0fa2c24d5e2505d6498a8158fa26cb0d97c3b4b68beb3abc827f4","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"YzcOKIqy5LhAPGZ46cRK5cdJa16tYUMG/OuFmG7SnRg=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 63370e\npopulation: 41 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 7 9d0f 959f a653 f629 | 110 8025 (0) 82dd (0) 82f9 (0) 8505 (0)\n001 12 2a0a 2ccf 20ae 2101 | 76 256e (0) 24b8 (0) 21a0 (0) 2101 (0)\n002 5 4447 5308 5b63 5f00 | 38 4e5a (0) 4c9e (0) 4d6b (0) 4d59 (0)\n003 5 7290 738c 7dd3 7b90 | 12 775e (0) 77d2 (0) 7125 (0) 7290 (0)\n004 4 6f5f 6fe9 6ecb 6e05 | 11 6967 (0) 6831 (0) 6c73 (0) 6c4d (0)\n005 3 66e7 67aa 67dc | 3 66e7 (0) 67dc (0) 67aa (0)\n006 3 60d7 605a 6103 | 3 60d7 (0) 605a (0) 6103 (0)\n============ DEPTH: 7 ==========================================\n007 2 628e 6251 | 2 628e (0) 6251 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"63370e288ab2e4b8403c6678e9c44ae5c7496b5ead614306fceb85986ed29d18","private_key":"abec58c20cbfc6963e54b76ae6003547d7125c820d4c878b12e7e7ffcee87cae","name":"node_63370e288ab2e4b8403c6678e9c44ae5c7496b5ead614306fceb85986ed29d18","services":["streamer"],"enable_msg_events":true,"port":35121},"up":true}},{"node":{"info":{"id":"f7fa2986ec9f84822b11a6b00bd03a1dd26f2a0fab90b1b308f08caead43cfe1","name":"node_f7fa2986ec9f84822b11a6b00bd03a1dd26f2a0fab90b1b308f08caead43cfe1","enode":"enode://760e043d37f149548183d41cdc870ab25e79461d0fb8ffdea5449bc04a3a83556d528ac0d81aba167a040d28e4ed2698c1022c1c2d0363d2c5f06f81563a721d@127.0.0.1:0","enr":"0xf88fb840a766a95d16d134be07e5941a44194fdc8e04d99ff58c3a35bd21692a7e8659921b69df71c2d402ac905d91f8f8c1bfe4b13117faf6aa42d79df4319efb5ea6c00183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103760e043d37f149548183d41cdc870ab25e79461d0fb8ffdea5449bc04a3a8355","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"9/ophuyfhIIrEaawC9A6HdJvKg+rkLGzCPCMrq1Dz+E=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: f7fa29\npopulation: 40 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 7 5f00 6337 2ccf 217f | 146 4e5a (0) 4c9e (0) 4d59 (0) 4d6b (0)\n001 8 9d0f 959f 915d 898d | 47 8505 (0) 849b (0) 8025 (0) 82dd (0)\n002 8 c832 c9f5 caf6 c49c | 26 cc20 (0) c9f5 (0) c898 (0) c832 (0)\n003 5 e5d7 e8ef ef1b ef07 | 18 e027 (0) e775 (0) e7fa (0) e514 (0)\n004 3 fbf5 fe31 ff36 | 6 fbc8 (0) fbf5 (0) f925 (0) fe21 (0)\n005 2 f31c f2d5 | 3 f31c (0) f27f (0) f2d5 (0)\n006 4 f4e0 f5b2 f5dc f528 | 6 f456 (0) f45f (0) f4e0 (0) f5b2 (0)\n007 1 f629 | 1 f629 (0)\n============ DEPTH: 8 ==========================================\n008 1 f773 | 1 f773 (0)\n009 1 f7ba | 1 f7ba (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"f7fa2986ec9f84822b11a6b00bd03a1dd26f2a0fab90b1b308f08caead43cfe1","private_key":"5b66c852efc722720d943acdff6e44cf35572b3ebc9e25c2efb6d44a44ec4f34","name":"node_f7fa2986ec9f84822b11a6b00bd03a1dd26f2a0fab90b1b308f08caead43cfe1","services":["streamer"],"enable_msg_events":true,"port":37377},"up":true}},{"node":{"info":{"id":"03ccd8d52597d18c0b178ab7361d847d63aad3af920a28345977ae170a1dafcd","name":"node_03ccd8d52597d18c0b178ab7361d847d63aad3af920a28345977ae170a1dafcd","enode":"enode://f5754931b229bb88a9054a16e5a825c93b24fa190fd5cb1346f9c8d3ef63f4df173e4ca8cdf98ff3be0fc5d3ab44524bd95a9089a8d071964cc628219d22c11f@127.0.0.1:0","enr":"0xf88fb84071325b9451536f678c1dfebe4f7aa8106a51d55f3bff1e449d2721a6fbededad0602cb742328ce7c26870565fea9a7efa0b78c561848cf9d9bd1a185fca960dc0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103f5754931b229bb88a9054a16e5a825c93b24fa190fd5cb1346f9c8d3ef63f4df","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"A8zY1SWX0YwLF4q3Nh2EfWOq06+SCig0WXeuFwodr80=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 03ccd8\npopulation: 28 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 898d 9d0f f7fa | 110 8505 (0) 849b (0) 8025 (0) 82dd (0)\n001 3 6ecb 6337 5f00 | 70 7125 (0) 738c (0) 7290 (0) 775e (0)\n002 5 2a0a 2ccf 217f 20ae | 32 2f32 (0) 2d36 (0) 2c79 (0) 2c38 (0)\n003 5 1704 18f6 1a2a 1f67 | 22 13d6 (0) 103b (0) 11d4 (0) 154b (0)\n004 4 0a00 0e5e 0cf5 0c64 | 11 0b72 (0) 0af9 (0) 0a00 (0) 0ff2 (0)\n005 4 0661 0743 0438 0451 | 6 045b (0) 0451 (0) 0438 (0) 0661 (0)\n006 2 00c6 0067 | 2 00c6 (0) 0067 (0)\n============ DEPTH: 7 ==========================================\n007 1 02d8 | 1 02d8 (0)\n008 1 0328 | 1 0328 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"03ccd8d52597d18c0b178ab7361d847d63aad3af920a28345977ae170a1dafcd","private_key":"f9bcfddd59b4cd6907137f85a165d8d1d046ea6f941259d24d6f2665345cf86b","name":"node_03ccd8d52597d18c0b178ab7361d847d63aad3af920a28345977ae170a1dafcd","services":["streamer"],"enable_msg_events":true,"port":41855},"up":true}},{"node":{"info":{"id":"1c47ad5bd8846f777daf59587feccc308f4dc63f6d27b1385ff8085c75bb1aac","name":"node_1c47ad5bd8846f777daf59587feccc308f4dc63f6d27b1385ff8085c75bb1aac","enode":"enode://63429a53e98ea2c805da1f72629bc2dfa38477f37e946c23a9a556e105170d09ba9fc04a92c9c002f5afacb97323330dd80c7b6facee5c66d70acb13f0a2ef07@127.0.0.1:0","enr":"0xf88fb840c8a077c9b0ef7333f8f167874fe84783be8d6e18a6017fc6cacf229dab3e7a4b1f898958a70aebef08571f0bc40a3de1545c0b4c6bd945f28c5615df92fa47050183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10363429a53e98ea2c805da1f72629bc2dfa38477f37e946c23a9a556e105170d09","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"HEetW9iEb3d9r1lYf+zMMI9Nxj9tJ7E4X/gIXHW7Gqw=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 1c47ad\npopulation: 25 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 ec52 f629 a653 | 110 cc20 (0) c9f5 (0) c898 (0) c832 (0)\n001 2 6337 5f00 | 70 7125 (0) 738c (0) 7290 (0) 775e (0)\n002 4 3089 2ccf 2a0a 20ae | 32 2f32 (0) 2d36 (0) 2c79 (0) 2c38 (0)\n003 6 0cf5 0c64 0451 0438 | 22 0b72 (0) 0af9 (0) 0a00 (0) 0ff2 (0)\n004 2 1400 1704 | 12 13d6 (0) 103b (0) 11d4 (0) 154b (0)\n005 3 18f6 1b83 1a2a | 4 19fa (0) 18f6 (0) 1b83 (0) 1a2a (0)\n006 3 1e2a 1f85 1f67 | 3 1e2a (0) 1f85 (0) 1f67 (0)\n============ DEPTH: 7 ==========================================\n007 0 | 0\n008 2 1c9c 1c8a | 2 1c9c (0) 1c8a (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"1c47ad5bd8846f777daf59587feccc308f4dc63f6d27b1385ff8085c75bb1aac","private_key":"ebc5324f8eb3a357f8d1969f069ce39c7c3fb22ccf7525110318b3ac880c1ca3","name":"node_1c47ad5bd8846f777daf59587feccc308f4dc63f6d27b1385ff8085c75bb1aac","services":["streamer"],"enable_msg_events":true,"port":42947},"up":true}},{"node":{"info":{"id":"5f00b3bebef2f5484ff1386298add68a6743a106200ae8a13a27dbb52714ee8f","name":"node_5f00b3bebef2f5484ff1386298add68a6743a106200ae8a13a27dbb52714ee8f","enode":"enode://480ba1e732c94f5f601e880599ab5b96e240599a8966fe2ddda4073307a99742a535dff51f6af5bd1b53fce8537be4bc5e2fa76c49449c0415442adba987460a@127.0.0.1:0","enr":"0xf88fb8401875d2a45f120ec3d8f94c4cf3efefff3c45785956e1a09d0446b9ea48b3cb1820585e3f5ab525ca7b0fb517ce83fbebc51c66913a99e3e1a3121c9d2583f0950183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102480ba1e732c94f5f601e880599ab5b96e240599a8966fe2ddda4073307a99742","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"XwCzvr7y9UhP8ThimK3WimdDoQYgCuihOifbtScU7o8=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 5f00b3\npopulation: 45 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 9 d863 df1e ec52 e5d7 | 110 cc20 (0) ca04 (0) caf6 (0) c9f5 (0)\n001 12 2a0a 2c38 2d36 2101 | 76 2f32 (0) 2d36 (0) 2c79 (0) 2c38 (0)\n002 9 7b90 7a60 77d2 6337 | 32 7125 (0) 738c (0) 7290 (0) 775e (0)\n003 6 4447 47bf 461c 4646 | 23 4e5a (0) 4c9e (0) 4d59 (0) 4d6b (0)\n004 4 53a8 5308 512e 51db | 8 574f (0) 524d (0) 53fe (0) 53a8 (0)\n005 2 5b63 58ed | 3 5b63 (0) 5823 (0) 58ed (0)\n============ DEPTH: 6 ==========================================\n006 2 5cd2 5db0 | 2 5cd2 (0) 5db0 (0)\n007 1 5efb | 1 5efb (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"5f00b3bebef2f5484ff1386298add68a6743a106200ae8a13a27dbb52714ee8f","private_key":"9b3dc4d343d8005de0a128e913e4ed62e5caec6a02eb7c00580bec4be6126b5e","name":"node_5f00b3bebef2f5484ff1386298add68a6743a106200ae8a13a27dbb52714ee8f","services":["streamer"],"enable_msg_events":true,"port":36775},"up":true}},{"node":{"info":{"id":"0743bcf2aaa77e916f4a367d6159473c7d80f46a2e4cbe9ef346e423d39d7072","name":"node_0743bcf2aaa77e916f4a367d6159473c7d80f46a2e4cbe9ef346e423d39d7072","enode":"enode://19c7cdd72825b48029116b58a6a68b357fcc7dade4a419c159b7a1479b9aaaca9040f86319f2e30d881a255728459f53f62e11907116fb7f0d95b17cf8acd4ce@127.0.0.1:0","enr":"0xf88fb84082a5fb67d177a01d43d741c548086b575590cb32e8f8ca21ea57c96b5d3e3b247a3aa5b69c1cf6eb5ea7e667736efd50f3bf23a658d2738640b8e8f01c8684780183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10219c7cdd72825b48029116b58a6a68b357fcc7dade4a419c159b7a1479b9aaaca","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"B0O88qqnfpFvSjZ9YVlHPH2A9GouTL6e80bkI9OdcHI=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 0743bc\npopulation: 29 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 8 fe31 f629 e5d7 ec52 | 110 cc20 (0) ca04 (0) caf6 (0) c9f5 (0)\n001 4 6f5f 6ecb 6e05 5f00 | 70 77d2 (0) 775e (0) 7125 (0) 738c (0)\n002 3 2a0a 20ae 3089 | 32 2f32 (0) 2c79 (0) 2c38 (0) 2ccf (0)\n003 3 1704 1f67 1c47 | 22 13d6 (0) 103b (0) 11d4 (0) 154b (0)\n004 4 0e5e 0d8a 0c64 0cf5 | 11 0af9 (0) 0a00 (0) 0b72 (0) 0fc5 (0)\n005 3 0067 03cc 02d8 | 5 00c6 (0) 0067 (0) 02d8 (0) 0328 (0)\n006 2 0451 0438 | 3 045b (0) 0451 (0) 0438 (0)\n============ DEPTH: 7 ==========================================\n007 1 0661 | 1 0661 (0)\n008 1 07a8 | 1 07a8 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"0743bcf2aaa77e916f4a367d6159473c7d80f46a2e4cbe9ef346e423d39d7072","private_key":"47ac9bcf8a80092ec709388ead63309357c024e48a9d084b0242dfc58046fd79","name":"node_0743bcf2aaa77e916f4a367d6159473c7d80f46a2e4cbe9ef346e423d39d7072","services":["streamer"],"enable_msg_events":true,"port":44873},"up":true}},{"node":{"info":{"id":"a653302730df3d58f796906a93933aa81494f2588d9485ab7676ec3b0ccbb426","name":"node_a653302730df3d58f796906a93933aa81494f2588d9485ab7676ec3b0ccbb426","enode":"enode://613e2fd1046ee6d486077d07c0150b2097f1f5ed197194b6be66369087dcc6e8c069a8c8a08f5688f7510670ba92b71f21713a7771e353b6f2f32f07ff2050d6@127.0.0.1:0","enr":"0xf88fb84069a4ec3dacd9e94a16a63e64b329fd81c61bd7485b97b81e2469e3c26c6844cd09ddfcf98ba00def4ea96b1a61fab34b651e8087daa8b49677211a8bf3b616e00183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102613e2fd1046ee6d486077d07c0150b2097f1f5ed197194b6be66369087dcc6e8","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"plMwJzDfPVj3lpBqk5M6qBSU8liNlIWrdnbsOwzLtCY=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: a65330\npopulation: 34 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 8 6337 5f00 2a0a 20ae | 146 775e (0) 77d2 (0) 7125 (0) 738c (0)\n001 7 df1e d863 e5d7 ec52 | 63 cc20 (0) c9f5 (0) c898 (0) c832 (0)\n002 5 88fe 898d 9d0f 915d | 20 82dd (0) 82f9 (0) 8025 (0) 849b (0)\n003 5 baf2 b502 b5b2 b626 | 17 bcc6 (0) b95d (0) b911 (0) b820 (0)\n004 5 af02 ae2b aeb4 ad98 | 5 af02 (0) ae2b (0) aeb4 (0) ad98 (0)\n005 2 a34e a369 | 2 a34e (0) a369 (0)\n============ DEPTH: 6 ==========================================\n006 1 a46d | 1 a46d (0)\n007 0 | 0\n008 1 a6fb | 1 a6fb (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"a653302730df3d58f796906a93933aa81494f2588d9485ab7676ec3b0ccbb426","private_key":"0b39a127c1bcb229d9f78601108abe82d675a725983831143efa53f899d08bdf","name":"node_a653302730df3d58f796906a93933aa81494f2588d9485ab7676ec3b0ccbb426","services":["streamer"],"enable_msg_events":true,"port":43953},"up":true}},{"node":{"info":{"id":"30897492824b19540d13ef17c70845be6dde455dca4e4f84cfca14a2c373969f","name":"node_30897492824b19540d13ef17c70845be6dde455dca4e4f84cfca14a2c373969f","enode":"enode://77bb6be6fe33a79ce2b05a3ea945520fb76c9262e75002a66961e3d27470fec41d9d93ee7fa847b6848f95fbf48806f4e9b0dd1a7e2a75738eaf6ff87e566696@127.0.0.1:0","enr":"0xf88fb8408975a075a76b03b6e862198c62788a23869e631fc2f37775f9a9269229cab59419c1f12dfa51ed37f6993170944a259abdee74afa02303737414e5824a67173a0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10277bb6be6fe33a79ce2b05a3ea945520fb76c9262e75002a66961e3d27470fec4","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"MIl0koJLGVQNE+8XxwhFvm3eRV3KTk+Ez8oUosNzlp8=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 308974\npopulation: 38 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 f629 e5d7 d863 df1e | 110 c1f9 (0) c26f (0) c6cf (0) c620 (0)\n001 3 6ecb 6337 5f00 | 70 7125 (0) 738c (0) 7290 (0) 77d2 (0)\n002 9 1704 1a2a 1c47 1f67 | 44 13d6 (0) 11d4 (0) 103b (0) 154b (0)\n003 9 2ccf 2c38 2d36 2995 | 15 2f32 (0) 2ccf (0) 2c79 (0) 2c38 (0)\n004 2 39d1 3f94 | 7 3b88 (0) 3b78 (0) 39d1 (0) 3e8e (0)\n005 4 35e6 3630 378e 3780 | 4 35e6 (0) 3630 (0) 378e (0) 3780 (0)\n006 3 33b5 3373 3237 | 3 33b5 (0) 3373 (0) 3237 (0)\n============ DEPTH: 7 ==========================================\n007 1 314a | 1 314a (0)\n008 0 | 0\n009 0 | 0\n010 1 30be | 1 30be (0)\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"30897492824b19540d13ef17c70845be6dde455dca4e4f84cfca14a2c373969f","private_key":"dbfd3f618dd2960c68e8eeac259fef1c20d8154f8fcafa4992bc5568c7c8a9d9","name":"node_30897492824b19540d13ef17c70845be6dde455dca4e4f84cfca14a2c373969f","services":["streamer"],"enable_msg_events":true,"port":38135},"up":true}},{"node":{"info":{"id":"0c64e5af869b1665fd4016ae6d04c8eedd423636f06d78ecb944ee8e3272a82a","name":"node_0c64e5af869b1665fd4016ae6d04c8eedd423636f06d78ecb944ee8e3272a82a","enode":"enode://ecda090f3e2fbbd974141d7beee44746688e9b805c8a76e68f3b4ac9d9e5a22f006596991f82625fa651aebd36ccab7262fd90a08040402982a11b92c8301e4e@127.0.0.1:0","enr":"0xf88fb8400ac80bea14f01369a3774d4c98b4218c5d0d180bda798635c393bdc35befe3c72cca308d1e84b165fd5b1012e749086db6634a096cb618c14645c91e59e906480183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102ecda090f3e2fbbd974141d7beee44746688e9b805c8a76e68f3b4ac9d9e5a22f","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"DGTlr4abFmX9QBaubQTI7t1CNjbwbXjsuUTujjJyqCo=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 0c64e5\npopulation: 30 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 a653 886a 898d f629 | 110 82f9 (0) 82dd (0) 8025 (0) 8505 (0)\n001 3 5f00 6337 6ecb | 70 77d2 (0) 775e (0) 7125 (0) 7290 (0)\n002 4 2d36 2a0a 20ae 3089 | 32 2f32 (0) 2ccf (0) 2c79 (0) 2c38 (0)\n003 5 1704 1f67 1e2a 1c47 | 22 13d6 (0) 103b (0) 11d4 (0) 154b (0)\n004 6 0743 0451 0438 00c6 | 11 00c6 (0) 0067 (0) 02d8 (0) 0328 (0)\n005 2 0af9 0a00 | 3 0b72 (0) 0af9 (0) 0a00 (0)\n006 2 0fc5 0e5e | 3 0ff2 (0) 0fc5 (0) 0e5e (0)\n007 2 0de3 0d8a | 2 0de3 (0) 0d8a (0)\n============ DEPTH: 8 ==========================================\n008 1 0cf5 | 1 0cf5 (0)\n009 1 0c28 | 1 0c28 (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"0c64e5af869b1665fd4016ae6d04c8eedd423636f06d78ecb944ee8e3272a82a","private_key":"7c777cdb8d0d0d9cf6dc20d975185908b22a1774e4e9abf683b3ee25c8ccc5a8","name":"node_0c64e5af869b1665fd4016ae6d04c8eedd423636f06d78ecb944ee8e3272a82a","services":["streamer"],"enable_msg_events":true,"port":38547},"up":true}},{"node":{"info":{"id":"f629b8b9e79c75ac559daf9bf4fc8672bfdd595cf2c5d17a8885282626fc65a5","name":"node_f629b8b9e79c75ac559daf9bf4fc8672bfdd595cf2c5d17a8885282626fc65a5","enode":"enode://f12ee7006d3189d601c33a5aa4d0852e4f5aa621abedc967a106064c05dfb5de7f813d8356ae58fdad01d1453a563482e960120fb92cfa61d3ebba3c9c331b41@127.0.0.1:0","enr":"0xf88fb840d30cb092c1b2933d7cc9b7444ef7da1f3fe07ae780285ecced6998041385ca0d14e88aa1dea59469ff033450bc73e099bc2bb9773d568846e4d640c797590b160183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103f12ee7006d3189d601c33a5aa4d0852e4f5aa621abedc967a106064c05dfb5de","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"9im4ueecdaxVna+b9PyGcr/dWVzyxdF6iIUoJib8ZaU=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: f629b8\npopulation: 43 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 10 6ecb 6337 5f00 3089 | 146 7e04 (0) 7dc2 (0) 7dd3 (0) 7dbb (0)\n001 6 898d 915d 959f b65e | 47 8505 (0) 849b (0) 8025 (0) 82dd (0)\n002 9 c832 c9f5 caf6 c49c | 26 cc20 (0) ca04 (0) caf6 (0) c9f5 (0)\n003 5 e5d7 e8ef ef1b ef07 | 18 e027 (0) e775 (0) e7fa (0) e54b (0)\n004 4 fbf5 ff36 fe21 fe31 | 6 f925 (0) fbc8 (0) fbf5 (0) fe21 (0)\n005 2 f27f f2d5 | 3 f31c (0) f27f (0) f2d5 (0)\n006 4 f4e0 f5b2 f5dc f528 | 6 f456 (0) f45f (0) f4e0 (0) f5b2 (0)\n============ DEPTH: 7 ==========================================\n007 3 f773 f7ba f7fa | 3 f773 (0) f7ba (0) f7fa (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"f629b8b9e79c75ac559daf9bf4fc8672bfdd595cf2c5d17a8885282626fc65a5","private_key":"ed331558b7b08a35ac962ee04dd387cf1355874a1e4998244fb9c4530bc3036c","name":"node_f629b8b9e79c75ac559daf9bf4fc8672bfdd595cf2c5d17a8885282626fc65a5","services":["streamer"],"enable_msg_events":true,"port":43737},"up":true}},{"node":{"info":{"id":"20aeb14f567dd16f06b0d3b589b83283daa00a5ed10e447860bda946baccdd2d","name":"node_20aeb14f567dd16f06b0d3b589b83283daa00a5ed10e447860bda946baccdd2d","enode":"enode://e0e6fe997dda2f2ae96f021131f1f3975da9807d14dbb610fd82ef3b8d37ac6934e616d60bf7cdba99b9db2edcb0991febc119d93ad7ff35e4b6ce09903446ae@127.0.0.1:0","enr":"0xf88fb840946c1b232e0d6a23993e1b0b244cc3b22c4f091277d1507a29146bda9aad796e3d1c7dcd6a3de9c37c9355fe2f6a4db100ed11f07d0acfaab3676e42175906470183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102e0e6fe997dda2f2ae96f021131f1f3975da9807d14dbb610fd82ef3b8d37ac69","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"IK6xT1Z90W8GsNO1ibgyg9qgCl7RDkR4YL2pRrrM3S0=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 20aeb1\npopulation: 33 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 a653 9d0f df1e f7fa | 110 8505 (0) 849b (0) 8025 (0) 82dd (0)\n001 4 4447 5f00 6337 6ecb | 70 7e04 (0) 7dbb (0) 7dc2 (0) 7dd3 (0)\n002 7 03cc 0743 0cf5 0c64 | 44 00c6 (0) 0067 (0) 02d8 (0) 0328 (0)\n003 6 3f94 3780 3373 3237 | 17 39d1 (0) 3b88 (0) 3b78 (0) 3efc (0)\n004 6 2ccf 2c38 2d36 2995 | 9 2f32 (0) 2ccf (0) 2c79 (0) 2c38 (0)\n005 2 256e 24b8 | 2 256e (0) 24b8 (0)\n============ DEPTH: 6 ==========================================\n006 0 | 0\n007 3 21a0 217f 2101 | 3 21a0 (0) 217f (0) 2101 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"20aeb14f567dd16f06b0d3b589b83283daa00a5ed10e447860bda946baccdd2d","private_key":"2e8fb7fdd8a9a42774dbb1e04397d0092d1722e16dc44ee9ec98dcceef319366","name":"node_20aeb14f567dd16f06b0d3b589b83283daa00a5ed10e447860bda946baccdd2d","services":["streamer"],"enable_msg_events":true,"port":33621},"up":true}},{"node":{"info":{"id":"2a0a8eaf1a2749e68f8b841578c160699cf7907ff23842c6d616ad884e5f613e","name":"node_2a0a8eaf1a2749e68f8b841578c160699cf7907ff23842c6d616ad884e5f613e","enode":"enode://41ce2c9d43b344d3ee113b760fcf2e9254f4e650568be23a964a1cf6e0354ef3616bd129e46a868f713a9a507acdc6b219d5923a7aa09b96092f161d2f76fad4@127.0.0.1:0","enr":"0xf88fb840cb2dee7c73e503707c6b93468e93e8602d07fb552da0e1429d5e05393a553625665eaedb8ac4db4f1fc86bf952d9a3937b0d40f9df2b5d81a6900949b0cc79140183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10241ce2c9d43b344d3ee113b760fcf2e9254f4e650568be23a964a1cf6e0354ef3","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"KgqOrxonSeaPi4QVeMFgaZz3kH/yOELG1hatiE5fYT4=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 2a0a8e\npopulation: 29 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 a653 9d0f d863 df1e | 110 8505 (0) 849b (0) 82dd (0) 82f9 (0)\n001 5 5f00 5db0 4447 6337 | 70 4990 (0) 49ea (0) 49cd (0) 4bcf (0)\n002 6 0743 03cc 0c64 1f67 | 44 00c6 (0) 0067 (0) 02d8 (0) 0328 (0)\n003 4 3f94 35e6 3780 3089 | 17 39d1 (0) 3b88 (0) 3b78 (0) 3ec5 (0)\n004 3 2101 217f 20ae | 6 24b8 (0) 256e (0) 21a0 (0) 217f (0)\n005 3 2d36 2ccf 2c38 | 5 2f32 (0) 2ccf (0) 2c79 (0) 2c38 (0)\n006 1 2995 | 1 2995 (0)\n============ DEPTH: 7 ==========================================\n007 0 | 0\n008 2 2abb 2a97 | 2 2abb (0) 2a97 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"2a0a8eaf1a2749e68f8b841578c160699cf7907ff23842c6d616ad884e5f613e","private_key":"5ed9141147ced7a970cf200754db9d56e55104e714e7b8b6ab0372ea8e987b34","name":"node_2a0a8eaf1a2749e68f8b841578c160699cf7907ff23842c6d616ad884e5f613e","services":["streamer"],"enable_msg_events":true,"port":37145},"up":true}},{"node":{"info":{"id":"1a2a0e0bbf83cd40936995674418ae469aa2b92876a4ceeabd8128f536b7d7a2","name":"node_1a2a0e0bbf83cd40936995674418ae469aa2b92876a4ceeabd8128f536b7d7a2","enode":"enode://ce8284583c6db3b9420355ed2e31812b19ceb6157b78b991cf2275cba03fc42a1fc5ca4be2e339ce47a981b7c3fea09fb4ef0489234d5660488ab4cbde59044c@127.0.0.1:0","enr":"0xf88fb84069d4576c9390bdd8b0b134b81758b7b133feddbb1077abc43b3afdf7d3e40e8514903b6f2a002df47f3f977fae861bb7ad48e28cfd6037488e74e727929721ae0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102ce8284583c6db3b9420355ed2e31812b19ceb6157b78b991cf2275cba03fc42a","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"GioOC7+DzUCTaZVnRBiuRpqiuSh2pM7qvYEo9Ta316I=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 1a2a0e\npopulation: 30 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 d863 df1e 9d0f | 110 c26f (0) c1f9 (0) c786 (0) c620 (0)\n001 7 4447 5db0 5f00 6337 | 70 49ea (0) 49cd (0) 4990 (0) 4bcf (0)\n002 4 3089 2101 20ae 2a0a | 32 3ec5 (0) 3efc (0) 3e8e (0) 3f94 (0)\n003 5 03cc 0451 0438 0cf5 | 22 0067 (0) 00c6 (0) 02d8 (0) 0328 (0)\n004 2 1400 1704 | 12 13d6 (0) 103b (0) 11d4 (0) 154b (0)\n005 6 1e2a 1f85 1f67 1c8a | 6 1e2a (0) 1f85 (0) 1f67 (0) 1c8a (0)\n============ DEPTH: 6 ==========================================\n006 2 19fa 18f6 | 2 19fa (0) 18f6 (0)\n007 1 1b83 | 1 1b83 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"1a2a0e0bbf83cd40936995674418ae469aa2b92876a4ceeabd8128f536b7d7a2","private_key":"66cedc68f62643418971c63cf6032c5cbfd77b99e9d052c406d568d23ad4a0a9","name":"node_1a2a0e0bbf83cd40936995674418ae469aa2b92876a4ceeabd8128f536b7d7a2","services":["streamer"],"enable_msg_events":true,"port":43217},"up":true}},{"node":{"info":{"id":"9d0f804849b72397646ba48208ba1e01dcf4de04e788016c4a1a0c93e650ddf5","name":"node_9d0f804849b72397646ba48208ba1e01dcf4de04e788016c4a1a0c93e650ddf5","enode":"enode://12a7d6a36db53d873c0acc5a559d296451cf06d07aa94a306ace9b6043fb3c2d9e1e1c49b9ebfc9564a9611e315d5fb1eb7967526de503234970b110793753da@127.0.0.1:0","enr":"0xf88fb8408f502648e715faaf2434932bad996cfe6aeb6abb2a2ea6e7c78e3397d1b442a6242b093c33df73b486aede52745c085f7081b037099ed3a238e285da2177b9bb0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10212a7d6a36db53d873c0acc5a559d296451cf06d07aa94a306ace9b6043fb3c2d","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"nQ+ASEm3I5dka6SCCLoeAdz03gTniAFsShoMk+ZQ3fU=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 9d0f80\npopulation: 37 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 9 6337 6ecb 3089 2d36 | 146 4e5a (0) 4c9e (0) 4d59 (0) 4d6b (0)\n001 8 f7fa ff36 ec52 e547 | 63 eb98 (0) e854 (0) e883 (0) e8ef (0)\n002 5 badd b7ca b65e a653 | 27 bcc6 (0) b820 (0) b897 (0) b911 (0)\n003 6 8025 82f9 8f21 88fe | 10 8505 (0) 849b (0) 8025 (0) 82dd (0)\n004 6 9076 90a8 915d 96fc | 6 9076 (0) 90a8 (0) 915d (0) 96fc (0)\n============ DEPTH: 5 ==========================================\n005 2 9852 9890 | 2 9852 (0) 9890 (0)\n006 1 9fa0 | 1 9fa0 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"9d0f804849b72397646ba48208ba1e01dcf4de04e788016c4a1a0c93e650ddf5","private_key":"5a3b48cfd6ec1d644a7c6a7c880a16141fb04b6362ca8b077c18e25508f97a8a","name":"node_9d0f804849b72397646ba48208ba1e01dcf4de04e788016c4a1a0c93e650ddf5","services":["streamer"],"enable_msg_events":true,"port":41537},"up":true}},{"node":{"info":{"id":"df1e4e46e8ec26cad74b4f35ab070f12c8f6fddca35ac44c1218ff60fe1e6bab","name":"node_df1e4e46e8ec26cad74b4f35ab070f12c8f6fddca35ac44c1218ff60fe1e6bab","enode":"enode://43a859488ad22646b38f98737b2ac09af8c9280038408f13c72deb3aa3bc0405f6d6b9d25961b7a83efe20f7700411dd0c70215ffce26d0b46e6581c902a6a6d@127.0.0.1:0","enr":"0xf88fb84024940eb9de5536da259f0f58a1e16285099071949f0e9ad9ed71742a5af3100c76f2ab3c852b256f9db69e18317adbb05ecf1dcff3e87fed713d59174e0c61780183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10343a859488ad22646b38f98737b2ac09af8c9280038408f13c72deb3aa3bc0405","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"3x5ORujsJsrXS081qwcPEsj2/dyjWsRMEhj/YP4ea6s=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: df1e4e\npopulation: 38 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 11 5f00 6ecb 3089 2d36 | 146 4990 (0) 49ea (0) 49cd (0) 4bcf (0)\n001 6 b65e a653 ac4d 886a | 47 bcc6 (0) b897 (0) b820 (0) b911 (0)\n002 8 ec52 ef07 ef1b e514 | 37 eb98 (0) e854 (0) e883 (0) e8ef (0)\n003 5 c832 c9f5 c59e c49c | 15 c1f9 (0) c26f (0) c786 (0) c6cf (0)\n004 3 d1d7 d7ac d640 | 5 d3b0 (0) d299 (0) d1d7 (0) d7ac (0)\n============ DEPTH: 5 ==========================================\n005 5 daec da67 db6a d887 | 5 daec (0) da67 (0) db6a (0) d887 (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"df1e4e46e8ec26cad74b4f35ab070f12c8f6fddca35ac44c1218ff60fe1e6bab","private_key":"374fa339ea3cf4a0d8163261f0d431dfec275bd3323d60ffdd0e99868f234d3b","name":"node_df1e4e46e8ec26cad74b4f35ab070f12c8f6fddca35ac44c1218ff60fe1e6bab","services":["streamer"],"enable_msg_events":true,"port":33131},"up":true}},{"node":{"info":{"id":"1f670c53b4c597beaffacd84e3a697225b04cded9219d0a28e1fe525a3cadcf5","name":"node_1f670c53b4c597beaffacd84e3a697225b04cded9219d0a28e1fe525a3cadcf5","enode":"enode://b38f84e3fb5c5995741a2a998215c68d6eee0548072f49bea0d3e3f638779977df96caf15932edea56c8b18e27fb660a269dffcdb628ef6fea0c86a8faa6c560@127.0.0.1:0","enr":"0xf88fb840060e7e6c9c1f7f7cfbf60354cd454fa5d169bf184f13f458845764571079a9e6070092d3d33322c88d0eb91c50376453e016e118f6636745d50bf17b9bee95190183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102b38f84e3fb5c5995741a2a998215c68d6eee0548072f49bea0d3e3f638779977","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"H2cMU7TFl76v+s2E46aXIlsEze2SGdCijh/lJaPK3PU=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 1f670c\npopulation: 30 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 ac4d d863 df1e | 110 bcc6 (0) b911 (0) b95d (0) b820 (0)\n001 3 6103 6f5f 6ecb | 70 49cd (0) 49ea (0) 4990 (0) 4bcf (0)\n002 6 3089 2d36 2a0a 2995 | 32 3b88 (0) 3b78 (0) 39d1 (0) 3e8e (0)\n003 6 0c64 0067 03cc 0451 | 22 00c6 (0) 0067 (0) 02d8 (0) 0328 (0)\n004 4 11d4 14df 154b 1704 | 12 13d6 (0) 103b (0) 11d4 (0) 1436 (0)\n005 3 1b83 1a2a 18f6 | 4 19fa (0) 18f6 (0) 1b83 (0) 1a2a (0)\n006 3 1c8a 1c9c 1c47 | 3 1c8a (0) 1c9c (0) 1c47 (0)\n============ DEPTH: 7 ==========================================\n007 1 1e2a | 1 1e2a (0)\n008 1 1f85 | 1 1f85 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"1f670c53b4c597beaffacd84e3a697225b04cded9219d0a28e1fe525a3cadcf5","private_key":"8b2847a2b9e1ffbd91e4f0e7386339eb2dbf3391956547ad876d3d7fafbdda9c","name":"node_1f670c53b4c597beaffacd84e3a697225b04cded9219d0a28e1fe525a3cadcf5","services":["streamer"],"enable_msg_events":true,"port":43053},"up":true}},{"node":{"info":{"id":"d863ba7405eb07ccddbf1d34efbcbec2867a93a109ed9413d9aecf30d3645a6a","name":"node_d863ba7405eb07ccddbf1d34efbcbec2867a93a109ed9413d9aecf30d3645a6a","enode":"enode://f9a61c9819677e84a716705685a63dc1bc77bfc1e9c23cf9127e4e00228d82f7487a4133ee6f5a39686c64e5f95e222dbefdbd0d2c59ea4d4ed69e49843236d5@127.0.0.1:0","enr":"0xf88fb8407f43c74479afec5cde0df2a8e4c7452558c0414e10ac7319c29567d1fe9706597c8d0fac508af58ce2b580e31877a08fa7ea9a712348c98bbf5debbdbb5a3e640183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103f9a61c9819677e84a716705685a63dc1bc77bfc1e9c23cf9127e4e00228d82f7","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"2GO6dAXrB8zdvx0077y+woZ6k6EJ7ZQT2a7PMNNkWmo=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: d863ba\npopulation: 35 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 9 5f00 6ecb 0743 1704 | 146 4bcf (0) 4a8b (0) 4ac7 (0) 4990 (0)\n001 4 898d 9d0f ac4d a653 | 47 9076 (0) 90a8 (0) 915d (0) 96fc (0)\n002 6 ff36 f2d5 f629 f7fa | 37 eb98 (0) e854 (0) e883 (0) e8ef (0)\n003 8 c26f c786 c441 c49c | 15 c1f9 (0) c26f (0) c620 (0) c6cf (0)\n004 3 d299 d7ac d640 | 5 d1d7 (0) d3b0 (0) d299 (0) d7ac (0)\n005 1 df1e | 1 df1e (0)\n============ DEPTH: 6 ==========================================\n006 3 daec da67 db6a | 3 daec (0) da67 (0) db6a (0)\n007 0 | 0\n008 1 d887 | 1 d887 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"d863ba7405eb07ccddbf1d34efbcbec2867a93a109ed9413d9aecf30d3645a6a","private_key":"8febd8aeb1300031923fe49da5869050860d96d11eb4508c497687c8ccddc31f","name":"node_d863ba7405eb07ccddbf1d34efbcbec2867a93a109ed9413d9aecf30d3645a6a","services":["streamer"],"enable_msg_events":true,"port":39911},"up":true}},{"node":{"info":{"id":"2d3645c4fdf9a2809a909076b9ee5fb98fa880f6faeff914f1a2987af928cd79","name":"node_2d3645c4fdf9a2809a909076b9ee5fb98fa880f6faeff914f1a2987af928cd79","enode":"enode://5a16cc82bdff422be5114cecf38c16efaa5cf372e4b9da981b04bf795e5d6dd58f2128d1ea860d1fc5ab50341562b3fe220930224978c5fc9cc470236e731f8a@127.0.0.1:0","enr":"0xf88fb8402065a0e31a085320c01f09fe4cac1f3443c89d2aa42a78120ab8af3197c6c3a00501e91b9adefc7a55eccc59b6a25a614cea33a121aa6e794419d8a9990d90ce0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1025a16cc82bdff422be5114cecf38c16efaa5cf372e4b9da981b04bf795e5d6dd5","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"LTZFxP35ooCakJB2ue5fuY+ogPb67/kU8aKYevkozXk=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 2d3645\npopulation: 30 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 ac4d 9d0f ff36 f629 | 110 9076 (0) 90a8 (0) 915d (0) 96fc (0)\n001 2 5f00 6ecb | 70 4bcf (0) 4a8b (0) 4ac7 (0) 49cd (0)\n002 4 1f67 1704 0c64 0451 | 44 0b72 (0) 0af9 (0) 0a00 (0) 0ff2 (0)\n003 7 39d1 3b78 3f94 35e6 | 17 3b88 (0) 3b78 (0) 39d1 (0) 3ec5 (0)\n004 3 20ae 217f 2101 | 6 24b8 (0) 256e (0) 20ae (0) 21a0 (0)\n005 4 2995 2abb 2a97 2a0a | 4 2abb (0) 2a97 (0) 2a0a (0) 2995 (0)\n006 1 2f32 | 1 2f32 (0)\n============ DEPTH: 7 ==========================================\n007 3 2c79 2c38 2ccf | 3 2ccf (0) 2c79 (0) 2c38 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"2d3645c4fdf9a2809a909076b9ee5fb98fa880f6faeff914f1a2987af928cd79","private_key":"60acfdf5adccd8cecfff6c7041a09ca32eaa3aa3a70df16eb20f58826c441ecd","name":"node_2d3645c4fdf9a2809a909076b9ee5fb98fa880f6faeff914f1a2987af928cd79","services":["streamer"],"enable_msg_events":true,"port":41863},"up":true}},{"node":{"info":{"id":"6ecb5c36fc0150c287446ae8a8682d629a1d39341230717206219babe3bdf659","name":"node_6ecb5c36fc0150c287446ae8a8682d629a1d39341230717206219babe3bdf659","enode":"enode://04684e9608ae1597b26dcf982a1102e6cdd9d2437b9b0d2e4dc0c1acada0b112d11b3d80dd326baea3005f626e94985b91e0cca937f63323a0ff9dd434f31601@127.0.0.1:0","enr":"0xf88fb8401c006cfaa1eed4491442b8516c8bdf525694e5c4b6e1e65cfd0409927b90027e5242612b7461f7b42127f5f0de749f08eec7d18fe8b3292fdf06dd809f43c4d50183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10304684e9608ae1597b26dcf982a1102e6cdd9d2437b9b0d2e4dc0c1acada0b112","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"bstcNvwBUMKHRGroqGgtYpodOTQSMHFyBiGbq+O99lk=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 6ecb5c\npopulation: 43 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 898d 9d0f f629 ff36 | 110 eb98 (0) e854 (0) e883 (0) e8ef (0)\n001 12 0c64 03cc 0743 0451 | 76 0af9 (0) 0a00 (0) 0b72 (0) 0ff2 (0)\n002 8 58ed 5f00 5db0 5308 | 38 49cd (0) 49ea (0) 4990 (0) 4bcf (0)\n003 5 7290 77d2 775e 7b90 | 12 7125 (0) 738c (0) 7290 (0) 77d2 (0)\n004 2 6337 6103 | 9 67dc (0) 67aa (0) 66e7 (0) 605a (0)\n005 2 6967 6831 | 2 6967 (0) 6831 (0)\n006 2 6c4d 6c73 | 2 6c73 (0) 6c4d (0)\n007 3 6fe9 6f2d 6f5f | 3 6fe9 (0) 6f2d (0) 6f5f (0)\n============ DEPTH: 8 ==========================================\n008 2 6e68 6e05 | 2 6e68 (0) 6e05 (0)\n009 1 6ea5 | 1 6ea5 (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"6ecb5c36fc0150c287446ae8a8682d629a1d39341230717206219babe3bdf659","private_key":"6ccda16d24593d76eeb7948a4af3fb05397678300cffc7c91a33b30131038c07","name":"node_6ecb5c36fc0150c287446ae8a8682d629a1d39341230717206219babe3bdf659","services":["streamer"],"enable_msg_events":true,"port":45685},"up":true}},{"node":{"info":{"id":"21012a3a6ef1ece48fd9d7cffe62dc75839dd062efcf3ac5f962c237814da407","name":"node_21012a3a6ef1ece48fd9d7cffe62dc75839dd062efcf3ac5f962c237814da407","enode":"enode://98c213523753d4a7653cb5b73bab12b51338713fea9dc6f12a63a8336614c389ffdf44b011e51bd2c8083da8e80e4f1918739bbae11667d68f310f526fd020cb@127.0.0.1:0","enr":"0xf88fb840abbddde7f121cefe95a32471993c96b1df78fac759c6d32c3c2f3a5442d3b96d0f4cb71c4dabeadd6ea7962640f6d04e731dc0b3d6f37c63316c9e7b10919cd40183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10398c213523753d4a7653cb5b73bab12b51338713fea9dc6f12a63a8336614c389","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"IQEqOm7x7OSP2dfP/mLcdYOd0GLvzzrF+WLCN4FNpAc=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 21012a\npopulation: 32 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 df1e ff36 9d0f ac4d | 110 c1f9 (0) c26f (0) c6cf (0) c620 (0)\n001 5 51db 5f00 6337 6103 | 70 49ea (0) 49cd (0) 4990 (0) 4bcf (0)\n002 5 0451 1f67 1a2a 18f6 | 44 0a00 (0) 0af9 (0) 0b72 (0) 0ff2 (0)\n003 5 3b78 39d1 3f94 35e6 | 17 3b88 (0) 3b78 (0) 39d1 (0) 3ec5 (0)\n004 8 2a0a 2a97 2995 2f32 | 9 2abb (0) 2a97 (0) 2a0a (0) 2995 (0)\n005 2 256e 24b8 | 2 256e (0) 24b8 (0)\n============ DEPTH: 6 ==========================================\n006 0 | 0\n007 1 20ae | 1 20ae (0)\n008 1 21a0 | 1 21a0 (0)\n009 1 217f | 1 217f (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"21012a3a6ef1ece48fd9d7cffe62dc75839dd062efcf3ac5f962c237814da407","private_key":"0c649ddaf655f9e8eee8b3a2d2050c9b93305a4e7a28f3684f68aee88ab0ef2e","name":"node_21012a3a6ef1ece48fd9d7cffe62dc75839dd062efcf3ac5f962c237814da407","services":["streamer"],"enable_msg_events":true,"port":38963},"up":true}},{"node":{"info":{"id":"17040a3aad5930d8e0de1011fd2996b7d09225989f0dc1ae8f7e7a52dd26ab4e","name":"node_17040a3aad5930d8e0de1011fd2996b7d09225989f0dc1ae8f7e7a52dd26ab4e","enode":"enode://319cd6619ea64ca816341d84c8b1ca4aa41b3a0eca34fbdf923acd1396287078e2808d85b58fbb61dbffc5c14b726c002731803095ec20ebe8079edf94ef274c@127.0.0.1:0","enr":"0xf88fb8402778c296526d28fd3bd0b985c90367db08c61a457ddf60dd9e79024d56fdd6dc78b02d84ec47cdabda998e2326ffca652eeb8fad6517d8e5238bdacffc6fdeba0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102319cd6619ea64ca816341d84c8b1ca4aa41b3a0eca34fbdf923acd1396287078","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"FwQKOq1ZMNjg3hAR/SmWt9CSJZifDcGuj356Ut0mq04=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 17040a\npopulation: 37 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 d863 ff36 898d ac4d | 110 c1f9 (0) c26f (0) c6cf (0) c620 (0)\n001 3 5db0 6f5f 6ecb | 70 4990 (0) 49cd (0) 49ea (0) 4bcf (0)\n002 6 3089 2d36 2c38 2995 | 32 3b88 (0) 3b78 (0) 39d1 (0) 3e8e (0)\n003 8 0e5e 0cf5 0c64 03cc | 22 0b72 (0) 0af9 (0) 0a00 (0) 0ff2 (0)\n004 6 1c47 1e2a 1f67 1b83 | 10 1b83 (0) 1a2a (0) 19fa (0) 18f6 (0)\n005 2 103b 11d4 | 3 13d6 (0) 103b (0) 11d4 (0)\n006 4 154b 1436 1400 14df | 4 154b (0) 1436 (0) 1400 (0) 14df (0)\n007 2 165f 1672 | 2 165f (0) 1672 (0)\n============ DEPTH: 8 ==========================================\n008 2 179f 17db | 2 179f (0) 17db (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"17040a3aad5930d8e0de1011fd2996b7d09225989f0dc1ae8f7e7a52dd26ab4e","private_key":"6fd569b047d43c53be962cedfa9155cbdd5b612bf6ae51d3b02aa8c1bab608c1","name":"node_17040a3aad5930d8e0de1011fd2996b7d09225989f0dc1ae8f7e7a52dd26ab4e","services":["streamer"],"enable_msg_events":true,"port":38715},"up":true}},{"node":{"info":{"id":"04518d7120fa8a528d983ca1ee6d5d09ba24a4e853fb22bc9084cdf34995e95f","name":"node_04518d7120fa8a528d983ca1ee6d5d09ba24a4e853fb22bc9084cdf34995e95f","enode":"enode://52bb359e4ef492631139b8f55c6bd84f6fdf764b06373ff664baec44a296aefa8a30ce0f4a3792af214e4f1025f5d4f5d67c52b754720ee7f8cff0b069716439@127.0.0.1:0","enr":"0xf88fb840cab6c885934f1ff7d8d41a71e525765c7eec705d6d47779bc453c39f000c9be43e5d2c812ef5c9fddbf705cfba32604383775a77297727a3b98fbe0937845b110183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10352bb359e4ef492631139b8f55c6bd84f6fdf764b06373ff664baec44a296aefa","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"BFGNcSD6ilKNmDyh7m1dCbokpOhT+yK8kITN80mV6V8=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 04518d\npopulation: 31 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 fe31 ff36 898d ac4d | 110 c1f9 (0) c26f (0) c786 (0) c6cf (0)\n001 4 5db0 6f5f 6ecb 6103 | 70 4990 (0) 49cd (0) 49ea (0) 4bcf (0)\n002 5 2101 2a97 2995 2d36 | 32 3b88 (0) 3b78 (0) 39d1 (0) 3ec5 (0)\n003 6 1f67 1e2a 1c47 1a2a | 22 1c8a (0) 1c9c (0) 1c47 (0) 1e2a (0)\n004 5 0a00 0b72 0e5e 0cf5 | 11 0b72 (0) 0af9 (0) 0a00 (0) 0fc5 (0)\n005 3 02d8 03cc 0067 | 5 00c6 (0) 0067 (0) 02d8 (0) 0328 (0)\n006 2 0661 0743 | 3 0661 (0) 07a8 (0) 0743 (0)\n============ DEPTH: 7 ==========================================\n007 0 | 0\n008 0 | 0\n009 1 0438 | 1 0438 (0)\n010 0 | 0\n011 0 | 0\n012 1 045b | 1 045b (0)\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"04518d7120fa8a528d983ca1ee6d5d09ba24a4e853fb22bc9084cdf34995e95f","private_key":"2e166ac09eefef316a31e45dc6fa94185d8d91cc1d537f03044c7cb46ab00347","name":"node_04518d7120fa8a528d983ca1ee6d5d09ba24a4e853fb22bc9084cdf34995e95f","services":["streamer"],"enable_msg_events":true,"port":33881},"up":true}},{"node":{"info":{"id":"610334a0772d3414652b575f2caa6f2db32224907c24d06fda643db9f2ec2afe","name":"node_610334a0772d3414652b575f2caa6f2db32224907c24d06fda643db9f2ec2afe","enode":"enode://27461fddb23d01661d9e0752253b5f1ff25fd09606c0f07fd3161be1d08015a00addcfe28ebcdd5bd3974ce43579047df1d16e2de978b55a62885a3f9b919aeb@127.0.0.1:0","enr":"0xf88fb8402aa36d20ffb02eb4363c646927544d3ef64e739c150d0cf86e67c9f1e55d968171dc7a65d680a25f704a35163488cb3427ded17d666bdb22ef7be92242260d3c0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10327461fddb23d01661d9e0752253b5f1ff25fd09606c0f07fd3161be1d08015a0","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"YQM0oHctNBRlK1dfLKpvLbMiJJB8JNBv2mQ9ufLsKv4=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 610334\npopulation: 37 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 ff36 898d ac4d | 110 c1f9 (0) c26f (0) c6cf (0) c620 (0)\n001 7 2101 2995 2c38 1f67 | 76 378e (0) 3780 (0) 3630 (0) 35e6 (0)\n002 8 4109 461c 4d10 5308 | 38 4ac7 (0) 4a8b (0) 4bcf (0) 49cd (0)\n003 6 7dd3 7dbb 7920 7a60 | 12 775e (0) 77d2 (0) 7290 (0) 738c (0)\n004 5 6fe9 6f5f 6e68 6e05 | 11 6967 (0) 6831 (0) 6c4d (0) 6c73 (0)\n005 3 66e7 67aa 67dc | 3 66e7 (0) 67aa (0) 67dc (0)\n006 3 6251 628e 6337 | 3 6251 (0) 628e (0) 6337 (0)\n============ DEPTH: 7 ==========================================\n007 2 60d7 605a | 2 60d7 (0) 605a (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"610334a0772d3414652b575f2caa6f2db32224907c24d06fda643db9f2ec2afe","private_key":"a239693a1557643d38ba187a95721a30768f347591e6f8868b289ec3f95b5e3f","name":"node_610334a0772d3414652b575f2caa6f2db32224907c24d06fda643db9f2ec2afe","services":["streamer"],"enable_msg_events":true,"port":46809},"up":true}},{"node":{"info":{"id":"ac4d2d6836e2cdf4c88221f6013aac70a451dd15bc403288bd10d0b911cd9a2b","name":"node_ac4d2d6836e2cdf4c88221f6013aac70a451dd15bc403288bd10d0b911cd9a2b","enode":"enode://134ad215979bb59e0854da374768a63faad6b7322ab9e96996f9d5121bf3f3093736c2b9e465cc3141fe55ae189e6e708af53bdb2f165ddfb934adbfd15f8b13@127.0.0.1:0","enr":"0xf88fb8400b13e5d05cf91166873c521a1779fec8d2519ba5960b369a7ca65f83fcc01cea397a6dec2e9098a898ae93a78056944abf096f46e1a62592a7d067b013da30f00183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103134ad215979bb59e0854da374768a63faad6b7322ab9e96996f9d5121bf3f309","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"rE0taDbizfTIgiH2ATqscKRR3RW8QDKIvRDQuRHNmis=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: ac4d2d\npopulation: 31 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 10 2c38 2d36 2a97 2995 | 146 3ec5 (0) 3efc (0) 3e8e (0) 3f94 (0)\n001 6 c832 df1e d863 f629 | 63 c1f9 (0) c26f (0) c6cf (0) c620 (0)\n002 3 959f 9d0f 898d | 20 9852 (0) 9890 (0) 9fa0 (0) 9d0f (0)\n003 6 b5b2 b626 b65e ba88 | 17 bcc6 (0) b897 (0) b820 (0) b95d (0)\n004 2 a369 a653 | 5 a34e (0) a369 (0) a46d (0) a6fb (0)\n============ DEPTH: 5 ==========================================\n005 0 | 0\n006 3 af02 aeb4 ae2b | 3 af02 (0) aeb4 (0) ae2b (0)\n007 1 ad98 | 1 ad98 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"ac4d2d6836e2cdf4c88221f6013aac70a451dd15bc403288bd10d0b911cd9a2b","private_key":"aaaa8d07b535646ac07aef1d6dbe233da8938015e1fbb22d29bb1667cccdbd9c","name":"node_ac4d2d6836e2cdf4c88221f6013aac70a451dd15bc403288bd10d0b911cd9a2b","services":["streamer"],"enable_msg_events":true,"port":44875},"up":true}},{"node":{"info":{"id":"ff36a8810dd44f6d1fa42aa91ff6206bcfb4c1ffbab0df73a181daece329e0e3","name":"node_ff36a8810dd44f6d1fa42aa91ff6206bcfb4c1ffbab0df73a181daece329e0e3","enode":"enode://caea642b8d5bd71c4dc4f25c29351b369cae4b0b2cc5c09805f09dbe91dff565c639652d2997ef93df5a8814a088dcb6eeb10cde26ef5114f39f86f96c61dfe1@127.0.0.1:0","enr":"0xf88fb840a8727941728a486f3f2399e65bacb4139c6b4ffcda9c78b7ba54db0561b8b3496543e9ac4ddc130e407c629d8346439a2ac645f858ff17da07fa89b93e4cfbe00183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103caea642b8d5bd71c4dc4f25c29351b369cae4b0b2cc5c09805f09dbe91dff565","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"/zaogQ3UT20fpCqpH/Yga8+0wf+6sN9zoYHa7OMp4OM=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: ff36a8\npopulation: 40 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 11 6f5f 6ecb 6103 18f6 | 146 1c9c (0) 1c8a (0) 1c47 (0) 1e2a (0)\n001 5 9d0f 886a 898d ad98 | 47 96fc (0) 976e (0) 959f (0) 9076 (0)\n002 5 c786 c9f5 c832 d863 | 26 c26f (0) c1f9 (0) c6cf (0) c620 (0)\n003 5 e514 e5d7 ec52 ef1b | 18 e027 (0) e775 (0) e7fa (0) e54b (0)\n004 9 f31c f2d5 f528 f5dc | 13 f31c (0) f27f (0) f2d5 (0) f45f (0)\n005 3 fbf5 fbc8 f925 | 3 fbf5 (0) fbc8 (0) f925 (0)\n============ DEPTH: 6 ==========================================\n006 0 | 0\n007 2 fe21 fe31 | 2 fe21 (0) fe31 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"ff36a8810dd44f6d1fa42aa91ff6206bcfb4c1ffbab0df73a181daece329e0e3","private_key":"2e244474154628879e0fe12f4e3f1fbd5803d0a643d609efa8b704912812cd68","name":"node_ff36a8810dd44f6d1fa42aa91ff6206bcfb4c1ffbab0df73a181daece329e0e3","services":["streamer"],"enable_msg_events":true,"port":44299},"up":true}},{"node":{"info":{"id":"2c3894b6e47cf19ac7ee9fe213196312f676256f670dff25b03563492550bc74","name":"node_2c3894b6e47cf19ac7ee9fe213196312f676256f670dff25b03563492550bc74","enode":"enode://47952da4c6b64e3f0d74a7444c626ac5ec1dc5cc34a4a62e8cbfb6016015afddb5e37081dbee4fd825dddc79d455d4ed6e589e93bb20b43dd9be174c885c9a19@127.0.0.1:0","enr":"0xf88fb840adbbd5eaf9c32e9a2af15ed32ea2cfb62da1704c409d35e7467a4a3290586ef679381b40e61f36d843e27f7fa96add6a5c419f50d30455c897732b2ba0a615b80183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10347952da4c6b64e3f0d74a7444c626ac5ec1dc5cc34a4a62e8cbfb6016015afdd","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"LDiUtuR88ZrH7p/iExljEvZ2JW9nDf8lsDVjSSVQvHQ=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 2c3894\npopulation: 33 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 ff36 ac4d 898d | 110 d299 (0) d3b0 (0) d1d7 (0) d7ac (0)\n001 6 4447 461c 51db 5f00 | 70 775e (0) 77d2 (0) 7125 (0) 738c (0)\n002 5 18f6 1e2a 1704 0067 | 44 0b72 (0) 0af9 (0) 0a00 (0) 0fc5 (0)\n003 8 39d1 3f94 3373 3237 | 17 378e (0) 3780 (0) 3630 (0) 35e6 (0)\n004 3 20ae 217f 2101 | 6 24b8 (0) 256e (0) 20ae (0) 21a0 (0)\n005 4 2abb 2a97 2a0a 2995 | 4 2a0a (0) 2abb (0) 2a97 (0) 2995 (0)\n006 1 2f32 | 1 2f32 (0)\n007 1 2d36 | 1 2d36 (0)\n============ DEPTH: 8 ==========================================\n008 1 2ccf | 1 2ccf (0)\n009 1 2c79 | 1 2c79 (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"2c3894b6e47cf19ac7ee9fe213196312f676256f670dff25b03563492550bc74","private_key":"1fb0fb0f5bfcd2c5012cb4dcbf3d383d99034d7fc8646fe2fa0239e1f7b51453","name":"node_2c3894b6e47cf19ac7ee9fe213196312f676256f670dff25b03563492550bc74","services":["streamer"],"enable_msg_events":true,"port":33033},"up":true}},{"node":{"info":{"id":"898d2f7d46b4961b646d5a6142d54d6233b7f80f668ce234522dd02e2cc545cb","name":"node_898d2f7d46b4961b646d5a6142d54d6233b7f80f668ce234522dd02e2cc545cb","enode":"enode://29ee8c7cc132a4f84a34e6c9a61e9f98998e563662619c46f89e5a5c92e5b62c66230acaaf18ebc8b957a8a49a939fb01da5f5a3493fc7730cfc9e060c72b79f@127.0.0.1:0","enr":"0xf88fb840293b9155cb46e3fe29d5d357c867f2782ac2bc5187314b335ebef943733badfd73796b642fdbc11e618e294d62120f11f47d2c59854f164e09788562a607f4ef0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10329ee8c7cc132a4f84a34e6c9a61e9f98998e563662619c46f89e5a5c92e5b62c","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"iY0vfUa0lhtkbVphQtVNYjO3+A9mjOI0Ui3QLizFRcs=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 898d2f\npopulation: 39 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 11 5db0 6103 6ecb 2a97 | 146 775e (0) 77d2 (0) 738c (0) 7290 (0)\n001 7 df1e d863 c441 c832 | 63 d1d7 (0) d3b0 (0) d299 (0) d7ac (0)\n002 7 b7ca b65e badd ba88 | 27 bcc6 (0) b820 (0) b897 (0) b95d (0)\n003 5 90a8 915d 976e 959f | 10 96fc (0) 976e (0) 959f (0) 915d (0)\n004 5 8505 849b 8025 82dd | 5 8505 (0) 849b (0) 8025 (0) 82dd (0)\n005 1 8f21 | 1 8f21 (0)\n============ DEPTH: 6 ==========================================\n006 0 | 0\n007 3 886a 88fe 88a1 | 3 88a1 (0) 88fe (0) 886a (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"898d2f7d46b4961b646d5a6142d54d6233b7f80f668ce234522dd02e2cc545cb","private_key":"25e10afa4ffc02c1856aaba9b6fa69c4caf4ae6c8d973c1750b152061c409dad","name":"node_898d2f7d46b4961b646d5a6142d54d6233b7f80f668ce234522dd02e2cc545cb","services":["streamer"],"enable_msg_events":true,"port":35709},"up":true}},{"node":{"info":{"id":"18f6e66e1cc8e620808901b571fdf525ee8f41850fac0bd0e5c5a4de70c5f873","name":"node_18f6e66e1cc8e620808901b571fdf525ee8f41850fac0bd0e5c5a4de70c5f873","enode":"enode://df37042646f5b0435bb902440a5d413958bd9962f689e0d6961bae39f3d57cb89b2d3d68f1c1fabd9e003f19da6adafaa8ff0562d694b0971ef0f8e2e0f86ed0@127.0.0.1:0","enr":"0xf88fb84034efdfae1a4a243bc8ceefd19e7c4e762ea36361737f82c06ef963c92c4d112353472336b474557faf93d9ce5a1c58bd8b9bcba68785b4e52629ee8ffd7354590183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102df37042646f5b0435bb902440a5d413958bd9962f689e0d6961bae39f3d57cb8","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"GPbmbhzI5iCAiQG1cf31Je6PQYUPrAvQ5cWk3nDF+HM=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 18f6e6\npopulation: 28 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 ff36 df1e c832 ad98 | 110 d7ac (0) d640 (0) d1d7 (0) d299 (0)\n001 2 5db0 6103 | 70 775e (0) 77d2 (0) 7290 (0) 738c (0)\n002 3 2101 2c38 2a97 | 32 378e (0) 3780 (0) 3630 (0) 35e6 (0)\n003 6 0b72 0e5e 0cf5 03cc | 22 0a00 (0) 0af9 (0) 0b72 (0) 0ff2 (0)\n004 3 11d4 154b 1704 | 12 13d6 (0) 103b (0) 11d4 (0) 1436 (0)\n005 5 1c9c 1c47 1f85 1f67 | 6 1c8a (0) 1c9c (0) 1c47 (0) 1f85 (0)\n============ DEPTH: 6 ==========================================\n006 2 1a2a 1b83 | 2 1b83 (0) 1a2a (0)\n007 1 19fa | 1 19fa (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"18f6e66e1cc8e620808901b571fdf525ee8f41850fac0bd0e5c5a4de70c5f873","private_key":"f7529dd416080bdc3c1016be896cd1e6d87fb71bc55f747c44045c3c9402c95b","name":"node_18f6e66e1cc8e620808901b571fdf525ee8f41850fac0bd0e5c5a4de70c5f873","services":["streamer"],"enable_msg_events":true,"port":43611},"up":true}},{"node":{"info":{"id":"2a97d308a720274a440dfa6901ca0a5480af9bab58dd8a6c4afdb9c83ea964c3","name":"node_2a97d308a720274a440dfa6901ca0a5480af9bab58dd8a6c4afdb9c83ea964c3","enode":"enode://c54171c617812d43a66bacc6697a272aefbfe1ea882f9a9842b2e79e50d9db13428c9eaff2ffcfc8e81379c05ecfb7c2ffbf49be202d77295d7a5fec2acb9871@127.0.0.1:0","enr":"0xf88fb840eaa8f6fbd8efdf7f4ac5c88ea73f5cee6af1b1758a94af489c271983e5bb2c4f3bb50aeb95ce0a622acd1b27df421f79272a7b9c7586105d10d13eff4da67a590183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103c54171c617812d43a66bacc6697a272aefbfe1ea882f9a9842b2e79e50d9db13","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"KpfTCKcgJ0pEDfppAcoKVICvm6tY3YpsSv25yD6pZMM=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 2a97d3\npopulation: 33 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 898d ad98 ac4d c832 | 110 9076 (0) 90a8 (0) 915d (0) 96fc (0)\n001 4 6f5f 461c 51db 5db0 | 70 7125 (0) 7290 (0) 738c (0) 775e (0)\n002 5 0e5e 0451 0067 1704 | 44 0a00 (0) 0af9 (0) 0b72 (0) 0de3 (0)\n003 7 39d1 3f94 35e6 3630 | 17 314a (0) 30be (0) 3089 (0) 3237 (0)\n004 3 20ae 2101 217f | 6 24b8 (0) 256e (0) 20ae (0) 21a0 (0)\n005 5 2f32 2ccf 2c79 2c38 | 5 2f32 (0) 2d36 (0) 2ccf (0) 2c79 (0)\n006 1 2995 | 1 2995 (0)\n============ DEPTH: 7 ==========================================\n007 0 | 0\n008 1 2a0a | 1 2a0a (0)\n009 0 | 0\n010 1 2abb | 1 2abb (0)\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"2a97d308a720274a440dfa6901ca0a5480af9bab58dd8a6c4afdb9c83ea964c3","private_key":"2b2842453e6ed09eca9428c5db19b8b65672776bc2596ca6a169f7e0c1f3267e","name":"node_2a97d308a720274a440dfa6901ca0a5480af9bab58dd8a6c4afdb9c83ea964c3","services":["streamer"],"enable_msg_events":true,"port":37171},"up":true}},{"node":{"info":{"id":"29957e8e92925a8c79bdf513295d96bfb62fbfc597ee1cf767c7ef408f1b1295","name":"node_29957e8e92925a8c79bdf513295d96bfb62fbfc597ee1cf767c7ef408f1b1295","enode":"enode://3d3730044b8ce4d12ccf3b85eb20d027bf821a3bc0bba763f66d0e201835ec7251c7e983adadb9fc9ad2fb49970947d933cfe6879c5177ee537e2296f637da44@127.0.0.1:0","enr":"0xf88fb840d429fc88603170892285ce1f6086380d3216e336fd781e762f59b9bafe65394e20fb7f1b86aa2fa9cb38deb354e1d1f709002da5bc651bfefc311dac483657af0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1023d3730044b8ce4d12ccf3b85eb20d027bf821a3bc0bba763f66d0e201835ec72","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"KZV+jpKSWox5vfUTKV2Wv7Yvv8WX7hz3Z8fvQI8bEpU=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 29957e\npopulation: 31 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 ef07 ff36 c832 ac4d | 110 e027 (0) e775 (0) e7fa (0) e5d7 (0)\n001 4 461c 5db0 6103 6f5f | 70 4bcf (0) 4ac7 (0) 4a8b (0) 49cd (0)\n002 5 1704 1f67 02d8 0067 | 44 1c8a (0) 1c9c (0) 1c47 (0) 1e2a (0)\n003 6 3b78 3f94 3089 3237 | 17 314a (0) 30be (0) 3089 (0) 3237 (0)\n004 3 20ae 217f 2101 | 6 24b8 (0) 256e (0) 20ae (0) 21a0 (0)\n005 4 2d36 2ccf 2c79 2c38 | 5 2f32 (0) 2d36 (0) 2ccf (0) 2c79 (0)\n============ DEPTH: 6 ==========================================\n006 3 2a0a 2abb 2a97 | 3 2a0a (0) 2abb (0) 2a97 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"29957e8e92925a8c79bdf513295d96bfb62fbfc597ee1cf767c7ef408f1b1295","private_key":"ecb685b96196b2b1ed90974c8c85cfed18d6274a7639640eecea3d33df729790","name":"node_29957e8e92925a8c79bdf513295d96bfb62fbfc597ee1cf767c7ef408f1b1295","services":["streamer"],"enable_msg_events":true,"port":40859},"up":true}},{"node":{"info":{"id":"6f5f5a77e6092e25e5308413e02ba62c1c559024893a7fb98e26b0f34fed8bfe","name":"node_6f5f5a77e6092e25e5308413e02ba62c1c559024893a7fb98e26b0f34fed8bfe","enode":"enode://86a0201b07812ffcb8509f76f8966046bb1d05e0aee48cb884b9929d0a20359fe1ac35441ba1519a58dbfa6590727410bae272f3d71a30b917d894e1e5cc8989@127.0.0.1:0","enr":"0xf88fb8401f19a5134f5248a512cc0875add535eef2498e2fac24985b79b3428e94f87a440936fb0de43a4848b4b08bb438377153809518e99bd2b3b41ab92877893578fe0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10386a0201b07812ffcb8509f76f8966046bb1d05e0aee48cb884b9929d0a20359f","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"b19ad+YJLiXlMIQT4CumLBxVkCSJOn+5jiaw80/ti/4=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 6f5f5a\npopulation: 38 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 7 ef07 f7ba ff36 c9f5 | 110 fbf5 (0) fbc8 (0) f925 (0) fe21 (0)\n001 8 0451 0743 1f67 1e2a | 76 1c9c (0) 1c8a (0) 1c47 (0) 1e2a (0)\n002 9 4d10 4109 4646 461c | 38 4bcf (0) 4a8b (0) 4ac7 (0) 49cd (0)\n003 2 77d2 7a60 | 12 738c (0) 7290 (0) 7125 (0) 775e (0)\n004 2 6337 6103 | 9 66e7 (0) 67dc (0) 67aa (0) 628e (0)\n005 2 6967 6831 | 2 6967 (0) 6831 (0)\n006 2 6c4d 6c73 | 2 6c4d (0) 6c73 (0)\n007 4 6e68 6e05 6ea5 6ecb | 4 6e68 (0) 6e05 (0) 6ea5 (0) 6ecb (0)\n============ DEPTH: 8 ==========================================\n008 1 6fe9 | 1 6fe9 (0)\n009 1 6f2d | 1 6f2d (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"6f5f5a77e6092e25e5308413e02ba62c1c559024893a7fb98e26b0f34fed8bfe","private_key":"92f754c50871b54e305f835a6faf7722bfb219adcd6aea6b430a4fe082d5dca5","name":"node_6f5f5a77e6092e25e5308413e02ba62c1c559024893a7fb98e26b0f34fed8bfe","services":["streamer"],"enable_msg_events":true,"port":38657},"up":true}},{"node":{"info":{"id":"886aff1f1e3b86bfe901066bb7948451c18fe3f8cd1b7318b05154890ca8f738","name":"node_886aff1f1e3b86bfe901066bb7948451c18fe3f8cd1b7318b05154890ca8f738","enode":"enode://d5df6e2d4f88e0e6096cd3273f0008286a9f7a36e5c6705f89116595e4ea8c52e37570e6afe957ff70d0a32871c3e5a6a3ab64e9d2927eeba8ef68030010c6c4@127.0.0.1:0","enr":"0xf88fb840f7ff3872ab2265f9c5aafbf228e1003c7903bf3c757e67fdff401a6bfd8a886223114715cada6784003648d4e7484150b8ec46c245a46acf0330afde54cefd7e0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102d5df6e2d4f88e0e6096cd3273f0008286a9f7a36e5c6705f89116595e4ea8c52","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"iGr/Hx47hr/pAQZrt5SEUcGP4/jNG3MYsFFUiQyo9zg=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 886aff\npopulation: 31 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 0c64 0067 2995 461c | 146 1c8a (0) 1c9c (0) 1c47 (0) 1e2a (0)\n001 8 fe31 ff36 f7fa f7ba | 63 fbf5 (0) fbc8 (0) f925 (0) fe21 (0)\n002 5 b65e b7ca ba88 badd | 27 b2b5 (0) b2a5 (0) b02b (0) b502 (0)\n003 4 959f 915d 90a8 9d0f | 10 96fc (0) 976e (0) 959f (0) 915d (0)\n004 4 8505 82f9 82dd 8025 | 5 8025 (0) 82dd (0) 82f9 (0) 849b (0)\n005 1 8f21 | 1 8f21 (0)\n============ DEPTH: 6 ==========================================\n006 0 | 0\n007 1 898d | 1 898d (0)\n008 2 88a1 88fe | 2 88a1 (0) 88fe (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"886aff1f1e3b86bfe901066bb7948451c18fe3f8cd1b7318b05154890ca8f738","private_key":"4cb5893d2151dd13ceab60cbb42058108639b9cc2b3914cbc6145530b864a491","name":"node_886aff1f1e3b86bfe901066bb7948451c18fe3f8cd1b7318b05154890ca8f738","services":["streamer"],"enable_msg_events":true,"port":39861},"up":true}},{"node":{"info":{"id":"5db08436c64f4cc9e2b3950e35bc8ad739825e3efa67a642c771d95b34cb420c","name":"node_5db08436c64f4cc9e2b3950e35bc8ad739825e3efa67a642c771d95b34cb420c","enode":"enode://a13bd5a44dd15b8d08f8dd72bb7a2c87930d339c65d0073457d89576d4efa9aae2dc8c1cf98cf1849ffbb3025d74e4ba6d7ab69d0f7de9a01b3fcd1c33602678@127.0.0.1:0","enr":"0xf88fb840c81df54245181d95cd7921f23a74ae3d33fd56b42989c6460164f5738ac8b5153164e33366793fcadd86b527e176f78b30442e14f9d726c55e28e808ff75a6860183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102a13bd5a44dd15b8d08f8dd72bb7a2c87930d339c65d0073457d89576d4efa9aa","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"XbCENsZPTMnis5UONbyK1zmCXj76Z6ZCx3HZWzTLQgw=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 5db084\npopulation: 28 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 f7ba ad98 898d 886a | 110 f925 (0) fbf5 (0) fbc8 (0) fe21 (0)\n001 9 1704 1a2a 18f6 0451 | 76 1c8a (0) 1c9c (0) 1c47 (0) 1f85 (0)\n002 4 6337 6103 6ecb 6f5f | 32 775e (0) 77d2 (0) 738c (0) 7290 (0)\n003 3 4d10 4447 461c | 23 4ac7 (0) 4a8b (0) 4bcf (0) 49cd (0)\n004 2 5308 51db | 8 574f (0) 524d (0) 53a8 (0) 53fe (0)\n005 3 58ed 5823 5b63 | 3 5b63 (0) 5823 (0) 58ed (0)\n============ DEPTH: 6 ==========================================\n006 2 5efb 5f00 | 2 5efb (0) 5f00 (0)\n007 1 5cd2 | 1 5cd2 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"5db08436c64f4cc9e2b3950e35bc8ad739825e3efa67a642c771d95b34cb420c","private_key":"3ded975bfe84c252cd54697144ffcd0ac6978fc1c80ab6663d4c0b2cb7338d2a","name":"node_5db08436c64f4cc9e2b3950e35bc8ad739825e3efa67a642c771d95b34cb420c","services":["streamer"],"enable_msg_events":true,"port":34077},"up":true}},{"node":{"info":{"id":"ad9899f78659492ec248a884927a757f3f3b4e76cd2abc46ad8766251fd8afed","name":"node_ad9899f78659492ec248a884927a757f3f3b4e76cd2abc46ad8766251fd8afed","enode":"enode://909113f035bbc97985e3d769ea806d56160d43b644c84bde7c5f980a314c36cf1016ceab475ccd4f4bda05f0e4143c2d74ac98f7f9ccb910d7864406f2f8865e@127.0.0.1:0","enr":"0xf88fb840148b90cf90d9ca81f69924d5705f155d5adc230d87a2b48d4b1bdedf4936c9a8421003eef921a088bbc6e7b5cdf66d0f50b88dadfff07ee128418404cc5314c90183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102909113f035bbc97985e3d769ea806d56160d43b644c84bde7c5f980a314c36cf","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"rZiZ94ZZSS7CSKiEknp1fz87TnbNKrxGrYdmJR/Yr+0=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: ad9899\npopulation: 29 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 2a97 18f6 0067 6f5f | 146 314a (0) 30be (0) 3089 (0) 3237 (0)\n001 6 fe31 ff36 f7ba ef07 | 63 fbc8 (0) fbf5 (0) f925 (0) fe21 (0)\n002 3 9076 898d 886a | 20 96fc (0) 976e (0) 959f (0) 915d (0)\n003 6 b5b2 b7ca bb90 badd | 17 bcc6 (0) b820 (0) b897 (0) b95d (0)\n004 4 a369 a46d a6fb a653 | 5 a46d (0) a6fb (0) a653 (0) a34e (0)\n============ DEPTH: 5 ==========================================\n005 0 | 0\n006 3 af02 ae2b aeb4 | 3 af02 (0) aeb4 (0) ae2b (0)\n007 1 ac4d | 1 ac4d (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"ad9899f78659492ec248a884927a757f3f3b4e76cd2abc46ad8766251fd8afed","private_key":"c8586e1c253506ff671677e75e7d636dfd48f90798d59c6b42bfb77250056cba","name":"node_ad9899f78659492ec248a884927a757f3f3b4e76cd2abc46ad8766251fd8afed","services":["streamer"],"enable_msg_events":true,"port":33071},"up":true}},{"node":{"info":{"id":"c832b4ad64a17da4b796ffcac646c2aa666b276aabb7eb3bfe7981d64a4da402","name":"node_c832b4ad64a17da4b796ffcac646c2aa666b276aabb7eb3bfe7981d64a4da402","enode":"enode://76942d9ce0d444b30dbb6499273c4aca434d908d0bbe244316cd5621a4921967b8be1024dc9585544e08d91e53aa2e00ad209181beffa6caccc40b66f975dc55@127.0.0.1:0","enr":"0xf88fb840bf9df113c1a80e0937a0f28c991d4bb2c73ebc27ac1aa51c6db9806d3de0ec1439b8249fa929666c4c5b8cfee951e52e670ec77c7a2d5ec4ecd12bc3609e127e0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10376942d9ce0d444b30dbb6499273c4aca434d908d0bbe244316cd5621a4921967","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"yDK0rWShfaS3lv/KxkbCqmZrJ2qrt+s7/nmB1kpNpAI=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: c832b4\npopulation: 31 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 18f6 0067 2a97 2995 | 146 314a (0) 30be (0) 3089 (0) 3237 (0)\n001 4 898d 886a ac4d ad98 | 47 9852 (0) 9890 (0) 9fa0 (0) 9d0f (0)\n002 9 e514 ec52 ef1b ef07 | 37 fbf5 (0) fbc8 (0) f925 (0) ff36 (0)\n003 4 d3b0 df1e d887 d863 | 11 d7ac (0) d640 (0) d1d7 (0) d299 (0)\n004 3 c620 c786 c441 | 9 c1f9 (0) c26f (0) c6cf (0) c620 (0)\n005 1 cc20 | 1 cc20 (0)\n006 2 ca04 caf6 | 2 ca04 (0) caf6 (0)\n============ DEPTH: 7 ==========================================\n007 1 c9f5 | 1 c9f5 (0)\n008 1 c898 | 1 c898 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"c832b4ad64a17da4b796ffcac646c2aa666b276aabb7eb3bfe7981d64a4da402","private_key":"c35521b3ce161ef9f4891093a65fe799e2f359c3418a145bbe0b8d59330fd18a","name":"node_c832b4ad64a17da4b796ffcac646c2aa666b276aabb7eb3bfe7981d64a4da402","services":["streamer"],"enable_msg_events":true,"port":41037},"up":true}},{"node":{"info":{"id":"461cc9f064e6f4f06ff38e0d1f3f00ef8807ba31c7258e453cc682e9551bb1c6","name":"node_461cc9f064e6f4f06ff38e0d1f3f00ef8807ba31c7258e453cc682e9551bb1c6","enode":"enode://7edde69d3daf04827701687380c3a97d52cdc2358ddae6c097ff34bc5eeeeac0aa926cd6fb97c888a0c344fb17b07929f21de48835de2a3c805e343f66814cf2@127.0.0.1:0","enr":"0xf88fb84011bf54c1453a78871d09dfbf3b20f2efedcd347c5a3fce32edf95929f083231527adad0d0e0ceb8cad68d1bcb7dc5c32ead8fd94aca4aca3e9bb6abc8b1bce3b0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1027edde69d3daf04827701687380c3a97d52cdc2358ddae6c097ff34bc5eeeeac0","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"RhzJ8GTm9PBv844NHz8A74gHujHHJY5FPMaC6VUbscY=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 461cc9\npopulation: 33 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 ad98 886a ef07 c9f5 | 110 9852 (0) 9890 (0) 9fa0 (0) 9d0f (0)\n001 7 0067 3f94 3237 3373 | 76 314a (0) 30be (0) 3089 (0) 3237 (0)\n002 3 6103 6ecb 6f5f | 32 7125 (0) 7290 (0) 738c (0) 77d2 (0)\n003 6 5308 51db 58ed 5f00 | 15 5efb (0) 5f00 (0) 5cd2 (0) 5db0 (0)\n004 2 4e5a 4d10 | 11 4ac7 (0) 4a8b (0) 4bcf (0) 49cd (0)\n005 2 41d9 4109 | 2 41d9 (0) 4109 (0)\n006 3 4558 44a1 4447 | 4 4559 (0) 4558 (0) 44a1 (0) 4447 (0)\n007 2 4782 47bf | 2 4782 (0) 47bf (0)\n008 1 46fe | 1 46fe (0)\n============ DEPTH: 9 ==========================================\n009 1 4646 | 1 4646 (0)\n010 1 4636 | 1 4636 (0)\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"461cc9f064e6f4f06ff38e0d1f3f00ef8807ba31c7258e453cc682e9551bb1c6","private_key":"af9f5d0414462a64a90ff3a2fee02742a99043e9971bd04754fbca5a117064c8","name":"node_461cc9f064e6f4f06ff38e0d1f3f00ef8807ba31c7258e453cc682e9551bb1c6","services":["streamer"],"enable_msg_events":true,"port":45431},"up":true}},{"node":{"info":{"id":"ef07be559914ec4b5930d90d8d8b6f32dab9eba23acc36f14d512307f9974348","name":"node_ef07be559914ec4b5930d90d8d8b6f32dab9eba23acc36f14d512307f9974348","enode":"enode://2d13e3fbcf2f401951af67ee410e6785e91904619b76822ce4337ddae7965c663773cfd671554e0c6ede7518907b8911f6676b5565313b08c451c90a8dcba823@127.0.0.1:0","enr":"0xf88fb84024126a4f41bfdaa7a672735c056cbdcd6917db518e518e9ad6d43d687a7275bb61f0232ccea5eeefd3ee8ffa770501c2a89ba614f63ec29b1f2ac08ba2bb5b8c0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1032d13e3fbcf2f401951af67ee410e6785e91904619b76822ce4337ddae7965c66","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"7we+VZkU7EtZMNkNjYtvMtq566I6zDbxTVEjB/mXQ0g=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: ef07be\npopulation: 29 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 2a97 2995 0067 6f5f | 146 314a (0) 30be (0) 3089 (0) 3237 (0)\n001 4 8f21 886a badd ad98 | 47 976e (0) 96fc (0) 959f (0) 915d (0)\n002 3 df1e c9f5 c832 | 26 d1d7 (0) d299 (0) d3b0 (0) d7ac (0)\n003 6 ff36 fe31 f2d5 f629 | 19 fbc8 (0) fbf5 (0) f925 (0) ff36 (0)\n004 2 e5d7 e514 | 8 e027 (0) e7fa (0) e775 (0) e5ad (0)\n005 4 eb98 e854 e883 e8ef | 4 eb98 (0) e854 (0) e883 (0) e8ef (0)\n006 2 ed2d ec52 | 2 ed2d (0) ec52 (0)\n007 1 ee5e | 1 ee5e (0)\n============ DEPTH: 8 ==========================================\n008 1 efea | 1 efea (0)\n009 0 | 0\n010 0 | 0\n011 1 ef1b | 1 ef1b (0)\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"ef07be559914ec4b5930d90d8d8b6f32dab9eba23acc36f14d512307f9974348","private_key":"cffbac62882babf0b4dfc14cd40307088b5ce5ccaa138a4f172914575e6393a3","name":"node_ef07be559914ec4b5930d90d8d8b6f32dab9eba23acc36f14d512307f9974348","services":["streamer"],"enable_msg_events":true,"port":38781},"up":true}},{"node":{"info":{"id":"006727dc6f59b120b24c17b8e63f80ef3439105f8118ffeed408f105a48ee60c","name":"node_006727dc6f59b120b24c17b8e63f80ef3439105f8118ffeed408f105a48ee60c","enode":"enode://f73c1f0ca14af6b0b8fb1eba1c49d0d653a7833cb03dd69d112260a24154d15515ed2fa276e27d6e70ac92d7f11b594ce55a25be21a9637d56289ac3b2294306@127.0.0.1:0","enr":"0xf88fb8400367dfb7465473b46b2a6502bf1f47fd2b2fe0f11e74a750c1c44e3d798efceb606a9f68a49de5f6c4d6a5606653c80257a8f993dd8f600042cbb5cea1b908ab0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102f73c1f0ca14af6b0b8fb1eba1c49d0d653a7833cb03dd69d112260a24154d155","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"AGcn3G9ZsSCyTBe45j+A7zQ5EF+BGP/u1AjxBaSO5gw=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 006727\npopulation: 35 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 886a ad98 c832 fe31 | 110 9852 (0) 9890 (0) 9fa0 (0) 9d0f (0)\n001 4 461c 51db 58ed 5db0 | 70 775e (0) 77d2 (0) 7290 (0) 738c (0)\n002 3 2c38 2a97 2995 | 32 314a (0) 30be (0) 3089 (0) 3237 (0)\n003 6 11d4 14df 1704 18f6 | 22 13d6 (0) 103b (0) 11d4 (0) 154b (0)\n004 7 0af9 0a00 0b72 0cf5 | 11 0af9 (0) 0a00 (0) 0b72 (0) 0d8a (0)\n005 5 0661 0743 0438 045b | 6 0661 (0) 07a8 (0) 0743 (0) 0438 (0)\n============ DEPTH: 6 ==========================================\n006 3 02d8 0328 03cc | 3 02d8 (0) 0328 (0) 03cc (0)\n007 0 | 0\n008 1 00c6 | 1 00c6 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"006727dc6f59b120b24c17b8e63f80ef3439105f8118ffeed408f105a48ee60c","private_key":"5eb85f550595a12882aba16bce31535a88504fca1f6f49492226c3baed943110","name":"node_006727dc6f59b120b24c17b8e63f80ef3439105f8118ffeed408f105a48ee60c","services":["streamer"],"enable_msg_events":true,"port":45081},"up":true}},{"node":{"info":{"id":"f7baef876a62b92ebe5ca9ec6a085e0eb54fd31e2425e662eec747df3cd77592","name":"node_f7baef876a62b92ebe5ca9ec6a085e0eb54fd31e2425e662eec747df3cd77592","enode":"enode://17cec2abc9a0e660f7fe13e3aab5154a566cbbde2e9e0abea28d40e39eb63ec0a917c1040c10c1b2522fc87afce58949b5d8512d66bd953577e7c8ffe29b2727@127.0.0.1:0","enr":"0xf88fb840d12213ec977f33e55ead3ff1c891eadaf9d35e5d9f80da8f41e1723cfc228d17411a705b829183356338bfb66a6e6a3f22d4cd095d3e916ee50c79501b6a92f20183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10317cec2abc9a0e660f7fe13e3aab5154a566cbbde2e9e0abea28d40e39eb63ec0","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"97rvh2piuS6+XKnsagheDrVP0x4kJeZi7sdH3zzXdZI=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: f7baef\npopulation: 29 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 6f5f 58ed 5db0 0067 | 146 775e (0) 77d2 (0) 7125 (0) 7290 (0)\n001 6 8f21 886a ac4d ad98 | 47 9890 (0) 9852 (0) 9fa0 (0) 9d0f (0)\n002 2 c832 c9f5 | 26 d3b0 (0) d299 (0) d1d7 (0) d7ac (0)\n003 4 e514 ec52 ef1b ef07 | 18 e027 (0) e7fa (0) e775 (0) e5ad (0)\n004 4 fbf5 f925 ff36 fe31 | 6 fbc8 (0) fbf5 (0) f925 (0) ff36 (0)\n005 3 f31c f27f f2d5 | 3 f31c (0) f27f (0) f2d5 (0)\n006 3 f45f f456 f5b2 | 6 f4e0 (0) f45f (0) f456 (0) f528 (0)\n007 1 f629 | 1 f629 (0)\n============ DEPTH: 8 ==========================================\n008 1 f773 | 1 f773 (0)\n009 1 f7fa | 1 f7fa (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"f7baef876a62b92ebe5ca9ec6a085e0eb54fd31e2425e662eec747df3cd77592","private_key":"bd8f1323739a31a9df6d3249c8a7c3b7f087513627688a48ae214cdf08c40828","name":"node_f7baef876a62b92ebe5ca9ec6a085e0eb54fd31e2425e662eec747df3cd77592","services":["streamer"],"enable_msg_events":true,"port":35911},"up":true}},{"node":{"info":{"id":"c9f5acafbbf8c66647de05b0848d79451eee490709d53f118fc2051410cc8203","name":"node_c9f5acafbbf8c66647de05b0848d79451eee490709d53f118fc2051410cc8203","enode":"enode://ef16c8f953e0c91672402036963d6771c490e9e0b99eca6f2d42e524b671f062bd499b0de306fe5eed171f48df7bc9f34bd943010925328c9d60ef086579968b@127.0.0.1:0","enr":"0xf88fb840262713d5977cf6a3bafd1062509bc016e5c191c3afe9c7a08a48ed97868b7d933211c89aba69029de45bd8e766b7ff6f2d419b47a5c830ca236eeb4da5ffee270183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103ef16c8f953e0c91672402036963d6771c490e9e0b99eca6f2d42e524b671f062","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"yfWsr7v4xmZH3gWwhI15RR7uSQcJ1T8Rj8IFFBDMggM=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: c9f5ac\npopulation: 36 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 6f5f 461c 58ed 5308 | 146 02d8 (0) 0328 (0) 03cc (0) 00c6 (0)\n001 5 886a b7ca badd ba88 | 47 9890 (0) 9852 (0) 9fa0 (0) 9d0f (0)\n002 12 e5d7 e514 ec52 ef1b | 37 e027 (0) e775 (0) e7fa (0) e5ad (0)\n003 6 d640 df1e daec db6a | 11 d1d7 (0) d299 (0) d3b0 (0) d7ac (0)\n004 3 c441 c620 c786 | 9 c26f (0) c1f9 (0) c6cf (0) c620 (0)\n005 1 cc20 | 1 cc20 (0)\n006 2 ca04 caf6 | 2 ca04 (0) caf6 (0)\n============ DEPTH: 7 ==========================================\n007 2 c898 c832 | 2 c898 (0) c832 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"c9f5acafbbf8c66647de05b0848d79451eee490709d53f118fc2051410cc8203","private_key":"a8e9d35f1da0d512396196bd7847bf29fbc3e45dab549c77015562a5cd6c1d01","name":"node_c9f5acafbbf8c66647de05b0848d79451eee490709d53f118fc2051410cc8203","services":["streamer"],"enable_msg_events":true,"port":36247},"up":true}},{"node":{"info":{"id":"fe316679eca0e0eb823325812a56fd27da02653b06ada2fd03b27501bda8371a","name":"node_fe316679eca0e0eb823325812a56fd27da02653b06ada2fd03b27501bda8371a","enode":"enode://29c3a81b46834e3d0f6c4169b27c4ce7dea09b4f8ecdf8cafa3b4705fa9fd804d95a4d7f8639754533998af29d1c1681ffd26bf51aa4576a6bf66fd4e59c4636@127.0.0.1:0","enr":"0xf88fb8406318ee2852832b8479302a86a8c52101e4032df0a3751458a30005834cac33085a7c35b08af5014dc752719fbe5642f4752139c909996b751458d0b79ff759420183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10229c3a81b46834e3d0f6c4169b27c4ce7dea09b4f8ecdf8cafa3b4705fa9fd804","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"/jFmeeyg4OuCMyWBKlb9J9oCZTsGraL9A7J1Ab2oNxo=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: fe3166\npopulation: 27 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 0b72 0067 0743 0451 | 146 0661 (0) 07a8 (0) 0743 (0) 0438 (0)\n001 6 8f21 886a ad98 b7ca | 47 9890 (0) 9852 (0) 9fa0 (0) 9d0f (0)\n002 3 c786 c832 c9f5 | 26 d1d7 (0) d299 (0) d3b0 (0) d7ac (0)\n003 3 e514 ef1b ef07 | 18 e027 (0) e775 (0) e7fa (0) e5ad (0)\n004 5 f2d5 f528 f629 f7fa | 13 f31c (0) f27f (0) f2d5 (0) f4e0 (0)\n005 3 fbc8 fbf5 f925 | 3 fbc8 (0) fbf5 (0) f925 (0)\n============ DEPTH: 6 ==========================================\n006 0 | 0\n007 1 ff36 | 1 ff36 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 1 fe21 | 1 fe21 (0)\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"fe316679eca0e0eb823325812a56fd27da02653b06ada2fd03b27501bda8371a","private_key":"4cb7e774b4209f69e673c60ecdf42b2d97a6c7acee80dac037fc744274c03d0c","name":"node_fe316679eca0e0eb823325812a56fd27da02653b06ada2fd03b27501bda8371a","services":["streamer"],"enable_msg_events":true,"port":36479},"up":true}},{"node":{"info":{"id":"51db114a52827f5b74088bd0fc87d35229e7740e7d121bd7699298396516a880","name":"node_51db114a52827f5b74088bd0fc87d35229e7740e7d121bd7699298396516a880","enode":"enode://c015318af105b1c0aaec79e08f9e9487e8c204c3decc0f161307ee66a71cc5eb7857085301967316982edbd1b3af1895278747273ba557b313f39de6467cef30@127.0.0.1:0","enr":"0xf88fb84065c1481d82bab43cf2b73a6409653ca03d1143d68af8825b5abe412f0ffc61ac5d2f9f6521e6f02a0242b8fb6bff45bbfe129f271e03dd3a7df92a3ddf9a9b990183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102c015318af105b1c0aaec79e08f9e9487e8c204c3decc0f161307ee66a71cc5eb","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"UdsRSlKCf1t0CIvQ/IfTUinndA59EhvXaZKYOWUWqIA=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 51db11\npopulation: 32 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 b7ca badd c9f5 fe31 | 110 9852 (0) 9890 (0) 9fa0 (0) 9d0f (0)\n001 7 39d1 3f94 2101 2a97 | 76 24b8 (0) 256e (0) 20ae (0) 21a0 (0)\n002 3 6103 6ecb 6f5f | 32 775e (0) 77d2 (0) 7290 (0) 738c (0)\n003 4 4d10 4109 4646 461c | 23 4a8b (0) 4ac7 (0) 4bcf (0) 49cd (0)\n004 7 5efb 5f00 5cd2 5db0 | 7 5efb (0) 5f00 (0) 5cd2 (0) 5db0 (0)\n005 1 574f | 1 574f (0)\n============ DEPTH: 6 ==========================================\n006 5 524d 53a8 53fe 534b | 5 524d (0) 53a8 (0) 53fe (0) 534b (0)\n007 0 | 0\n008 1 512e | 1 512e (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"51db114a52827f5b74088bd0fc87d35229e7740e7d121bd7699298396516a880","private_key":"463982e5e17d8853a2119047040024cc3e05d9d4fed44bca081b9a757de79e78","name":"node_51db114a52827f5b74088bd0fc87d35229e7740e7d121bd7699298396516a880","services":["streamer"],"enable_msg_events":true,"port":46747},"up":true}},{"node":{"info":{"id":"58ed74695bf527bac9a350c86d305e53e08c4999795e11cd3b2a36f5cd25d637","name":"node_58ed74695bf527bac9a350c86d305e53e08c4999795e11cd3b2a36f5cd25d637","enode":"enode://35dd66ee032741a2c01c7184c5d372ac89b1bfa19121e0208b6bc4554e26a48e2866d923d323b999aa49db2e9c87ad0ba78da81a35d099d44b2ac12e4577c026@127.0.0.1:0","enr":"0xf88fb840043496ba46ff1222fe7d2927803a795654e938ed8bb711b917672f048ef3180357b54d37aa9fd541158c55dea24adf4c62ed7d291e7875c0d5f76a14a12be1670183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10235dd66ee032741a2c01c7184c5d372ac89b1bfa19121e0208b6bc4554e26a48e","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"WO10aVv1J7rJo1DIbTBeU+CMSZl5XhHNOyo29c0l1jc=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 58ed74\npopulation: 25 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 c9f5 ef1b f7ba b7ca | 110 e027 (0) e7fa (0) e775 (0) e5ad (0)\n001 5 3f94 35e6 0b72 0e5e | 76 256e (0) 24b8 (0) 20ae (0) 21a0 (0)\n002 3 6103 6ecb 6f5f | 32 775e (0) 77d2 (0) 7290 (0) 738c (0)\n003 3 4d10 4109 461c | 23 4ac7 (0) 4a8b (0) 4bcf (0) 49cd (0)\n004 3 53fe 5308 51db | 8 574f (0) 524d (0) 53a8 (0) 53fe (0)\n005 4 5db0 5cd2 5efb 5f00 | 4 5efb (0) 5f00 (0) 5cd2 (0) 5db0 (0)\n============ DEPTH: 6 ==========================================\n006 1 5b63 | 1 5b63 (0)\n007 0 | 0\n008 1 5823 | 1 5823 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"58ed74695bf527bac9a350c86d305e53e08c4999795e11cd3b2a36f5cd25d637","private_key":"6eeff6ab23e21598ffa4724e7f1c6d198e55378b5315c3e87a2b049bdec8dbba","name":"node_58ed74695bf527bac9a350c86d305e53e08c4999795e11cd3b2a36f5cd25d637","services":["streamer"],"enable_msg_events":true,"port":46637},"up":true}},{"node":{"info":{"id":"baddc778aea97acdbbb5bc99744a5545abab9f6047c81f328761645287ac391c","name":"node_baddc778aea97acdbbb5bc99744a5545abab9f6047c81f328761645287ac391c","enode":"enode://4c1086d46d650500110758f88911d8de08c282320cb28b478685c979ba504a460324e40bf1c4d18435044daf1db70bf50fbad5e5bc783f75141ee51671da1c2a@127.0.0.1:0","enr":"0xf88fb84011f51bcd70f0e65f6e7ff877cd39d60fca04b7df569eecb3f9200c5983c30c66090beb6cfac47e9a17f3d69aa7771c4d48640fc4436bbb1499789941189d0bb00183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1024c1086d46d650500110758f88911d8de08c282320cb28b478685c979ba504a46","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"ut3HeK6pes27tbyZdEpVRaurn2BHyB8yh2FkUoesORw=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: baddc7\npopulation: 32 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 0e5e 5308 51db 58ed | 146 256e (0) 24b8 (0) 20ae (0) 21a0 (0)\n001 5 c9f5 ef07 ef1b fe31 | 63 fbf5 (0) fbc8 (0) f925 (0) ff36 (0)\n002 4 9d0f 90a8 898d 886a | 20 9890 (0) 9852 (0) 9fa0 (0) 9d0f (0)\n003 5 a369 aeb4 ae2b ad98 | 10 a46d (0) a6fb (0) a653 (0) a34e (0)\n004 6 b2a5 b02b b5b2 b626 | 8 b02b (0) b2b5 (0) b2a5 (0) b502 (0)\n005 1 bcc6 | 1 bcc6 (0)\n006 4 b820 b897 b95d b911 | 4 b897 (0) b820 (0) b95d (0) b911 (0)\n007 1 bb90 | 1 bb90 (0)\n============ DEPTH: 8 ==========================================\n008 0 | 0\n009 1 ba88 | 1 ba88 (0)\n010 1 baf2 | 1 baf2 (0)\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"baddc778aea97acdbbb5bc99744a5545abab9f6047c81f328761645287ac391c","private_key":"1b341e606e667d2dee5a1c605b8ab560bf7350972aac6daa482f10d3fcced991","name":"node_baddc778aea97acdbbb5bc99744a5545abab9f6047c81f328761645287ac391c","services":["streamer"],"enable_msg_events":true,"port":42801},"up":true}},{"node":{"info":{"id":"b7cafed41dac01dd59e2bcaeaaab551ebfeab8eaa1f97c1866fe0ddae772807b","name":"node_b7cafed41dac01dd59e2bcaeaaab551ebfeab8eaa1f97c1866fe0ddae772807b","enode":"enode://830e8810ca164c9d2a65e2235aba3b15b5907afbf93dabb8c5a00c2a21f50b3a0f3f17a4add3a9dc11b898dfaffb40ed51faeaf15f8e8ca83bc7f9bdb499650b@127.0.0.1:0","enr":"0xf88fb8409a15792c3e8fda0fc6163a89bf642573178c1828ebfac480954ce5384512a9144d6ab33233a340364e8b2b24cbce1de306889b420de971650d2efea448ac33f10183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103830e8810ca164c9d2a65e2235aba3b15b5907afbf93dabb8c5a00c2a21f50b3a","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"t8r+1B2sAd1Z4ryuqqtVHr/quOqh+XwYZv4N2udygHs=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: b7cafe\npopulation: 32 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 0e5e 3f94 35e6 5308 | 146 24b8 (0) 256e (0) 20ae (0) 21a0 (0)\n001 5 c9f5 e514 ef1b f7ba | 63 d1d7 (0) d299 (0) d3b0 (0) d7ac (0)\n002 6 90a8 9d0f 8f21 898d | 20 9890 (0) 9852 (0) 9fa0 (0) 9d0f (0)\n003 3 a369 ae2b ad98 | 10 a46d (0) a6fb (0) a653 (0) a34e (0)\n004 5 bcc6 b911 bb90 ba88 | 9 bcc6 (0) b897 (0) b820 (0) b95d (0)\n005 3 b2b5 b2a5 b02b | 3 b2b5 (0) b2a5 (0) b02b (0)\n006 2 b502 b5b2 | 2 b502 (0) b5b2 (0)\n============ DEPTH: 7 ==========================================\n007 2 b626 b65e | 2 b626 (0) b65e (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"b7cafed41dac01dd59e2bcaeaaab551ebfeab8eaa1f97c1866fe0ddae772807b","private_key":"8734418063f761c7aebb5bd811d651e4eefd0a332a238b3407eab389d174d344","name":"node_b7cafed41dac01dd59e2bcaeaaab551ebfeab8eaa1f97c1866fe0ddae772807b","services":["streamer"],"enable_msg_events":true,"port":35765},"up":true}},{"node":{"info":{"id":"ba884e5cfa1ee6eb38217181711e01bb0c37b3e33d1424dfa89ed3e29ef6205b","name":"node_ba884e5cfa1ee6eb38217181711e01bb0c37b3e33d1424dfa89ed3e29ef6205b","enode":"enode://e65f236dc029e0361b5115dc919118463ccd09476638ef7c4cf88151a41986426bd3623c7dee6acc1cb636f084e8f2c1cd6a783627bbf0cb45ddbafd57e1c4d2@127.0.0.1:0","enr":"0xf88fb840673785f36dc917ec90991ef9b8599a3710d9a0c7d36ea2aecdc3ebc730f1f9531104d6620e68027de87d0f8574a91458fb0346324b22795901a3dffe062dc4540183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102e65f236dc029e0361b5115dc919118463ccd09476638ef7c4cf88151a4198642","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"uohOXPoe5us4IXGBcR4Buww3s+M9FCTfqJ7T4p72IFs=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: ba884e\npopulation: 30 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 0e5e 3f94 3373 35e6 | 146 24b8 (0) 256e (0) 20ae (0) 21a0 (0)\n001 4 c9f5 ef1b e514 fe31 | 63 d7ac (0) d640 (0) d1d7 (0) d299 (0)\n002 4 90a8 8f21 898d 886a | 20 9890 (0) 9852 (0) 9fa0 (0) 9d0f (0)\n003 4 a369 ae2b ac4d ad98 | 10 a6fb (0) a653 (0) a46d (0) a34e (0)\n004 6 b2a5 b02b b5b2 b626 | 8 b2b5 (0) b2a5 (0) b02b (0) b502 (0)\n005 1 bcc6 | 1 bcc6 (0)\n006 3 b897 b820 b911 | 4 b820 (0) b897 (0) b95d (0) b911 (0)\n007 1 bb90 | 1 bb90 (0)\n============ DEPTH: 8 ==========================================\n008 0 | 0\n009 2 baf2 badd | 2 baf2 (0) badd (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"ba884e5cfa1ee6eb38217181711e01bb0c37b3e33d1424dfa89ed3e29ef6205b","private_key":"ea93ee284f5d410641b1a5125b7deca5a425eb767d97519816ce904c9a5109d4","name":"node_ba884e5cfa1ee6eb38217181711e01bb0c37b3e33d1424dfa89ed3e29ef6205b","services":["streamer"],"enable_msg_events":true,"port":41725},"up":true}},{"node":{"info":{"id":"53087084708cc5ee63ac459b18fa10ae52a823139b4ecba6c8691d4934f2f971","name":"node_53087084708cc5ee63ac459b18fa10ae52a823139b4ecba6c8691d4934f2f971","enode":"enode://7faeabed37c1721532d3cf55386ceb61d7127283ea741074062c7387ae1b7c9ff851941e9c92460053143e3f856fd6defb1749214ca54c839ac64fe96a8a0c13@127.0.0.1:0","enr":"0xf88fb84025b6f7edf9c4cdbcc94eaa1b1c4f4a202e55a443e4ace9d9896d487de9e2b050369275954c54148b295eb47404201100c10320546a8e4ad3516ba4c280288ea20183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1037faeabed37c1721532d3cf55386ceb61d7127283ea741074062c7387ae1b7c9f","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"UwhwhHCMxe5jrEWbGPoQrlKoIxObTsumyGkdSTTy+XE=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 530870\npopulation: 34 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 c9f5 e514 ef1b b7ca | 110 d7ac (0) d640 (0) d1d7 (0) d299 (0)\n001 5 3f94 39d1 3630 1e2a | 76 24b8 (0) 256e (0) 20ae (0) 21a0 (0)\n002 6 7dd3 605a 6103 6337 | 32 77d2 (0) 775e (0) 7290 (0) 738c (0)\n003 5 4e5a 4d10 4646 461c | 23 4559 (0) 4558 (0) 44a1 (0) 4447 (0)\n004 5 5f00 5cd2 5db0 5823 | 7 5efb (0) 5f00 (0) 5cd2 (0) 5db0 (0)\n005 1 574f | 1 574f (0)\n006 2 512e 51db | 2 512e (0) 51db (0)\n007 1 524d | 1 524d (0)\n============ DEPTH: 8 ==========================================\n008 2 53a8 53fe | 2 53a8 (0) 53fe (0)\n009 1 534b | 1 534b (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"53087084708cc5ee63ac459b18fa10ae52a823139b4ecba6c8691d4934f2f971","private_key":"9d1b128357783fdd85833562ee5ae70767a77d42c4a39b16e33cfceae74fe8cd","name":"node_53087084708cc5ee63ac459b18fa10ae52a823139b4ecba6c8691d4934f2f971","services":["streamer"],"enable_msg_events":true,"port":43957},"up":true}},{"node":{"info":{"id":"0e5e0bb1383b2ec569b157a1d2ae6900592ab892a28367f5613a4e29cb265088","name":"node_0e5e0bb1383b2ec569b157a1d2ae6900592ab892a28367f5613a4e29cb265088","enode":"enode://9de20b1b75da752d129b0fbd52eda941af9eceb5d14f591ba77175f5f153ab996b82146163328ca097a16b7fb0ed20190dd92ac98b14c785e70658a8c5be1929@127.0.0.1:0","enr":"0xf88fb8406df78c1282722ffe5f759e7116db3a62ef5c3b47ea34e4cef4aa028184b113d7735724260b3e1bf01753094e4c48687c79e5c9e7c7f58b547bec67fbeb7c49c80183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1039de20b1b75da752d129b0fbd52eda941af9eceb5d14f591ba77175f5f153ab99","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"Dl4LsTg7LsVpsVeh0q5pAFkquJKig2f1YTpOKcsmUIg=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 0e5e0b\npopulation: 29 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 90a8 b7ca ba88 badd | 110 8025 (0) 82f9 (0) 82dd (0) 849b (0)\n001 3 4d10 58ed 5308 | 70 7b90 (0) 7a60 (0) 7920 (0) 7e04 (0)\n002 4 2a97 3f94 3373 35e6 | 32 24b8 (0) 256e (0) 20ae (0) 21a0 (0)\n003 5 1704 14df 11d4 18f6 | 22 13d6 (0) 103b (0) 11d4 (0) 1672 (0)\n004 4 0743 0451 03cc 0067 | 11 0661 (0) 07a8 (0) 0743 (0) 0438 (0)\n005 3 0af9 0a00 0b72 | 3 0af9 (0) 0a00 (0) 0b72 (0)\n006 3 0d8a 0cf5 0c64 | 5 0de3 (0) 0d8a (0) 0cf5 (0) 0c28 (0)\n============ DEPTH: 7 ==========================================\n007 2 0ff2 0fc5 | 2 0fc5 (0) 0ff2 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"0e5e0bb1383b2ec569b157a1d2ae6900592ab892a28367f5613a4e29cb265088","private_key":"46271e4b8bcd11ac7ea284e6e69d5fbfdab7754d5a04213ffd66697dfea46bcd","name":"node_0e5e0bb1383b2ec569b157a1d2ae6900592ab892a28367f5613a4e29cb265088","services":["streamer"],"enable_msg_events":true,"port":36611},"up":true}},{"node":{"info":{"id":"ef1b70bf090bc9994b1d45e2812c56ecb430a89c346a436bd10880bcda700351","name":"node_ef1b70bf090bc9994b1d45e2812c56ecb430a89c346a436bd10880bcda700351","enode":"enode://eac5fa35e65602ec70fd918c6e95a35d1a117b246fe5000ae4bafc6295f7671e4c06e415eb09e684abf780512fc18b2d866c3b71bb3b3c9d43fc4398da38f10e@127.0.0.1:0","enr":"0xf88fb8400fa87d3bd5c13cdf564484f96122c2ebb1bdcce71fdd18d75afe908594a3866c456fe3a118e4261abc0ecce7cbb42c18f1d8566d6c83c5ebd5d07919eb17d5a40183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102eac5fa35e65602ec70fd918c6e95a35d1a117b246fe5000ae4bafc6295f7671e","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"7xtwvwkLyZlLHUXigSxW7LQwqJw0akNr0QiAvNpwA1E=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: ef1b70\npopulation: 41 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 8 4d10 58ed 5308 3f94 | 146 7e04 (0) 7dbb (0) 7dc2 (0) 7dd3 (0)\n001 8 8f21 88a1 90a8 a369 | 47 8025 (0) 82dd (0) 82f9 (0) 849b (0)\n002 4 df1e d887 c9f5 c832 | 26 d299 (0) d3b0 (0) d1d7 (0) d7ac (0)\n003 9 f27f f2d5 f5b2 f629 | 19 f925 (0) fbf5 (0) fbc8 (0) ff36 (0)\n004 4 e775 e5d7 e54b e514 | 8 e027 (0) e7fa (0) e775 (0) e5ad (0)\n005 3 eb98 e8ef e854 | 4 e883 (0) e8ef (0) e854 (0) eb98 (0)\n006 2 ed2d ec52 | 2 ed2d (0) ec52 (0)\n007 1 ee5e | 1 ee5e (0)\n============ DEPTH: 8 ==========================================\n008 1 efea | 1 efea (0)\n009 0 | 0\n010 0 | 0\n011 1 ef07 | 1 ef07 (0)\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"ef1b70bf090bc9994b1d45e2812c56ecb430a89c346a436bd10880bcda700351","private_key":"108631b63afbc1b7d0f969a4d149576ac6bc3f55beffefa542345c2ff98ac10b","name":"node_ef1b70bf090bc9994b1d45e2812c56ecb430a89c346a436bd10880bcda700351","services":["streamer"],"enable_msg_events":true,"port":40971},"up":true}},{"node":{"info":{"id":"1e2aca93fa9442a0034ae8d295530dde16fcbfa8c37227e2e6863babb0f87c34","name":"node_1e2aca93fa9442a0034ae8d295530dde16fcbfa8c37227e2e6863babb0f87c34","enode":"enode://35cb12ad89b825a27459675abdf8b7d44cf40ebf61f8a6c848840c068f6cd8a7604420513fa6d34094211e2874d871f3664257b8bbde8d919848cf1ee30c9173@127.0.0.1:0","enr":"0xf88fb840eeddfc21dd882af77ed82462e015105a4fee9ec50091947b3ffb91eadd0bb4f061e244bedab8fcf2d9bd87b0d1c83cbaa50258bc33fac86e0dabb2d263e2f6c40183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10335cb12ad89b825a27459675abdf8b7d44cf40ebf61f8a6c848840c068f6cd8a7","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"HirKk/qUQqADSujSlVMN3hb8v6jDcifi5oY7q7D4fDQ=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 1e2aca\npopulation: 35 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 e514 ef1b | 110 849b (0) 8505 (0) 8025 (0) 82f9 (0)\n001 4 6f5f 51db 5308 4d10 | 70 7290 (0) 738c (0) 7125 (0) 77d2 (0)\n002 7 2c38 3373 3237 3630 | 32 24b8 (0) 256e (0) 20ae (0) 21a0 (0)\n003 7 0451 0067 0b72 0af9 | 22 0661 (0) 07a8 (0) 0743 (0) 0438 (0)\n004 8 11d4 103b 13d6 165f | 12 13d6 (0) 103b (0) 11d4 (0) 1672 (0)\n005 2 1a2a 18f6 | 4 1b83 (0) 1a2a (0) 19fa (0) 18f6 (0)\n006 3 1c8a 1c9c 1c47 | 3 1c47 (0) 1c8a (0) 1c9c (0)\n============ DEPTH: 7 ==========================================\n007 2 1f67 1f85 | 2 1f85 (0) 1f67 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"1e2aca93fa9442a0034ae8d295530dde16fcbfa8c37227e2e6863babb0f87c34","private_key":"ca298ecc80c2176e1dce1fbf5ccfa90cf337a507c12be6f986d2de3350d01f28","name":"node_1e2aca93fa9442a0034ae8d295530dde16fcbfa8c37227e2e6863babb0f87c34","services":["streamer"],"enable_msg_events":true,"port":34411},"up":true}},{"node":{"info":{"id":"e5149cedd990072f2aaa9735a9259f28973c45876660c2d86ac105e56cca8e68","name":"node_e5149cedd990072f2aaa9735a9259f28973c45876660c2d86ac105e56cca8e68","enode":"enode://fd27bc291857dfd075b45f5afda76cffc42c2fd3c6cbbd041160f4468daccd297f427de0a2d6d348a61fd628559798012d4a700d99f5d9c2ccefc12424e71a9e@127.0.0.1:0","enr":"0xf88fb8406833bd658c2dee1b0266e4979790bf604d3a078226e16c2bfcfbba4b009599331864bee8af31e7b121cd49e9caf0d21533f91bc0cdac69a7ff3660f0093e1a320183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102fd27bc291857dfd075b45f5afda76cffc42c2fd3c6cbbd041160f4468daccd29","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"5RSc7dmQBy8qqpc1qSWfKJc8RYdmYMLYasEF5WzKjmg=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: e5149c\npopulation: 34 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 7 5308 4d10 3f94 3373 | 146 775e (0) 77d2 (0) 7290 (0) 738c (0)\n001 7 8f21 88a1 90a8 ae2b | 47 849b (0) 8505 (0) 8025 (0) 82dd (0)\n002 4 df1e d887 c832 c9f5 | 26 d640 (0) d7ac (0) d1d7 (0) d299 (0)\n003 5 f5b2 f7ba f925 ff36 | 19 fbc8 (0) fbf5 (0) f925 (0) ff36 (0)\n004 4 eb98 ec52 ef07 ef1b | 10 e854 (0) e883 (0) e8ef (0) eb98 (0)\n005 1 e027 | 1 e027 (0)\n006 2 e7fa e775 | 2 e7fa (0) e775 (0)\n============ DEPTH: 7 ==========================================\n007 0 | 0\n008 2 e5ad e5d7 | 2 e5ad (0) e5d7 (0)\n009 2 e547 e54b | 2 e547 (0) e54b (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"e5149cedd990072f2aaa9735a9259f28973c45876660c2d86ac105e56cca8e68","private_key":"4f4ad194adef3b2bc3e2726a7b609ae7bda912d4e2086f1a13e4c4ba668c60ac","name":"node_e5149cedd990072f2aaa9735a9259f28973c45876660c2d86ac105e56cca8e68","services":["streamer"],"enable_msg_events":true,"port":42997},"up":true}},{"node":{"info":{"id":"35e6b1d31f594c06b759525434a7e717ebe6f27ca0188f247ed1247664a50563","name":"node_35e6b1d31f594c06b759525434a7e717ebe6f27ca0188f247ed1247664a50563","enode":"enode://6c8c3cbf0d25b5021ca9930a6ec6a174a1408d306e91b340285357ce11ef1be7595292e2c9d678ecaad46e85c67e2548b6f8d001240ab47711a7bf12d84ccf82@127.0.0.1:0","enr":"0xf88fb84040cae853fa9515e6bbe0adcbf29a86d0a760543dcbc0e6d834dbbf0fa17b67074b1ac65a884606be1e2fd6bce5dee242940fccc40d35cb5189481b6a539a036f0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1026c8c3cbf0d25b5021ca9930a6ec6a174a1408d306e91b340285357ce11ef1be7","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"Neax0x9ZTAa3WVJUNKfnF+vm8nygGI8kftEkdmSlBWM=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 35e6b1\npopulation: 29 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 7 8f21 90a8 ae2b ba88 | 110 849b (0) 8505 (0) 8025 (0) 82dd (0)\n001 2 58ed 4d10 | 70 7920 (0) 7a60 (0) 7b90 (0) 7e04 (0)\n002 2 0e5e 1e2a | 44 07a8 (0) 0743 (0) 0661 (0) 0438 (0)\n003 7 2101 2d36 2c79 2c38 | 15 256e (0) 24b8 (0) 20ae (0) 21a0 (0)\n004 3 39d1 3b78 3f94 | 7 3b88 (0) 3b78 (0) 39d1 (0) 3ec5 (0)\n005 5 314a 3089 3373 33b5 | 6 314a (0) 30be (0) 3089 (0) 3237 (0)\n============ DEPTH: 6 ==========================================\n006 3 3630 378e 3780 | 3 378e (0) 3780 (0) 3630 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"35e6b1d31f594c06b759525434a7e717ebe6f27ca0188f247ed1247664a50563","private_key":"2a62a26311a24b08194c69ebc1ed52e217472f0342db63d881497f987b889e06","name":"node_35e6b1d31f594c06b759525434a7e717ebe6f27ca0188f247ed1247664a50563","services":["streamer"],"enable_msg_events":true,"port":46321},"up":true}},{"node":{"info":{"id":"3f946957d910179c7e1a83c44369aacfc31f5727b1a6421a01c8a978ccd349a2","name":"node_3f946957d910179c7e1a83c44369aacfc31f5727b1a6421a01c8a978ccd349a2","enode":"enode://218760aa13e26a18b74d2337eef240198ccd4014e8a65b603ed92ccdb48ccd8b943f256eb6e58c6fbdce24b409b2775b2d6004401320c919188e7fcb09244fd1@127.0.0.1:0","enr":"0xf88fb840177a2dfc1f89c96d70eddc71b4f1b0bac49f90fee6d0eac21cbb5d5d2405a3a942e28c9535399cbe5914256c761ecb4a5f3f6563090d48314533f0c5234aa2dd0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103218760aa13e26a18b74d2337eef240198ccd4014e8a65b603ed92ccdb48ccd8b","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"P5RpV9kQF5x+GoPEQ2mqz8MfVyexpkIaAcipeMzTSaI=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 3f9469\npopulation: 34 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 e514 ef1b 90a8 a369 | 110 ac4d (0) ad98 (0) af02 (0) aeb4 (0)\n001 5 5308 51db 58ed 461c | 70 738c (0) 7290 (0) 7125 (0) 77d2 (0)\n002 3 0e5e 0b72 1e2a | 44 0661 (0) 07a8 (0) 0743 (0) 0438 (0)\n003 7 20ae 2101 2a0a 2a97 | 15 24b8 (0) 256e (0) 20ae (0) 21a0 (0)\n004 7 3089 3237 33b5 3373 | 10 314a (0) 30be (0) 3089 (0) 3237 (0)\n005 3 3b88 3b78 39d1 | 3 3b88 (0) 3b78 (0) 39d1 (0)\n============ DEPTH: 6 ==========================================\n006 0 | 0\n007 3 3ec5 3efc 3e8e | 3 3ec5 (0) 3efc (0) 3e8e (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"3f946957d910179c7e1a83c44369aacfc31f5727b1a6421a01c8a978ccd349a2","private_key":"de36f03ed3bf0ec0a7710fc3c4999f66c685bbfddcfb8e9d4317b92303a74e11","name":"node_3f946957d910179c7e1a83c44369aacfc31f5727b1a6421a01c8a978ccd349a2","services":["streamer"],"enable_msg_events":true,"port":33705},"up":true}},{"node":{"info":{"id":"4d103ec5afee559a5a9242e8d650b67301eaec10e96fc2f184e34d48554108a2","name":"node_4d103ec5afee559a5a9242e8d650b67301eaec10e96fc2f184e34d48554108a2","enode":"enode://9fecc8c4179e541e1fdf6df9acbe9fae124b26643c32c708bf43248ffa03ddc74085be1fbc7c6b26380bd54278b407e48f5ec005564f3715ddefef423e750ba0@127.0.0.1:0","enr":"0xf88fb84029f04153f5367d5275a8df9d644838126a5b32d2c4a8f463c54a8609f02f5ad3544851613d9bb9b0bd12cf4b0dfc60c0172093608372dfa04498cc981d46ed330183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1029fecc8c4179e541e1fdf6df9acbe9fae124b26643c32c708bf43248ffa03ddc7","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"TRA+xa/uVZpakkLo1lC2cwHq7BDpb8LxhONNSFVBCKI=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 4d103e\npopulation: 29 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 90a8 ef1b e514 | 110 d7ac (0) d640 (0) d1d7 (0) d299 (0)\n001 9 1e2a 0e5e 0b72 3630 | 76 13d6 (0) 103b (0) 11d4 (0) 1672 (0)\n002 3 6f5f 6ecb 6103 | 32 7125 (0) 7290 (0) 738c (0) 77d2 (0)\n003 5 5308 51db 5efb 5db0 | 15 5cd2 (0) 5db0 (0) 5f00 (0) 5efb (0)\n004 3 461c 4646 4109 | 12 4558 (0) 4559 (0) 44a1 (0) 4447 (0)\n005 2 49ea 4990 | 6 4a8b (0) 4ac7 (0) 4bcf (0) 49cd (0)\n006 1 4e5a | 1 4e5a (0)\n007 1 4c9e | 1 4c9e (0)\n============ DEPTH: 8 ==========================================\n008 0 | 0\n009 2 4d6b 4d59 | 2 4d6b (0) 4d59 (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"4d103ec5afee559a5a9242e8d650b67301eaec10e96fc2f184e34d48554108a2","private_key":"ad04bf4b2168140a7de043f21b791b383b022dac606699911e318f75f7e012a6","name":"node_4d103ec5afee559a5a9242e8d650b67301eaec10e96fc2f184e34d48554108a2","services":["streamer"],"enable_msg_events":true,"port":33673},"up":true}},{"node":{"info":{"id":"33737df75bbac1b41c63f05ea2cf1523b972df17f22bda026db84a49ac35e1e3","name":"node_33737df75bbac1b41c63f05ea2cf1523b972df17f22bda026db84a49ac35e1e3","enode":"enode://50cec87bfc82507362c651f325c755f33d697e3e496e3eb72eb1c8f641ced88174ccc2b56cb7eba56579b61aceb18409c188d359f42f940805f5719740feb48e@127.0.0.1:0","enr":"0xf88fb840fd82bf7592c1d6a7814691efa8bd411452d956b60e269042831484ddceacc538104f0cb3828b7c706e383762f656ed7ec9fd288aa59b3c8d81f301a7a7f324f10183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10250cec87bfc82507362c651f325c755f33d697e3e496e3eb72eb1c8f641ced881","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"M3N991u6wbQcY/Beos8VI7ly3xfyK9oCbbhKSaw14eM=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 33737d\npopulation: 30 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 ef1b e514 ae2b a369 | 110 d640 (0) d7ac (0) d1d7 (0) d299 (0)\n001 3 461c 4109 4d10 | 70 7b90 (0) 7a60 (0) 7920 (0) 7e04 (0)\n002 4 1e2a 0e5e 0a00 0b72 | 44 13d6 (0) 103b (0) 11d4 (0) 17db (0)\n003 5 20ae 2c38 2c79 2995 | 15 24b8 (0) 256e (0) 20ae (0) 21a0 (0)\n004 4 3b78 39d1 3e8e 3f94 | 7 3b88 (0) 3b78 (0) 39d1 (0) 3ec5 (0)\n005 4 35e6 378e 3780 3630 | 4 378e (0) 3780 (0) 3630 (0) 35e6 (0)\n006 2 314a 3089 | 3 314a (0) 30be (0) 3089 (0)\n============ DEPTH: 7 ==========================================\n007 1 3237 | 1 3237 (0)\n008 1 33b5 | 1 33b5 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"33737df75bbac1b41c63f05ea2cf1523b972df17f22bda026db84a49ac35e1e3","private_key":"9f972993b709e1ac19e7f49e4661fb3fb6e83534f66a12560073a6b5f59e7a0c","name":"node_33737df75bbac1b41c63f05ea2cf1523b972df17f22bda026db84a49ac35e1e3","services":["streamer"],"enable_msg_events":true,"port":45909},"up":true}},{"node":{"info":{"id":"0b72054403f78a64a787f46e9f26bf0de7bbba5a60cb105e6aeea46cb4a1d9fe","name":"node_0b72054403f78a64a787f46e9f26bf0de7bbba5a60cb105e6aeea46cb4a1d9fe","enode":"enode://54b6d4a2a040be9a1af28fe91fcc2b187d4d6db27d970a10e744a69da4ac97260a7c57234a2c4e8ca82d46c4c72fd473d0023c622618c46fa794574590533fc8@127.0.0.1:0","enr":"0xf88fb840557305af7ee9557cc3f0d4e0ddc142adc3005a0b56e35a383a8f246c5b42adb234b65621b68d96643290b25ed4e6fc5777c5fa7a380d5f7806b6778a185a98340183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10254b6d4a2a040be9a1af28fe91fcc2b187d4d6db27d970a10e744a69da4ac9726","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"C3IFRAP3imSnh/Runya/Dee7ulpgyxBeau6kbLSh2f4=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 0b7205\npopulation: 31 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 fe31 e514 a369 ae2b | 110 d7ac (0) d640 (0) d1d7 (0) d299 (0)\n001 3 58ed 4109 4d10 | 70 77d2 (0) 775e (0) 7290 (0) 738c (0)\n002 5 39d1 3f94 3630 3237 | 32 24b8 (0) 256e (0) 20ae (0) 21a0 (0)\n003 6 1e2a 18f6 13d6 11d4 | 22 103b (0) 11d4 (0) 13d6 (0) 17db (0)\n004 4 0438 0451 00c6 0067 | 11 0743 (0) 07a8 (0) 0661 (0) 0438 (0)\n005 6 0d8a 0de3 0cf5 0ff2 | 8 0d8a (0) 0de3 (0) 0cf5 (0) 0c64 (0)\n============ DEPTH: 6 ==========================================\n006 0 | 0\n007 2 0af9 0a00 | 2 0a00 (0) 0af9 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"0b72054403f78a64a787f46e9f26bf0de7bbba5a60cb105e6aeea46cb4a1d9fe","private_key":"2f67175c7773d3b089b81b72210bd644855f6736a44e7e931e02c64a35326338","name":"node_0b72054403f78a64a787f46e9f26bf0de7bbba5a60cb105e6aeea46cb4a1d9fe","services":["streamer"],"enable_msg_events":true,"port":38921},"up":true}},{"node":{"info":{"id":"90a85cb7363ede161ec21cc89f8b9d4350e566cf10586a66d31b0a8677620aa1","name":"node_90a85cb7363ede161ec21cc89f8b9d4350e566cf10586a66d31b0a8677620aa1","enode":"enode://a2ad93ada8513b3feec771d73b08d372a7b89a5c6454e82f911e9fcd3b0f23929a604336b8501f89709f9eec253ed726d85e6c8ab08fc2473ba7fc9e96850147@127.0.0.1:0","enr":"0xf88fb840254e8f00ffa322391cdce60e7cd38fdbd46e5ee8cafdd7062a8985c381f69bce78fbb9bd468d7bd2d237a777c29badc74945574f72987aa21368ce6417bd55280183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103a2ad93ada8513b3feec771d73b08d372a7b89a5c6454e82f911e9fcd3b0f2392","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"kKhctzY+3hYewhzIn4udQ1DlZs8QWGpm0xsKhndiCqE=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 90a85c\npopulation: 42 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 12 4109 4990 4d10 39d1 | 146 6831 (0) 6967 (0) 6c4d (0) 6c73 (0)\n001 5 d887 f5b2 f925 ef1b | 63 f31c (0) f2d5 (0) f27f (0) f629 (0)\n002 11 b02b b7ca bcc6 b911 | 27 b2b5 (0) b2a5 (0) b02b (0) b502 (0)\n003 5 8505 898d 886a 88a1 | 10 8025 (0) 82f9 (0) 82dd (0) 849b (0)\n004 4 9fa0 9d0f 9852 9890 | 4 9fa0 (0) 9d0f (0) 9890 (0) 9852 (0)\n005 3 96fc 976e 959f | 3 96fc (0) 976e (0) 959f (0)\n============ DEPTH: 6 ==========================================\n006 0 | 0\n007 1 915d | 1 915d (0)\n008 1 9076 | 1 9076 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"90a85cb7363ede161ec21cc89f8b9d4350e566cf10586a66d31b0a8677620aa1","private_key":"ffbd3e52d4e07351ecaee805eb3df2eb83b6551d4ccecf49abe430b00d7b91ef","name":"node_90a85cb7363ede161ec21cc89f8b9d4350e566cf10586a66d31b0a8677620aa1","services":["streamer"],"enable_msg_events":true,"port":39339},"up":true}},{"node":{"info":{"id":"32371744163f0b3aefd3955dc4877e7eb82b17ef9541c333ca9c0a9f8aec3045","name":"node_32371744163f0b3aefd3955dc4877e7eb82b17ef9541c333ca9c0a9f8aec3045","enode":"enode://e26885995135217d285cbb3b0e44b2071d1247163affddea0fcd9f8b15a18fa900829a0118a2b2d366315f76b3811f4eb2be6a1edeaee8822be120da9629c074@127.0.0.1:0","enr":"0xf88fb8402421fb3a7727b2a4dbe62787a620aae3cda4704b08fd927939ffcf06d34d03a2386a8a340e265804a54d9c97eafe0cd662091e66bc27ad1a15fb88004c154a800183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102e26885995135217d285cbb3b0e44b2071d1247163affddea0fcd9f8b15a18fa9","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"MjcXRBY/Czrv05VdxId+frgrF++VQcMzypwKn4rsMEU=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 323717\npopulation: 28 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 a369 88a1 90a8 | 110 fbc8 (0) fbf5 (0) f925 (0) ff36 (0)\n001 3 4d10 461c 4109 | 70 7b90 (0) 7a60 (0) 7920 (0) 7e04 (0)\n002 6 0b72 0af9 0a00 14df | 44 13d6 (0) 103b (0) 11d4 (0) 17db (0)\n003 6 20ae 2a97 2995 2d36 | 15 24b8 (0) 256e (0) 20ae (0) 21a0 (0)\n004 3 3f94 3b78 39d1 | 7 3ec5 (0) 3efc (0) 3e8e (0) 3f94 (0)\n005 2 35e6 3630 | 4 35e6 (0) 378e (0) 3780 (0) 3630 (0)\n006 3 314a 30be 3089 | 3 314a (0) 30be (0) 3089 (0)\n============ DEPTH: 7 ==========================================\n007 2 33b5 3373 | 2 33b5 (0) 3373 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"32371744163f0b3aefd3955dc4877e7eb82b17ef9541c333ca9c0a9f8aec3045","private_key":"109c5f2cf1f93926c20d740de91bde530a1068766dcdbd6f5a6c9eb561fad11e","name":"node_32371744163f0b3aefd3955dc4877e7eb82b17ef9541c333ca9c0a9f8aec3045","services":["streamer"],"enable_msg_events":true,"port":40865},"up":true}},{"node":{"info":{"id":"3630e05326bacea8fcc739dec42085f845f416ddc698c76ff91f099eb1dc5007","name":"node_3630e05326bacea8fcc739dec42085f845f416ddc698c76ff91f099eb1dc5007","enode":"enode://902e0d821e6d4faadd41284e24f3566060b4d34a47a6a0b333365eef089321dbf8bf9a37c56df31c9f8d4d8489a329022bff87a8cb8bd8017a3b18f328fd984e@127.0.0.1:0","enr":"0xf88fb8401181684970ecc7675258fe5a3c5d354b1a7cab6dd97d2507ab00388013e7c8a76456556bdd0950ab1348bc7afa60ba1c68dae5634f81e10f5b475f7e83ba68c50183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102902e0d821e6d4faadd41284e24f3566060b4d34a47a6a0b333365eef089321db","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"NjDgUya6zqj8xznexCCF+EX0Ft3GmMdv+R8JnrHcUAc=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 3630e0\npopulation: 29 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 ae2b 90a8 88a1 | 110 f31c (0) f2d5 (0) f27f (0) f629 (0)\n001 4 5308 5efb 4d10 4109 | 70 6831 (0) 6967 (0) 6c4d (0) 6c73 (0)\n002 6 0af9 0a00 0b72 1e2a | 44 0743 (0) 07a8 (0) 0661 (0) 0438 (0)\n003 4 217f 2c79 2c38 2a97 | 15 256e (0) 24b8 (0) 21a0 (0) 217f (0)\n004 3 3f94 3b78 39d1 | 7 3efc (0) 3ec5 (0) 3e8e (0) 3f94 (0)\n005 6 30be 3089 314a 33b5 | 6 30be (0) 3089 (0) 314a (0) 33b5 (0)\n006 1 35e6 | 1 35e6 (0)\n============ DEPTH: 7 ==========================================\n007 2 378e 3780 | 2 378e (0) 3780 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"3630e05326bacea8fcc739dec42085f845f416ddc698c76ff91f099eb1dc5007","private_key":"4f229a82b34c1d7a77db8b8205e0b0b31f129792a80377a9f140d310e6b27d84","name":"node_3630e05326bacea8fcc739dec42085f845f416ddc698c76ff91f099eb1dc5007","services":["streamer"],"enable_msg_events":true,"port":43205},"up":true}},{"node":{"info":{"id":"88a141c607019477c7b120a506285a7218cad2faa038082e0b9ddfcc9cb78d07","name":"node_88a141c607019477c7b120a506285a7218cad2faa038082e0b9ddfcc9cb78d07","enode":"enode://748dfc4bce4346bdaee02bcdfc7b514fc6f9f0b74a7a2004e7beed2f9d7aa6eb82f41ede70c832e42af0767aaca3b7057427d140425ca9c052769d13382a475e@127.0.0.1:0","enr":"0xf88fb840e79a123d27b2f56ef3ee3b91fba3d7b33bade6191df9567cb607d85c896d09d51ee353973b9b6f21075dbea43685d639fa90e16d920e31bc814d94e1e55fe06d0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102748dfc4bce4346bdaee02bcdfc7b514fc6f9f0b74a7a2004e7beed2f9d7aa6eb","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"iKFBxgcBlHfHsSClBihachjK0vqgOAguC53fzJy3jQc=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 88a141\npopulation: 31 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 7 4990 4109 14df 3b78 | 146 77d2 (0) 775e (0) 7290 (0) 738c (0)\n001 5 f925 f5b2 e514 ef1b | 63 eb98 (0) e854 (0) e8ef (0) e883 (0)\n002 9 b7ca b02b bcc6 b911 | 27 b5b2 (0) b502 (0) b626 (0) b65e (0)\n003 3 9852 9076 90a8 | 10 9d0f (0) 9fa0 (0) 9890 (0) 9852 (0)\n004 3 849b 8505 82dd | 5 8025 (0) 82f9 (0) 82dd (0) 849b (0)\n005 1 8f21 | 1 8f21 (0)\n============ DEPTH: 6 ==========================================\n006 0 | 0\n007 1 898d | 1 898d (0)\n008 1 886a | 1 886a (0)\n009 1 88fe | 1 88fe (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"88a141c607019477c7b120a506285a7218cad2faa038082e0b9ddfcc9cb78d07","private_key":"7c46b2b4c2eb41cbdc91b22dd94083a9d5a9ebcefddb2dca52e0356c8ab2d0f2","name":"node_88a141c607019477c7b120a506285a7218cad2faa038082e0b9ddfcc9cb78d07","services":["streamer"],"enable_msg_events":true,"port":33659},"up":true}},{"node":{"info":{"id":"a3693801a91180410cf3e85d7c09ac8054a769e7b1d55c9e7a46850cb8217da0","name":"node_a3693801a91180410cf3e85d7c09ac8054a769e7b1d55c9e7a46850cb8217da0","enode":"enode://fc254f0aa0e39064101549ffcc69b2251433b96a80b540da96bfcde9c4e3f979f38f7351eb100fb11660b20a5da1e8c221073a719d331eaae06053de933916b8@127.0.0.1:0","enr":"0xf88fb840b3a10df042ede6a04af90f6ea1f32e3cc6144419c04ed87f500e8da294aec02e0a48ec2a277af3cf3663ad966204d93a0e74d0c581f38b72819a5f3bb3439db20183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102fc254f0aa0e39064101549ffcc69b2251433b96a80b540da96bfcde9c4e3f979","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"o2k4AakRgEEM8+hdfAmsgFSnaeex1VyeekaFDLghfaA=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: a36938\npopulation: 32 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 9 0b72 14df 11d4 3373 | 146 0661 (0) 07a8 (0) 0743 (0) 0438 (0)\n001 5 d887 f5b2 f925 ef1b | 63 eb98 (0) e883 (0) e8ef (0) e854 (0)\n002 4 90a8 8505 8f21 88a1 | 20 9fa0 (0) 9d0f (0) 9890 (0) 9852 (0)\n003 5 b7ca b897 badd ba88 | 17 b502 (0) b5b2 (0) b626 (0) b65e (0)\n004 5 ac4d ad98 af02 aeb4 | 5 ac4d (0) ad98 (0) af02 (0) aeb4 (0)\n============ DEPTH: 5 ==========================================\n005 3 a46d a6fb a653 | 3 a6fb (0) a653 (0) a46d (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 1 a34e | 1 a34e (0)\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"a3693801a91180410cf3e85d7c09ac8054a769e7b1d55c9e7a46850cb8217da0","private_key":"9086c71a5873a4830e93448202ba724d3b0a168a8ef3a9fc05037416ae0e9ac9","name":"node_a3693801a91180410cf3e85d7c09ac8054a769e7b1d55c9e7a46850cb8217da0","services":["streamer"],"enable_msg_events":true,"port":41127},"up":true}},{"node":{"info":{"id":"41092c852fac630df2a9ca0862716f8e9fb8566c904a49c96389071046bc699d","name":"node_41092c852fac630df2a9ca0862716f8e9fb8566c904a49c96389071046bc699d","enode":"enode://48e3c3f7c9a9799de669a30ca9e8a74ed910aafd4ec3152cfe8688c9ce67997a955265bf9d18f30d988b81bcadb058fdfcd5822e37085fafd1cf3e3f0994a91c@127.0.0.1:0","enr":"0xf88fb840217cf3239a54cb3b089cbdc4bfa0fc3bd9e7921e1d28b05f7310e8c3a6f02b7c041bc83c1b95c201a33cbeedb581a51ce4fbdf683bc86ac1d6aaaa1127b7b8cd0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10248e3c3f7c9a9799de669a30ca9e8a74ed910aafd4ec3152cfe8688c9ce67997a","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"QQkshS+sYw3yqcoIYnFvjp+4VmyQSknJY4kHEEa8aZ0=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 41092c\npopulation: 45 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 d887 90a8 8f21 88a1 | 110 e854 (0) e8ef (0) e883 (0) eb98 (0)\n001 9 0af9 0b72 11d4 14df | 76 07a8 (0) 0743 (0) 0661 (0) 0438 (0)\n002 7 6f5f 6e68 66e7 6103 | 32 67aa (0) 67dc (0) 66e7 (0) 6337 (0)\n003 6 5cd2 5823 58ed 51db | 15 574f (0) 524d (0) 53a8 (0) 53fe (0)\n004 6 4bcf 49ea 4990 4e5a | 11 4a8b (0) 4ac7 (0) 4bcf (0) 49cd (0)\n============ DEPTH: 5 ==========================================\n005 10 4559 4558 4447 44a1 | 10 4558 (0) 4559 (0) 4447 (0) 44a1 (0)\n006 0 | 0\n007 0 | 0\n008 1 41d9 | 1 41d9 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"41092c852fac630df2a9ca0862716f8e9fb8566c904a49c96389071046bc699d","private_key":"6ddd3b1c12e06aba0ea262fc99bafec26b2f94fb5f347ab60518afc39741fdc9","name":"node_41092c852fac630df2a9ca0862716f8e9fb8566c904a49c96389071046bc699d","services":["streamer"],"enable_msg_events":true,"port":39355},"up":true}},{"node":{"info":{"id":"ae2b3876bdbd6388781b65e31de182564c5d81f4511caf96588b1a287760b3dd","name":"node_ae2b3876bdbd6388781b65e31de182564c5d81f4511caf96588b1a287760b3dd","enode":"enode://63c769772cdc9c83c9254df508ecd82cf62909028da5d232e02375859a0c0e16ab09257681fccde8b6f99302465f29d7119a5a679e9eb722dd84aeeafad3290e@127.0.0.1:0","enr":"0xf88fb840ffd15988f81a75ca61b73d7267d740abba2f0fc56d28354888cf7f21cc6d5c006b2b1189d3572d77a3d8fb9067ff3678f24b6eff94085bb0fa0693f5ea885f8a0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10263c769772cdc9c83c9254df508ecd82cf62909028da5d232e02375859a0c0e16","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"ris4dr29Y4h4G2XjHeGCVkxdgfRRHK+WWIsaKHdgs90=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: ae2b38\npopulation: 31 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 8 0b72 14df 3373 35e6 | 146 0438 (0) 045b (0) 0451 (0) 07a8 (0)\n001 5 f925 f5b2 ef1b e514 | 63 eb98 (0) e854 (0) e8ef (0) e883 (0)\n002 4 9076 90a8 8f21 88a1 | 20 9d0f (0) 9fa0 (0) 9890 (0) 9852 (0)\n003 6 b7ca b02b bcc6 badd | 17 b5b2 (0) b502 (0) b626 (0) b65e (0)\n004 4 a653 a46d a34e a369 | 5 a653 (0) a6fb (0) a46d (0) a34e (0)\n============ DEPTH: 5 ==========================================\n005 0 | 0\n006 2 ac4d ad98 | 2 ac4d (0) ad98 (0)\n007 1 af02 | 1 af02 (0)\n008 1 aeb4 | 1 aeb4 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"ae2b3876bdbd6388781b65e31de182564c5d81f4511caf96588b1a287760b3dd","private_key":"9812258a3e70549d501e1fb2b90b4728c6dcfc8ccbbb9892c370214b60d40535","name":"node_ae2b3876bdbd6388781b65e31de182564c5d81f4511caf96588b1a287760b3dd","services":["streamer"],"enable_msg_events":true,"port":36649},"up":true}},{"node":{"info":{"id":"39d1fcae2d23c775214988251505c577b9ac7b6851558ddf9a437dfe143f3845","name":"node_39d1fcae2d23c775214988251505c577b9ac7b6851558ddf9a437dfe143f3845","enode":"enode://64dd3388d784dcfff0bac93ac16b10d6a237024d609e79fd786f239d70d11292965e419f1feda3335a52b909229e85aeaa913d608cae51f7e22ea404a014b802@127.0.0.1:0","enr":"0xf88fb8403d980a1425e3cf5c0382d08284c76c76c84e06a2cc0019ff0fc7dbeb15976c6172bfe4f485c7d23c69f0e8139964ba0c7e55a3e460b1b9a18b3da2df51b4ae950183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10264dd3388d784dcfff0bac93ac16b10d6a237024d609e79fd786f239d70d11292","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"OdH8ri0jx3UhSYglFQXFd7mse2hRVY3fmkN9/hQ/OEU=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 39d1fc\npopulation: 43 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 7 f5b2 d887 90a8 88a1 | 110 e854 (0) e8ef (0) e883 (0) eb98 (0)\n001 12 7125 7dd3 605a 6e68 | 70 77d2 (0) 775e (0) 7290 (0) 738c (0)\n002 8 00c6 0b72 0af9 0a00 | 44 0438 (0) 045b (0) 0451 (0) 07a8 (0)\n003 5 2a97 2d36 2c38 2c79 | 15 256e (0) 24b8 (0) 20ae (0) 21a0 (0)\n004 7 314a 3089 33b5 3373 | 10 314a (0) 30be (0) 3089 (0) 33b5 (0)\n005 2 3e8e 3f94 | 4 3ec5 (0) 3efc (0) 3e8e (0) 3f94 (0)\n============ DEPTH: 6 ==========================================\n006 2 3b88 3b78 | 2 3b88 (0) 3b78 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"39d1fcae2d23c775214988251505c577b9ac7b6851558ddf9a437dfe143f3845","private_key":"3cba669ea7a686fe849ec5128b993a7fec64971638bff4ec54c386bff7214559","name":"node_39d1fcae2d23c775214988251505c577b9ac7b6851558ddf9a437dfe143f3845","services":["streamer"],"enable_msg_events":true,"port":42159},"up":true}},{"node":{"info":{"id":"8f2182c2c2d0eeb2e887dbc350ae7257819f536032851ffdf29e7842cb1a62cc","name":"node_8f2182c2c2d0eeb2e887dbc350ae7257819f536032851ffdf29e7842cb1a62cc","enode":"enode://c61eb191e326e233f19223d31784f89dd3cb5712942a686877717d74afd735e118acf5e05da708b122eed47a681888a14c93072ccb1b425c3c58ffc60b1b6f7c@127.0.0.1:0","enr":"0xf88fb8401d4e08ac54c6ca41a0cbd145e8a06eada8b2a58062c2c9552957749da5bbd29c371325ed9de3b9214139dda907e2c2be86e1710583b02f6fe8550c6fa50e022c0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102c61eb191e326e233f19223d31784f89dd3cb5712942a686877717d74afd735e1","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"jyGCwsLQ7rLoh9vDUK5yV4GfU2AyhR/98p54QssaYsw=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 8f2182\npopulation: 37 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 4646 4109 11d4 35e6 | 146 67aa (0) 67dc (0) 66e7 (0) 6251 (0)\n001 10 d887 ef1b ef07 e514 | 63 e854 (0) e8ef (0) e883 (0) eb98 (0)\n002 10 b02b b7ca bcc6 b911 | 27 b502 (0) b5b2 (0) b626 (0) b65e (0)\n003 4 9d0f 9852 9076 90a8 | 10 9fa0 (0) 9d0f (0) 9890 (0) 9852 (0)\n004 4 82dd 82f9 849b 8505 | 5 8025 (0) 82f9 (0) 82dd (0) 849b (0)\n============ DEPTH: 5 ==========================================\n005 4 898d 886a 88fe 88a1 | 4 898d (0) 886a (0) 88fe (0) 88a1 (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"8f2182c2c2d0eeb2e887dbc350ae7257819f536032851ffdf29e7842cb1a62cc","private_key":"7da220e22f5a60bbb45c6c72883ee7c9680618b47c02741e3ffa840db42e0d8e","name":"node_8f2182c2c2d0eeb2e887dbc350ae7257819f536032851ffdf29e7842cb1a62cc","services":["streamer"],"enable_msg_events":true,"port":33809},"up":true}},{"node":{"info":{"id":"11d43f6ed0ddd5afa5c8a7abf7c62a4fa865b7a25ee295bf1a49701ef3081363","name":"node_11d43f6ed0ddd5afa5c8a7abf7c62a4fa865b7a25ee295bf1a49701ef3081363","enode":"enode://5a7570e6530a10db24b16f65a03b866013f409038c203dbdd432072f7d5048d389a66e7235576389e8633012bd367d983c5325a693ebc5bfe2b18a86e22ae598@127.0.0.1:0","enr":"0xf88fb840227240ac5b5e7e60e5754fbd36dadae2db7ba6a39745b0b02fc5303803afa203490c7fba99331c4338d767e68ce601f95e92d0cc9d4136708fca9cc5d9766a110183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1025a7570e6530a10db24b16f65a03b866013f409038c203dbdd432072f7d5048d3","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"EdQ/btDd1a+lyKer98YqT6hlt6Je4pW/GklwHvMIE2M=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 11d43f\npopulation: 35 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 d887 bb90 a369 8f21 | 110 eb98 (0) e8ef (0) e883 (0) e854 (0)\n001 5 7dd3 4990 49ea 4109 | 70 7a60 (0) 7b90 (0) 7920 (0) 7e04 (0)\n002 4 3237 3630 39d1 3b78 | 32 256e (0) 24b8 (0) 20ae (0) 217f (0)\n003 6 00c6 0067 0e5e 0b72 | 22 0743 (0) 07a8 (0) 0661 (0) 0438 (0)\n004 5 18f6 19fa 1e2a 1f67 | 10 1b83 (0) 1a2a (0) 19fa (0) 18f6 (0)\n005 9 1704 17db 179f 1672 | 9 1704 (0) 17db (0) 179f (0) 1672 (0)\n============ DEPTH: 6 ==========================================\n006 1 13d6 | 1 13d6 (0)\n007 1 103b | 1 103b (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"11d43f6ed0ddd5afa5c8a7abf7c62a4fa865b7a25ee295bf1a49701ef3081363","private_key":"219dac0c9e412e884796b76e8f34df3ab01ed79aec554cede6881de4d40236f8","name":"node_11d43f6ed0ddd5afa5c8a7abf7c62a4fa865b7a25ee295bf1a49701ef3081363","services":["streamer"],"enable_msg_events":true,"port":40541},"up":true}},{"node":{"info":{"id":"3b78bc987c7c31c94e8ada9b4b11b5db9387fe70dd01ce7f3e976d3bec433dec","name":"node_3b78bc987c7c31c94e8ada9b4b11b5db9387fe70dd01ce7f3e976d3bec433dec","enode":"enode://24fd229270ea0d538333b0a4aafd5aff71f1783569175335b1d90f0edffade66ba7c66972ba0e5e1862b468c0cb4245f1852e5778d8eefc014daa1f55136a7af@127.0.0.1:0","enr":"0xf88fb840c92aeac9460bef8b28eecae10683b0871da8063062965e99ecc8a759dfdc230820f2a00376fb89d159b3f24bd098f7f2689ad9750ad6e7b960138598b3afc0b10183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10324fd229270ea0d538333b0a4aafd5aff71f1783569175335b1d90f0edffade66","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"O3i8mHx8MclOitqbSxG125OH/nDdAc5/PpdtO+xDPew=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 3b78bc\npopulation: 32 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 88a1 bb90 a369 ae2b | 110 9890 (0) 9852 (0) 9fa0 (0) 9d0f (0)\n001 4 5efb 4990 4646 4109 | 70 77d2 (0) 775e (0) 7290 (0) 738c (0)\n002 6 00c6 0af9 0a00 14df | 44 07a8 (0) 0743 (0) 0661 (0) 0438 (0)\n003 5 2101 2995 2f32 2d36 | 15 256e (0) 24b8 (0) 20ae (0) 21a0 (0)\n004 6 3630 35e6 314a 3237 | 10 314a (0) 30be (0) 3089 (0) 33b5 (0)\n005 4 3e8e 3ec5 3efc 3f94 | 4 3ec5 (0) 3efc (0) 3e8e (0) 3f94 (0)\n============ DEPTH: 6 ==========================================\n006 1 39d1 | 1 39d1 (0)\n007 0 | 0\n008 1 3b88 | 1 3b88 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"3b78bc987c7c31c94e8ada9b4b11b5db9387fe70dd01ce7f3e976d3bec433dec","private_key":"005d083eb3a257750c097d09e17a10c58264917fa06535586128643b104277c2","name":"node_3b78bc987c7c31c94e8ada9b4b11b5db9387fe70dd01ce7f3e976d3bec433dec","services":["streamer"],"enable_msg_events":true,"port":36675},"up":true}},{"node":{"info":{"id":"14dfb8414d17b2df15eaf59571a8cfec99b1fd674561da63ee99af853bda07da","name":"node_14dfb8414d17b2df15eaf59571a8cfec99b1fd674561da63ee99af853bda07da","enode":"enode://2a6142cda1601b228a9c6960fa90278c011610caf1c0109047931f409d5c69beb1383db75c7edd51dcae1b4a0a74af47ddbfb3cb14d4b9adac497d92c870ee2c@127.0.0.1:0","enr":"0xf88fb840a90ca3b818792d943f2120428d70855db44a6aa36d9a209e3ef9aadc13b3a3380939a0ea38235e3a786c5fa856c56bee157f75c45bc64251e000f5110bccf84c0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1022a6142cda1601b228a9c6960fa90278c011610caf1c0109047931f409d5c69be","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"FN+4QU0Xst8V6vWVcajP7Jmx/WdFYdpj7pmvhTvaB9o=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 14dfb8\npopulation: 32 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 88a1 a369 ae2b d887 | 110 9d0f (0) 9fa0 (0) 9890 (0) 9852 (0)\n001 4 49ea 4990 4109 4646 | 70 77d2 (0) 775e (0) 738c (0) 7290 (0)\n002 4 3237 3630 39d1 3b78 | 32 256e (0) 24b8 (0) 20ae (0) 217f (0)\n003 6 0067 00c6 0e5e 0b72 | 22 0743 (0) 07a8 (0) 0661 (0) 0438 (0)\n004 3 1c9c 1f67 1e2a | 10 1b83 (0) 1a2a (0) 18f6 (0) 19fa (0)\n005 3 13d6 103b 11d4 | 3 13d6 (0) 103b (0) 11d4 (0)\n006 5 1704 17db 179f 1672 | 5 1704 (0) 17db (0) 179f (0) 1672 (0)\n007 1 154b | 1 154b (0)\n============ DEPTH: 8 ==========================================\n008 2 1400 1436 | 2 1400 (0) 1436 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"14dfb8414d17b2df15eaf59571a8cfec99b1fd674561da63ee99af853bda07da","private_key":"9f60424e94bf49f4831f8875a348ff8684b25041feb915b3062e329bc6bde720","name":"node_14dfb8414d17b2df15eaf59571a8cfec99b1fd674561da63ee99af853bda07da","services":["streamer"],"enable_msg_events":true,"port":33225},"up":true}},{"node":{"info":{"id":"d887070a0568282c69e96ce65612ba72d5ea26b5c80671435d6e1ed2c4b49301","name":"node_d887070a0568282c69e96ce65612ba72d5ea26b5c80671435d6e1ed2c4b49301","enode":"enode://e27e5fe8c0fc1d5c19e4c43062e74e25d5b285ab4d87d9f6f0639f977473f6132ebec497112fb9ae28257aba65e66cff848d950d90d74301faee81243b2b354e@127.0.0.1:0","enr":"0xf88fb840d61802d9193750fd40278a66d4f73473dfb6ff6577a0f122efdee8265ca9f02a080bed7a061796672fa8e20230725617a89f348724b82705106550e47856543e0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102e27e5fe8c0fc1d5c19e4c43062e74e25d5b285ab4d87d9f6f0639f977473f613","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"2IcHCgVoKCxp6WzmVhK6ctXqJrXIBnFDXW4e0sS0kwE=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: d88707\npopulation: 37 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 9 49ea 4109 4646 39d1 | 146 775e (0) 77d2 (0) 7290 (0) 738c (0)\n001 9 90a8 8f21 88a1 a369 | 47 9d0f (0) 9fa0 (0) 9890 (0) 9852 (0)\n002 5 eb98 ef1b e514 f925 | 37 e027 (0) e7fa (0) e775 (0) e5ad (0)\n003 6 c1f9 c620 c9f5 c898 | 15 c26f (0) c1f9 (0) c49c (0) c441 (0)\n004 3 d1d7 d299 d3b0 | 5 d640 (0) d7ac (0) d1d7 (0) d299 (0)\n005 1 df1e | 1 df1e (0)\n============ DEPTH: 6 ==========================================\n006 3 db6a daec da67 | 3 db6a (0) da67 (0) daec (0)\n007 0 | 0\n008 1 d863 | 1 d863 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"d887070a0568282c69e96ce65612ba72d5ea26b5c80671435d6e1ed2c4b49301","private_key":"04afc55a06d4cfd448c6d6574905560d45f4bc8fffe230c686d444d678257ec8","name":"node_d887070a0568282c69e96ce65612ba72d5ea26b5c80671435d6e1ed2c4b49301","services":["streamer"],"enable_msg_events":true,"port":46277},"up":true}},{"node":{"info":{"id":"0a005eb9c10c5cc9f720cfec2a655811d391671597b4f32d12df291ec76b2c13","name":"node_0a005eb9c10c5cc9f720cfec2a655811d391671597b4f32d12df291ec76b2c13","enode":"enode://ba05d71907202ec66f1ef7f46da693468efea28d0cff6a320b4ed04465b73789f7fb6a9b638d00d75c054815a86c8c71512c605c8a5328aa4f3de656dc83aa4b@127.0.0.1:0","enr":"0xf88fb84081e05173f55c4568ba75436e5ec395bddec7a8bbae9c3c65a8f91b42698bda8407a5e40cacce44a4cecb0384cc14285aaa07669a28a9e69cceb2ec18a4e73f2c0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103ba05d71907202ec66f1ef7f46da693468efea28d0cff6a320b4ed04465b73789","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"CgBeucEMXMn3IM/sKmVYEdORZxWXtPMtEt8pHsdrLBM=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 0a005e\npopulation: 28 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 bb90 d887 | 110 9fa0 (0) 9d0f (0) 9890 (0) 9852 (0)\n001 4 5efb 49ea 4990 4646 | 70 77d2 (0) 775e (0) 7290 (0) 738c (0)\n002 5 3630 3373 3237 3b78 | 32 256e (0) 24b8 (0) 20ae (0) 21a0 (0)\n003 3 1e2a 11d4 14df | 22 1b83 (0) 1a2a (0) 19fa (0) 18f6 (0)\n004 5 0451 03cc 0328 0067 | 11 07a8 (0) 0743 (0) 0661 (0) 0438 (0)\n005 7 0de3 0cf5 0c28 0c64 | 8 0d8a (0) 0de3 (0) 0cf5 (0) 0c28 (0)\n============ DEPTH: 6 ==========================================\n006 0 | 0\n007 1 0b72 | 1 0b72 (0)\n008 1 0af9 | 1 0af9 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"0a005eb9c10c5cc9f720cfec2a655811d391671597b4f32d12df291ec76b2c13","private_key":"f1681c7b1205d9314840edd16ac9c55cfd362b4feeb60b0066c0a1c69f42f1c4","name":"node_0a005eb9c10c5cc9f720cfec2a655811d391671597b4f32d12df291ec76b2c13","services":["streamer"],"enable_msg_events":true,"port":35965},"up":true}},{"node":{"info":{"id":"0af9a57a2f66835cd3e4e71bc026013a8a99ca337a7b6b6cc34e11d8da212a4f","name":"node_0af9a57a2f66835cd3e4e71bc026013a8a99ca337a7b6b6cc34e11d8da212a4f","enode":"enode://58412ea457c3c490d9c0792f1b0274281f17c3794c31304f2eed90d45520cc37cf639e4f5f2194743af16fedabea43bbc5071077a286b03cc4b65601983ab04d@127.0.0.1:0","enr":"0xf88fb8407fbed396b8c08f1a08e239904d9fbd388627aec4b0e21c946b6d6112154a7d327f8f868440c35fb7a46ceb36684ebaf4437f4472cd88a0983375e4f5b50d610a0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10358412ea457c3c490d9c0792f1b0274281f17c3794c31304f2eed90d45520cc37","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"Cvmlei9mg1zT5OcbwCYBOoqZyjN6e2tsw04R2NohKk8=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 0af9a5\npopulation: 31 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 bb90 f5b2 d887 | 110 e027 (0) e7fa (0) e775 (0) e5ad (0)\n001 4 4990 49ea 4109 4646 | 70 77d2 (0) 775e (0) 7290 (0) 738c (0)\n002 4 3630 3237 3b78 39d1 | 32 24b8 (0) 256e (0) 20ae (0) 21a0 (0)\n003 6 1c9c 1e2a 11d4 103b | 22 1b83 (0) 1a2a (0) 19fa (0) 18f6 (0)\n004 4 0661 0328 0067 00c6 | 11 0438 (0) 0451 (0) 045b (0) 0743 (0)\n005 8 0d8a 0de3 0cf5 0c28 | 8 0d8a (0) 0de3 (0) 0cf5 (0) 0c64 (0)\n============ DEPTH: 6 ==========================================\n006 0 | 0\n007 1 0b72 | 1 0b72 (0)\n008 1 0a00 | 1 0a00 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"0af9a57a2f66835cd3e4e71bc026013a8a99ca337a7b6b6cc34e11d8da212a4f","private_key":"b5347eaddd49eda049687bb250949eca56628c3bddafbccae680b571175f1efe","name":"node_0af9a57a2f66835cd3e4e71bc026013a8a99ca337a7b6b6cc34e11d8da212a4f","services":["streamer"],"enable_msg_events":true,"port":45487},"up":true}},{"node":{"info":{"id":"4646fe4c119078738612b44a356089b3c73a08e11cfd910675d211ae6b20b8fd","name":"node_4646fe4c119078738612b44a356089b3c73a08e11cfd910675d211ae6b20b8fd","enode":"enode://29467abcaeb0c2dcf2dbb6835fbab644652983d04c3c5964c37eaed3c9b33a41f488528f8f11c8b4a73ae223a7c738bc6b1f8e56a5f319556a4c1ffd68865d13@127.0.0.1:0","enr":"0xf88fb84050850c1513e8379df0027113c46bb5f7df2ee2338d8768c7c7e14d4552813c9939b9417c32904d11dcdb010051f77a9f697ea2b46d603e852665b5a9293f08e70183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10329467abcaeb0c2dcf2dbb6835fbab644652983d04c3c5964c37eaed3c9b33a41","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"Rkb+TBGQeHOGErRKNWCJs8c6COEc/ZEGddIRrmsguP0=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 4646fe\npopulation: 42 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 f5b2 d887 8f21 aeb4 | 110 c26f (0) c1f9 (0) c59e (0) c49c (0)\n001 6 3b78 39d1 11d4 14df | 76 256e (0) 24b8 (0) 20ae (0) 217f (0)\n002 6 605a 6c73 6f5f 6e68 | 32 77d2 (0) 775e (0) 7290 (0) 738c (0)\n003 6 51db 5308 53fe 5f00 | 15 574f (0) 512e (0) 51db (0) 524d (0)\n004 8 4e5a 4c9e 4d10 4d6b | 11 4c9e (0) 4d10 (0) 4d6b (0) 4d59 (0)\n005 2 41d9 4109 | 2 41d9 (0) 4109 (0)\n006 4 4558 4559 4447 44a1 | 4 4558 (0) 4559 (0) 4447 (0) 44a1 (0)\n007 2 47bf 4782 | 2 4782 (0) 47bf (0)\n008 1 46fe | 1 46fe (0)\n============ DEPTH: 9 ==========================================\n009 2 461c 4636 | 2 461c (0) 4636 (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"4646fe4c119078738612b44a356089b3c73a08e11cfd910675d211ae6b20b8fd","private_key":"d31b7865721d5d0ce0dcf9cca1a8187d793be7b377d9d03fc2cb2ee745bee6f3","name":"node_4646fe4c119078738612b44a356089b3c73a08e11cfd910675d211ae6b20b8fd","services":["streamer"],"enable_msg_events":true,"port":41715},"up":true}},{"node":{"info":{"id":"bb90464f769a85549c150f861775aa67924c7c651f393f6c70772707376a5c7e","name":"node_bb90464f769a85549c150f861775aa67924c7c651f393f6c70772707376a5c7e","enode":"enode://ca69ebb1f7477323104e6a62f28c17ba29b748f75e2f49756f4cbe9393dc68781a244148d0137abd6fb1e4a1b33ffb03045681754e7ddbb371a57dbb88a315c8@127.0.0.1:0","enr":"0xf88fb840fb7786d0be189148e7144a7b9550267ba300810396855dd94b67bc0ba2072fd71c282ccdb2547c15206ad380a71a34fbf70dbfcfecd67df851f468c0b5294c050183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102ca69ebb1f7477323104e6a62f28c17ba29b748f75e2f49756f4cbe9393dc6878","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"u5BGT3aahVScFQ+GF3WqZ5JMfGUfOT9scHcnBzdqXH4=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: bb9046\npopulation: 28 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 3b78 11d4 0a00 0af9 | 146 256e (0) 24b8 (0) 20ae (0) 217f (0)\n001 3 d887 f925 f5b2 | 63 c26f (0) c1f9 (0) c59e (0) c43f (0)\n002 3 90a8 88a1 8f21 | 20 9fa0 (0) 9d0f (0) 9890 (0) 9852 (0)\n003 5 ad98 aeb4 ae2b a46d | 10 a6fb (0) a653 (0) a46d (0) a34e (0)\n004 3 b7ca b2a5 b02b | 8 b5b2 (0) b502 (0) b626 (0) b65e (0)\n005 1 bcc6 | 1 bcc6 (0)\n006 4 b897 b820 b95d b911 | 4 b897 (0) b820 (0) b95d (0) b911 (0)\n============ DEPTH: 7 ==========================================\n007 3 ba88 baf2 badd | 3 baf2 (0) badd (0) ba88 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"bb90464f769a85549c150f861775aa67924c7c651f393f6c70772707376a5c7e","private_key":"1681a07f3bae8df9da96df7d590316463371480d0ff13eeb1581b97efa00c074","name":"node_bb90464f769a85549c150f861775aa67924c7c651f393f6c70772707376a5c7e","services":["streamer"],"enable_msg_events":true,"port":42761},"up":true}},{"node":{"info":{"id":"49eaad68d23dd63ef26029fa3f4e2578f3deca8708bbc838750d8b6dbe9eaa38","name":"node_49eaad68d23dd63ef26029fa3f4e2578f3deca8708bbc838750d8b6dbe9eaa38","enode":"enode://00ec342238cfe51f0c655c27411369dca96d92b20f550c84552b0a23cbe14033c1624dff2ff2418e3d11c01f508f68c296985b7f14b508613b8b93d45b743aa7@127.0.0.1:0","enr":"0xf88fb840b31c9684d99503737f5f45f02a3a43e20c768eed666bd2e56982eebc3d5167b06146d790a41a931e1aa570ebfd5928fceb5d9fc58e3520d92c42f2296c8384ce0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10300ec342238cfe51f0c655c27411369dca96d92b20f550c84552b0a23cbe14033","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"SeqtaNI91j7yYCn6P04lePPeyocIu8g4dQ2Lbb6eqjg=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 49eaad\npopulation: 30 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 f5b2 f925 d887 bb90 | 110 c26f (0) c1f9 (0) c59e (0) c49c (0)\n001 7 39d1 14df 11d4 103b | 76 24b8 (0) 256e (0) 20ae (0) 217f (0)\n002 5 7125 7dd3 605a 6c73 | 32 67aa (0) 67dc (0) 66e7 (0) 6337 (0)\n003 2 5cd2 5efb | 15 574f (0) 512e (0) 51db (0) 524d (0)\n004 3 4109 41d9 4646 | 12 41d9 (0) 4109 (0) 4447 (0) 44a1 (0)\n005 4 4e5a 4d10 4d6b 4d59 | 5 4c9e (0) 4d10 (0) 4d6b (0) 4d59 (0)\n006 3 4ac7 4a8b 4bcf | 3 4ac7 (0) 4a8b (0) 4bcf (0)\n============ DEPTH: 7 ==========================================\n007 0 | 0\n008 0 | 0\n009 1 4990 | 1 4990 (0)\n010 1 49cd | 1 49cd (0)\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"49eaad68d23dd63ef26029fa3f4e2578f3deca8708bbc838750d8b6dbe9eaa38","private_key":"9ab9903f8ffceadd1d6a7976373b073696a0ee0055a7208414a8f1679f35e70f","name":"node_49eaad68d23dd63ef26029fa3f4e2578f3deca8708bbc838750d8b6dbe9eaa38","services":["streamer"],"enable_msg_events":true,"port":38883},"up":true}},{"node":{"info":{"id":"499036eb9d10fc003c903f09ea0ee00c0d27b39564988d67ae111f3473d22f07","name":"node_499036eb9d10fc003c903f09ea0ee00c0d27b39564988d67ae111f3473d22f07","enode":"enode://c582e81e3c1308e84e2faa3d0e6bc500e0b221cb23082c6d74785246b56e0cef2e971f545dfa3adef1ab1beff9b70e5325cdeff37b7b9c5dd20e1440a73fb632@127.0.0.1:0","enr":"0xf88fb840387099c7431e9b63d69d94cae6d580f16aebc307b79c74b73b25243f0bbf6c8216bc5d70f677116c8007b76373d3e7b4f18e47409a9965230fcc2373473836dd0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102c582e81e3c1308e84e2faa3d0e6bc500e0b221cb23082c6d74785246b56e0cef","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"SZA2650Q/AA8kD8J6g7gDA0ns5VkmI1nrhEfNHPSLwc=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 499036\npopulation: 29 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 b911 b02b 90a8 88a1 | 110 9d0f (0) 9fa0 (0) 9890 (0) 9852 (0)\n001 6 3b78 11d4 14df 0a00 | 76 24b8 (0) 256e (0) 20ae (0) 21a0 (0)\n002 4 7125 7dd3 6e68 605a | 32 77d2 (0) 775e (0) 7290 (0) 738c (0)\n003 2 5cd2 5efb | 15 574f (0) 512e (0) 51db (0) 524d (0)\n004 3 4109 41d9 4646 | 12 41d9 (0) 4109 (0) 4447 (0) 44a1 (0)\n005 4 4d10 4d6b 4d59 4e5a | 5 4c9e (0) 4d59 (0) 4d6b (0) 4d10 (0)\n006 3 4ac7 4a8b 4bcf | 3 4ac7 (0) 4a8b (0) 4bcf (0)\n============ DEPTH: 7 ==========================================\n007 0 | 0\n008 0 | 0\n009 2 49cd 49ea | 2 49cd (0) 49ea (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"499036eb9d10fc003c903f09ea0ee00c0d27b39564988d67ae111f3473d22f07","private_key":"c1e2eeef980866cd77150633a76d6a829b17e8cfd20808fb1e2d37307ba092bd","name":"node_499036eb9d10fc003c903f09ea0ee00c0d27b39564988d67ae111f3473d22f07","services":["streamer"],"enable_msg_events":true,"port":44049},"up":true}},{"node":{"info":{"id":"f5b24a1fd2cd2908b408562f9a265ee1a692b137e770137afa5fdfa07b237221","name":"node_f5b24a1fd2cd2908b408562f9a265ee1a692b137e770137afa5fdfa07b237221","enode":"enode://e46f5b92ac1643853152ba3b247bd5b51cca33a1be2f8811912a8a4c5a5eb0164fb72f56315e64256925e324661087a4c7a679a181f5afc78f2294e6b2c4d482@127.0.0.1:0","enr":"0xf88fb840a9aa17d842225b019dc9bfc778d998c52b179d856b377bca673ec81ba5fc96043cd2edc2a04f0e9115fe2b78b12778948c8db42f5dd89e0826f0f3ab746be0960183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102e46f5b92ac1643853152ba3b247bd5b51cca33a1be2f8811912a8a4c5a5eb016","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"9bJKH9LNKQi0CFYvmiZe4aaSsTfncBN6+l/foHsjciE=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: f5b24a\npopulation: 40 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 7 39d1 0af9 00c6 5efb | 146 24b8 (0) 256e (0) 20ae (0) 21a0 (0)\n001 8 90a8 8f21 88a1 bcc6 | 47 9d0f (0) 9fa0 (0) 9890 (0) 9852 (0)\n002 5 c620 c898 cc20 d3b0 | 26 c26f (0) c1f9 (0) c59e (0) c49c (0)\n003 5 e514 e775 ef1b e854 | 18 e027 (0) e7fa (0) e775 (0) e5ad (0)\n004 4 ff36 fbf5 fbc8 f925 | 6 fe21 (0) fe31 (0) ff36 (0) fbc8 (0)\n005 2 f31c f27f | 3 f31c (0) f2d5 (0) f27f (0)\n006 4 f629 f7fa f7ba f773 | 4 f629 (0) f7fa (0) f7ba (0) f773 (0)\n007 3 f4e0 f45f f456 | 3 f4e0 (0) f45f (0) f456 (0)\n============ DEPTH: 8 ==========================================\n008 1 f528 | 1 f528 (0)\n009 1 f5dc | 1 f5dc (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"f5b24a1fd2cd2908b408562f9a265ee1a692b137e770137afa5fdfa07b237221","private_key":"dbbb9c96e746abd3f4c880d9fbab46e390a208e8a8fca9b24e83fc12054d6601","name":"node_f5b24a1fd2cd2908b408562f9a265ee1a692b137e770137afa5fdfa07b237221","services":["streamer"],"enable_msg_events":true,"port":38193},"up":true}},{"node":{"info":{"id":"aeb4c75a57ccfc9ac053a3d363cf7c1e3e201406587769ab6615d5c2f86a5410","name":"node_aeb4c75a57ccfc9ac053a3d363cf7c1e3e201406587769ab6615d5c2f86a5410","enode":"enode://408575dfa357953549c9a106e6944f5fe874044b6931be8662fe92bda869094fc8a63d0beb139bef8cc4084fea888f605755214a178949930042d4111a9d863f@127.0.0.1:0","enr":"0xf88fb84023e003cb4dba2e193bfda36d19918aba6afe1dd732715d94307795abadfc3f161cda9e4fa8067ebb95e9ee4e057d4be121f96ce68c706483ca3d278da0d210950183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103408575dfa357953549c9a106e6944f5fe874044b6931be8662fe92bda869094f","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"rrTHWlfM/JrAU6PTY898Hj4gFAZYd2mrZhXVwvhqVBA=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: aeb4c7\npopulation: 30 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 154b 00c6 4646 5efb | 146 256e (0) 24b8 (0) 20ae (0) 217f (0)\n001 5 d887 cc20 e775 f925 | 63 d7ac (0) d640 (0) d1d7 (0) d299 (0)\n002 6 9852 90a8 9076 8505 | 20 9d0f (0) 9fa0 (0) 9890 (0) 9852 (0)\n003 5 b2a5 b02b bb90 badd | 17 b502 (0) b5b2 (0) b626 (0) b65e (0)\n004 5 a6fb a653 a46d a34e | 5 a6fb (0) a653 (0) a46d (0) a34e (0)\n============ DEPTH: 5 ==========================================\n005 0 | 0\n006 2 ac4d ad98 | 2 ac4d (0) ad98 (0)\n007 1 af02 | 1 af02 (0)\n008 1 ae2b | 1 ae2b (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"aeb4c75a57ccfc9ac053a3d363cf7c1e3e201406587769ab6615d5c2f86a5410","private_key":"557f3cfbd77e4d7aed5ee5eb12fe2b64a66b62b1565779336756894798686fba","name":"node_aeb4c75a57ccfc9ac053a3d363cf7c1e3e201406587769ab6615d5c2f86a5410","services":["streamer"],"enable_msg_events":true,"port":41457},"up":true}},{"node":{"info":{"id":"5cd2377226825dc7ea582315cd108d23502df4e9c7c09fc07e7b4aa56440de29","name":"node_5cd2377226825dc7ea582315cd108d23502df4e9c7c09fc07e7b4aa56440de29","enode":"enode://09a213671160d6c9f446228ec2692c94080d1b2dc94c9d7731e95b0bc481bee4fc4ab0d06fd374a143939d8f7edec35b9412902e448f760d46dce08de953fbfc@127.0.0.1:0","enr":"0xf88fb84028e698a16106eee1826e468d8c150a43995c15e006336c12f9f855178ab5b7e5299f2f54ccdab44826172fc7c3b95fe6748aadccbfe2abc713b61a087af3a3540183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10209a213671160d6c9f446228ec2692c94080d1b2dc94c9d7731e95b0bc481bee4","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"XNI3ciaCXcfqWCMVzRCNI1At9OnHwJ/AfntKpWRA3ik=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 5cd237\npopulation: 30 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 f925 bcc6 aeb4 | 110 df1e (0) db6a (0) da67 (0) daec (0)\n001 4 39d1 00c6 154b 103b | 76 24b8 (0) 256e (0) 20ae (0) 217f (0)\n002 4 7dd3 7125 6e68 605a | 32 77d2 (0) 775e (0) 7290 (0) 738c (0)\n003 8 41d9 4109 461c 4646 | 23 41d9 (0) 4109 (0) 4558 (0) 4559 (0)\n004 5 51db 524d 5308 534b | 8 574f (0) 512e (0) 51db (0) 524d (0)\n005 3 5b63 5823 58ed | 3 5b63 (0) 58ed (0) 5823 (0)\n============ DEPTH: 6 ==========================================\n006 2 5f00 5efb | 2 5f00 (0) 5efb (0)\n007 1 5db0 | 1 5db0 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"5cd2377226825dc7ea582315cd108d23502df4e9c7c09fc07e7b4aa56440de29","private_key":"a4284995d54ea16fb6c05b66a7661d7af0bcad9d23da505a56922f494792bcac","name":"node_5cd2377226825dc7ea582315cd108d23502df4e9c7c09fc07e7b4aa56440de29","services":["streamer"],"enable_msg_events":true,"port":37509},"up":true}},{"node":{"info":{"id":"f925c85e6457ac01f0cd6b297155f9d3ae611603890d8f3a45e1396d937f8680","name":"node_f925c85e6457ac01f0cd6b297155f9d3ae611603890d8f3a45e1396d937f8680","enode":"enode://77fb0fa620b93ebe2af5e929eaa9f0cdaad26a3530f84e2026b2870c54d5e3f5204889e8ceb85a934b36b96f787031eae04a738bc4b32a53ff25d06f890ccd3f@127.0.0.1:0","enr":"0xf88fb84036fe76e82d48bc24b57dc4307d10a6168bc316938eedbd1a097ba018675fb30b1ab095482cf7f33c126a535acd04e34af2ab224d982993c49222da20f868a17d0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10377fb0fa620b93ebe2af5e929eaa9f0cdaad26a3530f84e2026b2870c54d5e3f5","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"+SXIXmRXrAHwzWspcVX5065hFgOJDY86ReE5bZN/hoA=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: f925c8\npopulation: 36 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 154b 00c6 49ea 5cd2 | 146 35e6 (0) 378e (0) 3780 (0) 3630 (0)\n001 9 8f21 88a1 90a8 a369 | 47 849b (0) 8505 (0) 8025 (0) 82f9 (0)\n002 6 d887 d3b0 c786 c620 | 26 d7ac (0) d640 (0) d1d7 (0) d299 (0)\n003 4 e514 e775 e854 eb98 | 18 e027 (0) e5ad (0) e5d7 (0) e547 (0)\n004 7 f31c f27f f773 f7ba | 13 f31c (0) f2d5 (0) f27f (0) f629 (0)\n005 3 ff36 fe21 fe31 | 3 ff36 (0) fe21 (0) fe31 (0)\n============ DEPTH: 6 ==========================================\n006 2 fbf5 fbc8 | 2 fbc8 (0) fbf5 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"f925c85e6457ac01f0cd6b297155f9d3ae611603890d8f3a45e1396d937f8680","private_key":"68be1214b78195a55f8a0048f9bec727e50425b7c72b445f3e9b0cba006ce587","name":"node_f925c85e6457ac01f0cd6b297155f9d3ae611603890d8f3a45e1396d937f8680","services":["streamer"],"enable_msg_events":true,"port":46319},"up":true}},{"node":{"info":{"id":"5efb3bfc199f5408f79bd6bd5171b4bf332c68a8e49242eb4f6a589b963565c6","name":"node_5efb3bfc199f5408f79bd6bd5171b4bf332c68a8e49242eb4f6a589b963565c6","enode":"enode://f0602e87ed48ff8c9e5b32418ddf3f1b1342911057a98f5c3cb1cb1c8053887b84f07d0aef26934db2ee88c543ffa8c5e60dbccbc693e1162466a2a84304ac34@127.0.0.1:0","enr":"0xf88fb8400ca2ddfc019ef6efe386c9432134ddcf621cc7d5d6d6c2a4df4b691968397ad32e8730138bac99bdfa701024d5590bb583ac57b4a314223baf49ba604b6daa7a0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102f0602e87ed48ff8c9e5b32418ddf3f1b1342911057a98f5c3cb1cb1c8053887b","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"Xvs7/BmfVAj3m9a9UXG0vzMsaKjkkkLrT2pYm5Y1ZcY=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 5efb3b\npopulation: 27 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 aeb4 f5b2 f925 | 110 849b (0) 8505 (0) 8025 (0) 82f9 (0)\n001 6 3630 39d1 3b78 154b | 76 3237 (0) 3373 (0) 33b5 (0) 30be (0)\n002 4 7dd3 7125 6e68 605a | 32 77d2 (0) 775e (0) 7290 (0) 738c (0)\n003 5 4d10 4990 49ea 41d9 | 23 4109 (0) 41d9 (0) 4447 (0) 44a1 (0)\n004 4 51db 53fe 53a8 534b | 8 574f (0) 512e (0) 51db (0) 524d (0)\n005 2 58ed 5823 | 3 5b63 (0) 58ed (0) 5823 (0)\n============ DEPTH: 6 ==========================================\n006 2 5db0 5cd2 | 2 5db0 (0) 5cd2 (0)\n007 1 5f00 | 1 5f00 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"5efb3bfc199f5408f79bd6bd5171b4bf332c68a8e49242eb4f6a589b963565c6","private_key":"dc9b24b93ea85bbf21ab6cc53fa814b1e43b7c727edeef705de678992d971ee6","name":"node_5efb3bfc199f5408f79bd6bd5171b4bf332c68a8e49242eb4f6a589b963565c6","services":["streamer"],"enable_msg_events":true,"port":40995},"up":true}},{"node":{"info":{"id":"00c6488a842ece7a8b0daf064e405de03a4257d308840ea52bfd48d23f54d895","name":"node_00c6488a842ece7a8b0daf064e405de03a4257d308840ea52bfd48d23f54d895","enode":"enode://7ca882c01f3ef0c979b3991b30d470a4e12d4daddb20ff5209e75e679be8d75e9d6b98c06a763dc9d6340daa2d98079a8ed5348c7b332d26dbe72cf162227e37@127.0.0.1:0","enr":"0xf88fb8400b62eaff12a9192a15e894c5eab3f37b7ed634294a51288c0c6a83ecf0fd4a6b542b6cb20fb7bd8435de98cc27008a3cf625eadd4938433921102803ed3c11cb0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1037ca882c01f3ef0c979b3991b30d470a4e12d4daddb20ff5209e75e679be8d75e","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"AMZIioQuznqLDa8GTkBd4DpCV9MIhA6lK/1I0j9U2JU=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 00c648\npopulation: 36 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 cc20 f925 f5b2 a46d | 110 df1e (0) db6a (0) da67 (0) daec (0)\n001 4 49ea 4990 5cd2 5efb | 70 7a60 (0) 7b90 (0) 7920 (0) 7e04 (0)\n002 4 3b78 39d1 33b5 2c79 | 32 378e (0) 3780 (0) 3630 (0) 35e6 (0)\n003 7 1c9c 179f 14df 154b | 22 1a2a (0) 1b83 (0) 18f6 (0) 19fa (0)\n004 7 0b72 0af9 0a00 0c64 | 11 0d8a (0) 0de3 (0) 0cf5 (0) 0c64 (0)\n005 4 0438 045b 07a8 0661 | 6 0743 (0) 07a8 (0) 0661 (0) 0438 (0)\n============ DEPTH: 6 ==========================================\n006 3 02d8 03cc 0328 | 3 02d8 (0) 03cc (0) 0328 (0)\n007 0 | 0\n008 1 0067 | 1 0067 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"00c6488a842ece7a8b0daf064e405de03a4257d308840ea52bfd48d23f54d895","private_key":"264248088585a6d226623f7f606b7d9b2a5a80474bb9fbe6c2194848b7dc0586","name":"node_00c6488a842ece7a8b0daf064e405de03a4257d308840ea52bfd48d23f54d895","services":["streamer"],"enable_msg_events":true,"port":46209},"up":true}},{"node":{"info":{"id":"bcc6724e54f761361f85147eb102a8d1a1a38810a940ce76b1e361ddcadacaa3","name":"node_bcc6724e54f761361f85147eb102a8d1a1a38810a940ce76b1e361ddcadacaa3","enode":"enode://e9d6493fb95f0cead7320163b4766f3eeb98040a441ca69854ad152ecc40f844b80748c9a40686ed50aeb691c54ebc32ed19e793294170171e644ac9cc903756@127.0.0.1:0","enr":"0xf88fb84006b4143a56faaab9a4674c3bf9dccdab55411262af7d7178d0d90275ac6bf97b13323f2de3c85480f392843ae1172ab763680293f68350afae51376861d75f460183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102e9d6493fb95f0cead7320163b4766f3eeb98040a441ca69854ad152ecc40f844","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"vMZyTlT3YTYfhRR+sQKo0aGjiBCpQM52seNh3crayqM=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: bcc672\npopulation: 26 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 5cd2 103b 00c6 | 146 77d2 (0) 775e (0) 7290 (0) 738c (0)\n001 3 d887 f5b2 f925 | 63 df1e (0) db6a (0) da67 (0) daec (0)\n002 5 90a8 9076 9852 8f21 | 20 849b (0) 8505 (0) 8025 (0) 82f9 (0)\n003 4 a34e a46d ae2b aeb4 | 10 ac4d (0) ad98 (0) af02 (0) ae2b (0)\n004 3 b7ca b2a5 b02b | 8 b5b2 (0) b502 (0) b626 (0) b65e (0)\n============ DEPTH: 5 ==========================================\n005 8 baf2 badd ba88 bb90 | 8 baf2 (0) badd (0) ba88 (0) bb90 (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"bcc6724e54f761361f85147eb102a8d1a1a38810a940ce76b1e361ddcadacaa3","private_key":"abbd7b59425714f0316c2a0b0d09c70ac6a18bf91c5c6f8bacc927aa55e2e249","name":"node_bcc6724e54f761361f85147eb102a8d1a1a38810a940ce76b1e361ddcadacaa3","services":["streamer"],"enable_msg_events":true,"port":36589},"up":true}},{"node":{"info":{"id":"103b232552b94090232195dc88f84823701f35ae536b5af6dd33fa655a33cbae","name":"node_103b232552b94090232195dc88f84823701f35ae536b5af6dd33fa655a33cbae","enode":"enode://ab61a89b8c96d76938394e59d68d35411dd069a2913459c3b93753e155054808072826f8c3486e851277442229448a9a5aea76f1e5677d9d63bd233f662349f8@127.0.0.1:0","enr":"0xf88fb840ef3ce505f3f25f1acbd8cb9d485be9cf25dcd915112ff3c33982c65dce7331c020dc2aaedc07c497e5b48c7aafb32221e5879fd926cb39cce242f3fc1e70182c0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102ab61a89b8c96d76938394e59d68d35411dd069a2913459c3b93753e155054808","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"EDsjJVK5QJAjIZXciPhII3AfNa5Ta1r23TP6ZVozy64=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 103b23\npopulation: 27 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 eb98 e883 e854 e775 | 110 e027 (0) e5ad (0) e5d7 (0) e547 (0)\n001 5 605a 49ea 4e5a 53fe | 70 77d2 (0) 775e (0) 7290 (0) 738c (0)\n002 3 3b78 39d1 2c79 | 32 3f94 (0) 3ec5 (0) 3efc (0) 3e8e (0)\n003 2 0af9 00c6 | 22 0b72 (0) 0a00 (0) 0af9 (0) 0d8a (0)\n004 3 19fa 1e2a 1c9c | 10 1b83 (0) 1a2a (0) 18f6 (0) 19fa (0)\n005 7 1704 17db 179f 1672 | 9 1704 (0) 17db (0) 179f (0) 1672 (0)\n============ DEPTH: 6 ==========================================\n006 1 13d6 | 1 13d6 (0)\n007 1 11d4 | 1 11d4 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"103b232552b94090232195dc88f84823701f35ae536b5af6dd33fa655a33cbae","private_key":"416b236190cb9412038f2b53f7d6d2b804e6e2e47266fed6212b9950c7aaaa19","name":"node_103b232552b94090232195dc88f84823701f35ae536b5af6dd33fa655a33cbae","services":["streamer"],"enable_msg_events":true,"port":35829},"up":true}},{"node":{"info":{"id":"154be9255e9aebd134a914070f5e6f3d4bba079d9ca738b74244db14e1b586dd","name":"node_154be9255e9aebd134a914070f5e6f3d4bba079d9ca738b74244db14e1b586dd","enode":"enode://175ecd2838e0febb3825043e19c3da58fc7b0dbc13785420d0f6a9c558cf1f58bdebd47f93bac8cf9eb1b7fd91b13f8888481aa8a08adcb1ccad83d11306e4e1@127.0.0.1:0","enr":"0xf88fb840818f538de2e08485786c679ee895bb4922fb60fe5137ed730e676b8d4e033cbb5bf437ded58aeb37c30db94ed1d80e76fb52d999f936280a4107b502891b09710183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103175ecd2838e0febb3825043e19c3da58fc7b0dbc13785420d0f6a9c558cf1f58","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"FUvpJV6a69E0qRQHD15vPUu6B52cpzi3QkTbFOG1ht0=","hive":"\n=========================================================================\nThu Feb 28 18:13:01 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 154be9\npopulation: 31 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 fbf5 f925 aeb4 a46d | 110 e027 (0) e5ad (0) e5d7 (0) e514 (0)\n001 5 7dd3 605a 5cd2 5efb | 70 775e (0) 77d2 (0) 7290 (0) 738c (0)\n002 2 33b5 2c79 | 32 3f94 (0) 3ec5 (0) 3efc (0) 3e8e (0)\n003 3 0ff2 0fc5 00c6 | 22 0b72 (0) 0a00 (0) 0af9 (0) 0d8a (0)\n004 6 18f6 19fa 1f67 1e2a | 10 1a2a (0) 1b83 (0) 18f6 (0) 19fa (0)\n005 3 13d6 11d4 103b | 3 13d6 (0) 11d4 (0) 103b (0)\n006 5 1704 17db 179f 1672 | 5 1704 (0) 17db (0) 179f (0) 1672 (0)\n============ DEPTH: 7 ==========================================\n007 3 14df 1400 1436 | 3 14df (0) 1400 (0) 1436 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"154be9255e9aebd134a914070f5e6f3d4bba079d9ca738b74244db14e1b586dd","private_key":"324821a542a5b9cbe5f5cde557280f1fa601cbb5592c2b60a578fd741be35770","name":"node_154be9255e9aebd134a914070f5e6f3d4bba079d9ca738b74244db14e1b586dd","services":["streamer"],"enable_msg_events":true,"port":41653},"up":true}}],"conns":[{"one":"a46dd535e3bc8f111a8b2ce5594b62e87741c395e8a2b8fbae33edd29cb8caf8","other":"13d6cb9316e289923e2d1de7f3c966d0cbabce3acdb8017122944f4abb140912","up":true},{"one":"13d6cb9316e289923e2d1de7f3c966d0cbabce3acdb8017122944f4abb140912","other":"d3b0dea1dd3ac71e7e4a30941632eec53cb980aa7cb6cdac95042a5400a878c3","up":true},{"one":"d3b0dea1dd3ac71e7e4a30941632eec53cb980aa7cb6cdac95042a5400a878c3","other":"605a46991af15cd60e67413c712b99ff8f21173c96a7990f2728ad6cac2bb9d8","up":true},{"one":"605a46991af15cd60e67413c712b99ff8f21173c96a7990f2728ad6cac2bb9d8","other":"2c79af7ea85f96db7897cf8cdb4d002ad2308194e03981876edb8d904ef65137","up":true},{"one":"2c79af7ea85f96db7897cf8cdb4d002ad2308194e03981876edb8d904ef65137","other":"33b5c521b4208e26414db2e05c9a8ccc001a524d928579d44d2e74d14a56593e","up":true},{"one":"33b5c521b4208e26414db2e05c9a8ccc001a524d928579d44d2e74d14a56593e","other":"b911b8e2d72532b7c66ff5f7bffa70f5ddbeea6903a86f9333399f0c4b5f0fe8","up":true},{"one":"b911b8e2d72532b7c66ff5f7bffa70f5ddbeea6903a86f9333399f0c4b5f0fe8","other":"53fe2c13926507a7a6c27d0fb30a2c358c4c7bfa40df8b5fa8ec8986c2450519","up":true},{"one":"53fe2c13926507a7a6c27d0fb30a2c358c4c7bfa40df8b5fa8ec8986c2450519","other":"4e5a46c004e85cf86a02fdfbf2243018825d015debfb9a077a1283d302293b3a","up":true},{"one":"4e5a46c004e85cf86a02fdfbf2243018825d015debfb9a077a1283d302293b3a","other":"cc2037c08942a094df12f45831f28e0015fc3ac04d5b8f24ffea9bf3a0b02c39","up":true},{"one":"cc2037c08942a094df12f45831f28e0015fc3ac04d5b8f24ffea9bf3a0b02c39","other":"b02b01a5c37cb05c287a3dc7d04e305de26f8d62dc388542eeb43e97db7b4282","up":true},{"one":"b02b01a5c37cb05c287a3dc7d04e305de26f8d62dc388542eeb43e97db7b4282","other":"a34ea2e87d4c12adb27d66c2c95300603ff50415974e000bbcc69a5ae059dbf1","up":true},{"one":"a34ea2e87d4c12adb27d66c2c95300603ff50415974e000bbcc69a5ae059dbf1","other":"7dd3078c71087ab88d4d26a962820bcb79b8ce30e91c1f9a69d4bf8d38086960","up":true},{"one":"7dd3078c71087ab88d4d26a962820bcb79b8ce30e91c1f9a69d4bf8d38086960","other":"6e68ea86440706a0d73a9508f2247492543163f8fa7e2dc2aa62b74d50261b8b","up":true},{"one":"6e68ea86440706a0d73a9508f2247492543163f8fa7e2dc2aa62b74d50261b8b","other":"7125e05bf1bfe6df948c9276b62bc755fc6b0ec8d4ac7724b61ea49591adcf25","up":true},{"one":"7125e05bf1bfe6df948c9276b62bc755fc6b0ec8d4ac7724b61ea49591adcf25","other":"fbf5e917be45e909697a9393c4778206333cf1dd9a103978e8d71622ca3b1cc8","up":true},{"one":"fbf5e917be45e909697a9393c4778206333cf1dd9a103978e8d71622ca3b1cc8","other":"0fc59bd04ac9de3195e3c9d0eb573952a5805dd2e7e572078b6e996778adec73","up":true},{"one":"0fc59bd04ac9de3195e3c9d0eb573952a5805dd2e7e572078b6e996778adec73","other":"0ff2d2c49547eebc96675e0b88073dea5e9091bee1843ffe567127e34486c348","up":true},{"one":"0ff2d2c49547eebc96675e0b88073dea5e9091bee1843ffe567127e34486c348","other":"582330d8b8c49331b2aec790dc7325b9cd483fc8129323d31ec429d545042964","up":true},{"one":"582330d8b8c49331b2aec790dc7325b9cd483fc8129323d31ec429d545042964","other":"41d9c03e44bec3f84a6139ce40ef1e390530f38ed11860575acfad03a49db095","up":true},{"one":"41d9c03e44bec3f84a6139ce40ef1e390530f38ed11860575acfad03a49db095","other":"1c9caf028df31681b1457a54d4b3ab20009f9fa5bd12417a1ba7efe0c660e6bd","up":true},{"one":"1c9caf028df31681b1457a54d4b3ab20009f9fa5bd12417a1ba7efe0c660e6bd","other":"4d59cf1aeecf370e94a7a231887450cef97053b9c88a7fd11e210840af070e29","up":true},{"one":"4d59cf1aeecf370e94a7a231887450cef97053b9c88a7fd11e210840af070e29","other":"2f32d54f06989efb6ca5431b74cd759fba05dbef36ecff8fd506e662026af983","up":true},{"one":"2f32d54f06989efb6ca5431b74cd759fba05dbef36ecff8fd506e662026af983","other":"eb98fb45dd5754f24f9df0c9ecbb93932e3d9d7735cd6d0ddd4a8675bb4ef554","up":true},{"one":"eb98fb45dd5754f24f9df0c9ecbb93932e3d9d7735cd6d0ddd4a8675bb4ef554","other":"9852ce267d53106a6e584d6eddb08e0062eb4a422d2a8d39ad6dccaebac552ff","up":true},{"one":"9852ce267d53106a6e584d6eddb08e0062eb4a422d2a8d39ad6dccaebac552ff","other":"daec45eca40f48843b41f70267c07e94996ced829f02710f15354fbe26e177e7","up":true},{"one":"daec45eca40f48843b41f70267c07e94996ced829f02710f15354fbe26e177e7","other":"c620752a083ca1ff0398937235cf964133939452c293c799ce07ff8aa2bde420","up":true},{"one":"c620752a083ca1ff0398937235cf964133939452c293c799ce07ff8aa2bde420","other":"6c73150490e8be9677c40086de0aefed1939581048e26f4a93f5ca26571a1a8f","up":true},{"one":"6c73150490e8be9677c40086de0aefed1939581048e26f4a93f5ca26571a1a8f","other":"e8548b5df15adf0f2a997ff5709827beb5e1d36bb08a2f2d017746d5c0e83fca","up":true},{"one":"e8548b5df15adf0f2a997ff5709827beb5e1d36bb08a2f2d017746d5c0e83fca","other":"165f1af67aa1d24569e0bdff61d29b3c39e93250071d8f25b5be6face209ac6a","up":true},{"one":"165f1af67aa1d24569e0bdff61d29b3c39e93250071d8f25b5be6face209ac6a","other":"7920d69cf7e458fce0781ea1a4e07768e1a69f6818090eff0abf0b4a0c2c35f8","up":true},{"one":"7920d69cf7e458fce0781ea1a4e07768e1a69f6818090eff0abf0b4a0c2c35f8","other":"e775e9759d4701bd9b43c22f1d1be73c1262b2752bb23cb3857485daf1dcad2d","up":true},{"one":"e775e9759d4701bd9b43c22f1d1be73c1262b2752bb23cb3857485daf1dcad2d","other":"90765b72283f59be4cf9bf7a9e9a22fd6db701c3603cbc0817b4adf2f8e9ce08","up":true},{"one":"90765b72283f59be4cf9bf7a9e9a22fd6db701c3603cbc0817b4adf2f8e9ce08","other":"c8986871e46f001d15ed8b70f2aa0fea8ae309d5e5671a500f619e3b348c8c15","up":true},{"one":"c8986871e46f001d15ed8b70f2aa0fea8ae309d5e5671a500f619e3b348c8c15","other":"3e8efcaf3002522b39065ea30c15426d1eb55916499eff8eb5a814e39d41853c","up":true},{"one":"3e8efcaf3002522b39065ea30c15426d1eb55916499eff8eb5a814e39d41853c","other":"fbc8087a723c564ca0139329902e79748af46699ea7be24d57909a7e8e96f681","up":true},{"one":"fbc8087a723c564ca0139329902e79748af46699ea7be24d57909a7e8e96f681","other":"f27f1044777e05f3f60165d0d2fc3e7667fe148e0ca7a097805d60b9f61025f7","up":true},{"one":"f27f1044777e05f3f60165d0d2fc3e7667fe148e0ca7a097805d60b9f61025f7","other":"b2a563ac59bab4dfddf7b6e27b80ee7afdeb2e4295411107903f484bcf9fc4f2","up":true},{"one":"b2a563ac59bab4dfddf7b6e27b80ee7afdeb2e4295411107903f484bcf9fc4f2","other":"b820e480354000c837b1781ec1c493e8776b4834252e6453425ac05b925b5a58","up":true},{"one":"b820e480354000c837b1781ec1c493e8776b4834252e6453425ac05b925b5a58","other":"534bcaa98cf9192b35b6014c650ae067e74332c015ebb516d63601427d7376b8","up":true},{"one":"534bcaa98cf9192b35b6014c650ae067e74332c015ebb516d63601427d7376b8","other":"66e7fc2df51f5df8d7329851fe9357d895e9d5dfdc25f8d92bdb10a960f7e15a","up":true},{"one":"66e7fc2df51f5df8d7329851fe9357d895e9d5dfdc25f8d92bdb10a960f7e15a","other":"628e7da3359ed6d9dcfbafc7581966e4e09245c321ec78ca75587c9cbb44697f","up":true},{"one":"628e7da3359ed6d9dcfbafc7581966e4e09245c321ec78ca75587c9cbb44697f","other":"06618d829a8a7317a98f1a40ecf8864e1c94c4e270a9e4c008229dc7cf937b7e","up":true},{"one":"06618d829a8a7317a98f1a40ecf8864e1c94c4e270a9e4c008229dc7cf937b7e","other":"f4565dd2c428c03d7a8d5fad87a6dd5f92ae706529eb6152d36fa584e7cdbe4d","up":true},{"one":"f4565dd2c428c03d7a8d5fad87a6dd5f92ae706529eb6152d36fa584e7cdbe4d","other":"4bcf4eb531d5ec4b31d99e8354af03f976524c7858a1e7043e9b7055326f0952","up":true},{"one":"4bcf4eb531d5ec4b31d99e8354af03f976524c7858a1e7043e9b7055326f0952","other":"82dd83838cb982b89505ef249d353a20e434346dd78b71cd9b809f71d5c112da","up":true},{"one":"82dd83838cb982b89505ef249d353a20e434346dd78b71cd9b809f71d5c112da","other":"7dbbdeba3731e1ff43072f8cbd86db147761e1b61753eea7024774dbf46914bd","up":true},{"one":"7dbbdeba3731e1ff43072f8cbd86db147761e1b61753eea7024774dbf46914bd","other":"314a3530a5e0c37d5609149b3ae9c2e078573346bd8fce3c769ebaeb31726ec1","up":true},{"one":"314a3530a5e0c37d5609149b3ae9c2e078573346bd8fce3c769ebaeb31726ec1","other":"e8830f2b2f7d08df15bd33f4b2841d01d9d62c1621234bd6ae86743e52360f3e","up":true},{"one":"e8830f2b2f7d08df15bd33f4b2841d01d9d62c1621234bd6ae86743e52360f3e","other":"e54b643cbc95d9f5d27ec3760d892b6802981bfabf4f9979267d66259df982c7","up":true},{"one":"e54b643cbc95d9f5d27ec3760d892b6802981bfabf4f9979267d66259df982c7","other":"850575577d6b420a87aba388af481e0c044c2f75cf29ff934daf5674318a61ba","up":true},{"one":"850575577d6b420a87aba388af481e0c044c2f75cf29ff934daf5674318a61ba","other":"4d6b939fb67338c484948ab92b2ceea4d4b666d7e08773673cd7c8f83f495b89","up":true},{"one":"4d6b939fb67338c484948ab92b2ceea4d4b666d7e08773673cd7c8f83f495b89","other":"9fa0215e980dc907df4cc47ab4937f36527d78f9837493016fd4fc51e617299c","up":true},{"one":"9fa0215e980dc907df4cc47ab4937f36527d78f9837493016fd4fc51e617299c","other":"179f21d2e0421b8056ee9a260bc0985bfa64a52a36d0a8fbce4e03f3120d1d65","up":true},{"one":"179f21d2e0421b8056ee9a260bc0985bfa64a52a36d0a8fbce4e03f3120d1d65","other":"2abb938b889a2eb735134462985a56056be48f189b5b89d23b653864c76427f4","up":true},{"one":"2abb938b889a2eb735134462985a56056be48f189b5b89d23b653864c76427f4","other":"16725e318322353befc2f2aba112f0984bc011821bb16c98e2cd8b39cd62aea1","up":true},{"one":"16725e318322353befc2f2aba112f0984bc011821bb16c98e2cd8b39cd62aea1","other":"03285e06657032778feff0b43828c964dbf9de669f63171aeb587aa1a1facc0a","up":true},{"one":"03285e06657032778feff0b43828c964dbf9de669f63171aeb587aa1a1facc0a","other":"21a044e772b7c955fe4a6fb7c3a9a20e95d48b7fd6b9518741782f04f5f1f5c2","up":true},{"one":"21a044e772b7c955fe4a6fb7c3a9a20e95d48b7fd6b9518741782f04f5f1f5c2","other":"f31cc744ea921fee8364c5269b1ce7ec6b5f0c0cbb6885efbf602de5b36f6169","up":true},{"one":"f31cc744ea921fee8364c5269b1ce7ec6b5f0c0cbb6885efbf602de5b36f6169","other":"c1f9e8e1d509febdf1f267bb227741e513420048a2e669ac9eef4b05a29cf10b","up":true},{"one":"c1f9e8e1d509febdf1f267bb227741e513420048a2e669ac9eef4b05a29cf10b","other":"f773b83f1a1de2ab6660edb0b765cfccec6778061ee25c5a84f968625686ef60","up":true},{"one":"f773b83f1a1de2ab6660edb0b765cfccec6778061ee25c5a84f968625686ef60","other":"7dc2a9573f253f362ef1b21bbfcc144b11a6febc58aa3c4430224160e9fa738c","up":true},{"one":"7dc2a9573f253f362ef1b21bbfcc144b11a6febc58aa3c4430224160e9fa738c","other":"045ba8da4641da3f0b8058bb0d9d8aafbb81496dc1cae2a3fd9c039a7e1cafb6","up":true},{"one":"045ba8da4641da3f0b8058bb0d9d8aafbb81496dc1cae2a3fd9c039a7e1cafb6","other":"9890e6ebb2c6f9a7bec4c2778e077e3710ce3af356f82ae9b4d324832d159ef7","up":true},{"one":"9890e6ebb2c6f9a7bec4c2778e077e3710ce3af356f82ae9b4d324832d159ef7","other":"775e7be502df8fd938cf9c42ee4fac33e460a4b6992b9efeb8dc1ff7dde5c40f","up":true},{"one":"775e7be502df8fd938cf9c42ee4fac33e460a4b6992b9efeb8dc1ff7dde5c40f","other":"738c2d42458965d03c8f9f055eaf0e3edf3dfa2a4de0a048ec05b78e7b765c90","up":true},{"one":"738c2d42458965d03c8f9f055eaf0e3edf3dfa2a4de0a048ec05b78e7b765c90","other":"e7fa7112adc7b023dd5965e620277122542153f87eaf5deeacc8a51f1778ba77","up":true},{"one":"e7fa7112adc7b023dd5965e620277122542153f87eaf5deeacc8a51f1778ba77","other":"f45f1f2e59e947e04fa15bcf87f872ef6d73b73f778e12d1f9b8930ea166eefc","up":true},{"one":"f45f1f2e59e947e04fa15bcf87f872ef6d73b73f778e12d1f9b8930ea166eefc","other":"19faaf891eb6a716902ec29d201dc2094ee474acff188ae86faf9760674b2d37","up":true},{"one":"19faaf891eb6a716902ec29d201dc2094ee474acff188ae86faf9760674b2d37","other":"67dcfd21ece30b41a39bc55c0986fca8f401bb3acba821969519f09d0933e8bd","up":true},{"one":"67dcfd21ece30b41a39bc55c0986fca8f401bb3acba821969519f09d0933e8bd","other":"af02b5d107b3a17f539c7f9020ebe74322434634e70c420a7f56776eb5d9db73","up":true},{"one":"af02b5d107b3a17f539c7f9020ebe74322434634e70c420a7f56776eb5d9db73","other":"6251e9540448726a601699ef4cd19e50c969a746da27228967338cdc09d628bf","up":true},{"one":"6251e9540448726a601699ef4cd19e50c969a746da27228967338cdc09d628bf","other":"3efc4b120b3eeeac186bf3a4cd42eb8c647f7edb08c23ee643e2bec9d72c5bed","up":true},{"one":"3efc4b120b3eeeac186bf3a4cd42eb8c647f7edb08c23ee643e2bec9d72c5bed","other":"6ea51fb6e4783f351dbbfa47b508c78c73233ebaada409dfb55446217f92c4bd","up":true},{"one":"6ea51fb6e4783f351dbbfa47b508c78c73233ebaada409dfb55446217f92c4bd","other":"0c28cd1315890629896d0fe5517524d4eb788f7444709c135ea690ba4e6103d5","up":true},{"one":"0c28cd1315890629896d0fe5517524d4eb788f7444709c135ea690ba4e6103d5","other":"6967e7438125c2045d575eb9f407b4a38d1bf9dcd1c1c1a97f750da6a21aeff7","up":true},{"one":"6967e7438125c2045d575eb9f407b4a38d1bf9dcd1c1c1a97f750da6a21aeff7","other":"849bcbb9be43b799fefc5e689efc75125da27f536e97e5b7921031520ae6e5d8","up":true},{"one":"849bcbb9be43b799fefc5e689efc75125da27f536e97e5b7921031520ae6e5d8","other":"b89793c3ccd9ea642080728732ce7df33778653fed3d1d8f3a25e60670e33325","up":true},{"one":"b89793c3ccd9ea642080728732ce7df33778653fed3d1d8f3a25e60670e33325","other":"3ec530761ddb87f930fda919be67df18074c6f0795292add1b2a91ff3d9c39e3","up":true},{"one":"3ec530761ddb87f930fda919be67df18074c6f0795292add1b2a91ff3d9c39e3","other":"524db81b135af8dc309b942c082a7291dddb851866fc608753f937ee77015be0","up":true},{"one":"524db81b135af8dc309b942c082a7291dddb851866fc608753f937ee77015be0","other":"b95d88ff6512ef8eaaa6bd842fa44175c1484fc2e8601b83d50a5ffa992bfa3a","up":true},{"one":"b95d88ff6512ef8eaaa6bd842fa44175c1484fc2e8601b83d50a5ffa992bfa3a","other":"4c9eab8ab45405a6d4bab46430efc04b8e6aec1d944f88435eca41361925f379","up":true},{"one":"4c9eab8ab45405a6d4bab46430efc04b8e6aec1d944f88435eca41361925f379","other":"ee5e77df690329c132f2f7fca223cfd384b7bc34ec38763a4eb42780e0585656","up":true},{"one":"ee5e77df690329c132f2f7fca223cfd384b7bc34ec38763a4eb42780e0585656","other":"68317431e4fa55be4a700e35c6a578307cc32b72336679b5c5618b622ef0c602","up":true},{"one":"68317431e4fa55be4a700e35c6a578307cc32b72336679b5c5618b622ef0c602","other":"3b88a472beba4a18f8df45678888fd359bac3823900eecfe0037fdc9ad54d416","up":true},{"one":"3b88a472beba4a18f8df45678888fd359bac3823900eecfe0037fdc9ad54d416","other":"44a10530c376b215baff8531eeb2afb8d6714c4d0350d1a6f32761a97cd6c7ec","up":true},{"one":"44a10530c376b215baff8531eeb2afb8d6714c4d0350d1a6f32761a97cd6c7ec","other":"7e0458ecdf7081443cab5412529f3948ece659facaca03208496c80dd136e704","up":true},{"one":"7e0458ecdf7081443cab5412529f3948ece659facaca03208496c80dd136e704","other":"f5dc78ff71a63fc2014b9553723ee676c63fc078a32a46b7cb172f357a118140","up":true},{"one":"f5dc78ff71a63fc2014b9553723ee676c63fc078a32a46b7cb172f357a118140","other":"a6fbe16b81d240ff2f2ed6c93cfd9590731dfb2e7ec3fce1c098fe542bedf299","up":true},{"one":"a6fbe16b81d240ff2f2ed6c93cfd9590731dfb2e7ec3fce1c098fe542bedf299","other":"ed2d3e1e5693b44494808907c98ec54d6d08331945d2a2c03e31130fef1d2586","up":true},{"one":"ed2d3e1e5693b44494808907c98ec54d6d08331945d2a2c03e31130fef1d2586","other":"6c4dcdfdee0164a9a3f419430726dd51f9198c65ff6e7de7aaa6f632dcde6794","up":true},{"one":"6c4dcdfdee0164a9a3f419430726dd51f9198c65ff6e7de7aaa6f632dcde6794","other":"efeae3b7f610dc10acc51068e7718876d147cd78a9a28788c5dba5bb3a6950dc","up":true},{"one":"efeae3b7f610dc10acc51068e7718876d147cd78a9a28788c5dba5bb3a6950dc","other":"96fcf14c7f90350091ac6fcb58306ccfb9e4a38d3da59f8ab656854332844cbd","up":true},{"one":"96fcf14c7f90350091ac6fcb58306ccfb9e4a38d3da59f8ab656854332844cbd","other":"0de3915b0bcc68040c8aa76fbd2cfa0714e9b34c9dbe0838a7cba81c4f73581c","up":true},{"one":"0de3915b0bcc68040c8aa76fbd2cfa0714e9b34c9dbe0838a7cba81c4f73581c","other":"e027a9f7152641c4a41154f8ce4dafd23895c312150efea86bf4152c88d0ca86","up":true},{"one":"e027a9f7152641c4a41154f8ce4dafd23895c312150efea86bf4152c88d0ca86","other":"d1d719ce1dca507598449afe966396c160ad25ad632112ab268b1d913b490dbd","up":true},{"one":"d1d719ce1dca507598449afe966396c160ad25ad632112ab268b1d913b490dbd","other":"1c8a10ecbd72acb2bbbb8b77ea5404f9e90f4dbf306ec8134cfed70b40aef399","up":true},{"one":"1c8a10ecbd72acb2bbbb8b77ea5404f9e90f4dbf306ec8134cfed70b40aef399","other":"17db15893bf39b42593ee1de975aba6832046d9da5b4b493ec44272738a29cef","up":true},{"one":"17db15893bf39b42593ee1de975aba6832046d9da5b4b493ec44272738a29cef","other":"455936fd22c43794e6e2104fd91d3f5d246e3823e8ff8eaf8dc27aa9f3d2ee08","up":true},{"one":"455936fd22c43794e6e2104fd91d3f5d246e3823e8ff8eaf8dc27aa9f3d2ee08","other":"1436aaa8770e9f1c6294e49f4066c16b1caa50524e9b8fd058059e41657d2a83","up":true},{"one":"1436aaa8770e9f1c6294e49f4066c16b1caa50524e9b8fd058059e41657d2a83","other":"378e7af7cc019186d4f2699e753e2d71302f8f3565572c13b7a1b1c5cb47443c","up":true},{"one":"378e7af7cc019186d4f2699e753e2d71302f8f3565572c13b7a1b1c5cb47443c","other":"c6cf46239078edfb343c645f039725fdee1bbba8b0a6da02e2cc456b9223c9a2","up":true},{"one":"c6cf46239078edfb343c645f039725fdee1bbba8b0a6da02e2cc456b9223c9a2","other":"f4e09f89287bd1af7833acd85ba7cc71fdb3ff34f2f409e1cf2a878dcd3183dc","up":true},{"one":"f4e09f89287bd1af7833acd85ba7cc71fdb3ff34f2f409e1cf2a878dcd3183dc","other":"d29941d6b8acd86cf32fd1c2181da3ab1da3c2083134b068ca49ce29aa86b783","up":true},{"one":"d29941d6b8acd86cf32fd1c2181da3ab1da3c2083134b068ca49ce29aa86b783","other":"6f2d756566dd5b4a13ffeea9f687c785148f3407a502e28b9d6edfd03b905fdc","up":true},{"one":"6f2d756566dd5b4a13ffeea9f687c785148f3407a502e28b9d6edfd03b905fdc","other":"07a8c900fec6c477580ed5b38848a8681dc52a19e59fa4cd32f571fe7fb2383a","up":true},{"one":"07a8c900fec6c477580ed5b38848a8681dc52a19e59fa4cd32f571fe7fb2383a","other":"24b85c10f098725938ea7d87cd24a4b10358129906fca9790fc266ea8784b538","up":true},{"one":"24b85c10f098725938ea7d87cd24a4b10358129906fca9790fc266ea8784b538","other":"1f85b8c05e5dceff0bd8256f8f6d80d4b902a9754ceb952d95ea2e1150ef9e59","up":true},{"one":"1f85b8c05e5dceff0bd8256f8f6d80d4b902a9754ceb952d95ea2e1150ef9e59","other":"77d2ec52dabd5d7f326d4c6afd2aad110487c6bdffa2984060528716ba873462","up":true},{"one":"77d2ec52dabd5d7f326d4c6afd2aad110487c6bdffa2984060528716ba873462","other":"256e81c5a6fb43bd343345477f8f96aa1947f07ac3297f631ab03f060147b062","up":true},{"one":"256e81c5a6fb43bd343345477f8f96aa1947f07ac3297f631ab03f060147b062","other":"8025c1fcb98e53f92767d1d43a3057a0acd1e8994bb4a7e3f5e244110e0dcf91","up":true},{"one":"8025c1fcb98e53f92767d1d43a3057a0acd1e8994bb4a7e3f5e244110e0dcf91","other":"4636f00be60a9b494a3ebc9ab41cc7cb53ec0b0beff214db2d0a248dc3aeb6af","up":true},{"one":"4636f00be60a9b494a3ebc9ab41cc7cb53ec0b0beff214db2d0a248dc3aeb6af","other":"b2b5ba1bb188f18f79b295f2c0d48c52c1d1d449ecb9b94b9984f3a6179732c7","up":true},{"one":"b2b5ba1bb188f18f79b295f2c0d48c52c1d1d449ecb9b94b9984f3a6179732c7","other":"fe2167fd33f383110eb3f6caa7bd905ca54fa0c810f1b8a34483a846f3cbddab","up":true},{"one":"fe2167fd33f383110eb3f6caa7bd905ca54fa0c810f1b8a34483a846f3cbddab","other":"c26fd5e6504c7b3f0a6d9133ff87c98c110eb1c201c5f3bcf6b10653f2b972d2","up":true},{"one":"c26fd5e6504c7b3f0a6d9133ff87c98c110eb1c201c5f3bcf6b10653f2b972d2","other":"574f65867482091aee2774033116c233525eea711706b5ae9ba09b54e896d302","up":true},{"one":"574f65867482091aee2774033116c233525eea711706b5ae9ba09b54e896d302","other":"db6a1f6b342f6be9517f8df01003797c11c837d9aee3cdba5b7859230b36c35d","up":true},{"one":"db6a1f6b342f6be9517f8df01003797c11c837d9aee3cdba5b7859230b36c35d","other":"c43fbee95380007274b8f231fe34bcd59b5c0ef0830b174967d4702627984fc6","up":true},{"one":"c43fbee95380007274b8f231fe34bcd59b5c0ef0830b174967d4702627984fc6","other":"b5025d153581d333b44df4b9bfa69d87de138905172e4fd317e16f7099a5fcf8","up":true},{"one":"b5025d153581d333b44df4b9bfa69d87de138905172e4fd317e16f7099a5fcf8","other":"f528aaafd67b20dafdce101db224aa01c70f93bdc91c14f50fa8db1dbf9fc386","up":true},{"one":"f528aaafd67b20dafdce101db224aa01c70f93bdc91c14f50fa8db1dbf9fc386","other":"976e57d0c32227222bfd0cbb802f269bdcd52d5d33cf689c66b12c023f5fa8bf","up":true},{"one":"976e57d0c32227222bfd0cbb802f269bdcd52d5d33cf689c66b12c023f5fa8bf","other":"7290cd3affade5f9e729d1b03549aceafb2576cdbc6789fd688c95495f10bacd","up":true},{"one":"7290cd3affade5f9e729d1b03549aceafb2576cdbc6789fd688c95495f10bacd","other":"82f9c9009f09de2d6a77b54976d14c14211eae65d886f6ed57560c700716dd5c","up":true},{"one":"82f9c9009f09de2d6a77b54976d14c14211eae65d886f6ed57560c700716dd5c","other":"67aa5463e4b32b363b3d01d2a41ccb03199411057276f4962d053160be29a6ef","up":true},{"one":"67aa5463e4b32b363b3d01d2a41ccb03199411057276f4962d053160be29a6ef","other":"49cd1efed6a56a78af4ea4ab40813013e76c6a5fb9d2029ee02db5d80f5e41a6","up":true},{"one":"49cd1efed6a56a78af4ea4ab40813013e76c6a5fb9d2029ee02db5d80f5e41a6","other":"46fee69dad8b6a6a87d356d10db25d835a0c4e154bf179e88fb4cc65f97d72d7","up":true},{"one":"46fee69dad8b6a6a87d356d10db25d835a0c4e154bf179e88fb4cc65f97d72d7","other":"4a8b610e09d35aa21c42ab8c3e38de600a944c094e6b86ea56828b5e6904f1f7","up":true},{"one":"4a8b610e09d35aa21c42ab8c3e38de600a944c094e6b86ea56828b5e6904f1f7","other":"478278187cd9af799e83340a2f49b0b7f122fb8e08c0a372a87795426eab364b","up":true},{"one":"478278187cd9af799e83340a2f49b0b7f122fb8e08c0a372a87795426eab364b","other":"da67ace34f7076a1d550bc61bc2a31da88d6cd9f9df43b142a8c6bbade1b4aee","up":true},{"one":"da67ace34f7076a1d550bc61bc2a31da88d6cd9f9df43b142a8c6bbade1b4aee","other":"ca041da0dc514643d017458d08ff6962ec52c9e66571a239ec395dc8b2546709","up":true},{"one":"ca041da0dc514643d017458d08ff6962ec52c9e66571a239ec395dc8b2546709","other":"60d7337ef806be95ccaf7b9d663a4289f9afc68edced62904ab50601cf113f45","up":true},{"one":"60d7337ef806be95ccaf7b9d663a4289f9afc68edced62904ab50601cf113f45","other":"0d8a919207fb2d5718eab7da95f8efeb01a4e1ae39602d315f8ba2ff1752d9da","up":true},{"one":"0d8a919207fb2d5718eab7da95f8efeb01a4e1ae39602d315f8ba2ff1752d9da","other":"140020a23a840b8840ba0c2c384f853a606330e9743885e9967cf49533db282e","up":true},{"one":"140020a23a840b8840ba0c2c384f853a606330e9743885e9967cf49533db282e","other":"7b90e939ae2a240f0d74a923afb6bbf11f6d5b99a7bf85f1825b1ea36bce744c","up":true},{"one":"7b90e939ae2a240f0d74a923afb6bbf11f6d5b99a7bf85f1825b1ea36bce744c","other":"02d85b9f8e4776224ae5088683a87837b82b2bfb7e047cf373a28393e7aca6e1","up":true},{"one":"02d85b9f8e4776224ae5088683a87837b82b2bfb7e047cf373a28393e7aca6e1","other":"e54784cfbcd89c37c8f758aae70ece3ab4b7f8c30fb4ef7543e04aa89ff4386b","up":true},{"one":"e54784cfbcd89c37c8f758aae70ece3ab4b7f8c30fb4ef7543e04aa89ff4386b","other":"45584a4bebb948ef5f7b55d4846ec5549d7623682169c0edcab5b3523e68c7da","up":true},{"one":"45584a4bebb948ef5f7b55d4846ec5549d7623682169c0edcab5b3523e68c7da","other":"1b830ed484b274a96ec7ba2f9a42b6859412b5334a564014ff3f11597ea3a32d","up":true},{"one":"1b830ed484b274a96ec7ba2f9a42b6859412b5334a564014ff3f11597ea3a32d","other":"5b632eaf700d173ff15f4727b85817e6173228c304b422434a08c2cad438b825","up":true},{"one":"5b632eaf700d173ff15f4727b85817e6173228c304b422434a08c2cad438b825","other":"512ec5c2e6b4d788482462d941117c81fcc0e73f0c15545794dd1b4e03bf2102","up":true},{"one":"512ec5c2e6b4d788482462d941117c81fcc0e73f0c15545794dd1b4e03bf2102","other":"c786ff8667f509b5a9519984c1d95c83a5d2e257500a71429e8f23af610ce771","up":true},{"one":"c786ff8667f509b5a9519984c1d95c83a5d2e257500a71429e8f23af610ce771","other":"7a608d2cf9d1d9c5819dc1f9e88e5cb2852aadea01c40e047c2e184b62e7163c","up":true},{"one":"7a608d2cf9d1d9c5819dc1f9e88e5cb2852aadea01c40e047c2e184b62e7163c","other":"e5ada0415c92ef1511b15d04edf395976464afd9adc3e929c41d4d21d25e3182","up":true},{"one":"e5ada0415c92ef1511b15d04edf395976464afd9adc3e929c41d4d21d25e3182","other":"30bec7cd0a7d002839aed7654129bd2fe2e2ce7f42aa7bae1560e8bf718954c3","up":true},{"one":"30bec7cd0a7d002839aed7654129bd2fe2e2ce7f42aa7bae1560e8bf718954c3","other":"6fe9a02e950a5c3a5ff026b75922ed687d59795ba8eb9c092a8d09a5c64d2453","up":true},{"one":"6fe9a02e950a5c3a5ff026b75922ed687d59795ba8eb9c092a8d09a5c64d2453","other":"b626d472b555e6f950a7142783db8deb443a74e63ef6bd72a87eaf1af14ca805","up":true},{"one":"b626d472b555e6f950a7142783db8deb443a74e63ef6bd72a87eaf1af14ca805","other":"d7aca8f2182bc625d2b3c942bd1161c85bcf1c2b34ecbe3e2fd23cfae6b8a871","up":true},{"one":"d7aca8f2182bc625d2b3c942bd1161c85bcf1c2b34ecbe3e2fd23cfae6b8a871","other":"4ac755123dcc64ef44db9280311af51f3f7a93e0dee67370d673261220356eb9","up":true},{"one":"4ac755123dcc64ef44db9280311af51f3f7a93e0dee67370d673261220356eb9","other":"c59e3953b64e5b9ffbe53990a358914f2fa8e3551d33f92b9e3a441bd1baf2cd","up":true},{"one":"c59e3953b64e5b9ffbe53990a358914f2fa8e3551d33f92b9e3a441bd1baf2cd","other":"47bfa3767cefcc0831d410d5402e9396e8a412c8c96faf55b451d3ff310f3b02","up":true},{"one":"47bfa3767cefcc0831d410d5402e9396e8a412c8c96faf55b451d3ff310f3b02","other":"53a885968d68d8ebf7ed514e662cc13fa03186d2361000a03576531fdca2a25f","up":true},{"one":"53a885968d68d8ebf7ed514e662cc13fa03186d2361000a03576531fdca2a25f","other":"e8efe8016fe6cf649b2755bee22da35ccc6c9c55d404d5385d61f6ea27b84380","up":true},{"one":"e8efe8016fe6cf649b2755bee22da35ccc6c9c55d404d5385d61f6ea27b84380","other":"d640472351969a5578e541aca72b7640c583b995fd62607ff3ee3f3f3139aafd","up":true},{"one":"d640472351969a5578e541aca72b7640c583b995fd62607ff3ee3f3f3139aafd","other":"c49caff13862dc089f1f9b8180d6efa455648375662719272102c4f8028799d6","up":true},{"one":"c49caff13862dc089f1f9b8180d6efa455648375662719272102c4f8028799d6","other":"caf6a8e37fd41c1e6ad77a8575cd90354bb1693893952301c9caeb4779c338d3","up":true},{"one":"caf6a8e37fd41c1e6ad77a8575cd90354bb1693893952301c9caeb4779c338d3","other":"b5b24532d2810e311e10b1d606baf6007f9124b88a178b32713cf1eddae089be","up":true},{"one":"b5b24532d2810e311e10b1d606baf6007f9124b88a178b32713cf1eddae089be","other":"88fefb7506105c0e269baf52955a01b19f55504b13133bac0beab41c9f6e6942","up":true},{"one":"88fefb7506105c0e269baf52955a01b19f55504b13133bac0beab41c9f6e6942","other":"37801e8d7d46143f78924ed66099f658a94d37edfd2f58d02acb85add03e1894","up":true},{"one":"37801e8d7d46143f78924ed66099f658a94d37edfd2f58d02acb85add03e1894","other":"915d7a0510bad19266eef8f00ca0cb2efc340253775706495fca8b9160b512cc","up":true},{"one":"915d7a0510bad19266eef8f00ca0cb2efc340253775706495fca8b9160b512cc","other":"6e05179dc90a8f6654d0c9a3f06173371dcfb18b852fdd77f35f75e38f273125","up":true},{"one":"6e05179dc90a8f6654d0c9a3f06173371dcfb18b852fdd77f35f75e38f273125","other":"f2d5533eed4b0c184952d859d67e44abe5a75a5de6111c8c106b8f4b2d8ccfc4","up":true},{"one":"f2d5533eed4b0c184952d859d67e44abe5a75a5de6111c8c106b8f4b2d8ccfc4","other":"444722a15b01a0d8e6794798d239fe621d59bdfc08823ab47cbd8b9acebd23b4","up":true},{"one":"444722a15b01a0d8e6794798d239fe621d59bdfc08823ab47cbd8b9acebd23b4","other":"c441d27a5f4abaa8e3b0f040a6ef85bb8c970031d6a57503a674e36b3d6915d9","up":true},{"one":"c441d27a5f4abaa8e3b0f040a6ef85bb8c970031d6a57503a674e36b3d6915d9","other":"baf219e9229921b773d1ad7eb7eb5216cfa60ccecaa3c5c487e3b71cb600ba12","up":true},{"one":"baf219e9229921b773d1ad7eb7eb5216cfa60ccecaa3c5c487e3b71cb600ba12","other":"2ccfb5b1f3923d35fef88838c508b98b5516c5d409643881d2304ae49e50eed3","up":true},{"one":"2ccfb5b1f3923d35fef88838c508b98b5516c5d409643881d2304ae49e50eed3","other":"217f9952af1eb58d5ca5ac7be763716cfe2c0a4f3cdd4ebe4b5df563f919e2d2","up":true},{"one":"217f9952af1eb58d5ca5ac7be763716cfe2c0a4f3cdd4ebe4b5df563f919e2d2","other":"0438f567045d4556a0e7a697028d689ecfd0ae20f9e85c09b48d9f1fd0ee4765","up":true},{"one":"0438f567045d4556a0e7a697028d689ecfd0ae20f9e85c09b48d9f1fd0ee4765","other":"959fda0866d3c18e9399e98485d627044079d6f86b075edaea9315402f5d9395","up":true},{"one":"959fda0866d3c18e9399e98485d627044079d6f86b075edaea9315402f5d9395","other":"b65ee2549536a806ceef4a7ccc9544567cafe6204080929fc847df0a3781ccc9","up":true},{"one":"b65ee2549536a806ceef4a7ccc9544567cafe6204080929fc847df0a3781ccc9","other":"0cf596af91eb9b041fe6dbe6b288c5730413850321b5ab176c81447e34ef79c5","up":true},{"one":"0cf596af91eb9b041fe6dbe6b288c5730413850321b5ab176c81447e34ef79c5","other":"e5d794d64003725a74642f097c0ee76706d78419b6f3ea819d440bc0ad166eac","up":true},{"one":"e5d794d64003725a74642f097c0ee76706d78419b6f3ea819d440bc0ad166eac","other":"ec52270604007673d1bfda1edbd8bfa945a21141efd85e42b684a9f30f8cddae","up":true},{"one":"ec52270604007673d1bfda1edbd8bfa945a21141efd85e42b684a9f30f8cddae","other":"63370e288ab2e4b8403c6678e9c44ae5c7496b5ead614306fceb85986ed29d18","up":true},{"one":"63370e288ab2e4b8403c6678e9c44ae5c7496b5ead614306fceb85986ed29d18","other":"f7fa2986ec9f84822b11a6b00bd03a1dd26f2a0fab90b1b308f08caead43cfe1","up":true},{"one":"f7fa2986ec9f84822b11a6b00bd03a1dd26f2a0fab90b1b308f08caead43cfe1","other":"03ccd8d52597d18c0b178ab7361d847d63aad3af920a28345977ae170a1dafcd","up":true},{"one":"03ccd8d52597d18c0b178ab7361d847d63aad3af920a28345977ae170a1dafcd","other":"1c47ad5bd8846f777daf59587feccc308f4dc63f6d27b1385ff8085c75bb1aac","up":true},{"one":"1c47ad5bd8846f777daf59587feccc308f4dc63f6d27b1385ff8085c75bb1aac","other":"5f00b3bebef2f5484ff1386298add68a6743a106200ae8a13a27dbb52714ee8f","up":true},{"one":"5f00b3bebef2f5484ff1386298add68a6743a106200ae8a13a27dbb52714ee8f","other":"0743bcf2aaa77e916f4a367d6159473c7d80f46a2e4cbe9ef346e423d39d7072","up":true},{"one":"0743bcf2aaa77e916f4a367d6159473c7d80f46a2e4cbe9ef346e423d39d7072","other":"a653302730df3d58f796906a93933aa81494f2588d9485ab7676ec3b0ccbb426","up":true},{"one":"a653302730df3d58f796906a93933aa81494f2588d9485ab7676ec3b0ccbb426","other":"30897492824b19540d13ef17c70845be6dde455dca4e4f84cfca14a2c373969f","up":true},{"one":"30897492824b19540d13ef17c70845be6dde455dca4e4f84cfca14a2c373969f","other":"0c64e5af869b1665fd4016ae6d04c8eedd423636f06d78ecb944ee8e3272a82a","up":true},{"one":"0c64e5af869b1665fd4016ae6d04c8eedd423636f06d78ecb944ee8e3272a82a","other":"f629b8b9e79c75ac559daf9bf4fc8672bfdd595cf2c5d17a8885282626fc65a5","up":true},{"one":"f629b8b9e79c75ac559daf9bf4fc8672bfdd595cf2c5d17a8885282626fc65a5","other":"20aeb14f567dd16f06b0d3b589b83283daa00a5ed10e447860bda946baccdd2d","up":true},{"one":"20aeb14f567dd16f06b0d3b589b83283daa00a5ed10e447860bda946baccdd2d","other":"2a0a8eaf1a2749e68f8b841578c160699cf7907ff23842c6d616ad884e5f613e","up":true},{"one":"2a0a8eaf1a2749e68f8b841578c160699cf7907ff23842c6d616ad884e5f613e","other":"1a2a0e0bbf83cd40936995674418ae469aa2b92876a4ceeabd8128f536b7d7a2","up":true},{"one":"1a2a0e0bbf83cd40936995674418ae469aa2b92876a4ceeabd8128f536b7d7a2","other":"9d0f804849b72397646ba48208ba1e01dcf4de04e788016c4a1a0c93e650ddf5","up":true},{"one":"9d0f804849b72397646ba48208ba1e01dcf4de04e788016c4a1a0c93e650ddf5","other":"df1e4e46e8ec26cad74b4f35ab070f12c8f6fddca35ac44c1218ff60fe1e6bab","up":true},{"one":"df1e4e46e8ec26cad74b4f35ab070f12c8f6fddca35ac44c1218ff60fe1e6bab","other":"1f670c53b4c597beaffacd84e3a697225b04cded9219d0a28e1fe525a3cadcf5","up":true},{"one":"1f670c53b4c597beaffacd84e3a697225b04cded9219d0a28e1fe525a3cadcf5","other":"d863ba7405eb07ccddbf1d34efbcbec2867a93a109ed9413d9aecf30d3645a6a","up":true},{"one":"d863ba7405eb07ccddbf1d34efbcbec2867a93a109ed9413d9aecf30d3645a6a","other":"2d3645c4fdf9a2809a909076b9ee5fb98fa880f6faeff914f1a2987af928cd79","up":true},{"one":"2d3645c4fdf9a2809a909076b9ee5fb98fa880f6faeff914f1a2987af928cd79","other":"6ecb5c36fc0150c287446ae8a8682d629a1d39341230717206219babe3bdf659","up":true},{"one":"6ecb5c36fc0150c287446ae8a8682d629a1d39341230717206219babe3bdf659","other":"21012a3a6ef1ece48fd9d7cffe62dc75839dd062efcf3ac5f962c237814da407","up":true},{"one":"21012a3a6ef1ece48fd9d7cffe62dc75839dd062efcf3ac5f962c237814da407","other":"17040a3aad5930d8e0de1011fd2996b7d09225989f0dc1ae8f7e7a52dd26ab4e","up":true},{"one":"17040a3aad5930d8e0de1011fd2996b7d09225989f0dc1ae8f7e7a52dd26ab4e","other":"04518d7120fa8a528d983ca1ee6d5d09ba24a4e853fb22bc9084cdf34995e95f","up":true},{"one":"04518d7120fa8a528d983ca1ee6d5d09ba24a4e853fb22bc9084cdf34995e95f","other":"610334a0772d3414652b575f2caa6f2db32224907c24d06fda643db9f2ec2afe","up":true},{"one":"610334a0772d3414652b575f2caa6f2db32224907c24d06fda643db9f2ec2afe","other":"ac4d2d6836e2cdf4c88221f6013aac70a451dd15bc403288bd10d0b911cd9a2b","up":true},{"one":"ac4d2d6836e2cdf4c88221f6013aac70a451dd15bc403288bd10d0b911cd9a2b","other":"ff36a8810dd44f6d1fa42aa91ff6206bcfb4c1ffbab0df73a181daece329e0e3","up":true},{"one":"ff36a8810dd44f6d1fa42aa91ff6206bcfb4c1ffbab0df73a181daece329e0e3","other":"2c3894b6e47cf19ac7ee9fe213196312f676256f670dff25b03563492550bc74","up":true},{"one":"2c3894b6e47cf19ac7ee9fe213196312f676256f670dff25b03563492550bc74","other":"898d2f7d46b4961b646d5a6142d54d6233b7f80f668ce234522dd02e2cc545cb","up":true},{"one":"898d2f7d46b4961b646d5a6142d54d6233b7f80f668ce234522dd02e2cc545cb","other":"18f6e66e1cc8e620808901b571fdf525ee8f41850fac0bd0e5c5a4de70c5f873","up":true},{"one":"18f6e66e1cc8e620808901b571fdf525ee8f41850fac0bd0e5c5a4de70c5f873","other":"2a97d308a720274a440dfa6901ca0a5480af9bab58dd8a6c4afdb9c83ea964c3","up":true},{"one":"2a97d308a720274a440dfa6901ca0a5480af9bab58dd8a6c4afdb9c83ea964c3","other":"29957e8e92925a8c79bdf513295d96bfb62fbfc597ee1cf767c7ef408f1b1295","up":true},{"one":"29957e8e92925a8c79bdf513295d96bfb62fbfc597ee1cf767c7ef408f1b1295","other":"6f5f5a77e6092e25e5308413e02ba62c1c559024893a7fb98e26b0f34fed8bfe","up":true},{"one":"6f5f5a77e6092e25e5308413e02ba62c1c559024893a7fb98e26b0f34fed8bfe","other":"886aff1f1e3b86bfe901066bb7948451c18fe3f8cd1b7318b05154890ca8f738","up":true},{"one":"886aff1f1e3b86bfe901066bb7948451c18fe3f8cd1b7318b05154890ca8f738","other":"5db08436c64f4cc9e2b3950e35bc8ad739825e3efa67a642c771d95b34cb420c","up":true},{"one":"5db08436c64f4cc9e2b3950e35bc8ad739825e3efa67a642c771d95b34cb420c","other":"ad9899f78659492ec248a884927a757f3f3b4e76cd2abc46ad8766251fd8afed","up":true},{"one":"ad9899f78659492ec248a884927a757f3f3b4e76cd2abc46ad8766251fd8afed","other":"c832b4ad64a17da4b796ffcac646c2aa666b276aabb7eb3bfe7981d64a4da402","up":true},{"one":"c832b4ad64a17da4b796ffcac646c2aa666b276aabb7eb3bfe7981d64a4da402","other":"461cc9f064e6f4f06ff38e0d1f3f00ef8807ba31c7258e453cc682e9551bb1c6","up":true},{"one":"461cc9f064e6f4f06ff38e0d1f3f00ef8807ba31c7258e453cc682e9551bb1c6","other":"ef07be559914ec4b5930d90d8d8b6f32dab9eba23acc36f14d512307f9974348","up":true},{"one":"ef07be559914ec4b5930d90d8d8b6f32dab9eba23acc36f14d512307f9974348","other":"006727dc6f59b120b24c17b8e63f80ef3439105f8118ffeed408f105a48ee60c","up":true},{"one":"006727dc6f59b120b24c17b8e63f80ef3439105f8118ffeed408f105a48ee60c","other":"f7baef876a62b92ebe5ca9ec6a085e0eb54fd31e2425e662eec747df3cd77592","up":true},{"one":"f7baef876a62b92ebe5ca9ec6a085e0eb54fd31e2425e662eec747df3cd77592","other":"c9f5acafbbf8c66647de05b0848d79451eee490709d53f118fc2051410cc8203","up":true},{"one":"c9f5acafbbf8c66647de05b0848d79451eee490709d53f118fc2051410cc8203","other":"fe316679eca0e0eb823325812a56fd27da02653b06ada2fd03b27501bda8371a","up":true},{"one":"fe316679eca0e0eb823325812a56fd27da02653b06ada2fd03b27501bda8371a","other":"51db114a52827f5b74088bd0fc87d35229e7740e7d121bd7699298396516a880","up":true},{"one":"51db114a52827f5b74088bd0fc87d35229e7740e7d121bd7699298396516a880","other":"58ed74695bf527bac9a350c86d305e53e08c4999795e11cd3b2a36f5cd25d637","up":true},{"one":"58ed74695bf527bac9a350c86d305e53e08c4999795e11cd3b2a36f5cd25d637","other":"baddc778aea97acdbbb5bc99744a5545abab9f6047c81f328761645287ac391c","up":true},{"one":"baddc778aea97acdbbb5bc99744a5545abab9f6047c81f328761645287ac391c","other":"b7cafed41dac01dd59e2bcaeaaab551ebfeab8eaa1f97c1866fe0ddae772807b","up":true},{"one":"b7cafed41dac01dd59e2bcaeaaab551ebfeab8eaa1f97c1866fe0ddae772807b","other":"ba884e5cfa1ee6eb38217181711e01bb0c37b3e33d1424dfa89ed3e29ef6205b","up":true},{"one":"ba884e5cfa1ee6eb38217181711e01bb0c37b3e33d1424dfa89ed3e29ef6205b","other":"53087084708cc5ee63ac459b18fa10ae52a823139b4ecba6c8691d4934f2f971","up":true},{"one":"53087084708cc5ee63ac459b18fa10ae52a823139b4ecba6c8691d4934f2f971","other":"0e5e0bb1383b2ec569b157a1d2ae6900592ab892a28367f5613a4e29cb265088","up":true},{"one":"0e5e0bb1383b2ec569b157a1d2ae6900592ab892a28367f5613a4e29cb265088","other":"ef1b70bf090bc9994b1d45e2812c56ecb430a89c346a436bd10880bcda700351","up":true},{"one":"ef1b70bf090bc9994b1d45e2812c56ecb430a89c346a436bd10880bcda700351","other":"1e2aca93fa9442a0034ae8d295530dde16fcbfa8c37227e2e6863babb0f87c34","up":true},{"one":"1e2aca93fa9442a0034ae8d295530dde16fcbfa8c37227e2e6863babb0f87c34","other":"e5149cedd990072f2aaa9735a9259f28973c45876660c2d86ac105e56cca8e68","up":true},{"one":"e5149cedd990072f2aaa9735a9259f28973c45876660c2d86ac105e56cca8e68","other":"35e6b1d31f594c06b759525434a7e717ebe6f27ca0188f247ed1247664a50563","up":true},{"one":"35e6b1d31f594c06b759525434a7e717ebe6f27ca0188f247ed1247664a50563","other":"3f946957d910179c7e1a83c44369aacfc31f5727b1a6421a01c8a978ccd349a2","up":true},{"one":"3f946957d910179c7e1a83c44369aacfc31f5727b1a6421a01c8a978ccd349a2","other":"4d103ec5afee559a5a9242e8d650b67301eaec10e96fc2f184e34d48554108a2","up":true},{"one":"4d103ec5afee559a5a9242e8d650b67301eaec10e96fc2f184e34d48554108a2","other":"33737df75bbac1b41c63f05ea2cf1523b972df17f22bda026db84a49ac35e1e3","up":true},{"one":"33737df75bbac1b41c63f05ea2cf1523b972df17f22bda026db84a49ac35e1e3","other":"0b72054403f78a64a787f46e9f26bf0de7bbba5a60cb105e6aeea46cb4a1d9fe","up":true},{"one":"0b72054403f78a64a787f46e9f26bf0de7bbba5a60cb105e6aeea46cb4a1d9fe","other":"90a85cb7363ede161ec21cc89f8b9d4350e566cf10586a66d31b0a8677620aa1","up":true},{"one":"90a85cb7363ede161ec21cc89f8b9d4350e566cf10586a66d31b0a8677620aa1","other":"32371744163f0b3aefd3955dc4877e7eb82b17ef9541c333ca9c0a9f8aec3045","up":true},{"one":"32371744163f0b3aefd3955dc4877e7eb82b17ef9541c333ca9c0a9f8aec3045","other":"3630e05326bacea8fcc739dec42085f845f416ddc698c76ff91f099eb1dc5007","up":true},{"one":"3630e05326bacea8fcc739dec42085f845f416ddc698c76ff91f099eb1dc5007","other":"88a141c607019477c7b120a506285a7218cad2faa038082e0b9ddfcc9cb78d07","up":true},{"one":"88a141c607019477c7b120a506285a7218cad2faa038082e0b9ddfcc9cb78d07","other":"a3693801a91180410cf3e85d7c09ac8054a769e7b1d55c9e7a46850cb8217da0","up":true},{"one":"a3693801a91180410cf3e85d7c09ac8054a769e7b1d55c9e7a46850cb8217da0","other":"41092c852fac630df2a9ca0862716f8e9fb8566c904a49c96389071046bc699d","up":true},{"one":"41092c852fac630df2a9ca0862716f8e9fb8566c904a49c96389071046bc699d","other":"ae2b3876bdbd6388781b65e31de182564c5d81f4511caf96588b1a287760b3dd","up":true},{"one":"ae2b3876bdbd6388781b65e31de182564c5d81f4511caf96588b1a287760b3dd","other":"39d1fcae2d23c775214988251505c577b9ac7b6851558ddf9a437dfe143f3845","up":true},{"one":"39d1fcae2d23c775214988251505c577b9ac7b6851558ddf9a437dfe143f3845","other":"8f2182c2c2d0eeb2e887dbc350ae7257819f536032851ffdf29e7842cb1a62cc","up":true},{"one":"8f2182c2c2d0eeb2e887dbc350ae7257819f536032851ffdf29e7842cb1a62cc","other":"11d43f6ed0ddd5afa5c8a7abf7c62a4fa865b7a25ee295bf1a49701ef3081363","up":true},{"one":"11d43f6ed0ddd5afa5c8a7abf7c62a4fa865b7a25ee295bf1a49701ef3081363","other":"3b78bc987c7c31c94e8ada9b4b11b5db9387fe70dd01ce7f3e976d3bec433dec","up":true},{"one":"3b78bc987c7c31c94e8ada9b4b11b5db9387fe70dd01ce7f3e976d3bec433dec","other":"14dfb8414d17b2df15eaf59571a8cfec99b1fd674561da63ee99af853bda07da","up":true},{"one":"14dfb8414d17b2df15eaf59571a8cfec99b1fd674561da63ee99af853bda07da","other":"d887070a0568282c69e96ce65612ba72d5ea26b5c80671435d6e1ed2c4b49301","up":true},{"one":"d887070a0568282c69e96ce65612ba72d5ea26b5c80671435d6e1ed2c4b49301","other":"0a005eb9c10c5cc9f720cfec2a655811d391671597b4f32d12df291ec76b2c13","up":true},{"one":"0a005eb9c10c5cc9f720cfec2a655811d391671597b4f32d12df291ec76b2c13","other":"0af9a57a2f66835cd3e4e71bc026013a8a99ca337a7b6b6cc34e11d8da212a4f","up":true},{"one":"0af9a57a2f66835cd3e4e71bc026013a8a99ca337a7b6b6cc34e11d8da212a4f","other":"4646fe4c119078738612b44a356089b3c73a08e11cfd910675d211ae6b20b8fd","up":true},{"one":"4646fe4c119078738612b44a356089b3c73a08e11cfd910675d211ae6b20b8fd","other":"bb90464f769a85549c150f861775aa67924c7c651f393f6c70772707376a5c7e","up":true},{"one":"bb90464f769a85549c150f861775aa67924c7c651f393f6c70772707376a5c7e","other":"49eaad68d23dd63ef26029fa3f4e2578f3deca8708bbc838750d8b6dbe9eaa38","up":true},{"one":"49eaad68d23dd63ef26029fa3f4e2578f3deca8708bbc838750d8b6dbe9eaa38","other":"499036eb9d10fc003c903f09ea0ee00c0d27b39564988d67ae111f3473d22f07","up":true},{"one":"499036eb9d10fc003c903f09ea0ee00c0d27b39564988d67ae111f3473d22f07","other":"f5b24a1fd2cd2908b408562f9a265ee1a692b137e770137afa5fdfa07b237221","up":true},{"one":"f5b24a1fd2cd2908b408562f9a265ee1a692b137e770137afa5fdfa07b237221","other":"aeb4c75a57ccfc9ac053a3d363cf7c1e3e201406587769ab6615d5c2f86a5410","up":true},{"one":"aeb4c75a57ccfc9ac053a3d363cf7c1e3e201406587769ab6615d5c2f86a5410","other":"5cd2377226825dc7ea582315cd108d23502df4e9c7c09fc07e7b4aa56440de29","up":true},{"one":"5cd2377226825dc7ea582315cd108d23502df4e9c7c09fc07e7b4aa56440de29","other":"f925c85e6457ac01f0cd6b297155f9d3ae611603890d8f3a45e1396d937f8680","up":true},{"one":"f925c85e6457ac01f0cd6b297155f9d3ae611603890d8f3a45e1396d937f8680","other":"5efb3bfc199f5408f79bd6bd5171b4bf332c68a8e49242eb4f6a589b963565c6","up":true},{"one":"5efb3bfc199f5408f79bd6bd5171b4bf332c68a8e49242eb4f6a589b963565c6","other":"00c6488a842ece7a8b0daf064e405de03a4257d308840ea52bfd48d23f54d895","up":true},{"one":"00c6488a842ece7a8b0daf064e405de03a4257d308840ea52bfd48d23f54d895","other":"bcc6724e54f761361f85147eb102a8d1a1a38810a940ce76b1e361ddcadacaa3","up":true},{"one":"bcc6724e54f761361f85147eb102a8d1a1a38810a940ce76b1e361ddcadacaa3","other":"103b232552b94090232195dc88f84823701f35ae536b5af6dd33fa655a33cbae","up":true},{"one":"103b232552b94090232195dc88f84823701f35ae536b5af6dd33fa655a33cbae","other":"154be9255e9aebd134a914070f5e6f3d4bba079d9ca738b74244db14e1b586dd","up":true},{"one":"154be9255e9aebd134a914070f5e6f3d4bba079d9ca738b74244db14e1b586dd","other":"a46dd535e3bc8f111a8b2ce5594b62e87741c395e8a2b8fbae33edd29cb8caf8","up":true},{"one":"6e68ea86440706a0d73a9508f2247492543163f8fa7e2dc2aa62b74d50261b8b","other":"fbf5e917be45e909697a9393c4778206333cf1dd9a103978e8d71622ca3b1cc8","up":true},{"one":"b02b01a5c37cb05c287a3dc7d04e305de26f8d62dc388542eeb43e97db7b4282","other":"53fe2c13926507a7a6c27d0fb30a2c358c4c7bfa40df8b5fa8ec8986c2450519","up":true},{"one":"53fe2c13926507a7a6c27d0fb30a2c358c4c7bfa40df8b5fa8ec8986c2450519","other":"cc2037c08942a094df12f45831f28e0015fc3ac04d5b8f24ffea9bf3a0b02c39","up":true},{"one":"4e5a46c004e85cf86a02fdfbf2243018825d015debfb9a077a1283d302293b3a","other":"b02b01a5c37cb05c287a3dc7d04e305de26f8d62dc388542eeb43e97db7b4282","up":true},{"one":"605a46991af15cd60e67413c712b99ff8f21173c96a7990f2728ad6cac2bb9d8","other":"13d6cb9316e289923e2d1de7f3c966d0cbabce3acdb8017122944f4abb140912","up":true},{"one":"a34ea2e87d4c12adb27d66c2c95300603ff50415974e000bbcc69a5ae059dbf1","other":"6e68ea86440706a0d73a9508f2247492543163f8fa7e2dc2aa62b74d50261b8b","up":true},{"one":"d3b0dea1dd3ac71e7e4a30941632eec53cb980aa7cb6cdac95042a5400a878c3","other":"a46dd535e3bc8f111a8b2ce5594b62e87741c395e8a2b8fbae33edd29cb8caf8","up":true},{"one":"7dd3078c71087ab88d4d26a962820bcb79b8ce30e91c1f9a69d4bf8d38086960","other":"7125e05bf1bfe6df948c9276b62bc755fc6b0ec8d4ac7724b61ea49591adcf25","up":true},{"one":"0ff2d2c49547eebc96675e0b88073dea5e9091bee1843ffe567127e34486c348","other":"fbf5e917be45e909697a9393c4778206333cf1dd9a103978e8d71622ca3b1cc8","up":true},{"one":"e7fa7112adc7b023dd5965e620277122542153f87eaf5deeacc8a51f1778ba77","other":"19faaf891eb6a716902ec29d201dc2094ee474acff188ae86faf9760674b2d37","up":true},{"one":"b820e480354000c837b1781ec1c493e8776b4834252e6453425ac05b925b5a58","other":"628e7da3359ed6d9dcfbafc7581966e4e09245c321ec78ca75587c9cbb44697f","up":true},{"one":"c620752a083ca1ff0398937235cf964133939452c293c799ce07ff8aa2bde420","other":"e8548b5df15adf0f2a997ff5709827beb5e1d36bb08a2f2d017746d5c0e83fca","up":true},{"one":"534bcaa98cf9192b35b6014c650ae067e74332c015ebb516d63601427d7376b8","other":"628e7da3359ed6d9dcfbafc7581966e4e09245c321ec78ca75587c9cbb44697f","up":true},{"one":"fbf5e917be45e909697a9393c4778206333cf1dd9a103978e8d71622ca3b1cc8","other":"41d9c03e44bec3f84a6139ce40ef1e390530f38ed11860575acfad03a49db095","up":true},{"one":"06618d829a8a7317a98f1a40ecf8864e1c94c4e270a9e4c008229dc7cf937b7e","other":"4bcf4eb531d5ec4b31d99e8354af03f976524c7858a1e7043e9b7055326f0952","up":true},{"one":"0fc59bd04ac9de3195e3c9d0eb573952a5805dd2e7e572078b6e996778adec73","other":"41d9c03e44bec3f84a6139ce40ef1e390530f38ed11860575acfad03a49db095","up":true},{"one":"6c73150490e8be9677c40086de0aefed1939581048e26f4a93f5ca26571a1a8f","other":"daec45eca40f48843b41f70267c07e94996ced829f02710f15354fbe26e177e7","up":true},{"one":"67dcfd21ece30b41a39bc55c0986fca8f401bb3acba821969519f09d0933e8bd","other":"e7fa7112adc7b023dd5965e620277122542153f87eaf5deeacc8a51f1778ba77","up":true},{"one":"f4565dd2c428c03d7a8d5fad87a6dd5f92ae706529eb6152d36fa584e7cdbe4d","other":"82dd83838cb982b89505ef249d353a20e434346dd78b71cd9b809f71d5c112da","up":true},{"one":"4bcf4eb531d5ec4b31d99e8354af03f976524c7858a1e7043e9b7055326f0952","other":"314a3530a5e0c37d5609149b3ae9c2e078573346bd8fce3c769ebaeb31726ec1","up":true},{"one":"e775e9759d4701bd9b43c22f1d1be73c1262b2752bb23cb3857485daf1dcad2d","other":"165f1af67aa1d24569e0bdff61d29b3c39e93250071d8f25b5be6face209ac6a","up":true},{"one":"2f32d54f06989efb6ca5431b74cd759fba05dbef36ecff8fd506e662026af983","other":"1c9caf028df31681b1457a54d4b3ab20009f9fa5bd12417a1ba7efe0c660e6bd","up":true},{"one":"90765b72283f59be4cf9bf7a9e9a22fd6db701c3603cbc0817b4adf2f8e9ce08","other":"3e8efcaf3002522b39065ea30c15426d1eb55916499eff8eb5a814e39d41853c","up":true},{"one":"b2a563ac59bab4dfddf7b6e27b80ee7afdeb2e4295411107903f484bcf9fc4f2","other":"534bcaa98cf9192b35b6014c650ae067e74332c015ebb516d63601427d7376b8","up":true},{"one":"fbc8087a723c564ca0139329902e79748af46699ea7be24d57909a7e8e96f681","other":"b2a563ac59bab4dfddf7b6e27b80ee7afdeb2e4295411107903f484bcf9fc4f2","up":true},{"one":"9890e6ebb2c6f9a7bec4c2778e077e3710ce3af356f82ae9b4d324832d159ef7","other":"7dc2a9573f253f362ef1b21bbfcc144b11a6febc58aa3c4430224160e9fa738c","up":true},{"one":"b911b8e2d72532b7c66ff5f7bffa70f5ddbeea6903a86f9333399f0c4b5f0fe8","other":"2c79af7ea85f96db7897cf8cdb4d002ad2308194e03981876edb8d904ef65137","up":true},{"one":"7920d69cf7e458fce0781ea1a4e07768e1a69f6818090eff0abf0b4a0c2c35f8","other":"e8548b5df15adf0f2a997ff5709827beb5e1d36bb08a2f2d017746d5c0e83fca","up":true},{"one":"1c9caf028df31681b1457a54d4b3ab20009f9fa5bd12417a1ba7efe0c660e6bd","other":"582330d8b8c49331b2aec790dc7325b9cd483fc8129323d31ec429d545042964","up":true},{"one":"f27f1044777e05f3f60165d0d2fc3e7667fe148e0ca7a097805d60b9f61025f7","other":"b820e480354000c837b1781ec1c493e8776b4834252e6453425ac05b925b5a58","up":true},{"one":"4d59cf1aeecf370e94a7a231887450cef97053b9c88a7fd11e210840af070e29","other":"eb98fb45dd5754f24f9df0c9ecbb93932e3d9d7735cd6d0ddd4a8675bb4ef554","up":true},{"one":"738c2d42458965d03c8f9f055eaf0e3edf3dfa2a4de0a048ec05b78e7b765c90","other":"19faaf891eb6a716902ec29d201dc2094ee474acff188ae86faf9760674b2d37","up":true},{"one":"7dbbdeba3731e1ff43072f8cbd86db147761e1b61753eea7024774dbf46914bd","other":"4bcf4eb531d5ec4b31d99e8354af03f976524c7858a1e7043e9b7055326f0952","up":true},{"one":"314a3530a5e0c37d5609149b3ae9c2e078573346bd8fce3c769ebaeb31726ec1","other":"e54b643cbc95d9f5d27ec3760d892b6802981bfabf4f9979267d66259df982c7","up":true},{"one":"c8986871e46f001d15ed8b70f2aa0fea8ae309d5e5671a500f619e3b348c8c15","other":"e775e9759d4701bd9b43c22f1d1be73c1262b2752bb23cb3857485daf1dcad2d","up":true},{"one":"16725e318322353befc2f2aba112f0984bc011821bb16c98e2cd8b39cd62aea1","other":"21a044e772b7c955fe4a6fb7c3a9a20e95d48b7fd6b9518741782f04f5f1f5c2","up":true},{"one":"f45f1f2e59e947e04fa15bcf87f872ef6d73b73f778e12d1f9b8930ea166eefc","other":"67dcfd21ece30b41a39bc55c0986fca8f401bb3acba821969519f09d0933e8bd","up":true},{"one":"582330d8b8c49331b2aec790dc7325b9cd483fc8129323d31ec429d545042964","other":"fbf5e917be45e909697a9393c4778206333cf1dd9a103978e8d71622ca3b1cc8","up":true},{"one":"b89793c3ccd9ea642080728732ce7df33778653fed3d1d8f3a25e60670e33325","other":"524db81b135af8dc309b942c082a7291dddb851866fc608753f937ee77015be0","up":true},{"one":"17db15893bf39b42593ee1de975aba6832046d9da5b4b493ec44272738a29cef","other":"d1d719ce1dca507598449afe966396c160ad25ad632112ab268b1d913b490dbd","up":true},{"one":"2abb938b889a2eb735134462985a56056be48f189b5b89d23b653864c76427f4","other":"21a044e772b7c955fe4a6fb7c3a9a20e95d48b7fd6b9518741782f04f5f1f5c2","up":true},{"one":"e8830f2b2f7d08df15bd33f4b2841d01d9d62c1621234bd6ae86743e52360f3e","other":"850575577d6b420a87aba388af481e0c044c2f75cf29ff934daf5674318a61ba","up":true},{"one":"5f00b3bebef2f5484ff1386298add68a6743a106200ae8a13a27dbb52714ee8f","other":"a653302730df3d58f796906a93933aa81494f2588d9485ab7676ec3b0ccbb426","up":true},{"one":"179f21d2e0421b8056ee9a260bc0985bfa64a52a36d0a8fbce4e03f3120d1d65","other":"16725e318322353befc2f2aba112f0984bc011821bb16c98e2cd8b39cd62aea1","up":true},{"one":"c1f9e8e1d509febdf1f267bb227741e513420048a2e669ac9eef4b05a29cf10b","other":"21a044e772b7c955fe4a6fb7c3a9a20e95d48b7fd6b9518741782f04f5f1f5c2","up":true},{"one":"68317431e4fa55be4a700e35c6a578307cc32b72336679b5c5618b622ef0c602","other":"4c9eab8ab45405a6d4bab46430efc04b8e6aec1d944f88435eca41361925f379","up":true},{"one":"4ac755123dcc64ef44db9280311af51f3f7a93e0dee67370d673261220356eb9","other":"47bfa3767cefcc0831d410d5402e9396e8a412c8c96faf55b451d3ff310f3b02","up":true},{"one":"44a10530c376b215baff8531eeb2afb8d6714c4d0350d1a6f32761a97cd6c7ec","other":"f5dc78ff71a63fc2014b9553723ee676c63fc078a32a46b7cb172f357a118140","up":true},{"one":"6c4dcdfdee0164a9a3f419430726dd51f9198c65ff6e7de7aaa6f632dcde6794","other":"a6fbe16b81d240ff2f2ed6c93cfd9590731dfb2e7ec3fce1c098fe542bedf299","up":true},{"one":"d1d719ce1dca507598449afe966396c160ad25ad632112ab268b1d913b490dbd","other":"0de3915b0bcc68040c8aa76fbd2cfa0714e9b34c9dbe0838a7cba81c4f73581c","up":true},{"one":"d3b0dea1dd3ac71e7e4a30941632eec53cb980aa7cb6cdac95042a5400a878c3","other":"53fe2c13926507a7a6c27d0fb30a2c358c4c7bfa40df8b5fa8ec8986c2450519","up":true},{"one":"a46dd535e3bc8f111a8b2ce5594b62e87741c395e8a2b8fbae33edd29cb8caf8","other":"605a46991af15cd60e67413c712b99ff8f21173c96a7990f2728ad6cac2bb9d8","up":true},{"one":"90765b72283f59be4cf9bf7a9e9a22fd6db701c3603cbc0817b4adf2f8e9ce08","other":"6c73150490e8be9677c40086de0aefed1939581048e26f4a93f5ca26571a1a8f","up":true},{"one":"3e8efcaf3002522b39065ea30c15426d1eb55916499eff8eb5a814e39d41853c","other":"b2a563ac59bab4dfddf7b6e27b80ee7afdeb2e4295411107903f484bcf9fc4f2","up":true},{"one":"b911b8e2d72532b7c66ff5f7bffa70f5ddbeea6903a86f9333399f0c4b5f0fe8","other":"cc2037c08942a094df12f45831f28e0015fc3ac04d5b8f24ffea9bf3a0b02c39","up":true},{"one":"6c73150490e8be9677c40086de0aefed1939581048e26f4a93f5ca26571a1a8f","other":"165f1af67aa1d24569e0bdff61d29b3c39e93250071d8f25b5be6face209ac6a","up":true},{"one":"33b5c521b4208e26414db2e05c9a8ccc001a524d928579d44d2e74d14a56593e","other":"4e5a46c004e85cf86a02fdfbf2243018825d015debfb9a077a1283d302293b3a","up":true},{"one":"c8986871e46f001d15ed8b70f2aa0fea8ae309d5e5671a500f619e3b348c8c15","other":"f27f1044777e05f3f60165d0d2fc3e7667fe148e0ca7a097805d60b9f61025f7","up":true},{"one":"045ba8da4641da3f0b8058bb0d9d8aafbb81496dc1cae2a3fd9c039a7e1cafb6","other":"f773b83f1a1de2ab6660edb0b765cfccec6778061ee25c5a84f968625686ef60","up":true},{"one":"6ea51fb6e4783f351dbbfa47b508c78c73233ebaada409dfb55446217f92c4bd","other":"6967e7438125c2045d575eb9f407b4a38d1bf9dcd1c1c1a97f750da6a21aeff7","up":true},{"one":"849bcbb9be43b799fefc5e689efc75125da27f536e97e5b7921031520ae6e5d8","other":"3ec530761ddb87f930fda919be67df18074c6f0795292add1b2a91ff3d9c39e3","up":true},{"one":"0c28cd1315890629896d0fe5517524d4eb788f7444709c135ea690ba4e6103d5","other":"3efc4b120b3eeeac186bf3a4cd42eb8c647f7edb08c23ee643e2bec9d72c5bed","up":true},{"one":"165f1af67aa1d24569e0bdff61d29b3c39e93250071d8f25b5be6face209ac6a","other":"90765b72283f59be4cf9bf7a9e9a22fd6db701c3603cbc0817b4adf2f8e9ce08","up":true},{"one":"06618d829a8a7317a98f1a40ecf8864e1c94c4e270a9e4c008229dc7cf937b7e","other":"314a3530a5e0c37d5609149b3ae9c2e078573346bd8fce3c769ebaeb31726ec1","up":true},{"one":"fbc8087a723c564ca0139329902e79748af46699ea7be24d57909a7e8e96f681","other":"b820e480354000c837b1781ec1c493e8776b4834252e6453425ac05b925b5a58","up":true},{"one":"850575577d6b420a87aba388af481e0c044c2f75cf29ff934daf5674318a61ba","other":"7dbbdeba3731e1ff43072f8cbd86db147761e1b61753eea7024774dbf46914bd","up":true},{"one":"314a3530a5e0c37d5609149b3ae9c2e078573346bd8fce3c769ebaeb31726ec1","other":"850575577d6b420a87aba388af481e0c044c2f75cf29ff934daf5674318a61ba","up":true},{"one":"41d9c03e44bec3f84a6139ce40ef1e390530f38ed11860575acfad03a49db095","other":"eb98fb45dd5754f24f9df0c9ecbb93932e3d9d7735cd6d0ddd4a8675bb4ef554","up":true},{"one":"82dd83838cb982b89505ef249d353a20e434346dd78b71cd9b809f71d5c112da","other":"e54b643cbc95d9f5d27ec3760d892b6802981bfabf4f9979267d66259df982c7","up":true},{"one":"f4565dd2c428c03d7a8d5fad87a6dd5f92ae706529eb6152d36fa584e7cdbe4d","other":"7dbbdeba3731e1ff43072f8cbd86db147761e1b61753eea7024774dbf46914bd","up":true},{"one":"e54b643cbc95d9f5d27ec3760d892b6802981bfabf4f9979267d66259df982c7","other":"7dbbdeba3731e1ff43072f8cbd86db147761e1b61753eea7024774dbf46914bd","up":true},{"one":"0fc59bd04ac9de3195e3c9d0eb573952a5805dd2e7e572078b6e996778adec73","other":"7dd3078c71087ab88d4d26a962820bcb79b8ce30e91c1f9a69d4bf8d38086960","up":true},{"one":"605a46991af15cd60e67413c712b99ff8f21173c96a7990f2728ad6cac2bb9d8","other":"4e5a46c004e85cf86a02fdfbf2243018825d015debfb9a077a1283d302293b3a","up":true},{"one":"7920d69cf7e458fce0781ea1a4e07768e1a69f6818090eff0abf0b4a0c2c35f8","other":"6c73150490e8be9677c40086de0aefed1939581048e26f4a93f5ca26571a1a8f","up":true},{"one":"03285e06657032778feff0b43828c964dbf9de669f63171aeb587aa1a1facc0a","other":"f31cc744ea921fee8364c5269b1ce7ec6b5f0c0cbb6885efbf602de5b36f6169","up":true},{"one":"16725e318322353befc2f2aba112f0984bc011821bb16c98e2cd8b39cd62aea1","other":"9fa0215e980dc907df4cc47ab4937f36527d78f9837493016fd4fc51e617299c","up":true},{"one":"c620752a083ca1ff0398937235cf964133939452c293c799ce07ff8aa2bde420","other":"eb98fb45dd5754f24f9df0c9ecbb93932e3d9d7735cd6d0ddd4a8675bb4ef554","up":true},{"one":"daec45eca40f48843b41f70267c07e94996ced829f02710f15354fbe26e177e7","other":"165f1af67aa1d24569e0bdff61d29b3c39e93250071d8f25b5be6face209ac6a","up":true},{"one":"0743bcf2aaa77e916f4a367d6159473c7d80f46a2e4cbe9ef346e423d39d7072","other":"1c47ad5bd8846f777daf59587feccc308f4dc63f6d27b1385ff8085c75bb1aac","up":true},{"one":"af02b5d107b3a17f539c7f9020ebe74322434634e70c420a7f56776eb5d9db73","other":"3efc4b120b3eeeac186bf3a4cd42eb8c647f7edb08c23ee643e2bec9d72c5bed","up":true},{"one":"66e7fc2df51f5df8d7329851fe9357d895e9d5dfdc25f8d92bdb10a960f7e15a","other":"82dd83838cb982b89505ef249d353a20e434346dd78b71cd9b809f71d5c112da","up":true},{"one":"0ff2d2c49547eebc96675e0b88073dea5e9091bee1843ffe567127e34486c348","other":"1c9caf028df31681b1457a54d4b3ab20009f9fa5bd12417a1ba7efe0c660e6bd","up":true},{"one":"534bcaa98cf9192b35b6014c650ae067e74332c015ebb516d63601427d7376b8","other":"fbc8087a723c564ca0139329902e79748af46699ea7be24d57909a7e8e96f681","up":true},{"one":"2f32d54f06989efb6ca5431b74cd759fba05dbef36ecff8fd506e662026af983","other":"9852ce267d53106a6e584d6eddb08e0062eb4a422d2a8d39ad6dccaebac552ff","up":true},{"one":"6e68ea86440706a0d73a9508f2247492543163f8fa7e2dc2aa62b74d50261b8b","other":"b02b01a5c37cb05c287a3dc7d04e305de26f8d62dc388542eeb43e97db7b4282","up":true},{"one":"582330d8b8c49331b2aec790dc7325b9cd483fc8129323d31ec429d545042964","other":"eb98fb45dd5754f24f9df0c9ecbb93932e3d9d7735cd6d0ddd4a8675bb4ef554","up":true},{"one":"628e7da3359ed6d9dcfbafc7581966e4e09245c321ec78ca75587c9cbb44697f","other":"82dd83838cb982b89505ef249d353a20e434346dd78b71cd9b809f71d5c112da","up":true},{"one":"4d59cf1aeecf370e94a7a231887450cef97053b9c88a7fd11e210840af070e29","other":"9852ce267d53106a6e584d6eddb08e0062eb4a422d2a8d39ad6dccaebac552ff","up":true},{"one":"1c9caf028df31681b1457a54d4b3ab20009f9fa5bd12417a1ba7efe0c660e6bd","other":"fbf5e917be45e909697a9393c4778206333cf1dd9a103978e8d71622ca3b1cc8","up":true},{"one":"fbf5e917be45e909697a9393c4778206333cf1dd9a103978e8d71622ca3b1cc8","other":"b02b01a5c37cb05c287a3dc7d04e305de26f8d62dc388542eeb43e97db7b4282","up":true},{"one":"67dcfd21ece30b41a39bc55c0986fca8f401bb3acba821969519f09d0933e8bd","other":"775e7be502df8fd938cf9c42ee4fac33e460a4b6992b9efeb8dc1ff7dde5c40f","up":true},{"one":"46fee69dad8b6a6a87d356d10db25d835a0c4e154bf179e88fb4cc65f97d72d7","other":"da67ace34f7076a1d550bc61bc2a31da88d6cd9f9df43b142a8c6bbade1b4aee","up":true},{"one":"17db15893bf39b42593ee1de975aba6832046d9da5b4b493ec44272738a29cef","other":"1436aaa8770e9f1c6294e49f4066c16b1caa50524e9b8fd058059e41657d2a83","up":true},{"one":"775e7be502df8fd938cf9c42ee4fac33e460a4b6992b9efeb8dc1ff7dde5c40f","other":"045ba8da4641da3f0b8058bb0d9d8aafbb81496dc1cae2a3fd9c039a7e1cafb6","up":true},{"one":"738c2d42458965d03c8f9f055eaf0e3edf3dfa2a4de0a048ec05b78e7b765c90","other":"67dcfd21ece30b41a39bc55c0986fca8f401bb3acba821969519f09d0933e8bd","up":true},{"one":"f45f1f2e59e947e04fa15bcf87f872ef6d73b73f778e12d1f9b8930ea166eefc","other":"af02b5d107b3a17f539c7f9020ebe74322434634e70c420a7f56776eb5d9db73","up":true},{"one":"13d6cb9316e289923e2d1de7f3c966d0cbabce3acdb8017122944f4abb140912","other":"33b5c521b4208e26414db2e05c9a8ccc001a524d928579d44d2e74d14a56593e","up":true},{"one":"49cd1efed6a56a78af4ea4ab40813013e76c6a5fb9d2029ee02db5d80f5e41a6","other":"4a8b610e09d35aa21c42ab8c3e38de600a944c094e6b86ea56828b5e6904f1f7","up":true},{"one":"53fe2c13926507a7a6c27d0fb30a2c358c4c7bfa40df8b5fa8ec8986c2450519","other":"13d6cb9316e289923e2d1de7f3c966d0cbabce3acdb8017122944f4abb140912","up":true},{"one":"7290cd3affade5f9e729d1b03549aceafb2576cdbc6789fd688c95495f10bacd","other":"49cd1efed6a56a78af4ea4ab40813013e76c6a5fb9d2029ee02db5d80f5e41a6","up":true},{"one":"a34ea2e87d4c12adb27d66c2c95300603ff50415974e000bbcc69a5ae059dbf1","other":"fbf5e917be45e909697a9393c4778206333cf1dd9a103978e8d71622ca3b1cc8","up":true},{"one":"b02b01a5c37cb05c287a3dc7d04e305de26f8d62dc388542eeb43e97db7b4282","other":"33b5c521b4208e26414db2e05c9a8ccc001a524d928579d44d2e74d14a56593e","up":true},{"one":"9fa0215e980dc907df4cc47ab4937f36527d78f9837493016fd4fc51e617299c","other":"850575577d6b420a87aba388af481e0c044c2f75cf29ff934daf5674318a61ba","up":true},{"one":"cc2037c08942a094df12f45831f28e0015fc3ac04d5b8f24ffea9bf3a0b02c39","other":"fbf5e917be45e909697a9393c4778206333cf1dd9a103978e8d71622ca3b1cc8","up":true},{"one":"b89793c3ccd9ea642080728732ce7df33778653fed3d1d8f3a25e60670e33325","other":"b95d88ff6512ef8eaaa6bd842fa44175c1484fc2e8601b83d50a5ffa992bfa3a","up":true},{"one":"9890e6ebb2c6f9a7bec4c2778e077e3710ce3af356f82ae9b4d324832d159ef7","other":"c1f9e8e1d509febdf1f267bb227741e513420048a2e669ac9eef4b05a29cf10b","up":true},{"one":"f773b83f1a1de2ab6660edb0b765cfccec6778061ee25c5a84f968625686ef60","other":"9890e6ebb2c6f9a7bec4c2778e077e3710ce3af356f82ae9b4d324832d159ef7","up":true},{"one":"7dc2a9573f253f362ef1b21bbfcc144b11a6febc58aa3c4430224160e9fa738c","other":"738c2d42458965d03c8f9f055eaf0e3edf3dfa2a4de0a048ec05b78e7b765c90","up":true},{"one":"19faaf891eb6a716902ec29d201dc2094ee474acff188ae86faf9760674b2d37","other":"775e7be502df8fd938cf9c42ee4fac33e460a4b6992b9efeb8dc1ff7dde5c40f","up":true},{"one":"67aa5463e4b32b363b3d01d2a41ccb03199411057276f4962d053160be29a6ef","other":"7290cd3affade5f9e729d1b03549aceafb2576cdbc6789fd688c95495f10bacd","up":true},{"one":"9852ce267d53106a6e584d6eddb08e0062eb4a422d2a8d39ad6dccaebac552ff","other":"1c9caf028df31681b1457a54d4b3ab20009f9fa5bd12417a1ba7efe0c660e6bd","up":true},{"one":"179f21d2e0421b8056ee9a260bc0985bfa64a52a36d0a8fbce4e03f3120d1d65","other":"4d6b939fb67338c484948ab92b2ceea4d4b666d7e08773673cd7c8f83f495b89","up":true},{"one":"2c79af7ea85f96db7897cf8cdb4d002ad2308194e03981876edb8d904ef65137","other":"cc2037c08942a094df12f45831f28e0015fc3ac04d5b8f24ffea9bf3a0b02c39","up":true},{"one":"7a608d2cf9d1d9c5819dc1f9e88e5cb2852aadea01c40e047c2e184b62e7163c","other":"30bec7cd0a7d002839aed7654129bd2fe2e2ce7f42aa7bae1560e8bf718954c3","up":true},{"one":"4e5a46c004e85cf86a02fdfbf2243018825d015debfb9a077a1283d302293b3a","other":"13d6cb9316e289923e2d1de7f3c966d0cbabce3acdb8017122944f4abb140912","up":true},{"one":"7125e05bf1bfe6df948c9276b62bc755fc6b0ec8d4ac7724b61ea49591adcf25","other":"1c9caf028df31681b1457a54d4b3ab20009f9fa5bd12417a1ba7efe0c660e6bd","up":true},{"one":"82f9c9009f09de2d6a77b54976d14c14211eae65d886f6ed57560c700716dd5c","other":"49cd1efed6a56a78af4ea4ab40813013e76c6a5fb9d2029ee02db5d80f5e41a6","up":true},{"one":"455936fd22c43794e6e2104fd91d3f5d246e3823e8ff8eaf8dc27aa9f3d2ee08","other":"378e7af7cc019186d4f2699e753e2d71302f8f3565572c13b7a1b1c5cb47443c","up":true},{"one":"e8548b5df15adf0f2a997ff5709827beb5e1d36bb08a2f2d017746d5c0e83fca","other":"90765b72283f59be4cf9bf7a9e9a22fd6db701c3603cbc0817b4adf2f8e9ce08","up":true},{"one":"e7fa7112adc7b023dd5965e620277122542153f87eaf5deeacc8a51f1778ba77","other":"af02b5d107b3a17f539c7f9020ebe74322434634e70c420a7f56776eb5d9db73","up":true},{"one":"045ba8da4641da3f0b8058bb0d9d8aafbb81496dc1cae2a3fd9c039a7e1cafb6","other":"c1f9e8e1d509febdf1f267bb227741e513420048a2e669ac9eef4b05a29cf10b","up":true},{"one":"f27f1044777e05f3f60165d0d2fc3e7667fe148e0ca7a097805d60b9f61025f7","other":"534bcaa98cf9192b35b6014c650ae067e74332c015ebb516d63601427d7376b8","up":true},{"one":"e8830f2b2f7d08df15bd33f4b2841d01d9d62c1621234bd6ae86743e52360f3e","other":"4d6b939fb67338c484948ab92b2ceea4d4b666d7e08773673cd7c8f83f495b89","up":true},{"one":"7dd3078c71087ab88d4d26a962820bcb79b8ce30e91c1f9a69d4bf8d38086960","other":"53fe2c13926507a7a6c27d0fb30a2c358c4c7bfa40df8b5fa8ec8986c2450519","up":true},{"one":"b2a563ac59bab4dfddf7b6e27b80ee7afdeb2e4295411107903f484bcf9fc4f2","other":"628e7da3359ed6d9dcfbafc7581966e4e09245c321ec78ca75587c9cbb44697f","up":true},{"one":"6c4dcdfdee0164a9a3f419430726dd51f9198c65ff6e7de7aaa6f632dcde6794","other":"0de3915b0bcc68040c8aa76fbd2cfa0714e9b34c9dbe0838a7cba81c4f73581c","up":true},{"one":"b65ee2549536a806ceef4a7ccc9544567cafe6204080929fc847df0a3781ccc9","other":"e5d794d64003725a74642f097c0ee76706d78419b6f3ea819d440bc0ad166eac","up":true},{"one":"d29941d6b8acd86cf32fd1c2181da3ab1da3c2083134b068ca49ce29aa86b783","other":"1f85b8c05e5dceff0bd8256f8f6d80d4b902a9754ceb952d95ea2e1150ef9e59","up":true},{"one":"30bec7cd0a7d002839aed7654129bd2fe2e2ce7f42aa7bae1560e8bf718954c3","other":"b626d472b555e6f950a7142783db8deb443a74e63ef6bd72a87eaf1af14ca805","up":true},{"one":"5b632eaf700d173ff15f4727b85817e6173228c304b422434a08c2cad438b825","other":"c786ff8667f509b5a9519984c1d95c83a5d2e257500a71429e8f23af610ce771","up":true},{"one":"2a0a8eaf1a2749e68f8b841578c160699cf7907ff23842c6d616ad884e5f613e","other":"f629b8b9e79c75ac559daf9bf4fc8672bfdd595cf2c5d17a8885282626fc65a5","up":true},{"one":"03ccd8d52597d18c0b178ab7361d847d63aad3af920a28345977ae170a1dafcd","other":"63370e288ab2e4b8403c6678e9c44ae5c7496b5ead614306fceb85986ed29d18","up":true},{"one":"d640472351969a5578e541aca72b7640c583b995fd62607ff3ee3f3f3139aafd","other":"47bfa3767cefcc0831d410d5402e9396e8a412c8c96faf55b451d3ff310f3b02","up":true},{"one":"c786ff8667f509b5a9519984c1d95c83a5d2e257500a71429e8f23af610ce771","other":"e5ada0415c92ef1511b15d04edf395976464afd9adc3e929c41d4d21d25e3182","up":true},{"one":"6fe9a02e950a5c3a5ff026b75922ed687d59795ba8eb9c092a8d09a5c64d2453","other":"4ac755123dcc64ef44db9280311af51f3f7a93e0dee67370d673261220356eb9","up":true},{"one":"ed2d3e1e5693b44494808907c98ec54d6d08331945d2a2c03e31130fef1d2586","other":"f5dc78ff71a63fc2014b9553723ee676c63fc078a32a46b7cb172f357a118140","up":true},{"one":"b2b5ba1bb188f18f79b295f2c0d48c52c1d1d449ecb9b94b9984f3a6179732c7","other":"8025c1fcb98e53f92767d1d43a3057a0acd1e8994bb4a7e3f5e244110e0dcf91","up":true},{"one":"c59e3953b64e5b9ffbe53990a358914f2fa8e3551d33f92b9e3a441bd1baf2cd","other":"b626d472b555e6f950a7142783db8deb443a74e63ef6bd72a87eaf1af14ca805","up":true},{"one":"e54784cfbcd89c37c8f758aae70ece3ab4b7f8c30fb4ef7543e04aa89ff4386b","other":"1b830ed484b274a96ec7ba2f9a42b6859412b5334a564014ff3f11597ea3a32d","up":true},{"one":"63370e288ab2e4b8403c6678e9c44ae5c7496b5ead614306fceb85986ed29d18","other":"e5d794d64003725a74642f097c0ee76706d78419b6f3ea819d440bc0ad166eac","up":true},{"one":"fe2167fd33f383110eb3f6caa7bd905ca54fa0c810f1b8a34483a846f3cbddab","other":"574f65867482091aee2774033116c233525eea711706b5ae9ba09b54e896d302","up":true},{"one":"caf6a8e37fd41c1e6ad77a8575cd90354bb1693893952301c9caeb4779c338d3","other":"88fefb7506105c0e269baf52955a01b19f55504b13133bac0beab41c9f6e6942","up":true},{"one":"24b85c10f098725938ea7d87cd24a4b10358129906fca9790fc266ea8784b538","other":"77d2ec52dabd5d7f326d4c6afd2aad110487c6bdffa2984060528716ba873462","up":true},{"one":"0438f567045d4556a0e7a697028d689ecfd0ae20f9e85c09b48d9f1fd0ee4765","other":"b65ee2549536a806ceef4a7ccc9544567cafe6204080929fc847df0a3781ccc9","up":true},{"one":"1f85b8c05e5dceff0bd8256f8f6d80d4b902a9754ceb952d95ea2e1150ef9e59","other":"07a8c900fec6c477580ed5b38848a8681dc52a19e59fa4cd32f571fe7fb2383a","up":true},{"one":"53a885968d68d8ebf7ed514e662cc13fa03186d2361000a03576531fdca2a25f","other":"d640472351969a5578e541aca72b7640c583b995fd62607ff3ee3f3f3139aafd","up":true},{"one":"915d7a0510bad19266eef8f00ca0cb2efc340253775706495fca8b9160b512cc","other":"f2d5533eed4b0c184952d859d67e44abe5a75a5de6111c8c106b8f4b2d8ccfc4","up":true},{"one":"a653302730df3d58f796906a93933aa81494f2588d9485ab7676ec3b0ccbb426","other":"f629b8b9e79c75ac559daf9bf4fc8672bfdd595cf2c5d17a8885282626fc65a5","up":true},{"one":"c49caff13862dc089f1f9b8180d6efa455648375662719272102c4f8028799d6","other":"b5b24532d2810e311e10b1d606baf6007f9124b88a178b32713cf1eddae089be","up":true},{"one":"f4e09f89287bd1af7833acd85ba7cc71fdb3ff34f2f409e1cf2a878dcd3183dc","other":"24b85c10f098725938ea7d87cd24a4b10358129906fca9790fc266ea8784b538","up":true},{"one":"478278187cd9af799e83340a2f49b0b7f122fb8e08c0a372a87795426eab364b","other":"46fee69dad8b6a6a87d356d10db25d835a0c4e154bf179e88fb4cc65f97d72d7","up":true},{"one":"5f00b3bebef2f5484ff1386298add68a6743a106200ae8a13a27dbb52714ee8f","other":"03ccd8d52597d18c0b178ab7361d847d63aad3af920a28345977ae170a1dafcd","up":true},{"one":"07a8c900fec6c477580ed5b38848a8681dc52a19e59fa4cd32f571fe7fb2383a","other":"f4e09f89287bd1af7833acd85ba7cc71fdb3ff34f2f409e1cf2a878dcd3183dc","up":true},{"one":"0c28cd1315890629896d0fe5517524d4eb788f7444709c135ea690ba4e6103d5","other":"b89793c3ccd9ea642080728732ce7df33778653fed3d1d8f3a25e60670e33325","up":true},{"one":"f5dc78ff71a63fc2014b9553723ee676c63fc078a32a46b7cb172f357a118140","other":"3b88a472beba4a18f8df45678888fd359bac3823900eecfe0037fdc9ad54d416","up":true},{"one":"da67ace34f7076a1d550bc61bc2a31da88d6cd9f9df43b142a8c6bbade1b4aee","other":"4a8b610e09d35aa21c42ab8c3e38de600a944c094e6b86ea56828b5e6904f1f7","up":true},{"one":"7b90e939ae2a240f0d74a923afb6bbf11f6d5b99a7bf85f1825b1ea36bce744c","other":"e54784cfbcd89c37c8f758aae70ece3ab4b7f8c30fb4ef7543e04aa89ff4386b","up":true},{"one":"4636f00be60a9b494a3ebc9ab41cc7cb53ec0b0beff214db2d0a248dc3aeb6af","other":"1f85b8c05e5dceff0bd8256f8f6d80d4b902a9754ceb952d95ea2e1150ef9e59","up":true},{"one":"e5ada0415c92ef1511b15d04edf395976464afd9adc3e929c41d4d21d25e3182","other":"b626d472b555e6f950a7142783db8deb443a74e63ef6bd72a87eaf1af14ca805","up":true},{"one":"37801e8d7d46143f78924ed66099f658a94d37edfd2f58d02acb85add03e1894","other":"6e05179dc90a8f6654d0c9a3f06173371dcfb18b852fdd77f35f75e38f273125","up":true},{"one":"ca041da0dc514643d017458d08ff6962ec52c9e66571a239ec395dc8b2546709","other":"0d8a919207fb2d5718eab7da95f8efeb01a4e1ae39602d315f8ba2ff1752d9da","up":true},{"one":"256e81c5a6fb43bd343345477f8f96aa1947f07ac3297f631ab03f060147b062","other":"1f85b8c05e5dceff0bd8256f8f6d80d4b902a9754ceb952d95ea2e1150ef9e59","up":true},{"one":"0c64e5af869b1665fd4016ae6d04c8eedd423636f06d78ecb944ee8e3272a82a","other":"1a2a0e0bbf83cd40936995674418ae469aa2b92876a4ceeabd8128f536b7d7a2","up":true},{"one":"217f9952af1eb58d5ca5ac7be763716cfe2c0a4f3cdd4ebe4b5df563f919e2d2","other":"959fda0866d3c18e9399e98485d627044079d6f86b075edaea9315402f5d9395","up":true},{"one":"1c47ad5bd8846f777daf59587feccc308f4dc63f6d27b1385ff8085c75bb1aac","other":"a653302730df3d58f796906a93933aa81494f2588d9485ab7676ec3b0ccbb426","up":true},{"one":"8025c1fcb98e53f92767d1d43a3057a0acd1e8994bb4a7e3f5e244110e0dcf91","other":"fe2167fd33f383110eb3f6caa7bd905ca54fa0c810f1b8a34483a846f3cbddab","up":true},{"one":"ec52270604007673d1bfda1edbd8bfa945a21141efd85e42b684a9f30f8cddae","other":"f7fa2986ec9f84822b11a6b00bd03a1dd26f2a0fab90b1b308f08caead43cfe1","up":true},{"one":"e8efe8016fe6cf649b2755bee22da35ccc6c9c55d404d5385d61f6ea27b84380","other":"47bfa3767cefcc0831d410d5402e9396e8a412c8c96faf55b451d3ff310f3b02","up":true},{"one":"959fda0866d3c18e9399e98485d627044079d6f86b075edaea9315402f5d9395","other":"e5d794d64003725a74642f097c0ee76706d78419b6f3ea819d440bc0ad166eac","up":true},{"one":"8f2182c2c2d0eeb2e887dbc350ae7257819f536032851ffdf29e7842cb1a62cc","other":"a3693801a91180410cf3e85d7c09ac8054a769e7b1d55c9e7a46850cb8217da0","up":true},{"one":"1e2aca93fa9442a0034ae8d295530dde16fcbfa8c37227e2e6863babb0f87c34","other":"35e6b1d31f594c06b759525434a7e717ebe6f27ca0188f247ed1247664a50563","up":true},{"one":"c59e3953b64e5b9ffbe53990a358914f2fa8e3551d33f92b9e3a441bd1baf2cd","other":"d7aca8f2182bc625d2b3c942bd1161c85bcf1c2b34ecbe3e2fd23cfae6b8a871","up":true},{"one":"c43fbee95380007274b8f231fe34bcd59b5c0ef0830b174967d4702627984fc6","other":"574f65867482091aee2774033116c233525eea711706b5ae9ba09b54e896d302","up":true},{"one":"6f5f5a77e6092e25e5308413e02ba62c1c559024893a7fb98e26b0f34fed8bfe","other":"5db08436c64f4cc9e2b3950e35bc8ad739825e3efa67a642c771d95b34cb420c","up":true},{"one":"886aff1f1e3b86bfe901066bb7948451c18fe3f8cd1b7318b05154890ca8f738","other":"c832b4ad64a17da4b796ffcac646c2aa666b276aabb7eb3bfe7981d64a4da402","up":true},{"one":"53087084708cc5ee63ac459b18fa10ae52a823139b4ecba6c8691d4934f2f971","other":"ef1b70bf090bc9994b1d45e2812c56ecb430a89c346a436bd10880bcda700351","up":true},{"one":"04518d7120fa8a528d983ca1ee6d5d09ba24a4e853fb22bc9084cdf34995e95f","other":"ac4d2d6836e2cdf4c88221f6013aac70a451dd15bc403288bd10d0b911cd9a2b","up":true},{"one":"0a005eb9c10c5cc9f720cfec2a655811d391671597b4f32d12df291ec76b2c13","other":"4646fe4c119078738612b44a356089b3c73a08e11cfd910675d211ae6b20b8fd","up":true},{"one":"39d1fcae2d23c775214988251505c577b9ac7b6851558ddf9a437dfe143f3845","other":"41092c852fac630df2a9ca0862716f8e9fb8566c904a49c96389071046bc699d","up":true},{"one":"17040a3aad5930d8e0de1011fd2996b7d09225989f0dc1ae8f7e7a52dd26ab4e","other":"2d3645c4fdf9a2809a909076b9ee5fb98fa880f6faeff914f1a2987af928cd79","up":true},{"one":"4646fe4c119078738612b44a356089b3c73a08e11cfd910675d211ae6b20b8fd","other":"499036eb9d10fc003c903f09ea0ee00c0d27b39564988d67ae111f3473d22f07","up":true},{"one":"140020a23a840b8840ba0c2c384f853a606330e9743885e9967cf49533db282e","other":"60d7337ef806be95ccaf7b9d663a4289f9afc68edced62904ab50601cf113f45","up":true},{"one":"11d43f6ed0ddd5afa5c8a7abf7c62a4fa865b7a25ee295bf1a49701ef3081363","other":"14dfb8414d17b2df15eaf59571a8cfec99b1fd674561da63ee99af853bda07da","up":true},{"one":"f27f1044777e05f3f60165d0d2fc3e7667fe148e0ca7a097805d60b9f61025f7","other":"06618d829a8a7317a98f1a40ecf8864e1c94c4e270a9e4c008229dc7cf937b7e","up":true},{"one":"b89793c3ccd9ea642080728732ce7df33778653fed3d1d8f3a25e60670e33325","other":"6ea51fb6e4783f351dbbfa47b508c78c73233ebaada409dfb55446217f92c4bd","up":true},{"one":"f528aaafd67b20dafdce101db224aa01c70f93bdc91c14f50fa8db1dbf9fc386","other":"7290cd3affade5f9e729d1b03549aceafb2576cdbc6789fd688c95495f10bacd","up":true},{"one":"140020a23a840b8840ba0c2c384f853a606330e9743885e9967cf49533db282e","other":"02d85b9f8e4776224ae5088683a87837b82b2bfb7e047cf373a28393e7aca6e1","up":true},{"one":"c26fd5e6504c7b3f0a6d9133ff87c98c110eb1c201c5f3bcf6b10653f2b972d2","other":"db6a1f6b342f6be9517f8df01003797c11c837d9aee3cdba5b7859230b36c35d","up":true},{"one":"9852ce267d53106a6e584d6eddb08e0062eb4a422d2a8d39ad6dccaebac552ff","other":"165f1af67aa1d24569e0bdff61d29b3c39e93250071d8f25b5be6face209ac6a","up":true},{"one":"461cc9f064e6f4f06ff38e0d1f3f00ef8807ba31c7258e453cc682e9551bb1c6","other":"006727dc6f59b120b24c17b8e63f80ef3439105f8118ffeed408f105a48ee60c","up":true},{"one":"1a2a0e0bbf83cd40936995674418ae469aa2b92876a4ceeabd8128f536b7d7a2","other":"df1e4e46e8ec26cad74b4f35ab070f12c8f6fddca35ac44c1218ff60fe1e6bab","up":true},{"one":"455936fd22c43794e6e2104fd91d3f5d246e3823e8ff8eaf8dc27aa9f3d2ee08","other":"1c8a10ecbd72acb2bbbb8b77ea5404f9e90f4dbf306ec8134cfed70b40aef399","up":true},{"one":"cc2037c08942a094df12f45831f28e0015fc3ac04d5b8f24ffea9bf3a0b02c39","other":"13d6cb9316e289923e2d1de7f3c966d0cbabce3acdb8017122944f4abb140912","up":true},{"one":"88a141c607019477c7b120a506285a7218cad2faa038082e0b9ddfcc9cb78d07","other":"41092c852fac630df2a9ca0862716f8e9fb8566c904a49c96389071046bc699d","up":true},{"one":"7dd3078c71087ab88d4d26a962820bcb79b8ce30e91c1f9a69d4bf8d38086960","other":"2f32d54f06989efb6ca5431b74cd759fba05dbef36ecff8fd506e662026af983","up":true},{"one":"5db08436c64f4cc9e2b3950e35bc8ad739825e3efa67a642c771d95b34cb420c","other":"2a97d308a720274a440dfa6901ca0a5480af9bab58dd8a6c4afdb9c83ea964c3","up":true},{"one":"849bcbb9be43b799fefc5e689efc75125da27f536e97e5b7921031520ae6e5d8","other":"3efc4b120b3eeeac186bf3a4cd42eb8c647f7edb08c23ee643e2bec9d72c5bed","up":true},{"one":"6ecb5c36fc0150c287446ae8a8682d629a1d39341230717206219babe3bdf659","other":"17040a3aad5930d8e0de1011fd2996b7d09225989f0dc1ae8f7e7a52dd26ab4e","up":true},{"one":"524db81b135af8dc309b942c082a7291dddb851866fc608753f937ee77015be0","other":"4c9eab8ab45405a6d4bab46430efc04b8e6aec1d944f88435eca41361925f379","up":true},{"one":"3b78bc987c7c31c94e8ada9b4b11b5db9387fe70dd01ce7f3e976d3bec433dec","other":"d887070a0568282c69e96ce65612ba72d5ea26b5c80671435d6e1ed2c4b49301","up":true},{"one":"4c9eab8ab45405a6d4bab46430efc04b8e6aec1d944f88435eca41361925f379","other":"3b88a472beba4a18f8df45678888fd359bac3823900eecfe0037fdc9ad54d416","up":true},{"one":"ae2b3876bdbd6388781b65e31de182564c5d81f4511caf96588b1a287760b3dd","other":"88a141c607019477c7b120a506285a7218cad2faa038082e0b9ddfcc9cb78d07","up":true},{"one":"d863ba7405eb07ccddbf1d34efbcbec2867a93a109ed9413d9aecf30d3645a6a","other":"6ecb5c36fc0150c287446ae8a8682d629a1d39341230717206219babe3bdf659","up":true},{"one":"03285e06657032778feff0b43828c964dbf9de669f63171aeb587aa1a1facc0a","other":"c1f9e8e1d509febdf1f267bb227741e513420048a2e669ac9eef4b05a29cf10b","up":true},{"one":"524db81b135af8dc309b942c082a7291dddb851866fc608753f937ee77015be0","other":"6967e7438125c2045d575eb9f407b4a38d1bf9dcd1c1c1a97f750da6a21aeff7","up":true},{"one":"b02b01a5c37cb05c287a3dc7d04e305de26f8d62dc388542eeb43e97db7b4282","other":"b911b8e2d72532b7c66ff5f7bffa70f5ddbeea6903a86f9333399f0c4b5f0fe8","up":true},{"one":"45584a4bebb948ef5f7b55d4846ec5549d7623682169c0edcab5b3523e68c7da","other":"5b632eaf700d173ff15f4727b85817e6173228c304b422434a08c2cad438b825","up":true},{"one":"7dbbdeba3731e1ff43072f8cbd86db147761e1b61753eea7024774dbf46914bd","other":"66e7fc2df51f5df8d7329851fe9357d895e9d5dfdc25f8d92bdb10a960f7e15a","up":true},{"one":"ef1b70bf090bc9994b1d45e2812c56ecb430a89c346a436bd10880bcda700351","other":"e5149cedd990072f2aaa9735a9259f28973c45876660c2d86ac105e56cca8e68","up":true},{"one":"378e7af7cc019186d4f2699e753e2d71302f8f3565572c13b7a1b1c5cb47443c","other":"f4e09f89287bd1af7833acd85ba7cc71fdb3ff34f2f409e1cf2a878dcd3183dc","up":true},{"one":"1a2a0e0bbf83cd40936995674418ae469aa2b92876a4ceeabd8128f536b7d7a2","other":"20aeb14f567dd16f06b0d3b589b83283daa00a5ed10e447860bda946baccdd2d","up":true},{"one":"314a3530a5e0c37d5609149b3ae9c2e078573346bd8fce3c769ebaeb31726ec1","other":"4d6b939fb67338c484948ab92b2ceea4d4b666d7e08773673cd7c8f83f495b89","up":true},{"one":"6c4dcdfdee0164a9a3f419430726dd51f9198c65ff6e7de7aaa6f632dcde6794","other":"96fcf14c7f90350091ac6fcb58306ccfb9e4a38d3da59f8ab656854332844cbd","up":true},{"one":"bb90464f769a85549c150f861775aa67924c7c651f393f6c70772707376a5c7e","other":"f5b24a1fd2cd2908b408562f9a265ee1a692b137e770137afa5fdfa07b237221","up":true},{"one":"53fe2c13926507a7a6c27d0fb30a2c358c4c7bfa40df8b5fa8ec8986c2450519","other":"2c79af7ea85f96db7897cf8cdb4d002ad2308194e03981876edb8d904ef65137","up":true},{"one":"0e5e0bb1383b2ec569b157a1d2ae6900592ab892a28367f5613a4e29cb265088","other":"1e2aca93fa9442a0034ae8d295530dde16fcbfa8c37227e2e6863babb0f87c34","up":true},{"one":"30897492824b19540d13ef17c70845be6dde455dca4e4f84cfca14a2c373969f","other":"f629b8b9e79c75ac559daf9bf4fc8672bfdd595cf2c5d17a8885282626fc65a5","up":true},{"one":"d1d719ce1dca507598449afe966396c160ad25ad632112ab268b1d913b490dbd","other":"efeae3b7f610dc10acc51068e7718876d147cd78a9a28788c5dba5bb3a6950dc","up":true},{"one":"13d6cb9316e289923e2d1de7f3c966d0cbabce3acdb8017122944f4abb140912","other":"2c79af7ea85f96db7897cf8cdb4d002ad2308194e03981876edb8d904ef65137","up":true},{"one":"6f2d756566dd5b4a13ffeea9f687c785148f3407a502e28b9d6edfd03b905fdc","other":"f4e09f89287bd1af7833acd85ba7cc71fdb3ff34f2f409e1cf2a878dcd3183dc","up":true},{"one":"68317431e4fa55be4a700e35c6a578307cc32b72336679b5c5618b622ef0c602","other":"524db81b135af8dc309b942c082a7291dddb851866fc608753f937ee77015be0","up":true},{"one":"c441d27a5f4abaa8e3b0f040a6ef85bb8c970031d6a57503a674e36b3d6915d9","other":"2ccfb5b1f3923d35fef88838c508b98b5516c5d409643881d2304ae49e50eed3","up":true},{"one":"e027a9f7152641c4a41154f8ce4dafd23895c312150efea86bf4152c88d0ca86","other":"96fcf14c7f90350091ac6fcb58306ccfb9e4a38d3da59f8ab656854332844cbd","up":true},{"one":"ee5e77df690329c132f2f7fca223cfd384b7bc34ec38763a4eb42780e0585656","other":"b95d88ff6512ef8eaaa6bd842fa44175c1484fc2e8601b83d50a5ffa992bfa3a","up":true},{"one":"d887070a0568282c69e96ce65612ba72d5ea26b5c80671435d6e1ed2c4b49301","other":"4646fe4c119078738612b44a356089b3c73a08e11cfd910675d211ae6b20b8fd","up":true},{"one":"d1d719ce1dca507598449afe966396c160ad25ad632112ab268b1d913b490dbd","other":"96fcf14c7f90350091ac6fcb58306ccfb9e4a38d3da59f8ab656854332844cbd","up":true},{"one":"775e7be502df8fd938cf9c42ee4fac33e460a4b6992b9efeb8dc1ff7dde5c40f","other":"6251e9540448726a601699ef4cd19e50c969a746da27228967338cdc09d628bf","up":true},{"one":"4d6b939fb67338c484948ab92b2ceea4d4b666d7e08773673cd7c8f83f495b89","other":"e54b643cbc95d9f5d27ec3760d892b6802981bfabf4f9979267d66259df982c7","up":true},{"one":"3630e05326bacea8fcc739dec42085f845f416ddc698c76ff91f099eb1dc5007","other":"41092c852fac630df2a9ca0862716f8e9fb8566c904a49c96389071046bc699d","up":true},{"one":"df1e4e46e8ec26cad74b4f35ab070f12c8f6fddca35ac44c1218ff60fe1e6bab","other":"20aeb14f567dd16f06b0d3b589b83283daa00a5ed10e447860bda946baccdd2d","up":true},{"one":"849bcbb9be43b799fefc5e689efc75125da27f536e97e5b7921031520ae6e5d8","other":"0c28cd1315890629896d0fe5517524d4eb788f7444709c135ea690ba4e6103d5","up":true},{"one":"baf219e9229921b773d1ad7eb7eb5216cfa60ccecaa3c5c487e3b71cb600ba12","other":"444722a15b01a0d8e6794798d239fe621d59bdfc08823ab47cbd8b9acebd23b4","up":true},{"one":"9d0f804849b72397646ba48208ba1e01dcf4de04e788016c4a1a0c93e650ddf5","other":"20aeb14f567dd16f06b0d3b589b83283daa00a5ed10e447860bda946baccdd2d","up":true},{"one":"29957e8e92925a8c79bdf513295d96bfb62fbfc597ee1cf767c7ef408f1b1295","other":"886aff1f1e3b86bfe901066bb7948451c18fe3f8cd1b7318b05154890ca8f738","up":true},{"one":"4e5a46c004e85cf86a02fdfbf2243018825d015debfb9a077a1283d302293b3a","other":"6e68ea86440706a0d73a9508f2247492543163f8fa7e2dc2aa62b74d50261b8b","up":true},{"one":"9fa0215e980dc907df4cc47ab4937f36527d78f9837493016fd4fc51e617299c","other":"2abb938b889a2eb735134462985a56056be48f189b5b89d23b653864c76427f4","up":true},{"one":"14dfb8414d17b2df15eaf59571a8cfec99b1fd674561da63ee99af853bda07da","other":"0a005eb9c10c5cc9f720cfec2a655811d391671597b4f32d12df291ec76b2c13","up":true},{"one":"1f670c53b4c597beaffacd84e3a697225b04cded9219d0a28e1fe525a3cadcf5","other":"6ecb5c36fc0150c287446ae8a8682d629a1d39341230717206219babe3bdf659","up":true},{"one":"0af9a57a2f66835cd3e4e71bc026013a8a99ca337a7b6b6cc34e11d8da212a4f","other":"d887070a0568282c69e96ce65612ba72d5ea26b5c80671435d6e1ed2c4b49301","up":true},{"one":"9fa0215e980dc907df4cc47ab4937f36527d78f9837493016fd4fc51e617299c","other":"21a044e772b7c955fe4a6fb7c3a9a20e95d48b7fd6b9518741782f04f5f1f5c2","up":true},{"one":"9890e6ebb2c6f9a7bec4c2778e077e3710ce3af356f82ae9b4d324832d159ef7","other":"f31cc744ea921fee8364c5269b1ce7ec6b5f0c0cbb6885efbf602de5b36f6169","up":true},{"one":"7e0458ecdf7081443cab5412529f3948ece659facaca03208496c80dd136e704","other":"3b88a472beba4a18f8df45678888fd359bac3823900eecfe0037fdc9ad54d416","up":true},{"one":"a3693801a91180410cf3e85d7c09ac8054a769e7b1d55c9e7a46850cb8217da0","other":"ae2b3876bdbd6388781b65e31de182564c5d81f4511caf96588b1a287760b3dd","up":true},{"one":"eb98fb45dd5754f24f9df0c9ecbb93932e3d9d7735cd6d0ddd4a8675bb4ef554","other":"daec45eca40f48843b41f70267c07e94996ced829f02710f15354fbe26e177e7","up":true},{"one":"0743bcf2aaa77e916f4a367d6159473c7d80f46a2e4cbe9ef346e423d39d7072","other":"30897492824b19540d13ef17c70845be6dde455dca4e4f84cfca14a2c373969f","up":true},{"one":"a34ea2e87d4c12adb27d66c2c95300603ff50415974e000bbcc69a5ae059dbf1","other":"eb98fb45dd5754f24f9df0c9ecbb93932e3d9d7735cd6d0ddd4a8675bb4ef554","up":true},{"one":"44a10530c376b215baff8531eeb2afb8d6714c4d0350d1a6f32761a97cd6c7ec","other":"68317431e4fa55be4a700e35c6a578307cc32b72336679b5c5618b622ef0c602","up":true},{"one":"16725e318322353befc2f2aba112f0984bc011821bb16c98e2cd8b39cd62aea1","other":"c1f9e8e1d509febdf1f267bb227741e513420048a2e669ac9eef4b05a29cf10b","up":true},{"one":"47bfa3767cefcc0831d410d5402e9396e8a412c8c96faf55b451d3ff310f3b02","other":"b626d472b555e6f950a7142783db8deb443a74e63ef6bd72a87eaf1af14ca805","up":true},{"one":"605a46991af15cd60e67413c712b99ff8f21173c96a7990f2728ad6cac2bb9d8","other":"53fe2c13926507a7a6c27d0fb30a2c358c4c7bfa40df8b5fa8ec8986c2450519","up":true},{"one":"b820e480354000c837b1781ec1c493e8776b4834252e6453425ac05b925b5a58","other":"850575577d6b420a87aba388af481e0c044c2f75cf29ff934daf5674318a61ba","up":true},{"one":"103b232552b94090232195dc88f84823701f35ae536b5af6dd33fa655a33cbae","other":"5cd2377226825dc7ea582315cd108d23502df4e9c7c09fc07e7b4aa56440de29","up":true},{"one":"ef07be559914ec4b5930d90d8d8b6f32dab9eba23acc36f14d512307f9974348","other":"ad9899f78659492ec248a884927a757f3f3b4e76cd2abc46ad8766251fd8afed","up":true},{"one":"154be9255e9aebd134a914070f5e6f3d4bba079d9ca738b74244db14e1b586dd","other":"4e5a46c004e85cf86a02fdfbf2243018825d015debfb9a077a1283d302293b3a","up":true},{"one":"e8830f2b2f7d08df15bd33f4b2841d01d9d62c1621234bd6ae86743e52360f3e","other":"4bcf4eb531d5ec4b31d99e8354af03f976524c7858a1e7043e9b7055326f0952","up":true},{"one":"daec45eca40f48843b41f70267c07e94996ced829f02710f15354fbe26e177e7","other":"1c9caf028df31681b1457a54d4b3ab20009f9fa5bd12417a1ba7efe0c660e6bd","up":true},{"one":"5efb3bfc199f5408f79bd6bd5171b4bf332c68a8e49242eb4f6a589b963565c6","other":"5cd2377226825dc7ea582315cd108d23502df4e9c7c09fc07e7b4aa56440de29","up":true},{"one":"e54b643cbc95d9f5d27ec3760d892b6802981bfabf4f9979267d66259df982c7","other":"06618d829a8a7317a98f1a40ecf8864e1c94c4e270a9e4c008229dc7cf937b7e","up":true},{"one":"c9f5acafbbf8c66647de05b0848d79451eee490709d53f118fc2051410cc8203","other":"461cc9f064e6f4f06ff38e0d1f3f00ef8807ba31c7258e453cc682e9551bb1c6","up":true},{"one":"e775e9759d4701bd9b43c22f1d1be73c1262b2752bb23cb3857485daf1dcad2d","other":"f27f1044777e05f3f60165d0d2fc3e7667fe148e0ca7a097805d60b9f61025f7","up":true},{"one":"51db114a52827f5b74088bd0fc87d35229e7740e7d121bd7699298396516a880","other":"baddc778aea97acdbbb5bc99744a5545abab9f6047c81f328761645287ac391c","up":true},{"one":"4ac755123dcc64ef44db9280311af51f3f7a93e0dee67370d673261220356eb9","other":"b626d472b555e6f950a7142783db8deb443a74e63ef6bd72a87eaf1af14ca805","up":true},{"one":"e8548b5df15adf0f2a997ff5709827beb5e1d36bb08a2f2d017746d5c0e83fca","other":"daec45eca40f48843b41f70267c07e94996ced829f02710f15354fbe26e177e7","up":true},{"one":"fbc8087a723c564ca0139329902e79748af46699ea7be24d57909a7e8e96f681","other":"c8986871e46f001d15ed8b70f2aa0fea8ae309d5e5671a500f619e3b348c8c15","up":true},{"one":"f7baef876a62b92ebe5ca9ec6a085e0eb54fd31e2425e662eec747df3cd77592","other":"baddc778aea97acdbbb5bc99744a5545abab9f6047c81f328761645287ac391c","up":true},{"one":"2f32d54f06989efb6ca5431b74cd759fba05dbef36ecff8fd506e662026af983","other":"c620752a083ca1ff0398937235cf964133939452c293c799ce07ff8aa2bde420","up":true},{"one":"00c6488a842ece7a8b0daf064e405de03a4257d308840ea52bfd48d23f54d895","other":"103b232552b94090232195dc88f84823701f35ae536b5af6dd33fa655a33cbae","up":true},{"one":"bcc6724e54f761361f85147eb102a8d1a1a38810a940ce76b1e361ddcadacaa3","other":"5cd2377226825dc7ea582315cd108d23502df4e9c7c09fc07e7b4aa56440de29","up":true},{"one":"c8986871e46f001d15ed8b70f2aa0fea8ae309d5e5671a500f619e3b348c8c15","other":"daec45eca40f48843b41f70267c07e94996ced829f02710f15354fbe26e177e7","up":true},{"one":"baddc778aea97acdbbb5bc99744a5545abab9f6047c81f328761645287ac391c","other":"ba884e5cfa1ee6eb38217181711e01bb0c37b3e33d1424dfa89ed3e29ef6205b","up":true},{"one":"3e8efcaf3002522b39065ea30c15426d1eb55916499eff8eb5a814e39d41853c","other":"6c73150490e8be9677c40086de0aefed1939581048e26f4a93f5ca26571a1a8f","up":true},{"one":"aeb4c75a57ccfc9ac053a3d363cf7c1e3e201406587769ab6615d5c2f86a5410","other":"00c6488a842ece7a8b0daf064e405de03a4257d308840ea52bfd48d23f54d895","up":true},{"one":"ba884e5cfa1ee6eb38217181711e01bb0c37b3e33d1424dfa89ed3e29ef6205b","other":"ef1b70bf090bc9994b1d45e2812c56ecb430a89c346a436bd10880bcda700351","up":true},{"one":"21012a3a6ef1ece48fd9d7cffe62dc75839dd062efcf3ac5f962c237814da407","other":"2d3645c4fdf9a2809a909076b9ee5fb98fa880f6faeff914f1a2987af928cd79","up":true},{"one":"0b72054403f78a64a787f46e9f26bf0de7bbba5a60cb105e6aeea46cb4a1d9fe","other":"32371744163f0b3aefd3955dc4877e7eb82b17ef9541c333ca9c0a9f8aec3045","up":true},{"one":"c832b4ad64a17da4b796ffcac646c2aa666b276aabb7eb3bfe7981d64a4da402","other":"f7baef876a62b92ebe5ca9ec6a085e0eb54fd31e2425e662eec747df3cd77592","up":true},{"one":"35e6b1d31f594c06b759525434a7e717ebe6f27ca0188f247ed1247664a50563","other":"4d103ec5afee559a5a9242e8d650b67301eaec10e96fc2f184e34d48554108a2","up":true},{"one":"ac4d2d6836e2cdf4c88221f6013aac70a451dd15bc403288bd10d0b911cd9a2b","other":"17040a3aad5930d8e0de1011fd2996b7d09225989f0dc1ae8f7e7a52dd26ab4e","up":true},{"one":"b89793c3ccd9ea642080728732ce7df33778653fed3d1d8f3a25e60670e33325","other":"ee5e77df690329c132f2f7fca223cfd384b7bc34ec38763a4eb42780e0585656","up":true},{"one":"c620752a083ca1ff0398937235cf964133939452c293c799ce07ff8aa2bde420","other":"90765b72283f59be4cf9bf7a9e9a22fd6db701c3603cbc0817b4adf2f8e9ce08","up":true},{"one":"fe316679eca0e0eb823325812a56fd27da02653b06ada2fd03b27501bda8371a","other":"baddc778aea97acdbbb5bc99744a5545abab9f6047c81f328761645287ac391c","up":true},{"one":"82dd83838cb982b89505ef249d353a20e434346dd78b71cd9b809f71d5c112da","other":"e8830f2b2f7d08df15bd33f4b2841d01d9d62c1621234bd6ae86743e52360f3e","up":true},{"one":"49eaad68d23dd63ef26029fa3f4e2578f3deca8708bbc838750d8b6dbe9eaa38","other":"0af9a57a2f66835cd3e4e71bc026013a8a99ca337a7b6b6cc34e11d8da212a4f","up":true},{"one":"5cd2377226825dc7ea582315cd108d23502df4e9c7c09fc07e7b4aa56440de29","other":"00c6488a842ece7a8b0daf064e405de03a4257d308840ea52bfd48d23f54d895","up":true},{"one":"33b5c521b4208e26414db2e05c9a8ccc001a524d928579d44d2e74d14a56593e","other":"6e68ea86440706a0d73a9508f2247492543163f8fa7e2dc2aa62b74d50261b8b","up":true},{"one":"06618d829a8a7317a98f1a40ecf8864e1c94c4e270a9e4c008229dc7cf937b7e","other":"b2a563ac59bab4dfddf7b6e27b80ee7afdeb2e4295411107903f484bcf9fc4f2","up":true},{"one":"499036eb9d10fc003c903f09ea0ee00c0d27b39564988d67ae111f3473d22f07","other":"00c6488a842ece7a8b0daf064e405de03a4257d308840ea52bfd48d23f54d895","up":true},{"one":"66e7fc2df51f5df8d7329851fe9357d895e9d5dfdc25f8d92bdb10a960f7e15a","other":"b820e480354000c837b1781ec1c493e8776b4834252e6453425ac05b925b5a58","up":true},{"one":"d3b0dea1dd3ac71e7e4a30941632eec53cb980aa7cb6cdac95042a5400a878c3","other":"b911b8e2d72532b7c66ff5f7bffa70f5ddbeea6903a86f9333399f0c4b5f0fe8","up":true},{"one":"a46dd535e3bc8f111a8b2ce5594b62e87741c395e8a2b8fbae33edd29cb8caf8","other":"cc2037c08942a094df12f45831f28e0015fc3ac04d5b8f24ffea9bf3a0b02c39","up":true},{"one":"7920d69cf7e458fce0781ea1a4e07768e1a69f6818090eff0abf0b4a0c2c35f8","other":"b2a563ac59bab4dfddf7b6e27b80ee7afdeb2e4295411107903f484bcf9fc4f2","up":true},{"one":"165f1af67aa1d24569e0bdff61d29b3c39e93250071d8f25b5be6face209ac6a","other":"3e8efcaf3002522b39065ea30c15426d1eb55916499eff8eb5a814e39d41853c","up":true},{"one":"7125e05bf1bfe6df948c9276b62bc755fc6b0ec8d4ac7724b61ea49591adcf25","other":"2f32d54f06989efb6ca5431b74cd759fba05dbef36ecff8fd506e662026af983","up":true},{"one":"ad9899f78659492ec248a884927a757f3f3b4e76cd2abc46ad8766251fd8afed","other":"886aff1f1e3b86bfe901066bb7948451c18fe3f8cd1b7318b05154890ca8f738","up":true},{"one":"e5149cedd990072f2aaa9735a9259f28973c45876660c2d86ac105e56cca8e68","other":"4d103ec5afee559a5a9242e8d650b67301eaec10e96fc2f184e34d48554108a2","up":true},{"one":"f4565dd2c428c03d7a8d5fad87a6dd5f92ae706529eb6152d36fa584e7cdbe4d","other":"850575577d6b420a87aba388af481e0c044c2f75cf29ff934daf5674318a61ba","up":true},{"one":"4bcf4eb531d5ec4b31d99e8354af03f976524c7858a1e7043e9b7055326f0952","other":"534bcaa98cf9192b35b6014c650ae067e74332c015ebb516d63601427d7376b8","up":true},{"one":"3f946957d910179c7e1a83c44369aacfc31f5727b1a6421a01c8a978ccd349a2","other":"1e2aca93fa9442a0034ae8d295530dde16fcbfa8c37227e2e6863babb0f87c34","up":true},{"one":"33737df75bbac1b41c63f05ea2cf1523b972df17f22bda026db84a49ac35e1e3","other":"90a85cb7363ede161ec21cc89f8b9d4350e566cf10586a66d31b0a8677620aa1","up":true},{"one":"2c3894b6e47cf19ac7ee9fe213196312f676256f670dff25b03563492550bc74","other":"18f6e66e1cc8e620808901b571fdf525ee8f41850fac0bd0e5c5a4de70c5f873","up":true},{"one":"628e7da3359ed6d9dcfbafc7581966e4e09245c321ec78ca75587c9cbb44697f","other":"7dbbdeba3731e1ff43072f8cbd86db147761e1b61753eea7024774dbf46914bd","up":true},{"one":"4d103ec5afee559a5a9242e8d650b67301eaec10e96fc2f184e34d48554108a2","other":"0b72054403f78a64a787f46e9f26bf0de7bbba5a60cb105e6aeea46cb4a1d9fe","up":true},{"one":"f925c85e6457ac01f0cd6b297155f9d3ae611603890d8f3a45e1396d937f8680","other":"bcc6724e54f761361f85147eb102a8d1a1a38810a940ce76b1e361ddcadacaa3","up":true},{"one":"610334a0772d3414652b575f2caa6f2db32224907c24d06fda643db9f2ec2afe","other":"ff36a8810dd44f6d1fa42aa91ff6206bcfb4c1ffbab0df73a181daece329e0e3","up":true},{"one":"2c79af7ea85f96db7897cf8cdb4d002ad2308194e03981876edb8d904ef65137","other":"154be9255e9aebd134a914070f5e6f3d4bba079d9ca738b74244db14e1b586dd","up":true},{"one":"f5b24a1fd2cd2908b408562f9a265ee1a692b137e770137afa5fdfa07b237221","other":"f925c85e6457ac01f0cd6b297155f9d3ae611603890d8f3a45e1396d937f8680","up":true},{"one":"90765b72283f59be4cf9bf7a9e9a22fd6db701c3603cbc0817b4adf2f8e9ce08","other":"b820e480354000c837b1781ec1c493e8776b4834252e6453425ac05b925b5a58","up":true},{"one":"b2a563ac59bab4dfddf7b6e27b80ee7afdeb2e4295411107903f484bcf9fc4f2","other":"c8986871e46f001d15ed8b70f2aa0fea8ae309d5e5671a500f619e3b348c8c15","up":true},{"one":"18f6e66e1cc8e620808901b571fdf525ee8f41850fac0bd0e5c5a4de70c5f873","other":"ff36a8810dd44f6d1fa42aa91ff6206bcfb4c1ffbab0df73a181daece329e0e3","up":true},{"one":"58ed74695bf527bac9a350c86d305e53e08c4999795e11cd3b2a36f5cd25d637","other":"b7cafed41dac01dd59e2bcaeaaab551ebfeab8eaa1f97c1866fe0ddae772807b","up":true},{"one":"0fc59bd04ac9de3195e3c9d0eb573952a5805dd2e7e572078b6e996778adec73","other":"2f32d54f06989efb6ca5431b74cd759fba05dbef36ecff8fd506e662026af983","up":true},{"one":"534bcaa98cf9192b35b6014c650ae067e74332c015ebb516d63601427d7376b8","other":"314a3530a5e0c37d5609149b3ae9c2e078573346bd8fce3c769ebaeb31726ec1","up":true},{"one":"0ff2d2c49547eebc96675e0b88073dea5e9091bee1843ffe567127e34486c348","other":"2f32d54f06989efb6ca5431b74cd759fba05dbef36ecff8fd506e662026af983","up":true},{"one":"f7baef876a62b92ebe5ca9ec6a085e0eb54fd31e2425e662eec747df3cd77592","other":"ef07be559914ec4b5930d90d8d8b6f32dab9eba23acc36f14d512307f9974348","up":true},{"one":"47bfa3767cefcc0831d410d5402e9396e8a412c8c96faf55b451d3ff310f3b02","other":"30bec7cd0a7d002839aed7654129bd2fe2e2ce7f42aa7bae1560e8bf718954c3","up":true},{"one":"898d2f7d46b4961b646d5a6142d54d6233b7f80f668ce234522dd02e2cc545cb","other":"ff36a8810dd44f6d1fa42aa91ff6206bcfb4c1ffbab0df73a181daece329e0e3","up":true},{"one":"51db114a52827f5b74088bd0fc87d35229e7740e7d121bd7699298396516a880","other":"c9f5acafbbf8c66647de05b0848d79451eee490709d53f118fc2051410cc8203","up":true},{"one":"63370e288ab2e4b8403c6678e9c44ae5c7496b5ead614306fceb85986ed29d18","other":"1c47ad5bd8846f777daf59587feccc308f4dc63f6d27b1385ff8085c75bb1aac","up":true},{"one":"58ed74695bf527bac9a350c86d305e53e08c4999795e11cd3b2a36f5cd25d637","other":"c9f5acafbbf8c66647de05b0848d79451eee490709d53f118fc2051410cc8203","up":true},{"one":"f7fa2986ec9f84822b11a6b00bd03a1dd26f2a0fab90b1b308f08caead43cfe1","other":"b65ee2549536a806ceef4a7ccc9544567cafe6204080929fc847df0a3781ccc9","up":true},{"one":"1b830ed484b274a96ec7ba2f9a42b6859412b5334a564014ff3f11597ea3a32d","other":"c786ff8667f509b5a9519984c1d95c83a5d2e257500a71429e8f23af610ce771","up":true},{"one":"a46dd535e3bc8f111a8b2ce5594b62e87741c395e8a2b8fbae33edd29cb8caf8","other":"b911b8e2d72532b7c66ff5f7bffa70f5ddbeea6903a86f9333399f0c4b5f0fe8","up":true},{"one":"41d9c03e44bec3f84a6139ce40ef1e390530f38ed11860575acfad03a49db095","other":"6e68ea86440706a0d73a9508f2247492543163f8fa7e2dc2aa62b74d50261b8b","up":true},{"one":"daec45eca40f48843b41f70267c07e94996ced829f02710f15354fbe26e177e7","other":"41d9c03e44bec3f84a6139ce40ef1e390530f38ed11860575acfad03a49db095","up":true},{"one":"850575577d6b420a87aba388af481e0c044c2f75cf29ff934daf5674318a61ba","other":"06618d829a8a7317a98f1a40ecf8864e1c94c4e270a9e4c008229dc7cf937b7e","up":true},{"one":"0cf596af91eb9b041fe6dbe6b288c5730413850321b5ab176c81447e34ef79c5","other":"63370e288ab2e4b8403c6678e9c44ae5c7496b5ead614306fceb85986ed29d18","up":true},{"one":"fbf5e917be45e909697a9393c4778206333cf1dd9a103978e8d71622ca3b1cc8","other":"9852ce267d53106a6e584d6eddb08e0062eb4a422d2a8d39ad6dccaebac552ff","up":true},{"one":"02d85b9f8e4776224ae5088683a87837b82b2bfb7e047cf373a28393e7aca6e1","other":"0d8a919207fb2d5718eab7da95f8efeb01a4e1ae39602d315f8ba2ff1752d9da","up":true},{"one":"582330d8b8c49331b2aec790dc7325b9cd483fc8129323d31ec429d545042964","other":"6e68ea86440706a0d73a9508f2247492543163f8fa7e2dc2aa62b74d50261b8b","up":true},{"one":"b911b8e2d72532b7c66ff5f7bffa70f5ddbeea6903a86f9333399f0c4b5f0fe8","other":"fbf5e917be45e909697a9393c4778206333cf1dd9a103978e8d71622ca3b1cc8","up":true},{"one":"fe316679eca0e0eb823325812a56fd27da02653b06ada2fd03b27501bda8371a","other":"f7baef876a62b92ebe5ca9ec6a085e0eb54fd31e2425e662eec747df3cd77592","up":true},{"one":"d7aca8f2182bc625d2b3c942bd1161c85bcf1c2b34ecbe3e2fd23cfae6b8a871","other":"30bec7cd0a7d002839aed7654129bd2fe2e2ce7f42aa7bae1560e8bf718954c3","up":true},{"one":"caf6a8e37fd41c1e6ad77a8575cd90354bb1693893952301c9caeb4779c338d3","other":"47bfa3767cefcc0831d410d5402e9396e8a412c8c96faf55b451d3ff310f3b02","up":true},{"one":"1c9caf028df31681b1457a54d4b3ab20009f9fa5bd12417a1ba7efe0c660e6bd","other":"a34ea2e87d4c12adb27d66c2c95300603ff50415974e000bbcc69a5ae059dbf1","up":true},{"one":"88a141c607019477c7b120a506285a7218cad2faa038082e0b9ddfcc9cb78d07","other":"39d1fcae2d23c775214988251505c577b9ac7b6851558ddf9a437dfe143f3845","up":true},{"one":"53a885968d68d8ebf7ed514e662cc13fa03186d2361000a03576531fdca2a25f","other":"b626d472b555e6f950a7142783db8deb443a74e63ef6bd72a87eaf1af14ca805","up":true},{"one":"21012a3a6ef1ece48fd9d7cffe62dc75839dd062efcf3ac5f962c237814da407","other":"ac4d2d6836e2cdf4c88221f6013aac70a451dd15bc403288bd10d0b911cd9a2b","up":true},{"one":"0d8a919207fb2d5718eab7da95f8efeb01a4e1ae39602d315f8ba2ff1752d9da","other":"da67ace34f7076a1d550bc61bc2a31da88d6cd9f9df43b142a8c6bbade1b4aee","up":true},{"one":"da67ace34f7076a1d550bc61bc2a31da88d6cd9f9df43b142a8c6bbade1b4aee","other":"140020a23a840b8840ba0c2c384f853a606330e9743885e9967cf49533db282e","up":true},{"one":"ec52270604007673d1bfda1edbd8bfa945a21141efd85e42b684a9f30f8cddae","other":"959fda0866d3c18e9399e98485d627044079d6f86b075edaea9315402f5d9395","up":true},{"one":"4d59cf1aeecf370e94a7a231887450cef97053b9c88a7fd11e210840af070e29","other":"6c73150490e8be9677c40086de0aefed1939581048e26f4a93f5ca26571a1a8f","up":true},{"one":"4a8b610e09d35aa21c42ab8c3e38de600a944c094e6b86ea56828b5e6904f1f7","other":"ca041da0dc514643d017458d08ff6962ec52c9e66571a239ec395dc8b2546709","up":true},{"one":"c49caff13862dc089f1f9b8180d6efa455648375662719272102c4f8028799d6","other":"47bfa3767cefcc0831d410d5402e9396e8a412c8c96faf55b451d3ff310f3b02","up":true},{"one":"e54784cfbcd89c37c8f758aae70ece3ab4b7f8c30fb4ef7543e04aa89ff4386b","other":"140020a23a840b8840ba0c2c384f853a606330e9743885e9967cf49533db282e","up":true},{"one":"0438f567045d4556a0e7a697028d689ecfd0ae20f9e85c09b48d9f1fd0ee4765","other":"e5d794d64003725a74642f097c0ee76706d78419b6f3ea819d440bc0ad166eac","up":true},{"one":"7b90e939ae2a240f0d74a923afb6bbf11f6d5b99a7bf85f1825b1ea36bce744c","other":"5b632eaf700d173ff15f4727b85817e6173228c304b422434a08c2cad438b825","up":true},{"one":"ca041da0dc514643d017458d08ff6962ec52c9e66571a239ec395dc8b2546709","other":"140020a23a840b8840ba0c2c384f853a606330e9743885e9967cf49533db282e","up":true},{"one":"e8efe8016fe6cf649b2755bee22da35ccc6c9c55d404d5385d61f6ea27b84380","other":"b5b24532d2810e311e10b1d606baf6007f9124b88a178b32713cf1eddae089be","up":true},{"one":"0743bcf2aaa77e916f4a367d6159473c7d80f46a2e4cbe9ef346e423d39d7072","other":"0c64e5af869b1665fd4016ae6d04c8eedd423636f06d78ecb944ee8e3272a82a","up":true},{"one":"30bec7cd0a7d002839aed7654129bd2fe2e2ce7f42aa7bae1560e8bf718954c3","other":"c59e3953b64e5b9ffbe53990a358914f2fa8e3551d33f92b9e3a441bd1baf2cd","up":true},{"one":"d3b0dea1dd3ac71e7e4a30941632eec53cb980aa7cb6cdac95042a5400a878c3","other":"b02b01a5c37cb05c287a3dc7d04e305de26f8d62dc388542eeb43e97db7b4282","up":true},{"one":"4ac755123dcc64ef44db9280311af51f3f7a93e0dee67370d673261220356eb9","other":"30bec7cd0a7d002839aed7654129bd2fe2e2ce7f42aa7bae1560e8bf718954c3","up":true},{"one":"60d7337ef806be95ccaf7b9d663a4289f9afc68edced62904ab50601cf113f45","other":"49cd1efed6a56a78af4ea4ab40813013e76c6a5fb9d2029ee02db5d80f5e41a6","up":true},{"one":"6f2d756566dd5b4a13ffeea9f687c785148f3407a502e28b9d6edfd03b905fdc","other":"77d2ec52dabd5d7f326d4c6afd2aad110487c6bdffa2984060528716ba873462","up":true},{"one":"45584a4bebb948ef5f7b55d4846ec5549d7623682169c0edcab5b3523e68c7da","other":"02d85b9f8e4776224ae5088683a87837b82b2bfb7e047cf373a28393e7aca6e1","up":true},{"one":"478278187cd9af799e83340a2f49b0b7f122fb8e08c0a372a87795426eab364b","other":"60d7337ef806be95ccaf7b9d663a4289f9afc68edced62904ab50601cf113f45","up":true},{"one":"6fe9a02e950a5c3a5ff026b75922ed687d59795ba8eb9c092a8d09a5c64d2453","other":"7a608d2cf9d1d9c5819dc1f9e88e5cb2852aadea01c40e047c2e184b62e7163c","up":true},{"one":"d640472351969a5578e541aca72b7640c583b995fd62607ff3ee3f3f3139aafd","other":"88fefb7506105c0e269baf52955a01b19f55504b13133bac0beab41c9f6e6942","up":true},{"one":"baf219e9229921b773d1ad7eb7eb5216cfa60ccecaa3c5c487e3b71cb600ba12","other":"959fda0866d3c18e9399e98485d627044079d6f86b075edaea9315402f5d9395","up":true},{"one":"30897492824b19540d13ef17c70845be6dde455dca4e4f84cfca14a2c373969f","other":"5f00b3bebef2f5484ff1386298add68a6743a106200ae8a13a27dbb52714ee8f","up":true},{"one":"c441d27a5f4abaa8e3b0f040a6ef85bb8c970031d6a57503a674e36b3d6915d9","other":"f2d5533eed4b0c184952d859d67e44abe5a75a5de6111c8c106b8f4b2d8ccfc4","up":true},{"one":"46fee69dad8b6a6a87d356d10db25d835a0c4e154bf179e88fb4cc65f97d72d7","other":"7290cd3affade5f9e729d1b03549aceafb2576cdbc6789fd688c95495f10bacd","up":true},{"one":"444722a15b01a0d8e6794798d239fe621d59bdfc08823ab47cbd8b9acebd23b4","other":"37801e8d7d46143f78924ed66099f658a94d37edfd2f58d02acb85add03e1894","up":true},{"one":"20aeb14f567dd16f06b0d3b589b83283daa00a5ed10e447860bda946baccdd2d","other":"0c64e5af869b1665fd4016ae6d04c8eedd423636f06d78ecb944ee8e3272a82a","up":true},{"one":"2ccfb5b1f3923d35fef88838c508b98b5516c5d409643881d2304ae49e50eed3","other":"444722a15b01a0d8e6794798d239fe621d59bdfc08823ab47cbd8b9acebd23b4","up":true},{"one":"140020a23a840b8840ba0c2c384f853a606330e9743885e9967cf49533db282e","other":"45584a4bebb948ef5f7b55d4846ec5549d7623682169c0edcab5b3523e68c7da","up":true},{"one":"217f9952af1eb58d5ca5ac7be763716cfe2c0a4f3cdd4ebe4b5df563f919e2d2","other":"e5d794d64003725a74642f097c0ee76706d78419b6f3ea819d440bc0ad166eac","up":true},{"one":"88fefb7506105c0e269baf52955a01b19f55504b13133bac0beab41c9f6e6942","other":"c49caff13862dc089f1f9b8180d6efa455648375662719272102c4f8028799d6","up":true},{"one":"37801e8d7d46143f78924ed66099f658a94d37edfd2f58d02acb85add03e1894","other":"c49caff13862dc089f1f9b8180d6efa455648375662719272102c4f8028799d6","up":true},{"one":"e027a9f7152641c4a41154f8ce4dafd23895c312150efea86bf4152c88d0ca86","other":"ed2d3e1e5693b44494808907c98ec54d6d08331945d2a2c03e31130fef1d2586","up":true},{"one":"915d7a0510bad19266eef8f00ca0cb2efc340253775706495fca8b9160b512cc","other":"88fefb7506105c0e269baf52955a01b19f55504b13133bac0beab41c9f6e6942","up":true},{"one":"d29941d6b8acd86cf32fd1c2181da3ab1da3c2083134b068ca49ce29aa86b783","other":"c6cf46239078edfb343c645f039725fdee1bbba8b0a6da02e2cc456b9223c9a2","up":true},{"one":"6e05179dc90a8f6654d0c9a3f06173371dcfb18b852fdd77f35f75e38f273125","other":"444722a15b01a0d8e6794798d239fe621d59bdfc08823ab47cbd8b9acebd23b4","up":true},{"one":"49cd1efed6a56a78af4ea4ab40813013e76c6a5fb9d2029ee02db5d80f5e41a6","other":"976e57d0c32227222bfd0cbb802f269bdcd52d5d33cf689c66b12c023f5fa8bf","up":true},{"one":"7a608d2cf9d1d9c5819dc1f9e88e5cb2852aadea01c40e047c2e184b62e7163c","other":"5b632eaf700d173ff15f4727b85817e6173228c304b422434a08c2cad438b825","up":true},{"one":"82f9c9009f09de2d6a77b54976d14c14211eae65d886f6ed57560c700716dd5c","other":"da67ace34f7076a1d550bc61bc2a31da88d6cd9f9df43b142a8c6bbade1b4aee","up":true},{"one":"5b632eaf700d173ff15f4727b85817e6173228c304b422434a08c2cad438b825","other":"b626d472b555e6f950a7142783db8deb443a74e63ef6bd72a87eaf1af14ca805","up":true},{"one":"efeae3b7f610dc10acc51068e7718876d147cd78a9a28788c5dba5bb3a6950dc","other":"f5dc78ff71a63fc2014b9553723ee676c63fc078a32a46b7cb172f357a118140","up":true},{"one":"1c8a10ecbd72acb2bbbb8b77ea5404f9e90f4dbf306ec8134cfed70b40aef399","other":"378e7af7cc019186d4f2699e753e2d71302f8f3565572c13b7a1b1c5cb47443c","up":true},{"one":"96fcf14c7f90350091ac6fcb58306ccfb9e4a38d3da59f8ab656854332844cbd","other":"455936fd22c43794e6e2104fd91d3f5d246e3823e8ff8eaf8dc27aa9f3d2ee08","up":true},{"one":"b5b24532d2810e311e10b1d606baf6007f9124b88a178b32713cf1eddae089be","other":"6e05179dc90a8f6654d0c9a3f06173371dcfb18b852fdd77f35f75e38f273125","up":true},{"one":"c786ff8667f509b5a9519984c1d95c83a5d2e257500a71429e8f23af610ce771","other":"b626d472b555e6f950a7142783db8deb443a74e63ef6bd72a87eaf1af14ca805","up":true},{"one":"512ec5c2e6b4d788482462d941117c81fcc0e73f0c15545794dd1b4e03bf2102","other":"30bec7cd0a7d002839aed7654129bd2fe2e2ce7f42aa7bae1560e8bf718954c3","up":true},{"one":"f528aaafd67b20dafdce101db224aa01c70f93bdc91c14f50fa8db1dbf9fc386","other":"49cd1efed6a56a78af4ea4ab40813013e76c6a5fb9d2029ee02db5d80f5e41a6","up":true},{"one":"256e81c5a6fb43bd343345477f8f96aa1947f07ac3297f631ab03f060147b062","other":"07a8c900fec6c477580ed5b38848a8681dc52a19e59fa4cd32f571fe7fb2383a","up":true},{"one":"8025c1fcb98e53f92767d1d43a3057a0acd1e8994bb4a7e3f5e244110e0dcf91","other":"c26fd5e6504c7b3f0a6d9133ff87c98c110eb1c201c5f3bcf6b10653f2b972d2","up":true},{"one":"976e57d0c32227222bfd0cbb802f269bdcd52d5d33cf689c66b12c023f5fa8bf","other":"b5025d153581d333b44df4b9bfa69d87de138905172e4fd317e16f7099a5fcf8","up":true},{"one":"77d2ec52dabd5d7f326d4c6afd2aad110487c6bdffa2984060528716ba873462","other":"b2b5ba1bb188f18f79b295f2c0d48c52c1d1d449ecb9b94b9984f3a6179732c7","up":true},{"one":"1f85b8c05e5dceff0bd8256f8f6d80d4b902a9754ceb952d95ea2e1150ef9e59","other":"f4e09f89287bd1af7833acd85ba7cc71fdb3ff34f2f409e1cf2a878dcd3183dc","up":true},{"one":"4636f00be60a9b494a3ebc9ab41cc7cb53ec0b0beff214db2d0a248dc3aeb6af","other":"256e81c5a6fb43bd343345477f8f96aa1947f07ac3297f631ab03f060147b062","up":true},{"one":"b2b5ba1bb188f18f79b295f2c0d48c52c1d1d449ecb9b94b9984f3a6179732c7","other":"1f85b8c05e5dceff0bd8256f8f6d80d4b902a9754ceb952d95ea2e1150ef9e59","up":true},{"one":"0de3915b0bcc68040c8aa76fbd2cfa0714e9b34c9dbe0838a7cba81c4f73581c","other":"455936fd22c43794e6e2104fd91d3f5d246e3823e8ff8eaf8dc27aa9f3d2ee08","up":true},{"one":"f4e09f89287bd1af7833acd85ba7cc71fdb3ff34f2f409e1cf2a878dcd3183dc","other":"1436aaa8770e9f1c6294e49f4066c16b1caa50524e9b8fd058059e41657d2a83","up":true},{"one":"07a8c900fec6c477580ed5b38848a8681dc52a19e59fa4cd32f571fe7fb2383a","other":"d29941d6b8acd86cf32fd1c2181da3ab1da3c2083134b068ca49ce29aa86b783","up":true},{"one":"b5025d153581d333b44df4b9bfa69d87de138905172e4fd317e16f7099a5fcf8","other":"db6a1f6b342f6be9517f8df01003797c11c837d9aee3cdba5b7859230b36c35d","up":true},{"one":"6967e7438125c2045d575eb9f407b4a38d1bf9dcd1c1c1a97f750da6a21aeff7","other":"6251e9540448726a601699ef4cd19e50c969a746da27228967338cdc09d628bf","up":true},{"one":"44a10530c376b215baff8531eeb2afb8d6714c4d0350d1a6f32761a97cd6c7ec","other":"a6fbe16b81d240ff2f2ed6c93cfd9590731dfb2e7ec3fce1c098fe542bedf299","up":true},{"one":"67aa5463e4b32b363b3d01d2a41ccb03199411057276f4962d053160be29a6ef","other":"da67ace34f7076a1d550bc61bc2a31da88d6cd9f9df43b142a8c6bbade1b4aee","up":true},{"one":"3b88a472beba4a18f8df45678888fd359bac3823900eecfe0037fdc9ad54d416","other":"849bcbb9be43b799fefc5e689efc75125da27f536e97e5b7921031520ae6e5d8","up":true},{"one":"3efc4b120b3eeeac186bf3a4cd42eb8c647f7edb08c23ee643e2bec9d72c5bed","other":"3ec530761ddb87f930fda919be67df18074c6f0795292add1b2a91ff3d9c39e3","up":true},{"one":"ed2d3e1e5693b44494808907c98ec54d6d08331945d2a2c03e31130fef1d2586","other":"d1d719ce1dca507598449afe966396c160ad25ad632112ab268b1d913b490dbd","up":true},{"one":"d1d719ce1dca507598449afe966396c160ad25ad632112ab268b1d913b490dbd","other":"6c4dcdfdee0164a9a3f419430726dd51f9198c65ff6e7de7aaa6f632dcde6794","up":true},{"one":"0c28cd1315890629896d0fe5517524d4eb788f7444709c135ea690ba4e6103d5","other":"b95d88ff6512ef8eaaa6bd842fa44175c1484fc2e8601b83d50a5ffa992bfa3a","up":true},{"one":"6ea51fb6e4783f351dbbfa47b508c78c73233ebaada409dfb55446217f92c4bd","other":"af02b5d107b3a17f539c7f9020ebe74322434634e70c420a7f56776eb5d9db73","up":true},{"one":"574f65867482091aee2774033116c233525eea711706b5ae9ba09b54e896d302","other":"b5025d153581d333b44df4b9bfa69d87de138905172e4fd317e16f7099a5fcf8","up":true},{"one":"7e0458ecdf7081443cab5412529f3948ece659facaca03208496c80dd136e704","other":"68317431e4fa55be4a700e35c6a578307cc32b72336679b5c5618b622ef0c602","up":true},{"one":"db6a1f6b342f6be9517f8df01003797c11c837d9aee3cdba5b7859230b36c35d","other":"8025c1fcb98e53f92767d1d43a3057a0acd1e8994bb4a7e3f5e244110e0dcf91","up":true},{"one":"378e7af7cc019186d4f2699e753e2d71302f8f3565572c13b7a1b1c5cb47443c","other":"d29941d6b8acd86cf32fd1c2181da3ab1da3c2083134b068ca49ce29aa86b783","up":true},{"one":"11d43f6ed0ddd5afa5c8a7abf7c62a4fa865b7a25ee295bf1a49701ef3081363","other":"41092c852fac630df2a9ca0862716f8e9fb8566c904a49c96389071046bc699d","up":true},{"one":"2a0a8eaf1a2749e68f8b841578c160699cf7907ff23842c6d616ad884e5f613e","other":"df1e4e46e8ec26cad74b4f35ab070f12c8f6fddca35ac44c1218ff60fe1e6bab","up":true},{"one":"849bcbb9be43b799fefc5e689efc75125da27f536e97e5b7921031520ae6e5d8","other":"ee5e77df690329c132f2f7fca223cfd384b7bc34ec38763a4eb42780e0585656","up":true},{"one":"3b78bc987c7c31c94e8ada9b4b11b5db9387fe70dd01ce7f3e976d3bec433dec","other":"ae2b3876bdbd6388781b65e31de182564c5d81f4511caf96588b1a287760b3dd","up":true},{"one":"c620752a083ca1ff0398937235cf964133939452c293c799ce07ff8aa2bde420","other":"c8986871e46f001d15ed8b70f2aa0fea8ae309d5e5671a500f619e3b348c8c15","up":true},{"one":"aeb4c75a57ccfc9ac053a3d363cf7c1e3e201406587769ab6615d5c2f86a5410","other":"bcc6724e54f761361f85147eb102a8d1a1a38810a940ce76b1e361ddcadacaa3","up":true},{"one":"14dfb8414d17b2df15eaf59571a8cfec99b1fd674561da63ee99af853bda07da","other":"4646fe4c119078738612b44a356089b3c73a08e11cfd910675d211ae6b20b8fd","up":true},{"one":"582330d8b8c49331b2aec790dc7325b9cd483fc8129323d31ec429d545042964","other":"6c73150490e8be9677c40086de0aefed1939581048e26f4a93f5ca26571a1a8f","up":true},{"one":"4d59cf1aeecf370e94a7a231887450cef97053b9c88a7fd11e210840af070e29","other":"7dd3078c71087ab88d4d26a962820bcb79b8ce30e91c1f9a69d4bf8d38086960","up":true},{"one":"b2a563ac59bab4dfddf7b6e27b80ee7afdeb2e4295411107903f484bcf9fc4f2","other":"850575577d6b420a87aba388af481e0c044c2f75cf29ff934daf5674318a61ba","up":true},{"one":"045ba8da4641da3f0b8058bb0d9d8aafbb81496dc1cae2a3fd9c039a7e1cafb6","other":"19faaf891eb6a716902ec29d201dc2094ee474acff188ae86faf9760674b2d37","up":true},{"one":"165f1af67aa1d24569e0bdff61d29b3c39e93250071d8f25b5be6face209ac6a","other":"1c9caf028df31681b1457a54d4b3ab20009f9fa5bd12417a1ba7efe0c660e6bd","up":true},{"one":"13d6cb9316e289923e2d1de7f3c966d0cbabce3acdb8017122944f4abb140912","other":"154be9255e9aebd134a914070f5e6f3d4bba079d9ca738b74244db14e1b586dd","up":true},{"one":"f773b83f1a1de2ab6660edb0b765cfccec6778061ee25c5a84f968625686ef60","other":"f31cc744ea921fee8364c5269b1ce7ec6b5f0c0cbb6885efbf602de5b36f6169","up":true},{"one":"b820e480354000c837b1781ec1c493e8776b4834252e6453425ac05b925b5a58","other":"82dd83838cb982b89505ef249d353a20e434346dd78b71cd9b809f71d5c112da","up":true},{"one":"524db81b135af8dc309b942c082a7291dddb851866fc608753f937ee77015be0","other":"ee5e77df690329c132f2f7fca223cfd384b7bc34ec38763a4eb42780e0585656","up":true},{"one":"534bcaa98cf9192b35b6014c650ae067e74332c015ebb516d63601427d7376b8","other":"3e8efcaf3002522b39065ea30c15426d1eb55916499eff8eb5a814e39d41853c","up":true},{"one":"b95d88ff6512ef8eaaa6bd842fa44175c1484fc2e8601b83d50a5ffa992bfa3a","other":"f5dc78ff71a63fc2014b9553723ee676c63fc078a32a46b7cb172f357a118140","up":true},{"one":"04518d7120fa8a528d983ca1ee6d5d09ba24a4e853fb22bc9084cdf34995e95f","other":"ff36a8810dd44f6d1fa42aa91ff6206bcfb4c1ffbab0df73a181daece329e0e3","up":true},{"one":"66e7fc2df51f5df8d7329851fe9357d895e9d5dfdc25f8d92bdb10a960f7e15a","other":"3e8efcaf3002522b39065ea30c15426d1eb55916499eff8eb5a814e39d41853c","up":true},{"one":"06618d829a8a7317a98f1a40ecf8864e1c94c4e270a9e4c008229dc7cf937b7e","other":"b820e480354000c837b1781ec1c493e8776b4834252e6453425ac05b925b5a58","up":true},{"one":"53fe2c13926507a7a6c27d0fb30a2c358c4c7bfa40df8b5fa8ec8986c2450519","other":"33b5c521b4208e26414db2e05c9a8ccc001a524d928579d44d2e74d14a56593e","up":true},{"one":"4646fe4c119078738612b44a356089b3c73a08e11cfd910675d211ae6b20b8fd","other":"49eaad68d23dd63ef26029fa3f4e2578f3deca8708bbc838750d8b6dbe9eaa38","up":true},{"one":"c1f9e8e1d509febdf1f267bb227741e513420048a2e669ac9eef4b05a29cf10b","other":"9fa0215e980dc907df4cc47ab4937f36527d78f9837493016fd4fc51e617299c","up":true},{"one":"1f670c53b4c597beaffacd84e3a697225b04cded9219d0a28e1fe525a3cadcf5","other":"2d3645c4fdf9a2809a909076b9ee5fb98fa880f6faeff914f1a2987af928cd79","up":true},{"one":"7920d69cf7e458fce0781ea1a4e07768e1a69f6818090eff0abf0b4a0c2c35f8","other":"4d59cf1aeecf370e94a7a231887450cef97053b9c88a7fd11e210840af070e29","up":true},{"one":"bb90464f769a85549c150f861775aa67924c7c651f393f6c70772707376a5c7e","other":"0a005eb9c10c5cc9f720cfec2a655811d391671597b4f32d12df291ec76b2c13","up":true},{"one":"d863ba7405eb07ccddbf1d34efbcbec2867a93a109ed9413d9aecf30d3645a6a","other":"df1e4e46e8ec26cad74b4f35ab070f12c8f6fddca35ac44c1218ff60fe1e6bab","up":true},{"one":"5db08436c64f4cc9e2b3950e35bc8ad739825e3efa67a642c771d95b34cb420c","other":"006727dc6f59b120b24c17b8e63f80ef3439105f8118ffeed408f105a48ee60c","up":true},{"one":"f27f1044777e05f3f60165d0d2fc3e7667fe148e0ca7a097805d60b9f61025f7","other":"e8830f2b2f7d08df15bd33f4b2841d01d9d62c1621234bd6ae86743e52360f3e","up":true},{"one":"f31cc744ea921fee8364c5269b1ce7ec6b5f0c0cbb6885efbf602de5b36f6169","other":"9fa0215e980dc907df4cc47ab4937f36527d78f9837493016fd4fc51e617299c","up":true},{"one":"461cc9f064e6f4f06ff38e0d1f3f00ef8807ba31c7258e453cc682e9551bb1c6","other":"886aff1f1e3b86bfe901066bb7948451c18fe3f8cd1b7318b05154890ca8f738","up":true},{"one":"6c73150490e8be9677c40086de0aefed1939581048e26f4a93f5ca26571a1a8f","other":"41d9c03e44bec3f84a6139ce40ef1e390530f38ed11860575acfad03a49db095","up":true},{"one":"179f21d2e0421b8056ee9a260bc0985bfa64a52a36d0a8fbce4e03f3120d1d65","other":"4bcf4eb531d5ec4b31d99e8354af03f976524c7858a1e7043e9b7055326f0952","up":true},{"one":"d887070a0568282c69e96ce65612ba72d5ea26b5c80671435d6e1ed2c4b49301","other":"bb90464f769a85549c150f861775aa67924c7c651f393f6c70772707376a5c7e","up":true},{"one":"2abb938b889a2eb735134462985a56056be48f189b5b89d23b653864c76427f4","other":"c1f9e8e1d509febdf1f267bb227741e513420048a2e669ac9eef4b05a29cf10b","up":true},{"one":"0a005eb9c10c5cc9f720cfec2a655811d391671597b4f32d12df291ec76b2c13","other":"11d43f6ed0ddd5afa5c8a7abf7c62a4fa865b7a25ee295bf1a49701ef3081363","up":true},{"one":"0af9a57a2f66835cd3e4e71bc026013a8a99ca337a7b6b6cc34e11d8da212a4f","other":"bb90464f769a85549c150f861775aa67924c7c651f393f6c70772707376a5c7e","up":true},{"one":"df1e4e46e8ec26cad74b4f35ab070f12c8f6fddca35ac44c1218ff60fe1e6bab","other":"f629b8b9e79c75ac559daf9bf4fc8672bfdd595cf2c5d17a8885282626fc65a5","up":true},{"one":"9d0f804849b72397646ba48208ba1e01dcf4de04e788016c4a1a0c93e650ddf5","other":"2a0a8eaf1a2749e68f8b841578c160699cf7907ff23842c6d616ad884e5f613e","up":true},{"one":"33b5c521b4208e26414db2e05c9a8ccc001a524d928579d44d2e74d14a56593e","other":"154be9255e9aebd134a914070f5e6f3d4bba079d9ca738b74244db14e1b586dd","up":true},{"one":"7dc2a9573f253f362ef1b21bbfcc144b11a6febc58aa3c4430224160e9fa738c","other":"67dcfd21ece30b41a39bc55c0986fca8f401bb3acba821969519f09d0933e8bd","up":true},{"one":"e8548b5df15adf0f2a997ff5709827beb5e1d36bb08a2f2d017746d5c0e83fca","other":"c8986871e46f001d15ed8b70f2aa0fea8ae309d5e5671a500f619e3b348c8c15","up":true},{"one":"8f2182c2c2d0eeb2e887dbc350ae7257819f536032851ffdf29e7842cb1a62cc","other":"d887070a0568282c69e96ce65612ba72d5ea26b5c80671435d6e1ed2c4b49301","up":true},{"one":"5f00b3bebef2f5484ff1386298add68a6743a106200ae8a13a27dbb52714ee8f","other":"63370e288ab2e4b8403c6678e9c44ae5c7496b5ead614306fceb85986ed29d18","up":true},{"one":"9852ce267d53106a6e584d6eddb08e0062eb4a422d2a8d39ad6dccaebac552ff","other":"a34ea2e87d4c12adb27d66c2c95300603ff50415974e000bbcc69a5ae059dbf1","up":true},{"one":"21a044e772b7c955fe4a6fb7c3a9a20e95d48b7fd6b9518741782f04f5f1f5c2","other":"179f21d2e0421b8056ee9a260bc0985bfa64a52a36d0a8fbce4e03f3120d1d65","up":true},{"one":"ff36a8810dd44f6d1fa42aa91ff6206bcfb4c1ffbab0df73a181daece329e0e3","other":"17040a3aad5930d8e0de1011fd2996b7d09225989f0dc1ae8f7e7a52dd26ab4e","up":true},{"one":"2c3894b6e47cf19ac7ee9fe213196312f676256f670dff25b03563492550bc74","other":"04518d7120fa8a528d983ca1ee6d5d09ba24a4e853fb22bc9084cdf34995e95f","up":true},{"one":"03285e06657032778feff0b43828c964dbf9de669f63171aeb587aa1a1facc0a","other":"4bcf4eb531d5ec4b31d99e8354af03f976524c7858a1e7043e9b7055326f0952","up":true},{"one":"00c6488a842ece7a8b0daf064e405de03a4257d308840ea52bfd48d23f54d895","other":"154be9255e9aebd134a914070f5e6f3d4bba079d9ca738b74244db14e1b586dd","up":true},{"one":"33737df75bbac1b41c63f05ea2cf1523b972df17f22bda026db84a49ac35e1e3","other":"3f946957d910179c7e1a83c44369aacfc31f5727b1a6421a01c8a978ccd349a2","up":true},{"one":"7125e05bf1bfe6df948c9276b62bc755fc6b0ec8d4ac7724b61ea49591adcf25","other":"33b5c521b4208e26414db2e05c9a8ccc001a524d928579d44d2e74d14a56593e","up":true},{"one":"49eaad68d23dd63ef26029fa3f4e2578f3deca8708bbc838750d8b6dbe9eaa38","other":"00c6488a842ece7a8b0daf064e405de03a4257d308840ea52bfd48d23f54d895","up":true},{"one":"ef07be559914ec4b5930d90d8d8b6f32dab9eba23acc36f14d512307f9974348","other":"886aff1f1e3b86bfe901066bb7948451c18fe3f8cd1b7318b05154890ca8f738","up":true},{"one":"006727dc6f59b120b24c17b8e63f80ef3439105f8118ffeed408f105a48ee60c","other":"ad9899f78659492ec248a884927a757f3f3b4e76cd2abc46ad8766251fd8afed","up":true},{"one":"2c79af7ea85f96db7897cf8cdb4d002ad2308194e03981876edb8d904ef65137","other":"0ff2d2c49547eebc96675e0b88073dea5e9091bee1843ffe567127e34486c348","up":true},{"one":"e775e9759d4701bd9b43c22f1d1be73c1262b2752bb23cb3857485daf1dcad2d","other":"fbc8087a723c564ca0139329902e79748af46699ea7be24d57909a7e8e96f681","up":true},{"one":"4d103ec5afee559a5a9242e8d650b67301eaec10e96fc2f184e34d48554108a2","other":"90a85cb7363ede161ec21cc89f8b9d4350e566cf10586a66d31b0a8677620aa1","up":true},{"one":"ad9899f78659492ec248a884927a757f3f3b4e76cd2abc46ad8766251fd8afed","other":"2a97d308a720274a440dfa6901ca0a5480af9bab58dd8a6c4afdb9c83ea964c3","up":true},{"one":"c832b4ad64a17da4b796ffcac646c2aa666b276aabb7eb3bfe7981d64a4da402","other":"ef07be559914ec4b5930d90d8d8b6f32dab9eba23acc36f14d512307f9974348","up":true},{"one":"16725e318322353befc2f2aba112f0984bc011821bb16c98e2cd8b39cd62aea1","other":"e54b643cbc95d9f5d27ec3760d892b6802981bfabf4f9979267d66259df982c7","up":true},{"one":"ac4d2d6836e2cdf4c88221f6013aac70a451dd15bc403288bd10d0b911cd9a2b","other":"2c3894b6e47cf19ac7ee9fe213196312f676256f670dff25b03563492550bc74","up":true},{"one":"e8830f2b2f7d08df15bd33f4b2841d01d9d62c1621234bd6ae86743e52360f3e","other":"628e7da3359ed6d9dcfbafc7581966e4e09245c321ec78ca75587c9cbb44697f","up":true},{"one":"3630e05326bacea8fcc739dec42085f845f416ddc698c76ff91f099eb1dc5007","other":"39d1fcae2d23c775214988251505c577b9ac7b6851558ddf9a437dfe143f3845","up":true},{"one":"bcc6724e54f761361f85147eb102a8d1a1a38810a940ce76b1e361ddcadacaa3","other":"a46dd535e3bc8f111a8b2ce5594b62e87741c395e8a2b8fbae33edd29cb8caf8","up":true},{"one":"20aeb14f567dd16f06b0d3b589b83283daa00a5ed10e447860bda946baccdd2d","other":"30897492824b19540d13ef17c70845be6dde455dca4e4f84cfca14a2c373969f","up":true},{"one":"103b232552b94090232195dc88f84823701f35ae536b5af6dd33fa655a33cbae","other":"4e5a46c004e85cf86a02fdfbf2243018825d015debfb9a077a1283d302293b3a","up":true},{"one":"5efb3bfc199f5408f79bd6bd5171b4bf332c68a8e49242eb4f6a589b963565c6","other":"49eaad68d23dd63ef26029fa3f4e2578f3deca8708bbc838750d8b6dbe9eaa38","up":true},{"one":"90765b72283f59be4cf9bf7a9e9a22fd6db701c3603cbc0817b4adf2f8e9ce08","other":"b2a563ac59bab4dfddf7b6e27b80ee7afdeb2e4295411107903f484bcf9fc4f2","up":true},{"one":"610334a0772d3414652b575f2caa6f2db32224907c24d06fda643db9f2ec2afe","other":"2c3894b6e47cf19ac7ee9fe213196312f676256f670dff25b03563492550bc74","up":true},{"one":"c8986871e46f001d15ed8b70f2aa0fea8ae309d5e5671a500f619e3b348c8c15","other":"534bcaa98cf9192b35b6014c650ae067e74332c015ebb516d63601427d7376b8","up":true},{"one":"898d2f7d46b4961b646d5a6142d54d6233b7f80f668ce234522dd02e2cc545cb","other":"ac4d2d6836e2cdf4c88221f6013aac70a451dd15bc403288bd10d0b911cd9a2b","up":true},{"one":"3efc4b120b3eeeac186bf3a4cd42eb8c647f7edb08c23ee643e2bec9d72c5bed","other":"f45f1f2e59e947e04fa15bcf87f872ef6d73b73f778e12d1f9b8930ea166eefc","up":true},{"one":"605a46991af15cd60e67413c712b99ff8f21173c96a7990f2728ad6cac2bb9d8","other":"7dd3078c71087ab88d4d26a962820bcb79b8ce30e91c1f9a69d4bf8d38086960","up":true},{"one":"e54b643cbc95d9f5d27ec3760d892b6802981bfabf4f9979267d66259df982c7","other":"f4565dd2c428c03d7a8d5fad87a6dd5f92ae706529eb6152d36fa584e7cdbe4d","up":true},{"one":"6ea51fb6e4783f351dbbfa47b508c78c73233ebaada409dfb55446217f92c4bd","other":"b95d88ff6512ef8eaaa6bd842fa44175c1484fc2e8601b83d50a5ffa992bfa3a","up":true},{"one":"6251e9540448726a601699ef4cd19e50c969a746da27228967338cdc09d628bf","other":"738c2d42458965d03c8f9f055eaf0e3edf3dfa2a4de0a048ec05b78e7b765c90","up":true},{"one":"5cd2377226825dc7ea582315cd108d23502df4e9c7c09fc07e7b4aa56440de29","other":"49eaad68d23dd63ef26029fa3f4e2578f3deca8708bbc838750d8b6dbe9eaa38","up":true},{"one":"6967e7438125c2045d575eb9f407b4a38d1bf9dcd1c1c1a97f750da6a21aeff7","other":"4c9eab8ab45405a6d4bab46430efc04b8e6aec1d944f88435eca41361925f379","up":true},{"one":"0fc59bd04ac9de3195e3c9d0eb573952a5805dd2e7e572078b6e996778adec73","other":"1c9caf028df31681b1457a54d4b3ab20009f9fa5bd12417a1ba7efe0c660e6bd","up":true},{"one":"0ff2d2c49547eebc96675e0b88073dea5e9091bee1843ffe567127e34486c348","other":"9852ce267d53106a6e584d6eddb08e0062eb4a422d2a8d39ad6dccaebac552ff","up":true},{"one":"f5b24a1fd2cd2908b408562f9a265ee1a692b137e770137afa5fdfa07b237221","other":"00c6488a842ece7a8b0daf064e405de03a4257d308840ea52bfd48d23f54d895","up":true},{"one":"b7cafed41dac01dd59e2bcaeaaab551ebfeab8eaa1f97c1866fe0ddae772807b","other":"53087084708cc5ee63ac459b18fa10ae52a823139b4ecba6c8691d4934f2f971","up":true},{"one":"0b72054403f78a64a787f46e9f26bf0de7bbba5a60cb105e6aeea46cb4a1d9fe","other":"3f946957d910179c7e1a83c44369aacfc31f5727b1a6421a01c8a978ccd349a2","up":true},{"one":"fbf5e917be45e909697a9393c4778206333cf1dd9a103978e8d71622ca3b1cc8","other":"eb98fb45dd5754f24f9df0c9ecbb93932e3d9d7735cd6d0ddd4a8675bb4ef554","up":true},{"one":"90a85cb7363ede161ec21cc89f8b9d4350e566cf10586a66d31b0a8677620aa1","other":"3630e05326bacea8fcc739dec42085f845f416ddc698c76ff91f099eb1dc5007","up":true},{"one":"f925c85e6457ac01f0cd6b297155f9d3ae611603890d8f3a45e1396d937f8680","other":"aeb4c75a57ccfc9ac053a3d363cf7c1e3e201406587769ab6615d5c2f86a5410","up":true},{"one":"154be9255e9aebd134a914070f5e6f3d4bba079d9ca738b74244db14e1b586dd","other":"605a46991af15cd60e67413c712b99ff8f21173c96a7990f2728ad6cac2bb9d8","up":true},{"one":"3e8efcaf3002522b39065ea30c15426d1eb55916499eff8eb5a814e39d41853c","other":"628e7da3359ed6d9dcfbafc7581966e4e09245c321ec78ca75587c9cbb44697f","up":true},{"one":"378e7af7cc019186d4f2699e753e2d71302f8f3565572c13b7a1b1c5cb47443c","other":"17db15893bf39b42593ee1de975aba6832046d9da5b4b493ec44272738a29cef","up":true},{"one":"5f00b3bebef2f5484ff1386298add68a6743a106200ae8a13a27dbb52714ee8f","other":"f629b8b9e79c75ac559daf9bf4fc8672bfdd595cf2c5d17a8885282626fc65a5","up":true},{"one":"524db81b135af8dc309b942c082a7291dddb851866fc608753f937ee77015be0","other":"6251e9540448726a601699ef4cd19e50c969a746da27228967338cdc09d628bf","up":true},{"one":"c1f9e8e1d509febdf1f267bb227741e513420048a2e669ac9eef4b05a29cf10b","other":"e7fa7112adc7b023dd5965e620277122542153f87eaf5deeacc8a51f1778ba77","up":true},{"one":"41d9c03e44bec3f84a6139ce40ef1e390530f38ed11860575acfad03a49db095","other":"7dd3078c71087ab88d4d26a962820bcb79b8ce30e91c1f9a69d4bf8d38086960","up":true},{"one":"af02b5d107b3a17f539c7f9020ebe74322434634e70c420a7f56776eb5d9db73","other":"0c28cd1315890629896d0fe5517524d4eb788f7444709c135ea690ba4e6103d5","up":true},{"one":"eb98fb45dd5754f24f9df0c9ecbb93932e3d9d7735cd6d0ddd4a8675bb4ef554","other":"b02b01a5c37cb05c287a3dc7d04e305de26f8d62dc388542eeb43e97db7b4282","up":true},{"one":"35e6b1d31f594c06b759525434a7e717ebe6f27ca0188f247ed1247664a50563","other":"0e5e0bb1383b2ec569b157a1d2ae6900592ab892a28367f5613a4e29cb265088","up":true},{"one":"9fa0215e980dc907df4cc47ab4937f36527d78f9837493016fd4fc51e617299c","other":"e54b643cbc95d9f5d27ec3760d892b6802981bfabf4f9979267d66259df982c7","up":true},{"one":"cc2037c08942a094df12f45831f28e0015fc3ac04d5b8f24ffea9bf3a0b02c39","other":"d3b0dea1dd3ac71e7e4a30941632eec53cb980aa7cb6cdac95042a5400a878c3","up":true},{"one":"35e6b1d31f594c06b759525434a7e717ebe6f27ca0188f247ed1247664a50563","other":"33737df75bbac1b41c63f05ea2cf1523b972df17f22bda026db84a49ac35e1e3","up":true},{"one":"3630e05326bacea8fcc739dec42085f845f416ddc698c76ff91f099eb1dc5007","other":"ae2b3876bdbd6388781b65e31de182564c5d81f4511caf96588b1a287760b3dd","up":true},{"one":"3b78bc987c7c31c94e8ada9b4b11b5db9387fe70dd01ce7f3e976d3bec433dec","other":"a3693801a91180410cf3e85d7c09ac8054a769e7b1d55c9e7a46850cb8217da0","up":true},{"one":"ef1b70bf090bc9994b1d45e2812c56ecb430a89c346a436bd10880bcda700351","other":"4d103ec5afee559a5a9242e8d650b67301eaec10e96fc2f184e34d48554108a2","up":true},{"one":"1f670c53b4c597beaffacd84e3a697225b04cded9219d0a28e1fe525a3cadcf5","other":"20aeb14f567dd16f06b0d3b589b83283daa00a5ed10e447860bda946baccdd2d","up":true},{"one":"efeae3b7f610dc10acc51068e7718876d147cd78a9a28788c5dba5bb3a6950dc","other":"e027a9f7152641c4a41154f8ce4dafd23895c312150efea86bf4152c88d0ca86","up":true},{"one":"c6cf46239078edfb343c645f039725fdee1bbba8b0a6da02e2cc456b9223c9a2","other":"77d2ec52dabd5d7f326d4c6afd2aad110487c6bdffa2984060528716ba873462","up":true},{"one":"07a8c900fec6c477580ed5b38848a8681dc52a19e59fa4cd32f571fe7fb2383a","other":"c6cf46239078edfb343c645f039725fdee1bbba8b0a6da02e2cc456b9223c9a2","up":true},{"one":"06618d829a8a7317a98f1a40ecf8864e1c94c4e270a9e4c008229dc7cf937b7e","other":"179f21d2e0421b8056ee9a260bc0985bfa64a52a36d0a8fbce4e03f3120d1d65","up":true},{"one":"7a608d2cf9d1d9c5819dc1f9e88e5cb2852aadea01c40e047c2e184b62e7163c","other":"512ec5c2e6b4d788482462d941117c81fcc0e73f0c15545794dd1b4e03bf2102","up":true},{"one":"574f65867482091aee2774033116c233525eea711706b5ae9ba09b54e896d302","other":"8025c1fcb98e53f92767d1d43a3057a0acd1e8994bb4a7e3f5e244110e0dcf91","up":true},{"one":"b65ee2549536a806ceef4a7ccc9544567cafe6204080929fc847df0a3781ccc9","other":"ec52270604007673d1bfda1edbd8bfa945a21141efd85e42b684a9f30f8cddae","up":true},{"one":"0438f567045d4556a0e7a697028d689ecfd0ae20f9e85c09b48d9f1fd0ee4765","other":"444722a15b01a0d8e6794798d239fe621d59bdfc08823ab47cbd8b9acebd23b4","up":true},{"one":"0de3915b0bcc68040c8aa76fbd2cfa0714e9b34c9dbe0838a7cba81c4f73581c","other":"378e7af7cc019186d4f2699e753e2d71302f8f3565572c13b7a1b1c5cb47443c","up":true},{"one":"0438f567045d4556a0e7a697028d689ecfd0ae20f9e85c09b48d9f1fd0ee4765","other":"63370e288ab2e4b8403c6678e9c44ae5c7496b5ead614306fceb85986ed29d18","up":true},{"one":"1c8a10ecbd72acb2bbbb8b77ea5404f9e90f4dbf306ec8134cfed70b40aef399","other":"0de3915b0bcc68040c8aa76fbd2cfa0714e9b34c9dbe0838a7cba81c4f73581c","up":true},{"one":"4d6b939fb67338c484948ab92b2ceea4d4b666d7e08773673cd7c8f83f495b89","other":"2abb938b889a2eb735134462985a56056be48f189b5b89d23b653864c76427f4","up":true},{"one":"775e7be502df8fd938cf9c42ee4fac33e460a4b6992b9efeb8dc1ff7dde5c40f","other":"f31cc744ea921fee8364c5269b1ce7ec6b5f0c0cbb6885efbf602de5b36f6169","up":true},{"one":"0e5e0bb1383b2ec569b157a1d2ae6900592ab892a28367f5613a4e29cb265088","other":"3f946957d910179c7e1a83c44369aacfc31f5727b1a6421a01c8a978ccd349a2","up":true},{"one":"58ed74695bf527bac9a350c86d305e53e08c4999795e11cd3b2a36f5cd25d637","other":"461cc9f064e6f4f06ff38e0d1f3f00ef8807ba31c7258e453cc682e9551bb1c6","up":true},{"one":"baddc778aea97acdbbb5bc99744a5545abab9f6047c81f328761645287ac391c","other":"ef1b70bf090bc9994b1d45e2812c56ecb430a89c346a436bd10880bcda700351","up":true},{"one":"f45f1f2e59e947e04fa15bcf87f872ef6d73b73f778e12d1f9b8930ea166eefc","other":"738c2d42458965d03c8f9f055eaf0e3edf3dfa2a4de0a048ec05b78e7b765c90","up":true},{"one":"ba884e5cfa1ee6eb38217181711e01bb0c37b3e33d1424dfa89ed3e29ef6205b","other":"e5149cedd990072f2aaa9735a9259f28973c45876660c2d86ac105e56cca8e68","up":true},{"one":"6fe9a02e950a5c3a5ff026b75922ed687d59795ba8eb9c092a8d09a5c64d2453","other":"c786ff8667f509b5a9519984c1d95c83a5d2e257500a71429e8f23af610ce771","up":true},{"one":"f7baef876a62b92ebe5ca9ec6a085e0eb54fd31e2425e662eec747df3cd77592","other":"ad9899f78659492ec248a884927a757f3f3b4e76cd2abc46ad8766251fd8afed","up":true},{"one":"f4565dd2c428c03d7a8d5fad87a6dd5f92ae706529eb6152d36fa584e7cdbe4d","other":"b2a563ac59bab4dfddf7b6e27b80ee7afdeb2e4295411107903f484bcf9fc4f2","up":true},{"one":"7dc2a9573f253f362ef1b21bbfcc144b11a6febc58aa3c4430224160e9fa738c","other":"775e7be502df8fd938cf9c42ee4fac33e460a4b6992b9efeb8dc1ff7dde5c40f","up":true},{"one":"b95d88ff6512ef8eaaa6bd842fa44175c1484fc2e8601b83d50a5ffa992bfa3a","other":"849bcbb9be43b799fefc5e689efc75125da27f536e97e5b7921031520ae6e5d8","up":true},{"one":"f4565dd2c428c03d7a8d5fad87a6dd5f92ae706529eb6152d36fa584e7cdbe4d","other":"b820e480354000c837b1781ec1c493e8776b4834252e6453425ac05b925b5a58","up":true},{"one":"d863ba7405eb07ccddbf1d34efbcbec2867a93a109ed9413d9aecf30d3645a6a","other":"17040a3aad5930d8e0de1011fd2996b7d09225989f0dc1ae8f7e7a52dd26ab4e","up":true},{"one":"165f1af67aa1d24569e0bdff61d29b3c39e93250071d8f25b5be6face209ac6a","other":"2f32d54f06989efb6ca5431b74cd759fba05dbef36ecff8fd506e662026af983","up":true},{"one":"0a005eb9c10c5cc9f720cfec2a655811d391671597b4f32d12df291ec76b2c13","other":"39d1fcae2d23c775214988251505c577b9ac7b6851558ddf9a437dfe143f3845","up":true},{"one":"045ba8da4641da3f0b8058bb0d9d8aafbb81496dc1cae2a3fd9c039a7e1cafb6","other":"2abb938b889a2eb735134462985a56056be48f189b5b89d23b653864c76427f4","up":true},{"one":"d7aca8f2182bc625d2b3c942bd1161c85bcf1c2b34ecbe3e2fd23cfae6b8a871","other":"6fe9a02e950a5c3a5ff026b75922ed687d59795ba8eb9c092a8d09a5c64d2453","up":true},{"one":"3efc4b120b3eeeac186bf3a4cd42eb8c647f7edb08c23ee643e2bec9d72c5bed","other":"19faaf891eb6a716902ec29d201dc2094ee474acff188ae86faf9760674b2d37","up":true},{"one":"0c28cd1315890629896d0fe5517524d4eb788f7444709c135ea690ba4e6103d5","other":"3ec530761ddb87f930fda919be67df18074c6f0795292add1b2a91ff3d9c39e3","up":true},{"one":"455936fd22c43794e6e2104fd91d3f5d246e3823e8ff8eaf8dc27aa9f3d2ee08","other":"c6cf46239078edfb343c645f039725fdee1bbba8b0a6da02e2cc456b9223c9a2","up":true},{"one":"5cd2377226825dc7ea582315cd108d23502df4e9c7c09fc07e7b4aa56440de29","other":"154be9255e9aebd134a914070f5e6f3d4bba079d9ca738b74244db14e1b586dd","up":true},{"one":"5b632eaf700d173ff15f4727b85817e6173228c304b422434a08c2cad438b825","other":"6fe9a02e950a5c3a5ff026b75922ed687d59795ba8eb9c092a8d09a5c64d2453","up":true},{"one":"03ccd8d52597d18c0b178ab7361d847d63aad3af920a28345977ae170a1dafcd","other":"0743bcf2aaa77e916f4a367d6159473c7d80f46a2e4cbe9ef346e423d39d7072","up":true},{"one":"7920d69cf7e458fce0781ea1a4e07768e1a69f6818090eff0abf0b4a0c2c35f8","other":"41d9c03e44bec3f84a6139ce40ef1e390530f38ed11860575acfad03a49db095","up":true},{"one":"e775e9759d4701bd9b43c22f1d1be73c1262b2752bb23cb3857485daf1dcad2d","other":"f4565dd2c428c03d7a8d5fad87a6dd5f92ae706529eb6152d36fa584e7cdbe4d","up":true},{"one":"2abb938b889a2eb735134462985a56056be48f189b5b89d23b653864c76427f4","other":"4bcf4eb531d5ec4b31d99e8354af03f976524c7858a1e7043e9b7055326f0952","up":true},{"one":"a6fbe16b81d240ff2f2ed6c93cfd9590731dfb2e7ec3fce1c098fe542bedf299","other":"96fcf14c7f90350091ac6fcb58306ccfb9e4a38d3da59f8ab656854332844cbd","up":true},{"one":"1436aaa8770e9f1c6294e49f4066c16b1caa50524e9b8fd058059e41657d2a83","other":"96fcf14c7f90350091ac6fcb58306ccfb9e4a38d3da59f8ab656854332844cbd","up":true},{"one":"a653302730df3d58f796906a93933aa81494f2588d9485ab7676ec3b0ccbb426","other":"63370e288ab2e4b8403c6678e9c44ae5c7496b5ead614306fceb85986ed29d18","up":true},{"one":"4636f00be60a9b494a3ebc9ab41cc7cb53ec0b0beff214db2d0a248dc3aeb6af","other":"24b85c10f098725938ea7d87cd24a4b10358129906fca9790fc266ea8784b538","up":true},{"one":"4d6b939fb67338c484948ab92b2ceea4d4b666d7e08773673cd7c8f83f495b89","other":"7dbbdeba3731e1ff43072f8cbd86db147761e1b61753eea7024774dbf46914bd","up":true},{"one":"3efc4b120b3eeeac186bf3a4cd42eb8c647f7edb08c23ee643e2bec9d72c5bed","other":"524db81b135af8dc309b942c082a7291dddb851866fc608753f937ee77015be0","up":true},{"one":"0fc59bd04ac9de3195e3c9d0eb573952a5805dd2e7e572078b6e996778adec73","other":"33b5c521b4208e26414db2e05c9a8ccc001a524d928579d44d2e74d14a56593e","up":true},{"one":"314a3530a5e0c37d5609149b3ae9c2e078573346bd8fce3c769ebaeb31726ec1","other":"21a044e772b7c955fe4a6fb7c3a9a20e95d48b7fd6b9518741782f04f5f1f5c2","up":true},{"one":"f528aaafd67b20dafdce101db224aa01c70f93bdc91c14f50fa8db1dbf9fc386","other":"67aa5463e4b32b363b3d01d2a41ccb03199411057276f4962d053160be29a6ef","up":true},{"one":"7b90e939ae2a240f0d74a923afb6bbf11f6d5b99a7bf85f1825b1ea36bce744c","other":"da67ace34f7076a1d550bc61bc2a31da88d6cd9f9df43b142a8c6bbade1b4aee","up":true},{"one":"c786ff8667f509b5a9519984c1d95c83a5d2e257500a71429e8f23af610ce771","other":"30bec7cd0a7d002839aed7654129bd2fe2e2ce7f42aa7bae1560e8bf718954c3","up":true},{"one":"512ec5c2e6b4d788482462d941117c81fcc0e73f0c15545794dd1b4e03bf2102","other":"02d85b9f8e4776224ae5088683a87837b82b2bfb7e047cf373a28393e7aca6e1","up":true},{"one":"fe316679eca0e0eb823325812a56fd27da02653b06ada2fd03b27501bda8371a","other":"b7cafed41dac01dd59e2bcaeaaab551ebfeab8eaa1f97c1866fe0ddae772807b","up":true},{"one":"849bcbb9be43b799fefc5e689efc75125da27f536e97e5b7921031520ae6e5d8","other":"4c9eab8ab45405a6d4bab46430efc04b8e6aec1d944f88435eca41361925f379","up":true},{"one":"4ac755123dcc64ef44db9280311af51f3f7a93e0dee67370d673261220356eb9","other":"53a885968d68d8ebf7ed514e662cc13fa03186d2361000a03576531fdca2a25f","up":true},{"one":"51db114a52827f5b74088bd0fc87d35229e7740e7d121bd7699298396516a880","other":"461cc9f064e6f4f06ff38e0d1f3f00ef8807ba31c7258e453cc682e9551bb1c6","up":true},{"one":"6ecb5c36fc0150c287446ae8a8682d629a1d39341230717206219babe3bdf659","other":"df1e4e46e8ec26cad74b4f35ab070f12c8f6fddca35ac44c1218ff60fe1e6bab","up":true},{"one":"90765b72283f59be4cf9bf7a9e9a22fd6db701c3603cbc0817b4adf2f8e9ce08","other":"f4565dd2c428c03d7a8d5fad87a6dd5f92ae706529eb6152d36fa584e7cdbe4d","up":true},{"one":"605a46991af15cd60e67413c712b99ff8f21173c96a7990f2728ad6cac2bb9d8","other":"7125e05bf1bfe6df948c9276b62bc755fc6b0ec8d4ac7724b61ea49591adcf25","up":true},{"one":"4d103ec5afee559a5a9242e8d650b67301eaec10e96fc2f184e34d48554108a2","other":"1e2aca93fa9442a0034ae8d295530dde16fcbfa8c37227e2e6863babb0f87c34","up":true},{"one":"534bcaa98cf9192b35b6014c650ae067e74332c015ebb516d63601427d7376b8","other":"06618d829a8a7317a98f1a40ecf8864e1c94c4e270a9e4c008229dc7cf937b7e","up":true},{"one":"1436aaa8770e9f1c6294e49f4066c16b1caa50524e9b8fd058059e41657d2a83","other":"e027a9f7152641c4a41154f8ce4dafd23895c312150efea86bf4152c88d0ca86","up":true},{"one":"6c73150490e8be9677c40086de0aefed1939581048e26f4a93f5ca26571a1a8f","other":"534bcaa98cf9192b35b6014c650ae067e74332c015ebb516d63601427d7376b8","up":true},{"one":"b2a563ac59bab4dfddf7b6e27b80ee7afdeb2e4295411107903f484bcf9fc4f2","other":"82dd83838cb982b89505ef249d353a20e434346dd78b71cd9b809f71d5c112da","up":true},{"one":"7dbbdeba3731e1ff43072f8cbd86db147761e1b61753eea7024774dbf46914bd","other":"06618d829a8a7317a98f1a40ecf8864e1c94c4e270a9e4c008229dc7cf937b7e","up":true},{"one":"d7aca8f2182bc625d2b3c942bd1161c85bcf1c2b34ecbe3e2fd23cfae6b8a871","other":"e5ada0415c92ef1511b15d04edf395976464afd9adc3e929c41d4d21d25e3182","up":true},{"one":"1c9caf028df31681b1457a54d4b3ab20009f9fa5bd12417a1ba7efe0c660e6bd","other":"13d6cb9316e289923e2d1de7f3c966d0cbabce3acdb8017122944f4abb140912","up":true},{"one":"314a3530a5e0c37d5609149b3ae9c2e078573346bd8fce3c769ebaeb31726ec1","other":"2abb938b889a2eb735134462985a56056be48f189b5b89d23b653864c76427f4","up":true},{"one":"53fe2c13926507a7a6c27d0fb30a2c358c4c7bfa40df8b5fa8ec8986c2450519","other":"0ff2d2c49547eebc96675e0b88073dea5e9091bee1843ffe567127e34486c348","up":true},{"one":"e7fa7112adc7b023dd5965e620277122542153f87eaf5deeacc8a51f1778ba77","other":"3efc4b120b3eeeac186bf3a4cd42eb8c647f7edb08c23ee643e2bec9d72c5bed","up":true},{"one":"f45f1f2e59e947e04fa15bcf87f872ef6d73b73f778e12d1f9b8930ea166eefc","other":"c1f9e8e1d509febdf1f267bb227741e513420048a2e669ac9eef4b05a29cf10b","up":true},{"one":"2f32d54f06989efb6ca5431b74cd759fba05dbef36ecff8fd506e662026af983","other":"3e8efcaf3002522b39065ea30c15426d1eb55916499eff8eb5a814e39d41853c","up":true},{"one":"efeae3b7f610dc10acc51068e7718876d147cd78a9a28788c5dba5bb3a6950dc","other":"ed2d3e1e5693b44494808907c98ec54d6d08331945d2a2c03e31130fef1d2586","up":true},{"one":"0c28cd1315890629896d0fe5517524d4eb788f7444709c135ea690ba4e6103d5","other":"f45f1f2e59e947e04fa15bcf87f872ef6d73b73f778e12d1f9b8930ea166eefc","up":true},{"one":"6ea51fb6e4783f351dbbfa47b508c78c73233ebaada409dfb55446217f92c4bd","other":"4c9eab8ab45405a6d4bab46430efc04b8e6aec1d944f88435eca41361925f379","up":true},{"one":"b911b8e2d72532b7c66ff5f7bffa70f5ddbeea6903a86f9333399f0c4b5f0fe8","other":"a34ea2e87d4c12adb27d66c2c95300603ff50415974e000bbcc69a5ae059dbf1","up":true},{"one":"f27f1044777e05f3f60165d0d2fc3e7667fe148e0ca7a097805d60b9f61025f7","other":"e8548b5df15adf0f2a997ff5709827beb5e1d36bb08a2f2d017746d5c0e83fca","up":true},{"one":"628e7da3359ed6d9dcfbafc7581966e4e09245c321ec78ca75587c9cbb44697f","other":"6c73150490e8be9677c40086de0aefed1939581048e26f4a93f5ca26571a1a8f","up":true},{"one":"0de3915b0bcc68040c8aa76fbd2cfa0714e9b34c9dbe0838a7cba81c4f73581c","other":"1436aaa8770e9f1c6294e49f4066c16b1caa50524e9b8fd058059e41657d2a83","up":true},{"one":"67dcfd21ece30b41a39bc55c0986fca8f401bb3acba821969519f09d0933e8bd","other":"6967e7438125c2045d575eb9f407b4a38d1bf9dcd1c1c1a97f750da6a21aeff7","up":true},{"one":"e54b643cbc95d9f5d27ec3760d892b6802981bfabf4f9979267d66259df982c7","other":"b820e480354000c837b1781ec1c493e8776b4834252e6453425ac05b925b5a58","up":true},{"one":"738c2d42458965d03c8f9f055eaf0e3edf3dfa2a4de0a048ec05b78e7b765c90","other":"c1f9e8e1d509febdf1f267bb227741e513420048a2e669ac9eef4b05a29cf10b","up":true},{"one":"7b90e939ae2a240f0d74a923afb6bbf11f6d5b99a7bf85f1825b1ea36bce744c","other":"45584a4bebb948ef5f7b55d4846ec5549d7623682169c0edcab5b3523e68c7da","up":true},{"one":"a653302730df3d58f796906a93933aa81494f2588d9485ab7676ec3b0ccbb426","other":"ec52270604007673d1bfda1edbd8bfa945a21141efd85e42b684a9f30f8cddae","up":true},{"one":"478278187cd9af799e83340a2f49b0b7f122fb8e08c0a372a87795426eab364b","other":"0d8a919207fb2d5718eab7da95f8efeb01a4e1ae39602d315f8ba2ff1752d9da","up":true},{"one":"7a608d2cf9d1d9c5819dc1f9e88e5cb2852aadea01c40e047c2e184b62e7163c","other":"4ac755123dcc64ef44db9280311af51f3f7a93e0dee67370d673261220356eb9","up":true},{"one":"c8986871e46f001d15ed8b70f2aa0fea8ae309d5e5671a500f619e3b348c8c15","other":"4d59cf1aeecf370e94a7a231887450cef97053b9c88a7fd11e210840af070e29","up":true},{"one":"738c2d42458965d03c8f9f055eaf0e3edf3dfa2a4de0a048ec05b78e7b765c90","other":"af02b5d107b3a17f539c7f9020ebe74322434634e70c420a7f56776eb5d9db73","up":true},{"one":"4d6b939fb67338c484948ab92b2ceea4d4b666d7e08773673cd7c8f83f495b89","other":"4bcf4eb531d5ec4b31d99e8354af03f976524c7858a1e7043e9b7055326f0952","up":true},{"one":"455936fd22c43794e6e2104fd91d3f5d246e3823e8ff8eaf8dc27aa9f3d2ee08","other":"d1d719ce1dca507598449afe966396c160ad25ad632112ab268b1d913b490dbd","up":true},{"one":"f2d5533eed4b0c184952d859d67e44abe5a75a5de6111c8c106b8f4b2d8ccfc4","other":"baf219e9229921b773d1ad7eb7eb5216cfa60ccecaa3c5c487e3b71cb600ba12","up":true},{"one":"a3693801a91180410cf3e85d7c09ac8054a769e7b1d55c9e7a46850cb8217da0","other":"39d1fcae2d23c775214988251505c577b9ac7b6851558ddf9a437dfe143f3845","up":true},{"one":"4d6b939fb67338c484948ab92b2ceea4d4b666d7e08773673cd7c8f83f495b89","other":"738c2d42458965d03c8f9f055eaf0e3edf3dfa2a4de0a048ec05b78e7b765c90","up":true},{"one":"46fee69dad8b6a6a87d356d10db25d835a0c4e154bf179e88fb4cc65f97d72d7","other":"976e57d0c32227222bfd0cbb802f269bdcd52d5d33cf689c66b12c023f5fa8bf","up":true},{"one":"7dbbdeba3731e1ff43072f8cbd86db147761e1b61753eea7024774dbf46914bd","other":"16725e318322353befc2f2aba112f0984bc011821bb16c98e2cd8b39cd62aea1","up":true},{"one":"b820e480354000c837b1781ec1c493e8776b4834252e6453425ac05b925b5a58","other":"daec45eca40f48843b41f70267c07e94996ced829f02710f15354fbe26e177e7","up":true},{"one":"a3693801a91180410cf3e85d7c09ac8054a769e7b1d55c9e7a46850cb8217da0","other":"11d43f6ed0ddd5afa5c8a7abf7c62a4fa865b7a25ee295bf1a49701ef3081363","up":true},{"one":"20aeb14f567dd16f06b0d3b589b83283daa00a5ed10e447860bda946baccdd2d","other":"a653302730df3d58f796906a93933aa81494f2588d9485ab7676ec3b0ccbb426","up":true},{"one":"46fee69dad8b6a6a87d356d10db25d835a0c4e154bf179e88fb4cc65f97d72d7","other":"ca041da0dc514643d017458d08ff6962ec52c9e66571a239ec395dc8b2546709","up":true},{"one":"aeb4c75a57ccfc9ac053a3d363cf7c1e3e201406587769ab6615d5c2f86a5410","other":"4646fe4c119078738612b44a356089b3c73a08e11cfd910675d211ae6b20b8fd","up":true},{"one":"7dd3078c71087ab88d4d26a962820bcb79b8ce30e91c1f9a69d4bf8d38086960","other":"4e5a46c004e85cf86a02fdfbf2243018825d015debfb9a077a1283d302293b3a","up":true},{"one":"fbc8087a723c564ca0139329902e79748af46699ea7be24d57909a7e8e96f681","other":"daec45eca40f48843b41f70267c07e94996ced829f02710f15354fbe26e177e7","up":true},{"one":"fbc8087a723c564ca0139329902e79748af46699ea7be24d57909a7e8e96f681","other":"eb98fb45dd5754f24f9df0c9ecbb93932e3d9d7735cd6d0ddd4a8675bb4ef554","up":true},{"one":"a34ea2e87d4c12adb27d66c2c95300603ff50415974e000bbcc69a5ae059dbf1","other":"d3b0dea1dd3ac71e7e4a30941632eec53cb980aa7cb6cdac95042a5400a878c3","up":true},{"one":"14dfb8414d17b2df15eaf59571a8cfec99b1fd674561da63ee99af853bda07da","other":"39d1fcae2d23c775214988251505c577b9ac7b6851558ddf9a437dfe143f3845","up":true},{"one":"5b632eaf700d173ff15f4727b85817e6173228c304b422434a08c2cad438b825","other":"02d85b9f8e4776224ae5088683a87837b82b2bfb7e047cf373a28393e7aca6e1","up":true},{"one":"ae2b3876bdbd6388781b65e31de182564c5d81f4511caf96588b1a287760b3dd","other":"8f2182c2c2d0eeb2e887dbc350ae7257819f536032851ffdf29e7842cb1a62cc","up":true},{"one":"6f2d756566dd5b4a13ffeea9f687c785148f3407a502e28b9d6edfd03b905fdc","other":"24b85c10f098725938ea7d87cd24a4b10358129906fca9790fc266ea8784b538","up":true},{"one":"14dfb8414d17b2df15eaf59571a8cfec99b1fd674561da63ee99af853bda07da","other":"0af9a57a2f66835cd3e4e71bc026013a8a99ca337a7b6b6cc34e11d8da212a4f","up":true},{"one":"5db08436c64f4cc9e2b3950e35bc8ad739825e3efa67a642c771d95b34cb420c","other":"461cc9f064e6f4f06ff38e0d1f3f00ef8807ba31c7258e453cc682e9551bb1c6","up":true},{"one":"e5d794d64003725a74642f097c0ee76706d78419b6f3ea819d440bc0ad166eac","other":"f7fa2986ec9f84822b11a6b00bd03a1dd26f2a0fab90b1b308f08caead43cfe1","up":true},{"one":"b89793c3ccd9ea642080728732ce7df33778653fed3d1d8f3a25e60670e33325","other":"f5dc78ff71a63fc2014b9553723ee676c63fc078a32a46b7cb172f357a118140","up":true},{"one":"ae2b3876bdbd6388781b65e31de182564c5d81f4511caf96588b1a287760b3dd","other":"d887070a0568282c69e96ce65612ba72d5ea26b5c80671435d6e1ed2c4b49301","up":true},{"one":"6ecb5c36fc0150c287446ae8a8682d629a1d39341230717206219babe3bdf659","other":"9d0f804849b72397646ba48208ba1e01dcf4de04e788016c4a1a0c93e650ddf5","up":true},{"one":"82f9c9009f09de2d6a77b54976d14c14211eae65d886f6ed57560c700716dd5c","other":"f528aaafd67b20dafdce101db224aa01c70f93bdc91c14f50fa8db1dbf9fc386","up":true},{"one":"c26fd5e6504c7b3f0a6d9133ff87c98c110eb1c201c5f3bcf6b10653f2b972d2","other":"b5025d153581d333b44df4b9bfa69d87de138905172e4fd317e16f7099a5fcf8","up":true},{"one":"c26fd5e6504c7b3f0a6d9133ff87c98c110eb1c201c5f3bcf6b10653f2b972d2","other":"c43fbee95380007274b8f231fe34bcd59b5c0ef0830b174967d4702627984fc6","up":true},{"one":"d640472351969a5578e541aca72b7640c583b995fd62607ff3ee3f3f3139aafd","other":"b5b24532d2810e311e10b1d606baf6007f9124b88a178b32713cf1eddae089be","up":true},{"one":"1e2aca93fa9442a0034ae8d295530dde16fcbfa8c37227e2e6863babb0f87c34","other":"53087084708cc5ee63ac459b18fa10ae52a823139b4ecba6c8691d4934f2f971","up":true},{"one":"29957e8e92925a8c79bdf513295d96bfb62fbfc597ee1cf767c7ef408f1b1295","other":"c832b4ad64a17da4b796ffcac646c2aa666b276aabb7eb3bfe7981d64a4da402","up":true},{"one":"45584a4bebb948ef5f7b55d4846ec5549d7623682169c0edcab5b3523e68c7da","other":"6fe9a02e950a5c3a5ff026b75922ed687d59795ba8eb9c092a8d09a5c64d2453","up":true},{"one":"b5b24532d2810e311e10b1d606baf6007f9124b88a178b32713cf1eddae089be","other":"47bfa3767cefcc0831d410d5402e9396e8a412c8c96faf55b451d3ff310f3b02","up":true},{"one":"d640472351969a5578e541aca72b7640c583b995fd62607ff3ee3f3f3139aafd","other":"b626d472b555e6f950a7142783db8deb443a74e63ef6bd72a87eaf1af14ca805","up":true},{"one":"f7baef876a62b92ebe5ca9ec6a085e0eb54fd31e2425e662eec747df3cd77592","other":"886aff1f1e3b86bfe901066bb7948451c18fe3f8cd1b7318b05154890ca8f738","up":true},{"one":"f45f1f2e59e947e04fa15bcf87f872ef6d73b73f778e12d1f9b8930ea166eefc","other":"7dc2a9573f253f362ef1b21bbfcc144b11a6febc58aa3c4430224160e9fa738c","up":true},{"one":"29957e8e92925a8c79bdf513295d96bfb62fbfc597ee1cf767c7ef408f1b1295","other":"ff36a8810dd44f6d1fa42aa91ff6206bcfb4c1ffbab0df73a181daece329e0e3","up":true},{"one":"850575577d6b420a87aba388af481e0c044c2f75cf29ff934daf5674318a61ba","other":"82dd83838cb982b89505ef249d353a20e434346dd78b71cd9b809f71d5c112da","up":true},{"one":"4a8b610e09d35aa21c42ab8c3e38de600a944c094e6b86ea56828b5e6904f1f7","other":"140020a23a840b8840ba0c2c384f853a606330e9743885e9967cf49533db282e","up":true},{"one":"66e7fc2df51f5df8d7329851fe9357d895e9d5dfdc25f8d92bdb10a960f7e15a","other":"314a3530a5e0c37d5609149b3ae9c2e078573346bd8fce3c769ebaeb31726ec1","up":true},{"one":"d863ba7405eb07ccddbf1d34efbcbec2867a93a109ed9413d9aecf30d3645a6a","other":"1a2a0e0bbf83cd40936995674418ae469aa2b92876a4ceeabd8128f536b7d7a2","up":true},{"one":"3b88a472beba4a18f8df45678888fd359bac3823900eecfe0037fdc9ad54d416","other":"b89793c3ccd9ea642080728732ce7df33778653fed3d1d8f3a25e60670e33325","up":true},{"one":"63370e288ab2e4b8403c6678e9c44ae5c7496b5ead614306fceb85986ed29d18","other":"30897492824b19540d13ef17c70845be6dde455dca4e4f84cfca14a2c373969f","up":true},{"one":"f528aaafd67b20dafdce101db224aa01c70f93bdc91c14f50fa8db1dbf9fc386","other":"c43fbee95380007274b8f231fe34bcd59b5c0ef0830b174967d4702627984fc6","up":true},{"one":"3e8efcaf3002522b39065ea30c15426d1eb55916499eff8eb5a814e39d41853c","other":"7920d69cf7e458fce0781ea1a4e07768e1a69f6818090eff0abf0b4a0c2c35f8","up":true},{"one":"a46dd535e3bc8f111a8b2ce5594b62e87741c395e8a2b8fbae33edd29cb8caf8","other":"fbf5e917be45e909697a9393c4778206333cf1dd9a103978e8d71622ca3b1cc8","up":true},{"one":"ae2b3876bdbd6388781b65e31de182564c5d81f4511caf96588b1a287760b3dd","other":"90a85cb7363ede161ec21cc89f8b9d4350e566cf10586a66d31b0a8677620aa1","up":true},{"one":"f629b8b9e79c75ac559daf9bf4fc8672bfdd595cf2c5d17a8885282626fc65a5","other":"1c47ad5bd8846f777daf59587feccc308f4dc63f6d27b1385ff8085c75bb1aac","up":true},{"one":"2c79af7ea85f96db7897cf8cdb4d002ad2308194e03981876edb8d904ef65137","other":"4e5a46c004e85cf86a02fdfbf2243018825d015debfb9a077a1283d302293b3a","up":true},{"one":"6967e7438125c2045d575eb9f407b4a38d1bf9dcd1c1c1a97f750da6a21aeff7","other":"ee5e77df690329c132f2f7fca223cfd384b7bc34ec38763a4eb42780e0585656","up":true},{"one":"32371744163f0b3aefd3955dc4877e7eb82b17ef9541c333ca9c0a9f8aec3045","other":"41092c852fac630df2a9ca0862716f8e9fb8566c904a49c96389071046bc699d","up":true},{"one":"103b232552b94090232195dc88f84823701f35ae536b5af6dd33fa655a33cbae","other":"605a46991af15cd60e67413c712b99ff8f21173c96a7990f2728ad6cac2bb9d8","up":true},{"one":"6f5f5a77e6092e25e5308413e02ba62c1c559024893a7fb98e26b0f34fed8bfe","other":"c832b4ad64a17da4b796ffcac646c2aa666b276aabb7eb3bfe7981d64a4da402","up":true},{"one":"610334a0772d3414652b575f2caa6f2db32224907c24d06fda643db9f2ec2afe","other":"18f6e66e1cc8e620808901b571fdf525ee8f41850fac0bd0e5c5a4de70c5f873","up":true},{"one":"53087084708cc5ee63ac459b18fa10ae52a823139b4ecba6c8691d4934f2f971","other":"e5149cedd990072f2aaa9735a9259f28973c45876660c2d86ac105e56cca8e68","up":true},{"one":"32371744163f0b3aefd3955dc4877e7eb82b17ef9541c333ca9c0a9f8aec3045","other":"39d1fcae2d23c775214988251505c577b9ac7b6851558ddf9a437dfe143f3845","up":true},{"one":"2c79af7ea85f96db7897cf8cdb4d002ad2308194e03981876edb8d904ef65137","other":"2f32d54f06989efb6ca5431b74cd759fba05dbef36ecff8fd506e662026af983","up":true},{"one":"f4565dd2c428c03d7a8d5fad87a6dd5f92ae706529eb6152d36fa584e7cdbe4d","other":"e8830f2b2f7d08df15bd33f4b2841d01d9d62c1621234bd6ae86743e52360f3e","up":true},{"one":"0de3915b0bcc68040c8aa76fbd2cfa0714e9b34c9dbe0838a7cba81c4f73581c","other":"17db15893bf39b42593ee1de975aba6832046d9da5b4b493ec44272738a29cef","up":true},{"one":"96fcf14c7f90350091ac6fcb58306ccfb9e4a38d3da59f8ab656854332844cbd","other":"f5dc78ff71a63fc2014b9553723ee676c63fc078a32a46b7cb172f357a118140","up":true},{"one":"67dcfd21ece30b41a39bc55c0986fca8f401bb3acba821969519f09d0933e8bd","other":"6ea51fb6e4783f351dbbfa47b508c78c73233ebaada409dfb55446217f92c4bd","up":true},{"one":"6f5f5a77e6092e25e5308413e02ba62c1c559024893a7fb98e26b0f34fed8bfe","other":"461cc9f064e6f4f06ff38e0d1f3f00ef8807ba31c7258e453cc682e9551bb1c6","up":true},{"one":"03285e06657032778feff0b43828c964dbf9de669f63171aeb587aa1a1facc0a","other":"4d6b939fb67338c484948ab92b2ceea4d4b666d7e08773673cd7c8f83f495b89","up":true},{"one":"478278187cd9af799e83340a2f49b0b7f122fb8e08c0a372a87795426eab364b","other":"7290cd3affade5f9e729d1b03549aceafb2576cdbc6789fd688c95495f10bacd","up":true},{"one":"29957e8e92925a8c79bdf513295d96bfb62fbfc597ee1cf767c7ef408f1b1295","other":"898d2f7d46b4961b646d5a6142d54d6233b7f80f668ce234522dd02e2cc545cb","up":true},{"one":"32371744163f0b3aefd3955dc4877e7eb82b17ef9541c333ca9c0a9f8aec3045","other":"88a141c607019477c7b120a506285a7218cad2faa038082e0b9ddfcc9cb78d07","up":true},{"one":"2c79af7ea85f96db7897cf8cdb4d002ad2308194e03981876edb8d904ef65137","other":"6e68ea86440706a0d73a9508f2247492543163f8fa7e2dc2aa62b74d50261b8b","up":true},{"one":"68317431e4fa55be4a700e35c6a578307cc32b72336679b5c5618b622ef0c602","other":"849bcbb9be43b799fefc5e689efc75125da27f536e97e5b7921031520ae6e5d8","up":true},{"one":"24b85c10f098725938ea7d87cd24a4b10358129906fca9790fc266ea8784b538","other":"256e81c5a6fb43bd343345477f8f96aa1947f07ac3297f631ab03f060147b062","up":true},{"one":"aeb4c75a57ccfc9ac053a3d363cf7c1e3e201406587769ab6615d5c2f86a5410","other":"5efb3bfc199f5408f79bd6bd5171b4bf332c68a8e49242eb4f6a589b963565c6","up":true},{"one":"a6fbe16b81d240ff2f2ed6c93cfd9590731dfb2e7ec3fce1c098fe542bedf299","other":"ee5e77df690329c132f2f7fca223cfd384b7bc34ec38763a4eb42780e0585656","up":true},{"one":"03285e06657032778feff0b43828c964dbf9de669f63171aeb587aa1a1facc0a","other":"67dcfd21ece30b41a39bc55c0986fca8f401bb3acba821969519f09d0933e8bd","up":true},{"one":"7b90e939ae2a240f0d74a923afb6bbf11f6d5b99a7bf85f1825b1ea36bce744c","other":"60d7337ef806be95ccaf7b9d663a4289f9afc68edced62904ab50601cf113f45","up":true},{"one":"06618d829a8a7317a98f1a40ecf8864e1c94c4e270a9e4c008229dc7cf937b7e","other":"16725e318322353befc2f2aba112f0984bc011821bb16c98e2cd8b39cd62aea1","up":true},{"one":"4a8b610e09d35aa21c42ab8c3e38de600a944c094e6b86ea56828b5e6904f1f7","other":"976e57d0c32227222bfd0cbb802f269bdcd52d5d33cf689c66b12c023f5fa8bf","up":true},{"one":"a6fbe16b81d240ff2f2ed6c93cfd9590731dfb2e7ec3fce1c098fe542bedf299","other":"1c8a10ecbd72acb2bbbb8b77ea5404f9e90f4dbf306ec8134cfed70b40aef399","up":true},{"one":"e027a9f7152641c4a41154f8ce4dafd23895c312150efea86bf4152c88d0ca86","other":"f5dc78ff71a63fc2014b9553723ee676c63fc078a32a46b7cb172f357a118140","up":true},{"one":"4646fe4c119078738612b44a356089b3c73a08e11cfd910675d211ae6b20b8fd","other":"5efb3bfc199f5408f79bd6bd5171b4bf332c68a8e49242eb4f6a589b963565c6","up":true},{"one":"179f21d2e0421b8056ee9a260bc0985bfa64a52a36d0a8fbce4e03f3120d1d65","other":"045ba8da4641da3f0b8058bb0d9d8aafbb81496dc1cae2a3fd9c039a7e1cafb6","up":true},{"one":"17db15893bf39b42593ee1de975aba6832046d9da5b4b493ec44272738a29cef","other":"96fcf14c7f90350091ac6fcb58306ccfb9e4a38d3da59f8ab656854332844cbd","up":true},{"one":"c832b4ad64a17da4b796ffcac646c2aa666b276aabb7eb3bfe7981d64a4da402","other":"c9f5acafbbf8c66647de05b0848d79451eee490709d53f118fc2051410cc8203","up":true},{"one":"478278187cd9af799e83340a2f49b0b7f122fb8e08c0a372a87795426eab364b","other":"140020a23a840b8840ba0c2c384f853a606330e9743885e9967cf49533db282e","up":true},{"one":"499036eb9d10fc003c903f09ea0ee00c0d27b39564988d67ae111f3473d22f07","other":"0af9a57a2f66835cd3e4e71bc026013a8a99ca337a7b6b6cc34e11d8da212a4f","up":true},{"one":"f528aaafd67b20dafdce101db224aa01c70f93bdc91c14f50fa8db1dbf9fc386","other":"c26fd5e6504c7b3f0a6d9133ff87c98c110eb1c201c5f3bcf6b10653f2b972d2","up":true},{"one":"77d2ec52dabd5d7f326d4c6afd2aad110487c6bdffa2984060528716ba873462","other":"c26fd5e6504c7b3f0a6d9133ff87c98c110eb1c201c5f3bcf6b10653f2b972d2","up":true},{"one":"33b5c521b4208e26414db2e05c9a8ccc001a524d928579d44d2e74d14a56593e","other":"605a46991af15cd60e67413c712b99ff8f21173c96a7990f2728ad6cac2bb9d8","up":true},{"one":"58ed74695bf527bac9a350c86d305e53e08c4999795e11cd3b2a36f5cd25d637","other":"006727dc6f59b120b24c17b8e63f80ef3439105f8118ffeed408f105a48ee60c","up":true},{"one":"1e2aca93fa9442a0034ae8d295530dde16fcbfa8c37227e2e6863babb0f87c34","other":"0b72054403f78a64a787f46e9f26bf0de7bbba5a60cb105e6aeea46cb4a1d9fe","up":true},{"one":"1c8a10ecbd72acb2bbbb8b77ea5404f9e90f4dbf306ec8134cfed70b40aef399","other":"96fcf14c7f90350091ac6fcb58306ccfb9e4a38d3da59f8ab656854332844cbd","up":true},{"one":"20aeb14f567dd16f06b0d3b589b83283daa00a5ed10e447860bda946baccdd2d","other":"2d3645c4fdf9a2809a909076b9ee5fb98fa880f6faeff914f1a2987af928cd79","up":true},{"one":"582330d8b8c49331b2aec790dc7325b9cd483fc8129323d31ec429d545042964","other":"7dd3078c71087ab88d4d26a962820bcb79b8ce30e91c1f9a69d4bf8d38086960","up":true},{"one":"6fe9a02e950a5c3a5ff026b75922ed687d59795ba8eb9c092a8d09a5c64d2453","other":"c49caff13862dc089f1f9b8180d6efa455648375662719272102c4f8028799d6","up":true},{"one":"46fee69dad8b6a6a87d356d10db25d835a0c4e154bf179e88fb4cc65f97d72d7","other":"140020a23a840b8840ba0c2c384f853a606330e9743885e9967cf49533db282e","up":true},{"one":"b95d88ff6512ef8eaaa6bd842fa44175c1484fc2e8601b83d50a5ffa992bfa3a","other":"a6fbe16b81d240ff2f2ed6c93cfd9590731dfb2e7ec3fce1c098fe542bedf299","up":true},{"one":"49cd1efed6a56a78af4ea4ab40813013e76c6a5fb9d2029ee02db5d80f5e41a6","other":"b5025d153581d333b44df4b9bfa69d87de138905172e4fd317e16f7099a5fcf8","up":true},{"one":"bb90464f769a85549c150f861775aa67924c7c651f393f6c70772707376a5c7e","other":"f925c85e6457ac01f0cd6b297155f9d3ae611603890d8f3a45e1396d937f8680","up":true},{"one":"6f2d756566dd5b4a13ffeea9f687c785148f3407a502e28b9d6edfd03b905fdc","other":"c6cf46239078edfb343c645f039725fdee1bbba8b0a6da02e2cc456b9223c9a2","up":true},{"one":"775e7be502df8fd938cf9c42ee4fac33e460a4b6992b9efeb8dc1ff7dde5c40f","other":"4bcf4eb531d5ec4b31d99e8354af03f976524c7858a1e7043e9b7055326f0952","up":true},{"one":"21a044e772b7c955fe4a6fb7c3a9a20e95d48b7fd6b9518741782f04f5f1f5c2","other":"738c2d42458965d03c8f9f055eaf0e3edf3dfa2a4de0a048ec05b78e7b765c90","up":true},{"one":"b2a563ac59bab4dfddf7b6e27b80ee7afdeb2e4295411107903f484bcf9fc4f2","other":"9852ce267d53106a6e584d6eddb08e0062eb4a422d2a8d39ad6dccaebac552ff","up":true},{"one":"f5b24a1fd2cd2908b408562f9a265ee1a692b137e770137afa5fdfa07b237221","other":"0af9a57a2f66835cd3e4e71bc026013a8a99ca337a7b6b6cc34e11d8da212a4f","up":true},{"one":"7dc2a9573f253f362ef1b21bbfcc144b11a6febc58aa3c4430224160e9fa738c","other":"4bcf4eb531d5ec4b31d99e8354af03f976524c7858a1e7043e9b7055326f0952","up":true},{"one":"0d8a919207fb2d5718eab7da95f8efeb01a4e1ae39602d315f8ba2ff1752d9da","other":"e54784cfbcd89c37c8f758aae70ece3ab4b7f8c30fb4ef7543e04aa89ff4386b","up":true},{"one":"b2b5ba1bb188f18f79b295f2c0d48c52c1d1d449ecb9b94b9984f3a6179732c7","other":"256e81c5a6fb43bd343345477f8f96aa1947f07ac3297f631ab03f060147b062","up":true},{"one":"24b85c10f098725938ea7d87cd24a4b10358129906fca9790fc266ea8784b538","other":"378e7af7cc019186d4f2699e753e2d71302f8f3565572c13b7a1b1c5cb47443c","up":true},{"one":"f5b24a1fd2cd2908b408562f9a265ee1a692b137e770137afa5fdfa07b237221","other":"bcc6724e54f761361f85147eb102a8d1a1a38810a940ce76b1e361ddcadacaa3","up":true},{"one":"82f9c9009f09de2d6a77b54976d14c14211eae65d886f6ed57560c700716dd5c","other":"976e57d0c32227222bfd0cbb802f269bdcd52d5d33cf689c66b12c023f5fa8bf","up":true},{"one":"14dfb8414d17b2df15eaf59571a8cfec99b1fd674561da63ee99af853bda07da","other":"41092c852fac630df2a9ca0862716f8e9fb8566c904a49c96389071046bc699d","up":true},{"one":"534bcaa98cf9192b35b6014c650ae067e74332c015ebb516d63601427d7376b8","other":"21a044e772b7c955fe4a6fb7c3a9a20e95d48b7fd6b9518741782f04f5f1f5c2","up":true},{"one":"46fee69dad8b6a6a87d356d10db25d835a0c4e154bf179e88fb4cc65f97d72d7","other":"0d8a919207fb2d5718eab7da95f8efeb01a4e1ae39602d315f8ba2ff1752d9da","up":true},{"one":"1c8a10ecbd72acb2bbbb8b77ea5404f9e90f4dbf306ec8134cfed70b40aef399","other":"6c4dcdfdee0164a9a3f419430726dd51f9198c65ff6e7de7aaa6f632dcde6794","up":true},{"one":"47bfa3767cefcc0831d410d5402e9396e8a412c8c96faf55b451d3ff310f3b02","other":"7a608d2cf9d1d9c5819dc1f9e88e5cb2852aadea01c40e047c2e184b62e7163c","up":true},{"one":"35e6b1d31f594c06b759525434a7e717ebe6f27ca0188f247ed1247664a50563","other":"b7cafed41dac01dd59e2bcaeaaab551ebfeab8eaa1f97c1866fe0ddae772807b","up":true},{"one":"f2d5533eed4b0c184952d859d67e44abe5a75a5de6111c8c106b8f4b2d8ccfc4","other":"2ccfb5b1f3923d35fef88838c508b98b5516c5d409643881d2304ae49e50eed3","up":true},{"one":"045ba8da4641da3f0b8058bb0d9d8aafbb81496dc1cae2a3fd9c039a7e1cafb6","other":"314a3530a5e0c37d5609149b3ae9c2e078573346bd8fce3c769ebaeb31726ec1","up":true},{"one":"c26fd5e6504c7b3f0a6d9133ff87c98c110eb1c201c5f3bcf6b10653f2b972d2","other":"1f85b8c05e5dceff0bd8256f8f6d80d4b902a9754ceb952d95ea2e1150ef9e59","up":true},{"one":"574f65867482091aee2774033116c233525eea711706b5ae9ba09b54e896d302","other":"1f85b8c05e5dceff0bd8256f8f6d80d4b902a9754ceb952d95ea2e1150ef9e59","up":true},{"one":"58ed74695bf527bac9a350c86d305e53e08c4999795e11cd3b2a36f5cd25d637","other":"ef1b70bf090bc9994b1d45e2812c56ecb430a89c346a436bd10880bcda700351","up":true},{"one":"d7aca8f2182bc625d2b3c942bd1161c85bcf1c2b34ecbe3e2fd23cfae6b8a871","other":"7a608d2cf9d1d9c5819dc1f9e88e5cb2852aadea01c40e047c2e184b62e7163c","up":true},{"one":"4ac755123dcc64ef44db9280311af51f3f7a93e0dee67370d673261220356eb9","other":"5b632eaf700d173ff15f4727b85817e6173228c304b422434a08c2cad438b825","up":true},{"one":"455936fd22c43794e6e2104fd91d3f5d246e3823e8ff8eaf8dc27aa9f3d2ee08","other":"f5dc78ff71a63fc2014b9553723ee676c63fc078a32a46b7cb172f357a118140","up":true},{"one":"c59e3953b64e5b9ffbe53990a358914f2fa8e3551d33f92b9e3a441bd1baf2cd","other":"e8efe8016fe6cf649b2755bee22da35ccc6c9c55d404d5385d61f6ea27b84380","up":true},{"one":"f27f1044777e05f3f60165d0d2fc3e7667fe148e0ca7a097805d60b9f61025f7","other":"eb98fb45dd5754f24f9df0c9ecbb93932e3d9d7735cd6d0ddd4a8675bb4ef554","up":true},{"one":"1436aaa8770e9f1c6294e49f4066c16b1caa50524e9b8fd058059e41657d2a83","other":"d29941d6b8acd86cf32fd1c2181da3ab1da3c2083134b068ca49ce29aa86b783","up":true},{"one":"b65ee2549536a806ceef4a7ccc9544567cafe6204080929fc847df0a3781ccc9","other":"217f9952af1eb58d5ca5ac7be763716cfe2c0a4f3cdd4ebe4b5df563f919e2d2","up":true},{"one":"0438f567045d4556a0e7a697028d689ecfd0ae20f9e85c09b48d9f1fd0ee4765","other":"f7fa2986ec9f84822b11a6b00bd03a1dd26f2a0fab90b1b308f08caead43cfe1","up":true},{"one":"20aeb14f567dd16f06b0d3b589b83283daa00a5ed10e447860bda946baccdd2d","other":"0743bcf2aaa77e916f4a367d6159473c7d80f46a2e4cbe9ef346e423d39d7072","up":true},{"one":"3ec530761ddb87f930fda919be67df18074c6f0795292add1b2a91ff3d9c39e3","other":"4c9eab8ab45405a6d4bab46430efc04b8e6aec1d944f88435eca41361925f379","up":true},{"one":"fe2167fd33f383110eb3f6caa7bd905ca54fa0c810f1b8a34483a846f3cbddab","other":"c43fbee95380007274b8f231fe34bcd59b5c0ef0830b174967d4702627984fc6","up":true},{"one":"b5025d153581d333b44df4b9bfa69d87de138905172e4fd317e16f7099a5fcf8","other":"7290cd3affade5f9e729d1b03549aceafb2576cdbc6789fd688c95495f10bacd","up":true},{"one":"6fe9a02e950a5c3a5ff026b75922ed687d59795ba8eb9c092a8d09a5c64d2453","other":"e5ada0415c92ef1511b15d04edf395976464afd9adc3e929c41d4d21d25e3182","up":true},{"one":"68317431e4fa55be4a700e35c6a578307cc32b72336679b5c5618b622ef0c602","other":"a6fbe16b81d240ff2f2ed6c93cfd9590731dfb2e7ec3fce1c098fe542bedf299","up":true},{"one":"82f9c9009f09de2d6a77b54976d14c14211eae65d886f6ed57560c700716dd5c","other":"c43fbee95380007274b8f231fe34bcd59b5c0ef0830b174967d4702627984fc6","up":true},{"one":"f4565dd2c428c03d7a8d5fad87a6dd5f92ae706529eb6152d36fa584e7cdbe4d","other":"9fa0215e980dc907df4cc47ab4937f36527d78f9837493016fd4fc51e617299c","up":true},{"one":"f45f1f2e59e947e04fa15bcf87f872ef6d73b73f778e12d1f9b8930ea166eefc","other":"f31cc744ea921fee8364c5269b1ce7ec6b5f0c0cbb6885efbf602de5b36f6169","up":true},{"one":"f528aaafd67b20dafdce101db224aa01c70f93bdc91c14f50fa8db1dbf9fc386","other":"db6a1f6b342f6be9517f8df01003797c11c837d9aee3cdba5b7859230b36c35d","up":true},{"one":"fbc8087a723c564ca0139329902e79748af46699ea7be24d57909a7e8e96f681","other":"e8830f2b2f7d08df15bd33f4b2841d01d9d62c1621234bd6ae86743e52360f3e","up":true},{"one":"3b88a472beba4a18f8df45678888fd359bac3823900eecfe0037fdc9ad54d416","other":"b95d88ff6512ef8eaaa6bd842fa44175c1484fc2e8601b83d50a5ffa992bfa3a","up":true},{"one":"18f6e66e1cc8e620808901b571fdf525ee8f41850fac0bd0e5c5a4de70c5f873","other":"ac4d2d6836e2cdf4c88221f6013aac70a451dd15bc403288bd10d0b911cd9a2b","up":true},{"one":"3ec530761ddb87f930fda919be67df18074c6f0795292add1b2a91ff3d9c39e3","other":"3b88a472beba4a18f8df45678888fd359bac3823900eecfe0037fdc9ad54d416","up":true},{"one":"b626d472b555e6f950a7142783db8deb443a74e63ef6bd72a87eaf1af14ca805","other":"e8efe8016fe6cf649b2755bee22da35ccc6c9c55d404d5385d61f6ea27b84380","up":true},{"one":"daec45eca40f48843b41f70267c07e94996ced829f02710f15354fbe26e177e7","other":"2f32d54f06989efb6ca5431b74cd759fba05dbef36ecff8fd506e662026af983","up":true},{"one":"30bec7cd0a7d002839aed7654129bd2fe2e2ce7f42aa7bae1560e8bf718954c3","other":"1b830ed484b274a96ec7ba2f9a42b6859412b5334a564014ff3f11597ea3a32d","up":true},{"one":"1f85b8c05e5dceff0bd8256f8f6d80d4b902a9754ceb952d95ea2e1150ef9e59","other":"fe2167fd33f383110eb3f6caa7bd905ca54fa0c810f1b8a34483a846f3cbddab","up":true},{"one":"49cd1efed6a56a78af4ea4ab40813013e76c6a5fb9d2029ee02db5d80f5e41a6","other":"140020a23a840b8840ba0c2c384f853a606330e9743885e9967cf49533db282e","up":true},{"one":"db6a1f6b342f6be9517f8df01003797c11c837d9aee3cdba5b7859230b36c35d","other":"976e57d0c32227222bfd0cbb802f269bdcd52d5d33cf689c66b12c023f5fa8bf","up":true},{"one":"aeb4c75a57ccfc9ac053a3d363cf7c1e3e201406587769ab6615d5c2f86a5410","other":"bb90464f769a85549c150f861775aa67924c7c651f393f6c70772707376a5c7e","up":true},{"one":"b820e480354000c837b1781ec1c493e8776b4834252e6453425ac05b925b5a58","other":"9fa0215e980dc907df4cc47ab4937f36527d78f9837493016fd4fc51e617299c","up":true},{"one":"2f32d54f06989efb6ca5431b74cd759fba05dbef36ecff8fd506e662026af983","other":"6e68ea86440706a0d73a9508f2247492543163f8fa7e2dc2aa62b74d50261b8b","up":true},{"one":"a46dd535e3bc8f111a8b2ce5594b62e87741c395e8a2b8fbae33edd29cb8caf8","other":"eb98fb45dd5754f24f9df0c9ecbb93932e3d9d7735cd6d0ddd4a8675bb4ef554","up":true},{"one":"849bcbb9be43b799fefc5e689efc75125da27f536e97e5b7921031520ae6e5d8","other":"af02b5d107b3a17f539c7f9020ebe74322434634e70c420a7f56776eb5d9db73","up":true},{"one":"03ccd8d52597d18c0b178ab7361d847d63aad3af920a28345977ae170a1dafcd","other":"30897492824b19540d13ef17c70845be6dde455dca4e4f84cfca14a2c373969f","up":true},{"one":"5cd2377226825dc7ea582315cd108d23502df4e9c7c09fc07e7b4aa56440de29","other":"4646fe4c119078738612b44a356089b3c73a08e11cfd910675d211ae6b20b8fd","up":true},{"one":"3ec530761ddb87f930fda919be67df18074c6f0795292add1b2a91ff3d9c39e3","other":"f45f1f2e59e947e04fa15bcf87f872ef6d73b73f778e12d1f9b8930ea166eefc","up":true},{"one":"30bec7cd0a7d002839aed7654129bd2fe2e2ce7f42aa7bae1560e8bf718954c3","other":"5b632eaf700d173ff15f4727b85817e6173228c304b422434a08c2cad438b825","up":true},{"one":"82f9c9009f09de2d6a77b54976d14c14211eae65d886f6ed57560c700716dd5c","other":"b5025d153581d333b44df4b9bfa69d87de138905172e4fd317e16f7099a5fcf8","up":true},{"one":"610334a0772d3414652b575f2caa6f2db32224907c24d06fda643db9f2ec2afe","other":"898d2f7d46b4961b646d5a6142d54d6233b7f80f668ce234522dd02e2cc545cb","up":true},{"one":"67aa5463e4b32b363b3d01d2a41ccb03199411057276f4962d053160be29a6ef","other":"c26fd5e6504c7b3f0a6d9133ff87c98c110eb1c201c5f3bcf6b10653f2b972d2","up":true},{"one":"0c28cd1315890629896d0fe5517524d4eb788f7444709c135ea690ba4e6103d5","other":"19faaf891eb6a716902ec29d201dc2094ee474acff188ae86faf9760674b2d37","up":true},{"one":"8f2182c2c2d0eeb2e887dbc350ae7257819f536032851ffdf29e7842cb1a62cc","other":"41092c852fac630df2a9ca0862716f8e9fb8566c904a49c96389071046bc699d","up":true},{"one":"d29941d6b8acd86cf32fd1c2181da3ab1da3c2083134b068ca49ce29aa86b783","other":"b2b5ba1bb188f18f79b295f2c0d48c52c1d1d449ecb9b94b9984f3a6179732c7","up":true},{"one":"e7fa7112adc7b023dd5965e620277122542153f87eaf5deeacc8a51f1778ba77","other":"849bcbb9be43b799fefc5e689efc75125da27f536e97e5b7921031520ae6e5d8","up":true},{"one":"04518d7120fa8a528d983ca1ee6d5d09ba24a4e853fb22bc9084cdf34995e95f","other":"29957e8e92925a8c79bdf513295d96bfb62fbfc597ee1cf767c7ef408f1b1295","up":true},{"one":"67dcfd21ece30b41a39bc55c0986fca8f401bb3acba821969519f09d0933e8bd","other":"4bcf4eb531d5ec4b31d99e8354af03f976524c7858a1e7043e9b7055326f0952","up":true},{"one":"d640472351969a5578e541aca72b7640c583b995fd62607ff3ee3f3f3139aafd","other":"caf6a8e37fd41c1e6ad77a8575cd90354bb1693893952301c9caeb4779c338d3","up":true},{"one":"1c47ad5bd8846f777daf59587feccc308f4dc63f6d27b1385ff8085c75bb1aac","other":"ec52270604007673d1bfda1edbd8bfa945a21141efd85e42b684a9f30f8cddae","up":true},{"one":"0a005eb9c10c5cc9f720cfec2a655811d391671597b4f32d12df291ec76b2c13","other":"49eaad68d23dd63ef26029fa3f4e2578f3deca8708bbc838750d8b6dbe9eaa38","up":true},{"one":"738c2d42458965d03c8f9f055eaf0e3edf3dfa2a4de0a048ec05b78e7b765c90","other":"849bcbb9be43b799fefc5e689efc75125da27f536e97e5b7921031520ae6e5d8","up":true},{"one":"66e7fc2df51f5df8d7329851fe9357d895e9d5dfdc25f8d92bdb10a960f7e15a","other":"2abb938b889a2eb735134462985a56056be48f189b5b89d23b653864c76427f4","up":true},{"one":"1f670c53b4c597beaffacd84e3a697225b04cded9219d0a28e1fe525a3cadcf5","other":"30897492824b19540d13ef17c70845be6dde455dca4e4f84cfca14a2c373969f","up":true},{"one":"21012a3a6ef1ece48fd9d7cffe62dc75839dd062efcf3ac5f962c237814da407","other":"ff36a8810dd44f6d1fa42aa91ff6206bcfb4c1ffbab0df73a181daece329e0e3","up":true},{"one":"63370e288ab2e4b8403c6678e9c44ae5c7496b5ead614306fceb85986ed29d18","other":"959fda0866d3c18e9399e98485d627044079d6f86b075edaea9315402f5d9395","up":true},{"one":"17db15893bf39b42593ee1de975aba6832046d9da5b4b493ec44272738a29cef","other":"f5dc78ff71a63fc2014b9553723ee676c63fc078a32a46b7cb172f357a118140","up":true},{"one":"67aa5463e4b32b363b3d01d2a41ccb03199411057276f4962d053160be29a6ef","other":"b5025d153581d333b44df4b9bfa69d87de138905172e4fd317e16f7099a5fcf8","up":true},{"one":"628e7da3359ed6d9dcfbafc7581966e4e09245c321ec78ca75587c9cbb44697f","other":"21a044e772b7c955fe4a6fb7c3a9a20e95d48b7fd6b9518741782f04f5f1f5c2","up":true},{"one":"d863ba7405eb07ccddbf1d34efbcbec2867a93a109ed9413d9aecf30d3645a6a","other":"ac4d2d6836e2cdf4c88221f6013aac70a451dd15bc403288bd10d0b911cd9a2b","up":true},{"one":"c6cf46239078edfb343c645f039725fdee1bbba8b0a6da02e2cc456b9223c9a2","other":"d1d719ce1dca507598449afe966396c160ad25ad632112ab268b1d913b490dbd","up":true},{"one":"66e7fc2df51f5df8d7329851fe9357d895e9d5dfdc25f8d92bdb10a960f7e15a","other":"4bcf4eb531d5ec4b31d99e8354af03f976524c7858a1e7043e9b7055326f0952","up":true},{"one":"f2d5533eed4b0c184952d859d67e44abe5a75a5de6111c8c106b8f4b2d8ccfc4","other":"b5b24532d2810e311e10b1d606baf6007f9124b88a178b32713cf1eddae089be","up":true},{"one":"b5b24532d2810e311e10b1d606baf6007f9124b88a178b32713cf1eddae089be","other":"53a885968d68d8ebf7ed514e662cc13fa03186d2361000a03576531fdca2a25f","up":true},{"one":"0e5e0bb1383b2ec569b157a1d2ae6900592ab892a28367f5613a4e29cb265088","other":"33737df75bbac1b41c63f05ea2cf1523b972df17f22bda026db84a49ac35e1e3","up":true},{"one":"29957e8e92925a8c79bdf513295d96bfb62fbfc597ee1cf767c7ef408f1b1295","other":"006727dc6f59b120b24c17b8e63f80ef3439105f8118ffeed408f105a48ee60c","up":true},{"one":"6f5f5a77e6092e25e5308413e02ba62c1c559024893a7fb98e26b0f34fed8bfe","other":"ff36a8810dd44f6d1fa42aa91ff6206bcfb4c1ffbab0df73a181daece329e0e3","up":true},{"one":"165f1af67aa1d24569e0bdff61d29b3c39e93250071d8f25b5be6face209ac6a","other":"314a3530a5e0c37d5609149b3ae9c2e078573346bd8fce3c769ebaeb31726ec1","up":true},{"one":"0fc59bd04ac9de3195e3c9d0eb573952a5805dd2e7e572078b6e996778adec73","other":"3e8efcaf3002522b39065ea30c15426d1eb55916499eff8eb5a814e39d41853c","up":true},{"one":"849bcbb9be43b799fefc5e689efc75125da27f536e97e5b7921031520ae6e5d8","other":"7e0458ecdf7081443cab5412529f3948ece659facaca03208496c80dd136e704","up":true},{"one":"6e05179dc90a8f6654d0c9a3f06173371dcfb18b852fdd77f35f75e38f273125","other":"c441d27a5f4abaa8e3b0f040a6ef85bb8c970031d6a57503a674e36b3d6915d9","up":true},{"one":"21012a3a6ef1ece48fd9d7cffe62dc75839dd062efcf3ac5f962c237814da407","other":"df1e4e46e8ec26cad74b4f35ab070f12c8f6fddca35ac44c1218ff60fe1e6bab","up":true},{"one":"32371744163f0b3aefd3955dc4877e7eb82b17ef9541c333ca9c0a9f8aec3045","other":"1e2aca93fa9442a0034ae8d295530dde16fcbfa8c37227e2e6863babb0f87c34","up":true},{"one":"3630e05326bacea8fcc739dec42085f845f416ddc698c76ff91f099eb1dc5007","other":"11d43f6ed0ddd5afa5c8a7abf7c62a4fa865b7a25ee295bf1a49701ef3081363","up":true},{"one":"c441d27a5f4abaa8e3b0f040a6ef85bb8c970031d6a57503a674e36b3d6915d9","other":"37801e8d7d46143f78924ed66099f658a94d37edfd2f58d02acb85add03e1894","up":true},{"one":"f45f1f2e59e947e04fa15bcf87f872ef6d73b73f778e12d1f9b8930ea166eefc","other":"9890e6ebb2c6f9a7bec4c2778e077e3710ce3af356f82ae9b4d324832d159ef7","up":true},{"one":"b2a563ac59bab4dfddf7b6e27b80ee7afdeb2e4295411107903f484bcf9fc4f2","other":"daec45eca40f48843b41f70267c07e94996ced829f02710f15354fbe26e177e7","up":true},{"one":"03ccd8d52597d18c0b178ab7361d847d63aad3af920a28345977ae170a1dafcd","other":"20aeb14f567dd16f06b0d3b589b83283daa00a5ed10e447860bda946baccdd2d","up":true},{"one":"daec45eca40f48843b41f70267c07e94996ced829f02710f15354fbe26e177e7","other":"314a3530a5e0c37d5609149b3ae9c2e078573346bd8fce3c769ebaeb31726ec1","up":true},{"one":"1e2aca93fa9442a0034ae8d295530dde16fcbfa8c37227e2e6863babb0f87c34","other":"33737df75bbac1b41c63f05ea2cf1523b972df17f22bda026db84a49ac35e1e3","up":true},{"one":"7125e05bf1bfe6df948c9276b62bc755fc6b0ec8d4ac7724b61ea49591adcf25","other":"4e5a46c004e85cf86a02fdfbf2243018825d015debfb9a077a1283d302293b3a","up":true},{"one":"caf6a8e37fd41c1e6ad77a8575cd90354bb1693893952301c9caeb4779c338d3","other":"37801e8d7d46143f78924ed66099f658a94d37edfd2f58d02acb85add03e1894","up":true},{"one":"e5ada0415c92ef1511b15d04edf395976464afd9adc3e929c41d4d21d25e3182","other":"c59e3953b64e5b9ffbe53990a358914f2fa8e3551d33f92b9e3a441bd1baf2cd","up":true},{"one":"ba884e5cfa1ee6eb38217181711e01bb0c37b3e33d1424dfa89ed3e29ef6205b","other":"c9f5acafbbf8c66647de05b0848d79451eee490709d53f118fc2051410cc8203","up":true},{"one":"51db114a52827f5b74088bd0fc87d35229e7740e7d121bd7699298396516a880","other":"53087084708cc5ee63ac459b18fa10ae52a823139b4ecba6c8691d4934f2f971","up":true},{"one":"849bcbb9be43b799fefc5e689efc75125da27f536e97e5b7921031520ae6e5d8","other":"c1f9e8e1d509febdf1f267bb227741e513420048a2e669ac9eef4b05a29cf10b","up":true},{"one":"850575577d6b420a87aba388af481e0c044c2f75cf29ff934daf5674318a61ba","other":"9890e6ebb2c6f9a7bec4c2778e077e3710ce3af356f82ae9b4d324832d159ef7","up":true},{"one":"fe316679eca0e0eb823325812a56fd27da02653b06ada2fd03b27501bda8371a","other":"ba884e5cfa1ee6eb38217181711e01bb0c37b3e33d1424dfa89ed3e29ef6205b","up":true},{"one":"b65ee2549536a806ceef4a7ccc9544567cafe6204080929fc847df0a3781ccc9","other":"444722a15b01a0d8e6794798d239fe621d59bdfc08823ab47cbd8b9acebd23b4","up":true},{"one":"e775e9759d4701bd9b43c22f1d1be73c1262b2752bb23cb3857485daf1dcad2d","other":"fbf5e917be45e909697a9393c4778206333cf1dd9a103978e8d71622ca3b1cc8","up":true},{"one":"03285e06657032778feff0b43828c964dbf9de669f63171aeb587aa1a1facc0a","other":"19faaf891eb6a716902ec29d201dc2094ee474acff188ae86faf9760674b2d37","up":true},{"one":"e54784cfbcd89c37c8f758aae70ece3ab4b7f8c30fb4ef7543e04aa89ff4386b","other":"b626d472b555e6f950a7142783db8deb443a74e63ef6bd72a87eaf1af14ca805","up":true},{"one":"caf6a8e37fd41c1e6ad77a8575cd90354bb1693893952301c9caeb4779c338d3","other":"6e05179dc90a8f6654d0c9a3f06173371dcfb18b852fdd77f35f75e38f273125","up":true},{"one":"b95d88ff6512ef8eaaa6bd842fa44175c1484fc2e8601b83d50a5ffa992bfa3a","other":"af02b5d107b3a17f539c7f9020ebe74322434634e70c420a7f56776eb5d9db73","up":true},{"one":"bb90464f769a85549c150f861775aa67924c7c651f393f6c70772707376a5c7e","other":"3b78bc987c7c31c94e8ada9b4b11b5db9387fe70dd01ce7f3e976d3bec433dec","up":true},{"one":"35e6b1d31f594c06b759525434a7e717ebe6f27ca0188f247ed1247664a50563","other":"32371744163f0b3aefd3955dc4877e7eb82b17ef9541c333ca9c0a9f8aec3045","up":true},{"one":"6ecb5c36fc0150c287446ae8a8682d629a1d39341230717206219babe3bdf659","other":"ff36a8810dd44f6d1fa42aa91ff6206bcfb4c1ffbab0df73a181daece329e0e3","up":true},{"one":"7920d69cf7e458fce0781ea1a4e07768e1a69f6818090eff0abf0b4a0c2c35f8","other":"4bcf4eb531d5ec4b31d99e8354af03f976524c7858a1e7043e9b7055326f0952","up":true},{"one":"33b5c521b4208e26414db2e05c9a8ccc001a524d928579d44d2e74d14a56593e","other":"0ff2d2c49547eebc96675e0b88073dea5e9091bee1843ffe567127e34486c348","up":true},{"one":"e5d794d64003725a74642f097c0ee76706d78419b6f3ea819d440bc0ad166eac","other":"a653302730df3d58f796906a93933aa81494f2588d9485ab7676ec3b0ccbb426","up":true},{"one":"90765b72283f59be4cf9bf7a9e9a22fd6db701c3603cbc0817b4adf2f8e9ce08","other":"a34ea2e87d4c12adb27d66c2c95300603ff50415974e000bbcc69a5ae059dbf1","up":true},{"one":"605a46991af15cd60e67413c712b99ff8f21173c96a7990f2728ad6cac2bb9d8","other":"6e68ea86440706a0d73a9508f2247492543163f8fa7e2dc2aa62b74d50261b8b","up":true},{"one":"fbf5e917be45e909697a9393c4778206333cf1dd9a103978e8d71622ca3b1cc8","other":"e8548b5df15adf0f2a997ff5709827beb5e1d36bb08a2f2d017746d5c0e83fca","up":true},{"one":"f7fa2986ec9f84822b11a6b00bd03a1dd26f2a0fab90b1b308f08caead43cfe1","other":"959fda0866d3c18e9399e98485d627044079d6f86b075edaea9315402f5d9395","up":true},{"one":"461cc9f064e6f4f06ff38e0d1f3f00ef8807ba31c7258e453cc682e9551bb1c6","other":"ad9899f78659492ec248a884927a757f3f3b4e76cd2abc46ad8766251fd8afed","up":true},{"one":"39d1fcae2d23c775214988251505c577b9ac7b6851558ddf9a437dfe143f3845","other":"11d43f6ed0ddd5afa5c8a7abf7c62a4fa865b7a25ee295bf1a49701ef3081363","up":true},{"one":"ee5e77df690329c132f2f7fca223cfd384b7bc34ec38763a4eb42780e0585656","other":"f5dc78ff71a63fc2014b9553723ee676c63fc078a32a46b7cb172f357a118140","up":true},{"one":"738c2d42458965d03c8f9f055eaf0e3edf3dfa2a4de0a048ec05b78e7b765c90","other":"16725e318322353befc2f2aba112f0984bc011821bb16c98e2cd8b39cd62aea1","up":true},{"one":"df1e4e46e8ec26cad74b4f35ab070f12c8f6fddca35ac44c1218ff60fe1e6bab","other":"ff36a8810dd44f6d1fa42aa91ff6206bcfb4c1ffbab0df73a181daece329e0e3","up":true},{"one":"77d2ec52dabd5d7f326d4c6afd2aad110487c6bdffa2984060528716ba873462","other":"378e7af7cc019186d4f2699e753e2d71302f8f3565572c13b7a1b1c5cb47443c","up":true},{"one":"2abb938b889a2eb735134462985a56056be48f189b5b89d23b653864c76427f4","other":"7dbbdeba3731e1ff43072f8cbd86db147761e1b61753eea7024774dbf46914bd","up":true},{"one":"ff36a8810dd44f6d1fa42aa91ff6206bcfb4c1ffbab0df73a181daece329e0e3","other":"2a97d308a720274a440dfa6901ca0a5480af9bab58dd8a6c4afdb9c83ea964c3","up":true},{"one":"c441d27a5f4abaa8e3b0f040a6ef85bb8c970031d6a57503a674e36b3d6915d9","other":"e5d794d64003725a74642f097c0ee76706d78419b6f3ea819d440bc0ad166eac","up":true},{"one":"0af9a57a2f66835cd3e4e71bc026013a8a99ca337a7b6b6cc34e11d8da212a4f","other":"39d1fcae2d23c775214988251505c577b9ac7b6851558ddf9a437dfe143f3845","up":true},{"one":"1c47ad5bd8846f777daf59587feccc308f4dc63f6d27b1385ff8085c75bb1aac","other":"20aeb14f567dd16f06b0d3b589b83283daa00a5ed10e447860bda946baccdd2d","up":true},{"one":"a34ea2e87d4c12adb27d66c2c95300603ff50415974e000bbcc69a5ae059dbf1","other":"c620752a083ca1ff0398937235cf964133939452c293c799ce07ff8aa2bde420","up":true},{"one":"caf6a8e37fd41c1e6ad77a8575cd90354bb1693893952301c9caeb4779c338d3","other":"53a885968d68d8ebf7ed514e662cc13fa03186d2361000a03576531fdca2a25f","up":true},{"one":"b911b8e2d72532b7c66ff5f7bffa70f5ddbeea6903a86f9333399f0c4b5f0fe8","other":"9852ce267d53106a6e584d6eddb08e0062eb4a422d2a8d39ad6dccaebac552ff","up":true},{"one":"2f32d54f06989efb6ca5431b74cd759fba05dbef36ecff8fd506e662026af983","other":"33b5c521b4208e26414db2e05c9a8ccc001a524d928579d44d2e74d14a56593e","up":true},{"one":"c43fbee95380007274b8f231fe34bcd59b5c0ef0830b174967d4702627984fc6","other":"67aa5463e4b32b363b3d01d2a41ccb03199411057276f4962d053160be29a6ef","up":true},{"one":"499036eb9d10fc003c903f09ea0ee00c0d27b39564988d67ae111f3473d22f07","other":"0a005eb9c10c5cc9f720cfec2a655811d391671597b4f32d12df291ec76b2c13","up":true},{"one":"53087084708cc5ee63ac459b18fa10ae52a823139b4ecba6c8691d4934f2f971","other":"4d103ec5afee559a5a9242e8d650b67301eaec10e96fc2f184e34d48554108a2","up":true},{"one":"6251e9540448726a601699ef4cd19e50c969a746da27228967338cdc09d628bf","other":"4c9eab8ab45405a6d4bab46430efc04b8e6aec1d944f88435eca41361925f379","up":true},{"one":"f5b24a1fd2cd2908b408562f9a265ee1a692b137e770137afa5fdfa07b237221","other":"5efb3bfc199f5408f79bd6bd5171b4bf332c68a8e49242eb4f6a589b963565c6","up":true},{"one":"0c28cd1315890629896d0fe5517524d4eb788f7444709c135ea690ba4e6103d5","other":"44a10530c376b215baff8531eeb2afb8d6714c4d0350d1a6f32761a97cd6c7ec","up":true},{"one":"7125e05bf1bfe6df948c9276b62bc755fc6b0ec8d4ac7724b61ea49591adcf25","other":"4d59cf1aeecf370e94a7a231887450cef97053b9c88a7fd11e210840af070e29","up":true},{"one":"a3693801a91180410cf3e85d7c09ac8054a769e7b1d55c9e7a46850cb8217da0","other":"32371744163f0b3aefd3955dc4877e7eb82b17ef9541c333ca9c0a9f8aec3045","up":true},{"one":"45584a4bebb948ef5f7b55d4846ec5549d7623682169c0edcab5b3523e68c7da","other":"7a608d2cf9d1d9c5819dc1f9e88e5cb2852aadea01c40e047c2e184b62e7163c","up":true},{"one":"5efb3bfc199f5408f79bd6bd5171b4bf332c68a8e49242eb4f6a589b963565c6","other":"499036eb9d10fc003c903f09ea0ee00c0d27b39564988d67ae111f3473d22f07","up":true},{"one":"6ea51fb6e4783f351dbbfa47b508c78c73233ebaada409dfb55446217f92c4bd","other":"44a10530c376b215baff8531eeb2afb8d6714c4d0350d1a6f32761a97cd6c7ec","up":true},{"one":"103b232552b94090232195dc88f84823701f35ae536b5af6dd33fa655a33cbae","other":"49eaad68d23dd63ef26029fa3f4e2578f3deca8708bbc838750d8b6dbe9eaa38","up":true},{"one":"cc2037c08942a094df12f45831f28e0015fc3ac04d5b8f24ffea9bf3a0b02c39","other":"c620752a083ca1ff0398937235cf964133939452c293c799ce07ff8aa2bde420","up":true},{"one":"3e8efcaf3002522b39065ea30c15426d1eb55916499eff8eb5a814e39d41853c","other":"7dbbdeba3731e1ff43072f8cbd86db147761e1b61753eea7024774dbf46914bd","up":true},{"one":"6e05179dc90a8f6654d0c9a3f06173371dcfb18b852fdd77f35f75e38f273125","other":"c49caff13862dc089f1f9b8180d6efa455648375662719272102c4f8028799d6","up":true},{"one":"3efc4b120b3eeeac186bf3a4cd42eb8c647f7edb08c23ee643e2bec9d72c5bed","other":"3b88a472beba4a18f8df45678888fd359bac3823900eecfe0037fdc9ad54d416","up":true},{"one":"18f6e66e1cc8e620808901b571fdf525ee8f41850fac0bd0e5c5a4de70c5f873","other":"5db08436c64f4cc9e2b3950e35bc8ad739825e3efa67a642c771d95b34cb420c","up":true},{"one":"5db08436c64f4cc9e2b3950e35bc8ad739825e3efa67a642c771d95b34cb420c","other":"f7baef876a62b92ebe5ca9ec6a085e0eb54fd31e2425e662eec747df3cd77592","up":true},{"one":"1c9caf028df31681b1457a54d4b3ab20009f9fa5bd12417a1ba7efe0c660e6bd","other":"3e8efcaf3002522b39065ea30c15426d1eb55916499eff8eb5a814e39d41853c","up":true},{"one":"6967e7438125c2045d575eb9f407b4a38d1bf9dcd1c1c1a97f750da6a21aeff7","other":"738c2d42458965d03c8f9f055eaf0e3edf3dfa2a4de0a048ec05b78e7b765c90","up":true},{"one":"3b88a472beba4a18f8df45678888fd359bac3823900eecfe0037fdc9ad54d416","other":"6c4dcdfdee0164a9a3f419430726dd51f9198c65ff6e7de7aaa6f632dcde6794","up":true},{"one":"0cf596af91eb9b041fe6dbe6b288c5730413850321b5ab176c81447e34ef79c5","other":"2ccfb5b1f3923d35fef88838c508b98b5516c5d409643881d2304ae49e50eed3","up":true},{"one":"41092c852fac630df2a9ca0862716f8e9fb8566c904a49c96389071046bc699d","other":"d887070a0568282c69e96ce65612ba72d5ea26b5c80671435d6e1ed2c4b49301","up":true},{"one":"02d85b9f8e4776224ae5088683a87837b82b2bfb7e047cf373a28393e7aca6e1","other":"da67ace34f7076a1d550bc61bc2a31da88d6cd9f9df43b142a8c6bbade1b4aee","up":true},{"one":"140020a23a840b8840ba0c2c384f853a606330e9743885e9967cf49533db282e","other":"e5ada0415c92ef1511b15d04edf395976464afd9adc3e929c41d4d21d25e3182","up":true},{"one":"88a141c607019477c7b120a506285a7218cad2faa038082e0b9ddfcc9cb78d07","other":"d887070a0568282c69e96ce65612ba72d5ea26b5c80671435d6e1ed2c4b49301","up":true},{"one":"53fe2c13926507a7a6c27d0fb30a2c358c4c7bfa40df8b5fa8ec8986c2450519","other":"582330d8b8c49331b2aec790dc7325b9cd483fc8129323d31ec429d545042964","up":true},{"one":"f7fa2986ec9f84822b11a6b00bd03a1dd26f2a0fab90b1b308f08caead43cfe1","other":"a653302730df3d58f796906a93933aa81494f2588d9485ab7676ec3b0ccbb426","up":true},{"one":"39d1fcae2d23c775214988251505c577b9ac7b6851558ddf9a437dfe143f3845","other":"d887070a0568282c69e96ce65612ba72d5ea26b5c80671435d6e1ed2c4b49301","up":true},{"one":"512ec5c2e6b4d788482462d941117c81fcc0e73f0c15545794dd1b4e03bf2102","other":"6fe9a02e950a5c3a5ff026b75922ed687d59795ba8eb9c092a8d09a5c64d2453","up":true},{"one":"6f2d756566dd5b4a13ffeea9f687c785148f3407a502e28b9d6edfd03b905fdc","other":"4636f00be60a9b494a3ebc9ab41cc7cb53ec0b0beff214db2d0a248dc3aeb6af","up":true},{"one":"efeae3b7f610dc10acc51068e7718876d147cd78a9a28788c5dba5bb3a6950dc","other":"f4e09f89287bd1af7833acd85ba7cc71fdb3ff34f2f409e1cf2a878dcd3183dc","up":true},{"one":"1c8a10ecbd72acb2bbbb8b77ea5404f9e90f4dbf306ec8134cfed70b40aef399","other":"f4e09f89287bd1af7833acd85ba7cc71fdb3ff34f2f409e1cf2a878dcd3183dc","up":true},{"one":"4a8b610e09d35aa21c42ab8c3e38de600a944c094e6b86ea56828b5e6904f1f7","other":"82f9c9009f09de2d6a77b54976d14c14211eae65d886f6ed57560c700716dd5c","up":true},{"one":"07a8c900fec6c477580ed5b38848a8681dc52a19e59fa4cd32f571fe7fb2383a","other":"b2b5ba1bb188f18f79b295f2c0d48c52c1d1d449ecb9b94b9984f3a6179732c7","up":true},{"one":"21a044e772b7c955fe4a6fb7c3a9a20e95d48b7fd6b9518741782f04f5f1f5c2","other":"67dcfd21ece30b41a39bc55c0986fca8f401bb3acba821969519f09d0933e8bd","up":true},{"one":"e027a9f7152641c4a41154f8ce4dafd23895c312150efea86bf4152c88d0ca86","other":"f4e09f89287bd1af7833acd85ba7cc71fdb3ff34f2f409e1cf2a878dcd3183dc","up":true},{"one":"7b90e939ae2a240f0d74a923afb6bbf11f6d5b99a7bf85f1825b1ea36bce744c","other":"512ec5c2e6b4d788482462d941117c81fcc0e73f0c15545794dd1b4e03bf2102","up":true},{"one":"53a885968d68d8ebf7ed514e662cc13fa03186d2361000a03576531fdca2a25f","other":"c49caff13862dc089f1f9b8180d6efa455648375662719272102c4f8028799d6","up":true},{"one":"1b830ed484b274a96ec7ba2f9a42b6859412b5334a564014ff3f11597ea3a32d","other":"0d8a919207fb2d5718eab7da95f8efeb01a4e1ae39602d315f8ba2ff1752d9da","up":true},{"one":"fbf5e917be45e909697a9393c4778206333cf1dd9a103978e8d71622ca3b1cc8","other":"fbc8087a723c564ca0139329902e79748af46699ea7be24d57909a7e8e96f681","up":true},{"one":"d1d719ce1dca507598449afe966396c160ad25ad632112ab268b1d913b490dbd","other":"f5dc78ff71a63fc2014b9553723ee676c63fc078a32a46b7cb172f357a118140","up":true},{"one":"a34ea2e87d4c12adb27d66c2c95300603ff50415974e000bbcc69a5ae059dbf1","other":"a46dd535e3bc8f111a8b2ce5594b62e87741c395e8a2b8fbae33edd29cb8caf8","up":true},{"one":"b02b01a5c37cb05c287a3dc7d04e305de26f8d62dc388542eeb43e97db7b4282","other":"9852ce267d53106a6e584d6eddb08e0062eb4a422d2a8d39ad6dccaebac552ff","up":true},{"one":"c6cf46239078edfb343c645f039725fdee1bbba8b0a6da02e2cc456b9223c9a2","other":"96fcf14c7f90350091ac6fcb58306ccfb9e4a38d3da59f8ab656854332844cbd","up":true},{"one":"0cf596af91eb9b041fe6dbe6b288c5730413850321b5ab176c81447e34ef79c5","other":"0438f567045d4556a0e7a697028d689ecfd0ae20f9e85c09b48d9f1fd0ee4765","up":true},{"one":"1b830ed484b274a96ec7ba2f9a42b6859412b5334a564014ff3f11597ea3a32d","other":"02d85b9f8e4776224ae5088683a87837b82b2bfb7e047cf373a28393e7aca6e1","up":true},{"one":"7a608d2cf9d1d9c5819dc1f9e88e5cb2852aadea01c40e047c2e184b62e7163c","other":"e8efe8016fe6cf649b2755bee22da35ccc6c9c55d404d5385d61f6ea27b84380","up":true},{"one":"e54b643cbc95d9f5d27ec3760d892b6802981bfabf4f9979267d66259df982c7","other":"c1f9e8e1d509febdf1f267bb227741e513420048a2e669ac9eef4b05a29cf10b","up":true},{"one":"0cf596af91eb9b041fe6dbe6b288c5730413850321b5ab176c81447e34ef79c5","other":"444722a15b01a0d8e6794798d239fe621d59bdfc08823ab47cbd8b9acebd23b4","up":true},{"one":"53a885968d68d8ebf7ed514e662cc13fa03186d2361000a03576531fdca2a25f","other":"30bec7cd0a7d002839aed7654129bd2fe2e2ce7f42aa7bae1560e8bf718954c3","up":true},{"one":"ae2b3876bdbd6388781b65e31de182564c5d81f4511caf96588b1a287760b3dd","other":"14dfb8414d17b2df15eaf59571a8cfec99b1fd674561da63ee99af853bda07da","up":true},{"one":"7dd3078c71087ab88d4d26a962820bcb79b8ce30e91c1f9a69d4bf8d38086960","other":"daec45eca40f48843b41f70267c07e94996ced829f02710f15354fbe26e177e7","up":true},{"one":"f629b8b9e79c75ac559daf9bf4fc8672bfdd595cf2c5d17a8885282626fc65a5","other":"63370e288ab2e4b8403c6678e9c44ae5c7496b5ead614306fceb85986ed29d18","up":true},{"one":"5b632eaf700d173ff15f4727b85817e6173228c304b422434a08c2cad438b825","other":"60d7337ef806be95ccaf7b9d663a4289f9afc68edced62904ab50601cf113f45","up":true},{"one":"a653302730df3d58f796906a93933aa81494f2588d9485ab7676ec3b0ccbb426","other":"b65ee2549536a806ceef4a7ccc9544567cafe6204080929fc847df0a3781ccc9","up":true},{"one":"18f6e66e1cc8e620808901b571fdf525ee8f41850fac0bd0e5c5a4de70c5f873","other":"04518d7120fa8a528d983ca1ee6d5d09ba24a4e853fb22bc9084cdf34995e95f","up":true},{"one":"5db08436c64f4cc9e2b3950e35bc8ad739825e3efa67a642c771d95b34cb420c","other":"29957e8e92925a8c79bdf513295d96bfb62fbfc597ee1cf767c7ef408f1b1295","up":true},{"one":"4636f00be60a9b494a3ebc9ab41cc7cb53ec0b0beff214db2d0a248dc3aeb6af","other":"07a8c900fec6c477580ed5b38848a8681dc52a19e59fa4cd32f571fe7fb2383a","up":true},{"one":"c786ff8667f509b5a9519984c1d95c83a5d2e257500a71429e8f23af610ce771","other":"d7aca8f2182bc625d2b3c942bd1161c85bcf1c2b34ecbe3e2fd23cfae6b8a871","up":true},{"one":"53a885968d68d8ebf7ed514e662cc13fa03186d2361000a03576531fdca2a25f","other":"7a608d2cf9d1d9c5819dc1f9e88e5cb2852aadea01c40e047c2e184b62e7163c","up":true},{"one":"4d6b939fb67338c484948ab92b2ceea4d4b666d7e08773673cd7c8f83f495b89","other":"775e7be502df8fd938cf9c42ee4fac33e460a4b6992b9efeb8dc1ff7dde5c40f","up":true},{"one":"ca041da0dc514643d017458d08ff6962ec52c9e66571a239ec395dc8b2546709","other":"02d85b9f8e4776224ae5088683a87837b82b2bfb7e047cf373a28393e7aca6e1","up":true},{"one":"314a3530a5e0c37d5609149b3ae9c2e078573346bd8fce3c769ebaeb31726ec1","other":"3e8efcaf3002522b39065ea30c15426d1eb55916499eff8eb5a814e39d41853c","up":true},{"one":"582330d8b8c49331b2aec790dc7325b9cd483fc8129323d31ec429d545042964","other":"605a46991af15cd60e67413c712b99ff8f21173c96a7990f2728ad6cac2bb9d8","up":true},{"one":"8f2182c2c2d0eeb2e887dbc350ae7257819f536032851ffdf29e7842cb1a62cc","other":"88a141c607019477c7b120a506285a7218cad2faa038082e0b9ddfcc9cb78d07","up":true},{"one":"d3b0dea1dd3ac71e7e4a30941632eec53cb980aa7cb6cdac95042a5400a878c3","other":"eb98fb45dd5754f24f9df0c9ecbb93932e3d9d7735cd6d0ddd4a8675bb4ef554","up":true},{"one":"534bcaa98cf9192b35b6014c650ae067e74332c015ebb516d63601427d7376b8","other":"2abb938b889a2eb735134462985a56056be48f189b5b89d23b653864c76427f4","up":true},{"one":"7dbbdeba3731e1ff43072f8cbd86db147761e1b61753eea7024774dbf46914bd","other":"179f21d2e0421b8056ee9a260bc0985bfa64a52a36d0a8fbce4e03f3120d1d65","up":true},{"one":"461cc9f064e6f4f06ff38e0d1f3f00ef8807ba31c7258e453cc682e9551bb1c6","other":"2a97d308a720274a440dfa6901ca0a5480af9bab58dd8a6c4afdb9c83ea964c3","up":true},{"one":"1c47ad5bd8846f777daf59587feccc308f4dc63f6d27b1385ff8085c75bb1aac","other":"30897492824b19540d13ef17c70845be6dde455dca4e4f84cfca14a2c373969f","up":true},{"one":"b2b5ba1bb188f18f79b295f2c0d48c52c1d1d449ecb9b94b9984f3a6179732c7","other":"574f65867482091aee2774033116c233525eea711706b5ae9ba09b54e896d302","up":true},{"one":"0d8a919207fb2d5718eab7da95f8efeb01a4e1ae39602d315f8ba2ff1752d9da","other":"49cd1efed6a56a78af4ea4ab40813013e76c6a5fb9d2029ee02db5d80f5e41a6","up":true},{"one":"ca041da0dc514643d017458d08ff6962ec52c9e66571a239ec395dc8b2546709","other":"49cd1efed6a56a78af4ea4ab40813013e76c6a5fb9d2029ee02db5d80f5e41a6","up":true},{"one":"e54784cfbcd89c37c8f758aae70ece3ab4b7f8c30fb4ef7543e04aa89ff4386b","other":"c786ff8667f509b5a9519984c1d95c83a5d2e257500a71429e8f23af610ce771","up":true},{"one":"fe2167fd33f383110eb3f6caa7bd905ca54fa0c810f1b8a34483a846f3cbddab","other":"f528aaafd67b20dafdce101db224aa01c70f93bdc91c14f50fa8db1dbf9fc386","up":true},{"one":"d29941d6b8acd86cf32fd1c2181da3ab1da3c2083134b068ca49ce29aa86b783","other":"c26fd5e6504c7b3f0a6d9133ff87c98c110eb1c201c5f3bcf6b10653f2b972d2","up":true},{"one":"256e81c5a6fb43bd343345477f8f96aa1947f07ac3297f631ab03f060147b062","other":"db6a1f6b342f6be9517f8df01003797c11c837d9aee3cdba5b7859230b36c35d","up":true},{"one":"f7fa2986ec9f84822b11a6b00bd03a1dd26f2a0fab90b1b308f08caead43cfe1","other":"f629b8b9e79c75ac559daf9bf4fc8672bfdd595cf2c5d17a8885282626fc65a5","up":true},{"one":"006727dc6f59b120b24c17b8e63f80ef3439105f8118ffeed408f105a48ee60c","other":"51db114a52827f5b74088bd0fc87d35229e7740e7d121bd7699298396516a880","up":true},{"one":"574f65867482091aee2774033116c233525eea711706b5ae9ba09b54e896d302","other":"f528aaafd67b20dafdce101db224aa01c70f93bdc91c14f50fa8db1dbf9fc386","up":true},{"one":"0d8a919207fb2d5718eab7da95f8efeb01a4e1ae39602d315f8ba2ff1752d9da","other":"5b632eaf700d173ff15f4727b85817e6173228c304b422434a08c2cad438b825","up":true},{"one":"f528aaafd67b20dafdce101db224aa01c70f93bdc91c14f50fa8db1dbf9fc386","other":"da67ace34f7076a1d550bc61bc2a31da88d6cd9f9df43b142a8c6bbade1b4aee","up":true},{"one":"77d2ec52dabd5d7f326d4c6afd2aad110487c6bdffa2984060528716ba873462","other":"d29941d6b8acd86cf32fd1c2181da3ab1da3c2083134b068ca49ce29aa86b783","up":true},{"one":"f27f1044777e05f3f60165d0d2fc3e7667fe148e0ca7a097805d60b9f61025f7","other":"e54b643cbc95d9f5d27ec3760d892b6802981bfabf4f9979267d66259df982c7","up":true},{"one":"f4565dd2c428c03d7a8d5fad87a6dd5f92ae706529eb6152d36fa584e7cdbe4d","other":"daec45eca40f48843b41f70267c07e94996ced829f02710f15354fbe26e177e7","up":true},{"one":"db6a1f6b342f6be9517f8df01003797c11c837d9aee3cdba5b7859230b36c35d","other":"82f9c9009f09de2d6a77b54976d14c14211eae65d886f6ed57560c700716dd5c","up":true},{"one":"4a8b610e09d35aa21c42ab8c3e38de600a944c094e6b86ea56828b5e6904f1f7","other":"7290cd3affade5f9e729d1b03549aceafb2576cdbc6789fd688c95495f10bacd","up":true},{"one":"f2d5533eed4b0c184952d859d67e44abe5a75a5de6111c8c106b8f4b2d8ccfc4","other":"959fda0866d3c18e9399e98485d627044079d6f86b075edaea9315402f5d9395","up":true},{"one":"6f5f5a77e6092e25e5308413e02ba62c1c559024893a7fb98e26b0f34fed8bfe","other":"ad9899f78659492ec248a884927a757f3f3b4e76cd2abc46ad8766251fd8afed","up":true},{"one":"b65ee2549536a806ceef4a7ccc9544567cafe6204080929fc847df0a3781ccc9","other":"baf219e9229921b773d1ad7eb7eb5216cfa60ccecaa3c5c487e3b71cb600ba12","up":true},{"one":"0a005eb9c10c5cc9f720cfec2a655811d391671597b4f32d12df291ec76b2c13","other":"3b78bc987c7c31c94e8ada9b4b11b5db9387fe70dd01ce7f3e976d3bec433dec","up":true},{"one":"4646fe4c119078738612b44a356089b3c73a08e11cfd910675d211ae6b20b8fd","other":"3b78bc987c7c31c94e8ada9b4b11b5db9387fe70dd01ce7f3e976d3bec433dec","up":true},{"one":"29957e8e92925a8c79bdf513295d96bfb62fbfc597ee1cf767c7ef408f1b1295","other":"ac4d2d6836e2cdf4c88221f6013aac70a451dd15bc403288bd10d0b911cd9a2b","up":true},{"one":"cc2037c08942a094df12f45831f28e0015fc3ac04d5b8f24ffea9bf3a0b02c39","other":"daec45eca40f48843b41f70267c07e94996ced829f02710f15354fbe26e177e7","up":true},{"one":"82f9c9009f09de2d6a77b54976d14c14211eae65d886f6ed57560c700716dd5c","other":"c26fd5e6504c7b3f0a6d9133ff87c98c110eb1c201c5f3bcf6b10653f2b972d2","up":true},{"one":"46fee69dad8b6a6a87d356d10db25d835a0c4e154bf179e88fb4cc65f97d72d7","other":"60d7337ef806be95ccaf7b9d663a4289f9afc68edced62904ab50601cf113f45","up":true},{"one":"cc2037c08942a094df12f45831f28e0015fc3ac04d5b8f24ffea9bf3a0b02c39","other":"00c6488a842ece7a8b0daf064e405de03a4257d308840ea52bfd48d23f54d895","up":true},{"one":"574f65867482091aee2774033116c233525eea711706b5ae9ba09b54e896d302","other":"256e81c5a6fb43bd343345477f8f96aa1947f07ac3297f631ab03f060147b062","up":true},{"one":"b2a563ac59bab4dfddf7b6e27b80ee7afdeb2e4295411107903f484bcf9fc4f2","other":"9fa0215e980dc907df4cc47ab4937f36527d78f9837493016fd4fc51e617299c","up":true},{"one":"53fe2c13926507a7a6c27d0fb30a2c358c4c7bfa40df8b5fa8ec8986c2450519","other":"5cd2377226825dc7ea582315cd108d23502df4e9c7c09fc07e7b4aa56440de29","up":true},{"one":"a3693801a91180410cf3e85d7c09ac8054a769e7b1d55c9e7a46850cb8217da0","other":"d887070a0568282c69e96ce65612ba72d5ea26b5c80671435d6e1ed2c4b49301","up":true},{"one":"d1d719ce1dca507598449afe966396c160ad25ad632112ab268b1d913b490dbd","other":"a6fbe16b81d240ff2f2ed6c93cfd9590731dfb2e7ec3fce1c098fe542bedf299","up":true},{"one":"455936fd22c43794e6e2104fd91d3f5d246e3823e8ff8eaf8dc27aa9f3d2ee08","other":"d29941d6b8acd86cf32fd1c2181da3ab1da3c2083134b068ca49ce29aa86b783","up":true},{"one":"6e68ea86440706a0d73a9508f2247492543163f8fa7e2dc2aa62b74d50261b8b","other":"165f1af67aa1d24569e0bdff61d29b3c39e93250071d8f25b5be6face209ac6a","up":true},{"one":"63370e288ab2e4b8403c6678e9c44ae5c7496b5ead614306fceb85986ed29d18","other":"1a2a0e0bbf83cd40936995674418ae469aa2b92876a4ceeabd8128f536b7d7a2","up":true},{"one":"f45f1f2e59e947e04fa15bcf87f872ef6d73b73f778e12d1f9b8930ea166eefc","other":"b89793c3ccd9ea642080728732ce7df33778653fed3d1d8f3a25e60670e33325","up":true},{"one":"07a8c900fec6c477580ed5b38848a8681dc52a19e59fa4cd32f571fe7fb2383a","other":"574f65867482091aee2774033116c233525eea711706b5ae9ba09b54e896d302","up":true},{"one":"da67ace34f7076a1d550bc61bc2a31da88d6cd9f9df43b142a8c6bbade1b4aee","other":"7290cd3affade5f9e729d1b03549aceafb2576cdbc6789fd688c95495f10bacd","up":true},{"one":"51db114a52827f5b74088bd0fc87d35229e7740e7d121bd7699298396516a880","other":"b7cafed41dac01dd59e2bcaeaaab551ebfeab8eaa1f97c1866fe0ddae772807b","up":true},{"one":"58ed74695bf527bac9a350c86d305e53e08c4999795e11cd3b2a36f5cd25d637","other":"35e6b1d31f594c06b759525434a7e717ebe6f27ca0188f247ed1247664a50563","up":true},{"one":"478278187cd9af799e83340a2f49b0b7f122fb8e08c0a372a87795426eab364b","other":"976e57d0c32227222bfd0cbb802f269bdcd52d5d33cf689c66b12c023f5fa8bf","up":true},{"one":"6e05179dc90a8f6654d0c9a3f06173371dcfb18b852fdd77f35f75e38f273125","other":"2ccfb5b1f3923d35fef88838c508b98b5516c5d409643881d2304ae49e50eed3","up":true},{"one":"e7fa7112adc7b023dd5965e620277122542153f87eaf5deeacc8a51f1778ba77","other":"b95d88ff6512ef8eaaa6bd842fa44175c1484fc2e8601b83d50a5ffa992bfa3a","up":true},{"one":"07a8c900fec6c477580ed5b38848a8681dc52a19e59fa4cd32f571fe7fb2383a","other":"455936fd22c43794e6e2104fd91d3f5d246e3823e8ff8eaf8dc27aa9f3d2ee08","up":true},{"one":"0af9a57a2f66835cd3e4e71bc026013a8a99ca337a7b6b6cc34e11d8da212a4f","other":"3b78bc987c7c31c94e8ada9b4b11b5db9387fe70dd01ce7f3e976d3bec433dec","up":true},{"one":"7a608d2cf9d1d9c5819dc1f9e88e5cb2852aadea01c40e047c2e184b62e7163c","other":"c49caff13862dc089f1f9b8180d6efa455648375662719272102c4f8028799d6","up":true},{"one":"605a46991af15cd60e67413c712b99ff8f21173c96a7990f2728ad6cac2bb9d8","other":"41d9c03e44bec3f84a6139ce40ef1e390530f38ed11860575acfad03a49db095","up":true},{"one":"6e05179dc90a8f6654d0c9a3f06173371dcfb18b852fdd77f35f75e38f273125","other":"217f9952af1eb58d5ca5ac7be763716cfe2c0a4f3cdd4ebe4b5df563f919e2d2","up":true},{"one":"f7baef876a62b92ebe5ca9ec6a085e0eb54fd31e2425e662eec747df3cd77592","other":"b7cafed41dac01dd59e2bcaeaaab551ebfeab8eaa1f97c1866fe0ddae772807b","up":true},{"one":"fe316679eca0e0eb823325812a56fd27da02653b06ada2fd03b27501bda8371a","other":"ad9899f78659492ec248a884927a757f3f3b4e76cd2abc46ad8766251fd8afed","up":true},{"one":"e54b643cbc95d9f5d27ec3760d892b6802981bfabf4f9979267d66259df982c7","other":"f773b83f1a1de2ab6660edb0b765cfccec6778061ee25c5a84f968625686ef60","up":true},{"one":"c43fbee95380007274b8f231fe34bcd59b5c0ef0830b174967d4702627984fc6","other":"49cd1efed6a56a78af4ea4ab40813013e76c6a5fb9d2029ee02db5d80f5e41a6","up":true},{"one":"3ec530761ddb87f930fda919be67df18074c6f0795292add1b2a91ff3d9c39e3","other":"f5dc78ff71a63fc2014b9553723ee676c63fc078a32a46b7cb172f357a118140","up":true},{"one":"17db15893bf39b42593ee1de975aba6832046d9da5b4b493ec44272738a29cef","other":"f4e09f89287bd1af7833acd85ba7cc71fdb3ff34f2f409e1cf2a878dcd3183dc","up":true},{"one":"baddc778aea97acdbbb5bc99744a5545abab9f6047c81f328761645287ac391c","other":"ef07be559914ec4b5930d90d8d8b6f32dab9eba23acc36f14d512307f9974348","up":true},{"one":"c8986871e46f001d15ed8b70f2aa0fea8ae309d5e5671a500f619e3b348c8c15","other":"e8830f2b2f7d08df15bd33f4b2841d01d9d62c1621234bd6ae86743e52360f3e","up":true},{"one":"caf6a8e37fd41c1e6ad77a8575cd90354bb1693893952301c9caeb4779c338d3","other":"915d7a0510bad19266eef8f00ca0cb2efc340253775706495fca8b9160b512cc","up":true},{"one":"f4e09f89287bd1af7833acd85ba7cc71fdb3ff34f2f409e1cf2a878dcd3183dc","other":"96fcf14c7f90350091ac6fcb58306ccfb9e4a38d3da59f8ab656854332844cbd","up":true},{"one":"c786ff8667f509b5a9519984c1d95c83a5d2e257500a71429e8f23af610ce771","other":"c59e3953b64e5b9ffbe53990a358914f2fa8e3551d33f92b9e3a441bd1baf2cd","up":true},{"one":"39d1fcae2d23c775214988251505c577b9ac7b6851558ddf9a437dfe143f3845","other":"3b78bc987c7c31c94e8ada9b4b11b5db9387fe70dd01ce7f3e976d3bec433dec","up":true},{"one":"e5149cedd990072f2aaa9735a9259f28973c45876660c2d86ac105e56cca8e68","other":"33737df75bbac1b41c63f05ea2cf1523b972df17f22bda026db84a49ac35e1e3","up":true},{"one":"5b632eaf700d173ff15f4727b85817e6173228c304b422434a08c2cad438b825","other":"e54784cfbcd89c37c8f758aae70ece3ab4b7f8c30fb4ef7543e04aa89ff4386b","up":true},{"one":"6251e9540448726a601699ef4cd19e50c969a746da27228967338cdc09d628bf","other":"67dcfd21ece30b41a39bc55c0986fca8f401bb3acba821969519f09d0933e8bd","up":true},{"one":"e54b643cbc95d9f5d27ec3760d892b6802981bfabf4f9979267d66259df982c7","other":"c8986871e46f001d15ed8b70f2aa0fea8ae309d5e5671a500f619e3b348c8c15","up":true},{"one":"3efc4b120b3eeeac186bf3a4cd42eb8c647f7edb08c23ee643e2bec9d72c5bed","other":"045ba8da4641da3f0b8058bb0d9d8aafbb81496dc1cae2a3fd9c039a7e1cafb6","up":true},{"one":"6ecb5c36fc0150c287446ae8a8682d629a1d39341230717206219babe3bdf659","other":"0c64e5af869b1665fd4016ae6d04c8eedd423636f06d78ecb944ee8e3272a82a","up":true},{"one":"4636f00be60a9b494a3ebc9ab41cc7cb53ec0b0beff214db2d0a248dc3aeb6af","other":"574f65867482091aee2774033116c233525eea711706b5ae9ba09b54e896d302","up":true},{"one":"0438f567045d4556a0e7a697028d689ecfd0ae20f9e85c09b48d9f1fd0ee4765","other":"6e05179dc90a8f6654d0c9a3f06173371dcfb18b852fdd77f35f75e38f273125","up":true},{"one":"29957e8e92925a8c79bdf513295d96bfb62fbfc597ee1cf767c7ef408f1b1295","other":"2c3894b6e47cf19ac7ee9fe213196312f676256f670dff25b03563492550bc74","up":true},{"one":"d7aca8f2182bc625d2b3c942bd1161c85bcf1c2b34ecbe3e2fd23cfae6b8a871","other":"e8efe8016fe6cf649b2755bee22da35ccc6c9c55d404d5385d61f6ea27b84380","up":true},{"one":"4ac755123dcc64ef44db9280311af51f3f7a93e0dee67370d673261220356eb9","other":"512ec5c2e6b4d788482462d941117c81fcc0e73f0c15545794dd1b4e03bf2102","up":true},{"one":"c59e3953b64e5b9ffbe53990a358914f2fa8e3551d33f92b9e3a441bd1baf2cd","other":"caf6a8e37fd41c1e6ad77a8575cd90354bb1693893952301c9caeb4779c338d3","up":true},{"one":"6e05179dc90a8f6654d0c9a3f06173371dcfb18b852fdd77f35f75e38f273125","other":"baf219e9229921b773d1ad7eb7eb5216cfa60ccecaa3c5c487e3b71cb600ba12","up":true},{"one":"610334a0772d3414652b575f2caa6f2db32224907c24d06fda643db9f2ec2afe","other":"29957e8e92925a8c79bdf513295d96bfb62fbfc597ee1cf767c7ef408f1b1295","up":true},{"one":"6ecb5c36fc0150c287446ae8a8682d629a1d39341230717206219babe3bdf659","other":"30897492824b19540d13ef17c70845be6dde455dca4e4f84cfca14a2c373969f","up":true},{"one":"0e5e0bb1383b2ec569b157a1d2ae6900592ab892a28367f5613a4e29cb265088","other":"baddc778aea97acdbbb5bc99744a5545abab9f6047c81f328761645287ac391c","up":true},{"one":"6fe9a02e950a5c3a5ff026b75922ed687d59795ba8eb9c092a8d09a5c64d2453","other":"47bfa3767cefcc0831d410d5402e9396e8a412c8c96faf55b451d3ff310f3b02","up":true},{"one":"6ecb5c36fc0150c287446ae8a8682d629a1d39341230717206219babe3bdf659","other":"2a0a8eaf1a2749e68f8b841578c160699cf7907ff23842c6d616ad884e5f613e","up":true},{"one":"b5b24532d2810e311e10b1d606baf6007f9124b88a178b32713cf1eddae089be","other":"4ac755123dcc64ef44db9280311af51f3f7a93e0dee67370d673261220356eb9","up":true},{"one":"6fe9a02e950a5c3a5ff026b75922ed687d59795ba8eb9c092a8d09a5c64d2453","other":"e8efe8016fe6cf649b2755bee22da35ccc6c9c55d404d5385d61f6ea27b84380","up":true},{"one":"5cd2377226825dc7ea582315cd108d23502df4e9c7c09fc07e7b4aa56440de29","other":"605a46991af15cd60e67413c712b99ff8f21173c96a7990f2728ad6cac2bb9d8","up":true},{"one":"3630e05326bacea8fcc739dec42085f845f416ddc698c76ff91f099eb1dc5007","other":"14dfb8414d17b2df15eaf59571a8cfec99b1fd674561da63ee99af853bda07da","up":true},{"one":"b5b24532d2810e311e10b1d606baf6007f9124b88a178b32713cf1eddae089be","other":"444722a15b01a0d8e6794798d239fe621d59bdfc08823ab47cbd8b9acebd23b4","up":true},{"one":"006727dc6f59b120b24c17b8e63f80ef3439105f8118ffeed408f105a48ee60c","other":"886aff1f1e3b86bfe901066bb7948451c18fe3f8cd1b7318b05154890ca8f738","up":true},{"one":"18f6e66e1cc8e620808901b571fdf525ee8f41850fac0bd0e5c5a4de70c5f873","other":"17040a3aad5930d8e0de1011fd2996b7d09225989f0dc1ae8f7e7a52dd26ab4e","up":true},{"one":"24b85c10f098725938ea7d87cd24a4b10358129906fca9790fc266ea8784b538","other":"b2b5ba1bb188f18f79b295f2c0d48c52c1d1d449ecb9b94b9984f3a6179732c7","up":true},{"one":"ff36a8810dd44f6d1fa42aa91ff6206bcfb4c1ffbab0df73a181daece329e0e3","other":"886aff1f1e3b86bfe901066bb7948451c18fe3f8cd1b7318b05154890ca8f738","up":true},{"one":"ba884e5cfa1ee6eb38217181711e01bb0c37b3e33d1424dfa89ed3e29ef6205b","other":"3f946957d910179c7e1a83c44369aacfc31f5727b1a6421a01c8a978ccd349a2","up":true},{"one":"aeb4c75a57ccfc9ac053a3d363cf7c1e3e201406587769ab6615d5c2f86a5410","other":"154be9255e9aebd134a914070f5e6f3d4bba079d9ca738b74244db14e1b586dd","up":true},{"one":"849bcbb9be43b799fefc5e689efc75125da27f536e97e5b7921031520ae6e5d8","other":"f45f1f2e59e947e04fa15bcf87f872ef6d73b73f778e12d1f9b8930ea166eefc","up":true},{"one":"67dcfd21ece30b41a39bc55c0986fca8f401bb3acba821969519f09d0933e8bd","other":"4c9eab8ab45405a6d4bab46430efc04b8e6aec1d944f88435eca41361925f379","up":true},{"one":"6f5f5a77e6092e25e5308413e02ba62c1c559024893a7fb98e26b0f34fed8bfe","other":"ef07be559914ec4b5930d90d8d8b6f32dab9eba23acc36f14d512307f9974348","up":true},{"one":"6ea51fb6e4783f351dbbfa47b508c78c73233ebaada409dfb55446217f92c4bd","other":"524db81b135af8dc309b942c082a7291dddb851866fc608753f937ee77015be0","up":true},{"one":"fe2167fd33f383110eb3f6caa7bd905ca54fa0c810f1b8a34483a846f3cbddab","other":"256e81c5a6fb43bd343345477f8f96aa1947f07ac3297f631ab03f060147b062","up":true},{"one":"3630e05326bacea8fcc739dec42085f845f416ddc698c76ff91f099eb1dc5007","other":"33737df75bbac1b41c63f05ea2cf1523b972df17f22bda026db84a49ac35e1e3","up":true},{"one":"0fc59bd04ac9de3195e3c9d0eb573952a5805dd2e7e572078b6e996778adec73","other":"13d6cb9316e289923e2d1de7f3c966d0cbabce3acdb8017122944f4abb140912","up":true},{"one":"df1e4e46e8ec26cad74b4f35ab070f12c8f6fddca35ac44c1218ff60fe1e6bab","other":"5f00b3bebef2f5484ff1386298add68a6743a106200ae8a13a27dbb52714ee8f","up":true},{"one":"21012a3a6ef1ece48fd9d7cffe62dc75839dd062efcf3ac5f962c237814da407","other":"04518d7120fa8a528d983ca1ee6d5d09ba24a4e853fb22bc9084cdf34995e95f","up":true},{"one":"a653302730df3d58f796906a93933aa81494f2588d9485ab7676ec3b0ccbb426","other":"2a0a8eaf1a2749e68f8b841578c160699cf7907ff23842c6d616ad884e5f613e","up":true},{"one":"5efb3bfc199f5408f79bd6bd5171b4bf332c68a8e49242eb4f6a589b963565c6","other":"53fe2c13926507a7a6c27d0fb30a2c358c4c7bfa40df8b5fa8ec8986c2450519","up":true},{"one":"90765b72283f59be4cf9bf7a9e9a22fd6db701c3603cbc0817b4adf2f8e9ce08","other":"b02b01a5c37cb05c287a3dc7d04e305de26f8d62dc388542eeb43e97db7b4282","up":true},{"one":"5b632eaf700d173ff15f4727b85817e6173228c304b422434a08c2cad438b825","other":"e5ada0415c92ef1511b15d04edf395976464afd9adc3e929c41d4d21d25e3182","up":true},{"one":"a3693801a91180410cf3e85d7c09ac8054a769e7b1d55c9e7a46850cb8217da0","other":"90a85cb7363ede161ec21cc89f8b9d4350e566cf10586a66d31b0a8677620aa1","up":true},{"one":"bcc6724e54f761361f85147eb102a8d1a1a38810a940ce76b1e361ddcadacaa3","other":"b02b01a5c37cb05c287a3dc7d04e305de26f8d62dc388542eeb43e97db7b4282","up":true},{"one":"d3b0dea1dd3ac71e7e4a30941632eec53cb980aa7cb6cdac95042a5400a878c3","other":"fbf5e917be45e909697a9393c4778206333cf1dd9a103978e8d71622ca3b1cc8","up":true},{"one":"7920d69cf7e458fce0781ea1a4e07768e1a69f6818090eff0abf0b4a0c2c35f8","other":"7125e05bf1bfe6df948c9276b62bc755fc6b0ec8d4ac7724b61ea49591adcf25","up":true},{"one":"f4565dd2c428c03d7a8d5fad87a6dd5f92ae706529eb6152d36fa584e7cdbe4d","other":"e8548b5df15adf0f2a997ff5709827beb5e1d36bb08a2f2d017746d5c0e83fca","up":true},{"one":"7dc2a9573f253f362ef1b21bbfcc144b11a6febc58aa3c4430224160e9fa738c","other":"03285e06657032778feff0b43828c964dbf9de669f63171aeb587aa1a1facc0a","up":true},{"one":"6ecb5c36fc0150c287446ae8a8682d629a1d39341230717206219babe3bdf659","other":"898d2f7d46b4961b646d5a6142d54d6233b7f80f668ce234522dd02e2cc545cb","up":true},{"one":"1f670c53b4c597beaffacd84e3a697225b04cded9219d0a28e1fe525a3cadcf5","other":"04518d7120fa8a528d983ca1ee6d5d09ba24a4e853fb22bc9084cdf34995e95f","up":true},{"one":"d863ba7405eb07ccddbf1d34efbcbec2867a93a109ed9413d9aecf30d3645a6a","other":"f629b8b9e79c75ac559daf9bf4fc8672bfdd595cf2c5d17a8885282626fc65a5","up":true},{"one":"04518d7120fa8a528d983ca1ee6d5d09ba24a4e853fb22bc9084cdf34995e95f","other":"2d3645c4fdf9a2809a909076b9ee5fb98fa880f6faeff914f1a2987af928cd79","up":true},{"one":"caf6a8e37fd41c1e6ad77a8575cd90354bb1693893952301c9caeb4779c338d3","other":"444722a15b01a0d8e6794798d239fe621d59bdfc08823ab47cbd8b9acebd23b4","up":true},{"one":"f2d5533eed4b0c184952d859d67e44abe5a75a5de6111c8c106b8f4b2d8ccfc4","other":"c49caff13862dc089f1f9b8180d6efa455648375662719272102c4f8028799d6","up":true},{"one":"165f1af67aa1d24569e0bdff61d29b3c39e93250071d8f25b5be6face209ac6a","other":"0ff2d2c49547eebc96675e0b88073dea5e9091bee1843ffe567127e34486c348","up":true},{"one":"738c2d42458965d03c8f9f055eaf0e3edf3dfa2a4de0a048ec05b78e7b765c90","other":"b89793c3ccd9ea642080728732ce7df33778653fed3d1d8f3a25e60670e33325","up":true},{"one":"605a46991af15cd60e67413c712b99ff8f21173c96a7990f2728ad6cac2bb9d8","other":"6c73150490e8be9677c40086de0aefed1939581048e26f4a93f5ca26571a1a8f","up":true},{"one":"68317431e4fa55be4a700e35c6a578307cc32b72336679b5c5618b622ef0c602","other":"6251e9540448726a601699ef4cd19e50c969a746da27228967338cdc09d628bf","up":true},{"one":"fe2167fd33f383110eb3f6caa7bd905ca54fa0c810f1b8a34483a846f3cbddab","other":"b5025d153581d333b44df4b9bfa69d87de138905172e4fd317e16f7099a5fcf8","up":true},{"one":"1f85b8c05e5dceff0bd8256f8f6d80d4b902a9754ceb952d95ea2e1150ef9e59","other":"1436aaa8770e9f1c6294e49f4066c16b1caa50524e9b8fd058059e41657d2a83","up":true},{"one":"1f85b8c05e5dceff0bd8256f8f6d80d4b902a9754ceb952d95ea2e1150ef9e59","other":"1c8a10ecbd72acb2bbbb8b77ea5404f9e90f4dbf306ec8134cfed70b40aef399","up":true},{"one":"b626d472b555e6f950a7142783db8deb443a74e63ef6bd72a87eaf1af14ca805","other":"caf6a8e37fd41c1e6ad77a8575cd90354bb1693893952301c9caeb4779c338d3","up":true},{"one":"8025c1fcb98e53f92767d1d43a3057a0acd1e8994bb4a7e3f5e244110e0dcf91","other":"c43fbee95380007274b8f231fe34bcd59b5c0ef0830b174967d4702627984fc6","up":true},{"one":"32371744163f0b3aefd3955dc4877e7eb82b17ef9541c333ca9c0a9f8aec3045","other":"3f946957d910179c7e1a83c44369aacfc31f5727b1a6421a01c8a978ccd349a2","up":true},{"one":"7dc2a9573f253f362ef1b21bbfcc144b11a6febc58aa3c4430224160e9fa738c","other":"4d6b939fb67338c484948ab92b2ceea4d4b666d7e08773673cd7c8f83f495b89","up":true},{"one":"0fc59bd04ac9de3195e3c9d0eb573952a5805dd2e7e572078b6e996778adec73","other":"154be9255e9aebd134a914070f5e6f3d4bba079d9ca738b74244db14e1b586dd","up":true},{"one":"68317431e4fa55be4a700e35c6a578307cc32b72336679b5c5618b622ef0c602","other":"6ea51fb6e4783f351dbbfa47b508c78c73233ebaada409dfb55446217f92c4bd","up":true},{"one":"a6fbe16b81d240ff2f2ed6c93cfd9590731dfb2e7ec3fce1c098fe542bedf299","other":"b89793c3ccd9ea642080728732ce7df33778653fed3d1d8f3a25e60670e33325","up":true},{"one":"0c28cd1315890629896d0fe5517524d4eb788f7444709c135ea690ba4e6103d5","other":"4c9eab8ab45405a6d4bab46430efc04b8e6aec1d944f88435eca41361925f379","up":true},{"one":"df1e4e46e8ec26cad74b4f35ab070f12c8f6fddca35ac44c1218ff60fe1e6bab","other":"30897492824b19540d13ef17c70845be6dde455dca4e4f84cfca14a2c373969f","up":true},{"one":"a653302730df3d58f796906a93933aa81494f2588d9485ab7676ec3b0ccbb426","other":"d863ba7405eb07ccddbf1d34efbcbec2867a93a109ed9413d9aecf30d3645a6a","up":true},{"one":"a6fbe16b81d240ff2f2ed6c93cfd9590731dfb2e7ec3fce1c098fe542bedf299","other":"849bcbb9be43b799fefc5e689efc75125da27f536e97e5b7921031520ae6e5d8","up":true},{"one":"f773b83f1a1de2ab6660edb0b765cfccec6778061ee25c5a84f968625686ef60","other":"af02b5d107b3a17f539c7f9020ebe74322434634e70c420a7f56776eb5d9db73","up":true},{"one":"04518d7120fa8a528d983ca1ee6d5d09ba24a4e853fb22bc9084cdf34995e95f","other":"6ecb5c36fc0150c287446ae8a8682d629a1d39341230717206219babe3bdf659","up":true},{"one":"256e81c5a6fb43bd343345477f8f96aa1947f07ac3297f631ab03f060147b062","other":"378e7af7cc019186d4f2699e753e2d71302f8f3565572c13b7a1b1c5cb47443c","up":true},{"one":"7dc2a9573f253f362ef1b21bbfcc144b11a6febc58aa3c4430224160e9fa738c","other":"6ea51fb6e4783f351dbbfa47b508c78c73233ebaada409dfb55446217f92c4bd","up":true},{"one":"ee5e77df690329c132f2f7fca223cfd384b7bc34ec38763a4eb42780e0585656","other":"ed2d3e1e5693b44494808907c98ec54d6d08331945d2a2c03e31130fef1d2586","up":true},{"one":"00c6488a842ece7a8b0daf064e405de03a4257d308840ea52bfd48d23f54d895","other":"13d6cb9316e289923e2d1de7f3c966d0cbabce3acdb8017122944f4abb140912","up":true},{"one":"5f00b3bebef2f5484ff1386298add68a6743a106200ae8a13a27dbb52714ee8f","other":"e5d794d64003725a74642f097c0ee76706d78419b6f3ea819d440bc0ad166eac","up":true},{"one":"0c64e5af869b1665fd4016ae6d04c8eedd423636f06d78ecb944ee8e3272a82a","other":"2a0a8eaf1a2749e68f8b841578c160699cf7907ff23842c6d616ad884e5f613e","up":true},{"one":"77d2ec52dabd5d7f326d4c6afd2aad110487c6bdffa2984060528716ba873462","other":"b5025d153581d333b44df4b9bfa69d87de138905172e4fd317e16f7099a5fcf8","up":true},{"one":"11d43f6ed0ddd5afa5c8a7abf7c62a4fa865b7a25ee295bf1a49701ef3081363","other":"d887070a0568282c69e96ce65612ba72d5ea26b5c80671435d6e1ed2c4b49301","up":true},{"one":"30897492824b19540d13ef17c70845be6dde455dca4e4f84cfca14a2c373969f","other":"2a0a8eaf1a2749e68f8b841578c160699cf7907ff23842c6d616ad884e5f613e","up":true},{"one":"c8986871e46f001d15ed8b70f2aa0fea8ae309d5e5671a500f619e3b348c8c15","other":"4d6b939fb67338c484948ab92b2ceea4d4b666d7e08773673cd7c8f83f495b89","up":true},{"one":"256e81c5a6fb43bd343345477f8f96aa1947f07ac3297f631ab03f060147b062","other":"d29941d6b8acd86cf32fd1c2181da3ab1da3c2083134b068ca49ce29aa86b783","up":true},{"one":"4e5a46c004e85cf86a02fdfbf2243018825d015debfb9a077a1283d302293b3a","other":"41d9c03e44bec3f84a6139ce40ef1e390530f38ed11860575acfad03a49db095","up":true},{"one":"f31cc744ea921fee8364c5269b1ce7ec6b5f0c0cbb6885efbf602de5b36f6169","other":"e8830f2b2f7d08df15bd33f4b2841d01d9d62c1621234bd6ae86743e52360f3e","up":true},{"one":"77d2ec52dabd5d7f326d4c6afd2aad110487c6bdffa2984060528716ba873462","other":"c43fbee95380007274b8f231fe34bcd59b5c0ef0830b174967d4702627984fc6","up":true},{"one":"886aff1f1e3b86bfe901066bb7948451c18fe3f8cd1b7318b05154890ca8f738","other":"c9f5acafbbf8c66647de05b0848d79451eee490709d53f118fc2051410cc8203","up":true},{"one":"2a97d308a720274a440dfa6901ca0a5480af9bab58dd8a6c4afdb9c83ea964c3","other":"ac4d2d6836e2cdf4c88221f6013aac70a451dd15bc403288bd10d0b911cd9a2b","up":true},{"one":"4c9eab8ab45405a6d4bab46430efc04b8e6aec1d944f88435eca41361925f379","other":"44a10530c376b215baff8531eeb2afb8d6714c4d0350d1a6f32761a97cd6c7ec","up":true},{"one":"582330d8b8c49331b2aec790dc7325b9cd483fc8129323d31ec429d545042964","other":"7920d69cf7e458fce0781ea1a4e07768e1a69f6818090eff0abf0b4a0c2c35f8","up":true},{"one":"f5b24a1fd2cd2908b408562f9a265ee1a692b137e770137afa5fdfa07b237221","other":"4646fe4c119078738612b44a356089b3c73a08e11cfd910675d211ae6b20b8fd","up":true},{"one":"f629b8b9e79c75ac559daf9bf4fc8672bfdd595cf2c5d17a8885282626fc65a5","other":"ec52270604007673d1bfda1edbd8bfa945a21141efd85e42b684a9f30f8cddae","up":true},{"one":"e5ada0415c92ef1511b15d04edf395976464afd9adc3e929c41d4d21d25e3182","other":"60d7337ef806be95ccaf7b9d663a4289f9afc68edced62904ab50601cf113f45","up":true},{"one":"b820e480354000c837b1781ec1c493e8776b4834252e6453425ac05b925b5a58","other":"c8986871e46f001d15ed8b70f2aa0fea8ae309d5e5671a500f619e3b348c8c15","up":true},{"one":"ee5e77df690329c132f2f7fca223cfd384b7bc34ec38763a4eb42780e0585656","other":"efeae3b7f610dc10acc51068e7718876d147cd78a9a28788c5dba5bb3a6950dc","up":true},{"one":"628e7da3359ed6d9dcfbafc7581966e4e09245c321ec78ca75587c9cbb44697f","other":"16725e318322353befc2f2aba112f0984bc011821bb16c98e2cd8b39cd62aea1","up":true},{"one":"ae2b3876bdbd6388781b65e31de182564c5d81f4511caf96588b1a287760b3dd","other":"0b72054403f78a64a787f46e9f26bf0de7bbba5a60cb105e6aeea46cb4a1d9fe","up":true},{"one":"b820e480354000c837b1781ec1c493e8776b4834252e6453425ac05b925b5a58","other":"c620752a083ca1ff0398937235cf964133939452c293c799ce07ff8aa2bde420","up":true},{"one":"88fefb7506105c0e269baf52955a01b19f55504b13133bac0beab41c9f6e6942","other":"e8efe8016fe6cf649b2755bee22da35ccc6c9c55d404d5385d61f6ea27b84380","up":true},{"one":"2c79af7ea85f96db7897cf8cdb4d002ad2308194e03981876edb8d904ef65137","other":"00c6488a842ece7a8b0daf064e405de03a4257d308840ea52bfd48d23f54d895","up":true},{"one":"11d43f6ed0ddd5afa5c8a7abf7c62a4fa865b7a25ee295bf1a49701ef3081363","other":"4646fe4c119078738612b44a356089b3c73a08e11cfd910675d211ae6b20b8fd","up":true},{"one":"6c4dcdfdee0164a9a3f419430726dd51f9198c65ff6e7de7aaa6f632dcde6794","other":"7e0458ecdf7081443cab5412529f3948ece659facaca03208496c80dd136e704","up":true},{"one":"53087084708cc5ee63ac459b18fa10ae52a823139b4ecba6c8691d4934f2f971","other":"baddc778aea97acdbbb5bc99744a5545abab9f6047c81f328761645287ac391c","up":true},{"one":"b2b5ba1bb188f18f79b295f2c0d48c52c1d1d449ecb9b94b9984f3a6179732c7","other":"b5025d153581d333b44df4b9bfa69d87de138905172e4fd317e16f7099a5fcf8","up":true},{"one":"a46dd535e3bc8f111a8b2ce5594b62e87741c395e8a2b8fbae33edd29cb8caf8","other":"9852ce267d53106a6e584d6eddb08e0062eb4a422d2a8d39ad6dccaebac552ff","up":true},{"one":"f5dc78ff71a63fc2014b9553723ee676c63fc078a32a46b7cb172f357a118140","other":"849bcbb9be43b799fefc5e689efc75125da27f536e97e5b7921031520ae6e5d8","up":true},{"one":"0c64e5af869b1665fd4016ae6d04c8eedd423636f06d78ecb944ee8e3272a82a","other":"5f00b3bebef2f5484ff1386298add68a6743a106200ae8a13a27dbb52714ee8f","up":true},{"one":"67aa5463e4b32b363b3d01d2a41ccb03199411057276f4962d053160be29a6ef","other":"0d8a919207fb2d5718eab7da95f8efeb01a4e1ae39602d315f8ba2ff1752d9da","up":true},{"one":"b02b01a5c37cb05c287a3dc7d04e305de26f8d62dc388542eeb43e97db7b4282","other":"e8548b5df15adf0f2a997ff5709827beb5e1d36bb08a2f2d017746d5c0e83fca","up":true},{"one":"f31cc744ea921fee8364c5269b1ce7ec6b5f0c0cbb6885efbf602de5b36f6169","other":"e54b643cbc95d9f5d27ec3760d892b6802981bfabf4f9979267d66259df982c7","up":true},{"one":"1b830ed484b274a96ec7ba2f9a42b6859412b5334a564014ff3f11597ea3a32d","other":"140020a23a840b8840ba0c2c384f853a606330e9743885e9967cf49533db282e","up":true},{"one":"6c73150490e8be9677c40086de0aefed1939581048e26f4a93f5ca26571a1a8f","other":"4bcf4eb531d5ec4b31d99e8354af03f976524c7858a1e7043e9b7055326f0952","up":true},{"one":"29957e8e92925a8c79bdf513295d96bfb62fbfc597ee1cf767c7ef408f1b1295","other":"ef07be559914ec4b5930d90d8d8b6f32dab9eba23acc36f14d512307f9974348","up":true},{"one":"2a97d308a720274a440dfa6901ca0a5480af9bab58dd8a6c4afdb9c83ea964c3","other":"c832b4ad64a17da4b796ffcac646c2aa666b276aabb7eb3bfe7981d64a4da402","up":true},{"one":"37801e8d7d46143f78924ed66099f658a94d37edfd2f58d02acb85add03e1894","other":"2ccfb5b1f3923d35fef88838c508b98b5516c5d409643881d2304ae49e50eed3","up":true},{"one":"ed2d3e1e5693b44494808907c98ec54d6d08331945d2a2c03e31130fef1d2586","other":"96fcf14c7f90350091ac6fcb58306ccfb9e4a38d3da59f8ab656854332844cbd","up":true},{"one":"045ba8da4641da3f0b8058bb0d9d8aafbb81496dc1cae2a3fd9c039a7e1cafb6","other":"3ec530761ddb87f930fda919be67df18074c6f0795292add1b2a91ff3d9c39e3","up":true},{"one":"88fefb7506105c0e269baf52955a01b19f55504b13133bac0beab41c9f6e6942","other":"47bfa3767cefcc0831d410d5402e9396e8a412c8c96faf55b451d3ff310f3b02","up":true},{"one":"c26fd5e6504c7b3f0a6d9133ff87c98c110eb1c201c5f3bcf6b10653f2b972d2","other":"b2b5ba1bb188f18f79b295f2c0d48c52c1d1d449ecb9b94b9984f3a6179732c7","up":true},{"one":"524db81b135af8dc309b942c082a7291dddb851866fc608753f937ee77015be0","other":"7e0458ecdf7081443cab5412529f3948ece659facaca03208496c80dd136e704","up":true},{"one":"154be9255e9aebd134a914070f5e6f3d4bba079d9ca738b74244db14e1b586dd","other":"7dd3078c71087ab88d4d26a962820bcb79b8ce30e91c1f9a69d4bf8d38086960","up":true},{"one":"f31cc744ea921fee8364c5269b1ce7ec6b5f0c0cbb6885efbf602de5b36f6169","other":"af02b5d107b3a17f539c7f9020ebe74322434634e70c420a7f56776eb5d9db73","up":true},{"one":"f773b83f1a1de2ab6660edb0b765cfccec6778061ee25c5a84f968625686ef60","other":"9fa0215e980dc907df4cc47ab4937f36527d78f9837493016fd4fc51e617299c","up":true},{"one":"6c4dcdfdee0164a9a3f419430726dd51f9198c65ff6e7de7aaa6f632dcde6794","other":"378e7af7cc019186d4f2699e753e2d71302f8f3565572c13b7a1b1c5cb47443c","up":true},{"one":"88fefb7506105c0e269baf52955a01b19f55504b13133bac0beab41c9f6e6942","other":"6e05179dc90a8f6654d0c9a3f06173371dcfb18b852fdd77f35f75e38f273125","up":true},{"one":"775e7be502df8fd938cf9c42ee4fac33e460a4b6992b9efeb8dc1ff7dde5c40f","other":"524db81b135af8dc309b942c082a7291dddb851866fc608753f937ee77015be0","up":true},{"one":"4d59cf1aeecf370e94a7a231887450cef97053b9c88a7fd11e210840af070e29","other":"4e5a46c004e85cf86a02fdfbf2243018825d015debfb9a077a1283d302293b3a","up":true},{"one":"103b232552b94090232195dc88f84823701f35ae536b5af6dd33fa655a33cbae","other":"53fe2c13926507a7a6c27d0fb30a2c358c4c7bfa40df8b5fa8ec8986c2450519","up":true},{"one":"6c4dcdfdee0164a9a3f419430726dd51f9198c65ff6e7de7aaa6f632dcde6794","other":"1436aaa8770e9f1c6294e49f4066c16b1caa50524e9b8fd058059e41657d2a83","up":true},{"one":"14dfb8414d17b2df15eaf59571a8cfec99b1fd674561da63ee99af853bda07da","other":"499036eb9d10fc003c903f09ea0ee00c0d27b39564988d67ae111f3473d22f07","up":true},{"one":"444722a15b01a0d8e6794798d239fe621d59bdfc08823ab47cbd8b9acebd23b4","other":"217f9952af1eb58d5ca5ac7be763716cfe2c0a4f3cdd4ebe4b5df563f919e2d2","up":true},{"one":"179f21d2e0421b8056ee9a260bc0985bfa64a52a36d0a8fbce4e03f3120d1d65","other":"03285e06657032778feff0b43828c964dbf9de669f63171aeb587aa1a1facc0a","up":true},{"one":"b95d88ff6512ef8eaaa6bd842fa44175c1484fc2e8601b83d50a5ffa992bfa3a","other":"f45f1f2e59e947e04fa15bcf87f872ef6d73b73f778e12d1f9b8930ea166eefc","up":true},{"one":"2abb938b889a2eb735134462985a56056be48f189b5b89d23b653864c76427f4","other":"e8830f2b2f7d08df15bd33f4b2841d01d9d62c1621234bd6ae86743e52360f3e","up":true},{"one":"2a97d308a720274a440dfa6901ca0a5480af9bab58dd8a6c4afdb9c83ea964c3","other":"2c3894b6e47cf19ac7ee9fe213196312f676256f670dff25b03563492550bc74","up":true},{"one":"66e7fc2df51f5df8d7329851fe9357d895e9d5dfdc25f8d92bdb10a960f7e15a","other":"21a044e772b7c955fe4a6fb7c3a9a20e95d48b7fd6b9518741782f04f5f1f5c2","up":true},{"one":"f773b83f1a1de2ab6660edb0b765cfccec6778061ee25c5a84f968625686ef60","other":"f45f1f2e59e947e04fa15bcf87f872ef6d73b73f778e12d1f9b8930ea166eefc","up":true},{"one":"ed2d3e1e5693b44494808907c98ec54d6d08331945d2a2c03e31130fef1d2586","other":"3b88a472beba4a18f8df45678888fd359bac3823900eecfe0037fdc9ad54d416","up":true},{"one":"88fefb7506105c0e269baf52955a01b19f55504b13133bac0beab41c9f6e6942","other":"444722a15b01a0d8e6794798d239fe621d59bdfc08823ab47cbd8b9acebd23b4","up":true},{"one":"524db81b135af8dc309b942c082a7291dddb851866fc608753f937ee77015be0","other":"44a10530c376b215baff8531eeb2afb8d6714c4d0350d1a6f32761a97cd6c7ec","up":true},{"one":"7920d69cf7e458fce0781ea1a4e07768e1a69f6818090eff0abf0b4a0c2c35f8","other":"7dd3078c71087ab88d4d26a962820bcb79b8ce30e91c1f9a69d4bf8d38086960","up":true},{"one":"179f21d2e0421b8056ee9a260bc0985bfa64a52a36d0a8fbce4e03f3120d1d65","other":"19faaf891eb6a716902ec29d201dc2094ee474acff188ae86faf9760674b2d37","up":true},{"one":"ed2d3e1e5693b44494808907c98ec54d6d08331945d2a2c03e31130fef1d2586","other":"3ec530761ddb87f930fda919be67df18074c6f0795292add1b2a91ff3d9c39e3","up":true},{"one":"a46dd535e3bc8f111a8b2ce5594b62e87741c395e8a2b8fbae33edd29cb8caf8","other":"b02b01a5c37cb05c287a3dc7d04e305de26f8d62dc388542eeb43e97db7b4282","up":true},{"one":"fbc8087a723c564ca0139329902e79748af46699ea7be24d57909a7e8e96f681","other":"e8548b5df15adf0f2a997ff5709827beb5e1d36bb08a2f2d017746d5c0e83fca","up":true},{"one":"c832b4ad64a17da4b796ffcac646c2aa666b276aabb7eb3bfe7981d64a4da402","other":"898d2f7d46b4961b646d5a6142d54d6233b7f80f668ce234522dd02e2cc545cb","up":true},{"one":"c832b4ad64a17da4b796ffcac646c2aa666b276aabb7eb3bfe7981d64a4da402","other":"006727dc6f59b120b24c17b8e63f80ef3439105f8118ffeed408f105a48ee60c","up":true},{"one":"e775e9759d4701bd9b43c22f1d1be73c1262b2752bb23cb3857485daf1dcad2d","other":"eb98fb45dd5754f24f9df0c9ecbb93932e3d9d7735cd6d0ddd4a8675bb4ef554","up":true},{"one":"82dd83838cb982b89505ef249d353a20e434346dd78b71cd9b809f71d5c112da","other":"9fa0215e980dc907df4cc47ab4937f36527d78f9837493016fd4fc51e617299c","up":true},{"one":"4646fe4c119078738612b44a356089b3c73a08e11cfd910675d211ae6b20b8fd","other":"41092c852fac630df2a9ca0862716f8e9fb8566c904a49c96389071046bc699d","up":true},{"one":"3b88a472beba4a18f8df45678888fd359bac3823900eecfe0037fdc9ad54d416","other":"96fcf14c7f90350091ac6fcb58306ccfb9e4a38d3da59f8ab656854332844cbd","up":true},{"one":"3b88a472beba4a18f8df45678888fd359bac3823900eecfe0037fdc9ad54d416","other":"a6fbe16b81d240ff2f2ed6c93cfd9590731dfb2e7ec3fce1c098fe542bedf299","up":true},{"one":"976e57d0c32227222bfd0cbb802f269bdcd52d5d33cf689c66b12c023f5fa8bf","other":"8025c1fcb98e53f92767d1d43a3057a0acd1e8994bb4a7e3f5e244110e0dcf91","up":true},{"one":"3630e05326bacea8fcc739dec42085f845f416ddc698c76ff91f099eb1dc5007","other":"1e2aca93fa9442a0034ae8d295530dde16fcbfa8c37227e2e6863babb0f87c34","up":true},{"one":"c620752a083ca1ff0398937235cf964133939452c293c799ce07ff8aa2bde420","other":"b2a563ac59bab4dfddf7b6e27b80ee7afdeb2e4295411107903f484bcf9fc4f2","up":true},{"one":"4e5a46c004e85cf86a02fdfbf2243018825d015debfb9a077a1283d302293b3a","other":"6c73150490e8be9677c40086de0aefed1939581048e26f4a93f5ca26571a1a8f","up":true},{"one":"b95d88ff6512ef8eaaa6bd842fa44175c1484fc2e8601b83d50a5ffa992bfa3a","other":"ed2d3e1e5693b44494808907c98ec54d6d08331945d2a2c03e31130fef1d2586","up":true},{"one":"3e8efcaf3002522b39065ea30c15426d1eb55916499eff8eb5a814e39d41853c","other":"0ff2d2c49547eebc96675e0b88073dea5e9091bee1843ffe567127e34486c348","up":true},{"one":"fe316679eca0e0eb823325812a56fd27da02653b06ada2fd03b27501bda8371a","other":"ef07be559914ec4b5930d90d8d8b6f32dab9eba23acc36f14d512307f9974348","up":true},{"one":"524db81b135af8dc309b942c082a7291dddb851866fc608753f937ee77015be0","other":"3b88a472beba4a18f8df45678888fd359bac3823900eecfe0037fdc9ad54d416","up":true},{"one":"16725e318322353befc2f2aba112f0984bc011821bb16c98e2cd8b39cd62aea1","other":"4bcf4eb531d5ec4b31d99e8354af03f976524c7858a1e7043e9b7055326f0952","up":true},{"one":"524db81b135af8dc309b942c082a7291dddb851866fc608753f937ee77015be0","other":"0c28cd1315890629896d0fe5517524d4eb788f7444709c135ea690ba4e6103d5","up":true},{"one":"82dd83838cb982b89505ef249d353a20e434346dd78b71cd9b809f71d5c112da","other":"9890e6ebb2c6f9a7bec4c2778e077e3710ce3af356f82ae9b4d324832d159ef7","up":true},{"one":"8f2182c2c2d0eeb2e887dbc350ae7257819f536032851ffdf29e7842cb1a62cc","other":"4646fe4c119078738612b44a356089b3c73a08e11cfd910675d211ae6b20b8fd","up":true},{"one":"51db114a52827f5b74088bd0fc87d35229e7740e7d121bd7699298396516a880","other":"1e2aca93fa9442a0034ae8d295530dde16fcbfa8c37227e2e6863babb0f87c34","up":true},{"one":"35e6b1d31f594c06b759525434a7e717ebe6f27ca0188f247ed1247664a50563","other":"90a85cb7363ede161ec21cc89f8b9d4350e566cf10586a66d31b0a8677620aa1","up":true},{"one":"6967e7438125c2045d575eb9f407b4a38d1bf9dcd1c1c1a97f750da6a21aeff7","other":"775e7be502df8fd938cf9c42ee4fac33e460a4b6992b9efeb8dc1ff7dde5c40f","up":true},{"one":"7125e05bf1bfe6df948c9276b62bc755fc6b0ec8d4ac7724b61ea49591adcf25","other":"41d9c03e44bec3f84a6139ce40ef1e390530f38ed11860575acfad03a49db095","up":true},{"one":"06618d829a8a7317a98f1a40ecf8864e1c94c4e270a9e4c008229dc7cf937b7e","other":"1c9caf028df31681b1457a54d4b3ab20009f9fa5bd12417a1ba7efe0c660e6bd","up":true},{"one":"58ed74695bf527bac9a350c86d305e53e08c4999795e11cd3b2a36f5cd25d637","other":"0e5e0bb1383b2ec569b157a1d2ae6900592ab892a28367f5613a4e29cb265088","up":true},{"one":"33b5c521b4208e26414db2e05c9a8ccc001a524d928579d44d2e74d14a56593e","other":"7dd3078c71087ab88d4d26a962820bcb79b8ce30e91c1f9a69d4bf8d38086960","up":true},{"one":"f7baef876a62b92ebe5ca9ec6a085e0eb54fd31e2425e662eec747df3cd77592","other":"58ed74695bf527bac9a350c86d305e53e08c4999795e11cd3b2a36f5cd25d637","up":true},{"one":"46fee69dad8b6a6a87d356d10db25d835a0c4e154bf179e88fb4cc65f97d72d7","other":"67aa5463e4b32b363b3d01d2a41ccb03199411057276f4962d053160be29a6ef","up":true},{"one":"bb90464f769a85549c150f861775aa67924c7c651f393f6c70772707376a5c7e","other":"a3693801a91180410cf3e85d7c09ac8054a769e7b1d55c9e7a46850cb8217da0","up":true},{"one":"cc2037c08942a094df12f45831f28e0015fc3ac04d5b8f24ffea9bf3a0b02c39","other":"c8986871e46f001d15ed8b70f2aa0fea8ae309d5e5671a500f619e3b348c8c15","up":true},{"one":"6f5f5a77e6092e25e5308413e02ba62c1c559024893a7fb98e26b0f34fed8bfe","other":"f7baef876a62b92ebe5ca9ec6a085e0eb54fd31e2425e662eec747df3cd77592","up":true},{"one":"6fe9a02e950a5c3a5ff026b75922ed687d59795ba8eb9c092a8d09a5c64d2453","other":"53a885968d68d8ebf7ed514e662cc13fa03186d2361000a03576531fdca2a25f","up":true},{"one":"d640472351969a5578e541aca72b7640c583b995fd62607ff3ee3f3f3139aafd","other":"915d7a0510bad19266eef8f00ca0cb2efc340253775706495fca8b9160b512cc","up":true},{"one":"4d59cf1aeecf370e94a7a231887450cef97053b9c88a7fd11e210840af070e29","other":"628e7da3359ed6d9dcfbafc7581966e4e09245c321ec78ca75587c9cbb44697f","up":true},{"one":"0e5e0bb1383b2ec569b157a1d2ae6900592ab892a28367f5613a4e29cb265088","other":"b7cafed41dac01dd59e2bcaeaaab551ebfeab8eaa1f97c1866fe0ddae772807b","up":true},{"one":"4c9eab8ab45405a6d4bab46430efc04b8e6aec1d944f88435eca41361925f379","other":"3efc4b120b3eeeac186bf3a4cd42eb8c647f7edb08c23ee643e2bec9d72c5bed","up":true},{"one":"1f670c53b4c597beaffacd84e3a697225b04cded9219d0a28e1fe525a3cadcf5","other":"21012a3a6ef1ece48fd9d7cffe62dc75839dd062efcf3ac5f962c237814da407","up":true},{"one":"d863ba7405eb07ccddbf1d34efbcbec2867a93a109ed9413d9aecf30d3645a6a","other":"ff36a8810dd44f6d1fa42aa91ff6206bcfb4c1ffbab0df73a181daece329e0e3","up":true},{"one":"8025c1fcb98e53f92767d1d43a3057a0acd1e8994bb4a7e3f5e244110e0dcf91","other":"d29941d6b8acd86cf32fd1c2181da3ab1da3c2083134b068ca49ce29aa86b783","up":true},{"one":"b820e480354000c837b1781ec1c493e8776b4834252e6453425ac05b925b5a58","other":"eb98fb45dd5754f24f9df0c9ecbb93932e3d9d7735cd6d0ddd4a8675bb4ef554","up":true},{"one":"82f9c9009f09de2d6a77b54976d14c14211eae65d886f6ed57560c700716dd5c","other":"ca041da0dc514643d017458d08ff6962ec52c9e66571a239ec395dc8b2546709","up":true},{"one":"03ccd8d52597d18c0b178ab7361d847d63aad3af920a28345977ae170a1dafcd","other":"2ccfb5b1f3923d35fef88838c508b98b5516c5d409643881d2304ae49e50eed3","up":true},{"one":"e5d794d64003725a74642f097c0ee76706d78419b6f3ea819d440bc0ad166eac","other":"f2d5533eed4b0c184952d859d67e44abe5a75a5de6111c8c106b8f4b2d8ccfc4","up":true},{"one":"30897492824b19540d13ef17c70845be6dde455dca4e4f84cfca14a2c373969f","other":"9d0f804849b72397646ba48208ba1e01dcf4de04e788016c4a1a0c93e650ddf5","up":true},{"one":"6ecb5c36fc0150c287446ae8a8682d629a1d39341230717206219babe3bdf659","other":"f629b8b9e79c75ac559daf9bf4fc8672bfdd595cf2c5d17a8885282626fc65a5","up":true},{"one":"caf6a8e37fd41c1e6ad77a8575cd90354bb1693893952301c9caeb4779c338d3","other":"f2d5533eed4b0c184952d859d67e44abe5a75a5de6111c8c106b8f4b2d8ccfc4","up":true},{"one":"154be9255e9aebd134a914070f5e6f3d4bba079d9ca738b74244db14e1b586dd","other":"5efb3bfc199f5408f79bd6bd5171b4bf332c68a8e49242eb4f6a589b963565c6","up":true},{"one":"53087084708cc5ee63ac459b18fa10ae52a823139b4ecba6c8691d4934f2f971","other":"c9f5acafbbf8c66647de05b0848d79451eee490709d53f118fc2051410cc8203","up":true},{"one":"e5149cedd990072f2aaa9735a9259f28973c45876660c2d86ac105e56cca8e68","other":"3f946957d910179c7e1a83c44369aacfc31f5727b1a6421a01c8a978ccd349a2","up":true},{"one":"0a005eb9c10c5cc9f720cfec2a655811d391671597b4f32d12df291ec76b2c13","other":"00c6488a842ece7a8b0daf064e405de03a4257d308840ea52bfd48d23f54d895","up":true},{"one":"2c79af7ea85f96db7897cf8cdb4d002ad2308194e03981876edb8d904ef65137","other":"0fc59bd04ac9de3195e3c9d0eb573952a5805dd2e7e572078b6e996778adec73","up":true},{"one":"67aa5463e4b32b363b3d01d2a41ccb03199411057276f4962d053160be29a6ef","other":"140020a23a840b8840ba0c2c384f853a606330e9743885e9967cf49533db282e","up":true},{"one":"33b5c521b4208e26414db2e05c9a8ccc001a524d928579d44d2e74d14a56593e","other":"6c73150490e8be9677c40086de0aefed1939581048e26f4a93f5ca26571a1a8f","up":true},{"one":"140020a23a840b8840ba0c2c384f853a606330e9743885e9967cf49533db282e","other":"7290cd3affade5f9e729d1b03549aceafb2576cdbc6789fd688c95495f10bacd","up":true},{"one":"0c64e5af869b1665fd4016ae6d04c8eedd423636f06d78ecb944ee8e3272a82a","other":"63370e288ab2e4b8403c6678e9c44ae5c7496b5ead614306fceb85986ed29d18","up":true},{"one":"455936fd22c43794e6e2104fd91d3f5d246e3823e8ff8eaf8dc27aa9f3d2ee08","other":"f4e09f89287bd1af7833acd85ba7cc71fdb3ff34f2f409e1cf2a878dcd3183dc","up":true},{"one":"b65ee2549536a806ceef4a7ccc9544567cafe6204080929fc847df0a3781ccc9","other":"f2d5533eed4b0c184952d859d67e44abe5a75a5de6111c8c106b8f4b2d8ccfc4","up":true},{"one":"e7fa7112adc7b023dd5965e620277122542153f87eaf5deeacc8a51f1778ba77","other":"ee5e77df690329c132f2f7fca223cfd384b7bc34ec38763a4eb42780e0585656","up":true},{"one":"a653302730df3d58f796906a93933aa81494f2588d9485ab7676ec3b0ccbb426","other":"959fda0866d3c18e9399e98485d627044079d6f86b075edaea9315402f5d9395","up":true},{"one":"47bfa3767cefcc0831d410d5402e9396e8a412c8c96faf55b451d3ff310f3b02","other":"5b632eaf700d173ff15f4727b85817e6173228c304b422434a08c2cad438b825","up":true},{"one":"c441d27a5f4abaa8e3b0f040a6ef85bb8c970031d6a57503a674e36b3d6915d9","other":"217f9952af1eb58d5ca5ac7be763716cfe2c0a4f3cdd4ebe4b5df563f919e2d2","up":true},{"one":"67dcfd21ece30b41a39bc55c0986fca8f401bb3acba821969519f09d0933e8bd","other":"4d6b939fb67338c484948ab92b2ceea4d4b666d7e08773673cd7c8f83f495b89","up":true},{"one":"f528aaafd67b20dafdce101db224aa01c70f93bdc91c14f50fa8db1dbf9fc386","other":"ca041da0dc514643d017458d08ff6962ec52c9e66571a239ec395dc8b2546709","up":true},{"one":"140020a23a840b8840ba0c2c384f853a606330e9743885e9967cf49533db282e","other":"30bec7cd0a7d002839aed7654129bd2fe2e2ce7f42aa7bae1560e8bf718954c3","up":true},{"one":"7b90e939ae2a240f0d74a923afb6bbf11f6d5b99a7bf85f1825b1ea36bce744c","other":"7a608d2cf9d1d9c5819dc1f9e88e5cb2852aadea01c40e047c2e184b62e7163c","up":true},{"one":"4a8b610e09d35aa21c42ab8c3e38de600a944c094e6b86ea56828b5e6904f1f7","other":"b5025d153581d333b44df4b9bfa69d87de138905172e4fd317e16f7099a5fcf8","up":true},{"one":"14dfb8414d17b2df15eaf59571a8cfec99b1fd674561da63ee99af853bda07da","other":"49eaad68d23dd63ef26029fa3f4e2578f3deca8708bbc838750d8b6dbe9eaa38","up":true},{"one":"478278187cd9af799e83340a2f49b0b7f122fb8e08c0a372a87795426eab364b","other":"b5025d153581d333b44df4b9bfa69d87de138905172e4fd317e16f7099a5fcf8","up":true},{"one":"a34ea2e87d4c12adb27d66c2c95300603ff50415974e000bbcc69a5ae059dbf1","other":"b820e480354000c837b1781ec1c493e8776b4834252e6453425ac05b925b5a58","up":true},{"one":"3ec530761ddb87f930fda919be67df18074c6f0795292add1b2a91ff3d9c39e3","other":"ee5e77df690329c132f2f7fca223cfd384b7bc34ec38763a4eb42780e0585656","up":true},{"one":"7dd3078c71087ab88d4d26a962820bcb79b8ce30e91c1f9a69d4bf8d38086960","other":"d3b0dea1dd3ac71e7e4a30941632eec53cb980aa7cb6cdac95042a5400a878c3","up":true},{"one":"efeae3b7f610dc10acc51068e7718876d147cd78a9a28788c5dba5bb3a6950dc","other":"3b88a472beba4a18f8df45678888fd359bac3823900eecfe0037fdc9ad54d416","up":true},{"one":"775e7be502df8fd938cf9c42ee4fac33e460a4b6992b9efeb8dc1ff7dde5c40f","other":"4c9eab8ab45405a6d4bab46430efc04b8e6aec1d944f88435eca41361925f379","up":true},{"one":"b626d472b555e6f950a7142783db8deb443a74e63ef6bd72a87eaf1af14ca805","other":"c49caff13862dc089f1f9b8180d6efa455648375662719272102c4f8028799d6","up":true},{"one":"e027a9f7152641c4a41154f8ce4dafd23895c312150efea86bf4152c88d0ca86","other":"a6fbe16b81d240ff2f2ed6c93cfd9590731dfb2e7ec3fce1c098fe542bedf299","up":true},{"one":"1c8a10ecbd72acb2bbbb8b77ea5404f9e90f4dbf306ec8134cfed70b40aef399","other":"07a8c900fec6c477580ed5b38848a8681dc52a19e59fa4cd32f571fe7fb2383a","up":true},{"one":"c26fd5e6504c7b3f0a6d9133ff87c98c110eb1c201c5f3bcf6b10653f2b972d2","other":"976e57d0c32227222bfd0cbb802f269bdcd52d5d33cf689c66b12c023f5fa8bf","up":true},{"one":"da67ace34f7076a1d550bc61bc2a31da88d6cd9f9df43b142a8c6bbade1b4aee","other":"976e57d0c32227222bfd0cbb802f269bdcd52d5d33cf689c66b12c023f5fa8bf","up":true},{"one":"d1d719ce1dca507598449afe966396c160ad25ad632112ab268b1d913b490dbd","other":"f4e09f89287bd1af7833acd85ba7cc71fdb3ff34f2f409e1cf2a878dcd3183dc","up":true},{"one":"d29941d6b8acd86cf32fd1c2181da3ab1da3c2083134b068ca49ce29aa86b783","other":"1c8a10ecbd72acb2bbbb8b77ea5404f9e90f4dbf306ec8134cfed70b40aef399","up":true},{"one":"16725e318322353befc2f2aba112f0984bc011821bb16c98e2cd8b39cd62aea1","other":"7dc2a9573f253f362ef1b21bbfcc144b11a6febc58aa3c4430224160e9fa738c","up":true},{"one":"66e7fc2df51f5df8d7329851fe9357d895e9d5dfdc25f8d92bdb10a960f7e15a","other":"16725e318322353befc2f2aba112f0984bc011821bb16c98e2cd8b39cd62aea1","up":true},{"one":"82dd83838cb982b89505ef249d353a20e434346dd78b71cd9b809f71d5c112da","other":"daec45eca40f48843b41f70267c07e94996ced829f02710f15354fbe26e177e7","up":true},{"one":"fbc8087a723c564ca0139329902e79748af46699ea7be24d57909a7e8e96f681","other":"c620752a083ca1ff0398937235cf964133939452c293c799ce07ff8aa2bde420","up":true},{"one":"b65ee2549536a806ceef4a7ccc9544567cafe6204080929fc847df0a3781ccc9","other":"5f00b3bebef2f5484ff1386298add68a6743a106200ae8a13a27dbb52714ee8f","up":true},{"one":"49cd1efed6a56a78af4ea4ab40813013e76c6a5fb9d2029ee02db5d80f5e41a6","other":"7b90e939ae2a240f0d74a923afb6bbf11f6d5b99a7bf85f1825b1ea36bce744c","up":true},{"one":"c441d27a5f4abaa8e3b0f040a6ef85bb8c970031d6a57503a674e36b3d6915d9","other":"959fda0866d3c18e9399e98485d627044079d6f86b075edaea9315402f5d9395","up":true},{"one":"b5b24532d2810e311e10b1d606baf6007f9124b88a178b32713cf1eddae089be","other":"7a608d2cf9d1d9c5819dc1f9e88e5cb2852aadea01c40e047c2e184b62e7163c","up":true},{"one":"f2d5533eed4b0c184952d859d67e44abe5a75a5de6111c8c106b8f4b2d8ccfc4","other":"217f9952af1eb58d5ca5ac7be763716cfe2c0a4f3cdd4ebe4b5df563f919e2d2","up":true},{"one":"88fefb7506105c0e269baf52955a01b19f55504b13133bac0beab41c9f6e6942","other":"f2d5533eed4b0c184952d859d67e44abe5a75a5de6111c8c106b8f4b2d8ccfc4","up":true},{"one":"ff36a8810dd44f6d1fa42aa91ff6206bcfb4c1ffbab0df73a181daece329e0e3","other":"ad9899f78659492ec248a884927a757f3f3b4e76cd2abc46ad8766251fd8afed","up":true},{"one":"03285e06657032778feff0b43828c964dbf9de669f63171aeb587aa1a1facc0a","other":"6251e9540448726a601699ef4cd19e50c969a746da27228967338cdc09d628bf","up":true},{"one":"1f670c53b4c597beaffacd84e3a697225b04cded9219d0a28e1fe525a3cadcf5","other":"29957e8e92925a8c79bdf513295d96bfb62fbfc597ee1cf767c7ef408f1b1295","up":true},{"one":"6251e9540448726a601699ef4cd19e50c969a746da27228967338cdc09d628bf","other":"c1f9e8e1d509febdf1f267bb227741e513420048a2e669ac9eef4b05a29cf10b","up":true},{"one":"006727dc6f59b120b24c17b8e63f80ef3439105f8118ffeed408f105a48ee60c","other":"2a97d308a720274a440dfa6901ca0a5480af9bab58dd8a6c4afdb9c83ea964c3","up":true},{"one":"3630e05326bacea8fcc739dec42085f845f416ddc698c76ff91f099eb1dc5007","other":"3f946957d910179c7e1a83c44369aacfc31f5727b1a6421a01c8a978ccd349a2","up":true},{"one":"4d103ec5afee559a5a9242e8d650b67301eaec10e96fc2f184e34d48554108a2","other":"41092c852fac630df2a9ca0862716f8e9fb8566c904a49c96389071046bc699d","up":true},{"one":"35e6b1d31f594c06b759525434a7e717ebe6f27ca0188f247ed1247664a50563","other":"ba884e5cfa1ee6eb38217181711e01bb0c37b3e33d1424dfa89ed3e29ef6205b","up":true},{"one":"c441d27a5f4abaa8e3b0f040a6ef85bb8c970031d6a57503a674e36b3d6915d9","other":"915d7a0510bad19266eef8f00ca0cb2efc340253775706495fca8b9160b512cc","up":true},{"one":"610334a0772d3414652b575f2caa6f2db32224907c24d06fda643db9f2ec2afe","other":"6ecb5c36fc0150c287446ae8a8682d629a1d39341230717206219babe3bdf659","up":true},{"one":"6f5f5a77e6092e25e5308413e02ba62c1c559024893a7fb98e26b0f34fed8bfe","other":"c9f5acafbbf8c66647de05b0848d79451eee490709d53f118fc2051410cc8203","up":true},{"one":"0e5e0bb1383b2ec569b157a1d2ae6900592ab892a28367f5613a4e29cb265088","other":"ba884e5cfa1ee6eb38217181711e01bb0c37b3e33d1424dfa89ed3e29ef6205b","up":true},{"one":"0fc59bd04ac9de3195e3c9d0eb573952a5805dd2e7e572078b6e996778adec73","other":"06618d829a8a7317a98f1a40ecf8864e1c94c4e270a9e4c008229dc7cf937b7e","up":true},{"one":"ed2d3e1e5693b44494808907c98ec54d6d08331945d2a2c03e31130fef1d2586","other":"1c8a10ecbd72acb2bbbb8b77ea5404f9e90f4dbf306ec8134cfed70b40aef399","up":true},{"one":"d863ba7405eb07ccddbf1d34efbcbec2867a93a109ed9413d9aecf30d3645a6a","other":"9d0f804849b72397646ba48208ba1e01dcf4de04e788016c4a1a0c93e650ddf5","up":true},{"one":"4636f00be60a9b494a3ebc9ab41cc7cb53ec0b0beff214db2d0a248dc3aeb6af","other":"1436aaa8770e9f1c6294e49f4066c16b1caa50524e9b8fd058059e41657d2a83","up":true},{"one":"a653302730df3d58f796906a93933aa81494f2588d9485ab7676ec3b0ccbb426","other":"9d0f804849b72397646ba48208ba1e01dcf4de04e788016c4a1a0c93e650ddf5","up":true},{"one":"aeb4c75a57ccfc9ac053a3d363cf7c1e3e201406587769ab6615d5c2f86a5410","other":"cc2037c08942a094df12f45831f28e0015fc3ac04d5b8f24ffea9bf3a0b02c39","up":true},{"one":"0c64e5af869b1665fd4016ae6d04c8eedd423636f06d78ecb944ee8e3272a82a","other":"03ccd8d52597d18c0b178ab7361d847d63aad3af920a28345977ae170a1dafcd","up":true},{"one":"24b85c10f098725938ea7d87cd24a4b10358129906fca9790fc266ea8784b538","other":"96fcf14c7f90350091ac6fcb58306ccfb9e4a38d3da59f8ab656854332844cbd","up":true},{"one":"df1e4e46e8ec26cad74b4f35ab070f12c8f6fddca35ac44c1218ff60fe1e6bab","other":"a653302730df3d58f796906a93933aa81494f2588d9485ab7676ec3b0ccbb426","up":true},{"one":"c620752a083ca1ff0398937235cf964133939452c293c799ce07ff8aa2bde420","other":"b02b01a5c37cb05c287a3dc7d04e305de26f8d62dc388542eeb43e97db7b4282","up":true},{"one":"c832b4ad64a17da4b796ffcac646c2aa666b276aabb7eb3bfe7981d64a4da402","other":"ff36a8810dd44f6d1fa42aa91ff6206bcfb4c1ffbab0df73a181daece329e0e3","up":true},{"one":"bcc6724e54f761361f85147eb102a8d1a1a38810a940ce76b1e361ddcadacaa3","other":"b911b8e2d72532b7c66ff5f7bffa70f5ddbeea6903a86f9333399f0c4b5f0fe8","up":true},{"one":"5cd2377226825dc7ea582315cd108d23502df4e9c7c09fc07e7b4aa56440de29","other":"4e5a46c004e85cf86a02fdfbf2243018825d015debfb9a077a1283d302293b3a","up":true},{"one":"30bec7cd0a7d002839aed7654129bd2fe2e2ce7f42aa7bae1560e8bf718954c3","other":"e8efe8016fe6cf649b2755bee22da35ccc6c9c55d404d5385d61f6ea27b84380","up":true},{"one":"7920d69cf7e458fce0781ea1a4e07768e1a69f6818090eff0abf0b4a0c2c35f8","other":"7dbbdeba3731e1ff43072f8cbd86db147761e1b61753eea7024774dbf46914bd","up":true},{"one":"6c4dcdfdee0164a9a3f419430726dd51f9198c65ff6e7de7aaa6f632dcde6794","other":"17db15893bf39b42593ee1de975aba6832046d9da5b4b493ec44272738a29cef","up":true},{"one":"0de3915b0bcc68040c8aa76fbd2cfa0714e9b34c9dbe0838a7cba81c4f73581c","other":"44a10530c376b215baff8531eeb2afb8d6714c4d0350d1a6f32761a97cd6c7ec","up":true},{"one":"b5b24532d2810e311e10b1d606baf6007f9124b88a178b32713cf1eddae089be","other":"915d7a0510bad19266eef8f00ca0cb2efc340253775706495fca8b9160b512cc","up":true},{"one":"c6cf46239078edfb343c645f039725fdee1bbba8b0a6da02e2cc456b9223c9a2","other":"6c4dcdfdee0164a9a3f419430726dd51f9198c65ff6e7de7aaa6f632dcde6794","up":true},{"one":"179f21d2e0421b8056ee9a260bc0985bfa64a52a36d0a8fbce4e03f3120d1d65","other":"c8986871e46f001d15ed8b70f2aa0fea8ae309d5e5671a500f619e3b348c8c15","up":true},{"one":"06618d829a8a7317a98f1a40ecf8864e1c94c4e270a9e4c008229dc7cf937b7e","other":"165f1af67aa1d24569e0bdff61d29b3c39e93250071d8f25b5be6face209ac6a","up":true},{"one":"7dc2a9573f253f362ef1b21bbfcc144b11a6febc58aa3c4430224160e9fa738c","other":"524db81b135af8dc309b942c082a7291dddb851866fc608753f937ee77015be0","up":true},{"one":"103b232552b94090232195dc88f84823701f35ae536b5af6dd33fa655a33cbae","other":"2c79af7ea85f96db7897cf8cdb4d002ad2308194e03981876edb8d904ef65137","up":true},{"one":"154be9255e9aebd134a914070f5e6f3d4bba079d9ca738b74244db14e1b586dd","other":"1c9caf028df31681b1457a54d4b3ab20009f9fa5bd12417a1ba7efe0c660e6bd","up":true},{"one":"4c9eab8ab45405a6d4bab46430efc04b8e6aec1d944f88435eca41361925f379","other":"7e0458ecdf7081443cab5412529f3948ece659facaca03208496c80dd136e704","up":true},{"one":"53fe2c13926507a7a6c27d0fb30a2c358c4c7bfa40df8b5fa8ec8986c2450519","other":"534bcaa98cf9192b35b6014c650ae067e74332c015ebb516d63601427d7376b8","up":true},{"one":"045ba8da4641da3f0b8058bb0d9d8aafbb81496dc1cae2a3fd9c039a7e1cafb6","other":"21a044e772b7c955fe4a6fb7c3a9a20e95d48b7fd6b9518741782f04f5f1f5c2","up":true},{"one":"a34ea2e87d4c12adb27d66c2c95300603ff50415974e000bbcc69a5ae059dbf1","other":"daec45eca40f48843b41f70267c07e94996ced829f02710f15354fbe26e177e7","up":true},{"one":"53087084708cc5ee63ac459b18fa10ae52a823139b4ecba6c8691d4934f2f971","other":"58ed74695bf527bac9a350c86d305e53e08c4999795e11cd3b2a36f5cd25d637","up":true},{"one":"3b88a472beba4a18f8df45678888fd359bac3823900eecfe0037fdc9ad54d416","other":"d1d719ce1dca507598449afe966396c160ad25ad632112ab268b1d913b490dbd","up":true},{"one":"cc2037c08942a094df12f45831f28e0015fc3ac04d5b8f24ffea9bf3a0b02c39","other":"90765b72283f59be4cf9bf7a9e9a22fd6db701c3603cbc0817b4adf2f8e9ce08","up":true},{"one":"df1e4e46e8ec26cad74b4f35ab070f12c8f6fddca35ac44c1218ff60fe1e6bab","other":"0743bcf2aaa77e916f4a367d6159473c7d80f46a2e4cbe9ef346e423d39d7072","up":true},{"one":"6967e7438125c2045d575eb9f407b4a38d1bf9dcd1c1c1a97f750da6a21aeff7","other":"7e0458ecdf7081443cab5412529f3948ece659facaca03208496c80dd136e704","up":true},{"one":"b89793c3ccd9ea642080728732ce7df33778653fed3d1d8f3a25e60670e33325","other":"af02b5d107b3a17f539c7f9020ebe74322434634e70c420a7f56776eb5d9db73","up":true},{"one":"2c79af7ea85f96db7897cf8cdb4d002ad2308194e03981876edb8d904ef65137","other":"1c9caf028df31681b1457a54d4b3ab20009f9fa5bd12417a1ba7efe0c660e6bd","up":true},{"one":"6251e9540448726a601699ef4cd19e50c969a746da27228967338cdc09d628bf","other":"21a044e772b7c955fe4a6fb7c3a9a20e95d48b7fd6b9518741782f04f5f1f5c2","up":true},{"one":"e775e9759d4701bd9b43c22f1d1be73c1262b2752bb23cb3857485daf1dcad2d","other":"e8830f2b2f7d08df15bd33f4b2841d01d9d62c1621234bd6ae86743e52360f3e","up":true},{"one":"82dd83838cb982b89505ef249d353a20e434346dd78b71cd9b809f71d5c112da","other":"c1f9e8e1d509febdf1f267bb227741e513420048a2e669ac9eef4b05a29cf10b","up":true},{"one":"1b830ed484b274a96ec7ba2f9a42b6859412b5334a564014ff3f11597ea3a32d","other":"6fe9a02e950a5c3a5ff026b75922ed687d59795ba8eb9c092a8d09a5c64d2453","up":true},{"one":"7b90e939ae2a240f0d74a923afb6bbf11f6d5b99a7bf85f1825b1ea36bce744c","other":"b626d472b555e6f950a7142783db8deb443a74e63ef6bd72a87eaf1af14ca805","up":true},{"one":"d29941d6b8acd86cf32fd1c2181da3ab1da3c2083134b068ca49ce29aa86b783","other":"96fcf14c7f90350091ac6fcb58306ccfb9e4a38d3da59f8ab656854332844cbd","up":true},{"one":"4a8b610e09d35aa21c42ab8c3e38de600a944c094e6b86ea56828b5e6904f1f7","other":"0d8a919207fb2d5718eab7da95f8efeb01a4e1ae39602d315f8ba2ff1752d9da","up":true},{"one":"b820e480354000c837b1781ec1c493e8776b4834252e6453425ac05b925b5a58","other":"e8548b5df15adf0f2a997ff5709827beb5e1d36bb08a2f2d017746d5c0e83fca","up":true},{"one":"0a005eb9c10c5cc9f720cfec2a655811d391671597b4f32d12df291ec76b2c13","other":"5efb3bfc199f5408f79bd6bd5171b4bf332c68a8e49242eb4f6a589b963565c6","up":true},{"one":"03ccd8d52597d18c0b178ab7361d847d63aad3af920a28345977ae170a1dafcd","other":"2a0a8eaf1a2749e68f8b841578c160699cf7907ff23842c6d616ad884e5f613e","up":true},{"one":"e027a9f7152641c4a41154f8ce4dafd23895c312150efea86bf4152c88d0ca86","other":"c6cf46239078edfb343c645f039725fdee1bbba8b0a6da02e2cc456b9223c9a2","up":true},{"one":"ef1b70bf090bc9994b1d45e2812c56ecb430a89c346a436bd10880bcda700351","other":"b7cafed41dac01dd59e2bcaeaaab551ebfeab8eaa1f97c1866fe0ddae772807b","up":true},{"one":"17040a3aad5930d8e0de1011fd2996b7d09225989f0dc1ae8f7e7a52dd26ab4e","other":"2c3894b6e47cf19ac7ee9fe213196312f676256f670dff25b03563492550bc74","up":true},{"one":"af02b5d107b3a17f539c7f9020ebe74322434634e70c420a7f56776eb5d9db73","other":"9890e6ebb2c6f9a7bec4c2778e077e3710ce3af356f82ae9b4d324832d159ef7","up":true},{"one":"18f6e66e1cc8e620808901b571fdf525ee8f41850fac0bd0e5c5a4de70c5f873","other":"c832b4ad64a17da4b796ffcac646c2aa666b276aabb7eb3bfe7981d64a4da402","up":true},{"one":"1c9caf028df31681b1457a54d4b3ab20009f9fa5bd12417a1ba7efe0c660e6bd","other":"33b5c521b4208e26414db2e05c9a8ccc001a524d928579d44d2e74d14a56593e","up":true},{"one":"efeae3b7f610dc10acc51068e7718876d147cd78a9a28788c5dba5bb3a6950dc","other":"378e7af7cc019186d4f2699e753e2d71302f8f3565572c13b7a1b1c5cb47443c","up":true},{"one":"b7cafed41dac01dd59e2bcaeaaab551ebfeab8eaa1f97c1866fe0ddae772807b","other":"c9f5acafbbf8c66647de05b0848d79451eee490709d53f118fc2051410cc8203","up":true},{"one":"03285e06657032778feff0b43828c964dbf9de669f63171aeb587aa1a1facc0a","other":"628e7da3359ed6d9dcfbafc7581966e4e09245c321ec78ca75587c9cbb44697f","up":true},{"one":"17040a3aad5930d8e0de1011fd2996b7d09225989f0dc1ae8f7e7a52dd26ab4e","other":"898d2f7d46b4961b646d5a6142d54d6233b7f80f668ce234522dd02e2cc545cb","up":true},{"one":"849bcbb9be43b799fefc5e689efc75125da27f536e97e5b7921031520ae6e5d8","other":"f31cc744ea921fee8364c5269b1ce7ec6b5f0c0cbb6885efbf602de5b36f6169","up":true},{"one":"b7cafed41dac01dd59e2bcaeaaab551ebfeab8eaa1f97c1866fe0ddae772807b","other":"3f946957d910179c7e1a83c44369aacfc31f5727b1a6421a01c8a978ccd349a2","up":true},{"one":"44a10530c376b215baff8531eeb2afb8d6714c4d0350d1a6f32761a97cd6c7ec","other":"96fcf14c7f90350091ac6fcb58306ccfb9e4a38d3da59f8ab656854332844cbd","up":true},{"one":"ef1b70bf090bc9994b1d45e2812c56ecb430a89c346a436bd10880bcda700351","other":"3f946957d910179c7e1a83c44369aacfc31f5727b1a6421a01c8a978ccd349a2","up":true},{"one":"13d6cb9316e289923e2d1de7f3c966d0cbabce3acdb8017122944f4abb140912","other":"0ff2d2c49547eebc96675e0b88073dea5e9091bee1843ffe567127e34486c348","up":true},{"one":"7dd3078c71087ab88d4d26a962820bcb79b8ce30e91c1f9a69d4bf8d38086960","other":"c620752a083ca1ff0398937235cf964133939452c293c799ce07ff8aa2bde420","up":true},{"one":"44a10530c376b215baff8531eeb2afb8d6714c4d0350d1a6f32761a97cd6c7ec","other":"849bcbb9be43b799fefc5e689efc75125da27f536e97e5b7921031520ae6e5d8","up":true},{"one":"1a2a0e0bbf83cd40936995674418ae469aa2b92876a4ceeabd8128f536b7d7a2","other":"17040a3aad5930d8e0de1011fd2996b7d09225989f0dc1ae8f7e7a52dd26ab4e","up":true},{"one":"9fa0215e980dc907df4cc47ab4937f36527d78f9837493016fd4fc51e617299c","other":"af02b5d107b3a17f539c7f9020ebe74322434634e70c420a7f56776eb5d9db73","up":true},{"one":"44a10530c376b215baff8531eeb2afb8d6714c4d0350d1a6f32761a97cd6c7ec","other":"b89793c3ccd9ea642080728732ce7df33778653fed3d1d8f3a25e60670e33325","up":true},{"one":"19faaf891eb6a716902ec29d201dc2094ee474acff188ae86faf9760674b2d37","other":"21a044e772b7c955fe4a6fb7c3a9a20e95d48b7fd6b9518741782f04f5f1f5c2","up":true},{"one":"b7cafed41dac01dd59e2bcaeaaab551ebfeab8eaa1f97c1866fe0ddae772807b","other":"e5149cedd990072f2aaa9735a9259f28973c45876660c2d86ac105e56cca8e68","up":true},{"one":"ef1b70bf090bc9994b1d45e2812c56ecb430a89c346a436bd10880bcda700351","other":"33737df75bbac1b41c63f05ea2cf1523b972df17f22bda026db84a49ac35e1e3","up":true},{"one":"ad9899f78659492ec248a884927a757f3f3b4e76cd2abc46ad8766251fd8afed","other":"c9f5acafbbf8c66647de05b0848d79451eee490709d53f118fc2051410cc8203","up":true},{"one":"3b78bc987c7c31c94e8ada9b4b11b5db9387fe70dd01ce7f3e976d3bec433dec","other":"41092c852fac630df2a9ca0862716f8e9fb8566c904a49c96389071046bc699d","up":true},{"one":"17040a3aad5930d8e0de1011fd2996b7d09225989f0dc1ae8f7e7a52dd26ab4e","other":"1f670c53b4c597beaffacd84e3a697225b04cded9219d0a28e1fe525a3cadcf5","up":true},{"one":"1a2a0e0bbf83cd40936995674418ae469aa2b92876a4ceeabd8128f536b7d7a2","other":"6ecb5c36fc0150c287446ae8a8682d629a1d39341230717206219babe3bdf659","up":true},{"one":"14dfb8414d17b2df15eaf59571a8cfec99b1fd674561da63ee99af853bda07da","other":"88a141c607019477c7b120a506285a7218cad2faa038082e0b9ddfcc9cb78d07","up":true},{"one":"1a2a0e0bbf83cd40936995674418ae469aa2b92876a4ceeabd8128f536b7d7a2","other":"1c47ad5bd8846f777daf59587feccc308f4dc63f6d27b1385ff8085c75bb1aac","up":true},{"one":"17040a3aad5930d8e0de1011fd2996b7d09225989f0dc1ae8f7e7a52dd26ab4e","other":"29957e8e92925a8c79bdf513295d96bfb62fbfc597ee1cf767c7ef408f1b1295","up":true},{"one":"ef07be559914ec4b5930d90d8d8b6f32dab9eba23acc36f14d512307f9974348","other":"c9f5acafbbf8c66647de05b0848d79451eee490709d53f118fc2051410cc8203","up":true},{"one":"5db08436c64f4cc9e2b3950e35bc8ad739825e3efa67a642c771d95b34cb420c","other":"17040a3aad5930d8e0de1011fd2996b7d09225989f0dc1ae8f7e7a52dd26ab4e","up":true},{"one":"9fa0215e980dc907df4cc47ab4937f36527d78f9837493016fd4fc51e617299c","other":"9890e6ebb2c6f9a7bec4c2778e077e3710ce3af356f82ae9b4d324832d159ef7","up":true},{"one":"96fcf14c7f90350091ac6fcb58306ccfb9e4a38d3da59f8ab656854332844cbd","other":"7e0458ecdf7081443cab5412529f3948ece659facaca03208496c80dd136e704","up":true},{"one":"bb90464f769a85549c150f861775aa67924c7c651f393f6c70772707376a5c7e","other":"ae2b3876bdbd6388781b65e31de182564c5d81f4511caf96588b1a287760b3dd","up":true},{"one":"c1f9e8e1d509febdf1f267bb227741e513420048a2e669ac9eef4b05a29cf10b","other":"af02b5d107b3a17f539c7f9020ebe74322434634e70c420a7f56776eb5d9db73","up":true},{"one":"ad9899f78659492ec248a884927a757f3f3b4e76cd2abc46ad8766251fd8afed","other":"898d2f7d46b4961b646d5a6142d54d6233b7f80f668ce234522dd02e2cc545cb","up":true},{"one":"5db08436c64f4cc9e2b3950e35bc8ad739825e3efa67a642c771d95b34cb420c","other":"2c3894b6e47cf19ac7ee9fe213196312f676256f670dff25b03563492550bc74","up":true},{"one":"2a0a8eaf1a2749e68f8b841578c160699cf7907ff23842c6d616ad884e5f613e","other":"d863ba7405eb07ccddbf1d34efbcbec2867a93a109ed9413d9aecf30d3645a6a","up":true},{"one":"b911b8e2d72532b7c66ff5f7bffa70f5ddbeea6903a86f9333399f0c4b5f0fe8","other":"b2a563ac59bab4dfddf7b6e27b80ee7afdeb2e4295411107903f484bcf9fc4f2","up":true},{"one":"37801e8d7d46143f78924ed66099f658a94d37edfd2f58d02acb85add03e1894","other":"f2d5533eed4b0c184952d859d67e44abe5a75a5de6111c8c106b8f4b2d8ccfc4","up":true},{"one":"f27f1044777e05f3f60165d0d2fc3e7667fe148e0ca7a097805d60b9f61025f7","other":"f4565dd2c428c03d7a8d5fad87a6dd5f92ae706529eb6152d36fa584e7cdbe4d","up":true},{"one":"37801e8d7d46143f78924ed66099f658a94d37edfd2f58d02acb85add03e1894","other":"baf219e9229921b773d1ad7eb7eb5216cfa60ccecaa3c5c487e3b71cb600ba12","up":true},{"one":"b89793c3ccd9ea642080728732ce7df33778653fed3d1d8f3a25e60670e33325","other":"7e0458ecdf7081443cab5412529f3948ece659facaca03208496c80dd136e704","up":true},{"one":"90a85cb7363ede161ec21cc89f8b9d4350e566cf10586a66d31b0a8677620aa1","other":"41092c852fac630df2a9ca0862716f8e9fb8566c904a49c96389071046bc699d","up":true},{"one":"d887070a0568282c69e96ce65612ba72d5ea26b5c80671435d6e1ed2c4b49301","other":"aeb4c75a57ccfc9ac053a3d363cf7c1e3e201406587769ab6615d5c2f86a5410","up":true},{"one":"baf219e9229921b773d1ad7eb7eb5216cfa60ccecaa3c5c487e3b71cb600ba12","other":"915d7a0510bad19266eef8f00ca0cb2efc340253775706495fca8b9160b512cc","up":true},{"one":"e5d794d64003725a74642f097c0ee76706d78419b6f3ea819d440bc0ad166eac","other":"f629b8b9e79c75ac559daf9bf4fc8672bfdd595cf2c5d17a8885282626fc65a5","up":true},{"one":"90a85cb7363ede161ec21cc89f8b9d4350e566cf10586a66d31b0a8677620aa1","other":"3f946957d910179c7e1a83c44369aacfc31f5727b1a6421a01c8a978ccd349a2","up":true},{"one":"33737df75bbac1b41c63f05ea2cf1523b972df17f22bda026db84a49ac35e1e3","other":"39d1fcae2d23c775214988251505c577b9ac7b6851558ddf9a437dfe143f3845","up":true},{"one":"66e7fc2df51f5df8d7329851fe9357d895e9d5dfdc25f8d92bdb10a960f7e15a","other":"1c9caf028df31681b1457a54d4b3ab20009f9fa5bd12417a1ba7efe0c660e6bd","up":true},{"one":"ef07be559914ec4b5930d90d8d8b6f32dab9eba23acc36f14d512307f9974348","other":"ff36a8810dd44f6d1fa42aa91ff6206bcfb4c1ffbab0df73a181daece329e0e3","up":true},{"one":"4bcf4eb531d5ec4b31d99e8354af03f976524c7858a1e7043e9b7055326f0952","other":"628e7da3359ed6d9dcfbafc7581966e4e09245c321ec78ca75587c9cbb44697f","up":true},{"one":"6c73150490e8be9677c40086de0aefed1939581048e26f4a93f5ca26571a1a8f","other":"6e68ea86440706a0d73a9508f2247492543163f8fa7e2dc2aa62b74d50261b8b","up":true},{"one":"11d43f6ed0ddd5afa5c8a7abf7c62a4fa865b7a25ee295bf1a49701ef3081363","other":"0af9a57a2f66835cd3e4e71bc026013a8a99ca337a7b6b6cc34e11d8da212a4f","up":true},{"one":"efeae3b7f610dc10acc51068e7718876d147cd78a9a28788c5dba5bb3a6950dc","other":"1436aaa8770e9f1c6294e49f4066c16b1caa50524e9b8fd058059e41657d2a83","up":true},{"one":"165f1af67aa1d24569e0bdff61d29b3c39e93250071d8f25b5be6face209ac6a","other":"2c79af7ea85f96db7897cf8cdb4d002ad2308194e03981876edb8d904ef65137","up":true},{"one":"f27f1044777e05f3f60165d0d2fc3e7667fe148e0ca7a097805d60b9f61025f7","other":"daec45eca40f48843b41f70267c07e94996ced829f02710f15354fbe26e177e7","up":true},{"one":"915d7a0510bad19266eef8f00ca0cb2efc340253775706495fca8b9160b512cc","other":"c49caff13862dc089f1f9b8180d6efa455648375662719272102c4f8028799d6","up":true},{"one":"3efc4b120b3eeeac186bf3a4cd42eb8c647f7edb08c23ee643e2bec9d72c5bed","other":"2abb938b889a2eb735134462985a56056be48f189b5b89d23b653864c76427f4","up":true},{"one":"9d0f804849b72397646ba48208ba1e01dcf4de04e788016c4a1a0c93e650ddf5","other":"63370e288ab2e4b8403c6678e9c44ae5c7496b5ead614306fceb85986ed29d18","up":true},{"one":"33737df75bbac1b41c63f05ea2cf1523b972df17f22bda026db84a49ac35e1e3","other":"32371744163f0b3aefd3955dc4877e7eb82b17ef9541c333ca9c0a9f8aec3045","up":true},{"one":"5f00b3bebef2f5484ff1386298add68a6743a106200ae8a13a27dbb52714ee8f","other":"ec52270604007673d1bfda1edbd8bfa945a21141efd85e42b684a9f30f8cddae","up":true},{"one":"60d7337ef806be95ccaf7b9d663a4289f9afc68edced62904ab50601cf113f45","other":"e54784cfbcd89c37c8f758aae70ece3ab4b7f8c30fb4ef7543e04aa89ff4386b","up":true},{"one":"5db08436c64f4cc9e2b3950e35bc8ad739825e3efa67a642c771d95b34cb420c","other":"04518d7120fa8a528d983ca1ee6d5d09ba24a4e853fb22bc9084cdf34995e95f","up":true},{"one":"11d43f6ed0ddd5afa5c8a7abf7c62a4fa865b7a25ee295bf1a49701ef3081363","other":"bb90464f769a85549c150f861775aa67924c7c651f393f6c70772707376a5c7e","up":true},{"one":"60d7337ef806be95ccaf7b9d663a4289f9afc68edced62904ab50601cf113f45","other":"da67ace34f7076a1d550bc61bc2a31da88d6cd9f9df43b142a8c6bbade1b4aee","up":true},{"one":"2d3645c4fdf9a2809a909076b9ee5fb98fa880f6faeff914f1a2987af928cd79","other":"f629b8b9e79c75ac559daf9bf4fc8672bfdd595cf2c5d17a8885282626fc65a5","up":true},{"one":"0b72054403f78a64a787f46e9f26bf0de7bbba5a60cb105e6aeea46cb4a1d9fe","other":"a3693801a91180410cf3e85d7c09ac8054a769e7b1d55c9e7a46850cb8217da0","up":true},{"one":"af02b5d107b3a17f539c7f9020ebe74322434634e70c420a7f56776eb5d9db73","other":"2abb938b889a2eb735134462985a56056be48f189b5b89d23b653864c76427f4","up":true},{"one":"e8830f2b2f7d08df15bd33f4b2841d01d9d62c1621234bd6ae86743e52360f3e","other":"daec45eca40f48843b41f70267c07e94996ced829f02710f15354fbe26e177e7","up":true},{"one":"06618d829a8a7317a98f1a40ecf8864e1c94c4e270a9e4c008229dc7cf937b7e","other":"03285e06657032778feff0b43828c964dbf9de669f63171aeb587aa1a1facc0a","up":true},{"one":"0b72054403f78a64a787f46e9f26bf0de7bbba5a60cb105e6aeea46cb4a1d9fe","other":"41092c852fac630df2a9ca0862716f8e9fb8566c904a49c96389071046bc699d","up":true},{"one":"9d0f804849b72397646ba48208ba1e01dcf4de04e788016c4a1a0c93e650ddf5","other":"21012a3a6ef1ece48fd9d7cffe62dc75839dd062efcf3ac5f962c237814da407","up":true},{"one":"5f00b3bebef2f5484ff1386298add68a6743a106200ae8a13a27dbb52714ee8f","other":"d863ba7405eb07ccddbf1d34efbcbec2867a93a109ed9413d9aecf30d3645a6a","up":true},{"one":"eb98fb45dd5754f24f9df0c9ecbb93932e3d9d7735cd6d0ddd4a8675bb4ef554","other":"e8548b5df15adf0f2a997ff5709827beb5e1d36bb08a2f2d017746d5c0e83fca","up":true},{"one":"9890e6ebb2c6f9a7bec4c2778e077e3710ce3af356f82ae9b4d324832d159ef7","other":"e8830f2b2f7d08df15bd33f4b2841d01d9d62c1621234bd6ae86743e52360f3e","up":true},{"one":"7290cd3affade5f9e729d1b03549aceafb2576cdbc6789fd688c95495f10bacd","other":"0d8a919207fb2d5718eab7da95f8efeb01a4e1ae39602d315f8ba2ff1752d9da","up":true},{"one":"f31cc744ea921fee8364c5269b1ce7ec6b5f0c0cbb6885efbf602de5b36f6169","other":"82dd83838cb982b89505ef249d353a20e434346dd78b71cd9b809f71d5c112da","up":true},{"one":"628e7da3359ed6d9dcfbafc7581966e4e09245c321ec78ca75587c9cbb44697f","other":"41d9c03e44bec3f84a6139ce40ef1e390530f38ed11860575acfad03a49db095","up":true},{"one":"2d3645c4fdf9a2809a909076b9ee5fb98fa880f6faeff914f1a2987af928cd79","other":"ac4d2d6836e2cdf4c88221f6013aac70a451dd15bc403288bd10d0b911cd9a2b","up":true},{"one":"e8830f2b2f7d08df15bd33f4b2841d01d9d62c1621234bd6ae86743e52360f3e","other":"c1f9e8e1d509febdf1f267bb227741e513420048a2e669ac9eef4b05a29cf10b","up":true},{"one":"13d6cb9316e289923e2d1de7f3c966d0cbabce3acdb8017122944f4abb140912","other":"103b232552b94090232195dc88f84823701f35ae536b5af6dd33fa655a33cbae","up":true},{"one":"2ccfb5b1f3923d35fef88838c508b98b5516c5d409643881d2304ae49e50eed3","other":"0438f567045d4556a0e7a697028d689ecfd0ae20f9e85c09b48d9f1fd0ee4765","up":true},{"one":"2d3645c4fdf9a2809a909076b9ee5fb98fa880f6faeff914f1a2987af928cd79","other":"ff36a8810dd44f6d1fa42aa91ff6206bcfb4c1ffbab0df73a181daece329e0e3","up":true},{"one":"378e7af7cc019186d4f2699e753e2d71302f8f3565572c13b7a1b1c5cb47443c","other":"6f2d756566dd5b4a13ffeea9f687c785148f3407a502e28b9d6edfd03b905fdc","up":true},{"one":"2ccfb5b1f3923d35fef88838c508b98b5516c5d409643881d2304ae49e50eed3","other":"63370e288ab2e4b8403c6678e9c44ae5c7496b5ead614306fceb85986ed29d18","up":true},{"one":"0ff2d2c49547eebc96675e0b88073dea5e9091bee1843ffe567127e34486c348","other":"00c6488a842ece7a8b0daf064e405de03a4257d308840ea52bfd48d23f54d895","up":true},{"one":"13d6cb9316e289923e2d1de7f3c966d0cbabce3acdb8017122944f4abb140912","other":"6e68ea86440706a0d73a9508f2247492543163f8fa7e2dc2aa62b74d50261b8b","up":true},{"one":"0743bcf2aaa77e916f4a367d6159473c7d80f46a2e4cbe9ef346e423d39d7072","other":"d863ba7405eb07ccddbf1d34efbcbec2867a93a109ed9413d9aecf30d3645a6a","up":true},{"one":"f4565dd2c428c03d7a8d5fad87a6dd5f92ae706529eb6152d36fa584e7cdbe4d","other":"eb98fb45dd5754f24f9df0c9ecbb93932e3d9d7735cd6d0ddd4a8675bb4ef554","up":true},{"one":"0c28cd1315890629896d0fe5517524d4eb788f7444709c135ea690ba4e6103d5","other":"045ba8da4641da3f0b8058bb0d9d8aafbb81496dc1cae2a3fd9c039a7e1cafb6","up":true},{"one":"baf219e9229921b773d1ad7eb7eb5216cfa60ccecaa3c5c487e3b71cb600ba12","other":"217f9952af1eb58d5ca5ac7be763716cfe2c0a4f3cdd4ebe4b5df563f919e2d2","up":true},{"one":"0743bcf2aaa77e916f4a367d6159473c7d80f46a2e4cbe9ef346e423d39d7072","other":"e5d794d64003725a74642f097c0ee76706d78419b6f3ea819d440bc0ad166eac","up":true},{"one":"0ff2d2c49547eebc96675e0b88073dea5e9091bee1843ffe567127e34486c348","other":"90765b72283f59be4cf9bf7a9e9a22fd6db701c3603cbc0817b4adf2f8e9ce08","up":true},{"one":"46fee69dad8b6a6a87d356d10db25d835a0c4e154bf179e88fb4cc65f97d72d7","other":"7b90e939ae2a240f0d74a923afb6bbf11f6d5b99a7bf85f1825b1ea36bce744c","up":true},{"one":"b820e480354000c837b1781ec1c493e8776b4834252e6453425ac05b925b5a58","other":"9852ce267d53106a6e584d6eddb08e0062eb4a422d2a8d39ad6dccaebac552ff","up":true},{"one":"47bfa3767cefcc0831d410d5402e9396e8a412c8c96faf55b451d3ff310f3b02","other":"37801e8d7d46143f78924ed66099f658a94d37edfd2f58d02acb85add03e1894","up":true},{"one":"f4565dd2c428c03d7a8d5fad87a6dd5f92ae706529eb6152d36fa584e7cdbe4d","other":"c8986871e46f001d15ed8b70f2aa0fea8ae309d5e5671a500f619e3b348c8c15","up":true},{"one":"915d7a0510bad19266eef8f00ca0cb2efc340253775706495fca8b9160b512cc","other":"444722a15b01a0d8e6794798d239fe621d59bdfc08823ab47cbd8b9acebd23b4","up":true},{"one":"c49caff13862dc089f1f9b8180d6efa455648375662719272102c4f8028799d6","other":"e8efe8016fe6cf649b2755bee22da35ccc6c9c55d404d5385d61f6ea27b84380","up":true},{"one":"7dbbdeba3731e1ff43072f8cbd86db147761e1b61753eea7024774dbf46914bd","other":"775e7be502df8fd938cf9c42ee4fac33e460a4b6992b9efeb8dc1ff7dde5c40f","up":true},{"one":"f4565dd2c428c03d7a8d5fad87a6dd5f92ae706529eb6152d36fa584e7cdbe4d","other":"c1f9e8e1d509febdf1f267bb227741e513420048a2e669ac9eef4b05a29cf10b","up":true},{"one":"7dbbdeba3731e1ff43072f8cbd86db147761e1b61753eea7024774dbf46914bd","other":"738c2d42458965d03c8f9f055eaf0e3edf3dfa2a4de0a048ec05b78e7b765c90","up":true},{"one":"d640472351969a5578e541aca72b7640c583b995fd62607ff3ee3f3f3139aafd","other":"d7aca8f2182bc625d2b3c942bd1161c85bcf1c2b34ecbe3e2fd23cfae6b8a871","up":true},{"one":"c8986871e46f001d15ed8b70f2aa0fea8ae309d5e5671a500f619e3b348c8c15","other":"4bcf4eb531d5ec4b31d99e8354af03f976524c7858a1e7043e9b7055326f0952","up":true},{"one":"2f32d54f06989efb6ca5431b74cd759fba05dbef36ecff8fd506e662026af983","other":"314a3530a5e0c37d5609149b3ae9c2e078573346bd8fce3c769ebaeb31726ec1","up":true},{"one":"b5b24532d2810e311e10b1d606baf6007f9124b88a178b32713cf1eddae089be","other":"6fe9a02e950a5c3a5ff026b75922ed687d59795ba8eb9c092a8d09a5c64d2453","up":true},{"one":"b65ee2549536a806ceef4a7ccc9544567cafe6204080929fc847df0a3781ccc9","other":"6e05179dc90a8f6654d0c9a3f06173371dcfb18b852fdd77f35f75e38f273125","up":true},{"one":"0c64e5af869b1665fd4016ae6d04c8eedd423636f06d78ecb944ee8e3272a82a","other":"a653302730df3d58f796906a93933aa81494f2588d9485ab7676ec3b0ccbb426","up":true},{"one":"0743bcf2aaa77e916f4a367d6159473c7d80f46a2e4cbe9ef346e423d39d7072","other":"ec52270604007673d1bfda1edbd8bfa945a21141efd85e42b684a9f30f8cddae","up":true},{"one":"b89793c3ccd9ea642080728732ce7df33778653fed3d1d8f3a25e60670e33325","other":"e7fa7112adc7b023dd5965e620277122542153f87eaf5deeacc8a51f1778ba77","up":true},{"one":"582330d8b8c49331b2aec790dc7325b9cd483fc8129323d31ec429d545042964","other":"534bcaa98cf9192b35b6014c650ae067e74332c015ebb516d63601427d7376b8","up":true},{"one":"77d2ec52dabd5d7f326d4c6afd2aad110487c6bdffa2984060528716ba873462","other":"574f65867482091aee2774033116c233525eea711706b5ae9ba09b54e896d302","up":true},{"one":"6f2d756566dd5b4a13ffeea9f687c785148f3407a502e28b9d6edfd03b905fdc","other":"574f65867482091aee2774033116c233525eea711706b5ae9ba09b54e896d302","up":true},{"one":"04518d7120fa8a528d983ca1ee6d5d09ba24a4e853fb22bc9084cdf34995e95f","other":"898d2f7d46b4961b646d5a6142d54d6233b7f80f668ce234522dd02e2cc545cb","up":true},{"one":"f925c85e6457ac01f0cd6b297155f9d3ae611603890d8f3a45e1396d937f8680","other":"cc2037c08942a094df12f45831f28e0015fc3ac04d5b8f24ffea9bf3a0b02c39","up":true},{"one":"5f00b3bebef2f5484ff1386298add68a6743a106200ae8a13a27dbb52714ee8f","other":"0cf596af91eb9b041fe6dbe6b288c5730413850321b5ab176c81447e34ef79c5","up":true},{"one":"db6a1f6b342f6be9517f8df01003797c11c837d9aee3cdba5b7859230b36c35d","other":"fe2167fd33f383110eb3f6caa7bd905ca54fa0c810f1b8a34483a846f3cbddab","up":true},{"one":"f5b24a1fd2cd2908b408562f9a265ee1a692b137e770137afa5fdfa07b237221","other":"d887070a0568282c69e96ce65612ba72d5ea26b5c80671435d6e1ed2c4b49301","up":true},{"one":"00c6488a842ece7a8b0daf064e405de03a4257d308840ea52bfd48d23f54d895","other":"f925c85e6457ac01f0cd6b297155f9d3ae611603890d8f3a45e1396d937f8680","up":true},{"one":"179f21d2e0421b8056ee9a260bc0985bfa64a52a36d0a8fbce4e03f3120d1d65","other":"c1f9e8e1d509febdf1f267bb227741e513420048a2e669ac9eef4b05a29cf10b","up":true},{"one":"f7fa2986ec9f84822b11a6b00bd03a1dd26f2a0fab90b1b308f08caead43cfe1","other":"5f00b3bebef2f5484ff1386298add68a6743a106200ae8a13a27dbb52714ee8f","up":true},{"one":"30897492824b19540d13ef17c70845be6dde455dca4e4f84cfca14a2c373969f","other":"d863ba7405eb07ccddbf1d34efbcbec2867a93a109ed9413d9aecf30d3645a6a","up":true},{"one":"b5025d153581d333b44df4b9bfa69d87de138905172e4fd317e16f7099a5fcf8","other":"46fee69dad8b6a6a87d356d10db25d835a0c4e154bf179e88fb4cc65f97d72d7","up":true},{"one":"499036eb9d10fc003c903f09ea0ee00c0d27b39564988d67ae111f3473d22f07","other":"5cd2377226825dc7ea582315cd108d23502df4e9c7c09fc07e7b4aa56440de29","up":true},{"one":"30897492824b19540d13ef17c70845be6dde455dca4e4f84cfca14a2c373969f","other":"2d3645c4fdf9a2809a909076b9ee5fb98fa880f6faeff914f1a2987af928cd79","up":true},{"one":"63370e288ab2e4b8403c6678e9c44ae5c7496b5ead614306fceb85986ed29d18","other":"20aeb14f567dd16f06b0d3b589b83283daa00a5ed10e447860bda946baccdd2d","up":true},{"one":"045ba8da4641da3f0b8058bb0d9d8aafbb81496dc1cae2a3fd9c039a7e1cafb6","other":"3b88a472beba4a18f8df45678888fd359bac3823900eecfe0037fdc9ad54d416","up":true},{"one":"6f2d756566dd5b4a13ffeea9f687c785148f3407a502e28b9d6edfd03b905fdc","other":"455936fd22c43794e6e2104fd91d3f5d246e3823e8ff8eaf8dc27aa9f3d2ee08","up":true},{"one":"f7fa2986ec9f84822b11a6b00bd03a1dd26f2a0fab90b1b308f08caead43cfe1","other":"20aeb14f567dd16f06b0d3b589b83283daa00a5ed10e447860bda946baccdd2d","up":true},{"one":"6ea51fb6e4783f351dbbfa47b508c78c73233ebaada409dfb55446217f92c4bd","other":"4d6b939fb67338c484948ab92b2ceea4d4b666d7e08773673cd7c8f83f495b89","up":true},{"one":"1c9caf028df31681b1457a54d4b3ab20009f9fa5bd12417a1ba7efe0c660e6bd","other":"534bcaa98cf9192b35b6014c650ae067e74332c015ebb516d63601427d7376b8","up":true},{"one":"a3693801a91180410cf3e85d7c09ac8054a769e7b1d55c9e7a46850cb8217da0","other":"14dfb8414d17b2df15eaf59571a8cfec99b1fd674561da63ee99af853bda07da","up":true},{"one":"41092c852fac630df2a9ca0862716f8e9fb8566c904a49c96389071046bc699d","other":"33737df75bbac1b41c63f05ea2cf1523b972df17f22bda026db84a49ac35e1e3","up":true},{"one":"ca041da0dc514643d017458d08ff6962ec52c9e66571a239ec395dc8b2546709","other":"e5ada0415c92ef1511b15d04edf395976464afd9adc3e929c41d4d21d25e3182","up":true},{"one":"fbf5e917be45e909697a9393c4778206333cf1dd9a103978e8d71622ca3b1cc8","other":"90765b72283f59be4cf9bf7a9e9a22fd6db701c3603cbc0817b4adf2f8e9ce08","up":true},{"one":"c43fbee95380007274b8f231fe34bcd59b5c0ef0830b174967d4702627984fc6","other":"976e57d0c32227222bfd0cbb802f269bdcd52d5d33cf689c66b12c023f5fa8bf","up":true},{"one":"256e81c5a6fb43bd343345477f8f96aa1947f07ac3297f631ab03f060147b062","other":"c6cf46239078edfb343c645f039725fdee1bbba8b0a6da02e2cc456b9223c9a2","up":true},{"one":"8f2182c2c2d0eeb2e887dbc350ae7257819f536032851ffdf29e7842cb1a62cc","other":"bb90464f769a85549c150f861775aa67924c7c651f393f6c70772707376a5c7e","up":true},{"one":"6c4dcdfdee0164a9a3f419430726dd51f9198c65ff6e7de7aaa6f632dcde6794","other":"455936fd22c43794e6e2104fd91d3f5d246e3823e8ff8eaf8dc27aa9f3d2ee08","up":true},{"one":"0de3915b0bcc68040c8aa76fbd2cfa0714e9b34c9dbe0838a7cba81c4f73581c","other":"24b85c10f098725938ea7d87cd24a4b10358129906fca9790fc266ea8784b538","up":true},{"one":"b2b5ba1bb188f18f79b295f2c0d48c52c1d1d449ecb9b94b9984f3a6179732c7","other":"db6a1f6b342f6be9517f8df01003797c11c837d9aee3cdba5b7859230b36c35d","up":true},{"one":"7125e05bf1bfe6df948c9276b62bc755fc6b0ec8d4ac7724b61ea49591adcf25","other":"534bcaa98cf9192b35b6014c650ae067e74332c015ebb516d63601427d7376b8","up":true},{"one":"07a8c900fec6c477580ed5b38848a8681dc52a19e59fa4cd32f571fe7fb2383a","other":"77d2ec52dabd5d7f326d4c6afd2aad110487c6bdffa2984060528716ba873462","up":true},{"one":"ee5e77df690329c132f2f7fca223cfd384b7bc34ec38763a4eb42780e0585656","other":"0c28cd1315890629896d0fe5517524d4eb788f7444709c135ea690ba4e6103d5","up":true},{"one":"44a10530c376b215baff8531eeb2afb8d6714c4d0350d1a6f32761a97cd6c7ec","other":"b95d88ff6512ef8eaaa6bd842fa44175c1484fc2e8601b83d50a5ffa992bfa3a","up":true},{"one":"c6cf46239078edfb343c645f039725fdee1bbba8b0a6da02e2cc456b9223c9a2","other":"b2b5ba1bb188f18f79b295f2c0d48c52c1d1d449ecb9b94b9984f3a6179732c7","up":true},{"one":"ed2d3e1e5693b44494808907c98ec54d6d08331945d2a2c03e31130fef1d2586","other":"0de3915b0bcc68040c8aa76fbd2cfa0714e9b34c9dbe0838a7cba81c4f73581c","up":true},{"one":"17db15893bf39b42593ee1de975aba6832046d9da5b4b493ec44272738a29cef","other":"07a8c900fec6c477580ed5b38848a8681dc52a19e59fa4cd32f571fe7fb2383a","up":true},{"one":"2ccfb5b1f3923d35fef88838c508b98b5516c5d409643881d2304ae49e50eed3","other":"f7fa2986ec9f84822b11a6b00bd03a1dd26f2a0fab90b1b308f08caead43cfe1","up":true},{"one":"a6fbe16b81d240ff2f2ed6c93cfd9590731dfb2e7ec3fce1c098fe542bedf299","other":"c6cf46239078edfb343c645f039725fdee1bbba8b0a6da02e2cc456b9223c9a2","up":true},{"one":"2a97d308a720274a440dfa6901ca0a5480af9bab58dd8a6c4afdb9c83ea964c3","other":"04518d7120fa8a528d983ca1ee6d5d09ba24a4e853fb22bc9084cdf34995e95f","up":true},{"one":"24b85c10f098725938ea7d87cd24a4b10358129906fca9790fc266ea8784b538","other":"b5025d153581d333b44df4b9bfa69d87de138905172e4fd317e16f7099a5fcf8","up":true},{"one":"35e6b1d31f594c06b759525434a7e717ebe6f27ca0188f247ed1247664a50563","other":"3630e05326bacea8fcc739dec42085f845f416ddc698c76ff91f099eb1dc5007","up":true},{"one":"77d2ec52dabd5d7f326d4c6afd2aad110487c6bdffa2984060528716ba873462","other":"4636f00be60a9b494a3ebc9ab41cc7cb53ec0b0beff214db2d0a248dc3aeb6af","up":true},{"one":"4d59cf1aeecf370e94a7a231887450cef97053b9c88a7fd11e210840af070e29","other":"605a46991af15cd60e67413c712b99ff8f21173c96a7990f2728ad6cac2bb9d8","up":true},{"one":"0cf596af91eb9b041fe6dbe6b288c5730413850321b5ab176c81447e34ef79c5","other":"217f9952af1eb58d5ca5ac7be763716cfe2c0a4f3cdd4ebe4b5df563f919e2d2","up":true},{"one":"1c47ad5bd8846f777daf59587feccc308f4dc63f6d27b1385ff8085c75bb1aac","other":"2a0a8eaf1a2749e68f8b841578c160699cf7907ff23842c6d616ad884e5f613e","up":true},{"one":"915d7a0510bad19266eef8f00ca0cb2efc340253775706495fca8b9160b512cc","other":"2ccfb5b1f3923d35fef88838c508b98b5516c5d409643881d2304ae49e50eed3","up":true},{"one":"baf219e9229921b773d1ad7eb7eb5216cfa60ccecaa3c5c487e3b71cb600ba12","other":"e5d794d64003725a74642f097c0ee76706d78419b6f3ea819d440bc0ad166eac","up":true},{"one":"45584a4bebb948ef5f7b55d4846ec5549d7623682169c0edcab5b3523e68c7da","other":"4ac755123dcc64ef44db9280311af51f3f7a93e0dee67370d673261220356eb9","up":true},{"one":"0e5e0bb1383b2ec569b157a1d2ae6900592ab892a28367f5613a4e29cb265088","other":"0b72054403f78a64a787f46e9f26bf0de7bbba5a60cb105e6aeea46cb4a1d9fe","up":true},{"one":"6ecb5c36fc0150c287446ae8a8682d629a1d39341230717206219babe3bdf659","other":"03ccd8d52597d18c0b178ab7361d847d63aad3af920a28345977ae170a1dafcd","up":true},{"one":"6e68ea86440706a0d73a9508f2247492543163f8fa7e2dc2aa62b74d50261b8b","other":"1c9caf028df31681b1457a54d4b3ab20009f9fa5bd12417a1ba7efe0c660e6bd","up":true},{"one":"1a2a0e0bbf83cd40936995674418ae469aa2b92876a4ceeabd8128f536b7d7a2","other":"30897492824b19540d13ef17c70845be6dde455dca4e4f84cfca14a2c373969f","up":true},{"one":"1f670c53b4c597beaffacd84e3a697225b04cded9219d0a28e1fe525a3cadcf5","other":"2a0a8eaf1a2749e68f8b841578c160699cf7907ff23842c6d616ad884e5f613e","up":true},{"one":"45584a4bebb948ef5f7b55d4846ec5549d7623682169c0edcab5b3523e68c7da","other":"47bfa3767cefcc0831d410d5402e9396e8a412c8c96faf55b451d3ff310f3b02","up":true},{"one":"e5149cedd990072f2aaa9735a9259f28973c45876660c2d86ac105e56cca8e68","other":"0b72054403f78a64a787f46e9f26bf0de7bbba5a60cb105e6aeea46cb4a1d9fe","up":true},{"one":"b95d88ff6512ef8eaaa6bd842fa44175c1484fc2e8601b83d50a5ffa992bfa3a","other":"c1f9e8e1d509febdf1f267bb227741e513420048a2e669ac9eef4b05a29cf10b","up":true},{"one":"df1e4e46e8ec26cad74b4f35ab070f12c8f6fddca35ac44c1218ff60fe1e6bab","other":"ac4d2d6836e2cdf4c88221f6013aac70a451dd15bc403288bd10d0b911cd9a2b","up":true},{"one":"02d85b9f8e4776224ae5088683a87837b82b2bfb7e047cf373a28393e7aca6e1","other":"e5ada0415c92ef1511b15d04edf395976464afd9adc3e929c41d4d21d25e3182","up":true},{"one":"512ec5c2e6b4d788482462d941117c81fcc0e73f0c15545794dd1b4e03bf2102","other":"47bfa3767cefcc0831d410d5402e9396e8a412c8c96faf55b451d3ff310f3b02","up":true},{"one":"e54784cfbcd89c37c8f758aae70ece3ab4b7f8c30fb4ef7543e04aa89ff4386b","other":"e5ada0415c92ef1511b15d04edf395976464afd9adc3e929c41d4d21d25e3182","up":true},{"one":"d863ba7405eb07ccddbf1d34efbcbec2867a93a109ed9413d9aecf30d3645a6a","other":"898d2f7d46b4961b646d5a6142d54d6233b7f80f668ce234522dd02e2cc545cb","up":true},{"one":"524db81b135af8dc309b942c082a7291dddb851866fc608753f937ee77015be0","other":"738c2d42458965d03c8f9f055eaf0e3edf3dfa2a4de0a048ec05b78e7b765c90","up":true},{"one":"90765b72283f59be4cf9bf7a9e9a22fd6db701c3603cbc0817b4adf2f8e9ce08","other":"850575577d6b420a87aba388af481e0c044c2f75cf29ff934daf5674318a61ba","up":true},{"one":"fe2167fd33f383110eb3f6caa7bd905ca54fa0c810f1b8a34483a846f3cbddab","other":"d29941d6b8acd86cf32fd1c2181da3ab1da3c2083134b068ca49ce29aa86b783","up":true},{"one":"49eaad68d23dd63ef26029fa3f4e2578f3deca8708bbc838750d8b6dbe9eaa38","other":"d887070a0568282c69e96ce65612ba72d5ea26b5c80671435d6e1ed2c4b49301","up":true},{"one":"63370e288ab2e4b8403c6678e9c44ae5c7496b5ead614306fceb85986ed29d18","other":"444722a15b01a0d8e6794798d239fe621d59bdfc08823ab47cbd8b9acebd23b4","up":true},{"one":"574f65867482091aee2774033116c233525eea711706b5ae9ba09b54e896d302","other":"67aa5463e4b32b363b3d01d2a41ccb03199411057276f4962d053160be29a6ef","up":true},{"one":"ec52270604007673d1bfda1edbd8bfa945a21141efd85e42b684a9f30f8cddae","other":"2ccfb5b1f3923d35fef88838c508b98b5516c5d409643881d2304ae49e50eed3","up":true},{"one":"6f5f5a77e6092e25e5308413e02ba62c1c559024893a7fb98e26b0f34fed8bfe","other":"17040a3aad5930d8e0de1011fd2996b7d09225989f0dc1ae8f7e7a52dd26ab4e","up":true},{"one":"c59e3953b64e5b9ffbe53990a358914f2fa8e3551d33f92b9e3a441bd1baf2cd","other":"c49caff13862dc089f1f9b8180d6efa455648375662719272102c4f8028799d6","up":true},{"one":"6fe9a02e950a5c3a5ff026b75922ed687d59795ba8eb9c092a8d09a5c64d2453","other":"02d85b9f8e4776224ae5088683a87837b82b2bfb7e047cf373a28393e7aca6e1","up":true},{"one":"3ec530761ddb87f930fda919be67df18074c6f0795292add1b2a91ff3d9c39e3","other":"19faaf891eb6a716902ec29d201dc2094ee474acff188ae86faf9760674b2d37","up":true},{"one":"b626d472b555e6f950a7142783db8deb443a74e63ef6bd72a87eaf1af14ca805","other":"88fefb7506105c0e269baf52955a01b19f55504b13133bac0beab41c9f6e6942","up":true},{"one":"ef1b70bf090bc9994b1d45e2812c56ecb430a89c346a436bd10880bcda700351","other":"35e6b1d31f594c06b759525434a7e717ebe6f27ca0188f247ed1247664a50563","up":true},{"one":"d640472351969a5578e541aca72b7640c583b995fd62607ff3ee3f3f3139aafd","other":"f2d5533eed4b0c184952d859d67e44abe5a75a5de6111c8c106b8f4b2d8ccfc4","up":true},{"one":"4d103ec5afee559a5a9242e8d650b67301eaec10e96fc2f184e34d48554108a2","other":"0e5e0bb1383b2ec569b157a1d2ae6900592ab892a28367f5613a4e29cb265088","up":true},{"one":"c832b4ad64a17da4b796ffcac646c2aa666b276aabb7eb3bfe7981d64a4da402","other":"fe316679eca0e0eb823325812a56fd27da02653b06ada2fd03b27501bda8371a","up":true},{"one":"bcc6724e54f761361f85147eb102a8d1a1a38810a940ce76b1e361ddcadacaa3","other":"a34ea2e87d4c12adb27d66c2c95300603ff50415974e000bbcc69a5ae059dbf1","up":true},{"one":"51db114a52827f5b74088bd0fc87d35229e7740e7d121bd7699298396516a880","other":"2c3894b6e47cf19ac7ee9fe213196312f676256f670dff25b03563492550bc74","up":true},{"one":"f629b8b9e79c75ac559daf9bf4fc8672bfdd595cf2c5d17a8885282626fc65a5","other":"959fda0866d3c18e9399e98485d627044079d6f86b075edaea9315402f5d9395","up":true},{"one":"baddc778aea97acdbbb5bc99744a5545abab9f6047c81f328761645287ac391c","other":"886aff1f1e3b86bfe901066bb7948451c18fe3f8cd1b7318b05154890ca8f738","up":true},{"one":"d3b0dea1dd3ac71e7e4a30941632eec53cb980aa7cb6cdac95042a5400a878c3","other":"90765b72283f59be4cf9bf7a9e9a22fd6db701c3603cbc0817b4adf2f8e9ce08","up":true},{"one":"006727dc6f59b120b24c17b8e63f80ef3439105f8118ffeed408f105a48ee60c","other":"2c3894b6e47cf19ac7ee9fe213196312f676256f670dff25b03563492550bc74","up":true},{"one":"2a97d308a720274a440dfa6901ca0a5480af9bab58dd8a6c4afdb9c83ea964c3","other":"17040a3aad5930d8e0de1011fd2996b7d09225989f0dc1ae8f7e7a52dd26ab4e","up":true},{"one":"58ed74695bf527bac9a350c86d305e53e08c4999795e11cd3b2a36f5cd25d637","other":"4d103ec5afee559a5a9242e8d650b67301eaec10e96fc2f184e34d48554108a2","up":true},{"one":"fe316679eca0e0eb823325812a56fd27da02653b06ada2fd03b27501bda8371a","other":"e5149cedd990072f2aaa9735a9259f28973c45876660c2d86ac105e56cca8e68","up":true},{"one":"ed2d3e1e5693b44494808907c98ec54d6d08331945d2a2c03e31130fef1d2586","other":"1436aaa8770e9f1c6294e49f4066c16b1caa50524e9b8fd058059e41657d2a83","up":true},{"one":"7a608d2cf9d1d9c5819dc1f9e88e5cb2852aadea01c40e047c2e184b62e7163c","other":"1b830ed484b274a96ec7ba2f9a42b6859412b5334a564014ff3f11597ea3a32d","up":true},{"one":"53a885968d68d8ebf7ed514e662cc13fa03186d2361000a03576531fdca2a25f","other":"88fefb7506105c0e269baf52955a01b19f55504b13133bac0beab41c9f6e6942","up":true},{"one":"8025c1fcb98e53f92767d1d43a3057a0acd1e8994bb4a7e3f5e244110e0dcf91","other":"f4e09f89287bd1af7833acd85ba7cc71fdb3ff34f2f409e1cf2a878dcd3183dc","up":true},{"one":"610334a0772d3414652b575f2caa6f2db32224907c24d06fda643db9f2ec2afe","other":"1f670c53b4c597beaffacd84e3a697225b04cded9219d0a28e1fe525a3cadcf5","up":true},{"one":"256e81c5a6fb43bd343345477f8f96aa1947f07ac3297f631ab03f060147b062","other":"1436aaa8770e9f1c6294e49f4066c16b1caa50524e9b8fd058059e41657d2a83","up":true},{"one":"c620752a083ca1ff0398937235cf964133939452c293c799ce07ff8aa2bde420","other":"850575577d6b420a87aba388af481e0c044c2f75cf29ff934daf5674318a61ba","up":true},{"one":"5cd2377226825dc7ea582315cd108d23502df4e9c7c09fc07e7b4aa56440de29","other":"7125e05bf1bfe6df948c9276b62bc755fc6b0ec8d4ac7724b61ea49591adcf25","up":true},{"one":"e5149cedd990072f2aaa9735a9259f28973c45876660c2d86ac105e56cca8e68","other":"90a85cb7363ede161ec21cc89f8b9d4350e566cf10586a66d31b0a8677620aa1","up":true},{"one":"e54784cfbcd89c37c8f758aae70ece3ab4b7f8c30fb4ef7543e04aa89ff4386b","other":"da67ace34f7076a1d550bc61bc2a31da88d6cd9f9df43b142a8c6bbade1b4aee","up":true},{"one":"3b88a472beba4a18f8df45678888fd359bac3823900eecfe0037fdc9ad54d416","other":"e027a9f7152641c4a41154f8ce4dafd23895c312150efea86bf4152c88d0ca86","up":true},{"one":"fe2167fd33f383110eb3f6caa7bd905ca54fa0c810f1b8a34483a846f3cbddab","other":"f4e09f89287bd1af7833acd85ba7cc71fdb3ff34f2f409e1cf2a878dcd3183dc","up":true},{"one":"8025c1fcb98e53f92767d1d43a3057a0acd1e8994bb4a7e3f5e244110e0dcf91","other":"c6cf46239078edfb343c645f039725fdee1bbba8b0a6da02e2cc456b9223c9a2","up":true},{"one":"49cd1efed6a56a78af4ea4ab40813013e76c6a5fb9d2029ee02db5d80f5e41a6","other":"478278187cd9af799e83340a2f49b0b7f122fb8e08c0a372a87795426eab364b","up":true},{"one":"f925c85e6457ac01f0cd6b297155f9d3ae611603890d8f3a45e1396d937f8680","other":"b02b01a5c37cb05c287a3dc7d04e305de26f8d62dc388542eeb43e97db7b4282","up":true},{"one":"e7fa7112adc7b023dd5965e620277122542153f87eaf5deeacc8a51f1778ba77","other":"e54b643cbc95d9f5d27ec3760d892b6802981bfabf4f9979267d66259df982c7","up":true},{"one":"3ec530761ddb87f930fda919be67df18074c6f0795292add1b2a91ff3d9c39e3","other":"f773b83f1a1de2ab6660edb0b765cfccec6778061ee25c5a84f968625686ef60","up":true},{"one":"f5b24a1fd2cd2908b408562f9a265ee1a692b137e770137afa5fdfa07b237221","other":"cc2037c08942a094df12f45831f28e0015fc3ac04d5b8f24ffea9bf3a0b02c39","up":true},{"one":"7125e05bf1bfe6df948c9276b62bc755fc6b0ec8d4ac7724b61ea49591adcf25","other":"53fe2c13926507a7a6c27d0fb30a2c358c4c7bfa40df8b5fa8ec8986c2450519","up":true},{"one":"0d8a919207fb2d5718eab7da95f8efeb01a4e1ae39602d315f8ba2ff1752d9da","other":"30bec7cd0a7d002839aed7654129bd2fe2e2ce7f42aa7bae1560e8bf718954c3","up":true},{"one":"ba884e5cfa1ee6eb38217181711e01bb0c37b3e33d1424dfa89ed3e29ef6205b","other":"33737df75bbac1b41c63f05ea2cf1523b972df17f22bda026db84a49ac35e1e3","up":true},{"one":"2d3645c4fdf9a2809a909076b9ee5fb98fa880f6faeff914f1a2987af928cd79","other":"df1e4e46e8ec26cad74b4f35ab070f12c8f6fddca35ac44c1218ff60fe1e6bab","up":true},{"one":"314a3530a5e0c37d5609149b3ae9c2e078573346bd8fce3c769ebaeb31726ec1","other":"41d9c03e44bec3f84a6139ce40ef1e390530f38ed11860575acfad03a49db095","up":true},{"one":"4ac755123dcc64ef44db9280311af51f3f7a93e0dee67370d673261220356eb9","other":"37801e8d7d46143f78924ed66099f658a94d37edfd2f58d02acb85add03e1894","up":true},{"one":"db6a1f6b342f6be9517f8df01003797c11c837d9aee3cdba5b7859230b36c35d","other":"1f85b8c05e5dceff0bd8256f8f6d80d4b902a9754ceb952d95ea2e1150ef9e59","up":true},{"one":"0fc59bd04ac9de3195e3c9d0eb573952a5805dd2e7e572078b6e996778adec73","other":"00c6488a842ece7a8b0daf064e405de03a4257d308840ea52bfd48d23f54d895","up":true},{"one":"67dcfd21ece30b41a39bc55c0986fca8f401bb3acba821969519f09d0933e8bd","other":"524db81b135af8dc309b942c082a7291dddb851866fc608753f937ee77015be0","up":true},{"one":"21a044e772b7c955fe4a6fb7c3a9a20e95d48b7fd6b9518741782f04f5f1f5c2","other":"7dbbdeba3731e1ff43072f8cbd86db147761e1b61753eea7024774dbf46914bd","up":true},{"one":"0b72054403f78a64a787f46e9f26bf0de7bbba5a60cb105e6aeea46cb4a1d9fe","other":"39d1fcae2d23c775214988251505c577b9ac7b6851558ddf9a437dfe143f3845","up":true},{"one":"21012a3a6ef1ece48fd9d7cffe62dc75839dd062efcf3ac5f962c237814da407","other":"20aeb14f567dd16f06b0d3b589b83283daa00a5ed10e447860bda946baccdd2d","up":true},{"one":"314a3530a5e0c37d5609149b3ae9c2e078573346bd8fce3c769ebaeb31726ec1","other":"1c9caf028df31681b1457a54d4b3ab20009f9fa5bd12417a1ba7efe0c660e6bd","up":true},{"one":"6251e9540448726a601699ef4cd19e50c969a746da27228967338cdc09d628bf","other":"ee5e77df690329c132f2f7fca223cfd384b7bc34ec38763a4eb42780e0585656","up":true},{"one":"455936fd22c43794e6e2104fd91d3f5d246e3823e8ff8eaf8dc27aa9f3d2ee08","other":"77d2ec52dabd5d7f326d4c6afd2aad110487c6bdffa2984060528716ba873462","up":true},{"one":"6e68ea86440706a0d73a9508f2247492543163f8fa7e2dc2aa62b74d50261b8b","other":"3e8efcaf3002522b39065ea30c15426d1eb55916499eff8eb5a814e39d41853c","up":true},{"one":"caf6a8e37fd41c1e6ad77a8575cd90354bb1693893952301c9caeb4779c338d3","other":"e8efe8016fe6cf649b2755bee22da35ccc6c9c55d404d5385d61f6ea27b84380","up":true},{"one":"aeb4c75a57ccfc9ac053a3d363cf7c1e3e201406587769ab6615d5c2f86a5410","other":"a3693801a91180410cf3e85d7c09ac8054a769e7b1d55c9e7a46850cb8217da0","up":true},{"one":"0438f567045d4556a0e7a697028d689ecfd0ae20f9e85c09b48d9f1fd0ee4765","other":"1c47ad5bd8846f777daf59587feccc308f4dc63f6d27b1385ff8085c75bb1aac","up":true},{"one":"21a044e772b7c955fe4a6fb7c3a9a20e95d48b7fd6b9518741782f04f5f1f5c2","other":"6ea51fb6e4783f351dbbfa47b508c78c73233ebaada409dfb55446217f92c4bd","up":true},{"one":"c43fbee95380007274b8f231fe34bcd59b5c0ef0830b174967d4702627984fc6","other":"7290cd3affade5f9e729d1b03549aceafb2576cdbc6789fd688c95495f10bacd","up":true},{"one":"4d103ec5afee559a5a9242e8d650b67301eaec10e96fc2f184e34d48554108a2","other":"32371744163f0b3aefd3955dc4877e7eb82b17ef9541c333ca9c0a9f8aec3045","up":true},{"one":"9d0f804849b72397646ba48208ba1e01dcf4de04e788016c4a1a0c93e650ddf5","other":"2d3645c4fdf9a2809a909076b9ee5fb98fa880f6faeff914f1a2987af928cd79","up":true},{"one":"33737df75bbac1b41c63f05ea2cf1523b972df17f22bda026db84a49ac35e1e3","other":"ae2b3876bdbd6388781b65e31de182564c5d81f4511caf96588b1a287760b3dd","up":true},{"one":"d7aca8f2182bc625d2b3c942bd1161c85bcf1c2b34ecbe3e2fd23cfae6b8a871","other":"88fefb7506105c0e269baf52955a01b19f55504b13133bac0beab41c9f6e6942","up":true},{"one":"4d59cf1aeecf370e94a7a231887450cef97053b9c88a7fd11e210840af070e29","other":"53fe2c13926507a7a6c27d0fb30a2c358c4c7bfa40df8b5fa8ec8986c2450519","up":true},{"one":"fbc8087a723c564ca0139329902e79748af46699ea7be24d57909a7e8e96f681","other":"9fa0215e980dc907df4cc47ab4937f36527d78f9837493016fd4fc51e617299c","up":true},{"one":"b911b8e2d72532b7c66ff5f7bffa70f5ddbeea6903a86f9333399f0c4b5f0fe8","other":"90765b72283f59be4cf9bf7a9e9a22fd6db701c3603cbc0817b4adf2f8e9ce08","up":true},{"one":"37801e8d7d46143f78924ed66099f658a94d37edfd2f58d02acb85add03e1894","other":"217f9952af1eb58d5ca5ac7be763716cfe2c0a4f3cdd4ebe4b5df563f919e2d2","up":true},{"one":"e775e9759d4701bd9b43c22f1d1be73c1262b2752bb23cb3857485daf1dcad2d","other":"e8548b5df15adf0f2a997ff5709827beb5e1d36bb08a2f2d017746d5c0e83fca","up":true},{"one":"67aa5463e4b32b363b3d01d2a41ccb03199411057276f4962d053160be29a6ef","other":"60d7337ef806be95ccaf7b9d663a4289f9afc68edced62904ab50601cf113f45","up":true},{"one":"499036eb9d10fc003c903f09ea0ee00c0d27b39564988d67ae111f3473d22f07","other":"4e5a46c004e85cf86a02fdfbf2243018825d015debfb9a077a1283d302293b3a","up":true},{"one":"6ea51fb6e4783f351dbbfa47b508c78c73233ebaada409dfb55446217f92c4bd","other":"4bcf4eb531d5ec4b31d99e8354af03f976524c7858a1e7043e9b7055326f0952","up":true},{"one":"68317431e4fa55be4a700e35c6a578307cc32b72336679b5c5618b622ef0c602","other":"6967e7438125c2045d575eb9f407b4a38d1bf9dcd1c1c1a97f750da6a21aeff7","up":true},{"one":"103b232552b94090232195dc88f84823701f35ae536b5af6dd33fa655a33cbae","other":"1c9caf028df31681b1457a54d4b3ab20009f9fa5bd12417a1ba7efe0c660e6bd","up":true},{"one":"90765b72283f59be4cf9bf7a9e9a22fd6db701c3603cbc0817b4adf2f8e9ce08","other":"82dd83838cb982b89505ef249d353a20e434346dd78b71cd9b809f71d5c112da","up":true},{"one":"68317431e4fa55be4a700e35c6a578307cc32b72336679b5c5618b622ef0c602","other":"6c4dcdfdee0164a9a3f419430726dd51f9198c65ff6e7de7aaa6f632dcde6794","up":true},{"one":"6c73150490e8be9677c40086de0aefed1939581048e26f4a93f5ca26571a1a8f","other":"2c79af7ea85f96db7897cf8cdb4d002ad2308194e03981876edb8d904ef65137","up":true},{"one":"fbc8087a723c564ca0139329902e79748af46699ea7be24d57909a7e8e96f681","other":"e54b643cbc95d9f5d27ec3760d892b6802981bfabf4f9979267d66259df982c7","up":true},{"one":"90a85cb7363ede161ec21cc89f8b9d4350e566cf10586a66d31b0a8677620aa1","other":"39d1fcae2d23c775214988251505c577b9ac7b6851558ddf9a437dfe143f3845","up":true},{"one":"e8efe8016fe6cf649b2755bee22da35ccc6c9c55d404d5385d61f6ea27b84380","other":"4ac755123dcc64ef44db9280311af51f3f7a93e0dee67370d673261220356eb9","up":true},{"one":"e8548b5df15adf0f2a997ff5709827beb5e1d36bb08a2f2d017746d5c0e83fca","other":"e54b643cbc95d9f5d27ec3760d892b6802981bfabf4f9979267d66259df982c7","up":true},{"one":"154be9255e9aebd134a914070f5e6f3d4bba079d9ca738b74244db14e1b586dd","other":"f925c85e6457ac01f0cd6b297155f9d3ae611603890d8f3a45e1396d937f8680","up":true},{"one":"03ccd8d52597d18c0b178ab7361d847d63aad3af920a28345977ae170a1dafcd","other":"217f9952af1eb58d5ca5ac7be763716cfe2c0a4f3cdd4ebe4b5df563f919e2d2","up":true},{"one":"9890e6ebb2c6f9a7bec4c2778e077e3710ce3af356f82ae9b4d324832d159ef7","other":"e54b643cbc95d9f5d27ec3760d892b6802981bfabf4f9979267d66259df982c7","up":true},{"one":"17db15893bf39b42593ee1de975aba6832046d9da5b4b493ec44272738a29cef","other":"a6fbe16b81d240ff2f2ed6c93cfd9590731dfb2e7ec3fce1c098fe542bedf299","up":true},{"one":"6967e7438125c2045d575eb9f407b4a38d1bf9dcd1c1c1a97f750da6a21aeff7","other":"7dc2a9573f253f362ef1b21bbfcc144b11a6febc58aa3c4430224160e9fa738c","up":true},{"one":"f7fa2986ec9f84822b11a6b00bd03a1dd26f2a0fab90b1b308f08caead43cfe1","other":"df1e4e46e8ec26cad74b4f35ab070f12c8f6fddca35ac44c1218ff60fe1e6bab","up":true},{"one":"7b90e939ae2a240f0d74a923afb6bbf11f6d5b99a7bf85f1825b1ea36bce744c","other":"7290cd3affade5f9e729d1b03549aceafb2576cdbc6789fd688c95495f10bacd","up":true},{"one":"60d7337ef806be95ccaf7b9d663a4289f9afc68edced62904ab50601cf113f45","other":"1b830ed484b274a96ec7ba2f9a42b6859412b5334a564014ff3f11597ea3a32d","up":true},{"one":"378e7af7cc019186d4f2699e753e2d71302f8f3565572c13b7a1b1c5cb47443c","other":"07a8c900fec6c477580ed5b38848a8681dc52a19e59fa4cd32f571fe7fb2383a","up":true},{"one":"20aeb14f567dd16f06b0d3b589b83283daa00a5ed10e447860bda946baccdd2d","other":"6ecb5c36fc0150c287446ae8a8682d629a1d39341230717206219babe3bdf659","up":true},{"one":"d7aca8f2182bc625d2b3c942bd1161c85bcf1c2b34ecbe3e2fd23cfae6b8a871","other":"5b632eaf700d173ff15f4727b85817e6173228c304b422434a08c2cad438b825","up":true},{"one":"8f2182c2c2d0eeb2e887dbc350ae7257819f536032851ffdf29e7842cb1a62cc","other":"90a85cb7363ede161ec21cc89f8b9d4350e566cf10586a66d31b0a8677620aa1","up":true},{"one":"63370e288ab2e4b8403c6678e9c44ae5c7496b5ead614306fceb85986ed29d18","other":"217f9952af1eb58d5ca5ac7be763716cfe2c0a4f3cdd4ebe4b5df563f919e2d2","up":true},{"one":"0a005eb9c10c5cc9f720cfec2a655811d391671597b4f32d12df291ec76b2c13","other":"32371744163f0b3aefd3955dc4877e7eb82b17ef9541c333ca9c0a9f8aec3045","up":true},{"one":"16725e318322353befc2f2aba112f0984bc011821bb16c98e2cd8b39cd62aea1","other":"775e7be502df8fd938cf9c42ee4fac33e460a4b6992b9efeb8dc1ff7dde5c40f","up":true},{"one":"4646fe4c119078738612b44a356089b3c73a08e11cfd910675d211ae6b20b8fd","other":"4e5a46c004e85cf86a02fdfbf2243018825d015debfb9a077a1283d302293b3a","up":true},{"one":"461cc9f064e6f4f06ff38e0d1f3f00ef8807ba31c7258e453cc682e9551bb1c6","other":"2c3894b6e47cf19ac7ee9fe213196312f676256f670dff25b03563492550bc74","up":true},{"one":"e5d794d64003725a74642f097c0ee76706d78419b6f3ea819d440bc0ad166eac","other":"915d7a0510bad19266eef8f00ca0cb2efc340253775706495fca8b9160b512cc","up":true},{"one":"d29941d6b8acd86cf32fd1c2181da3ab1da3c2083134b068ca49ce29aa86b783","other":"c43fbee95380007274b8f231fe34bcd59b5c0ef0830b174967d4702627984fc6","up":true},{"one":"4a8b610e09d35aa21c42ab8c3e38de600a944c094e6b86ea56828b5e6904f1f7","other":"7a608d2cf9d1d9c5819dc1f9e88e5cb2852aadea01c40e047c2e184b62e7163c","up":true},{"one":"18f6e66e1cc8e620808901b571fdf525ee8f41850fac0bd0e5c5a4de70c5f873","other":"ad9899f78659492ec248a884927a757f3f3b4e76cd2abc46ad8766251fd8afed","up":true},{"one":"e8830f2b2f7d08df15bd33f4b2841d01d9d62c1621234bd6ae86743e52360f3e","other":"e8548b5df15adf0f2a997ff5709827beb5e1d36bb08a2f2d017746d5c0e83fca","up":true},{"one":"fbf5e917be45e909697a9393c4778206333cf1dd9a103978e8d71622ca3b1cc8","other":"f27f1044777e05f3f60165d0d2fc3e7667fe148e0ca7a097805d60b9f61025f7","up":true},{"one":"574f65867482091aee2774033116c233525eea711706b5ae9ba09b54e896d302","other":"478278187cd9af799e83340a2f49b0b7f122fb8e08c0a372a87795426eab364b","up":true},{"one":"165f1af67aa1d24569e0bdff61d29b3c39e93250071d8f25b5be6face209ac6a","other":"0fc59bd04ac9de3195e3c9d0eb573952a5805dd2e7e572078b6e996778adec73","up":true},{"one":"0ff2d2c49547eebc96675e0b88073dea5e9091bee1843ffe567127e34486c348","other":"a46dd535e3bc8f111a8b2ce5594b62e87741c395e8a2b8fbae33edd29cb8caf8","up":true},{"one":"ca041da0dc514643d017458d08ff6962ec52c9e66571a239ec395dc8b2546709","other":"b626d472b555e6f950a7142783db8deb443a74e63ef6bd72a87eaf1af14ca805","up":true},{"one":"49eaad68d23dd63ef26029fa3f4e2578f3deca8708bbc838750d8b6dbe9eaa38","other":"f925c85e6457ac01f0cd6b297155f9d3ae611603890d8f3a45e1396d937f8680","up":true},{"one":"0cf596af91eb9b041fe6dbe6b288c5730413850321b5ab176c81447e34ef79c5","other":"1c47ad5bd8846f777daf59587feccc308f4dc63f6d27b1385ff8085c75bb1aac","up":true},{"one":"53fe2c13926507a7a6c27d0fb30a2c358c4c7bfa40df8b5fa8ec8986c2450519","other":"6c73150490e8be9677c40086de0aefed1939581048e26f4a93f5ca26571a1a8f","up":true},{"one":"6f2d756566dd5b4a13ffeea9f687c785148f3407a502e28b9d6edfd03b905fdc","other":"6c4dcdfdee0164a9a3f419430726dd51f9198c65ff6e7de7aaa6f632dcde6794","up":true},{"one":"efeae3b7f610dc10acc51068e7718876d147cd78a9a28788c5dba5bb3a6950dc","other":"24b85c10f098725938ea7d87cd24a4b10358129906fca9790fc266ea8784b538","up":true},{"one":"1b830ed484b274a96ec7ba2f9a42b6859412b5334a564014ff3f11597ea3a32d","other":"7b90e939ae2a240f0d74a923afb6bbf11f6d5b99a7bf85f1825b1ea36bce744c","up":true},{"one":"b820e480354000c837b1781ec1c493e8776b4834252e6453425ac05b925b5a58","other":"e8830f2b2f7d08df15bd33f4b2841d01d9d62c1621234bd6ae86743e52360f3e","up":true},{"one":"ec52270604007673d1bfda1edbd8bfa945a21141efd85e42b684a9f30f8cddae","other":"d863ba7405eb07ccddbf1d34efbcbec2867a93a109ed9413d9aecf30d3645a6a","up":true},{"one":"45584a4bebb948ef5f7b55d4846ec5549d7623682169c0edcab5b3523e68c7da","other":"49cd1efed6a56a78af4ea4ab40813013e76c6a5fb9d2029ee02db5d80f5e41a6","up":true},{"one":"d1d719ce1dca507598449afe966396c160ad25ad632112ab268b1d913b490dbd","other":"d29941d6b8acd86cf32fd1c2181da3ab1da3c2083134b068ca49ce29aa86b783","up":true},{"one":"2f32d54f06989efb6ca5431b74cd759fba05dbef36ecff8fd506e662026af983","other":"06618d829a8a7317a98f1a40ecf8864e1c94c4e270a9e4c008229dc7cf937b7e","up":true},{"one":"1c47ad5bd8846f777daf59587feccc308f4dc63f6d27b1385ff8085c75bb1aac","other":"2ccfb5b1f3923d35fef88838c508b98b5516c5d409643881d2304ae49e50eed3","up":true},{"one":"3b78bc987c7c31c94e8ada9b4b11b5db9387fe70dd01ce7f3e976d3bec433dec","other":"88a141c607019477c7b120a506285a7218cad2faa038082e0b9ddfcc9cb78d07","up":true},{"one":"bb90464f769a85549c150f861775aa67924c7c651f393f6c70772707376a5c7e","other":"bcc6724e54f761361f85147eb102a8d1a1a38810a940ce76b1e361ddcadacaa3","up":true},{"one":"0c28cd1315890629896d0fe5517524d4eb788f7444709c135ea690ba4e6103d5","other":"16725e318322353befc2f2aba112f0984bc011821bb16c98e2cd8b39cd62aea1","up":true},{"one":"33b5c521b4208e26414db2e05c9a8ccc001a524d928579d44d2e74d14a56593e","other":"00c6488a842ece7a8b0daf064e405de03a4257d308840ea52bfd48d23f54d895","up":true},{"one":"3e8efcaf3002522b39065ea30c15426d1eb55916499eff8eb5a814e39d41853c","other":"2abb938b889a2eb735134462985a56056be48f189b5b89d23b653864c76427f4","up":true},{"one":"2a0a8eaf1a2749e68f8b841578c160699cf7907ff23842c6d616ad884e5f613e","other":"0743bcf2aaa77e916f4a367d6159473c7d80f46a2e4cbe9ef346e423d39d7072","up":true},{"one":"5efb3bfc199f5408f79bd6bd5171b4bf332c68a8e49242eb4f6a589b963565c6","other":"605a46991af15cd60e67413c712b99ff8f21173c96a7990f2728ad6cac2bb9d8","up":true},{"one":"f27f1044777e05f3f60165d0d2fc3e7667fe148e0ca7a097805d60b9f61025f7","other":"c1f9e8e1d509febdf1f267bb227741e513420048a2e669ac9eef4b05a29cf10b","up":true},{"one":"0af9a57a2f66835cd3e4e71bc026013a8a99ca337a7b6b6cc34e11d8da212a4f","other":"00c6488a842ece7a8b0daf064e405de03a4257d308840ea52bfd48d23f54d895","up":true},{"one":"f45f1f2e59e947e04fa15bcf87f872ef6d73b73f778e12d1f9b8930ea166eefc","other":"9fa0215e980dc907df4cc47ab4937f36527d78f9837493016fd4fc51e617299c","up":true},{"one":"39d1fcae2d23c775214988251505c577b9ac7b6851558ddf9a437dfe143f3845","other":"4646fe4c119078738612b44a356089b3c73a08e11cfd910675d211ae6b20b8fd","up":true},{"one":"3efc4b120b3eeeac186bf3a4cd42eb8c647f7edb08c23ee643e2bec9d72c5bed","other":"21a044e772b7c955fe4a6fb7c3a9a20e95d48b7fd6b9518741782f04f5f1f5c2","up":true},{"one":"daec45eca40f48843b41f70267c07e94996ced829f02710f15354fbe26e177e7","other":"b02b01a5c37cb05c287a3dc7d04e305de26f8d62dc388542eeb43e97db7b4282","up":true},{"one":"82dd83838cb982b89505ef249d353a20e434346dd78b71cd9b809f71d5c112da","other":"c8986871e46f001d15ed8b70f2aa0fea8ae309d5e5671a500f619e3b348c8c15","up":true},{"one":"cc2037c08942a094df12f45831f28e0015fc3ac04d5b8f24ffea9bf3a0b02c39","other":"e775e9759d4701bd9b43c22f1d1be73c1262b2752bb23cb3857485daf1dcad2d","up":true},{"one":"1c8a10ecbd72acb2bbbb8b77ea5404f9e90f4dbf306ec8134cfed70b40aef399","other":"7e0458ecdf7081443cab5412529f3948ece659facaca03208496c80dd136e704","up":true},{"one":"7e0458ecdf7081443cab5412529f3948ece659facaca03208496c80dd136e704","other":"b95d88ff6512ef8eaaa6bd842fa44175c1484fc2e8601b83d50a5ffa992bfa3a","up":true},{"one":"66e7fc2df51f5df8d7329851fe9357d895e9d5dfdc25f8d92bdb10a960f7e15a","other":"165f1af67aa1d24569e0bdff61d29b3c39e93250071d8f25b5be6face209ac6a","up":true},{"one":"478278187cd9af799e83340a2f49b0b7f122fb8e08c0a372a87795426eab364b","other":"512ec5c2e6b4d788482462d941117c81fcc0e73f0c15545794dd1b4e03bf2102","up":true},{"one":"898d2f7d46b4961b646d5a6142d54d6233b7f80f668ce234522dd02e2cc545cb","other":"5db08436c64f4cc9e2b3950e35bc8ad739825e3efa67a642c771d95b34cb420c","up":true},{"one":"e54784cfbcd89c37c8f758aae70ece3ab4b7f8c30fb4ef7543e04aa89ff4386b","other":"d7aca8f2182bc625d2b3c942bd1161c85bcf1c2b34ecbe3e2fd23cfae6b8a871","up":true},{"one":"849bcbb9be43b799fefc5e689efc75125da27f536e97e5b7921031520ae6e5d8","other":"f773b83f1a1de2ab6660edb0b765cfccec6778061ee25c5a84f968625686ef60","up":true},{"one":"b02b01a5c37cb05c287a3dc7d04e305de26f8d62dc388542eeb43e97db7b4282","other":"b2a563ac59bab4dfddf7b6e27b80ee7afdeb2e4295411107903f484bcf9fc4f2","up":true},{"one":"f4e09f89287bd1af7833acd85ba7cc71fdb3ff34f2f409e1cf2a878dcd3183dc","other":"b2b5ba1bb188f18f79b295f2c0d48c52c1d1d449ecb9b94b9984f3a6179732c7","up":true},{"one":"e54b643cbc95d9f5d27ec3760d892b6802981bfabf4f9979267d66259df982c7","other":"daec45eca40f48843b41f70267c07e94996ced829f02710f15354fbe26e177e7","up":true},{"one":"534bcaa98cf9192b35b6014c650ae067e74332c015ebb516d63601427d7376b8","other":"2f32d54f06989efb6ca5431b74cd759fba05dbef36ecff8fd506e662026af983","up":true},{"one":"03285e06657032778feff0b43828c964dbf9de669f63171aeb587aa1a1facc0a","other":"7dbbdeba3731e1ff43072f8cbd86db147761e1b61753eea7024774dbf46914bd","up":true},{"one":"02d85b9f8e4776224ae5088683a87837b82b2bfb7e047cf373a28393e7aca6e1","other":"30bec7cd0a7d002839aed7654129bd2fe2e2ce7f42aa7bae1560e8bf718954c3","up":true},{"one":"7e0458ecdf7081443cab5412529f3948ece659facaca03208496c80dd136e704","other":"a6fbe16b81d240ff2f2ed6c93cfd9590731dfb2e7ec3fce1c098fe542bedf299","up":true},{"one":"d887070a0568282c69e96ce65612ba72d5ea26b5c80671435d6e1ed2c4b49301","other":"bcc6724e54f761361f85147eb102a8d1a1a38810a940ce76b1e361ddcadacaa3","up":true},{"one":"f4565dd2c428c03d7a8d5fad87a6dd5f92ae706529eb6152d36fa584e7cdbe4d","other":"fbc8087a723c564ca0139329902e79748af46699ea7be24d57909a7e8e96f681","up":true},{"one":"7dc2a9573f253f362ef1b21bbfcc144b11a6febc58aa3c4430224160e9fa738c","other":"4c9eab8ab45405a6d4bab46430efc04b8e6aec1d944f88435eca41361925f379","up":true},{"one":"898d2f7d46b4961b646d5a6142d54d6233b7f80f668ce234522dd02e2cc545cb","other":"2a97d308a720274a440dfa6901ca0a5480af9bab58dd8a6c4afdb9c83ea964c3","up":true},{"one":"32371744163f0b3aefd3955dc4877e7eb82b17ef9541c333ca9c0a9f8aec3045","other":"11d43f6ed0ddd5afa5c8a7abf7c62a4fa865b7a25ee295bf1a49701ef3081363","up":true},{"one":"1f85b8c05e5dceff0bd8256f8f6d80d4b902a9754ceb952d95ea2e1150ef9e59","other":"378e7af7cc019186d4f2699e753e2d71302f8f3565572c13b7a1b1c5cb47443c","up":true},{"one":"a34ea2e87d4c12adb27d66c2c95300603ff50415974e000bbcc69a5ae059dbf1","other":"b2a563ac59bab4dfddf7b6e27b80ee7afdeb2e4295411107903f484bcf9fc4f2","up":true},{"one":"7dd3078c71087ab88d4d26a962820bcb79b8ce30e91c1f9a69d4bf8d38086960","other":"c8986871e46f001d15ed8b70f2aa0fea8ae309d5e5671a500f619e3b348c8c15","up":true},{"one":"1f85b8c05e5dceff0bd8256f8f6d80d4b902a9754ceb952d95ea2e1150ef9e59","other":"17db15893bf39b42593ee1de975aba6832046d9da5b4b493ec44272738a29cef","up":true},{"one":"5f00b3bebef2f5484ff1386298add68a6743a106200ae8a13a27dbb52714ee8f","other":"959fda0866d3c18e9399e98485d627044079d6f86b075edaea9315402f5d9395","up":true},{"one":"4d6b939fb67338c484948ab92b2ceea4d4b666d7e08773673cd7c8f83f495b89","other":"534bcaa98cf9192b35b6014c650ae067e74332c015ebb516d63601427d7376b8","up":true},{"one":"f925c85e6457ac01f0cd6b297155f9d3ae611603890d8f3a45e1396d937f8680","other":"d3b0dea1dd3ac71e7e4a30941632eec53cb980aa7cb6cdac95042a5400a878c3","up":true},{"one":"5db08436c64f4cc9e2b3950e35bc8ad739825e3efa67a642c771d95b34cb420c","other":"58ed74695bf527bac9a350c86d305e53e08c4999795e11cd3b2a36f5cd25d637","up":true},{"one":"314a3530a5e0c37d5609149b3ae9c2e078573346bd8fce3c769ebaeb31726ec1","other":"19faaf891eb6a716902ec29d201dc2094ee474acff188ae86faf9760674b2d37","up":true},{"one":"582330d8b8c49331b2aec790dc7325b9cd483fc8129323d31ec429d545042964","other":"5efb3bfc199f5408f79bd6bd5171b4bf332c68a8e49242eb4f6a589b963565c6","up":true},{"one":"19faaf891eb6a716902ec29d201dc2094ee474acff188ae86faf9760674b2d37","other":"2abb938b889a2eb735134462985a56056be48f189b5b89d23b653864c76427f4","up":true},{"one":"0fc59bd04ac9de3195e3c9d0eb573952a5805dd2e7e572078b6e996778adec73","other":"82dd83838cb982b89505ef249d353a20e434346dd78b71cd9b809f71d5c112da","up":true},{"one":"f5b24a1fd2cd2908b408562f9a265ee1a692b137e770137afa5fdfa07b237221","other":"39d1fcae2d23c775214988251505c577b9ac7b6851558ddf9a437dfe143f3845","up":true},{"one":"610334a0772d3414652b575f2caa6f2db32224907c24d06fda643db9f2ec2afe","other":"21012a3a6ef1ece48fd9d7cffe62dc75839dd062efcf3ac5f962c237814da407","up":true},{"one":"7125e05bf1bfe6df948c9276b62bc755fc6b0ec8d4ac7724b61ea49591adcf25","other":"5efb3bfc199f5408f79bd6bd5171b4bf332c68a8e49242eb4f6a589b963565c6","up":true},{"one":"165f1af67aa1d24569e0bdff61d29b3c39e93250071d8f25b5be6face209ac6a","other":"03285e06657032778feff0b43828c964dbf9de669f63171aeb587aa1a1facc0a","up":true},{"one":"13d6cb9316e289923e2d1de7f3c966d0cbabce3acdb8017122944f4abb140912","other":"2f32d54f06989efb6ca5431b74cd759fba05dbef36ecff8fd506e662026af983","up":true},{"one":"db6a1f6b342f6be9517f8df01003797c11c837d9aee3cdba5b7859230b36c35d","other":"e027a9f7152641c4a41154f8ce4dafd23895c312150efea86bf4152c88d0ca86","up":true},{"one":"aeb4c75a57ccfc9ac053a3d363cf7c1e3e201406587769ab6615d5c2f86a5410","other":"a46dd535e3bc8f111a8b2ce5594b62e87741c395e8a2b8fbae33edd29cb8caf8","up":true},{"one":"90765b72283f59be4cf9bf7a9e9a22fd6db701c3603cbc0817b4adf2f8e9ce08","other":"9fa0215e980dc907df4cc47ab4937f36527d78f9837493016fd4fc51e617299c","up":true},{"one":"7920d69cf7e458fce0781ea1a4e07768e1a69f6818090eff0abf0b4a0c2c35f8","other":"4e5a46c004e85cf86a02fdfbf2243018825d015debfb9a077a1283d302293b3a","up":true},{"one":"4d59cf1aeecf370e94a7a231887450cef97053b9c88a7fd11e210840af070e29","other":"534bcaa98cf9192b35b6014c650ae067e74332c015ebb516d63601427d7376b8","up":true},{"one":"67dcfd21ece30b41a39bc55c0986fca8f401bb3acba821969519f09d0933e8bd","other":"44a10530c376b215baff8531eeb2afb8d6714c4d0350d1a6f32761a97cd6c7ec","up":true},{"one":"49eaad68d23dd63ef26029fa3f4e2578f3deca8708bbc838750d8b6dbe9eaa38","other":"f5b24a1fd2cd2908b408562f9a265ee1a692b137e770137afa5fdfa07b237221","up":true},{"one":"58ed74695bf527bac9a350c86d305e53e08c4999795e11cd3b2a36f5cd25d637","other":"6f5f5a77e6092e25e5308413e02ba62c1c559024893a7fb98e26b0f34fed8bfe","up":true},{"one":"f7baef876a62b92ebe5ca9ec6a085e0eb54fd31e2425e662eec747df3cd77592","other":"e5149cedd990072f2aaa9735a9259f28973c45876660c2d86ac105e56cca8e68","up":true},{"one":"fe316679eca0e0eb823325812a56fd27da02653b06ada2fd03b27501bda8371a","other":"ef1b70bf090bc9994b1d45e2812c56ecb430a89c346a436bd10880bcda700351","up":true},{"one":"3ec530761ddb87f930fda919be67df18074c6f0795292add1b2a91ff3d9c39e3","other":"21a044e772b7c955fe4a6fb7c3a9a20e95d48b7fd6b9518741782f04f5f1f5c2","up":true},{"one":"c43fbee95380007274b8f231fe34bcd59b5c0ef0830b174967d4702627984fc6","other":"0d8a919207fb2d5718eab7da95f8efeb01a4e1ae39602d315f8ba2ff1752d9da","up":true},{"one":"3efc4b120b3eeeac186bf3a4cd42eb8c647f7edb08c23ee643e2bec9d72c5bed","other":"314a3530a5e0c37d5609149b3ae9c2e078573346bd8fce3c769ebaeb31726ec1","up":true},{"one":"ba884e5cfa1ee6eb38217181711e01bb0c37b3e33d1424dfa89ed3e29ef6205b","other":"886aff1f1e3b86bfe901066bb7948451c18fe3f8cd1b7318b05154890ca8f738","up":true},{"one":"e775e9759d4701bd9b43c22f1d1be73c1262b2752bb23cb3857485daf1dcad2d","other":"e54b643cbc95d9f5d27ec3760d892b6802981bfabf4f9979267d66259df982c7","up":true},{"one":"51db114a52827f5b74088bd0fc87d35229e7740e7d121bd7699298396516a880","other":"6f5f5a77e6092e25e5308413e02ba62c1c559024893a7fb98e26b0f34fed8bfe","up":true},{"one":"b626d472b555e6f950a7142783db8deb443a74e63ef6bd72a87eaf1af14ca805","other":"b5b24532d2810e311e10b1d606baf6007f9124b88a178b32713cf1eddae089be","up":true},{"one":"c59e3953b64e5b9ffbe53990a358914f2fa8e3551d33f92b9e3a441bd1baf2cd","other":"88fefb7506105c0e269baf52955a01b19f55504b13133bac0beab41c9f6e6942","up":true},{"one":"d640472351969a5578e541aca72b7640c583b995fd62607ff3ee3f3f3139aafd","other":"e5ada0415c92ef1511b15d04edf395976464afd9adc3e929c41d4d21d25e3182","up":true},{"one":"41d9c03e44bec3f84a6139ce40ef1e390530f38ed11860575acfad03a49db095","other":"4d59cf1aeecf370e94a7a231887450cef97053b9c88a7fd11e210840af070e29","up":true},{"one":"455936fd22c43794e6e2104fd91d3f5d246e3823e8ff8eaf8dc27aa9f3d2ee08","other":"7e0458ecdf7081443cab5412529f3948ece659facaca03208496c80dd136e704","up":true},{"one":"e7fa7112adc7b023dd5965e620277122542153f87eaf5deeacc8a51f1778ba77","other":"e8830f2b2f7d08df15bd33f4b2841d01d9d62c1621234bd6ae86743e52360f3e","up":true},{"one":"17db15893bf39b42593ee1de975aba6832046d9da5b4b493ec44272738a29cef","other":"7e0458ecdf7081443cab5412529f3948ece659facaca03208496c80dd136e704","up":true},{"one":"67aa5463e4b32b363b3d01d2a41ccb03199411057276f4962d053160be29a6ef","other":"02d85b9f8e4776224ae5088683a87837b82b2bfb7e047cf373a28393e7aca6e1","up":true},{"one":"f528aaafd67b20dafdce101db224aa01c70f93bdc91c14f50fa8db1dbf9fc386","other":"e54784cfbcd89c37c8f758aae70ece3ab4b7f8c30fb4ef7543e04aa89ff4386b","up":true},{"one":"738c2d42458965d03c8f9f055eaf0e3edf3dfa2a4de0a048ec05b78e7b765c90","other":"4bcf4eb531d5ec4b31d99e8354af03f976524c7858a1e7043e9b7055326f0952","up":true},{"one":"849bcbb9be43b799fefc5e689efc75125da27f536e97e5b7921031520ae6e5d8","other":"9fa0215e980dc907df4cc47ab4937f36527d78f9837493016fd4fc51e617299c","up":true},{"one":"b2b5ba1bb188f18f79b295f2c0d48c52c1d1d449ecb9b94b9984f3a6179732c7","other":"d1d719ce1dca507598449afe966396c160ad25ad632112ab268b1d913b490dbd","up":true},{"one":"06618d829a8a7317a98f1a40ecf8864e1c94c4e270a9e4c008229dc7cf937b7e","other":"045ba8da4641da3f0b8058bb0d9d8aafbb81496dc1cae2a3fd9c039a7e1cafb6","up":true},{"one":"0438f567045d4556a0e7a697028d689ecfd0ae20f9e85c09b48d9f1fd0ee4765","other":"1a2a0e0bbf83cd40936995674418ae469aa2b92876a4ceeabd8128f536b7d7a2","up":true},{"one":"d3b0dea1dd3ac71e7e4a30941632eec53cb980aa7cb6cdac95042a5400a878c3","other":"e8548b5df15adf0f2a997ff5709827beb5e1d36bb08a2f2d017746d5c0e83fca","up":true},{"one":"af02b5d107b3a17f539c7f9020ebe74322434634e70c420a7f56776eb5d9db73","other":"21a044e772b7c955fe4a6fb7c3a9a20e95d48b7fd6b9518741782f04f5f1f5c2","up":true},{"one":"88a141c607019477c7b120a506285a7218cad2faa038082e0b9ddfcc9cb78d07","other":"90a85cb7363ede161ec21cc89f8b9d4350e566cf10586a66d31b0a8677620aa1","up":true},{"one":"46fee69dad8b6a6a87d356d10db25d835a0c4e154bf179e88fb4cc65f97d72d7","other":"1b830ed484b274a96ec7ba2f9a42b6859412b5334a564014ff3f11597ea3a32d","up":true},{"one":"24b85c10f098725938ea7d87cd24a4b10358129906fca9790fc266ea8784b538","other":"8025c1fcb98e53f92767d1d43a3057a0acd1e8994bb4a7e3f5e244110e0dcf91","up":true},{"one":"3630e05326bacea8fcc739dec42085f845f416ddc698c76ff91f099eb1dc5007","other":"0af9a57a2f66835cd3e4e71bc026013a8a99ca337a7b6b6cc34e11d8da212a4f","up":true},{"one":"6fe9a02e950a5c3a5ff026b75922ed687d59795ba8eb9c092a8d09a5c64d2453","other":"140020a23a840b8840ba0c2c384f853a606330e9743885e9967cf49533db282e","up":true},{"one":"21012a3a6ef1ece48fd9d7cffe62dc75839dd062efcf3ac5f962c237814da407","other":"30897492824b19540d13ef17c70845be6dde455dca4e4f84cfca14a2c373969f","up":true},{"one":"fbc8087a723c564ca0139329902e79748af46699ea7be24d57909a7e8e96f681","other":"90765b72283f59be4cf9bf7a9e9a22fd6db701c3603cbc0817b4adf2f8e9ce08","up":true},{"one":"32371744163f0b3aefd3955dc4877e7eb82b17ef9541c333ca9c0a9f8aec3045","other":"14dfb8414d17b2df15eaf59571a8cfec99b1fd674561da63ee99af853bda07da","up":true},{"one":"b65ee2549536a806ceef4a7ccc9544567cafe6204080929fc847df0a3781ccc9","other":"f629b8b9e79c75ac559daf9bf4fc8672bfdd595cf2c5d17a8885282626fc65a5","up":true},{"one":"53087084708cc5ee63ac459b18fa10ae52a823139b4ecba6c8691d4934f2f971","other":"3f946957d910179c7e1a83c44369aacfc31f5727b1a6421a01c8a978ccd349a2","up":true},{"one":"4ac755123dcc64ef44db9280311af51f3f7a93e0dee67370d673261220356eb9","other":"1b830ed484b274a96ec7ba2f9a42b6859412b5334a564014ff3f11597ea3a32d","up":true},{"one":"499036eb9d10fc003c903f09ea0ee00c0d27b39564988d67ae111f3473d22f07","other":"605a46991af15cd60e67413c712b99ff8f21173c96a7990f2728ad6cac2bb9d8","up":true},{"one":"886aff1f1e3b86bfe901066bb7948451c18fe3f8cd1b7318b05154890ca8f738","other":"fe316679eca0e0eb823325812a56fd27da02653b06ada2fd03b27501bda8371a","up":true},{"one":"20aeb14f567dd16f06b0d3b589b83283daa00a5ed10e447860bda946baccdd2d","other":"5f00b3bebef2f5484ff1386298add68a6743a106200ae8a13a27dbb52714ee8f","up":true},{"one":"4c9eab8ab45405a6d4bab46430efc04b8e6aec1d944f88435eca41361925f379","other":"6c4dcdfdee0164a9a3f419430726dd51f9198c65ff6e7de7aaa6f632dcde6794","up":true},{"one":"7b90e939ae2a240f0d74a923afb6bbf11f6d5b99a7bf85f1825b1ea36bce744c","other":"53a885968d68d8ebf7ed514e662cc13fa03186d2361000a03576531fdca2a25f","up":true},{"one":"e027a9f7152641c4a41154f8ce4dafd23895c312150efea86bf4152c88d0ca86","other":"fe2167fd33f383110eb3f6caa7bd905ca54fa0c810f1b8a34483a846f3cbddab","up":true},{"one":"29957e8e92925a8c79bdf513295d96bfb62fbfc597ee1cf767c7ef408f1b1295","other":"21012a3a6ef1ece48fd9d7cffe62dc75839dd062efcf3ac5f962c237814da407","up":true},{"one":"c786ff8667f509b5a9519984c1d95c83a5d2e257500a71429e8f23af610ce771","other":"d640472351969a5578e541aca72b7640c583b995fd62607ff3ee3f3f3139aafd","up":true},{"one":"a6fbe16b81d240ff2f2ed6c93cfd9590731dfb2e7ec3fce1c098fe542bedf299","other":"d29941d6b8acd86cf32fd1c2181da3ab1da3c2083134b068ca49ce29aa86b783","up":true},{"one":"4636f00be60a9b494a3ebc9ab41cc7cb53ec0b0beff214db2d0a248dc3aeb6af","other":"67aa5463e4b32b363b3d01d2a41ccb03199411057276f4962d053160be29a6ef","up":true},{"one":"0c64e5af869b1665fd4016ae6d04c8eedd423636f06d78ecb944ee8e3272a82a","other":"898d2f7d46b4961b646d5a6142d54d6233b7f80f668ce234522dd02e2cc545cb","up":true},{"one":"959fda0866d3c18e9399e98485d627044079d6f86b075edaea9315402f5d9395","other":"915d7a0510bad19266eef8f00ca0cb2efc340253775706495fca8b9160b512cc","up":true},{"one":"41092c852fac630df2a9ca0862716f8e9fb8566c904a49c96389071046bc699d","other":"0af9a57a2f66835cd3e4e71bc026013a8a99ca337a7b6b6cc34e11d8da212a4f","up":true},{"one":"07a8c900fec6c477580ed5b38848a8681dc52a19e59fa4cd32f571fe7fb2383a","other":"0de3915b0bcc68040c8aa76fbd2cfa0714e9b34c9dbe0838a7cba81c4f73581c","up":true},{"one":"0de3915b0bcc68040c8aa76fbd2cfa0714e9b34c9dbe0838a7cba81c4f73581c","other":"256e81c5a6fb43bd343345477f8f96aa1947f07ac3297f631ab03f060147b062","up":true},{"one":"ed2d3e1e5693b44494808907c98ec54d6d08331945d2a2c03e31130fef1d2586","other":"378e7af7cc019186d4f2699e753e2d71302f8f3565572c13b7a1b1c5cb47443c","up":true},{"one":"a653302730df3d58f796906a93933aa81494f2588d9485ab7676ec3b0ccbb426","other":"f2d5533eed4b0c184952d859d67e44abe5a75a5de6111c8c106b8f4b2d8ccfc4","up":true},{"one":"f27f1044777e05f3f60165d0d2fc3e7667fe148e0ca7a097805d60b9f61025f7","other":"f773b83f1a1de2ab6660edb0b765cfccec6778061ee25c5a84f968625686ef60","up":true},{"one":"6ecb5c36fc0150c287446ae8a8682d629a1d39341230717206219babe3bdf659","other":"5f00b3bebef2f5484ff1386298add68a6743a106200ae8a13a27dbb52714ee8f","up":true},{"one":"f7fa2986ec9f84822b11a6b00bd03a1dd26f2a0fab90b1b308f08caead43cfe1","other":"f2d5533eed4b0c184952d859d67e44abe5a75a5de6111c8c106b8f4b2d8ccfc4","up":true},{"one":"0e5e0bb1383b2ec569b157a1d2ae6900592ab892a28367f5613a4e29cb265088","other":"90a85cb7363ede161ec21cc89f8b9d4350e566cf10586a66d31b0a8677620aa1","up":true},{"one":"45584a4bebb948ef5f7b55d4846ec5549d7623682169c0edcab5b3523e68c7da","other":"4a8b610e09d35aa21c42ab8c3e38de600a944c094e6b86ea56828b5e6904f1f7","up":true},{"one":"11d43f6ed0ddd5afa5c8a7abf7c62a4fa865b7a25ee295bf1a49701ef3081363","other":"499036eb9d10fc003c903f09ea0ee00c0d27b39564988d67ae111f3473d22f07","up":true},{"one":"0a005eb9c10c5cc9f720cfec2a655811d391671597b4f32d12df291ec76b2c13","other":"33737df75bbac1b41c63f05ea2cf1523b972df17f22bda026db84a49ac35e1e3","up":true},{"one":"4a8b610e09d35aa21c42ab8c3e38de600a944c094e6b86ea56828b5e6904f1f7","other":"7b90e939ae2a240f0d74a923afb6bbf11f6d5b99a7bf85f1825b1ea36bce744c","up":true},{"one":"ee5e77df690329c132f2f7fca223cfd384b7bc34ec38763a4eb42780e0585656","other":"d1d719ce1dca507598449afe966396c160ad25ad632112ab268b1d913b490dbd","up":true},{"one":"5db08436c64f4cc9e2b3950e35bc8ad739825e3efa67a642c771d95b34cb420c","other":"51db114a52827f5b74088bd0fc87d35229e7740e7d121bd7699298396516a880","up":true},{"one":"44a10530c376b215baff8531eeb2afb8d6714c4d0350d1a6f32761a97cd6c7ec","other":"d1d719ce1dca507598449afe966396c160ad25ad632112ab268b1d913b490dbd","up":true},{"one":"35e6b1d31f594c06b759525434a7e717ebe6f27ca0188f247ed1247664a50563","other":"ae2b3876bdbd6388781b65e31de182564c5d81f4511caf96588b1a287760b3dd","up":true},{"one":"53fe2c13926507a7a6c27d0fb30a2c358c4c7bfa40df8b5fa8ec8986c2450519","other":"628e7da3359ed6d9dcfbafc7581966e4e09245c321ec78ca75587c9cbb44697f","up":true},{"one":"8025c1fcb98e53f92767d1d43a3057a0acd1e8994bb4a7e3f5e244110e0dcf91","other":"96fcf14c7f90350091ac6fcb58306ccfb9e4a38d3da59f8ab656854332844cbd","up":true},{"one":"d1d719ce1dca507598449afe966396c160ad25ad632112ab268b1d913b490dbd","other":"db6a1f6b342f6be9517f8df01003797c11c837d9aee3cdba5b7859230b36c35d","up":true},{"one":"6f5f5a77e6092e25e5308413e02ba62c1c559024893a7fb98e26b0f34fed8bfe","other":"04518d7120fa8a528d983ca1ee6d5d09ba24a4e853fb22bc9084cdf34995e95f","up":true},{"one":"0cf596af91eb9b041fe6dbe6b288c5730413850321b5ab176c81447e34ef79c5","other":"30897492824b19540d13ef17c70845be6dde455dca4e4f84cfca14a2c373969f","up":true},{"one":"c441d27a5f4abaa8e3b0f040a6ef85bb8c970031d6a57503a674e36b3d6915d9","other":"b65ee2549536a806ceef4a7ccc9544567cafe6204080929fc847df0a3781ccc9","up":true},{"one":"3b78bc987c7c31c94e8ada9b4b11b5db9387fe70dd01ce7f3e976d3bec433dec","other":"499036eb9d10fc003c903f09ea0ee00c0d27b39564988d67ae111f3473d22f07","up":true},{"one":"154be9255e9aebd134a914070f5e6f3d4bba079d9ca738b74244db14e1b586dd","other":"fbf5e917be45e909697a9393c4778206333cf1dd9a103978e8d71622ca3b1cc8","up":true},{"one":"a46dd535e3bc8f111a8b2ce5594b62e87741c395e8a2b8fbae33edd29cb8caf8","other":"00c6488a842ece7a8b0daf064e405de03a4257d308840ea52bfd48d23f54d895","up":true},{"one":"d29941d6b8acd86cf32fd1c2181da3ab1da3c2083134b068ca49ce29aa86b783","other":"db6a1f6b342f6be9517f8df01003797c11c837d9aee3cdba5b7859230b36c35d","up":true},{"one":"33b5c521b4208e26414db2e05c9a8ccc001a524d928579d44d2e74d14a56593e","other":"3e8efcaf3002522b39065ea30c15426d1eb55916499eff8eb5a814e39d41853c","up":true},{"one":"cc2037c08942a094df12f45831f28e0015fc3ac04d5b8f24ffea9bf3a0b02c39","other":"e8548b5df15adf0f2a997ff5709827beb5e1d36bb08a2f2d017746d5c0e83fca","up":true},{"one":"02d85b9f8e4776224ae5088683a87837b82b2bfb7e047cf373a28393e7aca6e1","other":"b626d472b555e6f950a7142783db8deb443a74e63ef6bd72a87eaf1af14ca805","up":true},{"one":"738c2d42458965d03c8f9f055eaf0e3edf3dfa2a4de0a048ec05b78e7b765c90","other":"4c9eab8ab45405a6d4bab46430efc04b8e6aec1d944f88435eca41361925f379","up":true},{"one":"461cc9f064e6f4f06ff38e0d1f3f00ef8807ba31c7258e453cc682e9551bb1c6","other":"29957e8e92925a8c79bdf513295d96bfb62fbfc597ee1cf767c7ef408f1b1295","up":true},{"one":"2a0a8eaf1a2749e68f8b841578c160699cf7907ff23842c6d616ad884e5f613e","other":"5f00b3bebef2f5484ff1386298add68a6743a106200ae8a13a27dbb52714ee8f","up":true},{"one":"1f85b8c05e5dceff0bd8256f8f6d80d4b902a9754ceb952d95ea2e1150ef9e59","other":"0de3915b0bcc68040c8aa76fbd2cfa0714e9b34c9dbe0838a7cba81c4f73581c","up":true},{"one":"03285e06657032778feff0b43828c964dbf9de669f63171aeb587aa1a1facc0a","other":"0c28cd1315890629896d0fe5517524d4eb788f7444709c135ea690ba4e6103d5","up":true},{"one":"5b632eaf700d173ff15f4727b85817e6173228c304b422434a08c2cad438b825","other":"46fee69dad8b6a6a87d356d10db25d835a0c4e154bf179e88fb4cc65f97d72d7","up":true},{"one":"cc2037c08942a094df12f45831f28e0015fc3ac04d5b8f24ffea9bf3a0b02c39","other":"eb98fb45dd5754f24f9df0c9ecbb93932e3d9d7735cd6d0ddd4a8675bb4ef554","up":true},{"one":"16725e318322353befc2f2aba112f0984bc011821bb16c98e2cd8b39cd62aea1","other":"19faaf891eb6a716902ec29d201dc2094ee474acff188ae86faf9760674b2d37","up":true},{"one":"96fcf14c7f90350091ac6fcb58306ccfb9e4a38d3da59f8ab656854332844cbd","other":"c26fd5e6504c7b3f0a6d9133ff87c98c110eb1c201c5f3bcf6b10653f2b972d2","up":true},{"one":"b820e480354000c837b1781ec1c493e8776b4834252e6453425ac05b925b5a58","other":"af02b5d107b3a17f539c7f9020ebe74322434634e70c420a7f56776eb5d9db73","up":true},{"one":"217f9952af1eb58d5ca5ac7be763716cfe2c0a4f3cdd4ebe4b5df563f919e2d2","other":"f7fa2986ec9f84822b11a6b00bd03a1dd26f2a0fab90b1b308f08caead43cfe1","up":true},{"one":"bb90464f769a85549c150f861775aa67924c7c651f393f6c70772707376a5c7e","other":"88a141c607019477c7b120a506285a7218cad2faa038082e0b9ddfcc9cb78d07","up":true},{"one":"da67ace34f7076a1d550bc61bc2a31da88d6cd9f9df43b142a8c6bbade1b4aee","other":"d7aca8f2182bc625d2b3c942bd1161c85bcf1c2b34ecbe3e2fd23cfae6b8a871","up":true},{"one":"66e7fc2df51f5df8d7329851fe9357d895e9d5dfdc25f8d92bdb10a960f7e15a","other":"6c73150490e8be9677c40086de0aefed1939581048e26f4a93f5ca26571a1a8f","up":true},{"one":"9852ce267d53106a6e584d6eddb08e0062eb4a422d2a8d39ad6dccaebac552ff","other":"850575577d6b420a87aba388af481e0c044c2f75cf29ff934daf5674318a61ba","up":true},{"one":"ec52270604007673d1bfda1edbd8bfa945a21141efd85e42b684a9f30f8cddae","other":"9d0f804849b72397646ba48208ba1e01dcf4de04e788016c4a1a0c93e650ddf5","up":true},{"one":"9890e6ebb2c6f9a7bec4c2778e077e3710ce3af356f82ae9b4d324832d159ef7","other":"b2a563ac59bab4dfddf7b6e27b80ee7afdeb2e4295411107903f484bcf9fc4f2","up":true},{"one":"1436aaa8770e9f1c6294e49f4066c16b1caa50524e9b8fd058059e41657d2a83","other":"1c8a10ecbd72acb2bbbb8b77ea5404f9e90f4dbf306ec8134cfed70b40aef399","up":true},{"one":"1b830ed484b274a96ec7ba2f9a42b6859412b5334a564014ff3f11597ea3a32d","other":"37801e8d7d46143f78924ed66099f658a94d37edfd2f58d02acb85add03e1894","up":true},{"one":"1c8a10ecbd72acb2bbbb8b77ea5404f9e90f4dbf306ec8134cfed70b40aef399","other":"77d2ec52dabd5d7f326d4c6afd2aad110487c6bdffa2984060528716ba873462","up":true},{"one":"1f670c53b4c597beaffacd84e3a697225b04cded9219d0a28e1fe525a3cadcf5","other":"03ccd8d52597d18c0b178ab7361d847d63aad3af920a28345977ae170a1dafcd","up":true},{"one":"006727dc6f59b120b24c17b8e63f80ef3439105f8118ffeed408f105a48ee60c","other":"1e2aca93fa9442a0034ae8d295530dde16fcbfa8c37227e2e6863babb0f87c34","up":true},{"one":"5cd2377226825dc7ea582315cd108d23502df4e9c7c09fc07e7b4aa56440de29","other":"7dd3078c71087ab88d4d26a962820bcb79b8ce30e91c1f9a69d4bf8d38086960","up":true},{"one":"512ec5c2e6b4d788482462d941117c81fcc0e73f0c15545794dd1b4e03bf2102","other":"46fee69dad8b6a6a87d356d10db25d835a0c4e154bf179e88fb4cc65f97d72d7","up":true},{"one":"0b72054403f78a64a787f46e9f26bf0de7bbba5a60cb105e6aeea46cb4a1d9fe","other":"3630e05326bacea8fcc739dec42085f845f416ddc698c76ff91f099eb1dc5007","up":true},{"one":"1a2a0e0bbf83cd40936995674418ae469aa2b92876a4ceeabd8128f536b7d7a2","other":"21012a3a6ef1ece48fd9d7cffe62dc75839dd062efcf3ac5f962c237814da407","up":true},{"one":"e54784cfbcd89c37c8f758aae70ece3ab4b7f8c30fb4ef7543e04aa89ff4386b","other":"ca041da0dc514643d017458d08ff6962ec52c9e66571a239ec395dc8b2546709","up":true},{"one":"30bec7cd0a7d002839aed7654129bd2fe2e2ce7f42aa7bae1560e8bf718954c3","other":"37801e8d7d46143f78924ed66099f658a94d37edfd2f58d02acb85add03e1894","up":true},{"one":"4d103ec5afee559a5a9242e8d650b67301eaec10e96fc2f184e34d48554108a2","other":"3630e05326bacea8fcc739dec42085f845f416ddc698c76ff91f099eb1dc5007","up":true},{"one":"c620752a083ca1ff0398937235cf964133939452c293c799ce07ff8aa2bde420","other":"2c79af7ea85f96db7897cf8cdb4d002ad2308194e03981876edb8d904ef65137","up":true},{"one":"9890e6ebb2c6f9a7bec4c2778e077e3710ce3af356f82ae9b4d324832d159ef7","other":"b95d88ff6512ef8eaaa6bd842fa44175c1484fc2e8601b83d50a5ffa992bfa3a","up":true},{"one":"ba884e5cfa1ee6eb38217181711e01bb0c37b3e33d1424dfa89ed3e29ef6205b","other":"90a85cb7363ede161ec21cc89f8b9d4350e566cf10586a66d31b0a8677620aa1","up":true},{"one":"0743bcf2aaa77e916f4a367d6159473c7d80f46a2e4cbe9ef346e423d39d7072","other":"f629b8b9e79c75ac559daf9bf4fc8672bfdd595cf2c5d17a8885282626fc65a5","up":true},{"one":"ac4d2d6836e2cdf4c88221f6013aac70a451dd15bc403288bd10d0b911cd9a2b","other":"1f670c53b4c597beaffacd84e3a697225b04cded9219d0a28e1fe525a3cadcf5","up":true},{"one":"eb98fb45dd5754f24f9df0c9ecbb93932e3d9d7735cd6d0ddd4a8675bb4ef554","other":"c8986871e46f001d15ed8b70f2aa0fea8ae309d5e5671a500f619e3b348c8c15","up":true},{"one":"db6a1f6b342f6be9517f8df01003797c11c837d9aee3cdba5b7859230b36c35d","other":"f4e09f89287bd1af7833acd85ba7cc71fdb3ff34f2f409e1cf2a878dcd3183dc","up":true},{"one":"51db114a52827f5b74088bd0fc87d35229e7740e7d121bd7699298396516a880","other":"2a97d308a720274a440dfa6901ca0a5480af9bab58dd8a6c4afdb9c83ea964c3","up":true},{"one":"baddc778aea97acdbbb5bc99744a5545abab9f6047c81f328761645287ac391c","other":"ad9899f78659492ec248a884927a757f3f3b4e76cd2abc46ad8766251fd8afed","up":true},{"one":"1436aaa8770e9f1c6294e49f4066c16b1caa50524e9b8fd058059e41657d2a83","other":"7e0458ecdf7081443cab5412529f3948ece659facaca03208496c80dd136e704","up":true},{"one":"9d0f804849b72397646ba48208ba1e01dcf4de04e788016c4a1a0c93e650ddf5","other":"03ccd8d52597d18c0b178ab7361d847d63aad3af920a28345977ae170a1dafcd","up":true},{"one":"b626d472b555e6f950a7142783db8deb443a74e63ef6bd72a87eaf1af14ca805","other":"f2d5533eed4b0c184952d859d67e44abe5a75a5de6111c8c106b8f4b2d8ccfc4","up":true},{"one":"63370e288ab2e4b8403c6678e9c44ae5c7496b5ead614306fceb85986ed29d18","other":"6e05179dc90a8f6654d0c9a3f06173371dcfb18b852fdd77f35f75e38f273125","up":true},{"one":"6e05179dc90a8f6654d0c9a3f06173371dcfb18b852fdd77f35f75e38f273125","other":"47bfa3767cefcc0831d410d5402e9396e8a412c8c96faf55b451d3ff310f3b02","up":true},{"one":"d640472351969a5578e541aca72b7640c583b995fd62607ff3ee3f3f3139aafd","other":"e54784cfbcd89c37c8f758aae70ece3ab4b7f8c30fb4ef7543e04aa89ff4386b","up":true},{"one":"7290cd3affade5f9e729d1b03549aceafb2576cdbc6789fd688c95495f10bacd","other":"60d7337ef806be95ccaf7b9d663a4289f9afc68edced62904ab50601cf113f45","up":true},{"one":"5efb3bfc199f5408f79bd6bd5171b4bf332c68a8e49242eb4f6a589b963565c6","other":"7dd3078c71087ab88d4d26a962820bcb79b8ce30e91c1f9a69d4bf8d38086960","up":true},{"one":"f4565dd2c428c03d7a8d5fad87a6dd5f92ae706529eb6152d36fa584e7cdbe4d","other":"c620752a083ca1ff0398937235cf964133939452c293c799ce07ff8aa2bde420","up":true},{"one":"0ff2d2c49547eebc96675e0b88073dea5e9091bee1843ffe567127e34486c348","other":"a34ea2e87d4c12adb27d66c2c95300603ff50415974e000bbcc69a5ae059dbf1","up":true},{"one":"628e7da3359ed6d9dcfbafc7581966e4e09245c321ec78ca75587c9cbb44697f","other":"4d6b939fb67338c484948ab92b2ceea4d4b666d7e08773673cd7c8f83f495b89","up":true},{"one":"f7baef876a62b92ebe5ca9ec6a085e0eb54fd31e2425e662eec747df3cd77592","other":"ff36a8810dd44f6d1fa42aa91ff6206bcfb4c1ffbab0df73a181daece329e0e3","up":true},{"one":"c59e3953b64e5b9ffbe53990a358914f2fa8e3551d33f92b9e3a441bd1baf2cd","other":"b5b24532d2810e311e10b1d606baf6007f9124b88a178b32713cf1eddae089be","up":true},{"one":"4e5a46c004e85cf86a02fdfbf2243018825d015debfb9a077a1283d302293b3a","other":"49eaad68d23dd63ef26029fa3f4e2578f3deca8708bbc838750d8b6dbe9eaa38","up":true},{"one":"49cd1efed6a56a78af4ea4ab40813013e76c6a5fb9d2029ee02db5d80f5e41a6","other":"574f65867482091aee2774033116c233525eea711706b5ae9ba09b54e896d302","up":true},{"one":"33737df75bbac1b41c63f05ea2cf1523b972df17f22bda026db84a49ac35e1e3","other":"a3693801a91180410cf3e85d7c09ac8054a769e7b1d55c9e7a46850cb8217da0","up":true},{"one":"68317431e4fa55be4a700e35c6a578307cc32b72336679b5c5618b622ef0c602","other":"775e7be502df8fd938cf9c42ee4fac33e460a4b6992b9efeb8dc1ff7dde5c40f","up":true},{"one":"82f9c9009f09de2d6a77b54976d14c14211eae65d886f6ed57560c700716dd5c","other":"8025c1fcb98e53f92767d1d43a3057a0acd1e8994bb4a7e3f5e244110e0dcf91","up":true},{"one":"17db15893bf39b42593ee1de975aba6832046d9da5b4b493ec44272738a29cef","other":"77d2ec52dabd5d7f326d4c6afd2aad110487c6bdffa2984060528716ba873462","up":true},{"one":"9852ce267d53106a6e584d6eddb08e0062eb4a422d2a8d39ad6dccaebac552ff","other":"82dd83838cb982b89505ef249d353a20e434346dd78b71cd9b809f71d5c112da","up":true},{"one":"e5149cedd990072f2aaa9735a9259f28973c45876660c2d86ac105e56cca8e68","other":"ae2b3876bdbd6388781b65e31de182564c5d81f4511caf96588b1a287760b3dd","up":true},{"one":"f773b83f1a1de2ab6660edb0b765cfccec6778061ee25c5a84f968625686ef60","other":"e8830f2b2f7d08df15bd33f4b2841d01d9d62c1621234bd6ae86743e52360f3e","up":true},{"one":"0438f567045d4556a0e7a697028d689ecfd0ae20f9e85c09b48d9f1fd0ee4765","other":"03ccd8d52597d18c0b178ab7361d847d63aad3af920a28345977ae170a1dafcd","up":true},{"one":"30bec7cd0a7d002839aed7654129bd2fe2e2ce7f42aa7bae1560e8bf718954c3","other":"45584a4bebb948ef5f7b55d4846ec5549d7623682169c0edcab5b3523e68c7da","up":true},{"one":"21012a3a6ef1ece48fd9d7cffe62dc75839dd062efcf3ac5f962c237814da407","other":"5f00b3bebef2f5484ff1386298add68a6743a106200ae8a13a27dbb52714ee8f","up":true},{"one":"6251e9540448726a601699ef4cd19e50c969a746da27228967338cdc09d628bf","other":"628e7da3359ed6d9dcfbafc7581966e4e09245c321ec78ca75587c9cbb44697f","up":true},{"one":"a46dd535e3bc8f111a8b2ce5594b62e87741c395e8a2b8fbae33edd29cb8caf8","other":"fbc8087a723c564ca0139329902e79748af46699ea7be24d57909a7e8e96f681","up":true},{"one":"c9f5acafbbf8c66647de05b0848d79451eee490709d53f118fc2051410cc8203","other":"baddc778aea97acdbbb5bc99744a5545abab9f6047c81f328761645287ac391c","up":true},{"one":"fe316679eca0e0eb823325812a56fd27da02653b06ada2fd03b27501bda8371a","other":"ff36a8810dd44f6d1fa42aa91ff6206bcfb4c1ffbab0df73a181daece329e0e3","up":true},{"one":"67aa5463e4b32b363b3d01d2a41ccb03199411057276f4962d053160be29a6ef","other":"30bec7cd0a7d002839aed7654129bd2fe2e2ce7f42aa7bae1560e8bf718954c3","up":true},{"one":"3ec530761ddb87f930fda919be67df18074c6f0795292add1b2a91ff3d9c39e3","other":"2abb938b889a2eb735134462985a56056be48f189b5b89d23b653864c76427f4","up":true},{"one":"f528aaafd67b20dafdce101db224aa01c70f93bdc91c14f50fa8db1dbf9fc386","other":"e5ada0415c92ef1511b15d04edf395976464afd9adc3e929c41d4d21d25e3182","up":true},{"one":"efeae3b7f610dc10acc51068e7718876d147cd78a9a28788c5dba5bb3a6950dc","other":"b89793c3ccd9ea642080728732ce7df33778653fed3d1d8f3a25e60670e33325","up":true},{"one":"7dbbdeba3731e1ff43072f8cbd86db147761e1b61753eea7024774dbf46914bd","other":"6c73150490e8be9677c40086de0aefed1939581048e26f4a93f5ca26571a1a8f","up":true},{"one":"67dcfd21ece30b41a39bc55c0986fca8f401bb3acba821969519f09d0933e8bd","other":"7e0458ecdf7081443cab5412529f3948ece659facaca03208496c80dd136e704","up":true},{"one":"53a885968d68d8ebf7ed514e662cc13fa03186d2361000a03576531fdca2a25f","other":"37801e8d7d46143f78924ed66099f658a94d37edfd2f58d02acb85add03e1894","up":true},{"one":"6c73150490e8be9677c40086de0aefed1939581048e26f4a93f5ca26571a1a8f","other":"21a044e772b7c955fe4a6fb7c3a9a20e95d48b7fd6b9518741782f04f5f1f5c2","up":true},{"one":"e8efe8016fe6cf649b2755bee22da35ccc6c9c55d404d5385d61f6ea27b84380","other":"e5ada0415c92ef1511b15d04edf395976464afd9adc3e929c41d4d21d25e3182","up":true},{"one":"d3b0dea1dd3ac71e7e4a30941632eec53cb980aa7cb6cdac95042a5400a878c3","other":"e775e9759d4701bd9b43c22f1d1be73c1262b2752bb23cb3857485daf1dcad2d","up":true},{"one":"c49caff13862dc089f1f9b8180d6efa455648375662719272102c4f8028799d6","other":"4ac755123dcc64ef44db9280311af51f3f7a93e0dee67370d673261220356eb9","up":true},{"one":"46fee69dad8b6a6a87d356d10db25d835a0c4e154bf179e88fb4cc65f97d72d7","other":"6fe9a02e950a5c3a5ff026b75922ed687d59795ba8eb9c092a8d09a5c64d2453","up":true},{"one":"455936fd22c43794e6e2104fd91d3f5d246e3823e8ff8eaf8dc27aa9f3d2ee08","other":"738c2d42458965d03c8f9f055eaf0e3edf3dfa2a4de0a048ec05b78e7b765c90","up":true},{"one":"c26fd5e6504c7b3f0a6d9133ff87c98c110eb1c201c5f3bcf6b10653f2b972d2","other":"ca041da0dc514643d017458d08ff6962ec52c9e66571a239ec395dc8b2546709","up":true},{"one":"ca041da0dc514643d017458d08ff6962ec52c9e66571a239ec395dc8b2546709","other":"b5025d153581d333b44df4b9bfa69d87de138905172e4fd317e16f7099a5fcf8","up":true},{"one":"b5025d153581d333b44df4b9bfa69d87de138905172e4fd317e16f7099a5fcf8","other":"8025c1fcb98e53f92767d1d43a3057a0acd1e8994bb4a7e3f5e244110e0dcf91","up":true},{"one":"ef07be559914ec4b5930d90d8d8b6f32dab9eba23acc36f14d512307f9974348","other":"2a97d308a720274a440dfa6901ca0a5480af9bab58dd8a6c4afdb9c83ea964c3","up":true},{"one":"c43fbee95380007274b8f231fe34bcd59b5c0ef0830b174967d4702627984fc6","other":"140020a23a840b8840ba0c2c384f853a606330e9743885e9967cf49533db282e","up":true},{"one":"7b90e939ae2a240f0d74a923afb6bbf11f6d5b99a7bf85f1825b1ea36bce744c","other":"4ac755123dcc64ef44db9280311af51f3f7a93e0dee67370d673261220356eb9","up":true},{"one":"524db81b135af8dc309b942c082a7291dddb851866fc608753f937ee77015be0","other":"6c4dcdfdee0164a9a3f419430726dd51f9198c65ff6e7de7aaa6f632dcde6794","up":true},{"one":"41092c852fac630df2a9ca0862716f8e9fb8566c904a49c96389071046bc699d","other":"499036eb9d10fc003c903f09ea0ee00c0d27b39564988d67ae111f3473d22f07","up":true},{"one":"7a608d2cf9d1d9c5819dc1f9e88e5cb2852aadea01c40e047c2e184b62e7163c","other":"140020a23a840b8840ba0c2c384f853a606330e9743885e9967cf49533db282e","up":true},{"one":"478278187cd9af799e83340a2f49b0b7f122fb8e08c0a372a87795426eab364b","other":"5b632eaf700d173ff15f4727b85817e6173228c304b422434a08c2cad438b825","up":true},{"one":"c786ff8667f509b5a9519984c1d95c83a5d2e257500a71429e8f23af610ce771","other":"caf6a8e37fd41c1e6ad77a8575cd90354bb1693893952301c9caeb4779c338d3","up":true},{"one":"0cf596af91eb9b041fe6dbe6b288c5730413850321b5ab176c81447e34ef79c5","other":"03ccd8d52597d18c0b178ab7361d847d63aad3af920a28345977ae170a1dafcd","up":true},{"one":"caf6a8e37fd41c1e6ad77a8575cd90354bb1693893952301c9caeb4779c338d3","other":"e5ada0415c92ef1511b15d04edf395976464afd9adc3e929c41d4d21d25e3182","up":true},{"one":"179f21d2e0421b8056ee9a260bc0985bfa64a52a36d0a8fbce4e03f3120d1d65","other":"fbc8087a723c564ca0139329902e79748af46699ea7be24d57909a7e8e96f681","up":true},{"one":"0cf596af91eb9b041fe6dbe6b288c5730413850321b5ab176c81447e34ef79c5","other":"37801e8d7d46143f78924ed66099f658a94d37edfd2f58d02acb85add03e1894","up":true},{"one":"ec52270604007673d1bfda1edbd8bfa945a21141efd85e42b684a9f30f8cddae","other":"df1e4e46e8ec26cad74b4f35ab070f12c8f6fddca35ac44c1218ff60fe1e6bab","up":true},{"one":"3e8efcaf3002522b39065ea30c15426d1eb55916499eff8eb5a814e39d41853c","other":"21a044e772b7c955fe4a6fb7c3a9a20e95d48b7fd6b9518741782f04f5f1f5c2","up":true},{"one":"18f6e66e1cc8e620808901b571fdf525ee8f41850fac0bd0e5c5a4de70c5f873","other":"df1e4e46e8ec26cad74b4f35ab070f12c8f6fddca35ac44c1218ff60fe1e6bab","up":true},{"one":"e5d794d64003725a74642f097c0ee76706d78419b6f3ea819d440bc0ad166eac","other":"d863ba7405eb07ccddbf1d34efbcbec2867a93a109ed9413d9aecf30d3645a6a","up":true},{"one":"524db81b135af8dc309b942c082a7291dddb851866fc608753f937ee77015be0","other":"7dbbdeba3731e1ff43072f8cbd86db147761e1b61753eea7024774dbf46914bd","up":true},{"one":"7dc2a9573f253f362ef1b21bbfcc144b11a6febc58aa3c4430224160e9fa738c","other":"7dbbdeba3731e1ff43072f8cbd86db147761e1b61753eea7024774dbf46914bd","up":true},{"one":"af02b5d107b3a17f539c7f9020ebe74322434634e70c420a7f56776eb5d9db73","other":"314a3530a5e0c37d5609149b3ae9c2e078573346bd8fce3c769ebaeb31726ec1","up":true},{"one":"886aff1f1e3b86bfe901066bb7948451c18fe3f8cd1b7318b05154890ca8f738","other":"df1e4e46e8ec26cad74b4f35ab070f12c8f6fddca35ac44c1218ff60fe1e6bab","up":true},{"one":"4ac755123dcc64ef44db9280311af51f3f7a93e0dee67370d673261220356eb9","other":"140020a23a840b8840ba0c2c384f853a606330e9743885e9967cf49533db282e","up":true},{"one":"6c4dcdfdee0164a9a3f419430726dd51f9198c65ff6e7de7aaa6f632dcde6794","other":"574f65867482091aee2774033116c233525eea711706b5ae9ba09b54e896d302","up":true},{"one":"18f6e66e1cc8e620808901b571fdf525ee8f41850fac0bd0e5c5a4de70c5f873","other":"21012a3a6ef1ece48fd9d7cffe62dc75839dd062efcf3ac5f962c237814da407","up":true},{"one":"f2d5533eed4b0c184952d859d67e44abe5a75a5de6111c8c106b8f4b2d8ccfc4","other":"e5ada0415c92ef1511b15d04edf395976464afd9adc3e929c41d4d21d25e3182","up":true},{"one":"e54784cfbcd89c37c8f758aae70ece3ab4b7f8c30fb4ef7543e04aa89ff4386b","other":"c59e3953b64e5b9ffbe53990a358914f2fa8e3551d33f92b9e3a441bd1baf2cd","up":true},{"one":"9890e6ebb2c6f9a7bec4c2778e077e3710ce3af356f82ae9b4d324832d159ef7","other":"b89793c3ccd9ea642080728732ce7df33778653fed3d1d8f3a25e60670e33325","up":true},{"one":"2d3645c4fdf9a2809a909076b9ee5fb98fa880f6faeff914f1a2987af928cd79","other":"0c64e5af869b1665fd4016ae6d04c8eedd423636f06d78ecb944ee8e3272a82a","up":true},{"one":"efeae3b7f610dc10acc51068e7718876d147cd78a9a28788c5dba5bb3a6950dc","other":"e7fa7112adc7b023dd5965e620277122542153f87eaf5deeacc8a51f1778ba77","up":true},{"one":"461cc9f064e6f4f06ff38e0d1f3f00ef8807ba31c7258e453cc682e9551bb1c6","other":"4d103ec5afee559a5a9242e8d650b67301eaec10e96fc2f184e34d48554108a2","up":true},{"one":"d1d719ce1dca507598449afe966396c160ad25ad632112ab268b1d913b490dbd","other":"7e0458ecdf7081443cab5412529f3948ece659facaca03208496c80dd136e704","up":true},{"one":"51db114a52827f5b74088bd0fc87d35229e7740e7d121bd7699298396516a880","other":"610334a0772d3414652b575f2caa6f2db32224907c24d06fda643db9f2ec2afe","up":true},{"one":"a3693801a91180410cf3e85d7c09ac8054a769e7b1d55c9e7a46850cb8217da0","other":"f925c85e6457ac01f0cd6b297155f9d3ae611603890d8f3a45e1396d937f8680","up":true},{"one":"8f2182c2c2d0eeb2e887dbc350ae7257819f536032851ffdf29e7842cb1a62cc","other":"f5b24a1fd2cd2908b408562f9a265ee1a692b137e770137afa5fdfa07b237221","up":true},{"one":"33b5c521b4208e26414db2e05c9a8ccc001a524d928579d44d2e74d14a56593e","other":"314a3530a5e0c37d5609149b3ae9c2e078573346bd8fce3c769ebaeb31726ec1","up":true},{"one":"a653302730df3d58f796906a93933aa81494f2588d9485ab7676ec3b0ccbb426","other":"898d2f7d46b4961b646d5a6142d54d6233b7f80f668ce234522dd02e2cc545cb","up":true},{"one":"217f9952af1eb58d5ca5ac7be763716cfe2c0a4f3cdd4ebe4b5df563f919e2d2","other":"ec52270604007673d1bfda1edbd8bfa945a21141efd85e42b684a9f30f8cddae","up":true},{"one":"db6a1f6b342f6be9517f8df01003797c11c837d9aee3cdba5b7859230b36c35d","other":"e54784cfbcd89c37c8f758aae70ece3ab4b7f8c30fb4ef7543e04aa89ff4386b","up":true},{"one":"0a005eb9c10c5cc9f720cfec2a655811d391671597b4f32d12df291ec76b2c13","other":"0ff2d2c49547eebc96675e0b88073dea5e9091bee1843ffe567127e34486c348","up":true},{"one":"e8efe8016fe6cf649b2755bee22da35ccc6c9c55d404d5385d61f6ea27b84380","other":"f2d5533eed4b0c184952d859d67e44abe5a75a5de6111c8c106b8f4b2d8ccfc4","up":true},{"one":"67dcfd21ece30b41a39bc55c0986fca8f401bb3acba821969519f09d0933e8bd","other":"66e7fc2df51f5df8d7329851fe9357d895e9d5dfdc25f8d92bdb10a960f7e15a","up":true},{"one":"45584a4bebb948ef5f7b55d4846ec5549d7623682169c0edcab5b3523e68c7da","other":"46fee69dad8b6a6a87d356d10db25d835a0c4e154bf179e88fb4cc65f97d72d7","up":true},{"one":"da67ace34f7076a1d550bc61bc2a31da88d6cd9f9df43b142a8c6bbade1b4aee","other":"d640472351969a5578e541aca72b7640c583b995fd62607ff3ee3f3f3139aafd","up":true},{"one":"ca041da0dc514643d017458d08ff6962ec52c9e66571a239ec395dc8b2546709","other":"976e57d0c32227222bfd0cbb802f269bdcd52d5d33cf689c66b12c023f5fa8bf","up":true},{"one":"53fe2c13926507a7a6c27d0fb30a2c358c4c7bfa40df8b5fa8ec8986c2450519","other":"41d9c03e44bec3f84a6139ce40ef1e390530f38ed11860575acfad03a49db095","up":true},{"one":"6c73150490e8be9677c40086de0aefed1939581048e26f4a93f5ca26571a1a8f","other":"7125e05bf1bfe6df948c9276b62bc755fc6b0ec8d4ac7724b61ea49591adcf25","up":true},{"one":"4ac755123dcc64ef44db9280311af51f3f7a93e0dee67370d673261220356eb9","other":"49cd1efed6a56a78af4ea4ab40813013e76c6a5fb9d2029ee02db5d80f5e41a6","up":true},{"one":"512ec5c2e6b4d788482462d941117c81fcc0e73f0c15545794dd1b4e03bf2102","other":"45584a4bebb948ef5f7b55d4846ec5549d7623682169c0edcab5b3523e68c7da","up":true},{"one":"1c47ad5bd8846f777daf59587feccc308f4dc63f6d27b1385ff8085c75bb1aac","other":"0c64e5af869b1665fd4016ae6d04c8eedd423636f06d78ecb944ee8e3272a82a","up":true},{"one":"f4e09f89287bd1af7833acd85ba7cc71fdb3ff34f2f409e1cf2a878dcd3183dc","other":"a6fbe16b81d240ff2f2ed6c93cfd9590731dfb2e7ec3fce1c098fe542bedf299","up":true},{"one":"b7cafed41dac01dd59e2bcaeaaab551ebfeab8eaa1f97c1866fe0ddae772807b","other":"90a85cb7363ede161ec21cc89f8b9d4350e566cf10586a66d31b0a8677620aa1","up":true},{"one":"30897492824b19540d13ef17c70845be6dde455dca4e4f84cfca14a2c373969f","other":"e5d794d64003725a74642f097c0ee76706d78419b6f3ea819d440bc0ad166eac","up":true},{"one":"88fefb7506105c0e269baf52955a01b19f55504b13133bac0beab41c9f6e6942","other":"baf219e9229921b773d1ad7eb7eb5216cfa60ccecaa3c5c487e3b71cb600ba12","up":true},{"one":"2abb938b889a2eb735134462985a56056be48f189b5b89d23b653864c76427f4","other":"06618d829a8a7317a98f1a40ecf8864e1c94c4e270a9e4c008229dc7cf937b7e","up":true},{"one":"49cd1efed6a56a78af4ea4ab40813013e76c6a5fb9d2029ee02db5d80f5e41a6","other":"53a885968d68d8ebf7ed514e662cc13fa03186d2361000a03576531fdca2a25f","up":true},{"one":"7a608d2cf9d1d9c5819dc1f9e88e5cb2852aadea01c40e047c2e184b62e7163c","other":"0d8a919207fb2d5718eab7da95f8efeb01a4e1ae39602d315f8ba2ff1752d9da","up":true},{"one":"68317431e4fa55be4a700e35c6a578307cc32b72336679b5c5618b622ef0c602","other":"738c2d42458965d03c8f9f055eaf0e3edf3dfa2a4de0a048ec05b78e7b765c90","up":true},{"one":"c8986871e46f001d15ed8b70f2aa0fea8ae309d5e5671a500f619e3b348c8c15","other":"c1f9e8e1d509febdf1f267bb227741e513420048a2e669ac9eef4b05a29cf10b","up":true},{"one":"524db81b135af8dc309b942c082a7291dddb851866fc608753f937ee77015be0","other":"19faaf891eb6a716902ec29d201dc2094ee474acff188ae86faf9760674b2d37","up":true},{"one":"9890e6ebb2c6f9a7bec4c2778e077e3710ce3af356f82ae9b4d324832d159ef7","other":"fbc8087a723c564ca0139329902e79748af46699ea7be24d57909a7e8e96f681","up":true},{"one":"628e7da3359ed6d9dcfbafc7581966e4e09245c321ec78ca75587c9cbb44697f","other":"775e7be502df8fd938cf9c42ee4fac33e460a4b6992b9efeb8dc1ff7dde5c40f","up":true},{"one":"6e05179dc90a8f6654d0c9a3f06173371dcfb18b852fdd77f35f75e38f273125","other":"7a608d2cf9d1d9c5819dc1f9e88e5cb2852aadea01c40e047c2e184b62e7163c","up":true},{"one":"f4e09f89287bd1af7833acd85ba7cc71fdb3ff34f2f409e1cf2a878dcd3183dc","other":"b5025d153581d333b44df4b9bfa69d87de138905172e4fd317e16f7099a5fcf8","up":true},{"one":"605a46991af15cd60e67413c712b99ff8f21173c96a7990f2728ad6cac2bb9d8","other":"7920d69cf7e458fce0781ea1a4e07768e1a69f6818090eff0abf0b4a0c2c35f8","up":true},{"one":"898d2f7d46b4961b646d5a6142d54d6233b7f80f668ce234522dd02e2cc545cb","other":"df1e4e46e8ec26cad74b4f35ab070f12c8f6fddca35ac44c1218ff60fe1e6bab","up":true},{"one":"b65ee2549536a806ceef4a7ccc9544567cafe6204080929fc847df0a3781ccc9","other":"df1e4e46e8ec26cad74b4f35ab070f12c8f6fddca35ac44c1218ff60fe1e6bab","up":true},{"one":"6e68ea86440706a0d73a9508f2247492543163f8fa7e2dc2aa62b74d50261b8b","other":"628e7da3359ed6d9dcfbafc7581966e4e09245c321ec78ca75587c9cbb44697f","up":true},{"one":"f925c85e6457ac01f0cd6b297155f9d3ae611603890d8f3a45e1396d937f8680","other":"d887070a0568282c69e96ce65612ba72d5ea26b5c80671435d6e1ed2c4b49301","up":true},{"one":"f925c85e6457ac01f0cd6b297155f9d3ae611603890d8f3a45e1396d937f8680","other":"c620752a083ca1ff0398937235cf964133939452c293c799ce07ff8aa2bde420","up":true},{"one":"b02b01a5c37cb05c287a3dc7d04e305de26f8d62dc388542eeb43e97db7b4282","other":"b820e480354000c837b1781ec1c493e8776b4834252e6453425ac05b925b5a58","up":true},{"one":"b626d472b555e6f950a7142783db8deb443a74e63ef6bd72a87eaf1af14ca805","other":"915d7a0510bad19266eef8f00ca0cb2efc340253775706495fca8b9160b512cc","up":true},{"one":"976e57d0c32227222bfd0cbb802f269bdcd52d5d33cf689c66b12c023f5fa8bf","other":"b2b5ba1bb188f18f79b295f2c0d48c52c1d1d449ecb9b94b9984f3a6179732c7","up":true},{"one":"baf219e9229921b773d1ad7eb7eb5216cfa60ccecaa3c5c487e3b71cb600ba12","other":"ec52270604007673d1bfda1edbd8bfa945a21141efd85e42b684a9f30f8cddae","up":true},{"one":"fe316679eca0e0eb823325812a56fd27da02653b06ada2fd03b27501bda8371a","other":"04518d7120fa8a528d983ca1ee6d5d09ba24a4e853fb22bc9084cdf34995e95f","up":true},{"one":"f2d5533eed4b0c184952d859d67e44abe5a75a5de6111c8c106b8f4b2d8ccfc4","other":"f629b8b9e79c75ac559daf9bf4fc8672bfdd595cf2c5d17a8885282626fc65a5","up":true},{"one":"53087084708cc5ee63ac459b18fa10ae52a823139b4ecba6c8691d4934f2f971","other":"41092c852fac630df2a9ca0862716f8e9fb8566c904a49c96389071046bc699d","up":true},{"one":"775e7be502df8fd938cf9c42ee4fac33e460a4b6992b9efeb8dc1ff7dde5c40f","other":"7e0458ecdf7081443cab5412529f3948ece659facaca03208496c80dd136e704","up":true},{"one":"b2b5ba1bb188f18f79b295f2c0d48c52c1d1d449ecb9b94b9984f3a6179732c7","other":"a6fbe16b81d240ff2f2ed6c93cfd9590731dfb2e7ec3fce1c098fe542bedf299","up":true},{"one":"c786ff8667f509b5a9519984c1d95c83a5d2e257500a71429e8f23af610ce771","other":"ca041da0dc514643d017458d08ff6962ec52c9e66571a239ec395dc8b2546709","up":true},{"one":"77d2ec52dabd5d7f326d4c6afd2aad110487c6bdffa2984060528716ba873462","other":"4a8b610e09d35aa21c42ab8c3e38de600a944c094e6b86ea56828b5e6904f1f7","up":true},{"one":"886aff1f1e3b86bfe901066bb7948451c18fe3f8cd1b7318b05154890ca8f738","other":"898d2f7d46b4961b646d5a6142d54d6233b7f80f668ce234522dd02e2cc545cb","up":true},{"one":"976e57d0c32227222bfd0cbb802f269bdcd52d5d33cf689c66b12c023f5fa8bf","other":"b626d472b555e6f950a7142783db8deb443a74e63ef6bd72a87eaf1af14ca805","up":true},{"one":"738c2d42458965d03c8f9f055eaf0e3edf3dfa2a4de0a048ec05b78e7b765c90","other":"44a10530c376b215baff8531eeb2afb8d6714c4d0350d1a6f32761a97cd6c7ec","up":true},{"one":"49eaad68d23dd63ef26029fa3f4e2578f3deca8708bbc838750d8b6dbe9eaa38","other":"7125e05bf1bfe6df948c9276b62bc755fc6b0ec8d4ac7724b61ea49591adcf25","up":true},{"one":"bcc6724e54f761361f85147eb102a8d1a1a38810a940ce76b1e361ddcadacaa3","other":"88a141c607019477c7b120a506285a7218cad2faa038082e0b9ddfcc9cb78d07","up":true},{"one":"1c9caf028df31681b1457a54d4b3ab20009f9fa5bd12417a1ba7efe0c660e6bd","other":"00c6488a842ece7a8b0daf064e405de03a4257d308840ea52bfd48d23f54d895","up":true},{"one":"850575577d6b420a87aba388af481e0c044c2f75cf29ff934daf5674318a61ba","other":"a34ea2e87d4c12adb27d66c2c95300603ff50415974e000bbcc69a5ae059dbf1","up":true},{"one":"0d8a919207fb2d5718eab7da95f8efeb01a4e1ae39602d315f8ba2ff1752d9da","other":"574f65867482091aee2774033116c233525eea711706b5ae9ba09b54e896d302","up":true},{"one":"e027a9f7152641c4a41154f8ce4dafd23895c312150efea86bf4152c88d0ca86","other":"e7fa7112adc7b023dd5965e620277122542153f87eaf5deeacc8a51f1778ba77","up":true},{"one":"bcc6724e54f761361f85147eb102a8d1a1a38810a940ce76b1e361ddcadacaa3","other":"90a85cb7363ede161ec21cc89f8b9d4350e566cf10586a66d31b0a8677620aa1","up":true},{"one":"849bcbb9be43b799fefc5e689efc75125da27f536e97e5b7921031520ae6e5d8","other":"96fcf14c7f90350091ac6fcb58306ccfb9e4a38d3da59f8ab656854332844cbd","up":true},{"one":"c441d27a5f4abaa8e3b0f040a6ef85bb8c970031d6a57503a674e36b3d6915d9","other":"d863ba7405eb07ccddbf1d34efbcbec2867a93a109ed9413d9aecf30d3645a6a","up":true},{"one":"512ec5c2e6b4d788482462d941117c81fcc0e73f0c15545794dd1b4e03bf2102","other":"53a885968d68d8ebf7ed514e662cc13fa03186d2361000a03576531fdca2a25f","up":true},{"one":"c59e3953b64e5b9ffbe53990a358914f2fa8e3551d33f92b9e3a441bd1baf2cd","other":"ca041da0dc514643d017458d08ff6962ec52c9e66571a239ec395dc8b2546709","up":true},{"one":"1f670c53b4c597beaffacd84e3a697225b04cded9219d0a28e1fe525a3cadcf5","other":"0743bcf2aaa77e916f4a367d6159473c7d80f46a2e4cbe9ef346e423d39d7072","up":true},{"one":"b5b24532d2810e311e10b1d606baf6007f9124b88a178b32713cf1eddae089be","other":"baf219e9229921b773d1ad7eb7eb5216cfa60ccecaa3c5c487e3b71cb600ba12","up":true},{"one":"9d0f804849b72397646ba48208ba1e01dcf4de04e788016c4a1a0c93e650ddf5","other":"ac4d2d6836e2cdf4c88221f6013aac70a451dd15bc403288bd10d0b911cd9a2b","up":true},{"one":"c441d27a5f4abaa8e3b0f040a6ef85bb8c970031d6a57503a674e36b3d6915d9","other":"caf6a8e37fd41c1e6ad77a8575cd90354bb1693893952301c9caeb4779c338d3","up":true},{"one":"17db15893bf39b42593ee1de975aba6832046d9da5b4b493ec44272738a29cef","other":"256e81c5a6fb43bd343345477f8f96aa1947f07ac3297f631ab03f060147b062","up":true},{"one":"66e7fc2df51f5df8d7329851fe9357d895e9d5dfdc25f8d92bdb10a960f7e15a","other":"41d9c03e44bec3f84a6139ce40ef1e390530f38ed11860575acfad03a49db095","up":true},{"one":"c49caff13862dc089f1f9b8180d6efa455648375662719272102c4f8028799d6","other":"e5ada0415c92ef1511b15d04edf395976464afd9adc3e929c41d4d21d25e3182","up":true},{"one":"c9f5acafbbf8c66647de05b0848d79451eee490709d53f118fc2051410cc8203","other":"ef1b70bf090bc9994b1d45e2812c56ecb430a89c346a436bd10880bcda700351","up":true},{"one":"b820e480354000c837b1781ec1c493e8776b4834252e6453425ac05b925b5a58","other":"b911b8e2d72532b7c66ff5f7bffa70f5ddbeea6903a86f9333399f0c4b5f0fe8","up":true},{"one":"154be9255e9aebd134a914070f5e6f3d4bba079d9ca738b74244db14e1b586dd","other":"165f1af67aa1d24569e0bdff61d29b3c39e93250071d8f25b5be6face209ac6a","up":true},{"one":"5db08436c64f4cc9e2b3950e35bc8ad739825e3efa67a642c771d95b34cb420c","other":"610334a0772d3414652b575f2caa6f2db32224907c24d06fda643db9f2ec2afe","up":true},{"one":"11d43f6ed0ddd5afa5c8a7abf7c62a4fa865b7a25ee295bf1a49701ef3081363","other":"49eaad68d23dd63ef26029fa3f4e2578f3deca8708bbc838750d8b6dbe9eaa38","up":true},{"one":"46fee69dad8b6a6a87d356d10db25d835a0c4e154bf179e88fb4cc65f97d72d7","other":"7a608d2cf9d1d9c5819dc1f9e88e5cb2852aadea01c40e047c2e184b62e7163c","up":true},{"one":"7125e05bf1bfe6df948c9276b62bc755fc6b0ec8d4ac7724b61ea49591adcf25","other":"4646fe4c119078738612b44a356089b3c73a08e11cfd910675d211ae6b20b8fd","up":true},{"one":"f5b24a1fd2cd2908b408562f9a265ee1a692b137e770137afa5fdfa07b237221","other":"c620752a083ca1ff0398937235cf964133939452c293c799ce07ff8aa2bde420","up":true},{"one":"f5b24a1fd2cd2908b408562f9a265ee1a692b137e770137afa5fdfa07b237221","other":"d3b0dea1dd3ac71e7e4a30941632eec53cb980aa7cb6cdac95042a5400a878c3","up":true},{"one":"c441d27a5f4abaa8e3b0f040a6ef85bb8c970031d6a57503a674e36b3d6915d9","other":"d640472351969a5578e541aca72b7640c583b995fd62607ff3ee3f3f3139aafd","up":true},{"one":"3630e05326bacea8fcc739dec42085f845f416ddc698c76ff91f099eb1dc5007","other":"0a005eb9c10c5cc9f720cfec2a655811d391671597b4f32d12df291ec76b2c13","up":true},{"one":"bb90464f769a85549c150f861775aa67924c7c651f393f6c70772707376a5c7e","other":"90a85cb7363ede161ec21cc89f8b9d4350e566cf10586a66d31b0a8677620aa1","up":true},{"one":"006727dc6f59b120b24c17b8e63f80ef3439105f8118ffeed408f105a48ee60c","other":"17040a3aad5930d8e0de1011fd2996b7d09225989f0dc1ae8f7e7a52dd26ab4e","up":true},{"one":"82f9c9009f09de2d6a77b54976d14c14211eae65d886f6ed57560c700716dd5c","other":"b2b5ba1bb188f18f79b295f2c0d48c52c1d1d449ecb9b94b9984f3a6179732c7","up":true},{"one":"e5149cedd990072f2aaa9735a9259f28973c45876660c2d86ac105e56cca8e68","other":"a3693801a91180410cf3e85d7c09ac8054a769e7b1d55c9e7a46850cb8217da0","up":true},{"one":"baddc778aea97acdbbb5bc99744a5545abab9f6047c81f328761645287ac391c","other":"90a85cb7363ede161ec21cc89f8b9d4350e566cf10586a66d31b0a8677620aa1","up":true},{"one":"6f5f5a77e6092e25e5308413e02ba62c1c559024893a7fb98e26b0f34fed8bfe","other":"610334a0772d3414652b575f2caa6f2db32224907c24d06fda643db9f2ec2afe","up":true},{"one":"5cd2377226825dc7ea582315cd108d23502df4e9c7c09fc07e7b4aa56440de29","other":"6e68ea86440706a0d73a9508f2247492543163f8fa7e2dc2aa62b74d50261b8b","up":true},{"one":"13d6cb9316e289923e2d1de7f3c966d0cbabce3acdb8017122944f4abb140912","other":"165f1af67aa1d24569e0bdff61d29b3c39e93250071d8f25b5be6face209ac6a","up":true},{"one":"f773b83f1a1de2ab6660edb0b765cfccec6778061ee25c5a84f968625686ef60","other":"f4565dd2c428c03d7a8d5fad87a6dd5f92ae706529eb6152d36fa584e7cdbe4d","up":true},{"one":"b5b24532d2810e311e10b1d606baf6007f9124b88a178b32713cf1eddae089be","other":"d7aca8f2182bc625d2b3c942bd1161c85bcf1c2b34ecbe3e2fd23cfae6b8a871","up":true},{"one":"7125e05bf1bfe6df948c9276b62bc755fc6b0ec8d4ac7724b61ea49591adcf25","other":"82dd83838cb982b89505ef249d353a20e434346dd78b71cd9b809f71d5c112da","up":true},{"one":"b2b5ba1bb188f18f79b295f2c0d48c52c1d1d449ecb9b94b9984f3a6179732c7","other":"da67ace34f7076a1d550bc61bc2a31da88d6cd9f9df43b142a8c6bbade1b4aee","up":true},{"one":"006727dc6f59b120b24c17b8e63f80ef3439105f8118ffeed408f105a48ee60c","other":"18f6e66e1cc8e620808901b571fdf525ee8f41850fac0bd0e5c5a4de70c5f873","up":true},{"one":"5f00b3bebef2f5484ff1386298add68a6743a106200ae8a13a27dbb52714ee8f","other":"2d3645c4fdf9a2809a909076b9ee5fb98fa880f6faeff914f1a2987af928cd79","up":true},{"one":"7125e05bf1bfe6df948c9276b62bc755fc6b0ec8d4ac7724b61ea49591adcf25","other":"90765b72283f59be4cf9bf7a9e9a22fd6db701c3603cbc0817b4adf2f8e9ce08","up":true},{"one":"4c9eab8ab45405a6d4bab46430efc04b8e6aec1d944f88435eca41361925f379","other":"4bcf4eb531d5ec4b31d99e8354af03f976524c7858a1e7043e9b7055326f0952","up":true},{"one":"b65ee2549536a806ceef4a7ccc9544567cafe6204080929fc847df0a3781ccc9","other":"caf6a8e37fd41c1e6ad77a8575cd90354bb1693893952301c9caeb4779c338d3","up":true},{"one":"5cd2377226825dc7ea582315cd108d23502df4e9c7c09fc07e7b4aa56440de29","other":"582330d8b8c49331b2aec790dc7325b9cd483fc8129323d31ec429d545042964","up":true},{"one":"c26fd5e6504c7b3f0a6d9133ff87c98c110eb1c201c5f3bcf6b10653f2b972d2","other":"c6cf46239078edfb343c645f039725fdee1bbba8b0a6da02e2cc456b9223c9a2","up":true},{"one":"0743bcf2aaa77e916f4a367d6159473c7d80f46a2e4cbe9ef346e423d39d7072","other":"959fda0866d3c18e9399e98485d627044079d6f86b075edaea9315402f5d9395","up":true},{"one":"7a608d2cf9d1d9c5819dc1f9e88e5cb2852aadea01c40e047c2e184b62e7163c","other":"02d85b9f8e4776224ae5088683a87837b82b2bfb7e047cf373a28393e7aca6e1","up":true},{"one":"b5b24532d2810e311e10b1d606baf6007f9124b88a178b32713cf1eddae089be","other":"a653302730df3d58f796906a93933aa81494f2588d9485ab7676ec3b0ccbb426","up":true},{"one":"67aa5463e4b32b363b3d01d2a41ccb03199411057276f4962d053160be29a6ef","other":"256e81c5a6fb43bd343345477f8f96aa1947f07ac3297f631ab03f060147b062","up":true},{"one":"045ba8da4641da3f0b8058bb0d9d8aafbb81496dc1cae2a3fd9c039a7e1cafb6","other":"03285e06657032778feff0b43828c964dbf9de669f63171aeb587aa1a1facc0a","up":true},{"one":"9d0f804849b72397646ba48208ba1e01dcf4de04e788016c4a1a0c93e650ddf5","other":"ff36a8810dd44f6d1fa42aa91ff6206bcfb4c1ffbab0df73a181daece329e0e3","up":true},{"one":"f528aaafd67b20dafdce101db224aa01c70f93bdc91c14f50fa8db1dbf9fc386","other":"e8efe8016fe6cf649b2755bee22da35ccc6c9c55d404d5385d61f6ea27b84380","up":true},{"one":"8f2182c2c2d0eeb2e887dbc350ae7257819f536032851ffdf29e7842cb1a62cc","other":"35e6b1d31f594c06b759525434a7e717ebe6f27ca0188f247ed1247664a50563","up":true},{"one":"0fc59bd04ac9de3195e3c9d0eb573952a5805dd2e7e572078b6e996778adec73","other":"045ba8da4641da3f0b8058bb0d9d8aafbb81496dc1cae2a3fd9c039a7e1cafb6","up":true},{"one":"88fefb7506105c0e269baf52955a01b19f55504b13133bac0beab41c9f6e6942","other":"b65ee2549536a806ceef4a7ccc9544567cafe6204080929fc847df0a3781ccc9","up":true},{"one":"ee5e77df690329c132f2f7fca223cfd384b7bc34ec38763a4eb42780e0585656","other":"f45f1f2e59e947e04fa15bcf87f872ef6d73b73f778e12d1f9b8930ea166eefc","up":true},{"one":"1a2a0e0bbf83cd40936995674418ae469aa2b92876a4ceeabd8128f536b7d7a2","other":"1f670c53b4c597beaffacd84e3a697225b04cded9219d0a28e1fe525a3cadcf5","up":true},{"one":"53087084708cc5ee63ac459b18fa10ae52a823139b4ecba6c8691d4934f2f971","other":"6f5f5a77e6092e25e5308413e02ba62c1c559024893a7fb98e26b0f34fed8bfe","up":true},{"one":"d3b0dea1dd3ac71e7e4a30941632eec53cb980aa7cb6cdac95042a5400a878c3","other":"f4565dd2c428c03d7a8d5fad87a6dd5f92ae706529eb6152d36fa584e7cdbe4d","up":true},{"one":"2c3894b6e47cf19ac7ee9fe213196312f676256f670dff25b03563492550bc74","other":"1e2aca93fa9442a0034ae8d295530dde16fcbfa8c37227e2e6863babb0f87c34","up":true},{"one":"0fc59bd04ac9de3195e3c9d0eb573952a5805dd2e7e572078b6e996778adec73","other":"03285e06657032778feff0b43828c964dbf9de669f63171aeb587aa1a1facc0a","up":true},{"one":"103b232552b94090232195dc88f84823701f35ae536b5af6dd33fa655a33cbae","other":"39d1fcae2d23c775214988251505c577b9ac7b6851558ddf9a437dfe143f3845","up":true},{"one":"68317431e4fa55be4a700e35c6a578307cc32b72336679b5c5618b622ef0c602","other":"7dc2a9573f253f362ef1b21bbfcc144b11a6febc58aa3c4430224160e9fa738c","up":true},{"one":"6967e7438125c2045d575eb9f407b4a38d1bf9dcd1c1c1a97f750da6a21aeff7","other":"2abb938b889a2eb735134462985a56056be48f189b5b89d23b653864c76427f4","up":true},{"one":"9852ce267d53106a6e584d6eddb08e0062eb4a422d2a8d39ad6dccaebac552ff","other":"90765b72283f59be4cf9bf7a9e9a22fd6db701c3603cbc0817b4adf2f8e9ce08","up":true},{"one":"a46dd535e3bc8f111a8b2ce5594b62e87741c395e8a2b8fbae33edd29cb8caf8","other":"88a141c607019477c7b120a506285a7218cad2faa038082e0b9ddfcc9cb78d07","up":true},{"one":"ae2b3876bdbd6388781b65e31de182564c5d81f4511caf96588b1a287760b3dd","other":"f5b24a1fd2cd2908b408562f9a265ee1a692b137e770137afa5fdfa07b237221","up":true},{"one":"47bfa3767cefcc0831d410d5402e9396e8a412c8c96faf55b451d3ff310f3b02","other":"444722a15b01a0d8e6794798d239fe621d59bdfc08823ab47cbd8b9acebd23b4","up":true},{"one":"f4565dd2c428c03d7a8d5fad87a6dd5f92ae706529eb6152d36fa584e7cdbe4d","other":"f31cc744ea921fee8364c5269b1ce7ec6b5f0c0cbb6885efbf602de5b36f6169","up":true},{"one":"103b232552b94090232195dc88f84823701f35ae536b5af6dd33fa655a33cbae","other":"3b78bc987c7c31c94e8ada9b4b11b5db9387fe70dd01ce7f3e976d3bec433dec","up":true},{"one":"6967e7438125c2045d575eb9f407b4a38d1bf9dcd1c1c1a97f750da6a21aeff7","other":"21a044e772b7c955fe4a6fb7c3a9a20e95d48b7fd6b9518741782f04f5f1f5c2","up":true},{"one":"5efb3bfc199f5408f79bd6bd5171b4bf332c68a8e49242eb4f6a589b963565c6","other":"6e68ea86440706a0d73a9508f2247492543163f8fa7e2dc2aa62b74d50261b8b","up":true},{"one":"179f21d2e0421b8056ee9a260bc0985bfa64a52a36d0a8fbce4e03f3120d1d65","other":"daec45eca40f48843b41f70267c07e94996ced829f02710f15354fbe26e177e7","up":true},{"one":"6f5f5a77e6092e25e5308413e02ba62c1c559024893a7fb98e26b0f34fed8bfe","other":"6ecb5c36fc0150c287446ae8a8682d629a1d39341230717206219babe3bdf659","up":true},{"one":"f31cc744ea921fee8364c5269b1ce7ec6b5f0c0cbb6885efbf602de5b36f6169","other":"b95d88ff6512ef8eaaa6bd842fa44175c1484fc2e8601b83d50a5ffa992bfa3a","up":true},{"one":"f773b83f1a1de2ab6660edb0b765cfccec6778061ee25c5a84f968625686ef60","other":"b95d88ff6512ef8eaaa6bd842fa44175c1484fc2e8601b83d50a5ffa992bfa3a","up":true},{"one":"378e7af7cc019186d4f2699e753e2d71302f8f3565572c13b7a1b1c5cb47443c","other":"4636f00be60a9b494a3ebc9ab41cc7cb53ec0b0beff214db2d0a248dc3aeb6af","up":true},{"one":"90a85cb7363ede161ec21cc89f8b9d4350e566cf10586a66d31b0a8677620aa1","other":"ef1b70bf090bc9994b1d45e2812c56ecb430a89c346a436bd10880bcda700351","up":true},{"one":"24b85c10f098725938ea7d87cd24a4b10358129906fca9790fc266ea8784b538","other":"3b88a472beba4a18f8df45678888fd359bac3823900eecfe0037fdc9ad54d416","up":true},{"one":"fe2167fd33f383110eb3f6caa7bd905ca54fa0c810f1b8a34483a846f3cbddab","other":"da67ace34f7076a1d550bc61bc2a31da88d6cd9f9df43b142a8c6bbade1b4aee","up":true},{"one":"6fe9a02e950a5c3a5ff026b75922ed687d59795ba8eb9c092a8d09a5c64d2453","other":"60d7337ef806be95ccaf7b9d663a4289f9afc68edced62904ab50601cf113f45","up":true},{"one":"14dfb8414d17b2df15eaf59571a8cfec99b1fd674561da63ee99af853bda07da","other":"00c6488a842ece7a8b0daf064e405de03a4257d308840ea52bfd48d23f54d895","up":true},{"one":"16725e318322353befc2f2aba112f0984bc011821bb16c98e2cd8b39cd62aea1","other":"165f1af67aa1d24569e0bdff61d29b3c39e93250071d8f25b5be6face209ac6a","up":true},{"one":"ba884e5cfa1ee6eb38217181711e01bb0c37b3e33d1424dfa89ed3e29ef6205b","other":"a3693801a91180410cf3e85d7c09ac8054a769e7b1d55c9e7a46850cb8217da0","up":true},{"one":"0c28cd1315890629896d0fe5517524d4eb788f7444709c135ea690ba4e6103d5","other":"2abb938b889a2eb735134462985a56056be48f189b5b89d23b653864c76427f4","up":true},{"one":"2f32d54f06989efb6ca5431b74cd759fba05dbef36ecff8fd506e662026af983","other":"21a044e772b7c955fe4a6fb7c3a9a20e95d48b7fd6b9518741782f04f5f1f5c2","up":true},{"one":"6ea51fb6e4783f351dbbfa47b508c78c73233ebaada409dfb55446217f92c4bd","other":"6c4dcdfdee0164a9a3f419430726dd51f9198c65ff6e7de7aaa6f632dcde6794","up":true},{"one":"006727dc6f59b120b24c17b8e63f80ef3439105f8118ffeed408f105a48ee60c","other":"0e5e0bb1383b2ec569b157a1d2ae6900592ab892a28367f5613a4e29cb265088","up":true},{"one":"e5ada0415c92ef1511b15d04edf395976464afd9adc3e929c41d4d21d25e3182","other":"88fefb7506105c0e269baf52955a01b19f55504b13133bac0beab41c9f6e6942","up":true},{"one":"0ff2d2c49547eebc96675e0b88073dea5e9091bee1843ffe567127e34486c348","other":"06618d829a8a7317a98f1a40ecf8864e1c94c4e270a9e4c008229dc7cf937b7e","up":true},{"one":"17040a3aad5930d8e0de1011fd2996b7d09225989f0dc1ae8f7e7a52dd26ab4e","other":"30897492824b19540d13ef17c70845be6dde455dca4e4f84cfca14a2c373969f","up":true},{"one":"7290cd3affade5f9e729d1b03549aceafb2576cdbc6789fd688c95495f10bacd","other":"574f65867482091aee2774033116c233525eea711706b5ae9ba09b54e896d302","up":true},{"one":"6e05179dc90a8f6654d0c9a3f06173371dcfb18b852fdd77f35f75e38f273125","other":"6fe9a02e950a5c3a5ff026b75922ed687d59795ba8eb9c092a8d09a5c64d2453","up":true},{"one":"0c28cd1315890629896d0fe5517524d4eb788f7444709c135ea690ba4e6103d5","other":"21a044e772b7c955fe4a6fb7c3a9a20e95d48b7fd6b9518741782f04f5f1f5c2","up":true},{"one":"a3693801a91180410cf3e85d7c09ac8054a769e7b1d55c9e7a46850cb8217da0","other":"3f946957d910179c7e1a83c44369aacfc31f5727b1a6421a01c8a978ccd349a2","up":true},{"one":"6ea51fb6e4783f351dbbfa47b508c78c73233ebaada409dfb55446217f92c4bd","other":"7dbbdeba3731e1ff43072f8cbd86db147761e1b61753eea7024774dbf46914bd","up":true},{"one":"30897492824b19540d13ef17c70845be6dde455dca4e4f84cfca14a2c373969f","other":"37801e8d7d46143f78924ed66099f658a94d37edfd2f58d02acb85add03e1894","up":true},{"one":"41d9c03e44bec3f84a6139ce40ef1e390530f38ed11860575acfad03a49db095","other":"4d6b939fb67338c484948ab92b2ceea4d4b666d7e08773673cd7c8f83f495b89","up":true},{"one":"0ff2d2c49547eebc96675e0b88073dea5e9091bee1843ffe567127e34486c348","other":"154be9255e9aebd134a914070f5e6f3d4bba079d9ca738b74244db14e1b586dd","up":true},{"one":"6f5f5a77e6092e25e5308413e02ba62c1c559024893a7fb98e26b0f34fed8bfe","other":"2a97d308a720274a440dfa6901ca0a5480af9bab58dd8a6c4afdb9c83ea964c3","up":true},{"one":"4636f00be60a9b494a3ebc9ab41cc7cb53ec0b0beff214db2d0a248dc3aeb6af","other":"7e0458ecdf7081443cab5412529f3948ece659facaca03208496c80dd136e704","up":true},{"one":"1c8a10ecbd72acb2bbbb8b77ea5404f9e90f4dbf306ec8134cfed70b40aef399","other":"3b88a472beba4a18f8df45678888fd359bac3823900eecfe0037fdc9ad54d416","up":true},{"one":"d29941d6b8acd86cf32fd1c2181da3ab1da3c2083134b068ca49ce29aa86b783","other":"da67ace34f7076a1d550bc61bc2a31da88d6cd9f9df43b142a8c6bbade1b4aee","up":true},{"one":"1f670c53b4c597beaffacd84e3a697225b04cded9219d0a28e1fe525a3cadcf5","other":"0438f567045d4556a0e7a697028d689ecfd0ae20f9e85c09b48d9f1fd0ee4765","up":true},{"one":"41d9c03e44bec3f84a6139ce40ef1e390530f38ed11860575acfad03a49db095","other":"534bcaa98cf9192b35b6014c650ae067e74332c015ebb516d63601427d7376b8","up":true},{"one":"1a2a0e0bbf83cd40936995674418ae469aa2b92876a4ceeabd8128f536b7d7a2","other":"18f6e66e1cc8e620808901b571fdf525ee8f41850fac0bd0e5c5a4de70c5f873","up":true},{"one":"e5149cedd990072f2aaa9735a9259f28973c45876660c2d86ac105e56cca8e68","other":"c9f5acafbbf8c66647de05b0848d79451eee490709d53f118fc2051410cc8203","up":true},{"one":"3630e05326bacea8fcc739dec42085f845f416ddc698c76ff91f099eb1dc5007","other":"5efb3bfc199f5408f79bd6bd5171b4bf332c68a8e49242eb4f6a589b963565c6","up":true},{"one":"179f21d2e0421b8056ee9a260bc0985bfa64a52a36d0a8fbce4e03f3120d1d65","other":"1c9caf028df31681b1457a54d4b3ab20009f9fa5bd12417a1ba7efe0c660e6bd","up":true},{"one":"7dd3078c71087ab88d4d26a962820bcb79b8ce30e91c1f9a69d4bf8d38086960","other":"cc2037c08942a094df12f45831f28e0015fc3ac04d5b8f24ffea9bf3a0b02c39","up":true},{"one":"49eaad68d23dd63ef26029fa3f4e2578f3deca8708bbc838750d8b6dbe9eaa38","other":"39d1fcae2d23c775214988251505c577b9ac7b6851558ddf9a437dfe143f3845","up":true},{"one":"c1f9e8e1d509febdf1f267bb227741e513420048a2e669ac9eef4b05a29cf10b","other":"c6cf46239078edfb343c645f039725fdee1bbba8b0a6da02e2cc456b9223c9a2","up":true},{"one":"d7aca8f2182bc625d2b3c942bd1161c85bcf1c2b34ecbe3e2fd23cfae6b8a871","other":"caf6a8e37fd41c1e6ad77a8575cd90354bb1693893952301c9caeb4779c338d3","up":true},{"one":"4646fe4c119078738612b44a356089b3c73a08e11cfd910675d211ae6b20b8fd","other":"7dd3078c71087ab88d4d26a962820bcb79b8ce30e91c1f9a69d4bf8d38086960","up":true},{"one":"1e2aca93fa9442a0034ae8d295530dde16fcbfa8c37227e2e6863babb0f87c34","other":"11d43f6ed0ddd5afa5c8a7abf7c62a4fa865b7a25ee295bf1a49701ef3081363","up":true},{"one":"fbc8087a723c564ca0139329902e79748af46699ea7be24d57909a7e8e96f681","other":"9852ce267d53106a6e584d6eddb08e0062eb4a422d2a8d39ad6dccaebac552ff","up":true},{"one":"29957e8e92925a8c79bdf513295d96bfb62fbfc597ee1cf767c7ef408f1b1295","other":"35e6b1d31f594c06b759525434a7e717ebe6f27ca0188f247ed1247664a50563","up":true},{"one":"4636f00be60a9b494a3ebc9ab41cc7cb53ec0b0beff214db2d0a248dc3aeb6af","other":"68317431e4fa55be4a700e35c6a578307cc32b72336679b5c5618b622ef0c602","up":true},{"one":"e5d794d64003725a74642f097c0ee76706d78419b6f3ea819d440bc0ad166eac","other":"df1e4e46e8ec26cad74b4f35ab070f12c8f6fddca35ac44c1218ff60fe1e6bab","up":true},{"one":"44a10530c376b215baff8531eeb2afb8d6714c4d0350d1a6f32761a97cd6c7ec","other":"455936fd22c43794e6e2104fd91d3f5d246e3823e8ff8eaf8dc27aa9f3d2ee08","up":true},{"one":"14dfb8414d17b2df15eaf59571a8cfec99b1fd674561da63ee99af853bda07da","other":"1e2aca93fa9442a0034ae8d295530dde16fcbfa8c37227e2e6863babb0f87c34","up":true},{"one":"f629b8b9e79c75ac559daf9bf4fc8672bfdd595cf2c5d17a8885282626fc65a5","other":"ff36a8810dd44f6d1fa42aa91ff6206bcfb4c1ffbab0df73a181daece329e0e3","up":true},{"one":"0e5e0bb1383b2ec569b157a1d2ae6900592ab892a28367f5613a4e29cb265088","other":"0a005eb9c10c5cc9f720cfec2a655811d391671597b4f32d12df291ec76b2c13","up":true},{"one":"7920d69cf7e458fce0781ea1a4e07768e1a69f6818090eff0abf0b4a0c2c35f8","other":"66e7fc2df51f5df8d7329851fe9357d895e9d5dfdc25f8d92bdb10a960f7e15a","up":true},{"one":"7b90e939ae2a240f0d74a923afb6bbf11f6d5b99a7bf85f1825b1ea36bce744c","other":"574f65867482091aee2774033116c233525eea711706b5ae9ba09b54e896d302","up":true},{"one":"e027a9f7152641c4a41154f8ce4dafd23895c312150efea86bf4152c88d0ca86","other":"7e0458ecdf7081443cab5412529f3948ece659facaca03208496c80dd136e704","up":true},{"one":"1c8a10ecbd72acb2bbbb8b77ea5404f9e90f4dbf306ec8134cfed70b40aef399","other":"256e81c5a6fb43bd343345477f8f96aa1947f07ac3297f631ab03f060147b062","up":true},{"one":"8f2182c2c2d0eeb2e887dbc350ae7257819f536032851ffdf29e7842cb1a62cc","other":"f925c85e6457ac01f0cd6b297155f9d3ae611603890d8f3a45e1396d937f8680","up":true},{"one":"e7fa7112adc7b023dd5965e620277122542153f87eaf5deeacc8a51f1778ba77","other":"f31cc744ea921fee8364c5269b1ce7ec6b5f0c0cbb6885efbf602de5b36f6169","up":true},{"one":"628e7da3359ed6d9dcfbafc7581966e4e09245c321ec78ca75587c9cbb44697f","other":"738c2d42458965d03c8f9f055eaf0e3edf3dfa2a4de0a048ec05b78e7b765c90","up":true},{"one":"8025c1fcb98e53f92767d1d43a3057a0acd1e8994bb4a7e3f5e244110e0dcf91","other":"a6fbe16b81d240ff2f2ed6c93cfd9590731dfb2e7ec3fce1c098fe542bedf299","up":true},{"one":"c441d27a5f4abaa8e3b0f040a6ef85bb8c970031d6a57503a674e36b3d6915d9","other":"f7fa2986ec9f84822b11a6b00bd03a1dd26f2a0fab90b1b308f08caead43cfe1","up":true},{"one":"2c79af7ea85f96db7897cf8cdb4d002ad2308194e03981876edb8d904ef65137","other":"3e8efcaf3002522b39065ea30c15426d1eb55916499eff8eb5a814e39d41853c","up":true},{"one":"2c79af7ea85f96db7897cf8cdb4d002ad2308194e03981876edb8d904ef65137","other":"314a3530a5e0c37d5609149b3ae9c2e078573346bd8fce3c769ebaeb31726ec1","up":true},{"one":"58ed74695bf527bac9a350c86d305e53e08c4999795e11cd3b2a36f5cd25d637","other":"610334a0772d3414652b575f2caa6f2db32224907c24d06fda643db9f2ec2afe","up":true},{"one":"b89793c3ccd9ea642080728732ce7df33778653fed3d1d8f3a25e60670e33325","other":"9fa0215e980dc907df4cc47ab4937f36527d78f9837493016fd4fc51e617299c","up":true},{"one":"ad9899f78659492ec248a884927a757f3f3b4e76cd2abc46ad8766251fd8afed","other":"ba884e5cfa1ee6eb38217181711e01bb0c37b3e33d1424dfa89ed3e29ef6205b","up":true},{"one":"738c2d42458965d03c8f9f055eaf0e3edf3dfa2a4de0a048ec05b78e7b765c90","other":"7e0458ecdf7081443cab5412529f3948ece659facaca03208496c80dd136e704","up":true},{"one":"c620752a083ca1ff0398937235cf964133939452c293c799ce07ff8aa2bde420","other":"c1f9e8e1d509febdf1f267bb227741e513420048a2e669ac9eef4b05a29cf10b","up":true},{"one":"eb98fb45dd5754f24f9df0c9ecbb93932e3d9d7735cd6d0ddd4a8675bb4ef554","other":"e8830f2b2f7d08df15bd33f4b2841d01d9d62c1621234bd6ae86743e52360f3e","up":true},{"one":"7dc2a9573f253f362ef1b21bbfcc144b11a6febc58aa3c4430224160e9fa738c","other":"44a10530c376b215baff8531eeb2afb8d6714c4d0350d1a6f32761a97cd6c7ec","up":true},{"one":"0cf596af91eb9b041fe6dbe6b288c5730413850321b5ab176c81447e34ef79c5","other":"1a2a0e0bbf83cd40936995674418ae469aa2b92876a4ceeabd8128f536b7d7a2","up":true},{"one":"caf6a8e37fd41c1e6ad77a8575cd90354bb1693893952301c9caeb4779c338d3","other":"e54784cfbcd89c37c8f758aae70ece3ab4b7f8c30fb4ef7543e04aa89ff4386b","up":true},{"one":"ec52270604007673d1bfda1edbd8bfa945a21141efd85e42b684a9f30f8cddae","other":"915d7a0510bad19266eef8f00ca0cb2efc340253775706495fca8b9160b512cc","up":true},{"one":"c620752a083ca1ff0398937235cf964133939452c293c799ce07ff8aa2bde420","other":"d3b0dea1dd3ac71e7e4a30941632eec53cb980aa7cb6cdac95042a5400a878c3","up":true},{"one":"478278187cd9af799e83340a2f49b0b7f122fb8e08c0a372a87795426eab364b","other":"45584a4bebb948ef5f7b55d4846ec5549d7623682169c0edcab5b3523e68c7da","up":true},{"one":"f5dc78ff71a63fc2014b9553723ee676c63fc078a32a46b7cb172f357a118140","other":"f31cc744ea921fee8364c5269b1ce7ec6b5f0c0cbb6885efbf602de5b36f6169","up":true},{"one":"4bcf4eb531d5ec4b31d99e8354af03f976524c7858a1e7043e9b7055326f0952","other":"41d9c03e44bec3f84a6139ce40ef1e390530f38ed11860575acfad03a49db095","up":true},{"one":"18f6e66e1cc8e620808901b571fdf525ee8f41850fac0bd0e5c5a4de70c5f873","other":"1e2aca93fa9442a0034ae8d295530dde16fcbfa8c37227e2e6863babb0f87c34","up":true},{"one":"35e6b1d31f594c06b759525434a7e717ebe6f27ca0188f247ed1247664a50563","other":"2c3894b6e47cf19ac7ee9fe213196312f676256f670dff25b03563492550bc74","up":true},{"one":"3b78bc987c7c31c94e8ada9b4b11b5db9387fe70dd01ce7f3e976d3bec433dec","other":"5efb3bfc199f5408f79bd6bd5171b4bf332c68a8e49242eb4f6a589b963565c6","up":true},{"one":"ee5e77df690329c132f2f7fca223cfd384b7bc34ec38763a4eb42780e0585656","other":"c6cf46239078edfb343c645f039725fdee1bbba8b0a6da02e2cc456b9223c9a2","up":true},{"one":"6ecb5c36fc0150c287446ae8a8682d629a1d39341230717206219babe3bdf659","other":"5db08436c64f4cc9e2b3950e35bc8ad739825e3efa67a642c771d95b34cb420c","up":true},{"one":"fe2167fd33f383110eb3f6caa7bd905ca54fa0c810f1b8a34483a846f3cbddab","other":"d1d719ce1dca507598449afe966396c160ad25ad632112ab268b1d913b490dbd","up":true},{"one":"0c64e5af869b1665fd4016ae6d04c8eedd423636f06d78ecb944ee8e3272a82a","other":"0438f567045d4556a0e7a697028d689ecfd0ae20f9e85c09b48d9f1fd0ee4765","up":true},{"one":"e027a9f7152641c4a41154f8ce4dafd23895c312150efea86bf4152c88d0ca86","other":"f31cc744ea921fee8364c5269b1ce7ec6b5f0c0cbb6885efbf602de5b36f6169","up":true},{"one":"df1e4e46e8ec26cad74b4f35ab070f12c8f6fddca35ac44c1218ff60fe1e6bab","other":"c832b4ad64a17da4b796ffcac646c2aa666b276aabb7eb3bfe7981d64a4da402","up":true},{"one":"b911b8e2d72532b7c66ff5f7bffa70f5ddbeea6903a86f9333399f0c4b5f0fe8","other":"bb90464f769a85549c150f861775aa67924c7c651f393f6c70772707376a5c7e","up":true},{"one":"44a10530c376b215baff8531eeb2afb8d6714c4d0350d1a6f32761a97cd6c7ec","other":"574f65867482091aee2774033116c233525eea711706b5ae9ba09b54e896d302","up":true},{"one":"499036eb9d10fc003c903f09ea0ee00c0d27b39564988d67ae111f3473d22f07","other":"88a141c607019477c7b120a506285a7218cad2faa038082e0b9ddfcc9cb78d07","up":true},{"one":"aeb4c75a57ccfc9ac053a3d363cf7c1e3e201406587769ab6615d5c2f86a5410","other":"9852ce267d53106a6e584d6eddb08e0062eb4a422d2a8d39ad6dccaebac552ff","up":true},{"one":"ff36a8810dd44f6d1fa42aa91ff6206bcfb4c1ffbab0df73a181daece329e0e3","other":"f7fa2986ec9f84822b11a6b00bd03a1dd26f2a0fab90b1b308f08caead43cfe1","up":true},{"one":"03285e06657032778feff0b43828c964dbf9de669f63171aeb587aa1a1facc0a","other":"3b88a472beba4a18f8df45678888fd359bac3823900eecfe0037fdc9ad54d416","up":true},{"one":"0438f567045d4556a0e7a697028d689ecfd0ae20f9e85c09b48d9f1fd0ee4765","other":"0743bcf2aaa77e916f4a367d6159473c7d80f46a2e4cbe9ef346e423d39d7072","up":true},{"one":"44a10530c376b215baff8531eeb2afb8d6714c4d0350d1a6f32761a97cd6c7ec","other":"6f2d756566dd5b4a13ffeea9f687c785148f3407a502e28b9d6edfd03b905fdc","up":true},{"one":"0de3915b0bcc68040c8aa76fbd2cfa0714e9b34c9dbe0838a7cba81c4f73581c","other":"3b88a472beba4a18f8df45678888fd359bac3823900eecfe0037fdc9ad54d416","up":true},{"one":"2a97d308a720274a440dfa6901ca0a5480af9bab58dd8a6c4afdb9c83ea964c3","other":"32371744163f0b3aefd3955dc4877e7eb82b17ef9541c333ca9c0a9f8aec3045","up":true},{"one":"aeb4c75a57ccfc9ac053a3d363cf7c1e3e201406587769ab6615d5c2f86a5410","other":"90a85cb7363ede161ec21cc89f8b9d4350e566cf10586a66d31b0a8677620aa1","up":true},{"one":"66e7fc2df51f5df8d7329851fe9357d895e9d5dfdc25f8d92bdb10a960f7e15a","other":"6e68ea86440706a0d73a9508f2247492543163f8fa7e2dc2aa62b74d50261b8b","up":true},{"one":"499036eb9d10fc003c903f09ea0ee00c0d27b39564988d67ae111f3473d22f07","other":"7dd3078c71087ab88d4d26a962820bcb79b8ce30e91c1f9a69d4bf8d38086960","up":true},{"one":"ca041da0dc514643d017458d08ff6962ec52c9e66571a239ec395dc8b2546709","other":"b2b5ba1bb188f18f79b295f2c0d48c52c1d1d449ecb9b94b9984f3a6179732c7","up":true},{"one":"d640472351969a5578e541aca72b7640c583b995fd62607ff3ee3f3f3139aafd","other":"f629b8b9e79c75ac559daf9bf4fc8672bfdd595cf2c5d17a8885282626fc65a5","up":true},{"one":"1c47ad5bd8846f777daf59587feccc308f4dc63f6d27b1385ff8085c75bb1aac","other":"17040a3aad5930d8e0de1011fd2996b7d09225989f0dc1ae8f7e7a52dd26ab4e","up":true},{"one":"90765b72283f59be4cf9bf7a9e9a22fd6db701c3603cbc0817b4adf2f8e9ce08","other":"9890e6ebb2c6f9a7bec4c2778e077e3710ce3af356f82ae9b4d324832d159ef7","up":true},{"one":"a3693801a91180410cf3e85d7c09ac8054a769e7b1d55c9e7a46850cb8217da0","other":"ef1b70bf090bc9994b1d45e2812c56ecb430a89c346a436bd10880bcda700351","up":true},{"one":"7dc2a9573f253f362ef1b21bbfcc144b11a6febc58aa3c4430224160e9fa738c","other":"7e0458ecdf7081443cab5412529f3948ece659facaca03208496c80dd136e704","up":true},{"one":"461cc9f064e6f4f06ff38e0d1f3f00ef8807ba31c7258e453cc682e9551bb1c6","other":"41092c852fac630df2a9ca0862716f8e9fb8566c904a49c96389071046bc699d","up":true},{"one":"41092c852fac630df2a9ca0862716f8e9fb8566c904a49c96389071046bc699d","other":"5cd2377226825dc7ea582315cd108d23502df4e9c7c09fc07e7b4aa56440de29","up":true},{"one":"610334a0772d3414652b575f2caa6f2db32224907c24d06fda643db9f2ec2afe","other":"4d103ec5afee559a5a9242e8d650b67301eaec10e96fc2f184e34d48554108a2","up":true},{"one":"51db114a52827f5b74088bd0fc87d35229e7740e7d121bd7699298396516a880","other":"21012a3a6ef1ece48fd9d7cffe62dc75839dd062efcf3ac5f962c237814da407","up":true},{"one":"60d7337ef806be95ccaf7b9d663a4289f9afc68edced62904ab50601cf113f45","other":"512ec5c2e6b4d788482462d941117c81fcc0e73f0c15545794dd1b4e03bf2102","up":true},{"one":"4ac755123dcc64ef44db9280311af51f3f7a93e0dee67370d673261220356eb9","other":"4a8b610e09d35aa21c42ab8c3e38de600a944c094e6b86ea56828b5e6904f1f7","up":true},{"one":"67dcfd21ece30b41a39bc55c0986fca8f401bb3acba821969519f09d0933e8bd","other":"68317431e4fa55be4a700e35c6a578307cc32b72336679b5c5618b622ef0c602","up":true},{"one":"2c3894b6e47cf19ac7ee9fe213196312f676256f670dff25b03563492550bc74","other":"21012a3a6ef1ece48fd9d7cffe62dc75839dd062efcf3ac5f962c237814da407","up":true},{"one":"88a141c607019477c7b120a506285a7218cad2faa038082e0b9ddfcc9cb78d07","other":"f5b24a1fd2cd2908b408562f9a265ee1a692b137e770137afa5fdfa07b237221","up":true},{"one":"3f946957d910179c7e1a83c44369aacfc31f5727b1a6421a01c8a978ccd349a2","other":"39d1fcae2d23c775214988251505c577b9ac7b6851558ddf9a437dfe143f3845","up":true},{"one":"4646fe4c119078738612b44a356089b3c73a08e11cfd910675d211ae6b20b8fd","other":"6e68ea86440706a0d73a9508f2247492543163f8fa7e2dc2aa62b74d50261b8b","up":true},{"one":"f5dc78ff71a63fc2014b9553723ee676c63fc078a32a46b7cb172f357a118140","other":"fe2167fd33f383110eb3f6caa7bd905ca54fa0c810f1b8a34483a846f3cbddab","up":true},{"one":"f7fa2986ec9f84822b11a6b00bd03a1dd26f2a0fab90b1b308f08caead43cfe1","other":"d863ba7405eb07ccddbf1d34efbcbec2867a93a109ed9413d9aecf30d3645a6a","up":true},{"one":"959fda0866d3c18e9399e98485d627044079d6f86b075edaea9315402f5d9395","other":"9d0f804849b72397646ba48208ba1e01dcf4de04e788016c4a1a0c93e650ddf5","up":true},{"one":"37801e8d7d46143f78924ed66099f658a94d37edfd2f58d02acb85add03e1894","other":"02d85b9f8e4776224ae5088683a87837b82b2bfb7e047cf373a28393e7aca6e1","up":true},{"one":"455936fd22c43794e6e2104fd91d3f5d246e3823e8ff8eaf8dc27aa9f3d2ee08","other":"7dc2a9573f253f362ef1b21bbfcc144b11a6febc58aa3c4430224160e9fa738c","up":true},{"one":"07a8c900fec6c477580ed5b38848a8681dc52a19e59fa4cd32f571fe7fb2383a","other":"3b88a472beba4a18f8df45678888fd359bac3823900eecfe0037fdc9ad54d416","up":true},{"one":"bb90464f769a85549c150f861775aa67924c7c651f393f6c70772707376a5c7e","other":"a46dd535e3bc8f111a8b2ce5594b62e87741c395e8a2b8fbae33edd29cb8caf8","up":true},{"one":"f7baef876a62b92ebe5ca9ec6a085e0eb54fd31e2425e662eec747df3cd77592","other":"ef1b70bf090bc9994b1d45e2812c56ecb430a89c346a436bd10880bcda700351","up":true},{"one":"582330d8b8c49331b2aec790dc7325b9cd483fc8129323d31ec429d545042964","other":"4bcf4eb531d5ec4b31d99e8354af03f976524c7858a1e7043e9b7055326f0952","up":true},{"one":"2d3645c4fdf9a2809a909076b9ee5fb98fa880f6faeff914f1a2987af928cd79","other":"2a0a8eaf1a2749e68f8b841578c160699cf7907ff23842c6d616ad884e5f613e","up":true},{"one":"cc2037c08942a094df12f45831f28e0015fc3ac04d5b8f24ffea9bf3a0b02c39","other":"e8830f2b2f7d08df15bd33f4b2841d01d9d62c1621234bd6ae86743e52360f3e","up":true},{"one":"b7cafed41dac01dd59e2bcaeaaab551ebfeab8eaa1f97c1866fe0ddae772807b","other":"886aff1f1e3b86bfe901066bb7948451c18fe3f8cd1b7318b05154890ca8f738","up":true},{"one":"6251e9540448726a601699ef4cd19e50c969a746da27228967338cdc09d628bf","other":"d1d719ce1dca507598449afe966396c160ad25ad632112ab268b1d913b490dbd","up":true},{"one":"c43fbee95380007274b8f231fe34bcd59b5c0ef0830b174967d4702627984fc6","other":"ca041da0dc514643d017458d08ff6962ec52c9e66571a239ec395dc8b2546709","up":true},{"one":"53a885968d68d8ebf7ed514e662cc13fa03186d2361000a03576531fdca2a25f","other":"5b632eaf700d173ff15f4727b85817e6173228c304b422434a08c2cad438b825","up":true},{"one":"53fe2c13926507a7a6c27d0fb30a2c358c4c7bfa40df8b5fa8ec8986c2450519","other":"4646fe4c119078738612b44a356089b3c73a08e11cfd910675d211ae6b20b8fd","up":true},{"one":"4bcf4eb531d5ec4b31d99e8354af03f976524c7858a1e7043e9b7055326f0952","other":"4d59cf1aeecf370e94a7a231887450cef97053b9c88a7fd11e210840af070e29","up":true},{"one":"0b72054403f78a64a787f46e9f26bf0de7bbba5a60cb105e6aeea46cb4a1d9fe","other":"58ed74695bf527bac9a350c86d305e53e08c4999795e11cd3b2a36f5cd25d637","up":true},{"one":"51db114a52827f5b74088bd0fc87d35229e7740e7d121bd7699298396516a880","other":"4d103ec5afee559a5a9242e8d650b67301eaec10e96fc2f184e34d48554108a2","up":true},{"one":"b820e480354000c837b1781ec1c493e8776b4834252e6453425ac05b925b5a58","other":"a46dd535e3bc8f111a8b2ce5594b62e87741c395e8a2b8fbae33edd29cb8caf8","up":true},{"one":"ed2d3e1e5693b44494808907c98ec54d6d08331945d2a2c03e31130fef1d2586","other":"21a044e772b7c955fe4a6fb7c3a9a20e95d48b7fd6b9518741782f04f5f1f5c2","up":true},{"one":"a653302730df3d58f796906a93933aa81494f2588d9485ab7676ec3b0ccbb426","other":"915d7a0510bad19266eef8f00ca0cb2efc340253775706495fca8b9160b512cc","up":true},{"one":"0de3915b0bcc68040c8aa76fbd2cfa0714e9b34c9dbe0838a7cba81c4f73581c","other":"3ec530761ddb87f930fda919be67df18074c6f0795292add1b2a91ff3d9c39e3","up":true},{"one":"f925c85e6457ac01f0cd6b297155f9d3ae611603890d8f3a45e1396d937f8680","other":"eb98fb45dd5754f24f9df0c9ecbb93932e3d9d7735cd6d0ddd4a8675bb4ef554","up":true},{"one":"165f1af67aa1d24569e0bdff61d29b3c39e93250071d8f25b5be6face209ac6a","other":"045ba8da4641da3f0b8058bb0d9d8aafbb81496dc1cae2a3fd9c039a7e1cafb6","up":true},{"one":"7920d69cf7e458fce0781ea1a4e07768e1a69f6818090eff0abf0b4a0c2c35f8","other":"775e7be502df8fd938cf9c42ee4fac33e460a4b6992b9efeb8dc1ff7dde5c40f","up":true},{"one":"610334a0772d3414652b575f2caa6f2db32224907c24d06fda643db9f2ec2afe","other":"461cc9f064e6f4f06ff38e0d1f3f00ef8807ba31c7258e453cc682e9551bb1c6","up":true},{"one":"af02b5d107b3a17f539c7f9020ebe74322434634e70c420a7f56776eb5d9db73","other":"a6fbe16b81d240ff2f2ed6c93cfd9590731dfb2e7ec3fce1c098fe542bedf299","up":true},{"one":"3ec530761ddb87f930fda919be67df18074c6f0795292add1b2a91ff3d9c39e3","other":"314a3530a5e0c37d5609149b3ae9c2e078573346bd8fce3c769ebaeb31726ec1","up":true},{"one":"49cd1efed6a56a78af4ea4ab40813013e76c6a5fb9d2029ee02db5d80f5e41a6","other":"512ec5c2e6b4d788482462d941117c81fcc0e73f0c15545794dd1b4e03bf2102","up":true},{"one":"d1d719ce1dca507598449afe966396c160ad25ad632112ab268b1d913b490dbd","other":"f31cc744ea921fee8364c5269b1ce7ec6b5f0c0cbb6885efbf602de5b36f6169","up":true},{"one":"bcc6724e54f761361f85147eb102a8d1a1a38810a940ce76b1e361ddcadacaa3","other":"8f2182c2c2d0eeb2e887dbc350ae7257819f536032851ffdf29e7842cb1a62cc","up":true},{"one":"140020a23a840b8840ba0c2c384f853a606330e9743885e9967cf49533db282e","other":"24b85c10f098725938ea7d87cd24a4b10358129906fca9790fc266ea8784b538","up":true},{"one":"6f2d756566dd5b4a13ffeea9f687c785148f3407a502e28b9d6edfd03b905fdc","other":"67aa5463e4b32b363b3d01d2a41ccb03199411057276f4962d053160be29a6ef","up":true},{"one":"ef1b70bf090bc9994b1d45e2812c56ecb430a89c346a436bd10880bcda700351","other":"c832b4ad64a17da4b796ffcac646c2aa666b276aabb7eb3bfe7981d64a4da402","up":true},{"one":"4a8b610e09d35aa21c42ab8c3e38de600a944c094e6b86ea56828b5e6904f1f7","other":"574f65867482091aee2774033116c233525eea711706b5ae9ba09b54e896d302","up":true},{"one":"976e57d0c32227222bfd0cbb802f269bdcd52d5d33cf689c66b12c023f5fa8bf","other":"b5b24532d2810e311e10b1d606baf6007f9124b88a178b32713cf1eddae089be","up":true},{"one":"179f21d2e0421b8056ee9a260bc0985bfa64a52a36d0a8fbce4e03f3120d1d65","other":"3b88a472beba4a18f8df45678888fd359bac3823900eecfe0037fdc9ad54d416","up":true},{"one":"f27f1044777e05f3f60165d0d2fc3e7667fe148e0ca7a097805d60b9f61025f7","other":"f31cc744ea921fee8364c5269b1ce7ec6b5f0c0cbb6885efbf602de5b36f6169","up":true},{"one":"96fcf14c7f90350091ac6fcb58306ccfb9e4a38d3da59f8ab656854332844cbd","other":"b95d88ff6512ef8eaaa6bd842fa44175c1484fc2e8601b83d50a5ffa992bfa3a","up":true},{"one":"63370e288ab2e4b8403c6678e9c44ae5c7496b5ead614306fceb85986ed29d18","other":"6ecb5c36fc0150c287446ae8a8682d629a1d39341230717206219babe3bdf659","up":true},{"one":"f528aaafd67b20dafdce101db224aa01c70f93bdc91c14f50fa8db1dbf9fc386","other":"e027a9f7152641c4a41154f8ce4dafd23895c312150efea86bf4152c88d0ca86","up":true},{"one":"67aa5463e4b32b363b3d01d2a41ccb03199411057276f4962d053160be29a6ef","other":"6fe9a02e950a5c3a5ff026b75922ed687d59795ba8eb9c092a8d09a5c64d2453","up":true},{"one":"db6a1f6b342f6be9517f8df01003797c11c837d9aee3cdba5b7859230b36c35d","other":"d640472351969a5578e541aca72b7640c583b995fd62607ff3ee3f3f3139aafd","up":true},{"one":"c786ff8667f509b5a9519984c1d95c83a5d2e257500a71429e8f23af610ce771","other":"c441d27a5f4abaa8e3b0f040a6ef85bb8c970031d6a57503a674e36b3d6915d9","up":true},{"one":"e7fa7112adc7b023dd5965e620277122542153f87eaf5deeacc8a51f1778ba77","other":"ed2d3e1e5693b44494808907c98ec54d6d08331945d2a2c03e31130fef1d2586","up":true},{"one":"39d1fcae2d23c775214988251505c577b9ac7b6851558ddf9a437dfe143f3845","other":"5cd2377226825dc7ea582315cd108d23502df4e9c7c09fc07e7b4aa56440de29","up":true},{"one":"a46dd535e3bc8f111a8b2ce5594b62e87741c395e8a2b8fbae33edd29cb8caf8","other":"ae2b3876bdbd6388781b65e31de182564c5d81f4511caf96588b1a287760b3dd","up":true},{"one":"c9f5acafbbf8c66647de05b0848d79451eee490709d53f118fc2051410cc8203","other":"ff36a8810dd44f6d1fa42aa91ff6206bcfb4c1ffbab0df73a181daece329e0e3","up":true},{"one":"455936fd22c43794e6e2104fd91d3f5d246e3823e8ff8eaf8dc27aa9f3d2ee08","other":"524db81b135af8dc309b942c082a7291dddb851866fc608753f937ee77015be0","up":true},{"one":"47bfa3767cefcc0831d410d5402e9396e8a412c8c96faf55b451d3ff310f3b02","other":"46fee69dad8b6a6a87d356d10db25d835a0c4e154bf179e88fb4cc65f97d72d7","up":true},{"one":"886aff1f1e3b86bfe901066bb7948451c18fe3f8cd1b7318b05154890ca8f738","other":"90a85cb7363ede161ec21cc89f8b9d4350e566cf10586a66d31b0a8677620aa1","up":true},{"one":"88a141c607019477c7b120a506285a7218cad2faa038082e0b9ddfcc9cb78d07","other":"ef1b70bf090bc9994b1d45e2812c56ecb430a89c346a436bd10880bcda700351","up":true},{"one":"5b632eaf700d173ff15f4727b85817e6173228c304b422434a08c2cad438b825","other":"4a8b610e09d35aa21c42ab8c3e38de600a944c094e6b86ea56828b5e6904f1f7","up":true},{"one":"58ed74695bf527bac9a350c86d305e53e08c4999795e11cd3b2a36f5cd25d637","other":"41092c852fac630df2a9ca0862716f8e9fb8566c904a49c96389071046bc699d","up":true},{"one":"e5149cedd990072f2aaa9735a9259f28973c45876660c2d86ac105e56cca8e68","other":"c832b4ad64a17da4b796ffcac646c2aa666b276aabb7eb3bfe7981d64a4da402","up":true},{"one":"2a97d308a720274a440dfa6901ca0a5480af9bab58dd8a6c4afdb9c83ea964c3","other":"33737df75bbac1b41c63f05ea2cf1523b972df17f22bda026db84a49ac35e1e3","up":true},{"one":"4d59cf1aeecf370e94a7a231887450cef97053b9c88a7fd11e210840af070e29","other":"5cd2377226825dc7ea582315cd108d23502df4e9c7c09fc07e7b4aa56440de29","up":true},{"one":"0438f567045d4556a0e7a697028d689ecfd0ae20f9e85c09b48d9f1fd0ee4765","other":"30897492824b19540d13ef17c70845be6dde455dca4e4f84cfca14a2c373969f","up":true},{"one":"53087084708cc5ee63ac459b18fa10ae52a823139b4ecba6c8691d4934f2f971","other":"610334a0772d3414652b575f2caa6f2db32224907c24d06fda643db9f2ec2afe","up":true},{"one":"0b72054403f78a64a787f46e9f26bf0de7bbba5a60cb105e6aeea46cb4a1d9fe","other":"14dfb8414d17b2df15eaf59571a8cfec99b1fd674561da63ee99af853bda07da","up":true},{"one":"8f2182c2c2d0eeb2e887dbc350ae7257819f536032851ffdf29e7842cb1a62cc","other":"fbf5e917be45e909697a9393c4778206333cf1dd9a103978e8d71622ca3b1cc8","up":true},{"one":"53a885968d68d8ebf7ed514e662cc13fa03186d2361000a03576531fdca2a25f","other":"6e05179dc90a8f6654d0c9a3f06173371dcfb18b852fdd77f35f75e38f273125","up":true},{"one":"caf6a8e37fd41c1e6ad77a8575cd90354bb1693893952301c9caeb4779c338d3","other":"e5d794d64003725a74642f097c0ee76706d78419b6f3ea819d440bc0ad166eac","up":true},{"one":"f2d5533eed4b0c184952d859d67e44abe5a75a5de6111c8c106b8f4b2d8ccfc4","other":"d863ba7405eb07ccddbf1d34efbcbec2867a93a109ed9413d9aecf30d3645a6a","up":true},{"one":"d887070a0568282c69e96ce65612ba72d5ea26b5c80671435d6e1ed2c4b49301","other":"90a85cb7363ede161ec21cc89f8b9d4350e566cf10586a66d31b0a8677620aa1","up":true},{"one":"5b632eaf700d173ff15f4727b85817e6173228c304b422434a08c2cad438b825","other":"49cd1efed6a56a78af4ea4ab40813013e76c6a5fb9d2029ee02db5d80f5e41a6","up":true},{"one":"46fee69dad8b6a6a87d356d10db25d835a0c4e154bf179e88fb4cc65f97d72d7","other":"574f65867482091aee2774033116c233525eea711706b5ae9ba09b54e896d302","up":true},{"one":"959fda0866d3c18e9399e98485d627044079d6f86b075edaea9315402f5d9395","other":"88fefb7506105c0e269baf52955a01b19f55504b13133bac0beab41c9f6e6942","up":true},{"one":"ed2d3e1e5693b44494808907c98ec54d6d08331945d2a2c03e31130fef1d2586","other":"c1f9e8e1d509febdf1f267bb227741e513420048a2e669ac9eef4b05a29cf10b","up":true},{"one":"b65ee2549536a806ceef4a7ccc9544567cafe6204080929fc847df0a3781ccc9","other":"b5b24532d2810e311e10b1d606baf6007f9124b88a178b32713cf1eddae089be","up":true},{"one":"b5025d153581d333b44df4b9bfa69d87de138905172e4fd317e16f7099a5fcf8","other":"b626d472b555e6f950a7142783db8deb443a74e63ef6bd72a87eaf1af14ca805","up":true},{"one":"baf219e9229921b773d1ad7eb7eb5216cfa60ccecaa3c5c487e3b71cb600ba12","other":"a653302730df3d58f796906a93933aa81494f2588d9485ab7676ec3b0ccbb426","up":true},{"one":"5db08436c64f4cc9e2b3950e35bc8ad739825e3efa67a642c771d95b34cb420c","other":"63370e288ab2e4b8403c6678e9c44ae5c7496b5ead614306fceb85986ed29d18","up":true},{"one":"534bcaa98cf9192b35b6014c650ae067e74332c015ebb516d63601427d7376b8","other":"775e7be502df8fd938cf9c42ee4fac33e460a4b6992b9efeb8dc1ff7dde5c40f","up":true},{"one":"96fcf14c7f90350091ac6fcb58306ccfb9e4a38d3da59f8ab656854332844cbd","other":"b5025d153581d333b44df4b9bfa69d87de138905172e4fd317e16f7099a5fcf8","up":true},{"one":"6251e9540448726a601699ef4cd19e50c969a746da27228967338cdc09d628bf","other":"daec45eca40f48843b41f70267c07e94996ced829f02710f15354fbe26e177e7","up":true},{"one":"0c64e5af869b1665fd4016ae6d04c8eedd423636f06d78ecb944ee8e3272a82a","other":"0cf596af91eb9b041fe6dbe6b288c5730413850321b5ab176c81447e34ef79c5","up":true},{"one":"a34ea2e87d4c12adb27d66c2c95300603ff50415974e000bbcc69a5ae059dbf1","other":"82dd83838cb982b89505ef249d353a20e434346dd78b71cd9b809f71d5c112da","up":true},{"one":"b95d88ff6512ef8eaaa6bd842fa44175c1484fc2e8601b83d50a5ffa992bfa3a","other":"9fa0215e980dc907df4cc47ab4937f36527d78f9837493016fd4fc51e617299c","up":true},{"one":"a653302730df3d58f796906a93933aa81494f2588d9485ab7676ec3b0ccbb426","other":"ac4d2d6836e2cdf4c88221f6013aac70a451dd15bc403288bd10d0b911cd9a2b","up":true},{"one":"2a0a8eaf1a2749e68f8b841578c160699cf7907ff23842c6d616ad884e5f613e","other":"2c3894b6e47cf19ac7ee9fe213196312f676256f670dff25b03563492550bc74","up":true},{"one":"0c64e5af869b1665fd4016ae6d04c8eedd423636f06d78ecb944ee8e3272a82a","other":"04518d7120fa8a528d983ca1ee6d5d09ba24a4e853fb22bc9084cdf34995e95f","up":true},{"one":"39d1fcae2d23c775214988251505c577b9ac7b6851558ddf9a437dfe143f3845","other":"5efb3bfc199f5408f79bd6bd5171b4bf332c68a8e49242eb4f6a589b963565c6","up":true},{"one":"32371744163f0b3aefd3955dc4877e7eb82b17ef9541c333ca9c0a9f8aec3045","other":"0af9a57a2f66835cd3e4e71bc026013a8a99ca337a7b6b6cc34e11d8da212a4f","up":true},{"one":"eb98fb45dd5754f24f9df0c9ecbb93932e3d9d7735cd6d0ddd4a8675bb4ef554","other":"e54b643cbc95d9f5d27ec3760d892b6802981bfabf4f9979267d66259df982c7","up":true},{"one":"fe316679eca0e0eb823325812a56fd27da02653b06ada2fd03b27501bda8371a","other":"006727dc6f59b120b24c17b8e63f80ef3439105f8118ffeed408f105a48ee60c","up":true},{"one":"4a8b610e09d35aa21c42ab8c3e38de600a944c094e6b86ea56828b5e6904f1f7","other":"53a885968d68d8ebf7ed514e662cc13fa03186d2361000a03576531fdca2a25f","up":true},{"one":"0af9a57a2f66835cd3e4e71bc026013a8a99ca337a7b6b6cc34e11d8da212a4f","other":"13d6cb9316e289923e2d1de7f3c966d0cbabce3acdb8017122944f4abb140912","up":true},{"one":"0e5e0bb1383b2ec569b157a1d2ae6900592ab892a28367f5613a4e29cb265088","other":"2a97d308a720274a440dfa6901ca0a5480af9bab58dd8a6c4afdb9c83ea964c3","up":true},{"one":"ad9899f78659492ec248a884927a757f3f3b4e76cd2abc46ad8766251fd8afed","other":"b7cafed41dac01dd59e2bcaeaaab551ebfeab8eaa1f97c1866fe0ddae772807b","up":true},{"one":"45584a4bebb948ef5f7b55d4846ec5549d7623682169c0edcab5b3523e68c7da","other":"444722a15b01a0d8e6794798d239fe621d59bdfc08823ab47cbd8b9acebd23b4","up":true},{"one":"217f9952af1eb58d5ca5ac7be763716cfe2c0a4f3cdd4ebe4b5df563f919e2d2","other":"20aeb14f567dd16f06b0d3b589b83283daa00a5ed10e447860bda946baccdd2d","up":true},{"one":"ef1b70bf090bc9994b1d45e2812c56ecb430a89c346a436bd10880bcda700351","other":"ff36a8810dd44f6d1fa42aa91ff6206bcfb4c1ffbab0df73a181daece329e0e3","up":true},{"one":"96fcf14c7f90350091ac6fcb58306ccfb9e4a38d3da59f8ab656854332844cbd","other":"b2b5ba1bb188f18f79b295f2c0d48c52c1d1d449ecb9b94b9984f3a6179732c7","up":true},{"one":"f7fa2986ec9f84822b11a6b00bd03a1dd26f2a0fab90b1b308f08caead43cfe1","other":"caf6a8e37fd41c1e6ad77a8575cd90354bb1693893952301c9caeb4779c338d3","up":true},{"one":"e54784cfbcd89c37c8f758aae70ece3ab4b7f8c30fb4ef7543e04aa89ff4386b","other":"c26fd5e6504c7b3f0a6d9133ff87c98c110eb1c201c5f3bcf6b10653f2b972d2","up":true},{"one":"ca041da0dc514643d017458d08ff6962ec52c9e66571a239ec395dc8b2546709","other":"b5b24532d2810e311e10b1d606baf6007f9124b88a178b32713cf1eddae089be","up":true},{"one":"140020a23a840b8840ba0c2c384f853a606330e9743885e9967cf49533db282e","other":"256e81c5a6fb43bd343345477f8f96aa1947f07ac3297f631ab03f060147b062","up":true},{"one":"6f2d756566dd5b4a13ffeea9f687c785148f3407a502e28b9d6edfd03b905fdc","other":"68317431e4fa55be4a700e35c6a578307cc32b72336679b5c5618b622ef0c602","up":true},{"one":"0438f567045d4556a0e7a697028d689ecfd0ae20f9e85c09b48d9f1fd0ee4765","other":"17040a3aad5930d8e0de1011fd2996b7d09225989f0dc1ae8f7e7a52dd26ab4e","up":true},{"one":"33737df75bbac1b41c63f05ea2cf1523b972df17f22bda026db84a49ac35e1e3","other":"3b78bc987c7c31c94e8ada9b4b11b5db9387fe70dd01ce7f3e976d3bec433dec","up":true},{"one":"bb90464f769a85549c150f861775aa67924c7c651f393f6c70772707376a5c7e","other":"b02b01a5c37cb05c287a3dc7d04e305de26f8d62dc388542eeb43e97db7b4282","up":true},{"one":"51db114a52827f5b74088bd0fc87d35229e7740e7d121bd7699298396516a880","other":"6ecb5c36fc0150c287446ae8a8682d629a1d39341230717206219babe3bdf659","up":true},{"one":"30897492824b19540d13ef17c70845be6dde455dca4e4f84cfca14a2c373969f","other":"2ccfb5b1f3923d35fef88838c508b98b5516c5d409643881d2304ae49e50eed3","up":true},{"one":"4646fe4c119078738612b44a356089b3c73a08e11cfd910675d211ae6b20b8fd","other":"605a46991af15cd60e67413c712b99ff8f21173c96a7990f2728ad6cac2bb9d8","up":true},{"one":"4ac755123dcc64ef44db9280311af51f3f7a93e0dee67370d673261220356eb9","other":"0d8a919207fb2d5718eab7da95f8efeb01a4e1ae39602d315f8ba2ff1752d9da","up":true},{"one":"24b85c10f098725938ea7d87cd24a4b10358129906fca9790fc266ea8784b538","other":"1c8a10ecbd72acb2bbbb8b77ea5404f9e90f4dbf306ec8134cfed70b40aef399","up":true},{"one":"d640472351969a5578e541aca72b7640c583b995fd62607ff3ee3f3f3139aafd","other":"df1e4e46e8ec26cad74b4f35ab070f12c8f6fddca35ac44c1218ff60fe1e6bab","up":true},{"one":"daec45eca40f48843b41f70267c07e94996ced829f02710f15354fbe26e177e7","other":"d3b0dea1dd3ac71e7e4a30941632eec53cb980aa7cb6cdac95042a5400a878c3","up":true},{"one":"e775e9759d4701bd9b43c22f1d1be73c1262b2752bb23cb3857485daf1dcad2d","other":"a46dd535e3bc8f111a8b2ce5594b62e87741c395e8a2b8fbae33edd29cb8caf8","up":true},{"one":"ad9899f78659492ec248a884927a757f3f3b4e76cd2abc46ad8766251fd8afed","other":"ac4d2d6836e2cdf4c88221f6013aac70a451dd15bc403288bd10d0b911cd9a2b","up":true},{"one":"d1d719ce1dca507598449afe966396c160ad25ad632112ab268b1d913b490dbd","other":"f773b83f1a1de2ab6660edb0b765cfccec6778061ee25c5a84f968625686ef60","up":true},{"one":"6e05179dc90a8f6654d0c9a3f06173371dcfb18b852fdd77f35f75e38f273125","other":"5f00b3bebef2f5484ff1386298add68a6743a106200ae8a13a27dbb52714ee8f","up":true},{"one":"ef07be559914ec4b5930d90d8d8b6f32dab9eba23acc36f14d512307f9974348","other":"e5149cedd990072f2aaa9735a9259f28973c45876660c2d86ac105e56cca8e68","up":true},{"one":"0af9a57a2f66835cd3e4e71bc026013a8a99ca337a7b6b6cc34e11d8da212a4f","other":"0fc59bd04ac9de3195e3c9d0eb573952a5805dd2e7e572078b6e996778adec73","up":true},{"one":"6fe9a02e950a5c3a5ff026b75922ed687d59795ba8eb9c092a8d09a5c64d2453","other":"444722a15b01a0d8e6794798d239fe621d59bdfc08823ab47cbd8b9acebd23b4","up":true},{"one":"41092c852fac630df2a9ca0862716f8e9fb8566c904a49c96389071046bc699d","other":"4e5a46c004e85cf86a02fdfbf2243018825d015debfb9a077a1283d302293b3a","up":true},{"one":"8f2182c2c2d0eeb2e887dbc350ae7257819f536032851ffdf29e7842cb1a62cc","other":"aeb4c75a57ccfc9ac053a3d363cf7c1e3e201406587769ab6615d5c2f86a5410","up":true},{"one":"bcc6724e54f761361f85147eb102a8d1a1a38810a940ce76b1e361ddcadacaa3","other":"90765b72283f59be4cf9bf7a9e9a22fd6db701c3603cbc0817b4adf2f8e9ce08","up":true},{"one":"2c3894b6e47cf19ac7ee9fe213196312f676256f670dff25b03563492550bc74","other":"3f946957d910179c7e1a83c44369aacfc31f5727b1a6421a01c8a978ccd349a2","up":true},{"one":"f773b83f1a1de2ab6660edb0b765cfccec6778061ee25c5a84f968625686ef60","other":"fbc8087a723c564ca0139329902e79748af46699ea7be24d57909a7e8e96f681","up":true},{"one":"959fda0866d3c18e9399e98485d627044079d6f86b075edaea9315402f5d9395","other":"b626d472b555e6f950a7142783db8deb443a74e63ef6bd72a87eaf1af14ca805","up":true},{"one":"21012a3a6ef1ece48fd9d7cffe62dc75839dd062efcf3ac5f962c237814da407","other":"63370e288ab2e4b8403c6678e9c44ae5c7496b5ead614306fceb85986ed29d18","up":true},{"one":"82f9c9009f09de2d6a77b54976d14c14211eae65d886f6ed57560c700716dd5c","other":"88fefb7506105c0e269baf52955a01b19f55504b13133bac0beab41c9f6e6942","up":true},{"one":"caf6a8e37fd41c1e6ad77a8575cd90354bb1693893952301c9caeb4779c338d3","other":"f629b8b9e79c75ac559daf9bf4fc8672bfdd595cf2c5d17a8885282626fc65a5","up":true},{"one":"7e0458ecdf7081443cab5412529f3948ece659facaca03208496c80dd136e704","other":"6ea51fb6e4783f351dbbfa47b508c78c73233ebaada409dfb55446217f92c4bd","up":true},{"one":"605a46991af15cd60e67413c712b99ff8f21173c96a7990f2728ad6cac2bb9d8","other":"66e7fc2df51f5df8d7329851fe9357d895e9d5dfdc25f8d92bdb10a960f7e15a","up":true},{"one":"103b232552b94090232195dc88f84823701f35ae536b5af6dd33fa655a33cbae","other":"11d43f6ed0ddd5afa5c8a7abf7c62a4fa865b7a25ee295bf1a49701ef3081363","up":true},{"one":"7b90e939ae2a240f0d74a923afb6bbf11f6d5b99a7bf85f1825b1ea36bce744c","other":"77d2ec52dabd5d7f326d4c6afd2aad110487c6bdffa2984060528716ba873462","up":true},{"one":"7dd3078c71087ab88d4d26a962820bcb79b8ce30e91c1f9a69d4bf8d38086960","other":"7dbbdeba3731e1ff43072f8cbd86db147761e1b61753eea7024774dbf46914bd","up":true},{"one":"582330d8b8c49331b2aec790dc7325b9cd483fc8129323d31ec429d545042964","other":"4e5a46c004e85cf86a02fdfbf2243018825d015debfb9a077a1283d302293b3a","up":true},{"one":"512ec5c2e6b4d788482462d941117c81fcc0e73f0c15545794dd1b4e03bf2102","other":"88fefb7506105c0e269baf52955a01b19f55504b13133bac0beab41c9f6e6942","up":true},{"one":"07a8c900fec6c477580ed5b38848a8681dc52a19e59fa4cd32f571fe7fb2383a","other":"0c28cd1315890629896d0fe5517524d4eb788f7444709c135ea690ba4e6103d5","up":true},{"one":"ba884e5cfa1ee6eb38217181711e01bb0c37b3e33d1424dfa89ed3e29ef6205b","other":"ae2b3876bdbd6388781b65e31de182564c5d81f4511caf96588b1a287760b3dd","up":true},{"one":"a6fbe16b81d240ff2f2ed6c93cfd9590731dfb2e7ec3fce1c098fe542bedf299","other":"82f9c9009f09de2d6a77b54976d14c14211eae65d886f6ed57560c700716dd5c","up":true},{"one":"0cf596af91eb9b041fe6dbe6b288c5730413850321b5ab176c81447e34ef79c5","other":"17040a3aad5930d8e0de1011fd2996b7d09225989f0dc1ae8f7e7a52dd26ab4e","up":true},{"one":"2a97d308a720274a440dfa6901ca0a5480af9bab58dd8a6c4afdb9c83ea964c3","other":"3630e05326bacea8fcc739dec42085f845f416ddc698c76ff91f099eb1dc5007","up":true},{"one":"ae2b3876bdbd6388781b65e31de182564c5d81f4511caf96588b1a287760b3dd","other":"aeb4c75a57ccfc9ac053a3d363cf7c1e3e201406587769ab6615d5c2f86a5410","up":true},{"one":"04518d7120fa8a528d983ca1ee6d5d09ba24a4e853fb22bc9084cdf34995e95f","other":"006727dc6f59b120b24c17b8e63f80ef3439105f8118ffeed408f105a48ee60c","up":true},{"one":"0de3915b0bcc68040c8aa76fbd2cfa0714e9b34c9dbe0838a7cba81c4f73581c","other":"03285e06657032778feff0b43828c964dbf9de669f63171aeb587aa1a1facc0a","up":true},{"one":"04518d7120fa8a528d983ca1ee6d5d09ba24a4e853fb22bc9084cdf34995e95f","other":"03ccd8d52597d18c0b178ab7361d847d63aad3af920a28345977ae170a1dafcd","up":true},{"one":"d863ba7405eb07ccddbf1d34efbcbec2867a93a109ed9413d9aecf30d3645a6a","other":"c832b4ad64a17da4b796ffcac646c2aa666b276aabb7eb3bfe7981d64a4da402","up":true},{"one":"0438f567045d4556a0e7a697028d689ecfd0ae20f9e85c09b48d9f1fd0ee4765","other":"37801e8d7d46143f78924ed66099f658a94d37edfd2f58d02acb85add03e1894","up":true},{"one":"d3b0dea1dd3ac71e7e4a30941632eec53cb980aa7cb6cdac95042a5400a878c3","other":"d887070a0568282c69e96ce65612ba72d5ea26b5c80671435d6e1ed2c4b49301","up":true},{"one":"82dd83838cb982b89505ef249d353a20e434346dd78b71cd9b809f71d5c112da","other":"b02b01a5c37cb05c287a3dc7d04e305de26f8d62dc388542eeb43e97db7b4282","up":true},{"one":"0fc59bd04ac9de3195e3c9d0eb573952a5805dd2e7e572078b6e996778adec73","other":"850575577d6b420a87aba388af481e0c044c2f75cf29ff934daf5674318a61ba","up":true},{"one":"e027a9f7152641c4a41154f8ce4dafd23895c312150efea86bf4152c88d0ca86","other":"f773b83f1a1de2ab6660edb0b765cfccec6778061ee25c5a84f968625686ef60","up":true},{"one":"39d1fcae2d23c775214988251505c577b9ac7b6851558ddf9a437dfe143f3845","other":"00c6488a842ece7a8b0daf064e405de03a4257d308840ea52bfd48d23f54d895","up":true},{"one":"0c64e5af869b1665fd4016ae6d04c8eedd423636f06d78ecb944ee8e3272a82a","other":"886aff1f1e3b86bfe901066bb7948451c18fe3f8cd1b7318b05154890ca8f738","up":true},{"one":"88fefb7506105c0e269baf52955a01b19f55504b13133bac0beab41c9f6e6942","other":"a653302730df3d58f796906a93933aa81494f2588d9485ab7676ec3b0ccbb426","up":true},{"one":"82dd83838cb982b89505ef249d353a20e434346dd78b71cd9b809f71d5c112da","other":"849bcbb9be43b799fefc5e689efc75125da27f536e97e5b7921031520ae6e5d8","up":true},{"one":"ef1b70bf090bc9994b1d45e2812c56ecb430a89c346a436bd10880bcda700351","other":"df1e4e46e8ec26cad74b4f35ab070f12c8f6fddca35ac44c1218ff60fe1e6bab","up":true},{"one":"0de3915b0bcc68040c8aa76fbd2cfa0714e9b34c9dbe0838a7cba81c4f73581c","other":"045ba8da4641da3f0b8058bb0d9d8aafbb81496dc1cae2a3fd9c039a7e1cafb6","up":true},{"one":"30897492824b19540d13ef17c70845be6dde455dca4e4f84cfca14a2c373969f","other":"2c3894b6e47cf19ac7ee9fe213196312f676256f670dff25b03563492550bc74","up":true},{"one":"0743bcf2aaa77e916f4a367d6159473c7d80f46a2e4cbe9ef346e423d39d7072","other":"0cf596af91eb9b041fe6dbe6b288c5730413850321b5ab176c81447e34ef79c5","up":true},{"one":"628e7da3359ed6d9dcfbafc7581966e4e09245c321ec78ca75587c9cbb44697f","other":"7920d69cf7e458fce0781ea1a4e07768e1a69f6818090eff0abf0b4a0c2c35f8","up":true},{"one":"6967e7438125c2045d575eb9f407b4a38d1bf9dcd1c1c1a97f750da6a21aeff7","other":"314a3530a5e0c37d5609149b3ae9c2e078573346bd8fce3c769ebaeb31726ec1","up":true},{"one":"6c73150490e8be9677c40086de0aefed1939581048e26f4a93f5ca26571a1a8f","other":"775e7be502df8fd938cf9c42ee4fac33e460a4b6992b9efeb8dc1ff7dde5c40f","up":true},{"one":"f2d5533eed4b0c184952d859d67e44abe5a75a5de6111c8c106b8f4b2d8ccfc4","other":"e54784cfbcd89c37c8f758aae70ece3ab4b7f8c30fb4ef7543e04aa89ff4386b","up":true},{"one":"3b78bc987c7c31c94e8ada9b4b11b5db9387fe70dd01ce7f3e976d3bec433dec","other":"32371744163f0b3aefd3955dc4877e7eb82b17ef9541c333ca9c0a9f8aec3045","up":true},{"one":"0af9a57a2f66835cd3e4e71bc026013a8a99ca337a7b6b6cc34e11d8da212a4f","other":"1e2aca93fa9442a0034ae8d295530dde16fcbfa8c37227e2e6863babb0f87c34","up":true},{"one":"88a141c607019477c7b120a506285a7218cad2faa038082e0b9ddfcc9cb78d07","other":"b911b8e2d72532b7c66ff5f7bffa70f5ddbeea6903a86f9333399f0c4b5f0fe8","up":true},{"one":"33737df75bbac1b41c63f05ea2cf1523b972df17f22bda026db84a49ac35e1e3","other":"29957e8e92925a8c79bdf513295d96bfb62fbfc597ee1cf767c7ef408f1b1295","up":true},{"one":"45584a4bebb948ef5f7b55d4846ec5549d7623682169c0edcab5b3523e68c7da","other":"915d7a0510bad19266eef8f00ca0cb2efc340253775706495fca8b9160b512cc","up":true},{"one":"b5b24532d2810e311e10b1d606baf6007f9124b88a178b32713cf1eddae089be","other":"e5ada0415c92ef1511b15d04edf395976464afd9adc3e929c41d4d21d25e3182","up":true},{"one":"c59e3953b64e5b9ffbe53990a358914f2fa8e3551d33f92b9e3a441bd1baf2cd","other":"c441d27a5f4abaa8e3b0f040a6ef85bb8c970031d6a57503a674e36b3d6915d9","up":true},{"one":"a6fbe16b81d240ff2f2ed6c93cfd9590731dfb2e7ec3fce1c098fe542bedf299","other":"9fa0215e980dc907df4cc47ab4937f36527d78f9837493016fd4fc51e617299c","up":true},{"one":"03285e06657032778feff0b43828c964dbf9de669f63171aeb587aa1a1facc0a","other":"3e8efcaf3002522b39065ea30c15426d1eb55916499eff8eb5a814e39d41853c","up":true},{"one":"53a885968d68d8ebf7ed514e662cc13fa03186d2361000a03576531fdca2a25f","other":"0d8a919207fb2d5718eab7da95f8efeb01a4e1ae39602d315f8ba2ff1752d9da","up":true},{"one":"478278187cd9af799e83340a2f49b0b7f122fb8e08c0a372a87795426eab364b","other":"53a885968d68d8ebf7ed514e662cc13fa03186d2361000a03576531fdca2a25f","up":true},{"one":"6e68ea86440706a0d73a9508f2247492543163f8fa7e2dc2aa62b74d50261b8b","other":"49eaad68d23dd63ef26029fa3f4e2578f3deca8708bbc838750d8b6dbe9eaa38","up":true},{"one":"f773b83f1a1de2ab6660edb0b765cfccec6778061ee25c5a84f968625686ef60","other":"daec45eca40f48843b41f70267c07e94996ced829f02710f15354fbe26e177e7","up":true},{"one":"07a8c900fec6c477580ed5b38848a8681dc52a19e59fa4cd32f571fe7fb2383a","other":"0d8a919207fb2d5718eab7da95f8efeb01a4e1ae39602d315f8ba2ff1752d9da","up":true},{"one":"16725e318322353befc2f2aba112f0984bc011821bb16c98e2cd8b39cd62aea1","other":"1c9caf028df31681b1457a54d4b3ab20009f9fa5bd12417a1ba7efe0c660e6bd","up":true},{"one":"3f946957d910179c7e1a83c44369aacfc31f5727b1a6421a01c8a978ccd349a2","other":"58ed74695bf527bac9a350c86d305e53e08c4999795e11cd3b2a36f5cd25d637","up":true},{"one":"0a005eb9c10c5cc9f720cfec2a655811d391671597b4f32d12df291ec76b2c13","other":"0b72054403f78a64a787f46e9f26bf0de7bbba5a60cb105e6aeea46cb4a1d9fe","up":true},{"one":"1b830ed484b274a96ec7ba2f9a42b6859412b5334a564014ff3f11597ea3a32d","other":"2ccfb5b1f3923d35fef88838c508b98b5516c5d409643881d2304ae49e50eed3","up":true},{"one":"1e2aca93fa9442a0034ae8d295530dde16fcbfa8c37227e2e6863babb0f87c34","other":"39d1fcae2d23c775214988251505c577b9ac7b6851558ddf9a437dfe143f3845","up":true},{"one":"45584a4bebb948ef5f7b55d4846ec5549d7623682169c0edcab5b3523e68c7da","other":"60d7337ef806be95ccaf7b9d663a4289f9afc68edced62904ab50601cf113f45","up":true},{"one":"2d3645c4fdf9a2809a909076b9ee5fb98fa880f6faeff914f1a2987af928cd79","other":"29957e8e92925a8c79bdf513295d96bfb62fbfc597ee1cf767c7ef408f1b1295","up":true},{"one":"3b78bc987c7c31c94e8ada9b4b11b5db9387fe70dd01ce7f3e976d3bec433dec","other":"35e6b1d31f594c06b759525434a7e717ebe6f27ca0188f247ed1247664a50563","up":true},{"one":"7b90e939ae2a240f0d74a923afb6bbf11f6d5b99a7bf85f1825b1ea36bce744c","other":"67aa5463e4b32b363b3d01d2a41ccb03199411057276f4962d053160be29a6ef","up":true},{"one":"77d2ec52dabd5d7f326d4c6afd2aad110487c6bdffa2984060528716ba873462","other":"7e0458ecdf7081443cab5412529f3948ece659facaca03208496c80dd136e704","up":true},{"one":"4d59cf1aeecf370e94a7a231887450cef97053b9c88a7fd11e210840af070e29","other":"49eaad68d23dd63ef26029fa3f4e2578f3deca8708bbc838750d8b6dbe9eaa38","up":true},{"one":"4a8b610e09d35aa21c42ab8c3e38de600a944c094e6b86ea56828b5e6904f1f7","other":"512ec5c2e6b4d788482462d941117c81fcc0e73f0c15545794dd1b4e03bf2102","up":true},{"one":"e8efe8016fe6cf649b2755bee22da35ccc6c9c55d404d5385d61f6ea27b84380","other":"f629b8b9e79c75ac559daf9bf4fc8672bfdd595cf2c5d17a8885282626fc65a5","up":true},{"one":"898d2f7d46b4961b646d5a6142d54d6233b7f80f668ce234522dd02e2cc545cb","other":"f629b8b9e79c75ac559daf9bf4fc8672bfdd595cf2c5d17a8885282626fc65a5","up":true},{"one":"1e2aca93fa9442a0034ae8d295530dde16fcbfa8c37227e2e6863babb0f87c34","other":"6f5f5a77e6092e25e5308413e02ba62c1c559024893a7fb98e26b0f34fed8bfe","up":true},{"one":"c26fd5e6504c7b3f0a6d9133ff87c98c110eb1c201c5f3bcf6b10653f2b972d2","other":"c786ff8667f509b5a9519984c1d95c83a5d2e257500a71429e8f23af610ce771","up":true},{"one":"f528aaafd67b20dafdce101db224aa01c70f93bdc91c14f50fa8db1dbf9fc386","other":"f4e09f89287bd1af7833acd85ba7cc71fdb3ff34f2f409e1cf2a878dcd3183dc","up":true},{"one":"3630e05326bacea8fcc739dec42085f845f416ddc698c76ff91f099eb1dc5007","other":"53087084708cc5ee63ac459b18fa10ae52a823139b4ecba6c8691d4934f2f971","up":true},{"one":"c26fd5e6504c7b3f0a6d9133ff87c98c110eb1c201c5f3bcf6b10653f2b972d2","other":"c59e3953b64e5b9ffbe53990a358914f2fa8e3551d33f92b9e3a441bd1baf2cd","up":true},{"one":"39d1fcae2d23c775214988251505c577b9ac7b6851558ddf9a437dfe143f3845","other":"4d103ec5afee559a5a9242e8d650b67301eaec10e96fc2f184e34d48554108a2","up":true},{"one":"baddc778aea97acdbbb5bc99744a5545abab9f6047c81f328761645287ac391c","other":"ae2b3876bdbd6388781b65e31de182564c5d81f4511caf96588b1a287760b3dd","up":true},{"one":"f528aaafd67b20dafdce101db224aa01c70f93bdc91c14f50fa8db1dbf9fc386","other":"f5dc78ff71a63fc2014b9553723ee676c63fc078a32a46b7cb172f357a118140","up":true},{"one":"baddc778aea97acdbbb5bc99744a5545abab9f6047c81f328761645287ac391c","other":"a3693801a91180410cf3e85d7c09ac8054a769e7b1d55c9e7a46850cb8217da0","up":true},{"one":"006727dc6f59b120b24c17b8e63f80ef3439105f8118ffeed408f105a48ee60c","other":"0b72054403f78a64a787f46e9f26bf0de7bbba5a60cb105e6aeea46cb4a1d9fe","up":true},{"one":"3630e05326bacea8fcc739dec42085f845f416ddc698c76ff91f099eb1dc5007","other":"3b78bc987c7c31c94e8ada9b4b11b5db9387fe70dd01ce7f3e976d3bec433dec","up":true},{"one":"49eaad68d23dd63ef26029fa3f4e2578f3deca8708bbc838750d8b6dbe9eaa38","other":"605a46991af15cd60e67413c712b99ff8f21173c96a7990f2728ad6cac2bb9d8","up":true},{"one":"35e6b1d31f594c06b759525434a7e717ebe6f27ca0188f247ed1247664a50563","other":"2a97d308a720274a440dfa6901ca0a5480af9bab58dd8a6c4afdb9c83ea964c3","up":true},{"one":"140020a23a840b8840ba0c2c384f853a606330e9743885e9967cf49533db282e","other":"378e7af7cc019186d4f2699e753e2d71302f8f3565572c13b7a1b1c5cb47443c","up":true},{"one":"53a885968d68d8ebf7ed514e662cc13fa03186d2361000a03576531fdca2a25f","other":"444722a15b01a0d8e6794798d239fe621d59bdfc08823ab47cbd8b9acebd23b4","up":true},{"one":"0ff2d2c49547eebc96675e0b88073dea5e9091bee1843ffe567127e34486c348","other":"628e7da3359ed6d9dcfbafc7581966e4e09245c321ec78ca75587c9cbb44697f","up":true},{"one":"e8efe8016fe6cf649b2755bee22da35ccc6c9c55d404d5385d61f6ea27b84380","other":"e54784cfbcd89c37c8f758aae70ece3ab4b7f8c30fb4ef7543e04aa89ff4386b","up":true},{"one":"67aa5463e4b32b363b3d01d2a41ccb03199411057276f4962d053160be29a6ef","other":"53a885968d68d8ebf7ed514e662cc13fa03186d2361000a03576531fdca2a25f","up":true},{"one":"140020a23a840b8840ba0c2c384f853a606330e9743885e9967cf49533db282e","other":"07a8c900fec6c477580ed5b38848a8681dc52a19e59fa4cd32f571fe7fb2383a","up":true},{"one":"bcc6724e54f761361f85147eb102a8d1a1a38810a940ce76b1e361ddcadacaa3","other":"9852ce267d53106a6e584d6eddb08e0062eb4a422d2a8d39ad6dccaebac552ff","up":true},{"one":"13d6cb9316e289923e2d1de7f3c966d0cbabce3acdb8017122944f4abb140912","other":"11d43f6ed0ddd5afa5c8a7abf7c62a4fa865b7a25ee295bf1a49701ef3081363","up":true},{"one":"b89793c3ccd9ea642080728732ce7df33778653fed3d1d8f3a25e60670e33325","other":"96fcf14c7f90350091ac6fcb58306ccfb9e4a38d3da59f8ab656854332844cbd","up":true},{"one":"1c8a10ecbd72acb2bbbb8b77ea5404f9e90f4dbf306ec8134cfed70b40aef399","other":"3efc4b120b3eeeac186bf3a4cd42eb8c647f7edb08c23ee643e2bec9d72c5bed","up":true},{"one":"fe316679eca0e0eb823325812a56fd27da02653b06ada2fd03b27501bda8371a","other":"0b72054403f78a64a787f46e9f26bf0de7bbba5a60cb105e6aeea46cb4a1d9fe","up":true},{"one":"2f32d54f06989efb6ca5431b74cd759fba05dbef36ecff8fd506e662026af983","other":"2abb938b889a2eb735134462985a56056be48f189b5b89d23b653864c76427f4","up":true},{"one":"b65ee2549536a806ceef4a7ccc9544567cafe6204080929fc847df0a3781ccc9","other":"c49caff13862dc089f1f9b8180d6efa455648375662719272102c4f8028799d6","up":true},{"one":"f5b24a1fd2cd2908b408562f9a265ee1a692b137e770137afa5fdfa07b237221","other":"90a85cb7363ede161ec21cc89f8b9d4350e566cf10586a66d31b0a8677620aa1","up":true},{"one":"499036eb9d10fc003c903f09ea0ee00c0d27b39564988d67ae111f3473d22f07","other":"90a85cb7363ede161ec21cc89f8b9d4350e566cf10586a66d31b0a8677620aa1","up":true},{"one":"30897492824b19540d13ef17c70845be6dde455dca4e4f84cfca14a2c373969f","other":"217f9952af1eb58d5ca5ac7be763716cfe2c0a4f3cdd4ebe4b5df563f919e2d2","up":true},{"one":"4636f00be60a9b494a3ebc9ab41cc7cb53ec0b0beff214db2d0a248dc3aeb6af","other":"6c4dcdfdee0164a9a3f419430726dd51f9198c65ff6e7de7aaa6f632dcde6794","up":true},{"one":"b02b01a5c37cb05c287a3dc7d04e305de26f8d62dc388542eeb43e97db7b4282","other":"ae2b3876bdbd6388781b65e31de182564c5d81f4511caf96588b1a287760b3dd","up":true},{"one":"524db81b135af8dc309b942c082a7291dddb851866fc608753f937ee77015be0","other":"574f65867482091aee2774033116c233525eea711706b5ae9ba09b54e896d302","up":true},{"one":"959fda0866d3c18e9399e98485d627044079d6f86b075edaea9315402f5d9395","other":"898d2f7d46b4961b646d5a6142d54d6233b7f80f668ce234522dd02e2cc545cb","up":true},{"one":"b02b01a5c37cb05c287a3dc7d04e305de26f8d62dc388542eeb43e97db7b4282","other":"aeb4c75a57ccfc9ac053a3d363cf7c1e3e201406587769ab6615d5c2f86a5410","up":true},{"one":"baf219e9229921b773d1ad7eb7eb5216cfa60ccecaa3c5c487e3b71cb600ba12","other":"ac4d2d6836e2cdf4c88221f6013aac70a451dd15bc403288bd10d0b911cd9a2b","up":true},{"one":"ec52270604007673d1bfda1edbd8bfa945a21141efd85e42b684a9f30f8cddae","other":"c441d27a5f4abaa8e3b0f040a6ef85bb8c970031d6a57503a674e36b3d6915d9","up":true},{"one":"04518d7120fa8a528d983ca1ee6d5d09ba24a4e853fb22bc9084cdf34995e95f","other":"0743bcf2aaa77e916f4a367d6159473c7d80f46a2e4cbe9ef346e423d39d7072","up":true},{"one":"fbf5e917be45e909697a9393c4778206333cf1dd9a103978e8d71622ca3b1cc8","other":"f4565dd2c428c03d7a8d5fad87a6dd5f92ae706529eb6152d36fa584e7cdbe4d","up":true},{"one":"04518d7120fa8a528d983ca1ee6d5d09ba24a4e853fb22bc9084cdf34995e95f","other":"1c47ad5bd8846f777daf59587feccc308f4dc63f6d27b1385ff8085c75bb1aac","up":true},{"one":"7dc2a9573f253f362ef1b21bbfcc144b11a6febc58aa3c4430224160e9fa738c","other":"534bcaa98cf9192b35b6014c650ae067e74332c015ebb516d63601427d7376b8","up":true},{"one":"53a885968d68d8ebf7ed514e662cc13fa03186d2361000a03576531fdca2a25f","other":"02d85b9f8e4776224ae5088683a87837b82b2bfb7e047cf373a28393e7aca6e1","up":true},{"one":"c6cf46239078edfb343c645f039725fdee1bbba8b0a6da02e2cc456b9223c9a2","other":"c43fbee95380007274b8f231fe34bcd59b5c0ef0830b174967d4702627984fc6","up":true},{"one":"524db81b135af8dc309b942c082a7291dddb851866fc608753f937ee77015be0","other":"534bcaa98cf9192b35b6014c650ae067e74332c015ebb516d63601427d7376b8","up":true},{"one":"ae2b3876bdbd6388781b65e31de182564c5d81f4511caf96588b1a287760b3dd","other":"f925c85e6457ac01f0cd6b297155f9d3ae611603890d8f3a45e1396d937f8680","up":true},{"one":"da67ace34f7076a1d550bc61bc2a31da88d6cd9f9df43b142a8c6bbade1b4aee","other":"db6a1f6b342f6be9517f8df01003797c11c837d9aee3cdba5b7859230b36c35d","up":true},{"one":"b65ee2549536a806ceef4a7ccc9544567cafe6204080929fc847df0a3781ccc9","other":"898d2f7d46b4961b646d5a6142d54d6233b7f80f668ce234522dd02e2cc545cb","up":true},{"one":"7dd3078c71087ab88d4d26a962820bcb79b8ce30e91c1f9a69d4bf8d38086960","other":"41092c852fac630df2a9ca0862716f8e9fb8566c904a49c96389071046bc699d","up":true},{"one":"f5dc78ff71a63fc2014b9553723ee676c63fc078a32a46b7cb172f357a118140","other":"f773b83f1a1de2ab6660edb0b765cfccec6778061ee25c5a84f968625686ef60","up":true},{"one":"103b232552b94090232195dc88f84823701f35ae536b5af6dd33fa655a33cbae","other":"e775e9759d4701bd9b43c22f1d1be73c1262b2752bb23cb3857485daf1dcad2d","up":true},{"one":"165f1af67aa1d24569e0bdff61d29b3c39e93250071d8f25b5be6face209ac6a","other":"19faaf891eb6a716902ec29d201dc2094ee474acff188ae86faf9760674b2d37","up":true},{"one":"af02b5d107b3a17f539c7f9020ebe74322434634e70c420a7f56776eb5d9db73","other":"96fcf14c7f90350091ac6fcb58306ccfb9e4a38d3da59f8ab656854332844cbd","up":true},{"one":"7dd3078c71087ab88d4d26a962820bcb79b8ce30e91c1f9a69d4bf8d38086960","other":"66e7fc2df51f5df8d7329851fe9357d895e9d5dfdc25f8d92bdb10a960f7e15a","up":true},{"one":"c786ff8667f509b5a9519984c1d95c83a5d2e257500a71429e8f23af610ce771","other":"c49caff13862dc089f1f9b8180d6efa455648375662719272102c4f8028799d6","up":true},{"one":"49eaad68d23dd63ef26029fa3f4e2578f3deca8708bbc838750d8b6dbe9eaa38","other":"6c73150490e8be9677c40086de0aefed1939581048e26f4a93f5ca26571a1a8f","up":true},{"one":"f5dc78ff71a63fc2014b9553723ee676c63fc078a32a46b7cb172f357a118140","other":"f45f1f2e59e947e04fa15bcf87f872ef6d73b73f778e12d1f9b8930ea166eefc","up":true},{"one":"17040a3aad5930d8e0de1011fd2996b7d09225989f0dc1ae8f7e7a52dd26ab4e","other":"0c64e5af869b1665fd4016ae6d04c8eedd423636f06d78ecb944ee8e3272a82a","up":true},{"one":"5b632eaf700d173ff15f4727b85817e6173228c304b422434a08c2cad438b825","other":"6e05179dc90a8f6654d0c9a3f06173371dcfb18b852fdd77f35f75e38f273125","up":true},{"one":"03285e06657032778feff0b43828c964dbf9de669f63171aeb587aa1a1facc0a","other":"3ec530761ddb87f930fda919be67df18074c6f0795292add1b2a91ff3d9c39e3","up":true},{"one":"e027a9f7152641c4a41154f8ce4dafd23895c312150efea86bf4152c88d0ca86","other":"f45f1f2e59e947e04fa15bcf87f872ef6d73b73f778e12d1f9b8930ea166eefc","up":true},{"one":"f27f1044777e05f3f60165d0d2fc3e7667fe148e0ca7a097805d60b9f61025f7","other":"d3b0dea1dd3ac71e7e4a30941632eec53cb980aa7cb6cdac95042a5400a878c3","up":true},{"one":"baddc778aea97acdbbb5bc99744a5545abab9f6047c81f328761645287ac391c","other":"ac4d2d6836e2cdf4c88221f6013aac70a451dd15bc403288bd10d0b911cd9a2b","up":true},{"one":"ba884e5cfa1ee6eb38217181711e01bb0c37b3e33d1424dfa89ed3e29ef6205b","other":"8f2182c2c2d0eeb2e887dbc350ae7257819f536032851ffdf29e7842cb1a62cc","up":true},{"one":"ba884e5cfa1ee6eb38217181711e01bb0c37b3e33d1424dfa89ed3e29ef6205b","other":"ac4d2d6836e2cdf4c88221f6013aac70a451dd15bc403288bd10d0b911cd9a2b","up":true},{"one":"628e7da3359ed6d9dcfbafc7581966e4e09245c321ec78ca75587c9cbb44697f","other":"7dc2a9573f253f362ef1b21bbfcc144b11a6febc58aa3c4430224160e9fa738c","up":true},{"one":"21012a3a6ef1ece48fd9d7cffe62dc75839dd062efcf3ac5f962c237814da407","other":"2a97d308a720274a440dfa6901ca0a5480af9bab58dd8a6c4afdb9c83ea964c3","up":true},{"one":"30bec7cd0a7d002839aed7654129bd2fe2e2ce7f42aa7bae1560e8bf718954c3","other":"2ccfb5b1f3923d35fef88838c508b98b5516c5d409643881d2304ae49e50eed3","up":true},{"one":"c26fd5e6504c7b3f0a6d9133ff87c98c110eb1c201c5f3bcf6b10653f2b972d2","other":"ed2d3e1e5693b44494808907c98ec54d6d08331945d2a2c03e31130fef1d2586","up":true},{"one":"f5dc78ff71a63fc2014b9553723ee676c63fc078a32a46b7cb172f357a118140","other":"f4e09f89287bd1af7833acd85ba7cc71fdb3ff34f2f409e1cf2a878dcd3183dc","up":true},{"one":"605a46991af15cd60e67413c712b99ff8f21173c96a7990f2728ad6cac2bb9d8","other":"628e7da3359ed6d9dcfbafc7581966e4e09245c321ec78ca75587c9cbb44697f","up":true},{"one":"fbf5e917be45e909697a9393c4778206333cf1dd9a103978e8d71622ca3b1cc8","other":"f5b24a1fd2cd2908b408562f9a265ee1a692b137e770137afa5fdfa07b237221","up":true},{"one":"7290cd3affade5f9e729d1b03549aceafb2576cdbc6789fd688c95495f10bacd","other":"02d85b9f8e4776224ae5088683a87837b82b2bfb7e047cf373a28393e7aca6e1","up":true},{"one":"850575577d6b420a87aba388af481e0c044c2f75cf29ff934daf5674318a61ba","other":"7125e05bf1bfe6df948c9276b62bc755fc6b0ec8d4ac7724b61ea49591adcf25","up":true},{"one":"53a885968d68d8ebf7ed514e662cc13fa03186d2361000a03576531fdca2a25f","other":"46fee69dad8b6a6a87d356d10db25d835a0c4e154bf179e88fb4cc65f97d72d7","up":true},{"one":"6ecb5c36fc0150c287446ae8a8682d629a1d39341230717206219babe3bdf659","other":"461cc9f064e6f4f06ff38e0d1f3f00ef8807ba31c7258e453cc682e9551bb1c6","up":true},{"one":"e775e9759d4701bd9b43c22f1d1be73c1262b2752bb23cb3857485daf1dcad2d","other":"a34ea2e87d4c12adb27d66c2c95300603ff50415974e000bbcc69a5ae059dbf1","up":true},{"one":"461cc9f064e6f4f06ff38e0d1f3f00ef8807ba31c7258e453cc682e9551bb1c6","other":"32371744163f0b3aefd3955dc4877e7eb82b17ef9541c333ca9c0a9f8aec3045","up":true},{"one":"c832b4ad64a17da4b796ffcac646c2aa666b276aabb7eb3bfe7981d64a4da402","other":"f629b8b9e79c75ac559daf9bf4fc8672bfdd595cf2c5d17a8885282626fc65a5","up":true},{"one":"58ed74695bf527bac9a350c86d305e53e08c4999795e11cd3b2a36f5cd25d637","other":"6ecb5c36fc0150c287446ae8a8682d629a1d39341230717206219babe3bdf659","up":true},{"one":"18f6e66e1cc8e620808901b571fdf525ee8f41850fac0bd0e5c5a4de70c5f873","other":"1f670c53b4c597beaffacd84e3a697225b04cded9219d0a28e1fe525a3cadcf5","up":true},{"one":"4d59cf1aeecf370e94a7a231887450cef97053b9c88a7fd11e210840af070e29","other":"4c9eab8ab45405a6d4bab46430efc04b8e6aec1d944f88435eca41361925f379","up":true},{"one":"67aa5463e4b32b363b3d01d2a41ccb03199411057276f4962d053160be29a6ef","other":"6c4dcdfdee0164a9a3f419430726dd51f9198c65ff6e7de7aaa6f632dcde6794","up":true},{"one":"c786ff8667f509b5a9519984c1d95c83a5d2e257500a71429e8f23af610ce771","other":"c43fbee95380007274b8f231fe34bcd59b5c0ef0830b174967d4702627984fc6","up":true},{"one":"898d2f7d46b4961b646d5a6142d54d6233b7f80f668ce234522dd02e2cc545cb","other":"9d0f804849b72397646ba48208ba1e01dcf4de04e788016c4a1a0c93e650ddf5","up":true},{"one":"33b5c521b4208e26414db2e05c9a8ccc001a524d928579d44d2e74d14a56593e","other":"3b78bc987c7c31c94e8ada9b4b11b5db9387fe70dd01ce7f3e976d3bec433dec","up":true},{"one":"c6cf46239078edfb343c645f039725fdee1bbba8b0a6da02e2cc456b9223c9a2","other":"ed2d3e1e5693b44494808907c98ec54d6d08331945d2a2c03e31130fef1d2586","up":true},{"one":"17040a3aad5930d8e0de1011fd2996b7d09225989f0dc1ae8f7e7a52dd26ab4e","other":"03ccd8d52597d18c0b178ab7361d847d63aad3af920a28345977ae170a1dafcd","up":true},{"one":"6967e7438125c2045d575eb9f407b4a38d1bf9dcd1c1c1a97f750da6a21aeff7","other":"3b88a472beba4a18f8df45678888fd359bac3823900eecfe0037fdc9ad54d416","up":true},{"one":"103b232552b94090232195dc88f84823701f35ae536b5af6dd33fa655a33cbae","other":"e8548b5df15adf0f2a997ff5709827beb5e1d36bb08a2f2d017746d5c0e83fca","up":true},{"one":"f773b83f1a1de2ab6660edb0b765cfccec6778061ee25c5a84f968625686ef60","other":"d29941d6b8acd86cf32fd1c2181da3ab1da3c2083134b068ca49ce29aa86b783","up":true},{"one":"ef07be559914ec4b5930d90d8d8b6f32dab9eba23acc36f14d512307f9974348","other":"ef1b70bf090bc9994b1d45e2812c56ecb430a89c346a436bd10880bcda700351","up":true},{"one":"33b5c521b4208e26414db2e05c9a8ccc001a524d928579d44d2e74d14a56593e","other":"39d1fcae2d23c775214988251505c577b9ac7b6851558ddf9a437dfe143f3845","up":true},{"one":"e7fa7112adc7b023dd5965e620277122542153f87eaf5deeacc8a51f1778ba77","other":"d1d719ce1dca507598449afe966396c160ad25ad632112ab268b1d913b490dbd","up":true},{"one":"4636f00be60a9b494a3ebc9ab41cc7cb53ec0b0beff214db2d0a248dc3aeb6af","other":"44a10530c376b215baff8531eeb2afb8d6714c4d0350d1a6f32761a97cd6c7ec","up":true},{"one":"f925c85e6457ac01f0cd6b297155f9d3ae611603890d8f3a45e1396d937f8680","other":"fbc8087a723c564ca0139329902e79748af46699ea7be24d57909a7e8e96f681","up":true},{"one":"e5149cedd990072f2aaa9735a9259f28973c45876660c2d86ac105e56cca8e68","other":"88a141c607019477c7b120a506285a7218cad2faa038082e0b9ddfcc9cb78d07","up":true},{"one":"e8efe8016fe6cf649b2755bee22da35ccc6c9c55d404d5385d61f6ea27b84380","other":"da67ace34f7076a1d550bc61bc2a31da88d6cd9f9df43b142a8c6bbade1b4aee","up":true},{"one":"f31cc744ea921fee8364c5269b1ce7ec6b5f0c0cbb6885efbf602de5b36f6169","other":"ee5e77df690329c132f2f7fca223cfd384b7bc34ec38763a4eb42780e0585656","up":true},{"one":"7e0458ecdf7081443cab5412529f3948ece659facaca03208496c80dd136e704","other":"6251e9540448726a601699ef4cd19e50c969a746da27228967338cdc09d628bf","up":true},{"one":"0c28cd1315890629896d0fe5517524d4eb788f7444709c135ea690ba4e6103d5","other":"314a3530a5e0c37d5609149b3ae9c2e078573346bd8fce3c769ebaeb31726ec1","up":true},{"one":"f27f1044777e05f3f60165d0d2fc3e7667fe148e0ca7a097805d60b9f61025f7","other":"f45f1f2e59e947e04fa15bcf87f872ef6d73b73f778e12d1f9b8930ea166eefc","up":true},{"one":"976e57d0c32227222bfd0cbb802f269bdcd52d5d33cf689c66b12c023f5fa8bf","other":"88fefb7506105c0e269baf52955a01b19f55504b13133bac0beab41c9f6e6942","up":true},{"one":"d29941d6b8acd86cf32fd1c2181da3ab1da3c2083134b068ca49ce29aa86b783","other":"ca041da0dc514643d017458d08ff6962ec52c9e66571a239ec395dc8b2546709","up":true},{"one":"7e0458ecdf7081443cab5412529f3948ece659facaca03208496c80dd136e704","other":"0de3915b0bcc68040c8aa76fbd2cfa0714e9b34c9dbe0838a7cba81c4f73581c","up":true},{"one":"30897492824b19540d13ef17c70845be6dde455dca4e4f84cfca14a2c373969f","other":"29957e8e92925a8c79bdf513295d96bfb62fbfc597ee1cf767c7ef408f1b1295","up":true},{"one":"4636f00be60a9b494a3ebc9ab41cc7cb53ec0b0beff214db2d0a248dc3aeb6af","other":"7290cd3affade5f9e729d1b03549aceafb2576cdbc6789fd688c95495f10bacd","up":true},{"one":"d863ba7405eb07ccddbf1d34efbcbec2867a93a109ed9413d9aecf30d3645a6a","other":"d640472351969a5578e541aca72b7640c583b995fd62607ff3ee3f3f3139aafd","up":true},{"one":"1e2aca93fa9442a0034ae8d295530dde16fcbfa8c37227e2e6863babb0f87c34","other":"0a005eb9c10c5cc9f720cfec2a655811d391671597b4f32d12df291ec76b2c13","up":true},{"one":"17040a3aad5930d8e0de1011fd2996b7d09225989f0dc1ae8f7e7a52dd26ab4e","other":"0743bcf2aaa77e916f4a367d6159473c7d80f46a2e4cbe9ef346e423d39d7072","up":true},{"one":"a6fbe16b81d240ff2f2ed6c93cfd9590731dfb2e7ec3fce1c098fe542bedf299","other":"82dd83838cb982b89505ef249d353a20e434346dd78b71cd9b809f71d5c112da","up":true},{"one":"6967e7438125c2045d575eb9f407b4a38d1bf9dcd1c1c1a97f750da6a21aeff7","other":"6f2d756566dd5b4a13ffeea9f687c785148f3407a502e28b9d6edfd03b905fdc","up":true},{"one":"0b72054403f78a64a787f46e9f26bf0de7bbba5a60cb105e6aeea46cb4a1d9fe","other":"0af9a57a2f66835cd3e4e71bc026013a8a99ca337a7b6b6cc34e11d8da212a4f","up":true},{"one":"3b88a472beba4a18f8df45678888fd359bac3823900eecfe0037fdc9ad54d416","other":"16725e318322353befc2f2aba112f0984bc011821bb16c98e2cd8b39cd62aea1","up":true},{"one":"c26fd5e6504c7b3f0a6d9133ff87c98c110eb1c201c5f3bcf6b10653f2b972d2","other":"d7aca8f2182bc625d2b3c942bd1161c85bcf1c2b34ecbe3e2fd23cfae6b8a871","up":true},{"one":"b5b24532d2810e311e10b1d606baf6007f9124b88a178b32713cf1eddae089be","other":"959fda0866d3c18e9399e98485d627044079d6f86b075edaea9315402f5d9395","up":true},{"one":"a46dd535e3bc8f111a8b2ce5594b62e87741c395e8a2b8fbae33edd29cb8caf8","other":"8f2182c2c2d0eeb2e887dbc350ae7257819f536032851ffdf29e7842cb1a62cc","up":true},{"one":"e8efe8016fe6cf649b2755bee22da35ccc6c9c55d404d5385d61f6ea27b84380","other":"ec52270604007673d1bfda1edbd8bfa945a21141efd85e42b684a9f30f8cddae","up":true},{"one":"f5b24a1fd2cd2908b408562f9a265ee1a692b137e770137afa5fdfa07b237221","other":"fbc8087a723c564ca0139329902e79748af46699ea7be24d57909a7e8e96f681","up":true},{"one":"0ff2d2c49547eebc96675e0b88073dea5e9091bee1843ffe567127e34486c348","other":"66e7fc2df51f5df8d7329851fe9357d895e9d5dfdc25f8d92bdb10a960f7e15a","up":true},{"one":"eb98fb45dd5754f24f9df0c9ecbb93932e3d9d7735cd6d0ddd4a8675bb4ef554","other":"f773b83f1a1de2ab6660edb0b765cfccec6778061ee25c5a84f968625686ef60","up":true},{"one":"9890e6ebb2c6f9a7bec4c2778e077e3710ce3af356f82ae9b4d324832d159ef7","other":"9852ce267d53106a6e584d6eddb08e0062eb4a422d2a8d39ad6dccaebac552ff","up":true},{"one":"04518d7120fa8a528d983ca1ee6d5d09ba24a4e853fb22bc9084cdf34995e95f","other":"1e2aca93fa9442a0034ae8d295530dde16fcbfa8c37227e2e6863babb0f87c34","up":true},{"one":"3ec530761ddb87f930fda919be67df18074c6f0795292add1b2a91ff3d9c39e3","other":"378e7af7cc019186d4f2699e753e2d71302f8f3565572c13b7a1b1c5cb47443c","up":true},{"one":"af02b5d107b3a17f539c7f9020ebe74322434634e70c420a7f56776eb5d9db73","other":"90765b72283f59be4cf9bf7a9e9a22fd6db701c3603cbc0817b4adf2f8e9ce08","up":true},{"one":"29957e8e92925a8c79bdf513295d96bfb62fbfc597ee1cf767c7ef408f1b1295","other":"3f946957d910179c7e1a83c44369aacfc31f5727b1a6421a01c8a978ccd349a2","up":true},{"one":"88fefb7506105c0e269baf52955a01b19f55504b13133bac0beab41c9f6e6942","other":"b5025d153581d333b44df4b9bfa69d87de138905172e4fd317e16f7099a5fcf8","up":true},{"one":"f925c85e6457ac01f0cd6b297155f9d3ae611603890d8f3a45e1396d937f8680","other":"e775e9759d4701bd9b43c22f1d1be73c1262b2752bb23cb3857485daf1dcad2d","up":true},{"one":"b65ee2549536a806ceef4a7ccc9544567cafe6204080929fc847df0a3781ccc9","other":"b626d472b555e6f950a7142783db8deb443a74e63ef6bd72a87eaf1af14ca805","up":true},{"one":"df1e4e46e8ec26cad74b4f35ab070f12c8f6fddca35ac44c1218ff60fe1e6bab","other":"c441d27a5f4abaa8e3b0f040a6ef85bb8c970031d6a57503a674e36b3d6915d9","up":true},{"one":"c26fd5e6504c7b3f0a6d9133ff87c98c110eb1c201c5f3bcf6b10653f2b972d2","other":"ee5e77df690329c132f2f7fca223cfd384b7bc34ec38763a4eb42780e0585656","up":true},{"one":"f2d5533eed4b0c184952d859d67e44abe5a75a5de6111c8c106b8f4b2d8ccfc4","other":"ff36a8810dd44f6d1fa42aa91ff6206bcfb4c1ffbab0df73a181daece329e0e3","up":true},{"one":"68317431e4fa55be4a700e35c6a578307cc32b72336679b5c5618b622ef0c602","other":"1436aaa8770e9f1c6294e49f4066c16b1caa50524e9b8fd058059e41657d2a83","up":true},{"one":"3630e05326bacea8fcc739dec42085f845f416ddc698c76ff91f099eb1dc5007","other":"2c3894b6e47cf19ac7ee9fe213196312f676256f670dff25b03563492550bc74","up":true},{"one":"b65ee2549536a806ceef4a7ccc9544567cafe6204080929fc847df0a3781ccc9","other":"9d0f804849b72397646ba48208ba1e01dcf4de04e788016c4a1a0c93e650ddf5","up":true},{"one":"0de3915b0bcc68040c8aa76fbd2cfa0714e9b34c9dbe0838a7cba81c4f73581c","other":"0c28cd1315890629896d0fe5517524d4eb788f7444709c135ea690ba4e6103d5","up":true},{"one":"9890e6ebb2c6f9a7bec4c2778e077e3710ce3af356f82ae9b4d324832d159ef7","other":"849bcbb9be43b799fefc5e689efc75125da27f536e97e5b7921031520ae6e5d8","up":true},{"one":"29957e8e92925a8c79bdf513295d96bfb62fbfc597ee1cf767c7ef408f1b1295","other":"2a0a8eaf1a2749e68f8b841578c160699cf7907ff23842c6d616ad884e5f613e","up":true},{"one":"16725e318322353befc2f2aba112f0984bc011821bb16c98e2cd8b39cd62aea1","other":"045ba8da4641da3f0b8058bb0d9d8aafbb81496dc1cae2a3fd9c039a7e1cafb6","up":true},{"one":"959fda0866d3c18e9399e98485d627044079d6f86b075edaea9315402f5d9395","other":"ac4d2d6836e2cdf4c88221f6013aac70a451dd15bc403288bd10d0b911cd9a2b","up":true},{"one":"baf219e9229921b773d1ad7eb7eb5216cfa60ccecaa3c5c487e3b71cb600ba12","other":"e8efe8016fe6cf649b2755bee22da35ccc6c9c55d404d5385d61f6ea27b84380","up":true},{"one":"f5b24a1fd2cd2908b408562f9a265ee1a692b137e770137afa5fdfa07b237221","other":"c8986871e46f001d15ed8b70f2aa0fea8ae309d5e5671a500f619e3b348c8c15","up":true},{"one":"24b85c10f098725938ea7d87cd24a4b10358129906fca9790fc266ea8784b538","other":"49cd1efed6a56a78af4ea4ab40813013e76c6a5fb9d2029ee02db5d80f5e41a6","up":true},{"one":"898d2f7d46b4961b646d5a6142d54d6233b7f80f668ce234522dd02e2cc545cb","other":"03ccd8d52597d18c0b178ab7361d847d63aad3af920a28345977ae170a1dafcd","up":true},{"one":"baf219e9229921b773d1ad7eb7eb5216cfa60ccecaa3c5c487e3b71cb600ba12","other":"ca041da0dc514643d017458d08ff6962ec52c9e66571a239ec395dc8b2546709","up":true},{"one":"b65ee2549536a806ceef4a7ccc9544567cafe6204080929fc847df0a3781ccc9","other":"ac4d2d6836e2cdf4c88221f6013aac70a451dd15bc403288bd10d0b911cd9a2b","up":true},{"one":"b02b01a5c37cb05c287a3dc7d04e305de26f8d62dc388542eeb43e97db7b4282","other":"8f2182c2c2d0eeb2e887dbc350ae7257819f536032851ffdf29e7842cb1a62cc","up":true},{"one":"976e57d0c32227222bfd0cbb802f269bdcd52d5d33cf689c66b12c023f5fa8bf","other":"96fcf14c7f90350091ac6fcb58306ccfb9e4a38d3da59f8ab656854332844cbd","up":true},{"one":"17db15893bf39b42593ee1de975aba6832046d9da5b4b493ec44272738a29cef","other":"24b85c10f098725938ea7d87cd24a4b10358129906fca9790fc266ea8784b538","up":true},{"one":"f5b24a1fd2cd2908b408562f9a265ee1a692b137e770137afa5fdfa07b237221","other":"a3693801a91180410cf3e85d7c09ac8054a769e7b1d55c9e7a46850cb8217da0","up":true},{"one":"b02b01a5c37cb05c287a3dc7d04e305de26f8d62dc388542eeb43e97db7b4282","other":"9890e6ebb2c6f9a7bec4c2778e077e3710ce3af356f82ae9b4d324832d159ef7","up":true},{"one":"2c3894b6e47cf19ac7ee9fe213196312f676256f670dff25b03563492550bc74","other":"32371744163f0b3aefd3955dc4877e7eb82b17ef9541c333ca9c0a9f8aec3045","up":true},{"one":"103b232552b94090232195dc88f84823701f35ae536b5af6dd33fa655a33cbae","other":"0af9a57a2f66835cd3e4e71bc026013a8a99ca337a7b6b6cc34e11d8da212a4f","up":true},{"one":"11d43f6ed0ddd5afa5c8a7abf7c62a4fa865b7a25ee295bf1a49701ef3081363","other":"1c9caf028df31681b1457a54d4b3ab20009f9fa5bd12417a1ba7efe0c660e6bd","up":true},{"one":"18f6e66e1cc8e620808901b571fdf525ee8f41850fac0bd0e5c5a4de70c5f873","other":"1c47ad5bd8846f777daf59587feccc308f4dc63f6d27b1385ff8085c75bb1aac","up":true},{"one":"ef07be559914ec4b5930d90d8d8b6f32dab9eba23acc36f14d512307f9974348","other":"f629b8b9e79c75ac559daf9bf4fc8672bfdd595cf2c5d17a8885282626fc65a5","up":true},{"one":"d3b0dea1dd3ac71e7e4a30941632eec53cb980aa7cb6cdac95042a5400a878c3","other":"e54b643cbc95d9f5d27ec3760d892b6802981bfabf4f9979267d66259df982c7","up":true},{"one":"524db81b135af8dc309b942c082a7291dddb851866fc608753f937ee77015be0","other":"77d2ec52dabd5d7f326d4c6afd2aad110487c6bdffa2984060528716ba873462","up":true},{"one":"d863ba7405eb07ccddbf1d34efbcbec2867a93a109ed9413d9aecf30d3645a6a","other":"c9f5acafbbf8c66647de05b0848d79451eee490709d53f118fc2051410cc8203","up":true},{"one":"4d6b939fb67338c484948ab92b2ceea4d4b666d7e08773673cd7c8f83f495b89","other":"4c9eab8ab45405a6d4bab46430efc04b8e6aec1d944f88435eca41361925f379","up":true},{"one":"628e7da3359ed6d9dcfbafc7581966e4e09245c321ec78ca75587c9cbb44697f","other":"7dd3078c71087ab88d4d26a962820bcb79b8ce30e91c1f9a69d4bf8d38086960","up":true},{"one":"c59e3953b64e5b9ffbe53990a358914f2fa8e3551d33f92b9e3a441bd1baf2cd","other":"959fda0866d3c18e9399e98485d627044079d6f86b075edaea9315402f5d9395","up":true},{"one":"eb98fb45dd5754f24f9df0c9ecbb93932e3d9d7735cd6d0ddd4a8675bb4ef554","other":"f5b24a1fd2cd2908b408562f9a265ee1a692b137e770137afa5fdfa07b237221","up":true},{"one":"6ecb5c36fc0150c287446ae8a8682d629a1d39341230717206219babe3bdf659","other":"4d103ec5afee559a5a9242e8d650b67301eaec10e96fc2f184e34d48554108a2","up":true},{"one":"179f21d2e0421b8056ee9a260bc0985bfa64a52a36d0a8fbce4e03f3120d1d65","other":"0ff2d2c49547eebc96675e0b88073dea5e9091bee1843ffe567127e34486c348","up":true},{"one":"f27f1044777e05f3f60165d0d2fc3e7667fe148e0ca7a097805d60b9f61025f7","other":"f5b24a1fd2cd2908b408562f9a265ee1a692b137e770137afa5fdfa07b237221","up":true},{"one":"6c4dcdfdee0164a9a3f419430726dd51f9198c65ff6e7de7aaa6f632dcde6794","other":"6251e9540448726a601699ef4cd19e50c969a746da27228967338cdc09d628bf","up":true},{"one":"c620752a083ca1ff0398937235cf964133939452c293c799ce07ff8aa2bde420","other":"f773b83f1a1de2ab6660edb0b765cfccec6778061ee25c5a84f968625686ef60","up":true},{"one":"a46dd535e3bc8f111a8b2ce5594b62e87741c395e8a2b8fbae33edd29cb8caf8","other":"90a85cb7363ede161ec21cc89f8b9d4350e566cf10586a66d31b0a8677620aa1","up":true},{"one":"e775e9759d4701bd9b43c22f1d1be73c1262b2752bb23cb3857485daf1dcad2d","other":"af02b5d107b3a17f539c7f9020ebe74322434634e70c420a7f56776eb5d9db73","up":true},{"one":"21012a3a6ef1ece48fd9d7cffe62dc75839dd062efcf3ac5f962c237814da407","other":"3f946957d910179c7e1a83c44369aacfc31f5727b1a6421a01c8a978ccd349a2","up":true},{"one":"b02b01a5c37cb05c287a3dc7d04e305de26f8d62dc388542eeb43e97db7b4282","other":"499036eb9d10fc003c903f09ea0ee00c0d27b39564988d67ae111f3473d22f07","up":true},{"one":"1a2a0e0bbf83cd40936995674418ae469aa2b92876a4ceeabd8128f536b7d7a2","other":"5f00b3bebef2f5484ff1386298add68a6743a106200ae8a13a27dbb52714ee8f","up":true},{"one":"850575577d6b420a87aba388af481e0c044c2f75cf29ff934daf5674318a61ba","other":"fbc8087a723c564ca0139329902e79748af46699ea7be24d57909a7e8e96f681","up":true},{"one":"c620752a083ca1ff0398937235cf964133939452c293c799ce07ff8aa2bde420","other":"e54b643cbc95d9f5d27ec3760d892b6802981bfabf4f9979267d66259df982c7","up":true},{"one":"c59e3953b64e5b9ffbe53990a358914f2fa8e3551d33f92b9e3a441bd1baf2cd","other":"df1e4e46e8ec26cad74b4f35ab070f12c8f6fddca35ac44c1218ff60fe1e6bab","up":true},{"one":"461cc9f064e6f4f06ff38e0d1f3f00ef8807ba31c7258e453cc682e9551bb1c6","other":"33737df75bbac1b41c63f05ea2cf1523b972df17f22bda026db84a49ac35e1e3","up":true},{"one":"e775e9759d4701bd9b43c22f1d1be73c1262b2752bb23cb3857485daf1dcad2d","other":"c1f9e8e1d509febdf1f267bb227741e513420048a2e669ac9eef4b05a29cf10b","up":true},{"one":"68317431e4fa55be4a700e35c6a578307cc32b72336679b5c5618b622ef0c602","other":"16725e318322353befc2f2aba112f0984bc011821bb16c98e2cd8b39cd62aea1","up":true},{"one":"7dc2a9573f253f362ef1b21bbfcc144b11a6febc58aa3c4430224160e9fa738c","other":"7920d69cf7e458fce0781ea1a4e07768e1a69f6818090eff0abf0b4a0c2c35f8","up":true},{"one":"849bcbb9be43b799fefc5e689efc75125da27f536e97e5b7921031520ae6e5d8","other":"b2b5ba1bb188f18f79b295f2c0d48c52c1d1d449ecb9b94b9984f3a6179732c7","up":true},{"one":"5db08436c64f4cc9e2b3950e35bc8ad739825e3efa67a642c771d95b34cb420c","other":"53087084708cc5ee63ac459b18fa10ae52a823139b4ecba6c8691d4934f2f971","up":true},{"one":"d7aca8f2182bc625d2b3c942bd1161c85bcf1c2b34ecbe3e2fd23cfae6b8a871","other":"f2d5533eed4b0c184952d859d67e44abe5a75a5de6111c8c106b8f4b2d8ccfc4","up":true},{"one":"0438f567045d4556a0e7a697028d689ecfd0ae20f9e85c09b48d9f1fd0ee4765","other":"02d85b9f8e4776224ae5088683a87837b82b2bfb7e047cf373a28393e7aca6e1","up":true},{"one":"1b830ed484b274a96ec7ba2f9a42b6859412b5334a564014ff3f11597ea3a32d","other":"1f85b8c05e5dceff0bd8256f8f6d80d4b902a9754ceb952d95ea2e1150ef9e59","up":true},{"one":"77d2ec52dabd5d7f326d4c6afd2aad110487c6bdffa2984060528716ba873462","other":"738c2d42458965d03c8f9f055eaf0e3edf3dfa2a4de0a048ec05b78e7b765c90","up":true},{"one":"5f00b3bebef2f5484ff1386298add68a6743a106200ae8a13a27dbb52714ee8f","other":"610334a0772d3414652b575f2caa6f2db32224907c24d06fda643db9f2ec2afe","up":true},{"one":"378e7af7cc019186d4f2699e753e2d71302f8f3565572c13b7a1b1c5cb47443c","other":"3b88a472beba4a18f8df45678888fd359bac3823900eecfe0037fdc9ad54d416","up":true},{"one":"5cd2377226825dc7ea582315cd108d23502df4e9c7c09fc07e7b4aa56440de29","other":"534bcaa98cf9192b35b6014c650ae067e74332c015ebb516d63601427d7376b8","up":true},{"one":"7dbbdeba3731e1ff43072f8cbd86db147761e1b61753eea7024774dbf46914bd","other":"67dcfd21ece30b41a39bc55c0986fca8f401bb3acba821969519f09d0933e8bd","up":true},{"one":"ec52270604007673d1bfda1edbd8bfa945a21141efd85e42b684a9f30f8cddae","other":"caf6a8e37fd41c1e6ad77a8575cd90354bb1693893952301c9caeb4779c338d3","up":true},{"one":"c6cf46239078edfb343c645f039725fdee1bbba8b0a6da02e2cc456b9223c9a2","other":"db6a1f6b342f6be9517f8df01003797c11c837d9aee3cdba5b7859230b36c35d","up":true},{"one":"c59e3953b64e5b9ffbe53990a358914f2fa8e3551d33f92b9e3a441bd1baf2cd","other":"da67ace34f7076a1d550bc61bc2a31da88d6cd9f9df43b142a8c6bbade1b4aee","up":true},{"one":"db6a1f6b342f6be9517f8df01003797c11c837d9aee3cdba5b7859230b36c35d","other":"ee5e77df690329c132f2f7fca223cfd384b7bc34ec38763a4eb42780e0585656","up":true},{"one":"f7fa2986ec9f84822b11a6b00bd03a1dd26f2a0fab90b1b308f08caead43cfe1","other":"c49caff13862dc089f1f9b8180d6efa455648375662719272102c4f8028799d6","up":true},{"one":"db6a1f6b342f6be9517f8df01003797c11c837d9aee3cdba5b7859230b36c35d","other":"ca041da0dc514643d017458d08ff6962ec52c9e66571a239ec395dc8b2546709","up":true},{"one":"5db08436c64f4cc9e2b3950e35bc8ad739825e3efa67a642c771d95b34cb420c","other":"5f00b3bebef2f5484ff1386298add68a6743a106200ae8a13a27dbb52714ee8f","up":true},{"one":"4646fe4c119078738612b44a356089b3c73a08e11cfd910675d211ae6b20b8fd","other":"4d103ec5afee559a5a9242e8d650b67301eaec10e96fc2f184e34d48554108a2","up":true},{"one":"1b830ed484b274a96ec7ba2f9a42b6859412b5334a564014ff3f11597ea3a32d","other":"1c8a10ecbd72acb2bbbb8b77ea5404f9e90f4dbf306ec8134cfed70b40aef399","up":true},{"one":"4646fe4c119078738612b44a356089b3c73a08e11cfd910675d211ae6b20b8fd","other":"53087084708cc5ee63ac459b18fa10ae52a823139b4ecba6c8691d4934f2f971","up":true},{"one":"ec52270604007673d1bfda1edbd8bfa945a21141efd85e42b684a9f30f8cddae","other":"c832b4ad64a17da4b796ffcac646c2aa666b276aabb7eb3bfe7981d64a4da402","up":true},{"one":"1b830ed484b274a96ec7ba2f9a42b6859412b5334a564014ff3f11597ea3a32d","other":"0cf596af91eb9b041fe6dbe6b288c5730413850321b5ab176c81447e34ef79c5","up":true},{"one":"4ac755123dcc64ef44db9280311af51f3f7a93e0dee67370d673261220356eb9","other":"444722a15b01a0d8e6794798d239fe621d59bdfc08823ab47cbd8b9acebd23b4","up":true},{"one":"caf6a8e37fd41c1e6ad77a8575cd90354bb1693893952301c9caeb4779c338d3","other":"ca041da0dc514643d017458d08ff6962ec52c9e66571a239ec395dc8b2546709","up":true},{"one":"35e6b1d31f594c06b759525434a7e717ebe6f27ca0188f247ed1247664a50563","other":"21012a3a6ef1ece48fd9d7cffe62dc75839dd062efcf3ac5f962c237814da407","up":true},{"one":"7290cd3affade5f9e729d1b03549aceafb2576cdbc6789fd688c95495f10bacd","other":"5b632eaf700d173ff15f4727b85817e6173228c304b422434a08c2cad438b825","up":true},{"one":"af02b5d107b3a17f539c7f9020ebe74322434634e70c420a7f56776eb5d9db73","other":"a34ea2e87d4c12adb27d66c2c95300603ff50415974e000bbcc69a5ae059dbf1","up":true},{"one":"3f946957d910179c7e1a83c44369aacfc31f5727b1a6421a01c8a978ccd349a2","other":"51db114a52827f5b74088bd0fc87d35229e7740e7d121bd7699298396516a880","up":true},{"one":"5cd2377226825dc7ea582315cd108d23502df4e9c7c09fc07e7b4aa56440de29","other":"41d9c03e44bec3f84a6139ce40ef1e390530f38ed11860575acfad03a49db095","up":true},{"one":"efeae3b7f610dc10acc51068e7718876d147cd78a9a28788c5dba5bb3a6950dc","other":"b5025d153581d333b44df4b9bfa69d87de138905172e4fd317e16f7099a5fcf8","up":true},{"one":"1436aaa8770e9f1c6294e49f4066c16b1caa50524e9b8fd058059e41657d2a83","other":"0c28cd1315890629896d0fe5517524d4eb788f7444709c135ea690ba4e6103d5","up":true},{"one":"ae2b3876bdbd6388781b65e31de182564c5d81f4511caf96588b1a287760b3dd","other":"ef1b70bf090bc9994b1d45e2812c56ecb430a89c346a436bd10880bcda700351","up":true},{"one":"ae2b3876bdbd6388781b65e31de182564c5d81f4511caf96588b1a287760b3dd","other":"b7cafed41dac01dd59e2bcaeaaab551ebfeab8eaa1f97c1866fe0ddae772807b","up":true},{"one":"5f00b3bebef2f5484ff1386298add68a6743a106200ae8a13a27dbb52714ee8f","other":"444722a15b01a0d8e6794798d239fe621d59bdfc08823ab47cbd8b9acebd23b4","up":true},{"one":"7dbbdeba3731e1ff43072f8cbd86db147761e1b61753eea7024774dbf46914bd","other":"6251e9540448726a601699ef4cd19e50c969a746da27228967338cdc09d628bf","up":true},{"one":"5f00b3bebef2f5484ff1386298add68a6743a106200ae8a13a27dbb52714ee8f","other":"5b632eaf700d173ff15f4727b85817e6173228c304b422434a08c2cad438b825","up":true},{"one":"7dbbdeba3731e1ff43072f8cbd86db147761e1b61753eea7024774dbf46914bd","other":"7125e05bf1bfe6df948c9276b62bc755fc6b0ec8d4ac7724b61ea49591adcf25","up":true},{"one":"582330d8b8c49331b2aec790dc7325b9cd483fc8129323d31ec429d545042964","other":"4d6b939fb67338c484948ab92b2ceea4d4b666d7e08773673cd7c8f83f495b89","up":true},{"one":"4646fe4c119078738612b44a356089b3c73a08e11cfd910675d211ae6b20b8fd","other":"6c73150490e8be9677c40086de0aefed1939581048e26f4a93f5ca26571a1a8f","up":true},{"one":"efeae3b7f610dc10acc51068e7718876d147cd78a9a28788c5dba5bb3a6950dc","other":"c1f9e8e1d509febdf1f267bb227741e513420048a2e669ac9eef4b05a29cf10b","up":true},{"one":"9852ce267d53106a6e584d6eddb08e0062eb4a422d2a8d39ad6dccaebac552ff","other":"9fa0215e980dc907df4cc47ab4937f36527d78f9837493016fd4fc51e617299c","up":true},{"one":"6ecb5c36fc0150c287446ae8a8682d629a1d39341230717206219babe3bdf659","other":"53087084708cc5ee63ac459b18fa10ae52a823139b4ecba6c8691d4934f2f971","up":true},{"one":"1436aaa8770e9f1c6294e49f4066c16b1caa50524e9b8fd058059e41657d2a83","other":"21a044e772b7c955fe4a6fb7c3a9a20e95d48b7fd6b9518741782f04f5f1f5c2","up":true},{"one":"4ac755123dcc64ef44db9280311af51f3f7a93e0dee67370d673261220356eb9","other":"46fee69dad8b6a6a87d356d10db25d835a0c4e154bf179e88fb4cc65f97d72d7","up":true},{"one":"3b78bc987c7c31c94e8ada9b4b11b5db9387fe70dd01ce7f3e976d3bec433dec","other":"2c79af7ea85f96db7897cf8cdb4d002ad2308194e03981876edb8d904ef65137","up":true},{"one":"314a3530a5e0c37d5609149b3ae9c2e078573346bd8fce3c769ebaeb31726ec1","other":"3b88a472beba4a18f8df45678888fd359bac3823900eecfe0037fdc9ad54d416","up":true},{"one":"b5b24532d2810e311e10b1d606baf6007f9124b88a178b32713cf1eddae089be","other":"b5025d153581d333b44df4b9bfa69d87de138905172e4fd317e16f7099a5fcf8","up":true},{"one":"7290cd3affade5f9e729d1b03549aceafb2576cdbc6789fd688c95495f10bacd","other":"53a885968d68d8ebf7ed514e662cc13fa03186d2361000a03576531fdca2a25f","up":true},{"one":"0743bcf2aaa77e916f4a367d6159473c7d80f46a2e4cbe9ef346e423d39d7072","other":"6ecb5c36fc0150c287446ae8a8682d629a1d39341230717206219babe3bdf659","up":true},{"one":"df1e4e46e8ec26cad74b4f35ab070f12c8f6fddca35ac44c1218ff60fe1e6bab","other":"c9f5acafbbf8c66647de05b0848d79451eee490709d53f118fc2051410cc8203","up":true},{"one":"0fc59bd04ac9de3195e3c9d0eb573952a5805dd2e7e572078b6e996778adec73","other":"90765b72283f59be4cf9bf7a9e9a22fd6db701c3603cbc0817b4adf2f8e9ce08","up":true},{"one":"b5b24532d2810e311e10b1d606baf6007f9124b88a178b32713cf1eddae089be","other":"82f9c9009f09de2d6a77b54976d14c14211eae65d886f6ed57560c700716dd5c","up":true},{"one":"e8efe8016fe6cf649b2755bee22da35ccc6c9c55d404d5385d61f6ea27b84380","other":"e5d794d64003725a74642f097c0ee76706d78419b6f3ea819d440bc0ad166eac","up":true},{"one":"7290cd3affade5f9e729d1b03549aceafb2576cdbc6789fd688c95495f10bacd","other":"7a608d2cf9d1d9c5819dc1f9e88e5cb2852aadea01c40e047c2e184b62e7163c","up":true},{"one":"f7fa2986ec9f84822b11a6b00bd03a1dd26f2a0fab90b1b308f08caead43cfe1","other":"f7baef876a62b92ebe5ca9ec6a085e0eb54fd31e2425e662eec747df3cd77592","up":true},{"one":"f7fa2986ec9f84822b11a6b00bd03a1dd26f2a0fab90b1b308f08caead43cfe1","other":"88fefb7506105c0e269baf52955a01b19f55504b13133bac0beab41c9f6e6942","up":true},{"one":"66e7fc2df51f5df8d7329851fe9357d895e9d5dfdc25f8d92bdb10a960f7e15a","other":"7125e05bf1bfe6df948c9276b62bc755fc6b0ec8d4ac7724b61ea49591adcf25","up":true},{"one":"ec52270604007673d1bfda1edbd8bfa945a21141efd85e42b684a9f30f8cddae","other":"c49caff13862dc089f1f9b8180d6efa455648375662719272102c4f8028799d6","up":true},{"one":"3b88a472beba4a18f8df45678888fd359bac3823900eecfe0037fdc9ad54d416","other":"21a044e772b7c955fe4a6fb7c3a9a20e95d48b7fd6b9518741782f04f5f1f5c2","up":true},{"one":"3f946957d910179c7e1a83c44369aacfc31f5727b1a6421a01c8a978ccd349a2","other":"2a97d308a720274a440dfa6901ca0a5480af9bab58dd8a6c4afdb9c83ea964c3","up":true},{"one":"1f670c53b4c597beaffacd84e3a697225b04cded9219d0a28e1fe525a3cadcf5","other":"6f5f5a77e6092e25e5308413e02ba62c1c559024893a7fb98e26b0f34fed8bfe","up":true},{"one":"41092c852fac630df2a9ca0862716f8e9fb8566c904a49c96389071046bc699d","other":"41d9c03e44bec3f84a6139ce40ef1e390530f38ed11860575acfad03a49db095","up":true},{"one":"53087084708cc5ee63ac459b18fa10ae52a823139b4ecba6c8691d4934f2f971","other":"461cc9f064e6f4f06ff38e0d1f3f00ef8807ba31c7258e453cc682e9551bb1c6","up":true},{"one":"39d1fcae2d23c775214988251505c577b9ac7b6851558ddf9a437dfe143f3845","other":"605a46991af15cd60e67413c712b99ff8f21173c96a7990f2728ad6cac2bb9d8","up":true},{"one":"efeae3b7f610dc10acc51068e7718876d147cd78a9a28788c5dba5bb3a6950dc","other":"fe2167fd33f383110eb3f6caa7bd905ca54fa0c810f1b8a34483a846f3cbddab","up":true},{"one":"af02b5d107b3a17f539c7f9020ebe74322434634e70c420a7f56776eb5d9db73","other":"b2b5ba1bb188f18f79b295f2c0d48c52c1d1d449ecb9b94b9984f3a6179732c7","up":true},{"one":"f31cc744ea921fee8364c5269b1ce7ec6b5f0c0cbb6885efbf602de5b36f6169","other":"efeae3b7f610dc10acc51068e7718876d147cd78a9a28788c5dba5bb3a6950dc","up":true},{"one":"0e5e0bb1383b2ec569b157a1d2ae6900592ab892a28367f5613a4e29cb265088","other":"11d43f6ed0ddd5afa5c8a7abf7c62a4fa865b7a25ee295bf1a49701ef3081363","up":true},{"one":"82f9c9009f09de2d6a77b54976d14c14211eae65d886f6ed57560c700716dd5c","other":"b626d472b555e6f950a7142783db8deb443a74e63ef6bd72a87eaf1af14ca805","up":true},{"one":"ff36a8810dd44f6d1fa42aa91ff6206bcfb4c1ffbab0df73a181daece329e0e3","other":"e5d794d64003725a74642f097c0ee76706d78419b6f3ea819d440bc0ad166eac","up":true},{"one":"d7aca8f2182bc625d2b3c942bd1161c85bcf1c2b34ecbe3e2fd23cfae6b8a871","other":"ca041da0dc514643d017458d08ff6962ec52c9e66571a239ec395dc8b2546709","up":true},{"one":"67aa5463e4b32b363b3d01d2a41ccb03199411057276f4962d053160be29a6ef","other":"7a608d2cf9d1d9c5819dc1f9e88e5cb2852aadea01c40e047c2e184b62e7163c","up":true},{"one":"fbf5e917be45e909697a9393c4778206333cf1dd9a103978e8d71622ca3b1cc8","other":"f925c85e6457ac01f0cd6b297155f9d3ae611603890d8f3a45e1396d937f8680","up":true},{"one":"58ed74695bf527bac9a350c86d305e53e08c4999795e11cd3b2a36f5cd25d637","other":"5f00b3bebef2f5484ff1386298add68a6743a106200ae8a13a27dbb52714ee8f","up":true},{"one":"e5149cedd990072f2aaa9735a9259f28973c45876660c2d86ac105e56cca8e68","other":"d887070a0568282c69e96ce65612ba72d5ea26b5c80671435d6e1ed2c4b49301","up":true},{"one":"478278187cd9af799e83340a2f49b0b7f122fb8e08c0a372a87795426eab364b","other":"47bfa3767cefcc0831d410d5402e9396e8a412c8c96faf55b451d3ff310f3b02","up":true},{"one":"41092c852fac630df2a9ca0862716f8e9fb8566c904a49c96389071046bc699d","other":"53fe2c13926507a7a6c27d0fb30a2c358c4c7bfa40df8b5fa8ec8986c2450519","up":true},{"one":"ad9899f78659492ec248a884927a757f3f3b4e76cd2abc46ad8766251fd8afed","other":"a3693801a91180410cf3e85d7c09ac8054a769e7b1d55c9e7a46850cb8217da0","up":true},{"one":"3b78bc987c7c31c94e8ada9b4b11b5db9387fe70dd01ce7f3e976d3bec433dec","other":"3f946957d910179c7e1a83c44369aacfc31f5727b1a6421a01c8a978ccd349a2","up":true},{"one":"77d2ec52dabd5d7f326d4c6afd2aad110487c6bdffa2984060528716ba873462","other":"7290cd3affade5f9e729d1b03549aceafb2576cdbc6789fd688c95495f10bacd","up":true},{"one":"ae2b3876bdbd6388781b65e31de182564c5d81f4511caf96588b1a287760b3dd","other":"bcc6724e54f761361f85147eb102a8d1a1a38810a940ce76b1e361ddcadacaa3","up":true},{"one":"6f5f5a77e6092e25e5308413e02ba62c1c559024893a7fb98e26b0f34fed8bfe","other":"4d103ec5afee559a5a9242e8d650b67301eaec10e96fc2f184e34d48554108a2","up":true},{"one":"e5d794d64003725a74642f097c0ee76706d78419b6f3ea819d440bc0ad166eac","other":"e5ada0415c92ef1511b15d04edf395976464afd9adc3e929c41d4d21d25e3182","up":true},{"one":"0743bcf2aaa77e916f4a367d6159473c7d80f46a2e4cbe9ef346e423d39d7072","other":"fe316679eca0e0eb823325812a56fd27da02653b06ada2fd03b27501bda8371a","up":true},{"one":"179f21d2e0421b8056ee9a260bc0985bfa64a52a36d0a8fbce4e03f3120d1d65","other":"154be9255e9aebd134a914070f5e6f3d4bba079d9ca738b74244db14e1b586dd","up":true},{"one":"14dfb8414d17b2df15eaf59571a8cfec99b1fd674561da63ee99af853bda07da","other":"1c9caf028df31681b1457a54d4b3ab20009f9fa5bd12417a1ba7efe0c660e6bd","up":true},{"one":"e775e9759d4701bd9b43c22f1d1be73c1262b2752bb23cb3857485daf1dcad2d","other":"aeb4c75a57ccfc9ac053a3d363cf7c1e3e201406587769ab6615d5c2f86a5410","up":true},{"one":"0e5e0bb1383b2ec569b157a1d2ae6900592ab892a28367f5613a4e29cb265088","other":"14dfb8414d17b2df15eaf59571a8cfec99b1fd674561da63ee99af853bda07da","up":true},{"one":"2c3894b6e47cf19ac7ee9fe213196312f676256f670dff25b03563492550bc74","other":"2d3645c4fdf9a2809a909076b9ee5fb98fa880f6faeff914f1a2987af928cd79","up":true},{"one":"41d9c03e44bec3f84a6139ce40ef1e390530f38ed11860575acfad03a49db095","other":"4c9eab8ab45405a6d4bab46430efc04b8e6aec1d944f88435eca41361925f379","up":true},{"one":"915d7a0510bad19266eef8f00ca0cb2efc340253775706495fca8b9160b512cc","other":"f629b8b9e79c75ac559daf9bf4fc8672bfdd595cf2c5d17a8885282626fc65a5","up":true},{"one":"2c3894b6e47cf19ac7ee9fe213196312f676256f670dff25b03563492550bc74","other":"20aeb14f567dd16f06b0d3b589b83283daa00a5ed10e447860bda946baccdd2d","up":true},{"one":"7920d69cf7e458fce0781ea1a4e07768e1a69f6818090eff0abf0b4a0c2c35f8","other":"67dcfd21ece30b41a39bc55c0986fca8f401bb3acba821969519f09d0933e8bd","up":true},{"one":"915d7a0510bad19266eef8f00ca0cb2efc340253775706495fca8b9160b512cc","other":"9d0f804849b72397646ba48208ba1e01dcf4de04e788016c4a1a0c93e650ddf5","up":true},{"one":"499036eb9d10fc003c903f09ea0ee00c0d27b39564988d67ae111f3473d22f07","other":"6e68ea86440706a0d73a9508f2247492543163f8fa7e2dc2aa62b74d50261b8b","up":true},{"one":"fe2167fd33f383110eb3f6caa7bd905ca54fa0c810f1b8a34483a846f3cbddab","other":"e5ada0415c92ef1511b15d04edf395976464afd9adc3e929c41d4d21d25e3182","up":true},{"one":"0d8a919207fb2d5718eab7da95f8efeb01a4e1ae39602d315f8ba2ff1752d9da","other":"37801e8d7d46143f78924ed66099f658a94d37edfd2f58d02acb85add03e1894","up":true},{"one":"256e81c5a6fb43bd343345477f8f96aa1947f07ac3297f631ab03f060147b062","other":"0d8a919207fb2d5718eab7da95f8efeb01a4e1ae39602d315f8ba2ff1752d9da","up":true},{"one":"c8986871e46f001d15ed8b70f2aa0fea8ae309d5e5671a500f619e3b348c8c15","other":"d3b0dea1dd3ac71e7e4a30941632eec53cb980aa7cb6cdac95042a5400a878c3","up":true},{"one":"217f9952af1eb58d5ca5ac7be763716cfe2c0a4f3cdd4ebe4b5df563f919e2d2","other":"2a0a8eaf1a2749e68f8b841578c160699cf7907ff23842c6d616ad884e5f613e","up":true},{"one":"ef07be559914ec4b5930d90d8d8b6f32dab9eba23acc36f14d512307f9974348","other":"8f2182c2c2d0eeb2e887dbc350ae7257819f536032851ffdf29e7842cb1a62cc","up":true},{"one":"82f9c9009f09de2d6a77b54976d14c14211eae65d886f6ed57560c700716dd5c","other":"96fcf14c7f90350091ac6fcb58306ccfb9e4a38d3da59f8ab656854332844cbd","up":true},{"one":"444722a15b01a0d8e6794798d239fe621d59bdfc08823ab47cbd8b9acebd23b4","other":"2a0a8eaf1a2749e68f8b841578c160699cf7907ff23842c6d616ad884e5f613e","up":true},{"one":"6c73150490e8be9677c40086de0aefed1939581048e26f4a93f5ca26571a1a8f","other":"67dcfd21ece30b41a39bc55c0986fca8f401bb3acba821969519f09d0933e8bd","up":true},{"one":"e027a9f7152641c4a41154f8ce4dafd23895c312150efea86bf4152c88d0ca86","other":"c43fbee95380007274b8f231fe34bcd59b5c0ef0830b174967d4702627984fc6","up":true},{"one":"0c28cd1315890629896d0fe5517524d4eb788f7444709c135ea690ba4e6103d5","other":"1c8a10ecbd72acb2bbbb8b77ea5404f9e90f4dbf306ec8134cfed70b40aef399","up":true},{"one":"7b90e939ae2a240f0d74a923afb6bbf11f6d5b99a7bf85f1825b1ea36bce744c","other":"6e05179dc90a8f6654d0c9a3f06173371dcfb18b852fdd77f35f75e38f273125","up":true},{"one":"444722a15b01a0d8e6794798d239fe621d59bdfc08823ab47cbd8b9acebd23b4","other":"1a2a0e0bbf83cd40936995674418ae469aa2b92876a4ceeabd8128f536b7d7a2","up":true},{"one":"915d7a0510bad19266eef8f00ca0cb2efc340253775706495fca8b9160b512cc","other":"898d2f7d46b4961b646d5a6142d54d6233b7f80f668ce234522dd02e2cc545cb","up":true},{"one":"455936fd22c43794e6e2104fd91d3f5d246e3823e8ff8eaf8dc27aa9f3d2ee08","other":"574f65867482091aee2774033116c233525eea711706b5ae9ba09b54e896d302","up":true},{"one":"88a141c607019477c7b120a506285a7218cad2faa038082e0b9ddfcc9cb78d07","other":"f925c85e6457ac01f0cd6b297155f9d3ae611603890d8f3a45e1396d937f8680","up":true},{"one":"e775e9759d4701bd9b43c22f1d1be73c1262b2752bb23cb3857485daf1dcad2d","other":"e7fa7112adc7b023dd5965e620277122542153f87eaf5deeacc8a51f1778ba77","up":true},{"one":"ef1b70bf090bc9994b1d45e2812c56ecb430a89c346a436bd10880bcda700351","other":"8f2182c2c2d0eeb2e887dbc350ae7257819f536032851ffdf29e7842cb1a62cc","up":true},{"one":"88a141c607019477c7b120a506285a7218cad2faa038082e0b9ddfcc9cb78d07","other":"aeb4c75a57ccfc9ac053a3d363cf7c1e3e201406587769ab6615d5c2f86a5410","up":true},{"one":"45584a4bebb948ef5f7b55d4846ec5549d7623682169c0edcab5b3523e68c7da","other":"976e57d0c32227222bfd0cbb802f269bdcd52d5d33cf689c66b12c023f5fa8bf","up":true},{"one":"66e7fc2df51f5df8d7329851fe9357d895e9d5dfdc25f8d92bdb10a960f7e15a","other":"6ea51fb6e4783f351dbbfa47b508c78c73233ebaada409dfb55446217f92c4bd","up":true},{"one":"886aff1f1e3b86bfe901066bb7948451c18fe3f8cd1b7318b05154890ca8f738","other":"9d0f804849b72397646ba48208ba1e01dcf4de04e788016c4a1a0c93e650ddf5","up":true},{"one":"f925c85e6457ac01f0cd6b297155f9d3ae611603890d8f3a45e1396d937f8680","other":"90a85cb7363ede161ec21cc89f8b9d4350e566cf10586a66d31b0a8677620aa1","up":true},{"one":"88fefb7506105c0e269baf52955a01b19f55504b13133bac0beab41c9f6e6942","other":"9d0f804849b72397646ba48208ba1e01dcf4de04e788016c4a1a0c93e650ddf5","up":true},{"one":"0c28cd1315890629896d0fe5517524d4eb788f7444709c135ea690ba4e6103d5","other":"179f21d2e0421b8056ee9a260bc0985bfa64a52a36d0a8fbce4e03f3120d1d65","up":true},{"one":"11d43f6ed0ddd5afa5c8a7abf7c62a4fa865b7a25ee295bf1a49701ef3081363","other":"7dd3078c71087ab88d4d26a962820bcb79b8ce30e91c1f9a69d4bf8d38086960","up":true},{"one":"f629b8b9e79c75ac559daf9bf4fc8672bfdd595cf2c5d17a8885282626fc65a5","other":"f7baef876a62b92ebe5ca9ec6a085e0eb54fd31e2425e662eec747df3cd77592","up":true},{"one":"6ea51fb6e4783f351dbbfa47b508c78c73233ebaada409dfb55446217f92c4bd","other":"738c2d42458965d03c8f9f055eaf0e3edf3dfa2a4de0a048ec05b78e7b765c90","up":true},{"one":"07a8c900fec6c477580ed5b38848a8681dc52a19e59fa4cd32f571fe7fb2383a","other":"1436aaa8770e9f1c6294e49f4066c16b1caa50524e9b8fd058059e41657d2a83","up":true},{"one":"a653302730df3d58f796906a93933aa81494f2588d9485ab7676ec3b0ccbb426","other":"b626d472b555e6f950a7142783db8deb443a74e63ef6bd72a87eaf1af14ca805","up":true},{"one":"7dbbdeba3731e1ff43072f8cbd86db147761e1b61753eea7024774dbf46914bd","other":"7e0458ecdf7081443cab5412529f3948ece659facaca03208496c80dd136e704","up":true},{"one":"886aff1f1e3b86bfe901066bb7948451c18fe3f8cd1b7318b05154890ca8f738","other":"8f2182c2c2d0eeb2e887dbc350ae7257819f536032851ffdf29e7842cb1a62cc","up":true},{"one":"ef07be559914ec4b5930d90d8d8b6f32dab9eba23acc36f14d512307f9974348","other":"ec52270604007673d1bfda1edbd8bfa945a21141efd85e42b684a9f30f8cddae","up":true},{"one":"45584a4bebb948ef5f7b55d4846ec5549d7623682169c0edcab5b3523e68c7da","other":"82f9c9009f09de2d6a77b54976d14c14211eae65d886f6ed57560c700716dd5c","up":true},{"one":"ef07be559914ec4b5930d90d8d8b6f32dab9eba23acc36f14d512307f9974348","other":"df1e4e46e8ec26cad74b4f35ab070f12c8f6fddca35ac44c1218ff60fe1e6bab","up":true},{"one":"898d2f7d46b4961b646d5a6142d54d6233b7f80f668ce234522dd02e2cc545cb","other":"ba884e5cfa1ee6eb38217181711e01bb0c37b3e33d1424dfa89ed3e29ef6205b","up":true},{"one":"a46dd535e3bc8f111a8b2ce5594b62e87741c395e8a2b8fbae33edd29cb8caf8","other":"b2a563ac59bab4dfddf7b6e27b80ee7afdeb2e4295411107903f484bcf9fc4f2","up":true},{"one":"7b90e939ae2a240f0d74a923afb6bbf11f6d5b99a7bf85f1825b1ea36bce744c","other":"6c4dcdfdee0164a9a3f419430726dd51f9198c65ff6e7de7aaa6f632dcde6794","up":true},{"one":"33b5c521b4208e26414db2e05c9a8ccc001a524d928579d44d2e74d14a56593e","other":"3630e05326bacea8fcc739dec42085f845f416ddc698c76ff91f099eb1dc5007","up":true},{"one":"ef07be559914ec4b5930d90d8d8b6f32dab9eba23acc36f14d512307f9974348","other":"e5d794d64003725a74642f097c0ee76706d78419b6f3ea819d440bc0ad166eac","up":true},{"one":"f629b8b9e79c75ac559daf9bf4fc8672bfdd595cf2c5d17a8885282626fc65a5","other":"c441d27a5f4abaa8e3b0f040a6ef85bb8c970031d6a57503a674e36b3d6915d9","up":true},{"one":"b02b01a5c37cb05c287a3dc7d04e305de26f8d62dc388542eeb43e97db7b4282","other":"88a141c607019477c7b120a506285a7218cad2faa038082e0b9ddfcc9cb78d07","up":true},{"one":"ac4d2d6836e2cdf4c88221f6013aac70a451dd15bc403288bd10d0b911cd9a2b","other":"c832b4ad64a17da4b796ffcac646c2aa666b276aabb7eb3bfe7981d64a4da402","up":true},{"one":"4636f00be60a9b494a3ebc9ab41cc7cb53ec0b0beff214db2d0a248dc3aeb6af","other":"4c9eab8ab45405a6d4bab46430efc04b8e6aec1d944f88435eca41361925f379","up":true},{"one":"ad9899f78659492ec248a884927a757f3f3b4e76cd2abc46ad8766251fd8afed","other":"ae2b3876bdbd6388781b65e31de182564c5d81f4511caf96588b1a287760b3dd","up":true},{"one":"e8548b5df15adf0f2a997ff5709827beb5e1d36bb08a2f2d017746d5c0e83fca","other":"f773b83f1a1de2ab6660edb0b765cfccec6778061ee25c5a84f968625686ef60","up":true},{"one":"0c64e5af869b1665fd4016ae6d04c8eedd423636f06d78ecb944ee8e3272a82a","other":"1f670c53b4c597beaffacd84e3a697225b04cded9219d0a28e1fe525a3cadcf5","up":true},{"one":"e027a9f7152641c4a41154f8ce4dafd23895c312150efea86bf4152c88d0ca86","other":"e8830f2b2f7d08df15bd33f4b2841d01d9d62c1621234bd6ae86743e52360f3e","up":true},{"one":"e54784cfbcd89c37c8f758aae70ece3ab4b7f8c30fb4ef7543e04aa89ff4386b","other":"915d7a0510bad19266eef8f00ca0cb2efc340253775706495fca8b9160b512cc","up":true},{"one":"1f85b8c05e5dceff0bd8256f8f6d80d4b902a9754ceb952d95ea2e1150ef9e59","other":"0d8a919207fb2d5718eab7da95f8efeb01a4e1ae39602d315f8ba2ff1752d9da","up":true},{"one":"45584a4bebb948ef5f7b55d4846ec5549d7623682169c0edcab5b3523e68c7da","other":"959fda0866d3c18e9399e98485d627044079d6f86b075edaea9315402f5d9395","up":true},{"one":"1436aaa8770e9f1c6294e49f4066c16b1caa50524e9b8fd058059e41657d2a83","other":"140020a23a840b8840ba0c2c384f853a606330e9743885e9967cf49533db282e","up":true},{"one":"534bcaa98cf9192b35b6014c650ae067e74332c015ebb516d63601427d7376b8","other":"4e5a46c004e85cf86a02fdfbf2243018825d015debfb9a077a1283d302293b3a","up":true},{"one":"2d3645c4fdf9a2809a909076b9ee5fb98fa880f6faeff914f1a2987af928cd79","other":"2ccfb5b1f3923d35fef88838c508b98b5516c5d409643881d2304ae49e50eed3","up":true},{"one":"a46dd535e3bc8f111a8b2ce5594b62e87741c395e8a2b8fbae33edd29cb8caf8","other":"90765b72283f59be4cf9bf7a9e9a22fd6db701c3603cbc0817b4adf2f8e9ce08","up":true},{"one":"4d59cf1aeecf370e94a7a231887450cef97053b9c88a7fd11e210840af070e29","other":"4d6b939fb67338c484948ab92b2ceea4d4b666d7e08773673cd7c8f83f495b89","up":true},{"one":"b626d472b555e6f950a7142783db8deb443a74e63ef6bd72a87eaf1af14ca805","other":"baf219e9229921b773d1ad7eb7eb5216cfa60ccecaa3c5c487e3b71cb600ba12","up":true},{"one":"baddc778aea97acdbbb5bc99744a5545abab9f6047c81f328761645287ac391c","other":"bb90464f769a85549c150f861775aa67924c7c651f393f6c70772707376a5c7e","up":true},{"one":"6ea51fb6e4783f351dbbfa47b508c78c73233ebaada409dfb55446217f92c4bd","other":"6f2d756566dd5b4a13ffeea9f687c785148f3407a502e28b9d6edfd03b905fdc","up":true},{"one":"7920d69cf7e458fce0781ea1a4e07768e1a69f6818090eff0abf0b4a0c2c35f8","other":"524db81b135af8dc309b942c082a7291dddb851866fc608753f937ee77015be0","up":true},{"one":"4d59cf1aeecf370e94a7a231887450cef97053b9c88a7fd11e210840af070e29","other":"4646fe4c119078738612b44a356089b3c73a08e11cfd910675d211ae6b20b8fd","up":true},{"one":"f773b83f1a1de2ab6660edb0b765cfccec6778061ee25c5a84f968625686ef60","other":"cc2037c08942a094df12f45831f28e0015fc3ac04d5b8f24ffea9bf3a0b02c39","up":true},{"one":"4a8b610e09d35aa21c42ab8c3e38de600a944c094e6b86ea56828b5e6904f1f7","other":"47bfa3767cefcc0831d410d5402e9396e8a412c8c96faf55b451d3ff310f3b02","up":true},{"one":"7920d69cf7e458fce0781ea1a4e07768e1a69f6818090eff0abf0b4a0c2c35f8","other":"738c2d42458965d03c8f9f055eaf0e3edf3dfa2a4de0a048ec05b78e7b765c90","up":true},{"one":"ba884e5cfa1ee6eb38217181711e01bb0c37b3e33d1424dfa89ed3e29ef6205b","other":"bb90464f769a85549c150f861775aa67924c7c651f393f6c70772707376a5c7e","up":true},{"one":"4636f00be60a9b494a3ebc9ab41cc7cb53ec0b0beff214db2d0a248dc3aeb6af","other":"4a8b610e09d35aa21c42ab8c3e38de600a944c094e6b86ea56828b5e6904f1f7","up":true},{"one":"5b632eaf700d173ff15f4727b85817e6173228c304b422434a08c2cad438b825","other":"444722a15b01a0d8e6794798d239fe621d59bdfc08823ab47cbd8b9acebd23b4","up":true},{"one":"886aff1f1e3b86bfe901066bb7948451c18fe3f8cd1b7318b05154890ca8f738","other":"b65ee2549536a806ceef4a7ccc9544567cafe6204080929fc847df0a3781ccc9","up":true},{"one":"b7cafed41dac01dd59e2bcaeaaab551ebfeab8eaa1f97c1866fe0ddae772807b","other":"a3693801a91180410cf3e85d7c09ac8054a769e7b1d55c9e7a46850cb8217da0","up":true},{"one":"af02b5d107b3a17f539c7f9020ebe74322434634e70c420a7f56776eb5d9db73","other":"82dd83838cb982b89505ef249d353a20e434346dd78b71cd9b809f71d5c112da","up":true},{"one":"ef1b70bf090bc9994b1d45e2812c56ecb430a89c346a436bd10880bcda700351","other":"d887070a0568282c69e96ce65612ba72d5ea26b5c80671435d6e1ed2c4b49301","up":true},{"one":"b7cafed41dac01dd59e2bcaeaaab551ebfeab8eaa1f97c1866fe0ddae772807b","other":"8f2182c2c2d0eeb2e887dbc350ae7257819f536032851ffdf29e7842cb1a62cc","up":true},{"one":"154be9255e9aebd134a914070f5e6f3d4bba079d9ca738b74244db14e1b586dd","other":"16725e318322353befc2f2aba112f0984bc011821bb16c98e2cd8b39cd62aea1","up":true},{"one":"0cf596af91eb9b041fe6dbe6b288c5730413850321b5ab176c81447e34ef79c5","other":"18f6e66e1cc8e620808901b571fdf525ee8f41850fac0bd0e5c5a4de70c5f873","up":true},{"one":"534bcaa98cf9192b35b6014c650ae067e74332c015ebb516d63601427d7376b8","other":"5efb3bfc199f5408f79bd6bd5171b4bf332c68a8e49242eb4f6a589b963565c6","up":true},{"one":"c1f9e8e1d509febdf1f267bb227741e513420048a2e669ac9eef4b05a29cf10b","other":"ee5e77df690329c132f2f7fca223cfd384b7bc34ec38763a4eb42780e0585656","up":true},{"one":"d29941d6b8acd86cf32fd1c2181da3ab1da3c2083134b068ca49ce29aa86b783","other":"ee5e77df690329c132f2f7fca223cfd384b7bc34ec38763a4eb42780e0585656","up":true},{"one":"2c3894b6e47cf19ac7ee9fe213196312f676256f670dff25b03563492550bc74","other":"444722a15b01a0d8e6794798d239fe621d59bdfc08823ab47cbd8b9acebd23b4","up":true},{"one":"0c64e5af869b1665fd4016ae6d04c8eedd423636f06d78ecb944ee8e3272a82a","other":"1e2aca93fa9442a0034ae8d295530dde16fcbfa8c37227e2e6863babb0f87c34","up":true},{"one":"217f9952af1eb58d5ca5ac7be763716cfe2c0a4f3cdd4ebe4b5df563f919e2d2","other":"2c3894b6e47cf19ac7ee9fe213196312f676256f670dff25b03563492550bc74","up":true},{"one":"53a885968d68d8ebf7ed514e662cc13fa03186d2361000a03576531fdca2a25f","other":"45584a4bebb948ef5f7b55d4846ec5549d7623682169c0edcab5b3523e68c7da","up":true},{"one":"0743bcf2aaa77e916f4a367d6159473c7d80f46a2e4cbe9ef346e423d39d7072","other":"6f5f5a77e6092e25e5308413e02ba62c1c559024893a7fb98e26b0f34fed8bfe","up":true},{"one":"51db114a52827f5b74088bd0fc87d35229e7740e7d121bd7699298396516a880","other":"41092c852fac630df2a9ca0862716f8e9fb8566c904a49c96389071046bc699d","up":true},{"one":"4a8b610e09d35aa21c42ab8c3e38de600a944c094e6b86ea56828b5e6904f1f7","other":"60d7337ef806be95ccaf7b9d663a4289f9afc68edced62904ab50601cf113f45","up":true},{"one":"c1f9e8e1d509febdf1f267bb227741e513420048a2e669ac9eef4b05a29cf10b","other":"d1d719ce1dca507598449afe966396c160ad25ad632112ab268b1d913b490dbd","up":true},{"one":"af02b5d107b3a17f539c7f9020ebe74322434634e70c420a7f56776eb5d9db73","other":"9852ce267d53106a6e584d6eddb08e0062eb4a422d2a8d39ad6dccaebac552ff","up":true},{"one":"11d43f6ed0ddd5afa5c8a7abf7c62a4fa865b7a25ee295bf1a49701ef3081363","other":"0b72054403f78a64a787f46e9f26bf0de7bbba5a60cb105e6aeea46cb4a1d9fe","up":true},{"one":"17db15893bf39b42593ee1de975aba6832046d9da5b4b493ec44272738a29cef","other":"3b88a472beba4a18f8df45678888fd359bac3823900eecfe0037fdc9ad54d416","up":true},{"one":"6ea51fb6e4783f351dbbfa47b508c78c73233ebaada409dfb55446217f92c4bd","other":"7920d69cf7e458fce0781ea1a4e07768e1a69f6818090eff0abf0b4a0c2c35f8","up":true},{"one":"ed2d3e1e5693b44494808907c98ec54d6d08331945d2a2c03e31130fef1d2586","other":"c43fbee95380007274b8f231fe34bcd59b5c0ef0830b174967d4702627984fc6","up":true},{"one":"bb90464f769a85549c150f861775aa67924c7c651f393f6c70772707376a5c7e","other":"b2a563ac59bab4dfddf7b6e27b80ee7afdeb2e4295411107903f484bcf9fc4f2","up":true},{"one":"fbf5e917be45e909697a9393c4778206333cf1dd9a103978e8d71622ca3b1cc8","other":"e8830f2b2f7d08df15bd33f4b2841d01d9d62c1621234bd6ae86743e52360f3e","up":true},{"one":"f45f1f2e59e947e04fa15bcf87f872ef6d73b73f778e12d1f9b8930ea166eefc","other":"82dd83838cb982b89505ef249d353a20e434346dd78b71cd9b809f71d5c112da","up":true},{"one":"90a85cb7363ede161ec21cc89f8b9d4350e566cf10586a66d31b0a8677620aa1","other":"b911b8e2d72532b7c66ff5f7bffa70f5ddbeea6903a86f9333399f0c4b5f0fe8","up":true},{"one":"5efb3bfc199f5408f79bd6bd5171b4bf332c68a8e49242eb4f6a589b963565c6","other":"41d9c03e44bec3f84a6139ce40ef1e390530f38ed11860575acfad03a49db095","up":true},{"one":"b5025d153581d333b44df4b9bfa69d87de138905172e4fd317e16f7099a5fcf8","other":"a6fbe16b81d240ff2f2ed6c93cfd9590731dfb2e7ec3fce1c098fe542bedf299","up":true},{"one":"04518d7120fa8a528d983ca1ee6d5d09ba24a4e853fb22bc9084cdf34995e95f","other":"1a2a0e0bbf83cd40936995674418ae469aa2b92876a4ceeabd8128f536b7d7a2","up":true},{"one":"850575577d6b420a87aba388af481e0c044c2f75cf29ff934daf5674318a61ba","other":"a46dd535e3bc8f111a8b2ce5594b62e87741c395e8a2b8fbae33edd29cb8caf8","up":true},{"one":"c832b4ad64a17da4b796ffcac646c2aa666b276aabb7eb3bfe7981d64a4da402","other":"f7fa2986ec9f84822b11a6b00bd03a1dd26f2a0fab90b1b308f08caead43cfe1","up":true},{"one":"bcc6724e54f761361f85147eb102a8d1a1a38810a940ce76b1e361ddcadacaa3","other":"b2a563ac59bab4dfddf7b6e27b80ee7afdeb2e4295411107903f484bcf9fc4f2","up":true},{"one":"ff36a8810dd44f6d1fa42aa91ff6206bcfb4c1ffbab0df73a181daece329e0e3","other":"e5149cedd990072f2aaa9735a9259f28973c45876660c2d86ac105e56cca8e68","up":true},{"one":"1f85b8c05e5dceff0bd8256f8f6d80d4b902a9754ceb952d95ea2e1150ef9e59","other":"140020a23a840b8840ba0c2c384f853a606330e9743885e9967cf49533db282e","up":true},{"one":"21012a3a6ef1ece48fd9d7cffe62dc75839dd062efcf3ac5f962c237814da407","other":"2a0a8eaf1a2749e68f8b841578c160699cf7907ff23842c6d616ad884e5f613e","up":true},{"one":"ac4d2d6836e2cdf4c88221f6013aac70a451dd15bc403288bd10d0b911cd9a2b","other":"f7baef876a62b92ebe5ca9ec6a085e0eb54fd31e2425e662eec747df3cd77592","up":true},{"one":"9890e6ebb2c6f9a7bec4c2778e077e3710ce3af356f82ae9b4d324832d159ef7","other":"b820e480354000c837b1781ec1c493e8776b4834252e6453425ac05b925b5a58","up":true},{"one":"f528aaafd67b20dafdce101db224aa01c70f93bdc91c14f50fa8db1dbf9fc386","other":"efeae3b7f610dc10acc51068e7718876d147cd78a9a28788c5dba5bb3a6950dc","up":true},{"one":"605a46991af15cd60e67413c712b99ff8f21173c96a7990f2728ad6cac2bb9d8","other":"0ff2d2c49547eebc96675e0b88073dea5e9091bee1843ffe567127e34486c348","up":true},{"one":"21012a3a6ef1ece48fd9d7cffe62dc75839dd062efcf3ac5f962c237814da407","other":"2ccfb5b1f3923d35fef88838c508b98b5516c5d409643881d2304ae49e50eed3","up":true},{"one":"ec52270604007673d1bfda1edbd8bfa945a21141efd85e42b684a9f30f8cddae","other":"f7baef876a62b92ebe5ca9ec6a085e0eb54fd31e2425e662eec747df3cd77592","up":true},{"one":"c26fd5e6504c7b3f0a6d9133ff87c98c110eb1c201c5f3bcf6b10653f2b972d2","other":"c49caff13862dc089f1f9b8180d6efa455648375662719272102c4f8028799d6","up":true},{"one":"1b830ed484b274a96ec7ba2f9a42b6859412b5334a564014ff3f11597ea3a32d","other":"0438f567045d4556a0e7a697028d689ecfd0ae20f9e85c09b48d9f1fd0ee4765","up":true},{"one":"ef07be559914ec4b5930d90d8d8b6f32dab9eba23acc36f14d512307f9974348","other":"f2d5533eed4b0c184952d859d67e44abe5a75a5de6111c8c106b8f4b2d8ccfc4","up":true},{"one":"f528aaafd67b20dafdce101db224aa01c70f93bdc91c14f50fa8db1dbf9fc386","other":"ed2d3e1e5693b44494808907c98ec54d6d08331945d2a2c03e31130fef1d2586","up":true},{"one":"ff36a8810dd44f6d1fa42aa91ff6206bcfb4c1ffbab0df73a181daece329e0e3","other":"ec52270604007673d1bfda1edbd8bfa945a21141efd85e42b684a9f30f8cddae","up":true},{"one":"c26fd5e6504c7b3f0a6d9133ff87c98c110eb1c201c5f3bcf6b10653f2b972d2","other":"d1d719ce1dca507598449afe966396c160ad25ad632112ab268b1d913b490dbd","up":true},{"one":"6967e7438125c2045d575eb9f407b4a38d1bf9dcd1c1c1a97f750da6a21aeff7","other":"628e7da3359ed6d9dcfbafc7581966e4e09245c321ec78ca75587c9cbb44697f","up":true},{"one":"d640472351969a5578e541aca72b7640c583b995fd62607ff3ee3f3f3139aafd","other":"ca041da0dc514643d017458d08ff6962ec52c9e66571a239ec395dc8b2546709","up":true},{"one":"ec52270604007673d1bfda1edbd8bfa945a21141efd85e42b684a9f30f8cddae","other":"d640472351969a5578e541aca72b7640c583b995fd62607ff3ee3f3f3139aafd","up":true},{"one":"30897492824b19540d13ef17c70845be6dde455dca4e4f84cfca14a2c373969f","other":"2a97d308a720274a440dfa6901ca0a5480af9bab58dd8a6c4afdb9c83ea964c3","up":true},{"one":"cc2037c08942a094df12f45831f28e0015fc3ac04d5b8f24ffea9bf3a0b02c39","other":"d887070a0568282c69e96ce65612ba72d5ea26b5c80671435d6e1ed2c4b49301","up":true},{"one":"e027a9f7152641c4a41154f8ce4dafd23895c312150efea86bf4152c88d0ca86","other":"ee5e77df690329c132f2f7fca223cfd384b7bc34ec38763a4eb42780e0585656","up":true},{"one":"db6a1f6b342f6be9517f8df01003797c11c837d9aee3cdba5b7859230b36c35d","other":"e7fa7112adc7b023dd5965e620277122542153f87eaf5deeacc8a51f1778ba77","up":true},{"one":"53a885968d68d8ebf7ed514e662cc13fa03186d2361000a03576531fdca2a25f","other":"574f65867482091aee2774033116c233525eea711706b5ae9ba09b54e896d302","up":true},{"one":"ed2d3e1e5693b44494808907c98ec54d6d08331945d2a2c03e31130fef1d2586","other":"e54784cfbcd89c37c8f758aae70ece3ab4b7f8c30fb4ef7543e04aa89ff4386b","up":true},{"one":"898d2f7d46b4961b646d5a6142d54d6233b7f80f668ce234522dd02e2cc545cb","other":"90a85cb7363ede161ec21cc89f8b9d4350e566cf10586a66d31b0a8677620aa1","up":true},{"one":"c59e3953b64e5b9ffbe53990a358914f2fa8e3551d33f92b9e3a441bd1baf2cd","other":"d640472351969a5578e541aca72b7640c583b995fd62607ff3ee3f3f3139aafd","up":true},{"one":"154be9255e9aebd134a914070f5e6f3d4bba079d9ca738b74244db14e1b586dd","other":"11d43f6ed0ddd5afa5c8a7abf7c62a4fa865b7a25ee295bf1a49701ef3081363","up":true},{"one":"5b632eaf700d173ff15f4727b85817e6173228c304b422434a08c2cad438b825","other":"574f65867482091aee2774033116c233525eea711706b5ae9ba09b54e896d302","up":true},{"one":"5db08436c64f4cc9e2b3950e35bc8ad739825e3efa67a642c771d95b34cb420c","other":"4d103ec5afee559a5a9242e8d650b67301eaec10e96fc2f184e34d48554108a2","up":true},{"one":"378e7af7cc019186d4f2699e753e2d71302f8f3565572c13b7a1b1c5cb47443c","other":"30bec7cd0a7d002839aed7654129bd2fe2e2ce7f42aa7bae1560e8bf718954c3","up":true},{"one":"e8efe8016fe6cf649b2755bee22da35ccc6c9c55d404d5385d61f6ea27b84380","other":"f7fa2986ec9f84822b11a6b00bd03a1dd26f2a0fab90b1b308f08caead43cfe1","up":true},{"one":"8025c1fcb98e53f92767d1d43a3057a0acd1e8994bb4a7e3f5e244110e0dcf91","other":"88fefb7506105c0e269baf52955a01b19f55504b13133bac0beab41c9f6e6942","up":true},{"one":"ee5e77df690329c132f2f7fca223cfd384b7bc34ec38763a4eb42780e0585656","other":"c43fbee95380007274b8f231fe34bcd59b5c0ef0830b174967d4702627984fc6","up":true},{"one":"04518d7120fa8a528d983ca1ee6d5d09ba24a4e853fb22bc9084cdf34995e95f","other":"0e5e0bb1383b2ec569b157a1d2ae6900592ab892a28367f5613a4e29cb265088","up":true},{"one":"3b78bc987c7c31c94e8ada9b4b11b5db9387fe70dd01ce7f3e976d3bec433dec","other":"00c6488a842ece7a8b0daf064e405de03a4257d308840ea52bfd48d23f54d895","up":true},{"one":"ac4d2d6836e2cdf4c88221f6013aac70a451dd15bc403288bd10d0b911cd9a2b","other":"f629b8b9e79c75ac559daf9bf4fc8672bfdd595cf2c5d17a8885282626fc65a5","up":true},{"one":"6c73150490e8be9677c40086de0aefed1939581048e26f4a93f5ca26571a1a8f","other":"738c2d42458965d03c8f9f055eaf0e3edf3dfa2a4de0a048ec05b78e7b765c90","up":true},{"one":"68317431e4fa55be4a700e35c6a578307cc32b72336679b5c5618b622ef0c602","other":"17db15893bf39b42593ee1de975aba6832046d9da5b4b493ec44272738a29cef","up":true},{"one":"da67ace34f7076a1d550bc61bc2a31da88d6cd9f9df43b142a8c6bbade1b4aee","other":"ed2d3e1e5693b44494808907c98ec54d6d08331945d2a2c03e31130fef1d2586","up":true},{"one":"2c3894b6e47cf19ac7ee9fe213196312f676256f670dff25b03563492550bc74","other":"39d1fcae2d23c775214988251505c577b9ac7b6851558ddf9a437dfe143f3845","up":true},{"one":"35e6b1d31f594c06b759525434a7e717ebe6f27ca0188f247ed1247664a50563","other":"39d1fcae2d23c775214988251505c577b9ac7b6851558ddf9a437dfe143f3845","up":true},{"one":"f31cc744ea921fee8364c5269b1ce7ec6b5f0c0cbb6885efbf602de5b36f6169","other":"fbc8087a723c564ca0139329902e79748af46699ea7be24d57909a7e8e96f681","up":true},{"one":"2c79af7ea85f96db7897cf8cdb4d002ad2308194e03981876edb8d904ef65137","other":"39d1fcae2d23c775214988251505c577b9ac7b6851558ddf9a437dfe143f3845","up":true},{"one":"7125e05bf1bfe6df948c9276b62bc755fc6b0ec8d4ac7724b61ea49591adcf25","other":"628e7da3359ed6d9dcfbafc7581966e4e09245c321ec78ca75587c9cbb44697f","up":true},{"one":"2c3894b6e47cf19ac7ee9fe213196312f676256f670dff25b03563492550bc74","other":"33737df75bbac1b41c63f05ea2cf1523b972df17f22bda026db84a49ac35e1e3","up":true},{"one":"2d3645c4fdf9a2809a909076b9ee5fb98fa880f6faeff914f1a2987af928cd79","other":"2a97d308a720274a440dfa6901ca0a5480af9bab58dd8a6c4afdb9c83ea964c3","up":true},{"one":"165f1af67aa1d24569e0bdff61d29b3c39e93250071d8f25b5be6face209ac6a","other":"14dfb8414d17b2df15eaf59571a8cfec99b1fd674561da63ee99af853bda07da","up":true},{"one":"1e2aca93fa9442a0034ae8d295530dde16fcbfa8c37227e2e6863babb0f87c34","other":"1f670c53b4c597beaffacd84e3a697225b04cded9219d0a28e1fe525a3cadcf5","up":true},{"one":"0c28cd1315890629896d0fe5517524d4eb788f7444709c135ea690ba4e6103d5","other":"06618d829a8a7317a98f1a40ecf8864e1c94c4e270a9e4c008229dc7cf937b7e","up":true},{"one":"6ecb5c36fc0150c287446ae8a8682d629a1d39341230717206219babe3bdf659","other":"444722a15b01a0d8e6794798d239fe621d59bdfc08823ab47cbd8b9acebd23b4","up":true},{"one":"49eaad68d23dd63ef26029fa3f4e2578f3deca8708bbc838750d8b6dbe9eaa38","other":"7dd3078c71087ab88d4d26a962820bcb79b8ce30e91c1f9a69d4bf8d38086960","up":true},{"one":"d887070a0568282c69e96ce65612ba72d5ea26b5c80671435d6e1ed2c4b49301","other":"b911b8e2d72532b7c66ff5f7bffa70f5ddbeea6903a86f9333399f0c4b5f0fe8","up":true},{"one":"7e0458ecdf7081443cab5412529f3948ece659facaca03208496c80dd136e704","other":"574f65867482091aee2774033116c233525eea711706b5ae9ba09b54e896d302","up":true},{"one":"154be9255e9aebd134a914070f5e6f3d4bba079d9ca738b74244db14e1b586dd","other":"14dfb8414d17b2df15eaf59571a8cfec99b1fd674561da63ee99af853bda07da","up":true},{"one":"3e8efcaf3002522b39065ea30c15426d1eb55916499eff8eb5a814e39d41853c","other":"3ec530761ddb87f930fda919be67df18074c6f0795292add1b2a91ff3d9c39e3","up":true},{"one":"898d2f7d46b4961b646d5a6142d54d6233b7f80f668ce234522dd02e2cc545cb","other":"f7fa2986ec9f84822b11a6b00bd03a1dd26f2a0fab90b1b308f08caead43cfe1","up":true},{"one":"455936fd22c43794e6e2104fd91d3f5d246e3823e8ff8eaf8dc27aa9f3d2ee08","other":"4c9eab8ab45405a6d4bab46430efc04b8e6aec1d944f88435eca41361925f379","up":true},{"one":"c6cf46239078edfb343c645f039725fdee1bbba8b0a6da02e2cc456b9223c9a2","other":"ca041da0dc514643d017458d08ff6962ec52c9e66571a239ec395dc8b2546709","up":true},{"one":"e7fa7112adc7b023dd5965e620277122542153f87eaf5deeacc8a51f1778ba77","other":"d29941d6b8acd86cf32fd1c2181da3ab1da3c2083134b068ca49ce29aa86b783","up":true},{"one":"33b5c521b4208e26414db2e05c9a8ccc001a524d928579d44d2e74d14a56593e","other":"33737df75bbac1b41c63f05ea2cf1523b972df17f22bda026db84a49ac35e1e3","up":true},{"one":"c26fd5e6504c7b3f0a6d9133ff87c98c110eb1c201c5f3bcf6b10653f2b972d2","other":"d640472351969a5578e541aca72b7640c583b995fd62607ff3ee3f3f3139aafd","up":true},{"one":"8025c1fcb98e53f92767d1d43a3057a0acd1e8994bb4a7e3f5e244110e0dcf91","other":"45584a4bebb948ef5f7b55d4846ec5549d7623682169c0edcab5b3523e68c7da","up":true},{"one":"04518d7120fa8a528d983ca1ee6d5d09ba24a4e853fb22bc9084cdf34995e95f","other":"0438f567045d4556a0e7a697028d689ecfd0ae20f9e85c09b48d9f1fd0ee4765","up":true},{"one":"c59e3953b64e5b9ffbe53990a358914f2fa8e3551d33f92b9e3a441bd1baf2cd","other":"d29941d6b8acd86cf32fd1c2181da3ab1da3c2083134b068ca49ce29aa86b783","up":true},{"one":"29957e8e92925a8c79bdf513295d96bfb62fbfc597ee1cf767c7ef408f1b1295","other":"20aeb14f567dd16f06b0d3b589b83283daa00a5ed10e447860bda946baccdd2d","up":true},{"one":"c8986871e46f001d15ed8b70f2aa0fea8ae309d5e5671a500f619e3b348c8c15","other":"f773b83f1a1de2ab6660edb0b765cfccec6778061ee25c5a84f968625686ef60","up":true},{"one":"976e57d0c32227222bfd0cbb802f269bdcd52d5d33cf689c66b12c023f5fa8bf","other":"512ec5c2e6b4d788482462d941117c81fcc0e73f0c15545794dd1b4e03bf2102","up":true},{"one":"6967e7438125c2045d575eb9f407b4a38d1bf9dcd1c1c1a97f750da6a21aeff7","other":"6c4dcdfdee0164a9a3f419430726dd51f9198c65ff6e7de7aaa6f632dcde6794","up":true},{"one":"5b632eaf700d173ff15f4727b85817e6173228c304b422434a08c2cad438b825","other":"63370e288ab2e4b8403c6678e9c44ae5c7496b5ead614306fceb85986ed29d18","up":true},{"one":"179f21d2e0421b8056ee9a260bc0985bfa64a52a36d0a8fbce4e03f3120d1d65","other":"1c8a10ecbd72acb2bbbb8b77ea5404f9e90f4dbf306ec8134cfed70b40aef399","up":true},{"one":"17db15893bf39b42593ee1de975aba6832046d9da5b4b493ec44272738a29cef","other":"3ec530761ddb87f930fda919be67df18074c6f0795292add1b2a91ff3d9c39e3","up":true},{"one":"51db114a52827f5b74088bd0fc87d35229e7740e7d121bd7699298396516a880","other":"5f00b3bebef2f5484ff1386298add68a6743a106200ae8a13a27dbb52714ee8f","up":true},{"one":"e5149cedd990072f2aaa9735a9259f28973c45876660c2d86ac105e56cca8e68","other":"df1e4e46e8ec26cad74b4f35ab070f12c8f6fddca35ac44c1218ff60fe1e6bab","up":true},{"one":"165f1af67aa1d24569e0bdff61d29b3c39e93250071d8f25b5be6face209ac6a","other":"179f21d2e0421b8056ee9a260bc0985bfa64a52a36d0a8fbce4e03f3120d1d65","up":true},{"one":"0af9a57a2f66835cd3e4e71bc026013a8a99ca337a7b6b6cc34e11d8da212a4f","other":"0e5e0bb1383b2ec569b157a1d2ae6900592ab892a28367f5613a4e29cb265088","up":true},{"one":"07a8c900fec6c477580ed5b38848a8681dc52a19e59fa4cd32f571fe7fb2383a","other":"1b830ed484b274a96ec7ba2f9a42b6859412b5334a564014ff3f11597ea3a32d","up":true},{"one":"17040a3aad5930d8e0de1011fd2996b7d09225989f0dc1ae8f7e7a52dd26ab4e","other":"1e2aca93fa9442a0034ae8d295530dde16fcbfa8c37227e2e6863babb0f87c34","up":true},{"one":"850575577d6b420a87aba388af481e0c044c2f75cf29ff934daf5674318a61ba","other":"b02b01a5c37cb05c287a3dc7d04e305de26f8d62dc388542eeb43e97db7b4282","up":true},{"one":"5efb3bfc199f5408f79bd6bd5171b4bf332c68a8e49242eb4f6a589b963565c6","other":"4d103ec5afee559a5a9242e8d650b67301eaec10e96fc2f184e34d48554108a2","up":true},{"one":"a653302730df3d58f796906a93933aa81494f2588d9485ab7676ec3b0ccbb426","other":"ad9899f78659492ec248a884927a757f3f3b4e76cd2abc46ad8766251fd8afed","up":true},{"one":"2a97d308a720274a440dfa6901ca0a5480af9bab58dd8a6c4afdb9c83ea964c3","other":"39d1fcae2d23c775214988251505c577b9ac7b6851558ddf9a437dfe143f3845","up":true},{"one":"baddc778aea97acdbbb5bc99744a5545abab9f6047c81f328761645287ac391c","other":"aeb4c75a57ccfc9ac053a3d363cf7c1e3e201406587769ab6615d5c2f86a5410","up":true},{"one":"7920d69cf7e458fce0781ea1a4e07768e1a69f6818090eff0abf0b4a0c2c35f8","other":"6251e9540448726a601699ef4cd19e50c969a746da27228967338cdc09d628bf","up":true},{"one":"6e68ea86440706a0d73a9508f2247492543163f8fa7e2dc2aa62b74d50261b8b","other":"39d1fcae2d23c775214988251505c577b9ac7b6851558ddf9a437dfe143f3845","up":true},{"one":"959fda0866d3c18e9399e98485d627044079d6f86b075edaea9315402f5d9395","other":"512ec5c2e6b4d788482462d941117c81fcc0e73f0c15545794dd1b4e03bf2102","up":true},{"one":"f528aaafd67b20dafdce101db224aa01c70f93bdc91c14f50fa8db1dbf9fc386","other":"e7fa7112adc7b023dd5965e620277122542153f87eaf5deeacc8a51f1778ba77","up":true},{"one":"d3b0dea1dd3ac71e7e4a30941632eec53cb980aa7cb6cdac95042a5400a878c3","other":"e8830f2b2f7d08df15bd33f4b2841d01d9d62c1621234bd6ae86743e52360f3e","up":true},{"one":"7125e05bf1bfe6df948c9276b62bc755fc6b0ec8d4ac7724b61ea49591adcf25","other":"775e7be502df8fd938cf9c42ee4fac33e460a4b6992b9efeb8dc1ff7dde5c40f","up":true},{"one":"1436aaa8770e9f1c6294e49f4066c16b1caa50524e9b8fd058059e41657d2a83","other":"24b85c10f098725938ea7d87cd24a4b10358129906fca9790fc266ea8784b538","up":true},{"one":"6ecb5c36fc0150c287446ae8a8682d629a1d39341230717206219babe3bdf659","other":"6e05179dc90a8f6654d0c9a3f06173371dcfb18b852fdd77f35f75e38f273125","up":true},{"one":"4a8b610e09d35aa21c42ab8c3e38de600a944c094e6b86ea56828b5e6904f1f7","other":"455936fd22c43794e6e2104fd91d3f5d246e3823e8ff8eaf8dc27aa9f3d2ee08","up":true},{"one":"19faaf891eb6a716902ec29d201dc2094ee474acff188ae86faf9760674b2d37","other":"06618d829a8a7317a98f1a40ecf8864e1c94c4e270a9e4c008229dc7cf937b7e","up":true},{"one":"f31cc744ea921fee8364c5269b1ce7ec6b5f0c0cbb6885efbf602de5b36f6169","other":"eb98fb45dd5754f24f9df0c9ecbb93932e3d9d7735cd6d0ddd4a8675bb4ef554","up":true},{"one":"32371744163f0b3aefd3955dc4877e7eb82b17ef9541c333ca9c0a9f8aec3045","other":"33b5c521b4208e26414db2e05c9a8ccc001a524d928579d44d2e74d14a56593e","up":true},{"one":"e54784cfbcd89c37c8f758aae70ece3ab4b7f8c30fb4ef7543e04aa89ff4386b","other":"c49caff13862dc089f1f9b8180d6efa455648375662719272102c4f8028799d6","up":true},{"one":"4d59cf1aeecf370e94a7a231887450cef97053b9c88a7fd11e210840af070e29","other":"41092c852fac630df2a9ca0862716f8e9fb8566c904a49c96389071046bc699d","up":true},{"one":"24b85c10f098725938ea7d87cd24a4b10358129906fca9790fc266ea8784b538","other":"3ec530761ddb87f930fda919be67df18074c6f0795292add1b2a91ff3d9c39e3","up":true},{"one":"db6a1f6b342f6be9517f8df01003797c11c837d9aee3cdba5b7859230b36c35d","other":"caf6a8e37fd41c1e6ad77a8575cd90354bb1693893952301c9caeb4779c338d3","up":true},{"one":"915d7a0510bad19266eef8f00ca0cb2efc340253775706495fca8b9160b512cc","other":"512ec5c2e6b4d788482462d941117c81fcc0e73f0c15545794dd1b4e03bf2102","up":true},{"one":"4636f00be60a9b494a3ebc9ab41cc7cb53ec0b0beff214db2d0a248dc3aeb6af","other":"49cd1efed6a56a78af4ea4ab40813013e76c6a5fb9d2029ee02db5d80f5e41a6","up":true},{"one":"378e7af7cc019186d4f2699e753e2d71302f8f3565572c13b7a1b1c5cb47443c","other":"0c28cd1315890629896d0fe5517524d4eb788f7444709c135ea690ba4e6103d5","up":true},{"one":"da67ace34f7076a1d550bc61bc2a31da88d6cd9f9df43b142a8c6bbade1b4aee","other":"c43fbee95380007274b8f231fe34bcd59b5c0ef0830b174967d4702627984fc6","up":true},{"one":"0fc59bd04ac9de3195e3c9d0eb573952a5805dd2e7e572078b6e996778adec73","other":"0a005eb9c10c5cc9f720cfec2a655811d391671597b4f32d12df291ec76b2c13","up":true},{"one":"9890e6ebb2c6f9a7bec4c2778e077e3710ce3af356f82ae9b4d324832d159ef7","other":"a34ea2e87d4c12adb27d66c2c95300603ff50415974e000bbcc69a5ae059dbf1","up":true},{"one":"f45f1f2e59e947e04fa15bcf87f872ef6d73b73f778e12d1f9b8930ea166eefc","other":"eb98fb45dd5754f24f9df0c9ecbb93932e3d9d7735cd6d0ddd4a8675bb4ef554","up":true},{"one":"21012a3a6ef1ece48fd9d7cffe62dc75839dd062efcf3ac5f962c237814da407","other":"217f9952af1eb58d5ca5ac7be763716cfe2c0a4f3cdd4ebe4b5df563f919e2d2","up":true},{"one":"bcc6724e54f761361f85147eb102a8d1a1a38810a940ce76b1e361ddcadacaa3","other":"b820e480354000c837b1781ec1c493e8776b4834252e6453425ac05b925b5a58","up":true},{"one":"898d2f7d46b4961b646d5a6142d54d6233b7f80f668ce234522dd02e2cc545cb","other":"baddc778aea97acdbbb5bc99744a5545abab9f6047c81f328761645287ac391c","up":true},{"one":"b89793c3ccd9ea642080728732ce7df33778653fed3d1d8f3a25e60670e33325","other":"b2b5ba1bb188f18f79b295f2c0d48c52c1d1d449ecb9b94b9984f3a6179732c7","up":true},{"one":"b5b24532d2810e311e10b1d606baf6007f9124b88a178b32713cf1eddae089be","other":"96fcf14c7f90350091ac6fcb58306ccfb9e4a38d3da59f8ab656854332844cbd","up":true},{"one":"c6cf46239078edfb343c645f039725fdee1bbba8b0a6da02e2cc456b9223c9a2","other":"c8986871e46f001d15ed8b70f2aa0fea8ae309d5e5671a500f619e3b348c8c15","up":true},{"one":"30bec7cd0a7d002839aed7654129bd2fe2e2ce7f42aa7bae1560e8bf718954c3","other":"256e81c5a6fb43bd343345477f8f96aa1947f07ac3297f631ab03f060147b062","up":true},{"one":"e7fa7112adc7b023dd5965e620277122542153f87eaf5deeacc8a51f1778ba77","other":"daec45eca40f48843b41f70267c07e94996ced829f02710f15354fbe26e177e7","up":true},{"one":"006727dc6f59b120b24c17b8e63f80ef3439105f8118ffeed408f105a48ee60c","other":"14dfb8414d17b2df15eaf59571a8cfec99b1fd674561da63ee99af853bda07da","up":true},{"one":"0743bcf2aaa77e916f4a367d6159473c7d80f46a2e4cbe9ef346e423d39d7072","other":"6e05179dc90a8f6654d0c9a3f06173371dcfb18b852fdd77f35f75e38f273125","up":true},{"one":"b5025d153581d333b44df4b9bfa69d87de138905172e4fd317e16f7099a5fcf8","other":"849bcbb9be43b799fefc5e689efc75125da27f536e97e5b7921031520ae6e5d8","up":true},{"one":"fbc8087a723c564ca0139329902e79748af46699ea7be24d57909a7e8e96f681","other":"8f2182c2c2d0eeb2e887dbc350ae7257819f536032851ffdf29e7842cb1a62cc","up":true},{"one":"e5d794d64003725a74642f097c0ee76706d78419b6f3ea819d440bc0ad166eac","other":"c49caff13862dc089f1f9b8180d6efa455648375662719272102c4f8028799d6","up":true},{"one":"7290cd3affade5f9e729d1b03549aceafb2576cdbc6789fd688c95495f10bacd","other":"45584a4bebb948ef5f7b55d4846ec5549d7623682169c0edcab5b3523e68c7da","up":true},{"one":"5b632eaf700d173ff15f4727b85817e6173228c304b422434a08c2cad438b825","other":"77d2ec52dabd5d7f326d4c6afd2aad110487c6bdffa2984060528716ba873462","up":true},{"one":"37801e8d7d46143f78924ed66099f658a94d37edfd2f58d02acb85add03e1894","other":"20aeb14f567dd16f06b0d3b589b83283daa00a5ed10e447860bda946baccdd2d","up":true},{"one":"8025c1fcb98e53f92767d1d43a3057a0acd1e8994bb4a7e3f5e244110e0dcf91","other":"849bcbb9be43b799fefc5e689efc75125da27f536e97e5b7921031520ae6e5d8","up":true},{"one":"39d1fcae2d23c775214988251505c577b9ac7b6851558ddf9a437dfe143f3845","other":"7dd3078c71087ab88d4d26a962820bcb79b8ce30e91c1f9a69d4bf8d38086960","up":true},{"one":"c26fd5e6504c7b3f0a6d9133ff87c98c110eb1c201c5f3bcf6b10653f2b972d2","other":"f4e09f89287bd1af7833acd85ba7cc71fdb3ff34f2f409e1cf2a878dcd3183dc","up":true},{"one":"51db114a52827f5b74088bd0fc87d35229e7740e7d121bd7699298396516a880","other":"4646fe4c119078738612b44a356089b3c73a08e11cfd910675d211ae6b20b8fd","up":true},{"one":"63370e288ab2e4b8403c6678e9c44ae5c7496b5ead614306fceb85986ed29d18","other":"2a0a8eaf1a2749e68f8b841578c160699cf7907ff23842c6d616ad884e5f613e","up":true},{"one":"07a8c900fec6c477580ed5b38848a8681dc52a19e59fa4cd32f571fe7fb2383a","other":"03285e06657032778feff0b43828c964dbf9de669f63171aeb587aa1a1facc0a","up":true},{"one":"103b232552b94090232195dc88f84823701f35ae536b5af6dd33fa655a33cbae","other":"eb98fb45dd5754f24f9df0c9ecbb93932e3d9d7735cd6d0ddd4a8675bb4ef554","up":true},{"one":"d640472351969a5578e541aca72b7640c583b995fd62607ff3ee3f3f3139aafd","other":"e5d794d64003725a74642f097c0ee76706d78419b6f3ea819d440bc0ad166eac","up":true},{"one":"5db08436c64f4cc9e2b3950e35bc8ad739825e3efa67a642c771d95b34cb420c","other":"1a2a0e0bbf83cd40936995674418ae469aa2b92876a4ceeabd8128f536b7d7a2","up":true},{"one":"f629b8b9e79c75ac559daf9bf4fc8672bfdd595cf2c5d17a8885282626fc65a5","other":"c9f5acafbbf8c66647de05b0848d79451eee490709d53f118fc2051410cc8203","up":true},{"one":"461cc9f064e6f4f06ff38e0d1f3f00ef8807ba31c7258e453cc682e9551bb1c6","other":"4646fe4c119078738612b44a356089b3c73a08e11cfd910675d211ae6b20b8fd","up":true},{"one":"53087084708cc5ee63ac459b18fa10ae52a823139b4ecba6c8691d4934f2f971","other":"4e5a46c004e85cf86a02fdfbf2243018825d015debfb9a077a1283d302293b3a","up":true},{"one":"1c47ad5bd8846f777daf59587feccc308f4dc63f6d27b1385ff8085c75bb1aac","other":"1f670c53b4c597beaffacd84e3a697225b04cded9219d0a28e1fe525a3cadcf5","up":true},{"one":"ec52270604007673d1bfda1edbd8bfa945a21141efd85e42b684a9f30f8cddae","other":"c786ff8667f509b5a9519984c1d95c83a5d2e257500a71429e8f23af610ce771","up":true},{"one":"6c4dcdfdee0164a9a3f419430726dd51f9198c65ff6e7de7aaa6f632dcde6794","other":"67dcfd21ece30b41a39bc55c0986fca8f401bb3acba821969519f09d0933e8bd","up":true},{"one":"18f6e66e1cc8e620808901b571fdf525ee8f41850fac0bd0e5c5a4de70c5f873","other":"0e5e0bb1383b2ec569b157a1d2ae6900592ab892a28367f5613a4e29cb265088","up":true},{"one":"baddc778aea97acdbbb5bc99744a5545abab9f6047c81f328761645287ac391c","other":"9d0f804849b72397646ba48208ba1e01dcf4de04e788016c4a1a0c93e650ddf5","up":true},{"one":"0de3915b0bcc68040c8aa76fbd2cfa0714e9b34c9dbe0838a7cba81c4f73581c","other":"0d8a919207fb2d5718eab7da95f8efeb01a4e1ae39602d315f8ba2ff1752d9da","up":true},{"one":"ed2d3e1e5693b44494808907c98ec54d6d08331945d2a2c03e31130fef1d2586","other":"db6a1f6b342f6be9517f8df01003797c11c837d9aee3cdba5b7859230b36c35d","up":true},{"one":"6fe9a02e950a5c3a5ff026b75922ed687d59795ba8eb9c092a8d09a5c64d2453","other":"7290cd3affade5f9e729d1b03549aceafb2576cdbc6789fd688c95495f10bacd","up":true},{"one":"f2d5533eed4b0c184952d859d67e44abe5a75a5de6111c8c106b8f4b2d8ccfc4","other":"fe316679eca0e0eb823325812a56fd27da02653b06ada2fd03b27501bda8371a","up":true},{"one":"4d59cf1aeecf370e94a7a231887450cef97053b9c88a7fd11e210840af070e29","other":"582330d8b8c49331b2aec790dc7325b9cd483fc8129323d31ec429d545042964","up":true},{"one":"7b90e939ae2a240f0d74a923afb6bbf11f6d5b99a7bf85f1825b1ea36bce744c","other":"6f2d756566dd5b4a13ffeea9f687c785148f3407a502e28b9d6edfd03b905fdc","up":true},{"one":"2ccfb5b1f3923d35fef88838c508b98b5516c5d409643881d2304ae49e50eed3","other":"2a0a8eaf1a2749e68f8b841578c160699cf7907ff23842c6d616ad884e5f613e","up":true},{"one":"67aa5463e4b32b363b3d01d2a41ccb03199411057276f4962d053160be29a6ef","other":"524db81b135af8dc309b942c082a7291dddb851866fc608753f937ee77015be0","up":true},{"one":"7e0458ecdf7081443cab5412529f3948ece659facaca03208496c80dd136e704","other":"6f2d756566dd5b4a13ffeea9f687c785148f3407a502e28b9d6edfd03b905fdc","up":true},{"one":"6251e9540448726a601699ef4cd19e50c969a746da27228967338cdc09d628bf","other":"7dc2a9573f253f362ef1b21bbfcc144b11a6febc58aa3c4430224160e9fa738c","up":true},{"one":"66e7fc2df51f5df8d7329851fe9357d895e9d5dfdc25f8d92bdb10a960f7e15a","other":"524db81b135af8dc309b942c082a7291dddb851866fc608753f937ee77015be0","up":true},{"one":"f45f1f2e59e947e04fa15bcf87f872ef6d73b73f778e12d1f9b8930ea166eefc","other":"c620752a083ca1ff0398937235cf964133939452c293c799ce07ff8aa2bde420","up":true},{"one":"1a2a0e0bbf83cd40936995674418ae469aa2b92876a4ceeabd8128f536b7d7a2","other":"610334a0772d3414652b575f2caa6f2db32224907c24d06fda643db9f2ec2afe","up":true},{"one":"b7cafed41dac01dd59e2bcaeaaab551ebfeab8eaa1f97c1866fe0ddae772807b","other":"9d0f804849b72397646ba48208ba1e01dcf4de04e788016c4a1a0c93e650ddf5","up":true},{"one":"c786ff8667f509b5a9519984c1d95c83a5d2e257500a71429e8f23af610ce771","other":"d863ba7405eb07ccddbf1d34efbcbec2867a93a109ed9413d9aecf30d3645a6a","up":true},{"one":"21012a3a6ef1ece48fd9d7cffe62dc75839dd062efcf3ac5f962c237814da407","other":"39d1fcae2d23c775214988251505c577b9ac7b6851558ddf9a437dfe143f3845","up":true},{"one":"7dc2a9573f253f362ef1b21bbfcc144b11a6febc58aa3c4430224160e9fa738c","other":"77d2ec52dabd5d7f326d4c6afd2aad110487c6bdffa2984060528716ba873462","up":true},{"one":"ad9899f78659492ec248a884927a757f3f3b4e76cd2abc46ad8766251fd8afed","other":"aeb4c75a57ccfc9ac053a3d363cf7c1e3e201406587769ab6615d5c2f86a5410","up":true},{"one":"628e7da3359ed6d9dcfbafc7581966e4e09245c321ec78ca75587c9cbb44697f","other":"67dcfd21ece30b41a39bc55c0986fca8f401bb3acba821969519f09d0933e8bd","up":true},{"one":"3f946957d910179c7e1a83c44369aacfc31f5727b1a6421a01c8a978ccd349a2","other":"461cc9f064e6f4f06ff38e0d1f3f00ef8807ba31c7258e453cc682e9551bb1c6","up":true},{"one":"f925c85e6457ac01f0cd6b297155f9d3ae611603890d8f3a45e1396d937f8680","other":"f27f1044777e05f3f60165d0d2fc3e7667fe148e0ca7a097805d60b9f61025f7","up":true},{"one":"b02b01a5c37cb05c287a3dc7d04e305de26f8d62dc388542eeb43e97db7b4282","other":"90a85cb7363ede161ec21cc89f8b9d4350e566cf10586a66d31b0a8677620aa1","up":true},{"one":"775e7be502df8fd938cf9c42ee4fac33e460a4b6992b9efeb8dc1ff7dde5c40f","other":"77d2ec52dabd5d7f326d4c6afd2aad110487c6bdffa2984060528716ba873462","up":true},{"one":"a46dd535e3bc8f111a8b2ce5594b62e87741c395e8a2b8fbae33edd29cb8caf8","other":"a3693801a91180410cf3e85d7c09ac8054a769e7b1d55c9e7a46850cb8217da0","up":true},{"one":"7a608d2cf9d1d9c5819dc1f9e88e5cb2852aadea01c40e047c2e184b62e7163c","other":"60d7337ef806be95ccaf7b9d663a4289f9afc68edced62904ab50601cf113f45","up":true},{"one":"6f5f5a77e6092e25e5308413e02ba62c1c559024893a7fb98e26b0f34fed8bfe","other":"41092c852fac630df2a9ca0862716f8e9fb8566c904a49c96389071046bc699d","up":true},{"one":"a34ea2e87d4c12adb27d66c2c95300603ff50415974e000bbcc69a5ae059dbf1","other":"aeb4c75a57ccfc9ac053a3d363cf7c1e3e201406587769ab6615d5c2f86a5410","up":true},{"one":"9fa0215e980dc907df4cc47ab4937f36527d78f9837493016fd4fc51e617299c","other":"a34ea2e87d4c12adb27d66c2c95300603ff50415974e000bbcc69a5ae059dbf1","up":true},{"one":"1b830ed484b274a96ec7ba2f9a42b6859412b5334a564014ff3f11597ea3a32d","other":"17db15893bf39b42593ee1de975aba6832046d9da5b4b493ec44272738a29cef","up":true},{"one":"e54784cfbcd89c37c8f758aae70ece3ab4b7f8c30fb4ef7543e04aa89ff4386b","other":"efeae3b7f610dc10acc51068e7718876d147cd78a9a28788c5dba5bb3a6950dc","up":true},{"one":"3b88a472beba4a18f8df45678888fd359bac3823900eecfe0037fdc9ad54d416","other":"2abb938b889a2eb735134462985a56056be48f189b5b89d23b653864c76427f4","up":true},{"one":"8025c1fcb98e53f92767d1d43a3057a0acd1e8994bb4a7e3f5e244110e0dcf91","other":"512ec5c2e6b4d788482462d941117c81fcc0e73f0c15545794dd1b4e03bf2102","up":true},{"one":"da67ace34f7076a1d550bc61bc2a31da88d6cd9f9df43b142a8c6bbade1b4aee","other":"c26fd5e6504c7b3f0a6d9133ff87c98c110eb1c201c5f3bcf6b10653f2b972d2","up":true},{"one":"0af9a57a2f66835cd3e4e71bc026013a8a99ca337a7b6b6cc34e11d8da212a4f","other":"0ff2d2c49547eebc96675e0b88073dea5e9091bee1843ffe567127e34486c348","up":true},{"one":"fe2167fd33f383110eb3f6caa7bd905ca54fa0c810f1b8a34483a846f3cbddab","other":"e54784cfbcd89c37c8f758aae70ece3ab4b7f8c30fb4ef7543e04aa89ff4386b","up":true},{"one":"006727dc6f59b120b24c17b8e63f80ef3439105f8118ffeed408f105a48ee60c","other":"1f670c53b4c597beaffacd84e3a697225b04cded9219d0a28e1fe525a3cadcf5","up":true},{"one":"41092c852fac630df2a9ca0862716f8e9fb8566c904a49c96389071046bc699d","other":"582330d8b8c49331b2aec790dc7325b9cd483fc8129323d31ec429d545042964","up":true},{"one":"103b232552b94090232195dc88f84823701f35ae536b5af6dd33fa655a33cbae","other":"e8830f2b2f7d08df15bd33f4b2841d01d9d62c1621234bd6ae86743e52360f3e","up":true},{"one":"f629b8b9e79c75ac559daf9bf4fc8672bfdd595cf2c5d17a8885282626fc65a5","other":"fe316679eca0e0eb823325812a56fd27da02653b06ada2fd03b27501bda8371a","up":true},{"one":"d7aca8f2182bc625d2b3c942bd1161c85bcf1c2b34ecbe3e2fd23cfae6b8a871","other":"c441d27a5f4abaa8e3b0f040a6ef85bb8c970031d6a57503a674e36b3d6915d9","up":true},{"one":"a3693801a91180410cf3e85d7c09ac8054a769e7b1d55c9e7a46850cb8217da0","other":"a34ea2e87d4c12adb27d66c2c95300603ff50415974e000bbcc69a5ae059dbf1","up":true},{"one":"e8548b5df15adf0f2a997ff5709827beb5e1d36bb08a2f2d017746d5c0e83fca","other":"f5b24a1fd2cd2908b408562f9a265ee1a692b137e770137afa5fdfa07b237221","up":true},{"one":"b95d88ff6512ef8eaaa6bd842fa44175c1484fc2e8601b83d50a5ffa992bfa3a","other":"b2b5ba1bb188f18f79b295f2c0d48c52c1d1d449ecb9b94b9984f3a6179732c7","up":true},{"one":"20aeb14f567dd16f06b0d3b589b83283daa00a5ed10e447860bda946baccdd2d","other":"444722a15b01a0d8e6794798d239fe621d59bdfc08823ab47cbd8b9acebd23b4","up":true},{"one":"18f6e66e1cc8e620808901b571fdf525ee8f41850fac0bd0e5c5a4de70c5f873","other":"03ccd8d52597d18c0b178ab7361d847d63aad3af920a28345977ae170a1dafcd","up":true},{"one":"aeb4c75a57ccfc9ac053a3d363cf7c1e3e201406587769ab6615d5c2f86a5410","other":"90765b72283f59be4cf9bf7a9e9a22fd6db701c3603cbc0817b4adf2f8e9ce08","up":true},{"one":"6c4dcdfdee0164a9a3f419430726dd51f9198c65ff6e7de7aaa6f632dcde6794","other":"738c2d42458965d03c8f9f055eaf0e3edf3dfa2a4de0a048ec05b78e7b765c90","up":true},{"one":"e5d794d64003725a74642f097c0ee76706d78419b6f3ea819d440bc0ad166eac","other":"9d0f804849b72397646ba48208ba1e01dcf4de04e788016c4a1a0c93e650ddf5","up":true},{"one":"0b72054403f78a64a787f46e9f26bf0de7bbba5a60cb105e6aeea46cb4a1d9fe","other":"00c6488a842ece7a8b0daf064e405de03a4257d308840ea52bfd48d23f54d895","up":true},{"one":"898d2f7d46b4961b646d5a6142d54d6233b7f80f668ce234522dd02e2cc545cb","other":"b7cafed41dac01dd59e2bcaeaaab551ebfeab8eaa1f97c1866fe0ddae772807b","up":true},{"one":"11d43f6ed0ddd5afa5c8a7abf7c62a4fa865b7a25ee295bf1a49701ef3081363","other":"00c6488a842ece7a8b0daf064e405de03a4257d308840ea52bfd48d23f54d895","up":true},{"one":"455936fd22c43794e6e2104fd91d3f5d246e3823e8ff8eaf8dc27aa9f3d2ee08","other":"49cd1efed6a56a78af4ea4ab40813013e76c6a5fb9d2029ee02db5d80f5e41a6","up":true},{"one":"b626d472b555e6f950a7142783db8deb443a74e63ef6bd72a87eaf1af14ca805","other":"b2b5ba1bb188f18f79b295f2c0d48c52c1d1d449ecb9b94b9984f3a6179732c7","up":true},{"one":"0de3915b0bcc68040c8aa76fbd2cfa0714e9b34c9dbe0838a7cba81c4f73581c","other":"140020a23a840b8840ba0c2c384f853a606330e9743885e9967cf49533db282e","up":true},{"one":"7b90e939ae2a240f0d74a923afb6bbf11f6d5b99a7bf85f1825b1ea36bce744c","other":"6fe9a02e950a5c3a5ff026b75922ed687d59795ba8eb9c092a8d09a5c64d2453","up":true},{"one":"66e7fc2df51f5df8d7329851fe9357d895e9d5dfdc25f8d92bdb10a960f7e15a","other":"6251e9540448726a601699ef4cd19e50c969a746da27228967338cdc09d628bf","up":true},{"one":"47bfa3767cefcc0831d410d5402e9396e8a412c8c96faf55b451d3ff310f3b02","other":"49cd1efed6a56a78af4ea4ab40813013e76c6a5fb9d2029ee02db5d80f5e41a6","up":true},{"one":"6c73150490e8be9677c40086de0aefed1939581048e26f4a93f5ca26571a1a8f","other":"0ff2d2c49547eebc96675e0b88073dea5e9091bee1843ffe567127e34486c348","up":true},{"one":"e5149cedd990072f2aaa9735a9259f28973c45876660c2d86ac105e56cca8e68","other":"8f2182c2c2d0eeb2e887dbc350ae7257819f536032851ffdf29e7842cb1a62cc","up":true},{"one":"ef07be559914ec4b5930d90d8d8b6f32dab9eba23acc36f14d512307f9974348","other":"f7fa2986ec9f84822b11a6b00bd03a1dd26f2a0fab90b1b308f08caead43cfe1","up":true},{"one":"775e7be502df8fd938cf9c42ee4fac33e460a4b6992b9efeb8dc1ff7dde5c40f","other":"6c4dcdfdee0164a9a3f419430726dd51f9198c65ff6e7de7aaa6f632dcde6794","up":true},{"one":"ae2b3876bdbd6388781b65e31de182564c5d81f4511caf96588b1a287760b3dd","other":"a34ea2e87d4c12adb27d66c2c95300603ff50415974e000bbcc69a5ae059dbf1","up":true},{"one":"9fa0215e980dc907df4cc47ab4937f36527d78f9837493016fd4fc51e617299c","other":"96fcf14c7f90350091ac6fcb58306ccfb9e4a38d3da59f8ab656854332844cbd","up":true},{"one":"51db114a52827f5b74088bd0fc87d35229e7740e7d121bd7699298396516a880","other":"39d1fcae2d23c775214988251505c577b9ac7b6851558ddf9a437dfe143f3845","up":true},{"one":"45584a4bebb948ef5f7b55d4846ec5549d7623682169c0edcab5b3523e68c7da","other":"574f65867482091aee2774033116c233525eea711706b5ae9ba09b54e896d302","up":true},{"one":"499036eb9d10fc003c903f09ea0ee00c0d27b39564988d67ae111f3473d22f07","other":"b911b8e2d72532b7c66ff5f7bffa70f5ddbeea6903a86f9333399f0c4b5f0fe8","up":true},{"one":"103b232552b94090232195dc88f84823701f35ae536b5af6dd33fa655a33cbae","other":"14dfb8414d17b2df15eaf59571a8cfec99b1fd674561da63ee99af853bda07da","up":true},{"one":"f629b8b9e79c75ac559daf9bf4fc8672bfdd595cf2c5d17a8885282626fc65a5","other":"c49caff13862dc089f1f9b8180d6efa455648375662719272102c4f8028799d6","up":true},{"one":"d863ba7405eb07ccddbf1d34efbcbec2867a93a109ed9413d9aecf30d3645a6a","other":"caf6a8e37fd41c1e6ad77a8575cd90354bb1693893952301c9caeb4779c338d3","up":true},{"one":"e027a9f7152641c4a41154f8ce4dafd23895c312150efea86bf4152c88d0ca86","other":"e54784cfbcd89c37c8f758aae70ece3ab4b7f8c30fb4ef7543e04aa89ff4386b","up":true},{"one":"b911b8e2d72532b7c66ff5f7bffa70f5ddbeea6903a86f9333399f0c4b5f0fe8","other":"8f2182c2c2d0eeb2e887dbc350ae7257819f536032851ffdf29e7842cb1a62cc","up":true},{"one":"2d3645c4fdf9a2809a909076b9ee5fb98fa880f6faeff914f1a2987af928cd79","other":"217f9952af1eb58d5ca5ac7be763716cfe2c0a4f3cdd4ebe4b5df563f919e2d2","up":true},{"one":"17db15893bf39b42593ee1de975aba6832046d9da5b4b493ec44272738a29cef","other":"140020a23a840b8840ba0c2c384f853a606330e9743885e9967cf49533db282e","up":true},{"one":"b820e480354000c837b1781ec1c493e8776b4834252e6453425ac05b925b5a58","other":"b89793c3ccd9ea642080728732ce7df33778653fed3d1d8f3a25e60670e33325","up":true},{"one":"0af9a57a2f66835cd3e4e71bc026013a8a99ca337a7b6b6cc34e11d8da212a4f","other":"1c9caf028df31681b1457a54d4b3ab20009f9fa5bd12417a1ba7efe0c660e6bd","up":true},{"one":"512ec5c2e6b4d788482462d941117c81fcc0e73f0c15545794dd1b4e03bf2102","other":"574f65867482091aee2774033116c233525eea711706b5ae9ba09b54e896d302","up":true},{"one":"c49caff13862dc089f1f9b8180d6efa455648375662719272102c4f8028799d6","other":"c441d27a5f4abaa8e3b0f040a6ef85bb8c970031d6a57503a674e36b3d6915d9","up":true},{"one":"efeae3b7f610dc10acc51068e7718876d147cd78a9a28788c5dba5bb3a6950dc","other":"e8830f2b2f7d08df15bd33f4b2841d01d9d62c1621234bd6ae86743e52360f3e","up":true},{"one":"0b72054403f78a64a787f46e9f26bf0de7bbba5a60cb105e6aeea46cb4a1d9fe","other":"13d6cb9316e289923e2d1de7f3c966d0cbabce3acdb8017122944f4abb140912","up":true},{"one":"f7fa2986ec9f84822b11a6b00bd03a1dd26f2a0fab90b1b308f08caead43cfe1","other":"9d0f804849b72397646ba48208ba1e01dcf4de04e788016c4a1a0c93e650ddf5","up":true},{"one":"0438f567045d4556a0e7a697028d689ecfd0ae20f9e85c09b48d9f1fd0ee4765","other":"140020a23a840b8840ba0c2c384f853a606330e9743885e9967cf49533db282e","up":true},{"one":"33b5c521b4208e26414db2e05c9a8ccc001a524d928579d44d2e74d14a56593e","other":"21a044e772b7c955fe4a6fb7c3a9a20e95d48b7fd6b9518741782f04f5f1f5c2","up":true},{"one":"886aff1f1e3b86bfe901066bb7948451c18fe3f8cd1b7318b05154890ca8f738","other":"f7fa2986ec9f84822b11a6b00bd03a1dd26f2a0fab90b1b308f08caead43cfe1","up":true},{"one":"db6a1f6b342f6be9517f8df01003797c11c837d9aee3cdba5b7859230b36c35d","other":"c786ff8667f509b5a9519984c1d95c83a5d2e257500a71429e8f23af610ce771","up":true},{"one":"fe316679eca0e0eb823325812a56fd27da02653b06ada2fd03b27501bda8371a","other":"8f2182c2c2d0eeb2e887dbc350ae7257819f536032851ffdf29e7842cb1a62cc","up":true},{"one":"eb98fb45dd5754f24f9df0c9ecbb93932e3d9d7735cd6d0ddd4a8675bb4ef554","other":"d887070a0568282c69e96ce65612ba72d5ea26b5c80671435d6e1ed2c4b49301","up":true},{"one":"53087084708cc5ee63ac459b18fa10ae52a823139b4ecba6c8691d4934f2f971","other":"39d1fcae2d23c775214988251505c577b9ac7b6851558ddf9a437dfe143f3845","up":true},{"one":"14dfb8414d17b2df15eaf59571a8cfec99b1fd674561da63ee99af853bda07da","other":"13d6cb9316e289923e2d1de7f3c966d0cbabce3acdb8017122944f4abb140912","up":true},{"one":"1436aaa8770e9f1c6294e49f4066c16b1caa50524e9b8fd058059e41657d2a83","other":"3ec530761ddb87f930fda919be67df18074c6f0795292add1b2a91ff3d9c39e3","up":true},{"one":"2c3894b6e47cf19ac7ee9fe213196312f676256f670dff25b03563492550bc74","other":"5f00b3bebef2f5484ff1386298add68a6743a106200ae8a13a27dbb52714ee8f","up":true},{"one":"58ed74695bf527bac9a350c86d305e53e08c4999795e11cd3b2a36f5cd25d637","other":"5efb3bfc199f5408f79bd6bd5171b4bf332c68a8e49242eb4f6a589b963565c6","up":true},{"one":"cc2037c08942a094df12f45831f28e0015fc3ac04d5b8f24ffea9bf3a0b02c39","other":"c1f9e8e1d509febdf1f267bb227741e513420048a2e669ac9eef4b05a29cf10b","up":true},{"one":"06618d829a8a7317a98f1a40ecf8864e1c94c4e270a9e4c008229dc7cf937b7e","other":"21a044e772b7c955fe4a6fb7c3a9a20e95d48b7fd6b9518741782f04f5f1f5c2","up":true},{"one":"006727dc6f59b120b24c17b8e63f80ef3439105f8118ffeed408f105a48ee60c","other":"0a005eb9c10c5cc9f720cfec2a655811d391671597b4f32d12df291ec76b2c13","up":true},{"one":"6f5f5a77e6092e25e5308413e02ba62c1c559024893a7fb98e26b0f34fed8bfe","other":"1a2a0e0bbf83cd40936995674418ae469aa2b92876a4ceeabd8128f536b7d7a2","up":true},{"one":"3efc4b120b3eeeac186bf3a4cd42eb8c647f7edb08c23ee643e2bec9d72c5bed","other":"378e7af7cc019186d4f2699e753e2d71302f8f3565572c13b7a1b1c5cb47443c","up":true},{"one":"2a0a8eaf1a2749e68f8b841578c160699cf7907ff23842c6d616ad884e5f613e","other":"2a97d308a720274a440dfa6901ca0a5480af9bab58dd8a6c4afdb9c83ea964c3","up":true},{"one":"256e81c5a6fb43bd343345477f8f96aa1947f07ac3297f631ab03f060147b062","other":"49cd1efed6a56a78af4ea4ab40813013e76c6a5fb9d2029ee02db5d80f5e41a6","up":true},{"one":"b5b24532d2810e311e10b1d606baf6007f9124b88a178b32713cf1eddae089be","other":"ac4d2d6836e2cdf4c88221f6013aac70a451dd15bc403288bd10d0b911cd9a2b","up":true},{"one":"e775e9759d4701bd9b43c22f1d1be73c1262b2752bb23cb3857485daf1dcad2d","other":"f773b83f1a1de2ab6660edb0b765cfccec6778061ee25c5a84f968625686ef60","up":true},{"one":"b2a563ac59bab4dfddf7b6e27b80ee7afdeb2e4295411107903f484bcf9fc4f2","other":"aeb4c75a57ccfc9ac053a3d363cf7c1e3e201406587769ab6615d5c2f86a5410","up":true},{"one":"4636f00be60a9b494a3ebc9ab41cc7cb53ec0b0beff214db2d0a248dc3aeb6af","other":"4d6b939fb67338c484948ab92b2ceea4d4b666d7e08773673cd7c8f83f495b89","up":true},{"one":"fbf5e917be45e909697a9393c4778206333cf1dd9a103978e8d71622ca3b1cc8","other":"e54b643cbc95d9f5d27ec3760d892b6802981bfabf4f9979267d66259df982c7","up":true},{"one":"f7baef876a62b92ebe5ca9ec6a085e0eb54fd31e2425e662eec747df3cd77592","other":"8f2182c2c2d0eeb2e887dbc350ae7257819f536032851ffdf29e7842cb1a62cc","up":true},{"one":"3efc4b120b3eeeac186bf3a4cd42eb8c647f7edb08c23ee643e2bec9d72c5bed","other":"256e81c5a6fb43bd343345477f8f96aa1947f07ac3297f631ab03f060147b062","up":true},{"one":"0c64e5af869b1665fd4016ae6d04c8eedd423636f06d78ecb944ee8e3272a82a","other":"006727dc6f59b120b24c17b8e63f80ef3439105f8118ffeed408f105a48ee60c","up":true},{"one":"d3b0dea1dd3ac71e7e4a30941632eec53cb980aa7cb6cdac95042a5400a878c3","other":"c1f9e8e1d509febdf1f267bb227741e513420048a2e669ac9eef4b05a29cf10b","up":true},{"one":"b5025d153581d333b44df4b9bfa69d87de138905172e4fd317e16f7099a5fcf8","other":"e5ada0415c92ef1511b15d04edf395976464afd9adc3e929c41d4d21d25e3182","up":true},{"one":"20aeb14f567dd16f06b0d3b589b83283daa00a5ed10e447860bda946baccdd2d","other":"2a97d308a720274a440dfa6901ca0a5480af9bab58dd8a6c4afdb9c83ea964c3","up":true},{"one":"b5b24532d2810e311e10b1d606baf6007f9124b88a178b32713cf1eddae089be","other":"b2b5ba1bb188f18f79b295f2c0d48c52c1d1d449ecb9b94b9984f3a6179732c7","up":true},{"one":"2d3645c4fdf9a2809a909076b9ee5fb98fa880f6faeff914f1a2987af928cd79","other":"3f946957d910179c7e1a83c44369aacfc31f5727b1a6421a01c8a978ccd349a2","up":true},{"one":"fe316679eca0e0eb823325812a56fd27da02653b06ada2fd03b27501bda8371a","other":"f7fa2986ec9f84822b11a6b00bd03a1dd26f2a0fab90b1b308f08caead43cfe1","up":true},{"one":"b2a563ac59bab4dfddf7b6e27b80ee7afdeb2e4295411107903f484bcf9fc4f2","other":"af02b5d107b3a17f539c7f9020ebe74322434634e70c420a7f56776eb5d9db73","up":true},{"one":"c6cf46239078edfb343c645f039725fdee1bbba8b0a6da02e2cc456b9223c9a2","other":"c620752a083ca1ff0398937235cf964133939452c293c799ce07ff8aa2bde420","up":true},{"one":"256e81c5a6fb43bd343345477f8f96aa1947f07ac3297f631ab03f060147b062","other":"0c28cd1315890629896d0fe5517524d4eb788f7444709c135ea690ba4e6103d5","up":true},{"one":"0fc59bd04ac9de3195e3c9d0eb573952a5805dd2e7e572078b6e996778adec73","other":"90a85cb7363ede161ec21cc89f8b9d4350e566cf10586a66d31b0a8677620aa1","up":true},{"one":"3efc4b120b3eeeac186bf3a4cd42eb8c647f7edb08c23ee643e2bec9d72c5bed","other":"3e8efcaf3002522b39065ea30c15426d1eb55916499eff8eb5a814e39d41853c","up":true},{"one":"0d8a919207fb2d5718eab7da95f8efeb01a4e1ae39602d315f8ba2ff1752d9da","other":"2ccfb5b1f3923d35fef88838c508b98b5516c5d409643881d2304ae49e50eed3","up":true},{"one":"d1d719ce1dca507598449afe966396c160ad25ad632112ab268b1d913b490dbd","other":"c43fbee95380007274b8f231fe34bcd59b5c0ef0830b174967d4702627984fc6","up":true},{"one":"c59e3953b64e5b9ffbe53990a358914f2fa8e3551d33f92b9e3a441bd1baf2cd","other":"d863ba7405eb07ccddbf1d34efbcbec2867a93a109ed9413d9aecf30d3645a6a","up":true},{"one":"2f32d54f06989efb6ca5431b74cd759fba05dbef36ecff8fd506e662026af983","other":"3ec530761ddb87f930fda919be67df18074c6f0795292add1b2a91ff3d9c39e3","up":true},{"one":"ed2d3e1e5693b44494808907c98ec54d6d08331945d2a2c03e31130fef1d2586","other":"d29941d6b8acd86cf32fd1c2181da3ab1da3c2083134b068ca49ce29aa86b783","up":true},{"one":"f4565dd2c428c03d7a8d5fad87a6dd5f92ae706529eb6152d36fa584e7cdbe4d","other":"f925c85e6457ac01f0cd6b297155f9d3ae611603890d8f3a45e1396d937f8680","up":true},{"one":"ba884e5cfa1ee6eb38217181711e01bb0c37b3e33d1424dfa89ed3e29ef6205b","other":"b02b01a5c37cb05c287a3dc7d04e305de26f8d62dc388542eeb43e97db7b4282","up":true},{"one":"c9f5acafbbf8c66647de05b0848d79451eee490709d53f118fc2051410cc8203","other":"ec52270604007673d1bfda1edbd8bfa945a21141efd85e42b684a9f30f8cddae","up":true},{"one":"fe2167fd33f383110eb3f6caa7bd905ca54fa0c810f1b8a34483a846f3cbddab","other":"f31cc744ea921fee8364c5269b1ce7ec6b5f0c0cbb6885efbf602de5b36f6169","up":true},{"one":"f4e09f89287bd1af7833acd85ba7cc71fdb3ff34f2f409e1cf2a878dcd3183dc","other":"c1f9e8e1d509febdf1f267bb227741e513420048a2e669ac9eef4b05a29cf10b","up":true},{"one":"ef1b70bf090bc9994b1d45e2812c56ecb430a89c346a436bd10880bcda700351","other":"f629b8b9e79c75ac559daf9bf4fc8672bfdd595cf2c5d17a8885282626fc65a5","up":true},{"one":"c6cf46239078edfb343c645f039725fdee1bbba8b0a6da02e2cc456b9223c9a2","other":"da67ace34f7076a1d550bc61bc2a31da88d6cd9f9df43b142a8c6bbade1b4aee","up":true},{"one":"478278187cd9af799e83340a2f49b0b7f122fb8e08c0a372a87795426eab364b","other":"444722a15b01a0d8e6794798d239fe621d59bdfc08823ab47cbd8b9acebd23b4","up":true},{"one":"4636f00be60a9b494a3ebc9ab41cc7cb53ec0b0beff214db2d0a248dc3aeb6af","other":"46fee69dad8b6a6a87d356d10db25d835a0c4e154bf179e88fb4cc65f97d72d7","up":true},{"one":"ef07be559914ec4b5930d90d8d8b6f32dab9eba23acc36f14d512307f9974348","other":"e8efe8016fe6cf649b2755bee22da35ccc6c9c55d404d5385d61f6ea27b84380","up":true},{"one":"461cc9f064e6f4f06ff38e0d1f3f00ef8807ba31c7258e453cc682e9551bb1c6","other":"5f00b3bebef2f5484ff1386298add68a6743a106200ae8a13a27dbb52714ee8f","up":true},{"one":"c59e3953b64e5b9ffbe53990a358914f2fa8e3551d33f92b9e3a441bd1baf2cd","other":"c43fbee95380007274b8f231fe34bcd59b5c0ef0830b174967d4702627984fc6","up":true},{"one":"c786ff8667f509b5a9519984c1d95c83a5d2e257500a71429e8f23af610ce771","other":"c6cf46239078edfb343c645f039725fdee1bbba8b0a6da02e2cc456b9223c9a2","up":true},{"one":"ed2d3e1e5693b44494808907c98ec54d6d08331945d2a2c03e31130fef1d2586","other":"e8efe8016fe6cf649b2755bee22da35ccc6c9c55d404d5385d61f6ea27b84380","up":true},{"one":"e775e9759d4701bd9b43c22f1d1be73c1262b2752bb23cb3857485daf1dcad2d","other":"f5b24a1fd2cd2908b408562f9a265ee1a692b137e770137afa5fdfa07b237221","up":true},{"one":"2f32d54f06989efb6ca5431b74cd759fba05dbef36ecff8fd506e662026af983","other":"3b78bc987c7c31c94e8ada9b4b11b5db9387fe70dd01ce7f3e976d3bec433dec","up":true},{"one":"30897492824b19540d13ef17c70845be6dde455dca4e4f84cfca14a2c373969f","other":"3f946957d910179c7e1a83c44369aacfc31f5727b1a6421a01c8a978ccd349a2","up":true},{"one":"7b90e939ae2a240f0d74a923afb6bbf11f6d5b99a7bf85f1825b1ea36bce744c","other":"7dc2a9573f253f362ef1b21bbfcc144b11a6febc58aa3c4430224160e9fa738c","up":true},{"one":"f5dc78ff71a63fc2014b9553723ee676c63fc078a32a46b7cb172f357a118140","other":"f27f1044777e05f3f60165d0d2fc3e7667fe148e0ca7a097805d60b9f61025f7","up":true},{"one":"006727dc6f59b120b24c17b8e63f80ef3439105f8118ffeed408f105a48ee60c","other":"11d43f6ed0ddd5afa5c8a7abf7c62a4fa865b7a25ee295bf1a49701ef3081363","up":true},{"one":"256e81c5a6fb43bd343345477f8f96aa1947f07ac3297f631ab03f060147b062","other":"3ec530761ddb87f930fda919be67df18074c6f0795292add1b2a91ff3d9c39e3","up":true},{"one":"b65ee2549536a806ceef4a7ccc9544567cafe6204080929fc847df0a3781ccc9","other":"baddc778aea97acdbbb5bc99744a5545abab9f6047c81f328761645287ac391c","up":true},{"one":"18f6e66e1cc8e620808901b571fdf525ee8f41850fac0bd0e5c5a4de70c5f873","other":"0b72054403f78a64a787f46e9f26bf0de7bbba5a60cb105e6aeea46cb4a1d9fe","up":true},{"one":"e8548b5df15adf0f2a997ff5709827beb5e1d36bb08a2f2d017746d5c0e83fca","other":"f925c85e6457ac01f0cd6b297155f9d3ae611603890d8f3a45e1396d937f8680","up":true},{"one":"1f85b8c05e5dceff0bd8256f8f6d80d4b902a9754ceb952d95ea2e1150ef9e59","other":"0c28cd1315890629896d0fe5517524d4eb788f7444709c135ea690ba4e6103d5","up":true},{"one":"a653302730df3d58f796906a93933aa81494f2588d9485ab7676ec3b0ccbb426","other":"b5025d153581d333b44df4b9bfa69d87de138905172e4fd317e16f7099a5fcf8","up":true},{"one":"ba884e5cfa1ee6eb38217181711e01bb0c37b3e33d1424dfa89ed3e29ef6205b","other":"b65ee2549536a806ceef4a7ccc9544567cafe6204080929fc847df0a3781ccc9","up":true},{"one":"1e2aca93fa9442a0034ae8d295530dde16fcbfa8c37227e2e6863babb0f87c34","other":"154be9255e9aebd134a914070f5e6f3d4bba079d9ca738b74244db14e1b586dd","up":true},{"one":"915d7a0510bad19266eef8f00ca0cb2efc340253775706495fca8b9160b512cc","other":"f7fa2986ec9f84822b11a6b00bd03a1dd26f2a0fab90b1b308f08caead43cfe1","up":true},{"one":"f2d5533eed4b0c184952d859d67e44abe5a75a5de6111c8c106b8f4b2d8ccfc4","other":"f528aaafd67b20dafdce101db224aa01c70f93bdc91c14f50fa8db1dbf9fc386","up":true},{"one":"32371744163f0b3aefd3955dc4877e7eb82b17ef9541c333ca9c0a9f8aec3045","other":"2c79af7ea85f96db7897cf8cdb4d002ad2308194e03981876edb8d904ef65137","up":true},{"one":"68317431e4fa55be4a700e35c6a578307cc32b72336679b5c5618b622ef0c602","other":"165f1af67aa1d24569e0bdff61d29b3c39e93250071d8f25b5be6face209ac6a","up":true},{"one":"2d3645c4fdf9a2809a909076b9ee5fb98fa880f6faeff914f1a2987af928cd79","other":"35e6b1d31f594c06b759525434a7e717ebe6f27ca0188f247ed1247664a50563","up":true},{"one":"3efc4b120b3eeeac186bf3a4cd42eb8c647f7edb08c23ee643e2bec9d72c5bed","other":"33b5c521b4208e26414db2e05c9a8ccc001a524d928579d44d2e74d14a56593e","up":true},{"one":"d7aca8f2182bc625d2b3c942bd1161c85bcf1c2b34ecbe3e2fd23cfae6b8a871","other":"df1e4e46e8ec26cad74b4f35ab070f12c8f6fddca35ac44c1218ff60fe1e6bab","up":true},{"one":"30897492824b19540d13ef17c70845be6dde455dca4e4f84cfca14a2c373969f","other":"3630e05326bacea8fcc739dec42085f845f416ddc698c76ff91f099eb1dc5007","up":true},{"one":"f5dc78ff71a63fc2014b9553723ee676c63fc078a32a46b7cb172f357a118140","other":"c26fd5e6504c7b3f0a6d9133ff87c98c110eb1c201c5f3bcf6b10653f2b972d2","up":true},{"one":"6e68ea86440706a0d73a9508f2247492543163f8fa7e2dc2aa62b74d50261b8b","other":"0ff2d2c49547eebc96675e0b88073dea5e9091bee1843ffe567127e34486c348","up":true},{"one":"fbf5e917be45e909697a9393c4778206333cf1dd9a103978e8d71622ca3b1cc8","other":"f773b83f1a1de2ab6660edb0b765cfccec6778061ee25c5a84f968625686ef60","up":true},{"one":"ba884e5cfa1ee6eb38217181711e01bb0c37b3e33d1424dfa89ed3e29ef6205b","other":"baf219e9229921b773d1ad7eb7eb5216cfa60ccecaa3c5c487e3b71cb600ba12","up":true},{"one":"03285e06657032778feff0b43828c964dbf9de669f63171aeb587aa1a1facc0a","other":"0ff2d2c49547eebc96675e0b88073dea5e9091bee1843ffe567127e34486c348","up":true},{"one":"103b232552b94090232195dc88f84823701f35ae536b5af6dd33fa655a33cbae","other":"165f1af67aa1d24569e0bdff61d29b3c39e93250071d8f25b5be6face209ac6a","up":true},{"one":"6c73150490e8be9677c40086de0aefed1939581048e26f4a93f5ca26571a1a8f","other":"7dd3078c71087ab88d4d26a962820bcb79b8ce30e91c1f9a69d4bf8d38086960","up":true},{"one":"ed2d3e1e5693b44494808907c98ec54d6d08331945d2a2c03e31130fef1d2586","other":"e8830f2b2f7d08df15bd33f4b2841d01d9d62c1621234bd6ae86743e52360f3e","up":true},{"one":"efeae3b7f610dc10acc51068e7718876d147cd78a9a28788c5dba5bb3a6950dc","other":"c26fd5e6504c7b3f0a6d9133ff87c98c110eb1c201c5f3bcf6b10653f2b972d2","up":true},{"one":"478278187cd9af799e83340a2f49b0b7f122fb8e08c0a372a87795426eab364b","other":"455936fd22c43794e6e2104fd91d3f5d246e3823e8ff8eaf8dc27aa9f3d2ee08","up":true},{"one":"b2a563ac59bab4dfddf7b6e27b80ee7afdeb2e4295411107903f484bcf9fc4f2","other":"b89793c3ccd9ea642080728732ce7df33778653fed3d1d8f3a25e60670e33325","up":true},{"one":"f4565dd2c428c03d7a8d5fad87a6dd5f92ae706529eb6152d36fa584e7cdbe4d","other":"f45f1f2e59e947e04fa15bcf87f872ef6d73b73f778e12d1f9b8930ea166eefc","up":true},{"one":"ef1b70bf090bc9994b1d45e2812c56ecb430a89c346a436bd10880bcda700351","other":"f5b24a1fd2cd2908b408562f9a265ee1a692b137e770137afa5fdfa07b237221","up":true},{"one":"9890e6ebb2c6f9a7bec4c2778e077e3710ce3af356f82ae9b4d324832d159ef7","other":"96fcf14c7f90350091ac6fcb58306ccfb9e4a38d3da59f8ab656854332844cbd","up":true},{"one":"daec45eca40f48843b41f70267c07e94996ced829f02710f15354fbe26e177e7","other":"c1f9e8e1d509febdf1f267bb227741e513420048a2e669ac9eef4b05a29cf10b","up":true},{"one":"1f85b8c05e5dceff0bd8256f8f6d80d4b902a9754ceb952d95ea2e1150ef9e59","other":"30bec7cd0a7d002839aed7654129bd2fe2e2ce7f42aa7bae1560e8bf718954c3","up":true},{"one":"f31cc744ea921fee8364c5269b1ce7ec6b5f0c0cbb6885efbf602de5b36f6169","other":"daec45eca40f48843b41f70267c07e94996ced829f02710f15354fbe26e177e7","up":true},{"one":"35e6b1d31f594c06b759525434a7e717ebe6f27ca0188f247ed1247664a50563","other":"2c79af7ea85f96db7897cf8cdb4d002ad2308194e03981876edb8d904ef65137","up":true},{"one":"fe2167fd33f383110eb3f6caa7bd905ca54fa0c810f1b8a34483a846f3cbddab","other":"f2d5533eed4b0c184952d859d67e44abe5a75a5de6111c8c106b8f4b2d8ccfc4","up":true},{"one":"03285e06657032778feff0b43828c964dbf9de669f63171aeb587aa1a1facc0a","other":"00c6488a842ece7a8b0daf064e405de03a4257d308840ea52bfd48d23f54d895","up":true},{"one":"5cd2377226825dc7ea582315cd108d23502df4e9c7c09fc07e7b4aa56440de29","other":"51db114a52827f5b74088bd0fc87d35229e7740e7d121bd7699298396516a880","up":true},{"one":"5b632eaf700d173ff15f4727b85817e6173228c304b422434a08c2cad438b825","other":"5db08436c64f4cc9e2b3950e35bc8ad739825e3efa67a642c771d95b34cb420c","up":true},{"one":"af02b5d107b3a17f539c7f9020ebe74322434634e70c420a7f56776eb5d9db73","other":"b5025d153581d333b44df4b9bfa69d87de138905172e4fd317e16f7099a5fcf8","up":true},{"one":"2c79af7ea85f96db7897cf8cdb4d002ad2308194e03981876edb8d904ef65137","other":"2abb938b889a2eb735134462985a56056be48f189b5b89d23b653864c76427f4","up":true},{"one":"b5025d153581d333b44df4b9bfa69d87de138905172e4fd317e16f7099a5fcf8","other":"b89793c3ccd9ea642080728732ce7df33778653fed3d1d8f3a25e60670e33325","up":true},{"one":"3efc4b120b3eeeac186bf3a4cd42eb8c647f7edb08c23ee643e2bec9d72c5bed","other":"24b85c10f098725938ea7d87cd24a4b10358129906fca9790fc266ea8784b538","up":true},{"one":"ba884e5cfa1ee6eb38217181711e01bb0c37b3e33d1424dfa89ed3e29ef6205b","other":"b911b8e2d72532b7c66ff5f7bffa70f5ddbeea6903a86f9333399f0c4b5f0fe8","up":true},{"one":"2f32d54f06989efb6ca5431b74cd759fba05dbef36ecff8fd506e662026af983","other":"3efc4b120b3eeeac186bf3a4cd42eb8c647f7edb08c23ee643e2bec9d72c5bed","up":true},{"one":"c786ff8667f509b5a9519984c1d95c83a5d2e257500a71429e8f23af610ce771","other":"9d0f804849b72397646ba48208ba1e01dcf4de04e788016c4a1a0c93e650ddf5","up":true},{"one":"68317431e4fa55be4a700e35c6a578307cc32b72336679b5c5618b622ef0c602","other":"6c73150490e8be9677c40086de0aefed1939581048e26f4a93f5ca26571a1a8f","up":true},{"one":"b65ee2549536a806ceef4a7ccc9544567cafe6204080929fc847df0a3781ccc9","other":"b7cafed41dac01dd59e2bcaeaaab551ebfeab8eaa1f97c1866fe0ddae772807b","up":true},{"one":"33737df75bbac1b41c63f05ea2cf1523b972df17f22bda026db84a49ac35e1e3","other":"3e8efcaf3002522b39065ea30c15426d1eb55916499eff8eb5a814e39d41853c","up":true},{"one":"32371744163f0b3aefd3955dc4877e7eb82b17ef9541c333ca9c0a9f8aec3045","other":"29957e8e92925a8c79bdf513295d96bfb62fbfc597ee1cf767c7ef408f1b1295","up":true},{"one":"db6a1f6b342f6be9517f8df01003797c11c837d9aee3cdba5b7859230b36c35d","other":"d7aca8f2182bc625d2b3c942bd1161c85bcf1c2b34ecbe3e2fd23cfae6b8a871","up":true},{"one":"976e57d0c32227222bfd0cbb802f269bdcd52d5d33cf689c66b12c023f5fa8bf","other":"9d0f804849b72397646ba48208ba1e01dcf4de04e788016c4a1a0c93e650ddf5","up":true},{"one":"b7cafed41dac01dd59e2bcaeaaab551ebfeab8eaa1f97c1866fe0ddae772807b","other":"88a141c607019477c7b120a506285a7218cad2faa038082e0b9ddfcc9cb78d07","up":true},{"one":"154be9255e9aebd134a914070f5e6f3d4bba079d9ca738b74244db14e1b586dd","other":"1c8a10ecbd72acb2bbbb8b77ea5404f9e90f4dbf306ec8134cfed70b40aef399","up":true},{"one":"006727dc6f59b120b24c17b8e63f80ef3439105f8118ffeed408f105a48ee60c","other":"0af9a57a2f66835cd3e4e71bc026013a8a99ca337a7b6b6cc34e11d8da212a4f","up":true},{"one":"915d7a0510bad19266eef8f00ca0cb2efc340253775706495fca8b9160b512cc","other":"976e57d0c32227222bfd0cbb802f269bdcd52d5d33cf689c66b12c023f5fa8bf","up":true},{"one":"886aff1f1e3b86bfe901066bb7948451c18fe3f8cd1b7318b05154890ca8f738","other":"88fefb7506105c0e269baf52955a01b19f55504b13133bac0beab41c9f6e6942","up":true},{"one":"53087084708cc5ee63ac459b18fa10ae52a823139b4ecba6c8691d4934f2f971","other":"63370e288ab2e4b8403c6678e9c44ae5c7496b5ead614306fceb85986ed29d18","up":true},{"one":"d640472351969a5578e541aca72b7640c583b995fd62607ff3ee3f3f3139aafd","other":"d29941d6b8acd86cf32fd1c2181da3ab1da3c2083134b068ca49ce29aa86b783","up":true},{"one":"30897492824b19540d13ef17c70845be6dde455dca4e4f84cfca14a2c373969f","other":"32371744163f0b3aefd3955dc4877e7eb82b17ef9541c333ca9c0a9f8aec3045","up":true},{"one":"a6fbe16b81d240ff2f2ed6c93cfd9590731dfb2e7ec3fce1c098fe542bedf299","other":"a34ea2e87d4c12adb27d66c2c95300603ff50415974e000bbcc69a5ae059dbf1","up":true},{"one":"e7fa7112adc7b023dd5965e620277122542153f87eaf5deeacc8a51f1778ba77","other":"c620752a083ca1ff0398937235cf964133939452c293c799ce07ff8aa2bde420","up":true},{"one":"478278187cd9af799e83340a2f49b0b7f122fb8e08c0a372a87795426eab364b","other":"4636f00be60a9b494a3ebc9ab41cc7cb53ec0b0beff214db2d0a248dc3aeb6af","up":true},{"one":"e54784cfbcd89c37c8f758aae70ece3ab4b7f8c30fb4ef7543e04aa89ff4386b","other":"9d0f804849b72397646ba48208ba1e01dcf4de04e788016c4a1a0c93e650ddf5","up":true},{"one":"af02b5d107b3a17f539c7f9020ebe74322434634e70c420a7f56776eb5d9db73","other":"850575577d6b420a87aba388af481e0c044c2f75cf29ff934daf5674318a61ba","up":true},{"one":"2c79af7ea85f96db7897cf8cdb4d002ad2308194e03981876edb8d904ef65137","other":"21a044e772b7c955fe4a6fb7c3a9a20e95d48b7fd6b9518741782f04f5f1f5c2","up":true},{"one":"bb90464f769a85549c150f861775aa67924c7c651f393f6c70772707376a5c7e","other":"ad9899f78659492ec248a884927a757f3f3b4e76cd2abc46ad8766251fd8afed","up":true},{"one":"fe2167fd33f383110eb3f6caa7bd905ca54fa0c810f1b8a34483a846f3cbddab","other":"ed2d3e1e5693b44494808907c98ec54d6d08331945d2a2c03e31130fef1d2586","up":true},{"one":"6c73150490e8be9677c40086de0aefed1939581048e26f4a93f5ca26571a1a8f","other":"6251e9540448726a601699ef4cd19e50c969a746da27228967338cdc09d628bf","up":true},{"one":"7b90e939ae2a240f0d74a923afb6bbf11f6d5b99a7bf85f1825b1ea36bce744c","other":"7920d69cf7e458fce0781ea1a4e07768e1a69f6818090eff0abf0b4a0c2c35f8","up":true},{"one":"f5dc78ff71a63fc2014b9553723ee676c63fc078a32a46b7cb172f357a118140","other":"caf6a8e37fd41c1e6ad77a8575cd90354bb1693893952301c9caeb4779c338d3","up":true},{"one":"5b632eaf700d173ff15f4727b85817e6173228c304b422434a08c2cad438b825","other":"58ed74695bf527bac9a350c86d305e53e08c4999795e11cd3b2a36f5cd25d637","up":true},{"one":"1e2aca93fa9442a0034ae8d295530dde16fcbfa8c37227e2e6863babb0f87c34","other":"1a2a0e0bbf83cd40936995674418ae469aa2b92876a4ceeabd8128f536b7d7a2","up":true},{"one":"1c8a10ecbd72acb2bbbb8b77ea5404f9e90f4dbf306ec8134cfed70b40aef399","other":"30bec7cd0a7d002839aed7654129bd2fe2e2ce7f42aa7bae1560e8bf718954c3","up":true},{"one":"ba884e5cfa1ee6eb38217181711e01bb0c37b3e33d1424dfa89ed3e29ef6205b","other":"bcc6724e54f761361f85147eb102a8d1a1a38810a940ce76b1e361ddcadacaa3","up":true},{"one":"cc2037c08942a094df12f45831f28e0015fc3ac04d5b8f24ffea9bf3a0b02c39","other":"f31cc744ea921fee8364c5269b1ce7ec6b5f0c0cbb6885efbf602de5b36f6169","up":true},{"one":"17040a3aad5930d8e0de1011fd2996b7d09225989f0dc1ae8f7e7a52dd26ab4e","other":"0e5e0bb1383b2ec569b157a1d2ae6900592ab892a28367f5613a4e29cb265088","up":true},{"one":"20aeb14f567dd16f06b0d3b589b83283daa00a5ed10e447860bda946baccdd2d","other":"2ccfb5b1f3923d35fef88838c508b98b5516c5d409643881d2304ae49e50eed3","up":true},{"one":"5cd2377226825dc7ea582315cd108d23502df4e9c7c09fc07e7b4aa56440de29","other":"53087084708cc5ee63ac459b18fa10ae52a823139b4ecba6c8691d4934f2f971","up":true},{"one":"2c3894b6e47cf19ac7ee9fe213196312f676256f670dff25b03563492550bc74","other":"2ccfb5b1f3923d35fef88838c508b98b5516c5d409643881d2304ae49e50eed3","up":true},{"one":"1c47ad5bd8846f777daf59587feccc308f4dc63f6d27b1385ff8085c75bb1aac","other":"1b830ed484b274a96ec7ba2f9a42b6859412b5334a564014ff3f11597ea3a32d","up":true},{"one":"e027a9f7152641c4a41154f8ce4dafd23895c312150efea86bf4152c88d0ca86","other":"e54b643cbc95d9f5d27ec3760d892b6802981bfabf4f9979267d66259df982c7","up":true},{"one":"915d7a0510bad19266eef8f00ca0cb2efc340253775706495fca8b9160b512cc","other":"886aff1f1e3b86bfe901066bb7948451c18fe3f8cd1b7318b05154890ca8f738","up":true},{"one":"b2a563ac59bab4dfddf7b6e27b80ee7afdeb2e4295411107903f484bcf9fc4f2","other":"b95d88ff6512ef8eaaa6bd842fa44175c1484fc2e8601b83d50a5ffa992bfa3a","up":true},{"one":"6ea51fb6e4783f351dbbfa47b508c78c73233ebaada409dfb55446217f92c4bd","other":"775e7be502df8fd938cf9c42ee4fac33e460a4b6992b9efeb8dc1ff7dde5c40f","up":true},{"one":"9852ce267d53106a6e584d6eddb08e0062eb4a422d2a8d39ad6dccaebac552ff","other":"90a85cb7363ede161ec21cc89f8b9d4350e566cf10586a66d31b0a8677620aa1","up":true},{"one":"a6fbe16b81d240ff2f2ed6c93cfd9590731dfb2e7ec3fce1c098fe542bedf299","other":"b626d472b555e6f950a7142783db8deb443a74e63ef6bd72a87eaf1af14ca805","up":true},{"one":"18f6e66e1cc8e620808901b571fdf525ee8f41850fac0bd0e5c5a4de70c5f873","other":"1b830ed484b274a96ec7ba2f9a42b6859412b5334a564014ff3f11597ea3a32d","up":true},{"one":"6e68ea86440706a0d73a9508f2247492543163f8fa7e2dc2aa62b74d50261b8b","other":"6967e7438125c2045d575eb9f407b4a38d1bf9dcd1c1c1a97f750da6a21aeff7","up":true},{"one":"30897492824b19540d13ef17c70845be6dde455dca4e4f84cfca14a2c373969f","other":"33737df75bbac1b41c63f05ea2cf1523b972df17f22bda026db84a49ac35e1e3","up":true},{"one":"19faaf891eb6a716902ec29d201dc2094ee474acff188ae86faf9760674b2d37","other":"103b232552b94090232195dc88f84823701f35ae536b5af6dd33fa655a33cbae","up":true},{"one":"d7aca8f2182bc625d2b3c942bd1161c85bcf1c2b34ecbe3e2fd23cfae6b8a871","other":"e5d794d64003725a74642f097c0ee76706d78419b6f3ea819d440bc0ad166eac","up":true},{"one":"67aa5463e4b32b363b3d01d2a41ccb03199411057276f4962d053160be29a6ef","other":"6e05179dc90a8f6654d0c9a3f06173371dcfb18b852fdd77f35f75e38f273125","up":true},{"one":"e775e9759d4701bd9b43c22f1d1be73c1262b2752bb23cb3857485daf1dcad2d","other":"f45f1f2e59e947e04fa15bcf87f872ef6d73b73f778e12d1f9b8930ea166eefc","up":true},{"one":"256e81c5a6fb43bd343345477f8f96aa1947f07ac3297f631ab03f060147b062","other":"2abb938b889a2eb735134462985a56056be48f189b5b89d23b653864c76427f4","up":true},{"one":"33737df75bbac1b41c63f05ea2cf1523b972df17f22bda026db84a49ac35e1e3","other":"2c79af7ea85f96db7897cf8cdb4d002ad2308194e03981876edb8d904ef65137","up":true},{"one":"2d3645c4fdf9a2809a909076b9ee5fb98fa880f6faeff914f1a2987af928cd79","other":"32371744163f0b3aefd3955dc4877e7eb82b17ef9541c333ca9c0a9f8aec3045","up":true},{"one":"7e0458ecdf7081443cab5412529f3948ece659facaca03208496c80dd136e704","other":"7920d69cf7e458fce0781ea1a4e07768e1a69f6818090eff0abf0b4a0c2c35f8","up":true},{"one":"b820e480354000c837b1781ec1c493e8776b4834252e6453425ac05b925b5a58","other":"b95d88ff6512ef8eaaa6bd842fa44175c1484fc2e8601b83d50a5ffa992bfa3a","up":true},{"one":"f4565dd2c428c03d7a8d5fad87a6dd5f92ae706529eb6152d36fa584e7cdbe4d","other":"f5b24a1fd2cd2908b408562f9a265ee1a692b137e770137afa5fdfa07b237221","up":true},{"one":"1436aaa8770e9f1c6294e49f4066c16b1caa50524e9b8fd058059e41657d2a83","other":"16725e318322353befc2f2aba112f0984bc011821bb16c98e2cd8b39cd62aea1","up":true},{"one":"f31cc744ea921fee8364c5269b1ce7ec6b5f0c0cbb6885efbf602de5b36f6169","other":"f528aaafd67b20dafdce101db224aa01c70f93bdc91c14f50fa8db1dbf9fc386","up":true},{"one":"c9f5acafbbf8c66647de05b0848d79451eee490709d53f118fc2051410cc8203","other":"f7fa2986ec9f84822b11a6b00bd03a1dd26f2a0fab90b1b308f08caead43cfe1","up":true},{"one":"c6cf46239078edfb343c645f039725fdee1bbba8b0a6da02e2cc456b9223c9a2","other":"caf6a8e37fd41c1e6ad77a8575cd90354bb1693893952301c9caeb4779c338d3","up":true},{"one":"0de3915b0bcc68040c8aa76fbd2cfa0714e9b34c9dbe0838a7cba81c4f73581c","other":"06618d829a8a7317a98f1a40ecf8864e1c94c4e270a9e4c008229dc7cf937b7e","up":true},{"one":"f629b8b9e79c75ac559daf9bf4fc8672bfdd595cf2c5d17a8885282626fc65a5","other":"d7aca8f2182bc625d2b3c942bd1161c85bcf1c2b34ecbe3e2fd23cfae6b8a871","up":true},{"one":"fe2167fd33f383110eb3f6caa7bd905ca54fa0c810f1b8a34483a846f3cbddab","other":"ee5e77df690329c132f2f7fca223cfd384b7bc34ec38763a4eb42780e0585656","up":true},{"one":"20aeb14f567dd16f06b0d3b589b83283daa00a5ed10e447860bda946baccdd2d","other":"0cf596af91eb9b041fe6dbe6b288c5730413850321b5ab176c81447e34ef79c5","up":true},{"one":"4d103ec5afee559a5a9242e8d650b67301eaec10e96fc2f184e34d48554108a2","other":"4d59cf1aeecf370e94a7a231887450cef97053b9c88a7fd11e210840af070e29","up":true},{"one":"33b5c521b4208e26414db2e05c9a8ccc001a524d928579d44d2e74d14a56593e","other":"3f946957d910179c7e1a83c44369aacfc31f5727b1a6421a01c8a978ccd349a2","up":true},{"one":"1e2aca93fa9442a0034ae8d295530dde16fcbfa8c37227e2e6863babb0f87c34","other":"13d6cb9316e289923e2d1de7f3c966d0cbabce3acdb8017122944f4abb140912","up":true},{"one":"4636f00be60a9b494a3ebc9ab41cc7cb53ec0b0beff214db2d0a248dc3aeb6af","other":"455936fd22c43794e6e2104fd91d3f5d246e3823e8ff8eaf8dc27aa9f3d2ee08","up":true},{"one":"4646fe4c119078738612b44a356089b3c73a08e11cfd910675d211ae6b20b8fd","other":"4bcf4eb531d5ec4b31d99e8354af03f976524c7858a1e7043e9b7055326f0952","up":true},{"one":"f5dc78ff71a63fc2014b9553723ee676c63fc078a32a46b7cb172f357a118140","other":"f4565dd2c428c03d7a8d5fad87a6dd5f92ae706529eb6152d36fa584e7cdbe4d","up":true},{"one":"0b72054403f78a64a787f46e9f26bf0de7bbba5a60cb105e6aeea46cb4a1d9fe","other":"0fc59bd04ac9de3195e3c9d0eb573952a5805dd2e7e572078b6e996778adec73","up":true},{"one":"5b632eaf700d173ff15f4727b85817e6173228c304b422434a08c2cad438b825","other":"51db114a52827f5b74088bd0fc87d35229e7740e7d121bd7699298396516a880","up":true},{"one":"8025c1fcb98e53f92767d1d43a3057a0acd1e8994bb4a7e3f5e244110e0dcf91","other":"9fa0215e980dc907df4cc47ab4937f36527d78f9837493016fd4fc51e617299c","up":true},{"one":"886aff1f1e3b86bfe901066bb7948451c18fe3f8cd1b7318b05154890ca8f738","other":"88a141c607019477c7b120a506285a7218cad2faa038082e0b9ddfcc9cb78d07","up":true},{"one":"5cd2377226825dc7ea582315cd108d23502df4e9c7c09fc07e7b4aa56440de29","other":"58ed74695bf527bac9a350c86d305e53e08c4999795e11cd3b2a36f5cd25d637","up":true},{"one":"154be9255e9aebd134a914070f5e6f3d4bba079d9ca738b74244db14e1b586dd","other":"1436aaa8770e9f1c6294e49f4066c16b1caa50524e9b8fd058059e41657d2a83","up":true},{"one":"19faaf891eb6a716902ec29d201dc2094ee474acff188ae86faf9760674b2d37","other":"1436aaa8770e9f1c6294e49f4066c16b1caa50524e9b8fd058059e41657d2a83","up":true},{"one":"baf219e9229921b773d1ad7eb7eb5216cfa60ccecaa3c5c487e3b71cb600ba12","other":"ad9899f78659492ec248a884927a757f3f3b4e76cd2abc46ad8766251fd8afed","up":true},{"one":"976e57d0c32227222bfd0cbb802f269bdcd52d5d33cf689c66b12c023f5fa8bf","other":"959fda0866d3c18e9399e98485d627044079d6f86b075edaea9315402f5d9395","up":true},{"one":"21012a3a6ef1ece48fd9d7cffe62dc75839dd062efcf3ac5f962c237814da407","other":"3b78bc987c7c31c94e8ada9b4b11b5db9387fe70dd01ce7f3e976d3bec433dec","up":true},{"one":"88fefb7506105c0e269baf52955a01b19f55504b13133bac0beab41c9f6e6942","other":"898d2f7d46b4961b646d5a6142d54d6233b7f80f668ce234522dd02e2cc545cb","up":true},{"one":"a6fbe16b81d240ff2f2ed6c93cfd9590731dfb2e7ec3fce1c098fe542bedf299","other":"b02b01a5c37cb05c287a3dc7d04e305de26f8d62dc388542eeb43e97db7b4282","up":true},{"one":"0c64e5af869b1665fd4016ae6d04c8eedd423636f06d78ecb944ee8e3272a82a","other":"0a005eb9c10c5cc9f720cfec2a655811d391671597b4f32d12df291ec76b2c13","up":true},{"one":"6c73150490e8be9677c40086de0aefed1939581048e26f4a93f5ca26571a1a8f","other":"6ea51fb6e4783f351dbbfa47b508c78c73233ebaada409dfb55446217f92c4bd","up":true},{"one":"0af9a57a2f66835cd3e4e71bc026013a8a99ca337a7b6b6cc34e11d8da212a4f","other":"06618d829a8a7317a98f1a40ecf8864e1c94c4e270a9e4c008229dc7cf937b7e","up":true},{"one":"82f9c9009f09de2d6a77b54976d14c14211eae65d886f6ed57560c700716dd5c","other":"849bcbb9be43b799fefc5e689efc75125da27f536e97e5b7921031520ae6e5d8","up":true},{"one":"c786ff8667f509b5a9519984c1d95c83a5d2e257500a71429e8f23af610ce771","other":"976e57d0c32227222bfd0cbb802f269bdcd52d5d33cf689c66b12c023f5fa8bf","up":true},{"one":"006727dc6f59b120b24c17b8e63f80ef3439105f8118ffeed408f105a48ee60c","other":"0743bcf2aaa77e916f4a367d6159473c7d80f46a2e4cbe9ef346e423d39d7072","up":true},{"one":"6e68ea86440706a0d73a9508f2247492543163f8fa7e2dc2aa62b74d50261b8b","other":"67dcfd21ece30b41a39bc55c0986fca8f401bb3acba821969519f09d0933e8bd","up":true},{"one":"7a608d2cf9d1d9c5819dc1f9e88e5cb2852aadea01c40e047c2e184b62e7163c","other":"63370e288ab2e4b8403c6678e9c44ae5c7496b5ead614306fceb85986ed29d18","up":true},{"one":"e027a9f7152641c4a41154f8ce4dafd23895c312150efea86bf4152c88d0ca86","other":"e8efe8016fe6cf649b2755bee22da35ccc6c9c55d404d5385d61f6ea27b84380","up":true},{"one":"915d7a0510bad19266eef8f00ca0cb2efc340253775706495fca8b9160b512cc","other":"82f9c9009f09de2d6a77b54976d14c14211eae65d886f6ed57560c700716dd5c","up":true},{"one":"f2d5533eed4b0c184952d859d67e44abe5a75a5de6111c8c106b8f4b2d8ccfc4","other":"f7baef876a62b92ebe5ca9ec6a085e0eb54fd31e2425e662eec747df3cd77592","up":true},{"one":"140020a23a840b8840ba0c2c384f853a606330e9743885e9967cf49533db282e","other":"0cf596af91eb9b041fe6dbe6b288c5730413850321b5ab176c81447e34ef79c5","up":true},{"one":"f31cc744ea921fee8364c5269b1ce7ec6b5f0c0cbb6885efbf602de5b36f6169","other":"f4e09f89287bd1af7833acd85ba7cc71fdb3ff34f2f409e1cf2a878dcd3183dc","up":true},{"one":"2d3645c4fdf9a2809a909076b9ee5fb98fa880f6faeff914f1a2987af928cd79","other":"39d1fcae2d23c775214988251505c577b9ac7b6851558ddf9a437dfe143f3845","up":true},{"one":"82dd83838cb982b89505ef249d353a20e434346dd78b71cd9b809f71d5c112da","other":"96fcf14c7f90350091ac6fcb58306ccfb9e4a38d3da59f8ab656854332844cbd","up":true},{"one":"4e5a46c004e85cf86a02fdfbf2243018825d015debfb9a077a1283d302293b3a","other":"4bcf4eb531d5ec4b31d99e8354af03f976524c7858a1e7043e9b7055326f0952","up":true},{"one":"0743bcf2aaa77e916f4a367d6159473c7d80f46a2e4cbe9ef346e423d39d7072","other":"02d85b9f8e4776224ae5088683a87837b82b2bfb7e047cf373a28393e7aca6e1","up":true},{"one":"03ccd8d52597d18c0b178ab7361d847d63aad3af920a28345977ae170a1dafcd","other":"1a2a0e0bbf83cd40936995674418ae469aa2b92876a4ceeabd8128f536b7d7a2","up":true},{"one":"f773b83f1a1de2ab6660edb0b765cfccec6778061ee25c5a84f968625686ef60","other":"f528aaafd67b20dafdce101db224aa01c70f93bdc91c14f50fa8db1dbf9fc386","up":true},{"one":"045ba8da4641da3f0b8058bb0d9d8aafbb81496dc1cae2a3fd9c039a7e1cafb6","other":"00c6488a842ece7a8b0daf064e405de03a4257d308840ea52bfd48d23f54d895","up":true},{"one":"5efb3bfc199f5408f79bd6bd5171b4bf332c68a8e49242eb4f6a589b963565c6","other":"51db114a52827f5b74088bd0fc87d35229e7740e7d121bd7699298396516a880","up":true},{"one":"1e2aca93fa9442a0034ae8d295530dde16fcbfa8c37227e2e6863babb0f87c34","other":"1c47ad5bd8846f777daf59587feccc308f4dc63f6d27b1385ff8085c75bb1aac","up":true},{"one":"b65ee2549536a806ceef4a7ccc9544567cafe6204080929fc847df0a3781ccc9","other":"b5025d153581d333b44df4b9bfa69d87de138905172e4fd317e16f7099a5fcf8","up":true},{"one":"4636f00be60a9b494a3ebc9ab41cc7cb53ec0b0beff214db2d0a248dc3aeb6af","other":"4bcf4eb531d5ec4b31d99e8354af03f976524c7858a1e7043e9b7055326f0952","up":true},{"one":"850575577d6b420a87aba388af481e0c044c2f75cf29ff934daf5674318a61ba","other":"aeb4c75a57ccfc9ac053a3d363cf7c1e3e201406587769ab6615d5c2f86a5410","up":true},{"one":"c832b4ad64a17da4b796ffcac646c2aa666b276aabb7eb3bfe7981d64a4da402","other":"c441d27a5f4abaa8e3b0f040a6ef85bb8c970031d6a57503a674e36b3d6915d9","up":true},{"one":"53a885968d68d8ebf7ed514e662cc13fa03186d2361000a03576531fdca2a25f","other":"07a8c900fec6c477580ed5b38848a8681dc52a19e59fa4cd32f571fe7fb2383a","up":true},{"one":"886aff1f1e3b86bfe901066bb7948451c18fe3f8cd1b7318b05154890ca8f738","other":"959fda0866d3c18e9399e98485d627044079d6f86b075edaea9315402f5d9395","up":true},{"one":"c9f5acafbbf8c66647de05b0848d79451eee490709d53f118fc2051410cc8203","other":"f925c85e6457ac01f0cd6b297155f9d3ae611603890d8f3a45e1396d937f8680","up":true},{"one":"19faaf891eb6a716902ec29d201dc2094ee474acff188ae86faf9760674b2d37","other":"13d6cb9316e289923e2d1de7f3c966d0cbabce3acdb8017122944f4abb140912","up":true},{"one":"b5b24532d2810e311e10b1d606baf6007f9124b88a178b32713cf1eddae089be","other":"a6fbe16b81d240ff2f2ed6c93cfd9590731dfb2e7ec3fce1c098fe542bedf299","up":true},{"one":"9fa0215e980dc907df4cc47ab4937f36527d78f9837493016fd4fc51e617299c","other":"b02b01a5c37cb05c287a3dc7d04e305de26f8d62dc388542eeb43e97db7b4282","up":true},{"one":"bb90464f769a85549c150f861775aa67924c7c651f393f6c70772707376a5c7e","other":"b820e480354000c837b1781ec1c493e8776b4834252e6453425ac05b925b5a58","up":true},{"one":"b2a563ac59bab4dfddf7b6e27b80ee7afdeb2e4295411107903f484bcf9fc4f2","other":"baddc778aea97acdbbb5bc99744a5545abab9f6047c81f328761645287ac391c","up":true},{"one":"baf219e9229921b773d1ad7eb7eb5216cfa60ccecaa3c5c487e3b71cb600ba12","other":"b2b5ba1bb188f18f79b295f2c0d48c52c1d1d449ecb9b94b9984f3a6179732c7","up":true},{"one":"c8986871e46f001d15ed8b70f2aa0fea8ae309d5e5671a500f619e3b348c8c15","other":"f31cc744ea921fee8364c5269b1ce7ec6b5f0c0cbb6885efbf602de5b36f6169","up":true},{"one":"c49caff13862dc089f1f9b8180d6efa455648375662719272102c4f8028799d6","other":"df1e4e46e8ec26cad74b4f35ab070f12c8f6fddca35ac44c1218ff60fe1e6bab","up":true},{"one":"bcc6724e54f761361f85147eb102a8d1a1a38810a940ce76b1e361ddcadacaa3","other":"b7cafed41dac01dd59e2bcaeaaab551ebfeab8eaa1f97c1866fe0ddae772807b","up":true},{"one":"35e6b1d31f594c06b759525434a7e717ebe6f27ca0188f247ed1247664a50563","other":"2a0a8eaf1a2749e68f8b841578c160699cf7907ff23842c6d616ad884e5f613e","up":true},{"one":"18f6e66e1cc8e620808901b571fdf525ee8f41850fac0bd0e5c5a4de70c5f873","other":"11d43f6ed0ddd5afa5c8a7abf7c62a4fa865b7a25ee295bf1a49701ef3081363","up":true},{"one":"f5dc78ff71a63fc2014b9553723ee676c63fc078a32a46b7cb172f357a118140","other":"c1f9e8e1d509febdf1f267bb227741e513420048a2e669ac9eef4b05a29cf10b","up":true},{"one":"0c64e5af869b1665fd4016ae6d04c8eedd423636f06d78ecb944ee8e3272a82a","other":"0af9a57a2f66835cd3e4e71bc026013a8a99ca337a7b6b6cc34e11d8da212a4f","up":true},{"one":"da67ace34f7076a1d550bc61bc2a31da88d6cd9f9df43b142a8c6bbade1b4aee","other":"d1d719ce1dca507598449afe966396c160ad25ad632112ab268b1d913b490dbd","up":true},{"one":"16725e318322353befc2f2aba112f0984bc011821bb16c98e2cd8b39cd62aea1","other":"11d43f6ed0ddd5afa5c8a7abf7c62a4fa865b7a25ee295bf1a49701ef3081363","up":true},{"one":"7a608d2cf9d1d9c5819dc1f9e88e5cb2852aadea01c40e047c2e184b62e7163c","other":"6f2d756566dd5b4a13ffeea9f687c785148f3407a502e28b9d6edfd03b905fdc","up":true},{"one":"e027a9f7152641c4a41154f8ce4dafd23895c312150efea86bf4152c88d0ca86","other":"e5ada0415c92ef1511b15d04edf395976464afd9adc3e929c41d4d21d25e3182","up":true},{"one":"67aa5463e4b32b363b3d01d2a41ccb03199411057276f4962d053160be29a6ef","other":"6967e7438125c2045d575eb9f407b4a38d1bf9dcd1c1c1a97f750da6a21aeff7","up":true},{"one":"3b88a472beba4a18f8df45678888fd359bac3823900eecfe0037fdc9ad54d416","other":"3e8efcaf3002522b39065ea30c15426d1eb55916499eff8eb5a814e39d41853c","up":true},{"one":"03285e06657032778feff0b43828c964dbf9de669f63171aeb587aa1a1facc0a","other":"0af9a57a2f66835cd3e4e71bc026013a8a99ca337a7b6b6cc34e11d8da212a4f","up":true},{"one":"217f9952af1eb58d5ca5ac7be763716cfe2c0a4f3cdd4ebe4b5df563f919e2d2","other":"2a97d308a720274a440dfa6901ca0a5480af9bab58dd8a6c4afdb9c83ea964c3","up":true},{"one":"06618d829a8a7317a98f1a40ecf8864e1c94c4e270a9e4c008229dc7cf937b7e","other":"00c6488a842ece7a8b0daf064e405de03a4257d308840ea52bfd48d23f54d895","up":true},{"one":"53fe2c13926507a7a6c27d0fb30a2c358c4c7bfa40df8b5fa8ec8986c2450519","other":"4c9eab8ab45405a6d4bab46430efc04b8e6aec1d944f88435eca41361925f379","up":true},{"one":"07a8c900fec6c477580ed5b38848a8681dc52a19e59fa4cd32f571fe7fb2383a","other":"045ba8da4641da3f0b8058bb0d9d8aafbb81496dc1cae2a3fd9c039a7e1cafb6","up":true},{"one":"baddc778aea97acdbbb5bc99744a5545abab9f6047c81f328761645287ac391c","other":"baf219e9229921b773d1ad7eb7eb5216cfa60ccecaa3c5c487e3b71cb600ba12","up":true},{"one":"c786ff8667f509b5a9519984c1d95c83a5d2e257500a71429e8f23af610ce771","other":"959fda0866d3c18e9399e98485d627044079d6f86b075edaea9315402f5d9395","up":true},{"one":"e7fa7112adc7b023dd5965e620277122542153f87eaf5deeacc8a51f1778ba77","other":"e8548b5df15adf0f2a997ff5709827beb5e1d36bb08a2f2d017746d5c0e83fca","up":true},{"one":"4d6b939fb67338c484948ab92b2ceea4d4b666d7e08773673cd7c8f83f495b89","other":"4e5a46c004e85cf86a02fdfbf2243018825d015debfb9a077a1283d302293b3a","up":true},{"one":"5b632eaf700d173ff15f4727b85817e6173228c304b422434a08c2cad438b825","other":"4636f00be60a9b494a3ebc9ab41cc7cb53ec0b0beff214db2d0a248dc3aeb6af","up":true},{"one":"045ba8da4641da3f0b8058bb0d9d8aafbb81496dc1cae2a3fd9c039a7e1cafb6","other":"0ff2d2c49547eebc96675e0b88073dea5e9091bee1843ffe567127e34486c348","up":true},{"one":"d7aca8f2182bc625d2b3c942bd1161c85bcf1c2b34ecbe3e2fd23cfae6b8a871","other":"d29941d6b8acd86cf32fd1c2181da3ab1da3c2083134b068ca49ce29aa86b783","up":true},{"one":"4d103ec5afee559a5a9242e8d650b67301eaec10e96fc2f184e34d48554108a2","other":"499036eb9d10fc003c903f09ea0ee00c0d27b39564988d67ae111f3473d22f07","up":true},{"one":"49cd1efed6a56a78af4ea4ab40813013e76c6a5fb9d2029ee02db5d80f5e41a6","other":"2ccfb5b1f3923d35fef88838c508b98b5516c5d409643881d2304ae49e50eed3","up":true},{"one":"efeae3b7f610dc10acc51068e7718876d147cd78a9a28788c5dba5bb3a6950dc","other":"c43fbee95380007274b8f231fe34bcd59b5c0ef0830b174967d4702627984fc6","up":true},{"one":"140020a23a840b8840ba0c2c384f853a606330e9743885e9967cf49533db282e","other":"1c8a10ecbd72acb2bbbb8b77ea5404f9e90f4dbf306ec8134cfed70b40aef399","up":true},{"one":"103b232552b94090232195dc88f84823701f35ae536b5af6dd33fa655a33cbae","other":"179f21d2e0421b8056ee9a260bc0985bfa64a52a36d0a8fbce4e03f3120d1d65","up":true},{"one":"1e2aca93fa9442a0034ae8d295530dde16fcbfa8c37227e2e6863babb0f87c34","other":"1c9caf028df31681b1457a54d4b3ab20009f9fa5bd12417a1ba7efe0c660e6bd","up":true},{"one":"4646fe4c119078738612b44a356089b3c73a08e11cfd910675d211ae6b20b8fd","other":"41d9c03e44bec3f84a6139ce40ef1e390530f38ed11860575acfad03a49db095","up":true},{"one":"17040a3aad5930d8e0de1011fd2996b7d09225989f0dc1ae8f7e7a52dd26ab4e","other":"1b830ed484b274a96ec7ba2f9a42b6859412b5334a564014ff3f11597ea3a32d","up":true},{"one":"53a885968d68d8ebf7ed514e662cc13fa03186d2361000a03576531fdca2a25f","other":"0438f567045d4556a0e7a697028d689ecfd0ae20f9e85c09b48d9f1fd0ee4765","up":true},{"one":"6e68ea86440706a0d73a9508f2247492543163f8fa7e2dc2aa62b74d50261b8b","other":"6251e9540448726a601699ef4cd19e50c969a746da27228967338cdc09d628bf","up":true},{"one":"8025c1fcb98e53f92767d1d43a3057a0acd1e8994bb4a7e3f5e244110e0dcf91","other":"959fda0866d3c18e9399e98485d627044079d6f86b075edaea9315402f5d9395","up":true},{"one":"499036eb9d10fc003c903f09ea0ee00c0d27b39564988d67ae111f3473d22f07","other":"41d9c03e44bec3f84a6139ce40ef1e390530f38ed11860575acfad03a49db095","up":true},{"one":"f773b83f1a1de2ab6660edb0b765cfccec6778061ee25c5a84f968625686ef60","other":"f4e09f89287bd1af7833acd85ba7cc71fdb3ff34f2f409e1cf2a878dcd3183dc","up":true},{"one":"39d1fcae2d23c775214988251505c577b9ac7b6851558ddf9a437dfe143f3845","other":"3e8efcaf3002522b39065ea30c15426d1eb55916499eff8eb5a814e39d41853c","up":true},{"one":"bb90464f769a85549c150f861775aa67924c7c651f393f6c70772707376a5c7e","other":"b7cafed41dac01dd59e2bcaeaaab551ebfeab8eaa1f97c1866fe0ddae772807b","up":true},{"one":"5f00b3bebef2f5484ff1386298add68a6743a106200ae8a13a27dbb52714ee8f","other":"4ac755123dcc64ef44db9280311af51f3f7a93e0dee67370d673261220356eb9","up":true},{"one":"314a3530a5e0c37d5609149b3ae9c2e078573346bd8fce3c769ebaeb31726ec1","other":"3630e05326bacea8fcc739dec42085f845f416ddc698c76ff91f099eb1dc5007","up":true},{"one":"c6cf46239078edfb343c645f039725fdee1bbba8b0a6da02e2cc456b9223c9a2","other":"efeae3b7f610dc10acc51068e7718876d147cd78a9a28788c5dba5bb3a6950dc","up":true},{"one":"b5025d153581d333b44df4b9bfa69d87de138905172e4fd317e16f7099a5fcf8","other":"b95d88ff6512ef8eaaa6bd842fa44175c1484fc2e8601b83d50a5ffa992bfa3a","up":true},{"one":"ae2b3876bdbd6388781b65e31de182564c5d81f4511caf96588b1a287760b3dd","other":"90765b72283f59be4cf9bf7a9e9a22fd6db701c3603cbc0817b4adf2f8e9ce08","up":true},{"one":"e775e9759d4701bd9b43c22f1d1be73c1262b2752bb23cb3857485daf1dcad2d","other":"efeae3b7f610dc10acc51068e7718876d147cd78a9a28788c5dba5bb3a6950dc","up":true},{"one":"0c64e5af869b1665fd4016ae6d04c8eedd423636f06d78ecb944ee8e3272a82a","other":"0e5e0bb1383b2ec569b157a1d2ae6900592ab892a28367f5613a4e29cb265088","up":true},{"one":"db6a1f6b342f6be9517f8df01003797c11c837d9aee3cdba5b7859230b36c35d","other":"d863ba7405eb07ccddbf1d34efbcbec2867a93a109ed9413d9aecf30d3645a6a","up":true},{"one":"19faaf891eb6a716902ec29d201dc2094ee474acff188ae86faf9760674b2d37","other":"11d43f6ed0ddd5afa5c8a7abf7c62a4fa865b7a25ee295bf1a49701ef3081363","up":true},{"one":"2a0a8eaf1a2749e68f8b841578c160699cf7907ff23842c6d616ad884e5f613e","other":"5db08436c64f4cc9e2b3950e35bc8ad739825e3efa67a642c771d95b34cb420c","up":true},{"one":"2d3645c4fdf9a2809a909076b9ee5fb98fa880f6faeff914f1a2987af928cd79","other":"30bec7cd0a7d002839aed7654129bd2fe2e2ce7f42aa7bae1560e8bf718954c3","up":true},{"one":"32371744163f0b3aefd3955dc4877e7eb82b17ef9541c333ca9c0a9f8aec3045","other":"20aeb14f567dd16f06b0d3b589b83283daa00a5ed10e447860bda946baccdd2d","up":true},{"one":"a6fbe16b81d240ff2f2ed6c93cfd9590731dfb2e7ec3fce1c098fe542bedf299","other":"850575577d6b420a87aba388af481e0c044c2f75cf29ff934daf5674318a61ba","up":true},{"one":"154be9255e9aebd134a914070f5e6f3d4bba079d9ca738b74244db14e1b586dd","other":"19faaf891eb6a716902ec29d201dc2094ee474acff188ae86faf9760674b2d37","up":true},{"one":"1b830ed484b274a96ec7ba2f9a42b6859412b5334a564014ff3f11597ea3a32d","other":"1a2a0e0bbf83cd40936995674418ae469aa2b92876a4ceeabd8128f536b7d7a2","up":true},{"one":"9852ce267d53106a6e584d6eddb08e0062eb4a422d2a8d39ad6dccaebac552ff","other":"88a141c607019477c7b120a506285a7218cad2faa038082e0b9ddfcc9cb78d07","up":true},{"one":"d887070a0568282c69e96ce65612ba72d5ea26b5c80671435d6e1ed2c4b49301","other":"c620752a083ca1ff0398937235cf964133939452c293c799ce07ff8aa2bde420","up":true},{"one":"165f1af67aa1d24569e0bdff61d29b3c39e93250071d8f25b5be6face209ac6a","other":"11d43f6ed0ddd5afa5c8a7abf7c62a4fa865b7a25ee295bf1a49701ef3081363","up":true},{"one":"ec52270604007673d1bfda1edbd8bfa945a21141efd85e42b684a9f30f8cddae","other":"e5ada0415c92ef1511b15d04edf395976464afd9adc3e929c41d4d21d25e3182","up":true},{"one":"5cd2377226825dc7ea582315cd108d23502df4e9c7c09fc07e7b4aa56440de29","other":"524db81b135af8dc309b942c082a7291dddb851866fc608753f937ee77015be0","up":true},{"one":"0a005eb9c10c5cc9f720cfec2a655811d391671597b4f32d12df291ec76b2c13","other":"04518d7120fa8a528d983ca1ee6d5d09ba24a4e853fb22bc9084cdf34995e95f","up":true},{"one":"976e57d0c32227222bfd0cbb802f269bdcd52d5d33cf689c66b12c023f5fa8bf","other":"849bcbb9be43b799fefc5e689efc75125da27f536e97e5b7921031520ae6e5d8","up":true},{"one":"534bcaa98cf9192b35b6014c650ae067e74332c015ebb516d63601427d7376b8","other":"44a10530c376b215baff8531eeb2afb8d6714c4d0350d1a6f32761a97cd6c7ec","up":true},{"one":"53fe2c13926507a7a6c27d0fb30a2c358c4c7bfa40df8b5fa8ec8986c2450519","other":"53087084708cc5ee63ac459b18fa10ae52a823139b4ecba6c8691d4934f2f971","up":true},{"one":"c786ff8667f509b5a9519984c1d95c83a5d2e257500a71429e8f23af610ce771","other":"da67ace34f7076a1d550bc61bc2a31da88d6cd9f9df43b142a8c6bbade1b4aee","up":true},{"one":"e7fa7112adc7b023dd5965e620277122542153f87eaf5deeacc8a51f1778ba77","other":"eb98fb45dd5754f24f9df0c9ecbb93932e3d9d7735cd6d0ddd4a8675bb4ef554","up":true},{"one":"c9f5acafbbf8c66647de05b0848d79451eee490709d53f118fc2051410cc8203","other":"d887070a0568282c69e96ce65612ba72d5ea26b5c80671435d6e1ed2c4b49301","up":true},{"one":"582330d8b8c49331b2aec790dc7325b9cd483fc8129323d31ec429d545042964","other":"4c9eab8ab45405a6d4bab46430efc04b8e6aec1d944f88435eca41361925f379","up":true},{"one":"849bcbb9be43b799fefc5e689efc75125da27f536e97e5b7921031520ae6e5d8","other":"850575577d6b420a87aba388af481e0c044c2f75cf29ff934daf5674318a61ba","up":true},{"one":"ee5e77df690329c132f2f7fca223cfd384b7bc34ec38763a4eb42780e0585656","other":"e8830f2b2f7d08df15bd33f4b2841d01d9d62c1621234bd6ae86743e52360f3e","up":true},{"one":"16725e318322353befc2f2aba112f0984bc011821bb16c98e2cd8b39cd62aea1","other":"17db15893bf39b42593ee1de975aba6832046d9da5b4b493ec44272738a29cef","up":true},{"one":"baddc778aea97acdbbb5bc99744a5545abab9f6047c81f328761645287ac391c","other":"b02b01a5c37cb05c287a3dc7d04e305de26f8d62dc388542eeb43e97db7b4282","up":true},{"one":"67aa5463e4b32b363b3d01d2a41ccb03199411057276f4962d053160be29a6ef","other":"67dcfd21ece30b41a39bc55c0986fca8f401bb3acba821969519f09d0933e8bd","up":true},{"one":"60d7337ef806be95ccaf7b9d663a4289f9afc68edced62904ab50601cf113f45","other":"77d2ec52dabd5d7f326d4c6afd2aad110487c6bdffa2984060528716ba873462","up":true},{"one":"49eaad68d23dd63ef26029fa3f4e2578f3deca8708bbc838750d8b6dbe9eaa38","other":"41d9c03e44bec3f84a6139ce40ef1e390530f38ed11860575acfad03a49db095","up":true},{"one":"02d85b9f8e4776224ae5088683a87837b82b2bfb7e047cf373a28393e7aca6e1","other":"29957e8e92925a8c79bdf513295d96bfb62fbfc597ee1cf767c7ef408f1b1295","up":true},{"one":"2c79af7ea85f96db7897cf8cdb4d002ad2308194e03981876edb8d904ef65137","other":"2a97d308a720274a440dfa6901ca0a5480af9bab58dd8a6c4afdb9c83ea964c3","up":true},{"one":"b2a563ac59bab4dfddf7b6e27b80ee7afdeb2e4295411107903f484bcf9fc4f2","other":"a6fbe16b81d240ff2f2ed6c93cfd9590731dfb2e7ec3fce1c098fe542bedf299","up":true},{"one":"499036eb9d10fc003c903f09ea0ee00c0d27b39564988d67ae111f3473d22f07","other":"7125e05bf1bfe6df948c9276b62bc755fc6b0ec8d4ac7724b61ea49591adcf25","up":true},{"one":"24b85c10f098725938ea7d87cd24a4b10358129906fca9790fc266ea8784b538","other":"2abb938b889a2eb735134462985a56056be48f189b5b89d23b653864c76427f4","up":true},{"one":"6967e7438125c2045d575eb9f407b4a38d1bf9dcd1c1c1a97f750da6a21aeff7","other":"66e7fc2df51f5df8d7329851fe9357d895e9d5dfdc25f8d92bdb10a960f7e15a","up":true},{"one":"ef1b70bf090bc9994b1d45e2812c56ecb430a89c346a436bd10880bcda700351","other":"eb98fb45dd5754f24f9df0c9ecbb93932e3d9d7735cd6d0ddd4a8675bb4ef554","up":true},{"one":"217f9952af1eb58d5ca5ac7be763716cfe2c0a4f3cdd4ebe4b5df563f919e2d2","other":"30bec7cd0a7d002839aed7654129bd2fe2e2ce7f42aa7bae1560e8bf718954c3","up":true},{"one":"53087084708cc5ee63ac459b18fa10ae52a823139b4ecba6c8691d4934f2f971","other":"5f00b3bebef2f5484ff1386298add68a6743a106200ae8a13a27dbb52714ee8f","up":true},{"one":"5f00b3bebef2f5484ff1386298add68a6743a106200ae8a13a27dbb52714ee8f","other":"6f5f5a77e6092e25e5308413e02ba62c1c559024893a7fb98e26b0f34fed8bfe","up":true},{"one":"68317431e4fa55be4a700e35c6a578307cc32b72336679b5c5618b622ef0c602","other":"67aa5463e4b32b363b3d01d2a41ccb03199411057276f4962d053160be29a6ef","up":true},{"one":"17040a3aad5930d8e0de1011fd2996b7d09225989f0dc1ae8f7e7a52dd26ab4e","other":"14dfb8414d17b2df15eaf59571a8cfec99b1fd674561da63ee99af853bda07da","up":true},{"one":"35e6b1d31f594c06b759525434a7e717ebe6f27ca0188f247ed1247664a50563","other":"30897492824b19540d13ef17c70845be6dde455dca4e4f84cfca14a2c373969f","up":true},{"one":"1436aaa8770e9f1c6294e49f4066c16b1caa50524e9b8fd058059e41657d2a83","other":"179f21d2e0421b8056ee9a260bc0985bfa64a52a36d0a8fbce4e03f3120d1d65","up":true},{"one":"46fee69dad8b6a6a87d356d10db25d835a0c4e154bf179e88fb4cc65f97d72d7","other":"444722a15b01a0d8e6794798d239fe621d59bdfc08823ab47cbd8b9acebd23b4","up":true},{"one":"06618d829a8a7317a98f1a40ecf8864e1c94c4e270a9e4c008229dc7cf937b7e","other":"3e8efcaf3002522b39065ea30c15426d1eb55916499eff8eb5a814e39d41853c","up":true},{"one":"0743bcf2aaa77e916f4a367d6159473c7d80f46a2e4cbe9ef346e423d39d7072","other":"0e5e0bb1383b2ec569b157a1d2ae6900592ab892a28367f5613a4e29cb265088","up":true},{"one":"2d3645c4fdf9a2809a909076b9ee5fb98fa880f6faeff914f1a2987af928cd79","other":"3b78bc987c7c31c94e8ada9b4b11b5db9387fe70dd01ce7f3e976d3bec433dec","up":true},{"one":"378e7af7cc019186d4f2699e753e2d71302f8f3565572c13b7a1b1c5cb47443c","other":"37801e8d7d46143f78924ed66099f658a94d37edfd2f58d02acb85add03e1894","up":true},{"one":"0de3915b0bcc68040c8aa76fbd2cfa0714e9b34c9dbe0838a7cba81c4f73581c","other":"02d85b9f8e4776224ae5088683a87837b82b2bfb7e047cf373a28393e7aca6e1","up":true},{"one":"9fa0215e980dc907df4cc47ab4937f36527d78f9837493016fd4fc51e617299c","other":"82f9c9009f09de2d6a77b54976d14c14211eae65d886f6ed57560c700716dd5c","up":true},{"one":"fbf5e917be45e909697a9393c4778206333cf1dd9a103978e8d71622ca3b1cc8","other":"f31cc744ea921fee8364c5269b1ce7ec6b5f0c0cbb6885efbf602de5b36f6169","up":true},{"one":"a6fbe16b81d240ff2f2ed6c93cfd9590731dfb2e7ec3fce1c098fe542bedf299","other":"f45f1f2e59e947e04fa15bcf87f872ef6d73b73f778e12d1f9b8930ea166eefc","up":true},{"one":"314a3530a5e0c37d5609149b3ae9c2e078573346bd8fce3c769ebaeb31726ec1","other":"24b85c10f098725938ea7d87cd24a4b10358129906fca9790fc266ea8784b538","up":true},{"one":"33b5c521b4208e26414db2e05c9a8ccc001a524d928579d44d2e74d14a56593e","other":"3ec530761ddb87f930fda919be67df18074c6f0795292add1b2a91ff3d9c39e3","up":true},{"one":"512ec5c2e6b4d788482462d941117c81fcc0e73f0c15545794dd1b4e03bf2102","other":"5f00b3bebef2f5484ff1386298add68a6743a106200ae8a13a27dbb52714ee8f","up":true},{"one":"ed2d3e1e5693b44494808907c98ec54d6d08331945d2a2c03e31130fef1d2586","other":"f31cc744ea921fee8364c5269b1ce7ec6b5f0c0cbb6885efbf602de5b36f6169","up":true},{"one":"f925c85e6457ac01f0cd6b297155f9d3ae611603890d8f3a45e1396d937f8680","other":"e5149cedd990072f2aaa9735a9259f28973c45876660c2d86ac105e56cca8e68","up":true},{"one":"461cc9f064e6f4f06ff38e0d1f3f00ef8807ba31c7258e453cc682e9551bb1c6","other":"4e5a46c004e85cf86a02fdfbf2243018825d015debfb9a077a1283d302293b3a","up":true},{"one":"b911b8e2d72532b7c66ff5f7bffa70f5ddbeea6903a86f9333399f0c4b5f0fe8","other":"b7cafed41dac01dd59e2bcaeaaab551ebfeab8eaa1f97c1866fe0ddae772807b","up":true},{"one":"f5dc78ff71a63fc2014b9553723ee676c63fc078a32a46b7cb172f357a118140","other":"f5b24a1fd2cd2908b408562f9a265ee1a692b137e770137afa5fdfa07b237221","up":true},{"one":"534bcaa98cf9192b35b6014c650ae067e74332c015ebb516d63601427d7376b8","other":"4c9eab8ab45405a6d4bab46430efc04b8e6aec1d944f88435eca41361925f379","up":true},{"one":"4d6b939fb67338c484948ab92b2ceea4d4b666d7e08773673cd7c8f83f495b89","other":"44a10530c376b215baff8531eeb2afb8d6714c4d0350d1a6f32761a97cd6c7ec","up":true},{"one":"6e68ea86440706a0d73a9508f2247492543163f8fa7e2dc2aa62b74d50261b8b","other":"41092c852fac630df2a9ca0862716f8e9fb8566c904a49c96389071046bc699d","up":true},{"one":"04518d7120fa8a528d983ca1ee6d5d09ba24a4e853fb22bc9084cdf34995e95f","other":"0cf596af91eb9b041fe6dbe6b288c5730413850321b5ab176c81447e34ef79c5","up":true},{"one":"6fe9a02e950a5c3a5ff026b75922ed687d59795ba8eb9c092a8d09a5c64d2453","other":"6f2d756566dd5b4a13ffeea9f687c785148f3407a502e28b9d6edfd03b905fdc","up":true},{"one":"db6a1f6b342f6be9517f8df01003797c11c837d9aee3cdba5b7859230b36c35d","other":"daec45eca40f48843b41f70267c07e94996ced829f02710f15354fbe26e177e7","up":true},{"one":"c832b4ad64a17da4b796ffcac646c2aa666b276aabb7eb3bfe7981d64a4da402","other":"c786ff8667f509b5a9519984c1d95c83a5d2e257500a71429e8f23af610ce771","up":true},{"one":"e7fa7112adc7b023dd5965e620277122542153f87eaf5deeacc8a51f1778ba77","other":"e54784cfbcd89c37c8f758aae70ece3ab4b7f8c30fb4ef7543e04aa89ff4386b","up":true},{"one":"9852ce267d53106a6e584d6eddb08e0062eb4a422d2a8d39ad6dccaebac552ff","other":"8f2182c2c2d0eeb2e887dbc350ae7257819f536032851ffdf29e7842cb1a62cc","up":true},{"one":"f45f1f2e59e947e04fa15bcf87f872ef6d73b73f778e12d1f9b8930ea166eefc","other":"96fcf14c7f90350091ac6fcb58306ccfb9e4a38d3da59f8ab656854332844cbd","up":true},{"one":"3b78bc987c7c31c94e8ada9b4b11b5db9387fe70dd01ce7f3e976d3bec433dec","other":"3e8efcaf3002522b39065ea30c15426d1eb55916499eff8eb5a814e39d41853c","up":true},{"one":"0b72054403f78a64a787f46e9f26bf0de7bbba5a60cb105e6aeea46cb4a1d9fe","other":"165f1af67aa1d24569e0bdff61d29b3c39e93250071d8f25b5be6face209ac6a","up":true},{"one":"2c3894b6e47cf19ac7ee9fe213196312f676256f670dff25b03563492550bc74","other":"37801e8d7d46143f78924ed66099f658a94d37edfd2f58d02acb85add03e1894","up":true},{"one":"67aa5463e4b32b363b3d01d2a41ccb03199411057276f4962d053160be29a6ef","other":"6ea51fb6e4783f351dbbfa47b508c78c73233ebaada409dfb55446217f92c4bd","up":true},{"one":"02d85b9f8e4776224ae5088683a87837b82b2bfb7e047cf373a28393e7aca6e1","other":"0cf596af91eb9b041fe6dbe6b288c5730413850321b5ab176c81447e34ef79c5","up":true},{"one":"53fe2c13926507a7a6c27d0fb30a2c358c4c7bfa40df8b5fa8ec8986c2450519","other":"51db114a52827f5b74088bd0fc87d35229e7740e7d121bd7699298396516a880","up":true},{"one":"efeae3b7f610dc10acc51068e7718876d147cd78a9a28788c5dba5bb3a6950dc","other":"e54b643cbc95d9f5d27ec3760d892b6802981bfabf4f9979267d66259df982c7","up":true},{"one":"7e0458ecdf7081443cab5412529f3948ece659facaca03208496c80dd136e704","other":"7125e05bf1bfe6df948c9276b62bc755fc6b0ec8d4ac7724b61ea49591adcf25","up":true},{"one":"19faaf891eb6a716902ec29d201dc2094ee474acff188ae86faf9760674b2d37","other":"1c9caf028df31681b1457a54d4b3ab20009f9fa5bd12417a1ba7efe0c660e6bd","up":true},{"one":"e5149cedd990072f2aaa9735a9259f28973c45876660c2d86ac105e56cca8e68","other":"f5b24a1fd2cd2908b408562f9a265ee1a692b137e770137afa5fdfa07b237221","up":true},{"one":"c49caff13862dc089f1f9b8180d6efa455648375662719272102c4f8028799d6","other":"ca041da0dc514643d017458d08ff6962ec52c9e66571a239ec395dc8b2546709","up":true},{"one":"f773b83f1a1de2ab6660edb0b765cfccec6778061ee25c5a84f968625686ef60","other":"f5b24a1fd2cd2908b408562f9a265ee1a692b137e770137afa5fdfa07b237221","up":true},{"one":"49cd1efed6a56a78af4ea4ab40813013e76c6a5fb9d2029ee02db5d80f5e41a6","other":"3b88a472beba4a18f8df45678888fd359bac3823900eecfe0037fdc9ad54d416","up":true},{"one":"628e7da3359ed6d9dcfbafc7581966e4e09245c321ec78ca75587c9cbb44697f","other":"6f2d756566dd5b4a13ffeea9f687c785148f3407a502e28b9d6edfd03b905fdc","up":true},{"one":"c26fd5e6504c7b3f0a6d9133ff87c98c110eb1c201c5f3bcf6b10653f2b972d2","other":"caf6a8e37fd41c1e6ad77a8575cd90354bb1693893952301c9caeb4779c338d3","up":true},{"one":"0c64e5af869b1665fd4016ae6d04c8eedd423636f06d78ecb944ee8e3272a82a","other":"00c6488a842ece7a8b0daf064e405de03a4257d308840ea52bfd48d23f54d895","up":true},{"one":"7b90e939ae2a240f0d74a923afb6bbf11f6d5b99a7bf85f1825b1ea36bce744c","other":"775e7be502df8fd938cf9c42ee4fac33e460a4b6992b9efeb8dc1ff7dde5c40f","up":true},{"one":"7290cd3affade5f9e729d1b03549aceafb2576cdbc6789fd688c95495f10bacd","other":"775e7be502df8fd938cf9c42ee4fac33e460a4b6992b9efeb8dc1ff7dde5c40f","up":true},{"one":"88a141c607019477c7b120a506285a7218cad2faa038082e0b9ddfcc9cb78d07","other":"90765b72283f59be4cf9bf7a9e9a22fd6db701c3603cbc0817b4adf2f8e9ce08","up":true},{"one":"ac4d2d6836e2cdf4c88221f6013aac70a451dd15bc403288bd10d0b911cd9a2b","other":"a3693801a91180410cf3e85d7c09ac8054a769e7b1d55c9e7a46850cb8217da0","up":true},{"one":"478278187cd9af799e83340a2f49b0b7f122fb8e08c0a372a87795426eab364b","other":"44a10530c376b215baff8531eeb2afb8d6714c4d0350d1a6f32761a97cd6c7ec","up":true},{"one":"ef1b70bf090bc9994b1d45e2812c56ecb430a89c346a436bd10880bcda700351","other":"fbc8087a723c564ca0139329902e79748af46699ea7be24d57909a7e8e96f681","up":true},{"one":"7125e05bf1bfe6df948c9276b62bc755fc6b0ec8d4ac7724b61ea49591adcf25","other":"39d1fcae2d23c775214988251505c577b9ac7b6851558ddf9a437dfe143f3845","up":true},{"one":"baddc778aea97acdbbb5bc99744a5545abab9f6047c81f328761645287ac391c","other":"b911b8e2d72532b7c66ff5f7bffa70f5ddbeea6903a86f9333399f0c4b5f0fe8","up":true},{"one":"4d59cf1aeecf370e94a7a231887450cef97053b9c88a7fd11e210840af070e29","other":"499036eb9d10fc003c903f09ea0ee00c0d27b39564988d67ae111f3473d22f07","up":true},{"one":"179f21d2e0421b8056ee9a260bc0985bfa64a52a36d0a8fbce4e03f3120d1d65","other":"00c6488a842ece7a8b0daf064e405de03a4257d308840ea52bfd48d23f54d895","up":true},{"one":"5cd2377226825dc7ea582315cd108d23502df4e9c7c09fc07e7b4aa56440de29","other":"461cc9f064e6f4f06ff38e0d1f3f00ef8807ba31c7258e453cc682e9551bb1c6","up":true},{"one":"378e7af7cc019186d4f2699e753e2d71302f8f3565572c13b7a1b1c5cb47443c","other":"49cd1efed6a56a78af4ea4ab40813013e76c6a5fb9d2029ee02db5d80f5e41a6","up":true},{"one":"a46dd535e3bc8f111a8b2ce5594b62e87741c395e8a2b8fbae33edd29cb8caf8","other":"af02b5d107b3a17f539c7f9020ebe74322434634e70c420a7f56776eb5d9db73","up":true},{"one":"41092c852fac630df2a9ca0862716f8e9fb8566c904a49c96389071046bc699d","other":"605a46991af15cd60e67413c712b99ff8f21173c96a7990f2728ad6cac2bb9d8","up":true},{"one":"49eaad68d23dd63ef26029fa3f4e2578f3deca8708bbc838750d8b6dbe9eaa38","other":"41092c852fac630df2a9ca0862716f8e9fb8566c904a49c96389071046bc699d","up":true},{"one":"b820e480354000c837b1781ec1c493e8776b4834252e6453425ac05b925b5a58","other":"f45f1f2e59e947e04fa15bcf87f872ef6d73b73f778e12d1f9b8930ea166eefc","up":true},{"one":"58ed74695bf527bac9a350c86d305e53e08c4999795e11cd3b2a36f5cd25d637","other":"53fe2c13926507a7a6c27d0fb30a2c358c4c7bfa40df8b5fa8ec8986c2450519","up":true},{"one":"217f9952af1eb58d5ca5ac7be763716cfe2c0a4f3cdd4ebe4b5df563f919e2d2","other":"49cd1efed6a56a78af4ea4ab40813013e76c6a5fb9d2029ee02db5d80f5e41a6","up":true},{"one":"256e81c5a6fb43bd343345477f8f96aa1947f07ac3297f631ab03f060147b062","other":"314a3530a5e0c37d5609149b3ae9c2e078573346bd8fce3c769ebaeb31726ec1","up":true},{"one":"baf219e9229921b773d1ad7eb7eb5216cfa60ccecaa3c5c487e3b71cb600ba12","other":"b5025d153581d333b44df4b9bfa69d87de138905172e4fd317e16f7099a5fcf8","up":true},{"one":"af02b5d107b3a17f539c7f9020ebe74322434634e70c420a7f56776eb5d9db73","other":"aeb4c75a57ccfc9ac053a3d363cf7c1e3e201406587769ab6615d5c2f86a5410","up":true},{"one":"8025c1fcb98e53f92767d1d43a3057a0acd1e8994bb4a7e3f5e244110e0dcf91","other":"9d0f804849b72397646ba48208ba1e01dcf4de04e788016c4a1a0c93e650ddf5","up":true},{"one":"daec45eca40f48843b41f70267c07e94996ced829f02710f15354fbe26e177e7","other":"d29941d6b8acd86cf32fd1c2181da3ab1da3c2083134b068ca49ce29aa86b783","up":true},{"one":"f27f1044777e05f3f60165d0d2fc3e7667fe148e0ca7a097805d60b9f61025f7","other":"f4e09f89287bd1af7833acd85ba7cc71fdb3ff34f2f409e1cf2a878dcd3183dc","up":true},{"one":"512ec5c2e6b4d788482462d941117c81fcc0e73f0c15545794dd1b4e03bf2102","other":"444722a15b01a0d8e6794798d239fe621d59bdfc08823ab47cbd8b9acebd23b4","up":true},{"one":"0fc59bd04ac9de3195e3c9d0eb573952a5805dd2e7e572078b6e996778adec73","other":"0c28cd1315890629896d0fe5517524d4eb788f7444709c135ea690ba4e6103d5","up":true},{"one":"ed2d3e1e5693b44494808907c98ec54d6d08331945d2a2c03e31130fef1d2586","other":"e54b643cbc95d9f5d27ec3760d892b6802981bfabf4f9979267d66259df982c7","up":true},{"one":"04518d7120fa8a528d983ca1ee6d5d09ba24a4e853fb22bc9084cdf34995e95f","other":"0b72054403f78a64a787f46e9f26bf0de7bbba5a60cb105e6aeea46cb4a1d9fe","up":true},{"one":"1436aaa8770e9f1c6294e49f4066c16b1caa50524e9b8fd058059e41657d2a83","other":"1b830ed484b274a96ec7ba2f9a42b6859412b5334a564014ff3f11597ea3a32d","up":true},{"one":"1c8a10ecbd72acb2bbbb8b77ea5404f9e90f4dbf306ec8134cfed70b40aef399","other":"1c9caf028df31681b1457a54d4b3ab20009f9fa5bd12417a1ba7efe0c660e6bd","up":true},{"one":"07a8c900fec6c477580ed5b38848a8681dc52a19e59fa4cd32f571fe7fb2383a","other":"00c6488a842ece7a8b0daf064e405de03a4257d308840ea52bfd48d23f54d895","up":true},{"one":"c832b4ad64a17da4b796ffcac646c2aa666b276aabb7eb3bfe7981d64a4da402","other":"d887070a0568282c69e96ce65612ba72d5ea26b5c80671435d6e1ed2c4b49301","up":true},{"one":"c786ff8667f509b5a9519984c1d95c83a5d2e257500a71429e8f23af610ce771","other":"96fcf14c7f90350091ac6fcb58306ccfb9e4a38d3da59f8ab656854332844cbd","up":true},{"one":"efeae3b7f610dc10acc51068e7718876d147cd78a9a28788c5dba5bb3a6950dc","other":"e5ada0415c92ef1511b15d04edf395976464afd9adc3e929c41d4d21d25e3182","up":true},{"one":"6e68ea86440706a0d73a9508f2247492543163f8fa7e2dc2aa62b74d50261b8b","other":"6ea51fb6e4783f351dbbfa47b508c78c73233ebaada409dfb55446217f92c4bd","up":true},{"one":"19faaf891eb6a716902ec29d201dc2094ee474acff188ae86faf9760674b2d37","other":"17db15893bf39b42593ee1de975aba6832046d9da5b4b493ec44272738a29cef","up":true},{"one":"35e6b1d31f594c06b759525434a7e717ebe6f27ca0188f247ed1247664a50563","other":"33b5c521b4208e26414db2e05c9a8ccc001a524d928579d44d2e74d14a56593e","up":true},{"one":"2a0a8eaf1a2749e68f8b841578c160699cf7907ff23842c6d616ad884e5f613e","other":"37801e8d7d46143f78924ed66099f658a94d37edfd2f58d02acb85add03e1894","up":true},{"one":"3630e05326bacea8fcc739dec42085f845f416ddc698c76ff91f099eb1dc5007","other":"217f9952af1eb58d5ca5ac7be763716cfe2c0a4f3cdd4ebe4b5df563f919e2d2","up":true},{"one":"c26fd5e6504c7b3f0a6d9133ff87c98c110eb1c201c5f3bcf6b10653f2b972d2","other":"c1f9e8e1d509febdf1f267bb227741e513420048a2e669ac9eef4b05a29cf10b","up":true},{"one":"66e7fc2df51f5df8d7329851fe9357d895e9d5dfdc25f8d92bdb10a960f7e15a","other":"41092c852fac630df2a9ca0862716f8e9fb8566c904a49c96389071046bc699d","up":true},{"one":"6e05179dc90a8f6654d0c9a3f06173371dcfb18b852fdd77f35f75e38f273125","other":"60d7337ef806be95ccaf7b9d663a4289f9afc68edced62904ab50601cf113f45","up":true},{"one":"959fda0866d3c18e9399e98485d627044079d6f86b075edaea9315402f5d9395","other":"e54784cfbcd89c37c8f758aae70ece3ab4b7f8c30fb4ef7543e04aa89ff4386b","up":true},{"one":"e7fa7112adc7b023dd5965e620277122542153f87eaf5deeacc8a51f1778ba77","other":"e8efe8016fe6cf649b2755bee22da35ccc6c9c55d404d5385d61f6ea27b84380","up":true},{"one":"24b85c10f098725938ea7d87cd24a4b10358129906fca9790fc266ea8784b538","other":"21a044e772b7c955fe4a6fb7c3a9a20e95d48b7fd6b9518741782f04f5f1f5c2","up":true},{"one":"b89793c3ccd9ea642080728732ce7df33778653fed3d1d8f3a25e60670e33325","other":"a34ea2e87d4c12adb27d66c2c95300603ff50415974e000bbcc69a5ae059dbf1","up":true},{"one":"524db81b135af8dc309b942c082a7291dddb851866fc608753f937ee77015be0","other":"53fe2c13926507a7a6c27d0fb30a2c358c4c7bfa40df8b5fa8ec8986c2450519","up":true},{"one":"29957e8e92925a8c79bdf513295d96bfb62fbfc597ee1cf767c7ef408f1b1295","other":"2ccfb5b1f3923d35fef88838c508b98b5516c5d409643881d2304ae49e50eed3","up":true},{"one":"90765b72283f59be4cf9bf7a9e9a22fd6db701c3603cbc0817b4adf2f8e9ce08","other":"90a85cb7363ede161ec21cc89f8b9d4350e566cf10586a66d31b0a8677620aa1","up":true},{"one":"33737df75bbac1b41c63f05ea2cf1523b972df17f22bda026db84a49ac35e1e3","other":"20aeb14f567dd16f06b0d3b589b83283daa00a5ed10e447860bda946baccdd2d","up":true},{"one":"d640472351969a5578e541aca72b7640c583b995fd62607ff3ee3f3f3139aafd","other":"d1d719ce1dca507598449afe966396c160ad25ad632112ab268b1d913b490dbd","up":true},{"one":"4d6b939fb67338c484948ab92b2ceea4d4b666d7e08773673cd7c8f83f495b89","other":"49eaad68d23dd63ef26029fa3f4e2578f3deca8708bbc838750d8b6dbe9eaa38","up":true},{"one":"caf6a8e37fd41c1e6ad77a8575cd90354bb1693893952301c9caeb4779c338d3","other":"c43fbee95380007274b8f231fe34bcd59b5c0ef0830b174967d4702627984fc6","up":true},{"one":"f773b83f1a1de2ab6660edb0b765cfccec6778061ee25c5a84f968625686ef60","other":"ee5e77df690329c132f2f7fca223cfd384b7bc34ec38763a4eb42780e0585656","up":true},{"one":"c8986871e46f001d15ed8b70f2aa0fea8ae309d5e5671a500f619e3b348c8c15","other":"ca041da0dc514643d017458d08ff6962ec52c9e66571a239ec395dc8b2546709","up":true},{"one":"ac4d2d6836e2cdf4c88221f6013aac70a451dd15bc403288bd10d0b911cd9a2b","other":"b626d472b555e6f950a7142783db8deb443a74e63ef6bd72a87eaf1af14ca805","up":true},{"one":"455936fd22c43794e6e2104fd91d3f5d246e3823e8ff8eaf8dc27aa9f3d2ee08","other":"41d9c03e44bec3f84a6139ce40ef1e390530f38ed11860575acfad03a49db095","up":true},{"one":"b02b01a5c37cb05c287a3dc7d04e305de26f8d62dc388542eeb43e97db7b4282","other":"b89793c3ccd9ea642080728732ce7df33778653fed3d1d8f3a25e60670e33325","up":true},{"one":"4bcf4eb531d5ec4b31d99e8354af03f976524c7858a1e7043e9b7055326f0952","other":"49eaad68d23dd63ef26029fa3f4e2578f3deca8708bbc838750d8b6dbe9eaa38","up":true},{"one":"256e81c5a6fb43bd343345477f8f96aa1947f07ac3297f631ab03f060147b062","other":"37801e8d7d46143f78924ed66099f658a94d37edfd2f58d02acb85add03e1894","up":true},{"one":"f5dc78ff71a63fc2014b9553723ee676c63fc078a32a46b7cb172f357a118140","other":"c43fbee95380007274b8f231fe34bcd59b5c0ef0830b174967d4702627984fc6","up":true},{"one":"63370e288ab2e4b8403c6678e9c44ae5c7496b5ead614306fceb85986ed29d18","other":"6fe9a02e950a5c3a5ff026b75922ed687d59795ba8eb9c092a8d09a5c64d2453","up":true},{"one":"fe2167fd33f383110eb3f6caa7bd905ca54fa0c810f1b8a34483a846f3cbddab","other":"f629b8b9e79c75ac559daf9bf4fc8672bfdd595cf2c5d17a8885282626fc65a5","up":true},{"one":"30bec7cd0a7d002839aed7654129bd2fe2e2ce7f42aa7bae1560e8bf718954c3","other":"24b85c10f098725938ea7d87cd24a4b10358129906fca9790fc266ea8784b538","up":true},{"one":"30897492824b19540d13ef17c70845be6dde455dca4e4f84cfca14a2c373969f","other":"39d1fcae2d23c775214988251505c577b9ac7b6851558ddf9a437dfe143f3845","up":true},{"one":"ec52270604007673d1bfda1edbd8bfa945a21141efd85e42b684a9f30f8cddae","other":"e5149cedd990072f2aaa9735a9259f28973c45876660c2d86ac105e56cca8e68","up":true},{"one":"2c79af7ea85f96db7897cf8cdb4d002ad2308194e03981876edb8d904ef65137","other":"3630e05326bacea8fcc739dec42085f845f416ddc698c76ff91f099eb1dc5007","up":true},{"one":"582330d8b8c49331b2aec790dc7325b9cd483fc8129323d31ec429d545042964","other":"51db114a52827f5b74088bd0fc87d35229e7740e7d121bd7699298396516a880","up":true},{"one":"4c9eab8ab45405a6d4bab46430efc04b8e6aec1d944f88435eca41361925f379","other":"574f65867482091aee2774033116c233525eea711706b5ae9ba09b54e896d302","up":true},{"one":"7125e05bf1bfe6df948c9276b62bc755fc6b0ec8d4ac7724b61ea49591adcf25","other":"738c2d42458965d03c8f9f055eaf0e3edf3dfa2a4de0a048ec05b78e7b765c90","up":true},{"one":"cc2037c08942a094df12f45831f28e0015fc3ac04d5b8f24ffea9bf3a0b02c39","other":"c832b4ad64a17da4b796ffcac646c2aa666b276aabb7eb3bfe7981d64a4da402","up":true},{"one":"c620752a083ca1ff0398937235cf964133939452c293c799ce07ff8aa2bde420","other":"f31cc744ea921fee8364c5269b1ce7ec6b5f0c0cbb6885efbf602de5b36f6169","up":true},{"one":"1c47ad5bd8846f777daf59587feccc308f4dc63f6d27b1385ff8085c75bb1aac","other":"140020a23a840b8840ba0c2c384f853a606330e9743885e9967cf49533db282e","up":true},{"one":"ed2d3e1e5693b44494808907c98ec54d6d08331945d2a2c03e31130fef1d2586","other":"f773b83f1a1de2ab6660edb0b765cfccec6778061ee25c5a84f968625686ef60","up":true},{"one":"499036eb9d10fc003c903f09ea0ee00c0d27b39564988d67ae111f3473d22f07","other":"4bcf4eb531d5ec4b31d99e8354af03f976524c7858a1e7043e9b7055326f0952","up":true},{"one":"da67ace34f7076a1d550bc61bc2a31da88d6cd9f9df43b142a8c6bbade1b4aee","other":"c49caff13862dc089f1f9b8180d6efa455648375662719272102c4f8028799d6","up":true},{"one":"17db15893bf39b42593ee1de975aba6832046d9da5b4b493ec44272738a29cef","other":"179f21d2e0421b8056ee9a260bc0985bfa64a52a36d0a8fbce4e03f3120d1d65","up":true},{"one":"18f6e66e1cc8e620808901b571fdf525ee8f41850fac0bd0e5c5a4de70c5f873","other":"154be9255e9aebd134a914070f5e6f3d4bba079d9ca738b74244db14e1b586dd","up":true},{"one":"5db08436c64f4cc9e2b3950e35bc8ad739825e3efa67a642c771d95b34cb420c","other":"444722a15b01a0d8e6794798d239fe621d59bdfc08823ab47cbd8b9acebd23b4","up":true},{"one":"f528aaafd67b20dafdce101db224aa01c70f93bdc91c14f50fa8db1dbf9fc386","other":"f629b8b9e79c75ac559daf9bf4fc8672bfdd595cf2c5d17a8885282626fc65a5","up":true},{"one":"610334a0772d3414652b575f2caa6f2db32224907c24d06fda643db9f2ec2afe","other":"63370e288ab2e4b8403c6678e9c44ae5c7496b5ead614306fceb85986ed29d18","up":true},{"one":"2d3645c4fdf9a2809a909076b9ee5fb98fa880f6faeff914f1a2987af928cd79","other":"2c79af7ea85f96db7897cf8cdb4d002ad2308194e03981876edb8d904ef65137","up":true},{"one":"6f5f5a77e6092e25e5308413e02ba62c1c559024893a7fb98e26b0f34fed8bfe","other":"63370e288ab2e4b8403c6678e9c44ae5c7496b5ead614306fceb85986ed29d18","up":true},{"one":"b65ee2549536a806ceef4a7ccc9544567cafe6204080929fc847df0a3781ccc9","other":"b2b5ba1bb188f18f79b295f2c0d48c52c1d1d449ecb9b94b9984f3a6179732c7","up":true},{"one":"3f946957d910179c7e1a83c44369aacfc31f5727b1a6421a01c8a978ccd349a2","other":"3e8efcaf3002522b39065ea30c15426d1eb55916499eff8eb5a814e39d41853c","up":true},{"one":"ee5e77df690329c132f2f7fca223cfd384b7bc34ec38763a4eb42780e0585656","other":"e54b643cbc95d9f5d27ec3760d892b6802981bfabf4f9979267d66259df982c7","up":true},{"one":"c8986871e46f001d15ed8b70f2aa0fea8ae309d5e5671a500f619e3b348c8c15","other":"f5dc78ff71a63fc2014b9553723ee676c63fc078a32a46b7cb172f357a118140","up":true},{"one":"53a885968d68d8ebf7ed514e662cc13fa03186d2361000a03576531fdca2a25f","other":"140020a23a840b8840ba0c2c384f853a606330e9743885e9967cf49533db282e","up":true},{"one":"c9f5acafbbf8c66647de05b0848d79451eee490709d53f118fc2051410cc8203","other":"c441d27a5f4abaa8e3b0f040a6ef85bb8c970031d6a57503a674e36b3d6915d9","up":true},{"one":"d863ba7405eb07ccddbf1d34efbcbec2867a93a109ed9413d9aecf30d3645a6a","other":"d29941d6b8acd86cf32fd1c2181da3ab1da3c2083134b068ca49ce29aa86b783","up":true},{"one":"0438f567045d4556a0e7a697028d689ecfd0ae20f9e85c09b48d9f1fd0ee4765","other":"07a8c900fec6c477580ed5b38848a8681dc52a19e59fa4cd32f571fe7fb2383a","up":true},{"one":"898d2f7d46b4961b646d5a6142d54d6233b7f80f668ce234522dd02e2cc545cb","other":"c441d27a5f4abaa8e3b0f040a6ef85bb8c970031d6a57503a674e36b3d6915d9","up":true},{"one":"82dd83838cb982b89505ef249d353a20e434346dd78b71cd9b809f71d5c112da","other":"88fefb7506105c0e269baf52955a01b19f55504b13133bac0beab41c9f6e6942","up":true},{"one":"5efb3bfc199f5408f79bd6bd5171b4bf332c68a8e49242eb4f6a589b963565c6","other":"5db08436c64f4cc9e2b3950e35bc8ad739825e3efa67a642c771d95b34cb420c","up":true},{"one":"a653302730df3d58f796906a93933aa81494f2588d9485ab7676ec3b0ccbb426","other":"aeb4c75a57ccfc9ac053a3d363cf7c1e3e201406587769ab6615d5c2f86a5410","up":true},{"one":"7e0458ecdf7081443cab5412529f3948ece659facaca03208496c80dd136e704","other":"7b90e939ae2a240f0d74a923afb6bbf11f6d5b99a7bf85f1825b1ea36bce744c","up":true},{"one":"9852ce267d53106a6e584d6eddb08e0062eb4a422d2a8d39ad6dccaebac552ff","other":"849bcbb9be43b799fefc5e689efc75125da27f536e97e5b7921031520ae6e5d8","up":true},{"one":"82f9c9009f09de2d6a77b54976d14c14211eae65d886f6ed57560c700716dd5c","other":"959fda0866d3c18e9399e98485d627044079d6f86b075edaea9315402f5d9395","up":true},{"one":"44a10530c376b215baff8531eeb2afb8d6714c4d0350d1a6f32761a97cd6c7ec","other":"4bcf4eb531d5ec4b31d99e8354af03f976524c7858a1e7043e9b7055326f0952","up":true},{"one":"c49caff13862dc089f1f9b8180d6efa455648375662719272102c4f8028799d6","other":"d863ba7405eb07ccddbf1d34efbcbec2867a93a109ed9413d9aecf30d3645a6a","up":true},{"one":"67aa5463e4b32b363b3d01d2a41ccb03199411057276f4962d053160be29a6ef","other":"77d2ec52dabd5d7f326d4c6afd2aad110487c6bdffa2984060528716ba873462","up":true},{"one":"20aeb14f567dd16f06b0d3b589b83283daa00a5ed10e447860bda946baccdd2d","other":"3f946957d910179c7e1a83c44369aacfc31f5727b1a6421a01c8a978ccd349a2","up":true},{"one":"f4565dd2c428c03d7a8d5fad87a6dd5f92ae706529eb6152d36fa584e7cdbe4d","other":"f4e09f89287bd1af7833acd85ba7cc71fdb3ff34f2f409e1cf2a878dcd3183dc","up":true},{"one":"7dc2a9573f253f362ef1b21bbfcc144b11a6febc58aa3c4430224160e9fa738c","other":"7125e05bf1bfe6df948c9276b62bc755fc6b0ec8d4ac7724b61ea49591adcf25","up":true},{"one":"7290cd3affade5f9e729d1b03549aceafb2576cdbc6789fd688c95495f10bacd","other":"7dc2a9573f253f362ef1b21bbfcc144b11a6febc58aa3c4430224160e9fa738c","up":true},{"one":"1f85b8c05e5dceff0bd8256f8f6d80d4b902a9754ceb952d95ea2e1150ef9e59","other":"1c47ad5bd8846f777daf59587feccc308f4dc63f6d27b1385ff8085c75bb1aac","up":true},{"one":"e8efe8016fe6cf649b2755bee22da35ccc6c9c55d404d5385d61f6ea27b84380","other":"efeae3b7f610dc10acc51068e7718876d147cd78a9a28788c5dba5bb3a6950dc","up":true},{"one":"fe316679eca0e0eb823325812a56fd27da02653b06ada2fd03b27501bda8371a","other":"f925c85e6457ac01f0cd6b297155f9d3ae611603890d8f3a45e1396d937f8680","up":true},{"one":"f2d5533eed4b0c184952d859d67e44abe5a75a5de6111c8c106b8f4b2d8ccfc4","other":"f4e09f89287bd1af7833acd85ba7cc71fdb3ff34f2f409e1cf2a878dcd3183dc","up":true},{"one":"4d6b939fb67338c484948ab92b2ceea4d4b666d7e08773673cd7c8f83f495b89","other":"499036eb9d10fc003c903f09ea0ee00c0d27b39564988d67ae111f3473d22f07","up":true},{"one":"30bec7cd0a7d002839aed7654129bd2fe2e2ce7f42aa7bae1560e8bf718954c3","other":"20aeb14f567dd16f06b0d3b589b83283daa00a5ed10e447860bda946baccdd2d","up":true},{"one":"6251e9540448726a601699ef4cd19e50c969a746da27228967338cdc09d628bf","other":"605a46991af15cd60e67413c712b99ff8f21173c96a7990f2728ad6cac2bb9d8","up":true},{"one":"d7aca8f2182bc625d2b3c942bd1161c85bcf1c2b34ecbe3e2fd23cfae6b8a871","other":"ec52270604007673d1bfda1edbd8bfa945a21141efd85e42b684a9f30f8cddae","up":true},{"one":"96fcf14c7f90350091ac6fcb58306ccfb9e4a38d3da59f8ab656854332844cbd","other":"850575577d6b420a87aba388af481e0c044c2f75cf29ff934daf5674318a61ba","up":true},{"one":"0b72054403f78a64a787f46e9f26bf0de7bbba5a60cb105e6aeea46cb4a1d9fe","other":"0ff2d2c49547eebc96675e0b88073dea5e9091bee1843ffe567127e34486c348","up":true},{"one":"02d85b9f8e4776224ae5088683a87837b82b2bfb7e047cf373a28393e7aca6e1","other":"2ccfb5b1f3923d35fef88838c508b98b5516c5d409643881d2304ae49e50eed3","up":true},{"one":"baddc778aea97acdbbb5bc99744a5545abab9f6047c81f328761645287ac391c","other":"bcc6724e54f761361f85147eb102a8d1a1a38810a940ce76b1e361ddcadacaa3","up":true},{"one":"33b5c521b4208e26414db2e05c9a8ccc001a524d928579d44d2e74d14a56593e","other":"3b88a472beba4a18f8df45678888fd359bac3823900eecfe0037fdc9ad54d416","up":true},{"one":"850575577d6b420a87aba388af481e0c044c2f75cf29ff934daf5674318a61ba","other":"90a85cb7363ede161ec21cc89f8b9d4350e566cf10586a66d31b0a8677620aa1","up":true},{"one":"fe2167fd33f383110eb3f6caa7bd905ca54fa0c810f1b8a34483a846f3cbddab","other":"c786ff8667f509b5a9519984c1d95c83a5d2e257500a71429e8f23af610ce771","up":true},{"one":"ef1b70bf090bc9994b1d45e2812c56ecb430a89c346a436bd10880bcda700351","other":"ec52270604007673d1bfda1edbd8bfa945a21141efd85e42b684a9f30f8cddae","up":true},{"one":"f528aaafd67b20dafdce101db224aa01c70f93bdc91c14f50fa8db1dbf9fc386","other":"f7fa2986ec9f84822b11a6b00bd03a1dd26f2a0fab90b1b308f08caead43cfe1","up":true},{"one":"03ccd8d52597d18c0b178ab7361d847d63aad3af920a28345977ae170a1dafcd","other":"006727dc6f59b120b24c17b8e63f80ef3439105f8118ffeed408f105a48ee60c","up":true},{"one":"7920d69cf7e458fce0781ea1a4e07768e1a69f6818090eff0abf0b4a0c2c35f8","other":"6f2d756566dd5b4a13ffeea9f687c785148f3407a502e28b9d6edfd03b905fdc","up":true},{"one":"67dcfd21ece30b41a39bc55c0986fca8f401bb3acba821969519f09d0933e8bd","other":"605a46991af15cd60e67413c712b99ff8f21173c96a7990f2728ad6cac2bb9d8","up":true},{"one":"29957e8e92925a8c79bdf513295d96bfb62fbfc597ee1cf767c7ef408f1b1295","other":"3b78bc987c7c31c94e8ada9b4b11b5db9387fe70dd01ce7f3e976d3bec433dec","up":true},{"one":"7a608d2cf9d1d9c5819dc1f9e88e5cb2852aadea01c40e047c2e184b62e7163c","other":"77d2ec52dabd5d7f326d4c6afd2aad110487c6bdffa2984060528716ba873462","up":true},{"one":"da67ace34f7076a1d550bc61bc2a31da88d6cd9f9df43b142a8c6bbade1b4aee","other":"f4e09f89287bd1af7833acd85ba7cc71fdb3ff34f2f409e1cf2a878dcd3183dc","up":true},{"one":"179f21d2e0421b8056ee9a260bc0985bfa64a52a36d0a8fbce4e03f3120d1d65","other":"14dfb8414d17b2df15eaf59571a8cfec99b1fd674561da63ee99af853bda07da","up":true},{"one":"165f1af67aa1d24569e0bdff61d29b3c39e93250071d8f25b5be6face209ac6a","other":"1436aaa8770e9f1c6294e49f4066c16b1caa50524e9b8fd058059e41657d2a83","up":true},{"one":"88a141c607019477c7b120a506285a7218cad2faa038082e0b9ddfcc9cb78d07","other":"850575577d6b420a87aba388af481e0c044c2f75cf29ff934daf5674318a61ba","up":true},{"one":"c9f5acafbbf8c66647de05b0848d79451eee490709d53f118fc2051410cc8203","other":"c786ff8667f509b5a9519984c1d95c83a5d2e257500a71429e8f23af610ce771","up":true},{"one":"cc2037c08942a094df12f45831f28e0015fc3ac04d5b8f24ffea9bf3a0b02c39","other":"c6cf46239078edfb343c645f039725fdee1bbba8b0a6da02e2cc456b9223c9a2","up":true},{"one":"6c4dcdfdee0164a9a3f419430726dd51f9198c65ff6e7de7aaa6f632dcde6794","other":"77d2ec52dabd5d7f326d4c6afd2aad110487c6bdffa2984060528716ba873462","up":true},{"one":"eb98fb45dd5754f24f9df0c9ecbb93932e3d9d7735cd6d0ddd4a8675bb4ef554","other":"efeae3b7f610dc10acc51068e7718876d147cd78a9a28788c5dba5bb3a6950dc","up":true},{"one":"6e05179dc90a8f6654d0c9a3f06173371dcfb18b852fdd77f35f75e38f273125","other":"610334a0772d3414652b575f2caa6f2db32224907c24d06fda643db9f2ec2afe","up":true},{"one":"7b90e939ae2a240f0d74a923afb6bbf11f6d5b99a7bf85f1825b1ea36bce744c","other":"738c2d42458965d03c8f9f055eaf0e3edf3dfa2a4de0a048ec05b78e7b765c90","up":true},{"one":"4636f00be60a9b494a3ebc9ab41cc7cb53ec0b0beff214db2d0a248dc3aeb6af","other":"41d9c03e44bec3f84a6139ce40ef1e390530f38ed11860575acfad03a49db095","up":true},{"one":"d3b0dea1dd3ac71e7e4a30941632eec53cb980aa7cb6cdac95042a5400a878c3","other":"d29941d6b8acd86cf32fd1c2181da3ab1da3c2083134b068ca49ce29aa86b783","up":true},{"one":"7e0458ecdf7081443cab5412529f3948ece659facaca03208496c80dd136e704","other":"7290cd3affade5f9e729d1b03549aceafb2576cdbc6789fd688c95495f10bacd","up":true},{"one":"e5d794d64003725a74642f097c0ee76706d78419b6f3ea819d440bc0ad166eac","other":"e54784cfbcd89c37c8f758aae70ece3ab4b7f8c30fb4ef7543e04aa89ff4386b","up":true},{"one":"66e7fc2df51f5df8d7329851fe9357d895e9d5dfdc25f8d92bdb10a960f7e15a","other":"44a10530c376b215baff8531eeb2afb8d6714c4d0350d1a6f32761a97cd6c7ec","up":true},{"one":"1436aaa8770e9f1c6294e49f4066c16b1caa50524e9b8fd058059e41657d2a83","other":"1c9caf028df31681b1457a54d4b3ab20009f9fa5bd12417a1ba7efe0c660e6bd","up":true},{"one":"67aa5463e4b32b363b3d01d2a41ccb03199411057276f4962d053160be29a6ef","other":"44a10530c376b215baff8531eeb2afb8d6714c4d0350d1a6f32761a97cd6c7ec","up":true},{"one":"24b85c10f098725938ea7d87cd24a4b10358129906fca9790fc266ea8784b538","other":"2ccfb5b1f3923d35fef88838c508b98b5516c5d409643881d2304ae49e50eed3","up":true},{"one":"53087084708cc5ee63ac459b18fa10ae52a823139b4ecba6c8691d4934f2f971","other":"7dd3078c71087ab88d4d26a962820bcb79b8ce30e91c1f9a69d4bf8d38086960","up":true},{"one":"f4565dd2c428c03d7a8d5fad87a6dd5f92ae706529eb6152d36fa584e7cdbe4d","other":"ed2d3e1e5693b44494808907c98ec54d6d08331945d2a2c03e31130fef1d2586","up":true},{"one":"1c8a10ecbd72acb2bbbb8b77ea5404f9e90f4dbf306ec8134cfed70b40aef399","other":"13d6cb9316e289923e2d1de7f3c966d0cbabce3acdb8017122944f4abb140912","up":true},{"one":"ef07be559914ec4b5930d90d8d8b6f32dab9eba23acc36f14d512307f9974348","other":"eb98fb45dd5754f24f9df0c9ecbb93932e3d9d7735cd6d0ddd4a8675bb4ef554","up":true},{"one":"7dc2a9573f253f362ef1b21bbfcc144b11a6febc58aa3c4430224160e9fa738c","other":"7dd3078c71087ab88d4d26a962820bcb79b8ce30e91c1f9a69d4bf8d38086960","up":true},{"one":"0cf596af91eb9b041fe6dbe6b288c5730413850321b5ab176c81447e34ef79c5","other":"0d8a919207fb2d5718eab7da95f8efeb01a4e1ae39602d315f8ba2ff1752d9da","up":true},{"one":"f31cc744ea921fee8364c5269b1ce7ec6b5f0c0cbb6885efbf602de5b36f6169","other":"f5b24a1fd2cd2908b408562f9a265ee1a692b137e770137afa5fdfa07b237221","up":true},{"one":"4d6b939fb67338c484948ab92b2ceea4d4b666d7e08773673cd7c8f83f495b89","other":"455936fd22c43794e6e2104fd91d3f5d246e3823e8ff8eaf8dc27aa9f3d2ee08","up":true},{"one":"07a8c900fec6c477580ed5b38848a8681dc52a19e59fa4cd32f571fe7fb2383a","other":"06618d829a8a7317a98f1a40ecf8864e1c94c4e270a9e4c008229dc7cf937b7e","up":true},{"one":"d7aca8f2182bc625d2b3c942bd1161c85bcf1c2b34ecbe3e2fd23cfae6b8a871","other":"f7fa2986ec9f84822b11a6b00bd03a1dd26f2a0fab90b1b308f08caead43cfe1","up":true},{"one":"77d2ec52dabd5d7f326d4c6afd2aad110487c6bdffa2984060528716ba873462","other":"6251e9540448726a601699ef4cd19e50c969a746da27228967338cdc09d628bf","up":true},{"one":"37801e8d7d46143f78924ed66099f658a94d37edfd2f58d02acb85add03e1894","other":"49cd1efed6a56a78af4ea4ab40813013e76c6a5fb9d2029ee02db5d80f5e41a6","up":true},{"one":"e775e9759d4701bd9b43c22f1d1be73c1262b2752bb23cb3857485daf1dcad2d","other":"e027a9f7152641c4a41154f8ce4dafd23895c312150efea86bf4152c88d0ca86","up":true},{"one":"6251e9540448726a601699ef4cd19e50c969a746da27228967338cdc09d628bf","other":"6f2d756566dd5b4a13ffeea9f687c785148f3407a502e28b9d6edfd03b905fdc","up":true},{"one":"006727dc6f59b120b24c17b8e63f80ef3439105f8118ffeed408f105a48ee60c","other":"0cf596af91eb9b041fe6dbe6b288c5730413850321b5ab176c81447e34ef79c5","up":true},{"one":"3efc4b120b3eeeac186bf3a4cd42eb8c647f7edb08c23ee643e2bec9d72c5bed","other":"3b78bc987c7c31c94e8ada9b4b11b5db9387fe70dd01ce7f3e976d3bec433dec","up":true},{"one":"f925c85e6457ac01f0cd6b297155f9d3ae611603890d8f3a45e1396d937f8680","other":"f45f1f2e59e947e04fa15bcf87f872ef6d73b73f778e12d1f9b8930ea166eefc","up":true},{"one":"fe2167fd33f383110eb3f6caa7bd905ca54fa0c810f1b8a34483a846f3cbddab","other":"f773b83f1a1de2ab6660edb0b765cfccec6778061ee25c5a84f968625686ef60","up":true},{"one":"6f5f5a77e6092e25e5308413e02ba62c1c559024893a7fb98e26b0f34fed8bfe","other":"6e05179dc90a8f6654d0c9a3f06173371dcfb18b852fdd77f35f75e38f273125","up":true},{"one":"ef1b70bf090bc9994b1d45e2812c56ecb430a89c346a436bd10880bcda700351","other":"f7fa2986ec9f84822b11a6b00bd03a1dd26f2a0fab90b1b308f08caead43cfe1","up":true},{"one":"c8986871e46f001d15ed8b70f2aa0fea8ae309d5e5671a500f619e3b348c8c15","other":"d887070a0568282c69e96ce65612ba72d5ea26b5c80671435d6e1ed2c4b49301","up":true},{"one":"4a8b610e09d35aa21c42ab8c3e38de600a944c094e6b86ea56828b5e6904f1f7","other":"44a10530c376b215baff8531eeb2afb8d6714c4d0350d1a6f32761a97cd6c7ec","up":true},{"one":"1f85b8c05e5dceff0bd8256f8f6d80d4b902a9754ceb952d95ea2e1150ef9e59","other":"1a2a0e0bbf83cd40936995674418ae469aa2b92876a4ceeabd8128f536b7d7a2","up":true},{"one":"0de3915b0bcc68040c8aa76fbd2cfa0714e9b34c9dbe0838a7cba81c4f73581c","other":"0438f567045d4556a0e7a697028d689ecfd0ae20f9e85c09b48d9f1fd0ee4765","up":true},{"one":"7125e05bf1bfe6df948c9276b62bc755fc6b0ec8d4ac7724b61ea49591adcf25","other":"41092c852fac630df2a9ca0862716f8e9fb8566c904a49c96389071046bc699d","up":true},{"one":"ca041da0dc514643d017458d08ff6962ec52c9e66571a239ec395dc8b2546709","other":"c441d27a5f4abaa8e3b0f040a6ef85bb8c970031d6a57503a674e36b3d6915d9","up":true},{"one":"e8efe8016fe6cf649b2755bee22da35ccc6c9c55d404d5385d61f6ea27b84380","other":"ee5e77df690329c132f2f7fca223cfd384b7bc34ec38763a4eb42780e0585656","up":true},{"one":"d863ba7405eb07ccddbf1d34efbcbec2867a93a109ed9413d9aecf30d3645a6a","other":"c26fd5e6504c7b3f0a6d9133ff87c98c110eb1c201c5f3bcf6b10653f2b972d2","up":true},{"one":"9890e6ebb2c6f9a7bec4c2778e077e3710ce3af356f82ae9b4d324832d159ef7","other":"90a85cb7363ede161ec21cc89f8b9d4350e566cf10586a66d31b0a8677620aa1","up":true},{"one":"a653302730df3d58f796906a93933aa81494f2588d9485ab7676ec3b0ccbb426","other":"af02b5d107b3a17f539c7f9020ebe74322434634e70c420a7f56776eb5d9db73","up":true},{"one":"4d103ec5afee559a5a9242e8d650b67301eaec10e96fc2f184e34d48554108a2","other":"49eaad68d23dd63ef26029fa3f4e2578f3deca8708bbc838750d8b6dbe9eaa38","up":true},{"one":"6c73150490e8be9677c40086de0aefed1939581048e26f4a93f5ca26571a1a8f","other":"6f2d756566dd5b4a13ffeea9f687c785148f3407a502e28b9d6edfd03b905fdc","up":true},{"one":"67dcfd21ece30b41a39bc55c0986fca8f401bb3acba821969519f09d0933e8bd","other":"77d2ec52dabd5d7f326d4c6afd2aad110487c6bdffa2984060528716ba873462","up":true},{"one":"f2d5533eed4b0c184952d859d67e44abe5a75a5de6111c8c106b8f4b2d8ccfc4","other":"f5dc78ff71a63fc2014b9553723ee676c63fc078a32a46b7cb172f357a118140","up":true},{"one":"7a608d2cf9d1d9c5819dc1f9e88e5cb2852aadea01c40e047c2e184b62e7163c","other":"6ecb5c36fc0150c287446ae8a8682d629a1d39341230717206219babe3bdf659","up":true},{"one":"2f32d54f06989efb6ca5431b74cd759fba05dbef36ecff8fd506e662026af983","other":"2c3894b6e47cf19ac7ee9fe213196312f676256f670dff25b03563492550bc74","up":true},{"one":"cc2037c08942a094df12f45831f28e0015fc3ac04d5b8f24ffea9bf3a0b02c39","other":"c26fd5e6504c7b3f0a6d9133ff87c98c110eb1c201c5f3bcf6b10653f2b972d2","up":true},{"one":"1e2aca93fa9442a0034ae8d295530dde16fcbfa8c37227e2e6863babb0f87c34","other":"103b232552b94090232195dc88f84823701f35ae536b5af6dd33fa655a33cbae","up":true},{"one":"455936fd22c43794e6e2104fd91d3f5d246e3823e8ff8eaf8dc27aa9f3d2ee08","other":"46fee69dad8b6a6a87d356d10db25d835a0c4e154bf179e88fb4cc65f97d72d7","up":true},{"one":"0438f567045d4556a0e7a697028d689ecfd0ae20f9e85c09b48d9f1fd0ee4765","other":"0b72054403f78a64a787f46e9f26bf0de7bbba5a60cb105e6aeea46cb4a1d9fe","up":true},{"one":"7dbbdeba3731e1ff43072f8cbd86db147761e1b61753eea7024774dbf46914bd","other":"6c4dcdfdee0164a9a3f419430726dd51f9198c65ff6e7de7aaa6f632dcde6794","up":true},{"one":"006727dc6f59b120b24c17b8e63f80ef3439105f8118ffeed408f105a48ee60c","other":"0438f567045d4556a0e7a697028d689ecfd0ae20f9e85c09b48d9f1fd0ee4765","up":true},{"one":"c49caff13862dc089f1f9b8180d6efa455648375662719272102c4f8028799d6","other":"d7aca8f2182bc625d2b3c942bd1161c85bcf1c2b34ecbe3e2fd23cfae6b8a871","up":true},{"one":"82f9c9009f09de2d6a77b54976d14c14211eae65d886f6ed57560c700716dd5c","other":"9d0f804849b72397646ba48208ba1e01dcf4de04e788016c4a1a0c93e650ddf5","up":true},{"one":"f27f1044777e05f3f60165d0d2fc3e7667fe148e0ca7a097805d60b9f61025f7","other":"f528aaafd67b20dafdce101db224aa01c70f93bdc91c14f50fa8db1dbf9fc386","up":true},{"one":"6967e7438125c2045d575eb9f407b4a38d1bf9dcd1c1c1a97f750da6a21aeff7","other":"77d2ec52dabd5d7f326d4c6afd2aad110487c6bdffa2984060528716ba873462","up":true},{"one":"53a885968d68d8ebf7ed514e662cc13fa03186d2361000a03576531fdca2a25f","other":"5f00b3bebef2f5484ff1386298add68a6743a106200ae8a13a27dbb52714ee8f","up":true},{"one":"c9f5acafbbf8c66647de05b0848d79451eee490709d53f118fc2051410cc8203","other":"e5d794d64003725a74642f097c0ee76706d78419b6f3ea819d440bc0ad166eac","up":true},{"one":"d7aca8f2182bc625d2b3c942bd1161c85bcf1c2b34ecbe3e2fd23cfae6b8a871","other":"f4e09f89287bd1af7833acd85ba7cc71fdb3ff34f2f409e1cf2a878dcd3183dc","up":true},{"one":"0c28cd1315890629896d0fe5517524d4eb788f7444709c135ea690ba4e6103d5","other":"00c6488a842ece7a8b0daf064e405de03a4257d308840ea52bfd48d23f54d895","up":true},{"one":"fbf5e917be45e909697a9393c4778206333cf1dd9a103978e8d71622ca3b1cc8","other":"f4e09f89287bd1af7833acd85ba7cc71fdb3ff34f2f409e1cf2a878dcd3183dc","up":true},{"one":"5cd2377226825dc7ea582315cd108d23502df4e9c7c09fc07e7b4aa56440de29","other":"5db08436c64f4cc9e2b3950e35bc8ad739825e3efa67a642c771d95b34cb420c","up":true},{"one":"ac4d2d6836e2cdf4c88221f6013aac70a451dd15bc403288bd10d0b911cd9a2b","other":"ae2b3876bdbd6388781b65e31de182564c5d81f4511caf96588b1a287760b3dd","up":true},{"one":"4636f00be60a9b494a3ebc9ab41cc7cb53ec0b0beff214db2d0a248dc3aeb6af","other":"524db81b135af8dc309b942c082a7291dddb851866fc608753f937ee77015be0","up":true},{"one":"849bcbb9be43b799fefc5e689efc75125da27f536e97e5b7921031520ae6e5d8","other":"90765b72283f59be4cf9bf7a9e9a22fd6db701c3603cbc0817b4adf2f8e9ce08","up":true},{"one":"c6cf46239078edfb343c645f039725fdee1bbba8b0a6da02e2cc456b9223c9a2","other":"c441d27a5f4abaa8e3b0f040a6ef85bb8c970031d6a57503a674e36b3d6915d9","up":true},{"one":"18f6e66e1cc8e620808901b571fdf525ee8f41850fac0bd0e5c5a4de70c5f873","other":"1c9caf028df31681b1457a54d4b3ab20009f9fa5bd12417a1ba7efe0c660e6bd","up":true},{"one":"1c47ad5bd8846f777daf59587feccc308f4dc63f6d27b1385ff8085c75bb1aac","other":"1c8a10ecbd72acb2bbbb8b77ea5404f9e90f4dbf306ec8134cfed70b40aef399","up":true},{"one":"0e5e0bb1383b2ec569b157a1d2ae6900592ab892a28367f5613a4e29cb265088","other":"0fc59bd04ac9de3195e3c9d0eb573952a5805dd2e7e572078b6e996778adec73","up":true},{"one":"7dc2a9573f253f362ef1b21bbfcc144b11a6febc58aa3c4430224160e9fa738c","other":"6f2d756566dd5b4a13ffeea9f687c785148f3407a502e28b9d6edfd03b905fdc","up":true},{"one":"4bcf4eb531d5ec4b31d99e8354af03f976524c7858a1e7043e9b7055326f0952","other":"455936fd22c43794e6e2104fd91d3f5d246e3823e8ff8eaf8dc27aa9f3d2ee08","up":true},{"one":"f2d5533eed4b0c184952d859d67e44abe5a75a5de6111c8c106b8f4b2d8ccfc4","other":"c9f5acafbbf8c66647de05b0848d79451eee490709d53f118fc2051410cc8203","up":true},{"one":"2a0a8eaf1a2749e68f8b841578c160699cf7907ff23842c6d616ad884e5f613e","other":"3f946957d910179c7e1a83c44369aacfc31f5727b1a6421a01c8a978ccd349a2","up":true},{"one":"ee5e77df690329c132f2f7fca223cfd384b7bc34ec38763a4eb42780e0585656","other":"f4e09f89287bd1af7833acd85ba7cc71fdb3ff34f2f409e1cf2a878dcd3183dc","up":true},{"one":"7dbbdeba3731e1ff43072f8cbd86db147761e1b61753eea7024774dbf46914bd","other":"6f2d756566dd5b4a13ffeea9f687c785148f3407a502e28b9d6edfd03b905fdc","up":true},{"one":"53087084708cc5ee63ac459b18fa10ae52a823139b4ecba6c8691d4934f2f971","other":"605a46991af15cd60e67413c712b99ff8f21173c96a7990f2728ad6cac2bb9d8","up":true},{"one":"ef1b70bf090bc9994b1d45e2812c56ecb430a89c346a436bd10880bcda700351","other":"e8548b5df15adf0f2a997ff5709827beb5e1d36bb08a2f2d017746d5c0e83fca","up":true},{"one":"daec45eca40f48843b41f70267c07e94996ced829f02710f15354fbe26e177e7","other":"f45f1f2e59e947e04fa15bcf87f872ef6d73b73f778e12d1f9b8930ea166eefc","up":true},{"one":"0ff2d2c49547eebc96675e0b88073dea5e9091bee1843ffe567127e34486c348","other":"0e5e0bb1383b2ec569b157a1d2ae6900592ab892a28367f5613a4e29cb265088","up":true},{"one":"d3b0dea1dd3ac71e7e4a30941632eec53cb980aa7cb6cdac95042a5400a878c3","other":"d1d719ce1dca507598449afe966396c160ad25ad632112ab268b1d913b490dbd","up":true},{"one":"461cc9f064e6f4f06ff38e0d1f3f00ef8807ba31c7258e453cc682e9551bb1c6","other":"41d9c03e44bec3f84a6139ce40ef1e390530f38ed11860575acfad03a49db095","up":true},{"one":"b02b01a5c37cb05c287a3dc7d04e305de26f8d62dc388542eeb43e97db7b4282","other":"b7cafed41dac01dd59e2bcaeaaab551ebfeab8eaa1f97c1866fe0ddae772807b","up":true},{"one":"c59e3953b64e5b9ffbe53990a358914f2fa8e3551d33f92b9e3a441bd1baf2cd","other":"c6cf46239078edfb343c645f039725fdee1bbba8b0a6da02e2cc456b9223c9a2","up":true},{"one":"4a8b610e09d35aa21c42ab8c3e38de600a944c094e6b86ea56828b5e6904f1f7","other":"4c9eab8ab45405a6d4bab46430efc04b8e6aec1d944f88435eca41361925f379","up":true},{"one":"4646fe4c119078738612b44a356089b3c73a08e11cfd910675d211ae6b20b8fd","other":"6f5f5a77e6092e25e5308413e02ba62c1c559024893a7fb98e26b0f34fed8bfe","up":true},{"one":"0c64e5af869b1665fd4016ae6d04c8eedd423636f06d78ecb944ee8e3272a82a","other":"0fc59bd04ac9de3195e3c9d0eb573952a5805dd2e7e572078b6e996778adec73","up":true},{"one":"02d85b9f8e4776224ae5088683a87837b82b2bfb7e047cf373a28393e7aca6e1","other":"07a8c900fec6c477580ed5b38848a8681dc52a19e59fa4cd32f571fe7fb2383a","up":true},{"one":"e027a9f7152641c4a41154f8ce4dafd23895c312150efea86bf4152c88d0ca86","other":"eb98fb45dd5754f24f9df0c9ecbb93932e3d9d7735cd6d0ddd4a8675bb4ef554","up":true},{"one":"03285e06657032778feff0b43828c964dbf9de669f63171aeb587aa1a1facc0a","other":"0a005eb9c10c5cc9f720cfec2a655811d391671597b4f32d12df291ec76b2c13","up":true},{"one":"4e5a46c004e85cf86a02fdfbf2243018825d015debfb9a077a1283d302293b3a","other":"4c9eab8ab45405a6d4bab46430efc04b8e6aec1d944f88435eca41361925f379","up":true},{"one":"82dd83838cb982b89505ef249d353a20e434346dd78b71cd9b809f71d5c112da","other":"88a141c607019477c7b120a506285a7218cad2faa038082e0b9ddfcc9cb78d07","up":true},{"one":"4d103ec5afee559a5a9242e8d650b67301eaec10e96fc2f184e34d48554108a2","other":"4e5a46c004e85cf86a02fdfbf2243018825d015debfb9a077a1283d302293b3a","up":true},{"one":"b95d88ff6512ef8eaaa6bd842fa44175c1484fc2e8601b83d50a5ffa992bfa3a","other":"a34ea2e87d4c12adb27d66c2c95300603ff50415974e000bbcc69a5ae059dbf1","up":true},{"one":"21012a3a6ef1ece48fd9d7cffe62dc75839dd062efcf3ac5f962c237814da407","other":"2c79af7ea85f96db7897cf8cdb4d002ad2308194e03981876edb8d904ef65137","up":true},{"one":"03ccd8d52597d18c0b178ab7361d847d63aad3af920a28345977ae170a1dafcd","other":"0a005eb9c10c5cc9f720cfec2a655811d391671597b4f32d12df291ec76b2c13","up":true},{"one":"19faaf891eb6a716902ec29d201dc2094ee474acff188ae86faf9760674b2d37","other":"1c8a10ecbd72acb2bbbb8b77ea5404f9e90f4dbf306ec8134cfed70b40aef399","up":true},{"one":"f5dc78ff71a63fc2014b9553723ee676c63fc078a32a46b7cb172f357a118140","other":"fbc8087a723c564ca0139329902e79748af46699ea7be24d57909a7e8e96f681","up":true},{"one":"c8986871e46f001d15ed8b70f2aa0fea8ae309d5e5671a500f619e3b348c8c15","other":"c26fd5e6504c7b3f0a6d9133ff87c98c110eb1c201c5f3bcf6b10653f2b972d2","up":true},{"one":"3efc4b120b3eeeac186bf3a4cd42eb8c647f7edb08c23ee643e2bec9d72c5bed","other":"3f946957d910179c7e1a83c44369aacfc31f5727b1a6421a01c8a978ccd349a2","up":true},{"one":"ca041da0dc514643d017458d08ff6962ec52c9e66571a239ec395dc8b2546709","other":"f4e09f89287bd1af7833acd85ba7cc71fdb3ff34f2f409e1cf2a878dcd3183dc","up":true},{"one":"c832b4ad64a17da4b796ffcac646c2aa666b276aabb7eb3bfe7981d64a4da402","other":"c620752a083ca1ff0398937235cf964133939452c293c799ce07ff8aa2bde420","up":true},{"one":"90765b72283f59be4cf9bf7a9e9a22fd6db701c3603cbc0817b4adf2f8e9ce08","other":"8f2182c2c2d0eeb2e887dbc350ae7257819f536032851ffdf29e7842cb1a62cc","up":true},{"one":"378e7af7cc019186d4f2699e753e2d71302f8f3565572c13b7a1b1c5cb47443c","other":"314a3530a5e0c37d5609149b3ae9c2e078573346bd8fce3c769ebaeb31726ec1","up":true},{"one":"f7baef876a62b92ebe5ca9ec6a085e0eb54fd31e2425e662eec747df3cd77592","other":"f5b24a1fd2cd2908b408562f9a265ee1a692b137e770137afa5fdfa07b237221","up":true},{"one":"e5149cedd990072f2aaa9735a9259f28973c45876660c2d86ac105e56cca8e68","other":"eb98fb45dd5754f24f9df0c9ecbb93932e3d9d7735cd6d0ddd4a8675bb4ef554","up":true},{"one":"4636f00be60a9b494a3ebc9ab41cc7cb53ec0b0beff214db2d0a248dc3aeb6af","other":"45584a4bebb948ef5f7b55d4846ec5549d7623682169c0edcab5b3523e68c7da","up":true},{"one":"7b90e939ae2a240f0d74a923afb6bbf11f6d5b99a7bf85f1825b1ea36bce744c","other":"5f00b3bebef2f5484ff1386298add68a6743a106200ae8a13a27dbb52714ee8f","up":true},{"one":"850575577d6b420a87aba388af481e0c044c2f75cf29ff934daf5674318a61ba","other":"8f2182c2c2d0eeb2e887dbc350ae7257819f536032851ffdf29e7842cb1a62cc","up":true},{"one":"0743bcf2aaa77e916f4a367d6159473c7d80f46a2e4cbe9ef346e423d39d7072","other":"0d8a919207fb2d5718eab7da95f8efeb01a4e1ae39602d315f8ba2ff1752d9da","up":true},{"one":"30bec7cd0a7d002839aed7654129bd2fe2e2ce7f42aa7bae1560e8bf718954c3","other":"49cd1efed6a56a78af4ea4ab40813013e76c6a5fb9d2029ee02db5d80f5e41a6","up":true},{"one":"fe2167fd33f383110eb3f6caa7bd905ca54fa0c810f1b8a34483a846f3cbddab","other":"ff36a8810dd44f6d1fa42aa91ff6206bcfb4c1ffbab0df73a181daece329e0e3","up":true},{"one":"33737df75bbac1b41c63f05ea2cf1523b972df17f22bda026db84a49ac35e1e3","other":"314a3530a5e0c37d5609149b3ae9c2e078573346bd8fce3c769ebaeb31726ec1","up":true},{"one":"f773b83f1a1de2ab6660edb0b765cfccec6778061ee25c5a84f968625686ef60","other":"f925c85e6457ac01f0cd6b297155f9d3ae611603890d8f3a45e1396d937f8680","up":true},{"one":"b2a563ac59bab4dfddf7b6e27b80ee7afdeb2e4295411107903f484bcf9fc4f2","other":"b7cafed41dac01dd59e2bcaeaaab551ebfeab8eaa1f97c1866fe0ddae772807b","up":true},{"one":"b65ee2549536a806ceef4a7ccc9544567cafe6204080929fc847df0a3781ccc9","other":"b02b01a5c37cb05c287a3dc7d04e305de26f8d62dc388542eeb43e97db7b4282","up":true},{"one":"7a608d2cf9d1d9c5819dc1f9e88e5cb2852aadea01c40e047c2e184b62e7163c","other":"5f00b3bebef2f5484ff1386298add68a6743a106200ae8a13a27dbb52714ee8f","up":true},{"one":"d887070a0568282c69e96ce65612ba72d5ea26b5c80671435d6e1ed2c4b49301","other":"c1f9e8e1d509febdf1f267bb227741e513420048a2e669ac9eef4b05a29cf10b","up":true},{"one":"6c4dcdfdee0164a9a3f419430726dd51f9198c65ff6e7de7aaa6f632dcde6794","other":"7dc2a9573f253f362ef1b21bbfcc144b11a6febc58aa3c4430224160e9fa738c","up":true},{"one":"775e7be502df8fd938cf9c42ee4fac33e460a4b6992b9efeb8dc1ff7dde5c40f","other":"7dd3078c71087ab88d4d26a962820bcb79b8ce30e91c1f9a69d4bf8d38086960","up":true},{"one":"6c73150490e8be9677c40086de0aefed1939581048e26f4a93f5ca26571a1a8f","other":"6967e7438125c2045d575eb9f407b4a38d1bf9dcd1c1c1a97f750da6a21aeff7","up":true},{"one":"2a97d308a720274a440dfa6901ca0a5480af9bab58dd8a6c4afdb9c83ea964c3","other":"2ccfb5b1f3923d35fef88838c508b98b5516c5d409643881d2304ae49e50eed3","up":true},{"one":"e775e9759d4701bd9b43c22f1d1be73c1262b2752bb23cb3857485daf1dcad2d","other":"ee5e77df690329c132f2f7fca223cfd384b7bc34ec38763a4eb42780e0585656","up":true},{"one":"18f6e66e1cc8e620808901b571fdf525ee8f41850fac0bd0e5c5a4de70c5f873","other":"1f85b8c05e5dceff0bd8256f8f6d80d4b902a9754ceb952d95ea2e1150ef9e59","up":true},{"one":"c26fd5e6504c7b3f0a6d9133ff87c98c110eb1c201c5f3bcf6b10653f2b972d2","other":"c441d27a5f4abaa8e3b0f040a6ef85bb8c970031d6a57503a674e36b3d6915d9","up":true},{"one":"4646fe4c119078738612b44a356089b3c73a08e11cfd910675d211ae6b20b8fd","other":"4d6b939fb67338c484948ab92b2ceea4d4b666d7e08773673cd7c8f83f495b89","up":true},{"one":"eb98fb45dd5754f24f9df0c9ecbb93932e3d9d7735cd6d0ddd4a8675bb4ef554","other":"ee5e77df690329c132f2f7fca223cfd384b7bc34ec38763a4eb42780e0585656","up":true},{"one":"b2a563ac59bab4dfddf7b6e27b80ee7afdeb2e4295411107903f484bcf9fc4f2","other":"b2b5ba1bb188f18f79b295f2c0d48c52c1d1d449ecb9b94b9984f3a6179732c7","up":true},{"one":"d7aca8f2182bc625d2b3c942bd1161c85bcf1c2b34ecbe3e2fd23cfae6b8a871","other":"d863ba7405eb07ccddbf1d34efbcbec2867a93a109ed9413d9aecf30d3645a6a","up":true},{"one":"49cd1efed6a56a78af4ea4ab40813013e76c6a5fb9d2029ee02db5d80f5e41a6","other":"44a10530c376b215baff8531eeb2afb8d6714c4d0350d1a6f32761a97cd6c7ec","up":true},{"one":"6ea51fb6e4783f351dbbfa47b508c78c73233ebaada409dfb55446217f92c4bd","other":"60d7337ef806be95ccaf7b9d663a4289f9afc68edced62904ab50601cf113f45","up":true},{"one":"898d2f7d46b4961b646d5a6142d54d6233b7f80f668ce234522dd02e2cc545cb","other":"8f2182c2c2d0eeb2e887dbc350ae7257819f536032851ffdf29e7842cb1a62cc","up":true},{"one":"915d7a0510bad19266eef8f00ca0cb2efc340253775706495fca8b9160b512cc","other":"9fa0215e980dc907df4cc47ab4937f36527d78f9837493016fd4fc51e617299c","up":true},{"one":"a653302730df3d58f796906a93933aa81494f2588d9485ab7676ec3b0ccbb426","other":"a3693801a91180410cf3e85d7c09ac8054a769e7b1d55c9e7a46850cb8217da0","up":true},{"one":"d887070a0568282c69e96ce65612ba72d5ea26b5c80671435d6e1ed2c4b49301","other":"df1e4e46e8ec26cad74b4f35ab070f12c8f6fddca35ac44c1218ff60fe1e6bab","up":true},{"one":"fe2167fd33f383110eb3f6caa7bd905ca54fa0c810f1b8a34483a846f3cbddab","other":"fbc8087a723c564ca0139329902e79748af46699ea7be24d57909a7e8e96f681","up":true},{"one":"c9f5acafbbf8c66647de05b0848d79451eee490709d53f118fc2051410cc8203","other":"c620752a083ca1ff0398937235cf964133939452c293c799ce07ff8aa2bde420","up":true},{"one":"fbf5e917be45e909697a9393c4778206333cf1dd9a103978e8d71622ca3b1cc8","other":"f5dc78ff71a63fc2014b9553723ee676c63fc078a32a46b7cb172f357a118140","up":true},{"one":"4636f00be60a9b494a3ebc9ab41cc7cb53ec0b0beff214db2d0a248dc3aeb6af","other":"47bfa3767cefcc0831d410d5402e9396e8a412c8c96faf55b451d3ff310f3b02","up":true},{"one":"850575577d6b420a87aba388af481e0c044c2f75cf29ff934daf5674318a61ba","other":"a3693801a91180410cf3e85d7c09ac8054a769e7b1d55c9e7a46850cb8217da0","up":true},{"one":"d3b0dea1dd3ac71e7e4a30941632eec53cb980aa7cb6cdac95042a5400a878c3","other":"db6a1f6b342f6be9517f8df01003797c11c837d9aee3cdba5b7859230b36c35d","up":true},{"one":"e775e9759d4701bd9b43c22f1d1be73c1262b2752bb23cb3857485daf1dcad2d","other":"e5149cedd990072f2aaa9735a9259f28973c45876660c2d86ac105e56cca8e68","up":true},{"one":"f4565dd2c428c03d7a8d5fad87a6dd5f92ae706529eb6152d36fa584e7cdbe4d","other":"f528aaafd67b20dafdce101db224aa01c70f93bdc91c14f50fa8db1dbf9fc386","up":true},{"one":"ff36a8810dd44f6d1fa42aa91ff6206bcfb4c1ffbab0df73a181daece329e0e3","other":"f528aaafd67b20dafdce101db224aa01c70f93bdc91c14f50fa8db1dbf9fc386","up":true},{"one":"0a005eb9c10c5cc9f720cfec2a655811d391671597b4f32d12df291ec76b2c13","other":"0cf596af91eb9b041fe6dbe6b288c5730413850321b5ab176c81447e34ef79c5","up":true},{"one":"ff36a8810dd44f6d1fa42aa91ff6206bcfb4c1ffbab0df73a181daece329e0e3","other":"c786ff8667f509b5a9519984c1d95c83a5d2e257500a71429e8f23af610ce771","up":true},{"one":"fbf5e917be45e909697a9393c4778206333cf1dd9a103978e8d71622ca3b1cc8","other":"f45f1f2e59e947e04fa15bcf87f872ef6d73b73f778e12d1f9b8930ea166eefc","up":true},{"one":"9fa0215e980dc907df4cc47ab4937f36527d78f9837493016fd4fc51e617299c","other":"976e57d0c32227222bfd0cbb802f269bdcd52d5d33cf689c66b12c023f5fa8bf","up":true},{"one":"4646fe4c119078738612b44a356089b3c73a08e11cfd910675d211ae6b20b8fd","other":"5f00b3bebef2f5484ff1386298add68a6743a106200ae8a13a27dbb52714ee8f","up":true},{"one":"7a608d2cf9d1d9c5819dc1f9e88e5cb2852aadea01c40e047c2e184b62e7163c","other":"6f5f5a77e6092e25e5308413e02ba62c1c559024893a7fb98e26b0f34fed8bfe","up":true},{"one":"90765b72283f59be4cf9bf7a9e9a22fd6db701c3603cbc0817b4adf2f8e9ce08","other":"b2b5ba1bb188f18f79b295f2c0d48c52c1d1d449ecb9b94b9984f3a6179732c7","up":true},{"one":"f7baef876a62b92ebe5ca9ec6a085e0eb54fd31e2425e662eec747df3cd77592","other":"f925c85e6457ac01f0cd6b297155f9d3ae611603890d8f3a45e1396d937f8680","up":true},{"one":"ef1b70bf090bc9994b1d45e2812c56ecb430a89c346a436bd10880bcda700351","other":"f2d5533eed4b0c184952d859d67e44abe5a75a5de6111c8c106b8f4b2d8ccfc4","up":true},{"one":"44a10530c376b215baff8531eeb2afb8d6714c4d0350d1a6f32761a97cd6c7ec","other":"46fee69dad8b6a6a87d356d10db25d835a0c4e154bf179e88fb4cc65f97d72d7","up":true},{"one":"1e2aca93fa9442a0034ae8d295530dde16fcbfa8c37227e2e6863babb0f87c34","other":"1c8a10ecbd72acb2bbbb8b77ea5404f9e90f4dbf306ec8134cfed70b40aef399","up":true},{"one":"d3b0dea1dd3ac71e7e4a30941632eec53cb980aa7cb6cdac95042a5400a878c3","other":"c6cf46239078edfb343c645f039725fdee1bbba8b0a6da02e2cc456b9223c9a2","up":true},{"one":"524db81b135af8dc309b942c082a7291dddb851866fc608753f937ee77015be0","other":"582330d8b8c49331b2aec790dc7325b9cd483fc8129323d31ec429d545042964","up":true},{"one":"66e7fc2df51f5df8d7329851fe9357d895e9d5dfdc25f8d92bdb10a960f7e15a","other":"6fe9a02e950a5c3a5ff026b75922ed687d59795ba8eb9c092a8d09a5c64d2453","up":true},{"one":"82dd83838cb982b89505ef249d353a20e434346dd78b71cd9b809f71d5c112da","other":"8f2182c2c2d0eeb2e887dbc350ae7257819f536032851ffdf29e7842cb1a62cc","up":true},{"one":"c43fbee95380007274b8f231fe34bcd59b5c0ef0830b174967d4702627984fc6","other":"f4e09f89287bd1af7833acd85ba7cc71fdb3ff34f2f409e1cf2a878dcd3183dc","up":true},{"one":"60d7337ef806be95ccaf7b9d663a4289f9afc68edced62904ab50601cf113f45","other":"6f2d756566dd5b4a13ffeea9f687c785148f3407a502e28b9d6edfd03b905fdc","up":true},{"one":"154be9255e9aebd134a914070f5e6f3d4bba079d9ca738b74244db14e1b586dd","other":"17db15893bf39b42593ee1de975aba6832046d9da5b4b493ec44272738a29cef","up":true},{"one":"58ed74695bf527bac9a350c86d305e53e08c4999795e11cd3b2a36f5cd25d637","other":"582330d8b8c49331b2aec790dc7325b9cd483fc8129323d31ec429d545042964","up":true},{"one":"fe316679eca0e0eb823325812a56fd27da02653b06ada2fd03b27501bda8371a","other":"c786ff8667f509b5a9519984c1d95c83a5d2e257500a71429e8f23af610ce771","up":true},{"one":"7dd3078c71087ab88d4d26a962820bcb79b8ce30e91c1f9a69d4bf8d38086960","other":"6f2d756566dd5b4a13ffeea9f687c785148f3407a502e28b9d6edfd03b905fdc","up":true},{"one":"006727dc6f59b120b24c17b8e63f80ef3439105f8118ffeed408f105a48ee60c","other":"06618d829a8a7317a98f1a40ecf8864e1c94c4e270a9e4c008229dc7cf937b7e","up":true},{"one":"d3b0dea1dd3ac71e7e4a30941632eec53cb980aa7cb6cdac95042a5400a878c3","other":"c832b4ad64a17da4b796ffcac646c2aa666b276aabb7eb3bfe7981d64a4da402","up":true},{"one":"140020a23a840b8840ba0c2c384f853a606330e9743885e9967cf49533db282e","other":"1a2a0e0bbf83cd40936995674418ae469aa2b92876a4ceeabd8128f536b7d7a2","up":true},{"one":"c832b4ad64a17da4b796ffcac646c2aa666b276aabb7eb3bfe7981d64a4da402","other":"caf6a8e37fd41c1e6ad77a8575cd90354bb1693893952301c9caeb4779c338d3","up":true},{"one":"ef07be559914ec4b5930d90d8d8b6f32dab9eba23acc36f14d512307f9974348","other":"e8830f2b2f7d08df15bd33f4b2841d01d9d62c1621234bd6ae86743e52360f3e","up":true},{"one":"af02b5d107b3a17f539c7f9020ebe74322434634e70c420a7f56776eb5d9db73","other":"a3693801a91180410cf3e85d7c09ac8054a769e7b1d55c9e7a46850cb8217da0","up":true},{"one":"0d8a919207fb2d5718eab7da95f8efeb01a4e1ae39602d315f8ba2ff1752d9da","other":"0c28cd1315890629896d0fe5517524d4eb788f7444709c135ea690ba4e6103d5","up":true},{"one":"c43fbee95380007274b8f231fe34bcd59b5c0ef0830b174967d4702627984fc6","other":"c1f9e8e1d509febdf1f267bb227741e513420048a2e669ac9eef4b05a29cf10b","up":true},{"one":"bcc6724e54f761361f85147eb102a8d1a1a38810a940ce76b1e361ddcadacaa3","other":"b89793c3ccd9ea642080728732ce7df33778653fed3d1d8f3a25e60670e33325","up":true},{"one":"03ccd8d52597d18c0b178ab7361d847d63aad3af920a28345977ae170a1dafcd","other":"0e5e0bb1383b2ec569b157a1d2ae6900592ab892a28367f5613a4e29cb265088","up":true},{"one":"b2a563ac59bab4dfddf7b6e27b80ee7afdeb2e4295411107903f484bcf9fc4f2","other":"b5025d153581d333b44df4b9bfa69d87de138905172e4fd317e16f7099a5fcf8","up":true},{"one":"610334a0772d3414652b575f2caa6f2db32224907c24d06fda643db9f2ec2afe","other":"41092c852fac630df2a9ca0862716f8e9fb8566c904a49c96389071046bc699d","up":true},{"one":"165f1af67aa1d24569e0bdff61d29b3c39e93250071d8f25b5be6face209ac6a","other":"1c8a10ecbd72acb2bbbb8b77ea5404f9e90f4dbf306ec8134cfed70b40aef399","up":true},{"one":"ff36a8810dd44f6d1fa42aa91ff6206bcfb4c1ffbab0df73a181daece329e0e3","other":"f4e09f89287bd1af7833acd85ba7cc71fdb3ff34f2f409e1cf2a878dcd3183dc","up":true},{"one":"5f00b3bebef2f5484ff1386298add68a6743a106200ae8a13a27dbb52714ee8f","other":"6fe9a02e950a5c3a5ff026b75922ed687d59795ba8eb9c092a8d09a5c64d2453","up":true},{"one":"610334a0772d3414652b575f2caa6f2db32224907c24d06fda643db9f2ec2afe","other":"7dd3078c71087ab88d4d26a962820bcb79b8ce30e91c1f9a69d4bf8d38086960","up":true},{"one":"9890e6ebb2c6f9a7bec4c2778e077e3710ce3af356f82ae9b4d324832d159ef7","other":"976e57d0c32227222bfd0cbb802f269bdcd52d5d33cf689c66b12c023f5fa8bf","up":true},{"one":"ad9899f78659492ec248a884927a757f3f3b4e76cd2abc46ad8766251fd8afed","other":"90765b72283f59be4cf9bf7a9e9a22fd6db701c3603cbc0817b4adf2f8e9ce08","up":true},{"one":"e54784cfbcd89c37c8f758aae70ece3ab4b7f8c30fb4ef7543e04aa89ff4386b","other":"e54b643cbc95d9f5d27ec3760d892b6802981bfabf4f9979267d66259df982c7","up":true},{"one":"2c3894b6e47cf19ac7ee9fe213196312f676256f670dff25b03563492550bc74","other":"2c79af7ea85f96db7897cf8cdb4d002ad2308194e03981876edb8d904ef65137","up":true},{"one":"f45f1f2e59e947e04fa15bcf87f872ef6d73b73f778e12d1f9b8930ea166eefc","other":"d29941d6b8acd86cf32fd1c2181da3ab1da3c2083134b068ca49ce29aa86b783","up":true},{"one":"7dd3078c71087ab88d4d26a962820bcb79b8ce30e91c1f9a69d4bf8d38086960","other":"738c2d42458965d03c8f9f055eaf0e3edf3dfa2a4de0a048ec05b78e7b765c90","up":true},{"one":"478278187cd9af799e83340a2f49b0b7f122fb8e08c0a372a87795426eab364b","other":"41d9c03e44bec3f84a6139ce40ef1e390530f38ed11860575acfad03a49db095","up":true},{"one":"b89793c3ccd9ea642080728732ce7df33778653fed3d1d8f3a25e60670e33325","other":"90765b72283f59be4cf9bf7a9e9a22fd6db701c3603cbc0817b4adf2f8e9ce08","up":true},{"one":"47bfa3767cefcc0831d410d5402e9396e8a412c8c96faf55b451d3ff310f3b02","other":"455936fd22c43794e6e2104fd91d3f5d246e3823e8ff8eaf8dc27aa9f3d2ee08","up":true},{"one":"cc2037c08942a094df12f45831f28e0015fc3ac04d5b8f24ffea9bf3a0b02c39","other":"c9f5acafbbf8c66647de05b0848d79451eee490709d53f118fc2051410cc8203","up":true},{"one":"7290cd3affade5f9e729d1b03549aceafb2576cdbc6789fd688c95495f10bacd","other":"738c2d42458965d03c8f9f055eaf0e3edf3dfa2a4de0a048ec05b78e7b765c90","up":true},{"one":"256e81c5a6fb43bd343345477f8f96aa1947f07ac3297f631ab03f060147b062","other":"3b88a472beba4a18f8df45678888fd359bac3823900eecfe0037fdc9ad54d416","up":true},{"one":"16725e318322353befc2f2aba112f0984bc011821bb16c98e2cd8b39cd62aea1","other":"13d6cb9316e289923e2d1de7f3c966d0cbabce3acdb8017122944f4abb140912","up":true},{"one":"16725e318322353befc2f2aba112f0984bc011821bb16c98e2cd8b39cd62aea1","other":"103b232552b94090232195dc88f84823701f35ae536b5af6dd33fa655a33cbae","up":true},{"one":"68317431e4fa55be4a700e35c6a578307cc32b72336679b5c5618b622ef0c602","other":"6fe9a02e950a5c3a5ff026b75922ed687d59795ba8eb9c092a8d09a5c64d2453","up":true},{"one":"1e2aca93fa9442a0034ae8d295530dde16fcbfa8c37227e2e6863babb0f87c34","other":"165f1af67aa1d24569e0bdff61d29b3c39e93250071d8f25b5be6face209ac6a","up":true},{"one":"c43fbee95380007274b8f231fe34bcd59b5c0ef0830b174967d4702627984fc6","other":"d7aca8f2182bc625d2b3c942bd1161c85bcf1c2b34ecbe3e2fd23cfae6b8a871","up":true},{"one":"b2a563ac59bab4dfddf7b6e27b80ee7afdeb2e4295411107903f484bcf9fc4f2","other":"ba884e5cfa1ee6eb38217181711e01bb0c37b3e33d1424dfa89ed3e29ef6205b","up":true},{"one":"8025c1fcb98e53f92767d1d43a3057a0acd1e8994bb4a7e3f5e244110e0dcf91","other":"898d2f7d46b4961b646d5a6142d54d6233b7f80f668ce234522dd02e2cc545cb","up":true},{"one":"534bcaa98cf9192b35b6014c650ae067e74332c015ebb516d63601427d7376b8","other":"574f65867482091aee2774033116c233525eea711706b5ae9ba09b54e896d302","up":true},{"one":"16725e318322353befc2f2aba112f0984bc011821bb16c98e2cd8b39cd62aea1","other":"14dfb8414d17b2df15eaf59571a8cfec99b1fd674561da63ee99af853bda07da","up":true},{"one":"ed2d3e1e5693b44494808907c98ec54d6d08331945d2a2c03e31130fef1d2586","other":"f4e09f89287bd1af7833acd85ba7cc71fdb3ff34f2f409e1cf2a878dcd3183dc","up":true},{"one":"610334a0772d3414652b575f2caa6f2db32224907c24d06fda643db9f2ec2afe","other":"605a46991af15cd60e67413c712b99ff8f21173c96a7990f2728ad6cac2bb9d8","up":true},{"one":"256e81c5a6fb43bd343345477f8f96aa1947f07ac3297f631ab03f060147b062","other":"2ccfb5b1f3923d35fef88838c508b98b5516c5d409643881d2304ae49e50eed3","up":true},{"one":"67aa5463e4b32b363b3d01d2a41ccb03199411057276f4962d053160be29a6ef","other":"6251e9540448726a601699ef4cd19e50c969a746da27228967338cdc09d628bf","up":true},{"one":"68317431e4fa55be4a700e35c6a578307cc32b72336679b5c5618b622ef0c602","other":"6e68ea86440706a0d73a9508f2247492543163f8fa7e2dc2aa62b74d50261b8b","up":true},{"one":"68317431e4fa55be4a700e35c6a578307cc32b72336679b5c5618b622ef0c602","other":"6e05179dc90a8f6654d0c9a3f06173371dcfb18b852fdd77f35f75e38f273125","up":true},{"one":"17040a3aad5930d8e0de1011fd2996b7d09225989f0dc1ae8f7e7a52dd26ab4e","other":"11d43f6ed0ddd5afa5c8a7abf7c62a4fa865b7a25ee295bf1a49701ef3081363","up":true},{"one":"03ccd8d52597d18c0b178ab7361d847d63aad3af920a28345977ae170a1dafcd","other":"00c6488a842ece7a8b0daf064e405de03a4257d308840ea52bfd48d23f54d895","up":true},{"one":"5f00b3bebef2f5484ff1386298add68a6743a106200ae8a13a27dbb52714ee8f","other":"49cd1efed6a56a78af4ea4ab40813013e76c6a5fb9d2029ee02db5d80f5e41a6","up":true},{"one":"fbf5e917be45e909697a9393c4778206333cf1dd9a103978e8d71622ca3b1cc8","other":"f7baef876a62b92ebe5ca9ec6a085e0eb54fd31e2425e662eec747df3cd77592","up":true},{"one":"67aa5463e4b32b363b3d01d2a41ccb03199411057276f4962d053160be29a6ef","other":"63370e288ab2e4b8403c6678e9c44ae5c7496b5ead614306fceb85986ed29d18","up":true},{"one":"0d8a919207fb2d5718eab7da95f8efeb01a4e1ae39602d315f8ba2ff1752d9da","other":"1c8a10ecbd72acb2bbbb8b77ea5404f9e90f4dbf306ec8134cfed70b40aef399","up":true},{"one":"6e05179dc90a8f6654d0c9a3f06173371dcfb18b852fdd77f35f75e38f273125","other":"6f2d756566dd5b4a13ffeea9f687c785148f3407a502e28b9d6edfd03b905fdc","up":true},{"one":"2c79af7ea85f96db7897cf8cdb4d002ad2308194e03981876edb8d904ef65137","other":"29957e8e92925a8c79bdf513295d96bfb62fbfc597ee1cf767c7ef408f1b1295","up":true},{"one":"45584a4bebb948ef5f7b55d4846ec5549d7623682169c0edcab5b3523e68c7da","other":"455936fd22c43794e6e2104fd91d3f5d246e3823e8ff8eaf8dc27aa9f3d2ee08","up":true},{"one":"e8548b5df15adf0f2a997ff5709827beb5e1d36bb08a2f2d017746d5c0e83fca","other":"efeae3b7f610dc10acc51068e7718876d147cd78a9a28788c5dba5bb3a6950dc","up":true},{"one":"e775e9759d4701bd9b43c22f1d1be73c1262b2752bb23cb3857485daf1dcad2d","other":"e54784cfbcd89c37c8f758aae70ece3ab4b7f8c30fb4ef7543e04aa89ff4386b","up":true},{"one":"ff36a8810dd44f6d1fa42aa91ff6206bcfb4c1ffbab0df73a181daece329e0e3","other":"f925c85e6457ac01f0cd6b297155f9d3ae611603890d8f3a45e1396d937f8680","up":true},{"one":"4a8b610e09d35aa21c42ab8c3e38de600a944c094e6b86ea56828b5e6904f1f7","other":"4bcf4eb531d5ec4b31d99e8354af03f976524c7858a1e7043e9b7055326f0952","up":true},{"one":"c43fbee95380007274b8f231fe34bcd59b5c0ef0830b174967d4702627984fc6","other":"c49caff13862dc089f1f9b8180d6efa455648375662719272102c4f8028799d6","up":true},{"one":"0438f567045d4556a0e7a697028d689ecfd0ae20f9e85c09b48d9f1fd0ee4765","other":"0d8a919207fb2d5718eab7da95f8efeb01a4e1ae39602d315f8ba2ff1752d9da","up":true},{"one":"6251e9540448726a601699ef4cd19e50c969a746da27228967338cdc09d628bf","other":"44a10530c376b215baff8531eeb2afb8d6714c4d0350d1a6f32761a97cd6c7ec","up":true},{"one":"e8548b5df15adf0f2a997ff5709827beb5e1d36bb08a2f2d017746d5c0e83fca","other":"ee5e77df690329c132f2f7fca223cfd384b7bc34ec38763a4eb42780e0585656","up":true},{"one":"f2d5533eed4b0c184952d859d67e44abe5a75a5de6111c8c106b8f4b2d8ccfc4","other":"f31cc744ea921fee8364c5269b1ce7ec6b5f0c0cbb6885efbf602de5b36f6169","up":true},{"one":"5f00b3bebef2f5484ff1386298add68a6743a106200ae8a13a27dbb52714ee8f","other":"47bfa3767cefcc0831d410d5402e9396e8a412c8c96faf55b451d3ff310f3b02","up":true},{"one":"7a608d2cf9d1d9c5819dc1f9e88e5cb2852aadea01c40e047c2e184b62e7163c","other":"7920d69cf7e458fce0781ea1a4e07768e1a69f6818090eff0abf0b4a0c2c35f8","up":true},{"one":"6e68ea86440706a0d73a9508f2247492543163f8fa7e2dc2aa62b74d50261b8b","other":"6f2d756566dd5b4a13ffeea9f687c785148f3407a502e28b9d6edfd03b905fdc","up":true},{"one":"154be9255e9aebd134a914070f5e6f3d4bba079d9ca738b74244db14e1b586dd","other":"140020a23a840b8840ba0c2c384f853a606330e9743885e9967cf49533db282e","up":true},{"one":"4636f00be60a9b494a3ebc9ab41cc7cb53ec0b0beff214db2d0a248dc3aeb6af","other":"4646fe4c119078738612b44a356089b3c73a08e11cfd910675d211ae6b20b8fd","up":true},{"one":"fbc8087a723c564ca0139329902e79748af46699ea7be24d57909a7e8e96f681","other":"f4e09f89287bd1af7833acd85ba7cc71fdb3ff34f2f409e1cf2a878dcd3183dc","up":true},{"one":"6fe9a02e950a5c3a5ff026b75922ed687d59795ba8eb9c092a8d09a5c64d2453","other":"6ecb5c36fc0150c287446ae8a8682d629a1d39341230717206219babe3bdf659","up":true},{"one":"17040a3aad5930d8e0de1011fd2996b7d09225989f0dc1ae8f7e7a52dd26ab4e","other":"140020a23a840b8840ba0c2c384f853a606330e9743885e9967cf49533db282e","up":true},{"one":"256e81c5a6fb43bd343345477f8f96aa1947f07ac3297f631ab03f060147b062","other":"21a044e772b7c955fe4a6fb7c3a9a20e95d48b7fd6b9518741782f04f5f1f5c2","up":true},{"one":"88fefb7506105c0e269baf52955a01b19f55504b13133bac0beab41c9f6e6942","other":"96fcf14c7f90350091ac6fcb58306ccfb9e4a38d3da59f8ab656854332844cbd","up":true},{"one":"1e2aca93fa9442a0034ae8d295530dde16fcbfa8c37227e2e6863babb0f87c34","other":"140020a23a840b8840ba0c2c384f853a606330e9743885e9967cf49533db282e","up":true},{"one":"e8548b5df15adf0f2a997ff5709827beb5e1d36bb08a2f2d017746d5c0e83fca","other":"ed2d3e1e5693b44494808907c98ec54d6d08331945d2a2c03e31130fef1d2586","up":true},{"one":"f5dc78ff71a63fc2014b9553723ee676c63fc078a32a46b7cb172f357a118140","other":"c786ff8667f509b5a9519984c1d95c83a5d2e257500a71429e8f23af610ce771","up":true},{"one":"582330d8b8c49331b2aec790dc7325b9cd483fc8129323d31ec429d545042964","other":"574f65867482091aee2774033116c233525eea711706b5ae9ba09b54e896d302","up":true},{"one":"314a3530a5e0c37d5609149b3ae9c2e078573346bd8fce3c769ebaeb31726ec1","other":"39d1fcae2d23c775214988251505c577b9ac7b6851558ddf9a437dfe143f3845","up":true},{"one":"6c73150490e8be9677c40086de0aefed1939581048e26f4a93f5ca26571a1a8f","other":"60d7337ef806be95ccaf7b9d663a4289f9afc68edced62904ab50601cf113f45","up":true},{"one":"ff36a8810dd44f6d1fa42aa91ff6206bcfb4c1ffbab0df73a181daece329e0e3","other":"fbc8087a723c564ca0139329902e79748af46699ea7be24d57909a7e8e96f681","up":true},{"one":"006727dc6f59b120b24c17b8e63f80ef3439105f8118ffeed408f105a48ee60c","other":"00c6488a842ece7a8b0daf064e405de03a4257d308840ea52bfd48d23f54d895","up":true},{"one":"6c73150490e8be9677c40086de0aefed1939581048e26f4a93f5ca26571a1a8f","other":"6c4dcdfdee0164a9a3f419430726dd51f9198c65ff6e7de7aaa6f632dcde6794","up":true},{"one":"ef1b70bf090bc9994b1d45e2812c56ecb430a89c346a436bd10880bcda700351","other":"f27f1044777e05f3f60165d0d2fc3e7667fe148e0ca7a097805d60b9f61025f7","up":true},{"one":"534bcaa98cf9192b35b6014c650ae067e74332c015ebb516d63601427d7376b8","other":"512ec5c2e6b4d788482462d941117c81fcc0e73f0c15545794dd1b4e03bf2102","up":true},{"one":"eb98fb45dd5754f24f9df0c9ecbb93932e3d9d7735cd6d0ddd4a8675bb4ef554","other":"ed2d3e1e5693b44494808907c98ec54d6d08331945d2a2c03e31130fef1d2586","up":true},{"one":"ff36a8810dd44f6d1fa42aa91ff6206bcfb4c1ffbab0df73a181daece329e0e3","other":"f5b24a1fd2cd2908b408562f9a265ee1a692b137e770137afa5fdfa07b237221","up":true},{"one":"f45f1f2e59e947e04fa15bcf87f872ef6d73b73f778e12d1f9b8930ea166eefc","other":"fbc8087a723c564ca0139329902e79748af46699ea7be24d57909a7e8e96f681","up":true},{"one":"0ff2d2c49547eebc96675e0b88073dea5e9091bee1843ffe567127e34486c348","other":"0c28cd1315890629896d0fe5517524d4eb788f7444709c135ea690ba4e6103d5","up":true},{"one":"a46dd535e3bc8f111a8b2ce5594b62e87741c395e8a2b8fbae33edd29cb8caf8","other":"a6fbe16b81d240ff2f2ed6c93cfd9590731dfb2e7ec3fce1c098fe542bedf299","up":true},{"one":"3b88a472beba4a18f8df45678888fd359bac3823900eecfe0037fdc9ad54d416","other":"30bec7cd0a7d002839aed7654129bd2fe2e2ce7f42aa7bae1560e8bf718954c3","up":true},{"one":"976e57d0c32227222bfd0cbb802f269bdcd52d5d33cf689c66b12c023f5fa8bf","other":"898d2f7d46b4961b646d5a6142d54d6233b7f80f668ce234522dd02e2cc545cb","up":true},{"one":"6e68ea86440706a0d73a9508f2247492543163f8fa7e2dc2aa62b74d50261b8b","other":"6f5f5a77e6092e25e5308413e02ba62c1c559024893a7fb98e26b0f34fed8bfe","up":true},{"one":"a46dd535e3bc8f111a8b2ce5594b62e87741c395e8a2b8fbae33edd29cb8caf8","other":"ad9899f78659492ec248a884927a757f3f3b4e76cd2abc46ad8766251fd8afed","up":true},{"one":"baddc778aea97acdbbb5bc99744a5545abab9f6047c81f328761645287ac391c","other":"b626d472b555e6f950a7142783db8deb443a74e63ef6bd72a87eaf1af14ca805","up":true},{"one":"4a8b610e09d35aa21c42ab8c3e38de600a944c094e6b86ea56828b5e6904f1f7","other":"4d6b939fb67338c484948ab92b2ceea4d4b666d7e08773673cd7c8f83f495b89","up":true},{"one":"217f9952af1eb58d5ca5ac7be763716cfe2c0a4f3cdd4ebe4b5df563f919e2d2","other":"29957e8e92925a8c79bdf513295d96bfb62fbfc597ee1cf767c7ef408f1b1295","up":true},{"one":"0de3915b0bcc68040c8aa76fbd2cfa0714e9b34c9dbe0838a7cba81c4f73581c","other":"0cf596af91eb9b041fe6dbe6b288c5730413850321b5ab176c81447e34ef79c5","up":true},{"one":"e8830f2b2f7d08df15bd33f4b2841d01d9d62c1621234bd6ae86743e52360f3e","other":"e8efe8016fe6cf649b2755bee22da35ccc6c9c55d404d5385d61f6ea27b84380","up":true},{"one":"d640472351969a5578e541aca72b7640c583b995fd62607ff3ee3f3f3139aafd","other":"c9f5acafbbf8c66647de05b0848d79451eee490709d53f118fc2051410cc8203","up":true},{"one":"baf219e9229921b773d1ad7eb7eb5216cfa60ccecaa3c5c487e3b71cb600ba12","other":"bcc6724e54f761361f85147eb102a8d1a1a38810a940ce76b1e361ddcadacaa3","up":true},{"one":"11d43f6ed0ddd5afa5c8a7abf7c62a4fa865b7a25ee295bf1a49701ef3081363","other":"179f21d2e0421b8056ee9a260bc0985bfa64a52a36d0a8fbce4e03f3120d1d65","up":true},{"one":"6ea51fb6e4783f351dbbfa47b508c78c73233ebaada409dfb55446217f92c4bd","other":"6fe9a02e950a5c3a5ff026b75922ed687d59795ba8eb9c092a8d09a5c64d2453","up":true},{"one":"66e7fc2df51f5df8d7329851fe9357d895e9d5dfdc25f8d92bdb10a960f7e15a","other":"67aa5463e4b32b363b3d01d2a41ccb03199411057276f4962d053160be29a6ef","up":true},{"one":"db6a1f6b342f6be9517f8df01003797c11c837d9aee3cdba5b7859230b36c35d","other":"df1e4e46e8ec26cad74b4f35ab070f12c8f6fddca35ac44c1218ff60fe1e6bab","up":true},{"one":"04518d7120fa8a528d983ca1ee6d5d09ba24a4e853fb22bc9084cdf34995e95f","other":"045ba8da4641da3f0b8058bb0d9d8aafbb81496dc1cae2a3fd9c039a7e1cafb6","up":true},{"one":"4646fe4c119078738612b44a356089b3c73a08e11cfd910675d211ae6b20b8fd","other":"4c9eab8ab45405a6d4bab46430efc04b8e6aec1d944f88435eca41361925f379","up":true},{"one":"9d0f804849b72397646ba48208ba1e01dcf4de04e788016c4a1a0c93e650ddf5","other":"8f2182c2c2d0eeb2e887dbc350ae7257819f536032851ffdf29e7842cb1a62cc","up":true},{"one":"8025c1fcb98e53f92767d1d43a3057a0acd1e8994bb4a7e3f5e244110e0dcf91","other":"850575577d6b420a87aba388af481e0c044c2f75cf29ff934daf5674318a61ba","up":true},{"one":"1f670c53b4c597beaffacd84e3a697225b04cded9219d0a28e1fe525a3cadcf5","other":"11d43f6ed0ddd5afa5c8a7abf7c62a4fa865b7a25ee295bf1a49701ef3081363","up":true},{"one":"1f85b8c05e5dceff0bd8256f8f6d80d4b902a9754ceb952d95ea2e1150ef9e59","other":"19faaf891eb6a716902ec29d201dc2094ee474acff188ae86faf9760674b2d37","up":true},{"one":"f925c85e6457ac01f0cd6b297155f9d3ae611603890d8f3a45e1396d937f8680","other":"c786ff8667f509b5a9519984c1d95c83a5d2e257500a71429e8f23af610ce771","up":true},{"one":"5f00b3bebef2f5484ff1386298add68a6743a106200ae8a13a27dbb52714ee8f","other":"77d2ec52dabd5d7f326d4c6afd2aad110487c6bdffa2984060528716ba873462","up":true},{"one":"314a3530a5e0c37d5609149b3ae9c2e078573346bd8fce3c769ebaeb31726ec1","other":"30bec7cd0a7d002839aed7654129bd2fe2e2ce7f42aa7bae1560e8bf718954c3","up":true},{"one":"1f670c53b4c597beaffacd84e3a697225b04cded9219d0a28e1fe525a3cadcf5","other":"154be9255e9aebd134a914070f5e6f3d4bba079d9ca738b74244db14e1b586dd","up":true},{"one":"7a608d2cf9d1d9c5819dc1f9e88e5cb2852aadea01c40e047c2e184b62e7163c","other":"7dd3078c71087ab88d4d26a962820bcb79b8ce30e91c1f9a69d4bf8d38086960","up":true},{"one":"4bcf4eb531d5ec4b31d99e8354af03f976524c7858a1e7043e9b7055326f0952","other":"41092c852fac630df2a9ca0862716f8e9fb8566c904a49c96389071046bc699d","up":true},{"one":"03285e06657032778feff0b43828c964dbf9de669f63171aeb587aa1a1facc0a","other":"02d85b9f8e4776224ae5088683a87837b82b2bfb7e047cf373a28393e7aca6e1","up":true},{"one":"f45f1f2e59e947e04fa15bcf87f872ef6d73b73f778e12d1f9b8930ea166eefc","other":"d1d719ce1dca507598449afe966396c160ad25ad632112ab268b1d913b490dbd","up":true},{"one":"915d7a0510bad19266eef8f00ca0cb2efc340253775706495fca8b9160b512cc","other":"96fcf14c7f90350091ac6fcb58306ccfb9e4a38d3da59f8ab656854332844cbd","up":true},{"one":"c9f5acafbbf8c66647de05b0848d79451eee490709d53f118fc2051410cc8203","other":"caf6a8e37fd41c1e6ad77a8575cd90354bb1693893952301c9caeb4779c338d3","up":true},{"one":"628e7da3359ed6d9dcfbafc7581966e4e09245c321ec78ca75587c9cbb44697f","other":"67aa5463e4b32b363b3d01d2a41ccb03199411057276f4962d053160be29a6ef","up":true},{"one":"b820e480354000c837b1781ec1c493e8776b4834252e6453425ac05b925b5a58","other":"ba884e5cfa1ee6eb38217181711e01bb0c37b3e33d1424dfa89ed3e29ef6205b","up":true},{"one":"f7baef876a62b92ebe5ca9ec6a085e0eb54fd31e2425e662eec747df3cd77592","other":"f27f1044777e05f3f60165d0d2fc3e7667fe148e0ca7a097805d60b9f61025f7","up":true},{"one":"6c4dcdfdee0164a9a3f419430726dd51f9198c65ff6e7de7aaa6f632dcde6794","other":"60d7337ef806be95ccaf7b9d663a4289f9afc68edced62904ab50601cf113f45","up":true},{"one":"1f670c53b4c597beaffacd84e3a697225b04cded9219d0a28e1fe525a3cadcf5","other":"1b830ed484b274a96ec7ba2f9a42b6859412b5334a564014ff3f11597ea3a32d","up":true},{"one":"9fa0215e980dc907df4cc47ab4937f36527d78f9837493016fd4fc51e617299c","other":"90a85cb7363ede161ec21cc89f8b9d4350e566cf10586a66d31b0a8677620aa1","up":true},{"one":"628e7da3359ed6d9dcfbafc7581966e4e09245c321ec78ca75587c9cbb44697f","other":"610334a0772d3414652b575f2caa6f2db32224907c24d06fda643db9f2ec2afe","up":true},{"one":"512ec5c2e6b4d788482462d941117c81fcc0e73f0c15545794dd1b4e03bf2102","other":"524db81b135af8dc309b942c082a7291dddb851866fc608753f937ee77015be0","up":true},{"one":"33737df75bbac1b41c63f05ea2cf1523b972df17f22bda026db84a49ac35e1e3","other":"37801e8d7d46143f78924ed66099f658a94d37edfd2f58d02acb85add03e1894","up":true},{"one":"82dd83838cb982b89505ef249d353a20e434346dd78b71cd9b809f71d5c112da","other":"8025c1fcb98e53f92767d1d43a3057a0acd1e8994bb4a7e3f5e244110e0dcf91","up":true},{"one":"179f21d2e0421b8056ee9a260bc0985bfa64a52a36d0a8fbce4e03f3120d1d65","other":"13d6cb9316e289923e2d1de7f3c966d0cbabce3acdb8017122944f4abb140912","up":true},{"one":"0cf596af91eb9b041fe6dbe6b288c5730413850321b5ab176c81447e34ef79c5","other":"0e5e0bb1383b2ec569b157a1d2ae6900592ab892a28367f5613a4e29cb265088","up":true},{"one":"e7fa7112adc7b023dd5965e620277122542153f87eaf5deeacc8a51f1778ba77","other":"e5ada0415c92ef1511b15d04edf395976464afd9adc3e929c41d4d21d25e3182","up":true},{"one":"04518d7120fa8a528d983ca1ee6d5d09ba24a4e853fb22bc9084cdf34995e95f","other":"02d85b9f8e4776224ae5088683a87837b82b2bfb7e047cf373a28393e7aca6e1","up":true},{"one":"53087084708cc5ee63ac459b18fa10ae52a823139b4ecba6c8691d4934f2f971","other":"582330d8b8c49331b2aec790dc7325b9cd483fc8129323d31ec429d545042964","up":true},{"one":"8025c1fcb98e53f92767d1d43a3057a0acd1e8994bb4a7e3f5e244110e0dcf91","other":"886aff1f1e3b86bfe901066bb7948451c18fe3f8cd1b7318b05154890ca8f738","up":true},{"one":"b89793c3ccd9ea642080728732ce7df33778653fed3d1d8f3a25e60670e33325","other":"b911b8e2d72532b7c66ff5f7bffa70f5ddbeea6903a86f9333399f0c4b5f0fe8","up":true},{"one":"f31cc744ea921fee8364c5269b1ce7ec6b5f0c0cbb6885efbf602de5b36f6169","other":"f925c85e6457ac01f0cd6b297155f9d3ae611603890d8f3a45e1396d937f8680","up":true},{"one":"17040a3aad5930d8e0de1011fd2996b7d09225989f0dc1ae8f7e7a52dd26ab4e","other":"154be9255e9aebd134a914070f5e6f3d4bba079d9ca738b74244db14e1b586dd","up":true},{"one":"0438f567045d4556a0e7a697028d689ecfd0ae20f9e85c09b48d9f1fd0ee4765","other":"00c6488a842ece7a8b0daf064e405de03a4257d308840ea52bfd48d23f54d895","up":true},{"one":"17040a3aad5930d8e0de1011fd2996b7d09225989f0dc1ae8f7e7a52dd26ab4e","other":"17db15893bf39b42593ee1de975aba6832046d9da5b4b493ec44272738a29cef","up":true},{"one":"66e7fc2df51f5df8d7329851fe9357d895e9d5dfdc25f8d92bdb10a960f7e15a","other":"60d7337ef806be95ccaf7b9d663a4289f9afc68edced62904ab50601cf113f45","up":true},{"one":"6c4dcdfdee0164a9a3f419430726dd51f9198c65ff6e7de7aaa6f632dcde6794","other":"6fe9a02e950a5c3a5ff026b75922ed687d59795ba8eb9c092a8d09a5c64d2453","up":true},{"one":"03ccd8d52597d18c0b178ab7361d847d63aad3af920a28345977ae170a1dafcd","other":"02d85b9f8e4776224ae5088683a87837b82b2bfb7e047cf373a28393e7aca6e1","up":true},{"one":"3ec530761ddb87f930fda919be67df18074c6f0795292add1b2a91ff3d9c39e3","other":"30bec7cd0a7d002839aed7654129bd2fe2e2ce7f42aa7bae1560e8bf718954c3","up":true},{"one":"a653302730df3d58f796906a93933aa81494f2588d9485ab7676ec3b0ccbb426","other":"a6fbe16b81d240ff2f2ed6c93cfd9590731dfb2e7ec3fce1c098fe542bedf299","up":true},{"one":"045ba8da4641da3f0b8058bb0d9d8aafbb81496dc1cae2a3fd9c039a7e1cafb6","other":"02d85b9f8e4776224ae5088683a87837b82b2bfb7e047cf373a28393e7aca6e1","up":true},{"one":"1f670c53b4c597beaffacd84e3a697225b04cded9219d0a28e1fe525a3cadcf5","other":"14dfb8414d17b2df15eaf59571a8cfec99b1fd674561da63ee99af853bda07da","up":true},{"one":"b626d472b555e6f950a7142783db8deb443a74e63ef6bd72a87eaf1af14ca805","other":"b02b01a5c37cb05c287a3dc7d04e305de26f8d62dc388542eeb43e97db7b4282","up":true},{"one":"3630e05326bacea8fcc739dec42085f845f416ddc698c76ff91f099eb1dc5007","other":"37801e8d7d46143f78924ed66099f658a94d37edfd2f58d02acb85add03e1894","up":true},{"one":"b911b8e2d72532b7c66ff5f7bffa70f5ddbeea6903a86f9333399f0c4b5f0fe8","other":"b95d88ff6512ef8eaaa6bd842fa44175c1484fc2e8601b83d50a5ffa992bfa3a","up":true},{"one":"30897492824b19540d13ef17c70845be6dde455dca4e4f84cfca14a2c373969f","other":"30bec7cd0a7d002839aed7654129bd2fe2e2ce7f42aa7bae1560e8bf718954c3","up":true},{"one":"e8548b5df15adf0f2a997ff5709827beb5e1d36bb08a2f2d017746d5c0e83fca","other":"e8efe8016fe6cf649b2755bee22da35ccc6c9c55d404d5385d61f6ea27b84380","up":true},{"one":"6ecb5c36fc0150c287446ae8a8682d629a1d39341230717206219babe3bdf659","other":"6f2d756566dd5b4a13ffeea9f687c785148f3407a502e28b9d6edfd03b905fdc","up":true},{"one":"c8986871e46f001d15ed8b70f2aa0fea8ae309d5e5671a500f619e3b348c8c15","other":"caf6a8e37fd41c1e6ad77a8575cd90354bb1693893952301c9caeb4779c338d3","up":true},{"one":"ef1b70bf090bc9994b1d45e2812c56ecb430a89c346a436bd10880bcda700351","other":"e8efe8016fe6cf649b2755bee22da35ccc6c9c55d404d5385d61f6ea27b84380","up":true},{"one":"35e6b1d31f594c06b759525434a7e717ebe6f27ca0188f247ed1247664a50563","other":"37801e8d7d46143f78924ed66099f658a94d37edfd2f58d02acb85add03e1894","up":true},{"one":"35e6b1d31f594c06b759525434a7e717ebe6f27ca0188f247ed1247664a50563","other":"314a3530a5e0c37d5609149b3ae9c2e078573346bd8fce3c769ebaeb31726ec1","up":true},{"one":"e7fa7112adc7b023dd5965e620277122542153f87eaf5deeacc8a51f1778ba77","other":"e5d794d64003725a74642f097c0ee76706d78419b6f3ea819d440bc0ad166eac","up":true},{"one":"30897492824b19540d13ef17c70845be6dde455dca4e4f84cfca14a2c373969f","other":"33b5c521b4208e26414db2e05c9a8ccc001a524d928579d44d2e74d14a56593e","up":true},{"one":"fe316679eca0e0eb823325812a56fd27da02653b06ada2fd03b27501bda8371a","other":"f528aaafd67b20dafdce101db224aa01c70f93bdc91c14f50fa8db1dbf9fc386","up":true},{"one":"60d7337ef806be95ccaf7b9d663a4289f9afc68edced62904ab50601cf113f45","other":"6251e9540448726a601699ef4cd19e50c969a746da27228967338cdc09d628bf","up":true},{"one":"c786ff8667f509b5a9519984c1d95c83a5d2e257500a71429e8f23af610ce771","other":"f4e09f89287bd1af7833acd85ba7cc71fdb3ff34f2f409e1cf2a878dcd3183dc","up":true},{"one":"ff36a8810dd44f6d1fa42aa91ff6206bcfb4c1ffbab0df73a181daece329e0e3","other":"f5dc78ff71a63fc2014b9553723ee676c63fc078a32a46b7cb172f357a118140","up":true},{"one":"461cc9f064e6f4f06ff38e0d1f3f00ef8807ba31c7258e453cc682e9551bb1c6","other":"444722a15b01a0d8e6794798d239fe621d59bdfc08823ab47cbd8b9acebd23b4","up":true},{"one":"f5dc78ff71a63fc2014b9553723ee676c63fc078a32a46b7cb172f357a118140","other":"f629b8b9e79c75ac559daf9bf4fc8672bfdd595cf2c5d17a8885282626fc65a5","up":true},{"one":"6e68ea86440706a0d73a9508f2247492543163f8fa7e2dc2aa62b74d50261b8b","other":"610334a0772d3414652b575f2caa6f2db32224907c24d06fda643db9f2ec2afe","up":true},{"one":"f528aaafd67b20dafdce101db224aa01c70f93bdc91c14f50fa8db1dbf9fc386","other":"f45f1f2e59e947e04fa15bcf87f872ef6d73b73f778e12d1f9b8930ea166eefc","up":true},{"one":"3b88a472beba4a18f8df45678888fd359bac3823900eecfe0037fdc9ad54d416","other":"3f946957d910179c7e1a83c44369aacfc31f5727b1a6421a01c8a978ccd349a2","up":true},{"one":"ca041da0dc514643d017458d08ff6962ec52c9e66571a239ec395dc8b2546709","other":"c1f9e8e1d509febdf1f267bb227741e513420048a2e669ac9eef4b05a29cf10b","up":true},{"one":"c43fbee95380007274b8f231fe34bcd59b5c0ef0830b174967d4702627984fc6","other":"c441d27a5f4abaa8e3b0f040a6ef85bb8c970031d6a57503a674e36b3d6915d9","up":true},{"one":"19faaf891eb6a716902ec29d201dc2094ee474acff188ae86faf9760674b2d37","other":"140020a23a840b8840ba0c2c384f853a606330e9743885e9967cf49533db282e","up":true},{"one":"14dfb8414d17b2df15eaf59571a8cfec99b1fd674561da63ee99af853bda07da","other":"17db15893bf39b42593ee1de975aba6832046d9da5b4b493ec44272738a29cef","up":true},{"one":"03285e06657032778feff0b43828c964dbf9de669f63171aeb587aa1a1facc0a","other":"0438f567045d4556a0e7a697028d689ecfd0ae20f9e85c09b48d9f1fd0ee4765","up":true},{"one":"daec45eca40f48843b41f70267c07e94996ced829f02710f15354fbe26e177e7","other":"d863ba7405eb07ccddbf1d34efbcbec2867a93a109ed9413d9aecf30d3645a6a","up":true},{"one":"daec45eca40f48843b41f70267c07e94996ced829f02710f15354fbe26e177e7","other":"d1d719ce1dca507598449afe966396c160ad25ad632112ab268b1d913b490dbd","up":true},{"one":"7a608d2cf9d1d9c5819dc1f9e88e5cb2852aadea01c40e047c2e184b62e7163c","other":"610334a0772d3414652b575f2caa6f2db32224907c24d06fda643db9f2ec2afe","up":true},{"one":"e5149cedd990072f2aaa9735a9259f28973c45876660c2d86ac105e56cca8e68","other":"e54b643cbc95d9f5d27ec3760d892b6802981bfabf4f9979267d66259df982c7","up":true},{"one":"3f946957d910179c7e1a83c44369aacfc31f5727b1a6421a01c8a978ccd349a2","other":"37801e8d7d46143f78924ed66099f658a94d37edfd2f58d02acb85add03e1894","up":true},{"one":"314a3530a5e0c37d5609149b3ae9c2e078573346bd8fce3c769ebaeb31726ec1","other":"3b78bc987c7c31c94e8ada9b4b11b5db9387fe70dd01ce7f3e976d3bec433dec","up":true},{"one":"0b72054403f78a64a787f46e9f26bf0de7bbba5a60cb105e6aeea46cb4a1d9fe","other":"0cf596af91eb9b041fe6dbe6b288c5730413850321b5ab176c81447e34ef79c5","up":true},{"one":"7a608d2cf9d1d9c5819dc1f9e88e5cb2852aadea01c40e047c2e184b62e7163c","other":"7dc2a9573f253f362ef1b21bbfcc144b11a6febc58aa3c4430224160e9fa738c","up":true},{"one":"3ec530761ddb87f930fda919be67df18074c6f0795292add1b2a91ff3d9c39e3","other":"3b78bc987c7c31c94e8ada9b4b11b5db9387fe70dd01ce7f3e976d3bec433dec","up":true},{"one":"46fee69dad8b6a6a87d356d10db25d835a0c4e154bf179e88fb4cc65f97d72d7","other":"41d9c03e44bec3f84a6139ce40ef1e390530f38ed11860575acfad03a49db095","up":true},{"one":"9852ce267d53106a6e584d6eddb08e0062eb4a422d2a8d39ad6dccaebac552ff","other":"96fcf14c7f90350091ac6fcb58306ccfb9e4a38d3da59f8ab656854332844cbd","up":true},{"one":"512ec5c2e6b4d788482462d941117c81fcc0e73f0c15545794dd1b4e03bf2102","other":"51db114a52827f5b74088bd0fc87d35229e7740e7d121bd7699298396516a880","up":true},{"one":"d887070a0568282c69e96ce65612ba72d5ea26b5c80671435d6e1ed2c4b49301","other":"d863ba7405eb07ccddbf1d34efbcbec2867a93a109ed9413d9aecf30d3645a6a","up":true},{"one":"1f85b8c05e5dceff0bd8256f8f6d80d4b902a9754ceb952d95ea2e1150ef9e59","other":"1f670c53b4c597beaffacd84e3a697225b04cded9219d0a28e1fe525a3cadcf5","up":true},{"one":"bcc6724e54f761361f85147eb102a8d1a1a38810a940ce76b1e361ddcadacaa3","other":"b95d88ff6512ef8eaaa6bd842fa44175c1484fc2e8601b83d50a5ffa992bfa3a","up":true},{"one":"256e81c5a6fb43bd343345477f8f96aa1947f07ac3297f631ab03f060147b062","other":"21012a3a6ef1ece48fd9d7cffe62dc75839dd062efcf3ac5f962c237814da407","up":true},{"one":"baf219e9229921b773d1ad7eb7eb5216cfa60ccecaa3c5c487e3b71cb600ba12","other":"b911b8e2d72532b7c66ff5f7bffa70f5ddbeea6903a86f9333399f0c4b5f0fe8","up":true},{"one":"af02b5d107b3a17f539c7f9020ebe74322434634e70c420a7f56776eb5d9db73","other":"ad9899f78659492ec248a884927a757f3f3b4e76cd2abc46ad8766251fd8afed","up":true},{"one":"256e81c5a6fb43bd343345477f8f96aa1947f07ac3297f631ab03f060147b062","other":"217f9952af1eb58d5ca5ac7be763716cfe2c0a4f3cdd4ebe4b5df563f919e2d2","up":true},{"one":"c59e3953b64e5b9ffbe53990a358914f2fa8e3551d33f92b9e3a441bd1baf2cd","other":"c1f9e8e1d509febdf1f267bb227741e513420048a2e669ac9eef4b05a29cf10b","up":true},{"one":"610334a0772d3414652b575f2caa6f2db32224907c24d06fda643db9f2ec2afe","other":"7125e05bf1bfe6df948c9276b62bc755fc6b0ec8d4ac7724b61ea49591adcf25","up":true},{"one":"63370e288ab2e4b8403c6678e9c44ae5c7496b5ead614306fceb85986ed29d18","other":"605a46991af15cd60e67413c712b99ff8f21173c96a7990f2728ad6cac2bb9d8","up":true},{"one":"11d43f6ed0ddd5afa5c8a7abf7c62a4fa865b7a25ee295bf1a49701ef3081363","other":"1436aaa8770e9f1c6294e49f4066c16b1caa50524e9b8fd058059e41657d2a83","up":true},{"one":"18f6e66e1cc8e620808901b571fdf525ee8f41850fac0bd0e5c5a4de70c5f873","other":"19faaf891eb6a716902ec29d201dc2094ee474acff188ae86faf9760674b2d37","up":true},{"one":"53a885968d68d8ebf7ed514e662cc13fa03186d2361000a03576531fdca2a25f","other":"524db81b135af8dc309b942c082a7291dddb851866fc608753f937ee77015be0","up":true},{"one":"1f670c53b4c597beaffacd84e3a697225b04cded9219d0a28e1fe525a3cadcf5","other":"1c9caf028df31681b1457a54d4b3ab20009f9fa5bd12417a1ba7efe0c660e6bd","up":true},{"one":"898d2f7d46b4961b646d5a6142d54d6233b7f80f668ce234522dd02e2cc545cb","other":"82f9c9009f09de2d6a77b54976d14c14211eae65d886f6ed57560c700716dd5c","up":true},{"one":"b89793c3ccd9ea642080728732ce7df33778653fed3d1d8f3a25e60670e33325","other":"a3693801a91180410cf3e85d7c09ac8054a769e7b1d55c9e7a46850cb8217da0","up":true},{"one":"19faaf891eb6a716902ec29d201dc2094ee474acff188ae86faf9760674b2d37","other":"1b830ed484b274a96ec7ba2f9a42b6859412b5334a564014ff3f11597ea3a32d","up":true},{"one":"53087084708cc5ee63ac459b18fa10ae52a823139b4ecba6c8691d4934f2f971","other":"524db81b135af8dc309b942c082a7291dddb851866fc608753f937ee77015be0","up":true},{"one":"0743bcf2aaa77e916f4a367d6159473c7d80f46a2e4cbe9ef346e423d39d7072","other":"07a8c900fec6c477580ed5b38848a8681dc52a19e59fa4cd32f571fe7fb2383a","up":true},{"one":"44a10530c376b215baff8531eeb2afb8d6714c4d0350d1a6f32761a97cd6c7ec","other":"41d9c03e44bec3f84a6139ce40ef1e390530f38ed11860575acfad03a49db095","up":true},{"one":"4636f00be60a9b494a3ebc9ab41cc7cb53ec0b0beff214db2d0a248dc3aeb6af","other":"41092c852fac630df2a9ca0862716f8e9fb8566c904a49c96389071046bc699d","up":true},{"one":"88a141c607019477c7b120a506285a7218cad2faa038082e0b9ddfcc9cb78d07","other":"898d2f7d46b4961b646d5a6142d54d6233b7f80f668ce234522dd02e2cc545cb","up":true},{"one":"82dd83838cb982b89505ef249d353a20e434346dd78b71cd9b809f71d5c112da","other":"886aff1f1e3b86bfe901066bb7948451c18fe3f8cd1b7318b05154890ca8f738","up":true},{"one":"7b90e939ae2a240f0d74a923afb6bbf11f6d5b99a7bf85f1825b1ea36bce744c","other":"7dd3078c71087ab88d4d26a962820bcb79b8ce30e91c1f9a69d4bf8d38086960","up":true},{"one":"fe2167fd33f383110eb3f6caa7bd905ca54fa0c810f1b8a34483a846f3cbddab","other":"f45f1f2e59e947e04fa15bcf87f872ef6d73b73f778e12d1f9b8930ea166eefc","up":true},{"one":"51db114a52827f5b74088bd0fc87d35229e7740e7d121bd7699298396516a880","other":"524db81b135af8dc309b942c082a7291dddb851866fc608753f937ee77015be0","up":true},{"one":"610334a0772d3414652b575f2caa6f2db32224907c24d06fda643db9f2ec2afe","other":"6fe9a02e950a5c3a5ff026b75922ed687d59795ba8eb9c092a8d09a5c64d2453","up":true},{"one":"4ac755123dcc64ef44db9280311af51f3f7a93e0dee67370d673261220356eb9","other":"4d6b939fb67338c484948ab92b2ceea4d4b666d7e08773673cd7c8f83f495b89","up":true},{"one":"53fe2c13926507a7a6c27d0fb30a2c358c4c7bfa40df8b5fa8ec8986c2450519","other":"574f65867482091aee2774033116c233525eea711706b5ae9ba09b54e896d302","up":true},{"one":"b626d472b555e6f950a7142783db8deb443a74e63ef6bd72a87eaf1af14ca805","other":"b95d88ff6512ef8eaaa6bd842fa44175c1484fc2e8601b83d50a5ffa992bfa3a","up":true},{"one":"60d7337ef806be95ccaf7b9d663a4289f9afc68edced62904ab50601cf113f45","other":"605a46991af15cd60e67413c712b99ff8f21173c96a7990f2728ad6cac2bb9d8","up":true},{"one":"0c64e5af869b1665fd4016ae6d04c8eedd423636f06d78ecb944ee8e3272a82a","other":"0d8a919207fb2d5718eab7da95f8efeb01a4e1ae39602d315f8ba2ff1752d9da","up":true},{"one":"849bcbb9be43b799fefc5e689efc75125da27f536e97e5b7921031520ae6e5d8","other":"88fefb7506105c0e269baf52955a01b19f55504b13133bac0beab41c9f6e6942","up":true},{"one":"5b632eaf700d173ff15f4727b85817e6173228c304b422434a08c2cad438b825","other":"5cd2377226825dc7ea582315cd108d23502df4e9c7c09fc07e7b4aa56440de29","up":true},{"one":"1436aaa8770e9f1c6294e49f4066c16b1caa50524e9b8fd058059e41657d2a83","other":"13d6cb9316e289923e2d1de7f3c966d0cbabce3acdb8017122944f4abb140912","up":true},{"one":"cc2037c08942a094df12f45831f28e0015fc3ac04d5b8f24ffea9bf3a0b02c39","other":"caf6a8e37fd41c1e6ad77a8575cd90354bb1693893952301c9caeb4779c338d3","up":true},{"one":"33b5c521b4208e26414db2e05c9a8ccc001a524d928579d44d2e74d14a56593e","other":"378e7af7cc019186d4f2699e753e2d71302f8f3565572c13b7a1b1c5cb47443c","up":true},{"one":"b626d472b555e6f950a7142783db8deb443a74e63ef6bd72a87eaf1af14ca805","other":"ba884e5cfa1ee6eb38217181711e01bb0c37b3e33d1424dfa89ed3e29ef6205b","up":true},{"one":"e027a9f7152641c4a41154f8ce4dafd23895c312150efea86bf4152c88d0ca86","other":"e5149cedd990072f2aaa9735a9259f28973c45876660c2d86ac105e56cca8e68","up":true},{"one":"1c9caf028df31681b1457a54d4b3ab20009f9fa5bd12417a1ba7efe0c660e6bd","other":"1c47ad5bd8846f777daf59587feccc308f4dc63f6d27b1385ff8085c75bb1aac","up":true},{"one":"915d7a0510bad19266eef8f00ca0cb2efc340253775706495fca8b9160b512cc","other":"90a85cb7363ede161ec21cc89f8b9d4350e566cf10586a66d31b0a8677620aa1","up":true},{"one":"006727dc6f59b120b24c17b8e63f80ef3439105f8118ffeed408f105a48ee60c","other":"045ba8da4641da3f0b8058bb0d9d8aafbb81496dc1cae2a3fd9c039a7e1cafb6","up":true},{"one":"f2d5533eed4b0c184952d859d67e44abe5a75a5de6111c8c106b8f4b2d8ccfc4","other":"f27f1044777e05f3f60165d0d2fc3e7667fe148e0ca7a097805d60b9f61025f7","up":true},{"one":"e5d794d64003725a74642f097c0ee76706d78419b6f3ea819d440bc0ad166eac","other":"e5149cedd990072f2aaa9735a9259f28973c45876660c2d86ac105e56cca8e68","up":true},{"one":"45584a4bebb948ef5f7b55d4846ec5549d7623682169c0edcab5b3523e68c7da","other":"44a10530c376b215baff8531eeb2afb8d6714c4d0350d1a6f32761a97cd6c7ec","up":true},{"one":"44a10530c376b215baff8531eeb2afb8d6714c4d0350d1a6f32761a97cd6c7ec","other":"47bfa3767cefcc0831d410d5402e9396e8a412c8c96faf55b451d3ff310f3b02","up":true},{"one":"7b90e939ae2a240f0d74a923afb6bbf11f6d5b99a7bf85f1825b1ea36bce744c","other":"7dbbdeba3731e1ff43072f8cbd86db147761e1b61753eea7024774dbf46914bd","up":true},{"one":"7a608d2cf9d1d9c5819dc1f9e88e5cb2852aadea01c40e047c2e184b62e7163c","other":"7dbbdeba3731e1ff43072f8cbd86db147761e1b61753eea7024774dbf46914bd","up":true},{"one":"5efb3bfc199f5408f79bd6bd5171b4bf332c68a8e49242eb4f6a589b963565c6","other":"5f00b3bebef2f5484ff1386298add68a6743a106200ae8a13a27dbb52714ee8f","up":true},{"one":"ff36a8810dd44f6d1fa42aa91ff6206bcfb4c1ffbab0df73a181daece329e0e3","other":"f31cc744ea921fee8364c5269b1ce7ec6b5f0c0cbb6885efbf602de5b36f6169","up":true},{"one":"006727dc6f59b120b24c17b8e63f80ef3439105f8118ffeed408f105a48ee60c","other":"0ff2d2c49547eebc96675e0b88073dea5e9091bee1843ffe567127e34486c348","up":true},{"one":"a653302730df3d58f796906a93933aa81494f2588d9485ab7676ec3b0ccbb426","other":"a34ea2e87d4c12adb27d66c2c95300603ff50415974e000bbcc69a5ae059dbf1","up":true},{"one":"f4565dd2c428c03d7a8d5fad87a6dd5f92ae706529eb6152d36fa584e7cdbe4d","other":"f7baef876a62b92ebe5ca9ec6a085e0eb54fd31e2425e662eec747df3cd77592","up":true},{"one":"53087084708cc5ee63ac459b18fa10ae52a823139b4ecba6c8691d4934f2f971","other":"534bcaa98cf9192b35b6014c650ae067e74332c015ebb516d63601427d7376b8","up":true},{"one":"f5dc78ff71a63fc2014b9553723ee676c63fc078a32a46b7cb172f357a118140","other":"f7fa2986ec9f84822b11a6b00bd03a1dd26f2a0fab90b1b308f08caead43cfe1","up":true},{"one":"51db114a52827f5b74088bd0fc87d35229e7740e7d121bd7699298396516a880","other":"534bcaa98cf9192b35b6014c650ae067e74332c015ebb516d63601427d7376b8","up":true},{"one":"baf219e9229921b773d1ad7eb7eb5216cfa60ccecaa3c5c487e3b71cb600ba12","other":"bb90464f769a85549c150f861775aa67924c7c651f393f6c70772707376a5c7e","up":true},{"one":"21012a3a6ef1ece48fd9d7cffe62dc75839dd062efcf3ac5f962c237814da407","other":"24b85c10f098725938ea7d87cd24a4b10358129906fca9790fc266ea8784b538","up":true},{"one":"886aff1f1e3b86bfe901066bb7948451c18fe3f8cd1b7318b05154890ca8f738","other":"850575577d6b420a87aba388af481e0c044c2f75cf29ff934daf5674318a61ba","up":true},{"one":"461cc9f064e6f4f06ff38e0d1f3f00ef8807ba31c7258e453cc682e9551bb1c6","other":"44a10530c376b215baff8531eeb2afb8d6714c4d0350d1a6f32761a97cd6c7ec","up":true},{"one":"c6cf46239078edfb343c645f039725fdee1bbba8b0a6da02e2cc456b9223c9a2","other":"c49caff13862dc089f1f9b8180d6efa455648375662719272102c4f8028799d6","up":true},{"one":"a653302730df3d58f796906a93933aa81494f2588d9485ab7676ec3b0ccbb426","other":"ae2b3876bdbd6388781b65e31de182564c5d81f4511caf96588b1a287760b3dd","up":true},{"one":"2f32d54f06989efb6ca5431b74cd759fba05dbef36ecff8fd506e662026af983","other":"2a97d308a720274a440dfa6901ca0a5480af9bab58dd8a6c4afdb9c83ea964c3","up":true},{"one":"6c73150490e8be9677c40086de0aefed1939581048e26f4a93f5ca26571a1a8f","other":"6fe9a02e950a5c3a5ff026b75922ed687d59795ba8eb9c092a8d09a5c64d2453","up":true},{"one":"6c73150490e8be9677c40086de0aefed1939581048e26f4a93f5ca26571a1a8f","other":"6f5f5a77e6092e25e5308413e02ba62c1c559024893a7fb98e26b0f34fed8bfe","up":true},{"one":"ac4d2d6836e2cdf4c88221f6013aac70a451dd15bc403288bd10d0b911cd9a2b","other":"aeb4c75a57ccfc9ac053a3d363cf7c1e3e201406587769ab6615d5c2f86a5410","up":true},{"one":"2f32d54f06989efb6ca5431b74cd759fba05dbef36ecff8fd506e662026af983","other":"256e81c5a6fb43bd343345477f8f96aa1947f07ac3297f631ab03f060147b062","up":true},{"one":"af02b5d107b3a17f539c7f9020ebe74322434634e70c420a7f56776eb5d9db73","other":"ae2b3876bdbd6388781b65e31de182564c5d81f4511caf96588b1a287760b3dd","up":true},{"one":"daec45eca40f48843b41f70267c07e94996ced829f02710f15354fbe26e177e7","other":"d887070a0568282c69e96ce65612ba72d5ea26b5c80671435d6e1ed2c4b49301","up":true},{"one":"32371744163f0b3aefd3955dc4877e7eb82b17ef9541c333ca9c0a9f8aec3045","other":"314a3530a5e0c37d5609149b3ae9c2e078573346bd8fce3c769ebaeb31726ec1","up":true},{"one":"0438f567045d4556a0e7a697028d689ecfd0ae20f9e85c09b48d9f1fd0ee4765","other":"06618d829a8a7317a98f1a40ecf8864e1c94c4e270a9e4c008229dc7cf937b7e","up":true},{"one":"0438f567045d4556a0e7a697028d689ecfd0ae20f9e85c09b48d9f1fd0ee4765","other":"045ba8da4641da3f0b8058bb0d9d8aafbb81496dc1cae2a3fd9c039a7e1cafb6","up":true},{"one":"850575577d6b420a87aba388af481e0c044c2f75cf29ff934daf5674318a61ba","other":"88fefb7506105c0e269baf52955a01b19f55504b13133bac0beab41c9f6e6942","up":true},{"one":"82dd83838cb982b89505ef249d353a20e434346dd78b71cd9b809f71d5c112da","other":"82f9c9009f09de2d6a77b54976d14c14211eae65d886f6ed57560c700716dd5c","up":true},{"one":"53087084708cc5ee63ac459b18fa10ae52a823139b4ecba6c8691d4934f2f971","other":"53a885968d68d8ebf7ed514e662cc13fa03186d2361000a03576531fdca2a25f","up":true},{"one":"f629b8b9e79c75ac559daf9bf4fc8672bfdd595cf2c5d17a8885282626fc65a5","other":"f5b24a1fd2cd2908b408562f9a265ee1a692b137e770137afa5fdfa07b237221","up":true},{"one":"d1d719ce1dca507598449afe966396c160ad25ad632112ab268b1d913b490dbd","other":"d7aca8f2182bc625d2b3c942bd1161c85bcf1c2b34ecbe3e2fd23cfae6b8a871","up":true},{"one":"d3b0dea1dd3ac71e7e4a30941632eec53cb980aa7cb6cdac95042a5400a878c3","other":"d640472351969a5578e541aca72b7640c583b995fd62607ff3ee3f3f3139aafd","up":true},{"one":"499036eb9d10fc003c903f09ea0ee00c0d27b39564988d67ae111f3473d22f07","other":"4a8b610e09d35aa21c42ab8c3e38de600a944c094e6b86ea56828b5e6904f1f7","up":true},{"one":"fbf5e917be45e909697a9393c4778206333cf1dd9a103978e8d71622ca3b1cc8","other":"f528aaafd67b20dafdce101db224aa01c70f93bdc91c14f50fa8db1dbf9fc386","up":true},{"one":"9d0f804849b72397646ba48208ba1e01dcf4de04e788016c4a1a0c93e650ddf5","other":"90a85cb7363ede161ec21cc89f8b9d4350e566cf10586a66d31b0a8677620aa1","up":true},{"one":"5db08436c64f4cc9e2b3950e35bc8ad739825e3efa67a642c771d95b34cb420c","other":"582330d8b8c49331b2aec790dc7325b9cd483fc8129323d31ec429d545042964","up":true},{"one":"2abb938b889a2eb735134462985a56056be48f189b5b89d23b653864c76427f4","other":"29957e8e92925a8c79bdf513295d96bfb62fbfc597ee1cf767c7ef408f1b1295","up":true},{"one":"c620752a083ca1ff0398937235cf964133939452c293c799ce07ff8aa2bde420","other":"c441d27a5f4abaa8e3b0f040a6ef85bb8c970031d6a57503a674e36b3d6915d9","up":true},{"one":"ef07be559914ec4b5930d90d8d8b6f32dab9eba23acc36f14d512307f9974348","other":"ee5e77df690329c132f2f7fca223cfd384b7bc34ec38763a4eb42780e0585656","up":true},{"one":"9890e6ebb2c6f9a7bec4c2778e077e3710ce3af356f82ae9b4d324832d159ef7","other":"9d0f804849b72397646ba48208ba1e01dcf4de04e788016c4a1a0c93e650ddf5","up":true},{"one":"b2b5ba1bb188f18f79b295f2c0d48c52c1d1d449ecb9b94b9984f3a6179732c7","other":"b02b01a5c37cb05c287a3dc7d04e305de26f8d62dc388542eeb43e97db7b4282","up":true},{"one":"1c9caf028df31681b1457a54d4b3ab20009f9fa5bd12417a1ba7efe0c660e6bd","other":"140020a23a840b8840ba0c2c384f853a606330e9743885e9967cf49533db282e","up":true},{"one":"bb90464f769a85549c150f861775aa67924c7c651f393f6c70772707376a5c7e","other":"b95d88ff6512ef8eaaa6bd842fa44175c1484fc2e8601b83d50a5ffa992bfa3a","up":true},{"one":"4d103ec5afee559a5a9242e8d650b67301eaec10e96fc2f184e34d48554108a2","other":"4d6b939fb67338c484948ab92b2ceea4d4b666d7e08773673cd7c8f83f495b89","up":true},{"one":"77d2ec52dabd5d7f326d4c6afd2aad110487c6bdffa2984060528716ba873462","other":"6f5f5a77e6092e25e5308413e02ba62c1c559024893a7fb98e26b0f34fed8bfe","up":true},{"one":"b626d472b555e6f950a7142783db8deb443a74e63ef6bd72a87eaf1af14ca805","other":"b7cafed41dac01dd59e2bcaeaaab551ebfeab8eaa1f97c1866fe0ddae772807b","up":true},{"one":"7125e05bf1bfe6df948c9276b62bc755fc6b0ec8d4ac7724b61ea49591adcf25","other":"77d2ec52dabd5d7f326d4c6afd2aad110487c6bdffa2984060528716ba873462","up":true},{"one":"7b90e939ae2a240f0d74a923afb6bbf11f6d5b99a7bf85f1825b1ea36bce744c","other":"63370e288ab2e4b8403c6678e9c44ae5c7496b5ead614306fceb85986ed29d18","up":true},{"one":"ef1b70bf090bc9994b1d45e2812c56ecb430a89c346a436bd10880bcda700351","other":"ed2d3e1e5693b44494808907c98ec54d6d08331945d2a2c03e31130fef1d2586","up":true},{"one":"b5b24532d2810e311e10b1d606baf6007f9124b88a178b32713cf1eddae089be","other":"baddc778aea97acdbbb5bc99744a5545abab9f6047c81f328761645287ac391c","up":true},{"one":"82f9c9009f09de2d6a77b54976d14c14211eae65d886f6ed57560c700716dd5c","other":"8f2182c2c2d0eeb2e887dbc350ae7257819f536032851ffdf29e7842cb1a62cc","up":true},{"one":"2abb938b889a2eb735134462985a56056be48f189b5b89d23b653864c76427f4","other":"2ccfb5b1f3923d35fef88838c508b98b5516c5d409643881d2304ae49e50eed3","up":true},{"one":"c786ff8667f509b5a9519984c1d95c83a5d2e257500a71429e8f23af610ce771","other":"c1f9e8e1d509febdf1f267bb227741e513420048a2e669ac9eef4b05a29cf10b","up":true},{"one":"478278187cd9af799e83340a2f49b0b7f122fb8e08c0a372a87795426eab364b","other":"4646fe4c119078738612b44a356089b3c73a08e11cfd910675d211ae6b20b8fd","up":true},{"one":"eb98fb45dd5754f24f9df0c9ecbb93932e3d9d7735cd6d0ddd4a8675bb4ef554","other":"e8efe8016fe6cf649b2755bee22da35ccc6c9c55d404d5385d61f6ea27b84380","up":true},{"one":"4a8b610e09d35aa21c42ab8c3e38de600a944c094e6b86ea56828b5e6904f1f7","other":"444722a15b01a0d8e6794798d239fe621d59bdfc08823ab47cbd8b9acebd23b4","up":true},{"one":"daec45eca40f48843b41f70267c07e94996ced829f02710f15354fbe26e177e7","other":"c9f5acafbbf8c66647de05b0848d79451eee490709d53f118fc2051410cc8203","up":true},{"one":"fbf5e917be45e909697a9393c4778206333cf1dd9a103978e8d71622ca3b1cc8","other":"fe316679eca0e0eb823325812a56fd27da02653b06ada2fd03b27501bda8371a","up":true},{"one":"b5b24532d2810e311e10b1d606baf6007f9124b88a178b32713cf1eddae089be","other":"ba884e5cfa1ee6eb38217181711e01bb0c37b3e33d1424dfa89ed3e29ef6205b","up":true},{"one":"e5ada0415c92ef1511b15d04edf395976464afd9adc3e929c41d4d21d25e3182","other":"e54b643cbc95d9f5d27ec3760d892b6802981bfabf4f9979267d66259df982c7","up":true},{"one":"0af9a57a2f66835cd3e4e71bc026013a8a99ca337a7b6b6cc34e11d8da212a4f","other":"0cf596af91eb9b041fe6dbe6b288c5730413850321b5ab176c81447e34ef79c5","up":true},{"one":"4ac755123dcc64ef44db9280311af51f3f7a93e0dee67370d673261220356eb9","other":"4c9eab8ab45405a6d4bab46430efc04b8e6aec1d944f88435eca41361925f379","up":true},{"one":"ef1b70bf090bc9994b1d45e2812c56ecb430a89c346a436bd10880bcda700351","other":"e54b643cbc95d9f5d27ec3760d892b6802981bfabf4f9979267d66259df982c7","up":true},{"one":"7e0458ecdf7081443cab5412529f3948ece659facaca03208496c80dd136e704","other":"7dd3078c71087ab88d4d26a962820bcb79b8ce30e91c1f9a69d4bf8d38086960","up":true},{"one":"3b88a472beba4a18f8df45678888fd359bac3823900eecfe0037fdc9ad54d416","other":"37801e8d7d46143f78924ed66099f658a94d37edfd2f58d02acb85add03e1894","up":true},{"one":"da67ace34f7076a1d550bc61bc2a31da88d6cd9f9df43b142a8c6bbade1b4aee","other":"d863ba7405eb07ccddbf1d34efbcbec2867a93a109ed9413d9aecf30d3645a6a","up":true},{"one":"df1e4e46e8ec26cad74b4f35ab070f12c8f6fddca35ac44c1218ff60fe1e6bab","other":"d1d719ce1dca507598449afe966396c160ad25ad632112ab268b1d913b490dbd","up":true},{"one":"88a141c607019477c7b120a506285a7218cad2faa038082e0b9ddfcc9cb78d07","other":"849bcbb9be43b799fefc5e689efc75125da27f536e97e5b7921031520ae6e5d8","up":true},{"one":"f528aaafd67b20dafdce101db224aa01c70f93bdc91c14f50fa8db1dbf9fc386","other":"f5b24a1fd2cd2908b408562f9a265ee1a692b137e770137afa5fdfa07b237221","up":true},{"one":"1436aaa8770e9f1c6294e49f4066c16b1caa50524e9b8fd058059e41657d2a83","other":"14dfb8414d17b2df15eaf59571a8cfec99b1fd674561da63ee99af853bda07da","up":true},{"one":"df1e4e46e8ec26cad74b4f35ab070f12c8f6fddca35ac44c1218ff60fe1e6bab","other":"da67ace34f7076a1d550bc61bc2a31da88d6cd9f9df43b142a8c6bbade1b4aee","up":true},{"one":"103b232552b94090232195dc88f84823701f35ae536b5af6dd33fa655a33cbae","other":"17040a3aad5930d8e0de1011fd2996b7d09225989f0dc1ae8f7e7a52dd26ab4e","up":true},{"one":"4c9eab8ab45405a6d4bab46430efc04b8e6aec1d944f88435eca41361925f379","other":"49cd1efed6a56a78af4ea4ab40813013e76c6a5fb9d2029ee02db5d80f5e41a6","up":true},{"one":"f45f1f2e59e947e04fa15bcf87f872ef6d73b73f778e12d1f9b8930ea166eefc","other":"f4e09f89287bd1af7833acd85ba7cc71fdb3ff34f2f409e1cf2a878dcd3183dc","up":true},{"one":"6fe9a02e950a5c3a5ff026b75922ed687d59795ba8eb9c092a8d09a5c64d2453","other":"6f5f5a77e6092e25e5308413e02ba62c1c559024893a7fb98e26b0f34fed8bfe","up":true},{"one":"217f9952af1eb58d5ca5ac7be763716cfe2c0a4f3cdd4ebe4b5df563f919e2d2","other":"24b85c10f098725938ea7d87cd24a4b10358129906fca9790fc266ea8784b538","up":true},{"one":"444722a15b01a0d8e6794798d239fe621d59bdfc08823ab47cbd8b9acebd23b4","other":"455936fd22c43794e6e2104fd91d3f5d246e3823e8ff8eaf8dc27aa9f3d2ee08","up":true},{"one":"849bcbb9be43b799fefc5e689efc75125da27f536e97e5b7921031520ae6e5d8","other":"898d2f7d46b4961b646d5a6142d54d6233b7f80f668ce234522dd02e2cc545cb","up":true},{"one":"2c3894b6e47cf19ac7ee9fe213196312f676256f670dff25b03563492550bc74","other":"2abb938b889a2eb735134462985a56056be48f189b5b89d23b653864c76427f4","up":true},{"one":"a6fbe16b81d240ff2f2ed6c93cfd9590731dfb2e7ec3fce1c098fe542bedf299","other":"aeb4c75a57ccfc9ac053a3d363cf7c1e3e201406587769ab6615d5c2f86a5410","up":true},{"one":"ef07be559914ec4b5930d90d8d8b6f32dab9eba23acc36f14d512307f9974348","other":"efeae3b7f610dc10acc51068e7718876d147cd78a9a28788c5dba5bb3a6950dc","up":true},{"one":"b89793c3ccd9ea642080728732ce7df33778653fed3d1d8f3a25e60670e33325","other":"bb90464f769a85549c150f861775aa67924c7c651f393f6c70772707376a5c7e","up":true},{"one":"67dcfd21ece30b41a39bc55c0986fca8f401bb3acba821969519f09d0933e8bd","other":"610334a0772d3414652b575f2caa6f2db32224907c24d06fda643db9f2ec2afe","up":true},{"one":"610334a0772d3414652b575f2caa6f2db32224907c24d06fda643db9f2ec2afe","other":"7920d69cf7e458fce0781ea1a4e07768e1a69f6818090eff0abf0b4a0c2c35f8","up":true},{"one":"775e7be502df8fd938cf9c42ee4fac33e460a4b6992b9efeb8dc1ff7dde5c40f","other":"6ecb5c36fc0150c287446ae8a8682d629a1d39341230717206219babe3bdf659","up":true},{"one":"b5b24532d2810e311e10b1d606baf6007f9124b88a178b32713cf1eddae089be","other":"ad9899f78659492ec248a884927a757f3f3b4e76cd2abc46ad8766251fd8afed","up":true},{"one":"7b90e939ae2a240f0d74a923afb6bbf11f6d5b99a7bf85f1825b1ea36bce744c","other":"6ecb5c36fc0150c287446ae8a8682d629a1d39341230717206219babe3bdf659","up":true},{"one":"6c4dcdfdee0164a9a3f419430726dd51f9198c65ff6e7de7aaa6f632dcde6794","other":"6e68ea86440706a0d73a9508f2247492543163f8fa7e2dc2aa62b74d50261b8b","up":true},{"one":"7dbbdeba3731e1ff43072f8cbd86db147761e1b61753eea7024774dbf46914bd","other":"610334a0772d3414652b575f2caa6f2db32224907c24d06fda643db9f2ec2afe","up":true},{"one":"baf219e9229921b773d1ad7eb7eb5216cfa60ccecaa3c5c487e3b71cb600ba12","other":"b95d88ff6512ef8eaaa6bd842fa44175c1484fc2e8601b83d50a5ffa992bfa3a","up":true},{"one":"6ea51fb6e4783f351dbbfa47b508c78c73233ebaada409dfb55446217f92c4bd","other":"6f5f5a77e6092e25e5308413e02ba62c1c559024893a7fb98e26b0f34fed8bfe","up":true},{"one":"60d7337ef806be95ccaf7b9d663a4289f9afc68edced62904ab50601cf113f45","other":"63370e288ab2e4b8403c6678e9c44ae5c7496b5ead614306fceb85986ed29d18","up":true},{"one":"165f1af67aa1d24569e0bdff61d29b3c39e93250071d8f25b5be6face209ac6a","other":"17db15893bf39b42593ee1de975aba6832046d9da5b4b493ec44272738a29cef","up":true},{"one":"478278187cd9af799e83340a2f49b0b7f122fb8e08c0a372a87795426eab364b","other":"41092c852fac630df2a9ca0862716f8e9fb8566c904a49c96389071046bc699d","up":true},{"one":"c59e3953b64e5b9ffbe53990a358914f2fa8e3551d33f92b9e3a441bd1baf2cd","other":"c620752a083ca1ff0398937235cf964133939452c293c799ce07ff8aa2bde420","up":true},{"one":"3efc4b120b3eeeac186bf3a4cd42eb8c647f7edb08c23ee643e2bec9d72c5bed","other":"37801e8d7d46143f78924ed66099f658a94d37edfd2f58d02acb85add03e1894","up":true},{"one":"2d3645c4fdf9a2809a909076b9ee5fb98fa880f6faeff914f1a2987af928cd79","other":"2abb938b889a2eb735134462985a56056be48f189b5b89d23b653864c76427f4","up":true},{"one":"db6a1f6b342f6be9517f8df01003797c11c837d9aee3cdba5b7859230b36c35d","other":"c9f5acafbbf8c66647de05b0848d79451eee490709d53f118fc2051410cc8203","up":true},{"one":"314a3530a5e0c37d5609149b3ae9c2e078573346bd8fce3c769ebaeb31726ec1","other":"37801e8d7d46143f78924ed66099f658a94d37edfd2f58d02acb85add03e1894","up":true},{"one":"f773b83f1a1de2ab6660edb0b765cfccec6778061ee25c5a84f968625686ef60","other":"f2d5533eed4b0c184952d859d67e44abe5a75a5de6111c8c106b8f4b2d8ccfc4","up":true},{"one":"9890e6ebb2c6f9a7bec4c2778e077e3710ce3af356f82ae9b4d324832d159ef7","other":"959fda0866d3c18e9399e98485d627044079d6f86b075edaea9315402f5d9395","up":true},{"one":"04518d7120fa8a528d983ca1ee6d5d09ba24a4e853fb22bc9084cdf34995e95f","other":"06618d829a8a7317a98f1a40ecf8864e1c94c4e270a9e4c008229dc7cf937b7e","up":true},{"one":"006727dc6f59b120b24c17b8e63f80ef3439105f8118ffeed408f105a48ee60c","other":"02d85b9f8e4776224ae5088683a87837b82b2bfb7e047cf373a28393e7aca6e1","up":true},{"one":"e775e9759d4701bd9b43c22f1d1be73c1262b2752bb23cb3857485daf1dcad2d","other":"e5ada0415c92ef1511b15d04edf395976464afd9adc3e929c41d4d21d25e3182","up":true},{"one":"68317431e4fa55be4a700e35c6a578307cc32b72336679b5c5618b622ef0c602","other":"6f5f5a77e6092e25e5308413e02ba62c1c559024893a7fb98e26b0f34fed8bfe","up":true},{"one":"6c4dcdfdee0164a9a3f419430726dd51f9198c65ff6e7de7aaa6f632dcde6794","other":"6e05179dc90a8f6654d0c9a3f06173371dcfb18b852fdd77f35f75e38f273125","up":true},{"one":"e5d794d64003725a74642f097c0ee76706d78419b6f3ea819d440bc0ad166eac","other":"e54b643cbc95d9f5d27ec3760d892b6802981bfabf4f9979267d66259df982c7","up":true},{"one":"b7cafed41dac01dd59e2bcaeaaab551ebfeab8eaa1f97c1866fe0ddae772807b","other":"b2b5ba1bb188f18f79b295f2c0d48c52c1d1d449ecb9b94b9984f3a6179732c7","up":true},{"one":"e027a9f7152641c4a41154f8ce4dafd23895c312150efea86bf4152c88d0ca86","other":"e5d794d64003725a74642f097c0ee76706d78419b6f3ea819d440bc0ad166eac","up":true},{"one":"610334a0772d3414652b575f2caa6f2db32224907c24d06fda643db9f2ec2afe","other":"77d2ec52dabd5d7f326d4c6afd2aad110487c6bdffa2984060528716ba873462","up":true},{"one":"0ff2d2c49547eebc96675e0b88073dea5e9091bee1843ffe567127e34486c348","other":"0cf596af91eb9b041fe6dbe6b288c5730413850321b5ab176c81447e34ef79c5","up":true},{"one":"24b85c10f098725938ea7d87cd24a4b10358129906fca9790fc266ea8784b538","other":"20aeb14f567dd16f06b0d3b589b83283daa00a5ed10e447860bda946baccdd2d","up":true},{"one":"ec52270604007673d1bfda1edbd8bfa945a21141efd85e42b684a9f30f8cddae","other":"efeae3b7f610dc10acc51068e7718876d147cd78a9a28788c5dba5bb3a6950dc","up":true},{"one":"16725e318322353befc2f2aba112f0984bc011821bb16c98e2cd8b39cd62aea1","other":"17040a3aad5930d8e0de1011fd2996b7d09225989f0dc1ae8f7e7a52dd26ab4e","up":true},{"one":"03285e06657032778feff0b43828c964dbf9de669f63171aeb587aa1a1facc0a","other":"03ccd8d52597d18c0b178ab7361d847d63aad3af920a28345977ae170a1dafcd","up":true},{"one":"006727dc6f59b120b24c17b8e63f80ef3439105f8118ffeed408f105a48ee60c","other":"03285e06657032778feff0b43828c964dbf9de669f63171aeb587aa1a1facc0a","up":true},{"one":"582330d8b8c49331b2aec790dc7325b9cd483fc8129323d31ec429d545042964","other":"5b632eaf700d173ff15f4727b85817e6173228c304b422434a08c2cad438b825","up":true},{"one":"f7fa2986ec9f84822b11a6b00bd03a1dd26f2a0fab90b1b308f08caead43cfe1","other":"f5b24a1fd2cd2908b408562f9a265ee1a692b137e770137afa5fdfa07b237221","up":true},{"one":"ef07be559914ec4b5930d90d8d8b6f32dab9eba23acc36f14d512307f9974348","other":"e8548b5df15adf0f2a997ff5709827beb5e1d36bb08a2f2d017746d5c0e83fca","up":true},{"one":"886aff1f1e3b86bfe901066bb7948451c18fe3f8cd1b7318b05154890ca8f738","other":"82f9c9009f09de2d6a77b54976d14c14211eae65d886f6ed57560c700716dd5c","up":true},{"one":"c620752a083ca1ff0398937235cf964133939452c293c799ce07ff8aa2bde420","other":"c786ff8667f509b5a9519984c1d95c83a5d2e257500a71429e8f23af610ce771","up":true},{"one":"f629b8b9e79c75ac559daf9bf4fc8672bfdd595cf2c5d17a8885282626fc65a5","other":"f27f1044777e05f3f60165d0d2fc3e7667fe148e0ca7a097805d60b9f61025f7","up":true},{"one":"96fcf14c7f90350091ac6fcb58306ccfb9e4a38d3da59f8ab656854332844cbd","other":"90765b72283f59be4cf9bf7a9e9a22fd6db701c3603cbc0817b4adf2f8e9ce08","up":true},{"one":"7290cd3affade5f9e729d1b03549aceafb2576cdbc6789fd688c95495f10bacd","other":"63370e288ab2e4b8403c6678e9c44ae5c7496b5ead614306fceb85986ed29d18","up":true},{"one":"628e7da3359ed6d9dcfbafc7581966e4e09245c321ec78ca75587c9cbb44697f","other":"63370e288ab2e4b8403c6678e9c44ae5c7496b5ead614306fceb85986ed29d18","up":true},{"one":"0de3915b0bcc68040c8aa76fbd2cfa0714e9b34c9dbe0838a7cba81c4f73581c","other":"0ff2d2c49547eebc96675e0b88073dea5e9091bee1843ffe567127e34486c348","up":true},{"one":"1f85b8c05e5dceff0bd8256f8f6d80d4b902a9754ceb952d95ea2e1150ef9e59","other":"1c9caf028df31681b1457a54d4b3ab20009f9fa5bd12417a1ba7efe0c660e6bd","up":true},{"one":"9fa0215e980dc907df4cc47ab4937f36527d78f9837493016fd4fc51e617299c","other":"9d0f804849b72397646ba48208ba1e01dcf4de04e788016c4a1a0c93e650ddf5","up":true},{"one":"67dcfd21ece30b41a39bc55c0986fca8f401bb3acba821969519f09d0933e8bd","other":"63370e288ab2e4b8403c6678e9c44ae5c7496b5ead614306fceb85986ed29d18","up":true},{"one":"fbf5e917be45e909697a9393c4778206333cf1dd9a103978e8d71622ca3b1cc8","other":"f629b8b9e79c75ac559daf9bf4fc8672bfdd595cf2c5d17a8885282626fc65a5","up":true},{"one":"63370e288ab2e4b8403c6678e9c44ae5c7496b5ead614306fceb85986ed29d18","other":"6251e9540448726a601699ef4cd19e50c969a746da27228967338cdc09d628bf","up":true},{"one":"959fda0866d3c18e9399e98485d627044079d6f86b075edaea9315402f5d9395","other":"96fcf14c7f90350091ac6fcb58306ccfb9e4a38d3da59f8ab656854332844cbd","up":true},{"one":"2f32d54f06989efb6ca5431b74cd759fba05dbef36ecff8fd506e662026af983","other":"2d3645c4fdf9a2809a909076b9ee5fb98fa880f6faeff914f1a2987af928cd79","up":true},{"one":"6c73150490e8be9677c40086de0aefed1939581048e26f4a93f5ca26571a1a8f","other":"6e05179dc90a8f6654d0c9a3f06173371dcfb18b852fdd77f35f75e38f273125","up":true},{"one":"959fda0866d3c18e9399e98485d627044079d6f86b075edaea9315402f5d9395","other":"90765b72283f59be4cf9bf7a9e9a22fd6db701c3603cbc0817b4adf2f8e9ce08","up":true},{"one":"47bfa3767cefcc0831d410d5402e9396e8a412c8c96faf55b451d3ff310f3b02","other":"41092c852fac630df2a9ca0862716f8e9fb8566c904a49c96389071046bc699d","up":true},{"one":"88a141c607019477c7b120a506285a7218cad2faa038082e0b9ddfcc9cb78d07","other":"88fefb7506105c0e269baf52955a01b19f55504b13133bac0beab41c9f6e6942","up":true},{"one":"849bcbb9be43b799fefc5e689efc75125da27f536e97e5b7921031520ae6e5d8","other":"8f2182c2c2d0eeb2e887dbc350ae7257819f536032851ffdf29e7842cb1a62cc","up":true},{"one":"a6fbe16b81d240ff2f2ed6c93cfd9590731dfb2e7ec3fce1c098fe542bedf299","other":"ad9899f78659492ec248a884927a757f3f3b4e76cd2abc46ad8766251fd8afed","up":true},{"one":"0de3915b0bcc68040c8aa76fbd2cfa0714e9b34c9dbe0838a7cba81c4f73581c","other":"0af9a57a2f66835cd3e4e71bc026013a8a99ca337a7b6b6cc34e11d8da212a4f","up":true},{"one":"f45f1f2e59e947e04fa15bcf87f872ef6d73b73f778e12d1f9b8930ea166eefc","other":"f5b24a1fd2cd2908b408562f9a265ee1a692b137e770137afa5fdfa07b237221","up":true},{"one":"4646fe4c119078738612b44a356089b3c73a08e11cfd910675d211ae6b20b8fd","other":"44a10530c376b215baff8531eeb2afb8d6714c4d0350d1a6f32761a97cd6c7ec","up":true},{"one":"46fee69dad8b6a6a87d356d10db25d835a0c4e154bf179e88fb4cc65f97d72d7","other":"41092c852fac630df2a9ca0862716f8e9fb8566c904a49c96389071046bc699d","up":true},{"one":"45584a4bebb948ef5f7b55d4846ec5549d7623682169c0edcab5b3523e68c7da","other":"4646fe4c119078738612b44a356089b3c73a08e11cfd910675d211ae6b20b8fd","up":true},{"one":"0cf596af91eb9b041fe6dbe6b288c5730413850321b5ab176c81447e34ef79c5","other":"0c28cd1315890629896d0fe5517524d4eb788f7444709c135ea690ba4e6103d5","up":true},{"one":"7e0458ecdf7081443cab5412529f3948ece659facaca03208496c80dd136e704","other":"7a608d2cf9d1d9c5819dc1f9e88e5cb2852aadea01c40e047c2e184b62e7163c","up":true},{"one":"f773b83f1a1de2ab6660edb0b765cfccec6778061ee25c5a84f968625686ef60","other":"f7baef876a62b92ebe5ca9ec6a085e0eb54fd31e2425e662eec747df3cd77592","up":true},{"one":"53fe2c13926507a7a6c27d0fb30a2c358c4c7bfa40df8b5fa8ec8986c2450519","other":"512ec5c2e6b4d788482462d941117c81fcc0e73f0c15545794dd1b4e03bf2102","up":true},{"one":"ef1b70bf090bc9994b1d45e2812c56ecb430a89c346a436bd10880bcda700351","other":"e775e9759d4701bd9b43c22f1d1be73c1262b2752bb23cb3857485daf1dcad2d","up":true},{"one":"5cd2377226825dc7ea582315cd108d23502df4e9c7c09fc07e7b4aa56440de29","other":"5f00b3bebef2f5484ff1386298add68a6743a106200ae8a13a27dbb52714ee8f","up":true},{"one":"ef1b70bf090bc9994b1d45e2812c56ecb430a89c346a436bd10880bcda700351","other":"efeae3b7f610dc10acc51068e7718876d147cd78a9a28788c5dba5bb3a6950dc","up":true},{"one":"9852ce267d53106a6e584d6eddb08e0062eb4a422d2a8d39ad6dccaebac552ff","other":"9d0f804849b72397646ba48208ba1e01dcf4de04e788016c4a1a0c93e650ddf5","up":true},{"one":"9852ce267d53106a6e584d6eddb08e0062eb4a422d2a8d39ad6dccaebac552ff","other":"976e57d0c32227222bfd0cbb802f269bdcd52d5d33cf689c66b12c023f5fa8bf","up":true},{"one":"e7fa7112adc7b023dd5965e620277122542153f87eaf5deeacc8a51f1778ba77","other":"e5149cedd990072f2aaa9735a9259f28973c45876660c2d86ac105e56cca8e68","up":true},{"one":"6ea51fb6e4783f351dbbfa47b508c78c73233ebaada409dfb55446217f92c4bd","other":"6ecb5c36fc0150c287446ae8a8682d629a1d39341230717206219babe3bdf659","up":true},{"one":"a6fbe16b81d240ff2f2ed6c93cfd9590731dfb2e7ec3fce1c098fe542bedf299","other":"a3693801a91180410cf3e85d7c09ac8054a769e7b1d55c9e7a46850cb8217da0","up":true},{"one":"0af9a57a2f66835cd3e4e71bc026013a8a99ca337a7b6b6cc34e11d8da212a4f","other":"0c28cd1315890629896d0fe5517524d4eb788f7444709c135ea690ba4e6103d5","up":true},{"one":"fbf5e917be45e909697a9393c4778206333cf1dd9a103978e8d71622ca3b1cc8","other":"fe2167fd33f383110eb3f6caa7bd905ca54fa0c810f1b8a34483a846f3cbddab","up":true},{"one":"7290cd3affade5f9e729d1b03549aceafb2576cdbc6789fd688c95495f10bacd","other":"6ecb5c36fc0150c287446ae8a8682d629a1d39341230717206219babe3bdf659","up":true},{"one":"6967e7438125c2045d575eb9f407b4a38d1bf9dcd1c1c1a97f750da6a21aeff7","other":"6fe9a02e950a5c3a5ff026b75922ed687d59795ba8eb9c092a8d09a5c64d2453","up":true},{"one":"f528aaafd67b20dafdce101db224aa01c70f93bdc91c14f50fa8db1dbf9fc386","other":"fbc8087a723c564ca0139329902e79748af46699ea7be24d57909a7e8e96f681","up":true},{"one":"fe2167fd33f383110eb3f6caa7bd905ca54fa0c810f1b8a34483a846f3cbddab","other":"f925c85e6457ac01f0cd6b297155f9d3ae611603890d8f3a45e1396d937f8680","up":true},{"one":"96fcf14c7f90350091ac6fcb58306ccfb9e4a38d3da59f8ab656854332844cbd","other":"9d0f804849b72397646ba48208ba1e01dcf4de04e788016c4a1a0c93e650ddf5","up":true},{"one":"2a97d308a720274a440dfa6901ca0a5480af9bab58dd8a6c4afdb9c83ea964c3","other":"2abb938b889a2eb735134462985a56056be48f189b5b89d23b653864c76427f4","up":true},{"one":"17040a3aad5930d8e0de1011fd2996b7d09225989f0dc1ae8f7e7a52dd26ab4e","other":"1436aaa8770e9f1c6294e49f4066c16b1caa50524e9b8fd058059e41657d2a83","up":true},{"one":"6ea51fb6e4783f351dbbfa47b508c78c73233ebaada409dfb55446217f92c4bd","other":"6e05179dc90a8f6654d0c9a3f06173371dcfb18b852fdd77f35f75e38f273125","up":true},{"one":"444722a15b01a0d8e6794798d239fe621d59bdfc08823ab47cbd8b9acebd23b4","other":"49cd1efed6a56a78af4ea4ab40813013e76c6a5fb9d2029ee02db5d80f5e41a6","up":true},{"one":"959fda0866d3c18e9399e98485d627044079d6f86b075edaea9315402f5d9395","other":"90a85cb7363ede161ec21cc89f8b9d4350e566cf10586a66d31b0a8677620aa1","up":true},{"one":"2c79af7ea85f96db7897cf8cdb4d002ad2308194e03981876edb8d904ef65137","other":"2ccfb5b1f3923d35fef88838c508b98b5516c5d409643881d2304ae49e50eed3","up":true},{"one":"ba884e5cfa1ee6eb38217181711e01bb0c37b3e33d1424dfa89ed3e29ef6205b","other":"b89793c3ccd9ea642080728732ce7df33778653fed3d1d8f3a25e60670e33325","up":true},{"one":"49eaad68d23dd63ef26029fa3f4e2578f3deca8708bbc838750d8b6dbe9eaa38","other":"4a8b610e09d35aa21c42ab8c3e38de600a944c094e6b86ea56828b5e6904f1f7","up":true},{"one":"4646fe4c119078738612b44a356089b3c73a08e11cfd910675d211ae6b20b8fd","other":"455936fd22c43794e6e2104fd91d3f5d246e3823e8ff8eaf8dc27aa9f3d2ee08","up":true},{"one":"2f32d54f06989efb6ca5431b74cd759fba05dbef36ecff8fd506e662026af983","other":"2ccfb5b1f3923d35fef88838c508b98b5516c5d409643881d2304ae49e50eed3","up":true},{"one":"2f32d54f06989efb6ca5431b74cd759fba05dbef36ecff8fd506e662026af983","other":"21012a3a6ef1ece48fd9d7cffe62dc75839dd062efcf3ac5f962c237814da407","up":true},{"one":"baf219e9229921b773d1ad7eb7eb5216cfa60ccecaa3c5c487e3b71cb600ba12","other":"b89793c3ccd9ea642080728732ce7df33778653fed3d1d8f3a25e60670e33325","up":true},{"one":"45584a4bebb948ef5f7b55d4846ec5549d7623682169c0edcab5b3523e68c7da","other":"41d9c03e44bec3f84a6139ce40ef1e390530f38ed11860575acfad03a49db095","up":true},{"one":"4ac755123dcc64ef44db9280311af51f3f7a93e0dee67370d673261220356eb9","other":"4bcf4eb531d5ec4b31d99e8354af03f976524c7858a1e7043e9b7055326f0952","up":true},{"one":"0d8a919207fb2d5718eab7da95f8efeb01a4e1ae39602d315f8ba2ff1752d9da","other":"0ff2d2c49547eebc96675e0b88073dea5e9091bee1843ffe567127e34486c348","up":true},{"one":"af02b5d107b3a17f539c7f9020ebe74322434634e70c420a7f56776eb5d9db73","other":"ac4d2d6836e2cdf4c88221f6013aac70a451dd15bc403288bd10d0b911cd9a2b","up":true},{"one":"fbf5e917be45e909697a9393c4778206333cf1dd9a103978e8d71622ca3b1cc8","other":"ff36a8810dd44f6d1fa42aa91ff6206bcfb4c1ffbab0df73a181daece329e0e3","up":true},{"one":"fbf5e917be45e909697a9393c4778206333cf1dd9a103978e8d71622ca3b1cc8","other":"f7fa2986ec9f84822b11a6b00bd03a1dd26f2a0fab90b1b308f08caead43cfe1","up":true},{"one":"a653302730df3d58f796906a93933aa81494f2588d9485ab7676ec3b0ccbb426","other":"a46dd535e3bc8f111a8b2ce5594b62e87741c395e8a2b8fbae33edd29cb8caf8","up":true},{"one":"6f5f5a77e6092e25e5308413e02ba62c1c559024893a7fb98e26b0f34fed8bfe","other":"6f2d756566dd5b4a13ffeea9f687c785148f3407a502e28b9d6edfd03b905fdc","up":true},{"one":"103b232552b94090232195dc88f84823701f35ae536b5af6dd33fa655a33cbae","other":"17db15893bf39b42593ee1de975aba6832046d9da5b4b493ec44272738a29cef","up":true},{"one":"daec45eca40f48843b41f70267c07e94996ced829f02710f15354fbe26e177e7","other":"da67ace34f7076a1d550bc61bc2a31da88d6cd9f9df43b142a8c6bbade1b4aee","up":true},{"one":"9fa0215e980dc907df4cc47ab4937f36527d78f9837493016fd4fc51e617299c","other":"959fda0866d3c18e9399e98485d627044079d6f86b075edaea9315402f5d9395","up":true},{"one":"e5149cedd990072f2aaa9735a9259f28973c45876660c2d86ac105e56cca8e68","other":"e5ada0415c92ef1511b15d04edf395976464afd9adc3e929c41d4d21d25e3182","up":true},{"one":"d3b0dea1dd3ac71e7e4a30941632eec53cb980aa7cb6cdac95042a5400a878c3","other":"d7aca8f2182bc625d2b3c942bd1161c85bcf1c2b34ecbe3e2fd23cfae6b8a871","up":true},{"one":"c620752a083ca1ff0398937235cf964133939452c293c799ce07ff8aa2bde420","other":"c43fbee95380007274b8f231fe34bcd59b5c0ef0830b174967d4702627984fc6","up":true},{"one":"6e68ea86440706a0d73a9508f2247492543163f8fa7e2dc2aa62b74d50261b8b","other":"6fe9a02e950a5c3a5ff026b75922ed687d59795ba8eb9c092a8d09a5c64d2453","up":true},{"one":"0cf596af91eb9b041fe6dbe6b288c5730413850321b5ab176c81447e34ef79c5","other":"0fc59bd04ac9de3195e3c9d0eb573952a5805dd2e7e572078b6e996778adec73","up":true},{"one":"512ec5c2e6b4d788482462d941117c81fcc0e73f0c15545794dd1b4e03bf2102","other":"53087084708cc5ee63ac459b18fa10ae52a823139b4ecba6c8691d4934f2f971","up":true},{"one":"6967e7438125c2045d575eb9f407b4a38d1bf9dcd1c1c1a97f750da6a21aeff7","other":"6e05179dc90a8f6654d0c9a3f06173371dcfb18b852fdd77f35f75e38f273125","up":true},{"one":"35e6b1d31f594c06b759525434a7e717ebe6f27ca0188f247ed1247664a50563","other":"378e7af7cc019186d4f2699e753e2d71302f8f3565572c13b7a1b1c5cb47443c","up":true},{"one":"2f32d54f06989efb6ca5431b74cd759fba05dbef36ecff8fd506e662026af983","other":"24b85c10f098725938ea7d87cd24a4b10358129906fca9790fc266ea8784b538","up":true},{"one":"628e7da3359ed6d9dcfbafc7581966e4e09245c321ec78ca75587c9cbb44697f","other":"60d7337ef806be95ccaf7b9d663a4289f9afc68edced62904ab50601cf113f45","up":true},{"one":"1a2a0e0bbf83cd40936995674418ae469aa2b92876a4ceeabd8128f536b7d7a2","other":"1c9caf028df31681b1457a54d4b3ab20009f9fa5bd12417a1ba7efe0c660e6bd","up":true},{"one":"d887070a0568282c69e96ce65612ba72d5ea26b5c80671435d6e1ed2c4b49301","other":"da67ace34f7076a1d550bc61bc2a31da88d6cd9f9df43b142a8c6bbade1b4aee","up":true},{"one":"53a885968d68d8ebf7ed514e662cc13fa03186d2361000a03576531fdca2a25f","other":"534bcaa98cf9192b35b6014c650ae067e74332c015ebb516d63601427d7376b8","up":true},{"one":"33b5c521b4208e26414db2e05c9a8ccc001a524d928579d44d2e74d14a56593e","other":"30bec7cd0a7d002839aed7654129bd2fe2e2ce7f42aa7bae1560e8bf718954c3","up":true},{"one":"88fefb7506105c0e269baf52955a01b19f55504b13133bac0beab41c9f6e6942","other":"8f2182c2c2d0eeb2e887dbc350ae7257819f536032851ffdf29e7842cb1a62cc","up":true},{"one":"c620752a083ca1ff0398937235cf964133939452c293c799ce07ff8aa2bde420","other":"c26fd5e6504c7b3f0a6d9133ff87c98c110eb1c201c5f3bcf6b10653f2b972d2","up":true},{"one":"256e81c5a6fb43bd343345477f8f96aa1947f07ac3297f631ab03f060147b062","other":"20aeb14f567dd16f06b0d3b589b83283daa00a5ed10e447860bda946baccdd2d","up":true},{"one":"77d2ec52dabd5d7f326d4c6afd2aad110487c6bdffa2984060528716ba873462","other":"6ecb5c36fc0150c287446ae8a8682d629a1d39341230717206219babe3bdf659","up":true},{"one":"4d103ec5afee559a5a9242e8d650b67301eaec10e96fc2f184e34d48554108a2","other":"4c9eab8ab45405a6d4bab46430efc04b8e6aec1d944f88435eca41361925f379","up":true},{"one":"6e68ea86440706a0d73a9508f2247492543163f8fa7e2dc2aa62b74d50261b8b","other":"6e05179dc90a8f6654d0c9a3f06173371dcfb18b852fdd77f35f75e38f273125","up":true},{"one":"44a10530c376b215baff8531eeb2afb8d6714c4d0350d1a6f32761a97cd6c7ec","other":"444722a15b01a0d8e6794798d239fe621d59bdfc08823ab47cbd8b9acebd23b4","up":true},{"one":"0de3915b0bcc68040c8aa76fbd2cfa0714e9b34c9dbe0838a7cba81c4f73581c","other":"0fc59bd04ac9de3195e3c9d0eb573952a5805dd2e7e572078b6e996778adec73","up":true},{"one":"4636f00be60a9b494a3ebc9ab41cc7cb53ec0b0beff214db2d0a248dc3aeb6af","other":"444722a15b01a0d8e6794798d239fe621d59bdfc08823ab47cbd8b9acebd23b4","up":true},{"one":"4bcf4eb531d5ec4b31d99e8354af03f976524c7858a1e7043e9b7055326f0952","other":"49cd1efed6a56a78af4ea4ab40813013e76c6a5fb9d2029ee02db5d80f5e41a6","up":true},{"one":"6c4dcdfdee0164a9a3f419430726dd51f9198c65ff6e7de7aaa6f632dcde6794","other":"6ecb5c36fc0150c287446ae8a8682d629a1d39341230717206219babe3bdf659","up":true},{"one":"3b88a472beba4a18f8df45678888fd359bac3823900eecfe0037fdc9ad54d416","other":"3b78bc987c7c31c94e8ada9b4b11b5db9387fe70dd01ce7f3e976d3bec433dec","up":true},{"one":"478278187cd9af799e83340a2f49b0b7f122fb8e08c0a372a87795426eab364b","other":"461cc9f064e6f4f06ff38e0d1f3f00ef8807ba31c7258e453cc682e9551bb1c6","up":true},{"one":"30897492824b19540d13ef17c70845be6dde455dca4e4f84cfca14a2c373969f","other":"378e7af7cc019186d4f2699e753e2d71302f8f3565572c13b7a1b1c5cb47443c","up":true},{"one":"51db114a52827f5b74088bd0fc87d35229e7740e7d121bd7699298396516a880","other":"574f65867482091aee2774033116c233525eea711706b5ae9ba09b54e896d302","up":true},{"one":"610334a0772d3414652b575f2caa6f2db32224907c24d06fda643db9f2ec2afe","other":"6251e9540448726a601699ef4cd19e50c969a746da27228967338cdc09d628bf","up":true},{"one":"5efb3bfc199f5408f79bd6bd5171b4bf332c68a8e49242eb4f6a589b963565c6","other":"53a885968d68d8ebf7ed514e662cc13fa03186d2361000a03576531fdca2a25f","up":true},{"one":"17040a3aad5930d8e0de1011fd2996b7d09225989f0dc1ae8f7e7a52dd26ab4e","other":"179f21d2e0421b8056ee9a260bc0985bfa64a52a36d0a8fbce4e03f3120d1d65","up":true},{"one":"45584a4bebb948ef5f7b55d4846ec5549d7623682169c0edcab5b3523e68c7da","other":"461cc9f064e6f4f06ff38e0d1f3f00ef8807ba31c7258e453cc682e9551bb1c6","up":true},{"one":"0c64e5af869b1665fd4016ae6d04c8eedd423636f06d78ecb944ee8e3272a82a","other":"0de3915b0bcc68040c8aa76fbd2cfa0714e9b34c9dbe0838a7cba81c4f73581c","up":true},{"one":"32371744163f0b3aefd3955dc4877e7eb82b17ef9541c333ca9c0a9f8aec3045","other":"30bec7cd0a7d002839aed7654129bd2fe2e2ce7f42aa7bae1560e8bf718954c3","up":true},{"one":"582330d8b8c49331b2aec790dc7325b9cd483fc8129323d31ec429d545042964","other":"53a885968d68d8ebf7ed514e662cc13fa03186d2361000a03576531fdca2a25f","up":true},{"one":"b5b24532d2810e311e10b1d606baf6007f9124b88a178b32713cf1eddae089be","other":"b7cafed41dac01dd59e2bcaeaaab551ebfeab8eaa1f97c1866fe0ddae772807b","up":true},{"one":"4636f00be60a9b494a3ebc9ab41cc7cb53ec0b0beff214db2d0a248dc3aeb6af","other":"461cc9f064e6f4f06ff38e0d1f3f00ef8807ba31c7258e453cc682e9551bb1c6","up":true},{"one":"738c2d42458965d03c8f9f055eaf0e3edf3dfa2a4de0a048ec05b78e7b765c90","other":"63370e288ab2e4b8403c6678e9c44ae5c7496b5ead614306fceb85986ed29d18","up":true},{"one":"1e2aca93fa9442a0034ae8d295530dde16fcbfa8c37227e2e6863babb0f87c34","other":"1f85b8c05e5dceff0bd8256f8f6d80d4b902a9754ceb952d95ea2e1150ef9e59","up":true},{"one":"7dd3078c71087ab88d4d26a962820bcb79b8ce30e91c1f9a69d4bf8d38086960","other":"63370e288ab2e4b8403c6678e9c44ae5c7496b5ead614306fceb85986ed29d18","up":true},{"one":"f31cc744ea921fee8364c5269b1ce7ec6b5f0c0cbb6885efbf602de5b36f6169","other":"f7baef876a62b92ebe5ca9ec6a085e0eb54fd31e2425e662eec747df3cd77592","up":true},{"one":"ef07be559914ec4b5930d90d8d8b6f32dab9eba23acc36f14d512307f9974348","other":"ed2d3e1e5693b44494808907c98ec54d6d08331945d2a2c03e31130fef1d2586","up":true},{"one":"db6a1f6b342f6be9517f8df01003797c11c837d9aee3cdba5b7859230b36c35d","other":"d887070a0568282c69e96ce65612ba72d5ea26b5c80671435d6e1ed2c4b49301","up":true},{"one":"66e7fc2df51f5df8d7329851fe9357d895e9d5dfdc25f8d92bdb10a960f7e15a","other":"63370e288ab2e4b8403c6678e9c44ae5c7496b5ead614306fceb85986ed29d18","up":true},{"one":"30bec7cd0a7d002839aed7654129bd2fe2e2ce7f42aa7bae1560e8bf718954c3","other":"3630e05326bacea8fcc739dec42085f845f416ddc698c76ff91f099eb1dc5007","up":true},{"one":"53fe2c13926507a7a6c27d0fb30a2c358c4c7bfa40df8b5fa8ec8986c2450519","other":"53a885968d68d8ebf7ed514e662cc13fa03186d2361000a03576531fdca2a25f","up":true},{"one":"cc2037c08942a094df12f45831f28e0015fc3ac04d5b8f24ffea9bf3a0b02c39","other":"ca041da0dc514643d017458d08ff6962ec52c9e66571a239ec395dc8b2546709","up":true},{"one":"30897492824b19540d13ef17c70845be6dde455dca4e4f84cfca14a2c373969f","other":"314a3530a5e0c37d5609149b3ae9c2e078573346bd8fce3c769ebaeb31726ec1","up":true},{"one":"47bfa3767cefcc0831d410d5402e9396e8a412c8c96faf55b451d3ff310f3b02","other":"4646fe4c119078738612b44a356089b3c73a08e11cfd910675d211ae6b20b8fd","up":true},{"one":"1f670c53b4c597beaffacd84e3a697225b04cded9219d0a28e1fe525a3cadcf5","other":"1c8a10ecbd72acb2bbbb8b77ea5404f9e90f4dbf306ec8134cfed70b40aef399","up":true},{"one":"3ec530761ddb87f930fda919be67df18074c6f0795292add1b2a91ff3d9c39e3","other":"3f946957d910179c7e1a83c44369aacfc31f5727b1a6421a01c8a978ccd349a2","up":true},{"one":"898d2f7d46b4961b646d5a6142d54d6233b7f80f668ce234522dd02e2cc545cb","other":"850575577d6b420a87aba388af481e0c044c2f75cf29ff934daf5674318a61ba","up":true},{"one":"0743bcf2aaa77e916f4a367d6159473c7d80f46a2e4cbe9ef346e423d39d7072","other":"06618d829a8a7317a98f1a40ecf8864e1c94c4e270a9e4c008229dc7cf937b7e","up":true},{"one":"461cc9f064e6f4f06ff38e0d1f3f00ef8807ba31c7258e453cc682e9551bb1c6","other":"47bfa3767cefcc0831d410d5402e9396e8a412c8c96faf55b451d3ff310f3b02","up":true},{"one":"82f9c9009f09de2d6a77b54976d14c14211eae65d886f6ed57560c700716dd5c","other":"850575577d6b420a87aba388af481e0c044c2f75cf29ff934daf5674318a61ba","up":true},{"one":"baddc778aea97acdbbb5bc99744a5545abab9f6047c81f328761645287ac391c","other":"b820e480354000c837b1781ec1c493e8776b4834252e6453425ac05b925b5a58","up":true},{"one":"e8548b5df15adf0f2a997ff5709827beb5e1d36bb08a2f2d017746d5c0e83fca","other":"ec52270604007673d1bfda1edbd8bfa945a21141efd85e42b684a9f30f8cddae","up":true},{"one":"165f1af67aa1d24569e0bdff61d29b3c39e93250071d8f25b5be6face209ac6a","other":"17040a3aad5930d8e0de1011fd2996b7d09225989f0dc1ae8f7e7a52dd26ab4e","up":true},{"one":"16725e318322353befc2f2aba112f0984bc011821bb16c98e2cd8b39cd62aea1","other":"140020a23a840b8840ba0c2c384f853a606330e9743885e9967cf49533db282e","up":true},{"one":"ef1b70bf090bc9994b1d45e2812c56ecb430a89c346a436bd10880bcda700351","other":"e5d794d64003725a74642f097c0ee76706d78419b6f3ea819d440bc0ad166eac","up":true},{"one":"33737df75bbac1b41c63f05ea2cf1523b972df17f22bda026db84a49ac35e1e3","other":"378e7af7cc019186d4f2699e753e2d71302f8f3565572c13b7a1b1c5cb47443c","up":true},{"one":"4d6b939fb67338c484948ab92b2ceea4d4b666d7e08773673cd7c8f83f495b89","other":"49cd1efed6a56a78af4ea4ab40813013e76c6a5fb9d2029ee02db5d80f5e41a6","up":true},{"one":"daec45eca40f48843b41f70267c07e94996ced829f02710f15354fbe26e177e7","other":"df1e4e46e8ec26cad74b4f35ab070f12c8f6fddca35ac44c1218ff60fe1e6bab","up":true},{"one":"53a885968d68d8ebf7ed514e662cc13fa03186d2361000a03576531fdca2a25f","other":"51db114a52827f5b74088bd0fc87d35229e7740e7d121bd7699298396516a880","up":true},{"one":"7290cd3affade5f9e729d1b03549aceafb2576cdbc6789fd688c95495f10bacd","other":"7125e05bf1bfe6df948c9276b62bc755fc6b0ec8d4ac7724b61ea49591adcf25","up":true},{"one":"c832b4ad64a17da4b796ffcac646c2aa666b276aabb7eb3bfe7981d64a4da402","other":"ca041da0dc514643d017458d08ff6962ec52c9e66571a239ec395dc8b2546709","up":true},{"one":"b5b24532d2810e311e10b1d606baf6007f9124b88a178b32713cf1eddae089be","other":"b2a563ac59bab4dfddf7b6e27b80ee7afdeb2e4295411107903f484bcf9fc4f2","up":true},{"one":"68317431e4fa55be4a700e35c6a578307cc32b72336679b5c5618b622ef0c602","other":"6ecb5c36fc0150c287446ae8a8682d629a1d39341230717206219babe3bdf659","up":true},{"one":"c832b4ad64a17da4b796ffcac646c2aa666b276aabb7eb3bfe7981d64a4da402","other":"c8986871e46f001d15ed8b70f2aa0fea8ae309d5e5671a500f619e3b348c8c15","up":true},{"one":"e5149cedd990072f2aaa9735a9259f28973c45876660c2d86ac105e56cca8e68","other":"e54784cfbcd89c37c8f758aae70ece3ab4b7f8c30fb4ef7543e04aa89ff4386b","up":true},{"one":"140020a23a840b8840ba0c2c384f853a606330e9743885e9967cf49533db282e","other":"11d43f6ed0ddd5afa5c8a7abf7c62a4fa865b7a25ee295bf1a49701ef3081363","up":true},{"one":"d887070a0568282c69e96ce65612ba72d5ea26b5c80671435d6e1ed2c4b49301","other":"d1d719ce1dca507598449afe966396c160ad25ad632112ab268b1d913b490dbd","up":true},{"one":"461cc9f064e6f4f06ff38e0d1f3f00ef8807ba31c7258e453cc682e9551bb1c6","other":"46fee69dad8b6a6a87d356d10db25d835a0c4e154bf179e88fb4cc65f97d72d7","up":true},{"one":"44a10530c376b215baff8531eeb2afb8d6714c4d0350d1a6f32761a97cd6c7ec","other":"41092c852fac630df2a9ca0862716f8e9fb8566c904a49c96389071046bc699d","up":true},{"one":"2abb938b889a2eb735134462985a56056be48f189b5b89d23b653864c76427f4","other":"2a0a8eaf1a2749e68f8b841578c160699cf7907ff23842c6d616ad884e5f613e","up":true},{"one":"915d7a0510bad19266eef8f00ca0cb2efc340253775706495fca8b9160b512cc","other":"90765b72283f59be4cf9bf7a9e9a22fd6db701c3603cbc0817b4adf2f8e9ce08","up":true},{"one":"90765b72283f59be4cf9bf7a9e9a22fd6db701c3603cbc0817b4adf2f8e9ce08","other":"9d0f804849b72397646ba48208ba1e01dcf4de04e788016c4a1a0c93e650ddf5","up":true},{"one":"21012a3a6ef1ece48fd9d7cffe62dc75839dd062efcf3ac5f962c237814da407","other":"21a044e772b7c955fe4a6fb7c3a9a20e95d48b7fd6b9518741782f04f5f1f5c2","up":true},{"one":"179f21d2e0421b8056ee9a260bc0985bfa64a52a36d0a8fbce4e03f3120d1d65","other":"140020a23a840b8840ba0c2c384f853a606330e9743885e9967cf49533db282e","up":true},{"one":"6c73150490e8be9677c40086de0aefed1939581048e26f4a93f5ca26571a1a8f","other":"6ecb5c36fc0150c287446ae8a8682d629a1d39341230717206219babe3bdf659","up":true},{"one":"ef1b70bf090bc9994b1d45e2812c56ecb430a89c346a436bd10880bcda700351","other":"ee5e77df690329c132f2f7fca223cfd384b7bc34ec38763a4eb42780e0585656","up":true},{"one":"1a2a0e0bbf83cd40936995674418ae469aa2b92876a4ceeabd8128f536b7d7a2","other":"1c8a10ecbd72acb2bbbb8b77ea5404f9e90f4dbf306ec8134cfed70b40aef399","up":true},{"one":"3b88a472beba4a18f8df45678888fd359bac3823900eecfe0037fdc9ad54d416","other":"39d1fcae2d23c775214988251505c577b9ac7b6851558ddf9a437dfe143f3845","up":true},{"one":"67aa5463e4b32b363b3d01d2a41ccb03199411057276f4962d053160be29a6ef","other":"610334a0772d3414652b575f2caa6f2db32224907c24d06fda643db9f2ec2afe","up":true},{"one":"ca041da0dc514643d017458d08ff6962ec52c9e66571a239ec395dc8b2546709","other":"c9f5acafbbf8c66647de05b0848d79451eee490709d53f118fc2051410cc8203","up":true},{"one":"baddc778aea97acdbbb5bc99744a5545abab9f6047c81f328761645287ac391c","other":"b95d88ff6512ef8eaaa6bd842fa44175c1484fc2e8601b83d50a5ffa992bfa3a","up":true},{"one":"455936fd22c43794e6e2104fd91d3f5d246e3823e8ff8eaf8dc27aa9f3d2ee08","other":"41092c852fac630df2a9ca0862716f8e9fb8566c904a49c96389071046bc699d","up":true},{"one":"49eaad68d23dd63ef26029fa3f4e2578f3deca8708bbc838750d8b6dbe9eaa38","other":"4ac755123dcc64ef44db9280311af51f3f7a93e0dee67370d673261220356eb9","up":true},{"one":"e775e9759d4701bd9b43c22f1d1be73c1262b2752bb23cb3857485daf1dcad2d","other":"e5d794d64003725a74642f097c0ee76706d78419b6f3ea819d440bc0ad166eac","up":true},{"one":"fe316679eca0e0eb823325812a56fd27da02653b06ada2fd03b27501bda8371a","other":"fe2167fd33f383110eb3f6caa7bd905ca54fa0c810f1b8a34483a846f3cbddab","up":true},{"one":"c8986871e46f001d15ed8b70f2aa0fea8ae309d5e5671a500f619e3b348c8c15","other":"c9f5acafbbf8c66647de05b0848d79451eee490709d53f118fc2051410cc8203","up":true},{"one":"f5b24a1fd2cd2908b408562f9a265ee1a692b137e770137afa5fdfa07b237221","other":"f4e09f89287bd1af7833acd85ba7cc71fdb3ff34f2f409e1cf2a878dcd3183dc","up":true},{"one":"444722a15b01a0d8e6794798d239fe621d59bdfc08823ab47cbd8b9acebd23b4","other":"41092c852fac630df2a9ca0862716f8e9fb8566c904a49c96389071046bc699d","up":true},{"one":"66e7fc2df51f5df8d7329851fe9357d895e9d5dfdc25f8d92bdb10a960f7e15a","other":"610334a0772d3414652b575f2caa6f2db32224907c24d06fda643db9f2ec2afe","up":true},{"one":"90765b72283f59be4cf9bf7a9e9a22fd6db701c3603cbc0817b4adf2f8e9ce08","other":"976e57d0c32227222bfd0cbb802f269bdcd52d5d33cf689c66b12c023f5fa8bf","up":true},{"one":"c441d27a5f4abaa8e3b0f040a6ef85bb8c970031d6a57503a674e36b3d6915d9","other":"c1f9e8e1d509febdf1f267bb227741e513420048a2e669ac9eef4b05a29cf10b","up":true},{"one":"17db15893bf39b42593ee1de975aba6832046d9da5b4b493ec44272738a29cef","other":"13d6cb9316e289923e2d1de7f3c966d0cbabce3acdb8017122944f4abb140912","up":true},{"one":"baddc778aea97acdbbb5bc99744a5545abab9f6047c81f328761645287ac391c","other":"b89793c3ccd9ea642080728732ce7df33778653fed3d1d8f3a25e60670e33325","up":true},{"one":"6e68ea86440706a0d73a9508f2247492543163f8fa7e2dc2aa62b74d50261b8b","other":"6ecb5c36fc0150c287446ae8a8682d629a1d39341230717206219babe3bdf659","up":true},{"one":"c49caff13862dc089f1f9b8180d6efa455648375662719272102c4f8028799d6","other":"c1f9e8e1d509febdf1f267bb227741e513420048a2e669ac9eef4b05a29cf10b","up":true},{"one":"4646fe4c119078738612b44a356089b3c73a08e11cfd910675d211ae6b20b8fd","other":"46fee69dad8b6a6a87d356d10db25d835a0c4e154bf179e88fb4cc65f97d72d7","up":true},{"one":"fe316679eca0e0eb823325812a56fd27da02653b06ada2fd03b27501bda8371a","other":"fbc8087a723c564ca0139329902e79748af46699ea7be24d57909a7e8e96f681","up":true},{"one":"20aeb14f567dd16f06b0d3b589b83283daa00a5ed10e447860bda946baccdd2d","other":"21a044e772b7c955fe4a6fb7c3a9a20e95d48b7fd6b9518741782f04f5f1f5c2","up":true},{"one":"b5025d153581d333b44df4b9bfa69d87de138905172e4fd317e16f7099a5fcf8","other":"b7cafed41dac01dd59e2bcaeaaab551ebfeab8eaa1f97c1866fe0ddae772807b","up":true},{"one":"49eaad68d23dd63ef26029fa3f4e2578f3deca8708bbc838750d8b6dbe9eaa38","other":"49cd1efed6a56a78af4ea4ab40813013e76c6a5fb9d2029ee02db5d80f5e41a6","up":true},{"one":"b5b24532d2810e311e10b1d606baf6007f9124b88a178b32713cf1eddae089be","other":"b02b01a5c37cb05c287a3dc7d04e305de26f8d62dc388542eeb43e97db7b4282","up":true},{"one":"03ccd8d52597d18c0b178ab7361d847d63aad3af920a28345977ae170a1dafcd","other":"06618d829a8a7317a98f1a40ecf8864e1c94c4e270a9e4c008229dc7cf937b7e","up":true},{"one":"f773b83f1a1de2ab6660edb0b765cfccec6778061ee25c5a84f968625686ef60","other":"f629b8b9e79c75ac559daf9bf4fc8672bfdd595cf2c5d17a8885282626fc65a5","up":true},{"one":"02d85b9f8e4776224ae5088683a87837b82b2bfb7e047cf373a28393e7aca6e1","other":"00c6488a842ece7a8b0daf064e405de03a4257d308840ea52bfd48d23f54d895","up":true},{"one":"0c64e5af869b1665fd4016ae6d04c8eedd423636f06d78ecb944ee8e3272a82a","other":"0c28cd1315890629896d0fe5517524d4eb788f7444709c135ea690ba4e6103d5","up":true},{"one":"6967e7438125c2045d575eb9f407b4a38d1bf9dcd1c1c1a97f750da6a21aeff7","other":"6ecb5c36fc0150c287446ae8a8682d629a1d39341230717206219babe3bdf659","up":true},{"one":"0de3915b0bcc68040c8aa76fbd2cfa0714e9b34c9dbe0838a7cba81c4f73581c","other":"0a005eb9c10c5cc9f720cfec2a655811d391671597b4f32d12df291ec76b2c13","up":true},{"one":"17db15893bf39b42593ee1de975aba6832046d9da5b4b493ec44272738a29cef","other":"11d43f6ed0ddd5afa5c8a7abf7c62a4fa865b7a25ee295bf1a49701ef3081363","up":true},{"one":"d887070a0568282c69e96ce65612ba72d5ea26b5c80671435d6e1ed2c4b49301","other":"d29941d6b8acd86cf32fd1c2181da3ab1da3c2083134b068ca49ce29aa86b783","up":true},{"one":"3630e05326bacea8fcc739dec42085f845f416ddc698c76ff91f099eb1dc5007","other":"378e7af7cc019186d4f2699e753e2d71302f8f3565572c13b7a1b1c5cb47443c","up":true},{"one":"47bfa3767cefcc0831d410d5402e9396e8a412c8c96faf55b451d3ff310f3b02","other":"41d9c03e44bec3f84a6139ce40ef1e390530f38ed11860575acfad03a49db095","up":true},{"one":"499036eb9d10fc003c903f09ea0ee00c0d27b39564988d67ae111f3473d22f07","other":"4ac755123dcc64ef44db9280311af51f3f7a93e0dee67370d673261220356eb9","up":true},{"one":"53087084708cc5ee63ac459b18fa10ae52a823139b4ecba6c8691d4934f2f971","other":"574f65867482091aee2774033116c233525eea711706b5ae9ba09b54e896d302","up":true},{"one":"f7baef876a62b92ebe5ca9ec6a085e0eb54fd31e2425e662eec747df3cd77592","other":"f45f1f2e59e947e04fa15bcf87f872ef6d73b73f778e12d1f9b8930ea166eefc","up":true},{"one":"7290cd3affade5f9e729d1b03549aceafb2576cdbc6789fd688c95495f10bacd","other":"7dd3078c71087ab88d4d26a962820bcb79b8ce30e91c1f9a69d4bf8d38086960","up":true},{"one":"4e5a46c004e85cf86a02fdfbf2243018825d015debfb9a077a1283d302293b3a","other":"49cd1efed6a56a78af4ea4ab40813013e76c6a5fb9d2029ee02db5d80f5e41a6","up":true},{"one":"976e57d0c32227222bfd0cbb802f269bdcd52d5d33cf689c66b12c023f5fa8bf","other":"90a85cb7363ede161ec21cc89f8b9d4350e566cf10586a66d31b0a8677620aa1","up":true},{"one":"ec52270604007673d1bfda1edbd8bfa945a21141efd85e42b684a9f30f8cddae","other":"ed2d3e1e5693b44494808907c98ec54d6d08331945d2a2c03e31130fef1d2586","up":true},{"one":"0a005eb9c10c5cc9f720cfec2a655811d391671597b4f32d12df291ec76b2c13","other":"0c28cd1315890629896d0fe5517524d4eb788f7444709c135ea690ba4e6103d5","up":true},{"one":"610334a0772d3414652b575f2caa6f2db32224907c24d06fda643db9f2ec2afe","other":"60d7337ef806be95ccaf7b9d663a4289f9afc68edced62904ab50601cf113f45","up":true},{"one":"0de3915b0bcc68040c8aa76fbd2cfa0714e9b34c9dbe0838a7cba81c4f73581c","other":"0b72054403f78a64a787f46e9f26bf0de7bbba5a60cb105e6aeea46cb4a1d9fe","up":true},{"one":"f773b83f1a1de2ab6660edb0b765cfccec6778061ee25c5a84f968625686ef60","other":"f7fa2986ec9f84822b11a6b00bd03a1dd26f2a0fab90b1b308f08caead43cfe1","up":true},{"one":"ec52270604007673d1bfda1edbd8bfa945a21141efd85e42b684a9f30f8cddae","other":"ee5e77df690329c132f2f7fca223cfd384b7bc34ec38763a4eb42780e0585656","up":true},{"one":"f7fa2986ec9f84822b11a6b00bd03a1dd26f2a0fab90b1b308f08caead43cfe1","other":"f4e09f89287bd1af7833acd85ba7cc71fdb3ff34f2f409e1cf2a878dcd3183dc","up":true},{"one":"82dd83838cb982b89505ef249d353a20e434346dd78b71cd9b809f71d5c112da","other":"898d2f7d46b4961b646d5a6142d54d6233b7f80f668ce234522dd02e2cc545cb","up":true},{"one":"6c4dcdfdee0164a9a3f419430726dd51f9198c65ff6e7de7aaa6f632dcde6794","other":"6f5f5a77e6092e25e5308413e02ba62c1c559024893a7fb98e26b0f34fed8bfe","up":true},{"one":"6967e7438125c2045d575eb9f407b4a38d1bf9dcd1c1c1a97f750da6a21aeff7","other":"6f5f5a77e6092e25e5308413e02ba62c1c559024893a7fb98e26b0f34fed8bfe","up":true},{"one":"13d6cb9316e289923e2d1de7f3c966d0cbabce3acdb8017122944f4abb140912","other":"140020a23a840b8840ba0c2c384f853a606330e9743885e9967cf49533db282e","up":true},{"one":"f7fa2986ec9f84822b11a6b00bd03a1dd26f2a0fab90b1b308f08caead43cfe1","other":"f31cc744ea921fee8364c5269b1ce7ec6b5f0c0cbb6885efbf602de5b36f6169","up":true},{"one":"14dfb8414d17b2df15eaf59571a8cfec99b1fd674561da63ee99af853bda07da","other":"140020a23a840b8840ba0c2c384f853a606330e9743885e9967cf49533db282e","up":true},{"one":"45584a4bebb948ef5f7b55d4846ec5549d7623682169c0edcab5b3523e68c7da","other":"41092c852fac630df2a9ca0862716f8e9fb8566c904a49c96389071046bc699d","up":true},{"one":"499036eb9d10fc003c903f09ea0ee00c0d27b39564988d67ae111f3473d22f07","other":"49cd1efed6a56a78af4ea4ab40813013e76c6a5fb9d2029ee02db5d80f5e41a6","up":true},{"one":"1a2a0e0bbf83cd40936995674418ae469aa2b92876a4ceeabd8128f536b7d7a2","other":"19faaf891eb6a716902ec29d201dc2094ee474acff188ae86faf9760674b2d37","up":true},{"one":"444722a15b01a0d8e6794798d239fe621d59bdfc08823ab47cbd8b9acebd23b4","other":"4646fe4c119078738612b44a356089b3c73a08e11cfd910675d211ae6b20b8fd","up":true},{"one":"77d2ec52dabd5d7f326d4c6afd2aad110487c6bdffa2984060528716ba873462","other":"7dd3078c71087ab88d4d26a962820bcb79b8ce30e91c1f9a69d4bf8d38086960","up":true},{"one":"217f9952af1eb58d5ca5ac7be763716cfe2c0a4f3cdd4ebe4b5df563f919e2d2","other":"21a044e772b7c955fe4a6fb7c3a9a20e95d48b7fd6b9518741782f04f5f1f5c2","up":true},{"one":"444722a15b01a0d8e6794798d239fe621d59bdfc08823ab47cbd8b9acebd23b4","other":"41d9c03e44bec3f84a6139ce40ef1e390530f38ed11860575acfad03a49db095","up":true},{"one":"0af9a57a2f66835cd3e4e71bc026013a8a99ca337a7b6b6cc34e11d8da212a4f","other":"0d8a919207fb2d5718eab7da95f8efeb01a4e1ae39602d315f8ba2ff1752d9da","up":true},{"one":"0d8a919207fb2d5718eab7da95f8efeb01a4e1ae39602d315f8ba2ff1752d9da","other":"0e5e0bb1383b2ec569b157a1d2ae6900592ab892a28367f5613a4e29cb265088","up":true},{"one":"0b72054403f78a64a787f46e9f26bf0de7bbba5a60cb105e6aeea46cb4a1d9fe","other":"0d8a919207fb2d5718eab7da95f8efeb01a4e1ae39602d315f8ba2ff1752d9da","up":true},{"one":"96fcf14c7f90350091ac6fcb58306ccfb9e4a38d3da59f8ab656854332844cbd","other":"90a85cb7363ede161ec21cc89f8b9d4350e566cf10586a66d31b0a8677620aa1","up":true},{"one":"0d8a919207fb2d5718eab7da95f8efeb01a4e1ae39602d315f8ba2ff1752d9da","other":"0fc59bd04ac9de3195e3c9d0eb573952a5805dd2e7e572078b6e996778adec73","up":true},{"one":"f629b8b9e79c75ac559daf9bf4fc8672bfdd595cf2c5d17a8885282626fc65a5","other":"f4e09f89287bd1af7833acd85ba7cc71fdb3ff34f2f409e1cf2a878dcd3183dc","up":true}]} \ No newline at end of file diff --git a/vendor/github.com/ethereum/go-ethereum/swarm/network/stream/testing/snapshot_32.json b/vendor/github.com/ethereum/go-ethereum/swarm/network/stream/testing/snapshot_32.json deleted file mode 100644 index 527474d0..00000000 --- a/vendor/github.com/ethereum/go-ethereum/swarm/network/stream/testing/snapshot_32.json +++ /dev/null @@ -1 +0,0 @@ -{"nodes":[{"node":{"info":{"id":"427f4bdfd3857968af5da36eeea041938ea771bc6c5e90ee8d3585cf579f13b7","name":"node_427f4bdfd3857968af5da36eeea041938ea771bc6c5e90ee8d3585cf579f13b7","enode":"enode://e94f375f0c1c7974305cf5d1fecd64491ad73661ce194a272f674e89051c5d5b951abfebae5a5fa9dbc8a26adeec802ea6188fdf67b7577fabf7355e92cc5d27@127.0.0.1:0","enr":"0xf88fb840ec3deb0830cbb5f0f9a78c5de4a7ca5fdecd378778a9255dad6ed45bd13d5ee61278d01af7de31abfce7aeb9e6d5421c0f614db1be5e98fc2fc82806a56fdd590183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103e94f375f0c1c7974305cf5d1fecd64491ad73661ce194a272f674e89051c5d5b","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"Qn9L39OFeWivXaNu7qBBk46ncbxsXpDujTWFz1efE7c=","hive":"\n=========================================================================\nThu Feb 28 18:01:09 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 427f4b\npopulation: 9 (31), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 e4f7 d756 | 15 e4f7 (0) eed4 (0) f4b8 (0) fb64 (0)\n001 2 2529 2f17 | 5 2f17 (0) 2529 (0) 2643 (0) 08ff (0)\n002 2 76cb 6ef5 | 8 76cb (0) 74b7 (0) 729a (0) 6646 (0)\n003 1 577b | 1 577b (0)\n============ DEPTH: 4 ==========================================\n004 1 4c5f | 1 4c5f (0)\n005 1 4601 | 1 4601 (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"427f4bdfd3857968af5da36eeea041938ea771bc6c5e90ee8d3585cf579f13b7","private_key":"fcb9f591c3d058107af08804ccd4dfda279051673a0b48360a625d6df6a02de9","name":"node_427f4bdfd3857968af5da36eeea041938ea771bc6c5e90ee8d3585cf579f13b7","services":["streamer"],"enable_msg_events":true,"port":45919},"up":true}},{"node":{"info":{"id":"6ef5de5c1c8e55bc89948bf10a7a2ad11b07170f3b5f049e40a85e244124eee4","name":"node_6ef5de5c1c8e55bc89948bf10a7a2ad11b07170f3b5f049e40a85e244124eee4","enode":"enode://bad4b2d1652369de53e8b0f8f6c150f6bc3b38fb2f0d308b9f04d67964fa9440fc07581d83ba0e665be33aeadaf738bd53f4bbecfe55e4fc31c5af587ef74c8e@127.0.0.1:0","enr":"0xf88fb840f17e139df282d76ab7238fe8faa15fb41d782a0664a4732df0f7ade8fbb865db350f23fdf65ac06bff32805a321d85092a22e6b315fc0400a4ef16b16f215f200183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102bad4b2d1652369de53e8b0f8f6c150f6bc3b38fb2f0d308b9f04d67964fa9440","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"bvXeXByOVbyJlIvxCnoq0RsHFw87XwSeQKheJEEk7uQ=","hive":"\n=========================================================================\nThu Feb 28 18:01:09 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 6ef5de\npopulation: 12 (31), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 eed4 e4f7 | 15 e4f7 (0) eed4 (0) f4b8 (0) fb64 (0)\n001 2 2643 11bd | 5 2f17 (0) 2529 (0) 2643 (0) 08ff (0)\n002 2 577b 427f | 4 577b (0) 4c5f (0) 4601 (0) 427f (0)\n003 2 729a 76cb | 3 76cb (0) 74b7 (0) 729a (0)\n============ DEPTH: 4 ==========================================\n004 4 6013 6304 62ac 6646 | 4 6646 (0) 6013 (0) 62ac (0) 6304 (0)\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"6ef5de5c1c8e55bc89948bf10a7a2ad11b07170f3b5f049e40a85e244124eee4","private_key":"9f0d5a60a7b0980371a7eef29848b7d3c4273955e10456b6bdc71881ee7154eb","name":"node_6ef5de5c1c8e55bc89948bf10a7a2ad11b07170f3b5f049e40a85e244124eee4","services":["streamer"],"enable_msg_events":true,"port":37449},"up":true}},{"node":{"info":{"id":"11bd810f7ba41f44816f33a19d9c703d26f2ccaea28c4af825f52888070ad8d7","name":"node_11bd810f7ba41f44816f33a19d9c703d26f2ccaea28c4af825f52888070ad8d7","enode":"enode://4b00f923b2c2e9c70b840f0c0e90d0941bb0875cca7fa12ec8f43c5eeb563448b209ae04c2a8e7e6e9cf2a9e9ab9ffb3c6d463db1351d8a990be553742f34fe7@127.0.0.1:0","enr":"0xf88fb8400c58fcc017555e27e75db6ed84521f731670fb55dd5e1f57543d23daf810a39a4ea3d74ca6680f4fb340829a17fd81d21c970e3feb3f9a04b8d1c29f974c75930183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1034b00f923b2c2e9c70b840f0c0e90d0941bb0875cca7fa12ec8f43c5eeb563448","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"Eb2BD3ukH0SBbzOhnZxwPSbyzK6ijEr4JfUoiAcK2Nc=","hive":"\n=========================================================================\nThu Feb 28 18:01:09 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 11bd81\npopulation: 12 (31), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 cbd4 9e27 | 15 cbd4 (0) d756 (0) eed4 (0) e4f7 (0)\n001 6 577b 729a 76cb 6304 | 12 577b (0) 4c5f (0) 4601 (0) 427f (0)\n============ DEPTH: 2 ==========================================\n002 3 2529 2643 2f17 | 3 2f17 (0) 2529 (0) 2643 (0)\n003 1 08ff | 1 08ff (0)\n004 0 | 0\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"11bd810f7ba41f44816f33a19d9c703d26f2ccaea28c4af825f52888070ad8d7","private_key":"ff99d767a883944922bbba96c25e19cb78641c0e9f32b2de37db70a29151473f","name":"node_11bd810f7ba41f44816f33a19d9c703d26f2ccaea28c4af825f52888070ad8d7","services":["streamer"],"enable_msg_events":true,"port":43277},"up":true}},{"node":{"info":{"id":"9e276cdb622215089f0f20252a6aba20f57521df94d401efa13f604b62534c80","name":"node_9e276cdb622215089f0f20252a6aba20f57521df94d401efa13f604b62534c80","enode":"enode://1140e5da7f3da364ca5e55f8598cd121887f4b1c780b8900f090cd35ef5b52873dad20397e7d2d1ba3da0c1c16df19be8d373165c5fe8af1fcab7c3daaa501aa@127.0.0.1:0","enr":"0xf88fb8400194560390e74c85e87bea47d73cf330581219f8acc6a7c4e5941f10b3d2970326116cf7258109729e7226bcc66d4624264aa4d717825090b70494d0664452810183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1021140e5da7f3da364ca5e55f8598cd121887f4b1c780b8900f090cd35ef5b5287","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"nids22IiFQifDyAlKmq6IPV1Id+U1AHvoT9gS2JTTIA=","hive":"\n=========================================================================\nThu Feb 28 18:01:09 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 9e276c\npopulation: 9 (31), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 11bd 4c5f | 17 2f17 (0) 2529 (0) 2643 (0) 08ff (0)\n001 2 d756 cbd4 | 7 cbd4 (0) d756 (0) eed4 (0) e4f7 (0)\n002 2 a11b bf27 | 4 bf27 (0) a11b (0) aa7e (0) ad46 (0)\n============ DEPTH: 3 ==========================================\n003 0 | 0\n004 1 94a2 | 1 94a2 (0)\n005 1 9934 | 1 9934 (0)\n006 1 9c93 | 1 9c93 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"9e276cdb622215089f0f20252a6aba20f57521df94d401efa13f604b62534c80","private_key":"5509584c52b0fc75d12256db74098c2d08e2a03d515c415f6760c94ee65396a7","name":"node_9e276cdb622215089f0f20252a6aba20f57521df94d401efa13f604b62534c80","services":["streamer"],"enable_msg_events":true,"port":42197},"up":true}},{"node":{"info":{"id":"4c5fabb7a17c3a3f589c7d2eca3c0dd5a6b8217aabc54323bab75b6af383ac6c","name":"node_4c5fabb7a17c3a3f589c7d2eca3c0dd5a6b8217aabc54323bab75b6af383ac6c","enode":"enode://b4b928549c694b7d425330835de106ba3900fed27db077d7ef47b9de24d3f171dce1edfb7bc05dbb087d1935b11690fdefeeb8d52cb86c400241c739408077b0@127.0.0.1:0","enr":"0xf88fb8404932a241c860d9e3781f3d3e3dc57c0d0e9aa03ee53aa2e9cf343ca198f189e26f5912ca878cccc0b0e91669105af390f60cd802aa9c4d858eec97139ead6ab40183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102b4b928549c694b7d425330835de106ba3900fed27db077d7ef47b9de24d3f171","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"TF+rt6F8Oj9YnH0uyjwN1aa4IXqrxUMjurdbavODrGw=","hive":"\n=========================================================================\nThu Feb 28 18:01:09 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 4c5fab\npopulation: 16 (31), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 ad46 9934 9c93 9e27 | 15 cbd4 (0) d756 (0) eed4 (0) e4f7 (0)\n001 2 2529 2f17 | 5 2f17 (0) 2529 (0) 2643 (0) 08ff (0)\n002 7 6304 62ac 6013 6646 | 8 729a (0) 76cb (0) 74b7 (0) 6646 (0)\n003 1 577b | 1 577b (0)\n============ DEPTH: 4 ==========================================\n004 2 4601 427f | 2 427f (0) 4601 (0)\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"4c5fabb7a17c3a3f589c7d2eca3c0dd5a6b8217aabc54323bab75b6af383ac6c","private_key":"c8a57fa979d839a728714a0cc091d9c35560d850ce2faa0431b758abd3363c79","name":"node_4c5fabb7a17c3a3f589c7d2eca3c0dd5a6b8217aabc54323bab75b6af383ac6c","services":["streamer"],"enable_msg_events":true,"port":37685},"up":true}},{"node":{"info":{"id":"ad4643583aa082b3bef7ce1bb8dcf55fe2e321b8954000cfac6bc72c49e85f50","name":"node_ad4643583aa082b3bef7ce1bb8dcf55fe2e321b8954000cfac6bc72c49e85f50","enode":"enode://a1662488c10698fca196fe9453c596e65bcc779371b4d765754a24a188cd6b680c1c8e07e21686f6caf4241f9e661ceddbbf57663a59fd739d4d01d845ca26f5@127.0.0.1:0","enr":"0xf88fb840e0f39d0e5ddeae60c3fd876087f642a075cea50df66869f0ab54b49f320750ed3f59eb3a2f096cbf67fbc0eb018b819416073d12c1d4c8d14b02697b305448fe0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103a1662488c10698fca196fe9453c596e65bcc779371b4d765754a24a188cd6b68","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"rUZDWDqggrO+984buNz1X+LjIbiVQADPrGvHLEnoX1A=","hive":"\n=========================================================================\nThu Feb 28 18:01:09 UTC 2019 KΛÐΞMLIΛ hive: queen's address: ad4643\npopulation: 9 (31), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 2643 4c5f | 17 11bd (0) 08ff (0) 2f17 (0) 2529 (0)\n001 2 d756 cbd4 | 7 cbd4 (0) d756 (0) eed4 (0) e4f7 (0)\n002 2 9c93 9934 | 4 9934 (0) 9c93 (0) 9e27 (0) 94a2 (0)\n003 1 bf27 | 1 bf27 (0)\n============ DEPTH: 4 ==========================================\n004 1 a11b | 1 a11b (0)\n005 1 aa7e | 1 aa7e (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"ad4643583aa082b3bef7ce1bb8dcf55fe2e321b8954000cfac6bc72c49e85f50","private_key":"4bfc56ea8d973de3d6f451825ca9fcfcb36e1d6624c0f1d1641bee8e6683bc59","name":"node_ad4643583aa082b3bef7ce1bb8dcf55fe2e321b8954000cfac6bc72c49e85f50","services":["streamer"],"enable_msg_events":true,"port":45407},"up":true}},{"node":{"info":{"id":"2643083442ee9e69517f5008e4ca54dbfa40726bde22216b53bf903895aa0ae0","name":"node_2643083442ee9e69517f5008e4ca54dbfa40726bde22216b53bf903895aa0ae0","enode":"enode://40b0f23d8cdc7ece33f3ebe012b2ad3c7b5d78c141883364116214d980d525cbd06bfce04c2312415cdbf028886a45ce1ff0e8b997c2a8b692415d5087f34641@127.0.0.1:0","enr":"0xf88fb8402fa9bc618382dbb09eb218dc9c159ceaf6b7f5daf74d44a16a47906fc9beaa9e2bdb5b7f188450d97625ec4536570e127e386356252f969bfe411c70d4c6d6390183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10340b0f23d8cdc7ece33f3ebe012b2ad3c7b5d78c141883364116214d980d525cb","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"JkMINELunmlRf1AI5MpU2/pAcmveIiFrU7+QOJWqCuA=","hive":"\n=========================================================================\nThu Feb 28 18:01:09 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 264308\npopulation: 11 (31), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 f9ca ad46 94a2 | 15 cbd4 (0) d756 (0) eed4 (0) e4f7 (0)\n001 4 6013 6646 6ef5 74b7 | 12 6ef5 (0) 6646 (0) 62ac (0) 6304 (0)\n002 2 08ff 11bd | 2 11bd (0) 08ff (0)\n============ DEPTH: 3 ==========================================\n003 0 | 0\n004 1 2f17 | 1 2f17 (0)\n005 0 | 0\n006 1 2529 | 1 2529 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"2643083442ee9e69517f5008e4ca54dbfa40726bde22216b53bf903895aa0ae0","private_key":"de0328d5a7218ee32122b35212270355692c913773c59472d65894e53fac078c","name":"node_2643083442ee9e69517f5008e4ca54dbfa40726bde22216b53bf903895aa0ae0","services":["streamer"],"enable_msg_events":true,"port":37731},"up":true}},{"node":{"info":{"id":"94a2afa6bc12fe95765f09f57828c77cc9ea473cd0e9e655ca9f46e1bbabae22","name":"node_94a2afa6bc12fe95765f09f57828c77cc9ea473cd0e9e655ca9f46e1bbabae22","enode":"enode://943fb91f74aa53ab508162a6a27dec3da1265ead68613c62d2a8f6b75ca0862b94fb31c62d341adfaf3cba1b76a202633d46fc3b36115454b2fa4eaed4697376@127.0.0.1:0","enr":"0xf88fb8402f7f395a5e543c79b6700821d943be0527fff861c0faa5ad5ba3084922ac6733115483c5bb7d7d238ca7689f756d5814d916c5cefb739e622cfd7842f0392daa0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102943fb91f74aa53ab508162a6a27dec3da1265ead68613c62d2a8f6b75ca0862b","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"lKKvprwS/pV2Xwn1eCjHfMnqRzzQ6eZVyp9G4burriI=","hive":"\n=========================================================================\nThu Feb 28 18:01:09 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 94a2af\npopulation: 13 (31), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 62ac 2529 2643 | 17 6ef5 (0) 6646 (0) 62ac (0) 6304 (0)\n001 5 eed4 e4f7 f4b8 fb64 | 7 cbd4 (0) d756 (0) eed4 (0) e4f7 (0)\n002 2 a11b bf27 | 4 bf27 (0) a11b (0) aa7e (0) ad46 (0)\n============ DEPTH: 3 ==========================================\n003 0 | 0\n004 3 9c93 9e27 9934 | 3 9934 (0) 9c93 (0) 9e27 (0)\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"94a2afa6bc12fe95765f09f57828c77cc9ea473cd0e9e655ca9f46e1bbabae22","private_key":"830a6d825c4e4bd95f3f10d11739fcceb8aa5299d256b9530ee1c7928d4daa83","name":"node_94a2afa6bc12fe95765f09f57828c77cc9ea473cd0e9e655ca9f46e1bbabae22","services":["streamer"],"enable_msg_events":true,"port":39189},"up":true}},{"node":{"info":{"id":"f9cac95b4c91bea670e5e672bc64e400e63de0b55c423eda5f1499cf218eb244","name":"node_f9cac95b4c91bea670e5e672bc64e400e63de0b55c423eda5f1499cf218eb244","enode":"enode://c65f56752b8a6c94d1b6aff48cdcb120cc05451e84e37a9af3284bc09212a1418f67818e62449dc6939cde59f698b48437516d84c29f89cb8ac9078838c53549@127.0.0.1:0","enr":"0xf88fb840dfd8ab1f1fa9679d9c6e818c3b9e3fc25c9ae3d006363c318df0eca480300692324e71c7c66011df3e78f5b8044c0714a7ac208dcddf8a1cb59fad30400d4f8e0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103c65f56752b8a6c94d1b6aff48cdcb120cc05451e84e37a9af3284bc09212a141","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"+crJW0yRvqZw5eZyvGTkAOY94LVcQj7aXxSZzyGOskQ=","hive":"\n=========================================================================\nThu Feb 28 18:01:09 UTC 2019 KΛÐΞMLIΛ hive: queen's address: f9cac9\npopulation: 10 (31), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 2643 74b7 | 17 2643 (0) 2529 (0) 2f17 (0) 11bd (0)\n001 2 bf27 94a2 | 8 bf27 (0) a11b (0) ad46 (0) aa7e (0)\n002 2 d756 cbd4 | 2 cbd4 (0) d756 (0)\n003 2 e4f7 eed4 | 2 eed4 (0) e4f7 (0)\n============ DEPTH: 4 ==========================================\n004 1 f4b8 | 1 f4b8 (0)\n005 0 | 0\n006 1 fb64 | 1 fb64 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"f9cac95b4c91bea670e5e672bc64e400e63de0b55c423eda5f1499cf218eb244","private_key":"74feff500b31c6440e380f5bdd141aa2925f0abf00745572b50929d2244efe98","name":"node_f9cac95b4c91bea670e5e672bc64e400e63de0b55c423eda5f1499cf218eb244","services":["streamer"],"enable_msg_events":true,"port":37021},"up":true}},{"node":{"info":{"id":"74b720fcd93ff907e0a2f9c8f62e9315e64c2fcd023184ebddfd485d782ba95f","name":"node_74b720fcd93ff907e0a2f9c8f62e9315e64c2fcd023184ebddfd485d782ba95f","enode":"enode://68cd12c71355f1284f696a0c62da83c4088e91a867af6368efdd74ce3d7eff265e1589cb822ef12e50c8626eeb8eb774893fc9016f33d8458f268c44bfe7074c@127.0.0.1:0","enr":"0xf88fb840d287a3644573ef6ebbc18a1e6fb2782814e728d6a430103bf57e1dc4ff67c6c24f44514803e4eb41bce24de090ffbe118ebebe127131f9ab9a60dc1ac8a8f0c60183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10268cd12c71355f1284f696a0c62da83c4088e91a867af6368efdd74ce3d7eff26","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"dLcg/Nk/+QfgovnI9i6TFeZML80CMYTr3f1IXXgrqV8=","hive":"\n=========================================================================\nThu Feb 28 18:01:09 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 74b720\npopulation: 12 (31), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 bf27 f9ca | 15 bf27 (0) a11b (0) ad46 (0) aa7e (0)\n001 2 2529 2643 | 5 2643 (0) 2529 (0) 2f17 (0) 11bd (0)\n002 2 4c5f 577b | 4 577b (0) 4c5f (0) 427f (0) 4601 (0)\n003 4 6646 6304 62ac 6013 | 5 6ef5 (0) 6646 (0) 62ac (0) 6304 (0)\n============ DEPTH: 4 ==========================================\n004 0 | 0\n005 1 729a | 1 729a (0)\n006 1 76cb | 1 76cb (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"74b720fcd93ff907e0a2f9c8f62e9315e64c2fcd023184ebddfd485d782ba95f","private_key":"83492b92e97ad908351537aa0f01d5614452490cf85d56215d3006e338bb389c","name":"node_74b720fcd93ff907e0a2f9c8f62e9315e64c2fcd023184ebddfd485d782ba95f","services":["streamer"],"enable_msg_events":true,"port":44117},"up":true}},{"node":{"info":{"id":"6013d40c0c15f5a7b1ddd5a8ef6a80757de9022b208535938b0937b9150771e0","name":"node_6013d40c0c15f5a7b1ddd5a8ef6a80757de9022b208535938b0937b9150771e0","enode":"enode://8cda75928f71a74705a2ed5f5be1de1c8691e042595382f84f23bebbbe69477e0ba0a568d97fe91e18861bdc4e7c9c0d9a466e22f6e00beab183543e864f4769@127.0.0.1:0","enr":"0xf88fb840a1c957342355083dacdeffbfef817d1a37e22e1bbb4ff136c9815dcf336050f93ae809fb2490493975a93d6f949147035cc66f88d474bf97f76a3eb34134c9b60183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1038cda75928f71a74705a2ed5f5be1de1c8691e042595382f84f23bebbbe69477e","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"YBPUDAwV9aex3dWo72qAdX3pAisghTWTiwk3uRUHceA=","hive":"\n=========================================================================\nThu Feb 28 18:01:09 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 6013d4\npopulation: 12 (31), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 bf27 e4f7 | 15 bf27 (0) a11b (0) ad46 (0) aa7e (0)\n001 2 2643 2f17 | 5 2f17 (0) 2643 (0) 2529 (0) 11bd (0)\n002 2 4c5f 577b | 4 577b (0) 4c5f (0) 427f (0) 4601 (0)\n003 2 729a 74b7 | 3 729a (0) 76cb (0) 74b7 (0)\n004 1 6ef5 | 1 6ef5 (0)\n005 1 6646 | 1 6646 (0)\n============ DEPTH: 6 ==========================================\n006 2 6304 62ac | 2 62ac (0) 6304 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"6013d40c0c15f5a7b1ddd5a8ef6a80757de9022b208535938b0937b9150771e0","private_key":"2275b1fd6c200d65748673efc3a9afdd59ff34baf765acaf0f008a928367dd28","name":"node_6013d40c0c15f5a7b1ddd5a8ef6a80757de9022b208535938b0937b9150771e0","services":["streamer"],"enable_msg_events":true,"port":40301},"up":true}},{"node":{"info":{"id":"e4f776dddd9e476608fb335ab22fff1836309b9440ee4ee0fd37a2ba7fca8507","name":"node_e4f776dddd9e476608fb335ab22fff1836309b9440ee4ee0fd37a2ba7fca8507","enode":"enode://69efa89de7d90f3f3edad743eef4e6e36934a6a14fa9e9e1080320e890a94a7da29546296e7bcd07d2b061ee43e244f07340fb03a1a3b269f92feddacd0a9b67@127.0.0.1:0","enr":"0xf88fb840ff8a7a209199998d93974593321244f0a2ee30732cdda0e24ea6aa4dc0d6f9a42a576b74fd95f259aa67c31deec2b7d34e85330281f60bfceca4d877a7745cda0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10369efa89de7d90f3f3edad743eef4e6e36934a6a14fa9e9e1080320e890a94a7d","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"5Pd23d2eR2YI+zNasi//GDYwm5RA7k7g/Teiun/KhQc=","hive":"\n=========================================================================\nThu Feb 28 18:01:09 UTC 2019 KΛÐΞMLIΛ hive: queen's address: e4f776\npopulation: 11 (31), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 427f 6ef5 6013 | 17 2f17 (0) 2643 (0) 2529 (0) 11bd (0)\n001 2 9934 94a2 | 8 94a2 (0) 9934 (0) 9e27 (0) 9c93 (0)\n002 2 d756 cbd4 | 2 cbd4 (0) d756 (0)\n============ DEPTH: 3 ==========================================\n003 3 f4b8 f9ca fb64 | 3 f4b8 (0) f9ca (0) fb64 (0)\n004 1 eed4 | 1 eed4 (0)\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"e4f776dddd9e476608fb335ab22fff1836309b9440ee4ee0fd37a2ba7fca8507","private_key":"4c402cd5bad71d24a8e1c56fa5ee6561720f8305502388535804bdc29597dc94","name":"node_e4f776dddd9e476608fb335ab22fff1836309b9440ee4ee0fd37a2ba7fca8507","services":["streamer"],"enable_msg_events":true,"port":43119},"up":true}},{"node":{"info":{"id":"fb64370bc0707215e41afb0da1a53f8aba5e11f471bae4f8dc4bd85a3b66827a","name":"node_fb64370bc0707215e41afb0da1a53f8aba5e11f471bae4f8dc4bd85a3b66827a","enode":"enode://d50974428f44cbaf9fd8c7fa9472900980d63e4682d2997b985c1185abe3450c25406281ce806a8529ce399d671123ea32b363c7ea7f65d1d897bdc336f701d3@127.0.0.1:0","enr":"0xf88fb840848de2e989e6ff63e20a5895cf88ae9de52c8db2f19690ec42f4e41e7ee318a04c3600ad148eb7bcad1aa256c4dbef4597fea0e324996af6c61d7d8fdb252db20183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103d50974428f44cbaf9fd8c7fa9472900980d63e4682d2997b985c1185abe3450c","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"+2Q3C8BwchXkGvsNoaU/irpeEfRxuuT43EvYWjtmgno=","hive":"\n=========================================================================\nThu Feb 28 18:01:09 UTC 2019 KΛÐΞMLIΛ hive: queen's address: fb6437\npopulation: 10 (31), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 2f17 4601 | 17 2f17 (0) 2643 (0) 2529 (0) 11bd (0)\n001 2 9934 94a2 | 8 94a2 (0) 9934 (0) 9e27 (0) 9c93 (0)\n002 2 d756 cbd4 | 2 cbd4 (0) d756 (0)\n003 2 eed4 e4f7 | 2 eed4 (0) e4f7 (0)\n============ DEPTH: 4 ==========================================\n004 1 f4b8 | 1 f4b8 (0)\n005 0 | 0\n006 1 f9ca | 1 f9ca (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"fb64370bc0707215e41afb0da1a53f8aba5e11f471bae4f8dc4bd85a3b66827a","private_key":"fba40333131adaf83dd0444a5f805a739af0de3f2e625a2d2a02ecbe0efbe070","name":"node_fb64370bc0707215e41afb0da1a53f8aba5e11f471bae4f8dc4bd85a3b66827a","services":["streamer"],"enable_msg_events":true,"port":46323},"up":true}},{"node":{"info":{"id":"460148b8444b714b47f09285aa0ce28dc3418cb6b9f458b5202c0533205f82a4","name":"node_460148b8444b714b47f09285aa0ce28dc3418cb6b9f458b5202c0533205f82a4","enode":"enode://7c183d9bceaff51f943081c68a318028c043466b0910f4bcdb80d8cea48ece224b458ac2c812cce8dd550b35a4fd52d07622f970b2c1aa6638ec8e62550c1da8@127.0.0.1:0","enr":"0xf88fb840fa49b18d0242ef72eb77b319e3a923d60f566facee5a69e8115a614a4be438dc4578fdb50fbfa54de817c0d391bbe60368231734f291232d222b7ea9e70ae5b30183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1027c183d9bceaff51f943081c68a318028c043466b0910f4bcdb80d8cea48ece22","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"RgFIuERLcUtH8JKFqgzijcNBjLa59Fi1ICwFMyBfgqQ=","hive":"\n=========================================================================\nThu Feb 28 18:01:09 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 460148\npopulation: 12 (31), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 fb64 9c93 aa7e | 15 cbd4 (0) d756 (0) eed4 (0) e4f7 (0)\n001 2 08ff 2f17 | 5 2f17 (0) 2643 (0) 2529 (0) 11bd (0)\n002 4 76cb 729a 6646 6304 | 8 729a (0) 76cb (0) 74b7 (0) 6ef5 (0)\n003 1 577b | 1 577b (0)\n============ DEPTH: 4 ==========================================\n004 1 4c5f | 1 4c5f (0)\n005 1 427f | 1 427f (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"460148b8444b714b47f09285aa0ce28dc3418cb6b9f458b5202c0533205f82a4","private_key":"459d2f0468a2f990289cf0a0ec59948f82ede34b97dbab4f8ddd68dd7fc9639c","name":"node_460148b8444b714b47f09285aa0ce28dc3418cb6b9f458b5202c0533205f82a4","services":["streamer"],"enable_msg_events":true,"port":35919},"up":true}},{"node":{"info":{"id":"aa7e45d4583570fe382828e4ff3d60ccd526cea01325211d87ceeb6cc14af753","name":"node_aa7e45d4583570fe382828e4ff3d60ccd526cea01325211d87ceeb6cc14af753","enode":"enode://15ce819f63a4f20fde81216cd54aa442b1e47a86085d2a887e8b482da64bc15a125a2e31dfc8b65aff9a7babe1813162e591c204e8ec3e2d37ece40c9f42eb1e@127.0.0.1:0","enr":"0xf88fb8407e05321ea1e0ebf79e030cf98817c8e7b61df62645db829c2b2699afba8443297692b19615479f37442bec12f5a6d72301a8a661cc3e391997e699f0377c87e00183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10215ce819f63a4f20fde81216cd54aa442b1e47a86085d2a887e8b482da64bc15a","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"qn5F1Fg1cP44KCjk/z1gzNUmzqATJSEdh87rbMFK91M=","hive":"\n=========================================================================\nThu Feb 28 18:01:09 UTC 2019 KΛÐΞMLIΛ hive: queen's address: aa7e45\npopulation: 9 (31), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 2f17 4601 | 17 2f17 (0) 2643 (0) 2529 (0) 11bd (0)\n001 2 d756 cbd4 | 7 cbd4 (0) d756 (0) eed4 (0) e4f7 (0)\n002 2 9934 9c93 | 4 94a2 (0) 9934 (0) 9e27 (0) 9c93 (0)\n003 1 bf27 | 1 bf27 (0)\n============ DEPTH: 4 ==========================================\n004 1 a11b | 1 a11b (0)\n005 1 ad46 | 1 ad46 (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"aa7e45d4583570fe382828e4ff3d60ccd526cea01325211d87ceeb6cc14af753","private_key":"b623e785770ec4f9bbecb44c624cc704b1a8cfbb565744fa329235d240453d32","name":"node_aa7e45d4583570fe382828e4ff3d60ccd526cea01325211d87ceeb6cc14af753","services":["streamer"],"enable_msg_events":true,"port":36243},"up":true}},{"node":{"info":{"id":"9c935faafb41a7bd3bda18a8bd022878105bf8453a5b83d2bfa4da46d8c908f8","name":"node_9c935faafb41a7bd3bda18a8bd022878105bf8453a5b83d2bfa4da46d8c908f8","enode":"enode://8eb7c4844662e4bec44d1a6c0eeea367815e9c378910f5891c6d1288ef8e695c7d1970934d8f00c26efe46d0119ba01c90f3564e2f56e3ca062713cf0161d960@127.0.0.1:0","enr":"0xf88fb8409f6890c59e203693b5137924950100d7ea0bb4095f006df9c4ea5520bc66d3536d3a5a0f8f684b7301e33c0bd9e07a11139776e1f1072758400835dbd411fa7f0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1028eb7c4844662e4bec44d1a6c0eeea367815e9c378910f5891c6d1288ef8e695c","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"nJNfqvtBp7072hiovQIoeBBb+EU6W4PSv6TaRtjJCPg=","hive":"\n=========================================================================\nThu Feb 28 18:01:09 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 9c935f\npopulation: 9 (31), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 4c5f 4601 | 17 4c5f (0) 4601 (0) 427f (0) 577b (0)\n001 2 d756 cbd4 | 7 cbd4 (0) d756 (0) fb64 (0) f9ca (0)\n002 2 ad46 aa7e | 4 bf27 (0) a11b (0) ad46 (0) aa7e (0)\n============ DEPTH: 3 ==========================================\n003 0 | 0\n004 1 94a2 | 1 94a2 (0)\n005 1 9934 | 1 9934 (0)\n006 1 9e27 | 1 9e27 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"9c935faafb41a7bd3bda18a8bd022878105bf8453a5b83d2bfa4da46d8c908f8","private_key":"3a9fc1630c5328ae9c4cfded644dab18a8eae96ddac7dc65542f37918447df3f","name":"node_9c935faafb41a7bd3bda18a8bd022878105bf8453a5b83d2bfa4da46d8c908f8","services":["streamer"],"enable_msg_events":true,"port":43587},"up":true}},{"node":{"info":{"id":"9934295fbde37d4a7f867c9a7e1f6428c4996d1b43863dbc5a2f52a546649ef0","name":"node_9934295fbde37d4a7f867c9a7e1f6428c4996d1b43863dbc5a2f52a546649ef0","enode":"enode://8f2dd1bb62e9253f7a43f26fd9de2181d827183eef6b578c4246637ed66324ef4487bcf99259f32b59dd66d2d314b939e0ec66b08917a933b4697615252093ab@127.0.0.1:0","enr":"0xf88fb8403e5081fcaca0fe89abed76a93405df6e2416d260e7986ad71d2b554ff81be728584602b1049e0767ecce05662e43acff92a0c720e9ff3068782c88c5333f53c20183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1038f2dd1bb62e9253f7a43f26fd9de2181d827183eef6b578c4246637ed66324ef","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"mTQpX73jfUp/hnyafh9kKMSZbRtDhj28Wi9SpUZknvA=","hive":"\n=========================================================================\nThu Feb 28 18:01:09 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 993429\npopulation: 17 (31), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 6304 62ac 4c5f 2f17 | 17 4c5f (0) 4601 (0) 427f (0) 577b (0)\n001 6 fb64 f4b8 eed4 e4f7 | 7 d756 (0) cbd4 (0) fb64 (0) f9ca (0)\n002 3 a11b aa7e ad46 | 4 aa7e (0) ad46 (0) a11b (0) bf27 (0)\n============ DEPTH: 3 ==========================================\n003 0 | 0\n004 1 94a2 | 1 94a2 (0)\n005 2 9e27 9c93 | 2 9e27 (0) 9c93 (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"9934295fbde37d4a7f867c9a7e1f6428c4996d1b43863dbc5a2f52a546649ef0","private_key":"498b023a2d77a2bcdf5fc8faee54349c6d9bcc7bcc3847c665145494c6395e63","name":"node_9934295fbde37d4a7f867c9a7e1f6428c4996d1b43863dbc5a2f52a546649ef0","services":["streamer"],"enable_msg_events":true,"port":33825},"up":true}},{"node":{"info":{"id":"08ff54b60307cfbbd9b209bf07c7a6f164192b80c9dd5eeadd26e368adbc7dbc","name":"node_08ff54b60307cfbbd9b209bf07c7a6f164192b80c9dd5eeadd26e368adbc7dbc","enode":"enode://0dd78993fa0c2b78e8abf537fef7b683f90255b48e4c5d62a676b4c5c06f0a9deba8777bfc8476e26af45438819993b89ab9697465a52396923ab63ea46de6d1@127.0.0.1:0","enr":"0xf88fb840df5e81a8734f5835674758db9c12bdea17ce6724347b9b3ee12ef8b19e645abe7a9ba7898badf352fe74e273f66e00800fc1a64cf4a1d94de871ef51116c5e670183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1030dd78993fa0c2b78e8abf537fef7b683f90255b48e4c5d62a676b4c5c06f0a9d","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"CP9UtgMHz7vZsgm/B8em8WQZK4DJ3V7q3SbjaK28fbw=","hive":"\n=========================================================================\nThu Feb 28 18:01:09 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 08ff54\npopulation: 10 (31), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 bf27 9934 | 15 d756 (0) cbd4 (0) fb64 (0) f9ca (0)\n001 4 729a 76cb 4601 577b | 12 4c5f (0) 4601 (0) 427f (0) 577b (0)\n============ DEPTH: 2 ==========================================\n002 3 2643 2529 2f17 | 3 2f17 (0) 2643 (0) 2529 (0)\n003 1 11bd | 1 11bd (0)\n004 0 | 0\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"08ff54b60307cfbbd9b209bf07c7a6f164192b80c9dd5eeadd26e368adbc7dbc","private_key":"ee655daff35bf421813437b35da4b5cbc518cfadeb319c82c5211d697a821466","name":"node_08ff54b60307cfbbd9b209bf07c7a6f164192b80c9dd5eeadd26e368adbc7dbc","services":["streamer"],"enable_msg_events":true,"port":45679},"up":true}},{"node":{"info":{"id":"bf27dccd6f79cc86d38ad7a375b833125aeaad060be117c23c1b71297b072c00","name":"node_bf27dccd6f79cc86d38ad7a375b833125aeaad060be117c23c1b71297b072c00","enode":"enode://890aca84b10caa9057d6dca9730544992a7bcdf38b78e82508f5be6e0b2149592fbcd837b829232ccaa8310759a27aab18addec6239becffddc5942760d3aac4@127.0.0.1:0","enr":"0xf88fb840a1b52878b681cfd6dffb3a53f24aa4920cf5b65dc92c1bed8511407085072b7f5ebc71f1a59fae35d1e8e4896b3a9ee980cb318061f8c6a6652a353633b98f700183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102890aca84b10caa9057d6dca9730544992a7bcdf38b78e82508f5be6e0b214959","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"vyfczW95zIbTitejdbgzElrqrQYL4RfCPBtxKXsHLAA=","hive":"\n=========================================================================\nThu Feb 28 18:01:09 UTC 2019 KΛÐΞMLIΛ hive: queen's address: bf27dc\npopulation: 12 (31), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 74b7 6013 6646 08ff | 17 4c5f (0) 4601 (0) 427f (0) 577b (0)\n001 3 f9ca cbd4 d756 | 7 d756 (0) cbd4 (0) fb64 (0) f9ca (0)\n002 2 9e27 94a2 | 4 94a2 (0) 9e27 (0) 9c93 (0) 9934 (0)\n============ DEPTH: 3 ==========================================\n003 3 a11b ad46 aa7e | 3 aa7e (0) ad46 (0) a11b (0)\n004 0 | 0\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"bf27dccd6f79cc86d38ad7a375b833125aeaad060be117c23c1b71297b072c00","private_key":"d572f42e4c4b69acd62f2ced7411ffb238c6b5abd9039b6e3c47f01f6d1fde1b","name":"node_bf27dccd6f79cc86d38ad7a375b833125aeaad060be117c23c1b71297b072c00","services":["streamer"],"enable_msg_events":true,"port":44805},"up":true}},{"node":{"info":{"id":"6646ecc87398e09e54b0eb19e57d543d313c3e7357ff84dca8886b83fadae0f4","name":"node_6646ecc87398e09e54b0eb19e57d543d313c3e7357ff84dca8886b83fadae0f4","enode":"enode://fb3cece5266da81615d3398f3c34f6552eaaa9e55c79123f7282951226be7fab8db0cd0487ebcc3a5799d7dd25b91d3b4064c1959bc590ca6ddb8f10508e196b@127.0.0.1:0","enr":"0xf88fb84076bdf43d4d5251b70d43c1c650b2da1304cc4d6762d8368b75fa7063f92cde8b5129e9443fe40a0f3f421fb7a430eb451780ef473ce3caccde600cc00bafbc2f0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103fb3cece5266da81615d3398f3c34f6552eaaa9e55c79123f7282951226be7fab","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"ZkbsyHOY4J5UsOsZ5X1UPTE8PnNX/4TcqIhrg/ra4PQ=","hive":"\n=========================================================================\nThu Feb 28 18:01:09 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 6646ec\npopulation: 13 (31), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 a11b bf27 | 15 d756 (0) cbd4 (0) fb64 (0) f9ca (0)\n001 2 2643 2f17 | 5 2f17 (0) 2643 (0) 2529 (0) 11bd (0)\n002 2 4601 4c5f | 4 4c5f (0) 4601 (0) 427f (0) 577b (0)\n003 3 74b7 76cb 729a | 3 729a (0) 74b7 (0) 76cb (0)\n004 1 6ef5 | 1 6ef5 (0)\n============ DEPTH: 5 ==========================================\n005 3 62ac 6304 6013 | 3 62ac (0) 6304 (0) 6013 (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"6646ecc87398e09e54b0eb19e57d543d313c3e7357ff84dca8886b83fadae0f4","private_key":"685914c526e3efe92ebef3400b22a51a7a4771de5c87ffd5f9da4e8db9d1282c","name":"node_6646ecc87398e09e54b0eb19e57d543d313c3e7357ff84dca8886b83fadae0f4","services":["streamer"],"enable_msg_events":true,"port":40729},"up":true}},{"node":{"info":{"id":"a11b3c67ea36d41264fdc97123a41c8586837199496782e7994b6be831571b77","name":"node_a11b3c67ea36d41264fdc97123a41c8586837199496782e7994b6be831571b77","enode":"enode://3c0855f7cf4fc19e61b4aeb52f69cc6eafe9800738da596b60366854eec2b55e1b82583803a6564d6f3f5fac83bcf41748cd8f4a316e131afe54b1a93ba235ec@127.0.0.1:0","enr":"0xf88fb84005478b240adc6c61921f460140f141ddceb6ae0cdbdf49cb0952cb457849b3ce4080fcf91b3b80ac6eb08e75e78f0ed80169a9269845bb24999a1828b5b7fd3d0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1023c0855f7cf4fc19e61b4aeb52f69cc6eafe9800738da596b60366854eec2b55e","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"oRs8Z+o21BJk/clxI6QchYaDcZlJZ4LnmUtr6DFXG3c=","hive":"\n=========================================================================\nThu Feb 28 18:01:09 UTC 2019 KΛÐΞMLIΛ hive: queen's address: a11b3c\npopulation: 10 (31), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 6646 577b | 17 2f17 (0) 2643 (0) 2529 (0) 11bd (0)\n001 2 cbd4 d756 | 7 d756 (0) cbd4 (0) fb64 (0) f9ca (0)\n002 3 9e27 9934 94a2 | 4 94a2 (0) 9934 (0) 9e27 (0) 9c93 (0)\n003 1 bf27 | 1 bf27 (0)\n============ DEPTH: 4 ==========================================\n004 2 ad46 aa7e | 2 aa7e (0) ad46 (0)\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"a11b3c67ea36d41264fdc97123a41c8586837199496782e7994b6be831571b77","private_key":"100fcd428dcc5043b3dbdd4bbb18ee89cd22a1e122e6daa5173b38d971e81dd4","name":"node_a11b3c67ea36d41264fdc97123a41c8586837199496782e7994b6be831571b77","services":["streamer"],"enable_msg_events":true,"port":40597},"up":true}},{"node":{"info":{"id":"577b3342880359b9fa426fdce8fc315cea640592b787e6e3adbdec6699f4b2aa","name":"node_577b3342880359b9fa426fdce8fc315cea640592b787e6e3adbdec6699f4b2aa","enode":"enode://20ee1cefe65d31d3bbef59fc59deb8cd34a06204403fef7c4c52143e62d207bce55396cf2cd302a103fb15ef7df24832502feab7478b558c6d549555a4b9fbda@127.0.0.1:0","enr":"0xf88fb8402bb8237b2f944ce884436ea3d41fb22fda669660233b5844733075ba1d9e8e4163169f20b8fcb972c30375d9fa5af751434559d55d174c300c2842f899763ee40183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10220ee1cefe65d31d3bbef59fc59deb8cd34a06204403fef7c4c52143e62d207bc","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"V3szQogDWbn6Qm/c6PwxXOpkBZK3h+bjrb3sZpn0sqo=","hive":"\n=========================================================================\nThu Feb 28 18:01:09 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 577b33\npopulation: 11 (31), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 d756 a11b | 15 d756 (0) cbd4 (0) fb64 (0) f9ca (0)\n001 2 11bd 08ff | 5 11bd (0) 08ff (0) 2f17 (0) 2643 (0)\n002 4 74b7 6ef5 6013 62ac | 8 729a (0) 74b7 (0) 76cb (0) 6ef5 (0)\n============ DEPTH: 3 ==========================================\n003 3 4c5f 4601 427f | 3 4c5f (0) 4601 (0) 427f (0)\n004 0 | 0\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"577b3342880359b9fa426fdce8fc315cea640592b787e6e3adbdec6699f4b2aa","private_key":"8b2f5863391217a259d77ab4007f410d37eb2f81f76b87497e738c1a6dc07042","name":"node_577b3342880359b9fa426fdce8fc315cea640592b787e6e3adbdec6699f4b2aa","services":["streamer"],"enable_msg_events":true,"port":41231},"up":true}},{"node":{"info":{"id":"62ac6af08ae166b0d5612bc65a07e414876a38a3552091d461c808c5f6b471b0","name":"node_62ac6af08ae166b0d5612bc65a07e414876a38a3552091d461c808c5f6b471b0","enode":"enode://0761ae452c8e6d8803e4dd3dd4b66a50b5f17ba7c25babf1f41b273572d90ba7fa6de5b9ff53bd29fb89c0f0aee57b9d4bd7508b58411c184c27c6b4d113c38c@127.0.0.1:0","enr":"0xf88fb840e15454baf140946f84455b01b25479ab82d8df1e547d32eb511a08db1b6d2fa13417e78cfaa91a62ff85b5be203ca4c525537fc21651ab6b721781ebe2367eba0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1020761ae452c8e6d8803e4dd3dd4b66a50b5f17ba7c25babf1f41b273572d90ba7","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"Yqxq8IrhZrDVYSvGWgfkFIdqOKNVIJHUYcgIxfa0cbA=","hive":"\n=========================================================================\nThu Feb 28 18:01:09 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 62ac6a\npopulation: 12 (31), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 9934 94a2 | 15 94a2 (0) 9934 (0) 9e27 (0) 9c93 (0)\n001 2 11bd 2529 | 5 11bd (0) 08ff (0) 2f17 (0) 2643 (0)\n002 2 4c5f 577b | 4 4c5f (0) 4601 (0) 427f (0) 577b (0)\n003 2 74b7 729a | 3 729a (0) 74b7 (0) 76cb (0)\n004 1 6ef5 | 1 6ef5 (0)\n005 1 6646 | 1 6646 (0)\n============ DEPTH: 6 ==========================================\n006 1 6013 | 1 6013 (0)\n007 1 6304 | 1 6304 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"62ac6af08ae166b0d5612bc65a07e414876a38a3552091d461c808c5f6b471b0","private_key":"c094ade67efd8691772e76ed09d41e9dcd2d0c478331223fdd1c7736d84736e8","name":"node_62ac6af08ae166b0d5612bc65a07e414876a38a3552091d461c808c5f6b471b0","services":["streamer"],"enable_msg_events":true,"port":33431},"up":true}},{"node":{"info":{"id":"2529eb6efbbad4513c12fffff722c2c2496759b5eb3d95302ff9bf7eacc0d427","name":"node_2529eb6efbbad4513c12fffff722c2c2496759b5eb3d95302ff9bf7eacc0d427","enode":"enode://d31fbb6c9836fc684468eaa5865756779ef13e13bfc5af8a819f68a3d388b5e9c8c54b17cbd5ddfb355e15fee71d1ec86dfed0472309edcfa84dce531caf3e4d@127.0.0.1:0","enr":"0xf88fb8404566296b99cb998abb9c6d5f61d4df6674dfed5706ae4bd804f2b0d1d2088bd35e152e18aaca113522024b0ed409292b8d596c50093d18e319240bb27f055fe00183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103d31fbb6c9836fc684468eaa5865756779ef13e13bfc5af8a819f68a3d388b5e9","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"JSnrbvu61FE8Ev//9yLCwklnWbXrPZUwL/m/fqzA1Cc=","hive":"\n=========================================================================\nThu Feb 28 18:01:09 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 2529eb\npopulation: 10 (31), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 94a2 eed4 | 15 94a2 (0) 9934 (0) 9e27 (0) 9c93 (0)\n001 4 427f 4c5f 74b7 62ac | 12 4c5f (0) 4601 (0) 427f (0) 577b (0)\n002 2 11bd 08ff | 2 11bd (0) 08ff (0)\n============ DEPTH: 3 ==========================================\n003 0 | 0\n004 1 2f17 | 1 2f17 (0)\n005 0 | 0\n006 1 2643 | 1 2643 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"2529eb6efbbad4513c12fffff722c2c2496759b5eb3d95302ff9bf7eacc0d427","private_key":"f8cc4cad963f73aff2b340dfcf30ab658e08f58928824419a15246c2532c43e7","name":"node_2529eb6efbbad4513c12fffff722c2c2496759b5eb3d95302ff9bf7eacc0d427","services":["streamer"],"enable_msg_events":true,"port":35361},"up":true}},{"node":{"info":{"id":"eed4b9a06bc8fa0b7195beeff1bfb7979df37c720dec9c89146820abf483681a","name":"node_eed4b9a06bc8fa0b7195beeff1bfb7979df37c720dec9c89146820abf483681a","enode":"enode://e11c49200047bdb02fac35163462fdeb3e40477670420f345db00b3f0cc008ed768b308bce67bf5ddf3c5728ccadf39f8362d18eafedd9c7c0f916e62d491470@127.0.0.1:0","enr":"0xf88fb8403e683663f20a82e4d0a4a2750956048ae4f294e82db9c02f2d31e574d2564b9605f5ca54db82f1e460613dbfa8570cb35a0badd8fdc581ce43f6fcab0026556a0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102e11c49200047bdb02fac35163462fdeb3e40477670420f345db00b3f0cc008ed","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"7tS5oGvI+gtxlb7v8b+3l53zfHIN7JyJFGggq/SDaBo=","hive":"\n=========================================================================\nThu Feb 28 18:01:09 UTC 2019 KΛÐΞMLIΛ hive: queen's address: eed4b9\npopulation: 11 (31), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 6ef5 76cb 2529 | 17 4c5f (0) 4601 (0) 427f (0) 577b (0)\n001 2 9934 94a2 | 8 94a2 (0) 9934 (0) 9e27 (0) 9c93 (0)\n002 2 cbd4 d756 | 2 d756 (0) cbd4 (0)\n============ DEPTH: 3 ==========================================\n003 3 f4b8 fb64 f9ca | 3 fb64 (0) f9ca (0) f4b8 (0)\n004 1 e4f7 | 1 e4f7 (0)\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"eed4b9a06bc8fa0b7195beeff1bfb7979df37c720dec9c89146820abf483681a","private_key":"00b0480a2de8f0b9a04988e6b64da01d184d36d84da1b6c377b19d991c6bfdc2","name":"node_eed4b9a06bc8fa0b7195beeff1bfb7979df37c720dec9c89146820abf483681a","services":["streamer"],"enable_msg_events":true,"port":39613},"up":true}},{"node":{"info":{"id":"76cb47eba84a7ae0e9f00f1381ba85c2ede9fa7f899a878f94e493b7e2ab4017","name":"node_76cb47eba84a7ae0e9f00f1381ba85c2ede9fa7f899a878f94e493b7e2ab4017","enode":"enode://eb693286d13dd7d22dbf20c8a7bd9df2cec24474ed4f059cff8fbbb7013081d12ca2caa7d5e2084225ae04d7c6070fc61158f0f7de6e16213b48c01aea446f47@127.0.0.1:0","enr":"0xf88fb840af4b0c315818be89b44fbbed80450d4973e3ae933823e9dd5302edce8e5059744c616a175dc2d6d818ce0ad591f864fa0d9381df6d8a065beef99449ec3ecbb20183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103eb693286d13dd7d22dbf20c8a7bd9df2cec24474ed4f059cff8fbbb7013081d1","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"dstH66hKeuDp8A8TgbqFwu3p+n+JmoePlOSTt+KrQBc=","hive":"\n=========================================================================\nThu Feb 28 18:01:09 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 76cb47\npopulation: 11 (31), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 f4b8 eed4 | 15 94a2 (0) 9934 (0) 9e27 (0) 9c93 (0)\n001 2 11bd 08ff | 5 11bd (0) 08ff (0) 2f17 (0) 2643 (0)\n002 3 427f 4601 4c5f | 4 4c5f (0) 4601 (0) 427f (0) 577b (0)\n003 2 6646 6ef5 | 5 6ef5 (0) 6646 (0) 6013 (0) 6304 (0)\n============ DEPTH: 4 ==========================================\n004 0 | 0\n005 1 729a | 1 729a (0)\n006 1 74b7 | 1 74b7 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"76cb47eba84a7ae0e9f00f1381ba85c2ede9fa7f899a878f94e493b7e2ab4017","private_key":"8ddfa941097daa1adbf355c69b301a9b9b4e984f51fbc021d6abbd2df8eb5391","name":"node_76cb47eba84a7ae0e9f00f1381ba85c2ede9fa7f899a878f94e493b7e2ab4017","services":["streamer"],"enable_msg_events":true,"port":33051},"up":true}},{"node":{"info":{"id":"f4b8a95056730a03a6d17b67543860f95eed26b6e43f05a1992f27399d3d3126","name":"node_f4b8a95056730a03a6d17b67543860f95eed26b6e43f05a1992f27399d3d3126","enode":"enode://8e1bd7a84722a0d831f2ce96f52c463bc3232306ab90de59ad821884df222db8cf6204e33398d2ccb347156b73088661c96f16da9b37a53c48f1cdc00897700e@127.0.0.1:0","enr":"0xf88fb840e5deda0993da1e8b4297c89a66ddf4b197118fc19c40d2eb65d35c08c607922252bfa120d52fcdacaa4d68bd36af44be179038dce4b9857b9b3b29737d9b508a0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1028e1bd7a84722a0d831f2ce96f52c463bc3232306ab90de59ad821884df222db8","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"9LipUFZzCgOm0XtnVDhg+V7tJrbkPwWhmS8nOZ09MSY=","hive":"\n=========================================================================\nThu Feb 28 18:01:09 UTC 2019 KΛÐΞMLIΛ hive: queen's address: f4b8a9\npopulation: 10 (31), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 6304 76cb | 17 11bd (0) 08ff (0) 2f17 (0) 2643 (0)\n001 2 9934 94a2 | 8 94a2 (0) 9934 (0) 9e27 (0) 9c93 (0)\n002 2 cbd4 d756 | 2 d756 (0) cbd4 (0)\n003 2 eed4 e4f7 | 2 e4f7 (0) eed4 (0)\n============ DEPTH: 4 ==========================================\n004 2 f9ca fb64 | 2 fb64 (0) f9ca (0)\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"f4b8a95056730a03a6d17b67543860f95eed26b6e43f05a1992f27399d3d3126","private_key":"ffe54ea17543345a77321ae2e3776751db00762580f661c0f15896f42500959e","name":"node_f4b8a95056730a03a6d17b67543860f95eed26b6e43f05a1992f27399d3d3126","services":["streamer"],"enable_msg_events":true,"port":33473},"up":true}},{"node":{"info":{"id":"6304e2b135455ce02203ebc3f514b5f6293e6bb0c9a98129b7b0d6f6cbc98cef","name":"node_6304e2b135455ce02203ebc3f514b5f6293e6bb0c9a98129b7b0d6f6cbc98cef","enode":"enode://d07fabc00b19f95c1732019dafb44716ccc4e19dce5e9985d4dc8237790811a6e7973a650f98183de314b6061f815b190dd620fd33a6ae2e398c10c57614224e@127.0.0.1:0","enr":"0xf88fb8408d97738fe8da5aeda2e04c10e3c563f61ecc6911afcf669e9e50b306b67b4e023292aec1a2d35c5dcec0c612b0d5cd02f21098fd8b3e3ad40679b1778be6dcc10183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102d07fabc00b19f95c1732019dafb44716ccc4e19dce5e9985d4dc8237790811a6","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"YwTisTVFXOAiA+vD9RS19ik+a7DJqYEpt7DW9svJjO8=","hive":"\n=========================================================================\nThu Feb 28 18:01:09 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 6304e2\npopulation: 12 (31), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 9934 f4b8 | 15 9934 (0) 9e27 (0) 9c93 (0) 94a2 (0)\n001 2 11bd 2f17 | 5 11bd (0) 08ff (0) 2643 (0) 2529 (0)\n002 2 4c5f 4601 | 4 4c5f (0) 4601 (0) 427f (0) 577b (0)\n003 2 74b7 729a | 3 729a (0) 74b7 (0) 76cb (0)\n004 1 6ef5 | 1 6ef5 (0)\n005 1 6646 | 1 6646 (0)\n============ DEPTH: 6 ==========================================\n006 1 6013 | 1 6013 (0)\n007 1 62ac | 1 62ac (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"6304e2b135455ce02203ebc3f514b5f6293e6bb0c9a98129b7b0d6f6cbc98cef","private_key":"80cf26c0793a22bf69aa3bf4d71052a9ede84d73135a7b39d1ec068bdd2929c7","name":"node_6304e2b135455ce02203ebc3f514b5f6293e6bb0c9a98129b7b0d6f6cbc98cef","services":["streamer"],"enable_msg_events":true,"port":34879},"up":true}},{"node":{"info":{"id":"2f17e180d07832468e6aa9159649cd69b199313cb2c6fe92f1598d86f634da33","name":"node_2f17e180d07832468e6aa9159649cd69b199313cb2c6fe92f1598d86f634da33","enode":"enode://df8c978c17fbed86c3fc257bb0d3aca0a8831d358b13cf87413888240c12cf92840bd89e98350dc7aeb45c91a97a7bace5b60b42bac6831972ef0eecb5180c03@127.0.0.1:0","enr":"0xf88fb84015eb3d3b46b7b35f89720cf53396e495bda8dee9ac4fe55ad75cc91a7a3358f23e5c8fe05da05dbd5ecba9d42d131646b563810ac1603f78569e9b059c719fd60183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103df8c978c17fbed86c3fc257bb0d3aca0a8831d358b13cf87413888240c12cf92","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"LxfhgNB4MkaOaqkVlknNabGZMTyyxv6S8VmNhvY02jM=","hive":"\n=========================================================================\nThu Feb 28 18:01:09 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 2f17e1\npopulation: 14 (31), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 aa7e 9934 fb64 cbd4 | 15 9934 (0) 9e27 (0) 9c93 (0) 94a2 (0)\n001 6 4601 427f 4c5f 6646 | 12 577b (0) 4c5f (0) 4601 (0) 427f (0)\n002 2 08ff 11bd | 2 11bd (0) 08ff (0)\n============ DEPTH: 3 ==========================================\n003 0 | 0\n004 2 2529 2643 | 2 2643 (0) 2529 (0)\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"2f17e180d07832468e6aa9159649cd69b199313cb2c6fe92f1598d86f634da33","private_key":"256815d05345b0618e277d6f2618ac89ef4fa493b339bf65f0eaec5cbd404e92","name":"node_2f17e180d07832468e6aa9159649cd69b199313cb2c6fe92f1598d86f634da33","services":["streamer"],"enable_msg_events":true,"port":37517},"up":true}},{"node":{"info":{"id":"cbd4aa5e14566c47a93755b537d2d10775346ef11a6c6422b37d0661c9489941","name":"node_cbd4aa5e14566c47a93755b537d2d10775346ef11a6c6422b37d0661c9489941","enode":"enode://5cca6a56e89c4aed55749ad75c465e9fb86ff85723c02abb5037ef5db3c05b5fc45dc735575b737fec5a5bc572466e636c0fe7bdd56d98ea684a5314ea065f84@127.0.0.1:0","enr":"0xf88fb8405b51d4e5f768fab1263aad5fc3d836b5a9299f2e915bd7fde99ee1632440e56c40d1fae3bad1fc292927c07694c0a31e4bdaa4214df6ab41b5bd9eb847202c170183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1025cca6a56e89c4aed55749ad75c465e9fb86ff85723c02abb5037ef5db3c05b5f","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"y9SqXhRWbEepN1W1N9LRB3U0bvEabGQis30GYclImUE=","hive":"\n=========================================================================\nThu Feb 28 18:01:09 UTC 2019 KΛÐΞMLIΛ hive: queen's address: cbd4aa\npopulation: 16 (31), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 729a 11bd 2f17 | 17 577b (0) 4c5f (0) 4601 (0) 427f (0)\n001 7 bf27 a11b aa7e ad46 | 8 9934 (0) 9e27 (0) 9c93 (0) 94a2 (0)\n============ DEPTH: 2 ==========================================\n002 5 eed4 e4f7 f4b8 fb64 | 5 e4f7 (0) eed4 (0) fb64 (0) f9ca (0)\n003 1 d756 | 1 d756 (0)\n004 0 | 0\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"cbd4aa5e14566c47a93755b537d2d10775346ef11a6c6422b37d0661c9489941","private_key":"c8cfa60b5e127e3bacb81f83e2b754b73a42724cda004a2a5ed5fbcf22dfddd4","name":"node_cbd4aa5e14566c47a93755b537d2d10775346ef11a6c6422b37d0661c9489941","services":["streamer"],"enable_msg_events":true,"port":44323},"up":true}},{"node":{"info":{"id":"729a18579fad2fc75d6b445167e735615e80bb70379e7a9247a09ba6916579c0","name":"node_729a18579fad2fc75d6b445167e735615e80bb70379e7a9247a09ba6916579c0","enode":"enode://fd9832b9b0eef81dc9fcab0852581e32bd63572f5e46a85c7aa0ad26596ca899a680f1c02bc80e2f9d9834a24a79071b26a4e040c8d4e7acfacfd07d1d8f7939@127.0.0.1:0","enr":"0xf88fb8402f0c70d6cc93f4019ac80464fe97225e30532a384869ad2228660e40a240ca1852d6750396d22e257cb2a1b79b4eeeb4c65303d87a91af08ce3c213c0751abf30183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103fd9832b9b0eef81dc9fcab0852581e32bd63572f5e46a85c7aa0ad26596ca899","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"cpoYV5+tL8dda0RRZ+c1YV6Au3A3nnqSR6CbppFlecA=","hive":"\n=========================================================================\nThu Feb 28 18:01:09 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 729a18\npopulation: 13 (31), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 d756 cbd4 | 15 9934 (0) 9e27 (0) 9c93 (0) 94a2 (0)\n001 2 11bd 08ff | 5 11bd (0) 08ff (0) 2529 (0) 2643 (0)\n002 2 4601 4c5f | 4 577b (0) 4c5f (0) 4601 (0) 427f (0)\n003 5 6ef5 6646 6013 62ac | 5 6ef5 (0) 6646 (0) 6013 (0) 62ac (0)\n============ DEPTH: 4 ==========================================\n004 0 | 0\n005 2 74b7 76cb | 2 74b7 (0) 76cb (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"729a18579fad2fc75d6b445167e735615e80bb70379e7a9247a09ba6916579c0","private_key":"675a65f43358f973c940f285b96994d598a5a63b511de041e959d415fc38f605","name":"node_729a18579fad2fc75d6b445167e735615e80bb70379e7a9247a09ba6916579c0","services":["streamer"],"enable_msg_events":true,"port":41717},"up":true}},{"node":{"info":{"id":"d7563d6dc6a0378406b3758e1cca428a494b76526e06faeadb43350cad986792","name":"node_d7563d6dc6a0378406b3758e1cca428a494b76526e06faeadb43350cad986792","enode":"enode://46a796a7e0ef14bf01598dafad914d15b6e16a7a15252f2e318dfb509897cc5e25fe3727de0e8cfd6d6ee2ed1c27981737b15038237650981465e6410f49e6b9@127.0.0.1:0","enr":"0xf88fb84039e08ba3a29f958abdbd524c52eb953e01d52dfc9c1f0259d81debaa7bf88aeb11819630685dbe6939805e57357068d0768dc6a4c7233564b1b783b45a4a4fc90183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10346a796a7e0ef14bf01598dafad914d15b6e16a7a15252f2e318dfb509897cc5e","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"11Y9bcagN4QGs3WOHMpCiklLdlJuBvrq20M1DK2YZ5I=","hive":"\n=========================================================================\nThu Feb 28 18:01:09 UTC 2019 KΛÐΞMLIΛ hive: queen's address: d7563d\npopulation: 16 (31), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 577b 427f 729a | 17 11bd (0) 08ff (0) 2529 (0) 2643 (0)\n001 7 bf27 aa7e ad46 a11b | 8 9934 (0) 9e27 (0) 9c93 (0) 94a2 (0)\n============ DEPTH: 2 ==========================================\n002 5 e4f7 eed4 f9ca fb64 | 5 e4f7 (0) eed4 (0) fb64 (0) f9ca (0)\n003 1 cbd4 | 1 cbd4 (0)\n004 0 | 0\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"d7563d6dc6a0378406b3758e1cca428a494b76526e06faeadb43350cad986792","private_key":"eeeffb7fefb163eb424dbeedafc3a4b2de7c7aff8f531b8969b5bc809c4232ab","name":"node_d7563d6dc6a0378406b3758e1cca428a494b76526e06faeadb43350cad986792","services":["streamer"],"enable_msg_events":true,"port":37925},"up":true}}],"conns":[{"one":"427f4bdfd3857968af5da36eeea041938ea771bc6c5e90ee8d3585cf579f13b7","other":"6ef5de5c1c8e55bc89948bf10a7a2ad11b07170f3b5f049e40a85e244124eee4","up":true},{"one":"6ef5de5c1c8e55bc89948bf10a7a2ad11b07170f3b5f049e40a85e244124eee4","other":"11bd810f7ba41f44816f33a19d9c703d26f2ccaea28c4af825f52888070ad8d7","up":true},{"one":"11bd810f7ba41f44816f33a19d9c703d26f2ccaea28c4af825f52888070ad8d7","other":"9e276cdb622215089f0f20252a6aba20f57521df94d401efa13f604b62534c80","up":true},{"one":"9e276cdb622215089f0f20252a6aba20f57521df94d401efa13f604b62534c80","other":"4c5fabb7a17c3a3f589c7d2eca3c0dd5a6b8217aabc54323bab75b6af383ac6c","up":true},{"one":"4c5fabb7a17c3a3f589c7d2eca3c0dd5a6b8217aabc54323bab75b6af383ac6c","other":"ad4643583aa082b3bef7ce1bb8dcf55fe2e321b8954000cfac6bc72c49e85f50","up":true},{"one":"ad4643583aa082b3bef7ce1bb8dcf55fe2e321b8954000cfac6bc72c49e85f50","other":"2643083442ee9e69517f5008e4ca54dbfa40726bde22216b53bf903895aa0ae0","up":true},{"one":"2643083442ee9e69517f5008e4ca54dbfa40726bde22216b53bf903895aa0ae0","other":"94a2afa6bc12fe95765f09f57828c77cc9ea473cd0e9e655ca9f46e1bbabae22","up":true},{"one":"94a2afa6bc12fe95765f09f57828c77cc9ea473cd0e9e655ca9f46e1bbabae22","other":"f9cac95b4c91bea670e5e672bc64e400e63de0b55c423eda5f1499cf218eb244","up":true},{"one":"f9cac95b4c91bea670e5e672bc64e400e63de0b55c423eda5f1499cf218eb244","other":"74b720fcd93ff907e0a2f9c8f62e9315e64c2fcd023184ebddfd485d782ba95f","up":true},{"one":"74b720fcd93ff907e0a2f9c8f62e9315e64c2fcd023184ebddfd485d782ba95f","other":"6013d40c0c15f5a7b1ddd5a8ef6a80757de9022b208535938b0937b9150771e0","up":true},{"one":"6013d40c0c15f5a7b1ddd5a8ef6a80757de9022b208535938b0937b9150771e0","other":"e4f776dddd9e476608fb335ab22fff1836309b9440ee4ee0fd37a2ba7fca8507","up":true},{"one":"e4f776dddd9e476608fb335ab22fff1836309b9440ee4ee0fd37a2ba7fca8507","other":"fb64370bc0707215e41afb0da1a53f8aba5e11f471bae4f8dc4bd85a3b66827a","up":true},{"one":"fb64370bc0707215e41afb0da1a53f8aba5e11f471bae4f8dc4bd85a3b66827a","other":"460148b8444b714b47f09285aa0ce28dc3418cb6b9f458b5202c0533205f82a4","up":true},{"one":"460148b8444b714b47f09285aa0ce28dc3418cb6b9f458b5202c0533205f82a4","other":"aa7e45d4583570fe382828e4ff3d60ccd526cea01325211d87ceeb6cc14af753","up":true},{"one":"aa7e45d4583570fe382828e4ff3d60ccd526cea01325211d87ceeb6cc14af753","other":"9c935faafb41a7bd3bda18a8bd022878105bf8453a5b83d2bfa4da46d8c908f8","up":true},{"one":"9c935faafb41a7bd3bda18a8bd022878105bf8453a5b83d2bfa4da46d8c908f8","other":"9934295fbde37d4a7f867c9a7e1f6428c4996d1b43863dbc5a2f52a546649ef0","up":true},{"one":"9934295fbde37d4a7f867c9a7e1f6428c4996d1b43863dbc5a2f52a546649ef0","other":"08ff54b60307cfbbd9b209bf07c7a6f164192b80c9dd5eeadd26e368adbc7dbc","up":true},{"one":"08ff54b60307cfbbd9b209bf07c7a6f164192b80c9dd5eeadd26e368adbc7dbc","other":"bf27dccd6f79cc86d38ad7a375b833125aeaad060be117c23c1b71297b072c00","up":true},{"one":"bf27dccd6f79cc86d38ad7a375b833125aeaad060be117c23c1b71297b072c00","other":"6646ecc87398e09e54b0eb19e57d543d313c3e7357ff84dca8886b83fadae0f4","up":true},{"one":"6646ecc87398e09e54b0eb19e57d543d313c3e7357ff84dca8886b83fadae0f4","other":"a11b3c67ea36d41264fdc97123a41c8586837199496782e7994b6be831571b77","up":true},{"one":"a11b3c67ea36d41264fdc97123a41c8586837199496782e7994b6be831571b77","other":"577b3342880359b9fa426fdce8fc315cea640592b787e6e3adbdec6699f4b2aa","up":true},{"one":"577b3342880359b9fa426fdce8fc315cea640592b787e6e3adbdec6699f4b2aa","other":"62ac6af08ae166b0d5612bc65a07e414876a38a3552091d461c808c5f6b471b0","up":true},{"one":"62ac6af08ae166b0d5612bc65a07e414876a38a3552091d461c808c5f6b471b0","other":"2529eb6efbbad4513c12fffff722c2c2496759b5eb3d95302ff9bf7eacc0d427","up":true},{"one":"2529eb6efbbad4513c12fffff722c2c2496759b5eb3d95302ff9bf7eacc0d427","other":"eed4b9a06bc8fa0b7195beeff1bfb7979df37c720dec9c89146820abf483681a","up":true},{"one":"eed4b9a06bc8fa0b7195beeff1bfb7979df37c720dec9c89146820abf483681a","other":"76cb47eba84a7ae0e9f00f1381ba85c2ede9fa7f899a878f94e493b7e2ab4017","up":true},{"one":"76cb47eba84a7ae0e9f00f1381ba85c2ede9fa7f899a878f94e493b7e2ab4017","other":"f4b8a95056730a03a6d17b67543860f95eed26b6e43f05a1992f27399d3d3126","up":true},{"one":"f4b8a95056730a03a6d17b67543860f95eed26b6e43f05a1992f27399d3d3126","other":"6304e2b135455ce02203ebc3f514b5f6293e6bb0c9a98129b7b0d6f6cbc98cef","up":true},{"one":"6304e2b135455ce02203ebc3f514b5f6293e6bb0c9a98129b7b0d6f6cbc98cef","other":"2f17e180d07832468e6aa9159649cd69b199313cb2c6fe92f1598d86f634da33","up":true},{"one":"2f17e180d07832468e6aa9159649cd69b199313cb2c6fe92f1598d86f634da33","other":"cbd4aa5e14566c47a93755b537d2d10775346ef11a6c6422b37d0661c9489941","up":true},{"one":"cbd4aa5e14566c47a93755b537d2d10775346ef11a6c6422b37d0661c9489941","other":"729a18579fad2fc75d6b445167e735615e80bb70379e7a9247a09ba6916579c0","up":true},{"one":"729a18579fad2fc75d6b445167e735615e80bb70379e7a9247a09ba6916579c0","other":"d7563d6dc6a0378406b3758e1cca428a494b76526e06faeadb43350cad986792","up":true},{"one":"d7563d6dc6a0378406b3758e1cca428a494b76526e06faeadb43350cad986792","other":"427f4bdfd3857968af5da36eeea041938ea771bc6c5e90ee8d3585cf579f13b7","up":true},{"one":"6ef5de5c1c8e55bc89948bf10a7a2ad11b07170f3b5f049e40a85e244124eee4","other":"e4f776dddd9e476608fb335ab22fff1836309b9440ee4ee0fd37a2ba7fca8507","up":true},{"one":"427f4bdfd3857968af5da36eeea041938ea771bc6c5e90ee8d3585cf579f13b7","other":"2f17e180d07832468e6aa9159649cd69b199313cb2c6fe92f1598d86f634da33","up":true},{"one":"4c5fabb7a17c3a3f589c7d2eca3c0dd5a6b8217aabc54323bab75b6af383ac6c","other":"2f17e180d07832468e6aa9159649cd69b199313cb2c6fe92f1598d86f634da33","up":true},{"one":"74b720fcd93ff907e0a2f9c8f62e9315e64c2fcd023184ebddfd485d782ba95f","other":"2643083442ee9e69517f5008e4ca54dbfa40726bde22216b53bf903895aa0ae0","up":true},{"one":"9e276cdb622215089f0f20252a6aba20f57521df94d401efa13f604b62534c80","other":"cbd4aa5e14566c47a93755b537d2d10775346ef11a6c6422b37d0661c9489941","up":true},{"one":"94a2afa6bc12fe95765f09f57828c77cc9ea473cd0e9e655ca9f46e1bbabae22","other":"bf27dccd6f79cc86d38ad7a375b833125aeaad060be117c23c1b71297b072c00","up":true},{"one":"460148b8444b714b47f09285aa0ce28dc3418cb6b9f458b5202c0533205f82a4","other":"2f17e180d07832468e6aa9159649cd69b199313cb2c6fe92f1598d86f634da33","up":true},{"one":"577b3342880359b9fa426fdce8fc315cea640592b787e6e3adbdec6699f4b2aa","other":"08ff54b60307cfbbd9b209bf07c7a6f164192b80c9dd5eeadd26e368adbc7dbc","up":true},{"one":"e4f776dddd9e476608fb335ab22fff1836309b9440ee4ee0fd37a2ba7fca8507","other":"94a2afa6bc12fe95765f09f57828c77cc9ea473cd0e9e655ca9f46e1bbabae22","up":true},{"one":"9934295fbde37d4a7f867c9a7e1f6428c4996d1b43863dbc5a2f52a546649ef0","other":"d7563d6dc6a0378406b3758e1cca428a494b76526e06faeadb43350cad986792","up":true},{"one":"cbd4aa5e14566c47a93755b537d2d10775346ef11a6c6422b37d0661c9489941","other":"ad4643583aa082b3bef7ce1bb8dcf55fe2e321b8954000cfac6bc72c49e85f50","up":true},{"one":"9c935faafb41a7bd3bda18a8bd022878105bf8453a5b83d2bfa4da46d8c908f8","other":"460148b8444b714b47f09285aa0ce28dc3418cb6b9f458b5202c0533205f82a4","up":true},{"one":"aa7e45d4583570fe382828e4ff3d60ccd526cea01325211d87ceeb6cc14af753","other":"cbd4aa5e14566c47a93755b537d2d10775346ef11a6c6422b37d0661c9489941","up":true},{"one":"76cb47eba84a7ae0e9f00f1381ba85c2ede9fa7f899a878f94e493b7e2ab4017","other":"08ff54b60307cfbbd9b209bf07c7a6f164192b80c9dd5eeadd26e368adbc7dbc","up":true},{"one":"2f17e180d07832468e6aa9159649cd69b199313cb2c6fe92f1598d86f634da33","other":"08ff54b60307cfbbd9b209bf07c7a6f164192b80c9dd5eeadd26e368adbc7dbc","up":true},{"one":"6013d40c0c15f5a7b1ddd5a8ef6a80757de9022b208535938b0937b9150771e0","other":"2f17e180d07832468e6aa9159649cd69b199313cb2c6fe92f1598d86f634da33","up":true},{"one":"11bd810f7ba41f44816f33a19d9c703d26f2ccaea28c4af825f52888070ad8d7","other":"2f17e180d07832468e6aa9159649cd69b199313cb2c6fe92f1598d86f634da33","up":true},{"one":"08ff54b60307cfbbd9b209bf07c7a6f164192b80c9dd5eeadd26e368adbc7dbc","other":"460148b8444b714b47f09285aa0ce28dc3418cb6b9f458b5202c0533205f82a4","up":true},{"one":"729a18579fad2fc75d6b445167e735615e80bb70379e7a9247a09ba6916579c0","other":"08ff54b60307cfbbd9b209bf07c7a6f164192b80c9dd5eeadd26e368adbc7dbc","up":true},{"one":"a11b3c67ea36d41264fdc97123a41c8586837199496782e7994b6be831571b77","other":"d7563d6dc6a0378406b3758e1cca428a494b76526e06faeadb43350cad986792","up":true},{"one":"f4b8a95056730a03a6d17b67543860f95eed26b6e43f05a1992f27399d3d3126","other":"94a2afa6bc12fe95765f09f57828c77cc9ea473cd0e9e655ca9f46e1bbabae22","up":true},{"one":"fb64370bc0707215e41afb0da1a53f8aba5e11f471bae4f8dc4bd85a3b66827a","other":"94a2afa6bc12fe95765f09f57828c77cc9ea473cd0e9e655ca9f46e1bbabae22","up":true},{"one":"f9cac95b4c91bea670e5e672bc64e400e63de0b55c423eda5f1499cf218eb244","other":"cbd4aa5e14566c47a93755b537d2d10775346ef11a6c6422b37d0661c9489941","up":true},{"one":"eed4b9a06bc8fa0b7195beeff1bfb7979df37c720dec9c89146820abf483681a","other":"94a2afa6bc12fe95765f09f57828c77cc9ea473cd0e9e655ca9f46e1bbabae22","up":true},{"one":"bf27dccd6f79cc86d38ad7a375b833125aeaad060be117c23c1b71297b072c00","other":"d7563d6dc6a0378406b3758e1cca428a494b76526e06faeadb43350cad986792","up":true},{"one":"2529eb6efbbad4513c12fffff722c2c2496759b5eb3d95302ff9bf7eacc0d427","other":"08ff54b60307cfbbd9b209bf07c7a6f164192b80c9dd5eeadd26e368adbc7dbc","up":true},{"one":"6646ecc87398e09e54b0eb19e57d543d313c3e7357ff84dca8886b83fadae0f4","other":"2f17e180d07832468e6aa9159649cd69b199313cb2c6fe92f1598d86f634da33","up":true},{"one":"6304e2b135455ce02203ebc3f514b5f6293e6bb0c9a98129b7b0d6f6cbc98cef","other":"460148b8444b714b47f09285aa0ce28dc3418cb6b9f458b5202c0533205f82a4","up":true},{"one":"cbd4aa5e14566c47a93755b537d2d10775346ef11a6c6422b37d0661c9489941","other":"9934295fbde37d4a7f867c9a7e1f6428c4996d1b43863dbc5a2f52a546649ef0","up":true},{"one":"62ac6af08ae166b0d5612bc65a07e414876a38a3552091d461c808c5f6b471b0","other":"94a2afa6bc12fe95765f09f57828c77cc9ea473cd0e9e655ca9f46e1bbabae22","up":true},{"one":"2643083442ee9e69517f5008e4ca54dbfa40726bde22216b53bf903895aa0ae0","other":"6ef5de5c1c8e55bc89948bf10a7a2ad11b07170f3b5f049e40a85e244124eee4","up":true},{"one":"577b3342880359b9fa426fdce8fc315cea640592b787e6e3adbdec6699f4b2aa","other":"427f4bdfd3857968af5da36eeea041938ea771bc6c5e90ee8d3585cf579f13b7","up":true},{"one":"6ef5de5c1c8e55bc89948bf10a7a2ad11b07170f3b5f049e40a85e244124eee4","other":"76cb47eba84a7ae0e9f00f1381ba85c2ede9fa7f899a878f94e493b7e2ab4017","up":true},{"one":"11bd810f7ba41f44816f33a19d9c703d26f2ccaea28c4af825f52888070ad8d7","other":"08ff54b60307cfbbd9b209bf07c7a6f164192b80c9dd5eeadd26e368adbc7dbc","up":true},{"one":"9e276cdb622215089f0f20252a6aba20f57521df94d401efa13f604b62534c80","other":"bf27dccd6f79cc86d38ad7a375b833125aeaad060be117c23c1b71297b072c00","up":true},{"one":"4c5fabb7a17c3a3f589c7d2eca3c0dd5a6b8217aabc54323bab75b6af383ac6c","other":"729a18579fad2fc75d6b445167e735615e80bb70379e7a9247a09ba6916579c0","up":true},{"one":"ad4643583aa082b3bef7ce1bb8dcf55fe2e321b8954000cfac6bc72c49e85f50","other":"9934295fbde37d4a7f867c9a7e1f6428c4996d1b43863dbc5a2f52a546649ef0","up":true},{"one":"94a2afa6bc12fe95765f09f57828c77cc9ea473cd0e9e655ca9f46e1bbabae22","other":"9934295fbde37d4a7f867c9a7e1f6428c4996d1b43863dbc5a2f52a546649ef0","up":true},{"one":"2643083442ee9e69517f5008e4ca54dbfa40726bde22216b53bf903895aa0ae0","other":"11bd810f7ba41f44816f33a19d9c703d26f2ccaea28c4af825f52888070ad8d7","up":true},{"one":"f9cac95b4c91bea670e5e672bc64e400e63de0b55c423eda5f1499cf218eb244","other":"eed4b9a06bc8fa0b7195beeff1bfb7979df37c720dec9c89146820abf483681a","up":true},{"one":"460148b8444b714b47f09285aa0ce28dc3418cb6b9f458b5202c0533205f82a4","other":"577b3342880359b9fa426fdce8fc315cea640592b787e6e3adbdec6699f4b2aa","up":true},{"one":"74b720fcd93ff907e0a2f9c8f62e9315e64c2fcd023184ebddfd485d782ba95f","other":"577b3342880359b9fa426fdce8fc315cea640592b787e6e3adbdec6699f4b2aa","up":true},{"one":"6013d40c0c15f5a7b1ddd5a8ef6a80757de9022b208535938b0937b9150771e0","other":"577b3342880359b9fa426fdce8fc315cea640592b787e6e3adbdec6699f4b2aa","up":true},{"one":"cbd4aa5e14566c47a93755b537d2d10775346ef11a6c6422b37d0661c9489941","other":"e4f776dddd9e476608fb335ab22fff1836309b9440ee4ee0fd37a2ba7fca8507","up":true},{"one":"aa7e45d4583570fe382828e4ff3d60ccd526cea01325211d87ceeb6cc14af753","other":"bf27dccd6f79cc86d38ad7a375b833125aeaad060be117c23c1b71297b072c00","up":true},{"one":"9934295fbde37d4a7f867c9a7e1f6428c4996d1b43863dbc5a2f52a546649ef0","other":"4c5fabb7a17c3a3f589c7d2eca3c0dd5a6b8217aabc54323bab75b6af383ac6c","up":true},{"one":"fb64370bc0707215e41afb0da1a53f8aba5e11f471bae4f8dc4bd85a3b66827a","other":"cbd4aa5e14566c47a93755b537d2d10775346ef11a6c6422b37d0661c9489941","up":true},{"one":"6646ecc87398e09e54b0eb19e57d543d313c3e7357ff84dca8886b83fadae0f4","other":"4c5fabb7a17c3a3f589c7d2eca3c0dd5a6b8217aabc54323bab75b6af383ac6c","up":true},{"one":"08ff54b60307cfbbd9b209bf07c7a6f164192b80c9dd5eeadd26e368adbc7dbc","other":"2643083442ee9e69517f5008e4ca54dbfa40726bde22216b53bf903895aa0ae0","up":true},{"one":"62ac6af08ae166b0d5612bc65a07e414876a38a3552091d461c808c5f6b471b0","other":"729a18579fad2fc75d6b445167e735615e80bb70379e7a9247a09ba6916579c0","up":true},{"one":"9c935faafb41a7bd3bda18a8bd022878105bf8453a5b83d2bfa4da46d8c908f8","other":"cbd4aa5e14566c47a93755b537d2d10775346ef11a6c6422b37d0661c9489941","up":true},{"one":"6304e2b135455ce02203ebc3f514b5f6293e6bb0c9a98129b7b0d6f6cbc98cef","other":"729a18579fad2fc75d6b445167e735615e80bb70379e7a9247a09ba6916579c0","up":true},{"one":"2f17e180d07832468e6aa9159649cd69b199313cb2c6fe92f1598d86f634da33","other":"2643083442ee9e69517f5008e4ca54dbfa40726bde22216b53bf903895aa0ae0","up":true},{"one":"f4b8a95056730a03a6d17b67543860f95eed26b6e43f05a1992f27399d3d3126","other":"d7563d6dc6a0378406b3758e1cca428a494b76526e06faeadb43350cad986792","up":true},{"one":"a11b3c67ea36d41264fdc97123a41c8586837199496782e7994b6be831571b77","other":"94a2afa6bc12fe95765f09f57828c77cc9ea473cd0e9e655ca9f46e1bbabae22","up":true},{"one":"eed4b9a06bc8fa0b7195beeff1bfb7979df37c720dec9c89146820abf483681a","other":"d7563d6dc6a0378406b3758e1cca428a494b76526e06faeadb43350cad986792","up":true},{"one":"cbd4aa5e14566c47a93755b537d2d10775346ef11a6c6422b37d0661c9489941","other":"d7563d6dc6a0378406b3758e1cca428a494b76526e06faeadb43350cad986792","up":true},{"one":"2f17e180d07832468e6aa9159649cd69b199313cb2c6fe92f1598d86f634da33","other":"2529eb6efbbad4513c12fffff722c2c2496759b5eb3d95302ff9bf7eacc0d427","up":true},{"one":"729a18579fad2fc75d6b445167e735615e80bb70379e7a9247a09ba6916579c0","other":"6ef5de5c1c8e55bc89948bf10a7a2ad11b07170f3b5f049e40a85e244124eee4","up":true},{"one":"e4f776dddd9e476608fb335ab22fff1836309b9440ee4ee0fd37a2ba7fca8507","other":"d7563d6dc6a0378406b3758e1cca428a494b76526e06faeadb43350cad986792","up":true},{"one":"577b3342880359b9fa426fdce8fc315cea640592b787e6e3adbdec6699f4b2aa","other":"d7563d6dc6a0378406b3758e1cca428a494b76526e06faeadb43350cad986792","up":true},{"one":"76cb47eba84a7ae0e9f00f1381ba85c2ede9fa7f899a878f94e493b7e2ab4017","other":"4c5fabb7a17c3a3f589c7d2eca3c0dd5a6b8217aabc54323bab75b6af383ac6c","up":true},{"one":"4c5fabb7a17c3a3f589c7d2eca3c0dd5a6b8217aabc54323bab75b6af383ac6c","other":"427f4bdfd3857968af5da36eeea041938ea771bc6c5e90ee8d3585cf579f13b7","up":true},{"one":"9e276cdb622215089f0f20252a6aba20f57521df94d401efa13f604b62534c80","other":"94a2afa6bc12fe95765f09f57828c77cc9ea473cd0e9e655ca9f46e1bbabae22","up":true},{"one":"4c5fabb7a17c3a3f589c7d2eca3c0dd5a6b8217aabc54323bab75b6af383ac6c","other":"577b3342880359b9fa426fdce8fc315cea640592b787e6e3adbdec6699f4b2aa","up":true},{"one":"6ef5de5c1c8e55bc89948bf10a7a2ad11b07170f3b5f049e40a85e244124eee4","other":"6646ecc87398e09e54b0eb19e57d543d313c3e7357ff84dca8886b83fadae0f4","up":true},{"one":"ad4643583aa082b3bef7ce1bb8dcf55fe2e321b8954000cfac6bc72c49e85f50","other":"bf27dccd6f79cc86d38ad7a375b833125aeaad060be117c23c1b71297b072c00","up":true},{"one":"11bd810f7ba41f44816f33a19d9c703d26f2ccaea28c4af825f52888070ad8d7","other":"cbd4aa5e14566c47a93755b537d2d10775346ef11a6c6422b37d0661c9489941","up":true},{"one":"9c935faafb41a7bd3bda18a8bd022878105bf8453a5b83d2bfa4da46d8c908f8","other":"94a2afa6bc12fe95765f09f57828c77cc9ea473cd0e9e655ca9f46e1bbabae22","up":true},{"one":"6013d40c0c15f5a7b1ddd5a8ef6a80757de9022b208535938b0937b9150771e0","other":"6ef5de5c1c8e55bc89948bf10a7a2ad11b07170f3b5f049e40a85e244124eee4","up":true},{"one":"460148b8444b714b47f09285aa0ce28dc3418cb6b9f458b5202c0533205f82a4","other":"4c5fabb7a17c3a3f589c7d2eca3c0dd5a6b8217aabc54323bab75b6af383ac6c","up":true},{"one":"fb64370bc0707215e41afb0da1a53f8aba5e11f471bae4f8dc4bd85a3b66827a","other":"f4b8a95056730a03a6d17b67543860f95eed26b6e43f05a1992f27399d3d3126","up":true},{"one":"aa7e45d4583570fe382828e4ff3d60ccd526cea01325211d87ceeb6cc14af753","other":"a11b3c67ea36d41264fdc97123a41c8586837199496782e7994b6be831571b77","up":true},{"one":"e4f776dddd9e476608fb335ab22fff1836309b9440ee4ee0fd37a2ba7fca8507","other":"eed4b9a06bc8fa0b7195beeff1bfb7979df37c720dec9c89146820abf483681a","up":true},{"one":"9934295fbde37d4a7f867c9a7e1f6428c4996d1b43863dbc5a2f52a546649ef0","other":"aa7e45d4583570fe382828e4ff3d60ccd526cea01325211d87ceeb6cc14af753","up":true},{"one":"74b720fcd93ff907e0a2f9c8f62e9315e64c2fcd023184ebddfd485d782ba95f","other":"729a18579fad2fc75d6b445167e735615e80bb70379e7a9247a09ba6916579c0","up":true},{"one":"2f17e180d07832468e6aa9159649cd69b199313cb2c6fe92f1598d86f634da33","other":"9934295fbde37d4a7f867c9a7e1f6428c4996d1b43863dbc5a2f52a546649ef0","up":true},{"one":"f9cac95b4c91bea670e5e672bc64e400e63de0b55c423eda5f1499cf218eb244","other":"f4b8a95056730a03a6d17b67543860f95eed26b6e43f05a1992f27399d3d3126","up":true},{"one":"a11b3c67ea36d41264fdc97123a41c8586837199496782e7994b6be831571b77","other":"bf27dccd6f79cc86d38ad7a375b833125aeaad060be117c23c1b71297b072c00","up":true},{"one":"62ac6af08ae166b0d5612bc65a07e414876a38a3552091d461c808c5f6b471b0","other":"6ef5de5c1c8e55bc89948bf10a7a2ad11b07170f3b5f049e40a85e244124eee4","up":true},{"one":"2643083442ee9e69517f5008e4ca54dbfa40726bde22216b53bf903895aa0ae0","other":"2529eb6efbbad4513c12fffff722c2c2496759b5eb3d95302ff9bf7eacc0d427","up":true},{"one":"577b3342880359b9fa426fdce8fc315cea640592b787e6e3adbdec6699f4b2aa","other":"11bd810f7ba41f44816f33a19d9c703d26f2ccaea28c4af825f52888070ad8d7","up":true},{"one":"76cb47eba84a7ae0e9f00f1381ba85c2ede9fa7f899a878f94e493b7e2ab4017","other":"729a18579fad2fc75d6b445167e735615e80bb70379e7a9247a09ba6916579c0","up":true},{"one":"6304e2b135455ce02203ebc3f514b5f6293e6bb0c9a98129b7b0d6f6cbc98cef","other":"6ef5de5c1c8e55bc89948bf10a7a2ad11b07170f3b5f049e40a85e244124eee4","up":true},{"one":"6646ecc87398e09e54b0eb19e57d543d313c3e7357ff84dca8886b83fadae0f4","other":"729a18579fad2fc75d6b445167e735615e80bb70379e7a9247a09ba6916579c0","up":true},{"one":"f4b8a95056730a03a6d17b67543860f95eed26b6e43f05a1992f27399d3d3126","other":"e4f776dddd9e476608fb335ab22fff1836309b9440ee4ee0fd37a2ba7fca8507","up":true},{"one":"d7563d6dc6a0378406b3758e1cca428a494b76526e06faeadb43350cad986792","other":"fb64370bc0707215e41afb0da1a53f8aba5e11f471bae4f8dc4bd85a3b66827a","up":true},{"one":"bf27dccd6f79cc86d38ad7a375b833125aeaad060be117c23c1b71297b072c00","other":"cbd4aa5e14566c47a93755b537d2d10775346ef11a6c6422b37d0661c9489941","up":true},{"one":"cbd4aa5e14566c47a93755b537d2d10775346ef11a6c6422b37d0661c9489941","other":"eed4b9a06bc8fa0b7195beeff1bfb7979df37c720dec9c89146820abf483681a","up":true},{"one":"427f4bdfd3857968af5da36eeea041938ea771bc6c5e90ee8d3585cf579f13b7","other":"460148b8444b714b47f09285aa0ce28dc3418cb6b9f458b5202c0533205f82a4","up":true},{"one":"6ef5de5c1c8e55bc89948bf10a7a2ad11b07170f3b5f049e40a85e244124eee4","other":"eed4b9a06bc8fa0b7195beeff1bfb7979df37c720dec9c89146820abf483681a","up":true},{"one":"9e276cdb622215089f0f20252a6aba20f57521df94d401efa13f604b62534c80","other":"9934295fbde37d4a7f867c9a7e1f6428c4996d1b43863dbc5a2f52a546649ef0","up":true},{"one":"2529eb6efbbad4513c12fffff722c2c2496759b5eb3d95302ff9bf7eacc0d427","other":"4c5fabb7a17c3a3f589c7d2eca3c0dd5a6b8217aabc54323bab75b6af383ac6c","up":true},{"one":"ad4643583aa082b3bef7ce1bb8dcf55fe2e321b8954000cfac6bc72c49e85f50","other":"a11b3c67ea36d41264fdc97123a41c8586837199496782e7994b6be831571b77","up":true},{"one":"f9cac95b4c91bea670e5e672bc64e400e63de0b55c423eda5f1499cf218eb244","other":"fb64370bc0707215e41afb0da1a53f8aba5e11f471bae4f8dc4bd85a3b66827a","up":true},{"one":"6013d40c0c15f5a7b1ddd5a8ef6a80757de9022b208535938b0937b9150771e0","other":"6646ecc87398e09e54b0eb19e57d543d313c3e7357ff84dca8886b83fadae0f4","up":true},{"one":"74b720fcd93ff907e0a2f9c8f62e9315e64c2fcd023184ebddfd485d782ba95f","other":"76cb47eba84a7ae0e9f00f1381ba85c2ede9fa7f899a878f94e493b7e2ab4017","up":true},{"one":"9934295fbde37d4a7f867c9a7e1f6428c4996d1b43863dbc5a2f52a546649ef0","other":"e4f776dddd9e476608fb335ab22fff1836309b9440ee4ee0fd37a2ba7fca8507","up":true},{"one":"11bd810f7ba41f44816f33a19d9c703d26f2ccaea28c4af825f52888070ad8d7","other":"2529eb6efbbad4513c12fffff722c2c2496759b5eb3d95302ff9bf7eacc0d427","up":true},{"one":"fb64370bc0707215e41afb0da1a53f8aba5e11f471bae4f8dc4bd85a3b66827a","other":"2f17e180d07832468e6aa9159649cd69b199313cb2c6fe92f1598d86f634da33","up":true},{"one":"460148b8444b714b47f09285aa0ce28dc3418cb6b9f458b5202c0533205f82a4","other":"729a18579fad2fc75d6b445167e735615e80bb70379e7a9247a09ba6916579c0","up":true},{"one":"9c935faafb41a7bd3bda18a8bd022878105bf8453a5b83d2bfa4da46d8c908f8","other":"9e276cdb622215089f0f20252a6aba20f57521df94d401efa13f604b62534c80","up":true},{"one":"6646ecc87398e09e54b0eb19e57d543d313c3e7357ff84dca8886b83fadae0f4","other":"2643083442ee9e69517f5008e4ca54dbfa40726bde22216b53bf903895aa0ae0","up":true},{"one":"aa7e45d4583570fe382828e4ff3d60ccd526cea01325211d87ceeb6cc14af753","other":"ad4643583aa082b3bef7ce1bb8dcf55fe2e321b8954000cfac6bc72c49e85f50","up":true},{"one":"2529eb6efbbad4513c12fffff722c2c2496759b5eb3d95302ff9bf7eacc0d427","other":"94a2afa6bc12fe95765f09f57828c77cc9ea473cd0e9e655ca9f46e1bbabae22","up":true},{"one":"62ac6af08ae166b0d5612bc65a07e414876a38a3552091d461c808c5f6b471b0","other":"6646ecc87398e09e54b0eb19e57d543d313c3e7357ff84dca8886b83fadae0f4","up":true},{"one":"f4b8a95056730a03a6d17b67543860f95eed26b6e43f05a1992f27399d3d3126","other":"9934295fbde37d4a7f867c9a7e1f6428c4996d1b43863dbc5a2f52a546649ef0","up":true},{"one":"76cb47eba84a7ae0e9f00f1381ba85c2ede9fa7f899a878f94e493b7e2ab4017","other":"11bd810f7ba41f44816f33a19d9c703d26f2ccaea28c4af825f52888070ad8d7","up":true},{"one":"6304e2b135455ce02203ebc3f514b5f6293e6bb0c9a98129b7b0d6f6cbc98cef","other":"6646ecc87398e09e54b0eb19e57d543d313c3e7357ff84dca8886b83fadae0f4","up":true},{"one":"a11b3c67ea36d41264fdc97123a41c8586837199496782e7994b6be831571b77","other":"cbd4aa5e14566c47a93755b537d2d10775346ef11a6c6422b37d0661c9489941","up":true},{"one":"eed4b9a06bc8fa0b7195beeff1bfb7979df37c720dec9c89146820abf483681a","other":"9934295fbde37d4a7f867c9a7e1f6428c4996d1b43863dbc5a2f52a546649ef0","up":true},{"one":"d7563d6dc6a0378406b3758e1cca428a494b76526e06faeadb43350cad986792","other":"f9cac95b4c91bea670e5e672bc64e400e63de0b55c423eda5f1499cf218eb244","up":true},{"one":"729a18579fad2fc75d6b445167e735615e80bb70379e7a9247a09ba6916579c0","other":"11bd810f7ba41f44816f33a19d9c703d26f2ccaea28c4af825f52888070ad8d7","up":true},{"one":"cbd4aa5e14566c47a93755b537d2d10775346ef11a6c6422b37d0661c9489941","other":"f4b8a95056730a03a6d17b67543860f95eed26b6e43f05a1992f27399d3d3126","up":true},{"one":"9e276cdb622215089f0f20252a6aba20f57521df94d401efa13f604b62534c80","other":"d7563d6dc6a0378406b3758e1cca428a494b76526e06faeadb43350cad986792","up":true},{"one":"6ef5de5c1c8e55bc89948bf10a7a2ad11b07170f3b5f049e40a85e244124eee4","other":"577b3342880359b9fa426fdce8fc315cea640592b787e6e3adbdec6699f4b2aa","up":true},{"one":"aa7e45d4583570fe382828e4ff3d60ccd526cea01325211d87ceeb6cc14af753","other":"2f17e180d07832468e6aa9159649cd69b199313cb2c6fe92f1598d86f634da33","up":true},{"one":"427f4bdfd3857968af5da36eeea041938ea771bc6c5e90ee8d3585cf579f13b7","other":"e4f776dddd9e476608fb335ab22fff1836309b9440ee4ee0fd37a2ba7fca8507","up":true},{"one":"ad4643583aa082b3bef7ce1bb8dcf55fe2e321b8954000cfac6bc72c49e85f50","other":"d7563d6dc6a0378406b3758e1cca428a494b76526e06faeadb43350cad986792","up":true},{"one":"9c935faafb41a7bd3bda18a8bd022878105bf8453a5b83d2bfa4da46d8c908f8","other":"4c5fabb7a17c3a3f589c7d2eca3c0dd5a6b8217aabc54323bab75b6af383ac6c","up":true},{"one":"f9cac95b4c91bea670e5e672bc64e400e63de0b55c423eda5f1499cf218eb244","other":"2643083442ee9e69517f5008e4ca54dbfa40726bde22216b53bf903895aa0ae0","up":true},{"one":"6013d40c0c15f5a7b1ddd5a8ef6a80757de9022b208535938b0937b9150771e0","other":"62ac6af08ae166b0d5612bc65a07e414876a38a3552091d461c808c5f6b471b0","up":true},{"one":"74b720fcd93ff907e0a2f9c8f62e9315e64c2fcd023184ebddfd485d782ba95f","other":"bf27dccd6f79cc86d38ad7a375b833125aeaad060be117c23c1b71297b072c00","up":true},{"one":"76cb47eba84a7ae0e9f00f1381ba85c2ede9fa7f899a878f94e493b7e2ab4017","other":"460148b8444b714b47f09285aa0ce28dc3418cb6b9f458b5202c0533205f82a4","up":true},{"one":"a11b3c67ea36d41264fdc97123a41c8586837199496782e7994b6be831571b77","other":"9934295fbde37d4a7f867c9a7e1f6428c4996d1b43863dbc5a2f52a546649ef0","up":true},{"one":"9934295fbde37d4a7f867c9a7e1f6428c4996d1b43863dbc5a2f52a546649ef0","other":"fb64370bc0707215e41afb0da1a53f8aba5e11f471bae4f8dc4bd85a3b66827a","up":true},{"one":"eed4b9a06bc8fa0b7195beeff1bfb7979df37c720dec9c89146820abf483681a","other":"fb64370bc0707215e41afb0da1a53f8aba5e11f471bae4f8dc4bd85a3b66827a","up":true},{"one":"6646ecc87398e09e54b0eb19e57d543d313c3e7357ff84dca8886b83fadae0f4","other":"460148b8444b714b47f09285aa0ce28dc3418cb6b9f458b5202c0533205f82a4","up":true},{"one":"6304e2b135455ce02203ebc3f514b5f6293e6bb0c9a98129b7b0d6f6cbc98cef","other":"6013d40c0c15f5a7b1ddd5a8ef6a80757de9022b208535938b0937b9150771e0","up":true},{"one":"e4f776dddd9e476608fb335ab22fff1836309b9440ee4ee0fd37a2ba7fca8507","other":"f9cac95b4c91bea670e5e672bc64e400e63de0b55c423eda5f1499cf218eb244","up":true},{"one":"f4b8a95056730a03a6d17b67543860f95eed26b6e43f05a1992f27399d3d3126","other":"eed4b9a06bc8fa0b7195beeff1bfb7979df37c720dec9c89146820abf483681a","up":true},{"one":"427f4bdfd3857968af5da36eeea041938ea771bc6c5e90ee8d3585cf579f13b7","other":"2529eb6efbbad4513c12fffff722c2c2496759b5eb3d95302ff9bf7eacc0d427","up":true},{"one":"9c935faafb41a7bd3bda18a8bd022878105bf8453a5b83d2bfa4da46d8c908f8","other":"ad4643583aa082b3bef7ce1bb8dcf55fe2e321b8954000cfac6bc72c49e85f50","up":true},{"one":"6013d40c0c15f5a7b1ddd5a8ef6a80757de9022b208535938b0937b9150771e0","other":"bf27dccd6f79cc86d38ad7a375b833125aeaad060be117c23c1b71297b072c00","up":true},{"one":"aa7e45d4583570fe382828e4ff3d60ccd526cea01325211d87ceeb6cc14af753","other":"d7563d6dc6a0378406b3758e1cca428a494b76526e06faeadb43350cad986792","up":true},{"one":"f9cac95b4c91bea670e5e672bc64e400e63de0b55c423eda5f1499cf218eb244","other":"bf27dccd6f79cc86d38ad7a375b833125aeaad060be117c23c1b71297b072c00","up":true},{"one":"9e276cdb622215089f0f20252a6aba20f57521df94d401efa13f604b62534c80","other":"a11b3c67ea36d41264fdc97123a41c8586837199496782e7994b6be831571b77","up":true},{"one":"9c935faafb41a7bd3bda18a8bd022878105bf8453a5b83d2bfa4da46d8c908f8","other":"d7563d6dc6a0378406b3758e1cca428a494b76526e06faeadb43350cad986792","up":true},{"one":"74b720fcd93ff907e0a2f9c8f62e9315e64c2fcd023184ebddfd485d782ba95f","other":"2529eb6efbbad4513c12fffff722c2c2496759b5eb3d95302ff9bf7eacc0d427","up":true},{"one":"62ac6af08ae166b0d5612bc65a07e414876a38a3552091d461c808c5f6b471b0","other":"6304e2b135455ce02203ebc3f514b5f6293e6bb0c9a98129b7b0d6f6cbc98cef","up":true},{"one":"6646ecc87398e09e54b0eb19e57d543d313c3e7357ff84dca8886b83fadae0f4","other":"74b720fcd93ff907e0a2f9c8f62e9315e64c2fcd023184ebddfd485d782ba95f","up":true},{"one":"76cb47eba84a7ae0e9f00f1381ba85c2ede9fa7f899a878f94e493b7e2ab4017","other":"6646ecc87398e09e54b0eb19e57d543d313c3e7357ff84dca8886b83fadae0f4","up":true},{"one":"427f4bdfd3857968af5da36eeea041938ea771bc6c5e90ee8d3585cf579f13b7","other":"76cb47eba84a7ae0e9f00f1381ba85c2ede9fa7f899a878f94e493b7e2ab4017","up":true},{"one":"6013d40c0c15f5a7b1ddd5a8ef6a80757de9022b208535938b0937b9150771e0","other":"2643083442ee9e69517f5008e4ca54dbfa40726bde22216b53bf903895aa0ae0","up":true},{"one":"4c5fabb7a17c3a3f589c7d2eca3c0dd5a6b8217aabc54323bab75b6af383ac6c","other":"74b720fcd93ff907e0a2f9c8f62e9315e64c2fcd023184ebddfd485d782ba95f","up":true},{"one":"62ac6af08ae166b0d5612bc65a07e414876a38a3552091d461c808c5f6b471b0","other":"9934295fbde37d4a7f867c9a7e1f6428c4996d1b43863dbc5a2f52a546649ef0","up":true},{"one":"6304e2b135455ce02203ebc3f514b5f6293e6bb0c9a98129b7b0d6f6cbc98cef","other":"9934295fbde37d4a7f867c9a7e1f6428c4996d1b43863dbc5a2f52a546649ef0","up":true},{"one":"6013d40c0c15f5a7b1ddd5a8ef6a80757de9022b208535938b0937b9150771e0","other":"4c5fabb7a17c3a3f589c7d2eca3c0dd5a6b8217aabc54323bab75b6af383ac6c","up":true},{"one":"62ac6af08ae166b0d5612bc65a07e414876a38a3552091d461c808c5f6b471b0","other":"11bd810f7ba41f44816f33a19d9c703d26f2ccaea28c4af825f52888070ad8d7","up":true},{"one":"6304e2b135455ce02203ebc3f514b5f6293e6bb0c9a98129b7b0d6f6cbc98cef","other":"11bd810f7ba41f44816f33a19d9c703d26f2ccaea28c4af825f52888070ad8d7","up":true},{"one":"6013d40c0c15f5a7b1ddd5a8ef6a80757de9022b208535938b0937b9150771e0","other":"729a18579fad2fc75d6b445167e735615e80bb70379e7a9247a09ba6916579c0","up":true},{"one":"4c5fabb7a17c3a3f589c7d2eca3c0dd5a6b8217aabc54323bab75b6af383ac6c","other":"62ac6af08ae166b0d5612bc65a07e414876a38a3552091d461c808c5f6b471b0","up":true},{"one":"4c5fabb7a17c3a3f589c7d2eca3c0dd5a6b8217aabc54323bab75b6af383ac6c","other":"6304e2b135455ce02203ebc3f514b5f6293e6bb0c9a98129b7b0d6f6cbc98cef","up":true},{"one":"74b720fcd93ff907e0a2f9c8f62e9315e64c2fcd023184ebddfd485d782ba95f","other":"62ac6af08ae166b0d5612bc65a07e414876a38a3552091d461c808c5f6b471b0","up":true},{"one":"6304e2b135455ce02203ebc3f514b5f6293e6bb0c9a98129b7b0d6f6cbc98cef","other":"74b720fcd93ff907e0a2f9c8f62e9315e64c2fcd023184ebddfd485d782ba95f","up":true}]} \ No newline at end of file diff --git a/vendor/github.com/ethereum/go-ethereum/swarm/network/stream/testing/snapshot_4.json b/vendor/github.com/ethereum/go-ethereum/swarm/network/stream/testing/snapshot_4.json deleted file mode 100644 index 81afb03f..00000000 --- a/vendor/github.com/ethereum/go-ethereum/swarm/network/stream/testing/snapshot_4.json +++ /dev/null @@ -1 +0,0 @@ -{"nodes":[{"node":{"info":{"id":"0b405ded87ce4e712aaebb3055e70716c971fe049a54961294c7a7a0471d12f6","name":"node_0b405ded87ce4e712aaebb3055e70716c971fe049a54961294c7a7a0471d12f6","enode":"enode://918f13e29fcea21b47e553c60ea0ae63f856db5745c6010e31b566f819195f9a5f250788862c43b230dd93fbc24cb6b3d33c86069cc21de3a3612b2f32eeccbe@127.0.0.1:0","enr":"0xf88fb840ad1a67c3b07299bb50337351be97595ef05e5ab7988ab7831e06a3003d1fc4ad74e925ec495ab312ccc889eb9c05f2e14f625e56f813a76dc53ddd94ea0955f90183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102918f13e29fcea21b47e553c60ea0ae63f856db5745c6010e31b566f819195f9a","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"C0Bd7YfOTnEqrrswVecHFslx/gSaVJYSlMenoEcdEvY=","hive":"\n=========================================================================\nThu Feb 28 17:59:23 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 0b405d\npopulation: 3 (3), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 1 a430 | 1 a430 (0)\n============ DEPTH: 1 ==========================================\n001 2 77ba 675c | 2 77ba (0) 675c (0)\n002 0 | 0\n003 0 | 0\n004 0 | 0\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"0b405ded87ce4e712aaebb3055e70716c971fe049a54961294c7a7a0471d12f6","private_key":"173c23bc3aec26afe7d299eb9556e7c189851378fe56125d929966ac7207bcb6","name":"node_0b405ded87ce4e712aaebb3055e70716c971fe049a54961294c7a7a0471d12f6","services":["streamer"],"enable_msg_events":true,"port":38277},"up":true}},{"node":{"info":{"id":"a4301045c0cde5acb5406e1fba46ec868c056439ab43ef795830748fb6ba2e5a","name":"node_a4301045c0cde5acb5406e1fba46ec868c056439ab43ef795830748fb6ba2e5a","enode":"enode://89b66f574168570cc5d347051c0e2b05b33578d42142ef8cc930f1fbb384266f2827e4b087f5e2985a32d8f2b353fb7be416193632da5c692cace99d1b9e4274@127.0.0.1:0","enr":"0xf88fb8402e6392d3d5377977fc4b4d29f4dbf4ca96e963df056ead84ec2fcb7ee071996670a935d3b49250455e02c392baacb4c8499f815f74b09c405316a5d2fdee94e60183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10289b66f574168570cc5d347051c0e2b05b33578d42142ef8cc930f1fbb384266f","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"pDAQRcDN5ay1QG4fukbshowFZDmrQ+95WDB0j7a6Llo=","hive":"\n=========================================================================\nThu Feb 28 17:59:23 UTC 2019 KΛÐΞMLIΛ hive: queen's address: a43010\npopulation: 3 (3), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n============ DEPTH: 0 ==========================================\n000 3 675c 77ba 0b40 | 3 675c (0) 77ba (0) 0b40 (0)\n001 0 | 0\n002 0 | 0\n003 0 | 0\n004 0 | 0\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"a4301045c0cde5acb5406e1fba46ec868c056439ab43ef795830748fb6ba2e5a","private_key":"5bcd3bbb886e5ad2317a6ac1de2b19ebe27db9337ba8e7daa76a1cdaa6a3d158","name":"node_a4301045c0cde5acb5406e1fba46ec868c056439ab43ef795830748fb6ba2e5a","services":["streamer"],"enable_msg_events":true,"port":41325},"up":true}},{"node":{"info":{"id":"77ba145a4623b9c83e0a14a375ba49c68719f2abe162ffca66de7ef2e31a75f8","name":"node_77ba145a4623b9c83e0a14a375ba49c68719f2abe162ffca66de7ef2e31a75f8","enode":"enode://ecb56004a128067628a3198244080ba4ac79860cb2cf74407d7571955a80fb9243ad5f8265063a5aa209ea95329b4b57d0f1b492a85835ab87fce79881a895a9@127.0.0.1:0","enr":"0xf88fb84035ed878b2a99ed1bbd55df1701cd82115aebc649b1e8e68302e7caf5480a61322c74189d1fe66f2d16e79174f0e3479213f0bf963a4518d583078e164bd94a220183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103ecb56004a128067628a3198244080ba4ac79860cb2cf74407d7571955a80fb92","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"d7oUWkYjucg+ChSjdbpJxocZ8qvhYv/KZt5+8uMadfg=","hive":"\n=========================================================================\nThu Feb 28 17:59:23 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 77ba14\npopulation: 3 (3), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 1 a430 | 1 a430 (0)\n============ DEPTH: 1 ==========================================\n001 1 0b40 | 1 0b40 (0)\n002 0 | 0\n003 1 675c | 1 675c (0)\n004 0 | 0\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"77ba145a4623b9c83e0a14a375ba49c68719f2abe162ffca66de7ef2e31a75f8","private_key":"6f30c3d0135202cbf540669c8c76d9144bd53764aaf4ae18e8bee98ce05c6211","name":"node_77ba145a4623b9c83e0a14a375ba49c68719f2abe162ffca66de7ef2e31a75f8","services":["streamer"],"enable_msg_events":true,"port":40785},"up":true}},{"node":{"info":{"id":"675cfed0a7b461f43cfebd6a10ecc8868d35b245381d731abec4608b6dce250a","name":"node_675cfed0a7b461f43cfebd6a10ecc8868d35b245381d731abec4608b6dce250a","enode":"enode://64a6b33b028b818a1961272651d1d7a976329e541b6e3e983f518d89326d7427f4c9243f78bb03fd2e2dc059f610ee50d1e664e3107db01ac603b9c3b20ebb4f@127.0.0.1:0","enr":"0xf88fb8407dbbb99300e04c6917c27d61bf396481aae19287c2869e8dd74e11b0f2ebb74174376a6152c26af95173a4868a0349aaf3be5d063918590fd5962f4af174e0010183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10364a6b33b028b818a1961272651d1d7a976329e541b6e3e983f518d89326d7427","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"Z1z+0Ke0YfQ8/r1qEOzIho01skU4HXMavsRgi23OJQo=","hive":"\n=========================================================================\nThu Feb 28 17:59:23 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 675cfe\npopulation: 3 (3), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 1 a430 | 1 a430 (0)\n============ DEPTH: 1 ==========================================\n001 1 0b40 | 1 0b40 (0)\n002 0 | 0\n003 1 77ba | 1 77ba (0)\n004 0 | 0\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"675cfed0a7b461f43cfebd6a10ecc8868d35b245381d731abec4608b6dce250a","private_key":"d77006035afa5194053c0347021f7825a71f9643028c45b65756ef88ee53e6dd","name":"node_675cfed0a7b461f43cfebd6a10ecc8868d35b245381d731abec4608b6dce250a","services":["streamer"],"enable_msg_events":true,"port":37069},"up":true}}],"conns":[{"one":"0b405ded87ce4e712aaebb3055e70716c971fe049a54961294c7a7a0471d12f6","other":"a4301045c0cde5acb5406e1fba46ec868c056439ab43ef795830748fb6ba2e5a","up":true},{"one":"a4301045c0cde5acb5406e1fba46ec868c056439ab43ef795830748fb6ba2e5a","other":"77ba145a4623b9c83e0a14a375ba49c68719f2abe162ffca66de7ef2e31a75f8","up":true},{"one":"77ba145a4623b9c83e0a14a375ba49c68719f2abe162ffca66de7ef2e31a75f8","other":"675cfed0a7b461f43cfebd6a10ecc8868d35b245381d731abec4608b6dce250a","up":true},{"one":"675cfed0a7b461f43cfebd6a10ecc8868d35b245381d731abec4608b6dce250a","other":"0b405ded87ce4e712aaebb3055e70716c971fe049a54961294c7a7a0471d12f6","up":true},{"one":"77ba145a4623b9c83e0a14a375ba49c68719f2abe162ffca66de7ef2e31a75f8","other":"0b405ded87ce4e712aaebb3055e70716c971fe049a54961294c7a7a0471d12f6","up":true},{"one":"a4301045c0cde5acb5406e1fba46ec868c056439ab43ef795830748fb6ba2e5a","other":"675cfed0a7b461f43cfebd6a10ecc8868d35b245381d731abec4608b6dce250a","up":true}]} \ No newline at end of file diff --git a/vendor/github.com/ethereum/go-ethereum/swarm/network/stream/testing/snapshot_64.json b/vendor/github.com/ethereum/go-ethereum/swarm/network/stream/testing/snapshot_64.json deleted file mode 100644 index 71548556..00000000 --- a/vendor/github.com/ethereum/go-ethereum/swarm/network/stream/testing/snapshot_64.json +++ /dev/null @@ -1 +0,0 @@ -{"nodes":[{"node":{"info":{"id":"33fe6d6970690e8d9e2b08ff234cb1eaf336baa53b398511cd078dcce2c8b2da","name":"node_33fe6d6970690e8d9e2b08ff234cb1eaf336baa53b398511cd078dcce2c8b2da","enode":"enode://189f684252bf3145e01947ecea3430ca79da66c9c79baba0c7afac7577fd8eb6cc663b270219bf730d98b9221eaea5dfeaf64c3a0097aba12ccc9bd2fea77174@127.0.0.1:0","enr":"0xf88fb8409210a452686c812613891a7481ab1ecb134964d862f61460027f50b5b112d39a256f7cd8dc529b01f133a7fb15be96b7a8ee77dcb92f1c3e39cb0d2cd3af09830183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102189f684252bf3145e01947ecea3430ca79da66c9c79baba0c7afac7577fd8eb6","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"M/5taXBpDo2eKwj/I0yx6vM2uqU7OYURzQeNzOLIsto=","hive":"\n=========================================================================\nThu Feb 28 18:02:46 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 33fe6d\npopulation: 26 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 8 c05d c67d c62e ff06 | 35 ce82 (0) c851 (0) c34b (0) c05d (0)\n001 8 5bf6 4e4e 4853 4443 | 15 6049 (0) 62c0 (0) 6271 (0) 75bf (0)\n002 5 0e8f 041c 10d5 1a93 | 8 10d5 (0) 12b8 (0) 1a93 (0) 1dd4 (0)\n============ DEPTH: 3 ==========================================\n003 5 2f1a 2b80 2b79 27c2 | 5 2293 (0) 27c2 (0) 2f1a (0) 2b79 (0)\n004 0 | 0\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"33fe6d6970690e8d9e2b08ff234cb1eaf336baa53b398511cd078dcce2c8b2da","private_key":"58cdd771550771fd62cd26564dda083ef20e140c1d5530cd86a85b7df1f7f269","name":"node_33fe6d6970690e8d9e2b08ff234cb1eaf336baa53b398511cd078dcce2c8b2da","services":["streamer"],"enable_msg_events":true,"port":45167},"up":true}},{"node":{"info":{"id":"b2697a3f2de6ea0d13586a655463782509691d6f05d90f45fd08823e7eaf5a0b","name":"node_b2697a3f2de6ea0d13586a655463782509691d6f05d90f45fd08823e7eaf5a0b","enode":"enode://b91f0615ca78edb614985f7643eeb09bdc0476aa30b73d0b711f87d59eaf466246423fc97d81dbd96192287bf373174ed814b96413bfcd872d4ccd53d3c4841c@127.0.0.1:0","enr":"0xf88fb8405b40eaf3f4b6452b70caa681969bd278b3912b26df53438d01543d219a38254e1ea4b61d25c38733700b16acb82ee9c22c26a62e9d21bbac2e105c734fd985ef0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102b91f0615ca78edb614985f7643eeb09bdc0476aa30b73d0b711f87d59eaf4662","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"sml6Py3m6g0TWGplVGN4JQlpHW8F2Q9F/QiCPn6vWgs=","hive":"\n=========================================================================\nThu Feb 28 18:02:46 UTC 2019 KΛÐΞMLIΛ hive: queen's address: b2697a\npopulation: 17 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 6049 46af 5b93 33fe | 29 6049 (0) 62c0 (0) 6271 (0) 75bf (0)\n001 4 ec08 c034 c67d c62e | 21 ce82 (0) c851 (0) c34b (0) c05d (0)\n002 2 83aa 8934 | 6 9861 (0) 9009 (0) 9637 (0) 83aa (0)\n003 4 a259 ab25 aeff adfd | 4 a259 (0) aeff (0) adfd (0) ab25 (0)\n============ DEPTH: 4 ==========================================\n004 3 bbbc bc3e be5d | 3 be5d (0) bc3e (0) bbbc (0)\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"b2697a3f2de6ea0d13586a655463782509691d6f05d90f45fd08823e7eaf5a0b","private_key":"f7d4ee33924c6fecc03e8531d4a760dfa3f045c2070ead81351cc717118b94c4","name":"node_b2697a3f2de6ea0d13586a655463782509691d6f05d90f45fd08823e7eaf5a0b","services":["streamer"],"enable_msg_events":true,"port":45247},"up":true}},{"node":{"info":{"id":"8934ee6bbfc9c912a5a5fb004eb3df0b65313e22e8ceb8dc3f3e13d10853228f","name":"node_8934ee6bbfc9c912a5a5fb004eb3df0b65313e22e8ceb8dc3f3e13d10853228f","enode":"enode://594fd2ab5b614c45fcf39e323750e1d17a2f4054d8a9939c433993f5050e3990638006f044b8fe5f095108e0df4bb507375ddde04c9973283856f126fc553237@127.0.0.1:0","enr":"0xf88fb840c50ff8109fb29d7550e93a6b0c1e4411d83ff6d612cef057b29b0fe5d8f7fa193cc9d16dec8587e4b27c4cdc32c7304cf80b7c32087c779c819970be16ba18830183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103594fd2ab5b614c45fcf39e323750e1d17a2f4054d8a9939c433993f5050e3990","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"iTTua7/JyRKlpfsATrPfC2UxPiLozrjcPz4T0QhTIo8=","hive":"\n=========================================================================\nThu Feb 28 18:02:46 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 8934ee\npopulation: 27 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 8 0e8f 1dd4 2b79 27c2 | 29 33fe (0) 2293 (0) 27c2 (0) 2b79 (0)\n001 9 f16d fef2 ec3e e59a | 21 ce82 (0) c851 (0) c34b (0) c05d (0)\n002 5 aeff adfd ab25 be5d | 8 a259 (0) aeff (0) adfd (0) ab25 (0)\n003 3 9637 9009 9861 | 3 9861 (0) 9009 (0) 9637 (0)\n============ DEPTH: 4 ==========================================\n004 1 83aa | 1 83aa (0)\n005 1 8cb7 | 1 8cb7 (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"8934ee6bbfc9c912a5a5fb004eb3df0b65313e22e8ceb8dc3f3e13d10853228f","private_key":"c1a5ff4b52beb6e91e007799d9b94a2afe91ad74a387ea3de8ae5a1b3daddcc0","name":"node_8934ee6bbfc9c912a5a5fb004eb3df0b65313e22e8ceb8dc3f3e13d10853228f","services":["streamer"],"enable_msg_events":true,"port":35697},"up":true}},{"node":{"info":{"id":"4443b3497092c9f200fe7d43c32a533f8fc9fa7129226e1e2c7fd5f7f27e1711","name":"node_4443b3497092c9f200fe7d43c32a533f8fc9fa7129226e1e2c7fd5f7f27e1711","enode":"enode://426b52190ebc9cfa8e1d426d495ed10688ea702182bb347c25a37f362f2fc457df723fbafc48abbfcfb00d71ed2fb35bc642ea3fe52cf099a2513006165fa780@127.0.0.1:0","enr":"0xf88fb840f9687dee63db3d7523fc5e5345328e7d01d34286124dfb1d8565aebf86f3f2fb5c22b30d3c61ac8c8a3692d3c5dd1b4702c24da65bcd3c9e06c35e9eef56e5ed0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102426b52190ebc9cfa8e1d426d495ed10688ea702182bb347c25a37f362f2fc457","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"REOzSXCSyfIA/n1DwypTP4/J+nEpIm4eLH/V9/J+FxE=","hive":"\n=========================================================================\nThu Feb 28 18:02:46 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 4443b3\npopulation: 14 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 ce82 8934 | 35 ce82 (0) c851 (0) c34b (0) c05d (0)\n001 3 33fe 2293 2b80 | 14 33fe (0) 2293 (0) 27c2 (0) 2b79 (0)\n002 2 6271 62c0 | 5 6049 (0) 62c0 (0) 6271 (0) 75bf (0)\n003 2 55a2 5bf6 | 4 55a2 (0) 5b87 (0) 5b93 (0) 5bf6 (0)\n004 2 4853 4e4e | 2 4e4e (0) 4853 (0)\n005 1 404b | 1 404b (0)\n============ DEPTH: 6 ==========================================\n006 1 46af | 1 46af (0)\n007 1 4541 | 1 4541 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"4443b3497092c9f200fe7d43c32a533f8fc9fa7129226e1e2c7fd5f7f27e1711","private_key":"1fdc1683e025dbb4aabcc2b580cac31c8d7bd3862f5eaa0786c55ba1d5fe2e3a","name":"node_4443b3497092c9f200fe7d43c32a533f8fc9fa7129226e1e2c7fd5f7f27e1711","services":["streamer"],"enable_msg_events":true,"port":35969},"up":true}},{"node":{"info":{"id":"5bf6a2fe481412b1b20f0cc2325a1119fda9e34c4def3d1f4026a88dc0c992ac","name":"node_5bf6a2fe481412b1b20f0cc2325a1119fda9e34c4def3d1f4026a88dc0c992ac","enode":"enode://d7953737b7f648f15413610ae2e027887e3ac47d3a49ff0c53b5813d980758bf1d3f12e711e824d7948bc24e2ba00d5558fccb7155232570ecd58236c2aa35ff@127.0.0.1:0","enr":"0xf88fb840f2731673fc9ef09cb16f3be083528cdc666e5d0e3ad5a8473aeda9cca202c5683d9af6f21212e6f6711983b993e9bcddb6b061addbacabed0e1ae01fd8061f9c0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103d7953737b7f648f15413610ae2e027887e3ac47d3a49ff0c53b5813d980758bf","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"W/ai/kgUErGyDwzCMloRGf2p40xN7z0fQCaojcDJkqw=","hive":"\n=========================================================================\nThu Feb 28 18:02:46 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 5bf6a2\npopulation: 17 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 d165 adfd bbbc | 35 d165 (0) dbef (0) d87b (0) dd48 (0)\n001 3 33fe 2293 2b80 | 14 33fe (0) 2293 (0) 27c2 (0) 2b79 (0)\n002 3 62c0 6049 75bf | 5 6049 (0) 62c0 (0) 6271 (0) 75bf (0)\n003 5 4853 4e4e 404b 4541 | 6 4e4e (0) 4853 (0) 404b (0) 46af (0)\n004 1 55a2 | 1 55a2 (0)\n============ DEPTH: 5 ==========================================\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 2 5b93 5b87 | 2 5b87 (0) 5b93 (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"5bf6a2fe481412b1b20f0cc2325a1119fda9e34c4def3d1f4026a88dc0c992ac","private_key":"fa8bc1f234fa77f91ac5a9338da6e6f227e45a18646baf568d4d6dfd6d1450ac","name":"node_5bf6a2fe481412b1b20f0cc2325a1119fda9e34c4def3d1f4026a88dc0c992ac","services":["streamer"],"enable_msg_events":true,"port":38467},"up":true}},{"node":{"info":{"id":"bbbccc0180fe2605be748daeabb1fc02e6c8870b37f371359f38ee114f09771f","name":"node_bbbccc0180fe2605be748daeabb1fc02e6c8870b37f371359f38ee114f09771f","enode":"enode://cc1d8b904cb61eeebf263eab856b6a39494abcc5f24a872d894cebb307123b3c21d4ad23093725c55431ea19b33f656d149a1546c5f4160410c2f15a3b8e96f0@127.0.0.1:0","enr":"0xf88fb840055d7f85d85a26105bc7165f2a6b6f5d76cdd64185015fc469f27b2f031c50ff47437f48acadbc971a934d387191f68159ab7cbbfcd0e9eadfffc11d84ba76150183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102cc1d8b904cb61eeebf263eab856b6a39494abcc5f24a872d894cebb307123b3c","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"u7zMAYD+JgW+dI2uq7H8AubIhws383E1nzjuEU8Jdx8=","hive":"\n=========================================================================\nThu Feb 28 18:02:46 UTC 2019 KΛÐΞMLIΛ hive: queen's address: bbbccc\npopulation: 14 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 7a5c 46af 5bf6 | 29 33fe (0) 2293 (0) 27c2 (0) 2b79 (0)\n001 3 ec08 c034 d165 | 21 d165 (0) d87b (0) dbef (0) dd48 (0)\n002 2 9861 9637 | 6 83aa (0) 8934 (0) 8cb7 (0) 9861 (0)\n003 3 aeff adfd a259 | 4 a259 (0) adfd (0) aeff (0) ab25 (0)\n004 1 b269 | 1 b269 (0)\n============ DEPTH: 5 ==========================================\n005 2 bc3e be5d | 2 bc3e (0) be5d (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"bbbccc0180fe2605be748daeabb1fc02e6c8870b37f371359f38ee114f09771f","private_key":"8e11dcf297e93d5064f7c16e21897f433b43b84640233484bdcb47c2986f8804","name":"node_bbbccc0180fe2605be748daeabb1fc02e6c8870b37f371359f38ee114f09771f","services":["streamer"],"enable_msg_events":true,"port":39121},"up":true}},{"node":{"info":{"id":"7a5c44693de20adc3c53b1302fb00aab32a46265abc7563bdba33f7e5c4f9d74","name":"node_7a5c44693de20adc3c53b1302fb00aab32a46265abc7563bdba33f7e5c4f9d74","enode":"enode://4aab8f1241e23af8e2dd0e60b55405d53a91654a387bd7cf812ae58bcd9d4a0402a8f608c6e0db8c43437c367f31326f3820f08d7afed4ee75622a2f05b37eaa@127.0.0.1:0","enr":"0xf88fb84038eea6fad2a04f841af87c2daf250d05a7047b23a61c49705e63401965b90bb16420d5734fe9622caa7b9e22f7c11e69f5c992a8d326d6f7addef874754fc92a0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1024aab8f1241e23af8e2dd0e60b55405d53a91654a387bd7cf812ae58bcd9d4a04","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"elxEaT3iCtw8U7EwL7AKqzKkYmWrx1Y726M/flxPnXQ=","hive":"\n=========================================================================\nThu Feb 28 18:02:46 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 7a5c44\npopulation: 20 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 7 d87b dbef c34b ec3e | 35 d165 (0) d87b (0) dbef (0) dd48 (0)\n001 5 10d5 041c 2b79 2293 | 14 33fe (0) 2293 (0) 27c2 (0) 2b79 (0)\n002 4 46af 4853 4e4e 5b93 | 10 4e4e (0) 4853 (0) 404b (0) 46af (0)\n============ DEPTH: 3 ==========================================\n003 3 62c0 6271 6049 | 3 6049 (0) 62c0 (0) 6271 (0)\n004 1 75bf | 1 75bf (0)\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"7a5c44693de20adc3c53b1302fb00aab32a46265abc7563bdba33f7e5c4f9d74","private_key":"d779095ed5a31b33c8a0b0b0198e6417edf79f53b2a14a0eb5eb1e1e7369f12e","name":"node_7a5c44693de20adc3c53b1302fb00aab32a46265abc7563bdba33f7e5c4f9d74","services":["streamer"],"enable_msg_events":true,"port":35791},"up":true}},{"node":{"info":{"id":"f6f318e25a24c449e727c60c610719aaa36d0baf826a3a4931ad684abf9bcbba","name":"node_f6f318e25a24c449e727c60c610719aaa36d0baf826a3a4931ad684abf9bcbba","enode":"enode://5901c788ea558d95661b2e50b68ca1e5e3c79c6293c1bcc73361993fa647db34891c6bc5d5952c43bc105ee6eb5d115a6eef3f26c87229b10777f2d86b12f587@127.0.0.1:0","enr":"0xf88fb840288340dcdbed401c8ce3bde43d0216d5df3e47dcc1c7d7d0a0d0ca4cc681176764d55a2920e5817f97fae70545a30a44acbfc65d43eb435f829b28d2655444590183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1035901c788ea558d95661b2e50b68ca1e5e3c79c6293c1bcc73361993fa647db34","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"9vMY4lokxEnnJ8YMYQcZqqNtC6+CajpJMa1oSr+by7o=","hive":"\n=========================================================================\nThu Feb 28 18:02:46 UTC 2019 KΛÐΞMLIΛ hive: queen's address: f6f318\npopulation: 15 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 2f1a 404b 6271 7a5c | 29 33fe (0) 2293 (0) 27c2 (0) 2b79 (0)\n001 2 a259 ab25 | 14 a259 (0) adfd (0) aeff (0) ab25 (0)\n002 2 c67d dd48 | 12 d165 (0) dbef (0) d87b (0) dd48 (0)\n003 2 ec08 ec3e | 3 e59a (0) ec3e (0) ec08 (0)\n004 2 ff06 fef2 | 2 fef2 (0) ff06 (0)\n============ DEPTH: 5 ==========================================\n005 3 f090 f16d f1e1 | 3 f1e1 (0) f16d (0) f090 (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"f6f318e25a24c449e727c60c610719aaa36d0baf826a3a4931ad684abf9bcbba","private_key":"4d482c4424098c2a71c88f47c73227e568fcab0f63d5a6a716f3e716773f19b4","name":"node_f6f318e25a24c449e727c60c610719aaa36d0baf826a3a4931ad684abf9bcbba","services":["streamer"],"enable_msg_events":true,"port":45669},"up":true}},{"node":{"info":{"id":"627105957aa0b587a9ba1b0f273fc19403b6955940e794a359ade89cd7d40dfb","name":"node_627105957aa0b587a9ba1b0f273fc19403b6955940e794a359ade89cd7d40dfb","enode":"enode://2ee80aae24fb663157cb638843b9fb21700a01f5ea5dcec4c69214f2b80eec02717985080fed1618333c85522a39caf9a7ba76b52ba0f480ff3ebb8186f5a69c@127.0.0.1:0","enr":"0xf88fb840fa1436482f2747ab816902e843a51484a4cbc4152e7ec2ad801cae3ded5c889236cca1756f6f103cc630767f9ff82a3a2f4e736ea92418c62499f129946c4bbb0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1022ee80aae24fb663157cb638843b9fb21700a01f5ea5dcec4c69214f2b80eec02","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"YnEFlXqgtYepuhsPJz/BlAO2lVlA55SjWa3onNfUDfs=","hive":"\n=========================================================================\nThu Feb 28 18:02:46 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 627105\npopulation: 13 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 de4f c62e f6f3 | 35 a259 (0) adfd (0) aeff (0) ab25 (0)\n001 3 1a93 27c2 33fe | 14 33fe (0) 2293 (0) 27c2 (0) 2b79 (0)\n002 3 4443 55a2 5b87 | 10 55a2 (0) 5b87 (0) 5b93 (0) 5bf6 (0)\n003 2 75bf 7a5c | 2 75bf (0) 7a5c (0)\n============ DEPTH: 4 ==========================================\n004 0 | 0\n005 0 | 0\n006 1 6049 | 1 6049 (0)\n007 0 | 0\n008 1 62c0 | 1 62c0 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"627105957aa0b587a9ba1b0f273fc19403b6955940e794a359ade89cd7d40dfb","private_key":"23966103833d36e192d35e9cfe2670b5319f5499072ede1f11cedd9024940533","name":"node_627105957aa0b587a9ba1b0f273fc19403b6955940e794a359ade89cd7d40dfb","services":["streamer"],"enable_msg_events":true,"port":32927},"up":true}},{"node":{"info":{"id":"c62e4b2302cd62f578c8c647adc3a4affef6df65a5236302865db85897efc015","name":"node_c62e4b2302cd62f578c8c647adc3a4affef6df65a5236302865db85897efc015","enode":"enode://a5b7729faa9896d27289883c8cec64d7eb741cd7cb745f93db938d30ad11655e5e6d8db4b9a81aba84c7112ea14816c7726c946678e0554b909627c400069fce@127.0.0.1:0","enr":"0xf88fb840e2e531e37debff2425fab0e7db5ecc75f9746078803605fb200a96a2a92984c5671e0f4b88fc7cdc89c9c09b97f9ef3f5a97d6a1be898e5e0594bf71e977c1280183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102a5b7729faa9896d27289883c8cec64d7eb741cd7cb745f93db938d30ad11655e","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"xi5LIwLNYvV4yMZHrcOkr/7232WlI2MChl24WJfvwBU=","hive":"\n=========================================================================\nThu Feb 28 18:02:46 UTC 2019 KΛÐΞMLIΛ hive: queen's address: c62e4b\npopulation: 19 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 2293 33fe 4853 6271 | 29 33fe (0) 2293 (0) 27c2 (0) 2b79 (0)\n001 3 b269 8934 9637 | 14 a259 (0) adfd (0) aeff (0) ab25 (0)\n002 4 f1e1 e59a ec3e ec08 | 9 e59a (0) ec3e (0) ec08 (0) fef2 (0)\n003 2 d87b dbef | 5 d87b (0) dbef (0) dd48 (0) de4f (0)\n004 2 ce82 c851 | 2 c851 (0) ce82 (0)\n============ DEPTH: 5 ==========================================\n005 3 c034 c05d c34b | 3 c34b (0) c05d (0) c034 (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 1 c67d | 1 c67d (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"c62e4b2302cd62f578c8c647adc3a4affef6df65a5236302865db85897efc015","private_key":"d56adf646d4edd18118697876a2b6c8f969d89f806dd57944e91d7ea8678c854","name":"node_c62e4b2302cd62f578c8c647adc3a4affef6df65a5236302865db85897efc015","services":["streamer"],"enable_msg_events":true,"port":42935},"up":true}},{"node":{"info":{"id":"9637fa5ec80bd404a366fe86f7a89a573529833097c130114b3015754886545d","name":"node_9637fa5ec80bd404a366fe86f7a89a573529833097c130114b3015754886545d","enode":"enode://b2038dcdc21c0342ed4add7724ca7f5c70acbda4803e675e7a927cddf0d0acd0f8c470e2424aed644fe6369b849182c846e00a92c6ccb376fe303c1a46818595@127.0.0.1:0","enr":"0xf88fb840198e6a345712a2e48389ef9eb36c43f88bb2b34aa5711694ec4d386a7517b5cf5223d928910d5887731c99bcc03fcf179cb74267e67df478cae4059bab7e31740183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103b2038dcdc21c0342ed4add7724ca7f5c70acbda4803e675e7a927cddf0d0acd0","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"ljf6XsgL1ASjZv6G96iaVzUpgzCXwTARSzAVdUiGVF0=","hive":"\n=========================================================================\nThu Feb 28 18:02:46 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 9637fa\npopulation: 12 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 55a2 2b80 0f03 | 29 6049 (0) 62c0 (0) 6271 (0) 75bf (0)\n001 2 ce82 c62e | 21 f6f3 (0) f090 (0) f1e1 (0) f16d (0)\n002 2 a259 bbbc | 8 b269 (0) bc3e (0) be5d (0) bbbc (0)\n003 3 83aa 8cb7 8934 | 3 8cb7 (0) 8934 (0) 83aa (0)\n============ DEPTH: 4 ==========================================\n004 1 9861 | 1 9861 (0)\n005 1 9009 | 1 9009 (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"9637fa5ec80bd404a366fe86f7a89a573529833097c130114b3015754886545d","private_key":"6cb0afbaa74888bcc3ca1555cc1235945258f49c75828c56a9e5c4d47637bbc2","name":"node_9637fa5ec80bd404a366fe86f7a89a573529833097c130114b3015754886545d","services":["streamer"],"enable_msg_events":true,"port":41485},"up":true}},{"node":{"info":{"id":"0f03a5bb51c3f599469cfe9e5da0a10b8d06ba501a89e180077a75f1c5971467","name":"node_0f03a5bb51c3f599469cfe9e5da0a10b8d06ba501a89e180077a75f1c5971467","enode":"enode://287e97ae6cca5147329515ea229510ab6fbbed836fcf6267080988eb4521ca19fca56a67c19b8cdcc1818525d01765fdfa986478d2d22e10dc38f511bf9f66c1@127.0.0.1:0","enr":"0xf88fb8400a5646e83f67d36a442e286b23ed0eb1938e670917068d01ce00c8b6a1a44f471b7807fd83e22f4eb89c4398eeae14885b253e135d5d201bea3b4af9af1c89240183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103287e97ae6cca5147329515ea229510ab6fbbed836fcf6267080988eb4521ca19","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"DwOlu1HD9ZlGnP6eXaChC40GulAaieGAB3p18cWXFGc=","hive":"\n=========================================================================\nThu Feb 28 18:02:46 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 0f03a5\npopulation: 15 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 8cb7 9637 | 35 f6f3 (0) f090 (0) f1e1 (0) f16d (0)\n001 3 62c0 6049 404b | 15 6049 (0) 62c0 (0) 6271 (0) 75bf (0)\n002 3 2b80 27c2 2293 | 6 33fe (0) 2293 (0) 27c2 (0) 2b79 (0)\n003 4 12b8 10d5 1a93 1dd4 | 4 1a93 (0) 1dd4 (0) 10d5 (0) 12b8 (0)\n004 1 041c | 1 041c (0)\n============ DEPTH: 5 ==========================================\n005 0 | 0\n006 1 0d7f | 1 0d7f (0)\n007 1 0e8f | 1 0e8f (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"0f03a5bb51c3f599469cfe9e5da0a10b8d06ba501a89e180077a75f1c5971467","private_key":"f3151faafed66691b7c7fe654fb8b3e32de80b36c07bfaf63b9ce5d571749b79","name":"node_0f03a5bb51c3f599469cfe9e5da0a10b8d06ba501a89e180077a75f1c5971467","services":["streamer"],"enable_msg_events":true,"port":38513},"up":true}},{"node":{"info":{"id":"404b70c6ac72972cfd9e7cf115c7f043bd15d0e4b9a959bfc2924c722eb712f7","name":"node_404b70c6ac72972cfd9e7cf115c7f043bd15d0e4b9a959bfc2924c722eb712f7","enode":"enode://35c2c08791cc1c705a6126041e3383cba8baf51922829224bd290662116349bb20ac4774bbbeca9adf7266b8731664ad8255a17469fde0fdeffc60b1287b0b5a@127.0.0.1:0","enr":"0xf88fb840f7059937b3fb094126531a32fa1c349cd67da70cefdb5158e95ef285d03af1ec44ff0691cbeb5bc2a09af995303f9a5a61923166d8f92f1811559758e6c8be700183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10235c2c08791cc1c705a6126041e3383cba8baf51922829224bd290662116349bb","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"QEtwxqxylyz9nnzxFcfwQ70V0OS5qVm/wpJMci63Evc=","hive":"\n=========================================================================\nThu Feb 28 18:02:46 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 404b70\npopulation: 15 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 f090 f6f3 ff06 | 35 f6f3 (0) f090 (0) f1e1 (0) f16d (0)\n001 2 2f1a 0f03 | 14 33fe (0) 2293 (0) 27c2 (0) 2b80 (0)\n002 2 62c0 6049 | 5 6049 (0) 62c0 (0) 6271 (0) 75bf (0)\n003 3 55a2 5bf6 5b93 | 4 55a2 (0) 5bf6 (0) 5b87 (0) 5b93 (0)\n004 2 4853 4e4e | 2 4e4e (0) 4853 (0)\n============ DEPTH: 5 ==========================================\n005 3 46af 4541 4443 | 3 46af (0) 4443 (0) 4541 (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"404b70c6ac72972cfd9e7cf115c7f043bd15d0e4b9a959bfc2924c722eb712f7","private_key":"39ac08b99ed5a6af6a54d2ac5321be553f9143d2695a8505e15e42661d1e037e","name":"node_404b70c6ac72972cfd9e7cf115c7f043bd15d0e4b9a959bfc2924c722eb712f7","services":["streamer"],"enable_msg_events":true,"port":40259},"up":true}},{"node":{"info":{"id":"2f1a15c39bcb0e953f8c160933f69e3dda29b834575742c4f432eb384c5dd9df","name":"node_2f1a15c39bcb0e953f8c160933f69e3dda29b834575742c4f432eb384c5dd9df","enode":"enode://13799436c7d312b56cc9e0e3efc7a244cd310752235ed2d531f3756fb4c329b8f4beed1ae628979c46857255291e4a89eca3d777309d735ccd52a1fd086eb37a@127.0.0.1:0","enr":"0xf88fb840a18583a1a4a283a6cb8ec25c1bf4c3f964e23314193307d2b5cb271cde21b81b48c60cf629544c76de4d3e4616a1311dfc70306df454ce056bfa7231738b81580183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10213799436c7d312b56cc9e0e3efc7a244cd310752235ed2d531f3756fb4c329b8","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"LxoVw5vLDpU/jBYJM/aePdopuDRXV0LE9DLrOExd2d8=","hive":"\n=========================================================================\nThu Feb 28 18:02:46 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 2f1a15\npopulation: 15 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 f090 f6f3 ab25 | 35 f6f3 (0) f090 (0) f1e1 (0) f16d (0)\n001 4 62c0 6049 4853 404b | 15 6049 (0) 62c0 (0) 6271 (0) 75bf (0)\n002 3 1dd4 1a93 12b8 | 8 1a93 (0) 1dd4 (0) 10d5 (0) 12b8 (0)\n003 1 33fe | 1 33fe (0)\n004 2 27c2 2293 | 2 2293 (0) 27c2 (0)\n============ DEPTH: 5 ==========================================\n005 2 2b79 2b80 | 2 2b80 (0) 2b79 (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"2f1a15c39bcb0e953f8c160933f69e3dda29b834575742c4f432eb384c5dd9df","private_key":"edc9fc2f574b8ae4c0f349dcfca0fb04cfdf47fc9405889b34be78c770fc4acf","name":"node_2f1a15c39bcb0e953f8c160933f69e3dda29b834575742c4f432eb384c5dd9df","services":["streamer"],"enable_msg_events":true,"port":45277},"up":true}},{"node":{"info":{"id":"ab255c40e39ba8fd2fb439ff26d135aab3944fb9159e54370f4fe735906d0313","name":"node_ab255c40e39ba8fd2fb439ff26d135aab3944fb9159e54370f4fe735906d0313","enode":"enode://d7dddfa4efbb58706320eaf3223ec745504d5d8d4b2bc5385b5dc670985287398ee138b1cb976bc08fe72de2b0b59452a0194bce9614f4df7c5e9faf58ef85d4@127.0.0.1:0","enr":"0xf88fb840d1e80f4b38afbcd783a882fe818fc87a0fc6df4a9e49d2d21e51e3494648bf771a06c6b548b8e2242ea69ad4c3677834df3e83510ddc5010347390435467866d0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102d7dddfa4efbb58706320eaf3223ec745504d5d8d4b2bc5385b5dc67098528739","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"qyVcQOObqP0vtDn/JtE1qrOUT7kVnlQ3D0/nNZBtAxM=","hive":"\n=========================================================================\nThu Feb 28 18:02:46 UTC 2019 KΛÐΞMLIΛ hive: queen's address: ab255c\npopulation: 13 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 041c 2f1a | 29 6049 (0) 62c0 (0) 6271 (0) 75bf (0)\n001 3 dd48 f090 f6f3 | 21 fef2 (0) ff06 (0) f6f3 (0) f090 (0)\n002 2 8cb7 8934 | 6 8934 (0) 8cb7 (0) 83aa (0) 9009 (0)\n003 3 b269 be5d bc3e | 4 b269 (0) bc3e (0) be5d (0) bbbc (0)\n004 1 a259 | 1 a259 (0)\n============ DEPTH: 5 ==========================================\n005 2 aeff adfd | 2 adfd (0) aeff (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"ab255c40e39ba8fd2fb439ff26d135aab3944fb9159e54370f4fe735906d0313","private_key":"e097903ff73cba0125e376909f8f08ea09638c36b5e540c8b86d2c0370445bf7","name":"node_ab255c40e39ba8fd2fb439ff26d135aab3944fb9159e54370f4fe735906d0313","services":["streamer"],"enable_msg_events":true,"port":40173},"up":true}},{"node":{"info":{"id":"041c4a3f942536e67af087da305403e26a19e030dcf51473a597431753a2bec2","name":"node_041c4a3f942536e67af087da305403e26a19e030dcf51473a597431753a2bec2","enode":"enode://bf082dde14615af13c8a4cd17d9d4aba390cb871d34006a5e4e27eeac55c37ed4b160b1c7fa573b079291477f5c34df7389fb207202d36cb020bb1e11b1770ae@127.0.0.1:0","enr":"0xf88fb840ee4895d2879885f7fcb08b7d5d3a2ebdb4617198888190d13eed5f53b6e2c48518e2429a8c73ab55c0f5bfb46f4144cf3d97557bf7a6065d62c6bf38af64d1f90183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102bf082dde14615af13c8a4cd17d9d4aba390cb871d34006a5e4e27eeac55c37ed","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"BBxKP5QlNuZ68IfaMFQD4moZ4DDc9RRzpZdDF1OivsI=","hive":"\n=========================================================================\nThu Feb 28 18:02:46 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 041c4a\npopulation: 20 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 dd48 c034 8cb7 ab25 | 35 fef2 (0) ff06 (0) f6f3 (0) f090 (0)\n001 6 4541 5b87 55a2 62c0 | 15 6049 (0) 62c0 (0) 6271 (0) 75bf (0)\n002 3 2b80 2293 33fe | 6 33fe (0) 2293 (0) 27c2 (0) 2b80 (0)\n003 4 1dd4 1a93 12b8 10d5 | 4 1a93 (0) 1dd4 (0) 10d5 (0) 12b8 (0)\n============ DEPTH: 4 ==========================================\n004 3 0d7f 0f03 0e8f | 3 0d7f (0) 0e8f (0) 0f03 (0)\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"041c4a3f942536e67af087da305403e26a19e030dcf51473a597431753a2bec2","private_key":"0c395ad41017794ece1bb20e02f995d3d71b784e80b6972127d60e11b9416033","name":"node_041c4a3f942536e67af087da305403e26a19e030dcf51473a597431753a2bec2","services":["streamer"],"enable_msg_events":true,"port":45519},"up":true}},{"node":{"info":{"id":"c0347196ec87f51f97229140b5d66015cfff2781cc1aff6d3e207c3fa3532732","name":"node_c0347196ec87f51f97229140b5d66015cfff2781cc1aff6d3e207c3fa3532732","enode":"enode://56c5533688bc45c78eab8abe6fdbcc89c9ff51b6b2e78b4aa94c1e9d24f9269468c3d7061b1898f46535308665012ae49ce7768fe52a097e0f29eba58264f339@127.0.0.1:0","enr":"0xf88fb8402ff8750dfe7251a484fddf76d16ae3c3704a2faf12eb06a51b8f7409190bb26958d90e58f0a89ef2e488bb66c090ec33b0434b315fc7d2aafca5ac24482e5deb0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10356c5533688bc45c78eab8abe6fdbcc89c9ff51b6b2e78b4aa94c1e9d24f92694","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"wDRxluyH9R+XIpFAtdZgFc//J4HMGv9tPiB8P6NTJzI=","hive":"\n=========================================================================\nThu Feb 28 18:02:46 UTC 2019 KΛÐΞMLIΛ hive: queen's address: c03471\npopulation: 15 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 6049 041c | 29 6049 (0) 62c0 (0) 6271 (0) 75bf (0)\n001 3 b269 bc3e bbbc | 14 b269 (0) bc3e (0) be5d (0) bbbc (0)\n002 2 ff06 fef2 | 9 fef2 (0) ff06 (0) f6f3 (0) f090 (0)\n003 2 de4f d165 | 5 dd48 (0) de4f (0) d87b (0) dbef (0)\n004 2 c851 ce82 | 2 ce82 (0) c851 (0)\n005 2 c62e c67d | 2 c67d (0) c62e (0)\n============ DEPTH: 6 ==========================================\n006 1 c34b | 1 c34b (0)\n007 0 | 0\n008 0 | 0\n009 1 c05d | 1 c05d (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"c0347196ec87f51f97229140b5d66015cfff2781cc1aff6d3e207c3fa3532732","private_key":"5a906a787cb78df16ad69dfd4eefb997694bce2b8b171b223cd01db89f2cfe56","name":"node_c0347196ec87f51f97229140b5d66015cfff2781cc1aff6d3e207c3fa3532732","services":["streamer"],"enable_msg_events":true,"port":42833},"up":true}},{"node":{"info":{"id":"d16513f30d485d3175321c1a0aa5a525c115ae13c395f7fa3deb1cf4d1ec69bc","name":"node_d16513f30d485d3175321c1a0aa5a525c115ae13c395f7fa3deb1cf4d1ec69bc","enode":"enode://d3715cf48dd521184951b76f82e30bef59b728fb780c33aafac3b501ec3a082cabdd4fbf1d191b0fc6fd4e329aca56f96d8820b1d3d7c38ff169bb66398379ef@127.0.0.1:0","enr":"0xf88fb84082fc9a1da6b7ab89a49f98c25a59627c4f54319e0d439c5f8605a75ddf74b1f0099cb2a276f366bd085ef8f6fbfbc4ae9b86b4530d0a31ce50fe3cbd8c98c6670183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103d3715cf48dd521184951b76f82e30bef59b728fb780c33aafac3b501ec3a082c","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"0WUT8w1IXTF1MhwaCqWlJcEVrhPDlff6Pesc9NHsabw=","hive":"\n=========================================================================\nThu Feb 28 18:02:46 UTC 2019 KΛÐΞMLIΛ hive: queen's address: d16513\npopulation: 17 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 5bf6 1a93 12b8 | 29 1a93 (0) 1dd4 (0) 10d5 (0) 12b8 (0)\n001 2 bbbc 9861 | 14 b269 (0) bc3e (0) be5d (0) bbbc (0)\n002 3 f090 ff06 fef2 | 9 fef2 (0) ff06 (0) f6f3 (0) f090 (0)\n003 5 ce82 c67d c34b c05d | 7 ce82 (0) c851 (0) c67d (0) c62e (0)\n============ DEPTH: 4 ==========================================\n004 4 dd48 de4f d87b dbef | 4 dd48 (0) de4f (0) d87b (0) dbef (0)\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"d16513f30d485d3175321c1a0aa5a525c115ae13c395f7fa3deb1cf4d1ec69bc","private_key":"18698a5fd9c496b1d243f171696350d10fc3580717073a40f6d99520412f83d5","name":"node_d16513f30d485d3175321c1a0aa5a525c115ae13c395f7fa3deb1cf4d1ec69bc","services":["streamer"],"enable_msg_events":true,"port":45987},"up":true}},{"node":{"info":{"id":"9861d7cab15fd77ce544aa046f9daf61af7f7c78da7f84c9d3bc1c19f9f2e071","name":"node_9861d7cab15fd77ce544aa046f9daf61af7f7c78da7f84c9d3bc1c19f9f2e071","enode":"enode://17306034b66dfcdbc97a6f9ba35033107edc8cbb03353fe5e6eb8df030ac6752cd0ed1f6edfcd7b57c456a10519e1563141ab10a463ab00d6c46cc315805d60f@127.0.0.1:0","enr":"0xf88fb84064b8824d317bdfdbd6d0f8e6d48f0b8a8faef43af8108d93c63e8d5b3b0239bd0221d18dbfe9bc21d49506094150e4abc556274dca3f62cf87b393001cdfbbab0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10317306034b66dfcdbc97a6f9ba35033107edc8cbb03353fe5e6eb8df030ac6752","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"mGHXyrFf13zlRKoEb52vYa9/fHjaf4TJ07wcGfny4HE=","hive":"\n=========================================================================\nThu Feb 28 18:02:46 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 9861d7\npopulation: 15 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 2b80 55a2 4541 | 29 1a93 (0) 1dd4 (0) 10d5 (0) 12b8 (0)\n001 4 f16d f090 ce82 d165 | 21 ff06 (0) fef2 (0) f6f3 (0) f090 (0)\n002 3 bbbc a259 aeff | 8 b269 (0) bc3e (0) be5d (0) bbbc (0)\n003 3 83aa 8cb7 8934 | 3 8934 (0) 8cb7 (0) 83aa (0)\n============ DEPTH: 4 ==========================================\n004 2 9637 9009 | 2 9009 (0) 9637 (0)\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"9861d7cab15fd77ce544aa046f9daf61af7f7c78da7f84c9d3bc1c19f9f2e071","private_key":"4df06f9461343c2fda87c2dad86b4b3cf8a4f9ca58c88bae635d03da92ea006b","name":"node_9861d7cab15fd77ce544aa046f9daf61af7f7c78da7f84c9d3bc1c19f9f2e071","services":["streamer"],"enable_msg_events":true,"port":46151},"up":true}},{"node":{"info":{"id":"45411a7482cae50dd1dd8d90138a28c0dc61b04baa9592f927f9d415b0970a53","name":"node_45411a7482cae50dd1dd8d90138a28c0dc61b04baa9592f927f9d415b0970a53","enode":"enode://a686970d89c6c9d2e4c69d94f1b6694d904581304de0fc9efb180891260b3099a5b46700b2aa72d09afb7266ef786abc5dada1f9b0fe5f3a78daec8cc6f66c53@127.0.0.1:0","enr":"0xf88fb840241ea258a71f40249cdf5e63289c8632db6eca503178586fa7803de62e853e4a3dd497f51b52eb68afac7dce913cf61574c069499d3a4f31f727f83262c49b180183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103a686970d89c6c9d2e4c69d94f1b6694d904581304de0fc9efb180891260b3099","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"RUEadILK5Q3R3Y2QE4oowNxhsEuqlZL5J/nUFbCXClM=","hive":"\n=========================================================================\nThu Feb 28 18:02:46 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 45411a\npopulation: 14 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 ec08 9861 | 35 ce82 (0) c851 (0) c67d (0) c62e (0)\n001 3 041c 0d7f 0e8f | 14 041c (0) 0d7f (0) 0e8f (0) 0f03 (0)\n002 2 6049 62c0 | 5 6049 (0) 62c0 (0) 6271 (0) 75bf (0)\n003 2 5bf6 55a2 | 4 55a2 (0) 5bf6 (0) 5b87 (0) 5b93 (0)\n004 2 4853 4e4e | 2 4e4e (0) 4853 (0)\n005 1 404b | 1 404b (0)\n============ DEPTH: 6 ==========================================\n006 1 46af | 1 46af (0)\n007 1 4443 | 1 4443 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"45411a7482cae50dd1dd8d90138a28c0dc61b04baa9592f927f9d415b0970a53","private_key":"e7b54819c42e18dc0898157b7f12a62003c3ca0b175bb3478c3e18364ad4d72d","name":"node_45411a7482cae50dd1dd8d90138a28c0dc61b04baa9592f927f9d415b0970a53","services":["streamer"],"enable_msg_events":true,"port":39521},"up":true}},{"node":{"info":{"id":"ec085243645c6e5fdbeffb137ccd119053bd655e76b1d9a6b5e0221183764e43","name":"node_ec085243645c6e5fdbeffb137ccd119053bd655e76b1d9a6b5e0221183764e43","enode":"enode://d4e917601f1e529ba3150bc6547ed2baa812c622541b179807e35b3d19b6f024b3babc685cc9052d03ac6af21cd734b458f7010c55cf32997f230b64626a5a37@127.0.0.1:0","enr":"0xf88fb8406a26e3870ba17f1f806d807b45527a32c7fb63b96a757f20b191a4b827cb4f840cbfeef46ad28b8d65bb14e1677cff14604cd8e288cf6f25367dac70f3fc1e740183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103d4e917601f1e529ba3150bc6547ed2baa812c622541b179807e35b3d19b6f024","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"7AhSQ2Rcbl/b7/sTfM0RkFO9ZV52sdmmteAiEYN2TkM=","hive":"\n=========================================================================\nThu Feb 28 18:02:46 UTC 2019 KΛÐΞMLIΛ hive: queen's address: ec0852\npopulation: 23 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 6049 4e4e 4541 5b93 | 29 041c (0) 0d7f (0) 0f03 (0) 0e8f (0)\n001 5 a259 b269 be5d bc3e | 14 b269 (0) bc3e (0) be5d (0) bbbc (0)\n002 8 d87b dd48 c851 ce82 | 12 ce82 (0) c851 (0) c67d (0) c62e (0)\n003 4 fef2 ff06 f6f3 f1e1 | 6 ff06 (0) fef2 (0) f6f3 (0) f090 (0)\n============ DEPTH: 4 ==========================================\n004 1 e59a | 1 e59a (0)\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 1 ec3e | 1 ec3e (0)\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"ec085243645c6e5fdbeffb137ccd119053bd655e76b1d9a6b5e0221183764e43","private_key":"564658b59ef3923b2cfa270f76d2885719f4d8d5a4640218cef7fd7cc5803538","name":"node_ec085243645c6e5fdbeffb137ccd119053bd655e76b1d9a6b5e0221183764e43","services":["streamer"],"enable_msg_events":true,"port":43959},"up":true}},{"node":{"info":{"id":"5b936341da709d11b34b6df007f38fff0396b785a14f94653aaf921d8e450a3f","name":"node_5b936341da709d11b34b6df007f38fff0396b785a14f94653aaf921d8e450a3f","enode":"enode://7cfb88f94a2ce6d8382ad72e15d58c728ccf68134cada4852553c46446caf2244b21821d261c193ef0f96bd15aa704cc0ff3c808d6f46572af769d98f5662856@127.0.0.1:0","enr":"0xf88fb8404835ccf9f26f0c1ced47b4f024d3eb722f652257cb4bbf0c7122ea46b1f338d061f8d1c3ff1e6a17350e0a573500841cd7eaa7b532e66ac094ad8f5e2642d0740183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1027cfb88f94a2ce6d8382ad72e15d58c728ccf68134cada4852553c46446caf224","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"W5NjQdpwnRGzS23wB/OP/wOWt4WhT5RlOq+SHY5FCj8=","hive":"\n=========================================================================\nThu Feb 28 18:02:46 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 5b9363\npopulation: 16 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 bc3e b269 ec08 | 35 b269 (0) bc3e (0) be5d (0) bbbc (0)\n001 4 1dd4 0e8f 2293 27c2 | 14 041c (0) 0d7f (0) 0f03 (0) 0e8f (0)\n002 3 62c0 6049 7a5c | 5 6049 (0) 62c0 (0) 6271 (0) 75bf (0)\n003 3 4e4e 46af 404b | 6 404b (0) 46af (0) 4443 (0) 4541 (0)\n004 1 55a2 | 1 55a2 (0)\n============ DEPTH: 5 ==========================================\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 1 5bf6 | 1 5bf6 (0)\n010 0 | 0\n011 1 5b87 | 1 5b87 (0)\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"5b936341da709d11b34b6df007f38fff0396b785a14f94653aaf921d8e450a3f","private_key":"10d7b03ff60d1351f7b6be0726cb6c950befc858ef8f870ef7f19335efe1b2e9","name":"node_5b936341da709d11b34b6df007f38fff0396b785a14f94653aaf921d8e450a3f","services":["streamer"],"enable_msg_events":true,"port":41261},"up":true}},{"node":{"info":{"id":"27c236583dff714a3000acafbfd3308566c81271f825eac8f4f0cff83a7ff127","name":"node_27c236583dff714a3000acafbfd3308566c81271f825eac8f4f0cff83a7ff127","enode":"enode://643ed7e6dce73138a35c06ad2e7dd22b9fb60bfe8c62df0e78ba66158a01ee8c5105a61257adc96ceefe709d7f1a33501118a7f788cfc64a9ab1d5f8dabd02f0@127.0.0.1:0","enr":"0xf88fb8404d9287db19102ad4463ec35d232a539755701e2fa7d275048045a82a349c00ac7db9f3d723cc349a77840cb6643cf59aafffac21d27bfa52933fedcd68b91a4c0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102643ed7e6dce73138a35c06ad2e7dd22b9fb60bfe8c62df0e78ba66158a01ee8c","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"J8I2WD3/cUowAKyvv9MwhWbIEnH4JerI9PDP+Dp/8Sc=","hive":"\n=========================================================================\nThu Feb 28 18:02:46 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 27c236\npopulation: 21 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 8 c05d c67d fef2 ff06 | 35 ff06 (0) fef2 (0) f6f3 (0) f090 (0)\n001 5 6271 7a5c 46af 4e4e | 15 6049 (0) 62c0 (0) 6271 (0) 75bf (0)\n002 3 1dd4 10d5 0f03 | 8 041c (0) 0d7f (0) 0f03 (0) 0e8f (0)\n003 1 33fe | 1 33fe (0)\n============ DEPTH: 4 ==========================================\n004 3 2b79 2b80 2f1a | 3 2f1a (0) 2b80 (0) 2b79 (0)\n005 1 2293 | 1 2293 (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"27c236583dff714a3000acafbfd3308566c81271f825eac8f4f0cff83a7ff127","private_key":"d83c8e0152983bd8a5e3e5bbbe5fcd0962af9a8d3c3e74b2766a616a662ce1fc","name":"node_27c236583dff714a3000acafbfd3308566c81271f825eac8f4f0cff83a7ff127","services":["streamer"],"enable_msg_events":true,"port":33423},"up":true}},{"node":{"info":{"id":"83aad5b97e1ea8c40537e5593de4810c7b35fab156053402dda758d6e9ea9055","name":"node_83aad5b97e1ea8c40537e5593de4810c7b35fab156053402dda758d6e9ea9055","enode":"enode://124f0cb5dff8cbe3f2b4879314e1c7e445847ab4107a0172bdb2cc3c8c117e31f5b7d10237c9a2e01cf4b308684c6ae532267b2316bec3efd66e418e51df05c4@127.0.0.1:0","enr":"0xf88fb840e0882134a9c0bab94463ea2fb53f1227c478c4b6573df8c6e0d225495bff145000ae070b7539cc26f159f626b7ce494e2f7830c5cb9a091059ccf0b950947b200183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102124f0cb5dff8cbe3f2b4879314e1c7e445847ab4107a0172bdb2cc3c8c117e31","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"g6rVuX4eqMQFN+VZPeSBDHs1+rFWBTQC3adY1unqkFU=","hive":"\n=========================================================================\nThu Feb 28 18:02:46 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 83aad5\npopulation: 26 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 5b87 4853 0e8f 1dd4 | 29 6049 (0) 62c0 (0) 6271 (0) 75bf (0)\n001 10 f16d f1e1 fef2 e59a | 21 ce82 (0) c851 (0) c67d (0) c62e (0)\n002 5 aeff adfd be5d bc3e | 8 b269 (0) bc3e (0) be5d (0) bbbc (0)\n003 3 9861 9009 9637 | 3 9637 (0) 9009 (0) 9861 (0)\n============ DEPTH: 4 ==========================================\n004 2 8cb7 8934 | 2 8cb7 (0) 8934 (0)\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"83aad5b97e1ea8c40537e5593de4810c7b35fab156053402dda758d6e9ea9055","private_key":"cb01a75bc3c400c6de710019b74759a8aa1dd7e7362e86928ef1ea2b04805e0f","name":"node_83aad5b97e1ea8c40537e5593de4810c7b35fab156053402dda758d6e9ea9055","services":["streamer"],"enable_msg_events":true,"port":45083},"up":true}},{"node":{"info":{"id":"48534a538fd708c0e616cbdfa948596048b7daa77ef09dd69c1652a5f6d05efc","name":"node_48534a538fd708c0e616cbdfa948596048b7daa77ef09dd69c1652a5f6d05efc","enode":"enode://8cd9a1d7a69bf057290a9f420a465a9e82ca398b542cb8cbd444121f06a56a50a1488496a7786bc41fa750eebde2519b30e91d6a254979aafe5b362f291b3342@127.0.0.1:0","enr":"0xf88fb8405c96c6659930b28d8e7fc70e709db26a72cfb94922dbf7d4cfb4fac0083d70037a3eb75c1117b50851f09570ca994003cebee249134d8c8f7f1604ba717afaac0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1028cd9a1d7a69bf057290a9f420a465a9e82ca398b542cb8cbd444121f06a56a50","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"SFNKU4/XCMDmFsvfqUhZYEi32qd+8J3WnBZSpfbQXvw=","hive":"\n=========================================================================\nThu Feb 28 18:02:46 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 48534a\npopulation: 18 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 c62e c851 ce82 83aa | 35 ce82 (0) c851 (0) c62e (0) c67d (0)\n001 3 2f1a 33fe 12b8 | 14 33fe (0) 2f1a (0) 2b80 (0) 2b79 (0)\n002 3 7a5c 62c0 6049 | 5 6049 (0) 62c0 (0) 6271 (0) 75bf (0)\n003 3 55a2 5bf6 5b87 | 4 55a2 (0) 5bf6 (0) 5b87 (0) 5b93 (0)\n============ DEPTH: 4 ==========================================\n004 4 404b 4443 4541 46af | 4 404b (0) 46af (0) 4443 (0) 4541 (0)\n005 1 4e4e | 1 4e4e (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"48534a538fd708c0e616cbdfa948596048b7daa77ef09dd69c1652a5f6d05efc","private_key":"8b7949320c5ad8130070a34702abd57dc0f7b7ddd7da1abd2b8a3aabad87dca1","name":"node_48534a538fd708c0e616cbdfa948596048b7daa77ef09dd69c1652a5f6d05efc","services":["streamer"],"enable_msg_events":true,"port":38627},"up":true}},{"node":{"info":{"id":"12b8769e0e996011ceff489a3f56ba8e555d545b69accb5b4396dead7335a8db","name":"node_12b8769e0e996011ceff489a3f56ba8e555d545b69accb5b4396dead7335a8db","enode":"enode://149300b78ce42863b2bff34e21322a35ae2558dfe528efca3cbcc8b9a90003d8cba8a3cb24dba7d83d923e4565689cef7d48c1988c109bb94b1bc92bf348c5dd@127.0.0.1:0","enr":"0xf88fb840731cd5d3da6e6990435abc04b71ca41ee0c7e99f6f7baf78f4f4dd25cc64f546516fdf07f114321703f8ad413ff912c769f3e636e3f2435ad48390bf3325da4f0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103149300b78ce42863b2bff34e21322a35ae2558dfe528efca3cbcc8b9a90003d8","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"Erh2ng6ZYBHO/0iaP1a6jlVdVFtprMtbQ5berXM1qNs=","hive":"\n=========================================================================\nThu Feb 28 18:02:46 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 12b876\npopulation: 14 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 d165 aeff | 35 ce82 (0) c851 (0) c62e (0) c67d (0)\n001 3 62c0 6049 4853 | 15 6049 (0) 62c0 (0) 6271 (0) 75bf (0)\n002 2 2b79 2f1a | 6 33fe (0) 2f1a (0) 2b80 (0) 2b79 (0)\n003 4 041c 0f03 0e8f 0d7f | 4 041c (0) 0d7f (0) 0f03 (0) 0e8f (0)\n============ DEPTH: 4 ==========================================\n004 2 1a93 1dd4 | 2 1a93 (0) 1dd4 (0)\n005 0 | 0\n006 1 10d5 | 1 10d5 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"12b8769e0e996011ceff489a3f56ba8e555d545b69accb5b4396dead7335a8db","private_key":"2508a321d22ccd27c53ebf00259ba720d9dee11266d3f043f356c7a542bf5213","name":"node_12b8769e0e996011ceff489a3f56ba8e555d545b69accb5b4396dead7335a8db","services":["streamer"],"enable_msg_events":true,"port":38733},"up":true}},{"node":{"info":{"id":"aeff88a5c749733707f99b876c1ecf7db71b32a6916cf9bbd266af3e69f94e82","name":"node_aeff88a5c749733707f99b876c1ecf7db71b32a6916cf9bbd266af3e69f94e82","enode":"enode://680e1e24fb480dd22e272d12a2154d05d2da6969852d46f6b506b4a1282fb34600add98e4ca61da2fb843cf9cda458b570644726887f2050db271b98b1c0db17@127.0.0.1:0","enr":"0xf88fb8408aac439c83ee5ca37fe399d1d5b6c1e934d183768e15180da3383420881be7c53b0a80526aadd31a64143fd0a5260c48f9d7d5737a91adacae76980c9c76f9110183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103680e1e24fb480dd22e272d12a2154d05d2da6969852d46f6b506b4a1282fb346","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"rv+IpcdJczcH+ZuHbB7PfbcbMqaRbPm70mavPmn5ToI=","hive":"\n=========================================================================\nThu Feb 28 18:02:46 UTC 2019 KΛÐΞMLIΛ hive: queen's address: aeff88\npopulation: 14 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 62c0 6049 12b8 | 29 6049 (0) 62c0 (0) 6271 (0) 75bf (0)\n001 3 dd48 ce82 ec3e | 21 ce82 (0) c851 (0) c62e (0) c67d (0)\n002 3 8934 83aa 9861 | 6 83aa (0) 8934 (0) 8cb7 (0) 9637 (0)\n003 2 bbbc b269 | 4 b269 (0) bbbc (0) bc3e (0) be5d (0)\n004 1 a259 | 1 a259 (0)\n============ DEPTH: 5 ==========================================\n005 1 ab25 | 1 ab25 (0)\n006 1 adfd | 1 adfd (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"aeff88a5c749733707f99b876c1ecf7db71b32a6916cf9bbd266af3e69f94e82","private_key":"6362a429c515516bd38d57f294a819e354a5c339c513bbaab341d2c5a7f13394","name":"node_aeff88a5c749733707f99b876c1ecf7db71b32a6916cf9bbd266af3e69f94e82","services":["streamer"],"enable_msg_events":true,"port":40299},"up":true}},{"node":{"info":{"id":"ec3e84f80ab71df09a44c79c8d4af8da68fdf3dd7dbce7451363b8aa16630493","name":"node_ec3e84f80ab71df09a44c79c8d4af8da68fdf3dd7dbce7451363b8aa16630493","enode":"enode://78e0de844f3eb1a777d730bab86c1a0b567be81f22b68a37e6982ea9125e90bd7bc29f61d61244aa891f590fbfd8b5007806f51cf694267bb8e3b97a08572afb@127.0.0.1:0","enr":"0xf88fb840ee54b5b6a8c22c569f160e440cf7be54568f91bb8830054e562bf3befdd1d714319c55af25103db7e6a23762cbe773952246ac5142ec549a063fbea2b66725470183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10378e0de844f3eb1a777d730bab86c1a0b567be81f22b68a37e6982ea9125e90bd","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"7D6E+Aq3HfCaRMecjUr42mj98919vOdFE2O4qhZjBJM=","hive":"\n=========================================================================\nThu Feb 28 18:02:46 UTC 2019 KΛÐΞMLIΛ hive: queen's address: ec3e84\npopulation: 21 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 4e4e 6049 7a5c 75bf | 29 75bf (0) 7a5c (0) 6049 (0) 6271 (0)\n001 4 8934 be5d a259 aeff | 14 8934 (0) 8cb7 (0) 83aa (0) 9637 (0)\n002 5 dd48 de4f c62e ce82 | 12 ce82 (0) c851 (0) c62e (0) c67d (0)\n003 5 fef2 ff06 f6f3 f16d | 6 ff06 (0) fef2 (0) f6f3 (0) f090 (0)\n============ DEPTH: 4 ==========================================\n004 1 e59a | 1 e59a (0)\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 1 ec08 | 1 ec08 (0)\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"ec3e84f80ab71df09a44c79c8d4af8da68fdf3dd7dbce7451363b8aa16630493","private_key":"9cd9fa1a605cd0ed1669a0dd7bdedc839592f58445855d00f026f10b963dcafc","name":"node_ec3e84f80ab71df09a44c79c8d4af8da68fdf3dd7dbce7451363b8aa16630493","services":["streamer"],"enable_msg_events":true,"port":36709},"up":true}},{"node":{"info":{"id":"2293b1e9fb44ee6db39db9366291fc0b4e286c355547750de19e96c32e02bdf9","name":"node_2293b1e9fb44ee6db39db9366291fc0b4e286c355547750de19e96c32e02bdf9","enode":"enode://e5b1f4c67a9ddf4aa86df910ed695036a223dd512855d568edab958376cdd219581d2630660fde2afdc7ee817e216363ceb5fe859fe22b1cac314f5ca41d5c6a@127.0.0.1:0","enr":"0xf88fb840d2019a30e5ccc8ec4bcbdee28917513d1f3af8f8d0a0ca778e4198ff0de51ae22ac27b43f7d4c6a255487960932f592d5cde6b85398068b56960e6b05ee82faa0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102e5b1f4c67a9ddf4aa86df910ed695036a223dd512855d568edab958376cdd219","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"IpOx6ftE7m2znbk2YpH8C04obDVVR3UN4Z6Wwy4Cvfk=","hive":"\n=========================================================================\nThu Feb 28 18:02:46 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 2293b1\npopulation: 22 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 8934 c62e c05d ec3e | 35 83aa (0) 8934 (0) 8cb7 (0) 9637 (0)\n001 6 75bf 7a5c 46af 4443 | 15 7a5c (0) 75bf (0) 6049 (0) 6271 (0)\n002 7 10d5 1dd4 1a93 041c | 8 1a93 (0) 1dd4 (0) 10d5 (0) 12b8 (0)\n003 1 33fe | 1 33fe (0)\n============ DEPTH: 4 ==========================================\n004 3 2b80 2b79 2f1a | 3 2f1a (0) 2b80 (0) 2b79 (0)\n005 1 27c2 | 1 27c2 (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"2293b1e9fb44ee6db39db9366291fc0b4e286c355547750de19e96c32e02bdf9","private_key":"a7e22c8e32897aa84673ffac362e3ce8b479502494dc0749e76bdfd84a0adb9c","name":"node_2293b1e9fb44ee6db39db9366291fc0b4e286c355547750de19e96c32e02bdf9","services":["streamer"],"enable_msg_events":true,"port":42613},"up":true}},{"node":{"info":{"id":"0e8fb3e25746a7f18f33e31c10200e5ec21eb54ad592bad5369b9b584fe80e1b","name":"node_0e8fb3e25746a7f18f33e31c10200e5ec21eb54ad592bad5369b9b584fe80e1b","enode":"enode://0c0ef588e8b1199c6721bf84dcb2c30de56f14db707cb02e310a245b8b3ce5c62ae119bc2950db881cc79b4bc1a2386f24bc14b0b3b7ba4e2e2f37b5a1cff032@127.0.0.1:0","enr":"0xf88fb8403221a6d46572817f3fc0af52de678dc02fff0e264b852ad32144056b20ebe5eb256f63a332afe90b856b498ea1e44ba84e339efbe95ed453fbb8bf7eb3be2f0e0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1020c0ef588e8b1199c6721bf84dcb2c30de56f14db707cb02e310a245b8b3ce5c6","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"Do+z4ldGp/GPM+McECAOXsIetUrVkrrVNpubWE/oDhs=","hive":"\n=========================================================================\nThu Feb 28 18:02:46 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 0e8fb3\npopulation: 16 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 8cb7 8934 83aa f16d | 35 83aa (0) 8934 (0) 8cb7 (0) 9637 (0)\n001 3 4541 5b87 5b93 | 15 75bf (0) 7a5c (0) 6049 (0) 6271 (0)\n002 2 33fe 2293 | 6 33fe (0) 2f1a (0) 2b80 (0) 2b79 (0)\n003 4 10d5 12b8 1a93 1dd4 | 4 1a93 (0) 1dd4 (0) 10d5 (0) 12b8 (0)\n004 1 041c | 1 041c (0)\n============ DEPTH: 5 ==========================================\n005 0 | 0\n006 1 0d7f | 1 0d7f (0)\n007 1 0f03 | 1 0f03 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"0e8fb3e25746a7f18f33e31c10200e5ec21eb54ad592bad5369b9b584fe80e1b","private_key":"e4fb6f87c8b9945ae6a519e730732fdde0730aca6c9f6337c91d93cd6c1c2480","name":"node_0e8fb3e25746a7f18f33e31c10200e5ec21eb54ad592bad5369b9b584fe80e1b","services":["streamer"],"enable_msg_events":true,"port":42649},"up":true}},{"node":{"info":{"id":"f16dc65b58a9fa5060674ca741531891fd44b63d9ac5eabea185745049e474ca","name":"node_f16dc65b58a9fa5060674ca741531891fd44b63d9ac5eabea185745049e474ca","enode":"enode://d53eecb3d3f3d9ff017ec25bcdfcb2f3ce3232f6231b66d85ed3be04cf3f6cc65c8dde5e8fe596ad8525a3e57a7f32f6978897df1999e44a5d45eb5cd6b8e9a7@127.0.0.1:0","enr":"0xf88fb8406945726d8a4e02936737ad2da763a772efedf913a0000b71b47a1f44d9a385ea6b033e2dfc7fd4744edcf9516d7af9601eff2844b8039d985f9b575cd4a993dd0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103d53eecb3d3f3d9ff017ec25bcdfcb2f3ce3232f6231b66d85ed3be04cf3f6cc6","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"8W3GW1ip+lBgZ0ynQVMYkf1Etj2axeq+oYV0UEnkdMo=","hive":"\n=========================================================================\nThu Feb 28 18:02:46 UTC 2019 KΛÐΞMLIΛ hive: queen's address: f16dc6\npopulation: 15 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 75bf 0d7f 0e8f | 29 75bf (0) 7a5c (0) 6049 (0) 6271 (0)\n001 3 8934 83aa 9861 | 14 83aa (0) 8934 (0) 8cb7 (0) 9637 (0)\n002 2 ce82 dbef | 12 ce82 (0) c851 (0) c62e (0) c67d (0)\n003 2 e59a ec3e | 3 ec08 (0) ec3e (0) e59a (0)\n004 2 fef2 ff06 | 2 ff06 (0) fef2 (0)\n005 1 f6f3 | 1 f6f3 (0)\n============ DEPTH: 6 ==========================================\n006 0 | 0\n007 1 f090 | 1 f090 (0)\n008 1 f1e1 | 1 f1e1 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"f16dc65b58a9fa5060674ca741531891fd44b63d9ac5eabea185745049e474ca","private_key":"6e17a7cb8b4de986f9326d40d3f75a0548c328b5dcee6251d75d9660ff38b25f","name":"node_f16dc65b58a9fa5060674ca741531891fd44b63d9ac5eabea185745049e474ca","services":["streamer"],"enable_msg_events":true,"port":36431},"up":true}},{"node":{"info":{"id":"dbefd322e4f37f3e142ad151a08c8bd7784fb0db249324aff479f5b663212e76","name":"node_dbefd322e4f37f3e142ad151a08c8bd7784fb0db249324aff479f5b663212e76","enode":"enode://a8545ee5288608aa97011ceaad769754e2fef8de716fde9f03da6fd3443dee98a58ad2f20866d444df2aff3ebb9178512cbe0a88c70c13d763ad2f21a2d31518@127.0.0.1:0","enr":"0xf88fb840a5d951670a83dfbad4108b1a6e4daad3ec8234952811451a02187bb09cecbb095ae0eb3bb7f2c41e5a07f629cc716628c546b82b93c5895b8749b0af44aa53440183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102a8545ee5288608aa97011ceaad769754e2fef8de716fde9f03da6fd3443dee98","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"2+/TIuTzfz4UKtFRoIyL13hPsNskkySv9Hn1tmMhLnY=","hive":"\n=========================================================================\nThu Feb 28 18:02:46 UTC 2019 KΛÐΞMLIΛ hive: queen's address: dbefd3\npopulation: 15 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 7a5c 75bf 62c0 | 29 75bf (0) 7a5c (0) 6049 (0) 6271 (0)\n001 3 83aa 8cb7 8934 | 14 83aa (0) 8934 (0) 8cb7 (0) 9637 (0)\n002 2 e59a f16d | 9 ec08 (0) ec3e (0) e59a (0) ff06 (0)\n003 3 c67d c62e c34b | 7 ce82 (0) c851 (0) c62e (0) c67d (0)\n004 1 d165 | 1 d165 (0)\n============ DEPTH: 5 ==========================================\n005 2 de4f dd48 | 2 dd48 (0) de4f (0)\n006 1 d87b | 1 d87b (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"dbefd322e4f37f3e142ad151a08c8bd7784fb0db249324aff479f5b663212e76","private_key":"8537c2f509c410459184963d560347c250fc3f2631bcc456ac9b79da484bc101","name":"node_dbefd322e4f37f3e142ad151a08c8bd7784fb0db249324aff479f5b663212e76","services":["streamer"],"enable_msg_events":true,"port":35725},"up":true}},{"node":{"info":{"id":"c34bd2e209fc11e27f81e1359545f28c816787127b41811dc1710fa4e53fcefa","name":"node_c34bd2e209fc11e27f81e1359545f28c816787127b41811dc1710fa4e53fcefa","enode":"enode://0245124f48570389a2866e65303f7d57c8a4254666fb9e7ec6e6f3ace35f5e45ca64226350e6b6445dfd1091d1394796df617f005159041b940524f8adda73a1@127.0.0.1:0","enr":"0xf88fb8404535d47dbfda01f3c3a68b4bd60c11c4768d1649b38384b158512d85b4e5cc43499e0e607bddd4361d5b54a390b17ae72e26d3080276c9d687c9efae40f005860183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1030245124f48570389a2866e65303f7d57c8a4254666fb9e7ec6e6f3ace35f5e45","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"w0vS4gn8EeJ/geE1lUXyjIFnhxJ7QYEdwXEPpOU/zvo=","hive":"\n=========================================================================\nThu Feb 28 18:02:46 UTC 2019 KΛÐΞMLIΛ hive: queen's address: c34bd2\npopulation: 16 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 75bf 7a5c 62c0 | 29 7a5c (0) 75bf (0) 6049 (0) 6271 (0)\n001 3 83aa 8cb7 8934 | 14 83aa (0) 8934 (0) 8cb7 (0) 9637 (0)\n002 2 ec08 f090 | 9 ec08 (0) ec3e (0) e59a (0) ff06 (0)\n003 2 d165 dbef | 5 d165 (0) dd48 (0) de4f (0) d87b (0)\n004 2 c851 ce82 | 2 ce82 (0) c851 (0)\n005 2 c67d c62e | 2 c62e (0) c67d (0)\n============ DEPTH: 6 ==========================================\n006 2 c05d c034 | 2 c034 (0) c05d (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"c34bd2e209fc11e27f81e1359545f28c816787127b41811dc1710fa4e53fcefa","private_key":"ecb3f67dada43226ea1f5c5c177ca97188784e759b87b5d7701b36bbbcee941b","name":"node_c34bd2e209fc11e27f81e1359545f28c816787127b41811dc1710fa4e53fcefa","services":["streamer"],"enable_msg_events":true,"port":38173},"up":true}},{"node":{"info":{"id":"f090d909f94f6970d074948115e4f46e67e4fb5735f537889ed2b169ff2bd368","name":"node_f090d909f94f6970d074948115e4f46e67e4fb5735f537889ed2b169ff2bd368","enode":"enode://796dd862e2916c5900370aa18abb58eb7ba061bd52bf8bb48806ac1deec33d5f6627fbd4cdccb07ca96c2661bc2e8b28c2899f2dc77b58affcbb938e197868b7@127.0.0.1:0","enr":"0xf88fb84022132521c6b77045f87c62858e909b70e05b1eb03074a66cdbf5ddd612c6497c0d7965fa4bf8da77b47dd9876098ae4e83e897a656a7fead1080c84ad489a9800183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103796dd862e2916c5900370aa18abb58eb7ba061bd52bf8bb48806ac1deec33d5f","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"8JDZCflPaXDQdJSBFeT0bmfk+1c19TeIntKxaf8r02g=","hive":"\n=========================================================================\nThu Feb 28 18:02:46 UTC 2019 KΛÐΞMLIΛ hive: queen's address: f090d9\npopulation: 14 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 404b 2f1a 2b79 | 29 7a5c (0) 75bf (0) 6049 (0) 6271 (0)\n001 2 9861 ab25 | 14 83aa (0) 8934 (0) 8cb7 (0) 9861 (0)\n002 2 d165 c34b | 12 d165 (0) dd48 (0) de4f (0) d87b (0)\n003 2 e59a ec3e | 3 ec08 (0) ec3e (0) e59a (0)\n004 2 fef2 ff06 | 2 ff06 (0) fef2 (0)\n005 1 f6f3 | 1 f6f3 (0)\n============ DEPTH: 6 ==========================================\n006 0 | 0\n007 2 f1e1 f16d | 2 f1e1 (0) f16d (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"f090d909f94f6970d074948115e4f46e67e4fb5735f537889ed2b169ff2bd368","private_key":"3dfe370e85ca228b6903e2d360a8514dce89675639f3a9264664edb96fdca3dc","name":"node_f090d909f94f6970d074948115e4f46e67e4fb5735f537889ed2b169ff2bd368","services":["streamer"],"enable_msg_events":true,"port":41687},"up":true}},{"node":{"info":{"id":"2b790fbca8da74c7de9715b4919ce03cdcf14a4608671cd4739b2b99a052e636","name":"node_2b790fbca8da74c7de9715b4919ce03cdcf14a4608671cd4739b2b99a052e636","enode":"enode://370dcdd12168f383c15bd0ec87531e7bdaa52736c12bcea00741789b1751854b7e14b84fc913da88db24c127860eef70289cd36c30e870b2e60ae232f705b520@127.0.0.1:0","enr":"0xf88fb8403028d93ddd84c729bf844b16597a912772cc40c7db867507dad911da33bfe6d55295b0a2878cb609e92f19940ef46dd3702138aec69e6760ec1467fbce88f9fb0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102370dcdd12168f383c15bd0ec87531e7bdaa52736c12bcea00741789b1751854b","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"K3kPvKjadMfelxW0kZzgPNzxSkYIZxzUc5srmaBS5jY=","hive":"\n=========================================================================\nThu Feb 28 18:02:46 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 2b790f\npopulation: 12 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 8934 83aa f090 | 35 83aa (0) 8934 (0) 8cb7 (0) 9861 (0)\n001 2 7a5c 5b87 | 15 7a5c (0) 75bf (0) 6049 (0) 6271 (0)\n002 2 0d7f 12b8 | 8 041c (0) 0e8f (0) 0f03 (0) 0d7f (0)\n003 1 33fe | 1 33fe (0)\n004 2 2293 27c2 | 2 27c2 (0) 2293 (0)\n============ DEPTH: 5 ==========================================\n005 1 2f1a | 1 2f1a (0)\n006 0 | 0\n007 0 | 0\n008 1 2b80 | 1 2b80 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"2b790fbca8da74c7de9715b4919ce03cdcf14a4608671cd4739b2b99a052e636","private_key":"d4f121c855c9e92f96585641e9e11a9f25db6aa8086675165215c749e9931cc6","name":"node_2b790fbca8da74c7de9715b4919ce03cdcf14a4608671cd4739b2b99a052e636","services":["streamer"],"enable_msg_events":true,"port":39687},"up":true}},{"node":{"info":{"id":"5b87478ce6f96988d572d249140ca6716f66aec8f6e0435e7f8be9fca5ed38a0","name":"node_5b87478ce6f96988d572d249140ca6716f66aec8f6e0435e7f8be9fca5ed38a0","enode":"enode://c1760651e80b5c22381bc3145277a8ea0e69ca9ccb7eec2abbf5d25763af1434adb24df08ef0563f360c47e13df5274f4a306c6c58d563001c737b1a6e8f6077@127.0.0.1:0","enr":"0xf88fb84049138c3a1759cf719d4a36e6e0af5ed94ddcc90a5151a6bf2f2c4a1ab71fb59e1c02d825fd42a203c2b2638a1e777ba95a1f07e2a1b276029d6f689aa0dd9c6f0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103c1760651e80b5c22381bc3145277a8ea0e69ca9ccb7eec2abbf5d25763af1434","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"W4dHjOb5aYjVctJJFAymcW9mrsj24ENef4vp/KXtOKA=","hive":"\n=========================================================================\nThu Feb 28 18:02:46 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 5b8747\npopulation: 16 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 adfd 8cb7 8934 83aa | 35 83aa (0) 8934 (0) 8cb7 (0) 9861 (0)\n001 4 1dd4 0e8f 041c 2b79 | 14 041c (0) 0e8f (0) 0f03 (0) 0d7f (0)\n002 2 6271 75bf | 5 7a5c (0) 75bf (0) 6049 (0) 6271 (0)\n003 2 46af 4853 | 6 404b (0) 46af (0) 4443 (0) 4541 (0)\n004 1 55a2 | 1 55a2 (0)\n============ DEPTH: 5 ==========================================\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 1 5bf6 | 1 5bf6 (0)\n010 0 | 0\n011 1 5b93 | 1 5b93 (0)\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"5b87478ce6f96988d572d249140ca6716f66aec8f6e0435e7f8be9fca5ed38a0","private_key":"8d3cdf3d5a28844fd7e67364be1e82e3718d8f5eb3b28b7c219f3bfd3a4482ff","name":"node_5b87478ce6f96988d572d249140ca6716f66aec8f6e0435e7f8be9fca5ed38a0","services":["streamer"],"enable_msg_events":true,"port":45565},"up":true}},{"node":{"info":{"id":"c8511f8896d3c4226d5d8c860096c6a90839fce500a77b8304395f5b4833b284","name":"node_c8511f8896d3c4226d5d8c860096c6a90839fce500a77b8304395f5b4833b284","enode":"enode://8efe3d05a04ad75bac960e82749f90285a60965cbabf117520172a430cee7e1beabe22d9402056d1fcd0bd54060e8aef112a62ab850079d330d861bcdd7816cb@127.0.0.1:0","enr":"0xf88fb8405e37f5ab79e815ac91da5441a580c06abf98a4ea7d3ed49b9aaa5dd4b5c8356a4a4a3a5f0f457122d3ef8ef8d3d0ab266d55390d8c1dec965faa04061944e7180183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1038efe3d05a04ad75bac960e82749f90285a60965cbabf117520172a430cee7e1b","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"yFEfiJbTxCJtXYyGAJbGqQg5/OUAp3uDBDlfW0gzsoQ=","hive":"\n=========================================================================\nThu Feb 28 18:02:46 UTC 2019 KΛÐΞMLIΛ hive: queen's address: c8511f\npopulation: 17 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 1dd4 1a93 4853 5b87 | 29 1a93 (0) 1dd4 (0) 10d5 (0) 12b8 (0)\n001 2 8cb7 83aa | 14 83aa (0) 8934 (0) 8cb7 (0) 9861 (0)\n002 3 e59a ec08 ec3e | 9 ec08 (0) ec3e (0) e59a (0) f090 (0)\n003 2 dd48 d87b | 5 d165 (0) de4f (0) dd48 (0) dbef (0)\n============ DEPTH: 4 ==========================================\n004 5 c34b c034 c05d c62e | 5 c62e (0) c67d (0) c034 (0) c05d (0)\n005 1 ce82 | 1 ce82 (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"c8511f8896d3c4226d5d8c860096c6a90839fce500a77b8304395f5b4833b284","private_key":"7edb500de3d27c2f1c20281b4a363269e854385d629b21f00110159d97b3607e","name":"node_c8511f8896d3c4226d5d8c860096c6a90839fce500a77b8304395f5b4833b284","services":["streamer"],"enable_msg_events":true,"port":44825},"up":true}},{"node":{"info":{"id":"d87ba657576968058fcc86579c3f52aa78905909b0a943938af621c6ed99fbea","name":"node_d87ba657576968058fcc86579c3f52aa78905909b0a943938af621c6ed99fbea","enode":"enode://df025390a37a450f77f57f29730f1cdcf861dafe454be915480b15a7618c3dd0fa0614cd563fafc92b49c299f8ca1a67fa45a5e339ef81f7eb0313063ec7fcd7@127.0.0.1:0","enr":"0xf88fb840f20d1eb7eba00a7c4cad26a78536b6a072c53c985418b4cca4a279004d36316d3b04274929a19f4967819c2b69986716fdb97b7224be8c43b3152c9a09b6f1450183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103df025390a37a450f77f57f29730f1cdcf861dafe454be915480b15a7618c3dd0","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"2HumV1dpaAWPzIZXnD9SqniQWQmwqUOTivYhxu2Z++o=","hive":"\n=========================================================================\nThu Feb 28 18:02:46 UTC 2019 KΛÐΞMLIΛ hive: queen's address: d87ba6\npopulation: 14 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 6049 7a5c 75bf | 29 7a5c (0) 75bf (0) 6049 (0) 6271 (0)\n001 3 8cb7 8934 83aa | 14 83aa (0) 8934 (0) 8cb7 (0) 9861 (0)\n002 2 ec08 f1e1 | 9 ec08 (0) ec3e (0) e59a (0) ff06 (0)\n003 2 c62e c851 | 7 c62e (0) c67d (0) c034 (0) c05d (0)\n004 1 d165 | 1 d165 (0)\n============ DEPTH: 5 ==========================================\n005 2 de4f dd48 | 2 de4f (0) dd48 (0)\n006 1 dbef | 1 dbef (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"d87ba657576968058fcc86579c3f52aa78905909b0a943938af621c6ed99fbea","private_key":"93f0687cbba5779fbb6cb10ab57fdb2d731263d9454254b0d068517de95318c3","name":"node_d87ba657576968058fcc86579c3f52aa78905909b0a943938af621c6ed99fbea","services":["streamer"],"enable_msg_events":true,"port":42845},"up":true}},{"node":{"info":{"id":"f1e151beef0c2259669ac950125aa004b02ba7078bf2d87248a4b7d25c62585e","name":"node_f1e151beef0c2259669ac950125aa004b02ba7078bf2d87248a4b7d25c62585e","enode":"enode://484250cb629a55eb8908406ea682b88bd1095dbc5c8b47d7dcf788b58af2aca80bcc8048c730f61123f714da50af301fbf0bb5544d6a12265dd64f6d6caa7622@127.0.0.1:0","enr":"0xf88fb840c0b62c373941d77a9db85a25dd2254d9ed63ab322b5103757f67b539c0637fa45e0227414a8f3c80030c5c4f3c63066f12d2f43a348b054df1baec631a2b24ab0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102484250cb629a55eb8908406ea682b88bd1095dbc5c8b47d7dcf788b58af2aca8","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"8eFRvu8MIllmmslQElqgBLArpweL8thySKS30lxiWF4=","hive":"\n=========================================================================\nThu Feb 28 18:02:46 UTC 2019 KΛÐΞMLIΛ hive: queen's address: f1e151\npopulation: 15 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 0d7f 10d5 | 29 7a5c (0) 75bf (0) 6049 (0) 6271 (0)\n001 3 adfd 83aa 8cb7 | 14 83aa (0) 8934 (0) 8cb7 (0) 9861 (0)\n002 3 c67d c62e d87b | 12 c62e (0) c67d (0) c34b (0) c034 (0)\n003 2 e59a ec08 | 3 ec08 (0) ec3e (0) e59a (0)\n004 2 ff06 fef2 | 2 ff06 (0) fef2 (0)\n005 1 f6f3 | 1 f6f3 (0)\n============ DEPTH: 6 ==========================================\n006 0 | 0\n007 1 f090 | 1 f090 (0)\n008 1 f16d | 1 f16d (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"f1e151beef0c2259669ac950125aa004b02ba7078bf2d87248a4b7d25c62585e","private_key":"acc2b5405b67970f8bd4ed395c8d529244748d6ac6a154cb9ff921ece215fb88","name":"node_f1e151beef0c2259669ac950125aa004b02ba7078bf2d87248a4b7d25c62585e","services":["streamer"],"enable_msg_events":true,"port":41401},"up":true}},{"node":{"info":{"id":"10d579523acbad30e3e50d610f0d3291f7518486773c8d9404856bf1349128bf","name":"node_10d579523acbad30e3e50d610f0d3291f7518486773c8d9404856bf1349128bf","enode":"enode://89a7090143be61d5f0802e125024559acf78c2f4425833355773894fb50f276b8fdda028da973cf879caedfc187dd1addcdf96518411c22acaa2481c2e286f0e@127.0.0.1:0","enr":"0xf88fb8406fe88139d195b80e137f45124e24df45a21c7cd29b132466d90f172da4a4bc3827089aa2a8a2e90d2dffe86715fe8fa4fcb3e92946b1d1ba13c05fced90ccdf10183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10289a7090143be61d5f0802e125024559acf78c2f4425833355773894fb50f276b","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"ENV5UjrLrTDj5Q1hDw0ykfdRhIZ3PI2UBIVr8TSRKL8=","hive":"\n=========================================================================\nThu Feb 28 18:02:46 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 10d579\npopulation: 14 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 fef2 f1e1 | 35 83aa (0) 8934 (0) 8cb7 (0) 9861 (0)\n001 3 6049 7a5c 75bf | 15 7a5c (0) 75bf (0) 6049 (0) 6271 (0)\n002 3 33fe 2293 27c2 | 6 33fe (0) 27c2 (0) 2293 (0) 2f1a (0)\n003 3 0f03 0e8f 041c | 4 041c (0) 0e8f (0) 0f03 (0) 0d7f (0)\n============ DEPTH: 4 ==========================================\n004 2 1a93 1dd4 | 2 1a93 (0) 1dd4 (0)\n005 0 | 0\n006 1 12b8 | 1 12b8 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"10d579523acbad30e3e50d610f0d3291f7518486773c8d9404856bf1349128bf","private_key":"aed9b1cd2e417b73e0eafef6d800fb05144bbd30fde59e856931febfceef38fa","name":"node_10d579523acbad30e3e50d610f0d3291f7518486773c8d9404856bf1349128bf","services":["streamer"],"enable_msg_events":true,"port":36265},"up":true}},{"node":{"info":{"id":"fef27a360408179eafd514dfc71016f3df085bcb2e83bbdeb5fb9e5cd1935696","name":"node_fef27a360408179eafd514dfc71016f3df085bcb2e83bbdeb5fb9e5cd1935696","enode":"enode://336313478a56abfa3294828046976fbf1cb48cdea139aa491ca1cd88448e89b3740139f57abadcff5bc46002f2e491114ae0145b2dd38143675777c06d03ef60@127.0.0.1:0","enr":"0xf88fb840aa6cf0fb83fdcdc187e00d76cbbbcb8be6d3beceab21d139ad8b0e8380aafaa62f686200f97847175179cad675ea37ee3c5b6db44cd6241386602d8d410691ba0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102336313478a56abfa3294828046976fbf1cb48cdea139aa491ca1cd88448e89b3","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"/vJ6NgQIF56v1RTfxxAW898IW8sug7vetfueXNGTVpY=","hive":"\n=========================================================================\nThu Feb 28 18:02:46 UTC 2019 KΛÐΞMLIΛ hive: queen's address: fef27a\npopulation: 18 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 75bf 7a5c 27c2 10d5 | 29 7a5c (0) 75bf (0) 6049 (0) 6271 (0)\n001 3 83aa 8934 8cb7 | 14 83aa (0) 8934 (0) 8cb7 (0) 9861 (0)\n002 3 d165 c034 c05d | 12 d165 (0) de4f (0) dd48 (0) dbef (0)\n003 3 e59a ec3e ec08 | 3 ec08 (0) ec3e (0) e59a (0)\n============ DEPTH: 4 ==========================================\n004 4 f090 f1e1 f16d f6f3 | 4 f6f3 (0) f090 (0) f16d (0) f1e1 (0)\n005 0 | 0\n006 0 | 0\n007 1 ff06 | 1 ff06 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"fef27a360408179eafd514dfc71016f3df085bcb2e83bbdeb5fb9e5cd1935696","private_key":"49a6d4a219bf4b1ad421bd6639b794b3f12fabb5f218155ca4722238da50e33f","name":"node_fef27a360408179eafd514dfc71016f3df085bcb2e83bbdeb5fb9e5cd1935696","services":["streamer"],"enable_msg_events":true,"port":45845},"up":true}},{"node":{"info":{"id":"c05d9d9199c1b1bf84af4b8869b36920382f0350d58dd5100700cd0d27f165ab","name":"node_c05d9d9199c1b1bf84af4b8869b36920382f0350d58dd5100700cd0d27f165ab","enode":"enode://611dae74107d3503af1ac4fa2d17a00533063b2247085dd393337640911e8c5ca30c1e485845c6dc12c408705af5ecfcfc593bb6503d859b9ddd51eb2b40fa71@127.0.0.1:0","enr":"0xf88fb8401cb70183d2bfd84ae541dc21ef3417ac61c4e11bc8d80f2adc3b475b1ea5011a7767542e90a84bd5e76da6acfe25c5d8b7c0236a7b7ff85fc81506fbe874e1b00183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103611dae74107d3503af1ac4fa2d17a00533063b2247085dd393337640911e8c5c","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"wF2dkZnBsb+Er0uIabNpIDgvA1DVjdUQBwDNDSfxZas=","hive":"\n=========================================================================\nThu Feb 28 18:02:46 UTC 2019 KΛÐΞMLIΛ hive: queen's address: c05d9d\npopulation: 16 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 33fe 27c2 2293 | 29 33fe (0) 27c2 (0) 2293 (0) 2f1a (0)\n001 3 8934 83aa be5d | 14 83aa (0) 8934 (0) 8cb7 (0) 9861 (0)\n002 2 ec08 fef2 | 9 ec08 (0) ec3e (0) e59a (0) f090 (0)\n003 2 d165 de4f | 5 d165 (0) de4f (0) dd48 (0) dbef (0)\n004 2 c851 ce82 | 2 ce82 (0) c851 (0)\n005 2 c67d c62e | 2 c62e (0) c67d (0)\n============ DEPTH: 6 ==========================================\n006 1 c34b | 1 c34b (0)\n007 0 | 0\n008 0 | 0\n009 1 c034 | 1 c034 (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"c05d9d9199c1b1bf84af4b8869b36920382f0350d58dd5100700cd0d27f165ab","private_key":"d8106f622a5e169381999bd3370e0a0ee143ac4bd5f679a957c78402600e345b","name":"node_c05d9d9199c1b1bf84af4b8869b36920382f0350d58dd5100700cd0d27f165ab","services":["streamer"],"enable_msg_events":true,"port":41355},"up":true}},{"node":{"info":{"id":"be5da0eb4bc76c0ca3a63423568dbfa24d385499945b068308a2874ed4243eb3","name":"node_be5da0eb4bc76c0ca3a63423568dbfa24d385499945b068308a2874ed4243eb3","enode":"enode://1461c352c31d8c7158d0bae6915d42f1353f1b5608ebca9ab6ef2bc08035155f3fb075962f54495806fe9b8cd85a22b42ac099cbf299571ff5e5ba91271a2f17@127.0.0.1:0","enr":"0xf88fb840a191693ed026822c26a8b3823cb888fc5e2607612bcfe9d4a6ee5ede28060aef2608c9121b792343c21884f298aa1dcff8431d0acf48205f66a6cd156b4089360183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1031461c352c31d8c7158d0bae6915d42f1353f1b5608ebca9ab6ef2bc08035155f","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"vl2g60vHbAyjpjQjVo2/ok04VJmUWwaDCKKHTtQkPrM=","hive":"\n=========================================================================\nThu Feb 28 18:02:46 UTC 2019 KΛÐΞMLIΛ hive: queen's address: be5da0\npopulation: 14 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 27c2 33fe 4e4e | 29 33fe (0) 27c2 (0) 2293 (0) 2f1a (0)\n001 3 ec3e ec08 c05d | 21 ec08 (0) ec3e (0) e59a (0) f090 (0)\n002 3 83aa 8934 8cb7 | 6 83aa (0) 8934 (0) 8cb7 (0) 9861 (0)\n003 2 ab25 a259 | 4 a259 (0) ab25 (0) aeff (0) adfd (0)\n004 1 b269 | 1 b269 (0)\n============ DEPTH: 5 ==========================================\n005 1 bbbc | 1 bbbc (0)\n006 1 bc3e | 1 bc3e (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"be5da0eb4bc76c0ca3a63423568dbfa24d385499945b068308a2874ed4243eb3","private_key":"9d95c4e61d120dc2c67a63e93da0b69a257ae7dd8ca30eda036335366d1508de","name":"node_be5da0eb4bc76c0ca3a63423568dbfa24d385499945b068308a2874ed4243eb3","services":["streamer"],"enable_msg_events":true,"port":36717},"up":true}},{"node":{"info":{"id":"4e4ed5f90dc5399e3362d2691cb5587af8627ae542c524e2f2a129428b91a89b","name":"node_4e4ed5f90dc5399e3362d2691cb5587af8627ae542c524e2f2a129428b91a89b","enode":"enode://41e5ef400615590acfce1feaa4f723da88b7fee03c125e8feeb03201c364a22a14bfab06b86ce8c50bbf67843d5c300284b03c113f769c22ec8d0c0efa7bdb88@127.0.0.1:0","enr":"0xf88fb840d9ed9f340c2d0edc3d9f2fb6dc8cab0028f8ad74cb6931445c8752a95d3d1f0905c1ba22a04418eeb093a35bafd184eff3faa6fd110606e175e07ece0216c8930183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10241e5ef400615590acfce1feaa4f723da88b7fee03c125e8feeb03201c364a22a","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"Tk7V+Q3FOZ4zYtJpHLVYevhieuVCxSTi8qEpQouRqJs=","hive":"\n=========================================================================\nThu Feb 28 18:02:46 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 4e4ed5\npopulation: 16 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 e59a ec3e ec08 be5d | 35 ec08 (0) ec3e (0) e59a (0) f090 (0)\n001 3 27c2 33fe 0d7f | 14 33fe (0) 27c2 (0) 2293 (0) 2f1a (0)\n002 2 7a5c 75bf | 5 7a5c (0) 75bf (0) 6049 (0) 6271 (0)\n003 2 5bf6 5b93 | 4 5bf6 (0) 5b87 (0) 5b93 (0) 55a2 (0)\n============ DEPTH: 4 ==========================================\n004 4 46af 4541 4443 404b | 4 404b (0) 4443 (0) 4541 (0) 46af (0)\n005 1 4853 | 1 4853 (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"4e4ed5f90dc5399e3362d2691cb5587af8627ae542c524e2f2a129428b91a89b","private_key":"30dde001235a31362e50d4c106edd3ceaf6526ef026eca049fedc0a8fc0b96e1","name":"node_4e4ed5f90dc5399e3362d2691cb5587af8627ae542c524e2f2a129428b91a89b","services":["streamer"],"enable_msg_events":true,"port":42507},"up":true}},{"node":{"info":{"id":"0d7f4a662acc72d2fed999e13880cd1070d7bb868a92ee343a52dcf84cf06395","name":"node_0d7f4a662acc72d2fed999e13880cd1070d7bb868a92ee343a52dcf84cf06395","enode":"enode://91e81df107a4406cac255c8d4ba60fd18e5dcd96fd1cb877eb7024c046b695df3f48d299aeef695da5d4fea7069487cc20c4c48c1fd27528eb3f2f627b952342@127.0.0.1:0","enr":"0xf88fb8401644e0ac4bf24a23935aa075cfd9c4d6d785825325cbf7a21768c96abc96a92e5f47057330b9c09e916850fddfb4b3d689a4a0b98ba012c7b01e0123da1726900183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10291e81df107a4406cac255c8d4ba60fd18e5dcd96fd1cb877eb7024c046b695df","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"DX9KZirMctL+2ZnhOIDNEHDXu4aKku40OlLc+EzwY5U=","hive":"\n=========================================================================\nThu Feb 28 18:02:46 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 0d7f4a\npopulation: 15 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 dd48 f16d f1e1 8cb7 | 35 f1e1 (0) f16d (0) f090 (0) f6f3 (0)\n001 3 55a2 4541 4e4e | 15 7a5c (0) 75bf (0) 6049 (0) 6271 (0)\n002 2 2b79 2293 | 6 33fe (0) 27c2 (0) 2293 (0) 2f1a (0)\n003 2 1a93 12b8 | 4 10d5 (0) 12b8 (0) 1a93 (0) 1dd4 (0)\n004 1 041c | 1 041c (0)\n============ DEPTH: 5 ==========================================\n005 0 | 0\n006 2 0e8f 0f03 | 2 0f03 (0) 0e8f (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"0d7f4a662acc72d2fed999e13880cd1070d7bb868a92ee343a52dcf84cf06395","private_key":"52ff6622d57b5556228f56e411af84d7d5e876ec0b0ef9a3910cf4dacf19295a","name":"node_0d7f4a662acc72d2fed999e13880cd1070d7bb868a92ee343a52dcf84cf06395","services":["streamer"],"enable_msg_events":true,"port":35159},"up":true}},{"node":{"info":{"id":"adfd2641d8e57ade2e6b802cbeb0c0b7336430a67d1d1f3abc5152b4df066b91","name":"node_adfd2641d8e57ade2e6b802cbeb0c0b7336430a67d1d1f3abc5152b4df066b91","enode":"enode://b05e0fa469e2a12f94369fc64122362af6019a567958df1faa114a1d2c667a835201b99b789eff01bddf4da25a4801ca96f3eaa056156808eeff5f4ecbd9cd36@127.0.0.1:0","enr":"0xf88fb840e775dd44d761e5b3b2c18b047cd086b5c5ca6dbba08ba0744c495cde6f289bf958930628ace3e04c30d4347c0ed18bcc9d021bcc5bfa395a05423d6042f5fe600183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102b05e0fa469e2a12f94369fc64122362af6019a567958df1faa114a1d2c667a83","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"rf0mQdjlet4ua4AsvrDAtzNkMKZ9HR86vFFStN8Ga5E=","hive":"\n=========================================================================\nThu Feb 28 18:02:46 UTC 2019 KΛÐΞMLIΛ hive: queen's address: adfd26\npopulation: 14 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 5b87 5bf6 0d7f | 29 5bf6 (0) 5b87 (0) 5b93 (0) 55a2 (0)\n001 2 f1e1 ff06 | 21 f1e1 (0) f16d (0) f090 (0) f6f3 (0)\n002 3 8934 83aa 9009 | 6 83aa (0) 8934 (0) 8cb7 (0) 9861 (0)\n003 3 bbbc bc3e b269 | 4 b269 (0) bbbc (0) be5d (0) bc3e (0)\n004 1 a259 | 1 a259 (0)\n============ DEPTH: 5 ==========================================\n005 1 ab25 | 1 ab25 (0)\n006 1 aeff | 1 aeff (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"adfd2641d8e57ade2e6b802cbeb0c0b7336430a67d1d1f3abc5152b4df066b91","private_key":"0315f5fb99c9777433fed108cc4c6deb7db717796e405b5e6a3aa389299b87b4","name":"node_adfd2641d8e57ade2e6b802cbeb0c0b7336430a67d1d1f3abc5152b4df066b91","services":["streamer"],"enable_msg_events":true,"port":35001},"up":true}},{"node":{"info":{"id":"9009cef32b9cc42e97b812ba3a35b977da5d373990bb9521a516df9466401d5d","name":"node_9009cef32b9cc42e97b812ba3a35b977da5d373990bb9521a516df9466401d5d","enode":"enode://093522f714ffd69ed9f6db15bb1cde0bc555925225a9e372b375bd301de6cb9d950b7b8c0b78c4de65bbeee2cd2ac0dcb1901f0bc3de835e1a24d76ca813c2ae@127.0.0.1:0","enr":"0xf88fb840c1c3fa0a54f8946b866c65b93538aac7322c9d5b26aff75c0dd8033fde1dde1627786a0478d2407b93c96f661b093b4a13d1aa4b5bd03a067492d76988b6a6800183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102093522f714ffd69ed9f6db15bb1cde0bc555925225a9e372b375bd301de6cb9d","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"kAnO8yucxC6XuBK6OjW5d9pdNzmQu5UhpRbflGZAHV0=","hive":"\n=========================================================================\nThu Feb 28 18:02:46 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 9009ce\npopulation: 13 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 27c2 33fe 62c0 | 29 33fe (0) 27c2 (0) 2293 (0) 2f1a (0)\n001 3 ce82 de4f ff06 | 21 d165 (0) de4f (0) dd48 (0) dbef (0)\n002 2 bc3e adfd | 8 b269 (0) bbbc (0) be5d (0) bc3e (0)\n003 3 83aa 8934 8cb7 | 3 83aa (0) 8934 (0) 8cb7 (0)\n============ DEPTH: 4 ==========================================\n004 1 9861 | 1 9861 (0)\n005 1 9637 | 1 9637 (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"9009cef32b9cc42e97b812ba3a35b977da5d373990bb9521a516df9466401d5d","private_key":"1bc6fe30378e57ca0c15b6f6f5f2d74ba8cdafbe43f76592ab80c52dc0f52728","name":"node_9009cef32b9cc42e97b812ba3a35b977da5d373990bb9521a516df9466401d5d","services":["streamer"],"enable_msg_events":true,"port":35487},"up":true}},{"node":{"info":{"id":"62c09690dd71784e06b438d7c56256e1097c05fe7eb83b90fe5b0277a4b88568","name":"node_62c09690dd71784e06b438d7c56256e1097c05fe7eb83b90fe5b0277a4b88568","enode":"enode://c81f541ba227667d8becb3345c579943bfbb3a8bcd62b439cb005efda334f6c8c1d6d2af9fa49dad450a5875a0646b9a04f7083c19087bd7c433ab3db9094628@127.0.0.1:0","enr":"0xf88fb8403f4920feda458e968679a926fd71a565a684927ea66ae2650f2db9bd6c6ee43e1fc9cd1d73b370ecd2ba7c6b42518f316edc250d1e926c34b391d1b6480cdb330183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102c81f541ba227667d8becb3345c579943bfbb3a8bcd62b439cb005efda334f6c8","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"YsCWkN1xeE4GtDjXxWJW4Ql8Bf5+uDuQ/lsCd6S4hWg=","hive":"\n=========================================================================\nThu Feb 28 18:02:46 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 62c096\npopulation: 23 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 de4f dbef c34b e59a | 35 d165 (0) de4f (0) dd48 (0) dbef (0)\n001 6 0f03 041c 12b8 1a93 | 14 33fe (0) 27c2 (0) 2293 (0) 2f1a (0)\n002 7 4853 404b 4443 4541 | 10 5b87 (0) 5b93 (0) 5bf6 (0) 55a2 (0)\n003 2 75bf 7a5c | 2 7a5c (0) 75bf (0)\n============ DEPTH: 4 ==========================================\n004 0 | 0\n005 0 | 0\n006 1 6049 | 1 6049 (0)\n007 0 | 0\n008 1 6271 | 1 6271 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"62c09690dd71784e06b438d7c56256e1097c05fe7eb83b90fe5b0277a4b88568","private_key":"269dd3ac6136b86cb9f66421970333cf6b067b5e2ad659c74a12a454391a781b","name":"node_62c09690dd71784e06b438d7c56256e1097c05fe7eb83b90fe5b0277a4b88568","services":["streamer"],"enable_msg_events":true,"port":43131},"up":true}},{"node":{"info":{"id":"e59a74b65709cd9e76d4d531d078a8a3055061eddc4d515affbfc0f99cae22ac","name":"node_e59a74b65709cd9e76d4d531d078a8a3055061eddc4d515affbfc0f99cae22ac","enode":"enode://f5fe3b4e018db5568948b9ef30185053e250d458a82b652689af29835dd52c49183ff839f32d445eb8106cc99df2f214878755161589f635c59336b92e24fdad@127.0.0.1:0","enr":"0xf88fb840a740cd0c6245b675fe0d492a0d4d735796337ec26f5662c4f9da84de9e48a03f5558dc622db428dea3a93145610b4c70871ada7d76383a1148c2343ac86a40bc0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103f5fe3b4e018db5568948b9ef30185053e250d458a82b652689af29835dd52c49","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"5Zp0tlcJzZ521NUx0HioowVQYe3cTVFa/7/A+ZyuIqw=","hive":"\n=========================================================================\nThu Feb 28 18:02:46 UTC 2019 KΛÐΞMLIΛ hive: queen's address: e59a74\npopulation: 19 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 1dd4 4e4e 6049 62c0 | 29 33fe (0) 27c2 (0) 2293 (0) 2f1a (0)\n001 4 a259 83aa 8934 8cb7 | 14 83aa (0) 8934 (0) 8cb7 (0) 9861 (0)\n002 5 c62e c851 ce82 de4f | 12 d165 (0) dbef (0) d87b (0) de4f (0)\n003 4 fef2 f16d f1e1 f090 | 6 f090 (0) f1e1 (0) f16d (0) f6f3 (0)\n============ DEPTH: 4 ==========================================\n004 2 ec3e ec08 | 2 ec08 (0) ec3e (0)\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"e59a74b65709cd9e76d4d531d078a8a3055061eddc4d515affbfc0f99cae22ac","private_key":"6e4dcbf79fca1a42fc07f76fb66b645ff15ad89bf3b5ee627bc4294089d2770b","name":"node_e59a74b65709cd9e76d4d531d078a8a3055061eddc4d515affbfc0f99cae22ac","services":["streamer"],"enable_msg_events":true,"port":41179},"up":true}},{"node":{"info":{"id":"1dd4c2c8dac646526b1afd187f326712da75ed7a717668bfc89c7703a964d480","name":"node_1dd4c2c8dac646526b1afd187f326712da75ed7a717668bfc89c7703a964d480","enode":"enode://091c7d3991885b5205a7ad94190d2c5ca8169b7a2b7cee4fd6892d2dbe13ae3471441239ab4accb7bcd14852193c18d5617b8862678cc87887b11e6d41649b11@127.0.0.1:0","enr":"0xf88fb840c63763385c1eda51cd29a392364bf9f8be18399e4f9607b47bab1b59152f0587723422ca8629675ecacc5ffa0aeb859c37e02ffc2af0369b0979891a56d18e5d0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103091c7d3991885b5205a7ad94190d2c5ca8169b7a2b7cee4fd6892d2dbe13ae34","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"HdTCyNrGRlJrGv0YfzJnEtp17Xpxdmi/yJx3A6lk1IA=","hive":"\n=========================================================================\nThu Feb 28 18:02:46 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 1dd4c2\npopulation: 17 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 8934 83aa c851 e59a | 35 83aa (0) 8934 (0) 8cb7 (0) 9861 (0)\n001 3 5b87 5b93 75bf | 15 5b93 (0) 5b87 (0) 5bf6 (0) 55a2 (0)\n002 4 2f1a 2293 27c2 33fe | 6 33fe (0) 27c2 (0) 2293 (0) 2f1a (0)\n003 3 041c 0f03 0e8f | 4 041c (0) 0d7f (0) 0f03 (0) 0e8f (0)\n============ DEPTH: 4 ==========================================\n004 2 10d5 12b8 | 2 12b8 (0) 10d5 (0)\n005 1 1a93 | 1 1a93 (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"1dd4c2c8dac646526b1afd187f326712da75ed7a717668bfc89c7703a964d480","private_key":"15434ad1577984b2ae25fc53d127261f8a1d1b643edf1cfe7f49714a1ed8619b","name":"node_1dd4c2c8dac646526b1afd187f326712da75ed7a717668bfc89c7703a964d480","services":["streamer"],"enable_msg_events":true,"port":46023},"up":true}},{"node":{"info":{"id":"75bf881b6acbf512f2abcf42e5d86ac32e5dd849e7a416e39275979a2b6bf43a","name":"node_75bf881b6acbf512f2abcf42e5d86ac32e5dd849e7a416e39275979a2b6bf43a","enode":"enode://5196fd22b79e08c920e19716c9cf53c83634acda9a39d03f9e09e1241417eb955553103a82a5e58351a4696f61b7910bb9ce0e40105fef8f988d891d2b37b63d@127.0.0.1:0","enr":"0xf88fb840924cb202bf2e42bbe4204422d11630c955bb55e1c35949af2ab69a72a890f7c00a9429df6f78ec5295745029133eccea9fdd9c81b7ff637c884cd01bc527398b0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1035196fd22b79e08c920e19716c9cf53c83634acda9a39d03f9e09e1241417eb95","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"db+IG2rL9RLyq89C5dhqwy5d2EnnpBbjknWXmitr9Do=","hive":"\n=========================================================================\nThu Feb 28 18:02:46 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 75bf88\npopulation: 17 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 7 f16d fef2 ec3e c34b | 35 e59a (0) ec08 (0) ec3e (0) f090 (0)\n001 3 2293 10d5 1dd4 | 14 33fe (0) 27c2 (0) 2293 (0) 2f1a (0)\n002 3 4e4e 5bf6 5b87 | 10 5b93 (0) 5b87 (0) 5bf6 (0) 55a2 (0)\n============ DEPTH: 3 ==========================================\n003 3 6049 62c0 6271 | 3 6271 (0) 62c0 (0) 6049 (0)\n004 1 7a5c | 1 7a5c (0)\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"75bf881b6acbf512f2abcf42e5d86ac32e5dd849e7a416e39275979a2b6bf43a","private_key":"1d04f36e8b1b0b6d54f6361f0951803d47e9635eca0750c712509153f7ecf942","name":"node_75bf881b6acbf512f2abcf42e5d86ac32e5dd849e7a416e39275979a2b6bf43a","services":["streamer"],"enable_msg_events":true,"port":35973},"up":true}},{"node":{"info":{"id":"a25904f98c73a09a37034f579d86413fe31fd9a052a03d74266760d4ea73b8e9","name":"node_a25904f98c73a09a37034f579d86413fe31fd9a052a03d74266760d4ea73b8e9","enode":"enode://a475a32447cded8bbb47d0d8fe2373bdd01422752a81c31c2845b8f630c501c57e5e1df81ac50100e84cc9c7c29c7a5217d80933bb076ae900c4e9b39b8d3192@127.0.0.1:0","enr":"0xf88fb840c305671d9a97ae99f8a21d0af8cb920e8343e1157f891978be2c6593c9ccd2b606f3d350e8f146686ba9e55de1988b02886a36cb7782c11fbed93a7a1987a3ff0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102a475a32447cded8bbb47d0d8fe2373bdd01422752a81c31c2845b8f630c501c5","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"olkE+YxzoJo3A09XnYZBP+Mf2aBSoD10Jmdg1OpzuOk=","hive":"\n=========================================================================\nThu Feb 28 18:02:46 UTC 2019 KΛÐΞMLIΛ hive: queen's address: a25904\npopulation: 14 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 6049 75bf | 29 33fe (0) 27c2 (0) 2293 (0) 2f1a (0)\n001 4 ec3e ec08 e59a f6f3 | 21 e59a (0) ec08 (0) ec3e (0) f090 (0)\n002 2 9637 9861 | 6 9861 (0) 9637 (0) 9009 (0) 83aa (0)\n003 3 b269 bbbc be5d | 4 b269 (0) bbbc (0) be5d (0) bc3e (0)\n============ DEPTH: 4 ==========================================\n004 3 ab25 aeff adfd | 3 ab25 (0) aeff (0) adfd (0)\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"a25904f98c73a09a37034f579d86413fe31fd9a052a03d74266760d4ea73b8e9","private_key":"9c19a3fae05635da15fc8499e2d30b15ab154d5aebd6e911ffe18c8b9bdf7e06","name":"node_a25904f98c73a09a37034f579d86413fe31fd9a052a03d74266760d4ea73b8e9","services":["streamer"],"enable_msg_events":true,"port":37579},"up":true}},{"node":{"info":{"id":"604962f0064ac9612a19b459964f72da27c547c70a5bf12fb9ff3ef9c06c5a41","name":"node_604962f0064ac9612a19b459964f72da27c547c70a5bf12fb9ff3ef9c06c5a41","enode":"enode://f7775a8758c3725f763c0806ba1d52f74e6b312de69eaf6ed8cc0c7a88625c53e47053e304eb9b567843da94010ca4447b98699a541ba1425f0aa147e444b86e@127.0.0.1:0","enr":"0xf88fb8403f292e1bf244a35875921965cd6bb6dd93bb0241082ee3ebf32a0ed161c646941d2ff14e735c34f9cda2916a1e96e9f80b22d2c60195d45433c614157e330c900183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102f7775a8758c3725f763c0806ba1d52f74e6b312de69eaf6ed8cc0c7a88625c53","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"YEli8AZKyWEqGbRZlk9y2ifFR8cKW/Evuf8++cBsWkE=","hive":"\n=========================================================================\nThu Feb 28 18:02:46 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 604962\npopulation: 27 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 10 c034 d87b de4f ec3e | 35 e59a (0) ec08 (0) ec3e (0) f090 (0)\n001 7 1a93 10d5 12b8 0f03 | 14 33fe (0) 27c2 (0) 2293 (0) 2f1a (0)\n002 6 5b93 5bf6 4853 404b | 10 5b93 (0) 5b87 (0) 5bf6 (0) 55a2 (0)\n003 2 75bf 7a5c | 2 7a5c (0) 75bf (0)\n============ DEPTH: 4 ==========================================\n004 0 | 0\n005 0 | 0\n006 2 62c0 6271 | 2 6271 (0) 62c0 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"604962f0064ac9612a19b459964f72da27c547c70a5bf12fb9ff3ef9c06c5a41","private_key":"d43fc183927a1d97aee7b09b4977f66657a79a7132440f1085e72dac4f111b29","name":"node_604962f0064ac9612a19b459964f72da27c547c70a5bf12fb9ff3ef9c06c5a41","services":["streamer"],"enable_msg_events":true,"port":36711},"up":true}},{"node":{"info":{"id":"46afbd7b71e9f5578135ef57c6e9afaf1ede91425fd5807d6b257e47f93d830a","name":"node_46afbd7b71e9f5578135ef57c6e9afaf1ede91425fd5807d6b257e47f93d830a","enode":"enode://51afc950250580c6016fe6e1cc591b90a31257d89b57df0cee54184ed0fe09c1e5777398b9ea7cbf355e475dff29a8a57cf7af461f2544f09595281730b0421b@127.0.0.1:0","enr":"0xf88fb840c55fc03f59e481c9056bb420d743110b252edb232b677c6eded69cb1f9de070f214517d43e7bd121063ff69d83b53ef77f2cb60ea36ee3fd501c4ce5f941c5d00183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10351afc950250580c6016fe6e1cc591b90a31257d89b57df0cee54184ed0fe09c1","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"Rq+9e3Hp9VeBNe9Xxumvrx7ekUJf1YB9ayV+R/k9gwo=","hive":"\n=========================================================================\nThu Feb 28 18:02:46 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 46afbd\npopulation: 15 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 bbbc b269 c67d | 35 b269 (0) bbbc (0) be5d (0) bc3e (0)\n001 3 2293 27c2 33fe | 14 33fe (0) 27c2 (0) 2293 (0) 2f1a (0)\n002 2 7a5c 6049 | 5 7a5c (0) 75bf (0) 6271 (0) 62c0 (0)\n003 2 5b93 5b87 | 4 5b93 (0) 5b87 (0) 5bf6 (0) 55a2 (0)\n004 2 4e4e 4853 | 2 4853 (0) 4e4e (0)\n005 1 404b | 1 404b (0)\n============ DEPTH: 6 ==========================================\n006 2 4443 4541 | 2 4541 (0) 4443 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"46afbd7b71e9f5578135ef57c6e9afaf1ede91425fd5807d6b257e47f93d830a","private_key":"c83d6d9cc57a48d84d57d3c6bb8bea3f077d62d280265de50dcd32e06d248f03","name":"node_46afbd7b71e9f5578135ef57c6e9afaf1ede91425fd5807d6b257e47f93d830a","services":["streamer"],"enable_msg_events":true,"port":34261},"up":true}},{"node":{"info":{"id":"c67db282f89ee5c7fe33cceb6d606672c04f273f9247478f323c8227f709b72d","name":"node_c67db282f89ee5c7fe33cceb6d606672c04f273f9247478f323c8227f709b72d","enode":"enode://9f5e3ba7425458e07339268d779ab9edafb03e2b1b67169a1123d0c6082374c60f34ef62398c7fff491e9a586e010737c16cc6fee1c969b773e5d9036bb2d2d5@127.0.0.1:0","enr":"0xf88fb840331107dbd5f067ec688710841e8f2feb84a5139e0b4b8b5fc9e775a99353e7c160a1dfa9939df3d039103b453a571a574a36f7ba55ed3f64ea23917b4f1d48570183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1039f5e3ba7425458e07339268d779ab9edafb03e2b1b67169a1123d0c6082374c6","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"xn2ygvie5cf+M8zrbWBmcsBPJz+SR0ePMjyCJ/cJty0=","hive":"\n=========================================================================\nThu Feb 28 18:02:46 UTC 2019 KΛÐΞMLIΛ hive: queen's address: c67db2\npopulation: 16 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 27c2 33fe 46af | 29 33fe (0) 27c2 (0) 2293 (0) 2f1a (0)\n001 2 b269 8cb7 | 14 b269 (0) bbbc (0) be5d (0) bc3e (0)\n002 3 ec08 f1e1 f6f3 | 9 ec08 (0) ec3e (0) e59a (0) f090 (0)\n003 2 d165 dbef | 5 d165 (0) dbef (0) d87b (0) de4f (0)\n004 2 ce82 c851 | 2 c851 (0) ce82 (0)\n============ DEPTH: 5 ==========================================\n005 3 c05d c034 c34b | 3 c34b (0) c034 (0) c05d (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 1 c62e | 1 c62e (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"c67db282f89ee5c7fe33cceb6d606672c04f273f9247478f323c8227f709b72d","private_key":"c5f0dbfaf1bc89108010b5a6b4fdd44434a9c6f91328d5eadbbfa0108072ccb8","name":"node_c67db282f89ee5c7fe33cceb6d606672c04f273f9247478f323c8227f709b72d","services":["streamer"],"enable_msg_events":true,"port":36251},"up":true}},{"node":{"info":{"id":"8cb7da4ef2158d07c222c0f08dec7f9b58037623f465824b4119a9f25b31a005","name":"node_8cb7da4ef2158d07c222c0f08dec7f9b58037623f465824b4119a9f25b31a005","enode":"enode://de0a8da74b3df44a50a35257ac834a3fe752fa615fb7d9b39d2c716b9b5f7edc32874d826d50224f2e37fb1a07f7526070f08674414124367465abf02cbf5ff4@127.0.0.1:0","enr":"0xf88fb840189409bc37dbd9a8810613dce78f7b24e5c24579fe5ede271045352b0a50969802f6e75f3b631cb61f415fbb4a7a68e994cb620ba81be2ece91909c5f01e673f0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102de0a8da74b3df44a50a35257ac834a3fe752fa615fb7d9b39d2c716b9b5f7edc","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"jLfaTvIVjQfCIsDwjex/m1gDdiP0ZYJLQRmp8lsxoAU=","hive":"\n=========================================================================\nThu Feb 28 18:02:46 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 8cb7da\npopulation: 21 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 5b87 041c 0d7f 0e8f | 29 041c (0) 0d7f (0) 0e8f (0) 0f03 (0)\n001 9 e59a fef2 f1e1 c851 | 21 ec08 (0) ec3e (0) e59a (0) f090 (0)\n002 2 ab25 be5d | 8 b269 (0) bbbc (0) be5d (0) bc3e (0)\n003 3 9861 9637 9009 | 3 9861 (0) 9637 (0) 9009 (0)\n============ DEPTH: 4 ==========================================\n004 1 83aa | 1 83aa (0)\n005 1 8934 | 1 8934 (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"8cb7da4ef2158d07c222c0f08dec7f9b58037623f465824b4119a9f25b31a005","private_key":"6cb4589e98325b9101a5f706969483cdb93fe451d2fe83dcbec1e6fde1986836","name":"node_8cb7da4ef2158d07c222c0f08dec7f9b58037623f465824b4119a9f25b31a005","services":["streamer"],"enable_msg_events":true,"port":38013},"up":true}},{"node":{"info":{"id":"dd4811271007f90b64a51b758afc7ebc8c5af306cb6a1b88ccdc2cc88fd9684b","name":"node_dd4811271007f90b64a51b758afc7ebc8c5af306cb6a1b88ccdc2cc88fd9684b","enode":"enode://89555a99503427e59874c6cfce334350add1c85b4b935dad096d2755bb8bda4223becd8f73fc3bda4dc5239d7407dac529cf3f943d1129f29af26dc8c10b04d9@127.0.0.1:0","enr":"0xf88fb8402389226733f4287a4f18cdd6b9ca854dded27d7f7c9cdf1fe5f0ff2b60a3e75a1ea809d39554ccd2b2c97c0b8cff5ea61d51f91c69e821da8b45ed186c4833570183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10389555a99503427e59874c6cfce334350add1c85b4b935dad096d2755bb8bda42","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"3UgRJxAH+QtkpRt1ivx+vIxa8wbLahuIzNwsyI/ZaEs=","hive":"\n=========================================================================\nThu Feb 28 18:02:46 UTC 2019 KΛÐΞMLIΛ hive: queen's address: dd4811\npopulation: 15 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 0d7f 041c 2b80 | 29 041c (0) 0d7f (0) 0e8f (0) 0f03 (0)\n001 3 aeff ab25 8cb7 | 14 ab25 (0) aeff (0) adfd (0) a259 (0)\n002 3 ec3e ec08 f6f3 | 9 ec08 (0) ec3e (0) e59a (0) f090 (0)\n003 2 ce82 c851 | 7 c851 (0) ce82 (0) c34b (0) c034 (0)\n004 1 d165 | 1 d165 (0)\n============ DEPTH: 5 ==========================================\n005 2 d87b dbef | 2 dbef (0) d87b (0)\n006 1 de4f | 1 de4f (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"dd4811271007f90b64a51b758afc7ebc8c5af306cb6a1b88ccdc2cc88fd9684b","private_key":"4a8e7f4ee986a36520c7faff2f4957ba20b7db18fd59de5604f3889db1eb8dd9","name":"node_dd4811271007f90b64a51b758afc7ebc8c5af306cb6a1b88ccdc2cc88fd9684b","services":["streamer"],"enable_msg_events":true,"port":33135},"up":true}},{"node":{"info":{"id":"2b804f6d2a235441cf0b5b52a7fb2aa862c84510ed482f0a5aec92c4d89ab484","name":"node_2b804f6d2a235441cf0b5b52a7fb2aa862c84510ed482f0a5aec92c4d89ab484","enode":"enode://f6640b5930abb9a111010f89da0b40002e956167f60a2bd769b53430ab64bdce724abbd610813dc99a92fbe4e15cc33c164bb6ae05e965490ebd84c5cfecf306@127.0.0.1:0","enr":"0xf88fb840f9d875b3913769d2201f5c0a0b1dddddb9416184e14f986671f98b799fb7bc7c3b1853a972ca0dce95c27a7f6195e3f8fd87da8e9708d9ce4b224e940a2d319b0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102f6640b5930abb9a111010f89da0b40002e956167f60a2bd769b53430ab64bdce","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"K4BPbSojVEHPC1tSp/sqqGLIRRDtSC8KWuySxNiatIQ=","hive":"\n=========================================================================\nThu Feb 28 18:02:46 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 2b804f\npopulation: 13 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 9637 9861 dd48 | 35 9861 (0) 9637 (0) 9009 (0) 83aa (0)\n001 3 4443 5bf6 55a2 | 15 6049 (0) 6271 (0) 62c0 (0) 7a5c (0)\n002 2 041c 0f03 | 8 041c (0) 0d7f (0) 0e8f (0) 0f03 (0)\n003 1 33fe | 1 33fe (0)\n004 2 2293 27c2 | 2 27c2 (0) 2293 (0)\n============ DEPTH: 5 ==========================================\n005 1 2f1a | 1 2f1a (0)\n006 0 | 0\n007 0 | 0\n008 1 2b79 | 1 2b79 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"2b804f6d2a235441cf0b5b52a7fb2aa862c84510ed482f0a5aec92c4d89ab484","private_key":"482d8c479e055a2cd97d27a00578bfbe177ae0ca405f9b3a2a08e55ad11f0da8","name":"node_2b804f6d2a235441cf0b5b52a7fb2aa862c84510ed482f0a5aec92c4d89ab484","services":["streamer"],"enable_msg_events":true,"port":42125},"up":true}},{"node":{"info":{"id":"55a243b4bdf78ff2460533c521620b11b4ceaa67a3c96760e2a9facc6727f50f","name":"node_55a243b4bdf78ff2460533c521620b11b4ceaa67a3c96760e2a9facc6727f50f","enode":"enode://0e1f60835d710b5bce7825c96b4002cfe63ef0308ad175b5e4e4bcf6fbf5187d01c5b296ce5a87affae58239bbbd0d8bbd425a558e2d5eee41d6cddbea15b939@127.0.0.1:0","enr":"0xf88fb84058ce2d6dde0e4febc7e1b9b68901a2399228ed0dc3972db83041f6511414997e295b9340c70b1cb50884a5dd3f193a346b3aac3f8d2d860c2ef0066ad6315cbe0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1030e1f60835d710b5bce7825c96b4002cfe63ef0308ad175b5e4e4bcf6fbf5187d","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"VaJDtL33j/JGBTPFIWILEbTOqmejyWdg4qn6zGcn9Q8=","hive":"\n=========================================================================\nThu Feb 28 18:02:46 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 55a243\npopulation: 15 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 9637 9861 ce82 | 35 9861 (0) 9637 (0) 9009 (0) 83aa (0)\n001 3 0d7f 041c 2b80 | 14 041c (0) 0d7f (0) 0e8f (0) 0f03 (0)\n002 2 6271 62c0 | 5 6049 (0) 62c0 (0) 6271 (0) 7a5c (0)\n003 4 4853 404b 4541 4443 | 6 46af (0) 4541 (0) 4443 (0) 404b (0)\n============ DEPTH: 4 ==========================================\n004 3 5b87 5b93 5bf6 | 3 5b87 (0) 5b93 (0) 5bf6 (0)\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"55a243b4bdf78ff2460533c521620b11b4ceaa67a3c96760e2a9facc6727f50f","private_key":"22bc669edb33e88cc2edf332fe24eeb77672294a38ee9ad3fa4a1cc3a2b6c916","name":"node_55a243b4bdf78ff2460533c521620b11b4ceaa67a3c96760e2a9facc6727f50f","services":["streamer"],"enable_msg_events":true,"port":35969},"up":true}},{"node":{"info":{"id":"ce82b9805bfa59ef3f18b46d5e2d8c4513e133f86500df83b55e13331ae4298c","name":"node_ce82b9805bfa59ef3f18b46d5e2d8c4513e133f86500df83b55e13331ae4298c","enode":"enode://a7e3b7f8243c44f711eaa63305c75e94cc5c280f85bba57a8153591777c08edd2c46d54768f3e3be5682ceb74a4b7d51c3404faadcead2f9abf0fca9e08496d9@127.0.0.1:0","enr":"0xf88fb84089be519b3e126e4daefeb96ab3a6fad77d8957bcec90ad01848bdae2a1158d7b0625a8ca5453dbac3b83c87abe19b7ee6d9db1a0a469dd9455c871eddc751eef0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103a7e3b7f8243c44f711eaa63305c75e94cc5c280f85bba57a8153591777c08edd","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"zoK5gFv6We8/GLRtXi2MRRPhM/hlAN+DtV4TMxrkKYw=","hive":"\n=========================================================================\nThu Feb 28 18:02:46 UTC 2019 KΛÐΞMLIΛ hive: queen's address: ce82b9\npopulation: 21 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 1a93 4443 4853 55a2 | 29 33fe (0) 2293 (0) 27c2 (0) 2f1a (0)\n001 5 aeff 83aa 9861 9009 | 14 9861 (0) 9637 (0) 9009 (0) 83aa (0)\n002 4 f16d e59a ec3e ec08 | 9 e59a (0) ec3e (0) ec08 (0) f090 (0)\n003 2 d165 dd48 | 5 d165 (0) dbef (0) d87b (0) de4f (0)\n============ DEPTH: 4 ==========================================\n004 5 c62e c67d c34b c034 | 5 c34b (0) c034 (0) c05d (0) c67d (0)\n005 1 c851 | 1 c851 (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"ce82b9805bfa59ef3f18b46d5e2d8c4513e133f86500df83b55e13331ae4298c","private_key":"755137d90f904038ad62a2a3a4c884831de662050430fc5bc44c0e776122f890","name":"node_ce82b9805bfa59ef3f18b46d5e2d8c4513e133f86500df83b55e13331ae4298c","services":["streamer"],"enable_msg_events":true,"port":34417},"up":true}},{"node":{"info":{"id":"1a9310bc61505d08c458eaba0e7cd1b5c1e7a64e00fcba2034da1a17a2faa15c","name":"node_1a9310bc61505d08c458eaba0e7cd1b5c1e7a64e00fcba2034da1a17a2faa15c","enode":"enode://6441a0fb862b2ad19dca82baf54880795e459ccb977d3dec2f5945041080887d4e18924c1f76a70f0cc6aa5e516d4bff2813cba7fd94f9f5990af5d7ba081ba2@127.0.0.1:0","enr":"0xf88fb84089526e1437560f8885e8dec6fdcb7f89033526e82f59e94698507fa850c9e19a3fb9333403aa92eb996e936774dcf266d18fc8c2210f28637ab27102e7f5d0390183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1026441a0fb862b2ad19dca82baf54880795e459ccb977d3dec2f5945041080887d","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"GpMQvGFQXQjEWOq6DnzRtcHnpk4A/LogNNoaF6L6oVw=","hive":"\n=========================================================================\nThu Feb 28 18:02:46 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 1a9310\npopulation: 17 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 bc3e d165 c851 ce82 | 35 9861 (0) 9009 (0) 9637 (0) 83aa (0)\n001 3 6049 6271 62c0 | 15 6049 (0) 62c0 (0) 6271 (0) 75bf (0)\n002 3 2f1a 2293 33fe | 6 33fe (0) 2293 (0) 27c2 (0) 2f1a (0)\n003 4 041c 0e8f 0f03 0d7f | 4 041c (0) 0d7f (0) 0e8f (0) 0f03 (0)\n============ DEPTH: 4 ==========================================\n004 2 10d5 12b8 | 2 12b8 (0) 10d5 (0)\n005 1 1dd4 | 1 1dd4 (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"1a9310bc61505d08c458eaba0e7cd1b5c1e7a64e00fcba2034da1a17a2faa15c","private_key":"3d1bc8c36e5611d1524cba438ab612087f7fe9210a0ddb9f80b7bb94bebf28d0","name":"node_1a9310bc61505d08c458eaba0e7cd1b5c1e7a64e00fcba2034da1a17a2faa15c","services":["streamer"],"enable_msg_events":true,"port":38755},"up":true}},{"node":{"info":{"id":"bc3e07ee098badd739c4e9b965275f6fbf6331f76b692089604ac44025cf0bcc","name":"node_bc3e07ee098badd739c4e9b965275f6fbf6331f76b692089604ac44025cf0bcc","enode":"enode://c8fb04e5496759ed67612814155cdc9e564c33e6151e1328db3e3d733ef3be481febd2026453482338b6cf323c0293a196cc120abffb4ee215877ecce683dcea@127.0.0.1:0","enr":"0xf88fb8409592035288ec2ea45833c8d7fcd2795780db3698a74d8f87077300514fcd2205330b0bab53a6dfebdf54779337d6761e4bf024cc5038e4dd4a9f7941eb7d19570183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102c8fb04e5496759ed67612814155cdc9e564c33e6151e1328db3e3d733ef3be48","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"vD4H7gmLrdc5xOm5ZSdfb79jMfdraSCJYErEQCXPC8w=","hive":"\n=========================================================================\nThu Feb 28 18:02:46 UTC 2019 KΛÐΞMLIΛ hive: queen's address: bc3e07\npopulation: 13 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 6049 5b93 1a93 | 29 6049 (0) 62c0 (0) 6271 (0) 75bf (0)\n001 3 ec08 c034 de4f | 21 e59a (0) ec3e (0) ec08 (0) f1e1 (0)\n002 2 83aa 9009 | 6 9861 (0) 9009 (0) 9637 (0) 83aa (0)\n003 2 ab25 adfd | 4 aeff (0) adfd (0) ab25 (0) a259 (0)\n004 1 b269 | 1 b269 (0)\n============ DEPTH: 5 ==========================================\n005 1 bbbc | 1 bbbc (0)\n006 1 be5d | 1 be5d (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"bc3e07ee098badd739c4e9b965275f6fbf6331f76b692089604ac44025cf0bcc","private_key":"aedc9b1c86a50c21ebc168086896d03dc0ff1d2d366426a35678be1bb1f8cd46","name":"node_bc3e07ee098badd739c4e9b965275f6fbf6331f76b692089604ac44025cf0bcc","services":["streamer"],"enable_msg_events":true,"port":38905},"up":true}},{"node":{"info":{"id":"de4f168b7b670c1348d801db70d9a9e7fa44dd729030ba5c05df9623967c40b1","name":"node_de4f168b7b670c1348d801db70d9a9e7fa44dd729030ba5c05df9623967c40b1","enode":"enode://9f62e657f5258fdc9d473a088077877e003e1ad5e336214b8517cafa34581a7b83eeb731bdaeaee23b09a1739c0c1cbfc75fd0715b014baf301c3ce66dea9210@127.0.0.1:0","enr":"0xf88fb8403b3bfb23ac7a5fe81b2cac041477fe3f148ec11dce658a17042c6be5047af9766810b4b7d33d10350eef6ae57c979f6400cdb549c72f79b6d1938b73ed206c5a0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1029f62e657f5258fdc9d473a088077877e003e1ad5e336214b8517cafa34581a7b","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"3k8Wi3tnDBNI2AHbcNmp5/pE3XKQMLpcBd+WI5Z8QLE=","hive":"\n=========================================================================\nThu Feb 28 18:02:46 UTC 2019 KΛÐΞMLIΛ hive: queen's address: de4f16\npopulation: 14 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 6049 6271 62c0 | 29 6049 (0) 62c0 (0) 6271 (0) 75bf (0)\n001 2 9009 bc3e | 14 9861 (0) 9009 (0) 9637 (0) 83aa (0)\n002 3 ec3e e59a ff06 | 9 e59a (0) ec3e (0) ec08 (0) f1e1 (0)\n003 2 c034 c05d | 7 ce82 (0) c851 (0) c34b (0) c034 (0)\n004 1 d165 | 1 d165 (0)\n============ DEPTH: 5 ==========================================\n005 2 d87b dbef | 2 d87b (0) dbef (0)\n006 1 dd48 | 1 dd48 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"de4f168b7b670c1348d801db70d9a9e7fa44dd729030ba5c05df9623967c40b1","private_key":"56f97537df39cd2e28da49629a002972b36e5ac32df3a117fa710b9cabe52aa8","name":"node_de4f168b7b670c1348d801db70d9a9e7fa44dd729030ba5c05df9623967c40b1","services":["streamer"],"enable_msg_events":true,"port":46139},"up":true}},{"node":{"info":{"id":"ff06d6cc3521d20c0a9bcd779c872f576023c8eaafad7289864140b313a5c47b","name":"node_ff06d6cc3521d20c0a9bcd779c872f576023c8eaafad7289864140b313a5c47b","enode":"enode://cb17dde808303f1bbd012517614e105867070959f82e17c94a6af3d5ac085fb14656af8db156f67f5f64480d8221e11c6f8b172b785e6e9c57848833f437b8d8@127.0.0.1:0","enr":"0xf88fb840d2fed0376fa9577d9adabbeb81ace57c4cbf4073222b71a010f99d6b9c4228fc2ad8ec5bcefbfce0225b7f05d0e59e4b02c99cec57387ef602959f4b90d9ed820183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102cb17dde808303f1bbd012517614e105867070959f82e17c94a6af3d5ac085fb1","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"/wbWzDUh0gwKm813nIcvV2AjyOqvrXKJhkFAsxOlxHs=","hive":"\n=========================================================================\nThu Feb 28 18:02:46 UTC 2019 KΛÐΞMLIΛ hive: queen's address: ff06d6\npopulation: 15 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 404b 27c2 33fe | 29 6049 (0) 62c0 (0) 6271 (0) 75bf (0)\n001 2 9009 adfd | 14 9861 (0) 9009 (0) 9637 (0) 83aa (0)\n002 3 c034 d165 de4f | 12 ce82 (0) c851 (0) c34b (0) c05d (0)\n003 2 ec3e ec08 | 3 e59a (0) ec3e (0) ec08 (0)\n============ DEPTH: 4 ==========================================\n004 4 f6f3 f090 f1e1 f16d | 4 f1e1 (0) f16d (0) f090 (0) f6f3 (0)\n005 0 | 0\n006 0 | 0\n007 1 fef2 | 1 fef2 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"ff06d6cc3521d20c0a9bcd779c872f576023c8eaafad7289864140b313a5c47b","private_key":"a519551fcbce37d32e6dbc7b4489172d0fb096ebd57e6ee332422c809ae61862","name":"node_ff06d6cc3521d20c0a9bcd779c872f576023c8eaafad7289864140b313a5c47b","services":["streamer"],"enable_msg_events":true,"port":45295},"up":true}}],"conns":[{"one":"33fe6d6970690e8d9e2b08ff234cb1eaf336baa53b398511cd078dcce2c8b2da","other":"b2697a3f2de6ea0d13586a655463782509691d6f05d90f45fd08823e7eaf5a0b","up":true},{"one":"b2697a3f2de6ea0d13586a655463782509691d6f05d90f45fd08823e7eaf5a0b","other":"8934ee6bbfc9c912a5a5fb004eb3df0b65313e22e8ceb8dc3f3e13d10853228f","up":true},{"one":"8934ee6bbfc9c912a5a5fb004eb3df0b65313e22e8ceb8dc3f3e13d10853228f","other":"4443b3497092c9f200fe7d43c32a533f8fc9fa7129226e1e2c7fd5f7f27e1711","up":true},{"one":"4443b3497092c9f200fe7d43c32a533f8fc9fa7129226e1e2c7fd5f7f27e1711","other":"5bf6a2fe481412b1b20f0cc2325a1119fda9e34c4def3d1f4026a88dc0c992ac","up":true},{"one":"5bf6a2fe481412b1b20f0cc2325a1119fda9e34c4def3d1f4026a88dc0c992ac","other":"bbbccc0180fe2605be748daeabb1fc02e6c8870b37f371359f38ee114f09771f","up":true},{"one":"bbbccc0180fe2605be748daeabb1fc02e6c8870b37f371359f38ee114f09771f","other":"7a5c44693de20adc3c53b1302fb00aab32a46265abc7563bdba33f7e5c4f9d74","up":true},{"one":"7a5c44693de20adc3c53b1302fb00aab32a46265abc7563bdba33f7e5c4f9d74","other":"f6f318e25a24c449e727c60c610719aaa36d0baf826a3a4931ad684abf9bcbba","up":true},{"one":"f6f318e25a24c449e727c60c610719aaa36d0baf826a3a4931ad684abf9bcbba","other":"627105957aa0b587a9ba1b0f273fc19403b6955940e794a359ade89cd7d40dfb","up":true},{"one":"627105957aa0b587a9ba1b0f273fc19403b6955940e794a359ade89cd7d40dfb","other":"c62e4b2302cd62f578c8c647adc3a4affef6df65a5236302865db85897efc015","up":true},{"one":"c62e4b2302cd62f578c8c647adc3a4affef6df65a5236302865db85897efc015","other":"9637fa5ec80bd404a366fe86f7a89a573529833097c130114b3015754886545d","up":true},{"one":"9637fa5ec80bd404a366fe86f7a89a573529833097c130114b3015754886545d","other":"0f03a5bb51c3f599469cfe9e5da0a10b8d06ba501a89e180077a75f1c5971467","up":true},{"one":"0f03a5bb51c3f599469cfe9e5da0a10b8d06ba501a89e180077a75f1c5971467","other":"404b70c6ac72972cfd9e7cf115c7f043bd15d0e4b9a959bfc2924c722eb712f7","up":true},{"one":"404b70c6ac72972cfd9e7cf115c7f043bd15d0e4b9a959bfc2924c722eb712f7","other":"2f1a15c39bcb0e953f8c160933f69e3dda29b834575742c4f432eb384c5dd9df","up":true},{"one":"2f1a15c39bcb0e953f8c160933f69e3dda29b834575742c4f432eb384c5dd9df","other":"ab255c40e39ba8fd2fb439ff26d135aab3944fb9159e54370f4fe735906d0313","up":true},{"one":"ab255c40e39ba8fd2fb439ff26d135aab3944fb9159e54370f4fe735906d0313","other":"041c4a3f942536e67af087da305403e26a19e030dcf51473a597431753a2bec2","up":true},{"one":"041c4a3f942536e67af087da305403e26a19e030dcf51473a597431753a2bec2","other":"c0347196ec87f51f97229140b5d66015cfff2781cc1aff6d3e207c3fa3532732","up":true},{"one":"c0347196ec87f51f97229140b5d66015cfff2781cc1aff6d3e207c3fa3532732","other":"d16513f30d485d3175321c1a0aa5a525c115ae13c395f7fa3deb1cf4d1ec69bc","up":true},{"one":"d16513f30d485d3175321c1a0aa5a525c115ae13c395f7fa3deb1cf4d1ec69bc","other":"9861d7cab15fd77ce544aa046f9daf61af7f7c78da7f84c9d3bc1c19f9f2e071","up":true},{"one":"9861d7cab15fd77ce544aa046f9daf61af7f7c78da7f84c9d3bc1c19f9f2e071","other":"45411a7482cae50dd1dd8d90138a28c0dc61b04baa9592f927f9d415b0970a53","up":true},{"one":"45411a7482cae50dd1dd8d90138a28c0dc61b04baa9592f927f9d415b0970a53","other":"ec085243645c6e5fdbeffb137ccd119053bd655e76b1d9a6b5e0221183764e43","up":true},{"one":"ec085243645c6e5fdbeffb137ccd119053bd655e76b1d9a6b5e0221183764e43","other":"5b936341da709d11b34b6df007f38fff0396b785a14f94653aaf921d8e450a3f","up":true},{"one":"5b936341da709d11b34b6df007f38fff0396b785a14f94653aaf921d8e450a3f","other":"27c236583dff714a3000acafbfd3308566c81271f825eac8f4f0cff83a7ff127","up":true},{"one":"27c236583dff714a3000acafbfd3308566c81271f825eac8f4f0cff83a7ff127","other":"83aad5b97e1ea8c40537e5593de4810c7b35fab156053402dda758d6e9ea9055","up":true},{"one":"83aad5b97e1ea8c40537e5593de4810c7b35fab156053402dda758d6e9ea9055","other":"48534a538fd708c0e616cbdfa948596048b7daa77ef09dd69c1652a5f6d05efc","up":true},{"one":"48534a538fd708c0e616cbdfa948596048b7daa77ef09dd69c1652a5f6d05efc","other":"12b8769e0e996011ceff489a3f56ba8e555d545b69accb5b4396dead7335a8db","up":true},{"one":"12b8769e0e996011ceff489a3f56ba8e555d545b69accb5b4396dead7335a8db","other":"aeff88a5c749733707f99b876c1ecf7db71b32a6916cf9bbd266af3e69f94e82","up":true},{"one":"aeff88a5c749733707f99b876c1ecf7db71b32a6916cf9bbd266af3e69f94e82","other":"ec3e84f80ab71df09a44c79c8d4af8da68fdf3dd7dbce7451363b8aa16630493","up":true},{"one":"ec3e84f80ab71df09a44c79c8d4af8da68fdf3dd7dbce7451363b8aa16630493","other":"2293b1e9fb44ee6db39db9366291fc0b4e286c355547750de19e96c32e02bdf9","up":true},{"one":"2293b1e9fb44ee6db39db9366291fc0b4e286c355547750de19e96c32e02bdf9","other":"0e8fb3e25746a7f18f33e31c10200e5ec21eb54ad592bad5369b9b584fe80e1b","up":true},{"one":"0e8fb3e25746a7f18f33e31c10200e5ec21eb54ad592bad5369b9b584fe80e1b","other":"f16dc65b58a9fa5060674ca741531891fd44b63d9ac5eabea185745049e474ca","up":true},{"one":"f16dc65b58a9fa5060674ca741531891fd44b63d9ac5eabea185745049e474ca","other":"dbefd322e4f37f3e142ad151a08c8bd7784fb0db249324aff479f5b663212e76","up":true},{"one":"dbefd322e4f37f3e142ad151a08c8bd7784fb0db249324aff479f5b663212e76","other":"c34bd2e209fc11e27f81e1359545f28c816787127b41811dc1710fa4e53fcefa","up":true},{"one":"c34bd2e209fc11e27f81e1359545f28c816787127b41811dc1710fa4e53fcefa","other":"f090d909f94f6970d074948115e4f46e67e4fb5735f537889ed2b169ff2bd368","up":true},{"one":"f090d909f94f6970d074948115e4f46e67e4fb5735f537889ed2b169ff2bd368","other":"2b790fbca8da74c7de9715b4919ce03cdcf14a4608671cd4739b2b99a052e636","up":true},{"one":"2b790fbca8da74c7de9715b4919ce03cdcf14a4608671cd4739b2b99a052e636","other":"5b87478ce6f96988d572d249140ca6716f66aec8f6e0435e7f8be9fca5ed38a0","up":true},{"one":"5b87478ce6f96988d572d249140ca6716f66aec8f6e0435e7f8be9fca5ed38a0","other":"c8511f8896d3c4226d5d8c860096c6a90839fce500a77b8304395f5b4833b284","up":true},{"one":"c8511f8896d3c4226d5d8c860096c6a90839fce500a77b8304395f5b4833b284","other":"d87ba657576968058fcc86579c3f52aa78905909b0a943938af621c6ed99fbea","up":true},{"one":"d87ba657576968058fcc86579c3f52aa78905909b0a943938af621c6ed99fbea","other":"f1e151beef0c2259669ac950125aa004b02ba7078bf2d87248a4b7d25c62585e","up":true},{"one":"f1e151beef0c2259669ac950125aa004b02ba7078bf2d87248a4b7d25c62585e","other":"10d579523acbad30e3e50d610f0d3291f7518486773c8d9404856bf1349128bf","up":true},{"one":"10d579523acbad30e3e50d610f0d3291f7518486773c8d9404856bf1349128bf","other":"fef27a360408179eafd514dfc71016f3df085bcb2e83bbdeb5fb9e5cd1935696","up":true},{"one":"fef27a360408179eafd514dfc71016f3df085bcb2e83bbdeb5fb9e5cd1935696","other":"c05d9d9199c1b1bf84af4b8869b36920382f0350d58dd5100700cd0d27f165ab","up":true},{"one":"c05d9d9199c1b1bf84af4b8869b36920382f0350d58dd5100700cd0d27f165ab","other":"be5da0eb4bc76c0ca3a63423568dbfa24d385499945b068308a2874ed4243eb3","up":true},{"one":"be5da0eb4bc76c0ca3a63423568dbfa24d385499945b068308a2874ed4243eb3","other":"4e4ed5f90dc5399e3362d2691cb5587af8627ae542c524e2f2a129428b91a89b","up":true},{"one":"4e4ed5f90dc5399e3362d2691cb5587af8627ae542c524e2f2a129428b91a89b","other":"0d7f4a662acc72d2fed999e13880cd1070d7bb868a92ee343a52dcf84cf06395","up":true},{"one":"0d7f4a662acc72d2fed999e13880cd1070d7bb868a92ee343a52dcf84cf06395","other":"adfd2641d8e57ade2e6b802cbeb0c0b7336430a67d1d1f3abc5152b4df066b91","up":true},{"one":"adfd2641d8e57ade2e6b802cbeb0c0b7336430a67d1d1f3abc5152b4df066b91","other":"9009cef32b9cc42e97b812ba3a35b977da5d373990bb9521a516df9466401d5d","up":true},{"one":"9009cef32b9cc42e97b812ba3a35b977da5d373990bb9521a516df9466401d5d","other":"62c09690dd71784e06b438d7c56256e1097c05fe7eb83b90fe5b0277a4b88568","up":true},{"one":"62c09690dd71784e06b438d7c56256e1097c05fe7eb83b90fe5b0277a4b88568","other":"e59a74b65709cd9e76d4d531d078a8a3055061eddc4d515affbfc0f99cae22ac","up":true},{"one":"e59a74b65709cd9e76d4d531d078a8a3055061eddc4d515affbfc0f99cae22ac","other":"1dd4c2c8dac646526b1afd187f326712da75ed7a717668bfc89c7703a964d480","up":true},{"one":"1dd4c2c8dac646526b1afd187f326712da75ed7a717668bfc89c7703a964d480","other":"75bf881b6acbf512f2abcf42e5d86ac32e5dd849e7a416e39275979a2b6bf43a","up":true},{"one":"75bf881b6acbf512f2abcf42e5d86ac32e5dd849e7a416e39275979a2b6bf43a","other":"a25904f98c73a09a37034f579d86413fe31fd9a052a03d74266760d4ea73b8e9","up":true},{"one":"a25904f98c73a09a37034f579d86413fe31fd9a052a03d74266760d4ea73b8e9","other":"604962f0064ac9612a19b459964f72da27c547c70a5bf12fb9ff3ef9c06c5a41","up":true},{"one":"604962f0064ac9612a19b459964f72da27c547c70a5bf12fb9ff3ef9c06c5a41","other":"46afbd7b71e9f5578135ef57c6e9afaf1ede91425fd5807d6b257e47f93d830a","up":true},{"one":"46afbd7b71e9f5578135ef57c6e9afaf1ede91425fd5807d6b257e47f93d830a","other":"c67db282f89ee5c7fe33cceb6d606672c04f273f9247478f323c8227f709b72d","up":true},{"one":"c67db282f89ee5c7fe33cceb6d606672c04f273f9247478f323c8227f709b72d","other":"8cb7da4ef2158d07c222c0f08dec7f9b58037623f465824b4119a9f25b31a005","up":true},{"one":"8cb7da4ef2158d07c222c0f08dec7f9b58037623f465824b4119a9f25b31a005","other":"dd4811271007f90b64a51b758afc7ebc8c5af306cb6a1b88ccdc2cc88fd9684b","up":true},{"one":"dd4811271007f90b64a51b758afc7ebc8c5af306cb6a1b88ccdc2cc88fd9684b","other":"2b804f6d2a235441cf0b5b52a7fb2aa862c84510ed482f0a5aec92c4d89ab484","up":true},{"one":"2b804f6d2a235441cf0b5b52a7fb2aa862c84510ed482f0a5aec92c4d89ab484","other":"55a243b4bdf78ff2460533c521620b11b4ceaa67a3c96760e2a9facc6727f50f","up":true},{"one":"55a243b4bdf78ff2460533c521620b11b4ceaa67a3c96760e2a9facc6727f50f","other":"ce82b9805bfa59ef3f18b46d5e2d8c4513e133f86500df83b55e13331ae4298c","up":true},{"one":"ce82b9805bfa59ef3f18b46d5e2d8c4513e133f86500df83b55e13331ae4298c","other":"1a9310bc61505d08c458eaba0e7cd1b5c1e7a64e00fcba2034da1a17a2faa15c","up":true},{"one":"1a9310bc61505d08c458eaba0e7cd1b5c1e7a64e00fcba2034da1a17a2faa15c","other":"bc3e07ee098badd739c4e9b965275f6fbf6331f76b692089604ac44025cf0bcc","up":true},{"one":"bc3e07ee098badd739c4e9b965275f6fbf6331f76b692089604ac44025cf0bcc","other":"de4f168b7b670c1348d801db70d9a9e7fa44dd729030ba5c05df9623967c40b1","up":true},{"one":"de4f168b7b670c1348d801db70d9a9e7fa44dd729030ba5c05df9623967c40b1","other":"ff06d6cc3521d20c0a9bcd779c872f576023c8eaafad7289864140b313a5c47b","up":true},{"one":"ff06d6cc3521d20c0a9bcd779c872f576023c8eaafad7289864140b313a5c47b","other":"33fe6d6970690e8d9e2b08ff234cb1eaf336baa53b398511cd078dcce2c8b2da","up":true},{"one":"33fe6d6970690e8d9e2b08ff234cb1eaf336baa53b398511cd078dcce2c8b2da","other":"627105957aa0b587a9ba1b0f273fc19403b6955940e794a359ade89cd7d40dfb","up":true},{"one":"7a5c44693de20adc3c53b1302fb00aab32a46265abc7563bdba33f7e5c4f9d74","other":"27c236583dff714a3000acafbfd3308566c81271f825eac8f4f0cff83a7ff127","up":true},{"one":"d16513f30d485d3175321c1a0aa5a525c115ae13c395f7fa3deb1cf4d1ec69bc","other":"bbbccc0180fe2605be748daeabb1fc02e6c8870b37f371359f38ee114f09771f","up":true},{"one":"8934ee6bbfc9c912a5a5fb004eb3df0b65313e22e8ceb8dc3f3e13d10853228f","other":"c62e4b2302cd62f578c8c647adc3a4affef6df65a5236302865db85897efc015","up":true},{"one":"627105957aa0b587a9ba1b0f273fc19403b6955940e794a359ade89cd7d40dfb","other":"27c236583dff714a3000acafbfd3308566c81271f825eac8f4f0cff83a7ff127","up":true},{"one":"c62e4b2302cd62f578c8c647adc3a4affef6df65a5236302865db85897efc015","other":"ec085243645c6e5fdbeffb137ccd119053bd655e76b1d9a6b5e0221183764e43","up":true},{"one":"9637fa5ec80bd404a366fe86f7a89a573529833097c130114b3015754886545d","other":"bbbccc0180fe2605be748daeabb1fc02e6c8870b37f371359f38ee114f09771f","up":true},{"one":"b2697a3f2de6ea0d13586a655463782509691d6f05d90f45fd08823e7eaf5a0b","other":"c62e4b2302cd62f578c8c647adc3a4affef6df65a5236302865db85897efc015","up":true},{"one":"ab255c40e39ba8fd2fb439ff26d135aab3944fb9159e54370f4fe735906d0313","other":"f090d909f94f6970d074948115e4f46e67e4fb5735f537889ed2b169ff2bd368","up":true},{"one":"0f03a5bb51c3f599469cfe9e5da0a10b8d06ba501a89e180077a75f1c5971467","other":"2293b1e9fb44ee6db39db9366291fc0b4e286c355547750de19e96c32e02bdf9","up":true},{"one":"ab255c40e39ba8fd2fb439ff26d135aab3944fb9159e54370f4fe735906d0313","other":"f6f318e25a24c449e727c60c610719aaa36d0baf826a3a4931ad684abf9bcbba","up":true},{"one":"5bf6a2fe481412b1b20f0cc2325a1119fda9e34c4def3d1f4026a88dc0c992ac","other":"2b804f6d2a235441cf0b5b52a7fb2aa862c84510ed482f0a5aec92c4d89ab484","up":true},{"one":"404b70c6ac72972cfd9e7cf115c7f043bd15d0e4b9a959bfc2924c722eb712f7","other":"ff06d6cc3521d20c0a9bcd779c872f576023c8eaafad7289864140b313a5c47b","up":true},{"one":"4443b3497092c9f200fe7d43c32a533f8fc9fa7129226e1e2c7fd5f7f27e1711","other":"2b804f6d2a235441cf0b5b52a7fb2aa862c84510ed482f0a5aec92c4d89ab484","up":true},{"one":"2f1a15c39bcb0e953f8c160933f69e3dda29b834575742c4f432eb384c5dd9df","other":"12b8769e0e996011ceff489a3f56ba8e555d545b69accb5b4396dead7335a8db","up":true},{"one":"ec085243645c6e5fdbeffb137ccd119053bd655e76b1d9a6b5e0221183764e43","other":"bbbccc0180fe2605be748daeabb1fc02e6c8870b37f371359f38ee114f09771f","up":true},{"one":"aeff88a5c749733707f99b876c1ecf7db71b32a6916cf9bbd266af3e69f94e82","other":"9861d7cab15fd77ce544aa046f9daf61af7f7c78da7f84c9d3bc1c19f9f2e071","up":true},{"one":"041c4a3f942536e67af087da305403e26a19e030dcf51473a597431753a2bec2","other":"7a5c44693de20adc3c53b1302fb00aab32a46265abc7563bdba33f7e5c4f9d74","up":true},{"one":"5b936341da709d11b34b6df007f38fff0396b785a14f94653aaf921d8e450a3f","other":"7a5c44693de20adc3c53b1302fb00aab32a46265abc7563bdba33f7e5c4f9d74","up":true},{"one":"ec3e84f80ab71df09a44c79c8d4af8da68fdf3dd7dbce7451363b8aa16630493","other":"c8511f8896d3c4226d5d8c860096c6a90839fce500a77b8304395f5b4833b284","up":true},{"one":"12b8769e0e996011ceff489a3f56ba8e555d545b69accb5b4396dead7335a8db","other":"2b790fbca8da74c7de9715b4919ce03cdcf14a4608671cd4739b2b99a052e636","up":true},{"one":"d16513f30d485d3175321c1a0aa5a525c115ae13c395f7fa3deb1cf4d1ec69bc","other":"12b8769e0e996011ceff489a3f56ba8e555d545b69accb5b4396dead7335a8db","up":true},{"one":"2293b1e9fb44ee6db39db9366291fc0b4e286c355547750de19e96c32e02bdf9","other":"5b936341da709d11b34b6df007f38fff0396b785a14f94653aaf921d8e450a3f","up":true},{"one":"83aad5b97e1ea8c40537e5593de4810c7b35fab156053402dda758d6e9ea9055","other":"c8511f8896d3c4226d5d8c860096c6a90839fce500a77b8304395f5b4833b284","up":true},{"one":"45411a7482cae50dd1dd8d90138a28c0dc61b04baa9592f927f9d415b0970a53","other":"0e8fb3e25746a7f18f33e31c10200e5ec21eb54ad592bad5369b9b584fe80e1b","up":true},{"one":"c0347196ec87f51f97229140b5d66015cfff2781cc1aff6d3e207c3fa3532732","other":"bbbccc0180fe2605be748daeabb1fc02e6c8870b37f371359f38ee114f09771f","up":true},{"one":"f090d909f94f6970d074948115e4f46e67e4fb5735f537889ed2b169ff2bd368","other":"9861d7cab15fd77ce544aa046f9daf61af7f7c78da7f84c9d3bc1c19f9f2e071","up":true},{"one":"c34bd2e209fc11e27f81e1359545f28c816787127b41811dc1710fa4e53fcefa","other":"62c09690dd71784e06b438d7c56256e1097c05fe7eb83b90fe5b0277a4b88568","up":true},{"one":"5b936341da709d11b34b6df007f38fff0396b785a14f94653aaf921d8e450a3f","other":"0e8fb3e25746a7f18f33e31c10200e5ec21eb54ad592bad5369b9b584fe80e1b","up":true},{"one":"2b804f6d2a235441cf0b5b52a7fb2aa862c84510ed482f0a5aec92c4d89ab484","other":"0f03a5bb51c3f599469cfe9e5da0a10b8d06ba501a89e180077a75f1c5971467","up":true},{"one":"dbefd322e4f37f3e142ad151a08c8bd7784fb0db249324aff479f5b663212e76","other":"62c09690dd71784e06b438d7c56256e1097c05fe7eb83b90fe5b0277a4b88568","up":true},{"one":"27c236583dff714a3000acafbfd3308566c81271f825eac8f4f0cff83a7ff127","other":"0f03a5bb51c3f599469cfe9e5da0a10b8d06ba501a89e180077a75f1c5971467","up":true},{"one":"48534a538fd708c0e616cbdfa948596048b7daa77ef09dd69c1652a5f6d05efc","other":"5b87478ce6f96988d572d249140ca6716f66aec8f6e0435e7f8be9fca5ed38a0","up":true},{"one":"0d7f4a662acc72d2fed999e13880cd1070d7bb868a92ee343a52dcf84cf06395","other":"2293b1e9fb44ee6db39db9366291fc0b4e286c355547750de19e96c32e02bdf9","up":true},{"one":"f16dc65b58a9fa5060674ca741531891fd44b63d9ac5eabea185745049e474ca","other":"9861d7cab15fd77ce544aa046f9daf61af7f7c78da7f84c9d3bc1c19f9f2e071","up":true},{"one":"adfd2641d8e57ade2e6b802cbeb0c0b7336430a67d1d1f3abc5152b4df066b91","other":"ff06d6cc3521d20c0a9bcd779c872f576023c8eaafad7289864140b313a5c47b","up":true},{"one":"d87ba657576968058fcc86579c3f52aa78905909b0a943938af621c6ed99fbea","other":"75bf881b6acbf512f2abcf42e5d86ac32e5dd849e7a416e39275979a2b6bf43a","up":true},{"one":"9861d7cab15fd77ce544aa046f9daf61af7f7c78da7f84c9d3bc1c19f9f2e071","other":"bbbccc0180fe2605be748daeabb1fc02e6c8870b37f371359f38ee114f09771f","up":true},{"one":"f1e151beef0c2259669ac950125aa004b02ba7078bf2d87248a4b7d25c62585e","other":"8cb7da4ef2158d07c222c0f08dec7f9b58037623f465824b4119a9f25b31a005","up":true},{"one":"fef27a360408179eafd514dfc71016f3df085bcb2e83bbdeb5fb9e5cd1935696","other":"8cb7da4ef2158d07c222c0f08dec7f9b58037623f465824b4119a9f25b31a005","up":true},{"one":"c05d9d9199c1b1bf84af4b8869b36920382f0350d58dd5100700cd0d27f165ab","other":"2293b1e9fb44ee6db39db9366291fc0b4e286c355547750de19e96c32e02bdf9","up":true},{"one":"10d579523acbad30e3e50d610f0d3291f7518486773c8d9404856bf1349128bf","other":"75bf881b6acbf512f2abcf42e5d86ac32e5dd849e7a416e39275979a2b6bf43a","up":true},{"one":"62c09690dd71784e06b438d7c56256e1097c05fe7eb83b90fe5b0277a4b88568","other":"33fe6d6970690e8d9e2b08ff234cb1eaf336baa53b398511cd078dcce2c8b2da","up":true},{"one":"9009cef32b9cc42e97b812ba3a35b977da5d373990bb9521a516df9466401d5d","other":"de4f168b7b670c1348d801db70d9a9e7fa44dd729030ba5c05df9623967c40b1","up":true},{"one":"dd4811271007f90b64a51b758afc7ebc8c5af306cb6a1b88ccdc2cc88fd9684b","other":"f6f318e25a24c449e727c60c610719aaa36d0baf826a3a4931ad684abf9bcbba","up":true},{"one":"de4f168b7b670c1348d801db70d9a9e7fa44dd729030ba5c05df9623967c40b1","other":"62c09690dd71784e06b438d7c56256e1097c05fe7eb83b90fe5b0277a4b88568","up":true},{"one":"bc3e07ee098badd739c4e9b965275f6fbf6331f76b692089604ac44025cf0bcc","other":"9009cef32b9cc42e97b812ba3a35b977da5d373990bb9521a516df9466401d5d","up":true},{"one":"4e4ed5f90dc5399e3362d2691cb5587af8627ae542c524e2f2a129428b91a89b","other":"75bf881b6acbf512f2abcf42e5d86ac32e5dd849e7a416e39275979a2b6bf43a","up":true},{"one":"c8511f8896d3c4226d5d8c860096c6a90839fce500a77b8304395f5b4833b284","other":"8cb7da4ef2158d07c222c0f08dec7f9b58037623f465824b4119a9f25b31a005","up":true},{"one":"1a9310bc61505d08c458eaba0e7cd1b5c1e7a64e00fcba2034da1a17a2faa15c","other":"62c09690dd71784e06b438d7c56256e1097c05fe7eb83b90fe5b0277a4b88568","up":true},{"one":"2b790fbca8da74c7de9715b4919ce03cdcf14a4608671cd4739b2b99a052e636","other":"0d7f4a662acc72d2fed999e13880cd1070d7bb868a92ee343a52dcf84cf06395","up":true},{"one":"ff06d6cc3521d20c0a9bcd779c872f576023c8eaafad7289864140b313a5c47b","other":"9009cef32b9cc42e97b812ba3a35b977da5d373990bb9521a516df9466401d5d","up":true},{"one":"55a243b4bdf78ff2460533c521620b11b4ceaa67a3c96760e2a9facc6727f50f","other":"62c09690dd71784e06b438d7c56256e1097c05fe7eb83b90fe5b0277a4b88568","up":true},{"one":"be5da0eb4bc76c0ca3a63423568dbfa24d385499945b068308a2874ed4243eb3","other":"8cb7da4ef2158d07c222c0f08dec7f9b58037623f465824b4119a9f25b31a005","up":true},{"one":"5b87478ce6f96988d572d249140ca6716f66aec8f6e0435e7f8be9fca5ed38a0","other":"75bf881b6acbf512f2abcf42e5d86ac32e5dd849e7a416e39275979a2b6bf43a","up":true},{"one":"604962f0064ac9612a19b459964f72da27c547c70a5bf12fb9ff3ef9c06c5a41","other":"33fe6d6970690e8d9e2b08ff234cb1eaf336baa53b398511cd078dcce2c8b2da","up":true},{"one":"46afbd7b71e9f5578135ef57c6e9afaf1ede91425fd5807d6b257e47f93d830a","other":"33fe6d6970690e8d9e2b08ff234cb1eaf336baa53b398511cd078dcce2c8b2da","up":true},{"one":"a25904f98c73a09a37034f579d86413fe31fd9a052a03d74266760d4ea73b8e9","other":"f6f318e25a24c449e727c60c610719aaa36d0baf826a3a4931ad684abf9bcbba","up":true},{"one":"75bf881b6acbf512f2abcf42e5d86ac32e5dd849e7a416e39275979a2b6bf43a","other":"5bf6a2fe481412b1b20f0cc2325a1119fda9e34c4def3d1f4026a88dc0c992ac","up":true},{"one":"c67db282f89ee5c7fe33cceb6d606672c04f273f9247478f323c8227f709b72d","other":"f6f318e25a24c449e727c60c610719aaa36d0baf826a3a4931ad684abf9bcbba","up":true},{"one":"8cb7da4ef2158d07c222c0f08dec7f9b58037623f465824b4119a9f25b31a005","other":"0f03a5bb51c3f599469cfe9e5da0a10b8d06ba501a89e180077a75f1c5971467","up":true},{"one":"ce82b9805bfa59ef3f18b46d5e2d8c4513e133f86500df83b55e13331ae4298c","other":"9637fa5ec80bd404a366fe86f7a89a573529833097c130114b3015754886545d","up":true},{"one":"1dd4c2c8dac646526b1afd187f326712da75ed7a717668bfc89c7703a964d480","other":"33fe6d6970690e8d9e2b08ff234cb1eaf336baa53b398511cd078dcce2c8b2da","up":true},{"one":"e59a74b65709cd9e76d4d531d078a8a3055061eddc4d515affbfc0f99cae22ac","other":"8cb7da4ef2158d07c222c0f08dec7f9b58037623f465824b4119a9f25b31a005","up":true},{"one":"e59a74b65709cd9e76d4d531d078a8a3055061eddc4d515affbfc0f99cae22ac","other":"dbefd322e4f37f3e142ad151a08c8bd7784fb0db249324aff479f5b663212e76","up":true},{"one":"404b70c6ac72972cfd9e7cf115c7f043bd15d0e4b9a959bfc2924c722eb712f7","other":"5b936341da709d11b34b6df007f38fff0396b785a14f94653aaf921d8e450a3f","up":true},{"one":"83aad5b97e1ea8c40537e5593de4810c7b35fab156053402dda758d6e9ea9055","other":"b2697a3f2de6ea0d13586a655463782509691d6f05d90f45fd08823e7eaf5a0b","up":true},{"one":"c05d9d9199c1b1bf84af4b8869b36920382f0350d58dd5100700cd0d27f165ab","other":"de4f168b7b670c1348d801db70d9a9e7fa44dd729030ba5c05df9623967c40b1","up":true},{"one":"ab255c40e39ba8fd2fb439ff26d135aab3944fb9159e54370f4fe735906d0313","other":"8934ee6bbfc9c912a5a5fb004eb3df0b65313e22e8ceb8dc3f3e13d10853228f","up":true},{"one":"83aad5b97e1ea8c40537e5593de4810c7b35fab156053402dda758d6e9ea9055","other":"d87ba657576968058fcc86579c3f52aa78905909b0a943938af621c6ed99fbea","up":true},{"one":"dbefd322e4f37f3e142ad151a08c8bd7784fb0db249324aff479f5b663212e76","other":"8934ee6bbfc9c912a5a5fb004eb3df0b65313e22e8ceb8dc3f3e13d10853228f","up":true},{"one":"adfd2641d8e57ade2e6b802cbeb0c0b7336430a67d1d1f3abc5152b4df066b91","other":"b2697a3f2de6ea0d13586a655463782509691d6f05d90f45fd08823e7eaf5a0b","up":true},{"one":"c34bd2e209fc11e27f81e1359545f28c816787127b41811dc1710fa4e53fcefa","other":"8934ee6bbfc9c912a5a5fb004eb3df0b65313e22e8ceb8dc3f3e13d10853228f","up":true},{"one":"041c4a3f942536e67af087da305403e26a19e030dcf51473a597431753a2bec2","other":"33fe6d6970690e8d9e2b08ff234cb1eaf336baa53b398511cd078dcce2c8b2da","up":true},{"one":"2f1a15c39bcb0e953f8c160933f69e3dda29b834575742c4f432eb384c5dd9df","other":"33fe6d6970690e8d9e2b08ff234cb1eaf336baa53b398511cd078dcce2c8b2da","up":true},{"one":"be5da0eb4bc76c0ca3a63423568dbfa24d385499945b068308a2874ed4243eb3","other":"a25904f98c73a09a37034f579d86413fe31fd9a052a03d74266760d4ea73b8e9","up":true},{"one":"c8511f8896d3c4226d5d8c860096c6a90839fce500a77b8304395f5b4833b284","other":"c67db282f89ee5c7fe33cceb6d606672c04f273f9247478f323c8227f709b72d","up":true},{"one":"1dd4c2c8dac646526b1afd187f326712da75ed7a717668bfc89c7703a964d480","other":"12b8769e0e996011ceff489a3f56ba8e555d545b69accb5b4396dead7335a8db","up":true},{"one":"45411a7482cae50dd1dd8d90138a28c0dc61b04baa9592f927f9d415b0970a53","other":"62c09690dd71784e06b438d7c56256e1097c05fe7eb83b90fe5b0277a4b88568","up":true},{"one":"aeff88a5c749733707f99b876c1ecf7db71b32a6916cf9bbd266af3e69f94e82","other":"b2697a3f2de6ea0d13586a655463782509691d6f05d90f45fd08823e7eaf5a0b","up":true},{"one":"2f1a15c39bcb0e953f8c160933f69e3dda29b834575742c4f432eb384c5dd9df","other":"2293b1e9fb44ee6db39db9366291fc0b4e286c355547750de19e96c32e02bdf9","up":true},{"one":"2b790fbca8da74c7de9715b4919ce03cdcf14a4608671cd4739b2b99a052e636","other":"33fe6d6970690e8d9e2b08ff234cb1eaf336baa53b398511cd078dcce2c8b2da","up":true},{"one":"0d7f4a662acc72d2fed999e13880cd1070d7bb868a92ee343a52dcf84cf06395","other":"12b8769e0e996011ceff489a3f56ba8e555d545b69accb5b4396dead7335a8db","up":true},{"one":"48534a538fd708c0e616cbdfa948596048b7daa77ef09dd69c1652a5f6d05efc","other":"604962f0064ac9612a19b459964f72da27c547c70a5bf12fb9ff3ef9c06c5a41","up":true},{"one":"4e4ed5f90dc5399e3362d2691cb5587af8627ae542c524e2f2a129428b91a89b","other":"5b936341da709d11b34b6df007f38fff0396b785a14f94653aaf921d8e450a3f","up":true},{"one":"0e8fb3e25746a7f18f33e31c10200e5ec21eb54ad592bad5369b9b584fe80e1b","other":"1dd4c2c8dac646526b1afd187f326712da75ed7a717668bfc89c7703a964d480","up":true},{"one":"b2697a3f2de6ea0d13586a655463782509691d6f05d90f45fd08823e7eaf5a0b","other":"a25904f98c73a09a37034f579d86413fe31fd9a052a03d74266760d4ea73b8e9","up":true},{"one":"10d579523acbad30e3e50d610f0d3291f7518486773c8d9404856bf1349128bf","other":"27c236583dff714a3000acafbfd3308566c81271f825eac8f4f0cff83a7ff127","up":true},{"one":"fef27a360408179eafd514dfc71016f3df085bcb2e83bbdeb5fb9e5cd1935696","other":"ec3e84f80ab71df09a44c79c8d4af8da68fdf3dd7dbce7451363b8aa16630493","up":true},{"one":"ec085243645c6e5fdbeffb137ccd119053bd655e76b1d9a6b5e0221183764e43","other":"ff06d6cc3521d20c0a9bcd779c872f576023c8eaafad7289864140b313a5c47b","up":true},{"one":"f090d909f94f6970d074948115e4f46e67e4fb5735f537889ed2b169ff2bd368","other":"ec3e84f80ab71df09a44c79c8d4af8da68fdf3dd7dbce7451363b8aa16630493","up":true},{"one":"f1e151beef0c2259669ac950125aa004b02ba7078bf2d87248a4b7d25c62585e","other":"ec085243645c6e5fdbeffb137ccd119053bd655e76b1d9a6b5e0221183764e43","up":true},{"one":"9637fa5ec80bd404a366fe86f7a89a573529833097c130114b3015754886545d","other":"8cb7da4ef2158d07c222c0f08dec7f9b58037623f465824b4119a9f25b31a005","up":true},{"one":"5bf6a2fe481412b1b20f0cc2325a1119fda9e34c4def3d1f4026a88dc0c992ac","other":"55a243b4bdf78ff2460533c521620b11b4ceaa67a3c96760e2a9facc6727f50f","up":true},{"one":"604962f0064ac9612a19b459964f72da27c547c70a5bf12fb9ff3ef9c06c5a41","other":"7a5c44693de20adc3c53b1302fb00aab32a46265abc7563bdba33f7e5c4f9d74","up":true},{"one":"dbefd322e4f37f3e142ad151a08c8bd7784fb0db249324aff479f5b663212e76","other":"c62e4b2302cd62f578c8c647adc3a4affef6df65a5236302865db85897efc015","up":true},{"one":"dbefd322e4f37f3e142ad151a08c8bd7784fb0db249324aff479f5b663212e76","other":"c67db282f89ee5c7fe33cceb6d606672c04f273f9247478f323c8227f709b72d","up":true},{"one":"a25904f98c73a09a37034f579d86413fe31fd9a052a03d74266760d4ea73b8e9","other":"9861d7cab15fd77ce544aa046f9daf61af7f7c78da7f84c9d3bc1c19f9f2e071","up":true},{"one":"404b70c6ac72972cfd9e7cf115c7f043bd15d0e4b9a959bfc2924c722eb712f7","other":"604962f0064ac9612a19b459964f72da27c547c70a5bf12fb9ff3ef9c06c5a41","up":true},{"one":"5b87478ce6f96988d572d249140ca6716f66aec8f6e0435e7f8be9fca5ed38a0","other":"5b936341da709d11b34b6df007f38fff0396b785a14f94653aaf921d8e450a3f","up":true},{"one":"9009cef32b9cc42e97b812ba3a35b977da5d373990bb9521a516df9466401d5d","other":"8cb7da4ef2158d07c222c0f08dec7f9b58037623f465824b4119a9f25b31a005","up":true},{"one":"4443b3497092c9f200fe7d43c32a533f8fc9fa7129226e1e2c7fd5f7f27e1711","other":"62c09690dd71784e06b438d7c56256e1097c05fe7eb83b90fe5b0277a4b88568","up":true},{"one":"bc3e07ee098badd739c4e9b965275f6fbf6331f76b692089604ac44025cf0bcc","other":"adfd2641d8e57ade2e6b802cbeb0c0b7336430a67d1d1f3abc5152b4df066b91","up":true},{"one":"dd4811271007f90b64a51b758afc7ebc8c5af306cb6a1b88ccdc2cc88fd9684b","other":"c8511f8896d3c4226d5d8c860096c6a90839fce500a77b8304395f5b4833b284","up":true},{"one":"627105957aa0b587a9ba1b0f273fc19403b6955940e794a359ade89cd7d40dfb","other":"5b87478ce6f96988d572d249140ca6716f66aec8f6e0435e7f8be9fca5ed38a0","up":true},{"one":"46afbd7b71e9f5578135ef57c6e9afaf1ede91425fd5807d6b257e47f93d830a","other":"5b87478ce6f96988d572d249140ca6716f66aec8f6e0435e7f8be9fca5ed38a0","up":true},{"one":"aeff88a5c749733707f99b876c1ecf7db71b32a6916cf9bbd266af3e69f94e82","other":"bbbccc0180fe2605be748daeabb1fc02e6c8870b37f371359f38ee114f09771f","up":true},{"one":"ec3e84f80ab71df09a44c79c8d4af8da68fdf3dd7dbce7451363b8aa16630493","other":"f16dc65b58a9fa5060674ca741531891fd44b63d9ac5eabea185745049e474ca","up":true},{"one":"d16513f30d485d3175321c1a0aa5a525c115ae13c395f7fa3deb1cf4d1ec69bc","other":"fef27a360408179eafd514dfc71016f3df085bcb2e83bbdeb5fb9e5cd1935696","up":true},{"one":"c0347196ec87f51f97229140b5d66015cfff2781cc1aff6d3e207c3fa3532732","other":"fef27a360408179eafd514dfc71016f3df085bcb2e83bbdeb5fb9e5cd1935696","up":true},{"one":"a25904f98c73a09a37034f579d86413fe31fd9a052a03d74266760d4ea73b8e9","other":"bbbccc0180fe2605be748daeabb1fc02e6c8870b37f371359f38ee114f09771f","up":true},{"one":"55a243b4bdf78ff2460533c521620b11b4ceaa67a3c96760e2a9facc6727f50f","other":"4443b3497092c9f200fe7d43c32a533f8fc9fa7129226e1e2c7fd5f7f27e1711","up":true},{"one":"27c236583dff714a3000acafbfd3308566c81271f825eac8f4f0cff83a7ff127","other":"33fe6d6970690e8d9e2b08ff234cb1eaf336baa53b398511cd078dcce2c8b2da","up":true},{"one":"041c4a3f942536e67af087da305403e26a19e030dcf51473a597431753a2bec2","other":"2293b1e9fb44ee6db39db9366291fc0b4e286c355547750de19e96c32e02bdf9","up":true},{"one":"1dd4c2c8dac646526b1afd187f326712da75ed7a717668bfc89c7703a964d480","other":"0f03a5bb51c3f599469cfe9e5da0a10b8d06ba501a89e180077a75f1c5971467","up":true},{"one":"ab255c40e39ba8fd2fb439ff26d135aab3944fb9159e54370f4fe735906d0313","other":"8cb7da4ef2158d07c222c0f08dec7f9b58037623f465824b4119a9f25b31a005","up":true},{"one":"627105957aa0b587a9ba1b0f273fc19403b6955940e794a359ade89cd7d40dfb","other":"75bf881b6acbf512f2abcf42e5d86ac32e5dd849e7a416e39275979a2b6bf43a","up":true},{"one":"404b70c6ac72972cfd9e7cf115c7f043bd15d0e4b9a959bfc2924c722eb712f7","other":"62c09690dd71784e06b438d7c56256e1097c05fe7eb83b90fe5b0277a4b88568","up":true},{"one":"de4f168b7b670c1348d801db70d9a9e7fa44dd729030ba5c05df9623967c40b1","other":"c0347196ec87f51f97229140b5d66015cfff2781cc1aff6d3e207c3fa3532732","up":true},{"one":"1a9310bc61505d08c458eaba0e7cd1b5c1e7a64e00fcba2034da1a17a2faa15c","other":"33fe6d6970690e8d9e2b08ff234cb1eaf336baa53b398511cd078dcce2c8b2da","up":true},{"one":"ce82b9805bfa59ef3f18b46d5e2d8c4513e133f86500df83b55e13331ae4298c","other":"ec085243645c6e5fdbeffb137ccd119053bd655e76b1d9a6b5e0221183764e43","up":true},{"one":"ec3e84f80ab71df09a44c79c8d4af8da68fdf3dd7dbce7451363b8aa16630493","other":"f6f318e25a24c449e727c60c610719aaa36d0baf826a3a4931ad684abf9bcbba","up":true},{"one":"83aad5b97e1ea8c40537e5593de4810c7b35fab156053402dda758d6e9ea9055","other":"bc3e07ee098badd739c4e9b965275f6fbf6331f76b692089604ac44025cf0bcc","up":true},{"one":"ff06d6cc3521d20c0a9bcd779c872f576023c8eaafad7289864140b313a5c47b","other":"ec3e84f80ab71df09a44c79c8d4af8da68fdf3dd7dbce7451363b8aa16630493","up":true},{"one":"33fe6d6970690e8d9e2b08ff234cb1eaf336baa53b398511cd078dcce2c8b2da","other":"2293b1e9fb44ee6db39db9366291fc0b4e286c355547750de19e96c32e02bdf9","up":true},{"one":"8934ee6bbfc9c912a5a5fb004eb3df0b65313e22e8ceb8dc3f3e13d10853228f","other":"9861d7cab15fd77ce544aa046f9daf61af7f7c78da7f84c9d3bc1c19f9f2e071","up":true},{"one":"c34bd2e209fc11e27f81e1359545f28c816787127b41811dc1710fa4e53fcefa","other":"ce82b9805bfa59ef3f18b46d5e2d8c4513e133f86500df83b55e13331ae4298c","up":true},{"one":"45411a7482cae50dd1dd8d90138a28c0dc61b04baa9592f927f9d415b0970a53","other":"604962f0064ac9612a19b459964f72da27c547c70a5bf12fb9ff3ef9c06c5a41","up":true},{"one":"627105957aa0b587a9ba1b0f273fc19403b6955940e794a359ade89cd7d40dfb","other":"7a5c44693de20adc3c53b1302fb00aab32a46265abc7563bdba33f7e5c4f9d74","up":true},{"one":"9861d7cab15fd77ce544aa046f9daf61af7f7c78da7f84c9d3bc1c19f9f2e071","other":"8cb7da4ef2158d07c222c0f08dec7f9b58037623f465824b4119a9f25b31a005","up":true},{"one":"5bf6a2fe481412b1b20f0cc2325a1119fda9e34c4def3d1f4026a88dc0c992ac","other":"5b87478ce6f96988d572d249140ca6716f66aec8f6e0435e7f8be9fca5ed38a0","up":true},{"one":"2f1a15c39bcb0e953f8c160933f69e3dda29b834575742c4f432eb384c5dd9df","other":"27c236583dff714a3000acafbfd3308566c81271f825eac8f4f0cff83a7ff127","up":true},{"one":"9637fa5ec80bd404a366fe86f7a89a573529833097c130114b3015754886545d","other":"8934ee6bbfc9c912a5a5fb004eb3df0b65313e22e8ceb8dc3f3e13d10853228f","up":true},{"one":"7a5c44693de20adc3c53b1302fb00aab32a46265abc7563bdba33f7e5c4f9d74","other":"62c09690dd71784e06b438d7c56256e1097c05fe7eb83b90fe5b0277a4b88568","up":true},{"one":"dd4811271007f90b64a51b758afc7ebc8c5af306cb6a1b88ccdc2cc88fd9684b","other":"ce82b9805bfa59ef3f18b46d5e2d8c4513e133f86500df83b55e13331ae4298c","up":true},{"one":"48534a538fd708c0e616cbdfa948596048b7daa77ef09dd69c1652a5f6d05efc","other":"62c09690dd71784e06b438d7c56256e1097c05fe7eb83b90fe5b0277a4b88568","up":true},{"one":"4443b3497092c9f200fe7d43c32a533f8fc9fa7129226e1e2c7fd5f7f27e1711","other":"627105957aa0b587a9ba1b0f273fc19403b6955940e794a359ade89cd7d40dfb","up":true},{"one":"10d579523acbad30e3e50d610f0d3291f7518486773c8d9404856bf1349128bf","other":"041c4a3f942536e67af087da305403e26a19e030dcf51473a597431753a2bec2","up":true},{"one":"46afbd7b71e9f5578135ef57c6e9afaf1ede91425fd5807d6b257e47f93d830a","other":"5b936341da709d11b34b6df007f38fff0396b785a14f94653aaf921d8e450a3f","up":true},{"one":"d87ba657576968058fcc86579c3f52aa78905909b0a943938af621c6ed99fbea","other":"c62e4b2302cd62f578c8c647adc3a4affef6df65a5236302865db85897efc015","up":true},{"one":"2b804f6d2a235441cf0b5b52a7fb2aa862c84510ed482f0a5aec92c4d89ab484","other":"33fe6d6970690e8d9e2b08ff234cb1eaf336baa53b398511cd078dcce2c8b2da","up":true},{"one":"be5da0eb4bc76c0ca3a63423568dbfa24d385499945b068308a2874ed4243eb3","other":"b2697a3f2de6ea0d13586a655463782509691d6f05d90f45fd08823e7eaf5a0b","up":true},{"one":"c05d9d9199c1b1bf84af4b8869b36920382f0350d58dd5100700cd0d27f165ab","other":"ce82b9805bfa59ef3f18b46d5e2d8c4513e133f86500df83b55e13331ae4298c","up":true},{"one":"d87ba657576968058fcc86579c3f52aa78905909b0a943938af621c6ed99fbea","other":"d16513f30d485d3175321c1a0aa5a525c115ae13c395f7fa3deb1cf4d1ec69bc","up":true},{"one":"10d579523acbad30e3e50d610f0d3291f7518486773c8d9404856bf1349128bf","other":"1dd4c2c8dac646526b1afd187f326712da75ed7a717668bfc89c7703a964d480","up":true},{"one":"c0347196ec87f51f97229140b5d66015cfff2781cc1aff6d3e207c3fa3532732","other":"ff06d6cc3521d20c0a9bcd779c872f576023c8eaafad7289864140b313a5c47b","up":true},{"one":"f090d909f94f6970d074948115e4f46e67e4fb5735f537889ed2b169ff2bd368","other":"ff06d6cc3521d20c0a9bcd779c872f576023c8eaafad7289864140b313a5c47b","up":true},{"one":"2b790fbca8da74c7de9715b4919ce03cdcf14a4608671cd4739b2b99a052e636","other":"27c236583dff714a3000acafbfd3308566c81271f825eac8f4f0cff83a7ff127","up":true},{"one":"1a9310bc61505d08c458eaba0e7cd1b5c1e7a64e00fcba2034da1a17a2faa15c","other":"2293b1e9fb44ee6db39db9366291fc0b4e286c355547750de19e96c32e02bdf9","up":true},{"one":"c34bd2e209fc11e27f81e1359545f28c816787127b41811dc1710fa4e53fcefa","other":"c62e4b2302cd62f578c8c647adc3a4affef6df65a5236302865db85897efc015","up":true},{"one":"9637fa5ec80bd404a366fe86f7a89a573529833097c130114b3015754886545d","other":"a25904f98c73a09a37034f579d86413fe31fd9a052a03d74266760d4ea73b8e9","up":true},{"one":"604962f0064ac9612a19b459964f72da27c547c70a5bf12fb9ff3ef9c06c5a41","other":"75bf881b6acbf512f2abcf42e5d86ac32e5dd849e7a416e39275979a2b6bf43a","up":true},{"one":"f1e151beef0c2259669ac950125aa004b02ba7078bf2d87248a4b7d25c62585e","other":"ff06d6cc3521d20c0a9bcd779c872f576023c8eaafad7289864140b313a5c47b","up":true},{"one":"e59a74b65709cd9e76d4d531d078a8a3055061eddc4d515affbfc0f99cae22ac","other":"f090d909f94f6970d074948115e4f46e67e4fb5735f537889ed2b169ff2bd368","up":true},{"one":"1a9310bc61505d08c458eaba0e7cd1b5c1e7a64e00fcba2034da1a17a2faa15c","other":"0d7f4a662acc72d2fed999e13880cd1070d7bb868a92ee343a52dcf84cf06395","up":true},{"one":"adfd2641d8e57ade2e6b802cbeb0c0b7336430a67d1d1f3abc5152b4df066b91","other":"bbbccc0180fe2605be748daeabb1fc02e6c8870b37f371359f38ee114f09771f","up":true},{"one":"9637fa5ec80bd404a366fe86f7a89a573529833097c130114b3015754886545d","other":"83aad5b97e1ea8c40537e5593de4810c7b35fab156053402dda758d6e9ea9055","up":true},{"one":"e59a74b65709cd9e76d4d531d078a8a3055061eddc4d515affbfc0f99cae22ac","other":"ec085243645c6e5fdbeffb137ccd119053bd655e76b1d9a6b5e0221183764e43","up":true},{"one":"c34bd2e209fc11e27f81e1359545f28c816787127b41811dc1710fa4e53fcefa","other":"c67db282f89ee5c7fe33cceb6d606672c04f273f9247478f323c8227f709b72d","up":true},{"one":"bc3e07ee098badd739c4e9b965275f6fbf6331f76b692089604ac44025cf0bcc","other":"ab255c40e39ba8fd2fb439ff26d135aab3944fb9159e54370f4fe735906d0313","up":true},{"one":"0e8fb3e25746a7f18f33e31c10200e5ec21eb54ad592bad5369b9b584fe80e1b","other":"041c4a3f942536e67af087da305403e26a19e030dcf51473a597431753a2bec2","up":true},{"one":"627105957aa0b587a9ba1b0f273fc19403b6955940e794a359ade89cd7d40dfb","other":"55a243b4bdf78ff2460533c521620b11b4ceaa67a3c96760e2a9facc6727f50f","up":true},{"one":"12b8769e0e996011ceff489a3f56ba8e555d545b69accb5b4396dead7335a8db","other":"0f03a5bb51c3f599469cfe9e5da0a10b8d06ba501a89e180077a75f1c5971467","up":true},{"one":"c8511f8896d3c4226d5d8c860096c6a90839fce500a77b8304395f5b4833b284","other":"ce82b9805bfa59ef3f18b46d5e2d8c4513e133f86500df83b55e13331ae4298c","up":true},{"one":"8934ee6bbfc9c912a5a5fb004eb3df0b65313e22e8ceb8dc3f3e13d10853228f","other":"9009cef32b9cc42e97b812ba3a35b977da5d373990bb9521a516df9466401d5d","up":true},{"one":"4e4ed5f90dc5399e3362d2691cb5587af8627ae542c524e2f2a129428b91a89b","other":"404b70c6ac72972cfd9e7cf115c7f043bd15d0e4b9a959bfc2924c722eb712f7","up":true},{"one":"adfd2641d8e57ade2e6b802cbeb0c0b7336430a67d1d1f3abc5152b4df066b91","other":"a25904f98c73a09a37034f579d86413fe31fd9a052a03d74266760d4ea73b8e9","up":true},{"one":"ce82b9805bfa59ef3f18b46d5e2d8c4513e133f86500df83b55e13331ae4298c","other":"e59a74b65709cd9e76d4d531d078a8a3055061eddc4d515affbfc0f99cae22ac","up":true},{"one":"45411a7482cae50dd1dd8d90138a28c0dc61b04baa9592f927f9d415b0970a53","other":"55a243b4bdf78ff2460533c521620b11b4ceaa67a3c96760e2a9facc6727f50f","up":true},{"one":"9637fa5ec80bd404a366fe86f7a89a573529833097c130114b3015754886545d","other":"55a243b4bdf78ff2460533c521620b11b4ceaa67a3c96760e2a9facc6727f50f","up":true},{"one":"dd4811271007f90b64a51b758afc7ebc8c5af306cb6a1b88ccdc2cc88fd9684b","other":"d16513f30d485d3175321c1a0aa5a525c115ae13c395f7fa3deb1cf4d1ec69bc","up":true},{"one":"46afbd7b71e9f5578135ef57c6e9afaf1ede91425fd5807d6b257e47f93d830a","other":"48534a538fd708c0e616cbdfa948596048b7daa77ef09dd69c1652a5f6d05efc","up":true},{"one":"f6f318e25a24c449e727c60c610719aaa36d0baf826a3a4931ad684abf9bcbba","other":"ec085243645c6e5fdbeffb137ccd119053bd655e76b1d9a6b5e0221183764e43","up":true},{"one":"dd4811271007f90b64a51b758afc7ebc8c5af306cb6a1b88ccdc2cc88fd9684b","other":"dbefd322e4f37f3e142ad151a08c8bd7784fb0db249324aff479f5b663212e76","up":true},{"one":"83aad5b97e1ea8c40537e5593de4810c7b35fab156053402dda758d6e9ea9055","other":"8934ee6bbfc9c912a5a5fb004eb3df0b65313e22e8ceb8dc3f3e13d10853228f","up":true},{"one":"55a243b4bdf78ff2460533c521620b11b4ceaa67a3c96760e2a9facc6727f50f","other":"5b936341da709d11b34b6df007f38fff0396b785a14f94653aaf921d8e450a3f","up":true},{"one":"d16513f30d485d3175321c1a0aa5a525c115ae13c395f7fa3deb1cf4d1ec69bc","other":"ff06d6cc3521d20c0a9bcd779c872f576023c8eaafad7289864140b313a5c47b","up":true},{"one":"de4f168b7b670c1348d801db70d9a9e7fa44dd729030ba5c05df9623967c40b1","other":"d16513f30d485d3175321c1a0aa5a525c115ae13c395f7fa3deb1cf4d1ec69bc","up":true},{"one":"aeff88a5c749733707f99b876c1ecf7db71b32a6916cf9bbd266af3e69f94e82","other":"a25904f98c73a09a37034f579d86413fe31fd9a052a03d74266760d4ea73b8e9","up":true},{"one":"2f1a15c39bcb0e953f8c160933f69e3dda29b834575742c4f432eb384c5dd9df","other":"2b804f6d2a235441cf0b5b52a7fb2aa862c84510ed482f0a5aec92c4d89ab484","up":true},{"one":"041c4a3f942536e67af087da305403e26a19e030dcf51473a597431753a2bec2","other":"0f03a5bb51c3f599469cfe9e5da0a10b8d06ba501a89e180077a75f1c5971467","up":true},{"one":"2b790fbca8da74c7de9715b4919ce03cdcf14a4608671cd4739b2b99a052e636","other":"2293b1e9fb44ee6db39db9366291fc0b4e286c355547750de19e96c32e02bdf9","up":true},{"one":"dbefd322e4f37f3e142ad151a08c8bd7784fb0db249324aff479f5b663212e76","other":"d16513f30d485d3175321c1a0aa5a525c115ae13c395f7fa3deb1cf4d1ec69bc","up":true},{"one":"c67db282f89ee5c7fe33cceb6d606672c04f273f9247478f323c8227f709b72d","other":"d16513f30d485d3175321c1a0aa5a525c115ae13c395f7fa3deb1cf4d1ec69bc","up":true},{"one":"be5da0eb4bc76c0ca3a63423568dbfa24d385499945b068308a2874ed4243eb3","other":"bbbccc0180fe2605be748daeabb1fc02e6c8870b37f371359f38ee114f09771f","up":true},{"one":"55a243b4bdf78ff2460533c521620b11b4ceaa67a3c96760e2a9facc6727f50f","other":"9861d7cab15fd77ce544aa046f9daf61af7f7c78da7f84c9d3bc1c19f9f2e071","up":true},{"one":"48534a538fd708c0e616cbdfa948596048b7daa77ef09dd69c1652a5f6d05efc","other":"404b70c6ac72972cfd9e7cf115c7f043bd15d0e4b9a959bfc2924c722eb712f7","up":true},{"one":"f1e151beef0c2259669ac950125aa004b02ba7078bf2d87248a4b7d25c62585e","other":"fef27a360408179eafd514dfc71016f3df085bcb2e83bbdeb5fb9e5cd1935696","up":true},{"one":"f16dc65b58a9fa5060674ca741531891fd44b63d9ac5eabea185745049e474ca","other":"ff06d6cc3521d20c0a9bcd779c872f576023c8eaafad7289864140b313a5c47b","up":true},{"one":"5b87478ce6f96988d572d249140ca6716f66aec8f6e0435e7f8be9fca5ed38a0","other":"55a243b4bdf78ff2460533c521620b11b4ceaa67a3c96760e2a9facc6727f50f","up":true},{"one":"fef27a360408179eafd514dfc71016f3df085bcb2e83bbdeb5fb9e5cd1935696","other":"ec085243645c6e5fdbeffb137ccd119053bd655e76b1d9a6b5e0221183764e43","up":true},{"one":"604962f0064ac9612a19b459964f72da27c547c70a5bf12fb9ff3ef9c06c5a41","other":"627105957aa0b587a9ba1b0f273fc19403b6955940e794a359ade89cd7d40dfb","up":true},{"one":"83aad5b97e1ea8c40537e5593de4810c7b35fab156053402dda758d6e9ea9055","other":"e59a74b65709cd9e76d4d531d078a8a3055061eddc4d515affbfc0f99cae22ac","up":true},{"one":"83aad5b97e1ea8c40537e5593de4810c7b35fab156053402dda758d6e9ea9055","other":"8cb7da4ef2158d07c222c0f08dec7f9b58037623f465824b4119a9f25b31a005","up":true},{"one":"4e4ed5f90dc5399e3362d2691cb5587af8627ae542c524e2f2a129428b91a89b","other":"4443b3497092c9f200fe7d43c32a533f8fc9fa7129226e1e2c7fd5f7f27e1711","up":true},{"one":"48534a538fd708c0e616cbdfa948596048b7daa77ef09dd69c1652a5f6d05efc","other":"4e4ed5f90dc5399e3362d2691cb5587af8627ae542c524e2f2a129428b91a89b","up":true},{"one":"10d579523acbad30e3e50d610f0d3291f7518486773c8d9404856bf1349128bf","other":"12b8769e0e996011ceff489a3f56ba8e555d545b69accb5b4396dead7335a8db","up":true},{"one":"c05d9d9199c1b1bf84af4b8869b36920382f0350d58dd5100700cd0d27f165ab","other":"c8511f8896d3c4226d5d8c860096c6a90839fce500a77b8304395f5b4833b284","up":true},{"one":"1a9310bc61505d08c458eaba0e7cd1b5c1e7a64e00fcba2034da1a17a2faa15c","other":"12b8769e0e996011ceff489a3f56ba8e555d545b69accb5b4396dead7335a8db","up":true},{"one":"041c4a3f942536e67af087da305403e26a19e030dcf51473a597431753a2bec2","other":"0d7f4a662acc72d2fed999e13880cd1070d7bb868a92ee343a52dcf84cf06395","up":true},{"one":"bc3e07ee098badd739c4e9b965275f6fbf6331f76b692089604ac44025cf0bcc","other":"b2697a3f2de6ea0d13586a655463782509691d6f05d90f45fd08823e7eaf5a0b","up":true},{"one":"b2697a3f2de6ea0d13586a655463782509691d6f05d90f45fd08823e7eaf5a0b","other":"bbbccc0180fe2605be748daeabb1fc02e6c8870b37f371359f38ee114f09771f","up":true},{"one":"c8511f8896d3c4226d5d8c860096c6a90839fce500a77b8304395f5b4833b284","other":"c62e4b2302cd62f578c8c647adc3a4affef6df65a5236302865db85897efc015","up":true},{"one":"ce82b9805bfa59ef3f18b46d5e2d8c4513e133f86500df83b55e13331ae4298c","other":"c0347196ec87f51f97229140b5d66015cfff2781cc1aff6d3e207c3fa3532732","up":true},{"one":"ab255c40e39ba8fd2fb439ff26d135aab3944fb9159e54370f4fe735906d0313","other":"b2697a3f2de6ea0d13586a655463782509691d6f05d90f45fd08823e7eaf5a0b","up":true},{"one":"0e8fb3e25746a7f18f33e31c10200e5ec21eb54ad592bad5369b9b584fe80e1b","other":"0d7f4a662acc72d2fed999e13880cd1070d7bb868a92ee343a52dcf84cf06395","up":true},{"one":"45411a7482cae50dd1dd8d90138a28c0dc61b04baa9592f927f9d415b0970a53","other":"4e4ed5f90dc5399e3362d2691cb5587af8627ae542c524e2f2a129428b91a89b","up":true},{"one":"604962f0064ac9612a19b459964f72da27c547c70a5bf12fb9ff3ef9c06c5a41","other":"62c09690dd71784e06b438d7c56256e1097c05fe7eb83b90fe5b0277a4b88568","up":true},{"one":"f090d909f94f6970d074948115e4f46e67e4fb5735f537889ed2b169ff2bd368","other":"fef27a360408179eafd514dfc71016f3df085bcb2e83bbdeb5fb9e5cd1935696","up":true},{"one":"27c236583dff714a3000acafbfd3308566c81271f825eac8f4f0cff83a7ff127","other":"2b804f6d2a235441cf0b5b52a7fb2aa862c84510ed482f0a5aec92c4d89ab484","up":true},{"one":"5bf6a2fe481412b1b20f0cc2325a1119fda9e34c4def3d1f4026a88dc0c992ac","other":"d16513f30d485d3175321c1a0aa5a525c115ae13c395f7fa3deb1cf4d1ec69bc","up":true},{"one":"ab255c40e39ba8fd2fb439ff26d135aab3944fb9159e54370f4fe735906d0313","other":"adfd2641d8e57ade2e6b802cbeb0c0b7336430a67d1d1f3abc5152b4df066b91","up":true},{"one":"ab255c40e39ba8fd2fb439ff26d135aab3944fb9159e54370f4fe735906d0313","other":"a25904f98c73a09a37034f579d86413fe31fd9a052a03d74266760d4ea73b8e9","up":true},{"one":"9637fa5ec80bd404a366fe86f7a89a573529833097c130114b3015754886545d","other":"9861d7cab15fd77ce544aa046f9daf61af7f7c78da7f84c9d3bc1c19f9f2e071","up":true},{"one":"1a9310bc61505d08c458eaba0e7cd1b5c1e7a64e00fcba2034da1a17a2faa15c","other":"c8511f8896d3c4226d5d8c860096c6a90839fce500a77b8304395f5b4833b284","up":true},{"one":"1a9310bc61505d08c458eaba0e7cd1b5c1e7a64e00fcba2034da1a17a2faa15c","other":"1dd4c2c8dac646526b1afd187f326712da75ed7a717668bfc89c7703a964d480","up":true},{"one":"de4f168b7b670c1348d801db70d9a9e7fa44dd729030ba5c05df9623967c40b1","other":"d87ba657576968058fcc86579c3f52aa78905909b0a943938af621c6ed99fbea","up":true},{"one":"0d7f4a662acc72d2fed999e13880cd1070d7bb868a92ee343a52dcf84cf06395","other":"0f03a5bb51c3f599469cfe9e5da0a10b8d06ba501a89e180077a75f1c5971467","up":true},{"one":"ce82b9805bfa59ef3f18b46d5e2d8c4513e133f86500df83b55e13331ae4298c","other":"d16513f30d485d3175321c1a0aa5a525c115ae13c395f7fa3deb1cf4d1ec69bc","up":true},{"one":"75bf881b6acbf512f2abcf42e5d86ac32e5dd849e7a416e39275979a2b6bf43a","other":"62c09690dd71784e06b438d7c56256e1097c05fe7eb83b90fe5b0277a4b88568","up":true},{"one":"aeff88a5c749733707f99b876c1ecf7db71b32a6916cf9bbd266af3e69f94e82","other":"ab255c40e39ba8fd2fb439ff26d135aab3944fb9159e54370f4fe735906d0313","up":true},{"one":"f16dc65b58a9fa5060674ca741531891fd44b63d9ac5eabea185745049e474ca","other":"fef27a360408179eafd514dfc71016f3df085bcb2e83bbdeb5fb9e5cd1935696","up":true},{"one":"46afbd7b71e9f5578135ef57c6e9afaf1ede91425fd5807d6b257e47f93d830a","other":"404b70c6ac72972cfd9e7cf115c7f043bd15d0e4b9a959bfc2924c722eb712f7","up":true},{"one":"f1e151beef0c2259669ac950125aa004b02ba7078bf2d87248a4b7d25c62585e","other":"f6f318e25a24c449e727c60c610719aaa36d0baf826a3a4931ad684abf9bcbba","up":true},{"one":"aeff88a5c749733707f99b876c1ecf7db71b32a6916cf9bbd266af3e69f94e82","other":"adfd2641d8e57ade2e6b802cbeb0c0b7336430a67d1d1f3abc5152b4df066b91","up":true},{"one":"2f1a15c39bcb0e953f8c160933f69e3dda29b834575742c4f432eb384c5dd9df","other":"f6f318e25a24c449e727c60c610719aaa36d0baf826a3a4931ad684abf9bcbba","up":true},{"one":"7a5c44693de20adc3c53b1302fb00aab32a46265abc7563bdba33f7e5c4f9d74","other":"75bf881b6acbf512f2abcf42e5d86ac32e5dd849e7a416e39275979a2b6bf43a","up":true},{"one":"10d579523acbad30e3e50d610f0d3291f7518486773c8d9404856bf1349128bf","other":"7a5c44693de20adc3c53b1302fb00aab32a46265abc7563bdba33f7e5c4f9d74","up":true},{"one":"c34bd2e209fc11e27f81e1359545f28c816787127b41811dc1710fa4e53fcefa","other":"c0347196ec87f51f97229140b5d66015cfff2781cc1aff6d3e207c3fa3532732","up":true},{"one":"5bf6a2fe481412b1b20f0cc2325a1119fda9e34c4def3d1f4026a88dc0c992ac","other":"5b936341da709d11b34b6df007f38fff0396b785a14f94653aaf921d8e450a3f","up":true},{"one":"ec085243645c6e5fdbeffb137ccd119053bd655e76b1d9a6b5e0221183764e43","other":"ec3e84f80ab71df09a44c79c8d4af8da68fdf3dd7dbce7451363b8aa16630493","up":true},{"one":"e59a74b65709cd9e76d4d531d078a8a3055061eddc4d515affbfc0f99cae22ac","other":"ec3e84f80ab71df09a44c79c8d4af8da68fdf3dd7dbce7451363b8aa16630493","up":true},{"one":"2b790fbca8da74c7de9715b4919ce03cdcf14a4608671cd4739b2b99a052e636","other":"2f1a15c39bcb0e953f8c160933f69e3dda29b834575742c4f432eb384c5dd9df","up":true},{"one":"dd4811271007f90b64a51b758afc7ebc8c5af306cb6a1b88ccdc2cc88fd9684b","other":"de4f168b7b670c1348d801db70d9a9e7fa44dd729030ba5c05df9623967c40b1","up":true},{"one":"c0347196ec87f51f97229140b5d66015cfff2781cc1aff6d3e207c3fa3532732","other":"c67db282f89ee5c7fe33cceb6d606672c04f273f9247478f323c8227f709b72d","up":true},{"one":"c05d9d9199c1b1bf84af4b8869b36920382f0350d58dd5100700cd0d27f165ab","other":"c62e4b2302cd62f578c8c647adc3a4affef6df65a5236302865db85897efc015","up":true},{"one":"fef27a360408179eafd514dfc71016f3df085bcb2e83bbdeb5fb9e5cd1935696","other":"f6f318e25a24c449e727c60c610719aaa36d0baf826a3a4931ad684abf9bcbba","up":true},{"one":"be5da0eb4bc76c0ca3a63423568dbfa24d385499945b068308a2874ed4243eb3","other":"bc3e07ee098badd739c4e9b965275f6fbf6331f76b692089604ac44025cf0bcc","up":true},{"one":"9637fa5ec80bd404a366fe86f7a89a573529833097c130114b3015754886545d","other":"9009cef32b9cc42e97b812ba3a35b977da5d373990bb9521a516df9466401d5d","up":true},{"one":"041c4a3f942536e67af087da305403e26a19e030dcf51473a597431753a2bec2","other":"604962f0064ac9612a19b459964f72da27c547c70a5bf12fb9ff3ef9c06c5a41","up":true},{"one":"27c236583dff714a3000acafbfd3308566c81271f825eac8f4f0cff83a7ff127","other":"2293b1e9fb44ee6db39db9366291fc0b4e286c355547750de19e96c32e02bdf9","up":true},{"one":"83aad5b97e1ea8c40537e5593de4810c7b35fab156053402dda758d6e9ea9055","other":"9861d7cab15fd77ce544aa046f9daf61af7f7c78da7f84c9d3bc1c19f9f2e071","up":true},{"one":"8934ee6bbfc9c912a5a5fb004eb3df0b65313e22e8ceb8dc3f3e13d10853228f","other":"8cb7da4ef2158d07c222c0f08dec7f9b58037623f465824b4119a9f25b31a005","up":true},{"one":"2b790fbca8da74c7de9715b4919ce03cdcf14a4608671cd4739b2b99a052e636","other":"2b804f6d2a235441cf0b5b52a7fb2aa862c84510ed482f0a5aec92c4d89ab484","up":true},{"one":"9009cef32b9cc42e97b812ba3a35b977da5d373990bb9521a516df9466401d5d","other":"9861d7cab15fd77ce544aa046f9daf61af7f7c78da7f84c9d3bc1c19f9f2e071","up":true},{"one":"dd4811271007f90b64a51b758afc7ebc8c5af306cb6a1b88ccdc2cc88fd9684b","other":"d87ba657576968058fcc86579c3f52aa78905909b0a943938af621c6ed99fbea","up":true},{"one":"10d579523acbad30e3e50d610f0d3291f7518486773c8d9404856bf1349128bf","other":"604962f0064ac9612a19b459964f72da27c547c70a5bf12fb9ff3ef9c06c5a41","up":true},{"one":"45411a7482cae50dd1dd8d90138a28c0dc61b04baa9592f927f9d415b0970a53","other":"48534a538fd708c0e616cbdfa948596048b7daa77ef09dd69c1652a5f6d05efc","up":true},{"one":"bc3e07ee098badd739c4e9b965275f6fbf6331f76b692089604ac44025cf0bcc","other":"bbbccc0180fe2605be748daeabb1fc02e6c8870b37f371359f38ee114f09771f","up":true},{"one":"83aad5b97e1ea8c40537e5593de4810c7b35fab156053402dda758d6e9ea9055","other":"9009cef32b9cc42e97b812ba3a35b977da5d373990bb9521a516df9466401d5d","up":true},{"one":"0e8fb3e25746a7f18f33e31c10200e5ec21eb54ad592bad5369b9b584fe80e1b","other":"0f03a5bb51c3f599469cfe9e5da0a10b8d06ba501a89e180077a75f1c5971467","up":true},{"one":"1dd4c2c8dac646526b1afd187f326712da75ed7a717668bfc89c7703a964d480","other":"83aad5b97e1ea8c40537e5593de4810c7b35fab156053402dda758d6e9ea9055","up":true},{"one":"f1e151beef0c2259669ac950125aa004b02ba7078bf2d87248a4b7d25c62585e","other":"f090d909f94f6970d074948115e4f46e67e4fb5735f537889ed2b169ff2bd368","up":true},{"one":"f090d909f94f6970d074948115e4f46e67e4fb5735f537889ed2b169ff2bd368","other":"f6f318e25a24c449e727c60c610719aaa36d0baf826a3a4931ad684abf9bcbba","up":true},{"one":"10d579523acbad30e3e50d610f0d3291f7518486773c8d9404856bf1349128bf","other":"33fe6d6970690e8d9e2b08ff234cb1eaf336baa53b398511cd078dcce2c8b2da","up":true},{"one":"de4f168b7b670c1348d801db70d9a9e7fa44dd729030ba5c05df9623967c40b1","other":"dbefd322e4f37f3e142ad151a08c8bd7784fb0db249324aff479f5b663212e76","up":true},{"one":"f1e151beef0c2259669ac950125aa004b02ba7078bf2d87248a4b7d25c62585e","other":"0d7f4a662acc72d2fed999e13880cd1070d7bb868a92ee343a52dcf84cf06395","up":true},{"one":"48534a538fd708c0e616cbdfa948596048b7daa77ef09dd69c1652a5f6d05efc","other":"ce82b9805bfa59ef3f18b46d5e2d8c4513e133f86500df83b55e13331ae4298c","up":true},{"one":"f1e151beef0c2259669ac950125aa004b02ba7078bf2d87248a4b7d25c62585e","other":"e59a74b65709cd9e76d4d531d078a8a3055061eddc4d515affbfc0f99cae22ac","up":true},{"one":"4e4ed5f90dc5399e3362d2691cb5587af8627ae542c524e2f2a129428b91a89b","other":"7a5c44693de20adc3c53b1302fb00aab32a46265abc7563bdba33f7e5c4f9d74","up":true},{"one":"45411a7482cae50dd1dd8d90138a28c0dc61b04baa9592f927f9d415b0970a53","other":"46afbd7b71e9f5578135ef57c6e9afaf1ede91425fd5807d6b257e47f93d830a","up":true},{"one":"b2697a3f2de6ea0d13586a655463782509691d6f05d90f45fd08823e7eaf5a0b","other":"5b936341da709d11b34b6df007f38fff0396b785a14f94653aaf921d8e450a3f","up":true},{"one":"b2697a3f2de6ea0d13586a655463782509691d6f05d90f45fd08823e7eaf5a0b","other":"ec085243645c6e5fdbeffb137ccd119053bd655e76b1d9a6b5e0221183764e43","up":true},{"one":"1a9310bc61505d08c458eaba0e7cd1b5c1e7a64e00fcba2034da1a17a2faa15c","other":"d16513f30d485d3175321c1a0aa5a525c115ae13c395f7fa3deb1cf4d1ec69bc","up":true},{"one":"dd4811271007f90b64a51b758afc7ebc8c5af306cb6a1b88ccdc2cc88fd9684b","other":"041c4a3f942536e67af087da305403e26a19e030dcf51473a597431753a2bec2","up":true},{"one":"f16dc65b58a9fa5060674ca741531891fd44b63d9ac5eabea185745049e474ca","other":"f6f318e25a24c449e727c60c610719aaa36d0baf826a3a4931ad684abf9bcbba","up":true},{"one":"a25904f98c73a09a37034f579d86413fe31fd9a052a03d74266760d4ea73b8e9","other":"e59a74b65709cd9e76d4d531d078a8a3055061eddc4d515affbfc0f99cae22ac","up":true},{"one":"c05d9d9199c1b1bf84af4b8869b36920382f0350d58dd5100700cd0d27f165ab","other":"c67db282f89ee5c7fe33cceb6d606672c04f273f9247478f323c8227f709b72d","up":true},{"one":"5bf6a2fe481412b1b20f0cc2325a1119fda9e34c4def3d1f4026a88dc0c992ac","other":"33fe6d6970690e8d9e2b08ff234cb1eaf336baa53b398511cd078dcce2c8b2da","up":true},{"one":"f1e151beef0c2259669ac950125aa004b02ba7078bf2d87248a4b7d25c62585e","other":"f16dc65b58a9fa5060674ca741531891fd44b63d9ac5eabea185745049e474ca","up":true},{"one":"12b8769e0e996011ceff489a3f56ba8e555d545b69accb5b4396dead7335a8db","other":"604962f0064ac9612a19b459964f72da27c547c70a5bf12fb9ff3ef9c06c5a41","up":true},{"one":"45411a7482cae50dd1dd8d90138a28c0dc61b04baa9592f927f9d415b0970a53","other":"404b70c6ac72972cfd9e7cf115c7f043bd15d0e4b9a959bfc2924c722eb712f7","up":true},{"one":"d87ba657576968058fcc86579c3f52aa78905909b0a943938af621c6ed99fbea","other":"dbefd322e4f37f3e142ad151a08c8bd7784fb0db249324aff479f5b663212e76","up":true},{"one":"4e4ed5f90dc5399e3362d2691cb5587af8627ae542c524e2f2a129428b91a89b","other":"ec085243645c6e5fdbeffb137ccd119053bd655e76b1d9a6b5e0221183764e43","up":true},{"one":"c05d9d9199c1b1bf84af4b8869b36920382f0350d58dd5100700cd0d27f165ab","other":"c34bd2e209fc11e27f81e1359545f28c816787127b41811dc1710fa4e53fcefa","up":true},{"one":"83aad5b97e1ea8c40537e5593de4810c7b35fab156053402dda758d6e9ea9055","other":"5b87478ce6f96988d572d249140ca6716f66aec8f6e0435e7f8be9fca5ed38a0","up":true},{"one":"46afbd7b71e9f5578135ef57c6e9afaf1ede91425fd5807d6b257e47f93d830a","other":"4443b3497092c9f200fe7d43c32a533f8fc9fa7129226e1e2c7fd5f7f27e1711","up":true},{"one":"1dd4c2c8dac646526b1afd187f326712da75ed7a717668bfc89c7703a964d480","other":"c8511f8896d3c4226d5d8c860096c6a90839fce500a77b8304395f5b4833b284","up":true},{"one":"aeff88a5c749733707f99b876c1ecf7db71b32a6916cf9bbd266af3e69f94e82","other":"604962f0064ac9612a19b459964f72da27c547c70a5bf12fb9ff3ef9c06c5a41","up":true},{"one":"45411a7482cae50dd1dd8d90138a28c0dc61b04baa9592f927f9d415b0970a53","other":"4443b3497092c9f200fe7d43c32a533f8fc9fa7129226e1e2c7fd5f7f27e1711","up":true},{"one":"2f1a15c39bcb0e953f8c160933f69e3dda29b834575742c4f432eb384c5dd9df","other":"f090d909f94f6970d074948115e4f46e67e4fb5735f537889ed2b169ff2bd368","up":true},{"one":"404b70c6ac72972cfd9e7cf115c7f043bd15d0e4b9a959bfc2924c722eb712f7","other":"4443b3497092c9f200fe7d43c32a533f8fc9fa7129226e1e2c7fd5f7f27e1711","up":true},{"one":"041c4a3f942536e67af087da305403e26a19e030dcf51473a597431753a2bec2","other":"55a243b4bdf78ff2460533c521620b11b4ceaa67a3c96760e2a9facc6727f50f","up":true},{"one":"be5da0eb4bc76c0ca3a63423568dbfa24d385499945b068308a2874ed4243eb3","other":"33fe6d6970690e8d9e2b08ff234cb1eaf336baa53b398511cd078dcce2c8b2da","up":true},{"one":"c67db282f89ee5c7fe33cceb6d606672c04f273f9247478f323c8227f709b72d","other":"c62e4b2302cd62f578c8c647adc3a4affef6df65a5236302865db85897efc015","up":true},{"one":"10d579523acbad30e3e50d610f0d3291f7518486773c8d9404856bf1349128bf","other":"2293b1e9fb44ee6db39db9366291fc0b4e286c355547750de19e96c32e02bdf9","up":true},{"one":"ce82b9805bfa59ef3f18b46d5e2d8c4513e133f86500df83b55e13331ae4298c","other":"9861d7cab15fd77ce544aa046f9daf61af7f7c78da7f84c9d3bc1c19f9f2e071","up":true},{"one":"aeff88a5c749733707f99b876c1ecf7db71b32a6916cf9bbd266af3e69f94e82","other":"62c09690dd71784e06b438d7c56256e1097c05fe7eb83b90fe5b0277a4b88568","up":true},{"one":"9637fa5ec80bd404a366fe86f7a89a573529833097c130114b3015754886545d","other":"2b804f6d2a235441cf0b5b52a7fb2aa862c84510ed482f0a5aec92c4d89ab484","up":true},{"one":"c05d9d9199c1b1bf84af4b8869b36920382f0350d58dd5100700cd0d27f165ab","other":"c0347196ec87f51f97229140b5d66015cfff2781cc1aff6d3e207c3fa3532732","up":true},{"one":"dd4811271007f90b64a51b758afc7ebc8c5af306cb6a1b88ccdc2cc88fd9684b","other":"0d7f4a662acc72d2fed999e13880cd1070d7bb868a92ee343a52dcf84cf06395","up":true},{"one":"0e8fb3e25746a7f18f33e31c10200e5ec21eb54ad592bad5369b9b584fe80e1b","other":"83aad5b97e1ea8c40537e5593de4810c7b35fab156053402dda758d6e9ea9055","up":true},{"one":"627105957aa0b587a9ba1b0f273fc19403b6955940e794a359ade89cd7d40dfb","other":"62c09690dd71784e06b438d7c56256e1097c05fe7eb83b90fe5b0277a4b88568","up":true},{"one":"c34bd2e209fc11e27f81e1359545f28c816787127b41811dc1710fa4e53fcefa","other":"7a5c44693de20adc3c53b1302fb00aab32a46265abc7563bdba33f7e5c4f9d74","up":true},{"one":"2b790fbca8da74c7de9715b4919ce03cdcf14a4608671cd4739b2b99a052e636","other":"83aad5b97e1ea8c40537e5593de4810c7b35fab156053402dda758d6e9ea9055","up":true},{"one":"e59a74b65709cd9e76d4d531d078a8a3055061eddc4d515affbfc0f99cae22ac","other":"8934ee6bbfc9c912a5a5fb004eb3df0b65313e22e8ceb8dc3f3e13d10853228f","up":true},{"one":"bc3e07ee098badd739c4e9b965275f6fbf6331f76b692089604ac44025cf0bcc","other":"5b936341da709d11b34b6df007f38fff0396b785a14f94653aaf921d8e450a3f","up":true},{"one":"bc3e07ee098badd739c4e9b965275f6fbf6331f76b692089604ac44025cf0bcc","other":"ec085243645c6e5fdbeffb137ccd119053bd655e76b1d9a6b5e0221183764e43","up":true},{"one":"be5da0eb4bc76c0ca3a63423568dbfa24d385499945b068308a2874ed4243eb3","other":"27c236583dff714a3000acafbfd3308566c81271f825eac8f4f0cff83a7ff127","up":true},{"one":"ff06d6cc3521d20c0a9bcd779c872f576023c8eaafad7289864140b313a5c47b","other":"27c236583dff714a3000acafbfd3308566c81271f825eac8f4f0cff83a7ff127","up":true},{"one":"0e8fb3e25746a7f18f33e31c10200e5ec21eb54ad592bad5369b9b584fe80e1b","other":"8934ee6bbfc9c912a5a5fb004eb3df0b65313e22e8ceb8dc3f3e13d10853228f","up":true},{"one":"7a5c44693de20adc3c53b1302fb00aab32a46265abc7563bdba33f7e5c4f9d74","other":"2293b1e9fb44ee6db39db9366291fc0b4e286c355547750de19e96c32e02bdf9","up":true},{"one":"48534a538fd708c0e616cbdfa948596048b7daa77ef09dd69c1652a5f6d05efc","other":"c8511f8896d3c4226d5d8c860096c6a90839fce500a77b8304395f5b4833b284","up":true},{"one":"2f1a15c39bcb0e953f8c160933f69e3dda29b834575742c4f432eb384c5dd9df","other":"604962f0064ac9612a19b459964f72da27c547c70a5bf12fb9ff3ef9c06c5a41","up":true},{"one":"1dd4c2c8dac646526b1afd187f326712da75ed7a717668bfc89c7703a964d480","other":"8934ee6bbfc9c912a5a5fb004eb3df0b65313e22e8ceb8dc3f3e13d10853228f","up":true},{"one":"4e4ed5f90dc5399e3362d2691cb5587af8627ae542c524e2f2a129428b91a89b","other":"ec3e84f80ab71df09a44c79c8d4af8da68fdf3dd7dbce7451363b8aa16630493","up":true},{"one":"f16dc65b58a9fa5060674ca741531891fd44b63d9ac5eabea185745049e474ca","other":"f090d909f94f6970d074948115e4f46e67e4fb5735f537889ed2b169ff2bd368","up":true},{"one":"f1e151beef0c2259669ac950125aa004b02ba7078bf2d87248a4b7d25c62585e","other":"83aad5b97e1ea8c40537e5593de4810c7b35fab156053402dda758d6e9ea9055","up":true},{"one":"12b8769e0e996011ceff489a3f56ba8e555d545b69accb5b4396dead7335a8db","other":"62c09690dd71784e06b438d7c56256e1097c05fe7eb83b90fe5b0277a4b88568","up":true},{"one":"ff06d6cc3521d20c0a9bcd779c872f576023c8eaafad7289864140b313a5c47b","other":"fef27a360408179eafd514dfc71016f3df085bcb2e83bbdeb5fb9e5cd1935696","up":true},{"one":"bc3e07ee098badd739c4e9b965275f6fbf6331f76b692089604ac44025cf0bcc","other":"604962f0064ac9612a19b459964f72da27c547c70a5bf12fb9ff3ef9c06c5a41","up":true},{"one":"041c4a3f942536e67af087da305403e26a19e030dcf51473a597431753a2bec2","other":"62c09690dd71784e06b438d7c56256e1097c05fe7eb83b90fe5b0277a4b88568","up":true},{"one":"5b87478ce6f96988d572d249140ca6716f66aec8f6e0435e7f8be9fca5ed38a0","other":"8934ee6bbfc9c912a5a5fb004eb3df0b65313e22e8ceb8dc3f3e13d10853228f","up":true},{"one":"f1e151beef0c2259669ac950125aa004b02ba7078bf2d87248a4b7d25c62585e","other":"adfd2641d8e57ade2e6b802cbeb0c0b7336430a67d1d1f3abc5152b4df066b91","up":true},{"one":"adfd2641d8e57ade2e6b802cbeb0c0b7336430a67d1d1f3abc5152b4df066b91","other":"5bf6a2fe481412b1b20f0cc2325a1119fda9e34c4def3d1f4026a88dc0c992ac","up":true},{"one":"7a5c44693de20adc3c53b1302fb00aab32a46265abc7563bdba33f7e5c4f9d74","other":"48534a538fd708c0e616cbdfa948596048b7daa77ef09dd69c1652a5f6d05efc","up":true},{"one":"ec3e84f80ab71df09a44c79c8d4af8da68fdf3dd7dbce7451363b8aa16630493","other":"75bf881b6acbf512f2abcf42e5d86ac32e5dd849e7a416e39275979a2b6bf43a","up":true},{"one":"0d7f4a662acc72d2fed999e13880cd1070d7bb868a92ee343a52dcf84cf06395","other":"55a243b4bdf78ff2460533c521620b11b4ceaa67a3c96760e2a9facc6727f50f","up":true},{"one":"b2697a3f2de6ea0d13586a655463782509691d6f05d90f45fd08823e7eaf5a0b","other":"604962f0064ac9612a19b459964f72da27c547c70a5bf12fb9ff3ef9c06c5a41","up":true},{"one":"2b790fbca8da74c7de9715b4919ce03cdcf14a4608671cd4739b2b99a052e636","other":"8934ee6bbfc9c912a5a5fb004eb3df0b65313e22e8ceb8dc3f3e13d10853228f","up":true},{"one":"2f1a15c39bcb0e953f8c160933f69e3dda29b834575742c4f432eb384c5dd9df","other":"62c09690dd71784e06b438d7c56256e1097c05fe7eb83b90fe5b0277a4b88568","up":true},{"one":"46afbd7b71e9f5578135ef57c6e9afaf1ede91425fd5807d6b257e47f93d830a","other":"b2697a3f2de6ea0d13586a655463782509691d6f05d90f45fd08823e7eaf5a0b","up":true},{"one":"041c4a3f942536e67af087da305403e26a19e030dcf51473a597431753a2bec2","other":"8cb7da4ef2158d07c222c0f08dec7f9b58037623f465824b4119a9f25b31a005","up":true},{"one":"12b8769e0e996011ceff489a3f56ba8e555d545b69accb5b4396dead7335a8db","other":"041c4a3f942536e67af087da305403e26a19e030dcf51473a597431753a2bec2","up":true},{"one":"dd4811271007f90b64a51b758afc7ebc8c5af306cb6a1b88ccdc2cc88fd9684b","other":"ab255c40e39ba8fd2fb439ff26d135aab3944fb9159e54370f4fe735906d0313","up":true},{"one":"d87ba657576968058fcc86579c3f52aa78905909b0a943938af621c6ed99fbea","other":"7a5c44693de20adc3c53b1302fb00aab32a46265abc7563bdba33f7e5c4f9d74","up":true},{"one":"ce82b9805bfa59ef3f18b46d5e2d8c4513e133f86500df83b55e13331ae4298c","other":"9009cef32b9cc42e97b812ba3a35b977da5d373990bb9521a516df9466401d5d","up":true},{"one":"4e4ed5f90dc5399e3362d2691cb5587af8627ae542c524e2f2a129428b91a89b","other":"e59a74b65709cd9e76d4d531d078a8a3055061eddc4d515affbfc0f99cae22ac","up":true},{"one":"be5da0eb4bc76c0ca3a63423568dbfa24d385499945b068308a2874ed4243eb3","other":"ec085243645c6e5fdbeffb137ccd119053bd655e76b1d9a6b5e0221183764e43","up":true},{"one":"0e8fb3e25746a7f18f33e31c10200e5ec21eb54ad592bad5369b9b584fe80e1b","other":"33fe6d6970690e8d9e2b08ff234cb1eaf336baa53b398511cd078dcce2c8b2da","up":true},{"one":"7a5c44693de20adc3c53b1302fb00aab32a46265abc7563bdba33f7e5c4f9d74","other":"fef27a360408179eafd514dfc71016f3df085bcb2e83bbdeb5fb9e5cd1935696","up":true},{"one":"a25904f98c73a09a37034f579d86413fe31fd9a052a03d74266760d4ea73b8e9","other":"ec085243645c6e5fdbeffb137ccd119053bd655e76b1d9a6b5e0221183764e43","up":true},{"one":"48534a538fd708c0e616cbdfa948596048b7daa77ef09dd69c1652a5f6d05efc","other":"c62e4b2302cd62f578c8c647adc3a4affef6df65a5236302865db85897efc015","up":true},{"one":"0d7f4a662acc72d2fed999e13880cd1070d7bb868a92ee343a52dcf84cf06395","other":"f16dc65b58a9fa5060674ca741531891fd44b63d9ac5eabea185745049e474ca","up":true},{"one":"1dd4c2c8dac646526b1afd187f326712da75ed7a717668bfc89c7703a964d480","other":"5b936341da709d11b34b6df007f38fff0396b785a14f94653aaf921d8e450a3f","up":true},{"one":"f16dc65b58a9fa5060674ca741531891fd44b63d9ac5eabea185745049e474ca","other":"e59a74b65709cd9e76d4d531d078a8a3055061eddc4d515affbfc0f99cae22ac","up":true},{"one":"0d7f4a662acc72d2fed999e13880cd1070d7bb868a92ee343a52dcf84cf06395","other":"8cb7da4ef2158d07c222c0f08dec7f9b58037623f465824b4119a9f25b31a005","up":true},{"one":"5b87478ce6f96988d572d249140ca6716f66aec8f6e0435e7f8be9fca5ed38a0","other":"8cb7da4ef2158d07c222c0f08dec7f9b58037623f465824b4119a9f25b31a005","up":true},{"one":"c34bd2e209fc11e27f81e1359545f28c816787127b41811dc1710fa4e53fcefa","other":"75bf881b6acbf512f2abcf42e5d86ac32e5dd849e7a416e39275979a2b6bf43a","up":true},{"one":"7a5c44693de20adc3c53b1302fb00aab32a46265abc7563bdba33f7e5c4f9d74","other":"ec3e84f80ab71df09a44c79c8d4af8da68fdf3dd7dbce7451363b8aa16630493","up":true},{"one":"041c4a3f942536e67af087da305403e26a19e030dcf51473a597431753a2bec2","other":"1a9310bc61505d08c458eaba0e7cd1b5c1e7a64e00fcba2034da1a17a2faa15c","up":true},{"one":"ce82b9805bfa59ef3f18b46d5e2d8c4513e133f86500df83b55e13331ae4298c","other":"83aad5b97e1ea8c40537e5593de4810c7b35fab156053402dda758d6e9ea9055","up":true},{"one":"10d579523acbad30e3e50d610f0d3291f7518486773c8d9404856bf1349128bf","other":"0e8fb3e25746a7f18f33e31c10200e5ec21eb54ad592bad5369b9b584fe80e1b","up":true},{"one":"adfd2641d8e57ade2e6b802cbeb0c0b7336430a67d1d1f3abc5152b4df066b91","other":"5b87478ce6f96988d572d249140ca6716f66aec8f6e0435e7f8be9fca5ed38a0","up":true},{"one":"aeff88a5c749733707f99b876c1ecf7db71b32a6916cf9bbd266af3e69f94e82","other":"ce82b9805bfa59ef3f18b46d5e2d8c4513e133f86500df83b55e13331ae4298c","up":true},{"one":"0e8fb3e25746a7f18f33e31c10200e5ec21eb54ad592bad5369b9b584fe80e1b","other":"8cb7da4ef2158d07c222c0f08dec7f9b58037623f465824b4119a9f25b31a005","up":true},{"one":"10d579523acbad30e3e50d610f0d3291f7518486773c8d9404856bf1349128bf","other":"1a9310bc61505d08c458eaba0e7cd1b5c1e7a64e00fcba2034da1a17a2faa15c","up":true},{"one":"0e8fb3e25746a7f18f33e31c10200e5ec21eb54ad592bad5369b9b584fe80e1b","other":"12b8769e0e996011ceff489a3f56ba8e555d545b69accb5b4396dead7335a8db","up":true},{"one":"aeff88a5c749733707f99b876c1ecf7db71b32a6916cf9bbd266af3e69f94e82","other":"dd4811271007f90b64a51b758afc7ebc8c5af306cb6a1b88ccdc2cc88fd9684b","up":true},{"one":"8934ee6bbfc9c912a5a5fb004eb3df0b65313e22e8ceb8dc3f3e13d10853228f","other":"33fe6d6970690e8d9e2b08ff234cb1eaf336baa53b398511cd078dcce2c8b2da","up":true},{"one":"e59a74b65709cd9e76d4d531d078a8a3055061eddc4d515affbfc0f99cae22ac","other":"604962f0064ac9612a19b459964f72da27c547c70a5bf12fb9ff3ef9c06c5a41","up":true},{"one":"7a5c44693de20adc3c53b1302fb00aab32a46265abc7563bdba33f7e5c4f9d74","other":"dbefd322e4f37f3e142ad151a08c8bd7784fb0db249324aff479f5b663212e76","up":true},{"one":"0f03a5bb51c3f599469cfe9e5da0a10b8d06ba501a89e180077a75f1c5971467","other":"604962f0064ac9612a19b459964f72da27c547c70a5bf12fb9ff3ef9c06c5a41","up":true},{"one":"ce82b9805bfa59ef3f18b46d5e2d8c4513e133f86500df83b55e13331ae4298c","other":"4443b3497092c9f200fe7d43c32a533f8fc9fa7129226e1e2c7fd5f7f27e1711","up":true},{"one":"c0347196ec87f51f97229140b5d66015cfff2781cc1aff6d3e207c3fa3532732","other":"c62e4b2302cd62f578c8c647adc3a4affef6df65a5236302865db85897efc015","up":true},{"one":"1dd4c2c8dac646526b1afd187f326712da75ed7a717668bfc89c7703a964d480","other":"041c4a3f942536e67af087da305403e26a19e030dcf51473a597431753a2bec2","up":true},{"one":"48534a538fd708c0e616cbdfa948596048b7daa77ef09dd69c1652a5f6d05efc","other":"33fe6d6970690e8d9e2b08ff234cb1eaf336baa53b398511cd078dcce2c8b2da","up":true},{"one":"c67db282f89ee5c7fe33cceb6d606672c04f273f9247478f323c8227f709b72d","other":"33fe6d6970690e8d9e2b08ff234cb1eaf336baa53b398511cd078dcce2c8b2da","up":true},{"one":"4e4ed5f90dc5399e3362d2691cb5587af8627ae542c524e2f2a129428b91a89b","other":"33fe6d6970690e8d9e2b08ff234cb1eaf336baa53b398511cd078dcce2c8b2da","up":true},{"one":"f1e151beef0c2259669ac950125aa004b02ba7078bf2d87248a4b7d25c62585e","other":"c62e4b2302cd62f578c8c647adc3a4affef6df65a5236302865db85897efc015","up":true},{"one":"c05d9d9199c1b1bf84af4b8869b36920382f0350d58dd5100700cd0d27f165ab","other":"33fe6d6970690e8d9e2b08ff234cb1eaf336baa53b398511cd078dcce2c8b2da","up":true},{"one":"c8511f8896d3c4226d5d8c860096c6a90839fce500a77b8304395f5b4833b284","other":"ec085243645c6e5fdbeffb137ccd119053bd655e76b1d9a6b5e0221183764e43","up":true},{"one":"f16dc65b58a9fa5060674ca741531891fd44b63d9ac5eabea185745049e474ca","other":"75bf881b6acbf512f2abcf42e5d86ac32e5dd849e7a416e39275979a2b6bf43a","up":true},{"one":"45411a7482cae50dd1dd8d90138a28c0dc61b04baa9592f927f9d415b0970a53","other":"041c4a3f942536e67af087da305403e26a19e030dcf51473a597431753a2bec2","up":true},{"one":"1dd4c2c8dac646526b1afd187f326712da75ed7a717668bfc89c7703a964d480","other":"5b87478ce6f96988d572d249140ca6716f66aec8f6e0435e7f8be9fca5ed38a0","up":true},{"one":"5b87478ce6f96988d572d249140ca6716f66aec8f6e0435e7f8be9fca5ed38a0","other":"041c4a3f942536e67af087da305403e26a19e030dcf51473a597431753a2bec2","up":true},{"one":"5bf6a2fe481412b1b20f0cc2325a1119fda9e34c4def3d1f4026a88dc0c992ac","other":"2293b1e9fb44ee6db39db9366291fc0b4e286c355547750de19e96c32e02bdf9","up":true},{"one":"a25904f98c73a09a37034f579d86413fe31fd9a052a03d74266760d4ea73b8e9","other":"ec3e84f80ab71df09a44c79c8d4af8da68fdf3dd7dbce7451363b8aa16630493","up":true},{"one":"d87ba657576968058fcc86579c3f52aa78905909b0a943938af621c6ed99fbea","other":"604962f0064ac9612a19b459964f72da27c547c70a5bf12fb9ff3ef9c06c5a41","up":true},{"one":"2b804f6d2a235441cf0b5b52a7fb2aa862c84510ed482f0a5aec92c4d89ab484","other":"9861d7cab15fd77ce544aa046f9daf61af7f7c78da7f84c9d3bc1c19f9f2e071","up":true},{"one":"2b790fbca8da74c7de9715b4919ce03cdcf14a4608671cd4739b2b99a052e636","other":"7a5c44693de20adc3c53b1302fb00aab32a46265abc7563bdba33f7e5c4f9d74","up":true},{"one":"0f03a5bb51c3f599469cfe9e5da0a10b8d06ba501a89e180077a75f1c5971467","other":"62c09690dd71784e06b438d7c56256e1097c05fe7eb83b90fe5b0277a4b88568","up":true},{"one":"9009cef32b9cc42e97b812ba3a35b977da5d373990bb9521a516df9466401d5d","other":"33fe6d6970690e8d9e2b08ff234cb1eaf336baa53b398511cd078dcce2c8b2da","up":true},{"one":"8934ee6bbfc9c912a5a5fb004eb3df0b65313e22e8ceb8dc3f3e13d10853228f","other":"2293b1e9fb44ee6db39db9366291fc0b4e286c355547750de19e96c32e02bdf9","up":true},{"one":"2f1a15c39bcb0e953f8c160933f69e3dda29b834575742c4f432eb384c5dd9df","other":"1a9310bc61505d08c458eaba0e7cd1b5c1e7a64e00fcba2034da1a17a2faa15c","up":true},{"one":"e59a74b65709cd9e76d4d531d078a8a3055061eddc4d515affbfc0f99cae22ac","other":"c8511f8896d3c4226d5d8c860096c6a90839fce500a77b8304395f5b4833b284","up":true},{"one":"10d579523acbad30e3e50d610f0d3291f7518486773c8d9404856bf1349128bf","other":"0f03a5bb51c3f599469cfe9e5da0a10b8d06ba501a89e180077a75f1c5971467","up":true},{"one":"83aad5b97e1ea8c40537e5593de4810c7b35fab156053402dda758d6e9ea9055","other":"dbefd322e4f37f3e142ad151a08c8bd7784fb0db249324aff479f5b663212e76","up":true},{"one":"2f1a15c39bcb0e953f8c160933f69e3dda29b834575742c4f432eb384c5dd9df","other":"48534a538fd708c0e616cbdfa948596048b7daa77ef09dd69c1652a5f6d05efc","up":true},{"one":"83aad5b97e1ea8c40537e5593de4810c7b35fab156053402dda758d6e9ea9055","other":"fef27a360408179eafd514dfc71016f3df085bcb2e83bbdeb5fb9e5cd1935696","up":true},{"one":"1a9310bc61505d08c458eaba0e7cd1b5c1e7a64e00fcba2034da1a17a2faa15c","other":"604962f0064ac9612a19b459964f72da27c547c70a5bf12fb9ff3ef9c06c5a41","up":true},{"one":"46afbd7b71e9f5578135ef57c6e9afaf1ede91425fd5807d6b257e47f93d830a","other":"bbbccc0180fe2605be748daeabb1fc02e6c8870b37f371359f38ee114f09771f","up":true},{"one":"404b70c6ac72972cfd9e7cf115c7f043bd15d0e4b9a959bfc2924c722eb712f7","other":"f6f318e25a24c449e727c60c610719aaa36d0baf826a3a4931ad684abf9bcbba","up":true},{"one":"8934ee6bbfc9c912a5a5fb004eb3df0b65313e22e8ceb8dc3f3e13d10853228f","other":"27c236583dff714a3000acafbfd3308566c81271f825eac8f4f0cff83a7ff127","up":true},{"one":"5bf6a2fe481412b1b20f0cc2325a1119fda9e34c4def3d1f4026a88dc0c992ac","other":"604962f0064ac9612a19b459964f72da27c547c70a5bf12fb9ff3ef9c06c5a41","up":true},{"one":"041c4a3f942536e67af087da305403e26a19e030dcf51473a597431753a2bec2","other":"2b804f6d2a235441cf0b5b52a7fb2aa862c84510ed482f0a5aec92c4d89ab484","up":true},{"one":"2b804f6d2a235441cf0b5b52a7fb2aa862c84510ed482f0a5aec92c4d89ab484","other":"2293b1e9fb44ee6db39db9366291fc0b4e286c355547750de19e96c32e02bdf9","up":true},{"one":"be5da0eb4bc76c0ca3a63423568dbfa24d385499945b068308a2874ed4243eb3","other":"ec3e84f80ab71df09a44c79c8d4af8da68fdf3dd7dbce7451363b8aa16630493","up":true},{"one":"b2697a3f2de6ea0d13586a655463782509691d6f05d90f45fd08823e7eaf5a0b","other":"c67db282f89ee5c7fe33cceb6d606672c04f273f9247478f323c8227f709b72d","up":true},{"one":"c34bd2e209fc11e27f81e1359545f28c816787127b41811dc1710fa4e53fcefa","other":"83aad5b97e1ea8c40537e5593de4810c7b35fab156053402dda758d6e9ea9055","up":true},{"one":"c67db282f89ee5c7fe33cceb6d606672c04f273f9247478f323c8227f709b72d","other":"27c236583dff714a3000acafbfd3308566c81271f825eac8f4f0cff83a7ff127","up":true},{"one":"404b70c6ac72972cfd9e7cf115c7f043bd15d0e4b9a959bfc2924c722eb712f7","other":"f090d909f94f6970d074948115e4f46e67e4fb5735f537889ed2b169ff2bd368","up":true},{"one":"c62e4b2302cd62f578c8c647adc3a4affef6df65a5236302865db85897efc015","other":"33fe6d6970690e8d9e2b08ff234cb1eaf336baa53b398511cd078dcce2c8b2da","up":true},{"one":"c34bd2e209fc11e27f81e1359545f28c816787127b41811dc1710fa4e53fcefa","other":"c8511f8896d3c4226d5d8c860096c6a90839fce500a77b8304395f5b4833b284","up":true},{"one":"9009cef32b9cc42e97b812ba3a35b977da5d373990bb9521a516df9466401d5d","other":"27c236583dff714a3000acafbfd3308566c81271f825eac8f4f0cff83a7ff127","up":true},{"one":"ce82b9805bfa59ef3f18b46d5e2d8c4513e133f86500df83b55e13331ae4298c","other":"c67db282f89ee5c7fe33cceb6d606672c04f273f9247478f323c8227f709b72d","up":true},{"one":"ec3e84f80ab71df09a44c79c8d4af8da68fdf3dd7dbce7451363b8aa16630493","other":"604962f0064ac9612a19b459964f72da27c547c70a5bf12fb9ff3ef9c06c5a41","up":true},{"one":"1a9310bc61505d08c458eaba0e7cd1b5c1e7a64e00fcba2034da1a17a2faa15c","other":"627105957aa0b587a9ba1b0f273fc19403b6955940e794a359ade89cd7d40dfb","up":true},{"one":"8934ee6bbfc9c912a5a5fb004eb3df0b65313e22e8ceb8dc3f3e13d10853228f","other":"ec3e84f80ab71df09a44c79c8d4af8da68fdf3dd7dbce7451363b8aa16630493","up":true},{"one":"ec085243645c6e5fdbeffb137ccd119053bd655e76b1d9a6b5e0221183764e43","other":"604962f0064ac9612a19b459964f72da27c547c70a5bf12fb9ff3ef9c06c5a41","up":true},{"one":"5bf6a2fe481412b1b20f0cc2325a1119fda9e34c4def3d1f4026a88dc0c992ac","other":"62c09690dd71784e06b438d7c56256e1097c05fe7eb83b90fe5b0277a4b88568","up":true},{"one":"e59a74b65709cd9e76d4d531d078a8a3055061eddc4d515affbfc0f99cae22ac","other":"c62e4b2302cd62f578c8c647adc3a4affef6df65a5236302865db85897efc015","up":true},{"one":"75bf881b6acbf512f2abcf42e5d86ac32e5dd849e7a416e39275979a2b6bf43a","other":"2293b1e9fb44ee6db39db9366291fc0b4e286c355547750de19e96c32e02bdf9","up":true},{"one":"ff06d6cc3521d20c0a9bcd779c872f576023c8eaafad7289864140b313a5c47b","other":"f6f318e25a24c449e727c60c610719aaa36d0baf826a3a4931ad684abf9bcbba","up":true},{"one":"75bf881b6acbf512f2abcf42e5d86ac32e5dd849e7a416e39275979a2b6bf43a","other":"dbefd322e4f37f3e142ad151a08c8bd7784fb0db249324aff479f5b663212e76","up":true},{"one":"1dd4c2c8dac646526b1afd187f326712da75ed7a717668bfc89c7703a964d480","other":"27c236583dff714a3000acafbfd3308566c81271f825eac8f4f0cff83a7ff127","up":true},{"one":"4e4ed5f90dc5399e3362d2691cb5587af8627ae542c524e2f2a129428b91a89b","other":"5bf6a2fe481412b1b20f0cc2325a1119fda9e34c4def3d1f4026a88dc0c992ac","up":true},{"one":"0e8fb3e25746a7f18f33e31c10200e5ec21eb54ad592bad5369b9b584fe80e1b","other":"1a9310bc61505d08c458eaba0e7cd1b5c1e7a64e00fcba2034da1a17a2faa15c","up":true},{"one":"0e8fb3e25746a7f18f33e31c10200e5ec21eb54ad592bad5369b9b584fe80e1b","other":"5b87478ce6f96988d572d249140ca6716f66aec8f6e0435e7f8be9fca5ed38a0","up":true},{"one":"aeff88a5c749733707f99b876c1ecf7db71b32a6916cf9bbd266af3e69f94e82","other":"83aad5b97e1ea8c40537e5593de4810c7b35fab156053402dda758d6e9ea9055","up":true},{"one":"4e4ed5f90dc5399e3362d2691cb5587af8627ae542c524e2f2a129428b91a89b","other":"27c236583dff714a3000acafbfd3308566c81271f825eac8f4f0cff83a7ff127","up":true},{"one":"c62e4b2302cd62f578c8c647adc3a4affef6df65a5236302865db85897efc015","other":"2293b1e9fb44ee6db39db9366291fc0b4e286c355547750de19e96c32e02bdf9","up":true},{"one":"f16dc65b58a9fa5060674ca741531891fd44b63d9ac5eabea185745049e474ca","other":"83aad5b97e1ea8c40537e5593de4810c7b35fab156053402dda758d6e9ea9055","up":true},{"one":"75bf881b6acbf512f2abcf42e5d86ac32e5dd849e7a416e39275979a2b6bf43a","other":"fef27a360408179eafd514dfc71016f3df085bcb2e83bbdeb5fb9e5cd1935696","up":true},{"one":"627105957aa0b587a9ba1b0f273fc19403b6955940e794a359ade89cd7d40dfb","other":"de4f168b7b670c1348d801db70d9a9e7fa44dd729030ba5c05df9623967c40b1","up":true},{"one":"0f03a5bb51c3f599469cfe9e5da0a10b8d06ba501a89e180077a75f1c5971467","other":"1a9310bc61505d08c458eaba0e7cd1b5c1e7a64e00fcba2034da1a17a2faa15c","up":true},{"one":"f090d909f94f6970d074948115e4f46e67e4fb5735f537889ed2b169ff2bd368","other":"d16513f30d485d3175321c1a0aa5a525c115ae13c395f7fa3deb1cf4d1ec69bc","up":true},{"one":"45411a7482cae50dd1dd8d90138a28c0dc61b04baa9592f927f9d415b0970a53","other":"0d7f4a662acc72d2fed999e13880cd1070d7bb868a92ee343a52dcf84cf06395","up":true},{"one":"d87ba657576968058fcc86579c3f52aa78905909b0a943938af621c6ed99fbea","other":"8934ee6bbfc9c912a5a5fb004eb3df0b65313e22e8ceb8dc3f3e13d10853228f","up":true},{"one":"83aad5b97e1ea8c40537e5593de4810c7b35fab156053402dda758d6e9ea9055","other":"adfd2641d8e57ade2e6b802cbeb0c0b7336430a67d1d1f3abc5152b4df066b91","up":true},{"one":"b2697a3f2de6ea0d13586a655463782509691d6f05d90f45fd08823e7eaf5a0b","other":"c0347196ec87f51f97229140b5d66015cfff2781cc1aff6d3e207c3fa3532732","up":true},{"one":"aeff88a5c749733707f99b876c1ecf7db71b32a6916cf9bbd266af3e69f94e82","other":"8934ee6bbfc9c912a5a5fb004eb3df0b65313e22e8ceb8dc3f3e13d10853228f","up":true},{"one":"c05d9d9199c1b1bf84af4b8869b36920382f0350d58dd5100700cd0d27f165ab","other":"27c236583dff714a3000acafbfd3308566c81271f825eac8f4f0cff83a7ff127","up":true},{"one":"45411a7482cae50dd1dd8d90138a28c0dc61b04baa9592f927f9d415b0970a53","other":"5bf6a2fe481412b1b20f0cc2325a1119fda9e34c4def3d1f4026a88dc0c992ac","up":true},{"one":"4443b3497092c9f200fe7d43c32a533f8fc9fa7129226e1e2c7fd5f7f27e1711","other":"33fe6d6970690e8d9e2b08ff234cb1eaf336baa53b398511cd078dcce2c8b2da","up":true},{"one":"dd4811271007f90b64a51b758afc7ebc8c5af306cb6a1b88ccdc2cc88fd9684b","other":"ec085243645c6e5fdbeffb137ccd119053bd655e76b1d9a6b5e0221183764e43","up":true},{"one":"46afbd7b71e9f5578135ef57c6e9afaf1ede91425fd5807d6b257e47f93d830a","other":"27c236583dff714a3000acafbfd3308566c81271f825eac8f4f0cff83a7ff127","up":true},{"one":"c0347196ec87f51f97229140b5d66015cfff2781cc1aff6d3e207c3fa3532732","other":"604962f0064ac9612a19b459964f72da27c547c70a5bf12fb9ff3ef9c06c5a41","up":true},{"one":"8cb7da4ef2158d07c222c0f08dec7f9b58037623f465824b4119a9f25b31a005","other":"dbefd322e4f37f3e142ad151a08c8bd7784fb0db249324aff479f5b663212e76","up":true},{"one":"f1e151beef0c2259669ac950125aa004b02ba7078bf2d87248a4b7d25c62585e","other":"c67db282f89ee5c7fe33cceb6d606672c04f273f9247478f323c8227f709b72d","up":true},{"one":"2f1a15c39bcb0e953f8c160933f69e3dda29b834575742c4f432eb384c5dd9df","other":"1dd4c2c8dac646526b1afd187f326712da75ed7a717668bfc89c7703a964d480","up":true},{"one":"27c236583dff714a3000acafbfd3308566c81271f825eac8f4f0cff83a7ff127","other":"fef27a360408179eafd514dfc71016f3df085bcb2e83bbdeb5fb9e5cd1935696","up":true},{"one":"404b70c6ac72972cfd9e7cf115c7f043bd15d0e4b9a959bfc2924c722eb712f7","other":"55a243b4bdf78ff2460533c521620b11b4ceaa67a3c96760e2a9facc6727f50f","up":true},{"one":"e59a74b65709cd9e76d4d531d078a8a3055061eddc4d515affbfc0f99cae22ac","other":"de4f168b7b670c1348d801db70d9a9e7fa44dd729030ba5c05df9623967c40b1","up":true},{"one":"c05d9d9199c1b1bf84af4b8869b36920382f0350d58dd5100700cd0d27f165ab","other":"83aad5b97e1ea8c40537e5593de4810c7b35fab156053402dda758d6e9ea9055","up":true},{"one":"dd4811271007f90b64a51b758afc7ebc8c5af306cb6a1b88ccdc2cc88fd9684b","other":"ec3e84f80ab71df09a44c79c8d4af8da68fdf3dd7dbce7451363b8aa16630493","up":true},{"one":"8934ee6bbfc9c912a5a5fb004eb3df0b65313e22e8ceb8dc3f3e13d10853228f","other":"fef27a360408179eafd514dfc71016f3df085bcb2e83bbdeb5fb9e5cd1935696","up":true},{"one":"c0347196ec87f51f97229140b5d66015cfff2781cc1aff6d3e207c3fa3532732","other":"c8511f8896d3c4226d5d8c860096c6a90839fce500a77b8304395f5b4833b284","up":true},{"one":"46afbd7b71e9f5578135ef57c6e9afaf1ede91425fd5807d6b257e47f93d830a","other":"4e4ed5f90dc5399e3362d2691cb5587af8627ae542c524e2f2a129428b91a89b","up":true},{"one":"c34bd2e209fc11e27f81e1359545f28c816787127b41811dc1710fa4e53fcefa","other":"8cb7da4ef2158d07c222c0f08dec7f9b58037623f465824b4119a9f25b31a005","up":true},{"one":"46afbd7b71e9f5578135ef57c6e9afaf1ede91425fd5807d6b257e47f93d830a","other":"2293b1e9fb44ee6db39db9366291fc0b4e286c355547750de19e96c32e02bdf9","up":true},{"one":"ec3e84f80ab71df09a44c79c8d4af8da68fdf3dd7dbce7451363b8aa16630493","other":"ce82b9805bfa59ef3f18b46d5e2d8c4513e133f86500df83b55e13331ae4298c","up":true},{"one":"ec3e84f80ab71df09a44c79c8d4af8da68fdf3dd7dbce7451363b8aa16630493","other":"c62e4b2302cd62f578c8c647adc3a4affef6df65a5236302865db85897efc015","up":true},{"one":"62c09690dd71784e06b438d7c56256e1097c05fe7eb83b90fe5b0277a4b88568","other":"5b936341da709d11b34b6df007f38fff0396b785a14f94653aaf921d8e450a3f","up":true},{"one":"ec085243645c6e5fdbeffb137ccd119053bd655e76b1d9a6b5e0221183764e43","other":"c67db282f89ee5c7fe33cceb6d606672c04f273f9247478f323c8227f709b72d","up":true},{"one":"f16dc65b58a9fa5060674ca741531891fd44b63d9ac5eabea185745049e474ca","other":"8934ee6bbfc9c912a5a5fb004eb3df0b65313e22e8ceb8dc3f3e13d10853228f","up":true},{"one":"c34bd2e209fc11e27f81e1359545f28c816787127b41811dc1710fa4e53fcefa","other":"ec085243645c6e5fdbeffb137ccd119053bd655e76b1d9a6b5e0221183764e43","up":true},{"one":"de4f168b7b670c1348d801db70d9a9e7fa44dd729030ba5c05df9623967c40b1","other":"604962f0064ac9612a19b459964f72da27c547c70a5bf12fb9ff3ef9c06c5a41","up":true},{"one":"48534a538fd708c0e616cbdfa948596048b7daa77ef09dd69c1652a5f6d05efc","other":"55a243b4bdf78ff2460533c521620b11b4ceaa67a3c96760e2a9facc6727f50f","up":true},{"one":"48534a538fd708c0e616cbdfa948596048b7daa77ef09dd69c1652a5f6d05efc","other":"5bf6a2fe481412b1b20f0cc2325a1119fda9e34c4def3d1f4026a88dc0c992ac","up":true},{"one":"d87ba657576968058fcc86579c3f52aa78905909b0a943938af621c6ed99fbea","other":"8cb7da4ef2158d07c222c0f08dec7f9b58037623f465824b4119a9f25b31a005","up":true},{"one":"1dd4c2c8dac646526b1afd187f326712da75ed7a717668bfc89c7703a964d480","other":"2293b1e9fb44ee6db39db9366291fc0b4e286c355547750de19e96c32e02bdf9","up":true},{"one":"f16dc65b58a9fa5060674ca741531891fd44b63d9ac5eabea185745049e474ca","other":"ce82b9805bfa59ef3f18b46d5e2d8c4513e133f86500df83b55e13331ae4298c","up":true},{"one":"d87ba657576968058fcc86579c3f52aa78905909b0a943938af621c6ed99fbea","other":"ec085243645c6e5fdbeffb137ccd119053bd655e76b1d9a6b5e0221183764e43","up":true},{"one":"4443b3497092c9f200fe7d43c32a533f8fc9fa7129226e1e2c7fd5f7f27e1711","other":"2293b1e9fb44ee6db39db9366291fc0b4e286c355547750de19e96c32e02bdf9","up":true},{"one":"be5da0eb4bc76c0ca3a63423568dbfa24d385499945b068308a2874ed4243eb3","other":"83aad5b97e1ea8c40537e5593de4810c7b35fab156053402dda758d6e9ea9055","up":true},{"one":"c62e4b2302cd62f578c8c647adc3a4affef6df65a5236302865db85897efc015","other":"ce82b9805bfa59ef3f18b46d5e2d8c4513e133f86500df83b55e13331ae4298c","up":true},{"one":"604962f0064ac9612a19b459964f72da27c547c70a5bf12fb9ff3ef9c06c5a41","other":"5b936341da709d11b34b6df007f38fff0396b785a14f94653aaf921d8e450a3f","up":true},{"one":"48534a538fd708c0e616cbdfa948596048b7daa77ef09dd69c1652a5f6d05efc","other":"4443b3497092c9f200fe7d43c32a533f8fc9fa7129226e1e2c7fd5f7f27e1711","up":true},{"one":"be5da0eb4bc76c0ca3a63423568dbfa24d385499945b068308a2874ed4243eb3","other":"8934ee6bbfc9c912a5a5fb004eb3df0b65313e22e8ceb8dc3f3e13d10853228f","up":true},{"one":"c05d9d9199c1b1bf84af4b8869b36920382f0350d58dd5100700cd0d27f165ab","other":"8934ee6bbfc9c912a5a5fb004eb3df0b65313e22e8ceb8dc3f3e13d10853228f","up":true},{"one":"ab255c40e39ba8fd2fb439ff26d135aab3944fb9159e54370f4fe735906d0313","other":"be5da0eb4bc76c0ca3a63423568dbfa24d385499945b068308a2874ed4243eb3","up":true},{"one":"404b70c6ac72972cfd9e7cf115c7f043bd15d0e4b9a959bfc2924c722eb712f7","other":"5bf6a2fe481412b1b20f0cc2325a1119fda9e34c4def3d1f4026a88dc0c992ac","up":true},{"one":"46afbd7b71e9f5578135ef57c6e9afaf1ede91425fd5807d6b257e47f93d830a","other":"7a5c44693de20adc3c53b1302fb00aab32a46265abc7563bdba33f7e5c4f9d74","up":true},{"one":"c34bd2e209fc11e27f81e1359545f28c816787127b41811dc1710fa4e53fcefa","other":"d16513f30d485d3175321c1a0aa5a525c115ae13c395f7fa3deb1cf4d1ec69bc","up":true},{"one":"e59a74b65709cd9e76d4d531d078a8a3055061eddc4d515affbfc0f99cae22ac","other":"fef27a360408179eafd514dfc71016f3df085bcb2e83bbdeb5fb9e5cd1935696","up":true},{"one":"8934ee6bbfc9c912a5a5fb004eb3df0b65313e22e8ceb8dc3f3e13d10853228f","other":"adfd2641d8e57ade2e6b802cbeb0c0b7336430a67d1d1f3abc5152b4df066b91","up":true},{"one":"bc3e07ee098badd739c4e9b965275f6fbf6331f76b692089604ac44025cf0bcc","other":"c0347196ec87f51f97229140b5d66015cfff2781cc1aff6d3e207c3fa3532732","up":true},{"one":"c05d9d9199c1b1bf84af4b8869b36920382f0350d58dd5100700cd0d27f165ab","other":"ec085243645c6e5fdbeffb137ccd119053bd655e76b1d9a6b5e0221183764e43","up":true},{"one":"de4f168b7b670c1348d801db70d9a9e7fa44dd729030ba5c05df9623967c40b1","other":"ec3e84f80ab71df09a44c79c8d4af8da68fdf3dd7dbce7451363b8aa16630493","up":true},{"one":"c05d9d9199c1b1bf84af4b8869b36920382f0350d58dd5100700cd0d27f165ab","other":"d16513f30d485d3175321c1a0aa5a525c115ae13c395f7fa3deb1cf4d1ec69bc","up":true}]} \ No newline at end of file diff --git a/vendor/github.com/ethereum/go-ethereum/swarm/pot/address.go b/vendor/github.com/ethereum/go-ethereum/swarm/pot/address.go deleted file mode 100644 index 91cada2e..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/swarm/pot/doc.go b/vendor/github.com/ethereum/go-ethereum/swarm/pot/doc.go deleted file mode 100644 index cb6faea5..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/swarm/pot/pot.go b/vendor/github.com/ethereum/go-ethereum/swarm/pot/pot.go deleted file mode 100644 index 7e3967f3..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/swarm/pss/ARCHITECTURE.md b/vendor/github.com/ethereum/go-ethereum/swarm/pss/ARCHITECTURE.md deleted file mode 100644 index 279e895a..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/swarm/pss/README.md b/vendor/github.com/ethereum/go-ethereum/swarm/pss/README.md deleted file mode 100644 index aea87125..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/swarm/pss/api.go b/vendor/github.com/ethereum/go-ethereum/swarm/pss/api.go deleted file mode 100644 index 4556d7b7..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/p2p" - "github.com/ethereum/go-ethereum/rpc" - "github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/swarm/pss/client/client.go b/vendor/github.com/ethereum/go-ethereum/swarm/pss/client/client.go deleted file mode 100644 index 5ee387aa..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/ethereum/go-ethereum/common/hexutil" - "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/rlp" - "github.com/ethereum/go-ethereum/rpc" - "github.com/ethereum/go-ethereum/swarm/log" - "github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/swarm/pss/client/doc.go b/vendor/github.com/ethereum/go-ethereum/swarm/pss/client/doc.go deleted file mode 100644 index 080af45a..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/swarm/pss/doc.go b/vendor/github.com/ethereum/go-ethereum/swarm/pss/doc.go deleted file mode 100644 index 462c82aa..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/swarm/pss/handshake.go b/vendor/github.com/ethereum/go-ethereum/swarm/pss/handshake.go deleted file mode 100644 index ec3bffa3..00000000 --- a/vendor/github.com/ethereum/go-ethereum/swarm/pss/handshake.go +++ /dev/null @@ -1,592 +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/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/p2p" - "github.com/ethereum/go-ethereum/rlp" - "github.com/ethereum/go-ethereum/rpc" - "github.com/ethereum/go-ethereum/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 - keyCMu sync.Mutex // protects keyC map - 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.releaseKeyNoLock(*key.symKeyID, topic) - } else if !key.expiredAt.IsZero() && key.expiredAt.Before(now) { - ctl.releaseKeyNoLock(*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.mx.Lock() - ctl.pss.symKeyPool[*storekey.symKeyID][*topic].protected = true - ctl.pss.mx.Unlock() - } - for i := 0; i < len(*keystore); i++ { - ctl.symKeyIndex[*(*keystore)[i].symKeyID] = &((*keystore)[i]) - } -} - -func (ctl *HandshakeController) releaseKey(symkeyid string, topic *Topic) bool { - ctl.lock.Lock() - defer ctl.lock.Unlock() - return ctl.releaseKeyNoLock(symkeyid, topic) -} - -// Expire a symmetric key, making it eligible for garbage collection -func (ctl *HandshakeController) releaseKeyNoLock(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) - } - } -} - -func (ctl *HandshakeController) getSymKey(symkeyid string) *handshakeKey { - ctl.lock.Lock() - defer ctl.lock.Unlock() - return ctl.symKeyIndex[symkeyid] -} - -// Passed as a PssMsg handler for the topic handshake is activated on -// Handles incoming key exchange messages and -// counts 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 { - 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 - } - return ctl.registerSymKeyUse(symkeyid) -} - -func (ctl *HandshakeController) registerSymKeyUse(symkeyid string) error { - ctl.lock.Lock() - defer ctl.lock.Unlock() - - symKey, ok := ctl.symKeyIndex[symkeyid] - if !ok { - return nil - } - - if symKey.count >= symKey.limit { - return fmt.Errorf("symetric key expired (id: %s)", symkeyid) - } - symKey.count++ - - receiver := common.ToHex(crypto.FromECDSAPub(ctl.pss.PublicKey())) - log.Trace("increment symkey recv use", "symsymkeyid", symkeyid, "count", symKey.count, "limit", symKey.limit, "receiver", receiver) - - 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 { - ctl.keyCMu.Lock() - defer ctl.keyCMu.Unlock() - 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.getSymKey(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.getSymKey(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 otherErr := api.ctrl.registerSymKeyUse(symkeyid); otherErr != nil { - return otherErr - } - return err -} diff --git a/vendor/github.com/ethereum/go-ethereum/swarm/pss/keystore.go b/vendor/github.com/ethereum/go-ethereum/swarm/pss/keystore.go deleted file mode 100644 index 5c44cb24..00000000 --- a/vendor/github.com/ethereum/go-ethereum/swarm/pss/keystore.go +++ /dev/null @@ -1,281 +0,0 @@ -// 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 pss - -import ( - "crypto/ecdsa" - "errors" - "fmt" - "sync" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/metrics" - "github.com/ethereum/go-ethereum/swarm/log" - whisper "github.com/ethereum/go-ethereum/whisper/whisperv6" -) - -type KeyStore struct { - w *whisper.Whisper // key and encryption backend - - mx sync.RWMutex - pubKeyPool map[string]map[Topic]*pssPeer // mapping of hex public keys to peer address by topic. - symKeyPool map[string]map[Topic]*pssPeer // mapping of symkeyids to peer address by topic. - 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 -} - -func loadKeyStore() *KeyStore { - return &KeyStore{ - w: whisper.New(&whisper.DefaultConfig), - - pubKeyPool: make(map[string]map[Topic]*pssPeer), - symKeyPool: make(map[string]map[Topic]*pssPeer), - symKeyDecryptCache: make([]*string, defaultSymKeyCacheCapacity), - } -} - -func (ks *KeyStore) isSymKeyStored(key string) bool { - ks.mx.RLock() - defer ks.mx.RUnlock() - var ok bool - _, ok = ks.symKeyPool[key] - return ok -} - -func (ks *KeyStore) isPubKeyStored(key string) bool { - ks.mx.RLock() - defer ks.mx.RUnlock() - var ok bool - _, ok = ks.pubKeyPool[key] - return ok -} - -func (ks *KeyStore) getPeerSym(symkeyid string, topic Topic) (*pssPeer, bool) { - ks.mx.RLock() - defer ks.mx.RUnlock() - psp, ok := ks.symKeyPool[symkeyid][topic] - return psp, ok -} - -func (ks *KeyStore) getPeerPub(pubkeyid string, topic Topic) (*pssPeer, bool) { - ks.mx.RLock() - defer ks.mx.RUnlock() - psp, ok := ks.pubKeyPool[pubkeyid][topic] - return psp, ok -} - -// 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 (ks *KeyStore) 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, - } - ks.mx.Lock() - if _, ok := ks.pubKeyPool[pubkeyid]; !ok { - ks.pubKeyPool[pubkeyid] = make(map[Topic]*pssPeer) - } - ks.pubKeyPool[pubkeyid][topic] = psp - ks.mx.Unlock() - log.Trace("added pubkey", "pubkeyid", pubkeyid, "topic", topic, "address", address) - return 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 (ks *KeyStore) addSymmetricKeyToPool(keyid string, topic Topic, address PssAddress, addtocache bool, protected bool) { - psp := &pssPeer{ - address: address, - protected: protected, - } - ks.mx.Lock() - if _, ok := ks.symKeyPool[keyid]; !ok { - ks.symKeyPool[keyid] = make(map[Topic]*pssPeer) - } - ks.symKeyPool[keyid][topic] = psp - ks.mx.Unlock() - if addtocache { - ks.symKeyDecryptCacheCursor++ - ks.symKeyDecryptCache[ks.symKeyDecryptCacheCursor%cap(ks.symKeyDecryptCache)] = &keyid - } -} - -// Returns all recorded topic and address combination for a specific public key -func (ks *KeyStore) GetPublickeyPeers(keyid string) (topic []Topic, address []PssAddress, err error) { - ks.mx.RLock() - defer ks.mx.RUnlock() - for t, peer := range ks.pubKeyPool[keyid] { - topic = append(topic, t) - address = append(address, peer.address) - } - return topic, address, nil -} - -func (ks *KeyStore) getPeerAddress(keyid string, topic Topic) (PssAddress, error) { - ks.mx.RLock() - defer ks.mx.RUnlock() - if peers, ok := ks.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 (ks *KeyStore) processSym(envelope *whisper.Envelope) (*whisper.ReceivedMessage, string, PssAddress, error) { - metrics.GetOrRegisterCounter("pss.process.sym", nil).Inc(1) - - for i := ks.symKeyDecryptCacheCursor; i > ks.symKeyDecryptCacheCursor-cap(ks.symKeyDecryptCache) && i > 0; i-- { - symkeyid := ks.symKeyDecryptCache[i%cap(ks.symKeyDecryptCache)] - symkey, err := ks.w.GetSymKey(*symkeyid) - if err != nil { - continue - } - recvmsg, err := envelope.OpenSymmetric(symkey) - if err != nil { - continue - } - if !recvmsg.ValidateAndParse() { - return nil, "", nil, errors.New("symmetrically encrypted message has invalid signature or is corrupt") - } - var from PssAddress - ks.mx.RLock() - if ks.symKeyPool[*symkeyid][Topic(envelope.Topic)] != nil { - from = ks.symKeyPool[*symkeyid][Topic(envelope.Topic)].address - } - ks.mx.RUnlock() - ks.symKeyDecryptCacheCursor++ - ks.symKeyDecryptCache[ks.symKeyDecryptCacheCursor%cap(ks.symKeyDecryptCache)] = symkeyid - return recvmsg, *symkeyid, from, nil - } - return nil, "", nil, errors.New("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 (ks *Pss) processAsym(envelope *whisper.Envelope) (*whisper.ReceivedMessage, string, PssAddress, error) { - metrics.GetOrRegisterCounter("pss.process.asym", nil).Inc(1) - - recvmsg, err := envelope.OpenAsymmetric(ks.privateKey) - if err != nil { - return nil, "", nil, fmt.Errorf("could not decrypt message: %s", err) - } - // check signature (if signed), strip padding - if !recvmsg.ValidateAndParse() { - return nil, "", nil, errors.New("invalid message") - } - pubkeyid := common.ToHex(crypto.FromECDSAPub(recvmsg.Src)) - var from PssAddress - ks.mx.RLock() - if ks.pubKeyPool[pubkeyid][Topic(envelope.Topic)] != nil { - from = ks.pubKeyPool[pubkeyid][Topic(envelope.Topic)].address - } - ks.mx.RUnlock() - 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 (ks *Pss) cleanKeys() (count int) { - ks.mx.Lock() - defer ks.mx.Unlock() - for keyid, peertopics := range ks.symKeyPool { - var expiredtopics []Topic - for topic, psp := range peertopics { - if psp.protected { - continue - } - - var match bool - for i := ks.symKeyDecryptCacheCursor; i > ks.symKeyDecryptCacheCursor-cap(ks.symKeyDecryptCache) && i > 0; i-- { - cacheid := ks.symKeyDecryptCache[i%cap(ks.symKeyDecryptCache)] - if *cacheid == keyid { - match = true - } - } - if !match { - expiredtopics = append(expiredtopics, topic) - } - } - for _, topic := range expiredtopics { - delete(ks.symKeyPool[keyid], topic) - log.Trace("symkey cleanup deletion", "symkeyid", keyid, "topic", topic, "val", ks.symKeyPool[keyid]) - count++ - } - } - return count -} - -// Automatically generate a new symkey for a topic and address hint -func (ks *KeyStore) GenerateSymmetricKey(topic Topic, address PssAddress, addToCache bool) (string, error) { - keyid, err := ks.w.GenerateSymKey() - if err == nil { - ks.addSymmetricKeyToPool(keyid, topic, address, addToCache, false) - } - return keyid, err -} - -// Returns a symmetric key byte sequence stored in the whisper backend by its unique id. -// Passes on the error value from the whisper backend. -func (ks *KeyStore) GetSymmetricKey(symkeyid string) ([]byte, error) { - return ks.w.GetSymKey(symkeyid) -} - -// 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 (ks *KeyStore) SetSymmetricKey(key []byte, topic Topic, address PssAddress, addtocache bool) (string, error) { - if err := validateAddress(address); err != nil { - return "", err - } - return ks.setSymmetricKey(key, topic, address, addtocache, true) -} - -func (ks *KeyStore) setSymmetricKey(key []byte, topic Topic, address PssAddress, addtocache bool, protected bool) (string, error) { - keyid, err := ks.w.AddSymKeyDirect(key) - if err == nil { - ks.addSymmetricKeyToPool(keyid, topic, address, addtocache, protected) - } - return keyid, err -} diff --git a/vendor/github.com/ethereum/go-ethereum/swarm/pss/notify/notify.go b/vendor/github.com/ethereum/go-ethereum/swarm/pss/notify/notify.go deleted file mode 100644 index e9d40dc3..00000000 --- a/vendor/github.com/ethereum/go-ethereum/swarm/pss/notify/notify.go +++ /dev/null @@ -1,394 +0,0 @@ -package notify - -import ( - "crypto/ecdsa" - "fmt" - "sync" - - "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/p2p" - "github.com/ethereum/go-ethereum/rlp" - "github.com/ethereum/go-ethereum/swarm/log" - "github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/swarm/pss/ping.go b/vendor/github.com/ethereum/go-ethereum/swarm/pss/ping.go deleted file mode 100644 index ff635f40..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/ethereum/go-ethereum/p2p" - "github.com/ethereum/go-ethereum/p2p/protocols" - "github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/swarm/pss/protocol.go b/vendor/github.com/ethereum/go-ethereum/swarm/pss/protocol.go deleted file mode 100644 index 7f186f61..00000000 --- a/vendor/github.com/ethereum/go-ethereum/swarm/pss/protocol.go +++ /dev/null @@ -1,283 +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/ethereum/go-ethereum/p2p" - "github.com/ethereum/go-ethereum/p2p/protocols" - "github.com/ethereum/go-ethereum/rlp" - "github.com/ethereum/go-ethereum/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 { - if !p.Pss.isPubKeyStored(key) { - return nil, fmt.Errorf("asym key does not exist: %s", key) - } - p.RWPoolMu.Lock() - p.pubKeyRWPool[key] = rw - p.RWPoolMu.Unlock() - } else { - if !p.Pss.isSymKeyStored(key) { - return nil, fmt.Errorf("symkey does not exist: %s", key) - } - 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/vendor/github.com/ethereum/go-ethereum/swarm/pss/pss.go b/vendor/github.com/ethereum/go-ethereum/swarm/pss/pss.go deleted file mode 100644 index 0d02c9b8..00000000 --- a/vendor/github.com/ethereum/go-ethereum/swarm/pss/pss.go +++ /dev/null @@ -1,857 +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/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/metrics" - "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/rpc" - "github.com/ethereum/go-ethereum/swarm/log" - "github.com/ethereum/go-ethereum/swarm/network" - "github.com/ethereum/go-ethereum/swarm/pot" - "github.com/ethereum/go-ethereum/swarm/storage" - whisper "github.com/ethereum/go-ethereum/whisper/whisperv6" - "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 - *KeyStore - - privateKey *ecdsa.PrivateKey // pss can have it's own independent key - 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 - - // 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 - topicHandlerCapsMu sync.RWMutex - - // 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, - KeyStore: loadKeyStore(), - - privateKey: params.privateKey, - 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), - - 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 -///////////////////////////////////////////////////////////////////// - -func (p *Pss) getTopicHandlerCaps(topic Topic) (hc *handlerCaps, found bool) { - p.topicHandlerCapsMu.RLock() - defer p.topicHandlerCapsMu.RUnlock() - hc, found = p.topicHandlerCaps[topic] - return -} - -func (p *Pss) setTopicHandlerCaps(topic Topic, hc *handlerCaps) { - p.topicHandlerCapsMu.Lock() - defer p.topicHandlerCapsMu.Unlock() - p.topicHandlerCaps[topic] = hc -} - -// 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", "capabilities", hndlr.caps) - } - if hndlr.caps == nil { - hndlr.caps = &handlerCaps{} - } - handlers[hndlr] = true - - capabilities, ok := p.getTopicHandlerCaps(*topic) - if !ok { - capabilities = &handlerCaps{} - p.setTopicHandlerCaps(*topic, capabilities) - } - - if hndlr.caps.raw { - capabilities.raw = true - } - if hndlr.caps.prox { - capabilities.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.setTopicHandlerCaps(*topic, caps) - return - } - delete(handlers, hndlr) -} - -// 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 capabilities, ok := p.getTopicHandlerCaps(psstopic); ok { - if !capabilities.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 capabilities, ok := p.getTopicHandlerCaps(psstopic); ok { - isProx = capabilities.prox - } - isRecipient := p.isSelfPossibleRecipient(pssmsg, isProx) - if !isRecipient { - log.Trace("pss msg forwarding ===>", "pss", common.ToHex(p.BaseAddr()), "prox", isProx) - return p.enqueue(pssmsg) - } - - log.Trace("pss msg processing <===", "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 || prox { - err = p.enqueue(pssmsg) - } - p.executeHandlers(psstopic, payload, from, raw, prox, asymmetric, keyid) - return err -} - -// copy all registered handlers for respective topic in order to avoid data race or deadlock -func (p *Pss) getHandlers(topic Topic) (ret []*handler) { - p.handlersMu.RLock() - defer p.handlersMu.RUnlock() - for k := range p.handlers[topic] { - ret = append(ret, k) - } - return ret -} - -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: 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 capabilities, ok := p.getTopicHandlerCaps(topic); ok { - if p.isSelfPossibleRecipient(pssMsg, true) && capabilities.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) - } - psp, ok := p.getPeerSym(symkeyid, topic) - 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) - } - psp, ok := p.getPeerPub(pubkeyid, topic) - 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 capabilities, ok := p.getTopicHandlerCaps(topic); ok { - if p.isSelfPossibleRecipient(pssMsg, true) && capabilities.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 = 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/vendor/github.com/ethereum/go-ethereum/swarm/pss/testdata/snapshot_128.json b/vendor/github.com/ethereum/go-ethereum/swarm/pss/testdata/snapshot_128.json deleted file mode 100644 index 8e1bc88b..00000000 --- a/vendor/github.com/ethereum/go-ethereum/swarm/pss/testdata/snapshot_128.json +++ /dev/null @@ -1 +0,0 @@ -{"nodes":[{"node":{"info":{"id":"7dc5e8d8180c1bc7ebbee11a47fc96e8fe8b2d71c30cbc4aa1cf99e8eb6afcac","name":"node_7dc5e8d8180c1bc7ebbee11a47fc96e8fe8b2d71c30cbc4aa1cf99e8eb6afcac","enode":"enode://0c52fa76a36dd072dbe11c5e7ebc82ef6efdd0fa3da10a006f64a34abc8a9f4d721a5c4fc4ef5415438ff721ed76effac71cb456683d037aace2db5f49026522@127.0.0.1:0","enr":"0xf88fb84036d1f0bc1cc1963dccf82616505bc245b2af797a3ded53470756e0453fd7fde54210f291c7326eae82253d256d7367b7b8568b05250d5a2f08e6c83b1981d1cb0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1020c52fa76a36dd072dbe11c5e7ebc82ef6efdd0fa3da10a006f64a34abc8a9f4d","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"fcXo2BgMG8frvuEaR/yW6P6LLXHDDLxKoc+Z6Otq/Kw=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 7dc5e8\npopulation: 34 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 12 cfbb c3a1 d6ff d0f3 | 63 edc8 (0) ed32 (0) ebca (0) ea60 (0)\n001 2 0bcf 027f | 27 286a (0) 2a22 (0) 213b (0) 2434 (0)\n002 3 539d 48b6 4b24 | 15 5d60 (0) 5a01 (0) 5abc (0) 5776 (0)\n003 7 6742 667e 6982 6e5c | 11 6210 (0) 645b (0) 667e (0) 6742 (0)\n004 5 73b8 734e 7355 772e | 6 7639 (0) 772e (0) 757a (0) 73b8 (0)\n005 2 78cb 7b92 | 2 78cb (0) 7b92 (0)\n============ DEPTH: 6 ==========================================\n006 2 7f87 7fbc | 2 7f87 (0) 7fbc (0)\n007 1 7cf4 | 1 7cf4 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"7dc5e8d8180c1bc7ebbee11a47fc96e8fe8b2d71c30cbc4aa1cf99e8eb6afcac","private_key":"c917cec67eeafea4150785766f590f1c97310aa195be916d29051a26b3171a53","name":"node_7dc5e8d8180c1bc7ebbee11a47fc96e8fe8b2d71c30cbc4aa1cf99e8eb6afcac","services":["bzz","pss"],"enable_msg_events":true,"port":33259},"up":true}},{"node":{"info":{"id":"027fb496438782583f78fb76999336eed7fb672a9c9ea50d04df580e6eb21377","name":"node_027fb496438782583f78fb76999336eed7fb672a9c9ea50d04df580e6eb21377","enode":"enode://d49541d31306ef162578a3f30e389a71136992741d3611b524f2a1b37836ce7ee1dd57cc939af45575d8d483f71883fd82b19a52373b635a06117cf4a4ef067e@127.0.0.1:0","enr":"0xf88fb840ca9a8de2b1e9313144320c6cda217eccf7965c113dfd13a673882f078c78b4c16eaa6a88000df314c35dbc9734baea21b359cead3b4fc396d771f9ddb0347d1e0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102d49541d31306ef162578a3f30e389a71136992741d3611b524f2a1b37836ce7e","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"An+0lkOHglg/ePt2mZM27tf7ZyqcnqUNBN9YDm6yE3c=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 027fb4\npopulation: 35 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 8 9d3c 9626 91eb aebd | 63 ebca (0) ea60 (0) ea0e (0) edc8 (0)\n001 8 4cd0 4b24 6c82 667e | 38 5d60 (0) 5a01 (0) 5abc (0) 5776 (0)\n002 5 3cb1 3ee4 2459 26d1 | 12 286a (0) 2a22 (0) 213b (0) 2434 (0)\n003 4 1929 1be4 109e 13bc | 4 109e (0) 13bc (0) 1be4 (0) 1929 (0)\n004 3 0ff6 0ab9 0bcf | 3 0ff6 (0) 0ab9 (0) 0bcf (0)\n005 3 06b9 0427 0506 | 3 06b9 (0) 0427 (0) 0506 (0)\n006 1 018a | 1 018a (0)\n007 1 0390 | 1 0390 (0)\n============ DEPTH: 8 ==========================================\n008 0 | 0\n009 1 0218 | 1 0218 (0)\n010 0 | 0\n011 1 026d | 1 026d (0)\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"027fb496438782583f78fb76999336eed7fb672a9c9ea50d04df580e6eb21377","private_key":"35e8d68fdca3b15bdf43c1cde2ec85199450a4588a06d9669dadc25c6921fa02","name":"node_027fb496438782583f78fb76999336eed7fb672a9c9ea50d04df580e6eb21377","services":["bzz","pss"],"enable_msg_events":true,"port":41117},"up":true}},{"node":{"info":{"id":"03907380afcd52238f3d84a8dee3df599c7f2f9b90fbc1271ee88bdb52acbd58","name":"node_03907380afcd52238f3d84a8dee3df599c7f2f9b90fbc1271ee88bdb52acbd58","enode":"enode://fec12f13138cbdff7808d59f28b3b381ead6ce29e9e229304138d734fe76ca3c3a45e95962022868018fcf1f1fa0e1ac1d8882564c7e0cde1529db9b3232b19a@127.0.0.1:0","enr":"0xf88fb840dfe0f2eb384187472aca67b943618b6dbaf1909ced3442bcc018bee08cc8a00a216115d3306fae614384ddd4ecedd94e35505ba6c7a8f8a8fc9a2f17ea862a4b0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102fec12f13138cbdff7808d59f28b3b381ead6ce29e9e229304138d734fe76ca3c","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"A5BzgK/NUiOPPYSo3uPfWZx/L5uQ+8EnHuiL21KsvVg=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 039073\npopulation: 31 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 8 91eb 9d3c ed32 e16b | 63 ebca (0) ea60 (0) ea0e (0) edc8 (0)\n001 4 4b24 757a 667e 6ecb | 38 5d60 (0) 5a01 (0) 5abc (0) 558e (0)\n002 5 39db 3ee4 3cb1 26d1 | 12 286a (0) 2a22 (0) 213b (0) 2459 (0)\n003 4 13bc 109e 1be4 1929 | 4 109e (0) 13bc (0) 1be4 (0) 1929 (0)\n004 3 0ab9 0bcf 0ff6 | 3 0ff6 (0) 0ab9 (0) 0bcf (0)\n005 3 06b9 0427 0506 | 3 06b9 (0) 0427 (0) 0506 (0)\n006 1 018a | 1 018a (0)\n============ DEPTH: 7 ==========================================\n007 3 0218 026d 027f | 3 0218 (0) 026d (0) 027f (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"03907380afcd52238f3d84a8dee3df599c7f2f9b90fbc1271ee88bdb52acbd58","private_key":"b4db734c8cd058c2d749fff4c60c20dc42442061273efc31e209e2410ea38934","name":"node_03907380afcd52238f3d84a8dee3df599c7f2f9b90fbc1271ee88bdb52acbd58","services":["bzz","pss"],"enable_msg_events":true,"port":33597},"up":true}},{"node":{"info":{"id":"1929a84bcd64bf002d0afb16249466c5b660123174a1fc1bf881913f8c87d1fd","name":"node_1929a84bcd64bf002d0afb16249466c5b660123174a1fc1bf881913f8c87d1fd","enode":"enode://7b0a4f58064407b6a89a456dd7c991fa39ac01667f7731f4086a9e77cac79dbcaad821bf88ef0eae4cc2a07b14ea9bfea96ab342de836f2071b9a1a92bef83f4@127.0.0.1:0","enr":"0xf88fb840a4ea2bad27e691d6f015407aeb49fd6ef8e053ce798b351ed6925d81856bfe6736edaccb49c93ac2255f173fa0fda36fed07b165e6efe95bf93d54cd4bffabf30183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1027b0a4f58064407b6a89a456dd7c991fa39ac01667f7731f4086a9e77cac79dbc","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"GSmoS81kvwAtCvsWJJRmxbZgEjF0ofwb+IGRP4yH0f0=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 1929a8\npopulation: 33 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 8 a2ba 9d3c 895b e16b | 63 ebca (0) ea60 (0) ea0e (0) edc8 (0)\n001 3 4b24 757a 6ecb | 38 5d60 (0) 5a01 (0) 5abc (0) 558e (0)\n002 9 2459 26d1 2a22 3ee4 | 12 286a (0) 2a22 (0) 213b (0) 2434 (0)\n003 10 0ff6 0bcf 0ab9 0427 | 11 0ff6 (0) 0ab9 (0) 0bcf (0) 06b9 (0)\n============ DEPTH: 4 ==========================================\n004 2 109e 13bc | 2 109e (0) 13bc (0)\n005 0 | 0\n006 1 1be4 | 1 1be4 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"1929a84bcd64bf002d0afb16249466c5b660123174a1fc1bf881913f8c87d1fd","private_key":"db5a5448de2eddbf38d0c7d1521fef311345df8517384c0d6b57a7e674ddad53","name":"node_1929a84bcd64bf002d0afb16249466c5b660123174a1fc1bf881913f8c87d1fd","services":["bzz","pss"],"enable_msg_events":true,"port":45321},"up":true}},{"node":{"info":{"id":"6ecb11fc5acc16ecd70351410fa18ec44a2a83d9e778cf25b85a7535493456b7","name":"node_6ecb11fc5acc16ecd70351410fa18ec44a2a83d9e778cf25b85a7535493456b7","enode":"enode://e21a50afba059b155fdd0211a966f7169bcbdb74404cb9ed08f192236eceea4c7b9ced1604b358e45c7153c5a7f75a6749f191d7021e0208d4df9aae45f23804@127.0.0.1:0","enr":"0xf88fb840997c2ef382cf15d5ad18e430d159fc5502d452c770bd172de18a323d9d5f59bc6432167188e9894a86efc4fa5721f7d28bafc11fee19e45a03f76624374b4fa30183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102e21a50afba059b155fdd0211a966f7169bcbdb74404cb9ed08f192236eceea4c","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"bssR/FrMFuzXA1FBD6GOxEoqg9nneM8luFp1NUk0Vrc=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 6ecb11\npopulation: 36 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 10 f410 f5c4 e16b e0b1 | 63 edc8 (0) ed32 (0) ebca (0) ea60 (0)\n001 3 3ee4 0390 1929 | 27 286a (0) 2a22 (0) 213b (0) 2459 (0)\n002 9 5d60 5abc 539d 5776 | 15 5d60 (0) 5a01 (0) 5abc (0) 558e (0)\n003 7 7355 734e 73b8 772e | 12 78cb (0) 7b92 (0) 7fbc (0) 7f87 (0)\n004 2 667e 6728 | 5 6210 (0) 645b (0) 667e (0) 6742 (0)\n005 1 6982 | 1 6982 (0)\n============ DEPTH: 6 ==========================================\n006 3 6c82 6c02 6d60 | 3 6d60 (0) 6c82 (0) 6c02 (0)\n007 0 | 0\n008 1 6e5c | 1 6e5c (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"6ecb11fc5acc16ecd70351410fa18ec44a2a83d9e778cf25b85a7535493456b7","private_key":"28fb42373087a7839e6469456ad91bd1d4c1ac2998d4255bdb18559e6594b6d8","name":"node_6ecb11fc5acc16ecd70351410fa18ec44a2a83d9e778cf25b85a7535493456b7","services":["bzz","pss"],"enable_msg_events":true,"port":44113},"up":true}},{"node":{"info":{"id":"ad0d0dc5d4114ee4482d6c9bd4e46683327abf2b92df0d242d79019963876668","name":"node_ad0d0dc5d4114ee4482d6c9bd4e46683327abf2b92df0d242d79019963876668","enode":"enode://3d426d150fd9ee0de2b594986006891aed8ab3f74cde7ad6cc686e3a10992f727c3211fd7e1c70bd5d1a018adf0672f4c56fe30638e9c51da6156884ccb284e5@127.0.0.1:0","enr":"0xf88fb84061b157c270f717e96d2170c813f51c28cb513f10730481c1f0dd8325c02d72c512a23741c2968d0ca703d403e549c557be9ccba33b9817ab6cff09ec2630c41e0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1033d426d150fd9ee0de2b594986006891aed8ab3f74cde7ad6cc686e3a10992f72","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"rQ0NxdQRTuRILWyb1ORmgzJ6vyuS3w0kLXkBmWOHZmg=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: ad0d0d\npopulation: 30 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 109e 0bcf 6210 6ecb | 65 286a (0) 2a22 (0) 213b (0) 2434 (0)\n001 2 cfbb d0f3 | 30 edc8 (0) ed32 (0) ebca (0) ea60 (0)\n002 11 8cf9 895b 89c8 8be4 | 16 86ca (0) 83dc (0) 82f0 (0) 8be4 (0)\n003 5 b70e b2b9 b381 b841 | 8 b8e1 (0) b841 (0) b92a (0) b486 (0)\n004 5 a7a6 a75a a085 a320 | 5 a320 (0) a2ba (0) a085 (0) a7a6 (0)\n============ DEPTH: 5 ==========================================\n005 0 | 0\n006 3 afa3 ae67 aebd | 3 ae67 (0) aebd (0) afa3 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"ad0d0dc5d4114ee4482d6c9bd4e46683327abf2b92df0d242d79019963876668","private_key":"d01704345488dae1946ebc66f4903380ce4b938bed28d2aca5e644e493351f6d","name":"node_ad0d0dc5d4114ee4482d6c9bd4e46683327abf2b92df0d242d79019963876668","services":["bzz","pss"],"enable_msg_events":true,"port":34797},"up":true}},{"node":{"info":{"id":"d0f398969480f3df3587f6d47546ff1261cad4d2e9c26ff3077e35ae1b26153e","name":"node_d0f398969480f3df3587f6d47546ff1261cad4d2e9c26ff3077e35ae1b26153e","enode":"enode://4237bb190c2cafcef9ac7ba0cbccf2e75e97a4e8c624e8adc279e935d9c7c0738ab94cb32406678bb61010467d21fc56071334a2860ca5d3e2fd5d414d293f73@127.0.0.1:0","enr":"0xf88fb8405ab3e3f555db63f58404371549be2cf78e94aa9475e7f4b9adc6aa73b5e878df2480291bc05f8cf0166ddea6c24f0fa246e9646d59fce792c15ea71c97be36010183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1034237bb190c2cafcef9ac7ba0cbccf2e75e97a4e8c624e8adc279e935d9c7c073","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"0POYlpSA8981h/bUdUb/EmHK1NLpwm/zB341rhsmFT4=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: d0f398\npopulation: 30 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 10 38ab 26d1 2a22 4b24 | 65 286a (0) 2a22 (0) 213b (0) 2434 (0)\n001 4 895b 92a1 a75a ad0d | 33 86ca (0) 83dc (0) 82f0 (0) 8be4 (0)\n002 6 ebca e55d e0b1 e16b | 15 edc8 (0) ed32 (0) ebca (0) ea60 (0)\n003 5 c3a1 c8e5 ca03 cbc5 | 9 c181 (0) c3a1 (0) c8e5 (0) ca03 (0)\n004 3 db08 dfae dc97 | 3 db08 (0) dfae (0) dc97 (0)\n============ DEPTH: 5 ==========================================\n005 1 d6ff | 1 d6ff (0)\n006 1 d224 | 1 d224 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"d0f398969480f3df3587f6d47546ff1261cad4d2e9c26ff3077e35ae1b26153e","private_key":"875e777570710eaf1d860d33b1d4e4afa6b44b0660cfe5be4aa6cc294c546e66","name":"node_d0f398969480f3df3587f6d47546ff1261cad4d2e9c26ff3077e35ae1b26153e","services":["bzz","pss"],"enable_msg_events":true,"port":33929},"up":true}},{"node":{"info":{"id":"cfbb9ea682becadeab10bbd080ba8e93510085a87ac519e434964faa222fc275","name":"node_cfbb9ea682becadeab10bbd080ba8e93510085a87ac519e434964faa222fc275","enode":"enode://8efcf09e90d2d51bd3c092605c42b4779dd2e58033f47e0334f6888cb53a11d9671659ea85a7b0c22913977f61e1a604b39360d562853873d8b3def8ab011126@127.0.0.1:0","enr":"0xf88fb840f2c79356478735337278a426353488d61e749b316e38e2d4f04fe88cd92f738a2546d62d6fe2bcce1af65b06b7d7345dc3f7c8571101680d66301f4a71c87b3a0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1028efcf09e90d2d51bd3c092605c42b4779dd2e58033f47e0334f6888cb53a11d9","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"z7uepoK+yt6rELvQgLqOk1EAhah6xRnkNJZPqiIvwnU=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: cfbb9e\npopulation: 28 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 7 4b24 6d60 6c02 7fbc | 65 286a (0) 2a22 (0) 213b (0) 2434 (0)\n001 4 92a1 9d3c b381 ad0d | 33 86ca (0) 83dc (0) 82f0 (0) 8b76 (0)\n002 5 e55d e0ea e0b1 e16b | 15 edc8 (0) ed32 (0) ebca (0) ea60 (0)\n003 4 dc97 d6ff d224 d0f3 | 6 db08 (0) dfae (0) dc97 (0) d6ff (0)\n004 2 c181 c3a1 | 2 c181 (0) c3a1 (0)\n005 3 c8e5 ca03 cbc5 | 3 c8e5 (0) ca03 (0) cbc5 (0)\n006 1 cdcd | 1 cdcd (0)\n============ DEPTH: 7 ==========================================\n007 2 cec3 ce99 | 2 cec3 (0) ce99 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"cfbb9ea682becadeab10bbd080ba8e93510085a87ac519e434964faa222fc275","private_key":"4269717f6ea28ec4c5441c5b5423a2e7c38b7d2b7d7ccc5172da8fad2d709f3b","name":"node_cfbb9ea682becadeab10bbd080ba8e93510085a87ac519e434964faa222fc275","services":["bzz","pss"],"enable_msg_events":true,"port":35713},"up":true}},{"node":{"info":{"id":"734e029ed25485edd49b93dd9e85b6e7657f860e4ded4bc8a5094f512ae5836b","name":"node_734e029ed25485edd49b93dd9e85b6e7657f860e4ded4bc8a5094f512ae5836b","enode":"enode://8bf678fe58741608b5ef92a443588c6eb7f2fe2cf9185e03f908d034e13b4c764e4ed1dc17c36b695812a5c110abb0c18ef88c32727ee10b3868acd09bba0cb4@127.0.0.1:0","enr":"0xf88fb84070de48a3c1c962367c4ff449d327203595b0e1c1ca9e490abd350b47ea74aa7e444e094ec367c1f4ebac57f0289314f2e165f40c16cd4631859c490adce7dc3e0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1028bf678fe58741608b5ef92a443588c6eb7f2fe2cf9185e03f908d034e13b4c76","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"c04CntJUhe3Um5PdnoW252V/hg5N7UvIpQlPUSrlg2s=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 734e02\npopulation: 33 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 e55d f5c4 d6ff d0f3 | 63 86ca (0) 83dc (0) 82f0 (0) 8be4 (0)\n001 2 2a22 0bcf | 27 0ff6 (0) 0ab9 (0) 0bcf (0) 06b9 (0)\n002 7 5abc 539d 419a 4167 | 15 5d60 (0) 5a01 (0) 5abc (0) 5776 (0)\n003 10 6c02 6d60 6ecb 6e5c | 11 6210 (0) 645b (0) 667e (0) 6742 (0)\n004 4 7b92 7f87 7dc5 7cf4 | 6 78cb (0) 7b92 (0) 7f87 (0) 7fbc (0)\n005 3 7639 772e 757a | 3 7639 (0) 772e (0) 757a (0)\n============ DEPTH: 6 ==========================================\n006 0 | 0\n007 0 | 0\n008 1 73b8 | 1 73b8 (0)\n009 0 | 0\n010 0 | 0\n011 1 7355 | 1 7355 (0)\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"734e029ed25485edd49b93dd9e85b6e7657f860e4ded4bc8a5094f512ae5836b","private_key":"0bb7de51881b72244a45a762173749b52aac74eb3a8c1d48f3a62ccd0302fc4a","name":"node_734e029ed25485edd49b93dd9e85b6e7657f860e4ded4bc8a5094f512ae5836b","services":["bzz","pss"],"enable_msg_events":true,"port":41955},"up":true}},{"node":{"info":{"id":"f5c4d28df5973ec0292221a875e8446323f339409d93f0f7385990126908a3c3","name":"node_f5c4d28df5973ec0292221a875e8446323f339409d93f0f7385990126908a3c3","enode":"enode://961a9e131513a2c5774c0dc13eb30f2ef01d760ff0d89e535cfda5a6f9295b8f3b0bd2e14350fd396460c2dfab8522f1257f4331f3ea483868e6079a1fb5da7a@127.0.0.1:0","enr":"0xf88fb8409230987fe11342ff370645f1e38d4fdf2d2d9d2c49f2cd3207b760f02c7c517c15952dc852b3d4d0c2dc88387b2c301f5f0ae7c0e668b9616d8ed680cad31ca10183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102961a9e131513a2c5774c0dc13eb30f2ef01d760ff0d89e535cfda5a6f9295b8f","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"9cTSjfWXPsApIiGodehEYyPzOUCdk/D3OFmQEmkIo8M=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: f5c4d2\npopulation: 39 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 12 3ee4 13bc 1929 027f | 65 0ff6 (0) 0ab9 (0) 0bcf (0) 06b9 (0)\n001 11 b70e b381 b2b9 a085 | 33 b486 (0) b70e (0) b16d (0) b2b9 (0)\n002 6 c3a1 ca03 cfbb d6ff | 15 db08 (0) dfae (0) dc97 (0) d6ff (0)\n003 6 ed32 ea0e ebca e16b | 10 ebca (0) ea60 (0) ea0e (0) edc8 (0)\n============ DEPTH: 4 ==========================================\n004 0 | 0\n005 2 f361 f360 | 2 f361 (0) f360 (0)\n006 1 f74e | 1 f74e (0)\n007 1 f410 | 1 f410 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"f5c4d28df5973ec0292221a875e8446323f339409d93f0f7385990126908a3c3","private_key":"46e5632ca34485b42e08ec702fe84421169074e80c41bc39e596de3815c6e021","name":"node_f5c4d28df5973ec0292221a875e8446323f339409d93f0f7385990126908a3c3","services":["bzz","pss"],"enable_msg_events":true,"port":39029},"up":true}},{"node":{"info":{"id":"91eba9f9c8f2929d38f43a0c7efa809c0d2d59a31cbf2760c90e73d20266d528","name":"node_91eba9f9c8f2929d38f43a0c7efa809c0d2d59a31cbf2760c90e73d20266d528","enode":"enode://ae0bd86a797b580157ab4c21533c6f6c1780cb3c0cee9d7e2ff134e014f06b850f6d15e48654d074b11ee4d02fe3ea740579c66308e511746fd4105e2d21afff@127.0.0.1:0","enr":"0xf88fb84001756e4ad603612a22013c330b2cf03e87dc2141a015bede20c5765ed475cacb68aa1b9cec229906947a5e70ca06f66834998d2f887e2017ac427b638f9a09220183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103ae0bd86a797b580157ab4c21533c6f6c1780cb3c0cee9d7e2ff134e014f06b85","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"keup+cjykp049DoMfvqAnA0tWaMcvydgyQ5z0gJm1Sg=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 91eba9\npopulation: 26 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 8 7b92 39db 109e 0390 | 65 0ff6 (0) 0ab9 (0) 0bcf (0) 06b9 (0)\n001 3 c3a1 e16b f5c4 | 30 db08 (0) dfae (0) dc97 (0) d6ff (0)\n002 6 afa3 a320 b70e b2b9 | 17 b486 (0) b70e (0) b16d (0) b2b9 (0)\n003 2 89c8 895b | 8 86ca (0) 83dc (0) 82f0 (0) 8b76 (0)\n004 4 9d3c 9e02 9ee7 9a92 | 4 9a92 (0) 9ee7 (0) 9e02 (0) 9d3c (0)\n============ DEPTH: 5 ==========================================\n005 2 9626 957d | 2 957d (0) 9626 (0)\n006 1 92a1 | 1 92a1 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"91eba9f9c8f2929d38f43a0c7efa809c0d2d59a31cbf2760c90e73d20266d528","private_key":"4836585cbd3b3547cff5060ac87f6987ada66424120a9b9538775f47d0f7df73","name":"node_91eba9f9c8f2929d38f43a0c7efa809c0d2d59a31cbf2760c90e73d20266d528","services":["bzz","pss"],"enable_msg_events":true,"port":44261},"up":true}},{"node":{"info":{"id":"e16b12c708bc5e0545009daed44733c52d7450ccc797d158dd41a3bc9507b6be","name":"node_e16b12c708bc5e0545009daed44733c52d7450ccc797d158dd41a3bc9507b6be","enode":"enode://13b2a9865ee51fe3d87fc17ec8cfe97872514aba0eff2dd9a2c4ad9fc1c23b95d14c057a24db7f653bd6a8beb80be7154482ae88ebd1c6a6cfbea08c7fc93951@127.0.0.1:0","enr":"0xf88fb84082f8084805a5a7bd16721d9d3440e711bcb186978b79670fdd73217dd65bbb844a407d171eebfa8bfacff33277985dddc10db2c12f6a3e2bdc0e776ca994dad80183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10313b2a9865ee51fe3d87fc17ec8cfe97872514aba0eff2dd9a2c4ad9fc1c23b95","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"4WsSxwi8XgVFAJ2u1EczxS10UMzHl9FY3UGjvJUHtr4=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: e16b12\npopulation: 41 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 14 6728 6ecb 6982 7dc5 | 65 0ff6 (0) 0ab9 (0) 0bcf (0) 06b9 (0)\n001 10 b381 afa3 a085 8cf9 | 33 b486 (0) b70e (0) b16d (0) b2b9 (0)\n002 5 c3a1 cfbb dfae d224 | 15 db08 (0) dfae (0) dc97 (0) d6ff (0)\n003 5 f360 f361 f410 f5c4 | 5 f361 (0) f360 (0) f74e (0) f410 (0)\n004 3 ed32 edc8 ea0e | 5 ebca (0) ea60 (0) ea0e (0) edc8 (0)\n005 2 e77f e55d | 2 e77f (0) e55d (0)\n============ DEPTH: 6 ==========================================\n006 0 | 0\n007 2 e0ea e0b1 | 2 e0ea (0) e0b1 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"e16b12c708bc5e0545009daed44733c52d7450ccc797d158dd41a3bc9507b6be","private_key":"5ea17901397d5aaeb179c857d6c09266e923a0215431888d768e5539165ad4e8","name":"node_e16b12c708bc5e0545009daed44733c52d7450ccc797d158dd41a3bc9507b6be","services":["bzz","pss"],"enable_msg_events":true,"port":37359},"up":true}},{"node":{"info":{"id":"962676818c17fae1ffc52fc29318c44f9b8c980afd6d3e98217b4088d568a808","name":"node_962676818c17fae1ffc52fc29318c44f9b8c980afd6d3e98217b4088d568a808","enode":"enode://bfd89002d57335d3e459e80f6a6d01e10639d4fcc760c399b6ca84a4ac5af371aae339acaf6d3a3af784091aec154057c194534e146eec65c841ee33441bf00f@127.0.0.1:0","enr":"0xf88fb84052f31a4caf0d9b1de4fc6c97990f405550c3648b4538d159b61e3b3e25d7125368269c12bc6fbf114ab141f378f013d37094dee41bd8ca773529195ea998253e0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103bfd89002d57335d3e459e80f6a6d01e10639d4fcc760c399b6ca84a4ac5af371","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"liZ2gYwX+uH/xS/CkxjET5uMmAr9bT6YIXtAiNVoqAg=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 962676\npopulation: 30 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 11 0ab9 0bcf 0506 018a | 65 0ff6 (0) 0ab9 (0) 0bcf (0) 06b9 (0)\n001 3 c3a1 f361 e16b | 30 db08 (0) dfae (0) dc97 (0) d6ff (0)\n002 3 b92a a320 ad0d | 17 b486 (0) b70e (0) b16d (0) b2b9 (0)\n003 7 86ca 83dc 82f0 8cf9 | 8 86ca (0) 83dc (0) 82f0 (0) 8be4 (0)\n004 3 9d3c 9e02 9a92 | 4 9d3c (0) 9ee7 (0) 9e02 (0) 9a92 (0)\n============ DEPTH: 5 ==========================================\n005 2 92a1 91eb | 2 92a1 (0) 91eb (0)\n006 1 957d | 1 957d (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"962676818c17fae1ffc52fc29318c44f9b8c980afd6d3e98217b4088d568a808","private_key":"85a02e6c73fe7d4d4c93334d0c723acd5ff2e71b08e80169c82302596e77fc01","name":"node_962676818c17fae1ffc52fc29318c44f9b8c980afd6d3e98217b4088d568a808","services":["bzz","pss"],"enable_msg_events":true,"port":45605},"up":true}},{"node":{"info":{"id":"6c029114a9f73d69a42e591cf2d13107eff038d3eda8abb0242d9d6d169f05c7","name":"node_6c029114a9f73d69a42e591cf2d13107eff038d3eda8abb0242d9d6d169f05c7","enode":"enode://e19d4c9793aa8f6a9a32bb81ca986936d9ea49e442c801424ae1b66b0494fc290b62403e22282d1d77439b36dfe907efe0b60126280ca75babc23becb470b1e7@127.0.0.1:0","enr":"0xf88fb84081ecd7a679832795b6c915559cf9bcd02e9b61f37e131f88935755d13d0ff6ab34c388d54a00d8d71d670052b1bac1301f7ff0527db702b60863ca194d14f1210183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103e19d4c9793aa8f6a9a32bb81ca986936d9ea49e442c801424ae1b66b0494fc29","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"bAKRFKn3PWmkLlkc8tExB+/wONPtqKuwJC2dbRafBcc=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 6c0291\npopulation: 32 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 10 f410 cfbb c3a1 d0f3 | 63 db08 (0) dfae (0) dc97 (0) d6ff (0)\n001 2 3ee4 372d | 27 0ff6 (0) 0ab9 (0) 0bcf (0) 06b9 (0)\n002 7 539d 558e 5a01 5abc | 15 5d60 (0) 5a01 (0) 5abc (0) 5776 (0)\n003 6 7b92 7dc5 734e 7355 | 12 78cb (0) 7b92 (0) 7fbc (0) 7f87 (0)\n004 2 667e 6728 | 5 6210 (0) 645b (0) 6742 (0) 6728 (0)\n005 1 6982 | 1 6982 (0)\n006 2 6ecb 6e5c | 2 6e5c (0) 6ecb (0)\n============ DEPTH: 7 ==========================================\n007 1 6d60 | 1 6d60 (0)\n008 1 6c82 | 1 6c82 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"6c029114a9f73d69a42e591cf2d13107eff038d3eda8abb0242d9d6d169f05c7","private_key":"40e5884353d6096401012e695c215b05187562c0e32a97ee4abcd43c25a0ad55","name":"node_6c029114a9f73d69a42e591cf2d13107eff038d3eda8abb0242d9d6d169f05c7","services":["bzz","pss"],"enable_msg_events":true,"port":37519},"up":true}},{"node":{"info":{"id":"372d47374a57d18cf134a1f8fc2d2fc10dfacfc0be9ed883183a349c896b3793","name":"node_372d47374a57d18cf134a1f8fc2d2fc10dfacfc0be9ed883183a349c896b3793","enode":"enode://7cd3bb16716b1076e17d80959f4ef0fc541fc21ed845356a47f3bda9b1b7cc3c69114f4f796a56b301fa411ec706f696106d9b052accfc958fcd51e391c51ffb@127.0.0.1:0","enr":"0xf88fb8406c50fb4ef43704e45da206358753811875825f0bb9f88f7e4510685d0045fdf252af80cdb5e4d427ca21741e0b0fda40d2b789a1cd793aef76efcceebf4250040183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1037cd3bb16716b1076e17d80959f4ef0fc541fc21ed845356a47f3bda9b1b7cc3c","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"Ny1HN0pX0YzxNKH4/C0vwQ36z8C+ntiDGDo0nIlrN5M=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 372d47\npopulation: 28 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 ea60 89c8 895b a085 | 63 db08 (0) dfae (0) dc97 (0) d6ff (0)\n001 8 4a18 48b6 539d 558e | 38 5d60 (0) 5a01 (0) 5abc (0) 5776 (0)\n002 5 0506 0218 0bcf 1be4 | 15 0ff6 (0) 0ab9 (0) 0bcf (0) 06b9 (0)\n003 5 2a22 213b 2459 2434 | 6 213b (0) 2459 (0) 2434 (0) 26d1 (0)\n============ DEPTH: 4 ==========================================\n004 5 38ab 39db 3e56 3ee4 | 5 39db (0) 38ab (0) 3e56 (0) 3ee4 (0)\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"372d47374a57d18cf134a1f8fc2d2fc10dfacfc0be9ed883183a349c896b3793","private_key":"1be8d297f334edb94c9ea51d8debf701671d9b6417ac0686d6602848d866ee4e","name":"node_372d47374a57d18cf134a1f8fc2d2fc10dfacfc0be9ed883183a349c896b3793","services":["bzz","pss"],"enable_msg_events":true,"port":33327},"up":true}},{"node":{"info":{"id":"a75abd0dce5a488b7e06f91fab7a92ec428ab21bde9372c9e8fa489f48e7b3fe","name":"node_a75abd0dce5a488b7e06f91fab7a92ec428ab21bde9372c9e8fa489f48e7b3fe","enode":"enode://1018042bdefdc2e798c3ddd700486aba9fc20a89da51cae3496187cb9d6255d2b13be34e59108f3b3d1eab3f56f7a0988c0e866f58fcf360f6249fa89511f07d@127.0.0.1:0","enr":"0xf88fb84022e9bba09d0d2e41131e876b802569733bf1059ce20eb77f6b4b622ece181037505657543d3b05deec3ede00996d0c039955058490a884ad00126337c3b92eba0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1031018042bdefdc2e798c3ddd700486aba9fc20a89da51cae3496187cb9d6255d2","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"p1q9Dc5aSIt+Bvkfq3qS7EKKshvek3LJ6PpIn0jns/4=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: a75abd\npopulation: 28 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 757a 109e 372d | 65 5d60 (0) 5a01 (0) 5abc (0) 5776 (0)\n001 8 cdcd cbc5 c3a1 dc97 | 30 db08 (0) dfae (0) dc97 (0) d6ff (0)\n002 5 9a92 8b76 89c8 895b | 16 86ca (0) 83dc (0) 82f0 (0) 8be4 (0)\n003 5 b8e1 b92a b381 b2b9 | 8 b16d (0) b2b9 (0) b381 (0) b486 (0)\n004 3 ad0d afa3 ae67 | 4 aebd (0) ae67 (0) afa3 (0) ad0d (0)\n============ DEPTH: 5 ==========================================\n005 3 a320 a2ba a085 | 3 a085 (0) a320 (0) a2ba (0)\n006 0 | 0\n007 0 | 0\n008 1 a7a6 | 1 a7a6 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"a75abd0dce5a488b7e06f91fab7a92ec428ab21bde9372c9e8fa489f48e7b3fe","private_key":"f0d55a442b4523bc34a50224cf58a48983f8e13bf68ed7aef1f210ec4181e4ba","name":"node_a75abd0dce5a488b7e06f91fab7a92ec428ab21bde9372c9e8fa489f48e7b3fe","services":["bzz","pss"],"enable_msg_events":true,"port":34721},"up":true}},{"node":{"info":{"id":"757a557424c33ad89efd8185ec18d71c025830ecb2aed951e33c8c8d986d5933","name":"node_757a557424c33ad89efd8185ec18d71c025830ecb2aed951e33c8c8d986d5933","enode":"enode://bcc2e6a83deced98cbb219f3952ee89113bb72388f8db9468b0ccedc5c9efd497340ca0dab2f4ad807e2a6f7c2083c9c6ff638d982c98e7742df1f7b926737ad@127.0.0.1:0","enr":"0xf88fb840292c38ff3ee7ca5696840d594c2568dfdb75ecbbeefd9b86d835dfc88808eb3b4bc9021d750154c42b701172f70e6763d08126f1989ed3bfbab925235bc983220183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103bcc2e6a83deced98cbb219f3952ee89113bb72388f8db9468b0ccedc5c9efd49","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"dXpVdCTDOtie/YGF7BjXHAJYMOyyrtlR4zyMjZhtWTM=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 757a55\npopulation: 46 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 12 e55d ed32 ea0e f410 | 63 db08 (0) dfae (0) dc97 (0) d6ff (0)\n001 11 2459 26d1 0bcf 0ab9 | 27 0ff6 (0) 0ab9 (0) 0bcf (0) 0427 (0)\n002 8 517a 539d 558e 5d60 | 15 5d60 (0) 5a01 (0) 5abc (0) 5776 (0)\n003 5 6ecb 6c02 645b 667e | 11 6982 (0) 6e5c (0) 6ecb (0) 6c82 (0)\n004 5 78cb 7b92 7f87 7cf4 | 6 78cb (0) 7b92 (0) 7f87 (0) 7fbc (0)\n005 3 7355 734e 73b8 | 3 73b8 (0) 7355 (0) 734e (0)\n============ DEPTH: 6 ==========================================\n006 2 7639 772e | 2 7639 (0) 772e (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"757a557424c33ad89efd8185ec18d71c025830ecb2aed951e33c8c8d986d5933","private_key":"da2903aa985ff2bebcff008fe5e6086043ded662b94bf703bdd33aa8abbcad68","name":"node_757a557424c33ad89efd8185ec18d71c025830ecb2aed951e33c8c8d986d5933","services":["bzz","pss"],"enable_msg_events":true,"port":33351},"up":true}},{"node":{"info":{"id":"4b243a5aeabec6db0e4a80a9c255300cd94591a6fbe0e0aa170da4f6ce14edff","name":"node_4b243a5aeabec6db0e4a80a9c255300cd94591a6fbe0e0aa170da4f6ce14edff","enode":"enode://54c96640ca98c787831ec404bd53cf02cf312f521c34f5484e8c9bc0b9b0d95be546ccb2dc35f2350b6b457a5f8d57ec62dfc95fd3f82be2cf6acabfad9383b7@127.0.0.1:0","enr":"0xf88fb840701b1435264d1443865d19c0d29add0cf76d12020726e2685d8e4da0a8eeab31323b97fafbbd0ca3d01635cd7f3b27615bc73d27b4fdbf67c108954bd567c8b00183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10354c96640ca98c787831ec404bd53cf02cf312f521c34f5484e8c9bc0b9b0d95b","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"SyQ6Wuq+xtsOSoCpwlUwDNlFkab74OCqFw2k9s4U7f8=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 4b243a\npopulation: 34 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 b2b9 d0f3 cfbb | 63 db08 (0) dfae (0) dc97 (0) d6ff (0)\n001 10 26d1 2a22 1929 13bc | 27 0ff6 (0) 0ab9 (0) 0bcf (0) 0427 (0)\n002 10 6ecb 6e5c 6d60 6c02 | 23 6982 (0) 6ecb (0) 6e5c (0) 6c82 (0)\n003 5 5abc 558e 5776 517a | 7 5d60 (0) 5a01 (0) 5abc (0) 558e (0)\n004 3 47c3 4167 41b9 | 4 47c3 (0) 4167 (0) 419a (0) 41b9 (0)\n005 1 4cd0 | 1 4cd0 (0)\n============ DEPTH: 6 ==========================================\n006 1 48b6 | 1 48b6 (0)\n007 1 4a18 | 1 4a18 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"4b243a5aeabec6db0e4a80a9c255300cd94591a6fbe0e0aa170da4f6ce14edff","private_key":"4f3791027f035431649d9fcd7cb9f8fd3c894da3f485f2c0e24c2a851fab97fb","name":"node_4b243a5aeabec6db0e4a80a9c255300cd94591a6fbe0e0aa170da4f6ce14edff","services":["bzz","pss"],"enable_msg_events":true,"port":36491},"up":true}},{"node":{"info":{"id":"667ef042e9dae18694581e0404c3d87a09800e8b42173d26571c3bf97e29a372","name":"node_667ef042e9dae18694581e0404c3d87a09800e8b42173d26571c3bf97e29a372","enode":"enode://03bb27a5efeec49cef6564a99f3d8f48962be8be00db2ace069c57a131607c55bf856022b21bd4ec25e48b349b52b09fa2041ed165d3a8385ec34a5d7280d6d7@127.0.0.1:0","enr":"0xf88fb840307d719c21165c858e0413d4b18af8363443e8bba70afc6cc2b8dd5ff08a43a66e9ee7aec6b62b965901f872ab5832443df4fae667d7b3557eaea3c1e9052e020183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10303bb27a5efeec49cef6564a99f3d8f48962be8be00db2ace069c57a131607c55","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"Zn7wQuna4YaUWB4EBMPYegmADotCFz0mVxw7+X4po3I=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 667ef0\npopulation: 32 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 7 b2b9 957d dc97 dfae | 63 db08 (0) dfae (0) dc97 (0) d6ff (0)\n001 4 0ab9 0bcf 027f 0390 | 27 0ff6 (0) 0ab9 (0) 0bcf (0) 06b9 (0)\n002 5 539d 5abc 5a01 48b6 | 15 5d60 (0) 5a01 (0) 5abc (0) 5776 (0)\n003 7 7b92 7dc5 757a 772e | 12 78cb (0) 7b92 (0) 7f87 (0) 7fbc (0)\n004 5 6e5c 6ecb 6c82 6c02 | 6 6982 (0) 6ecb (0) 6e5c (0) 6c82 (0)\n005 1 6210 | 1 6210 (0)\n006 1 645b | 1 645b (0)\n============ DEPTH: 7 ==========================================\n007 2 6742 6728 | 2 6742 (0) 6728 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"667ef042e9dae18694581e0404c3d87a09800e8b42173d26571c3bf97e29a372","private_key":"b61f7c457f7b07d448f38101f0b9a63485fa37f50da9a92362a48addc997a396","name":"node_667ef042e9dae18694581e0404c3d87a09800e8b42173d26571c3bf97e29a372","services":["bzz","pss"],"enable_msg_events":true,"port":46521},"up":true}},{"node":{"info":{"id":"6d601952793589bc6b57340c451a6abf02ea2c16637e910eed04cde6eddfe17a","name":"node_6d601952793589bc6b57340c451a6abf02ea2c16637e910eed04cde6eddfe17a","enode":"enode://5fd6f8ed3cd810ee8b1f94209e80e357d598434625f8644da0ebe3e07eb25a80c5ca8fef356aba34c04ca2acbed317344c504ffe32fd7635f0b94c3ce5f5eff2@127.0.0.1:0","enr":"0xf88fb840236d92a5eae6b161341b01c489cd53ae1380191a314d7106c6984b0eb94d216b3bf8b891301e7486d39136a85d0a085f7cd70f33df587aeb879ce0600b7663720183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1025fd6f8ed3cd810ee8b1f94209e80e357d598434625f8644da0ebe3e07eb25a80","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"bWAZUnk1ibxrVzQMRRpqvwLqLBZjfpEO7QTN5u3f4Xo=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 6d6019\npopulation: 33 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 10 b2b9 957d d0f3 d224 | 63 db08 (0) dfae (0) dc97 (0) d6ff (0)\n001 2 3ee4 3cb1 | 27 0ff6 (0) 0bcf (0) 0ab9 (0) 06b9 (0)\n002 5 48b6 4a18 4b24 5abc | 15 47c3 (0) 4167 (0) 419a (0) 41b9 (0)\n003 7 78cb 7b92 7f87 7dc5 | 12 78cb (0) 7b92 (0) 7f87 (0) 7fbc (0)\n004 4 645b 6742 6728 667e | 5 6210 (0) 645b (0) 6742 (0) 6728 (0)\n005 1 6982 | 1 6982 (0)\n006 2 6e5c 6ecb | 2 6ecb (0) 6e5c (0)\n============ DEPTH: 7 ==========================================\n007 2 6c02 6c82 | 2 6c82 (0) 6c02 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"6d601952793589bc6b57340c451a6abf02ea2c16637e910eed04cde6eddfe17a","private_key":"18bc5eca469877f8bfa545da0ad2bd73daec62af973abe276fb20f1d04863e95","name":"node_6d601952793589bc6b57340c451a6abf02ea2c16637e910eed04cde6eddfe17a","services":["bzz","pss"],"enable_msg_events":true,"port":33319},"up":true}},{"node":{"info":{"id":"3cb1b4069727dc323a687cab4ca2764f6415450488706f1b97c5cb8ca46346ff","name":"node_3cb1b4069727dc323a687cab4ca2764f6415450488706f1b97c5cb8ca46346ff","enode":"enode://5fd4ee4ef3698df17ace9e5c9df83f75a95f7e5f95f649cc8bdd52f61a7fac2171d1ee5f86535eee24bae2effb9f7ff69670824dbe6eb14a35b7665c2223da3d@127.0.0.1:0","enr":"0xf88fb840aff409e698e8f4f5cf56ca52947c18b6d9809b5f1e525fc10e843e36ee2ca5241e81898a9433b16d0a08764e529c7fb084f389f43419ee06e71bf301a946d2900183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1035fd4ee4ef3698df17ace9e5c9df83f75a95f7e5f95f649cc8bdd52f61a7fac21","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"PLG0Bpcn3DI6aHyrTKJ2T2QVRQSIcG8bl8XLjKRjRv8=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 3cb1b4\npopulation: 30 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 89c8 8cf9 ae67 a085 | 63 db08 (0) dfae (0) dc97 (0) d224 (0)\n001 4 48b6 7355 6e5c 6d60 | 38 47c3 (0) 4167 (0) 419a (0) 41b9 (0)\n002 9 1929 0427 0506 018a | 15 0ff6 (0) 0bcf (0) 0ab9 (0) 06b9 (0)\n003 6 213b 2434 2459 26d1 | 6 213b (0) 2459 (0) 2434 (0) 26d1 (0)\n004 1 372d | 1 372d (0)\n005 2 39db 38ab | 2 39db (0) 38ab (0)\n============ DEPTH: 6 ==========================================\n006 2 3ee4 3e56 | 2 3e56 (0) 3ee4 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"3cb1b4069727dc323a687cab4ca2764f6415450488706f1b97c5cb8ca46346ff","private_key":"f18fca734e8631f11eebe52259a8080c6109a0f5fe18f736743c0a34181f2eae","name":"node_3cb1b4069727dc323a687cab4ca2764f6415450488706f1b97c5cb8ca46346ff","services":["bzz","pss"],"enable_msg_events":true,"port":43603},"up":true}},{"node":{"info":{"id":"b92a71a4fc371e0596538a7fb2a33e85329c39c4409c99798d9318bc263a04a1","name":"node_b92a71a4fc371e0596538a7fb2a33e85329c39c4409c99798d9318bc263a04a1","enode":"enode://c8fe782387da875269f14c7cd4bb3380d51b007537929342fbbdc7ea61b444f205d4e3bc17b6fd54daf1f730ce4aaca7e4af914aff70e0f3dbb2e8edabb226a1@127.0.0.1:0","enr":"0xf88fb840a624988c579ed3e88f99fb8ca769e17361f6331458d1424eff6108f9c6b1152a56461c35819897506a2c1c17c8d17c05b4e88113489bfa3ec2b477dc8e29997e0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103c8fe782387da875269f14c7cd4bb3380d51b007537929342fbbdc7ea61b444f2","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"uSpxpPw3HgWWU4p/sqM+hTKcOcRAnJl5jZMYvCY6BKE=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: b92a71\npopulation: 26 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 0218 2a22 3cb1 | 65 47c3 (0) 4167 (0) 419a (0) 41b9 (0)\n001 4 e55d dc97 d6ff c3a1 | 30 db08 (0) dfae (0) dc97 (0) d224 (0)\n002 7 82f0 9a92 9d3c 9e02 | 16 957d (0) 9626 (0) 92a1 (0) 91eb (0)\n003 5 a75a a085 a2ba afa3 | 9 aebd (0) ae67 (0) afa3 (0) ad0d (0)\n004 5 b486 b70e b16d b2b9 | 5 b16d (0) b2b9 (0) b381 (0) b486 (0)\n============ DEPTH: 5 ==========================================\n005 0 | 0\n006 0 | 0\n007 2 b8e1 b841 | 2 b8e1 (0) b841 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"b92a71a4fc371e0596538a7fb2a33e85329c39c4409c99798d9318bc263a04a1","private_key":"6c47e1823351c4f8273293dc991f5d3e47a310824dc99d1d52beef8c89294f01","name":"node_b92a71a4fc371e0596538a7fb2a33e85329c39c4409c99798d9318bc263a04a1","services":["bzz","pss"],"enable_msg_events":true,"port":42797},"up":true}},{"node":{"info":{"id":"2a22dbee71a0ef27c840221db4a592d6dc8f171afed865ff814a37d633a3eaa9","name":"node_2a22dbee71a0ef27c840221db4a592d6dc8f171afed865ff814a37d633a3eaa9","enode":"enode://a7c716f7518d16f027fc0d58cc55ab8ae2162f10c0cf5d81c251ca7871aa0987c94ba79fbe53061f70754735133653680cec4e97749c0ece47ae3d0087d943d4@127.0.0.1:0","enr":"0xf88fb84080004a46ab4e22a502d41f7bfe521c7b28973328433a5a30cba401e5f2fe9a1c100aecae60a1cc71aaac717ef8f08b2e07149090f6be981f06b7f4aa3a2bf7d50183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102a7c716f7518d16f027fc0d58cc55ab8ae2162f10c0cf5d81c251ca7871aa0987","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"KiLb7nGg7yfIQCIdtKWS1tyPFxr+2GX/gUo31jOj6qk=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 2a22db\npopulation: 35 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 7 9d3c 89c8 a085 b92a | 63 957d (0) 9626 (0) 92a1 (0) 91eb (0)\n001 6 7639 7355 734e 4b24 | 38 47c3 (0) 4167 (0) 419a (0) 41b9 (0)\n002 12 1929 13bc 109e 0ab9 | 15 0ff6 (0) 0bcf (0) 0ab9 (0) 06b9 (0)\n003 5 372d 38ab 39db 3e56 | 6 372d (0) 39db (0) 38ab (0) 3e56 (0)\n============ DEPTH: 4 ==========================================\n004 4 2459 2434 26d1 213b | 4 213b (0) 2459 (0) 2434 (0) 26d1 (0)\n005 0 | 0\n006 1 286a | 1 286a (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"2a22dbee71a0ef27c840221db4a592d6dc8f171afed865ff814a37d633a3eaa9","private_key":"983e054d5c73ca85071b2217c801a3085251fb1b921de91548a7a6a233b24777","name":"node_2a22dbee71a0ef27c840221db4a592d6dc8f171afed865ff814a37d633a3eaa9","services":["bzz","pss"],"enable_msg_events":true,"port":46129},"up":true}},{"node":{"info":{"id":"c3a1b301bf187fd8326831197d93a0266ac0cc8287b9008631240e2bec9cf337","name":"node_c3a1b301bf187fd8326831197d93a0266ac0cc8287b9008631240e2bec9cf337","enode":"enode://7defcbf17d10e9ee01953d449616f3699518c4d3585397ff9bc8593c072c9a6b812acfd3433a4089f86c780620500a11b9e3e2801b235000453c067ad2311f82@127.0.0.1:0","enr":"0xf88fb840de5af3f26f6196388d0546896aa7bf5ac6fc698d19f254306f9dc81a408a11586b063e732170349d2f8894e5ae2b69572727cb59a416373c82b651eca0cb6c580183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1027defcbf17d10e9ee01953d449616f3699518c4d3585397ff9bc8593c072c9a6b","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"w6GzAb8Yf9gyaDEZfZOgJmrAzIKHuQCGMSQOK+yc8zc=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: c3a1b3\npopulation: 35 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 8 7dc5 757a 667e 6982 | 65 41b9 (0) 419a (0) 4167 (0) 47c3 (0)\n001 7 a75a b381 b92a 82f0 | 33 957d (0) 9626 (0) 92a1 (0) 91eb (0)\n002 7 f5c4 f74e ea0e ed32 | 15 f360 (0) f361 (0) f74e (0) f410 (0)\n003 5 dfae dc97 d6ff d224 | 6 db08 (0) dc97 (0) dfae (0) d224 (0)\n============ DEPTH: 4 ==========================================\n004 7 c8e5 ca03 cbc5 cdcd | 7 c8e5 (0) ca03 (0) cbc5 (0) cdcd (0)\n005 0 | 0\n006 1 c181 | 1 c181 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"c3a1b301bf187fd8326831197d93a0266ac0cc8287b9008631240e2bec9cf337","private_key":"484569ae37b3c147f07f84fa525f767a19cb38f2839bdc5ea2c5e66a29a71514","name":"node_c3a1b301bf187fd8326831197d93a0266ac0cc8287b9008631240e2bec9cf337","services":["bzz","pss"],"enable_msg_events":true,"port":40743},"up":true}},{"node":{"info":{"id":"e55d8cdb7e7940b11929e7e5c949ef6beb7998e5180a1f0a3c0bf61aef39f1b8","name":"node_e55d8cdb7e7940b11929e7e5c949ef6beb7998e5180a1f0a3c0bf61aef39f1b8","enode":"enode://9bf89be750b3f7b410f5c7f487664a2e0984a1869ab3028316d121edb1de9c7d0044a57a07671607f39b16c19b4afd6bb65be16f70a2edda4a6c8cfef676f9e7@127.0.0.1:0","enr":"0xf88fb8407f93d5d7b618515bd5cba4bb810d1e7c011dcd28c79b7a11da77ca28ff0159924f52b0a9855f06e431c27bfc00244284259f11bcc2db35e6f81fa2d3e1901f6e0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1039bf89be750b3f7b410f5c7f487664a2e0984a1869ab3028316d121edb1de9c7d","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"5V2M2355QLEZKeflyUnva+t5mOUYCh8KPAv2Gu858bg=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: e55d8c\npopulation: 36 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 10 0390 13bc 1929 6ecb | 65 47c3 (0) 41b9 (0) 419a (0) 4167 (0)\n001 10 afa3 ae67 b92a b841 | 33 b16d (0) b2b9 (0) b381 (0) b486 (0)\n002 5 db08 dfae d0f3 cfbb | 15 db08 (0) dfae (0) dc97 (0) d224 (0)\n003 3 f361 f74e f5c4 | 5 f360 (0) f361 (0) f74e (0) f410 (0)\n004 4 ebca ea0e ed32 edc8 | 5 edc8 (0) ed32 (0) ebca (0) ea60 (0)\n============ DEPTH: 5 ==========================================\n005 3 e16b e0b1 e0ea | 3 e0ea (0) e0b1 (0) e16b (0)\n006 1 e77f | 1 e77f (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"e55d8cdb7e7940b11929e7e5c949ef6beb7998e5180a1f0a3c0bf61aef39f1b8","private_key":"70bfa2dd7936c527af87ad8ba7b3d514378ae9415b80790afbeb8c145ef60da3","name":"node_e55d8cdb7e7940b11929e7e5c949ef6beb7998e5180a1f0a3c0bf61aef39f1b8","services":["bzz","pss"],"enable_msg_events":true,"port":40869},"up":true}},{"node":{"info":{"id":"895bdcd200cc4d7ec5c24f1722d0a8ebedda78b78cdf1ccc8c22a981980f5786","name":"node_895bdcd200cc4d7ec5c24f1722d0a8ebedda78b78cdf1ccc8c22a981980f5786","enode":"enode://bdad63bb5585a3b586e639b7f3a5a588a466508ceda1e479e1a9b680bf7306e84cff0f49d32225c68a8e8c4ce351565f80823ea4eb59625cfa0f4e4a4c778940@127.0.0.1:0","enr":"0xf88fb840cf3575b7f89341293c93e42a94e09971765ed95f6b2e7b14e280dbe9f820d785440bcb6c7546cd319062f61ac1ccf8d316d6e62e604ccbdf856585b699e3d0b60183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102bdad63bb5585a3b586e639b7f3a5a588a466508ceda1e479e1a9b680bf7306e8","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"iVvc0gDMTX7Fwk8XItCo6+3aeLeM3xzMjCKpgZgPV4Y=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 895bdc\npopulation: 37 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 11 0ab9 0bcf 018a 026d | 65 1be4 (0) 1929 (0) 109e (0) 13bc (0)\n001 8 d6ff d0f3 d224 dc97 | 30 db08 (0) dfae (0) dc97 (0) d224 (0)\n002 6 b8e1 ad0d afa3 a75a | 17 b16d (0) b2b9 (0) b381 (0) b486 (0)\n003 5 9a92 9e02 9d3c 9626 | 8 957d (0) 9626 (0) 92a1 (0) 91eb (0)\n004 3 86ca 83dc 82f0 | 3 86ca (0) 83dc (0) 82f0 (0)\n005 1 8cf9 | 1 8cf9 (0)\n============ DEPTH: 6 ==========================================\n006 2 8b76 8be4 | 2 8be4 (0) 8b76 (0)\n007 0 | 0\n008 1 89c8 | 1 89c8 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"895bdcd200cc4d7ec5c24f1722d0a8ebedda78b78cdf1ccc8c22a981980f5786","private_key":"dcb06c1695510d0ebdf81de665b6c30b1bc31fcffcdeb5a1d949119e3323d009","name":"node_895bdcd200cc4d7ec5c24f1722d0a8ebedda78b78cdf1ccc8c22a981980f5786","services":["bzz","pss"],"enable_msg_events":true,"port":36481},"up":true}},{"node":{"info":{"id":"a2babe49410ae007bc41ff2b7deaf709ed849e2f69666ce5aae76a3b71f47081","name":"node_a2babe49410ae007bc41ff2b7deaf709ed849e2f69666ce5aae76a3b71f47081","enode":"enode://200a1baeeb12eaff4957c04f960bc136c15c981b4ed91f50b6a3cd72f60ce1a9670bf2aada7c27159b884f728294220ddf2f7ab7c25bda08e51af6e0d2ac59cc@127.0.0.1:0","enr":"0xf88fb8409ac56bef876fd1aa5cf1e9dc9750872b7b31e85abe3b3bd7bcbe11b451f4a4a41eca4dab1ec561a4e4e38d69fcf6daf208f8b8a3ffae014bd67e43b9be5e10800183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102200a1baeeb12eaff4957c04f960bc136c15c981b4ed91f50b6a3cd72f60ce1a9","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"orq+SUEK4Ae8Qf8rfer3Ce2Eni9pZmzlqudqO3H0cIE=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: a2babe\npopulation: 26 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 0bcf 109e 13bc 1929 | 65 1be4 (0) 1929 (0) 13bc (0) 109e (0)\n001 2 e0b1 d6ff | 30 f360 (0) f361 (0) f74e (0) f410 (0)\n002 5 83dc 82f0 8cf9 8b76 | 16 957d (0) 9626 (0) 92a1 (0) 91eb (0)\n003 5 b70e b381 b2b9 b8e1 | 8 b16d (0) b2b9 (0) b381 (0) b486 (0)\n004 4 ad0d afa3 aebd ae67 | 4 aebd (0) ae67 (0) afa3 (0) ad0d (0)\n005 2 a7a6 a75a | 2 a7a6 (0) a75a (0)\n============ DEPTH: 6 ==========================================\n006 1 a085 | 1 a085 (0)\n007 1 a320 | 1 a320 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"a2babe49410ae007bc41ff2b7deaf709ed849e2f69666ce5aae76a3b71f47081","private_key":"d2327e3f9e0f7d479fd3a5ab6629e91631a909dcea933881e6981e4d8f65f4b1","name":"node_a2babe49410ae007bc41ff2b7deaf709ed849e2f69666ce5aae76a3b71f47081","services":["bzz","pss"],"enable_msg_events":true,"port":42677},"up":true}},{"node":{"info":{"id":"8cf957bf95a629c60c31dbcfe75ecca149a81c761f8b34858b04f8318e5c74bd","name":"node_8cf957bf95a629c60c31dbcfe75ecca149a81c761f8b34858b04f8318e5c74bd","enode":"enode://81d1c6b434a911a8540ccca92dc7eb5f6af3c9f8e8661331630b961b9beebbc774961f8c9b6764495cd176cdc7a2234e00b1fe437cf0e0e62ffdebffe804300b@127.0.0.1:0","enr":"0xf88fb840282e7b8b2c9fe6bfd46ecfa1ef9c05c0ce8aa561d6727b69e6112e3458aa1bbd1e729fe940bc2ed0879a33afffe03e9bb6645ef7c6ed882f20af71d138c235810183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10381d1c6b434a911a8540ccca92dc7eb5f6af3c9f8e8661331630b961b9beebbc7","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"jPlXv5WmKcYMMdvP517MoUmoHHYfizSFiwT4MY5cdL0=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 8cf957\npopulation: 35 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 7 7b92 018a 026d 0ab9 | 65 1be4 (0) 1929 (0) 13bc (0) 109e (0)\n001 11 cec3 f361 f5c4 e0ea | 30 f360 (0) f361 (0) f74e (0) f410 (0)\n002 6 b8e1 ad0d afa3 a75a | 17 b841 (0) b8e1 (0) b92a (0) b16d (0)\n003 4 9626 9a92 9d3c 9e02 | 8 957d (0) 9626 (0) 92a1 (0) 91eb (0)\n004 3 86ca 83dc 82f0 | 3 86ca (0) 83dc (0) 82f0 (0)\n============ DEPTH: 5 ==========================================\n005 4 8be4 8b76 895b 89c8 | 4 8be4 (0) 8b76 (0) 89c8 (0) 895b (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"8cf957bf95a629c60c31dbcfe75ecca149a81c761f8b34858b04f8318e5c74bd","private_key":"7cbecf45c8af825ad55165ca14a5390dc79b63f7d21abc54c8a3baadb93b0050","name":"node_8cf957bf95a629c60c31dbcfe75ecca149a81c761f8b34858b04f8318e5c74bd","services":["bzz","pss"],"enable_msg_events":true,"port":38617},"up":true}},{"node":{"info":{"id":"9e02c5384602a54e900cfa46d5987b77f16e74cba745ac850fcada01c7af9004","name":"node_9e02c5384602a54e900cfa46d5987b77f16e74cba745ac850fcada01c7af9004","enode":"enode://1f9a4a0c1be2d3dc6cbe8fe451547748f181485a135d11125e490c4554edcb2a9c3915bce098a7a2d347392cbed94f9329000fa47ab5bd6611ae18f398feadf2@127.0.0.1:0","enr":"0xf88fb84073df5e59956667788fb2912ac8df533ca51baf49e3d0ab14bd339845667a29bd706b855764a6ae9a2143bd63225a6a73a0e252aaf849de6071447977ffc144f60183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1021f9a4a0c1be2d3dc6cbe8fe451547748f181485a135d11125e490c4554edcb2a","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"ngLFOEYCpU6QDPpG1Zh7d/FudMunRayFD8raAcevkAQ=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 9e02c5\npopulation: 29 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 7 39db 2434 018a 026d | 65 1be4 (0) 1929 (0) 13bc (0) 109e (0)\n001 3 f361 c3a1 d6ff | 30 f360 (0) f361 (0) f74e (0) f410 (0)\n002 6 a320 ad0d afa3 b70e | 17 b841 (0) b8e1 (0) b92a (0) b16d (0)\n003 6 83dc 82f0 8b76 895b | 8 86ca (0) 83dc (0) 82f0 (0) 8be4 (0)\n004 4 91eb 92a1 957d 9626 | 4 957d (0) 9626 (0) 92a1 (0) 91eb (0)\n005 1 9a92 | 1 9a92 (0)\n============ DEPTH: 6 ==========================================\n006 1 9d3c | 1 9d3c (0)\n007 0 | 0\n008 1 9ee7 | 1 9ee7 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"9e02c5384602a54e900cfa46d5987b77f16e74cba745ac850fcada01c7af9004","private_key":"a54d320f74dbd164c2e978d7a70edcb4a6c116debd0e98aeaafdf18a0caf5810","name":"node_9e02c5384602a54e900cfa46d5987b77f16e74cba745ac850fcada01c7af9004","services":["bzz","pss"],"enable_msg_events":true,"port":45685},"up":true}},{"node":{"info":{"id":"539df902d42dc997c6b0e24d16ad68b54c557d56b41c972a320d57632dbfbe3c","name":"node_539df902d42dc997c6b0e24d16ad68b54c557d56b41c972a320d57632dbfbe3c","enode":"enode://79b76c3f04c3fe8a4d8e15ba7832fa0e0cb07d122736b0ddd187f783af4f63fd91451132a818a91e2aaee43e9e6b4aace8e002ee76166005b9a2fe9553283f1a@127.0.0.1:0","enr":"0xf88fb840267a7455083f7f198cb282b60318c8fc45fa5d66c3aa1d1b7cea64ea5940f4dd140ae387c995877ba388099faf98c6e647e66c692c3a237bcb78321b457f26ac0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10279b76c3f04c3fe8a4d8e15ba7832fa0e0cb07d122736b0ddd187f783af4f63fd","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"U535AtQtyZfGsOJNFq1otUxVfVa0HJcqMg1XYy2/vjw=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 539df9\npopulation: 33 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 dc97 e55d b2b9 9e02 | 63 f360 (0) f361 (0) f74e (0) f410 (0)\n001 3 2a22 372d 38ab | 27 1be4 (0) 1929 (0) 13bc (0) 109e (0)\n002 12 667e 6728 6742 6ecb | 23 78cb (0) 7b92 (0) 7f87 (0) 7fbc (0)\n003 8 47c3 4167 419a 41b9 | 8 4167 (0) 41b9 (0) 419a (0) 47c3 (0)\n004 3 5d60 5a01 5abc | 3 5d60 (0) 5a01 (0) 5abc (0)\n============ DEPTH: 5 ==========================================\n005 2 5776 558e | 2 5776 (0) 558e (0)\n006 1 517a | 1 517a (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"539df902d42dc997c6b0e24d16ad68b54c557d56b41c972a320d57632dbfbe3c","private_key":"af360c6fe75b63f4d38464596d6a86faff221f4c287bfde6f06204cdadaaa7f8","name":"node_539df902d42dc997c6b0e24d16ad68b54c557d56b41c972a320d57632dbfbe3c","services":["bzz","pss"],"enable_msg_events":true,"port":46373},"up":true}},{"node":{"info":{"id":"38ab3d7bdfb293b88122404cb7c50b5fb890ce7664c075da95585557a430c403","name":"node_38ab3d7bdfb293b88122404cb7c50b5fb890ce7664c075da95585557a430c403","enode":"enode://b59c9de0746cb3c3d75539274cc8216e4fe0ba577923dae16c2c38b2459f36f451764f8027ec684def5e6452ba84a2afc62f3729d3889e9c65307ecb10ae0496@127.0.0.1:0","enr":"0xf88fb840e51c952cba32bef6455c273e05c4252fc1e13ec6b7deee195982262b858831046faa9872c55686e7dc575653a070c1ec4d282cf32c09f2426240fa8250585f870183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102b59c9de0746cb3c3d75539274cc8216e4fe0ba577923dae16c2c38b2459f36f4","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"OKs9e9+yk7iBIkBMt8ULX7iQznZkwHXalVhVV6QwxAM=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 38ab3d\npopulation: 23 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 d0f3 a085 ae67 b70e | 63 f410 (0) f5c4 (0) f74e (0) f360 (0)\n001 4 7b92 7355 5abc 539d | 38 7f87 (0) 7fbc (0) 7dc5 (0) 7cf4 (0)\n002 6 0bcf 0ab9 0506 0218 | 15 1be4 (0) 1929 (0) 13bc (0) 109e (0)\n003 4 2a22 2459 2434 213b | 6 213b (0) 26d1 (0) 2459 (0) 2434 (0)\n004 1 372d | 1 372d (0)\n============ DEPTH: 5 ==========================================\n005 3 3ee4 3e56 3cb1 | 3 3e56 (0) 3ee4 (0) 3cb1 (0)\n006 0 | 0\n007 1 39db | 1 39db (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"38ab3d7bdfb293b88122404cb7c50b5fb890ce7664c075da95585557a430c403","private_key":"90080ed19445f25b61f6f51c31c7b5f0901bcc8b4d2af5754eb6200898460782","name":"node_38ab3d7bdfb293b88122404cb7c50b5fb890ce7664c075da95585557a430c403","services":["bzz","pss"],"enable_msg_events":true,"port":44377},"up":true}},{"node":{"info":{"id":"b70e96f01ac8947d2de6320412ae3310316caba65c27108ad16b2f2004255be4","name":"node_b70e96f01ac8947d2de6320412ae3310316caba65c27108ad16b2f2004255be4","enode":"enode://8908b549b763c33a6d64dd794edf15467674ab7744abc8dadfe0a9ffe7edb0f232d68be0ce2cab3a1f1f4c1eb5bc265d2b5d241edb189daedf12f94294f83ece@127.0.0.1:0","enr":"0xf88fb840bd4af476eac6bae70a9bf4b3556d02f449fe1467ed3cb54cea8bcc7e51c1579a6949b225f34052028d4a72b4c7f804c49f2e12d4894046aedad89e4ffbf78d380183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1028908b549b763c33a6d64dd794edf15467674ab7744abc8dadfe0a9ffe7edb0f2","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"tw6W8BrIlH0t5jIEEq4zEDFsq6ZcJxCK0WsvIAQlW+Q=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: b70e96\npopulation: 30 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 6e5c 0218 109e 38ab | 65 7fbc (0) 7f87 (0) 7cf4 (0) 7dc5 (0)\n001 5 db08 f5c4 f361 e55d | 30 f360 (0) f361 (0) f410 (0) f5c4 (0)\n002 7 91eb 9a92 9d3c 9e02 | 16 86ca (0) 82f0 (0) 83dc (0) 8be4 (0)\n003 8 a2ba a320 a085 a75a | 9 ad0d (0) afa3 (0) aebd (0) ae67 (0)\n004 2 b8e1 b92a | 3 b841 (0) b8e1 (0) b92a (0)\n============ DEPTH: 5 ==========================================\n005 3 b2b9 b381 b16d | 3 b2b9 (0) b381 (0) b16d (0)\n006 1 b486 | 1 b486 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"b70e96f01ac8947d2de6320412ae3310316caba65c27108ad16b2f2004255be4","private_key":"356f88370186e91459aaa1a01150f9a0a07c6ba89835476be5ee3177f2456a90","name":"node_b70e96f01ac8947d2de6320412ae3310316caba65c27108ad16b2f2004255be4","services":["bzz","pss"],"enable_msg_events":true,"port":36567},"up":true}},{"node":{"info":{"id":"6e5c213a2db57eaf2e1e1acc341c72efab89b0e42b6cd18db4f99ac1af151d65","name":"node_6e5c213a2db57eaf2e1e1acc341c72efab89b0e42b6cd18db4f99ac1af151d65","enode":"enode://aa49209c98c2acfa233719cd8ab7c559b1a4024986f005f61450405205031b502c13b39557ac3df31f081a1bcc3cf8de29357f78400a37d679e179bd1f15b597@127.0.0.1:0","enr":"0xf88fb840cfbea5c6873c85a8951ee4931c303f2eff6e82813d5e4d86c25d48a82b1a49e341d8b0c006a2036a8eb6cc687fdb9c38595d982c2da6d56ff80606137b1fb5090183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103aa49209c98c2acfa233719cd8ab7c559b1a4024986f005f61450405205031b50","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"blwhOi21fq8uHhrMNBxy76uJsOQrbNGNtPmawa8VHWU=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 6e5c21\npopulation: 27 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 d6ff a320 b486 b70e | 63 f360 (0) f361 (0) f410 (0) f5c4 (0)\n001 3 3cb1 0218 109e | 27 2459 (0) 2434 (0) 26d1 (0) 213b (0)\n002 5 41b9 4b24 539d 5a01 | 15 47c3 (0) 4167 (0) 419a (0) 41b9 (0)\n003 7 7f87 7dc5 7b92 78cb | 12 78cb (0) 7b92 (0) 7fbc (0) 7f87 (0)\n004 3 667e 6728 645b | 5 6210 (0) 645b (0) 6742 (0) 6728 (0)\n005 1 6982 | 1 6982 (0)\n============ DEPTH: 6 ==========================================\n006 3 6d60 6c82 6c02 | 3 6c82 (0) 6c02 (0) 6d60 (0)\n007 0 | 0\n008 1 6ecb | 1 6ecb (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"6e5c213a2db57eaf2e1e1acc341c72efab89b0e42b6cd18db4f99ac1af151d65","private_key":"5f2bdd7f08afe412e3fe6ff84df44e66752bb9b256a47fbc9581d982eadffdd4","name":"node_6e5c213a2db57eaf2e1e1acc341c72efab89b0e42b6cd18db4f99ac1af151d65","services":["bzz","pss"],"enable_msg_events":true,"port":33895},"up":true}},{"node":{"info":{"id":"772e4c80d128deb52adf024a0eb6fe9bbea1c83351ed93f55f490cd5e5c69260","name":"node_772e4c80d128deb52adf024a0eb6fe9bbea1c83351ed93f55f490cd5e5c69260","enode":"enode://31b2a3729f35e5f4dd4e1ee95642c5672d2770f7624b097db81350287a180c1e49fff42d6c63128a806950d4128d494b8268a2b96fde995d89607b612ecec782@127.0.0.1:0","enr":"0xf88fb8404462b449bcf2410c7f21823b369db50987ba625ab6e4a803cdc4559caf61851a17783540a154b7d6f3a1d7ab7d08cd0851226dbccd517da51f555ad7c40bf5540183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10231b2a3729f35e5f4dd4e1ee95642c5672d2770f7624b097db81350287a180c1e","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"dy5MgNEo3rUq3wJKDrb+m76hyDNR7ZP1X0kM1eXGkmA=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 772e4c\npopulation: 33 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 b486 d6ff f74e ea0e | 63 f360 (0) f361 (0) f410 (0) f5c4 (0)\n001 2 109e 0ab9 | 27 286a (0) 2a22 (0) 2459 (0) 2434 (0)\n002 8 4a18 41b9 5d60 5abc | 15 47c3 (0) 4167 (0) 419a (0) 41b9 (0)\n003 6 667e 645b 6d60 6c02 | 11 6210 (0) 645b (0) 6742 (0) 6728 (0)\n004 6 7f87 7fbc 7dc5 7cf4 | 6 78cb (0) 7b92 (0) 7f87 (0) 7fbc (0)\n005 3 73b8 734e 7355 | 3 73b8 (0) 7355 (0) 734e (0)\n============ DEPTH: 6 ==========================================\n006 1 757a | 1 757a (0)\n007 1 7639 | 1 7639 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"772e4c80d128deb52adf024a0eb6fe9bbea1c83351ed93f55f490cd5e5c69260","private_key":"8efd5800758dcfdbeb2cf4d84f54e399c106e2c731f6685f720a2eea4c481817","name":"node_772e4c80d128deb52adf024a0eb6fe9bbea1c83351ed93f55f490cd5e5c69260","services":["bzz","pss"],"enable_msg_events":true,"port":37837},"up":true}},{"node":{"info":{"id":"0ab9845c2890b0a64a3e5932241245e00b817b788094f9ee48f86f80b7264fea","name":"node_0ab9845c2890b0a64a3e5932241245e00b817b788094f9ee48f86f80b7264fea","enode":"enode://76fd52545682d9fdd0ca8f38321e9b37b84ca6a997956e0069744d0cb0bccb1a617f66c8eafe8dd5ed392d7e9c2efa928347aefe1c976201f3abd3e7a54bfb88@127.0.0.1:0","enr":"0xf88fb84097a8f0f039558e79fbee580fbec1d41e14fbba47472a75f290402f4076cad6492048d5e3a00ebc8742f93aa523bf57f954a31dda07673ea76280d76e01e4c5190183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10276fd52545682d9fdd0ca8f38321e9b37b84ca6a997956e0069744d0cb0bccb1a","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"CrmEXCiQsKZKPlkyJBJF4AuBe3iAlPnuSPhvgLcmT+o=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 0ab984\npopulation: 34 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 8 ea60 e16b 91eb 9626 | 63 92a1 (0) 91eb (0) 957d (0) 9626 (0)\n001 6 5776 4b24 667e 7b92 | 38 4167 (0) 41b9 (0) 419a (0) 47c3 (0)\n002 6 2a22 2434 3ee4 3cb1 | 12 26d1 (0) 2459 (0) 2434 (0) 213b (0)\n003 4 13bc 109e 1929 1be4 | 4 1be4 (0) 1929 (0) 13bc (0) 109e (0)\n004 8 06b9 0506 0427 0390 | 8 06b9 (0) 0427 (0) 0506 (0) 018a (0)\n============ DEPTH: 5 ==========================================\n005 1 0ff6 | 1 0ff6 (0)\n006 0 | 0\n007 1 0bcf | 1 0bcf (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"0ab9845c2890b0a64a3e5932241245e00b817b788094f9ee48f86f80b7264fea","private_key":"846db675d9c428c99df430ba38d3d3faf984abbe2f55df43af95bb096f86e896","name":"node_0ab9845c2890b0a64a3e5932241245e00b817b788094f9ee48f86f80b7264fea","services":["bzz","pss"],"enable_msg_events":true,"port":34333},"up":true}},{"node":{"info":{"id":"39dbd5462c90dac75f49d9af7996845943bbe929754ef8125eee7f5a763e9def","name":"node_39dbd5462c90dac75f49d9af7996845943bbe929754ef8125eee7f5a763e9def","enode":"enode://6ccc67d35840435af60a0430406169efc0037b4828edb5cd76e9bd5ac1e5aca65dd7a77219313f8a6c26f1ca7f5df41afd47dc389720d30b19e6979b52954c32@127.0.0.1:0","enr":"0xf88fb84055b20a8008a1872c0413f0ceea3a6a7121cc4e0dabef2b310f5bc43817bff888247a073d6946b7988936af22a7d1639fa5f109db9887292d255e6e771f8cda810183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1026ccc67d35840435af60a0430406169efc0037b4828edb5cd76e9bd5ac1e5aca6","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"OdvVRiyQ2sdfSdmveZaEWUO76Sl1TvgSXu5/WnY+ne8=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 39dbd5\npopulation: 31 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 12 ae67 a085 8cf9 89c8 | 63 92a1 (0) 91eb (0) 957d (0) 9626 (0)\n001 5 7355 48b6 41b9 558e | 38 47c3 (0) 4167 (0) 419a (0) 41b9 (0)\n002 5 1929 0506 0390 0bcf | 15 1be4 (0) 1929 (0) 13bc (0) 109e (0)\n003 4 2a22 213b 26d1 2434 | 6 26d1 (0) 2459 (0) 2434 (0) 213b (0)\n004 1 372d | 1 372d (0)\n============ DEPTH: 5 ==========================================\n005 3 3e56 3ee4 3cb1 | 3 3e56 (0) 3ee4 (0) 3cb1 (0)\n006 0 | 0\n007 1 38ab | 1 38ab (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"39dbd5462c90dac75f49d9af7996845943bbe929754ef8125eee7f5a763e9def","private_key":"791b9811412b1579e2e6d5f9fe6ddc88ce78a499b261b22e8817e02440f9e875","name":"node_39dbd5462c90dac75f49d9af7996845943bbe929754ef8125eee7f5a763e9def","services":["bzz","pss"],"enable_msg_events":true,"port":36547},"up":true}},{"node":{"info":{"id":"d6ffb7fd2668e9b7b133bd9144156f4736191ef0d6e72b072759782d83931f22","name":"node_d6ffb7fd2668e9b7b133bd9144156f4736191ef0d6e72b072759782d83931f22","enode":"enode://72cbbeef82764d1b224a5af28e3e60dda17a49ccfe5b92cb84263bec1524623133bc14c9d0c60f36575f469f986b97d0bd09896ad8a7a068f1d52c4000c0d8d8@127.0.0.1:0","enr":"0xf88fb840ffaffd6544c636f742b7379273dcff32de002122a72f3ec80a94c93dd7f0347b5c5ab37d8762f17cce7877ddd4a925cb05ac0c19a51a71330445ff05ad5969450183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10272cbbeef82764d1b224a5af28e3e60dda17a49ccfe5b92cb84263bec15246231","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"1v+3/SZo6bexM72RRBVvRzYZHvDW5ysHJ1l4LYOTHyI=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: d6ffb7\npopulation: 33 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 13 6e5c 6d60 6c02 645b | 65 7b92 (0) 78cb (0) 7f87 (0) 7fbc (0)\n001 6 b16d b92a a75a a2ba | 33 ad0d (0) afa3 (0) aebd (0) ae67 (0)\n002 5 f5c4 f74e ea0e ed32 | 15 f360 (0) f361 (0) f410 (0) f5c4 (0)\n003 4 c3a1 ca03 cdcd cfbb | 9 c8e5 (0) ca03 (0) cbc5 (0) cdcd (0)\n004 3 db08 dfae dc97 | 3 db08 (0) dfae (0) dc97 (0)\n============ DEPTH: 5 ==========================================\n005 2 d224 d0f3 | 2 d224 (0) d0f3 (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"d6ffb7fd2668e9b7b133bd9144156f4736191ef0d6e72b072759782d83931f22","private_key":"7d3834d39e62cf1e8548683eec363e19d020ce2f4971d98743bc58ffe1c91611","name":"node_d6ffb7fd2668e9b7b133bd9144156f4736191ef0d6e72b072759782d83931f22","services":["bzz","pss"],"enable_msg_events":true,"port":42483},"up":true}},{"node":{"info":{"id":"e0b1c4eb5b5b4dfc22344ee65cb9716cecb38dcc80099793f20641884eae4854","name":"node_e0b1c4eb5b5b4dfc22344ee65cb9716cecb38dcc80099793f20641884eae4854","enode":"enode://c7e6fc03f7b10c7235bdd7ae9fd28ea2f96d514a90ddb54312b6f45c15873e47227b36c1c4f9d29e28b16527dc7bf154702a6ec4352a8d7eab15b325c2aba1b6@127.0.0.1:0","enr":"0xf88fb84024831e3097e6342c87a066a5ae145abdf8366f26e351a7a8d3f22d5e5802c8e963e13a456db9f0b08665eb9108b71d23537dd415c9dde62127fc947b89158b630183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102c7e6fc03f7b10c7235bdd7ae9fd28ea2f96d514a90ddb54312b6f45c15873e47","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"4LHE61tbTfwiNE7mXLlxbOyzjcyACZeT8gZBiE6uSFQ=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: e0b1c4\npopulation: 32 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 9 0390 13bc 1be4 1929 | 65 7fbc (0) 7f87 (0) 7cf4 (0) 7dc5 (0)\n001 3 83dc a2ba a320 | 33 ad0d (0) afa3 (0) aebd (0) ae67 (0)\n002 8 c3a1 c181 cdcd cfbb | 15 c8e5 (0) cbc5 (0) ca03 (0) cdcd (0)\n003 3 f361 f5c4 f74e | 5 f360 (0) f361 (0) f410 (0) f5c4 (0)\n004 5 ed32 edc8 ebca ea60 | 5 ebca (0) ea60 (0) ea0e (0) edc8 (0)\n005 2 e77f e55d | 2 e77f (0) e55d (0)\n============ DEPTH: 6 ==========================================\n006 0 | 0\n007 1 e16b | 1 e16b (0)\n008 0 | 0\n009 1 e0ea | 1 e0ea (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"e0b1c4eb5b5b4dfc22344ee65cb9716cecb38dcc80099793f20641884eae4854","private_key":"42fe12311467a8adbbfb209a06319e950148da4433177621af050a2a0b74e82c","name":"node_e0b1c4eb5b5b4dfc22344ee65cb9716cecb38dcc80099793f20641884eae4854","services":["bzz","pss"],"enable_msg_events":true,"port":45685},"up":true}},{"node":{"info":{"id":"5abc96f4fa78812db6fb710fd424dd474145f7e5d00b4cedc5373b4c52f42cf5","name":"node_5abc96f4fa78812db6fb710fd424dd474145f7e5d00b4cedc5373b4c52f42cf5","enode":"enode://019ddc346857752f742b93cabbfc6b3c47c958ee5ad67be36c3c2f8e5acfa786f70344ce1d9b34c190ce414ca4af09b467ca8fdde6fcf4c8b09696c76c45b520@127.0.0.1:0","enr":"0xf88fb840153a0d6eeb5dc102fd9f75d0b8c51c7f01252e5cf45d6a4c5f3b65d4bd90a4d17affa644ffc8fca2d95c9ed93c70e093431ce452acb11d876cd55ca5dd802dba0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102019ddc346857752f742b93cabbfc6b3c47c958ee5ad67be36c3c2f8e5acfa786","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"WryW9Pp4gS22+3EP1CTdR0FF9+XQC0ztxTc7TFL0LPU=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 5abc96\npopulation: 29 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 dc97 e0ea e0b1 89c8 | 63 c8e5 (0) ca03 (0) cbc5 (0) cdcd (0)\n001 3 372d 39db 38ab | 27 213b (0) 26d1 (0) 2459 (0) 2434 (0)\n002 12 78cb 734e 7355 772e | 23 7dc5 (0) 7cf4 (0) 7fbc (0) 7f87 (0)\n003 4 4b24 4a18 48b6 41b9 | 8 47c3 (0) 4167 (0) 419a (0) 41b9 (0)\n004 4 558e 5776 517a 539d | 4 517a (0) 539d (0) 5776 (0) 558e (0)\n============ DEPTH: 5 ==========================================\n005 1 5d60 | 1 5d60 (0)\n006 0 | 0\n007 0 | 0\n008 1 5a01 | 1 5a01 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"5abc96f4fa78812db6fb710fd424dd474145f7e5d00b4cedc5373b4c52f42cf5","private_key":"4e526a63f698dcdb8bb4a8c1a4a54fb1c3ba10476f285012af7137b504bdc215","name":"node_5abc96f4fa78812db6fb710fd424dd474145f7e5d00b4cedc5373b4c52f42cf5","services":["bzz","pss"],"enable_msg_events":true,"port":34327},"up":true}},{"node":{"info":{"id":"89c883d6a85472bda328667e3fd805c70876bc582ca6763ab97ae636b1772be4","name":"node_89c883d6a85472bda328667e3fd805c70876bc582ca6763ab97ae636b1772be4","enode":"enode://577ed924a2a73d22ee8998f00a82acbe7ce1e410878d5daa4d988ead6ad2cf4f385217ff0580f3dc311e0d8f79040dcb3e7f2b765f5e89fab86703f153374ace@127.0.0.1:0","enr":"0xf88fb8400137468cd822d505da53b9784f8a1606bb49e810dc372191a35921c562eb016d27a5cfcb4511315e38eefce0dfd07c703aa57dadbd6c14d29c0a504607c089900183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102577ed924a2a73d22ee8998f00a82acbe7ce1e410878d5daa4d988ead6ad2cf4f","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"iciD1qhUcr2jKGZ+P9gFxwh2vFgspnY6uXrmNrF3K+Q=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 89c883\npopulation: 32 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 11 018a 026d 39db 3cb1 | 65 213b (0) 26d1 (0) 2459 (0) 2434 (0)\n001 7 ea0e ea60 f74e f5c4 | 30 f360 (0) f361 (0) f410 (0) f5c4 (0)\n002 5 ad0d a320 a75a b8e1 | 17 b92a (0) b841 (0) b8e1 (0) b16d (0)\n003 3 91eb 9626 9e02 | 8 92a1 (0) 91eb (0) 957d (0) 9626 (0)\n004 2 82f0 83dc | 3 86ca (0) 82f0 (0) 83dc (0)\n005 1 8cf9 | 1 8cf9 (0)\n============ DEPTH: 6 ==========================================\n006 2 8be4 8b76 | 2 8be4 (0) 8b76 (0)\n007 0 | 0\n008 1 895b | 1 895b (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"89c883d6a85472bda328667e3fd805c70876bc582ca6763ab97ae636b1772be4","private_key":"17570e86447615758ea636804ecb65f791a12a421e904e723fbec9ab52e466f6","name":"node_89c883d6a85472bda328667e3fd805c70876bc582ca6763ab97ae636b1772be4","services":["bzz","pss"],"enable_msg_events":true,"port":42067},"up":true}},{"node":{"info":{"id":"dc97c1a0019b482a048b8d15941dfe4c3c1a3443d9b2d7b4046370bc84a7e56f","name":"node_dc97c1a0019b482a048b8d15941dfe4c3c1a3443d9b2d7b4046370bc84a7e56f","enode":"enode://0563ccfaae48ee129eb27f5c779f0c8349a22919de381a54c9a4f704070532a72d2f1926c6767afba2f9b4de908bf854498f5800374956e8c66ea2346df662c1@127.0.0.1:0","enr":"0xf88fb840fba3f24508ab6de5f8772b5dd896fc9b869cb17c48af0bc23b3c14145ef2aa0f76f8eb05025bcc10df608aa7979bda2203c12a4b429d308ce15aa4afabe8f1c50183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1030563ccfaae48ee129eb27f5c779f0c8349a22919de381a54c9a4f704070532a7","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"3JfBoAGbSCoEi40VlB3+TDwaNEPZste0BGNwvISn5W8=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: dc97c1\npopulation: 30 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 14 6728 667e 6d60 6c02 | 65 5d60 (0) 5abc (0) 5a01 (0) 517a (0)\n001 4 a75a b92a 895b 89c8 | 33 b92a (0) b841 (0) b8e1 (0) b381 (0)\n002 3 f74e f361 e0ea | 15 f360 (0) f361 (0) f410 (0) f5c4 (0)\n003 4 c181 c3a1 cdcd cfbb | 9 c8e5 (0) ca03 (0) cbc5 (0) cdcd (0)\n004 3 d224 d0f3 d6ff | 3 d224 (0) d0f3 (0) d6ff (0)\n============ DEPTH: 5 ==========================================\n005 1 db08 | 1 db08 (0)\n006 1 dfae | 1 dfae (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"dc97c1a0019b482a048b8d15941dfe4c3c1a3443d9b2d7b4046370bc84a7e56f","private_key":"9599415f62de56a6422afea8e7ebbc2b460cd56cc0f7b1fc73e96b6c8857e728","name":"node_dc97c1a0019b482a048b8d15941dfe4c3c1a3443d9b2d7b4046370bc84a7e56f","services":["bzz","pss"],"enable_msg_events":true,"port":41683},"up":true}},{"node":{"info":{"id":"e0ea575d0e2efa28bc51f49d1e2c24196a196da3b3196f3a5a26a5e310809af5","name":"node_e0ea575d0e2efa28bc51f49d1e2c24196a196da3b3196f3a5a26a5e310809af5","enode":"enode://bfb412d3f9e09403659416f8864d6a739bc396ae53bc9e2f6cb30239814538e65dbbf0339670dac268002695d39b8eb59b6c3a51420aa827ee75dce465a22669@127.0.0.1:0","enr":"0xf88fb8402b1a38e980290999c2f075d625bccda4a9614d6097ae9733957386a11a9be0804a2f004dc1383d9b4a35162a400684675d560cd72ec18d107d08e4d5cad01f490183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103bfb412d3f9e09403659416f8864d6a739bc396ae53bc9e2f6cb30239814538e6","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"4OpXXQ4u+ii8UfSdHiwkGWoZbaOzGW86Wial4xCAmvU=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: e0ea57\npopulation: 32 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 11 7dc5 6ecb 6728 517a | 65 5d60 (0) 5abc (0) 5a01 (0) 517a (0)\n001 5 957d 8cf9 83dc ae67 | 33 b92a (0) b841 (0) b8e1 (0) b381 (0)\n002 6 cdcd cfbb c181 db08 | 15 c8e5 (0) cbc5 (0) ca03 (0) cdcd (0)\n003 2 f361 f74e | 5 f360 (0) f361 (0) f410 (0) f5c4 (0)\n004 4 ed32 edc8 ea60 ea0e | 5 ebca (0) ea60 (0) ea0e (0) edc8 (0)\n005 2 e77f e55d | 2 e77f (0) e55d (0)\n============ DEPTH: 6 ==========================================\n006 0 | 0\n007 1 e16b | 1 e16b (0)\n008 0 | 0\n009 1 e0b1 | 1 e0b1 (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"e0ea575d0e2efa28bc51f49d1e2c24196a196da3b3196f3a5a26a5e310809af5","private_key":"50f25d60500eb49b33f8855dbff5167ed90ae947f01800ca6e143886d4e2129e","name":"node_e0ea575d0e2efa28bc51f49d1e2c24196a196da3b3196f3a5a26a5e310809af5","services":["bzz","pss"],"enable_msg_events":true,"port":44889},"up":true}},{"node":{"info":{"id":"021811a6757bdcdd2fa0fb68401dfe009d5a8e129958cd304fb42cf51dc5d1d3","name":"node_021811a6757bdcdd2fa0fb68401dfe009d5a8e129958cd304fb42cf51dc5d1d3","enode":"enode://abd8116f367c9d2e1d15debf2ceadc5df783db3523482238cc8b10c5a61df20eee4a6ca29b99d2e09094fec869b212002aa3e56708b4d7c535f0edb00f6c6abf@127.0.0.1:0","enr":"0xf88fb840c3192e46a155becce8c64f9a7cce7f0bf743a33baf0b74dbde83751433990fe5215de0e3947206cfab59584d2e93f3075825686d26ddd6b4a7cca931dbec15f80183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103abd8116f367c9d2e1d15debf2ceadc5df783db3523482238cc8b10c5a61df20e","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"AhgRpnV73N0voPtoQB3+AJ1ajhKZWM0wT7Qs9R3F0dM=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 021811\npopulation: 33 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 8 9626 b70e b486 b16d | 63 b92a (0) b841 (0) b8e1 (0) b2b9 (0)\n001 4 4b24 558e 757a 6e5c | 38 7cf4 (0) 7dc5 (0) 7fbc (0) 7f87 (0)\n002 7 2a22 26d1 2434 213b | 12 213b (0) 26d1 (0) 2459 (0) 2434 (0)\n003 4 1be4 1929 13bc 109e | 4 1be4 (0) 1929 (0) 13bc (0) 109e (0)\n004 3 0ff6 0bcf 0ab9 | 3 0ff6 (0) 0bcf (0) 0ab9 (0)\n005 3 06b9 0427 0506 | 3 06b9 (0) 0427 (0) 0506 (0)\n006 1 018a | 1 018a (0)\n007 1 0390 | 1 0390 (0)\n============ DEPTH: 8 ==========================================\n008 0 | 0\n009 2 027f 026d | 2 027f (0) 026d (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"021811a6757bdcdd2fa0fb68401dfe009d5a8e129958cd304fb42cf51dc5d1d3","private_key":"f24fd4a4e7b3587f483542c46fe764f2846e84158cfc2282188fac740cb9939f","name":"node_021811a6757bdcdd2fa0fb68401dfe009d5a8e129958cd304fb42cf51dc5d1d3","services":["bzz","pss"],"enable_msg_events":true,"port":38993},"up":true}},{"node":{"info":{"id":"109ef17c890104bfc5a4897d526a0afaa8c991c9d213616032f3058d0feb7f00","name":"node_109ef17c890104bfc5a4897d526a0afaa8c991c9d213616032f3058d0feb7f00","enode":"enode://f4df36e91a014ba253c93cc4a738dbeafed71095b9ad41b0e62616bad9b4f4301acd54ced99e80858045d79da80ac42f6d0d594ce127b880a5838fccc7f93da7@127.0.0.1:0","enr":"0xf88fb840a626a87192ca066e77595198c84a535d734661e1db5553a18cb8b62fbb77b6797af9aad58e1149921f53ec0a226a806dd29f5fa2c3f1f4c0309113f09ad4380c0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103f4df36e91a014ba253c93cc4a738dbeafed71095b9ad41b0e62616bad9b4f430","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"EJ7xfIkBBL/FpIl9UmoK+qjJkcnSE2FgMvMFjQ/rfwA=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 109ef1\npopulation: 32 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 13 91eb 895b a2ba a085 | 63 b92a (0) b841 (0) b8e1 (0) b2b9 (0)\n001 4 4b24 757a 772e 6e5c | 38 7fbc (0) 7f87 (0) 7cf4 (0) 7dc5 (0)\n002 3 2a22 213b 38ab | 12 286a (0) 2a22 (0) 26d1 (0) 2459 (0)\n003 9 0bcf 0ab9 0506 0427 | 11 0ff6 (0) 0bcf (0) 0ab9 (0) 06b9 (0)\n============ DEPTH: 4 ==========================================\n004 2 1929 1be4 | 2 1be4 (0) 1929 (0)\n005 0 | 0\n006 1 13bc | 1 13bc (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"109ef17c890104bfc5a4897d526a0afaa8c991c9d213616032f3058d0feb7f00","private_key":"e9e24085b5783d5c7c9c652c4de2009dc89e215530c57e92cc3321481e56a5b4","name":"node_109ef17c890104bfc5a4897d526a0afaa8c991c9d213616032f3058d0feb7f00","services":["bzz","pss"],"enable_msg_events":true,"port":43049},"up":true}},{"node":{"info":{"id":"ed32d74d9be0649de1eb26b9915137fe46ec890c656c96be52e966ab6e2ed260","name":"node_ed32d74d9be0649de1eb26b9915137fe46ec890c656c96be52e966ab6e2ed260","enode":"enode://627fb4b3d57ec52bd28b0461d1ad5bd965015b0356be2d0727f9b548907a213a877ae14589528acf227113a87fff774a08eb7ca18e9860c62fc2f08a92941b8b@127.0.0.1:0","enr":"0xf88fb840626a2b83b4c2a20b607631df4b27b8945d07fd0ef4ccfce7f4ad41f83fd72d7931a5938937c2d2c8c99a377c59a782b69f9b5c99fd60f7e2d7d1727fb003eccc0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103627fb4b3d57ec52bd28b0461d1ad5bd965015b0356be2d0727f9b548907a213a","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"7TLXTZvgZJ3h6ya5kVE3/kbsiQxlbJa+Uulmq24u0mA=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: ed32d7\npopulation: 25 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 6ecb 7dc5 757a 772e | 65 7fbc (0) 7f87 (0) 7cf4 (0) 7dc5 (0)\n001 3 957d 8cf9 8b76 | 33 b16d (0) b2b9 (0) b381 (0) b486 (0)\n002 4 c3a1 cdcd dfae d6ff | 15 c181 (0) c3a1 (0) c8e5 (0) cbc5 (0)\n003 3 f5c4 f74e f361 | 5 f360 (0) f361 (0) f410 (0) f5c4 (0)\n004 5 e55d e77f e16b e0ea | 5 e77f (0) e55d (0) e16b (0) e0ea (0)\n============ DEPTH: 5 ==========================================\n005 3 ebca ea60 ea0e | 3 ebca (0) ea60 (0) ea0e (0)\n006 0 | 0\n007 0 | 0\n008 1 edc8 | 1 edc8 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"ed32d74d9be0649de1eb26b9915137fe46ec890c656c96be52e966ab6e2ed260","private_key":"e60060a92fe8c46ac4f8a127abbd9c4d9e36cd927cfe0313a8fc445e8394b94b","name":"node_ed32d74d9be0649de1eb26b9915137fe46ec890c656c96be52e966ab6e2ed260","services":["bzz","pss"],"enable_msg_events":true,"port":42957},"up":true}},{"node":{"info":{"id":"8b76194f129308324c7d0066530e02cac2410ee0ba952822f0ec866e12461e44","name":"node_8b76194f129308324c7d0066530e02cac2410ee0ba952822f0ec866e12461e44","enode":"enode://5552d93b800376a18cd819cd566ae575dedbe4b312bf6130b1c3c5f61d63b0b88680f68f25fb55b72c4fda4a23b178ee3c08e471cbe510bcf6c5c1de2f29cf24@127.0.0.1:0","enr":"0xf88fb840a9d59867b862012cf06f08dc04de0e6cac8ccec89f0305e926bf4a6cb8efcb3a74c771665a71443904b3e60d17b1ee22a23d29ba0a06925d1587f8bd8153e23d0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1025552d93b800376a18cd819cd566ae575dedbe4b312bf6130b1c3c5f61d63b0b8","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"i3YZTxKTCDJMfQBmUw4CysJBDuC6lSgi8OyGbhJGHkQ=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 8b7619\npopulation: 32 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 7 018a 39db 2434 213b | 65 7cf4 (0) 7dc5 (0) 7fbc (0) 7f87 (0)\n001 6 c181 cdcd dfae f361 | 30 c181 (0) c3a1 (0) c8e5 (0) ca03 (0)\n002 10 b70e b486 b16d b8e1 | 17 b2b9 (0) b381 (0) b16d (0) b486 (0)\n003 2 9626 9e02 | 8 9a92 (0) 9d3c (0) 9ee7 (0) 9e02 (0)\n004 3 86ca 82f0 83dc | 3 86ca (0) 82f0 (0) 83dc (0)\n005 1 8cf9 | 1 8cf9 (0)\n============ DEPTH: 6 ==========================================\n006 2 895b 89c8 | 2 895b (0) 89c8 (0)\n007 0 | 0\n008 1 8be4 | 1 8be4 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"8b76194f129308324c7d0066530e02cac2410ee0ba952822f0ec866e12461e44","private_key":"e322c8c203344ce73e706dae3f4f6f7e500bb780f43fb03a222aacf8adaef519","name":"node_8b76194f129308324c7d0066530e02cac2410ee0ba952822f0ec866e12461e44","services":["bzz","pss"],"enable_msg_events":true,"port":44125},"up":true}},{"node":{"info":{"id":"f74ecde0bbaa7b6521fb205b5ab9ea637909277f6e1ee1d3490f5cd01d0f7216","name":"node_f74ecde0bbaa7b6521fb205b5ab9ea637909277f6e1ee1d3490f5cd01d0f7216","enode":"enode://553cba5427fc16ce1f7fcf4b551e79c45f56c2fe6425442401a0d11eeb052ee63de2ce6c5458a79c564e3744bad912c50520c1369f52e0767e09ed40e9993ff8@127.0.0.1:0","enr":"0xf88fb8400139f5b8abcf514eef980efc398f34b1a0d66124a43a20c323ad1fc720ca5c40626fc02a811970e8641b50a20d6b4aca333b145cddf67c6614ee2cfb65b869fe0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102553cba5427fc16ce1f7fcf4b551e79c45f56c2fe6425442401a0d11eeb052ee6","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"907N4Luqe2Uh+yBbWrnqY3kJJ39uHuHTSQ9c0B0PchY=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: f74ecd\npopulation: 30 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 1be4 772e 5d60 558e | 65 7dc5 (0) 7cf4 (0) 7fbc (0) 7f87 (0)\n001 4 a320 83dc 89c8 8b76 | 33 b2b9 (0) b381 (0) b16d (0) b486 (0)\n002 8 db08 dfae dc97 d6ff | 15 c181 (0) c3a1 (0) c8e5 (0) cbc5 (0)\n003 10 edc8 ed32 ebca ea0e | 10 e77f (0) e55d (0) e16b (0) e0ea (0)\n============ DEPTH: 4 ==========================================\n004 0 | 0\n005 2 f361 f360 | 2 f360 (0) f361 (0)\n006 2 f5c4 f410 | 2 f410 (0) f5c4 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"f74ecde0bbaa7b6521fb205b5ab9ea637909277f6e1ee1d3490f5cd01d0f7216","private_key":"3e6b050dabdb0eb2468be45fc539a79410db1729eeba39afff4688885dc9b8ef","name":"node_f74ecde0bbaa7b6521fb205b5ab9ea637909277f6e1ee1d3490f5cd01d0f7216","services":["bzz","pss"],"enable_msg_events":true,"port":42027},"up":true}},{"node":{"info":{"id":"a3205c1c4f9b72814f0db68e888e3c7ef88f27c681ed0d731dde5f0999f92ccc","name":"node_a3205c1c4f9b72814f0db68e888e3c7ef88f27c681ed0d731dde5f0999f92ccc","enode":"enode://4fd8fe083cbe1905328dfcdefb64a314acbfdec10223d8d960f4b9168ef65580fd762356abcbf5cf995c88f00464d41163bf422cd1d80a6e9f2c6dbea37e12dd@127.0.0.1:0","enr":"0xf88fb8406f2350c3165bd627d97c3623d2fb90d4ded4cd6dd1aa554d6c4c4e017a729e743f44b2ec69aaed61a87bdebb7e1c67143b222f796b4b902b3b820dca88419b690183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1034fd8fe083cbe1905328dfcdefb64a314acbfdec10223d8d960f4b9168ef65580","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"oyBcHE+bcoFPDbaOiI48fviPJ8aB7Q1zHd5fCZn5LMw=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: a3205c\npopulation: 25 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 6e5c 645b | 65 7dc5 (0) 7cf4 (0) 7fbc (0) 7f87 (0)\n001 4 e77f e0b1 ea0e f74e | 30 c181 (0) c3a1 (0) c8e5 (0) ca03 (0)\n002 8 8b76 89c8 895b 8cf9 | 16 9a92 (0) 9d3c (0) 9ee7 (0) 9e02 (0)\n003 4 b8e1 b16d b70e b486 | 8 b381 (0) b2b9 (0) b16d (0) b486 (0)\n004 3 ad0d aebd ae67 | 4 ad0d (0) afa3 (0) aebd (0) ae67 (0)\n005 2 a7a6 a75a | 2 a7a6 (0) a75a (0)\n============ DEPTH: 6 ==========================================\n006 1 a085 | 1 a085 (0)\n007 1 a2ba | 1 a2ba (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"a3205c1c4f9b72814f0db68e888e3c7ef88f27c681ed0d731dde5f0999f92ccc","private_key":"ab56cc2e159cf59b59a2b8abae5e8c927fd16d7844425b0c048bdf0c1c03f561","name":"node_a3205c1c4f9b72814f0db68e888e3c7ef88f27c681ed0d731dde5f0999f92ccc","services":["bzz","pss"],"enable_msg_events":true,"port":38749},"up":true}},{"node":{"info":{"id":"ea0e1dd41fe042b09f273c98f02128949cf5561d20dc04b3d423961efed52327","name":"node_ea0e1dd41fe042b09f273c98f02128949cf5561d20dc04b3d423961efed52327","enode":"enode://27bd511098d142435c42d80c87870c55f35ecba4851735487a8148f63556be851405b124502231ff210e6674abc11534f6c8d43d28611d0564497cff8b0bbdb2@127.0.0.1:0","enr":"0xf88fb840d7c884944fcfd5f801f1a40862426a14631c18017bf1e8679ce01d826fb6b98e2a2a8e3e2ce8c35859ef1bdf9e6bb1ddc6717e5bd286dc5436a440b6066608200183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10227bd511098d142435c42d80c87870c55f35ecba4851735487a8148f63556be85","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"6g4d1B/gQrCfJzyY8CEolJz1Vh0g3ASz1COWHv7VIyc=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: ea0e1d\npopulation: 30 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 9 5d60 6ecb 78cb 7f87 | 65 7dc5 (0) 7cf4 (0) 7fbc (0) 7f87 (0)\n001 4 957d 89c8 8cf9 a320 | 33 92a1 (0) 91eb (0) 957d (0) 9626 (0)\n002 5 db08 dfae d6ff c3a1 | 15 c181 (0) c3a1 (0) c8e5 (0) ca03 (0)\n003 3 f5c4 f74e f361 | 5 f360 (0) f361 (0) f410 (0) f5c4 (0)\n004 5 e55d e77f e16b e0b1 | 5 e55d (0) e77f (0) e16b (0) e0ea (0)\n005 2 ed32 edc8 | 2 edc8 (0) ed32 (0)\n============ DEPTH: 6 ==========================================\n006 0 | 0\n007 1 ebca | 1 ebca (0)\n008 0 | 0\n009 1 ea60 | 1 ea60 (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"ea0e1dd41fe042b09f273c98f02128949cf5561d20dc04b3d423961efed52327","private_key":"7a2a65840183134657aedc7f4311c4428e3b8341628df92550577eb8c5f61b1c","name":"node_ea0e1dd41fe042b09f273c98f02128949cf5561d20dc04b3d423961efed52327","services":["bzz","pss"],"enable_msg_events":true,"port":43851},"up":true}},{"node":{"info":{"id":"2434c63e7f28b83e7feede7fe68ea99b989f8534f64d63b046733e2f474538f5","name":"node_2434c63e7f28b83e7feede7fe68ea99b989f8534f64d63b046733e2f474538f5","enode":"enode://634c327216fdc24e18f6724944cc2cdd81cd854a381e49a422c900ddb07bdbd3355b7de6240c4c3916088e39de937b6cc42f11fc8790d22d7721d0230a62273d@127.0.0.1:0","enr":"0xf88fb8403c29ef7a8afe4804b361f57edb95e1148ca1043464b23d9b238123129fcac29171eaf9a0a70e770cfe8185a3fb3fd61e5c5878f5b71c12487b79da7ab75e0e8d0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103634c327216fdc24e18f6724944cc2cdd81cd854a381e49a422c900ddb07bdbd3","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"JDTGPn8ouD5/7t5/5o6pm5ifhTT2TWOwRnM+L0dFOPU=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 2434c6\npopulation: 41 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 13 a085 b8e1 9626 9e02 | 63 92a1 (0) 91eb (0) 957d (0) 9626 (0)\n001 11 6c82 7639 7b92 78cb | 38 7dc5 (0) 7cf4 (0) 7fbc (0) 7f87 (0)\n002 8 1be4 0ff6 0ab9 0218 | 15 13bc (0) 109e (0) 1929 (0) 1be4 (0)\n003 4 372d 3cb1 38ab 39db | 6 372d (0) 3e56 (0) 3ee4 (0) 3cb1 (0)\n004 2 2a22 286a | 2 286a (0) 2a22 (0)\n005 1 213b | 1 213b (0)\n============ DEPTH: 6 ==========================================\n006 1 26d1 | 1 26d1 (0)\n007 0 | 0\n008 0 | 0\n009 1 2459 | 1 2459 (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"2434c63e7f28b83e7feede7fe68ea99b989f8534f64d63b046733e2f474538f5","private_key":"ea68ee64cd7bec8f6c5c0c14a4f6d55bc6c371c676c88a1657b73135e8183c29","name":"node_2434c63e7f28b83e7feede7fe68ea99b989f8534f64d63b046733e2f474538f5","services":["bzz","pss"],"enable_msg_events":true,"port":33513},"up":true}},{"node":{"info":{"id":"4a1811dd9febde1801a604ad81de84a2d15366d0b5c330f30f3398da0d107824","name":"node_4a1811dd9febde1801a604ad81de84a2d15366d0b5c330f30f3398da0d107824","enode":"enode://2e826c3eb8d5f9e300988ffa5fd5445a26ff486a0170c8b0d79fa439b3801c1851e45d69941f3bea632b20a7fcb3f1a53d0a504a3e886756ca25f61547eb71a3@127.0.0.1:0","enr":"0xf88fb8407eb028f17f3be43ac26f9c531d0ebeb3d8ed2e0920745e17760e6af36431612a5f81dc55334372f469f36342623f7ccd5b59f0b4e084f7aecbb474fe5ac68dc00183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1032e826c3eb8d5f9e300988ffa5fd5445a26ff486a0170c8b0d79fa439b3801c18","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"ShgR3Z/r3hgBpgStgd6EotFTZtC1wzDzDzOY2g0QeCQ=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 4a1811\npopulation: 27 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 8b76 dc97 | 63 92a1 (0) 91eb (0) 957d (0) 9626 (0)\n001 4 018a 026d 372d 2434 | 27 13bc (0) 109e (0) 1929 (0) 1be4 (0)\n002 7 772e 757a 7cf4 7f87 | 23 7dc5 (0) 7cf4 (0) 7fbc (0) 7f87 (0)\n003 7 539d 517a 5776 558e | 7 5d60 (0) 5abc (0) 5a01 (0) 539d (0)\n004 4 4167 419a 41b9 47c3 | 4 47c3 (0) 4167 (0) 419a (0) 41b9 (0)\n005 1 4cd0 | 1 4cd0 (0)\n============ DEPTH: 6 ==========================================\n006 1 48b6 | 1 48b6 (0)\n007 1 4b24 | 1 4b24 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"4a1811dd9febde1801a604ad81de84a2d15366d0b5c330f30f3398da0d107824","private_key":"29e672b50332ffce13e3c1e62ab1c36c98284e8526e6c2010adc9fc40aa4e5a8","name":"node_4a1811dd9febde1801a604ad81de84a2d15366d0b5c330f30f3398da0d107824","services":["bzz","pss"],"enable_msg_events":true,"port":45219},"up":true}},{"node":{"info":{"id":"026d2e41b82d506da685a30cce7cc5772f6c1e167b7d557e0531fb9b79dd4ff2","name":"node_026d2e41b82d506da685a30cce7cc5772f6c1e167b7d557e0531fb9b79dd4ff2","enode":"enode://1bdd224735ef8e9603bb3af3eb143963367ef184ba9c3a6266ffd8c7ea1c9825b0a565da1820ae283c905d35ad9c00c27d94edea8d308d28bb61b153a5c23831@127.0.0.1:0","enr":"0xf88fb840f1a2ef34af51d5a668030bf51780e698f351d5619a059fc5cf9c66b59b570ebc5e4bc9b8580fcb8e3f6196fc3a39e83a9220bf1726189b8e347b96e2818be9cf0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1031bdd224735ef8e9603bb3af3eb143963367ef184ba9c3a6266ffd8c7ea1c9825","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"Am0uQbgtUG2mhaMMznzFdy9sHhZ7fVV+BTH7m3ndT/I=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 026d2e\npopulation: 33 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 7 83dc 8cf9 89c8 895b | 63 91eb (0) 92a1 (0) 957d (0) 9626 (0)\n001 8 757a 78cb 7cf4 7f87 | 38 7dc5 (0) 7cf4 (0) 7fbc (0) 7f87 (0)\n002 4 3cb1 2a22 2434 213b | 12 372d (0) 3e56 (0) 3ee4 (0) 3cb1 (0)\n003 4 109e 13bc 1929 1be4 | 4 13bc (0) 109e (0) 1929 (0) 1be4 (0)\n004 3 0ff6 0bcf 0ab9 | 3 0ff6 (0) 0bcf (0) 0ab9 (0)\n005 3 06b9 0506 0427 | 3 06b9 (0) 0427 (0) 0506 (0)\n006 1 018a | 1 018a (0)\n007 1 0390 | 1 0390 (0)\n============ DEPTH: 8 ==========================================\n008 0 | 0\n009 1 0218 | 1 0218 (0)\n010 0 | 0\n011 1 027f | 1 027f (0)\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"026d2e41b82d506da685a30cce7cc5772f6c1e167b7d557e0531fb9b79dd4ff2","private_key":"66e31ccc21cf370ceb1e2bceac1499aeab637ee09f233711ef38ba3a8ba0e258","name":"node_026d2e41b82d506da685a30cce7cc5772f6c1e167b7d557e0531fb9b79dd4ff2","services":["bzz","pss"],"enable_msg_events":true,"port":45529},"up":true}},{"node":{"info":{"id":"dfaeebc8e29c6a8f851b12b80cf42567cd2a43e35d977305a3c10e51bf41170a","name":"node_dfaeebc8e29c6a8f851b12b80cf42567cd2a43e35d977305a3c10e51bf41170a","enode":"enode://b854fc358c548e135da5fc791782f459cceb3528a48cd2ebb3c35942f92414b98eea4f354c64e8292a610ee59517399f6a9ec07a68e65dce31bb82f1df156b0d@127.0.0.1:0","enr":"0xf88fb840111fd0a9953783fdda698a6547ff1c8670f1b423fe5bcb157c98582d193a643c42c531c98d7b5114d96b1547a7ccc63a03fef119855f7697e1e124a3dbdc6ae90183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103b854fc358c548e135da5fc791782f459cceb3528a48cd2ebb3c35942f92414b9","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"367ryOKcao+FGxK4DPQlZ80qQ+Ndl3MFo8EOUb9BFwo=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: dfaeeb\npopulation: 31 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 6728 667e 6c02 6d60 | 65 7dc5 (0) 7cf4 (0) 7fbc (0) 7f87 (0)\n001 5 a75a b16d b8e1 895b | 33 9a92 (0) 9d3c (0) 9ee7 (0) 9e02 (0)\n002 10 ed32 ea60 ea0e e16b | 15 e55d (0) e77f (0) e16b (0) e0b1 (0)\n003 5 c181 c3a1 ca03 cbc5 | 9 c3a1 (0) c181 (0) c8e5 (0) ca03 (0)\n004 3 d0f3 d224 d6ff | 3 d224 (0) d0f3 (0) d6ff (0)\n============ DEPTH: 5 ==========================================\n005 1 db08 | 1 db08 (0)\n006 1 dc97 | 1 dc97 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"dfaeebc8e29c6a8f851b12b80cf42567cd2a43e35d977305a3c10e51bf41170a","private_key":"f2ca8fe02aa5e39a2995330d19104fe94adc0b9bb890ce50c15ac8987c368a64","name":"node_dfaeebc8e29c6a8f851b12b80cf42567cd2a43e35d977305a3c10e51bf41170a","services":["bzz","pss"],"enable_msg_events":true,"port":46381},"up":true}},{"node":{"info":{"id":"558eb021744be19383be9ac91b9f77e07479e0eb25576bd32a3afaa94c231178","name":"node_558eb021744be19383be9ac91b9f77e07479e0eb25576bd32a3afaa94c231178","enode":"enode://670a610cec9046cca8a6097ddf0772fcc8b207ce9c573c71356934060ecf3e756298aac965d239846a16ab795b8f20f2d33d1379d6b4da7b0785eac9cb0e706f@127.0.0.1:0","enr":"0xf88fb84039cbdcd9c4550e92047787028d8613d1d69e444a7a231d53694347cc8a8cf913329ac3d692c8320f28ceb7867eb72c22b4b490db3b9c28951b511d6b72692e410183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103670a610cec9046cca8a6097ddf0772fcc8b207ce9c573c71356934060ecf3e75","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"VY6wIXRL4ZODvprJG5934HR54OslV2vTKjr6qUwjEXg=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 558eb0\npopulation: 27 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 8b76 ae67 f74e dc97 | 63 9a92 (0) 9d3c (0) 9ee7 (0) 9e02 (0)\n001 5 0218 39db 372d 2434 | 27 3cb1 (0) 3e56 (0) 3ee4 (0) 38ab (0)\n002 6 6c02 6ecb 645b 78cb | 23 7dc5 (0) 7cf4 (0) 7fbc (0) 7f87 (0)\n003 5 41b9 47c3 48b6 4b24 | 8 4167 (0) 419a (0) 41b9 (0) 47c3 (0)\n004 3 5abc 5a01 5d60 | 3 5d60 (0) 5abc (0) 5a01 (0)\n============ DEPTH: 5 ==========================================\n005 2 517a 539d | 2 539d (0) 517a (0)\n006 1 5776 | 1 5776 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"558eb021744be19383be9ac91b9f77e07479e0eb25576bd32a3afaa94c231178","private_key":"5de3f27f03f0565eb69405082120c753d823e962ee08c8e89dfca48ef957830c","name":"node_558eb021744be19383be9ac91b9f77e07479e0eb25576bd32a3afaa94c231178","services":["bzz","pss"],"enable_msg_events":true,"port":45963},"up":true}},{"node":{"info":{"id":"ae67fae4990da61ca89221c5b1675c992babb4d715b59939e47bd1491b3bf1f4","name":"node_ae67fae4990da61ca89221c5b1675c992babb4d715b59939e47bd1491b3bf1f4","enode":"enode://d5ac1961e227bd9f303a8273244adeaf02add8f9f4007c2f9d9c849ff3b9bbd9950d263905ac606d6dc5c4dd723e991ee27c80acf9584e36de09197b4db5ace5@127.0.0.1:0","enr":"0xf88fb8408715cddf6466f5cf540b8e6c8689a5881979f2696a0160c48f2274fb2ce56db820361055605b93b01a3f4324962a745010a973c17fab26ee763a8ada01abca260183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103d5ac1961e227bd9f303a8273244adeaf02add8f9f4007c2f9d9c849ff3b9bbd9","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"rmf65JkNphyokiHFsWdcmSurtNcVtZk55HvRSRs78fQ=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: ae67fa\npopulation: 25 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 39db 38ab 3cb1 3ee4 | 65 3e56 (0) 3ee4 (0) 3cb1 (0) 38ab (0)\n001 4 e55d e77f e0ea f361 | 30 c181 (0) c3a1 (0) c8e5 (0) cbc5 (0)\n002 3 9d3c 83dc 8b76 | 16 9a92 (0) 9d3c (0) 9ee7 (0) 9e02 (0)\n003 4 b8e1 b16d b486 b70e | 8 b2b9 (0) b381 (0) b16d (0) b486 (0)\n004 5 a7a6 a75a a085 a320 | 5 a7a6 (0) a75a (0) a085 (0) a2ba (0)\n============ DEPTH: 5 ==========================================\n005 0 | 0\n006 1 ad0d | 1 ad0d (0)\n007 1 afa3 | 1 afa3 (0)\n008 1 aebd | 1 aebd (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"ae67fae4990da61ca89221c5b1675c992babb4d715b59939e47bd1491b3bf1f4","private_key":"20deaabb607e4c2f3c7df5c3c5e310bf29e1fdadae1b52f9d107d40cfb6b264c","name":"node_ae67fae4990da61ca89221c5b1675c992babb4d715b59939e47bd1491b3bf1f4","services":["bzz","pss"],"enable_msg_events":true,"port":33595},"up":true}},{"node":{"info":{"id":"f36120ff250b9e7164e96021479332054f67de65cd2fe5b6e34bc51d0fe4d29c","name":"node_f36120ff250b9e7164e96021479332054f67de65cd2fe5b6e34bc51d0fe4d29c","enode":"enode://49397d0356ecc13c5bc27b3b5630f3bbab8e7c1ca7d2d4b5e074ca3c8b8dcfaf2fe2945ba899807de702c7eb3c40a572c9771d6e3211cc0b0d333e96c7990987@127.0.0.1:0","enr":"0xf88fb840a198329ff362f39bc5de95d22e342a70da5fadfb466b8eed4eb1b9f57dd6dc454815ce25795082edc3e776e68b01dc3a5d782775450daba93f28d4b4509f3dab0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10349397d0356ecc13c5bc27b3b5630f3bbab8e7c1ca7d2d4b5e074ca3c8b8dcfaf","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"82Eg/yULnnFk6WAhR5MyBU9n3mXNL+W240vFHQ/k0pw=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: f36120\npopulation: 33 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 5d60 517a 1be4 0506 | 65 5776 (0) 558e (0) 539d (0) 517a (0)\n001 10 9e02 9626 8b76 89c8 | 33 9a92 (0) 9d3c (0) 9ee7 (0) 9e02 (0)\n002 5 ce99 c181 db08 dc97 | 15 d224 (0) d0f3 (0) d6ff (0) db08 (0)\n003 10 edc8 ed32 ebca ea0e | 10 e77f (0) e55d (0) e16b (0) e0b1 (0)\n============ DEPTH: 4 ==========================================\n004 0 | 0\n005 3 f74e f410 f5c4 | 3 f410 (0) f5c4 (0) f74e (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 1 f360 | 1 f360 (0)\n========================================================================="}},"config":{"id":"f36120ff250b9e7164e96021479332054f67de65cd2fe5b6e34bc51d0fe4d29c","private_key":"71622f176e027738b9284c5ca316f6736d1af20a0c5b2874bc826a6493d3e403","name":"node_f36120ff250b9e7164e96021479332054f67de65cd2fe5b6e34bc51d0fe4d29c","services":["bzz","pss"],"enable_msg_events":true,"port":40147},"up":true}},{"node":{"info":{"id":"0506e949748b62da1d36b663df7d6a7e76027f72ced5d52f74677fb31d7e1505","name":"node_0506e949748b62da1d36b663df7d6a7e76027f72ced5d52f74677fb31d7e1505","enode":"enode://c7d55b42435ae9eebddd09b4960f97586b686903470dd4b908acfc157b42c2d6dfc9b4a54f29dfeb3fb84963511229a1b277bac428b07daf80036a03c9075180@127.0.0.1:0","enr":"0xf88fb84017229330778245921bef57e2428e7cec260ff8ddf2ca65fd32d601b6deb58561107253d30829606a2a6848f578bc6a7a38854ff60ef6c34af5b9b791d3c0e5e40183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102c7d55b42435ae9eebddd09b4960f97586b686903470dd4b908acfc157b42c2d6","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"BQbpSXSLYtodNrZj331qfnYCf3LO1dUvdGd/sx1+FQU=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 0506e9\npopulation: 33 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 8 9626 a7a6 db08 c181 | 63 91eb (0) 92a1 (0) 957d (0) 9626 (0)\n001 3 7b92 5d60 517a | 38 558e (0) 5776 (0) 539d (0) 517a (0)\n002 8 372d 39db 38ab 3cb1 | 12 3e56 (0) 3ee4 (0) 3cb1 (0) 38ab (0)\n003 4 13bc 109e 1929 1be4 | 4 13bc (0) 109e (0) 1929 (0) 1be4 (0)\n004 3 0ab9 0bcf 0ff6 | 3 0ff6 (0) 0bcf (0) 0ab9 (0)\n005 5 018a 0390 026d 027f | 5 0390 (0) 0218 (0) 027f (0) 026d (0)\n============ DEPTH: 6 ==========================================\n006 1 06b9 | 1 06b9 (0)\n007 1 0427 | 1 0427 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"0506e949748b62da1d36b663df7d6a7e76027f72ced5d52f74677fb31d7e1505","private_key":"d54090bceb0325e7d681953c0c9b885b52b9fde17c87981f51927d5458bdec1f","name":"node_0506e949748b62da1d36b663df7d6a7e76027f72ced5d52f74677fb31d7e1505","services":["bzz","pss"],"enable_msg_events":true,"port":42705},"up":true}},{"node":{"info":{"id":"cdcd165721f6851f361fad0b3ba88c8870be9ad6d6b8cbcecc7c89e1068d979a","name":"node_cdcd165721f6851f361fad0b3ba88c8870be9ad6d6b8cbcecc7c89e1068d979a","enode":"enode://15721bb131c5000be7e9d400500ccf12cd6a04edf750c1fc78e225c6728baa8fb5c18e2e68c16d05b26f9642d009b6ca670eb011fce286318a4281ec930da572@127.0.0.1:0","enr":"0xf88fb840c585ecd30f00f1f4839d519a833ff3434caa90c288ae094854454e6f9b846c84292aa12c66d3327f9e57934efb3cd562b9c14ba7c2c39303c39271dc148bab390183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10215721bb131c5000be7e9d400500ccf12cd6a04edf750c1fc78e225c6728baa8f","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"zc0WVyH2hR82H60LO6iMiHC+mtbWuMvOzHyJ4QaNl5o=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: cdcd16\npopulation: 26 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 6d60 645b 0506 | 65 47c3 (0) 4167 (0) 419a (0) 41b9 (0)\n001 4 a75a b16d 8b76 83dc | 33 9a92 (0) 9d3c (0) 9e02 (0) 9ee7 (0)\n002 6 f74e e0ea e0b1 edc8 | 15 e55d (0) e77f (0) e16b (0) e0b1 (0)\n003 5 d224 d6ff dc97 dfae | 6 d224 (0) d0f3 (0) d6ff (0) db08 (0)\n004 2 c181 c3a1 | 2 c3a1 (0) c181 (0)\n005 3 c8e5 ca03 cbc5 | 3 c8e5 (0) ca03 (0) cbc5 (0)\n============ DEPTH: 6 ==========================================\n006 3 cfbb ce99 cec3 | 3 cfbb (0) cec3 (0) ce99 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"cdcd165721f6851f361fad0b3ba88c8870be9ad6d6b8cbcecc7c89e1068d979a","private_key":"dc9c6faeb1b0ed2241977e5e119fb047b527baa72b57faf6a490bfa2463702b1","name":"node_cdcd165721f6851f361fad0b3ba88c8870be9ad6d6b8cbcecc7c89e1068d979a","services":["bzz","pss"],"enable_msg_events":true,"port":44531},"up":true}},{"node":{"info":{"id":"645b4e6b36fc1928725f627aeed278f46c5a7d6b0fff7ccff55a0468d47b23e8","name":"node_645b4e6b36fc1928725f627aeed278f46c5a7d6b0fff7ccff55a0468d47b23e8","enode":"enode://c5df28a427ebcae9a135bf8f4e05d5507d48467c55937ae432e5453a53516d1d67d16f232b7ec71929f992ebb8d25fa8442c2e4ec12b9b9c2e90365d0ec58d62@127.0.0.1:0","enr":"0xf88fb8407d96a32e90f5234bc9b785b90e5ecbbc3c002e4307bfc19f4141f794943d59ac256d05f75f0afd515d598bdd6a82b8db9167d584b304303c4db1bc563447b0f70183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102c5df28a427ebcae9a135bf8f4e05d5507d48467c55937ae432e5453a53516d1d","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"ZFtOazb8GShyX2J67tJ49GxafWsP/3zP9VoEaNR7I+g=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 645b4e\npopulation: 28 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 8b76 a320 d6ff cdcd | 63 92a1 (0) 91eb (0) 957d (0) 9626 (0)\n001 2 1be4 213b | 27 13bc (0) 109e (0) 1929 (0) 1be4 (0)\n002 9 5d60 5abc 5a01 5776 | 15 47c3 (0) 4167 (0) 419a (0) 41b9 (0)\n003 6 734e 757a 772e 7cf4 | 12 7fbc (0) 7f87 (0) 7dc5 (0) 7cf4 (0)\n004 3 6c82 6d60 6e5c | 6 6982 (0) 6c82 (0) 6c02 (0) 6d60 (0)\n005 1 6210 | 1 6210 (0)\n============ DEPTH: 6 ==========================================\n006 3 667e 6742 6728 | 3 667e (0) 6742 (0) 6728 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"645b4e6b36fc1928725f627aeed278f46c5a7d6b0fff7ccff55a0468d47b23e8","private_key":"04fc1c10d7b313a061609b0eed8efdc7b1d9fd9169d7d7d5381d5ef4a53086f9","name":"node_645b4e6b36fc1928725f627aeed278f46c5a7d6b0fff7ccff55a0468d47b23e8","services":["bzz","pss"],"enable_msg_events":true,"port":35261},"up":true}},{"node":{"info":{"id":"213bf6e78e02a57585908c756f0965297152c3c400a0ed4c407a411e1ec5942d","name":"node_213bf6e78e02a57585908c756f0965297152c3c400a0ed4c407a411e1ec5942d","enode":"enode://761923555d54e992f473a9407939c25446dcfdda08081916f298c2fb2c8380ed0cf602deba79e7ff4ebd2c17f9cece98ae0e15539870f66a634b733171e0ec27@127.0.0.1:0","enr":"0xf88fb84009b10445736e612ea99db7cb50e94305fdfee64d061a1bb4fb2cf291ff6ecffc7311805dc59471a2997aa537f1c1d964a2d26f94a8433a498003cd0ed5bace8b0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103761923555d54e992f473a9407939c25446dcfdda08081916f298c2fb2c8380ed","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"ITv2544CpXWFkIx1bwllKXFSw8QAoO1MQHpBHh7FlC0=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 213bf6\npopulation: 26 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 ea60 cec3 b16d 89c8 | 63 92a1 (0) 91eb (0) 957d (0) 9626 (0)\n001 4 41b9 5776 558e 645b | 38 47c3 (0) 4167 (0) 419a (0) 41b9 (0)\n002 7 1be4 109e 0506 0427 | 15 13bc (0) 109e (0) 1929 (0) 1be4 (0)\n003 4 372d 3cb1 38ab 39db | 6 3ee4 (0) 3e56 (0) 3cb1 (0) 38ab (0)\n004 2 286a 2a22 | 2 2a22 (0) 286a (0)\n============ DEPTH: 5 ==========================================\n005 3 26d1 2459 2434 | 3 26d1 (0) 2459 (0) 2434 (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"213bf6e78e02a57585908c756f0965297152c3c400a0ed4c407a411e1ec5942d","private_key":"bb9e629d827643ea4b3d2c1f6c8a26cc16d191cec7709cdbdbf10fcfa47361b6","name":"node_213bf6e78e02a57585908c756f0965297152c3c400a0ed4c407a411e1ec5942d","services":["bzz","pss"],"enable_msg_events":true,"port":33711},"up":true}},{"node":{"info":{"id":"018adc613f78d6ec876274f821251fd049eb3651646cd69e27efe211fe88d936","name":"node_018adc613f78d6ec876274f821251fd049eb3651646cd69e27efe211fe88d936","enode":"enode://e176b178b7c28353b25e6ae0584c3cd889c856b2bffd5c41cfb6b013ef2ebf3ee736f96dc0ebbb82bb3ebb2fefd70e8465cc77fe5bda8ab3068748044122bae4@127.0.0.1:0","enr":"0xf88fb8402a03da3911096a8fd7d223cc3dbf67101905e23b5b0c57af60f84593af3ac73e58f9d55a0d7ff7284740335e16e4305a45484856e16b8428743a7862d89b2f4d0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102e176b178b7c28353b25e6ae0584c3cd889c856b2bffd5c41cfb6b013ef2ebf3e","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"AYrcYT941uyHYnT4ISUf0EnrNlFkbNaeJ+/iEf6I2TY=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 018adc\npopulation: 42 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 14 83dc 8cf9 89c8 895b | 63 957d (0) 9626 (0) 92a1 (0) 91eb (0)\n001 11 6c82 7639 7b92 7f87 | 38 734e (0) 7355 (0) 73b8 (0) 757a (0)\n002 3 3cb1 2a22 213b | 12 372d (0) 3e56 (0) 3ee4 (0) 3cb1 (0)\n003 4 109e 13bc 1929 1be4 | 4 13bc (0) 109e (0) 1929 (0) 1be4 (0)\n004 3 0ff6 0bcf 0ab9 | 3 0ff6 (0) 0bcf (0) 0ab9 (0)\n005 3 0506 0427 06b9 | 3 06b9 (0) 0427 (0) 0506 (0)\n============ DEPTH: 6 ==========================================\n006 4 0390 0218 027f 026d | 4 0390 (0) 0218 (0) 027f (0) 026d (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"018adc613f78d6ec876274f821251fd049eb3651646cd69e27efe211fe88d936","private_key":"b416fa1edc6a9481a2700407cc6b4cf1fe22447bcfced748269842bb79bd7be1","name":"node_018adc613f78d6ec876274f821251fd049eb3651646cd69e27efe211fe88d936","services":["bzz","pss"],"enable_msg_events":true,"port":38849},"up":true}},{"node":{"info":{"id":"edc8794153fb517085d27a83a4b00e8c3b37f22d2242b842cb2fab66764de9fe","name":"node_edc8794153fb517085d27a83a4b00e8c3b37f22d2242b842cb2fab66764de9fe","enode":"enode://bcb2c62558ac0c921253415556bb8521bb1f361278884453958a4ad1c6d2d761d9c4ea778253061cbb4a18a63c700bd5ec3b4e98d0ee89f4d68789a49a255c1a@127.0.0.1:0","enr":"0xf88fb840969cc1e8767d29e18d752912b07d4f68a5612caf1a3d7e4b924b03fb8f6f41da1725d64bd2cda2fabf6d5df9b87ac5e7873946a70a71fc605d58f5091e260e2c0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102bcb2c62558ac0c921253415556bb8521bb1f361278884453958a4ad1c6d2d761","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"7ch5QVP7UXCF0nqDpLAOjDs38i0iQrhCyy+rZnZN6f4=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: edc879\npopulation: 26 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 772e 5d60 5a01 1be4 | 65 6982 (0) 6ecb (0) 6e5c (0) 6d60 (0)\n001 3 a7a6 8cf9 83dc | 33 92a1 (0) 91eb (0) 957d (0) 9626 (0)\n002 6 db08 ce99 cdcd ca03 | 15 c8e5 (0) ca03 (0) cbc5 (0) cfbb (0)\n003 3 f361 f360 f74e | 5 f5c4 (0) f410 (0) f74e (0) f360 (0)\n004 5 e16b e0b1 e0ea e55d | 5 e16b (0) e0ea (0) e0b1 (0) e55d (0)\n============ DEPTH: 5 ==========================================\n005 3 ebca ea0e ea60 | 3 ebca (0) ea0e (0) ea60 (0)\n006 0 | 0\n007 0 | 0\n008 1 ed32 | 1 ed32 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"edc8794153fb517085d27a83a4b00e8c3b37f22d2242b842cb2fab66764de9fe","private_key":"cc8bb9100f25964f245e87e3f9bf408be100ad3a6d25298aaf5c1cec3309e03c","name":"node_edc8794153fb517085d27a83a4b00e8c3b37f22d2242b842cb2fab66764de9fe","services":["bzz","pss"],"enable_msg_events":true,"port":46185},"up":true}},{"node":{"info":{"id":"5a01993ff7b4bd12fdb259e96b26a036d0cf5d4ae9c9b516be64b63acec2443a","name":"node_5a01993ff7b4bd12fdb259e96b26a036d0cf5d4ae9c9b516be64b63acec2443a","enode":"enode://be300889154a90ed33d9cf94b4ff711ba4b0fd2831f1c923f836379f54c554a322b2ffd67ad31b60921194ecbaf36fb2ae1fcaf4f83b5f8d09d04771a8bd6fde@127.0.0.1:0","enr":"0xf88fb84021eb12c9a4bca577771c8a61b0f665dda93925bca15665a86baca81ba20608c50975baba6dfbe9f8d7c81aed39d6fd56b12badc27b7e8cae94445a3bdf1cc94f0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102be300889154a90ed33d9cf94b4ff711ba4b0fd2831f1c923f836379f54c554a3","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"WgGZP/e0vRL9slnpayagNtDPXUrpybUWvmS2Os7CRDo=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 5a0199\npopulation: 26 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 dc97 e0ea edc8 b2b9 | 63 ca03 (0) cbc5 (0) c8e5 (0) cdcd (0)\n001 3 372d 2434 1be4 | 27 372d (0) 3cb1 (0) 3ee4 (0) 3e56 (0)\n002 6 757a 667e 645b 6c02 | 23 6210 (0) 6742 (0) 6728 (0) 667e (0)\n003 6 4167 41b9 419a 47c3 | 8 47c3 (0) 4167 (0) 419a (0) 41b9 (0)\n004 4 5776 558e 517a 539d | 4 558e (0) 5776 (0) 539d (0) 517a (0)\n============ DEPTH: 5 ==========================================\n005 1 5d60 | 1 5d60 (0)\n006 0 | 0\n007 0 | 0\n008 1 5abc | 1 5abc (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"5a01993ff7b4bd12fdb259e96b26a036d0cf5d4ae9c9b516be64b63acec2443a","private_key":"33fe2e9d121fb48e9e8ff1552b58a42c5f6d078b47223f83f9aecc781953dd8a","name":"node_5a01993ff7b4bd12fdb259e96b26a036d0cf5d4ae9c9b516be64b63acec2443a","services":["bzz","pss"],"enable_msg_events":true,"port":39861},"up":true}},{"node":{"info":{"id":"b8e1a80d91216fd5f8bc3f7413caf68ade7f124354d44fe7bd155a089134a70a","name":"node_b8e1a80d91216fd5f8bc3f7413caf68ade7f124354d44fe7bd155a089134a70a","enode":"enode://3bd0292e58c0d4c952c3d2ff221410cb20c7ffac7848e2c5d351e32cbb578ddba8be42843dd17f2daa62079d6ce7886946d545db1845f9d31cf67dcd9e285c66@127.0.0.1:0","enr":"0xf88fb84069b7f53f8dde1ec32c5ac7119d271f0c63fdcfddf4ba67b3bd0f4a190049baee56b5a605f02fcefc86416f72d03d3a21fe91db5629d059a026b8a2ff9f3450ac0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1023bd0292e58c0d4c952c3d2ff221410cb20c7ffac7848e2c5d351e32cbb578ddb","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"uOGoDZEhb9X4vD90E8r2it5/EkNU1E/nvRVaCJE0pwo=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: b8e1a8\npopulation: 29 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 2434 109e 0218 06b9 | 65 372d (0) 3cb1 (0) 3e56 (0) 3ee4 (0)\n001 5 e77f e55d db08 dfae | 30 ca03 (0) cbc5 (0) c8e5 (0) cdcd (0)\n002 7 83dc 89c8 895b 8b76 | 16 92a1 (0) 91eb (0) 957d (0) 9626 (0)\n003 5 ae67 a320 a2ba a75a | 9 a085 (0) a2ba (0) a320 (0) a75a (0)\n004 5 b2b9 b381 b16d b70e | 5 b2b9 (0) b381 (0) b16d (0) b70e (0)\n============ DEPTH: 5 ==========================================\n005 0 | 0\n006 0 | 0\n007 1 b92a | 1 b92a (0)\n008 1 b841 | 1 b841 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"b8e1a80d91216fd5f8bc3f7413caf68ade7f124354d44fe7bd155a089134a70a","private_key":"dac5558d2b06b587645b8308b63c3c7a7d9d90ec36353760cb9c656ee41fe6d5","name":"node_b8e1a80d91216fd5f8bc3f7413caf68ade7f124354d44fe7bd155a089134a70a","services":["bzz","pss"],"enable_msg_events":true,"port":33565},"up":true}},{"node":{"info":{"id":"b486ce31ce880db3aaa17a0ac2c2f3554b6fe71f9c051edb572974342af4adb9","name":"node_b486ce31ce880db3aaa17a0ac2c2f3554b6fe71f9c051edb572974342af4adb9","enode":"enode://f3da79d322438356e44f3b4036211300b07efa604f756ee0e60b1cfa5bd21fe2339ddf44138c970dd83db24f66b75d48e7b97492d75cae27dac3d1da16205d45@127.0.0.1:0","enr":"0xf88fb8403f9763127c7628679fe7fcaba9c97b58e29d4bab1758c67f241c249a66177230530b8da7ce97ec138bedc08717a7e96f184614db39decae489ad12dfe3d606090183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103f3da79d322438356e44f3b4036211300b07efa604f756ee0e60b1cfa5bd21fe2","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"tIbOMc6IDbOqoXoKwsLzVUtv5x+cBR7bVyl0NCr0rbk=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: b486ce\npopulation: 27 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 11 6c82 6c02 6e5c 7cf4 | 65 734e (0) 7355 (0) 73b8 (0) 757a (0)\n001 2 db08 c181 | 30 ca03 (0) cbc5 (0) c8e5 (0) cdcd (0)\n002 3 9ee7 8b76 83dc | 16 91eb (0) 92a1 (0) 957d (0) 9626 (0)\n003 4 a7a6 a320 afa3 ae67 | 9 ad0d (0) afa3 (0) aebd (0) ae67 (0)\n004 3 b92a b841 b8e1 | 3 b92a (0) b841 (0) b8e1 (0)\n============ DEPTH: 5 ==========================================\n005 3 b2b9 b381 b16d | 3 b2b9 (0) b381 (0) b16d (0)\n006 1 b70e | 1 b70e (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"b486ce31ce880db3aaa17a0ac2c2f3554b6fe71f9c051edb572974342af4adb9","private_key":"60109f1a20e5d694e88f021d4e588994aae7c2ecfca6a950149c53652f4a5b3a","name":"node_b486ce31ce880db3aaa17a0ac2c2f3554b6fe71f9c051edb572974342af4adb9","services":["bzz","pss"],"enable_msg_events":true,"port":44351},"up":true}},{"node":{"info":{"id":"1be4348ec5670cdc4f164d77b1356e7910b6d1be4a9b720e549d02e5482a9e78","name":"node_1be4348ec5670cdc4f164d77b1356e7910b6d1be4a9b720e549d02e5482a9e78","enode":"enode://8375557348b05531d3d6a4b6f494f44e33c0a1862c0c63fce6ab3e8a389adb299f4fb14a74d2ef9160d2df04f362af2e9c7021f0cabc9bf4a116663b62dce076@127.0.0.1:0","enr":"0xf88fb8404ea89c730deaca09ae7f36423dd170ee83ef05e71559ce57692a4cb2a14e79a73f552356028fc016ecbee9961b2691884662145357a4c9db80d0d3156feda59c0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1028375557348b05531d3d6a4b6f494f44e33c0a1862c0c63fce6ab3e8a389adb29","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"G+Q0jsVnDNxPFk13sTVueRC20b5Km3IOVJ0C5Ugqnng=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 1be434\npopulation: 41 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 14 cec3 cbc5 ea0e ea60 | 63 f5c4 (0) f410 (0) f74e (0) f360 (0)\n001 9 78cb 7f87 6c82 645b | 38 73b8 (0) 7355 (0) 734e (0) 757a (0)\n002 4 372d 286a 213b 2434 | 12 3e56 (0) 3ee4 (0) 3cb1 (0) 38ab (0)\n003 11 0ff6 0bcf 0ab9 018a | 11 0ff6 (0) 0bcf (0) 0ab9 (0) 06b9 (0)\n============ DEPTH: 4 ==========================================\n004 2 13bc 109e | 2 13bc (0) 109e (0)\n005 0 | 0\n006 1 1929 | 1 1929 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"1be4348ec5670cdc4f164d77b1356e7910b6d1be4a9b720e549d02e5482a9e78","private_key":"f4c9d012e654cc97f045dbff8811d75d2bc28f743389ed83138c83f208c0c4a3","name":"node_1be4348ec5670cdc4f164d77b1356e7910b6d1be4a9b720e549d02e5482a9e78","services":["bzz","pss"],"enable_msg_events":true,"port":39499},"up":true}},{"node":{"info":{"id":"517aa977048247d5d16ad51a286ffac4d8f910733f0578b222201308c32d195e","name":"node_517aa977048247d5d16ad51a286ffac4d8f910733f0578b222201308c32d195e","enode":"enode://84e56a199123357e4baa395c602310fd7ee347f259e1a71c6f6fea49356dee106bdd2103681d15f896df139363b8caf91a70e2927012eb4ed3189abc8574c05f@127.0.0.1:0","enr":"0xf88fb84006dac2d9b267151a93241e398113497441d145d87211a3c352c7f87348ac8ce506d1e2d81d2e99f9e4320692bb2519b52e0ec44d5b98dd50de8964f0f869abef0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10384e56a199123357e4baa395c602310fd7ee347f259e1a71c6f6fea49356dee10","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"UXqpdwSCR9XRatUaKG/6xNj5EHM/BXiyIiATCMMtGV4=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 517aa9\npopulation: 21 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 dc97 e0ea e77f f361 | 63 f410 (0) f5c4 (0) f74e (0) f360 (0)\n001 3 018a 0506 1be4 | 27 3cb1 (0) 3e56 (0) 3ee4 (0) 38ab (0)\n002 3 757a 772e 645b | 23 73b8 (0) 734e (0) 7355 (0) 757a (0)\n003 5 4a18 4b24 419a 41b9 | 8 47c3 (0) 4167 (0) 419a (0) 41b9 (0)\n004 3 5abc 5a01 5d60 | 3 5abc (0) 5a01 (0) 5d60 (0)\n============ DEPTH: 5 ==========================================\n005 2 558e 5776 | 2 558e (0) 5776 (0)\n006 1 539d | 1 539d (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"517aa977048247d5d16ad51a286ffac4d8f910733f0578b222201308c32d195e","private_key":"468bb419433b15b2933469b68aecf09e25fe8872c8128a2ee0198d626c5e16a9","name":"node_517aa977048247d5d16ad51a286ffac4d8f910733f0578b222201308c32d195e","services":["bzz","pss"],"enable_msg_events":true,"port":43881},"up":true}},{"node":{"info":{"id":"5d608e66a17442091111cb472723fe3aea1f2baecaa546b57d49507c63a61cda","name":"node_5d608e66a17442091111cb472723fe3aea1f2baecaa546b57d49507c63a61cda","enode":"enode://04a81661386177d0609fc1bd233738fbb96b9280ab323c85ceac159c0854dc725e4c84c8957ba802498745365c937a581e09c8a4a1580b0dce82e5dcaef08ee4@127.0.0.1:0","enr":"0xf88fb840dee34144fcdd9b6e5d1be0361509c91c011d627a6a3b69edbbcb3a90f7252f5b4aa02cec8d59613ac817a9336ddf3e1673f6509927af5c0b4bc44d01a9fb7f440183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10204a81661386177d0609fc1bd233738fbb96b9280ab323c85ceac159c0854dc72","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"XWCOZqF0QgkREctHJyP+OuofK67KpUa1fUlQfGOmHNo=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 5d608e\npopulation: 27 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 9 f74e f361 edc8 ea0e | 63 f5c4 (0) f410 (0) f74e (0) f360 (0)\n001 2 018a 0506 | 27 38ab (0) 39db (0) 3e56 (0) 3ee4 (0)\n002 7 6ecb 645b 757a 772e | 23 73b8 (0) 734e (0) 7355 (0) 757a (0)\n003 3 47c3 41b9 4a18 | 8 4cd0 (0) 48b6 (0) 4b24 (0) 4a18 (0)\n004 4 5776 558e 539d 517a | 4 558e (0) 5776 (0) 539d (0) 517a (0)\n============ DEPTH: 5 ==========================================\n005 2 5abc 5a01 | 2 5abc (0) 5a01 (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"5d608e66a17442091111cb472723fe3aea1f2baecaa546b57d49507c63a61cda","private_key":"81c50622bdad71d45180a827fe4f2709ac6e73ab5b1d7f135ae6c563bdf67dfc","name":"node_5d608e66a17442091111cb472723fe3aea1f2baecaa546b57d49507c63a61cda","services":["bzz","pss"],"enable_msg_events":true,"port":46869},"up":true}},{"node":{"info":{"id":"83dc556ed36f37d06765be2554fe86eaf1ec21e2931fb22403238453bf021dfb","name":"node_83dc556ed36f37d06765be2554fe86eaf1ec21e2931fb22403238453bf021dfb","enode":"enode://9903840de4085e02bf4b40b91137ea82baf327272e40f2a68b0bacc22064465e695d1053d48ade3cc707fe05b2f395540b7e8aaed800b8a746085969ea98a8c1@127.0.0.1:0","enr":"0xf88fb840ef8ed31b921f8a77d4906bb0fa6b72a27e794b68d3615d8c5035c35186f636a554ccec2b28662884c8454b4134c077320be3b5e6472693c92cf8945deab453840183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1039903840de4085e02bf4b40b91137ea82baf327272e40f2a68b0bacc22064465e","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"g9xVbtNvN9BnZb4lVP6G6vHsIeKTH7IkAyOEU78CHfs=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 83dc55\npopulation: 36 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 018a 026d 2434 213b | 65 372d (0) 38ab (0) 39db (0) 3cb1 (0)\n001 11 f361 f74e e77f e0b1 | 30 f410 (0) f5c4 (0) f74e (0) f360 (0)\n002 8 a7a6 a2ba a320 ae67 | 17 b70e (0) b486 (0) b2b9 (0) b381 (0)\n003 5 9626 9a92 9d3c 9e02 | 8 92a1 (0) 91eb (0) 957d (0) 9626 (0)\n004 5 8cf9 895b 89c8 8be4 | 5 8cf9 (0) 8be4 (0) 8b76 (0) 895b (0)\n============ DEPTH: 5 ==========================================\n005 1 86ca | 1 86ca (0)\n006 0 | 0\n007 1 82f0 | 1 82f0 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"83dc556ed36f37d06765be2554fe86eaf1ec21e2931fb22403238453bf021dfb","private_key":"996588cd689e21ae98c63522cc84c5ca8c59901f1738bf888136a0d84745625a","name":"node_83dc556ed36f37d06765be2554fe86eaf1ec21e2931fb22403238453bf021dfb","services":["bzz","pss"],"enable_msg_events":true,"port":44859},"up":true}},{"node":{"info":{"id":"db088103f3b6f2c784d76ecd99c8b4a77fd39bb39c72ddfd91c99c1a9dd3b75b","name":"node_db088103f3b6f2c784d76ecd99c8b4a77fd39bb39c72ddfd91c99c1a9dd3b75b","enode":"enode://0620b99063bcbdca96543150c5bcaa6bbae76cfa9d6a5700cec06bcac3f80ddbb3e87099c7516c8bf7e1fc7bbe1a2c74decdb9beacdc44ed6b5ea859a7681da9@127.0.0.1:0","enr":"0xf88fb8409dedfae6e6fc520e43e7d06cb137d94f183daa858fb40bef2a6b1e677ec9e96c7ae3a0fdbc5513424aed12e0358fad4c8358f48c69e806c50c7d002c899356370183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1030620b99063bcbdca96543150c5bcaa6bbae76cfa9d6a5700cec06bcac3f80ddb","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"2wiBA/O28seE127Nmci0p3/Tm7Occt39kcmcGp3Tt1s=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: db0881\npopulation: 32 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 7fbc 0427 0506 | 65 3cb1 (0) 3e56 (0) 3ee4 (0) 38ab (0)\n001 6 b16d b486 b70e b841 | 33 b92a (0) b841 (0) b8e1 (0) b70e (0)\n002 11 f74e f360 f361 e77f | 15 f410 (0) f5c4 (0) f74e (0) f360 (0)\n003 7 ca03 cbc5 c8e5 cdcd | 9 ca03 (0) cbc5 (0) c8e5 (0) cdcd (0)\n004 3 d0f3 d224 d6ff | 3 d224 (0) d0f3 (0) d6ff (0)\n============ DEPTH: 5 ==========================================\n005 2 dc97 dfae | 2 dc97 (0) dfae (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"db088103f3b6f2c784d76ecd99c8b4a77fd39bb39c72ddfd91c99c1a9dd3b75b","private_key":"531ff73ac55db42d259eda258c322099463847f19f0e133a69fe506626d432c8","name":"node_db088103f3b6f2c784d76ecd99c8b4a77fd39bb39c72ddfd91c99c1a9dd3b75b","services":["bzz","pss"],"enable_msg_events":true,"port":33251},"up":true}},{"node":{"info":{"id":"c18105aa302a43e352d999745a0f806af9f8cb8bb83349357da5c85e8975acd1","name":"node_c18105aa302a43e352d999745a0f806af9f8cb8bb83349357da5c85e8975acd1","enode":"enode://c09ff8bce7f3f84fda572912d07e2fd5303e8a9bcd69f3794ebec6268fba90310761b6f73741b9701a1928f9af099bb8eda1d9d38e849a12fd21d9a8a6f43b37@127.0.0.1:0","enr":"0xf88fb8408bae0ad58fe6f74ee5e733985301353441b70d767126573c80639676f5d3c0d94ab77ee9239739d4a1b3ab7328206c2d561f9468e37e76fe16c2d02be7e0c5ab0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103c09ff8bce7f3f84fda572912d07e2fd5303e8a9bcd69f3794ebec6268fba9031","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"wYEFqjAqQ+NS2Zl0Wg+Aavn4y4u4M0k1faXIXol1rNE=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: c18105\npopulation: 25 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 286a 0427 0506 | 65 3cb1 (0) 3ee4 (0) 3e56 (0) 38ab (0)\n001 5 8b76 b16d b486 b8e1 | 33 91eb (0) 92a1 (0) 9626 (0) 957d (0)\n002 5 e0b1 e0ea f74e f360 | 15 f5c4 (0) f410 (0) f74e (0) f360 (0)\n003 4 d224 dc97 dfae db08 | 6 d0f3 (0) d224 (0) d6ff (0) dc97 (0)\n============ DEPTH: 4 ==========================================\n004 7 c8e5 ca03 cbc5 cdcd | 7 ca03 (0) cbc5 (0) c8e5 (0) cdcd (0)\n005 0 | 0\n006 1 c3a1 | 1 c3a1 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"c18105aa302a43e352d999745a0f806af9f8cb8bb83349357da5c85e8975acd1","private_key":"7a2924b057c33f05e57a60b815f1c80855c3acc417bf37cd31d281f670cba443","name":"node_c18105aa302a43e352d999745a0f806af9f8cb8bb83349357da5c85e8975acd1","services":["bzz","pss"],"enable_msg_events":true,"port":40633},"up":true}},{"node":{"info":{"id":"a7a61804d270ed6c27a4b1e8a634c30d7cdbaf644a1c67cbc6b08cd849a711db","name":"node_a7a61804d270ed6c27a4b1e8a634c30d7cdbaf644a1c67cbc6b08cd849a711db","enode":"enode://f06cb29c4ffab0c600cf7e7834032f1aab24cf48200d31c1c67b6ba2ee38195c9596df70c664d38cc53bdbcda0bb8c9bda598d0e0f3b377f5f6568b3725f7ba2@127.0.0.1:0","enr":"0xf88fb8404d99eb2b83e49511188c6105f0ef75fc98bd4e9871cb3b328d0fbec9f69153952df139a6d1d39c45e99b4baf70040b97087c9ccdf54aed111a2cf7435a6f574b0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102f06cb29c4ffab0c600cf7e7834032f1aab24cf48200d31c1c67b6ba2ee38195c","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"p6YYBNJw7WwnpLHopjTDDXzbr2RKHGfLxrCM2EmnEds=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: a7a618\npopulation: 38 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 10 109e 0ff6 06b9 0506 | 65 372d (0) 38ab (0) 39db (0) 3cb1 (0)\n001 8 f360 f361 f410 ebca | 30 f74e (0) f5c4 (0) f410 (0) f361 (0)\n002 6 92a1 9ee7 8b76 8be4 | 16 957d (0) 9626 (0) 91eb (0) 92a1 (0)\n003 6 b841 b8e1 b486 b70e | 8 b92a (0) b841 (0) b8e1 (0) b70e (0)\n004 4 ad0d afa3 aebd ae67 | 4 ad0d (0) afa3 (0) aebd (0) ae67 (0)\n============ DEPTH: 5 ==========================================\n005 3 a085 a320 a2ba | 3 a085 (0) a2ba (0) a320 (0)\n006 0 | 0\n007 0 | 0\n008 1 a75a | 1 a75a (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"a7a61804d270ed6c27a4b1e8a634c30d7cdbaf644a1c67cbc6b08cd849a711db","private_key":"78a5f9f36119c4686d8fb667f830f052885e6485e92dd09b9fed7f9e01368f83","name":"node_a7a61804d270ed6c27a4b1e8a634c30d7cdbaf644a1c67cbc6b08cd849a711db","services":["bzz","pss"],"enable_msg_events":true,"port":35649},"up":true}},{"node":{"info":{"id":"b16dcdf1ff1a56d49e374531d9885d59c1bcfbb628604520d9b1d84662edb9ca","name":"node_b16dcdf1ff1a56d49e374531d9885d59c1bcfbb628604520d9b1d84662edb9ca","enode":"enode://3a9f619551e6b60c9edcac716ff28cd93af12dbc9b07a2c9ea541a8e3666f513d0b05e82cae81eb72534d3784d41a948cba2a1d9db8b3764feee40d52290427b@127.0.0.1:0","enr":"0xf88fb8403bcb9b72c0dd4b343993b4c02c8d3dfd1a66f01fd355938b0d91547730d0fdef30e0150cbf8f5999ecd82b2ba083bb019e0fc5d96ed35baf82b80b3645eb4c4f0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1033a9f619551e6b60c9edcac716ff28cd93af12dbc9b07a2c9ea541a8e3666f513","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"sW3N8f8aVtSeN0Ux2YhdWcG8+7YoYEUg2bHYRmLtuco=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: b16dcd\npopulation: 32 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 8 7f87 78cb 41b9 47c3 | 65 38ab (0) 39db (0) 3cb1 (0) 3e56 (0)\n001 10 ce99 cdcd c8e5 cbc5 | 30 d224 (0) d0f3 (0) d6ff (0) dc97 (0)\n002 4 9d3c 9ee7 8b76 83dc | 16 9626 (0) 957d (0) 91eb (0) 92a1 (0)\n003 3 ae67 a320 a7a6 | 9 ad0d (0) afa3 (0) aebd (0) ae67 (0)\n004 3 b92a b841 b8e1 | 3 b92a (0) b841 (0) b8e1 (0)\n005 2 b70e b486 | 2 b70e (0) b486 (0)\n============ DEPTH: 6 ==========================================\n006 2 b2b9 b381 | 2 b2b9 (0) b381 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"b16dcdf1ff1a56d49e374531d9885d59c1bcfbb628604520d9b1d84662edb9ca","private_key":"ede19b96340b0babe7021d81a8ec746406996af53908a387cd2e9f1551651869","name":"node_b16dcdf1ff1a56d49e374531d9885d59c1bcfbb628604520d9b1d84662edb9ca","services":["bzz","pss"],"enable_msg_events":true,"port":33287},"up":true}},{"node":{"info":{"id":"ea60ef7cb3f2166a5c8e286c885984943a2ea5aff4730015be6a15031040cecf","name":"node_ea60ef7cb3f2166a5c8e286c885984943a2ea5aff4730015be6a15031040cecf","enode":"enode://a3a82e04610c3851f4b6b80bdd5666f8c2eb2a5c4fe7a79dbfc5fa38de9bbd36ca8dd8a3d794ead924e43a0812bbbcaf1f394e4d77e9662238f80ccac0d8e52a@127.0.0.1:0","enr":"0xf88fb84090c476d24643383a66557141b62c940150453a05a838e91c6eaa1441befcedd441f7ac293638f5a01132227c8daf970bb3ec76d938fcd2257ef6282b758c36a30183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102a3a82e04610c3851f4b6b80bdd5666f8c2eb2a5c4fe7a79dbfc5fa38de9bbd36","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"6mDvfLPyFmpcjihsiFmElDoupa/0cwAVvmoVAxBAzs8=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: ea60ef\npopulation: 33 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 9 0ab9 1be4 372d 3e56 | 65 372d (0) 39db (0) 38ab (0) 3cb1 (0)\n001 8 83dc 86ca 89c8 895b | 33 8cf9 (0) 8b76 (0) 8be4 (0) 895b (0)\n002 5 c8e5 ca03 d224 dfae | 15 d224 (0) d0f3 (0) d6ff (0) dc97 (0)\n003 4 f410 f74e f360 f361 | 5 f5c4 (0) f410 (0) f74e (0) f361 (0)\n004 3 e0b1 e0ea e77f | 5 e16b (0) e0ea (0) e0b1 (0) e55d (0)\n005 2 ed32 edc8 | 2 ed32 (0) edc8 (0)\n============ DEPTH: 6 ==========================================\n006 0 | 0\n007 1 ebca | 1 ebca (0)\n008 0 | 0\n009 1 ea0e | 1 ea0e (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"ea60ef7cb3f2166a5c8e286c885984943a2ea5aff4730015be6a15031040cecf","private_key":"34572c71c9f4767ddfaee3aa21c52f966a73447695fe12dee7eb9ff693417140","name":"node_ea60ef7cb3f2166a5c8e286c885984943a2ea5aff4730015be6a15031040cecf","services":["bzz","pss"],"enable_msg_events":true,"port":43863},"up":true}},{"node":{"info":{"id":"57764522162620c1ad0b166a9c43772255d0cc01e49f2122ef09db046804a570","name":"node_57764522162620c1ad0b166a9c43772255d0cc01e49f2122ef09db046804a570","enode":"enode://802bb2984957e4187577dba69e5a73714c65bc176e785c46c52c725e8cb118d05f0b0840a373188d1ccd56465c20ba7aedf21b7e5411c1c96ac32e6adad2e184@127.0.0.1:0","enr":"0xf88fb8401f7f3cc91efaede856461ce79b9ff9df6ced9d7358d2004d24fd403a006dd7604de40bc6b4f4e14b0292d0f15079e6c6aa69988b38698efb340481039bef5c300183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102802bb2984957e4187577dba69e5a73714c65bc176e785c46c52c725e8cb118d0","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"V3ZFIhYmIMGtCxZqnEN3IlXQzAHknyEi7wnbBGgEpXA=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 577645\npopulation: 35 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 c8e5 dc97 e77f ea60 | 63 8cf9 (0) 895b (0) 89c8 (0) 8b76 (0)\n001 12 3ee4 286a 213b 2434 | 27 372d (0) 38ab (0) 39db (0) 3cb1 (0)\n002 8 645b 6ecb 6c82 772e | 23 734e (0) 7355 (0) 73b8 (0) 757a (0)\n003 5 4a18 4b24 47c3 4167 | 8 4cd0 (0) 48b6 (0) 4b24 (0) 4a18 (0)\n004 3 5d60 5abc 5a01 | 3 5abc (0) 5a01 (0) 5d60 (0)\n============ DEPTH: 5 ==========================================\n005 2 539d 517a | 2 539d (0) 517a (0)\n006 1 558e | 1 558e (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"57764522162620c1ad0b166a9c43772255d0cc01e49f2122ef09db046804a570","private_key":"9de036860d3dc63ef40d3981f65da10bae27dd10ce542c76134e247073f512f4","name":"node_57764522162620c1ad0b166a9c43772255d0cc01e49f2122ef09db046804a570","services":["bzz","pss"],"enable_msg_events":true,"port":37591},"up":true}},{"node":{"info":{"id":"e77f6aa9e3dfcce0a2e5db794703224249aba60595075b2df9a5b0b30855cf46","name":"node_e77f6aa9e3dfcce0a2e5db794703224249aba60595075b2df9a5b0b30855cf46","enode":"enode://c80b19cf5a0bbf10af5ae60bf60765387031caab06906033df96362e07dd4e51e043bb824328834e600c0b6affc36df0d06ecd955103721482c11bedfe78e06e@127.0.0.1:0","enr":"0xf88fb84026a761e6c2aae397880443de1d6bb3b7770c8206f473451199148dcb9b74c03849739e4806e81c1ca8482e0712620998d9e4666d25b65e36e773f3c0f543a70f0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102c80b19cf5a0bbf10af5ae60bf60765387031caab06906033df96362e07dd4e51","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"539qqePfzOCi5dt5RwMiQkmrpgWVB1st+aWwswhVz0Y=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: e77f6a\npopulation: 35 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 1be4 5d60 517a 5776 | 65 38ab (0) 39db (0) 3cb1 (0) 3ee4 (0)\n001 13 92a1 957d 9ee7 83dc | 33 8cf9 (0) 89c8 (0) 895b (0) 8b76 (0)\n002 5 db08 dfae c8e5 ca03 | 15 d6ff (0) d224 (0) d0f3 (0) dc97 (0)\n003 4 f74e f410 f361 f360 | 5 f5c4 (0) f410 (0) f74e (0) f361 (0)\n004 5 ed32 edc8 ebca ea0e | 5 ed32 (0) edc8 (0) ebca (0) ea0e (0)\n============ DEPTH: 5 ==========================================\n005 3 e16b e0b1 e0ea | 3 e16b (0) e0b1 (0) e0ea (0)\n006 1 e55d | 1 e55d (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"e77f6aa9e3dfcce0a2e5db794703224249aba60595075b2df9a5b0b30855cf46","private_key":"c230ff1d7220134fe04e59de10522a8e372830d5b3eccbfbccf4b8e57536d4f9","name":"node_e77f6aa9e3dfcce0a2e5db794703224249aba60595075b2df9a5b0b30855cf46","services":["bzz","pss"],"enable_msg_events":true,"port":38009},"up":true}},{"node":{"info":{"id":"cec3c01c147b34f25104ddd0b25076cef63ac224eada9d9f5a00b8513331354f","name":"node_cec3c01c147b34f25104ddd0b25076cef63ac224eada9d9f5a00b8513331354f","enode":"enode://c9307563a6ac3d784c348187f2942d2aa64fb15afdb55d6fdfd6fa0bfc5e4a65281f9b0ef5dc5b155c0c97971411d8decd17c66ad96e3a0bca0f7bbfb6674ce8@127.0.0.1:0","enr":"0xf88fb8409fdaea6e03e3c24cf8967a46c99aaa146e74b7e455c4b7012f9c4b72fe74cbe831d49545d8fd8a8092b357b370922dfafe86853f004fb9f862395a41a00504000183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102c9307563a6ac3d784c348187f2942d2aa64fb15afdb55d6fdfd6fa0bfc5e4a65","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"zsPAHBR7NPJRBN3QslB2zvY6wiTq2p2fWgC4UTMxNU8=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: cec3c0\npopulation: 33 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 12 0506 06b9 018a 0ff6 | 65 372d (0) 3cb1 (0) 3ee4 (0) 3e56 (0)\n001 9 b381 83dc 82f0 86ca | 33 86ca (0) 82f0 (0) 83dc (0) 8cf9 (0)\n002 2 f360 e77f | 15 f74e (0) f5c4 (0) f410 (0) f361 (0)\n003 2 d224 db08 | 6 d0f3 (0) d224 (0) d6ff (0) dc97 (0)\n004 2 c3a1 c181 | 2 c3a1 (0) c181 (0)\n005 3 c8e5 ca03 cbc5 | 3 cbc5 (0) ca03 (0) c8e5 (0)\n006 1 cdcd | 1 cdcd (0)\n============ DEPTH: 7 ==========================================\n007 1 cfbb | 1 cfbb (0)\n008 0 | 0\n009 1 ce99 | 1 ce99 (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"cec3c01c147b34f25104ddd0b25076cef63ac224eada9d9f5a00b8513331354f","private_key":"a43b0e0e48e2e4dbd79184eaade1af54404a0a89d0d250b881a1c131de5b2174","name":"node_cec3c01c147b34f25104ddd0b25076cef63ac224eada9d9f5a00b8513331354f","services":["bzz","pss"],"enable_msg_events":true,"port":44913},"up":true}},{"node":{"info":{"id":"6c82fdabd09e0e9d0fc507613a05951c02b2953d763a062a5f32aaf5cc477c19","name":"node_6c82fdabd09e0e9d0fc507613a05951c02b2953d763a062a5f32aaf5cc477c19","enode":"enode://e94d070b0cd5336bdebbdb63309d23c431e87c6bfa03474b5ffe002182e1fe617f0cb27a3e399ff36cc6eff93a64eae9ce3958400eba3b644a878ec673bc5a6a@127.0.0.1:0","enr":"0xf88fb840ac1282029a97bfacb7298ac94161d57a84cd6347e9fa18bd1e71f37ded792f352b8491cf02668d2daea43f1e02089f892431108a7e4a5708307096b4a57c4cd80183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102e94d070b0cd5336bdebbdb63309d23c431e87c6bfa03474b5ffe002182e1fe61","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"bIL9q9CeDp0PxQdhOgWVHAKylT12OgYqXzKq9cxHfBk=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 6c82fd\npopulation: 32 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 b486 c8e5 cec3 | 63 86ca (0) 82f0 (0) 83dc (0) 8cf9 (0)\n001 9 286a 2459 2434 3e56 | 27 372d (0) 39db (0) 38ab (0) 3cb1 (0)\n002 6 5a01 5776 47c3 41b9 | 15 5d60 (0) 5abc (0) 5a01 (0) 539d (0)\n003 5 78cb 7fbc 7f87 7cf4 | 12 7355 (0) 734e (0) 73b8 (0) 757a (0)\n004 4 6210 645b 667e 6742 | 5 645b (0) 667e (0) 6728 (0) 6742 (0)\n005 1 6982 | 1 6982 (0)\n006 2 6ecb 6e5c | 2 6ecb (0) 6e5c (0)\n============ DEPTH: 7 ==========================================\n007 1 6d60 | 1 6d60 (0)\n008 1 6c02 | 1 6c02 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"6c82fdabd09e0e9d0fc507613a05951c02b2953d763a062a5f32aaf5cc477c19","private_key":"fdb64dd6356458c4ea0b68ad6552a972f6b174e8db0fecb40fb8c03a61e39561","name":"node_6c82fdabd09e0e9d0fc507613a05951c02b2953d763a062a5f32aaf5cc477c19","services":["bzz","pss"],"enable_msg_events":true,"port":36231},"up":true}},{"node":{"info":{"id":"c8e5a1b4533dd0de12acee4d31369f39785178568718b93bbc321ec83e0714f0","name":"node_c8e5a1b4533dd0de12acee4d31369f39785178568718b93bbc321ec83e0714f0","enode":"enode://bb7389fc8693197348309cc5f82cd99b2d73b478cefbdcf901844a69e35ea841449888e8cf056b1a4475970b6815a0a091c37e89df251953b7ba15fecb352b8b@127.0.0.1:0","enr":"0xf88fb840ceee340c58b4bfd938dbe46f60634de3127f2f253a2ba4925a2309b4e89c1c276391c132d230217a48dbfe44934f0a5204f62163714f90b0a7901404b5cc51c90183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103bb7389fc8693197348309cc5f82cd99b2d73b478cefbdcf901844a69e35ea841","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"yOWhtFM90N4SrO5NMTafOXhReFaHGLk7vDIeyD4HFPA=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: c8e5a1\npopulation: 34 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 12 0427 0506 06b9 018a | 65 372d (0) 39db (0) 38ab (0) 3cb1 (0)\n001 6 b16d 8be4 83dc 82f0 | 33 86ca (0) 82f0 (0) 83dc (0) 8cf9 (0)\n002 5 e77f ea60 ebca edc8 | 15 f74e (0) f5c4 (0) f410 (0) f361 (0)\n003 3 d0f3 d224 db08 | 6 d6ff (0) d224 (0) d0f3 (0) dc97 (0)\n004 2 c3a1 c181 | 2 c3a1 (0) c181 (0)\n005 4 cdcd cfbb cec3 ce99 | 4 cdcd (0) cfbb (0) cec3 (0) ce99 (0)\n============ DEPTH: 6 ==========================================\n006 2 ca03 cbc5 | 2 cbc5 (0) ca03 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"c8e5a1b4533dd0de12acee4d31369f39785178568718b93bbc321ec83e0714f0","private_key":"71b41bd09467c47283a158151bded935639f103d9452befe2459162ec74df521","name":"node_c8e5a1b4533dd0de12acee4d31369f39785178568718b93bbc321ec83e0714f0","services":["bzz","pss"],"enable_msg_events":true,"port":46751},"up":true}},{"node":{"info":{"id":"ce99e9d37111c52e929b187fe201790b1a555dfb8b6b6de54e94df7cc2d43fd4","name":"node_ce99e9d37111c52e929b187fe201790b1a555dfb8b6b6de54e94df7cc2d43fd4","enode":"enode://18280baf1cb264a91130e6abae9d7e90b21447733bc8929577cb926538b2b17dc0add3d3467b320fae85519f6415afb36e9e18ba27105b5d0d33b8636fb5a711@127.0.0.1:0","enr":"0xf88fb840de9d966e41db3e276b1d1d67ae48e915d7689ef8081e41029aea9165c3ac62ff7805be7f8862a63d07c38f176d370349ab59f6917ada9b5ae644e87897df08600183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10318280baf1cb264a91130e6abae9d7e90b21447733bc8929577cb926538b2b17d","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"zpnp03ERxS6Smxh/4gF5CxpVXfuLa23lTpTffMLUP9Q=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: ce99e9\npopulation: 23 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 7fbc 286a 0427 | 65 6982 (0) 6ecb (0) 6e5c (0) 6d60 (0)\n001 6 b381 b16d a7a6 86ca | 33 8cf9 (0) 895b (0) 89c8 (0) 8b76 (0)\n002 4 edc8 ebca f361 f360 | 15 f74e (0) f410 (0) f5c4 (0) f361 (0)\n003 2 db08 d224 | 6 d6ff (0) d0f3 (0) d224 (0) dc97 (0)\n004 2 c3a1 c181 | 2 c3a1 (0) c181 (0)\n005 3 cbc5 ca03 c8e5 | 3 cbc5 (0) ca03 (0) c8e5 (0)\n006 1 cdcd | 1 cdcd (0)\n============ DEPTH: 7 ==========================================\n007 1 cfbb | 1 cfbb (0)\n008 0 | 0\n009 1 cec3 | 1 cec3 (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"ce99e9d37111c52e929b187fe201790b1a555dfb8b6b6de54e94df7cc2d43fd4","private_key":"f6a40f6cecf0cb1296f7e100e8ee72b402405531fc277f70a99355650e3d7248","name":"node_ce99e9d37111c52e929b187fe201790b1a555dfb8b6b6de54e94df7cc2d43fd4","services":["bzz","pss"],"enable_msg_events":true,"port":43447},"up":true}},{"node":{"info":{"id":"042788d5b72cb84a375565d120d239a2b14fdf38b3f5f992284d78535077148a","name":"node_042788d5b72cb84a375565d120d239a2b14fdf38b3f5f992284d78535077148a","enode":"enode://0220d1612c3a461835407833a67a205cdc87d1df9aabc985243ad449332e2d38b80f52f8973a28babecac8fc22daf2862497c79efdbeaf82cce5ffe402efde4a@127.0.0.1:0","enr":"0xf88fb84007dcb9c1db66f2f7829bea3542a0b3053a1cae6b9452c7619ecc9080f00be44a7842d6a03474709be30cb31e8a773adaafd033c60d684af4d63ae57f729b446d0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1020220d1612c3a461835407833a67a205cdc87d1df9aabc985243ad449332e2d38","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"BCeI1bcsuEo3VWXRINI5orFP3ziz9fmSKE14U1B3FIo=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 042788\npopulation: 34 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 9 aebd a7a6 b16d f410 | 63 8cf9 (0) 895b (0) 89c8 (0) 8b76 (0)\n001 4 7639 5776 4cd0 41b9 | 38 6ecb (0) 6e5c (0) 6d60 (0) 6c02 (0)\n002 8 3ee4 3e56 3cb1 2459 | 12 372d (0) 38ab (0) 39db (0) 3cb1 (0)\n003 4 13bc 109e 1929 1be4 | 4 13bc (0) 109e (0) 1929 (0) 1be4 (0)\n004 2 0ab9 0ff6 | 3 0bcf (0) 0ab9 (0) 0ff6 (0)\n005 5 0390 0218 027f 026d | 5 0390 (0) 0218 (0) 027f (0) 026d (0)\n============ DEPTH: 6 ==========================================\n006 1 06b9 | 1 06b9 (0)\n007 1 0506 | 1 0506 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"042788d5b72cb84a375565d120d239a2b14fdf38b3f5f992284d78535077148a","private_key":"ef2c90067d97cab14a4cf2eff2fa9332bc6149d7c6ddc78f3dfddf9fa938b9ba","name":"node_042788d5b72cb84a375565d120d239a2b14fdf38b3f5f992284d78535077148a","services":["bzz","pss"],"enable_msg_events":true,"port":46141},"up":true}},{"node":{"info":{"id":"41b9ee7ad19698e97589b059ad3333cb64f02c16006d94fb3d0bad7ced8ff238","name":"node_41b9ee7ad19698e97589b059ad3333cb64f02c16006d94fb3d0bad7ced8ff238","enode":"enode://2a29ba5bbf7e82989e16f954d13795448cfffbc9f0d87a5e01c809de44cee798cba2568c3318ad4e7ac48915e5e99c46b3973d7ca9da44d169ced570e274088c@127.0.0.1:0","enr":"0xf88fb8407a50ecfb4ac26fa2aa0595d78a631d0be7ee8d3588ddd05dda07c3dedcfe07d83f0e6e095a3fe0d3382f43949ae3f633f5a780c1ee3921341dbe3c17cf9eec0a0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1022a29ba5bbf7e82989e16f954d13795448cfffbc9f0d87a5e01c809de44cee798","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"QbnuetGWmOl1ibBZrTMzy2TwLBYAbZT7PQutfO2P8jg=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 41b9ee\npopulation: 35 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 b16d a7a6 | 63 ad0d (0) afa3 (0) ae67 (0) aebd (0)\n001 11 39db 286a 2434 2459 | 27 372d (0) 38ab (0) 39db (0) 3cb1 (0)\n002 9 645b 6c02 6c82 6ecb | 23 6982 (0) 6ecb (0) 6e5c (0) 6d60 (0)\n003 7 5a01 5abc 5d60 539d | 7 5a01 (0) 5abc (0) 5d60 (0) 539d (0)\n004 3 4cd0 4b24 4a18 | 4 4cd0 (0) 48b6 (0) 4b24 (0) 4a18 (0)\n005 1 47c3 | 1 47c3 (0)\n============ DEPTH: 6 ==========================================\n006 0 | 0\n007 0 | 0\n008 1 4167 | 1 4167 (0)\n009 0 | 0\n010 1 419a | 1 419a (0)\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"41b9ee7ad19698e97589b059ad3333cb64f02c16006d94fb3d0bad7ced8ff238","private_key":"beb43b0ce6c2e3a4e7f2ec5be3324f334a3bed25b9becf17d1738a61f2613c93","name":"node_41b9ee7ad19698e97589b059ad3333cb64f02c16006d94fb3d0bad7ced8ff238","services":["bzz","pss"],"enable_msg_events":true,"port":40537},"up":true}},{"node":{"info":{"id":"78cbc19a24d095ab7858849058c65c061c52289b91ddd92cee34bed98aee4a59","name":"node_78cbc19a24d095ab7858849058c65c061c52289b91ddd92cee34bed98aee4a59","enode":"enode://8fe37769462119a45a588a0a6abcb43165093a0ad74a8e18016277a214169950e9f5c7d10bc217d0b80998c4cee74c344027362a9b3ca485d8c98f12dc287640@127.0.0.1:0","enr":"0xf88fb840a0f01bac92cac5d6526e266529aebd70a42a5e443d9e68bb1da73f022bb2fe79551dbcdcaa994812c375e725c8126e32ef46d373f744fcecd8f7bc0ef3f26d1b0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1028fe37769462119a45a588a0a6abcb43165093a0ad74a8e18016277a214169950","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"eMvBmiTQlat4WISQWMZcBhxSKJuR3dks7jS+2YruSlk=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 78cbc1\npopulation: 34 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 ea0e b486 b16d a7a6 | 63 ad0d (0) afa3 (0) ae67 (0) aebd (0)\n001 6 026d 0ff6 1be4 286a | 27 372d (0) 38ab (0) 39db (0) 3e56 (0)\n002 9 5abc 5d60 558e 5776 | 15 5a01 (0) 5abc (0) 5d60 (0) 539d (0)\n003 6 6982 6e5c 6d60 6c82 | 11 6982 (0) 6ecb (0) 6e5c (0) 6d60 (0)\n004 4 73b8 757a 772e 7639 | 6 734e (0) 7355 (0) 73b8 (0) 757a (0)\n============ DEPTH: 5 ==========================================\n005 4 7dc5 7cf4 7fbc 7f87 | 4 7dc5 (0) 7cf4 (0) 7fbc (0) 7f87 (0)\n006 1 7b92 | 1 7b92 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"78cbc19a24d095ab7858849058c65c061c52289b91ddd92cee34bed98aee4a59","private_key":"7de1fbbba1cd14694bd6b63bb00d807182ac42a8ffabee58c1eb352d696871cc","name":"node_78cbc19a24d095ab7858849058c65c061c52289b91ddd92cee34bed98aee4a59","services":["bzz","pss"],"enable_msg_events":true,"port":45671},"up":true}},{"node":{"info":{"id":"7f87da7ee55b4c8c8f9d55411ff88d3a0b63bfee6a516917d49fa6273fb5b86a","name":"node_7f87da7ee55b4c8c8f9d55411ff88d3a0b63bfee6a516917d49fa6273fb5b86a","enode":"enode://a63ffc43cec6078c4261ca9a8bc556c4694f55f153d5ec2065743f7151a3b8e16a1f329f2db489e9646c33005a30ccd6947c2be1189038b9497b1634608cf116@127.0.0.1:0","enr":"0xf88fb84074c9fcda11cf86d8033a7ec003b37f4192bc99d18862396df30d040e21b6ed611ad763446b7690ea37ef1d4237ca2dcec449f1cb3a2df4176f2099ce8b39a9960183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102a63ffc43cec6078c4261ca9a8bc556c4694f55f153d5ec2065743f7151a3b8e1","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"f4fafuVbTIyPnVVBH/iNOgtjv+5qUWkX1J+mJz+1uGo=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 7f87da\npopulation: 33 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 ea0e b486 b16d a7a6 | 63 ad0d (0) afa3 (0) ae67 (0) aebd (0)\n001 6 026d 018a 0ff6 1be4 | 27 372d (0) 3cb1 (0) 3e56 (0) 3ee4 (0)\n002 6 5d60 5776 4a18 419a | 15 5abc (0) 5a01 (0) 5d60 (0) 539d (0)\n003 7 6e5c 6d60 6c82 6982 | 11 6982 (0) 6ecb (0) 6e5c (0) 6d60 (0)\n004 5 734e 73b8 757a 772e | 6 7355 (0) 734e (0) 73b8 (0) 757a (0)\n005 2 7b92 78cb | 2 7b92 (0) 78cb (0)\n============ DEPTH: 6 ==========================================\n006 2 7dc5 7cf4 | 2 7dc5 (0) 7cf4 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 1 7fbc | 1 7fbc (0)\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"7f87da7ee55b4c8c8f9d55411ff88d3a0b63bfee6a516917d49fa6273fb5b86a","private_key":"a7e3fdde74aed0e2ae459190f839adf63156aa7982bde3d6ab0f33a8e8526b9d","name":"node_7f87da7ee55b4c8c8f9d55411ff88d3a0b63bfee6a516917d49fa6273fb5b86a","services":["bzz","pss"],"enable_msg_events":true,"port":39359},"up":true}},{"node":{"info":{"id":"47c3e0dfbbfcebeece78865c8c989577360cd9cc46a3b43f4b7b01ed14dc30e6","name":"node_47c3e0dfbbfcebeece78865c8c989577360cd9cc46a3b43f4b7b01ed14dc30e6","enode":"enode://9b43113635c9212f3a25073df459dd4340386c80a79823d1931a15f6efe8cfa8bc4887bfa1237da6956b72e5c06e1c9a79a8daad206a3e91916b29e0a2027bc5@127.0.0.1:0","enr":"0xf88fb840a37ee48405baa3c5ff376e49a1443eb509afff243b04f89c05b8f4e6eb8c9c7a5756c4c8a97256b7c92d95133662d4d5fb77bc09cf085f06283d82d85c5a62630183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1039b43113635c9212f3a25073df459dd4340386c80a79823d1931a15f6efe8cfa8","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"R8Pg37v86+7OeIZcjJiVdzYM2cxGo7Q/S3sB7RTcMOY=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 47c3e0\npopulation: 31 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 dc97 b16d aebd a7a6 | 63 ad0d (0) afa3 (0) ae67 (0) aebd (0)\n001 9 3ee4 286a 2434 2459 | 27 372d (0) 38ab (0) 39db (0) 3cb1 (0)\n002 5 645b 6c82 7639 78cb | 23 6982 (0) 6ecb (0) 6e5c (0) 6d60 (0)\n003 6 5a01 5d60 539d 517a | 7 5abc (0) 5a01 (0) 5d60 (0) 539d (0)\n004 4 4cd0 48b6 4b24 4a18 | 4 4cd0 (0) 48b6 (0) 4b24 (0) 4a18 (0)\n============ DEPTH: 5 ==========================================\n005 3 4167 419a 41b9 | 3 4167 (0) 41b9 (0) 419a (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"47c3e0dfbbfcebeece78865c8c989577360cd9cc46a3b43f4b7b01ed14dc30e6","private_key":"760e9a634e4459a6137e0a4164c2ff06b954c6bb74a19084566e563f864b8de4","name":"node_47c3e0dfbbfcebeece78865c8c989577360cd9cc46a3b43f4b7b01ed14dc30e6","services":["bzz","pss"],"enable_msg_events":true,"port":34401},"up":true}},{"node":{"info":{"id":"06b95f1bac76ca4925d509b06216f2113ac5dcf051ef5aa0a320ae64069e0b6d","name":"node_06b95f1bac76ca4925d509b06216f2113ac5dcf051ef5aa0a320ae64069e0b6d","enode":"enode://5e63692a1ce43cab6bc865e299006fcb429319aa159f11fa0e2d5cde573fce9a20be804b3baa55b8f64ceec46e9e671021661f6724946f19d2ab392d2f6772c7@127.0.0.1:0","enr":"0xf88fb8405aa541c395a887f464be5f1f9cf2706523e11b6aed11376895a795f591303d765ad2220baf9fc3dd3ccf472503e282fb7698969f2cc2a6d9df6ad10f2c7dd32a0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1035e63692a1ce43cab6bc865e299006fcb429319aa159f11fa0e2d5cde573fce9a","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"BrlfG6x2ykkl1QmwYhbyETrF3PBR71qgoyCuZAaeC20=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 06b95f\npopulation: 36 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 9 cec3 c8e5 cbc5 f410 | 63 ad0d (0) afa3 (0) ae67 (0) aebd (0)\n001 11 6c82 7639 7b92 7cf4 | 38 6982 (0) 6e5c (0) 6ecb (0) 6d60 (0)\n002 5 3ee4 26d1 2434 2459 | 12 372d (0) 38ab (0) 39db (0) 3cb1 (0)\n003 2 13bc 1be4 | 4 109e (0) 13bc (0) 1929 (0) 1be4 (0)\n004 2 0ab9 0ff6 | 3 0bcf (0) 0ab9 (0) 0ff6 (0)\n005 5 0390 026d 027f 0218 | 5 0390 (0) 0218 (0) 026d (0) 027f (0)\n============ DEPTH: 6 ==========================================\n006 2 0427 0506 | 2 0506 (0) 0427 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"06b95f1bac76ca4925d509b06216f2113ac5dcf051ef5aa0a320ae64069e0b6d","private_key":"f46e1e932cac23f40da5e48808b19557c22164c16823eea2720fa52ea9286449","name":"node_06b95f1bac76ca4925d509b06216f2113ac5dcf051ef5aa0a320ae64069e0b6d","services":["bzz","pss"],"enable_msg_events":true,"port":35629},"up":true}},{"node":{"info":{"id":"0ff67b0e9ec6509c7786495b7b3ddb176b4f8221ff300f409f00a3d389e8874c","name":"node_0ff67b0e9ec6509c7786495b7b3ddb176b4f8221ff300f409f00a3d389e8874c","enode":"enode://f907d19b4970dee3081d1119e31908cb0ebcc915b2aa05c1dde8014b35d9aa0d3d2786013bad40ee4a9b54b615ed3a7236e9f526787cd201f18ab4a210e87ed2@127.0.0.1:0","enr":"0xf88fb840c0b7ab20a60ff949e9036939be157446dee043fa8688afcf67585ec1ce0377cd5af23af126525f9bd3f6170033dc2bd748394bc9398c95fa363d5c317c84bc480183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102f907d19b4970dee3081d1119e31908cb0ebcc915b2aa05c1dde8014b35d9aa0d","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"D/Z7Dp7GUJx3hklbez3bF2tPgiH/MA9AnwCj04noh0w=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 0ff67b\npopulation: 40 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 10 b381 b2b9 b486 aebd | 63 ad0d (0) afa3 (0) ae67 (0) aebd (0)\n001 13 5776 4cd0 47c3 4167 | 38 6982 (0) 6ecb (0) 6e5c (0) 6d60 (0)\n002 4 3e56 2434 2459 286a | 12 372d (0) 39db (0) 38ab (0) 3cb1 (0)\n003 3 13bc 1929 1be4 | 4 1929 (0) 1be4 (0) 109e (0) 13bc (0)\n004 8 0390 026d 027f 0218 | 8 0390 (0) 0218 (0) 026d (0) 027f (0)\n============ DEPTH: 5 ==========================================\n005 2 0ab9 0bcf | 2 0ab9 (0) 0bcf (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"0ff67b0e9ec6509c7786495b7b3ddb176b4f8221ff300f409f00a3d389e8874c","private_key":"b19b4a43edf29d1bbb5774dd2c0f184ba873cf22764297c41af632f4d4521b57","name":"node_0ff67b0e9ec6509c7786495b7b3ddb176b4f8221ff300f409f00a3d389e8874c","services":["bzz","pss"],"enable_msg_events":true,"port":41299},"up":true}},{"node":{"info":{"id":"ca036d1ef9e6ce3654f2d769f16926aa14957193586426489e15539dfa8f7763","name":"node_ca036d1ef9e6ce3654f2d769f16926aa14957193586426489e15539dfa8f7763","enode":"enode://f32d87347fa320045d0437419b4f64bc07721d44cdc75a314bce969b021b92855772ec300a5cffcbd948b59461a4880ae1a8c59dc3e802876989a9edfc7c1efd@127.0.0.1:0","enr":"0xf88fb84014d558cfdcb467455447b89e2c52d929511fbde130fe2234fc3b57ca137a2f4a479c493406c6012eab1fd459e6315d30b354b20cfaca4f8bdbdecd4949c911af0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103f32d87347fa320045d0437419b4f64bc07721d44cdc75a314bce969b021b9285","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"ygNtHvnmzjZU8tdp8WkmqhSVcZNYZCZInhVTnfqPd2M=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: ca036d\npopulation: 30 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 6982 7fbc 7639 0ff6 | 65 5a01 (0) 5abc (0) 5d60 (0) 517a (0)\n001 5 b381 b16d 86ca 92a1 | 33 ad0d (0) afa3 (0) ae67 (0) aebd (0)\n002 8 edc8 ebca ea60 e77f | 15 e16b (0) e0ea (0) e0b1 (0) e55d (0)\n003 5 dfae db08 d6ff d224 | 6 dc97 (0) dfae (0) db08 (0) d6ff (0)\n004 2 c3a1 c181 | 2 c3a1 (0) c181 (0)\n005 4 cdcd cfbb ce99 cec3 | 4 cdcd (0) cfbb (0) ce99 (0) cec3 (0)\n============ DEPTH: 6 ==========================================\n006 1 c8e5 | 1 c8e5 (0)\n007 1 cbc5 | 1 cbc5 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"ca036d1ef9e6ce3654f2d769f16926aa14957193586426489e15539dfa8f7763","private_key":"b23dda65c58838a9d2ba74acdddbfc1935094baca5b3b23176f48999f0ebc423","name":"node_ca036d1ef9e6ce3654f2d769f16926aa14957193586426489e15539dfa8f7763","services":["bzz","pss"],"enable_msg_events":true,"port":41163},"up":true}},{"node":{"info":{"id":"7639f9a66e8ff70f554c346faa25f78140957c295b748fc42a12df7972f4fcc6","name":"node_7639f9a66e8ff70f554c346faa25f78140957c295b748fc42a12df7972f4fcc6","enode":"enode://c7b74655869120b2c4706d8c143ddf837a6d4ff7ba2cb1a30bdd8096b461cbd9af42aa144a134bdf16b6ad9b6b03829d1987131098736c2fe041122be46acd7d@127.0.0.1:0","enr":"0xf88fb840ac1c45c3987cfa0bec095840df22a0a404d1b8972dbd3231eb99168cfdad644a4c5f06f117723a23bc327ac428b9d187a2a9f1e96f0f9924e76b7e7b5415ef250183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103c7b74655869120b2c4706d8c143ddf837a6d4ff7ba2cb1a30bdd8096b461cbd9","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"djn5pm6P9w9VTDRvqiX3gUCVfClbdI/EKhLfeXL0/MY=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 7639f9\npopulation: 35 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 b486 92a1 f360 ca03 | 63 a320 (0) a2ba (0) a085 (0) a75a (0)\n001 12 018a 027f 06b9 0427 | 27 372d (0) 39db (0) 38ab (0) 3cb1 (0)\n002 5 5776 4cd0 47c3 419a | 15 5d60 (0) 5abc (0) 5a01 (0) 539d (0)\n003 4 6742 6210 6982 6c82 | 11 6ecb (0) 6e5c (0) 6d60 (0) 6c02 (0)\n004 5 7f87 7fbc 7cf4 78cb | 6 7b92 (0) 78cb (0) 7dc5 (0) 7cf4 (0)\n005 3 734e 7355 73b8 | 3 734e (0) 7355 (0) 73b8 (0)\n============ DEPTH: 6 ==========================================\n006 1 757a | 1 757a (0)\n007 1 772e | 1 772e (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"7639f9a66e8ff70f554c346faa25f78140957c295b748fc42a12df7972f4fcc6","private_key":"1f28b72e347e6a5c993f2226d06196d963341d6dffe3204efca5eb82a9707088","name":"node_7639f9a66e8ff70f554c346faa25f78140957c295b748fc42a12df7972f4fcc6","services":["bzz","pss"],"enable_msg_events":true,"port":34577},"up":true}},{"node":{"info":{"id":"f36084048bf0ff985a77f5183796f7b37b7085ee6eea8bbc5fc62558854cce67","name":"node_f36084048bf0ff985a77f5183796f7b37b7085ee6eea8bbc5fc62558854cce67","enode":"enode://a3b1ef5f74c19769b24261107a80bcb5c7314e85dadcf17d941563517510613feeba9bc1b3b3f57abccfc02fb83d4cb78cd9c7da05a955ce6fe67f03479ad64a@127.0.0.1:0","enr":"0xf88fb840fce892c7ce07a80ebaf87930e850fbe62526831641a569b7c882e674fe6429995831d7b67c7a099dfc693d60591b92835664b864ff2db071138b0c37efa03dc70183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102a3b1ef5f74c19769b24261107a80bcb5c7314e85dadcf17d941563517510613f","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"82CEBIvw/5had/UYN5b3s3twhe5u6ou8X8YlWIVMzmc=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: f36084\npopulation: 28 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 1be4 419a 6982 7639 | 65 1929 (0) 1be4 (0) 109e (0) 13bc (0)\n001 7 957d 82f0 8be4 a7a6 | 33 a320 (0) a2ba (0) a085 (0) a75a (0)\n002 8 db08 d0f3 c181 cec3 | 15 dfae (0) dc97 (0) db08 (0) d6ff (0)\n003 5 edc8 ea60 ebca e16b | 10 e16b (0) e0ea (0) e0b1 (0) e55d (0)\n============ DEPTH: 4 ==========================================\n004 0 | 0\n005 3 f74e f410 f5c4 | 3 f74e (0) f5c4 (0) f410 (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 1 f361 | 1 f361 (0)\n========================================================================="}},"config":{"id":"f36084048bf0ff985a77f5183796f7b37b7085ee6eea8bbc5fc62558854cce67","private_key":"5b7394337e91a274738c8e16b112b9c1d7682e033938b183e88d96322c81f6ee","name":"node_f36084048bf0ff985a77f5183796f7b37b7085ee6eea8bbc5fc62558854cce67","services":["bzz","pss"],"enable_msg_events":true,"port":43813},"up":true}},{"node":{"info":{"id":"419a6626dd026c0438461592121992c6be1868375011655b6d405166cd8edf7f","name":"node_419a6626dd026c0438461592121992c6be1868375011655b6d405166cd8edf7f","enode":"enode://06f9ae5d93bede98bb8d04bad5677a64f79b8f1c3c17543de53e89dce96c87db7c8015e798b254f5490956cbd58a052bd3309ea1ec4b41cdeb763a59e1df2ea0@127.0.0.1:0","enr":"0xf88fb840f48fdca05279f70013ea36233f54604e2e5652203d6586c7f5ac11e49ab9b1c14d6ee24716fd542ede56f18e8d74f6b13de4985d774042f464d3dde6a87e07dd0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10206f9ae5d93bede98bb8d04bad5677a64f79b8f1c3c17543de53e89dce96c87db","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"QZpmJt0CbAQ4RhWSEhmSxr4YaDdQEWVbbUBRZs2O338=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 419a66\npopulation: 26 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 b841 8be4 92a1 9ee7 | 63 a2ba (0) a320 (0) a085 (0) a75a (0)\n001 2 0ff6 06b9 | 27 1929 (0) 1be4 (0) 109e (0) 13bc (0)\n002 10 78cb 7cf4 7f87 7fbc | 23 6ecb (0) 6e5c (0) 6d60 (0) 6c02 (0)\n003 3 539d 517a 5a01 | 7 5d60 (0) 5abc (0) 5a01 (0) 558e (0)\n004 3 4a18 48b6 4cd0 | 4 4cd0 (0) 4b24 (0) 4a18 (0) 48b6 (0)\n005 1 47c3 | 1 47c3 (0)\n============ DEPTH: 6 ==========================================\n006 0 | 0\n007 0 | 0\n008 1 4167 | 1 4167 (0)\n009 0 | 0\n010 1 41b9 | 1 41b9 (0)\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"419a6626dd026c0438461592121992c6be1868375011655b6d405166cd8edf7f","private_key":"1784affdde58532fc95837b5bd7b50ad427deccd1487d4abe583699bf0056194","name":"node_419a6626dd026c0438461592121992c6be1868375011655b6d405166cd8edf7f","services":["bzz","pss"],"enable_msg_events":true,"port":45225},"up":true}},{"node":{"info":{"id":"9ee7b3e06b453615cbd8737cb74515b150f518f1a2eaa2db90e54708dd161b7d","name":"node_9ee7b3e06b453615cbd8737cb74515b150f518f1a2eaa2db90e54708dd161b7d","enode":"enode://4fb204c7f877f39de63aaf107893f86e4a577583c7b352b55b873761870d61feeef14c9ae88c1ccf3f5901056645987349fbae583c5290bfaa425cedff42bbae@127.0.0.1:0","enr":"0xf88fb840db1e4e5331aa8fa6e8b15b7dddbce0bf805b41932f86eeb643714780ae1df8f27e4cc31ec2f7a6a984c1c623dfeb0ab29c35155b5294e015213643b1ad9986d40183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1024fb204c7f877f39de63aaf107893f86e4a577583c7b352b55b873761870d61fe","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"nuez4GtFNhXL2HN8t0UVsVD1GPGi6qLbkOVHCN0WG30=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 9ee7b3\npopulation: 28 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 06b9 286a 7b92 419a | 65 1929 (0) 1be4 (0) 109e (0) 13bc (0)\n001 6 e77f d224 ca03 c8e5 | 30 dc97 (0) dfae (0) db08 (0) d6ff (0)\n002 8 b841 b8e1 b486 b2b9 | 17 a320 (0) a2ba (0) a085 (0) a75a (0)\n003 4 86ca 82f0 83dc 8be4 | 8 8cf9 (0) 895b (0) 89c8 (0) 8b76 (0)\n004 3 91eb 92a1 957d | 4 9626 (0) 957d (0) 91eb (0) 92a1 (0)\n005 1 9a92 | 1 9a92 (0)\n============ DEPTH: 6 ==========================================\n006 1 9d3c | 1 9d3c (0)\n007 0 | 0\n008 1 9e02 | 1 9e02 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"9ee7b3e06b453615cbd8737cb74515b150f518f1a2eaa2db90e54708dd161b7d","private_key":"14f6f6dc12c8535f9c0ecd71836c9bf9f02b9aad5a2e86ed0c61e30246f7451a","name":"node_9ee7b3e06b453615cbd8737cb74515b150f518f1a2eaa2db90e54708dd161b7d","services":["bzz","pss"],"enable_msg_events":true,"port":43061},"up":true}},{"node":{"info":{"id":"286aeba646bba4a8aa1c372bee9f2c9ff0a2b3abb4f18be321225555c6dce4e5","name":"node_286aeba646bba4a8aa1c372bee9f2c9ff0a2b3abb4f18be321225555c6dce4e5","enode":"enode://68d1075d86a39ad083dd215a50f24b3428c9189dadaa43b155a9130844d25cd85ea26a1760fefd9019e5a59c2d57b2d76fc6f2f5484471c72f53ebfdd52fdb75@127.0.0.1:0","enr":"0xf88fb84027739fe9f8470c3be7639f03c5d1339a233678f728db90a68fcee15810f3b0d22702adf6eae7e82f5738fa558e2caa4f523ddc3607fff8bf0f865a8183e225870183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10368d1075d86a39ad083dd215a50f24b3428c9189dadaa43b155a9130844d25cd8","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"KGrrpka7pKiqHDcr7p8sn/Cis6u08YvjISJVVcbc5OU=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 286aeb\npopulation: 29 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 7 ea60 d224 c181 c8e5 | 63 dfae (0) dc97 (0) db08 (0) d6ff (0)\n001 9 5776 47c3 41b9 7f87 | 38 5abc (0) 5a01 (0) 5d60 (0) 539d (0)\n002 5 1be4 0ff6 06b9 0506 | 15 109e (0) 13bc (0) 1929 (0) 1be4 (0)\n003 3 3cb1 3ee4 3e56 | 6 372d (0) 39db (0) 38ab (0) 3cb1 (0)\n============ DEPTH: 4 ==========================================\n004 4 213b 26d1 2434 2459 | 4 213b (0) 26d1 (0) 2434 (0) 2459 (0)\n005 0 | 0\n006 1 2a22 | 1 2a22 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"286aeba646bba4a8aa1c372bee9f2c9ff0a2b3abb4f18be321225555c6dce4e5","private_key":"976efa040e6f45cc8e22838f1bbfc9b811fa7841ca2c8092a7cc8e335815e92a","name":"node_286aeba646bba4a8aa1c372bee9f2c9ff0a2b3abb4f18be321225555c6dce4e5","services":["bzz","pss"],"enable_msg_events":true,"port":33919},"up":true}},{"node":{"info":{"id":"621076ce6b82e70c90a4adf235aa6f71b116e302dd6b15dcae07f4a816012455","name":"node_621076ce6b82e70c90a4adf235aa6f71b116e302dd6b15dcae07f4a816012455","enode":"enode://dc01b24ab4982764516ace14b88809eb185560373dfbf6fcded5a81bd3fada53e0be683e0c468b1e836de13076e0ccac4e368e8c0946bf24d4390af626af29f1@127.0.0.1:0","enr":"0xf88fb84098e9b3ff2b11a0cacb15bf38a25b7cfe5b534459b7abf909c02314e31e17fd35658770c3cbabde925fb6d0d702842012518483cf082bfa9acb5cd08308a88da60183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103dc01b24ab4982764516ace14b88809eb185560373dfbf6fcded5a81bd3fada53","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"YhB2zmuC5wyQpK3yNapvcbEW4wLdaxXcrgf0qBYBJFU=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 621076\npopulation: 23 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 ad0d a7a6 a085 957d | 63 a75a (0) a7a6 (0) a320 (0) a2ba (0)\n001 2 0ff6 286a | 27 1929 (0) 1be4 (0) 109e (0) 13bc (0)\n002 2 419a 4167 | 15 5abc (0) 5a01 (0) 5d60 (0) 517a (0)\n003 8 7cf4 7fbc 7f87 7b92 | 12 7355 (0) 734e (0) 73b8 (0) 757a (0)\n004 2 6982 6c82 | 6 6e5c (0) 6ecb (0) 6d60 (0) 6c02 (0)\n============ DEPTH: 5 ==========================================\n005 4 645b 667e 6728 6742 | 4 645b (0) 667e (0) 6728 (0) 6742 (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"621076ce6b82e70c90a4adf235aa6f71b116e302dd6b15dcae07f4a816012455","private_key":"7c196a80ce1002ecd7f34c4db3cc6862875ca81e18dff1b002bc566b0275f318","name":"node_621076ce6b82e70c90a4adf235aa6f71b116e302dd6b15dcae07f4a816012455","services":["bzz","pss"],"enable_msg_events":true,"port":45645},"up":true}},{"node":{"info":{"id":"ebca518e5146f49ac75bcaa8add2ef4d1d22c5cfd2e2326c6b41826d45ce55ae","name":"node_ebca518e5146f49ac75bcaa8add2ef4d1d22c5cfd2e2326c6b41826d45ce55ae","enode":"enode://d5dfcc59c4faaf151e2776e409ecb40fa62ba49cf62037b1857207692f6458d99e28f78a29bb3453d075d55c0a7b1574c3bae19e941395eabbb9934073eef2de@127.0.0.1:0","enr":"0xf88fb840314fdfeda295b7bdfcfa72520885849888dae3f5054cf13b02569d9d15272ec149953ca0fdab37be304e3c314f453a3aff78855724625541e7dbae0ac5a5aea10183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102d5dfcc59c4faaf151e2776e409ecb40fa62ba49cf62037b1857207692f6458d9","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"68pRjlFG9JrHW8qordLvTR0ixc/S4jJsa0GCbUXOVa4=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: ebca51\npopulation: 29 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 13bc 7cf4 6982 6210 | 65 1be4 (0) 1929 (0) 109e (0) 13bc (0)\n001 6 957d 82f0 b381 b841 | 33 a75a (0) a7a6 (0) a320 (0) a2ba (0)\n002 7 db08 d224 d0f3 ce99 | 15 dc97 (0) dfae (0) db08 (0) d6ff (0)\n003 5 f361 f360 f74e f5c4 | 5 f74e (0) f5c4 (0) f410 (0) f361 (0)\n004 3 e0b1 e55d e77f | 5 e16b (0) e0ea (0) e0b1 (0) e55d (0)\n005 2 ed32 edc8 | 2 ed32 (0) edc8 (0)\n============ DEPTH: 6 ==========================================\n006 0 | 0\n007 2 ea0e ea60 | 2 ea0e (0) ea60 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"ebca518e5146f49ac75bcaa8add2ef4d1d22c5cfd2e2326c6b41826d45ce55ae","private_key":"3d5e22365b5c9d1fdeb13d45cd12ef39ca2553f7d838ed915e74c428827504e0","name":"node_ebca518e5146f49ac75bcaa8add2ef4d1d22c5cfd2e2326c6b41826d45ce55ae","services":["bzz","pss"],"enable_msg_events":true,"port":46379},"up":true}},{"node":{"info":{"id":"cbc5d42951bc6e187296b5f8ce4d04e472e26670a62851f39d65f31c50865f6a","name":"node_cbc5d42951bc6e187296b5f8ce4d04e472e26670a62851f39d65f31c50865f6a","enode":"enode://dc20237eda8fa674c764f707dd28b4c1e19ad46cbb7206be66d38eac7d630e4047f8dde066f6946ccef3c6b197e5b3b3a3dc60e0590ed7af75c63287f70a0a75@127.0.0.1:0","enr":"0xf88fb840af3cea3226ce0700aa6c6adfefb1f86b66df4dcfe207c13f42675d0f2375ea654d37d12e6bdfa169779ee5783787cc49c83bd4b25575dfe986252e7aff23216f0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103dc20237eda8fa674c764f707dd28b4c1e19ad46cbb7206be66d38eac7d630e40","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"y8XUKVG8bhhylrX4zk0E5HLiZnCmKFHznWXzHFCGX2o=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: cbc5d4\npopulation: 29 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 8 0ff6 06b9 0427 027f | 65 109e (0) 13bc (1) 1929 (0) 1be4 (0)\n001 6 92a1 b381 b16d b841 | 33 a75a (0) a7a6 (0) a2ba (0) a320 (0)\n002 3 f360 edc8 ebca | 15 f361 (0) f360 (0) f74e (0) f5c4 (0)\n003 4 dfae db08 d224 d0f3 | 6 dc97 (0) dfae (0) db08 (0) d6ff (0)\n004 2 c3a1 c181 | 2 c3a1 (0) c181 (0)\n005 4 cdcd cfbb ce99 cec3 | 4 cdcd (0) cfbb (0) ce99 (0) cec3 (0)\n============ DEPTH: 6 ==========================================\n006 1 c8e5 | 1 c8e5 (0)\n007 1 ca03 | 1 ca03 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"cbc5d42951bc6e187296b5f8ce4d04e472e26670a62851f39d65f31c50865f6a","private_key":"b4f4e78aa0688362953df7a69f8c6cdf22151679efa7d71ae0d29d64348105e8","name":"node_cbc5d42951bc6e187296b5f8ce4d04e472e26670a62851f39d65f31c50865f6a","services":["bzz","pss"],"enable_msg_events":true,"port":38181},"up":true}},{"node":{"info":{"id":"7cf4838a7c83a736ce59cfa1b974674a0185dbe17a8f3cd29794a3bbe814adee","name":"node_7cf4838a7c83a736ce59cfa1b974674a0185dbe17a8f3cd29794a3bbe814adee","enode":"enode://1f9e2e5916cccc7c7134cfa950fd528992f3fe0cbfa44ca1ea2a878752c3e5841e41803494191b3e9009d2cfa0dc612e127490a75d21164eb4adca2514b011b6@127.0.0.1:0","enr":"0xf88fb84035545a7728c7f874e5cb8ed3369cfdc416e36f6462741040c8c5c6693860e0c6084d4da3f1318070c10b0958611e7fe3f63780cb689743695cbaf7f8bffbc4ae0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1021f9e2e5916cccc7c7134cfa950fd528992f3fe0cbfa44ca1ea2a878752c3e584","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"fPSDinyDpzbOWc+huXRnSgGF2+F6jzzSl5Sju+gUre4=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 7cf483\npopulation: 29 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 b486 ebca cbc5 | 63 a75a (0) a7a6 (0) a320 (0) a2ba (0)\n001 4 3e56 0ff6 026d 06b9 | 27 109e (0) 13bc (0) 1929 (0) 1be4 (0)\n002 7 5d60 5776 4167 419a | 15 5a01 (0) 5abc (0) 5d60 (0) 539d (0)\n003 5 6210 645b 6742 6c82 | 11 6e5c (0) 6ecb (0) 6d60 (0) 6c02 (0)\n004 5 757a 772e 7639 73b8 | 6 7355 (0) 734e (0) 73b8 (0) 757a (0)\n005 2 78cb 7b92 | 2 7b92 (0) 78cb (0)\n============ DEPTH: 6 ==========================================\n006 2 7f87 7fbc | 2 7f87 (0) 7fbc (0)\n007 1 7dc5 | 1 7dc5 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"7cf4838a7c83a736ce59cfa1b974674a0185dbe17a8f3cd29794a3bbe814adee","private_key":"f8097f48d51332321d9d6d051a647bcc23dc5f6d3d90af68302348ec6554eb2c","name":"node_7cf4838a7c83a736ce59cfa1b974674a0185dbe17a8f3cd29794a3bbe814adee","services":["bzz","pss"],"enable_msg_events":true,"port":35111},"up":true}},{"node":{"info":{"id":"7fbc1843e2222e3c8e35a3215d1bbb4d5457d8b9ed33749e07e22f25ba9ee576","name":"node_7fbc1843e2222e3c8e35a3215d1bbb4d5457d8b9ed33749e07e22f25ba9ee576","enode":"enode://e828a02c476bfb4f9e77624db84d48a68fbe905c50586631faff90022af54eadba081aafe50144c86cb2d8c87f5da11a72f2824fd6e5fee8a4788b73232c0b06@127.0.0.1:0","enr":"0xf88fb840d7e722a5a02da1ba8ba198af44bd707ae67cb31ac9ba6bb979e42378114d7c467b0ae58de3699cd853cab121b1714bbeaa20692c31bf959346c9a2558080616a0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102e828a02c476bfb4f9e77624db84d48a68fbe905c50586631faff90022af54ead","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"f7wYQ+IiLjyONaMhXRu7TVRX2LntM3SeB+IvJbqe5XY=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 7fbc18\npopulation: 28 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 9 ca03 c8e5 cfbb ce99 | 63 dc97 (0) dfae (0) db08 (0) d6ff (0)\n001 3 3e56 0ff6 06b9 | 27 1be4 (0) 1929 (0) 109e (0) 13bc (0)\n002 3 4167 419a 41b9 | 15 5d60 (0) 5a01 (0) 5abc (0) 517a (0)\n003 4 6c82 6982 6210 6742 | 11 645b (0) 667e (0) 6728 (0) 6742 (0)\n004 4 772e 7639 7355 73b8 | 6 734e (0) 7355 (0) 73b8 (0) 757a (0)\n005 2 78cb 7b92 | 2 78cb (0) 7b92 (0)\n============ DEPTH: 6 ==========================================\n006 2 7dc5 7cf4 | 2 7dc5 (0) 7cf4 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 1 7f87 | 1 7f87 (0)\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"7fbc1843e2222e3c8e35a3215d1bbb4d5457d8b9ed33749e07e22f25ba9ee576","private_key":"2a6bc25e58ea6c30639feb4e97a394af64178e6a42aaab9b082079c20f02434e","name":"node_7fbc1843e2222e3c8e35a3215d1bbb4d5457d8b9ed33749e07e22f25ba9ee576","services":["bzz","pss"],"enable_msg_events":true,"port":40281},"up":true}},{"node":{"info":{"id":"86ca1078dae40f23ae1b3ac47397460d9ec0bf243a0de372b405381d6722fcb2","name":"node_86ca1078dae40f23ae1b3ac47397460d9ec0bf243a0de372b405381d6722fcb2","enode":"enode://160b7b02fe623f5d12e809600a6b47beeb4b30b2951dd67841739f40d54b98b2549eba0adfd40193ef0171a252a403d74752d6b9b7f68c89f18dda26437b2c59@127.0.0.1:0","enr":"0xf88fb8407c73d98812b302dac9f29fe48726b92a0dfa7517895f046594c3773f02a3e4e420da6443c739e51a2ccb79bfa2681764763bf1e4d8dcf515239dd132259941530183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103160b7b02fe623f5d12e809600a6b47beeb4b30b2951dd67841739f40d54b98b2","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"hsoQeNrkDyOuGzrEc5dGDZ7AvyQ6DeNytAU4HWci/LI=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 86ca10\npopulation: 24 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 4167 7fbc | 65 1929 (0) 1be4 (0) 109e (0) 13bc (0)\n001 7 ea60 e77f d224 cec3 | 30 dc97 (0) dfae (0) db08 (0) d6ff (0)\n002 4 a085 a7a6 ad0d aebd | 17 a2ba (0) a320 (0) a085 (0) a75a (0)\n003 5 9ee7 9a92 9626 957d | 8 9a92 (0) 9d3c (0) 9e02 (0) 9ee7 (0)\n004 4 8cf9 895b 8b76 8be4 | 5 8cf9 (0) 89c8 (0) 895b (0) 8b76 (0)\n============ DEPTH: 5 ==========================================\n005 2 83dc 82f0 | 2 83dc (0) 82f0 (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"86ca1078dae40f23ae1b3ac47397460d9ec0bf243a0de372b405381d6722fcb2","private_key":"f6fd1d1772c650e60c41e06f59fc6bba67d5cc264f8fe14e6908e77e9c43f9e2","name":"node_86ca1078dae40f23ae1b3ac47397460d9ec0bf243a0de372b405381d6722fcb2","services":["bzz","pss"],"enable_msg_events":true,"port":46147},"up":true}},{"node":{"info":{"id":"4167946de250b013e1be16ee84bfe2ccaae83e699e618b38f31016c4e431e6ba","name":"node_4167946de250b013e1be16ee84bfe2ccaae83e699e618b38f31016c4e431e6ba","enode":"enode://a7bb630e0a99ad26a47f5bcf331536335c3e04dd4ffdbd27f229ec42dcc5eb7016e0e5f2cb8b3cf3489a317e161fdbc729703ba936b737ee2295a4b87f070e41@127.0.0.1:0","enr":"0xf88fb8402c97a2dc8b64057107147453b6c09e3c44ef973679e5658b0b6d0b2b187c4853555cb891d58dbfd328bb8cb83e55bad3c63f3fb185644e4684308ee0bc87b7550183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103a7bb630e0a99ad26a47f5bcf331536335c3e04dd4ffdbd27f229ec42dcc5eb70","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"QWeUbeJQsBPhvhbuhL/izKroPmmeYYs48xAWxOQx5ro=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 416794\npopulation: 29 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 f410 86ca | 63 dfae (0) dc97 (0) db08 (0) d6ff (0)\n001 4 13bc 0ff6 018a 06b9 | 27 1929 (0) 1be4 (0) 109e (0) 13bc (0)\n002 13 7b92 78cb 7cf4 7f87 | 23 645b (0) 667e (0) 6728 (0) 6742 (0)\n003 3 5a01 539d 5776 | 7 5d60 (0) 5abc (0) 5a01 (0) 517a (0)\n004 4 4b24 4a18 48b6 4cd0 | 4 4b24 (0) 4a18 (0) 48b6 (0) 4cd0 (0)\n005 1 47c3 | 1 47c3 (0)\n============ DEPTH: 6 ==========================================\n006 0 | 0\n007 0 | 0\n008 2 41b9 419a | 2 41b9 (0) 419a (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"4167946de250b013e1be16ee84bfe2ccaae83e699e618b38f31016c4e431e6ba","private_key":"2e633e4e9e522151a2b2bd98030f66cd31b2e81feb8ab86004b194a703e3fb86","name":"node_4167946de250b013e1be16ee84bfe2ccaae83e699e618b38f31016c4e431e6ba","services":["bzz","pss"],"enable_msg_events":true,"port":42087},"up":true}},{"node":{"info":{"id":"f410d4ac9b748c24fa0d48c3053bb1cea8a67d0bcc4e5fcbdb261c0c7522cc34","name":"node_f410d4ac9b748c24fa0d48c3053bb1cea8a67d0bcc4e5fcbdb261c0c7522cc34","enode":"enode://df462c25ee8bcaf3bcfd05af911c6466c62d31175cf9c44288595b39729d64e7a2e81626fe01bc61b0036fbf2dadb271171e7e9c6812214526b2f1c83e6c5881@127.0.0.1:0","enr":"0xf88fb8404a32ca40db377ce80d0e646c9643936683374ce6e8ec14963aae37672d13490f2f06bf8861a4b5f426b9f70eb96e75389076f3d92ce641abc9191a362c185bb00183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103df462c25ee8bcaf3bcfd05af911c6466c62d31175cf9c44288595b39729d64e7","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"9BDUrJt0jCT6DUjDBTuxzqimfQvMTl/L2yYcDHUizDQ=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: f410d4\npopulation: 28 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 13 3ee4 0ff6 06b9 0427 | 65 1be4 (0) 1929 (0) 109e (0) 13bc (0)\n001 5 b381 a7a6 82f0 957d | 33 a75a (0) a7a6 (0) a320 (0) a2ba (0)\n002 2 ca03 d224 | 15 dc97 (0) dfae (0) db08 (0) d6ff (0)\n003 4 e16b e77f ea60 ebca | 10 e16b (0) e0b1 (0) e0ea (0) e55d (0)\n============ DEPTH: 4 ==========================================\n004 0 | 0\n005 2 f361 f360 | 2 f361 (0) f360 (0)\n006 1 f74e | 1 f74e (0)\n007 1 f5c4 | 1 f5c4 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"f410d4ac9b748c24fa0d48c3053bb1cea8a67d0bcc4e5fcbdb261c0c7522cc34","private_key":"a9a777290064b28ab9e2bd8edfcf9cf14e40ba8fb169ba18ec322bebd1e9796c","name":"node_f410d4ac9b748c24fa0d48c3053bb1cea8a67d0bcc4e5fcbdb261c0c7522cc34","services":["bzz","pss"],"enable_msg_events":true,"port":46863},"up":true}},{"node":{"info":{"id":"92a1501ed41e29bb7dd8eb4b4acecae983f4c7c83f39895cd68f7810b645f1dd","name":"node_92a1501ed41e29bb7dd8eb4b4acecae983f4c7c83f39895cd68f7810b645f1dd","enode":"enode://d4f739677902ad2701144cab8f87489253d25aeda47e8ed5817e4562ddaae678ffe9c52f8716f132ce74f96161ed770ccc5627a11dca2ea4024b49b8a6054f11@127.0.0.1:0","enr":"0xf88fb8400fb72975a9f5e05d571cc9bc2a2acf555ccd87f5b870d76b312c9964b17f7bc45382dd2fc4e0c93ff5987f761bc2e9faa304c2be53ed8588128a89d0b881c5750183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103d4f739677902ad2701144cab8f87489253d25aeda47e8ed5817e4562ddaae678","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"kqFQHtQeKbt92OtLSs7K6YP0x8g/OYlc1o94ELZF8d0=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 92a150\npopulation: 24 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 7b92 7639 419a | 65 5d60 (0) 5a01 (0) 5abc (0) 558e (0)\n001 8 d224 d0f3 ca03 cbc5 | 30 c181 (0) c3a1 (0) cdcd (0) cfbb (0)\n002 3 afa3 a7a6 b841 | 17 a320 (0) a2ba (0) a085 (0) a75a (0)\n003 3 8be4 86ca 82f0 | 8 83dc (0) 82f0 (0) 86ca (0) 8cf9 (0)\n004 4 9a92 9d3c 9e02 9ee7 | 4 9d3c (0) 9e02 (0) 9ee7 (0) 9a92 (0)\n============ DEPTH: 5 ==========================================\n005 2 9626 957d | 2 9626 (0) 957d (0)\n006 1 91eb | 1 91eb (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"92a1501ed41e29bb7dd8eb4b4acecae983f4c7c83f39895cd68f7810b645f1dd","private_key":"d99269d5a3d87afd088aa258ab85c5ee8f988fdd019689f5f639b1e488b7abae","name":"node_92a1501ed41e29bb7dd8eb4b4acecae983f4c7c83f39895cd68f7810b645f1dd","services":["bzz","pss"],"enable_msg_events":true,"port":43101},"up":true}},{"node":{"info":{"id":"b8411f198fd658c5a2028835c0af3342145839c06c8a4f382d9f9de485d46c08","name":"node_b8411f198fd658c5a2028835c0af3342145839c06c8a4f382d9f9de485d46c08","enode":"enode://8df6b1e4435d4b72ae0f6dcda1002d86349ac28a9b9a182692a0fd2cb5f10255b8f960fddb898e957a04daa3a6b3f6aa6ef97bed544b4b99ad81edff6707d20f@127.0.0.1:0","enr":"0xf88fb840b8517e545b313545c0b7003080e9c0b7e74c291b272d1e018dc8684a4ca24bcc4f7af3c9997eb09cf50e46161d175a929d29372f4a73ec5cb21e06b0c6d0146e0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1038df6b1e4435d4b72ae0f6dcda1002d86349ac28a9b9a182692a0fd2cb5f10255","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"uEEfGY/WWMWiAog1wK8zQhRYOcBsik84LZ+d5IXUbAg=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: b8411f\npopulation: 26 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 06b9 419a 73b8 | 65 5a01 (0) 5abc (0) 5d60 (0) 5776 (0)\n001 6 db08 cbc5 e77f e55d | 30 f74e (0) f410 (0) f5c4 (0) f361 (0)\n002 6 82f0 8be4 9d3c 9ee7 | 16 83dc (0) 82f0 (0) 86ca (0) 8cf9 (0)\n003 5 a7a6 a085 ad0d afa3 | 9 a75a (0) a7a6 (0) a320 (0) a2ba (0)\n004 4 b486 b16d b381 b2b9 | 5 b70e (0) b486 (0) b16d (0) b381 (0)\n============ DEPTH: 5 ==========================================\n005 0 | 0\n006 0 | 0\n007 1 b92a | 1 b92a (0)\n008 1 b8e1 | 1 b8e1 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"b8411f198fd658c5a2028835c0af3342145839c06c8a4f382d9f9de485d46c08","private_key":"949877f6e6d76788923054b7bd6526b9001f04a77df87bc9161352dc5453e5bc","name":"node_b8411f198fd658c5a2028835c0af3342145839c06c8a4f382d9f9de485d46c08","services":["bzz","pss"],"enable_msg_events":true,"port":33251},"up":true}},{"node":{"info":{"id":"8be461203f5ebb5721348f537b37d768f7bd359af3e18d1f7e9af2f901c49845","name":"node_8be461203f5ebb5721348f537b37d768f7bd359af3e18d1f7e9af2f901c49845","enode":"enode://fc32bff950e71029ffb87f1cd11cd8b80e17e8a1bb87da502f53a1ce59ae43cfe17583075dd14d54a9e2e5f0a45ea7a7e66a3ef496ff5fbe5170bb5cf2c94b21@127.0.0.1:0","enr":"0xf88fb840c686f651105296aa062d5461136529224697c9783747504a33939d92f192c56e1b9b95e2c2493d32ede538f135f81cc3e3ec89f91ba1d068c056c407c775d30c0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103fc32bff950e71029ffb87f1cd11cd8b80e17e8a1bb87da502f53a1ce59ae43cf","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"i+RhID9eu1chNI9TezfXaPe9NZrz4Y0ffpry+QHEmEU=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 8be461\npopulation: 26 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 419a 7b92 73b8 | 65 5d60 (0) 5a01 (0) 5abc (0) 558e (0)\n001 6 ea60 e77f f360 c8e5 | 30 f74e (0) f5c4 (0) f410 (0) f361 (0)\n002 5 a7a6 ad0d afa3 aebd | 17 a75a (0) a7a6 (0) a320 (0) a2ba (0)\n003 5 9d3c 9ee7 9a92 92a1 | 8 9e02 (0) 9ee7 (0) 9d3c (0) 9a92 (0)\n004 3 86ca 83dc 82f0 | 3 86ca (0) 83dc (0) 82f0 (0)\n005 1 8cf9 | 1 8cf9 (0)\n============ DEPTH: 6 ==========================================\n006 2 89c8 895b | 2 89c8 (0) 895b (0)\n007 0 | 0\n008 1 8b76 | 1 8b76 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"8be461203f5ebb5721348f537b37d768f7bd359af3e18d1f7e9af2f901c49845","private_key":"0f6530f636582633a6311f48aa9d253eab18b87cbebe43f367a159aa3c241c46","name":"node_8be461203f5ebb5721348f537b37d768f7bd359af3e18d1f7e9af2f901c49845","services":["bzz","pss"],"enable_msg_events":true,"port":45015},"up":true}},{"node":{"info":{"id":"aebd6135d10252b07f891b3a7330903faf13d409c4f7108630715fa0754f938e","name":"node_aebd6135d10252b07f891b3a7330903faf13d409c4f7108630715fa0754f938e","enode":"enode://f282cd19ae6a9df87585322507e574bc32df4841972dd882a9a05870050a1b598c8fc33af74f96a6420a9880385812d048ace508f80750a8de0cb24c56212d78@127.0.0.1:0","enr":"0xf88fb84031ffcecf6c8f21aa2106e8d9bbdaa2414c925860a95299b3ade0ebacc68255dc2f7eb3419664abbd0c8819f34be4a3452dfb3fdd59dd7c81c6133f3c7b98d96b0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102f282cd19ae6a9df87585322507e574bc32df4841972dd882a9a05870050a1b59","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"rr1hNdECUrB/iRs6czCQP68T1AnE9xCGMHFfoHVPk44=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: aebd61\npopulation: 29 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 9 3e56 3ee4 13bc 0ff6 | 65 018a (0) 0390 (0) 0218 (0) 026d (0)\n001 5 f360 e77f ebca d224 | 30 f74e (0) f5c4 (0) f410 (0) f361 (0)\n002 5 9d3c 9ee7 82f0 86ca | 16 9e02 (0) 9ee7 (0) 9d3c (0) 9a92 (0)\n003 3 b841 b2b9 b381 | 8 b70e (0) b486 (0) b16d (0) b381 (0)\n004 4 a7a6 a320 a2ba a085 | 5 a75a (0) a7a6 (0) a320 (0) a2ba (0)\n============ DEPTH: 5 ==========================================\n005 0 | 0\n006 1 ad0d | 1 ad0d (0)\n007 1 afa3 | 1 afa3 (0)\n008 1 ae67 | 1 ae67 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"aebd6135d10252b07f891b3a7330903faf13d409c4f7108630715fa0754f938e","private_key":"1052de44bfe98977c2f57b1304d18f99ad509385a540c598539f43a9fd01a076","name":"node_aebd6135d10252b07f891b3a7330903faf13d409c4f7108630715fa0754f938e","services":["bzz","pss"],"enable_msg_events":true,"port":32913},"up":true}},{"node":{"info":{"id":"4cd0f38e52a508f81cf95e1370c994aea2d7a49a2a08e3e054f53629a6619410","name":"node_4cd0f38e52a508f81cf95e1370c994aea2d7a49a2a08e3e054f53629a6619410","enode":"enode://26c256c0419d8280c23d163c3dada761578f80e066c614882b6efe25eb4b5d9e06e50aa77e5306508227275d3ad527fc67dca7f4c3066a7e89e5b7d0b48cf106@127.0.0.1:0","enr":"0xf88fb840d136e30739a296b8258bac9b8c021058e3b129b00b86eefcae768e963d71000d436fb91ca2511d958b15dbd33372cf80dd57a8b2d6439fd1a7a261f5d8d66feb0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10226c256c0419d8280c23d163c3dada761578f80e066c614882b6efe25eb4b5d9e","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"TNDzjlKlCPgc+V4TcMmUrqLXpJoqCOPgVPU2KaZhlBA=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 4cd0f3\npopulation: 28 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 b2b9 b381 aebd | 63 f74e (0) f5c4 (0) f410 (0) f361 (0)\n001 7 13bc 0ff6 0bcf 027f | 27 018a (0) 0390 (0) 0218 (0) 026d (0)\n002 9 6728 6742 6ecb 6982 | 23 757a (0) 772e (0) 7639 (0) 734e (0)\n003 2 5a01 539d | 7 558e (0) 5776 (0) 517a (0) 539d (0)\n004 4 47c3 4167 41b9 419a | 4 47c3 (0) 4167 (0) 41b9 (0) 419a (0)\n============ DEPTH: 5 ==========================================\n005 3 4a18 4b24 48b6 | 3 4a18 (0) 4b24 (0) 48b6 (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"4cd0f38e52a508f81cf95e1370c994aea2d7a49a2a08e3e054f53629a6619410","private_key":"bc76c03a436db84839741888c68b1cdddedd194bc0c48dd035a5b8fce7fa6f2b","name":"node_4cd0f38e52a508f81cf95e1370c994aea2d7a49a2a08e3e054f53629a6619410","services":["bzz","pss"],"enable_msg_events":true,"port":38223},"up":true}},{"node":{"info":{"id":"2459fe9250b3311c86530d00b7a9b8ba57b1b5151c126262e70c55d1e8d37924","name":"node_2459fe9250b3311c86530d00b7a9b8ba57b1b5151c126262e70c55d1e8d37924","enode":"enode://d7f147b4838d04a590e69acd66b2f879e2de85f8607e998c3e8c35841145bbe75feb3b9a00e5c33fe2185506151da35ab450699981b512c4dcf86ec22e5538e6@127.0.0.1:0","enr":"0xf88fb8400f37b8427aa3076dbc1caa48263b9df3bc54fe10fadece63d56c92ecd89cbe31074c7a98aa40bbd3a1d5adf1c59ce9dbf534f2d891b802986e99ee22585328ec0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102d7f147b4838d04a590e69acd66b2f879e2de85f8607e998c3e8c35841145bbe7","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"JFn+klCzMRyGUw0At6m4ulextRUcEmJi5wxV0ejTeSQ=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 2459fe\npopulation: 34 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 a085 afa3 ea60 cec3 | 63 e0b1 (0) e0ea (0) e16b (0) e77f (0)\n001 11 757a 7639 7355 7b92 | 38 757a (0) 772e (0) 7639 (0) 734e (0)\n002 7 0bcf 0ff6 0427 06b9 | 15 0506 (0) 0427 (0) 06b9 (0) 018a (0)\n003 5 372d 38ab 3cb1 3ee4 | 6 372d (0) 39db (0) 38ab (0) 3cb1 (0)\n004 2 2a22 286a | 2 2a22 (0) 286a (0)\n005 1 213b | 1 213b (0)\n============ DEPTH: 6 ==========================================\n006 1 26d1 | 1 26d1 (0)\n007 0 | 0\n008 0 | 0\n009 1 2434 | 1 2434 (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"2459fe9250b3311c86530d00b7a9b8ba57b1b5151c126262e70c55d1e8d37924","private_key":"4c8204f3f41c8735aa70c249cbaa8f57ea41b39b651490de8de8c12fd2691eaa","name":"node_2459fe9250b3311c86530d00b7a9b8ba57b1b5151c126262e70c55d1e8d37924","services":["bzz","pss"],"enable_msg_events":true,"port":37643},"up":true}},{"node":{"info":{"id":"698247d103a8925d8bb4c56a3056e49c5efc595fced1c89d49943bb9ba01f394","name":"node_698247d103a8925d8bb4c56a3056e49c5efc595fced1c89d49943bb9ba01f394","enode":"enode://d6a014202d01536e4928ed4efbe17f6d6a7fa8fc624bafce75e43cd1f25f6aeb2a474087e08c4e0b49a38a5e4486fa8c08092f00164df92082dec0fbd9834433@127.0.0.1:0","enr":"0xf88fb840151b4bf6e849b0ac2ec218151f8dfa803c5b5d34733bf46e1c711e9d2ba90c6c6a9084cf38dcd6cc4ccc77d3aa6b062ad0ccd53666db1de1d30ace82ce35afb10183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103d6a014202d01536e4928ed4efbe17f6d6a7fa8fc624bafce75e43cd1f25f6aeb","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"aYJH0QOokl2LtMVqMFbknF78WV/O0cidSZQ7uboB85Q=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 698247\npopulation: 35 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 11 cbc5 ca03 c8e5 c3a1 | 63 e0ea (0) e0b1 (0) e16b (0) e77f (0)\n001 2 3ee4 2459 | 27 0427 (0) 0506 (0) 06b9 (0) 018a (0)\n002 4 4167 419a 4cd0 48b6 | 15 5d60 (0) 5a01 (0) 5abc (0) 558e (0)\n003 10 7639 7355 734e 73b8 | 12 757a (0) 772e (0) 7639 (0) 734e (0)\n004 3 6210 6728 6742 | 5 6210 (0) 645b (0) 667e (0) 6728 (0)\n============ DEPTH: 5 ==========================================\n005 5 6e5c 6ecb 6d60 6c82 | 5 6e5c (0) 6ecb (0) 6c82 (0) 6c02 (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"698247d103a8925d8bb4c56a3056e49c5efc595fced1c89d49943bb9ba01f394","private_key":"20311624a5a56cae7a90aedb142273ff36c5f5d52598fa621d5e388c078ca94f","name":"node_698247d103a8925d8bb4c56a3056e49c5efc595fced1c89d49943bb9ba01f394","services":["bzz","pss"],"enable_msg_events":true,"port":40773},"up":true}},{"node":{"info":{"id":"6742cca1b7783fcbed8d0b340508f93cc4dfaca8ff3f13fd59354486c4d62993","name":"node_6742cca1b7783fcbed8d0b340508f93cc4dfaca8ff3f13fd59354486c4d62993","enode":"enode://84717a6835e106aad3b6c055224217d5d064ac8909100b55eaabc37dc20949be1f33a3b838405bcd5e71cbfbb69170d21ff07952aab37534f965efccaf979d50@127.0.0.1:0","enr":"0xf88fb840d2f711c921f221581b2944e9166c506e85656605df5d204f343f836509260aa24240127b85cb3cf9945ddb9030e85db8e5e6f393b31b1b7cda2cd36a8eeda4110183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10284717a6835e106aad3b6c055224217d5d064ac8909100b55eaabc37dc20949be","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"Z0LMobd4P8vtjQs0BQj5PMTfrKj/PxP9WTVEhsTWKZM=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 6742cc\npopulation: 27 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 b2b9 b381 957d 82f0 | 63 ed32 (0) edc8 (0) ea60 (0) ea0e (0)\n001 2 26d1 13bc | 27 06b9 (0) 0427 (0) 0506 (0) 018a (0)\n002 5 539d 4167 4cd0 4b24 | 15 5d60 (0) 5a01 (0) 5abc (0) 5776 (0)\n003 9 7639 734e 7355 73b8 | 12 757a (0) 772e (0) 7639 (0) 734e (0)\n004 3 6d60 6c82 6982 | 6 6e5c (0) 6ecb (0) 6c02 (0) 6c82 (0)\n005 1 6210 | 1 6210 (0)\n006 1 645b | 1 645b (0)\n============ DEPTH: 7 ==========================================\n007 1 667e | 1 667e (0)\n008 0 | 0\n009 1 6728 | 1 6728 (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"6742cca1b7783fcbed8d0b340508f93cc4dfaca8ff3f13fd59354486c4d62993","private_key":"0cb73f4cde658fd3ac83b434133145d5fbd0bf4f9ab6e3923171d443eba90568","name":"node_6742cca1b7783fcbed8d0b340508f93cc4dfaca8ff3f13fd59354486c4d62993","services":["bzz","pss"],"enable_msg_events":true,"port":40229},"up":true}},{"node":{"info":{"id":"82f034db88fd26b47c26b95c3f87a1f454ffe4526ae86beb2bb1d8f2c218c25c","name":"node_82f034db88fd26b47c26b95c3f87a1f454ffe4526ae86beb2bb1d8f2c218c25c","enode":"enode://e8117dddd5f5e8f212dbd7147bd8bf02068ddb0e94123d323731d22a7f0103610057f6ae1a76d6442bef79f3ae52f0faf62c535b759ee126461f402b83ba45bd@127.0.0.1:0","enr":"0xf88fb840d046f5dff4971dc895e66458c436e6e3a27c96b8d53df7b3b9ad0e77f4345ed32a7b206c7a3d662fd18b0f7a404a7dc243abbdc9a8a677f9973dd2b99af279ff0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103e8117dddd5f5e8f212dbd7147bd8bf02068ddb0e94123d323731d22a7f010361","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"gvA024j9JrR8JrlcP4eh9FT/5FJq6GvrK7HY8sIYwlw=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 82f034\npopulation: 34 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 6982 6742 | 65 06b9 (0) 0506 (0) 0427 (0) 018a (0)\n001 9 f360 f410 f5c4 ebca | 30 e77f (0) e55d (0) e0ea (0) e0b1 (0)\n002 9 a085 a2ba ad0d aebd | 17 a7a6 (0) a75a (0) a320 (0) a2ba (0)\n003 7 9a92 9ee7 9e02 9d3c | 8 9e02 (0) 9ee7 (0) 9d3c (0) 9a92 (0)\n004 5 8cf9 89c8 895b 8b76 | 5 8cf9 (0) 89c8 (0) 895b (0) 8b76 (0)\n============ DEPTH: 5 ==========================================\n005 1 86ca | 1 86ca (0)\n006 0 | 0\n007 1 83dc | 1 83dc (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"82f034db88fd26b47c26b95c3f87a1f454ffe4526ae86beb2bb1d8f2c218c25c","private_key":"c43af8c1c17ec355ac7f8bef6f05ba9db12db47c9e201a266d0d65065798ba3c","name":"node_82f034db88fd26b47c26b95c3f87a1f454ffe4526ae86beb2bb1d8f2c218c25c","services":["bzz","pss"],"enable_msg_events":true,"port":33523},"up":true}},{"node":{"info":{"id":"b2b9ac0f4db58886597af7b19d6150498ac8ad7c804671628aa34384b8fe505e","name":"node_b2b9ac0f4db58886597af7b19d6150498ac8ad7c804671628aa34384b8fe505e","enode":"enode://a22d89dcb4290953d158b22c35c5c68eeb5e11220f22b58314ba70f7fc2b7603b7c6e1ff81f0dd1b53230d0a89eab8629e5629a51e8933fa5561cf04542b202a@127.0.0.1:0","enr":"0xf88fb8400a3de612482002f22886dbd86e19870d74873631d82f29687df78027690518e16dc049dcbcfbe0ea0984b62dd97074247757a9c4675a87c49da61843ca343e2d0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102a22d89dcb4290953d158b22c35c5c68eeb5e11220f22b58314ba70f7fc2b7603","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"srmsD021iIZZevexnWFQSYrIrXyARnFiiqNDhLj+UF4=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: b2b9ac\npopulation: 31 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 11 6d60 6742 6728 667e | 65 5d60 (0) 5abc (0) 5a01 (0) 558e (0)\n001 2 f5c4 d224 | 30 ed32 (0) edc8 (0) ea60 (0) ea0e (0)\n002 5 91eb 9d3c 9ee7 9a92 | 16 9ee7 (0) 9e02 (0) 9d3c (0) 9a92 (0)\n003 6 a75a a085 a2ba ad0d | 9 a7a6 (0) a75a (0) a320 (0) a2ba (0)\n004 3 b92a b8e1 b841 | 3 b92a (0) b8e1 (0) b841 (0)\n005 2 b486 b70e | 2 b486 (0) b70e (0)\n============ DEPTH: 6 ==========================================\n006 1 b16d | 1 b16d (0)\n007 1 b381 | 1 b381 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"b2b9ac0f4db58886597af7b19d6150498ac8ad7c804671628aa34384b8fe505e","private_key":"468f3a0090d15106e770801e7f4f0fc26bf78d3698be131eb3585ca410116084","name":"node_b2b9ac0f4db58886597af7b19d6150498ac8ad7c804671628aa34384b8fe505e","services":["bzz","pss"],"enable_msg_events":true,"port":42099},"up":true}},{"node":{"info":{"id":"3e56d4533ec14f6656e1eb25fb35dad47c9db479f667a6b6fe9a3aa8c12e982e","name":"node_3e56d4533ec14f6656e1eb25fb35dad47c9db479f667a6b6fe9a3aa8c12e982e","enode":"enode://4b65a104001fb3c5edd9eb6477d5e7daca674195a347fa8deb71a83931f3475569a6ee580c248b2243c09b8787be153f817ee6b282fb0572424fa91c9243ffb6@127.0.0.1:0","enr":"0xf88fb8409d8ea451f2658de612662bd9b07a86cb819f781fa9d8f8e1350199a2666dae1d498b271416d9b6f88a3f0468d2f2971a017e78e789d14596d7ca1b56365597d10183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1024b65a104001fb3c5edd9eb6477d5e7daca674195a347fa8deb71a83931f34755","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"PlbUUz7BT2ZW4esl+zXa1HydtHn2Z6a2/po6qMEumC4=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 3e56d4\npopulation: 25 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 ea60 d224 a085 aebd | 63 ed32 (0) edc8 (0) ea0e (0) ea60 (0)\n001 6 48b6 6c82 7639 7fbc | 38 5d60 (0) 5a01 (0) 5abc (0) 558e (0)\n002 5 0427 0ff6 0bcf 1929 | 15 06b9 (0) 0506 (0) 0427 (0) 018a (0)\n003 4 2a22 286a 26d1 2459 | 6 2a22 (0) 286a (0) 213b (0) 2434 (0)\n004 1 372d | 1 372d (0)\n005 2 39db 38ab | 2 39db (0) 38ab (0)\n============ DEPTH: 6 ==========================================\n006 1 3cb1 | 1 3cb1 (0)\n007 0 | 0\n008 1 3ee4 | 1 3ee4 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"3e56d4533ec14f6656e1eb25fb35dad47c9db479f667a6b6fe9a3aa8c12e982e","private_key":"3934a1eb89e5d3bd316aca133dcf3e380fe237373fdc981c7d7c138612ca06c2","name":"node_3e56d4533ec14f6656e1eb25fb35dad47c9db479f667a6b6fe9a3aa8c12e982e","services":["bzz","pss"],"enable_msg_events":true,"port":44945},"up":true}},{"node":{"info":{"id":"7b9242137f8cc2bec7b3e0003fd93026921ceb10dfadbbd5b6aa64d61a74f35e","name":"node_7b9242137f8cc2bec7b3e0003fd93026921ceb10dfadbbd5b6aa64d61a74f35e","enode":"enode://f8572034b7fc585c1903d4bb5879cf1ffbac94cbc1897edfe98d9b9f84d93d26b67f2abeb88ce77608ed262152ac3840f448f26a5a61afa46eea388e2f4b7a42@127.0.0.1:0","enr":"0xf88fb8400e94e52c2270cce5bdd17883b40ecc21d4ec6157af03e3c97775e38e6fc0370d63efe0aae8270863a14fb499442bdd706b616fb6843938b664eb2f43ba9fce8f0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102f8572034b7fc585c1903d4bb5879cf1ffbac94cbc1897edfe98d9b9f84d93d26","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"e5JCE3+Mwr7Hs+AAP9kwJpIc6xDfrbvVtqpk1hp0814=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 7b9242\npopulation: 48 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 11 8be4 8cf9 957d 9626 | 63 9e02 (0) 9ee7 (0) 9d3c (0) 9a92 (0)\n001 14 13bc 0ab9 0bcf 0ff6 | 27 0427 (0) 0506 (0) 06b9 (0) 018a (0)\n002 3 4167 48b6 4cd0 | 15 5d60 (0) 5a01 (0) 5abc (0) 5776 (0)\n003 9 6982 6d60 6c02 6e5c | 11 6210 (0) 645b (0) 667e (0) 6728 (0)\n004 6 7639 772e 757a 734e | 6 757a (0) 772e (0) 7639 (0) 734e (0)\n============ DEPTH: 5 ==========================================\n005 4 7cf4 7dc5 7f87 7fbc | 4 7f87 (0) 7fbc (0) 7cf4 (0) 7dc5 (0)\n006 1 78cb | 1 78cb (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"7b9242137f8cc2bec7b3e0003fd93026921ceb10dfadbbd5b6aa64d61a74f35e","private_key":"5a6b556ff9b73fe0850c45f469fbfd6e6f0d2d5af3f3831f4376a08b8ca8a549","name":"node_7b9242137f8cc2bec7b3e0003fd93026921ceb10dfadbbd5b6aa64d61a74f35e","services":["bzz","pss"],"enable_msg_events":true,"port":39179},"up":true}},{"node":{"info":{"id":"73b8d1840d0a8ffe69752ec96f8fddecb0e22726c87982d572ca9acc1c9cdbfc","name":"node_73b8d1840d0a8ffe69752ec96f8fddecb0e22726c87982d572ca9acc1c9cdbfc","enode":"enode://14b035995d987becf991740865f7caa23bad70978a889984199627036686ab81a14519d760274790b6bacf5268d2e469987a4470aae895019e00d2d43d366278@127.0.0.1:0","enr":"0xf88fb84057f0098ffc99b981a4c2b43591db40bfbc63ac9be4c3abecc42ba157711a2e2a7c925f830e8fa6b04074eea3c2c534df67e40efc15f1bb75348fbed8d0d468870183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10214b035995d987becf991740865f7caa23bad70978a889984199627036686ab81","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"c7jRhA0Kj/5pdS7Jb4/d7LDiJybIeYLVcsqazByc2/w=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 73b8d1\npopulation: 28 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 8be4 b841 d6ff d224 | 63 9ee7 (0) 9e02 (0) 9d3c (0) 9a92 (0)\n001 3 3ee4 0bcf 13bc | 27 06b9 (0) 0427 (0) 0506 (0) 0390 (0)\n002 4 419a 4167 48b6 4cd0 | 15 5d60 (0) 5a01 (0) 5abc (0) 558e (0)\n003 6 6ecb 6982 667e 6728 | 11 6210 (0) 645b (0) 667e (0) 6728 (0)\n004 6 7dc5 7cf4 7f87 7fbc | 6 7f87 (0) 7fbc (0) 7cf4 (0) 7dc5 (0)\n005 3 772e 7639 757a | 3 772e (0) 7639 (0) 757a (0)\n============ DEPTH: 6 ==========================================\n006 0 | 0\n007 0 | 0\n008 2 734e 7355 | 2 734e (0) 7355 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"73b8d1840d0a8ffe69752ec96f8fddecb0e22726c87982d572ca9acc1c9cdbfc","private_key":"29694c9dcdcbd8510814aabcc1c9a32e23b92f4596464ba205244a4954cc0595","name":"node_73b8d1840d0a8ffe69752ec96f8fddecb0e22726c87982d572ca9acc1c9cdbfc","services":["bzz","pss"],"enable_msg_events":true,"port":36127},"up":true}},{"node":{"info":{"id":"d2245f0679b436faabc0164e0b85e02e2effbad306e8229b555524a5e6d1a5f9","name":"node_d2245f0679b436faabc0164e0b85e02e2effbad306e8229b555524a5e6d1a5f9","enode":"enode://235360aff6df4553e2efa53a861609209743e1ea81cd07f7bcbe80ae9fbf012a2caca09eb6dbac7be69d14d3805a552d18a626a6e5356659180c8d804f7f7ee3@127.0.0.1:0","enr":"0xf88fb840f7e66d84700fe9e82cd1cdeca1acbb2242b09a69b0e50173bac5c41180f1f8d14138152b7755e0228ce2d6b526c3c01bdddaabf90a2a856f715944f373533aef0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103235360aff6df4553e2efa53a861609209743e1ea81cd07f7bcbe80ae9fbf012a","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"0iRfBnm0NvqrwBZOC4XgLi7/utMG6CKbVVUkpebRpfk=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: d2245f\npopulation: 43 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 12 286a 2459 3ee4 3e56 | 65 0427 (0) 0506 (0) 06b9 (0) 018a (0)\n001 12 895b 8be4 86ca 82f0 | 33 8cf9 (0) 89c8 (0) 895b (0) 8b76 (0)\n002 5 ebca ea60 e16b f5c4 | 15 e55d (0) e77f (0) e0ea (0) e0b1 (0)\n003 9 c181 c3a1 c8e5 ca03 | 9 c181 (0) c3a1 (0) c8e5 (0) ca03 (0)\n004 3 db08 dfae dc97 | 3 dfae (0) dc97 (0) db08 (0)\n============ DEPTH: 5 ==========================================\n005 1 d6ff | 1 d6ff (0)\n006 1 d0f3 | 1 d0f3 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"d2245f0679b436faabc0164e0b85e02e2effbad306e8229b555524a5e6d1a5f9","private_key":"658311d7ee69a3bf84aa43c15ac573ea72807a5e080c322310e7bc701ab52fab","name":"node_d2245f0679b436faabc0164e0b85e02e2effbad306e8229b555524a5e6d1a5f9","services":["bzz","pss"],"enable_msg_events":true,"port":38759},"up":true}},{"node":{"info":{"id":"b381e75e52e4cdd168056245f82d3a1747b67f400eb40eb12036b73ee7fe21e5","name":"node_b381e75e52e4cdd168056245f82d3a1747b67f400eb40eb12036b73ee7fe21e5","enode":"enode://b72f0a95514b0161e67d4b36b1dc91cb319117d3f1c34731bb2c685769f11741575d3c41f4c1c8188b85f47c62b149e4f3e5f72394ebc5780c85c06528570c33@127.0.0.1:0","enr":"0xf88fb84012121d864e031d97c287200a10956bbe49c61b0fcb145897fa0a4a0da21a317d48aff38a1901706b29ce01ec8bc17ee9be0c1764a516acafc5cd40048dfe61690183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103b72f0a95514b0161e67d4b36b1dc91cb319117d3f1c34731bb2c685769f11741","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"s4HnXlLkzdFoBWJF+C06F0e2f0AOtA6xIDa3Puf+IeU=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: b381e7\npopulation: 36 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 0ff6 6742 48b6 4cd0 | 65 558e (0) 5776 (0) 517a (0) 539d (0)\n001 13 f5c4 f410 f360 ebca | 30 e77f (0) e55d (0) e0ea (0) e0b1 (0)\n002 5 82f0 9d3c 9ee7 91eb | 16 8cf9 (0) 895b (0) 89c8 (0) 8b76 (0)\n003 7 a7a6 a75a a2ba a085 | 9 a7a6 (0) a75a (0) a320 (0) a2ba (0)\n004 3 b8e1 b841 b92a | 3 b92a (0) b8e1 (0) b841 (0)\n005 2 b486 b70e | 2 b486 (0) b70e (0)\n============ DEPTH: 6 ==========================================\n006 1 b16d | 1 b16d (0)\n007 1 b2b9 | 1 b2b9 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"b381e75e52e4cdd168056245f82d3a1747b67f400eb40eb12036b73ee7fe21e5","private_key":"78a74e69c0e211af6e3f2806e5cf0475ccdb1b5ccfba14e1968b82747e20be0a","name":"node_b381e75e52e4cdd168056245f82d3a1747b67f400eb40eb12036b73ee7fe21e5","services":["bzz","pss"],"enable_msg_events":true,"port":44485},"up":true}},{"node":{"info":{"id":"957d8a9b412b6f4cd151cbc07b8d74d949880ae665c545debb18181389c99ee6","name":"node_957d8a9b412b6f4cd151cbc07b8d74d949880ae665c545debb18181389c99ee6","enode":"enode://61d644b51f9244f36e197d9d614070a5487f071bc7c7753d43edb80f72e5a2c43cda36d5b2f9f070228bb54c8810c5789af96b66be77a6df61aabfffe5da4c8f@127.0.0.1:0","enr":"0xf88fb840d573110433511ff59f78b0fe666d311957c43ee0f9ef6c673d1f53736e1d4b9f6c77c5620e6c97f670e61f3e1d83f77ce36c004b9587fb9ddd3bcc8486e455320183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10361d644b51f9244f36e197d9d614070a5487f071bc7c7753d43edb80f72e5a2c4","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"lX2Km0Erb0zRUcvAe4102UmICuZlxUXeuxgYE4nJnuY=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 957d8a\npopulation: 33 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 8 7b92 6ecb 6d60 6742 | 65 6210 (0) 645b (0) 667e (0) 6742 (0)\n001 13 f5c4 f410 f360 e0ea | 30 edc8 (0) ed32 (0) ea60 (0) ea0e (0)\n002 2 b92a b381 | 17 a75a (0) a7a6 (0) a320 (0) a2ba (0)\n003 3 8be4 86ca 82f0 | 8 8cf9 (0) 895b (0) 89c8 (0) 8b76 (0)\n004 4 9a92 9e02 9ee7 9d3c | 4 9e02 (0) 9ee7 (0) 9d3c (0) 9a92 (0)\n============ DEPTH: 5 ==========================================\n005 2 92a1 91eb | 2 91eb (0) 92a1 (0)\n006 1 9626 | 1 9626 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"957d8a9b412b6f4cd151cbc07b8d74d949880ae665c545debb18181389c99ee6","private_key":"9cbb036a358368a04ab266b8fd487e4bcfead509da1f1d57b0e7fa3db574c99c","name":"node_957d8a9b412b6f4cd151cbc07b8d74d949880ae665c545debb18181389c99ee6","services":["bzz","pss"],"enable_msg_events":true,"port":46189},"up":true}},{"node":{"info":{"id":"26d1af1fbee6541a363ea7707825e37da028142f00779116560ad20f1de18e7b","name":"node_26d1af1fbee6541a363ea7707825e37da028142f00779116560ad20f1de18e7b","enode":"enode://1999562f9de6c42f0577c494aec14691db3aec49ed40e75ea9eedb72e5295d9d0d659f4991946f9fbacc74feaeb5e5181dc23ba10299dd01ec1dec9c00d84ad1@127.0.0.1:0","enr":"0xf88fb84017d136a2bd2b8c6b071ea759278494f6636844e06c788ffe4eff0e1226cd0b0864d646c596173bbf67bc7403a5623bcd2d044273ed7d5c0efbeee8916cc39cc70183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1031999562f9de6c42f0577c494aec14691db3aec49ed40e75ea9eedb72e5295d9d","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"JtGvH77mVBo2PqdweCXjfaAoFC8Ad5EWVgrSDx3hjns=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 26d1af\npopulation: 31 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 e16b d0f3 a085 89c8 | 63 edc8 (0) ed32 (0) ea60 (0) ea0e (0)\n001 8 4b24 48b6 6742 6728 | 38 6210 (0) 645b (0) 667e (0) 6742 (0)\n002 7 13bc 1929 06b9 0390 | 15 0427 (0) 0506 (0) 06b9 (0) 018a (0)\n003 5 372d 39db 3cb1 3e56 | 6 372d (0) 39db (0) 38ab (0) 3cb1 (0)\n004 2 286a 2a22 | 2 286a (0) 2a22 (0)\n005 1 213b | 1 213b (0)\n============ DEPTH: 6 ==========================================\n006 2 2434 2459 | 2 2434 (0) 2459 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"26d1af1fbee6541a363ea7707825e37da028142f00779116560ad20f1de18e7b","private_key":"7e2c84991a191ba4057e485ef2cfc2020c5ccac17ccaace8db0733f7bea4b410","name":"node_26d1af1fbee6541a363ea7707825e37da028142f00779116560ad20f1de18e7b","services":["bzz","pss"],"enable_msg_events":true,"port":44455},"up":true}},{"node":{"info":{"id":"3ee4b20c047e701b58c06fcc8160364bd29573f61f4d9f1935d77ac29f6a1e86","name":"node_3ee4b20c047e701b58c06fcc8160364bd29573f61f4d9f1935d77ac29f6a1e86","enode":"enode://5c685dacbd760c9d05b018f58ac52239966ab2c181ec106125ebad06ab336c7cc4087f4f32a38e9b17edcabd74afe7fd36bbd33e12542ca0646b98bd7e11d489@127.0.0.1:0","enr":"0xf88fb84065e447a80639420887319bbbd8ff453a67c8f00fa8ddcbbbf04b02d24240226a600ae407deabfe11ae74c2b0dc46e86f08d9f08d4d77a1df3e3f3f41dacd5ac10183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1035c685dacbd760c9d05b018f58ac52239966ab2c181ec106125ebad06ab336c7c","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"PuSyDAR+cBtYwG/MgWA2S9KVc/YfTZ8ZNdd6wp9qHoY=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 3ee4b2\npopulation: 32 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 7 89c8 a085 aebd ae67 | 63 edc8 (0) ed32 (0) ea60 (0) ea0e (0)\n001 8 5776 47c3 7639 73b8 | 38 6d60 (0) 6c82 (0) 6c02 (0) 6e5c (0)\n002 9 0ab9 0bcf 0427 06b9 | 15 0506 (0) 0427 (0) 06b9 (0) 018a (0)\n003 3 286a 2459 26d1 | 6 286a (0) 2a22 (0) 213b (0) 2434 (0)\n004 1 372d | 1 372d (0)\n005 2 39db 38ab | 2 39db (0) 38ab (0)\n============ DEPTH: 6 ==========================================\n006 1 3cb1 | 1 3cb1 (0)\n007 0 | 0\n008 1 3e56 | 1 3e56 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"3ee4b20c047e701b58c06fcc8160364bd29573f61f4d9f1935d77ac29f6a1e86","private_key":"452609d27fac9e357776f968c4726676474f4f5fdc9da0bf89f6362b3ba19ff2","name":"node_3ee4b20c047e701b58c06fcc8160364bd29573f61f4d9f1935d77ac29f6a1e86","services":["bzz","pss"],"enable_msg_events":true,"port":41679},"up":true}},{"node":{"info":{"id":"13bc64535d3ae495098e4ac6b30a91d1804dab0ab79944f2c6ac53c9bccdf62d","name":"node_13bc64535d3ae495098e4ac6b30a91d1804dab0ab79944f2c6ac53c9bccdf62d","enode":"enode://6016e452462a437136ffaab5816dde72ff1910f4a456f38c172033a88cc4e204cd4c199e769f890c78f4db86f19416a9522fdeb434384eedc3c2f1ef28b88acc@127.0.0.1:0","enr":"0xf88fb840149fc3c3a63d0f1305a848030d0a2b93385095eec084ca87fb44428c87d118f37da0a3ca28e3f65c085d3befbc01cbe7cf22d90d1d9ed4df2d4ae92c6c4245dc0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1026016e452462a437136ffaab5816dde72ff1910f4a456f38c172033a88cc4e204","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"E7xkU1065JUJjkrGswqR0YBNqwq3mUTyxqxTybzN9i0=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 13bc64\npopulation: 40 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 13 cec3 c3a1 f5c4 f410 | 63 ed32 (0) edc8 (0) ea0e (0) ea60 (0)\n001 8 4cd0 4b24 4167 7b92 | 38 7639 (0) 772e (0) 757a (0) 73b8 (0)\n002 5 2a22 26d1 2459 3e56 | 12 286a (0) 2a22 (0) 213b (0) 2434 (0)\n003 11 0ff6 0ab9 0bcf 0427 | 11 06b9 (0) 0427 (0) 0506 (0) 018a (0)\n============ DEPTH: 4 ==========================================\n004 2 1be4 1929 | 2 1be4 (0) 1929 (0)\n005 0 | 0\n006 1 109e | 1 109e (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"13bc64535d3ae495098e4ac6b30a91d1804dab0ab79944f2c6ac53c9bccdf62d","private_key":"8434ae4dfa2723b5719768bc711f7425c5bd0924b3b0ec5d8cc2c9b399b5766a","name":"node_13bc64535d3ae495098e4ac6b30a91d1804dab0ab79944f2c6ac53c9bccdf62d","services":["bzz","pss"],"enable_msg_events":true,"port":40705},"up":true}},{"node":{"info":{"id":"9a9230b3f7f386520821dee78ebe92e8c64a4f6a50f2639327c62e45cab40563","name":"node_9a9230b3f7f386520821dee78ebe92e8c64a4f6a50f2639327c62e45cab40563","enode":"enode://b7082416512639ee57846e95b5e2dbc63995f361401c3b313732cf2d3d033441790dce7c2460efd7937015b4638e6247ed82c823aa0802925c366c91ae09e68b@127.0.0.1:0","enr":"0xf88fb84099372399c4d3fd5cadf0c624920ed74d76194f722b61996a6a6c99fbce6110170e82d7b4d993a5850e772df12e975549b3191f0cf7f6abae21e9a136f6bff1cc0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103b7082416512639ee57846e95b5e2dbc63995f361401c3b313732cf2d3d033441","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"mpIws/fzhlIIId7njr6S6MZKT2pQ8mOTJ8YuRcq0BWM=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 9a9230\npopulation: 25 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 7b92 7355 39db 13bc | 65 78cb (0) 7b92 (0) 7f87 (0) 7fbc (0)\n001 2 e16b f5c4 | 30 edc8 (0) ed32 (0) ea60 (0) ea0e (0)\n002 6 ad0d a75a b70e b2b9 | 17 b92a (0) b8e1 (0) b841 (0) b486 (0)\n003 6 83dc 82f0 86ca 8cf9 | 8 8cf9 (0) 89c8 (0) 895b (0) 8b76 (0)\n004 4 92a1 91eb 957d 9626 | 4 92a1 (0) 91eb (0) 957d (0) 9626 (0)\n============ DEPTH: 5 ==========================================\n005 3 9ee7 9e02 9d3c | 3 9ee7 (0) 9e02 (0) 9d3c (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"9a9230b3f7f386520821dee78ebe92e8c64a4f6a50f2639327c62e45cab40563","private_key":"e878354e1d0c9956e28fa14cdc5a61945f6f2b2fbea9a8367dbe5f064b174592","name":"node_9a9230b3f7f386520821dee78ebe92e8c64a4f6a50f2639327c62e45cab40563","services":["bzz","pss"],"enable_msg_events":true,"port":35207},"up":true}},{"node":{"info":{"id":"9d3c79e4a0ac4e5b95aa32545f3b8d86f74594faa237d5c2566cf02fbd60b11a","name":"node_9d3c79e4a0ac4e5b95aa32545f3b8d86f74594faa237d5c2566cf02fbd60b11a","enode":"enode://4faf10bd09731418ac192c8a57f170f322ffe575d3a2ee2efafec45fb7da6fd3712457dd5a78fd5e1a2efa1003715aea87cca4d49b10fd1d3845b72435b8ee4c@127.0.0.1:0","enr":"0xf88fb84082c3796decac811025287334946817180d001c3d8d7721d3971aa9cb879fed0c0acd50bf82c7fa565e2540bef5f1b5731accc7b6a4c70ebe972111d0deda6a8a0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1024faf10bd09731418ac192c8a57f170f322ffe575d3a2ee2efafec45fb7da6fd3","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"nTx55KCsTluVqjJUXzuNhvdFlPqiN9XCVmzwL71gsRo=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 9d3c79\npopulation: 36 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 11 7b92 0bcf 0ab9 018a | 65 1be4 (0) 1929 (0) 109e (0) 13bc (0)\n001 2 e16b cfbb | 30 edc8 (0) ed32 (0) ebca (0) ea60 (0)\n002 11 b16d b381 b2b9 b70e | 17 b92a (0) b8e1 (0) b841 (0) b486 (0)\n003 5 8cf9 8be4 895b 83dc | 8 8cf9 (0) 89c8 (0) 895b (0) 8b76 (0)\n004 4 91eb 92a1 9626 957d | 4 92a1 (0) 91eb (0) 9626 (0) 957d (0)\n005 1 9a92 | 1 9a92 (0)\n============ DEPTH: 6 ==========================================\n006 2 9e02 9ee7 | 2 9ee7 (0) 9e02 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"9d3c79e4a0ac4e5b95aa32545f3b8d86f74594faa237d5c2566cf02fbd60b11a","private_key":"907b7ec9e8b65f1de5310f5964f2c97a21a13adf1c0b9e8a4cb0ba38c73dc24c","name":"node_9d3c79e4a0ac4e5b95aa32545f3b8d86f74594faa237d5c2566cf02fbd60b11a","services":["bzz","pss"],"enable_msg_events":true,"port":37201},"up":true}},{"node":{"info":{"id":"a085045c335ce2e47dbdfeb1adb62ce6c3bed36a93cf3448c45757a1a88e295d","name":"node_a085045c335ce2e47dbdfeb1adb62ce6c3bed36a93cf3448c45757a1a88e295d","enode":"enode://3699407c49116a8a7ddb656a1e7e586838f3e72cfdf9cd942b81adc4fa745f01cf3dd9f2682d44deb8172544a05e86055f3cae6822aa14e3b98a5870a259ad33@127.0.0.1:0","enr":"0xf88fb840de466b2eda8d1345b19b33da7313d03db5548f84b7f7d728a6a1346a44e29bfe6b37764e639f35270f9df761fdeffb3207f2c4716c87d65a25d30afdff134a5a0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1033699407c49116a8a7ddb656a1e7e586838f3e72cfdf9cd942b81adc4fa745f01","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"oIUEXDNc4uR9vf6xrbYs5sO+02qTzzRIxFdXoaiOKV0=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: a08504\npopulation: 32 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 13 109e 3ee4 3e56 3cb1 | 65 286a (0) 2a22 (0) 213b (0) 2434 (0)\n001 3 d224 e16b f5c4 | 30 ebca (0) ea60 (0) ea0e (0) edc8 (0)\n002 3 82f0 86ca 9d3c | 16 8cf9 (0) 89c8 (0) 895b (0) 8b76 (0)\n003 5 b92a b841 b70e b2b9 | 8 b8e1 (0) b841 (0) b92a (0) b486 (0)\n004 4 ad0d ae67 aebd afa3 | 4 ad0d (0) ae67 (0) aebd (0) afa3 (0)\n005 2 a7a6 a75a | 2 a7a6 (0) a75a (0)\n============ DEPTH: 6 ==========================================\n006 2 a320 a2ba | 2 a320 (0) a2ba (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"a085045c335ce2e47dbdfeb1adb62ce6c3bed36a93cf3448c45757a1a88e295d","private_key":"40d0f667c75292876d80bf036c58b652ae8eaf08e6543afce8efe01b5ba38af5","name":"node_a085045c335ce2e47dbdfeb1adb62ce6c3bed36a93cf3448c45757a1a88e295d","services":["bzz","pss"],"enable_msg_events":true,"port":33037},"up":true}},{"node":{"info":{"id":"7355fab10584e4312f5cb5c3c826e7f9c14da74d62d07d0a8007ce9c6e995be9","name":"node_7355fab10584e4312f5cb5c3c826e7f9c14da74d62d07d0a8007ce9c6e995be9","enode":"enode://8f6eaa7d371d5a4d8c1f71c52540914abe2f27afe0a753b8b7ce09e09ceeea61785f53dea26d90c6455d9a37657c52155faf04192b6b8ecef078b8b27ecc7572@127.0.0.1:0","enr":"0xf88fb840ef3018c62f6e420fbce8abac717ede992b1c276bfe0ce90b7b1d8ed88c0a2060783837e6f1f927d5f126a1c274bb6fa274db17107672ef312532d457aeea68200183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1028f6eaa7d371d5a4d8c1f71c52540914abe2f27afe0a753b8b7ce09e09ceeea61","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"c1X6sQWE5DEvXLXDyCbn+cFNp01i0H0KgAfOnG6ZW+k=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 7355fa\npopulation: 28 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 d6ff 9a92 a085 | 63 ebca (0) ea60 (0) ea0e (0) edc8 (0)\n001 7 3cb1 38ab 39db 372d | 27 286a (0) 2a22 (0) 213b (0) 2434 (0)\n002 3 5abc 539d 48b6 | 15 5d60 (0) 5a01 (0) 5abc (0) 5776 (0)\n003 7 6742 667e 6982 6ecb | 11 6982 (0) 6d60 (0) 6c82 (0) 6c02 (0)\n004 3 7fbc 7dc5 7b92 | 6 78cb (0) 7b92 (0) 7f87 (0) 7fbc (0)\n005 3 7639 772e 757a | 3 7639 (0) 772e (0) 757a (0)\n============ DEPTH: 6 ==========================================\n006 0 | 0\n007 0 | 0\n008 1 73b8 | 1 73b8 (0)\n009 0 | 0\n010 0 | 0\n011 1 734e | 1 734e (0)\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"7355fab10584e4312f5cb5c3c826e7f9c14da74d62d07d0a8007ce9c6e995be9","private_key":"65b0005e792636557ba85af62557e19b18b9174bbbef4d0d1a9df6ed86564cd2","name":"node_7355fab10584e4312f5cb5c3c826e7f9c14da74d62d07d0a8007ce9c6e995be9","services":["bzz","pss"],"enable_msg_events":true,"port":35631},"up":true}},{"node":{"info":{"id":"48b614958a8692780ef5bd5c95e0db4ff67deb4de0dcbb878ca4479bfb86957e","name":"node_48b614958a8692780ef5bd5c95e0db4ff67deb4de0dcbb878ca4479bfb86957e","enode":"enode://0cbf237e6aeb863aeb824af9ceface5a8f94eb2330907633723afa315ad810ca5fa9de4f687c6a6035eab2339a4cb9803b61f752c39ec949930c3699850fa0bb@127.0.0.1:0","enr":"0xf88fb8408c25a5258f12cb8ddea2eb309508a3b3bb615e0af2611013a4caa40a060e503d076f528b777885fa04eccb0ab89a0d909844f92a68099ed5b0cb0d3b417c2cda0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1030cbf237e6aeb863aeb824af9ceface5a8f94eb2330907633723afa315ad810ca","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"SLYUlYqGkngO9b1cleDbT/Z9603g3LuHjKRHm/uGlX4=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 48b614\npopulation: 32 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 f5c4 b2b9 b381 afa3 | 63 ed32 (0) edc8 (0) ea0e (0) ea60 (0)\n001 7 39db 3e56 3cb1 372d | 27 286a (0) 2a22 (0) 213b (0) 2434 (0)\n002 12 6982 6c02 6d60 6ecb | 23 6982 (0) 6d60 (0) 6c82 (0) 6c02 (0)\n003 3 539d 558e 5abc | 7 5d60 (0) 5a01 (0) 5abc (0) 5776 (0)\n004 3 47c3 4167 419a | 4 47c3 (0) 4167 (0) 41b9 (0) 419a (0)\n005 1 4cd0 | 1 4cd0 (0)\n============ DEPTH: 6 ==========================================\n006 2 4a18 4b24 | 2 4a18 (0) 4b24 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"48b614958a8692780ef5bd5c95e0db4ff67deb4de0dcbb878ca4479bfb86957e","private_key":"270a9d9bfe65cba3f7905cabdc33f12696f57f495f5b1f4f717c4f686cb9fb22","name":"node_48b614958a8692780ef5bd5c95e0db4ff67deb4de0dcbb878ca4479bfb86957e","services":["bzz","pss"],"enable_msg_events":true,"port":33663},"up":true}},{"node":{"info":{"id":"afa3de5cebc9f96cf20a35058f4856fe43b48ac59cf8e46565f194f438622a52","name":"node_afa3de5cebc9f96cf20a35058f4856fe43b48ac59cf8e46565f194f438622a52","enode":"enode://318bacfd1e44885c89d878b681a769550aa404ad1b963f802ec5bcc8ad70cecde25b68156ac8fce5ab0574e0518f7a5931f1e66b578bc395678f5541d523a0a4@127.0.0.1:0","enr":"0xf88fb840f8a54e090fb7de27c570ae1607b52faecfb241df7ca595859ef729b0b22447b7052a90ae67d12246ec2040000f85a4697bb924b273657efe3faf78db0f755c920183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102318bacfd1e44885c89d878b681a769550aa404ad1b963f802ec5bcc8ad70cecd","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"r6PeXOvJ+WzyCjUFj0hW/kO0isWc+ORlZfGU9DhiKlI=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: afa3de\npopulation: 28 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 2459 0bcf 6728 48b6 | 65 286a (0) 2a22 (0) 213b (0) 2434 (0)\n001 3 e55d e16b f5c4 | 30 ebca (0) ea60 (0) ea0e (0) edc8 (0)\n002 8 91eb 92a1 9d3c 9e02 | 16 8cf9 (0) 89c8 (0) 895b (0) 8b76 (0)\n003 6 b92a b841 b486 b70e | 8 b8e1 (0) b841 (0) b92a (0) b486 (0)\n004 4 a7a6 a75a a2ba a085 | 5 a7a6 (0) a75a (0) a320 (0) a2ba (0)\n============ DEPTH: 5 ==========================================\n005 0 | 0\n006 1 ad0d | 1 ad0d (0)\n007 2 ae67 aebd | 2 ae67 (0) aebd (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"afa3de5cebc9f96cf20a35058f4856fe43b48ac59cf8e46565f194f438622a52","private_key":"e19117f65a5dd05127cf7d2d994fdf61d54c6d9c1113d8cbbd46927df4e3c23a","name":"node_afa3de5cebc9f96cf20a35058f4856fe43b48ac59cf8e46565f194f438622a52","services":["bzz","pss"],"enable_msg_events":true,"port":36875},"up":true}},{"node":{"info":{"id":"67288f84ada7778858139c74917b22ae698ed43df49a6530a566648f074ede46","name":"node_67288f84ada7778858139c74917b22ae698ed43df49a6530a566648f074ede46","enode":"enode://81035bfc5935b3ecdf8f5134d14f109559ce2602e1ef2ae36ff475c43b469a32b2d71d843c6e1a1d45509706538e0956e768594aac04aaf5a712a9a3405251ac@127.0.0.1:0","enr":"0xf88fb840eae38a1667d14d43e83b2c0d0a1c2fb4ccbc358bf1134594c33b2b58d710260809ad16b7f243040e51a0eb368e12ea4ed50a0b438fdbd2f23231d37b12e093010183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10281035bfc5935b3ecdf8f5134d14f109559ce2602e1ef2ae36ff475c43b469a32","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"ZyiPhK2nd4hYE5x0kXsirmmO1D30mmUwpWZkjwdO3kY=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 67288f\npopulation: 33 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 12 d6ff dfae dc97 f5c4 | 63 ebca (0) ea60 (0) ea0e (0) edc8 (0)\n001 2 26d1 0bcf | 27 286a (0) 2a22 (0) 213b (0) 2434 (0)\n002 6 539d 5abc 4167 4cd0 | 15 5d60 (0) 5a01 (0) 5abc (0) 558e (0)\n003 4 7b92 734e 73b8 757a | 12 7639 (0) 772e (0) 757a (0) 73b8 (0)\n004 5 6d60 6c02 6e5c 6ecb | 6 6982 (0) 6e5c (0) 6ecb (0) 6d60 (0)\n005 1 6210 | 1 6210 (0)\n006 1 645b | 1 645b (0)\n============ DEPTH: 7 ==========================================\n007 1 667e | 1 667e (0)\n008 0 | 0\n009 1 6742 | 1 6742 (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"67288f84ada7778858139c74917b22ae698ed43df49a6530a566648f074ede46","private_key":"8b748538936665f38549ca75239d192493fd5ff24f126d318b4335bae35d9d6b","name":"node_67288f84ada7778858139c74917b22ae698ed43df49a6530a566648f074ede46","services":["bzz","pss"],"enable_msg_events":true,"port":43817},"up":true}},{"node":{"info":{"id":"0bcf8a8ab0065ca8c85b8b6641f4c6e0b0de60e79ef32ebf6ff8f109ac4e1d70","name":"node_0bcf8a8ab0065ca8c85b8b6641f4c6e0b0de60e79ef32ebf6ff8f109ac4e1d70","enode":"enode://0379db849a652e76893c5565c230efe72c4d44c416b9bb323529807baef9a4843b1ba9d548fe30e116edbd1e0e376d0a9a983b35542e9d414e227b915231d22e@127.0.0.1:0","enr":"0xf88fb8403c83a4015938e95101f3db5859df1555fc2fb05d2c47650e84388bb516e27426523605a2d76c9118658082f4fb8ef3cecffb3add5ea8986a4b53a1daa0c4e4660183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1020379db849a652e76893c5565c230efe72c4d44c416b9bb323529807baef9a484","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"C8+KirAGXKjIW4tmQfTG4LDeYOee8y6/b/jxCaxOHXA=","hive":"\n=========================================================================\nThu Feb 28 17:45:49 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 0bcf8a\npopulation: 39 (127), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 8 e16b 895b 9d3c 9626 | 63 edc8 (0) ed32 (0) ebca (0) ea60 (0)\n001 10 4cd0 4b24 48b6 757a | 38 5d60 (0) 5a01 (0) 5abc (0) 5776 (0)\n002 9 372d 38ab 39db 3cb1 | 12 286a (0) 2a22 (0) 213b (0) 2434 (0)\n003 4 1be4 1929 109e 13bc | 4 1be4 (0) 1929 (0) 109e (0) 13bc (0)\n004 6 0506 018a 0390 0218 | 8 06b9 (0) 0427 (0) 0506 (0) 018a (0)\n============ DEPTH: 5 ==========================================\n005 1 0ff6 | 1 0ff6 (0)\n006 0 | 0\n007 1 0ab9 | 1 0ab9 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"0bcf8a8ab0065ca8c85b8b6641f4c6e0b0de60e79ef32ebf6ff8f109ac4e1d70","private_key":"a66755f09e07ea306f890663b424f0162339cc7ac848e7ed878743e6e0d7cd71","name":"node_0bcf8a8ab0065ca8c85b8b6641f4c6e0b0de60e79ef32ebf6ff8f109ac4e1d70","services":["bzz","pss"],"enable_msg_events":true,"port":39147},"up":true}}],"conns":[{"one":"7dc5e8d8180c1bc7ebbee11a47fc96e8fe8b2d71c30cbc4aa1cf99e8eb6afcac","other":"027fb496438782583f78fb76999336eed7fb672a9c9ea50d04df580e6eb21377","up":true},{"one":"027fb496438782583f78fb76999336eed7fb672a9c9ea50d04df580e6eb21377","other":"03907380afcd52238f3d84a8dee3df599c7f2f9b90fbc1271ee88bdb52acbd58","up":true},{"one":"03907380afcd52238f3d84a8dee3df599c7f2f9b90fbc1271ee88bdb52acbd58","other":"1929a84bcd64bf002d0afb16249466c5b660123174a1fc1bf881913f8c87d1fd","up":true},{"one":"1929a84bcd64bf002d0afb16249466c5b660123174a1fc1bf881913f8c87d1fd","other":"6ecb11fc5acc16ecd70351410fa18ec44a2a83d9e778cf25b85a7535493456b7","up":true},{"one":"6ecb11fc5acc16ecd70351410fa18ec44a2a83d9e778cf25b85a7535493456b7","other":"ad0d0dc5d4114ee4482d6c9bd4e46683327abf2b92df0d242d79019963876668","up":true},{"one":"ad0d0dc5d4114ee4482d6c9bd4e46683327abf2b92df0d242d79019963876668","other":"d0f398969480f3df3587f6d47546ff1261cad4d2e9c26ff3077e35ae1b26153e","up":true},{"one":"d0f398969480f3df3587f6d47546ff1261cad4d2e9c26ff3077e35ae1b26153e","other":"cfbb9ea682becadeab10bbd080ba8e93510085a87ac519e434964faa222fc275","up":true},{"one":"cfbb9ea682becadeab10bbd080ba8e93510085a87ac519e434964faa222fc275","other":"734e029ed25485edd49b93dd9e85b6e7657f860e4ded4bc8a5094f512ae5836b","up":true},{"one":"734e029ed25485edd49b93dd9e85b6e7657f860e4ded4bc8a5094f512ae5836b","other":"f5c4d28df5973ec0292221a875e8446323f339409d93f0f7385990126908a3c3","up":true},{"one":"f5c4d28df5973ec0292221a875e8446323f339409d93f0f7385990126908a3c3","other":"91eba9f9c8f2929d38f43a0c7efa809c0d2d59a31cbf2760c90e73d20266d528","up":true},{"one":"91eba9f9c8f2929d38f43a0c7efa809c0d2d59a31cbf2760c90e73d20266d528","other":"e16b12c708bc5e0545009daed44733c52d7450ccc797d158dd41a3bc9507b6be","up":true},{"one":"e16b12c708bc5e0545009daed44733c52d7450ccc797d158dd41a3bc9507b6be","other":"962676818c17fae1ffc52fc29318c44f9b8c980afd6d3e98217b4088d568a808","up":true},{"one":"962676818c17fae1ffc52fc29318c44f9b8c980afd6d3e98217b4088d568a808","other":"6c029114a9f73d69a42e591cf2d13107eff038d3eda8abb0242d9d6d169f05c7","up":true},{"one":"6c029114a9f73d69a42e591cf2d13107eff038d3eda8abb0242d9d6d169f05c7","other":"372d47374a57d18cf134a1f8fc2d2fc10dfacfc0be9ed883183a349c896b3793","up":true},{"one":"372d47374a57d18cf134a1f8fc2d2fc10dfacfc0be9ed883183a349c896b3793","other":"a75abd0dce5a488b7e06f91fab7a92ec428ab21bde9372c9e8fa489f48e7b3fe","up":true},{"one":"a75abd0dce5a488b7e06f91fab7a92ec428ab21bde9372c9e8fa489f48e7b3fe","other":"757a557424c33ad89efd8185ec18d71c025830ecb2aed951e33c8c8d986d5933","up":true},{"one":"757a557424c33ad89efd8185ec18d71c025830ecb2aed951e33c8c8d986d5933","other":"4b243a5aeabec6db0e4a80a9c255300cd94591a6fbe0e0aa170da4f6ce14edff","up":true},{"one":"4b243a5aeabec6db0e4a80a9c255300cd94591a6fbe0e0aa170da4f6ce14edff","other":"667ef042e9dae18694581e0404c3d87a09800e8b42173d26571c3bf97e29a372","up":true},{"one":"667ef042e9dae18694581e0404c3d87a09800e8b42173d26571c3bf97e29a372","other":"6d601952793589bc6b57340c451a6abf02ea2c16637e910eed04cde6eddfe17a","up":true},{"one":"6d601952793589bc6b57340c451a6abf02ea2c16637e910eed04cde6eddfe17a","other":"3cb1b4069727dc323a687cab4ca2764f6415450488706f1b97c5cb8ca46346ff","up":true},{"one":"3cb1b4069727dc323a687cab4ca2764f6415450488706f1b97c5cb8ca46346ff","other":"b92a71a4fc371e0596538a7fb2a33e85329c39c4409c99798d9318bc263a04a1","up":true},{"one":"b92a71a4fc371e0596538a7fb2a33e85329c39c4409c99798d9318bc263a04a1","other":"2a22dbee71a0ef27c840221db4a592d6dc8f171afed865ff814a37d633a3eaa9","up":true},{"one":"2a22dbee71a0ef27c840221db4a592d6dc8f171afed865ff814a37d633a3eaa9","other":"c3a1b301bf187fd8326831197d93a0266ac0cc8287b9008631240e2bec9cf337","up":true},{"one":"c3a1b301bf187fd8326831197d93a0266ac0cc8287b9008631240e2bec9cf337","other":"e55d8cdb7e7940b11929e7e5c949ef6beb7998e5180a1f0a3c0bf61aef39f1b8","up":true},{"one":"e55d8cdb7e7940b11929e7e5c949ef6beb7998e5180a1f0a3c0bf61aef39f1b8","other":"895bdcd200cc4d7ec5c24f1722d0a8ebedda78b78cdf1ccc8c22a981980f5786","up":true},{"one":"895bdcd200cc4d7ec5c24f1722d0a8ebedda78b78cdf1ccc8c22a981980f5786","other":"a2babe49410ae007bc41ff2b7deaf709ed849e2f69666ce5aae76a3b71f47081","up":true},{"one":"a2babe49410ae007bc41ff2b7deaf709ed849e2f69666ce5aae76a3b71f47081","other":"8cf957bf95a629c60c31dbcfe75ecca149a81c761f8b34858b04f8318e5c74bd","up":true},{"one":"8cf957bf95a629c60c31dbcfe75ecca149a81c761f8b34858b04f8318e5c74bd","other":"9e02c5384602a54e900cfa46d5987b77f16e74cba745ac850fcada01c7af9004","up":true},{"one":"9e02c5384602a54e900cfa46d5987b77f16e74cba745ac850fcada01c7af9004","other":"539df902d42dc997c6b0e24d16ad68b54c557d56b41c972a320d57632dbfbe3c","up":true},{"one":"539df902d42dc997c6b0e24d16ad68b54c557d56b41c972a320d57632dbfbe3c","other":"38ab3d7bdfb293b88122404cb7c50b5fb890ce7664c075da95585557a430c403","up":true},{"one":"38ab3d7bdfb293b88122404cb7c50b5fb890ce7664c075da95585557a430c403","other":"b70e96f01ac8947d2de6320412ae3310316caba65c27108ad16b2f2004255be4","up":true},{"one":"b70e96f01ac8947d2de6320412ae3310316caba65c27108ad16b2f2004255be4","other":"6e5c213a2db57eaf2e1e1acc341c72efab89b0e42b6cd18db4f99ac1af151d65","up":true},{"one":"6e5c213a2db57eaf2e1e1acc341c72efab89b0e42b6cd18db4f99ac1af151d65","other":"772e4c80d128deb52adf024a0eb6fe9bbea1c83351ed93f55f490cd5e5c69260","up":true},{"one":"772e4c80d128deb52adf024a0eb6fe9bbea1c83351ed93f55f490cd5e5c69260","other":"0ab9845c2890b0a64a3e5932241245e00b817b788094f9ee48f86f80b7264fea","up":true},{"one":"0ab9845c2890b0a64a3e5932241245e00b817b788094f9ee48f86f80b7264fea","other":"39dbd5462c90dac75f49d9af7996845943bbe929754ef8125eee7f5a763e9def","up":true},{"one":"39dbd5462c90dac75f49d9af7996845943bbe929754ef8125eee7f5a763e9def","other":"d6ffb7fd2668e9b7b133bd9144156f4736191ef0d6e72b072759782d83931f22","up":true},{"one":"d6ffb7fd2668e9b7b133bd9144156f4736191ef0d6e72b072759782d83931f22","other":"e0b1c4eb5b5b4dfc22344ee65cb9716cecb38dcc80099793f20641884eae4854","up":true},{"one":"e0b1c4eb5b5b4dfc22344ee65cb9716cecb38dcc80099793f20641884eae4854","other":"5abc96f4fa78812db6fb710fd424dd474145f7e5d00b4cedc5373b4c52f42cf5","up":true},{"one":"5abc96f4fa78812db6fb710fd424dd474145f7e5d00b4cedc5373b4c52f42cf5","other":"89c883d6a85472bda328667e3fd805c70876bc582ca6763ab97ae636b1772be4","up":true},{"one":"89c883d6a85472bda328667e3fd805c70876bc582ca6763ab97ae636b1772be4","other":"dc97c1a0019b482a048b8d15941dfe4c3c1a3443d9b2d7b4046370bc84a7e56f","up":true},{"one":"dc97c1a0019b482a048b8d15941dfe4c3c1a3443d9b2d7b4046370bc84a7e56f","other":"e0ea575d0e2efa28bc51f49d1e2c24196a196da3b3196f3a5a26a5e310809af5","up":true},{"one":"e0ea575d0e2efa28bc51f49d1e2c24196a196da3b3196f3a5a26a5e310809af5","other":"021811a6757bdcdd2fa0fb68401dfe009d5a8e129958cd304fb42cf51dc5d1d3","up":true},{"one":"021811a6757bdcdd2fa0fb68401dfe009d5a8e129958cd304fb42cf51dc5d1d3","other":"109ef17c890104bfc5a4897d526a0afaa8c991c9d213616032f3058d0feb7f00","up":true},{"one":"109ef17c890104bfc5a4897d526a0afaa8c991c9d213616032f3058d0feb7f00","other":"ed32d74d9be0649de1eb26b9915137fe46ec890c656c96be52e966ab6e2ed260","up":true},{"one":"ed32d74d9be0649de1eb26b9915137fe46ec890c656c96be52e966ab6e2ed260","other":"8b76194f129308324c7d0066530e02cac2410ee0ba952822f0ec866e12461e44","up":true},{"one":"8b76194f129308324c7d0066530e02cac2410ee0ba952822f0ec866e12461e44","other":"f74ecde0bbaa7b6521fb205b5ab9ea637909277f6e1ee1d3490f5cd01d0f7216","up":true},{"one":"f74ecde0bbaa7b6521fb205b5ab9ea637909277f6e1ee1d3490f5cd01d0f7216","other":"a3205c1c4f9b72814f0db68e888e3c7ef88f27c681ed0d731dde5f0999f92ccc","up":true},{"one":"a3205c1c4f9b72814f0db68e888e3c7ef88f27c681ed0d731dde5f0999f92ccc","other":"ea0e1dd41fe042b09f273c98f02128949cf5561d20dc04b3d423961efed52327","up":true},{"one":"ea0e1dd41fe042b09f273c98f02128949cf5561d20dc04b3d423961efed52327","other":"2434c63e7f28b83e7feede7fe68ea99b989f8534f64d63b046733e2f474538f5","up":true},{"one":"2434c63e7f28b83e7feede7fe68ea99b989f8534f64d63b046733e2f474538f5","other":"4a1811dd9febde1801a604ad81de84a2d15366d0b5c330f30f3398da0d107824","up":true},{"one":"4a1811dd9febde1801a604ad81de84a2d15366d0b5c330f30f3398da0d107824","other":"026d2e41b82d506da685a30cce7cc5772f6c1e167b7d557e0531fb9b79dd4ff2","up":true},{"one":"026d2e41b82d506da685a30cce7cc5772f6c1e167b7d557e0531fb9b79dd4ff2","other":"dfaeebc8e29c6a8f851b12b80cf42567cd2a43e35d977305a3c10e51bf41170a","up":true},{"one":"dfaeebc8e29c6a8f851b12b80cf42567cd2a43e35d977305a3c10e51bf41170a","other":"558eb021744be19383be9ac91b9f77e07479e0eb25576bd32a3afaa94c231178","up":true},{"one":"558eb021744be19383be9ac91b9f77e07479e0eb25576bd32a3afaa94c231178","other":"ae67fae4990da61ca89221c5b1675c992babb4d715b59939e47bd1491b3bf1f4","up":true},{"one":"ae67fae4990da61ca89221c5b1675c992babb4d715b59939e47bd1491b3bf1f4","other":"f36120ff250b9e7164e96021479332054f67de65cd2fe5b6e34bc51d0fe4d29c","up":true},{"one":"f36120ff250b9e7164e96021479332054f67de65cd2fe5b6e34bc51d0fe4d29c","other":"0506e949748b62da1d36b663df7d6a7e76027f72ced5d52f74677fb31d7e1505","up":true},{"one":"0506e949748b62da1d36b663df7d6a7e76027f72ced5d52f74677fb31d7e1505","other":"cdcd165721f6851f361fad0b3ba88c8870be9ad6d6b8cbcecc7c89e1068d979a","up":true},{"one":"cdcd165721f6851f361fad0b3ba88c8870be9ad6d6b8cbcecc7c89e1068d979a","other":"645b4e6b36fc1928725f627aeed278f46c5a7d6b0fff7ccff55a0468d47b23e8","up":true},{"one":"645b4e6b36fc1928725f627aeed278f46c5a7d6b0fff7ccff55a0468d47b23e8","other":"213bf6e78e02a57585908c756f0965297152c3c400a0ed4c407a411e1ec5942d","up":true},{"one":"213bf6e78e02a57585908c756f0965297152c3c400a0ed4c407a411e1ec5942d","other":"018adc613f78d6ec876274f821251fd049eb3651646cd69e27efe211fe88d936","up":true},{"one":"018adc613f78d6ec876274f821251fd049eb3651646cd69e27efe211fe88d936","other":"edc8794153fb517085d27a83a4b00e8c3b37f22d2242b842cb2fab66764de9fe","up":true},{"one":"edc8794153fb517085d27a83a4b00e8c3b37f22d2242b842cb2fab66764de9fe","other":"5a01993ff7b4bd12fdb259e96b26a036d0cf5d4ae9c9b516be64b63acec2443a","up":true},{"one":"5a01993ff7b4bd12fdb259e96b26a036d0cf5d4ae9c9b516be64b63acec2443a","other":"b8e1a80d91216fd5f8bc3f7413caf68ade7f124354d44fe7bd155a089134a70a","up":true},{"one":"b8e1a80d91216fd5f8bc3f7413caf68ade7f124354d44fe7bd155a089134a70a","other":"b486ce31ce880db3aaa17a0ac2c2f3554b6fe71f9c051edb572974342af4adb9","up":true},{"one":"b486ce31ce880db3aaa17a0ac2c2f3554b6fe71f9c051edb572974342af4adb9","other":"1be4348ec5670cdc4f164d77b1356e7910b6d1be4a9b720e549d02e5482a9e78","up":true},{"one":"1be4348ec5670cdc4f164d77b1356e7910b6d1be4a9b720e549d02e5482a9e78","other":"517aa977048247d5d16ad51a286ffac4d8f910733f0578b222201308c32d195e","up":true},{"one":"517aa977048247d5d16ad51a286ffac4d8f910733f0578b222201308c32d195e","other":"5d608e66a17442091111cb472723fe3aea1f2baecaa546b57d49507c63a61cda","up":true},{"one":"5d608e66a17442091111cb472723fe3aea1f2baecaa546b57d49507c63a61cda","other":"83dc556ed36f37d06765be2554fe86eaf1ec21e2931fb22403238453bf021dfb","up":true},{"one":"83dc556ed36f37d06765be2554fe86eaf1ec21e2931fb22403238453bf021dfb","other":"db088103f3b6f2c784d76ecd99c8b4a77fd39bb39c72ddfd91c99c1a9dd3b75b","up":true},{"one":"db088103f3b6f2c784d76ecd99c8b4a77fd39bb39c72ddfd91c99c1a9dd3b75b","other":"c18105aa302a43e352d999745a0f806af9f8cb8bb83349357da5c85e8975acd1","up":true},{"one":"c18105aa302a43e352d999745a0f806af9f8cb8bb83349357da5c85e8975acd1","other":"a7a61804d270ed6c27a4b1e8a634c30d7cdbaf644a1c67cbc6b08cd849a711db","up":true},{"one":"a7a61804d270ed6c27a4b1e8a634c30d7cdbaf644a1c67cbc6b08cd849a711db","other":"b16dcdf1ff1a56d49e374531d9885d59c1bcfbb628604520d9b1d84662edb9ca","up":true},{"one":"b16dcdf1ff1a56d49e374531d9885d59c1bcfbb628604520d9b1d84662edb9ca","other":"ea60ef7cb3f2166a5c8e286c885984943a2ea5aff4730015be6a15031040cecf","up":true},{"one":"ea60ef7cb3f2166a5c8e286c885984943a2ea5aff4730015be6a15031040cecf","other":"57764522162620c1ad0b166a9c43772255d0cc01e49f2122ef09db046804a570","up":true},{"one":"57764522162620c1ad0b166a9c43772255d0cc01e49f2122ef09db046804a570","other":"e77f6aa9e3dfcce0a2e5db794703224249aba60595075b2df9a5b0b30855cf46","up":true},{"one":"e77f6aa9e3dfcce0a2e5db794703224249aba60595075b2df9a5b0b30855cf46","other":"cec3c01c147b34f25104ddd0b25076cef63ac224eada9d9f5a00b8513331354f","up":true},{"one":"cec3c01c147b34f25104ddd0b25076cef63ac224eada9d9f5a00b8513331354f","other":"6c82fdabd09e0e9d0fc507613a05951c02b2953d763a062a5f32aaf5cc477c19","up":true},{"one":"6c82fdabd09e0e9d0fc507613a05951c02b2953d763a062a5f32aaf5cc477c19","other":"c8e5a1b4533dd0de12acee4d31369f39785178568718b93bbc321ec83e0714f0","up":true},{"one":"c8e5a1b4533dd0de12acee4d31369f39785178568718b93bbc321ec83e0714f0","other":"ce99e9d37111c52e929b187fe201790b1a555dfb8b6b6de54e94df7cc2d43fd4","up":true},{"one":"ce99e9d37111c52e929b187fe201790b1a555dfb8b6b6de54e94df7cc2d43fd4","other":"042788d5b72cb84a375565d120d239a2b14fdf38b3f5f992284d78535077148a","up":true},{"one":"042788d5b72cb84a375565d120d239a2b14fdf38b3f5f992284d78535077148a","other":"41b9ee7ad19698e97589b059ad3333cb64f02c16006d94fb3d0bad7ced8ff238","up":true},{"one":"41b9ee7ad19698e97589b059ad3333cb64f02c16006d94fb3d0bad7ced8ff238","other":"78cbc19a24d095ab7858849058c65c061c52289b91ddd92cee34bed98aee4a59","up":true},{"one":"78cbc19a24d095ab7858849058c65c061c52289b91ddd92cee34bed98aee4a59","other":"7f87da7ee55b4c8c8f9d55411ff88d3a0b63bfee6a516917d49fa6273fb5b86a","up":true},{"one":"7f87da7ee55b4c8c8f9d55411ff88d3a0b63bfee6a516917d49fa6273fb5b86a","other":"47c3e0dfbbfcebeece78865c8c989577360cd9cc46a3b43f4b7b01ed14dc30e6","up":true},{"one":"47c3e0dfbbfcebeece78865c8c989577360cd9cc46a3b43f4b7b01ed14dc30e6","other":"06b95f1bac76ca4925d509b06216f2113ac5dcf051ef5aa0a320ae64069e0b6d","up":true},{"one":"06b95f1bac76ca4925d509b06216f2113ac5dcf051ef5aa0a320ae64069e0b6d","other":"0ff67b0e9ec6509c7786495b7b3ddb176b4f8221ff300f409f00a3d389e8874c","up":true},{"one":"0ff67b0e9ec6509c7786495b7b3ddb176b4f8221ff300f409f00a3d389e8874c","other":"ca036d1ef9e6ce3654f2d769f16926aa14957193586426489e15539dfa8f7763","up":true},{"one":"ca036d1ef9e6ce3654f2d769f16926aa14957193586426489e15539dfa8f7763","other":"7639f9a66e8ff70f554c346faa25f78140957c295b748fc42a12df7972f4fcc6","up":true},{"one":"7639f9a66e8ff70f554c346faa25f78140957c295b748fc42a12df7972f4fcc6","other":"f36084048bf0ff985a77f5183796f7b37b7085ee6eea8bbc5fc62558854cce67","up":true},{"one":"f36084048bf0ff985a77f5183796f7b37b7085ee6eea8bbc5fc62558854cce67","other":"419a6626dd026c0438461592121992c6be1868375011655b6d405166cd8edf7f","up":true},{"one":"419a6626dd026c0438461592121992c6be1868375011655b6d405166cd8edf7f","other":"9ee7b3e06b453615cbd8737cb74515b150f518f1a2eaa2db90e54708dd161b7d","up":true},{"one":"9ee7b3e06b453615cbd8737cb74515b150f518f1a2eaa2db90e54708dd161b7d","other":"286aeba646bba4a8aa1c372bee9f2c9ff0a2b3abb4f18be321225555c6dce4e5","up":true},{"one":"286aeba646bba4a8aa1c372bee9f2c9ff0a2b3abb4f18be321225555c6dce4e5","other":"621076ce6b82e70c90a4adf235aa6f71b116e302dd6b15dcae07f4a816012455","up":true},{"one":"621076ce6b82e70c90a4adf235aa6f71b116e302dd6b15dcae07f4a816012455","other":"ebca518e5146f49ac75bcaa8add2ef4d1d22c5cfd2e2326c6b41826d45ce55ae","up":true},{"one":"ebca518e5146f49ac75bcaa8add2ef4d1d22c5cfd2e2326c6b41826d45ce55ae","other":"cbc5d42951bc6e187296b5f8ce4d04e472e26670a62851f39d65f31c50865f6a","up":true},{"one":"cbc5d42951bc6e187296b5f8ce4d04e472e26670a62851f39d65f31c50865f6a","other":"7cf4838a7c83a736ce59cfa1b974674a0185dbe17a8f3cd29794a3bbe814adee","up":true},{"one":"7cf4838a7c83a736ce59cfa1b974674a0185dbe17a8f3cd29794a3bbe814adee","other":"7fbc1843e2222e3c8e35a3215d1bbb4d5457d8b9ed33749e07e22f25ba9ee576","up":true},{"one":"7fbc1843e2222e3c8e35a3215d1bbb4d5457d8b9ed33749e07e22f25ba9ee576","other":"86ca1078dae40f23ae1b3ac47397460d9ec0bf243a0de372b405381d6722fcb2","up":true},{"one":"86ca1078dae40f23ae1b3ac47397460d9ec0bf243a0de372b405381d6722fcb2","other":"4167946de250b013e1be16ee84bfe2ccaae83e699e618b38f31016c4e431e6ba","up":true},{"one":"4167946de250b013e1be16ee84bfe2ccaae83e699e618b38f31016c4e431e6ba","other":"f410d4ac9b748c24fa0d48c3053bb1cea8a67d0bcc4e5fcbdb261c0c7522cc34","up":true},{"one":"f410d4ac9b748c24fa0d48c3053bb1cea8a67d0bcc4e5fcbdb261c0c7522cc34","other":"92a1501ed41e29bb7dd8eb4b4acecae983f4c7c83f39895cd68f7810b645f1dd","up":true},{"one":"92a1501ed41e29bb7dd8eb4b4acecae983f4c7c83f39895cd68f7810b645f1dd","other":"b8411f198fd658c5a2028835c0af3342145839c06c8a4f382d9f9de485d46c08","up":true},{"one":"b8411f198fd658c5a2028835c0af3342145839c06c8a4f382d9f9de485d46c08","other":"8be461203f5ebb5721348f537b37d768f7bd359af3e18d1f7e9af2f901c49845","up":true},{"one":"8be461203f5ebb5721348f537b37d768f7bd359af3e18d1f7e9af2f901c49845","other":"aebd6135d10252b07f891b3a7330903faf13d409c4f7108630715fa0754f938e","up":true},{"one":"aebd6135d10252b07f891b3a7330903faf13d409c4f7108630715fa0754f938e","other":"4cd0f38e52a508f81cf95e1370c994aea2d7a49a2a08e3e054f53629a6619410","up":true},{"one":"4cd0f38e52a508f81cf95e1370c994aea2d7a49a2a08e3e054f53629a6619410","other":"2459fe9250b3311c86530d00b7a9b8ba57b1b5151c126262e70c55d1e8d37924","up":true},{"one":"2459fe9250b3311c86530d00b7a9b8ba57b1b5151c126262e70c55d1e8d37924","other":"698247d103a8925d8bb4c56a3056e49c5efc595fced1c89d49943bb9ba01f394","up":true},{"one":"698247d103a8925d8bb4c56a3056e49c5efc595fced1c89d49943bb9ba01f394","other":"6742cca1b7783fcbed8d0b340508f93cc4dfaca8ff3f13fd59354486c4d62993","up":true},{"one":"6742cca1b7783fcbed8d0b340508f93cc4dfaca8ff3f13fd59354486c4d62993","other":"82f034db88fd26b47c26b95c3f87a1f454ffe4526ae86beb2bb1d8f2c218c25c","up":true},{"one":"82f034db88fd26b47c26b95c3f87a1f454ffe4526ae86beb2bb1d8f2c218c25c","other":"b2b9ac0f4db58886597af7b19d6150498ac8ad7c804671628aa34384b8fe505e","up":true},{"one":"b2b9ac0f4db58886597af7b19d6150498ac8ad7c804671628aa34384b8fe505e","other":"3e56d4533ec14f6656e1eb25fb35dad47c9db479f667a6b6fe9a3aa8c12e982e","up":true},{"one":"3e56d4533ec14f6656e1eb25fb35dad47c9db479f667a6b6fe9a3aa8c12e982e","other":"7b9242137f8cc2bec7b3e0003fd93026921ceb10dfadbbd5b6aa64d61a74f35e","up":true},{"one":"7b9242137f8cc2bec7b3e0003fd93026921ceb10dfadbbd5b6aa64d61a74f35e","other":"73b8d1840d0a8ffe69752ec96f8fddecb0e22726c87982d572ca9acc1c9cdbfc","up":true},{"one":"73b8d1840d0a8ffe69752ec96f8fddecb0e22726c87982d572ca9acc1c9cdbfc","other":"d2245f0679b436faabc0164e0b85e02e2effbad306e8229b555524a5e6d1a5f9","up":true},{"one":"d2245f0679b436faabc0164e0b85e02e2effbad306e8229b555524a5e6d1a5f9","other":"b381e75e52e4cdd168056245f82d3a1747b67f400eb40eb12036b73ee7fe21e5","up":true},{"one":"b381e75e52e4cdd168056245f82d3a1747b67f400eb40eb12036b73ee7fe21e5","other":"957d8a9b412b6f4cd151cbc07b8d74d949880ae665c545debb18181389c99ee6","up":true},{"one":"957d8a9b412b6f4cd151cbc07b8d74d949880ae665c545debb18181389c99ee6","other":"26d1af1fbee6541a363ea7707825e37da028142f00779116560ad20f1de18e7b","up":true},{"one":"26d1af1fbee6541a363ea7707825e37da028142f00779116560ad20f1de18e7b","other":"3ee4b20c047e701b58c06fcc8160364bd29573f61f4d9f1935d77ac29f6a1e86","up":true},{"one":"3ee4b20c047e701b58c06fcc8160364bd29573f61f4d9f1935d77ac29f6a1e86","other":"13bc64535d3ae495098e4ac6b30a91d1804dab0ab79944f2c6ac53c9bccdf62d","up":true},{"one":"13bc64535d3ae495098e4ac6b30a91d1804dab0ab79944f2c6ac53c9bccdf62d","other":"9a9230b3f7f386520821dee78ebe92e8c64a4f6a50f2639327c62e45cab40563","up":true},{"one":"9a9230b3f7f386520821dee78ebe92e8c64a4f6a50f2639327c62e45cab40563","other":"9d3c79e4a0ac4e5b95aa32545f3b8d86f74594faa237d5c2566cf02fbd60b11a","up":true},{"one":"9d3c79e4a0ac4e5b95aa32545f3b8d86f74594faa237d5c2566cf02fbd60b11a","other":"a085045c335ce2e47dbdfeb1adb62ce6c3bed36a93cf3448c45757a1a88e295d","up":true},{"one":"a085045c335ce2e47dbdfeb1adb62ce6c3bed36a93cf3448c45757a1a88e295d","other":"7355fab10584e4312f5cb5c3c826e7f9c14da74d62d07d0a8007ce9c6e995be9","up":true},{"one":"7355fab10584e4312f5cb5c3c826e7f9c14da74d62d07d0a8007ce9c6e995be9","other":"48b614958a8692780ef5bd5c95e0db4ff67deb4de0dcbb878ca4479bfb86957e","up":true},{"one":"48b614958a8692780ef5bd5c95e0db4ff67deb4de0dcbb878ca4479bfb86957e","other":"afa3de5cebc9f96cf20a35058f4856fe43b48ac59cf8e46565f194f438622a52","up":true},{"one":"afa3de5cebc9f96cf20a35058f4856fe43b48ac59cf8e46565f194f438622a52","other":"67288f84ada7778858139c74917b22ae698ed43df49a6530a566648f074ede46","up":true},{"one":"67288f84ada7778858139c74917b22ae698ed43df49a6530a566648f074ede46","other":"0bcf8a8ab0065ca8c85b8b6641f4c6e0b0de60e79ef32ebf6ff8f109ac4e1d70","up":true},{"one":"0bcf8a8ab0065ca8c85b8b6641f4c6e0b0de60e79ef32ebf6ff8f109ac4e1d70","other":"7dc5e8d8180c1bc7ebbee11a47fc96e8fe8b2d71c30cbc4aa1cf99e8eb6afcac","up":true},{"one":"6ecb11fc5acc16ecd70351410fa18ec44a2a83d9e778cf25b85a7535493456b7","other":"03907380afcd52238f3d84a8dee3df599c7f2f9b90fbc1271ee88bdb52acbd58","up":true},{"one":"027fb496438782583f78fb76999336eed7fb672a9c9ea50d04df580e6eb21377","other":"1929a84bcd64bf002d0afb16249466c5b660123174a1fc1bf881913f8c87d1fd","up":true},{"one":"f5c4d28df5973ec0292221a875e8446323f339409d93f0f7385990126908a3c3","other":"e16b12c708bc5e0545009daed44733c52d7450ccc797d158dd41a3bc9507b6be","up":true},{"one":"d0f398969480f3df3587f6d47546ff1261cad4d2e9c26ff3077e35ae1b26153e","other":"734e029ed25485edd49b93dd9e85b6e7657f860e4ded4bc8a5094f512ae5836b","up":true},{"one":"cfbb9ea682becadeab10bbd080ba8e93510085a87ac519e434964faa222fc275","other":"ad0d0dc5d4114ee4482d6c9bd4e46683327abf2b92df0d242d79019963876668","up":true},{"one":"7cf4838a7c83a736ce59cfa1b974674a0185dbe17a8f3cd29794a3bbe814adee","other":"ebca518e5146f49ac75bcaa8add2ef4d1d22c5cfd2e2326c6b41826d45ce55ae","up":true},{"one":"82f034db88fd26b47c26b95c3f87a1f454ffe4526ae86beb2bb1d8f2c218c25c","other":"698247d103a8925d8bb4c56a3056e49c5efc595fced1c89d49943bb9ba01f394","up":true},{"one":"3e56d4533ec14f6656e1eb25fb35dad47c9db479f667a6b6fe9a3aa8c12e982e","other":"d2245f0679b436faabc0164e0b85e02e2effbad306e8229b555524a5e6d1a5f9","up":true},{"one":"7b9242137f8cc2bec7b3e0003fd93026921ceb10dfadbbd5b6aa64d61a74f35e","other":"d2245f0679b436faabc0164e0b85e02e2effbad306e8229b555524a5e6d1a5f9","up":true},{"one":"957d8a9b412b6f4cd151cbc07b8d74d949880ae665c545debb18181389c99ee6","other":"d2245f0679b436faabc0164e0b85e02e2effbad306e8229b555524a5e6d1a5f9","up":true},{"one":"7355fab10584e4312f5cb5c3c826e7f9c14da74d62d07d0a8007ce9c6e995be9","other":"9a9230b3f7f386520821dee78ebe92e8c64a4f6a50f2639327c62e45cab40563","up":true},{"one":"afa3de5cebc9f96cf20a35058f4856fe43b48ac59cf8e46565f194f438622a52","other":"0bcf8a8ab0065ca8c85b8b6641f4c6e0b0de60e79ef32ebf6ff8f109ac4e1d70","up":true},{"one":"48b614958a8692780ef5bd5c95e0db4ff67deb4de0dcbb878ca4479bfb86957e","other":"0bcf8a8ab0065ca8c85b8b6641f4c6e0b0de60e79ef32ebf6ff8f109ac4e1d70","up":true},{"one":"a085045c335ce2e47dbdfeb1adb62ce6c3bed36a93cf3448c45757a1a88e295d","other":"afa3de5cebc9f96cf20a35058f4856fe43b48ac59cf8e46565f194f438622a52","up":true},{"one":"67288f84ada7778858139c74917b22ae698ed43df49a6530a566648f074ede46","other":"48b614958a8692780ef5bd5c95e0db4ff67deb4de0dcbb878ca4479bfb86957e","up":true},{"one":"0bcf8a8ab0065ca8c85b8b6641f4c6e0b0de60e79ef32ebf6ff8f109ac4e1d70","other":"ad0d0dc5d4114ee4482d6c9bd4e46683327abf2b92df0d242d79019963876668","up":true},{"one":"9d3c79e4a0ac4e5b95aa32545f3b8d86f74594faa237d5c2566cf02fbd60b11a","other":"26d1af1fbee6541a363ea7707825e37da028142f00779116560ad20f1de18e7b","up":true},{"one":"ad0d0dc5d4114ee4482d6c9bd4e46683327abf2b92df0d242d79019963876668","other":"962676818c17fae1ffc52fc29318c44f9b8c980afd6d3e98217b4088d568a808","up":true},{"one":"d0f398969480f3df3587f6d47546ff1261cad4d2e9c26ff3077e35ae1b26153e","other":"f5c4d28df5973ec0292221a875e8446323f339409d93f0f7385990126908a3c3","up":true},{"one":"03907380afcd52238f3d84a8dee3df599c7f2f9b90fbc1271ee88bdb52acbd58","other":"f5c4d28df5973ec0292221a875e8446323f339409d93f0f7385990126908a3c3","up":true},{"one":"962676818c17fae1ffc52fc29318c44f9b8c980afd6d3e98217b4088d568a808","other":"b92a71a4fc371e0596538a7fb2a33e85329c39c4409c99798d9318bc263a04a1","up":true},{"one":"7dc5e8d8180c1bc7ebbee11a47fc96e8fe8b2d71c30cbc4aa1cf99e8eb6afcac","other":"f5c4d28df5973ec0292221a875e8446323f339409d93f0f7385990126908a3c3","up":true},{"one":"cfbb9ea682becadeab10bbd080ba8e93510085a87ac519e434964faa222fc275","other":"f5c4d28df5973ec0292221a875e8446323f339409d93f0f7385990126908a3c3","up":true},{"one":"372d47374a57d18cf134a1f8fc2d2fc10dfacfc0be9ed883183a349c896b3793","other":"1929a84bcd64bf002d0afb16249466c5b660123174a1fc1bf881913f8c87d1fd","up":true},{"one":"6c029114a9f73d69a42e591cf2d13107eff038d3eda8abb0242d9d6d169f05c7","other":"4b243a5aeabec6db0e4a80a9c255300cd94591a6fbe0e0aa170da4f6ce14edff","up":true},{"one":"6ecb11fc5acc16ecd70351410fa18ec44a2a83d9e778cf25b85a7535493456b7","other":"48b614958a8692780ef5bd5c95e0db4ff67deb4de0dcbb878ca4479bfb86957e","up":true},{"one":"e16b12c708bc5e0545009daed44733c52d7450ccc797d158dd41a3bc9507b6be","other":"027fb496438782583f78fb76999336eed7fb672a9c9ea50d04df580e6eb21377","up":true},{"one":"1929a84bcd64bf002d0afb16249466c5b660123174a1fc1bf881913f8c87d1fd","other":"f5c4d28df5973ec0292221a875e8446323f339409d93f0f7385990126908a3c3","up":true},{"one":"667ef042e9dae18694581e0404c3d87a09800e8b42173d26571c3bf97e29a372","other":"c3a1b301bf187fd8326831197d93a0266ac0cc8287b9008631240e2bec9cf337","up":true},{"one":"027fb496438782583f78fb76999336eed7fb672a9c9ea50d04df580e6eb21377","other":"f5c4d28df5973ec0292221a875e8446323f339409d93f0f7385990126908a3c3","up":true},{"one":"6d601952793589bc6b57340c451a6abf02ea2c16637e910eed04cde6eddfe17a","other":"c3a1b301bf187fd8326831197d93a0266ac0cc8287b9008631240e2bec9cf337","up":true},{"one":"734e029ed25485edd49b93dd9e85b6e7657f860e4ded4bc8a5094f512ae5836b","other":"0bcf8a8ab0065ca8c85b8b6641f4c6e0b0de60e79ef32ebf6ff8f109ac4e1d70","up":true},{"one":"9e02c5384602a54e900cfa46d5987b77f16e74cba745ac850fcada01c7af9004","other":"d6ffb7fd2668e9b7b133bd9144156f4736191ef0d6e72b072759782d83931f22","up":true},{"one":"0bcf8a8ab0065ca8c85b8b6641f4c6e0b0de60e79ef32ebf6ff8f109ac4e1d70","other":"91eba9f9c8f2929d38f43a0c7efa809c0d2d59a31cbf2760c90e73d20266d528","up":true},{"one":"3cb1b4069727dc323a687cab4ca2764f6415450488706f1b97c5cb8ca46346ff","other":"2a22dbee71a0ef27c840221db4a592d6dc8f171afed865ff814a37d633a3eaa9","up":true},{"one":"f74ecde0bbaa7b6521fb205b5ab9ea637909277f6e1ee1d3490f5cd01d0f7216","other":"558eb021744be19383be9ac91b9f77e07479e0eb25576bd32a3afaa94c231178","up":true},{"one":"a75abd0dce5a488b7e06f91fab7a92ec428ab21bde9372c9e8fa489f48e7b3fe","other":"d0f398969480f3df3587f6d47546ff1261cad4d2e9c26ff3077e35ae1b26153e","up":true},{"one":"757a557424c33ad89efd8185ec18d71c025830ecb2aed951e33c8c8d986d5933","other":"1929a84bcd64bf002d0afb16249466c5b660123174a1fc1bf881913f8c87d1fd","up":true},{"one":"c3a1b301bf187fd8326831197d93a0266ac0cc8287b9008631240e2bec9cf337","other":"9e02c5384602a54e900cfa46d5987b77f16e74cba745ac850fcada01c7af9004","up":true},{"one":"539df902d42dc997c6b0e24d16ad68b54c557d56b41c972a320d57632dbfbe3c","other":"772e4c80d128deb52adf024a0eb6fe9bbea1c83351ed93f55f490cd5e5c69260","up":true},{"one":"a2babe49410ae007bc41ff2b7deaf709ed849e2f69666ce5aae76a3b71f47081","other":"3cb1b4069727dc323a687cab4ca2764f6415450488706f1b97c5cb8ca46346ff","up":true},{"one":"b486ce31ce880db3aaa17a0ac2c2f3554b6fe71f9c051edb572974342af4adb9","other":"c18105aa302a43e352d999745a0f806af9f8cb8bb83349357da5c85e8975acd1","up":true},{"one":"8cf957bf95a629c60c31dbcfe75ecca149a81c761f8b34858b04f8318e5c74bd","other":"3cb1b4069727dc323a687cab4ca2764f6415450488706f1b97c5cb8ca46346ff","up":true},{"one":"5abc96f4fa78812db6fb710fd424dd474145f7e5d00b4cedc5373b4c52f42cf5","other":"38ab3d7bdfb293b88122404cb7c50b5fb890ce7664c075da95585557a430c403","up":true},{"one":"2a22dbee71a0ef27c840221db4a592d6dc8f171afed865ff814a37d633a3eaa9","other":"539df902d42dc997c6b0e24d16ad68b54c557d56b41c972a320d57632dbfbe3c","up":true},{"one":"89c883d6a85472bda328667e3fd805c70876bc582ca6763ab97ae636b1772be4","other":"b70e96f01ac8947d2de6320412ae3310316caba65c27108ad16b2f2004255be4","up":true},{"one":"b8e1a80d91216fd5f8bc3f7413caf68ade7f124354d44fe7bd155a089134a70a","other":"c18105aa302a43e352d999745a0f806af9f8cb8bb83349357da5c85e8975acd1","up":true},{"one":"4b243a5aeabec6db0e4a80a9c255300cd94591a6fbe0e0aa170da4f6ce14edff","other":"cfbb9ea682becadeab10bbd080ba8e93510085a87ac519e434964faa222fc275","up":true},{"one":"cec3c01c147b34f25104ddd0b25076cef63ac224eada9d9f5a00b8513331354f","other":"9ee7b3e06b453615cbd8737cb74515b150f518f1a2eaa2db90e54708dd161b7d","up":true},{"one":"c8e5a1b4533dd0de12acee4d31369f39785178568718b93bbc321ec83e0714f0","other":"9ee7b3e06b453615cbd8737cb74515b150f518f1a2eaa2db90e54708dd161b7d","up":true},{"one":"772e4c80d128deb52adf024a0eb6fe9bbea1c83351ed93f55f490cd5e5c69260","other":"ed32d74d9be0649de1eb26b9915137fe46ec890c656c96be52e966ab6e2ed260","up":true},{"one":"e0ea575d0e2efa28bc51f49d1e2c24196a196da3b3196f3a5a26a5e310809af5","other":"ae67fae4990da61ca89221c5b1675c992babb4d715b59939e47bd1491b3bf1f4","up":true},{"one":"38ab3d7bdfb293b88122404cb7c50b5fb890ce7664c075da95585557a430c403","other":"3cb1b4069727dc323a687cab4ca2764f6415450488706f1b97c5cb8ca46346ff","up":true},{"one":"0ab9845c2890b0a64a3e5932241245e00b817b788094f9ee48f86f80b7264fea","other":"8cf957bf95a629c60c31dbcfe75ecca149a81c761f8b34858b04f8318e5c74bd","up":true},{"one":"b70e96f01ac8947d2de6320412ae3310316caba65c27108ad16b2f2004255be4","other":"e0ea575d0e2efa28bc51f49d1e2c24196a196da3b3196f3a5a26a5e310809af5","up":true},{"one":"edc8794153fb517085d27a83a4b00e8c3b37f22d2242b842cb2fab66764de9fe","other":"83dc556ed36f37d06765be2554fe86eaf1ec21e2931fb22403238453bf021dfb","up":true},{"one":"018adc613f78d6ec876274f821251fd049eb3651646cd69e27efe211fe88d936","other":"4a1811dd9febde1801a604ad81de84a2d15366d0b5c330f30f3398da0d107824","up":true},{"one":"6c82fdabd09e0e9d0fc507613a05951c02b2953d763a062a5f32aaf5cc477c19","other":"0ff67b0e9ec6509c7786495b7b3ddb176b4f8221ff300f409f00a3d389e8874c","up":true},{"one":"895bdcd200cc4d7ec5c24f1722d0a8ebedda78b78cdf1ccc8c22a981980f5786","other":"372d47374a57d18cf134a1f8fc2d2fc10dfacfc0be9ed883183a349c896b3793","up":true},{"one":"dc97c1a0019b482a048b8d15941dfe4c3c1a3443d9b2d7b4046370bc84a7e56f","other":"4a1811dd9febde1801a604ad81de84a2d15366d0b5c330f30f3398da0d107824","up":true},{"one":"f36120ff250b9e7164e96021479332054f67de65cd2fe5b6e34bc51d0fe4d29c","other":"dfaeebc8e29c6a8f851b12b80cf42567cd2a43e35d977305a3c10e51bf41170a","up":true},{"one":"6e5c213a2db57eaf2e1e1acc341c72efab89b0e42b6cd18db4f99ac1af151d65","other":"3cb1b4069727dc323a687cab4ca2764f6415450488706f1b97c5cb8ca46346ff","up":true},{"one":"b16dcdf1ff1a56d49e374531d9885d59c1bcfbb628604520d9b1d84662edb9ca","other":"042788d5b72cb84a375565d120d239a2b14fdf38b3f5f992284d78535077148a","up":true},{"one":"5a01993ff7b4bd12fdb259e96b26a036d0cf5d4ae9c9b516be64b63acec2443a","other":"1be4348ec5670cdc4f164d77b1356e7910b6d1be4a9b720e549d02e5482a9e78","up":true},{"one":"0506e949748b62da1d36b663df7d6a7e76027f72ced5d52f74677fb31d7e1505","other":"517aa977048247d5d16ad51a286ffac4d8f910733f0578b222201308c32d195e","up":true},{"one":"dfaeebc8e29c6a8f851b12b80cf42567cd2a43e35d977305a3c10e51bf41170a","other":"8b76194f129308324c7d0066530e02cac2410ee0ba952822f0ec866e12461e44","up":true},{"one":"8b76194f129308324c7d0066530e02cac2410ee0ba952822f0ec866e12461e44","other":"558eb021744be19383be9ac91b9f77e07479e0eb25576bd32a3afaa94c231178","up":true},{"one":"ea60ef7cb3f2166a5c8e286c885984943a2ea5aff4730015be6a15031040cecf","other":"db088103f3b6f2c784d76ecd99c8b4a77fd39bb39c72ddfd91c99c1a9dd3b75b","up":true},{"one":"558eb021744be19383be9ac91b9f77e07479e0eb25576bd32a3afaa94c231178","other":"213bf6e78e02a57585908c756f0965297152c3c400a0ed4c407a411e1ec5942d","up":true},{"one":"57764522162620c1ad0b166a9c43772255d0cc01e49f2122ef09db046804a570","other":"042788d5b72cb84a375565d120d239a2b14fdf38b3f5f992284d78535077148a","up":true},{"one":"e77f6aa9e3dfcce0a2e5db794703224249aba60595075b2df9a5b0b30855cf46","other":"a7a61804d270ed6c27a4b1e8a634c30d7cdbaf644a1c67cbc6b08cd849a711db","up":true},{"one":"ca036d1ef9e6ce3654f2d769f16926aa14957193586426489e15539dfa8f7763","other":"9ee7b3e06b453615cbd8737cb74515b150f518f1a2eaa2db90e54708dd161b7d","up":true},{"one":"cdcd165721f6851f361fad0b3ba88c8870be9ad6d6b8cbcecc7c89e1068d979a","other":"83dc556ed36f37d06765be2554fe86eaf1ec21e2931fb22403238453bf021dfb","up":true},{"one":"ae67fae4990da61ca89221c5b1675c992babb4d715b59939e47bd1491b3bf1f4","other":"8b76194f129308324c7d0066530e02cac2410ee0ba952822f0ec866e12461e44","up":true},{"one":"ce99e9d37111c52e929b187fe201790b1a555dfb8b6b6de54e94df7cc2d43fd4","other":"9ee7b3e06b453615cbd8737cb74515b150f518f1a2eaa2db90e54708dd161b7d","up":true},{"one":"2434c63e7f28b83e7feede7fe68ea99b989f8534f64d63b046733e2f474538f5","other":"0506e949748b62da1d36b663df7d6a7e76027f72ced5d52f74677fb31d7e1505","up":true},{"one":"026d2e41b82d506da685a30cce7cc5772f6c1e167b7d557e0531fb9b79dd4ff2","other":"213bf6e78e02a57585908c756f0965297152c3c400a0ed4c407a411e1ec5942d","up":true},{"one":"ed32d74d9be0649de1eb26b9915137fe46ec890c656c96be52e966ab6e2ed260","other":"d6ffb7fd2668e9b7b133bd9144156f4736191ef0d6e72b072759782d83931f22","up":true},{"one":"109ef17c890104bfc5a4897d526a0afaa8c991c9d213616032f3058d0feb7f00","other":"6e5c213a2db57eaf2e1e1acc341c72efab89b0e42b6cd18db4f99ac1af151d65","up":true},{"one":"4a1811dd9febde1801a604ad81de84a2d15366d0b5c330f30f3398da0d107824","other":"8b76194f129308324c7d0066530e02cac2410ee0ba952822f0ec866e12461e44","up":true},{"one":"a3205c1c4f9b72814f0db68e888e3c7ef88f27c681ed0d731dde5f0999f92ccc","other":"645b4e6b36fc1928725f627aeed278f46c5a7d6b0fff7ccff55a0468d47b23e8","up":true},{"one":"7639f9a66e8ff70f554c346faa25f78140957c295b748fc42a12df7972f4fcc6","other":"286aeba646bba4a8aa1c372bee9f2c9ff0a2b3abb4f18be321225555c6dce4e5","up":true},{"one":"39dbd5462c90dac75f49d9af7996845943bbe929754ef8125eee7f5a763e9def","other":"5abc96f4fa78812db6fb710fd424dd474145f7e5d00b4cedc5373b4c52f42cf5","up":true},{"one":"e55d8cdb7e7940b11929e7e5c949ef6beb7998e5180a1f0a3c0bf61aef39f1b8","other":"539df902d42dc997c6b0e24d16ad68b54c557d56b41c972a320d57632dbfbe3c","up":true},{"one":"d6ffb7fd2668e9b7b133bd9144156f4736191ef0d6e72b072759782d83931f22","other":"a2babe49410ae007bc41ff2b7deaf709ed849e2f69666ce5aae76a3b71f47081","up":true},{"one":"b92a71a4fc371e0596538a7fb2a33e85329c39c4409c99798d9318bc263a04a1","other":"c3a1b301bf187fd8326831197d93a0266ac0cc8287b9008631240e2bec9cf337","up":true},{"one":"e0b1c4eb5b5b4dfc22344ee65cb9716cecb38dcc80099793f20641884eae4854","other":"a3205c1c4f9b72814f0db68e888e3c7ef88f27c681ed0d731dde5f0999f92ccc","up":true},{"one":"ea0e1dd41fe042b09f273c98f02128949cf5561d20dc04b3d423961efed52327","other":"cdcd165721f6851f361fad0b3ba88c8870be9ad6d6b8cbcecc7c89e1068d979a","up":true},{"one":"213bf6e78e02a57585908c756f0965297152c3c400a0ed4c407a411e1ec5942d","other":"83dc556ed36f37d06765be2554fe86eaf1ec21e2931fb22403238453bf021dfb","up":true},{"one":"06b95f1bac76ca4925d509b06216f2113ac5dcf051ef5aa0a320ae64069e0b6d","other":"9ee7b3e06b453615cbd8737cb74515b150f518f1a2eaa2db90e54708dd161b7d","up":true},{"one":"c18105aa302a43e352d999745a0f806af9f8cb8bb83349357da5c85e8975acd1","other":"0506e949748b62da1d36b663df7d6a7e76027f72ced5d52f74677fb31d7e1505","up":true},{"one":"47c3e0dfbbfcebeece78865c8c989577360cd9cc46a3b43f4b7b01ed14dc30e6","other":"a7a61804d270ed6c27a4b1e8a634c30d7cdbaf644a1c67cbc6b08cd849a711db","up":true},{"one":"83dc556ed36f37d06765be2554fe86eaf1ec21e2931fb22403238453bf021dfb","other":"b16dcdf1ff1a56d49e374531d9885d59c1bcfbb628604520d9b1d84662edb9ca","up":true},{"one":"517aa977048247d5d16ad51a286ffac4d8f910733f0578b222201308c32d195e","other":"f36120ff250b9e7164e96021479332054f67de65cd2fe5b6e34bc51d0fe4d29c","up":true},{"one":"419a6626dd026c0438461592121992c6be1868375011655b6d405166cd8edf7f","other":"06b95f1bac76ca4925d509b06216f2113ac5dcf051ef5aa0a320ae64069e0b6d","up":true},{"one":"db088103f3b6f2c784d76ecd99c8b4a77fd39bb39c72ddfd91c99c1a9dd3b75b","other":"0506e949748b62da1d36b663df7d6a7e76027f72ced5d52f74677fb31d7e1505","up":true},{"one":"042788d5b72cb84a375565d120d239a2b14fdf38b3f5f992284d78535077148a","other":"286aeba646bba4a8aa1c372bee9f2c9ff0a2b3abb4f18be321225555c6dce4e5","up":true},{"one":"286aeba646bba4a8aa1c372bee9f2c9ff0a2b3abb4f18be321225555c6dce4e5","other":"06b95f1bac76ca4925d509b06216f2113ac5dcf051ef5aa0a320ae64069e0b6d","up":true},{"one":"5d608e66a17442091111cb472723fe3aea1f2baecaa546b57d49507c63a61cda","other":"0506e949748b62da1d36b663df7d6a7e76027f72ced5d52f74677fb31d7e1505","up":true},{"one":"0ff67b0e9ec6509c7786495b7b3ddb176b4f8221ff300f409f00a3d389e8874c","other":"621076ce6b82e70c90a4adf235aa6f71b116e302dd6b15dcae07f4a816012455","up":true},{"one":"621076ce6b82e70c90a4adf235aa6f71b116e302dd6b15dcae07f4a816012455","other":"4167946de250b013e1be16ee84bfe2ccaae83e699e618b38f31016c4e431e6ba","up":true},{"one":"78cbc19a24d095ab7858849058c65c061c52289b91ddd92cee34bed98aee4a59","other":"a7a61804d270ed6c27a4b1e8a634c30d7cdbaf644a1c67cbc6b08cd849a711db","up":true},{"one":"ebca518e5146f49ac75bcaa8add2ef4d1d22c5cfd2e2326c6b41826d45ce55ae","other":"aebd6135d10252b07f891b3a7330903faf13d409c4f7108630715fa0754f938e","up":true},{"one":"7f87da7ee55b4c8c8f9d55411ff88d3a0b63bfee6a516917d49fa6273fb5b86a","other":"a7a61804d270ed6c27a4b1e8a634c30d7cdbaf644a1c67cbc6b08cd849a711db","up":true},{"one":"41b9ee7ad19698e97589b059ad3333cb64f02c16006d94fb3d0bad7ced8ff238","other":"a7a61804d270ed6c27a4b1e8a634c30d7cdbaf644a1c67cbc6b08cd849a711db","up":true},{"one":"021811a6757bdcdd2fa0fb68401dfe009d5a8e129958cd304fb42cf51dc5d1d3","other":"6e5c213a2db57eaf2e1e1acc341c72efab89b0e42b6cd18db4f99ac1af151d65","up":true},{"one":"645b4e6b36fc1928725f627aeed278f46c5a7d6b0fff7ccff55a0468d47b23e8","other":"4a1811dd9febde1801a604ad81de84a2d15366d0b5c330f30f3398da0d107824","up":true},{"one":"1be4348ec5670cdc4f164d77b1356e7910b6d1be4a9b720e549d02e5482a9e78","other":"0506e949748b62da1d36b663df7d6a7e76027f72ced5d52f74677fb31d7e1505","up":true},{"one":"7cf4838a7c83a736ce59cfa1b974674a0185dbe17a8f3cd29794a3bbe814adee","other":"06b95f1bac76ca4925d509b06216f2113ac5dcf051ef5aa0a320ae64069e0b6d","up":true},{"one":"86ca1078dae40f23ae1b3ac47397460d9ec0bf243a0de372b405381d6722fcb2","other":"ca036d1ef9e6ce3654f2d769f16926aa14957193586426489e15539dfa8f7763","up":true},{"one":"b381e75e52e4cdd168056245f82d3a1747b67f400eb40eb12036b73ee7fe21e5","other":"4cd0f38e52a508f81cf95e1370c994aea2d7a49a2a08e3e054f53629a6619410","up":true},{"one":"a085045c335ce2e47dbdfeb1adb62ce6c3bed36a93cf3448c45757a1a88e295d","other":"f5c4d28df5973ec0292221a875e8446323f339409d93f0f7385990126908a3c3","up":true},{"one":"3ee4b20c047e701b58c06fcc8160364bd29573f61f4d9f1935d77ac29f6a1e86","other":"d2245f0679b436faabc0164e0b85e02e2effbad306e8229b555524a5e6d1a5f9","up":true},{"one":"7b9242137f8cc2bec7b3e0003fd93026921ceb10dfadbbd5b6aa64d61a74f35e","other":"4cd0f38e52a508f81cf95e1370c994aea2d7a49a2a08e3e054f53629a6619410","up":true},{"one":"7355fab10584e4312f5cb5c3c826e7f9c14da74d62d07d0a8007ce9c6e995be9","other":"26d1af1fbee6541a363ea7707825e37da028142f00779116560ad20f1de18e7b","up":true},{"one":"9d3c79e4a0ac4e5b95aa32545f3b8d86f74594faa237d5c2566cf02fbd60b11a","other":"cfbb9ea682becadeab10bbd080ba8e93510085a87ac519e434964faa222fc275","up":true},{"one":"26d1af1fbee6541a363ea7707825e37da028142f00779116560ad20f1de18e7b","other":"67288f84ada7778858139c74917b22ae698ed43df49a6530a566648f074ede46","up":true},{"one":"8be461203f5ebb5721348f537b37d768f7bd359af3e18d1f7e9af2f901c49845","other":"73b8d1840d0a8ffe69752ec96f8fddecb0e22726c87982d572ca9acc1c9cdbfc","up":true},{"one":"73b8d1840d0a8ffe69752ec96f8fddecb0e22726c87982d572ca9acc1c9cdbfc","other":"13bc64535d3ae495098e4ac6b30a91d1804dab0ab79944f2c6ac53c9bccdf62d","up":true},{"one":"d2245f0679b436faabc0164e0b85e02e2effbad306e8229b555524a5e6d1a5f9","other":"8be461203f5ebb5721348f537b37d768f7bd359af3e18d1f7e9af2f901c49845","up":true},{"one":"67288f84ada7778858139c74917b22ae698ed43df49a6530a566648f074ede46","other":"757a557424c33ad89efd8185ec18d71c025830ecb2aed951e33c8c8d986d5933","up":true},{"one":"b2b9ac0f4db58886597af7b19d6150498ac8ad7c804671628aa34384b8fe505e","other":"d2245f0679b436faabc0164e0b85e02e2effbad306e8229b555524a5e6d1a5f9","up":true},{"one":"afa3de5cebc9f96cf20a35058f4856fe43b48ac59cf8e46565f194f438622a52","other":"f5c4d28df5973ec0292221a875e8446323f339409d93f0f7385990126908a3c3","up":true},{"one":"957d8a9b412b6f4cd151cbc07b8d74d949880ae665c545debb18181389c99ee6","other":"82f034db88fd26b47c26b95c3f87a1f454ffe4526ae86beb2bb1d8f2c218c25c","up":true},{"one":"aebd6135d10252b07f891b3a7330903faf13d409c4f7108630715fa0754f938e","other":"d2245f0679b436faabc0164e0b85e02e2effbad306e8229b555524a5e6d1a5f9","up":true},{"one":"4cd0f38e52a508f81cf95e1370c994aea2d7a49a2a08e3e054f53629a6619410","other":"73b8d1840d0a8ffe69752ec96f8fddecb0e22726c87982d572ca9acc1c9cdbfc","up":true},{"one":"2459fe9250b3311c86530d00b7a9b8ba57b1b5151c126262e70c55d1e8d37924","other":"d2245f0679b436faabc0164e0b85e02e2effbad306e8229b555524a5e6d1a5f9","up":true},{"one":"7fbc1843e2222e3c8e35a3215d1bbb4d5457d8b9ed33749e07e22f25ba9ee576","other":"06b95f1bac76ca4925d509b06216f2113ac5dcf051ef5aa0a320ae64069e0b6d","up":true},{"one":"cbc5d42951bc6e187296b5f8ce4d04e472e26670a62851f39d65f31c50865f6a","other":"aebd6135d10252b07f891b3a7330903faf13d409c4f7108630715fa0754f938e","up":true},{"one":"698247d103a8925d8bb4c56a3056e49c5efc595fced1c89d49943bb9ba01f394","other":"48b614958a8692780ef5bd5c95e0db4ff67deb4de0dcbb878ca4479bfb86957e","up":true},{"one":"6742cca1b7783fcbed8d0b340508f93cc4dfaca8ff3f13fd59354486c4d62993","other":"13bc64535d3ae495098e4ac6b30a91d1804dab0ab79944f2c6ac53c9bccdf62d","up":true},{"one":"82f034db88fd26b47c26b95c3f87a1f454ffe4526ae86beb2bb1d8f2c218c25c","other":"d2245f0679b436faabc0164e0b85e02e2effbad306e8229b555524a5e6d1a5f9","up":true},{"one":"4167946de250b013e1be16ee84bfe2ccaae83e699e618b38f31016c4e431e6ba","other":"06b95f1bac76ca4925d509b06216f2113ac5dcf051ef5aa0a320ae64069e0b6d","up":true},{"one":"9a9230b3f7f386520821dee78ebe92e8c64a4f6a50f2639327c62e45cab40563","other":"f5c4d28df5973ec0292221a875e8446323f339409d93f0f7385990126908a3c3","up":true},{"one":"f410d4ac9b748c24fa0d48c3053bb1cea8a67d0bcc4e5fcbdb261c0c7522cc34","other":"d2245f0679b436faabc0164e0b85e02e2effbad306e8229b555524a5e6d1a5f9","up":true},{"one":"92a1501ed41e29bb7dd8eb4b4acecae983f4c7c83f39895cd68f7810b645f1dd","other":"419a6626dd026c0438461592121992c6be1868375011655b6d405166cd8edf7f","up":true},{"one":"b8411f198fd658c5a2028835c0af3342145839c06c8a4f382d9f9de485d46c08","other":"73b8d1840d0a8ffe69752ec96f8fddecb0e22726c87982d572ca9acc1c9cdbfc","up":true},{"one":"3e56d4533ec14f6656e1eb25fb35dad47c9db479f667a6b6fe9a3aa8c12e982e","other":"13bc64535d3ae495098e4ac6b30a91d1804dab0ab79944f2c6ac53c9bccdf62d","up":true},{"one":"f36084048bf0ff985a77f5183796f7b37b7085ee6eea8bbc5fc62558854cce67","other":"b8411f198fd658c5a2028835c0af3342145839c06c8a4f382d9f9de485d46c08","up":true},{"one":"48b614958a8692780ef5bd5c95e0db4ff67deb4de0dcbb878ca4479bfb86957e","other":"f5c4d28df5973ec0292221a875e8446323f339409d93f0f7385990126908a3c3","up":true},{"one":"a7a61804d270ed6c27a4b1e8a634c30d7cdbaf644a1c67cbc6b08cd849a711db","other":"042788d5b72cb84a375565d120d239a2b14fdf38b3f5f992284d78535077148a","up":true},{"one":"0bcf8a8ab0065ca8c85b8b6641f4c6e0b0de60e79ef32ebf6ff8f109ac4e1d70","other":"26d1af1fbee6541a363ea7707825e37da028142f00779116560ad20f1de18e7b","up":true},{"one":"7dc5e8d8180c1bc7ebbee11a47fc96e8fe8b2d71c30cbc4aa1cf99e8eb6afcac","other":"4b243a5aeabec6db0e4a80a9c255300cd94591a6fbe0e0aa170da4f6ce14edff","up":true},{"one":"c18105aa302a43e352d999745a0f806af9f8cb8bb83349357da5c85e8975acd1","other":"042788d5b72cb84a375565d120d239a2b14fdf38b3f5f992284d78535077148a","up":true},{"one":"b8e1a80d91216fd5f8bc3f7413caf68ade7f124354d44fe7bd155a089134a70a","other":"83dc556ed36f37d06765be2554fe86eaf1ec21e2931fb22403238453bf021dfb","up":true},{"one":"db088103f3b6f2c784d76ecd99c8b4a77fd39bb39c72ddfd91c99c1a9dd3b75b","other":"042788d5b72cb84a375565d120d239a2b14fdf38b3f5f992284d78535077148a","up":true},{"one":"027fb496438782583f78fb76999336eed7fb672a9c9ea50d04df580e6eb21377","other":"2a22dbee71a0ef27c840221db4a592d6dc8f171afed865ff814a37d633a3eaa9","up":true},{"one":"645b4e6b36fc1928725f627aeed278f46c5a7d6b0fff7ccff55a0468d47b23e8","other":"517aa977048247d5d16ad51a286ffac4d8f910733f0578b222201308c32d195e","up":true},{"one":"213bf6e78e02a57585908c756f0965297152c3c400a0ed4c407a411e1ec5942d","other":"b16dcdf1ff1a56d49e374531d9885d59c1bcfbb628604520d9b1d84662edb9ca","up":true},{"one":"a75abd0dce5a488b7e06f91fab7a92ec428ab21bde9372c9e8fa489f48e7b3fe","other":"8cf957bf95a629c60c31dbcfe75ecca149a81c761f8b34858b04f8318e5c74bd","up":true},{"one":"372d47374a57d18cf134a1f8fc2d2fc10dfacfc0be9ed883183a349c896b3793","other":"26d1af1fbee6541a363ea7707825e37da028142f00779116560ad20f1de18e7b","up":true},{"one":"e16b12c708bc5e0545009daed44733c52d7450ccc797d158dd41a3bc9507b6be","other":"d0f398969480f3df3587f6d47546ff1261cad4d2e9c26ff3077e35ae1b26153e","up":true},{"one":"5abc96f4fa78812db6fb710fd424dd474145f7e5d00b4cedc5373b4c52f42cf5","other":"757a557424c33ad89efd8185ec18d71c025830ecb2aed951e33c8c8d986d5933","up":true},{"one":"6c029114a9f73d69a42e591cf2d13107eff038d3eda8abb0242d9d6d169f05c7","other":"7dc5e8d8180c1bc7ebbee11a47fc96e8fe8b2d71c30cbc4aa1cf99e8eb6afcac","up":true},{"one":"91eba9f9c8f2929d38f43a0c7efa809c0d2d59a31cbf2760c90e73d20266d528","other":"b92a71a4fc371e0596538a7fb2a33e85329c39c4409c99798d9318bc263a04a1","up":true},{"one":"89c883d6a85472bda328667e3fd805c70876bc582ca6763ab97ae636b1772be4","other":"8cf957bf95a629c60c31dbcfe75ecca149a81c761f8b34858b04f8318e5c74bd","up":true},{"one":"734e029ed25485edd49b93dd9e85b6e7657f860e4ded4bc8a5094f512ae5836b","other":"48b614958a8692780ef5bd5c95e0db4ff67deb4de0dcbb878ca4479bfb86957e","up":true},{"one":"ad0d0dc5d4114ee4482d6c9bd4e46683327abf2b92df0d242d79019963876668","other":"b92a71a4fc371e0596538a7fb2a33e85329c39c4409c99798d9318bc263a04a1","up":true},{"one":"757a557424c33ad89efd8185ec18d71c025830ecb2aed951e33c8c8d986d5933","other":"6c029114a9f73d69a42e591cf2d13107eff038d3eda8abb0242d9d6d169f05c7","up":true},{"one":"edc8794153fb517085d27a83a4b00e8c3b37f22d2242b842cb2fab66764de9fe","other":"a7a61804d270ed6c27a4b1e8a634c30d7cdbaf644a1c67cbc6b08cd849a711db","up":true},{"one":"772e4c80d128deb52adf024a0eb6fe9bbea1c83351ed93f55f490cd5e5c69260","other":"f74ecde0bbaa7b6521fb205b5ab9ea637909277f6e1ee1d3490f5cd01d0f7216","up":true},{"one":"b70e96f01ac8947d2de6320412ae3310316caba65c27108ad16b2f2004255be4","other":"a2babe49410ae007bc41ff2b7deaf709ed849e2f69666ce5aae76a3b71f47081","up":true},{"one":"f74ecde0bbaa7b6521fb205b5ab9ea637909277f6e1ee1d3490f5cd01d0f7216","other":"cdcd165721f6851f361fad0b3ba88c8870be9ad6d6b8cbcecc7c89e1068d979a","up":true},{"one":"6e5c213a2db57eaf2e1e1acc341c72efab89b0e42b6cd18db4f99ac1af151d65","other":"5abc96f4fa78812db6fb710fd424dd474145f7e5d00b4cedc5373b4c52f42cf5","up":true},{"one":"b486ce31ce880db3aaa17a0ac2c2f3554b6fe71f9c051edb572974342af4adb9","other":"83dc556ed36f37d06765be2554fe86eaf1ec21e2931fb22403238453bf021dfb","up":true},{"one":"dc97c1a0019b482a048b8d15941dfe4c3c1a3443d9b2d7b4046370bc84a7e56f","other":"d6ffb7fd2668e9b7b133bd9144156f4736191ef0d6e72b072759782d83931f22","up":true},{"one":"39dbd5462c90dac75f49d9af7996845943bbe929754ef8125eee7f5a763e9def","other":"3cb1b4069727dc323a687cab4ca2764f6415450488706f1b97c5cb8ca46346ff","up":true},{"one":"1929a84bcd64bf002d0afb16249466c5b660123174a1fc1bf881913f8c87d1fd","other":"e55d8cdb7e7940b11929e7e5c949ef6beb7998e5180a1f0a3c0bf61aef39f1b8","up":true},{"one":"0ab9845c2890b0a64a3e5932241245e00b817b788094f9ee48f86f80b7264fea","other":"9e02c5384602a54e900cfa46d5987b77f16e74cba745ac850fcada01c7af9004","up":true},{"one":"e0b1c4eb5b5b4dfc22344ee65cb9716cecb38dcc80099793f20641884eae4854","other":"a2babe49410ae007bc41ff2b7deaf709ed849e2f69666ce5aae76a3b71f47081","up":true},{"one":"f5c4d28df5973ec0292221a875e8446323f339409d93f0f7385990126908a3c3","other":"e55d8cdb7e7940b11929e7e5c949ef6beb7998e5180a1f0a3c0bf61aef39f1b8","up":true},{"one":"018adc613f78d6ec876274f821251fd049eb3651646cd69e27efe211fe88d936","other":"517aa977048247d5d16ad51a286ffac4d8f910733f0578b222201308c32d195e","up":true},{"one":"8b76194f129308324c7d0066530e02cac2410ee0ba952822f0ec866e12461e44","other":"645b4e6b36fc1928725f627aeed278f46c5a7d6b0fff7ccff55a0468d47b23e8","up":true},{"one":"6d601952793589bc6b57340c451a6abf02ea2c16637e910eed04cde6eddfe17a","other":"539df902d42dc997c6b0e24d16ad68b54c557d56b41c972a320d57632dbfbe3c","up":true},{"one":"6ecb11fc5acc16ecd70351410fa18ec44a2a83d9e778cf25b85a7535493456b7","other":"7dc5e8d8180c1bc7ebbee11a47fc96e8fe8b2d71c30cbc4aa1cf99e8eb6afcac","up":true},{"one":"cdcd165721f6851f361fad0b3ba88c8870be9ad6d6b8cbcecc7c89e1068d979a","other":"8b76194f129308324c7d0066530e02cac2410ee0ba952822f0ec866e12461e44","up":true},{"one":"517aa977048247d5d16ad51a286ffac4d8f910733f0578b222201308c32d195e","other":"e77f6aa9e3dfcce0a2e5db794703224249aba60595075b2df9a5b0b30855cf46","up":true},{"one":"38ab3d7bdfb293b88122404cb7c50b5fb890ce7664c075da95585557a430c403","other":"109ef17c890104bfc5a4897d526a0afaa8c991c9d213616032f3058d0feb7f00","up":true},{"one":"1be4348ec5670cdc4f164d77b1356e7910b6d1be4a9b720e549d02e5482a9e78","other":"026d2e41b82d506da685a30cce7cc5772f6c1e167b7d557e0531fb9b79dd4ff2","up":true},{"one":"5d608e66a17442091111cb472723fe3aea1f2baecaa546b57d49507c63a61cda","other":"018adc613f78d6ec876274f821251fd049eb3651646cd69e27efe211fe88d936","up":true},{"one":"3cb1b4069727dc323a687cab4ca2764f6415450488706f1b97c5cb8ca46346ff","other":"372d47374a57d18cf134a1f8fc2d2fc10dfacfc0be9ed883183a349c896b3793","up":true},{"one":"5a01993ff7b4bd12fdb259e96b26a036d0cf5d4ae9c9b516be64b63acec2443a","other":"2434c63e7f28b83e7feede7fe68ea99b989f8534f64d63b046733e2f474538f5","up":true},{"one":"667ef042e9dae18694581e0404c3d87a09800e8b42173d26571c3bf97e29a372","other":"03907380afcd52238f3d84a8dee3df599c7f2f9b90fbc1271ee88bdb52acbd58","up":true},{"one":"d0f398969480f3df3587f6d47546ff1261cad4d2e9c26ff3077e35ae1b26153e","other":"2a22dbee71a0ef27c840221db4a592d6dc8f171afed865ff814a37d633a3eaa9","up":true},{"one":"962676818c17fae1ffc52fc29318c44f9b8c980afd6d3e98217b4088d568a808","other":"9a9230b3f7f386520821dee78ebe92e8c64a4f6a50f2639327c62e45cab40563","up":true},{"one":"03907380afcd52238f3d84a8dee3df599c7f2f9b90fbc1271ee88bdb52acbd58","other":"2a22dbee71a0ef27c840221db4a592d6dc8f171afed865ff814a37d633a3eaa9","up":true},{"one":"026d2e41b82d506da685a30cce7cc5772f6c1e167b7d557e0531fb9b79dd4ff2","other":"2434c63e7f28b83e7feede7fe68ea99b989f8534f64d63b046733e2f474538f5","up":true},{"one":"558eb021744be19383be9ac91b9f77e07479e0eb25576bd32a3afaa94c231178","other":"2434c63e7f28b83e7feede7fe68ea99b989f8534f64d63b046733e2f474538f5","up":true},{"one":"f36120ff250b9e7164e96021479332054f67de65cd2fe5b6e34bc51d0fe4d29c","other":"dc97c1a0019b482a048b8d15941dfe4c3c1a3443d9b2d7b4046370bc84a7e56f","up":true},{"one":"d6ffb7fd2668e9b7b133bd9144156f4736191ef0d6e72b072759782d83931f22","other":"c3a1b301bf187fd8326831197d93a0266ac0cc8287b9008631240e2bec9cf337","up":true},{"one":"a3205c1c4f9b72814f0db68e888e3c7ef88f27c681ed0d731dde5f0999f92ccc","other":"6e5c213a2db57eaf2e1e1acc341c72efab89b0e42b6cd18db4f99ac1af151d65","up":true},{"one":"ae67fae4990da61ca89221c5b1675c992babb4d715b59939e47bd1491b3bf1f4","other":"83dc556ed36f37d06765be2554fe86eaf1ec21e2931fb22403238453bf021dfb","up":true},{"one":"4b243a5aeabec6db0e4a80a9c255300cd94591a6fbe0e0aa170da4f6ce14edff","other":"d0f398969480f3df3587f6d47546ff1261cad4d2e9c26ff3077e35ae1b26153e","up":true},{"one":"2434c63e7f28b83e7feede7fe68ea99b989f8534f64d63b046733e2f474538f5","other":"0ab9845c2890b0a64a3e5932241245e00b817b788094f9ee48f86f80b7264fea","up":true},{"one":"cfbb9ea682becadeab10bbd080ba8e93510085a87ac519e434964faa222fc275","other":"c3a1b301bf187fd8326831197d93a0266ac0cc8287b9008631240e2bec9cf337","up":true},{"one":"ea0e1dd41fe042b09f273c98f02128949cf5561d20dc04b3d423961efed52327","other":"d6ffb7fd2668e9b7b133bd9144156f4736191ef0d6e72b072759782d83931f22","up":true},{"one":"dfaeebc8e29c6a8f851b12b80cf42567cd2a43e35d977305a3c10e51bf41170a","other":"b8e1a80d91216fd5f8bc3f7413caf68ade7f124354d44fe7bd155a089134a70a","up":true},{"one":"109ef17c890104bfc5a4897d526a0afaa8c991c9d213616032f3058d0feb7f00","other":"772e4c80d128deb52adf024a0eb6fe9bbea1c83351ed93f55f490cd5e5c69260","up":true},{"one":"895bdcd200cc4d7ec5c24f1722d0a8ebedda78b78cdf1ccc8c22a981980f5786","other":"91eba9f9c8f2929d38f43a0c7efa809c0d2d59a31cbf2760c90e73d20266d528","up":true},{"one":"9e02c5384602a54e900cfa46d5987b77f16e74cba745ac850fcada01c7af9004","other":"b92a71a4fc371e0596538a7fb2a33e85329c39c4409c99798d9318bc263a04a1","up":true},{"one":"8cf957bf95a629c60c31dbcfe75ecca149a81c761f8b34858b04f8318e5c74bd","other":"ed32d74d9be0649de1eb26b9915137fe46ec890c656c96be52e966ab6e2ed260","up":true},{"one":"021811a6757bdcdd2fa0fb68401dfe009d5a8e129958cd304fb42cf51dc5d1d3","other":"558eb021744be19383be9ac91b9f77e07479e0eb25576bd32a3afaa94c231178","up":true},{"one":"ed32d74d9be0649de1eb26b9915137fe46ec890c656c96be52e966ab6e2ed260","other":"cdcd165721f6851f361fad0b3ba88c8870be9ad6d6b8cbcecc7c89e1068d979a","up":true},{"one":"a7a61804d270ed6c27a4b1e8a634c30d7cdbaf644a1c67cbc6b08cd849a711db","other":"0506e949748b62da1d36b663df7d6a7e76027f72ced5d52f74677fb31d7e1505","up":true},{"one":"92a1501ed41e29bb7dd8eb4b4acecae983f4c7c83f39895cd68f7810b645f1dd","other":"7639f9a66e8ff70f554c346faa25f78140957c295b748fc42a12df7972f4fcc6","up":true},{"one":"539df902d42dc997c6b0e24d16ad68b54c557d56b41c972a320d57632dbfbe3c","other":"5abc96f4fa78812db6fb710fd424dd474145f7e5d00b4cedc5373b4c52f42cf5","up":true},{"one":"e55d8cdb7e7940b11929e7e5c949ef6beb7998e5180a1f0a3c0bf61aef39f1b8","other":"734e029ed25485edd49b93dd9e85b6e7657f860e4ded4bc8a5094f512ae5836b","up":true},{"one":"b8411f198fd658c5a2028835c0af3342145839c06c8a4f382d9f9de485d46c08","other":"419a6626dd026c0438461592121992c6be1868375011655b6d405166cd8edf7f","up":true},{"one":"b92a71a4fc371e0596538a7fb2a33e85329c39c4409c99798d9318bc263a04a1","other":"d6ffb7fd2668e9b7b133bd9144156f4736191ef0d6e72b072759782d83931f22","up":true},{"one":"2a22dbee71a0ef27c840221db4a592d6dc8f171afed865ff814a37d633a3eaa9","other":"734e029ed25485edd49b93dd9e85b6e7657f860e4ded4bc8a5094f512ae5836b","up":true},{"one":"f410d4ac9b748c24fa0d48c3053bb1cea8a67d0bcc4e5fcbdb261c0c7522cc34","other":"ca036d1ef9e6ce3654f2d769f16926aa14957193586426489e15539dfa8f7763","up":true},{"one":"8be461203f5ebb5721348f537b37d768f7bd359af3e18d1f7e9af2f901c49845","other":"419a6626dd026c0438461592121992c6be1868375011655b6d405166cd8edf7f","up":true},{"one":"7639f9a66e8ff70f554c346faa25f78140957c295b748fc42a12df7972f4fcc6","other":"4167946de250b013e1be16ee84bfe2ccaae83e699e618b38f31016c4e431e6ba","up":true},{"one":"f36084048bf0ff985a77f5183796f7b37b7085ee6eea8bbc5fc62558854cce67","other":"aebd6135d10252b07f891b3a7330903faf13d409c4f7108630715fa0754f938e","up":true},{"one":"419a6626dd026c0438461592121992c6be1868375011655b6d405166cd8edf7f","other":"0ff67b0e9ec6509c7786495b7b3ddb176b4f8221ff300f409f00a3d389e8874c","up":true},{"one":"ebca518e5146f49ac75bcaa8add2ef4d1d22c5cfd2e2326c6b41826d45ce55ae","other":"b8411f198fd658c5a2028835c0af3342145839c06c8a4f382d9f9de485d46c08","up":true},{"one":"e0ea575d0e2efa28bc51f49d1e2c24196a196da3b3196f3a5a26a5e310809af5","other":"f36120ff250b9e7164e96021479332054f67de65cd2fe5b6e34bc51d0fe4d29c","up":true},{"one":"47c3e0dfbbfcebeece78865c8c989577360cd9cc46a3b43f4b7b01ed14dc30e6","other":"b16dcdf1ff1a56d49e374531d9885d59c1bcfbb628604520d9b1d84662edb9ca","up":true},{"one":"4167946de250b013e1be16ee84bfe2ccaae83e699e618b38f31016c4e431e6ba","other":"0ff67b0e9ec6509c7786495b7b3ddb176b4f8221ff300f409f00a3d389e8874c","up":true},{"one":"ce99e9d37111c52e929b187fe201790b1a555dfb8b6b6de54e94df7cc2d43fd4","other":"a7a61804d270ed6c27a4b1e8a634c30d7cdbaf644a1c67cbc6b08cd849a711db","up":true},{"one":"c8e5a1b4533dd0de12acee4d31369f39785178568718b93bbc321ec83e0714f0","other":"f36084048bf0ff985a77f5183796f7b37b7085ee6eea8bbc5fc62558854cce67","up":true},{"one":"ca036d1ef9e6ce3654f2d769f16926aa14957193586426489e15539dfa8f7763","other":"e77f6aa9e3dfcce0a2e5db794703224249aba60595075b2df9a5b0b30855cf46","up":true},{"one":"ea60ef7cb3f2166a5c8e286c885984943a2ea5aff4730015be6a15031040cecf","other":"e77f6aa9e3dfcce0a2e5db794703224249aba60595075b2df9a5b0b30855cf46","up":true},{"one":"41b9ee7ad19698e97589b059ad3333cb64f02c16006d94fb3d0bad7ced8ff238","other":"b16dcdf1ff1a56d49e374531d9885d59c1bcfbb628604520d9b1d84662edb9ca","up":true},{"one":"7f87da7ee55b4c8c8f9d55411ff88d3a0b63bfee6a516917d49fa6273fb5b86a","other":"b16dcdf1ff1a56d49e374531d9885d59c1bcfbb628604520d9b1d84662edb9ca","up":true},{"one":"e77f6aa9e3dfcce0a2e5db794703224249aba60595075b2df9a5b0b30855cf46","other":"f36084048bf0ff985a77f5183796f7b37b7085ee6eea8bbc5fc62558854cce67","up":true},{"one":"3e56d4533ec14f6656e1eb25fb35dad47c9db479f667a6b6fe9a3aa8c12e982e","other":"0bcf8a8ab0065ca8c85b8b6641f4c6e0b0de60e79ef32ebf6ff8f109ac4e1d70","up":true},{"one":"6c82fdabd09e0e9d0fc507613a05951c02b2953d763a062a5f32aaf5cc477c19","other":"47c3e0dfbbfcebeece78865c8c989577360cd9cc46a3b43f4b7b01ed14dc30e6","up":true},{"one":"0ff67b0e9ec6509c7786495b7b3ddb176b4f8221ff300f409f00a3d389e8874c","other":"286aeba646bba4a8aa1c372bee9f2c9ff0a2b3abb4f18be321225555c6dce4e5","up":true},{"one":"cec3c01c147b34f25104ddd0b25076cef63ac224eada9d9f5a00b8513331354f","other":"db088103f3b6f2c784d76ecd99c8b4a77fd39bb39c72ddfd91c99c1a9dd3b75b","up":true},{"one":"286aeba646bba4a8aa1c372bee9f2c9ff0a2b3abb4f18be321225555c6dce4e5","other":"2459fe9250b3311c86530d00b7a9b8ba57b1b5151c126262e70c55d1e8d37924","up":true},{"one":"cbc5d42951bc6e187296b5f8ce4d04e472e26670a62851f39d65f31c50865f6a","other":"b8411f198fd658c5a2028835c0af3342145839c06c8a4f382d9f9de485d46c08","up":true},{"one":"78cbc19a24d095ab7858849058c65c061c52289b91ddd92cee34bed98aee4a59","other":"b16dcdf1ff1a56d49e374531d9885d59c1bcfbb628604520d9b1d84662edb9ca","up":true},{"one":"b2b9ac0f4db58886597af7b19d6150498ac8ad7c804671628aa34384b8fe505e","other":"afa3de5cebc9f96cf20a35058f4856fe43b48ac59cf8e46565f194f438622a52","up":true},{"one":"57764522162620c1ad0b166a9c43772255d0cc01e49f2122ef09db046804a570","other":"7639f9a66e8ff70f554c346faa25f78140957c295b748fc42a12df7972f4fcc6","up":true},{"one":"7b9242137f8cc2bec7b3e0003fd93026921ceb10dfadbbd5b6aa64d61a74f35e","other":"48b614958a8692780ef5bd5c95e0db4ff67deb4de0dcbb878ca4479bfb86957e","up":true},{"one":"9ee7b3e06b453615cbd8737cb74515b150f518f1a2eaa2db90e54708dd161b7d","other":"aebd6135d10252b07f891b3a7330903faf13d409c4f7108630715fa0754f938e","up":true},{"one":"82f034db88fd26b47c26b95c3f87a1f454ffe4526ae86beb2bb1d8f2c218c25c","other":"9d3c79e4a0ac4e5b95aa32545f3b8d86f74594faa237d5c2566cf02fbd60b11a","up":true},{"one":"a085045c335ce2e47dbdfeb1adb62ce6c3bed36a93cf3448c45757a1a88e295d","other":"e16b12c708bc5e0545009daed44733c52d7450ccc797d158dd41a3bc9507b6be","up":true},{"one":"621076ce6b82e70c90a4adf235aa6f71b116e302dd6b15dcae07f4a816012455","other":"419a6626dd026c0438461592121992c6be1868375011655b6d405166cd8edf7f","up":true},{"one":"2459fe9250b3311c86530d00b7a9b8ba57b1b5151c126262e70c55d1e8d37924","other":"afa3de5cebc9f96cf20a35058f4856fe43b48ac59cf8e46565f194f438622a52","up":true},{"one":"6742cca1b7783fcbed8d0b340508f93cc4dfaca8ff3f13fd59354486c4d62993","other":"26d1af1fbee6541a363ea7707825e37da028142f00779116560ad20f1de18e7b","up":true},{"one":"042788d5b72cb84a375565d120d239a2b14fdf38b3f5f992284d78535077148a","other":"0ff67b0e9ec6509c7786495b7b3ddb176b4f8221ff300f409f00a3d389e8874c","up":true},{"one":"b16dcdf1ff1a56d49e374531d9885d59c1bcfbb628604520d9b1d84662edb9ca","other":"b8e1a80d91216fd5f8bc3f7413caf68ade7f124354d44fe7bd155a089134a70a","up":true},{"one":"698247d103a8925d8bb4c56a3056e49c5efc595fced1c89d49943bb9ba01f394","other":"4cd0f38e52a508f81cf95e1370c994aea2d7a49a2a08e3e054f53629a6619410","up":true},{"one":"b70e96f01ac8947d2de6320412ae3310316caba65c27108ad16b2f2004255be4","other":"ae67fae4990da61ca89221c5b1675c992babb4d715b59939e47bd1491b3bf1f4","up":true},{"one":"06b95f1bac76ca4925d509b06216f2113ac5dcf051ef5aa0a320ae64069e0b6d","other":"a7a61804d270ed6c27a4b1e8a634c30d7cdbaf644a1c67cbc6b08cd849a711db","up":true},{"one":"757a557424c33ad89efd8185ec18d71c025830ecb2aed951e33c8c8d986d5933","other":"7dc5e8d8180c1bc7ebbee11a47fc96e8fe8b2d71c30cbc4aa1cf99e8eb6afcac","up":true},{"one":"957d8a9b412b6f4cd151cbc07b8d74d949880ae665c545debb18181389c99ee6","other":"8be461203f5ebb5721348f537b37d768f7bd359af3e18d1f7e9af2f901c49845","up":true},{"one":"3ee4b20c047e701b58c06fcc8160364bd29573f61f4d9f1935d77ac29f6a1e86","other":"f5c4d28df5973ec0292221a875e8446323f339409d93f0f7385990126908a3c3","up":true},{"one":"b381e75e52e4cdd168056245f82d3a1747b67f400eb40eb12036b73ee7fe21e5","other":"48b614958a8692780ef5bd5c95e0db4ff67deb4de0dcbb878ca4479bfb86957e","up":true},{"one":"6ecb11fc5acc16ecd70351410fa18ec44a2a83d9e778cf25b85a7535493456b7","other":"7b9242137f8cc2bec7b3e0003fd93026921ceb10dfadbbd5b6aa64d61a74f35e","up":true},{"one":"734e029ed25485edd49b93dd9e85b6e7657f860e4ded4bc8a5094f512ae5836b","other":"539df902d42dc997c6b0e24d16ad68b54c557d56b41c972a320d57632dbfbe3c","up":true},{"one":"4b243a5aeabec6db0e4a80a9c255300cd94591a6fbe0e0aa170da4f6ce14edff","other":"027fb496438782583f78fb76999336eed7fb672a9c9ea50d04df580e6eb21377","up":true},{"one":"03907380afcd52238f3d84a8dee3df599c7f2f9b90fbc1271ee88bdb52acbd58","other":"26d1af1fbee6541a363ea7707825e37da028142f00779116560ad20f1de18e7b","up":true},{"one":"ad0d0dc5d4114ee4482d6c9bd4e46683327abf2b92df0d242d79019963876668","other":"b381e75e52e4cdd168056245f82d3a1747b67f400eb40eb12036b73ee7fe21e5","up":true},{"one":"1929a84bcd64bf002d0afb16249466c5b660123174a1fc1bf881913f8c87d1fd","other":"13bc64535d3ae495098e4ac6b30a91d1804dab0ab79944f2c6ac53c9bccdf62d","up":true},{"one":"38ab3d7bdfb293b88122404cb7c50b5fb890ce7664c075da95585557a430c403","other":"021811a6757bdcdd2fa0fb68401dfe009d5a8e129958cd304fb42cf51dc5d1d3","up":true},{"one":"e0ea575d0e2efa28bc51f49d1e2c24196a196da3b3196f3a5a26a5e310809af5","other":"f74ecde0bbaa7b6521fb205b5ab9ea637909277f6e1ee1d3490f5cd01d0f7216","up":true},{"one":"89c883d6a85472bda328667e3fd805c70876bc582ca6763ab97ae636b1772be4","other":"9e02c5384602a54e900cfa46d5987b77f16e74cba745ac850fcada01c7af9004","up":true},{"one":"f74ecde0bbaa7b6521fb205b5ab9ea637909277f6e1ee1d3490f5cd01d0f7216","other":"d6ffb7fd2668e9b7b133bd9144156f4736191ef0d6e72b072759782d83931f22","up":true},{"one":"aebd6135d10252b07f891b3a7330903faf13d409c4f7108630715fa0754f938e","other":"b381e75e52e4cdd168056245f82d3a1747b67f400eb40eb12036b73ee7fe21e5","up":true},{"one":"26d1af1fbee6541a363ea7707825e37da028142f00779116560ad20f1de18e7b","other":"027fb496438782583f78fb76999336eed7fb672a9c9ea50d04df580e6eb21377","up":true},{"one":"0bcf8a8ab0065ca8c85b8b6641f4c6e0b0de60e79ef32ebf6ff8f109ac4e1d70","other":"2a22dbee71a0ef27c840221db4a592d6dc8f171afed865ff814a37d633a3eaa9","up":true},{"one":"e0b1c4eb5b5b4dfc22344ee65cb9716cecb38dcc80099793f20641884eae4854","other":"f74ecde0bbaa7b6521fb205b5ab9ea637909277f6e1ee1d3490f5cd01d0f7216","up":true},{"one":"dc97c1a0019b482a048b8d15941dfe4c3c1a3443d9b2d7b4046370bc84a7e56f","other":"c3a1b301bf187fd8326831197d93a0266ac0cc8287b9008631240e2bec9cf337","up":true},{"one":"39dbd5462c90dac75f49d9af7996845943bbe929754ef8125eee7f5a763e9def","other":"2a22dbee71a0ef27c840221db4a592d6dc8f171afed865ff814a37d633a3eaa9","up":true},{"one":"8b76194f129308324c7d0066530e02cac2410ee0ba952822f0ec866e12461e44","other":"83dc556ed36f37d06765be2554fe86eaf1ec21e2931fb22403238453bf021dfb","up":true},{"one":"6e5c213a2db57eaf2e1e1acc341c72efab89b0e42b6cd18db4f99ac1af151d65","other":"539df902d42dc997c6b0e24d16ad68b54c557d56b41c972a320d57632dbfbe3c","up":true},{"one":"73b8d1840d0a8ffe69752ec96f8fddecb0e22726c87982d572ca9acc1c9cdbfc","other":"0bcf8a8ab0065ca8c85b8b6641f4c6e0b0de60e79ef32ebf6ff8f109ac4e1d70","up":true},{"one":"4cd0f38e52a508f81cf95e1370c994aea2d7a49a2a08e3e054f53629a6619410","other":"7cf4838a7c83a736ce59cfa1b974674a0185dbe17a8f3cd29794a3bbe814adee","up":true},{"one":"d2245f0679b436faabc0164e0b85e02e2effbad306e8229b555524a5e6d1a5f9","other":"cfbb9ea682becadeab10bbd080ba8e93510085a87ac519e434964faa222fc275","up":true},{"one":"d6ffb7fd2668e9b7b133bd9144156f4736191ef0d6e72b072759782d83931f22","other":"dfaeebc8e29c6a8f851b12b80cf42567cd2a43e35d977305a3c10e51bf41170a","up":true},{"one":"772e4c80d128deb52adf024a0eb6fe9bbea1c83351ed93f55f490cd5e5c69260","other":"edc8794153fb517085d27a83a4b00e8c3b37f22d2242b842cb2fab66764de9fe","up":true},{"one":"13bc64535d3ae495098e4ac6b30a91d1804dab0ab79944f2c6ac53c9bccdf62d","other":"027fb496438782583f78fb76999336eed7fb672a9c9ea50d04df580e6eb21377","up":true},{"one":"86ca1078dae40f23ae1b3ac47397460d9ec0bf243a0de372b405381d6722fcb2","other":"d2245f0679b436faabc0164e0b85e02e2effbad306e8229b555524a5e6d1a5f9","up":true},{"one":"9a9230b3f7f386520821dee78ebe92e8c64a4f6a50f2639327c62e45cab40563","other":"e16b12c708bc5e0545009daed44733c52d7450ccc797d158dd41a3bc9507b6be","up":true},{"one":"6d601952793589bc6b57340c451a6abf02ea2c16637e910eed04cde6eddfe17a","other":"48b614958a8692780ef5bd5c95e0db4ff67deb4de0dcbb878ca4479bfb86957e","up":true},{"one":"9d3c79e4a0ac4e5b95aa32545f3b8d86f74594faa237d5c2566cf02fbd60b11a","other":"e16b12c708bc5e0545009daed44733c52d7450ccc797d158dd41a3bc9507b6be","up":true},{"one":"0ab9845c2890b0a64a3e5932241245e00b817b788094f9ee48f86f80b7264fea","other":"1be4348ec5670cdc4f164d77b1356e7910b6d1be4a9b720e549d02e5482a9e78","up":true},{"one":"667ef042e9dae18694581e0404c3d87a09800e8b42173d26571c3bf97e29a372","other":"0bcf8a8ab0065ca8c85b8b6641f4c6e0b0de60e79ef32ebf6ff8f109ac4e1d70","up":true},{"one":"cfbb9ea682becadeab10bbd080ba8e93510085a87ac519e434964faa222fc275","other":"e16b12c708bc5e0545009daed44733c52d7450ccc797d158dd41a3bc9507b6be","up":true},{"one":"d0f398969480f3df3587f6d47546ff1261cad4d2e9c26ff3077e35ae1b26153e","other":"26d1af1fbee6541a363ea7707825e37da028142f00779116560ad20f1de18e7b","up":true},{"one":"7cf4838a7c83a736ce59cfa1b974674a0185dbe17a8f3cd29794a3bbe814adee","other":"0ff67b0e9ec6509c7786495b7b3ddb176b4f8221ff300f409f00a3d389e8874c","up":true},{"one":"7fbc1843e2222e3c8e35a3215d1bbb4d5457d8b9ed33749e07e22f25ba9ee576","other":"0ff67b0e9ec6509c7786495b7b3ddb176b4f8221ff300f409f00a3d389e8874c","up":true},{"one":"a085045c335ce2e47dbdfeb1adb62ce6c3bed36a93cf3448c45757a1a88e295d","other":"d2245f0679b436faabc0164e0b85e02e2effbad306e8229b555524a5e6d1a5f9","up":true},{"one":"cdcd165721f6851f361fad0b3ba88c8870be9ad6d6b8cbcecc7c89e1068d979a","other":"db088103f3b6f2c784d76ecd99c8b4a77fd39bb39c72ddfd91c99c1a9dd3b75b","up":true},{"one":"f36084048bf0ff985a77f5183796f7b37b7085ee6eea8bbc5fc62558854cce67","other":"8be461203f5ebb5721348f537b37d768f7bd359af3e18d1f7e9af2f901c49845","up":true},{"one":"47c3e0dfbbfcebeece78865c8c989577360cd9cc46a3b43f4b7b01ed14dc30e6","other":"4167946de250b013e1be16ee84bfe2ccaae83e699e618b38f31016c4e431e6ba","up":true},{"one":"ce99e9d37111c52e929b187fe201790b1a555dfb8b6b6de54e94df7cc2d43fd4","other":"f36084048bf0ff985a77f5183796f7b37b7085ee6eea8bbc5fc62558854cce67","up":true},{"one":"4167946de250b013e1be16ee84bfe2ccaae83e699e618b38f31016c4e431e6ba","other":"419a6626dd026c0438461592121992c6be1868375011655b6d405166cd8edf7f","up":true},{"one":"3ee4b20c047e701b58c06fcc8160364bd29573f61f4d9f1935d77ac29f6a1e86","other":"6c029114a9f73d69a42e591cf2d13107eff038d3eda8abb0242d9d6d169f05c7","up":true},{"one":"cec3c01c147b34f25104ddd0b25076cef63ac224eada9d9f5a00b8513331354f","other":"cbc5d42951bc6e187296b5f8ce4d04e472e26670a62851f39d65f31c50865f6a","up":true},{"one":"109ef17c890104bfc5a4897d526a0afaa8c991c9d213616032f3058d0feb7f00","other":"213bf6e78e02a57585908c756f0965297152c3c400a0ed4c407a411e1ec5942d","up":true},{"one":"667ef042e9dae18694581e0404c3d87a09800e8b42173d26571c3bf97e29a372","other":"0ab9845c2890b0a64a3e5932241245e00b817b788094f9ee48f86f80b7264fea","up":true},{"one":"7639f9a66e8ff70f554c346faa25f78140957c295b748fc42a12df7972f4fcc6","other":"419a6626dd026c0438461592121992c6be1868375011655b6d405166cd8edf7f","up":true},{"one":"962676818c17fae1ffc52fc29318c44f9b8c980afd6d3e98217b4088d568a808","other":"895bdcd200cc4d7ec5c24f1722d0a8ebedda78b78cdf1ccc8c22a981980f5786","up":true},{"one":"b2b9ac0f4db58886597af7b19d6150498ac8ad7c804671628aa34384b8fe505e","other":"b8411f198fd658c5a2028835c0af3342145839c06c8a4f382d9f9de485d46c08","up":true},{"one":"afa3de5cebc9f96cf20a35058f4856fe43b48ac59cf8e46565f194f438622a52","other":"e16b12c708bc5e0545009daed44733c52d7450ccc797d158dd41a3bc9507b6be","up":true},{"one":"517aa977048247d5d16ad51a286ffac4d8f910733f0578b222201308c32d195e","other":"772e4c80d128deb52adf024a0eb6fe9bbea1c83351ed93f55f490cd5e5c69260","up":true},{"one":"6742cca1b7783fcbed8d0b340508f93cc4dfaca8ff3f13fd59354486c4d62993","other":"48b614958a8692780ef5bd5c95e0db4ff67deb4de0dcbb878ca4479bfb86957e","up":true},{"one":"b8e1a80d91216fd5f8bc3f7413caf68ade7f124354d44fe7bd155a089134a70a","other":"a7a61804d270ed6c27a4b1e8a634c30d7cdbaf644a1c67cbc6b08cd849a711db","up":true},{"one":"91eba9f9c8f2929d38f43a0c7efa809c0d2d59a31cbf2760c90e73d20266d528","other":"b381e75e52e4cdd168056245f82d3a1747b67f400eb40eb12036b73ee7fe21e5","up":true},{"one":"9e02c5384602a54e900cfa46d5987b77f16e74cba745ac850fcada01c7af9004","other":"b70e96f01ac8947d2de6320412ae3310316caba65c27108ad16b2f2004255be4","up":true},{"one":"042788d5b72cb84a375565d120d239a2b14fdf38b3f5f992284d78535077148a","other":"06b95f1bac76ca4925d509b06216f2113ac5dcf051ef5aa0a320ae64069e0b6d","up":true},{"one":"7355fab10584e4312f5cb5c3c826e7f9c14da74d62d07d0a8007ce9c6e995be9","other":"698247d103a8925d8bb4c56a3056e49c5efc595fced1c89d49943bb9ba01f394","up":true},{"one":"018adc613f78d6ec876274f821251fd049eb3651646cd69e27efe211fe88d936","other":"1be4348ec5670cdc4f164d77b1356e7910b6d1be4a9b720e549d02e5482a9e78","up":true},{"one":"3cb1b4069727dc323a687cab4ca2764f6415450488706f1b97c5cb8ca46346ff","other":"0ab9845c2890b0a64a3e5932241245e00b817b788094f9ee48f86f80b7264fea","up":true},{"one":"2434c63e7f28b83e7feede7fe68ea99b989f8534f64d63b046733e2f474538f5","other":"39dbd5462c90dac75f49d9af7996845943bbe929754ef8125eee7f5a763e9def","up":true},{"one":"ca036d1ef9e6ce3654f2d769f16926aa14957193586426489e15539dfa8f7763","other":"ea60ef7cb3f2166a5c8e286c885984943a2ea5aff4730015be6a15031040cecf","up":true},{"one":"ed32d74d9be0649de1eb26b9915137fe46ec890c656c96be52e966ab6e2ed260","other":"f36120ff250b9e7164e96021479332054f67de65cd2fe5b6e34bc51d0fe4d29c","up":true},{"one":"8be461203f5ebb5721348f537b37d768f7bd359af3e18d1f7e9af2f901c49845","other":"9d3c79e4a0ac4e5b95aa32545f3b8d86f74594faa237d5c2566cf02fbd60b11a","up":true},{"one":"7cf4838a7c83a736ce59cfa1b974674a0185dbe17a8f3cd29794a3bbe814adee","other":"3e56d4533ec14f6656e1eb25fb35dad47c9db479f667a6b6fe9a3aa8c12e982e","up":true},{"one":"7dc5e8d8180c1bc7ebbee11a47fc96e8fe8b2d71c30cbc4aa1cf99e8eb6afcac","other":"539df902d42dc997c6b0e24d16ad68b54c557d56b41c972a320d57632dbfbe3c","up":true},{"one":"419a6626dd026c0438461592121992c6be1868375011655b6d405166cd8edf7f","other":"698247d103a8925d8bb4c56a3056e49c5efc595fced1c89d49943bb9ba01f394","up":true},{"one":"772e4c80d128deb52adf024a0eb6fe9bbea1c83351ed93f55f490cd5e5c69260","other":"757a557424c33ad89efd8185ec18d71c025830ecb2aed951e33c8c8d986d5933","up":true},{"one":"5a01993ff7b4bd12fdb259e96b26a036d0cf5d4ae9c9b516be64b63acec2443a","other":"6c82fdabd09e0e9d0fc507613a05951c02b2953d763a062a5f32aaf5cc477c19","up":true},{"one":"b8411f198fd658c5a2028835c0af3342145839c06c8a4f382d9f9de485d46c08","other":"aebd6135d10252b07f891b3a7330903faf13d409c4f7108630715fa0754f938e","up":true},{"one":"ea60ef7cb3f2166a5c8e286c885984943a2ea5aff4730015be6a15031040cecf","other":"f36120ff250b9e7164e96021479332054f67de65cd2fe5b6e34bc51d0fe4d29c","up":true},{"one":"b381e75e52e4cdd168056245f82d3a1747b67f400eb40eb12036b73ee7fe21e5","other":"6742cca1b7783fcbed8d0b340508f93cc4dfaca8ff3f13fd59354486c4d62993","up":true},{"one":"ea0e1dd41fe042b09f273c98f02128949cf5561d20dc04b3d423961efed52327","other":"f36120ff250b9e7164e96021479332054f67de65cd2fe5b6e34bc51d0fe4d29c","up":true},{"one":"b70e96f01ac8947d2de6320412ae3310316caba65c27108ad16b2f2004255be4","other":"ad0d0dc5d4114ee4482d6c9bd4e46683327abf2b92df0d242d79019963876668","up":true},{"one":"d6ffb7fd2668e9b7b133bd9144156f4736191ef0d6e72b072759782d83931f22","other":"cfbb9ea682becadeab10bbd080ba8e93510085a87ac519e434964faa222fc275","up":true},{"one":"cfbb9ea682becadeab10bbd080ba8e93510085a87ac519e434964faa222fc275","other":"e55d8cdb7e7940b11929e7e5c949ef6beb7998e5180a1f0a3c0bf61aef39f1b8","up":true},{"one":"3e56d4533ec14f6656e1eb25fb35dad47c9db479f667a6b6fe9a3aa8c12e982e","other":"2459fe9250b3311c86530d00b7a9b8ba57b1b5151c126262e70c55d1e8d37924","up":true},{"one":"286aeba646bba4a8aa1c372bee9f2c9ff0a2b3abb4f18be321225555c6dce4e5","other":"ce99e9d37111c52e929b187fe201790b1a555dfb8b6b6de54e94df7cc2d43fd4","up":true},{"one":"cbc5d42951bc6e187296b5f8ce4d04e472e26670a62851f39d65f31c50865f6a","other":"d0f398969480f3df3587f6d47546ff1261cad4d2e9c26ff3077e35ae1b26153e","up":true},{"one":"4cd0f38e52a508f81cf95e1370c994aea2d7a49a2a08e3e054f53629a6619410","other":"48b614958a8692780ef5bd5c95e0db4ff67deb4de0dcbb878ca4479bfb86957e","up":true},{"one":"86ca1078dae40f23ae1b3ac47397460d9ec0bf243a0de372b405381d6722fcb2","other":"ce99e9d37111c52e929b187fe201790b1a555dfb8b6b6de54e94df7cc2d43fd4","up":true},{"one":"6d601952793589bc6b57340c451a6abf02ea2c16637e910eed04cde6eddfe17a","other":"4b243a5aeabec6db0e4a80a9c255300cd94591a6fbe0e0aa170da4f6ce14edff","up":true},{"one":"ce99e9d37111c52e929b187fe201790b1a555dfb8b6b6de54e94df7cc2d43fd4","other":"ebca518e5146f49ac75bcaa8add2ef4d1d22c5cfd2e2326c6b41826d45ce55ae","up":true},{"one":"3cb1b4069727dc323a687cab4ca2764f6415450488706f1b97c5cb8ca46346ff","other":"027fb496438782583f78fb76999336eed7fb672a9c9ea50d04df580e6eb21377","up":true},{"one":"e16b12c708bc5e0545009daed44733c52d7450ccc797d158dd41a3bc9507b6be","other":"c3a1b301bf187fd8326831197d93a0266ac0cc8287b9008631240e2bec9cf337","up":true},{"one":"dc97c1a0019b482a048b8d15941dfe4c3c1a3443d9b2d7b4046370bc84a7e56f","other":"cfbb9ea682becadeab10bbd080ba8e93510085a87ac519e434964faa222fc275","up":true},{"one":"621076ce6b82e70c90a4adf235aa6f71b116e302dd6b15dcae07f4a816012455","other":"7639f9a66e8ff70f554c346faa25f78140957c295b748fc42a12df7972f4fcc6","up":true},{"one":"f74ecde0bbaa7b6521fb205b5ab9ea637909277f6e1ee1d3490f5cd01d0f7216","other":"dc97c1a0019b482a048b8d15941dfe4c3c1a3443d9b2d7b4046370bc84a7e56f","up":true},{"one":"d0f398969480f3df3587f6d47546ff1261cad4d2e9c26ff3077e35ae1b26153e","other":"38ab3d7bdfb293b88122404cb7c50b5fb890ce7664c075da95585557a430c403","up":true},{"one":"372d47374a57d18cf134a1f8fc2d2fc10dfacfc0be9ed883183a349c896b3793","other":"2a22dbee71a0ef27c840221db4a592d6dc8f171afed865ff814a37d633a3eaa9","up":true},{"one":"021811a6757bdcdd2fa0fb68401dfe009d5a8e129958cd304fb42cf51dc5d1d3","other":"213bf6e78e02a57585908c756f0965297152c3c400a0ed4c407a411e1ec5942d","up":true},{"one":"0ff67b0e9ec6509c7786495b7b3ddb176b4f8221ff300f409f00a3d389e8874c","other":"a7a61804d270ed6c27a4b1e8a634c30d7cdbaf644a1c67cbc6b08cd849a711db","up":true},{"one":"9d3c79e4a0ac4e5b95aa32545f3b8d86f74594faa237d5c2566cf02fbd60b11a","other":"957d8a9b412b6f4cd151cbc07b8d74d949880ae665c545debb18181389c99ee6","up":true},{"one":"e0b1c4eb5b5b4dfc22344ee65cb9716cecb38dcc80099793f20641884eae4854","other":"f36120ff250b9e7164e96021479332054f67de65cd2fe5b6e34bc51d0fe4d29c","up":true},{"one":"e77f6aa9e3dfcce0a2e5db794703224249aba60595075b2df9a5b0b30855cf46","other":"edc8794153fb517085d27a83a4b00e8c3b37f22d2242b842cb2fab66764de9fe","up":true},{"one":"4b243a5aeabec6db0e4a80a9c255300cd94591a6fbe0e0aa170da4f6ce14edff","other":"539df902d42dc997c6b0e24d16ad68b54c557d56b41c972a320d57632dbfbe3c","up":true},{"one":"1be4348ec5670cdc4f164d77b1356e7910b6d1be4a9b720e549d02e5482a9e78","other":"2434c63e7f28b83e7feede7fe68ea99b989f8534f64d63b046733e2f474538f5","up":true},{"one":"0bcf8a8ab0065ca8c85b8b6641f4c6e0b0de60e79ef32ebf6ff8f109ac4e1d70","other":"372d47374a57d18cf134a1f8fc2d2fc10dfacfc0be9ed883183a349c896b3793","up":true},{"one":"2459fe9250b3311c86530d00b7a9b8ba57b1b5151c126262e70c55d1e8d37924","other":"13bc64535d3ae495098e4ac6b30a91d1804dab0ab79944f2c6ac53c9bccdf62d","up":true},{"one":"b2b9ac0f4db58886597af7b19d6150498ac8ad7c804671628aa34384b8fe505e","other":"f5c4d28df5973ec0292221a875e8446323f339409d93f0f7385990126908a3c3","up":true},{"one":"9a9230b3f7f386520821dee78ebe92e8c64a4f6a50f2639327c62e45cab40563","other":"b2b9ac0f4db58886597af7b19d6150498ac8ad7c804671628aa34384b8fe505e","up":true},{"one":"cec3c01c147b34f25104ddd0b25076cef63ac224eada9d9f5a00b8513331354f","other":"ca036d1ef9e6ce3654f2d769f16926aa14957193586426489e15539dfa8f7763","up":true},{"one":"6c029114a9f73d69a42e591cf2d13107eff038d3eda8abb0242d9d6d169f05c7","other":"7b9242137f8cc2bec7b3e0003fd93026921ceb10dfadbbd5b6aa64d61a74f35e","up":true},{"one":"3e56d4533ec14f6656e1eb25fb35dad47c9db479f667a6b6fe9a3aa8c12e982e","other":"26d1af1fbee6541a363ea7707825e37da028142f00779116560ad20f1de18e7b","up":true},{"one":"57764522162620c1ad0b166a9c43772255d0cc01e49f2122ef09db046804a570","other":"7cf4838a7c83a736ce59cfa1b974674a0185dbe17a8f3cd29794a3bbe814adee","up":true},{"one":"a75abd0dce5a488b7e06f91fab7a92ec428ab21bde9372c9e8fa489f48e7b3fe","other":"895bdcd200cc4d7ec5c24f1722d0a8ebedda78b78cdf1ccc8c22a981980f5786","up":true},{"one":"dfaeebc8e29c6a8f851b12b80cf42567cd2a43e35d977305a3c10e51bf41170a","other":"cdcd165721f6851f361fad0b3ba88c8870be9ad6d6b8cbcecc7c89e1068d979a","up":true},{"one":"67288f84ada7778858139c74917b22ae698ed43df49a6530a566648f074ede46","other":"698247d103a8925d8bb4c56a3056e49c5efc595fced1c89d49943bb9ba01f394","up":true},{"one":"b2b9ac0f4db58886597af7b19d6150498ac8ad7c804671628aa34384b8fe505e","other":"aebd6135d10252b07f891b3a7330903faf13d409c4f7108630715fa0754f938e","up":true},{"one":"03907380afcd52238f3d84a8dee3df599c7f2f9b90fbc1271ee88bdb52acbd58","other":"3cb1b4069727dc323a687cab4ca2764f6415450488706f1b97c5cb8ca46346ff","up":true},{"one":"1929a84bcd64bf002d0afb16249466c5b660123174a1fc1bf881913f8c87d1fd","other":"e0b1c4eb5b5b4dfc22344ee65cb9716cecb38dcc80099793f20641884eae4854","up":true},{"one":"9a9230b3f7f386520821dee78ebe92e8c64a4f6a50f2639327c62e45cab40563","other":"b92a71a4fc371e0596538a7fb2a33e85329c39c4409c99798d9318bc263a04a1","up":true},{"one":"86ca1078dae40f23ae1b3ac47397460d9ec0bf243a0de372b405381d6722fcb2","other":"aebd6135d10252b07f891b3a7330903faf13d409c4f7108630715fa0754f938e","up":true},{"one":"13bc64535d3ae495098e4ac6b30a91d1804dab0ab79944f2c6ac53c9bccdf62d","other":"0bcf8a8ab0065ca8c85b8b6641f4c6e0b0de60e79ef32ebf6ff8f109ac4e1d70","up":true},{"one":"0ab9845c2890b0a64a3e5932241245e00b817b788094f9ee48f86f80b7264fea","other":"1929a84bcd64bf002d0afb16249466c5b660123174a1fc1bf881913f8c87d1fd","up":true},{"one":"41b9ee7ad19698e97589b059ad3333cb64f02c16006d94fb3d0bad7ced8ff238","other":"57764522162620c1ad0b166a9c43772255d0cc01e49f2122ef09db046804a570","up":true},{"one":"26d1af1fbee6541a363ea7707825e37da028142f00779116560ad20f1de18e7b","other":"2459fe9250b3311c86530d00b7a9b8ba57b1b5151c126262e70c55d1e8d37924","up":true},{"one":"db088103f3b6f2c784d76ecd99c8b4a77fd39bb39c72ddfd91c99c1a9dd3b75b","other":"dfaeebc8e29c6a8f851b12b80cf42567cd2a43e35d977305a3c10e51bf41170a","up":true},{"one":"5abc96f4fa78812db6fb710fd424dd474145f7e5d00b4cedc5373b4c52f42cf5","other":"645b4e6b36fc1928725f627aeed278f46c5a7d6b0fff7ccff55a0468d47b23e8","up":true},{"one":"4167946de250b013e1be16ee84bfe2ccaae83e699e618b38f31016c4e431e6ba","other":"6c82fdabd09e0e9d0fc507613a05951c02b2953d763a062a5f32aaf5cc477c19","up":true},{"one":"6e5c213a2db57eaf2e1e1acc341c72efab89b0e42b6cd18db4f99ac1af151d65","other":"5a01993ff7b4bd12fdb259e96b26a036d0cf5d4ae9c9b516be64b63acec2443a","up":true},{"one":"1be4348ec5670cdc4f164d77b1356e7910b6d1be4a9b720e549d02e5482a9e78","other":"645b4e6b36fc1928725f627aeed278f46c5a7d6b0fff7ccff55a0468d47b23e8","up":true},{"one":"7b9242137f8cc2bec7b3e0003fd93026921ceb10dfadbbd5b6aa64d61a74f35e","other":"67288f84ada7778858139c74917b22ae698ed43df49a6530a566648f074ede46","up":true},{"one":"b486ce31ce880db3aaa17a0ac2c2f3554b6fe71f9c051edb572974342af4adb9","other":"ae67fae4990da61ca89221c5b1675c992babb4d715b59939e47bd1491b3bf1f4","up":true},{"one":"621076ce6b82e70c90a4adf235aa6f71b116e302dd6b15dcae07f4a816012455","other":"73b8d1840d0a8ffe69752ec96f8fddecb0e22726c87982d572ca9acc1c9cdbfc","up":true},{"one":"b92a71a4fc371e0596538a7fb2a33e85329c39c4409c99798d9318bc263a04a1","other":"a2babe49410ae007bc41ff2b7deaf709ed849e2f69666ce5aae76a3b71f47081","up":true},{"one":"38ab3d7bdfb293b88122404cb7c50b5fb890ce7664c075da95585557a430c403","other":"0ab9845c2890b0a64a3e5932241245e00b817b788094f9ee48f86f80b7264fea","up":true},{"one":"a085045c335ce2e47dbdfeb1adb62ce6c3bed36a93cf3448c45757a1a88e295d","other":"b8411f198fd658c5a2028835c0af3342145839c06c8a4f382d9f9de485d46c08","up":true},{"one":"734e029ed25485edd49b93dd9e85b6e7657f860e4ded4bc8a5094f512ae5836b","other":"4b243a5aeabec6db0e4a80a9c255300cd94591a6fbe0e0aa170da4f6ce14edff","up":true},{"one":"d0f398969480f3df3587f6d47546ff1261cad4d2e9c26ff3077e35ae1b26153e","other":"c3a1b301bf187fd8326831197d93a0266ac0cc8287b9008631240e2bec9cf337","up":true},{"one":"7fbc1843e2222e3c8e35a3215d1bbb4d5457d8b9ed33749e07e22f25ba9ee576","other":"3e56d4533ec14f6656e1eb25fb35dad47c9db479f667a6b6fe9a3aa8c12e982e","up":true},{"one":"cbc5d42951bc6e187296b5f8ce4d04e472e26670a62851f39d65f31c50865f6a","other":"d2245f0679b436faabc0164e0b85e02e2effbad306e8229b555524a5e6d1a5f9","up":true},{"one":"7fbc1843e2222e3c8e35a3215d1bbb4d5457d8b9ed33749e07e22f25ba9ee576","other":"41b9ee7ad19698e97589b059ad3333cb64f02c16006d94fb3d0bad7ced8ff238","up":true},{"one":"47c3e0dfbbfcebeece78865c8c989577360cd9cc46a3b43f4b7b01ed14dc30e6","other":"41b9ee7ad19698e97589b059ad3333cb64f02c16006d94fb3d0bad7ced8ff238","up":true},{"one":"06b95f1bac76ca4925d509b06216f2113ac5dcf051ef5aa0a320ae64069e0b6d","other":"b8e1a80d91216fd5f8bc3f7413caf68ade7f124354d44fe7bd155a089134a70a","up":true},{"one":"edc8794153fb517085d27a83a4b00e8c3b37f22d2242b842cb2fab66764de9fe","other":"c8e5a1b4533dd0de12acee4d31369f39785178568718b93bbc321ec83e0714f0","up":true},{"one":"b486ce31ce880db3aaa17a0ac2c2f3554b6fe71f9c051edb572974342af4adb9","other":"b16dcdf1ff1a56d49e374531d9885d59c1bcfbb628604520d9b1d84662edb9ca","up":true},{"one":"57764522162620c1ad0b166a9c43772255d0cc01e49f2122ef09db046804a570","other":"7f87da7ee55b4c8c8f9d55411ff88d3a0b63bfee6a516917d49fa6273fb5b86a","up":true},{"one":"645b4e6b36fc1928725f627aeed278f46c5a7d6b0fff7ccff55a0468d47b23e8","other":"6e5c213a2db57eaf2e1e1acc341c72efab89b0e42b6cd18db4f99ac1af151d65","up":true},{"one":"f410d4ac9b748c24fa0d48c3053bb1cea8a67d0bcc4e5fcbdb261c0c7522cc34","other":"ebca518e5146f49ac75bcaa8add2ef4d1d22c5cfd2e2326c6b41826d45ce55ae","up":true},{"one":"3ee4b20c047e701b58c06fcc8160364bd29573f61f4d9f1935d77ac29f6a1e86","other":"6d601952793589bc6b57340c451a6abf02ea2c16637e910eed04cde6eddfe17a","up":true},{"one":"dc97c1a0019b482a048b8d15941dfe4c3c1a3443d9b2d7b4046370bc84a7e56f","other":"d0f398969480f3df3587f6d47546ff1261cad4d2e9c26ff3077e35ae1b26153e","up":true},{"one":"f5c4d28df5973ec0292221a875e8446323f339409d93f0f7385990126908a3c3","other":"c3a1b301bf187fd8326831197d93a0266ac0cc8287b9008631240e2bec9cf337","up":true},{"one":"0ab9845c2890b0a64a3e5932241245e00b817b788094f9ee48f86f80b7264fea","other":"2a22dbee71a0ef27c840221db4a592d6dc8f171afed865ff814a37d633a3eaa9","up":true},{"one":"ca036d1ef9e6ce3654f2d769f16926aa14957193586426489e15539dfa8f7763","other":"ebca518e5146f49ac75bcaa8add2ef4d1d22c5cfd2e2326c6b41826d45ce55ae","up":true},{"one":"8cf957bf95a629c60c31dbcfe75ecca149a81c761f8b34858b04f8318e5c74bd","other":"f5c4d28df5973ec0292221a875e8446323f339409d93f0f7385990126908a3c3","up":true},{"one":"82f034db88fd26b47c26b95c3f87a1f454ffe4526ae86beb2bb1d8f2c218c25c","other":"8be461203f5ebb5721348f537b37d768f7bd359af3e18d1f7e9af2f901c49845","up":true},{"one":"7f87da7ee55b4c8c8f9d55411ff88d3a0b63bfee6a516917d49fa6273fb5b86a","other":"2434c63e7f28b83e7feede7fe68ea99b989f8534f64d63b046733e2f474538f5","up":true},{"one":"92a1501ed41e29bb7dd8eb4b4acecae983f4c7c83f39895cd68f7810b645f1dd","other":"82f034db88fd26b47c26b95c3f87a1f454ffe4526ae86beb2bb1d8f2c218c25c","up":true},{"one":"7b9242137f8cc2bec7b3e0003fd93026921ceb10dfadbbd5b6aa64d61a74f35e","other":"757a557424c33ad89efd8185ec18d71c025830ecb2aed951e33c8c8d986d5933","up":true},{"one":"2434c63e7f28b83e7feede7fe68ea99b989f8534f64d63b046733e2f474538f5","other":"213bf6e78e02a57585908c756f0965297152c3c400a0ed4c407a411e1ec5942d","up":true},{"one":"78cbc19a24d095ab7858849058c65c061c52289b91ddd92cee34bed98aee4a59","other":"2434c63e7f28b83e7feede7fe68ea99b989f8534f64d63b046733e2f474538f5","up":true},{"one":"ea0e1dd41fe042b09f273c98f02128949cf5561d20dc04b3d423961efed52327","other":"e0ea575d0e2efa28bc51f49d1e2c24196a196da3b3196f3a5a26a5e310809af5","up":true},{"one":"7355fab10584e4312f5cb5c3c826e7f9c14da74d62d07d0a8007ce9c6e995be9","other":"6d601952793589bc6b57340c451a6abf02ea2c16637e910eed04cde6eddfe17a","up":true},{"one":"018adc613f78d6ec876274f821251fd049eb3651646cd69e27efe211fe88d936","other":"0ab9845c2890b0a64a3e5932241245e00b817b788094f9ee48f86f80b7264fea","up":true},{"one":"c8e5a1b4533dd0de12acee4d31369f39785178568718b93bbc321ec83e0714f0","other":"ebca518e5146f49ac75bcaa8add2ef4d1d22c5cfd2e2326c6b41826d45ce55ae","up":true},{"one":"b92a71a4fc371e0596538a7fb2a33e85329c39c4409c99798d9318bc263a04a1","other":"b381e75e52e4cdd168056245f82d3a1747b67f400eb40eb12036b73ee7fe21e5","up":true},{"one":"39dbd5462c90dac75f49d9af7996845943bbe929754ef8125eee7f5a763e9def","other":"213bf6e78e02a57585908c756f0965297152c3c400a0ed4c407a411e1ec5942d","up":true},{"one":"edc8794153fb517085d27a83a4b00e8c3b37f22d2242b842cb2fab66764de9fe","other":"cdcd165721f6851f361fad0b3ba88c8870be9ad6d6b8cbcecc7c89e1068d979a","up":true},{"one":"afa3de5cebc9f96cf20a35058f4856fe43b48ac59cf8e46565f194f438622a52","other":"8cf957bf95a629c60c31dbcfe75ecca149a81c761f8b34858b04f8318e5c74bd","up":true},{"one":"86ca1078dae40f23ae1b3ac47397460d9ec0bf243a0de372b405381d6722fcb2","other":"a7a61804d270ed6c27a4b1e8a634c30d7cdbaf644a1c67cbc6b08cd849a711db","up":true},{"one":"558eb021744be19383be9ac91b9f77e07479e0eb25576bd32a3afaa94c231178","other":"757a557424c33ad89efd8185ec18d71c025830ecb2aed951e33c8c8d986d5933","up":true},{"one":"9d3c79e4a0ac4e5b95aa32545f3b8d86f74594faa237d5c2566cf02fbd60b11a","other":"8cf957bf95a629c60c31dbcfe75ecca149a81c761f8b34858b04f8318e5c74bd","up":true},{"one":"6ecb11fc5acc16ecd70351410fa18ec44a2a83d9e778cf25b85a7535493456b7","other":"757a557424c33ad89efd8185ec18d71c025830ecb2aed951e33c8c8d986d5933","up":true},{"one":"7f87da7ee55b4c8c8f9d55411ff88d3a0b63bfee6a516917d49fa6273fb5b86a","other":"5d608e66a17442091111cb472723fe3aea1f2baecaa546b57d49507c63a61cda","up":true},{"one":"89c883d6a85472bda328667e3fd805c70876bc582ca6763ab97ae636b1772be4","other":"962676818c17fae1ffc52fc29318c44f9b8c980afd6d3e98217b4088d568a808","up":true},{"one":"67288f84ada7778858139c74917b22ae698ed43df49a6530a566648f074ede46","other":"6ecb11fc5acc16ecd70351410fa18ec44a2a83d9e778cf25b85a7535493456b7","up":true},{"one":"47c3e0dfbbfcebeece78865c8c989577360cd9cc46a3b43f4b7b01ed14dc30e6","other":"57764522162620c1ad0b166a9c43772255d0cc01e49f2122ef09db046804a570","up":true},{"one":"5a01993ff7b4bd12fdb259e96b26a036d0cf5d4ae9c9b516be64b63acec2443a","other":"645b4e6b36fc1928725f627aeed278f46c5a7d6b0fff7ccff55a0468d47b23e8","up":true},{"one":"48b614958a8692780ef5bd5c95e0db4ff67deb4de0dcbb878ca4479bfb86957e","other":"4b243a5aeabec6db0e4a80a9c255300cd94591a6fbe0e0aa170da4f6ce14edff","up":true},{"one":"7cf4838a7c83a736ce59cfa1b974674a0185dbe17a8f3cd29794a3bbe814adee","other":"41b9ee7ad19698e97589b059ad3333cb64f02c16006d94fb3d0bad7ced8ff238","up":true},{"one":"b8e1a80d91216fd5f8bc3f7413caf68ade7f124354d44fe7bd155a089134a70a","other":"9ee7b3e06b453615cbd8737cb74515b150f518f1a2eaa2db90e54708dd161b7d","up":true},{"one":"78cbc19a24d095ab7858849058c65c061c52289b91ddd92cee34bed98aee4a59","other":"286aeba646bba4a8aa1c372bee9f2c9ff0a2b3abb4f18be321225555c6dce4e5","up":true},{"one":"621076ce6b82e70c90a4adf235aa6f71b116e302dd6b15dcae07f4a816012455","other":"7b9242137f8cc2bec7b3e0003fd93026921ceb10dfadbbd5b6aa64d61a74f35e","up":true},{"one":"372d47374a57d18cf134a1f8fc2d2fc10dfacfc0be9ed883183a349c896b3793","other":"38ab3d7bdfb293b88122404cb7c50b5fb890ce7664c075da95585557a430c403","up":true},{"one":"c8e5a1b4533dd0de12acee4d31369f39785178568718b93bbc321ec83e0714f0","other":"ea60ef7cb3f2166a5c8e286c885984943a2ea5aff4730015be6a15031040cecf","up":true},{"one":"7f87da7ee55b4c8c8f9d55411ff88d3a0b63bfee6a516917d49fa6273fb5b86a","other":"286aeba646bba4a8aa1c372bee9f2c9ff0a2b3abb4f18be321225555c6dce4e5","up":true},{"one":"a3205c1c4f9b72814f0db68e888e3c7ef88f27c681ed0d731dde5f0999f92ccc","other":"83dc556ed36f37d06765be2554fe86eaf1ec21e2931fb22403238453bf021dfb","up":true},{"one":"957d8a9b412b6f4cd151cbc07b8d74d949880ae665c545debb18181389c99ee6","other":"9a9230b3f7f386520821dee78ebe92e8c64a4f6a50f2639327c62e45cab40563","up":true},{"one":"6d601952793589bc6b57340c451a6abf02ea2c16637e910eed04cde6eddfe17a","other":"5abc96f4fa78812db6fb710fd424dd474145f7e5d00b4cedc5373b4c52f42cf5","up":true},{"one":"b70e96f01ac8947d2de6320412ae3310316caba65c27108ad16b2f2004255be4","other":"a7a61804d270ed6c27a4b1e8a634c30d7cdbaf644a1c67cbc6b08cd849a711db","up":true},{"one":"213bf6e78e02a57585908c756f0965297152c3c400a0ed4c407a411e1ec5942d","other":"8b76194f129308324c7d0066530e02cac2410ee0ba952822f0ec866e12461e44","up":true},{"one":"c18105aa302a43e352d999745a0f806af9f8cb8bb83349357da5c85e8975acd1","other":"f74ecde0bbaa7b6521fb205b5ab9ea637909277f6e1ee1d3490f5cd01d0f7216","up":true},{"one":"a75abd0dce5a488b7e06f91fab7a92ec428ab21bde9372c9e8fa489f48e7b3fe","other":"9a9230b3f7f386520821dee78ebe92e8c64a4f6a50f2639327c62e45cab40563","up":true},{"one":"6c82fdabd09e0e9d0fc507613a05951c02b2953d763a062a5f32aaf5cc477c19","other":"57764522162620c1ad0b166a9c43772255d0cc01e49f2122ef09db046804a570","up":true},{"one":"a75abd0dce5a488b7e06f91fab7a92ec428ab21bde9372c9e8fa489f48e7b3fe","other":"89c883d6a85472bda328667e3fd805c70876bc582ca6763ab97ae636b1772be4","up":true},{"one":"a2babe49410ae007bc41ff2b7deaf709ed849e2f69666ce5aae76a3b71f47081","other":"b381e75e52e4cdd168056245f82d3a1747b67f400eb40eb12036b73ee7fe21e5","up":true},{"one":"962676818c17fae1ffc52fc29318c44f9b8c980afd6d3e98217b4088d568a808","other":"8b76194f129308324c7d0066530e02cac2410ee0ba952822f0ec866e12461e44","up":true},{"one":"9e02c5384602a54e900cfa46d5987b77f16e74cba745ac850fcada01c7af9004","other":"8b76194f129308324c7d0066530e02cac2410ee0ba952822f0ec866e12461e44","up":true},{"one":"c18105aa302a43e352d999745a0f806af9f8cb8bb83349357da5c85e8975acd1","other":"f36120ff250b9e7164e96021479332054f67de65cd2fe5b6e34bc51d0fe4d29c","up":true},{"one":"0ff67b0e9ec6509c7786495b7b3ddb176b4f8221ff300f409f00a3d389e8874c","other":"2459fe9250b3311c86530d00b7a9b8ba57b1b5151c126262e70c55d1e8d37924","up":true},{"one":"9e02c5384602a54e900cfa46d5987b77f16e74cba745ac850fcada01c7af9004","other":"afa3de5cebc9f96cf20a35058f4856fe43b48ac59cf8e46565f194f438622a52","up":true},{"one":"026d2e41b82d506da685a30cce7cc5772f6c1e167b7d557e0531fb9b79dd4ff2","other":"0ab9845c2890b0a64a3e5932241245e00b817b788094f9ee48f86f80b7264fea","up":true},{"one":"89c883d6a85472bda328667e3fd805c70876bc582ca6763ab97ae636b1772be4","other":"8b76194f129308324c7d0066530e02cac2410ee0ba952822f0ec866e12461e44","up":true},{"one":"286aeba646bba4a8aa1c372bee9f2c9ff0a2b3abb4f18be321225555c6dce4e5","other":"3e56d4533ec14f6656e1eb25fb35dad47c9db479f667a6b6fe9a3aa8c12e982e","up":true},{"one":"ae67fae4990da61ca89221c5b1675c992babb4d715b59939e47bd1491b3bf1f4","other":"b16dcdf1ff1a56d49e374531d9885d59c1bcfbb628604520d9b1d84662edb9ca","up":true},{"one":"39dbd5462c90dac75f49d9af7996845943bbe929754ef8125eee7f5a763e9def","other":"372d47374a57d18cf134a1f8fc2d2fc10dfacfc0be9ed883183a349c896b3793","up":true},{"one":"e0b1c4eb5b5b4dfc22344ee65cb9716cecb38dcc80099793f20641884eae4854","other":"ea0e1dd41fe042b09f273c98f02128949cf5561d20dc04b3d423961efed52327","up":true},{"one":"372d47374a57d18cf134a1f8fc2d2fc10dfacfc0be9ed883183a349c896b3793","other":"5abc96f4fa78812db6fb710fd424dd474145f7e5d00b4cedc5373b4c52f42cf5","up":true},{"one":"7b9242137f8cc2bec7b3e0003fd93026921ceb10dfadbbd5b6aa64d61a74f35e","other":"6742cca1b7783fcbed8d0b340508f93cc4dfaca8ff3f13fd59354486c4d62993","up":true},{"one":"91eba9f9c8f2929d38f43a0c7efa809c0d2d59a31cbf2760c90e73d20266d528","other":"b70e96f01ac8947d2de6320412ae3310316caba65c27108ad16b2f2004255be4","up":true},{"one":"6742cca1b7783fcbed8d0b340508f93cc4dfaca8ff3f13fd59354486c4d62993","other":"539df902d42dc997c6b0e24d16ad68b54c557d56b41c972a320d57632dbfbe3c","up":true},{"one":"a3205c1c4f9b72814f0db68e888e3c7ef88f27c681ed0d731dde5f0999f92ccc","other":"91eba9f9c8f2929d38f43a0c7efa809c0d2d59a31cbf2760c90e73d20266d528","up":true},{"one":"9ee7b3e06b453615cbd8737cb74515b150f518f1a2eaa2db90e54708dd161b7d","other":"a7a61804d270ed6c27a4b1e8a634c30d7cdbaf644a1c67cbc6b08cd849a711db","up":true},{"one":"ea0e1dd41fe042b09f273c98f02128949cf5561d20dc04b3d423961efed52327","other":"f74ecde0bbaa7b6521fb205b5ab9ea637909277f6e1ee1d3490f5cd01d0f7216","up":true},{"one":"6c82fdabd09e0e9d0fc507613a05951c02b2953d763a062a5f32aaf5cc477c19","other":"419a6626dd026c0438461592121992c6be1868375011655b6d405166cd8edf7f","up":true},{"one":"021811a6757bdcdd2fa0fb68401dfe009d5a8e129958cd304fb42cf51dc5d1d3","other":"0506e949748b62da1d36b663df7d6a7e76027f72ced5d52f74677fb31d7e1505","up":true},{"one":"b381e75e52e4cdd168056245f82d3a1747b67f400eb40eb12036b73ee7fe21e5","other":"a085045c335ce2e47dbdfeb1adb62ce6c3bed36a93cf3448c45757a1a88e295d","up":true},{"one":"7639f9a66e8ff70f554c346faa25f78140957c295b748fc42a12df7972f4fcc6","other":"6c82fdabd09e0e9d0fc507613a05951c02b2953d763a062a5f32aaf5cc477c19","up":true},{"one":"e0ea575d0e2efa28bc51f49d1e2c24196a196da3b3196f3a5a26a5e310809af5","other":"ea60ef7cb3f2166a5c8e286c885984943a2ea5aff4730015be6a15031040cecf","up":true},{"one":"78cbc19a24d095ab7858849058c65c061c52289b91ddd92cee34bed98aee4a59","other":"1be4348ec5670cdc4f164d77b1356e7910b6d1be4a9b720e549d02e5482a9e78","up":true},{"one":"ed32d74d9be0649de1eb26b9915137fe46ec890c656c96be52e966ab6e2ed260","other":"f74ecde0bbaa7b6521fb205b5ab9ea637909277f6e1ee1d3490f5cd01d0f7216","up":true},{"one":"7f87da7ee55b4c8c8f9d55411ff88d3a0b63bfee6a516917d49fa6273fb5b86a","other":"1be4348ec5670cdc4f164d77b1356e7910b6d1be4a9b720e549d02e5482a9e78","up":true},{"one":"4a1811dd9febde1801a604ad81de84a2d15366d0b5c330f30f3398da0d107824","other":"5d608e66a17442091111cb472723fe3aea1f2baecaa546b57d49507c63a61cda","up":true},{"one":"2459fe9250b3311c86530d00b7a9b8ba57b1b5151c126262e70c55d1e8d37924","other":"027fb496438782583f78fb76999336eed7fb672a9c9ea50d04df580e6eb21377","up":true},{"one":"7dc5e8d8180c1bc7ebbee11a47fc96e8fe8b2d71c30cbc4aa1cf99e8eb6afcac","other":"48b614958a8692780ef5bd5c95e0db4ff67deb4de0dcbb878ca4479bfb86957e","up":true},{"one":"667ef042e9dae18694581e0404c3d87a09800e8b42173d26571c3bf97e29a372","other":"027fb496438782583f78fb76999336eed7fb672a9c9ea50d04df580e6eb21377","up":true},{"one":"41b9ee7ad19698e97589b059ad3333cb64f02c16006d94fb3d0bad7ced8ff238","other":"4167946de250b013e1be16ee84bfe2ccaae83e699e618b38f31016c4e431e6ba","up":true},{"one":"b2b9ac0f4db58886597af7b19d6150498ac8ad7c804671628aa34384b8fe505e","other":"a2babe49410ae007bc41ff2b7deaf709ed849e2f69666ce5aae76a3b71f47081","up":true},{"one":"895bdcd200cc4d7ec5c24f1722d0a8ebedda78b78cdf1ccc8c22a981980f5786","other":"9d3c79e4a0ac4e5b95aa32545f3b8d86f74594faa237d5c2566cf02fbd60b11a","up":true},{"one":"db088103f3b6f2c784d76ecd99c8b4a77fd39bb39c72ddfd91c99c1a9dd3b75b","other":"b8e1a80d91216fd5f8bc3f7413caf68ade7f124354d44fe7bd155a089134a70a","up":true},{"one":"82f034db88fd26b47c26b95c3f87a1f454ffe4526ae86beb2bb1d8f2c218c25c","other":"e16b12c708bc5e0545009daed44733c52d7450ccc797d158dd41a3bc9507b6be","up":true},{"one":"91eba9f9c8f2929d38f43a0c7efa809c0d2d59a31cbf2760c90e73d20266d528","other":"b2b9ac0f4db58886597af7b19d6150498ac8ad7c804671628aa34384b8fe505e","up":true},{"one":"021811a6757bdcdd2fa0fb68401dfe009d5a8e129958cd304fb42cf51dc5d1d3","other":"2434c63e7f28b83e7feede7fe68ea99b989f8534f64d63b046733e2f474538f5","up":true},{"one":"6742cca1b7783fcbed8d0b340508f93cc4dfaca8ff3f13fd59354486c4d62993","other":"4b243a5aeabec6db0e4a80a9c255300cd94591a6fbe0e0aa170da4f6ce14edff","up":true},{"one":"ea60ef7cb3f2166a5c8e286c885984943a2ea5aff4730015be6a15031040cecf","other":"f74ecde0bbaa7b6521fb205b5ab9ea637909277f6e1ee1d3490f5cd01d0f7216","up":true},{"one":"2a22dbee71a0ef27c840221db4a592d6dc8f171afed865ff814a37d633a3eaa9","other":"48b614958a8692780ef5bd5c95e0db4ff67deb4de0dcbb878ca4479bfb86957e","up":true},{"one":"9ee7b3e06b453615cbd8737cb74515b150f518f1a2eaa2db90e54708dd161b7d","other":"b16dcdf1ff1a56d49e374531d9885d59c1bcfbb628604520d9b1d84662edb9ca","up":true},{"one":"8cf957bf95a629c60c31dbcfe75ecca149a81c761f8b34858b04f8318e5c74bd","other":"8b76194f129308324c7d0066530e02cac2410ee0ba952822f0ec866e12461e44","up":true},{"one":"2459fe9250b3311c86530d00b7a9b8ba57b1b5151c126262e70c55d1e8d37924","other":"06b95f1bac76ca4925d509b06216f2113ac5dcf051ef5aa0a320ae64069e0b6d","up":true},{"one":"f74ecde0bbaa7b6521fb205b5ab9ea637909277f6e1ee1d3490f5cd01d0f7216","other":"83dc556ed36f37d06765be2554fe86eaf1ec21e2931fb22403238453bf021dfb","up":true},{"one":"ca036d1ef9e6ce3654f2d769f16926aa14957193586426489e15539dfa8f7763","other":"ce99e9d37111c52e929b187fe201790b1a555dfb8b6b6de54e94df7cc2d43fd4","up":true},{"one":"7355fab10584e4312f5cb5c3c826e7f9c14da74d62d07d0a8007ce9c6e995be9","other":"6c029114a9f73d69a42e591cf2d13107eff038d3eda8abb0242d9d6d169f05c7","up":true},{"one":"558eb021744be19383be9ac91b9f77e07479e0eb25576bd32a3afaa94c231178","other":"772e4c80d128deb52adf024a0eb6fe9bbea1c83351ed93f55f490cd5e5c69260","up":true},{"one":"03907380afcd52238f3d84a8dee3df599c7f2f9b90fbc1271ee88bdb52acbd58","other":"39dbd5462c90dac75f49d9af7996845943bbe929754ef8125eee7f5a763e9def","up":true},{"one":"7639f9a66e8ff70f554c346faa25f78140957c295b748fc42a12df7972f4fcc6","other":"47c3e0dfbbfcebeece78865c8c989577360cd9cc46a3b43f4b7b01ed14dc30e6","up":true},{"one":"ebca518e5146f49ac75bcaa8add2ef4d1d22c5cfd2e2326c6b41826d45ce55ae","other":"f5c4d28df5973ec0292221a875e8446323f339409d93f0f7385990126908a3c3","up":true},{"one":"f410d4ac9b748c24fa0d48c3053bb1cea8a67d0bcc4e5fcbdb261c0c7522cc34","other":"e77f6aa9e3dfcce0a2e5db794703224249aba60595075b2df9a5b0b30855cf46","up":true},{"one":"dfaeebc8e29c6a8f851b12b80cf42567cd2a43e35d977305a3c10e51bf41170a","other":"c3a1b301bf187fd8326831197d93a0266ac0cc8287b9008631240e2bec9cf337","up":true},{"one":"f74ecde0bbaa7b6521fb205b5ab9ea637909277f6e1ee1d3490f5cd01d0f7216","other":"c3a1b301bf187fd8326831197d93a0266ac0cc8287b9008631240e2bec9cf337","up":true},{"one":"aebd6135d10252b07f891b3a7330903faf13d409c4f7108630715fa0754f938e","other":"a085045c335ce2e47dbdfeb1adb62ce6c3bed36a93cf3448c45757a1a88e295d","up":true},{"one":"1be4348ec5670cdc4f164d77b1356e7910b6d1be4a9b720e549d02e5482a9e78","other":"213bf6e78e02a57585908c756f0965297152c3c400a0ed4c407a411e1ec5942d","up":true},{"one":"4a1811dd9febde1801a604ad81de84a2d15366d0b5c330f30f3398da0d107824","other":"5a01993ff7b4bd12fdb259e96b26a036d0cf5d4ae9c9b516be64b63acec2443a","up":true},{"one":"f36120ff250b9e7164e96021479332054f67de65cd2fe5b6e34bc51d0fe4d29c","other":"e55d8cdb7e7940b11929e7e5c949ef6beb7998e5180a1f0a3c0bf61aef39f1b8","up":true},{"one":"286aeba646bba4a8aa1c372bee9f2c9ff0a2b3abb4f18be321225555c6dce4e5","other":"2434c63e7f28b83e7feede7fe68ea99b989f8534f64d63b046733e2f474538f5","up":true},{"one":"109ef17c890104bfc5a4897d526a0afaa8c991c9d213616032f3058d0feb7f00","other":"2a22dbee71a0ef27c840221db4a592d6dc8f171afed865ff814a37d633a3eaa9","up":true},{"one":"db088103f3b6f2c784d76ecd99c8b4a77fd39bb39c72ddfd91c99c1a9dd3b75b","other":"d6ffb7fd2668e9b7b133bd9144156f4736191ef0d6e72b072759782d83931f22","up":true},{"one":"962676818c17fae1ffc52fc29318c44f9b8c980afd6d3e98217b4088d568a808","other":"8cf957bf95a629c60c31dbcfe75ecca149a81c761f8b34858b04f8318e5c74bd","up":true},{"one":"5d608e66a17442091111cb472723fe3aea1f2baecaa546b57d49507c63a61cda","other":"757a557424c33ad89efd8185ec18d71c025830ecb2aed951e33c8c8d986d5933","up":true},{"one":"92a1501ed41e29bb7dd8eb4b4acecae983f4c7c83f39895cd68f7810b645f1dd","other":"8be461203f5ebb5721348f537b37d768f7bd359af3e18d1f7e9af2f901c49845","up":true},{"one":"0ff67b0e9ec6509c7786495b7b3ddb176b4f8221ff300f409f00a3d389e8874c","other":"3e56d4533ec14f6656e1eb25fb35dad47c9db479f667a6b6fe9a3aa8c12e982e","up":true},{"one":"cdcd165721f6851f361fad0b3ba88c8870be9ad6d6b8cbcecc7c89e1068d979a","other":"d6ffb7fd2668e9b7b133bd9144156f4736191ef0d6e72b072759782d83931f22","up":true},{"one":"38ab3d7bdfb293b88122404cb7c50b5fb890ce7664c075da95585557a430c403","other":"1929a84bcd64bf002d0afb16249466c5b660123174a1fc1bf881913f8c87d1fd","up":true},{"one":"e77f6aa9e3dfcce0a2e5db794703224249aba60595075b2df9a5b0b30855cf46","other":"f36120ff250b9e7164e96021479332054f67de65cd2fe5b6e34bc51d0fe4d29c","up":true},{"one":"ebca518e5146f49ac75bcaa8add2ef4d1d22c5cfd2e2326c6b41826d45ce55ae","other":"f36084048bf0ff985a77f5183796f7b37b7085ee6eea8bbc5fc62558854cce67","up":true},{"one":"06b95f1bac76ca4925d509b06216f2113ac5dcf051ef5aa0a320ae64069e0b6d","other":"018adc613f78d6ec876274f821251fd049eb3651646cd69e27efe211fe88d936","up":true},{"one":"b486ce31ce880db3aaa17a0ac2c2f3554b6fe71f9c051edb572974342af4adb9","other":"a3205c1c4f9b72814f0db68e888e3c7ef88f27c681ed0d731dde5f0999f92ccc","up":true},{"one":"cbc5d42951bc6e187296b5f8ce4d04e472e26670a62851f39d65f31c50865f6a","other":"cfbb9ea682becadeab10bbd080ba8e93510085a87ac519e434964faa222fc275","up":true},{"one":"6c029114a9f73d69a42e591cf2d13107eff038d3eda8abb0242d9d6d169f05c7","other":"67288f84ada7778858139c74917b22ae698ed43df49a6530a566648f074ede46","up":true},{"one":"4cd0f38e52a508f81cf95e1370c994aea2d7a49a2a08e3e054f53629a6619410","other":"06b95f1bac76ca4925d509b06216f2113ac5dcf051ef5aa0a320ae64069e0b6d","up":true},{"one":"82f034db88fd26b47c26b95c3f87a1f454ffe4526ae86beb2bb1d8f2c218c25c","other":"86ca1078dae40f23ae1b3ac47397460d9ec0bf243a0de372b405381d6722fcb2","up":true},{"one":"73b8d1840d0a8ffe69752ec96f8fddecb0e22726c87982d572ca9acc1c9cdbfc","other":"6742cca1b7783fcbed8d0b340508f93cc4dfaca8ff3f13fd59354486c4d62993","up":true},{"one":"ea60ef7cb3f2166a5c8e286c885984943a2ea5aff4730015be6a15031040cecf","other":"f36084048bf0ff985a77f5183796f7b37b7085ee6eea8bbc5fc62558854cce67","up":true},{"one":"73b8d1840d0a8ffe69752ec96f8fddecb0e22726c87982d572ca9acc1c9cdbfc","other":"67288f84ada7778858139c74917b22ae698ed43df49a6530a566648f074ede46","up":true},{"one":"6ecb11fc5acc16ecd70351410fa18ec44a2a83d9e778cf25b85a7535493456b7","other":"772e4c80d128deb52adf024a0eb6fe9bbea1c83351ed93f55f490cd5e5c69260","up":true},{"one":"d0f398969480f3df3587f6d47546ff1261cad4d2e9c26ff3077e35ae1b26153e","other":"d2245f0679b436faabc0164e0b85e02e2effbad306e8229b555524a5e6d1a5f9","up":true},{"one":"5d608e66a17442091111cb472723fe3aea1f2baecaa546b57d49507c63a61cda","other":"772e4c80d128deb52adf024a0eb6fe9bbea1c83351ed93f55f490cd5e5c69260","up":true},{"one":"b486ce31ce880db3aaa17a0ac2c2f3554b6fe71f9c051edb572974342af4adb9","other":"a7a61804d270ed6c27a4b1e8a634c30d7cdbaf644a1c67cbc6b08cd849a711db","up":true},{"one":"8cf957bf95a629c60c31dbcfe75ecca149a81c761f8b34858b04f8318e5c74bd","other":"ea0e1dd41fe042b09f273c98f02128949cf5561d20dc04b3d423961efed52327","up":true},{"one":"afa3de5cebc9f96cf20a35058f4856fe43b48ac59cf8e46565f194f438622a52","other":"895bdcd200cc4d7ec5c24f1722d0a8ebedda78b78cdf1ccc8c22a981980f5786","up":true},{"one":"772e4c80d128deb52adf024a0eb6fe9bbea1c83351ed93f55f490cd5e5c69260","other":"ea0e1dd41fe042b09f273c98f02128949cf5561d20dc04b3d423961efed52327","up":true},{"one":"0bcf8a8ab0065ca8c85b8b6641f4c6e0b0de60e79ef32ebf6ff8f109ac4e1d70","other":"1929a84bcd64bf002d0afb16249466c5b660123174a1fc1bf881913f8c87d1fd","up":true},{"one":"67288f84ada7778858139c74917b22ae698ed43df49a6530a566648f074ede46","other":"6e5c213a2db57eaf2e1e1acc341c72efab89b0e42b6cd18db4f99ac1af151d65","up":true},{"one":"57764522162620c1ad0b166a9c43772255d0cc01e49f2122ef09db046804a570","other":"78cbc19a24d095ab7858849058c65c061c52289b91ddd92cee34bed98aee4a59","up":true},{"one":"6e5c213a2db57eaf2e1e1acc341c72efab89b0e42b6cd18db4f99ac1af151d65","other":"4b243a5aeabec6db0e4a80a9c255300cd94591a6fbe0e0aa170da4f6ce14edff","up":true},{"one":"2a22dbee71a0ef27c840221db4a592d6dc8f171afed865ff814a37d633a3eaa9","other":"213bf6e78e02a57585908c756f0965297152c3c400a0ed4c407a411e1ec5942d","up":true},{"one":"021811a6757bdcdd2fa0fb68401dfe009d5a8e129958cd304fb42cf51dc5d1d3","other":"2a22dbee71a0ef27c840221db4a592d6dc8f171afed865ff814a37d633a3eaa9","up":true},{"one":"4cd0f38e52a508f81cf95e1370c994aea2d7a49a2a08e3e054f53629a6619410","other":"419a6626dd026c0438461592121992c6be1868375011655b6d405166cd8edf7f","up":true},{"one":"698247d103a8925d8bb4c56a3056e49c5efc595fced1c89d49943bb9ba01f394","other":"7dc5e8d8180c1bc7ebbee11a47fc96e8fe8b2d71c30cbc4aa1cf99e8eb6afcac","up":true},{"one":"ea0e1dd41fe042b09f273c98f02128949cf5561d20dc04b3d423961efed52327","other":"e77f6aa9e3dfcce0a2e5db794703224249aba60595075b2df9a5b0b30855cf46","up":true},{"one":"c8e5a1b4533dd0de12acee4d31369f39785178568718b93bbc321ec83e0714f0","other":"e77f6aa9e3dfcce0a2e5db794703224249aba60595075b2df9a5b0b30855cf46","up":true},{"one":"539df902d42dc997c6b0e24d16ad68b54c557d56b41c972a320d57632dbfbe3c","other":"48b614958a8692780ef5bd5c95e0db4ff67deb4de0dcbb878ca4479bfb86957e","up":true},{"one":"042788d5b72cb84a375565d120d239a2b14fdf38b3f5f992284d78535077148a","other":"1be4348ec5670cdc4f164d77b1356e7910b6d1be4a9b720e549d02e5482a9e78","up":true},{"one":"3cb1b4069727dc323a687cab4ca2764f6415450488706f1b97c5cb8ca46346ff","other":"0506e949748b62da1d36b663df7d6a7e76027f72ced5d52f74677fb31d7e1505","up":true},{"one":"ae67fae4990da61ca89221c5b1675c992babb4d715b59939e47bd1491b3bf1f4","other":"b8e1a80d91216fd5f8bc3f7413caf68ade7f124354d44fe7bd155a089134a70a","up":true},{"one":"021811a6757bdcdd2fa0fb68401dfe009d5a8e129958cd304fb42cf51dc5d1d3","other":"372d47374a57d18cf134a1f8fc2d2fc10dfacfc0be9ed883183a349c896b3793","up":true},{"one":"517aa977048247d5d16ad51a286ffac4d8f910733f0578b222201308c32d195e","other":"47c3e0dfbbfcebeece78865c8c989577360cd9cc46a3b43f4b7b01ed14dc30e6","up":true},{"one":"6c029114a9f73d69a42e591cf2d13107eff038d3eda8abb0242d9d6d169f05c7","other":"772e4c80d128deb52adf024a0eb6fe9bbea1c83351ed93f55f490cd5e5c69260","up":true},{"one":"a75abd0dce5a488b7e06f91fab7a92ec428ab21bde9372c9e8fa489f48e7b3fe","other":"b2b9ac0f4db58886597af7b19d6150498ac8ad7c804671628aa34384b8fe505e","up":true},{"one":"5abc96f4fa78812db6fb710fd424dd474145f7e5d00b4cedc5373b4c52f42cf5","other":"772e4c80d128deb52adf024a0eb6fe9bbea1c83351ed93f55f490cd5e5c69260","up":true},{"one":"5d608e66a17442091111cb472723fe3aea1f2baecaa546b57d49507c63a61cda","other":"7cf4838a7c83a736ce59cfa1b974674a0185dbe17a8f3cd29794a3bbe814adee","up":true},{"one":"3ee4b20c047e701b58c06fcc8160364bd29573f61f4d9f1935d77ac29f6a1e86","other":"6ecb11fc5acc16ecd70351410fa18ec44a2a83d9e778cf25b85a7535493456b7","up":true},{"one":"4b243a5aeabec6db0e4a80a9c255300cd94591a6fbe0e0aa170da4f6ce14edff","other":"0bcf8a8ab0065ca8c85b8b6641f4c6e0b0de60e79ef32ebf6ff8f109ac4e1d70","up":true},{"one":"6742cca1b7783fcbed8d0b340508f93cc4dfaca8ff3f13fd59354486c4d62993","other":"4cd0f38e52a508f81cf95e1370c994aea2d7a49a2a08e3e054f53629a6619410","up":true},{"one":"757a557424c33ad89efd8185ec18d71c025830ecb2aed951e33c8c8d986d5933","other":"73b8d1840d0a8ffe69752ec96f8fddecb0e22726c87982d572ca9acc1c9cdbfc","up":true},{"one":"a085045c335ce2e47dbdfeb1adb62ce6c3bed36a93cf3448c45757a1a88e295d","other":"b92a71a4fc371e0596538a7fb2a33e85329c39c4409c99798d9318bc263a04a1","up":true},{"one":"f410d4ac9b748c24fa0d48c3053bb1cea8a67d0bcc4e5fcbdb261c0c7522cc34","other":"f36084048bf0ff985a77f5183796f7b37b7085ee6eea8bbc5fc62558854cce67","up":true},{"one":"9e02c5384602a54e900cfa46d5987b77f16e74cba745ac850fcada01c7af9004","other":"b8e1a80d91216fd5f8bc3f7413caf68ade7f124354d44fe7bd155a089134a70a","up":true},{"one":"ed32d74d9be0649de1eb26b9915137fe46ec890c656c96be52e966ab6e2ed260","other":"e55d8cdb7e7940b11929e7e5c949ef6beb7998e5180a1f0a3c0bf61aef39f1b8","up":true},{"one":"7f87da7ee55b4c8c8f9d55411ff88d3a0b63bfee6a516917d49fa6273fb5b86a","other":"0ff67b0e9ec6509c7786495b7b3ddb176b4f8221ff300f409f00a3d389e8874c","up":true},{"one":"734e029ed25485edd49b93dd9e85b6e7657f860e4ded4bc8a5094f512ae5836b","other":"667ef042e9dae18694581e0404c3d87a09800e8b42173d26571c3bf97e29a372","up":true},{"one":"e16b12c708bc5e0545009daed44733c52d7450ccc797d158dd41a3bc9507b6be","other":"d2245f0679b436faabc0164e0b85e02e2effbad306e8229b555524a5e6d1a5f9","up":true},{"one":"026d2e41b82d506da685a30cce7cc5772f6c1e167b7d557e0531fb9b79dd4ff2","other":"0506e949748b62da1d36b663df7d6a7e76027f72ced5d52f74677fb31d7e1505","up":true},{"one":"a7a61804d270ed6c27a4b1e8a634c30d7cdbaf644a1c67cbc6b08cd849a711db","other":"83dc556ed36f37d06765be2554fe86eaf1ec21e2931fb22403238453bf021dfb","up":true},{"one":"1929a84bcd64bf002d0afb16249466c5b660123174a1fc1bf881913f8c87d1fd","other":"e0ea575d0e2efa28bc51f49d1e2c24196a196da3b3196f3a5a26a5e310809af5","up":true},{"one":"957d8a9b412b6f4cd151cbc07b8d74d949880ae665c545debb18181389c99ee6","other":"9ee7b3e06b453615cbd8737cb74515b150f518f1a2eaa2db90e54708dd161b7d","up":true},{"one":"26d1af1fbee6541a363ea7707825e37da028142f00779116560ad20f1de18e7b","other":"2a22dbee71a0ef27c840221db4a592d6dc8f171afed865ff814a37d633a3eaa9","up":true},{"one":"92a1501ed41e29bb7dd8eb4b4acecae983f4c7c83f39895cd68f7810b645f1dd","other":"86ca1078dae40f23ae1b3ac47397460d9ec0bf243a0de372b405381d6722fcb2","up":true},{"one":"db088103f3b6f2c784d76ecd99c8b4a77fd39bb39c72ddfd91c99c1a9dd3b75b","other":"b70e96f01ac8947d2de6320412ae3310316caba65c27108ad16b2f2004255be4","up":true},{"one":"895bdcd200cc4d7ec5c24f1722d0a8ebedda78b78cdf1ccc8c22a981980f5786","other":"9a9230b3f7f386520821dee78ebe92e8c64a4f6a50f2639327c62e45cab40563","up":true},{"one":"026d2e41b82d506da685a30cce7cc5772f6c1e167b7d557e0531fb9b79dd4ff2","other":"042788d5b72cb84a375565d120d239a2b14fdf38b3f5f992284d78535077148a","up":true},{"one":"b2b9ac0f4db58886597af7b19d6150498ac8ad7c804671628aa34384b8fe505e","other":"a085045c335ce2e47dbdfeb1adb62ce6c3bed36a93cf3448c45757a1a88e295d","up":true},{"one":"517aa977048247d5d16ad51a286ffac4d8f910733f0578b222201308c32d195e","other":"4a1811dd9febde1801a604ad81de84a2d15366d0b5c330f30f3398da0d107824","up":true},{"one":"0ab9845c2890b0a64a3e5932241245e00b817b788094f9ee48f86f80b7264fea","other":"109ef17c890104bfc5a4897d526a0afaa8c991c9d213616032f3058d0feb7f00","up":true},{"one":"018adc613f78d6ec876274f821251fd049eb3651646cd69e27efe211fe88d936","other":"042788d5b72cb84a375565d120d239a2b14fdf38b3f5f992284d78535077148a","up":true},{"one":"3ee4b20c047e701b58c06fcc8160364bd29573f61f4d9f1935d77ac29f6a1e86","other":"698247d103a8925d8bb4c56a3056e49c5efc595fced1c89d49943bb9ba01f394","up":true},{"one":"aebd6135d10252b07f891b3a7330903faf13d409c4f7108630715fa0754f938e","other":"ad0d0dc5d4114ee4482d6c9bd4e46683327abf2b92df0d242d79019963876668","up":true},{"one":"f410d4ac9b748c24fa0d48c3053bb1cea8a67d0bcc4e5fcbdb261c0c7522cc34","other":"f5c4d28df5973ec0292221a875e8446323f339409d93f0f7385990126908a3c3","up":true},{"one":"698247d103a8925d8bb4c56a3056e49c5efc595fced1c89d49943bb9ba01f394","other":"7cf4838a7c83a736ce59cfa1b974674a0185dbe17a8f3cd29794a3bbe814adee","up":true},{"one":"8be461203f5ebb5721348f537b37d768f7bd359af3e18d1f7e9af2f901c49845","other":"9a9230b3f7f386520821dee78ebe92e8c64a4f6a50f2639327c62e45cab40563","up":true},{"one":"621076ce6b82e70c90a4adf235aa6f71b116e302dd6b15dcae07f4a816012455","other":"78cbc19a24d095ab7858849058c65c061c52289b91ddd92cee34bed98aee4a59","up":true},{"one":"a2babe49410ae007bc41ff2b7deaf709ed849e2f69666ce5aae76a3b71f47081","other":"ae67fae4990da61ca89221c5b1675c992babb4d715b59939e47bd1491b3bf1f4","up":true},{"one":"78cbc19a24d095ab7858849058c65c061c52289b91ddd92cee34bed98aee4a59","other":"0ff67b0e9ec6509c7786495b7b3ddb176b4f8221ff300f409f00a3d389e8874c","up":true},{"one":"a3205c1c4f9b72814f0db68e888e3c7ef88f27c681ed0d731dde5f0999f92ccc","other":"962676818c17fae1ffc52fc29318c44f9b8c980afd6d3e98217b4088d568a808","up":true},{"one":"f5c4d28df5973ec0292221a875e8446323f339409d93f0f7385990126908a3c3","other":"d6ffb7fd2668e9b7b133bd9144156f4736191ef0d6e72b072759782d83931f22","up":true},{"one":"83dc556ed36f37d06765be2554fe86eaf1ec21e2931fb22403238453bf021dfb","other":"89c883d6a85472bda328667e3fd805c70876bc582ca6763ab97ae636b1772be4","up":true},{"one":"8be461203f5ebb5721348f537b37d768f7bd359af3e18d1f7e9af2f901c49845","other":"9ee7b3e06b453615cbd8737cb74515b150f518f1a2eaa2db90e54708dd161b7d","up":true},{"one":"9d3c79e4a0ac4e5b95aa32545f3b8d86f74594faa237d5c2566cf02fbd60b11a","other":"92a1501ed41e29bb7dd8eb4b4acecae983f4c7c83f39895cd68f7810b645f1dd","up":true},{"one":"b8411f198fd658c5a2028835c0af3342145839c06c8a4f382d9f9de485d46c08","other":"a7a61804d270ed6c27a4b1e8a634c30d7cdbaf644a1c67cbc6b08cd849a711db","up":true},{"one":"cbc5d42951bc6e187296b5f8ce4d04e472e26670a62851f39d65f31c50865f6a","other":"c8e5a1b4533dd0de12acee4d31369f39785178568718b93bbc321ec83e0714f0","up":true},{"one":"a2babe49410ae007bc41ff2b7deaf709ed849e2f69666ce5aae76a3b71f47081","other":"b8e1a80d91216fd5f8bc3f7413caf68ade7f124354d44fe7bd155a089134a70a","up":true},{"one":"ed32d74d9be0649de1eb26b9915137fe46ec890c656c96be52e966ab6e2ed260","other":"e16b12c708bc5e0545009daed44733c52d7450ccc797d158dd41a3bc9507b6be","up":true},{"one":"edc8794153fb517085d27a83a4b00e8c3b37f22d2242b842cb2fab66764de9fe","other":"8cf957bf95a629c60c31dbcfe75ecca149a81c761f8b34858b04f8318e5c74bd","up":true},{"one":"109ef17c890104bfc5a4897d526a0afaa8c991c9d213616032f3058d0feb7f00","other":"1be4348ec5670cdc4f164d77b1356e7910b6d1be4a9b720e549d02e5482a9e78","up":true},{"one":"4cd0f38e52a508f81cf95e1370c994aea2d7a49a2a08e3e054f53629a6619410","other":"027fb496438782583f78fb76999336eed7fb672a9c9ea50d04df580e6eb21377","up":true},{"one":"895bdcd200cc4d7ec5c24f1722d0a8ebedda78b78cdf1ccc8c22a981980f5786","other":"8cf957bf95a629c60c31dbcfe75ecca149a81c761f8b34858b04f8318e5c74bd","up":true},{"one":"b92a71a4fc371e0596538a7fb2a33e85329c39c4409c99798d9318bc263a04a1","other":"b70e96f01ac8947d2de6320412ae3310316caba65c27108ad16b2f2004255be4","up":true},{"one":"4a1811dd9febde1801a604ad81de84a2d15366d0b5c330f30f3398da0d107824","other":"539df902d42dc997c6b0e24d16ad68b54c557d56b41c972a320d57632dbfbe3c","up":true},{"one":"dfaeebc8e29c6a8f851b12b80cf42567cd2a43e35d977305a3c10e51bf41170a","other":"c18105aa302a43e352d999745a0f806af9f8cb8bb83349357da5c85e8975acd1","up":true},{"one":"cec3c01c147b34f25104ddd0b25076cef63ac224eada9d9f5a00b8513331354f","other":"c18105aa302a43e352d999745a0f806af9f8cb8bb83349357da5c85e8975acd1","up":true},{"one":"cec3c01c147b34f25104ddd0b25076cef63ac224eada9d9f5a00b8513331354f","other":"f36084048bf0ff985a77f5183796f7b37b7085ee6eea8bbc5fc62558854cce67","up":true},{"one":"2434c63e7f28b83e7feede7fe68ea99b989f8534f64d63b046733e2f474538f5","other":"83dc556ed36f37d06765be2554fe86eaf1ec21e2931fb22403238453bf021dfb","up":true},{"one":"957d8a9b412b6f4cd151cbc07b8d74d949880ae665c545debb18181389c99ee6","other":"91eba9f9c8f2929d38f43a0c7efa809c0d2d59a31cbf2760c90e73d20266d528","up":true},{"one":"517aa977048247d5d16ad51a286ffac4d8f910733f0578b222201308c32d195e","other":"41b9ee7ad19698e97589b059ad3333cb64f02c16006d94fb3d0bad7ced8ff238","up":true},{"one":"03907380afcd52238f3d84a8dee3df599c7f2f9b90fbc1271ee88bdb52acbd58","other":"4b243a5aeabec6db0e4a80a9c255300cd94591a6fbe0e0aa170da4f6ce14edff","up":true},{"one":"1be4348ec5670cdc4f164d77b1356e7910b6d1be4a9b720e549d02e5482a9e78","other":"286aeba646bba4a8aa1c372bee9f2c9ff0a2b3abb4f18be321225555c6dce4e5","up":true},{"one":"b92a71a4fc371e0596538a7fb2a33e85329c39c4409c99798d9318bc263a04a1","other":"b2b9ac0f4db58886597af7b19d6150498ac8ad7c804671628aa34384b8fe505e","up":true},{"one":"47c3e0dfbbfcebeece78865c8c989577360cd9cc46a3b43f4b7b01ed14dc30e6","other":"419a6626dd026c0438461592121992c6be1868375011655b6d405166cd8edf7f","up":true},{"one":"3e56d4533ec14f6656e1eb25fb35dad47c9db479f667a6b6fe9a3aa8c12e982e","other":"3cb1b4069727dc323a687cab4ca2764f6415450488706f1b97c5cb8ca46346ff","up":true},{"one":"ce99e9d37111c52e929b187fe201790b1a555dfb8b6b6de54e94df7cc2d43fd4","other":"f36120ff250b9e7164e96021479332054f67de65cd2fe5b6e34bc51d0fe4d29c","up":true},{"one":"a085045c335ce2e47dbdfeb1adb62ce6c3bed36a93cf3448c45757a1a88e295d","other":"b70e96f01ac8947d2de6320412ae3310316caba65c27108ad16b2f2004255be4","up":true},{"one":"e0b1c4eb5b5b4dfc22344ee65cb9716cecb38dcc80099793f20641884eae4854","other":"f5c4d28df5973ec0292221a875e8446323f339409d93f0f7385990126908a3c3","up":true},{"one":"cdcd165721f6851f361fad0b3ba88c8870be9ad6d6b8cbcecc7c89e1068d979a","other":"dc97c1a0019b482a048b8d15941dfe4c3c1a3443d9b2d7b4046370bc84a7e56f","up":true},{"one":"ad0d0dc5d4114ee4482d6c9bd4e46683327abf2b92df0d242d79019963876668","other":"b2b9ac0f4db58886597af7b19d6150498ac8ad7c804671628aa34384b8fe505e","up":true},{"one":"698247d103a8925d8bb4c56a3056e49c5efc595fced1c89d49943bb9ba01f394","other":"73b8d1840d0a8ffe69752ec96f8fddecb0e22726c87982d572ca9acc1c9cdbfc","up":true},{"one":"9e02c5384602a54e900cfa46d5987b77f16e74cba745ac850fcada01c7af9004","other":"962676818c17fae1ffc52fc29318c44f9b8c980afd6d3e98217b4088d568a808","up":true},{"one":"7355fab10584e4312f5cb5c3c826e7f9c14da74d62d07d0a8007ce9c6e995be9","other":"6ecb11fc5acc16ecd70351410fa18ec44a2a83d9e778cf25b85a7535493456b7","up":true},{"one":"ebca518e5146f49ac75bcaa8add2ef4d1d22c5cfd2e2326c6b41826d45ce55ae","other":"e77f6aa9e3dfcce0a2e5db794703224249aba60595075b2df9a5b0b30855cf46","up":true},{"one":"83dc556ed36f37d06765be2554fe86eaf1ec21e2931fb22403238453bf021dfb","other":"f36120ff250b9e7164e96021479332054f67de65cd2fe5b6e34bc51d0fe4d29c","up":true},{"one":"962676818c17fae1ffc52fc29318c44f9b8c980afd6d3e98217b4088d568a808","other":"82f034db88fd26b47c26b95c3f87a1f454ffe4526ae86beb2bb1d8f2c218c25c","up":true},{"one":"afa3de5cebc9f96cf20a35058f4856fe43b48ac59cf8e46565f194f438622a52","other":"8be461203f5ebb5721348f537b37d768f7bd359af3e18d1f7e9af2f901c49845","up":true},{"one":"027fb496438782583f78fb76999336eed7fb672a9c9ea50d04df580e6eb21377","other":"109ef17c890104bfc5a4897d526a0afaa8c991c9d213616032f3058d0feb7f00","up":true},{"one":"67288f84ada7778858139c74917b22ae698ed43df49a6530a566648f074ede46","other":"6d601952793589bc6b57340c451a6abf02ea2c16637e910eed04cde6eddfe17a","up":true},{"one":"109ef17c890104bfc5a4897d526a0afaa8c991c9d213616032f3058d0feb7f00","other":"1929a84bcd64bf002d0afb16249466c5b660123174a1fc1bf881913f8c87d1fd","up":true},{"one":"8cf957bf95a629c60c31dbcfe75ecca149a81c761f8b34858b04f8318e5c74bd","other":"e55d8cdb7e7940b11929e7e5c949ef6beb7998e5180a1f0a3c0bf61aef39f1b8","up":true},{"one":"83dc556ed36f37d06765be2554fe86eaf1ec21e2931fb22403238453bf021dfb","other":"e0ea575d0e2efa28bc51f49d1e2c24196a196da3b3196f3a5a26a5e310809af5","up":true},{"one":"962676818c17fae1ffc52fc29318c44f9b8c980afd6d3e98217b4088d568a808","other":"c3a1b301bf187fd8326831197d93a0266ac0cc8287b9008631240e2bec9cf337","up":true},{"one":"ca036d1ef9e6ce3654f2d769f16926aa14957193586426489e15539dfa8f7763","other":"d0f398969480f3df3587f6d47546ff1261cad4d2e9c26ff3077e35ae1b26153e","up":true},{"one":"e55d8cdb7e7940b11929e7e5c949ef6beb7998e5180a1f0a3c0bf61aef39f1b8","other":"edc8794153fb517085d27a83a4b00e8c3b37f22d2242b842cb2fab66764de9fe","up":true},{"one":"1be4348ec5670cdc4f164d77b1356e7910b6d1be4a9b720e549d02e5482a9e78","other":"372d47374a57d18cf134a1f8fc2d2fc10dfacfc0be9ed883183a349c896b3793","up":true},{"one":"6d601952793589bc6b57340c451a6abf02ea2c16637e910eed04cde6eddfe17a","other":"7dc5e8d8180c1bc7ebbee11a47fc96e8fe8b2d71c30cbc4aa1cf99e8eb6afcac","up":true},{"one":"b8411f198fd658c5a2028835c0af3342145839c06c8a4f382d9f9de485d46c08","other":"ad0d0dc5d4114ee4482d6c9bd4e46683327abf2b92df0d242d79019963876668","up":true},{"one":"645b4e6b36fc1928725f627aeed278f46c5a7d6b0fff7ccff55a0468d47b23e8","other":"78cbc19a24d095ab7858849058c65c061c52289b91ddd92cee34bed98aee4a59","up":true},{"one":"018adc613f78d6ec876274f821251fd049eb3651646cd69e27efe211fe88d936","other":"0506e949748b62da1d36b663df7d6a7e76027f72ced5d52f74677fb31d7e1505","up":true},{"one":"4167946de250b013e1be16ee84bfe2ccaae83e699e618b38f31016c4e431e6ba","other":"13bc64535d3ae495098e4ac6b30a91d1804dab0ab79944f2c6ac53c9bccdf62d","up":true},{"one":"372d47374a57d18cf134a1f8fc2d2fc10dfacfc0be9ed883183a349c896b3793","other":"558eb021744be19383be9ac91b9f77e07479e0eb25576bd32a3afaa94c231178","up":true},{"one":"2434c63e7f28b83e7feede7fe68ea99b989f8534f64d63b046733e2f474538f5","other":"372d47374a57d18cf134a1f8fc2d2fc10dfacfc0be9ed883183a349c896b3793","up":true},{"one":"a75abd0dce5a488b7e06f91fab7a92ec428ab21bde9372c9e8fa489f48e7b3fe","other":"b381e75e52e4cdd168056245f82d3a1747b67f400eb40eb12036b73ee7fe21e5","up":true},{"one":"7fbc1843e2222e3c8e35a3215d1bbb4d5457d8b9ed33749e07e22f25ba9ee576","other":"419a6626dd026c0438461592121992c6be1868375011655b6d405166cd8edf7f","up":true},{"one":"3ee4b20c047e701b58c06fcc8160364bd29573f61f4d9f1935d77ac29f6a1e86","other":"372d47374a57d18cf134a1f8fc2d2fc10dfacfc0be9ed883183a349c896b3793","up":true},{"one":"cec3c01c147b34f25104ddd0b25076cef63ac224eada9d9f5a00b8513331354f","other":"c8e5a1b4533dd0de12acee4d31369f39785178568718b93bbc321ec83e0714f0","up":true},{"one":"6ecb11fc5acc16ecd70351410fa18ec44a2a83d9e778cf25b85a7535493456b7","other":"73b8d1840d0a8ffe69752ec96f8fddecb0e22726c87982d572ca9acc1c9cdbfc","up":true},{"one":"edc8794153fb517085d27a83a4b00e8c3b37f22d2242b842cb2fab66764de9fe","other":"ca036d1ef9e6ce3654f2d769f16926aa14957193586426489e15539dfa8f7763","up":true},{"one":"0ff67b0e9ec6509c7786495b7b3ddb176b4f8221ff300f409f00a3d389e8874c","other":"aebd6135d10252b07f891b3a7330903faf13d409c4f7108630715fa0754f938e","up":true},{"one":"d6ffb7fd2668e9b7b133bd9144156f4736191ef0d6e72b072759782d83931f22","other":"d0f398969480f3df3587f6d47546ff1261cad4d2e9c26ff3077e35ae1b26153e","up":true},{"one":"06b95f1bac76ca4925d509b06216f2113ac5dcf051ef5aa0a320ae64069e0b6d","other":"aebd6135d10252b07f891b3a7330903faf13d409c4f7108630715fa0754f938e","up":true},{"one":"b16dcdf1ff1a56d49e374531d9885d59c1bcfbb628604520d9b1d84662edb9ca","other":"d6ffb7fd2668e9b7b133bd9144156f4736191ef0d6e72b072759782d83931f22","up":true},{"one":"38ab3d7bdfb293b88122404cb7c50b5fb890ce7664c075da95585557a430c403","other":"0506e949748b62da1d36b663df7d6a7e76027f72ced5d52f74677fb31d7e1505","up":true},{"one":"372d47374a57d18cf134a1f8fc2d2fc10dfacfc0be9ed883183a349c896b3793","other":"5a01993ff7b4bd12fdb259e96b26a036d0cf5d4ae9c9b516be64b63acec2443a","up":true},{"one":"03907380afcd52238f3d84a8dee3df599c7f2f9b90fbc1271ee88bdb52acbd58","other":"0bcf8a8ab0065ca8c85b8b6641f4c6e0b0de60e79ef32ebf6ff8f109ac4e1d70","up":true},{"one":"645b4e6b36fc1928725f627aeed278f46c5a7d6b0fff7ccff55a0468d47b23e8","other":"558eb021744be19383be9ac91b9f77e07479e0eb25576bd32a3afaa94c231178","up":true},{"one":"7639f9a66e8ff70f554c346faa25f78140957c295b748fc42a12df7972f4fcc6","other":"698247d103a8925d8bb4c56a3056e49c5efc595fced1c89d49943bb9ba01f394","up":true},{"one":"c8e5a1b4533dd0de12acee4d31369f39785178568718b93bbc321ec83e0714f0","other":"db088103f3b6f2c784d76ecd99c8b4a77fd39bb39c72ddfd91c99c1a9dd3b75b","up":true},{"one":"82f034db88fd26b47c26b95c3f87a1f454ffe4526ae86beb2bb1d8f2c218c25c","other":"ebca518e5146f49ac75bcaa8add2ef4d1d22c5cfd2e2326c6b41826d45ce55ae","up":true},{"one":"03907380afcd52238f3d84a8dee3df599c7f2f9b90fbc1271ee88bdb52acbd58","other":"e55d8cdb7e7940b11929e7e5c949ef6beb7998e5180a1f0a3c0bf61aef39f1b8","up":true},{"one":"a75abd0dce5a488b7e06f91fab7a92ec428ab21bde9372c9e8fa489f48e7b3fe","other":"b70e96f01ac8947d2de6320412ae3310316caba65c27108ad16b2f2004255be4","up":true},{"one":"895bdcd200cc4d7ec5c24f1722d0a8ebedda78b78cdf1ccc8c22a981980f5786","other":"89c883d6a85472bda328667e3fd805c70876bc582ca6763ab97ae636b1772be4","up":true},{"one":"c18105aa302a43e352d999745a0f806af9f8cb8bb83349357da5c85e8975acd1","other":"f36084048bf0ff985a77f5183796f7b37b7085ee6eea8bbc5fc62558854cce67","up":true},{"one":"41b9ee7ad19698e97589b059ad3333cb64f02c16006d94fb3d0bad7ced8ff238","other":"419a6626dd026c0438461592121992c6be1868375011655b6d405166cd8edf7f","up":true},{"one":"286aeba646bba4a8aa1c372bee9f2c9ff0a2b3abb4f18be321225555c6dce4e5","other":"d2245f0679b436faabc0164e0b85e02e2effbad306e8229b555524a5e6d1a5f9","up":true},{"one":"a3205c1c4f9b72814f0db68e888e3c7ef88f27c681ed0d731dde5f0999f92ccc","other":"8cf957bf95a629c60c31dbcfe75ecca149a81c761f8b34858b04f8318e5c74bd","up":true},{"one":"f74ecde0bbaa7b6521fb205b5ab9ea637909277f6e1ee1d3490f5cd01d0f7216","other":"e55d8cdb7e7940b11929e7e5c949ef6beb7998e5180a1f0a3c0bf61aef39f1b8","up":true},{"one":"cbc5d42951bc6e187296b5f8ce4d04e472e26670a62851f39d65f31c50865f6a","other":"db088103f3b6f2c784d76ecd99c8b4a77fd39bb39c72ddfd91c99c1a9dd3b75b","up":true},{"one":"91eba9f9c8f2929d38f43a0c7efa809c0d2d59a31cbf2760c90e73d20266d528","other":"9a9230b3f7f386520821dee78ebe92e8c64a4f6a50f2639327c62e45cab40563","up":true},{"one":"6c82fdabd09e0e9d0fc507613a05951c02b2953d763a062a5f32aaf5cc477c19","other":"41b9ee7ad19698e97589b059ad3333cb64f02c16006d94fb3d0bad7ced8ff238","up":true},{"one":"f36084048bf0ff985a77f5183796f7b37b7085ee6eea8bbc5fc62558854cce67","other":"f5c4d28df5973ec0292221a875e8446323f339409d93f0f7385990126908a3c3","up":true},{"one":"026d2e41b82d506da685a30cce7cc5772f6c1e167b7d557e0531fb9b79dd4ff2","other":"018adc613f78d6ec876274f821251fd049eb3651646cd69e27efe211fe88d936","up":true},{"one":"b486ce31ce880db3aaa17a0ac2c2f3554b6fe71f9c051edb572974342af4adb9","other":"9ee7b3e06b453615cbd8737cb74515b150f518f1a2eaa2db90e54708dd161b7d","up":true},{"one":"3e56d4533ec14f6656e1eb25fb35dad47c9db479f667a6b6fe9a3aa8c12e982e","other":"2a22dbee71a0ef27c840221db4a592d6dc8f171afed865ff814a37d633a3eaa9","up":true},{"one":"26d1af1fbee6541a363ea7707825e37da028142f00779116560ad20f1de18e7b","other":"1929a84bcd64bf002d0afb16249466c5b660123174a1fc1bf881913f8c87d1fd","up":true},{"one":"78cbc19a24d095ab7858849058c65c061c52289b91ddd92cee34bed98aee4a59","other":"2459fe9250b3311c86530d00b7a9b8ba57b1b5151c126262e70c55d1e8d37924","up":true},{"one":"9a9230b3f7f386520821dee78ebe92e8c64a4f6a50f2639327c62e45cab40563","other":"b8411f198fd658c5a2028835c0af3342145839c06c8a4f382d9f9de485d46c08","up":true},{"one":"a085045c335ce2e47dbdfeb1adb62ce6c3bed36a93cf3448c45757a1a88e295d","other":"ad0d0dc5d4114ee4482d6c9bd4e46683327abf2b92df0d242d79019963876668","up":true},{"one":"ed32d74d9be0649de1eb26b9915137fe46ec890c656c96be52e966ab6e2ed260","other":"e0ea575d0e2efa28bc51f49d1e2c24196a196da3b3196f3a5a26a5e310809af5","up":true},{"one":"213bf6e78e02a57585908c756f0965297152c3c400a0ed4c407a411e1ec5942d","other":"89c883d6a85472bda328667e3fd805c70876bc582ca6763ab97ae636b1772be4","up":true},{"one":"6e5c213a2db57eaf2e1e1acc341c72efab89b0e42b6cd18db4f99ac1af151d65","other":"41b9ee7ad19698e97589b059ad3333cb64f02c16006d94fb3d0bad7ced8ff238","up":true},{"one":"558eb021744be19383be9ac91b9f77e07479e0eb25576bd32a3afaa94c231178","other":"4a1811dd9febde1801a604ad81de84a2d15366d0b5c330f30f3398da0d107824","up":true},{"one":"ce99e9d37111c52e929b187fe201790b1a555dfb8b6b6de54e94df7cc2d43fd4","other":"edc8794153fb517085d27a83a4b00e8c3b37f22d2242b842cb2fab66764de9fe","up":true},{"one":"621076ce6b82e70c90a4adf235aa6f71b116e302dd6b15dcae07f4a816012455","other":"7f87da7ee55b4c8c8f9d55411ff88d3a0b63bfee6a516917d49fa6273fb5b86a","up":true},{"one":"5abc96f4fa78812db6fb710fd424dd474145f7e5d00b4cedc5373b4c52f42cf5","other":"41b9ee7ad19698e97589b059ad3333cb64f02c16006d94fb3d0bad7ced8ff238","up":true},{"one":"a2babe49410ae007bc41ff2b7deaf709ed849e2f69666ce5aae76a3b71f47081","other":"afa3de5cebc9f96cf20a35058f4856fe43b48ac59cf8e46565f194f438622a52","up":true},{"one":"db088103f3b6f2c784d76ecd99c8b4a77fd39bb39c72ddfd91c99c1a9dd3b75b","other":"b486ce31ce880db3aaa17a0ac2c2f3554b6fe71f9c051edb572974342af4adb9","up":true},{"one":"f5c4d28df5973ec0292221a875e8446323f339409d93f0f7385990126908a3c3","other":"d2245f0679b436faabc0164e0b85e02e2effbad306e8229b555524a5e6d1a5f9","up":true},{"one":"7cf4838a7c83a736ce59cfa1b974674a0185dbe17a8f3cd29794a3bbe814adee","other":"6c82fdabd09e0e9d0fc507613a05951c02b2953d763a062a5f32aaf5cc477c19","up":true},{"one":"48b614958a8692780ef5bd5c95e0db4ff67deb4de0dcbb878ca4479bfb86957e","other":"26d1af1fbee6541a363ea7707825e37da028142f00779116560ad20f1de18e7b","up":true},{"one":"8be461203f5ebb5721348f537b37d768f7bd359af3e18d1f7e9af2f901c49845","other":"86ca1078dae40f23ae1b3ac47397460d9ec0bf243a0de372b405381d6722fcb2","up":true},{"one":"9d3c79e4a0ac4e5b95aa32545f3b8d86f74594faa237d5c2566cf02fbd60b11a","other":"91eba9f9c8f2929d38f43a0c7efa809c0d2d59a31cbf2760c90e73d20266d528","up":true},{"one":"734e029ed25485edd49b93dd9e85b6e7657f860e4ded4bc8a5094f512ae5836b","other":"698247d103a8925d8bb4c56a3056e49c5efc595fced1c89d49943bb9ba01f394","up":true},{"one":"47c3e0dfbbfcebeece78865c8c989577360cd9cc46a3b43f4b7b01ed14dc30e6","other":"aebd6135d10252b07f891b3a7330903faf13d409c4f7108630715fa0754f938e","up":true},{"one":"91eba9f9c8f2929d38f43a0c7efa809c0d2d59a31cbf2760c90e73d20266d528","other":"9e02c5384602a54e900cfa46d5987b77f16e74cba745ac850fcada01c7af9004","up":true},{"one":"6d601952793589bc6b57340c451a6abf02ea2c16637e910eed04cde6eddfe17a","other":"7b9242137f8cc2bec7b3e0003fd93026921ceb10dfadbbd5b6aa64d61a74f35e","up":true},{"one":"dfaeebc8e29c6a8f851b12b80cf42567cd2a43e35d977305a3c10e51bf41170a","other":"b16dcdf1ff1a56d49e374531d9885d59c1bcfbb628604520d9b1d84662edb9ca","up":true},{"one":"5a01993ff7b4bd12fdb259e96b26a036d0cf5d4ae9c9b516be64b63acec2443a","other":"539df902d42dc997c6b0e24d16ad68b54c557d56b41c972a320d57632dbfbe3c","up":true},{"one":"ae67fae4990da61ca89221c5b1675c992babb4d715b59939e47bd1491b3bf1f4","other":"a7a61804d270ed6c27a4b1e8a634c30d7cdbaf644a1c67cbc6b08cd849a711db","up":true},{"one":"cbc5d42951bc6e187296b5f8ce4d04e472e26670a62851f39d65f31c50865f6a","other":"edc8794153fb517085d27a83a4b00e8c3b37f22d2242b842cb2fab66764de9fe","up":true},{"one":"7f87da7ee55b4c8c8f9d55411ff88d3a0b63bfee6a516917d49fa6273fb5b86a","other":"018adc613f78d6ec876274f821251fd049eb3651646cd69e27efe211fe88d936","up":true},{"one":"13bc64535d3ae495098e4ac6b30a91d1804dab0ab79944f2c6ac53c9bccdf62d","other":"ebca518e5146f49ac75bcaa8add2ef4d1d22c5cfd2e2326c6b41826d45ce55ae","up":true},{"one":"48b614958a8692780ef5bd5c95e0db4ff67deb4de0dcbb878ca4479bfb86957e","other":"419a6626dd026c0438461592121992c6be1868375011655b6d405166cd8edf7f","up":true},{"one":"ad0d0dc5d4114ee4482d6c9bd4e46683327abf2b92df0d242d79019963876668","other":"a2babe49410ae007bc41ff2b7deaf709ed849e2f69666ce5aae76a3b71f47081","up":true},{"one":"e55d8cdb7e7940b11929e7e5c949ef6beb7998e5180a1f0a3c0bf61aef39f1b8","other":"ea0e1dd41fe042b09f273c98f02128949cf5561d20dc04b3d423961efed52327","up":true},{"one":"042788d5b72cb84a375565d120d239a2b14fdf38b3f5f992284d78535077148a","other":"0ab9845c2890b0a64a3e5932241245e00b817b788094f9ee48f86f80b7264fea","up":true},{"one":"e77f6aa9e3dfcce0a2e5db794703224249aba60595075b2df9a5b0b30855cf46","other":"f74ecde0bbaa7b6521fb205b5ab9ea637909277f6e1ee1d3490f5cd01d0f7216","up":true},{"one":"5d608e66a17442091111cb472723fe3aea1f2baecaa546b57d49507c63a61cda","other":"78cbc19a24d095ab7858849058c65c061c52289b91ddd92cee34bed98aee4a59","up":true},{"one":"734e029ed25485edd49b93dd9e85b6e7657f860e4ded4bc8a5094f512ae5836b","other":"67288f84ada7778858139c74917b22ae698ed43df49a6530a566648f074ede46","up":true},{"one":"57764522162620c1ad0b166a9c43772255d0cc01e49f2122ef09db046804a570","other":"772e4c80d128deb52adf024a0eb6fe9bbea1c83351ed93f55f490cd5e5c69260","up":true},{"one":"86ca1078dae40f23ae1b3ac47397460d9ec0bf243a0de372b405381d6722fcb2","other":"a085045c335ce2e47dbdfeb1adb62ce6c3bed36a93cf3448c45757a1a88e295d","up":true},{"one":"7dc5e8d8180c1bc7ebbee11a47fc96e8fe8b2d71c30cbc4aa1cf99e8eb6afcac","other":"772e4c80d128deb52adf024a0eb6fe9bbea1c83351ed93f55f490cd5e5c69260","up":true},{"one":"cfbb9ea682becadeab10bbd080ba8e93510085a87ac519e434964faa222fc275","other":"e0b1c4eb5b5b4dfc22344ee65cb9716cecb38dcc80099793f20641884eae4854","up":true},{"one":"962676818c17fae1ffc52fc29318c44f9b8c980afd6d3e98217b4088d568a808","other":"91eba9f9c8f2929d38f43a0c7efa809c0d2d59a31cbf2760c90e73d20266d528","up":true},{"one":"7639f9a66e8ff70f554c346faa25f78140957c295b748fc42a12df7972f4fcc6","other":"6742cca1b7783fcbed8d0b340508f93cc4dfaca8ff3f13fd59354486c4d62993","up":true},{"one":"0506e949748b62da1d36b663df7d6a7e76027f72ced5d52f74677fb31d7e1505","other":"042788d5b72cb84a375565d120d239a2b14fdf38b3f5f992284d78535077148a","up":true},{"one":"6c029114a9f73d69a42e591cf2d13107eff038d3eda8abb0242d9d6d169f05c7","other":"667ef042e9dae18694581e0404c3d87a09800e8b42173d26571c3bf97e29a372","up":true},{"one":"109ef17c890104bfc5a4897d526a0afaa8c991c9d213616032f3058d0feb7f00","other":"b8e1a80d91216fd5f8bc3f7413caf68ade7f124354d44fe7bd155a089134a70a","up":true},{"one":"1be4348ec5670cdc4f164d77b1356e7910b6d1be4a9b720e549d02e5482a9e78","other":"f74ecde0bbaa7b6521fb205b5ab9ea637909277f6e1ee1d3490f5cd01d0f7216","up":true},{"one":"1929a84bcd64bf002d0afb16249466c5b660123174a1fc1bf881913f8c87d1fd","other":"2a22dbee71a0ef27c840221db4a592d6dc8f171afed865ff814a37d633a3eaa9","up":true},{"one":"7355fab10584e4312f5cb5c3c826e7f9c14da74d62d07d0a8007ce9c6e995be9","other":"73b8d1840d0a8ffe69752ec96f8fddecb0e22726c87982d572ca9acc1c9cdbfc","up":true},{"one":"5a01993ff7b4bd12fdb259e96b26a036d0cf5d4ae9c9b516be64b63acec2443a","other":"757a557424c33ad89efd8185ec18d71c025830ecb2aed951e33c8c8d986d5933","up":true},{"one":"5d608e66a17442091111cb472723fe3aea1f2baecaa546b57d49507c63a61cda","other":"41b9ee7ad19698e97589b059ad3333cb64f02c16006d94fb3d0bad7ced8ff238","up":true},{"one":"b381e75e52e4cdd168056245f82d3a1747b67f400eb40eb12036b73ee7fe21e5","other":"b8411f198fd658c5a2028835c0af3342145839c06c8a4f382d9f9de485d46c08","up":true},{"one":"3ee4b20c047e701b58c06fcc8160364bd29573f61f4d9f1935d77ac29f6a1e86","other":"38ab3d7bdfb293b88122404cb7c50b5fb890ce7664c075da95585557a430c403","up":true},{"one":"f410d4ac9b748c24fa0d48c3053bb1cea8a67d0bcc4e5fcbdb261c0c7522cc34","other":"ea60ef7cb3f2166a5c8e286c885984943a2ea5aff4730015be6a15031040cecf","up":true},{"one":"ae67fae4990da61ca89221c5b1675c992babb4d715b59939e47bd1491b3bf1f4","other":"a75abd0dce5a488b7e06f91fab7a92ec428ab21bde9372c9e8fa489f48e7b3fe","up":true},{"one":"026d2e41b82d506da685a30cce7cc5772f6c1e167b7d557e0531fb9b79dd4ff2","other":"021811a6757bdcdd2fa0fb68401dfe009d5a8e129958cd304fb42cf51dc5d1d3","up":true},{"one":"8cf957bf95a629c60c31dbcfe75ecca149a81c761f8b34858b04f8318e5c74bd","other":"e16b12c708bc5e0545009daed44733c52d7450ccc797d158dd41a3bc9507b6be","up":true},{"one":"957d8a9b412b6f4cd151cbc07b8d74d949880ae665c545debb18181389c99ee6","other":"92a1501ed41e29bb7dd8eb4b4acecae983f4c7c83f39895cd68f7810b645f1dd","up":true},{"one":"b381e75e52e4cdd168056245f82d3a1747b67f400eb40eb12036b73ee7fe21e5","other":"9ee7b3e06b453615cbd8737cb74515b150f518f1a2eaa2db90e54708dd161b7d","up":true},{"one":"4b243a5aeabec6db0e4a80a9c255300cd94591a6fbe0e0aa170da4f6ce14edff","other":"109ef17c890104bfc5a4897d526a0afaa8c991c9d213616032f3058d0feb7f00","up":true},{"one":"7355fab10584e4312f5cb5c3c826e7f9c14da74d62d07d0a8007ce9c6e995be9","other":"757a557424c33ad89efd8185ec18d71c025830ecb2aed951e33c8c8d986d5933","up":true},{"one":"b8e1a80d91216fd5f8bc3f7413caf68ade7f124354d44fe7bd155a089134a70a","other":"8cf957bf95a629c60c31dbcfe75ecca149a81c761f8b34858b04f8318e5c74bd","up":true},{"one":"b486ce31ce880db3aaa17a0ac2c2f3554b6fe71f9c051edb572974342af4adb9","other":"b70e96f01ac8947d2de6320412ae3310316caba65c27108ad16b2f2004255be4","up":true},{"one":"26d1af1fbee6541a363ea7707825e37da028142f00779116560ad20f1de18e7b","other":"13bc64535d3ae495098e4ac6b30a91d1804dab0ab79944f2c6ac53c9bccdf62d","up":true},{"one":"018adc613f78d6ec876274f821251fd049eb3651646cd69e27efe211fe88d936","other":"0ff67b0e9ec6509c7786495b7b3ddb176b4f8221ff300f409f00a3d389e8874c","up":true},{"one":"cec3c01c147b34f25104ddd0b25076cef63ac224eada9d9f5a00b8513331354f","other":"d2245f0679b436faabc0164e0b85e02e2effbad306e8229b555524a5e6d1a5f9","up":true},{"one":"7b9242137f8cc2bec7b3e0003fd93026921ceb10dfadbbd5b6aa64d61a74f35e","other":"698247d103a8925d8bb4c56a3056e49c5efc595fced1c89d49943bb9ba01f394","up":true},{"one":"4b243a5aeabec6db0e4a80a9c255300cd94591a6fbe0e0aa170da4f6ce14edff","other":"0ab9845c2890b0a64a3e5932241245e00b817b788094f9ee48f86f80b7264fea","up":true},{"one":"e0b1c4eb5b5b4dfc22344ee65cb9716cecb38dcc80099793f20641884eae4854","other":"ea60ef7cb3f2166a5c8e286c885984943a2ea5aff4730015be6a15031040cecf","up":true},{"one":"cdcd165721f6851f361fad0b3ba88c8870be9ad6d6b8cbcecc7c89e1068d979a","other":"c3a1b301bf187fd8326831197d93a0266ac0cc8287b9008631240e2bec9cf337","up":true},{"one":"4a1811dd9febde1801a604ad81de84a2d15366d0b5c330f30f3398da0d107824","other":"57764522162620c1ad0b166a9c43772255d0cc01e49f2122ef09db046804a570","up":true},{"one":"895bdcd200cc4d7ec5c24f1722d0a8ebedda78b78cdf1ccc8c22a981980f5786","other":"8b76194f129308324c7d0066530e02cac2410ee0ba952822f0ec866e12461e44","up":true},{"one":"ed32d74d9be0649de1eb26b9915137fe46ec890c656c96be52e966ab6e2ed260","other":"e0b1c4eb5b5b4dfc22344ee65cb9716cecb38dcc80099793f20641884eae4854","up":true},{"one":"757a557424c33ad89efd8185ec18d71c025830ecb2aed951e33c8c8d986d5933","other":"734e029ed25485edd49b93dd9e85b6e7657f860e4ded4bc8a5094f512ae5836b","up":true},{"one":"39dbd5462c90dac75f49d9af7996845943bbe929754ef8125eee7f5a763e9def","other":"26d1af1fbee6541a363ea7707825e37da028142f00779116560ad20f1de18e7b","up":true},{"one":"d0f398969480f3df3587f6d47546ff1261cad4d2e9c26ff3077e35ae1b26153e","other":"e0b1c4eb5b5b4dfc22344ee65cb9716cecb38dcc80099793f20641884eae4854","up":true},{"one":"7355fab10584e4312f5cb5c3c826e7f9c14da74d62d07d0a8007ce9c6e995be9","other":"667ef042e9dae18694581e0404c3d87a09800e8b42173d26571c3bf97e29a372","up":true},{"one":"ce99e9d37111c52e929b187fe201790b1a555dfb8b6b6de54e94df7cc2d43fd4","other":"d2245f0679b436faabc0164e0b85e02e2effbad306e8229b555524a5e6d1a5f9","up":true},{"one":"895bdcd200cc4d7ec5c24f1722d0a8ebedda78b78cdf1ccc8c22a981980f5786","other":"a3205c1c4f9b72814f0db68e888e3c7ef88f27c681ed0d731dde5f0999f92ccc","up":true},{"one":"7fbc1843e2222e3c8e35a3215d1bbb4d5457d8b9ed33749e07e22f25ba9ee576","other":"4167946de250b013e1be16ee84bfe2ccaae83e699e618b38f31016c4e431e6ba","up":true},{"one":"667ef042e9dae18694581e0404c3d87a09800e8b42173d26571c3bf97e29a372","other":"7b9242137f8cc2bec7b3e0003fd93026921ceb10dfadbbd5b6aa64d61a74f35e","up":true},{"one":"957d8a9b412b6f4cd151cbc07b8d74d949880ae665c545debb18181389c99ee6","other":"962676818c17fae1ffc52fc29318c44f9b8c980afd6d3e98217b4088d568a808","up":true},{"one":"e0ea575d0e2efa28bc51f49d1e2c24196a196da3b3196f3a5a26a5e310809af5","other":"edc8794153fb517085d27a83a4b00e8c3b37f22d2242b842cb2fab66764de9fe","up":true},{"one":"92a1501ed41e29bb7dd8eb4b4acecae983f4c7c83f39895cd68f7810b645f1dd","other":"9ee7b3e06b453615cbd8737cb74515b150f518f1a2eaa2db90e54708dd161b7d","up":true},{"one":"698247d103a8925d8bb4c56a3056e49c5efc595fced1c89d49943bb9ba01f394","other":"6c029114a9f73d69a42e591cf2d13107eff038d3eda8abb0242d9d6d169f05c7","up":true},{"one":"517aa977048247d5d16ad51a286ffac4d8f910733f0578b222201308c32d195e","other":"57764522162620c1ad0b166a9c43772255d0cc01e49f2122ef09db046804a570","up":true},{"one":"021811a6757bdcdd2fa0fb68401dfe009d5a8e129958cd304fb42cf51dc5d1d3","other":"26d1af1fbee6541a363ea7707825e37da028142f00779116560ad20f1de18e7b","up":true},{"one":"372d47374a57d18cf134a1f8fc2d2fc10dfacfc0be9ed883183a349c896b3793","other":"539df902d42dc997c6b0e24d16ad68b54c557d56b41c972a320d57632dbfbe3c","up":true},{"one":"667ef042e9dae18694581e0404c3d87a09800e8b42173d26571c3bf97e29a372","other":"7dc5e8d8180c1bc7ebbee11a47fc96e8fe8b2d71c30cbc4aa1cf99e8eb6afcac","up":true},{"one":"ce99e9d37111c52e929b187fe201790b1a555dfb8b6b6de54e94df7cc2d43fd4","other":"db088103f3b6f2c784d76ecd99c8b4a77fd39bb39c72ddfd91c99c1a9dd3b75b","up":true},{"one":"9a9230b3f7f386520821dee78ebe92e8c64a4f6a50f2639327c62e45cab40563","other":"b70e96f01ac8947d2de6320412ae3310316caba65c27108ad16b2f2004255be4","up":true},{"one":"06b95f1bac76ca4925d509b06216f2113ac5dcf051ef5aa0a320ae64069e0b6d","other":"b8411f198fd658c5a2028835c0af3342145839c06c8a4f382d9f9de485d46c08","up":true},{"one":"0ff67b0e9ec6509c7786495b7b3ddb176b4f8221ff300f409f00a3d389e8874c","other":"2434c63e7f28b83e7feede7fe68ea99b989f8534f64d63b046733e2f474538f5","up":true},{"one":"b8e1a80d91216fd5f8bc3f7413caf68ade7f124354d44fe7bd155a089134a70a","other":"8b76194f129308324c7d0066530e02cac2410ee0ba952822f0ec866e12461e44","up":true},{"one":"213bf6e78e02a57585908c756f0965297152c3c400a0ed4c407a411e1ec5942d","other":"372d47374a57d18cf134a1f8fc2d2fc10dfacfc0be9ed883183a349c896b3793","up":true},{"one":"cec3c01c147b34f25104ddd0b25076cef63ac224eada9d9f5a00b8513331354f","other":"ce99e9d37111c52e929b187fe201790b1a555dfb8b6b6de54e94df7cc2d43fd4","up":true},{"one":"6742cca1b7783fcbed8d0b340508f93cc4dfaca8ff3f13fd59354486c4d62993","other":"7355fab10584e4312f5cb5c3c826e7f9c14da74d62d07d0a8007ce9c6e995be9","up":true},{"one":"027fb496438782583f78fb76999336eed7fb672a9c9ea50d04df580e6eb21377","other":"0ab9845c2890b0a64a3e5932241245e00b817b788094f9ee48f86f80b7264fea","up":true},{"one":"2459fe9250b3311c86530d00b7a9b8ba57b1b5151c126262e70c55d1e8d37924","other":"0bcf8a8ab0065ca8c85b8b6641f4c6e0b0de60e79ef32ebf6ff8f109ac4e1d70","up":true},{"one":"027fb496438782583f78fb76999336eed7fb672a9c9ea50d04df580e6eb21377","other":"0bcf8a8ab0065ca8c85b8b6641f4c6e0b0de60e79ef32ebf6ff8f109ac4e1d70","up":true},{"one":"2434c63e7f28b83e7feede7fe68ea99b989f8534f64d63b046733e2f474538f5","other":"2a22dbee71a0ef27c840221db4a592d6dc8f171afed865ff814a37d633a3eaa9","up":true},{"one":"3ee4b20c047e701b58c06fcc8160364bd29573f61f4d9f1935d77ac29f6a1e86","other":"73b8d1840d0a8ffe69752ec96f8fddecb0e22726c87982d572ca9acc1c9cdbfc","up":true},{"one":"cdcd165721f6851f361fad0b3ba88c8870be9ad6d6b8cbcecc7c89e1068d979a","other":"c18105aa302a43e352d999745a0f806af9f8cb8bb83349357da5c85e8975acd1","up":true},{"one":"c18105aa302a43e352d999745a0f806af9f8cb8bb83349357da5c85e8975acd1","other":"e0b1c4eb5b5b4dfc22344ee65cb9716cecb38dcc80099793f20641884eae4854","up":true},{"one":"ebca518e5146f49ac75bcaa8add2ef4d1d22c5cfd2e2326c6b41826d45ce55ae","other":"ea60ef7cb3f2166a5c8e286c885984943a2ea5aff4730015be6a15031040cecf","up":true},{"one":"5a01993ff7b4bd12fdb259e96b26a036d0cf5d4ae9c9b516be64b63acec2443a","other":"558eb021744be19383be9ac91b9f77e07479e0eb25576bd32a3afaa94c231178","up":true},{"one":"dc97c1a0019b482a048b8d15941dfe4c3c1a3443d9b2d7b4046370bc84a7e56f","other":"c18105aa302a43e352d999745a0f806af9f8cb8bb83349357da5c85e8975acd1","up":true},{"one":"89c883d6a85472bda328667e3fd805c70876bc582ca6763ab97ae636b1772be4","other":"91eba9f9c8f2929d38f43a0c7efa809c0d2d59a31cbf2760c90e73d20266d528","up":true},{"one":"ea60ef7cb3f2166a5c8e286c885984943a2ea5aff4730015be6a15031040cecf","other":"edc8794153fb517085d27a83a4b00e8c3b37f22d2242b842cb2fab66764de9fe","up":true},{"one":"6d601952793589bc6b57340c451a6abf02ea2c16637e910eed04cde6eddfe17a","other":"6ecb11fc5acc16ecd70351410fa18ec44a2a83d9e778cf25b85a7535493456b7","up":true},{"one":"0ab9845c2890b0a64a3e5932241245e00b817b788094f9ee48f86f80b7264fea","other":"0506e949748b62da1d36b663df7d6a7e76027f72ced5d52f74677fb31d7e1505","up":true},{"one":"962676818c17fae1ffc52fc29318c44f9b8c980afd6d3e98217b4088d568a808","other":"92a1501ed41e29bb7dd8eb4b4acecae983f4c7c83f39895cd68f7810b645f1dd","up":true},{"one":"38ab3d7bdfb293b88122404cb7c50b5fb890ce7664c075da95585557a430c403","other":"213bf6e78e02a57585908c756f0965297152c3c400a0ed4c407a411e1ec5942d","up":true},{"one":"7355fab10584e4312f5cb5c3c826e7f9c14da74d62d07d0a8007ce9c6e995be9","other":"539df902d42dc997c6b0e24d16ad68b54c557d56b41c972a320d57632dbfbe3c","up":true},{"one":"3cb1b4069727dc323a687cab4ca2764f6415450488706f1b97c5cb8ca46346ff","other":"0bcf8a8ab0065ca8c85b8b6641f4c6e0b0de60e79ef32ebf6ff8f109ac4e1d70","up":true},{"one":"6e5c213a2db57eaf2e1e1acc341c72efab89b0e42b6cd18db4f99ac1af151d65","other":"667ef042e9dae18694581e0404c3d87a09800e8b42173d26571c3bf97e29a372","up":true},{"one":"a75abd0dce5a488b7e06f91fab7a92ec428ab21bde9372c9e8fa489f48e7b3fe","other":"b92a71a4fc371e0596538a7fb2a33e85329c39c4409c99798d9318bc263a04a1","up":true},{"one":"9e02c5384602a54e900cfa46d5987b77f16e74cba745ac850fcada01c7af9004","other":"9a9230b3f7f386520821dee78ebe92e8c64a4f6a50f2639327c62e45cab40563","up":true},{"one":"3cb1b4069727dc323a687cab4ca2764f6415450488706f1b97c5cb8ca46346ff","other":"018adc613f78d6ec876274f821251fd049eb3651646cd69e27efe211fe88d936","up":true},{"one":"f410d4ac9b748c24fa0d48c3053bb1cea8a67d0bcc4e5fcbdb261c0c7522cc34","other":"a7a61804d270ed6c27a4b1e8a634c30d7cdbaf644a1c67cbc6b08cd849a711db","up":true},{"one":"c18105aa302a43e352d999745a0f806af9f8cb8bb83349357da5c85e8975acd1","other":"e0ea575d0e2efa28bc51f49d1e2c24196a196da3b3196f3a5a26a5e310809af5","up":true},{"one":"cbc5d42951bc6e187296b5f8ce4d04e472e26670a62851f39d65f31c50865f6a","other":"ca036d1ef9e6ce3654f2d769f16926aa14957193586426489e15539dfa8f7763","up":true},{"one":"621076ce6b82e70c90a4adf235aa6f71b116e302dd6b15dcae07f4a816012455","other":"7fbc1843e2222e3c8e35a3215d1bbb4d5457d8b9ed33749e07e22f25ba9ee576","up":true},{"one":"86ca1078dae40f23ae1b3ac47397460d9ec0bf243a0de372b405381d6722fcb2","other":"ad0d0dc5d4114ee4482d6c9bd4e46683327abf2b92df0d242d79019963876668","up":true},{"one":"e55d8cdb7e7940b11929e7e5c949ef6beb7998e5180a1f0a3c0bf61aef39f1b8","other":"e0ea575d0e2efa28bc51f49d1e2c24196a196da3b3196f3a5a26a5e310809af5","up":true},{"one":"c18105aa302a43e352d999745a0f806af9f8cb8bb83349357da5c85e8975acd1","other":"286aeba646bba4a8aa1c372bee9f2c9ff0a2b3abb4f18be321225555c6dce4e5","up":true},{"one":"67288f84ada7778858139c74917b22ae698ed43df49a6530a566648f074ede46","other":"667ef042e9dae18694581e0404c3d87a09800e8b42173d26571c3bf97e29a372","up":true},{"one":"f410d4ac9b748c24fa0d48c3053bb1cea8a67d0bcc4e5fcbdb261c0c7522cc34","other":"13bc64535d3ae495098e4ac6b30a91d1804dab0ab79944f2c6ac53c9bccdf62d","up":true},{"one":"957d8a9b412b6f4cd151cbc07b8d74d949880ae665c545debb18181389c99ee6","other":"b92a71a4fc371e0596538a7fb2a33e85329c39c4409c99798d9318bc263a04a1","up":true},{"one":"03907380afcd52238f3d84a8dee3df599c7f2f9b90fbc1271ee88bdb52acbd58","other":"0ab9845c2890b0a64a3e5932241245e00b817b788094f9ee48f86f80b7264fea","up":true},{"one":"39dbd5462c90dac75f49d9af7996845943bbe929754ef8125eee7f5a763e9def","other":"38ab3d7bdfb293b88122404cb7c50b5fb890ce7664c075da95585557a430c403","up":true},{"one":"91eba9f9c8f2929d38f43a0c7efa809c0d2d59a31cbf2760c90e73d20266d528","other":"c3a1b301bf187fd8326831197d93a0266ac0cc8287b9008631240e2bec9cf337","up":true},{"one":"7355fab10584e4312f5cb5c3c826e7f9c14da74d62d07d0a8007ce9c6e995be9","other":"d6ffb7fd2668e9b7b133bd9144156f4736191ef0d6e72b072759782d83931f22","up":true},{"one":"5abc96f4fa78812db6fb710fd424dd474145f7e5d00b4cedc5373b4c52f42cf5","other":"48b614958a8692780ef5bd5c95e0db4ff67deb4de0dcbb878ca4479bfb86957e","up":true},{"one":"4167946de250b013e1be16ee84bfe2ccaae83e699e618b38f31016c4e431e6ba","other":"018adc613f78d6ec876274f821251fd049eb3651646cd69e27efe211fe88d936","up":true},{"one":"7dc5e8d8180c1bc7ebbee11a47fc96e8fe8b2d71c30cbc4aa1cf99e8eb6afcac","other":"7b9242137f8cc2bec7b3e0003fd93026921ceb10dfadbbd5b6aa64d61a74f35e","up":true},{"one":"b8411f198fd658c5a2028835c0af3342145839c06c8a4f382d9f9de485d46c08","other":"afa3de5cebc9f96cf20a35058f4856fe43b48ac59cf8e46565f194f438622a52","up":true},{"one":"38ab3d7bdfb293b88122404cb7c50b5fb890ce7664c075da95585557a430c403","other":"2434c63e7f28b83e7feede7fe68ea99b989f8534f64d63b046733e2f474538f5","up":true},{"one":"13bc64535d3ae495098e4ac6b30a91d1804dab0ab79944f2c6ac53c9bccdf62d","other":"e0b1c4eb5b5b4dfc22344ee65cb9716cecb38dcc80099793f20641884eae4854","up":true},{"one":"b70e96f01ac8947d2de6320412ae3310316caba65c27108ad16b2f2004255be4","other":"b8e1a80d91216fd5f8bc3f7413caf68ade7f124354d44fe7bd155a089134a70a","up":true},{"one":"7fbc1843e2222e3c8e35a3215d1bbb4d5457d8b9ed33749e07e22f25ba9ee576","other":"6742cca1b7783fcbed8d0b340508f93cc4dfaca8ff3f13fd59354486c4d62993","up":true},{"one":"a75abd0dce5a488b7e06f91fab7a92ec428ab21bde9372c9e8fa489f48e7b3fe","other":"ad0d0dc5d4114ee4482d6c9bd4e46683327abf2b92df0d242d79019963876668","up":true},{"one":"6c029114a9f73d69a42e591cf2d13107eff038d3eda8abb0242d9d6d169f05c7","other":"6e5c213a2db57eaf2e1e1acc341c72efab89b0e42b6cd18db4f99ac1af151d65","up":true},{"one":"e0b1c4eb5b5b4dfc22344ee65cb9716cecb38dcc80099793f20641884eae4854","other":"83dc556ed36f37d06765be2554fe86eaf1ec21e2931fb22403238453bf021dfb","up":true},{"one":"3ee4b20c047e701b58c06fcc8160364bd29573f61f4d9f1935d77ac29f6a1e86","other":"3cb1b4069727dc323a687cab4ca2764f6415450488706f1b97c5cb8ca46346ff","up":true},{"one":"a2babe49410ae007bc41ff2b7deaf709ed849e2f69666ce5aae76a3b71f47081","other":"a75abd0dce5a488b7e06f91fab7a92ec428ab21bde9372c9e8fa489f48e7b3fe","up":true},{"one":"4a1811dd9febde1801a604ad81de84a2d15366d0b5c330f30f3398da0d107824","other":"47c3e0dfbbfcebeece78865c8c989577360cd9cc46a3b43f4b7b01ed14dc30e6","up":true},{"one":"9d3c79e4a0ac4e5b95aa32545f3b8d86f74594faa237d5c2566cf02fbd60b11a","other":"9e02c5384602a54e900cfa46d5987b77f16e74cba745ac850fcada01c7af9004","up":true},{"one":"026d2e41b82d506da685a30cce7cc5772f6c1e167b7d557e0531fb9b79dd4ff2","other":"9e02c5384602a54e900cfa46d5987b77f16e74cba745ac850fcada01c7af9004","up":true},{"one":"109ef17c890104bfc5a4897d526a0afaa8c991c9d213616032f3058d0feb7f00","other":"b70e96f01ac8947d2de6320412ae3310316caba65c27108ad16b2f2004255be4","up":true},{"one":"558eb021744be19383be9ac91b9f77e07479e0eb25576bd32a3afaa94c231178","other":"5d608e66a17442091111cb472723fe3aea1f2baecaa546b57d49507c63a61cda","up":true},{"one":"ea0e1dd41fe042b09f273c98f02128949cf5561d20dc04b3d423961efed52327","other":"e16b12c708bc5e0545009daed44733c52d7450ccc797d158dd41a3bc9507b6be","up":true},{"one":"82f034db88fd26b47c26b95c3f87a1f454ffe4526ae86beb2bb1d8f2c218c25c","other":"f5c4d28df5973ec0292221a875e8446323f339409d93f0f7385990126908a3c3","up":true},{"one":"a3205c1c4f9b72814f0db68e888e3c7ef88f27c681ed0d731dde5f0999f92ccc","other":"89c883d6a85472bda328667e3fd805c70876bc582ca6763ab97ae636b1772be4","up":true},{"one":"698247d103a8925d8bb4c56a3056e49c5efc595fced1c89d49943bb9ba01f394","other":"7fbc1843e2222e3c8e35a3215d1bbb4d5457d8b9ed33749e07e22f25ba9ee576","up":true},{"one":"73b8d1840d0a8ffe69752ec96f8fddecb0e22726c87982d572ca9acc1c9cdbfc","other":"48b614958a8692780ef5bd5c95e0db4ff67deb4de0dcbb878ca4479bfb86957e","up":true},{"one":"cbc5d42951bc6e187296b5f8ce4d04e472e26670a62851f39d65f31c50865f6a","other":"018adc613f78d6ec876274f821251fd049eb3651646cd69e27efe211fe88d936","up":true},{"one":"e16b12c708bc5e0545009daed44733c52d7450ccc797d158dd41a3bc9507b6be","other":"e55d8cdb7e7940b11929e7e5c949ef6beb7998e5180a1f0a3c0bf61aef39f1b8","up":true},{"one":"d0f398969480f3df3587f6d47546ff1261cad4d2e9c26ff3077e35ae1b26153e","other":"e55d8cdb7e7940b11929e7e5c949ef6beb7998e5180a1f0a3c0bf61aef39f1b8","up":true},{"one":"48b614958a8692780ef5bd5c95e0db4ff67deb4de0dcbb878ca4479bfb86957e","other":"372d47374a57d18cf134a1f8fc2d2fc10dfacfc0be9ed883183a349c896b3793","up":true},{"one":"b16dcdf1ff1a56d49e374531d9885d59c1bcfbb628604520d9b1d84662edb9ca","other":"b70e96f01ac8947d2de6320412ae3310316caba65c27108ad16b2f2004255be4","up":true},{"one":"539df902d42dc997c6b0e24d16ad68b54c557d56b41c972a320d57632dbfbe3c","other":"558eb021744be19383be9ac91b9f77e07479e0eb25576bd32a3afaa94c231178","up":true},{"one":"645b4e6b36fc1928725f627aeed278f46c5a7d6b0fff7ccff55a0468d47b23e8","other":"772e4c80d128deb52adf024a0eb6fe9bbea1c83351ed93f55f490cd5e5c69260","up":true},{"one":"7cf4838a7c83a736ce59cfa1b974674a0185dbe17a8f3cd29794a3bbe814adee","other":"6742cca1b7783fcbed8d0b340508f93cc4dfaca8ff3f13fd59354486c4d62993","up":true},{"one":"0506e949748b62da1d36b663df7d6a7e76027f72ced5d52f74677fb31d7e1505","other":"39dbd5462c90dac75f49d9af7996845943bbe929754ef8125eee7f5a763e9def","up":true},{"one":"621076ce6b82e70c90a4adf235aa6f71b116e302dd6b15dcae07f4a816012455","other":"6c82fdabd09e0e9d0fc507613a05951c02b2953d763a062a5f32aaf5cc477c19","up":true},{"one":"517aa977048247d5d16ad51a286ffac4d8f910733f0578b222201308c32d195e","other":"558eb021744be19383be9ac91b9f77e07479e0eb25576bd32a3afaa94c231178","up":true},{"one":"aebd6135d10252b07f891b3a7330903faf13d409c4f7108630715fa0754f938e","other":"afa3de5cebc9f96cf20a35058f4856fe43b48ac59cf8e46565f194f438622a52","up":true},{"one":"a75abd0dce5a488b7e06f91fab7a92ec428ab21bde9372c9e8fa489f48e7b3fe","other":"a085045c335ce2e47dbdfeb1adb62ce6c3bed36a93cf3448c45757a1a88e295d","up":true},{"one":"f36120ff250b9e7164e96021479332054f67de65cd2fe5b6e34bc51d0fe4d29c","other":"f74ecde0bbaa7b6521fb205b5ab9ea637909277f6e1ee1d3490f5cd01d0f7216","up":true},{"one":"8cf957bf95a629c60c31dbcfe75ecca149a81c761f8b34858b04f8318e5c74bd","other":"e0ea575d0e2efa28bc51f49d1e2c24196a196da3b3196f3a5a26a5e310809af5","up":true},{"one":"dc97c1a0019b482a048b8d15941dfe4c3c1a3443d9b2d7b4046370bc84a7e56f","other":"b92a71a4fc371e0596538a7fb2a33e85329c39c4409c99798d9318bc263a04a1","up":true},{"one":"667ef042e9dae18694581e0404c3d87a09800e8b42173d26571c3bf97e29a372","other":"73b8d1840d0a8ffe69752ec96f8fddecb0e22726c87982d572ca9acc1c9cdbfc","up":true},{"one":"2434c63e7f28b83e7feede7fe68ea99b989f8534f64d63b046733e2f474538f5","other":"26d1af1fbee6541a363ea7707825e37da028142f00779116560ad20f1de18e7b","up":true},{"one":"dfaeebc8e29c6a8f851b12b80cf42567cd2a43e35d977305a3c10e51bf41170a","other":"dc97c1a0019b482a048b8d15941dfe4c3c1a3443d9b2d7b4046370bc84a7e56f","up":true},{"one":"e55d8cdb7e7940b11929e7e5c949ef6beb7998e5180a1f0a3c0bf61aef39f1b8","other":"e0b1c4eb5b5b4dfc22344ee65cb9716cecb38dcc80099793f20641884eae4854","up":true},{"one":"4cd0f38e52a508f81cf95e1370c994aea2d7a49a2a08e3e054f53629a6619410","other":"4b243a5aeabec6db0e4a80a9c255300cd94591a6fbe0e0aa170da4f6ce14edff","up":true},{"one":"3ee4b20c047e701b58c06fcc8160364bd29573f61f4d9f1935d77ac29f6a1e86","other":"021811a6757bdcdd2fa0fb68401dfe009d5a8e129958cd304fb42cf51dc5d1d3","up":true},{"one":"3e56d4533ec14f6656e1eb25fb35dad47c9db479f667a6b6fe9a3aa8c12e982e","other":"38ab3d7bdfb293b88122404cb7c50b5fb890ce7664c075da95585557a430c403","up":true},{"one":"e77f6aa9e3dfcce0a2e5db794703224249aba60595075b2df9a5b0b30855cf46","other":"8be461203f5ebb5721348f537b37d768f7bd359af3e18d1f7e9af2f901c49845","up":true},{"one":"957d8a9b412b6f4cd151cbc07b8d74d949880ae665c545debb18181389c99ee6","other":"621076ce6b82e70c90a4adf235aa6f71b116e302dd6b15dcae07f4a816012455","up":true},{"one":"895bdcd200cc4d7ec5c24f1722d0a8ebedda78b78cdf1ccc8c22a981980f5786","other":"1929a84bcd64bf002d0afb16249466c5b660123174a1fc1bf881913f8c87d1fd","up":true},{"one":"f410d4ac9b748c24fa0d48c3053bb1cea8a67d0bcc4e5fcbdb261c0c7522cc34","other":"82f034db88fd26b47c26b95c3f87a1f454ffe4526ae86beb2bb1d8f2c218c25c","up":true},{"one":"c8e5a1b4533dd0de12acee4d31369f39785178568718b93bbc321ec83e0714f0","other":"ca036d1ef9e6ce3654f2d769f16926aa14957193586426489e15539dfa8f7763","up":true},{"one":"3ee4b20c047e701b58c06fcc8160364bd29573f61f4d9f1935d77ac29f6a1e86","other":"3e56d4533ec14f6656e1eb25fb35dad47c9db479f667a6b6fe9a3aa8c12e982e","up":true},{"one":"afa3de5cebc9f96cf20a35058f4856fe43b48ac59cf8e46565f194f438622a52","other":"82f034db88fd26b47c26b95c3f87a1f454ffe4526ae86beb2bb1d8f2c218c25c","up":true},{"one":"5a01993ff7b4bd12fdb259e96b26a036d0cf5d4ae9c9b516be64b63acec2443a","other":"47c3e0dfbbfcebeece78865c8c989577360cd9cc46a3b43f4b7b01ed14dc30e6","up":true},{"one":"ce99e9d37111c52e929b187fe201790b1a555dfb8b6b6de54e94df7cc2d43fd4","other":"c18105aa302a43e352d999745a0f806af9f8cb8bb83349357da5c85e8975acd1","up":true},{"one":"ed32d74d9be0649de1eb26b9915137fe46ec890c656c96be52e966ab6e2ed260","other":"ea0e1dd41fe042b09f273c98f02128949cf5561d20dc04b3d423961efed52327","up":true},{"one":"92a1501ed41e29bb7dd8eb4b4acecae983f4c7c83f39895cd68f7810b645f1dd","other":"9a9230b3f7f386520821dee78ebe92e8c64a4f6a50f2639327c62e45cab40563","up":true},{"one":"cbc5d42951bc6e187296b5f8ce4d04e472e26670a62851f39d65f31c50865f6a","other":"dfaeebc8e29c6a8f851b12b80cf42567cd2a43e35d977305a3c10e51bf41170a","up":true},{"one":"e16b12c708bc5e0545009daed44733c52d7450ccc797d158dd41a3bc9507b6be","other":"e0b1c4eb5b5b4dfc22344ee65cb9716cecb38dcc80099793f20641884eae4854","up":true},{"one":"026d2e41b82d506da685a30cce7cc5772f6c1e167b7d557e0531fb9b79dd4ff2","other":"962676818c17fae1ffc52fc29318c44f9b8c980afd6d3e98217b4088d568a808","up":true},{"one":"5abc96f4fa78812db6fb710fd424dd474145f7e5d00b4cedc5373b4c52f42cf5","other":"4b243a5aeabec6db0e4a80a9c255300cd94591a6fbe0e0aa170da4f6ce14edff","up":true},{"one":"7fbc1843e2222e3c8e35a3215d1bbb4d5457d8b9ed33749e07e22f25ba9ee576","other":"7b9242137f8cc2bec7b3e0003fd93026921ceb10dfadbbd5b6aa64d61a74f35e","up":true},{"one":"9a9230b3f7f386520821dee78ebe92e8c64a4f6a50f2639327c62e45cab40563","other":"8cf957bf95a629c60c31dbcfe75ecca149a81c761f8b34858b04f8318e5c74bd","up":true},{"one":"a085045c335ce2e47dbdfeb1adb62ce6c3bed36a93cf3448c45757a1a88e295d","other":"a2babe49410ae007bc41ff2b7deaf709ed849e2f69666ce5aae76a3b71f47081","up":true},{"one":"772e4c80d128deb52adf024a0eb6fe9bbea1c83351ed93f55f490cd5e5c69260","other":"7b9242137f8cc2bec7b3e0003fd93026921ceb10dfadbbd5b6aa64d61a74f35e","up":true},{"one":"dc97c1a0019b482a048b8d15941dfe4c3c1a3443d9b2d7b4046370bc84a7e56f","other":"db088103f3b6f2c784d76ecd99c8b4a77fd39bb39c72ddfd91c99c1a9dd3b75b","up":true},{"one":"92a1501ed41e29bb7dd8eb4b4acecae983f4c7c83f39895cd68f7810b645f1dd","other":"a7a61804d270ed6c27a4b1e8a634c30d7cdbaf644a1c67cbc6b08cd849a711db","up":true},{"one":"b2b9ac0f4db58886597af7b19d6150498ac8ad7c804671628aa34384b8fe505e","other":"b381e75e52e4cdd168056245f82d3a1747b67f400eb40eb12036b73ee7fe21e5","up":true},{"one":"895bdcd200cc4d7ec5c24f1722d0a8ebedda78b78cdf1ccc8c22a981980f5786","other":"b8e1a80d91216fd5f8bc3f7413caf68ade7f124354d44fe7bd155a089134a70a","up":true},{"one":"cbc5d42951bc6e187296b5f8ce4d04e472e26670a62851f39d65f31c50865f6a","other":"cdcd165721f6851f361fad0b3ba88c8870be9ad6d6b8cbcecc7c89e1068d979a","up":true},{"one":"3ee4b20c047e701b58c06fcc8160364bd29573f61f4d9f1935d77ac29f6a1e86","other":"286aeba646bba4a8aa1c372bee9f2c9ff0a2b3abb4f18be321225555c6dce4e5","up":true},{"one":"6d601952793589bc6b57340c451a6abf02ea2c16637e910eed04cde6eddfe17a","other":"6e5c213a2db57eaf2e1e1acc341c72efab89b0e42b6cd18db4f99ac1af151d65","up":true},{"one":"667ef042e9dae18694581e0404c3d87a09800e8b42173d26571c3bf97e29a372","other":"6ecb11fc5acc16ecd70351410fa18ec44a2a83d9e778cf25b85a7535493456b7","up":true},{"one":"78cbc19a24d095ab7858849058c65c061c52289b91ddd92cee34bed98aee4a59","other":"698247d103a8925d8bb4c56a3056e49c5efc595fced1c89d49943bb9ba01f394","up":true},{"one":"86ca1078dae40f23ae1b3ac47397460d9ec0bf243a0de372b405381d6722fcb2","other":"9ee7b3e06b453615cbd8737cb74515b150f518f1a2eaa2db90e54708dd161b7d","up":true},{"one":"5a01993ff7b4bd12fdb259e96b26a036d0cf5d4ae9c9b516be64b63acec2443a","other":"57764522162620c1ad0b166a9c43772255d0cc01e49f2122ef09db046804a570","up":true},{"one":"2459fe9250b3311c86530d00b7a9b8ba57b1b5151c126262e70c55d1e8d37924","other":"1929a84bcd64bf002d0afb16249466c5b660123174a1fc1bf881913f8c87d1fd","up":true},{"one":"b16dcdf1ff1a56d49e374531d9885d59c1bcfbb628604520d9b1d84662edb9ca","other":"db088103f3b6f2c784d76ecd99c8b4a77fd39bb39c72ddfd91c99c1a9dd3b75b","up":true},{"one":"cbc5d42951bc6e187296b5f8ce4d04e472e26670a62851f39d65f31c50865f6a","other":"f36084048bf0ff985a77f5183796f7b37b7085ee6eea8bbc5fc62558854cce67","up":true},{"one":"9e02c5384602a54e900cfa46d5987b77f16e74cba745ac850fcada01c7af9004","other":"2434c63e7f28b83e7feede7fe68ea99b989f8534f64d63b046733e2f474538f5","up":true},{"one":"3ee4b20c047e701b58c06fcc8160364bd29573f61f4d9f1935d77ac29f6a1e86","other":"06b95f1bac76ca4925d509b06216f2113ac5dcf051ef5aa0a320ae64069e0b6d","up":true},{"one":"f410d4ac9b748c24fa0d48c3053bb1cea8a67d0bcc4e5fcbdb261c0c7522cc34","other":"027fb496438782583f78fb76999336eed7fb672a9c9ea50d04df580e6eb21377","up":true},{"one":"47c3e0dfbbfcebeece78865c8c989577360cd9cc46a3b43f4b7b01ed14dc30e6","other":"5d608e66a17442091111cb472723fe3aea1f2baecaa546b57d49507c63a61cda","up":true},{"one":"a75abd0dce5a488b7e06f91fab7a92ec428ab21bde9372c9e8fa489f48e7b3fe","other":"b8e1a80d91216fd5f8bc3f7413caf68ade7f124354d44fe7bd155a089134a70a","up":true},{"one":"5a01993ff7b4bd12fdb259e96b26a036d0cf5d4ae9c9b516be64b63acec2443a","other":"419a6626dd026c0438461592121992c6be1868375011655b6d405166cd8edf7f","up":true},{"one":"621076ce6b82e70c90a4adf235aa6f71b116e302dd6b15dcae07f4a816012455","other":"7cf4838a7c83a736ce59cfa1b974674a0185dbe17a8f3cd29794a3bbe814adee","up":true},{"one":"cec3c01c147b34f25104ddd0b25076cef63ac224eada9d9f5a00b8513331354f","other":"cdcd165721f6851f361fad0b3ba88c8870be9ad6d6b8cbcecc7c89e1068d979a","up":true},{"one":"6742cca1b7783fcbed8d0b340508f93cc4dfaca8ff3f13fd59354486c4d62993","other":"7dc5e8d8180c1bc7ebbee11a47fc96e8fe8b2d71c30cbc4aa1cf99e8eb6afcac","up":true},{"one":"2a22dbee71a0ef27c840221db4a592d6dc8f171afed865ff814a37d633a3eaa9","other":"4b243a5aeabec6db0e4a80a9c255300cd94591a6fbe0e0aa170da4f6ce14edff","up":true},{"one":"2459fe9250b3311c86530d00b7a9b8ba57b1b5151c126262e70c55d1e8d37924","other":"2434c63e7f28b83e7feede7fe68ea99b989f8534f64d63b046733e2f474538f5","up":true},{"one":"86ca1078dae40f23ae1b3ac47397460d9ec0bf243a0de372b405381d6722fcb2","other":"e77f6aa9e3dfcce0a2e5db794703224249aba60595075b2df9a5b0b30855cf46","up":true},{"one":"db088103f3b6f2c784d76ecd99c8b4a77fd39bb39c72ddfd91c99c1a9dd3b75b","other":"b8411f198fd658c5a2028835c0af3342145839c06c8a4f382d9f9de485d46c08","up":true},{"one":"7355fab10584e4312f5cb5c3c826e7f9c14da74d62d07d0a8007ce9c6e995be9","other":"7b9242137f8cc2bec7b3e0003fd93026921ceb10dfadbbd5b6aa64d61a74f35e","up":true},{"one":"9d3c79e4a0ac4e5b95aa32545f3b8d86f74594faa237d5c2566cf02fbd60b11a","other":"1929a84bcd64bf002d0afb16249466c5b660123174a1fc1bf881913f8c87d1fd","up":true},{"one":"e0b1c4eb5b5b4dfc22344ee65cb9716cecb38dcc80099793f20641884eae4854","other":"edc8794153fb517085d27a83a4b00e8c3b37f22d2242b842cb2fab66764de9fe","up":true},{"one":"772e4c80d128deb52adf024a0eb6fe9bbea1c83351ed93f55f490cd5e5c69260","other":"7355fab10584e4312f5cb5c3c826e7f9c14da74d62d07d0a8007ce9c6e995be9","up":true},{"one":"6c029114a9f73d69a42e591cf2d13107eff038d3eda8abb0242d9d6d169f05c7","other":"6ecb11fc5acc16ecd70351410fa18ec44a2a83d9e778cf25b85a7535493456b7","up":true},{"one":"f410d4ac9b748c24fa0d48c3053bb1cea8a67d0bcc4e5fcbdb261c0c7522cc34","other":"042788d5b72cb84a375565d120d239a2b14fdf38b3f5f992284d78535077148a","up":true},{"one":"47c3e0dfbbfcebeece78865c8c989577360cd9cc46a3b43f4b7b01ed14dc30e6","other":"2459fe9250b3311c86530d00b7a9b8ba57b1b5151c126262e70c55d1e8d37924","up":true},{"one":"c18105aa302a43e352d999745a0f806af9f8cb8bb83349357da5c85e8975acd1","other":"ca036d1ef9e6ce3654f2d769f16926aa14957193586426489e15539dfa8f7763","up":true},{"one":"03907380afcd52238f3d84a8dee3df599c7f2f9b90fbc1271ee88bdb52acbd58","other":"0506e949748b62da1d36b663df7d6a7e76027f72ced5d52f74677fb31d7e1505","up":true},{"one":"2a22dbee71a0ef27c840221db4a592d6dc8f171afed865ff814a37d633a3eaa9","other":"0506e949748b62da1d36b663df7d6a7e76027f72ced5d52f74677fb31d7e1505","up":true},{"one":"b486ce31ce880db3aaa17a0ac2c2f3554b6fe71f9c051edb572974342af4adb9","other":"772e4c80d128deb52adf024a0eb6fe9bbea1c83351ed93f55f490cd5e5c69260","up":true},{"one":"645b4e6b36fc1928725f627aeed278f46c5a7d6b0fff7ccff55a0468d47b23e8","other":"757a557424c33ad89efd8185ec18d71c025830ecb2aed951e33c8c8d986d5933","up":true},{"one":"ea0e1dd41fe042b09f273c98f02128949cf5561d20dc04b3d423961efed52327","other":"edc8794153fb517085d27a83a4b00e8c3b37f22d2242b842cb2fab66764de9fe","up":true},{"one":"c8e5a1b4533dd0de12acee4d31369f39785178568718b93bbc321ec83e0714f0","other":"2434c63e7f28b83e7feede7fe68ea99b989f8534f64d63b046733e2f474538f5","up":true},{"one":"a3205c1c4f9b72814f0db68e888e3c7ef88f27c681ed0d731dde5f0999f92ccc","other":"8b76194f129308324c7d0066530e02cac2410ee0ba952822f0ec866e12461e44","up":true},{"one":"edc8794153fb517085d27a83a4b00e8c3b37f22d2242b842cb2fab66764de9fe","other":"f74ecde0bbaa7b6521fb205b5ab9ea637909277f6e1ee1d3490f5cd01d0f7216","up":true},{"one":"0ff67b0e9ec6509c7786495b7b3ddb176b4f8221ff300f409f00a3d389e8874c","other":"b486ce31ce880db3aaa17a0ac2c2f3554b6fe71f9c051edb572974342af4adb9","up":true},{"one":"e0ea575d0e2efa28bc51f49d1e2c24196a196da3b3196f3a5a26a5e310809af5","other":"e77f6aa9e3dfcce0a2e5db794703224249aba60595075b2df9a5b0b30855cf46","up":true},{"one":"b16dcdf1ff1a56d49e374531d9885d59c1bcfbb628604520d9b1d84662edb9ca","other":"c18105aa302a43e352d999745a0f806af9f8cb8bb83349357da5c85e8975acd1","up":true},{"one":"962676818c17fae1ffc52fc29318c44f9b8c980afd6d3e98217b4088d568a808","other":"f36120ff250b9e7164e96021479332054f67de65cd2fe5b6e34bc51d0fe4d29c","up":true},{"one":"26d1af1fbee6541a363ea7707825e37da028142f00779116560ad20f1de18e7b","other":"3cb1b4069727dc323a687cab4ca2764f6415450488706f1b97c5cb8ca46346ff","up":true},{"one":"5d608e66a17442091111cb472723fe3aea1f2baecaa546b57d49507c63a61cda","other":"645b4e6b36fc1928725f627aeed278f46c5a7d6b0fff7ccff55a0468d47b23e8","up":true},{"one":"78cbc19a24d095ab7858849058c65c061c52289b91ddd92cee34bed98aee4a59","other":"6c82fdabd09e0e9d0fc507613a05951c02b2953d763a062a5f32aaf5cc477c19","up":true},{"one":"021811a6757bdcdd2fa0fb68401dfe009d5a8e129958cd304fb42cf51dc5d1d3","other":"0ab9845c2890b0a64a3e5932241245e00b817b788094f9ee48f86f80b7264fea","up":true},{"one":"73b8d1840d0a8ffe69752ec96f8fddecb0e22726c87982d572ca9acc1c9cdbfc","other":"7fbc1843e2222e3c8e35a3215d1bbb4d5457d8b9ed33749e07e22f25ba9ee576","up":true},{"one":"b381e75e52e4cdd168056245f82d3a1747b67f400eb40eb12036b73ee7fe21e5","other":"e16b12c708bc5e0545009daed44733c52d7450ccc797d158dd41a3bc9507b6be","up":true},{"one":"4cd0f38e52a508f81cf95e1370c994aea2d7a49a2a08e3e054f53629a6619410","other":"0bcf8a8ab0065ca8c85b8b6641f4c6e0b0de60e79ef32ebf6ff8f109ac4e1d70","up":true},{"one":"5abc96f4fa78812db6fb710fd424dd474145f7e5d00b4cedc5373b4c52f42cf5","other":"4a1811dd9febde1801a604ad81de84a2d15366d0b5c330f30f3398da0d107824","up":true},{"one":"621076ce6b82e70c90a4adf235aa6f71b116e302dd6b15dcae07f4a816012455","other":"698247d103a8925d8bb4c56a3056e49c5efc595fced1c89d49943bb9ba01f394","up":true},{"one":"4167946de250b013e1be16ee84bfe2ccaae83e699e618b38f31016c4e431e6ba","other":"6742cca1b7783fcbed8d0b340508f93cc4dfaca8ff3f13fd59354486c4d62993","up":true},{"one":"7cf4838a7c83a736ce59cfa1b974674a0185dbe17a8f3cd29794a3bbe814adee","other":"7b9242137f8cc2bec7b3e0003fd93026921ceb10dfadbbd5b6aa64d61a74f35e","up":true},{"one":"026d2e41b82d506da685a30cce7cc5772f6c1e167b7d557e0531fb9b79dd4ff2","other":"3cb1b4069727dc323a687cab4ca2764f6415450488706f1b97c5cb8ca46346ff","up":true},{"one":"cbc5d42951bc6e187296b5f8ce4d04e472e26670a62851f39d65f31c50865f6a","other":"1be4348ec5670cdc4f164d77b1356e7910b6d1be4a9b720e549d02e5482a9e78","up":true},{"one":"026d2e41b82d506da685a30cce7cc5772f6c1e167b7d557e0531fb9b79dd4ff2","other":"83dc556ed36f37d06765be2554fe86eaf1ec21e2931fb22403238453bf021dfb","up":true},{"one":"734e029ed25485edd49b93dd9e85b6e7657f860e4ded4bc8a5094f512ae5836b","other":"6e5c213a2db57eaf2e1e1acc341c72efab89b0e42b6cd18db4f99ac1af151d65","up":true},{"one":"03907380afcd52238f3d84a8dee3df599c7f2f9b90fbc1271ee88bdb52acbd58","other":"ed32d74d9be0649de1eb26b9915137fe46ec890c656c96be52e966ab6e2ed260","up":true},{"one":"39dbd5462c90dac75f49d9af7996845943bbe929754ef8125eee7f5a763e9def","other":"91eba9f9c8f2929d38f43a0c7efa809c0d2d59a31cbf2760c90e73d20266d528","up":true},{"one":"d6ffb7fd2668e9b7b133bd9144156f4736191ef0d6e72b072759782d83931f22","other":"734e029ed25485edd49b93dd9e85b6e7657f860e4ded4bc8a5094f512ae5836b","up":true},{"one":"c8e5a1b4533dd0de12acee4d31369f39785178568718b93bbc321ec83e0714f0","other":"d2245f0679b436faabc0164e0b85e02e2effbad306e8229b555524a5e6d1a5f9","up":true},{"one":"7355fab10584e4312f5cb5c3c826e7f9c14da74d62d07d0a8007ce9c6e995be9","other":"7dc5e8d8180c1bc7ebbee11a47fc96e8fe8b2d71c30cbc4aa1cf99e8eb6afcac","up":true},{"one":"895bdcd200cc4d7ec5c24f1722d0a8ebedda78b78cdf1ccc8c22a981980f5786","other":"82f034db88fd26b47c26b95c3f87a1f454ffe4526ae86beb2bb1d8f2c218c25c","up":true},{"one":"0ff67b0e9ec6509c7786495b7b3ddb176b4f8221ff300f409f00a3d389e8874c","other":"b2b9ac0f4db58886597af7b19d6150498ac8ad7c804671628aa34384b8fe505e","up":true},{"one":"cec3c01c147b34f25104ddd0b25076cef63ac224eada9d9f5a00b8513331354f","other":"213bf6e78e02a57585908c756f0965297152c3c400a0ed4c407a411e1ec5942d","up":true},{"one":"1be4348ec5670cdc4f164d77b1356e7910b6d1be4a9b720e549d02e5482a9e78","other":"f36084048bf0ff985a77f5183796f7b37b7085ee6eea8bbc5fc62558854cce67","up":true},{"one":"109ef17c890104bfc5a4897d526a0afaa8c991c9d213616032f3058d0feb7f00","other":"ad0d0dc5d4114ee4482d6c9bd4e46683327abf2b92df0d242d79019963876668","up":true},{"one":"4167946de250b013e1be16ee84bfe2ccaae83e699e618b38f31016c4e431e6ba","other":"698247d103a8925d8bb4c56a3056e49c5efc595fced1c89d49943bb9ba01f394","up":true},{"one":"06b95f1bac76ca4925d509b06216f2113ac5dcf051ef5aa0a320ae64069e0b6d","other":"0506e949748b62da1d36b663df7d6a7e76027f72ced5d52f74677fb31d7e1505","up":true},{"one":"67288f84ada7778858139c74917b22ae698ed43df49a6530a566648f074ede46","other":"6742cca1b7783fcbed8d0b340508f93cc4dfaca8ff3f13fd59354486c4d62993","up":true},{"one":"c18105aa302a43e352d999745a0f806af9f8cb8bb83349357da5c85e8975acd1","other":"8b76194f129308324c7d0066530e02cac2410ee0ba952822f0ec866e12461e44","up":true},{"one":"957d8a9b412b6f4cd151cbc07b8d74d949880ae665c545debb18181389c99ee6","other":"667ef042e9dae18694581e0404c3d87a09800e8b42173d26571c3bf97e29a372","up":true},{"one":"1929a84bcd64bf002d0afb16249466c5b660123174a1fc1bf881913f8c87d1fd","other":"39dbd5462c90dac75f49d9af7996845943bbe929754ef8125eee7f5a763e9def","up":true},{"one":"a085045c335ce2e47dbdfeb1adb62ce6c3bed36a93cf3448c45757a1a88e295d","other":"2a22dbee71a0ef27c840221db4a592d6dc8f171afed865ff814a37d633a3eaa9","up":true},{"one":"f36084048bf0ff985a77f5183796f7b37b7085ee6eea8bbc5fc62558854cce67","other":"d0f398969480f3df3587f6d47546ff1261cad4d2e9c26ff3077e35ae1b26153e","up":true},{"one":"ad0d0dc5d4114ee4482d6c9bd4e46683327abf2b92df0d242d79019963876668","other":"afa3de5cebc9f96cf20a35058f4856fe43b48ac59cf8e46565f194f438622a52","up":true},{"one":"38ab3d7bdfb293b88122404cb7c50b5fb890ce7664c075da95585557a430c403","other":"2a22dbee71a0ef27c840221db4a592d6dc8f171afed865ff814a37d633a3eaa9","up":true},{"one":"8cf957bf95a629c60c31dbcfe75ecca149a81c761f8b34858b04f8318e5c74bd","other":"82f034db88fd26b47c26b95c3f87a1f454ffe4526ae86beb2bb1d8f2c218c25c","up":true},{"one":"8be461203f5ebb5721348f537b37d768f7bd359af3e18d1f7e9af2f901c49845","other":"83dc556ed36f37d06765be2554fe86eaf1ec21e2931fb22403238453bf021dfb","up":true},{"one":"018adc613f78d6ec876274f821251fd049eb3651646cd69e27efe211fe88d936","other":"2a22dbee71a0ef27c840221db4a592d6dc8f171afed865ff814a37d633a3eaa9","up":true},{"one":"7fbc1843e2222e3c8e35a3215d1bbb4d5457d8b9ed33749e07e22f25ba9ee576","other":"6c82fdabd09e0e9d0fc507613a05951c02b2953d763a062a5f32aaf5cc477c19","up":true},{"one":"41b9ee7ad19698e97589b059ad3333cb64f02c16006d94fb3d0bad7ced8ff238","other":"213bf6e78e02a57585908c756f0965297152c3c400a0ed4c407a411e1ec5942d","up":true},{"one":"026d2e41b82d506da685a30cce7cc5772f6c1e167b7d557e0531fb9b79dd4ff2","other":"2a22dbee71a0ef27c840221db4a592d6dc8f171afed865ff814a37d633a3eaa9","up":true},{"one":"0506e949748b62da1d36b663df7d6a7e76027f72ced5d52f74677fb31d7e1505","other":"372d47374a57d18cf134a1f8fc2d2fc10dfacfc0be9ed883183a349c896b3793","up":true},{"one":"ea60ef7cb3f2166a5c8e286c885984943a2ea5aff4730015be6a15031040cecf","other":"ea0e1dd41fe042b09f273c98f02128949cf5561d20dc04b3d423961efed52327","up":true},{"one":"517aa977048247d5d16ad51a286ffac4d8f910733f0578b222201308c32d195e","other":"757a557424c33ad89efd8185ec18d71c025830ecb2aed951e33c8c8d986d5933","up":true},{"one":"aebd6135d10252b07f891b3a7330903faf13d409c4f7108630715fa0754f938e","other":"027fb496438782583f78fb76999336eed7fb672a9c9ea50d04df580e6eb21377","up":true},{"one":"772e4c80d128deb52adf024a0eb6fe9bbea1c83351ed93f55f490cd5e5c69260","other":"734e029ed25485edd49b93dd9e85b6e7657f860e4ded4bc8a5094f512ae5836b","up":true},{"one":"ebca518e5146f49ac75bcaa8add2ef4d1d22c5cfd2e2326c6b41826d45ce55ae","other":"edc8794153fb517085d27a83a4b00e8c3b37f22d2242b842cb2fab66764de9fe","up":true},{"one":"86ca1078dae40f23ae1b3ac47397460d9ec0bf243a0de372b405381d6722fcb2","other":"957d8a9b412b6f4cd151cbc07b8d74d949880ae665c545debb18181389c99ee6","up":true},{"one":"7f87da7ee55b4c8c8f9d55411ff88d3a0b63bfee6a516917d49fa6273fb5b86a","other":"698247d103a8925d8bb4c56a3056e49c5efc595fced1c89d49943bb9ba01f394","up":true},{"one":"41b9ee7ad19698e97589b059ad3333cb64f02c16006d94fb3d0bad7ced8ff238","other":"2459fe9250b3311c86530d00b7a9b8ba57b1b5151c126262e70c55d1e8d37924","up":true},{"one":"91eba9f9c8f2929d38f43a0c7efa809c0d2d59a31cbf2760c90e73d20266d528","other":"afa3de5cebc9f96cf20a35058f4856fe43b48ac59cf8e46565f194f438622a52","up":true},{"one":"b2b9ac0f4db58886597af7b19d6150498ac8ad7c804671628aa34384b8fe505e","other":"539df902d42dc997c6b0e24d16ad68b54c557d56b41c972a320d57632dbfbe3c","up":true},{"one":"c8e5a1b4533dd0de12acee4d31369f39785178568718b93bbc321ec83e0714f0","other":"2459fe9250b3311c86530d00b7a9b8ba57b1b5151c126262e70c55d1e8d37924","up":true},{"one":"13bc64535d3ae495098e4ac6b30a91d1804dab0ab79944f2c6ac53c9bccdf62d","other":"e55d8cdb7e7940b11929e7e5c949ef6beb7998e5180a1f0a3c0bf61aef39f1b8","up":true},{"one":"e16b12c708bc5e0545009daed44733c52d7450ccc797d158dd41a3bc9507b6be","other":"0ab9845c2890b0a64a3e5932241245e00b817b788094f9ee48f86f80b7264fea","up":true},{"one":"645b4e6b36fc1928725f627aeed278f46c5a7d6b0fff7ccff55a0468d47b23e8","other":"47c3e0dfbbfcebeece78865c8c989577360cd9cc46a3b43f4b7b01ed14dc30e6","up":true},{"one":"286aeba646bba4a8aa1c372bee9f2c9ff0a2b3abb4f18be321225555c6dce4e5","other":"3cb1b4069727dc323a687cab4ca2764f6415450488706f1b97c5cb8ca46346ff","up":true},{"one":"ed32d74d9be0649de1eb26b9915137fe46ec890c656c96be52e966ab6e2ed260","other":"ea60ef7cb3f2166a5c8e286c885984943a2ea5aff4730015be6a15031040cecf","up":true},{"one":"109ef17c890104bfc5a4897d526a0afaa8c991c9d213616032f3058d0feb7f00","other":"ae67fae4990da61ca89221c5b1675c992babb4d715b59939e47bd1491b3bf1f4","up":true},{"one":"e0ea575d0e2efa28bc51f49d1e2c24196a196da3b3196f3a5a26a5e310809af5","other":"e0b1c4eb5b5b4dfc22344ee65cb9716cecb38dcc80099793f20641884eae4854","up":true},{"one":"895bdcd200cc4d7ec5c24f1722d0a8ebedda78b78cdf1ccc8c22a981980f5786","other":"9e02c5384602a54e900cfa46d5987b77f16e74cba745ac850fcada01c7af9004","up":true},{"one":"0bcf8a8ab0065ca8c85b8b6641f4c6e0b0de60e79ef32ebf6ff8f109ac4e1d70","other":"39dbd5462c90dac75f49d9af7996845943bbe929754ef8125eee7f5a763e9def","up":true},{"one":"9d3c79e4a0ac4e5b95aa32545f3b8d86f74594faa237d5c2566cf02fbd60b11a","other":"13bc64535d3ae495098e4ac6b30a91d1804dab0ab79944f2c6ac53c9bccdf62d","up":true},{"one":"7dc5e8d8180c1bc7ebbee11a47fc96e8fe8b2d71c30cbc4aa1cf99e8eb6afcac","other":"e55d8cdb7e7940b11929e7e5c949ef6beb7998e5180a1f0a3c0bf61aef39f1b8","up":true},{"one":"b8e1a80d91216fd5f8bc3f7413caf68ade7f124354d44fe7bd155a089134a70a","other":"89c883d6a85472bda328667e3fd805c70876bc582ca6763ab97ae636b1772be4","up":true},{"one":"621076ce6b82e70c90a4adf235aa6f71b116e302dd6b15dcae07f4a816012455","other":"6742cca1b7783fcbed8d0b340508f93cc4dfaca8ff3f13fd59354486c4d62993","up":true},{"one":"c18105aa302a43e352d999745a0f806af9f8cb8bb83349357da5c85e8975acd1","other":"cbc5d42951bc6e187296b5f8ce4d04e472e26670a62851f39d65f31c50865f6a","up":true},{"one":"7f87da7ee55b4c8c8f9d55411ff88d3a0b63bfee6a516917d49fa6273fb5b86a","other":"6c82fdabd09e0e9d0fc507613a05951c02b2953d763a062a5f32aaf5cc477c19","up":true},{"one":"13bc64535d3ae495098e4ac6b30a91d1804dab0ab79944f2c6ac53c9bccdf62d","other":"e16b12c708bc5e0545009daed44733c52d7450ccc797d158dd41a3bc9507b6be","up":true},{"one":"3ee4b20c047e701b58c06fcc8160364bd29573f61f4d9f1935d77ac29f6a1e86","other":"47c3e0dfbbfcebeece78865c8c989577360cd9cc46a3b43f4b7b01ed14dc30e6","up":true},{"one":"afa3de5cebc9f96cf20a35058f4856fe43b48ac59cf8e46565f194f438622a52","other":"92a1501ed41e29bb7dd8eb4b4acecae983f4c7c83f39895cd68f7810b645f1dd","up":true},{"one":"6d601952793589bc6b57340c451a6abf02ea2c16637e910eed04cde6eddfe17a","other":"6c029114a9f73d69a42e591cf2d13107eff038d3eda8abb0242d9d6d169f05c7","up":true},{"one":"b486ce31ce880db3aaa17a0ac2c2f3554b6fe71f9c051edb572974342af4adb9","other":"7639f9a66e8ff70f554c346faa25f78140957c295b748fc42a12df7972f4fcc6","up":true},{"one":"b92a71a4fc371e0596538a7fb2a33e85329c39c4409c99798d9318bc263a04a1","other":"b8411f198fd658c5a2028835c0af3342145839c06c8a4f382d9f9de485d46c08","up":true},{"one":"b8411f198fd658c5a2028835c0af3342145839c06c8a4f382d9f9de485d46c08","other":"b16dcdf1ff1a56d49e374531d9885d59c1bcfbb628604520d9b1d84662edb9ca","up":true},{"one":"ae67fae4990da61ca89221c5b1675c992babb4d715b59939e47bd1491b3bf1f4","other":"a3205c1c4f9b72814f0db68e888e3c7ef88f27c681ed0d731dde5f0999f92ccc","up":true},{"one":"92a1501ed41e29bb7dd8eb4b4acecae983f4c7c83f39895cd68f7810b645f1dd","other":"cfbb9ea682becadeab10bbd080ba8e93510085a87ac519e434964faa222fc275","up":true},{"one":"6ecb11fc5acc16ecd70351410fa18ec44a2a83d9e778cf25b85a7535493456b7","other":"698247d103a8925d8bb4c56a3056e49c5efc595fced1c89d49943bb9ba01f394","up":true},{"one":"5abc96f4fa78812db6fb710fd424dd474145f7e5d00b4cedc5373b4c52f42cf5","other":"5d608e66a17442091111cb472723fe3aea1f2baecaa546b57d49507c63a61cda","up":true},{"one":"b2b9ac0f4db58886597af7b19d6150498ac8ad7c804671628aa34384b8fe505e","other":"4b243a5aeabec6db0e4a80a9c255300cd94591a6fbe0e0aa170da4f6ce14edff","up":true},{"one":"6c82fdabd09e0e9d0fc507613a05951c02b2953d763a062a5f32aaf5cc477c19","other":"6742cca1b7783fcbed8d0b340508f93cc4dfaca8ff3f13fd59354486c4d62993","up":true},{"one":"f410d4ac9b748c24fa0d48c3053bb1cea8a67d0bcc4e5fcbdb261c0c7522cc34","other":"06b95f1bac76ca4925d509b06216f2113ac5dcf051ef5aa0a320ae64069e0b6d","up":true},{"one":"757a557424c33ad89efd8185ec18d71c025830ecb2aed951e33c8c8d986d5933","other":"dc97c1a0019b482a048b8d15941dfe4c3c1a3443d9b2d7b4046370bc84a7e56f","up":true},{"one":"4167946de250b013e1be16ee84bfe2ccaae83e699e618b38f31016c4e431e6ba","other":"73b8d1840d0a8ffe69752ec96f8fddecb0e22726c87982d572ca9acc1c9cdbfc","up":true},{"one":"83dc556ed36f37d06765be2554fe86eaf1ec21e2931fb22403238453bf021dfb","other":"8cf957bf95a629c60c31dbcfe75ecca149a81c761f8b34858b04f8318e5c74bd","up":true},{"one":"cdcd165721f6851f361fad0b3ba88c8870be9ad6d6b8cbcecc7c89e1068d979a","other":"ce99e9d37111c52e929b187fe201790b1a555dfb8b6b6de54e94df7cc2d43fd4","up":true},{"one":"6d601952793589bc6b57340c451a6abf02ea2c16637e910eed04cde6eddfe17a","other":"dfaeebc8e29c6a8f851b12b80cf42567cd2a43e35d977305a3c10e51bf41170a","up":true},{"one":"edc8794153fb517085d27a83a4b00e8c3b37f22d2242b842cb2fab66764de9fe","other":"f36084048bf0ff985a77f5183796f7b37b7085ee6eea8bbc5fc62558854cce67","up":true},{"one":"b70e96f01ac8947d2de6320412ae3310316caba65c27108ad16b2f2004255be4","other":"b381e75e52e4cdd168056245f82d3a1747b67f400eb40eb12036b73ee7fe21e5","up":true},{"one":"b8e1a80d91216fd5f8bc3f7413caf68ade7f124354d44fe7bd155a089134a70a","other":"b8411f198fd658c5a2028835c0af3342145839c06c8a4f382d9f9de485d46c08","up":true},{"one":"cec3c01c147b34f25104ddd0b25076cef63ac224eada9d9f5a00b8513331354f","other":"2459fe9250b3311c86530d00b7a9b8ba57b1b5151c126262e70c55d1e8d37924","up":true},{"one":"c3a1b301bf187fd8326831197d93a0266ac0cc8287b9008631240e2bec9cf337","other":"ed32d74d9be0649de1eb26b9915137fe46ec890c656c96be52e966ab6e2ed260","up":true},{"one":"4cd0f38e52a508f81cf95e1370c994aea2d7a49a2a08e3e054f53629a6619410","other":"0ff67b0e9ec6509c7786495b7b3ddb176b4f8221ff300f409f00a3d389e8874c","up":true},{"one":"e77f6aa9e3dfcce0a2e5db794703224249aba60595075b2df9a5b0b30855cf46","other":"83dc556ed36f37d06765be2554fe86eaf1ec21e2931fb22403238453bf021dfb","up":true},{"one":"7639f9a66e8ff70f554c346faa25f78140957c295b748fc42a12df7972f4fcc6","other":"7b9242137f8cc2bec7b3e0003fd93026921ceb10dfadbbd5b6aa64d61a74f35e","up":true},{"one":"89c883d6a85472bda328667e3fd805c70876bc582ca6763ab97ae636b1772be4","other":"2434c63e7f28b83e7feede7fe68ea99b989f8534f64d63b046733e2f474538f5","up":true},{"one":"a75abd0dce5a488b7e06f91fab7a92ec428ab21bde9372c9e8fa489f48e7b3fe","other":"afa3de5cebc9f96cf20a35058f4856fe43b48ac59cf8e46565f194f438622a52","up":true},{"one":"5d608e66a17442091111cb472723fe3aea1f2baecaa546b57d49507c63a61cda","other":"57764522162620c1ad0b166a9c43772255d0cc01e49f2122ef09db046804a570","up":true},{"one":"6ecb11fc5acc16ecd70351410fa18ec44a2a83d9e778cf25b85a7535493456b7","other":"734e029ed25485edd49b93dd9e85b6e7657f860e4ded4bc8a5094f512ae5836b","up":true},{"one":"7f87da7ee55b4c8c8f9d55411ff88d3a0b63bfee6a516917d49fa6273fb5b86a","other":"6742cca1b7783fcbed8d0b340508f93cc4dfaca8ff3f13fd59354486c4d62993","up":true},{"one":"b486ce31ce880db3aaa17a0ac2c2f3554b6fe71f9c051edb572974342af4adb9","other":"b8411f198fd658c5a2028835c0af3342145839c06c8a4f382d9f9de485d46c08","up":true},{"one":"aebd6135d10252b07f891b3a7330903faf13d409c4f7108630715fa0754f938e","other":"042788d5b72cb84a375565d120d239a2b14fdf38b3f5f992284d78535077148a","up":true},{"one":"dfaeebc8e29c6a8f851b12b80cf42567cd2a43e35d977305a3c10e51bf41170a","other":"f74ecde0bbaa7b6521fb205b5ab9ea637909277f6e1ee1d3490f5cd01d0f7216","up":true},{"one":"a2babe49410ae007bc41ff2b7deaf709ed849e2f69666ce5aae76a3b71f47081","other":"a3205c1c4f9b72814f0db68e888e3c7ef88f27c681ed0d731dde5f0999f92ccc","up":true},{"one":"ad0d0dc5d4114ee4482d6c9bd4e46683327abf2b92df0d242d79019963876668","other":"82f034db88fd26b47c26b95c3f87a1f454ffe4526ae86beb2bb1d8f2c218c25c","up":true},{"one":"82f034db88fd26b47c26b95c3f87a1f454ffe4526ae86beb2bb1d8f2c218c25c","other":"f36084048bf0ff985a77f5183796f7b37b7085ee6eea8bbc5fc62558854cce67","up":true},{"one":"41b9ee7ad19698e97589b059ad3333cb64f02c16006d94fb3d0bad7ced8ff238","other":"2434c63e7f28b83e7feede7fe68ea99b989f8534f64d63b046733e2f474538f5","up":true},{"one":"895bdcd200cc4d7ec5c24f1722d0a8ebedda78b78cdf1ccc8c22a981980f5786","other":"1be4348ec5670cdc4f164d77b1356e7910b6d1be4a9b720e549d02e5482a9e78","up":true},{"one":"cbc5d42951bc6e187296b5f8ce4d04e472e26670a62851f39d65f31c50865f6a","other":"027fb496438782583f78fb76999336eed7fb672a9c9ea50d04df580e6eb21377","up":true},{"one":"027fb496438782583f78fb76999336eed7fb672a9c9ea50d04df580e6eb21377","other":"0506e949748b62da1d36b663df7d6a7e76027f72ced5d52f74677fb31d7e1505","up":true},{"one":"962676818c17fae1ffc52fc29318c44f9b8c980afd6d3e98217b4088d568a808","other":"39dbd5462c90dac75f49d9af7996845943bbe929754ef8125eee7f5a763e9def","up":true},{"one":"91eba9f9c8f2929d38f43a0c7efa809c0d2d59a31cbf2760c90e73d20266d528","other":"92a1501ed41e29bb7dd8eb4b4acecae983f4c7c83f39895cd68f7810b645f1dd","up":true},{"one":"5abc96f4fa78812db6fb710fd424dd474145f7e5d00b4cedc5373b4c52f42cf5","other":"5a01993ff7b4bd12fdb259e96b26a036d0cf5d4ae9c9b516be64b63acec2443a","up":true},{"one":"3ee4b20c047e701b58c06fcc8160364bd29573f61f4d9f1935d77ac29f6a1e86","other":"027fb496438782583f78fb76999336eed7fb672a9c9ea50d04df580e6eb21377","up":true},{"one":"3e56d4533ec14f6656e1eb25fb35dad47c9db479f667a6b6fe9a3aa8c12e982e","other":"48b614958a8692780ef5bd5c95e0db4ff67deb4de0dcbb878ca4479bfb86957e","up":true},{"one":"03907380afcd52238f3d84a8dee3df599c7f2f9b90fbc1271ee88bdb52acbd58","other":"e0ea575d0e2efa28bc51f49d1e2c24196a196da3b3196f3a5a26a5e310809af5","up":true},{"one":"a3205c1c4f9b72814f0db68e888e3c7ef88f27c681ed0d731dde5f0999f92ccc","other":"b16dcdf1ff1a56d49e374531d9885d59c1bcfbb628604520d9b1d84662edb9ca","up":true},{"one":"026d2e41b82d506da685a30cce7cc5772f6c1e167b7d557e0531fb9b79dd4ff2","other":"8cf957bf95a629c60c31dbcfe75ecca149a81c761f8b34858b04f8318e5c74bd","up":true},{"one":"7cf4838a7c83a736ce59cfa1b974674a0185dbe17a8f3cd29794a3bbe814adee","other":"734e029ed25485edd49b93dd9e85b6e7657f860e4ded4bc8a5094f512ae5836b","up":true},{"one":"957d8a9b412b6f4cd151cbc07b8d74d949880ae665c545debb18181389c99ee6","other":"6742cca1b7783fcbed8d0b340508f93cc4dfaca8ff3f13fd59354486c4d62993","up":true},{"one":"ed32d74d9be0649de1eb26b9915137fe46ec890c656c96be52e966ab6e2ed260","other":"edc8794153fb517085d27a83a4b00e8c3b37f22d2242b842cb2fab66764de9fe","up":true},{"one":"372d47374a57d18cf134a1f8fc2d2fc10dfacfc0be9ed883183a349c896b3793","other":"4a1811dd9febde1801a604ad81de84a2d15366d0b5c330f30f3398da0d107824","up":true},{"one":"d6ffb7fd2668e9b7b133bd9144156f4736191ef0d6e72b072759782d83931f22","other":"772e4c80d128deb52adf024a0eb6fe9bbea1c83351ed93f55f490cd5e5c69260","up":true},{"one":"621076ce6b82e70c90a4adf235aa6f71b116e302dd6b15dcae07f4a816012455","other":"a7a61804d270ed6c27a4b1e8a634c30d7cdbaf644a1c67cbc6b08cd849a711db","up":true},{"one":"9d3c79e4a0ac4e5b95aa32545f3b8d86f74594faa237d5c2566cf02fbd60b11a","other":"03907380afcd52238f3d84a8dee3df599c7f2f9b90fbc1271ee88bdb52acbd58","up":true},{"one":"f410d4ac9b748c24fa0d48c3053bb1cea8a67d0bcc4e5fcbdb261c0c7522cc34","other":"b381e75e52e4cdd168056245f82d3a1747b67f400eb40eb12036b73ee7fe21e5","up":true},{"one":"213bf6e78e02a57585908c756f0965297152c3c400a0ed4c407a411e1ec5942d","other":"286aeba646bba4a8aa1c372bee9f2c9ff0a2b3abb4f18be321225555c6dce4e5","up":true},{"one":"6d601952793589bc6b57340c451a6abf02ea2c16637e910eed04cde6eddfe17a","other":"698247d103a8925d8bb4c56a3056e49c5efc595fced1c89d49943bb9ba01f394","up":true},{"one":"2459fe9250b3311c86530d00b7a9b8ba57b1b5151c126262e70c55d1e8d37924","other":"3cb1b4069727dc323a687cab4ca2764f6415450488706f1b97c5cb8ca46346ff","up":true},{"one":"5a01993ff7b4bd12fdb259e96b26a036d0cf5d4ae9c9b516be64b63acec2443a","other":"5d608e66a17442091111cb472723fe3aea1f2baecaa546b57d49507c63a61cda","up":true},{"one":"ea0e1dd41fe042b09f273c98f02128949cf5561d20dc04b3d423961efed52327","other":"7dc5e8d8180c1bc7ebbee11a47fc96e8fe8b2d71c30cbc4aa1cf99e8eb6afcac","up":true},{"one":"ea60ef7cb3f2166a5c8e286c885984943a2ea5aff4730015be6a15031040cecf","other":"2459fe9250b3311c86530d00b7a9b8ba57b1b5151c126262e70c55d1e8d37924","up":true},{"one":"6742cca1b7783fcbed8d0b340508f93cc4dfaca8ff3f13fd59354486c4d62993","other":"667ef042e9dae18694581e0404c3d87a09800e8b42173d26571c3bf97e29a372","up":true},{"one":"4167946de250b013e1be16ee84bfe2ccaae83e699e618b38f31016c4e431e6ba","other":"78cbc19a24d095ab7858849058c65c061c52289b91ddd92cee34bed98aee4a59","up":true},{"one":"9a9230b3f7f386520821dee78ebe92e8c64a4f6a50f2639327c62e45cab40563","other":"86ca1078dae40f23ae1b3ac47397460d9ec0bf243a0de372b405381d6722fcb2","up":true},{"one":"9d3c79e4a0ac4e5b95aa32545f3b8d86f74594faa237d5c2566cf02fbd60b11a","other":"39dbd5462c90dac75f49d9af7996845943bbe929754ef8125eee7f5a763e9def","up":true},{"one":"3cb1b4069727dc323a687cab4ca2764f6415450488706f1b97c5cb8ca46346ff","other":"042788d5b72cb84a375565d120d239a2b14fdf38b3f5f992284d78535077148a","up":true},{"one":"f410d4ac9b748c24fa0d48c3053bb1cea8a67d0bcc4e5fcbdb261c0c7522cc34","other":"0ff67b0e9ec6509c7786495b7b3ddb176b4f8221ff300f409f00a3d389e8874c","up":true},{"one":"1be4348ec5670cdc4f164d77b1356e7910b6d1be4a9b720e549d02e5482a9e78","other":"f36120ff250b9e7164e96021479332054f67de65cd2fe5b6e34bc51d0fe4d29c","up":true},{"one":"0bcf8a8ab0065ca8c85b8b6641f4c6e0b0de60e79ef32ebf6ff8f109ac4e1d70","other":"38ab3d7bdfb293b88122404cb7c50b5fb890ce7664c075da95585557a430c403","up":true},{"one":"cbc5d42951bc6e187296b5f8ce4d04e472e26670a62851f39d65f31c50865f6a","other":"ce99e9d37111c52e929b187fe201790b1a555dfb8b6b6de54e94df7cc2d43fd4","up":true},{"one":"3cb1b4069727dc323a687cab4ca2764f6415450488706f1b97c5cb8ca46346ff","other":"48b614958a8692780ef5bd5c95e0db4ff67deb4de0dcbb878ca4479bfb86957e","up":true},{"one":"027fb496438782583f78fb76999336eed7fb672a9c9ea50d04df580e6eb21377","other":"018adc613f78d6ec876274f821251fd049eb3651646cd69e27efe211fe88d936","up":true},{"one":"6d601952793589bc6b57340c451a6abf02ea2c16637e910eed04cde6eddfe17a","other":"734e029ed25485edd49b93dd9e85b6e7657f860e4ded4bc8a5094f512ae5836b","up":true},{"one":"539df902d42dc997c6b0e24d16ad68b54c557d56b41c972a320d57632dbfbe3c","other":"757a557424c33ad89efd8185ec18d71c025830ecb2aed951e33c8c8d986d5933","up":true},{"one":"ad0d0dc5d4114ee4482d6c9bd4e46683327abf2b92df0d242d79019963876668","other":"8b76194f129308324c7d0066530e02cac2410ee0ba952822f0ec866e12461e44","up":true},{"one":"957d8a9b412b6f4cd151cbc07b8d74d949880ae665c545debb18181389c99ee6","other":"67288f84ada7778858139c74917b22ae698ed43df49a6530a566648f074ede46","up":true},{"one":"67288f84ada7778858139c74917b22ae698ed43df49a6530a566648f074ede46","other":"e55d8cdb7e7940b11929e7e5c949ef6beb7998e5180a1f0a3c0bf61aef39f1b8","up":true},{"one":"cbc5d42951bc6e187296b5f8ce4d04e472e26670a62851f39d65f31c50865f6a","other":"042788d5b72cb84a375565d120d239a2b14fdf38b3f5f992284d78535077148a","up":true},{"one":"3e56d4533ec14f6656e1eb25fb35dad47c9db479f667a6b6fe9a3aa8c12e982e","other":"042788d5b72cb84a375565d120d239a2b14fdf38b3f5f992284d78535077148a","up":true},{"one":"7cf4838a7c83a736ce59cfa1b974674a0185dbe17a8f3cd29794a3bbe814adee","other":"73b8d1840d0a8ffe69752ec96f8fddecb0e22726c87982d572ca9acc1c9cdbfc","up":true},{"one":"e0ea575d0e2efa28bc51f49d1e2c24196a196da3b3196f3a5a26a5e310809af5","other":"5d608e66a17442091111cb472723fe3aea1f2baecaa546b57d49507c63a61cda","up":true},{"one":"cbc5d42951bc6e187296b5f8ce4d04e472e26670a62851f39d65f31c50865f6a","other":"b16dcdf1ff1a56d49e374531d9885d59c1bcfbb628604520d9b1d84662edb9ca","up":true},{"one":"6d601952793589bc6b57340c451a6abf02ea2c16637e910eed04cde6eddfe17a","other":"dc97c1a0019b482a048b8d15941dfe4c3c1a3443d9b2d7b4046370bc84a7e56f","up":true},{"one":"3ee4b20c047e701b58c06fcc8160364bd29573f61f4d9f1935d77ac29f6a1e86","other":"0bcf8a8ab0065ca8c85b8b6641f4c6e0b0de60e79ef32ebf6ff8f109ac4e1d70","up":true},{"one":"962676818c17fae1ffc52fc29318c44f9b8c980afd6d3e98217b4088d568a808","other":"2434c63e7f28b83e7feede7fe68ea99b989f8534f64d63b046733e2f474538f5","up":true},{"one":"021811a6757bdcdd2fa0fb68401dfe009d5a8e129958cd304fb42cf51dc5d1d3","other":"018adc613f78d6ec876274f821251fd049eb3651646cd69e27efe211fe88d936","up":true},{"one":"03907380afcd52238f3d84a8dee3df599c7f2f9b90fbc1271ee88bdb52acbd58","other":"e0b1c4eb5b5b4dfc22344ee65cb9716cecb38dcc80099793f20641884eae4854","up":true},{"one":"a75abd0dce5a488b7e06f91fab7a92ec428ab21bde9372c9e8fa489f48e7b3fe","other":"109ef17c890104bfc5a4897d526a0afaa8c991c9d213616032f3058d0feb7f00","up":true},{"one":"f36084048bf0ff985a77f5183796f7b37b7085ee6eea8bbc5fc62558854cce67","other":"ca036d1ef9e6ce3654f2d769f16926aa14957193586426489e15539dfa8f7763","up":true},{"one":"6742cca1b7783fcbed8d0b340508f93cc4dfaca8ff3f13fd59354486c4d62993","other":"734e029ed25485edd49b93dd9e85b6e7657f860e4ded4bc8a5094f512ae5836b","up":true},{"one":"a2babe49410ae007bc41ff2b7deaf709ed849e2f69666ce5aae76a3b71f47081","other":"82f034db88fd26b47c26b95c3f87a1f454ffe4526ae86beb2bb1d8f2c218c25c","up":true},{"one":"38ab3d7bdfb293b88122404cb7c50b5fb890ce7664c075da95585557a430c403","other":"2459fe9250b3311c86530d00b7a9b8ba57b1b5151c126262e70c55d1e8d37924","up":true},{"one":"e55d8cdb7e7940b11929e7e5c949ef6beb7998e5180a1f0a3c0bf61aef39f1b8","other":"b381e75e52e4cdd168056245f82d3a1747b67f400eb40eb12036b73ee7fe21e5","up":true},{"one":"621076ce6b82e70c90a4adf235aa6f71b116e302dd6b15dcae07f4a816012455","other":"a085045c335ce2e47dbdfeb1adb62ce6c3bed36a93cf3448c45757a1a88e295d","up":true},{"one":"026d2e41b82d506da685a30cce7cc5772f6c1e167b7d557e0531fb9b79dd4ff2","other":"895bdcd200cc4d7ec5c24f1722d0a8ebedda78b78cdf1ccc8c22a981980f5786","up":true},{"one":"a2babe49410ae007bc41ff2b7deaf709ed849e2f69666ce5aae76a3b71f47081","other":"1be4348ec5670cdc4f164d77b1356e7910b6d1be4a9b720e549d02e5482a9e78","up":true},{"one":"e77f6aa9e3dfcce0a2e5db794703224249aba60595075b2df9a5b0b30855cf46","other":"9ee7b3e06b453615cbd8737cb74515b150f518f1a2eaa2db90e54708dd161b7d","up":true},{"one":"517aa977048247d5d16ad51a286ffac4d8f910733f0578b222201308c32d195e","other":"5a01993ff7b4bd12fdb259e96b26a036d0cf5d4ae9c9b516be64b63acec2443a","up":true},{"one":"5d608e66a17442091111cb472723fe3aea1f2baecaa546b57d49507c63a61cda","other":"dc97c1a0019b482a048b8d15941dfe4c3c1a3443d9b2d7b4046370bc84a7e56f","up":true},{"one":"1be4348ec5670cdc4f164d77b1356e7910b6d1be4a9b720e549d02e5482a9e78","other":"e0b1c4eb5b5b4dfc22344ee65cb9716cecb38dcc80099793f20641884eae4854","up":true},{"one":"c18105aa302a43e352d999745a0f806af9f8cb8bb83349357da5c85e8975acd1","other":"c8e5a1b4533dd0de12acee4d31369f39785178568718b93bbc321ec83e0714f0","up":true},{"one":"f410d4ac9b748c24fa0d48c3053bb1cea8a67d0bcc4e5fcbdb261c0c7522cc34","other":"018adc613f78d6ec876274f821251fd049eb3651646cd69e27efe211fe88d936","up":true},{"one":"9ee7b3e06b453615cbd8737cb74515b150f518f1a2eaa2db90e54708dd161b7d","other":"d2245f0679b436faabc0164e0b85e02e2effbad306e8229b555524a5e6d1a5f9","up":true},{"one":"03907380afcd52238f3d84a8dee3df599c7f2f9b90fbc1271ee88bdb52acbd58","other":"021811a6757bdcdd2fa0fb68401dfe009d5a8e129958cd304fb42cf51dc5d1d3","up":true},{"one":"41b9ee7ad19698e97589b059ad3333cb64f02c16006d94fb3d0bad7ced8ff238","other":"772e4c80d128deb52adf024a0eb6fe9bbea1c83351ed93f55f490cd5e5c69260","up":true},{"one":"86ca1078dae40f23ae1b3ac47397460d9ec0bf243a0de372b405381d6722fcb2","other":"83dc556ed36f37d06765be2554fe86eaf1ec21e2931fb22403238453bf021dfb","up":true},{"one":"6e5c213a2db57eaf2e1e1acc341c72efab89b0e42b6cd18db4f99ac1af151d65","other":"6ecb11fc5acc16ecd70351410fa18ec44a2a83d9e778cf25b85a7535493456b7","up":true},{"one":"dfaeebc8e29c6a8f851b12b80cf42567cd2a43e35d977305a3c10e51bf41170a","other":"e55d8cdb7e7940b11929e7e5c949ef6beb7998e5180a1f0a3c0bf61aef39f1b8","up":true},{"one":"a085045c335ce2e47dbdfeb1adb62ce6c3bed36a93cf3448c45757a1a88e295d","other":"2459fe9250b3311c86530d00b7a9b8ba57b1b5151c126262e70c55d1e8d37924","up":true},{"one":"b381e75e52e4cdd168056245f82d3a1747b67f400eb40eb12036b73ee7fe21e5","other":"ebca518e5146f49ac75bcaa8add2ef4d1d22c5cfd2e2326c6b41826d45ce55ae","up":true},{"one":"4cd0f38e52a508f81cf95e1370c994aea2d7a49a2a08e3e054f53629a6619410","other":"042788d5b72cb84a375565d120d239a2b14fdf38b3f5f992284d78535077148a","up":true},{"one":"9a9230b3f7f386520821dee78ebe92e8c64a4f6a50f2639327c62e45cab40563","other":"82f034db88fd26b47c26b95c3f87a1f454ffe4526ae86beb2bb1d8f2c218c25c","up":true},{"one":"957d8a9b412b6f4cd151cbc07b8d74d949880ae665c545debb18181389c99ee6","other":"6ecb11fc5acc16ecd70351410fa18ec44a2a83d9e778cf25b85a7535493456b7","up":true},{"one":"ebca518e5146f49ac75bcaa8add2ef4d1d22c5cfd2e2326c6b41826d45ce55ae","other":"a7a61804d270ed6c27a4b1e8a634c30d7cdbaf644a1c67cbc6b08cd849a711db","up":true},{"one":"db088103f3b6f2c784d76ecd99c8b4a77fd39bb39c72ddfd91c99c1a9dd3b75b","other":"f74ecde0bbaa7b6521fb205b5ab9ea637909277f6e1ee1d3490f5cd01d0f7216","up":true},{"one":"89c883d6a85472bda328667e3fd805c70876bc582ca6763ab97ae636b1772be4","other":"2a22dbee71a0ef27c840221db4a592d6dc8f171afed865ff814a37d633a3eaa9","up":true},{"one":"026d2e41b82d506da685a30cce7cc5772f6c1e167b7d557e0531fb9b79dd4ff2","other":"89c883d6a85472bda328667e3fd805c70876bc582ca6763ab97ae636b1772be4","up":true},{"one":"d6ffb7fd2668e9b7b133bd9144156f4736191ef0d6e72b072759782d83931f22","other":"757a557424c33ad89efd8185ec18d71c025830ecb2aed951e33c8c8d986d5933","up":true},{"one":"962676818c17fae1ffc52fc29318c44f9b8c980afd6d3e98217b4088d568a808","other":"0ab9845c2890b0a64a3e5932241245e00b817b788094f9ee48f86f80b7264fea","up":true},{"one":"ed32d74d9be0649de1eb26b9915137fe46ec890c656c96be52e966ab6e2ed260","other":"f5c4d28df5973ec0292221a875e8446323f339409d93f0f7385990126908a3c3","up":true},{"one":"ed32d74d9be0649de1eb26b9915137fe46ec890c656c96be52e966ab6e2ed260","other":"e77f6aa9e3dfcce0a2e5db794703224249aba60595075b2df9a5b0b30855cf46","up":true},{"one":"ae67fae4990da61ca89221c5b1675c992babb4d715b59939e47bd1491b3bf1f4","other":"ad0d0dc5d4114ee4482d6c9bd4e46683327abf2b92df0d242d79019963876668","up":true},{"one":"372d47374a57d18cf134a1f8fc2d2fc10dfacfc0be9ed883183a349c896b3793","other":"3e56d4533ec14f6656e1eb25fb35dad47c9db479f667a6b6fe9a3aa8c12e982e","up":true},{"one":"517aa977048247d5d16ad51a286ffac4d8f910733f0578b222201308c32d195e","other":"dc97c1a0019b482a048b8d15941dfe4c3c1a3443d9b2d7b4046370bc84a7e56f","up":true},{"one":"621076ce6b82e70c90a4adf235aa6f71b116e302dd6b15dcae07f4a816012455","other":"ad0d0dc5d4114ee4482d6c9bd4e46683327abf2b92df0d242d79019963876668","up":true},{"one":"03907380afcd52238f3d84a8dee3df599c7f2f9b90fbc1271ee88bdb52acbd58","other":"e16b12c708bc5e0545009daed44733c52d7450ccc797d158dd41a3bc9507b6be","up":true},{"one":"91eba9f9c8f2929d38f43a0c7efa809c0d2d59a31cbf2760c90e73d20266d528","other":"0ab9845c2890b0a64a3e5932241245e00b817b788094f9ee48f86f80b7264fea","up":true},{"one":"9e02c5384602a54e900cfa46d5987b77f16e74cba745ac850fcada01c7af9004","other":"82f034db88fd26b47c26b95c3f87a1f454ffe4526ae86beb2bb1d8f2c218c25c","up":true},{"one":"d6ffb7fd2668e9b7b133bd9144156f4736191ef0d6e72b072759782d83931f22","other":"645b4e6b36fc1928725f627aeed278f46c5a7d6b0fff7ccff55a0468d47b23e8","up":true},{"one":"9d3c79e4a0ac4e5b95aa32545f3b8d86f74594faa237d5c2566cf02fbd60b11a","other":"7b9242137f8cc2bec7b3e0003fd93026921ceb10dfadbbd5b6aa64d61a74f35e","up":true},{"one":"9e02c5384602a54e900cfa46d5987b77f16e74cba745ac850fcada01c7af9004","other":"f36120ff250b9e7164e96021479332054f67de65cd2fe5b6e34bc51d0fe4d29c","up":true},{"one":"213bf6e78e02a57585908c756f0965297152c3c400a0ed4c407a411e1ec5942d","other":"3cb1b4069727dc323a687cab4ca2764f6415450488706f1b97c5cb8ca46346ff","up":true},{"one":"8be461203f5ebb5721348f537b37d768f7bd359af3e18d1f7e9af2f901c49845","other":"a7a61804d270ed6c27a4b1e8a634c30d7cdbaf644a1c67cbc6b08cd849a711db","up":true},{"one":"6d601952793589bc6b57340c451a6abf02ea2c16637e910eed04cde6eddfe17a","other":"d6ffb7fd2668e9b7b133bd9144156f4736191ef0d6e72b072759782d83931f22","up":true},{"one":"f410d4ac9b748c24fa0d48c3053bb1cea8a67d0bcc4e5fcbdb261c0c7522cc34","other":"3ee4b20c047e701b58c06fcc8160364bd29573f61f4d9f1935d77ac29f6a1e86","up":true},{"one":"026d2e41b82d506da685a30cce7cc5772f6c1e167b7d557e0531fb9b79dd4ff2","other":"41b9ee7ad19698e97589b059ad3333cb64f02c16006d94fb3d0bad7ced8ff238","up":true},{"one":"9d3c79e4a0ac4e5b95aa32545f3b8d86f74594faa237d5c2566cf02fbd60b11a","other":"9ee7b3e06b453615cbd8737cb74515b150f518f1a2eaa2db90e54708dd161b7d","up":true},{"one":"667ef042e9dae18694581e0404c3d87a09800e8b42173d26571c3bf97e29a372","other":"772e4c80d128deb52adf024a0eb6fe9bbea1c83351ed93f55f490cd5e5c69260","up":true},{"one":"213bf6e78e02a57585908c756f0965297152c3c400a0ed4c407a411e1ec5942d","other":"042788d5b72cb84a375565d120d239a2b14fdf38b3f5f992284d78535077148a","up":true},{"one":"517aa977048247d5d16ad51a286ffac4d8f910733f0578b222201308c32d195e","other":"e0ea575d0e2efa28bc51f49d1e2c24196a196da3b3196f3a5a26a5e310809af5","up":true},{"one":"9a9230b3f7f386520821dee78ebe92e8c64a4f6a50f2639327c62e45cab40563","other":"7b9242137f8cc2bec7b3e0003fd93026921ceb10dfadbbd5b6aa64d61a74f35e","up":true},{"one":"962676818c17fae1ffc52fc29318c44f9b8c980afd6d3e98217b4088d568a808","other":"0bcf8a8ab0065ca8c85b8b6641f4c6e0b0de60e79ef32ebf6ff8f109ac4e1d70","up":true},{"one":"f410d4ac9b748c24fa0d48c3053bb1cea8a67d0bcc4e5fcbdb261c0c7522cc34","other":"67288f84ada7778858139c74917b22ae698ed43df49a6530a566648f074ede46","up":true},{"one":"109ef17c890104bfc5a4897d526a0afaa8c991c9d213616032f3058d0feb7f00","other":"a7a61804d270ed6c27a4b1e8a634c30d7cdbaf644a1c67cbc6b08cd849a711db","up":true},{"one":"78cbc19a24d095ab7858849058c65c061c52289b91ddd92cee34bed98aee4a59","other":"7639f9a66e8ff70f554c346faa25f78140957c295b748fc42a12df7972f4fcc6","up":true},{"one":"a085045c335ce2e47dbdfeb1adb62ce6c3bed36a93cf3448c45757a1a88e295d","other":"26d1af1fbee6541a363ea7707825e37da028142f00779116560ad20f1de18e7b","up":true},{"one":"92a1501ed41e29bb7dd8eb4b4acecae983f4c7c83f39895cd68f7810b645f1dd","other":"ce99e9d37111c52e929b187fe201790b1a555dfb8b6b6de54e94df7cc2d43fd4","up":true},{"one":"f36084048bf0ff985a77f5183796f7b37b7085ee6eea8bbc5fc62558854cce67","other":"b381e75e52e4cdd168056245f82d3a1747b67f400eb40eb12036b73ee7fe21e5","up":true},{"one":"cdcd165721f6851f361fad0b3ba88c8870be9ad6d6b8cbcecc7c89e1068d979a","other":"e0b1c4eb5b5b4dfc22344ee65cb9716cecb38dcc80099793f20641884eae4854","up":true},{"one":"d6ffb7fd2668e9b7b133bd9144156f4736191ef0d6e72b072759782d83931f22","other":"667ef042e9dae18694581e0404c3d87a09800e8b42173d26571c3bf97e29a372","up":true},{"one":"957d8a9b412b6f4cd151cbc07b8d74d949880ae665c545debb18181389c99ee6","other":"6d601952793589bc6b57340c451a6abf02ea2c16637e910eed04cde6eddfe17a","up":true},{"one":"3ee4b20c047e701b58c06fcc8160364bd29573f61f4d9f1935d77ac29f6a1e86","other":"ae67fae4990da61ca89221c5b1675c992babb4d715b59939e47bd1491b3bf1f4","up":true},{"one":"4a1811dd9febde1801a604ad81de84a2d15366d0b5c330f30f3398da0d107824","other":"41b9ee7ad19698e97589b059ad3333cb64f02c16006d94fb3d0bad7ced8ff238","up":true},{"one":"3ee4b20c047e701b58c06fcc8160364bd29573f61f4d9f1935d77ac29f6a1e86","other":"2459fe9250b3311c86530d00b7a9b8ba57b1b5151c126262e70c55d1e8d37924","up":true},{"one":"4a1811dd9febde1801a604ad81de84a2d15366d0b5c330f30f3398da0d107824","other":"7f87da7ee55b4c8c8f9d55411ff88d3a0b63bfee6a516917d49fa6273fb5b86a","up":true},{"one":"c8e5a1b4533dd0de12acee4d31369f39785178568718b93bbc321ec83e0714f0","other":"d0f398969480f3df3587f6d47546ff1261cad4d2e9c26ff3077e35ae1b26153e","up":true},{"one":"b70e96f01ac8947d2de6320412ae3310316caba65c27108ad16b2f2004255be4","other":"a3205c1c4f9b72814f0db68e888e3c7ef88f27c681ed0d731dde5f0999f92ccc","up":true},{"one":"cec3c01c147b34f25104ddd0b25076cef63ac224eada9d9f5a00b8513331354f","other":"2434c63e7f28b83e7feede7fe68ea99b989f8534f64d63b046733e2f474538f5","up":true},{"one":"73b8d1840d0a8ffe69752ec96f8fddecb0e22726c87982d572ca9acc1c9cdbfc","other":"7dc5e8d8180c1bc7ebbee11a47fc96e8fe8b2d71c30cbc4aa1cf99e8eb6afcac","up":true},{"one":"c3a1b301bf187fd8326831197d93a0266ac0cc8287b9008631240e2bec9cf337","other":"82f034db88fd26b47c26b95c3f87a1f454ffe4526ae86beb2bb1d8f2c218c25c","up":true},{"one":"027fb496438782583f78fb76999336eed7fb672a9c9ea50d04df580e6eb21377","other":"021811a6757bdcdd2fa0fb68401dfe009d5a8e129958cd304fb42cf51dc5d1d3","up":true},{"one":"78cbc19a24d095ab7858849058c65c061c52289b91ddd92cee34bed98aee4a59","other":"419a6626dd026c0438461592121992c6be1868375011655b6d405166cd8edf7f","up":true},{"one":"6e5c213a2db57eaf2e1e1acc341c72efab89b0e42b6cd18db4f99ac1af151d65","other":"78cbc19a24d095ab7858849058c65c061c52289b91ddd92cee34bed98aee4a59","up":true},{"one":"5abc96f4fa78812db6fb710fd424dd474145f7e5d00b4cedc5373b4c52f42cf5","other":"dc97c1a0019b482a048b8d15941dfe4c3c1a3443d9b2d7b4046370bc84a7e56f","up":true},{"one":"0bcf8a8ab0065ca8c85b8b6641f4c6e0b0de60e79ef32ebf6ff8f109ac4e1d70","other":"e16b12c708bc5e0545009daed44733c52d7450ccc797d158dd41a3bc9507b6be","up":true},{"one":"db088103f3b6f2c784d76ecd99c8b4a77fd39bb39c72ddfd91c99c1a9dd3b75b","other":"f36084048bf0ff985a77f5183796f7b37b7085ee6eea8bbc5fc62558854cce67","up":true},{"one":"03907380afcd52238f3d84a8dee3df599c7f2f9b90fbc1271ee88bdb52acbd58","other":"3ee4b20c047e701b58c06fcc8160364bd29573f61f4d9f1935d77ac29f6a1e86","up":true},{"one":"1be4348ec5670cdc4f164d77b1356e7910b6d1be4a9b720e549d02e5482a9e78","other":"e0ea575d0e2efa28bc51f49d1e2c24196a196da3b3196f3a5a26a5e310809af5","up":true},{"one":"962676818c17fae1ffc52fc29318c44f9b8c980afd6d3e98217b4088d568a808","other":"0506e949748b62da1d36b663df7d6a7e76027f72ced5d52f74677fb31d7e1505","up":true},{"one":"0ff67b0e9ec6509c7786495b7b3ddb176b4f8221ff300f409f00a3d389e8874c","other":"b381e75e52e4cdd168056245f82d3a1747b67f400eb40eb12036b73ee7fe21e5","up":true},{"one":"3ee4b20c047e701b58c06fcc8160364bd29573f61f4d9f1935d77ac29f6a1e86","other":"1929a84bcd64bf002d0afb16249466c5b660123174a1fc1bf881913f8c87d1fd","up":true},{"one":"b70e96f01ac8947d2de6320412ae3310316caba65c27108ad16b2f2004255be4","other":"83dc556ed36f37d06765be2554fe86eaf1ec21e2931fb22403238453bf021dfb","up":true},{"one":"8b76194f129308324c7d0066530e02cac2410ee0ba952822f0ec866e12461e44","other":"b16dcdf1ff1a56d49e374531d9885d59c1bcfbb628604520d9b1d84662edb9ca","up":true},{"one":"91eba9f9c8f2929d38f43a0c7efa809c0d2d59a31cbf2760c90e73d20266d528","other":"018adc613f78d6ec876274f821251fd049eb3651646cd69e27efe211fe88d936","up":true},{"one":"b486ce31ce880db3aaa17a0ac2c2f3554b6fe71f9c051edb572974342af4adb9","other":"78cbc19a24d095ab7858849058c65c061c52289b91ddd92cee34bed98aee4a59","up":true},{"one":"6e5c213a2db57eaf2e1e1acc341c72efab89b0e42b6cd18db4f99ac1af151d65","other":"7b9242137f8cc2bec7b3e0003fd93026921ceb10dfadbbd5b6aa64d61a74f35e","up":true},{"one":"d6ffb7fd2668e9b7b133bd9144156f4736191ef0d6e72b072759782d83931f22","other":"6c029114a9f73d69a42e591cf2d13107eff038d3eda8abb0242d9d6d169f05c7","up":true},{"one":"4a1811dd9febde1801a604ad81de84a2d15366d0b5c330f30f3398da0d107824","other":"78cbc19a24d095ab7858849058c65c061c52289b91ddd92cee34bed98aee4a59","up":true},{"one":"b70e96f01ac8947d2de6320412ae3310316caba65c27108ad16b2f2004255be4","other":"e55d8cdb7e7940b11929e7e5c949ef6beb7998e5180a1f0a3c0bf61aef39f1b8","up":true},{"one":"7355fab10584e4312f5cb5c3c826e7f9c14da74d62d07d0a8007ce9c6e995be9","other":"5abc96f4fa78812db6fb710fd424dd474145f7e5d00b4cedc5373b4c52f42cf5","up":true},{"one":"6d601952793589bc6b57340c451a6abf02ea2c16637e910eed04cde6eddfe17a","other":"d2245f0679b436faabc0164e0b85e02e2effbad306e8229b555524a5e6d1a5f9","up":true},{"one":"edc8794153fb517085d27a83a4b00e8c3b37f22d2242b842cb2fab66764de9fe","other":"f36120ff250b9e7164e96021479332054f67de65cd2fe5b6e34bc51d0fe4d29c","up":true},{"one":"03907380afcd52238f3d84a8dee3df599c7f2f9b90fbc1271ee88bdb52acbd58","other":"109ef17c890104bfc5a4897d526a0afaa8c991c9d213616032f3058d0feb7f00","up":true},{"one":"3ee4b20c047e701b58c06fcc8160364bd29573f61f4d9f1935d77ac29f6a1e86","other":"aebd6135d10252b07f891b3a7330903faf13d409c4f7108630715fa0754f938e","up":true},{"one":"db088103f3b6f2c784d76ecd99c8b4a77fd39bb39c72ddfd91c99c1a9dd3b75b","other":"f36120ff250b9e7164e96021479332054f67de65cd2fe5b6e34bc51d0fe4d29c","up":true},{"one":"b486ce31ce880db3aaa17a0ac2c2f3554b6fe71f9c051edb572974342af4adb9","other":"8b76194f129308324c7d0066530e02cac2410ee0ba952822f0ec866e12461e44","up":true},{"one":"372d47374a57d18cf134a1f8fc2d2fc10dfacfc0be9ed883183a349c896b3793","other":"89c883d6a85472bda328667e3fd805c70876bc582ca6763ab97ae636b1772be4","up":true},{"one":"286aeba646bba4a8aa1c372bee9f2c9ff0a2b3abb4f18be321225555c6dce4e5","other":"2a22dbee71a0ef27c840221db4a592d6dc8f171afed865ff814a37d633a3eaa9","up":true},{"one":"13bc64535d3ae495098e4ac6b30a91d1804dab0ab79944f2c6ac53c9bccdf62d","other":"4b243a5aeabec6db0e4a80a9c255300cd94591a6fbe0e0aa170da4f6ce14edff","up":true},{"one":"a2babe49410ae007bc41ff2b7deaf709ed849e2f69666ce5aae76a3b71f47081","other":"1929a84bcd64bf002d0afb16249466c5b660123174a1fc1bf881913f8c87d1fd","up":true},{"one":"06b95f1bac76ca4925d509b06216f2113ac5dcf051ef5aa0a320ae64069e0b6d","other":"2434c63e7f28b83e7feede7fe68ea99b989f8534f64d63b046733e2f474538f5","up":true},{"one":"4b243a5aeabec6db0e4a80a9c255300cd94591a6fbe0e0aa170da4f6ce14edff","other":"021811a6757bdcdd2fa0fb68401dfe009d5a8e129958cd304fb42cf51dc5d1d3","up":true},{"one":"13bc64535d3ae495098e4ac6b30a91d1804dab0ab79944f2c6ac53c9bccdf62d","other":"f5c4d28df5973ec0292221a875e8446323f339409d93f0f7385990126908a3c3","up":true},{"one":"83dc556ed36f37d06765be2554fe86eaf1ec21e2931fb22403238453bf021dfb","other":"9ee7b3e06b453615cbd8737cb74515b150f518f1a2eaa2db90e54708dd161b7d","up":true},{"one":"895bdcd200cc4d7ec5c24f1722d0a8ebedda78b78cdf1ccc8c22a981980f5786","other":"109ef17c890104bfc5a4897d526a0afaa8c991c9d213616032f3058d0feb7f00","up":true},{"one":"0506e949748b62da1d36b663df7d6a7e76027f72ced5d52f74677fb31d7e1505","other":"286aeba646bba4a8aa1c372bee9f2c9ff0a2b3abb4f18be321225555c6dce4e5","up":true},{"one":"a085045c335ce2e47dbdfeb1adb62ce6c3bed36a93cf3448c45757a1a88e295d","other":"82f034db88fd26b47c26b95c3f87a1f454ffe4526ae86beb2bb1d8f2c218c25c","up":true},{"one":"a2babe49410ae007bc41ff2b7deaf709ed849e2f69666ce5aae76a3b71f47081","other":"83dc556ed36f37d06765be2554fe86eaf1ec21e2931fb22403238453bf021dfb","up":true},{"one":"6d601952793589bc6b57340c451a6abf02ea2c16637e910eed04cde6eddfe17a","other":"772e4c80d128deb52adf024a0eb6fe9bbea1c83351ed93f55f490cd5e5c69260","up":true},{"one":"e0b1c4eb5b5b4dfc22344ee65cb9716cecb38dcc80099793f20641884eae4854","other":"7dc5e8d8180c1bc7ebbee11a47fc96e8fe8b2d71c30cbc4aa1cf99e8eb6afcac","up":true},{"one":"67288f84ada7778858139c74917b22ae698ed43df49a6530a566648f074ede46","other":"e0ea575d0e2efa28bc51f49d1e2c24196a196da3b3196f3a5a26a5e310809af5","up":true},{"one":"5d608e66a17442091111cb472723fe3aea1f2baecaa546b57d49507c63a61cda","other":"f74ecde0bbaa7b6521fb205b5ab9ea637909277f6e1ee1d3490f5cd01d0f7216","up":true},{"one":"e0ea575d0e2efa28bc51f49d1e2c24196a196da3b3196f3a5a26a5e310809af5","other":"5abc96f4fa78812db6fb710fd424dd474145f7e5d00b4cedc5373b4c52f42cf5","up":true},{"one":"92a1501ed41e29bb7dd8eb4b4acecae983f4c7c83f39895cd68f7810b645f1dd","other":"ca036d1ef9e6ce3654f2d769f16926aa14957193586426489e15539dfa8f7763","up":true},{"one":"2459fe9250b3311c86530d00b7a9b8ba57b1b5151c126262e70c55d1e8d37924","other":"57764522162620c1ad0b166a9c43772255d0cc01e49f2122ef09db046804a570","up":true},{"one":"cdcd165721f6851f361fad0b3ba88c8870be9ad6d6b8cbcecc7c89e1068d979a","other":"b16dcdf1ff1a56d49e374531d9885d59c1bcfbb628604520d9b1d84662edb9ca","up":true},{"one":"aebd6135d10252b07f891b3a7330903faf13d409c4f7108630715fa0754f938e","other":"13bc64535d3ae495098e4ac6b30a91d1804dab0ab79944f2c6ac53c9bccdf62d","up":true},{"one":"a085045c335ce2e47dbdfeb1adb62ce6c3bed36a93cf3448c45757a1a88e295d","other":"109ef17c890104bfc5a4897d526a0afaa8c991c9d213616032f3058d0feb7f00","up":true},{"one":"a085045c335ce2e47dbdfeb1adb62ce6c3bed36a93cf3448c45757a1a88e295d","other":"372d47374a57d18cf134a1f8fc2d2fc10dfacfc0be9ed883183a349c896b3793","up":true},{"one":"3e56d4533ec14f6656e1eb25fb35dad47c9db479f667a6b6fe9a3aa8c12e982e","other":"1929a84bcd64bf002d0afb16249466c5b660123174a1fc1bf881913f8c87d1fd","up":true},{"one":"895bdcd200cc4d7ec5c24f1722d0a8ebedda78b78cdf1ccc8c22a981980f5786","other":"2434c63e7f28b83e7feede7fe68ea99b989f8534f64d63b046733e2f474538f5","up":true},{"one":"db088103f3b6f2c784d76ecd99c8b4a77fd39bb39c72ddfd91c99c1a9dd3b75b","other":"e0b1c4eb5b5b4dfc22344ee65cb9716cecb38dcc80099793f20641884eae4854","up":true},{"one":"a2babe49410ae007bc41ff2b7deaf709ed849e2f69666ce5aae76a3b71f47081","other":"13bc64535d3ae495098e4ac6b30a91d1804dab0ab79944f2c6ac53c9bccdf62d","up":true},{"one":"6d601952793589bc6b57340c451a6abf02ea2c16637e910eed04cde6eddfe17a","other":"6742cca1b7783fcbed8d0b340508f93cc4dfaca8ff3f13fd59354486c4d62993","up":true},{"one":"47c3e0dfbbfcebeece78865c8c989577360cd9cc46a3b43f4b7b01ed14dc30e6","other":"2434c63e7f28b83e7feede7fe68ea99b989f8534f64d63b046733e2f474538f5","up":true},{"one":"ad0d0dc5d4114ee4482d6c9bd4e46683327abf2b92df0d242d79019963876668","other":"89c883d6a85472bda328667e3fd805c70876bc582ca6763ab97ae636b1772be4","up":true},{"one":"73b8d1840d0a8ffe69752ec96f8fddecb0e22726c87982d572ca9acc1c9cdbfc","other":"419a6626dd026c0438461592121992c6be1868375011655b6d405166cd8edf7f","up":true},{"one":"962676818c17fae1ffc52fc29318c44f9b8c980afd6d3e98217b4088d568a808","other":"018adc613f78d6ec876274f821251fd049eb3651646cd69e27efe211fe88d936","up":true},{"one":"cdcd165721f6851f361fad0b3ba88c8870be9ad6d6b8cbcecc7c89e1068d979a","other":"cfbb9ea682becadeab10bbd080ba8e93510085a87ac519e434964faa222fc275","up":true},{"one":"b16dcdf1ff1a56d49e374531d9885d59c1bcfbb628604520d9b1d84662edb9ca","other":"ca036d1ef9e6ce3654f2d769f16926aa14957193586426489e15539dfa8f7763","up":true},{"one":"6e5c213a2db57eaf2e1e1acc341c72efab89b0e42b6cd18db4f99ac1af151d65","other":"7dc5e8d8180c1bc7ebbee11a47fc96e8fe8b2d71c30cbc4aa1cf99e8eb6afcac","up":true},{"one":"7f87da7ee55b4c8c8f9d55411ff88d3a0b63bfee6a516917d49fa6273fb5b86a","other":"7639f9a66e8ff70f554c346faa25f78140957c295b748fc42a12df7972f4fcc6","up":true},{"one":"5a01993ff7b4bd12fdb259e96b26a036d0cf5d4ae9c9b516be64b63acec2443a","other":"dc97c1a0019b482a048b8d15941dfe4c3c1a3443d9b2d7b4046370bc84a7e56f","up":true},{"one":"c3a1b301bf187fd8326831197d93a0266ac0cc8287b9008631240e2bec9cf337","other":"ea0e1dd41fe042b09f273c98f02128949cf5561d20dc04b3d423961efed52327","up":true},{"one":"41b9ee7ad19698e97589b059ad3333cb64f02c16006d94fb3d0bad7ced8ff238","other":"286aeba646bba4a8aa1c372bee9f2c9ff0a2b3abb4f18be321225555c6dce4e5","up":true},{"one":"13bc64535d3ae495098e4ac6b30a91d1804dab0ab79944f2c6ac53c9bccdf62d","other":"4cd0f38e52a508f81cf95e1370c994aea2d7a49a2a08e3e054f53629a6619410","up":true},{"one":"7fbc1843e2222e3c8e35a3215d1bbb4d5457d8b9ed33749e07e22f25ba9ee576","other":"7639f9a66e8ff70f554c346faa25f78140957c295b748fc42a12df7972f4fcc6","up":true},{"one":"1be4348ec5670cdc4f164d77b1356e7910b6d1be4a9b720e549d02e5482a9e78","other":"41b9ee7ad19698e97589b059ad3333cb64f02c16006d94fb3d0bad7ced8ff238","up":true},{"one":"ea0e1dd41fe042b09f273c98f02128949cf5561d20dc04b3d423961efed52327","other":"f5c4d28df5973ec0292221a875e8446323f339409d93f0f7385990126908a3c3","up":true},{"one":"38ab3d7bdfb293b88122404cb7c50b5fb890ce7664c075da95585557a430c403","other":"ae67fae4990da61ca89221c5b1675c992babb4d715b59939e47bd1491b3bf1f4","up":true},{"one":"895bdcd200cc4d7ec5c24f1722d0a8ebedda78b78cdf1ccc8c22a981980f5786","other":"13bc64535d3ae495098e4ac6b30a91d1804dab0ab79944f2c6ac53c9bccdf62d","up":true},{"one":"6c82fdabd09e0e9d0fc507613a05951c02b2953d763a062a5f32aaf5cc477c19","other":"698247d103a8925d8bb4c56a3056e49c5efc595fced1c89d49943bb9ba01f394","up":true},{"one":"92a1501ed41e29bb7dd8eb4b4acecae983f4c7c83f39895cd68f7810b645f1dd","other":"cbc5d42951bc6e187296b5f8ce4d04e472e26670a62851f39d65f31c50865f6a","up":true},{"one":"8cf957bf95a629c60c31dbcfe75ecca149a81c761f8b34858b04f8318e5c74bd","other":"2434c63e7f28b83e7feede7fe68ea99b989f8534f64d63b046733e2f474538f5","up":true},{"one":"3cb1b4069727dc323a687cab4ca2764f6415450488706f1b97c5cb8ca46346ff","other":"1929a84bcd64bf002d0afb16249466c5b660123174a1fc1bf881913f8c87d1fd","up":true},{"one":"9d3c79e4a0ac4e5b95aa32545f3b8d86f74594faa237d5c2566cf02fbd60b11a","other":"027fb496438782583f78fb76999336eed7fb672a9c9ea50d04df580e6eb21377","up":true},{"one":"78cbc19a24d095ab7858849058c65c061c52289b91ddd92cee34bed98aee4a59","other":"558eb021744be19383be9ac91b9f77e07479e0eb25576bd32a3afaa94c231178","up":true},{"one":"2459fe9250b3311c86530d00b7a9b8ba57b1b5151c126262e70c55d1e8d37924","other":"2a22dbee71a0ef27c840221db4a592d6dc8f171afed865ff814a37d633a3eaa9","up":true},{"one":"213bf6e78e02a57585908c756f0965297152c3c400a0ed4c407a411e1ec5942d","other":"ea60ef7cb3f2166a5c8e286c885984943a2ea5aff4730015be6a15031040cecf","up":true},{"one":"b2b9ac0f4db58886597af7b19d6150498ac8ad7c804671628aa34384b8fe505e","other":"48b614958a8692780ef5bd5c95e0db4ff67deb4de0dcbb878ca4479bfb86957e","up":true},{"one":"b486ce31ce880db3aaa17a0ac2c2f3554b6fe71f9c051edb572974342af4adb9","other":"7f87da7ee55b4c8c8f9d55411ff88d3a0b63bfee6a516917d49fa6273fb5b86a","up":true},{"one":"b92a71a4fc371e0596538a7fb2a33e85329c39c4409c99798d9318bc263a04a1","other":"afa3de5cebc9f96cf20a35058f4856fe43b48ac59cf8e46565f194f438622a52","up":true},{"one":"13bc64535d3ae495098e4ac6b30a91d1804dab0ab79944f2c6ac53c9bccdf62d","other":"c3a1b301bf187fd8326831197d93a0266ac0cc8287b9008631240e2bec9cf337","up":true},{"one":"b70e96f01ac8947d2de6320412ae3310316caba65c27108ad16b2f2004255be4","other":"8b76194f129308324c7d0066530e02cac2410ee0ba952822f0ec866e12461e44","up":true},{"one":"f74ecde0bbaa7b6521fb205b5ab9ea637909277f6e1ee1d3490f5cd01d0f7216","other":"e16b12c708bc5e0545009daed44733c52d7450ccc797d158dd41a3bc9507b6be","up":true},{"one":"667ef042e9dae18694581e0404c3d87a09800e8b42173d26571c3bf97e29a372","other":"757a557424c33ad89efd8185ec18d71c025830ecb2aed951e33c8c8d986d5933","up":true},{"one":"9e02c5384602a54e900cfa46d5987b77f16e74cba745ac850fcada01c7af9004","other":"39dbd5462c90dac75f49d9af7996845943bbe929754ef8125eee7f5a763e9def","up":true},{"one":"2459fe9250b3311c86530d00b7a9b8ba57b1b5151c126262e70c55d1e8d37924","other":"042788d5b72cb84a375565d120d239a2b14fdf38b3f5f992284d78535077148a","up":true},{"one":"8cf957bf95a629c60c31dbcfe75ecca149a81c761f8b34858b04f8318e5c74bd","other":"e77f6aa9e3dfcce0a2e5db794703224249aba60595075b2df9a5b0b30855cf46","up":true},{"one":"ae67fae4990da61ca89221c5b1675c992babb4d715b59939e47bd1491b3bf1f4","other":"3cb1b4069727dc323a687cab4ca2764f6415450488706f1b97c5cb8ca46346ff","up":true},{"one":"3ee4b20c047e701b58c06fcc8160364bd29573f61f4d9f1935d77ac29f6a1e86","other":"89c883d6a85472bda328667e3fd805c70876bc582ca6763ab97ae636b1772be4","up":true},{"one":"0506e949748b62da1d36b663df7d6a7e76027f72ced5d52f74677fb31d7e1505","other":"0ff67b0e9ec6509c7786495b7b3ddb176b4f8221ff300f409f00a3d389e8874c","up":true},{"one":"ae67fae4990da61ca89221c5b1675c992babb4d715b59939e47bd1491b3bf1f4","other":"e77f6aa9e3dfcce0a2e5db794703224249aba60595075b2df9a5b0b30855cf46","up":true},{"one":"7b9242137f8cc2bec7b3e0003fd93026921ceb10dfadbbd5b6aa64d61a74f35e","other":"9ee7b3e06b453615cbd8737cb74515b150f518f1a2eaa2db90e54708dd161b7d","up":true},{"one":"7f87da7ee55b4c8c8f9d55411ff88d3a0b63bfee6a516917d49fa6273fb5b86a","other":"ea0e1dd41fe042b09f273c98f02128949cf5561d20dc04b3d423961efed52327","up":true},{"one":"7355fab10584e4312f5cb5c3c826e7f9c14da74d62d07d0a8007ce9c6e995be9","other":"734e029ed25485edd49b93dd9e85b6e7657f860e4ded4bc8a5094f512ae5836b","up":true},{"one":"91eba9f9c8f2929d38f43a0c7efa809c0d2d59a31cbf2760c90e73d20266d528","other":"027fb496438782583f78fb76999336eed7fb672a9c9ea50d04df580e6eb21377","up":true},{"one":"6e5c213a2db57eaf2e1e1acc341c72efab89b0e42b6cd18db4f99ac1af151d65","other":"b486ce31ce880db3aaa17a0ac2c2f3554b6fe71f9c051edb572974342af4adb9","up":true},{"one":"13bc64535d3ae495098e4ac6b30a91d1804dab0ab79944f2c6ac53c9bccdf62d","other":"2a22dbee71a0ef27c840221db4a592d6dc8f171afed865ff814a37d633a3eaa9","up":true},{"one":"a085045c335ce2e47dbdfeb1adb62ce6c3bed36a93cf3448c45757a1a88e295d","other":"39dbd5462c90dac75f49d9af7996845943bbe929754ef8125eee7f5a763e9def","up":true},{"one":"c8e5a1b4533dd0de12acee4d31369f39785178568718b93bbc321ec83e0714f0","other":"286aeba646bba4a8aa1c372bee9f2c9ff0a2b3abb4f18be321225555c6dce4e5","up":true},{"one":"3ee4b20c047e701b58c06fcc8160364bd29573f61f4d9f1935d77ac29f6a1e86","other":"0ab9845c2890b0a64a3e5932241245e00b817b788094f9ee48f86f80b7264fea","up":true},{"one":"645b4e6b36fc1928725f627aeed278f46c5a7d6b0fff7ccff55a0468d47b23e8","other":"41b9ee7ad19698e97589b059ad3333cb64f02c16006d94fb3d0bad7ced8ff238","up":true},{"one":"4167946de250b013e1be16ee84bfe2ccaae83e699e618b38f31016c4e431e6ba","other":"7b9242137f8cc2bec7b3e0003fd93026921ceb10dfadbbd5b6aa64d61a74f35e","up":true},{"one":"7f87da7ee55b4c8c8f9d55411ff88d3a0b63bfee6a516917d49fa6273fb5b86a","other":"419a6626dd026c0438461592121992c6be1868375011655b6d405166cd8edf7f","up":true},{"one":"9e02c5384602a54e900cfa46d5987b77f16e74cba745ac850fcada01c7af9004","other":"018adc613f78d6ec876274f821251fd049eb3651646cd69e27efe211fe88d936","up":true},{"one":"78cbc19a24d095ab7858849058c65c061c52289b91ddd92cee34bed98aee4a59","other":"ea0e1dd41fe042b09f273c98f02128949cf5561d20dc04b3d423961efed52327","up":true},{"one":"b8e1a80d91216fd5f8bc3f7413caf68ade7f124354d44fe7bd155a089134a70a","other":"a3205c1c4f9b72814f0db68e888e3c7ef88f27c681ed0d731dde5f0999f92ccc","up":true},{"one":"92a1501ed41e29bb7dd8eb4b4acecae983f4c7c83f39895cd68f7810b645f1dd","other":"7b9242137f8cc2bec7b3e0003fd93026921ceb10dfadbbd5b6aa64d61a74f35e","up":true},{"one":"7639f9a66e8ff70f554c346faa25f78140957c295b748fc42a12df7972f4fcc6","other":"7cf4838a7c83a736ce59cfa1b974674a0185dbe17a8f3cd29794a3bbe814adee","up":true},{"one":"78cbc19a24d095ab7858849058c65c061c52289b91ddd92cee34bed98aee4a59","other":"47c3e0dfbbfcebeece78865c8c989577360cd9cc46a3b43f4b7b01ed14dc30e6","up":true},{"one":"6c029114a9f73d69a42e591cf2d13107eff038d3eda8abb0242d9d6d169f05c7","other":"dc97c1a0019b482a048b8d15941dfe4c3c1a3443d9b2d7b4046370bc84a7e56f","up":true},{"one":"7f87da7ee55b4c8c8f9d55411ff88d3a0b63bfee6a516917d49fa6273fb5b86a","other":"7cf4838a7c83a736ce59cfa1b974674a0185dbe17a8f3cd29794a3bbe814adee","up":true},{"one":"ebca518e5146f49ac75bcaa8add2ef4d1d22c5cfd2e2326c6b41826d45ce55ae","other":"d0f398969480f3df3587f6d47546ff1261cad4d2e9c26ff3077e35ae1b26153e","up":true},{"one":"757a557424c33ad89efd8185ec18d71c025830ecb2aed951e33c8c8d986d5933","other":"d2245f0679b436faabc0164e0b85e02e2effbad306e8229b555524a5e6d1a5f9","up":true},{"one":"3cb1b4069727dc323a687cab4ca2764f6415450488706f1b97c5cb8ca46346ff","other":"2434c63e7f28b83e7feede7fe68ea99b989f8534f64d63b046733e2f474538f5","up":true},{"one":"b486ce31ce880db3aaa17a0ac2c2f3554b6fe71f9c051edb572974342af4adb9","other":"7cf4838a7c83a736ce59cfa1b974674a0185dbe17a8f3cd29794a3bbe814adee","up":true},{"one":"ad0d0dc5d4114ee4482d6c9bd4e46683327abf2b92df0d242d79019963876668","other":"895bdcd200cc4d7ec5c24f1722d0a8ebedda78b78cdf1ccc8c22a981980f5786","up":true},{"one":"ca036d1ef9e6ce3654f2d769f16926aa14957193586426489e15539dfa8f7763","other":"f5c4d28df5973ec0292221a875e8446323f339409d93f0f7385990126908a3c3","up":true},{"one":"9d3c79e4a0ac4e5b95aa32545f3b8d86f74594faa237d5c2566cf02fbd60b11a","other":"0ab9845c2890b0a64a3e5932241245e00b817b788094f9ee48f86f80b7264fea","up":true},{"one":"4a1811dd9febde1801a604ad81de84a2d15366d0b5c330f30f3398da0d107824","other":"757a557424c33ad89efd8185ec18d71c025830ecb2aed951e33c8c8d986d5933","up":true},{"one":"aebd6135d10252b07f891b3a7330903faf13d409c4f7108630715fa0754f938e","other":"e77f6aa9e3dfcce0a2e5db794703224249aba60595075b2df9a5b0b30855cf46","up":true},{"one":"47c3e0dfbbfcebeece78865c8c989577360cd9cc46a3b43f4b7b01ed14dc30e6","other":"286aeba646bba4a8aa1c372bee9f2c9ff0a2b3abb4f18be321225555c6dce4e5","up":true},{"one":"39dbd5462c90dac75f49d9af7996845943bbe929754ef8125eee7f5a763e9def","other":"558eb021744be19383be9ac91b9f77e07479e0eb25576bd32a3afaa94c231178","up":true},{"one":"dfaeebc8e29c6a8f851b12b80cf42567cd2a43e35d977305a3c10e51bf41170a","other":"e77f6aa9e3dfcce0a2e5db794703224249aba60595075b2df9a5b0b30855cf46","up":true},{"one":"7fbc1843e2222e3c8e35a3215d1bbb4d5457d8b9ed33749e07e22f25ba9ee576","other":"7f87da7ee55b4c8c8f9d55411ff88d3a0b63bfee6a516917d49fa6273fb5b86a","up":true},{"one":"213bf6e78e02a57585908c756f0965297152c3c400a0ed4c407a411e1ec5942d","other":"57764522162620c1ad0b166a9c43772255d0cc01e49f2122ef09db046804a570","up":true},{"one":"67288f84ada7778858139c74917b22ae698ed43df49a6530a566648f074ede46","other":"e0b1c4eb5b5b4dfc22344ee65cb9716cecb38dcc80099793f20641884eae4854","up":true},{"one":"e0ea575d0e2efa28bc51f49d1e2c24196a196da3b3196f3a5a26a5e310809af5","other":"5a01993ff7b4bd12fdb259e96b26a036d0cf5d4ae9c9b516be64b63acec2443a","up":true},{"one":"0506e949748b62da1d36b663df7d6a7e76027f72ced5d52f74677fb31d7e1505","other":"213bf6e78e02a57585908c756f0965297152c3c400a0ed4c407a411e1ec5942d","up":true},{"one":"962676818c17fae1ffc52fc29318c44f9b8c980afd6d3e98217b4088d568a808","other":"7b9242137f8cc2bec7b3e0003fd93026921ceb10dfadbbd5b6aa64d61a74f35e","up":true},{"one":"4a1811dd9febde1801a604ad81de84a2d15366d0b5c330f30f3398da0d107824","other":"772e4c80d128deb52adf024a0eb6fe9bbea1c83351ed93f55f490cd5e5c69260","up":true},{"one":"cec3c01c147b34f25104ddd0b25076cef63ac224eada9d9f5a00b8513331354f","other":"286aeba646bba4a8aa1c372bee9f2c9ff0a2b3abb4f18be321225555c6dce4e5","up":true},{"one":"c18105aa302a43e352d999745a0f806af9f8cb8bb83349357da5c85e8975acd1","other":"c3a1b301bf187fd8326831197d93a0266ac0cc8287b9008631240e2bec9cf337","up":true},{"one":"2459fe9250b3311c86530d00b7a9b8ba57b1b5151c126262e70c55d1e8d37924","other":"6c82fdabd09e0e9d0fc507613a05951c02b2953d763a062a5f32aaf5cc477c19","up":true},{"one":"1be4348ec5670cdc4f164d77b1356e7910b6d1be4a9b720e549d02e5482a9e78","other":"027fb496438782583f78fb76999336eed7fb672a9c9ea50d04df580e6eb21377","up":true},{"one":"ad0d0dc5d4114ee4482d6c9bd4e46683327abf2b92df0d242d79019963876668","other":"a3205c1c4f9b72814f0db68e888e3c7ef88f27c681ed0d731dde5f0999f92ccc","up":true},{"one":"ea60ef7cb3f2166a5c8e286c885984943a2ea5aff4730015be6a15031040cecf","other":"2434c63e7f28b83e7feede7fe68ea99b989f8534f64d63b046733e2f474538f5","up":true},{"one":"7fbc1843e2222e3c8e35a3215d1bbb4d5457d8b9ed33749e07e22f25ba9ee576","other":"78cbc19a24d095ab7858849058c65c061c52289b91ddd92cee34bed98aee4a59","up":true},{"one":"1be4348ec5670cdc4f164d77b1356e7910b6d1be4a9b720e549d02e5482a9e78","other":"e77f6aa9e3dfcce0a2e5db794703224249aba60595075b2df9a5b0b30855cf46","up":true},{"one":"73b8d1840d0a8ffe69752ec96f8fddecb0e22726c87982d572ca9acc1c9cdbfc","other":"7639f9a66e8ff70f554c346faa25f78140957c295b748fc42a12df7972f4fcc6","up":true},{"one":"a7a61804d270ed6c27a4b1e8a634c30d7cdbaf644a1c67cbc6b08cd849a711db","other":"f36120ff250b9e7164e96021479332054f67de65cd2fe5b6e34bc51d0fe4d29c","up":true},{"one":"dfaeebc8e29c6a8f851b12b80cf42567cd2a43e35d977305a3c10e51bf41170a","other":"e0b1c4eb5b5b4dfc22344ee65cb9716cecb38dcc80099793f20641884eae4854","up":true},{"one":"06b95f1bac76ca4925d509b06216f2113ac5dcf051ef5aa0a320ae64069e0b6d","other":"26d1af1fbee6541a363ea7707825e37da028142f00779116560ad20f1de18e7b","up":true},{"one":"aebd6135d10252b07f891b3a7330903faf13d409c4f7108630715fa0754f938e","other":"82f034db88fd26b47c26b95c3f87a1f454ffe4526ae86beb2bb1d8f2c218c25c","up":true},{"one":"021811a6757bdcdd2fa0fb68401dfe009d5a8e129958cd304fb42cf51dc5d1d3","other":"b92a71a4fc371e0596538a7fb2a33e85329c39c4409c99798d9318bc263a04a1","up":true},{"one":"aebd6135d10252b07f891b3a7330903faf13d409c4f7108630715fa0754f938e","other":"3e56d4533ec14f6656e1eb25fb35dad47c9db479f667a6b6fe9a3aa8c12e982e","up":true},{"one":"6c029114a9f73d69a42e591cf2d13107eff038d3eda8abb0242d9d6d169f05c7","other":"734e029ed25485edd49b93dd9e85b6e7657f860e4ded4bc8a5094f512ae5836b","up":true},{"one":"7f87da7ee55b4c8c8f9d55411ff88d3a0b63bfee6a516917d49fa6273fb5b86a","other":"4167946de250b013e1be16ee84bfe2ccaae83e699e618b38f31016c4e431e6ba","up":true},{"one":"1be4348ec5670cdc4f164d77b1356e7910b6d1be4a9b720e549d02e5482a9e78","other":"cec3c01c147b34f25104ddd0b25076cef63ac224eada9d9f5a00b8513331354f","up":true},{"one":"ea60ef7cb3f2166a5c8e286c885984943a2ea5aff4730015be6a15031040cecf","other":"286aeba646bba4a8aa1c372bee9f2c9ff0a2b3abb4f18be321225555c6dce4e5","up":true},{"one":"cbc5d42951bc6e187296b5f8ce4d04e472e26670a62851f39d65f31c50865f6a","other":"06b95f1bac76ca4925d509b06216f2113ac5dcf051ef5aa0a320ae64069e0b6d","up":true},{"one":"645b4e6b36fc1928725f627aeed278f46c5a7d6b0fff7ccff55a0468d47b23e8","other":"57764522162620c1ad0b166a9c43772255d0cc01e49f2122ef09db046804a570","up":true},{"one":"895bdcd200cc4d7ec5c24f1722d0a8ebedda78b78cdf1ccc8c22a981980f5786","other":"f36120ff250b9e7164e96021479332054f67de65cd2fe5b6e34bc51d0fe4d29c","up":true},{"one":"89c883d6a85472bda328667e3fd805c70876bc582ca6763ab97ae636b1772be4","other":"26d1af1fbee6541a363ea7707825e37da028142f00779116560ad20f1de18e7b","up":true},{"one":"b92a71a4fc371e0596538a7fb2a33e85329c39c4409c99798d9318bc263a04a1","other":"e55d8cdb7e7940b11929e7e5c949ef6beb7998e5180a1f0a3c0bf61aef39f1b8","up":true},{"one":"021811a6757bdcdd2fa0fb68401dfe009d5a8e129958cd304fb42cf51dc5d1d3","other":"b8e1a80d91216fd5f8bc3f7413caf68ade7f124354d44fe7bd155a089134a70a","up":true},{"one":"b8411f198fd658c5a2028835c0af3342145839c06c8a4f382d9f9de485d46c08","other":"e55d8cdb7e7940b11929e7e5c949ef6beb7998e5180a1f0a3c0bf61aef39f1b8","up":true},{"one":"39dbd5462c90dac75f49d9af7996845943bbe929754ef8125eee7f5a763e9def","other":"8cf957bf95a629c60c31dbcfe75ecca149a81c761f8b34858b04f8318e5c74bd","up":true},{"one":"e55d8cdb7e7940b11929e7e5c949ef6beb7998e5180a1f0a3c0bf61aef39f1b8","other":"b8e1a80d91216fd5f8bc3f7413caf68ade7f124354d44fe7bd155a089134a70a","up":true},{"one":"5a01993ff7b4bd12fdb259e96b26a036d0cf5d4ae9c9b516be64b63acec2443a","other":"41b9ee7ad19698e97589b059ad3333cb64f02c16006d94fb3d0bad7ced8ff238","up":true},{"one":"3e56d4533ec14f6656e1eb25fb35dad47c9db479f667a6b6fe9a3aa8c12e982e","other":"6c82fdabd09e0e9d0fc507613a05951c02b2953d763a062a5f32aaf5cc477c19","up":true},{"one":"dfaeebc8e29c6a8f851b12b80cf42567cd2a43e35d977305a3c10e51bf41170a","other":"e0ea575d0e2efa28bc51f49d1e2c24196a196da3b3196f3a5a26a5e310809af5","up":true},{"one":"1be4348ec5670cdc4f164d77b1356e7910b6d1be4a9b720e549d02e5482a9e78","other":"47c3e0dfbbfcebeece78865c8c989577360cd9cc46a3b43f4b7b01ed14dc30e6","up":true},{"one":"698247d103a8925d8bb4c56a3056e49c5efc595fced1c89d49943bb9ba01f394","other":"e16b12c708bc5e0545009daed44733c52d7450ccc797d158dd41a3bc9507b6be","up":true},{"one":"8be461203f5ebb5721348f537b37d768f7bd359af3e18d1f7e9af2f901c49845","other":"8cf957bf95a629c60c31dbcfe75ecca149a81c761f8b34858b04f8318e5c74bd","up":true},{"one":"4167946de250b013e1be16ee84bfe2ccaae83e699e618b38f31016c4e431e6ba","other":"7cf4838a7c83a736ce59cfa1b974674a0185dbe17a8f3cd29794a3bbe814adee","up":true},{"one":"6c029114a9f73d69a42e591cf2d13107eff038d3eda8abb0242d9d6d169f05c7","other":"d2245f0679b436faabc0164e0b85e02e2effbad306e8229b555524a5e6d1a5f9","up":true},{"one":"13bc64535d3ae495098e4ac6b30a91d1804dab0ab79944f2c6ac53c9bccdf62d","other":"cec3c01c147b34f25104ddd0b25076cef63ac224eada9d9f5a00b8513331354f","up":true},{"one":"ea60ef7cb3f2166a5c8e286c885984943a2ea5aff4730015be6a15031040cecf","other":"d2245f0679b436faabc0164e0b85e02e2effbad306e8229b555524a5e6d1a5f9","up":true},{"one":"7b9242137f8cc2bec7b3e0003fd93026921ceb10dfadbbd5b6aa64d61a74f35e","other":"734e029ed25485edd49b93dd9e85b6e7657f860e4ded4bc8a5094f512ae5836b","up":true},{"one":"0bcf8a8ab0065ca8c85b8b6641f4c6e0b0de60e79ef32ebf6ff8f109ac4e1d70","other":"018adc613f78d6ec876274f821251fd049eb3651646cd69e27efe211fe88d936","up":true},{"one":"2434c63e7f28b83e7feede7fe68ea99b989f8534f64d63b046733e2f474538f5","other":"042788d5b72cb84a375565d120d239a2b14fdf38b3f5f992284d78535077148a","up":true},{"one":"41b9ee7ad19698e97589b059ad3333cb64f02c16006d94fb3d0bad7ced8ff238","other":"0ff67b0e9ec6509c7786495b7b3ddb176b4f8221ff300f409f00a3d389e8874c","up":true},{"one":"a7a61804d270ed6c27a4b1e8a634c30d7cdbaf644a1c67cbc6b08cd849a711db","other":"f36084048bf0ff985a77f5183796f7b37b7085ee6eea8bbc5fc62558854cce67","up":true},{"one":"2434c63e7f28b83e7feede7fe68ea99b989f8534f64d63b046733e2f474538f5","other":"57764522162620c1ad0b166a9c43772255d0cc01e49f2122ef09db046804a570","up":true},{"one":"dc97c1a0019b482a048b8d15941dfe4c3c1a3443d9b2d7b4046370bc84a7e56f","other":"539df902d42dc997c6b0e24d16ad68b54c557d56b41c972a320d57632dbfbe3c","up":true},{"one":"895bdcd200cc4d7ec5c24f1722d0a8ebedda78b78cdf1ccc8c22a981980f5786","other":"0bcf8a8ab0065ca8c85b8b6641f4c6e0b0de60e79ef32ebf6ff8f109ac4e1d70","up":true},{"one":"5d608e66a17442091111cb472723fe3aea1f2baecaa546b57d49507c63a61cda","other":"f36120ff250b9e7164e96021479332054f67de65cd2fe5b6e34bc51d0fe4d29c","up":true},{"one":"39dbd5462c90dac75f49d9af7996845943bbe929754ef8125eee7f5a763e9def","other":"8b76194f129308324c7d0066530e02cac2410ee0ba952822f0ec866e12461e44","up":true},{"one":"c3a1b301bf187fd8326831197d93a0266ac0cc8287b9008631240e2bec9cf337","other":"757a557424c33ad89efd8185ec18d71c025830ecb2aed951e33c8c8d986d5933","up":true},{"one":"ea60ef7cb3f2166a5c8e286c885984943a2ea5aff4730015be6a15031040cecf","other":"1be4348ec5670cdc4f164d77b1356e7910b6d1be4a9b720e549d02e5482a9e78","up":true},{"one":"dfaeebc8e29c6a8f851b12b80cf42567cd2a43e35d977305a3c10e51bf41170a","other":"ea0e1dd41fe042b09f273c98f02128949cf5561d20dc04b3d423961efed52327","up":true},{"one":"b8411f198fd658c5a2028835c0af3342145839c06c8a4f382d9f9de485d46c08","other":"9ee7b3e06b453615cbd8737cb74515b150f518f1a2eaa2db90e54708dd161b7d","up":true},{"one":"6ecb11fc5acc16ecd70351410fa18ec44a2a83d9e778cf25b85a7535493456b7","other":"ea0e1dd41fe042b09f273c98f02128949cf5561d20dc04b3d423961efed52327","up":true},{"one":"018adc613f78d6ec876274f821251fd049eb3651646cd69e27efe211fe88d936","other":"8cf957bf95a629c60c31dbcfe75ecca149a81c761f8b34858b04f8318e5c74bd","up":true},{"one":"1be4348ec5670cdc4f164d77b1356e7910b6d1be4a9b720e549d02e5482a9e78","other":"edc8794153fb517085d27a83a4b00e8c3b37f22d2242b842cb2fab66764de9fe","up":true},{"one":"6c029114a9f73d69a42e591cf2d13107eff038d3eda8abb0242d9d6d169f05c7","other":"d0f398969480f3df3587f6d47546ff1261cad4d2e9c26ff3077e35ae1b26153e","up":true},{"one":"5abc96f4fa78812db6fb710fd424dd474145f7e5d00b4cedc5373b4c52f42cf5","other":"734e029ed25485edd49b93dd9e85b6e7657f860e4ded4bc8a5094f512ae5836b","up":true},{"one":"b70e96f01ac8947d2de6320412ae3310316caba65c27108ad16b2f2004255be4","other":"f36120ff250b9e7164e96021479332054f67de65cd2fe5b6e34bc51d0fe4d29c","up":true},{"one":"757a557424c33ad89efd8185ec18d71c025830ecb2aed951e33c8c8d986d5933","other":"d0f398969480f3df3587f6d47546ff1261cad4d2e9c26ff3077e35ae1b26153e","up":true},{"one":"698247d103a8925d8bb4c56a3056e49c5efc595fced1c89d49943bb9ba01f394","other":"e55d8cdb7e7940b11929e7e5c949ef6beb7998e5180a1f0a3c0bf61aef39f1b8","up":true},{"one":"c3a1b301bf187fd8326831197d93a0266ac0cc8287b9008631240e2bec9cf337","other":"b381e75e52e4cdd168056245f82d3a1747b67f400eb40eb12036b73ee7fe21e5","up":true},{"one":"286aeba646bba4a8aa1c372bee9f2c9ff0a2b3abb4f18be321225555c6dce4e5","other":"26d1af1fbee6541a363ea7707825e37da028142f00779116560ad20f1de18e7b","up":true},{"one":"b70e96f01ac8947d2de6320412ae3310316caba65c27108ad16b2f2004255be4","other":"b2b9ac0f4db58886597af7b19d6150498ac8ad7c804671628aa34384b8fe505e","up":true},{"one":"d2245f0679b436faabc0164e0b85e02e2effbad306e8229b555524a5e6d1a5f9","other":"ebca518e5146f49ac75bcaa8add2ef4d1d22c5cfd2e2326c6b41826d45ce55ae","up":true},{"one":"286aeba646bba4a8aa1c372bee9f2c9ff0a2b3abb4f18be321225555c6dce4e5","other":"57764522162620c1ad0b166a9c43772255d0cc01e49f2122ef09db046804a570","up":true},{"one":"4cd0f38e52a508f81cf95e1370c994aea2d7a49a2a08e3e054f53629a6619410","other":"7639f9a66e8ff70f554c346faa25f78140957c295b748fc42a12df7972f4fcc6","up":true},{"one":"4b243a5aeabec6db0e4a80a9c255300cd94591a6fbe0e0aa170da4f6ce14edff","other":"1929a84bcd64bf002d0afb16249466c5b660123174a1fc1bf881913f8c87d1fd","up":true},{"one":"6c82fdabd09e0e9d0fc507613a05951c02b2953d763a062a5f32aaf5cc477c19","other":"2434c63e7f28b83e7feede7fe68ea99b989f8534f64d63b046733e2f474538f5","up":true},{"one":"d2245f0679b436faabc0164e0b85e02e2effbad306e8229b555524a5e6d1a5f9","other":"7dc5e8d8180c1bc7ebbee11a47fc96e8fe8b2d71c30cbc4aa1cf99e8eb6afcac","up":true},{"one":"5d608e66a17442091111cb472723fe3aea1f2baecaa546b57d49507c63a61cda","other":"e0b1c4eb5b5b4dfc22344ee65cb9716cecb38dcc80099793f20641884eae4854","up":true},{"one":"92a1501ed41e29bb7dd8eb4b4acecae983f4c7c83f39895cd68f7810b645f1dd","other":"d0f398969480f3df3587f6d47546ff1261cad4d2e9c26ff3077e35ae1b26153e","up":true},{"one":"7355fab10584e4312f5cb5c3c826e7f9c14da74d62d07d0a8007ce9c6e995be9","other":"2a22dbee71a0ef27c840221db4a592d6dc8f171afed865ff814a37d633a3eaa9","up":true},{"one":"b16dcdf1ff1a56d49e374531d9885d59c1bcfbb628604520d9b1d84662edb9ca","other":"c8e5a1b4533dd0de12acee4d31369f39785178568718b93bbc321ec83e0714f0","up":true},{"one":"7dc5e8d8180c1bc7ebbee11a47fc96e8fe8b2d71c30cbc4aa1cf99e8eb6afcac","other":"e16b12c708bc5e0545009daed44733c52d7450ccc797d158dd41a3bc9507b6be","up":true},{"one":"47c3e0dfbbfcebeece78865c8c989577360cd9cc46a3b43f4b7b01ed14dc30e6","other":"0ff67b0e9ec6509c7786495b7b3ddb176b4f8221ff300f409f00a3d389e8874c","up":true},{"one":"4cd0f38e52a508f81cf95e1370c994aea2d7a49a2a08e3e054f53629a6619410","other":"734e029ed25485edd49b93dd9e85b6e7657f860e4ded4bc8a5094f512ae5836b","up":true},{"one":"2434c63e7f28b83e7feede7fe68ea99b989f8534f64d63b046733e2f474538f5","other":"8b76194f129308324c7d0066530e02cac2410ee0ba952822f0ec866e12461e44","up":true},{"one":"6ecb11fc5acc16ecd70351410fa18ec44a2a83d9e778cf25b85a7535493456b7","other":"e55d8cdb7e7940b11929e7e5c949ef6beb7998e5180a1f0a3c0bf61aef39f1b8","up":true},{"one":"c8e5a1b4533dd0de12acee4d31369f39785178568718b93bbc321ec83e0714f0","other":"0ff67b0e9ec6509c7786495b7b3ddb176b4f8221ff300f409f00a3d389e8874c","up":true},{"one":"cfbb9ea682becadeab10bbd080ba8e93510085a87ac519e434964faa222fc275","other":"757a557424c33ad89efd8185ec18d71c025830ecb2aed951e33c8c8d986d5933","up":true},{"one":"7cf4838a7c83a736ce59cfa1b974674a0185dbe17a8f3cd29794a3bbe814adee","other":"419a6626dd026c0438461592121992c6be1868375011655b6d405166cd8edf7f","up":true},{"one":"89c883d6a85472bda328667e3fd805c70876bc582ca6763ab97ae636b1772be4","other":"f36120ff250b9e7164e96021479332054f67de65cd2fe5b6e34bc51d0fe4d29c","up":true},{"one":"cfbb9ea682becadeab10bbd080ba8e93510085a87ac519e434964faa222fc275","other":"ca036d1ef9e6ce3654f2d769f16926aa14957193586426489e15539dfa8f7763","up":true},{"one":"ad0d0dc5d4114ee4482d6c9bd4e46683327abf2b92df0d242d79019963876668","other":"8cf957bf95a629c60c31dbcfe75ecca149a81c761f8b34858b04f8318e5c74bd","up":true},{"one":"8cf957bf95a629c60c31dbcfe75ecca149a81c761f8b34858b04f8318e5c74bd","other":"f36120ff250b9e7164e96021479332054f67de65cd2fe5b6e34bc51d0fe4d29c","up":true},{"one":"4cd0f38e52a508f81cf95e1370c994aea2d7a49a2a08e3e054f53629a6619410","other":"b2b9ac0f4db58886597af7b19d6150498ac8ad7c804671628aa34384b8fe505e","up":true},{"one":"b381e75e52e4cdd168056245f82d3a1747b67f400eb40eb12036b73ee7fe21e5","other":"f5c4d28df5973ec0292221a875e8446323f339409d93f0f7385990126908a3c3","up":true},{"one":"109ef17c890104bfc5a4897d526a0afaa8c991c9d213616032f3058d0feb7f00","other":"e16b12c708bc5e0545009daed44733c52d7450ccc797d158dd41a3bc9507b6be","up":true},{"one":"ca036d1ef9e6ce3654f2d769f16926aa14957193586426489e15539dfa8f7763","other":"f74ecde0bbaa7b6521fb205b5ab9ea637909277f6e1ee1d3490f5cd01d0f7216","up":true},{"one":"667ef042e9dae18694581e0404c3d87a09800e8b42173d26571c3bf97e29a372","other":"b2b9ac0f4db58886597af7b19d6150498ac8ad7c804671628aa34384b8fe505e","up":true},{"one":"b70e96f01ac8947d2de6320412ae3310316caba65c27108ad16b2f2004255be4","other":"afa3de5cebc9f96cf20a35058f4856fe43b48ac59cf8e46565f194f438622a52","up":true},{"one":"7cf4838a7c83a736ce59cfa1b974674a0185dbe17a8f3cd29794a3bbe814adee","other":"78cbc19a24d095ab7858849058c65c061c52289b91ddd92cee34bed98aee4a59","up":true},{"one":"cec3c01c147b34f25104ddd0b25076cef63ac224eada9d9f5a00b8513331354f","other":"0ff67b0e9ec6509c7786495b7b3ddb176b4f8221ff300f409f00a3d389e8874c","up":true},{"one":"018adc613f78d6ec876274f821251fd049eb3651646cd69e27efe211fe88d936","other":"8b76194f129308324c7d0066530e02cac2410ee0ba952822f0ec866e12461e44","up":true},{"one":"9ee7b3e06b453615cbd8737cb74515b150f518f1a2eaa2db90e54708dd161b7d","other":"82f034db88fd26b47c26b95c3f87a1f454ffe4526ae86beb2bb1d8f2c218c25c","up":true},{"one":"78cbc19a24d095ab7858849058c65c061c52289b91ddd92cee34bed98aee4a59","other":"5abc96f4fa78812db6fb710fd424dd474145f7e5d00b4cedc5373b4c52f42cf5","up":true},{"one":"67288f84ada7778858139c74917b22ae698ed43df49a6530a566648f074ede46","other":"e16b12c708bc5e0545009daed44733c52d7450ccc797d158dd41a3bc9507b6be","up":true},{"one":"021811a6757bdcdd2fa0fb68401dfe009d5a8e129958cd304fb42cf51dc5d1d3","other":"962676818c17fae1ffc52fc29318c44f9b8c980afd6d3e98217b4088d568a808","up":true},{"one":"018adc613f78d6ec876274f821251fd049eb3651646cd69e27efe211fe88d936","other":"c8e5a1b4533dd0de12acee4d31369f39785178568718b93bbc321ec83e0714f0","up":true},{"one":"b16dcdf1ff1a56d49e374531d9885d59c1bcfbb628604520d9b1d84662edb9ca","other":"109ef17c890104bfc5a4897d526a0afaa8c991c9d213616032f3058d0feb7f00","up":true},{"one":"6c029114a9f73d69a42e591cf2d13107eff038d3eda8abb0242d9d6d169f05c7","other":"c3a1b301bf187fd8326831197d93a0266ac0cc8287b9008631240e2bec9cf337","up":true},{"one":"b70e96f01ac8947d2de6320412ae3310316caba65c27108ad16b2f2004255be4","other":"f5c4d28df5973ec0292221a875e8446323f339409d93f0f7385990126908a3c3","up":true},{"one":"ce99e9d37111c52e929b187fe201790b1a555dfb8b6b6de54e94df7cc2d43fd4","other":"b16dcdf1ff1a56d49e374531d9885d59c1bcfbb628604520d9b1d84662edb9ca","up":true},{"one":"ebca518e5146f49ac75bcaa8add2ef4d1d22c5cfd2e2326c6b41826d45ce55ae","other":"698247d103a8925d8bb4c56a3056e49c5efc595fced1c89d49943bb9ba01f394","up":true},{"one":"e77f6aa9e3dfcce0a2e5db794703224249aba60595075b2df9a5b0b30855cf46","other":"a3205c1c4f9b72814f0db68e888e3c7ef88f27c681ed0d731dde5f0999f92ccc","up":true},{"one":"7dc5e8d8180c1bc7ebbee11a47fc96e8fe8b2d71c30cbc4aa1cf99e8eb6afcac","other":"d0f398969480f3df3587f6d47546ff1261cad4d2e9c26ff3077e35ae1b26153e","up":true},{"one":"042788d5b72cb84a375565d120d239a2b14fdf38b3f5f992284d78535077148a","other":"2a22dbee71a0ef27c840221db4a592d6dc8f171afed865ff814a37d633a3eaa9","up":true},{"one":"c3a1b301bf187fd8326831197d93a0266ac0cc8287b9008631240e2bec9cf337","other":"7dc5e8d8180c1bc7ebbee11a47fc96e8fe8b2d71c30cbc4aa1cf99e8eb6afcac","up":true},{"one":"b381e75e52e4cdd168056245f82d3a1747b67f400eb40eb12036b73ee7fe21e5","other":"afa3de5cebc9f96cf20a35058f4856fe43b48ac59cf8e46565f194f438622a52","up":true},{"one":"26d1af1fbee6541a363ea7707825e37da028142f00779116560ad20f1de18e7b","other":"4b243a5aeabec6db0e4a80a9c255300cd94591a6fbe0e0aa170da4f6ce14edff","up":true},{"one":"026d2e41b82d506da685a30cce7cc5772f6c1e167b7d557e0531fb9b79dd4ff2","other":"7cf4838a7c83a736ce59cfa1b974674a0185dbe17a8f3cd29794a3bbe814adee","up":true},{"one":"a75abd0dce5a488b7e06f91fab7a92ec428ab21bde9372c9e8fa489f48e7b3fe","other":"dfaeebc8e29c6a8f851b12b80cf42567cd2a43e35d977305a3c10e51bf41170a","up":true},{"one":"7dc5e8d8180c1bc7ebbee11a47fc96e8fe8b2d71c30cbc4aa1cf99e8eb6afcac","other":"734e029ed25485edd49b93dd9e85b6e7657f860e4ded4bc8a5094f512ae5836b","up":true},{"one":"03907380afcd52238f3d84a8dee3df599c7f2f9b90fbc1271ee88bdb52acbd58","other":"13bc64535d3ae495098e4ac6b30a91d1804dab0ab79944f2c6ac53c9bccdf62d","up":true},{"one":"dc97c1a0019b482a048b8d15941dfe4c3c1a3443d9b2d7b4046370bc84a7e56f","other":"57764522162620c1ad0b166a9c43772255d0cc01e49f2122ef09db046804a570","up":true},{"one":"39dbd5462c90dac75f49d9af7996845943bbe929754ef8125eee7f5a763e9def","other":"9a9230b3f7f386520821dee78ebe92e8c64a4f6a50f2639327c62e45cab40563","up":true},{"one":"91eba9f9c8f2929d38f43a0c7efa809c0d2d59a31cbf2760c90e73d20266d528","other":"03907380afcd52238f3d84a8dee3df599c7f2f9b90fbc1271ee88bdb52acbd58","up":true},{"one":"5d608e66a17442091111cb472723fe3aea1f2baecaa546b57d49507c63a61cda","other":"e77f6aa9e3dfcce0a2e5db794703224249aba60595075b2df9a5b0b30855cf46","up":true},{"one":"ae67fae4990da61ca89221c5b1675c992babb4d715b59939e47bd1491b3bf1f4","other":"afa3de5cebc9f96cf20a35058f4856fe43b48ac59cf8e46565f194f438622a52","up":true},{"one":"6ecb11fc5acc16ecd70351410fa18ec44a2a83d9e778cf25b85a7535493456b7","other":"e0ea575d0e2efa28bc51f49d1e2c24196a196da3b3196f3a5a26a5e310809af5","up":true},{"one":"021811a6757bdcdd2fa0fb68401dfe009d5a8e129958cd304fb42cf51dc5d1d3","other":"1929a84bcd64bf002d0afb16249466c5b660123174a1fc1bf881913f8c87d1fd","up":true},{"one":"021811a6757bdcdd2fa0fb68401dfe009d5a8e129958cd304fb42cf51dc5d1d3","other":"b16dcdf1ff1a56d49e374531d9885d59c1bcfbb628604520d9b1d84662edb9ca","up":true},{"one":"8b76194f129308324c7d0066530e02cac2410ee0ba952822f0ec866e12461e44","other":"a7a61804d270ed6c27a4b1e8a634c30d7cdbaf644a1c67cbc6b08cd849a711db","up":true},{"one":"4a1811dd9febde1801a604ad81de84a2d15366d0b5c330f30f3398da0d107824","other":"7cf4838a7c83a736ce59cfa1b974674a0185dbe17a8f3cd29794a3bbe814adee","up":true},{"one":"a2babe49410ae007bc41ff2b7deaf709ed849e2f69666ce5aae76a3b71f47081","other":"109ef17c890104bfc5a4897d526a0afaa8c991c9d213616032f3058d0feb7f00","up":true},{"one":"e0b1c4eb5b5b4dfc22344ee65cb9716cecb38dcc80099793f20641884eae4854","other":"c3a1b301bf187fd8326831197d93a0266ac0cc8287b9008631240e2bec9cf337","up":true},{"one":"e16b12c708bc5e0545009daed44733c52d7450ccc797d158dd41a3bc9507b6be","other":"1929a84bcd64bf002d0afb16249466c5b660123174a1fc1bf881913f8c87d1fd","up":true},{"one":"ae67fae4990da61ca89221c5b1675c992babb4d715b59939e47bd1491b3bf1f4","other":"e55d8cdb7e7940b11929e7e5c949ef6beb7998e5180a1f0a3c0bf61aef39f1b8","up":true},{"one":"b486ce31ce880db3aaa17a0ac2c2f3554b6fe71f9c051edb572974342af4adb9","other":"6c029114a9f73d69a42e591cf2d13107eff038d3eda8abb0242d9d6d169f05c7","up":true},{"one":"dfaeebc8e29c6a8f851b12b80cf42567cd2a43e35d977305a3c10e51bf41170a","other":"ea60ef7cb3f2166a5c8e286c885984943a2ea5aff4730015be6a15031040cecf","up":true},{"one":"57764522162620c1ad0b166a9c43772255d0cc01e49f2122ef09db046804a570","other":"1be4348ec5670cdc4f164d77b1356e7910b6d1be4a9b720e549d02e5482a9e78","up":true},{"one":"a3205c1c4f9b72814f0db68e888e3c7ef88f27c681ed0d731dde5f0999f92ccc","other":"a7a61804d270ed6c27a4b1e8a634c30d7cdbaf644a1c67cbc6b08cd849a711db","up":true},{"one":"4167946de250b013e1be16ee84bfe2ccaae83e699e618b38f31016c4e431e6ba","other":"57764522162620c1ad0b166a9c43772255d0cc01e49f2122ef09db046804a570","up":true},{"one":"ad0d0dc5d4114ee4482d6c9bd4e46683327abf2b92df0d242d79019963876668","other":"8be461203f5ebb5721348f537b37d768f7bd359af3e18d1f7e9af2f901c49845","up":true},{"one":"895bdcd200cc4d7ec5c24f1722d0a8ebedda78b78cdf1ccc8c22a981980f5786","other":"0ab9845c2890b0a64a3e5932241245e00b817b788094f9ee48f86f80b7264fea","up":true},{"one":"5abc96f4fa78812db6fb710fd424dd474145f7e5d00b4cedc5373b4c52f42cf5","other":"517aa977048247d5d16ad51a286ffac4d8f910733f0578b222201308c32d195e","up":true},{"one":"018adc613f78d6ec876274f821251fd049eb3651646cd69e27efe211fe88d936","other":"895bdcd200cc4d7ec5c24f1722d0a8ebedda78b78cdf1ccc8c22a981980f5786","up":true},{"one":"47c3e0dfbbfcebeece78865c8c989577360cd9cc46a3b43f4b7b01ed14dc30e6","other":"026d2e41b82d506da685a30cce7cc5772f6c1e167b7d557e0531fb9b79dd4ff2","up":true},{"one":"92a1501ed41e29bb7dd8eb4b4acecae983f4c7c83f39895cd68f7810b645f1dd","other":"d2245f0679b436faabc0164e0b85e02e2effbad306e8229b555524a5e6d1a5f9","up":true},{"one":"89c883d6a85472bda328667e3fd805c70876bc582ca6763ab97ae636b1772be4","other":"3cb1b4069727dc323a687cab4ca2764f6415450488706f1b97c5cb8ca46346ff","up":true},{"one":"6e5c213a2db57eaf2e1e1acc341c72efab89b0e42b6cd18db4f99ac1af151d65","other":"7355fab10584e4312f5cb5c3c826e7f9c14da74d62d07d0a8007ce9c6e995be9","up":true},{"one":"757a557424c33ad89efd8185ec18d71c025830ecb2aed951e33c8c8d986d5933","other":"f5c4d28df5973ec0292221a875e8446323f339409d93f0f7385990126908a3c3","up":true},{"one":"cdcd165721f6851f361fad0b3ba88c8870be9ad6d6b8cbcecc7c89e1068d979a","other":"ca036d1ef9e6ce3654f2d769f16926aa14957193586426489e15539dfa8f7763","up":true},{"one":"621076ce6b82e70c90a4adf235aa6f71b116e302dd6b15dcae07f4a816012455","other":"67288f84ada7778858139c74917b22ae698ed43df49a6530a566648f074ede46","up":true},{"one":"645b4e6b36fc1928725f627aeed278f46c5a7d6b0fff7ccff55a0468d47b23e8","other":"7cf4838a7c83a736ce59cfa1b974674a0185dbe17a8f3cd29794a3bbe814adee","up":true},{"one":"667ef042e9dae18694581e0404c3d87a09800e8b42173d26571c3bf97e29a372","other":"dfaeebc8e29c6a8f851b12b80cf42567cd2a43e35d977305a3c10e51bf41170a","up":true},{"one":"cec3c01c147b34f25104ddd0b25076cef63ac224eada9d9f5a00b8513331354f","other":"018adc613f78d6ec876274f821251fd049eb3651646cd69e27efe211fe88d936","up":true},{"one":"6d601952793589bc6b57340c451a6abf02ea2c16637e910eed04cde6eddfe17a","other":"d0f398969480f3df3587f6d47546ff1261cad4d2e9c26ff3077e35ae1b26153e","up":true},{"one":"78cbc19a24d095ab7858849058c65c061c52289b91ddd92cee34bed98aee4a59","other":"6d601952793589bc6b57340c451a6abf02ea2c16637e910eed04cde6eddfe17a","up":true},{"one":"7b9242137f8cc2bec7b3e0003fd93026921ceb10dfadbbd5b6aa64d61a74f35e","other":"957d8a9b412b6f4cd151cbc07b8d74d949880ae665c545debb18181389c99ee6","up":true},{"one":"7355fab10584e4312f5cb5c3c826e7f9c14da74d62d07d0a8007ce9c6e995be9","other":"2459fe9250b3311c86530d00b7a9b8ba57b1b5151c126262e70c55d1e8d37924","up":true},{"one":"957d8a9b412b6f4cd151cbc07b8d74d949880ae665c545debb18181389c99ee6","other":"ed32d74d9be0649de1eb26b9915137fe46ec890c656c96be52e966ab6e2ed260","up":true},{"one":"042788d5b72cb84a375565d120d239a2b14fdf38b3f5f992284d78535077148a","other":"3ee4b20c047e701b58c06fcc8160364bd29573f61f4d9f1935d77ac29f6a1e86","up":true},{"one":"9d3c79e4a0ac4e5b95aa32545f3b8d86f74594faa237d5c2566cf02fbd60b11a","other":"0bcf8a8ab0065ca8c85b8b6641f4c6e0b0de60e79ef32ebf6ff8f109ac4e1d70","up":true},{"one":"6c82fdabd09e0e9d0fc507613a05951c02b2953d763a062a5f32aaf5cc477c19","other":"286aeba646bba4a8aa1c372bee9f2c9ff0a2b3abb4f18be321225555c6dce4e5","up":true},{"one":"edc8794153fb517085d27a83a4b00e8c3b37f22d2242b842cb2fab66764de9fe","other":"e16b12c708bc5e0545009daed44733c52d7450ccc797d158dd41a3bc9507b6be","up":true},{"one":"7639f9a66e8ff70f554c346faa25f78140957c295b748fc42a12df7972f4fcc6","other":"3e56d4533ec14f6656e1eb25fb35dad47c9db479f667a6b6fe9a3aa8c12e982e","up":true},{"one":"cbc5d42951bc6e187296b5f8ce4d04e472e26670a62851f39d65f31c50865f6a","other":"0ff67b0e9ec6509c7786495b7b3ddb176b4f8221ff300f409f00a3d389e8874c","up":true},{"one":"419a6626dd026c0438461592121992c6be1868375011655b6d405166cd8edf7f","other":"734e029ed25485edd49b93dd9e85b6e7657f860e4ded4bc8a5094f512ae5836b","up":true},{"one":"86ca1078dae40f23ae1b3ac47397460d9ec0bf243a0de372b405381d6722fcb2","other":"962676818c17fae1ffc52fc29318c44f9b8c980afd6d3e98217b4088d568a808","up":true},{"one":"8b76194f129308324c7d0066530e02cac2410ee0ba952822f0ec866e12461e44","other":"f36120ff250b9e7164e96021479332054f67de65cd2fe5b6e34bc51d0fe4d29c","up":true},{"one":"d6ffb7fd2668e9b7b133bd9144156f4736191ef0d6e72b072759782d83931f22","other":"6e5c213a2db57eaf2e1e1acc341c72efab89b0e42b6cd18db4f99ac1af151d65","up":true},{"one":"2459fe9250b3311c86530d00b7a9b8ba57b1b5151c126262e70c55d1e8d37924","other":"372d47374a57d18cf134a1f8fc2d2fc10dfacfc0be9ed883183a349c896b3793","up":true},{"one":"957d8a9b412b6f4cd151cbc07b8d74d949880ae665c545debb18181389c99ee6","other":"ea60ef7cb3f2166a5c8e286c885984943a2ea5aff4730015be6a15031040cecf","up":true},{"one":"a085045c335ce2e47dbdfeb1adb62ce6c3bed36a93cf3448c45757a1a88e295d","other":"38ab3d7bdfb293b88122404cb7c50b5fb890ce7664c075da95585557a430c403","up":true},{"one":"db088103f3b6f2c784d76ecd99c8b4a77fd39bb39c72ddfd91c99c1a9dd3b75b","other":"e0ea575d0e2efa28bc51f49d1e2c24196a196da3b3196f3a5a26a5e310809af5","up":true},{"one":"ad0d0dc5d4114ee4482d6c9bd4e46683327abf2b92df0d242d79019963876668","other":"9a9230b3f7f386520821dee78ebe92e8c64a4f6a50f2639327c62e45cab40563","up":true},{"one":"67288f84ada7778858139c74917b22ae698ed43df49a6530a566648f074ede46","other":"f5c4d28df5973ec0292221a875e8446323f339409d93f0f7385990126908a3c3","up":true},{"one":"e0ea575d0e2efa28bc51f49d1e2c24196a196da3b3196f3a5a26a5e310809af5","other":"cdcd165721f6851f361fad0b3ba88c8870be9ad6d6b8cbcecc7c89e1068d979a","up":true},{"one":"ea0e1dd41fe042b09f273c98f02128949cf5561d20dc04b3d423961efed52327","other":"1be4348ec5670cdc4f164d77b1356e7910b6d1be4a9b720e549d02e5482a9e78","up":true},{"one":"c8e5a1b4533dd0de12acee4d31369f39785178568718b93bbc321ec83e0714f0","other":"06b95f1bac76ca4925d509b06216f2113ac5dcf051ef5aa0a320ae64069e0b6d","up":true},{"one":"6c82fdabd09e0e9d0fc507613a05951c02b2953d763a062a5f32aaf5cc477c19","other":"1be4348ec5670cdc4f164d77b1356e7910b6d1be4a9b720e549d02e5482a9e78","up":true},{"one":"b381e75e52e4cdd168056245f82d3a1747b67f400eb40eb12036b73ee7fe21e5","other":"ca036d1ef9e6ce3654f2d769f16926aa14957193586426489e15539dfa8f7763","up":true},{"one":"41b9ee7ad19698e97589b059ad3333cb64f02c16006d94fb3d0bad7ced8ff238","other":"018adc613f78d6ec876274f821251fd049eb3651646cd69e27efe211fe88d936","up":true},{"one":"5abc96f4fa78812db6fb710fd424dd474145f7e5d00b4cedc5373b4c52f42cf5","other":"57764522162620c1ad0b166a9c43772255d0cc01e49f2122ef09db046804a570","up":true},{"one":"57764522162620c1ad0b166a9c43772255d0cc01e49f2122ef09db046804a570","other":"0ab9845c2890b0a64a3e5932241245e00b817b788094f9ee48f86f80b7264fea","up":true},{"one":"b2b9ac0f4db58886597af7b19d6150498ac8ad7c804671628aa34384b8fe505e","other":"67288f84ada7778858139c74917b22ae698ed43df49a6530a566648f074ede46","up":true},{"one":"8b76194f129308324c7d0066530e02cac2410ee0ba952822f0ec866e12461e44","other":"a75abd0dce5a488b7e06f91fab7a92ec428ab21bde9372c9e8fa489f48e7b3fe","up":true},{"one":"9d3c79e4a0ac4e5b95aa32545f3b8d86f74594faa237d5c2566cf02fbd60b11a","other":"2a22dbee71a0ef27c840221db4a592d6dc8f171afed865ff814a37d633a3eaa9","up":true},{"one":"06b95f1bac76ca4925d509b06216f2113ac5dcf051ef5aa0a320ae64069e0b6d","other":"1be4348ec5670cdc4f164d77b1356e7910b6d1be4a9b720e549d02e5482a9e78","up":true},{"one":"6ecb11fc5acc16ecd70351410fa18ec44a2a83d9e778cf25b85a7535493456b7","other":"e0b1c4eb5b5b4dfc22344ee65cb9716cecb38dcc80099793f20641884eae4854","up":true},{"one":"b8e1a80d91216fd5f8bc3f7413caf68ade7f124354d44fe7bd155a089134a70a","other":"2434c63e7f28b83e7feede7fe68ea99b989f8534f64d63b046733e2f474538f5","up":true},{"one":"03907380afcd52238f3d84a8dee3df599c7f2f9b90fbc1271ee88bdb52acbd58","other":"1be4348ec5670cdc4f164d77b1356e7910b6d1be4a9b720e549d02e5482a9e78","up":true},{"one":"7dc5e8d8180c1bc7ebbee11a47fc96e8fe8b2d71c30cbc4aa1cf99e8eb6afcac","other":"e0ea575d0e2efa28bc51f49d1e2c24196a196da3b3196f3a5a26a5e310809af5","up":true},{"one":"aebd6135d10252b07f891b3a7330903faf13d409c4f7108630715fa0754f938e","other":"a7a61804d270ed6c27a4b1e8a634c30d7cdbaf644a1c67cbc6b08cd849a711db","up":true},{"one":"39dbd5462c90dac75f49d9af7996845943bbe929754ef8125eee7f5a763e9def","other":"895bdcd200cc4d7ec5c24f1722d0a8ebedda78b78cdf1ccc8c22a981980f5786","up":true},{"one":"e16b12c708bc5e0545009daed44733c52d7450ccc797d158dd41a3bc9507b6be","other":"26d1af1fbee6541a363ea7707825e37da028142f00779116560ad20f1de18e7b","up":true},{"one":"6c029114a9f73d69a42e591cf2d13107eff038d3eda8abb0242d9d6d169f05c7","other":"cfbb9ea682becadeab10bbd080ba8e93510085a87ac519e434964faa222fc275","up":true},{"one":"6c029114a9f73d69a42e591cf2d13107eff038d3eda8abb0242d9d6d169f05c7","other":"dfaeebc8e29c6a8f851b12b80cf42567cd2a43e35d977305a3c10e51bf41170a","up":true},{"one":"7639f9a66e8ff70f554c346faa25f78140957c295b748fc42a12df7972f4fcc6","other":"26d1af1fbee6541a363ea7707825e37da028142f00779116560ad20f1de18e7b","up":true},{"one":"dc97c1a0019b482a048b8d15941dfe4c3c1a3443d9b2d7b4046370bc84a7e56f","other":"558eb021744be19383be9ac91b9f77e07479e0eb25576bd32a3afaa94c231178","up":true},{"one":"89c883d6a85472bda328667e3fd805c70876bc582ca6763ab97ae636b1772be4","other":"39dbd5462c90dac75f49d9af7996845943bbe929754ef8125eee7f5a763e9def","up":true},{"one":"7355fab10584e4312f5cb5c3c826e7f9c14da74d62d07d0a8007ce9c6e995be9","other":"372d47374a57d18cf134a1f8fc2d2fc10dfacfc0be9ed883183a349c896b3793","up":true},{"one":"d6ffb7fd2668e9b7b133bd9144156f4736191ef0d6e72b072759782d83931f22","other":"73b8d1840d0a8ffe69752ec96f8fddecb0e22726c87982d572ca9acc1c9cdbfc","up":true},{"one":"b381e75e52e4cdd168056245f82d3a1747b67f400eb40eb12036b73ee7fe21e5","other":"cbc5d42951bc6e187296b5f8ce4d04e472e26670a62851f39d65f31c50865f6a","up":true},{"one":"cec3c01c147b34f25104ddd0b25076cef63ac224eada9d9f5a00b8513331354f","other":"06b95f1bac76ca4925d509b06216f2113ac5dcf051ef5aa0a320ae64069e0b6d","up":true},{"one":"4167946de250b013e1be16ee84bfe2ccaae83e699e618b38f31016c4e431e6ba","other":"4cd0f38e52a508f81cf95e1370c994aea2d7a49a2a08e3e054f53629a6619410","up":true},{"one":"621076ce6b82e70c90a4adf235aa6f71b116e302dd6b15dcae07f4a816012455","other":"734e029ed25485edd49b93dd9e85b6e7657f860e4ded4bc8a5094f512ae5836b","up":true},{"one":"e77f6aa9e3dfcce0a2e5db794703224249aba60595075b2df9a5b0b30855cf46","other":"b8411f198fd658c5a2028835c0af3342145839c06c8a4f382d9f9de485d46c08","up":true},{"one":"a085045c335ce2e47dbdfeb1adb62ce6c3bed36a93cf3448c45757a1a88e295d","other":"3cb1b4069727dc323a687cab4ca2764f6415450488706f1b97c5cb8ca46346ff","up":true},{"one":"9d3c79e4a0ac4e5b95aa32545f3b8d86f74594faa237d5c2566cf02fbd60b11a","other":"b92a71a4fc371e0596538a7fb2a33e85329c39c4409c99798d9318bc263a04a1","up":true},{"one":"757a557424c33ad89efd8185ec18d71c025830ecb2aed951e33c8c8d986d5933","other":"f410d4ac9b748c24fa0d48c3053bb1cea8a67d0bcc4e5fcbdb261c0c7522cc34","up":true},{"one":"8b76194f129308324c7d0066530e02cac2410ee0ba952822f0ec866e12461e44","other":"a2babe49410ae007bc41ff2b7deaf709ed849e2f69666ce5aae76a3b71f47081","up":true},{"one":"82f034db88fd26b47c26b95c3f87a1f454ffe4526ae86beb2bb1d8f2c218c25c","other":"b92a71a4fc371e0596538a7fb2a33e85329c39c4409c99798d9318bc263a04a1","up":true},{"one":"c8e5a1b4533dd0de12acee4d31369f39785178568718b93bbc321ec83e0714f0","other":"0506e949748b62da1d36b663df7d6a7e76027f72ced5d52f74677fb31d7e1505","up":true},{"one":"6c029114a9f73d69a42e591cf2d13107eff038d3eda8abb0242d9d6d169f05c7","other":"f410d4ac9b748c24fa0d48c3053bb1cea8a67d0bcc4e5fcbdb261c0c7522cc34","up":true},{"one":"7b9242137f8cc2bec7b3e0003fd93026921ceb10dfadbbd5b6aa64d61a74f35e","other":"8cf957bf95a629c60c31dbcfe75ecca149a81c761f8b34858b04f8318e5c74bd","up":true},{"one":"ca036d1ef9e6ce3654f2d769f16926aa14957193586426489e15539dfa8f7763","other":"db088103f3b6f2c784d76ecd99c8b4a77fd39bb39c72ddfd91c99c1a9dd3b75b","up":true},{"one":"a75abd0dce5a488b7e06f91fab7a92ec428ab21bde9372c9e8fa489f48e7b3fe","other":"dc97c1a0019b482a048b8d15941dfe4c3c1a3443d9b2d7b4046370bc84a7e56f","up":true},{"one":"7355fab10584e4312f5cb5c3c826e7f9c14da74d62d07d0a8007ce9c6e995be9","other":"7fbc1843e2222e3c8e35a3215d1bbb4d5457d8b9ed33749e07e22f25ba9ee576","up":true},{"one":"734e029ed25485edd49b93dd9e85b6e7657f860e4ded4bc8a5094f512ae5836b","other":"73b8d1840d0a8ffe69752ec96f8fddecb0e22726c87982d572ca9acc1c9cdbfc","up":true},{"one":"7639f9a66e8ff70f554c346faa25f78140957c295b748fc42a12df7972f4fcc6","other":"3ee4b20c047e701b58c06fcc8160364bd29573f61f4d9f1935d77ac29f6a1e86","up":true},{"one":"57764522162620c1ad0b166a9c43772255d0cc01e49f2122ef09db046804a570","other":"0ff67b0e9ec6509c7786495b7b3ddb176b4f8221ff300f409f00a3d389e8874c","up":true},{"one":"db088103f3b6f2c784d76ecd99c8b4a77fd39bb39c72ddfd91c99c1a9dd3b75b","other":"e55d8cdb7e7940b11929e7e5c949ef6beb7998e5180a1f0a3c0bf61aef39f1b8","up":true},{"one":"e16b12c708bc5e0545009daed44733c52d7450ccc797d158dd41a3bc9507b6be","other":"e0ea575d0e2efa28bc51f49d1e2c24196a196da3b3196f3a5a26a5e310809af5","up":true},{"one":"895bdcd200cc4d7ec5c24f1722d0a8ebedda78b78cdf1ccc8c22a981980f5786","other":"8be461203f5ebb5721348f537b37d768f7bd359af3e18d1f7e9af2f901c49845","up":true},{"one":"109ef17c890104bfc5a4897d526a0afaa8c991c9d213616032f3058d0feb7f00","other":"042788d5b72cb84a375565d120d239a2b14fdf38b3f5f992284d78535077148a","up":true},{"one":"6ecb11fc5acc16ecd70351410fa18ec44a2a83d9e778cf25b85a7535493456b7","other":"e16b12c708bc5e0545009daed44733c52d7450ccc797d158dd41a3bc9507b6be","up":true},{"one":"7fbc1843e2222e3c8e35a3215d1bbb4d5457d8b9ed33749e07e22f25ba9ee576","other":"db088103f3b6f2c784d76ecd99c8b4a77fd39bb39c72ddfd91c99c1a9dd3b75b","up":true},{"one":"9d3c79e4a0ac4e5b95aa32545f3b8d86f74594faa237d5c2566cf02fbd60b11a","other":"b8411f198fd658c5a2028835c0af3342145839c06c8a4f382d9f9de485d46c08","up":true},{"one":"558eb021744be19383be9ac91b9f77e07479e0eb25576bd32a3afaa94c231178","other":"6ecb11fc5acc16ecd70351410fa18ec44a2a83d9e778cf25b85a7535493456b7","up":true},{"one":"6e5c213a2db57eaf2e1e1acc341c72efab89b0e42b6cd18db4f99ac1af151d65","other":"7f87da7ee55b4c8c8f9d55411ff88d3a0b63bfee6a516917d49fa6273fb5b86a","up":true},{"one":"57764522162620c1ad0b166a9c43772255d0cc01e49f2122ef09db046804a570","other":"026d2e41b82d506da685a30cce7cc5772f6c1e167b7d557e0531fb9b79dd4ff2","up":true},{"one":"e16b12c708bc5e0545009daed44733c52d7450ccc797d158dd41a3bc9507b6be","other":"021811a6757bdcdd2fa0fb68401dfe009d5a8e129958cd304fb42cf51dc5d1d3","up":true},{"one":"c3a1b301bf187fd8326831197d93a0266ac0cc8287b9008631240e2bec9cf337","other":"d2245f0679b436faabc0164e0b85e02e2effbad306e8229b555524a5e6d1a5f9","up":true},{"one":"82f034db88fd26b47c26b95c3f87a1f454ffe4526ae86beb2bb1d8f2c218c25c","other":"b8411f198fd658c5a2028835c0af3342145839c06c8a4f382d9f9de485d46c08","up":true},{"one":"ca036d1ef9e6ce3654f2d769f16926aa14957193586426489e15539dfa8f7763","other":"dfaeebc8e29c6a8f851b12b80cf42567cd2a43e35d977305a3c10e51bf41170a","up":true},{"one":"b381e75e52e4cdd168056245f82d3a1747b67f400eb40eb12036b73ee7fe21e5","other":"ce99e9d37111c52e929b187fe201790b1a555dfb8b6b6de54e94df7cc2d43fd4","up":true},{"one":"ea60ef7cb3f2166a5c8e286c885984943a2ea5aff4730015be6a15031040cecf","other":"0ab9845c2890b0a64a3e5932241245e00b817b788094f9ee48f86f80b7264fea","up":true},{"one":"957d8a9b412b6f4cd151cbc07b8d74d949880ae665c545debb18181389c99ee6","other":"ea0e1dd41fe042b09f273c98f02128949cf5561d20dc04b3d423961efed52327","up":true},{"one":"ae67fae4990da61ca89221c5b1675c992babb4d715b59939e47bd1491b3bf1f4","other":"39dbd5462c90dac75f49d9af7996845943bbe929754ef8125eee7f5a763e9def","up":true},{"one":"c8e5a1b4533dd0de12acee4d31369f39785178568718b93bbc321ec83e0714f0","other":"042788d5b72cb84a375565d120d239a2b14fdf38b3f5f992284d78535077148a","up":true},{"one":"a085045c335ce2e47dbdfeb1adb62ce6c3bed36a93cf3448c45757a1a88e295d","other":"2434c63e7f28b83e7feede7fe68ea99b989f8534f64d63b046733e2f474538f5","up":true},{"one":"a085045c335ce2e47dbdfeb1adb62ce6c3bed36a93cf3448c45757a1a88e295d","other":"3e56d4533ec14f6656e1eb25fb35dad47c9db479f667a6b6fe9a3aa8c12e982e","up":true},{"one":"dfaeebc8e29c6a8f851b12b80cf42567cd2a43e35d977305a3c10e51bf41170a","other":"ed32d74d9be0649de1eb26b9915137fe46ec890c656c96be52e966ab6e2ed260","up":true},{"one":"4cd0f38e52a508f81cf95e1370c994aea2d7a49a2a08e3e054f53629a6619410","other":"41b9ee7ad19698e97589b059ad3333cb64f02c16006d94fb3d0bad7ced8ff238","up":true},{"one":"cfbb9ea682becadeab10bbd080ba8e93510085a87ac519e434964faa222fc275","other":"e0ea575d0e2efa28bc51f49d1e2c24196a196da3b3196f3a5a26a5e310809af5","up":true},{"one":"4a1811dd9febde1801a604ad81de84a2d15366d0b5c330f30f3398da0d107824","other":"6d601952793589bc6b57340c451a6abf02ea2c16637e910eed04cde6eddfe17a","up":true},{"one":"a2babe49410ae007bc41ff2b7deaf709ed849e2f69666ce5aae76a3b71f47081","other":"0bcf8a8ab0065ca8c85b8b6641f4c6e0b0de60e79ef32ebf6ff8f109ac4e1d70","up":true},{"one":"7355fab10584e4312f5cb5c3c826e7f9c14da74d62d07d0a8007ce9c6e995be9","other":"39dbd5462c90dac75f49d9af7996845943bbe929754ef8125eee7f5a763e9def","up":true},{"one":"7f87da7ee55b4c8c8f9d55411ff88d3a0b63bfee6a516917d49fa6273fb5b86a","other":"6d601952793589bc6b57340c451a6abf02ea2c16637e910eed04cde6eddfe17a","up":true},{"one":"9ee7b3e06b453615cbd8737cb74515b150f518f1a2eaa2db90e54708dd161b7d","other":"b2b9ac0f4db58886597af7b19d6150498ac8ad7c804671628aa34384b8fe505e","up":true},{"one":"ebca518e5146f49ac75bcaa8add2ef4d1d22c5cfd2e2326c6b41826d45ce55ae","other":"f36120ff250b9e7164e96021479332054f67de65cd2fe5b6e34bc51d0fe4d29c","up":true},{"one":"82f034db88fd26b47c26b95c3f87a1f454ffe4526ae86beb2bb1d8f2c218c25c","other":"b381e75e52e4cdd168056245f82d3a1747b67f400eb40eb12036b73ee7fe21e5","up":true},{"one":"9d3c79e4a0ac4e5b95aa32545f3b8d86f74594faa237d5c2566cf02fbd60b11a","other":"ad0d0dc5d4114ee4482d6c9bd4e46683327abf2b92df0d242d79019963876668","up":true},{"one":"7639f9a66e8ff70f554c346faa25f78140957c295b748fc42a12df7972f4fcc6","other":"2434c63e7f28b83e7feede7fe68ea99b989f8534f64d63b046733e2f474538f5","up":true},{"one":"7dc5e8d8180c1bc7ebbee11a47fc96e8fe8b2d71c30cbc4aa1cf99e8eb6afcac","other":"d6ffb7fd2668e9b7b133bd9144156f4736191ef0d6e72b072759782d83931f22","up":true},{"one":"b2b9ac0f4db58886597af7b19d6150498ac8ad7c804671628aa34384b8fe505e","other":"6742cca1b7783fcbed8d0b340508f93cc4dfaca8ff3f13fd59354486c4d62993","up":true},{"one":"895bdcd200cc4d7ec5c24f1722d0a8ebedda78b78cdf1ccc8c22a981980f5786","other":"dfaeebc8e29c6a8f851b12b80cf42567cd2a43e35d977305a3c10e51bf41170a","up":true},{"one":"86ca1078dae40f23ae1b3ac47397460d9ec0bf243a0de372b405381d6722fcb2","other":"cec3c01c147b34f25104ddd0b25076cef63ac224eada9d9f5a00b8513331354f","up":true},{"one":"ca036d1ef9e6ce3654f2d769f16926aa14957193586426489e15539dfa8f7763","other":"d2245f0679b436faabc0164e0b85e02e2effbad306e8229b555524a5e6d1a5f9","up":true},{"one":"a085045c335ce2e47dbdfeb1adb62ce6c3bed36a93cf3448c45757a1a88e295d","other":"ae67fae4990da61ca89221c5b1675c992babb4d715b59939e47bd1491b3bf1f4","up":true},{"one":"91eba9f9c8f2929d38f43a0c7efa809c0d2d59a31cbf2760c90e73d20266d528","other":"109ef17c890104bfc5a4897d526a0afaa8c991c9d213616032f3058d0feb7f00","up":true},{"one":"558eb021744be19383be9ac91b9f77e07479e0eb25576bd32a3afaa94c231178","other":"47c3e0dfbbfcebeece78865c8c989577360cd9cc46a3b43f4b7b01ed14dc30e6","up":true},{"one":"b8e1a80d91216fd5f8bc3f7413caf68ade7f124354d44fe7bd155a089134a70a","other":"e77f6aa9e3dfcce0a2e5db794703224249aba60595075b2df9a5b0b30855cf46","up":true},{"one":"78cbc19a24d095ab7858849058c65c061c52289b91ddd92cee34bed98aee4a59","other":"026d2e41b82d506da685a30cce7cc5772f6c1e167b7d557e0531fb9b79dd4ff2","up":true},{"one":"7355fab10584e4312f5cb5c3c826e7f9c14da74d62d07d0a8007ce9c6e995be9","other":"38ab3d7bdfb293b88122404cb7c50b5fb890ce7664c075da95585557a430c403","up":true},{"one":"1be4348ec5670cdc4f164d77b1356e7910b6d1be4a9b720e549d02e5482a9e78","other":"0ff67b0e9ec6509c7786495b7b3ddb176b4f8221ff300f409f00a3d389e8874c","up":true},{"one":"7f87da7ee55b4c8c8f9d55411ff88d3a0b63bfee6a516917d49fa6273fb5b86a","other":"026d2e41b82d506da685a30cce7cc5772f6c1e167b7d557e0531fb9b79dd4ff2","up":true},{"one":"89c883d6a85472bda328667e3fd805c70876bc582ca6763ab97ae636b1772be4","other":"018adc613f78d6ec876274f821251fd049eb3651646cd69e27efe211fe88d936","up":true},{"one":"cfbb9ea682becadeab10bbd080ba8e93510085a87ac519e434964faa222fc275","other":"6d601952793589bc6b57340c451a6abf02ea2c16637e910eed04cde6eddfe17a","up":true},{"one":"7fbc1843e2222e3c8e35a3215d1bbb4d5457d8b9ed33749e07e22f25ba9ee576","other":"d0f398969480f3df3587f6d47546ff1261cad4d2e9c26ff3077e35ae1b26153e","up":true},{"one":"9d3c79e4a0ac4e5b95aa32545f3b8d86f74594faa237d5c2566cf02fbd60b11a","other":"b70e96f01ac8947d2de6320412ae3310316caba65c27108ad16b2f2004255be4","up":true},{"one":"9e02c5384602a54e900cfa46d5987b77f16e74cba745ac850fcada01c7af9004","other":"ad0d0dc5d4114ee4482d6c9bd4e46683327abf2b92df0d242d79019963876668","up":true},{"one":"0506e949748b62da1d36b663df7d6a7e76027f72ced5d52f74677fb31d7e1505","other":"cec3c01c147b34f25104ddd0b25076cef63ac224eada9d9f5a00b8513331354f","up":true},{"one":"db088103f3b6f2c784d76ecd99c8b4a77fd39bb39c72ddfd91c99c1a9dd3b75b","other":"e77f6aa9e3dfcce0a2e5db794703224249aba60595075b2df9a5b0b30855cf46","up":true},{"one":"1929a84bcd64bf002d0afb16249466c5b660123174a1fc1bf881913f8c87d1fd","other":"018adc613f78d6ec876274f821251fd049eb3651646cd69e27efe211fe88d936","up":true},{"one":"957d8a9b412b6f4cd151cbc07b8d74d949880ae665c545debb18181389c99ee6","other":"ebca518e5146f49ac75bcaa8add2ef4d1d22c5cfd2e2326c6b41826d45ce55ae","up":true},{"one":"ca036d1ef9e6ce3654f2d769f16926aa14957193586426489e15539dfa8f7763","other":"698247d103a8925d8bb4c56a3056e49c5efc595fced1c89d49943bb9ba01f394","up":true},{"one":"5abc96f4fa78812db6fb710fd424dd474145f7e5d00b4cedc5373b4c52f42cf5","other":"558eb021744be19383be9ac91b9f77e07479e0eb25576bd32a3afaa94c231178","up":true},{"one":"c8e5a1b4533dd0de12acee4d31369f39785178568718b93bbc321ec83e0714f0","other":"57764522162620c1ad0b166a9c43772255d0cc01e49f2122ef09db046804a570","up":true},{"one":"a3205c1c4f9b72814f0db68e888e3c7ef88f27c681ed0d731dde5f0999f92ccc","other":"a75abd0dce5a488b7e06f91fab7a92ec428ab21bde9372c9e8fa489f48e7b3fe","up":true},{"one":"4167946de250b013e1be16ee84bfe2ccaae83e699e618b38f31016c4e431e6ba","other":"48b614958a8692780ef5bd5c95e0db4ff67deb4de0dcbb878ca4479bfb86957e","up":true},{"one":"a75abd0dce5a488b7e06f91fab7a92ec428ab21bde9372c9e8fa489f48e7b3fe","other":"d6ffb7fd2668e9b7b133bd9144156f4736191ef0d6e72b072759782d83931f22","up":true},{"one":"57764522162620c1ad0b166a9c43772255d0cc01e49f2122ef09db046804a570","other":"3ee4b20c047e701b58c06fcc8160364bd29573f61f4d9f1935d77ac29f6a1e86","up":true},{"one":"6c82fdabd09e0e9d0fc507613a05951c02b2953d763a062a5f32aaf5cc477c19","other":"027fb496438782583f78fb76999336eed7fb672a9c9ea50d04df580e6eb21377","up":true},{"one":"d6ffb7fd2668e9b7b133bd9144156f4736191ef0d6e72b072759782d83931f22","other":"d2245f0679b436faabc0164e0b85e02e2effbad306e8229b555524a5e6d1a5f9","up":true},{"one":"aebd6135d10252b07f891b3a7330903faf13d409c4f7108630715fa0754f938e","other":"a2babe49410ae007bc41ff2b7deaf709ed849e2f69666ce5aae76a3b71f47081","up":true},{"one":"6ecb11fc5acc16ecd70351410fa18ec44a2a83d9e778cf25b85a7535493456b7","other":"ed32d74d9be0649de1eb26b9915137fe46ec890c656c96be52e966ab6e2ed260","up":true},{"one":"41b9ee7ad19698e97589b059ad3333cb64f02c16006d94fb3d0bad7ced8ff238","other":"06b95f1bac76ca4925d509b06216f2113ac5dcf051ef5aa0a320ae64069e0b6d","up":true},{"one":"895bdcd200cc4d7ec5c24f1722d0a8ebedda78b78cdf1ccc8c22a981980f5786","other":"dc97c1a0019b482a048b8d15941dfe4c3c1a3443d9b2d7b4046370bc84a7e56f","up":true},{"one":"afa3de5cebc9f96cf20a35058f4856fe43b48ac59cf8e46565f194f438622a52","other":"e55d8cdb7e7940b11929e7e5c949ef6beb7998e5180a1f0a3c0bf61aef39f1b8","up":true},{"one":"645b4e6b36fc1928725f627aeed278f46c5a7d6b0fff7ccff55a0468d47b23e8","other":"6d601952793589bc6b57340c451a6abf02ea2c16637e910eed04cde6eddfe17a","up":true},{"one":"667ef042e9dae18694581e0404c3d87a09800e8b42173d26571c3bf97e29a372","other":"dc97c1a0019b482a048b8d15941dfe4c3c1a3443d9b2d7b4046370bc84a7e56f","up":true},{"one":"f36084048bf0ff985a77f5183796f7b37b7085ee6eea8bbc5fc62558854cce67","other":"698247d103a8925d8bb4c56a3056e49c5efc595fced1c89d49943bb9ba01f394","up":true},{"one":"83dc556ed36f37d06765be2554fe86eaf1ec21e2931fb22403238453bf021dfb","other":"895bdcd200cc4d7ec5c24f1722d0a8ebedda78b78cdf1ccc8c22a981980f5786","up":true},{"one":"757a557424c33ad89efd8185ec18d71c025830ecb2aed951e33c8c8d986d5933","other":"ea0e1dd41fe042b09f273c98f02128949cf5561d20dc04b3d423961efed52327","up":true},{"one":"cfbb9ea682becadeab10bbd080ba8e93510085a87ac519e434964faa222fc275","other":"7dc5e8d8180c1bc7ebbee11a47fc96e8fe8b2d71c30cbc4aa1cf99e8eb6afcac","up":true},{"one":"7639f9a66e8ff70f554c346faa25f78140957c295b748fc42a12df7972f4fcc6","other":"2459fe9250b3311c86530d00b7a9b8ba57b1b5151c126262e70c55d1e8d37924","up":true},{"one":"ed32d74d9be0649de1eb26b9915137fe46ec890c656c96be52e966ab6e2ed260","other":"7dc5e8d8180c1bc7ebbee11a47fc96e8fe8b2d71c30cbc4aa1cf99e8eb6afcac","up":true},{"one":"9d3c79e4a0ac4e5b95aa32545f3b8d86f74594faa237d5c2566cf02fbd60b11a","other":"018adc613f78d6ec876274f821251fd049eb3651646cd69e27efe211fe88d936","up":true},{"one":"ea60ef7cb3f2166a5c8e286c885984943a2ea5aff4730015be6a15031040cecf","other":"372d47374a57d18cf134a1f8fc2d2fc10dfacfc0be9ed883183a349c896b3793","up":true},{"one":"8be461203f5ebb5721348f537b37d768f7bd359af3e18d1f7e9af2f901c49845","other":"7b9242137f8cc2bec7b3e0003fd93026921ceb10dfadbbd5b6aa64d61a74f35e","up":true},{"one":"b2b9ac0f4db58886597af7b19d6150498ac8ad7c804671628aa34384b8fe505e","other":"6d601952793589bc6b57340c451a6abf02ea2c16637e910eed04cde6eddfe17a","up":true},{"one":"89c883d6a85472bda328667e3fd805c70876bc582ca6763ab97ae636b1772be4","other":"f5c4d28df5973ec0292221a875e8446323f339409d93f0f7385990126908a3c3","up":true},{"one":"86ca1078dae40f23ae1b3ac47397460d9ec0bf243a0de372b405381d6722fcb2","other":"c8e5a1b4533dd0de12acee4d31369f39785178568718b93bbc321ec83e0714f0","up":true},{"one":"7fbc1843e2222e3c8e35a3215d1bbb4d5457d8b9ed33749e07e22f25ba9ee576","other":"d2245f0679b436faabc0164e0b85e02e2effbad306e8229b555524a5e6d1a5f9","up":true},{"one":"1929a84bcd64bf002d0afb16249466c5b660123174a1fc1bf881913f8c87d1fd","other":"026d2e41b82d506da685a30cce7cc5772f6c1e167b7d557e0531fb9b79dd4ff2","up":true},{"one":"92a1501ed41e29bb7dd8eb4b4acecae983f4c7c83f39895cd68f7810b645f1dd","other":"e77f6aa9e3dfcce0a2e5db794703224249aba60595075b2df9a5b0b30855cf46","up":true},{"one":"3e56d4533ec14f6656e1eb25fb35dad47c9db479f667a6b6fe9a3aa8c12e982e","other":"ea60ef7cb3f2166a5c8e286c885984943a2ea5aff4730015be6a15031040cecf","up":true},{"one":"6d601952793589bc6b57340c451a6abf02ea2c16637e910eed04cde6eddfe17a","other":"cdcd165721f6851f361fad0b3ba88c8870be9ad6d6b8cbcecc7c89e1068d979a","up":true},{"one":"6c029114a9f73d69a42e591cf2d13107eff038d3eda8abb0242d9d6d169f05c7","other":"5abc96f4fa78812db6fb710fd424dd474145f7e5d00b4cedc5373b4c52f42cf5","up":true},{"one":"67288f84ada7778858139c74917b22ae698ed43df49a6530a566648f074ede46","other":"dc97c1a0019b482a048b8d15941dfe4c3c1a3443d9b2d7b4046370bc84a7e56f","up":true},{"one":"9e02c5384602a54e900cfa46d5987b77f16e74cba745ac850fcada01c7af9004","other":"7b9242137f8cc2bec7b3e0003fd93026921ceb10dfadbbd5b6aa64d61a74f35e","up":true},{"one":"ebca518e5146f49ac75bcaa8add2ef4d1d22c5cfd2e2326c6b41826d45ce55ae","other":"e0b1c4eb5b5b4dfc22344ee65cb9716cecb38dcc80099793f20641884eae4854","up":true},{"one":"b486ce31ce880db3aaa17a0ac2c2f3554b6fe71f9c051edb572974342af4adb9","other":"6c82fdabd09e0e9d0fc507613a05951c02b2953d763a062a5f32aaf5cc477c19","up":true},{"one":"dfaeebc8e29c6a8f851b12b80cf42567cd2a43e35d977305a3c10e51bf41170a","other":"e16b12c708bc5e0545009daed44733c52d7450ccc797d158dd41a3bc9507b6be","up":true},{"one":"109ef17c890104bfc5a4897d526a0afaa8c991c9d213616032f3058d0feb7f00","other":"0506e949748b62da1d36b663df7d6a7e76027f72ced5d52f74677fb31d7e1505","up":true},{"one":"021811a6757bdcdd2fa0fb68401dfe009d5a8e129958cd304fb42cf51dc5d1d3","other":"b486ce31ce880db3aaa17a0ac2c2f3554b6fe71f9c051edb572974342af4adb9","up":true},{"one":"f36084048bf0ff985a77f5183796f7b37b7085ee6eea8bbc5fc62558854cce67","other":"f74ecde0bbaa7b6521fb205b5ab9ea637909277f6e1ee1d3490f5cd01d0f7216","up":true},{"one":"a085045c335ce2e47dbdfeb1adb62ce6c3bed36a93cf3448c45757a1a88e295d","other":"3ee4b20c047e701b58c06fcc8160364bd29573f61f4d9f1935d77ac29f6a1e86","up":true},{"one":"6ecb11fc5acc16ecd70351410fa18ec44a2a83d9e778cf25b85a7535493456b7","other":"f5c4d28df5973ec0292221a875e8446323f339409d93f0f7385990126908a3c3","up":true},{"one":"82f034db88fd26b47c26b95c3f87a1f454ffe4526ae86beb2bb1d8f2c218c25c","other":"cec3c01c147b34f25104ddd0b25076cef63ac224eada9d9f5a00b8513331354f","up":true},{"one":"027fb496438782583f78fb76999336eed7fb672a9c9ea50d04df580e6eb21377","other":"962676818c17fae1ffc52fc29318c44f9b8c980afd6d3e98217b4088d568a808","up":true},{"one":"cfbb9ea682becadeab10bbd080ba8e93510085a87ac519e434964faa222fc275","other":"b381e75e52e4cdd168056245f82d3a1747b67f400eb40eb12036b73ee7fe21e5","up":true},{"one":"dc97c1a0019b482a048b8d15941dfe4c3c1a3443d9b2d7b4046370bc84a7e56f","other":"47c3e0dfbbfcebeece78865c8c989577360cd9cc46a3b43f4b7b01ed14dc30e6","up":true},{"one":"db088103f3b6f2c784d76ecd99c8b4a77fd39bb39c72ddfd91c99c1a9dd3b75b","other":"edc8794153fb517085d27a83a4b00e8c3b37f22d2242b842cb2fab66764de9fe","up":true},{"one":"7639f9a66e8ff70f554c346faa25f78140957c295b748fc42a12df7972f4fcc6","other":"13bc64535d3ae495098e4ac6b30a91d1804dab0ab79944f2c6ac53c9bccdf62d","up":true},{"one":"83dc556ed36f37d06765be2554fe86eaf1ec21e2931fb22403238453bf021dfb","other":"018adc613f78d6ec876274f821251fd049eb3651646cd69e27efe211fe88d936","up":true},{"one":"b381e75e52e4cdd168056245f82d3a1747b67f400eb40eb12036b73ee7fe21e5","other":"cec3c01c147b34f25104ddd0b25076cef63ac224eada9d9f5a00b8513331354f","up":true},{"one":"edc8794153fb517085d27a83a4b00e8c3b37f22d2242b842cb2fab66764de9fe","other":"5d608e66a17442091111cb472723fe3aea1f2baecaa546b57d49507c63a61cda","up":true},{"one":"91eba9f9c8f2929d38f43a0c7efa809c0d2d59a31cbf2760c90e73d20266d528","other":"7b9242137f8cc2bec7b3e0003fd93026921ceb10dfadbbd5b6aa64d61a74f35e","up":true},{"one":"7cf4838a7c83a736ce59cfa1b974674a0185dbe17a8f3cd29794a3bbe814adee","other":"757a557424c33ad89efd8185ec18d71c025830ecb2aed951e33c8c8d986d5933","up":true},{"one":"f410d4ac9b748c24fa0d48c3053bb1cea8a67d0bcc4e5fcbdb261c0c7522cc34","other":"698247d103a8925d8bb4c56a3056e49c5efc595fced1c89d49943bb9ba01f394","up":true},{"one":"8be461203f5ebb5721348f537b37d768f7bd359af3e18d1f7e9af2f901c49845","other":"ea60ef7cb3f2166a5c8e286c885984943a2ea5aff4730015be6a15031040cecf","up":true},{"one":"afa3de5cebc9f96cf20a35058f4856fe43b48ac59cf8e46565f194f438622a52","other":"b486ce31ce880db3aaa17a0ac2c2f3554b6fe71f9c051edb572974342af4adb9","up":true},{"one":"757a557424c33ad89efd8185ec18d71c025830ecb2aed951e33c8c8d986d5933","other":"ed32d74d9be0649de1eb26b9915137fe46ec890c656c96be52e966ab6e2ed260","up":true},{"one":"b70e96f01ac8947d2de6320412ae3310316caba65c27108ad16b2f2004255be4","other":"021811a6757bdcdd2fa0fb68401dfe009d5a8e129958cd304fb42cf51dc5d1d3","up":true},{"one":"57764522162620c1ad0b166a9c43772255d0cc01e49f2122ef09db046804a570","other":"018adc613f78d6ec876274f821251fd049eb3651646cd69e27efe211fe88d936","up":true},{"one":"539df902d42dc997c6b0e24d16ad68b54c557d56b41c972a320d57632dbfbe3c","other":"667ef042e9dae18694581e0404c3d87a09800e8b42173d26571c3bf97e29a372","up":true},{"one":"48b614958a8692780ef5bd5c95e0db4ff67deb4de0dcbb878ca4479bfb86957e","other":"39dbd5462c90dac75f49d9af7996845943bbe929754ef8125eee7f5a763e9def","up":true},{"one":"9d3c79e4a0ac4e5b95aa32545f3b8d86f74594faa237d5c2566cf02fbd60b11a","other":"b16dcdf1ff1a56d49e374531d9885d59c1bcfbb628604520d9b1d84662edb9ca","up":true},{"one":"67288f84ada7778858139c74917b22ae698ed43df49a6530a566648f074ede46","other":"d6ffb7fd2668e9b7b133bd9144156f4736191ef0d6e72b072759782d83931f22","up":true},{"one":"734e029ed25485edd49b93dd9e85b6e7657f860e4ded4bc8a5094f512ae5836b","other":"645b4e6b36fc1928725f627aeed278f46c5a7d6b0fff7ccff55a0468d47b23e8","up":true},{"one":"47c3e0dfbbfcebeece78865c8c989577360cd9cc46a3b43f4b7b01ed14dc30e6","other":"018adc613f78d6ec876274f821251fd049eb3651646cd69e27efe211fe88d936","up":true},{"one":"e16b12c708bc5e0545009daed44733c52d7450ccc797d158dd41a3bc9507b6be","other":"2a22dbee71a0ef27c840221db4a592d6dc8f171afed865ff814a37d633a3eaa9","up":true},{"one":"a7a61804d270ed6c27a4b1e8a634c30d7cdbaf644a1c67cbc6b08cd849a711db","other":"b381e75e52e4cdd168056245f82d3a1747b67f400eb40eb12036b73ee7fe21e5","up":true},{"one":"a75abd0dce5a488b7e06f91fab7a92ec428ab21bde9372c9e8fa489f48e7b3fe","other":"d2245f0679b436faabc0164e0b85e02e2effbad306e8229b555524a5e6d1a5f9","up":true},{"one":"895bdcd200cc4d7ec5c24f1722d0a8ebedda78b78cdf1ccc8c22a981980f5786","other":"d2245f0679b436faabc0164e0b85e02e2effbad306e8229b555524a5e6d1a5f9","up":true},{"one":"0ab9845c2890b0a64a3e5932241245e00b817b788094f9ee48f86f80b7264fea","other":"0bcf8a8ab0065ca8c85b8b6641f4c6e0b0de60e79ef32ebf6ff8f109ac4e1d70","up":true},{"one":"d0f398969480f3df3587f6d47546ff1261cad4d2e9c26ff3077e35ae1b26153e","other":"dfaeebc8e29c6a8f851b12b80cf42567cd2a43e35d977305a3c10e51bf41170a","up":true},{"one":"9e02c5384602a54e900cfa46d5987b77f16e74cba745ac850fcada01c7af9004","other":"a3205c1c4f9b72814f0db68e888e3c7ef88f27c681ed0d731dde5f0999f92ccc","up":true},{"one":"772e4c80d128deb52adf024a0eb6fe9bbea1c83351ed93f55f490cd5e5c69260","other":"73b8d1840d0a8ffe69752ec96f8fddecb0e22726c87982d572ca9acc1c9cdbfc","up":true},{"one":"c8e5a1b4533dd0de12acee4d31369f39785178568718b93bbc321ec83e0714f0","other":"82f034db88fd26b47c26b95c3f87a1f454ffe4526ae86beb2bb1d8f2c218c25c","up":true},{"one":"698247d103a8925d8bb4c56a3056e49c5efc595fced1c89d49943bb9ba01f394","other":"f5c4d28df5973ec0292221a875e8446323f339409d93f0f7385990126908a3c3","up":true},{"one":"06b95f1bac76ca4925d509b06216f2113ac5dcf051ef5aa0a320ae64069e0b6d","other":"6c82fdabd09e0e9d0fc507613a05951c02b2953d763a062a5f32aaf5cc477c19","up":true},{"one":"89c883d6a85472bda328667e3fd805c70876bc582ca6763ab97ae636b1772be4","other":"f74ecde0bbaa7b6521fb205b5ab9ea637909277f6e1ee1d3490f5cd01d0f7216","up":true},{"one":"cfbb9ea682becadeab10bbd080ba8e93510085a87ac519e434964faa222fc275","other":"7fbc1843e2222e3c8e35a3215d1bbb4d5457d8b9ed33749e07e22f25ba9ee576","up":true},{"one":"c3a1b301bf187fd8326831197d93a0266ac0cc8287b9008631240e2bec9cf337","other":"698247d103a8925d8bb4c56a3056e49c5efc595fced1c89d49943bb9ba01f394","up":true},{"one":"5abc96f4fa78812db6fb710fd424dd474145f7e5d00b4cedc5373b4c52f42cf5","other":"667ef042e9dae18694581e0404c3d87a09800e8b42173d26571c3bf97e29a372","up":true},{"one":"5a01993ff7b4bd12fdb259e96b26a036d0cf5d4ae9c9b516be64b63acec2443a","other":"b2b9ac0f4db58886597af7b19d6150498ac8ad7c804671628aa34384b8fe505e","up":true},{"one":"6c82fdabd09e0e9d0fc507613a05951c02b2953d763a062a5f32aaf5cc477c19","other":"018adc613f78d6ec876274f821251fd049eb3651646cd69e27efe211fe88d936","up":true},{"one":"957d8a9b412b6f4cd151cbc07b8d74d949880ae665c545debb18181389c99ee6","other":"e55d8cdb7e7940b11929e7e5c949ef6beb7998e5180a1f0a3c0bf61aef39f1b8","up":true},{"one":"419a6626dd026c0438461592121992c6be1868375011655b6d405166cd8edf7f","other":"517aa977048247d5d16ad51a286ffac4d8f910733f0578b222201308c32d195e","up":true},{"one":"7639f9a66e8ff70f554c346faa25f78140957c295b748fc42a12df7972f4fcc6","other":"018adc613f78d6ec876274f821251fd049eb3651646cd69e27efe211fe88d936","up":true},{"one":"7355fab10584e4312f5cb5c3c826e7f9c14da74d62d07d0a8007ce9c6e995be9","other":"3cb1b4069727dc323a687cab4ca2764f6415450488706f1b97c5cb8ca46346ff","up":true},{"one":"8be461203f5ebb5721348f537b37d768f7bd359af3e18d1f7e9af2f901c49845","other":"cec3c01c147b34f25104ddd0b25076cef63ac224eada9d9f5a00b8513331354f","up":true},{"one":"539df902d42dc997c6b0e24d16ad68b54c557d56b41c972a320d57632dbfbe3c","other":"67288f84ada7778858139c74917b22ae698ed43df49a6530a566648f074ede46","up":true},{"one":"109ef17c890104bfc5a4897d526a0afaa8c991c9d213616032f3058d0feb7f00","other":"018adc613f78d6ec876274f821251fd049eb3651646cd69e27efe211fe88d936","up":true},{"one":"a7a61804d270ed6c27a4b1e8a634c30d7cdbaf644a1c67cbc6b08cd849a711db","other":"a75abd0dce5a488b7e06f91fab7a92ec428ab21bde9372c9e8fa489f48e7b3fe","up":true},{"one":"86ca1078dae40f23ae1b3ac47397460d9ec0bf243a0de372b405381d6722fcb2","other":"ea60ef7cb3f2166a5c8e286c885984943a2ea5aff4730015be6a15031040cecf","up":true},{"one":"f36084048bf0ff985a77f5183796f7b37b7085ee6eea8bbc5fc62558854cce67","other":"957d8a9b412b6f4cd151cbc07b8d74d949880ae665c545debb18181389c99ee6","up":true},{"one":"ce99e9d37111c52e929b187fe201790b1a555dfb8b6b6de54e94df7cc2d43fd4","other":"7fbc1843e2222e3c8e35a3215d1bbb4d5457d8b9ed33749e07e22f25ba9ee576","up":true},{"one":"9d3c79e4a0ac4e5b95aa32545f3b8d86f74594faa237d5c2566cf02fbd60b11a","other":"b2b9ac0f4db58886597af7b19d6150498ac8ad7c804671628aa34384b8fe505e","up":true},{"one":"06b95f1bac76ca4925d509b06216f2113ac5dcf051ef5aa0a320ae64069e0b6d","other":"7b9242137f8cc2bec7b3e0003fd93026921ceb10dfadbbd5b6aa64d61a74f35e","up":true},{"one":"7cf4838a7c83a736ce59cfa1b974674a0185dbe17a8f3cd29794a3bbe814adee","other":"7dc5e8d8180c1bc7ebbee11a47fc96e8fe8b2d71c30cbc4aa1cf99e8eb6afcac","up":true},{"one":"c3a1b301bf187fd8326831197d93a0266ac0cc8287b9008631240e2bec9cf337","other":"a75abd0dce5a488b7e06f91fab7a92ec428ab21bde9372c9e8fa489f48e7b3fe","up":true},{"one":"f410d4ac9b748c24fa0d48c3053bb1cea8a67d0bcc4e5fcbdb261c0c7522cc34","other":"f74ecde0bbaa7b6521fb205b5ab9ea637909277f6e1ee1d3490f5cd01d0f7216","up":true},{"one":"026d2e41b82d506da685a30cce7cc5772f6c1e167b7d557e0531fb9b79dd4ff2","other":"757a557424c33ad89efd8185ec18d71c025830ecb2aed951e33c8c8d986d5933","up":true},{"one":"1be4348ec5670cdc4f164d77b1356e7910b6d1be4a9b720e549d02e5482a9e78","other":"021811a6757bdcdd2fa0fb68401dfe009d5a8e129958cd304fb42cf51dc5d1d3","up":true},{"one":"5abc96f4fa78812db6fb710fd424dd474145f7e5d00b4cedc5373b4c52f42cf5","other":"67288f84ada7778858139c74917b22ae698ed43df49a6530a566648f074ede46","up":true},{"one":"c8e5a1b4533dd0de12acee4d31369f39785178568718b93bbc321ec83e0714f0","other":"698247d103a8925d8bb4c56a3056e49c5efc595fced1c89d49943bb9ba01f394","up":true},{"one":"667ef042e9dae18694581e0404c3d87a09800e8b42173d26571c3bf97e29a372","other":"d2245f0679b436faabc0164e0b85e02e2effbad306e8229b555524a5e6d1a5f9","up":true},{"one":"5a01993ff7b4bd12fdb259e96b26a036d0cf5d4ae9c9b516be64b63acec2443a","other":"667ef042e9dae18694581e0404c3d87a09800e8b42173d26571c3bf97e29a372","up":true},{"one":"895bdcd200cc4d7ec5c24f1722d0a8ebedda78b78cdf1ccc8c22a981980f5786","other":"d0f398969480f3df3587f6d47546ff1261cad4d2e9c26ff3077e35ae1b26153e","up":true},{"one":"4167946de250b013e1be16ee84bfe2ccaae83e699e618b38f31016c4e431e6ba","other":"734e029ed25485edd49b93dd9e85b6e7657f860e4ded4bc8a5094f512ae5836b","up":true},{"one":"7fbc1843e2222e3c8e35a3215d1bbb4d5457d8b9ed33749e07e22f25ba9ee576","other":"cec3c01c147b34f25104ddd0b25076cef63ac224eada9d9f5a00b8513331354f","up":true},{"one":"89c883d6a85472bda328667e3fd805c70876bc582ca6763ab97ae636b1772be4","other":"cec3c01c147b34f25104ddd0b25076cef63ac224eada9d9f5a00b8513331354f","up":true},{"one":"db088103f3b6f2c784d76ecd99c8b4a77fd39bb39c72ddfd91c99c1a9dd3b75b","other":"ebca518e5146f49ac75bcaa8add2ef4d1d22c5cfd2e2326c6b41826d45ce55ae","up":true},{"one":"757a557424c33ad89efd8185ec18d71c025830ecb2aed951e33c8c8d986d5933","other":"e55d8cdb7e7940b11929e7e5c949ef6beb7998e5180a1f0a3c0bf61aef39f1b8","up":true},{"one":"57764522162620c1ad0b166a9c43772255d0cc01e49f2122ef09db046804a570","other":"06b95f1bac76ca4925d509b06216f2113ac5dcf051ef5aa0a320ae64069e0b6d","up":true},{"one":"f5c4d28df5973ec0292221a875e8446323f339409d93f0f7385990126908a3c3","other":"f74ecde0bbaa7b6521fb205b5ab9ea637909277f6e1ee1d3490f5cd01d0f7216","up":true},{"one":"0ab9845c2890b0a64a3e5932241245e00b817b788094f9ee48f86f80b7264fea","other":"13bc64535d3ae495098e4ac6b30a91d1804dab0ab79944f2c6ac53c9bccdf62d","up":true},{"one":"b8e1a80d91216fd5f8bc3f7413caf68ade7f124354d44fe7bd155a089134a70a","other":"b381e75e52e4cdd168056245f82d3a1747b67f400eb40eb12036b73ee7fe21e5","up":true},{"one":"5d608e66a17442091111cb472723fe3aea1f2baecaa546b57d49507c63a61cda","other":"ea0e1dd41fe042b09f273c98f02128949cf5561d20dc04b3d423961efed52327","up":true},{"one":"772e4c80d128deb52adf024a0eb6fe9bbea1c83351ed93f55f490cd5e5c69260","other":"7cf4838a7c83a736ce59cfa1b974674a0185dbe17a8f3cd29794a3bbe814adee","up":true},{"one":"109ef17c890104bfc5a4897d526a0afaa8c991c9d213616032f3058d0feb7f00","other":"0bcf8a8ab0065ca8c85b8b6641f4c6e0b0de60e79ef32ebf6ff8f109ac4e1d70","up":true},{"one":"957d8a9b412b6f4cd151cbc07b8d74d949880ae665c545debb18181389c99ee6","other":"e16b12c708bc5e0545009daed44733c52d7450ccc797d158dd41a3bc9507b6be","up":true},{"one":"c8e5a1b4533dd0de12acee4d31369f39785178568718b93bbc321ec83e0714f0","other":"83dc556ed36f37d06765be2554fe86eaf1ec21e2931fb22403238453bf021dfb","up":true},{"one":"e0b1c4eb5b5b4dfc22344ee65cb9716cecb38dcc80099793f20641884eae4854","other":"e77f6aa9e3dfcce0a2e5db794703224249aba60595075b2df9a5b0b30855cf46","up":true},{"one":"895bdcd200cc4d7ec5c24f1722d0a8ebedda78b78cdf1ccc8c22a981980f5786","other":"d6ffb7fd2668e9b7b133bd9144156f4736191ef0d6e72b072759782d83931f22","up":true},{"one":"027fb496438782583f78fb76999336eed7fb672a9c9ea50d04df580e6eb21377","other":"7b9242137f8cc2bec7b3e0003fd93026921ceb10dfadbbd5b6aa64d61a74f35e","up":true},{"one":"c18105aa302a43e352d999745a0f806af9f8cb8bb83349357da5c85e8975acd1","other":"d2245f0679b436faabc0164e0b85e02e2effbad306e8229b555524a5e6d1a5f9","up":true},{"one":"89c883d6a85472bda328667e3fd805c70876bc582ca6763ab97ae636b1772be4","other":"ea60ef7cb3f2166a5c8e286c885984943a2ea5aff4730015be6a15031040cecf","up":true},{"one":"db088103f3b6f2c784d76ecd99c8b4a77fd39bb39c72ddfd91c99c1a9dd3b75b","other":"d2245f0679b436faabc0164e0b85e02e2effbad306e8229b555524a5e6d1a5f9","up":true},{"one":"8be461203f5ebb5721348f537b37d768f7bd359af3e18d1f7e9af2f901c49845","other":"c8e5a1b4533dd0de12acee4d31369f39785178568718b93bbc321ec83e0714f0","up":true},{"one":"39dbd5462c90dac75f49d9af7996845943bbe929754ef8125eee7f5a763e9def","other":"41b9ee7ad19698e97589b059ad3333cb64f02c16006d94fb3d0bad7ced8ff238","up":true},{"one":"83dc556ed36f37d06765be2554fe86eaf1ec21e2931fb22403238453bf021dfb","other":"cec3c01c147b34f25104ddd0b25076cef63ac224eada9d9f5a00b8513331354f","up":true},{"one":"0ab9845c2890b0a64a3e5932241245e00b817b788094f9ee48f86f80b7264fea","other":"757a557424c33ad89efd8185ec18d71c025830ecb2aed951e33c8c8d986d5933","up":true},{"one":"b8e1a80d91216fd5f8bc3f7413caf68ade7f124354d44fe7bd155a089134a70a","other":"b2b9ac0f4db58886597af7b19d6150498ac8ad7c804671628aa34384b8fe505e","up":true},{"one":"67288f84ada7778858139c74917b22ae698ed43df49a6530a566648f074ede46","other":"dfaeebc8e29c6a8f851b12b80cf42567cd2a43e35d977305a3c10e51bf41170a","up":true},{"one":"4cd0f38e52a508f81cf95e1370c994aea2d7a49a2a08e3e054f53629a6619410","other":"67288f84ada7778858139c74917b22ae698ed43df49a6530a566648f074ede46","up":true},{"one":"ea60ef7cb3f2166a5c8e286c885984943a2ea5aff4730015be6a15031040cecf","other":"8cf957bf95a629c60c31dbcfe75ecca149a81c761f8b34858b04f8318e5c74bd","up":true},{"one":"ebca518e5146f49ac75bcaa8add2ef4d1d22c5cfd2e2326c6b41826d45ce55ae","other":"f74ecde0bbaa7b6521fb205b5ab9ea637909277f6e1ee1d3490f5cd01d0f7216","up":true},{"one":"0ff67b0e9ec6509c7786495b7b3ddb176b4f8221ff300f409f00a3d389e8874c","other":"7b9242137f8cc2bec7b3e0003fd93026921ceb10dfadbbd5b6aa64d61a74f35e","up":true},{"one":"895bdcd200cc4d7ec5c24f1722d0a8ebedda78b78cdf1ccc8c22a981980f5786","other":"ea60ef7cb3f2166a5c8e286c885984943a2ea5aff4730015be6a15031040cecf","up":true},{"one":"027fb496438782583f78fb76999336eed7fb672a9c9ea50d04df580e6eb21377","other":"06b95f1bac76ca4925d509b06216f2113ac5dcf051ef5aa0a320ae64069e0b6d","up":true},{"one":"1929a84bcd64bf002d0afb16249466c5b660123174a1fc1bf881913f8c87d1fd","other":"0506e949748b62da1d36b663df7d6a7e76027f72ced5d52f74677fb31d7e1505","up":true},{"one":"cbc5d42951bc6e187296b5f8ce4d04e472e26670a62851f39d65f31c50865f6a","other":"a75abd0dce5a488b7e06f91fab7a92ec428ab21bde9372c9e8fa489f48e7b3fe","up":true},{"one":"026d2e41b82d506da685a30cce7cc5772f6c1e167b7d557e0531fb9b79dd4ff2","other":"13bc64535d3ae495098e4ac6b30a91d1804dab0ab79944f2c6ac53c9bccdf62d","up":true},{"one":"db088103f3b6f2c784d76ecd99c8b4a77fd39bb39c72ddfd91c99c1a9dd3b75b","other":"ea0e1dd41fe042b09f273c98f02128949cf5561d20dc04b3d423961efed52327","up":true},{"one":"06b95f1bac76ca4925d509b06216f2113ac5dcf051ef5aa0a320ae64069e0b6d","other":"021811a6757bdcdd2fa0fb68401dfe009d5a8e129958cd304fb42cf51dc5d1d3","up":true},{"one":"558eb021744be19383be9ac91b9f77e07479e0eb25576bd32a3afaa94c231178","other":"6c029114a9f73d69a42e591cf2d13107eff038d3eda8abb0242d9d6d169f05c7","up":true},{"one":"645b4e6b36fc1928725f627aeed278f46c5a7d6b0fff7ccff55a0468d47b23e8","other":"67288f84ada7778858139c74917b22ae698ed43df49a6530a566648f074ede46","up":true},{"one":"7355fab10584e4312f5cb5c3c826e7f9c14da74d62d07d0a8007ce9c6e995be9","other":"7639f9a66e8ff70f554c346faa25f78140957c295b748fc42a12df7972f4fcc6","up":true},{"one":"621076ce6b82e70c90a4adf235aa6f71b116e302dd6b15dcae07f4a816012455","other":"645b4e6b36fc1928725f627aeed278f46c5a7d6b0fff7ccff55a0468d47b23e8","up":true},{"one":"957d8a9b412b6f4cd151cbc07b8d74d949880ae665c545debb18181389c99ee6","other":"e77f6aa9e3dfcce0a2e5db794703224249aba60595075b2df9a5b0b30855cf46","up":true},{"one":"6ecb11fc5acc16ecd70351410fa18ec44a2a83d9e778cf25b85a7535493456b7","other":"f410d4ac9b748c24fa0d48c3053bb1cea8a67d0bcc4e5fcbdb261c0c7522cc34","up":true},{"one":"dc97c1a0019b482a048b8d15941dfe4c3c1a3443d9b2d7b4046370bc84a7e56f","other":"d2245f0679b436faabc0164e0b85e02e2effbad306e8229b555524a5e6d1a5f9","up":true},{"one":"cbc5d42951bc6e187296b5f8ce4d04e472e26670a62851f39d65f31c50865f6a","other":"698247d103a8925d8bb4c56a3056e49c5efc595fced1c89d49943bb9ba01f394","up":true},{"one":"026d2e41b82d506da685a30cce7cc5772f6c1e167b7d557e0531fb9b79dd4ff2","other":"109ef17c890104bfc5a4897d526a0afaa8c991c9d213616032f3058d0feb7f00","up":true},{"one":"021811a6757bdcdd2fa0fb68401dfe009d5a8e129958cd304fb42cf51dc5d1d3","other":"13bc64535d3ae495098e4ac6b30a91d1804dab0ab79944f2c6ac53c9bccdf62d","up":true},{"one":"39dbd5462c90dac75f49d9af7996845943bbe929754ef8125eee7f5a763e9def","other":"3ee4b20c047e701b58c06fcc8160364bd29573f61f4d9f1935d77ac29f6a1e86","up":true},{"one":"ca036d1ef9e6ce3654f2d769f16926aa14957193586426489e15539dfa8f7763","other":"7fbc1843e2222e3c8e35a3215d1bbb4d5457d8b9ed33749e07e22f25ba9ee576","up":true},{"one":"dfaeebc8e29c6a8f851b12b80cf42567cd2a43e35d977305a3c10e51bf41170a","other":"d2245f0679b436faabc0164e0b85e02e2effbad306e8229b555524a5e6d1a5f9","up":true},{"one":"419a6626dd026c0438461592121992c6be1868375011655b6d405166cd8edf7f","other":"4a1811dd9febde1801a604ad81de84a2d15366d0b5c330f30f3398da0d107824","up":true},{"one":"9a9230b3f7f386520821dee78ebe92e8c64a4f6a50f2639327c62e45cab40563","other":"9ee7b3e06b453615cbd8737cb74515b150f518f1a2eaa2db90e54708dd161b7d","up":true},{"one":"4cd0f38e52a508f81cf95e1370c994aea2d7a49a2a08e3e054f53629a6619410","other":"539df902d42dc997c6b0e24d16ad68b54c557d56b41c972a320d57632dbfbe3c","up":true},{"one":"cfbb9ea682becadeab10bbd080ba8e93510085a87ac519e434964faa222fc275","other":"ce99e9d37111c52e929b187fe201790b1a555dfb8b6b6de54e94df7cc2d43fd4","up":true},{"one":"957d8a9b412b6f4cd151cbc07b8d74d949880ae665c545debb18181389c99ee6","other":"f410d4ac9b748c24fa0d48c3053bb1cea8a67d0bcc4e5fcbdb261c0c7522cc34","up":true},{"one":"957d8a9b412b6f4cd151cbc07b8d74d949880ae665c545debb18181389c99ee6","other":"cec3c01c147b34f25104ddd0b25076cef63ac224eada9d9f5a00b8513331354f","up":true},{"one":"48b614958a8692780ef5bd5c95e0db4ff67deb4de0dcbb878ca4479bfb86957e","other":"667ef042e9dae18694581e0404c3d87a09800e8b42173d26571c3bf97e29a372","up":true},{"one":"4cd0f38e52a508f81cf95e1370c994aea2d7a49a2a08e3e054f53629a6619410","other":"5a01993ff7b4bd12fdb259e96b26a036d0cf5d4ae9c9b516be64b63acec2443a","up":true},{"one":"026d2e41b82d506da685a30cce7cc5772f6c1e167b7d557e0531fb9b79dd4ff2","other":"06b95f1bac76ca4925d509b06216f2113ac5dcf051ef5aa0a320ae64069e0b6d","up":true},{"one":"6ecb11fc5acc16ecd70351410fa18ec44a2a83d9e778cf25b85a7535493456b7","other":"5abc96f4fa78812db6fb710fd424dd474145f7e5d00b4cedc5373b4c52f42cf5","up":true},{"one":"757a557424c33ad89efd8185ec18d71c025830ecb2aed951e33c8c8d986d5933","other":"0bcf8a8ab0065ca8c85b8b6641f4c6e0b0de60e79ef32ebf6ff8f109ac4e1d70","up":true},{"one":"6e5c213a2db57eaf2e1e1acc341c72efab89b0e42b6cd18db4f99ac1af151d65","other":"698247d103a8925d8bb4c56a3056e49c5efc595fced1c89d49943bb9ba01f394","up":true},{"one":"645b4e6b36fc1928725f627aeed278f46c5a7d6b0fff7ccff55a0468d47b23e8","other":"7f87da7ee55b4c8c8f9d55411ff88d3a0b63bfee6a516917d49fa6273fb5b86a","up":true},{"one":"4167946de250b013e1be16ee84bfe2ccaae83e699e618b38f31016c4e431e6ba","other":"67288f84ada7778858139c74917b22ae698ed43df49a6530a566648f074ede46","up":true},{"one":"a75abd0dce5a488b7e06f91fab7a92ec428ab21bde9372c9e8fa489f48e7b3fe","other":"cdcd165721f6851f361fad0b3ba88c8870be9ad6d6b8cbcecc7c89e1068d979a","up":true},{"one":"aebd6135d10252b07f891b3a7330903faf13d409c4f7108630715fa0754f938e","other":"a3205c1c4f9b72814f0db68e888e3c7ef88f27c681ed0d731dde5f0999f92ccc","up":true},{"one":"57764522162620c1ad0b166a9c43772255d0cc01e49f2122ef09db046804a570","other":"4b243a5aeabec6db0e4a80a9c255300cd94591a6fbe0e0aa170da4f6ce14edff","up":true},{"one":"0506e949748b62da1d36b663df7d6a7e76027f72ced5d52f74677fb31d7e1505","other":"13bc64535d3ae495098e4ac6b30a91d1804dab0ab79944f2c6ac53c9bccdf62d","up":true},{"one":"0506e949748b62da1d36b663df7d6a7e76027f72ced5d52f74677fb31d7e1505","other":"0bcf8a8ab0065ca8c85b8b6641f4c6e0b0de60e79ef32ebf6ff8f109ac4e1d70","up":true},{"one":"c8e5a1b4533dd0de12acee4d31369f39785178568718b93bbc321ec83e0714f0","other":"cdcd165721f6851f361fad0b3ba88c8870be9ad6d6b8cbcecc7c89e1068d979a","up":true},{"one":"06b95f1bac76ca4925d509b06216f2113ac5dcf051ef5aa0a320ae64069e0b6d","other":"13bc64535d3ae495098e4ac6b30a91d1804dab0ab79944f2c6ac53c9bccdf62d","up":true},{"one":"cfbb9ea682becadeab10bbd080ba8e93510085a87ac519e434964faa222fc275","other":"cec3c01c147b34f25104ddd0b25076cef63ac224eada9d9f5a00b8513331354f","up":true},{"one":"d0f398969480f3df3587f6d47546ff1261cad4d2e9c26ff3077e35ae1b26153e","other":"db088103f3b6f2c784d76ecd99c8b4a77fd39bb39c72ddfd91c99c1a9dd3b75b","up":true},{"one":"558eb021744be19383be9ac91b9f77e07479e0eb25576bd32a3afaa94c231178","other":"4b243a5aeabec6db0e4a80a9c255300cd94591a6fbe0e0aa170da4f6ce14edff","up":true},{"one":"6ecb11fc5acc16ecd70351410fa18ec44a2a83d9e778cf25b85a7535493456b7","other":"539df902d42dc997c6b0e24d16ad68b54c557d56b41c972a320d57632dbfbe3c","up":true},{"one":"8b76194f129308324c7d0066530e02cac2410ee0ba952822f0ec866e12461e44","other":"8be461203f5ebb5721348f537b37d768f7bd359af3e18d1f7e9af2f901c49845","up":true},{"one":"645b4e6b36fc1928725f627aeed278f46c5a7d6b0fff7ccff55a0468d47b23e8","other":"667ef042e9dae18694581e0404c3d87a09800e8b42173d26571c3bf97e29a372","up":true},{"one":"6c029114a9f73d69a42e591cf2d13107eff038d3eda8abb0242d9d6d169f05c7","other":"539df902d42dc997c6b0e24d16ad68b54c557d56b41c972a320d57632dbfbe3c","up":true},{"one":"c3a1b301bf187fd8326831197d93a0266ac0cc8287b9008631240e2bec9cf337","other":"cec3c01c147b34f25104ddd0b25076cef63ac224eada9d9f5a00b8513331354f","up":true},{"one":"6c029114a9f73d69a42e591cf2d13107eff038d3eda8abb0242d9d6d169f05c7","other":"48b614958a8692780ef5bd5c95e0db4ff67deb4de0dcbb878ca4479bfb86957e","up":true},{"one":"67288f84ada7778858139c74917b22ae698ed43df49a6530a566648f074ede46","other":"4b243a5aeabec6db0e4a80a9c255300cd94591a6fbe0e0aa170da4f6ce14edff","up":true},{"one":"9d3c79e4a0ac4e5b95aa32545f3b8d86f74594faa237d5c2566cf02fbd60b11a","other":"b381e75e52e4cdd168056245f82d3a1747b67f400eb40eb12036b73ee7fe21e5","up":true},{"one":"0ff67b0e9ec6509c7786495b7b3ddb176b4f8221ff300f409f00a3d389e8874c","other":"021811a6757bdcdd2fa0fb68401dfe009d5a8e129958cd304fb42cf51dc5d1d3","up":true},{"one":"517aa977048247d5d16ad51a286ffac4d8f910733f0578b222201308c32d195e","other":"539df902d42dc997c6b0e24d16ad68b54c557d56b41c972a320d57632dbfbe3c","up":true},{"one":"042788d5b72cb84a375565d120d239a2b14fdf38b3f5f992284d78535077148a","other":"021811a6757bdcdd2fa0fb68401dfe009d5a8e129958cd304fb42cf51dc5d1d3","up":true},{"one":"757a557424c33ad89efd8185ec18d71c025830ecb2aed951e33c8c8d986d5933","other":"021811a6757bdcdd2fa0fb68401dfe009d5a8e129958cd304fb42cf51dc5d1d3","up":true},{"one":"042788d5b72cb84a375565d120d239a2b14fdf38b3f5f992284d78535077148a","other":"7639f9a66e8ff70f554c346faa25f78140957c295b748fc42a12df7972f4fcc6","up":true},{"one":"957d8a9b412b6f4cd151cbc07b8d74d949880ae665c545debb18181389c99ee6","other":"f5c4d28df5973ec0292221a875e8446323f339409d93f0f7385990126908a3c3","up":true},{"one":"06b95f1bac76ca4925d509b06216f2113ac5dcf051ef5aa0a320ae64069e0b6d","other":"0ab9845c2890b0a64a3e5932241245e00b817b788094f9ee48f86f80b7264fea","up":true},{"one":"9e02c5384602a54e900cfa46d5987b77f16e74cba745ac850fcada01c7af9004","other":"83dc556ed36f37d06765be2554fe86eaf1ec21e2931fb22403238453bf021dfb","up":true},{"one":"027fb496438782583f78fb76999336eed7fb672a9c9ea50d04df580e6eb21377","other":"026d2e41b82d506da685a30cce7cc5772f6c1e167b7d557e0531fb9b79dd4ff2","up":true},{"one":"4167946de250b013e1be16ee84bfe2ccaae83e699e618b38f31016c4e431e6ba","other":"539df902d42dc997c6b0e24d16ad68b54c557d56b41c972a320d57632dbfbe3c","up":true},{"one":"c8e5a1b4533dd0de12acee4d31369f39785178568718b93bbc321ec83e0714f0","other":"7fbc1843e2222e3c8e35a3215d1bbb4d5457d8b9ed33749e07e22f25ba9ee576","up":true},{"one":"cfbb9ea682becadeab10bbd080ba8e93510085a87ac519e434964faa222fc275","other":"c18105aa302a43e352d999745a0f806af9f8cb8bb83349357da5c85e8975acd1","up":true},{"one":"ca036d1ef9e6ce3654f2d769f16926aa14957193586426489e15539dfa8f7763","other":"d6ffb7fd2668e9b7b133bd9144156f4736191ef0d6e72b072759782d83931f22","up":true},{"one":"027fb496438782583f78fb76999336eed7fb672a9c9ea50d04df580e6eb21377","other":"757a557424c33ad89efd8185ec18d71c025830ecb2aed951e33c8c8d986d5933","up":true},{"one":"89c883d6a85472bda328667e3fd805c70876bc582ca6763ab97ae636b1772be4","other":"ea0e1dd41fe042b09f273c98f02128949cf5561d20dc04b3d423961efed52327","up":true},{"one":"6ecb11fc5acc16ecd70351410fa18ec44a2a83d9e778cf25b85a7535493456b7","other":"41b9ee7ad19698e97589b059ad3333cb64f02c16006d94fb3d0bad7ced8ff238","up":true},{"one":"ae67fae4990da61ca89221c5b1675c992babb4d715b59939e47bd1491b3bf1f4","other":"9d3c79e4a0ac4e5b95aa32545f3b8d86f74594faa237d5c2566cf02fbd60b11a","up":true},{"one":"419a6626dd026c0438461592121992c6be1868375011655b6d405166cd8edf7f","other":"539df902d42dc997c6b0e24d16ad68b54c557d56b41c972a320d57632dbfbe3c","up":true},{"one":"83dc556ed36f37d06765be2554fe86eaf1ec21e2931fb22403238453bf021dfb","other":"ea60ef7cb3f2166a5c8e286c885984943a2ea5aff4730015be6a15031040cecf","up":true},{"one":"b2b9ac0f4db58886597af7b19d6150498ac8ad7c804671628aa34384b8fe505e","other":"b486ce31ce880db3aaa17a0ac2c2f3554b6fe71f9c051edb572974342af4adb9","up":true},{"one":"7639f9a66e8ff70f554c346faa25f78140957c295b748fc42a12df7972f4fcc6","other":"2a22dbee71a0ef27c840221db4a592d6dc8f171afed865ff814a37d633a3eaa9","up":true},{"one":"6ecb11fc5acc16ecd70351410fa18ec44a2a83d9e778cf25b85a7535493456b7","other":"5d608e66a17442091111cb472723fe3aea1f2baecaa546b57d49507c63a61cda","up":true},{"one":"cdcd165721f6851f361fad0b3ba88c8870be9ad6d6b8cbcecc7c89e1068d979a","other":"d2245f0679b436faabc0164e0b85e02e2effbad306e8229b555524a5e6d1a5f9","up":true},{"one":"042788d5b72cb84a375565d120d239a2b14fdf38b3f5f992284d78535077148a","other":"13bc64535d3ae495098e4ac6b30a91d1804dab0ab79944f2c6ac53c9bccdf62d","up":true},{"one":"4167946de250b013e1be16ee84bfe2ccaae83e699e618b38f31016c4e431e6ba","other":"5a01993ff7b4bd12fdb259e96b26a036d0cf5d4ae9c9b516be64b63acec2443a","up":true},{"one":"7639f9a66e8ff70f554c346faa25f78140957c295b748fc42a12df7972f4fcc6","other":"027fb496438782583f78fb76999336eed7fb672a9c9ea50d04df580e6eb21377","up":true},{"one":"4167946de250b013e1be16ee84bfe2ccaae83e699e618b38f31016c4e431e6ba","other":"4a1811dd9febde1801a604ad81de84a2d15366d0b5c330f30f3398da0d107824","up":true},{"one":"b381e75e52e4cdd168056245f82d3a1747b67f400eb40eb12036b73ee7fe21e5","other":"b486ce31ce880db3aaa17a0ac2c2f3554b6fe71f9c051edb572974342af4adb9","up":true},{"one":"109ef17c890104bfc5a4897d526a0afaa8c991c9d213616032f3058d0feb7f00","other":"13bc64535d3ae495098e4ac6b30a91d1804dab0ab79944f2c6ac53c9bccdf62d","up":true},{"one":"0ff67b0e9ec6509c7786495b7b3ddb176b4f8221ff300f409f00a3d389e8874c","other":"13bc64535d3ae495098e4ac6b30a91d1804dab0ab79944f2c6ac53c9bccdf62d","up":true},{"one":"6ecb11fc5acc16ecd70351410fa18ec44a2a83d9e778cf25b85a7535493456b7","other":"4cd0f38e52a508f81cf95e1370c994aea2d7a49a2a08e3e054f53629a6619410","up":true},{"one":"7b9242137f8cc2bec7b3e0003fd93026921ceb10dfadbbd5b6aa64d61a74f35e","other":"0bcf8a8ab0065ca8c85b8b6641f4c6e0b0de60e79ef32ebf6ff8f109ac4e1d70","up":true},{"one":"957d8a9b412b6f4cd151cbc07b8d74d949880ae665c545debb18181389c99ee6","other":"e0ea575d0e2efa28bc51f49d1e2c24196a196da3b3196f3a5a26a5e310809af5","up":true},{"one":"ebca518e5146f49ac75bcaa8add2ef4d1d22c5cfd2e2326c6b41826d45ce55ae","other":"e55d8cdb7e7940b11929e7e5c949ef6beb7998e5180a1f0a3c0bf61aef39f1b8","up":true},{"one":"6ecb11fc5acc16ecd70351410fa18ec44a2a83d9e778cf25b85a7535493456b7","other":"4b243a5aeabec6db0e4a80a9c255300cd94591a6fbe0e0aa170da4f6ce14edff","up":true},{"one":"a085045c335ce2e47dbdfeb1adb62ce6c3bed36a93cf3448c45757a1a88e295d","other":"a3205c1c4f9b72814f0db68e888e3c7ef88f27c681ed0d731dde5f0999f92ccc","up":true},{"one":"41b9ee7ad19698e97589b059ad3333cb64f02c16006d94fb3d0bad7ced8ff238","other":"4b243a5aeabec6db0e4a80a9c255300cd94591a6fbe0e0aa170da4f6ce14edff","up":true},{"one":"621076ce6b82e70c90a4adf235aa6f71b116e302dd6b15dcae07f4a816012455","other":"667ef042e9dae18694581e0404c3d87a09800e8b42173d26571c3bf97e29a372","up":true},{"one":"558eb021744be19383be9ac91b9f77e07479e0eb25576bd32a3afaa94c231178","other":"41b9ee7ad19698e97589b059ad3333cb64f02c16006d94fb3d0bad7ced8ff238","up":true},{"one":"9d3c79e4a0ac4e5b95aa32545f3b8d86f74594faa237d5c2566cf02fbd60b11a","other":"aebd6135d10252b07f891b3a7330903faf13d409c4f7108630715fa0754f938e","up":true},{"one":"41b9ee7ad19698e97589b059ad3333cb64f02c16006d94fb3d0bad7ced8ff238","other":"539df902d42dc997c6b0e24d16ad68b54c557d56b41c972a320d57632dbfbe3c","up":true},{"one":"2459fe9250b3311c86530d00b7a9b8ba57b1b5151c126262e70c55d1e8d37924","other":"213bf6e78e02a57585908c756f0965297152c3c400a0ed4c407a411e1ec5942d","up":true},{"one":"7639f9a66e8ff70f554c346faa25f78140957c295b748fc42a12df7972f4fcc6","other":"06b95f1bac76ca4925d509b06216f2113ac5dcf051ef5aa0a320ae64069e0b6d","up":true},{"one":"e77f6aa9e3dfcce0a2e5db794703224249aba60595075b2df9a5b0b30855cf46","other":"e16b12c708bc5e0545009daed44733c52d7450ccc797d158dd41a3bc9507b6be","up":true},{"one":"027fb496438782583f78fb76999336eed7fb672a9c9ea50d04df580e6eb21377","other":"042788d5b72cb84a375565d120d239a2b14fdf38b3f5f992284d78535077148a","up":true},{"one":"021811a6757bdcdd2fa0fb68401dfe009d5a8e129958cd304fb42cf51dc5d1d3","other":"0bcf8a8ab0065ca8c85b8b6641f4c6e0b0de60e79ef32ebf6ff8f109ac4e1d70","up":true},{"one":"a2babe49410ae007bc41ff2b7deaf709ed849e2f69666ce5aae76a3b71f47081","other":"a7a61804d270ed6c27a4b1e8a634c30d7cdbaf644a1c67cbc6b08cd849a711db","up":true},{"one":"757a557424c33ad89efd8185ec18d71c025830ecb2aed951e33c8c8d986d5933","other":"03907380afcd52238f3d84a8dee3df599c7f2f9b90fbc1271ee88bdb52acbd58","up":true},{"one":"57764522162620c1ad0b166a9c43772255d0cc01e49f2122ef09db046804a570","other":"539df902d42dc997c6b0e24d16ad68b54c557d56b41c972a320d57632dbfbe3c","up":true},{"one":"92a1501ed41e29bb7dd8eb4b4acecae983f4c7c83f39895cd68f7810b645f1dd","other":"9e02c5384602a54e900cfa46d5987b77f16e74cba745ac850fcada01c7af9004","up":true},{"one":"2459fe9250b3311c86530d00b7a9b8ba57b1b5151c126262e70c55d1e8d37924","other":"7b9242137f8cc2bec7b3e0003fd93026921ceb10dfadbbd5b6aa64d61a74f35e","up":true},{"one":"7639f9a66e8ff70f554c346faa25f78140957c295b748fc42a12df7972f4fcc6","other":"734e029ed25485edd49b93dd9e85b6e7657f860e4ded4bc8a5094f512ae5836b","up":true},{"one":"4cd0f38e52a508f81cf95e1370c994aea2d7a49a2a08e3e054f53629a6619410","other":"47c3e0dfbbfcebeece78865c8c989577360cd9cc46a3b43f4b7b01ed14dc30e6","up":true},{"one":"9d3c79e4a0ac4e5b95aa32545f3b8d86f74594faa237d5c2566cf02fbd60b11a","other":"afa3de5cebc9f96cf20a35058f4856fe43b48ac59cf8e46565f194f438622a52","up":true},{"one":"ae67fae4990da61ca89221c5b1675c992babb4d715b59939e47bd1491b3bf1f4","other":"aebd6135d10252b07f891b3a7330903faf13d409c4f7108630715fa0754f938e","up":true},{"one":"645b4e6b36fc1928725f627aeed278f46c5a7d6b0fff7ccff55a0468d47b23e8","other":"6742cca1b7783fcbed8d0b340508f93cc4dfaca8ff3f13fd59354486c4d62993","up":true},{"one":"027fb496438782583f78fb76999336eed7fb672a9c9ea50d04df580e6eb21377","other":"0ff67b0e9ec6509c7786495b7b3ddb176b4f8221ff300f409f00a3d389e8874c","up":true},{"one":"7b9242137f8cc2bec7b3e0003fd93026921ceb10dfadbbd5b6aa64d61a74f35e","other":"13bc64535d3ae495098e4ac6b30a91d1804dab0ab79944f2c6ac53c9bccdf62d","up":true},{"one":"47c3e0dfbbfcebeece78865c8c989577360cd9cc46a3b43f4b7b01ed14dc30e6","other":"539df902d42dc997c6b0e24d16ad68b54c557d56b41c972a320d57632dbfbe3c","up":true},{"one":"47c3e0dfbbfcebeece78865c8c989577360cd9cc46a3b43f4b7b01ed14dc30e6","other":"4b243a5aeabec6db0e4a80a9c255300cd94591a6fbe0e0aa170da4f6ce14edff","up":true},{"one":"7639f9a66e8ff70f554c346faa25f78140957c295b748fc42a12df7972f4fcc6","other":"772e4c80d128deb52adf024a0eb6fe9bbea1c83351ed93f55f490cd5e5c69260","up":true},{"one":"82f034db88fd26b47c26b95c3f87a1f454ffe4526ae86beb2bb1d8f2c218c25c","other":"83dc556ed36f37d06765be2554fe86eaf1ec21e2931fb22403238453bf021dfb","up":true},{"one":"6ecb11fc5acc16ecd70351410fa18ec44a2a83d9e778cf25b85a7535493456b7","other":"57764522162620c1ad0b166a9c43772255d0cc01e49f2122ef09db046804a570","up":true},{"one":"645b4e6b36fc1928725f627aeed278f46c5a7d6b0fff7ccff55a0468d47b23e8","other":"6c82fdabd09e0e9d0fc507613a05951c02b2953d763a062a5f32aaf5cc477c19","up":true},{"one":"7dc5e8d8180c1bc7ebbee11a47fc96e8fe8b2d71c30cbc4aa1cf99e8eb6afcac","other":"7fbc1843e2222e3c8e35a3215d1bbb4d5457d8b9ed33749e07e22f25ba9ee576","up":true},{"one":"962676818c17fae1ffc52fc29318c44f9b8c980afd6d3e98217b4088d568a808","other":"9d3c79e4a0ac4e5b95aa32545f3b8d86f74594faa237d5c2566cf02fbd60b11a","up":true},{"one":"962676818c17fae1ffc52fc29318c44f9b8c980afd6d3e98217b4088d568a808","other":"83dc556ed36f37d06765be2554fe86eaf1ec21e2931fb22403238453bf021dfb","up":true},{"one":"e16b12c708bc5e0545009daed44733c52d7450ccc797d158dd41a3bc9507b6be","other":"f410d4ac9b748c24fa0d48c3053bb1cea8a67d0bcc4e5fcbdb261c0c7522cc34","up":true},{"one":"b8e1a80d91216fd5f8bc3f7413caf68ade7f124354d44fe7bd155a089134a70a","other":"b92a71a4fc371e0596538a7fb2a33e85329c39c4409c99798d9318bc263a04a1","up":true},{"one":"5d608e66a17442091111cb472723fe3aea1f2baecaa546b57d49507c63a61cda","other":"539df902d42dc997c6b0e24d16ad68b54c557d56b41c972a320d57632dbfbe3c","up":true},{"one":"8cf957bf95a629c60c31dbcfe75ecca149a81c761f8b34858b04f8318e5c74bd","other":"cec3c01c147b34f25104ddd0b25076cef63ac224eada9d9f5a00b8513331354f","up":true},{"one":"f36120ff250b9e7164e96021479332054f67de65cd2fe5b6e34bc51d0fe4d29c","other":"f36084048bf0ff985a77f5183796f7b37b7085ee6eea8bbc5fc62558854cce67","up":true},{"one":"0ab9845c2890b0a64a3e5932241245e00b817b788094f9ee48f86f80b7264fea","other":"7b9242137f8cc2bec7b3e0003fd93026921ceb10dfadbbd5b6aa64d61a74f35e","up":true},{"one":"7b9242137f8cc2bec7b3e0003fd93026921ceb10dfadbbd5b6aa64d61a74f35e","other":"286aeba646bba4a8aa1c372bee9f2c9ff0a2b3abb4f18be321225555c6dce4e5","up":true},{"one":"9e02c5384602a54e900cfa46d5987b77f16e74cba745ac850fcada01c7af9004","other":"9ee7b3e06b453615cbd8737cb74515b150f518f1a2eaa2db90e54708dd161b7d","up":true},{"one":"6c82fdabd09e0e9d0fc507613a05951c02b2953d763a062a5f32aaf5cc477c19","other":"667ef042e9dae18694581e0404c3d87a09800e8b42173d26571c3bf97e29a372","up":true},{"one":"48b614958a8692780ef5bd5c95e0db4ff67deb4de0dcbb878ca4479bfb86957e","other":"47c3e0dfbbfcebeece78865c8c989577360cd9cc46a3b43f4b7b01ed14dc30e6","up":true},{"one":"48b614958a8692780ef5bd5c95e0db4ff67deb4de0dcbb878ca4479bfb86957e","other":"4a1811dd9febde1801a604ad81de84a2d15366d0b5c330f30f3398da0d107824","up":true},{"one":"757a557424c33ad89efd8185ec18d71c025830ecb2aed951e33c8c8d986d5933","other":"109ef17c890104bfc5a4897d526a0afaa8c991c9d213616032f3058d0feb7f00","up":true},{"one":"f5c4d28df5973ec0292221a875e8446323f339409d93f0f7385990126908a3c3","other":"f36120ff250b9e7164e96021479332054f67de65cd2fe5b6e34bc51d0fe4d29c","up":true},{"one":"cbc5d42951bc6e187296b5f8ce4d04e472e26670a62851f39d65f31c50865f6a","other":"c3a1b301bf187fd8326831197d93a0266ac0cc8287b9008631240e2bec9cf337","up":true},{"one":"b92a71a4fc371e0596538a7fb2a33e85329c39c4409c99798d9318bc263a04a1","other":"b486ce31ce880db3aaa17a0ac2c2f3554b6fe71f9c051edb572974342af4adb9","up":true},{"one":"042788d5b72cb84a375565d120d239a2b14fdf38b3f5f992284d78535077148a","other":"03907380afcd52238f3d84a8dee3df599c7f2f9b90fbc1271ee88bdb52acbd58","up":true},{"one":"558eb021744be19383be9ac91b9f77e07479e0eb25576bd32a3afaa94c231178","other":"57764522162620c1ad0b166a9c43772255d0cc01e49f2122ef09db046804a570","up":true},{"one":"6e5c213a2db57eaf2e1e1acc341c72efab89b0e42b6cd18db4f99ac1af151d65","other":"6c82fdabd09e0e9d0fc507613a05951c02b2953d763a062a5f32aaf5cc477c19","up":true},{"one":"757a557424c33ad89efd8185ec18d71c025830ecb2aed951e33c8c8d986d5933","other":"13bc64535d3ae495098e4ac6b30a91d1804dab0ab79944f2c6ac53c9bccdf62d","up":true},{"one":"0ff67b0e9ec6509c7786495b7b3ddb176b4f8221ff300f409f00a3d389e8874c","other":"1929a84bcd64bf002d0afb16249466c5b660123174a1fc1bf881913f8c87d1fd","up":true},{"one":"73b8d1840d0a8ffe69752ec96f8fddecb0e22726c87982d572ca9acc1c9cdbfc","other":"7f87da7ee55b4c8c8f9d55411ff88d3a0b63bfee6a516917d49fa6273fb5b86a","up":true},{"one":"0ff67b0e9ec6509c7786495b7b3ddb176b4f8221ff300f409f00a3d389e8874c","other":"0bcf8a8ab0065ca8c85b8b6641f4c6e0b0de60e79ef32ebf6ff8f109ac4e1d70","up":true},{"one":"0ff67b0e9ec6509c7786495b7b3ddb176b4f8221ff300f409f00a3d389e8874c","other":"03907380afcd52238f3d84a8dee3df599c7f2f9b90fbc1271ee88bdb52acbd58","up":true},{"one":"6c029114a9f73d69a42e591cf2d13107eff038d3eda8abb0242d9d6d169f05c7","other":"5a01993ff7b4bd12fdb259e96b26a036d0cf5d4ae9c9b516be64b63acec2443a","up":true},{"one":"6c029114a9f73d69a42e591cf2d13107eff038d3eda8abb0242d9d6d169f05c7","other":"41b9ee7ad19698e97589b059ad3333cb64f02c16006d94fb3d0bad7ced8ff238","up":true},{"one":"3e56d4533ec14f6656e1eb25fb35dad47c9db479f667a6b6fe9a3aa8c12e982e","other":"39dbd5462c90dac75f49d9af7996845943bbe929754ef8125eee7f5a763e9def","up":true},{"one":"213bf6e78e02a57585908c756f0965297152c3c400a0ed4c407a411e1ec5942d","other":"26d1af1fbee6541a363ea7707825e37da028142f00779116560ad20f1de18e7b","up":true},{"one":"b381e75e52e4cdd168056245f82d3a1747b67f400eb40eb12036b73ee7fe21e5","other":"b16dcdf1ff1a56d49e374531d9885d59c1bcfbb628604520d9b1d84662edb9ca","up":true},{"one":"a7a61804d270ed6c27a4b1e8a634c30d7cdbaf644a1c67cbc6b08cd849a711db","other":"a085045c335ce2e47dbdfeb1adb62ce6c3bed36a93cf3448c45757a1a88e295d","up":true},{"one":"0506e949748b62da1d36b663df7d6a7e76027f72ced5d52f74677fb31d7e1505","other":"7b9242137f8cc2bec7b3e0003fd93026921ceb10dfadbbd5b6aa64d61a74f35e","up":true},{"one":"757a557424c33ad89efd8185ec18d71c025830ecb2aed951e33c8c8d986d5933","other":"26d1af1fbee6541a363ea7707825e37da028142f00779116560ad20f1de18e7b","up":true},{"one":"ebca518e5146f49ac75bcaa8add2ef4d1d22c5cfd2e2326c6b41826d45ce55ae","other":"ed32d74d9be0649de1eb26b9915137fe46ec890c656c96be52e966ab6e2ed260","up":true},{"one":"38ab3d7bdfb293b88122404cb7c50b5fb890ce7664c075da95585557a430c403","other":"7b9242137f8cc2bec7b3e0003fd93026921ceb10dfadbbd5b6aa64d61a74f35e","up":true},{"one":"9e02c5384602a54e900cfa46d5987b77f16e74cba745ac850fcada01c7af9004","other":"957d8a9b412b6f4cd151cbc07b8d74d949880ae665c545debb18181389c99ee6","up":true},{"one":"b16dcdf1ff1a56d49e374531d9885d59c1bcfbb628604520d9b1d84662edb9ca","other":"b92a71a4fc371e0596538a7fb2a33e85329c39c4409c99798d9318bc263a04a1","up":true},{"one":"26d1af1fbee6541a363ea7707825e37da028142f00779116560ad20f1de18e7b","other":"7b9242137f8cc2bec7b3e0003fd93026921ceb10dfadbbd5b6aa64d61a74f35e","up":true},{"one":"772e4c80d128deb52adf024a0eb6fe9bbea1c83351ed93f55f490cd5e5c69260","other":"78cbc19a24d095ab7858849058c65c061c52289b91ddd92cee34bed98aee4a59","up":true},{"one":"4b243a5aeabec6db0e4a80a9c255300cd94591a6fbe0e0aa170da4f6ce14edff","other":"4a1811dd9febde1801a604ad81de84a2d15366d0b5c330f30f3398da0d107824","up":true},{"one":"9a9230b3f7f386520821dee78ebe92e8c64a4f6a50f2639327c62e45cab40563","other":"83dc556ed36f37d06765be2554fe86eaf1ec21e2931fb22403238453bf021dfb","up":true},{"one":"ebca518e5146f49ac75bcaa8add2ef4d1d22c5cfd2e2326c6b41826d45ce55ae","other":"ea0e1dd41fe042b09f273c98f02128949cf5561d20dc04b3d423961efed52327","up":true},{"one":"8b76194f129308324c7d0066530e02cac2410ee0ba952822f0ec866e12461e44","other":"86ca1078dae40f23ae1b3ac47397460d9ec0bf243a0de372b405381d6722fcb2","up":true},{"one":"03907380afcd52238f3d84a8dee3df599c7f2f9b90fbc1271ee88bdb52acbd58","other":"026d2e41b82d506da685a30cce7cc5772f6c1e167b7d557e0531fb9b79dd4ff2","up":true},{"one":"86ca1078dae40f23ae1b3ac47397460d9ec0bf243a0de372b405381d6722fcb2","other":"8cf957bf95a629c60c31dbcfe75ecca149a81c761f8b34858b04f8318e5c74bd","up":true},{"one":"018adc613f78d6ec876274f821251fd049eb3651646cd69e27efe211fe88d936","other":"13bc64535d3ae495098e4ac6b30a91d1804dab0ab79944f2c6ac53c9bccdf62d","up":true},{"one":"86ca1078dae40f23ae1b3ac47397460d9ec0bf243a0de372b405381d6722fcb2","other":"895bdcd200cc4d7ec5c24f1722d0a8ebedda78b78cdf1ccc8c22a981980f5786","up":true},{"one":"026d2e41b82d506da685a30cce7cc5772f6c1e167b7d557e0531fb9b79dd4ff2","other":"0bcf8a8ab0065ca8c85b8b6641f4c6e0b0de60e79ef32ebf6ff8f109ac4e1d70","up":true},{"one":"48b614958a8692780ef5bd5c95e0db4ff67deb4de0dcbb878ca4479bfb86957e","other":"558eb021744be19383be9ac91b9f77e07479e0eb25576bd32a3afaa94c231178","up":true},{"one":"7dc5e8d8180c1bc7ebbee11a47fc96e8fe8b2d71c30cbc4aa1cf99e8eb6afcac","other":"7f87da7ee55b4c8c8f9d55411ff88d3a0b63bfee6a516917d49fa6273fb5b86a","up":true},{"one":"734e029ed25485edd49b93dd9e85b6e7657f860e4ded4bc8a5094f512ae5836b","other":"7f87da7ee55b4c8c8f9d55411ff88d3a0b63bfee6a516917d49fa6273fb5b86a","up":true},{"one":"2459fe9250b3311c86530d00b7a9b8ba57b1b5151c126262e70c55d1e8d37924","other":"757a557424c33ad89efd8185ec18d71c025830ecb2aed951e33c8c8d986d5933","up":true},{"one":"03907380afcd52238f3d84a8dee3df599c7f2f9b90fbc1271ee88bdb52acbd58","other":"018adc613f78d6ec876274f821251fd049eb3651646cd69e27efe211fe88d936","up":true},{"one":"772e4c80d128deb52adf024a0eb6fe9bbea1c83351ed93f55f490cd5e5c69260","other":"7fbc1843e2222e3c8e35a3215d1bbb4d5457d8b9ed33749e07e22f25ba9ee576","up":true},{"one":"c3a1b301bf187fd8326831197d93a0266ac0cc8287b9008631240e2bec9cf337","other":"ca036d1ef9e6ce3654f2d769f16926aa14957193586426489e15539dfa8f7763","up":true},{"one":"7b9242137f8cc2bec7b3e0003fd93026921ceb10dfadbbd5b6aa64d61a74f35e","other":"018adc613f78d6ec876274f821251fd049eb3651646cd69e27efe211fe88d936","up":true},{"one":"c3a1b301bf187fd8326831197d93a0266ac0cc8287b9008631240e2bec9cf337","other":"ce99e9d37111c52e929b187fe201790b1a555dfb8b6b6de54e94df7cc2d43fd4","up":true},{"one":"82f034db88fd26b47c26b95c3f87a1f454ffe4526ae86beb2bb1d8f2c218c25c","other":"89c883d6a85472bda328667e3fd805c70876bc582ca6763ab97ae636b1772be4","up":true},{"one":"4b243a5aeabec6db0e4a80a9c255300cd94591a6fbe0e0aa170da4f6ce14edff","other":"517aa977048247d5d16ad51a286ffac4d8f910733f0578b222201308c32d195e","up":true},{"one":"9d3c79e4a0ac4e5b95aa32545f3b8d86f74594faa237d5c2566cf02fbd60b11a","other":"83dc556ed36f37d06765be2554fe86eaf1ec21e2931fb22403238453bf021dfb","up":true},{"one":"2434c63e7f28b83e7feede7fe68ea99b989f8534f64d63b046733e2f474538f5","other":"7b9242137f8cc2bec7b3e0003fd93026921ceb10dfadbbd5b6aa64d61a74f35e","up":true},{"one":"78cbc19a24d095ab7858849058c65c061c52289b91ddd92cee34bed98aee4a59","other":"73b8d1840d0a8ffe69752ec96f8fddecb0e22726c87982d572ca9acc1c9cdbfc","up":true},{"one":"4cd0f38e52a508f81cf95e1370c994aea2d7a49a2a08e3e054f53629a6619410","other":"4a1811dd9febde1801a604ad81de84a2d15366d0b5c330f30f3398da0d107824","up":true},{"one":"0ff67b0e9ec6509c7786495b7b3ddb176b4f8221ff300f409f00a3d389e8874c","other":"026d2e41b82d506da685a30cce7cc5772f6c1e167b7d557e0531fb9b79dd4ff2","up":true},{"one":"03907380afcd52238f3d84a8dee3df599c7f2f9b90fbc1271ee88bdb52acbd58","other":"06b95f1bac76ca4925d509b06216f2113ac5dcf051ef5aa0a320ae64069e0b6d","up":true},{"one":"042788d5b72cb84a375565d120d239a2b14fdf38b3f5f992284d78535077148a","other":"1929a84bcd64bf002d0afb16249466c5b660123174a1fc1bf881913f8c87d1fd","up":true},{"one":"c3a1b301bf187fd8326831197d93a0266ac0cc8287b9008631240e2bec9cf337","other":"c8e5a1b4533dd0de12acee4d31369f39785178568718b93bbc321ec83e0714f0","up":true},{"one":"78cbc19a24d095ab7858849058c65c061c52289b91ddd92cee34bed98aee4a59","other":"7b9242137f8cc2bec7b3e0003fd93026921ceb10dfadbbd5b6aa64d61a74f35e","up":true},{"one":"8b76194f129308324c7d0066530e02cac2410ee0ba952822f0ec866e12461e44","other":"82f034db88fd26b47c26b95c3f87a1f454ffe4526ae86beb2bb1d8f2c218c25c","up":true},{"one":"7639f9a66e8ff70f554c346faa25f78140957c295b748fc42a12df7972f4fcc6","other":"757a557424c33ad89efd8185ec18d71c025830ecb2aed951e33c8c8d986d5933","up":true},{"one":"4167946de250b013e1be16ee84bfe2ccaae83e699e618b38f31016c4e431e6ba","other":"4b243a5aeabec6db0e4a80a9c255300cd94591a6fbe0e0aa170da4f6ce14edff","up":true},{"one":"f36120ff250b9e7164e96021479332054f67de65cd2fe5b6e34bc51d0fe4d29c","other":"e16b12c708bc5e0545009daed44733c52d7450ccc797d158dd41a3bc9507b6be","up":true},{"one":"f36120ff250b9e7164e96021479332054f67de65cd2fe5b6e34bc51d0fe4d29c","other":"f410d4ac9b748c24fa0d48c3053bb1cea8a67d0bcc4e5fcbdb261c0c7522cc34","up":true},{"one":"a7a61804d270ed6c27a4b1e8a634c30d7cdbaf644a1c67cbc6b08cd849a711db","other":"afa3de5cebc9f96cf20a35058f4856fe43b48ac59cf8e46565f194f438622a52","up":true},{"one":"91eba9f9c8f2929d38f43a0c7efa809c0d2d59a31cbf2760c90e73d20266d528","other":"9ee7b3e06b453615cbd8737cb74515b150f518f1a2eaa2db90e54708dd161b7d","up":true},{"one":"7f87da7ee55b4c8c8f9d55411ff88d3a0b63bfee6a516917d49fa6273fb5b86a","other":"7b9242137f8cc2bec7b3e0003fd93026921ceb10dfadbbd5b6aa64d61a74f35e","up":true},{"one":"78cbc19a24d095ab7858849058c65c061c52289b91ddd92cee34bed98aee4a59","other":"757a557424c33ad89efd8185ec18d71c025830ecb2aed951e33c8c8d986d5933","up":true},{"one":"cfbb9ea682becadeab10bbd080ba8e93510085a87ac519e434964faa222fc275","other":"c8e5a1b4533dd0de12acee4d31369f39785178568718b93bbc321ec83e0714f0","up":true},{"one":"772e4c80d128deb52adf024a0eb6fe9bbea1c83351ed93f55f490cd5e5c69260","other":"7f87da7ee55b4c8c8f9d55411ff88d3a0b63bfee6a516917d49fa6273fb5b86a","up":true},{"one":"89c883d6a85472bda328667e3fd805c70876bc582ca6763ab97ae636b1772be4","other":"8be461203f5ebb5721348f537b37d768f7bd359af3e18d1f7e9af2f901c49845","up":true},{"one":"e77f6aa9e3dfcce0a2e5db794703224249aba60595075b2df9a5b0b30855cf46","other":"e55d8cdb7e7940b11929e7e5c949ef6beb7998e5180a1f0a3c0bf61aef39f1b8","up":true},{"one":"a7a61804d270ed6c27a4b1e8a634c30d7cdbaf644a1c67cbc6b08cd849a711db","other":"ad0d0dc5d4114ee4482d6c9bd4e46683327abf2b92df0d242d79019963876668","up":true},{"one":"7f87da7ee55b4c8c8f9d55411ff88d3a0b63bfee6a516917d49fa6273fb5b86a","other":"757a557424c33ad89efd8185ec18d71c025830ecb2aed951e33c8c8d986d5933","up":true},{"one":"1929a84bcd64bf002d0afb16249466c5b660123174a1fc1bf881913f8c87d1fd","other":"1be4348ec5670cdc4f164d77b1356e7910b6d1be4a9b720e549d02e5482a9e78","up":true},{"one":"0bcf8a8ab0065ca8c85b8b6641f4c6e0b0de60e79ef32ebf6ff8f109ac4e1d70","other":"1be4348ec5670cdc4f164d77b1356e7910b6d1be4a9b720e549d02e5482a9e78","up":true},{"one":"6c82fdabd09e0e9d0fc507613a05951c02b2953d763a062a5f32aaf5cc477c19","other":"6d601952793589bc6b57340c451a6abf02ea2c16637e910eed04cde6eddfe17a","up":true},{"one":"e16b12c708bc5e0545009daed44733c52d7450ccc797d158dd41a3bc9507b6be","other":"f36084048bf0ff985a77f5183796f7b37b7085ee6eea8bbc5fc62558854cce67","up":true},{"one":"6c82fdabd09e0e9d0fc507613a05951c02b2953d763a062a5f32aaf5cc477c19","other":"6c029114a9f73d69a42e591cf2d13107eff038d3eda8abb0242d9d6d169f05c7","up":true},{"one":"b16dcdf1ff1a56d49e374531d9885d59c1bcfbb628604520d9b1d84662edb9ca","other":"b2b9ac0f4db58886597af7b19d6150498ac8ad7c804671628aa34384b8fe505e","up":true},{"one":"78cbc19a24d095ab7858849058c65c061c52289b91ddd92cee34bed98aee4a59","other":"7dc5e8d8180c1bc7ebbee11a47fc96e8fe8b2d71c30cbc4aa1cf99e8eb6afcac","up":true},{"one":"6c82fdabd09e0e9d0fc507613a05951c02b2953d763a062a5f32aaf5cc477c19","other":"6ecb11fc5acc16ecd70351410fa18ec44a2a83d9e778cf25b85a7535493456b7","up":true},{"one":"0ff67b0e9ec6509c7786495b7b3ddb176b4f8221ff300f409f00a3d389e8874c","other":"0ab9845c2890b0a64a3e5932241245e00b817b788094f9ee48f86f80b7264fea","up":true},{"one":"13bc64535d3ae495098e4ac6b30a91d1804dab0ab79944f2c6ac53c9bccdf62d","other":"1be4348ec5670cdc4f164d77b1356e7910b6d1be4a9b720e549d02e5482a9e78","up":true}]} \ No newline at end of file diff --git a/vendor/github.com/ethereum/go-ethereum/swarm/pss/testdata/snapshot_16.json b/vendor/github.com/ethereum/go-ethereum/swarm/pss/testdata/snapshot_16.json deleted file mode 100644 index b6a7bf81..00000000 --- a/vendor/github.com/ethereum/go-ethereum/swarm/pss/testdata/snapshot_16.json +++ /dev/null @@ -1 +0,0 @@ -{"nodes":[{"node":{"info":{"id":"26504cb3d9a12227afdc43065496ccaff7172e4da62aa74d37f271ada3f00dc7","name":"node_26504cb3d9a12227afdc43065496ccaff7172e4da62aa74d37f271ada3f00dc7","enode":"enode://e6b0213542756a047ab018ae745faab8a1c821082dc7bc64d13bee50591b554c10508dc284a7c3e686504bda30edf0ee9d3d5588e926725705014eb57ec321a7@127.0.0.1:0","enr":"0xf88fb840ef67bfea09687245f9a21fbeae2c963d6a827f70953457a32df964dc3fc96f3f1630e241de2d2ba4da049d18c459d2fd798c5be2d6dfbd9290457f678f7628af0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103e6b0213542756a047ab018ae745faab8a1c821082dc7bc64d13bee50591b554c","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"JlBMs9mhIiev3EMGVJbMr/cXLk2mKqdNN/JxraPwDcc=","hive":"\n=========================================================================\nThu Feb 28 17:16:22 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 26504c\npopulation: 9 (15), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 d465 b2f3 | 5 d465 (0) c7c0 (0) ece3 (0) 9ed4 (0)\n001 2 6a51 55bc | 5 689c (0) 6a51 (0) 72d3 (0) 769c (0)\n002 2 0160 0ffa | 2 0ffa (0) 0160 (0)\n============ DEPTH: 3 ==========================================\n003 3 348e 304c 3a9a | 3 3a9a (0) 348e (0) 304c (0)\n004 0 | 0\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"26504cb3d9a12227afdc43065496ccaff7172e4da62aa74d37f271ada3f00dc7","private_key":"1882828490f180d94a676998d372c267a462d3992a1499fdc9535ce176a5a7c0","name":"node_26504cb3d9a12227afdc43065496ccaff7172e4da62aa74d37f271ada3f00dc7","services":["bzz","pss"],"enable_msg_events":true,"port":44851},"up":true}},{"node":{"info":{"id":"b2f3a69d52f98037cfbdc40a529612c890cd4b061bfa87411493df5c6e1eb5d9","name":"node_b2f3a69d52f98037cfbdc40a529612c890cd4b061bfa87411493df5c6e1eb5d9","enode":"enode://f69f214e3a7a9acc20ceac92869db21701e0dfab27365dbf13271def097914735fa4c6e47ff354aa9b04c0c5b1d42f903a55fa8de2490e66627fe1ae1e1f5ff1@127.0.0.1:0","enr":"0xf88fb840aec067e5c9519ed112d73b546bf81054e0afcadfaf54794b42cc67e8ff3f64ae5aba1b9fa38e9916af5117d49d34acbbc6a9fddf6eb4463fc85e8340738bdb490183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103f69f214e3a7a9acc20ceac92869db21701e0dfab27365dbf13271def09791473","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"svOmnVL5gDfPvcQKUpYSyJDNSwYb+odBFJPfXG4etdk=","hive":"\n=========================================================================\nThu Feb 28 17:16:22 UTC 2019 KΛÐΞMLIΛ hive: queen's address: b2f3a6\npopulation: 10 (15), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 55bc 6a51 769c 0160 | 11 689c (0) 6a51 (0) 72d3 (0) 769c (0)\n============ DEPTH: 1 ==========================================\n001 3 d465 c7c0 ece3 | 3 d465 (0) c7c0 (0) ece3 (0)\n002 1 9ed4 | 1 9ed4 (0)\n003 0 | 0\n004 0 | 0\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"b2f3a69d52f98037cfbdc40a529612c890cd4b061bfa87411493df5c6e1eb5d9","private_key":"2bc350f43a600469515791e72c828ea18e25dae28a8eba34ad9123f2b2d0e7b4","name":"node_b2f3a69d52f98037cfbdc40a529612c890cd4b061bfa87411493df5c6e1eb5d9","services":["bzz","pss"],"enable_msg_events":true,"port":46035},"up":true}},{"node":{"info":{"id":"ece30c5ce40c2769973e954bfd87b973a753887f4ab39f2b638a3cb289eca521","name":"node_ece30c5ce40c2769973e954bfd87b973a753887f4ab39f2b638a3cb289eca521","enode":"enode://3f0c7d44d331f144a130eff41ad30fa260c30f29f27b2c6a9ce94dc86ade5a4f1457ff241b4e48f42dab7e3f4d4ed626b22ada5032bb29645c0ab5a6c7ddca61@127.0.0.1:0","enr":"0xf88fb8406aa846ed3e1e91c35a8db13e47424870d976fba32a38ecbbd87fef3f04b0bd5c04ab395313a732a3e5121e0c32768abedb704b835b81713c24e136bdc970d1560183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1033f0c7d44d331f144a130eff41ad30fa260c30f29f27b2c6a9ce94dc86ade5a4f","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"7OMMXOQMJ2mXPpVL/Ye5c6dTiH9Ks58rY4o8sonspSE=","hive":"\n=========================================================================\nThu Feb 28 17:16:22 UTC 2019 KΛÐΞMLIΛ hive: queen's address: ece30c\npopulation: 8 (15), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 689c 72d3 348e 304c | 11 689c (0) 6a51 (0) 72d3 (0) 769c (0)\n001 2 9ed4 b2f3 | 2 9ed4 (0) b2f3 (0)\n============ DEPTH: 2 ==========================================\n002 2 c7c0 d465 | 2 d465 (0) c7c0 (0)\n003 0 | 0\n004 0 | 0\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"ece30c5ce40c2769973e954bfd87b973a753887f4ab39f2b638a3cb289eca521","private_key":"1f5005e874a37bbc0f9f920f3089faf5b0189f3ab1796fa370cb89e58b9517d3","name":"node_ece30c5ce40c2769973e954bfd87b973a753887f4ab39f2b638a3cb289eca521","services":["bzz","pss"],"enable_msg_events":true,"port":41799},"up":true}},{"node":{"info":{"id":"304c18a9ab1f0bc425e1c0d5e82faa43bcb3912a6896ee2126056f80aa599c72","name":"node_304c18a9ab1f0bc425e1c0d5e82faa43bcb3912a6896ee2126056f80aa599c72","enode":"enode://25b34252e979970bc75da4174ee863e64564c2a62367a9f03f9a4806a84cbbfd7154163bc5c765cd9993870ed9f39a862e80e9020638355cedb3f5deb6a5f80f@127.0.0.1:0","enr":"0xf88fb840cfc8be3771521eb84480fed1ead36e67bbdb0acf5db42a3d1ad0f6aba80130bf6bc03592b7ab85cafe0d19266c3b004b2057b042ba69ee8e00c4d569d0193d5c0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10325b34252e979970bc75da4174ee863e64564c2a62367a9f03f9a4806a84cbbfd","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"MEwYqasfC8Ql4cDV6C+qQ7yzkSpolu4hJgVvgKpZnHI=","hive":"\n=========================================================================\nThu Feb 28 17:16:22 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 304c18\npopulation: 9 (15), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 c7c0 ece3 | 5 9ed4 (0) b2f3 (0) d465 (0) c7c0 (0)\n001 2 72d3 769c | 5 769c (0) 72d3 (0) 689c (0) 6a51 (0)\n002 2 0ffa 0160 | 2 0160 (0) 0ffa (0)\n003 1 2650 | 1 2650 (0)\n============ DEPTH: 4 ==========================================\n004 1 3a9a | 1 3a9a (0)\n005 1 348e | 1 348e (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"304c18a9ab1f0bc425e1c0d5e82faa43bcb3912a6896ee2126056f80aa599c72","private_key":"411d5a05b2233c28b2366e3ffc2e67effdd61216f64124ab18ef047fd2d2b6ed","name":"node_304c18a9ab1f0bc425e1c0d5e82faa43bcb3912a6896ee2126056f80aa599c72","services":["bzz","pss"],"enable_msg_events":true,"port":40347},"up":true}},{"node":{"info":{"id":"c7c080ce0b5ec6ede5e00f3b408799519704fb628e8177c1eec2e7aed7f3b1b0","name":"node_c7c080ce0b5ec6ede5e00f3b408799519704fb628e8177c1eec2e7aed7f3b1b0","enode":"enode://f4bb3d33407ed52c3ed7a46a9394efb0907b2ec97d79e08a4cebde9206d7b9f1d7dbfef2c01efc191b2342e7dcfc725015f6d6c639ce8af7ce3f2240c41a3d24@127.0.0.1:0","enr":"0xf88fb840bfa01ff6980a93944637109a5b15621a9bf50a678e6b21a6cb08b903a5db94e770fa89cdb38ab4a7540b4262ad9f2036ee6a3868b6de7a437d5c3c71402f097f0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102f4bb3d33407ed52c3ed7a46a9394efb0907b2ec97d79e08a4cebde9206d7b9f1","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"x8CAzgtexu3l4A87QIeZUZcE+2KOgXfB7sLnrtfzsbA=","hive":"\n=========================================================================\nThu Feb 28 17:16:22 UTC 2019 KΛÐΞMLIΛ hive: queen's address: c7c080\npopulation: 6 (15), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 0ffa 304c | 11 55bc (0) 769c (0) 72d3 (0) 689c (0)\n001 2 9ed4 b2f3 | 2 b2f3 (0) 9ed4 (0)\n============ DEPTH: 2 ==========================================\n002 1 ece3 | 1 ece3 (0)\n003 1 d465 | 1 d465 (0)\n004 0 | 0\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"c7c080ce0b5ec6ede5e00f3b408799519704fb628e8177c1eec2e7aed7f3b1b0","private_key":"8bd7e85f0ac64efbc80d7952b31f33602531d2e9ce2f589ebfbdc66fceadde81","name":"node_c7c080ce0b5ec6ede5e00f3b408799519704fb628e8177c1eec2e7aed7f3b1b0","services":["bzz","pss"],"enable_msg_events":true,"port":46599},"up":true}},{"node":{"info":{"id":"0ffafe08e99119b240f3a1f36ddd3bbddd1f3c3f13e8839d4551e43f7965816a","name":"node_0ffafe08e99119b240f3a1f36ddd3bbddd1f3c3f13e8839d4551e43f7965816a","enode":"enode://99de6da9abebfa76fefdac94de902456d8450886946933b5e9da18e4b0709d7c27109b17d024419e205fa3b2cc50268f330217b105a0a92126e1c1697b593dfd@127.0.0.1:0","enr":"0xf88fb840e1d27e54275610c9979cc6255e9363b42c5e2c746301dc788af52d58e895775e37d99e021fc6f9746aba2070d0e48855e7a4c8f04bee0d96ef8c49c8234f97840183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10399de6da9abebfa76fefdac94de902456d8450886946933b5e9da18e4b0709d7c","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"D/r+COmRGbJA86Hzbd07vd0fPD8T6IOdRVHkP3llgWo=","hive":"\n=========================================================================\nThu Feb 28 17:16:22 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 0ffafe\npopulation: 9 (15), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 9ed4 c7c0 | 5 b2f3 (0) 9ed4 (0) ece3 (0) d465 (0)\n001 2 689c 55bc | 5 55bc (0) 769c (0) 72d3 (0) 689c (0)\n============ DEPTH: 2 ==========================================\n002 4 3a9a 304c 348e 2650 | 4 2650 (0) 3a9a (0) 348e (0) 304c (0)\n003 0 | 0\n004 1 0160 | 1 0160 (0)\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"0ffafe08e99119b240f3a1f36ddd3bbddd1f3c3f13e8839d4551e43f7965816a","private_key":"a19af618fec44371482faf5f2f6366acf984bdaf717c382869e46dc18edea77e","name":"node_0ffafe08e99119b240f3a1f36ddd3bbddd1f3c3f13e8839d4551e43f7965816a","services":["bzz","pss"],"enable_msg_events":true,"port":43693},"up":true}},{"node":{"info":{"id":"9ed40b70e4c72997a6c980f6862d0ae8f366b1be48c77fcfa7965362fb1dd7c6","name":"node_9ed40b70e4c72997a6c980f6862d0ae8f366b1be48c77fcfa7965362fb1dd7c6","enode":"enode://ae0f2a151e99e9e9e54938545cf4f19f56a6a10bbad2f1966661dee90753d398c6771c23d7ee70db1715897e3364a561e38ae3fff21349d579e9abf44dcf8d5f@127.0.0.1:0","enr":"0xf88fb840ff4b95dcfbd61ccc46ca0a798ba8dcaa6cb23ae891ee35cfbdfbfb7811614a8a08192ebcced83a5c6afbf3d95c08b6d5fd18af8d5df806d341ed361398e3554f0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103ae0f2a151e99e9e9e54938545cf4f19f56a6a10bbad2f1966661dee90753d398","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"ntQLcOTHKZemyYD2hi0K6PNmsb5Ix3/Pp5ZTYvsd18Y=","hive":"\n=========================================================================\nThu Feb 28 17:16:22 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 9ed40b\npopulation: 9 (15), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 769c 55bc 3a9a 0160 | 11 55bc (0) 769c (0) 72d3 (0) 689c (0)\n============ DEPTH: 1 ==========================================\n001 3 ece3 c7c0 d465 | 3 ece3 (0) c7c0 (0) d465 (0)\n002 1 b2f3 | 1 b2f3 (0)\n003 0 | 0\n004 0 | 0\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"9ed40b70e4c72997a6c980f6862d0ae8f366b1be48c77fcfa7965362fb1dd7c6","private_key":"d19f0df4bba07418a557ec945ed8c8851ed01e20e7760c72954352862bf77ba6","name":"node_9ed40b70e4c72997a6c980f6862d0ae8f366b1be48c77fcfa7965362fb1dd7c6","services":["bzz","pss"],"enable_msg_events":true,"port":35629},"up":true}},{"node":{"info":{"id":"d46598bfcf4437f88637ca7555730107535f38b419c9cb3533cdc536e196269f","name":"node_d46598bfcf4437f88637ca7555730107535f38b419c9cb3533cdc536e196269f","enode":"enode://338975eb003552bbb837272c2b48a049b7fab8958571e0eb9bc1d1cdc967cbbe42ee93adeed75700391016cf7d311e7d06f48cef371f2b80ff80bfd6a27bd16d@127.0.0.1:0","enr":"0xf88fb840f009eadfddb5e69c6ca89a5d2ba64ee2ec31ebe85623adea4e036e4136f1f4d74d0933a43c9a0bdb66eec46cdbed18bfde269fa892da42d47d2b8bd1b6db3be30183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103338975eb003552bbb837272c2b48a049b7fab8958571e0eb9bc1d1cdc967cbbe","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"1GWYv89EN/iGN8p1VXMBB1NfOLQZycs1M83FNuGWJp8=","hive":"\n=========================================================================\nThu Feb 28 17:16:22 UTC 2019 KΛÐΞMLIΛ hive: queen's address: d46598\npopulation: 9 (15), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 348e 2650 72d3 689c | 11 2650 (0) 3a9a (0) 304c (0) 348e (0)\n001 2 b2f3 9ed4 | 2 b2f3 (0) 9ed4 (0)\n============ DEPTH: 2 ==========================================\n002 1 ece3 | 1 ece3 (0)\n003 1 c7c0 | 1 c7c0 (0)\n004 0 | 0\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"d46598bfcf4437f88637ca7555730107535f38b419c9cb3533cdc536e196269f","private_key":"adccac5625a153c4cca90a971fbe0b7b2f9f62af166fd1fcad0a6559e042e2a5","name":"node_d46598bfcf4437f88637ca7555730107535f38b419c9cb3533cdc536e196269f","services":["bzz","pss"],"enable_msg_events":true,"port":39805},"up":true}},{"node":{"info":{"id":"6a517303172afeb0175ff33f6232daa9c2cf9a3753b9cd973d2e1a1bbb2cd1c8","name":"node_6a517303172afeb0175ff33f6232daa9c2cf9a3753b9cd973d2e1a1bbb2cd1c8","enode":"enode://0fe608947dab328f476e8dd8d94ea391e604adcf4a15901224e32c9a3bc6e198d13751af168e9b31f140ee82d39e29d0f347cd733cd44797abf34ce629c57a75@127.0.0.1:0","enr":"0xf88fb840bf749d25f9054ed9f97df2a3d695fe170ece0e2d67d097756696bf90d2d5c5dd7f67527f9f8368d18843438f769883c32cc76fab8eeb57768a9d66fedd125e800183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1030fe608947dab328f476e8dd8d94ea391e604adcf4a15901224e32c9a3bc6e198","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"alFzAxcq/rAXX/M/YjLaqcLPmjdTuc2XPS4aG7ss0cg=","hive":"\n=========================================================================\nThu Feb 28 17:16:22 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 6a5173\npopulation: 8 (15), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 b2f3 d465 | 5 b2f3 (0) 9ed4 (0) ece3 (0) c7c0 (0)\n001 2 3a9a 2650 | 6 2650 (0) 3a9a (0) 304c (0) 348e (0)\n002 1 55bc | 1 55bc (0)\n============ DEPTH: 3 ==========================================\n003 2 769c 72d3 | 2 769c (0) 72d3 (0)\n004 0 | 0\n005 0 | 0\n006 1 689c | 1 689c (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"6a517303172afeb0175ff33f6232daa9c2cf9a3753b9cd973d2e1a1bbb2cd1c8","private_key":"0ab9fec01ec19b2a335b0ada3a02e30702d90efb1f3c1a0bf2b9cd36a9f87fc9","name":"node_6a517303172afeb0175ff33f6232daa9c2cf9a3753b9cd973d2e1a1bbb2cd1c8","services":["bzz","pss"],"enable_msg_events":true,"port":41555},"up":true}},{"node":{"info":{"id":"689c9a0f57a838468259fe2ee082446ad15c596ef361ba16c2b92b53ddb6ca41","name":"node_689c9a0f57a838468259fe2ee082446ad15c596ef361ba16c2b92b53ddb6ca41","enode":"enode://9e1aac08a4928876280c211e71ffd510eeb78fbebff4ac254af5a302f8913cf798a0f55a79b99735f8a01dc4adc39428659649437d1bb0b88d3383e6b7ad7104@127.0.0.1:0","enr":"0xf88fb8402129c2f1dadb690035ffe0776862b987152c612355ed44a6927c7402b5801fe05b2d540e5e19afb63be6e975809af1bcc385286bad2dd92baacec2f7931386680183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1029e1aac08a4928876280c211e71ffd510eeb78fbebff4ac254af5a302f8913cf7","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"aJyaD1eoOEaCWf4u4IJEatFcWW7zYboWwrkrU922ykE=","hive":"\n=========================================================================\nThu Feb 28 17:16:22 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 689c9a\npopulation: 8 (15), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 d465 ece3 | 5 ece3 (0) d465 (0) c7c0 (0) b2f3 (0)\n001 2 0160 0ffa | 6 0ffa (0) 0160 (0) 2650 (0) 3a9a (0)\n002 1 55bc | 1 55bc (0)\n============ DEPTH: 3 ==========================================\n003 2 769c 72d3 | 2 769c (0) 72d3 (0)\n004 0 | 0\n005 0 | 0\n006 1 6a51 | 1 6a51 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"689c9a0f57a838468259fe2ee082446ad15c596ef361ba16c2b92b53ddb6ca41","private_key":"31c956ed431b0b0f061c15e1263dbf111de4a9f4dd5335680fa9f64c0821fa0b","name":"node_689c9a0f57a838468259fe2ee082446ad15c596ef361ba16c2b92b53ddb6ca41","services":["bzz","pss"],"enable_msg_events":true,"port":36247},"up":true}},{"node":{"info":{"id":"72d3d1448858e393103d1bd294093de0ebf3ec8a8b4d3b47fa6986adb55c52b2","name":"node_72d3d1448858e393103d1bd294093de0ebf3ec8a8b4d3b47fa6986adb55c52b2","enode":"enode://d21eb565193ce78749091397af418bba7c9b152f3ccf4199e17df26bd700459fbb87ada766a3cdea29a1fdf9656b6b1372948fcc2eb030dc879b029bdd6b04e5@127.0.0.1:0","enr":"0xf88fb840f89a9aa64661b1f4d6ac8e6aab664af27a58b08bcc3c43066d458d99dcf75bc6536c7326631a031ff2b89404eedfbe566a8beea5d3eb0e0865b206d8ea25bc070183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103d21eb565193ce78749091397af418bba7c9b152f3ccf4199e17df26bd700459f","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"ctPRRIhY45MQPRvSlAk94Ovz7IqLTTtH+mmGrbVcUrI=","hive":"\n=========================================================================\nThu Feb 28 17:16:22 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 72d3d1\npopulation: 8 (15), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 d465 ece3 | 5 ece3 (0) d465 (0) c7c0 (0) b2f3 (0)\n001 2 304c 348e | 6 0ffa (0) 0160 (0) 2650 (0) 3a9a (0)\n002 1 55bc | 1 55bc (0)\n============ DEPTH: 3 ==========================================\n003 2 6a51 689c | 2 6a51 (0) 689c (0)\n004 0 | 0\n005 1 769c | 1 769c (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"72d3d1448858e393103d1bd294093de0ebf3ec8a8b4d3b47fa6986adb55c52b2","private_key":"278c5f54c5e9f2d2688383f0a5f98b72a01d76b532799a74162c2f169d8a4819","name":"node_72d3d1448858e393103d1bd294093de0ebf3ec8a8b4d3b47fa6986adb55c52b2","services":["bzz","pss"],"enable_msg_events":true,"port":36181},"up":true}},{"node":{"info":{"id":"348e9351b10625a6a2fe044e67697cd54ce57c86da2570459ecb79d4acb86f32","name":"node_348e9351b10625a6a2fe044e67697cd54ce57c86da2570459ecb79d4acb86f32","enode":"enode://5b1fa3f55ee9c0fd34bf203045faf80d0a8fcded75c21a9a319fe6d628698f8aa78c60d5d78df5b3c54c29fd27f10be4a63c66895cc743e1a0cbe795e87114ca@127.0.0.1:0","enr":"0xf88fb84017bd33bdfe5b6e2c263ef3e95f0acaf1a4e902e79b4cfbe40e6ad57b4f9b21e019473a61a57e1b999ce432c288a6c8fa685df4afd8872c98757be969446b1ff60183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1025b1fa3f55ee9c0fd34bf203045faf80d0a8fcded75c21a9a319fe6d628698f8a","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"NI6TUbEGJaai/gROZ2l81UzlfIbaJXBFnst51Ky4bzI=","hive":"\n=========================================================================\nThu Feb 28 17:16:22 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 348e93\npopulation: 9 (15), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 d465 ece3 | 5 ece3 (0) d465 (0) c7c0 (0) b2f3 (0)\n001 2 55bc 72d3 | 5 55bc (0) 6a51 (0) 689c (0) 769c (0)\n002 2 0160 0ffa | 2 0ffa (0) 0160 (0)\n003 1 2650 | 1 2650 (0)\n============ DEPTH: 4 ==========================================\n004 1 3a9a | 1 3a9a (0)\n005 1 304c | 1 304c (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"348e9351b10625a6a2fe044e67697cd54ce57c86da2570459ecb79d4acb86f32","private_key":"fdb4b30d8d9482f9581193c6f6b57e5213922001901c46407528810f0e598058","name":"node_348e9351b10625a6a2fe044e67697cd54ce57c86da2570459ecb79d4acb86f32","services":["bzz","pss"],"enable_msg_events":true,"port":37669},"up":true}},{"node":{"info":{"id":"3a9a3b38d0dcd4845f89d7091b82f5f675fc3557d09979c40ffc12a7bbbfe414","name":"node_3a9a3b38d0dcd4845f89d7091b82f5f675fc3557d09979c40ffc12a7bbbfe414","enode":"enode://90143f4ad7bfd6cc2ba948ab8de4587aa7a2948de5b096c65ef276f04ff7c4aa4e043e0add0734c668c1f8c59e7d4294d2bb2bde96490ce04ce95eaaadb4bab3@127.0.0.1:0","enr":"0xf88fb84090f225e54c8dff490b8cdfbcf4d956adc2125d2bd2b2c98c090d6d6775ad78ed3cc047b26c655c81bedff72ccfdeecca053020666d23c3342a27b7ffc339dff30183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10390143f4ad7bfd6cc2ba948ab8de4587aa7a2948de5b096c65ef276f04ff7c4aa","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"Opo7ONDc1IRfidcJG4L19nX8NVfQmXnED/wSp7u/5BQ=","hive":"\n=========================================================================\nThu Feb 28 17:16:22 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 3a9a3b\npopulation: 10 (15), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 9ed4 b2f3 | 5 b2f3 (0) 9ed4 (0) d465 (0) c7c0 (0)\n001 3 55bc 6a51 769c | 5 55bc (0) 6a51 (0) 689c (0) 769c (0)\n002 2 0ffa 0160 | 2 0ffa (0) 0160 (0)\n003 1 2650 | 1 2650 (0)\n============ DEPTH: 4 ==========================================\n004 2 304c 348e | 2 304c (0) 348e (0)\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"3a9a3b38d0dcd4845f89d7091b82f5f675fc3557d09979c40ffc12a7bbbfe414","private_key":"8affc7f653083f993524996d8a2de34d88ba748c3485d4cd721ce02207edacae","name":"node_3a9a3b38d0dcd4845f89d7091b82f5f675fc3557d09979c40ffc12a7bbbfe414","services":["bzz","pss"],"enable_msg_events":true,"port":46571},"up":true}},{"node":{"info":{"id":"769c948d795d13195f3361af6af6bdb76fdd66ed3db796ccec104f7dc21fefa0","name":"node_769c948d795d13195f3361af6af6bdb76fdd66ed3db796ccec104f7dc21fefa0","enode":"enode://c1b9d33acbb2c9146cad2b1ff6786740ae264aad8c633fdeead6fc07a584de39e78116f9790d1b88e80590ba6a40b0dba329474f371d2001205f9b5cfcd7e1e3@127.0.0.1:0","enr":"0xf88fb840678a2b8e8007983d072232c0a39be22bad2ab19c2a8010bc814b74e7c1d40edd0169d827cb6191c5b4ed4d7079a6cad6163b76a826017bf524f74655b92d26320183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103c1b9d33acbb2c9146cad2b1ff6786740ae264aad8c633fdeead6fc07a584de39","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"dpyUjXldExlfM2Gvava9t2/dZu09t5bM7BBPfcIf76A=","hive":"\n=========================================================================\nThu Feb 28 17:16:22 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 769c94\npopulation: 9 (15), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 9ed4 b2f3 | 5 b2f3 (0) 9ed4 (0) d465 (0) c7c0 (0)\n001 3 0160 304c 3a9a | 6 0ffa (0) 0160 (0) 2650 (0) 304c (0)\n002 1 55bc | 1 55bc (0)\n============ DEPTH: 3 ==========================================\n003 2 6a51 689c | 2 6a51 (0) 689c (0)\n004 0 | 0\n005 1 72d3 | 1 72d3 (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"769c948d795d13195f3361af6af6bdb76fdd66ed3db796ccec104f7dc21fefa0","private_key":"dbc7392e8eb09f40ef0971a14aa3db440d1a125b32876942e60f8582ad70c046","name":"node_769c948d795d13195f3361af6af6bdb76fdd66ed3db796ccec104f7dc21fefa0","services":["bzz","pss"],"enable_msg_events":true,"port":35637},"up":true}},{"node":{"info":{"id":"0160436a4791d77bf7ed9c982288a7f5ec7a1a0d28f61f67eae8dc656c6272c4","name":"node_0160436a4791d77bf7ed9c982288a7f5ec7a1a0d28f61f67eae8dc656c6272c4","enode":"enode://e7237f8772dd77b211f061e619e63fac712395256ff49128a7152f1bfc4ba15fe7b9339c51e2f98e0824faec48ae462e6a340f94c11ff1d32e692aac18a63c07@127.0.0.1:0","enr":"0xf88fb84013c8bd0c52cc1d01e9d8a1394b7be84bc47f042841d0073347d93646bf6a3d266c3fd3dc41ac81c04d6b2027a7aa4d2688270827ab197f79a29e426130530c7a0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103e7237f8772dd77b211f061e619e63fac712395256ff49128a7152f1bfc4ba15f","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"AWBDakeR13v37ZyYIoin9ex6Gg0o9h9n6ujcZWxicsQ=","hive":"\n=========================================================================\nThu Feb 28 17:16:22 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 016043\npopulation: 10 (15), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 9ed4 b2f3 | 5 b2f3 (0) 9ed4 (0) d465 (0) c7c0 (0)\n001 3 689c 769c 55bc | 5 6a51 (0) 689c (0) 72d3 (0) 769c (0)\n============ DEPTH: 2 ==========================================\n002 4 2650 3a9a 348e 304c | 4 3a9a (0) 348e (0) 304c (0) 2650 (0)\n003 0 | 0\n004 1 0ffa | 1 0ffa (0)\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"0160436a4791d77bf7ed9c982288a7f5ec7a1a0d28f61f67eae8dc656c6272c4","private_key":"bec59ef09d2194c27ec1b844af85605ac08c87830784fab76b080d3420c06898","name":"node_0160436a4791d77bf7ed9c982288a7f5ec7a1a0d28f61f67eae8dc656c6272c4","services":["bzz","pss"],"enable_msg_events":true,"port":45829},"up":true}},{"node":{"info":{"id":"55bcbf1392d0cd778286a21c97a2d22a7e4a2494c197147c39f5c2f24d4fba12","name":"node_55bcbf1392d0cd778286a21c97a2d22a7e4a2494c197147c39f5c2f24d4fba12","enode":"enode://2de6037913178726275c8ef050e0dae981406aa551fea37112bdb34d1a403bb5f86fe8cbb04732fbde1f0f362bba71bc6499c16b59fab0f7f0d6f1c0c1d103d6@127.0.0.1:0","enr":"0xf88fb84002914870f5ffed74456e9316ad731fc2686c9a0189c095584882392fe59512a56195aeeabfbb7fd0f7615cfa429568a033dc0447bc5d1a34ba2a05ad8bb762c30183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1022de6037913178726275c8ef050e0dae981406aa551fea37112bdb34d1a403bb5","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"Vby/E5LQzXeChqIcl6LSKn5KJJTBlxR8OfXC8k1PuhI=","hive":"\n=========================================================================\nThu Feb 28 17:16:22 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 55bcbf\npopulation: 11 (15), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 9ed4 b2f3 | 5 b2f3 (0) 9ed4 (0) d465 (0) c7c0 (0)\n001 5 348e 3a9a 2650 0ffa | 6 3a9a (0) 348e (0) 304c (0) 2650 (0)\n============ DEPTH: 2 ==========================================\n002 4 769c 72d3 689c 6a51 | 4 6a51 (0) 689c (0) 72d3 (0) 769c (0)\n003 0 | 0\n004 0 | 0\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"55bcbf1392d0cd778286a21c97a2d22a7e4a2494c197147c39f5c2f24d4fba12","private_key":"ba62b88bff913813741dd50c907c918e974132dcde3c6f57ea49a0bb1ce5cd26","name":"node_55bcbf1392d0cd778286a21c97a2d22a7e4a2494c197147c39f5c2f24d4fba12","services":["bzz","pss"],"enable_msg_events":true,"port":39363},"up":true}}],"conns":[{"one":"26504cb3d9a12227afdc43065496ccaff7172e4da62aa74d37f271ada3f00dc7","other":"b2f3a69d52f98037cfbdc40a529612c890cd4b061bfa87411493df5c6e1eb5d9","up":true},{"one":"b2f3a69d52f98037cfbdc40a529612c890cd4b061bfa87411493df5c6e1eb5d9","other":"ece30c5ce40c2769973e954bfd87b973a753887f4ab39f2b638a3cb289eca521","up":true},{"one":"ece30c5ce40c2769973e954bfd87b973a753887f4ab39f2b638a3cb289eca521","other":"304c18a9ab1f0bc425e1c0d5e82faa43bcb3912a6896ee2126056f80aa599c72","up":true},{"one":"304c18a9ab1f0bc425e1c0d5e82faa43bcb3912a6896ee2126056f80aa599c72","other":"c7c080ce0b5ec6ede5e00f3b408799519704fb628e8177c1eec2e7aed7f3b1b0","up":true},{"one":"c7c080ce0b5ec6ede5e00f3b408799519704fb628e8177c1eec2e7aed7f3b1b0","other":"0ffafe08e99119b240f3a1f36ddd3bbddd1f3c3f13e8839d4551e43f7965816a","up":true},{"one":"0ffafe08e99119b240f3a1f36ddd3bbddd1f3c3f13e8839d4551e43f7965816a","other":"9ed40b70e4c72997a6c980f6862d0ae8f366b1be48c77fcfa7965362fb1dd7c6","up":true},{"one":"9ed40b70e4c72997a6c980f6862d0ae8f366b1be48c77fcfa7965362fb1dd7c6","other":"d46598bfcf4437f88637ca7555730107535f38b419c9cb3533cdc536e196269f","up":true},{"one":"d46598bfcf4437f88637ca7555730107535f38b419c9cb3533cdc536e196269f","other":"6a517303172afeb0175ff33f6232daa9c2cf9a3753b9cd973d2e1a1bbb2cd1c8","up":true},{"one":"6a517303172afeb0175ff33f6232daa9c2cf9a3753b9cd973d2e1a1bbb2cd1c8","other":"689c9a0f57a838468259fe2ee082446ad15c596ef361ba16c2b92b53ddb6ca41","up":true},{"one":"689c9a0f57a838468259fe2ee082446ad15c596ef361ba16c2b92b53ddb6ca41","other":"72d3d1448858e393103d1bd294093de0ebf3ec8a8b4d3b47fa6986adb55c52b2","up":true},{"one":"72d3d1448858e393103d1bd294093de0ebf3ec8a8b4d3b47fa6986adb55c52b2","other":"348e9351b10625a6a2fe044e67697cd54ce57c86da2570459ecb79d4acb86f32","up":true},{"one":"348e9351b10625a6a2fe044e67697cd54ce57c86da2570459ecb79d4acb86f32","other":"3a9a3b38d0dcd4845f89d7091b82f5f675fc3557d09979c40ffc12a7bbbfe414","up":true},{"one":"3a9a3b38d0dcd4845f89d7091b82f5f675fc3557d09979c40ffc12a7bbbfe414","other":"769c948d795d13195f3361af6af6bdb76fdd66ed3db796ccec104f7dc21fefa0","up":true},{"one":"769c948d795d13195f3361af6af6bdb76fdd66ed3db796ccec104f7dc21fefa0","other":"0160436a4791d77bf7ed9c982288a7f5ec7a1a0d28f61f67eae8dc656c6272c4","up":true},{"one":"0160436a4791d77bf7ed9c982288a7f5ec7a1a0d28f61f67eae8dc656c6272c4","other":"55bcbf1392d0cd778286a21c97a2d22a7e4a2494c197147c39f5c2f24d4fba12","up":true},{"one":"55bcbf1392d0cd778286a21c97a2d22a7e4a2494c197147c39f5c2f24d4fba12","other":"26504cb3d9a12227afdc43065496ccaff7172e4da62aa74d37f271ada3f00dc7","up":true},{"one":"0ffafe08e99119b240f3a1f36ddd3bbddd1f3c3f13e8839d4551e43f7965816a","other":"55bcbf1392d0cd778286a21c97a2d22a7e4a2494c197147c39f5c2f24d4fba12","up":true},{"one":"b2f3a69d52f98037cfbdc40a529612c890cd4b061bfa87411493df5c6e1eb5d9","other":"9ed40b70e4c72997a6c980f6862d0ae8f366b1be48c77fcfa7965362fb1dd7c6","up":true},{"one":"72d3d1448858e393103d1bd294093de0ebf3ec8a8b4d3b47fa6986adb55c52b2","other":"ece30c5ce40c2769973e954bfd87b973a753887f4ab39f2b638a3cb289eca521","up":true},{"one":"ece30c5ce40c2769973e954bfd87b973a753887f4ab39f2b638a3cb289eca521","other":"d46598bfcf4437f88637ca7555730107535f38b419c9cb3533cdc536e196269f","up":true},{"one":"c7c080ce0b5ec6ede5e00f3b408799519704fb628e8177c1eec2e7aed7f3b1b0","other":"b2f3a69d52f98037cfbdc40a529612c890cd4b061bfa87411493df5c6e1eb5d9","up":true},{"one":"304c18a9ab1f0bc425e1c0d5e82faa43bcb3912a6896ee2126056f80aa599c72","other":"769c948d795d13195f3361af6af6bdb76fdd66ed3db796ccec104f7dc21fefa0","up":true},{"one":"348e9351b10625a6a2fe044e67697cd54ce57c86da2570459ecb79d4acb86f32","other":"ece30c5ce40c2769973e954bfd87b973a753887f4ab39f2b638a3cb289eca521","up":true},{"one":"689c9a0f57a838468259fe2ee082446ad15c596ef361ba16c2b92b53ddb6ca41","other":"ece30c5ce40c2769973e954bfd87b973a753887f4ab39f2b638a3cb289eca521","up":true},{"one":"6a517303172afeb0175ff33f6232daa9c2cf9a3753b9cd973d2e1a1bbb2cd1c8","other":"26504cb3d9a12227afdc43065496ccaff7172e4da62aa74d37f271ada3f00dc7","up":true},{"one":"26504cb3d9a12227afdc43065496ccaff7172e4da62aa74d37f271ada3f00dc7","other":"0ffafe08e99119b240f3a1f36ddd3bbddd1f3c3f13e8839d4551e43f7965816a","up":true},{"one":"769c948d795d13195f3361af6af6bdb76fdd66ed3db796ccec104f7dc21fefa0","other":"b2f3a69d52f98037cfbdc40a529612c890cd4b061bfa87411493df5c6e1eb5d9","up":true},{"one":"0160436a4791d77bf7ed9c982288a7f5ec7a1a0d28f61f67eae8dc656c6272c4","other":"b2f3a69d52f98037cfbdc40a529612c890cd4b061bfa87411493df5c6e1eb5d9","up":true},{"one":"55bcbf1392d0cd778286a21c97a2d22a7e4a2494c197147c39f5c2f24d4fba12","other":"b2f3a69d52f98037cfbdc40a529612c890cd4b061bfa87411493df5c6e1eb5d9","up":true},{"one":"3a9a3b38d0dcd4845f89d7091b82f5f675fc3557d09979c40ffc12a7bbbfe414","other":"b2f3a69d52f98037cfbdc40a529612c890cd4b061bfa87411493df5c6e1eb5d9","up":true},{"one":"b2f3a69d52f98037cfbdc40a529612c890cd4b061bfa87411493df5c6e1eb5d9","other":"d46598bfcf4437f88637ca7555730107535f38b419c9cb3533cdc536e196269f","up":true},{"one":"26504cb3d9a12227afdc43065496ccaff7172e4da62aa74d37f271ada3f00dc7","other":"3a9a3b38d0dcd4845f89d7091b82f5f675fc3557d09979c40ffc12a7bbbfe414","up":true},{"one":"9ed40b70e4c72997a6c980f6862d0ae8f366b1be48c77fcfa7965362fb1dd7c6","other":"55bcbf1392d0cd778286a21c97a2d22a7e4a2494c197147c39f5c2f24d4fba12","up":true},{"one":"304c18a9ab1f0bc425e1c0d5e82faa43bcb3912a6896ee2126056f80aa599c72","other":"0160436a4791d77bf7ed9c982288a7f5ec7a1a0d28f61f67eae8dc656c6272c4","up":true},{"one":"6a517303172afeb0175ff33f6232daa9c2cf9a3753b9cd973d2e1a1bbb2cd1c8","other":"55bcbf1392d0cd778286a21c97a2d22a7e4a2494c197147c39f5c2f24d4fba12","up":true},{"one":"0160436a4791d77bf7ed9c982288a7f5ec7a1a0d28f61f67eae8dc656c6272c4","other":"0ffafe08e99119b240f3a1f36ddd3bbddd1f3c3f13e8839d4551e43f7965816a","up":true},{"one":"ece30c5ce40c2769973e954bfd87b973a753887f4ab39f2b638a3cb289eca521","other":"9ed40b70e4c72997a6c980f6862d0ae8f366b1be48c77fcfa7965362fb1dd7c6","up":true},{"one":"348e9351b10625a6a2fe044e67697cd54ce57c86da2570459ecb79d4acb86f32","other":"0ffafe08e99119b240f3a1f36ddd3bbddd1f3c3f13e8839d4551e43f7965816a","up":true},{"one":"c7c080ce0b5ec6ede5e00f3b408799519704fb628e8177c1eec2e7aed7f3b1b0","other":"ece30c5ce40c2769973e954bfd87b973a753887f4ab39f2b638a3cb289eca521","up":true},{"one":"0160436a4791d77bf7ed9c982288a7f5ec7a1a0d28f61f67eae8dc656c6272c4","other":"3a9a3b38d0dcd4845f89d7091b82f5f675fc3557d09979c40ffc12a7bbbfe414","up":true},{"one":"72d3d1448858e393103d1bd294093de0ebf3ec8a8b4d3b47fa6986adb55c52b2","other":"55bcbf1392d0cd778286a21c97a2d22a7e4a2494c197147c39f5c2f24d4fba12","up":true},{"one":"689c9a0f57a838468259fe2ee082446ad15c596ef361ba16c2b92b53ddb6ca41","other":"0ffafe08e99119b240f3a1f36ddd3bbddd1f3c3f13e8839d4551e43f7965816a","up":true},{"one":"769c948d795d13195f3361af6af6bdb76fdd66ed3db796ccec104f7dc21fefa0","other":"55bcbf1392d0cd778286a21c97a2d22a7e4a2494c197147c39f5c2f24d4fba12","up":true},{"one":"d46598bfcf4437f88637ca7555730107535f38b419c9cb3533cdc536e196269f","other":"c7c080ce0b5ec6ede5e00f3b408799519704fb628e8177c1eec2e7aed7f3b1b0","up":true},{"one":"3a9a3b38d0dcd4845f89d7091b82f5f675fc3557d09979c40ffc12a7bbbfe414","other":"0ffafe08e99119b240f3a1f36ddd3bbddd1f3c3f13e8839d4551e43f7965816a","up":true},{"one":"c7c080ce0b5ec6ede5e00f3b408799519704fb628e8177c1eec2e7aed7f3b1b0","other":"9ed40b70e4c72997a6c980f6862d0ae8f366b1be48c77fcfa7965362fb1dd7c6","up":true},{"one":"26504cb3d9a12227afdc43065496ccaff7172e4da62aa74d37f271ada3f00dc7","other":"d46598bfcf4437f88637ca7555730107535f38b419c9cb3533cdc536e196269f","up":true},{"one":"55bcbf1392d0cd778286a21c97a2d22a7e4a2494c197147c39f5c2f24d4fba12","other":"689c9a0f57a838468259fe2ee082446ad15c596ef361ba16c2b92b53ddb6ca41","up":true},{"one":"304c18a9ab1f0bc425e1c0d5e82faa43bcb3912a6896ee2126056f80aa599c72","other":"26504cb3d9a12227afdc43065496ccaff7172e4da62aa74d37f271ada3f00dc7","up":true},{"one":"304c18a9ab1f0bc425e1c0d5e82faa43bcb3912a6896ee2126056f80aa599c72","other":"0ffafe08e99119b240f3a1f36ddd3bbddd1f3c3f13e8839d4551e43f7965816a","up":true},{"one":"769c948d795d13195f3361af6af6bdb76fdd66ed3db796ccec104f7dc21fefa0","other":"6a517303172afeb0175ff33f6232daa9c2cf9a3753b9cd973d2e1a1bbb2cd1c8","up":true},{"one":"72d3d1448858e393103d1bd294093de0ebf3ec8a8b4d3b47fa6986adb55c52b2","other":"769c948d795d13195f3361af6af6bdb76fdd66ed3db796ccec104f7dc21fefa0","up":true},{"one":"0160436a4791d77bf7ed9c982288a7f5ec7a1a0d28f61f67eae8dc656c6272c4","other":"9ed40b70e4c72997a6c980f6862d0ae8f366b1be48c77fcfa7965362fb1dd7c6","up":true},{"one":"348e9351b10625a6a2fe044e67697cd54ce57c86da2570459ecb79d4acb86f32","other":"26504cb3d9a12227afdc43065496ccaff7172e4da62aa74d37f271ada3f00dc7","up":true},{"one":"3a9a3b38d0dcd4845f89d7091b82f5f675fc3557d09979c40ffc12a7bbbfe414","other":"9ed40b70e4c72997a6c980f6862d0ae8f366b1be48c77fcfa7965362fb1dd7c6","up":true},{"one":"304c18a9ab1f0bc425e1c0d5e82faa43bcb3912a6896ee2126056f80aa599c72","other":"3a9a3b38d0dcd4845f89d7091b82f5f675fc3557d09979c40ffc12a7bbbfe414","up":true},{"one":"26504cb3d9a12227afdc43065496ccaff7172e4da62aa74d37f271ada3f00dc7","other":"0160436a4791d77bf7ed9c982288a7f5ec7a1a0d28f61f67eae8dc656c6272c4","up":true},{"one":"348e9351b10625a6a2fe044e67697cd54ce57c86da2570459ecb79d4acb86f32","other":"304c18a9ab1f0bc425e1c0d5e82faa43bcb3912a6896ee2126056f80aa599c72","up":true},{"one":"72d3d1448858e393103d1bd294093de0ebf3ec8a8b4d3b47fa6986adb55c52b2","other":"d46598bfcf4437f88637ca7555730107535f38b419c9cb3533cdc536e196269f","up":true},{"one":"689c9a0f57a838468259fe2ee082446ad15c596ef361ba16c2b92b53ddb6ca41","other":"769c948d795d13195f3361af6af6bdb76fdd66ed3db796ccec104f7dc21fefa0","up":true},{"one":"689c9a0f57a838468259fe2ee082446ad15c596ef361ba16c2b92b53ddb6ca41","other":"d46598bfcf4437f88637ca7555730107535f38b419c9cb3533cdc536e196269f","up":true},{"one":"6a517303172afeb0175ff33f6232daa9c2cf9a3753b9cd973d2e1a1bbb2cd1c8","other":"72d3d1448858e393103d1bd294093de0ebf3ec8a8b4d3b47fa6986adb55c52b2","up":true},{"one":"0160436a4791d77bf7ed9c982288a7f5ec7a1a0d28f61f67eae8dc656c6272c4","other":"348e9351b10625a6a2fe044e67697cd54ce57c86da2570459ecb79d4acb86f32","up":true},{"one":"3a9a3b38d0dcd4845f89d7091b82f5f675fc3557d09979c40ffc12a7bbbfe414","other":"55bcbf1392d0cd778286a21c97a2d22a7e4a2494c197147c39f5c2f24d4fba12","up":true},{"one":"304c18a9ab1f0bc425e1c0d5e82faa43bcb3912a6896ee2126056f80aa599c72","other":"72d3d1448858e393103d1bd294093de0ebf3ec8a8b4d3b47fa6986adb55c52b2","up":true},{"one":"6a517303172afeb0175ff33f6232daa9c2cf9a3753b9cd973d2e1a1bbb2cd1c8","other":"b2f3a69d52f98037cfbdc40a529612c890cd4b061bfa87411493df5c6e1eb5d9","up":true},{"one":"689c9a0f57a838468259fe2ee082446ad15c596ef361ba16c2b92b53ddb6ca41","other":"0160436a4791d77bf7ed9c982288a7f5ec7a1a0d28f61f67eae8dc656c6272c4","up":true},{"one":"348e9351b10625a6a2fe044e67697cd54ce57c86da2570459ecb79d4acb86f32","other":"d46598bfcf4437f88637ca7555730107535f38b419c9cb3533cdc536e196269f","up":true},{"one":"769c948d795d13195f3361af6af6bdb76fdd66ed3db796ccec104f7dc21fefa0","other":"9ed40b70e4c72997a6c980f6862d0ae8f366b1be48c77fcfa7965362fb1dd7c6","up":true},{"one":"6a517303172afeb0175ff33f6232daa9c2cf9a3753b9cd973d2e1a1bbb2cd1c8","other":"3a9a3b38d0dcd4845f89d7091b82f5f675fc3557d09979c40ffc12a7bbbfe414","up":true},{"one":"348e9351b10625a6a2fe044e67697cd54ce57c86da2570459ecb79d4acb86f32","other":"55bcbf1392d0cd778286a21c97a2d22a7e4a2494c197147c39f5c2f24d4fba12","up":true}]} \ No newline at end of file diff --git a/vendor/github.com/ethereum/go-ethereum/swarm/pss/testdata/snapshot_2.json b/vendor/github.com/ethereum/go-ethereum/swarm/pss/testdata/snapshot_2.json deleted file mode 100644 index 8be6e0dc..00000000 --- a/vendor/github.com/ethereum/go-ethereum/swarm/pss/testdata/snapshot_2.json +++ /dev/null @@ -1 +0,0 @@ -{"nodes":[{"node":{"info":{"id":"fd37e45210ddb36f8b5ecef9c9d9d3f8201ba9523bfd6a70291333cf3b9207e1","name":"node_fd37e45210ddb36f8b5ecef9c9d9d3f8201ba9523bfd6a70291333cf3b9207e1","enode":"enode://6a7dd306ace8a106c3b86ac6b0cd6eeccde4a9af5090ca4a6d1054787f9757875b6b8d02f88fafe3fd7f20f0349a0060ace7c0be1d65470e736a3319431b5c14@127.0.0.1:0","enr":"0xf88fb84096f5dd9030fc74da3701ef7b06dfe4d44068118f8041a728876904d70fa8c88c20df197c343522c76d75d3a12507c567213c13b46a94ed4800f47474643f4ee70183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1026a7dd306ace8a106c3b86ac6b0cd6eeccde4a9af5090ca4a6d1054787f975787","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"/TfkUhDds2+LXs75ydnT+CAbqVI7/WpwKRMzzzuSB+E=","hive":"\n=========================================================================\nThu Feb 28 17:15:44 UTC 2019 KΛÐΞMLIΛ hive: queen's address: fd37e4\npopulation: 2 (2), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n============ DEPTH: 0 ==========================================\n000 1 3594 | 1 3594 (0)\n001 0 | 0\n002 1 cb08 | 1 cb08 (0)\n003 0 | 0\n004 0 | 0\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"fd37e45210ddb36f8b5ecef9c9d9d3f8201ba9523bfd6a70291333cf3b9207e1","private_key":"6a02f87b1d13a15ce24bfa58456af8aaabdcf8cb58b9f86c19ab14c721c80f91","name":"node_fd37e45210ddb36f8b5ecef9c9d9d3f8201ba9523bfd6a70291333cf3b9207e1","services":["bzz","pss"],"enable_msg_events":true,"port":39341},"up":true}},{"node":{"info":{"id":"3594438a7480a5c3dc06440e28a16044c0c7d289219da02f9e41da1810827805","name":"node_3594438a7480a5c3dc06440e28a16044c0c7d289219da02f9e41da1810827805","enode":"enode://0972df8ba2504ddc155739320ab392e64d000c950e08ce42863449bc4757dd03397efbad98888f8d740b7cf55c357d1d6d74b5e8cb935f71b19e0e16ceef03f9@127.0.0.1:0","enr":"0xf88fb840d5f39b1ebcd5b616ef67b1c0239ed4501ef45c6a00e5bd8cd3f2ac88870d4c4b6ce4a4af820afab9a714d99a5fef53ec3c042fc3243f403819bcfb3504c2150d0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1030972df8ba2504ddc155739320ab392e64d000c950e08ce42863449bc4757dd03","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"NZRDinSApcPcBkQOKKFgRMDH0okhnaAvnkHaGBCCeAU=","hive":"\n=========================================================================\nThu Feb 28 17:15:44 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 359443\npopulation: 2 (2), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n============ DEPTH: 0 ==========================================\n000 2 fd37 cb08 | 2 fd37 (0) cb08 (0)\n001 0 | 0\n002 0 | 0\n003 0 | 0\n004 0 | 0\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"3594438a7480a5c3dc06440e28a16044c0c7d289219da02f9e41da1810827805","private_key":"26266470b7f4e9341cbbbb304b1aed116626cb1bea55d639cdbef1a069c18123","name":"node_3594438a7480a5c3dc06440e28a16044c0c7d289219da02f9e41da1810827805","services":["bzz","pss"],"enable_msg_events":true,"port":33055},"up":true}}],"conns":[{"one":"fd37e45210ddb36f8b5ecef9c9d9d3f8201ba9523bfd6a70291333cf3b9207e1","other":"3594438a7480a5c3dc06440e28a16044c0c7d289219da02f9e41da1810827805","up":true}]} diff --git a/vendor/github.com/ethereum/go-ethereum/swarm/pss/testdata/snapshot_256.json b/vendor/github.com/ethereum/go-ethereum/swarm/pss/testdata/snapshot_256.json deleted file mode 100644 index 936956be..00000000 --- a/vendor/github.com/ethereum/go-ethereum/swarm/pss/testdata/snapshot_256.json +++ /dev/null @@ -1 +0,0 @@ -{"nodes":[{"node":{"info":{"id":"e6812448728b4bda5962adceb1707b29f661d3d1a6b2ccd5f8183c9a1f4d01b6","name":"node_e6812448728b4bda5962adceb1707b29f661d3d1a6b2ccd5f8183c9a1f4d01b6","enode":"enode://665ca8f57d847b22e62b829c7ca8327fc4a01497fbf18ce0214f19a4b405f2fd118bdc8d27a509942be90c4afff8774dc02810508099969cc215322120c6722b@127.0.0.1:0","enr":"0xf88fb840b69f6ddfa1a4af418eeffe8589e24339f2fdbd6bf67d70b7cae0a2096864dfc82dccb22867e1d5a9145d71caadcefde60e887c16a42164c3db6b4770bcff210b0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103665ca8f57d847b22e62b829c7ca8327fc4a01497fbf18ce0214f19a4b405f2fd","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"5oEkSHKLS9pZYq3OsXB7KfZh09GmsszV+Bg8mh9NAbY=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: e68124\npopulation: 33 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 7 48b8 741a 26ab 08bd | 126 56ca (0) 5663 (0) 5538 (0) 52a8 (0)\n001 7 81a5 8402 9464 9257 | 75 b8e1 (0) bbaf (0) ba91 (0) be68 (0)\n002 5 da36 d3e9 cc33 c603 | 27 d408 (0) d700 (0) d209 (0) d302 (0)\n003 4 f6c0 f1ed f215 ff75 | 14 f645 (0) f6c0 (0) f756 (0) f1ed (0)\n004 4 eff2 ef99 e867 eb68 | 7 ed42 (0) ec90 (0) eebd (0) ef99 (0)\n005 4 e0a0 e09f e2d3 e277 | 4 e0a0 (0) e09f (0) e2d3 (0) e277 (0)\n============ DEPTH: 6 ==========================================\n006 1 e471 | 1 e471 (0)\n007 0 | 0\n008 1 e64d | 1 e64d (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"e6812448728b4bda5962adceb1707b29f661d3d1a6b2ccd5f8183c9a1f4d01b6","private_key":"c62579f0a0c6aaaaa7a8aa18a22d928d27a2d496e9588ec36573b5f174136358","name":"node_e6812448728b4bda5962adceb1707b29f661d3d1a6b2ccd5f8183c9a1f4d01b6","services":["bzz","pss"],"enable_msg_events":true,"port":33261},"up":true}},{"node":{"info":{"id":"14849f811af20ce19fb29417d20c15fc16da1e45aebdf795a2c6ccb671e4bdac","name":"node_14849f811af20ce19fb29417d20c15fc16da1e45aebdf795a2c6ccb671e4bdac","enode":"enode://1c9940e663ec6a7e9bf3e8add2faed3ad8f989ef1529cafb7f37c82a208f43d00f4ba05c1ea62caf472acb15c91b3587c96849c286efd4f173f438ea2b45d32a@127.0.0.1:0","enr":"0xf88fb840410f25aaf4a49487580fbd3c098fb137c2cbccf0c65806bf66715f0af1be0a5f5f5b20d60466ba1fb85cb219d6f9f1a7b216cfe6486aa9c00152e38dc2d1e66b0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1021c9940e663ec6a7e9bf3e8add2faed3ad8f989ef1529cafb7f37c82a208f43d0","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"FISfgRryDOGfspQX0gwV/BbaHkWuvfeVosbMtnHkvaw=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 14849f\npopulation: 29 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 9257 eb68 e681 | 130 b8e1 (0) bbaf (0) ba91 (0) bfc7 (0)\n001 3 44ad 4005 741a | 61 5ff0 (0) 5d82 (0) 5c7c (0) 5c37 (0)\n002 4 2c85 3a62 3728 36b9 | 28 3f31 (0) 3cab (0) 3c5b (0) 3980 (0)\n003 7 0e3b 08bd 08e5 08f8 | 21 07f5 (0) 046c (0) 0561 (0) 0594 (0)\n004 6 194e 18e0 1add 1dec | 9 19ea (0) 194e (0) 18e0 (0) 1b1d (0)\n005 3 1049 1070 138d | 3 1049 (0) 1070 (0) 138d (0)\n============ DEPTH: 6 ==========================================\n006 2 1686 1784 | 2 1686 (0) 1784 (0)\n007 0 | 0\n008 1 140d | 1 140d (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"14849f811af20ce19fb29417d20c15fc16da1e45aebdf795a2c6ccb671e4bdac","private_key":"0ce521739058eb06cff2ff0e748a604866b37fa96e7a559c5bf7cabf4161382e","name":"node_14849f811af20ce19fb29417d20c15fc16da1e45aebdf795a2c6ccb671e4bdac","services":["bzz","pss"],"enable_msg_events":true,"port":34017},"up":true}},{"node":{"info":{"id":"eb686a686fd70e41659cc69ec0db53d1512dfec238918afd0a515d8ce177d4d9","name":"node_eb686a686fd70e41659cc69ec0db53d1512dfec238918afd0a515d8ce177d4d9","enode":"enode://0057d96aee5b09baeb627555fe6299fdc637bd55f9be2ddfc59faa67cb940257578d1df147fa29d0539d8eec0fc0d2786aa7530aa346ceae8ee6f8e72d1fb052@127.0.0.1:0","enr":"0xf88fb8405bf3c589a9657ead2e83ff8f2cc355982f3f594e94903e9e6ac19daf8a03e1b84a3d1c607e264646ac31a086ef73bfee66a4f95df458b208a93f2a5441a7607d0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1020057d96aee5b09baeb627555fe6299fdc637bd55f9be2ddfc59faa67cb940257","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"62hqaG/XDkFlnMaewNtT0VEt/sI4kYr9ClFdjOF31Nk=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: eb686a\npopulation: 34 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 8 48b8 741a 26ab 012b | 126 56ca (0) 5663 (0) 5538 (0) 52a8 (0)\n001 7 a616 a970 8402 8074 | 75 b8e1 (0) bbaf (0) ba91 (0) be68 (0)\n002 5 cc33 c603 c2d0 da36 | 27 c9c3 (0) c961 (0) c8c8 (0) c8ea (0)\n003 3 ff75 f1ed f215 | 14 f6c0 (0) f645 (0) f756 (0) f1ed (0)\n004 5 e09f e2d3 e277 e471 | 7 e0a0 (0) e09f (0) e2d3 (0) e277 (0)\n============ DEPTH: 5 ==========================================\n005 5 ec90 ed42 eebd ef99 | 5 ec90 (0) ed42 (0) eebd (0) ef99 (0)\n006 1 e867 | 1 e867 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"eb686a686fd70e41659cc69ec0db53d1512dfec238918afd0a515d8ce177d4d9","private_key":"37e0f62adb81157cd9de3310d81d70da17cb3a0502320958b7c6d9ca1038d8f6","name":"node_eb686a686fd70e41659cc69ec0db53d1512dfec238918afd0a515d8ce177d4d9","services":["bzz","pss"],"enable_msg_events":true,"port":36177},"up":true}},{"node":{"info":{"id":"9464ad8da1a5effdc0351742dfffae941ffd9fab469637b2491caece53c57dc8","name":"node_9464ad8da1a5effdc0351742dfffae941ffd9fab469637b2491caece53c57dc8","enode":"enode://5684177873a4d0e494fceca55b1a36e1a8a19025e03e483ae89cee9173b38082137fbfceb506946ae900a3cbc47697c7ba3c5bd553225e0e76ff5ce7657a7bdb@127.0.0.1:0","enr":"0xf88fb840e67f1444113ce4de2d80f4652cda49192b5c1dee37c8fb129cc60b1e655af7c60190c9a804b2498da20b36cf8aa01e2c492357464bf092615a60192953e13c6f0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1035684177873a4d0e494fceca55b1a36e1a8a19025e03e483ae89cee9173b38082","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"lGStjaGl7/3ANRdC3/+ulB/9n6tGljeySRyuzlPFfcg=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 9464ad\npopulation: 32 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 741a 4a95 4b79 012b | 126 5ff0 (0) 5d82 (0) 5c7c (0) 5c37 (0)\n001 7 c603 d959 da36 d3e9 | 55 d408 (0) d700 (0) d209 (0) d302 (0)\n002 5 bdc5 bcf8 ba91 a8b5 | 37 b8e1 (0) bbaf (0) ba91 (0) be68 (0)\n003 6 8ea2 8b43 8358 80d7 | 21 8b43 (0) 8854 (0) 8862 (0) 8d19 (0)\n004 3 9c8e 9f7d 9ec8 | 9 9b8e (0) 9959 (0) 9948 (0) 9f0e (0)\n005 2 93c0 9257 | 3 93ea (0) 93c0 (0) 9257 (0)\n006 1 97da | 1 97da (0)\n============ DEPTH: 7 ==========================================\n007 3 95c0 955d 9518 | 3 95c0 (0) 955d (0) 9518 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"9464ad8da1a5effdc0351742dfffae941ffd9fab469637b2491caece53c57dc8","private_key":"a5dc0083f0aaf88eee5eaf79c81465d05f0ba64c386da9145ba4a4a3f5c8d143","name":"node_9464ad8da1a5effdc0351742dfffae941ffd9fab469637b2491caece53c57dc8","services":["bzz","pss"],"enable_msg_events":true,"port":40977},"up":true}},{"node":{"info":{"id":"9257dc934dfbf17473b70cb85333c6fab67ee9b6228a646576c4f57253f1004e","name":"node_9257dc934dfbf17473b70cb85333c6fab67ee9b6228a646576c4f57253f1004e","enode":"enode://0376a4d936b21276f20e6c33483aeaefb1d89d83a01af38405c081fd675c7c8b1d93cd7eb661bee8fb060ef4f98f6b75eeffe191df26a19f18c2f08c94471f6e@127.0.0.1:0","enr":"0xf88fb840a3a1a51f7bff86552a58bbd5dda6348d6aa82a599d96adbfbf9f19e93e0eace7305ea1d01a495196a928bb866ae512f0244f06e2abaa0dfc679bee3fadec82e10183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1020376a4d936b21276f20e6c33483aeaefb1d89d83a01af38405c081fd675c7c8b","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"klfck0378XRztwy4UzPG+rZ+6bYiimRldsT1clPxAE4=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 9257dc\npopulation: 27 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 1784 1484 08bd | 126 5987 (0) 5814 (0) 5bd8 (0) 5a8b (0)\n001 2 e681 eb68 | 55 d408 (0) d700 (0) d209 (0) d302 (0)\n002 5 b3f9 bdc5 a0c8 a616 | 37 b8e1 (0) bbaf (0) ba91 (0) bfc7 (0)\n003 8 8ea2 8862 8b43 8358 | 21 8b43 (0) 8854 (0) 8862 (0) 8d19 (0)\n004 2 9c8e 9c21 | 9 9959 (0) 9948 (0) 9b8e (0) 9f0e (0)\n005 5 97da 95c0 955d 9518 | 5 97da (0) 95c0 (0) 955d (0) 9518 (0)\n============ DEPTH: 6 ==========================================\n006 0 | 0\n007 2 93ea 93c0 | 2 93ea (0) 93c0 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"9257dc934dfbf17473b70cb85333c6fab67ee9b6228a646576c4f57253f1004e","private_key":"c15e326cf8ee6333e5811786737f8322f412341ae09e5ae9917860bd26ca1947","name":"node_9257dc934dfbf17473b70cb85333c6fab67ee9b6228a646576c4f57253f1004e","services":["bzz","pss"],"enable_msg_events":true,"port":37221},"up":true}},{"node":{"info":{"id":"08bd1e049859b4a7c8078ca9741fe3daa668b9fe478da06d1a435cd5566b3e11","name":"node_08bd1e049859b4a7c8078ca9741fe3daa668b9fe478da06d1a435cd5566b3e11","enode":"enode://ee9d7c5a65b07eb7d05d2621c99bd374c33ea4438206d3f07d2a6dcfe9adfafeebc06b85d8dfa9ab05c74b2c0295ffb280931ca84b185dbb6ed924fd6be61f9a@127.0.0.1:0","enr":"0xf88fb84032fc3b696637e089700dfa3a41ddefe8e8a6a55db4660a332527484de910804419abdb982ab9fb545f5ee12c11f033e48e66220126f229aedcbb54c3a789b6d60183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102ee9d7c5a65b07eb7d05d2621c99bd374c33ea4438206d3f07d2a6dcfe9adfafe","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"CL0eBJhZtKfIB4ypdB/j2qZouf5HjaBtGkNc1VZrPhE=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 08bd1e\npopulation: 27 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 e681 9464 9257 | 130 c9c3 (0) c961 (0) c8c8 (0) c8ea (0)\n001 2 4b79 741a | 61 5ff0 (0) 5d82 (0) 5c7c (0) 5c37 (0)\n002 6 26ab 2c85 2a50 30fe | 28 298a (0) 2a50 (0) 2fd2 (0) 2e65 (0)\n003 4 1fd0 138d 1784 1484 | 16 19ea (0) 194e (0) 18e0 (0) 1b1d (0)\n004 4 0314 035f 0111 012b | 10 07f5 (0) 046c (0) 0561 (0) 0594 (0)\n005 3 0d1c 0cfc 0e3b | 5 0cfc (0) 0d1c (0) 0e80 (0) 0e2b (0)\n============ DEPTH: 6 ==========================================\n006 0 | 0\n007 3 0942 096a 09b3 | 3 0942 (0) 096a (0) 09b3 (0)\n008 0 | 0\n009 2 08e5 08f8 | 2 08e5 (0) 08f8 (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"08bd1e049859b4a7c8078ca9741fe3daa668b9fe478da06d1a435cd5566b3e11","private_key":"eeb1d4b4ded34ed420c6f517fa508883a73d457008f055da9edb7156e78474c2","name":"node_08bd1e049859b4a7c8078ca9741fe3daa668b9fe478da06d1a435cd5566b3e11","services":["bzz","pss"],"enable_msg_events":true,"port":38971},"up":true}},{"node":{"info":{"id":"012ba278d582691241875c4c14ead91fff3983e190df7d9b43ade384e84c11fb","name":"node_012ba278d582691241875c4c14ead91fff3983e190df7d9b43ade384e84c11fb","enode":"enode://54002fd97799e33da3d495d928026863bbec17ed7e7d6ea78725e5259435c2740cb37de72cb4c58f07e09869598312f477b7eccb62b46fb181ba49cffd1bc315@127.0.0.1:0","enr":"0xf88fb840c5a8e2adab6eef8cfcdbd07f1a0fa37ae261091b64e83e95a4e7436cd1c39015121dc7fe55ccbd229c0de2f7ceab2ab9b1c6f500bac9380f6d792dcbf80c555d0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10354002fd97799e33da3d495d928026863bbec17ed7e7d6ea78725e5259435c274","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"ASuieNWCaRJBh1xMFOrZH/85g+GQ332bQ63jhOhMEfs=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 012ba2\npopulation: 30 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 eb68 9464 8402 | 130 c9c3 (0) c961 (0) c8c8 (0) c8ea (0)\n001 4 44ad 4b79 741a 7660 | 61 56ca (0) 5663 (0) 5538 (0) 52a8 (0)\n002 5 2c85 26ab 30fe 3728 | 28 24f8 (0) 244c (0) 26ac (0) 26ab (0)\n003 4 1fd0 1dc0 1784 1484 | 16 19ea (0) 194e (0) 18e0 (0) 1b1d (0)\n004 5 0e3b 09b3 08e5 08f8 | 11 0cfc (0) 0d1c (0) 0e80 (0) 0e2b (0)\n005 4 07f5 046c 0594 0561 | 4 046c (0) 0594 (0) 0561 (0) 07f5 (0)\n006 3 035f 0314 025d | 3 0314 (0) 035f (0) 025d (0)\n============ DEPTH: 7 ==========================================\n007 0 | 0\n008 1 0191 | 1 0191 (0)\n009 0 | 0\n010 1 0111 | 1 0111 (0)\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"012ba278d582691241875c4c14ead91fff3983e190df7d9b43ade384e84c11fb","private_key":"8c41148ea8aab694bf31dcfd89a8271ecfb228b4917b2e2d119d11e64ffe2eed","name":"node_012ba278d582691241875c4c14ead91fff3983e190df7d9b43ade384e84c11fb","services":["bzz","pss"],"enable_msg_events":true,"port":33063},"up":true}},{"node":{"info":{"id":"025de1d2ec529d3a7da302eef0f8c54996616d40c940c0956d470ffc2a007f33","name":"node_025de1d2ec529d3a7da302eef0f8c54996616d40c940c0956d470ffc2a007f33","enode":"enode://789950b2dbebd332a0eef5b3bd998c4a7cb7b2b5bfd38dac2836a078eb6322d32967e68fcc10ab9841df4de5e02ffa4dae77e7ec75235fdfb542285073464c68@127.0.0.1:0","enr":"0xf88fb840bde2b58110c1cdfcae19192e9dc65d42bad215e4fa6ede43f8c3bfc2fc4fcf0e356406d032ece99c466696adf702d2436aa2abf92b0f598d3282aa2974487cb60183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102789950b2dbebd332a0eef5b3bd998c4a7cb7b2b5bfd38dac2836a078eb6322d3","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"Al3h0uxSnTp9owLu8PjFSZZhbUDJQMCVbUcP/CoAfzM=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 025de1\npopulation: 28 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 eb68 8402 | 130 d408 (0) d700 (0) d209 (0) d302 (0)\n001 3 741a 48f1 4a95 | 61 5ff0 (0) 5d82 (0) 5c7c (0) 5c37 (0)\n002 6 30fe 3728 36b9 26ab | 28 24f8 (0) 244c (0) 26ac (0) 26ab (0)\n003 4 1fd0 1dc0 1784 1484 | 16 194e (0) 19ea (0) 18e0 (0) 1b1d (0)\n004 4 0d1c 0e3b 0942 08f8 | 11 0cfc (0) 0d1c (0) 0e80 (0) 0e2b (0)\n005 4 07f5 046c 0561 0594 | 4 07f5 (0) 046c (0) 0561 (0) 0594 (0)\n006 3 0191 0111 012b | 3 0191 (0) 0111 (0) 012b (0)\n============ DEPTH: 7 ==========================================\n007 2 0314 035f | 2 0314 (0) 035f (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"025de1d2ec529d3a7da302eef0f8c54996616d40c940c0956d470ffc2a007f33","private_key":"89eff5a9452d1e0c16a61c6b956e8ba73cc6af297693643037294f04f933c9b4","name":"node_025de1d2ec529d3a7da302eef0f8c54996616d40c940c0956d470ffc2a007f33","services":["bzz","pss"],"enable_msg_events":true,"port":40297},"up":true}},{"node":{"info":{"id":"8402bd62282811ed236b2fa1f0d41ad4bbe54e420ee34adc6164cfd4baf8658d","name":"node_8402bd62282811ed236b2fa1f0d41ad4bbe54e420ee34adc6164cfd4baf8658d","enode":"enode://5adb68b61a7c2016141b6a2c5f6f62fb6bbaf0055b55208fe1d40c13de6c0f33882fe2c62b81ac1be1dfa20077589c4a2035252280a7fc51de6b283f2402cfbf@127.0.0.1:0","enr":"0xf88fb840c0f93ae82bca086787974a9909d7cb74ab3af63f5282df001769504d385c646d1a08448f09cd3b12b8434eacfb1d951d6d50470fa0c545eac3abc11690ef8bd80183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1035adb68b61a7c2016141b6a2c5f6f62fb6bbaf0055b55208fe1d40c13de6c0f33","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"hAK9YigoEe0jay+h8NQa1LvlTkIO40rcYWTP1Lr4ZY0=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 8402bd\npopulation: 30 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 4b79 741a 012b 025d | 126 5ff0 (0) 5d82 (0) 5c7c (0) 5c37 (0)\n001 5 c603 da36 ff75 eb68 | 55 c961 (0) c9c3 (0) c8c8 (0) c8ea (0)\n002 2 aaf0 a970 | 37 b8e1 (0) bbaf (0) ba91 (0) bea1 (0)\n003 4 9c8e 9518 9464 9257 | 17 9b8e (0) 9948 (0) 9959 (0) 9f0e (0)\n004 5 8cc3 8ea2 8e7b 8b43 | 9 8b43 (0) 8854 (0) 8862 (0) 8d19 (0)\n005 7 837f 834f 8358 80d7 | 8 837f (0) 834f (0) 8358 (0) 81a5 (0)\n============ DEPTH: 6 ==========================================\n006 2 87a3 86d6 | 2 87a3 (0) 86d6 (0)\n007 0 | 0\n008 1 84a9 | 1 84a9 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"8402bd62282811ed236b2fa1f0d41ad4bbe54e420ee34adc6164cfd4baf8658d","private_key":"0a9e0691c50298a2bc085029a26783b783f3b1d81068d25096da660201582e65","name":"node_8402bd62282811ed236b2fa1f0d41ad4bbe54e420ee34adc6164cfd4baf8658d","services":["bzz","pss"],"enable_msg_events":true,"port":41495},"up":true}},{"node":{"info":{"id":"741a854ae299df49a738725bc58abe614e5e4302ffecd8320bbede8412d160c0","name":"node_741a854ae299df49a738725bc58abe614e5e4302ffecd8320bbede8412d160c0","enode":"enode://b7159c8574bad546d319bf27fe0b85a491ad9e0df9b3974553552f5dcae8ac16db1bdb41f7115872a65027698b5ba532c39b6955a5e8091d9a2158e594a75f69@127.0.0.1:0","enr":"0xf88fb8409311b5e1b31fdf6f1ec55524169f3ce36a87b92068a58be80cba7c7f8bb4e0ee07c122fc032f110c6cf8c75a2855a020d34a069f2acd2066f7b5e4da4ef8b6c80183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103b7159c8574bad546d319bf27fe0b85a491ad9e0df9b3974553552f5dcae8ac16","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"dBqFSuKZ30mnOHJbxYq+YU5eQwL/7NgyC77ehBLRYMA=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 741a85\npopulation: 35 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 e681 eb68 9464 8402 | 130 d700 (0) d408 (0) d302 (0) d3e9 (0)\n001 9 2c85 26ab 1fd0 1784 | 65 298a (0) 2a50 (0) 2e65 (0) 2fd2 (0)\n002 7 5a26 5c7c 46bf 4005 | 35 5ff0 (0) 5d82 (0) 5c7c (0) 5c37 (0)\n003 6 6c01 6d5e 648a 67f3 | 13 68cb (0) 6b4e (0) 6e7f (0) 6dd3 (0)\n004 6 7850 7933 7e47 7c46 | 9 79e5 (0) 7933 (0) 7850 (0) 7895 (0)\n============ DEPTH: 5 ==========================================\n005 2 7049 70f6 | 2 7049 (0) 70f6 (0)\n006 1 7660 | 1 7660 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"741a854ae299df49a738725bc58abe614e5e4302ffecd8320bbede8412d160c0","private_key":"d86ec48bb09bc70772b1ac1e6c492b9675a44a28adc64095a3be584ce92f8fdc","name":"node_741a854ae299df49a738725bc58abe614e5e4302ffecd8320bbede8412d160c0","services":["bzz","pss"],"enable_msg_events":true,"port":36283},"up":true}},{"node":{"info":{"id":"4a95d49f58057b039b55a34f67a348c052f61770065e41243ff055efc570a935","name":"node_4a95d49f58057b039b55a34f67a348c052f61770065e41243ff055efc570a935","enode":"enode://94db8d2b348f151986140b50ea45c8f5983f78caf7ba871b2aeb20a7aefb5e6566c5628c702e8979281130632ade26f0222060bc53728c0c0ddf7137947c5229@127.0.0.1:0","enr":"0xf88fb840558b22c25fa4ad6f7b89ee4a1a18c379bfc0bc76aac0da6365611dff788030f334f0feae2e90705123442b2419a399ad4d6f5f57c8f5f6e781272904113539c60183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10394db8d2b348f151986140b50ea45c8f5983f78caf7ba871b2aeb20a7aefb5e65","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"SpXUn1gFewObVaNPZ6NIwFL2F3AGXkEkP/BV78VwqTU=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 4a95d4\npopulation: 34 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 da36 ba91 9464 | 130 d408 (0) d700 (0) d209 (0) d302 (0)\n001 5 26ab 2c85 2a50 298a | 65 24f8 (0) 244c (0) 26ac (0) 26ab (0)\n002 4 6c01 6790 648a 741a | 26 68cb (0) 6b4e (0) 6e7f (0) 6d3c (0)\n003 8 5144 50c1 5538 5c37 | 16 5ff0 (0) 5d82 (0) 5c7c (0) 5c37 (0)\n004 6 435d 4005 402c 46bf | 9 46bf (0) 447c (0) 447a (0) 44ad (0)\n005 2 4d91 4cec | 3 4d38 (0) 4d91 (0) 4cec (0)\n============ DEPTH: 6 ==========================================\n006 5 482e 48b8 48de 48d7 | 5 482e (0) 48b8 (0) 48de (0) 48d7 (0)\n007 1 4b79 | 1 4b79 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"4a95d49f58057b039b55a34f67a348c052f61770065e41243ff055efc570a935","private_key":"aa7a512548b186d6f17490300bba5369b634d9649b74c421af1d43d3f8cafec6","name":"node_4a95d49f58057b039b55a34f67a348c052f61770065e41243ff055efc570a935","services":["bzz","pss"],"enable_msg_events":true,"port":43231},"up":true}},{"node":{"info":{"id":"4b79e83186f2ab05932eaa99982a2e53373b83780e32d224d15cb2c85462451f","name":"node_4b79e83186f2ab05932eaa99982a2e53373b83780e32d224d15cb2c85462451f","enode":"enode://7e2ea6ad36e886e7ef31de1d7d85a0a3d85618dea99621ee2bceacb048b10e9b26862e9fe9a918204e39cb7ed0b1c849b19345b1064cf890de27151a144ecdc0@127.0.0.1:0","enr":"0xf88fb8409159ad0c33b90bbed5e06a27c0189aecee7e3eeaf36cc509cf20318bfee1d84d525df4a5b228a2e4fccf906ba509a8318400ec3cfeaf76d800fade5a071b9f560183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1027e2ea6ad36e886e7ef31de1d7d85a0a3d85618dea99621ee2bceacb048b10e9b","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"S3noMYbyqwWTLqqZmCouUzc7g3gOMtIk0VyyyFRiRR8=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 4b79e8\npopulation: 27 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 ba91 8402 9464 | 130 c961 (0) c9c3 (0) c8c8 (0) c8ea (0)\n001 3 012b 08bd 08f8 | 65 24f8 (0) 244c (0) 26ac (0) 26ab (0)\n002 3 648a 741a 7660 | 26 68cb (0) 6b4e (0) 6e7f (0) 6dd3 (0)\n003 5 5a26 5bd8 5c37 5c7c | 16 5ff0 (0) 5d82 (0) 5c7c (0) 5c37 (0)\n004 5 435d 4005 46bf 447a | 9 46bf (0) 447c (0) 447a (0) 44ad (0)\n005 2 4cec 4d91 | 3 4cec (0) 4d38 (0) 4d91 (0)\n============ DEPTH: 6 ==========================================\n006 5 482e 48b8 48f1 48de | 5 482e (0) 48b8 (0) 48de (0) 48d7 (0)\n007 1 4a95 | 1 4a95 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"4b79e83186f2ab05932eaa99982a2e53373b83780e32d224d15cb2c85462451f","private_key":"e6dad134228b16f662707d719d2a5b4104da298ca8bdb6085d4d86557ff74820","name":"node_4b79e83186f2ab05932eaa99982a2e53373b83780e32d224d15cb2c85462451f","services":["bzz","pss"],"enable_msg_events":true,"port":42249},"up":true}},{"node":{"info":{"id":"08f84878e44fed2adb4b2685b9f293dc3c73d5f9bc1c474870d943ec2ae73dbe","name":"node_08f84878e44fed2adb4b2685b9f293dc3c73d5f9bc1c474870d943ec2ae73dbe","enode":"enode://266b673803b457c94430107ebcaad9bbe27ca7b2d7f2f4a2795330eb1370ef17684e5f79a2b76a8e8b68388a0135357d0643a71451e4475030776a4662c17dd5@127.0.0.1:0","enr":"0xf88fb840f107f7f7c79de397fcaa167703a506621bf1b28b3a12767f3f3b156c7d64d64a4a4bd7e9ec8535b076496f0d44b8077b7597f9b75a20a611dba6ecc55ffe6f900183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103266b673803b457c94430107ebcaad9bbe27ca7b2d7f2f4a2795330eb1370ef17","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"CPhIeORP7SrbSyaFufKT3Dxz1fm8HEdIcNlD7CrnPb4=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 08f848\npopulation: 33 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 c42e c2d0 c8ea cdb1 | 130 c961 (0) c9c3 (0) c8c8 (0) c8ea (0)\n001 5 7660 741a 4005 48f1 | 61 68cb (0) 6b4e (0) 6e7f (0) 6dd3 (0)\n002 5 26ab 2c85 3c5b 3728 | 28 244c (0) 24f8 (0) 26ac (0) 26ab (0)\n003 5 1fd0 1dec 1dc0 1784 | 16 19ea (0) 194e (0) 18e0 (0) 1b1d (0)\n004 3 0111 012b 025d | 10 07f5 (0) 046c (0) 0561 (0) 0594 (0)\n005 4 0d1c 0cfc 0e80 0e3b | 5 0cfc (0) 0d1c (0) 0e80 (0) 0e2b (0)\n============ DEPTH: 6 ==========================================\n006 0 | 0\n007 3 096a 0942 09b3 | 3 0942 (0) 096a (0) 09b3 (0)\n008 0 | 0\n009 1 08bd | 1 08bd (0)\n010 0 | 0\n011 1 08e5 | 1 08e5 (0)\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"08f84878e44fed2adb4b2685b9f293dc3c73d5f9bc1c474870d943ec2ae73dbe","private_key":"c9ea240d0ca10a37109b638b6ff80df72e80f58b0bdaab9117ece2449c7ded0f","name":"node_08f84878e44fed2adb4b2685b9f293dc3c73d5f9bc1c474870d943ec2ae73dbe","services":["bzz","pss"],"enable_msg_events":true,"port":33617},"up":true}},{"node":{"info":{"id":"81a5a07f92f813e85b501b0028e1caa6e6a6c7efa5195ecb693cd2d91d5132a0","name":"node_81a5a07f92f813e85b501b0028e1caa6e6a6c7efa5195ecb693cd2d91d5132a0","enode":"enode://9c7ee34c91cca6a255a1d8adf1770f230ddc3b14a4fd7052094be159092b67122725fa2cbea906cf1014c841ef9be502872b8e7205e080a0861036ac05c947bc@127.0.0.1:0","enr":"0xf88fb84016f0ddeab6ab02fec27c0d81fe6b7c75926f73593cc76cfe70a797016f5de68257234757637d614c0e3afe0b4a62d76a0ea9e61189d9b6cc35df8210941da9800183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1029c7ee34c91cca6a255a1d8adf1770f230ddc3b14a4fd7052094be159092b6712","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"gaWgf5L4E+hbUBsAKOHKpuamx++lGV7LaTzS2R1RMqA=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 81a5a0\npopulation: 28 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 5a26 48f1 7660 08f8 | 126 5ff0 (0) 5d82 (0) 5c7c (0) 5c37 (0)\n001 3 da36 e681 ff75 | 55 c961 (0) c9c3 (0) c8c8 (0) c8ea (0)\n002 3 aaf0 a0c8 b3f9 | 37 b8e1 (0) bbaf (0) ba91 (0) bfc7 (0)\n003 2 9c8e 9518 | 17 9b8e (0) 9959 (0) 9948 (0) 9f0e (0)\n004 5 8cc3 8e28 8e7b 8b43 | 9 8b43 (0) 8854 (0) 8862 (0) 8d19 (0)\n005 4 87a3 86d6 84a9 8402 | 4 87a3 (0) 86d6 (0) 84a9 (0) 8402 (0)\n006 3 837f 834f 8358 | 3 837f (0) 834f (0) 8358 (0)\n============ DEPTH: 7 ==========================================\n007 4 80d7 8073 8074 8006 | 4 80d7 (0) 8006 (0) 8073 (0) 8074 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"81a5a07f92f813e85b501b0028e1caa6e6a6c7efa5195ecb693cd2d91d5132a0","private_key":"f268036ece7b4c34b20e291a59e9e6eb8c169846ed02ae120104c2a9db928aa8","name":"node_81a5a07f92f813e85b501b0028e1caa6e6a6c7efa5195ecb693cd2d91d5132a0","services":["bzz","pss"],"enable_msg_events":true,"port":41021},"up":true}},{"node":{"info":{"id":"7660828fb0c8f89201d34e6f4d61cc6ba9a30cead6e4eb8253f6cc92e1845f23","name":"node_7660828fb0c8f89201d34e6f4d61cc6ba9a30cead6e4eb8253f6cc92e1845f23","enode":"enode://57d4fa9adc668bc6252f2871ae51f3507be8299126d91348d691d765826efd907e3086acd9c139e0d4f2ad542648e855aed9dd718e7b160ccff5e2d3eda8d109@127.0.0.1:0","enr":"0xf88fb840728d16ca2bed2ed57accf482d7d01246e23016bfb73bffb10c3b7b47db93f7b6528ae999d54cf0807af525b9c502e27200c19a8faaf1f69330d98b8488863ef10183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10357d4fa9adc668bc6252f2871ae51f3507be8299126d91348d691d765826efd90","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"dmCCj7DI+JIB005vTWHMa6mjDOrW5OuCU/bMkuGEXyM=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 766082\npopulation: 32 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 c603 da36 81a5 | 130 c8c8 (0) c8ea (0) c9c3 (0) c961 (0)\n001 5 2c85 3728 36b9 012b | 65 24f8 (0) 244c (0) 26ac (0) 26ab (0)\n002 10 5a26 5bd8 5663 5144 | 35 5ff0 (0) 5d82 (0) 5c7c (0) 5c37 (0)\n003 5 6c01 6d5e 6795 6790 | 13 68cb (0) 6b4e (0) 6e7f (0) 6dd3 (0)\n004 6 7850 7e47 7d16 7c46 | 9 79e5 (0) 7933 (0) 7850 (0) 7895 (0)\n============ DEPTH: 5 ==========================================\n005 2 70f6 7049 | 2 70f6 (0) 7049 (0)\n006 1 741a | 1 741a (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"7660828fb0c8f89201d34e6f4d61cc6ba9a30cead6e4eb8253f6cc92e1845f23","private_key":"a661a84382c924fa6b8c1d349120fa836ebbeb7f53552df109787f65a9ea40b1","name":"node_7660828fb0c8f89201d34e6f4d61cc6ba9a30cead6e4eb8253f6cc92e1845f23","services":["bzz","pss"],"enable_msg_events":true,"port":33705},"up":true}},{"node":{"info":{"id":"48f1ca6d433019f932fa4ae03e0decbcbea3fe635edff4458a669b83f8162b9a","name":"node_48f1ca6d433019f932fa4ae03e0decbcbea3fe635edff4458a669b83f8162b9a","enode":"enode://bdc3539551669afb2e5251b20cd32b76991a299ed144c7cdf2df6a562307c9ccb061dc13c4a0428c279b481d48bdc454f8cf3c2d334d023820636940194a536a@127.0.0.1:0","enr":"0xf88fb840166e7488211c50622095d0c7a0a9b5798b716da7a2f18087617760eab6cbd432533b34999879c21ac95d597a2e7afdc751503e82f98018f4988dcfc2255bb7de0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102bdc3539551669afb2e5251b20cd32b76991a299ed144c7cdf2df6a562307c9cc","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"SPHKbUMwGfky+krgPg3svL6j/mNe3/RFimabg/gWK5o=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 48f1ca\npopulation: 29 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 da36 81a5 ba91 b3f9 | 130 c9c3 (0) c961 (0) c8c8 (0) c8ea (0)\n001 2 025d 08f8 | 65 244c (0) 24f8 (0) 26ac (0) 26ab (0)\n002 3 6c01 6795 7660 | 26 68cb (0) 6b4e (0) 6e7f (0) 6dd3 (0)\n003 7 5538 52a8 5144 5c37 | 16 5ff0 (0) 5d82 (0) 5c7c (0) 5c37 (0)\n004 5 402c 4005 447a 44ad | 9 46bf (0) 447c (0) 447a (0) 44ad (0)\n005 2 4cec 4d91 | 3 4cec (0) 4d38 (0) 4d91 (0)\n006 2 4b79 4a95 | 2 4a95 (0) 4b79 (0)\n============ DEPTH: 7 ==========================================\n007 0 | 0\n008 1 482e | 1 482e (0)\n009 1 48b8 | 1 48b8 (0)\n010 2 48d7 48de | 2 48de (0) 48d7 (0)\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"48f1ca6d433019f932fa4ae03e0decbcbea3fe635edff4458a669b83f8162b9a","private_key":"93ccc60464556d17f764da4d4f9627036f03862e51eedf2272ff4ab6de460bca","name":"node_48f1ca6d433019f932fa4ae03e0decbcbea3fe635edff4458a669b83f8162b9a","services":["bzz","pss"],"enable_msg_events":true,"port":44895},"up":true}},{"node":{"info":{"id":"b3f95f225e2b6b76e6c7ef7c86caf83e35213f6a22da41e653ca1c190be23c9c","name":"node_b3f95f225e2b6b76e6c7ef7c86caf83e35213f6a22da41e653ca1c190be23c9c","enode":"enode://0fff61eaf24fc39fce31fcc08d7f4530cf34ea9b316c8552a2665bb588bc2b715ac681a15fec8f10bd07b5e7efba1b60dbceb2bda52c437fe7e10bef54e9385b@127.0.0.1:0","enr":"0xf88fb8408e0903553e420a153b07746b27efee96df98e493517320da509b578ea9a335ad7d7f75c1be85cc91b87448690b53259d60f1f1d962827db10e0c45302d5991460183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1030fff61eaf24fc39fce31fcc08d7f4530cf34ea9b316c8552a2665bb588bc2b71","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"s/lfIl4ra3bmx+98hsr4PjUhP2oi2kHmU8ocGQviPJw=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: b3f95f\npopulation: 38 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 44ad 4005 48f1 | 126 244c (0) 24f8 (0) 26ac (0) 26ab (0)\n001 5 ff75 e277 c2d0 c603 | 55 c961 (0) c9c3 (0) c8c8 (0) c8ea (0)\n002 7 9c8e 9257 9518 8cc3 | 38 8b43 (0) 8854 (0) 8862 (0) 8d19 (0)\n003 10 a330 a0c8 a5ac a505 | 23 a4ee (0) a5ac (0) a505 (0) a7a8 (0)\n004 8 bdc5 bcf8 bea1 be68 | 8 bcf8 (0) bdc5 (0) bea1 (0) be68 (0)\n============ DEPTH: 5 ==========================================\n005 5 b5ea b4a1 b6df b659 | 5 b4a1 (0) b5ea (0) b659 (0) b6df (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"b3f95f225e2b6b76e6c7ef7c86caf83e35213f6a22da41e653ca1c190be23c9c","private_key":"b88ec7f2f180fa33cf884de2d17cd8bb2fd54c0091c86a3485fa2253753391f4","name":"node_b3f95f225e2b6b76e6c7ef7c86caf83e35213f6a22da41e653ca1c190be23c9c","services":["bzz","pss"],"enable_msg_events":true,"port":38851},"up":true}},{"node":{"info":{"id":"4005fd1fa8fbb318b29a62c368ada579e5122ca0578e6a75c509552be4b63b76","name":"node_4005fd1fa8fbb318b29a62c368ada579e5122ca0578e6a75c509552be4b63b76","enode":"enode://d59ebe745d21b2e3762354724988cc2e1922981561a7a1b59c692b63aab87866680e05dbd639fbc0e1edeea41158e6f0fc89f9858965ddfb88c4f7a837044694@127.0.0.1:0","enr":"0xf88fb8408bd7fa4d67c32ec7cede14876f0a7782e437190163434552f623d2b45f923ba14d0f771d61ec044c8ba306a6f70b9985dbb9ee95912d035959e20b757ce8a4e80183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102d59ebe745d21b2e3762354724988cc2e1922981561a7a1b59c692b63aab87866","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"QAX9H6j7sxiymmLDaK2leeUSLKBXjmp1xQlVK+S2O3Y=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 4005fd\npopulation: 32 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 da36 ff75 9518 ba91 | 130 c961 (0) c9c3 (0) c8c8 (0) c8ea (0)\n001 4 2c85 1484 08f8 0e3b | 65 24f8 (0) 244c (0) 26ac (0) 26ab (0)\n002 4 6790 648a 741a 7660 | 26 68cb (0) 6b4e (0) 6e7f (0) 6dd3 (0)\n003 6 5a26 5bd8 5c7c 5c37 | 16 5ff0 (0) 5d82 (0) 5c7c (0) 5c37 (0)\n004 5 4a95 4b79 48b8 48d7 | 10 4cec (0) 4d38 (0) 4d91 (0) 4a95 (0)\n005 4 46bf 447a 447c 44ad | 4 46bf (0) 447c (0) 447a (0) 44ad (0)\n============ DEPTH: 6 ==========================================\n006 3 43d4 43c9 435d | 3 43d4 (0) 43c9 (0) 435d (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 1 402c | 1 402c (0)\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"4005fd1fa8fbb318b29a62c368ada579e5122ca0578e6a75c509552be4b63b76","private_key":"a8676ecb5e3d5d9afec421fe21a57c5fc1d107a450dc67d5f5882520afa62a7c","name":"node_4005fd1fa8fbb318b29a62c368ada579e5122ca0578e6a75c509552be4b63b76","services":["bzz","pss"],"enable_msg_events":true,"port":37241},"up":true}},{"node":{"info":{"id":"ff75b19017c84128f38dec4f63e1f247a5691dc0fae186e667afedb5fe9d2c80","name":"node_ff75b19017c84128f38dec4f63e1f247a5691dc0fae186e667afedb5fe9d2c80","enode":"enode://3d2e2c472696bba49a923f035e188a58a75779bfaf0028b65c790cc6a72fcb0522fd663a55e2e7d8e2983cb895d6808cb75263b2e36ab3e6da0795ca222c1eb7@127.0.0.1:0","enr":"0xf88fb840a320a767aa7097e0c7a488fcc471bd6d30e05b616b05a63af5bcc89118d574f21c903d1427e4802c1331a3a2dc43b52ecbed21f4b1bbc488d64a8f640550ba990183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1033d2e2c472696bba49a923f035e188a58a75779bfaf0028b65c790cc6a72fcb05","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"/3WxkBfIQSjzjexPY+HyR6VpHcD64YbmZ6/ttf6dLIA=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: ff75b1\npopulation: 44 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 2a50 26ab 0e3b 44ad | 126 24f8 (0) 244c (0) 26ac (0) 26ab (0)\n001 11 b3f9 a616 a0c8 ab71 | 75 8b43 (0) 8854 (0) 8862 (0) 8d19 (0)\n002 12 c42e c6a8 c603 c74d | 27 c9c3 (0) c961 (0) c8c8 (0) c8ea (0)\n003 7 e867 eb68 eff2 e277 | 14 e0a0 (0) e09f (0) e2d3 (0) e277 (0)\n004 4 f756 f1ed f305 f215 | 7 f6c0 (0) f645 (0) f756 (0) f1ed (0)\n005 2 f9de f8ff | 3 fa24 (0) f9de (0) f8ff (0)\n============ DEPTH: 6 ==========================================\n006 2 fc51 fc39 | 2 fc51 (0) fc39 (0)\n007 1 feb3 | 1 feb3 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"ff75b19017c84128f38dec4f63e1f247a5691dc0fae186e667afedb5fe9d2c80","private_key":"a98bd329cd3c7942c9f230208e49b4c880749a41fcd4ccf7561fab55c6c08641","name":"node_ff75b19017c84128f38dec4f63e1f247a5691dc0fae186e667afedb5fe9d2c80","services":["bzz","pss"],"enable_msg_events":true,"port":33251},"up":true}},{"node":{"info":{"id":"44adaabf9c46608a374ed816d3c40c63b6645f4f6e033a76431bc8f88713eb41","name":"node_44adaabf9c46608a374ed816d3c40c63b6645f4f6e033a76431bc8f88713eb41","enode":"enode://888d38ff57ed4518cedab3e8dd7e3c2974e8a18eb4105f019d5da60aeea595855f40a76650488189d7de83a61938b4546ae8f1bb85109783ec72c771e5689819@127.0.0.1:0","enr":"0xf88fb840e02be04b2b82d311eb77cd1c1af28fba50cdcceb3a24f4bdb29b0f6450344a6d5d8cb185e0ef49a9d8b194f7819fc6ad342d52f9cb50cfc49c284a7c78d351590183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103888d38ff57ed4518cedab3e8dd7e3c2974e8a18eb4105f019d5da60aeea59585","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"RK2qv5xGYIo3TtgW08QMY7ZkX09uAzp2QxvI+IcT60E=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 44adaa\npopulation: 27 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 ba91 b3f9 ff75 | 130 a4ee (0) a5ac (0) a505 (0) a7a8 (0)\n001 3 1484 012b 0e3b | 65 244c (0) 24f8 (0) 26ac (0) 26ab (0)\n002 3 6790 648a 7660 | 26 68cb (0) 6b4e (0) 6e7f (0) 6dd3 (0)\n003 6 5a26 5bd8 5c37 5538 | 16 5ff0 (0) 5d82 (0) 5c7c (0) 5c37 (0)\n004 5 48b8 48d7 48f1 4a95 | 10 4cec (0) 4d38 (0) 4d91 (0) 4a95 (0)\n005 4 43d4 435d 402c 4005 | 5 43d4 (0) 43c9 (0) 435d (0) 402c (0)\n006 1 46bf | 1 46bf (0)\n============ DEPTH: 7 ==========================================\n007 0 | 0\n008 2 447c 447a | 2 447c (0) 447a (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"44adaabf9c46608a374ed816d3c40c63b6645f4f6e033a76431bc8f88713eb41","private_key":"97d76c34244a41e0f1ac5de3b564727ac2f324b9ad5cfca455fe8b70c05abb39","name":"node_44adaabf9c46608a374ed816d3c40c63b6645f4f6e033a76431bc8f88713eb41","services":["bzz","pss"],"enable_msg_events":true,"port":38577},"up":true}},{"node":{"info":{"id":"0e3b7722f3f84d83b3d744bea4e893715a01d4df3cf4a1c6a6823a1f5c9ad6b8","name":"node_0e3b7722f3f84d83b3d744bea4e893715a01d4df3cf4a1c6a6823a1f5c9ad6b8","enode":"enode://cdf4c78c9aa3593dd7a6467f48660ca11115fbe248d9cf9e1d57c19c890c1fc71aca0582ad7017bdc5053ce094c5905b7f77e2be5402f313786253842933cd16@127.0.0.1:0","enr":"0xf88fb840ee3d9598b270079ccc13e4add3d88bee1c6abf8d5e8431c4681a6ae45369d4b0668f324e4de0c56328849c15238ea899fc1710b328f6172fbf89dff1306ab2bf0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102cdf4c78c9aa3593dd7a6467f48660ca11115fbe248d9cf9e1d57c19c890c1fc7","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"Djt3IvP4TYOz10S+pOiTcVoB1N889KHGpoI6H1ya1rg=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 0e3b77\npopulation: 30 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 9518 ff75 da36 | 130 b8e1 (0) bbaf (0) ba91 (0) bfc7 (0)\n001 2 4005 44ad | 61 7895 (0) 7850 (0) 79e5 (0) 7933 (0)\n002 3 26ab 3728 36b9 | 28 24f8 (0) 244c (0) 26ac (0) 26ab (0)\n003 7 1fd0 1dec 1add 18e0 | 16 194e (0) 19ea (0) 18e0 (0) 1b1d (0)\n004 5 0111 012b 0314 035f | 10 07f5 (0) 046c (0) 0561 (0) 0594 (0)\n005 6 09b3 0942 096a 08bd | 6 0942 (0) 096a (0) 09b3 (0) 08bd (0)\n006 2 0cfc 0d1c | 2 0cfc (0) 0d1c (0)\n============ DEPTH: 7 ==========================================\n007 0 | 0\n008 1 0e80 | 1 0e80 (0)\n009 0 | 0\n010 0 | 0\n011 1 0e2b | 1 0e2b (0)\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"0e3b7722f3f84d83b3d744bea4e893715a01d4df3cf4a1c6a6823a1f5c9ad6b8","private_key":"4f28295b9dd454af1f4de9ea11d0d1a2952fc64eb6835cbc1c6c1a564d826654","name":"node_0e3b7722f3f84d83b3d744bea4e893715a01d4df3cf4a1c6a6823a1f5c9ad6b8","services":["bzz","pss"],"enable_msg_events":true,"port":41795},"up":true}},{"node":{"info":{"id":"da36d1df95a158b0d3f9e7407d663a6b611dde0a77f00a584b97a939ab6a00de","name":"node_da36d1df95a158b0d3f9e7407d663a6b611dde0a77f00a584b97a939ab6a00de","enode":"enode://61c96923ec6ffd96df32f0db9954bf468bd5c4c24271a86b243cd934bc8da77f1177964c7a53fc07b86f5ef32a9e1c85af77bb56fd699a99f15caae4fbb38a68@127.0.0.1:0","enr":"0xf88fb8405a4f50ee12c7e45a28c023ae4e6c05ca7407d66aea05f2837e8718b934145bb30f026867c53e3fd3eb1c9ca2829a6fe691a3b5edacee2cdd0fcd600c5614255b0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10261c96923ec6ffd96df32f0db9954bf468bd5c4c24271a86b243cd934bc8da77f","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"2jbR35WhWLDT+edAfWY6a2Ed3gp38ApYS5epOatqAN4=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: da36d1\npopulation: 36 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 7660 48f1 4a95 4005 | 126 79e5 (0) 7933 (0) 7895 (0) 7850 (0)\n001 8 a0c8 acee aaf0 b3f9 | 75 b8e1 (0) bbaf (0) ba91 (0) bea1 (0)\n002 6 e681 e277 eb68 e867 | 28 e0a0 (0) e09f (0) e2d3 (0) e277 (0)\n003 9 c8ea cdb1 cc33 c2d0 | 16 c9c3 (0) c961 (0) c8c8 (0) c8ea (0)\n004 3 d209 d302 d3e9 | 5 d700 (0) d408 (0) d3e9 (0) d302 (0)\n005 1 ddb8 | 1 ddb8 (0)\n006 2 d9cf d959 | 2 d9cf (0) d959 (0)\n============ DEPTH: 7 ==========================================\n007 1 dbd4 | 1 dbd4 (0)\n008 1 dad0 | 1 dad0 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"da36d1df95a158b0d3f9e7407d663a6b611dde0a77f00a584b97a939ab6a00de","private_key":"2022f7c1008e4670055ca434f78ed6debd0e7564d06d9d22625bafe9c2184bc8","name":"node_da36d1df95a158b0d3f9e7407d663a6b611dde0a77f00a584b97a939ab6a00de","services":["bzz","pss"],"enable_msg_events":true,"port":39225},"up":true}},{"node":{"info":{"id":"951877b34ee1535b5059c49beb03e8960ff9c12b694ef64708c77c30ff1dc706","name":"node_951877b34ee1535b5059c49beb03e8960ff9c12b694ef64708c77c30ff1dc706","enode":"enode://e61d35f746dd8b1d91286e1abb0448cbb68371b867574358604ed002233ecaebfcd5a07cbabc0bdca25a58c76fa53abd80a1bf7d62c410f2841611b676334041@127.0.0.1:0","enr":"0xf88fb840f8c031b80bf4308c84323e167eeca84179f0feebb5aad18f694024f8fde4f3424adbec09f917bc90d2d319b9debb6c903064655c754915614dc59b490178d75b0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103e61d35f746dd8b1d91286e1abb0448cbb68371b867574358604ed002233ecaeb","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"lRh3s07hU1tQWcSb6wPolg/5wStpTvZHCMd8MP8dxwY=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 951877\npopulation: 28 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 4005 0e3b 36b9 2c85 | 126 79e5 (0) 7933 (0) 7895 (0) 7850 (0)\n001 3 e867 ff75 da36 | 55 e0a0 (0) e09f (0) e2d3 (0) e277 (0)\n002 2 b3f9 ab71 | 37 be68 (0) bea1 (0) bfc7 (0) bcf8 (0)\n003 9 8862 8b43 8cc3 8e7b | 21 8b43 (0) 8854 (0) 8862 (0) 8d19 (0)\n004 3 9ec8 9f7d 9c8e | 9 9948 (0) 9959 (0) 9b8e (0) 9f0e (0)\n005 3 93c0 93ea 9257 | 3 93ea (0) 93c0 (0) 9257 (0)\n006 1 97da | 1 97da (0)\n007 1 9464 | 1 9464 (0)\n============ DEPTH: 8 ==========================================\n008 1 95c0 | 1 95c0 (0)\n009 1 955d | 1 955d (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"951877b34ee1535b5059c49beb03e8960ff9c12b694ef64708c77c30ff1dc706","private_key":"bc5b57ce450e26704097f3e90b7256f3d38b4a75973b2384deec064351eee3f7","name":"node_951877b34ee1535b5059c49beb03e8960ff9c12b694ef64708c77c30ff1dc706","services":["bzz","pss"],"enable_msg_events":true,"port":39271},"up":true}},{"node":{"info":{"id":"ab719e60a77ba5253f1690c920df9dd9f3a62071e9cce9d62e0001a522b3409e","name":"node_ab719e60a77ba5253f1690c920df9dd9f3a62071e9cce9d62e0001a522b3409e","enode":"enode://ac1fef7e9d3c51f02d8ade00cb8763bb163c214f15f52ba8025bfb6355dca1d1a9779350f5c60d02763b12902f5b176366dec0e51eb4879d0031a407cb80ba6d@127.0.0.1:0","enr":"0xf88fb84047e8f17977626db088d3ce02b567c210e5ded10efc65966d542ffd2e829e25822186597f28307a91d4fde8fc4019ff71797412eb3a69a20aa8deb95f096b3c370183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103ac1fef7e9d3c51f02d8ade00cb8763bb163c214f15f52ba8025bfb6355dca1d1","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"q3GeYKd7pSU/FpDJIN+d2fOmIHHpzOnWLgABpSKzQJ4=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: ab719e\npopulation: 24 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 36b9 2c85 | 126 79e5 (0) 7933 (0) 7895 (0) 7850 (0)\n001 5 c603 e277 e681 e867 | 55 f1ed (0) f305 (0) f2b4 (0) f215 (0)\n002 3 84a9 9c8e 9518 | 38 8b43 (0) 8854 (0) 8862 (0) 8d19 (0)\n003 3 ba91 bdc5 b3f9 | 14 bea1 (0) be68 (0) bfc7 (0) bcf8 (0)\n004 3 a616 a330 a0c8 | 13 a4ee (0) a5ac (0) a505 (0) a742 (0)\n005 2 aeb4 acee | 3 acee (0) af02 (0) aeb4 (0)\n006 4 a970 a8f4 a8ff a8b5 | 4 a8f4 (0) a8ff (0) a8b5 (0) a970 (0)\n============ DEPTH: 7 ==========================================\n007 1 aaf0 | 1 aaf0 (0)\n008 0 | 0\n009 1 ab3f | 1 ab3f (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"ab719e60a77ba5253f1690c920df9dd9f3a62071e9cce9d62e0001a522b3409e","private_key":"a4ae96d7ecb3971ea097b37390920857ffaf67fc5bae59c8cabde67de15feeb1","name":"node_ab719e60a77ba5253f1690c920df9dd9f3a62071e9cce9d62e0001a522b3409e","services":["bzz","pss"],"enable_msg_events":true,"port":34781},"up":true}},{"node":{"info":{"id":"2c85f5361b2d5abcf799de50fe58b1ed2006ea18f75823748c33eb7e95b1cc39","name":"node_2c85f5361b2d5abcf799de50fe58b1ed2006ea18f75823748c33eb7e95b1cc39","enode":"enode://b1fe3894a67c4139a898d93a93cacc87e3e6a0072f2e75faa1d692fcdae02da9056ee9d0ef8bd7de2d4cb801bea1a4c92867b686648ccdf4acc15d10ea9e92ab@127.0.0.1:0","enr":"0xf88fb840acad001cebe20e5d67e33bade1ef67f0c02b361f95b012af873d06038de2c89e7a9bcb738bbf325462227e88eefa257d8d3e3fe6567496e9bd6bcf7a4315e7b70183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103b1fe3894a67c4139a898d93a93cacc87e3e6a0072f2e75faa1d692fcdae02da9","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"LIX1NhstWrz3md5Q/lix7SAG6hj3WCN0jDPrfpWxzDk=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 2c85f5\npopulation: 38 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 c534 8e7b 9c8e 9518 | 130 e471 (0) e64d (0) e681 (0) e0a0 (0)\n001 7 741a 7660 6795 648a | 61 79e5 (0) 7933 (0) 7895 (0) 7850 (0)\n002 9 1484 1add 1fd0 1dec | 37 19ea (0) 194e (0) 18e0 (0) 1b1d (0)\n003 7 3c5b 3cab 3a62 3b02 | 17 3980 (0) 3938 (0) 397a (0) 3b02 (0)\n004 4 244c 24f8 26ac 26ab | 4 244c (0) 24f8 (0) 26ac (0) 26ab (0)\n005 2 298a 2a50 | 2 298a (0) 2a50 (0)\n006 2 2fd2 2e65 | 2 2fd2 (0) 2e65 (0)\n============ DEPTH: 7 ==========================================\n007 1 2ddf | 1 2ddf (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 1 2c80 | 1 2c80 (0)\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"2c85f5361b2d5abcf799de50fe58b1ed2006ea18f75823748c33eb7e95b1cc39","private_key":"2a8ffc679012d1aa50e2f65a8e57b2ec4320e84272a5e905cb90098bace2bddb","name":"node_2c85f5361b2d5abcf799de50fe58b1ed2006ea18f75823748c33eb7e95b1cc39","services":["bzz","pss"],"enable_msg_events":true,"port":36571},"up":true}},{"node":{"info":{"id":"36b93656cab02213fa76124af6251109356abc5e0ae5dd1e203c6a013e014548","name":"node_36b93656cab02213fa76124af6251109356abc5e0ae5dd1e203c6a013e014548","enode":"enode://e4d9f33c795e51155d700cb64f1a8d4ead769a1d93d77825a6c680750ad444ef939dbfcecf0020bb04e1bb818d28af91aaa6809d9abb42ebd3088ff3c351ec3f@127.0.0.1:0","enr":"0xf88fb84053bd3c1b1a365ed2377b3066ad1f581f1d671a75bebdf3c21d41c6e15045a85771fe183fc7f77629dcf4d2be91de26315edfc83ccc82cb68b3e900fb1fd3a6330183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103e4d9f33c795e51155d700cb64f1a8d4ead769a1d93d77825a6c680750ad444ef","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"Nrk2VsqwIhP6dhJK9iURCTVqvF4K5d0eIDxqAT4BRUg=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 36b936\npopulation: 36 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 9518 ab71 aaf0 | 130 f305 (0) f215 (0) f2b4 (0) f1ed (0)\n001 5 648a 7660 46bf 5a26 | 61 79e5 (0) 7933 (0) 7895 (0) 7850 (0)\n002 10 1fd0 138d 1784 1484 | 37 19ea (0) 194e (0) 18e0 (0) 1b1d (0)\n003 4 26ab 2a50 298a 2c85 | 11 244c (0) 24f8 (0) 26ac (0) 26ab (0)\n004 7 3c5b 3cab 3f31 3938 | 8 3980 (0) 3938 (0) 397a (0) 3b02 (0)\n005 5 32ff 3051 30fe 31e1 | 6 32ff (0) 30fe (0) 3051 (0) 3188 (0)\n============ DEPTH: 6 ==========================================\n006 1 3411 | 1 3411 (0)\n007 1 3728 | 1 3728 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"36b93656cab02213fa76124af6251109356abc5e0ae5dd1e203c6a013e014548","private_key":"fc142c5cdb7737fcd9e994ef0aab4a60ef1b23c59685a99f70384ecdcab96da9","name":"node_36b93656cab02213fa76124af6251109356abc5e0ae5dd1e203c6a013e014548","services":["bzz","pss"],"enable_msg_events":true,"port":34195},"up":true}},{"node":{"info":{"id":"aaf051a087a92f874a3f6c7923015e4cffb4bb3ef381c977fd902f21e841d0f4","name":"node_aaf051a087a92f874a3f6c7923015e4cffb4bb3ef381c977fd902f21e841d0f4","enode":"enode://7108119c77ee1ca51a8cfa49207c81c9236c48de66d0ec4441d03b409214e6cb3e6aeda9074eefc6cab261e2da67787c1e6dc5c56d9face762f3c6d228ddb3bf@127.0.0.1:0","enr":"0xf88fb840e1516801e5e9795f89e9742eb3c020e4aeab9eaa0544e8eaf742e91b186387817613a49d6e2bc5ca531ae9afe63aed360830056c25d161bee0ccf74ec289a82c0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1037108119c77ee1ca51a8cfa49207c81c9236c48de66d0ec4441d03b409214e6cb","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"qvBRoIepL4dKP2x5IwFeTP+0uz7zgcl3/ZAvIehB0PQ=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: aaf051\npopulation: 27 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 3728 36b9 | 126 7895 (0) 7850 (0) 79e5 (0) 7933 (0)\n001 5 ff75 e277 e867 da36 | 55 f1ed (0) f305 (0) f2b4 (0) f215 (0)\n002 7 9c8e 8cc3 81a5 8006 | 38 87a3 (0) 86d6 (0) 84a9 (0) 8402 (0)\n003 3 bdc5 ba91 b3f9 | 14 b8e1 (0) bbaf (0) ba91 (0) bfc7 (0)\n004 3 a616 a330 a0c8 | 13 a4ee (0) a5ac (0) a505 (0) a742 (0)\n005 2 aeb4 acee | 3 acee (0) af02 (0) aeb4 (0)\n006 3 a8f4 a8b5 a970 | 4 a8ff (0) a8f4 (0) a8b5 (0) a970 (0)\n============ DEPTH: 7 ==========================================\n007 2 ab3f ab71 | 2 ab3f (0) ab71 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"aaf051a087a92f874a3f6c7923015e4cffb4bb3ef381c977fd902f21e841d0f4","private_key":"4faa6df719db312ce7196c8b218ffe31a118192b63af6a064b63993d06809021","name":"node_aaf051a087a92f874a3f6c7923015e4cffb4bb3ef381c977fd902f21e841d0f4","services":["bzz","pss"],"enable_msg_events":true,"port":43443},"up":true}},{"node":{"info":{"id":"3728152c88f1e5e61f6523b09e8f3bb1023b700deccdca5fcc1e6488136b0e57","name":"node_3728152c88f1e5e61f6523b09e8f3bb1023b700deccdca5fcc1e6488136b0e57","enode":"enode://c114f0b7917ddfc94778644a8fcb80d6219c100706ef4f7685c3a1b20836923b2f8b668cb508c542e5140d0de8dbf3eb6d39dd3fa988cc89e5a35475d33c5ff5@127.0.0.1:0","enr":"0xf88fb8409f56eb9c402420e1ba9d1221c060d99fadee62aa892110c184c542ddc788cb872ee790ce149a666c38cbe359cba9f433a75a62641e1d1f785c7bf1f7e9c0ac220183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103c114f0b7917ddfc94778644a8fcb80d6219c100706ef4f7685c3a1b20836923b","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"NygVLIjx5eYfZSOwno87sQI7cA3szcpfzB5kiBNrDlc=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 372815\npopulation: 31 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 9c8e aaf0 | 130 f1ed (0) f305 (0) f2b4 (0) f215 (0)\n001 5 7660 648a 5bd8 5144 | 61 79e5 (0) 7933 (0) 7895 (0) 7850 (0)\n002 11 138d 1484 1784 1dc0 | 37 1049 (0) 1070 (0) 138d (0) 1686 (0)\n003 2 26ab 2c85 | 11 24f8 (0) 244c (0) 26ac (0) 26ab (0)\n004 4 3c5b 3cab 3b02 3a62 | 8 3980 (0) 3938 (0) 397a (0) 3b02 (0)\n005 5 30fe 3051 3188 31e6 | 6 32ff (0) 30fe (0) 3051 (0) 3188 (0)\n============ DEPTH: 6 ==========================================\n006 1 3411 | 1 3411 (0)\n007 1 36b9 | 1 36b9 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"3728152c88f1e5e61f6523b09e8f3bb1023b700deccdca5fcc1e6488136b0e57","private_key":"3557d9f64ffafd68249ae21654f5c1fd8576ede29a7e184fa2c80dcfcf01ca7d","name":"node_3728152c88f1e5e61f6523b09e8f3bb1023b700deccdca5fcc1e6488136b0e57","services":["bzz","pss"],"enable_msg_events":true,"port":41719},"up":true}},{"node":{"info":{"id":"9c8e1f23f260c5a46b0001572675b19e5293ca65e7fdfc131c07612e9c4072fa","name":"node_9c8e1f23f260c5a46b0001572675b19e5293ca65e7fdfc131c07612e9c4072fa","enode":"enode://4c2931c91d607781aedf9552788ec9df705def28333007e9246811be0a3ebfa8eb44baad1ddf0620a99257cb0cf9afaf7f714cae4f241510bffdf3c4b6682350@127.0.0.1:0","enr":"0xf88fb840d76ae62f54de16a707c5789592f92afaa9c1ad444f8e7fa013c8f39c20a34d4f2c0d88f8931465fc033eb4be4b1c1f4fe8150dd91ba8297ce363ffa61f1d4d440183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1024c2931c91d607781aedf9552788ec9df705def28333007e9246811be0a3ebfa8","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"nI4fI/JgxaRrAAFXJnWxnlKTymXn/fwTHAdhLpxAcvo=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 9c8e1f\npopulation: 44 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 46bf 08e5 2c85 3728 | 126 79e5 (0) 7933 (0) 7850 (0) 7895 (0)\n001 3 ff75 e867 c603 | 55 f1ed (0) f305 (0) f2b4 (0) f215 (0)\n002 9 b3f9 a616 a0c8 a330 | 37 b8e1 (0) bbaf (0) ba91 (0) bea1 (0)\n003 14 87a3 86d6 84a9 8402 | 21 87a3 (0) 86d6 (0) 8402 (0) 84a9 (0)\n004 7 9257 93c0 97da 9464 | 8 93ea (0) 93c0 (0) 9257 (0) 97da (0)\n005 3 9b8e 9948 9959 | 3 9b8e (0) 9959 (0) 9948 (0)\n006 2 9f7d 9ec8 | 3 9f0e (0) 9f7d (0) 9ec8 (0)\n============ DEPTH: 7 ==========================================\n007 0 | 0\n008 1 9c21 | 1 9c21 (0)\n009 0 | 0\n010 1 9ca1 | 1 9ca1 (0)\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"9c8e1f23f260c5a46b0001572675b19e5293ca65e7fdfc131c07612e9c4072fa","private_key":"f14ad2c3fc9ee9c4bf7c847d746dbc352159a0f470e5f9c054c623e85b32dd58","name":"node_9c8e1f23f260c5a46b0001572675b19e5293ca65e7fdfc131c07612e9c4072fa","services":["bzz","pss"],"enable_msg_events":true,"port":41867},"up":true}},{"node":{"info":{"id":"46bfa8bea56b0be1abfa5ad3561bb6bf49ed6695d83ee2b2c192c5a0408347cf","name":"node_46bfa8bea56b0be1abfa5ad3561bb6bf49ed6695d83ee2b2c192c5a0408347cf","enode":"enode://4d4243ce1bbd72776f1cd9a14309b16117af879a4d6670c2c684a772062c9ca6ce7591b97f0b28a854431891b0d2b0d4517991326bbaf7aba8056bb1eae0fd6b@127.0.0.1:0","enr":"0xf88fb84047ede3289ec2767e1b71b8a461306f27846efb00e6bd82d79a5712ec11cf570a5dd5b750d5ee3254949142a30b40d0a43174a43a895303db9fe7e2794325736e0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1034d4243ce1bbd72776f1cd9a14309b16117af879a4d6670c2c684a772062c9ca6","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"Rr+ovqVrC+Gr+lrTVhu2v0ntZpXYPuKywZLFoECDR88=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 46bfa8\npopulation: 27 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 9c8e ba91 a0c8 | 130 f6c0 (0) f645 (0) f756 (0) f305 (0)\n001 3 08e5 36b9 3728 | 65 1070 (0) 1049 (0) 138d (0) 1686 (0)\n002 5 6c01 648a 6795 741a | 26 79e5 (0) 7933 (0) 7895 (0) 7850 (0)\n003 4 52a8 50c1 5144 5a26 | 16 5ff0 (0) 5d82 (0) 5c7c (0) 5c37 (0)\n004 5 4a95 4b79 48b8 48d7 | 10 4d38 (0) 4d91 (0) 4cec (0) 4a95 (0)\n005 4 4005 402c 43d4 435d | 5 43d4 (0) 43c9 (0) 435d (0) 402c (0)\n============ DEPTH: 6 ==========================================\n006 3 447c 447a 44ad | 3 447c (0) 447a (0) 44ad (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"46bfa8bea56b0be1abfa5ad3561bb6bf49ed6695d83ee2b2c192c5a0408347cf","private_key":"b70820e75826e847f92eaf68756a7853fdb2b9405385a07431acd85be07346c3","name":"node_46bfa8bea56b0be1abfa5ad3561bb6bf49ed6695d83ee2b2c192c5a0408347cf","services":["bzz","pss"],"enable_msg_events":true,"port":46727},"up":true}},{"node":{"info":{"id":"a0c88ba70599b0e72c18fa6aedd14d607cca3e9a49a5d50165d084e70328c2dd","name":"node_a0c88ba70599b0e72c18fa6aedd14d607cca3e9a49a5d50165d084e70328c2dd","enode":"enode://c4dfc6549432092140b323c294e153ed2fce4e66d90c5342dd739a17b6f8e941241ae157f54b265c8c20b6fdbea7d31097672735a366fd0a39cd6b8e3b7a8b9e@127.0.0.1:0","enr":"0xf88fb84096f40381fc8d8894e700731acada297f8d3f467ebe034ffb0fb3ba1aed4804fc2b00a87923ceb549a89ef5c5cf4d2fe663bb50e216cd249ef9a408b6c57ffe2b0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102c4dfc6549432092140b323c294e153ed2fce4e66d90c5342dd739a17b6f8e941","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"oMiLpwWZsOcsGPpq7dFNYHzKPppJpdUBZdCE5wMowt0=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: a0c88b\npopulation: 38 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 648a 5144 46bf | 126 24f8 (0) 244c (0) 26ac (0) 26ab (0)\n001 8 da36 c603 c6a8 ff75 | 55 f1ed (0) f2b4 (0) f215 (0) f305 (0)\n002 8 9257 9c8e 8e7b 84a9 | 38 87a3 (0) 86d6 (0) 8402 (0) 84a9 (0)\n003 5 b3f9 bdc5 be68 bfc7 | 14 b8e1 (0) bbaf (0) ba91 (0) bcf8 (0)\n004 5 aaf0 ab71 a970 aeb4 | 10 acee (0) af02 (0) aeb4 (0) a8f4 (0)\n005 4 a505 a7a8 a606 a616 | 7 a4ee (0) a5ac (0) a505 (0) a742 (0)\n============ DEPTH: 6 ==========================================\n006 4 a2a1 a2e6 a327 a330 | 4 a2a1 (0) a2e6 (0) a327 (0) a330 (0)\n007 1 a1c8 | 1 a1c8 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"a0c88ba70599b0e72c18fa6aedd14d607cca3e9a49a5d50165d084e70328c2dd","private_key":"1d99f9d95bb5133e67b3abc4fa875f292bb3ef13fc4c32d522507cb6251a737b","name":"node_a0c88ba70599b0e72c18fa6aedd14d607cca3e9a49a5d50165d084e70328c2dd","services":["bzz","pss"],"enable_msg_events":true,"port":38619},"up":true}},{"node":{"info":{"id":"648a96d61898eb2d336ff7d5a229cfeb7b9f587282e40f9fe640e181ae26bdd3","name":"node_648a96d61898eb2d336ff7d5a229cfeb7b9f587282e40f9fe640e181ae26bdd3","enode":"enode://d8d46c12cb0b4cecaf8ab1b972365c7b0568897ccea94352a7b702da0ca1bc6bf559f91c6612d9f452d2af2a32d9b56233b6176241e824db5d784bd0f8015b9b@127.0.0.1:0","enr":"0xf88fb84012854e946d3ccd03e5b967f46ecf70aa3b0b1ccebf7bb7d40f2f80c30110a99b478aa38170b4c3aea017b04fbafa023de9fc42342d0643729f55ce9d2b7119760183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103d8d46c12cb0b4cecaf8ab1b972365c7b0568897ccea94352a7b702da0ca1bc6b","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"ZIqW1hiY6y0zb/fVoinP63ufWHKC5A+f5kDhga4mvdM=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 648a96\npopulation: 31 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 c603 aeb4 a0c8 | 130 f1ed (0) f305 (0) f2b4 (0) f215 (0)\n001 4 2c85 36b9 3728 08e5 | 65 24f8 (0) 244c (0) 26ac (0) 26ab (0)\n002 9 4b79 4a95 402c 4005 | 35 4cec (0) 4d38 (0) 4d91 (0) 4a95 (0)\n003 6 7ce7 7c7c 7e47 7049 | 13 79e5 (0) 7933 (0) 7895 (0) 7850 (0)\n004 4 6b4e 6e7f 6d5e 6c01 | 7 68cb (0) 6b4e (0) 6e7f (0) 6dd3 (0)\n005 1 60c5 | 1 60c5 (0)\n============ DEPTH: 6 ==========================================\n006 4 6758 67f3 6790 6795 | 4 6758 (0) 67f3 (0) 6790 (0) 6795 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"648a96d61898eb2d336ff7d5a229cfeb7b9f587282e40f9fe640e181ae26bdd3","private_key":"919debfc547283a6f83386441c4f7b3eaec238931b8e97ea9cf7b8f5516ff110","name":"node_648a96d61898eb2d336ff7d5a229cfeb7b9f587282e40f9fe640e181ae26bdd3","services":["bzz","pss"],"enable_msg_events":true,"port":34693},"up":true}},{"node":{"info":{"id":"51440ab47fc5076c00cad16a542b846c26b3281ecea4dbca795ae9b80183ec90","name":"node_51440ab47fc5076c00cad16a542b846c26b3281ecea4dbca795ae9b80183ec90","enode":"enode://61414ffd81e2e685b199ba6089abc6cf7c18cf4bd3654114e8c2a99dfdc4413b8e36b194557bf9b65dc44deaa9478cd4f1c712bbd946ec4ae3e057c878f05610@127.0.0.1:0","enr":"0xf88fb840bb0506fc37a0cd2ae940ab2b93d4b26476b65fbfb40eefe43af7b43776d9a275164cb946279137a07b6bc6cca0ab5bacc802d203049766cf1abf3081b6d7c1ca0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10261414ffd81e2e685b199ba6089abc6cf7c18cf4bd3654114e8c2a99dfdc4413b","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"UUQKtH/FB2wAytFqVCuEbCazKB7OpNvKeVrpuAGD7JA=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 51440a\npopulation: 28 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 aeb4 a0c8 e277 c603 | 130 b8e1 (0) bbaf (0) ba91 (0) bcf8 (0)\n001 3 3728 36b9 08e5 | 65 244c (0) 24f8 (0) 26ac (0) 26ab (0)\n002 3 7660 6795 648a | 26 79e5 (0) 7933 (0) 7850 (0) 7895 (0)\n003 9 48f1 4a95 4b79 435d | 19 4cec (0) 4d38 (0) 4d91 (0) 4a95 (0)\n004 4 5c7c 5c37 5bd8 5a26 | 10 5ff0 (0) 5d82 (0) 5c7c (0) 5c37 (0)\n005 3 5663 56ca 5538 | 3 5663 (0) 56ca (0) 5538 (0)\n============ DEPTH: 6 ==========================================\n006 1 52a8 | 1 52a8 (0)\n007 1 50c1 | 1 50c1 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"51440ab47fc5076c00cad16a542b846c26b3281ecea4dbca795ae9b80183ec90","private_key":"1e8a712b0dd95600c1e67872aa3bcc3e875f05bfe3dacb2f0d546ccd810825bc","name":"node_51440ab47fc5076c00cad16a542b846c26b3281ecea4dbca795ae9b80183ec90","services":["bzz","pss"],"enable_msg_events":true,"port":36863},"up":true}},{"node":{"info":{"id":"c603138e40fe2f85cc634017956ada6399fca99969e3bf0c1ee8428374e779f1","name":"node_c603138e40fe2f85cc634017956ada6399fca99969e3bf0c1ee8428374e779f1","enode":"enode://bed7f6e2cf97600f47210eb1b764eabd6a4725c42d3a7333ed8c4b102442528805dbb8bbcc925fcb62432d06c6418410818d9acbc7bccc0c5979e978bc71a414@127.0.0.1:0","enr":"0xf88fb84044f3f935b08146d7ec9f7864874f4641340f171f272858a0f0889877add866cb5795ad8f80508454ba568f7a3f082d552beb4897dd6eb51d7f8675869573fcaf0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102bed7f6e2cf97600f47210eb1b764eabd6a4725c42d3a7333ed8c4b1024425288","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"xgMTjkD+L4XMY0AXlWraY5n8qZlp478MHuhCg3TnefE=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: c60313\npopulation: 35 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 08e5 7660 648a 5144 | 126 24f8 (0) 244c (0) 26ac (0) 26ab (0)\n001 8 b3f9 a0c8 aaf0 ab71 | 75 87a3 (0) 86d6 (0) 8402 (0) 84a9 (0)\n002 6 ff75 e681 e277 eff2 | 28 f1ed (0) f305 (0) f2b4 (0) f215 (0)\n003 5 d3e9 d302 d209 d959 | 11 d408 (0) d700 (0) d3e9 (0) d302 (0)\n004 5 c8c8 c961 cf52 cd6c | 8 c8ea (0) c8c8 (0) c9c3 (0) c961 (0)\n005 3 c190 c272 c2d0 | 3 c190 (0) c272 (0) c2d0 (0)\n006 2 c42e c534 | 2 c42e (0) c534 (0)\n============ DEPTH: 7 ==========================================\n007 1 c74d | 1 c74d (0)\n008 1 c6a8 | 1 c6a8 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"c603138e40fe2f85cc634017956ada6399fca99969e3bf0c1ee8428374e779f1","private_key":"f8c72bb1240635df9cef74f22b6fe80b40ab667b1917f49f50bbdff097c07eb4","name":"node_c603138e40fe2f85cc634017956ada6399fca99969e3bf0c1ee8428374e779f1","services":["bzz","pss"],"enable_msg_events":true,"port":35079},"up":true}},{"node":{"info":{"id":"08e5a268f397385c69a7fec855ae4d889cfa98afef5b7c09fc4841e3f8894ad8","name":"node_08e5a268f397385c69a7fec855ae4d889cfa98afef5b7c09fc4841e3f8894ad8","enode":"enode://ea5b166448c3dd527b2c18555655ee6f90b2bbf3b1d4a447c551801ecab3dba7e5dca4dd2877fc63533ca94dbb39d0583cd6551a0e81bc418ac506a0b2fcdf27@127.0.0.1:0","enr":"0xf88fb840c953b80c5d75dd35fac2c5a49c4dc5308f80a1a9482547b48755d37fb417193c0dc806cf8ce00ec289850183f6837f5c684a68add6e9420bdb6fb937684d72b60183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103ea5b166448c3dd527b2c18555655ee6f90b2bbf3b1d4a447c551801ecab3dba7","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"COWiaPOXOFxpp/7IVa5NiJz6mK/vW3wJ/EhB4/iJStg=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 08e5a2\npopulation: 31 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 9c8e aeb4 e277 e867 | 130 86d6 (0) 87a3 (0) 8402 (0) 84a9 (0)\n001 4 648a 46bf 5144 5a26 | 61 79e5 (0) 7933 (0) 7895 (0) 7850 (0)\n002 3 2c85 36b9 3728 | 28 24f8 (0) 244c (0) 26ac (0) 26ab (0)\n003 6 138d 1784 140d 1484 | 16 1049 (0) 1070 (0) 138d (0) 1686 (0)\n004 4 0594 0314 012b 0111 | 10 07f5 (0) 046c (0) 0561 (0) 0594 (0)\n005 4 0d1c 0cfc 0e2b 0e3b | 5 0cfc (0) 0d1c (0) 0e80 (0) 0e2b (0)\n============ DEPTH: 6 ==========================================\n006 0 | 0\n007 3 09b3 0942 096a | 3 0942 (0) 096a (0) 09b3 (0)\n008 0 | 0\n009 1 08bd | 1 08bd (0)\n010 0 | 0\n011 1 08f8 | 1 08f8 (0)\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"08e5a268f397385c69a7fec855ae4d889cfa98afef5b7c09fc4841e3f8894ad8","private_key":"23182ea48dee85a9137e3024980f59b9d2ab3ff4d922fcd1b30583fdf83baaca","name":"node_08e5a268f397385c69a7fec855ae4d889cfa98afef5b7c09fc4841e3f8894ad8","services":["bzz","pss"],"enable_msg_events":true,"port":45333},"up":true}},{"node":{"info":{"id":"5a26ae73eebf27f6dbec2414f1277a249e814a7a06790d7061610e5227b086f6","name":"node_5a26ae73eebf27f6dbec2414f1277a249e814a7a06790d7061610e5227b086f6","enode":"enode://2ef3561ee8a3827e57f043fc9f0ab7cffb1bcd3ae7cdbbcf67699cd748e6b8da52fcbf6de1738f3da9b1101b0accddafdd133fbd61899b1a5c45a148344055d0@127.0.0.1:0","enr":"0xf88fb84086144704d9432e5493c584d85cf6d3997698361f501788b244566421cbd614c02beeeba7a937b9b0f2616fef916d5978e3079068bedcc45fcf6f749fa354a41d0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1022ef3561ee8a3827e57f043fc9f0ab7cffb1bcd3ae7cdbbcf67699cd748e6b8da","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"Wiauc+6/J/bb7CQU8Sd6JJ6BSnoGeQ1wYWEOUiewhvY=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 5a26ae\npopulation: 34 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 84a9 81a5 8006 80d7 | 130 87a3 (0) 86d6 (0) 8402 (0) 84a9 (0)\n001 3 2c85 36b9 08e5 | 65 244c (0) 24f8 (0) 26ac (0) 26ab (0)\n002 6 7c46 7e47 741a 7660 | 26 79e5 (0) 7933 (0) 7895 (0) 7850 (0)\n003 9 4b79 4a95 48f1 435d | 19 4cec (0) 4d38 (0) 4d91 (0) 4a95 (0)\n004 2 52a8 5144 | 6 56ca (0) 5663 (0) 5538 (0) 52a8 (0)\n005 3 5d82 5c37 5c7c | 4 5ff0 (0) 5d82 (0) 5c37 (0) 5c7c (0)\n006 2 5814 5987 | 2 5814 (0) 5987 (0)\n007 1 5bd8 | 1 5bd8 (0)\n============ DEPTH: 8 ==========================================\n008 2 5ac0 5a8b | 2 5ac0 (0) 5a8b (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"5a26ae73eebf27f6dbec2414f1277a249e814a7a06790d7061610e5227b086f6","private_key":"be696e717d5a91103bc542c6cd7e0b0be4b48502beeb1853da20425d07766a9f","name":"node_5a26ae73eebf27f6dbec2414f1277a249e814a7a06790d7061610e5227b086f6","services":["bzz","pss"],"enable_msg_events":true,"port":33893},"up":true}},{"node":{"info":{"id":"e8676d17966625c4fdac6bd9437981a0cf869c8b0010812edf0c79805e0e1ff1","name":"node_e8676d17966625c4fdac6bd9437981a0cf869c8b0010812edf0c79805e0e1ff1","enode":"enode://72e1ea4365070797e7b04d70c2fcad2502d98a96da55ad4a160b42dabf961951e630354d7ca7c321cbf1f5626574b2619a9fdc940ba34d9d1a7a4040f7dd292d@127.0.0.1:0","enr":"0xf88fb840825ecb133fee1dc489fa785a34e83053c110b2233e3c247614a64b09fa55a9770f3b85c38cea0f103bbbe6a97b8cac4ee63240e58e4675694db27f5402ff50660183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10372e1ea4365070797e7b04d70c2fcad2502d98a96da55ad4a160b42dabf961951","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"6GdtF5ZmJcT9rGvZQ3mBoM+GnIsAEIEu3wx5gF4OH/E=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: e8676d\npopulation: 34 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 2a50 1dec 08e5 5a26 | 126 24f8 (0) 244c (0) 26ac (0) 26ab (0)\n001 8 8862 93c0 9518 9c8e | 75 87a3 (0) 86d6 (0) 8402 (0) 84a9 (0)\n002 4 d209 da36 d959 c603 | 27 d700 (0) d408 (0) d3e9 (0) d302 (0)\n003 6 f756 f215 ff75 fc51 | 14 f1ed (0) f305 (0) f2b4 (0) f215 (0)\n004 6 e471 e64d e681 e09f | 7 e471 (0) e64d (0) e681 (0) e0a0 (0)\n============ DEPTH: 5 ==========================================\n005 5 eff2 ef99 eebd ec90 | 5 ec90 (0) ed42 (0) eebd (0) ef99 (0)\n006 1 eb68 | 1 eb68 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"e8676d17966625c4fdac6bd9437981a0cf869c8b0010812edf0c79805e0e1ff1","private_key":"08fe456242f38e34929ed0b545e558015d4a0759d6306e8a146d36cf893d4b5b","name":"node_e8676d17966625c4fdac6bd9437981a0cf869c8b0010812edf0c79805e0e1ff1","services":["bzz","pss"],"enable_msg_events":true,"port":45195},"up":true}},{"node":{"info":{"id":"aeb45fe10b0dbd0f72ab6a77fbf971a8f46dbcdd96c08f23279d1434b4f38b1d","name":"node_aeb45fe10b0dbd0f72ab6a77fbf971a8f46dbcdd96c08f23279d1434b4f38b1d","enode":"enode://95bfeea5c376843748c0b4579a13d01255d69aeb09a34f505ba5f0f0a66f5af8c58878ee35613db89c943fddbee64ed3a135d8518501eac5a9adb497b2779202@127.0.0.1:0","enr":"0xf88fb840ba5b589b63f888f95db7ac61bda2976a43eed9b35eac3e78cff7033f9fad31052b057c291e9b5977783d568855bf8ed309fbdaa39fec7b2b08484bfc149e16fe0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10295bfeea5c376843748c0b4579a13d01255d69aeb09a34f505ba5f0f0a66f5af8","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"rrRf4QsNvQ9yq2p3+/lxqPRtvN2WwI8jJ50UNLTzix0=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: aeb45f\npopulation: 32 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 648a 5144 09b3 08e5 | 126 7895 (0) 7850 (0) 79e5 (0) 7933 (0)\n001 6 c6a8 d302 e64d e277 | 55 d408 (0) d700 (0) d3e9 (0) d302 (0)\n002 6 9c8e 8006 80d7 8862 | 38 93ea (0) 93c0 (0) 9257 (0) 97da (0)\n003 3 b3f9 bfc7 be68 | 14 b8e1 (0) bbaf (0) ba91 (0) bdc5 (0)\n004 4 a505 a616 a0c8 a330 | 13 a4ee (0) a5ac (0) a505 (0) a742 (0)\n005 7 aaf0 ab3f ab71 a8f4 | 7 a8f4 (0) a8ff (0) a8b5 (0) a970 (0)\n============ DEPTH: 6 ==========================================\n006 1 acee | 1 acee (0)\n007 1 af02 | 1 af02 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"aeb45fe10b0dbd0f72ab6a77fbf971a8f46dbcdd96c08f23279d1434b4f38b1d","private_key":"fd2d10c67a8ec4e327748697560a38d057a694d0f889a4a046bfa41de466686e","name":"node_aeb45fe10b0dbd0f72ab6a77fbf971a8f46dbcdd96c08f23279d1434b4f38b1d","services":["bzz","pss"],"enable_msg_events":true,"port":39549},"up":true}},{"node":{"info":{"id":"e2770cef7c1ad312b70d94ca5570e45f324c798a31a93203f505167aeab122b6","name":"node_e2770cef7c1ad312b70d94ca5570e45f324c798a31a93203f505167aeab122b6","enode":"enode://892384debfb7b9e896252f96c210dbb3def7e24f74947e7737c5c68c7d0a4e43a9859926ef56ea490f905c0fc71a8703571b636948be1f5fe6b5f1ade6d4a5f6@127.0.0.1:0","enr":"0xf88fb840f52490d9e0dee88fedf1f1da621cec20d765e3eff7b5e213d5bb3fbda356b49520319ae12d1f41a30d4b20d4b7b0052635b3ab1532ffe66f9935b55c4b7e56b70183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102892384debfb7b9e896252f96c210dbb3def7e24f74947e7737c5c68c7d0a4e43","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"4ncM73wa0xK3DZTKVXDkXzJMeYoxqTID9QUWeuqxIrY=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: e2770c\npopulation: 36 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 1add 1dec 08e5 5144 | 126 24f8 (0) 244c (0) 26ac (0) 26ab (0)\n001 8 b3f9 a0c8 ab71 aaf0 | 75 b8e1 (0) bbaf (0) ba91 (0) bcf8 (0)\n002 5 d209 da36 d959 c74d | 27 d408 (0) d700 (0) d3e9 (0) d302 (0)\n003 6 f215 f756 ff75 fc51 | 14 f1ed (0) f305 (0) f2b4 (0) f215 (0)\n004 6 ed42 eebd ef99 eff2 | 7 ec90 (0) ed42 (0) eebd (0) ef99 (0)\n005 3 e471 e64d e681 | 3 e471 (0) e681 (0) e64d (0)\n============ DEPTH: 6 ==========================================\n006 2 e0a0 e09f | 2 e0a0 (0) e09f (0)\n007 0 | 0\n008 1 e2d3 | 1 e2d3 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"e2770cef7c1ad312b70d94ca5570e45f324c798a31a93203f505167aeab122b6","private_key":"2c978daf46f400bc226fdece07412297280001b2715e8c93de73a32f023d5431","name":"node_e2770cef7c1ad312b70d94ca5570e45f324c798a31a93203f505167aeab122b6","services":["bzz","pss"],"enable_msg_events":true,"port":38147},"up":true}},{"node":{"info":{"id":"8e7b96d28edae711e1a4cee0d894e0bd92cdf410ba6f61713f7d9b0bee761d4c","name":"node_8e7b96d28edae711e1a4cee0d894e0bd92cdf410ba6f61713f7d9b0bee761d4c","enode":"enode://eaaca956b740a54195744f6fbd39e020a7ed769cde7f3df89d0ad741ab11159109304ecbba955b7a09dc92014980a987cb17974458d5bf95cdb518ebd41ad4c9@127.0.0.1:0","enr":"0xf88fb84076f9d40288370d9a357f38d036465939c57156da3ee6f9beff1bfae263870b645bb1081bff97858367926e3e377114d326935c349eb355349a781b34a81f12c30183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103eaaca956b740a54195744f6fbd39e020a7ed769cde7f3df89d0ad741ab111591","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"jnuW0o7a5xHhpM7g2JTgvZLN9BC6b2FxP32bC+52HUw=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 8e7b96\npopulation: 29 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 26ab 298a 2c85 6795 | 126 244c (0) 24f8 (0) 26ac (0) 26ab (0)\n001 3 f8ff eff2 e277 | 55 cf52 (0) cc33 (0) cd6c (0) cdb1 (0)\n002 3 a0c8 aeb4 acee | 37 b8e1 (0) ba91 (0) bbaf (0) bdc5 (0)\n003 2 9518 9c8e | 17 9257 (0) 93ea (0) 93c0 (0) 97da (0)\n004 9 8402 84a9 837f 8358 | 12 87a3 (0) 86d6 (0) 8402 (0) 84a9 (0)\n005 3 8b43 8862 8854 | 3 8b43 (0) 8854 (0) 8862 (0)\n006 2 8d19 8cc3 | 2 8d19 (0) 8cc3 (0)\n007 1 8f9a | 1 8f9a (0)\n============ DEPTH: 8 ==========================================\n008 1 8ea2 | 1 8ea2 (0)\n009 1 8e28 | 1 8e28 (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"8e7b96d28edae711e1a4cee0d894e0bd92cdf410ba6f61713f7d9b0bee761d4c","private_key":"ad33c8a077ba94e011226ec6b81f81a198f556dce8d1eb447d60309f2ec96157","name":"node_8e7b96d28edae711e1a4cee0d894e0bd92cdf410ba6f61713f7d9b0bee761d4c","services":["bzz","pss"],"enable_msg_events":true,"port":45223},"up":true}},{"node":{"info":{"id":"679554b410e415cfcdf1b14ef87759269b2bcaf07f4541122977db3a40091da2","name":"node_679554b410e415cfcdf1b14ef87759269b2bcaf07f4541122977db3a40091da2","enode":"enode://ed0a39e471509e34dba42412c9de5254e84965cf0532fb62288d0ec74098a7bcbc079ad9c063d1c5be83f76623f266d20dedf46ff8a631ebef5304d8062d47c9@127.0.0.1:0","enr":"0xf88fb840f2fb222edf9f0115e6c84901f82209242c979a9850fdb20841b740c82795ec9516c9f9b248ce6f15b12d488ecc61618fb48e78f2cbfc28a11242c72af5571b140183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103ed0a39e471509e34dba42412c9de5254e84965cf0532fb62288d0ec74098a7bc","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"Z5VUtBDkFc/N8bFO+HdZJpsryvB/RUESKXfbOkAJHaI=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 679554\npopulation: 30 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 eff2 e277 8862 8e7b | 130 c961 (0) c9c3 (0) c8ea (0) c8c8 (0)\n001 4 2c85 3c5b 0111 1dec | 65 24f8 (0) 244c (0) 26ac (0) 26ab (0)\n002 6 48f1 447a 46bf 402c | 35 4cec (0) 4d38 (0) 4d91 (0) 4a95 (0)\n003 6 7660 741a 7049 7ce7 | 13 79e5 (0) 7933 (0) 7850 (0) 7895 (0)\n004 5 6b4e 6e7f 6d3c 6d5e | 7 68cb (0) 6b4e (0) 6e7f (0) 6dd3 (0)\n005 1 60c5 | 1 60c5 (0)\n006 1 648a | 1 648a (0)\n============ DEPTH: 7 ==========================================\n007 0 | 0\n008 1 6758 | 1 6758 (0)\n009 1 67f3 | 1 67f3 (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 1 6790 | 1 6790 (0)\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"679554b410e415cfcdf1b14ef87759269b2bcaf07f4541122977db3a40091da2","private_key":"295ee49e1d8a7a3fe5af430314a49ea88e405bb74583239a90f3a140bd4d5d7d","name":"node_679554b410e415cfcdf1b14ef87759269b2bcaf07f4541122977db3a40091da2","services":["bzz","pss"],"enable_msg_events":true,"port":37471},"up":true}},{"node":{"info":{"id":"8862cd85d7039119b984f752a458ac0495ddea98c69fc1d1241db7873a712c11","name":"node_8862cd85d7039119b984f752a458ac0495ddea98c69fc1d1241db7873a712c11","enode":"enode://cde94747f8a20e0bb2560ee9a2af2f6b6537e357a16d3405053a591946807074639abe205cc94e3d89e61445686731991d30a685a5e21a23d43f604cd3164970@127.0.0.1:0","enr":"0xf88fb840c4e3c83eec1c9b3873f6d92f1f6c212da5808e380a2298bd31f54eec9e76abc17d44dc112b0c2d2633b2fdf34f53afcc250b2bb0b5b596df651a3eda03d154cb0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102cde94747f8a20e0bb2560ee9a2af2f6b6537e357a16d3405053a591946807074","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"iGLNhdcDkRm5hPdSpFisBJXd6pjGn8HRJB23hzpxLBE=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 8862cd\npopulation: 27 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 5a26 6795 | 126 24f8 (0) 244c (0) 26ac (0) 26ab (0)\n001 3 d959 e867 e277 | 55 cf52 (0) cdb1 (0) cd6c (0) cc33 (0)\n002 3 b3f9 aeb4 acee | 37 b8e1 (0) bbaf (0) ba91 (0) bdc5 (0)\n003 3 9518 9257 9c8e | 17 93ea (0) 93c0 (0) 9257 (0) 97da (0)\n004 9 86d6 84a9 8402 834f | 12 87a3 (0) 86d6 (0) 8402 (0) 84a9 (0)\n005 5 8cc3 8d19 8e7b 8e28 | 6 8d19 (0) 8cc3 (0) 8f9a (0) 8ea2 (0)\n============ DEPTH: 6 ==========================================\n006 1 8b43 | 1 8b43 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 1 8854 | 1 8854 (0)\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"8862cd85d7039119b984f752a458ac0495ddea98c69fc1d1241db7873a712c11","private_key":"5b139026f24d426829e4000c0729b6cf94f244c94dc6f40c4408a50c7bbc7e2c","name":"node_8862cd85d7039119b984f752a458ac0495ddea98c69fc1d1241db7873a712c11","services":["bzz","pss"],"enable_msg_events":true,"port":33033},"up":true}},{"node":{"info":{"id":"aceee75a260d45252060fe971eabd4bde25f912db4a3c6e47f4a09572fe01697","name":"node_aceee75a260d45252060fe971eabd4bde25f912db4a3c6e47f4a09572fe01697","enode":"enode://41590aa46824b94b64e61a0ba359d8b90fd986c1b1ff0556d51bfa03064616d68e5db68d74e7c89ce7a21c7baca305a808a409df46280f96ae5110560aba272d@127.0.0.1:0","enr":"0xf88fb8407a50df7269c86adec9f03aec5a49050ce842bd9f615b6a0c7f718e6bd95d59c153e0b12a99f1e8583eba20470c4bf7315e9376df0e719fb29eb5845d5eee653f0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10341590aa46824b94b64e61a0ba359d8b90fd986c1b1ff0556d51bfa03064616d6","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"rO7nWiYNRSUgYP6XHqvUveJfkS20o8bkf0oJVy/gFpc=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: aceee7\npopulation: 31 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 09b3 3c5b 6c01 | 126 24f8 (0) 244c (0) 26ac (0) 26ab (0)\n001 5 da36 d959 e64d e277 | 55 cf52 (0) cc33 (0) cdb1 (0) cd6c (0)\n002 7 9c8e 80d7 8006 8cc3 | 38 93ea (0) 93c0 (0) 9257 (0) 97da (0)\n003 5 ba91 bdc5 bfc7 be68 | 14 b8e1 (0) bbaf (0) ba91 (0) bcf8 (0)\n004 3 a616 a0c8 a330 | 13 a4ee (0) a5ac (0) a505 (0) a742 (0)\n005 6 a970 a8ff a8b5 aaf0 | 7 a8f4 (0) a8ff (0) a8b5 (0) a970 (0)\n============ DEPTH: 6 ==========================================\n006 2 af02 aeb4 | 2 af02 (0) aeb4 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"aceee75a260d45252060fe971eabd4bde25f912db4a3c6e47f4a09572fe01697","private_key":"0aacb09a0fb2947e95aacfb35aee79d77b33577dc33960a8eda97847f015ef58","name":"node_aceee75a260d45252060fe971eabd4bde25f912db4a3c6e47f4a09572fe01697","services":["bzz","pss"],"enable_msg_events":true,"port":41855},"up":true}},{"node":{"info":{"id":"6c0142984d629ae6995894de9e7e5eb8d3fe45e1641d7ebd63959d2e61548ba3","name":"node_6c0142984d629ae6995894de9e7e5eb8d3fe45e1641d7ebd63959d2e61548ba3","enode":"enode://b9df58044341d94dfdfbd7423f9f8e44cbd1988eb021f9af28aff240c9a82a2cd80e372bdf01aff5ea2cfc8f237351d75a33d6b5cedbbaf11e3fc7e01299ac0d@127.0.0.1:0","enr":"0xf88fb84038e531185ddede85a603500b82295e3edf51326825e4ce34730604ab4d3522bd103c828112617841c50911bd782b291d031c80b1847b70b2466f8a594e8228ad0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103b9df58044341d94dfdfbd7423f9f8e44cbd1988eb021f9af28aff240c9a82a2c","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"bAFCmE1imuaZWJTenn5euNP+ReFkHX69Y5WdLmFUi6M=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 6c0142\npopulation: 33 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 eff2 8cc3 84a9 acee | 130 c961 (0) c9c3 (0) c8ea (0) c8c8 (0)\n001 4 3c5b 0111 1add 1dec | 65 244c (0) 24f8 (0) 26ac (0) 26ab (0)\n002 8 48d7 48f1 4a95 447a | 35 4d38 (0) 4d91 (0) 4cec (0) 4a95 (0)\n003 6 741a 7660 7049 7c7c | 13 70f6 (0) 7049 (0) 741a (0) 7660 (0)\n004 5 60c5 648a 6758 67f3 | 6 60c5 (0) 648a (0) 6758 (0) 67f3 (0)\n005 2 68cb 6b4e | 2 68cb (0) 6b4e (0)\n006 1 6e7f | 1 6e7f (0)\n============ DEPTH: 7 ==========================================\n007 3 6d5e 6d3c 6dd3 | 3 6dd3 (0) 6d3c (0) 6d5e (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"6c0142984d629ae6995894de9e7e5eb8d3fe45e1641d7ebd63959d2e61548ba3","private_key":"9ca2399351f822028b5da22e6bc0154901d8ea738bbdf6bdcd4bcc21c3ed0d5b","name":"node_6c0142984d629ae6995894de9e7e5eb8d3fe45e1641d7ebd63959d2e61548ba3","services":["bzz","pss"],"enable_msg_events":true,"port":36003},"up":true}},{"node":{"info":{"id":"eff2450bea797ff66d93e7c1c1b0977cddf3abba64bfa51bcc509d728569e2fa","name":"node_eff2450bea797ff66d93e7c1c1b0977cddf3abba64bfa51bcc509d728569e2fa","enode":"enode://e8b833b40e8298b358b18b45e4339fb6608150de9aac211997746cd94c54f9aaf222cffa82031877b46c104bcf3925b66ec72c0249c56469a6e91915a5e55264@127.0.0.1:0","enr":"0xf88fb84052bdfa57cdb21c78128b249f7474f67fc7914496c70263b47c9c07b65968118861855f3f3557bbe4d668f5f65ac095b39e2e02b29c76aec618aa9680f4dda5570183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102e8b833b40e8298b358b18b45e4339fb6608150de9aac211997746cd94c54f9aa","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"7/JFC+p5f/Ztk+fBwbCXfN3zq7pkv6UbzFCdcoVp4vo=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: eff245\npopulation: 28 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 1dec 6795 6c01 52a8 | 126 24f8 (0) 244c (0) 26ac (0) 26ab (0)\n001 7 8e7b 8006 80d7 a330 | 75 b8e1 (0) bbaf (0) ba91 (0) bcf8 (0)\n002 4 c603 c74d d209 d959 | 27 cf52 (0) cc33 (0) cdb1 (0) cd6c (0)\n003 4 fc51 ff75 f9de f8ff | 14 f6c0 (0) f645 (0) f756 (0) f1ed (0)\n004 3 e681 e64d e277 | 7 e471 (0) e681 (0) e64d (0) e09f (0)\n005 2 e867 eb68 | 2 eb68 (0) e867 (0)\n006 2 ec90 ed42 | 2 ec90 (0) ed42 (0)\n============ DEPTH: 7 ==========================================\n007 1 eebd | 1 eebd (0)\n008 0 | 0\n009 1 ef99 | 1 ef99 (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"eff2450bea797ff66d93e7c1c1b0977cddf3abba64bfa51bcc509d728569e2fa","private_key":"5dfe6750469b59c78af3ed5c6d49cda36cf5da33a2b02380cadc1833ffacec3e","name":"node_eff2450bea797ff66d93e7c1c1b0977cddf3abba64bfa51bcc509d728569e2fa","services":["bzz","pss"],"enable_msg_events":true,"port":44215},"up":true}},{"node":{"info":{"id":"52a8747e4ea35f6f50c72d7c481616f68a5e4396248332b8ff69d3a772de49ac","name":"node_52a8747e4ea35f6f50c72d7c481616f68a5e4396248332b8ff69d3a772de49ac","enode":"enode://6d8774da40def7a5b17bb5815e018bc2cefba4129897e17f1a8fe1c9b86218c3d980322811c74b84881232dfa2370d502be9bf56cf705dc2fa1442fab44e1a9f@127.0.0.1:0","enr":"0xf88fb8404567e884ed9478156080ac3b497bacbba7c91cebeb40e60ff39f2fc98237d0bb13fdcab19d93a55bc38c89b23f382274493972d896ce4cb24af71a9f169ab2cd0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1036d8774da40def7a5b17bb5815e018bc2cefba4129897e17f1a8fe1c9b86218c3","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"Uqh0fk6jX29Qxy18SBYW9opeQ5YkgzK4/2nTp3LeSaw=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 52a874\npopulation: 27 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 d959 eff2 | 130 b8e1 (0) ba91 (0) bbaf (0) bfc7 (0)\n001 4 3c5b 0111 1add 1dec | 65 244c (0) 24f8 (0) 26ac (0) 26ab (0)\n002 3 7e47 6795 6c01 | 26 70f6 (0) 7049 (0) 741a (0) 7660 (0)\n003 8 4cec 48f1 435d 402c | 19 4d38 (0) 4d91 (0) 4cec (0) 4b79 (0)\n004 6 5d82 5c7c 5c37 5987 | 10 5ff0 (0) 5d82 (0) 5c37 (0) 5c7c (0)\n005 2 56ca 5538 | 3 5663 (0) 56ca (0) 5538 (0)\n============ DEPTH: 6 ==========================================\n006 2 50c1 5144 | 2 50c1 (0) 5144 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"52a8747e4ea35f6f50c72d7c481616f68a5e4396248332b8ff69d3a772de49ac","private_key":"7184fbc50435ce3da686084be1e05ae373d949ebfd17f019adc5f3d36e027659","name":"node_52a8747e4ea35f6f50c72d7c481616f68a5e4396248332b8ff69d3a772de49ac","services":["bzz","pss"],"enable_msg_events":true,"port":38653},"up":true}},{"node":{"info":{"id":"d95965e449dd4069876384cf4b34f986731e255a7948f0a862d229b1dddbc502","name":"node_d95965e449dd4069876384cf4b34f986731e255a7948f0a862d229b1dddbc502","enode":"enode://5f6d3c7b333f15437a8e10851a5e5b69df52d2a88441bf1b087a510149da211b403d95794b7be4b00888e746c0db90dd087f785db90c5ce96e76e977a0c3658d@127.0.0.1:0","enr":"0xf88fb840b90e0d1da9269f37eba660dc778bd68fc19e66ec3e2f8286c01ee9b08b44ac4704329c54f9f909700083ee04d27d04a671277fc4dab0023848748a1f385c96c10183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1035f6d3c7b333f15437a8e10851a5e5b69df52d2a88441bf1b087a510149da211b","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"2Vll5EndQGmHY4TPSzT5hnMeJVp5SPCoYtIpsd3bxQI=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: d95965\npopulation: 24 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 0111 3c5b 52a8 | 126 24f8 (0) 244c (0) 26ac (0) 26ab (0)\n001 5 acee 9464 8862 80d7 | 75 b8e1 (0) bbaf (0) ba91 (0) bcf8 (0)\n002 4 f8ff e277 e867 eff2 | 28 f1ed (0) f305 (0) f2b4 (0) f215 (0)\n003 4 c8c8 c603 c6a8 c74d | 16 cf52 (0) cc33 (0) cdb1 (0) cd6c (0)\n004 3 d3e9 d302 d209 | 5 d700 (0) d408 (0) d3e9 (0) d302 (0)\n005 1 ddb8 | 1 ddb8 (0)\n============ DEPTH: 6 ==========================================\n006 3 dbd4 dad0 da36 | 3 dbd4 (0) dad0 (0) da36 (0)\n007 0 | 0\n008 1 d9cf | 1 d9cf (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"d95965e449dd4069876384cf4b34f986731e255a7948f0a862d229b1dddbc502","private_key":"3e7c884510e8b3aa30441168b9f41d34a41cc93dd314587ff58a092474081075","name":"node_d95965e449dd4069876384cf4b34f986731e255a7948f0a862d229b1dddbc502","services":["bzz","pss"],"enable_msg_events":true,"port":42317},"up":true}},{"node":{"info":{"id":"8006b080c78a0ab54fa1be75a939bee2334322fded6c3563de1596b17c36172c","name":"node_8006b080c78a0ab54fa1be75a939bee2334322fded6c3563de1596b17c36172c","enode":"enode://00b96eb6a76e41ed136cbe16d1d887b7bbac5a0bd72bb337756b733add37c60d759a8e32a3de23839c55ca9896ae7de7f3d7e955f907935c60f6837c76407032@127.0.0.1:0","enr":"0xf88fb8404180b1565d27eada9a91fcc9783f8bb81c62344bcfe8f579644b225ff80f24972b11fbbd09b6e8e56b49515a95647d596e31f4aab16005512cc2a95035324c810183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10200b96eb6a76e41ed136cbe16d1d887b7bbac5a0bd72bb337756b733add37c60d","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"gAawgMeKCrVPob51qTm+4jNDIv3tbDVj3hWWsXw2Fyw=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 8006b0\npopulation: 26 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 5a26 1dec | 126 4cec (0) 4d38 (0) 4d91 (0) 4a95 (0)\n001 3 eff2 d302 d959 | 55 f756 (0) f6c0 (0) f645 (0) f1ed (0)\n002 5 a0c8 a330 aaf0 aeb4 | 37 b8e1 (0) ba91 (0) bbaf (0) bcf8 (0)\n003 2 9518 9c8e | 17 93ea (0) 93c0 (0) 9257 (0) 97da (0)\n004 3 8862 8cc3 8e7b | 9 8b43 (0) 8854 (0) 8862 (0) 8f9a (0)\n005 4 87a3 86d6 8402 84a9 | 4 87a3 (0) 86d6 (0) 8402 (0) 84a9 (0)\n006 3 837f 8358 834f | 3 837f (0) 8358 (0) 834f (0)\n007 1 81a5 | 1 81a5 (0)\n008 1 80d7 | 1 80d7 (0)\n============ DEPTH: 9 ==========================================\n009 2 8073 8074 | 2 8073 (0) 8074 (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"8006b080c78a0ab54fa1be75a939bee2334322fded6c3563de1596b17c36172c","private_key":"fcb5be43acaccb42dc1ccc165ea1cfd8c513cf177216d2c30891da51422d3c28","name":"node_8006b080c78a0ab54fa1be75a939bee2334322fded6c3563de1596b17c36172c","services":["bzz","pss"],"enable_msg_events":true,"port":34767},"up":true}},{"node":{"info":{"id":"1dec77c2f4caf053c2d0524ae34a2d970bf4743a0d009d8fc543077ddfdfe3d0","name":"node_1dec77c2f4caf053c2d0524ae34a2d970bf4743a0d009d8fc543077ddfdfe3d0","enode":"enode://0f9ec77321a98a1f538e0d5d9ef25b2b88fb31c678c3eb96345ec11e120bf502f24062c58885fab4104bcde1c4d556514688684c9f451a52d5296e1e904b553f@127.0.0.1:0","enr":"0xf88fb840a7d34c4c4c304a57c17de44dce8fa8a85dd33c61c06dd8848a767401a5f335044a5ea299bd475fb2a27fc686f0d4f124f75520dc1dde65822225e7467289bafb0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1030f9ec77321a98a1f538e0d5d9ef25b2b88fb31c678c3eb96345ec11e120bf502","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"Hex3wvTK8FPC0FJK40otlwv0dDoNAJ2PxUMHfd/f49A=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 1dec77\npopulation: 31 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 e277 e867 eff2 a330 | 130 f756 (0) f6c0 (0) f645 (0) f1ed (0)\n001 3 6795 6c01 52a8 | 61 4cec (0) 4d38 (0) 4d91 (0) 4a95 (0)\n002 3 2c85 2a50 3c5b | 28 244c (0) 24f8 (0) 26ac (0) 26ab (0)\n003 5 0e3b 0cfc 08f8 09b3 | 21 0d1c (0) 0cfc (0) 0e80 (0) 0e2b (0)\n004 6 1049 138d 1784 1686 | 7 1070 (0) 1049 (0) 138d (0) 1686 (0)\n005 6 19ea 194e 18e0 1b1d | 6 19ea (0) 194e (0) 18e0 (0) 1b1d (0)\n============ DEPTH: 6 ==========================================\n006 1 1fd0 | 1 1fd0 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 1 1dc0 | 1 1dc0 (0)\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"1dec77c2f4caf053c2d0524ae34a2d970bf4743a0d009d8fc543077ddfdfe3d0","private_key":"26da41b73f097099d65984b38ff4a2abed7a066916fc7defac16025a9b048f64","name":"node_1dec77c2f4caf053c2d0524ae34a2d970bf4743a0d009d8fc543077ddfdfe3d0","services":["bzz","pss"],"enable_msg_events":true,"port":44061},"up":true}},{"node":{"info":{"id":"1addd4a9f01486212e13e43a9650b7f793617d1cb59fb8d941270d7ae55f575f","name":"node_1addd4a9f01486212e13e43a9650b7f793617d1cb59fb8d941270d7ae55f575f","enode":"enode://9548a286c10115387facaf19d1e4f0a89e912d85029c1c487158207abe9e881aa61089ccb01238b15c8cd3cea9a71d520c4253dd1b487a963865c8947790bc2a@127.0.0.1:0","enr":"0xf88fb840ec288c0946306b1c5322ec315d33d13022eaef5463fd9d585df1000c7f70914713feb9d24a31c080bfca34d7f32d2f2f4a7cc8472108a6e5b3a68a74f3777ff80183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1029548a286c10115387facaf19d1e4f0a89e912d85029c1c487158207abe9e881a","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"Gt3UqfAUhiEuE+Q6llC395NhfRy1n7jZQScNeuVfV18=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 1addd4\npopulation: 24 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 e277 a330 80d7 | 130 f1ed (0) f215 (0) f2b4 (0) f305 (0)\n001 3 52a8 447a 6c01 | 61 5ff0 (0) 5d82 (0) 5c7c (0) 5c37 (0)\n002 4 2c85 298a 26ab 3c5b | 28 24f8 (0) 244c (0) 26ac (0) 26ab (0)\n003 3 0e3b 08e5 0111 | 21 0d1c (0) 0cfc (0) 0e80 (0) 0e2b (0)\n004 3 1784 1484 140d | 7 1049 (0) 1070 (0) 138d (0) 1686 (0)\n005 3 1fd0 1dc0 1dec | 3 1fd0 (0) 1dc0 (0) 1dec (0)\n006 3 19ea 194e 18e0 | 3 19ea (0) 194e (0) 18e0 (0)\n============ DEPTH: 7 ==========================================\n007 2 1b1d 1bd5 | 2 1b1d (0) 1bd5 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"1addd4a9f01486212e13e43a9650b7f793617d1cb59fb8d941270d7ae55f575f","private_key":"0913c134c0b143e925b0c88a1fdf7b3b79761d599db43e77f87db4896c1677ea","name":"node_1addd4a9f01486212e13e43a9650b7f793617d1cb59fb8d941270d7ae55f575f","services":["bzz","pss"],"enable_msg_events":true,"port":39027},"up":true}},{"node":{"info":{"id":"80d7e892bbb26808abb1d1530077fec6b08768c151a9f220881da3c862bae0af","name":"node_80d7e892bbb26808abb1d1530077fec6b08768c151a9f220881da3c862bae0af","enode":"enode://9e5ae61e978f364f62889e17b22a8f9248f40ec009d4b43b3b05f92eda9394c87e382e2459b92a93e6b62e2103ab0f7a3c37c5251ef272e7c4ce8b47145ba2b1@127.0.0.1:0","enr":"0xf88fb840e9a52f21b9b8b379be4383a4cff9a6331d63db696a7236c2b700b217ca1e7bb97104740ffffdf09ddfb44f932fa5534cbd2541e7a4dd75920c0dc26241fa43290183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1039e5ae61e978f364f62889e17b22a8f9248f40ec009d4b43b3b05f92eda9394c8","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"gNfokruyaAirsdFTAHf+xrCHaMFRqfIgiB2jyGK64K8=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 80d7e8\npopulation: 37 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 5a26 3b02 3c5b 0111 | 126 5ff0 (0) 5d82 (0) 5c7c (0) 5c37 (0)\n001 4 eff2 d302 d209 d959 | 55 f1ed (0) f2b4 (0) f215 (0) f305 (0)\n002 5 aaf0 acee aeb4 a0c8 | 37 b8e1 (0) bbaf (0) ba91 (0) bcf8 (0)\n003 6 9c8e 9257 97da 9464 | 17 93ea (0) 93c0 (0) 9257 (0) 97da (0)\n004 6 8b43 8854 8862 8e7b | 9 8b43 (0) 8854 (0) 8862 (0) 8f9a (0)\n005 4 86d6 87a3 8402 84a9 | 4 86d6 (0) 87a3 (0) 8402 (0) 84a9 (0)\n006 3 837f 8358 834f | 3 837f (0) 8358 (0) 834f (0)\n007 1 81a5 | 1 81a5 (0)\n============ DEPTH: 8 ==========================================\n008 3 8073 8074 8006 | 3 8073 (0) 8074 (0) 8006 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"80d7e892bbb26808abb1d1530077fec6b08768c151a9f220881da3c862bae0af","private_key":"ba50fc539edd826fed0a669af162891458571b2d3feed69df70bd146d17ce4ed","name":"node_80d7e892bbb26808abb1d1530077fec6b08768c151a9f220881da3c862bae0af","services":["bzz","pss"],"enable_msg_events":true,"port":39407},"up":true}},{"node":{"info":{"id":"0111e720a84b310f863c2530fbe149e6a221acbad01065c5d052d2b3e1716f54","name":"node_0111e720a84b310f863c2530fbe149e6a221acbad01065c5d052d2b3e1716f54","enode":"enode://5ee976bcaa543b5d2ea1a0bce5b0ff16849ede88771b4d0539bcf66b2a275089315547a16297807f96f1634144fba1112ca22817182c90947739c6db02226d55@127.0.0.1:0","enr":"0xf88fb840b273fc1fa015b0a0b045a26f170ca39c7ded0d15989a8d2f9a15df15c5c1471a3943fd8ce033b73dd6cc8f6d988a1e6f4b6ad088a8148478fe0728cdc8a5b4aa0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1035ee976bcaa543b5d2ea1a0bce5b0ff16849ede88771b4d0539bcf66b2a275089","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"ARHnIKhLMQ+GPCUw++FJ5qIhrLrQEGXF0FLSs+Fxb1Q=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 0111e7\npopulation: 27 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 d209 d959 80d7 | 130 f1ed (0) f305 (0) f215 (0) f2b4 (0)\n001 4 6795 6c01 52a8 447a | 61 70f6 (0) 7049 (0) 741a (0) 7660 (0)\n002 2 2a50 3c5b | 28 244c (0) 24f8 (0) 26ac (0) 26ab (0)\n003 3 18e0 1add 1dec | 16 1070 (0) 1049 (0) 138d (0) 1686 (0)\n004 6 0cfc 0e3b 09b3 08bd | 11 0d1c (0) 0cfc (0) 0e80 (0) 0e2b (0)\n005 4 046c 0594 0561 07f5 | 4 07f5 (0) 046c (0) 0561 (0) 0594 (0)\n006 3 025d 035f 0314 | 3 025d (0) 035f (0) 0314 (0)\n============ DEPTH: 7 ==========================================\n007 0 | 0\n008 1 0191 | 1 0191 (0)\n009 0 | 0\n010 1 012b | 1 012b (0)\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"0111e720a84b310f863c2530fbe149e6a221acbad01065c5d052d2b3e1716f54","private_key":"91fae292525cee25df7bf4db07a65551f7691e6d2bc6a6919a32b5862b97dc00","name":"node_0111e720a84b310f863c2530fbe149e6a221acbad01065c5d052d2b3e1716f54","services":["bzz","pss"],"enable_msg_events":true,"port":44549},"up":true}},{"node":{"info":{"id":"3c5b2e125020c80e3674df9cac34de4d8f3a94ee02556fb557921b6d5498b933","name":"node_3c5b2e125020c80e3674df9cac34de4d8f3a94ee02556fb557921b6d5498b933","enode":"enode://d5a336637f6123924c25472b63ed0ce1759aaa0df7f6d4a18ab36dd8976db21757be5de42d1a3edef967c5d508a894b841f272453643d4c7827490b2286d7177@127.0.0.1:0","enr":"0xf88fb8404f46f3f9d69855c1359b03501474fc383b4578f1b7b40877d2c279c467756cf54804a11759187a452f18bc0291d786321ce06bae18d6cd130e358172c6c4ee5a0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103d5a336637f6123924c25472b63ed0ce1759aaa0df7f6d4a18ab36dd8976db217","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"PFsuElAgyA42dN+crDTeTY86lO4CVW+1V5IbbVSYuTM=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 3c5b2e\npopulation: 34 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 d959 c74d acee 80d7 | 130 f1ed (0) f215 (0) f2b4 (0) f305 (0)\n001 6 6c01 6795 402c 447a | 61 70f6 (0) 7049 (0) 741a (0) 7660 (0)\n002 6 1784 1dc0 1dec 1add | 37 1070 (0) 1049 (0) 138d (0) 1686 (0)\n003 4 26ab 2c85 298a 2a50 | 11 244c (0) 24f8 (0) 26ac (0) 26ab (0)\n004 6 3728 36b9 30fe 3051 | 9 32ff (0) 30fe (0) 3051 (0) 3188 (0)\n005 5 3980 3938 397a 3b02 | 5 3980 (0) 3938 (0) 397a (0) 3b02 (0)\n============ DEPTH: 6 ==========================================\n006 1 3f31 | 1 3f31 (0)\n007 0 | 0\n008 1 3cab | 1 3cab (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"3c5b2e125020c80e3674df9cac34de4d8f3a94ee02556fb557921b6d5498b933","private_key":"10f73f4d9bbb99564f267bf19aee5d5029238f913a01009124c433e72e461c43","name":"node_3c5b2e125020c80e3674df9cac34de4d8f3a94ee02556fb557921b6d5498b933","services":["bzz","pss"],"enable_msg_events":true,"port":35855},"up":true}},{"node":{"info":{"id":"84a9db7645c792dc38c1f2113a8f0590d04e1c94d9a8c464ab0ec8219303d966","name":"node_84a9db7645c792dc38c1f2113a8f0590d04e1c94d9a8c464ab0ec8219303d966","enode":"enode://7c5c0013e73e1e336ff20c1718a135e5725dc06c6f0c9f9090220223d8e9ae14776b3d3d2073ec0f9ac79ad91739644142a122c2ac9e79f6fedbeb3d24fbe15a@127.0.0.1:0","enr":"0xf88fb840ffe7dbb7a2a573810eb50ef23e54deecd328d7b7e0502170861ff9dd20f39c683db509751dd87bfb7a1b6e1671d2f50655924fa021c7601cd337daed4a4b0f910183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1027c5c0013e73e1e336ff20c1718a135e5725dc06c6f0c9f9090220223d8e9ae14","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"hKnbdkXHktw4wfIROo8FkNBOHJTZqMRkqw7IIZMD2WY=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 84a9db\npopulation: 36 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 5a26 402c 7e47 67f3 | 126 70f6 (0) 7049 (0) 741a (0) 7660 (0)\n001 4 e64d f8ff c603 c74d | 55 f645 (0) f6c0 (0) f756 (0) f1ed (0)\n002 8 bfc7 be68 b3f9 aaf0 | 37 b8e1 (0) bbaf (0) ba91 (0) bcf8 (0)\n003 3 9c8e 97da 9518 | 17 93ea (0) 93c0 (0) 9257 (0) 97da (0)\n004 5 8862 8854 8ea2 8e7b | 9 8b43 (0) 8854 (0) 8862 (0) 8f9a (0)\n005 7 837f 8358 834f 81a5 | 8 837f (0) 8358 (0) 834f (0) 81a5 (0)\n============ DEPTH: 6 ==========================================\n006 2 87a3 86d6 | 2 87a3 (0) 86d6 (0)\n007 0 | 0\n008 1 8402 | 1 8402 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"84a9db7645c792dc38c1f2113a8f0590d04e1c94d9a8c464ab0ec8219303d966","private_key":"942aadc68bdea22f3ce52da3ae7b6f7c03ec9e47e5d2b153161be660d1a0ae91","name":"node_84a9db7645c792dc38c1f2113a8f0590d04e1c94d9a8c464ab0ec8219303d966","services":["bzz","pss"],"enable_msg_events":true,"port":33215},"up":true}},{"node":{"info":{"id":"c74d801e85ac0fd8951480d107b41eddc5c92775614c4886b3f732fa3d1a791d","name":"node_c74d801e85ac0fd8951480d107b41eddc5c92775614c4886b3f732fa3d1a791d","enode":"enode://97af56cb76aa2eaec4aeef2c8cec152cbe5b98224f219b0fc82f0c0a3648951cf0b429a35548829391d1a4d9a663cde74dd333c0c012e6a1f8d6e677a006dc00@127.0.0.1:0","enr":"0xf88fb840c23585d8a52b92c0cd98c86cc18d8ea7593dd6740927c3fa9aab25a49c02996a1091206cf56d09a3ac4f253656b976411b2307fdd0c77cbf1607b6df7e163f760183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10297af56cb76aa2eaec4aeef2c8cec152cbe5b98224f219b0fc82f0c0a3648951c","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"x02AHoWsD9iVFIDRB7Qe3cXJJ3VhTEiGs/cy+j0aeR0=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: c74d80\npopulation: 24 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 447a 3a62 3c5b | 126 7049 (0) 70f6 (0) 741a (0) 7660 (0)\n001 2 8cc3 84a9 | 75 b4a1 (0) b5ea (0) b6df (0) b659 (0)\n002 5 ff75 f8ff e277 e64d | 28 f1ed (0) f305 (0) f2b4 (0) f215 (0)\n003 6 d209 d302 dbd4 dad0 | 11 ddb8 (0) dbd4 (0) dad0 (0) da36 (0)\n004 2 cd6c c8c8 | 8 cf52 (0) cc33 (0) cdb1 (0) cd6c (0)\n005 2 c2d0 c272 | 3 c190 (0) c272 (0) c2d0 (0)\n006 2 c534 c42e | 2 c534 (0) c42e (0)\n============ DEPTH: 7 ==========================================\n007 2 c603 c6a8 | 2 c603 (0) c6a8 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"c74d801e85ac0fd8951480d107b41eddc5c92775614c4886b3f732fa3d1a791d","private_key":"459826aca20135c53b872b1b2eee49b09c127ff95d3a98d517dc55c101f6562a","name":"node_c74d801e85ac0fd8951480d107b41eddc5c92775614c4886b3f732fa3d1a791d","services":["bzz","pss"],"enable_msg_events":true,"port":46857},"up":true}},{"node":{"info":{"id":"8cc3fb39009d0adc26fca1e2ee96822d168d4debc379fd516c15d4b4a1624231","name":"node_8cc3fb39009d0adc26fca1e2ee96822d168d4debc379fd516c15d4b4a1624231","enode":"enode://f5bd9f767508bd665cf322b697829a1c303223f3e1953dac7fb2aa3ecb12f562a82f48929f997d96979eda587e53151f11fb6b0c1a477bcaea877333608f8938@127.0.0.1:0","enr":"0xf88fb84049abb7ae67d8f18e608e10433911a04e12e66842debe93fddfd1b92dd4b5249e2e0d73655939db3ec05377a8ea47300d98f115a6d484239b195f4757342458470183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102f5bd9f767508bd665cf322b697829a1c303223f3e1953dac7fb2aa3ecb12f562","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"jMP7OQCdCtwm/KHi7paCLRaNTevDef1RbBXUtKFiQjE=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 8cc3fb\npopulation: 33 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 1dec 6c01 7e47 402c | 126 7049 (0) 70f6 (0) 741a (0) 7660 (0)\n001 2 d209 c74d | 55 f756 (0) f6c0 (0) f645 (0) f1ed (0)\n002 6 be68 b3f9 aaf0 acee | 37 b8e1 (0) bbaf (0) ba91 (0) bcf8 (0)\n003 4 9c8e 93c0 95c0 9518 | 17 9257 (0) 93ea (0) 93c0 (0) 97da (0)\n004 8 834f 837f 81a5 80d7 | 12 8358 (0) 834f (0) 837f (0) 81a5 (0)\n005 3 8854 8862 8b43 | 3 8b43 (0) 8854 (0) 8862 (0)\n============ DEPTH: 6 ==========================================\n006 4 8f9a 8ea2 8e28 8e7b | 4 8f9a (0) 8ea2 (0) 8e28 (0) 8e7b (0)\n007 1 8d19 | 1 8d19 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"8cc3fb39009d0adc26fca1e2ee96822d168d4debc379fd516c15d4b4a1624231","private_key":"ab529b2f870b41497c801949c1e6f8803428c7a8a5401009fb5aecf2146a8021","name":"node_8cc3fb39009d0adc26fca1e2ee96822d168d4debc379fd516c15d4b4a1624231","services":["bzz","pss"],"enable_msg_events":true,"port":32793},"up":true}},{"node":{"info":{"id":"a3309f8b8bba4d8fbd7c6193d7671cb907b94e71155ef6138e0248682ff00e58","name":"node_a3309f8b8bba4d8fbd7c6193d7671cb907b94e71155ef6138e0248682ff00e58","enode":"enode://2e41f2b550586042c5f6fc98479cf8647f043156b413c46a8a44e5e748b12ad67219bf8846538c69bd1512ba2b2372b455d2db5bb6833d24f26e6c9a1f59d5c8@127.0.0.1:0","enr":"0xf88fb840ae31abaa7b69ba78463e2aabc17bdba4aab8ffa918141bc3c9628311a50f0e8f60fc4d7edd0a2d6d9d31bdc7358e66ea37b3726c4daa85d3112b655b7bea23220183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1022e41f2b550586042c5f6fc98479cf8647f043156b413c46a8a44e5e748b12ad6","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"ozCfi4u6TY+9fGGT12ccuQe5TnEVXvYTjgJIaC/wDlg=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: a3309f\npopulation: 33 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 7 447a 402c 09b3 1dec | 126 7049 (0) 70f6 (0) 741a (0) 7660 (0)\n001 5 f8ff e64d eff2 d302 | 55 f6c0 (0) f645 (0) f756 (0) f1ed (0)\n002 5 9c8e 8006 80d7 84a9 | 38 9257 (0) 93ea (0) 93c0 (0) 97da (0)\n003 3 b3f9 bfc7 be68 | 14 b8e1 (0) bbaf (0) ba91 (0) bcf8 (0)\n004 4 aaf0 ab71 aeb4 acee | 10 a8f4 (0) a8ff (0) a8b5 (0) a970 (0)\n005 4 a5ac a505 a606 a616 | 7 a4ee (0) a5ac (0) a505 (0) a742 (0)\n006 2 a1c8 a0c8 | 2 a1c8 (0) a0c8 (0)\n============ DEPTH: 7 ==========================================\n007 2 a2e6 a2a1 | 2 a2e6 (0) a2a1 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 1 a327 | 1 a327 (0)\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"a3309f8b8bba4d8fbd7c6193d7671cb907b94e71155ef6138e0248682ff00e58","private_key":"f5a3649f592d0f7c3eced972c572abd68fb996716ce6c51e2f9c236db5ee5f7f","name":"node_a3309f8b8bba4d8fbd7c6193d7671cb907b94e71155ef6138e0248682ff00e58","services":["bzz","pss"],"enable_msg_events":true,"port":46725},"up":true}},{"node":{"info":{"id":"2a507f5cb921137a7225c9c4988a8514af0f7e3c442cb8bf2bb612dc522a7daf","name":"node_2a507f5cb921137a7225c9c4988a8514af0f7e3c442cb8bf2bb612dc522a7daf","enode":"enode://c001df527a6a418a2bb70ac07ea54973e446f8037817071d1099e394bf3cf208a58bf9796e8e5c5f9fe0ab71cde46b1e3b320c911fa86e6af286e603ce8a9d04@127.0.0.1:0","enr":"0xf88fb840543888f27b45d292760976edb014e7c72679a5831e78c7496fd2bc5d78af0c377e0981dcbe633f5465ca9546ada0184be5e5a640dd77b8f6ea51c936515ab1d20183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102c001df527a6a418a2bb70ac07ea54973e446f8037817071d1099e394bf3cf208","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"KlB/XLkhE3pyJcnEmIqFFK8PfjxELLi/K7YS3FIqfa8=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 2a507f\npopulation: 35 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 f9de f8ff ff75 e867 | 130 f6c0 (0) f645 (0) f756 (0) f1ed (0)\n001 3 7e47 4a95 447a | 61 68cb (0) 6b4e (0) 6e7f (0) 6dd3 (0)\n002 6 1dec 08bd 09b3 07f5 | 37 1070 (0) 1049 (0) 138d (0) 1686 (0)\n003 11 36b9 3051 3188 31e6 | 17 32ff (0) 30fe (0) 3051 (0) 3188 (0)\n004 4 24f8 244c 26ac 26ab | 4 24f8 (0) 244c (0) 26ac (0) 26ab (0)\n============ DEPTH: 5 ==========================================\n005 5 2fd2 2e65 2ddf 2c80 | 5 2fd2 (0) 2e65 (0) 2ddf (0) 2c80 (0)\n006 1 298a | 1 298a (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"2a507f5cb921137a7225c9c4988a8514af0f7e3c442cb8bf2bb612dc522a7daf","private_key":"ba89f2c3d704a1b02be39f28124317f79d2630278219ab9397e5250cbaab1347","name":"node_2a507f5cb921137a7225c9c4988a8514af0f7e3c442cb8bf2bb612dc522a7daf","services":["bzz","pss"],"enable_msg_events":true,"port":40127},"up":true}},{"node":{"info":{"id":"447a411c80fbd422bfa0c358d3f2a1fe6256c05e35acc6350958dfbe62cd5b9b","name":"node_447a411c80fbd422bfa0c358d3f2a1fe6256c05e35acc6350958dfbe62cd5b9b","enode":"enode://93cb54d9649a77b0cdde7ac6f47e4b97f7601de7e8881dd99e904b4c0f29e973261a2ca33856145834ad9fa4b35e8100f57851652ae17382da483d915520cef9@127.0.0.1:0","enr":"0xf88fb840f9ca3c35e33f2fe6bfb3114da2e3c50397d620dc275d5fdf0fca027de00c6ba20aceee4ab1ac417c80e3c10d7ab9f21e3b07da298b81aac6a8f6b7b38a4936d50183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10393cb54d9649a77b0cdde7ac6f47e4b97f7601de7e8881dd99e904b4c0f29e973","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"RHpBHID71CK/oMNY0/Kh/mJWwF41rMY1CVjfvmLNW5s=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 447a41\npopulation: 40 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 a330 8cc3 c74d d209 | 130 b78f (0) b659 (0) b6df (0) b5ea (0)\n001 8 140d 1add 0314 0111 | 65 1049 (0) 1070 (0) 138d (0) 1686 (0)\n002 6 6c01 648a 6758 6795 | 26 60c5 (0) 648a (0) 6758 (0) 6790 (0)\n003 8 5bd8 5a8b 5a26 5d82 | 16 5ff0 (0) 5d82 (0) 5c7c (0) 5c37 (0)\n004 6 48f1 48b8 4b79 4a95 | 10 4a95 (0) 4b79 (0) 482e (0) 48b8 (0)\n005 5 43d4 43c9 435d 4005 | 5 43d4 (0) 43c9 (0) 435d (0) 4005 (0)\n006 1 46bf | 1 46bf (0)\n============ DEPTH: 7 ==========================================\n007 0 | 0\n008 1 44ad | 1 44ad (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 1 447c | 1 447c (0)\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"447a411c80fbd422bfa0c358d3f2a1fe6256c05e35acc6350958dfbe62cd5b9b","private_key":"333ffec493a411ee5a1cf2f27903e2738e2967073c019fcbf70844d2c5e221fb","name":"node_447a411c80fbd422bfa0c358d3f2a1fe6256c05e35acc6350958dfbe62cd5b9b","services":["bzz","pss"],"enable_msg_events":true,"port":46191},"up":true}},{"node":{"info":{"id":"d20931ce3da972fd23ea306e5c604a1fbd9417ba02654c5cdbe278fe259f75d5","name":"node_d20931ce3da972fd23ea306e5c604a1fbd9417ba02654c5cdbe278fe259f75d5","enode":"enode://fa46b1409f74c7047256751457bb4839d22d4c44e870020c92b9a8094d40fffd0bbe32e0d0e17a80c1a5cda6744641633435612ef66e4d1efe652f2190e9898c@127.0.0.1:0","enr":"0xf88fb840ec8f9457cb967b5716665ff449c2d75e0cba1fb09465164ee48b4a314d3bbb0d2cffff4ac93409d690a86ae7b8031ec765f327ec503895ea2d4ae58be0ea6d490183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102fa46b1409f74c7047256751457bb4839d22d4c44e870020c92b9a8094d40fffd","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"0gkxzj2pcv0j6jBuXGBKH72UF7oCZUxc2+J4/iWfddU=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: d20931\npopulation: 23 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 0111 3a62 447a | 126 1070 (0) 1049 (0) 138d (0) 1686 (0)\n001 3 80d7 8cc3 a330 | 75 b4a1 (0) b5ea (0) b6df (0) b659 (0)\n002 5 f8ff e867 eff2 e277 | 28 f1ed (0) f305 (0) f215 (0) f2b4 (0)\n003 4 c8c8 c74d c6a8 c603 | 16 cf52 (0) cc33 (0) cdb1 (0) cd6c (0)\n004 4 dbd4 dad0 da36 d959 | 6 ddb8 (0) dbd4 (0) dad0 (0) da36 (0)\n005 2 d700 d408 | 2 d700 (0) d408 (0)\n============ DEPTH: 6 ==========================================\n006 0 | 0\n007 2 d3e9 d302 | 2 d3e9 (0) d302 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"d20931ce3da972fd23ea306e5c604a1fbd9417ba02654c5cdbe278fe259f75d5","private_key":"1efdf65d1076ab6055d3624a77725affdd2e31a88571efc3f60d3ccaff92f6bb","name":"node_d20931ce3da972fd23ea306e5c604a1fbd9417ba02654c5cdbe278fe259f75d5","services":["bzz","pss"],"enable_msg_events":true,"port":39387},"up":true}},{"node":{"info":{"id":"3a628ef171c1f26fa0966eb89210be0a14305aae8bfed10f4ed9017698f40f4b","name":"node_3a628ef171c1f26fa0966eb89210be0a14305aae8bfed10f4ed9017698f40f4b","enode":"enode://699f62b0ede6090f23dc2599d33c7358ae7b40e7968fafc5a628f37665146f48126c277ba115635c40a4b4b0c21129c569efe2b0088a0e1a2a7c2e79793fd6ad@127.0.0.1:0","enr":"0xf88fb8408c0574ebe34e80bece2feb6738856fa36e55e93c1692ea7e973fb6f5948061ba1afefff01aa4e3ffe13b7ab2318e4d5201b0083ee6a4067fe0a7436c371f93c70183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103699f62b0ede6090f23dc2599d33c7358ae7b40e7968fafc5a628f37665146f48","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"OmKO8XHB8m+glm64khC+ChQwWq6L/tEPTtkBdpj0D0s=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 3a628e\npopulation: 32 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 c6a8 c74d d209 | 130 b659 (0) b6df (0) b78f (0) b4a1 (0)\n001 4 7e47 5c37 402c 447a | 61 68cb (0) 6b4e (0) 6e7f (0) 6dd3 (0)\n002 7 1484 140d 1dc0 18e0 | 37 1070 (0) 1049 (0) 138d (0) 1686 (0)\n003 4 26ab 2c85 2a50 298a | 11 244c (0) 24f8 (0) 26ac (0) 26ab (0)\n004 7 36b9 3728 3051 30fe | 9 3411 (0) 3728 (0) 36b9 (0) 32ff (0)\n005 3 3f31 3cab 3c5b | 3 3f31 (0) 3cab (0) 3c5b (0)\n============ DEPTH: 6 ==========================================\n006 3 3980 3938 397a | 3 3980 (0) 3938 (0) 397a (0)\n007 1 3b02 | 1 3b02 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"3a628ef171c1f26fa0966eb89210be0a14305aae8bfed10f4ed9017698f40f4b","private_key":"dcc4c59e4839e1a65f299219ca7016fdaa5f40089be97dd01f6e44b309e517e1","name":"node_3a628ef171c1f26fa0966eb89210be0a14305aae8bfed10f4ed9017698f40f4b","services":["bzz","pss"],"enable_msg_events":true,"port":45801},"up":true}},{"node":{"info":{"id":"031450ec20f353435b429b5fa64f616d07c9d586afabc7a2772e05ad5c88bf50","name":"node_031450ec20f353435b429b5fa64f616d07c9d586afabc7a2772e05ad5c88bf50","enode":"enode://f6a817139fae4583a57556cc9a0a457c0473f3420d9c159dde94147684cef58dee5800eba9eed6ce4bca94ed4f0b5990cf1300abc416d3abe67117ff987e3893@127.0.0.1:0","enr":"0xf88fb840ac7d354eab1b00a4d18d770c7a56c8bd41a723c51be5b45f95ac7541b76ffd8a6b2abb20615da04d0e0b07abf9c9d1a2c014424bc3c8d645913be94303912ddd0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103f6a817139fae4583a57556cc9a0a457c0473f3420d9c159dde94147684cef58d","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"AxRQ7CDzU0NbQptfpk9hbQfJ1Yavq8eidy4FrVyIv1A=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 031450\npopulation: 25 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 e64d d302 | 130 b4a1 (0) b5ea (0) b78f (0) b659 (0)\n001 2 447a 402c | 61 7049 (0) 70f6 (0) 741a (0) 7660 (0)\n002 5 2a50 31e1 31e6 3b02 | 28 244c (0) 24f8 (0) 26ac (0) 26ab (0)\n003 2 18e0 140d | 16 1fd0 (0) 1dc0 (0) 1dec (0) 1b1d (0)\n004 6 0e2b 0e3b 0cfc 08bd | 11 0e80 (0) 0e2b (0) 0e3b (0) 0d1c (0)\n005 3 07f5 0561 0594 | 4 07f5 (0) 046c (0) 0561 (0) 0594 (0)\n006 3 0191 012b 0111 | 3 0191 (0) 012b (0) 0111 (0)\n============ DEPTH: 7 ==========================================\n007 1 025d | 1 025d (0)\n008 0 | 0\n009 1 035f | 1 035f (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"031450ec20f353435b429b5fa64f616d07c9d586afabc7a2772e05ad5c88bf50","private_key":"71841c7c5c5d9ea8a678e5f6274467f74b6f88c13bbf848178459758f86d8039","name":"node_031450ec20f353435b429b5fa64f616d07c9d586afabc7a2772e05ad5c88bf50","services":["bzz","pss"],"enable_msg_events":true,"port":43487},"up":true}},{"node":{"info":{"id":"402cf9d0bffa017ebea34ede11207f3366b3ea450c0428029129a8e8026abbe7","name":"node_402cf9d0bffa017ebea34ede11207f3366b3ea450c0428029129a8e8026abbe7","enode":"enode://5bc25029b77714e83add4d5587be2adb2f795f9c9a708fa117f943c07da69023a978354c7584edf8e72592dd799def444d777216cbff5e09d84ed2a3e6cfc802@127.0.0.1:0","enr":"0xf88fb8405ae20f58d8ca24088b13d83e73fa85b6edd318d7a36af6bae3b1561d4e35defe0bc84c46bd137181da067946faf218082b19c9f7508adabe054d430ca14ba09b0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1025bc25029b77714e83add4d5587be2adb2f795f9c9a708fa117f943c07da69023","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"QCz50L/6AX6+o07eESB/M2az6kUMBCgCkSmo6AJqu+c=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 402cf9\npopulation: 32 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 84a9 8cc3 a330 e64d | 130 b4a1 (0) b5ea (0) b659 (0) b6df (0)\n001 5 298a 3c5b 3a62 3b02 | 65 24f8 (0) 244c (0) 26ac (0) 26ab (0)\n002 5 6d5e 6c01 648a 6795 | 26 68cb (0) 6b4e (0) 6e7f (0) 6dd3 (0)\n003 3 5a26 5144 52a8 | 16 5ff0 (0) 5d82 (0) 5c7c (0) 5c37 (0)\n004 6 48d7 48f1 4a95 4cec | 10 482e (0) 48b8 (0) 48f1 (0) 48de (0)\n005 4 46bf 44ad 447c 447a | 4 46bf (0) 44ad (0) 447c (0) 447a (0)\n============ DEPTH: 6 ==========================================\n006 3 43d4 43c9 435d | 3 43d4 (0) 43c9 (0) 435d (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 1 4005 | 1 4005 (0)\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"402cf9d0bffa017ebea34ede11207f3366b3ea450c0428029129a8e8026abbe7","private_key":"94e11eac44f6245218d5abd3d9478e311e64c9803c0c5ea086b6de56d4679633","name":"node_402cf9d0bffa017ebea34ede11207f3366b3ea450c0428029129a8e8026abbe7","services":["bzz","pss"],"enable_msg_events":true,"port":32811},"up":true}},{"node":{"info":{"id":"3b020c84fb60f59779324d451d9770d683e08133bbaa2d5762f61b8fd4b8d9fd","name":"node_3b020c84fb60f59779324d451d9770d683e08133bbaa2d5762f61b8fd4b8d9fd","enode":"enode://713a1cedffa4515ada02fdd05d03e281b216f290f667a579b6122990b58832fda74606019246522aa1ea21612c64c9b061a99f77ecf52541607f91c645c9b911@127.0.0.1:0","enr":"0xf88fb84078578015605b97496872b339f38876ed514660f63b799e2055976f1d31a7256c29c36362b416362b1c38dcd9dbaf0d98160a481b84e0944a33d9103c1cf2c9890183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103713a1cedffa4515ada02fdd05d03e281b216f290f667a579b6122990b58832fd","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"OwIMhPtg9Zd5Mk1FHZdw1oPggTO7qi1XYvYbj9S42f0=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 3b020c\npopulation: 28 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 a330 9f0e 80d7 d302 | 130 b4a1 (0) b5ea (0) b659 (0) b6df (0)\n001 4 6e7f 6b4e 5c37 402c | 61 68cb (0) 6b4e (0) 6e7f (0) 6dd3 (0)\n002 2 138d 0314 | 37 1070 (0) 1049 (0) 138d (0) 1686 (0)\n003 4 26ab 2c85 2a50 298a | 11 244c (0) 24f8 (0) 26ac (0) 26ab (0)\n004 7 3188 31e6 31e1 30fe | 9 32ff (0) 30fe (0) 3051 (0) 3188 (0)\n005 3 3f31 3c5b 3cab | 3 3f31 (0) 3cab (0) 3c5b (0)\n============ DEPTH: 6 ==========================================\n006 3 3980 3938 397a | 3 3980 (0) 3938 (0) 397a (0)\n007 1 3a62 | 1 3a62 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"3b020c84fb60f59779324d451d9770d683e08133bbaa2d5762f61b8fd4b8d9fd","private_key":"f0c6bf4c9b4e4f3d3db2b470e1adab35d6500594faf84c40d4e589d3b516a6e9","name":"node_3b020c84fb60f59779324d451d9770d683e08133bbaa2d5762f61b8fd4b8d9fd","services":["bzz","pss"],"enable_msg_events":true,"port":45529},"up":true}},{"node":{"info":{"id":"d3022a46956e75bca85ba89d97b694a3a64f03ccc2d881ed0cd687d43d486925","name":"node_d3022a46956e75bca85ba89d97b694a3a64f03ccc2d881ed0cd687d43d486925","enode":"enode://1d5fd1a24eda6285258a0e82b28b81dc86c0d970745ed58fd4ee8cf25414dfd16855e91f57f27d49ff28688f9e48d9df98094d7afcb28de571ad2db259f803dd@127.0.0.1:0","enr":"0xf88fb840142c7e76eea3d74e38e90903bb658e1359757cafd5441e5414d06d489b74a4f567b2017ecbbcb487cf547fd852e100846966134719b652071d9580fa25f868360183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1031d5fd1a24eda6285258a0e82b28b81dc86c0d970745ed58fd4ee8cf25414dfd1","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"0wIqRpVudbyoW6idl7aUo6ZPA8zC2IHtDNaH1D1IaSU=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: d3022a\npopulation: 34 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 7 67f3 402c 140d 0cfc | 126 68cb (0) 6b4e (0) 6e7f (0) 6dd3 (0)\n001 6 bfc7 aeb4 a330 8854 | 75 b4a1 (0) b5ea (0) b6df (0) b659 (0)\n002 6 e64d ed42 eebd ff75 | 28 f1ed (0) f305 (0) f215 (0) f2b4 (0)\n003 6 c6a8 c603 c74d cd6c | 16 cf52 (0) cc33 (0) cdb1 (0) cd6c (0)\n004 5 ddb8 da36 dad0 dbd4 | 6 ddb8 (0) dad0 (0) da36 (0) dbd4 (0)\n005 2 d700 d408 | 2 d700 (0) d408 (0)\n============ DEPTH: 6 ==========================================\n006 0 | 0\n007 1 d209 | 1 d209 (0)\n008 1 d3e9 | 1 d3e9 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"d3022a46956e75bca85ba89d97b694a3a64f03ccc2d881ed0cd687d43d486925","private_key":"d6122cfb13c379e5e6975a57ca7446d6faa10cf87da8ddde9793a570ba433a96","name":"node_d3022a46956e75bca85ba89d97b694a3a64f03ccc2d881ed0cd687d43d486925","services":["bzz","pss"],"enable_msg_events":true,"port":46297},"up":true}},{"node":{"info":{"id":"298ae5d173c5360bc9ad5b492ed35de3b6e0cae868a34bfe6311a8ba5ea9877e","name":"node_298ae5d173c5360bc9ad5b492ed35de3b6e0cae868a34bfe6311a8ba5ea9877e","enode":"enode://e2572a35a51863ebd4d0e48420c58ffb5088cadae300e5779152fe7e009a73f879306e12e40543ab0f2ea87351f9114b427df2e411379eeaeb2f2dd4f6734383@127.0.0.1:0","enr":"0xf88fb840a94663c556b354f4695fad007ac31ab668951708699de5cfaf696a677d15555c6120984becc7bc3b1c3724a42f37b9e009cb7b6c5f37f23758c3a9d2941638d00183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103e2572a35a51863ebd4d0e48420c58ffb5088cadae300e5779152fe7e009a73f8","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"KYrl0XPFNgvJrVtJLtNd47bgyuhoo0v+YxGoul6ph34=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 298ae5\npopulation: 37 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 9f0e 8e7b e64d d302 | 130 b3f9 (0) b78f (0) b659 (0) b6df (0)\n001 5 4a95 402c 447a 7e47 | 61 68cb (0) 6b4e (0) 6e7f (0) 6c01 (0)\n002 8 1add 194e 18e0 140d | 37 138d (0) 1070 (0) 1049 (0) 1784 (0)\n003 11 36b9 3051 3188 31e6 | 17 3411 (0) 3728 (0) 36b9 (0) 32ff (0)\n004 3 24f8 26ac 26ab | 4 244c (0) 24f8 (0) 26ac (0) 26ab (0)\n============ DEPTH: 5 ==========================================\n005 5 2fd2 2e65 2ddf 2c80 | 5 2fd2 (0) 2e65 (0) 2ddf (0) 2c80 (0)\n006 1 2a50 | 1 2a50 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"298ae5d173c5360bc9ad5b492ed35de3b6e0cae868a34bfe6311a8ba5ea9877e","private_key":"b0b337287594e581c25600a9c7123555efd6242dd53a8bc83caa7c7890443ac5","name":"node_298ae5d173c5360bc9ad5b492ed35de3b6e0cae868a34bfe6311a8ba5ea9877e","services":["bzz","pss"],"enable_msg_events":true,"port":33555},"up":true}},{"node":{"info":{"id":"e64d90760cd81e4f112bbf1432e76c82fa4173fd474b988f4096ce187363fd81","name":"node_e64d90760cd81e4f112bbf1432e76c82fa4173fd474b988f4096ce187363fd81","enode":"enode://1c9f6fc264902a736faaf67f7c0de6faee097992d30a5ed225cb334c2a3525ec83d7a038643357fc6c0f7ed5c86e8d272bb475054048f26964e53a4c23b85c6b@127.0.0.1:0","enr":"0xf88fb84037d31d5c2464b59a7a8c3d22f66575e1d23a2d4ea24038f76b84d3446bcd41e51fd1f5dc7189f516c23bbefa0b11f2e7185ef3277b7aa33a4c84594247c8d7bb0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1031c9f6fc264902a736faaf67f7c0de6faee097992d30a5ed225cb334c2a3525ec","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"5k2QdgzYHk8RK78UMudsgvpBc/1HS5iPQJbOGHNj/YE=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: e64d90\npopulation: 30 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 8 09b3 0594 0314 18e0 | 126 0191 (0) 012b (0) 0111 (0) 025d (0)\n001 6 84a9 be68 a0c8 a330 | 75 b4a1 (0) b5ea (0) b6df (0) b659 (0)\n002 4 d302 d209 c6a8 c74d | 27 ddb8 (0) dbd4 (0) dad0 (0) da36 (0)\n003 3 ff75 f8ff f9de | 14 f6c0 (0) f645 (0) f756 (0) f1ed (0)\n004 4 e867 ed42 eff2 eebd | 7 eb68 (0) e867 (0) ef99 (0) eff2 (0)\n005 3 e09f e2d3 e277 | 4 e0a0 (0) e09f (0) e2d3 (0) e277 (0)\n============ DEPTH: 6 ==========================================\n006 1 e471 | 1 e471 (0)\n007 0 | 0\n008 1 e681 | 1 e681 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"e64d90760cd81e4f112bbf1432e76c82fa4173fd474b988f4096ce187363fd81","private_key":"7d27024b921b4fc8acb154f5988128977df743101939d754b1b2b55b69bf2b2e","name":"node_e64d90760cd81e4f112bbf1432e76c82fa4173fd474b988f4096ce187363fd81","services":["bzz","pss"],"enable_msg_events":true,"port":44039},"up":true}},{"node":{"info":{"id":"7e47a2f82984a600c8583605a91d5cb8f2d9a18961845e9c422edd78e20ac3a3","name":"node_7e47a2f82984a600c8583605a91d5cb8f2d9a18961845e9c422edd78e20ac3a3","enode":"enode://12b03573c2a76013619215fba5146b7c44aa72aa214d577e70f611196a80f33b6d2332c3736388f5fdb74a5924f3ee97a4f435093835efe46cfa7b049237fe74@127.0.0.1:0","enr":"0xf88fb840c9ef22c878c1759a06aee668ff6358beb1cf4dd0e15021dce3fd0e637754d3cf1bbebf8a3aa0d6e9bc391e27ad7c93101089f6d54bd0257fb3536766cb4258bc0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10212b03573c2a76013619215fba5146b7c44aa72aa214d577e70f611196a80f33b","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"fkei+CmEpgDIWDYFqR1cuPLZoYlhhF6cQi7deOIKw6M=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 7e47a2\npopulation: 35 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 84a9 8cc3 c6a8 e64d | 130 ab71 (0) ab3f (0) aaf0 (0) a8b5 (0)\n001 6 298a 2a50 397a 3a62 | 65 3411 (0) 36b9 (0) 3728 (0) 32ff (0)\n002 8 5a26 52a8 4d91 4cec | 35 5ff0 (0) 5c37 (0) 5c7c (0) 5d82 (0)\n003 8 6b4e 6e7f 6d5e 6c01 | 13 68cb (0) 6b4e (0) 6e7f (0) 6c01 (0)\n004 2 7660 741a | 4 70f6 (0) 7049 (0) 7660 (0) 741a (0)\n005 3 7850 79e5 7933 | 4 79e5 (0) 7933 (0) 7895 (0) 7850 (0)\n============ DEPTH: 6 ==========================================\n006 4 7d16 7ce7 7c7c 7c46 | 4 7d16 (0) 7ce7 (0) 7c7c (0) 7c46 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"7e47a2f82984a600c8583605a91d5cb8f2d9a18961845e9c422edd78e20ac3a3","private_key":"aa9445dea3d9ca188039006df2529b909dbd39486296eeeb022fb2dd285c4536","name":"node_7e47a2f82984a600c8583605a91d5cb8f2d9a18961845e9c422edd78e20ac3a3","services":["bzz","pss"],"enable_msg_events":true,"port":42041},"up":true}},{"node":{"info":{"id":"c6a8220726243cceaa6f2cebdac857a05efe721323f0a064c7f85a8340d3da96","name":"node_c6a8220726243cceaa6f2cebdac857a05efe721323f0a064c7f85a8340d3da96","enode":"enode://454955797f0067874592850e49998fdc19a2c7bd33a4ff25e33927c6558364eaaf7a788b4ec32bb46722acea4d1a61b9755b0779fbdb323a0f1807ccf6337571@127.0.0.1:0","enr":"0xf88fb84055d87acf3986e47cda898bdd603f343a724a7fc35b5f908e71195bea21f0cfae27ff3cda3965530d8614a9170b9f1aed47abe0d78c21209022d88b407fa338f40183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103454955797f0067874592850e49998fdc19a2c7bd33a4ff25e33927c6558364ea","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"xqgiByYkPM6qbyzr2shXoF7+chMj8KBkx/hag0DT2pY=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: c6a822\npopulation: 27 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 3a62 18e0 7e47 | 126 3411 (0) 3728 (0) 36b9 (0) 32ff (0)\n001 5 a0c8 aeb4 95c0 97da | 75 a742 (0) a7a8 (0) a616 (0) a606 (0)\n002 4 e64d eebd ff75 f8ff | 28 f1ed (0) f305 (0) f2b4 (0) f215 (0)\n003 5 d302 d209 dbd4 da36 | 11 ddb8 (0) dad0 (0) da36 (0) dbd4 (0)\n004 3 cd6c c961 c8c8 | 8 cf52 (0) cc33 (0) cdb1 (0) cd6c (0)\n005 3 c190 c272 c2d0 | 3 c190 (0) c272 (0) c2d0 (0)\n006 2 c42e c534 | 2 c42e (0) c534 (0)\n============ DEPTH: 7 ==========================================\n007 1 c74d | 1 c74d (0)\n008 1 c603 | 1 c603 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"c6a8220726243cceaa6f2cebdac857a05efe721323f0a064c7f85a8340d3da96","private_key":"8f0f60c08655c540026e8566ec695b938ce61b2b96646b0264adf44d9e42610e","name":"node_c6a8220726243cceaa6f2cebdac857a05efe721323f0a064c7f85a8340d3da96","services":["bzz","pss"],"enable_msg_events":true,"port":44073},"up":true}},{"node":{"info":{"id":"18e00a7e0f826a1aba3f8c0f533ed905f2eee607b697fff056ee7874d374adcd","name":"node_18e00a7e0f826a1aba3f8c0f533ed905f2eee607b697fff056ee7874d374adcd","enode":"enode://339676ff1a748c6537d18f6876bb9f1909665415872fa5d5c3a62ee4142ccd6fceb523240a14dc3df222a387212b8f68be3b473f1299016b0b9d342152f0d610@127.0.0.1:0","enr":"0xf88fb840a9c71d615a4992252278bfec4f901f2a5c0bcd153ec613f025be3ea3b9ec116e7fc2d46f878030a2375d5d8467b882559e854ec34a52e0633388ca26268d39dd0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102339676ff1a748c6537d18f6876bb9f1909665415872fa5d5c3a62ee4142ccd6f","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"GOAKfg+Cahq6P4wPUz7ZBfLu5ge2l//wVu54dNN0rc0=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 18e00a\npopulation: 31 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 e64d c6a8 | 130 a2e6 (0) a2a1 (0) a327 (0) a330 (0)\n001 3 435d 6d5e 67f3 | 61 5ff0 (0) 5c7c (0) 5c37 (0) 5d82 (0)\n002 5 298a 3051 31e6 31e1 | 28 3411 (0) 3728 (0) 36b9 (0) 32ff (0)\n003 8 096a 0cfc 0e3b 07f5 | 21 012b (0) 0111 (0) 0191 (0) 025d (0)\n004 5 1049 138d 1686 1484 | 7 1049 (0) 1070 (0) 138d (0) 1784 (0)\n005 3 1fd0 1dc0 1dec | 3 1fd0 (0) 1dc0 (0) 1dec (0)\n006 3 1b1d 1bd5 1add | 3 1b1d (0) 1bd5 (0) 1add (0)\n============ DEPTH: 7 ==========================================\n007 2 194e 19ea | 2 19ea (0) 194e (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"18e00a7e0f826a1aba3f8c0f533ed905f2eee607b697fff056ee7874d374adcd","private_key":"69b0a121df38253f732ead7d4d9eeb8e3c8f00aef1fb652004da58fd2ebf948f","name":"node_18e00a7e0f826a1aba3f8c0f533ed905f2eee607b697fff056ee7874d374adcd","services":["bzz","pss"],"enable_msg_events":true,"port":34725},"up":true}},{"node":{"info":{"id":"140dd212f2b193ee6a9d7fc14f7da321c7ef6fd367fb4f194924fd0ad5d135cc","name":"node_140dd212f2b193ee6a9d7fc14f7da321c7ef6fd367fb4f194924fd0ad5d135cc","enode":"enode://83dc6dc1925eb88e36d37f5c7526d73f05174a1253f00d127ad745dd1c054fa3b925abc6cb084f944a9e2d9ca49f821e98bec10d624c3deaab9c7e2954f80e4e@127.0.0.1:0","enr":"0xf88fb8404586a446db7c94f54415cdc0dc16014a70c60a090734bcdd910014501ce446962d9ec042f168a1cdec3b66fed17422d985d8e4114b5fe512b80e9cd3bead80a00183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10283dc6dc1925eb88e36d37f5c7526d73f05174a1253f00d127ad745dd1c054fa3","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"FA3SEvKxk+5qnX/BT32jIcfvb9Nn+08ZSST9CtXRNcw=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 140dd2\npopulation: 34 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 97da d302 c8c8 f8ff | 130 a742 (0) a7a8 (0) a616 (0) a606 (0)\n001 5 447c 447a 435d 4d91 | 61 5ff0 (0) 5d82 (0) 5c7c (0) 5c37 (0)\n002 3 31e6 3a62 298a | 28 3411 (0) 3728 (0) 36b9 (0) 32ff (0)\n003 8 07f5 0594 0561 0314 | 21 012b (0) 0111 (0) 0191 (0) 025d (0)\n004 7 1fd0 1dc0 1dec 1bd5 | 9 1fd0 (0) 1dc0 (0) 1dec (0) 1b1d (0)\n005 3 1049 1070 138d | 3 1049 (0) 1070 (0) 138d (0)\n============ DEPTH: 6 ==========================================\n006 2 1784 1686 | 2 1686 (0) 1784 (0)\n007 0 | 0\n008 1 1484 | 1 1484 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"140dd212f2b193ee6a9d7fc14f7da321c7ef6fd367fb4f194924fd0ad5d135cc","private_key":"a027baaf8dce7a0533664447524ef6ad27032751f5eb84a289de80342d0fe705","name":"node_140dd212f2b193ee6a9d7fc14f7da321c7ef6fd367fb4f194924fd0ad5d135cc","services":["bzz","pss"],"enable_msg_events":true,"port":44825},"up":true}},{"node":{"info":{"id":"09b3fa30780931e18b92c75d1cdeafa365609c565e4e8c253d393835cb82d98e","name":"node_09b3fa30780931e18b92c75d1cdeafa365609c565e4e8c253d393835cb82d98e","enode":"enode://9d74be605030a4907946d4c396dbc3848b07c4d4d5b66b9171d8ba6d5e60a2558a4bfb0bb3a6b54e540d6dc7628eefcd573ba70bdb77f1f5f121cc0799e85e60@127.0.0.1:0","enr":"0xf88fb840b3dec516c58c4b1c9e69344e8b6c2d6dd826b010cbb4c7b61bd88a6ea6693da73750485c7a1a3bdc77bf30c5076e8a5b2b144deaecf8527f717b018f22c4adc80183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1029d74be605030a4907946d4c396dbc3848b07c4d4d5b66b9171d8ba6d5e60a255","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"CbP6MHgJMeGLksddHN6vo2VgnFZeTowlPTk4NcuC2Y4=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 09b3fa\npopulation: 33 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 aeb4 acee a330 a505 | 130 a970 (0) a8f4 (0) a8ff (0) a8b5 (0)\n001 3 435d 7e47 6d5e | 61 5ff0 (0) 5c37 (0) 5c7c (0) 5d82 (0)\n002 6 31e1 3a62 397a 3cab | 28 26ab (0) 26ac (0) 244c (0) 24f8 (0)\n003 2 1dec 140d | 16 1fd0 (0) 1dc0 (0) 1dec (0) 1bd5 (0)\n004 7 0594 0561 07f5 0111 | 10 012b (0) 0111 (0) 0191 (0) 025d (0)\n005 4 0e80 0e3b 0e2b 0cfc | 5 0e80 (0) 0e2b (0) 0e3b (0) 0d1c (0)\n============ DEPTH: 6 ==========================================\n006 0 | 0\n007 3 08bd 08e5 08f8 | 3 08bd (0) 08f8 (0) 08e5 (0)\n008 2 0942 096a | 2 0942 (0) 096a (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"09b3fa30780931e18b92c75d1cdeafa365609c565e4e8c253d393835cb82d98e","private_key":"30b0537c3a07c424ed947f31703b416041d6e1ccd1b086cb191d59b53dc632d8","name":"node_09b3fa30780931e18b92c75d1cdeafa365609c565e4e8c253d393835cb82d98e","services":["bzz","pss"],"enable_msg_events":true,"port":43439},"up":true}},{"node":{"info":{"id":"f8ff7440d6f4abb1c89496336843741ed53a544cedeeed71d8ebe0b08698438d","name":"node_f8ff7440d6f4abb1c89496336843741ed53a544cedeeed71d8ebe0b08698438d","enode":"enode://51f9bf866b226268237ad44341962115f0595ddc49c87a900c927b7c2c162dae6a3f123b9555e8c0f82927450546ddf8317d461eafe4931b368e709e84b8f060@127.0.0.1:0","enr":"0xf88fb840286a47e012b67dd7b25cc0b9cb9a212019f9b305881989ae09c749fed48a57e16d518566943216dbd238b448ee51fcae686fbc6b12e927e5ab9cfc2d499505000183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10251f9bf866b226268237ad44341962115f0595ddc49c87a900c927b7c2c162dae","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"+P90QNb0q7HIlJYzaEN0HtU6VEzt7u1x2OvgsIaYQ40=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: f8ff74\npopulation: 33 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 6d5e 67f3 2a50 140d | 126 5ff0 (0) 5d82 (0) 5c7c (0) 5c37 (0)\n001 7 a330 be68 84a9 8e7b | 75 a8b5 (0) a8f4 (0) a8ff (0) a970 (0)\n002 8 da36 d959 d209 d302 | 27 ddb8 (0) d9cf (0) d959 (0) da36 (0)\n003 6 e867 ed42 eff2 eebd | 14 eb68 (0) e867 (0) ef99 (0) eff2 (0)\n004 3 f2b4 f305 f756 | 7 f645 (0) f6c0 (0) f756 (0) f1ed (0)\n005 2 fc51 ff75 | 4 feb3 (0) ff75 (0) fc39 (0) fc51 (0)\n============ DEPTH: 6 ==========================================\n006 1 fa24 | 1 fa24 (0)\n007 1 f9de | 1 f9de (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"f8ff7440d6f4abb1c89496336843741ed53a544cedeeed71d8ebe0b08698438d","private_key":"d5ad379d43fa81ba9467d7945d0122c5695d2f7ebdf9d7e1c3384191bd5c4d12","name":"node_f8ff7440d6f4abb1c89496336843741ed53a544cedeeed71d8ebe0b08698438d","services":["bzz","pss"],"enable_msg_events":true,"port":41309},"up":true}},{"node":{"info":{"id":"67f383e5334e9b6701d1dbb20876d4ba9a7e578af0476caed4a7e1b701f2bedb","name":"node_67f383e5334e9b6701d1dbb20876d4ba9a7e578af0476caed4a7e1b701f2bedb","enode":"enode://e379d322e7ad17953d786c9d00289bcf6921926341c7ecf7c128f043b29b702a5b01c6d92c3a39261f59fe8a2ebe5b26edd01d4971f910d0d6e18250e613e301@127.0.0.1:0","enr":"0xf88fb8400be4b9b202ed1e87dd987244284a9c5a5ad6c866e575c7ec5a929b2e91efad41349b08437a98a0f2909c85c3eedc1f2ba650f16d0a0fcb33ec7276e6cc22801e0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103e379d322e7ad17953d786c9d00289bcf6921926341c7ecf7c128f043b29b702a","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"Z/OD5TNOm2cB0duyCHbUupp+V4rwR2yu1KfhtwHyvts=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 67f383\npopulation: 25 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 84a9 8854 97da d302 | 130 a8b5 (0) a8ff (0) a8f4 (0) a970 (0)\n001 3 298a 18e0 0594 | 65 24f8 (0) 244c (0) 26ac (0) 26ab (0)\n002 3 4d91 447a 435d | 35 5ff0 (0) 5c7c (0) 5c37 (0) 5d82 (0)\n003 3 741a 7933 7e47 | 13 70f6 (0) 7049 (0) 7660 (0) 741a (0)\n004 6 6b4e 68cb 6e7f 6c01 | 7 68cb (0) 6b4e (0) 6e7f (0) 6c01 (0)\n005 1 60c5 | 1 60c5 (0)\n006 1 648a | 1 648a (0)\n============ DEPTH: 7 ==========================================\n007 0 | 0\n008 1 6758 | 1 6758 (0)\n009 2 6790 6795 | 2 6790 (0) 6795 (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"67f383e5334e9b6701d1dbb20876d4ba9a7e578af0476caed4a7e1b701f2bedb","private_key":"b8e7f7fd21a946d988fa718b9babed932cf73070403fbd1c56456f04b8243262","name":"node_67f383e5334e9b6701d1dbb20876d4ba9a7e578af0476caed4a7e1b701f2bedb","services":["bzz","pss"],"enable_msg_events":true,"port":34903},"up":true}},{"node":{"info":{"id":"05949ec1a582fa70cab95c59e7c0d315583bf9fc320c60c35268931f21e90853","name":"node_05949ec1a582fa70cab95c59e7c0d315583bf9fc320c60c35268931f21e90853","enode":"enode://b3698b249bc2ecf1f856c3e3f12be6868853b3aa64fe9685b03162dd2a7afd9c491d8328e465d64d17fa49aa429a13c10f1db958b6ab89988370d6465cc0fc01@127.0.0.1:0","enr":"0xf88fb8408c0c34055a93806f387d7f730226b400b33e051c8aabfdda7c998e756544709f2476a88d4935a5c9776c54d5b8a5100260193615759717d3a016f9791a671cc40183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103b3698b249bc2ecf1f856c3e3f12be6868853b3aa64fe9685b03162dd2a7afd9c","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"BZSewaWC+nDKuVxZ58DTFVg7+fwyDGDDUmiTHyHpCFM=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 05949e\npopulation: 32 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 97da 8854 ed42 e64d | 130 a970 (0) a8f4 (0) a8ff (0) a8b5 (0)\n001 4 4cec 7e47 6d5e 67f3 | 61 5ff0 (0) 5c37 (0) 5c7c (0) 5d82 (0)\n002 6 298a 3cab 397a 3a62 | 28 244c (0) 24f8 (0) 26ab (0) 26ac (0)\n003 3 140d 18e0 194e | 16 1fd0 (0) 1dc0 (0) 1dec (0) 1add (0)\n004 5 096a 09b3 08e5 0e2b | 11 0e80 (0) 0e3b (0) 0e2b (0) 0d1c (0)\n005 6 0111 012b 0191 025d | 6 012b (0) 0111 (0) 0191 (0) 025d (0)\n006 1 07f5 | 1 07f5 (0)\n============ DEPTH: 7 ==========================================\n007 1 046c | 1 046c (0)\n008 1 0561 | 1 0561 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"05949ec1a582fa70cab95c59e7c0d315583bf9fc320c60c35268931f21e90853","private_key":"13a0aed3cdf03f83f823244e85cbe9e48d61303a1b41e446aadaaf74a2baf6b0","name":"node_05949ec1a582fa70cab95c59e7c0d315583bf9fc320c60c35268931f21e90853","services":["bzz","pss"],"enable_msg_events":true,"port":45769},"up":true}},{"node":{"info":{"id":"6d5ec591af4966ba024c6b2aeb45e0aab8aa1762f9cac30ce3934da529b738e9","name":"node_6d5ec591af4966ba024c6b2aeb45e0aab8aa1762f9cac30ce3934da529b738e9","enode":"enode://191668a4f4a65da7ee37d46e341722e5a4732a0c63dd8b881141e9c281dc8d7f3f148af361d221bf7efa91709c24772b3a1e93236b9605d17fad43e159cbda30@127.0.0.1:0","enr":"0xf88fb840127e770bef790f2f06aeaf24547639a81249e512c9a9e3b2987bb161f1357f021587b4c9c833ef4c5d09f974548ac56b1b375d388486cbb12cd090e542ae43f30183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102191668a4f4a65da7ee37d46e341722e5a4732a0c63dd8b881141e9c281dc8d7f","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"bV7Fka9JZroCTGsq60XgqriqF2L5ysMM45NNpSm3OOk=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 6d5ec5\npopulation: 29 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 f8ff ed42 97da 8854 | 130 a970 (0) a8b5 (0) a8f4 (0) a8ff (0)\n001 3 18e0 09b3 0594 | 65 244c (0) 24f8 (0) 26ac (0) 26ab (0)\n002 3 4d91 402c 435d | 35 5987 (0) 5814 (0) 5bd8 (0) 5a26 (0)\n003 7 70f6 7660 741a 7e47 | 13 7049 (0) 70f6 (0) 7660 (0) 741a (0)\n004 6 60c5 648a 6758 6790 | 6 60c5 (0) 648a (0) 6758 (0) 6790 (0)\n005 2 68cb 6b4e | 2 68cb (0) 6b4e (0)\n006 1 6e7f | 1 6e7f (0)\n007 1 6c01 | 1 6c01 (0)\n============ DEPTH: 8 ==========================================\n008 1 6dd3 | 1 6dd3 (0)\n009 1 6d3c | 1 6d3c (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"6d5ec591af4966ba024c6b2aeb45e0aab8aa1762f9cac30ce3934da529b738e9","private_key":"1ce56a7fe145cc7c87edd8b2675d674db568652b226b80f6da7067c83cba55ec","name":"node_6d5ec591af4966ba024c6b2aeb45e0aab8aa1762f9cac30ce3934da529b738e9","services":["bzz","pss"],"enable_msg_events":true,"port":39153},"up":true}},{"node":{"info":{"id":"435d721a568eb906a03c69dbd71337251a550521a4004ab5d4a7deb6f317061a","name":"node_435d721a568eb906a03c69dbd71337251a550521a4004ab5d4a7deb6f317061a","enode":"enode://18eb16b8694f440ee7d57163d9cc8181ca5f025dacb16f9afb9e58ea8abdcbbaebed0ab1b856f73ab5ded12b5dd300849b1a721d73e0ac123cc5257373fee65a@127.0.0.1:0","enr":"0xf88fb84017e1348ced6a8488d50ff1773f2ad15c93bee9787be7b6795975b9e5ccb93d777c45645553471401c9fbd354d809e36f1abd98fff3f15723ffdd3f858086833e0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10218eb16b8694f440ee7d57163d9cc8181ca5f025dacb16f9afb9e58ea8abdcbba","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"Q11yGlaOuQagPGnb1xM3JRpVBSGkAEq11KfetvMXBho=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 435d72\npopulation: 30 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 8854 c8c8 | 130 a8b5 (0) a8ff (0) a8f4 (0) a970 (0)\n001 6 3cab 31e1 31e6 140d | 65 244c (0) 24f8 (0) 26ac (0) 26ab (0)\n002 3 7e47 67f3 6d5e | 26 7049 (0) 70f6 (0) 7660 (0) 741a (0)\n003 5 5d82 5a8b 5a26 5144 | 16 5ff0 (0) 5c7c (0) 5c37 (0) 5d82 (0)\n004 6 482e 4b79 4a95 4cec | 10 48b8 (0) 48f1 (0) 48de (0) 48d7 (0)\n005 4 46bf 44ad 447a 447c | 4 46bf (0) 44ad (0) 447a (0) 447c (0)\n006 2 4005 402c | 2 4005 (0) 402c (0)\n============ DEPTH: 7 ==========================================\n007 0 | 0\n008 2 43d4 43c9 | 2 43d4 (0) 43c9 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"435d721a568eb906a03c69dbd71337251a550521a4004ab5d4a7deb6f317061a","private_key":"04326eafbd95ad027f8f4ffe10d64e65b512f2cc4905d138d81f6852b9b0dace","name":"node_435d721a568eb906a03c69dbd71337251a550521a4004ab5d4a7deb6f317061a","services":["bzz","pss"],"enable_msg_events":true,"port":44895},"up":true}},{"node":{"info":{"id":"c8c8a93779ec4d9ac40925e8208478a00ee27fc220ddd73d8774cf6bfa255c46","name":"node_c8c8a93779ec4d9ac40925e8208478a00ee27fc220ddd73d8774cf6bfa255c46","enode":"enode://c74190c0b1b29a5dd50900f0a04a79e60cdc6b3850d663aee32c681c279fe21cb701d8a3414eb18446e769ba8612766d1ed0240d80c3f6df1a1304d7326c21f0@127.0.0.1:0","enr":"0xf88fb8402b4c635d8867172a6c2a46b297fdd9c8bd917476a45883bc2cf7818442ff495622a30b7d13a6e26a66418c8572b882977e2535a91a46e244bed314001414664e0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102c74190c0b1b29a5dd50900f0a04a79e60cdc6b3850d663aee32c681c279fe21c","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"yMipN3nsTZrECSXoIIR4oA7if8Ig3dc9h3TPa/olXEY=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: c8c8a9\npopulation: 23 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 140d 0594 435d | 126 1fd0 (0) 1dc0 (0) 1dec (0) 1b1d (0)\n001 3 be68 8854 97da | 75 a970 (0) a8b5 (0) a8f4 (0) a8ff (0)\n002 3 ed42 f9de f8ff | 28 f1ed (0) f305 (0) f2b4 (0) f215 (0)\n003 5 d959 dbd4 dad0 d209 | 11 ddb8 (0) d9cf (0) d959 (0) da36 (0)\n004 3 c74d c603 c6a8 | 8 c190 (0) c2d0 (0) c272 (0) c42e (0)\n005 3 cf52 cdb1 cd6c | 4 cf52 (0) cc33 (0) cdb1 (0) cd6c (0)\n============ DEPTH: 6 ==========================================\n006 0 | 0\n007 2 c9c3 c961 | 2 c9c3 (0) c961 (0)\n008 0 | 0\n009 0 | 0\n010 1 c8ea | 1 c8ea (0)\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"c8c8a93779ec4d9ac40925e8208478a00ee27fc220ddd73d8774cf6bfa255c46","private_key":"4e1a61cde64af44b0dda77ec6ccf177754acdcf8296a2f6a28f809a3edd78a51","name":"node_c8c8a93779ec4d9ac40925e8208478a00ee27fc220ddd73d8774cf6bfa255c46","services":["bzz","pss"],"enable_msg_events":true,"port":37665},"up":true}},{"node":{"info":{"id":"97daf2cbe03c80ce6c4dae39cd071dd93cb32ed245aa9aa77285e12296957ca3","name":"node_97daf2cbe03c80ce6c4dae39cd071dd93cb32ed245aa9aa77285e12296957ca3","enode":"enode://e1a0b593eb6718290b19a241af012bcd050ba91442c444f9cb2728679fbaff94ae18b9344b896242f38d5cc5e5c71365c9b569d2b8c6e75c7237ad6399d03af0@127.0.0.1:0","enr":"0xf88fb8406126b86c32443771ffd4fe3aa1679a8627ee6dac7eb5d4ca51c1cea7b6742a093d407bde58a20a099b8dedea0066471ae30fbef9362c0a2d24ee87b0e22e50f80183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102e1a0b593eb6718290b19a241af012bcd050ba91442c444f9cb2728679fbaff94","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"l9ryy+A8gM5sTa45zQcd2TyzLtJFqpqncoXhIpaVfKM=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 97daf2\npopulation: 32 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 9 67f3 6b4e 6d5e 4cec | 126 1fd0 (0) 1dc0 (0) 1dec (0) 1add (0)\n001 5 f8ff f9de ed42 c6a8 | 55 f1ed (0) f305 (0) f215 (0) f2b4 (0)\n002 3 a505 bfc7 be68 | 37 a970 (0) a8b5 (0) a8f4 (0) a8ff (0)\n003 5 80d7 834f 837f 84a9 | 21 87a3 (0) 86d6 (0) 8402 (0) 84a9 (0)\n004 4 9c8e 9f0e 9959 9948 | 9 9b8e (0) 9948 (0) 9959 (0) 9c21 (0)\n005 2 9257 93ea | 3 9257 (0) 93c0 (0) 93ea (0)\n============ DEPTH: 6 ==========================================\n006 4 9464 955d 9518 95c0 | 4 9464 (0) 955d (0) 9518 (0) 95c0 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"97daf2cbe03c80ce6c4dae39cd071dd93cb32ed245aa9aa77285e12296957ca3","private_key":"65fbf9c544386bb7decc36886fba5c38238694e8e4ed0840b82ca0297e58b620","name":"node_97daf2cbe03c80ce6c4dae39cd071dd93cb32ed245aa9aa77285e12296957ca3","services":["bzz","pss"],"enable_msg_events":true,"port":33903},"up":true}},{"node":{"info":{"id":"885427318634c458a3050f2f26eb52454a75cea4a1263b9ed55e6eb899743854","name":"node_885427318634c458a3050f2f26eb52454a75cea4a1263b9ed55e6eb899743854","enode":"enode://53546a710a035309f1cbff35e8971bc7e690c23561599cf911a655235c34c063b6e49304da7dba56252e94bad64391e6e125b5e05162b0ddadf4822b5a2675b2@127.0.0.1:0","enr":"0xf88fb8407997f2172b5d153c60a8f8632c854da0dfb927a300de8988efc5d43eea68d0b035456f1e0f6f5cb8376ed14fe4c0d5884d94539a49bf8452ad524f86113a29740183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10253546a710a035309f1cbff35e8971bc7e690c23561599cf911a655235c34c063","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"iFQnMYY0xFijBQ8vJutSRUp1zqShJjue1V5uuJl0OFQ=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 885427\npopulation: 41 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 9 0594 31e1 31e6 3cab | 126 012b (0) 0111 (0) 0191 (0) 025d (0)\n001 7 dbd4 d302 c6a8 c8c8 | 55 ddb8 (0) d959 (0) d9cf (0) da36 (0)\n002 7 a8ff acee a2a1 a606 | 37 aaf0 (0) ab71 (0) ab3f (0) a970 (0)\n003 7 9959 9948 9c8e 9f0e | 17 9b8e (0) 9948 (0) 9959 (0) 9c21 (0)\n004 4 84a9 80d7 837f 834f | 12 87a3 (0) 86d6 (0) 8402 (0) 84a9 (0)\n005 5 8cc3 8d19 8f9a 8e28 | 6 8f9a (0) 8ea2 (0) 8e28 (0) 8e7b (0)\n============ DEPTH: 6 ==========================================\n006 1 8b43 | 1 8b43 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 1 8862 | 1 8862 (0)\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"885427318634c458a3050f2f26eb52454a75cea4a1263b9ed55e6eb899743854","private_key":"2dbbc994f617a8ec6183e97342de018005e6067b99283fdcef5b5d8dee384215","name":"node_885427318634c458a3050f2f26eb52454a75cea4a1263b9ed55e6eb899743854","services":["bzz","pss"],"enable_msg_events":true,"port":36713},"up":true}},{"node":{"info":{"id":"ed424d24d702520bf7cb5f6babbdc43a078435fb4a9884ed82a93d642839e127","name":"node_ed424d24d702520bf7cb5f6babbdc43a078435fb4a9884ed82a93d642839e127","enode":"enode://a37137b1144735e571b2b0d8386ee87d4a549cfca4fd3fdddcb70745a7ce46fbc54b5d7b73e96de787896a234c4d22462e56a95a8dd6436cce4058d48847b44f@127.0.0.1:0","enr":"0xf88fb8409e3a3caf38d98642bade767220e7e62bad581c331b1e79c7a8fb576b7f80965e6d8d4d2163232397c431ac51260f72fee0862a1d49e2fab3b62f851a6f9a52430183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103a37137b1144735e571b2b0d8386ee87d4a549cfca4fd3fdddcb70745a7ce46fb","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"7UJNJNcCUgv3y19rq73EOgeENftKmITtgqk9ZCg54Sc=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: ed424d\npopulation: 29 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 7 0594 397a 31e1 447c | 126 025d (0) 035f (0) 0314 (0) 0111 (0)\n001 5 be68 bfc7 ab3f 97da | 75 a8b5 (0) a8f4 (0) a8ff (0) a970 (0)\n002 6 d302 dbd4 dad0 cd6c | 27 ddb8 (0) d959 (0) d9cf (0) da36 (0)\n003 3 f645 f8ff f9de | 14 f1ed (0) f305 (0) f2b4 (0) f215 (0)\n004 2 e64d e277 | 7 e0a0 (0) e09f (0) e2d3 (0) e277 (0)\n005 2 eb68 e867 | 2 eb68 (0) e867 (0)\n============ DEPTH: 6 ==========================================\n006 3 eebd ef99 eff2 | 3 ef99 (0) eff2 (0) eebd (0)\n007 1 ec90 | 1 ec90 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"ed424d24d702520bf7cb5f6babbdc43a078435fb4a9884ed82a93d642839e127","private_key":"88f389b4ef227125edc26120d238800734b5410e04322c15e248c5f216cc79c9","name":"node_ed424d24d702520bf7cb5f6babbdc43a078435fb4a9884ed82a93d642839e127","services":["bzz","pss"],"enable_msg_events":true,"port":39221},"up":true}},{"node":{"info":{"id":"67585dfd87a005bae9bffc2cccb83c69537247c74886b4fa52287f46c796bcb6","name":"node_67585dfd87a005bae9bffc2cccb83c69537247c74886b4fa52287f46c796bcb6","enode":"enode://cb89fe308a6760281a69d0737d0d373c9115feed0da089e0c2fcbc632089bf098dc65445404a53c75abf5006078392d46230c01bfbc96678614d72ba1f7ed94a@127.0.0.1:0","enr":"0xf88fb84062af8663cd95c946ddf91876f7724b51ef50c4562e116101de9830fa163e131e43857e1a002e03e8cffc1422472e7fc9638932823b58484aac2e28aba63484720183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102cb89fe308a6760281a69d0737d0d373c9115feed0da089e0c2fcbc632089bf09","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"Z1hd/YegBbrpv/wszLg8aVNyR8dIhrT6Uih/RseWvLY=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 67585d\npopulation: 24 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 a505 eebd ed42 | 130 aaf0 (0) ab71 (0) ab3f (0) a970 (0)\n001 5 194e 0cfc 31e1 31e6 | 65 025d (0) 035f (0) 0314 (0) 012b (0)\n002 2 447a 4cec | 35 5538 (0) 5663 (0) 56ca (0) 50c1 (0)\n003 4 7850 7933 7c46 7e47 | 13 70f6 (0) 7049 (0) 741a (0) 7660 (0)\n004 5 6b4e 6e7f 6c01 6dd3 | 7 6e7f (0) 6c01 (0) 6dd3 (0) 6d3c (0)\n005 1 60c5 | 1 60c5 (0)\n006 1 648a | 1 648a (0)\n============ DEPTH: 7 ==========================================\n007 0 | 0\n008 3 67f3 6790 6795 | 3 6790 (0) 6795 (0) 67f3 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"67585dfd87a005bae9bffc2cccb83c69537247c74886b4fa52287f46c796bcb6","private_key":"269bc398581870d669185abbe5f5c9b2f0e731c8e3f48a13c092c65822208065","name":"node_67585dfd87a005bae9bffc2cccb83c69537247c74886b4fa52287f46c796bcb6","services":["bzz","pss"],"enable_msg_events":true,"port":38253},"up":true}},{"node":{"info":{"id":"4cece9bc134bc2b09400c9f7f8a4df9270d2fe3c077c5e441fffc911fcf6f42e","name":"node_4cece9bc134bc2b09400c9f7f8a4df9270d2fe3c077c5e441fffc911fcf6f42e","enode":"enode://80e251b60502a0ca85c11875b9277729738dede4fe4d9da6aeac1bb93d7238ca81487fe9498180e00b10f3c24d030f8c399f02859b795d662a07dd7925bac295@127.0.0.1:0","enr":"0xf88fb8402acfbb34a162aefb2c548c72269c23643ae0c7bbc60406858fa6a60e304f225874d92d713f75b155bc9b1e2b135e732ae7a89a0f2dc1d4a1768bf1752a8b72ef0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10380e251b60502a0ca85c11875b9277729738dede4fe4d9da6aeac1bb93d7238ca","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"TOzpvBNLwrCUAMn3+KTfknDS/jwHfF5EH//JEfz29C4=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 4cece9\npopulation: 30 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 f9de 97da 8854 | 130 aaf0 (0) ab71 (0) ab3f (0) a970 (0)\n001 4 0594 194e 140d 31e1 | 65 025d (0) 035f (0) 0314 (0) 012b (0)\n002 5 7850 7933 7c46 7e47 | 26 7049 (0) 70f6 (0) 741a (0) 7660 (0)\n003 4 52a8 5ac0 5a8b 5d82 | 16 5538 (0) 56ca (0) 5663 (0) 50c1 (0)\n004 5 435d 43d4 402c 447a | 9 46bf (0) 44ad (0) 447a (0) 447c (0)\n005 7 48b8 48f1 48d7 48de | 7 48b8 (0) 48f1 (0) 48d7 (0) 48de (0)\n============ DEPTH: 6 ==========================================\n006 0 | 0\n007 2 4d38 4d91 | 2 4d38 (0) 4d91 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"4cece9bc134bc2b09400c9f7f8a4df9270d2fe3c077c5e441fffc911fcf6f42e","private_key":"745ab9f5dd6b46c5ac98c2548026c8c305b3a532b9a83e9721126e740be9bb3d","name":"node_4cece9bc134bc2b09400c9f7f8a4df9270d2fe3c077c5e441fffc911fcf6f42e","services":["bzz","pss"],"enable_msg_events":true,"port":40221},"up":true}},{"node":{"info":{"id":"31e129ab3df7e082cc27c649d9ee29a3ea646d6a97d2417875b80e3ff576c047","name":"node_31e129ab3df7e082cc27c649d9ee29a3ea646d6a97d2417875b80e3ff576c047","enode":"enode://f25dcda2d8dc59f4bd92c76bbc67662093243b8b2cfc966b9184fff854c66ec74507189ff7b3d4f89c266f79e8204f53b2ed2528ad9c3988b8d2e102ccd8ca05@127.0.0.1:0","enr":"0xf88fb840f2ed7d35799356b01b8172d9212f95f949f3ac3c3d9805388236bfae93eb4a0a2a4ea72335f7564107155b17384251f99007367bcd5afdea76fc4f8eee53b3920183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103f25dcda2d8dc59f4bd92c76bbc67662093243b8b2cfc966b9184fff854c66ec7","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"MeEpqz334ILMJ8ZJ2e4po+pkbWqX0kF4dbgOP/V2wEc=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 31e129\npopulation: 31 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 ed42 8854 97da | 130 a8b5 (0) a8f4 (0) a8ff (0) a970 (0)\n001 3 6758 435d 4cec | 61 70f6 (0) 7049 (0) 741a (0) 7660 (0)\n002 8 18e0 194e 0314 0191 | 37 025d (0) 035f (0) 0314 (0) 012b (0)\n003 2 2a50 298a | 11 244c (0) 24f8 (0) 26ab (0) 26ac (0)\n004 7 3a62 3b02 3980 397a | 8 3b02 (0) 3a62 (0) 3980 (0) 3938 (0)\n005 3 3411 36b9 3728 | 3 3411 (0) 36b9 (0) 3728 (0)\n006 1 32ff | 1 32ff (0)\n007 2 30fe 3051 | 2 30fe (0) 3051 (0)\n============ DEPTH: 8 ==========================================\n008 0 | 0\n009 1 3188 | 1 3188 (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 1 31e6 | 1 31e6 (0)\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"31e129ab3df7e082cc27c649d9ee29a3ea646d6a97d2417875b80e3ff576c047","private_key":"6f326011c258ea982e622f9e58986cda7a19e77bfef9c62969474eeca0a3d8bd","name":"node_31e129ab3df7e082cc27c649d9ee29a3ea646d6a97d2417875b80e3ff576c047","services":["bzz","pss"],"enable_msg_events":true,"port":41755},"up":true}},{"node":{"info":{"id":"31e670638acba3d58f4c67f3ff2f3f25d769e8a5d7a7838927f4d9d169a84404","name":"node_31e670638acba3d58f4c67f3ff2f3f25d769e8a5d7a7838927f4d9d169a84404","enode":"enode://f7c60635eb672476a7495b71f8dbcf2e50096b636d779195890b040d3a29f30617ac3ff34852bd1caadb9357ed844fd29cb9919f774986b1532f30e8fb5701f1@127.0.0.1:0","enr":"0xf88fb8401d011f6dc991e8d64cfd4b5595b6bcfa3a705c57e6f4494f8b1bc0ce443b738a6f0f975dbfaeda383333324db5b52840e0e34f48d194ee2ec25548336a6196aa0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103f7c60635eb672476a7495b71f8dbcf2e50096b636d779195890b040d3a29f306","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"MeZwY4rLo9WPTGfz/y8/Jddp6KXXp4OJJ/TZ0WmoRAQ=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 31e670\npopulation: 30 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 97da 8854 f9de | 130 a8b5 (0) a8f4 (0) a8ff (0) a970 (0)\n001 4 6b4e 6758 435d 4d91 | 61 5538 (0) 5663 (0) 56ca (0) 50c1 (0)\n002 8 138d 140d 18e0 194e | 37 025d (0) 035f (0) 0314 (0) 012b (0)\n003 2 2a50 298a | 11 244c (0) 24f8 (0) 26ab (0) 26ac (0)\n004 6 3b02 3a62 397a 3f31 | 8 3b02 (0) 3a62 (0) 3980 (0) 3938 (0)\n005 2 36b9 3728 | 3 3411 (0) 3728 (0) 36b9 (0)\n006 1 32ff | 1 32ff (0)\n007 2 30fe 3051 | 2 30fe (0) 3051 (0)\n============ DEPTH: 8 ==========================================\n008 0 | 0\n009 1 3188 | 1 3188 (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 1 31e1 | 1 31e1 (0)\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"31e670638acba3d58f4c67f3ff2f3f25d769e8a5d7a7838927f4d9d169a84404","private_key":"4d4953737261cf103a7e8d13c536e05949f4fc81404cbb94631badeed94837ae","name":"node_31e670638acba3d58f4c67f3ff2f3f25d769e8a5d7a7838927f4d9d169a84404","services":["bzz","pss"],"enable_msg_events":true,"port":44433},"up":true}},{"node":{"info":{"id":"f9ded7b83e473e71be2fc0101d574c44521c96f77f9f84a384785a3af6b1093d","name":"node_f9ded7b83e473e71be2fc0101d574c44521c96f77f9f84a384785a3af6b1093d","enode":"enode://4cbf242837d8648b219a54398f6646ffe9e4729be3c43431284b27b6f6be2ee2f1267c6ea399699ca10b43dc11dcfb86fc2958e56b558b31d7679ae4493a37a9@127.0.0.1:0","enr":"0xf88fb840373f3de0559f7684b4ce5d159798f351f1bdf5f6792f3e506c2ccd904f07acae6955eaa902b5ad78809cebc0dc80ab7000ede03782617ca114ea23734f786c0b0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1034cbf242837d8648b219a54398f6646ffe9e4729be3c43431284b27b6f6be2ee2","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"+d7XuD5HPnG+L8AQHVdMRFIclvd/n4SjhHhaOvaxCT0=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: f9ded7\npopulation: 34 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 4cec 2a50 3cab 31e6 | 126 5538 (0) 5663 (0) 56ca (0) 50c1 (0)\n001 4 be68 95c0 97da 8854 | 75 a970 (0) a8b5 (0) a8f4 (0) a8ff (0)\n002 9 ddb8 d9cf dad0 dbd4 | 27 d700 (0) d408 (0) d209 (0) d3e9 (0)\n003 6 e277 e64d e867 eff2 | 14 e0a0 (0) e09f (0) e2d3 (0) e277 (0)\n004 5 f756 f645 f1ed f215 | 7 f756 (0) f6c0 (0) f645 (0) f305 (0)\n005 4 feb3 ff75 fc39 fc51 | 4 ff75 (0) feb3 (0) fc39 (0) fc51 (0)\n============ DEPTH: 6 ==========================================\n006 1 fa24 | 1 fa24 (0)\n007 1 f8ff | 1 f8ff (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"f9ded7b83e473e71be2fc0101d574c44521c96f77f9f84a384785a3af6b1093d","private_key":"560da7a87ffd5a5bf49023d7b80398255aa1e028182ddc8fb2d8d256ecb672cf","name":"node_f9ded7b83e473e71be2fc0101d574c44521c96f77f9f84a384785a3af6b1093d","services":["bzz","pss"],"enable_msg_events":true,"port":35959},"up":true}},{"node":{"info":{"id":"3cabd3a567fc4e6f8da66eb35d938fe1e9a7f2bdd2d36c4dc2d0e0e9149f5e56","name":"node_3cabd3a567fc4e6f8da66eb35d938fe1e9a7f2bdd2d36c4dc2d0e0e9149f5e56","enode":"enode://f292084e170293ef0d10591a7f596160c60090fb507add19279ae94ea15d4a935fee18917eb7afa876ce5961dccb0b6ab2e150bc746f0b6ce06b845fde8484d4@127.0.0.1:0","enr":"0xf88fb840aab20c00818aacbcf3d572ad9eb90bf3e50ed4ddeca68551ddaa751a781060ff1e937ba61f3905c35d7615ed44caed38be61740bf970af0c891c6da983e1dad90183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102f292084e170293ef0d10591a7f596160c60090fb507add19279ae94ea15d4a93","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"PKvTpWf8Tm+Npm6zXZOP4emn8r3S02xNwtDg6RSfXlY=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 3cabd3\npopulation: 28 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 9f0e 97da 8854 f9de | 130 a8b5 (0) a8f4 (0) a8ff (0) a970 (0)\n001 3 435d 6758 6b4e | 61 5538 (0) 5663 (0) 56ca (0) 50c1 (0)\n002 4 194e 0594 09b3 0cfc | 37 025d (0) 035f (0) 0314 (0) 012b (0)\n003 4 26ab 2c85 298a 2a50 | 11 244c (0) 24f8 (0) 26ac (0) 26ab (0)\n004 6 36b9 3728 3051 3188 | 9 3411 (0) 36b9 (0) 3728 (0) 32ff (0)\n005 5 3b02 3a62 3980 3938 | 5 3b02 (0) 3a62 (0) 3980 (0) 3938 (0)\n============ DEPTH: 6 ==========================================\n006 1 3f31 | 1 3f31 (0)\n007 0 | 0\n008 1 3c5b | 1 3c5b (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"3cabd3a567fc4e6f8da66eb35d938fe1e9a7f2bdd2d36c4dc2d0e0e9149f5e56","private_key":"b5d0c48905d715632a6aaabb360e0f68e9cd27a16403c0a46de69e46c63ddcbd","name":"node_3cabd3a567fc4e6f8da66eb35d938fe1e9a7f2bdd2d36c4dc2d0e0e9149f5e56","services":["bzz","pss"],"enable_msg_events":true,"port":37601},"up":true}},{"node":{"info":{"id":"6b4ee1b73942ced78f97c0d0e221209933e63ae7353bb9ab3d37ac4127592e86","name":"node_6b4ee1b73942ced78f97c0d0e221209933e63ae7353bb9ab3d37ac4127592e86","enode":"enode://6489e2a9199837f8fb02ee32e8a8e76e29774f8596d0fdffe3d8b41ba49e47585c8ed3fd4fc87f5fe51217783eacc9f05e2b81b3388080fed75911cd15725490@127.0.0.1:0","enr":"0xf88fb840ac0ad126e5eaf3e3023aba08512eb98162e314d5a5bb8c9c237526d01a89099e074ee06f4d91f3f53b223df357b13d025dfc152842f36944651f957be64820720183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1026489e2a9199837f8fb02ee32e8a8e76e29774f8596d0fdffe3d8b41ba49e4758","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"a07htzlCztePl8DQ4iEgmTPmOuc1O7mrPTesQSdZLoY=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 6b4ee1\npopulation: 28 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 eebd a505 be68 8854 | 130 af02 (0) aeb4 (0) acee (0) a970 (0)\n001 4 0cfc 31e6 3b02 3cab | 65 025d (0) 035f (0) 0314 (0) 012b (0)\n002 2 447c 4d91 | 35 5538 (0) 56ca (0) 5663 (0) 52a8 (0)\n003 4 7e47 7c46 7850 7933 | 13 70f6 (0) 7049 (0) 741a (0) 7660 (0)\n004 6 60c5 648a 67f3 6790 | 6 60c5 (0) 648a (0) 6790 (0) 6795 (0)\n============ DEPTH: 5 ==========================================\n005 5 6e7f 6c01 6dd3 6d3c | 5 6c01 (0) 6dd3 (0) 6d3c (0) 6d5e (0)\n006 1 68cb | 1 68cb (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"6b4ee1b73942ced78f97c0d0e221209933e63ae7353bb9ab3d37ac4127592e86","private_key":"55cabfb948c8655f9b1b9a73378029595cbbc8676d1e8109d34bed3ed4d363ec","name":"node_6b4ee1b73942ced78f97c0d0e221209933e63ae7353bb9ab3d37ac4127592e86","services":["bzz","pss"],"enable_msg_events":true,"port":35557},"up":true}},{"node":{"info":{"id":"4d9147e3bf98cb59a7648f616c0d7f713a8cf3b7d25e3115233ff5883128beab","name":"node_4d9147e3bf98cb59a7648f616c0d7f713a8cf3b7d25e3115233ff5883128beab","enode":"enode://3047ce86e36b5df4ad3ba58da463012de954e7d23e30785281cd29a6cd9b53415ddca770f01615455e2191b2868a81fe90acb8c2c55af4d0b6a28cff220f27d0@127.0.0.1:0","enr":"0xf88fb8408ea2548809d57c51f6a345099fec0eb50bd94967e457cda4f7e809111d8191382d22aae732783fafb04e860e20a244e746261107b3adc670153e02d137b1dfca0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1023047ce86e36b5df4ad3ba58da463012de954e7d23e30785281cd29a6cd9b5341","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"TZFH47+Yy1mnZI9hbA1/cTqM87fSXjEVIz/1iDEovqs=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 4d9147\npopulation: 30 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 be68 95c0 ed42 eebd | 130 d700 (0) d408 (0) d209 (0) d3e9 (0)\n001 7 140d 1bd5 194e 0cfc | 65 025d (0) 035f (0) 0314 (0) 012b (0)\n002 4 7e47 67f3 6d5e 6b4e | 26 70f6 (0) 7049 (0) 7660 (0) 741a (0)\n003 2 5d82 5a8b | 16 50c1 (0) 5144 (0) 52a8 (0) 5538 (0)\n004 4 447c 447a 435d 402c | 9 4005 (0) 402c (0) 43c9 (0) 43d4 (0)\n005 7 4a95 4b79 48b8 48d7 | 7 4b79 (0) 4a95 (0) 48b8 (0) 48f1 (0)\n============ DEPTH: 6 ==========================================\n006 0 | 0\n007 1 4cec | 1 4cec (0)\n008 1 4d38 | 1 4d38 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"4d9147e3bf98cb59a7648f616c0d7f713a8cf3b7d25e3115233ff5883128beab","private_key":"7dfa845b9c68e8058b6cff027cac1e713602c7d9e8ac4f04b0698a044871211e","name":"node_4d9147e3bf98cb59a7648f616c0d7f713a8cf3b7d25e3115233ff5883128beab","services":["bzz","pss"],"enable_msg_events":true,"port":36001},"up":true}},{"node":{"info":{"id":"397a0a0e9fadcb571acd8981f5bfe8e059e707e0feae8a9c4c6bfe87bd39e66a","name":"node_397a0a0e9fadcb571acd8981f5bfe8e059e707e0feae8a9c4c6bfe87bd39e66a","enode":"enode://755abc3fa17f10b0c6bb93f9525352b3827f6e3f98bd74e4e52420017500a44983656b92a4a1253ead59da4030b30232f86d214431ad83949e6b218222c8c520@127.0.0.1:0","enr":"0xf88fb840486c18e5673883f3888ab658643d9e0012443ec6ca0c40e6876961396f39f722009fb44a458d56561c9ac5f302f47b069f97c94986e68ef69e0513431f4d0d9a0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102755abc3fa17f10b0c6bb93f9525352b3827f6e3f98bd74e4e52420017500a449","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"OXoKDp+ty1cazYmB9b/o4FnnB+D+roqcTGv+h7055mo=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 397a0a\npopulation: 28 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 9f0e be68 ed42 eebd | 130 d700 (0) d408 (0) d209 (0) d3e9 (0)\n001 3 7e47 7c46 4d91 | 61 7049 (0) 70f6 (0) 7660 (0) 741a (0)\n002 5 0191 0594 09b3 1bd5 | 37 046c (0) 0594 (0) 0561 (0) 07f5 (0)\n003 3 2e65 2a50 298a | 11 26ab (0) 26ac (0) 244c (0) 24f8 (0)\n004 6 3411 36b9 3051 3188 | 9 3411 (0) 36b9 (0) 3728 (0) 32ff (0)\n005 3 3f31 3c5b 3cab | 3 3c5b (0) 3cab (0) 3f31 (0)\n006 2 3b02 3a62 | 2 3b02 (0) 3a62 (0)\n============ DEPTH: 7 ==========================================\n007 0 | 0\n008 1 3980 | 1 3980 (0)\n009 1 3938 | 1 3938 (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"397a0a0e9fadcb571acd8981f5bfe8e059e707e0feae8a9c4c6bfe87bd39e66a","private_key":"e7af2fa49f44ec8fb20007e24a24e4d54f98188bf25d133631e2f2ae2455b7e5","name":"node_397a0a0e9fadcb571acd8981f5bfe8e059e707e0feae8a9c4c6bfe87bd39e66a","services":["bzz","pss"],"enable_msg_events":true,"port":46385},"up":true}},{"node":{"info":{"id":"194ea3e14dc5d99f98d15607dc4c405769f5a371acc22d41a62d0537d716be32","name":"node_194ea3e14dc5d99f98d15607dc4c405769f5a371acc22d41a62d0537d716be32","enode":"enode://c55b0a9cce8421ed641876de3f9fed4b8a2fb2ef501cc2fa2c6c648609322114009de6258aa164d605ba2839658265bbb44a89d9ed9dbdbafa2f6d0451b75999@127.0.0.1:0","enr":"0xf88fb8406b407aefd0711536e0d1d66333664fef8325d87d5c12dcdfe5736ad122c4f05833ae95d2691865c2a66a8400c4112b32b073bb084564d49d1037bdfe563b3c890183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103c55b0a9cce8421ed641876de3f9fed4b8a2fb2ef501cc2fa2c6c648609322114","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"GU6j4U3F2Z+Y0VYH3ExAV2n1o3Gswi1Bpi0FN9cWvjI=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 194ea3\npopulation: 31 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 95c0 ab3f be68 eebd | 130 d700 (0) d408 (0) d209 (0) d3e9 (0)\n001 5 6758 5d82 4cec 4d91 | 61 5538 (0) 5663 (0) 56ca (0) 50c1 (0)\n002 5 298a 31e6 31e1 3cab | 28 26ab (0) 26ac (0) 244c (0) 24f8 (0)\n003 6 0561 0594 07f5 0191 | 21 046c (0) 0594 (0) 0561 (0) 07f5 (0)\n004 4 1049 1686 1484 140d | 7 138d (0) 1070 (0) 1049 (0) 1784 (0)\n005 2 1fd0 1dec | 3 1fd0 (0) 1dc0 (0) 1dec (0)\n006 3 1b1d 1bd5 1add | 3 1add (0) 1b1d (0) 1bd5 (0)\n============ DEPTH: 7 ==========================================\n007 1 18e0 | 1 18e0 (0)\n008 1 19ea | 1 19ea (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"194ea3e14dc5d99f98d15607dc4c405769f5a371acc22d41a62d0537d716be32","private_key":"5ff701f0b31e5dfbd321b192941d8a7e41af8a30830fa9c299a338bbfd3a8ee6","name":"node_194ea3e14dc5d99f98d15607dc4c405769f5a371acc22d41a62d0537d716be32","services":["bzz","pss"],"enable_msg_events":true,"port":40883},"up":true}},{"node":{"info":{"id":"0cfc7309afabceeb7d248714e972cf3987205324f5ab8d048d17bea5dc87369d","name":"node_0cfc7309afabceeb7d248714e972cf3987205324f5ab8d048d17bea5dc87369d","enode":"enode://1c7485ed433143e6155988aead862aabcc93379a3897b443d75e1d2bce71c04cb75fea9591ed5e36b41949620e51fa8503ec72be6dd0b35a6405747b4dafc014@127.0.0.1:0","enr":"0xf88fb8402d44bd3da0be88d95e8011c9ae2754ea517a35bcf004b02da2673b824687e150720f9fc230cb05afe3de5214e1b1fc4da7501f86b228946800880e9f3af671580183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1021c7485ed433143e6155988aead862aabcc93379a3897b443d75e1d2bce71c04c","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"DPxzCa+rzut9JIcU6XLPOYcgUyT1q40EjRe+pdyHNp0=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 0cfc73\npopulation: 33 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 ddb8 d302 d408 95c0 | 130 d700 (0) d408 (0) d209 (0) d3e9 (0)\n001 6 5ac0 4d91 447c 6758 | 61 7049 (0) 70f6 (0) 7660 (0) 741a (0)\n002 3 31e6 31e1 3cab | 28 244c (0) 24f8 (0) 26ac (0) 26ab (0)\n003 5 140d 1dec 1bd5 18e0 | 16 138d (0) 1070 (0) 1049 (0) 1686 (0)\n004 6 0191 0111 0314 07f5 | 10 025d (0) 035f (0) 0314 (0) 012b (0)\n005 5 08bd 08f8 08e5 09b3 | 6 08e5 (0) 08f8 (0) 08bd (0) 09b3 (0)\n============ DEPTH: 6 ==========================================\n006 3 0e80 0e3b 0e2b | 3 0e80 (0) 0e2b (0) 0e3b (0)\n007 1 0d1c | 1 0d1c (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"0cfc7309afabceeb7d248714e972cf3987205324f5ab8d048d17bea5dc87369d","private_key":"35dace76ca3522b7137c5d74398db392e8341bb9003f933fdc14452fd1750019","name":"node_0cfc7309afabceeb7d248714e972cf3987205324f5ab8d048d17bea5dc87369d","services":["bzz","pss"],"enable_msg_events":true,"port":44149},"up":true}},{"node":{"info":{"id":"95c0a351fb7aa6683280d159a7b808bfa63f63bff91a1c5936e973b2e5d3954f","name":"node_95c0a351fb7aa6683280d159a7b808bfa63f63bff91a1c5936e973b2e5d3954f","enode":"enode://098c38172926d2bea42728e3631de32062e6ec72da225a5737de50e5ec60e3eed42ee486959bdab553e465298a18c4ebf4c31dbdc77cfde7fe165cf86acb2695@127.0.0.1:0","enr":"0xf88fb84033fceafba7c7cd03f8de801dcdc01997dfe2a50ddb89b115c4d5ad40b7834b060eb29e4c2bd6811003ef36b75d39ed9c2effaca4138325ec3793c254b322f4880183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103098c38172926d2bea42728e3631de32062e6ec72da225a5737de50e5ec60e3ee","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"lcCjUft6pmgygNFZp7gIv6Y/Y7/5GhxZNulzsuXTlU8=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 95c0a3\npopulation: 32 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 6e7f 6b4e 4d91 194e | 126 7660 (0) 741a (0) 7049 (0) 70f6 (0)\n001 6 dad0 cd6c c6a8 f8ff | 55 d700 (0) d408 (0) d209 (0) d3e9 (0)\n002 3 a505 bfc7 be68 | 37 a970 (0) a8b5 (0) a8f4 (0) a8ff (0)\n003 6 8854 8e28 8cc3 80d7 | 21 8f9a (0) 8ea2 (0) 8e28 (0) 8e7b (0)\n004 5 9b8e 9948 9959 9c8e | 9 9b8e (0) 9948 (0) 9959 (0) 9ca1 (0)\n005 3 93ea 93c0 9257 | 3 9257 (0) 93c0 (0) 93ea (0)\n006 1 97da | 1 97da (0)\n007 1 9464 | 1 9464 (0)\n============ DEPTH: 8 ==========================================\n008 2 955d 9518 | 2 9518 (0) 955d (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"95c0a351fb7aa6683280d159a7b808bfa63f63bff91a1c5936e973b2e5d3954f","private_key":"7c5cc685e77cf467257beb319c99f13ca9f2ba8294453271e7b01ae359184ca1","name":"node_95c0a351fb7aa6683280d159a7b808bfa63f63bff91a1c5936e973b2e5d3954f","services":["bzz","pss"],"enable_msg_events":true,"port":38003},"up":true}},{"node":{"info":{"id":"eebd48b367cbfe94a37c0deb274a697e628074f9560b909e66229c5c76ce68eb","name":"node_eebd48b367cbfe94a37c0deb274a697e628074f9560b909e66229c5c76ce68eb","enode":"enode://e9ac9501ff66e4b8ea683a68019f6bf5a21283fbafd33abad3cd4def147e9ec20faed07f28001ad9a4cb0945ef8aab11edf8900123aa675bb29d6cbfb61ded08@127.0.0.1:0","enr":"0xf88fb8401e043e047731f0dcc2fa094bec2d3f0bebfdde7d067a07090d6e6a7ead1363fb2e8a68ddef0fdb8ed02a84edde2858d72a925a8c5e3f18ee29305be781dde3720183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102e9ac9501ff66e4b8ea683a68019f6bf5a21283fbafd33abad3cd4def147e9ec2","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"7r1Is2fL/pSjfA3rJ0ppfmKAdPlWC5CeZiKcXHbOaOs=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: eebd48\npopulation: 34 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 8 6758 6b4e 6e7f 447c | 126 70f6 (0) 7049 (0) 7660 (0) 741a (0)\n001 6 ab3f a2a1 b78f bfc7 | 75 acee (0) af02 (0) aeb4 (0) a970 (0)\n002 6 c6a8 cd6c c961 d302 | 27 d700 (0) d408 (0) d209 (0) d3e9 (0)\n003 5 f645 fc51 fa24 f9de | 14 f1ed (0) f305 (0) f215 (0) f2b4 (0)\n004 3 e09f e277 e64d | 7 e0a0 (0) e09f (0) e2d3 (0) e277 (0)\n005 2 eb68 e867 | 2 eb68 (0) e867 (0)\n006 2 ec90 ed42 | 2 ec90 (0) ed42 (0)\n============ DEPTH: 7 ==========================================\n007 2 ef99 eff2 | 2 ef99 (0) eff2 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"eebd48b367cbfe94a37c0deb274a697e628074f9560b909e66229c5c76ce68eb","private_key":"4f0005282a0cc3f4b0bbfbd57d4c18e1df8aee920756f2a469757e0670fb809e","name":"node_eebd48b367cbfe94a37c0deb274a697e628074f9560b909e66229c5c76ce68eb","services":["bzz","pss"],"enable_msg_events":true,"port":34859},"up":true}},{"node":{"info":{"id":"019109311d4888497aa194cce4a89b5ef243421cf0e7e7bb9115d086e1a1f7d7","name":"node_019109311d4888497aa194cce4a89b5ef243421cf0e7e7bb9115d086e1a1f7d7","enode":"enode://ac2123ba0df13d4d5dedbf061b751663af9ae100483d32007792511aba8ecca19b25c53b126dc1b230691c0f0e34057f622e2e4a1154f5eb34f872fc4651862d@127.0.0.1:0","enr":"0xf88fb840e6b23feb9b9d2bc1558c310f1a6d9fc8645da4e28517dbef118974963144e2cb477c6621f4cc9338fe7d53e749bd0bcf825ff2b6ae2ddb89ee2fd1963be821f60183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103ac2123ba0df13d4d5dedbf061b751663af9ae100483d32007792511aba8ecca1","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"AZEJMR1IiEl6oZTM5KibXvJDQhzw5+e7kRXQhuGh99c=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 019109\npopulation: 26 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 be68 eebd | 130 aeb4 (0) af02 (0) acee (0) a970 (0)\n001 2 6e7f 447c | 61 7049 (0) 70f6 (0) 7660 (0) 741a (0)\n002 5 31e6 31e1 3051 397a | 28 26ab (0) 26ac (0) 244c (0) 24f8 (0)\n003 4 1686 1bd5 18e0 194e | 16 138d (0) 1070 (0) 1049 (0) 1784 (0)\n004 4 0cfc 0e2b 09b3 096a | 11 0e80 (0) 0e3b (0) 0e2b (0) 0d1c (0)\n005 4 07f5 046c 0594 0561 | 4 046c (0) 0594 (0) 0561 (0) 07f5 (0)\n006 3 0314 035f 025d | 3 025d (0) 035f (0) 0314 (0)\n============ DEPTH: 7 ==========================================\n007 0 | 0\n008 2 012b 0111 | 2 012b (0) 0111 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"019109311d4888497aa194cce4a89b5ef243421cf0e7e7bb9115d086e1a1f7d7","private_key":"8e22619e3e2e8484ded659b762691a898a0e95db9ecb04fac8c645f9cbaa1ff1","name":"node_019109311d4888497aa194cce4a89b5ef243421cf0e7e7bb9115d086e1a1f7d7","services":["bzz","pss"],"enable_msg_events":true,"port":35711},"up":true}},{"node":{"info":{"id":"447cdbf1ff462aa67d6a46085b1a84fdc495a4142ab174c8e69b271b09732b4d","name":"node_447cdbf1ff462aa67d6a46085b1a84fdc495a4142ab174c8e69b271b09732b4d","enode":"enode://256210b1641ad84c86fe1328a20490519df62a633e20426cb397dd62fc45b75971a55b94bb3a9b406e3fa0d56199c6290e89ec39b02021a462dd9ae8c1a74dc4@127.0.0.1:0","enr":"0xf88fb8408521fdc8311021e64bb28400fcfe6d060a33e4e5328f8cd52c882406b2502f1e5a48985f07c853ccba2176cf80d29128a0e61566df6c6b199c27ecf33e00a7fb0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102256210b1641ad84c86fe1328a20490519df62a633e20426cb397dd62fc45b759","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"RHzb8f9GKqZ9akYIWxqE/cSVpBQqsXTI5psnGwlzK00=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 447cdb\npopulation: 32 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 cd6c ed42 eebd 834f | 130 f1ed (0) f305 (0) f215 (0) f2b4 (0)\n001 8 3051 3f31 140d 1bd5 | 65 244c (0) 24f8 (0) 26ab (0) 26ac (0)\n002 4 7933 7e47 6b4e 6e7f | 26 70f6 (0) 7049 (0) 7660 (0) 741a (0)\n003 2 5d82 5a8b | 16 5663 (0) 56ca (0) 5538 (0) 52a8 (0)\n004 5 482e 48de 4d91 4d38 | 10 4b79 (0) 4a95 (0) 482e (0) 48b8 (0)\n005 5 4005 402c 43d4 43c9 | 5 4005 (0) 402c (0) 43d4 (0) 43c9 (0)\n006 1 46bf | 1 46bf (0)\n============ DEPTH: 7 ==========================================\n007 0 | 0\n008 1 44ad | 1 44ad (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 1 447a | 1 447a (0)\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"447cdbf1ff462aa67d6a46085b1a84fdc495a4142ab174c8e69b271b09732b4d","private_key":"dfef090814210606651dad73b8ee233161b8f9bf9999725730de043d0e9af4e0","name":"node_447cdbf1ff462aa67d6a46085b1a84fdc495a4142ab174c8e69b271b09732b4d","services":["bzz","pss"],"enable_msg_events":true,"port":41827},"up":true}},{"node":{"info":{"id":"be68267d77fb52424227267c665ca1193a010334cac057338aca77b49a4b94da","name":"node_be68267d77fb52424227267c665ca1193a010334cac057338aca77b49a4b94da","enode":"enode://974cfe63e11619004662fdf8336b028fbb9f22c98b67ae3e424f35d394030fb8a8ca8ce9412e1a4f349d6df174d3259431ca8a57ae3adf9f664b3a9c5ba9fd24@127.0.0.1:0","enr":"0xf88fb84098bddc1516cbbff113698681b95c27e15ee3b08e6510e799c6802496acf33e326ce1d60e740e9e37500a1b54d2ca357084a0648c7caa43f2a6584cd311682f6b0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102974cfe63e11619004662fdf8336b028fbb9f22c98b67ae3e424f35d394030fb8","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"vmgmfXf7UkJCJyZ8ZlyhGToBAzTKwFczisp3tJpLlNo=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: be6826\npopulation: 43 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 7 397a 194e 0191 6b4e | 126 244c (0) 24f8 (0) 26ac (0) 26ab (0)\n001 7 c8c8 cd6c e64d ed42 | 55 f756 (0) f6c0 (0) f645 (0) f1ed (0)\n002 7 8cc3 8854 84a9 837f | 38 8d19 (0) 8cc3 (0) 8f9a (0) 8ea2 (0)\n003 13 a8ff ab3f af02 aeb4 | 23 aeb4 (0) af02 (0) acee (0) a970 (0)\n004 3 b3f9 b5ea b78f | 6 b3f9 (0) b4a1 (0) b5ea (0) b659 (0)\n005 2 b8e1 bbaf | 3 b8e1 (0) ba91 (0) bbaf (0)\n006 2 bcf8 bdc5 | 2 bcf8 (0) bdc5 (0)\n============ DEPTH: 7 ==========================================\n007 1 bfc7 | 1 bfc7 (0)\n008 1 bea1 | 1 bea1 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"be68267d77fb52424227267c665ca1193a010334cac057338aca77b49a4b94da","private_key":"6641d12829826045dddcad116be9a840aa14ba3542597d5cc4e71324fa29af40","name":"node_be68267d77fb52424227267c665ca1193a010334cac057338aca77b49a4b94da","services":["bzz","pss"],"enable_msg_events":true,"port":37231},"up":true}},{"node":{"info":{"id":"6e7f1f3d65364399617a4d95fdd04f2ca9b007b2366943e7ba5acd4616a7a425","name":"node_6e7f1f3d65364399617a4d95fdd04f2ca9b007b2366943e7ba5acd4616a7a425","enode":"enode://3821a5bff1a93183090d662d2451159ebe363ee2df3b361159cded82888ed46322fc6470eb09bfb736355e121b06092eb64120fb8e0448778b948559baa814d9@127.0.0.1:0","enr":"0xf88fb84051b3adb1ee656aaaad0cb4b241aa3c32ffceea4999429eddee1573f06d9477793034a1aa1b8f586fac2c2aba3e5f8ca79f6e01885eee40e0c70983c7ffe8ee950183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1033821a5bff1a93183090d662d2451159ebe363ee2df3b361159cded82888ed463","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"bn8fPWU2Q5lhek2V/dBPLKmwB7I2aUPnulrNRhanpCU=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 6e7f1f\npopulation: 32 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 c961 cd6c eebd 95c0 | 130 f756 (0) f6c0 (0) f645 (0) f305 (0)\n001 7 07f5 0191 0cfc 096a | 65 138d (0) 1070 (0) 1049 (0) 1784 (0)\n002 3 5a8b 4d38 447c | 35 5144 (0) 50c1 (0) 52a8 (0) 5538 (0)\n003 5 7e47 7c46 7d16 7933 | 13 70f6 (0) 7049 (0) 741a (0) 7660 (0)\n004 5 60c5 648a 6795 67f3 | 6 60c5 (0) 648a (0) 6790 (0) 6795 (0)\n005 2 6b4e 68cb | 2 68cb (0) 6b4e (0)\n============ DEPTH: 6 ==========================================\n006 4 6c01 6dd3 6d3c 6d5e | 4 6c01 (0) 6dd3 (0) 6d3c (0) 6d5e (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"6e7f1f3d65364399617a4d95fdd04f2ca9b007b2366943e7ba5acd4616a7a425","private_key":"41525658ab059b89329f02a6c477cd77bc69b94ceae45e0e31f70bb6b70ee671","name":"node_6e7f1f3d65364399617a4d95fdd04f2ca9b007b2366943e7ba5acd4616a7a425","services":["bzz","pss"],"enable_msg_events":true,"port":38077},"up":true}},{"node":{"info":{"id":"bfc711793830779f49aa59bc6f7a205ab4e6eae7abfdafbf3bb5a1163a778ab2","name":"node_bfc711793830779f49aa59bc6f7a205ab4e6eae7abfdafbf3bb5a1163a778ab2","enode":"enode://d0595ae566e2dec77e37a408dcf8d7c3157cc52378c66fada8c78b588aa926d2f7350c17cd3f8586f36de2c55a9020e923262ad54d5b7530f063570cc46f3f6b@127.0.0.1:0","enr":"0xf88fb840c153e9a46508c43ea149e6f6f11d3d2077afd262f7b2bb8df75d999927705ad20554753898c4f1f275f901157620f8b3c2e4f9ea4ff600ac2e0fbba78fb70f270183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103d0595ae566e2dec77e37a408dcf8d7c3157cc52378c66fada8c78b588aa926d2","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"v8cReTgwd59Jqlm8b3ogWrTm6uer/a+/O7WhFjp3irI=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: bfc711\npopulation: 41 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 3f31 6e7f | 126 138d (0) 1070 (0) 1049 (0) 1784 (0)\n001 7 ed42 eebd d302 dad0 | 55 f6c0 (0) f645 (0) f756 (0) f1ed (0)\n002 6 834f 84a9 95c0 97da | 38 9b8e (0) 9948 (0) 9959 (0) 9c21 (0)\n003 15 ab3f a970 a8ff acee | 23 acee (0) aeb4 (0) af02 (0) a970 (0)\n004 4 b3f9 b5ea b6df b78f | 6 b3f9 (0) b4a1 (0) b5ea (0) b659 (0)\n005 3 ba91 bbaf b8e1 | 3 bbaf (0) ba91 (0) b8e1 (0)\n006 2 bcf8 bdc5 | 2 bcf8 (0) bdc5 (0)\n============ DEPTH: 7 ==========================================\n007 2 be68 bea1 | 2 bea1 (0) be68 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"bfc711793830779f49aa59bc6f7a205ab4e6eae7abfdafbf3bb5a1163a778ab2","private_key":"98697e601711a0c2bc93c85db0434deba8428ccf604641af230ef188b176ceff","name":"node_bfc711793830779f49aa59bc6f7a205ab4e6eae7abfdafbf3bb5a1163a778ab2","services":["bzz","pss"],"enable_msg_events":true,"port":46271},"up":true}},{"node":{"info":{"id":"3f31ecaffaa6311c82c9a575bbc38d6bcb16630ac87e19d1853a64aa96c9dcde","name":"node_3f31ecaffaa6311c82c9a575bbc38d6bcb16630ac87e19d1853a64aa96c9dcde","enode":"enode://cd82e53229cae0db1a40d6d3974aceff2b8223d817606879d4d4c82e93d851a5a41a488c441ff25a85dda297bf76cf3ffc924029112a5afc15ff35a1f49aaa6a@127.0.0.1:0","enr":"0xf88fb840a9166c078904cd0604d4a4a19f9884af9ba6a3c08f1da14902b3be746025dca87ef2d6ecc67dcbd2808df07f6a1a911e3f71936e779fba08bc74db71740c34290183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102cd82e53229cae0db1a40d6d3974aceff2b8223d817606879d4d4c82e93d851a5","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"PzHsr/qmMRyCyaV1u8ONa8sWYwrIfhnRhTpkqpbJ3N4=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 3f31ec\npopulation: 21 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 834f bfc7 | 130 f1ed (0) f305 (0) f215 (0) f2b4 (0)\n001 2 447c 6e7f | 61 5538 (0) 5663 (0) 56ca (0) 50c1 (0)\n002 4 096a 0561 07f5 0191 | 37 138d (0) 1070 (0) 1049 (0) 1784 (0)\n003 2 2a50 298a | 11 244c (0) 24f8 (0) 26ab (0) 26ac (0)\n004 5 36b9 3188 31e6 31e1 | 9 3411 (0) 36b9 (0) 3728 (0) 32ff (0)\n005 4 3b02 3a62 397a 3980 | 5 3b02 (0) 3a62 (0) 3980 (0) 3938 (0)\n============ DEPTH: 6 ==========================================\n006 2 3c5b 3cab | 2 3c5b (0) 3cab (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"3f31ecaffaa6311c82c9a575bbc38d6bcb16630ac87e19d1853a64aa96c9dcde","private_key":"3ed9ff27809a5c5e4f61f5343410a2a1291496221e7861971e6d48611b1a9abd","name":"node_3f31ecaffaa6311c82c9a575bbc38d6bcb16630ac87e19d1853a64aa96c9dcde","services":["bzz","pss"],"enable_msg_events":true,"port":42049},"up":true}},{"node":{"info":{"id":"834f14e9f325482adef62651ddf3685690dd5ebdd18014f2bd266b2143c290ff","name":"node_834f14e9f325482adef62651ddf3685690dd5ebdd18014f2bd266b2143c290ff","enode":"enode://69f51e1ebbbb38b8b161722c403f583d6141cff104f2da6dc21f21f0c50e4d41d031f8a4d0523d545691ebe7ba00050d25ac6ef88255fbc453fea197db95fffd@127.0.0.1:0","enr":"0xf88fb84074d162cf5aadfde184fd1c7884869ea76837d6e33b21bfd74ff53d66b50c055c3479080476f1e97ea070cf9ed88ef3445665a36e93f803078d5e4cdd738a77a50183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10369f51e1ebbbb38b8b161722c403f583d6141cff104f2da6dc21f21f0c50e4d41","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"g08U6fMlSCre9iZR3fNoVpDdXr3RgBTyvSZrIUPCkP8=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 834f14\npopulation: 33 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 447c 096a 3f31 | 126 50c1 (0) 5144 (0) 52a8 (0) 5538 (0)\n001 4 cd6c c961 dad0 dbd4 | 55 f756 (0) f6c0 (0) f645 (0) f1ed (0)\n002 6 a8ff a606 a505 b78f | 37 b3f9 (0) b4a1 (0) b5ea (0) b659 (0)\n003 4 9f0e 93ea 97da 95c0 | 17 9b8e (0) 9948 (0) 9959 (0) 9c21 (0)\n004 6 8cc3 8f9a 8e28 8e7b | 9 8d19 (0) 8cc3 (0) 8f9a (0) 8ea2 (0)\n005 3 86d6 8402 84a9 | 4 86d6 (0) 87a3 (0) 8402 (0) 84a9 (0)\n006 5 81a5 8006 8073 8074 | 5 81a5 (0) 8006 (0) 8073 (0) 8074 (0)\n============ DEPTH: 7 ==========================================\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 1 837f | 1 837f (0)\n011 1 8358 | 1 8358 (0)\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"834f14e9f325482adef62651ddf3685690dd5ebdd18014f2bd266b2143c290ff","private_key":"1496abca4c41e1d57c812b53636296bdad2570659143afc188383905ad3a1d30","name":"node_834f14e9f325482adef62651ddf3685690dd5ebdd18014f2bd266b2143c290ff","services":["bzz","pss"],"enable_msg_events":true,"port":44165},"up":true}},{"node":{"info":{"id":"096a8302b6f369c28ed9d47719a507ead8a3cc1ca4fa1e32318b7f97873955fe","name":"node_096a8302b6f369c28ed9d47719a507ead8a3cc1ca4fa1e32318b7f97873955fe","enode":"enode://ff8aff353bd9756ed7a631808ca59009f89f5db4ddc3938b05ea2cf4fef6855ace3f6873b2ee1a35b6bb524b9f310b19db97e635add9ed1075e9907da1b56157@127.0.0.1:0","enr":"0xf88fb84062ef2386cda8f32e286d22df7b0ee0daf321024107b0a4794abfe7b079de98083d2b860770dea2044c50072ee556e6d3ec1d217915acaa11a2dd6b1b31b1ad0b0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103ff8aff353bd9756ed7a631808ca59009f89f5db4ddc3938b05ea2cf4fef6855a","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"CWqDArbzacKO2dR3GaUH6tijzByk+h4yMYt/l4c5Vf4=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 096a83\npopulation: 26 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 a505 834f | 130 f6c0 (0) f645 (0) f756 (0) f1ed (0)\n001 2 447c 6e7f | 61 5144 (0) 50c1 (0) 52a8 (0) 5538 (0)\n002 4 3f31 31e1 3188 3051 | 28 26ac (0) 26ab (0) 244c (0) 24f8 (0)\n003 5 1686 140d 1bd5 18e0 | 16 138d (0) 1070 (0) 1049 (0) 1784 (0)\n004 4 0191 0594 0561 07f5 | 10 025d (0) 035f (0) 0314 (0) 012b (0)\n005 4 0e80 0e3b 0e2b 0cfc | 5 0e80 (0) 0e3b (0) 0e2b (0) 0d1c (0)\n============ DEPTH: 6 ==========================================\n006 0 | 0\n007 3 08bd 08f8 08e5 | 3 08bd (0) 08f8 (0) 08e5 (0)\n008 1 09b3 | 1 09b3 (0)\n009 0 | 0\n010 1 0942 | 1 0942 (0)\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"096a8302b6f369c28ed9d47719a507ead8a3cc1ca4fa1e32318b7f97873955fe","private_key":"396f35fa7f69257841f0b832cf5f655557fa1b060dbb859461a22429101230cb","name":"node_096a8302b6f369c28ed9d47719a507ead8a3cc1ca4fa1e32318b7f97873955fe","services":["bzz","pss"],"enable_msg_events":true,"port":43747},"up":true}},{"node":{"info":{"id":"a5053958f0cefcff1826bf02525fda98c4dc954cc38690f3c43ecbf0b2ad57af","name":"node_a5053958f0cefcff1826bf02525fda98c4dc954cc38690f3c43ecbf0b2ad57af","enode":"enode://462c3ca5391ed837a169228797bea3d3f4585a7fb5cb938de1fc15649174b0156940060d152a8486deb4ccfe2c3ca460b5d9a184399db2f4a8b95ec015e86896@127.0.0.1:0","enr":"0xf88fb840dd4c1cd722f83d847e339b92de95082d1413d3b86944796fee5054d09a8390b052018a03749011927e56a0650aa9db5ade2a936687147004585d02d32fe1861b0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102462c3ca5391ed837a169228797bea3d3f4585a7fb5cb938de1fc15649174b015","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"pQU5WPDO/P8YJr8CUl/amMTclUzDhpDzxD7L8LKtV68=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: a50539\npopulation: 35 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 6758 6b4e 3051 09b3 | 126 5144 (0) 50c1 (0) 52a8 (0) 5538 (0)\n001 4 dad0 dbd4 c961 cd6c | 55 f756 (0) f6c0 (0) f645 (0) f1ed (0)\n002 7 8854 837f 834f 9f0e | 38 9b8e (0) 9948 (0) 9959 (0) 9c21 (0)\n003 5 b3f9 b78f b8e1 bfc7 | 14 b3f9 (0) b4a1 (0) b5ea (0) b659 (0)\n004 3 aeb4 a8ff ab3f | 10 acee (0) aeb4 (0) af02 (0) a970 (0)\n005 5 a0c8 a330 a327 a2e6 | 6 a1c8 (0) a0c8 (0) a330 (0) a327 (0)\n006 4 a742 a7a8 a616 a606 | 4 a7a8 (0) a742 (0) a616 (0) a606 (0)\n============ DEPTH: 7 ==========================================\n007 1 a4ee | 1 a4ee (0)\n008 1 a5ac | 1 a5ac (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"a5053958f0cefcff1826bf02525fda98c4dc954cc38690f3c43ecbf0b2ad57af","private_key":"550f3f019bfee28d84cbafd18523a10069faabebcbe9823512a4f0af5343b627","name":"node_a5053958f0cefcff1826bf02525fda98c4dc954cc38690f3c43ecbf0b2ad57af","services":["bzz","pss"],"enable_msg_events":true,"port":36993},"up":true}},{"node":{"info":{"id":"305162c472c71ddef2320b138102b67d1ce2b8bba79e2e587fc80e085c88e547","name":"node_305162c472c71ddef2320b138102b67d1ce2b8bba79e2e587fc80e085c88e547","enode":"enode://c5f49027f8ad45e617b539a3242f31739ac950203b54ecf8dbe5b2160b85ee594bc40553728846692df15f6859547b5360e6cbf64dd1486b9d5272c378b958ac@127.0.0.1:0","enr":"0xf88fb840ad06f6a9761fd36b8a36707e80761bda29124da842be6b3eef6cb49227944a6709187c9a4d490219f8244eaaec1538b10720b042ad258a64bf7a09438d4673470183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102c5f49027f8ad45e617b539a3242f31739ac950203b54ecf8dbe5b2160b85ee59","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"MFFixHLHHd7yMgsTgQK2fRziuLunni5Yf8gOCFyI5Uc=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 305162\npopulation: 30 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 dbd4 a505 | 130 f645 (0) f6c0 (0) f756 (0) f1ed (0)\n001 5 5a8b 4d91 4d38 447c | 61 5538 (0) 5663 (0) 56ca (0) 50c1 (0)\n002 5 18e0 0191 07f5 0561 | 37 138d (0) 1070 (0) 1049 (0) 1784 (0)\n003 3 26ab 298a 2a50 | 11 24f8 (0) 244c (0) 26ac (0) 26ab (0)\n004 8 3cab 3c5b 3f31 3a62 | 8 3b02 (0) 3a62 (0) 3980 (0) 3938 (0)\n005 2 36b9 3728 | 3 3411 (0) 36b9 (0) 3728 (0)\n006 1 32ff | 1 32ff (0)\n============ DEPTH: 7 ==========================================\n007 3 3188 31e6 31e1 | 3 31e1 (0) 31e6 (0) 3188 (0)\n008 1 30fe | 1 30fe (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"305162c472c71ddef2320b138102b67d1ce2b8bba79e2e587fc80e085c88e547","private_key":"3ccc59b4b2ef2146a73d043f665a3dec37990b81cf7e81c670ef586260aa4f45","name":"node_305162c472c71ddef2320b138102b67d1ce2b8bba79e2e587fc80e085c88e547","services":["bzz","pss"],"enable_msg_events":true,"port":41853},"up":true}},{"node":{"info":{"id":"dbd4d90e3342ef837b8ecf5c6e490f7c409f419cf36b77162a87cb2cfb8ae33c","name":"node_dbd4d90e3342ef837b8ecf5c6e490f7c409f419cf36b77162a87cb2cfb8ae33c","enode":"enode://12b59aaec065fee81276d23336c7a839dfd34fa213d06a31fa3447894ed5afdefca89b783977333245f76c2e35b74504e51928af9586e4f288a870a6c0db0c2a@127.0.0.1:0","enr":"0xf88fb840c57b5dd80289305003c7726a173a5f1e93a911e51aa052b1ab38f38e9a102c1074a105d65dc177fdff430aeb2e9d2de42f87d2b32d7cc7fbd6b57647999ab64c0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10212b59aaec065fee81276d23336c7a839dfd34fa213d06a31fa3447894ed5afde","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"29TZDjNC74N7js9cbkkPfECfQZzza3cWKofLLPuK4zw=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: dbd4d9\npopulation: 30 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 3188 3051 | 126 52a8 (0) 5144 (0) 50c1 (0) 5538 (0)\n001 7 93ea 9f0e 8854 834f | 75 9b8e (0) 9948 (0) 9959 (0) 9c21 (0)\n002 5 f645 fc51 f9de ed42 | 28 f756 (0) f645 (0) f6c0 (0) f1ed (0)\n003 8 c42e c6a8 c74d c961 | 16 c190 (0) c272 (0) c2d0 (0) c534 (0)\n004 3 d408 d209 d302 | 5 d209 (0) d3e9 (0) d302 (0) d700 (0)\n005 1 ddb8 | 1 ddb8 (0)\n006 2 d959 d9cf | 2 d959 (0) d9cf (0)\n============ DEPTH: 7 ==========================================\n007 2 da36 dad0 | 2 da36 (0) dad0 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"dbd4d90e3342ef837b8ecf5c6e490f7c409f419cf36b77162a87cb2cfb8ae33c","private_key":"c2103de042f815312e3c17f6a1334bcbdbc1e4f58d39e436d463cf08b61b060d","name":"node_dbd4d90e3342ef837b8ecf5c6e490f7c409f419cf36b77162a87cb2cfb8ae33c","services":["bzz","pss"],"enable_msg_events":true,"port":45509},"up":true}},{"node":{"info":{"id":"cd6c8b42a0b092f41e6925577c9de7d1bea17231bcb3d08f3d3cce9c6fdcf22d","name":"node_cd6c8b42a0b092f41e6925577c9de7d1bea17231bcb3d08f3d3cce9c6fdcf22d","enode":"enode://3f46a3f4016f9803ad015ff459b7b2d3ae3dc814ca3dce437d56046302b1bf2c143203755461e513a4ae4ed11d6548aeca82b83a3026662f06c7ebddeef20c7c@127.0.0.1:0","enr":"0xf88fb840aa6d2306927e37eb5add2079388ffeb2ad0bf5d36ad922dc7dfbbcae12b8511120a7ceaeb6685848468c6434e7add539507eb0305283e9881b35eb5b50cc699d0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1023f46a3f4016f9803ad015ff459b7b2d3ae3dc814ca3dce437d56046302b1bf2c","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"zWyLQqCwkvQeaSVXfJ3n0b6hcjG8s9CPPTzOnG/c8i0=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: cd6c8b\npopulation: 40 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 7933 6e7f 447c 5a8b | 126 70f6 (0) 7049 (0) 741a (0) 7660 (0)\n001 11 834f 95c0 93ea 9f0e | 75 9b8e (0) 9948 (0) 9959 (0) 9c21 (0)\n002 8 f2b4 f645 fc51 fa24 | 28 f756 (0) f6c0 (0) f645 (0) f1ed (0)\n003 5 d302 d408 ddb8 d9cf | 11 d209 (0) d3e9 (0) d302 (0) d700 (0)\n004 3 c6a8 c603 c74d | 8 c272 (0) c2d0 (0) c190 (0) c42e (0)\n005 4 c961 c9c3 c8ea c8c8 | 4 c8ea (0) c8c8 (0) c9c3 (0) c961 (0)\n006 1 cf52 | 1 cf52 (0)\n============ DEPTH: 7 ==========================================\n007 1 cc33 | 1 cc33 (0)\n008 1 cdb1 | 1 cdb1 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"cd6c8b42a0b092f41e6925577c9de7d1bea17231bcb3d08f3d3cce9c6fdcf22d","private_key":"cd14c3cb4c268526af99a387d2e105f126f0d3e4368b46397cc117868140fbaa","name":"node_cd6c8b42a0b092f41e6925577c9de7d1bea17231bcb3d08f3d3cce9c6fdcf22d","services":["bzz","pss"],"enable_msg_events":true,"port":45357},"up":true}},{"node":{"info":{"id":"07f5d094a4b22e73cdd6c85452b3d928da9b4b16873824759cb7e8a622417fd5","name":"node_07f5d094a4b22e73cdd6c85452b3d928da9b4b16873824759cb7e8a622417fd5","enode":"enode://0214bfe7469b5ed146f1f11d937181680a8dea456f3586d08810ca756337e9fed3e46fe35c99af4496d072125f6b898ab97f5332e16399f3107d15912756daf6@127.0.0.1:0","enr":"0xf88fb840af0cb239eef4aef9f88cfc4a0241d95cb9ef1cbb14c5889164e2d27c2c09a433595a3366678b3e8e1f1933c2ea8bbbe26d0b5dc604e984a43e20e68e4dbd42300183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1020214bfe7469b5ed146f1f11d937181680a8dea456f3586d08810ca756337e9fe","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"B/XQlKSyLnPN1shUUrPZKNqbSxaHOCR1nLfopiJBf9U=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 07f5d0\npopulation: 32 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 c961 cd6c | 130 8d19 (0) 8cc3 (0) 8f9a (0) 8ea2 (0)\n001 4 6e7f 7c46 7933 4d38 | 61 60c5 (0) 648a (0) 6790 (0) 6795 (0)\n002 6 2c80 2ddf 298a 2a50 | 28 26ab (0) 26ac (0) 244c (0) 24f8 (0)\n003 6 1049 1686 140d 1bd5 | 16 138d (0) 1070 (0) 1049 (0) 1784 (0)\n004 5 0cfc 0e80 0e2b 09b3 | 11 0e80 (0) 0e3b (0) 0e2b (0) 0d1c (0)\n005 6 035f 0314 025d 0191 | 6 025d (0) 035f (0) 0314 (0) 012b (0)\n============ DEPTH: 6 ==========================================\n006 3 046c 0594 0561 | 3 046c (0) 0594 (0) 0561 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"07f5d094a4b22e73cdd6c85452b3d928da9b4b16873824759cb7e8a622417fd5","private_key":"251c21ef6c12491657b20ba5898f537b45474fd62ce9f870aa98b7a2ce906096","name":"node_07f5d094a4b22e73cdd6c85452b3d928da9b4b16873824759cb7e8a622417fd5","services":["bzz","pss"],"enable_msg_events":true,"port":45285},"up":true}},{"node":{"info":{"id":"c96146ee47ec7cd74551cf74f00213bc337d643c4327393f0e6848ecd4a0f8d3","name":"node_c96146ee47ec7cd74551cf74f00213bc337d643c4327393f0e6848ecd4a0f8d3","enode":"enode://a32b355f09cbc5a2ccbffb7eea267721cdc1108cab1c29d2dd1e2e7fa7c5c20e04c6a024fa47373e830891a62576084c8bbae862c4044ad94a2c612189282db8@127.0.0.1:0","enr":"0xf88fb8408a9d74f8b002fe6e7cff4d593bbf3bae2a56a10b0f5d1a6187fe6c3387aaa0cf399c033c3390082c7a87ecb9c2e865ca708f2279eb75d132524d4bcb29cba63d0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102a32b355f09cbc5a2ccbffb7eea267721cdc1108cab1c29d2dd1e2e7fa7c5c20e","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"yWFG7kfsfNdFUc908AITvDN9ZDxDJzk/DmhI7NSg+NM=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: c96146\npopulation: 35 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 6e7f 7c46 7933 3188 | 126 60c5 (0) 648a (0) 6790 (0) 6795 (0)\n001 9 b78f bfc7 a606 a5ac | 75 8d19 (0) 8cc3 (0) 8ea2 (0) 8e7b (0)\n002 5 f645 fc51 f9de ed42 | 28 f1ed (0) f305 (0) f215 (0) f2b4 (0)\n003 6 d302 d408 ddb8 d9cf | 11 d209 (0) d3e9 (0) d302 (0) d700 (0)\n004 2 c603 c6a8 | 8 c272 (0) c2d0 (0) c190 (0) c42e (0)\n005 4 cf52 cd6c cdb1 cc33 | 4 cf52 (0) cc33 (0) cdb1 (0) cd6c (0)\n============ DEPTH: 6 ==========================================\n006 0 | 0\n007 2 c8ea c8c8 | 2 c8ea (0) c8c8 (0)\n008 1 c9c3 | 1 c9c3 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"c96146ee47ec7cd74551cf74f00213bc337d643c4327393f0e6848ecd4a0f8d3","private_key":"11fc592c06dfe93bde5f4e4d007d2c7020e49d7e5ef8de72fb7ad0c39d96d2c2","name":"node_c96146ee47ec7cd74551cf74f00213bc337d643c4327393f0e6848ecd4a0f8d3","services":["bzz","pss"],"enable_msg_events":true,"port":43471},"up":true}},{"node":{"info":{"id":"dad08999cd2edc33cfdc59ea34c8adcd6a34eaa15f2e85b0622e9848b215c1d5","name":"node_dad08999cd2edc33cfdc59ea34c8adcd6a34eaa15f2e85b0622e9848b215c1d5","enode":"enode://3a93f5d6282a4f76c82c17c35a6f8eac3a2b9b63ae0e3a532ab625fd4df7fa7f4357b01c8f6071b405a85b97e6832ba2b0d8eefc3afec46b0221bd15c2f4d5e6@127.0.0.1:0","enr":"0xf88fb840f5b726c896fc45a7d66c14a7ff0b8cffe4f443829996bcf4bf69388e9b4fb1445eddef566d406b613be72fb97eb94988db3f65a8eb1d51134b93c241fde80a460183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1023a93f5d6282a4f76c82c17c35a6f8eac3a2b9b63ae0e3a532ab625fd4df7fa7f","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"2tCJmc0u3DPP3FnqNMitzWo06qFfLoWwYi6YSLIVwdU=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: dad089\npopulation: 29 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 7c46 7933 3188 1bd5 | 126 648a (0) 6790 (0) 6795 (0) 67f3 (0)\n001 6 a505 bfc7 834f 93ea | 75 8d19 (0) 8cc3 (0) 8f9a (0) 8ea2 (0)\n002 4 f645 f9de ed42 eebd | 28 f1ed (0) f305 (0) f215 (0) f2b4 (0)\n003 5 c190 c74d c8c8 c9c3 | 16 c2d0 (0) c272 (0) c190 (0) c534 (0)\n004 4 d209 d302 d700 d408 | 5 d209 (0) d3e9 (0) d302 (0) d700 (0)\n005 1 ddb8 | 1 ddb8 (0)\n006 2 d9cf d959 | 2 d959 (0) d9cf (0)\n============ DEPTH: 7 ==========================================\n007 1 dbd4 | 1 dbd4 (0)\n008 1 da36 | 1 da36 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"dad08999cd2edc33cfdc59ea34c8adcd6a34eaa15f2e85b0622e9848b215c1d5","private_key":"ac54b72de76bbeab526b566706c5324bfab619ac9019078319474c8396bb36f3","name":"node_dad08999cd2edc33cfdc59ea34c8adcd6a34eaa15f2e85b0622e9848b215c1d5","services":["bzz","pss"],"enable_msg_events":true,"port":40305},"up":true}},{"node":{"info":{"id":"056152dd9dae85c426378d34acab8d6641da665d2f57359a27a0ff652f3f3d02","name":"node_056152dd9dae85c426378d34acab8d6641da665d2f57359a27a0ff652f3f3d02","enode":"enode://265ba137f94c59432e330185dfe26176b2833143e001d135ff9bdc74eb6a7dbf46a40c5f27a01cb176086b2a4bcd8b4df935a0e35fc331e5da556d2471d19b46@127.0.0.1:0","enr":"0xf88fb840e995a0df1f38fad4ffb6332b3ccf46fa213f3d0c5b746ecd7ab35dc36e928f8f16ebf9bee964f47e3ceb70b47261c82843d796a2d28785cdd521f7e7add6fbf40183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102265ba137f94c59432e330185dfe26176b2833143e001d135ff9bdc74eb6a7dbf","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"BWFS3Z2uhcQmN400rKuNZkHaZl0vVzWaJ6D/ZS8/PQI=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 056152\npopulation: 25 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 a5ac dad0 | 130 8d19 (0) 8cc3 (0) 8f9a (0) 8ea2 (0)\n001 3 7933 5a8b 4d38 | 61 60c5 (0) 648a (0) 6790 (0) 6795 (0)\n002 3 3f31 3188 3051 | 28 244c (0) 24f8 (0) 26ab (0) 26ac (0)\n003 5 1049 1686 140d 194e | 16 138d (0) 1070 (0) 1049 (0) 1784 (0)\n004 4 0e2b 0cfc 09b3 096a | 11 0e80 (0) 0e3b (0) 0e2b (0) 0d1c (0)\n005 5 0314 025d 012b 0111 | 6 025d (0) 035f (0) 0314 (0) 012b (0)\n006 1 07f5 | 1 07f5 (0)\n============ DEPTH: 7 ==========================================\n007 1 046c | 1 046c (0)\n008 1 0594 | 1 0594 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"056152dd9dae85c426378d34acab8d6641da665d2f57359a27a0ff652f3f3d02","private_key":"faad557bcbab6d34e58f844b5a368fc2c5a4d088352c0bc0d2363aec33462b69","name":"node_056152dd9dae85c426378d34acab8d6641da665d2f57359a27a0ff652f3f3d02","services":["bzz","pss"],"enable_msg_events":true,"port":43665},"up":true}},{"node":{"info":{"id":"a5ac04d53b569e418ef5007961431155f2c226ee10157b30af71ea4836b08089","name":"node_a5ac04d53b569e418ef5007961431155f2c226ee10157b30af71ea4836b08089","enode":"enode://8cdb600efbfa331c7bcb78d899595726993e73d7aac802d61673d8b50f7766950f1907d11732fbac2e316d2d8f439f984f54164a7b2db098ae1b35540e8b2902@127.0.0.1:0","enr":"0xf88fb840d11b0126170eb4fee1197420356b363c9efc48d4f5f3ac3ec4139a53443f7d6c5d66e6edbc0a80d5d907f8aa5fba8247287ecc0d7a9e4910801655d67107a7fa0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1028cdb600efbfa331c7bcb78d899595726993e73d7aac802d61673d8b50f776695","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"pawE1TtWnkGO9QB5YUMRVfLCJu4QFXswr3HqSDawgIk=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: a5ac04\npopulation: 28 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 7933 4d38 1bd5 0561 | 126 648a (0) 6790 (0) 6795 (0) 67f3 (0)\n001 3 dbd4 c961 cd6c | 55 f756 (0) f6c0 (0) f645 (0) f1ed (0)\n002 4 8854 837f 9f0e 93ea | 38 8d19 (0) 8cc3 (0) 8f9a (0) 8ea2 (0)\n003 4 bfc7 be68 b3f9 b78f | 14 b3f9 (0) b4a1 (0) b5ea (0) b659 (0)\n004 2 af02 a8ff | 10 acee (0) aeb4 (0) af02 (0) a970 (0)\n005 5 a1c8 a330 a327 a2a1 | 6 a0c8 (0) a1c8 (0) a330 (0) a327 (0)\n006 4 a616 a606 a7a8 a742 | 4 a7a8 (0) a742 (0) a616 (0) a606 (0)\n============ DEPTH: 7 ==========================================\n007 1 a4ee | 1 a4ee (0)\n008 1 a505 | 1 a505 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"a5ac04d53b569e418ef5007961431155f2c226ee10157b30af71ea4836b08089","private_key":"0a918d168aacb95afe15f3eba1e762f144f5ffa60fa01155a81ec8cf4a5c5470","name":"node_a5ac04d53b569e418ef5007961431155f2c226ee10157b30af71ea4836b08089","services":["bzz","pss"],"enable_msg_events":true,"port":36481},"up":true}},{"node":{"info":{"id":"4d381014783980b2f77f0d71160ad9e9d84672b576f4435ccdbae12752350c1c","name":"node_4d381014783980b2f77f0d71160ad9e9d84672b576f4435ccdbae12752350c1c","enode":"enode://98863ce3c7e18d15ece80b94033ae1825556b0a21f84ec04077e72f48df419e525b341d7bef239e3565754f57b3e9cf42b828667a8e0bffc5e9ef9d596888353@127.0.0.1:0","enr":"0xf88fb840c0c7e8479b7d62eac2089ba0a3436acd47f05a6410097ae49bcf77ec309c122a4b04acaa26fddfb564888a144346c8277e2459076aa8758bc1b31d17fdaa6e7b0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10398863ce3c7e18d15ece80b94033ae1825556b0a21f84ec04077e72f48df419e5","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"TTgQFHg5gLL3fw1xFgrZ6dhGcrV29ENczbrhJ1I1DBw=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 4d3810\npopulation: 25 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 93ea a5ac | 130 f756 (0) f645 (0) f6c0 (0) f1ed (0)\n001 4 3051 3188 07f5 0561 | 65 244c (0) 24f8 (0) 26ab (0) 26ac (0)\n002 4 6e7f 7933 7850 7c46 | 26 648a (0) 6790 (0) 6795 (0) 67f3 (0)\n003 5 56ca 5d82 5ff0 5a8b | 16 50c1 (0) 5144 (0) 52a8 (0) 5538 (0)\n004 5 402c 43d4 43c9 435d | 9 4005 (0) 402c (0) 43d4 (0) 43c9 (0)\n005 3 482e 48b8 48de | 7 4b79 (0) 4a95 (0) 48b8 (0) 48f1 (0)\n============ DEPTH: 6 ==========================================\n006 0 | 0\n007 1 4cec | 1 4cec (0)\n008 1 4d91 | 1 4d91 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"4d381014783980b2f77f0d71160ad9e9d84672b576f4435ccdbae12752350c1c","private_key":"f83b2e95c445a50438af645a0f3dd41e2615d85bc9e28834a722b78081960743","name":"node_4d381014783980b2f77f0d71160ad9e9d84672b576f4435ccdbae12752350c1c","services":["bzz","pss"],"enable_msg_events":true,"port":34823},"up":true}},{"node":{"info":{"id":"93ea8ef251fd56b159e080cdf733d33e1fdfb3c7ae5bd9a6a328d0bf5458867b","name":"node_93ea8ef251fd56b159e080cdf733d33e1fdfb3c7ae5bd9a6a328d0bf5458867b","enode":"enode://fb8e6ad0083dd5c9588924daa51194dfc6a4e8e5efd75fb3bd2f76d99c15df4aa355b2419a416d0be44ddabd404b7d503461312253bc36f9c8cb6acf86206faf@127.0.0.1:0","enr":"0xf88fb840de494f8808c9d4cb3dbbe95d92b77102bde20de29cb253862072e62ac37179767dd2aa1e587a6ddff1e42149b96842de7054b91c30a773c04c140030f83054e70183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103fb8e6ad0083dd5c9588924daa51194dfc6a4e8e5efd75fb3bd2f76d99c15df4a","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"k+qO8lH9VrFZ4IDN9zPTPh/fs8euW9mmoyjQv1RYhns=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 93ea8e\npopulation: 32 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 7 1bd5 3188 7c46 7850 | 126 2fd2 (0) 2e65 (0) 2ddf (0) 2c85 (0)\n001 4 dad0 dbd4 cd6c c961 | 55 f756 (0) f6c0 (0) f645 (0) f1ed (0)\n002 6 bfc7 b78f a2a1 a606 | 37 b3f9 (0) b4a1 (0) b5ea (0) b659 (0)\n003 4 8854 8e28 834f 837f | 21 8d19 (0) 8cc3 (0) 8f9a (0) 8ea2 (0)\n004 5 9b8e 9948 9959 9ca1 | 9 9b8e (0) 9948 (0) 9959 (0) 9c21 (0)\n005 4 95c0 9518 955d 97da | 5 97da (0) 9464 (0) 9518 (0) 955d (0)\n============ DEPTH: 6 ==========================================\n006 0 | 0\n007 1 9257 | 1 9257 (0)\n008 0 | 0\n009 0 | 0\n010 1 93c0 | 1 93c0 (0)\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"93ea8ef251fd56b159e080cdf733d33e1fdfb3c7ae5bd9a6a328d0bf5458867b","private_key":"60b514798a6f6a2f5cf7e85f798280d359067d82ca6c08dd3d5152c9325f8c11","name":"node_93ea8ef251fd56b159e080cdf733d33e1fdfb3c7ae5bd9a6a328d0bf5458867b","services":["bzz","pss"],"enable_msg_events":true,"port":44155},"up":true}},{"node":{"info":{"id":"9f0e2bf8a962156c9e0a83c3d42ad3dc5ac5c3e508f24200bfb151aad4e395ff","name":"node_9f0e2bf8a962156c9e0a83c3d42ad3dc5ac5c3e508f24200bfb151aad4e395ff","enode":"enode://1a733925153e123a28e4c6ff215622e6f5f6e3603dd3ecac572db24c88743906db68f57c873814af3004eeee0cec5e7ea31c1fa450a6f60a4d682c5d36d4f7d6@127.0.0.1:0","enr":"0xf88fb8407124e4586da75d58f439871e4d6d59bf6cb2adffd121aa712eb670aa52d490b20045fdd401ff02688127caa8436744fae9ded418d490b1f6bdb678380f0839950183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1021a733925153e123a28e4c6ff215622e6f5f6e3603dd3ecac572db24c88743906","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"nw4r+KliFWyeCoPD1CrT3FrFw+UI8kIAv7FRqtTjlf8=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 9f0e2b\npopulation: 30 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 8 26ac 298a 2c80 3cab | 126 2a50 (0) 298a (0) 2e65 (0) 2fd2 (0)\n001 4 cd6c c961 dbd4 dad0 | 55 f756 (0) f6c0 (0) f645 (0) f1ed (0)\n002 5 bfc7 a2a1 a606 a505 | 37 b3f9 (0) b4a1 (0) b5ea (0) b659 (0)\n003 3 8854 837f 834f | 21 8d19 (0) 8cc3 (0) 8f9a (0) 8ea2 (0)\n004 3 97da 95c0 93ea | 8 97da (0) 9464 (0) 9518 (0) 955d (0)\n005 3 9b8e 9948 9959 | 3 9b8e (0) 9948 (0) 9959 (0)\n006 2 9ca1 9c21 | 3 9c8e (0) 9ca1 (0) 9c21 (0)\n============ DEPTH: 7 ==========================================\n007 1 9ec8 | 1 9ec8 (0)\n008 0 | 0\n009 1 9f7d | 1 9f7d (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"9f0e2bf8a962156c9e0a83c3d42ad3dc5ac5c3e508f24200bfb151aad4e395ff","private_key":"5e77db0ba785223e5c1e3ce73ecad087df783ddb123f13e44c126125e5320834","name":"node_9f0e2bf8a962156c9e0a83c3d42ad3dc5ac5c3e508f24200bfb151aad4e395ff","services":["bzz","pss"],"enable_msg_events":true,"port":36327},"up":true}},{"node":{"info":{"id":"5a8b84df651871fce72d11cb1c26c87ae4a0cc6b4c274d37e70532c94f27288e","name":"node_5a8b84df651871fce72d11cb1c26c87ae4a0cc6b4c274d37e70532c94f27288e","enode":"enode://78abddf561d75c3f8e4ee5cf729a4ca27a15261a2f7643ba4669070e37568388a95d9ba6ff45b86f63c11bb67c5f0816c8b8e1436db63342080d94b1ec98afe6@127.0.0.1:0","enr":"0xf88fb8404bd00e9812551717571255b2d27db8fdc87870fc9285e293ceb9921910e0c20f68658713acfd38ca573cae42d75bcd43a72edd6c7f0a363fccf5820d7c7b62990183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10278abddf561d75c3f8e4ee5cf729a4ca27a15261a2f7643ba4669070e37568388","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"WouE32UYcfznLRHLHCbIeuSgzGtMJ0035wUyyU8nKI4=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 5a8b84\npopulation: 32 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 cd6c a606 a2a1 9f0e | 130 e2d3 (0) e277 (0) e09f (0) e0a0 (0)\n001 4 1bd5 0561 3051 3188 | 65 2fd2 (0) 2e65 (0) 2c85 (0) 2c80 (0)\n002 5 6e7f 60c5 7c46 7850 | 26 648a (0) 6790 (0) 6795 (0) 67f3 (0)\n003 8 435d 447a 447c 482e | 19 4005 (0) 402c (0) 43c9 (0) 43d4 (0)\n004 3 52a8 5663 56ca | 6 50c1 (0) 5144 (0) 52a8 (0) 5538 (0)\n005 3 5d82 5c7c 5ff0 | 4 5ff0 (0) 5c37 (0) 5c7c (0) 5d82 (0)\n006 2 5987 5814 | 2 5987 (0) 5814 (0)\n007 1 5bd8 | 1 5bd8 (0)\n============ DEPTH: 8 ==========================================\n008 1 5a26 | 1 5a26 (0)\n009 1 5ac0 | 1 5ac0 (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"5a8b84df651871fce72d11cb1c26c87ae4a0cc6b4c274d37e70532c94f27288e","private_key":"213bd7466a810ef9f7851687f3b179a52046eb5522252297a6b1d6145b648669","name":"node_5a8b84df651871fce72d11cb1c26c87ae4a0cc6b4c274d37e70532c94f27288e","services":["bzz","pss"],"enable_msg_events":true,"port":37077},"up":true}},{"node":{"info":{"id":"793322608055d4873776a9a0a6c40b04379bfd2f289a8ad49a7dc456bc65f871","name":"node_793322608055d4873776a9a0a6c40b04379bfd2f289a8ad49a7dc456bc65f871","enode":"enode://fb36dea27a60b8255d2a142d64db3fe03c31642226d5a683e50b509f351c947fba07533d9b9138973ff4b62119c4bf09a9ccc0519dfba63e01ad9e6fdb04ab04@127.0.0.1:0","enr":"0xf88fb8403034394794df0756ddc241fe1356ff416e555eacb7699f2908a393d11806c4e508ac26d9bfa21ef4c53295da07e7916ab9facfc097f0721e7af81bccf373caa10183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102fb36dea27a60b8255d2a142d64db3fe03c31642226d5a683e50b509f351c947f","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"eTMiYIBV1Ic3dqmgpsQLBDeb/S8omorUmn3EVrxl+HE=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 793322\npopulation: 31 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 cd6c c961 dad0 93ea | 130 e681 (0) e64d (0) e471 (0) e09f (0)\n001 4 3980 07f5 0561 1bd5 | 65 26ab (0) 26ac (0) 24f8 (0) 244c (0)\n002 5 4d38 4cec 48de 447c | 35 402c (0) 4005 (0) 43c9 (0) 43d4 (0)\n003 6 6e7f 6d5e 6b4e 67f3 | 13 648a (0) 6790 (0) 6795 (0) 67f3 (0)\n004 3 7049 70f6 741a | 4 7049 (0) 70f6 (0) 7660 (0) 741a (0)\n005 4 7e47 7d16 7ce7 7c46 | 5 7e47 (0) 7d16 (0) 7ce7 (0) 7c7c (0)\n============ DEPTH: 6 ==========================================\n006 0 | 0\n007 2 7895 7850 | 2 7895 (0) 7850 (0)\n008 1 79e5 | 1 79e5 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"793322608055d4873776a9a0a6c40b04379bfd2f289a8ad49a7dc456bc65f871","private_key":"9af1743677da1b9215eb659bad537e2f657dbcafdf6b976262914f493b2f65b9","name":"node_793322608055d4873776a9a0a6c40b04379bfd2f289a8ad49a7dc456bc65f871","services":["bzz","pss"],"enable_msg_events":true,"port":37431},"up":true}},{"node":{"info":{"id":"1bd588263274543729d54529ae9e9bf4596db40649a1c2a3f73168d818f34b62","name":"node_1bd588263274543729d54529ae9e9bf4596db40649a1c2a3f73168d818f34b62","enode":"enode://104600d1fbf9e41d171d15f36749903ac370ecfe94329b32fbd3f7af774b1d72bc3f133476f5911bef453b17fd722cd5695eed65f7c0f5bf65dddf055bfd9e73@127.0.0.1:0","enr":"0xf88fb840c24991e175917d22a4a701e7eaec5e9384fd92f3dcb1cc9cc0a31364f5588fe0072fff15bcf451255fc65a48eef41cbe3ea148d76132009507c8ee91af5603cd0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103104600d1fbf9e41d171d15f36749903ac370ecfe94329b32fbd3f7af774b1d72","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"G9WIJjJ0VDcp1UUprp6b9FlttAZJocKj9zFo2BjzS2I=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 1bd588\npopulation: 31 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 7 c961 dad0 93ea ab3f | 130 e0a0 (0) e09f (0) e2d3 (0) e277 (0)\n001 5 5a8b 447c 482e 4d91 | 61 43d4 (0) 43c9 (0) 435d (0) 4005 (0)\n002 4 26ac 397a 3980 3188 | 28 2ddf (0) 2c85 (0) 2c80 (0) 2fd2 (0)\n003 5 096a 0cfc 0191 07f5 | 21 0e80 (0) 0e3b (0) 0e2b (0) 0d1c (0)\n004 3 1049 140d 1686 | 7 138d (0) 1070 (0) 1049 (0) 1784 (0)\n005 2 1dc0 1dec | 3 1fd0 (0) 1dc0 (0) 1dec (0)\n006 3 18e0 19ea 194e | 3 18e0 (0) 19ea (0) 194e (0)\n============ DEPTH: 7 ==========================================\n007 1 1add | 1 1add (0)\n008 1 1b1d | 1 1b1d (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"1bd588263274543729d54529ae9e9bf4596db40649a1c2a3f73168d818f34b62","private_key":"55ac02ca6376a8c8ade280c4a965ee5c08e93550a6029562e8e86d7dbccf81e5","name":"node_1bd588263274543729d54529ae9e9bf4596db40649a1c2a3f73168d818f34b62","services":["bzz","pss"],"enable_msg_events":true,"port":42121},"up":true}},{"node":{"info":{"id":"318828fa893a28cc0652d3f81d97c5b8e023e853685f5d3e65fde20689abcc5a","name":"node_318828fa893a28cc0652d3f81d97c5b8e023e853685f5d3e65fde20689abcc5a","enode":"enode://872434e3239345e130ac211904d19315ea542bd330d22ac21629432fadb2635f790530b99c823b4a59df7a4acd5fbbc0a9fb1c2133b86f88473040d3efbd69a6@127.0.0.1:0","enr":"0xf88fb84082f955db5d6323c7cfd3bff029579b8cd70c25e9e9e520f73c3fedce47321114383d187aa1adece14d610b47db85463b6ff60a5ec00e945d211e3f6abd25d18f0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102872434e3239345e130ac211904d19315ea542bd330d22ac21629432fadb2635f","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"MYgo+ok6KMwGUtP4HZfFuOAj6FNoX10+Zf3iBomrzFo=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 318828\npopulation: 31 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 7 dbd4 dad0 cd6c c961 | 130 f1ed (0) f305 (0) f215 (0) f2b4 (0)\n001 3 4d38 5a8b 7c46 | 61 4005 (0) 402c (0) 43d4 (0) 43c9 (0)\n002 3 096a 0561 1bd5 | 37 0d1c (0) 0cfc (0) 0e80 (0) 0e3b (0)\n003 5 298a 2a50 2e65 2ddf | 11 244c (0) 24f8 (0) 26ab (0) 26ac (0)\n004 6 3f31 3cab 3a62 3b02 | 8 3b02 (0) 3a62 (0) 3980 (0) 3938 (0)\n005 2 3728 3411 | 3 36b9 (0) 3728 (0) 3411 (0)\n006 1 32ff | 1 32ff (0)\n007 2 30fe 3051 | 2 30fe (0) 3051 (0)\n============ DEPTH: 8 ==========================================\n008 0 | 0\n009 2 31e1 31e6 | 2 31e6 (0) 31e1 (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"318828fa893a28cc0652d3f81d97c5b8e023e853685f5d3e65fde20689abcc5a","private_key":"ab2d8316f989485b43a1f14a3b2736c9e506aa0ba33fbeae8fc45dfb0784b50e","name":"node_318828fa893a28cc0652d3f81d97c5b8e023e853685f5d3e65fde20689abcc5a","services":["bzz","pss"],"enable_msg_events":true,"port":45097},"up":true}},{"node":{"info":{"id":"7c464054ea7b6c9ea0c7d4c209769c92f294a9db2ca159b8ef168e310a1eac3a","name":"node_7c464054ea7b6c9ea0c7d4c209769c92f294a9db2ca159b8ef168e310a1eac3a","enode":"enode://e9ce5ad62b69c60eaba82ede900643474a4316ff4fb9f8bbd15cc8ef3b5ac9eb2cfacbab6551b57423952f4be2990d95f539368954e42fc7fad8b1561af79002@127.0.0.1:0","enr":"0xf88fb840233a6d08e9c900370f4b86282cd0f45e172bbe22a6ddba170768665f2289363a04022e239dba04e74de46939a2fc3173ef7f8ec3a3c380bc4f96e0f8d57baa3f0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102e9ce5ad62b69c60eaba82ede900643474a4316ff4fb9f8bbd15cc8ef3b5ac9eb","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"fEZAVOp7bJ6gx9TCCXackvKUqdssoVm47xaOMQoerDo=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 7c4640\npopulation: 28 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 c961 d9cf dad0 93ea | 130 e681 (0) e64d (0) e471 (0) e09f (0)\n001 4 07f5 2fd2 397a 3188 | 65 0d1c (0) 0cfc (0) 0e80 (0) 0e3b (0)\n002 5 48de 4cec 4d38 5a26 | 35 4005 (0) 402c (0) 43d4 (0) 43c9 (0)\n003 5 6b4e 6e7f 6d5e 6758 | 13 68cb (0) 6b4e (0) 6c01 (0) 6dd3 (0)\n004 2 7660 741a | 4 7049 (0) 70f6 (0) 7660 (0) 741a (0)\n005 3 79e5 7933 7850 | 4 79e5 (0) 7933 (0) 7895 (0) 7850 (0)\n006 1 7e47 | 1 7e47 (0)\n007 1 7d16 | 1 7d16 (0)\n============ DEPTH: 8 ==========================================\n008 1 7ce7 | 1 7ce7 (0)\n009 0 | 0\n010 1 7c7c | 1 7c7c (0)\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"7c464054ea7b6c9ea0c7d4c209769c92f294a9db2ca159b8ef168e310a1eac3a","private_key":"fcc47163c2ab2f499cbb2f337ef53f49309b3865d8038bff9d2bc379d573c1e6","name":"node_7c464054ea7b6c9ea0c7d4c209769c92f294a9db2ca159b8ef168e310a1eac3a","services":["bzz","pss"],"enable_msg_events":true,"port":38929},"up":true}},{"node":{"info":{"id":"a606c79a018a6535375d851fcc82c42cc7c952720aa120434cedccf4a4be1f59","name":"node_a606c79a018a6535375d851fcc82c42cc7c952720aa120434cedccf4a4be1f59","enode":"enode://3550f2c56a73defeb97f0536204448c4e3e1331335e6e3a3014a4abcc64baa713863be64fced29ef2a307d2dadad652ef223a9ccc585b280a4cc7fcc0c873f95@127.0.0.1:0","enr":"0xf88fb840de06617ae4d0d818ea821d1c9879aee77965e21e891045657c110f6dbfb3933b1e580ab1ec78fad61f0175343ddcf154cbf61d63b77419bfe6bd777d864a3b700183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1033550f2c56a73defeb97f0536204448c4e3e1331335e6e3a3014a4abcc64baa71","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"pgbHmgGKZTU3XYUfzILELMfJUnIKoSBDTO3M9KS+H1k=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: a606c7\npopulation: 31 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 7 1bd5 3188 5a8b 5d82 | 126 0d1c (0) 0cfc (0) 0e80 (0) 0e3b (0)\n001 4 fc51 c9c3 c961 cd6c | 55 e681 (0) e64d (0) e471 (0) e2d3 (0)\n002 4 834f 8854 93ea 9f0e | 38 8b43 (0) 8862 (0) 8854 (0) 8d19 (0)\n003 3 b78f bfc7 be68 | 14 ba91 (0) bbaf (0) b8e1 (0) bcf8 (0)\n004 2 a8ff ab3f | 10 acee (0) aeb4 (0) af02 (0) a970 (0)\n005 5 a0c8 a1c8 a330 a2e6 | 6 a0c8 (0) a1c8 (0) a330 (0) a327 (0)\n006 3 a5ac a505 a4ee | 3 a4ee (0) a505 (0) a5ac (0)\n============ DEPTH: 7 ==========================================\n007 2 a742 a7a8 | 2 a7a8 (0) a742 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 1 a616 | 1 a616 (0)\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"a606c79a018a6535375d851fcc82c42cc7c952720aa120434cedccf4a4be1f59","private_key":"8b6e5a593a7a12ebb029cd578efe25114f3cadc22a3cd3b007eb164cc0a403fe","name":"node_a606c79a018a6535375d851fcc82c42cc7c952720aa120434cedccf4a4be1f59","services":["bzz","pss"],"enable_msg_events":true,"port":45851},"up":true}},{"node":{"info":{"id":"a2a163ce2cb092b411c994cc5d5ef555d539d2dcf4e7e1aeb528d2216dc481e5","name":"node_a2a163ce2cb092b411c994cc5d5ef555d539d2dcf4e7e1aeb528d2216dc481e5","enode":"enode://1ce0a6ac890fddf6089a062091b0f114fb6c01ac09e618ad4a23a3b985db8b695448be996b1b51dceb7341aba28d101f31aafe50d1d312d995c03ca64b907a8b@127.0.0.1:0","enr":"0xf88fb8402bd8ecaf0ec85c076464ba4a7314b9946c19a06746bfd1758516d4674fcff67a4f495420e48344d1870f99c43e5e56750a310e1f532fdc3a46b647a06c8fb4a80183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1031ce0a6ac890fddf6089a062091b0f114fb6c01ac09e618ad4a23a3b985db8b69","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"oqFjziywkrQRyZTMXV71VdU50tz05+GutSjSIW3EgeU=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: a2a163\npopulation: 34 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 1bd5 3188 5d82 5a8b | 126 138d (0) 1070 (0) 1049 (0) 1484 (0)\n001 6 eebd f645 fc51 cd6c | 55 e2d3 (0) e277 (0) e09f (0) e0a0 (0)\n002 4 8854 8f9a 93ea 9f0e | 38 8b43 (0) 8862 (0) 8854 (0) 8cc3 (0)\n003 5 bbaf b8e1 be68 bfc7 | 14 ba91 (0) bbaf (0) b8e1 (0) bdc5 (0)\n004 4 af02 a8ff a8f4 ab3f | 10 acee (0) aeb4 (0) af02 (0) a970 (0)\n005 5 a4ee a5ac a505 a742 | 7 a4ee (0) a505 (0) a5ac (0) a7a8 (0)\n006 2 a0c8 a1c8 | 2 a0c8 (0) a1c8 (0)\n============ DEPTH: 7 ==========================================\n007 2 a330 a327 | 2 a330 (0) a327 (0)\n008 0 | 0\n009 1 a2e6 | 1 a2e6 (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"a2a163ce2cb092b411c994cc5d5ef555d539d2dcf4e7e1aeb528d2216dc481e5","private_key":"c7c3bdf809c4dddc3d69c2437ecee9174c62113e7183c42d4b735143382ca5f2","name":"node_a2a163ce2cb092b411c994cc5d5ef555d539d2dcf4e7e1aeb528d2216dc481e5","services":["bzz","pss"],"enable_msg_events":true,"port":40591},"up":true}},{"node":{"info":{"id":"b78fd21c063006e2e033d1d00fc21e1ad7ad7951bb5621cec9b56639745d65f9","name":"node_b78fd21c063006e2e033d1d00fc21e1ad7ad7951bb5621cec9b56639745d65f9","enode":"enode://411f2844b08f1aa72a27b2f54a551d3eed6c7b634162cb04ef093d52effa83efc2797db053ce1fb70105d9fc15331a0312d148dc0431310eb2c42c6114cb0d7c@127.0.0.1:0","enr":"0xf88fb8404517ad1475dcc5865807afaa0a472b5446b69dbcc2465732186fb2220224daa510beea5edfe3b120c3ee1f7e942904d4ca137b556ea6feada809a6a61e2788a50183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102411f2844b08f1aa72a27b2f54a551d3eed6c7b634162cb04ef093d52effa83ef","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"t4/SHAYwBuLgM9HQD8IeGteteVG7ViHOybVmOXRdZfk=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: b78fd2\npopulation: 36 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 7850 5d82 | 126 1fd0 (0) 1dc0 (0) 1dec (0) 18e0 (0)\n001 10 f2b4 f645 fc51 eebd | 55 e09f (0) e0a0 (0) e277 (0) e2d3 (0)\n002 6 93ea 9948 9959 8e28 | 38 9c21 (0) 9c8e (0) 9ca1 (0) 9ec8 (0)\n003 9 af02 a8ff ab3f a606 | 23 acee (0) aeb4 (0) af02 (0) a970 (0)\n004 4 bbaf b8e1 be68 bfc7 | 8 ba91 (0) bbaf (0) b8e1 (0) bcf8 (0)\n005 1 b3f9 | 1 b3f9 (0)\n006 2 b5ea b4a1 | 2 b4a1 (0) b5ea (0)\n============ DEPTH: 7 ==========================================\n007 2 b659 b6df | 2 b659 (0) b6df (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"b78fd21c063006e2e033d1d00fc21e1ad7ad7951bb5621cec9b56639745d65f9","private_key":"74aa90f3bd323ba9eb7d36c9d5d71fba2abcc8c139f09a30ae66ad200d31f31a","name":"node_b78fd21c063006e2e033d1d00fc21e1ad7ad7951bb5621cec9b56639745d65f9","services":["bzz","pss"],"enable_msg_events":true,"port":45951},"up":true}},{"node":{"info":{"id":"5d82a418629cfbe7c57105309319ad695a198626fe3571de213a12ddf62f7308","name":"node_5d82a418629cfbe7c57105309319ad695a198626fe3571de213a12ddf62f7308","enode":"enode://45a546c77bd0b76e5a8c4cfa9b4ffb8e2124519e39fb9ac6862eef3a6b3ab36d2abb6edf5e822fc9e94a5f821a233fec02ed076b5394052bc3e5ac3f92382ef1@127.0.0.1:0","enr":"0xf88fb8406a321e44c0f6e7960b5f4a6d36376704b05c7a3ba49b1eb6acf89dedda8b5e267297203a9b15f97facaee8eaa5c3c25357451b6f70c3ea2c879c2c9c7a6b02b80183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10345a546c77bd0b76e5a8c4cfa9b4ffb8e2124519e39fb9ac6862eef3a6b3ab36d","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"XYKkGGKc++fFcQUwkxmtaVoZhib+NXHeIToS3fYvcwg=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 5d82a4\npopulation: 34 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 7 d9cf ddb8 93ea 837f | 130 e681 (0) e64d (0) e471 (0) e0a0 (0)\n001 4 194e 1686 1049 3980 | 65 138d (0) 1070 (0) 1049 (0) 1484 (0)\n002 2 6dd3 7850 | 26 6b4e (0) 68cb (0) 6c01 (0) 6dd3 (0)\n003 9 435d 43d4 447a 447c | 19 4005 (0) 402c (0) 435d (0) 43c9 (0)\n004 5 52a8 50c1 5663 56ca | 6 52a8 (0) 5144 (0) 50c1 (0) 5538 (0)\n005 4 5814 5a26 5a8b 5ac0 | 6 5987 (0) 5814 (0) 5bd8 (0) 5a26 (0)\n006 1 5ff0 | 1 5ff0 (0)\n============ DEPTH: 7 ==========================================\n007 2 5c7c 5c37 | 2 5c7c (0) 5c37 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"5d82a418629cfbe7c57105309319ad695a198626fe3571de213a12ddf62f7308","private_key":"69766d2192a8d8f57768af92f8ff7baed8f3a52c22d97417f21e6a5fd3de4f42","name":"node_5d82a418629cfbe7c57105309319ad695a198626fe3571de213a12ddf62f7308","services":["bzz","pss"],"enable_msg_events":true,"port":45337},"up":true}},{"node":{"info":{"id":"7850f5ee5048959559b3af0f95689669b250fc3aa58bcc9544dca61ca9c9769c","name":"node_7850f5ee5048959559b3af0f95689669b250fc3aa58bcc9544dca61ca9c9769c","enode":"enode://0c0ebe3bbeeb5597d947b1f7b5a2e127a5d6d3b63ef0f3e9729357e767470a8b462ec3cdd15997331c24a9152665d19273a3e79dfc447b7f50381bad46365a7e@127.0.0.1:0","enr":"0xf88fb84028a27a4976245ab6fe76c73b436192338af7ac71f5eb0fb25641c2ced4180b5b5f63f71d6ca7b7ce5129bf98a88efaf0231aba54207434478862b181f9430d2f0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1020c0ebe3bbeeb5597d947b1f7b5a2e127a5d6d3b63ef0f3e9729357e767470a8b","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"eFD17lBIlZVZs68PlWiWabJQ/Dqli8yVRNymHKnJdpw=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 7850f5\npopulation: 35 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 8 d9cf ddb8 93ea 837f | 130 e681 (0) e64d (0) e471 (0) e09f (0)\n001 4 1049 1686 0e2b 3980 | 65 1fd0 (0) 1dc0 (0) 1dec (0) 18e0 (0)\n002 5 482e 4cec 4d38 5a8b | 35 435d (0) 43c9 (0) 43d4 (0) 4005 (0)\n003 7 68cb 6b4e 6d5e 6dd3 | 13 6b4e (0) 68cb (0) 6c01 (0) 6d5e (0)\n004 3 7049 741a 7660 | 4 70f6 (0) 7049 (0) 741a (0) 7660 (0)\n005 5 7e47 7d16 7ce7 7c7c | 5 7e47 (0) 7d16 (0) 7ce7 (0) 7c7c (0)\n============ DEPTH: 6 ==========================================\n006 0 | 0\n007 2 79e5 7933 | 2 79e5 (0) 7933 (0)\n008 1 7895 | 1 7895 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"7850f5ee5048959559b3af0f95689669b250fc3aa58bcc9544dca61ca9c9769c","private_key":"40edb5f8d252880b90ba7fde9823f697100b67c90e06a29fc3ec7a5810ab62c1","name":"node_7850f5ee5048959559b3af0f95689669b250fc3aa58bcc9544dca61ca9c9769c","services":["bzz","pss"],"enable_msg_events":true,"port":32987},"up":true}},{"node":{"info":{"id":"ab3ff955033c0a2615932faf85fd20090b9121c7edcc8e6f7ce4c4fde0a96b8a","name":"node_ab3ff955033c0a2615932faf85fd20090b9121c7edcc8e6f7ce4c4fde0a96b8a","enode":"enode://78199c63a76cbaf76cd9760f290345fb7a8a8a0598e99d6152136896aaf69a6894757d496cb59a95925c3a18fe730382766be78a9f0ed4f3f11f866eb8bcdbc9@127.0.0.1:0","enr":"0xf88fb840e42249c4aa731c39349c743bdccfbcb826dcab6b0976b0262879a51570c9605f2840fb4f81fc6d939000acd0b1047aa6ecb2774a78c7a3c74b6dfe5b9f5c47900183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10378199c63a76cbaf76cd9760f290345fb7a8a8a0598e99d6152136896aaf69a68","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"qz/5VQM8CiYVky+vhf0gCQuRIcftzI5vfOTE/eCpa4o=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: ab3ff9\npopulation: 29 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 1049 194e 1bd5 7850 | 126 1fd0 (0) 1dc0 (0) 1dec (0) 18e0 (0)\n001 5 f2b4 ec90 ed42 eebd | 55 e0a0 (0) e09f (0) e2d3 (0) e277 (0)\n002 2 9959 837f | 38 97da (0) 9464 (0) 9518 (0) 955d (0)\n003 3 bfc7 be68 b78f | 14 bdc5 (0) bcf8 (0) bea1 (0) be68 (0)\n004 6 a327 a2e6 a2a1 a505 | 13 a505 (0) a5ac (0) a4ee (0) a7a8 (0)\n005 3 acee aeb4 af02 | 3 acee (0) aeb4 (0) af02 (0)\n006 4 a970 a8b5 a8f4 a8ff | 4 a970 (0) a8b5 (0) a8f4 (0) a8ff (0)\n============ DEPTH: 7 ==========================================\n007 1 aaf0 | 1 aaf0 (0)\n008 0 | 0\n009 1 ab71 | 1 ab71 (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"ab3ff955033c0a2615932faf85fd20090b9121c7edcc8e6f7ce4c4fde0a96b8a","private_key":"da16d3eec72f2e238edf7ba4f10364552eab2cefb316a7c76c8723d52989563d","name":"node_ab3ff955033c0a2615932faf85fd20090b9121c7edcc8e6f7ce4c4fde0a96b8a","services":["bzz","pss"],"enable_msg_events":true,"port":33141},"up":true}},{"node":{"info":{"id":"d9cf19895e015cb534d915aed83c0d26bf40a11244027812e17c3bec6e645a8e","name":"node_d9cf19895e015cb534d915aed83c0d26bf40a11244027812e17c3bec6e645a8e","enode":"enode://2042548f0f7c90b6cc2256c4d77e13ecd17a9f61272ad14494e2b21d9ac6029caebf34338de3872e5f3e447fa2ebf066ecd5ebbca76298324eccfade50751e7b@127.0.0.1:0","enr":"0xf88fb8406c1e73483cf923948ac9f54e2c047930e5ea66c902c1040e2c9d6b5a9a00a5c43110236e80ffd8ed3ee80e60f2f9b7395e5956aa2e30c6137271720864699cda0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1032042548f0f7c90b6cc2256c4d77e13ecd17a9f61272ad14494e2b21d9ac6029c","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"2c8ZiV4BXLU02RWu2DwNJr9AoRJEAngS4Xw77G5kWo4=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: d9cf19\npopulation: 29 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 60c5 7850 7c46 5d82 | 126 1fd0 (0) 1dc0 (0) 1dec (0) 18e0 (0)\n001 8 8f9a 837f b8e1 b78f | 75 97da (0) 9464 (0) 9518 (0) 955d (0)\n002 5 f645 f2b4 f9de fa24 | 28 e471 (0) e681 (0) e64d (0) e2d3 (0)\n003 3 c9c3 c961 cd6c | 16 c534 (0) c42e (0) c74d (0) c603 (0)\n004 2 d700 d408 | 5 d209 (0) d3e9 (0) d302 (0) d700 (0)\n005 1 ddb8 | 1 ddb8 (0)\n============ DEPTH: 6 ==========================================\n006 3 dad0 da36 dbd4 | 3 dbd4 (0) da36 (0) dad0 (0)\n007 0 | 0\n008 1 d959 | 1 d959 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"d9cf19895e015cb534d915aed83c0d26bf40a11244027812e17c3bec6e645a8e","private_key":"d168c43714b032d43709695043aaf1c5458b60b0e73717ccf008b5d9e6af9939","name":"node_d9cf19895e015cb534d915aed83c0d26bf40a11244027812e17c3bec6e645a8e","services":["bzz","pss"],"enable_msg_events":true,"port":41547},"up":true}},{"node":{"info":{"id":"837f0993f6374039a5ad4472d6313e647a4c5db4583bd27ccfa98d3448a17731","name":"node_837f0993f6374039a5ad4472d6313e647a4c5db4583bd27ccfa98d3448a17731","enode":"enode://ed39f75e6b5a22a7e8c6809ee4d870c133f22f4c93186e3c69457307c78fc12579cf7b7318723f40a0503f854e69da1de58ba5569bdf14e5b61f67446a138ed7@127.0.0.1:0","enr":"0xf88fb840c0e24ca2a2a76ce110f103428f1e7d60a3403afc52473a5aa71b9c63de5b4cb4379c41f9901442f5e2afb7f988f8a6bcc1ccfb6b2fd6494e5fba5c2ae7f45f420183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103ed39f75e6b5a22a7e8c6809ee4d870c133f22f4c93186e3c69457307c78fc125","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"g38Jk/Y3QDmlrURy1jE+ZHpMXbRYO9J8z6mNNEihdzE=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 837f09\npopulation: 37 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 5d82 7850 3980 | 126 1fd0 (0) 1dc0 (0) 1dec (0) 18e0 (0)\n001 3 c961 ddb8 d9cf | 55 e681 (0) e64d (0) e471 (0) e09f (0)\n002 7 be68 b78f a4ee a505 | 37 bdc5 (0) bcf8 (0) bfc7 (0) bea1 (0)\n003 7 97da 95c0 93ea 9f0e | 17 97da (0) 9464 (0) 9518 (0) 955d (0)\n004 6 8854 8cc3 8d19 8f9a | 9 8b43 (0) 8862 (0) 8854 (0) 8cc3 (0)\n005 4 84a9 8402 87a3 86d6 | 4 8402 (0) 84a9 (0) 87a3 (0) 86d6 (0)\n006 5 81a5 8006 8073 8074 | 5 81a5 (0) 80d7 (0) 8006 (0) 8074 (0)\n============ DEPTH: 7 ==========================================\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 2 8358 834f | 2 8358 (0) 834f (0)\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"837f0993f6374039a5ad4472d6313e647a4c5db4583bd27ccfa98d3448a17731","private_key":"9f0d233abf6f03526bd7a057b2f9064dfb5632022a186fcc902c6aa7a2600627","name":"node_837f0993f6374039a5ad4472d6313e647a4c5db4583bd27ccfa98d3448a17731","services":["bzz","pss"],"enable_msg_events":true,"port":41733},"up":true}},{"node":{"info":{"id":"ddb8be472c3d48dc4d3d112448e6c0c4a826a18af3f3b53fdfef8cd31053c75f","name":"node_ddb8be472c3d48dc4d3d112448e6c0c4a826a18af3f3b53fdfef8cd31053c75f","enode":"enode://23b26db5b1294383d9eea76f1d4a21a01a005282ec74c54d51f1d8d1c4ba9b19608cd921c5d735a101be0681eeaf5618e06460964f7d84656def7a07255111c8@127.0.0.1:0","enr":"0xf88fb84045e7162cf3f1ac630c92a7e123116d9b2e1666b1e895bede1122e243f0f35cdf2994006582400b1294fe4fef4deeac77bfe7bdb0e1ccd0e4ea8e52c1240509830183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10223b26db5b1294383d9eea76f1d4a21a01a005282ec74c54d51f1d8d1c4ba9b19","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"3bi+Ryw9SNxNPREkSObAxKgmoYrz87U/3++M0xBTx18=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: ddb8be\npopulation: 32 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 0cfc 3980 5d82 7850 | 126 402c (0) 4005 (0) 43c9 (0) 43d4 (0)\n001 8 b78f b8e1 a2a1 a8ff | 75 a505 (0) a5ac (0) a4ee (0) a7a8 (0)\n002 7 ec90 f645 f2b4 fa24 | 28 e471 (0) e681 (0) e64d (0) e2d3 (0)\n003 5 c534 c190 cd6c c961 | 16 c42e (0) c534 (0) c74d (0) c603 (0)\n004 3 d302 d700 d408 | 5 d209 (0) d3e9 (0) d302 (0) d700 (0)\n============ DEPTH: 5 ==========================================\n005 5 da36 dad0 dbd4 d959 | 5 dbd4 (0) da36 (0) dad0 (0) d959 (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"ddb8be472c3d48dc4d3d112448e6c0c4a826a18af3f3b53fdfef8cd31053c75f","private_key":"18bcdc56f12314ff79470029b0f3813f675978100fef3ddaca5023bc2f8dde78","name":"node_ddb8be472c3d48dc4d3d112448e6c0c4a826a18af3f3b53fdfef8cd31053c75f","services":["bzz","pss"],"enable_msg_events":true,"port":38607},"up":true}},{"node":{"info":{"id":"9959385385aade728d3f5763806596222bc1e7b9946c2c92407943d080b32f8d","name":"node_9959385385aade728d3f5763806596222bc1e7b9946c2c92407943d080b32f8d","enode":"enode://a3d56214ef40b3b64d2662d12f80d743f10da57b12601e31cbf572034244e1b299ce4be5f33a1b2f6c7eee9a79827c5d99e31d4f4b9cf64aa9ed02d901582fab@127.0.0.1:0","enr":"0xf88fb8404add71b1f22ba7a42f2b948ac2455c1e2a37e5d83ec2f50f0116cc91995cd31d2dc7ec48bc5ace7137fecaea8828738c17e66b551ca661a4f724b2ed1395ce3e0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103a3d56214ef40b3b64d2662d12f80d743f10da57b12601e31cbf572034244e1b2","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"mVk4U4Wq3nKNP1djgGWWIivB57mUbCySQHlD0ICzL40=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 995938\npopulation: 25 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 60c5 0e2b | 126 6b4e (0) 68cb (0) 6c01 (0) 6d5e (0)\n001 2 fc51 ddb8 | 55 e2d3 (0) e277 (0) e09f (0) e0a0 (0)\n002 5 b78f a327 af02 ab3f | 37 bdc5 (0) bcf8 (0) bea1 (0) be68 (0)\n003 4 837f 8854 8f9a 8e28 | 21 8b43 (0) 8862 (0) 8854 (0) 8cc3 (0)\n004 4 955d 95c0 97da 93ea | 8 97da (0) 9464 (0) 9518 (0) 955d (0)\n005 6 9ca1 9c8e 9c21 9ec8 | 6 9c21 (0) 9c8e (0) 9ca1 (0) 9ec8 (0)\n============ DEPTH: 6 ==========================================\n006 1 9b8e | 1 9b8e (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 1 9948 | 1 9948 (0)\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"9959385385aade728d3f5763806596222bc1e7b9946c2c92407943d080b32f8d","private_key":"011707e678d73ecf94ba7f710501f262764a152ffa7dbe48f5b7e7dbef86a807","name":"node_9959385385aade728d3f5763806596222bc1e7b9946c2c92407943d080b32f8d","services":["bzz","pss"],"enable_msg_events":true,"port":45157},"up":true}},{"node":{"info":{"id":"0e2b48558ce2af1fbfee38a557d56072e3091cfcaee8d7847c7c9dcf7bef9bfa","name":"node_0e2b48558ce2af1fbfee38a557d56072e3091cfcaee8d7847c7c9dcf7bef9bfa","enode":"enode://0b612a1ab5d916d8c26372863438f68d00efff720cb1a318c642e37ac4ddc0cbdc0f21d3d1935ad022323a317ef443741ee0e6ce46c01604b94783f86719582b@127.0.0.1:0","enr":"0xf88fb84072f6428c1949285e98cf3010a22fd4023bb5fe817a070b704d991522730917097a117d183bc0722f66f9d163f8eb714e74db79ad6fcb7ac5fca67930f49bd28c0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1030b612a1ab5d916d8c26372863438f68d00efff720cb1a318c642e37ac4ddc0cb","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"DitIVYzirx+/7jilV9VgcuMJHPyu6NeEfHydz3vvm/o=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 0e2b48\npopulation: 29 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 fc51 d408 a8ff 9948 | 130 e471 (0) e681 (0) e64d (0) e09f (0)\n001 6 7850 60c5 56ca 5ac0 | 61 7660 (0) 741a (0) 7049 (0) 70f6 (0)\n002 4 2c80 2ddf 26ac 3980 | 28 298a (0) 2a50 (0) 2fd2 (0) 2e65 (0)\n003 2 1049 1686 | 16 1fd0 (0) 1dc0 (0) 1dec (0) 18e0 (0)\n004 5 0314 0191 07f5 0594 | 10 025d (0) 035f (0) 0314 (0) 012b (0)\n005 3 08e5 09b3 096a | 6 08bd (0) 08f8 (0) 08e5 (0) 09b3 (0)\n006 2 0d1c 0cfc | 2 0d1c (0) 0cfc (0)\n============ DEPTH: 7 ==========================================\n007 0 | 0\n008 1 0e80 | 1 0e80 (0)\n009 0 | 0\n010 0 | 0\n011 1 0e3b | 1 0e3b (0)\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"0e2b48558ce2af1fbfee38a557d56072e3091cfcaee8d7847c7c9dcf7bef9bfa","private_key":"510468331a493c1c9e097b948955dfff54c130f51894aed02d4f46d1260021a2","name":"node_0e2b48558ce2af1fbfee38a557d56072e3091cfcaee8d7847c7c9dcf7bef9bfa","services":["bzz","pss"],"enable_msg_events":true,"port":44575},"up":true}},{"node":{"info":{"id":"a8ff8d69dcb36462d1116dafa5e3d0c7237bf65dbece482a316862c8d66e35b6","name":"node_a8ff8d69dcb36462d1116dafa5e3d0c7237bf65dbece482a316862c8d66e35b6","enode":"enode://b7201bebbe44d4f065e0344f51747c686401af50a2bc1e4bad167b56d0f5b94eaa6e6d50bd5b2708510984708c155ac50ed29d14b941ab71d22312033bbb9a20@127.0.0.1:0","enr":"0xf88fb840a72c72b758119852724dc6373359756fc7224766b257144c15597ba291dfbf8b1d8e2cac36d326b4a0e1ce960e294438b019d49713d6232eeb5dfd63341c13b10183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102b7201bebbe44d4f065e0344f51747c686401af50a2bc1e4bad167b56d0f5b94e","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"qP+NadyzZGLREW2vpePQxyN79l2+zkgqMWhiyNZuNbY=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: a8ff8d\npopulation: 32 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 48de 0e2b | 126 7660 (0) 741a (0) 70f6 (0) 7049 (0)\n001 4 fc51 d408 d9cf ddb8 | 55 e681 (0) e64d (0) e471 (0) e277 (0)\n002 5 8854 8073 837f 834f | 38 87a3 (0) 86d6 (0) 8402 (0) 84a9 (0)\n003 4 be68 bfc7 b8e1 b78f | 14 bcf8 (0) bdc5 (0) bfc7 (0) bea1 (0)\n004 9 a327 a2e6 a2a1 a5ac | 13 a505 (0) a5ac (0) a4ee (0) a7a8 (0)\n005 3 acee aeb4 af02 | 3 acee (0) aeb4 (0) af02 (0)\n006 2 ab71 ab3f | 3 aaf0 (0) ab71 (0) ab3f (0)\n007 1 a970 | 1 a970 (0)\n============ DEPTH: 8 ==========================================\n008 0 | 0\n009 1 a8b5 | 1 a8b5 (0)\n010 0 | 0\n011 0 | 0\n012 1 a8f4 | 1 a8f4 (0)\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"a8ff8d69dcb36462d1116dafa5e3d0c7237bf65dbece482a316862c8d66e35b6","private_key":"a3dc455b16cb040e97e400cbec5c77f9c6769a891569bafb9020595880600d14","name":"node_a8ff8d69dcb36462d1116dafa5e3d0c7237bf65dbece482a316862c8d66e35b6","services":["bzz","pss"],"enable_msg_events":true,"port":45235},"up":true}},{"node":{"info":{"id":"48de553e15afd3e8a46bfc3a5ba8a298158aa3d60f140d2730230af5cce8084d","name":"node_48de553e15afd3e8a46bfc3a5ba8a298158aa3d60f140d2730230af5cce8084d","enode":"enode://9422ff095b3dd7d5bb7caaf864015278473292f40803e5eab069fc7c270309b3386d001c249d10c2dde0f71ca459477ee74f149e5d7e1fe7ece9bf08237ab0dc@127.0.0.1:0","enr":"0xf88fb840df7b0ea5b6e73e0e48e983961669a7dc87cf47c6389512f75462e4d8f28e526567df2cdbb5da10b6d57e809894f1039e00f7f774c8fd1d1d14710dbae4bb8f520183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1029422ff095b3dd7d5bb7caaf864015278473292f40803e5eab069fc7c270309b3","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"SN5VPhWv0+ika/w6W6iimBWKo9YPFA0nMCMK9czoCE0=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 48de55\npopulation: 31 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 c9c3 d9cf d408 fc51 | 130 e09f (0) e0a0 (0) e2d3 (0) e277 (0)\n001 3 1686 0e2b 3980 | 65 1fd0 (0) 1dc0 (0) 1dec (0) 18e0 (0)\n002 5 7d16 7c46 7933 79e5 | 26 7049 (0) 70f6 (0) 7660 (0) 741a (0)\n003 5 56ca 5a8b 5ac0 5d82 | 16 52a8 (0) 5144 (0) 50c1 (0) 5538 (0)\n004 3 447c 43c9 43d4 | 9 46bf (0) 44ad (0) 447a (0) 447c (0)\n005 3 4cec 4d91 4d38 | 3 4cec (0) 4d91 (0) 4d38 (0)\n006 2 4a95 4b79 | 2 4a95 (0) 4b79 (0)\n============ DEPTH: 7 ==========================================\n007 0 | 0\n008 1 482e | 1 482e (0)\n009 1 48b8 | 1 48b8 (0)\n010 1 48f1 | 1 48f1 (0)\n011 0 | 0\n012 1 48d7 | 1 48d7 (0)\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"48de553e15afd3e8a46bfc3a5ba8a298158aa3d60f140d2730230af5cce8084d","private_key":"fe29ef81976826aba3a92e42c6b3848892672ee26649d67650358d54e85982e9","name":"node_48de553e15afd3e8a46bfc3a5ba8a298158aa3d60f140d2730230af5cce8084d","services":["bzz","pss"],"enable_msg_events":true,"port":40001},"up":true}},{"node":{"info":{"id":"398038811c1c7402fe2e6994c9ce2f15c8166b8e99f379feaaed66ac87702062","name":"node_398038811c1c7402fe2e6994c9ce2f15c8166b8e99f379feaaed66ac87702062","enode":"enode://932586d99d84466fce1c3d7a331315a768c320b890811c2a00eae226a62c05023605308437407502d54d2e09910164e7a9c6343a935e4fdb8267d1661a4a11ad@127.0.0.1:0","enr":"0xf88fb840f777fcf141adaf513c8cd83b5b2ad8716fe3f0805c0b83c31d3ee8bc13347b6370696f994cdc0cab03b8363ed9da19e3717ff65f31244ca6a3f22719f3df605c0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103932586d99d84466fce1c3d7a331315a768c320b890811c2a00eae226a62c0502","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"OYA4gRwcdAL+LmmUyc4vFcgWa46Z83n+qu1mrIdwIGI=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 398038\npopulation: 36 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 7 fc51 c9c3 d9cf ddb8 | 130 e2d3 (0) e277 (0) e09f (0) e0a0 (0)\n001 6 60c5 7933 7850 5ff0 | 61 741a (0) 7660 (0) 7049 (0) 70f6 (0)\n002 5 1b1d 1bd5 1049 1686 | 37 1dec (0) 1dc0 (0) 1fd0 (0) 18e0 (0)\n003 6 24f8 26ac 2e65 2fd2 | 11 2a50 (0) 298a (0) 2e65 (0) 2fd2 (0)\n004 5 3411 32ff 3188 31e1 | 9 36b9 (0) 3728 (0) 3411 (0) 32ff (0)\n005 3 3c5b 3cab 3f31 | 3 3f31 (0) 3c5b (0) 3cab (0)\n006 2 3a62 3b02 | 2 3a62 (0) 3b02 (0)\n============ DEPTH: 7 ==========================================\n007 0 | 0\n008 2 3938 397a | 2 3938 (0) 397a (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"398038811c1c7402fe2e6994c9ce2f15c8166b8e99f379feaaed66ac87702062","private_key":"571a1e200af7799e0d7295849ae3beaf1d75ccfa29216b243feedb21761d2bde","name":"node_398038811c1c7402fe2e6994c9ce2f15c8166b8e99f379feaaed66ac87702062","services":["bzz","pss"],"enable_msg_events":true,"port":43453},"up":true}},{"node":{"info":{"id":"8e282b0f27d4fa56fe14cfeb69fac5a53e3d882c7778eb190653e2eab7c93fd2","name":"node_8e282b0f27d4fa56fe14cfeb69fac5a53e3d882c7778eb190653e2eab7c93fd2","enode":"enode://0703457de466898f77a218b2253e4074f9d84ddc40a4d85a7677e03f1dc45090d8a5c0ae0f3bce42a249384f9f84ed92f79c7d71a80f97e4ea6787fec0979ef7@127.0.0.1:0","enr":"0xf88fb840d9529815a2188630f6e5a9a83b676cc923f44db1dce486279c916e75d9676afc6d6babb5690670e670141db7383ce8f862fe1828478493d343ad4d8e614bda370183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1030703457de466898f77a218b2253e4074f9d84ddc40a4d85a7677e03f1dc45090","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"jigrDyfU+lb+FM/rafrFpT49iCx3eOsZBlPi6rfJP9I=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 8e282b\npopulation: 32 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 60c5 3980 | 126 52a8 (0) 5144 (0) 50c1 (0) 5538 (0)\n001 4 c9c3 d408 ddb8 fc51 | 55 e2d3 (0) e277 (0) e09f (0) e0a0 (0)\n002 7 b78f b5ea bbaf b8e1 | 37 bdc5 (0) bcf8 (0) bfc7 (0) bea1 (0)\n003 6 955d 95c0 93ea 9b8e | 17 97da (0) 9464 (0) 95c0 (0) 9518 (0)\n004 5 81a5 80d7 8073 834f | 12 8402 (0) 84a9 (0) 87a3 (0) 86d6 (0)\n005 3 8b43 8862 8854 | 3 8b43 (0) 8862 (0) 8854 (0)\n006 2 8d19 8cc3 | 2 8cc3 (0) 8d19 (0)\n007 1 8f9a | 1 8f9a (0)\n============ DEPTH: 8 ==========================================\n008 1 8ea2 | 1 8ea2 (0)\n009 1 8e7b | 1 8e7b (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"8e282b0f27d4fa56fe14cfeb69fac5a53e3d882c7778eb190653e2eab7c93fd2","private_key":"5ee46cbe7328b036aa2e3281aec50d734d3fa00761ec99b53bf5a30a940a2006","name":"node_8e282b0f27d4fa56fe14cfeb69fac5a53e3d882c7778eb190653e2eab7c93fd2","services":["bzz","pss"],"enable_msg_events":true,"port":45567},"up":true}},{"node":{"info":{"id":"994839e5f3a5b8b23aed84fb029413124af17804b79b0263ec6bfd5aec5dad78","name":"node_994839e5f3a5b8b23aed84fb029413124af17804b79b0263ec6bfd5aec5dad78","enode":"enode://e251495df5e012ceae31fcd4e011f13d611edf3549f6a33eda33b9acbf5757be44d865d329431079380d794b06c97fadb2535cc2f5dbdca5c5aeaec59905c430@127.0.0.1:0","enr":"0xf88fb840fb7050cef033c59b67f105ef731c850b3215a560ec374d2010a4bd2627d51dbb3197c902a18ab6e66e4cf1b7fff54b0f59f9a9ef96b27e68f9293883e3c80f6b0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102e251495df5e012ceae31fcd4e011f13d611edf3549f6a33eda33b9acbf5757be","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"mUg55fOluLI67YT7ApQTEkrxeAS3mwJj7Gv9WuxdrXg=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 994839\npopulation: 29 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 48de 5ff0 1686 0e2b | 126 298a (0) 2a50 (0) 2fd2 (0) 2e65 (0)\n001 4 f645 f2b4 ec90 d408 | 55 e471 (0) e681 (0) e64d (0) e0a0 (0)\n002 5 b8e1 b78f b5ea a4ee | 37 bdc5 (0) bcf8 (0) bfc7 (0) bea1 (0)\n003 4 8073 837f 8854 8e28 | 21 84a9 (0) 8402 (0) 86d6 (0) 87a3 (0)\n004 4 93ea 955d 95c0 97da | 8 9257 (0) 93c0 (0) 93ea (0) 97da (0)\n005 6 9c21 9c8e 9ca1 9ec8 | 6 9c21 (0) 9c8e (0) 9ca1 (0) 9ec8 (0)\n============ DEPTH: 6 ==========================================\n006 1 9b8e | 1 9b8e (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 1 9959 | 1 9959 (0)\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"994839e5f3a5b8b23aed84fb029413124af17804b79b0263ec6bfd5aec5dad78","private_key":"334ce36c1f8b4c0d2139b19e7e5bb3a3a15fb0ce90610d2e1d1482d7b645c2d8","name":"node_994839e5f3a5b8b23aed84fb029413124af17804b79b0263ec6bfd5aec5dad78","services":["bzz","pss"],"enable_msg_events":true,"port":33079},"up":true}},{"node":{"info":{"id":"d408bb6f7af1590e1f162ce02cc016b1b86ede29851caa32434212ffa2a377c8","name":"node_d408bb6f7af1590e1f162ce02cc016b1b86ede29851caa32434212ffa2a377c8","enode":"enode://39f55004bcfcc2f16c4a1b4b723534c4c9e589ab5895a3cbe311aafd0c6e6de0bb47140ec73fdaa26a6b50f5227664e84e1e1a80db2796990116ad381c21a936@127.0.0.1:0","enr":"0xf88fb8405ae4c29ace5f03e6d651ba48886e1be64addab49c04c36ac806e5a5fd9788caf222b4d1266aa622022a3e58fd35aebcb70e30a50cbd2abb8826746fbe05420770183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10239f55004bcfcc2f16c4a1b4b723534c4c9e589ab5895a3cbe311aafd0c6e6de0","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"1Ai7b3rxWQ4fFizgLMAWsbhu3imFHKoyQ0IS/6Kjd8g=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: d408bb\npopulation: 31 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 7 5ff0 48de 482e 0cfc | 126 2a50 (0) 298a (0) 2fd2 (0) 2e65 (0)\n001 5 b8e1 a2e6 a8ff 8e28 | 75 b3f9 (0) b659 (0) b6df (0) b78f (0)\n002 7 ec90 f645 f2b4 f9de | 28 e471 (0) e681 (0) e64d (0) e09f (0)\n003 4 cf52 cd6c c961 c9c3 | 16 c534 (0) c42e (0) c74d (0) c603 (0)\n004 4 ddb8 dbd4 dad0 d9cf | 6 dbd4 (0) da36 (0) dad0 (0) d959 (0)\n============ DEPTH: 5 ==========================================\n005 3 d209 d3e9 d302 | 3 d209 (0) d3e9 (0) d302 (0)\n006 1 d700 | 1 d700 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"d408bb6f7af1590e1f162ce02cc016b1b86ede29851caa32434212ffa2a377c8","private_key":"251a8df09943db0babcf770639c5ccce249b19a3b91f88c6beb4090f8d366ac0","name":"node_d408bb6f7af1590e1f162ce02cc016b1b86ede29851caa32434212ffa2a377c8","services":["bzz","pss"],"enable_msg_events":true,"port":45605},"up":true}},{"node":{"info":{"id":"fc514c43c4eb5c62798458da5d622e9248a6e530e4288cd902019aa05c4374d8","name":"node_fc514c43c4eb5c62798458da5d622e9248a6e530e4288cd902019aa05c4374d8","enode":"enode://e92b9c292a29d8bfb7f4db4dbf539ed52534331fe43603f2c813dc801b4ec9364bff7fc962d375834ac6a1df1673c3615c40bef17b51f6debf2707acc9b17f58@127.0.0.1:0","enr":"0xf88fb840d952b221d3ae5c9e409850d227fa2dbd7c2e1db0634a5bbe1bc2ed2c46085d457766d51c388252a60d37b5490aa17cc4745f7bbe669b67e28838599f027738ac0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102e92b9c292a29d8bfb7f4db4dbf539ed52534331fe43603f2c813dc801b4ec936","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"/FFMQ8TrXGJ5hFjaXWIukkim5TDkKIzZAgGaoFxDdNg=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: fc514c\npopulation: 35 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 0e2b 3980 48de 60c5 | 126 298a (0) 2a50 (0) 2ddf (0) 2c85 (0)\n001 9 b78f a606 a4ee a2a1 | 75 bdc5 (0) bcf8 (0) bfc7 (0) bea1 (0)\n002 7 cd6c c961 c9c3 dbd4 | 27 c534 (0) c42e (0) c74d (0) c603 (0)\n003 6 ec90 eebd ef99 eff2 | 14 e471 (0) e681 (0) e64d (0) e09f (0)\n004 3 f2b4 f6c0 f645 | 7 f1ed (0) f305 (0) f215 (0) f2b4 (0)\n005 3 fa24 f8ff f9de | 3 f8ff (0) f9de (0) fa24 (0)\n============ DEPTH: 6 ==========================================\n006 2 ff75 feb3 | 2 ff75 (0) feb3 (0)\n007 0 | 0\n008 0 | 0\n009 1 fc39 | 1 fc39 (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"fc514c43c4eb5c62798458da5d622e9248a6e530e4288cd902019aa05c4374d8","private_key":"de7c0775a3921769035f59bb73e223f1b8dfa39617f5ee35cac84c7ded6a49a2","name":"node_fc514c43c4eb5c62798458da5d622e9248a6e530e4288cd902019aa05c4374d8","services":["bzz","pss"],"enable_msg_events":true,"port":44357},"up":true}},{"node":{"info":{"id":"60c5647aed152609979366fb33dc8b28fc60736098ff68d232415889b43dfa58","name":"node_60c5647aed152609979366fb33dc8b28fc60736098ff68d232415889b43dfa58","enode":"enode://6e5ef281f10a4795906b37800a284f193c6df512a1c03450197eca7bb6d9ce2d5a4878fb2bc42afc40cf28050d15a8e2888fdc544d06d6f13528265866a5f3a6@127.0.0.1:0","enr":"0xf88fb840ac7b31fb8f269a7992246ec994fbd4a2a7f22777ade012e4b89f058b0686fd46005eb0f24df29c1b5dd22f15fc54a20ef32b2d96a5ee581c1f7ab6e3da71f21d0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1026e5ef281f10a4795906b37800a284f193c6df512a1c03450197eca7bb6d9ce2d","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"YMVkeu0VJgmXk2b7M9yLKPxgc2CY/2jSMkFYibQ9+lg=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 60c564\npopulation: 33 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 9b8e 9959 8e28 d9cf | 130 bdc5 (0) bcf8 (0) bfc7 (0) bea1 (0)\n001 4 26ac 3980 0e2b 1686 | 65 36b9 (0) 3728 (0) 3411 (0) 32ff (0)\n002 5 482e 48de 56ca 5a8b | 35 4005 (0) 402c (0) 435d (0) 43c9 (0)\n003 6 70f6 7d16 7c46 79e5 | 13 7660 (0) 741a (0) 7049 (0) 70f6 (0)\n004 7 6b4e 68cb 6e7f 6c01 | 7 6b4e (0) 68cb (0) 6e7f (0) 6c01 (0)\n============ DEPTH: 5 ==========================================\n005 5 648a 6758 6790 6795 | 5 648a (0) 6790 (0) 6795 (0) 67f3 (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"60c5647aed152609979366fb33dc8b28fc60736098ff68d232415889b43dfa58","private_key":"89bbc4a8fe5905ca2c155be018babb341d9441135f074af282a327e2977357c6","name":"node_60c5647aed152609979366fb33dc8b28fc60736098ff68d232415889b43dfa58","services":["bzz","pss"],"enable_msg_events":true,"port":39295},"up":true}},{"node":{"info":{"id":"16868ec5d8f490ac73ea28b4e8fdda55ac149bb1aafb177545b54b84a5ad5367","name":"node_16868ec5d8f490ac73ea28b4e8fdda55ac149bb1aafb177545b54b84a5ad5367","enode":"enode://d845540617736b1958a11594e15934337e7127add929bad0c013d12cd65bb64d7dcb2d8dd41977f03a22b4e86e71a1edde519259f5dca5668307527cfe16bcf0@127.0.0.1:0","enr":"0xf88fb840782b90fecea289d4c0215935b270fcc0fd83a631e1fb144bf3134dbf4582abd20975b3712cf657a6d9a1d6ea942967f04741f6c2916f23ddef51ce04bea2d2490183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102d845540617736b1958a11594e15934337e7127add929bad0c013d12cd65bb64d","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"FoaOxdj0kKxz6ii06P3aVawUm7Gq+xd1RbVLhKWtU2c=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 16868e\npopulation: 35 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 f645 c9c3 d408 b5ea | 130 e277 (0) e2d3 (0) e0a0 (0) e09f (0)\n001 7 482e 48de 56ca 5d82 | 61 46bf (0) 44ad (0) 447a (0) 447c (0)\n002 4 2ddf 2c80 2e65 3980 | 28 2a50 (0) 298a (0) 2fd2 (0) 2e65 (0)\n003 6 0191 0561 07f5 096a | 21 025d (0) 035f (0) 0314 (0) 012b (0)\n004 6 1dec 18e0 19ea 194e | 9 1fd0 (0) 1dc0 (0) 1dec (0) 18e0 (0)\n005 3 138d 1070 1049 | 3 138d (0) 1070 (0) 1049 (0)\n============ DEPTH: 6 ==========================================\n006 2 1484 140d | 2 1484 (0) 140d (0)\n007 1 1784 | 1 1784 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"16868ec5d8f490ac73ea28b4e8fdda55ac149bb1aafb177545b54b84a5ad5367","private_key":"bde6dc606a9dc59b55e66e91238cd63fc2c84b7edc67fa0321b927540331ca5e","name":"node_16868ec5d8f490ac73ea28b4e8fdda55ac149bb1aafb177545b54b84a5ad5367","services":["bzz","pss"],"enable_msg_events":true,"port":41853},"up":true}},{"node":{"info":{"id":"9b8e6bb3a7fe4dc65ac97404e546d8b777d068c94bc2355f4f1a510ad6c11905","name":"node_9b8e6bb3a7fe4dc65ac97404e546d8b777d068c94bc2355f4f1a510ad6c11905","enode":"enode://09589964a1f4465dee4d0ce2388504a335ccfb484711b50e3a9a80b8b0671acb75b7d6aac621bf17746a584d606bb0aa677c302a4d44653ae28f11b437df20a9@127.0.0.1:0","enr":"0xf88fb840095da26616eca877077703e0e2b51dd8b7dadf89e7da897184fa333b8cde3d123ae6c94cd31c163ce10dbbf39a9ce6bd32e51570e5aeb9f82ae57427fd2a9b440183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10309589964a1f4465dee4d0ce2388504a335ccfb484711b50e3a9a80b8b0671acb","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"m45rs6f+TcZayXQE5UbYt3fQaMlLwjVfTxpRCtbBGQU=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 9b8e6b\npopulation: 28 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 60c5 5ac0 5ff0 1686 | 126 46bf (0) 44ad (0) 447a (0) 447c (0)\n001 3 f645 fc51 c9c3 | 55 e277 (0) e2d3 (0) e0a0 (0) e09f (0)\n002 5 bbaf af02 a327 a2e6 | 37 bdc5 (0) bcf8 (0) bfc7 (0) bea1 (0)\n003 5 8073 837f 8d19 8f9a | 21 8402 (0) 84a9 (0) 87a3 (0) 86d6 (0)\n004 3 93ea 95c0 955d | 8 9257 (0) 93c0 (0) 93ea (0) 97da (0)\n005 6 9ec8 9f7d 9f0e 9c21 | 6 9c21 (0) 9c8e (0) 9ca1 (0) 9ec8 (0)\n============ DEPTH: 6 ==========================================\n006 2 9948 9959 | 2 9948 (0) 9959 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"9b8e6bb3a7fe4dc65ac97404e546d8b777d068c94bc2355f4f1a510ad6c11905","private_key":"c540be3b3745151e75287e86c62db0fa68c68a13c06e511d9ccafa0b720969a9","name":"node_9b8e6bb3a7fe4dc65ac97404e546d8b777d068c94bc2355f4f1a510ad6c11905","services":["bzz","pss"],"enable_msg_events":true,"port":41055},"up":true}},{"node":{"info":{"id":"c9c302de4afe7b4dcbb6f3e366ce747083f9dcd7d5c6a01b939da5cdc6ccc874","name":"node_c9c302de4afe7b4dcbb6f3e366ce747083f9dcd7d5c6a01b939da5cdc6ccc874","enode":"enode://9022be2eafd1b596287e78101c820178a736461ebf18c02d293c56d67cc881daa6b234e7b7d1f37ac3f49ececef3b96edbdc462ce5f5fe2bf41079787a8093a5@127.0.0.1:0","enr":"0xf88fb840f7351379bc850fcc93ba2ef5af9d2f0407e068046473feb7b496ec6fa8f56c0151ed144e7a078a2160242e4793f0508666d82ac0bf8b809d7fb1b8c0becc07630183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1039022be2eafd1b596287e78101c820178a736461ebf18c02d293c56d67cc881da","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"ycMC3kr+e03LtvPjZs50cIP53NfVxqAbk52lzcbMyHQ=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: c9c302\npopulation: 34 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 7 3980 1049 1686 60c5 | 126 3411 (0) 36b9 (0) 3728 (0) 32ff (0)\n001 6 b78f a327 a606 af02 | 75 b3f9 (0) b659 (0) b6df (0) b78f (0)\n002 6 ec90 fa24 feb3 fc51 | 28 e471 (0) e681 (0) e64d (0) e2d3 (0)\n003 6 d9cf dbd4 dad0 ddb8 | 11 dbd4 (0) da36 (0) dad0 (0) d959 (0)\n004 2 c272 c190 | 8 c534 (0) c42e (0) c74d (0) c603 (0)\n005 4 cf52 cc33 cdb1 cd6c | 4 cf52 (0) cc33 (0) cdb1 (0) cd6c (0)\n============ DEPTH: 6 ==========================================\n006 0 | 0\n007 2 c8ea c8c8 | 2 c8ea (0) c8c8 (0)\n008 1 c961 | 1 c961 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"c9c302de4afe7b4dcbb6f3e366ce747083f9dcd7d5c6a01b939da5cdc6ccc874","private_key":"2d2c2ccb0a0c233399b577f4b799b0181de2cd4673c1207b189502c87c899154","name":"node_c9c302de4afe7b4dcbb6f3e366ce747083f9dcd7d5c6a01b939da5cdc6ccc874","services":["bzz","pss"],"enable_msg_events":true,"port":33367},"up":true}},{"node":{"info":{"id":"5ff09c6859736aad7a82a3bfb3f1a1a8b3c0d58f831863540d9c3013dd35745e","name":"node_5ff09c6859736aad7a82a3bfb3f1a1a8b3c0d58f831863540d9c3013dd35745e","enode":"enode://47a8bfa3642fb14aad3497d548cd0ff911bb2e2a2cb1690be88d88e3a6bf854a4cab67630b26b8aced1d96c0e4c0cea337456b5e7fda0712b0e63b17ce8566d6@127.0.0.1:0","enr":"0xf88fb840c2abefc8eb1e4331f1a75917b53d225e82282d262f0e4bb2f4b77c9bbe6efb7703a6ff2d0f874bd663d1ac50566237c65b0438059ff31730c896e201938003b50183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10247a8bfa3642fb14aad3497d548cd0ff911bb2e2a2cb1690be88d88e3a6bf854a","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"X/CcaFlzaq16gqO/s/GhqLPA1Y+DGGNUDZwwE901dF4=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 5ff09c\npopulation: 31 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 af02 a4ee 9948 9b8e | 130 b3f9 (0) b6df (0) b659 (0) b78f (0)\n001 5 2ddf 3980 0e2b 1049 | 65 1fd0 (0) 1dc0 (0) 1dec (0) 18e0 (0)\n002 5 79e5 6dd3 6d3c 68cb | 26 7660 (0) 741a (0) 7049 (0) 70f6 (0)\n003 5 43d4 43c9 4d38 48de | 19 46bf (0) 44ad (0) 447a (0) 447c (0)\n004 4 50c1 5538 5663 56ca | 6 52a8 (0) 5144 (0) 50c1 (0) 5538 (0)\n005 3 5814 5ac0 5a8b | 6 5987 (0) 5814 (0) 5bd8 (0) 5a26 (0)\n============ DEPTH: 6 ==========================================\n006 3 5c37 5c7c 5d82 | 3 5c37 (0) 5c7c (0) 5d82 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"5ff09c6859736aad7a82a3bfb3f1a1a8b3c0d58f831863540d9c3013dd35745e","private_key":"00702831aac71a1861099a693ff9a0eb5bbad3993d5054de5722027d2906dc32","name":"node_5ff09c6859736aad7a82a3bfb3f1a1a8b3c0d58f831863540d9c3013dd35745e","services":["bzz","pss"],"enable_msg_events":true,"port":45801},"up":true}},{"node":{"info":{"id":"482ec3dc05460579ea9bce87677bd3d9a1930e801fabeba607b8ab6b8729ff15","name":"node_482ec3dc05460579ea9bce87677bd3d9a1930e801fabeba607b8ab6b8729ff15","enode":"enode://61e80e865b0692bff9618d89bec4178cc713d2efccfd0c9f11a94a3bb65f510ccae3af079e3ec0db026b08c0f41eef7440b0a04cbf7a88a8e948a7bbe0f09d4b@127.0.0.1:0","enr":"0xf88fb8408eae3376cda8894401f6a76ded081e214dbcdcc35516b057e7e27962ce8e71fb038d41811263fcd3e7ae470ebad950d4ce9de19c18246bbe58efd4e64cd0b4ea0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10361e80e865b0692bff9618d89bec4178cc713d2efccfd0c9f11a94a3bb65f510c","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"SC7D3AVGBXnqm86HZ3vT2aGTDoAfq+umB7ira4cp/xU=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 482ec3\npopulation: 32 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 a4ee c9c3 d408 f645 | 130 c74d (0) c6a8 (0) c603 (0) c534 (0)\n001 3 1bd5 1686 1049 | 65 36b9 (0) 3728 (0) 3411 (0) 32ff (0)\n002 5 60c5 68cb 79e5 7850 | 26 741a (0) 7660 (0) 7049 (0) 70f6 (0)\n003 7 5663 56ca 5814 5a8b | 16 52a8 (0) 5144 (0) 50c1 (0) 5538 (0)\n004 4 447c 435d 43d4 43c9 | 9 46bf (0) 44ad (0) 447a (0) 447c (0)\n005 3 4cec 4d91 4d38 | 3 4cec (0) 4d91 (0) 4d38 (0)\n006 2 4a95 4b79 | 2 4a95 (0) 4b79 (0)\n============ DEPTH: 7 ==========================================\n007 0 | 0\n008 4 48b8 48f1 48d7 48de | 4 48b8 (0) 48f1 (0) 48d7 (0) 48de (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"482ec3dc05460579ea9bce87677bd3d9a1930e801fabeba607b8ab6b8729ff15","private_key":"914825085a6c709b5fb3130de8c9b6f9593efcb2fa9db695821c0ad50d637918","name":"node_482ec3dc05460579ea9bce87677bd3d9a1930e801fabeba607b8ab6b8729ff15","services":["bzz","pss"],"enable_msg_events":true,"port":41929},"up":true}},{"node":{"info":{"id":"1049d321a450726cf39d1d7cea1c108be3bec137a644b62cdc73a853f5a5a22b","name":"node_1049d321a450726cf39d1d7cea1c108be3bec137a644b62cdc73a853f5a5a22b","enode":"enode://16980066851e866b8eec7c10d0b26aa7c7839271112682530f4801d3c494f8eca313971c90b19590d0b4f4995e2c799e328795c06bc5c030d200d40c803bfccc@127.0.0.1:0","enr":"0xf88fb84015420addbd5c0cd32d328b36acc314ecc7a045c9197df579feed2a3e4d1db4d930917f78b1bd4a674d1aa7ba04e0e6e3420d30208274bcc61493281b08b9fdc60183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10216980066851e866b8eec7c10d0b26aa7c7839271112682530f4801d3c494f8ec","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"EEnTIaRQcmzznR186hwQi+O+wTemRLYs3HOoU/Wlois=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 1049d3\npopulation: 36 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 8 c9c3 d408 fa24 f645 | 130 c603 (0) c6a8 (0) c74d (0) c42e (0)\n001 6 7850 7d16 56ca 5d82 | 61 741a (0) 7660 (0) 7049 (0) 70f6 (0)\n002 6 3980 2e65 2c80 2ddf | 28 3728 (0) 36b9 (0) 3411 (0) 32ff (0)\n003 4 0561 07f5 0e80 0e2b | 21 025d (0) 035f (0) 0314 (0) 012b (0)\n004 6 1dec 18e0 19ea 194e | 9 1fd0 (0) 1dc0 (0) 1dec (0) 18e0 (0)\n005 4 1484 140d 1784 1686 | 4 1484 (0) 140d (0) 1784 (0) 1686 (0)\n============ DEPTH: 6 ==========================================\n006 1 138d | 1 138d (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 1 1070 | 1 1070 (0)\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"1049d321a450726cf39d1d7cea1c108be3bec137a644b62cdc73a853f5a5a22b","private_key":"199675da9f4b1fd8e250d9ba36169cc5b10d83f69b39656a4b8e5c7536feaef2","name":"node_1049d321a450726cf39d1d7cea1c108be3bec137a644b62cdc73a853f5a5a22b","services":["bzz","pss"],"enable_msg_events":true,"port":46623},"up":true}},{"node":{"info":{"id":"a2e6c900511768c8c9947ab0fa2e73975cf2a4cec7fd15217abdba25c329317e","name":"node_a2e6c900511768c8c9947ab0fa2e73975cf2a4cec7fd15217abdba25c329317e","enode":"enode://d9a019201fc917f5e3bb43c74a43fbdb9c66a2ecdc3e751f299e5a984d91e005be151f1d7d28a1c4fff2cec0ee358c79bf2f767e391d4f6ac110a3e268da7f15@127.0.0.1:0","enr":"0xf88fb840755a7a98e81b46c4f8effc43bf335c6043a85c0351fdcad60a80aa1b0033db4b569b0b9e452bf29597b83a24824ae11bca382614a3eaf87ceda9ff79d9de62f60183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103d9a019201fc917f5e3bb43c74a43fbdb9c66a2ecdc3e751f299e5a984d91e005","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"oubJAFEXaMjJlHqw+i5zl1zypM7H/RUher26JcMpMX4=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: a2e6c9\npopulation: 29 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 26ac 1049 | 126 6b4e (0) 68cb (0) 6e7f (0) 6c01 (0)\n001 3 d408 fa24 f645 | 55 c534 (0) c42e (0) c74d (0) c603 (0)\n002 4 8073 8f9a 9948 9b8e | 38 9257 (0) 93c0 (0) 93ea (0) 97da (0)\n003 5 be68 b8e1 bbaf b78f | 14 b3f9 (0) b659 (0) b6df (0) b78f (0)\n004 4 a8ff a8f4 ab3f af02 | 10 aaf0 (0) ab71 (0) ab3f (0) a970 (0)\n005 6 a742 a616 a606 a505 | 7 a616 (0) a606 (0) a7a8 (0) a742 (0)\n006 2 a0c8 a1c8 | 2 a0c8 (0) a1c8 (0)\n============ DEPTH: 7 ==========================================\n007 2 a330 a327 | 2 a330 (0) a327 (0)\n008 0 | 0\n009 1 a2a1 | 1 a2a1 (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"a2e6c900511768c8c9947ab0fa2e73975cf2a4cec7fd15217abdba25c329317e","private_key":"4662f9a82f5f82c5aab562b02fffb40fe8b62834bae8104220f46efd89898980","name":"node_a2e6c900511768c8c9947ab0fa2e73975cf2a4cec7fd15217abdba25c329317e","services":["bzz","pss"],"enable_msg_events":true,"port":33333},"up":true}},{"node":{"info":{"id":"a4ee49bb2caabb6b9448bcdff1fc3cc673a2db04eab9f5c62d1787f2c25990a0","name":"node_a4ee49bb2caabb6b9448bcdff1fc3cc673a2db04eab9f5c62d1787f2c25990a0","enode":"enode://453ddc011affe7c5cf20098ebed634712f9be29be2f136db7321e21029a732ef5e9318f6500053225345d773e7fce47dd0e219b9c2a29a433e618c2471149840@127.0.0.1:0","enr":"0xf88fb8402c342bd3642c99cf153a0106b072c0342cea619d53b64076d24cf4d67838ed1a20e65fc7c73a613a6cbba324aaec9aa64fe96559e44ab51433b80746e933d9880183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102453ddc011affe7c5cf20098ebed634712f9be29be2f136db7321e21029a732ef","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"pO5Juyyqu2uUSLzf8fw8xnOi2wTqufXGLReH8sJZkKA=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: a4ee49\npopulation: 31 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 1049 26ac 7d16 482e | 126 025d (0) 035f (0) 0314 (0) 012b (0)\n001 4 fc51 fa24 f2b4 f645 | 55 c534 (0) c42e (0) c74d (0) c603 (0)\n002 5 837f 8f9a 8e28 9948 | 38 9257 (0) 93c0 (0) 93ea (0) 97da (0)\n003 5 be68 bfc7 bbaf b78f | 14 b3f9 (0) b659 (0) b6df (0) b78f (0)\n004 3 a8ff ab3f af02 | 10 aaf0 (0) ab71 (0) ab3f (0) a970 (0)\n005 4 a1c8 a327 a2a1 a2e6 | 6 a0c8 (0) a1c8 (0) a330 (0) a327 (0)\n006 3 a606 a7a8 a742 | 4 a616 (0) a606 (0) a7a8 (0) a742 (0)\n============ DEPTH: 7 ==========================================\n007 2 a505 a5ac | 2 a505 (0) a5ac (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"a4ee49bb2caabb6b9448bcdff1fc3cc673a2db04eab9f5c62d1787f2c25990a0","private_key":"59ad354948f16052bee88884c787bea727cb225c8573f641845ac1ac2357d6a5","name":"node_a4ee49bb2caabb6b9448bcdff1fc3cc673a2db04eab9f5c62d1787f2c25990a0","services":["bzz","pss"],"enable_msg_events":true,"port":36935},"up":true}},{"node":{"info":{"id":"f645aab9cb2bd2709998b38e5789c9c5f68d40765e6cbd93b92e6383eb671dba","name":"node_f645aab9cb2bd2709998b38e5789c9c5f68d40765e6cbd93b92e6383eb671dba","enode":"enode://af59e58eb60a9dc748725bc8525d5e216517bd1c27f15728d2959890b8b5997c33a6b7efea09f3ba50b0f8048cace4d001a24b5ac4287ef1721e0c78c577b448@127.0.0.1:0","enr":"0xf88fb8409a8b6d7253f6d169fb548b469ba22aff1ed726350e671757249d57cf12b9b1d54724906cae553e56619591a1da8e799760729eb50980d43b1544427ae48c8c370183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102af59e58eb60a9dc748725bc8525d5e216517bd1c27f15728d2959890b8b5997c","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"9kWqucsr0nCZmLOOV4nJxfaNQHZebL2TuS5jg+tnHbo=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: f645aa\npopulation: 41 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 7 1686 1049 26ac 7d16 | 126 07f5 (0) 046c (0) 0594 (0) 0561 (0)\n001 10 8f9a 9948 9b8e b78f | 75 9257 (0) 93c0 (0) 93ea (0) 97da (0)\n002 10 d408 d700 ddb8 d9cf | 27 c534 (0) c42e (0) c74d (0) c603 (0)\n003 4 e0a0 eebd ed42 ec90 | 14 e471 (0) e681 (0) e64d (0) e277 (0)\n004 4 feb3 fc51 f9de fa24 | 7 fc39 (0) fc51 (0) ff75 (0) feb3 (0)\n005 4 f1ed f305 f215 f2b4 | 4 f1ed (0) f305 (0) f215 (0) f2b4 (0)\n============ DEPTH: 6 ==========================================\n006 0 | 0\n007 1 f756 | 1 f756 (0)\n008 1 f6c0 | 1 f6c0 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"f645aab9cb2bd2709998b38e5789c9c5f68d40765e6cbd93b92e6383eb671dba","private_key":"6ff11e7bc067a6cbe95f29b9359cd01605c91281829e73e543154f78ed8e7962","name":"node_f645aab9cb2bd2709998b38e5789c9c5f68d40765e6cbd93b92e6383eb671dba","services":["bzz","pss"],"enable_msg_events":true,"port":41177},"up":true}},{"node":{"info":{"id":"5ac0d00b8d647dec62d26e1a689fd05b8b7a1a79ab8c43493bd6d7d209816df1","name":"node_5ac0d00b8d647dec62d26e1a689fd05b8b7a1a79ab8c43493bd6d7d209816df1","enode":"enode://8f9ce802b9786b4a1aa8b5644e566d23306c0d0eb77e6df2965b1e274d690b6e2502e7c011240b18cb138c87af5681de7a883889122b0615c0c638dc31dee213@127.0.0.1:0","enr":"0xf88fb840fa8500339bf2fbc498dadfc8621c437bdb9120747fabf305b106c05d497c3067734896952dafd120f87ca214cb31457fba84b83a7a0b61abd8f185ffe94970ee0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1038f9ce802b9786b4a1aa8b5644e566d23306c0d0eb77e6df2965b1e274d690b6e","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"WsDQC41kfexi0m4aaJ/QW4t6GnmrjENJO9bX0gmBbfE=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 5ac0d0\npopulation: 29 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 bbaf 8f9a 9b8e f2b4 | 130 9257 (0) 93c0 (0) 93ea (0) 97da (0)\n001 4 0cfc 0e2b 0e80 26ac | 65 025d (0) 035f (0) 0314 (0) 012b (0)\n002 3 6d3c 79e5 7d16 | 26 6b4e (0) 68cb (0) 6e7f (0) 6c01 (0)\n003 6 43c9 43d4 4cec 4d38 | 19 46bf (0) 44ad (0) 447a (0) 447c (0)\n004 3 5538 56ca 5663 | 6 52a8 (0) 5144 (0) 50c1 (0) 5538 (0)\n005 3 5ff0 5c7c 5d82 | 4 5c37 (0) 5c7c (0) 5d82 (0) 5ff0 (0)\n006 2 5987 5814 | 2 5987 (0) 5814 (0)\n007 1 5bd8 | 1 5bd8 (0)\n============ DEPTH: 8 ==========================================\n008 1 5a26 | 1 5a26 (0)\n009 1 5a8b | 1 5a8b (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"5ac0d00b8d647dec62d26e1a689fd05b8b7a1a79ab8c43493bd6d7d209816df1","private_key":"37d0a7ae7d8c4e2d793d9abd755aad9a8b44f13935e905b00e1f3dfdf0f52095","name":"node_5ac0d00b8d647dec62d26e1a689fd05b8b7a1a79ab8c43493bd6d7d209816df1","services":["bzz","pss"],"enable_msg_events":true,"port":39637},"up":true}},{"node":{"info":{"id":"7d162a11662585f8c38d88fb241623e67bacf90703065dae6c092b4b507d6543","name":"node_7d162a11662585f8c38d88fb241623e67bacf90703065dae6c092b4b507d6543","enode":"enode://63b48abfe4bd6eb3bb9cd83e20c13d4e1155c4d0e67d9f0f1fd7aa134a3c70b07eff745b46eb65ce17a2586d6bbc99cfe2b09a909211d1bd906dc518c6d028a1@127.0.0.1:0","enr":"0xf88fb84060ab746693d04040fa4a967d48408a7121a17efbe8c2ab834db16aa034e76736313708f92b2c32f579368352ba5953b50658b408af972a1fd6db52ba8b5d31840183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10363b48abfe4bd6eb3bb9cd83e20c13d4e1155c4d0e67d9f0f1fd7aa134a3c70b0","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"fRYqEWYlhfjDjYj7JBYj5nus+QcDBl2ubAkrS1B9ZUM=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 7d162a\npopulation: 29 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 f645 f2b4 fa24 a4ee | 130 c534 (0) c42e (0) c74d (0) c603 (0)\n001 3 1049 2fd2 26ac | 65 035f (0) 0314 (0) 025d (0) 0191 (0)\n002 5 43d4 48de 482e 56ca | 35 46bf (0) 44ad (0) 447a (0) 447c (0)\n003 5 60c5 68cb 6e7f 6d3c | 13 6b4e (0) 68cb (0) 6e7f (0) 6c01 (0)\n004 3 7660 7049 70f6 | 4 741a (0) 7660 (0) 7049 (0) 70f6 (0)\n005 4 7895 7850 7933 79e5 | 4 7895 (0) 7850 (0) 7933 (0) 79e5 (0)\n006 1 7e47 | 1 7e47 (0)\n============ DEPTH: 7 ==========================================\n007 3 7ce7 7c7c 7c46 | 3 7ce7 (0) 7c7c (0) 7c46 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"7d162a11662585f8c38d88fb241623e67bacf90703065dae6c092b4b507d6543","private_key":"9304de16b2dad1e33f2436981bb04e64cbfbd2b153362b7f99b6e8ed93f2e3c7","name":"node_7d162a11662585f8c38d88fb241623e67bacf90703065dae6c092b4b507d6543","services":["bzz","pss"],"enable_msg_events":true,"port":43535},"up":true}},{"node":{"info":{"id":"af02c2f471e96ab8defbd229215695b95e64f7c78b145b6793a238961f556fbf","name":"node_af02c2f471e96ab8defbd229215695b95e64f7c78b145b6793a238961f556fbf","enode":"enode://7651426a392ebbda1e38bda8c61f84d23619acc84c23482c366aa93172e0e69d0db6cec3a0117a8b29b469cfb4867640c19cde672f97b8e0a898721fdfcf81d2@127.0.0.1:0","enr":"0xf88fb840b963eedc19e55fea385cb79ba3edb722a5c9cd6b3837cae1b8b5bd42752a174a1fe5c8c3e1f1317f3f7dbc12ea24d98f7f8c47251ada9f5f7e2ef957f22a4d880183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1027651426a392ebbda1e38bda8c61f84d23619acc84c23482c366aa93172e0e69d","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"rwLC9HHparje+9IpIVaVuV5k98eLFFtnk6I4lh9Vb78=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: af02c2\npopulation: 34 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 1049 7d16 5ff0 56ca | 126 025d (0) 035f (0) 0314 (0) 012b (0)\n001 4 c9c3 f645 f2b4 fa24 | 55 c42e (0) c534 (0) c74d (0) c603 (0)\n002 4 955d 9959 9b8e 8f9a | 38 9257 (0) 93c0 (0) 93ea (0) 97da (0)\n003 8 bfc7 be68 bea1 b8e1 | 14 bcf8 (0) bdc5 (0) bfc7 (0) be68 (0)\n004 7 a7a8 a742 a5ac a4ee | 13 a0c8 (0) a1c8 (0) a330 (0) a327 (0)\n005 5 a970 a8b5 a8ff a8f4 | 7 aaf0 (0) ab71 (0) ab3f (0) a970 (0)\n============ DEPTH: 6 ==========================================\n006 1 acee | 1 acee (0)\n007 1 aeb4 | 1 aeb4 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"af02c2f471e96ab8defbd229215695b95e64f7c78b145b6793a238961f556fbf","private_key":"db442bd6d5c398b9067accca6107d7b8e10ba8c679a04e038cbc5a31c15cb44a","name":"node_af02c2f471e96ab8defbd229215695b95e64f7c78b145b6793a238961f556fbf","services":["bzz","pss"],"enable_msg_events":true,"port":36073},"up":true}},{"node":{"info":{"id":"56ca9dd846a58a0ffa7b49a88aad559a338ba535a6f738468b8f146c97890cb2","name":"node_56ca9dd846a58a0ffa7b49a88aad559a338ba535a6f738468b8f146c97890cb2","enode":"enode://3977a7e2abfbb0b874ef30206cf7ae8dbd7ff49318570256ed3a8f50d5185bd2aa2c0a0b605e3b0983036e397760f8b6825426e1854b934902f881f1f2d5177b@127.0.0.1:0","enr":"0xf88fb840deafd8851984faee193023cc0f9b9afc4230fec5d8853a822d9f3af256ffd26c7c696165cdd9fa3bef3492bd9393b312bbb433aa86fcfbdf387c2e4d333607250183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1033977a7e2abfbb0b874ef30206cf7ae8dbd7ff49318570256ed3a8f50d5185bd2","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"Vsqd2Ealig/6e0moiq1VmjOLpTWm9zhGi48UbJeJDLI=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 56ca9d\npopulation: 27 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 f645 f2b4 af02 | 130 c74d (0) c603 (0) c6a8 (0) c42e (0)\n001 6 0e80 0e2b 1686 1049 | 65 025d (0) 0314 (0) 035f (0) 0111 (0)\n002 3 60c5 79e5 7d16 | 26 6b4e (0) 68cb (0) 6e7f (0) 6c01 (0)\n003 5 43c9 43d4 4d38 48de | 19 46bf (0) 44ad (0) 447a (0) 447c (0)\n004 5 5814 5ac0 5a8b 5d82 | 10 5c37 (0) 5c7c (0) 5d82 (0) 5ff0 (0)\n005 3 52a8 50c1 5144 | 3 52a8 (0) 5144 (0) 50c1 (0)\n============ DEPTH: 6 ==========================================\n006 1 5538 | 1 5538 (0)\n007 0 | 0\n008 1 5663 | 1 5663 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"56ca9dd846a58a0ffa7b49a88aad559a338ba535a6f738468b8f146c97890cb2","private_key":"4b58bf70006ecc4c786de6a7e24d312dbe2dd18a5c61cd2255e343b02f20bb24","name":"node_56ca9dd846a58a0ffa7b49a88aad559a338ba535a6f738468b8f146c97890cb2","services":["bzz","pss"],"enable_msg_events":true,"port":33231},"up":true}},{"node":{"info":{"id":"26acc3c373c29150af30bbc9264d0c44c7c606ff7377399ddf844635e97afcfa","name":"node_26acc3c373c29150af30bbc9264d0c44c7c606ff7377399ddf844635e97afcfa","enode":"enode://d555fe464791f46530284107d275f268600ac4b18c0cd90ff85c6b7c0af0050a8b42cf6e631500f750737be9621ba85fbbaab4b8ecc7dcb0dbb7d4c3bf45c066@127.0.0.1:0","enr":"0xf88fb84073b57f889ad85e60f317292c360ebdf010410087fdcdfe33202d93acab67d7f515b57d160ff1e3f046026e03970154f616c655ad78ebf85a16d3534d07e64bd60183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102d555fe464791f46530284107d275f268600ac4b18c0cd90ff85c6b7c0af0050a","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"JqzDw3PCkVCvMLvJJk0MRMfGBv9zdzmd34RGNel6/Po=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 26acc3\npopulation: 28 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 9f0e 8f9a a2e6 a4ee | 130 9257 (0) 93c0 (0) 93ea (0) 97da (0)\n001 5 6d3c 60c5 7d16 5ac0 | 61 6b4e (0) 68cb (0) 6e7f (0) 6c01 (0)\n002 4 0e80 0e2b 1bd5 1049 | 37 012b (0) 0111 (0) 0191 (0) 025d (0)\n003 3 3980 32ff 3188 | 17 36b9 (0) 3728 (0) 3411 (0) 30fe (0)\n004 7 298a 2a50 2fd2 2e65 | 7 298a (0) 2a50 (0) 2fd2 (0) 2e65 (0)\n============ DEPTH: 5 ==========================================\n005 0 | 0\n006 2 24f8 244c | 2 244c (0) 24f8 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 1 26ab | 1 26ab (0)\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"26acc3c373c29150af30bbc9264d0c44c7c606ff7377399ddf844635e97afcfa","private_key":"4db62bb95214bf5041d1bcd4a73488fcdaaa5616fe4e911e2621181956f3deda","name":"node_26acc3c373c29150af30bbc9264d0c44c7c606ff7377399ddf844635e97afcfa","services":["bzz","pss"],"enable_msg_events":true,"port":35363},"up":true}},{"node":{"info":{"id":"fa240411bc4f3e44dfca3faedd112c7743a67b522a910bc99696ef0b31732ee2","name":"node_fa240411bc4f3e44dfca3faedd112c7743a67b522a910bc99696ef0b31732ee2","enode":"enode://5d3165b8480aceb9a29a4b61b3ab32269c0528b62f0c58315dec25b4567cffff0e9a6e0832a40f555b1f37d268bf1591a93b1fe8858c54d1c41b0786a5f82ed4@127.0.0.1:0","enr":"0xf88fb840384d6f2d0e7aeea7e17230d68adf6c986544d7e0ddb16a747f8ca2ff2e208b65632e299c8bcee387db034659bc60d6fe20be94eed139b54e1c33fea4f0b664c20183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1025d3165b8480aceb9a29a4b61b3ab32269c0528b62f0c58315dec25b4567cffff","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"+iQEEbxPPkTfyj+u3REsd0Ome1IqkQvJlpbvCzFzLuI=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: fa2404\npopulation: 33 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 79e5 7d16 1049 2ddf | 126 648a (0) 67f3 (0) 6795 (0) 6790 (0)\n001 8 8f9a bbaf b8e1 b5ea | 75 9257 (0) 93c0 (0) 93ea (0) 97da (0)\n002 6 d408 ddb8 d9cf c190 | 27 c603 (0) c6a8 (0) c74d (0) c534 (0)\n003 4 e0a0 ef99 eebd ec90 | 14 e471 (0) e681 (0) e64d (0) e2d3 (0)\n004 5 f756 f6c0 f645 f305 | 7 f756 (0) f6c0 (0) f645 (0) f1ed (0)\n005 3 fc51 fc39 feb3 | 4 fc39 (0) fc51 (0) ff75 (0) feb3 (0)\n============ DEPTH: 6 ==========================================\n006 2 f8ff f9de | 2 f8ff (0) f9de (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"fa240411bc4f3e44dfca3faedd112c7743a67b522a910bc99696ef0b31732ee2","private_key":"211a1e252e6faf64120c7e80193de1fb9c8574e8839437085db6624c65afb2c3","name":"node_fa240411bc4f3e44dfca3faedd112c7743a67b522a910bc99696ef0b31732ee2","services":["bzz","pss"],"enable_msg_events":true,"port":40123},"up":true}},{"node":{"info":{"id":"f2b49a2247c9c5e8f6f755834a37fe5c17f208f994878e14b7001e404f52e125","name":"node_f2b49a2247c9c5e8f6f755834a37fe5c17f208f994878e14b7001e404f52e125","enode":"enode://d7318bb4df307ed03251fed0ebc0b514ff6ce6b2953bfc2f41eebd1ed2cc03d3290b1abe8ac51e22661fa91f8cfcacc7e7bdb1405e5cac4cdbf56475483daa9b@127.0.0.1:0","enr":"0xf88fb840f435115eab43ea3daa96fcf671263bd99032cf92a48d2a4331d533663d34cd32064567c172c0bceb4e8160e59433053e1b2b558538748fbda084fd167120e7690183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103d7318bb4df307ed03251fed0ebc0b514ff6ce6b2953bfc2f41eebd1ed2cc03d3","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"8rSaIkfJxej291WDSjf+XBfyCPmUh44UtwAeQE9S4SU=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: f2b49a\npopulation: 37 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 7d16 5ac0 56ca 2e65 | 126 0191 (0) 012b (0) 0111 (0) 0314 (0)\n001 10 9948 8f9a a742 a4ee | 75 9c21 (0) 9c8e (0) 9ca1 (0) 9ec8 (0)\n002 7 cd6c c9c3 c190 d9cf | 27 ddb8 (0) dbd4 (0) da36 (0) dad0 (0)\n003 2 e0a0 ec90 | 14 e64d (0) e681 (0) e471 (0) e277 (0)\n004 6 feb3 fc39 fc51 f8ff | 7 fc39 (0) fc51 (0) ff75 (0) feb3 (0)\n005 3 f756 f6c0 f645 | 3 f756 (0) f6c0 (0) f645 (0)\n006 1 f1ed | 1 f1ed (0)\n============ DEPTH: 7 ==========================================\n007 1 f305 | 1 f305 (0)\n008 1 f215 | 1 f215 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"f2b49a2247c9c5e8f6f755834a37fe5c17f208f994878e14b7001e404f52e125","private_key":"6f4c1a8084c43a09372f46f2d9c9d47e946032ad4494c25e53ab442810dfb7fc","name":"node_f2b49a2247c9c5e8f6f755834a37fe5c17f208f994878e14b7001e404f52e125","services":["bzz","pss"],"enable_msg_events":true,"port":46219},"up":true}},{"node":{"info":{"id":"b5eab4869b4cb65bdc1e5cab45c03016d202f9f5b668be50066451cfcf9ef299","name":"node_b5eab4869b4cb65bdc1e5cab45c03016d202f9f5b668be50066451cfcf9ef299","enode":"enode://f2200c6d168fd4bf3f5ed5ac408ee95b95a35365e8c342dcfcba922300690d24ca30314c5d635505791f54e2deded324817ffe3129c898cb4a426adf595eb724@127.0.0.1:0","enr":"0xf88fb84021725022f3ac59f570e89280f9dd63209a73639e93974cd54845b965aa169be11392f71f7989121c8b9ba986bcb11b10faa14be90ddaa9ee8a129f76f3e33d360183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102f2200c6d168fd4bf3f5ed5ac408ee95b95a35365e8c342dcfcba922300690d24","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"teq0hptMtlvcHlyrRcAwFtIC+fW2aL5QBmRRz8+e8pk=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: b5eab4\npopulation: 25 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 1686 0e80 24f8 79e5 | 126 1fd0 (0) 1dec (0) 1dc0 (0) 18e0 (0)\n001 2 fa24 f2b4 | 55 c74d (0) c6a8 (0) c603 (0) c42e (0)\n002 3 9948 8e28 8f9a | 38 9ec8 (0) 9f0e (0) 9f7d (0) 9c21 (0)\n003 5 af02 a4ee a742 a2e6 | 23 aaf0 (0) ab71 (0) ab3f (0) a970 (0)\n004 6 bfc7 be68 bea1 ba91 | 8 bdc5 (0) bcf8 (0) be68 (0) bea1 (0)\n005 1 b3f9 | 1 b3f9 (0)\n============ DEPTH: 6 ==========================================\n006 3 b78f b659 b6df | 3 b78f (0) b659 (0) b6df (0)\n007 1 b4a1 | 1 b4a1 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"b5eab4869b4cb65bdc1e5cab45c03016d202f9f5b668be50066451cfcf9ef299","private_key":"481278a076dd22f579d2e3224ee46c4efb0adf98a25587e4047dbc41a531583d","name":"node_b5eab4869b4cb65bdc1e5cab45c03016d202f9f5b668be50066451cfcf9ef299","services":["bzz","pss"],"enable_msg_events":true,"port":37951},"up":true}},{"node":{"info":{"id":"79e5c6c6d78c88c579003cda044882ecb04520fbad1f5feadbe7b6d23fe183c8","name":"node_79e5c6c6d78c88c579003cda044882ecb04520fbad1f5feadbe7b6d23fe183c8","enode":"enode://075d1af75650c9de403f935ba958bd36f2dcb4f54812a57032e064eacf6791b2fadabd15082534259be0de378b8ec19b5c5bece38fd2f85f6d61f696d4ac14e4@127.0.0.1:0","enr":"0xf88fb8403597b43e61519416d408305834e8a89ab71a0a61b3f4f053f11f5968299862341d5ec75769bbb4cf7480c8bef7b24e1b8e3aff66288460abd1ed368813e91d150183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102075d1af75650c9de403f935ba958bd36f2dcb4f54812a57032e064eacf6791b2","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"eeXGxteMiMV5ADzaBEiC7LBFIPutH1/q2+e20j/hg8g=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 79e5c6\npopulation: 29 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 fa24 8f9a a327 b5ea | 130 dbd4 (0) da36 (0) dad0 (0) d959 (0)\n001 4 0e80 2fd2 2c80 2ddf | 65 1dc0 (0) 1dec (0) 1fd0 (0) 18e0 (0)\n002 7 482e 48de 43d4 43c9 | 35 4cec (0) 4d91 (0) 4d38 (0) 4b79 (0)\n003 4 60c5 68cb 6d3c 6dd3 | 13 648a (0) 6758 (0) 6790 (0) 6795 (0)\n004 2 7049 70f6 | 4 741a (0) 7660 (0) 7049 (0) 70f6 (0)\n005 5 7e47 7ce7 7c7c 7c46 | 5 7e47 (0) 7ce7 (0) 7c7c (0) 7c46 (0)\n============ DEPTH: 6 ==========================================\n006 0 | 0\n007 2 7850 7895 | 2 7895 (0) 7850 (0)\n008 1 7933 | 1 7933 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"79e5c6c6d78c88c579003cda044882ecb04520fbad1f5feadbe7b6d23fe183c8","private_key":"9457ffd6b462dc1c0231d33b4fb9815c915a5ece2c906083d0545bae269b1838","name":"node_79e5c6c6d78c88c579003cda044882ecb04520fbad1f5feadbe7b6d23fe183c8","services":["bzz","pss"],"enable_msg_events":true,"port":44929},"up":true}},{"node":{"info":{"id":"8f9aa2cd33d18e7cb4494d11a7532c97eb4a1cae172b2165c26ae4ed24887c0d","name":"node_8f9aa2cd33d18e7cb4494d11a7532c97eb4a1cae172b2165c26ae4ed24887c0d","enode":"enode://0ba5f5e13ed3f24bcc90ac6187a06331385aa18072a6353970a149cb65da7f8408e3bd27fdc0f2d790ec7a2c5a4f5c645ef4a150cb4fdde987537a60c37142c0@127.0.0.1:0","enr":"0xf88fb8403e7501b357ca709034505ffc033677386293dabf95f8c427892c5366a7ae2e0f69e68bf5b49160bf671794419a71fdbdd1334e34f74f68f77575078e1e3c90f10183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1020ba5f5e13ed3f24bcc90ac6187a06331385aa18072a6353970a149cb65da7f84","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"j5qizTPRjny0SU0Rp1Msl+tKHK4XKyFlwmrk7SSIfA0=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 8f9aa2\npopulation: 36 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 26ac 2ddf 5ac0 43d4 | 126 1fd0 (0) 1dc0 (0) 1dec (0) 1add (0)\n001 7 d700 d9cf ddb8 fa24 | 55 da36 (0) dad0 (0) dbd4 (0) d959 (0)\n002 9 a8f4 af02 a2a1 a2e6 | 37 aaf0 (0) ab71 (0) ab3f (0) a970 (0)\n003 4 955d 9ca1 9959 9b8e | 17 9ec8 (0) 9f0e (0) 9f7d (0) 9c21 (0)\n004 3 8073 834f 837f | 12 86d6 (0) 87a3 (0) 8402 (0) 84a9 (0)\n005 2 8b43 8854 | 3 8b43 (0) 8862 (0) 8854 (0)\n006 2 8cc3 8d19 | 2 8cc3 (0) 8d19 (0)\n============ DEPTH: 7 ==========================================\n007 3 8ea2 8e7b 8e28 | 3 8ea2 (0) 8e7b (0) 8e28 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"8f9aa2cd33d18e7cb4494d11a7532c97eb4a1cae172b2165c26ae4ed24887c0d","private_key":"f83575bfe6442b53eb4d8c355e1200c4401c098583e660934bf9987f9300e6fc","name":"node_8f9aa2cd33d18e7cb4494d11a7532c97eb4a1cae172b2165c26ae4ed24887c0d","services":["bzz","pss"],"enable_msg_events":true,"port":35903},"up":true}},{"node":{"info":{"id":"2ddffddbf452f0c9268058a739f5757fb90281cbfd31bd6f760acc3392fec12a","name":"node_2ddffddbf452f0c9268058a739f5757fb90281cbfd31bd6f760acc3392fec12a","enode":"enode://29e1ab89b8c45319b773556c3422348d68748120f103b1806eb3fa94fb57117771a4e9811a97855b4076957253cfda4e1d7e7d5548464708fa7ec7107eec12d5@127.0.0.1:0","enr":"0xf88fb840979111f3046ade721c9e294e8d0656436a86fbc0cf8b2838b30c39d61a12386f5d18e6f92931a25b2b78f7286b8d8ba013719c6b55a32cb5f035f4668f5a38310183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10329e1ab89b8c45319b773556c3422348d68748120f103b1806eb3fa94fb571177","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"Ld/92/RS8MkmgFinOfV1f7kCgcv9Mb1vdgrMM5L+wSo=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 2ddffd\npopulation: 25 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 fa24 f2b4 bbaf 8f9a | 130 da36 (0) dad0 (0) dbd4 (0) d959 (0)\n001 3 5ff0 6dd3 79e5 | 61 4cec (0) 4d91 (0) 4d38 (0) 4b79 (0)\n002 5 1686 1049 07f5 0e2b | 37 1fd0 (0) 1dc0 (0) 1dec (0) 18e0 (0)\n003 4 3980 3411 3188 32ff | 17 36b9 (0) 3728 (0) 3411 (0) 30fe (0)\n004 3 244c 24f8 26ac | 4 244c (0) 24f8 (0) 26ab (0) 26ac (0)\n005 2 2a50 298a | 2 2a50 (0) 298a (0)\n006 2 2e65 2fd2 | 2 2fd2 (0) 2e65 (0)\n============ DEPTH: 7 ==========================================\n007 2 2c85 2c80 | 2 2c85 (0) 2c80 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"2ddffddbf452f0c9268058a739f5757fb90281cbfd31bd6f760acc3392fec12a","private_key":"3c16c760b1da414e3f0702e51bb7b991c9f8f24d6780298e7f1c4a2211e65148","name":"node_2ddffddbf452f0c9268058a739f5757fb90281cbfd31bd6f760acc3392fec12a","services":["bzz","pss"],"enable_msg_events":true,"port":37059},"up":true}},{"node":{"info":{"id":"bbafac5ba5915db3c80e28b249cad260b9b5dad1f728063c48fa8f61d7556e17","name":"node_bbafac5ba5915db3c80e28b249cad260b9b5dad1f728063c48fa8f61d7556e17","enode":"enode://f7560694a563f7b8b45223d669cb0c3bb40c7d6d3c2c7a02edb265933a0cea0746f94f112043dd9614675b71e6aabda899b082aa80ce92a1c4bc2815f48d70ca@127.0.0.1:0","enr":"0xf88fb840dc4fa4b1749e43011079de3d46e7621a199adbd688f08a6430dac3a3a5a968d64ffad4738b308452154a2d6bbf4d88aea49250c65e68297d8e084c6992e98c910183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102f7560694a563f7b8b45223d669cb0c3bb40c7d6d3c2c7a02edb265933a0cea07","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"u6+sW6WRXbPIDiiyScrSYLm12tH3KAY8SPqPYddVbhc=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: bbafac\npopulation: 30 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 5ac0 6dd3 2ddf | 126 5c37 (0) 5c7c (0) 5d82 (0) 5ff0 (0)\n001 4 ec90 fa24 feb3 f2b4 | 55 dbd4 (0) da36 (0) dad0 (0) d959 (0)\n002 5 955d 9f7d 9b8e 8e28 | 38 9ec8 (0) 9f0e (0) 9f7d (0) 9c21 (0)\n003 6 af02 a4ee a742 a2a1 | 23 aaf0 (0) ab71 (0) ab3f (0) a970 (0)\n004 5 b3f9 b6df b78f b4a1 | 6 b3f9 (0) b78f (0) b659 (0) b6df (0)\n005 5 bdc5 bcf8 bfc7 be68 | 5 bdc5 (0) bcf8 (0) bfc7 (0) be68 (0)\n============ DEPTH: 6 ==========================================\n006 1 b8e1 | 1 b8e1 (0)\n007 1 ba91 | 1 ba91 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"bbafac5ba5915db3c80e28b249cad260b9b5dad1f728063c48fa8f61d7556e17","private_key":"92e3be78001b291633af182ae0eaa04e18135ff78f3f44ea1807ade09e09f9c4","name":"node_bbafac5ba5915db3c80e28b249cad260b9b5dad1f728063c48fa8f61d7556e17","services":["bzz","pss"],"enable_msg_events":true,"port":34263},"up":true}},{"node":{"info":{"id":"a32749dc4e134a4fbb038618c58a7c05bbbaa06f1436de3754341af86402581b","name":"node_a32749dc4e134a4fbb038618c58a7c05bbbaa06f1436de3754341af86402581b","enode":"enode://095fd8d08d7c8f838e4b0a8ae5d5dbc252f1f8fa2f4909b00c4e1a76abd7e97f55201ffac074124ec2de620f242c33f3a5a6716f0105311320328bfb71b37613@127.0.0.1:0","enr":"0xf88fb84023807c617fe27431d11170d14386c718cb44cc0bc380888e41340bc3a6b2fed73035c05d36ab2f0c51da29e46bd4188c4e1a10d987249dad7fa69d4e4a2ee2d70183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103095fd8d08d7c8f838e4b0a8ae5d5dbc252f1f8fa2f4909b00c4e1a76abd7e97f","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"oydJ3E4TSk+7A4YYxYp8Bbu6oG8UNt43VDQa+GQCWBs=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: a32749\npopulation: 33 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 2e65 43d4 79e5 6dd3 | 126 5c37 (0) 5c7c (0) 5d82 (0) 5ff0 (0)\n001 6 d9cf c9c3 c190 f1ed | 55 c74d (0) c603 (0) c6a8 (0) c534 (0)\n002 5 9b8e 9959 9f7d 9ca1 | 38 9ec8 (0) 9f0e (0) 9f7d (0) 9c21 (0)\n003 4 b4a1 b5ea b8e1 bbaf | 14 b3f9 (0) b78f (0) b659 (0) b6df (0)\n004 4 af02 a8ff a8f4 ab3f | 10 aaf0 (0) ab71 (0) ab3f (0) a970 (0)\n005 5 a5ac a505 a4ee a7a8 | 7 a505 (0) a5ac (0) a4ee (0) a616 (0)\n006 2 a0c8 a1c8 | 2 a0c8 (0) a1c8 (0)\n============ DEPTH: 7 ==========================================\n007 2 a2a1 a2e6 | 2 a2a1 (0) a2e6 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 1 a330 | 1 a330 (0)\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"a32749dc4e134a4fbb038618c58a7c05bbbaa06f1436de3754341af86402581b","private_key":"abf141d0f41d519d2f0bcfd4e1cab0e3d3b7f49bb2524ddfbcb4ed8087b83b39","name":"node_a32749dc4e134a4fbb038618c58a7c05bbbaa06f1436de3754341af86402581b","services":["bzz","pss"],"enable_msg_events":true,"port":42795},"up":true}},{"node":{"info":{"id":"b8e1a8622c256ef29acd52df7b3ace50820fb1a147716165ff862fdc973a48cd","name":"node_b8e1a8622c256ef29acd52df7b3ace50820fb1a147716165ff862fdc973a48cd","enode":"enode://f04605b84e637cfebd8976e50b34cb2677a4314ffad3de5f827b256c5789bc9395bca075fdc7d093933f7a36b0086da67b41726ecd01f12473dc86a64d648d30@127.0.0.1:0","enr":"0xf88fb8407a74507655e5e4bccef3b4f4be2094d2dfa1f734606fc6fea7a7d5534117bdd212b9fbbc1b5190a3217e08c13dc5b1d5e33d16540dd469bccff2b61d00f169380183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102f04605b84e637cfebd8976e50b34cb2677a4314ffad3de5f827b256c5789bc93","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"uOGoYiwlbvKazVLfezrOUIIPsaFHcWFl/4Yv3Jc6SM0=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: b8e1a8\npopulation: 41 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 6d3c 68cb 0e80 24f8 | 126 5c37 (0) 5c7c (0) 5d82 (0) 5ff0 (0)\n001 9 d700 d408 ddb8 d9cf | 55 dbd4 (0) da36 (0) dad0 (0) d959 (0)\n002 5 9948 955d 8d19 8e28 | 38 9c21 (0) 9c8e (0) 9ca1 (0) 9ec8 (0)\n003 9 af02 a8ff a505 a7a8 | 23 aaf0 (0) ab71 (0) ab3f (0) a970 (0)\n004 5 b3f9 b78f b6df b4a1 | 6 b3f9 (0) b78f (0) b659 (0) b6df (0)\n005 5 bcf8 bdc5 bfc7 be68 | 5 bcf8 (0) bdc5 (0) bfc7 (0) be68 (0)\n============ DEPTH: 6 ==========================================\n006 2 ba91 bbaf | 2 ba91 (0) bbaf (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"b8e1a8622c256ef29acd52df7b3ace50820fb1a147716165ff862fdc973a48cd","private_key":"16e0a5b28dd4eef0429cfee2457fefee326e70769d72a08220c987d895948535","name":"node_b8e1a8622c256ef29acd52df7b3ace50820fb1a147716165ff862fdc973a48cd","services":["bzz","pss"],"enable_msg_events":true,"port":34709},"up":true}},{"node":{"info":{"id":"2c8042517dfeaa01586e91e491dd4154fb24c0d84fedb0404b9d5136f60da1d9","name":"node_2c8042517dfeaa01586e91e491dd4154fb24c0d84fedb0404b9d5136f60da1d9","enode":"enode://691ca9c06e10ad9e54772ff48bc4ae919f121bdc7c6ae4b100351ac29f5b9c0067cd758acd4b0e25f67dfa21718cc34aeffd02b40dff4f52ff37acbd00fd7501@127.0.0.1:0","enr":"0xf88fb8406bb758fd0d287e48c99c72280182a42c8e1fff4b42972876eb7d7d79532702475aa04a531f8efafd3652264038cd3910f2da1b312b91e88345a53b2ff877cc8a0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103691ca9c06e10ad9e54772ff48bc4ae919f121bdc7c6ae4b100351ac29f5b9c00","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"LIBCUX3+qgFYbpHkkd1BVPskwNhP7bBAS51RNvYNodk=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 2c8042\npopulation: 28 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 c534 f2b4 9f0e a742 | 130 ddb8 (0) dbd4 (0) da36 (0) dad0 (0)\n001 5 56ca 43d4 68cb 6dd3 | 61 5c37 (0) 5c7c (0) 5d82 (0) 5ff0 (0)\n002 5 1686 1049 07f5 0e2b | 37 1dc0 (0) 1dec (0) 1fd0 (0) 18e0 (0)\n003 3 3411 32ff 3980 | 17 36b9 (0) 3728 (0) 3411 (0) 30fe (0)\n004 4 24f8 244c 26ab 26ac | 4 26ab (0) 26ac (0) 244c (0) 24f8 (0)\n005 2 2a50 298a | 2 2a50 (0) 298a (0)\n006 2 2fd2 2e65 | 2 2fd2 (0) 2e65 (0)\n============ DEPTH: 7 ==========================================\n007 1 2ddf | 1 2ddf (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 1 2c85 | 1 2c85 (0)\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"2c8042517dfeaa01586e91e491dd4154fb24c0d84fedb0404b9d5136f60da1d9","private_key":"c3f87c0c78bb12a86da6ad7d36c7291a3895a98586e6e8e099b279f077ffd478","name":"node_2c8042517dfeaa01586e91e491dd4154fb24c0d84fedb0404b9d5136f60da1d9","services":["bzz","pss"],"enable_msg_events":true,"port":41807},"up":true}},{"node":{"info":{"id":"a742e8502c619703ce87890110f908bde32b59dc61d77a247759e5d0056e0c94","name":"node_a742e8502c619703ce87890110f908bde32b59dc61d77a247759e5d0056e0c94","enode":"enode://1f3ff2039504020c5625d4fbe5c447e27cfb3016aa9ec0e1837d44eaa2fe4172b2731d4ff02a80394e7e3d0f4a32f19cc239a3972f10eab45bf2c69d9d8c65ee@127.0.0.1:0","enr":"0xf88fb840f01697c24bc9fee368002b25d4480ee743229f9cbdc31dbaa122bca564f7c45b35b737cd14a1258f4e4eaded287d70183cc0d4584cd0b1cba3a7f55096fa87a30183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1021f3ff2039504020c5625d4fbe5c447e27cfb3016aa9ec0e1837d44eaa2fe4172","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"p0LoUCxhlwPOh4kBEPkIveMrWdxh13okd1nl0AVuDJQ=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: a742e8\npopulation: 30 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 43d4 1070 0e80 2c80 | 126 5c37 (0) 5c7c (0) 5d82 (0) 5ff0 (0)\n001 4 ec90 f2b4 f645 feb3 | 55 ddb8 (0) dbd4 (0) da36 (0) dad0 (0)\n002 3 9c21 8e28 8f9a | 38 9ec8 (0) 9f0e (0) 9f7d (0) 9c21 (0)\n003 5 b4a1 b5ea bfc7 b8e1 | 14 b3f9 (0) b78f (0) b659 (0) b6df (0)\n004 4 a8b5 a8f4 a8ff af02 | 10 acee (0) aeb4 (0) af02 (0) aaf0 (0)\n005 4 a1c8 a2a1 a2e6 a327 | 6 a0c8 (0) a1c8 (0) a2a1 (0) a2e6 (0)\n006 3 a505 a5ac a4ee | 3 a505 (0) a5ac (0) a4ee (0)\n============ DEPTH: 7 ==========================================\n007 2 a616 a606 | 2 a616 (0) a606 (0)\n008 1 a7a8 | 1 a7a8 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"a742e8502c619703ce87890110f908bde32b59dc61d77a247759e5d0056e0c94","private_key":"6f1c95c10b82cf6a4a6a6ffba536b6e4d17dca7e822de4e3b740149684932d39","name":"node_a742e8502c619703ce87890110f908bde32b59dc61d77a247759e5d0056e0c94","services":["bzz","pss"],"enable_msg_events":true,"port":37625},"up":true}},{"node":{"info":{"id":"feb3bc17ee7369a4fa9889d9250fed3c1257c70916871996e6eabd374dd8dc2e","name":"node_feb3bc17ee7369a4fa9889d9250fed3c1257c70916871996e6eabd374dd8dc2e","enode":"enode://27ac651910b9394ef60deb8ececf68b82b3f2bff98cf45cc6dab2a0a0a271bf8f5cd18af48ec4a9eb79821487687a0dfb97af07de26b237f0194f1d1c84587f1@127.0.0.1:0","enr":"0xf88fb840dff98a9839c85f4ca1a944e19e2913b5a74f45e9701a6d6887f3b6fbdeb63db6104a51388fa37505749037788d83e0ed7d3dc9f9f37d696abb5aab32f13633200183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10327ac651910b9394ef60deb8ececf68b82b3f2bff98cf45cc6dab2a0a0a271bf8","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"/rO8F+5zaaT6mInZJQ/tPBJXxwkWhxmW5uq9N03Y3C4=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: feb3bc\npopulation: 27 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 2e65 43d4 68cb 6dd3 | 126 1dc0 (0) 1dec (0) 1fd0 (0) 18e0 (0)\n001 5 8f9a bbaf b8e1 a8f4 | 75 9948 (0) 9959 (0) 9b8e (0) 9ec8 (0)\n002 5 c9c3 c190 ddb8 d700 | 27 ddb8 (0) dbd4 (0) da36 (0) dad0 (0)\n003 3 ec90 e471 e0a0 | 14 e64d (0) e681 (0) e471 (0) e277 (0)\n004 5 f1ed f2b4 f756 f645 | 7 f756 (0) f6c0 (0) f645 (0) f1ed (0)\n005 2 f9de fa24 | 3 f8ff (0) f9de (0) fa24 (0)\n============ DEPTH: 6 ==========================================\n006 2 fc39 fc51 | 2 fc51 (0) fc39 (0)\n007 1 ff75 | 1 ff75 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"feb3bc17ee7369a4fa9889d9250fed3c1257c70916871996e6eabd374dd8dc2e","private_key":"0612d46e6c5fe2d816f3fcc01eea18407ea659f41290d153e08a780a5313e54c","name":"node_feb3bc17ee7369a4fa9889d9250fed3c1257c70916871996e6eabd374dd8dc2e","services":["bzz","pss"],"enable_msg_events":true,"port":36801},"up":true}},{"node":{"info":{"id":"6dd3ac0fd9a04a2ce75875c683d135e52eaa1670cb55e78711620712e60fde47","name":"node_6dd3ac0fd9a04a2ce75875c683d135e52eaa1670cb55e78711620712e60fde47","enode":"enode://33d552be8155690e7cbe2739fa74ca6e83ead5035cd9a8e26d187ef54b14ca924e3d5485f7bb095dc233d74758321997fe1ae52b5ce5dc070eb0589816b09442@127.0.0.1:0","enr":"0xf88fb8409b453570d61397d255334db062ee118d6af0cc79fd50cda1bb3830f187d56f506eaa18ca5d6dc753b0cf201bfe1614f777a497a0713d90ed07b3bf9f76920e7c0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10233d552be8155690e7cbe2739fa74ca6e83ead5035cd9a8e26d187ef54b14ca92","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"bdOsD9mgSiznWHXGg9E15S6qFnDLVeeHEWIHEuYP3kc=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 6dd3ac\npopulation: 28 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 8f9a bbaf a8f4 a327 | 130 9948 (0) 9959 (0) 9b8e (0) 9ec8 (0)\n001 4 0e80 2ddf 2c80 2e65 | 65 1fd0 (0) 1dec (0) 1dc0 (0) 18e0 (0)\n002 6 5663 5814 5ff0 5d82 | 35 5c37 (0) 5c7c (0) 5d82 (0) 5ff0 (0)\n003 4 70f6 7d16 7850 79e5 | 13 741a (0) 7660 (0) 7049 (0) 70f6 (0)\n004 3 6758 67f3 60c5 | 6 648a (0) 6758 (0) 6790 (0) 6795 (0)\n005 2 6b4e 68cb | 2 6b4e (0) 68cb (0)\n006 1 6e7f | 1 6e7f (0)\n007 1 6c01 | 1 6c01 (0)\n============ DEPTH: 8 ==========================================\n008 2 6d3c 6d5e | 2 6d5e (0) 6d3c (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"6dd3ac0fd9a04a2ce75875c683d135e52eaa1670cb55e78711620712e60fde47","private_key":"798b1133c83f1bd8708da776e24e1068611422abe705d8209d07e88f4ae07873","name":"node_6dd3ac0fd9a04a2ce75875c683d135e52eaa1670cb55e78711620712e60fde47","services":["bzz","pss"],"enable_msg_events":true,"port":35411},"up":true}},{"node":{"info":{"id":"2e65d05648b798fafbc9bb582c05e6f8f891131260e8c90ca725ddcbc823f315","name":"node_2e65d05648b798fafbc9bb582c05e6f8f891131260e8c90ca725ddcbc823f315","enode":"enode://224027d2af542674e07dc64ec477cb324c9288d5b917bd302a8b994fb56effd5d4134f71de9dbe75d043d510c3df39b87f5590dd5e53d1512969e65bfc9debad@127.0.0.1:0","enr":"0xf88fb840cfb76c5419d68cf2f3a24256e9324a22f66fc4b5580a187070e857ba42d18a8921c69ca44e1570e72d7281e2ef3c9c2604a2ca5089bb11f8142664ad4552a2970183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103224027d2af542674e07dc64ec477cb324c9288d5b917bd302a8b994fb56effd5","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"LmXQVki3mPr7ybtYLAXm+PiRExJg6MkMpyXdy8gj8xU=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 2e65d0\npopulation: 29 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 ec90 f2b4 feb3 955d | 130 dbd4 (0) da36 (0) dad0 (0) d959 (0)\n001 2 43d4 6dd3 | 61 5c37 (0) 5c7c (0) 5d82 (0) 5ff0 (0)\n002 6 0e80 19ea 1b1d 1070 | 37 1484 (0) 140d (0) 1784 (0) 1686 (0)\n003 5 3980 397a 3411 3188 | 17 3f31 (0) 3c5b (0) 3cab (0) 3a62 (0)\n004 4 26ab 26ac 244c 24f8 | 4 26ab (0) 26ac (0) 244c (0) 24f8 (0)\n005 2 2a50 298a | 2 2a50 (0) 298a (0)\n============ DEPTH: 6 ==========================================\n006 3 2ddf 2c85 2c80 | 3 2ddf (0) 2c85 (0) 2c80 (0)\n007 1 2fd2 | 1 2fd2 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"2e65d05648b798fafbc9bb582c05e6f8f891131260e8c90ca725ddcbc823f315","private_key":"2b229760916c74b6ac5f23ef8180077064de49ec26982a14a09a3d1382e474b0","name":"node_2e65d05648b798fafbc9bb582c05e6f8f891131260e8c90ca725ddcbc823f315","services":["bzz","pss"],"enable_msg_events":true,"port":34851},"up":true}},{"node":{"info":{"id":"43d43e9ebcbceb4830fc1d2d5024650b90698306bbd2c4d0b4841a1a8fd09c93","name":"node_43d43e9ebcbceb4830fc1d2d5024650b90698306bbd2c4d0b4841a1a8fd09c93","enode":"enode://e7390b07e9257a295e97c15d41b54e09e2dcdfc3b9fc73b2b0f2e63a0713c9ded792f3a5ee9d6938d4f429c961b091715297661b560bac8df0449449c96346f6@127.0.0.1:0","enr":"0xf88fb8406a94ea3a25ea5935505a1d5b3df6880b4b51723a453f3fe497c93e6dddf6efed7794b6528b6c6e10790083a3893217933ff7b93745ca7a04b03e78564462c9fb0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102e7390b07e9257a295e97c15d41b54e09e2dcdfc3b9fc73b2b0f2e63a0713c9de","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"Q9Q+nry860gw/B0tUCRlC5Bpgwa70sTQtIQaGo/QnJM=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 43d43e\npopulation: 39 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 11 c190 ec90 feb3 955d | 130 da36 (0) dad0 (0) dbd4 (0) d959 (0)\n001 4 0e80 32ff 2c80 2e65 | 65 1dec (0) 1dc0 (0) 1fd0 (0) 18e0 (0)\n002 6 79e5 7895 7d16 6d3c | 26 741a (0) 7660 (0) 7049 (0) 70f6 (0)\n003 6 5663 56ca 5ff0 5d82 | 16 5c37 (0) 5c7c (0) 5d82 (0) 5ff0 (0)\n004 4 4cec 4d38 482e 48de | 10 4cec (0) 4d91 (0) 4d38 (0) 4b79 (0)\n005 4 46bf 447c 447a 44ad | 4 46bf (0) 447a (0) 447c (0) 44ad (0)\n006 2 4005 402c | 2 4005 (0) 402c (0)\n============ DEPTH: 7 ==========================================\n007 0 | 0\n008 1 435d | 1 435d (0)\n009 0 | 0\n010 0 | 0\n011 1 43c9 | 1 43c9 (0)\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"43d43e9ebcbceb4830fc1d2d5024650b90698306bbd2c4d0b4841a1a8fd09c93","private_key":"705846d6103b8dcde5526942f8da6f2206687604c468de841c1e3556e63e27f4","name":"node_43d43e9ebcbceb4830fc1d2d5024650b90698306bbd2c4d0b4841a1a8fd09c93","services":["bzz","pss"],"enable_msg_events":true,"port":33285},"up":true}},{"node":{"info":{"id":"68cbc4a5313080d5dca8ad34e8bf52a6144e0ff8ef3f795d7ae9d5f644fe2042","name":"node_68cbc4a5313080d5dca8ad34e8bf52a6144e0ff8ef3f795d7ae9d5f644fe2042","enode":"enode://a3d519e4a1788400163f2db9a838b8229a5d176f4b32736cc11d48510f60bfd57fe2b36b773121bed96bb701a34a777b9b0f9f0a6210a11a5267db32c5709c20@127.0.0.1:0","enr":"0xf88fb840b867c36933c9555cfb4f20df50e1fa2d1c86295c58b5348694874b92dcc369053ef0b25782dc4f892f9a7d6250dd1c42582a0f9a87ced83db2af67d0d5459e660183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102a3d519e4a1788400163f2db9a838b8229a5d176f4b32736cc11d48510f60bfd5","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"aMvEpTEwgNXcqK006L9SphROD/jvP3ldeunV9kT+IEI=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 68cbc4\npopulation: 33 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 9 c190 feb3 ec90 b4a1 | 130 84a9 (0) 8402 (0) 87a3 (0) 86d6 (0)\n001 5 3411 2c80 24f8 19ea | 65 3cab (0) 3c5b (0) 3f31 (0) 3a62 (0)\n002 6 5663 5ff0 5814 482e | 35 5c37 (0) 5c7c (0) 5d82 (0) 5ff0 (0)\n003 5 70f6 79e5 7850 7895 | 13 741a (0) 7660 (0) 7049 (0) 70f6 (0)\n004 2 67f3 60c5 | 6 648a (0) 6758 (0) 6795 (0) 6790 (0)\n============ DEPTH: 5 ==========================================\n005 5 6e7f 6c01 6dd3 6d5e | 5 6e7f (0) 6c01 (0) 6dd3 (0) 6d5e (0)\n006 1 6b4e | 1 6b4e (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"68cbc4a5313080d5dca8ad34e8bf52a6144e0ff8ef3f795d7ae9d5f644fe2042","private_key":"8dc0ff9e95b0b85f24142f1082c900c64588c269a697412aabd41e4d80197de9","name":"node_68cbc4a5313080d5dca8ad34e8bf52a6144e0ff8ef3f795d7ae9d5f644fe2042","services":["bzz","pss"],"enable_msg_events":true,"port":37375},"up":true}},{"node":{"info":{"id":"6d3c6db15900f2596286f81cc0664d2c8291ead5bad2aa35bad515af088a2e48","name":"node_6d3c6db15900f2596286f81cc0664d2c8291ead5bad2aa35bad515af088a2e48","enode":"enode://39291783101f95a5ab0c6a5d372ab36be799b2f4dd241206519e00c6df4c01d16736ddcf75349c2fa7ee23395b536b4d60d40863664b2d9b15bcdf13a384856b@127.0.0.1:0","enr":"0xf88fb840c8714570044e40edeb9d032662ba2bdcc24c79d2f85ca264d6e7ca490de884235fccc9d43de5859321525bb25b2ed942d3dbfa2f72686bd09b8cad40b7d56cd70183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10339291783101f95a5ab0c6a5d372ab36be799b2f4dd241206519e00c6df4c01d1","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"bTxtsVkA8llihvgcwGZNLIKR6tW60qo1utUVrwiKLkg=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 6d3c6d\npopulation: 31 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 c190 a8f4 b6df b8e1 | 130 b3f9 (0) b78f (0) b659 (0) b6df (0)\n001 6 3411 26ac 244c 24f8 | 65 3cab (0) 3c5b (0) 3f31 (0) 3b02 (0)\n002 6 5663 5ff0 5ac0 5814 | 35 5c7c (0) 5c37 (0) 5d82 (0) 5ff0 (0)\n003 5 70f6 7d16 7c7c 7895 | 13 741a (0) 7660 (0) 7049 (0) 70f6 (0)\n004 2 6795 60c5 | 6 648a (0) 6758 (0) 67f3 (0) 6790 (0)\n005 2 6b4e 68cb | 2 6b4e (0) 68cb (0)\n006 1 6e7f | 1 6e7f (0)\n007 1 6c01 | 1 6c01 (0)\n============ DEPTH: 8 ==========================================\n008 1 6dd3 | 1 6dd3 (0)\n009 1 6d5e | 1 6d5e (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"6d3c6db15900f2596286f81cc0664d2c8291ead5bad2aa35bad515af088a2e48","private_key":"ae7658c745f0e65d13c11825a7164cb7336cc227bb4141dcb4f7a1b69abc8607","name":"node_6d3c6db15900f2596286f81cc0664d2c8291ead5bad2aa35bad515af088a2e48","services":["bzz","pss"],"enable_msg_events":true,"port":46873},"up":true}},{"node":{"info":{"id":"0e80db9dfa8ce29bedfb2de031622bef8829bee52771322b6a7efb47afe540e7","name":"node_0e80db9dfa8ce29bedfb2de031622bef8829bee52771322b6a7efb47afe540e7","enode":"enode://4c66fe3197799ae8e8b7a9dc282966e1308115243346f02df98a818894f45783aeee959acc426df923f934b3a0948ab96460014c21435cd2a72745cc03f31986@127.0.0.1:0","enr":"0xf88fb840e699bbd1a5ea6afb58628146badd23319b3b2b6ed1e3cfa33efa77d040ac18f34f2d5aa2dba515d6d196f3414f3cfc8cb70045a92f88c46fad4bd4fef1bebd4f0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1024c66fe3197799ae8e8b7a9dc282966e1308115243346f02df98a818894f45783","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"DoDbnfqM4pvt+y3gMWIr74gpvuUncTIran77R6/lQOc=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 0e80db\npopulation: 40 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 9 b8e1 b5ea b4a1 a8f4 | 130 bfc7 (0) be68 (0) bea1 (0) bdc5 (0)\n001 7 56ca 5ac0 43d4 79e5 | 61 52a8 (0) 5144 (0) 50c1 (0) 5538 (0)\n002 9 3411 32ff 2e65 2fd2 | 28 3c5b (0) 3cab (0) 3f31 (0) 3b02 (0)\n003 5 19ea 1b1d 1686 1049 | 16 140d (0) 1484 (0) 1784 (0) 1686 (0)\n004 2 046c 07f5 | 10 035f (0) 0314 (0) 025d (0) 0191 (0)\n005 4 08f8 09b3 096a 0942 | 6 08bd (0) 08e5 (0) 08f8 (0) 09b3 (0)\n006 2 0cfc 0d1c | 2 0cfc (0) 0d1c (0)\n============ DEPTH: 7 ==========================================\n007 0 | 0\n008 2 0e3b 0e2b | 2 0e3b (0) 0e2b (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"0e80db9dfa8ce29bedfb2de031622bef8829bee52771322b6a7efb47afe540e7","private_key":"b9190dcff292030b590acbf97d108aa5e5bdf506556ea496845cee35fdb941c6","name":"node_0e80db9dfa8ce29bedfb2de031622bef8829bee52771322b6a7efb47afe540e7","services":["bzz","pss"],"enable_msg_events":true,"port":36041},"up":true}},{"node":{"info":{"id":"24f80c437be45898e594f821bba0f5c62e0c9a0c720118e362ee6f78410612bd","name":"node_24f80c437be45898e594f821bba0f5c62e0c9a0c720118e362ee6f78410612bd","enode":"enode://29812550052d6b16cc2b04fc247361209269007589ab11e66a4dc0928b09a158d46c84eb42f8150e45dc8a1507a2474372b311b26f743eeb615a36094d404313@127.0.0.1:0","enr":"0xf88fb840ea7a6a8262fab073a6840a7ee18670e090fea60cf597a27d2832802826b0a8f068c3ca88013d64b5ff02ccb4f2ff094c590329d9a24cf9a3d7856c6b6fd676070183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10329812550052d6b16cc2b04fc247361209269007589ab11e66a4dc0928b09a158","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"JPgMQ3vkWJjllPghu6D1xi4MmgxyARjjYu5veEEGEr0=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 24f80c\npopulation: 27 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 7 b8e1 b5ea b4a1 b6df | 130 bdc5 (0) bcf8 (0) bfc7 (0) be68 (0)\n001 2 68cb 6d3c | 61 52a8 (0) 5144 (0) 50c1 (0) 5538 (0)\n002 5 1b1d 19ea 1049 1070 | 37 1484 (0) 140d (0) 1784 (0) 1686 (0)\n003 3 3980 3938 32ff | 17 3f31 (0) 3c5b (0) 3cab (0) 3b02 (0)\n004 7 2a50 298a 2c80 2c85 | 7 2a50 (0) 298a (0) 2ddf (0) 2c85 (0)\n============ DEPTH: 5 ==========================================\n005 0 | 0\n006 2 26ac 26ab | 2 26ab (0) 26ac (0)\n007 0 | 0\n008 1 244c | 1 244c (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"24f80c437be45898e594f821bba0f5c62e0c9a0c720118e362ee6f78410612bd","private_key":"bd42db9dab0f618eb6ccbe9be985031a20cc1daa8157a90861ddd93c290047ab","name":"node_24f80c437be45898e594f821bba0f5c62e0c9a0c720118e362ee6f78410612bd","services":["bzz","pss"],"enable_msg_events":true,"port":37751},"up":true}},{"node":{"info":{"id":"ec90a22f41ee659d5759a497946ac2991c916f00fe7caeeeb0908f3af1fe60b6","name":"node_ec90a22f41ee659d5759a497946ac2991c916f00fe7caeeeb0908f3af1fe60b6","enode":"enode://1afe1c8bb1a13bc5bc8ab9528f323597de5d3c7322397d611f7cfdee80cabaa6ee95222a551a9bfd627f595472bb227327a045306c75a25b75eb5d6240eb7b54@127.0.0.1:0","enr":"0xf88fb840a2ce29495c237a1d985a2865cbcacf2d5d3e6332f63ebbf01a8beeac0e5e2621504b30da39c19b73bc3cf1135905ab7c6fe71b1e90fc05dfd1fceea7ec3269ff0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1021afe1c8bb1a13bc5bc8ab9528f323597de5d3c7322397d611f7cfdee80cabaa6","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"7JCiL0HuZZ1XWaSXlGrCmRyRbwD+fK7usJCPOvH+YLY=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: ec90a2\npopulation: 39 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 43d4 68cb 0e80 2e65 | 126 52a8 (0) 5144 (0) 50c1 (0) 5538 (0)\n001 10 b78f b8e1 bbaf ab3f | 75 bdc5 (0) bcf8 (0) bfc7 (0) be68 (0)\n002 5 ddb8 d408 d700 c9c3 | 27 d959 (0) d9cf (0) dbd4 (0) da36 (0)\n003 9 feb3 fc51 fc39 fa24 | 14 f8ff (0) f9de (0) fa24 (0) ff75 (0)\n004 4 e471 e2d3 e09f e0a0 | 7 e471 (0) e64d (0) e681 (0) e277 (0)\n005 2 eb68 e867 | 2 eb68 (0) e867 (0)\n============ DEPTH: 6 ==========================================\n006 3 eebd eff2 ef99 | 3 eebd (0) eff2 (0) ef99 (0)\n007 1 ed42 | 1 ed42 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"ec90a22f41ee659d5759a497946ac2991c916f00fe7caeeeb0908f3af1fe60b6","private_key":"89981ff407aefd00840d1b348382e6571fe033d8e0e93bdacff8d74ac1fbb465","name":"node_ec90a22f41ee659d5759a497946ac2991c916f00fe7caeeeb0908f3af1fe60b6","services":["bzz","pss"],"enable_msg_events":true,"port":42753},"up":true}},{"node":{"info":{"id":"955da15edae50a4c68bc8c579b9799d55f41b7c2a6178f645f79d772e0116662","name":"node_955da15edae50a4c68bc8c579b9799d55f41b7c2a6178f645f79d772e0116662","enode":"enode://28ce8e8bd283c85d928eff07eb1fe95320e63ffecaeba76699cc6559b4e724ebab2f08fc20a3569022d9a14c0dc992ce97cb38b8031a6c170594ff80c0360a59@127.0.0.1:0","enr":"0xf88fb840599bae7bc68a1be369da49e6e4fc452277e838db6b140b288b1443accdfc5e7b68e44b4d5cf9c33cdbc1d0c7088b756639d98e9a4c055ee7589c982e720a68a30183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10328ce8e8bd283c85d928eff07eb1fe95320e63ffecaeba76699cc6559b4e724eb","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"lV2hXtrlCkxovIxXm5eZ1V9Bt8KmF49kX3nXcuARZmI=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 955da1\npopulation: 30 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 2e65 0e80 43d4 6d3c | 126 52a8 (0) 5144 (0) 50c1 (0) 5538 (0)\n001 2 c190 ec90 | 55 ddb8 (0) dbd4 (0) da36 (0) dad0 (0)\n002 4 bbaf b8e1 af02 a8f4 | 37 bdc5 (0) bcf8 (0) bfc7 (0) be68 (0)\n003 4 8e28 8f9a 8d19 8073 | 21 8b43 (0) 8862 (0) 8854 (0) 8ea2 (0)\n004 8 9948 9959 9b8e 9ec8 | 9 9959 (0) 9948 (0) 9b8e (0) 9ec8 (0)\n005 3 9257 93c0 93ea | 3 9257 (0) 93c0 (0) 93ea (0)\n006 1 97da | 1 97da (0)\n007 1 9464 | 1 9464 (0)\n============ DEPTH: 8 ==========================================\n008 1 95c0 | 1 95c0 (0)\n009 1 9518 | 1 9518 (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"955da15edae50a4c68bc8c579b9799d55f41b7c2a6178f645f79d772e0116662","private_key":"37f0dfbc4bcabf9e11ec2090cd8fd558bd7784630fdac652e65e0e56e11fff47","name":"node_955da15edae50a4c68bc8c579b9799d55f41b7c2a6178f645f79d772e0116662","services":["bzz","pss"],"enable_msg_events":true,"port":46557},"up":true}},{"node":{"info":{"id":"a8f49e87156fda5510897601689ce968d77032134c523634916b96de16366f9e","name":"node_a8f49e87156fda5510897601689ce968d77032134c523634916b96de16366f9e","enode":"enode://a387b1ae7d38f1e3bb1576e26b97a6f5bf1fc147160a59dd43b8184b0c23dde70d006b3e046f727c0d3d185db250fb1796d0c8c4a63921c8fa4fda6ec1feea1c@127.0.0.1:0","enr":"0xf88fb840f2d8228ae427fc1b5347e72a85e3f6fb50398b45a626c6521c677d449daa7f9f1f0b921ba8b3e600829957e2a3cfc8d98234f8a6d8395d56172c1c0c4c8855ea0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102a387b1ae7d38f1e3bb1576e26b97a6f5bf1fc147160a59dd43b8184b0c23dde7","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"qPSehxVv2lUQiXYBaJzpaNdwMhNMUjY0kWuW3hY2b54=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: a8f49e\npopulation: 35 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 7 0e80 1070 43d4 43c9 | 126 52a8 (0) 5144 (0) 50c1 (0) 5538 (0)\n001 6 f1ed fa24 fc51 fc39 | 55 f8ff (0) f9de (0) fa24 (0) ff75 (0)\n002 6 8d19 8f9a 8ea2 8e28 | 38 8862 (0) 8854 (0) 8b43 (0) 8ea2 (0)\n003 2 bea1 b6df | 14 bdc5 (0) bcf8 (0) bfc7 (0) be68 (0)\n004 6 a2e6 a2a1 a327 a1c8 | 13 a505 (0) a5ac (0) a4ee (0) a616 (0)\n005 2 aeb4 af02 | 3 acee (0) aeb4 (0) af02 (0)\n006 3 aaf0 ab71 ab3f | 3 aaf0 (0) ab71 (0) ab3f (0)\n007 1 a970 | 1 a970 (0)\n============ DEPTH: 8 ==========================================\n008 0 | 0\n009 1 a8b5 | 1 a8b5 (0)\n010 0 | 0\n011 0 | 0\n012 1 a8ff | 1 a8ff (0)\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"a8f49e87156fda5510897601689ce968d77032134c523634916b96de16366f9e","private_key":"6bb6d8d705a40ba424923e49c1a5f2ea7ef65a8047cd69554f076497ad72abe8","name":"node_a8f49e87156fda5510897601689ce968d77032134c523634916b96de16366f9e","services":["bzz","pss"],"enable_msg_events":true,"port":40983},"up":true}},{"node":{"info":{"id":"c190f9d08c78ed6dffadaef36e77fe6aa96099e4453753b0cfc8ec542fa96b9d","name":"node_c190f9d08c78ed6dffadaef36e77fe6aa96099e4453753b0cfc8ec542fa96b9d","enode":"enode://624fdcc04a4251fa0a5e452254deb09951e1c0e466046bb34ecfc5762881942842a1ad2ebe95d8a53fc13cf338b164aae811b96d19034914557485104f7cf8a6@127.0.0.1:0","enr":"0xf88fb840f541779d4363d2d110782b9208996593d8124c23e35c0c27c4a598881a445d896199da564f83d98e0d70a24b31b5995b979add943d98a2e3d0ede83d689bc0ad0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102624fdcc04a4251fa0a5e452254deb09951e1c0e466046bb34ecfc57628819428","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"wZD50Ix47W3/ra7zbnf+aqlgmeRFN1Owz8jsVC+pa50=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: c190f9\npopulation: 32 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 5814 43d4 6d3c 68cb | 126 52a8 (0) 5144 (0) 50c1 (0) 5538 (0)\n001 7 9f7d 9ca1 955d 8073 | 75 8b43 (0) 8854 (0) 8862 (0) 8ea2 (0)\n002 7 f645 f2b4 fa24 feb3 | 28 f8ff (0) f9de (0) fa24 (0) ff75 (0)\n003 3 dad0 ddb8 d700 | 11 d959 (0) d9cf (0) dbd4 (0) da36 (0)\n004 3 cf52 c8ea c9c3 | 8 cc33 (0) cd6c (0) cdb1 (0) cf52 (0)\n005 4 c603 c6a8 c534 c42e | 5 c74d (0) c603 (0) c6a8 (0) c534 (0)\n============ DEPTH: 6 ==========================================\n006 2 c2d0 c272 | 2 c2d0 (0) c272 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"c190f9d08c78ed6dffadaef36e77fe6aa96099e4453753b0cfc8ec542fa96b9d","private_key":"8e85cf18cf9dd5c75878ddc75b26b567c6f213cd9cf41387232103a423215444","name":"node_c190f9d08c78ed6dffadaef36e77fe6aa96099e4453753b0cfc8ec542fa96b9d","services":["bzz","pss"],"enable_msg_events":true,"port":42929},"up":true}},{"node":{"info":{"id":"80735a728720bba0ac08daaccd093370d672a8f9a50845ad78ccd6cf8686c39f","name":"node_80735a728720bba0ac08daaccd093370d672a8f9a50845ad78ccd6cf8686c39f","enode":"enode://fdcec2678f4772897ed0eb0ec54b7de122c22cbf31b6e501c00adeed3d80cc14351e6a4ca7677d22fc7bbd94db0e3302cf20e7f55c554bd4dbaa0bd4e8a50a7f@127.0.0.1:0","enr":"0xf88fb84005c6d37ffbbfde5c741d546335ecf1ee87f1fb33af5875d0c84b3fb9dc87329f16d6370725423a847f1eebb7bd3a21a8fb3c43b99ef030a6cda4e1e144d69a280183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103fdcec2678f4772897ed0eb0ec54b7de122c22cbf31b6e501c00adeed3d80cc14","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"gHNacocgu6CsCNqszQkzcNZyqPmlCEWteMzWz4aGw58=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 80735a\npopulation: 35 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 2fd2 5814 5663 43d4 | 126 52a8 (0) 5144 (0) 50c1 (0) 5538 (0)\n001 2 d700 c190 | 55 e64d (0) e681 (0) e471 (0) e277 (0)\n002 5 a8ff a1c8 a327 a2e6 | 37 a2a1 (0) a2e6 (0) a330 (0) a327 (0)\n003 8 93c0 955d 9948 9b8e | 17 9257 (0) 93ea (0) 93c0 (0) 97da (0)\n004 5 8b43 8f9a 8ea2 8e28 | 9 8854 (0) 8862 (0) 8b43 (0) 8ea2 (0)\n005 2 87a3 86d6 | 4 8402 (0) 84a9 (0) 87a3 (0) 86d6 (0)\n006 3 837f 834f 8358 | 3 834f (0) 8358 (0) 837f (0)\n007 1 81a5 | 1 81a5 (0)\n008 1 80d7 | 1 80d7 (0)\n============ DEPTH: 9 ==========================================\n009 1 8006 | 1 8006 (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 1 8074 | 1 8074 (0)\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"80735a728720bba0ac08daaccd093370d672a8f9a50845ad78ccd6cf8686c39f","private_key":"8623a021033479cd7104a88188d9784ac5edeb95094c010547e615407d7a8973","name":"node_80735a728720bba0ac08daaccd093370d672a8f9a50845ad78ccd6cf8686c39f","services":["bzz","pss"],"enable_msg_events":true,"port":38855},"up":true}},{"node":{"info":{"id":"b4a1b687fbdb754fd689e26f0870a7dcab5d76190c06f3ea2ea1e198f8aa5ab2","name":"node_b4a1b687fbdb754fd689e26f0870a7dcab5d76190c06f3ea2ea1e198f8aa5ab2","enode":"enode://3057525034706ee1eee5958ad026f2f68f4bff18e95bec5db1e27e845df3c6b45b7a3d030786afab82b789cef41f9bc88bbb7c7238eb01ada275e9d294741643@127.0.0.1:0","enr":"0xf88fb84043499166c98cc953ba2a4b899aea5eba91503a235686406a2e5cc6f41156d01b6a9cfdab6cab3104c08d3b2fe340ea9b4504fde582847b46d2c4ebfc55e4639f0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1033057525034706ee1eee5958ad026f2f68f4bff18e95bec5db1e27e845df3c6b4","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"tKG2h/vbdU/WieJvCHCn3KtddhkMBvPqLqHhmPiqWrI=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: b4a1b6\npopulation: 26 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 68cb 43d4 43c9 0e80 | 126 52a8 (0) 5144 (0) 50c1 (0) 5538 (0)\n001 4 f1ed f6c0 fc39 d700 | 55 e64d (0) e681 (0) e471 (0) e277 (0)\n002 2 8d19 8073 | 38 9257 (0) 93c0 (0) 93ea (0) 97da (0)\n003 4 a742 a7a8 a327 a1c8 | 23 a2e6 (0) a2a1 (0) a330 (0) a327 (0)\n004 5 b8e1 bbaf bdc5 bcf8 | 8 bdc5 (0) bcf8 (0) bfc7 (0) be68 (0)\n005 1 b3f9 | 1 b3f9 (0)\n============ DEPTH: 6 ==========================================\n006 3 b78f b659 b6df | 3 b78f (0) b659 (0) b6df (0)\n007 1 b5ea | 1 b5ea (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"b4a1b687fbdb754fd689e26f0870a7dcab5d76190c06f3ea2ea1e198f8aa5ab2","private_key":"2db46fccdc01ed22afb3e789ea51e706f96e02424e2883893536ac8941043985","name":"node_b4a1b687fbdb754fd689e26f0870a7dcab5d76190c06f3ea2ea1e198f8aa5ab2","services":["bzz","pss"],"enable_msg_events":true,"port":34987},"up":true}},{"node":{"info":{"id":"b6dffac4b4eb2974ed0ed241799f97d2e5d9be671e311266826d0dcfecfcc209","name":"node_b6dffac4b4eb2974ed0ed241799f97d2e5d9be671e311266826d0dcfecfcc209","enode":"enode://83bcb3c68dcde737d01e64be91562e08aa6d62823cce64889fe81f01f05c9678015ec02c8c36bb8f83beee9587374da90118a76a98289f5ebad1436b19035bc4@127.0.0.1:0","enr":"0xf88fb8405bc0154529713773273db32f0ea11698b2fb42edf643c702fa47f05b032ad0b2780c5793a4018e529b014c867bee95c6af034725f784cc7f4742f2b9dc6d87d30183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10283bcb3c68dcde737d01e64be91562e08aa6d62823cce64889fe81f01f05c9678","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"tt/6xLTrKXTtDtJBeZ+X0uXZvmceMRJmgm0Nz+z8wgk=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: b6dffa\npopulation: 24 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 43d4 43c9 68cb 6d3c | 126 52a8 (0) 5144 (0) 50c1 (0) 5538 (0)\n001 3 e0a0 fc39 d700 | 55 e64d (0) e681 (0) e471 (0) e277 (0)\n002 2 9ca1 8d19 | 38 8402 (0) 84a9 (0) 87a3 (0) 86d6 (0)\n003 3 a7a8 af02 a8f4 | 23 a2a1 (0) a2e6 (0) a330 (0) a327 (0)\n004 5 bcf8 bfc7 bea1 bbaf | 8 bdc5 (0) bcf8 (0) bfc7 (0) be68 (0)\n005 1 b3f9 | 1 b3f9 (0)\n006 2 b5ea b4a1 | 2 b5ea (0) b4a1 (0)\n============ DEPTH: 7 ==========================================\n007 1 b78f | 1 b78f (0)\n008 1 b659 | 1 b659 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"b6dffac4b4eb2974ed0ed241799f97d2e5d9be671e311266826d0dcfecfcc209","private_key":"e24347072d11928511f53eef3f8e9a9734b3aaf2cb6205e653b42817451769b3","name":"node_b6dffac4b4eb2974ed0ed241799f97d2e5d9be671e311266826d0dcfecfcc209","services":["bzz","pss"],"enable_msg_events":true,"port":46447},"up":true}},{"node":{"info":{"id":"d700d96de1193456dc0bcf492c7c11b0951062974af2f7f47b8c901b17c23165","name":"node_d700d96de1193456dc0bcf492c7c11b0951062974af2f7f47b8c901b17c23165","enode":"enode://410d63c57efb139f46850a8e0c7be2739099ace7e693848bb141c8cc7a9918f0ea1bb23bca1d292d38877c9fcd33d089ec39ba60ecfe1c8f10d5364e31196576@127.0.0.1:0","enr":"0xf88fb8408aa9045d36445a648a2d7468dfe7acea7f555e845341e000f782de3a667360ae2b494625fbc4c7ea45769984f4915b406d9241de31ef82d41bbeff3811d6d98f0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102410d63c57efb139f46850a8e0c7be2739099ace7e693848bb141c8cc7a9918f0","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"1wDZbeEZNFbcC89JLHwRsJUQYpdK8vf0e4yQGxfCMWU=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: d700d9\npopulation: 42 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 0e80 19ea 2fd2 24f8 | 126 140d (0) 1484 (0) 1784 (0) 1686 (0)\n001 9 9f7d 9ca1 8073 8f9a | 75 84a9 (0) 8402 (0) 87a3 (0) 86d6 (0)\n002 10 e0a0 ef99 ec90 feb3 | 28 e64d (0) e681 (0) e471 (0) e277 (0)\n003 10 c9c3 c8ea cf52 cc33 | 16 c961 (0) c9c3 (0) c8c8 (0) c8ea (0)\n004 3 ddb8 dad0 d9cf | 6 ddb8 (0) dbd4 (0) da36 (0) dad0 (0)\n============ DEPTH: 5 ==========================================\n005 3 d209 d3e9 d302 | 3 d209 (0) d3e9 (0) d302 (0)\n006 1 d408 | 1 d408 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"d700d96de1193456dc0bcf492c7c11b0951062974af2f7f47b8c901b17c23165","private_key":"44cd8419094d50e78afb097502f16dcd9c28368eb0ac43ce3b6312f58b6a3176","name":"node_d700d96de1193456dc0bcf492c7c11b0951062974af2f7f47b8c901b17c23165","services":["bzz","pss"],"enable_msg_events":true,"port":43567},"up":true}},{"node":{"info":{"id":"43c9e1571c460cb9f599fa8ed79ddd0f9c3a21fd2fa455e0603109c55012f76b","name":"node_43c9e1571c460cb9f599fa8ed79ddd0f9c3a21fd2fa455e0603109c55012f76b","enode":"enode://7041f32dd06a878b138bbfefc65706d09feb4d20fa70fdaec9b5e107e0b78fb17e7e0e925ac8e1de69e03d8ab6005d250b3988c1c0911dadfd14e07849bd556e@127.0.0.1:0","enr":"0xf88fb840d7d0ed8828dbcb293891f06bd62c1a8f8be6e41e64cdfd8c701332e185ae09782876283f3a7fb0bd32333fddb3890bf3afbbda703a86a9e2189b5d08811c410f0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1027041f32dd06a878b138bbfefc65706d09feb4d20fa70fdaec9b5e107e0b78fb1","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"Q8nhVxxGDLn1mfqO153dD5w6If0vpFXgYDEJxVAS92s=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 43c9e1\npopulation: 31 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 8 b6df b4a1 a8f4 a1c8 | 130 acee (0) aeb4 (0) af02 (0) aaf0 (0)\n001 2 244c 2fd2 | 65 012b (0) 0111 (0) 0191 (0) 025d (0)\n002 5 79e5 7895 68cb 6dd3 | 26 741a (0) 7660 (0) 7049 (0) 70f6 (0)\n003 7 5ff0 5ac0 5814 50c1 | 16 5d82 (0) 5c7c (0) 5c37 (0) 5ff0 (0)\n004 3 4d38 48de 482e | 10 4cec (0) 4d91 (0) 4d38 (0) 4b79 (0)\n005 2 447c 447a | 4 46bf (0) 44ad (0) 447c (0) 447a (0)\n006 2 4005 402c | 2 4005 (0) 402c (0)\n============ DEPTH: 7 ==========================================\n007 0 | 0\n008 1 435d | 1 435d (0)\n009 0 | 0\n010 0 | 0\n011 1 43d4 | 1 43d4 (0)\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"43c9e1571c460cb9f599fa8ed79ddd0f9c3a21fd2fa455e0603109c55012f76b","private_key":"0be456eea926753ec7862f851dbd4b26ee5559316964d3411e6024e19a752138","name":"node_43c9e1571c460cb9f599fa8ed79ddd0f9c3a21fd2fa455e0603109c55012f76b","services":["bzz","pss"],"enable_msg_events":true,"port":46243},"up":true}},{"node":{"info":{"id":"9ca1fd5d41975acb905f337997922849b4070360e47849bb4fd8cd1b9ddb4d73","name":"node_9ca1fd5d41975acb905f337997922849b4070360e47849bb4fd8cd1b9ddb4d73","enode":"enode://c9a8f470d438c9326b6d9e1f44bd2df3b9b4db56183efa7e23e2381f7499a94abcf1098ecf26221121fd113ea34eb8df3d183d5a3df359ebb5a93ef693f13923@127.0.0.1:0","enr":"0xf88fb840c1fa2933c23d1743f13988ec4d4c71a6d636eab7df047c52c265ea0086f72f550a1b2fd29579c42d2b4d7d3a9b2898b42b35ef897ebb203d6980bef0063402470183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103c9a8f470d438c9326b6d9e1f44bd2df3b9b4db56183efa7e23e2381f7499a94a","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"nKH9XUGXWsuQXzN5l5IoSbQHA2DkeEm7T9jNG53bTXM=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 9ca1fd\npopulation: 28 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 046c 0942 244c 2fd2 | 126 0cfc (0) 0d1c (0) 0e3b (0) 0e2b (0)\n001 5 d700 c190 ec90 f6c0 | 55 e64d (0) e681 (0) e471 (0) e277 (0)\n002 4 b6df a327 a1c8 a7a8 | 37 bdc5 (0) bcf8 (0) bfc7 (0) be68 (0)\n003 3 8073 8f9a 8d19 | 21 84a9 (0) 8402 (0) 86d6 (0) 87a3 (0)\n004 3 93ea 93c0 955d | 8 9257 (0) 93ea (0) 93c0 (0) 97da (0)\n005 3 9959 9948 9b8e | 3 9948 (0) 9959 (0) 9b8e (0)\n006 3 9ec8 9f0e 9f7d | 3 9ec8 (0) 9f0e (0) 9f7d (0)\n============ DEPTH: 7 ==========================================\n007 0 | 0\n008 1 9c21 | 1 9c21 (0)\n009 0 | 0\n010 1 9c8e | 1 9c8e (0)\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"9ca1fd5d41975acb905f337997922849b4070360e47849bb4fd8cd1b9ddb4d73","private_key":"fbcd62592636cde3b1d26d9fd45dd2a45c8d1dfd4919ef05694e5c3a64330798","name":"node_9ca1fd5d41975acb905f337997922849b4070360e47849bb4fd8cd1b9ddb4d73","services":["bzz","pss"],"enable_msg_events":true,"port":39429},"up":true}},{"node":{"info":{"id":"8d192b11538072db750f71204e2e6adf9dc0508d9c5cf1eb457e4e996cd985bc","name":"node_8d192b11538072db750f71204e2e6adf9dc0508d9c5cf1eb457e4e996cd985bc","enode":"enode://222e619168c8502ad2677160abc513c09bfff4fc68adc96d2e7f0f7c4930abd567e863fe0472152a657c4ddd856612f5fb1dc02b056d9e8c1c159e098939dfe5@127.0.0.1:0","enr":"0xf88fb840930bf1a5288e587dffc9cebd12f017e5781d33ea16fe79da844003dba818a12e274142748fa13f0293ec802260c571d0052748b2d534197d123a968cfe5b46900183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103222e619168c8502ad2677160abc513c09bfff4fc68adc96d2e7f0f7c4930abd5","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"jRkrEVOActt1D3EgTi5q353AUI2cXPHrRX5OmWzZhbw=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 8d192b\npopulation: 31 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 5814 2fd2 | 126 741a (0) 7660 (0) 7049 (0) 70f6 (0)\n001 4 ec90 f6c0 fc39 d700 | 55 c8c8 (0) c8ea (0) c961 (0) c9c3 (0)\n002 6 a8f4 a1c8 bea1 b8e1 | 37 bdc5 (0) bcf8 (0) bfc7 (0) be68 (0)\n003 6 955d 9b8e 9ec8 9f7d | 17 9257 (0) 93ea (0) 93c0 (0) 97da (0)\n004 5 87a3 86d6 8358 837f | 12 8402 (0) 84a9 (0) 87a3 (0) 86d6 (0)\n005 3 8854 8862 8b43 | 3 8854 (0) 8862 (0) 8b43 (0)\n============ DEPTH: 6 ==========================================\n006 4 8ea2 8e28 8e7b 8f9a | 4 8ea2 (0) 8e7b (0) 8e28 (0) 8f9a (0)\n007 1 8cc3 | 1 8cc3 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"8d192b11538072db750f71204e2e6adf9dc0508d9c5cf1eb457e4e996cd985bc","private_key":"edbbc3a484e366a33c8f6c00e9c02ac566737d8e91db651bc236921021651832","name":"node_8d192b11538072db750f71204e2e6adf9dc0508d9c5cf1eb457e4e996cd985bc","services":["bzz","pss"],"enable_msg_events":true,"port":42737},"up":true}},{"node":{"info":{"id":"2fd2f77d76cca480ac18e9af7a462f297db168c3370b3bc0e2c04aa006c4d037","name":"node_2fd2f77d76cca480ac18e9af7a462f297db168c3370b3bc0e2c04aa006c4d037","enode":"enode://d90aedfb65dd9e291e3c4407969177cc0003f7aeefea62a5fda7e78a2f8e57503ea0542d07a9ca08fc77b1c140394f0b96403ee29b9ef7e77220e8349d89d727@127.0.0.1:0","enr":"0xf88fb840fb7cf57abda6762cac6ad86cec07e3614162d910e4bfaac92260335eb590c78248534c6fb3f6579c4d43dda86da3aac0bf57486a520ce42420a4348d33eca50c0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103d90aedfb65dd9e291e3c4407969177cc0003f7aeefea62a5fda7e78a2f8e5750","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"L9L3fXbMpICsGOmvekYvKX2xaMM3CzvA4sBKoAbE0Dc=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 2fd2f7\npopulation: 37 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 11 d700 c534 c190 fc39 | 130 c9c3 (0) c961 (0) c8c8 (0) c8ea (0)\n001 7 7895 79e5 7d16 7c46 | 61 7660 (0) 741a (0) 7049 (0) 70f6 (0)\n002 5 046c 0e80 0942 1b1d | 37 08e5 (0) 08f8 (0) 08bd (0) 09b3 (0)\n003 4 3980 3938 3411 32ff | 17 3f31 (0) 3c5b (0) 3cab (0) 3b02 (0)\n004 4 26ab 26ac 24f8 244c | 4 26ab (0) 26ac (0) 24f8 (0) 244c (0)\n005 2 2a50 298a | 2 2a50 (0) 298a (0)\n============ DEPTH: 6 ==========================================\n006 3 2ddf 2c85 2c80 | 3 2ddf (0) 2c85 (0) 2c80 (0)\n007 1 2e65 | 1 2e65 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"2fd2f77d76cca480ac18e9af7a462f297db168c3370b3bc0e2c04aa006c4d037","private_key":"7f01ef5d73b7a1621cf1a50134d0e446cde7c2685c35b818d64476d6cda01227","name":"node_2fd2f77d76cca480ac18e9af7a462f297db168c3370b3bc0e2c04aa006c4d037","services":["bzz","pss"],"enable_msg_events":true,"port":32949},"up":true}},{"node":{"info":{"id":"f6c028d6a2b6408e90169151f4519b561ed183bd8925ed9a1702806f397666e7","name":"node_f6c028d6a2b6408e90169151f4519b561ed183bd8925ed9a1702806f397666e7","enode":"enode://ffc371f4f10ff50bcf4e7340bdc527dfcb0999c56a8ad077681dda0e5af313e62507524e2ff696ece4cb8eb97aac54f27d233260cb7ca5c4154e7afdfbdf96e5@127.0.0.1:0","enr":"0xf88fb84078e3e0d2b74bdd55983a052ed78591ee0915da8578fd5b0a91956d6b269bf3d81d3db48178b5eaee67ea280e6f5f0d246d756fc5abf350ae9397534bf91281da0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103ffc371f4f10ff50bcf4e7340bdc527dfcb0999c56a8ad077681dda0e5af313e6","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"9sAo1qK2QI6QFpFR9FGbVh7Rg72JJe2aFwKAbzl2Zuc=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: f6c028\npopulation: 29 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 7895 5814 43c9 244c | 126 7660 (0) 741a (0) 7049 (0) 70f6 (0)\n001 4 8d19 9ca1 b4a1 a7a8 | 75 9257 (0) 93ea (0) 93c0 (0) 97da (0)\n002 5 c272 c42e c534 cf52 | 27 c8c8 (0) c8ea (0) c961 (0) c9c3 (0)\n003 5 e2d3 e471 e681 ef99 | 14 e867 (0) eb68 (0) eebd (0) eff2 (0)\n004 4 fa24 fc39 fc51 feb3 | 7 f9de (0) f8ff (0) fa24 (0) ff75 (0)\n005 4 f1ed f215 f2b4 f305 | 4 f1ed (0) f215 (0) f2b4 (0) f305 (0)\n============ DEPTH: 6 ==========================================\n006 0 | 0\n007 1 f756 | 1 f756 (0)\n008 1 f645 | 1 f645 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"f6c028d6a2b6408e90169151f4519b561ed183bd8925ed9a1702806f397666e7","private_key":"c2001db1b7540d6a72ed993e4a136476e6ca041a2240675f06b1a4e86e3424b0","name":"node_f6c028d6a2b6408e90169151f4519b561ed183bd8925ed9a1702806f397666e7","services":["bzz","pss"],"enable_msg_events":true,"port":42857},"up":true}},{"node":{"info":{"id":"a7a856a43293aa3004848a86f187e09343bd605e1a93e853a6f6b6b1031bd667","name":"node_a7a856a43293aa3004848a86f187e09343bd605e1a93e853a6f6b6b1031bd667","enode":"enode://5e72e16dc757645afb111309a937a4366004991283411fd3c3d50c52778232ea7e7719d3cd0b1cc369bacf31c031b3a68472fd6fc03614d1986778f4e75140d9@127.0.0.1:0","enr":"0xf88fb840e8f42e427291a54799a4ef9798e106974722cc80a6cfd96431e683e82ca8ec92476544d118c7c93cde8d566d6bf48318fa85a0caa46c9abac29b1444055438090183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1035e72e16dc757645afb111309a937a4366004991283411fd3c3d50c52778232ea","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"p6hWpDKTqjAEhIqG8Yfgk0O9YF4ak+hTpva2sQMb1mc=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: a7a856\npopulation: 28 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 1070 1b1d 244c 43c9 | 126 648a (0) 6758 (0) 67f3 (0) 6795 (0)\n001 3 fc39 f1ed f6c0 | 55 c8c8 (0) c8ea (0) c9c3 (0) c961 (0)\n002 2 9f7d 9ca1 | 38 9257 (0) 93ea (0) 93c0 (0) 97da (0)\n003 6 b659 b6df b4a1 b8e1 | 14 bdc5 (0) bcf8 (0) bfc7 (0) be68 (0)\n004 4 af02 a8b5 a8ff a8f4 | 10 acee (0) aeb4 (0) af02 (0) aaf0 (0)\n005 3 a327 a0c8 a1c8 | 6 a2a1 (0) a2e6 (0) a330 (0) a327 (0)\n006 3 a505 a5ac a4ee | 3 a505 (0) a5ac (0) a4ee (0)\n============ DEPTH: 7 ==========================================\n007 2 a616 a606 | 2 a616 (0) a606 (0)\n008 1 a742 | 1 a742 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"a7a856a43293aa3004848a86f187e09343bd605e1a93e853a6f6b6b1031bd667","private_key":"aaadb3be16a7097261fed25f08f292e5be9b99c1bf3e70cdbb76066aa605151b","name":"node_a7a856a43293aa3004848a86f187e09343bd605e1a93e853a6f6b6b1031bd667","services":["bzz","pss"],"enable_msg_events":true,"port":43911},"up":true}},{"node":{"info":{"id":"fc3911383f74a982f6af8ab95a63426b56117d45f153b3c1441459d9191daaff","name":"node_fc3911383f74a982f6af8ab95a63426b56117d45f153b3c1441459d9191daaff","enode":"enode://afc7a62e260657fc0f72b68057c239d562dd553789cb3906dab521c2a0020c4d2e34f72e5c3b4bffc3c6d5a025ec22131d20c572b0667120bb9d6ff131368aa7@127.0.0.1:0","enr":"0xf88fb840b433a55822deba2cb67c49773ac6e9f6f916feeead46453ea70f7b6fb891e1b170b3ddf9a5f427aba0d47f36094e0bd0d8b00b31a2e816c4a06a6983e83e6c310183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103afc7a62e260657fc0f72b68057c239d562dd553789cb3906dab521c2a0020c4d","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"/DkROD90qYL2r4q5WmNCa1YRfUXxU7PBRBRZ2Rkdqv8=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: fc3911\npopulation: 30 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 5814 1b1d 2fd2 244c | 126 60c5 (0) 648a (0) 6758 (0) 67f3 (0)\n001 9 8d19 9f7d 9ca1 b6df | 75 9257 (0) 93ea (0) 93c0 (0) 97da (0)\n002 2 c190 d700 | 27 c961 (0) c9c3 (0) c8c8 (0) c8ea (0)\n003 4 ec90 ef99 e471 e0a0 | 14 e867 (0) eb68 (0) eebd (0) eff2 (0)\n004 6 f1ed f2b4 f215 f305 | 7 f1ed (0) f2b4 (0) f215 (0) f305 (0)\n005 2 f9de fa24 | 3 f8ff (0) f9de (0) fa24 (0)\n============ DEPTH: 6 ==========================================\n006 2 ff75 feb3 | 2 ff75 (0) feb3 (0)\n007 0 | 0\n008 0 | 0\n009 1 fc51 | 1 fc51 (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"fc3911383f74a982f6af8ab95a63426b56117d45f153b3c1441459d9191daaff","private_key":"0ab4f963705bd1ecac1ddfc070baf12e433c412c0dd7fda5ec1153e31f06d4c2","name":"node_fc3911383f74a982f6af8ab95a63426b56117d45f153b3c1441459d9191daaff","services":["bzz","pss"],"enable_msg_events":true,"port":33103},"up":true}},{"node":{"info":{"id":"a1c85ee75edb807a01f4ce930086c948918aade324752609b078c28991c04e86","name":"node_a1c85ee75edb807a01f4ce930086c948918aade324752609b078c28991c04e86","enode":"enode://62b2eb13717066427ba05db84603b330fb3b693d2bd1813d8e9a4c827fd48f746e425420802c437d4d617dacfe21133a47c98445bda61d435b1f1b25d3e430a4@127.0.0.1:0","enr":"0xf88fb8403d5ad691524cfb1b6da3dab6ee3570ad1ade29f4b42fcc3a0603f12596af26e82166d74d480e460f21c4f63ba82529d08d4089ffcb9667ab5f98b7ae05b09c6e0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10262b2eb13717066427ba05db84603b330fb3b693d2bd1813d8e9a4c827fd48f74","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"oche517bgHoB9M6TAIbJSJGKreMkdSYJsHjCiZHAToY=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: a1c85e\npopulation: 33 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 43c9 2fd2 244c | 126 60c5 (0) 648a (0) 6758 (0) 67f3 (0)\n001 5 c534 e0a0 f1ed f756 | 55 c9c3 (0) c961 (0) c8c8 (0) c8ea (0)\n002 6 86d6 8073 8d19 9ca1 | 38 9257 (0) 93ea (0) 93c0 (0) 97da (0)\n003 6 b659 b4a1 ba91 b8e1 | 14 ba91 (0) bbaf (0) b8e1 (0) bdc5 (0)\n004 2 a8b5 a8f4 | 10 acee (0) aeb4 (0) af02 (0) aaf0 (0)\n005 6 a4ee a5ac a616 a606 | 7 a505 (0) a5ac (0) a4ee (0) a616 (0)\n============ DEPTH: 6 ==========================================\n006 4 a2e6 a2a1 a330 a327 | 4 a2a1 (0) a2e6 (0) a330 (0) a327 (0)\n007 1 a0c8 | 1 a0c8 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"a1c85ee75edb807a01f4ce930086c948918aade324752609b078c28991c04e86","private_key":"2d5200058e0137ed16e823b77f132dec259ba1ba4237b3c7d64b6077dac98f24","name":"node_a1c85ee75edb807a01f4ce930086c948918aade324752609b078c28991c04e86","services":["bzz","pss"],"enable_msg_events":true,"port":46031},"up":true}},{"node":{"info":{"id":"244c3c954ac612e51d4945ab9b77f0b4a3983285e8add7921777e0c45a1bf338","name":"node_244c3c954ac612e51d4945ab9b77f0b4a3983285e8add7921777e0c45a1bf338","enode":"enode://bc965245672290bb814412e8c14997e91efee12a0980a8ad30a49cafcdc350a149112bb4c07d92fa648bfb87d0e04b0d49dd5876fb503689dc29f894f9afc11c@127.0.0.1:0","enr":"0xf88fb8406db7bfa6b9d5aa889571c5a4bfcdcef571a6e1c7f1b13ae8bd42e882bdcb10f35429b014724321e75ef0725af408123a88b9fefcbf9cc4b8333c556d683067c70183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102bc965245672290bb814412e8c14997e91efee12a0980a8ad30a49cafcdc350a1","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"JEw8lUrGEuUdSUWrm3fwtKOYMoXordeSF3fgxFob8zg=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 244c3c\npopulation: 31 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 9 cf52 c534 d700 e0a0 | 130 c961 (0) c9c3 (0) c8c8 (0) c8ea (0)\n001 4 6d3c 7895 43c9 5814 | 61 648a (0) 6758 (0) 67f3 (0) 6790 (0)\n002 5 046c 0942 0e80 0d1c | 37 0cfc (0) 0d1c (0) 0e3b (0) 0e2b (0)\n003 4 3938 32ff 30fe 3411 | 17 3f31 (0) 3cab (0) 3c5b (0) 3a62 (0)\n004 6 2a50 2ddf 2c85 2c80 | 7 298a (0) 2a50 (0) 2ddf (0) 2c85 (0)\n============ DEPTH: 5 ==========================================\n005 0 | 0\n006 2 26ac 26ab | 2 26ac (0) 26ab (0)\n007 0 | 0\n008 1 24f8 | 1 24f8 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"244c3c954ac612e51d4945ab9b77f0b4a3983285e8add7921777e0c45a1bf338","private_key":"756bc2386944320552b690fdf2118ce4d2ebcec85975547ada771a0683526e39","name":"node_244c3c954ac612e51d4945ab9b77f0b4a3983285e8add7921777e0c45a1bf338","services":["bzz","pss"],"enable_msg_events":true,"port":41177},"up":true}},{"node":{"info":{"id":"5814be13c8550b9a5a83d08e7af6022002a8fdaa38ba6c2c30be58099a9f7744","name":"node_5814be13c8550b9a5a83d08e7af6022002a8fdaa38ba6c2c30be58099a9f7744","enode":"enode://df45993237c885437698b9b42e4207115ff5f58aa44c86dec586013c408bddc56e44ca3c85a503ba4124ea6b825e510ca0c3aff8ffea771c186ddeec9282eaed@127.0.0.1:0","enr":"0xf88fb84046bd2bda155f5a7e7f14f680ffaef48b1222058233bac7457c919b20cd5bef383be59f22ce7613605070fe9bdca1f816c15e80c9c8b7c1c3b0b1928f383314d90183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103df45993237c885437698b9b42e4207115ff5f58aa44c86dec586013c408bddc5","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"WBS+E8hVC5pag9COevYCIAKo/ao4umwsML5YCZqfd0Q=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 5814be\npopulation: 31 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 7 c190 f6c0 fc39 e0a0 | 130 c961 (0) c9c3 (0) c8c8 (0) c8ea (0)\n001 4 0942 1b1d 1070 244c | 65 0cfc (0) 0d1c (0) 0e3b (0) 0e2b (0)\n002 4 68cb 6dd3 6d3c 7895 | 26 648a (0) 6758 (0) 6795 (0) 6790 (0)\n003 3 482e 43d4 43c9 | 19 4cec (0) 4d38 (0) 4d91 (0) 4b79 (0)\n004 4 50c1 5663 56ca 5538 | 6 52a8 (0) 5144 (0) 50c1 (0) 5538 (0)\n005 4 5ff0 5d82 5c7c 5c37 | 4 5d82 (0) 5c7c (0) 5c37 (0) 5ff0 (0)\n============ DEPTH: 6 ==========================================\n006 4 5bd8 5a26 5a8b 5ac0 | 4 5bd8 (0) 5a26 (0) 5a8b (0) 5ac0 (0)\n007 1 5987 | 1 5987 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"5814be13c8550b9a5a83d08e7af6022002a8fdaa38ba6c2c30be58099a9f7744","private_key":"3272db2e0cc941ae4242b75d527d37070acfd72d8565878230b23cdd5ba9aeeb","name":"node_5814be13c8550b9a5a83d08e7af6022002a8fdaa38ba6c2c30be58099a9f7744","services":["bzz","pss"],"enable_msg_events":true,"port":35259},"up":true}},{"node":{"info":{"id":"bea10868d5da506c1801de845c148c2f09761893113ac913fe66674a8f43c178","name":"node_bea10868d5da506c1801de845c148c2f09761893113ac913fe66674a8f43c178","enode":"enode://05327ec5fb8fa18f4d157d91b796c4d75a86f76159dd10ba2a14be7924a7fb58d20ea137bfea3f319d779b05c1297ecf50517ee627fc419c0fe82aa9dbab5ebe@127.0.0.1:0","enr":"0xf88fb840a5e1e04d2823e9b4c938872330f7c5e0576dbad0404136ef57aa33a3fbc8b59263359ab46fbf691c6df00e06b7f475636a04c60d62cb7ebb12e72d9f412b0d940183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10205327ec5fb8fa18f4d157d91b796c4d75a86f76159dd10ba2a14be7924a7fb58","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"vqEIaNXaUGwYAd6EXBSMLwl2GJMROskT/mZnSo9DwXg=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: bea108\npopulation: 25 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 5663 5814 3411 1b1d | 126 60c5 (0) 648a (0) 6758 (0) 67f3 (0)\n001 2 fc39 e0a0 | 55 c961 (0) c9c3 (0) c8c8 (0) c8ea (0)\n002 2 8d19 9f7d | 38 84a9 (0) 8402 (0) 87a3 (0) 86d6 (0)\n003 5 af02 a8b5 a8f4 a7a8 | 23 acee (0) aeb4 (0) af02 (0) ab3f (0)\n004 5 b3f9 b5ea b4a1 b6df | 6 b3f9 (0) b5ea (0) b4a1 (0) b78f (0)\n005 3 b8e1 ba91 bbaf | 3 bbaf (0) ba91 (0) b8e1 (0)\n006 2 bcf8 bdc5 | 2 bdc5 (0) bcf8 (0)\n============ DEPTH: 7 ==========================================\n007 1 bfc7 | 1 bfc7 (0)\n008 1 be68 | 1 be68 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"bea10868d5da506c1801de845c148c2f09761893113ac913fe66674a8f43c178","private_key":"d527efdb2ac85143b0e802a24844dd9c3aecc99bd77e0612baf6acb83decc3cf","name":"node_bea10868d5da506c1801de845c148c2f09761893113ac913fe66674a8f43c178","services":["bzz","pss"],"enable_msg_events":true,"port":38981},"up":true}},{"node":{"info":{"id":"1b1dc3f9312df141855c545dd16aee325f9a609230ec6165bdbbb07d0c0862f6","name":"node_1b1dc3f9312df141855c545dd16aee325f9a609230ec6165bdbbb07d0c0862f6","enode":"enode://0b6b4bae7d34ebd01146d2c3912e36c6dc68c3fdcaeefb53789698c96d68142a7dea20ecc04141de176514183530bd52dd602fbb143e003f9629b58c12e5cc33@127.0.0.1:0","enr":"0xf88fb840bf5689088694d9e70533fcb09c6ce37880f92cc12326d6e446217bcc664b09e64f6cda48b1981c6bbc9c862fb2e06fd3946de83f4324bcca41a2650ee23899ba0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1030b6b4bae7d34ebd01146d2c3912e36c6dc68c3fdcaeefb53789698c96d68142a","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"Gx3D+TEt8UGFXFRd0WruMl+aYJIw7GFlvbuwfQwIYvY=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 1b1dc3\npopulation: 28 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 fc39 9f7d a7a8 bea1 | 130 c9c3 (0) c961 (0) c8c8 (0) c8ea (0)\n001 3 7895 5663 5814 | 61 648a (0) 67f3 (0) 6795 (0) 6790 (0)\n002 6 3938 3980 2e65 2fd2 | 28 2a50 (0) 298a (0) 2ddf (0) 2c85 (0)\n003 4 046c 0d1c 0e80 0942 | 21 0cfc (0) 0d1c (0) 0e3b (0) 0e2b (0)\n004 3 1686 1070 1049 | 7 140d (0) 1484 (0) 1784 (0) 1686 (0)\n005 3 1fd0 1dec 1dc0 | 3 1fd0 (0) 1dec (0) 1dc0 (0)\n006 3 18e0 194e 19ea | 3 18e0 (0) 194e (0) 19ea (0)\n============ DEPTH: 7 ==========================================\n007 1 1add | 1 1add (0)\n008 1 1bd5 | 1 1bd5 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"1b1dc3f9312df141855c545dd16aee325f9a609230ec6165bdbbb07d0c0862f6","private_key":"c3aeeb9b4511f6c9ea3f8db8e4276b10196cc6c2a60e302f5bbb89b9ef64f347","name":"node_1b1dc3f9312df141855c545dd16aee325f9a609230ec6165bdbbb07d0c0862f6","services":["bzz","pss"],"enable_msg_events":true,"port":33901},"up":true}},{"node":{"info":{"id":"9f7d72b7d9843872904b841e421985082428fba5010db27dd871ed76630a1e1d","name":"node_9f7d72b7d9843872904b841e421985082428fba5010db27dd871ed76630a1e1d","enode":"enode://d362f99f7e00ec84f6ccd67dced7aa2e96e5dd50cddeaee8905cf072d71c8d723fc4781ace6da7e5e8b9730b793e53d447bf5d2b8fb2b8789fbef10c8068a46e@127.0.0.1:0","enr":"0xf88fb84077e35d00c12dc0bd099fd21289a49989ea8fd68a36842bb056f10263234ce083009f796590e6bbf22e4cc3d1763969b34838da241b9f68d571aa56d33299ee5c0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102d362f99f7e00ec84f6ccd67dced7aa2e96e5dd50cddeaee8905cf072d71c8d72","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"n31yt9mEOHKQS4QeQhmFCCQo+6UBDbJ92HHtdmMKHh0=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 9f7d72\npopulation: 29 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 7895 5663 3411 1b1d | 126 648a (0) 6758 (0) 67f3 (0) 6795 (0)\n001 4 c190 d700 fc39 e0a0 | 55 cc33 (0) cd6c (0) cdb1 (0) cf52 (0)\n002 7 b659 bbaf bcf8 bea1 | 37 acee (0) aeb4 (0) af02 (0) aaf0 (0)\n003 2 8073 8d19 | 21 84a9 (0) 8402 (0) 87a3 (0) 86d6 (0)\n004 4 93c0 9464 9518 955d | 8 9257 (0) 93ea (0) 93c0 (0) 97da (0)\n005 3 9b8e 9959 9948 | 3 9b8e (0) 9959 (0) 9948 (0)\n006 3 9c21 9c8e 9ca1 | 3 9c21 (0) 9c8e (0) 9ca1 (0)\n============ DEPTH: 7 ==========================================\n007 1 9ec8 | 1 9ec8 (0)\n008 0 | 0\n009 1 9f0e | 1 9f0e (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"9f7d72b7d9843872904b841e421985082428fba5010db27dd871ed76630a1e1d","private_key":"f6395d3f2dfff6a01fa0f1143c3c6ba9b31b776fe6ae409050d911d23a137868","name":"node_9f7d72b7d9843872904b841e421985082428fba5010db27dd871ed76630a1e1d","services":["bzz","pss"],"enable_msg_events":true,"port":37587},"up":true}},{"node":{"info":{"id":"e0a0ba7e7e89a7af805e24abde1a5a5b489ba197585051a8755e8c2345c3d57b","name":"node_e0a0ba7e7e89a7af805e24abde1a5a5b489ba197585051a8755e8c2345c3d57b","enode":"enode://422a22e066ae056507308bb1fecc971ca826bab52f6cb3b34b0589a2fc48a0408fdba15209748268cf34fac6bf4c209e24eda88a244a86828d194275ebe46f7f@127.0.0.1:0","enr":"0xf88fb8400775cf65da7c43b86728c2df5afa5e9c4c3f8f090a4adc01b3a5efa7baa889b372ff1fa45e2c44d87865585cd877390cdde993202b72699fc3adaf68ca1760bf0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103422a22e066ae056507308bb1fecc971ca826bab52f6cb3b34b0589a2fc48a040","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"4KC6fn6Jp6+AXiSr3hpaW0iboZdYUFGodV6MI0XD1Xs=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: e0a0ba\npopulation: 28 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 7895 5663 5814 244c | 126 60c5 (0) 648a (0) 6758 (0) 67f3 (0)\n001 4 a1c8 b6df bea1 9f7d | 75 acee (0) aeb4 (0) af02 (0) aaf0 (0)\n002 5 cf52 c42e c190 c272 | 27 c961 (0) c9c3 (0) c8c8 (0) c8ea (0)\n003 7 f645 f2b4 f215 f1ed | 14 f8ff (0) f9de (0) fa24 (0) ff75 (0)\n004 2 ec90 ef99 | 7 eb68 (0) e867 (0) ed42 (0) ec90 (0)\n005 2 e681 e471 | 3 e64d (0) e681 (0) e471 (0)\n============ DEPTH: 6 ==========================================\n006 2 e277 e2d3 | 2 e277 (0) e2d3 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 1 e09f | 1 e09f (0)\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"e0a0ba7e7e89a7af805e24abde1a5a5b489ba197585051a8755e8c2345c3d57b","private_key":"b0d5109a4802c73c946c7a258870bd410c63771abdb96a9270ef013cf2c988de","name":"node_e0a0ba7e7e89a7af805e24abde1a5a5b489ba197585051a8755e8c2345c3d57b","services":["bzz","pss"],"enable_msg_events":true,"port":43807},"up":true}},{"node":{"info":{"id":"1070df5e904e3865085b0319a81761e59146494c689e7567efe7465fc819ae8b","name":"node_1070df5e904e3865085b0319a81761e59146494c689e7567efe7465fc819ae8b","enode":"enode://111c70fb9b2eb78fd08286a0101565ce175084379f0d8449515001d42a158dc1bbaec026062de57a300ef9127fd4aca4cd98f12526ac8ebf4564dc7eb62d2861@127.0.0.1:0","enr":"0xf88fb84027a4b499ed66fe3c260acb1384fd562864ab2ea5be83229701ac73ad6916a91b0d8d1c6e3e112ba9b03b133077d6e109f47ddfa35dbd20d934c9305cafe06b8d0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103111c70fb9b2eb78fd08286a0101565ce175084379f0d8449515001d42a158dc1","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"EHDfXpBOOGUIWwMZqBdh5ZFGSUxonnVn7+dGX8gZros=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 1070df\npopulation: 26 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 a742 a7a8 a8f4 c272 | 130 acee (0) aeb4 (0) af02 (0) aaf0 (0)\n001 3 7895 5663 5814 | 61 648a (0) 6758 (0) 67f3 (0) 6795 (0)\n002 5 24f8 2e65 2fd2 3938 | 28 298a (0) 2a50 (0) 2ddf (0) 2c85 (0)\n003 4 0942 0e80 0d1c 046c | 21 0e3b (0) 0e2b (0) 0e80 (0) 0cfc (0)\n004 3 1dc0 1b1d 19ea | 9 1fd0 (0) 1dec (0) 1dc0 (0) 1add (0)\n005 4 140d 1484 1784 1686 | 4 140d (0) 1484 (0) 1784 (0) 1686 (0)\n============ DEPTH: 6 ==========================================\n006 1 138d | 1 138d (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 1 1049 | 1 1049 (0)\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"1070df5e904e3865085b0319a81761e59146494c689e7567efe7465fc819ae8b","private_key":"e257c3e07a2c0a5fb86fd8a37ab0d9ff743e74798f3f353ec68c2035dc86b111","name":"node_1070df5e904e3865085b0319a81761e59146494c689e7567efe7465fc819ae8b","services":["bzz","pss"],"enable_msg_events":true,"port":46317},"up":true}},{"node":{"info":{"id":"34118166845c185d15c286b7e5433539ee98ed634baabd534d57369fd5f7c681","name":"node_34118166845c185d15c286b7e5433539ee98ed634baabd534d57369fd5f7c681","enode":"enode://9f8abe5231a45fd20487a9b4121d524d3b7a84e8ba84e4172bdba5b9e0fd7c950aeeb9d50e3747eeccfaabb4b97f23b01b5de7db38bb79720461d2e07f6fd21c@127.0.0.1:0","enr":"0xf88fb840db60fc10ad69f264ddc0aa2c696ca00930d8509a5150488041b12ccff8a0f4546a98344daf7ccf1d4cc42b130fbbc59bee03d2c1cd405e2081227557266da9680183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1029f8abe5231a45fd20487a9b4121d524d3b7a84e8ba84e4172bdba5b9e0fd7c95","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"NBGBZoRcGF0Vwoa35UM1Oe6Y7WNLqr1TTVc2n9X3xoE=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 341181\npopulation: 28 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 f756 9f7d bea1 | 130 c961 (0) c9c3 (0) c8c8 (0) c8ea (0)\n001 5 68cb 6d3c 70f6 7895 | 61 60c5 (0) 648a (0) 6758 (0) 67f3 (0)\n002 5 046c 0e80 0d1c 0942 | 37 0e3b (0) 0e2b (0) 0e80 (0) 0cfc (0)\n003 6 2e65 2fd2 2ddf 2c80 | 11 2a50 (0) 298a (0) 2c85 (0) 2c80 (0)\n004 3 3980 397a 3938 | 8 3f31 (0) 3cab (0) 3c5b (0) 3b02 (0)\n005 4 31e1 3188 30fe 32ff | 6 31e6 (0) 31e1 (0) 3188 (0) 3051 (0)\n============ DEPTH: 6 ==========================================\n006 2 3728 36b9 | 2 3728 (0) 36b9 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"34118166845c185d15c286b7e5433539ee98ed634baabd534d57369fd5f7c681","private_key":"6aebf51d37cedb0b4d755280a22852af0bac9f6f3d355b43bbc8464947552e34","name":"node_34118166845c185d15c286b7e5433539ee98ed634baabd534d57369fd5f7c681","services":["bzz","pss"],"enable_msg_events":true,"port":33159},"up":true}},{"node":{"info":{"id":"56635699bd3bc78193adbdb8e8b7c2c91dab4140fdaa506fea2300ee86c4ba81","name":"node_56635699bd3bc78193adbdb8e8b7c2c91dab4140fdaa506fea2300ee86c4ba81","enode":"enode://bce79d844c8a5bf30fdabb154e156c9b572e1ae5cde1df2f778557d19f720bc830a47ae4678a962fd7f80d4868fda0658bad614a36a18d0ad2cdff495832699c@127.0.0.1:0","enr":"0xf88fb840e2fb45ac13932cdc0858fd63065cf2542a47b9c76331ea177fd36fa8df7938fc069e18891af924b9717bf4598486f9b4d0cbc8e354fdc0c601f9744bf9fcdad00183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102bce79d844c8a5bf30fdabb154e156c9b572e1ae5cde1df2f778557d19f720bc8","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"VmNWmb07x4GTrb246LfCyR2rQUD9qlBv6iMA7obEuoE=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 566356\npopulation: 32 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 8073 9f7d bea1 f1ed | 130 ddb8 (0) d959 (0) d9cf (0) dbd4 (0)\n001 6 046c 0942 1070 1b1d | 65 0e2b (0) 0e3b (0) 0e80 (0) 0cfc (0)\n002 6 6d3c 6dd3 68cb 6790 | 26 60c5 (0) 648a (0) 6758 (0) 67f3 (0)\n003 3 482e 43d4 43c9 | 19 4d91 (0) 4d38 (0) 4cec (0) 4b79 (0)\n004 7 5d82 5ff0 5a8b 5ac0 | 10 5ff0 (0) 5d82 (0) 5c7c (0) 5c37 (0)\n005 2 5144 50c1 | 3 52a8 (0) 5144 (0) 50c1 (0)\n============ DEPTH: 6 ==========================================\n006 1 5538 | 1 5538 (0)\n007 0 | 0\n008 1 56ca | 1 56ca (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"56635699bd3bc78193adbdb8e8b7c2c91dab4140fdaa506fea2300ee86c4ba81","private_key":"98f06aa013ffdc1dc622e6180a8b868dcb22f51d0e11dddc2994bd02016cd2d8","name":"node_56635699bd3bc78193adbdb8e8b7c2c91dab4140fdaa506fea2300ee86c4ba81","services":["bzz","pss"],"enable_msg_events":true,"port":39073},"up":true}},{"node":{"info":{"id":"19ea0a685fc4edd298b736dc7a778c9ec4362de378876911105fa9ba2ce90204","name":"node_19ea0a685fc4edd298b736dc7a778c9ec4362de378876911105fa9ba2ce90204","enode":"enode://25da9f823f6a53ece92ba5f5a8fd5f6e819defef89a1d3dca5ab85ea24f52320c59331446c7863ea2a9161b19c2d37abe3af6a9a6961ba1003d5783b6d35ac27@127.0.0.1:0","enr":"0xf88fb8406cdb82ce95d6e0c4222880a7cd7e50ca502bacad52f5afc7c4b72b8dbda35b466718ed4f8f11f2a4342a3f4e1aafefb6869ce7e77d94e6dc1901344e69a07bf80183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10325da9f823f6a53ece92ba5f5a8fd5f6e819defef89a1d3dca5ab85ea24f52320","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"GeoKaF/E7dKYtzbceneMnsQ2LeN4h2kREF+puizpAgQ=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 19ea0a\npopulation: 30 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 d700 c272 f756 f1ed | 130 ddb8 (0) dbd4 (0) dad0 (0) da36 (0)\n001 5 6d3c 68cb 7c7c 70f6 | 61 60c5 (0) 648a (0) 6758 (0) 67f3 (0)\n002 4 2e65 24f8 3938 32ff | 28 298a (0) 2a50 (0) 2c85 (0) 2c80 (0)\n003 4 046c 0d1c 0e80 0942 | 21 0e3b (0) 0e2b (0) 0e80 (0) 0cfc (0)\n004 3 1686 1049 1070 | 7 140d (0) 1484 (0) 1784 (0) 1686 (0)\n005 3 1dc0 1dec 1fd0 | 3 1fd0 (0) 1dec (0) 1dc0 (0)\n006 3 1add 1bd5 1b1d | 3 1add (0) 1bd5 (0) 1b1d (0)\n============ DEPTH: 7 ==========================================\n007 1 18e0 | 1 18e0 (0)\n008 1 194e | 1 194e (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"19ea0a685fc4edd298b736dc7a778c9ec4362de378876911105fa9ba2ce90204","private_key":"ac8b9e1b4cfbd81595b636bdadfff8bb5f50cd77c2d6dcb05ae20e8ec4c63c1d","name":"node_19ea0a685fc4edd298b736dc7a778c9ec4362de378876911105fa9ba2ce90204","services":["bzz","pss"],"enable_msg_events":true,"port":43067},"up":true}},{"node":{"info":{"id":"32ff1969d90aaa5a8ed2260968a8e2bac2d1cae597c906f90495f1dc5de7f8d3","name":"node_32ff1969d90aaa5a8ed2260968a8e2bac2d1cae597c906f90495f1dc5de7f8d3","enode":"enode://dc181c079cf6ec82d82772bc7ae94bffff7d8120914030631b14e2a1e91a2979c02e119f03635cdf5d3e001c2b0370eeb626c2aea142bcd446fcb9671a2503e1@127.0.0.1:0","enr":"0xf88fb84052f9b4ee198b6110c708f59268694515e9488cb46efc9f9be015665e9990c36d04f94605b4f0cabf5462667106ddae15421dc9edfc990e6517c0d59d90555f980183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103dc181c079cf6ec82d82772bc7ae94bffff7d8120914030631b14e2a1e91a2979","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"Mv8ZadkKqlqO0iYJaKjiusLRyuWXyQb5BJXx3F3n+NM=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 32ff19\npopulation: 30 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 b659 c42e cf52 f305 | 130 ddb8 (0) dbd4 (0) da36 (0) dad0 (0)\n001 3 43d4 5538 7895 | 61 4cec (0) 4d38 (0) 4d91 (0) 4b79 (0)\n002 4 0e80 0942 046c 19ea | 37 0e3b (0) 0e2b (0) 0e80 (0) 0cfc (0)\n003 8 2c80 2ddf 2e65 2fd2 | 11 298a (0) 2a50 (0) 2c85 (0) 2c80 (0)\n004 2 3980 3938 | 8 3f31 (0) 3c5b (0) 3cab (0) 3b02 (0)\n005 2 36b9 3411 | 3 3728 (0) 36b9 (0) 3411 (0)\n============ DEPTH: 6 ==========================================\n006 5 30fe 3051 31e1 31e6 | 5 31e1 (0) 31e6 (0) 3188 (0) 3051 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"32ff1969d90aaa5a8ed2260968a8e2bac2d1cae597c906f90495f1dc5de7f8d3","private_key":"b1c850ed51e29dd00bfd57bfed2e5d99cc9f9631301bd8fd28164014f4d70f33","name":"node_32ff1969d90aaa5a8ed2260968a8e2bac2d1cae597c906f90495f1dc5de7f8d3","services":["bzz","pss"],"enable_msg_events":true,"port":45657},"up":true}},{"node":{"info":{"id":"7895b2cb97b473f8893cc70a4421e0f8be1c033b27cd730fa13438b7a8f3fcb5","name":"node_7895b2cb97b473f8893cc70a4421e0f8be1c033b27cd730fa13438b7a8f3fcb5","enode":"enode://a68c7f6ec8a1dcf423bc83c0b592ee6ceaae76d432cd461b10b26f7450cb6f9f444cc86d3d4c99242f12f40dee10f0afb1e72ebee5e1b366d9b8b5f9655f7113@127.0.0.1:0","enr":"0xf88fb8406b7afa5e6f4769c19841e7d3ba40ddbb85b498bb51aabc56a435c0f46703037f63cd6cb222e5da5d92df503476767da8fe86181a30ff028b09d6f045fa46e58c0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103a68c7f6ec8a1dcf423bc83c0b592ee6ceaae76d432cd461b10b26f7450cb6f9f","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"eJWyy5e0c/iJPMcKRCHg+L4cAzsnzXMPoTQ4t6jz/LU=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 7895b2\npopulation: 31 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 9f7d e0a0 f6c0 f756 | 130 ddb8 (0) da36 (0) dad0 (0) dbd4 (0)\n001 8 1b1d 1070 046c 2fd2 | 65 1784 (0) 1686 (0) 140d (0) 1484 (0)\n002 6 43d4 43c9 5814 50c1 | 35 4cec (0) 4d91 (0) 4d38 (0) 4b79 (0)\n003 3 6790 68cb 6d3c | 13 60c5 (0) 648a (0) 6758 (0) 67f3 (0)\n004 2 7049 70f6 | 4 741a (0) 7660 (0) 7049 (0) 70f6 (0)\n005 3 7d16 7ce7 7c7c | 5 7e47 (0) 7d16 (0) 7ce7 (0) 7c46 (0)\n============ DEPTH: 6 ==========================================\n006 0 | 0\n007 2 7933 79e5 | 2 7933 (0) 79e5 (0)\n008 1 7850 | 1 7850 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"7895b2cb97b473f8893cc70a4421e0f8be1c033b27cd730fa13438b7a8f3fcb5","private_key":"4e69a8b973ab817bc7714a637ec947dd608ee56d981c0d77f7c99a6aa5f6ac6c","name":"node_7895b2cb97b473f8893cc70a4421e0f8be1c033b27cd730fa13438b7a8f3fcb5","services":["bzz","pss"],"enable_msg_events":true,"port":33345},"up":true}},{"node":{"info":{"id":"046ca54165f0dd4d62fd7d8ee9e97c655db3d35f5452a0ccb0dffc79c047978c","name":"node_046ca54165f0dd4d62fd7d8ee9e97c655db3d35f5452a0ccb0dffc79c047978c","enode":"enode://183b5b7be84ebacec7a72dc825fc12441895754ccc15e53f4aec88278bae9da625acc2a8ad692479985552cb9e2afa799a5d8915933fae79bc3c24a525beda63@127.0.0.1:0","enr":"0xf88fb840a134fc16f24fd19fc3b2f61ed683f8c65a6fca5513dd3c7d6aac3a81855ef1484bc3b37e5482fcecbcf469c07477e57fd0af25ae5ee67e1a07f9ba2b40a2f9330183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103183b5b7be84ebacec7a72dc825fc12441895754ccc15e53f4aec88278bae9da6","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"BGylQWXw3U1i/X2O6el8ZV2z019UUqDMsN/8ecBHl4w=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 046ca5\npopulation: 33 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 8 c272 c42e ef99 f756 | 130 ddb8 (0) dbd4 (0) da36 (0) dad0 (0)\n001 5 5987 50c1 5663 70f6 | 61 4cec (0) 4d38 (0) 4d91 (0) 4a95 (0)\n002 6 2fd2 244c 3938 3411 | 28 2a50 (0) 298a (0) 2ddf (0) 2c85 (0)\n003 3 1b1d 19ea 1070 | 16 1784 (0) 1686 (0) 1484 (0) 140d (0)\n004 3 0e80 0d1c 0942 | 11 0e2b (0) 0e3b (0) 0e80 (0) 0cfc (0)\n005 5 0191 0111 012b 025d | 6 0191 (0) 0111 (0) 012b (0) 025d (0)\n006 1 07f5 | 1 07f5 (0)\n============ DEPTH: 7 ==========================================\n007 2 0594 0561 | 2 0561 (0) 0594 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"046ca54165f0dd4d62fd7d8ee9e97c655db3d35f5452a0ccb0dffc79c047978c","private_key":"bc2961c291d9547bc0a390f7c929583558824d7047195fcd2cb026be0c9e0509","name":"node_046ca54165f0dd4d62fd7d8ee9e97c655db3d35f5452a0ccb0dffc79c047978c","services":["bzz","pss"],"enable_msg_events":true,"port":35721},"up":true}},{"node":{"info":{"id":"094256812084c6052a2604149aa3aba2379c483bf4ec25162f6b43934942775a","name":"node_094256812084c6052a2604149aa3aba2379c483bf4ec25162f6b43934942775a","enode":"enode://34b32e374d0cb1f5f1066e330600cb29a8c74400fa6b4e4cb7115a3ca378f605cba1434fceb05ce465f624ab6b77630026597000caea4bce2d96b3b6fb2508ad@127.0.0.1:0","enr":"0xf88fb84097508e3f96233a8a9233a357aa263237d1c15a1d3b78f6b535adbb51249f097b0ae9437277cdeda5fd8ac5416b37b3e9d769ae8802cf22908fd3ab751ecd035e0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10334b32e374d0cb1f5f1066e330600cb29a8c74400fa6b4e4cb7115a3ca378f605","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"CUJWgSCExgUqJgQUmqOrojecSDv07CUWL2tDk0lCd1o=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 094256\npopulation: 25 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 9ca1 b659 | 130 ddb8 (0) da36 (0) dad0 (0) dbd4 (0)\n001 5 70f6 5814 5663 5538 | 61 4cec (0) 4d38 (0) 4d91 (0) 4b79 (0)\n002 5 244c 2fd2 3938 3411 | 28 298a (0) 2a50 (0) 2ddf (0) 2c85 (0)\n003 3 1070 1b1d 19ea | 16 1784 (0) 1686 (0) 140d (0) 1484 (0)\n004 2 025d 046c | 10 0191 (0) 0111 (0) 012b (0) 035f (0)\n005 3 0d1c 0e3b 0e80 | 5 0e2b (0) 0e3b (0) 0e80 (0) 0cfc (0)\n============ DEPTH: 6 ==========================================\n006 0 | 0\n007 3 08bd 08e5 08f8 | 3 08bd (0) 08e5 (0) 08f8 (0)\n008 1 09b3 | 1 09b3 (0)\n009 0 | 0\n010 1 096a | 1 096a (0)\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"094256812084c6052a2604149aa3aba2379c483bf4ec25162f6b43934942775a","private_key":"c5996d97ff53b644b9c191150d78304a45d9874040fb778ddc5bb65779d86bc8","name":"node_094256812084c6052a2604149aa3aba2379c483bf4ec25162f6b43934942775a","services":["bzz","pss"],"enable_msg_events":true,"port":43233},"up":true}},{"node":{"info":{"id":"b659418885032905ea20ad47d70470e403e7e407e0e9ebf9277f9a2d81ec121c","name":"node_b659418885032905ea20ad47d70470e403e7e407e0e9ebf9277f9a2d81ec121c","enode":"enode://58735e5ecf597295cd19c074c7192858e890ceb98016f0e325cec4778d0218a9389a701caf242f4e40d8a3c9eb6b1f00a3174d7d2937fa28f16a12a8c78f9b18@127.0.0.1:0","enr":"0xf88fb84098020ea2d7d1fa04750b97764d931d2e91a9bd545f4d88bb37ca4bef38b7549a4c442d4f9a38ba4a8330780e9971528497eb7f33360afe06246098af41f622c20183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10258735e5ecf597295cd19c074c7192858e890ceb98016f0e325cec4778d0218a9","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"tllBiIUDKQXqIK1H1wRw5APn5Afg6ev5J3+aLYHsEhw=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: b65941\npopulation: 22 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 32ff 19ea 0942 | 126 4d38 (0) 4d91 (0) 4cec (0) 482e (0)\n001 4 d700 cf52 e09f f305 | 55 ddb8 (0) da36 (0) dad0 (0) dbd4 (0)\n002 3 8358 9f7d 9c21 | 38 81a5 (0) 80d7 (0) 8006 (0) 8074 (0)\n003 3 a8b5 a7a8 a1c8 | 23 acee (0) aeb4 (0) af02 (0) ab3f (0)\n004 4 ba91 bea1 bdc5 bcf8 | 8 b8e1 (0) bbaf (0) ba91 (0) bfc7 (0)\n005 1 b3f9 | 1 b3f9 (0)\n006 2 b5ea b4a1 | 2 b5ea (0) b4a1 (0)\n============ DEPTH: 7 ==========================================\n007 1 b78f | 1 b78f (0)\n008 1 b6df | 1 b6df (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"b659418885032905ea20ad47d70470e403e7e407e0e9ebf9277f9a2d81ec121c","private_key":"6f63b7184c7a59615a5a9236a580d00b48d321b742cf81ae7310b20bc9f46f2f","name":"node_b659418885032905ea20ad47d70470e403e7e407e0e9ebf9277f9a2d81ec121c","services":["bzz","pss"],"enable_msg_events":true,"port":36979},"up":true}},{"node":{"info":{"id":"f305273a7d08e72f69b0b153855e822f252cbbf34a18f305134eed9d1eb7b58a","name":"node_f305273a7d08e72f69b0b153855e822f252cbbf34a18f305134eed9d1eb7b58a","enode":"enode://d218f0e8c660ea02f34733c763f5ded66b745176058a141d5c3bedb3485fcdedc87b59cd8d7a48a8fd21db93c553cead53a9ac4aaf2f033a3ab072c3d256c511@127.0.0.1:0","enr":"0xf88fb84016a186737b4c1ca5f0aea03b84f96ec62714e7e5da2d64be6b2440ac1c2748ed6fe3708f82254d114172bda4aa9b90e52648fdf8a4965407adcf8299ba7e616e0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103d218f0e8c660ea02f34733c763f5ded66b745176058a141d5c3bedb3485fcded","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"8wUnOn0I5y9psLFThV6CLyUsu/NKGPMFE07tnR63tYo=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: f30527\npopulation: 26 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 19ea 046c 32ff 3938 | 126 4d38 (0) 4d91 (0) 4cec (0) 4b79 (0)\n001 2 9c21 b659 | 75 81a5 (0) 80d7 (0) 8006 (0) 8074 (0)\n002 4 d700 cf52 c42e c272 | 27 ddb8 (0) d959 (0) d9cf (0) dad0 (0)\n003 4 e471 e2d3 ec90 ef99 | 14 e64d (0) e681 (0) e471 (0) e277 (0)\n004 4 f8ff fa24 ff75 fc39 | 7 f8ff (0) f9de (0) fa24 (0) feb3 (0)\n005 3 f645 f6c0 f756 | 3 f645 (0) f6c0 (0) f756 (0)\n006 1 f1ed | 1 f1ed (0)\n============ DEPTH: 7 ==========================================\n007 2 f2b4 f215 | 2 f2b4 (0) f215 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"f305273a7d08e72f69b0b153855e822f252cbbf34a18f305134eed9d1eb7b58a","private_key":"39d3913d08835ee0310d15c086d9d2b5bdfe93c590ffeb6d94d0a053770a938a","name":"node_f305273a7d08e72f69b0b153855e822f252cbbf34a18f305134eed9d1eb7b58a","services":["bzz","pss"],"enable_msg_events":true,"port":43471},"up":true}},{"node":{"info":{"id":"f7561cb6740e17ec7c7d17068251b2c951d954c77804aa5af60464e9c3964e57","name":"node_f7561cb6740e17ec7c7d17068251b2c951d954c77804aa5af60464e9c3964e57","enode":"enode://f20b87c432491558cc8aebd5ea9ee25b89c6f93f08f1dbfdd8f5ce5b442263099d8f903e2a82b4c31c15c24e3763f335643014c943dac9dba80bb99b2bf7fab7@127.0.0.1:0","enr":"0xf88fb84014f4b222ba6b5de9fd84dbf8714c734b2273549ffd1e5d785589072c106e628a1a8c4cf1ed22b0b33864347ed1d46b4a941e32a0d27b46c3bdb1af2f742acb3b0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103f20b87c432491558cc8aebd5ea9ee25b89c6f93f08f1dbfdd8f5ce5b44226309","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"91YctnQOF+x8fRcGglGyyVHZVMd4BKpa9gRk6cOWTlc=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: f7561c\npopulation: 35 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 7 5c37 5663 7895 046c | 126 60c5 (0) 648a (0) 6758 (0) 67f3 (0)\n001 4 a8b5 a1c8 93c0 9c21 | 75 aeb4 (0) af02 (0) acee (0) ab3f (0)\n002 6 d700 c8ea cf52 cdb1 | 27 ddb8 (0) d959 (0) d9cf (0) da36 (0)\n003 6 e471 e277 e09f e867 | 14 e64d (0) e681 (0) e471 (0) e277 (0)\n004 6 f9de f8ff fa24 ff75 | 7 f8ff (0) f9de (0) fa24 (0) feb3 (0)\n005 4 f1ed f2b4 f215 f305 | 4 f1ed (0) f2b4 (0) f215 (0) f305 (0)\n============ DEPTH: 6 ==========================================\n006 0 | 0\n007 2 f645 f6c0 | 2 f645 (0) f6c0 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"f7561cb6740e17ec7c7d17068251b2c951d954c77804aa5af60464e9c3964e57","private_key":"ecae59b9fef453fa7d5352f8aa56d8af8ae96d6846b15e9aaff107d1031cdd4c","name":"node_f7561cb6740e17ec7c7d17068251b2c951d954c77804aa5af60464e9c3964e57","services":["bzz","pss"],"enable_msg_events":true,"port":45253},"up":true}},{"node":{"info":{"id":"9c21cb3e56f8ac66a7917a9ba14e58f77e998ac70c178b88b5053d9ac2777e60","name":"node_9c21cb3e56f8ac66a7917a9ba14e58f77e998ac70c178b88b5053d9ac2777e60","enode":"enode://437f633a70046ae9419cb2ddabf116dab0954965e968a6f007e228a7a7be8ce3d03010480c1b6e5d493d696d883920532e1bdb07b996dc70406fde018db10948@127.0.0.1:0","enr":"0xf88fb84021a7f662e426de82de76fe3fb5a9358593b06425d494639aaf2886f7d0cd4c2f09f3b746b5071fccca870524abebba751c338e44dd9c8af378c6f81bfa6b8b090183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102437f633a70046ae9419cb2ddabf116dab0954965e968a6f007e228a7a7be8ce3","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"nCHLPlb4rGankXqboU5Y936ZiscMF4uItQU9msJ3fmA=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 9c21cb\npopulation: 36 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 50c1 3938 | 126 60c5 (0) 648a (0) 6758 (0) 67f3 (0)\n001 9 cf52 c272 c42e e2d3 | 55 ddb8 (0) dad0 (0) da36 (0) dbd4 (0)\n002 7 a742 a616 a970 a8f4 | 37 af02 (0) aeb4 (0) acee (0) ab3f (0)\n003 7 8b43 8d19 8ea2 8073 | 21 81a5 (0) 80d7 (0) 8006 (0) 8074 (0)\n004 3 955d 9257 93c0 | 8 97da (0) 9464 (0) 95c0 (0) 9518 (0)\n005 3 9959 9948 9b8e | 3 9959 (0) 9948 (0) 9b8e (0)\n006 3 9f0e 9f7d 9ec8 | 3 9ec8 (0) 9f0e (0) 9f7d (0)\n============ DEPTH: 7 ==========================================\n007 0 | 0\n008 2 9c8e 9ca1 | 2 9c8e (0) 9ca1 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"9c21cb3e56f8ac66a7917a9ba14e58f77e998ac70c178b88b5053d9ac2777e60","private_key":"7eef00d143ca4d22aa8920afb1093aeee46b08939a3cfefeab24e6465f3d7523","name":"node_9c21cb3e56f8ac66a7917a9ba14e58f77e998ac70c178b88b5053d9ac2777e60","services":["bzz","pss"],"enable_msg_events":true,"port":45091},"up":true}},{"node":{"info":{"id":"f1ed9d45622ff974a1e396cd878b2deb89e31aa5d08da773423f292ae8dbcbb6","name":"node_f1ed9d45622ff974a1e396cd878b2deb89e31aa5d08da773423f292ae8dbcbb6","enode":"enode://1f605d05b467e52497e1862559e2ea806c76b9b68e4afb936b675a7afa72346881e26390a04e9afcda1a11fbefd20fd50c0762ce93772dac8c8498e6c301da9c@127.0.0.1:0","enr":"0xf88fb84092227639c78910be0212f1396d95453dd49c75961b2d39d43b6dbe94b6be413b25e0d6ae86588ec165a1c7881d660a1621459959cc457247cd1ab90403fbf3730183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1021f605d05b467e52497e1862559e2ea806c76b9b68e4afb936b675a7afa723468","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"8e2dRWIv+XSh45bNh4st64njGqXQjadzQj8pKujby7Y=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: f1ed9d\npopulation: 34 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 8 5c37 50c1 5663 7895 | 126 60c5 (0) 648a (0) 6758 (0) 67f3 (0)\n001 6 b4a1 a7a8 a1c8 a327 | 75 acee (0) aeb4 (0) af02 (0) aaf0 (0)\n002 3 c8ea c42e c272 | 27 ddb8 (0) d9cf (0) d959 (0) dbd4 (0)\n003 7 ef99 eb68 e681 e471 | 14 e64d (0) e681 (0) e471 (0) e277 (0)\n004 4 f9de feb3 ff75 fc39 | 7 f8ff (0) f9de (0) fa24 (0) feb3 (0)\n005 3 f645 f6c0 f756 | 3 f645 (0) f6c0 (0) f756 (0)\n============ DEPTH: 6 ==========================================\n006 3 f2b4 f215 f305 | 3 f2b4 (0) f215 (0) f305 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"f1ed9d45622ff974a1e396cd878b2deb89e31aa5d08da773423f292ae8dbcbb6","private_key":"43438f5d37cc4d101776db9c837b45c0348d0fb3ee2b4d66b66ea68193a67634","name":"node_f1ed9d45622ff974a1e396cd878b2deb89e31aa5d08da773423f292ae8dbcbb6","services":["bzz","pss"],"enable_msg_events":true,"port":42225},"up":true}},{"node":{"info":{"id":"3938e6b2c095084dc9975a3e8649133557495d34ac6df874c6d929266e3ffe6f","name":"node_3938e6b2c095084dc9975a3e8649133557495d34ac6df874c6d929266e3ffe6f","enode":"enode://d65c386d5a9eb699e325a7b173f89ced8caed9f813009e1949ae1c727decbb605d94eecc4f1b8733edb8dbd4c29d3b85d0de50abdab36072250f3de5cd28ac35@127.0.0.1:0","enr":"0xf88fb840eb07d284d45af49b9534f8d95e093e90eb86595cf13b63dab9984c6430a9ba0845a201ee9f0eaea3d91a875fba3a36474eebdebef6154e1227ce0f12d011b6f30183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103d65c386d5a9eb699e325a7b173f89ced8caed9f813009e1949ae1c727decbb60","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"OTjmssCVCE3Jl1o+hkkTNVdJXTSsbfh0xtkpJm4//m8=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 3938e6\npopulation: 34 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 9c21 bcf8 c42e f305 | 130 81a5 (0) 80d7 (0) 8006 (0) 8074 (0)\n001 6 70f6 7895 5c37 5987 | 61 60c5 (0) 648a (0) 6758 (0) 67f3 (0)\n002 8 1070 138d 1dc0 1b1d | 37 1686 (0) 1784 (0) 1484 (0) 140d (0)\n003 4 2fd2 26ab 24f8 244c | 11 2a50 (0) 298a (0) 2c85 (0) 2c80 (0)\n004 5 36b9 3411 30fe 3051 | 9 3728 (0) 36b9 (0) 3411 (0) 3188 (0)\n005 2 3cab 3c5b | 3 3f31 (0) 3cab (0) 3c5b (0)\n006 2 3b02 3a62 | 2 3b02 (0) 3a62 (0)\n============ DEPTH: 7 ==========================================\n007 0 | 0\n008 1 3980 | 1 3980 (0)\n009 1 397a | 1 397a (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"3938e6b2c095084dc9975a3e8649133557495d34ac6df874c6d929266e3ffe6f","private_key":"fbe0ae960205a2db352664d1d04b5bba8f4ba47cd2fe72d6ade101914a4ccaeb","name":"node_3938e6b2c095084dc9975a3e8649133557495d34ac6df874c6d929266e3ffe6f","services":["bzz","pss"],"enable_msg_events":true,"port":44129},"up":true}},{"node":{"info":{"id":"bcf85ecf421b871fca0247a7081188a8e2c08778b88ffad16db37ef024fec0fc","name":"node_bcf85ecf421b871fca0247a7081188a8e2c08778b88ffad16db37ef024fec0fc","enode":"enode://e6c340b1a3696a5038e4d658f970cac4bda141f463f92b1b44ee1cb7f7f6868ffdde7757ef00b0ff3b271a9a9ecc8ab2e5875c42cb87e496405bc922e6fa64d0@127.0.0.1:0","enr":"0xf88fb840c9a15fff14a8ea3abbc9aedcba9b73f5e824da4b1a9e08fcf571cab264f32d8e7a24034ff41cfab6ecfd8ac3d535031401c463fdbd7e54919a443452c29c81ae0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102e6c340b1a3696a5038e4d658f970cac4bda141f463f92b1b44ee1cb7f7f6868f","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"vPhez0Ibhx/KAkenCBGIqOLAh3i4j/rRbbN+8CT+wPw=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: bcf85e\npopulation: 29 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 50c1 046c 3938 | 126 6b4e (0) 68cb (0) 6e7f (0) 6c01 (0)\n001 3 cf52 c272 ef99 | 55 ddb8 (0) dbd4 (0) dad0 (0) da36 (0)\n002 8 8ea2 8358 87a3 86d6 | 38 80d7 (0) 8073 (0) 8074 (0) 8006 (0)\n003 4 a970 a8b5 a7a8 a1c8 | 23 acee (0) aeb4 (0) af02 (0) ab3f (0)\n004 4 b3f9 b4a1 b6df b659 | 6 b3f9 (0) b5ea (0) b4a1 (0) b78f (0)\n005 3 b8e1 bbaf ba91 | 3 b8e1 (0) bbaf (0) ba91 (0)\n============ DEPTH: 6 ==========================================\n006 3 be68 bea1 bfc7 | 3 bfc7 (0) be68 (0) bea1 (0)\n007 1 bdc5 | 1 bdc5 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"bcf85ecf421b871fca0247a7081188a8e2c08778b88ffad16db37ef024fec0fc","private_key":"0e3de03ec47c112197b5ce9f4876cc7e0328950172cb9bdcdbf176c7b1e8f4ad","name":"node_bcf85ecf421b871fca0247a7081188a8e2c08778b88ffad16db37ef024fec0fc","services":["bzz","pss"],"enable_msg_events":true,"port":40251},"up":true}},{"node":{"info":{"id":"ef99b6cdc05345a1ee82267890e3ccaeef1f2bd2fe7ae8b02b6b20b9a5ef85bb","name":"node_ef99b6cdc05345a1ee82267890e3ccaeef1f2bd2fe7ae8b02b6b20b9a5ef85bb","enode":"enode://a32bf13f4f87b1e4791889257bd457b480d36efd85c79fbdeafa0cd700b80d68203a12c8c8dc06bc7fe6784e017ed5beaf08fa18498f6b4a7014b292c79ad657@127.0.0.1:0","enr":"0xf88fb84090a9fff8d7f284263393a75dbe4c5ffa3baf41b98a66f2556dcceeba191c4f70370008eb731f510bf571448c132df27f82771b519fb3ad204ad2d0689fa0781d0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103a32bf13f4f87b1e4791889257bd457b480d36efd85c79fbdeafa0cd700b80d68","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"75m2zcBTRaHugiZ4kOPMru8fK9L+euiwK2sguaXvhbs=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: ef99b6\npopulation: 30 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 046c 50c1 | 126 298a (0) 2a50 (0) 2c85 (0) 2c80 (0)\n001 4 87a3 86d6 8358 bcf8 | 75 81a5 (0) 80d7 (0) 8006 (0) 8074 (0)\n002 4 d3e9 d700 c8ea c272 | 27 ddb8 (0) d959 (0) d9cf (0) dbd4 (0)\n003 8 fa24 fc51 fc39 f1ed | 14 f8ff (0) f9de (0) fa24 (0) feb3 (0)\n004 6 e681 e471 e09f e0a0 | 7 e64d (0) e681 (0) e471 (0) e277 (0)\n005 2 eb68 e867 | 2 eb68 (0) e867 (0)\n006 2 ed42 ec90 | 2 ed42 (0) ec90 (0)\n============ DEPTH: 7 ==========================================\n007 1 eebd | 1 eebd (0)\n008 0 | 0\n009 1 eff2 | 1 eff2 (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"ef99b6cdc05345a1ee82267890e3ccaeef1f2bd2fe7ae8b02b6b20b9a5ef85bb","private_key":"3831e217095e4b4c3136779fd48aa121431f6a092eb73e195733ff54b1173150","name":"node_ef99b6cdc05345a1ee82267890e3ccaeef1f2bd2fe7ae8b02b6b20b9a5ef85bb","services":["bzz","pss"],"enable_msg_events":true,"port":44801},"up":true}},{"node":{"info":{"id":"c272b12f4020ae5b20e3d29cd09de03fa0088e3eeb5f07aa7728b29a3e90e687","name":"node_c272b12f4020ae5b20e3d29cd09de03fa0088e3eeb5f07aa7728b29a3e90e687","enode":"enode://58ac0bf5776e7efc0260166f939bfdf2dde78fe6180b3d8aa44837f05cec80d837921c8066f45d495bfbe49ffeeca03fe962b8a7da5ccab5317ea019d665218e@127.0.0.1:0","enr":"0xf88fb840478fb2b3a4ab8e3cd050916898983baa1a6896bd48d38cc281048c9f916b9e493bc8b5aa56c0c2fc28e8aec7f9fcb6b6245cbd205c39861c37f7980d982af09a0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10258ac0bf5776e7efc0260166f939bfdf2dde78fe6180b3d8aa44837f05cec80d8","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"wnKxL0Agrlsg49Kc0J3gP6AIjj7rXweqdyiymj6Q5oc=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: c272b1\npopulation: 28 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 1070 19ea 046c 50c1 | 126 140d (0) 1484 (0) 1784 (0) 1686 (0)\n001 3 bcf8 9c21 9ec8 | 75 af02 (0) aeb4 (0) acee (0) aaf0 (0)\n002 7 ff75 f6c0 f756 f305 | 28 f9de (0) f8ff (0) fa24 (0) feb3 (0)\n003 2 d3e9 d700 | 11 ddb8 (0) d959 (0) d9cf (0) dbd4 (0)\n004 5 c9c3 c8ea cdb1 cc33 | 8 c961 (0) c9c3 (0) c8c8 (0) c8ea (0)\n005 5 c6a8 c603 c74d c534 | 5 c6a8 (0) c603 (0) c74d (0) c534 (0)\n============ DEPTH: 6 ==========================================\n006 1 c190 | 1 c190 (0)\n007 0 | 0\n008 1 c2d0 | 1 c2d0 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"c272b12f4020ae5b20e3d29cd09de03fa0088e3eeb5f07aa7728b29a3e90e687","private_key":"5ba984dd53fd38ef7d9f085d4d2f71bf5e57cebbcf57a991cdfc6f90de3bf1e2","name":"node_c272b12f4020ae5b20e3d29cd09de03fa0088e3eeb5f07aa7728b29a3e90e687","services":["bzz","pss"],"enable_msg_events":true,"port":36391},"up":true}},{"node":{"info":{"id":"c42e6492879439eeecd9938d17ff283fd8f5f24206906ca512b4daa4803b78b4","name":"node_c42e6492879439eeecd9938d17ff283fd8f5f24206906ca512b4daa4803b78b4","enode":"enode://50c60560f3e788431adda5f3ee4a65d462996a8a36a801d446f2d7d9e5a2d6dbc87d22941f4533589788d323a941f0f70a6c9b3b8c70f9984c1493879b56a3d6@127.0.0.1:0","enr":"0xf88fb840b2c5ef4495d49d374e60fa0e85dc6a8e48f5004aebec4bc746bfae6c2fe8e1180e0ba56367464f0e396f9d98f8e999544031948efb5659f3f33130eee1e8bb230183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10250c60560f3e788431adda5f3ee4a65d462996a8a36a801d446f2d7d9e5a2d6db","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"xC5kkoeUOe7s2ZONF/8oP9j18kIGkGylErTapIA7eLQ=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: c42e64\npopulation: 30 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 08f8 046c 32ff 3938 | 126 140d (0) 1484 (0) 1686 (0) 1784 (0)\n001 2 9c21 9ec8 | 75 a5ac (0) a505 (0) a4ee (0) a742 (0)\n002 8 e2d3 e0a0 ff75 f6c0 | 28 e867 (0) eb68 (0) ed42 (0) ec90 (0)\n003 4 dbd4 da36 d3e9 d700 | 11 ddb8 (0) d959 (0) d9cf (0) dbd4 (0)\n004 4 c8ea cf52 cc33 cdb1 | 8 c9c3 (0) c961 (0) c8c8 (0) c8ea (0)\n005 3 c190 c2d0 c272 | 3 c190 (0) c2d0 (0) c272 (0)\n============ DEPTH: 6 ==========================================\n006 3 c74d c6a8 c603 | 3 c74d (0) c6a8 (0) c603 (0)\n007 1 c534 | 1 c534 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"c42e6492879439eeecd9938d17ff283fd8f5f24206906ca512b4daa4803b78b4","private_key":"49943ef9cb5cfe1f6f01ab1a1f9fa8d6de40a8c49ed24b1ae244aff5459c9da0","name":"node_c42e6492879439eeecd9938d17ff283fd8f5f24206906ca512b4daa4803b78b4","services":["bzz","pss"],"enable_msg_events":true,"port":36607},"up":true}},{"node":{"info":{"id":"f215bc09268e60ebbec76f743bebd09d7e72d4cbeedc0b9d3417bb4a2ef42935","name":"node_f215bc09268e60ebbec76f743bebd09d7e72d4cbeedc0b9d3417bb4a2ef42935","enode":"enode://914631182a42d1219b9b28e6b5da1bd8c08e539575c6a7a85fa1d4222e9dc5c26156834d4dda7260174a844f276747baf4fbb4c75d6497ed9fc55f1300ad99df@127.0.0.1:0","enr":"0xf88fb840799f4f4b2fd08a7f68922afcbc7694953e771f3d0bfb81ee89d9f3c15bd5750b6e7e379849906088a02b409e2c46ef95e0f2169d796e86b7082d85ec6b99114e0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103914631182a42d1219b9b28e6b5da1bd8c08e539575c6a7a85fa1d4222e9dc5c2","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"8hW8CSaOYOu+x290O+vQnX5y1Mvu3AudNBe7Si70KTU=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: f215bc\npopulation: 28 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 5c37 5538 50c1 | 126 2a50 (0) 298a (0) 2ddf (0) 2c80 (0)\n001 3 ba91 9c21 9ec8 | 75 af02 (0) aeb4 (0) acee (0) ab3f (0)\n002 4 d3e9 cc33 cdb1 c42e | 27 ddb8 (0) d9cf (0) d959 (0) dbd4 (0)\n003 9 e867 eb68 ef99 e471 | 14 e867 (0) eb68 (0) ed42 (0) ec90 (0)\n004 3 f9de ff75 fc39 | 7 fa24 (0) f8ff (0) f9de (0) feb3 (0)\n005 3 f645 f6c0 f756 | 3 f645 (0) f6c0 (0) f756 (0)\n006 1 f1ed | 1 f1ed (0)\n============ DEPTH: 7 ==========================================\n007 1 f305 | 1 f305 (0)\n008 1 f2b4 | 1 f2b4 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"f215bc09268e60ebbec76f743bebd09d7e72d4cbeedc0b9d3417bb4a2ef42935","private_key":"1fed8e5946a97ef10fbabe578590010445e49851e010e422c67c268755300ba7","name":"node_f215bc09268e60ebbec76f743bebd09d7e72d4cbeedc0b9d3417bb4a2ef42935","services":["bzz","pss"],"enable_msg_events":true,"port":46479},"up":true}},{"node":{"info":{"id":"50c1a8023bfecffb09472fdc50898f4d050a31443d40a6c07b629090beb0df3d","name":"node_50c1a8023bfecffb09472fdc50898f4d050a31443d40a6c07b629090beb0df3d","enode":"enode://7e0efcde01784575e4464fcd19486068e81004e45914861571c763aab72c40fd7de3be474040f71ccb0daa1d9bbb197140dad13d641b98fed6ffbc50b322e2d4@127.0.0.1:0","enr":"0xf88fb8402fd5df06a939249a9fd0804b4b2f40564565802cf963bde27cbc3f4504997ac970f523add3a785ca408dbf18c0de819dd1f6ae8b65c540fbafe08e578e5673c40183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1027e0efcde01784575e4464fcd19486068e81004e45914861571c763aab72c40fd","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"UMGoAjv+z/sJRy/cUImPTQUKMUQ9QKbAe2KQkL6w3z0=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 50c1a8\npopulation: 34 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 10 bcf8 9c21 9ec8 c42e | 130 af02 (0) aeb4 (0) acee (0) aaf0 (0)\n001 4 046c 0942 0d1c 3938 | 65 2a50 (0) 298a (0) 2ddf (0) 2c85 (0)\n002 3 70f6 7c7c 7895 | 26 6b4e (0) 68cb (0) 6e7f (0) 6c01 (0)\n003 5 46bf 43c9 4a95 48d7 | 19 402c (0) 4005 (0) 435d (0) 43d4 (0)\n004 7 5ff0 5d82 5c37 5c7c | 10 5ff0 (0) 5d82 (0) 5c37 (0) 5c7c (0)\n005 3 56ca 5663 5538 | 3 56ca (0) 5663 (0) 5538 (0)\n============ DEPTH: 6 ==========================================\n006 1 52a8 | 1 52a8 (0)\n007 1 5144 | 1 5144 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"50c1a8023bfecffb09472fdc50898f4d050a31443d40a6c07b629090beb0df3d","private_key":"d0239dc44e8e56fc8a14b93a43280c425ab0988a63c4fa8d558b6b61b972ccbc","name":"node_50c1a8023bfecffb09472fdc50898f4d050a31443d40a6c07b629090beb0df3d","services":["bzz","pss"],"enable_msg_events":true,"port":35321},"up":true}},{"node":{"info":{"id":"cf52b3fc82ec24c3e9b40488d7c5f7ac8af731d159a103619bee932ec74d5e92","name":"node_cf52b3fc82ec24c3e9b40488d7c5f7ac8af731d159a103619bee932ec74d5e92","enode":"enode://e384773f94b9f4af8300be9d39cc581c8fd208e7fe459b0457b672457797b8c548dd064bb5361fcfc8587bf356c8499f98a5bd8b2271ffe616f070f8fe479178@127.0.0.1:0","enr":"0xf88fb8401939cbdd1ef26b61abcaf49b3902648650033c3decced5af79fdd44e154207b01ba84f8e62658f91e9386318c11267895180beaa28dec6fb4bbcd4355b6e733b0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102e384773f94b9f4af8300be9d39cc581c8fd208e7fe459b0457b672457797b8c5","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"z1Kz/ILsJMPptASI18X3rIr3MdFZoQNhm+6TLsdNXpI=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: cf52b3\npopulation: 32 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 244c 32ff 50c1 | 126 298a (0) 2a50 (0) 2ddf (0) 2c80 (0)\n001 4 bcf8 b659 9c21 9ec8 | 75 a4ee (0) a505 (0) a5ac (0) a742 (0)\n002 8 ff75 f305 f6c0 f756 | 28 f9de (0) f8ff (0) fa24 (0) feb3 (0)\n003 4 dbd4 d700 d408 d3e9 | 11 ddb8 (0) d9cf (0) d959 (0) dad0 (0)\n004 6 c603 c42e c534 c190 | 8 c190 (0) c2d0 (0) c272 (0) c74d (0)\n005 4 c961 c9c3 c8c8 c8ea | 4 c961 (0) c9c3 (0) c8c8 (0) c8ea (0)\n============ DEPTH: 6 ==========================================\n006 3 cd6c cdb1 cc33 | 3 cc33 (0) cd6c (0) cdb1 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"cf52b3fc82ec24c3e9b40488d7c5f7ac8af731d159a103619bee932ec74d5e92","private_key":"53a2e6b259e67e80a322fb0917b85f97860e8d37711d29f1964170d6b45d30cf","name":"node_cf52b3fc82ec24c3e9b40488d7c5f7ac8af731d159a103619bee932ec74d5e92","services":["bzz","pss"],"enable_msg_events":true,"port":36313},"up":true}},{"node":{"info":{"id":"e09f98114da64e7547b351637190f6621a1f75568cfa9960980fc77618f8855b","name":"node_e09f98114da64e7547b351637190f6621a1f75568cfa9960980fc77618f8855b","enode":"enode://a1889a38f3b1e9100f7626ad54d9622d503f7b1a9014ec13cd5215336196fc7bf27333448336381ec7c86db4006d245abb48c0f58940760bbb9deba79ca40c98@127.0.0.1:0","enr":"0xf88fb840aa1a2025c453351a72aae064d06aea3bd2d1804bd65cef80301c79f24934fbf94a35606db5f3a38a983d33c340db4c1f4c573ccf0b492159aa9bea1e78b3c8bc0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102a1889a38f3b1e9100f7626ad54d9622d503f7b1a9014ec13cd5215336196fc7b","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"4J+YEU2mTnVHs1FjcZD2YhofdVaM+plgmA/Hdhj4hVs=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: e09f98\npopulation: 25 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 0d1c 5987 5538 | 126 298a (0) 2a50 (0) 2c80 (0) 2c85 (0)\n001 6 a8b5 b659 ba91 93c0 | 75 a4ee (0) a505 (0) a5ac (0) a606 (0)\n002 2 c534 cf52 | 27 ddb8 (0) d9cf (0) d959 (0) dbd4 (0)\n003 3 f756 f1ed f215 | 14 fa24 (0) f8ff (0) f9de (0) feb3 (0)\n004 5 e867 eb68 ec90 eebd | 7 e867 (0) eb68 (0) ed42 (0) ec90 (0)\n005 3 e64d e681 e471 | 3 e64d (0) e681 (0) e471 (0)\n============ DEPTH: 6 ==========================================\n006 2 e277 e2d3 | 2 e277 (0) e2d3 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 1 e0a0 | 1 e0a0 (0)\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"e09f98114da64e7547b351637190f6621a1f75568cfa9960980fc77618f8855b","private_key":"0c21558e199ac8f8279ccba752dfce4a160302de5147dcf00d462d131b117293","name":"node_e09f98114da64e7547b351637190f6621a1f75568cfa9960980fc77618f8855b","services":["bzz","pss"],"enable_msg_events":true,"port":36519},"up":true}},{"node":{"info":{"id":"e2d36f335d90ad63148db8e353a78a30d8d9c0abe107be2cf8685f6a01ce74b9","name":"node_e2d36f335d90ad63148db8e353a78a30d8d9c0abe107be2cf8685f6a01ce74b9","enode":"enode://811ff91b658315c4fe2d501370f6e0a5c2a4e87fd7705b110ffd9f5b560a6cbf6a57694806e4a1371ae4ac682b8ef5eb4948f3f8798bde7bae62478ce8b29187@127.0.0.1:0","enr":"0xf88fb840a4ca41dc96fb07375e8655b138b07ef3e43a3cd6824b9b03a1bfbfd5dbffe8514a9522377d1e78474799dd1121831879798540a60453e10b5808f881eb4c12ec0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103811ff91b658315c4fe2d501370f6e0a5c2a4e87fd7705b110ffd9f5b560a6cbf","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"4tNvM12QrWMUjbjjU6eKMNjZwKvhB74s+GhfagHOdLk=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: e2d36f\npopulation: 25 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 70f6 50c1 5987 0d1c | 126 2a50 (0) 298a (0) 2ddf (0) 2c80 (0)\n001 3 a8b5 9c21 9ec8 | 75 a5ac (0) a505 (0) a4ee (0) a742 (0)\n002 3 c42e c534 cf52 | 27 ddb8 (0) d9cf (0) d959 (0) dbd4 (0)\n003 5 ff75 f6c0 f1ed f305 | 14 fa24 (0) f8ff (0) f9de (0) feb3 (0)\n004 4 e867 eb68 ec90 ef99 | 7 e867 (0) eb68 (0) ed42 (0) ec90 (0)\n005 3 e64d e681 e471 | 3 e64d (0) e681 (0) e471 (0)\n============ DEPTH: 6 ==========================================\n006 2 e0a0 e09f | 2 e0a0 (0) e09f (0)\n007 0 | 0\n008 1 e277 | 1 e277 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"e2d36f335d90ad63148db8e353a78a30d8d9c0abe107be2cf8685f6a01ce74b9","private_key":"85e06d183c4f5bd671a46232c0f291076bda62d6d879496e84ae6c378d966174","name":"node_e2d36f335d90ad63148db8e353a78a30d8d9c0abe107be2cf8685f6a01ce74b9","services":["bzz","pss"],"enable_msg_events":true,"port":39311},"up":true}},{"node":{"info":{"id":"9ec831d97418916fd9695465e041caf27824dbb51d6ff74d6b70f3bd561e70e6","name":"node_9ec831d97418916fd9695465e041caf27824dbb51d6ff74d6b70f3bd561e70e6","enode":"enode://4dd9a25575645b97012af13c2b562b1fdfc4444922998e1d08ac31e94030800ec40d6c48d4f3fd76c25ed0882398d9620390cbad7c72618375520f348552e966@127.0.0.1:0","enr":"0xf88fb8408fa9c2bc6983316b1331a0fbc8cd6fdb72a55deec652bdb9de328b24b60e78c51aca35ac84c776df03949c9a90e376a21a4e15f4b334551da12477a8eb16cd470183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1024dd9a25575645b97012af13c2b562b1fdfc4444922998e1d08ac31e94030800e","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"nsgx2XQYkW/ZaVRl4EHK8ngk27Udb/dNa3DzvVYecOY=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 9ec831\npopulation: 35 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 0d1c 70f6 5987 50c1 | 126 298a (0) 2a50 (0) 2e65 (0) 2fd2 (0)\n001 7 c42e c272 cdb1 cf52 | 55 ddb8 (0) d959 (0) d9cf (0) dbd4 (0)\n002 3 a1c8 ba91 bcf8 | 37 a5ac (0) a505 (0) a4ee (0) a742 (0)\n003 8 8b43 8ea2 8d19 8358 | 21 81a5 (0) 80d7 (0) 8006 (0) 8073 (0)\n004 4 955d 9518 9464 93c0 | 8 97da (0) 95c0 (0) 9518 (0) 955d (0)\n005 3 9b8e 9959 9948 | 3 9b8e (0) 9959 (0) 9948 (0)\n006 3 9c8e 9ca1 9c21 | 3 9c8e (0) 9ca1 (0) 9c21 (0)\n============ DEPTH: 7 ==========================================\n007 2 9f7d 9f0e | 2 9f0e (0) 9f7d (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"9ec831d97418916fd9695465e041caf27824dbb51d6ff74d6b70f3bd561e70e6","private_key":"1448c304f2af7e48ae443402703fb0a3b1e1f2d2bfef6a6456141daa73c558f6","name":"node_9ec831d97418916fd9695465e041caf27824dbb51d6ff74d6b70f3bd561e70e6","services":["bzz","pss"],"enable_msg_events":true,"port":46859},"up":true}},{"node":{"info":{"id":"553824ef701d3cd0191ae3a67de564ed0cf553e74bd60ed9de321f9302732ba6","name":"node_553824ef701d3cd0191ae3a67de564ed0cf553e74bd60ed9de321f9302732ba6","enode":"enode://f82e099fec04ce2be67700e463707728eb144ee2a7cf821945ec03d4b8166298749bed9860b4348e5a202bd5bff1957dc60d943fbf065aeed536e8baa6e18492@127.0.0.1:0","enr":"0xf88fb840f8de9483b97759f1daf327a569a475175e424a75efbc3654978adf85d062bc605b9880637ca11a772ac5e122d91c1acf3f95096d0ceea3935048f40ac35b28990183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102f82e099fec04ce2be67700e463707728eb144ee2a7cf821945ec03d4b8166298","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"VTgk73AdPNAZGuOmfeVk7Qz1U+dL1g7Z3jIfkwJzK6Y=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 553824\npopulation: 33 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 f215 e09f 9ec8 | 130 fa24 (0) f9de (0) f8ff (0) fc51 (0)\n001 5 30fe 32ff 3938 0942 | 65 298a (0) 2a50 (0) 2e65 (0) 2fd2 (0)\n002 5 6790 70f6 7895 7ce7 | 26 6b4e (0) 68cb (0) 6e7f (0) 6c01 (0)\n003 7 4a95 48d7 48f1 48b8 | 19 4d38 (0) 4d91 (0) 4cec (0) 4b79 (0)\n004 8 5ff0 5d82 5c37 5c7c | 10 5ff0 (0) 5d82 (0) 5c37 (0) 5c7c (0)\n005 3 52a8 5144 50c1 | 3 52a8 (0) 5144 (0) 50c1 (0)\n============ DEPTH: 6 ==========================================\n006 2 56ca 5663 | 2 56ca (0) 5663 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"553824ef701d3cd0191ae3a67de564ed0cf553e74bd60ed9de321f9302732ba6","private_key":"cf91bb0fea150fbf8705d939da029fdefebdd1076d1f645864e8d53e99501f66","name":"node_553824ef701d3cd0191ae3a67de564ed0cf553e74bd60ed9de321f9302732ba6","services":["bzz","pss"],"enable_msg_events":true,"port":36171},"up":true}},{"node":{"info":{"id":"0d1c35c6ea485cb33857b790ee262f974cf0d54cf8ce3003f8308ac2e87c2c25","name":"node_0d1c35c6ea485cb33857b790ee262f974cf0d54cf8ce3003f8308ac2e87c2c25","enode":"enode://8963c10c3899dce73c253820c99702353f5b64a1fcd1e94e3c60e8fa36a84d51e3155fe96a087599495c893da0da9d41148ab85235b65124f03236d23543e0eb@127.0.0.1:0","enr":"0xf88fb8404dcbbcadbab5ddfd4e10d68ffabb6b5c5038e323a062c9153dcb26b97422e6dc051d2044717c22e8f9279c57776cf04de0184acc5b55f05525303d87739498fb0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1038963c10c3899dce73c253820c99702353f5b64a1fcd1e94e3c60e8fa36a84d51","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"DRw1xupIXLM4V7eQ7iYvl0zw1Uz4zjAD+DCKwuh8LCU=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 0d1c35\npopulation: 34 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 8 e09f e2d3 c8ea cdb1 | 130 a4ee (0) a5ac (0) a505 (0) a742 (0)\n001 5 7c7c 70f6 5987 50c1 | 61 6e7f (0) 6c01 (0) 6dd3 (0) 6d5e (0)\n002 4 244c 3938 3411 30fe | 28 2a50 (0) 298a (0) 2ddf (0) 2c85 (0)\n003 6 19ea 1b1d 1dc0 1784 | 16 140d (0) 1484 (0) 1686 (0) 1784 (0)\n004 3 035f 025d 046c | 10 0191 (0) 0111 (0) 012b (0) 025d (0)\n005 4 0942 08bd 08f8 08e5 | 6 08bd (0) 08f8 (0) 08e5 (0) 09b3 (0)\n============ DEPTH: 6 ==========================================\n006 3 0e80 0e2b 0e3b | 3 0e80 (0) 0e2b (0) 0e3b (0)\n007 1 0cfc | 1 0cfc (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"0d1c35c6ea485cb33857b790ee262f974cf0d54cf8ce3003f8308ac2e87c2c25","private_key":"ef22b9afd09135d969cbfaa3c7f02beacec87dc03fc514f0565a8fdee536fab4","name":"node_0d1c35c6ea485cb33857b790ee262f974cf0d54cf8ce3003f8308ac2e87c2c25","services":["bzz","pss"],"enable_msg_events":true,"port":40431},"up":true}},{"node":{"info":{"id":"59876e7ff9e92243856dad23126e1d38d9a5ddae79772ed1b2bdb91f33a4a4b5","name":"node_59876e7ff9e92243856dad23126e1d38d9a5ddae79772ed1b2bdb91f33a4a4b5","enode":"enode://7720368c45d12af9a222ed1304cec25526c3f521dc8bdbdad1a966ab1b0bd4169a905fe56bec7845f8be9ddb4a1302c8c13d61273415db4ae840c8662272be45@127.0.0.1:0","enr":"0xf88fb84034abc65244d703a8f51ccf0ea8c8099e02c759dbf7c0b19434d08a4c72e9836629a6c3f2dad2881e6e85fc9aade07106ee0fbd25d2d04233ee4cbe90748a1ef10183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1037720368c45d12af9a222ed1304cec25526c3f521dc8bdbdad1a966ab1b0bd416","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"WYduf/npIkOFba0jEm4dONml3a55dy7Rsr25HzOkpLU=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 59876e\npopulation: 26 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 9ec8 e09f e2d3 cdb1 | 130 a4ee (0) a5ac (0) a505 (0) a7a8 (0)\n001 4 30fe 3938 046c 0d1c | 65 2a50 (0) 298a (0) 2ddf (0) 2c85 (0)\n002 2 7c7c 70f6 | 26 6b4e (0) 68cb (0) 6e7f (0) 6c01 (0)\n003 4 4a95 48b8 48f1 48d7 | 19 46bf (0) 447c (0) 447a (0) 44ad (0)\n004 4 52a8 50c1 5663 5538 | 6 52a8 (0) 5144 (0) 50c1 (0) 56ca (0)\n005 2 5c37 5c7c | 4 5ff0 (0) 5d82 (0) 5c37 (0) 5c7c (0)\n============ DEPTH: 6 ==========================================\n006 4 5a8b 5ac0 5a26 5bd8 | 4 5a8b (0) 5ac0 (0) 5a26 (0) 5bd8 (0)\n007 1 5814 | 1 5814 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"59876e7ff9e92243856dad23126e1d38d9a5ddae79772ed1b2bdb91f33a4a4b5","private_key":"d68e5f6712ad13a5f18afe7ea604194bc75d700d868489882a6d439f62d3319f","name":"node_59876e7ff9e92243856dad23126e1d38d9a5ddae79772ed1b2bdb91f33a4a4b5","services":["bzz","pss"],"enable_msg_events":true,"port":43863},"up":true}},{"node":{"info":{"id":"c53417f008e4550e1c4cb9a3e2955b3af6403e059b7b4b4c33869d9ed4a580a5","name":"node_c53417f008e4550e1c4cb9a3e2955b3af6403e059b7b4b4c33869d9ed4a580a5","enode":"enode://ed050956c10a60194bdfcc79bc927b7864a5ccd487521a7764441e4146defd9147ba153983e148a136ae5bde225df9eec974f956dcbd4c837b61013ce32a13fb@127.0.0.1:0","enr":"0xf88fb840d1ba87a7f202b2d69d25fe1c48a6386c6e96f4b473922d59cebadff7c92d58b528bf3e59e6f57acb30587ce613e1bb64b9f483d837420b47e669533583256c650183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103ed050956c10a60194bdfcc79bc927b7864a5ccd487521a7764441e4146defd91","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"xTQX8AjkVQ4cTLmj4pVbOvZAPgWbe0tMM4adntSlgKU=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: c53417\npopulation: 30 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 7 2c85 2c80 2fd2 244c | 126 298a (0) 2a50 (0) 2e65 (0) 2fd2 (0)\n001 5 a1c8 ba91 8358 87a3 | 75 a4ee (0) a505 (0) a5ac (0) a742 (0)\n002 4 f6c0 e471 e09f e2d3 | 28 f8ff (0) f9de (0) fa24 (0) ff75 (0)\n003 4 da36 ddb8 d700 d3e9 | 11 ddb8 (0) d959 (0) d9cf (0) dbd4 (0)\n004 3 c8ea cf52 cdb1 | 8 c961 (0) c9c3 (0) c8c8 (0) c8ea (0)\n005 3 c190 c2d0 c272 | 3 c190 (0) c2d0 (0) c272 (0)\n============ DEPTH: 6 ==========================================\n006 3 c74d c6a8 c603 | 3 c74d (0) c6a8 (0) c603 (0)\n007 1 c42e | 1 c42e (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"c53417f008e4550e1c4cb9a3e2955b3af6403e059b7b4b4c33869d9ed4a580a5","private_key":"a4ea2b639e280337e8009d2b54e9a11f76f523e1ef1ba9619f03ba35ee15abd8","name":"node_c53417f008e4550e1c4cb9a3e2955b3af6403e059b7b4b4c33869d9ed4a580a5","services":["bzz","pss"],"enable_msg_events":true,"port":39971},"up":true}},{"node":{"info":{"id":"cdb13873ac058861f295ebca5d958bf2bb793e3f9e274cf5a73a633425a9276f","name":"node_cdb13873ac058861f295ebca5d958bf2bb793e3f9e274cf5a73a633425a9276f","enode":"enode://c272080f38dac498765747523f4926457465e2941b3ddc08b62aa1affedc7f8e16f0e038d1a474ff133dfbbfc366fe750e99c2b75a184d40debca8913add7f88@127.0.0.1:0","enr":"0xf88fb840b2235f35efc093f6baac2bfe925b6f021eb803ca0488b4174d2a7ecc21921e124f99929c0f151ebdb9472db8350ab836dba4759f9aa6aad06a78f9c3bed45f7c0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102c272080f38dac498765747523f4926457465e2941b3ddc08b62aa1affedc7f8e","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"zbE4c6wFiGHylevKXZWL8rt5Pj+eJ0z1pzpjNCWpJ28=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: cdb138\npopulation: 26 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 08f8 0d1c 5987 70f6 | 126 2ddf (0) 2c80 (0) 2c85 (0) 2e65 (0)\n001 5 9ec8 8ea2 8358 ba91 | 75 a5ac (0) a505 (0) a4ee (0) a742 (0)\n002 3 e471 f756 f215 | 28 f8ff (0) f9de (0) fa24 (0) fc51 (0)\n003 3 da36 d3e9 d700 | 11 ddb8 (0) d959 (0) d9cf (0) dbd4 (0)\n004 4 c2d0 c272 c42e c534 | 8 c190 (0) c2d0 (0) c272 (0) c74d (0)\n005 4 c961 c9c3 c8c8 c8ea | 4 c961 (0) c9c3 (0) c8c8 (0) c8ea (0)\n006 1 cf52 | 1 cf52 (0)\n============ DEPTH: 7 ==========================================\n007 1 cc33 | 1 cc33 (0)\n008 1 cd6c | 1 cd6c (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"cdb13873ac058861f295ebca5d958bf2bb793e3f9e274cf5a73a633425a9276f","private_key":"276e93bd6b53db81cd162f42fb634b4f3910e6d45ec7079c645a69e4bb5afca8","name":"node_cdb13873ac058861f295ebca5d958bf2bb793e3f9e274cf5a73a633425a9276f","services":["bzz","pss"],"enable_msg_events":true,"port":45371},"up":true}},{"node":{"info":{"id":"70f68562733da4e3b1c3949fb6e11ac0bdd49ea7e732925f937f87df5af698d6","name":"node_70f68562733da4e3b1c3949fb6e11ac0bdd49ea7e732925f937f87df5af698d6","enode":"enode://8f535591758ee98b2ac41582a7d8642366706bd60b1e98b68f9a4019f653977b5d0973cee6fff3ec29c71ad9699d7e456f0ce29a85517f76f9876fdb6ff30a1d@127.0.0.1:0","enr":"0xf88fb840b1187ebcb96b2d46f5160c07357e2fb4ea69464366c7db75aacaa3b5c296724b5eff7e0985615cc94bf3aa4fe85bfaed822dd031b5d5b00e56937de9f27d922b0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1038f535591758ee98b2ac41582a7d8642366706bd60b1e98b68f9a4019f653977b","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"cPaFYnM9pOOxw5SftuEawL3UnqfnMpJfk3+H31r2mNY=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 70f685\npopulation: 33 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 9ec8 8ea2 e2d3 e471 | 130 a2a1 (0) a2e6 (0) a327 (0) a330 (0)\n001 8 2fd2 3938 3411 30fe | 65 298a (0) 2a50 (0) 2ddf (0) 2c80 (0)\n002 5 48d7 48b8 5538 50c1 | 35 46bf (0) 44ad (0) 447c (0) 447a (0)\n003 6 6790 60c5 6dd3 6d5e | 13 6e7f (0) 6c01 (0) 6dd3 (0) 6d5e (0)\n004 6 7933 79e5 7895 7d16 | 9 7933 (0) 79e5 (0) 7850 (0) 7895 (0)\n============ DEPTH: 5 ==========================================\n005 2 7660 741a | 2 7660 (0) 741a (0)\n006 0 | 0\n007 0 | 0\n008 1 7049 | 1 7049 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"70f68562733da4e3b1c3949fb6e11ac0bdd49ea7e732925f937f87df5af698d6","private_key":"0e58ed0a2b5955aa47fe1c7b185856a83cdf3966967becea9ac671a883a80100","name":"node_70f68562733da4e3b1c3949fb6e11ac0bdd49ea7e732925f937f87df5af698d6","services":["bzz","pss"],"enable_msg_events":true,"port":38721},"up":true}},{"node":{"info":{"id":"e471efbcf1def3915b3dda2dc65a86945c607be54a33e31e9625549becac0e34","name":"node_e471efbcf1def3915b3dda2dc65a86945c607be54a33e31e9625549becac0e34","enode":"enode://a39dec81162f336a51198d012a49706e42117ca42cf3d483d9ac74f65e01eab80f2164489ad2fffb217106e4f1e877d3ff2653643519569aa3f6b44becffccc7@127.0.0.1:0","enr":"0xf88fb8403f1d47db38a57c5f187e93e73913d7d9164793ebf66aa94e6e1eb9bec7be36de323d165610bbdde527989f06ff19902a0d7e342985034c0d1798277c0f9dd2ee0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103a39dec81162f336a51198d012a49706e42117ca42cf3d483d9ac74f65e01eab8","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"5HHvvPHe85FbPdotxlqGlFxge+VKM+MeliVUm+ysDjQ=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: e471ef\npopulation: 28 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 30fe 70f6 | 126 2a50 (0) 298a (0) 2ddf (0) 2c85 (0)\n001 2 ba91 8ea2 | 75 b3f9 (0) b5ea (0) b4a1 (0) b78f (0)\n002 7 d3e9 c2d0 c534 cdb1 | 27 ddb8 (0) d9cf (0) d959 (0) dbd4 (0)\n003 7 feb3 fc39 f756 f6c0 | 14 f9de (0) f8ff (0) fa24 (0) feb3 (0)\n004 4 eb68 e867 ec90 ef99 | 7 e867 (0) eb68 (0) ed42 (0) ec90 (0)\n005 4 e277 e2d3 e0a0 e09f | 4 e0a0 (0) e09f (0) e277 (0) e2d3 (0)\n============ DEPTH: 6 ==========================================\n006 2 e64d e681 | 2 e64d (0) e681 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"e471efbcf1def3915b3dda2dc65a86945c607be54a33e31e9625549becac0e34","private_key":"8e34bf0af71dad627841518807b1d0dd56349eafd2c3b416704905a478f24628","name":"node_e471efbcf1def3915b3dda2dc65a86945c607be54a33e31e9625549becac0e34","services":["bzz","pss"],"enable_msg_events":true,"port":33051},"up":true}},{"node":{"info":{"id":"8ea2c8acc111f38d5b4a5ed60252ee83f312d0f8359265d5b9266d54735052fe","name":"node_8ea2c8acc111f38d5b4a5ed60252ee83f312d0f8359265d5b9266d54735052fe","enode":"enode://7efcc0a5b110a3d47e6b3e9b74e485a18770d757efb293ac544941a244e1764eef9534fb52dd16769014c5d3591266da5d6816885513985fd4d9eb1ff29225b2@127.0.0.1:0","enr":"0xf88fb840af3e7481de1a628caeff3e925e26c7ec284791874d83ca00a34365321e53458a61c6d4e0dd1e3a7e816d3ba5b038820ca851aae32ea491173f4a090486d1a1440183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1027efcc0a5b110a3d47e6b3e9b74e485a18770d757efb293ac544941a244e1764e","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"jqLIrMER841bSl7WAlLug/MS0Pg1kmXVuSZtVHNQUv4=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 8ea2c8\npopulation: 33 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 0d1c 30fe 70f6 7c7c | 126 2a50 (0) 298a (0) 2e65 (0) 2fd2 (0)\n001 3 cdb1 c534 e471 | 55 ddb8 (0) d9cf (0) d959 (0) dbd4 (0)\n002 6 a8b5 a8f4 a616 bcf8 | 37 b3f9 (0) b5ea (0) b4a1 (0) b78f (0)\n003 6 93c0 9257 9464 9ec8 | 17 97da (0) 95c0 (0) 955d (0) 9518 (0)\n004 7 84a9 8402 87a3 86d6 | 12 84a9 (0) 8402 (0) 86d6 (0) 87a3 (0)\n005 2 8862 8b43 | 3 8854 (0) 8862 (0) 8b43 (0)\n006 2 8d19 8cc3 | 2 8cc3 (0) 8d19 (0)\n007 1 8f9a | 1 8f9a (0)\n============ DEPTH: 8 ==========================================\n008 2 8e28 8e7b | 2 8e28 (0) 8e7b (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"8ea2c8acc111f38d5b4a5ed60252ee83f312d0f8359265d5b9266d54735052fe","private_key":"c77c425da926ed3f45911d96e5d2ed01784a1e16987bbf8049d8c2b9a37eab26","name":"node_8ea2c8acc111f38d5b4a5ed60252ee83f312d0f8359265d5b9266d54735052fe","services":["bzz","pss"],"enable_msg_events":true,"port":45075},"up":true}},{"node":{"info":{"id":"8358a74fc8d8e39ccc40b4d3a212b7a69a6a8f6afc25cff2c9c7b44bbaf9ec82","name":"node_8358a74fc8d8e39ccc40b4d3a212b7a69a6a8f6afc25cff2c9c7b44bbaf9ec82","enode":"enode://a6221058c98285416177d220a2f3ad4f8fad14bb72b226b6eca678a156da263ca8026a756a1e54ac812e6cf9db5279df4616c839b8d1d1f19a158783fcca1ad4@127.0.0.1:0","enr":"0xf88fb840c04a30337e262366540d7c35ecd07ff64b9083fd1f2b5195c205fda603295a375950c2ab3c8ab2fb2494ed5ca1346133fa181d56577a6918d49941fdaaed2cec0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102a6221058c98285416177d220a2f3ad4f8fad14bb72b226b6eca678a156da263c","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"g1inT8jY45zMQLTTohK3pppqj2r8Jc/yyce0S7r57II=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 8358a7\npopulation: 32 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 0d1c 1dc0 7c7c | 126 140d (0) 1484 (0) 1686 (0) 1784 (0)\n001 4 ef99 c534 cdb1 c8ea | 55 fa24 (0) f9de (0) f8ff (0) fc51 (0)\n002 4 b659 bcf8 bdc5 a8b5 | 37 b3f9 (0) b5ea (0) b4a1 (0) b78f (0)\n003 5 9ec8 9c21 9464 9257 | 17 97da (0) 95c0 (0) 955d (0) 9518 (0)\n004 5 8862 8b43 8d19 8e7b | 9 8854 (0) 8862 (0) 8b43 (0) 8cc3 (0)\n005 4 84a9 8402 87a3 86d6 | 4 84a9 (0) 8402 (0) 86d6 (0) 87a3 (0)\n006 5 80d7 8006 8074 8073 | 5 81a5 (0) 80d7 (0) 8006 (0) 8073 (0)\n============ DEPTH: 7 ==========================================\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 1 837f | 1 837f (0)\n011 1 834f | 1 834f (0)\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"8358a74fc8d8e39ccc40b4d3a212b7a69a6a8f6afc25cff2c9c7b44bbaf9ec82","private_key":"39642ed937f1adee6d9034810e644cf755f21dc9f06efda6535d19c78001af83","name":"node_8358a74fc8d8e39ccc40b4d3a212b7a69a6a8f6afc25cff2c9c7b44bbaf9ec82","services":["bzz","pss"],"enable_msg_events":true,"port":32777},"up":true}},{"node":{"info":{"id":"a8b58013ff911871d1aa6c2bbea6c2e6ef9b00b87b80a41dc04724ad0488e2ff","name":"node_a8b58013ff911871d1aa6c2bbea6c2e6ef9b00b87b80a41dc04724ad0488e2ff","enode":"enode://6a681a2c60f7c7e2a832251ea4b54c1e7a75f5299e7a9bd343b3a8e6f147b41eb91a7fe95bd24adb2928b69018edf9eb146c92314b9d42964758449f767fb17a@127.0.0.1:0","enr":"0xf88fb84077f8314567599da083128579bdb43586da96cdd21d570ae4272c4a643ae5ef8d7bcc874624ab16e56b638270bf85aaabe97221c96f69bb9a7c487d9ad3c407880183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1026a681a2c60f7c7e2a832251ea4b54c1e7a75f5299e7a9bd343b3a8e6f147b41e","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"qLWAE/+RGHHRqmwrvqbC5u+bALh7gKQdwEckrQSI4v8=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: a8b580\npopulation: 34 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 138d 1dc0 0d1c 7c7c | 126 1686 (0) 1784 (0) 140d (0) 1484 (0)\n001 5 f756 e2d3 e09f cdb1 | 55 f9de (0) f8ff (0) fa24 (0) fc51 (0)\n002 7 9c21 93c0 9464 8ea2 | 38 97da (0) 95c0 (0) 955d (0) 9518 (0)\n003 5 b659 ba91 bea1 bcf8 | 14 b3f9 (0) b5ea (0) b4a1 (0) b78f (0)\n004 4 a616 a742 a7a8 a1c8 | 13 a2e6 (0) a2a1 (0) a327 (0) a330 (0)\n005 3 acee af02 aeb4 | 3 af02 (0) aeb4 (0) acee (0)\n006 3 ab3f ab71 aaf0 | 3 ab3f (0) ab71 (0) aaf0 (0)\n007 1 a970 | 1 a970 (0)\n============ DEPTH: 8 ==========================================\n008 0 | 0\n009 2 a8ff a8f4 | 2 a8ff (0) a8f4 (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"a8b58013ff911871d1aa6c2bbea6c2e6ef9b00b87b80a41dc04724ad0488e2ff","private_key":"8e39367b51358d04e71f5883ad1dbd70eee27b4ef493509df2377fbce04ad168","name":"node_a8b58013ff911871d1aa6c2bbea6c2e6ef9b00b87b80a41dc04724ad0488e2ff","services":["bzz","pss"],"enable_msg_events":true,"port":33233},"up":true}},{"node":{"info":{"id":"7c7ca5a7522a04f62f2bebd6197a03d78f255d0175c3dfceb5d92b684365b2aa","name":"node_7c7ca5a7522a04f62f2bebd6197a03d78f255d0175c3dfceb5d92b684365b2aa","enode":"enode://57465744f0e2ac055f9d29be31e53d6939f20a6038e2c66834a7967ecc44341d90aa115fb5255fd137271f992d89629cbf514bbbd904c9b935e2068f22852fab@127.0.0.1:0","enr":"0xf88fb840b9d47b0a5d48db8adef386ac49f3dc8c9eb545bdd756d6d1ab18b92b1299e94a295d530c29791eaa0942296992e5b5e2de9b435fd1b0c1b9267fa049259b2a120183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10357465744f0e2ac055f9d29be31e53d6939f20a6038e2c66834a7967ecc44341d","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"fHylp1IqBPYvK+vWGXoD148lXQF1w9/OtdkraENlsqo=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 7c7ca5\npopulation: 29 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 c8ea 8ea2 8358 a8b5 | 130 f9de (0) f8ff (0) fa24 (0) fc51 (0)\n001 5 0d1c 19ea 1dc0 2fd2 | 65 1686 (0) 1784 (0) 140d (0) 1484 (0)\n002 4 5bd8 5987 50c1 5538 | 35 402c (0) 4005 (0) 435d (0) 43c9 (0)\n003 5 6d3c 6c01 648a 6795 | 13 68cb (0) 6b4e (0) 6e7f (0) 6dd3 (0)\n004 4 7660 741a 7049 70f6 | 4 741a (0) 7660 (0) 7049 (0) 70f6 (0)\n005 3 79e5 7850 7895 | 4 7933 (0) 79e5 (0) 7850 (0) 7895 (0)\n006 1 7e47 | 1 7e47 (0)\n007 1 7d16 | 1 7d16 (0)\n============ DEPTH: 8 ==========================================\n008 1 7ce7 | 1 7ce7 (0)\n009 0 | 0\n010 1 7c46 | 1 7c46 (0)\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"7c7ca5a7522a04f62f2bebd6197a03d78f255d0175c3dfceb5d92b684365b2aa","private_key":"06b02c6e2c9d37cd4b50dedfe3e86594cbfd243d764ed379df53eb3392911dda","name":"node_7c7ca5a7522a04f62f2bebd6197a03d78f255d0175c3dfceb5d92b684365b2aa","services":["bzz","pss"],"enable_msg_events":true,"port":37295},"up":true}},{"node":{"info":{"id":"c8ea4177420785926e0929701f5e74c744920386f2a43b89d83c8281106cb95e","name":"node_c8ea4177420785926e0929701f5e74c744920386f2a43b89d83c8281106cb95e","enode":"enode://585e9760962e0f911be40a1a465b83c6ad84f45a4e2b2f9e06640352970e28cd99d8e407c455e5e265f9bda6cd4b542223ff8c8bdc4964ea89d72298640b1284@127.0.0.1:0","enr":"0xf88fb840654b3875a2b357e41fb9bacc6e4de76b7aa6d3718a157dcb098ca478b61e9a350c90fb9a21b15df60c21decd1c97d75a9c0bde7641cde5b3736d54ea855f1cae0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102585e9760962e0f911be40a1a465b83c6ad84f45a4e2b2f9e06640352970e28cd","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"yOpBd0IHhZJuCSlwH150x0SSA4bypDuJ2DyCgRBsuV4=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: c8ea41\npopulation: 32 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 30fe 08f8 0d1c 1dc0 | 126 1686 (0) 1784 (0) 140d (0) 1484 (0)\n001 6 ba91 a8b5 8b43 8358 | 75 b5ea (0) b4a1 (0) b78f (0) b6df (0)\n002 5 ff75 f1ed f756 ef99 | 28 f9de (0) f8ff (0) fa24 (0) fc51 (0)\n003 3 da36 d700 d3e9 | 11 ddb8 (0) d9cf (0) d959 (0) dbd4 (0)\n004 5 c534 c42e c190 c2d0 | 8 c190 (0) c2d0 (0) c272 (0) c74d (0)\n005 4 cf52 cd6c cdb1 cc33 | 4 cf52 (0) cc33 (0) cd6c (0) cdb1 (0)\n============ DEPTH: 6 ==========================================\n006 0 | 0\n007 2 c961 c9c3 | 2 c961 (0) c9c3 (0)\n008 0 | 0\n009 0 | 0\n010 1 c8c8 | 1 c8c8 (0)\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"c8ea4177420785926e0929701f5e74c744920386f2a43b89d83c8281106cb95e","private_key":"00c912a815d056b04de18334e53d8facff8ea04075ae869401191b0c74503fe2","name":"node_c8ea4177420785926e0929701f5e74c744920386f2a43b89d83c8281106cb95e","services":["bzz","pss"],"enable_msg_events":true,"port":44523},"up":true}},{"node":{"info":{"id":"87a337622455ae65daf3ab2555cee8985e9aa14bac245545d985296060e4a8de","name":"node_87a337622455ae65daf3ab2555cee8985e9aa14bac245545d985296060e4a8de","enode":"enode://7f46de8585a9766537267742cba2418426c637ca4c1973bac22d320ab3a432ed5e835edc53e2ab828ffd47c66137875d3b05da6577d637ab13bce3866fba58ef@127.0.0.1:0","enr":"0xf88fb840e4762001029c0140b891c3b53ef932dd40e210cccfd3fb490876ce81ae5275d766e2714b415a03bfc54f11d0392862d70f600927e39c35361191a937267f86c70183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1037f46de8585a9766537267742cba2418426c637ca4c1973bac22d320ab3a432ed","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"h6M3YiRVrmXa86slVc7omF6aoUusJFVF2YUpYGDkqN4=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 87a337\npopulation: 28 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 5c7c 30fe | 126 43c9 (0) 43d4 (0) 435d (0) 402c (0)\n001 3 ef99 c534 c8ea | 55 fa24 (0) f8ff (0) f9de (0) fc51 (0)\n002 4 a8b5 bcf8 bdc5 ba91 | 37 a327 (0) a330 (0) a2e6 (0) a2a1 (0)\n003 6 9464 9257 93c0 9c21 | 17 9b8e (0) 9948 (0) 9959 (0) 9ca1 (0)\n004 3 8b43 8d19 8ea2 | 9 8854 (0) 8862 (0) 8b43 (0) 8cc3 (0)\n005 7 837f 8358 81a5 80d7 | 8 81a5 (0) 80d7 (0) 8006 (0) 8073 (0)\n============ DEPTH: 6 ==========================================\n006 2 84a9 8402 | 2 84a9 (0) 8402 (0)\n007 1 86d6 | 1 86d6 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"87a337622455ae65daf3ab2555cee8985e9aa14bac245545d985296060e4a8de","private_key":"0e812f155b3fec855e829701b7616d3bdc18fe020e679796ff10b79f74fce66a","name":"node_87a337622455ae65daf3ab2555cee8985e9aa14bac245545d985296060e4a8de","services":["bzz","pss"],"enable_msg_events":true,"port":39229},"up":true}},{"node":{"info":{"id":"30feca631f06041cb14cead384dfaa5fffa6dc34b0cee54230efbe15e56a5884","name":"node_30feca631f06041cb14cead384dfaa5fffa6dc34b0cee54230efbe15e56a5884","enode":"enode://2d755da5dfdc21d6f3961f2beaab5613c412abd44276d5d050ef451b9bafb084a6afd797665c74c3ae6c0a33a52abf6c04504fd80a7fdd34ad91ffc3c671faae@127.0.0.1:0","enr":"0xf88fb8407a7294535524363392f62b42a82b13c5cfdfbc7e9e3710c54300cd606d41411000d4e002440679ca9f24fa5c4d8893f09f513ccde4545fa8b80580d1f46bf9360183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1022d755da5dfdc21d6f3961f2beaab5613c412abd44276d5d050ef451b9bafb084","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"MP7KYx8GBByxTOrThN+qX/+m3DSwzuVCMO++FeVqWIQ=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 30feca\npopulation: 36 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 c8ea e471 ba91 8ea2 | 130 f9de (0) f8ff (0) fa24 (0) fc51 (0)\n001 8 48d7 5538 5bd8 5987 | 61 435d (0) 43c9 (0) 43d4 (0) 402c (0)\n002 8 046c 012b 025d 035f | 37 07f5 (0) 0561 (0) 0594 (0) 046c (0)\n003 3 2c85 244c 26ab | 11 2a50 (0) 298a (0) 2fd2 (0) 2e65 (0)\n004 4 3c5b 3938 3b02 3a62 | 8 3f31 (0) 3cab (0) 3c5b (0) 3b02 (0)\n005 3 36b9 3728 3411 | 3 36b9 (0) 3728 (0) 3411 (0)\n006 1 32ff | 1 32ff (0)\n============ DEPTH: 7 ==========================================\n007 3 3188 31e6 31e1 | 3 3188 (0) 31e6 (0) 31e1 (0)\n008 1 3051 | 1 3051 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"30feca631f06041cb14cead384dfaa5fffa6dc34b0cee54230efbe15e56a5884","private_key":"0089202cbcad4ef35d5c4c18ac7f67f68b5c9f00a9ab8d1b7bfd57334bf95d95","name":"node_30feca631f06041cb14cead384dfaa5fffa6dc34b0cee54230efbe15e56a5884","services":["bzz","pss"],"enable_msg_events":true,"port":35121},"up":true}},{"node":{"info":{"id":"ba911175d3aa3fcc266e2a5aa32fb706208b8a9b5021a5f37c0b85f547eb375d","name":"node_ba911175d3aa3fcc266e2a5aa32fb706208b8a9b5021a5f37c0b85f547eb375d","enode":"enode://7a6e6ee730715ba07c013afa4adfa96b44af80ca9127d218d82b85f8f9a0f0d33a8650d3a482ab78523d91c1cf526d88087a2b352298ee29c2b060520436b2a5@127.0.0.1:0","enr":"0xf88fb84097647754d54945eb66061b25a00288c9cc9759b1b244c15785469f43e3cb3a1b0446356d42248da85d3b151c9d6ce61a9a8627dd5b6478e8e196150f8bf2b7ad0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1037a6e6ee730715ba07c013afa4adfa96b44af80ca9127d218d82b85f8f9a0f0d3","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"upERddOqP8wmbipaoy+3BiCLiptQIaXzfAuF9UfrN10=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: ba9111\npopulation: 38 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 7 48f1 4a95 4b79 44ad | 126 435d (0) 43c9 (0) 43d4 (0) 402c (0)\n001 9 f215 e09f e471 d3e9 | 55 f8ff (0) f9de (0) fa24 (0) fc51 (0)\n002 5 9464 9ec8 8ea2 87a3 | 38 9b8e (0) 9948 (0) 9959 (0) 9ca1 (0)\n003 8 acee a970 a8b5 aaf0 | 23 a330 (0) a327 (0) a2a1 (0) a2e6 (0)\n004 3 b3f9 b5ea b659 | 6 b3f9 (0) b5ea (0) b4a1 (0) b78f (0)\n005 4 bfc7 bea1 bcf8 bdc5 | 5 bfc7 (0) be68 (0) bea1 (0) bcf8 (0)\n============ DEPTH: 6 ==========================================\n006 1 b8e1 | 1 b8e1 (0)\n007 1 bbaf | 1 bbaf (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"ba911175d3aa3fcc266e2a5aa32fb706208b8a9b5021a5f37c0b85f547eb375d","private_key":"455cfde9eb8d35e128fc05e1b1e697250397c4baa4d0609935427370e67e9567","name":"node_ba911175d3aa3fcc266e2a5aa32fb706208b8a9b5021a5f37c0b85f547eb375d","services":["bzz","pss"],"enable_msg_events":true,"port":43089},"up":true}},{"node":{"info":{"id":"86d6f68ec0b8e1b3406943787f918bee74dd1827998bdb13ece8f690da2d296a","name":"node_86d6f68ec0b8e1b3406943787f918bee74dd1827998bdb13ece8f690da2d296a","enode":"enode://e11ad71a76ca345cb05b4689991a27df0d90136ab34404f7ac6659115281c0caebfb6c47af02b784a8dbd15632906ea81e935e5d68a0d818f86356d4098e2683@127.0.0.1:0","enr":"0xf88fb840ae4e55821d468925a34d498ef69d95cd2812772fc3333ffa4818f050f74bbe6c51618438af3372928bc751bc170fa31238feea5b167507551f583e2a8a15253d0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103e11ad71a76ca345cb05b4689991a27df0d90136ab34404f7ac6659115281c0ca","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"htb2jsC44bNAaUN4f5GL7nTdGCeZi9sT7Oj2kNotKWo=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 86d6f6\npopulation: 30 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 1dc0 6790 | 126 298a (0) 2a50 (0) 2e65 (0) 2fd2 (0)\n001 4 ef99 d3e9 cc33 c8ea | 55 f645 (0) f6c0 (0) f756 (0) f1ed (0)\n002 5 a616 a1c8 a0c8 bcf8 | 37 a2e6 (0) a2a1 (0) a327 (0) a330 (0)\n003 4 93c0 9c8e 9c21 9ec8 | 17 9959 (0) 9948 (0) 9b8e (0) 9ca1 (0)\n004 4 8862 8b43 8d19 8ea2 | 9 8d19 (0) 8cc3 (0) 8f9a (0) 8e28 (0)\n005 8 81a5 80d7 8006 8073 | 8 81a5 (0) 80d7 (0) 8006 (0) 8073 (0)\n============ DEPTH: 6 ==========================================\n006 2 84a9 8402 | 2 84a9 (0) 8402 (0)\n007 1 87a3 | 1 87a3 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"86d6f68ec0b8e1b3406943787f918bee74dd1827998bdb13ece8f690da2d296a","private_key":"462383c857370af2c4903fae5e5b3380ba12f14ac972e2a57fb03d60d53be99c","name":"node_86d6f68ec0b8e1b3406943787f918bee74dd1827998bdb13ece8f690da2d296a","services":["bzz","pss"],"enable_msg_events":true,"port":34901},"up":true}},{"node":{"info":{"id":"67909bdcaef2330ef120e524c76e1e382b474f3332d86f65282028e051f34c75","name":"node_67909bdcaef2330ef120e524c76e1e382b474f3332d86f65282028e051f34c75","enode":"enode://9062625e5fd25e5b95d2fb131bd9836c17a278d08fd26d556c2ff3e82375b7739963d7dc46cf90a82a3ec3a51610de42e11daa5439de02fce2239d11c5100ca8@127.0.0.1:0","enr":"0xf88fb840a6e4f385ee971a0e10914ccd098a592003d39eb308e35914192339eeb67e99f505f75a47fe66fcd6baf71a8a5d2bb584480b07f6546f35ec5a1d7ef8a7d99f410183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1029062625e5fd25e5b95d2fb131bd9836c17a278d08fd26d556c2ff3e82375b773","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"Z5Cb3K7yMw7xIOUkx24eOCtHTzMy2G9lKCAo4FHzTHU=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 67909b\npopulation: 31 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 c8ea cc33 8b43 86d6 | 130 f645 (0) f6c0 (0) f756 (0) f1ed (0)\n001 3 30fe 035f 1dc0 | 65 298a (0) 2a50 (0) 2fd2 (0) 2e65 (0)\n002 10 4005 44ad 4a95 48d7 | 35 43c9 (0) 43d4 (0) 435d (0) 402c (0)\n003 7 70f6 7049 7660 741a | 13 7933 (0) 79e5 (0) 7850 (0) 7895 (0)\n004 2 6b4e 6d5e | 7 68cb (0) 6b4e (0) 6e7f (0) 6c01 (0)\n005 1 60c5 | 1 60c5 (0)\n006 1 648a | 1 648a (0)\n============ DEPTH: 7 ==========================================\n007 0 | 0\n008 1 6758 | 1 6758 (0)\n009 1 67f3 | 1 67f3 (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 1 6795 | 1 6795 (0)\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"67909bdcaef2330ef120e524c76e1e382b474f3332d86f65282028e051f34c75","private_key":"e9d719353a6fb5bcae29ae98425718128b81ecc12560e8010bd8f63f2eedd79c","name":"node_67909bdcaef2330ef120e524c76e1e382b474f3332d86f65282028e051f34c75","services":["bzz","pss"],"enable_msg_events":true,"port":42515},"up":true}},{"node":{"info":{"id":"8b4318f86ad47976321af97bfbf95cd0a3b0aa22447aeb0611ed1a9bf1e6a4bf","name":"node_8b4318f86ad47976321af97bfbf95cd0a3b0aa22447aeb0611ed1a9bf1e6a4bf","enode":"enode://6ab1e0f44fc24a1a9f01b103ed29a36d9344168d3760528da384ed0217fea7f37c77f54f1f91f510c0639c5aca4ad1eecba807e7643ac2426f92ac23617de8f0@127.0.0.1:0","enr":"0xf88fb840c6bf13d71510c296358d2e7025b910b959dd7cda4c3ab34d014fa342222ce5842055d0dcd799e79e004c9236268d6a1ed3c28eb4668ffe87b55b7c2f0c5054d60183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1026ab1e0f44fc24a1a9f01b103ed29a36d9344168d3760528da384ed0217fea7f3","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"i0MY+GrUeXYyGvl7+/lc0KOwqiJEeusGEe0am/HmpL8=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 8b4318\npopulation: 32 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 1dc0 7049 6790 | 126 298a (0) 2a50 (0) 2e65 (0) 2fd2 (0)\n001 4 d3e9 c2d0 c8ea cc33 | 55 f6c0 (0) f645 (0) f756 (0) f1ed (0)\n002 2 a8b5 bdc5 | 37 a2a1 (0) a2e6 (0) a327 (0) a330 (0)\n003 7 9c21 9c8e 9ec8 9518 | 17 9959 (0) 9948 (0) 9b8e (0) 9ca1 (0)\n004 8 8358 81a5 80d7 8073 | 12 81a5 (0) 80d7 (0) 8006 (0) 8073 (0)\n005 6 8d19 8cc3 8f9a 8e28 | 6 8d19 (0) 8cc3 (0) 8f9a (0) 8e28 (0)\n============ DEPTH: 6 ==========================================\n006 2 8854 8862 | 2 8854 (0) 8862 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"8b4318f86ad47976321af97bfbf95cd0a3b0aa22447aeb0611ed1a9bf1e6a4bf","private_key":"5dedb1f9d69c2c6fe7a3aec668fac4e9c9615812829c7387000d87cbcd60aa41","name":"node_8b4318f86ad47976321af97bfbf95cd0a3b0aa22447aeb0611ed1a9bf1e6a4bf","services":["bzz","pss"],"enable_msg_events":true,"port":36035},"up":true}},{"node":{"info":{"id":"7049e92a396311fbf2f4a55bb5bd2fe3f7bb3c1a63f41bb88eb800edd45ac6e5","name":"node_7049e92a396311fbf2f4a55bb5bd2fe3f7bb3c1a63f41bb88eb800edd45ac6e5","enode":"enode://e430705ea5c1c11d55e6dc7d7738fc78a6b5e0b4b1833e6bd702d1227e5b8171505eb28c01546a2b0c9cffbc076b31b7bd1ee7f829b422bdae9b868a3d60055d@127.0.0.1:0","enr":"0xf88fb840bb450b66718c989ef173b71454ce6fcd33c94847190c06755cede1b16d7e05c551a88ba5700ef5828f74ded46693aaaf580f31c2249eff900c07824c8531d5a10183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103e430705ea5c1c11d55e6dc7d7738fc78a6b5e0b4b1833e6bd702d1227e5b8171","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"cEnpKjljEfvy9KVbtb0v4/e7PBpj9Bu4jrgA7dRaxuU=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 7049e9\npopulation: 23 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 cc33 bdc5 8b43 | 130 f645 (0) f6c0 (0) f756 (0) f1ed (0)\n001 2 30fe 1dc0 | 65 2a50 (0) 298a (0) 2e65 (0) 2fd2 (0)\n002 4 48b8 5bd8 5c37 5c7c | 35 435d (0) 43c9 (0) 43d4 (0) 402c (0)\n003 4 6c01 6790 6795 648a | 13 68cb (0) 6b4e (0) 6e7f (0) 6dd3 (0)\n004 7 7933 79e5 7850 7895 | 9 7933 (0) 79e5 (0) 7850 (0) 7895 (0)\n============ DEPTH: 5 ==========================================\n005 2 741a 7660 | 2 7660 (0) 741a (0)\n006 0 | 0\n007 0 | 0\n008 1 70f6 | 1 70f6 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"7049e92a396311fbf2f4a55bb5bd2fe3f7bb3c1a63f41bb88eb800edd45ac6e5","private_key":"55f5ca8c609ad483be093fad4614abf484adc370763bf034321dc9b5d7bd8896","name":"node_7049e92a396311fbf2f4a55bb5bd2fe3f7bb3c1a63f41bb88eb800edd45ac6e5","services":["bzz","pss"],"enable_msg_events":true,"port":40911},"up":true}},{"node":{"info":{"id":"1dc0ef1ce68dc681298177bde808af514efa52a5ad38c9cd2bd61968cdf19cfb","name":"node_1dc0ef1ce68dc681298177bde808af514efa52a5ad38c9cd2bd61968cdf19cfb","enode":"enode://3d69646df064c701b33bd040a7d35477e31bf7a56abb00bc2aead70938ab35f8399aaa1909e3c2bf41afc68a07292224110c8bc18d1eb5eb50df6b572361cd07@127.0.0.1:0","enr":"0xf88fb8408754060a82ff7e9fb41134faaa3a2ed4e6a5c27a819fc9fdd3aaaa0a1e74a1ba5f09b85c3433b0c3a49c7bfd7fdcaaf544be0a8e25ea79f8eeff4401c3fee5310183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1033d69646df064c701b33bd040a7d35477e31bf7a56abb00bc2aead70938ab35f8","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"HcDvHOaNxoEpgXe96AivUU76UqWtOMnNK9YZaM3xnPs=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 1dc0ef\npopulation: 35 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 9 d3e9 c2d0 c8ea cc33 | 130 f645 (0) f6c0 (0) f756 (0) f1ed (0)\n001 3 6790 7c7c 7049 | 61 43d4 (0) 43c9 (0) 435d (0) 402c (0)\n002 6 26ab 3a62 3938 3c5b | 28 2ddf (0) 2c80 (0) 2c85 (0) 2fd2 (0)\n003 5 035f 025d 012b 08f8 | 21 096a (0) 0942 (0) 09b3 (0) 08bd (0)\n004 5 1784 1484 140d 1070 | 7 1686 (0) 1784 (0) 140d (0) 1484 (0)\n005 5 19ea 18e0 1add 1bd5 | 6 1add (0) 1bd5 (0) 1b1d (0) 18e0 (0)\n============ DEPTH: 6 ==========================================\n006 1 1fd0 | 1 1fd0 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 1 1dec | 1 1dec (0)\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"1dc0ef1ce68dc681298177bde808af514efa52a5ad38c9cd2bd61968cdf19cfb","private_key":"067a43a21c4c9595ff81c7c87cc15ed7b5c5e62d85308e2e0b77c52c27a5d30f","name":"node_1dc0ef1ce68dc681298177bde808af514efa52a5ad38c9cd2bd61968cdf19cfb","services":["bzz","pss"],"enable_msg_events":true,"port":42187},"up":true}},{"node":{"info":{"id":"bdc5de01276157a0f3fc43a9cc3b41b2cacc8479118b75aec4ba9b2b7fa86d5e","name":"node_bdc5de01276157a0f3fc43a9cc3b41b2cacc8479118b75aec4ba9b2b7fa86d5e","enode":"enode://fa6deb61cc0b3f0d346f0a5f28f03b1deeab9de673b4843fffd14b87704b7d97074be58116c187408d0bca73a025cd911274ff51c3837206884713fcb57b639a@127.0.0.1:0","enr":"0xf88fb8409b31a5f75a714e32770fb9bfb24b2603601041ca8d8b98f953a48f932ec9750404cbec7ff1a44c7e7a9f89af7fbb85bfaa9e92361eecb63512fa33798f3391b20183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102fa6deb61cc0b3f0d346f0a5f28f03b1deeab9de673b4843fffd14b87704b7d97","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"vcXeASdhV6Dz/EOpzDtBssrMhHkRi3WuxLqbK3+obV4=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: bdc5de\npopulation: 31 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 5bd8 7049 1dc0 | 126 435d (0) 43d4 (0) 43c9 (0) 402c (0)\n001 3 d3e9 c2d0 cc33 | 55 f6c0 (0) f645 (0) f756 (0) f1ed (0)\n002 8 9464 9257 93c0 8358 | 38 9b8e (0) 9948 (0) 9959 (0) 9c8e (0)\n003 7 a0c8 a616 acee aaf0 | 23 acee (0) af02 (0) aeb4 (0) aaf0 (0)\n004 3 b3f9 b659 b4a1 | 6 b5ea (0) b4a1 (0) b78f (0) b6df (0)\n005 3 b8e1 bbaf ba91 | 3 b8e1 (0) bbaf (0) ba91 (0)\n============ DEPTH: 6 ==========================================\n006 3 bfc7 be68 bea1 | 3 bfc7 (0) be68 (0) bea1 (0)\n007 1 bcf8 | 1 bcf8 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"bdc5de01276157a0f3fc43a9cc3b41b2cacc8479118b75aec4ba9b2b7fa86d5e","private_key":"129a7a69ba65fd74ba294f66ea025ca335d94c7a05e91aaf3c24cf3f9f7e0972","name":"node_bdc5de01276157a0f3fc43a9cc3b41b2cacc8479118b75aec4ba9b2b7fa86d5e","services":["bzz","pss"],"enable_msg_events":true,"port":42761},"up":true}},{"node":{"info":{"id":"cc3397e9e11f75273d3f81d91f980f4504755f80b27a183212de56cc5085e58d","name":"node_cc3397e9e11f75273d3f81d91f980f4504755f80b27a183212de56cc5085e58d","enode":"enode://3d2a0536cb0fb672ffcc469c8a71d4ff9b33a2b48e749c64d32c8fdf6c704e695b3d6699f04baf4e6299b694f36c309308f9fca69859148ae8c7ef71c20df4f1@127.0.0.1:0","enr":"0xf88fb8404f40bae7e0adcf8abafd249d8dad969a599ccb2f825ac5a56a8ef652452bfc1146f1510ab3db60fed9e49b1332c606423f169adf9c7841aead732652178119c00183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1033d2a0536cb0fb672ffcc469c8a71d4ff9b33a2b48e749c64d32c8fdf6c704e69","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"zDOX6eEfdSc9P4HZH5gPRQR1X4CyehgyEt5WzFCF5Y0=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: cc3397\npopulation: 29 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 08f8 1dc0 6790 7049 | 126 3b02 (0) 3a62 (0) 3980 (0) 397a (0)\n001 6 93c0 8074 86d6 8b43 | 75 9948 (0) 9959 (0) 9b8e (0) 9ca1 (0)\n002 5 eb68 e471 e681 f215 | 28 f645 (0) f6c0 (0) f756 (0) f1ed (0)\n003 3 da36 d700 d3e9 | 11 ddb8 (0) d9cf (0) d959 (0) dbd4 (0)\n004 4 c603 c42e c272 c2d0 | 8 c42e (0) c534 (0) c74d (0) c6a8 (0)\n005 3 c961 c9c3 c8ea | 4 c9c3 (0) c961 (0) c8c8 (0) c8ea (0)\n006 1 cf52 | 1 cf52 (0)\n============ DEPTH: 7 ==========================================\n007 2 cd6c cdb1 | 2 cd6c (0) cdb1 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"cc3397e9e11f75273d3f81d91f980f4504755f80b27a183212de56cc5085e58d","private_key":"617246021b48922c971765385e8d46d55d22849c49a2b2a58c9e108c53f08b6a","name":"node_cc3397e9e11f75273d3f81d91f980f4504755f80b27a183212de56cc5085e58d","services":["bzz","pss"],"enable_msg_events":true,"port":44073},"up":true}},{"node":{"info":{"id":"5bd8faf93bcad07006e9426b45f5cc599f1963ab791deac4ff63d6739cd62a17","name":"node_5bd8faf93bcad07006e9426b45f5cc599f1963ab791deac4ff63d6739cd62a17","enode":"enode://81ccd85acd650e9264c02ea67a5c7743051afe4099a4013603c99b81cbc8ce3e18de1601c3e4bbe795262637c94798a502b7b87759c71bc9635c5f5763741ce3@127.0.0.1:0","enr":"0xf88fb84095b8956864f5e16f73f6caacda54957b5e3ab227e77c7b6a4f90d81ee18393e41d774af6765a97f6c71d2455d432959d81eb8a404400829bfacddf9d497112b20183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10381ccd85acd650e9264c02ea67a5c7743051afe4099a4013603c99b81cbc8ce3e","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"W9j6+TvK0HAG6UJrRfXMWZ8ZY6t5HerE/2PWc5zWKhc=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 5bd8fa\npopulation: 29 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 bdc5 cc33 c2d0 | 130 8d19 (0) 8cc3 (0) 8f9a (0) 8e28 (0)\n001 4 26ab 3728 30fe 138d | 65 3f31 (0) 3cab (0) 3c5b (0) 3980 (0)\n002 5 7049 7660 7c7c 7ce7 | 26 7933 (0) 79e5 (0) 7850 (0) 7895 (0)\n003 6 4005 447a 44ad 4a95 | 19 43d4 (0) 43c9 (0) 435d (0) 402c (0)\n004 4 50c1 5144 5538 5663 | 6 52a8 (0) 50c1 (0) 5144 (0) 56ca (0)\n005 2 5c7c 5c37 | 4 5ff0 (0) 5d82 (0) 5c37 (0) 5c7c (0)\n006 2 5814 5987 | 2 5814 (0) 5987 (0)\n============ DEPTH: 7 ==========================================\n007 3 5a8b 5ac0 5a26 | 3 5a8b (0) 5ac0 (0) 5a26 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"5bd8faf93bcad07006e9426b45f5cc599f1963ab791deac4ff63d6739cd62a17","private_key":"26ef88a18d2d40a51bfabd66c6d93698f7fb8ae73c0efe4be8504f76081c7f85","name":"node_5bd8faf93bcad07006e9426b45f5cc599f1963ab791deac4ff63d6739cd62a17","services":["bzz","pss"],"enable_msg_events":true,"port":45545},"up":true}},{"node":{"info":{"id":"c2d00c7d960174c0934129fdcec63525bfa728f78fb70b7c52036b772d6297ad","name":"node_c2d00c7d960174c0934129fdcec63525bfa728f78fb70b7c52036b772d6297ad","enode":"enode://0d8d82144d964d2235866b8f1ed08a27c362598490e3745a6bbfa3ba90241e098abdaa05715666f02a4ac86fe384307431a69f83d66b3de2dfbe7b1d8f8bf374@127.0.0.1:0","enr":"0xf88fb84080a73499a87c86c9c8f7a3432690866a7941a3001f228e0dd3920b9848aae5f641db07c25860ddcc3124563fa497fa1137ee5f9ea9fa548e8c7b0756275e1fc40183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1020d8d82144d964d2235866b8f1ed08a27c362598490e3745a6bbfa3ba90241e09","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"wtAMfZYBdMCTQSn9zsY1Jb+nKPePtwt8UgNrdy1il60=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: c2d00c\npopulation: 29 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 08f8 1dc0 138d 48b8 | 126 3f31 (0) 3c5b (0) 3cab (0) 3980 (0)\n001 6 a616 b3f9 ba91 bdc5 | 75 acee (0) af02 (0) aeb4 (0) ab3f (0)\n002 4 ff75 eb68 e471 e681 | 28 f645 (0) f6c0 (0) f756 (0) f1ed (0)\n003 3 da36 d700 d3e9 | 11 ddb8 (0) d9cf (0) d959 (0) dbd4 (0)\n004 4 c8ea cf52 cdb1 cc33 | 8 c9c3 (0) c961 (0) c8c8 (0) c8ea (0)\n005 5 c534 c42e c74d c6a8 | 5 c534 (0) c42e (0) c74d (0) c6a8 (0)\n============ DEPTH: 6 ==========================================\n006 1 c190 | 1 c190 (0)\n007 0 | 0\n008 1 c272 | 1 c272 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"c2d00c7d960174c0934129fdcec63525bfa728f78fb70b7c52036b772d6297ad","private_key":"f34329763f790689554fda7332d50df283663d26d6b7934322a4997f28ad4a70","name":"node_c2d00c7d960174c0934129fdcec63525bfa728f78fb70b7c52036b772d6297ad","services":["bzz","pss"],"enable_msg_events":true,"port":41949},"up":true}},{"node":{"info":{"id":"138dbc1662c4ce9b2b30ef5035914cc70465666fe18f313318e662d13f099621","name":"node_138dbc1662c4ce9b2b30ef5035914cc70465666fe18f313318e662d13f099621","enode":"enode://df33b1f0c1352c293d74d4b9b031141777ea5ea361a67862b312e14930160bea0489c08aac497214355e3c4702f1b31c1e74034f495d9cd59a19d893ce1d2bb4@127.0.0.1:0","enr":"0xf88fb840284f8900282f63e433dce06ae23eeb10839c72958e31168d974b1e3fad8efeab583f8ebc19fe0305c26f34560b4f16f2f246227220300c31ed1d2df4b58520dd0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102df33b1f0c1352c293d74d4b9b031141777ea5ea361a67862b312e14930160bea","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"E428FmLEzpsrMO9QNZFMxwRlZm/hjzEzGOZi0T8JliE=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 138dbc\npopulation: 29 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 a8b5 d3e9 c2d0 | 130 acee (0) af02 (0) aeb4 (0) aaf0 (0)\n001 4 7ce7 5c37 5c7c 5bd8 | 61 7660 (0) 741a (0) 70f6 (0) 7049 (0)\n002 7 3938 3b02 30fe 31e6 | 28 3f31 (0) 3cab (0) 3c5b (0) 3980 (0)\n003 5 035f 0d1c 0e3b 08bd | 21 0cfc (0) 0d1c (0) 0e80 (0) 0e2b (0)\n004 4 18e0 1dec 1dc0 1fd0 | 9 1bd5 (0) 1b1d (0) 1add (0) 194e (0)\n005 4 1686 1784 140d 1484 | 4 1686 (0) 1784 (0) 140d (0) 1484 (0)\n============ DEPTH: 6 ==========================================\n006 2 1049 1070 | 2 1049 (0) 1070 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"138dbc1662c4ce9b2b30ef5035914cc70465666fe18f313318e662d13f099621","private_key":"fea6806c3b8e5f07d86ecd3870391f3145d05518f0f2da0b48ba753f8454ad24","name":"node_138dbc1662c4ce9b2b30ef5035914cc70465666fe18f313318e662d13f099621","services":["bzz","pss"],"enable_msg_events":true,"port":43695},"up":true}},{"node":{"info":{"id":"d3e913cf4a7dabfb5699131b65e533a40adb46ea37e0ed4ce9433f99015986ef","name":"node_d3e913cf4a7dabfb5699131b65e533a40adb46ea37e0ed4ce9433f99015986ef","enode":"enode://5c269acede83f81f0a59a02e10764ac1cef987f398a7ae38228c12862ac5a6aadfbc89c7e0a02ba60019ae7a855be61a68e2964a0d36632a798a8410cf28b6bd@127.0.0.1:0","enr":"0xf88fb84076ebf3a52c4ed0e3af7e5f134b50f6537548b5a9781344afa5a5a84989ae3fbb0912b048b5c21e7c318132d7e2fcb35a8cfc00997a6e63dd68dcd4919f7e321a0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1035c269acede83f81f0a59a02e10764ac1cef987f398a7ae38228c12862ac5a6aa","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"0+kTz0p9q/tWmRMbZeUzpArbRuo34O1M6UM/mQFZhu8=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: d3e913\npopulation: 32 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 5c7c 1dc0 138d | 126 68cb (0) 6b4e (0) 6e7f (0) 6dd3 (0)\n001 8 a616 ba91 bdc5 86d6 | 75 b5ea (0) b4a1 (0) b78f (0) b6df (0)\n002 6 f215 ff75 e471 e681 | 28 f645 (0) f6c0 (0) f756 (0) f1ed (0)\n003 9 c603 c42e c534 c272 | 16 c961 (0) c9c3 (0) c8c8 (0) c8ea (0)\n004 2 d959 da36 | 6 ddb8 (0) d9cf (0) d959 (0) dbd4 (0)\n005 2 d700 d408 | 2 d700 (0) d408 (0)\n============ DEPTH: 6 ==========================================\n006 0 | 0\n007 1 d209 | 1 d209 (0)\n008 1 d302 | 1 d302 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"d3e913cf4a7dabfb5699131b65e533a40adb46ea37e0ed4ce9433f99015986ef","private_key":"e8cb3c33050ebe9bd3e750e4b8f55fa35e538fd293395b06710db344fa8f480c","name":"node_d3e913cf4a7dabfb5699131b65e533a40adb46ea37e0ed4ce9433f99015986ef","services":["bzz","pss"],"enable_msg_events":true,"port":45149},"up":true}},{"node":{"info":{"id":"5c7c15798e86fe794bb201614d46366ea96dc51091f5b19f149995e0d40df0a6","name":"node_5c7c15798e86fe794bb201614d46366ea96dc51091f5b19f149995e0d40df0a6","enode":"enode://7a0333ebcda5040e71cb74335af5f9434b53912b7918af8fddf3acbb2341a4091d7cbd9c4839061dd5390b11f0e988c24ac645003bca8092070c6d3f171ae68e@127.0.0.1:0","enr":"0xf88fb840e36636443db94a3278ad7e1c41abe6d90576990dca1c3b85c64f49472b0b4cfd029f18575656b1febfe27c53a79d62d703019939082d6a61fe480be68f9c63660183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1027a0333ebcda5040e71cb74335af5f9434b53912b7918af8fddf3acbb2341a409","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"XHwVeY6G/nlLsgFhTUY2bqltxRCR9bGfFJmV4NQN8KY=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 5c7c15\npopulation: 27 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 87a3 d3e9 | 130 b78f (0) b6df (0) b659 (0) b5ea (0)\n001 2 138d 035f | 65 3f31 (0) 3cab (0) 3c5b (0) 3b02 (0)\n002 4 6790 7ce7 741a 7049 | 26 68cb (0) 6b4e (0) 6e7f (0) 6dd3 (0)\n003 6 4005 4b79 4a95 48b8 | 19 43d4 (0) 43c9 (0) 435d (0) 402c (0)\n004 4 52a8 5144 50c1 5538 | 6 52a8 (0) 5144 (0) 50c1 (0) 56ca (0)\n005 6 5814 5987 5ac0 5a8b | 6 5814 (0) 5987 (0) 5ac0 (0) 5a8b (0)\n006 1 5ff0 | 1 5ff0 (0)\n============ DEPTH: 7 ==========================================\n007 1 5d82 | 1 5d82 (0)\n008 0 | 0\n009 1 5c37 | 1 5c37 (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"5c7c15798e86fe794bb201614d46366ea96dc51091f5b19f149995e0d40df0a6","private_key":"bb0921c7331c6ee15280ac5573b08e824e5c7248b1e5539eefb80c55c8702459","name":"node_5c7c15798e86fe794bb201614d46366ea96dc51091f5b19f149995e0d40df0a6","services":["bzz","pss"],"enable_msg_events":true,"port":38107},"up":true}},{"node":{"info":{"id":"5c373034770e413e700b1cd03b2035f769ecd9ab8eb54d32f7b2645be1991fe5","name":"node_5c373034770e413e700b1cd03b2035f769ecd9ab8eb54d32f7b2645be1991fe5","enode":"enode://8f0560f5e755cbf619660e72ba73a02998bca53e860cbdcc69bee129bf16923258b851c65723649d670dbf0e1166f14cfdfe1cb8c8c73eb2906f20e78edcea8e@127.0.0.1:0","enr":"0xf88fb840d2ea5eb11567c49114dd285962beba545d8adecc62156b334bc08bd946887cad22435f4a2b2d944fd7a37cd1f8a7a27bbb6eed794505b3b5000a8f607a7502610183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1028f0560f5e755cbf619660e72ba73a02998bca53e860cbdcc69bee129bf169232","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"XDcwNHcOQT5wCxzQOyA192ns2auOtU0y97JkW+GZH+U=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 5c3730\npopulation: 33 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 f1ed f215 f305 f756 | 130 f645 (0) f6c0 (0) f756 (0) f1ed (0)\n001 6 3938 3b02 3a62 3c5b | 65 3f31 (0) 3cab (0) 3c5b (0) 3a62 (0)\n002 3 6790 7ce7 7049 | 26 68cb (0) 6b4e (0) 6e7f (0) 6dd3 (0)\n003 8 447a 44ad 4005 4b79 | 19 43d4 (0) 43c9 (0) 435d (0) 402c (0)\n004 4 5538 52a8 50c1 5144 | 6 52a8 (0) 50c1 (0) 5144 (0) 56ca (0)\n005 4 5814 5987 5a26 5bd8 | 6 5814 (0) 5987 (0) 5a8b (0) 5ac0 (0)\n006 1 5ff0 | 1 5ff0 (0)\n============ DEPTH: 7 ==========================================\n007 1 5d82 | 1 5d82 (0)\n008 0 | 0\n009 1 5c7c | 1 5c7c (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"5c373034770e413e700b1cd03b2035f769ecd9ab8eb54d32f7b2645be1991fe5","private_key":"0c2c7d021de7510363cf5e2641eaa5f9378a5b212ffebbb2759c636e6eb1f581","name":"node_5c373034770e413e700b1cd03b2035f769ecd9ab8eb54d32f7b2645be1991fe5","services":["bzz","pss"],"enable_msg_events":true,"port":39663},"up":true}},{"node":{"info":{"id":"93c0e1adf23fdf1623359eb88c517bc521d5a26325554df890cc04c1fa17a5df","name":"node_93c0e1adf23fdf1623359eb88c517bc521d5a26325554df890cc04c1fa17a5df","enode":"enode://4fcf131746aae7e3b07348194ea8e617a5d50f3efacae7946f8ee5afc235f8ba437adfd9cd3411470f4cea27041ec717a816e46771aab4b057b191859ed04f79@127.0.0.1:0","enr":"0xf88fb8405f99513aca9b2504c8789a4395c454ad8201930dedfefb376fa80d8edb93790943b526ced56eb76753d377faf7819e9f2fa859c515903bb04604e0ba6d9a04bf0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1034fcf131746aae7e3b07348194ea8e617a5d50f3efacae7946f8ee5afc235f8ba","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"k8DhrfI/3xYjNZ64jFF7xSHVomMlVU34kMwEwfoXpd8=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 93c0e1\npopulation: 34 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 035f 48b8 48d7 5c37 | 126 3f31 (0) 3cab (0) 3c5b (0) 3b02 (0)\n001 8 ff75 f756 e09f eb68 | 55 f1ed (0) f305 (0) f2b4 (0) f215 (0)\n002 3 bdc5 a8b5 a616 | 37 b78f (0) b6df (0) b659 (0) b5ea (0)\n003 8 8cc3 8ea2 8b43 87a3 | 21 8d19 (0) 8cc3 (0) 8f9a (0) 8e28 (0)\n004 5 9c8e 9ca1 9c21 9f7d | 9 9959 (0) 9948 (0) 9b8e (0) 9c21 (0)\n005 4 95c0 9518 955d 9464 | 5 97da (0) 95c0 (0) 955d (0) 9518 (0)\n============ DEPTH: 6 ==========================================\n006 0 | 0\n007 1 9257 | 1 9257 (0)\n008 0 | 0\n009 0 | 0\n010 1 93ea | 1 93ea (0)\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"93c0e1adf23fdf1623359eb88c517bc521d5a26325554df890cc04c1fa17a5df","private_key":"e9b9e5f77b823f754cc953b6e8bb3f29875b25f3f07294dc648aad09741eae5d","name":"node_93c0e1adf23fdf1623359eb88c517bc521d5a26325554df890cc04c1fa17a5df","services":["bzz","pss"],"enable_msg_events":true,"port":39455},"up":true}},{"node":{"info":{"id":"035f15499cdb0f079b3e358ad54a6122681442a5293c3ae2fdf6c527004b36d2","name":"node_035f15499cdb0f079b3e358ad54a6122681442a5293c3ae2fdf6c527004b36d2","enode":"enode://a2ea0d984eb8c2a044d8d57b6b34ac49f7e319cd0ce8c9ad882e352f681e73bf1212f8c9b4155d9413384324db4dc6e0430b23bd9ebe32dc3694d927c34e07ef@127.0.0.1:0","enr":"0xf88fb84021c14a87840a5a62b181c58ce71769ae7998b9182a812551fba5dd2798c30a6228770d3463f5bd7428e5f81dd35ce8f649571ec472eb1f870a82386058e3756a0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103a2ea0d984eb8c2a044d8d57b6b34ac49f7e319cd0ce8c9ad882e352f681e73bf","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"A18VSZzbDwebPjWK1UphImgUQqUpPDri/fbFJwBLNtI=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 035f15\npopulation: 25 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 a616 8074 93c0 | 130 f6c0 (0) f645 (0) f756 (0) f1ed (0)\n001 4 6790 7ce7 5c7c 5c37 | 61 68cb (0) 6b4e (0) 6e7f (0) 6dd3 (0)\n002 2 30fe 26ab | 28 3f31 (0) 3cab (0) 3c5b (0) 3a62 (0)\n003 5 138d 1784 1484 1dc0 | 16 18e0 (0) 194e (0) 19ea (0) 1bd5 (0)\n004 3 08bd 0d1c 0e3b | 11 0cfc (0) 0d1c (0) 0e80 (0) 0e2b (0)\n005 3 07f5 0594 046c | 4 07f5 (0) 0561 (0) 0594 (0) 046c (0)\n006 3 0191 012b 0111 | 3 0191 (0) 0111 (0) 012b (0)\n============ DEPTH: 7 ==========================================\n007 1 025d | 1 025d (0)\n008 0 | 0\n009 1 0314 | 1 0314 (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"035f15499cdb0f079b3e358ad54a6122681442a5293c3ae2fdf6c527004b36d2","private_key":"595254b7c40bf18ec4d789cf500b58c5850ad2f21460f58230cd8e53b428c0bb","name":"node_035f15499cdb0f079b3e358ad54a6122681442a5293c3ae2fdf6c527004b36d2","services":["bzz","pss"],"enable_msg_events":true,"port":41613},"up":true}},{"node":{"info":{"id":"807416cc70f02d481a188027f7932b48e8f7b5e8258f7e9623f3f6e2985d8f6a","name":"node_807416cc70f02d481a188027f7932b48e8f7b5e8258f7e9623f3f6e2985d8f6a","enode":"enode://4ae810f37f174c8ffe4c90d5590e2bdc3677a1f413738a94776bbe63f1f45b08043188e3f2366b245c0e285f02ac759329e37760bc3c797ba7d70479dd8f9490@127.0.0.1:0","enr":"0xf88fb84006c5b23f700d5d387dc4a8d96c97cb9b9415cce70e955133a5f006e2b37011047da680b267227e5646409503737c6d382fa97364e60c24095320efbca3056ac70183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1024ae810f37f174c8ffe4c90d5590e2bdc3677a1f413738a94776bbe63f1f45b08","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"gHQWzHDwLUgaGIAn95MrSOj3teglj36WI/P24phdj2o=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 807416\npopulation: 29 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 48d7 48b8 7ce7 035f | 126 43d4 (0) 43c9 (0) 435d (0) 402c (0)\n001 3 eb68 cc33 d3e9 | 55 f305 (0) f2b4 (0) f215 (0) f1ed (0)\n002 2 bdc5 a616 | 37 b5ea (0) b4a1 (0) b78f (0) b6df (0)\n003 4 9ec8 9c8e 9257 93c0 | 17 9b8e (0) 9959 (0) 9948 (0) 9c21 (0)\n004 5 8cc3 8e7b 8ea2 8862 | 9 8d19 (0) 8cc3 (0) 8f9a (0) 8e28 (0)\n005 4 8402 84a9 86d6 87a3 | 4 87a3 (0) 86d6 (0) 84a9 (0) 8402 (0)\n006 3 837f 8358 834f | 3 837f (0) 834f (0) 8358 (0)\n007 1 81a5 | 1 81a5 (0)\n008 1 80d7 | 1 80d7 (0)\n============ DEPTH: 9 ==========================================\n009 1 8006 | 1 8006 (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 1 8073 | 1 8073 (0)\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"807416cc70f02d481a188027f7932b48e8f7b5e8258f7e9623f3f6e2985d8f6a","private_key":"421902540a521af21b446884bc2ff3f606e8e7814ffad298bdb1200502aa73f8","name":"node_807416cc70f02d481a188027f7932b48e8f7b5e8258f7e9623f3f6e2985d8f6a","services":["bzz","pss"],"enable_msg_events":true,"port":37835},"up":true}},{"node":{"info":{"id":"a6165a4b02d58be116892982c0ed3d49d86fec0e9f436a516b61868331ed853f","name":"node_a6165a4b02d58be116892982c0ed3d49d86fec0e9f436a516b61868331ed853f","enode":"enode://51ff87ed33ddf13e429d933fa411ad53dfdaf4f83d2d156ee20fc759f1900fbe70b000ad9891f8a5e79fa93673839682c50273f4012eae003b40c8bef34e0542@127.0.0.1:0","enr":"0xf88fb8402fd3e3ba496c67f81c4704bbedcb048e9985d8e2fa0d26e8aadf582cc5bdab7428098d781ee942ecc983bd6c645ee494759d9fc3aacc50957db0ac276b93ea8c0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10251ff87ed33ddf13e429d933fa411ad53dfdaf4f83d2d156ee20fc759f1900fbe","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"phZaSwLVi+EWiSmCwO09Sdhv7A6fQ2pRa2GGgzHthT8=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: a6165a\npopulation: 35 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 035f 1fd0 48b8 7ce7 | 126 3f31 (0) 3cab (0) 3c5b (0) 3b02 (0)\n001 5 ff75 e681 eb68 d3e9 | 55 f1ed (0) f305 (0) f2b4 (0) f215 (0)\n002 7 9c8e 9c21 9257 93c0 | 38 9b8e (0) 9959 (0) 9948 (0) 9ec8 (0)\n003 4 ba91 bdc5 bfc7 b3f9 | 14 b5ea (0) b4a1 (0) b78f (0) b6df (0)\n004 6 acee aeb4 aaf0 ab71 | 10 af02 (0) aeb4 (0) acee (0) ab3f (0)\n005 4 a2e6 a330 a1c8 a0c8 | 6 a2a1 (0) a2e6 (0) a327 (0) a330 (0)\n006 2 a5ac a505 | 3 a4ee (0) a5ac (0) a505 (0)\n============ DEPTH: 7 ==========================================\n007 2 a742 a7a8 | 2 a742 (0) a7a8 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 1 a606 | 1 a606 (0)\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"a6165a4b02d58be116892982c0ed3d49d86fec0e9f436a516b61868331ed853f","private_key":"f8b37704a0eba9987c7cbd4d718ee3eba88b7d76957c5043be17f16e8408c442","name":"node_a6165a4b02d58be116892982c0ed3d49d86fec0e9f436a516b61868331ed853f","services":["bzz","pss"],"enable_msg_events":true,"port":45387},"up":true}},{"node":{"info":{"id":"7ce7fec833a2e8c7720fcc97f820f2ca2aca85388210f887c3efe78b020766e7","name":"node_7ce7fec833a2e8c7720fcc97f820f2ca2aca85388210f887c3efe78b020766e7","enode":"enode://ff883ea700704e0d06c059393d1c9c79298f0ff8bd3a806cf777c1b1643539f79b58a73e57a76b7e4631b6f6d224a263b3da5a4029565cd811d1cfba392b16d0@127.0.0.1:0","enr":"0xf88fb84094a7b14977397bf60c09a538d9206bfbb260df1994b06df0a747d58e5b0d17562803bb201f443f5b17d527f875f5c9185455b13bf3aa0789206b83bb9dfb71c00183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102ff883ea700704e0d06c059393d1c9c79298f0ff8bd3a806cf777c1b1643539f7","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"fOf+yDOi6MdyD8yX+CDyyirKhTiCEPiHw+/niwIHZuc=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 7ce7fe\npopulation: 27 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 8074 a616 | 130 f645 (0) f6c0 (0) f756 (0) f1ed (0)\n001 4 26ab 138d 1fd0 035f | 65 3f31 (0) 3cab (0) 3c5b (0) 3b02 (0)\n002 5 5538 5bd8 5c37 5c7c | 35 56ca (0) 5663 (0) 5538 (0) 52a8 (0)\n003 4 6c01 648a 6795 6790 | 13 68cb (0) 6b4e (0) 6e7f (0) 6dd3 (0)\n004 4 70f6 7049 741a 7660 | 4 70f6 (0) 7049 (0) 7660 (0) 741a (0)\n005 4 79e5 7933 7850 7895 | 4 79e5 (0) 7933 (0) 7850 (0) 7895 (0)\n006 1 7e47 | 1 7e47 (0)\n007 1 7d16 | 1 7d16 (0)\n============ DEPTH: 8 ==========================================\n008 2 7c7c 7c46 | 2 7c46 (0) 7c7c (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"7ce7fec833a2e8c7720fcc97f820f2ca2aca85388210f887c3efe78b020766e7","private_key":"60cd3f72a03ac58379a8c6ba81e19265da277316a0e01fa3876bc4c92ff49df6","name":"node_7ce7fec833a2e8c7720fcc97f820f2ca2aca85388210f887c3efe78b020766e7","services":["bzz","pss"],"enable_msg_events":true,"port":41789},"up":true}},{"node":{"info":{"id":"48d79ac55f8df512af8e7d868aa40ac9b61493fa4f1b0ce0b76bf6da2eb30e78","name":"node_48d79ac55f8df512af8e7d868aa40ac9b61493fa4f1b0ce0b76bf6da2eb30e78","enode":"enode://707261d403a5192568c194162fd61ffccb0cde756d06d2eb7c117b0160f7ad528446db8695b53393c6b20ec9fa5a555d5a341980d106865e9527566d32b9bb54@127.0.0.1:0","enr":"0xf88fb840bb9ab177f3ef6ff14610eb47e7168572b6f01f94f263f707915fc7ea3d9af0f5468fc44ff2210116cbcf0bfbae738979e4a3cfee6ddecd0e4abac50af13eb92c0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102707261d403a5192568c194162fd61ffccb0cde756d06d2eb7c117b0160f7ad52","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"SNeaxV+N9RKvjn2GiqQKybYUk/pPGwzgt2v22i6zDng=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 48d79a\npopulation: 28 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 a970 8074 93c0 | 130 ddb8 (0) d9cf (0) d959 (0) dbd4 (0)\n001 3 30fe 26ab 1fd0 | 65 3980 (0) 397a (0) 3938 (0) 3a62 (0)\n002 4 6c01 6790 70f6 7ce7 | 26 68cb (0) 6b4e (0) 6e7f (0) 6dd3 (0)\n003 6 5538 50c1 5987 5bd8 | 16 52a8 (0) 50c1 (0) 5144 (0) 56ca (0)\n004 4 402c 4005 46bf 44ad | 9 43d4 (0) 43c9 (0) 435d (0) 402c (0)\n005 2 4cec 4d91 | 3 4cec (0) 4d38 (0) 4d91 (0)\n006 2 4b79 4a95 | 2 4a95 (0) 4b79 (0)\n============ DEPTH: 7 ==========================================\n007 0 | 0\n008 1 482e | 1 482e (0)\n009 1 48b8 | 1 48b8 (0)\n010 1 48f1 | 1 48f1 (0)\n011 0 | 0\n012 1 48de | 1 48de (0)\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"48d79ac55f8df512af8e7d868aa40ac9b61493fa4f1b0ce0b76bf6da2eb30e78","private_key":"332189f434da38340438c9e98fbf7e82e2cf6bc241b9b8689f12514555c995d7","name":"node_48d79ac55f8df512af8e7d868aa40ac9b61493fa4f1b0ce0b76bf6da2eb30e78","services":["bzz","pss"],"enable_msg_events":true,"port":41935},"up":true}},{"node":{"info":{"id":"48b850974575ca57a3cc5f9a4cf5aafd8688cb32b993f69983ece63258ff876e","name":"node_48b850974575ca57a3cc5f9a4cf5aafd8688cb32b993f69983ece63258ff876e","enode":"enode://b19c0ae1cb81e68f5f80d6b0ca2e30109c2fd797df00404cd2c70f4b0b22a45a3316d279f68f3d211584bf955fad3326cbf8ccc1c5b4de9f4d34671d033b9aef@127.0.0.1:0","enr":"0xf88fb840cfce87968b891140a7b5398ce7c46c9e55da927db6b676d5150b5d1d5808a0160675b0905f993242da939cc4bd9d3a8ce303209b3442c1a398dbc1c58abe8ede0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103b19c0ae1cb81e68f5f80d6b0ca2e30109c2fd797df00404cd2c70f4b0b22a45a","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"SLhQl0V1ylejzF+aTPWq/YaIyzK5k/aZg+zmMlj/h24=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 48b850\npopulation: 31 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 c2d0 e681 eb68 93c0 | 130 ddb8 (0) d9cf (0) d959 (0) dbd4 (0)\n001 2 1fd0 1784 | 65 3f31 (0) 3cab (0) 3c5b (0) 3980 (0)\n002 5 6790 7660 741a 70f6 | 26 68cb (0) 6b4e (0) 6e7f (0) 6dd3 (0)\n003 5 5538 50c1 5987 5c37 | 16 56ca (0) 5663 (0) 5538 (0) 52a8 (0)\n004 4 44ad 447a 46bf 4005 | 9 43c9 (0) 43d4 (0) 435d (0) 402c (0)\n005 3 4d91 4d38 4cec | 3 4d38 (0) 4d91 (0) 4cec (0)\n006 2 4a95 4b79 | 2 4a95 (0) 4b79 (0)\n============ DEPTH: 7 ==========================================\n007 0 | 0\n008 1 482e | 1 482e (0)\n009 3 48f1 48de 48d7 | 3 48f1 (0) 48de (0) 48d7 (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"48b850974575ca57a3cc5f9a4cf5aafd8688cb32b993f69983ece63258ff876e","private_key":"dad03259c72bb0ab9ef830e43beb607d0933e8ceab8af57177cdedcccaa94838","name":"node_48b850974575ca57a3cc5f9a4cf5aafd8688cb32b993f69983ece63258ff876e","services":["bzz","pss"],"enable_msg_events":true,"port":34161},"up":true}},{"node":{"info":{"id":"178401ec8d01a0a4f551d23e880a8e8a4eb87773565363843d51cf52660b1211","name":"node_178401ec8d01a0a4f551d23e880a8e8a4eb87773565363843d51cf52660b1211","enode":"enode://27897e5bff2021adf7dfc30beeae2d45dee4a331f85ccd2c611ff0df21a46f37373f49a11c7484953162778e229db0f12c587b97e449759086b0d9573e0c1a26@127.0.0.1:0","enr":"0xf88fb840429dfb2ce19f2d10de9df91da52260207acd7bcdb6f38055772e416e732174ee29384cd41078dbe55437ddf28a305fdb26b8fbe9c5f95c36514330d2055b27bf0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10227897e5bff2021adf7dfc30beeae2d45dee4a331f85ccd2c611ff0df21a46f37","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"F4QB7I0BoKT1UdI+iAqOik64d3NWU2OEPVHPUmYLEhE=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 178401\npopulation: 28 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 e681 eb68 9257 a970 | 130 ddb8 (0) d9cf (0) d959 (0) dbd4 (0)\n001 2 741a 48b8 | 61 68cb (0) 6b4e (0) 6e7f (0) 6dd3 (0)\n002 4 3c5b 36b9 3728 26ab | 28 3980 (0) 397a (0) 3938 (0) 3b02 (0)\n003 8 012b 035f 025d 0d1c | 21 0cfc (0) 0d1c (0) 0e80 (0) 0e2b (0)\n004 4 1add 1dec 1dc0 1fd0 | 9 194e (0) 19ea (0) 18e0 (0) 1bd5 (0)\n005 3 1049 1070 138d | 3 1049 (0) 1070 (0) 138d (0)\n============ DEPTH: 6 ==========================================\n006 2 140d 1484 | 2 140d (0) 1484 (0)\n007 1 1686 | 1 1686 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"178401ec8d01a0a4f551d23e880a8e8a4eb87773565363843d51cf52660b1211","private_key":"354ee66c6897d2e2295d1c694b61628074a9697102dde529318baa2cbc0c698c","name":"node_178401ec8d01a0a4f551d23e880a8e8a4eb87773565363843d51cf52660b1211","services":["bzz","pss"],"enable_msg_events":true,"port":34553},"up":true}},{"node":{"info":{"id":"1fd0192df1fbf33771ca575afbb4e27c6541cce4a3cff2dfc1f2c085e7fab79e","name":"node_1fd0192df1fbf33771ca575afbb4e27c6541cce4a3cff2dfc1f2c085e7fab79e","enode":"enode://a6d82f53e41ccd91583fbd89ab6dc5ca9ea1e1c8cf32336f3850d7abd7b67c12d26f485949244e17e996848469b10582ae14d19bba53fa22af1a289e2098fa2f@127.0.0.1:0","enr":"0xf88fb840011b8900371589a6bdc15199784c217ccdb148656c9cf6f7aeaaa2e96dc963a93ee8ad5c8509e66f007be32b90ca078bbc6d9e655df8ce0fa1a1ff258d3599cb0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103a6d82f53e41ccd91583fbd89ab6dc5ca9ea1e1c8cf32336f3850d7abd7b67c12","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"H9AZLfH78zdxylda+7TifGVBzOSjz/LfwfLAhef6t54=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 1fd019\npopulation: 30 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 e681 eb68 a616 a970 | 130 ddb8 (0) d9cf (0) d959 (0) dbd4 (0)\n001 4 741a 7ce7 48b8 48d7 | 61 68cb (0) 6b4e (0) 6e7f (0) 6dd3 (0)\n002 4 36b9 3728 2c85 26ab | 28 3980 (0) 397a (0) 3938 (0) 3b02 (0)\n003 7 012b 025d 035f 0e3b | 21 0cfc (0) 0d1c (0) 0e80 (0) 0e2b (0)\n004 4 138d 140d 1484 1784 | 7 1049 (0) 1070 (0) 138d (0) 140d (0)\n005 5 1add 1b1d 18e0 194e | 6 194e (0) 19ea (0) 18e0 (0) 1bd5 (0)\n============ DEPTH: 6 ==========================================\n006 2 1dec 1dc0 | 2 1dec (0) 1dc0 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"1fd0192df1fbf33771ca575afbb4e27c6541cce4a3cff2dfc1f2c085e7fab79e","private_key":"56799ffc0f8172319a5acee54229b310b2ee9bfcff23054e163d25ebd6b74da6","name":"node_1fd0192df1fbf33771ca575afbb4e27c6541cce4a3cff2dfc1f2c085e7fab79e","services":["bzz","pss"],"enable_msg_events":true,"port":33911},"up":true}},{"node":{"info":{"id":"26ab9c813822dbb4f1a230cd8e99e8ab280b242747deb55fdf93d160906ef331","name":"node_26ab9c813822dbb4f1a230cd8e99e8ab280b242747deb55fdf93d160906ef331","enode":"enode://cec920dd405d44d0b1e52e29040cb654a1fe80dc3bf4484ebbc8480cb43d5f0cb060aa4e8ede415db0b1d08a220d5ab4add6b38d42d7aa794db434ff9dda1697@127.0.0.1:0","enr":"0xf88fb840b1a4300c5cadd86b2b219a1044bd3e44834ca1f0053ee7a3e3e45f15100dbe35044cd77a522de4160bbe65b9c8ac4ab26c6a20c7d8a3c037e4e6694d1eb38e6d0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103cec920dd405d44d0b1e52e29040cb654a1fe80dc3bf4484ebbc8480cb43d5f0c","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"JqucgTgi27TxojDNjpnoqygLJCdH3rVf35PRYJBu8zE=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 26ab9c\npopulation: 42 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 c534 ff75 e681 eb68 | 130 ddb8 (0) d9cf (0) d959 (0) dbd4 (0)\n001 5 7ce7 741a 5bd8 4a95 | 61 6b4e (0) 68cb (0) 6e7f (0) 6dd3 (0)\n002 11 08bd 08f8 0e3b 012b | 37 0cfc (0) 0d1c (0) 0e80 (0) 0e2b (0)\n003 11 3cab 3c5b 3938 3a62 | 17 3f31 (0) 3cab (0) 3c5b (0) 3b02 (0)\n004 6 2a50 298a 2fd2 2e65 | 7 2a50 (0) 298a (0) 2e65 (0) 2fd2 (0)\n============ DEPTH: 5 ==========================================\n005 0 | 0\n006 2 24f8 244c | 2 24f8 (0) 244c (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 1 26ac | 1 26ac (0)\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"26ab9c813822dbb4f1a230cd8e99e8ab280b242747deb55fdf93d160906ef331","private_key":"9d39b98cb0569ba31464e7827579e71e40dae5f366d3dfe5cbb197a9f825dbd4","name":"node_26ab9c813822dbb4f1a230cd8e99e8ab280b242747deb55fdf93d160906ef331","services":["bzz","pss"],"enable_msg_events":true,"port":42047},"up":true}},{"node":{"info":{"id":"a9700308516c02cf9aea8809000a4e0596d6b44753e10bd0928df83e2eb9b9e7","name":"node_a9700308516c02cf9aea8809000a4e0596d6b44753e10bd0928df83e2eb9b9e7","enode":"enode://a74db2e9fc46ed2ad19743b773f0021b88e21cac389189ca1350aaecaf010fcd452f1991fb38c3d65a3745547b26e6dc0f655d75fd397cfef0fa286823e10b50@127.0.0.1:0","enr":"0xf88fb84002a5006b493d814889934b13a2e3714a6712f571e88ff5139d96e40cc1bcb6d719aba5a3169f334698e6273dfb9e8c3ed5234b18da0cfd2edf656396d0d92fcb0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102a74db2e9fc46ed2ad19743b773f0021b88e21cac389189ca1350aaecaf010fcd","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"qXADCFFsAs+a6ogJAApOBZbWtEdT4QvQko34Pi65uec=","hive":"\n=========================================================================\nThu Feb 28 17:51:00 UTC 2019 KΛÐΞMLIΛ hive: queen's address: a97003\npopulation: 28 (255), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 48d7 1784 1fd0 26ab | 126 5663 (0) 56ca (0) 5538 (0) 52a8 (0)\n001 2 eb68 e681 | 55 ddb8 (0) d9cf (0) d959 (0) dbd4 (0)\n002 6 84a9 8402 9c21 9c8e | 38 8b43 (0) 8854 (0) 8862 (0) 8d19 (0)\n003 5 b3f9 ba91 bfc7 bcf8 | 14 b8e1 (0) bbaf (0) ba91 (0) be68 (0)\n004 2 a0c8 a616 | 13 a2e6 (0) a2a1 (0) a327 (0) a330 (0)\n005 3 acee af02 aeb4 | 3 acee (0) af02 (0) aeb4 (0)\n006 3 ab71 ab3f aaf0 | 3 aaf0 (0) ab3f (0) ab71 (0)\n============ DEPTH: 7 ==========================================\n007 3 a8f4 a8ff a8b5 | 3 a8f4 (0) a8ff (0) a8b5 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"a9700308516c02cf9aea8809000a4e0596d6b44753e10bd0928df83e2eb9b9e7","private_key":"89ebf8f655338d3ee03b70fce8b3206157e3e198a2c1e6511944e7ba76672303","name":"node_a9700308516c02cf9aea8809000a4e0596d6b44753e10bd0928df83e2eb9b9e7","services":["bzz","pss"],"enable_msg_events":true,"port":40557},"up":true}}],"conns":[{"one":"e6812448728b4bda5962adceb1707b29f661d3d1a6b2ccd5f8183c9a1f4d01b6","other":"14849f811af20ce19fb29417d20c15fc16da1e45aebdf795a2c6ccb671e4bdac","up":true},{"one":"14849f811af20ce19fb29417d20c15fc16da1e45aebdf795a2c6ccb671e4bdac","other":"eb686a686fd70e41659cc69ec0db53d1512dfec238918afd0a515d8ce177d4d9","up":true},{"one":"eb686a686fd70e41659cc69ec0db53d1512dfec238918afd0a515d8ce177d4d9","other":"9464ad8da1a5effdc0351742dfffae941ffd9fab469637b2491caece53c57dc8","up":true},{"one":"9464ad8da1a5effdc0351742dfffae941ffd9fab469637b2491caece53c57dc8","other":"9257dc934dfbf17473b70cb85333c6fab67ee9b6228a646576c4f57253f1004e","up":true},{"one":"9257dc934dfbf17473b70cb85333c6fab67ee9b6228a646576c4f57253f1004e","other":"08bd1e049859b4a7c8078ca9741fe3daa668b9fe478da06d1a435cd5566b3e11","up":true},{"one":"08bd1e049859b4a7c8078ca9741fe3daa668b9fe478da06d1a435cd5566b3e11","other":"012ba278d582691241875c4c14ead91fff3983e190df7d9b43ade384e84c11fb","up":true},{"one":"012ba278d582691241875c4c14ead91fff3983e190df7d9b43ade384e84c11fb","other":"025de1d2ec529d3a7da302eef0f8c54996616d40c940c0956d470ffc2a007f33","up":true},{"one":"025de1d2ec529d3a7da302eef0f8c54996616d40c940c0956d470ffc2a007f33","other":"8402bd62282811ed236b2fa1f0d41ad4bbe54e420ee34adc6164cfd4baf8658d","up":true},{"one":"8402bd62282811ed236b2fa1f0d41ad4bbe54e420ee34adc6164cfd4baf8658d","other":"741a854ae299df49a738725bc58abe614e5e4302ffecd8320bbede8412d160c0","up":true},{"one":"741a854ae299df49a738725bc58abe614e5e4302ffecd8320bbede8412d160c0","other":"4a95d49f58057b039b55a34f67a348c052f61770065e41243ff055efc570a935","up":true},{"one":"4a95d49f58057b039b55a34f67a348c052f61770065e41243ff055efc570a935","other":"4b79e83186f2ab05932eaa99982a2e53373b83780e32d224d15cb2c85462451f","up":true},{"one":"4b79e83186f2ab05932eaa99982a2e53373b83780e32d224d15cb2c85462451f","other":"08f84878e44fed2adb4b2685b9f293dc3c73d5f9bc1c474870d943ec2ae73dbe","up":true},{"one":"08f84878e44fed2adb4b2685b9f293dc3c73d5f9bc1c474870d943ec2ae73dbe","other":"81a5a07f92f813e85b501b0028e1caa6e6a6c7efa5195ecb693cd2d91d5132a0","up":true},{"one":"81a5a07f92f813e85b501b0028e1caa6e6a6c7efa5195ecb693cd2d91d5132a0","other":"7660828fb0c8f89201d34e6f4d61cc6ba9a30cead6e4eb8253f6cc92e1845f23","up":true},{"one":"7660828fb0c8f89201d34e6f4d61cc6ba9a30cead6e4eb8253f6cc92e1845f23","other":"48f1ca6d433019f932fa4ae03e0decbcbea3fe635edff4458a669b83f8162b9a","up":true},{"one":"48f1ca6d433019f932fa4ae03e0decbcbea3fe635edff4458a669b83f8162b9a","other":"b3f95f225e2b6b76e6c7ef7c86caf83e35213f6a22da41e653ca1c190be23c9c","up":true},{"one":"b3f95f225e2b6b76e6c7ef7c86caf83e35213f6a22da41e653ca1c190be23c9c","other":"4005fd1fa8fbb318b29a62c368ada579e5122ca0578e6a75c509552be4b63b76","up":true},{"one":"4005fd1fa8fbb318b29a62c368ada579e5122ca0578e6a75c509552be4b63b76","other":"ff75b19017c84128f38dec4f63e1f247a5691dc0fae186e667afedb5fe9d2c80","up":true},{"one":"ff75b19017c84128f38dec4f63e1f247a5691dc0fae186e667afedb5fe9d2c80","other":"44adaabf9c46608a374ed816d3c40c63b6645f4f6e033a76431bc8f88713eb41","up":true},{"one":"44adaabf9c46608a374ed816d3c40c63b6645f4f6e033a76431bc8f88713eb41","other":"0e3b7722f3f84d83b3d744bea4e893715a01d4df3cf4a1c6a6823a1f5c9ad6b8","up":true},{"one":"0e3b7722f3f84d83b3d744bea4e893715a01d4df3cf4a1c6a6823a1f5c9ad6b8","other":"da36d1df95a158b0d3f9e7407d663a6b611dde0a77f00a584b97a939ab6a00de","up":true},{"one":"da36d1df95a158b0d3f9e7407d663a6b611dde0a77f00a584b97a939ab6a00de","other":"951877b34ee1535b5059c49beb03e8960ff9c12b694ef64708c77c30ff1dc706","up":true},{"one":"951877b34ee1535b5059c49beb03e8960ff9c12b694ef64708c77c30ff1dc706","other":"ab719e60a77ba5253f1690c920df9dd9f3a62071e9cce9d62e0001a522b3409e","up":true},{"one":"ab719e60a77ba5253f1690c920df9dd9f3a62071e9cce9d62e0001a522b3409e","other":"2c85f5361b2d5abcf799de50fe58b1ed2006ea18f75823748c33eb7e95b1cc39","up":true},{"one":"2c85f5361b2d5abcf799de50fe58b1ed2006ea18f75823748c33eb7e95b1cc39","other":"36b93656cab02213fa76124af6251109356abc5e0ae5dd1e203c6a013e014548","up":true},{"one":"36b93656cab02213fa76124af6251109356abc5e0ae5dd1e203c6a013e014548","other":"aaf051a087a92f874a3f6c7923015e4cffb4bb3ef381c977fd902f21e841d0f4","up":true},{"one":"aaf051a087a92f874a3f6c7923015e4cffb4bb3ef381c977fd902f21e841d0f4","other":"3728152c88f1e5e61f6523b09e8f3bb1023b700deccdca5fcc1e6488136b0e57","up":true},{"one":"3728152c88f1e5e61f6523b09e8f3bb1023b700deccdca5fcc1e6488136b0e57","other":"9c8e1f23f260c5a46b0001572675b19e5293ca65e7fdfc131c07612e9c4072fa","up":true},{"one":"9c8e1f23f260c5a46b0001572675b19e5293ca65e7fdfc131c07612e9c4072fa","other":"46bfa8bea56b0be1abfa5ad3561bb6bf49ed6695d83ee2b2c192c5a0408347cf","up":true},{"one":"46bfa8bea56b0be1abfa5ad3561bb6bf49ed6695d83ee2b2c192c5a0408347cf","other":"a0c88ba70599b0e72c18fa6aedd14d607cca3e9a49a5d50165d084e70328c2dd","up":true},{"one":"a0c88ba70599b0e72c18fa6aedd14d607cca3e9a49a5d50165d084e70328c2dd","other":"648a96d61898eb2d336ff7d5a229cfeb7b9f587282e40f9fe640e181ae26bdd3","up":true},{"one":"648a96d61898eb2d336ff7d5a229cfeb7b9f587282e40f9fe640e181ae26bdd3","other":"51440ab47fc5076c00cad16a542b846c26b3281ecea4dbca795ae9b80183ec90","up":true},{"one":"51440ab47fc5076c00cad16a542b846c26b3281ecea4dbca795ae9b80183ec90","other":"c603138e40fe2f85cc634017956ada6399fca99969e3bf0c1ee8428374e779f1","up":true},{"one":"c603138e40fe2f85cc634017956ada6399fca99969e3bf0c1ee8428374e779f1","other":"08e5a268f397385c69a7fec855ae4d889cfa98afef5b7c09fc4841e3f8894ad8","up":true},{"one":"08e5a268f397385c69a7fec855ae4d889cfa98afef5b7c09fc4841e3f8894ad8","other":"5a26ae73eebf27f6dbec2414f1277a249e814a7a06790d7061610e5227b086f6","up":true},{"one":"5a26ae73eebf27f6dbec2414f1277a249e814a7a06790d7061610e5227b086f6","other":"e8676d17966625c4fdac6bd9437981a0cf869c8b0010812edf0c79805e0e1ff1","up":true},{"one":"e8676d17966625c4fdac6bd9437981a0cf869c8b0010812edf0c79805e0e1ff1","other":"aeb45fe10b0dbd0f72ab6a77fbf971a8f46dbcdd96c08f23279d1434b4f38b1d","up":true},{"one":"aeb45fe10b0dbd0f72ab6a77fbf971a8f46dbcdd96c08f23279d1434b4f38b1d","other":"e2770cef7c1ad312b70d94ca5570e45f324c798a31a93203f505167aeab122b6","up":true},{"one":"e2770cef7c1ad312b70d94ca5570e45f324c798a31a93203f505167aeab122b6","other":"8e7b96d28edae711e1a4cee0d894e0bd92cdf410ba6f61713f7d9b0bee761d4c","up":true},{"one":"8e7b96d28edae711e1a4cee0d894e0bd92cdf410ba6f61713f7d9b0bee761d4c","other":"679554b410e415cfcdf1b14ef87759269b2bcaf07f4541122977db3a40091da2","up":true},{"one":"679554b410e415cfcdf1b14ef87759269b2bcaf07f4541122977db3a40091da2","other":"8862cd85d7039119b984f752a458ac0495ddea98c69fc1d1241db7873a712c11","up":true},{"one":"8862cd85d7039119b984f752a458ac0495ddea98c69fc1d1241db7873a712c11","other":"aceee75a260d45252060fe971eabd4bde25f912db4a3c6e47f4a09572fe01697","up":true},{"one":"aceee75a260d45252060fe971eabd4bde25f912db4a3c6e47f4a09572fe01697","other":"6c0142984d629ae6995894de9e7e5eb8d3fe45e1641d7ebd63959d2e61548ba3","up":true},{"one":"6c0142984d629ae6995894de9e7e5eb8d3fe45e1641d7ebd63959d2e61548ba3","other":"eff2450bea797ff66d93e7c1c1b0977cddf3abba64bfa51bcc509d728569e2fa","up":true},{"one":"eff2450bea797ff66d93e7c1c1b0977cddf3abba64bfa51bcc509d728569e2fa","other":"52a8747e4ea35f6f50c72d7c481616f68a5e4396248332b8ff69d3a772de49ac","up":true},{"one":"52a8747e4ea35f6f50c72d7c481616f68a5e4396248332b8ff69d3a772de49ac","other":"d95965e449dd4069876384cf4b34f986731e255a7948f0a862d229b1dddbc502","up":true},{"one":"d95965e449dd4069876384cf4b34f986731e255a7948f0a862d229b1dddbc502","other":"8006b080c78a0ab54fa1be75a939bee2334322fded6c3563de1596b17c36172c","up":true},{"one":"8006b080c78a0ab54fa1be75a939bee2334322fded6c3563de1596b17c36172c","other":"1dec77c2f4caf053c2d0524ae34a2d970bf4743a0d009d8fc543077ddfdfe3d0","up":true},{"one":"1dec77c2f4caf053c2d0524ae34a2d970bf4743a0d009d8fc543077ddfdfe3d0","other":"1addd4a9f01486212e13e43a9650b7f793617d1cb59fb8d941270d7ae55f575f","up":true},{"one":"1addd4a9f01486212e13e43a9650b7f793617d1cb59fb8d941270d7ae55f575f","other":"80d7e892bbb26808abb1d1530077fec6b08768c151a9f220881da3c862bae0af","up":true},{"one":"80d7e892bbb26808abb1d1530077fec6b08768c151a9f220881da3c862bae0af","other":"0111e720a84b310f863c2530fbe149e6a221acbad01065c5d052d2b3e1716f54","up":true},{"one":"0111e720a84b310f863c2530fbe149e6a221acbad01065c5d052d2b3e1716f54","other":"3c5b2e125020c80e3674df9cac34de4d8f3a94ee02556fb557921b6d5498b933","up":true},{"one":"3c5b2e125020c80e3674df9cac34de4d8f3a94ee02556fb557921b6d5498b933","other":"84a9db7645c792dc38c1f2113a8f0590d04e1c94d9a8c464ab0ec8219303d966","up":true},{"one":"84a9db7645c792dc38c1f2113a8f0590d04e1c94d9a8c464ab0ec8219303d966","other":"c74d801e85ac0fd8951480d107b41eddc5c92775614c4886b3f732fa3d1a791d","up":true},{"one":"c74d801e85ac0fd8951480d107b41eddc5c92775614c4886b3f732fa3d1a791d","other":"8cc3fb39009d0adc26fca1e2ee96822d168d4debc379fd516c15d4b4a1624231","up":true},{"one":"8cc3fb39009d0adc26fca1e2ee96822d168d4debc379fd516c15d4b4a1624231","other":"a3309f8b8bba4d8fbd7c6193d7671cb907b94e71155ef6138e0248682ff00e58","up":true},{"one":"a3309f8b8bba4d8fbd7c6193d7671cb907b94e71155ef6138e0248682ff00e58","other":"2a507f5cb921137a7225c9c4988a8514af0f7e3c442cb8bf2bb612dc522a7daf","up":true},{"one":"2a507f5cb921137a7225c9c4988a8514af0f7e3c442cb8bf2bb612dc522a7daf","other":"447a411c80fbd422bfa0c358d3f2a1fe6256c05e35acc6350958dfbe62cd5b9b","up":true},{"one":"447a411c80fbd422bfa0c358d3f2a1fe6256c05e35acc6350958dfbe62cd5b9b","other":"d20931ce3da972fd23ea306e5c604a1fbd9417ba02654c5cdbe278fe259f75d5","up":true},{"one":"d20931ce3da972fd23ea306e5c604a1fbd9417ba02654c5cdbe278fe259f75d5","other":"3a628ef171c1f26fa0966eb89210be0a14305aae8bfed10f4ed9017698f40f4b","up":true},{"one":"3a628ef171c1f26fa0966eb89210be0a14305aae8bfed10f4ed9017698f40f4b","other":"031450ec20f353435b429b5fa64f616d07c9d586afabc7a2772e05ad5c88bf50","up":true},{"one":"031450ec20f353435b429b5fa64f616d07c9d586afabc7a2772e05ad5c88bf50","other":"402cf9d0bffa017ebea34ede11207f3366b3ea450c0428029129a8e8026abbe7","up":true},{"one":"402cf9d0bffa017ebea34ede11207f3366b3ea450c0428029129a8e8026abbe7","other":"3b020c84fb60f59779324d451d9770d683e08133bbaa2d5762f61b8fd4b8d9fd","up":true},{"one":"3b020c84fb60f59779324d451d9770d683e08133bbaa2d5762f61b8fd4b8d9fd","other":"d3022a46956e75bca85ba89d97b694a3a64f03ccc2d881ed0cd687d43d486925","up":true},{"one":"d3022a46956e75bca85ba89d97b694a3a64f03ccc2d881ed0cd687d43d486925","other":"298ae5d173c5360bc9ad5b492ed35de3b6e0cae868a34bfe6311a8ba5ea9877e","up":true},{"one":"298ae5d173c5360bc9ad5b492ed35de3b6e0cae868a34bfe6311a8ba5ea9877e","other":"e64d90760cd81e4f112bbf1432e76c82fa4173fd474b988f4096ce187363fd81","up":true},{"one":"e64d90760cd81e4f112bbf1432e76c82fa4173fd474b988f4096ce187363fd81","other":"7e47a2f82984a600c8583605a91d5cb8f2d9a18961845e9c422edd78e20ac3a3","up":true},{"one":"7e47a2f82984a600c8583605a91d5cb8f2d9a18961845e9c422edd78e20ac3a3","other":"c6a8220726243cceaa6f2cebdac857a05efe721323f0a064c7f85a8340d3da96","up":true},{"one":"c6a8220726243cceaa6f2cebdac857a05efe721323f0a064c7f85a8340d3da96","other":"18e00a7e0f826a1aba3f8c0f533ed905f2eee607b697fff056ee7874d374adcd","up":true},{"one":"18e00a7e0f826a1aba3f8c0f533ed905f2eee607b697fff056ee7874d374adcd","other":"140dd212f2b193ee6a9d7fc14f7da321c7ef6fd367fb4f194924fd0ad5d135cc","up":true},{"one":"140dd212f2b193ee6a9d7fc14f7da321c7ef6fd367fb4f194924fd0ad5d135cc","other":"09b3fa30780931e18b92c75d1cdeafa365609c565e4e8c253d393835cb82d98e","up":true},{"one":"09b3fa30780931e18b92c75d1cdeafa365609c565e4e8c253d393835cb82d98e","other":"f8ff7440d6f4abb1c89496336843741ed53a544cedeeed71d8ebe0b08698438d","up":true},{"one":"f8ff7440d6f4abb1c89496336843741ed53a544cedeeed71d8ebe0b08698438d","other":"67f383e5334e9b6701d1dbb20876d4ba9a7e578af0476caed4a7e1b701f2bedb","up":true},{"one":"67f383e5334e9b6701d1dbb20876d4ba9a7e578af0476caed4a7e1b701f2bedb","other":"05949ec1a582fa70cab95c59e7c0d315583bf9fc320c60c35268931f21e90853","up":true},{"one":"05949ec1a582fa70cab95c59e7c0d315583bf9fc320c60c35268931f21e90853","other":"6d5ec591af4966ba024c6b2aeb45e0aab8aa1762f9cac30ce3934da529b738e9","up":true},{"one":"6d5ec591af4966ba024c6b2aeb45e0aab8aa1762f9cac30ce3934da529b738e9","other":"435d721a568eb906a03c69dbd71337251a550521a4004ab5d4a7deb6f317061a","up":true},{"one":"435d721a568eb906a03c69dbd71337251a550521a4004ab5d4a7deb6f317061a","other":"c8c8a93779ec4d9ac40925e8208478a00ee27fc220ddd73d8774cf6bfa255c46","up":true},{"one":"c8c8a93779ec4d9ac40925e8208478a00ee27fc220ddd73d8774cf6bfa255c46","other":"97daf2cbe03c80ce6c4dae39cd071dd93cb32ed245aa9aa77285e12296957ca3","up":true},{"one":"97daf2cbe03c80ce6c4dae39cd071dd93cb32ed245aa9aa77285e12296957ca3","other":"885427318634c458a3050f2f26eb52454a75cea4a1263b9ed55e6eb899743854","up":true},{"one":"885427318634c458a3050f2f26eb52454a75cea4a1263b9ed55e6eb899743854","other":"ed424d24d702520bf7cb5f6babbdc43a078435fb4a9884ed82a93d642839e127","up":true},{"one":"ed424d24d702520bf7cb5f6babbdc43a078435fb4a9884ed82a93d642839e127","other":"67585dfd87a005bae9bffc2cccb83c69537247c74886b4fa52287f46c796bcb6","up":true},{"one":"67585dfd87a005bae9bffc2cccb83c69537247c74886b4fa52287f46c796bcb6","other":"4cece9bc134bc2b09400c9f7f8a4df9270d2fe3c077c5e441fffc911fcf6f42e","up":true},{"one":"4cece9bc134bc2b09400c9f7f8a4df9270d2fe3c077c5e441fffc911fcf6f42e","other":"31e129ab3df7e082cc27c649d9ee29a3ea646d6a97d2417875b80e3ff576c047","up":true},{"one":"31e129ab3df7e082cc27c649d9ee29a3ea646d6a97d2417875b80e3ff576c047","other":"31e670638acba3d58f4c67f3ff2f3f25d769e8a5d7a7838927f4d9d169a84404","up":true},{"one":"31e670638acba3d58f4c67f3ff2f3f25d769e8a5d7a7838927f4d9d169a84404","other":"f9ded7b83e473e71be2fc0101d574c44521c96f77f9f84a384785a3af6b1093d","up":true},{"one":"f9ded7b83e473e71be2fc0101d574c44521c96f77f9f84a384785a3af6b1093d","other":"3cabd3a567fc4e6f8da66eb35d938fe1e9a7f2bdd2d36c4dc2d0e0e9149f5e56","up":true},{"one":"3cabd3a567fc4e6f8da66eb35d938fe1e9a7f2bdd2d36c4dc2d0e0e9149f5e56","other":"6b4ee1b73942ced78f97c0d0e221209933e63ae7353bb9ab3d37ac4127592e86","up":true},{"one":"6b4ee1b73942ced78f97c0d0e221209933e63ae7353bb9ab3d37ac4127592e86","other":"4d9147e3bf98cb59a7648f616c0d7f713a8cf3b7d25e3115233ff5883128beab","up":true},{"one":"4d9147e3bf98cb59a7648f616c0d7f713a8cf3b7d25e3115233ff5883128beab","other":"397a0a0e9fadcb571acd8981f5bfe8e059e707e0feae8a9c4c6bfe87bd39e66a","up":true},{"one":"397a0a0e9fadcb571acd8981f5bfe8e059e707e0feae8a9c4c6bfe87bd39e66a","other":"194ea3e14dc5d99f98d15607dc4c405769f5a371acc22d41a62d0537d716be32","up":true},{"one":"194ea3e14dc5d99f98d15607dc4c405769f5a371acc22d41a62d0537d716be32","other":"0cfc7309afabceeb7d248714e972cf3987205324f5ab8d048d17bea5dc87369d","up":true},{"one":"0cfc7309afabceeb7d248714e972cf3987205324f5ab8d048d17bea5dc87369d","other":"95c0a351fb7aa6683280d159a7b808bfa63f63bff91a1c5936e973b2e5d3954f","up":true},{"one":"95c0a351fb7aa6683280d159a7b808bfa63f63bff91a1c5936e973b2e5d3954f","other":"eebd48b367cbfe94a37c0deb274a697e628074f9560b909e66229c5c76ce68eb","up":true},{"one":"eebd48b367cbfe94a37c0deb274a697e628074f9560b909e66229c5c76ce68eb","other":"019109311d4888497aa194cce4a89b5ef243421cf0e7e7bb9115d086e1a1f7d7","up":true},{"one":"019109311d4888497aa194cce4a89b5ef243421cf0e7e7bb9115d086e1a1f7d7","other":"447cdbf1ff462aa67d6a46085b1a84fdc495a4142ab174c8e69b271b09732b4d","up":true},{"one":"447cdbf1ff462aa67d6a46085b1a84fdc495a4142ab174c8e69b271b09732b4d","other":"be68267d77fb52424227267c665ca1193a010334cac057338aca77b49a4b94da","up":true},{"one":"be68267d77fb52424227267c665ca1193a010334cac057338aca77b49a4b94da","other":"6e7f1f3d65364399617a4d95fdd04f2ca9b007b2366943e7ba5acd4616a7a425","up":true},{"one":"6e7f1f3d65364399617a4d95fdd04f2ca9b007b2366943e7ba5acd4616a7a425","other":"bfc711793830779f49aa59bc6f7a205ab4e6eae7abfdafbf3bb5a1163a778ab2","up":true},{"one":"bfc711793830779f49aa59bc6f7a205ab4e6eae7abfdafbf3bb5a1163a778ab2","other":"3f31ecaffaa6311c82c9a575bbc38d6bcb16630ac87e19d1853a64aa96c9dcde","up":true},{"one":"3f31ecaffaa6311c82c9a575bbc38d6bcb16630ac87e19d1853a64aa96c9dcde","other":"834f14e9f325482adef62651ddf3685690dd5ebdd18014f2bd266b2143c290ff","up":true},{"one":"834f14e9f325482adef62651ddf3685690dd5ebdd18014f2bd266b2143c290ff","other":"096a8302b6f369c28ed9d47719a507ead8a3cc1ca4fa1e32318b7f97873955fe","up":true},{"one":"096a8302b6f369c28ed9d47719a507ead8a3cc1ca4fa1e32318b7f97873955fe","other":"a5053958f0cefcff1826bf02525fda98c4dc954cc38690f3c43ecbf0b2ad57af","up":true},{"one":"a5053958f0cefcff1826bf02525fda98c4dc954cc38690f3c43ecbf0b2ad57af","other":"305162c472c71ddef2320b138102b67d1ce2b8bba79e2e587fc80e085c88e547","up":true},{"one":"305162c472c71ddef2320b138102b67d1ce2b8bba79e2e587fc80e085c88e547","other":"dbd4d90e3342ef837b8ecf5c6e490f7c409f419cf36b77162a87cb2cfb8ae33c","up":true},{"one":"dbd4d90e3342ef837b8ecf5c6e490f7c409f419cf36b77162a87cb2cfb8ae33c","other":"cd6c8b42a0b092f41e6925577c9de7d1bea17231bcb3d08f3d3cce9c6fdcf22d","up":true},{"one":"cd6c8b42a0b092f41e6925577c9de7d1bea17231bcb3d08f3d3cce9c6fdcf22d","other":"07f5d094a4b22e73cdd6c85452b3d928da9b4b16873824759cb7e8a622417fd5","up":true},{"one":"07f5d094a4b22e73cdd6c85452b3d928da9b4b16873824759cb7e8a622417fd5","other":"c96146ee47ec7cd74551cf74f00213bc337d643c4327393f0e6848ecd4a0f8d3","up":true},{"one":"c96146ee47ec7cd74551cf74f00213bc337d643c4327393f0e6848ecd4a0f8d3","other":"dad08999cd2edc33cfdc59ea34c8adcd6a34eaa15f2e85b0622e9848b215c1d5","up":true},{"one":"dad08999cd2edc33cfdc59ea34c8adcd6a34eaa15f2e85b0622e9848b215c1d5","other":"056152dd9dae85c426378d34acab8d6641da665d2f57359a27a0ff652f3f3d02","up":true},{"one":"056152dd9dae85c426378d34acab8d6641da665d2f57359a27a0ff652f3f3d02","other":"a5ac04d53b569e418ef5007961431155f2c226ee10157b30af71ea4836b08089","up":true},{"one":"a5ac04d53b569e418ef5007961431155f2c226ee10157b30af71ea4836b08089","other":"4d381014783980b2f77f0d71160ad9e9d84672b576f4435ccdbae12752350c1c","up":true},{"one":"4d381014783980b2f77f0d71160ad9e9d84672b576f4435ccdbae12752350c1c","other":"93ea8ef251fd56b159e080cdf733d33e1fdfb3c7ae5bd9a6a328d0bf5458867b","up":true},{"one":"93ea8ef251fd56b159e080cdf733d33e1fdfb3c7ae5bd9a6a328d0bf5458867b","other":"9f0e2bf8a962156c9e0a83c3d42ad3dc5ac5c3e508f24200bfb151aad4e395ff","up":true},{"one":"9f0e2bf8a962156c9e0a83c3d42ad3dc5ac5c3e508f24200bfb151aad4e395ff","other":"5a8b84df651871fce72d11cb1c26c87ae4a0cc6b4c274d37e70532c94f27288e","up":true},{"one":"5a8b84df651871fce72d11cb1c26c87ae4a0cc6b4c274d37e70532c94f27288e","other":"793322608055d4873776a9a0a6c40b04379bfd2f289a8ad49a7dc456bc65f871","up":true},{"one":"793322608055d4873776a9a0a6c40b04379bfd2f289a8ad49a7dc456bc65f871","other":"1bd588263274543729d54529ae9e9bf4596db40649a1c2a3f73168d818f34b62","up":true},{"one":"1bd588263274543729d54529ae9e9bf4596db40649a1c2a3f73168d818f34b62","other":"318828fa893a28cc0652d3f81d97c5b8e023e853685f5d3e65fde20689abcc5a","up":true},{"one":"318828fa893a28cc0652d3f81d97c5b8e023e853685f5d3e65fde20689abcc5a","other":"7c464054ea7b6c9ea0c7d4c209769c92f294a9db2ca159b8ef168e310a1eac3a","up":true},{"one":"7c464054ea7b6c9ea0c7d4c209769c92f294a9db2ca159b8ef168e310a1eac3a","other":"a606c79a018a6535375d851fcc82c42cc7c952720aa120434cedccf4a4be1f59","up":true},{"one":"a606c79a018a6535375d851fcc82c42cc7c952720aa120434cedccf4a4be1f59","other":"a2a163ce2cb092b411c994cc5d5ef555d539d2dcf4e7e1aeb528d2216dc481e5","up":true},{"one":"a2a163ce2cb092b411c994cc5d5ef555d539d2dcf4e7e1aeb528d2216dc481e5","other":"b78fd21c063006e2e033d1d00fc21e1ad7ad7951bb5621cec9b56639745d65f9","up":true},{"one":"b78fd21c063006e2e033d1d00fc21e1ad7ad7951bb5621cec9b56639745d65f9","other":"5d82a418629cfbe7c57105309319ad695a198626fe3571de213a12ddf62f7308","up":true},{"one":"5d82a418629cfbe7c57105309319ad695a198626fe3571de213a12ddf62f7308","other":"7850f5ee5048959559b3af0f95689669b250fc3aa58bcc9544dca61ca9c9769c","up":true},{"one":"7850f5ee5048959559b3af0f95689669b250fc3aa58bcc9544dca61ca9c9769c","other":"ab3ff955033c0a2615932faf85fd20090b9121c7edcc8e6f7ce4c4fde0a96b8a","up":true},{"one":"ab3ff955033c0a2615932faf85fd20090b9121c7edcc8e6f7ce4c4fde0a96b8a","other":"d9cf19895e015cb534d915aed83c0d26bf40a11244027812e17c3bec6e645a8e","up":true},{"one":"d9cf19895e015cb534d915aed83c0d26bf40a11244027812e17c3bec6e645a8e","other":"837f0993f6374039a5ad4472d6313e647a4c5db4583bd27ccfa98d3448a17731","up":true},{"one":"837f0993f6374039a5ad4472d6313e647a4c5db4583bd27ccfa98d3448a17731","other":"ddb8be472c3d48dc4d3d112448e6c0c4a826a18af3f3b53fdfef8cd31053c75f","up":true},{"one":"ddb8be472c3d48dc4d3d112448e6c0c4a826a18af3f3b53fdfef8cd31053c75f","other":"9959385385aade728d3f5763806596222bc1e7b9946c2c92407943d080b32f8d","up":true},{"one":"9959385385aade728d3f5763806596222bc1e7b9946c2c92407943d080b32f8d","other":"0e2b48558ce2af1fbfee38a557d56072e3091cfcaee8d7847c7c9dcf7bef9bfa","up":true},{"one":"0e2b48558ce2af1fbfee38a557d56072e3091cfcaee8d7847c7c9dcf7bef9bfa","other":"a8ff8d69dcb36462d1116dafa5e3d0c7237bf65dbece482a316862c8d66e35b6","up":true},{"one":"a8ff8d69dcb36462d1116dafa5e3d0c7237bf65dbece482a316862c8d66e35b6","other":"48de553e15afd3e8a46bfc3a5ba8a298158aa3d60f140d2730230af5cce8084d","up":true},{"one":"48de553e15afd3e8a46bfc3a5ba8a298158aa3d60f140d2730230af5cce8084d","other":"398038811c1c7402fe2e6994c9ce2f15c8166b8e99f379feaaed66ac87702062","up":true},{"one":"398038811c1c7402fe2e6994c9ce2f15c8166b8e99f379feaaed66ac87702062","other":"8e282b0f27d4fa56fe14cfeb69fac5a53e3d882c7778eb190653e2eab7c93fd2","up":true},{"one":"8e282b0f27d4fa56fe14cfeb69fac5a53e3d882c7778eb190653e2eab7c93fd2","other":"994839e5f3a5b8b23aed84fb029413124af17804b79b0263ec6bfd5aec5dad78","up":true},{"one":"994839e5f3a5b8b23aed84fb029413124af17804b79b0263ec6bfd5aec5dad78","other":"d408bb6f7af1590e1f162ce02cc016b1b86ede29851caa32434212ffa2a377c8","up":true},{"one":"d408bb6f7af1590e1f162ce02cc016b1b86ede29851caa32434212ffa2a377c8","other":"fc514c43c4eb5c62798458da5d622e9248a6e530e4288cd902019aa05c4374d8","up":true},{"one":"fc514c43c4eb5c62798458da5d622e9248a6e530e4288cd902019aa05c4374d8","other":"60c5647aed152609979366fb33dc8b28fc60736098ff68d232415889b43dfa58","up":true},{"one":"60c5647aed152609979366fb33dc8b28fc60736098ff68d232415889b43dfa58","other":"16868ec5d8f490ac73ea28b4e8fdda55ac149bb1aafb177545b54b84a5ad5367","up":true},{"one":"16868ec5d8f490ac73ea28b4e8fdda55ac149bb1aafb177545b54b84a5ad5367","other":"9b8e6bb3a7fe4dc65ac97404e546d8b777d068c94bc2355f4f1a510ad6c11905","up":true},{"one":"9b8e6bb3a7fe4dc65ac97404e546d8b777d068c94bc2355f4f1a510ad6c11905","other":"c9c302de4afe7b4dcbb6f3e366ce747083f9dcd7d5c6a01b939da5cdc6ccc874","up":true},{"one":"c9c302de4afe7b4dcbb6f3e366ce747083f9dcd7d5c6a01b939da5cdc6ccc874","other":"5ff09c6859736aad7a82a3bfb3f1a1a8b3c0d58f831863540d9c3013dd35745e","up":true},{"one":"5ff09c6859736aad7a82a3bfb3f1a1a8b3c0d58f831863540d9c3013dd35745e","other":"482ec3dc05460579ea9bce87677bd3d9a1930e801fabeba607b8ab6b8729ff15","up":true},{"one":"482ec3dc05460579ea9bce87677bd3d9a1930e801fabeba607b8ab6b8729ff15","other":"1049d321a450726cf39d1d7cea1c108be3bec137a644b62cdc73a853f5a5a22b","up":true},{"one":"1049d321a450726cf39d1d7cea1c108be3bec137a644b62cdc73a853f5a5a22b","other":"a2e6c900511768c8c9947ab0fa2e73975cf2a4cec7fd15217abdba25c329317e","up":true},{"one":"a2e6c900511768c8c9947ab0fa2e73975cf2a4cec7fd15217abdba25c329317e","other":"a4ee49bb2caabb6b9448bcdff1fc3cc673a2db04eab9f5c62d1787f2c25990a0","up":true},{"one":"a4ee49bb2caabb6b9448bcdff1fc3cc673a2db04eab9f5c62d1787f2c25990a0","other":"f645aab9cb2bd2709998b38e5789c9c5f68d40765e6cbd93b92e6383eb671dba","up":true},{"one":"f645aab9cb2bd2709998b38e5789c9c5f68d40765e6cbd93b92e6383eb671dba","other":"5ac0d00b8d647dec62d26e1a689fd05b8b7a1a79ab8c43493bd6d7d209816df1","up":true},{"one":"5ac0d00b8d647dec62d26e1a689fd05b8b7a1a79ab8c43493bd6d7d209816df1","other":"7d162a11662585f8c38d88fb241623e67bacf90703065dae6c092b4b507d6543","up":true},{"one":"7d162a11662585f8c38d88fb241623e67bacf90703065dae6c092b4b507d6543","other":"af02c2f471e96ab8defbd229215695b95e64f7c78b145b6793a238961f556fbf","up":true},{"one":"af02c2f471e96ab8defbd229215695b95e64f7c78b145b6793a238961f556fbf","other":"56ca9dd846a58a0ffa7b49a88aad559a338ba535a6f738468b8f146c97890cb2","up":true},{"one":"56ca9dd846a58a0ffa7b49a88aad559a338ba535a6f738468b8f146c97890cb2","other":"26acc3c373c29150af30bbc9264d0c44c7c606ff7377399ddf844635e97afcfa","up":true},{"one":"26acc3c373c29150af30bbc9264d0c44c7c606ff7377399ddf844635e97afcfa","other":"fa240411bc4f3e44dfca3faedd112c7743a67b522a910bc99696ef0b31732ee2","up":true},{"one":"fa240411bc4f3e44dfca3faedd112c7743a67b522a910bc99696ef0b31732ee2","other":"f2b49a2247c9c5e8f6f755834a37fe5c17f208f994878e14b7001e404f52e125","up":true},{"one":"f2b49a2247c9c5e8f6f755834a37fe5c17f208f994878e14b7001e404f52e125","other":"b5eab4869b4cb65bdc1e5cab45c03016d202f9f5b668be50066451cfcf9ef299","up":true},{"one":"b5eab4869b4cb65bdc1e5cab45c03016d202f9f5b668be50066451cfcf9ef299","other":"79e5c6c6d78c88c579003cda044882ecb04520fbad1f5feadbe7b6d23fe183c8","up":true},{"one":"79e5c6c6d78c88c579003cda044882ecb04520fbad1f5feadbe7b6d23fe183c8","other":"8f9aa2cd33d18e7cb4494d11a7532c97eb4a1cae172b2165c26ae4ed24887c0d","up":true},{"one":"8f9aa2cd33d18e7cb4494d11a7532c97eb4a1cae172b2165c26ae4ed24887c0d","other":"2ddffddbf452f0c9268058a739f5757fb90281cbfd31bd6f760acc3392fec12a","up":true},{"one":"2ddffddbf452f0c9268058a739f5757fb90281cbfd31bd6f760acc3392fec12a","other":"bbafac5ba5915db3c80e28b249cad260b9b5dad1f728063c48fa8f61d7556e17","up":true},{"one":"bbafac5ba5915db3c80e28b249cad260b9b5dad1f728063c48fa8f61d7556e17","other":"a32749dc4e134a4fbb038618c58a7c05bbbaa06f1436de3754341af86402581b","up":true},{"one":"a32749dc4e134a4fbb038618c58a7c05bbbaa06f1436de3754341af86402581b","other":"b8e1a8622c256ef29acd52df7b3ace50820fb1a147716165ff862fdc973a48cd","up":true},{"one":"b8e1a8622c256ef29acd52df7b3ace50820fb1a147716165ff862fdc973a48cd","other":"2c8042517dfeaa01586e91e491dd4154fb24c0d84fedb0404b9d5136f60da1d9","up":true},{"one":"2c8042517dfeaa01586e91e491dd4154fb24c0d84fedb0404b9d5136f60da1d9","other":"a742e8502c619703ce87890110f908bde32b59dc61d77a247759e5d0056e0c94","up":true},{"one":"a742e8502c619703ce87890110f908bde32b59dc61d77a247759e5d0056e0c94","other":"feb3bc17ee7369a4fa9889d9250fed3c1257c70916871996e6eabd374dd8dc2e","up":true},{"one":"feb3bc17ee7369a4fa9889d9250fed3c1257c70916871996e6eabd374dd8dc2e","other":"6dd3ac0fd9a04a2ce75875c683d135e52eaa1670cb55e78711620712e60fde47","up":true},{"one":"6dd3ac0fd9a04a2ce75875c683d135e52eaa1670cb55e78711620712e60fde47","other":"2e65d05648b798fafbc9bb582c05e6f8f891131260e8c90ca725ddcbc823f315","up":true},{"one":"2e65d05648b798fafbc9bb582c05e6f8f891131260e8c90ca725ddcbc823f315","other":"43d43e9ebcbceb4830fc1d2d5024650b90698306bbd2c4d0b4841a1a8fd09c93","up":true},{"one":"43d43e9ebcbceb4830fc1d2d5024650b90698306bbd2c4d0b4841a1a8fd09c93","other":"68cbc4a5313080d5dca8ad34e8bf52a6144e0ff8ef3f795d7ae9d5f644fe2042","up":true},{"one":"68cbc4a5313080d5dca8ad34e8bf52a6144e0ff8ef3f795d7ae9d5f644fe2042","other":"6d3c6db15900f2596286f81cc0664d2c8291ead5bad2aa35bad515af088a2e48","up":true},{"one":"6d3c6db15900f2596286f81cc0664d2c8291ead5bad2aa35bad515af088a2e48","other":"0e80db9dfa8ce29bedfb2de031622bef8829bee52771322b6a7efb47afe540e7","up":true},{"one":"0e80db9dfa8ce29bedfb2de031622bef8829bee52771322b6a7efb47afe540e7","other":"24f80c437be45898e594f821bba0f5c62e0c9a0c720118e362ee6f78410612bd","up":true},{"one":"24f80c437be45898e594f821bba0f5c62e0c9a0c720118e362ee6f78410612bd","other":"ec90a22f41ee659d5759a497946ac2991c916f00fe7caeeeb0908f3af1fe60b6","up":true},{"one":"ec90a22f41ee659d5759a497946ac2991c916f00fe7caeeeb0908f3af1fe60b6","other":"955da15edae50a4c68bc8c579b9799d55f41b7c2a6178f645f79d772e0116662","up":true},{"one":"955da15edae50a4c68bc8c579b9799d55f41b7c2a6178f645f79d772e0116662","other":"a8f49e87156fda5510897601689ce968d77032134c523634916b96de16366f9e","up":true},{"one":"a8f49e87156fda5510897601689ce968d77032134c523634916b96de16366f9e","other":"c190f9d08c78ed6dffadaef36e77fe6aa96099e4453753b0cfc8ec542fa96b9d","up":true},{"one":"c190f9d08c78ed6dffadaef36e77fe6aa96099e4453753b0cfc8ec542fa96b9d","other":"80735a728720bba0ac08daaccd093370d672a8f9a50845ad78ccd6cf8686c39f","up":true},{"one":"80735a728720bba0ac08daaccd093370d672a8f9a50845ad78ccd6cf8686c39f","other":"b4a1b687fbdb754fd689e26f0870a7dcab5d76190c06f3ea2ea1e198f8aa5ab2","up":true},{"one":"b4a1b687fbdb754fd689e26f0870a7dcab5d76190c06f3ea2ea1e198f8aa5ab2","other":"b6dffac4b4eb2974ed0ed241799f97d2e5d9be671e311266826d0dcfecfcc209","up":true},{"one":"b6dffac4b4eb2974ed0ed241799f97d2e5d9be671e311266826d0dcfecfcc209","other":"d700d96de1193456dc0bcf492c7c11b0951062974af2f7f47b8c901b17c23165","up":true},{"one":"d700d96de1193456dc0bcf492c7c11b0951062974af2f7f47b8c901b17c23165","other":"43c9e1571c460cb9f599fa8ed79ddd0f9c3a21fd2fa455e0603109c55012f76b","up":true},{"one":"43c9e1571c460cb9f599fa8ed79ddd0f9c3a21fd2fa455e0603109c55012f76b","other":"9ca1fd5d41975acb905f337997922849b4070360e47849bb4fd8cd1b9ddb4d73","up":true},{"one":"9ca1fd5d41975acb905f337997922849b4070360e47849bb4fd8cd1b9ddb4d73","other":"8d192b11538072db750f71204e2e6adf9dc0508d9c5cf1eb457e4e996cd985bc","up":true},{"one":"8d192b11538072db750f71204e2e6adf9dc0508d9c5cf1eb457e4e996cd985bc","other":"2fd2f77d76cca480ac18e9af7a462f297db168c3370b3bc0e2c04aa006c4d037","up":true},{"one":"2fd2f77d76cca480ac18e9af7a462f297db168c3370b3bc0e2c04aa006c4d037","other":"f6c028d6a2b6408e90169151f4519b561ed183bd8925ed9a1702806f397666e7","up":true},{"one":"f6c028d6a2b6408e90169151f4519b561ed183bd8925ed9a1702806f397666e7","other":"a7a856a43293aa3004848a86f187e09343bd605e1a93e853a6f6b6b1031bd667","up":true},{"one":"a7a856a43293aa3004848a86f187e09343bd605e1a93e853a6f6b6b1031bd667","other":"fc3911383f74a982f6af8ab95a63426b56117d45f153b3c1441459d9191daaff","up":true},{"one":"fc3911383f74a982f6af8ab95a63426b56117d45f153b3c1441459d9191daaff","other":"a1c85ee75edb807a01f4ce930086c948918aade324752609b078c28991c04e86","up":true},{"one":"a1c85ee75edb807a01f4ce930086c948918aade324752609b078c28991c04e86","other":"244c3c954ac612e51d4945ab9b77f0b4a3983285e8add7921777e0c45a1bf338","up":true},{"one":"244c3c954ac612e51d4945ab9b77f0b4a3983285e8add7921777e0c45a1bf338","other":"5814be13c8550b9a5a83d08e7af6022002a8fdaa38ba6c2c30be58099a9f7744","up":true},{"one":"5814be13c8550b9a5a83d08e7af6022002a8fdaa38ba6c2c30be58099a9f7744","other":"bea10868d5da506c1801de845c148c2f09761893113ac913fe66674a8f43c178","up":true},{"one":"bea10868d5da506c1801de845c148c2f09761893113ac913fe66674a8f43c178","other":"1b1dc3f9312df141855c545dd16aee325f9a609230ec6165bdbbb07d0c0862f6","up":true},{"one":"1b1dc3f9312df141855c545dd16aee325f9a609230ec6165bdbbb07d0c0862f6","other":"9f7d72b7d9843872904b841e421985082428fba5010db27dd871ed76630a1e1d","up":true},{"one":"9f7d72b7d9843872904b841e421985082428fba5010db27dd871ed76630a1e1d","other":"e0a0ba7e7e89a7af805e24abde1a5a5b489ba197585051a8755e8c2345c3d57b","up":true},{"one":"e0a0ba7e7e89a7af805e24abde1a5a5b489ba197585051a8755e8c2345c3d57b","other":"1070df5e904e3865085b0319a81761e59146494c689e7567efe7465fc819ae8b","up":true},{"one":"1070df5e904e3865085b0319a81761e59146494c689e7567efe7465fc819ae8b","other":"34118166845c185d15c286b7e5433539ee98ed634baabd534d57369fd5f7c681","up":true},{"one":"34118166845c185d15c286b7e5433539ee98ed634baabd534d57369fd5f7c681","other":"56635699bd3bc78193adbdb8e8b7c2c91dab4140fdaa506fea2300ee86c4ba81","up":true},{"one":"56635699bd3bc78193adbdb8e8b7c2c91dab4140fdaa506fea2300ee86c4ba81","other":"19ea0a685fc4edd298b736dc7a778c9ec4362de378876911105fa9ba2ce90204","up":true},{"one":"19ea0a685fc4edd298b736dc7a778c9ec4362de378876911105fa9ba2ce90204","other":"32ff1969d90aaa5a8ed2260968a8e2bac2d1cae597c906f90495f1dc5de7f8d3","up":true},{"one":"32ff1969d90aaa5a8ed2260968a8e2bac2d1cae597c906f90495f1dc5de7f8d3","other":"7895b2cb97b473f8893cc70a4421e0f8be1c033b27cd730fa13438b7a8f3fcb5","up":true},{"one":"7895b2cb97b473f8893cc70a4421e0f8be1c033b27cd730fa13438b7a8f3fcb5","other":"046ca54165f0dd4d62fd7d8ee9e97c655db3d35f5452a0ccb0dffc79c047978c","up":true},{"one":"046ca54165f0dd4d62fd7d8ee9e97c655db3d35f5452a0ccb0dffc79c047978c","other":"094256812084c6052a2604149aa3aba2379c483bf4ec25162f6b43934942775a","up":true},{"one":"094256812084c6052a2604149aa3aba2379c483bf4ec25162f6b43934942775a","other":"b659418885032905ea20ad47d70470e403e7e407e0e9ebf9277f9a2d81ec121c","up":true},{"one":"b659418885032905ea20ad47d70470e403e7e407e0e9ebf9277f9a2d81ec121c","other":"f305273a7d08e72f69b0b153855e822f252cbbf34a18f305134eed9d1eb7b58a","up":true},{"one":"f305273a7d08e72f69b0b153855e822f252cbbf34a18f305134eed9d1eb7b58a","other":"f7561cb6740e17ec7c7d17068251b2c951d954c77804aa5af60464e9c3964e57","up":true},{"one":"f7561cb6740e17ec7c7d17068251b2c951d954c77804aa5af60464e9c3964e57","other":"9c21cb3e56f8ac66a7917a9ba14e58f77e998ac70c178b88b5053d9ac2777e60","up":true},{"one":"9c21cb3e56f8ac66a7917a9ba14e58f77e998ac70c178b88b5053d9ac2777e60","other":"f1ed9d45622ff974a1e396cd878b2deb89e31aa5d08da773423f292ae8dbcbb6","up":true},{"one":"f1ed9d45622ff974a1e396cd878b2deb89e31aa5d08da773423f292ae8dbcbb6","other":"3938e6b2c095084dc9975a3e8649133557495d34ac6df874c6d929266e3ffe6f","up":true},{"one":"3938e6b2c095084dc9975a3e8649133557495d34ac6df874c6d929266e3ffe6f","other":"bcf85ecf421b871fca0247a7081188a8e2c08778b88ffad16db37ef024fec0fc","up":true},{"one":"bcf85ecf421b871fca0247a7081188a8e2c08778b88ffad16db37ef024fec0fc","other":"ef99b6cdc05345a1ee82267890e3ccaeef1f2bd2fe7ae8b02b6b20b9a5ef85bb","up":true},{"one":"ef99b6cdc05345a1ee82267890e3ccaeef1f2bd2fe7ae8b02b6b20b9a5ef85bb","other":"c272b12f4020ae5b20e3d29cd09de03fa0088e3eeb5f07aa7728b29a3e90e687","up":true},{"one":"c272b12f4020ae5b20e3d29cd09de03fa0088e3eeb5f07aa7728b29a3e90e687","other":"c42e6492879439eeecd9938d17ff283fd8f5f24206906ca512b4daa4803b78b4","up":true},{"one":"c42e6492879439eeecd9938d17ff283fd8f5f24206906ca512b4daa4803b78b4","other":"f215bc09268e60ebbec76f743bebd09d7e72d4cbeedc0b9d3417bb4a2ef42935","up":true},{"one":"f215bc09268e60ebbec76f743bebd09d7e72d4cbeedc0b9d3417bb4a2ef42935","other":"50c1a8023bfecffb09472fdc50898f4d050a31443d40a6c07b629090beb0df3d","up":true},{"one":"50c1a8023bfecffb09472fdc50898f4d050a31443d40a6c07b629090beb0df3d","other":"cf52b3fc82ec24c3e9b40488d7c5f7ac8af731d159a103619bee932ec74d5e92","up":true},{"one":"cf52b3fc82ec24c3e9b40488d7c5f7ac8af731d159a103619bee932ec74d5e92","other":"e09f98114da64e7547b351637190f6621a1f75568cfa9960980fc77618f8855b","up":true},{"one":"e09f98114da64e7547b351637190f6621a1f75568cfa9960980fc77618f8855b","other":"e2d36f335d90ad63148db8e353a78a30d8d9c0abe107be2cf8685f6a01ce74b9","up":true},{"one":"e2d36f335d90ad63148db8e353a78a30d8d9c0abe107be2cf8685f6a01ce74b9","other":"9ec831d97418916fd9695465e041caf27824dbb51d6ff74d6b70f3bd561e70e6","up":true},{"one":"9ec831d97418916fd9695465e041caf27824dbb51d6ff74d6b70f3bd561e70e6","other":"553824ef701d3cd0191ae3a67de564ed0cf553e74bd60ed9de321f9302732ba6","up":true},{"one":"553824ef701d3cd0191ae3a67de564ed0cf553e74bd60ed9de321f9302732ba6","other":"0d1c35c6ea485cb33857b790ee262f974cf0d54cf8ce3003f8308ac2e87c2c25","up":true},{"one":"0d1c35c6ea485cb33857b790ee262f974cf0d54cf8ce3003f8308ac2e87c2c25","other":"59876e7ff9e92243856dad23126e1d38d9a5ddae79772ed1b2bdb91f33a4a4b5","up":true},{"one":"59876e7ff9e92243856dad23126e1d38d9a5ddae79772ed1b2bdb91f33a4a4b5","other":"c53417f008e4550e1c4cb9a3e2955b3af6403e059b7b4b4c33869d9ed4a580a5","up":true},{"one":"c53417f008e4550e1c4cb9a3e2955b3af6403e059b7b4b4c33869d9ed4a580a5","other":"cdb13873ac058861f295ebca5d958bf2bb793e3f9e274cf5a73a633425a9276f","up":true},{"one":"cdb13873ac058861f295ebca5d958bf2bb793e3f9e274cf5a73a633425a9276f","other":"70f68562733da4e3b1c3949fb6e11ac0bdd49ea7e732925f937f87df5af698d6","up":true},{"one":"70f68562733da4e3b1c3949fb6e11ac0bdd49ea7e732925f937f87df5af698d6","other":"e471efbcf1def3915b3dda2dc65a86945c607be54a33e31e9625549becac0e34","up":true},{"one":"e471efbcf1def3915b3dda2dc65a86945c607be54a33e31e9625549becac0e34","other":"8ea2c8acc111f38d5b4a5ed60252ee83f312d0f8359265d5b9266d54735052fe","up":true},{"one":"8ea2c8acc111f38d5b4a5ed60252ee83f312d0f8359265d5b9266d54735052fe","other":"8358a74fc8d8e39ccc40b4d3a212b7a69a6a8f6afc25cff2c9c7b44bbaf9ec82","up":true},{"one":"8358a74fc8d8e39ccc40b4d3a212b7a69a6a8f6afc25cff2c9c7b44bbaf9ec82","other":"a8b58013ff911871d1aa6c2bbea6c2e6ef9b00b87b80a41dc04724ad0488e2ff","up":true},{"one":"a8b58013ff911871d1aa6c2bbea6c2e6ef9b00b87b80a41dc04724ad0488e2ff","other":"7c7ca5a7522a04f62f2bebd6197a03d78f255d0175c3dfceb5d92b684365b2aa","up":true},{"one":"7c7ca5a7522a04f62f2bebd6197a03d78f255d0175c3dfceb5d92b684365b2aa","other":"c8ea4177420785926e0929701f5e74c744920386f2a43b89d83c8281106cb95e","up":true},{"one":"c8ea4177420785926e0929701f5e74c744920386f2a43b89d83c8281106cb95e","other":"87a337622455ae65daf3ab2555cee8985e9aa14bac245545d985296060e4a8de","up":true},{"one":"87a337622455ae65daf3ab2555cee8985e9aa14bac245545d985296060e4a8de","other":"30feca631f06041cb14cead384dfaa5fffa6dc34b0cee54230efbe15e56a5884","up":true},{"one":"30feca631f06041cb14cead384dfaa5fffa6dc34b0cee54230efbe15e56a5884","other":"ba911175d3aa3fcc266e2a5aa32fb706208b8a9b5021a5f37c0b85f547eb375d","up":true},{"one":"ba911175d3aa3fcc266e2a5aa32fb706208b8a9b5021a5f37c0b85f547eb375d","other":"86d6f68ec0b8e1b3406943787f918bee74dd1827998bdb13ece8f690da2d296a","up":true},{"one":"86d6f68ec0b8e1b3406943787f918bee74dd1827998bdb13ece8f690da2d296a","other":"67909bdcaef2330ef120e524c76e1e382b474f3332d86f65282028e051f34c75","up":true},{"one":"67909bdcaef2330ef120e524c76e1e382b474f3332d86f65282028e051f34c75","other":"8b4318f86ad47976321af97bfbf95cd0a3b0aa22447aeb0611ed1a9bf1e6a4bf","up":true},{"one":"8b4318f86ad47976321af97bfbf95cd0a3b0aa22447aeb0611ed1a9bf1e6a4bf","other":"7049e92a396311fbf2f4a55bb5bd2fe3f7bb3c1a63f41bb88eb800edd45ac6e5","up":true},{"one":"7049e92a396311fbf2f4a55bb5bd2fe3f7bb3c1a63f41bb88eb800edd45ac6e5","other":"1dc0ef1ce68dc681298177bde808af514efa52a5ad38c9cd2bd61968cdf19cfb","up":true},{"one":"1dc0ef1ce68dc681298177bde808af514efa52a5ad38c9cd2bd61968cdf19cfb","other":"bdc5de01276157a0f3fc43a9cc3b41b2cacc8479118b75aec4ba9b2b7fa86d5e","up":true},{"one":"bdc5de01276157a0f3fc43a9cc3b41b2cacc8479118b75aec4ba9b2b7fa86d5e","other":"cc3397e9e11f75273d3f81d91f980f4504755f80b27a183212de56cc5085e58d","up":true},{"one":"cc3397e9e11f75273d3f81d91f980f4504755f80b27a183212de56cc5085e58d","other":"5bd8faf93bcad07006e9426b45f5cc599f1963ab791deac4ff63d6739cd62a17","up":true},{"one":"5bd8faf93bcad07006e9426b45f5cc599f1963ab791deac4ff63d6739cd62a17","other":"c2d00c7d960174c0934129fdcec63525bfa728f78fb70b7c52036b772d6297ad","up":true},{"one":"c2d00c7d960174c0934129fdcec63525bfa728f78fb70b7c52036b772d6297ad","other":"138dbc1662c4ce9b2b30ef5035914cc70465666fe18f313318e662d13f099621","up":true},{"one":"138dbc1662c4ce9b2b30ef5035914cc70465666fe18f313318e662d13f099621","other":"d3e913cf4a7dabfb5699131b65e533a40adb46ea37e0ed4ce9433f99015986ef","up":true},{"one":"d3e913cf4a7dabfb5699131b65e533a40adb46ea37e0ed4ce9433f99015986ef","other":"5c7c15798e86fe794bb201614d46366ea96dc51091f5b19f149995e0d40df0a6","up":true},{"one":"5c7c15798e86fe794bb201614d46366ea96dc51091f5b19f149995e0d40df0a6","other":"5c373034770e413e700b1cd03b2035f769ecd9ab8eb54d32f7b2645be1991fe5","up":true},{"one":"5c373034770e413e700b1cd03b2035f769ecd9ab8eb54d32f7b2645be1991fe5","other":"93c0e1adf23fdf1623359eb88c517bc521d5a26325554df890cc04c1fa17a5df","up":true},{"one":"93c0e1adf23fdf1623359eb88c517bc521d5a26325554df890cc04c1fa17a5df","other":"035f15499cdb0f079b3e358ad54a6122681442a5293c3ae2fdf6c527004b36d2","up":true},{"one":"035f15499cdb0f079b3e358ad54a6122681442a5293c3ae2fdf6c527004b36d2","other":"807416cc70f02d481a188027f7932b48e8f7b5e8258f7e9623f3f6e2985d8f6a","up":true},{"one":"807416cc70f02d481a188027f7932b48e8f7b5e8258f7e9623f3f6e2985d8f6a","other":"a6165a4b02d58be116892982c0ed3d49d86fec0e9f436a516b61868331ed853f","up":true},{"one":"a6165a4b02d58be116892982c0ed3d49d86fec0e9f436a516b61868331ed853f","other":"7ce7fec833a2e8c7720fcc97f820f2ca2aca85388210f887c3efe78b020766e7","up":true},{"one":"7ce7fec833a2e8c7720fcc97f820f2ca2aca85388210f887c3efe78b020766e7","other":"48d79ac55f8df512af8e7d868aa40ac9b61493fa4f1b0ce0b76bf6da2eb30e78","up":true},{"one":"48d79ac55f8df512af8e7d868aa40ac9b61493fa4f1b0ce0b76bf6da2eb30e78","other":"48b850974575ca57a3cc5f9a4cf5aafd8688cb32b993f69983ece63258ff876e","up":true},{"one":"48b850974575ca57a3cc5f9a4cf5aafd8688cb32b993f69983ece63258ff876e","other":"178401ec8d01a0a4f551d23e880a8e8a4eb87773565363843d51cf52660b1211","up":true},{"one":"178401ec8d01a0a4f551d23e880a8e8a4eb87773565363843d51cf52660b1211","other":"1fd0192df1fbf33771ca575afbb4e27c6541cce4a3cff2dfc1f2c085e7fab79e","up":true},{"one":"1fd0192df1fbf33771ca575afbb4e27c6541cce4a3cff2dfc1f2c085e7fab79e","other":"26ab9c813822dbb4f1a230cd8e99e8ab280b242747deb55fdf93d160906ef331","up":true},{"one":"26ab9c813822dbb4f1a230cd8e99e8ab280b242747deb55fdf93d160906ef331","other":"a9700308516c02cf9aea8809000a4e0596d6b44753e10bd0928df83e2eb9b9e7","up":true},{"one":"a9700308516c02cf9aea8809000a4e0596d6b44753e10bd0928df83e2eb9b9e7","other":"e6812448728b4bda5962adceb1707b29f661d3d1a6b2ccd5f8183c9a1f4d01b6","up":true},{"one":"025de1d2ec529d3a7da302eef0f8c54996616d40c940c0956d470ffc2a007f33","other":"741a854ae299df49a738725bc58abe614e5e4302ffecd8320bbede8412d160c0","up":true},{"one":"eb686a686fd70e41659cc69ec0db53d1512dfec238918afd0a515d8ce177d4d9","other":"e6812448728b4bda5962adceb1707b29f661d3d1a6b2ccd5f8183c9a1f4d01b6","up":true},{"one":"14849f811af20ce19fb29417d20c15fc16da1e45aebdf795a2c6ccb671e4bdac","other":"9257dc934dfbf17473b70cb85333c6fab67ee9b6228a646576c4f57253f1004e","up":true},{"one":"9257dc934dfbf17473b70cb85333c6fab67ee9b6228a646576c4f57253f1004e","other":"eb686a686fd70e41659cc69ec0db53d1512dfec238918afd0a515d8ce177d4d9","up":true},{"one":"08e5a268f397385c69a7fec855ae4d889cfa98afef5b7c09fc4841e3f8894ad8","other":"e8676d17966625c4fdac6bd9437981a0cf869c8b0010812edf0c79805e0e1ff1","up":true},{"one":"9464ad8da1a5effdc0351742dfffae941ffd9fab469637b2491caece53c57dc8","other":"08bd1e049859b4a7c8078ca9741fe3daa668b9fe478da06d1a435cd5566b3e11","up":true},{"one":"ab719e60a77ba5253f1690c920df9dd9f3a62071e9cce9d62e0001a522b3409e","other":"36b93656cab02213fa76124af6251109356abc5e0ae5dd1e203c6a013e014548","up":true},{"one":"648a96d61898eb2d336ff7d5a229cfeb7b9f587282e40f9fe640e181ae26bdd3","other":"c603138e40fe2f85cc634017956ada6399fca99969e3bf0c1ee8428374e779f1","up":true},{"one":"80d7e892bbb26808abb1d1530077fec6b08768c151a9f220881da3c862bae0af","other":"3c5b2e125020c80e3674df9cac34de4d8f3a94ee02556fb557921b6d5498b933","up":true},{"one":"2c85f5361b2d5abcf799de50fe58b1ed2006ea18f75823748c33eb7e95b1cc39","other":"951877b34ee1535b5059c49beb03e8960ff9c12b694ef64708c77c30ff1dc706","up":true},{"one":"951877b34ee1535b5059c49beb03e8960ff9c12b694ef64708c77c30ff1dc706","other":"36b93656cab02213fa76124af6251109356abc5e0ae5dd1e203c6a013e014548","up":true},{"one":"012ba278d582691241875c4c14ead91fff3983e190df7d9b43ade384e84c11fb","other":"9464ad8da1a5effdc0351742dfffae941ffd9fab469637b2491caece53c57dc8","up":true},{"one":"a0c88ba70599b0e72c18fa6aedd14d607cca3e9a49a5d50165d084e70328c2dd","other":"51440ab47fc5076c00cad16a542b846c26b3281ecea4dbca795ae9b80183ec90","up":true},{"one":"0e3b7722f3f84d83b3d744bea4e893715a01d4df3cf4a1c6a6823a1f5c9ad6b8","other":"951877b34ee1535b5059c49beb03e8960ff9c12b694ef64708c77c30ff1dc706","up":true},{"one":"e6812448728b4bda5962adceb1707b29f661d3d1a6b2ccd5f8183c9a1f4d01b6","other":"9257dc934dfbf17473b70cb85333c6fab67ee9b6228a646576c4f57253f1004e","up":true},{"one":"4a95d49f58057b039b55a34f67a348c052f61770065e41243ff055efc570a935","other":"025de1d2ec529d3a7da302eef0f8c54996616d40c940c0956d470ffc2a007f33","up":true},{"one":"44adaabf9c46608a374ed816d3c40c63b6645f4f6e033a76431bc8f88713eb41","other":"4005fd1fa8fbb318b29a62c368ada579e5122ca0578e6a75c509552be4b63b76","up":true},{"one":"ff75b19017c84128f38dec4f63e1f247a5691dc0fae186e667afedb5fe9d2c80","other":"0e3b7722f3f84d83b3d744bea4e893715a01d4df3cf4a1c6a6823a1f5c9ad6b8","up":true},{"one":"32ff1969d90aaa5a8ed2260968a8e2bac2d1cae597c906f90495f1dc5de7f8d3","other":"046ca54165f0dd4d62fd7d8ee9e97c655db3d35f5452a0ccb0dffc79c047978c","up":true},{"one":"951877b34ee1535b5059c49beb03e8960ff9c12b694ef64708c77c30ff1dc706","other":"4005fd1fa8fbb318b29a62c368ada579e5122ca0578e6a75c509552be4b63b76","up":true},{"one":"f305273a7d08e72f69b0b153855e822f252cbbf34a18f305134eed9d1eb7b58a","other":"f1ed9d45622ff974a1e396cd878b2deb89e31aa5d08da773423f292ae8dbcbb6","up":true},{"one":"9c21cb3e56f8ac66a7917a9ba14e58f77e998ac70c178b88b5053d9ac2777e60","other":"f305273a7d08e72f69b0b153855e822f252cbbf34a18f305134eed9d1eb7b58a","up":true},{"one":"0e3b7722f3f84d83b3d744bea4e893715a01d4df3cf4a1c6a6823a1f5c9ad6b8","other":"36b93656cab02213fa76124af6251109356abc5e0ae5dd1e203c6a013e014548","up":true},{"one":"f7561cb6740e17ec7c7d17068251b2c951d954c77804aa5af60464e9c3964e57","other":"f1ed9d45622ff974a1e396cd878b2deb89e31aa5d08da773423f292ae8dbcbb6","up":true},{"one":"8ea2c8acc111f38d5b4a5ed60252ee83f312d0f8359265d5b9266d54735052fe","other":"a8b58013ff911871d1aa6c2bbea6c2e6ef9b00b87b80a41dc04724ad0488e2ff","up":true},{"one":"08f84878e44fed2adb4b2685b9f293dc3c73d5f9bc1c474870d943ec2ae73dbe","other":"025de1d2ec529d3a7da302eef0f8c54996616d40c940c0956d470ffc2a007f33","up":true},{"one":"9c8e1f23f260c5a46b0001572675b19e5293ca65e7fdfc131c07612e9c4072fa","other":"aaf051a087a92f874a3f6c7923015e4cffb4bb3ef381c977fd902f21e841d0f4","up":true},{"one":"30feca631f06041cb14cead384dfaa5fffa6dc34b0cee54230efbe15e56a5884","other":"c8ea4177420785926e0929701f5e74c744920386f2a43b89d83c8281106cb95e","up":true},{"one":"36b93656cab02213fa76124af6251109356abc5e0ae5dd1e203c6a013e014548","other":"3728152c88f1e5e61f6523b09e8f3bb1023b700deccdca5fcc1e6488136b0e57","up":true},{"one":"3938e6b2c095084dc9975a3e8649133557495d34ac6df874c6d929266e3ffe6f","other":"9c21cb3e56f8ac66a7917a9ba14e58f77e998ac70c178b88b5053d9ac2777e60","up":true},{"one":"44adaabf9c46608a374ed816d3c40c63b6645f4f6e033a76431bc8f88713eb41","other":"b3f95f225e2b6b76e6c7ef7c86caf83e35213f6a22da41e653ca1c190be23c9c","up":true},{"one":"8358a74fc8d8e39ccc40b4d3a212b7a69a6a8f6afc25cff2c9c7b44bbaf9ec82","other":"7c7ca5a7522a04f62f2bebd6197a03d78f255d0175c3dfceb5d92b684365b2aa","up":true},{"one":"e6812448728b4bda5962adceb1707b29f661d3d1a6b2ccd5f8183c9a1f4d01b6","other":"08bd1e049859b4a7c8078ca9741fe3daa668b9fe478da06d1a435cd5566b3e11","up":true},{"one":"67909bdcaef2330ef120e524c76e1e382b474f3332d86f65282028e051f34c75","other":"7049e92a396311fbf2f4a55bb5bd2fe3f7bb3c1a63f41bb88eb800edd45ac6e5","up":true},{"one":"da36d1df95a158b0d3f9e7407d663a6b611dde0a77f00a584b97a939ab6a00de","other":"4005fd1fa8fbb318b29a62c368ada579e5122ca0578e6a75c509552be4b63b76","up":true},{"one":"b3f95f225e2b6b76e6c7ef7c86caf83e35213f6a22da41e653ca1c190be23c9c","other":"ff75b19017c84128f38dec4f63e1f247a5691dc0fae186e667afedb5fe9d2c80","up":true},{"one":"9257dc934dfbf17473b70cb85333c6fab67ee9b6228a646576c4f57253f1004e","other":"8402bd62282811ed236b2fa1f0d41ad4bbe54e420ee34adc6164cfd4baf8658d","up":true},{"one":"3728152c88f1e5e61f6523b09e8f3bb1023b700deccdca5fcc1e6488136b0e57","other":"46bfa8bea56b0be1abfa5ad3561bb6bf49ed6695d83ee2b2c192c5a0408347cf","up":true},{"one":"eb686a686fd70e41659cc69ec0db53d1512dfec238918afd0a515d8ce177d4d9","other":"025de1d2ec529d3a7da302eef0f8c54996616d40c940c0956d470ffc2a007f33","up":true},{"one":"4b79e83186f2ab05932eaa99982a2e53373b83780e32d224d15cb2c85462451f","other":"9464ad8da1a5effdc0351742dfffae941ffd9fab469637b2491caece53c57dc8","up":true},{"one":"4005fd1fa8fbb318b29a62c368ada579e5122ca0578e6a75c509552be4b63b76","other":"0e3b7722f3f84d83b3d744bea4e893715a01d4df3cf4a1c6a6823a1f5c9ad6b8","up":true},{"one":"0e80db9dfa8ce29bedfb2de031622bef8829bee52771322b6a7efb47afe540e7","other":"ec90a22f41ee659d5759a497946ac2991c916f00fe7caeeeb0908f3af1fe60b6","up":true},{"one":"2c85f5361b2d5abcf799de50fe58b1ed2006ea18f75823748c33eb7e95b1cc39","other":"9c8e1f23f260c5a46b0001572675b19e5293ca65e7fdfc131c07612e9c4072fa","up":true},{"one":"87a337622455ae65daf3ab2555cee8985e9aa14bac245545d985296060e4a8de","other":"ba911175d3aa3fcc266e2a5aa32fb706208b8a9b5021a5f37c0b85f547eb375d","up":true},{"one":"955da15edae50a4c68bc8c579b9799d55f41b7c2a6178f645f79d772e0116662","other":"c190f9d08c78ed6dffadaef36e77fe6aa96099e4453753b0cfc8ec542fa96b9d","up":true},{"one":"68cbc4a5313080d5dca8ad34e8bf52a6144e0ff8ef3f795d7ae9d5f644fe2042","other":"0e80db9dfa8ce29bedfb2de031622bef8829bee52771322b6a7efb47afe540e7","up":true},{"one":"553824ef701d3cd0191ae3a67de564ed0cf553e74bd60ed9de321f9302732ba6","other":"59876e7ff9e92243856dad23126e1d38d9a5ddae79772ed1b2bdb91f33a4a4b5","up":true},{"one":"0d1c35c6ea485cb33857b790ee262f974cf0d54cf8ce3003f8308ac2e87c2c25","other":"cdb13873ac058861f295ebca5d958bf2bb793e3f9e274cf5a73a633425a9276f","up":true},{"one":"7c7ca5a7522a04f62f2bebd6197a03d78f255d0175c3dfceb5d92b684365b2aa","other":"8ea2c8acc111f38d5b4a5ed60252ee83f312d0f8359265d5b9266d54735052fe","up":true},{"one":"59876e7ff9e92243856dad23126e1d38d9a5ddae79772ed1b2bdb91f33a4a4b5","other":"cdb13873ac058861f295ebca5d958bf2bb793e3f9e274cf5a73a633425a9276f","up":true},{"one":"ab719e60a77ba5253f1690c920df9dd9f3a62071e9cce9d62e0001a522b3409e","other":"aaf051a087a92f874a3f6c7923015e4cffb4bb3ef381c977fd902f21e841d0f4","up":true},{"one":"8402bd62282811ed236b2fa1f0d41ad4bbe54e420ee34adc6164cfd4baf8658d","other":"9464ad8da1a5effdc0351742dfffae941ffd9fab469637b2491caece53c57dc8","up":true},{"one":"741a854ae299df49a738725bc58abe614e5e4302ffecd8320bbede8412d160c0","other":"08f84878e44fed2adb4b2685b9f293dc3c73d5f9bc1c474870d943ec2ae73dbe","up":true},{"one":"2a507f5cb921137a7225c9c4988a8514af0f7e3c442cb8bf2bb612dc522a7daf","other":"031450ec20f353435b429b5fa64f616d07c9d586afabc7a2772e05ad5c88bf50","up":true},{"one":"48f1ca6d433019f932fa4ae03e0decbcbea3fe635edff4458a669b83f8162b9a","other":"08f84878e44fed2adb4b2685b9f293dc3c73d5f9bc1c474870d943ec2ae73dbe","up":true},{"one":"012ba278d582691241875c4c14ead91fff3983e190df7d9b43ade384e84c11fb","other":"8402bd62282811ed236b2fa1f0d41ad4bbe54e420ee34adc6164cfd4baf8658d","up":true},{"one":"9ec831d97418916fd9695465e041caf27824dbb51d6ff74d6b70f3bd561e70e6","other":"0d1c35c6ea485cb33857b790ee262f974cf0d54cf8ce3003f8308ac2e87c2c25","up":true},{"one":"cc3397e9e11f75273d3f81d91f980f4504755f80b27a183212de56cc5085e58d","other":"7049e92a396311fbf2f4a55bb5bd2fe3f7bb3c1a63f41bb88eb800edd45ac6e5","up":true},{"one":"cf52b3fc82ec24c3e9b40488d7c5f7ac8af731d159a103619bee932ec74d5e92","other":"e2d36f335d90ad63148db8e353a78a30d8d9c0abe107be2cf8685f6a01ce74b9","up":true},{"one":"7660828fb0c8f89201d34e6f4d61cc6ba9a30cead6e4eb8253f6cc92e1845f23","other":"08f84878e44fed2adb4b2685b9f293dc3c73d5f9bc1c474870d943ec2ae73dbe","up":true},{"one":"8b4318f86ad47976321af97bfbf95cd0a3b0aa22447aeb0611ed1a9bf1e6a4bf","other":"1dc0ef1ce68dc681298177bde808af514efa52a5ad38c9cd2bd61968cdf19cfb","up":true},{"one":"447a411c80fbd422bfa0c358d3f2a1fe6256c05e35acc6350958dfbe62cd5b9b","other":"402cf9d0bffa017ebea34ede11207f3366b3ea450c0428029129a8e8026abbe7","up":true},{"one":"3a628ef171c1f26fa0966eb89210be0a14305aae8bfed10f4ed9017698f40f4b","other":"447a411c80fbd422bfa0c358d3f2a1fe6256c05e35acc6350958dfbe62cd5b9b","up":true},{"one":"9464ad8da1a5effdc0351742dfffae941ffd9fab469637b2491caece53c57dc8","other":"741a854ae299df49a738725bc58abe614e5e4302ffecd8320bbede8412d160c0","up":true},{"one":"81a5a07f92f813e85b501b0028e1caa6e6a6c7efa5195ecb693cd2d91d5132a0","other":"48f1ca6d433019f932fa4ae03e0decbcbea3fe635edff4458a669b83f8162b9a","up":true},{"one":"08bd1e049859b4a7c8078ca9741fe3daa668b9fe478da06d1a435cd5566b3e11","other":"741a854ae299df49a738725bc58abe614e5e4302ffecd8320bbede8412d160c0","up":true},{"one":"6d3c6db15900f2596286f81cc0664d2c8291ead5bad2aa35bad515af088a2e48","other":"24f80c437be45898e594f821bba0f5c62e0c9a0c720118e362ee6f78410612bd","up":true},{"one":"4a95d49f58057b039b55a34f67a348c052f61770065e41243ff055efc570a935","other":"9464ad8da1a5effdc0351742dfffae941ffd9fab469637b2491caece53c57dc8","up":true},{"one":"8862cd85d7039119b984f752a458ac0495ddea98c69fc1d1241db7873a712c11","other":"e2770cef7c1ad312b70d94ca5570e45f324c798a31a93203f505167aeab122b6","up":true},{"one":"80d7e892bbb26808abb1d1530077fec6b08768c151a9f220881da3c862bae0af","other":"d95965e449dd4069876384cf4b34f986731e255a7948f0a862d229b1dddbc502","up":true},{"one":"07f5d094a4b22e73cdd6c85452b3d928da9b4b16873824759cb7e8a622417fd5","other":"056152dd9dae85c426378d34acab8d6641da665d2f57359a27a0ff652f3f3d02","up":true},{"one":"52a8747e4ea35f6f50c72d7c481616f68a5e4396248332b8ff69d3a772de49ac","other":"1dec77c2f4caf053c2d0524ae34a2d970bf4743a0d009d8fc543077ddfdfe3d0","up":true},{"one":"7049e92a396311fbf2f4a55bb5bd2fe3f7bb3c1a63f41bb88eb800edd45ac6e5","other":"bdc5de01276157a0f3fc43a9cc3b41b2cacc8479118b75aec4ba9b2b7fa86d5e","up":true},{"one":"14849f811af20ce19fb29417d20c15fc16da1e45aebdf795a2c6ccb671e4bdac","other":"012ba278d582691241875c4c14ead91fff3983e190df7d9b43ade384e84c11fb","up":true},{"one":"7e47a2f82984a600c8583605a91d5cb8f2d9a18961845e9c422edd78e20ac3a3","other":"298ae5d173c5360bc9ad5b492ed35de3b6e0cae868a34bfe6311a8ba5ea9877e","up":true},{"one":"1dec77c2f4caf053c2d0524ae34a2d970bf4743a0d009d8fc543077ddfdfe3d0","other":"6c0142984d629ae6995894de9e7e5eb8d3fe45e1641d7ebd63959d2e61548ba3","up":true},{"one":"035f15499cdb0f079b3e358ad54a6122681442a5293c3ae2fdf6c527004b36d2","other":"7ce7fec833a2e8c7720fcc97f820f2ca2aca85388210f887c3efe78b020766e7","up":true},{"one":"1bd588263274543729d54529ae9e9bf4596db40649a1c2a3f73168d818f34b62","other":"a606c79a018a6535375d851fcc82c42cc7c952720aa120434cedccf4a4be1f59","up":true},{"one":"138dbc1662c4ce9b2b30ef5035914cc70465666fe18f313318e662d13f099621","other":"5bd8faf93bcad07006e9426b45f5cc599f1963ab791deac4ff63d6739cd62a17","up":true},{"one":"318828fa893a28cc0652d3f81d97c5b8e023e853685f5d3e65fde20689abcc5a","other":"93ea8ef251fd56b159e080cdf733d33e1fdfb3c7ae5bd9a6a328d0bf5458867b","up":true},{"one":"d3e913cf4a7dabfb5699131b65e533a40adb46ea37e0ed4ce9433f99015986ef","other":"93c0e1adf23fdf1623359eb88c517bc521d5a26325554df890cc04c1fa17a5df","up":true},{"one":"a0c88ba70599b0e72c18fa6aedd14d607cca3e9a49a5d50165d084e70328c2dd","other":"e8676d17966625c4fdac6bd9437981a0cf869c8b0010812edf0c79805e0e1ff1","up":true},{"one":"5c7c15798e86fe794bb201614d46366ea96dc51091f5b19f149995e0d40df0a6","other":"035f15499cdb0f079b3e358ad54a6122681442a5293c3ae2fdf6c527004b36d2","up":true},{"one":"1fd0192df1fbf33771ca575afbb4e27c6541cce4a3cff2dfc1f2c085e7fab79e","other":"a9700308516c02cf9aea8809000a4e0596d6b44753e10bd0928df83e2eb9b9e7","up":true},{"one":"1addd4a9f01486212e13e43a9650b7f793617d1cb59fb8d941270d7ae55f575f","other":"3c5b2e125020c80e3674df9cac34de4d8f3a94ee02556fb557921b6d5498b933","up":true},{"one":"648a96d61898eb2d336ff7d5a229cfeb7b9f587282e40f9fe640e181ae26bdd3","other":"08e5a268f397385c69a7fec855ae4d889cfa98afef5b7c09fc4841e3f8894ad8","up":true},{"one":"e64d90760cd81e4f112bbf1432e76c82fa4173fd474b988f4096ce187363fd81","other":"d3022a46956e75bca85ba89d97b694a3a64f03ccc2d881ed0cd687d43d486925","up":true},{"one":"93c0e1adf23fdf1623359eb88c517bc521d5a26325554df890cc04c1fa17a5df","other":"a6165a4b02d58be116892982c0ed3d49d86fec0e9f436a516b61868331ed853f","up":true},{"one":"031450ec20f353435b429b5fa64f616d07c9d586afabc7a2772e05ad5c88bf50","other":"d3022a46956e75bca85ba89d97b694a3a64f03ccc2d881ed0cd687d43d486925","up":true},{"one":"a3309f8b8bba4d8fbd7c6193d7671cb907b94e71155ef6138e0248682ff00e58","other":"d20931ce3da972fd23ea306e5c604a1fbd9417ba02654c5cdbe278fe259f75d5","up":true},{"one":"1dc0ef1ce68dc681298177bde808af514efa52a5ad38c9cd2bd61968cdf19cfb","other":"cc3397e9e11f75273d3f81d91f980f4504755f80b27a183212de56cc5085e58d","up":true},{"one":"807416cc70f02d481a188027f7932b48e8f7b5e8258f7e9623f3f6e2985d8f6a","other":"93c0e1adf23fdf1623359eb88c517bc521d5a26325554df890cc04c1fa17a5df","up":true},{"one":"08e5a268f397385c69a7fec855ae4d889cfa98afef5b7c09fc4841e3f8894ad8","other":"aeb45fe10b0dbd0f72ab6a77fbf971a8f46dbcdd96c08f23279d1434b4f38b1d","up":true},{"one":"d95965e449dd4069876384cf4b34f986731e255a7948f0a862d229b1dddbc502","other":"eff2450bea797ff66d93e7c1c1b0977cddf3abba64bfa51bcc509d728569e2fa","up":true},{"one":"402cf9d0bffa017ebea34ede11207f3366b3ea450c0428029129a8e8026abbe7","other":"d3022a46956e75bca85ba89d97b694a3a64f03ccc2d881ed0cd687d43d486925","up":true},{"one":"c603138e40fe2f85cc634017956ada6399fca99969e3bf0c1ee8428374e779f1","other":"9c8e1f23f260c5a46b0001572675b19e5293ca65e7fdfc131c07612e9c4072fa","up":true},{"one":"7c464054ea7b6c9ea0c7d4c209769c92f294a9db2ca159b8ef168e310a1eac3a","other":"5a8b84df651871fce72d11cb1c26c87ae4a0cc6b4c274d37e70532c94f27288e","up":true},{"one":"c96146ee47ec7cd74551cf74f00213bc337d643c4327393f0e6848ecd4a0f8d3","other":"93ea8ef251fd56b159e080cdf733d33e1fdfb3c7ae5bd9a6a328d0bf5458867b","up":true},{"one":"51440ab47fc5076c00cad16a542b846c26b3281ecea4dbca795ae9b80183ec90","other":"08e5a268f397385c69a7fec855ae4d889cfa98afef5b7c09fc4841e3f8894ad8","up":true},{"one":"5c373034770e413e700b1cd03b2035f769ecd9ab8eb54d32f7b2645be1991fe5","other":"035f15499cdb0f079b3e358ad54a6122681442a5293c3ae2fdf6c527004b36d2","up":true},{"one":"f9ded7b83e473e71be2fc0101d574c44521c96f77f9f84a384785a3af6b1093d","other":"ed424d24d702520bf7cb5f6babbdc43a078435fb4a9884ed82a93d642839e127","up":true},{"one":"3b020c84fb60f59779324d451d9770d683e08133bbaa2d5762f61b8fd4b8d9fd","other":"031450ec20f353435b429b5fa64f616d07c9d586afabc7a2772e05ad5c88bf50","up":true},{"one":"18e00a7e0f826a1aba3f8c0f533ed905f2eee607b697fff056ee7874d374adcd","other":"67f383e5334e9b6701d1dbb20876d4ba9a7e578af0476caed4a7e1b701f2bedb","up":true},{"one":"31e670638acba3d58f4c67f3ff2f3f25d769e8a5d7a7838927f4d9d169a84404","other":"4d9147e3bf98cb59a7648f616c0d7f713a8cf3b7d25e3115233ff5883128beab","up":true},{"one":"0111e720a84b310f863c2530fbe149e6a221acbad01065c5d052d2b3e1716f54","other":"1dec77c2f4caf053c2d0524ae34a2d970bf4743a0d009d8fc543077ddfdfe3d0","up":true},{"one":"7ce7fec833a2e8c7720fcc97f820f2ca2aca85388210f887c3efe78b020766e7","other":"807416cc70f02d481a188027f7932b48e8f7b5e8258f7e9623f3f6e2985d8f6a","up":true},{"one":"679554b410e415cfcdf1b14ef87759269b2bcaf07f4541122977db3a40091da2","other":"6c0142984d629ae6995894de9e7e5eb8d3fe45e1641d7ebd63959d2e61548ba3","up":true},{"one":"4cece9bc134bc2b09400c9f7f8a4df9270d2fe3c077c5e441fffc911fcf6f42e","other":"885427318634c458a3050f2f26eb52454a75cea4a1263b9ed55e6eb899743854","up":true},{"one":"e2770cef7c1ad312b70d94ca5570e45f324c798a31a93203f505167aeab122b6","other":"679554b410e415cfcdf1b14ef87759269b2bcaf07f4541122977db3a40091da2","up":true},{"one":"8006b080c78a0ab54fa1be75a939bee2334322fded6c3563de1596b17c36172c","other":"84a9db7645c792dc38c1f2113a8f0590d04e1c94d9a8c464ab0ec8219303d966","up":true},{"one":"178401ec8d01a0a4f551d23e880a8e8a4eb87773565363843d51cf52660b1211","other":"26ab9c813822dbb4f1a230cd8e99e8ab280b242747deb55fdf93d160906ef331","up":true},{"one":"194ea3e14dc5d99f98d15607dc4c405769f5a371acc22d41a62d0537d716be32","other":"eebd48b367cbfe94a37c0deb274a697e628074f9560b909e66229c5c76ce68eb","up":true},{"one":"09b3fa30780931e18b92c75d1cdeafa365609c565e4e8c253d393835cb82d98e","other":"6d5ec591af4966ba024c6b2aeb45e0aab8aa1762f9cac30ce3934da529b738e9","up":true},{"one":"056152dd9dae85c426378d34acab8d6641da665d2f57359a27a0ff652f3f3d02","other":"4d381014783980b2f77f0d71160ad9e9d84672b576f4435ccdbae12752350c1c","up":true},{"one":"8cc3fb39009d0adc26fca1e2ee96822d168d4debc379fd516c15d4b4a1624231","other":"447a411c80fbd422bfa0c358d3f2a1fe6256c05e35acc6350958dfbe62cd5b9b","up":true},{"one":"c6a8220726243cceaa6f2cebdac857a05efe721323f0a064c7f85a8340d3da96","other":"f8ff7440d6f4abb1c89496336843741ed53a544cedeeed71d8ebe0b08698438d","up":true},{"one":"e8676d17966625c4fdac6bd9437981a0cf869c8b0010812edf0c79805e0e1ff1","other":"e2770cef7c1ad312b70d94ca5570e45f324c798a31a93203f505167aeab122b6","up":true},{"one":"67f383e5334e9b6701d1dbb20876d4ba9a7e578af0476caed4a7e1b701f2bedb","other":"435d721a568eb906a03c69dbd71337251a550521a4004ab5d4a7deb6f317061a","up":true},{"one":"eff2450bea797ff66d93e7c1c1b0977cddf3abba64bfa51bcc509d728569e2fa","other":"aceee75a260d45252060fe971eabd4bde25f912db4a3c6e47f4a09572fe01697","up":true},{"one":"67585dfd87a005bae9bffc2cccb83c69537247c74886b4fa52287f46c796bcb6","other":"3cabd3a567fc4e6f8da66eb35d938fe1e9a7f2bdd2d36c4dc2d0e0e9149f5e56","up":true},{"one":"3c5b2e125020c80e3674df9cac34de4d8f3a94ee02556fb557921b6d5498b933","other":"c74d801e85ac0fd8951480d107b41eddc5c92775614c4886b3f732fa3d1a791d","up":true},{"one":"31e129ab3df7e082cc27c649d9ee29a3ea646d6a97d2417875b80e3ff576c047","other":"ed424d24d702520bf7cb5f6babbdc43a078435fb4a9884ed82a93d642839e127","up":true},{"one":"05949ec1a582fa70cab95c59e7c0d315583bf9fc320c60c35268931f21e90853","other":"c8c8a93779ec4d9ac40925e8208478a00ee27fc220ddd73d8774cf6bfa255c46","up":true},{"one":"f8ff7440d6f4abb1c89496336843741ed53a544cedeeed71d8ebe0b08698438d","other":"c8c8a93779ec4d9ac40925e8208478a00ee27fc220ddd73d8774cf6bfa255c46","up":true},{"one":"8e7b96d28edae711e1a4cee0d894e0bd92cdf410ba6f61713f7d9b0bee761d4c","other":"aceee75a260d45252060fe971eabd4bde25f912db4a3c6e47f4a09572fe01697","up":true},{"one":"46bfa8bea56b0be1abfa5ad3561bb6bf49ed6695d83ee2b2c192c5a0408347cf","other":"08e5a268f397385c69a7fec855ae4d889cfa98afef5b7c09fc4841e3f8894ad8","up":true},{"one":"aeb45fe10b0dbd0f72ab6a77fbf971a8f46dbcdd96c08f23279d1434b4f38b1d","other":"51440ab47fc5076c00cad16a542b846c26b3281ecea4dbca795ae9b80183ec90","up":true},{"one":"48d79ac55f8df512af8e7d868aa40ac9b61493fa4f1b0ce0b76bf6da2eb30e78","other":"1fd0192df1fbf33771ca575afbb4e27c6541cce4a3cff2dfc1f2c085e7fab79e","up":true},{"one":"c74d801e85ac0fd8951480d107b41eddc5c92775614c4886b3f732fa3d1a791d","other":"447a411c80fbd422bfa0c358d3f2a1fe6256c05e35acc6350958dfbe62cd5b9b","up":true},{"one":"84a9db7645c792dc38c1f2113a8f0590d04e1c94d9a8c464ab0ec8219303d966","other":"a3309f8b8bba4d8fbd7c6193d7671cb907b94e71155ef6138e0248682ff00e58","up":true},{"one":"dad08999cd2edc33cfdc59ea34c8adcd6a34eaa15f2e85b0622e9848b215c1d5","other":"93ea8ef251fd56b159e080cdf733d33e1fdfb3c7ae5bd9a6a328d0bf5458867b","up":true},{"one":"5a26ae73eebf27f6dbec2414f1277a249e814a7a06790d7061610e5227b086f6","other":"648a96d61898eb2d336ff7d5a229cfeb7b9f587282e40f9fe640e181ae26bdd3","up":true},{"one":"397a0a0e9fadcb571acd8981f5bfe8e059e707e0feae8a9c4c6bfe87bd39e66a","other":"eebd48b367cbfe94a37c0deb274a697e628074f9560b909e66229c5c76ce68eb","up":true},{"one":"a5ac04d53b569e418ef5007961431155f2c226ee10157b30af71ea4836b08089","other":"cd6c8b42a0b092f41e6925577c9de7d1bea17231bcb3d08f3d3cce9c6fdcf22d","up":true},{"one":"3f31ecaffaa6311c82c9a575bbc38d6bcb16630ac87e19d1853a64aa96c9dcde","other":"6e7f1f3d65364399617a4d95fdd04f2ca9b007b2366943e7ba5acd4616a7a425","up":true},{"one":"834f14e9f325482adef62651ddf3685690dd5ebdd18014f2bd266b2143c290ff","other":"bfc711793830779f49aa59bc6f7a205ab4e6eae7abfdafbf3bb5a1163a778ab2","up":true},{"one":"7850f5ee5048959559b3af0f95689669b250fc3aa58bcc9544dca61ca9c9769c","other":"ddb8be472c3d48dc4d3d112448e6c0c4a826a18af3f3b53fdfef8cd31053c75f","up":true},{"one":"26acc3c373c29150af30bbc9264d0c44c7c606ff7377399ddf844635e97afcfa","other":"f645aab9cb2bd2709998b38e5789c9c5f68d40765e6cbd93b92e6383eb671dba","up":true},{"one":"43c9e1571c460cb9f599fa8ed79ddd0f9c3a21fd2fa455e0603109c55012f76b","other":"2fd2f77d76cca480ac18e9af7a462f297db168c3370b3bc0e2c04aa006c4d037","up":true},{"one":"eebd48b367cbfe94a37c0deb274a697e628074f9560b909e66229c5c76ce68eb","other":"6e7f1f3d65364399617a4d95fdd04f2ca9b007b2366943e7ba5acd4616a7a425","up":true},{"one":"019109311d4888497aa194cce4a89b5ef243421cf0e7e7bb9115d086e1a1f7d7","other":"be68267d77fb52424227267c665ca1193a010334cac057338aca77b49a4b94da","up":true},{"one":"97daf2cbe03c80ce6c4dae39cd071dd93cb32ed245aa9aa77285e12296957ca3","other":"31e129ab3df7e082cc27c649d9ee29a3ea646d6a97d2417875b80e3ff576c047","up":true},{"one":"a8ff8d69dcb36462d1116dafa5e3d0c7237bf65dbece482a316862c8d66e35b6","other":"ddb8be472c3d48dc4d3d112448e6c0c4a826a18af3f3b53fdfef8cd31053c75f","up":true},{"one":"a8f49e87156fda5510897601689ce968d77032134c523634916b96de16366f9e","other":"b6dffac4b4eb2974ed0ed241799f97d2e5d9be671e311266826d0dcfecfcc209","up":true},{"one":"6d5ec591af4966ba024c6b2aeb45e0aab8aa1762f9cac30ce3934da529b738e9","other":"885427318634c458a3050f2f26eb52454a75cea4a1263b9ed55e6eb899743854","up":true},{"one":"5d82a418629cfbe7c57105309319ad695a198626fe3571de213a12ddf62f7308","other":"a606c79a018a6535375d851fcc82c42cc7c952720aa120434cedccf4a4be1f59","up":true},{"one":"435d721a568eb906a03c69dbd71337251a550521a4004ab5d4a7deb6f317061a","other":"885427318634c458a3050f2f26eb52454a75cea4a1263b9ed55e6eb899743854","up":true},{"one":"a5053958f0cefcff1826bf02525fda98c4dc954cc38690f3c43ecbf0b2ad57af","other":"c96146ee47ec7cd74551cf74f00213bc337d643c4327393f0e6848ecd4a0f8d3","up":true},{"one":"d20931ce3da972fd23ea306e5c604a1fbd9417ba02654c5cdbe278fe259f75d5","other":"d3022a46956e75bca85ba89d97b694a3a64f03ccc2d881ed0cd687d43d486925","up":true},{"one":"6b4ee1b73942ced78f97c0d0e221209933e63ae7353bb9ab3d37ac4127592e86","other":"0cfc7309afabceeb7d248714e972cf3987205324f5ab8d048d17bea5dc87369d","up":true},{"one":"305162c472c71ddef2320b138102b67d1ce2b8bba79e2e587fc80e085c88e547","other":"096a8302b6f369c28ed9d47719a507ead8a3cc1ca4fa1e32318b7f97873955fe","up":true},{"one":"cd6c8b42a0b092f41e6925577c9de7d1bea17231bcb3d08f3d3cce9c6fdcf22d","other":"a5053958f0cefcff1826bf02525fda98c4dc954cc38690f3c43ecbf0b2ad57af","up":true},{"one":"793322608055d4873776a9a0a6c40b04379bfd2f289a8ad49a7dc456bc65f871","other":"a606c79a018a6535375d851fcc82c42cc7c952720aa120434cedccf4a4be1f59","up":true},{"one":"af02c2f471e96ab8defbd229215695b95e64f7c78b145b6793a238961f556fbf","other":"fa240411bc4f3e44dfca3faedd112c7743a67b522a910bc99696ef0b31732ee2","up":true},{"one":"6e7f1f3d65364399617a4d95fdd04f2ca9b007b2366943e7ba5acd4616a7a425","other":"019109311d4888497aa194cce4a89b5ef243421cf0e7e7bb9115d086e1a1f7d7","up":true},{"one":"c8c8a93779ec4d9ac40925e8208478a00ee27fc220ddd73d8774cf6bfa255c46","other":"ed424d24d702520bf7cb5f6babbdc43a078435fb4a9884ed82a93d642839e127","up":true},{"one":"447cdbf1ff462aa67d6a46085b1a84fdc495a4142ab174c8e69b271b09732b4d","other":"6e7f1f3d65364399617a4d95fdd04f2ca9b007b2366943e7ba5acd4616a7a425","up":true},{"one":"140dd212f2b193ee6a9d7fc14f7da321c7ef6fd367fb4f194924fd0ad5d135cc","other":"e64d90760cd81e4f112bbf1432e76c82fa4173fd474b988f4096ce187363fd81","up":true},{"one":"95c0a351fb7aa6683280d159a7b808bfa63f63bff91a1c5936e973b2e5d3954f","other":"be68267d77fb52424227267c665ca1193a010334cac057338aca77b49a4b94da","up":true},{"one":"be68267d77fb52424227267c665ca1193a010334cac057338aca77b49a4b94da","other":"834f14e9f325482adef62651ddf3685690dd5ebdd18014f2bd266b2143c290ff","up":true},{"one":"482ec3dc05460579ea9bce87677bd3d9a1930e801fabeba607b8ab6b8729ff15","other":"f645aab9cb2bd2709998b38e5789c9c5f68d40765e6cbd93b92e6383eb671dba","up":true},{"one":"9f0e2bf8a962156c9e0a83c3d42ad3dc5ac5c3e508f24200bfb151aad4e395ff","other":"dad08999cd2edc33cfdc59ea34c8adcd6a34eaa15f2e85b0622e9848b215c1d5","up":true},{"one":"aceee75a260d45252060fe971eabd4bde25f912db4a3c6e47f4a09572fe01697","other":"d95965e449dd4069876384cf4b34f986731e255a7948f0a862d229b1dddbc502","up":true},{"one":"48b850974575ca57a3cc5f9a4cf5aafd8688cb32b993f69983ece63258ff876e","other":"1fd0192df1fbf33771ca575afbb4e27c6541cce4a3cff2dfc1f2c085e7fab79e","up":true},{"one":"994839e5f3a5b8b23aed84fb029413124af17804b79b0263ec6bfd5aec5dad78","other":"0e2b48558ce2af1fbfee38a557d56072e3091cfcaee8d7847c7c9dcf7bef9bfa","up":true},{"one":"5a8b84df651871fce72d11cb1c26c87ae4a0cc6b4c274d37e70532c94f27288e","other":"318828fa893a28cc0652d3f81d97c5b8e023e853685f5d3e65fde20689abcc5a","up":true},{"one":"096a8302b6f369c28ed9d47719a507ead8a3cc1ca4fa1e32318b7f97873955fe","other":"6e7f1f3d65364399617a4d95fdd04f2ca9b007b2366943e7ba5acd4616a7a425","up":true},{"one":"4d9147e3bf98cb59a7648f616c0d7f713a8cf3b7d25e3115233ff5883128beab","other":"eebd48b367cbfe94a37c0deb274a697e628074f9560b909e66229c5c76ce68eb","up":true},{"one":"dbd4d90e3342ef837b8ecf5c6e490f7c409f419cf36b77162a87cb2cfb8ae33c","other":"a5053958f0cefcff1826bf02525fda98c4dc954cc38690f3c43ecbf0b2ad57af","up":true},{"one":"3cabd3a567fc4e6f8da66eb35d938fe1e9a7f2bdd2d36c4dc2d0e0e9149f5e56","other":"0cfc7309afabceeb7d248714e972cf3987205324f5ab8d048d17bea5dc87369d","up":true},{"one":"885427318634c458a3050f2f26eb52454a75cea4a1263b9ed55e6eb899743854","other":"3cabd3a567fc4e6f8da66eb35d938fe1e9a7f2bdd2d36c4dc2d0e0e9149f5e56","up":true},{"one":"d408bb6f7af1590e1f162ce02cc016b1b86ede29851caa32434212ffa2a377c8","other":"16868ec5d8f490ac73ea28b4e8fdda55ac149bb1aafb177545b54b84a5ad5367","up":true},{"one":"fc514c43c4eb5c62798458da5d622e9248a6e530e4288cd902019aa05c4374d8","other":"8e282b0f27d4fa56fe14cfeb69fac5a53e3d882c7778eb190653e2eab7c93fd2","up":true},{"one":"56ca9dd846a58a0ffa7b49a88aad559a338ba535a6f738468b8f146c97890cb2","other":"7d162a11662585f8c38d88fb241623e67bacf90703065dae6c092b4b507d6543","up":true},{"one":"60c5647aed152609979366fb33dc8b28fc60736098ff68d232415889b43dfa58","other":"8e282b0f27d4fa56fe14cfeb69fac5a53e3d882c7778eb190653e2eab7c93fd2","up":true},{"one":"9b8e6bb3a7fe4dc65ac97404e546d8b777d068c94bc2355f4f1a510ad6c11905","other":"5ff09c6859736aad7a82a3bfb3f1a1a8b3c0d58f831863540d9c3013dd35745e","up":true},{"one":"c9c302de4afe7b4dcbb6f3e366ce747083f9dcd7d5c6a01b939da5cdc6ccc874","other":"d408bb6f7af1590e1f162ce02cc016b1b86ede29851caa32434212ffa2a377c8","up":true},{"one":"5ff09c6859736aad7a82a3bfb3f1a1a8b3c0d58f831863540d9c3013dd35745e","other":"60c5647aed152609979366fb33dc8b28fc60736098ff68d232415889b43dfa58","up":true},{"one":"7d162a11662585f8c38d88fb241623e67bacf90703065dae6c092b4b507d6543","other":"26acc3c373c29150af30bbc9264d0c44c7c606ff7377399ddf844635e97afcfa","up":true},{"one":"ec90a22f41ee659d5759a497946ac2991c916f00fe7caeeeb0908f3af1fe60b6","other":"c190f9d08c78ed6dffadaef36e77fe6aa96099e4453753b0cfc8ec542fa96b9d","up":true},{"one":"2e65d05648b798fafbc9bb582c05e6f8f891131260e8c90ca725ddcbc823f315","other":"b8e1a8622c256ef29acd52df7b3ace50820fb1a147716165ff862fdc973a48cd","up":true},{"one":"3a628ef171c1f26fa0966eb89210be0a14305aae8bfed10f4ed9017698f40f4b","other":"402cf9d0bffa017ebea34ede11207f3366b3ea450c0428029129a8e8026abbe7","up":true},{"one":"c190f9d08c78ed6dffadaef36e77fe6aa96099e4453753b0cfc8ec542fa96b9d","other":"d700d96de1193456dc0bcf492c7c11b0951062974af2f7f47b8c901b17c23165","up":true},{"one":"93c0e1adf23fdf1623359eb88c517bc521d5a26325554df890cc04c1fa17a5df","other":"c2d00c7d960174c0934129fdcec63525bfa728f78fb70b7c52036b772d6297ad","up":true},{"one":"9c21cb3e56f8ac66a7917a9ba14e58f77e998ac70c178b88b5053d9ac2777e60","other":"bcf85ecf421b871fca0247a7081188a8e2c08778b88ffad16db37ef024fec0fc","up":true},{"one":"2ddffddbf452f0c9268058a739f5757fb90281cbfd31bd6f760acc3392fec12a","other":"79e5c6c6d78c88c579003cda044882ecb04520fbad1f5feadbe7b6d23fe183c8","up":true},{"one":"2fd2f77d76cca480ac18e9af7a462f297db168c3370b3bc0e2c04aa006c4d037","other":"d700d96de1193456dc0bcf492c7c11b0951062974af2f7f47b8c901b17c23165","up":true},{"one":"f1ed9d45622ff974a1e396cd878b2deb89e31aa5d08da773423f292ae8dbcbb6","other":"c272b12f4020ae5b20e3d29cd09de03fa0088e3eeb5f07aa7728b29a3e90e687","up":true},{"one":"f6c028d6a2b6408e90169151f4519b561ed183bd8925ed9a1702806f397666e7","other":"d700d96de1193456dc0bcf492c7c11b0951062974af2f7f47b8c901b17c23165","up":true},{"one":"b8e1a8622c256ef29acd52df7b3ace50820fb1a147716165ff862fdc973a48cd","other":"feb3bc17ee7369a4fa9889d9250fed3c1257c70916871996e6eabd374dd8dc2e","up":true},{"one":"3938e6b2c095084dc9975a3e8649133557495d34ac6df874c6d929266e3ffe6f","other":"c42e6492879439eeecd9938d17ff283fd8f5f24206906ca512b4daa4803b78b4","up":true},{"one":"a7a856a43293aa3004848a86f187e09343bd605e1a93e853a6f6b6b1031bd667","other":"9ca1fd5d41975acb905f337997922849b4070360e47849bb4fd8cd1b9ddb4d73","up":true},{"one":"2c8042517dfeaa01586e91e491dd4154fb24c0d84fedb0404b9d5136f60da1d9","other":"43d43e9ebcbceb4830fc1d2d5024650b90698306bbd2c4d0b4841a1a8fd09c93","up":true},{"one":"f2b49a2247c9c5e8f6f755834a37fe5c17f208f994878e14b7001e404f52e125","other":"2ddffddbf452f0c9268058a739f5757fb90281cbfd31bd6f760acc3392fec12a","up":true},{"one":"b659418885032905ea20ad47d70470e403e7e407e0e9ebf9277f9a2d81ec121c","other":"9c21cb3e56f8ac66a7917a9ba14e58f77e998ac70c178b88b5053d9ac2777e60","up":true},{"one":"e0a0ba7e7e89a7af805e24abde1a5a5b489ba197585051a8755e8c2345c3d57b","other":"56635699bd3bc78193adbdb8e8b7c2c91dab4140fdaa506fea2300ee86c4ba81","up":true},{"one":"1070df5e904e3865085b0319a81761e59146494c689e7567efe7465fc819ae8b","other":"5814be13c8550b9a5a83d08e7af6022002a8fdaa38ba6c2c30be58099a9f7744","up":true},{"one":"b5eab4869b4cb65bdc1e5cab45c03016d202f9f5b668be50066451cfcf9ef299","other":"8f9aa2cd33d18e7cb4494d11a7532c97eb4a1cae172b2165c26ae4ed24887c0d","up":true},{"one":"f305273a7d08e72f69b0b153855e822f252cbbf34a18f305134eed9d1eb7b58a","other":"3938e6b2c095084dc9975a3e8649133557495d34ac6df874c6d929266e3ffe6f","up":true},{"one":"79e5c6c6d78c88c579003cda044882ecb04520fbad1f5feadbe7b6d23fe183c8","other":"2c8042517dfeaa01586e91e491dd4154fb24c0d84fedb0404b9d5136f60da1d9","up":true},{"one":"9ca1fd5d41975acb905f337997922849b4070360e47849bb4fd8cd1b9ddb4d73","other":"fc3911383f74a982f6af8ab95a63426b56117d45f153b3c1441459d9191daaff","up":true},{"one":"f7561cb6740e17ec7c7d17068251b2c951d954c77804aa5af60464e9c3964e57","other":"046ca54165f0dd4d62fd7d8ee9e97c655db3d35f5452a0ccb0dffc79c047978c","up":true},{"one":"bdc5de01276157a0f3fc43a9cc3b41b2cacc8479118b75aec4ba9b2b7fa86d5e","other":"5bd8faf93bcad07006e9426b45f5cc599f1963ab791deac4ff63d6739cd62a17","up":true},{"one":"8f9aa2cd33d18e7cb4494d11a7532c97eb4a1cae172b2165c26ae4ed24887c0d","other":"f2b49a2247c9c5e8f6f755834a37fe5c17f208f994878e14b7001e404f52e125","up":true},{"one":"8d192b11538072db750f71204e2e6adf9dc0508d9c5cf1eb457e4e996cd985bc","other":"d700d96de1193456dc0bcf492c7c11b0951062974af2f7f47b8c901b17c23165","up":true},{"one":"bea10868d5da506c1801de845c148c2f09761893113ac913fe66674a8f43c178","other":"e0a0ba7e7e89a7af805e24abde1a5a5b489ba197585051a8755e8c2345c3d57b","up":true},{"one":"cdb13873ac058861f295ebca5d958bf2bb793e3f9e274cf5a73a633425a9276f","other":"e471efbcf1def3915b3dda2dc65a86945c607be54a33e31e9625549becac0e34","up":true},{"one":"b78fd21c063006e2e033d1d00fc21e1ad7ad7951bb5621cec9b56639745d65f9","other":"7850f5ee5048959559b3af0f95689669b250fc3aa58bcc9544dca61ca9c9769c","up":true},{"one":"ddb8be472c3d48dc4d3d112448e6c0c4a826a18af3f3b53fdfef8cd31053c75f","other":"398038811c1c7402fe2e6994c9ce2f15c8166b8e99f379feaaed66ac87702062","up":true},{"one":"a2e6c900511768c8c9947ab0fa2e73975cf2a4cec7fd15217abdba25c329317e","other":"f645aab9cb2bd2709998b38e5789c9c5f68d40765e6cbd93b92e6383eb671dba","up":true},{"one":"a4ee49bb2caabb6b9448bcdff1fc3cc673a2db04eab9f5c62d1787f2c25990a0","other":"482ec3dc05460579ea9bce87677bd3d9a1930e801fabeba607b8ab6b8729ff15","up":true},{"one":"bbafac5ba5915db3c80e28b249cad260b9b5dad1f728063c48fa8f61d7556e17","other":"f2b49a2247c9c5e8f6f755834a37fe5c17f208f994878e14b7001e404f52e125","up":true},{"one":"a32749dc4e134a4fbb038618c58a7c05bbbaa06f1436de3754341af86402581b","other":"6dd3ac0fd9a04a2ce75875c683d135e52eaa1670cb55e78711620712e60fde47","up":true},{"one":"b6dffac4b4eb2974ed0ed241799f97d2e5d9be671e311266826d0dcfecfcc209","other":"8d192b11538072db750f71204e2e6adf9dc0508d9c5cf1eb457e4e996cd985bc","up":true},{"one":"ab3ff955033c0a2615932faf85fd20090b9121c7edcc8e6f7ce4c4fde0a96b8a","other":"837f0993f6374039a5ad4472d6313e647a4c5db4583bd27ccfa98d3448a17731","up":true},{"one":"d9cf19895e015cb534d915aed83c0d26bf40a11244027812e17c3bec6e645a8e","other":"7850f5ee5048959559b3af0f95689669b250fc3aa58bcc9544dca61ca9c9769c","up":true},{"one":"48de553e15afd3e8a46bfc3a5ba8a298158aa3d60f140d2730230af5cce8084d","other":"60c5647aed152609979366fb33dc8b28fc60736098ff68d232415889b43dfa58","up":true},{"one":"16868ec5d8f490ac73ea28b4e8fdda55ac149bb1aafb177545b54b84a5ad5367","other":"c9c302de4afe7b4dcbb6f3e366ce747083f9dcd7d5c6a01b939da5cdc6ccc874","up":true},{"one":"f215bc09268e60ebbec76f743bebd09d7e72d4cbeedc0b9d3417bb4a2ef42935","other":"9ec831d97418916fd9695465e041caf27824dbb51d6ff74d6b70f3bd561e70e6","up":true},{"one":"68cbc4a5313080d5dca8ad34e8bf52a6144e0ff8ef3f795d7ae9d5f644fe2042","other":"ec90a22f41ee659d5759a497946ac2991c916f00fe7caeeeb0908f3af1fe60b6","up":true},{"one":"553824ef701d3cd0191ae3a67de564ed0cf553e74bd60ed9de321f9302732ba6","other":"e09f98114da64e7547b351637190f6621a1f75568cfa9960980fc77618f8855b","up":true},{"one":"094256812084c6052a2604149aa3aba2379c483bf4ec25162f6b43934942775a","other":"32ff1969d90aaa5a8ed2260968a8e2bac2d1cae597c906f90495f1dc5de7f8d3","up":true},{"one":"cc3397e9e11f75273d3f81d91f980f4504755f80b27a183212de56cc5085e58d","other":"d3e913cf4a7dabfb5699131b65e533a40adb46ea37e0ed4ce9433f99015986ef","up":true},{"one":"837f0993f6374039a5ad4472d6313e647a4c5db4583bd27ccfa98d3448a17731","other":"398038811c1c7402fe2e6994c9ce2f15c8166b8e99f379feaaed66ac87702062","up":true},{"one":"7895b2cb97b473f8893cc70a4421e0f8be1c033b27cd730fa13438b7a8f3fcb5","other":"f305273a7d08e72f69b0b153855e822f252cbbf34a18f305134eed9d1eb7b58a","up":true},{"one":"9257dc934dfbf17473b70cb85333c6fab67ee9b6228a646576c4f57253f1004e","other":"a9700308516c02cf9aea8809000a4e0596d6b44753e10bd0928df83e2eb9b9e7","up":true},{"one":"56635699bd3bc78193adbdb8e8b7c2c91dab4140fdaa506fea2300ee86c4ba81","other":"bea10868d5da506c1801de845c148c2f09761893113ac913fe66674a8f43c178","up":true},{"one":"19ea0a685fc4edd298b736dc7a778c9ec4362de378876911105fa9ba2ce90204","other":"b659418885032905ea20ad47d70470e403e7e407e0e9ebf9277f9a2d81ec121c","up":true},{"one":"e2770cef7c1ad312b70d94ca5570e45f324c798a31a93203f505167aeab122b6","other":"51440ab47fc5076c00cad16a542b846c26b3281ecea4dbca795ae9b80183ec90","up":true},{"one":"244c3c954ac612e51d4945ab9b77f0b4a3983285e8add7921777e0c45a1bf338","other":"1b1dc3f9312df141855c545dd16aee325f9a609230ec6165bdbbb07d0c0862f6","up":true},{"one":"8b4318f86ad47976321af97bfbf95cd0a3b0aa22447aeb0611ed1a9bf1e6a4bf","other":"cc3397e9e11f75273d3f81d91f980f4504755f80b27a183212de56cc5085e58d","up":true},{"one":"9959385385aade728d3f5763806596222bc1e7b9946c2c92407943d080b32f8d","other":"a8ff8d69dcb36462d1116dafa5e3d0c7237bf65dbece482a316862c8d66e35b6","up":true},{"one":"025de1d2ec529d3a7da302eef0f8c54996616d40c940c0956d470ffc2a007f33","other":"14849f811af20ce19fb29417d20c15fc16da1e45aebdf795a2c6ccb671e4bdac","up":true},{"one":"5ac0d00b8d647dec62d26e1a689fd05b8b7a1a79ab8c43493bd6d7d209816df1","other":"26acc3c373c29150af30bbc9264d0c44c7c606ff7377399ddf844635e97afcfa","up":true},{"one":"70f68562733da4e3b1c3949fb6e11ac0bdd49ea7e732925f937f87df5af698d6","other":"0d1c35c6ea485cb33857b790ee262f974cf0d54cf8ce3003f8308ac2e87c2c25","up":true},{"one":"b4a1b687fbdb754fd689e26f0870a7dcab5d76190c06f3ea2ea1e198f8aa5ab2","other":"d700d96de1193456dc0bcf492c7c11b0951062974af2f7f47b8c901b17c23165","up":true},{"one":"34118166845c185d15c286b7e5433539ee98ed634baabd534d57369fd5f7c681","other":"bea10868d5da506c1801de845c148c2f09761893113ac913fe66674a8f43c178","up":true},{"one":"43d43e9ebcbceb4830fc1d2d5024650b90698306bbd2c4d0b4841a1a8fd09c93","other":"a742e8502c619703ce87890110f908bde32b59dc61d77a247759e5d0056e0c94","up":true},{"one":"aeb45fe10b0dbd0f72ab6a77fbf971a8f46dbcdd96c08f23279d1434b4f38b1d","other":"648a96d61898eb2d336ff7d5a229cfeb7b9f587282e40f9fe640e181ae26bdd3","up":true},{"one":"32ff1969d90aaa5a8ed2260968a8e2bac2d1cae597c906f90495f1dc5de7f8d3","other":"f7561cb6740e17ec7c7d17068251b2c951d954c77804aa5af60464e9c3964e57","up":true},{"one":"178401ec8d01a0a4f551d23e880a8e8a4eb87773565363843d51cf52660b1211","other":"a9700308516c02cf9aea8809000a4e0596d6b44753e10bd0928df83e2eb9b9e7","up":true},{"one":"4b79e83186f2ab05932eaa99982a2e53373b83780e32d224d15cb2c85462451f","other":"7660828fb0c8f89201d34e6f4d61cc6ba9a30cead6e4eb8253f6cc92e1845f23","up":true},{"one":"24f80c437be45898e594f821bba0f5c62e0c9a0c720118e362ee6f78410612bd","other":"68cbc4a5313080d5dca8ad34e8bf52a6144e0ff8ef3f795d7ae9d5f644fe2042","up":true},{"one":"5a26ae73eebf27f6dbec2414f1277a249e814a7a06790d7061610e5227b086f6","other":"46bfa8bea56b0be1abfa5ad3561bb6bf49ed6695d83ee2b2c192c5a0408347cf","up":true},{"one":"8402bd62282811ed236b2fa1f0d41ad4bbe54e420ee34adc6164cfd4baf8658d","other":"4b79e83186f2ab05932eaa99982a2e53373b83780e32d224d15cb2c85462451f","up":true},{"one":"eb686a686fd70e41659cc69ec0db53d1512dfec238918afd0a515d8ce177d4d9","other":"741a854ae299df49a738725bc58abe614e5e4302ffecd8320bbede8412d160c0","up":true},{"one":"08bd1e049859b4a7c8078ca9741fe3daa668b9fe478da06d1a435cd5566b3e11","other":"4b79e83186f2ab05932eaa99982a2e53373b83780e32d224d15cb2c85462451f","up":true},{"one":"8ea2c8acc111f38d5b4a5ed60252ee83f312d0f8359265d5b9266d54735052fe","other":"70f68562733da4e3b1c3949fb6e11ac0bdd49ea7e732925f937f87df5af698d6","up":true},{"one":"44adaabf9c46608a374ed816d3c40c63b6645f4f6e033a76431bc8f88713eb41","other":"7660828fb0c8f89201d34e6f4d61cc6ba9a30cead6e4eb8253f6cc92e1845f23","up":true},{"one":"c53417f008e4550e1c4cb9a3e2955b3af6403e059b7b4b4c33869d9ed4a580a5","other":"e2d36f335d90ad63148db8e353a78a30d8d9c0abe107be2cf8685f6a01ce74b9","up":true},{"one":"68cbc4a5313080d5dca8ad34e8bf52a6144e0ff8ef3f795d7ae9d5f644fe2042","other":"955da15edae50a4c68bc8c579b9799d55f41b7c2a6178f645f79d772e0116662","up":true},{"one":"a1c85ee75edb807a01f4ce930086c948918aade324752609b078c28991c04e86","other":"9f7d72b7d9843872904b841e421985082428fba5010db27dd871ed76630a1e1d","up":true},{"one":"6d3c6db15900f2596286f81cc0664d2c8291ead5bad2aa35bad515af088a2e48","other":"955da15edae50a4c68bc8c579b9799d55f41b7c2a6178f645f79d772e0116662","up":true},{"one":"26ab9c813822dbb4f1a230cd8e99e8ab280b242747deb55fdf93d160906ef331","other":"48d79ac55f8df512af8e7d868aa40ac9b61493fa4f1b0ce0b76bf6da2eb30e78","up":true},{"one":"a9700308516c02cf9aea8809000a4e0596d6b44753e10bd0928df83e2eb9b9e7","other":"8402bd62282811ed236b2fa1f0d41ad4bbe54e420ee34adc6164cfd4baf8658d","up":true},{"one":"0d1c35c6ea485cb33857b790ee262f974cf0d54cf8ce3003f8308ac2e87c2c25","other":"e09f98114da64e7547b351637190f6621a1f75568cfa9960980fc77618f8855b","up":true},{"one":"b3f95f225e2b6b76e6c7ef7c86caf83e35213f6a22da41e653ca1c190be23c9c","other":"da36d1df95a158b0d3f9e7407d663a6b611dde0a77f00a584b97a939ab6a00de","up":true},{"one":"1049d321a450726cf39d1d7cea1c108be3bec137a644b62cdc73a853f5a5a22b","other":"f645aab9cb2bd2709998b38e5789c9c5f68d40765e6cbd93b92e6383eb671dba","up":true},{"one":"1addd4a9f01486212e13e43a9650b7f793617d1cb59fb8d941270d7ae55f575f","other":"6c0142984d629ae6995894de9e7e5eb8d3fe45e1641d7ebd63959d2e61548ba3","up":true},{"one":"9ec831d97418916fd9695465e041caf27824dbb51d6ff74d6b70f3bd561e70e6","other":"59876e7ff9e92243856dad23126e1d38d9a5ddae79772ed1b2bdb91f33a4a4b5","up":true},{"one":"d95965e449dd4069876384cf4b34f986731e255a7948f0a862d229b1dddbc502","other":"3c5b2e125020c80e3674df9cac34de4d8f3a94ee02556fb557921b6d5498b933","up":true},{"one":"1dc0ef1ce68dc681298177bde808af514efa52a5ad38c9cd2bd61968cdf19cfb","other":"86d6f68ec0b8e1b3406943787f918bee74dd1827998bdb13ece8f690da2d296a","up":true},{"one":"84a9db7645c792dc38c1f2113a8f0590d04e1c94d9a8c464ab0ec8219303d966","other":"8cc3fb39009d0adc26fca1e2ee96822d168d4debc379fd516c15d4b4a1624231","up":true},{"one":"4a95d49f58057b039b55a34f67a348c052f61770065e41243ff055efc570a935","other":"48f1ca6d433019f932fa4ae03e0decbcbea3fe635edff4458a669b83f8162b9a","up":true},{"one":"0e3b7722f3f84d83b3d744bea4e893715a01d4df3cf4a1c6a6823a1f5c9ad6b8","other":"3728152c88f1e5e61f6523b09e8f3bb1023b700deccdca5fcc1e6488136b0e57","up":true},{"one":"80d7e892bbb26808abb1d1530077fec6b08768c151a9f220881da3c862bae0af","other":"eff2450bea797ff66d93e7c1c1b0977cddf3abba64bfa51bcc509d728569e2fa","up":true},{"one":"08f84878e44fed2adb4b2685b9f293dc3c73d5f9bc1c474870d943ec2ae73dbe","other":"012ba278d582691241875c4c14ead91fff3983e190df7d9b43ade384e84c11fb","up":true},{"one":"a8b58013ff911871d1aa6c2bbea6c2e6ef9b00b87b80a41dc04724ad0488e2ff","other":"c8ea4177420785926e0929701f5e74c744920386f2a43b89d83c8281106cb95e","up":true},{"one":"1fd0192df1fbf33771ca575afbb4e27c6541cce4a3cff2dfc1f2c085e7fab79e","other":"eb686a686fd70e41659cc69ec0db53d1512dfec238918afd0a515d8ce177d4d9","up":true},{"one":"3c5b2e125020c80e3674df9cac34de4d8f3a94ee02556fb557921b6d5498b933","other":"447a411c80fbd422bfa0c358d3f2a1fe6256c05e35acc6350958dfbe62cd5b9b","up":true},{"one":"5c7c15798e86fe794bb201614d46366ea96dc51091f5b19f149995e0d40df0a6","other":"138dbc1662c4ce9b2b30ef5035914cc70465666fe18f313318e662d13f099621","up":true},{"one":"ff75b19017c84128f38dec4f63e1f247a5691dc0fae186e667afedb5fe9d2c80","other":"951877b34ee1535b5059c49beb03e8960ff9c12b694ef64708c77c30ff1dc706","up":true},{"one":"5c373034770e413e700b1cd03b2035f769ecd9ab8eb54d32f7b2645be1991fe5","other":"138dbc1662c4ce9b2b30ef5035914cc70465666fe18f313318e662d13f099621","up":true},{"one":"951877b34ee1535b5059c49beb03e8960ff9c12b694ef64708c77c30ff1dc706","other":"9c8e1f23f260c5a46b0001572675b19e5293ca65e7fdfc131c07612e9c4072fa","up":true},{"one":"e8676d17966625c4fdac6bd9437981a0cf869c8b0010812edf0c79805e0e1ff1","other":"c603138e40fe2f85cc634017956ada6399fca99969e3bf0c1ee8428374e779f1","up":true},{"one":"c603138e40fe2f85cc634017956ada6399fca99969e3bf0c1ee8428374e779f1","other":"a0c88ba70599b0e72c18fa6aedd14d607cca3e9a49a5d50165d084e70328c2dd","up":true},{"one":"012ba278d582691241875c4c14ead91fff3983e190df7d9b43ade384e84c11fb","other":"eb686a686fd70e41659cc69ec0db53d1512dfec238918afd0a515d8ce177d4d9","up":true},{"one":"741a854ae299df49a738725bc58abe614e5e4302ffecd8320bbede8412d160c0","other":"012ba278d582691241875c4c14ead91fff3983e190df7d9b43ade384e84c11fb","up":true},{"one":"48f1ca6d433019f932fa4ae03e0decbcbea3fe635edff4458a669b83f8162b9a","other":"025de1d2ec529d3a7da302eef0f8c54996616d40c940c0956d470ffc2a007f33","up":true},{"one":"59876e7ff9e92243856dad23126e1d38d9a5ddae79772ed1b2bdb91f33a4a4b5","other":"70f68562733da4e3b1c3949fb6e11ac0bdd49ea7e732925f937f87df5af698d6","up":true},{"one":"e6812448728b4bda5962adceb1707b29f661d3d1a6b2ccd5f8183c9a1f4d01b6","other":"741a854ae299df49a738725bc58abe614e5e4302ffecd8320bbede8412d160c0","up":true},{"one":"7660828fb0c8f89201d34e6f4d61cc6ba9a30cead6e4eb8253f6cc92e1845f23","other":"012ba278d582691241875c4c14ead91fff3983e190df7d9b43ade384e84c11fb","up":true},{"one":"0111e720a84b310f863c2530fbe149e6a221acbad01065c5d052d2b3e1716f54","other":"1addd4a9f01486212e13e43a9650b7f793617d1cb59fb8d941270d7ae55f575f","up":true},{"one":"14849f811af20ce19fb29417d20c15fc16da1e45aebdf795a2c6ccb671e4bdac","other":"741a854ae299df49a738725bc58abe614e5e4302ffecd8320bbede8412d160c0","up":true},{"one":"da36d1df95a158b0d3f9e7407d663a6b611dde0a77f00a584b97a939ab6a00de","other":"ff75b19017c84128f38dec4f63e1f247a5691dc0fae186e667afedb5fe9d2c80","up":true},{"one":"9464ad8da1a5effdc0351742dfffae941ffd9fab469637b2491caece53c57dc8","other":"a9700308516c02cf9aea8809000a4e0596d6b44753e10bd0928df83e2eb9b9e7","up":true},{"one":"43d43e9ebcbceb4830fc1d2d5024650b90698306bbd2c4d0b4841a1a8fd09c93","other":"6dd3ac0fd9a04a2ce75875c683d135e52eaa1670cb55e78711620712e60fde47","up":true},{"one":"50c1a8023bfecffb09472fdc50898f4d050a31443d40a6c07b629090beb0df3d","other":"c42e6492879439eeecd9938d17ff283fd8f5f24206906ca512b4daa4803b78b4","up":true},{"one":"5ac0d00b8d647dec62d26e1a689fd05b8b7a1a79ab8c43493bd6d7d209816df1","other":"56ca9dd846a58a0ffa7b49a88aad559a338ba535a6f738468b8f146c97890cb2","up":true},{"one":"244c3c954ac612e51d4945ab9b77f0b4a3983285e8add7921777e0c45a1bf338","other":"fc3911383f74a982f6af8ab95a63426b56117d45f153b3c1441459d9191daaff","up":true},{"one":"482ec3dc05460579ea9bce87677bd3d9a1930e801fabeba607b8ab6b8729ff15","other":"d408bb6f7af1590e1f162ce02cc016b1b86ede29851caa32434212ffa2a377c8","up":true},{"one":"1dec77c2f4caf053c2d0524ae34a2d970bf4743a0d009d8fc543077ddfdfe3d0","other":"3c5b2e125020c80e3674df9cac34de4d8f3a94ee02556fb557921b6d5498b933","up":true},{"one":"31e670638acba3d58f4c67f3ff2f3f25d769e8a5d7a7838927f4d9d169a84404","other":"6b4ee1b73942ced78f97c0d0e221209933e63ae7353bb9ab3d37ac4127592e86","up":true},{"one":"93c0e1adf23fdf1623359eb88c517bc521d5a26325554df890cc04c1fa17a5df","other":"48d79ac55f8df512af8e7d868aa40ac9b61493fa4f1b0ce0b76bf6da2eb30e78","up":true},{"one":"50c1a8023bfecffb09472fdc50898f4d050a31443d40a6c07b629090beb0df3d","other":"c272b12f4020ae5b20e3d29cd09de03fa0088e3eeb5f07aa7728b29a3e90e687","up":true},{"one":"a606c79a018a6535375d851fcc82c42cc7c952720aa120434cedccf4a4be1f59","other":"93ea8ef251fd56b159e080cdf733d33e1fdfb3c7ae5bd9a6a328d0bf5458867b","up":true},{"one":"f9ded7b83e473e71be2fc0101d574c44521c96f77f9f84a384785a3af6b1093d","other":"885427318634c458a3050f2f26eb52454a75cea4a1263b9ed55e6eb899743854","up":true},{"one":"50c1a8023bfecffb09472fdc50898f4d050a31443d40a6c07b629090beb0df3d","other":"ef99b6cdc05345a1ee82267890e3ccaeef1f2bd2fe7ae8b02b6b20b9a5ef85bb","up":true},{"one":"bbafac5ba5915db3c80e28b249cad260b9b5dad1f728063c48fa8f61d7556e17","other":"a742e8502c619703ce87890110f908bde32b59dc61d77a247759e5d0056e0c94","up":true},{"one":"1fd0192df1fbf33771ca575afbb4e27c6541cce4a3cff2dfc1f2c085e7fab79e","other":"7ce7fec833a2e8c7720fcc97f820f2ca2aca85388210f887c3efe78b020766e7","up":true},{"one":"9ec831d97418916fd9695465e041caf27824dbb51d6ff74d6b70f3bd561e70e6","other":"50c1a8023bfecffb09472fdc50898f4d050a31443d40a6c07b629090beb0df3d","up":true},{"one":"51440ab47fc5076c00cad16a542b846c26b3281ecea4dbca795ae9b80183ec90","other":"36b93656cab02213fa76124af6251109356abc5e0ae5dd1e203c6a013e014548","up":true},{"one":"648a96d61898eb2d336ff7d5a229cfeb7b9f587282e40f9fe640e181ae26bdd3","other":"36b93656cab02213fa76124af6251109356abc5e0ae5dd1e203c6a013e014548","up":true},{"one":"67909bdcaef2330ef120e524c76e1e382b474f3332d86f65282028e051f34c75","other":"1dc0ef1ce68dc681298177bde808af514efa52a5ad38c9cd2bd61968cdf19cfb","up":true},{"one":"4005fd1fa8fbb318b29a62c368ada579e5122ca0578e6a75c509552be4b63b76","other":"08f84878e44fed2adb4b2685b9f293dc3c73d5f9bc1c474870d943ec2ae73dbe","up":true},{"one":"08e5a268f397385c69a7fec855ae4d889cfa98afef5b7c09fc4841e3f8894ad8","other":"9c8e1f23f260c5a46b0001572675b19e5293ca65e7fdfc131c07612e9c4072fa","up":true},{"one":"9ec831d97418916fd9695465e041caf27824dbb51d6ff74d6b70f3bd561e70e6","other":"cf52b3fc82ec24c3e9b40488d7c5f7ac8af731d159a103619bee932ec74d5e92","up":true},{"one":"09b3fa30780931e18b92c75d1cdeafa365609c565e4e8c253d393835cb82d98e","other":"435d721a568eb906a03c69dbd71337251a550521a4004ab5d4a7deb6f317061a","up":true},{"one":"6c0142984d629ae6995894de9e7e5eb8d3fe45e1641d7ebd63959d2e61548ba3","other":"52a8747e4ea35f6f50c72d7c481616f68a5e4396248332b8ff69d3a772de49ac","up":true},{"one":"5814be13c8550b9a5a83d08e7af6022002a8fdaa38ba6c2c30be58099a9f7744","other":"e0a0ba7e7e89a7af805e24abde1a5a5b489ba197585051a8755e8c2345c3d57b","up":true},{"one":"398038811c1c7402fe2e6994c9ce2f15c8166b8e99f379feaaed66ac87702062","other":"0e2b48558ce2af1fbfee38a557d56072e3091cfcaee8d7847c7c9dcf7bef9bfa","up":true},{"one":"a6165a4b02d58be116892982c0ed3d49d86fec0e9f436a516b61868331ed853f","other":"1fd0192df1fbf33771ca575afbb4e27c6541cce4a3cff2dfc1f2c085e7fab79e","up":true},{"one":"679554b410e415cfcdf1b14ef87759269b2bcaf07f4541122977db3a40091da2","other":"eff2450bea797ff66d93e7c1c1b0977cddf3abba64bfa51bcc509d728569e2fa","up":true},{"one":"9ca1fd5d41975acb905f337997922849b4070360e47849bb4fd8cd1b9ddb4d73","other":"80735a728720bba0ac08daaccd093370d672a8f9a50845ad78ccd6cf8686c39f","up":true},{"one":"0e2b48558ce2af1fbfee38a557d56072e3091cfcaee8d7847c7c9dcf7bef9bfa","other":"48de553e15afd3e8a46bfc3a5ba8a298158aa3d60f140d2730230af5cce8084d","up":true},{"one":"2e65d05648b798fafbc9bb582c05e6f8f891131260e8c90ca725ddcbc823f315","other":"feb3bc17ee7369a4fa9889d9250fed3c1257c70916871996e6eabd374dd8dc2e","up":true},{"one":"67f383e5334e9b6701d1dbb20876d4ba9a7e578af0476caed4a7e1b701f2bedb","other":"7e47a2f82984a600c8583605a91d5cb8f2d9a18961845e9c422edd78e20ac3a3","up":true},{"one":"9c8e1f23f260c5a46b0001572675b19e5293ca65e7fdfc131c07612e9c4072fa","other":"e8676d17966625c4fdac6bd9437981a0cf869c8b0010812edf0c79805e0e1ff1","up":true},{"one":"67585dfd87a005bae9bffc2cccb83c69537247c74886b4fa52287f46c796bcb6","other":"31e670638acba3d58f4c67f3ff2f3f25d769e8a5d7a7838927f4d9d169a84404","up":true},{"one":"8358a74fc8d8e39ccc40b4d3a212b7a69a6a8f6afc25cff2c9c7b44bbaf9ec82","other":"c8ea4177420785926e0929701f5e74c744920386f2a43b89d83c8281106cb95e","up":true},{"one":"4cece9bc134bc2b09400c9f7f8a4df9270d2fe3c077c5e441fffc911fcf6f42e","other":"97daf2cbe03c80ce6c4dae39cd071dd93cb32ed245aa9aa77285e12296957ca3","up":true},{"one":"056152dd9dae85c426378d34acab8d6641da665d2f57359a27a0ff652f3f3d02","other":"793322608055d4873776a9a0a6c40b04379bfd2f289a8ad49a7dc456bc65f871","up":true},{"one":"1b1dc3f9312df141855c545dd16aee325f9a609230ec6165bdbbb07d0c0862f6","other":"5814be13c8550b9a5a83d08e7af6022002a8fdaa38ba6c2c30be58099a9f7744","up":true},{"one":"9f7d72b7d9843872904b841e421985082428fba5010db27dd871ed76630a1e1d","other":"bea10868d5da506c1801de845c148c2f09761893113ac913fe66674a8f43c178","up":true},{"one":"8006b080c78a0ab54fa1be75a939bee2334322fded6c3563de1596b17c36172c","other":"aceee75a260d45252060fe971eabd4bde25f912db4a3c6e47f4a09572fe01697","up":true},{"one":"eff2450bea797ff66d93e7c1c1b0977cddf3abba64bfa51bcc509d728569e2fa","other":"8006b080c78a0ab54fa1be75a939bee2334322fded6c3563de1596b17c36172c","up":true},{"one":"52a8747e4ea35f6f50c72d7c481616f68a5e4396248332b8ff69d3a772de49ac","other":"3c5b2e125020c80e3674df9cac34de4d8f3a94ee02556fb557921b6d5498b933","up":true},{"one":"e2d36f335d90ad63148db8e353a78a30d8d9c0abe107be2cf8685f6a01ce74b9","other":"0d1c35c6ea485cb33857b790ee262f974cf0d54cf8ce3003f8308ac2e87c2c25","up":true},{"one":"8862cd85d7039119b984f752a458ac0495ddea98c69fc1d1241db7873a712c11","other":"d95965e449dd4069876384cf4b34f986731e255a7948f0a862d229b1dddbc502","up":true},{"one":"807416cc70f02d481a188027f7932b48e8f7b5e8258f7e9623f3f6e2985d8f6a","other":"48d79ac55f8df512af8e7d868aa40ac9b61493fa4f1b0ce0b76bf6da2eb30e78","up":true},{"one":"aceee75a260d45252060fe971eabd4bde25f912db4a3c6e47f4a09572fe01697","other":"e2770cef7c1ad312b70d94ca5570e45f324c798a31a93203f505167aeab122b6","up":true},{"one":"81a5a07f92f813e85b501b0028e1caa6e6a6c7efa5195ecb693cd2d91d5132a0","other":"ff75b19017c84128f38dec4f63e1f247a5691dc0fae186e667afedb5fe9d2c80","up":true},{"one":"8e7b96d28edae711e1a4cee0d894e0bd92cdf410ba6f61713f7d9b0bee761d4c","other":"aeb45fe10b0dbd0f72ab6a77fbf971a8f46dbcdd96c08f23279d1434b4f38b1d","up":true},{"one":"a2a163ce2cb092b411c994cc5d5ef555d539d2dcf4e7e1aeb528d2216dc481e5","other":"7850f5ee5048959559b3af0f95689669b250fc3aa58bcc9544dca61ca9c9769c","up":true},{"one":"ab3ff955033c0a2615932faf85fd20090b9121c7edcc8e6f7ce4c4fde0a96b8a","other":"9959385385aade728d3f5763806596222bc1e7b9946c2c92407943d080b32f8d","up":true},{"one":"48b850974575ca57a3cc5f9a4cf5aafd8688cb32b993f69983ece63258ff876e","other":"807416cc70f02d481a188027f7932b48e8f7b5e8258f7e9623f3f6e2985d8f6a","up":true},{"one":"fa240411bc4f3e44dfca3faedd112c7743a67b522a910bc99696ef0b31732ee2","other":"8f9aa2cd33d18e7cb4494d11a7532c97eb4a1cae172b2165c26ae4ed24887c0d","up":true},{"one":"ab719e60a77ba5253f1690c920df9dd9f3a62071e9cce9d62e0001a522b3409e","other":"b3f95f225e2b6b76e6c7ef7c86caf83e35213f6a22da41e653ca1c190be23c9c","up":true},{"one":"7c7ca5a7522a04f62f2bebd6197a03d78f255d0175c3dfceb5d92b684365b2aa","other":"30feca631f06041cb14cead384dfaa5fffa6dc34b0cee54230efbe15e56a5884","up":true},{"one":"0e80db9dfa8ce29bedfb2de031622bef8829bee52771322b6a7efb47afe540e7","other":"955da15edae50a4c68bc8c579b9799d55f41b7c2a6178f645f79d772e0116662","up":true},{"one":"d9cf19895e015cb534d915aed83c0d26bf40a11244027812e17c3bec6e645a8e","other":"398038811c1c7402fe2e6994c9ce2f15c8166b8e99f379feaaed66ac87702062","up":true},{"one":"d20931ce3da972fd23ea306e5c604a1fbd9417ba02654c5cdbe278fe259f75d5","other":"8cc3fb39009d0adc26fca1e2ee96822d168d4debc379fd516c15d4b4a1624231","up":true},{"one":"c6a8220726243cceaa6f2cebdac857a05efe721323f0a064c7f85a8340d3da96","other":"e64d90760cd81e4f112bbf1432e76c82fa4173fd474b988f4096ce187363fd81","up":true},{"one":"a7a856a43293aa3004848a86f187e09343bd605e1a93e853a6f6b6b1031bd667","other":"244c3c954ac612e51d4945ab9b77f0b4a3983285e8add7921777e0c45a1bf338","up":true},{"one":"18e00a7e0f826a1aba3f8c0f533ed905f2eee607b697fff056ee7874d374adcd","other":"6d5ec591af4966ba024c6b2aeb45e0aab8aa1762f9cac30ce3934da529b738e9","up":true},{"one":"05949ec1a582fa70cab95c59e7c0d315583bf9fc320c60c35268931f21e90853","other":"885427318634c458a3050f2f26eb52454a75cea4a1263b9ed55e6eb899743854","up":true},{"one":"d3e913cf4a7dabfb5699131b65e533a40adb46ea37e0ed4ce9433f99015986ef","other":"c2d00c7d960174c0934129fdcec63525bfa728f78fb70b7c52036b772d6297ad","up":true},{"one":"194ea3e14dc5d99f98d15607dc4c405769f5a371acc22d41a62d0537d716be32","other":"be68267d77fb52424227267c665ca1193a010334cac057338aca77b49a4b94da","up":true},{"one":"46bfa8bea56b0be1abfa5ad3561bb6bf49ed6695d83ee2b2c192c5a0408347cf","other":"36b93656cab02213fa76124af6251109356abc5e0ae5dd1e203c6a013e014548","up":true},{"one":"4d381014783980b2f77f0d71160ad9e9d84672b576f4435ccdbae12752350c1c","other":"318828fa893a28cc0652d3f81d97c5b8e023e853685f5d3e65fde20689abcc5a","up":true},{"one":"c8c8a93779ec4d9ac40925e8208478a00ee27fc220ddd73d8774cf6bfa255c46","other":"885427318634c458a3050f2f26eb52454a75cea4a1263b9ed55e6eb899743854","up":true},{"one":"26acc3c373c29150af30bbc9264d0c44c7c606ff7377399ddf844635e97afcfa","other":"8f9aa2cd33d18e7cb4494d11a7532c97eb4a1cae172b2165c26ae4ed24887c0d","up":true},{"one":"feb3bc17ee7369a4fa9889d9250fed3c1257c70916871996e6eabd374dd8dc2e","other":"43d43e9ebcbceb4830fc1d2d5024650b90698306bbd2c4d0b4841a1a8fd09c93","up":true},{"one":"fa240411bc4f3e44dfca3faedd112c7743a67b522a910bc99696ef0b31732ee2","other":"b5eab4869b4cb65bdc1e5cab45c03016d202f9f5b668be50066451cfcf9ef299","up":true},{"one":"97daf2cbe03c80ce6c4dae39cd071dd93cb32ed245aa9aa77285e12296957ca3","other":"3cabd3a567fc4e6f8da66eb35d938fe1e9a7f2bdd2d36c4dc2d0e0e9149f5e56","up":true},{"one":"ed424d24d702520bf7cb5f6babbdc43a078435fb4a9884ed82a93d642839e127","other":"97daf2cbe03c80ce6c4dae39cd071dd93cb32ed245aa9aa77285e12296957ca3","up":true},{"one":"5d82a418629cfbe7c57105309319ad695a198626fe3571de213a12ddf62f7308","other":"ddb8be472c3d48dc4d3d112448e6c0c4a826a18af3f3b53fdfef8cd31053c75f","up":true},{"one":"2c8042517dfeaa01586e91e491dd4154fb24c0d84fedb0404b9d5136f60da1d9","other":"6dd3ac0fd9a04a2ce75875c683d135e52eaa1670cb55e78711620712e60fde47","up":true},{"one":"a742e8502c619703ce87890110f908bde32b59dc61d77a247759e5d0056e0c94","other":"8f9aa2cd33d18e7cb4494d11a7532c97eb4a1cae172b2165c26ae4ed24887c0d","up":true},{"one":"fc514c43c4eb5c62798458da5d622e9248a6e530e4288cd902019aa05c4374d8","other":"9b8e6bb3a7fe4dc65ac97404e546d8b777d068c94bc2355f4f1a510ad6c11905","up":true},{"one":"397a0a0e9fadcb571acd8981f5bfe8e059e707e0feae8a9c4c6bfe87bd39e66a","other":"ed424d24d702520bf7cb5f6babbdc43a078435fb4a9884ed82a93d642839e127","up":true},{"one":"2fd2f77d76cca480ac18e9af7a462f297db168c3370b3bc0e2c04aa006c4d037","other":"fc3911383f74a982f6af8ab95a63426b56117d45f153b3c1441459d9191daaff","up":true},{"one":"b6dffac4b4eb2974ed0ed241799f97d2e5d9be671e311266826d0dcfecfcc209","other":"2fd2f77d76cca480ac18e9af7a462f297db168c3370b3bc0e2c04aa006c4d037","up":true},{"one":"9f0e2bf8a962156c9e0a83c3d42ad3dc5ac5c3e508f24200bfb151aad4e395ff","other":"cd6c8b42a0b092f41e6925577c9de7d1bea17231bcb3d08f3d3cce9c6fdcf22d","up":true},{"one":"b8e1a8622c256ef29acd52df7b3ace50820fb1a147716165ff862fdc973a48cd","other":"8f9aa2cd33d18e7cb4494d11a7532c97eb4a1cae172b2165c26ae4ed24887c0d","up":true},{"one":"5ff09c6859736aad7a82a3bfb3f1a1a8b3c0d58f831863540d9c3013dd35745e","other":"a4ee49bb2caabb6b9448bcdff1fc3cc673a2db04eab9f5c62d1787f2c25990a0","up":true},{"one":"140dd212f2b193ee6a9d7fc14f7da321c7ef6fd367fb4f194924fd0ad5d135cc","other":"f8ff7440d6f4abb1c89496336843741ed53a544cedeeed71d8ebe0b08698438d","up":true},{"one":"4d9147e3bf98cb59a7648f616c0d7f713a8cf3b7d25e3115233ff5883128beab","other":"ed424d24d702520bf7cb5f6babbdc43a078435fb4a9884ed82a93d642839e127","up":true},{"one":"43c9e1571c460cb9f599fa8ed79ddd0f9c3a21fd2fa455e0603109c55012f76b","other":"a7a856a43293aa3004848a86f187e09343bd605e1a93e853a6f6b6b1031bd667","up":true},{"one":"5a8b84df651871fce72d11cb1c26c87ae4a0cc6b4c274d37e70532c94f27288e","other":"056152dd9dae85c426378d34acab8d6641da665d2f57359a27a0ff652f3f3d02","up":true},{"one":"6d5ec591af4966ba024c6b2aeb45e0aab8aa1762f9cac30ce3934da529b738e9","other":"97daf2cbe03c80ce6c4dae39cd071dd93cb32ed245aa9aa77285e12296957ca3","up":true},{"one":"2e65d05648b798fafbc9bb582c05e6f8f891131260e8c90ca725ddcbc823f315","other":"a32749dc4e134a4fbb038618c58a7c05bbbaa06f1436de3754341af86402581b","up":true},{"one":"b5eab4869b4cb65bdc1e5cab45c03016d202f9f5b668be50066451cfcf9ef299","other":"a32749dc4e134a4fbb038618c58a7c05bbbaa06f1436de3754341af86402581b","up":true},{"one":"793322608055d4873776a9a0a6c40b04379bfd2f289a8ad49a7dc456bc65f871","other":"dad08999cd2edc33cfdc59ea34c8adcd6a34eaa15f2e85b0622e9848b215c1d5","up":true},{"one":"435d721a568eb906a03c69dbd71337251a550521a4004ab5d4a7deb6f317061a","other":"31e670638acba3d58f4c67f3ff2f3f25d769e8a5d7a7838927f4d9d169a84404","up":true},{"one":"af02c2f471e96ab8defbd229215695b95e64f7c78b145b6793a238961f556fbf","other":"f2b49a2247c9c5e8f6f755834a37fe5c17f208f994878e14b7001e404f52e125","up":true},{"one":"80735a728720bba0ac08daaccd093370d672a8f9a50845ad78ccd6cf8686c39f","other":"d700d96de1193456dc0bcf492c7c11b0951062974af2f7f47b8c901b17c23165","up":true},{"one":"a5ac04d53b569e418ef5007961431155f2c226ee10157b30af71ea4836b08089","other":"c96146ee47ec7cd74551cf74f00213bc337d643c4327393f0e6848ecd4a0f8d3","up":true},{"one":"6dd3ac0fd9a04a2ce75875c683d135e52eaa1670cb55e78711620712e60fde47","other":"68cbc4a5313080d5dca8ad34e8bf52a6144e0ff8ef3f795d7ae9d5f644fe2042","up":true},{"one":"f2b49a2247c9c5e8f6f755834a37fe5c17f208f994878e14b7001e404f52e125","other":"56ca9dd846a58a0ffa7b49a88aad559a338ba535a6f738468b8f146c97890cb2","up":true},{"one":"a2a163ce2cb092b411c994cc5d5ef555d539d2dcf4e7e1aeb528d2216dc481e5","other":"5a8b84df651871fce72d11cb1c26c87ae4a0cc6b4c274d37e70532c94f27288e","up":true},{"one":"9b8e6bb3a7fe4dc65ac97404e546d8b777d068c94bc2355f4f1a510ad6c11905","other":"8e282b0f27d4fa56fe14cfeb69fac5a53e3d882c7778eb190653e2eab7c93fd2","up":true},{"one":"d700d96de1193456dc0bcf492c7c11b0951062974af2f7f47b8c901b17c23165","other":"fc3911383f74a982f6af8ab95a63426b56117d45f153b3c1441459d9191daaff","up":true},{"one":"d408bb6f7af1590e1f162ce02cc016b1b86ede29851caa32434212ffa2a377c8","other":"0e2b48558ce2af1fbfee38a557d56072e3091cfcaee8d7847c7c9dcf7bef9bfa","up":true},{"one":"f6c028d6a2b6408e90169151f4519b561ed183bd8925ed9a1702806f397666e7","other":"fc3911383f74a982f6af8ab95a63426b56117d45f153b3c1441459d9191daaff","up":true},{"one":"837f0993f6374039a5ad4472d6313e647a4c5db4583bd27ccfa98d3448a17731","other":"7850f5ee5048959559b3af0f95689669b250fc3aa58bcc9544dca61ca9c9769c","up":true},{"one":"994839e5f3a5b8b23aed84fb029413124af17804b79b0263ec6bfd5aec5dad78","other":"16868ec5d8f490ac73ea28b4e8fdda55ac149bb1aafb177545b54b84a5ad5367","up":true},{"one":"9ca1fd5d41975acb905f337997922849b4070360e47849bb4fd8cd1b9ddb4d73","other":"f6c028d6a2b6408e90169151f4519b561ed183bd8925ed9a1702806f397666e7","up":true},{"one":"0e2b48558ce2af1fbfee38a557d56072e3091cfcaee8d7847c7c9dcf7bef9bfa","other":"60c5647aed152609979366fb33dc8b28fc60736098ff68d232415889b43dfa58","up":true},{"one":"b4a1b687fbdb754fd689e26f0870a7dcab5d76190c06f3ea2ea1e198f8aa5ab2","other":"2fd2f77d76cca480ac18e9af7a462f297db168c3370b3bc0e2c04aa006c4d037","up":true},{"one":"8d192b11538072db750f71204e2e6adf9dc0508d9c5cf1eb457e4e996cd985bc","other":"fc3911383f74a982f6af8ab95a63426b56117d45f153b3c1441459d9191daaff","up":true},{"one":"447a411c80fbd422bfa0c358d3f2a1fe6256c05e35acc6350958dfbe62cd5b9b","other":"0111e720a84b310f863c2530fbe149e6a221acbad01065c5d052d2b3e1716f54","up":true},{"one":"7d162a11662585f8c38d88fb241623e67bacf90703065dae6c092b4b507d6543","other":"fa240411bc4f3e44dfca3faedd112c7743a67b522a910bc99696ef0b31732ee2","up":true},{"one":"9959385385aade728d3f5763806596222bc1e7b9946c2c92407943d080b32f8d","other":"8e282b0f27d4fa56fe14cfeb69fac5a53e3d882c7778eb190653e2eab7c93fd2","up":true},{"one":"8cc3fb39009d0adc26fca1e2ee96822d168d4debc379fd516c15d4b4a1624231","other":"402cf9d0bffa017ebea34ede11207f3366b3ea450c0428029129a8e8026abbe7","up":true},{"one":"c190f9d08c78ed6dffadaef36e77fe6aa96099e4453753b0cfc8ec542fa96b9d","other":"0e80db9dfa8ce29bedfb2de031622bef8829bee52771322b6a7efb47afe540e7","up":true},{"one":"2ddffddbf452f0c9268058a739f5757fb90281cbfd31bd6f760acc3392fec12a","other":"6dd3ac0fd9a04a2ce75875c683d135e52eaa1670cb55e78711620712e60fde47","up":true},{"one":"c74d801e85ac0fd8951480d107b41eddc5c92775614c4886b3f732fa3d1a791d","other":"3a628ef171c1f26fa0966eb89210be0a14305aae8bfed10f4ed9017698f40f4b","up":true},{"one":"885427318634c458a3050f2f26eb52454a75cea4a1263b9ed55e6eb899743854","other":"31e670638acba3d58f4c67f3ff2f3f25d769e8a5d7a7838927f4d9d169a84404","up":true},{"one":"c9c302de4afe7b4dcbb6f3e366ce747083f9dcd7d5c6a01b939da5cdc6ccc874","other":"f645aab9cb2bd2709998b38e5789c9c5f68d40765e6cbd93b92e6383eb671dba","up":true},{"one":"318828fa893a28cc0652d3f81d97c5b8e023e853685f5d3e65fde20689abcc5a","other":"a2a163ce2cb092b411c994cc5d5ef555d539d2dcf4e7e1aeb528d2216dc481e5","up":true},{"one":"7c464054ea7b6c9ea0c7d4c209769c92f294a9db2ca159b8ef168e310a1eac3a","other":"7850f5ee5048959559b3af0f95689669b250fc3aa58bcc9544dca61ca9c9769c","up":true},{"one":"b78fd21c063006e2e033d1d00fc21e1ad7ad7951bb5621cec9b56639745d65f9","other":"d9cf19895e015cb534d915aed83c0d26bf40a11244027812e17c3bec6e645a8e","up":true},{"one":"07f5d094a4b22e73cdd6c85452b3d928da9b4b16873824759cb7e8a622417fd5","other":"4d381014783980b2f77f0d71160ad9e9d84672b576f4435ccdbae12752350c1c","up":true},{"one":"86d6f68ec0b8e1b3406943787f918bee74dd1827998bdb13ece8f690da2d296a","other":"c8ea4177420785926e0929701f5e74c744920386f2a43b89d83c8281106cb95e","up":true},{"one":"c96146ee47ec7cd74551cf74f00213bc337d643c4327393f0e6848ecd4a0f8d3","other":"9f0e2bf8a962156c9e0a83c3d42ad3dc5ac5c3e508f24200bfb151aad4e395ff","up":true},{"one":"2a507f5cb921137a7225c9c4988a8514af0f7e3c442cb8bf2bb612dc522a7daf","other":"0111e720a84b310f863c2530fbe149e6a221acbad01065c5d052d2b3e1716f54","up":true},{"one":"3728152c88f1e5e61f6523b09e8f3bb1023b700deccdca5fcc1e6488136b0e57","other":"648a96d61898eb2d336ff7d5a229cfeb7b9f587282e40f9fe640e181ae26bdd3","up":true},{"one":"87a337622455ae65daf3ab2555cee8985e9aa14bac245545d985296060e4a8de","other":"a8b58013ff911871d1aa6c2bbea6c2e6ef9b00b87b80a41dc04724ad0488e2ff","up":true},{"one":"dbd4d90e3342ef837b8ecf5c6e490f7c409f419cf36b77162a87cb2cfb8ae33c","other":"834f14e9f325482adef62651ddf3685690dd5ebdd18014f2bd266b2143c290ff","up":true},{"one":"cd6c8b42a0b092f41e6925577c9de7d1bea17231bcb3d08f3d3cce9c6fdcf22d","other":"93ea8ef251fd56b159e080cdf733d33e1fdfb3c7ae5bd9a6a328d0bf5458867b","up":true},{"one":"a2e6c900511768c8c9947ab0fa2e73975cf2a4cec7fd15217abdba25c329317e","other":"af02c2f471e96ab8defbd229215695b95e64f7c78b145b6793a238961f556fbf","up":true},{"one":"a4ee49bb2caabb6b9448bcdff1fc3cc673a2db04eab9f5c62d1787f2c25990a0","other":"26acc3c373c29150af30bbc9264d0c44c7c606ff7377399ddf844635e97afcfa","up":true},{"one":"aaf051a087a92f874a3f6c7923015e4cffb4bb3ef381c977fd902f21e841d0f4","other":"c603138e40fe2f85cc634017956ada6399fca99969e3bf0c1ee8428374e779f1","up":true},{"one":"c8ea4177420785926e0929701f5e74c744920386f2a43b89d83c8281106cb95e","other":"ba911175d3aa3fcc266e2a5aa32fb706208b8a9b5021a5f37c0b85f547eb375d","up":true},{"one":"2c85f5361b2d5abcf799de50fe58b1ed2006ea18f75823748c33eb7e95b1cc39","other":"4005fd1fa8fbb318b29a62c368ada579e5122ca0578e6a75c509552be4b63b76","up":true},{"one":"48de553e15afd3e8a46bfc3a5ba8a298158aa3d60f140d2730230af5cce8084d","other":"fc514c43c4eb5c62798458da5d622e9248a6e530e4288cd902019aa05c4374d8","up":true},{"one":"a8ff8d69dcb36462d1116dafa5e3d0c7237bf65dbece482a316862c8d66e35b6","other":"fc514c43c4eb5c62798458da5d622e9248a6e530e4288cd902019aa05c4374d8","up":true},{"one":"30feca631f06041cb14cead384dfaa5fffa6dc34b0cee54230efbe15e56a5884","other":"7049e92a396311fbf2f4a55bb5bd2fe3f7bb3c1a63f41bb88eb800edd45ac6e5","up":true},{"one":"7e47a2f82984a600c8583605a91d5cb8f2d9a18961845e9c422edd78e20ac3a3","other":"3a628ef171c1f26fa0966eb89210be0a14305aae8bfed10f4ed9017698f40f4b","up":true},{"one":"1bd588263274543729d54529ae9e9bf4596db40649a1c2a3f73168d818f34b62","other":"a5ac04d53b569e418ef5007961431155f2c226ee10157b30af71ea4836b08089","up":true},{"one":"3b020c84fb60f59779324d451d9770d683e08133bbaa2d5762f61b8fd4b8d9fd","other":"2a507f5cb921137a7225c9c4988a8514af0f7e3c442cb8bf2bb612dc522a7daf","up":true},{"one":"298ae5d173c5360bc9ad5b492ed35de3b6e0cae868a34bfe6311a8ba5ea9877e","other":"67f383e5334e9b6701d1dbb20876d4ba9a7e578af0476caed4a7e1b701f2bedb","up":true},{"one":"031450ec20f353435b429b5fa64f616d07c9d586afabc7a2772e05ad5c88bf50","other":"e64d90760cd81e4f112bbf1432e76c82fa4173fd474b988f4096ce187363fd81","up":true},{"one":"402cf9d0bffa017ebea34ede11207f3366b3ea450c0428029129a8e8026abbe7","other":"e64d90760cd81e4f112bbf1432e76c82fa4173fd474b988f4096ce187363fd81","up":true},{"one":"8e282b0f27d4fa56fe14cfeb69fac5a53e3d882c7778eb190653e2eab7c93fd2","other":"ddb8be472c3d48dc4d3d112448e6c0c4a826a18af3f3b53fdfef8cd31053c75f","up":true},{"one":"194ea3e14dc5d99f98d15607dc4c405769f5a371acc22d41a62d0537d716be32","other":"95c0a351fb7aa6683280d159a7b808bfa63f63bff91a1c5936e973b2e5d3954f","up":true},{"one":"f645aab9cb2bd2709998b38e5789c9c5f68d40765e6cbd93b92e6383eb671dba","other":"fa240411bc4f3e44dfca3faedd112c7743a67b522a910bc99696ef0b31732ee2","up":true},{"one":"a3309f8b8bba4d8fbd7c6193d7671cb907b94e71155ef6138e0248682ff00e58","other":"402cf9d0bffa017ebea34ede11207f3366b3ea450c0428029129a8e8026abbe7","up":true},{"one":"d3022a46956e75bca85ba89d97b694a3a64f03ccc2d881ed0cd687d43d486925","other":"c6a8220726243cceaa6f2cebdac857a05efe721323f0a064c7f85a8340d3da96","up":true},{"one":"1049d321a450726cf39d1d7cea1c108be3bec137a644b62cdc73a853f5a5a22b","other":"af02c2f471e96ab8defbd229215695b95e64f7c78b145b6793a238961f556fbf","up":true},{"one":"398038811c1c7402fe2e6994c9ce2f15c8166b8e99f379feaaed66ac87702062","other":"16868ec5d8f490ac73ea28b4e8fdda55ac149bb1aafb177545b54b84a5ad5367","up":true},{"one":"8e282b0f27d4fa56fe14cfeb69fac5a53e3d882c7778eb190653e2eab7c93fd2","other":"c9c302de4afe7b4dcbb6f3e366ce747083f9dcd7d5c6a01b939da5cdc6ccc874","up":true},{"one":"8006b080c78a0ab54fa1be75a939bee2334322fded6c3563de1596b17c36172c","other":"8cc3fb39009d0adc26fca1e2ee96822d168d4debc379fd516c15d4b4a1624231","up":true},{"one":"d95965e449dd4069876384cf4b34f986731e255a7948f0a862d229b1dddbc502","other":"0111e720a84b310f863c2530fbe149e6a221acbad01065c5d052d2b3e1716f54","up":true},{"one":"8e7b96d28edae711e1a4cee0d894e0bd92cdf410ba6f61713f7d9b0bee761d4c","other":"8006b080c78a0ab54fa1be75a939bee2334322fded6c3563de1596b17c36172c","up":true},{"one":"679554b410e415cfcdf1b14ef87759269b2bcaf07f4541122977db3a40091da2","other":"1dec77c2f4caf053c2d0524ae34a2d970bf4743a0d009d8fc543077ddfdfe3d0","up":true},{"one":"8862cd85d7039119b984f752a458ac0495ddea98c69fc1d1241db7873a712c11","other":"e8676d17966625c4fdac6bd9437981a0cf869c8b0010812edf0c79805e0e1ff1","up":true},{"one":"140dd212f2b193ee6a9d7fc14f7da321c7ef6fd367fb4f194924fd0ad5d135cc","other":"c8c8a93779ec4d9ac40925e8208478a00ee27fc220ddd73d8774cf6bfa255c46","up":true},{"one":"aeb45fe10b0dbd0f72ab6a77fbf971a8f46dbcdd96c08f23279d1434b4f38b1d","other":"9c8e1f23f260c5a46b0001572675b19e5293ca65e7fdfc131c07612e9c4072fa","up":true},{"one":"aceee75a260d45252060fe971eabd4bde25f912db4a3c6e47f4a09572fe01697","other":"aeb45fe10b0dbd0f72ab6a77fbf971a8f46dbcdd96c08f23279d1434b4f38b1d","up":true},{"one":"5a26ae73eebf27f6dbec2414f1277a249e814a7a06790d7061610e5227b086f6","other":"51440ab47fc5076c00cad16a542b846c26b3281ecea4dbca795ae9b80183ec90","up":true},{"one":"eff2450bea797ff66d93e7c1c1b0977cddf3abba64bfa51bcc509d728569e2fa","other":"8e7b96d28edae711e1a4cee0d894e0bd92cdf410ba6f61713f7d9b0bee761d4c","up":true},{"one":"447a411c80fbd422bfa0c358d3f2a1fe6256c05e35acc6350958dfbe62cd5b9b","other":"031450ec20f353435b429b5fa64f616d07c9d586afabc7a2772e05ad5c88bf50","up":true},{"one":"1dc0ef1ce68dc681298177bde808af514efa52a5ad38c9cd2bd61968cdf19cfb","other":"d3e913cf4a7dabfb5699131b65e533a40adb46ea37e0ed4ce9433f99015986ef","up":true},{"one":"5c7c15798e86fe794bb201614d46366ea96dc51091f5b19f149995e0d40df0a6","other":"7ce7fec833a2e8c7720fcc97f820f2ca2aca85388210f887c3efe78b020766e7","up":true},{"one":"a1c85ee75edb807a01f4ce930086c948918aade324752609b078c28991c04e86","other":"9ca1fd5d41975acb905f337997922849b4070360e47849bb4fd8cd1b9ddb4d73","up":true},{"one":"5c373034770e413e700b1cd03b2035f769ecd9ab8eb54d32f7b2645be1991fe5","other":"7ce7fec833a2e8c7720fcc97f820f2ca2aca85388210f887c3efe78b020766e7","up":true},{"one":"035f15499cdb0f079b3e358ad54a6122681442a5293c3ae2fdf6c527004b36d2","other":"138dbc1662c4ce9b2b30ef5035914cc70465666fe18f313318e662d13f099621","up":true},{"one":"244c3c954ac612e51d4945ab9b77f0b4a3983285e8add7921777e0c45a1bf338","other":"34118166845c185d15c286b7e5433539ee98ed634baabd534d57369fd5f7c681","up":true},{"one":"a6165a4b02d58be116892982c0ed3d49d86fec0e9f436a516b61868331ed853f","other":"48b850974575ca57a3cc5f9a4cf5aafd8688cb32b993f69983ece63258ff876e","up":true},{"one":"14849f811af20ce19fb29417d20c15fc16da1e45aebdf795a2c6ccb671e4bdac","other":"1fd0192df1fbf33771ca575afbb4e27c6541cce4a3cff2dfc1f2c085e7fab79e","up":true},{"one":"741a854ae299df49a738725bc58abe614e5e4302ffecd8320bbede8412d160c0","other":"7660828fb0c8f89201d34e6f4d61cc6ba9a30cead6e4eb8253f6cc92e1845f23","up":true},{"one":"8402bd62282811ed236b2fa1f0d41ad4bbe54e420ee34adc6164cfd4baf8658d","other":"e6812448728b4bda5962adceb1707b29f661d3d1a6b2ccd5f8183c9a1f4d01b6","up":true},{"one":"08f84878e44fed2adb4b2685b9f293dc3c73d5f9bc1c474870d943ec2ae73dbe","other":"14849f811af20ce19fb29417d20c15fc16da1e45aebdf795a2c6ccb671e4bdac","up":true},{"one":"3a628ef171c1f26fa0966eb89210be0a14305aae8bfed10f4ed9017698f40f4b","other":"298ae5d173c5360bc9ad5b492ed35de3b6e0cae868a34bfe6311a8ba5ea9877e","up":true},{"one":"7660828fb0c8f89201d34e6f4d61cc6ba9a30cead6e4eb8253f6cc92e1845f23","other":"da36d1df95a158b0d3f9e7407d663a6b611dde0a77f00a584b97a939ab6a00de","up":true},{"one":"18e00a7e0f826a1aba3f8c0f533ed905f2eee607b697fff056ee7874d374adcd","other":"435d721a568eb906a03c69dbd71337251a550521a4004ab5d4a7deb6f317061a","up":true},{"one":"05949ec1a582fa70cab95c59e7c0d315583bf9fc320c60c35268931f21e90853","other":"97daf2cbe03c80ce6c4dae39cd071dd93cb32ed245aa9aa77285e12296957ca3","up":true},{"one":"e471efbcf1def3915b3dda2dc65a86945c607be54a33e31e9625549becac0e34","other":"c8ea4177420785926e0929701f5e74c744920386f2a43b89d83c8281106cb95e","up":true},{"one":"c74d801e85ac0fd8951480d107b41eddc5c92775614c4886b3f732fa3d1a791d","other":"d20931ce3da972fd23ea306e5c604a1fbd9417ba02654c5cdbe278fe259f75d5","up":true},{"one":"08bd1e049859b4a7c8078ca9741fe3daa668b9fe478da06d1a435cd5566b3e11","other":"14849f811af20ce19fb29417d20c15fc16da1e45aebdf795a2c6ccb671e4bdac","up":true},{"one":"8cc3fb39009d0adc26fca1e2ee96822d168d4debc379fd516c15d4b4a1624231","other":"1dec77c2f4caf053c2d0524ae34a2d970bf4743a0d009d8fc543077ddfdfe3d0","up":true},{"one":"012ba278d582691241875c4c14ead91fff3983e190df7d9b43ade384e84c11fb","other":"4b79e83186f2ab05932eaa99982a2e53373b83780e32d224d15cb2c85462451f","up":true},{"one":"a8ff8d69dcb36462d1116dafa5e3d0c7237bf65dbece482a316862c8d66e35b6","other":"d408bb6f7af1590e1f162ce02cc016b1b86ede29851caa32434212ffa2a377c8","up":true},{"one":"93ea8ef251fd56b159e080cdf733d33e1fdfb3c7ae5bd9a6a328d0bf5458867b","other":"a5ac04d53b569e418ef5007961431155f2c226ee10157b30af71ea4836b08089","up":true},{"one":"67f383e5334e9b6701d1dbb20876d4ba9a7e578af0476caed4a7e1b701f2bedb","other":"6d5ec591af4966ba024c6b2aeb45e0aab8aa1762f9cac30ce3934da529b738e9","up":true},{"one":"5a8b84df651871fce72d11cb1c26c87ae4a0cc6b4c274d37e70532c94f27288e","other":"1bd588263274543729d54529ae9e9bf4596db40649a1c2a3f73168d818f34b62","up":true},{"one":"6d5ec591af4966ba024c6b2aeb45e0aab8aa1762f9cac30ce3934da529b738e9","other":"ed424d24d702520bf7cb5f6babbdc43a078435fb4a9884ed82a93d642839e127","up":true},{"one":"435d721a568eb906a03c69dbd71337251a550521a4004ab5d4a7deb6f317061a","other":"31e129ab3df7e082cc27c649d9ee29a3ea646d6a97d2417875b80e3ff576c047","up":true},{"one":"c8c8a93779ec4d9ac40925e8208478a00ee27fc220ddd73d8774cf6bfa255c46","other":"f9ded7b83e473e71be2fc0101d574c44521c96f77f9f84a384785a3af6b1093d","up":true},{"one":"4d9147e3bf98cb59a7648f616c0d7f713a8cf3b7d25e3115233ff5883128beab","other":"95c0a351fb7aa6683280d159a7b808bfa63f63bff91a1c5936e973b2e5d3954f","up":true},{"one":"397a0a0e9fadcb571acd8981f5bfe8e059e707e0feae8a9c4c6bfe87bd39e66a","other":"be68267d77fb52424227267c665ca1193a010334cac057338aca77b49a4b94da","up":true},{"one":"09b3fa30780931e18b92c75d1cdeafa365609c565e4e8c253d393835cb82d98e","other":"7e47a2f82984a600c8583605a91d5cb8f2d9a18961845e9c422edd78e20ac3a3","up":true},{"one":"a5ac04d53b569e418ef5007961431155f2c226ee10157b30af71ea4836b08089","other":"dbd4d90e3342ef837b8ecf5c6e490f7c409f419cf36b77162a87cb2cfb8ae33c","up":true},{"one":"f8ff7440d6f4abb1c89496336843741ed53a544cedeeed71d8ebe0b08698438d","other":"e64d90760cd81e4f112bbf1432e76c82fa4173fd474b988f4096ce187363fd81","up":true},{"one":"3cabd3a567fc4e6f8da66eb35d938fe1e9a7f2bdd2d36c4dc2d0e0e9149f5e56","other":"194ea3e14dc5d99f98d15607dc4c405769f5a371acc22d41a62d0537d716be32","up":true},{"one":"81a5a07f92f813e85b501b0028e1caa6e6a6c7efa5195ecb693cd2d91d5132a0","other":"da36d1df95a158b0d3f9e7407d663a6b611dde0a77f00a584b97a939ab6a00de","up":true},{"one":"6c0142984d629ae6995894de9e7e5eb8d3fe45e1641d7ebd63959d2e61548ba3","other":"3c5b2e125020c80e3674df9cac34de4d8f3a94ee02556fb557921b6d5498b933","up":true},{"one":"4d381014783980b2f77f0d71160ad9e9d84672b576f4435ccdbae12752350c1c","other":"7c464054ea7b6c9ea0c7d4c209769c92f294a9db2ca159b8ef168e310a1eac3a","up":true},{"one":"48b850974575ca57a3cc5f9a4cf5aafd8688cb32b993f69983ece63258ff876e","other":"93c0e1adf23fdf1623359eb88c517bc521d5a26325554df890cc04c1fa17a5df","up":true},{"one":"97daf2cbe03c80ce6c4dae39cd071dd93cb32ed245aa9aa77285e12296957ca3","other":"31e670638acba3d58f4c67f3ff2f3f25d769e8a5d7a7838927f4d9d169a84404","up":true},{"one":"793322608055d4873776a9a0a6c40b04379bfd2f289a8ad49a7dc456bc65f871","other":"a5ac04d53b569e418ef5007961431155f2c226ee10157b30af71ea4836b08089","up":true},{"one":"0111e720a84b310f863c2530fbe149e6a221acbad01065c5d052d2b3e1716f54","other":"6c0142984d629ae6995894de9e7e5eb8d3fe45e1641d7ebd63959d2e61548ba3","up":true},{"one":"885427318634c458a3050f2f26eb52454a75cea4a1263b9ed55e6eb899743854","other":"31e129ab3df7e082cc27c649d9ee29a3ea646d6a97d2417875b80e3ff576c047","up":true},{"one":"46bfa8bea56b0be1abfa5ad3561bb6bf49ed6695d83ee2b2c192c5a0408347cf","other":"648a96d61898eb2d336ff7d5a229cfeb7b9f587282e40f9fe640e181ae26bdd3","up":true},{"one":"80d7e892bbb26808abb1d1530077fec6b08768c151a9f220881da3c862bae0af","other":"d20931ce3da972fd23ea306e5c604a1fbd9417ba02654c5cdbe278fe259f75d5","up":true},{"one":"32ff1969d90aaa5a8ed2260968a8e2bac2d1cae597c906f90495f1dc5de7f8d3","other":"f1ed9d45622ff974a1e396cd878b2deb89e31aa5d08da773423f292ae8dbcbb6","up":true},{"one":"51440ab47fc5076c00cad16a542b846c26b3281ecea4dbca795ae9b80183ec90","other":"3728152c88f1e5e61f6523b09e8f3bb1023b700deccdca5fcc1e6488136b0e57","up":true},{"one":"bfc711793830779f49aa59bc6f7a205ab4e6eae7abfdafbf3bb5a1163a778ab2","other":"95c0a351fb7aa6683280d159a7b808bfa63f63bff91a1c5936e973b2e5d3954f","up":true},{"one":"3f31ecaffaa6311c82c9a575bbc38d6bcb16630ac87e19d1853a64aa96c9dcde","other":"447cdbf1ff462aa67d6a46085b1a84fdc495a4142ab174c8e69b271b09732b4d","up":true},{"one":"834f14e9f325482adef62651ddf3685690dd5ebdd18014f2bd266b2143c290ff","other":"c96146ee47ec7cd74551cf74f00213bc337d643c4327393f0e6848ecd4a0f8d3","up":true},{"one":"e2770cef7c1ad312b70d94ca5570e45f324c798a31a93203f505167aeab122b6","other":"08e5a268f397385c69a7fec855ae4d889cfa98afef5b7c09fc4841e3f8894ad8","up":true},{"one":"86d6f68ec0b8e1b3406943787f918bee74dd1827998bdb13ece8f690da2d296a","other":"cc3397e9e11f75273d3f81d91f980f4504755f80b27a183212de56cc5085e58d","up":true},{"one":"eebd48b367cbfe94a37c0deb274a697e628074f9560b909e66229c5c76ce68eb","other":"6b4ee1b73942ced78f97c0d0e221209933e63ae7353bb9ab3d37ac4127592e86","up":true},{"one":"3728152c88f1e5e61f6523b09e8f3bb1023b700deccdca5fcc1e6488136b0e57","other":"08e5a268f397385c69a7fec855ae4d889cfa98afef5b7c09fc4841e3f8894ad8","up":true},{"one":"019109311d4888497aa194cce4a89b5ef243421cf0e7e7bb9115d086e1a1f7d7","other":"3f31ecaffaa6311c82c9a575bbc38d6bcb16630ac87e19d1853a64aa96c9dcde","up":true},{"one":"447cdbf1ff462aa67d6a46085b1a84fdc495a4142ab174c8e69b271b09732b4d","other":"834f14e9f325482adef62651ddf3685690dd5ebdd18014f2bd266b2143c290ff","up":true},{"one":"67585dfd87a005bae9bffc2cccb83c69537247c74886b4fa52287f46c796bcb6","other":"31e129ab3df7e082cc27c649d9ee29a3ea646d6a97d2417875b80e3ff576c047","up":true},{"one":"4cece9bc134bc2b09400c9f7f8a4df9270d2fe3c077c5e441fffc911fcf6f42e","other":"f9ded7b83e473e71be2fc0101d574c44521c96f77f9f84a384785a3af6b1093d","up":true},{"one":"6b4ee1b73942ced78f97c0d0e221209933e63ae7353bb9ab3d37ac4127592e86","other":"95c0a351fb7aa6683280d159a7b808bfa63f63bff91a1c5936e973b2e5d3954f","up":true},{"one":"31e129ab3df7e082cc27c649d9ee29a3ea646d6a97d2417875b80e3ff576c047","other":"0cfc7309afabceeb7d248714e972cf3987205324f5ab8d048d17bea5dc87369d","up":true},{"one":"ba911175d3aa3fcc266e2a5aa32fb706208b8a9b5021a5f37c0b85f547eb375d","other":"a8b58013ff911871d1aa6c2bbea6c2e6ef9b00b87b80a41dc04724ad0488e2ff","up":true},{"one":"f9ded7b83e473e71be2fc0101d574c44521c96f77f9f84a384785a3af6b1093d","other":"97daf2cbe03c80ce6c4dae39cd071dd93cb32ed245aa9aa77285e12296957ca3","up":true},{"one":"67909bdcaef2330ef120e524c76e1e382b474f3332d86f65282028e051f34c75","other":"cc3397e9e11f75273d3f81d91f980f4504755f80b27a183212de56cc5085e58d","up":true},{"one":"7895b2cb97b473f8893cc70a4421e0f8be1c033b27cd730fa13438b7a8f3fcb5","other":"f7561cb6740e17ec7c7d17068251b2c951d954c77804aa5af60464e9c3964e57","up":true},{"one":"046ca54165f0dd4d62fd7d8ee9e97c655db3d35f5452a0ccb0dffc79c047978c","other":"f1ed9d45622ff974a1e396cd878b2deb89e31aa5d08da773423f292ae8dbcbb6","up":true},{"one":"305162c472c71ddef2320b138102b67d1ce2b8bba79e2e587fc80e085c88e547","other":"6e7f1f3d65364399617a4d95fdd04f2ca9b007b2366943e7ba5acd4616a7a425","up":true},{"one":"52a8747e4ea35f6f50c72d7c481616f68a5e4396248332b8ff69d3a772de49ac","other":"0111e720a84b310f863c2530fbe149e6a221acbad01065c5d052d2b3e1716f54","up":true},{"one":"aaf051a087a92f874a3f6c7923015e4cffb4bb3ef381c977fd902f21e841d0f4","other":"e8676d17966625c4fdac6bd9437981a0cf869c8b0010812edf0c79805e0e1ff1","up":true},{"one":"3cabd3a567fc4e6f8da66eb35d938fe1e9a7f2bdd2d36c4dc2d0e0e9149f5e56","other":"31e129ab3df7e082cc27c649d9ee29a3ea646d6a97d2417875b80e3ff576c047","up":true},{"one":"0cfc7309afabceeb7d248714e972cf3987205324f5ab8d048d17bea5dc87369d","other":"6e7f1f3d65364399617a4d95fdd04f2ca9b007b2366943e7ba5acd4616a7a425","up":true},{"one":"36b93656cab02213fa76124af6251109356abc5e0ae5dd1e203c6a013e014548","other":"5a26ae73eebf27f6dbec2414f1277a249e814a7a06790d7061610e5227b086f6","up":true},{"one":"30feca631f06041cb14cead384dfaa5fffa6dc34b0cee54230efbe15e56a5884","other":"67909bdcaef2330ef120e524c76e1e382b474f3332d86f65282028e051f34c75","up":true},{"one":"094256812084c6052a2604149aa3aba2379c483bf4ec25162f6b43934942775a","other":"3938e6b2c095084dc9975a3e8649133557495d34ac6df874c6d929266e3ffe6f","up":true},{"one":"56635699bd3bc78193adbdb8e8b7c2c91dab4140fdaa506fea2300ee86c4ba81","other":"f7561cb6740e17ec7c7d17068251b2c951d954c77804aa5af60464e9c3964e57","up":true},{"one":"19ea0a685fc4edd298b736dc7a778c9ec4362de378876911105fa9ba2ce90204","other":"f7561cb6740e17ec7c7d17068251b2c951d954c77804aa5af60464e9c3964e57","up":true},{"one":"1070df5e904e3865085b0319a81761e59146494c689e7567efe7465fc819ae8b","other":"7895b2cb97b473f8893cc70a4421e0f8be1c033b27cd730fa13438b7a8f3fcb5","up":true},{"one":"dad08999cd2edc33cfdc59ea34c8adcd6a34eaa15f2e85b0622e9848b215c1d5","other":"a5053958f0cefcff1826bf02525fda98c4dc954cc38690f3c43ecbf0b2ad57af","up":true},{"one":"d3e913cf4a7dabfb5699131b65e533a40adb46ea37e0ed4ce9433f99015986ef","other":"807416cc70f02d481a188027f7932b48e8f7b5e8258f7e9623f3f6e2985d8f6a","up":true},{"one":"9c8e1f23f260c5a46b0001572675b19e5293ca65e7fdfc131c07612e9c4072fa","other":"a0c88ba70599b0e72c18fa6aedd14d607cca3e9a49a5d50165d084e70328c2dd","up":true},{"one":"16868ec5d8f490ac73ea28b4e8fdda55ac149bb1aafb177545b54b84a5ad5367","other":"f645aab9cb2bd2709998b38e5789c9c5f68d40765e6cbd93b92e6383eb671dba","up":true},{"one":"34118166845c185d15c286b7e5433539ee98ed634baabd534d57369fd5f7c681","other":"9f7d72b7d9843872904b841e421985082428fba5010db27dd871ed76630a1e1d","up":true},{"one":"07f5d094a4b22e73cdd6c85452b3d928da9b4b16873824759cb7e8a622417fd5","other":"096a8302b6f369c28ed9d47719a507ead8a3cc1ca4fa1e32318b7f97873955fe","up":true},{"one":"096a8302b6f369c28ed9d47719a507ead8a3cc1ca4fa1e32318b7f97873955fe","other":"447cdbf1ff462aa67d6a46085b1a84fdc495a4142ab174c8e69b271b09732b4d","up":true},{"one":"1049d321a450726cf39d1d7cea1c108be3bec137a644b62cdc73a853f5a5a22b","other":"26acc3c373c29150af30bbc9264d0c44c7c606ff7377399ddf844635e97afcfa","up":true},{"one":"a606c79a018a6535375d851fcc82c42cc7c952720aa120434cedccf4a4be1f59","other":"318828fa893a28cc0652d3f81d97c5b8e023e853685f5d3e65fde20689abcc5a","up":true},{"one":"1b1dc3f9312df141855c545dd16aee325f9a609230ec6165bdbbb07d0c0862f6","other":"56635699bd3bc78193adbdb8e8b7c2c91dab4140fdaa506fea2300ee86c4ba81","up":true},{"one":"398038811c1c7402fe2e6994c9ce2f15c8166b8e99f379feaaed66ac87702062","other":"fc514c43c4eb5c62798458da5d622e9248a6e530e4288cd902019aa05c4374d8","up":true},{"one":"a2e6c900511768c8c9947ab0fa2e73975cf2a4cec7fd15217abdba25c329317e","other":"d408bb6f7af1590e1f162ce02cc016b1b86ede29851caa32434212ffa2a377c8","up":true},{"one":"834f14e9f325482adef62651ddf3685690dd5ebdd18014f2bd266b2143c290ff","other":"cd6c8b42a0b092f41e6925577c9de7d1bea17231bcb3d08f3d3cce9c6fdcf22d","up":true},{"one":"eb686a686fd70e41659cc69ec0db53d1512dfec238918afd0a515d8ce177d4d9","other":"a9700308516c02cf9aea8809000a4e0596d6b44753e10bd0928df83e2eb9b9e7","up":true},{"one":"305162c472c71ddef2320b138102b67d1ce2b8bba79e2e587fc80e085c88e547","other":"056152dd9dae85c426378d34acab8d6641da665d2f57359a27a0ff652f3f3d02","up":true},{"one":"194ea3e14dc5d99f98d15607dc4c405769f5a371acc22d41a62d0537d716be32","other":"447cdbf1ff462aa67d6a46085b1a84fdc495a4142ab174c8e69b271b09732b4d","up":true},{"one":"dbd4d90e3342ef837b8ecf5c6e490f7c409f419cf36b77162a87cb2cfb8ae33c","other":"93ea8ef251fd56b159e080cdf733d33e1fdfb3c7ae5bd9a6a328d0bf5458867b","up":true},{"one":"bfc711793830779f49aa59bc6f7a205ab4e6eae7abfdafbf3bb5a1163a778ab2","other":"c96146ee47ec7cd74551cf74f00213bc337d643c4327393f0e6848ecd4a0f8d3","up":true},{"one":"3f31ecaffaa6311c82c9a575bbc38d6bcb16630ac87e19d1853a64aa96c9dcde","other":"07f5d094a4b22e73cdd6c85452b3d928da9b4b16873824759cb7e8a622417fd5","up":true},{"one":"5d82a418629cfbe7c57105309319ad695a198626fe3571de213a12ddf62f7308","other":"398038811c1c7402fe2e6994c9ce2f15c8166b8e99f379feaaed66ac87702062","up":true},{"one":"447cdbf1ff462aa67d6a46085b1a84fdc495a4142ab174c8e69b271b09732b4d","other":"6b4ee1b73942ced78f97c0d0e221209933e63ae7353bb9ab3d37ac4127592e86","up":true},{"one":"d9cf19895e015cb534d915aed83c0d26bf40a11244027812e17c3bec6e645a8e","other":"5d82a418629cfbe7c57105309319ad695a198626fe3571de213a12ddf62f7308","up":true},{"one":"be68267d77fb52424227267c665ca1193a010334cac057338aca77b49a4b94da","other":"a5053958f0cefcff1826bf02525fda98c4dc954cc38690f3c43ecbf0b2ad57af","up":true},{"one":"80d7e892bbb26808abb1d1530077fec6b08768c151a9f220881da3c862bae0af","other":"a3309f8b8bba4d8fbd7c6193d7671cb907b94e71155ef6138e0248682ff00e58","up":true},{"one":"ef99b6cdc05345a1ee82267890e3ccaeef1f2bd2fe7ae8b02b6b20b9a5ef85bb","other":"f7561cb6740e17ec7c7d17068251b2c951d954c77804aa5af60464e9c3964e57","up":true},{"one":"95c0a351fb7aa6683280d159a7b808bfa63f63bff91a1c5936e973b2e5d3954f","other":"834f14e9f325482adef62651ddf3685690dd5ebdd18014f2bd266b2143c290ff","up":true},{"one":"48de553e15afd3e8a46bfc3a5ba8a298158aa3d60f140d2730230af5cce8084d","other":"d9cf19895e015cb534d915aed83c0d26bf40a11244027812e17c3bec6e645a8e","up":true},{"one":"26ab9c813822dbb4f1a230cd8e99e8ab280b242747deb55fdf93d160906ef331","other":"eb686a686fd70e41659cc69ec0db53d1512dfec238918afd0a515d8ce177d4d9","up":true},{"one":"f1ed9d45622ff974a1e396cd878b2deb89e31aa5d08da773423f292ae8dbcbb6","other":"c42e6492879439eeecd9938d17ff283fd8f5f24206906ca512b4daa4803b78b4","up":true},{"one":"7850f5ee5048959559b3af0f95689669b250fc3aa58bcc9544dca61ca9c9769c","other":"398038811c1c7402fe2e6994c9ce2f15c8166b8e99f379feaaed66ac87702062","up":true},{"one":"0cfc7309afabceeb7d248714e972cf3987205324f5ab8d048d17bea5dc87369d","other":"447cdbf1ff462aa67d6a46085b1a84fdc495a4142ab174c8e69b271b09732b4d","up":true},{"one":"8358a74fc8d8e39ccc40b4d3a212b7a69a6a8f6afc25cff2c9c7b44bbaf9ec82","other":"86d6f68ec0b8e1b3406943787f918bee74dd1827998bdb13ece8f690da2d296a","up":true},{"one":"019109311d4888497aa194cce4a89b5ef243421cf0e7e7bb9115d086e1a1f7d7","other":"194ea3e14dc5d99f98d15607dc4c405769f5a371acc22d41a62d0537d716be32","up":true},{"one":"ab3ff955033c0a2615932faf85fd20090b9121c7edcc8e6f7ce4c4fde0a96b8a","other":"b78fd21c063006e2e033d1d00fc21e1ad7ad7951bb5621cec9b56639745d65f9","up":true},{"one":"08e5a268f397385c69a7fec855ae4d889cfa98afef5b7c09fc4841e3f8894ad8","other":"36b93656cab02213fa76124af6251109356abc5e0ae5dd1e203c6a013e014548","up":true},{"one":"26ab9c813822dbb4f1a230cd8e99e8ab280b242747deb55fdf93d160906ef331","other":"741a854ae299df49a738725bc58abe614e5e4302ffecd8320bbede8412d160c0","up":true},{"one":"fc3911383f74a982f6af8ab95a63426b56117d45f153b3c1441459d9191daaff","other":"1b1dc3f9312df141855c545dd16aee325f9a609230ec6165bdbbb07d0c0862f6","up":true},{"one":"a0c88ba70599b0e72c18fa6aedd14d607cca3e9a49a5d50165d084e70328c2dd","other":"e2770cef7c1ad312b70d94ca5570e45f324c798a31a93203f505167aeab122b6","up":true},{"one":"1addd4a9f01486212e13e43a9650b7f793617d1cb59fb8d941270d7ae55f575f","other":"447a411c80fbd422bfa0c358d3f2a1fe6256c05e35acc6350958dfbe62cd5b9b","up":true},{"one":"1dec77c2f4caf053c2d0524ae34a2d970bf4743a0d009d8fc543077ddfdfe3d0","other":"2a507f5cb921137a7225c9c4988a8514af0f7e3c442cb8bf2bb612dc522a7daf","up":true},{"one":"a2a163ce2cb092b411c994cc5d5ef555d539d2dcf4e7e1aeb528d2216dc481e5","other":"5d82a418629cfbe7c57105309319ad695a198626fe3571de213a12ddf62f7308","up":true},{"one":"eebd48b367cbfe94a37c0deb274a697e628074f9560b909e66229c5c76ce68eb","other":"447cdbf1ff462aa67d6a46085b1a84fdc495a4142ab174c8e69b271b09732b4d","up":true},{"one":"67909bdcaef2330ef120e524c76e1e382b474f3332d86f65282028e051f34c75","other":"c8ea4177420785926e0929701f5e74c744920386f2a43b89d83c8281106cb95e","up":true},{"one":"bcf85ecf421b871fca0247a7081188a8e2c08778b88ffad16db37ef024fec0fc","other":"50c1a8023bfecffb09472fdc50898f4d050a31443d40a6c07b629090beb0df3d","up":true},{"one":"3938e6b2c095084dc9975a3e8649133557495d34ac6df874c6d929266e3ffe6f","other":"50c1a8023bfecffb09472fdc50898f4d050a31443d40a6c07b629090beb0df3d","up":true},{"one":"1dec77c2f4caf053c2d0524ae34a2d970bf4743a0d009d8fc543077ddfdfe3d0","other":"eff2450bea797ff66d93e7c1c1b0977cddf3abba64bfa51bcc509d728569e2fa","up":true},{"one":"84a9db7645c792dc38c1f2113a8f0590d04e1c94d9a8c464ab0ec8219303d966","other":"80d7e892bbb26808abb1d1530077fec6b08768c151a9f220881da3c862bae0af","up":true},{"one":"ba911175d3aa3fcc266e2a5aa32fb706208b8a9b5021a5f37c0b85f547eb375d","other":"bdc5de01276157a0f3fc43a9cc3b41b2cacc8479118b75aec4ba9b2b7fa86d5e","up":true},{"one":"a3309f8b8bba4d8fbd7c6193d7671cb907b94e71155ef6138e0248682ff00e58","other":"447a411c80fbd422bfa0c358d3f2a1fe6256c05e35acc6350958dfbe62cd5b9b","up":true},{"one":"c603138e40fe2f85cc634017956ada6399fca99969e3bf0c1ee8428374e779f1","other":"e2770cef7c1ad312b70d94ca5570e45f324c798a31a93203f505167aeab122b6","up":true},{"one":"44adaabf9c46608a374ed816d3c40c63b6645f4f6e033a76431bc8f88713eb41","other":"648a96d61898eb2d336ff7d5a229cfeb7b9f587282e40f9fe640e181ae26bdd3","up":true},{"one":"4005fd1fa8fbb318b29a62c368ada579e5122ca0578e6a75c509552be4b63b76","other":"7660828fb0c8f89201d34e6f4d61cc6ba9a30cead6e4eb8253f6cc92e1845f23","up":true},{"one":"f305273a7d08e72f69b0b153855e822f252cbbf34a18f305134eed9d1eb7b58a","other":"32ff1969d90aaa5a8ed2260968a8e2bac2d1cae597c906f90495f1dc5de7f8d3","up":true},{"one":"da36d1df95a158b0d3f9e7407d663a6b611dde0a77f00a584b97a939ab6a00de","other":"4a95d49f58057b039b55a34f67a348c052f61770065e41243ff055efc570a935","up":true},{"one":"44adaabf9c46608a374ed816d3c40c63b6645f4f6e033a76431bc8f88713eb41","other":"51440ab47fc5076c00cad16a542b846c26b3281ecea4dbca795ae9b80183ec90","up":true},{"one":"5814be13c8550b9a5a83d08e7af6022002a8fdaa38ba6c2c30be58099a9f7744","other":"fc3911383f74a982f6af8ab95a63426b56117d45f153b3c1441459d9191daaff","up":true},{"one":"0e3b7722f3f84d83b3d744bea4e893715a01d4df3cf4a1c6a6823a1f5c9ad6b8","other":"08e5a268f397385c69a7fec855ae4d889cfa98afef5b7c09fc4841e3f8894ad8","up":true},{"one":"b659418885032905ea20ad47d70470e403e7e407e0e9ebf9277f9a2d81ec121c","other":"bcf85ecf421b871fca0247a7081188a8e2c08778b88ffad16db37ef024fec0fc","up":true},{"one":"30feca631f06041cb14cead384dfaa5fffa6dc34b0cee54230efbe15e56a5884","other":"1dc0ef1ce68dc681298177bde808af514efa52a5ad38c9cd2bd61968cdf19cfb","up":true},{"one":"1fd0192df1fbf33771ca575afbb4e27c6541cce4a3cff2dfc1f2c085e7fab79e","other":"025de1d2ec529d3a7da302eef0f8c54996616d40c940c0956d470ffc2a007f33","up":true},{"one":"aaf051a087a92f874a3f6c7923015e4cffb4bb3ef381c977fd902f21e841d0f4","other":"ff75b19017c84128f38dec4f63e1f247a5691dc0fae186e667afedb5fe9d2c80","up":true},{"one":"36b93656cab02213fa76124af6251109356abc5e0ae5dd1e203c6a013e014548","other":"7660828fb0c8f89201d34e6f4d61cc6ba9a30cead6e4eb8253f6cc92e1845f23","up":true},{"one":"b3f95f225e2b6b76e6c7ef7c86caf83e35213f6a22da41e653ca1c190be23c9c","other":"81a5a07f92f813e85b501b0028e1caa6e6a6c7efa5195ecb693cd2d91d5132a0","up":true},{"one":"f645aab9cb2bd2709998b38e5789c9c5f68d40765e6cbd93b92e6383eb671dba","other":"f2b49a2247c9c5e8f6f755834a37fe5c17f208f994878e14b7001e404f52e125","up":true},{"one":"a4ee49bb2caabb6b9448bcdff1fc3cc673a2db04eab9f5c62d1787f2c25990a0","other":"7d162a11662585f8c38d88fb241623e67bacf90703065dae6c092b4b507d6543","up":true},{"one":"5ac0d00b8d647dec62d26e1a689fd05b8b7a1a79ab8c43493bd6d7d209816df1","other":"482ec3dc05460579ea9bce87677bd3d9a1930e801fabeba607b8ab6b8729ff15","up":true},{"one":"8ea2c8acc111f38d5b4a5ed60252ee83f312d0f8359265d5b9266d54735052fe","other":"30feca631f06041cb14cead384dfaa5fffa6dc34b0cee54230efbe15e56a5884","up":true},{"one":"cdb13873ac058861f295ebca5d958bf2bb793e3f9e274cf5a73a633425a9276f","other":"9ec831d97418916fd9695465e041caf27824dbb51d6ff74d6b70f3bd561e70e6","up":true},{"one":"70f68562733da4e3b1c3949fb6e11ac0bdd49ea7e732925f937f87df5af698d6","other":"553824ef701d3cd0191ae3a67de564ed0cf553e74bd60ed9de321f9302732ba6","up":true},{"one":"4005fd1fa8fbb318b29a62c368ada579e5122ca0578e6a75c509552be4b63b76","other":"4a95d49f58057b039b55a34f67a348c052f61770065e41243ff055efc570a935","up":true},{"one":"c6a8220726243cceaa6f2cebdac857a05efe721323f0a064c7f85a8340d3da96","other":"3a628ef171c1f26fa0966eb89210be0a14305aae8bfed10f4ed9017698f40f4b","up":true},{"one":"86d6f68ec0b8e1b3406943787f918bee74dd1827998bdb13ece8f690da2d296a","other":"8ea2c8acc111f38d5b4a5ed60252ee83f312d0f8359265d5b9266d54735052fe","up":true},{"one":"ff75b19017c84128f38dec4f63e1f247a5691dc0fae186e667afedb5fe9d2c80","other":"a0c88ba70599b0e72c18fa6aedd14d607cca3e9a49a5d50165d084e70328c2dd","up":true},{"one":"c53417f008e4550e1c4cb9a3e2955b3af6403e059b7b4b4c33869d9ed4a580a5","other":"e471efbcf1def3915b3dda2dc65a86945c607be54a33e31e9625549becac0e34","up":true},{"one":"18e00a7e0f826a1aba3f8c0f533ed905f2eee607b697fff056ee7874d374adcd","other":"3a628ef171c1f26fa0966eb89210be0a14305aae8bfed10f4ed9017698f40f4b","up":true},{"one":"05949ec1a582fa70cab95c59e7c0d315583bf9fc320c60c35268931f21e90853","other":"ed424d24d702520bf7cb5f6babbdc43a078435fb4a9884ed82a93d642839e127","up":true},{"one":"51440ab47fc5076c00cad16a542b846c26b3281ecea4dbca795ae9b80183ec90","other":"46bfa8bea56b0be1abfa5ad3561bb6bf49ed6695d83ee2b2c192c5a0408347cf","up":true},{"one":"cdb13873ac058861f295ebca5d958bf2bb793e3f9e274cf5a73a633425a9276f","other":"f215bc09268e60ebbec76f743bebd09d7e72d4cbeedc0b9d3417bb4a2ef42935","up":true},{"one":"b3f95f225e2b6b76e6c7ef7c86caf83e35213f6a22da41e653ca1c190be23c9c","other":"951877b34ee1535b5059c49beb03e8960ff9c12b694ef64708c77c30ff1dc706","up":true},{"one":"ff75b19017c84128f38dec4f63e1f247a5691dc0fae186e667afedb5fe9d2c80","other":"9c8e1f23f260c5a46b0001572675b19e5293ca65e7fdfc131c07612e9c4072fa","up":true},{"one":"1fd0192df1fbf33771ca575afbb4e27c6541cce4a3cff2dfc1f2c085e7fab79e","other":"e6812448728b4bda5962adceb1707b29f661d3d1a6b2ccd5f8183c9a1f4d01b6","up":true},{"one":"c53417f008e4550e1c4cb9a3e2955b3af6403e059b7b4b4c33869d9ed4a580a5","other":"e09f98114da64e7547b351637190f6621a1f75568cfa9960980fc77618f8855b","up":true},{"one":"3a628ef171c1f26fa0966eb89210be0a14305aae8bfed10f4ed9017698f40f4b","other":"2a507f5cb921137a7225c9c4988a8514af0f7e3c442cb8bf2bb612dc522a7daf","up":true},{"one":"298ae5d173c5360bc9ad5b492ed35de3b6e0cae868a34bfe6311a8ba5ea9877e","other":"447a411c80fbd422bfa0c358d3f2a1fe6256c05e35acc6350958dfbe62cd5b9b","up":true},{"one":"c74d801e85ac0fd8951480d107b41eddc5c92775614c4886b3f732fa3d1a791d","other":"eff2450bea797ff66d93e7c1c1b0977cddf3abba64bfa51bcc509d728569e2fa","up":true},{"one":"3c5b2e125020c80e3674df9cac34de4d8f3a94ee02556fb557921b6d5498b933","other":"2a507f5cb921137a7225c9c4988a8514af0f7e3c442cb8bf2bb612dc522a7daf","up":true},{"one":"8cc3fb39009d0adc26fca1e2ee96822d168d4debc379fd516c15d4b4a1624231","other":"80d7e892bbb26808abb1d1530077fec6b08768c151a9f220881da3c862bae0af","up":true},{"one":"7e47a2f82984a600c8583605a91d5cb8f2d9a18961845e9c422edd78e20ac3a3","other":"05949ec1a582fa70cab95c59e7c0d315583bf9fc320c60c35268931f21e90853","up":true},{"one":"d20931ce3da972fd23ea306e5c604a1fbd9417ba02654c5cdbe278fe259f75d5","other":"0111e720a84b310f863c2530fbe149e6a221acbad01065c5d052d2b3e1716f54","up":true},{"one":"84a9db7645c792dc38c1f2113a8f0590d04e1c94d9a8c464ab0ec8219303d966","other":"6c0142984d629ae6995894de9e7e5eb8d3fe45e1641d7ebd63959d2e61548ba3","up":true},{"one":"031450ec20f353435b429b5fa64f616d07c9d586afabc7a2772e05ad5c88bf50","other":"140dd212f2b193ee6a9d7fc14f7da321c7ef6fd367fb4f194924fd0ad5d135cc","up":true},{"one":"3b020c84fb60f59779324d451d9770d683e08133bbaa2d5762f61b8fd4b8d9fd","other":"298ae5d173c5360bc9ad5b492ed35de3b6e0cae868a34bfe6311a8ba5ea9877e","up":true},{"one":"7049e92a396311fbf2f4a55bb5bd2fe3f7bb3c1a63f41bb88eb800edd45ac6e5","other":"5c7c15798e86fe794bb201614d46366ea96dc51091f5b19f149995e0d40df0a6","up":true},{"one":"d3022a46956e75bca85ba89d97b694a3a64f03ccc2d881ed0cd687d43d486925","other":"f8ff7440d6f4abb1c89496336843741ed53a544cedeeed71d8ebe0b08698438d","up":true},{"one":"7c7ca5a7522a04f62f2bebd6197a03d78f255d0175c3dfceb5d92b684365b2aa","other":"553824ef701d3cd0191ae3a67de564ed0cf553e74bd60ed9de321f9302732ba6","up":true},{"one":"178401ec8d01a0a4f551d23e880a8e8a4eb87773565363843d51cf52660b1211","other":"eb686a686fd70e41659cc69ec0db53d1512dfec238918afd0a515d8ce177d4d9","up":true},{"one":"bdc5de01276157a0f3fc43a9cc3b41b2cacc8479118b75aec4ba9b2b7fa86d5e","other":"8b4318f86ad47976321af97bfbf95cd0a3b0aa22447aeb0611ed1a9bf1e6a4bf","up":true},{"one":"5bd8faf93bcad07006e9426b45f5cc599f1963ab791deac4ff63d6739cd62a17","other":"67909bdcaef2330ef120e524c76e1e382b474f3332d86f65282028e051f34c75","up":true},{"one":"c2d00c7d960174c0934129fdcec63525bfa728f78fb70b7c52036b772d6297ad","other":"bdc5de01276157a0f3fc43a9cc3b41b2cacc8479118b75aec4ba9b2b7fa86d5e","up":true},{"one":"cc3397e9e11f75273d3f81d91f980f4504755f80b27a183212de56cc5085e58d","other":"c2d00c7d960174c0934129fdcec63525bfa728f78fb70b7c52036b772d6297ad","up":true},{"one":"ab719e60a77ba5253f1690c920df9dd9f3a62071e9cce9d62e0001a522b3409e","other":"e8676d17966625c4fdac6bd9437981a0cf869c8b0010812edf0c79805e0e1ff1","up":true},{"one":"7ce7fec833a2e8c7720fcc97f820f2ca2aca85388210f887c3efe78b020766e7","other":"26ab9c813822dbb4f1a230cd8e99e8ab280b242747deb55fdf93d160906ef331","up":true},{"one":"48d79ac55f8df512af8e7d868aa40ac9b61493fa4f1b0ce0b76bf6da2eb30e78","other":"a9700308516c02cf9aea8809000a4e0596d6b44753e10bd0928df83e2eb9b9e7","up":true},{"one":"a8b58013ff911871d1aa6c2bbea6c2e6ef9b00b87b80a41dc04724ad0488e2ff","other":"cdb13873ac058861f295ebca5d958bf2bb793e3f9e274cf5a73a633425a9276f","up":true},{"one":"ab719e60a77ba5253f1690c920df9dd9f3a62071e9cce9d62e0001a522b3409e","other":"ff75b19017c84128f38dec4f63e1f247a5691dc0fae186e667afedb5fe9d2c80","up":true},{"one":"553824ef701d3cd0191ae3a67de564ed0cf553e74bd60ed9de321f9302732ba6","other":"f215bc09268e60ebbec76f743bebd09d7e72d4cbeedc0b9d3417bb4a2ef42935","up":true},{"one":"f215bc09268e60ebbec76f743bebd09d7e72d4cbeedc0b9d3417bb4a2ef42935","other":"9c21cb3e56f8ac66a7917a9ba14e58f77e998ac70c178b88b5053d9ac2777e60","up":true},{"one":"402cf9d0bffa017ebea34ede11207f3366b3ea450c0428029129a8e8026abbe7","other":"7e47a2f82984a600c8583605a91d5cb8f2d9a18961845e9c422edd78e20ac3a3","up":true},{"one":"50c1a8023bfecffb09472fdc50898f4d050a31443d40a6c07b629090beb0df3d","other":"0d1c35c6ea485cb33857b790ee262f974cf0d54cf8ce3003f8308ac2e87c2c25","up":true},{"one":"cf52b3fc82ec24c3e9b40488d7c5f7ac8af731d159a103619bee932ec74d5e92","other":"c272b12f4020ae5b20e3d29cd09de03fa0088e3eeb5f07aa7728b29a3e90e687","up":true},{"one":"e09f98114da64e7547b351637190f6621a1f75568cfa9960980fc77618f8855b","other":"59876e7ff9e92243856dad23126e1d38d9a5ddae79772ed1b2bdb91f33a4a4b5","up":true},{"one":"951877b34ee1535b5059c49beb03e8960ff9c12b694ef64708c77c30ff1dc706","other":"e8676d17966625c4fdac6bd9437981a0cf869c8b0010812edf0c79805e0e1ff1","up":true},{"one":"8b4318f86ad47976321af97bfbf95cd0a3b0aa22447aeb0611ed1a9bf1e6a4bf","other":"d3e913cf4a7dabfb5699131b65e533a40adb46ea37e0ed4ce9433f99015986ef","up":true},{"one":"e2d36f335d90ad63148db8e353a78a30d8d9c0abe107be2cf8685f6a01ce74b9","other":"59876e7ff9e92243856dad23126e1d38d9a5ddae79772ed1b2bdb91f33a4a4b5","up":true},{"one":"a8f49e87156fda5510897601689ce968d77032134c523634916b96de16366f9e","other":"0e80db9dfa8ce29bedfb2de031622bef8829bee52771322b6a7efb47afe540e7","up":true},{"one":"e6812448728b4bda5962adceb1707b29f661d3d1a6b2ccd5f8183c9a1f4d01b6","other":"9464ad8da1a5effdc0351742dfffae941ffd9fab469637b2491caece53c57dc8","up":true},{"one":"c42e6492879439eeecd9938d17ff283fd8f5f24206906ca512b4daa4803b78b4","other":"9ec831d97418916fd9695465e041caf27824dbb51d6ff74d6b70f3bd561e70e6","up":true},{"one":"4b79e83186f2ab05932eaa99982a2e53373b83780e32d224d15cb2c85462451f","other":"44adaabf9c46608a374ed816d3c40c63b6645f4f6e033a76431bc8f88713eb41","up":true},{"one":"24f80c437be45898e594f821bba0f5c62e0c9a0c720118e362ee6f78410612bd","other":"b4a1b687fbdb754fd689e26f0870a7dcab5d76190c06f3ea2ea1e198f8aa5ab2","up":true},{"one":"c272b12f4020ae5b20e3d29cd09de03fa0088e3eeb5f07aa7728b29a3e90e687","other":"9ec831d97418916fd9695465e041caf27824dbb51d6ff74d6b70f3bd561e70e6","up":true},{"one":"ec90a22f41ee659d5759a497946ac2991c916f00fe7caeeeb0908f3af1fe60b6","other":"43d43e9ebcbceb4830fc1d2d5024650b90698306bbd2c4d0b4841a1a8fd09c93","up":true},{"one":"8ea2c8acc111f38d5b4a5ed60252ee83f312d0f8359265d5b9266d54735052fe","other":"ba911175d3aa3fcc266e2a5aa32fb706208b8a9b5021a5f37c0b85f547eb375d","up":true},{"one":"5ff09c6859736aad7a82a3bfb3f1a1a8b3c0d58f831863540d9c3013dd35745e","other":"5ac0d00b8d647dec62d26e1a689fd05b8b7a1a79ab8c43493bd6d7d209816df1","up":true},{"one":"87a337622455ae65daf3ab2555cee8985e9aa14bac245545d985296060e4a8de","other":"8b4318f86ad47976321af97bfbf95cd0a3b0aa22447aeb0611ed1a9bf1e6a4bf","up":true},{"one":"7d162a11662585f8c38d88fb241623e67bacf90703065dae6c092b4b507d6543","other":"f2b49a2247c9c5e8f6f755834a37fe5c17f208f994878e14b7001e404f52e125","up":true},{"one":"0e3b7722f3f84d83b3d744bea4e893715a01d4df3cf4a1c6a6823a1f5c9ad6b8","other":"025de1d2ec529d3a7da302eef0f8c54996616d40c940c0956d470ffc2a007f33","up":true},{"one":"9b8e6bb3a7fe4dc65ac97404e546d8b777d068c94bc2355f4f1a510ad6c11905","other":"a4ee49bb2caabb6b9448bcdff1fc3cc673a2db04eab9f5c62d1787f2c25990a0","up":true},{"one":"87a337622455ae65daf3ab2555cee8985e9aa14bac245545d985296060e4a8de","other":"8ea2c8acc111f38d5b4a5ed60252ee83f312d0f8359265d5b9266d54735052fe","up":true},{"one":"c9c302de4afe7b4dcbb6f3e366ce747083f9dcd7d5c6a01b939da5cdc6ccc874","other":"60c5647aed152609979366fb33dc8b28fc60736098ff68d232415889b43dfa58","up":true},{"one":"48f1ca6d433019f932fa4ae03e0decbcbea3fe635edff4458a669b83f8162b9a","other":"44adaabf9c46608a374ed816d3c40c63b6645f4f6e033a76431bc8f88713eb41","up":true},{"one":"d408bb6f7af1590e1f162ce02cc016b1b86ede29851caa32434212ffa2a377c8","other":"5ff09c6859736aad7a82a3bfb3f1a1a8b3c0d58f831863540d9c3013dd35745e","up":true},{"one":"a8f49e87156fda5510897601689ce968d77032134c523634916b96de16366f9e","other":"68cbc4a5313080d5dca8ad34e8bf52a6144e0ff8ef3f795d7ae9d5f644fe2042","up":true},{"one":"c8ea4177420785926e0929701f5e74c744920386f2a43b89d83c8281106cb95e","other":"1dc0ef1ce68dc681298177bde808af514efa52a5ad38c9cd2bd61968cdf19cfb","up":true},{"one":"9ec831d97418916fd9695465e041caf27824dbb51d6ff74d6b70f3bd561e70e6","other":"70f68562733da4e3b1c3949fb6e11ac0bdd49ea7e732925f937f87df5af698d6","up":true},{"one":"5814be13c8550b9a5a83d08e7af6022002a8fdaa38ba6c2c30be58099a9f7744","other":"8d192b11538072db750f71204e2e6adf9dc0508d9c5cf1eb457e4e996cd985bc","up":true},{"one":"bea10868d5da506c1801de845c148c2f09761893113ac913fe66674a8f43c178","other":"fc3911383f74a982f6af8ab95a63426b56117d45f153b3c1441459d9191daaff","up":true},{"one":"7049e92a396311fbf2f4a55bb5bd2fe3f7bb3c1a63f41bb88eb800edd45ac6e5","other":"5c373034770e413e700b1cd03b2035f769ecd9ab8eb54d32f7b2645be1991fe5","up":true},{"one":"9c21cb3e56f8ac66a7917a9ba14e58f77e998ac70c178b88b5053d9ac2777e60","other":"50c1a8023bfecffb09472fdc50898f4d050a31443d40a6c07b629090beb0df3d","up":true},{"one":"bdc5de01276157a0f3fc43a9cc3b41b2cacc8479118b75aec4ba9b2b7fa86d5e","other":"87a337622455ae65daf3ab2555cee8985e9aa14bac245545d985296060e4a8de","up":true},{"one":"994839e5f3a5b8b23aed84fb029413124af17804b79b0263ec6bfd5aec5dad78","other":"5ff09c6859736aad7a82a3bfb3f1a1a8b3c0d58f831863540d9c3013dd35745e","up":true},{"one":"1070df5e904e3865085b0319a81761e59146494c689e7567efe7465fc819ae8b","other":"56635699bd3bc78193adbdb8e8b7c2c91dab4140fdaa506fea2300ee86c4ba81","up":true},{"one":"837f0993f6374039a5ad4472d6313e647a4c5db4583bd27ccfa98d3448a17731","other":"5d82a418629cfbe7c57105309319ad695a198626fe3571de213a12ddf62f7308","up":true},{"one":"7c7ca5a7522a04f62f2bebd6197a03d78f255d0175c3dfceb5d92b684365b2aa","other":"0d1c35c6ea485cb33857b790ee262f974cf0d54cf8ce3003f8308ac2e87c2c25","up":true},{"one":"2c85f5361b2d5abcf799de50fe58b1ed2006ea18f75823748c33eb7e95b1cc39","other":"648a96d61898eb2d336ff7d5a229cfeb7b9f587282e40f9fe640e181ae26bdd3","up":true},{"one":"cc3397e9e11f75273d3f81d91f980f4504755f80b27a183212de56cc5085e58d","other":"c8ea4177420785926e0929701f5e74c744920386f2a43b89d83c8281106cb95e","up":true},{"one":"b78fd21c063006e2e033d1d00fc21e1ad7ad7951bb5621cec9b56639745d65f9","other":"ddb8be472c3d48dc4d3d112448e6c0c4a826a18af3f3b53fdfef8cd31053c75f","up":true},{"one":"5bd8faf93bcad07006e9426b45f5cc599f1963ab791deac4ff63d6739cd62a17","other":"5c373034770e413e700b1cd03b2035f769ecd9ab8eb54d32f7b2645be1991fe5","up":true},{"one":"a7a856a43293aa3004848a86f187e09343bd605e1a93e853a6f6b6b1031bd667","other":"1b1dc3f9312df141855c545dd16aee325f9a609230ec6165bdbbb07d0c0862f6","up":true},{"one":"a7a856a43293aa3004848a86f187e09343bd605e1a93e853a6f6b6b1031bd667","other":"9f7d72b7d9843872904b841e421985082428fba5010db27dd871ed76630a1e1d","up":true},{"one":"60c5647aed152609979366fb33dc8b28fc60736098ff68d232415889b43dfa58","other":"9959385385aade728d3f5763806596222bc1e7b9946c2c92407943d080b32f8d","up":true},{"one":"e2d36f335d90ad63148db8e353a78a30d8d9c0abe107be2cf8685f6a01ce74b9","other":"70f68562733da4e3b1c3949fb6e11ac0bdd49ea7e732925f937f87df5af698d6","up":true},{"one":"cf52b3fc82ec24c3e9b40488d7c5f7ac8af731d159a103619bee932ec74d5e92","other":"c53417f008e4550e1c4cb9a3e2955b3af6403e059b7b4b4c33869d9ed4a580a5","up":true},{"one":"8b4318f86ad47976321af97bfbf95cd0a3b0aa22447aeb0611ed1a9bf1e6a4bf","other":"c2d00c7d960174c0934129fdcec63525bfa728f78fb70b7c52036b772d6297ad","up":true},{"one":"26acc3c373c29150af30bbc9264d0c44c7c606ff7377399ddf844635e97afcfa","other":"2ddffddbf452f0c9268058a739f5757fb90281cbfd31bd6f760acc3392fec12a","up":true},{"one":"6d3c6db15900f2596286f81cc0664d2c8291ead5bad2aa35bad515af088a2e48","other":"a8f49e87156fda5510897601689ce968d77032134c523634916b96de16366f9e","up":true},{"one":"2e65d05648b798fafbc9bb582c05e6f8f891131260e8c90ca725ddcbc823f315","other":"ec90a22f41ee659d5759a497946ac2991c916f00fe7caeeeb0908f3af1fe60b6","up":true},{"one":"c190f9d08c78ed6dffadaef36e77fe6aa96099e4453753b0cfc8ec542fa96b9d","other":"68cbc4a5313080d5dca8ad34e8bf52a6144e0ff8ef3f795d7ae9d5f644fe2042","up":true},{"one":"9f0e2bf8a962156c9e0a83c3d42ad3dc5ac5c3e508f24200bfb151aad4e395ff","other":"dbd4d90e3342ef837b8ecf5c6e490f7c409f419cf36b77162a87cb2cfb8ae33c","up":true},{"one":"a32749dc4e134a4fbb038618c58a7c05bbbaa06f1436de3754341af86402581b","other":"79e5c6c6d78c88c579003cda044882ecb04520fbad1f5feadbe7b6d23fe183c8","up":true},{"one":"43d43e9ebcbceb4830fc1d2d5024650b90698306bbd2c4d0b4841a1a8fd09c93","other":"955da15edae50a4c68bc8c579b9799d55f41b7c2a6178f645f79d772e0116662","up":true},{"one":"24f80c437be45898e594f821bba0f5c62e0c9a0c720118e362ee6f78410612bd","other":"b6dffac4b4eb2974ed0ed241799f97d2e5d9be671e311266826d0dcfecfcc209","up":true},{"one":"b8e1a8622c256ef29acd52df7b3ace50820fb1a147716165ff862fdc973a48cd","other":"f2b49a2247c9c5e8f6f755834a37fe5c17f208f994878e14b7001e404f52e125","up":true},{"one":"79e5c6c6d78c88c579003cda044882ecb04520fbad1f5feadbe7b6d23fe183c8","other":"56ca9dd846a58a0ffa7b49a88aad559a338ba535a6f738468b8f146c97890cb2","up":true},{"one":"2ddffddbf452f0c9268058a739f5757fb90281cbfd31bd6f760acc3392fec12a","other":"2c8042517dfeaa01586e91e491dd4154fb24c0d84fedb0404b9d5136f60da1d9","up":true},{"one":"b5eab4869b4cb65bdc1e5cab45c03016d202f9f5b668be50066451cfcf9ef299","other":"b8e1a8622c256ef29acd52df7b3ace50820fb1a147716165ff862fdc973a48cd","up":true},{"one":"af02c2f471e96ab8defbd229215695b95e64f7c78b145b6793a238961f556fbf","other":"f645aab9cb2bd2709998b38e5789c9c5f68d40765e6cbd93b92e6383eb671dba","up":true},{"one":"2c85f5361b2d5abcf799de50fe58b1ed2006ea18f75823748c33eb7e95b1cc39","other":"7660828fb0c8f89201d34e6f4d61cc6ba9a30cead6e4eb8253f6cc92e1845f23","up":true},{"one":"6d3c6db15900f2596286f81cc0664d2c8291ead5bad2aa35bad515af088a2e48","other":"b8e1a8622c256ef29acd52df7b3ace50820fb1a147716165ff862fdc973a48cd","up":true},{"one":"0e80db9dfa8ce29bedfb2de031622bef8829bee52771322b6a7efb47afe540e7","other":"a742e8502c619703ce87890110f908bde32b59dc61d77a247759e5d0056e0c94","up":true},{"one":"8d192b11538072db750f71204e2e6adf9dc0508d9c5cf1eb457e4e996cd985bc","other":"f6c028d6a2b6408e90169151f4519b561ed183bd8925ed9a1702806f397666e7","up":true},{"one":"9ca1fd5d41975acb905f337997922849b4070360e47849bb4fd8cd1b9ddb4d73","other":"d700d96de1193456dc0bcf492c7c11b0951062974af2f7f47b8c901b17c23165","up":true},{"one":"8e282b0f27d4fa56fe14cfeb69fac5a53e3d882c7778eb190653e2eab7c93fd2","other":"d408bb6f7af1590e1f162ce02cc016b1b86ede29851caa32434212ffa2a377c8","up":true},{"one":"a32749dc4e134a4fbb038618c58a7c05bbbaa06f1436de3754341af86402581b","other":"43d43e9ebcbceb4830fc1d2d5024650b90698306bbd2c4d0b4841a1a8fd09c93","up":true},{"one":"a742e8502c619703ce87890110f908bde32b59dc61d77a247759e5d0056e0c94","other":"b8e1a8622c256ef29acd52df7b3ace50820fb1a147716165ff862fdc973a48cd","up":true},{"one":"b4a1b687fbdb754fd689e26f0870a7dcab5d76190c06f3ea2ea1e198f8aa5ab2","other":"fc3911383f74a982f6af8ab95a63426b56117d45f153b3c1441459d9191daaff","up":true},{"one":"4d381014783980b2f77f0d71160ad9e9d84672b576f4435ccdbae12752350c1c","other":"793322608055d4873776a9a0a6c40b04379bfd2f289a8ad49a7dc456bc65f871","up":true},{"one":"5a8b84df651871fce72d11cb1c26c87ae4a0cc6b4c274d37e70532c94f27288e","other":"cd6c8b42a0b092f41e6925577c9de7d1bea17231bcb3d08f3d3cce9c6fdcf22d","up":true},{"one":"793322608055d4873776a9a0a6c40b04379bfd2f289a8ad49a7dc456bc65f871","other":"93ea8ef251fd56b159e080cdf733d33e1fdfb3c7ae5bd9a6a328d0bf5458867b","up":true},{"one":"a5ac04d53b569e418ef5007961431155f2c226ee10157b30af71ea4836b08089","other":"9f0e2bf8a962156c9e0a83c3d42ad3dc5ac5c3e508f24200bfb151aad4e395ff","up":true},{"one":"bcf85ecf421b871fca0247a7081188a8e2c08778b88ffad16db37ef024fec0fc","other":"046ca54165f0dd4d62fd7d8ee9e97c655db3d35f5452a0ccb0dffc79c047978c","up":true},{"one":"ec90a22f41ee659d5759a497946ac2991c916f00fe7caeeeb0908f3af1fe60b6","other":"d700d96de1193456dc0bcf492c7c11b0951062974af2f7f47b8c901b17c23165","up":true},{"one":"68cbc4a5313080d5dca8ad34e8bf52a6144e0ff8ef3f795d7ae9d5f644fe2042","other":"b8e1a8622c256ef29acd52df7b3ace50820fb1a147716165ff862fdc973a48cd","up":true},{"one":"b6dffac4b4eb2974ed0ed241799f97d2e5d9be671e311266826d0dcfecfcc209","other":"9ca1fd5d41975acb905f337997922849b4070360e47849bb4fd8cd1b9ddb4d73","up":true},{"one":"a8ff8d69dcb36462d1116dafa5e3d0c7237bf65dbece482a316862c8d66e35b6","other":"d9cf19895e015cb534d915aed83c0d26bf40a11244027812e17c3bec6e645a8e","up":true},{"one":"4d9147e3bf98cb59a7648f616c0d7f713a8cf3b7d25e3115233ff5883128beab","other":"be68267d77fb52424227267c665ca1193a010334cac057338aca77b49a4b94da","up":true},{"one":"397a0a0e9fadcb571acd8981f5bfe8e059e707e0feae8a9c4c6bfe87bd39e66a","other":"31e129ab3df7e082cc27c649d9ee29a3ea646d6a97d2417875b80e3ff576c047","up":true},{"one":"c272b12f4020ae5b20e3d29cd09de03fa0088e3eeb5f07aa7728b29a3e90e687","other":"9c21cb3e56f8ac66a7917a9ba14e58f77e998ac70c178b88b5053d9ac2777e60","up":true},{"one":"447a411c80fbd422bfa0c358d3f2a1fe6256c05e35acc6350958dfbe62cd5b9b","other":"7e47a2f82984a600c8583605a91d5cb8f2d9a18961845e9c422edd78e20ac3a3","up":true},{"one":"b659418885032905ea20ad47d70470e403e7e407e0e9ebf9277f9a2d81ec121c","other":"32ff1969d90aaa5a8ed2260968a8e2bac2d1cae597c906f90495f1dc5de7f8d3","up":true},{"one":"140dd212f2b193ee6a9d7fc14f7da321c7ef6fd367fb4f194924fd0ad5d135cc","other":"d3022a46956e75bca85ba89d97b694a3a64f03ccc2d881ed0cd687d43d486925","up":true},{"one":"fa240411bc4f3e44dfca3faedd112c7743a67b522a910bc99696ef0b31732ee2","other":"bbafac5ba5915db3c80e28b249cad260b9b5dad1f728063c48fa8f61d7556e17","up":true},{"one":"f305273a7d08e72f69b0b153855e822f252cbbf34a18f305134eed9d1eb7b58a","other":"19ea0a685fc4edd298b736dc7a778c9ec4362de378876911105fa9ba2ce90204","up":true},{"one":"9ca1fd5d41975acb905f337997922849b4070360e47849bb4fd8cd1b9ddb4d73","other":"2fd2f77d76cca480ac18e9af7a462f297db168c3370b3bc0e2c04aa006c4d037","up":true},{"one":"435d721a568eb906a03c69dbd71337251a550521a4004ab5d4a7deb6f317061a","other":"3cabd3a567fc4e6f8da66eb35d938fe1e9a7f2bdd2d36c4dc2d0e0e9149f5e56","up":true},{"one":"8d192b11538072db750f71204e2e6adf9dc0508d9c5cf1eb457e4e996cd985bc","other":"b4a1b687fbdb754fd689e26f0870a7dcab5d76190c06f3ea2ea1e198f8aa5ab2","up":true},{"one":"d95965e449dd4069876384cf4b34f986731e255a7948f0a862d229b1dddbc502","other":"c74d801e85ac0fd8951480d107b41eddc5c92775614c4886b3f732fa3d1a791d","up":true},{"one":"8006b080c78a0ab54fa1be75a939bee2334322fded6c3563de1596b17c36172c","other":"a3309f8b8bba4d8fbd7c6193d7671cb907b94e71155ef6138e0248682ff00e58","up":true},{"one":"b4a1b687fbdb754fd689e26f0870a7dcab5d76190c06f3ea2ea1e198f8aa5ab2","other":"f6c028d6a2b6408e90169151f4519b561ed183bd8925ed9a1702806f397666e7","up":true},{"one":"b6dffac4b4eb2974ed0ed241799f97d2e5d9be671e311266826d0dcfecfcc209","other":"fc3911383f74a982f6af8ab95a63426b56117d45f153b3c1441459d9191daaff","up":true},{"one":"48b850974575ca57a3cc5f9a4cf5aafd8688cb32b993f69983ece63258ff876e","other":"eb686a686fd70e41659cc69ec0db53d1512dfec238918afd0a515d8ce177d4d9","up":true},{"one":"6d5ec591af4966ba024c6b2aeb45e0aab8aa1762f9cac30ce3934da529b738e9","other":"f8ff7440d6f4abb1c89496336843741ed53a544cedeeed71d8ebe0b08698438d","up":true},{"one":"52a8747e4ea35f6f50c72d7c481616f68a5e4396248332b8ff69d3a772de49ac","other":"679554b410e415cfcdf1b14ef87759269b2bcaf07f4541122977db3a40091da2","up":true},{"one":"679554b410e415cfcdf1b14ef87759269b2bcaf07f4541122977db3a40091da2","other":"51440ab47fc5076c00cad16a542b846c26b3281ecea4dbca795ae9b80183ec90","up":true},{"one":"2e65d05648b798fafbc9bb582c05e6f8f891131260e8c90ca725ddcbc823f315","other":"955da15edae50a4c68bc8c579b9799d55f41b7c2a6178f645f79d772e0116662","up":true},{"one":"c190f9d08c78ed6dffadaef36e77fe6aa96099e4453753b0cfc8ec542fa96b9d","other":"9ca1fd5d41975acb905f337997922849b4070360e47849bb4fd8cd1b9ddb4d73","up":true},{"one":"035f15499cdb0f079b3e358ad54a6122681442a5293c3ae2fdf6c527004b36d2","other":"26ab9c813822dbb4f1a230cd8e99e8ab280b242747deb55fdf93d160906ef331","up":true},{"one":"a6165a4b02d58be116892982c0ed3d49d86fec0e9f436a516b61868331ed853f","other":"035f15499cdb0f079b3e358ad54a6122681442a5293c3ae2fdf6c527004b36d2","up":true},{"one":"97daf2cbe03c80ce6c4dae39cd071dd93cb32ed245aa9aa77285e12296957ca3","other":"140dd212f2b193ee6a9d7fc14f7da321c7ef6fd367fb4f194924fd0ad5d135cc","up":true},{"one":"b8e1a8622c256ef29acd52df7b3ace50820fb1a147716165ff862fdc973a48cd","other":"bbafac5ba5915db3c80e28b249cad260b9b5dad1f728063c48fa8f61d7556e17","up":true},{"one":"2ddffddbf452f0c9268058a739f5757fb90281cbfd31bd6f760acc3392fec12a","other":"fa240411bc4f3e44dfca3faedd112c7743a67b522a910bc99696ef0b31732ee2","up":true},{"one":"1dc0ef1ce68dc681298177bde808af514efa52a5ad38c9cd2bd61968cdf19cfb","other":"c2d00c7d960174c0934129fdcec63525bfa728f78fb70b7c52036b772d6297ad","up":true},{"one":"5c373034770e413e700b1cd03b2035f769ecd9ab8eb54d32f7b2645be1991fe5","other":"48b850974575ca57a3cc5f9a4cf5aafd8688cb32b993f69983ece63258ff876e","up":true},{"one":"b5eab4869b4cb65bdc1e5cab45c03016d202f9f5b668be50066451cfcf9ef299","other":"a742e8502c619703ce87890110f908bde32b59dc61d77a247759e5d0056e0c94","up":true},{"one":"5c7c15798e86fe794bb201614d46366ea96dc51091f5b19f149995e0d40df0a6","other":"48b850974575ca57a3cc5f9a4cf5aafd8688cb32b993f69983ece63258ff876e","up":true},{"one":"79e5c6c6d78c88c579003cda044882ecb04520fbad1f5feadbe7b6d23fe183c8","other":"6dd3ac0fd9a04a2ce75875c683d135e52eaa1670cb55e78711620712e60fde47","up":true},{"one":"48f1ca6d433019f932fa4ae03e0decbcbea3fe635edff4458a669b83f8162b9a","other":"4005fd1fa8fbb318b29a62c368ada579e5122ca0578e6a75c509552be4b63b76","up":true},{"one":"08f84878e44fed2adb4b2685b9f293dc3c73d5f9bc1c474870d943ec2ae73dbe","other":"0e3b7722f3f84d83b3d744bea4e893715a01d4df3cf4a1c6a6823a1f5c9ad6b8","up":true},{"one":"aceee75a260d45252060fe971eabd4bde25f912db4a3c6e47f4a09572fe01697","other":"3c5b2e125020c80e3674df9cac34de4d8f3a94ee02556fb557921b6d5498b933","up":true},{"one":"56ca9dd846a58a0ffa7b49a88aad559a338ba535a6f738468b8f146c97890cb2","other":"f645aab9cb2bd2709998b38e5789c9c5f68d40765e6cbd93b92e6383eb671dba","up":true},{"one":"a742e8502c619703ce87890110f908bde32b59dc61d77a247759e5d0056e0c94","other":"a32749dc4e134a4fbb038618c58a7c05bbbaa06f1436de3754341af86402581b","up":true},{"one":"26acc3c373c29150af30bbc9264d0c44c7c606ff7377399ddf844635e97afcfa","other":"a2e6c900511768c8c9947ab0fa2e73975cf2a4cec7fd15217abdba25c329317e","up":true},{"one":"741a854ae299df49a738725bc58abe614e5e4302ffecd8320bbede8412d160c0","other":"1fd0192df1fbf33771ca575afbb4e27c6541cce4a3cff2dfc1f2c085e7fab79e","up":true},{"one":"eb686a686fd70e41659cc69ec0db53d1512dfec238918afd0a515d8ce177d4d9","other":"8402bd62282811ed236b2fa1f0d41ad4bbe54e420ee34adc6164cfd4baf8658d","up":true},{"one":"5ff09c6859736aad7a82a3bfb3f1a1a8b3c0d58f831863540d9c3013dd35745e","other":"af02c2f471e96ab8defbd229215695b95e64f7c78b145b6793a238961f556fbf","up":true},{"one":"7d162a11662585f8c38d88fb241623e67bacf90703065dae6c092b4b507d6543","other":"f645aab9cb2bd2709998b38e5789c9c5f68d40765e6cbd93b92e6383eb671dba","up":true},{"one":"012ba278d582691241875c4c14ead91fff3983e190df7d9b43ade384e84c11fb","other":"44adaabf9c46608a374ed816d3c40c63b6645f4f6e033a76431bc8f88713eb41","up":true},{"one":"af02c2f471e96ab8defbd229215695b95e64f7c78b145b6793a238961f556fbf","other":"8f9aa2cd33d18e7cb4494d11a7532c97eb4a1cae172b2165c26ae4ed24887c0d","up":true},{"one":"7895b2cb97b473f8893cc70a4421e0f8be1c033b27cd730fa13438b7a8f3fcb5","other":"f1ed9d45622ff974a1e396cd878b2deb89e31aa5d08da773423f292ae8dbcbb6","up":true},{"one":"fa240411bc4f3e44dfca3faedd112c7743a67b522a910bc99696ef0b31732ee2","other":"79e5c6c6d78c88c579003cda044882ecb04520fbad1f5feadbe7b6d23fe183c8","up":true},{"one":"9959385385aade728d3f5763806596222bc1e7b9946c2c92407943d080b32f8d","other":"837f0993f6374039a5ad4472d6313e647a4c5db4583bd27ccfa98d3448a17731","up":true},{"one":"9b8e6bb3a7fe4dc65ac97404e546d8b777d068c94bc2355f4f1a510ad6c11905","other":"a2e6c900511768c8c9947ab0fa2e73975cf2a4cec7fd15217abdba25c329317e","up":true},{"one":"094256812084c6052a2604149aa3aba2379c483bf4ec25162f6b43934942775a","other":"19ea0a685fc4edd298b736dc7a778c9ec4362de378876911105fa9ba2ce90204","up":true},{"one":"837f0993f6374039a5ad4472d6313e647a4c5db4583bd27ccfa98d3448a17731","other":"b78fd21c063006e2e033d1d00fc21e1ad7ad7951bb5621cec9b56639745d65f9","up":true},{"one":"81a5a07f92f813e85b501b0028e1caa6e6a6c7efa5195ecb693cd2d91d5132a0","other":"e6812448728b4bda5962adceb1707b29f661d3d1a6b2ccd5f8183c9a1f4d01b6","up":true},{"one":"b78fd21c063006e2e033d1d00fc21e1ad7ad7951bb5621cec9b56639745d65f9","other":"93ea8ef251fd56b159e080cdf733d33e1fdfb3c7ae5bd9a6a328d0bf5458867b","up":true},{"one":"298ae5d173c5360bc9ad5b492ed35de3b6e0cae868a34bfe6311a8ba5ea9877e","other":"402cf9d0bffa017ebea34ede11207f3366b3ea450c0428029129a8e8026abbe7","up":true},{"one":"08bd1e049859b4a7c8078ca9741fe3daa668b9fe478da06d1a435cd5566b3e11","other":"1fd0192df1fbf33771ca575afbb4e27c6541cce4a3cff2dfc1f2c085e7fab79e","up":true},{"one":"d408bb6f7af1590e1f162ce02cc016b1b86ede29851caa32434212ffa2a377c8","other":"48de553e15afd3e8a46bfc3a5ba8a298158aa3d60f140d2730230af5cce8084d","up":true},{"one":"046ca54165f0dd4d62fd7d8ee9e97c655db3d35f5452a0ccb0dffc79c047978c","other":"f305273a7d08e72f69b0b153855e822f252cbbf34a18f305134eed9d1eb7b58a","up":true},{"one":"994839e5f3a5b8b23aed84fb029413124af17804b79b0263ec6bfd5aec5dad78","other":"48de553e15afd3e8a46bfc3a5ba8a298158aa3d60f140d2730230af5cce8084d","up":true},{"one":"fc514c43c4eb5c62798458da5d622e9248a6e530e4288cd902019aa05c4374d8","other":"0e2b48558ce2af1fbfee38a557d56072e3091cfcaee8d7847c7c9dcf7bef9bfa","up":true},{"one":"c9c302de4afe7b4dcbb6f3e366ce747083f9dcd7d5c6a01b939da5cdc6ccc874","other":"482ec3dc05460579ea9bce87677bd3d9a1930e801fabeba607b8ab6b8729ff15","up":true},{"one":"3b020c84fb60f59779324d451d9770d683e08133bbaa2d5762f61b8fd4b8d9fd","other":"3a628ef171c1f26fa0966eb89210be0a14305aae8bfed10f4ed9017698f40f4b","up":true},{"one":"318828fa893a28cc0652d3f81d97c5b8e023e853685f5d3e65fde20689abcc5a","other":"c96146ee47ec7cd74551cf74f00213bc337d643c4327393f0e6848ecd4a0f8d3","up":true},{"one":"34118166845c185d15c286b7e5433539ee98ed634baabd534d57369fd5f7c681","other":"f7561cb6740e17ec7c7d17068251b2c951d954c77804aa5af60464e9c3964e57","up":true},{"one":"56635699bd3bc78193adbdb8e8b7c2c91dab4140fdaa506fea2300ee86c4ba81","other":"f1ed9d45622ff974a1e396cd878b2deb89e31aa5d08da773423f292ae8dbcbb6","up":true},{"one":"19ea0a685fc4edd298b736dc7a778c9ec4362de378876911105fa9ba2ce90204","other":"f1ed9d45622ff974a1e396cd878b2deb89e31aa5d08da773423f292ae8dbcbb6","up":true},{"one":"eebd48b367cbfe94a37c0deb274a697e628074f9560b909e66229c5c76ce68eb","other":"ed424d24d702520bf7cb5f6babbdc43a078435fb4a9884ed82a93d642839e127","up":true},{"one":"019109311d4888497aa194cce4a89b5ef243421cf0e7e7bb9115d086e1a1f7d7","other":"305162c472c71ddef2320b138102b67d1ce2b8bba79e2e587fc80e085c88e547","up":true},{"one":"be68267d77fb52424227267c665ca1193a010334cac057338aca77b49a4b94da","other":"cd6c8b42a0b092f41e6925577c9de7d1bea17231bcb3d08f3d3cce9c6fdcf22d","up":true},{"one":"447cdbf1ff462aa67d6a46085b1a84fdc495a4142ab174c8e69b271b09732b4d","other":"cd6c8b42a0b092f41e6925577c9de7d1bea17231bcb3d08f3d3cce9c6fdcf22d","up":true},{"one":"09b3fa30780931e18b92c75d1cdeafa365609c565e4e8c253d393835cb82d98e","other":"298ae5d173c5360bc9ad5b492ed35de3b6e0cae868a34bfe6311a8ba5ea9877e","up":true},{"one":"67585dfd87a005bae9bffc2cccb83c69537247c74886b4fa52287f46c796bcb6","other":"6d5ec591af4966ba024c6b2aeb45e0aab8aa1762f9cac30ce3934da529b738e9","up":true},{"one":"4cece9bc134bc2b09400c9f7f8a4df9270d2fe3c077c5e441fffc911fcf6f42e","other":"4d9147e3bf98cb59a7648f616c0d7f713a8cf3b7d25e3115233ff5883128beab","up":true},{"one":"31e670638acba3d58f4c67f3ff2f3f25d769e8a5d7a7838927f4d9d169a84404","other":"0cfc7309afabceeb7d248714e972cf3987205324f5ab8d048d17bea5dc87369d","up":true},{"one":"31e129ab3df7e082cc27c649d9ee29a3ea646d6a97d2417875b80e3ff576c047","other":"194ea3e14dc5d99f98d15607dc4c405769f5a371acc22d41a62d0537d716be32","up":true},{"one":"178401ec8d01a0a4f551d23e880a8e8a4eb87773565363843d51cf52660b1211","other":"e6812448728b4bda5962adceb1707b29f661d3d1a6b2ccd5f8183c9a1f4d01b6","up":true},{"one":"a5053958f0cefcff1826bf02525fda98c4dc954cc38690f3c43ecbf0b2ad57af","other":"93ea8ef251fd56b159e080cdf733d33e1fdfb3c7ae5bd9a6a328d0bf5458867b","up":true},{"one":"67f383e5334e9b6701d1dbb20876d4ba9a7e578af0476caed4a7e1b701f2bedb","other":"885427318634c458a3050f2f26eb52454a75cea4a1263b9ed55e6eb899743854","up":true},{"one":"3cabd3a567fc4e6f8da66eb35d938fe1e9a7f2bdd2d36c4dc2d0e0e9149f5e56","other":"31e670638acba3d58f4c67f3ff2f3f25d769e8a5d7a7838927f4d9d169a84404","up":true},{"one":"834f14e9f325482adef62651ddf3685690dd5ebdd18014f2bd266b2143c290ff","other":"dad08999cd2edc33cfdc59ea34c8adcd6a34eaa15f2e85b0622e9848b215c1d5","up":true},{"one":"e2770cef7c1ad312b70d94ca5570e45f324c798a31a93203f505167aeab122b6","other":"d95965e449dd4069876384cf4b34f986731e255a7948f0a862d229b1dddbc502","up":true},{"one":"aeb45fe10b0dbd0f72ab6a77fbf971a8f46dbcdd96c08f23279d1434b4f38b1d","other":"8006b080c78a0ab54fa1be75a939bee2334322fded6c3563de1596b17c36172c","up":true},{"one":"0cfc7309afabceeb7d248714e972cf3987205324f5ab8d048d17bea5dc87369d","other":"67585dfd87a005bae9bffc2cccb83c69537247c74886b4fa52287f46c796bcb6","up":true},{"one":"5a26ae73eebf27f6dbec2414f1277a249e814a7a06790d7061610e5227b086f6","other":"8862cd85d7039119b984f752a458ac0495ddea98c69fc1d1241db7873a712c11","up":true},{"one":"a3309f8b8bba4d8fbd7c6193d7671cb907b94e71155ef6138e0248682ff00e58","other":"1dec77c2f4caf053c2d0524ae34a2d970bf4743a0d009d8fc543077ddfdfe3d0","up":true},{"one":"dbd4d90e3342ef837b8ecf5c6e490f7c409f419cf36b77162a87cb2cfb8ae33c","other":"bfc711793830779f49aa59bc6f7a205ab4e6eae7abfdafbf3bb5a1163a778ab2","up":true},{"one":"cd6c8b42a0b092f41e6925577c9de7d1bea17231bcb3d08f3d3cce9c6fdcf22d","other":"c96146ee47ec7cd74551cf74f00213bc337d643c4327393f0e6848ecd4a0f8d3","up":true},{"one":"056152dd9dae85c426378d34acab8d6641da665d2f57359a27a0ff652f3f3d02","other":"3f31ecaffaa6311c82c9a575bbc38d6bcb16630ac87e19d1853a64aa96c9dcde","up":true},{"one":"14849f811af20ce19fb29417d20c15fc16da1e45aebdf795a2c6ccb671e4bdac","other":"4005fd1fa8fbb318b29a62c368ada579e5122ca0578e6a75c509552be4b63b76","up":true},{"one":"a1c85ee75edb807a01f4ce930086c948918aade324752609b078c28991c04e86","other":"8d192b11538072db750f71204e2e6adf9dc0508d9c5cf1eb457e4e996cd985bc","up":true},{"one":"07f5d094a4b22e73cdd6c85452b3d928da9b4b16873824759cb7e8a622417fd5","other":"6e7f1f3d65364399617a4d95fdd04f2ca9b007b2366943e7ba5acd4616a7a425","up":true},{"one":"a606c79a018a6535375d851fcc82c42cc7c952720aa120434cedccf4a4be1f59","other":"5a8b84df651871fce72d11cb1c26c87ae4a0cc6b4c274d37e70532c94f27288e","up":true},{"one":"1049d321a450726cf39d1d7cea1c108be3bec137a644b62cdc73a853f5a5a22b","other":"d408bb6f7af1590e1f162ce02cc016b1b86ede29851caa32434212ffa2a377c8","up":true},{"one":"482ec3dc05460579ea9bce87677bd3d9a1930e801fabeba607b8ab6b8729ff15","other":"7d162a11662585f8c38d88fb241623e67bacf90703065dae6c092b4b507d6543","up":true},{"one":"a2e6c900511768c8c9947ab0fa2e73975cf2a4cec7fd15217abdba25c329317e","other":"fa240411bc4f3e44dfca3faedd112c7743a67b522a910bc99696ef0b31732ee2","up":true},{"one":"a4ee49bb2caabb6b9448bcdff1fc3cc673a2db04eab9f5c62d1787f2c25990a0","other":"1049d321a450726cf39d1d7cea1c108be3bec137a644b62cdc73a853f5a5a22b","up":true},{"one":"7850f5ee5048959559b3af0f95689669b250fc3aa58bcc9544dca61ca9c9769c","other":"93ea8ef251fd56b159e080cdf733d33e1fdfb3c7ae5bd9a6a328d0bf5458867b","up":true},{"one":"ab3ff955033c0a2615932faf85fd20090b9121c7edcc8e6f7ce4c4fde0a96b8a","other":"a606c79a018a6535375d851fcc82c42cc7c952720aa120434cedccf4a4be1f59","up":true},{"one":"e8676d17966625c4fdac6bd9437981a0cf869c8b0010812edf0c79805e0e1ff1","other":"d95965e449dd4069876384cf4b34f986731e255a7948f0a862d229b1dddbc502","up":true},{"one":"87a337622455ae65daf3ab2555cee8985e9aa14bac245545d985296060e4a8de","other":"8358a74fc8d8e39ccc40b4d3a212b7a69a6a8f6afc25cff2c9c7b44bbaf9ec82","up":true},{"one":"2c85f5361b2d5abcf799de50fe58b1ed2006ea18f75823748c33eb7e95b1cc39","other":"5a26ae73eebf27f6dbec2414f1277a249e814a7a06790d7061610e5227b086f6","up":true},{"one":"30feca631f06041cb14cead384dfaa5fffa6dc34b0cee54230efbe15e56a5884","other":"553824ef701d3cd0191ae3a67de564ed0cf553e74bd60ed9de321f9302732ba6","up":true},{"one":"16868ec5d8f490ac73ea28b4e8fdda55ac149bb1aafb177545b54b84a5ad5367","other":"0e2b48558ce2af1fbfee38a557d56072e3091cfcaee8d7847c7c9dcf7bef9bfa","up":true},{"one":"194ea3e14dc5d99f98d15607dc4c405769f5a371acc22d41a62d0537d716be32","other":"4d9147e3bf98cb59a7648f616c0d7f713a8cf3b7d25e3115233ff5883128beab","up":true},{"one":"d3e913cf4a7dabfb5699131b65e533a40adb46ea37e0ed4ce9433f99015986ef","other":"bdc5de01276157a0f3fc43a9cc3b41b2cacc8479118b75aec4ba9b2b7fa86d5e","up":true},{"one":"84a9db7645c792dc38c1f2113a8f0590d04e1c94d9a8c464ab0ec8219303d966","other":"402cf9d0bffa017ebea34ede11207f3366b3ea450c0428029129a8e8026abbe7","up":true},{"one":"1dec77c2f4caf053c2d0524ae34a2d970bf4743a0d009d8fc543077ddfdfe3d0","other":"e2770cef7c1ad312b70d94ca5570e45f324c798a31a93203f505167aeab122b6","up":true},{"one":"a0c88ba70599b0e72c18fa6aedd14d607cca3e9a49a5d50165d084e70328c2dd","other":"8e7b96d28edae711e1a4cee0d894e0bd92cdf410ba6f61713f7d9b0bee761d4c","up":true},{"one":"1fd0192df1fbf33771ca575afbb4e27c6541cce4a3cff2dfc1f2c085e7fab79e","other":"012ba278d582691241875c4c14ead91fff3983e190df7d9b43ade384e84c11fb","up":true},{"one":"05949ec1a582fa70cab95c59e7c0d315583bf9fc320c60c35268931f21e90853","other":"298ae5d173c5360bc9ad5b492ed35de3b6e0cae868a34bfe6311a8ba5ea9877e","up":true},{"one":"4cece9bc134bc2b09400c9f7f8a4df9270d2fe3c077c5e441fffc911fcf6f42e","other":"435d721a568eb906a03c69dbd71337251a550521a4004ab5d4a7deb6f317061a","up":true},{"one":"482ec3dc05460579ea9bce87677bd3d9a1930e801fabeba607b8ab6b8729ff15","other":"60c5647aed152609979366fb33dc8b28fc60736098ff68d232415889b43dfa58","up":true},{"one":"31e129ab3df7e082cc27c649d9ee29a3ea646d6a97d2417875b80e3ff576c047","other":"05949ec1a582fa70cab95c59e7c0d315583bf9fc320c60c35268931f21e90853","up":true},{"one":"31e670638acba3d58f4c67f3ff2f3f25d769e8a5d7a7838927f4d9d169a84404","other":"194ea3e14dc5d99f98d15607dc4c405769f5a371acc22d41a62d0537d716be32","up":true},{"one":"648a96d61898eb2d336ff7d5a229cfeb7b9f587282e40f9fe640e181ae26bdd3","other":"6c0142984d629ae6995894de9e7e5eb8d3fe45e1641d7ebd63959d2e61548ba3","up":true},{"one":"0cfc7309afabceeb7d248714e972cf3987205324f5ab8d048d17bea5dc87369d","other":"4d9147e3bf98cb59a7648f616c0d7f713a8cf3b7d25e3115233ff5883128beab","up":true},{"one":"2a507f5cb921137a7225c9c4988a8514af0f7e3c442cb8bf2bb612dc522a7daf","other":"298ae5d173c5360bc9ad5b492ed35de3b6e0cae868a34bfe6311a8ba5ea9877e","up":true},{"one":"5a26ae73eebf27f6dbec2414f1277a249e814a7a06790d7061610e5227b086f6","other":"52a8747e4ea35f6f50c72d7c481616f68a5e4396248332b8ff69d3a772de49ac","up":true},{"one":"aeb45fe10b0dbd0f72ab6a77fbf971a8f46dbcdd96c08f23279d1434b4f38b1d","other":"8862cd85d7039119b984f752a458ac0495ddea98c69fc1d1241db7873a712c11","up":true},{"one":"46bfa8bea56b0be1abfa5ad3561bb6bf49ed6695d83ee2b2c192c5a0408347cf","other":"48f1ca6d433019f932fa4ae03e0decbcbea3fe635edff4458a669b83f8162b9a","up":true},{"one":"056152dd9dae85c426378d34acab8d6641da665d2f57359a27a0ff652f3f3d02","other":"318828fa893a28cc0652d3f81d97c5b8e023e853685f5d3e65fde20689abcc5a","up":true},{"one":"67f383e5334e9b6701d1dbb20876d4ba9a7e578af0476caed4a7e1b701f2bedb","other":"97daf2cbe03c80ce6c4dae39cd071dd93cb32ed245aa9aa77285e12296957ca3","up":true},{"one":"8e282b0f27d4fa56fe14cfeb69fac5a53e3d882c7778eb190653e2eab7c93fd2","other":"837f0993f6374039a5ad4472d6313e647a4c5db4583bd27ccfa98d3448a17731","up":true},{"one":"67585dfd87a005bae9bffc2cccb83c69537247c74886b4fa52287f46c796bcb6","other":"6e7f1f3d65364399617a4d95fdd04f2ca9b007b2366943e7ba5acd4616a7a425","up":true},{"one":"a1c85ee75edb807a01f4ce930086c948918aade324752609b078c28991c04e86","other":"a7a856a43293aa3004848a86f187e09343bd605e1a93e853a6f6b6b1031bd667","up":true},{"one":"f9ded7b83e473e71be2fc0101d574c44521c96f77f9f84a384785a3af6b1093d","other":"95c0a351fb7aa6683280d159a7b808bfa63f63bff91a1c5936e973b2e5d3954f","up":true},{"one":"a3309f8b8bba4d8fbd7c6193d7671cb907b94e71155ef6138e0248682ff00e58","other":"1addd4a9f01486212e13e43a9650b7f793617d1cb59fb8d941270d7ae55f575f","up":true},{"one":"09b3fa30780931e18b92c75d1cdeafa365609c565e4e8c253d393835cb82d98e","other":"3cabd3a567fc4e6f8da66eb35d938fe1e9a7f2bdd2d36c4dc2d0e0e9149f5e56","up":true},{"one":"3cabd3a567fc4e6f8da66eb35d938fe1e9a7f2bdd2d36c4dc2d0e0e9149f5e56","other":"397a0a0e9fadcb571acd8981f5bfe8e059e707e0feae8a9c4c6bfe87bd39e66a","up":true},{"one":"9959385385aade728d3f5763806596222bc1e7b9946c2c92407943d080b32f8d","other":"fc514c43c4eb5c62798458da5d622e9248a6e530e4288cd902019aa05c4374d8","up":true},{"one":"cd6c8b42a0b092f41e6925577c9de7d1bea17231bcb3d08f3d3cce9c6fdcf22d","other":"6e7f1f3d65364399617a4d95fdd04f2ca9b007b2366943e7ba5acd4616a7a425","up":true},{"one":"b78fd21c063006e2e033d1d00fc21e1ad7ad7951bb5621cec9b56639745d65f9","other":"9959385385aade728d3f5763806596222bc1e7b9946c2c92407943d080b32f8d","up":true},{"one":"a606c79a018a6535375d851fcc82c42cc7c952720aa120434cedccf4a4be1f59","other":"7850f5ee5048959559b3af0f95689669b250fc3aa58bcc9544dca61ca9c9769c","up":true},{"one":"a5053958f0cefcff1826bf02525fda98c4dc954cc38690f3c43ecbf0b2ad57af","other":"834f14e9f325482adef62651ddf3685690dd5ebdd18014f2bd266b2143c290ff","up":true},{"one":"14849f811af20ce19fb29417d20c15fc16da1e45aebdf795a2c6ccb671e4bdac","other":"44adaabf9c46608a374ed816d3c40c63b6645f4f6e033a76431bc8f88713eb41","up":true},{"one":"07f5d094a4b22e73cdd6c85452b3d928da9b4b16873824759cb7e8a622417fd5","other":"793322608055d4873776a9a0a6c40b04379bfd2f289a8ad49a7dc456bc65f871","up":true},{"one":"7850f5ee5048959559b3af0f95689669b250fc3aa58bcc9544dca61ca9c9769c","other":"0e2b48558ce2af1fbfee38a557d56072e3091cfcaee8d7847c7c9dcf7bef9bfa","up":true},{"one":"c8ea4177420785926e0929701f5e74c744920386f2a43b89d83c8281106cb95e","other":"cdb13873ac058861f295ebca5d958bf2bb793e3f9e274cf5a73a633425a9276f","up":true},{"one":"e8676d17966625c4fdac6bd9437981a0cf869c8b0010812edf0c79805e0e1ff1","other":"eff2450bea797ff66d93e7c1c1b0977cddf3abba64bfa51bcc509d728569e2fa","up":true},{"one":"d95965e449dd4069876384cf4b34f986731e255a7948f0a862d229b1dddbc502","other":"d20931ce3da972fd23ea306e5c604a1fbd9417ba02654c5cdbe278fe259f75d5","up":true},{"one":"bbafac5ba5915db3c80e28b249cad260b9b5dad1f728063c48fa8f61d7556e17","other":"8f9aa2cd33d18e7cb4494d11a7532c97eb4a1cae172b2165c26ae4ed24887c0d","up":true},{"one":"bbafac5ba5915db3c80e28b249cad260b9b5dad1f728063c48fa8f61d7556e17","other":"feb3bc17ee7369a4fa9889d9250fed3c1257c70916871996e6eabd374dd8dc2e","up":true},{"one":"031450ec20f353435b429b5fa64f616d07c9d586afabc7a2772e05ad5c88bf50","other":"09b3fa30780931e18b92c75d1cdeafa365609c565e4e8c253d393835cb82d98e","up":true},{"one":"4a95d49f58057b039b55a34f67a348c052f61770065e41243ff055efc570a935","other":"44adaabf9c46608a374ed816d3c40c63b6645f4f6e033a76431bc8f88713eb41","up":true},{"one":"50c1a8023bfecffb09472fdc50898f4d050a31443d40a6c07b629090beb0df3d","other":"553824ef701d3cd0191ae3a67de564ed0cf553e74bd60ed9de321f9302732ba6","up":true},{"one":"ef99b6cdc05345a1ee82267890e3ccaeef1f2bd2fe7ae8b02b6b20b9a5ef85bb","other":"f1ed9d45622ff974a1e396cd878b2deb89e31aa5d08da773423f292ae8dbcbb6","up":true},{"one":"f6c028d6a2b6408e90169151f4519b561ed183bd8925ed9a1702806f397666e7","other":"244c3c954ac612e51d4945ab9b77f0b4a3983285e8add7921777e0c45a1bf338","up":true},{"one":"096a8302b6f369c28ed9d47719a507ead8a3cc1ca4fa1e32318b7f97873955fe","other":"019109311d4888497aa194cce4a89b5ef243421cf0e7e7bb9115d086e1a1f7d7","up":true},{"one":"3938e6b2c095084dc9975a3e8649133557495d34ac6df874c6d929266e3ffe6f","other":"19ea0a685fc4edd298b736dc7a778c9ec4362de378876911105fa9ba2ce90204","up":true},{"one":"8358a74fc8d8e39ccc40b4d3a212b7a69a6a8f6afc25cff2c9c7b44bbaf9ec82","other":"cdb13873ac058861f295ebca5d958bf2bb793e3f9e274cf5a73a633425a9276f","up":true},{"one":"86d6f68ec0b8e1b3406943787f918bee74dd1827998bdb13ece8f690da2d296a","other":"8b4318f86ad47976321af97bfbf95cd0a3b0aa22447aeb0611ed1a9bf1e6a4bf","up":true},{"one":"951877b34ee1535b5059c49beb03e8960ff9c12b694ef64708c77c30ff1dc706","other":"81a5a07f92f813e85b501b0028e1caa6e6a6c7efa5195ecb693cd2d91d5132a0","up":true},{"one":"ab719e60a77ba5253f1690c920df9dd9f3a62071e9cce9d62e0001a522b3409e","other":"c603138e40fe2f85cc634017956ada6399fca99969e3bf0c1ee8428374e779f1","up":true},{"one":"c8ea4177420785926e0929701f5e74c744920386f2a43b89d83c8281106cb95e","other":"0d1c35c6ea485cb33857b790ee262f974cf0d54cf8ce3003f8308ac2e87c2c25","up":true},{"one":"b3f95f225e2b6b76e6c7ef7c86caf83e35213f6a22da41e653ca1c190be23c9c","other":"c603138e40fe2f85cc634017956ada6399fca99969e3bf0c1ee8428374e779f1","up":true},{"one":"8ea2c8acc111f38d5b4a5ed60252ee83f312d0f8359265d5b9266d54735052fe","other":"0d1c35c6ea485cb33857b790ee262f974cf0d54cf8ce3003f8308ac2e87c2c25","up":true},{"one":"a8b58013ff911871d1aa6c2bbea6c2e6ef9b00b87b80a41dc04724ad0488e2ff","other":"0d1c35c6ea485cb33857b790ee262f974cf0d54cf8ce3003f8308ac2e87c2c25","up":true},{"one":"59876e7ff9e92243856dad23126e1d38d9a5ddae79772ed1b2bdb91f33a4a4b5","other":"7c7ca5a7522a04f62f2bebd6197a03d78f255d0175c3dfceb5d92b684365b2aa","up":true},{"one":"cdb13873ac058861f295ebca5d958bf2bb793e3f9e274cf5a73a633425a9276f","other":"8ea2c8acc111f38d5b4a5ed60252ee83f312d0f8359265d5b9266d54735052fe","up":true},{"one":"c6a8220726243cceaa6f2cebdac857a05efe721323f0a064c7f85a8340d3da96","other":"885427318634c458a3050f2f26eb52454a75cea4a1263b9ed55e6eb899743854","up":true},{"one":"6d3c6db15900f2596286f81cc0664d2c8291ead5bad2aa35bad515af088a2e48","other":"b6dffac4b4eb2974ed0ed241799f97d2e5d9be671e311266826d0dcfecfcc209","up":true},{"one":"0e80db9dfa8ce29bedfb2de031622bef8829bee52771322b6a7efb47afe540e7","other":"b8e1a8622c256ef29acd52df7b3ace50820fb1a147716165ff862fdc973a48cd","up":true},{"one":"ec90a22f41ee659d5759a497946ac2991c916f00fe7caeeeb0908f3af1fe60b6","other":"f6c028d6a2b6408e90169151f4519b561ed183bd8925ed9a1702806f397666e7","up":true},{"one":"24f80c437be45898e594f821bba0f5c62e0c9a0c720118e362ee6f78410612bd","other":"b8e1a8622c256ef29acd52df7b3ace50820fb1a147716165ff862fdc973a48cd","up":true},{"one":"3c5b2e125020c80e3674df9cac34de4d8f3a94ee02556fb557921b6d5498b933","other":"402cf9d0bffa017ebea34ede11207f3366b3ea450c0428029129a8e8026abbe7","up":true},{"one":"0e3b7722f3f84d83b3d744bea4e893715a01d4df3cf4a1c6a6823a1f5c9ad6b8","other":"012ba278d582691241875c4c14ead91fff3983e190df7d9b43ade384e84c11fb","up":true},{"one":"5c7c15798e86fe794bb201614d46366ea96dc51091f5b19f149995e0d40df0a6","other":"48d79ac55f8df512af8e7d868aa40ac9b61493fa4f1b0ce0b76bf6da2eb30e78","up":true},{"one":"bfc711793830779f49aa59bc6f7a205ab4e6eae7abfdafbf3bb5a1163a778ab2","other":"cd6c8b42a0b092f41e6925577c9de7d1bea17231bcb3d08f3d3cce9c6fdcf22d","up":true},{"one":"68cbc4a5313080d5dca8ad34e8bf52a6144e0ff8ef3f795d7ae9d5f644fe2042","other":"80735a728720bba0ac08daaccd093370d672a8f9a50845ad78ccd6cf8686c39f","up":true},{"one":"e2d36f335d90ad63148db8e353a78a30d8d9c0abe107be2cf8685f6a01ce74b9","other":"f215bc09268e60ebbec76f743bebd09d7e72d4cbeedc0b9d3417bb4a2ef42935","up":true},{"one":"9c21cb3e56f8ac66a7917a9ba14e58f77e998ac70c178b88b5053d9ac2777e60","other":"c42e6492879439eeecd9938d17ff283fd8f5f24206906ca512b4daa4803b78b4","up":true},{"one":"5814be13c8550b9a5a83d08e7af6022002a8fdaa38ba6c2c30be58099a9f7744","other":"56635699bd3bc78193adbdb8e8b7c2c91dab4140fdaa506fea2300ee86c4ba81","up":true},{"one":"2fd2f77d76cca480ac18e9af7a462f297db168c3370b3bc0e2c04aa006c4d037","other":"244c3c954ac612e51d4945ab9b77f0b4a3983285e8add7921777e0c45a1bf338","up":true},{"one":"48de553e15afd3e8a46bfc3a5ba8a298158aa3d60f140d2730230af5cce8084d","other":"c9c302de4afe7b4dcbb6f3e366ce747083f9dcd7d5c6a01b939da5cdc6ccc874","up":true},{"one":"e471efbcf1def3915b3dda2dc65a86945c607be54a33e31e9625549becac0e34","other":"30feca631f06041cb14cead384dfaa5fffa6dc34b0cee54230efbe15e56a5884","up":true},{"one":"f2b49a2247c9c5e8f6f755834a37fe5c17f208f994878e14b7001e404f52e125","other":"2c8042517dfeaa01586e91e491dd4154fb24c0d84fedb0404b9d5136f60da1d9","up":true},{"one":"8f9aa2cd33d18e7cb4494d11a7532c97eb4a1cae172b2165c26ae4ed24887c0d","other":"feb3bc17ee7369a4fa9889d9250fed3c1257c70916871996e6eabd374dd8dc2e","up":true},{"one":"8862cd85d7039119b984f752a458ac0495ddea98c69fc1d1241db7873a712c11","other":"8006b080c78a0ab54fa1be75a939bee2334322fded6c3563de1596b17c36172c","up":true},{"one":"ddb8be472c3d48dc4d3d112448e6c0c4a826a18af3f3b53fdfef8cd31053c75f","other":"d9cf19895e015cb534d915aed83c0d26bf40a11244027812e17c3bec6e645a8e","up":true},{"one":"1bd588263274543729d54529ae9e9bf4596db40649a1c2a3f73168d818f34b62","other":"dad08999cd2edc33cfdc59ea34c8adcd6a34eaa15f2e85b0622e9848b215c1d5","up":true},{"one":"4a95d49f58057b039b55a34f67a348c052f61770065e41243ff055efc570a935","other":"48d79ac55f8df512af8e7d868aa40ac9b61493fa4f1b0ce0b76bf6da2eb30e78","up":true},{"one":"48f1ca6d433019f932fa4ae03e0decbcbea3fe635edff4458a669b83f8162b9a","other":"da36d1df95a158b0d3f9e7407d663a6b611dde0a77f00a584b97a939ab6a00de","up":true},{"one":"955da15edae50a4c68bc8c579b9799d55f41b7c2a6178f645f79d772e0116662","other":"80735a728720bba0ac08daaccd093370d672a8f9a50845ad78ccd6cf8686c39f","up":true},{"one":"7ce7fec833a2e8c7720fcc97f820f2ca2aca85388210f887c3efe78b020766e7","other":"138dbc1662c4ce9b2b30ef5035914cc70465666fe18f313318e662d13f099621","up":true},{"one":"43c9e1571c460cb9f599fa8ed79ddd0f9c3a21fd2fa455e0603109c55012f76b","other":"a8f49e87156fda5510897601689ce968d77032134c523634916b96de16366f9e","up":true},{"one":"feb3bc17ee7369a4fa9889d9250fed3c1257c70916871996e6eabd374dd8dc2e","other":"68cbc4a5313080d5dca8ad34e8bf52a6144e0ff8ef3f795d7ae9d5f644fe2042","up":true},{"one":"2c8042517dfeaa01586e91e491dd4154fb24c0d84fedb0404b9d5136f60da1d9","other":"68cbc4a5313080d5dca8ad34e8bf52a6144e0ff8ef3f795d7ae9d5f644fe2042","up":true},{"one":"6dd3ac0fd9a04a2ce75875c683d135e52eaa1670cb55e78711620712e60fde47","other":"8f9aa2cd33d18e7cb4494d11a7532c97eb4a1cae172b2165c26ae4ed24887c0d","up":true},{"one":"dad08999cd2edc33cfdc59ea34c8adcd6a34eaa15f2e85b0622e9848b215c1d5","other":"dbd4d90e3342ef837b8ecf5c6e490f7c409f419cf36b77162a87cb2cfb8ae33c","up":true},{"one":"80d7e892bbb26808abb1d1530077fec6b08768c151a9f220881da3c862bae0af","other":"aeb45fe10b0dbd0f72ab6a77fbf971a8f46dbcdd96c08f23279d1434b4f38b1d","up":true},{"one":"eff2450bea797ff66d93e7c1c1b0977cddf3abba64bfa51bcc509d728569e2fa","other":"e2770cef7c1ad312b70d94ca5570e45f324c798a31a93203f505167aeab122b6","up":true},{"one":"f8ff7440d6f4abb1c89496336843741ed53a544cedeeed71d8ebe0b08698438d","other":"885427318634c458a3050f2f26eb52454a75cea4a1263b9ed55e6eb899743854","up":true},{"one":"305162c472c71ddef2320b138102b67d1ce2b8bba79e2e587fc80e085c88e547","other":"447cdbf1ff462aa67d6a46085b1a84fdc495a4142ab174c8e69b271b09732b4d","up":true},{"one":"e0a0ba7e7e89a7af805e24abde1a5a5b489ba197585051a8755e8c2345c3d57b","other":"7895b2cb97b473f8893cc70a4421e0f8be1c033b27cd730fa13438b7a8f3fcb5","up":true},{"one":"c74d801e85ac0fd8951480d107b41eddc5c92775614c4886b3f732fa3d1a791d","other":"e64d90760cd81e4f112bbf1432e76c82fa4173fd474b988f4096ce187363fd81","up":true},{"one":"094256812084c6052a2604149aa3aba2379c483bf4ec25162f6b43934942775a","other":"1070df5e904e3865085b0319a81761e59146494c689e7567efe7465fc819ae8b","up":true},{"one":"9b8e6bb3a7fe4dc65ac97404e546d8b777d068c94bc2355f4f1a510ad6c11905","other":"60c5647aed152609979366fb33dc8b28fc60736098ff68d232415889b43dfa58","up":true},{"one":"18e00a7e0f826a1aba3f8c0f533ed905f2eee607b697fff056ee7874d374adcd","other":"298ae5d173c5360bc9ad5b492ed35de3b6e0cae868a34bfe6311a8ba5ea9877e","up":true},{"one":"4b79e83186f2ab05932eaa99982a2e53373b83780e32d224d15cb2c85462451f","other":"741a854ae299df49a738725bc58abe614e5e4302ffecd8320bbede8412d160c0","up":true},{"one":"c603138e40fe2f85cc634017956ada6399fca99969e3bf0c1ee8428374e779f1","other":"da36d1df95a158b0d3f9e7407d663a6b611dde0a77f00a584b97a939ab6a00de","up":true},{"one":"6b4ee1b73942ced78f97c0d0e221209933e63ae7353bb9ab3d37ac4127592e86","other":"be68267d77fb52424227267c665ca1193a010334cac057338aca77b49a4b94da","up":true},{"one":"c8c8a93779ec4d9ac40925e8208478a00ee27fc220ddd73d8774cf6bfa255c46","other":"d3022a46956e75bca85ba89d97b694a3a64f03ccc2d881ed0cd687d43d486925","up":true},{"one":"138dbc1662c4ce9b2b30ef5035914cc70465666fe18f313318e662d13f099621","other":"1fd0192df1fbf33771ca575afbb4e27c6541cce4a3cff2dfc1f2c085e7fab79e","up":true},{"one":"d20931ce3da972fd23ea306e5c604a1fbd9417ba02654c5cdbe278fe259f75d5","other":"e64d90760cd81e4f112bbf1432e76c82fa4173fd474b988f4096ce187363fd81","up":true},{"one":"16868ec5d8f490ac73ea28b4e8fdda55ac149bb1aafb177545b54b84a5ad5367","other":"48de553e15afd3e8a46bfc3a5ba8a298158aa3d60f140d2730230af5cce8084d","up":true},{"one":"178401ec8d01a0a4f551d23e880a8e8a4eb87773565363843d51cf52660b1211","other":"9257dc934dfbf17473b70cb85333c6fab67ee9b6228a646576c4f57253f1004e","up":true},{"one":"7c7ca5a7522a04f62f2bebd6197a03d78f255d0175c3dfceb5d92b684365b2aa","other":"1dc0ef1ce68dc681298177bde808af514efa52a5ad38c9cd2bd61968cdf19cfb","up":true},{"one":"a2a163ce2cb092b411c994cc5d5ef555d539d2dcf4e7e1aeb528d2216dc481e5","other":"ddb8be472c3d48dc4d3d112448e6c0c4a826a18af3f3b53fdfef8cd31053c75f","up":true},{"one":"9f7d72b7d9843872904b841e421985082428fba5010db27dd871ed76630a1e1d","other":"56635699bd3bc78193adbdb8e8b7c2c91dab4140fdaa506fea2300ee86c4ba81","up":true},{"one":"8cc3fb39009d0adc26fca1e2ee96822d168d4debc379fd516c15d4b4a1624231","other":"7e47a2f82984a600c8583605a91d5cb8f2d9a18961845e9c422edd78e20ac3a3","up":true},{"one":"c53417f008e4550e1c4cb9a3e2955b3af6403e059b7b4b4c33869d9ed4a580a5","other":"8ea2c8acc111f38d5b4a5ed60252ee83f312d0f8359265d5b9266d54735052fe","up":true},{"one":"398038811c1c7402fe2e6994c9ce2f15c8166b8e99f379feaaed66ac87702062","other":"c9c302de4afe7b4dcbb6f3e366ce747083f9dcd7d5c6a01b939da5cdc6ccc874","up":true},{"one":"43d43e9ebcbceb4830fc1d2d5024650b90698306bbd2c4d0b4841a1a8fd09c93","other":"8f9aa2cd33d18e7cb4494d11a7532c97eb4a1cae172b2165c26ae4ed24887c0d","up":true},{"one":"244c3c954ac612e51d4945ab9b77f0b4a3983285e8add7921777e0c45a1bf338","other":"d700d96de1193456dc0bcf492c7c11b0951062974af2f7f47b8c901b17c23165","up":true},{"one":"8e7b96d28edae711e1a4cee0d894e0bd92cdf410ba6f61713f7d9b0bee761d4c","other":"9c8e1f23f260c5a46b0001572675b19e5293ca65e7fdfc131c07612e9c4072fa","up":true},{"one":"5ac0d00b8d647dec62d26e1a689fd05b8b7a1a79ab8c43493bd6d7d209816df1","other":"f2b49a2247c9c5e8f6f755834a37fe5c17f208f994878e14b7001e404f52e125","up":true},{"one":"93c0e1adf23fdf1623359eb88c517bc521d5a26325554df890cc04c1fa17a5df","other":"cc3397e9e11f75273d3f81d91f980f4504755f80b27a183212de56cc5085e58d","up":true},{"one":"1addd4a9f01486212e13e43a9650b7f793617d1cb59fb8d941270d7ae55f575f","other":"52a8747e4ea35f6f50c72d7c481616f68a5e4396248332b8ff69d3a772de49ac","up":true},{"one":"318828fa893a28cc0652d3f81d97c5b8e023e853685f5d3e65fde20689abcc5a","other":"dad08999cd2edc33cfdc59ea34c8adcd6a34eaa15f2e85b0622e9848b215c1d5","up":true},{"one":"b3f95f225e2b6b76e6c7ef7c86caf83e35213f6a22da41e653ca1c190be23c9c","other":"9c8e1f23f260c5a46b0001572675b19e5293ca65e7fdfc131c07612e9c4072fa","up":true},{"one":"7049e92a396311fbf2f4a55bb5bd2fe3f7bb3c1a63f41bb88eb800edd45ac6e5","other":"5bd8faf93bcad07006e9426b45f5cc599f1963ab791deac4ff63d6739cd62a17","up":true},{"one":"cf52b3fc82ec24c3e9b40488d7c5f7ac8af731d159a103619bee932ec74d5e92","other":"c42e6492879439eeecd9938d17ff283fd8f5f24206906ca512b4daa4803b78b4","up":true},{"one":"7895b2cb97b473f8893cc70a4421e0f8be1c033b27cd730fa13438b7a8f3fcb5","other":"9f7d72b7d9843872904b841e421985082428fba5010db27dd871ed76630a1e1d","up":true},{"one":"994839e5f3a5b8b23aed84fb029413124af17804b79b0263ec6bfd5aec5dad78","other":"a2e6c900511768c8c9947ab0fa2e73975cf2a4cec7fd15217abdba25c329317e","up":true},{"one":"eebd48b367cbfe94a37c0deb274a697e628074f9560b909e66229c5c76ce68eb","other":"67585dfd87a005bae9bffc2cccb83c69537247c74886b4fa52287f46c796bcb6","up":true},{"one":"aaf051a087a92f874a3f6c7923015e4cffb4bb3ef381c977fd902f21e841d0f4","other":"e2770cef7c1ad312b70d94ca5570e45f324c798a31a93203f505167aeab122b6","up":true},{"one":"be68267d77fb52424227267c665ca1193a010334cac057338aca77b49a4b94da","other":"eebd48b367cbfe94a37c0deb274a697e628074f9560b909e66229c5c76ce68eb","up":true},{"one":"97daf2cbe03c80ce6c4dae39cd071dd93cb32ed245aa9aa77285e12296957ca3","other":"be68267d77fb52424227267c665ca1193a010334cac057338aca77b49a4b94da","up":true},{"one":"2c85f5361b2d5abcf799de50fe58b1ed2006ea18f75823748c33eb7e95b1cc39","other":"3728152c88f1e5e61f6523b09e8f3bb1023b700deccdca5fcc1e6488136b0e57","up":true},{"one":"4d381014783980b2f77f0d71160ad9e9d84672b576f4435ccdbae12752350c1c","other":"6e7f1f3d65364399617a4d95fdd04f2ca9b007b2366943e7ba5acd4616a7a425","up":true},{"one":"6c0142984d629ae6995894de9e7e5eb8d3fe45e1641d7ebd63959d2e61548ba3","other":"46bfa8bea56b0be1abfa5ad3561bb6bf49ed6695d83ee2b2c192c5a0408347cf","up":true},{"one":"bdc5de01276157a0f3fc43a9cc3b41b2cacc8479118b75aec4ba9b2b7fa86d5e","other":"93c0e1adf23fdf1623359eb88c517bc521d5a26325554df890cc04c1fa17a5df","up":true},{"one":"019109311d4888497aa194cce4a89b5ef243421cf0e7e7bb9115d086e1a1f7d7","other":"397a0a0e9fadcb571acd8981f5bfe8e059e707e0feae8a9c4c6bfe87bd39e66a","up":true},{"one":"807416cc70f02d481a188027f7932b48e8f7b5e8258f7e9623f3f6e2985d8f6a","other":"cc3397e9e11f75273d3f81d91f980f4504755f80b27a183212de56cc5085e58d","up":true},{"one":"86d6f68ec0b8e1b3406943787f918bee74dd1827998bdb13ece8f690da2d296a","other":"d3e913cf4a7dabfb5699131b65e533a40adb46ea37e0ed4ce9433f99015986ef","up":true},{"one":"6d3c6db15900f2596286f81cc0664d2c8291ead5bad2aa35bad515af088a2e48","other":"43d43e9ebcbceb4830fc1d2d5024650b90698306bbd2c4d0b4841a1a8fd09c93","up":true},{"one":"9464ad8da1a5effdc0351742dfffae941ffd9fab469637b2491caece53c57dc8","other":"ff75b19017c84128f38dec4f63e1f247a5691dc0fae186e667afedb5fe9d2c80","up":true},{"one":"046ca54165f0dd4d62fd7d8ee9e97c655db3d35f5452a0ccb0dffc79c047978c","other":"c42e6492879439eeecd9938d17ff283fd8f5f24206906ca512b4daa4803b78b4","up":true},{"one":"24f80c437be45898e594f821bba0f5c62e0c9a0c720118e362ee6f78410612bd","other":"2c8042517dfeaa01586e91e491dd4154fb24c0d84fedb0404b9d5136f60da1d9","up":true},{"one":"3f31ecaffaa6311c82c9a575bbc38d6bcb16630ac87e19d1853a64aa96c9dcde","other":"096a8302b6f369c28ed9d47719a507ead8a3cc1ca4fa1e32318b7f97873955fe","up":true},{"one":"56ca9dd846a58a0ffa7b49a88aad559a338ba535a6f738468b8f146c97890cb2","other":"482ec3dc05460579ea9bce87677bd3d9a1930e801fabeba607b8ab6b8729ff15","up":true},{"one":"80735a728720bba0ac08daaccd093370d672a8f9a50845ad78ccd6cf8686c39f","other":"2fd2f77d76cca480ac18e9af7a462f297db168c3370b3bc0e2c04aa006c4d037","up":true},{"one":"5a8b84df651871fce72d11cb1c26c87ae4a0cc6b4c274d37e70532c94f27288e","other":"5d82a418629cfbe7c57105309319ad695a198626fe3571de213a12ddf62f7308","up":true},{"one":"e2d36f335d90ad63148db8e353a78a30d8d9c0abe107be2cf8685f6a01ce74b9","other":"50c1a8023bfecffb09472fdc50898f4d050a31443d40a6c07b629090beb0df3d","up":true},{"one":"0111e720a84b310f863c2530fbe149e6a221acbad01065c5d052d2b3e1716f54","other":"679554b410e415cfcdf1b14ef87759269b2bcaf07f4541122977db3a40091da2","up":true},{"one":"95c0a351fb7aa6683280d159a7b808bfa63f63bff91a1c5936e973b2e5d3954f","other":"6e7f1f3d65364399617a4d95fdd04f2ca9b007b2366943e7ba5acd4616a7a425","up":true},{"one":"59876e7ff9e92243856dad23126e1d38d9a5ddae79772ed1b2bdb91f33a4a4b5","other":"50c1a8023bfecffb09472fdc50898f4d050a31443d40a6c07b629090beb0df3d","up":true},{"one":"bfc711793830779f49aa59bc6f7a205ab4e6eae7abfdafbf3bb5a1163a778ab2","other":"eebd48b367cbfe94a37c0deb274a697e628074f9560b909e66229c5c76ce68eb","up":true},{"one":"7c464054ea7b6c9ea0c7d4c209769c92f294a9db2ca159b8ef168e310a1eac3a","other":"93ea8ef251fd56b159e080cdf733d33e1fdfb3c7ae5bd9a6a328d0bf5458867b","up":true},{"one":"70f68562733da4e3b1c3949fb6e11ac0bdd49ea7e732925f937f87df5af698d6","other":"30feca631f06041cb14cead384dfaa5fffa6dc34b0cee54230efbe15e56a5884","up":true},{"one":"6d5ec591af4966ba024c6b2aeb45e0aab8aa1762f9cac30ce3934da529b738e9","other":"7e47a2f82984a600c8583605a91d5cb8f2d9a18961845e9c422edd78e20ac3a3","up":true},{"one":"140dd212f2b193ee6a9d7fc14f7da321c7ef6fd367fb4f194924fd0ad5d135cc","other":"4cece9bc134bc2b09400c9f7f8a4df9270d2fe3c077c5e441fffc911fcf6f42e","up":true},{"one":"d3022a46956e75bca85ba89d97b694a3a64f03ccc2d881ed0cd687d43d486925","other":"67f383e5334e9b6701d1dbb20876d4ba9a7e578af0476caed4a7e1b701f2bedb","up":true},{"one":"c272b12f4020ae5b20e3d29cd09de03fa0088e3eeb5f07aa7728b29a3e90e687","other":"bcf85ecf421b871fca0247a7081188a8e2c08778b88ffad16db37ef024fec0fc","up":true},{"one":"43c9e1571c460cb9f599fa8ed79ddd0f9c3a21fd2fa455e0603109c55012f76b","other":"a1c85ee75edb807a01f4ce930086c948918aade324752609b078c28991c04e86","up":true},{"one":"b659418885032905ea20ad47d70470e403e7e407e0e9ebf9277f9a2d81ec121c","other":"bea10868d5da506c1801de845c148c2f09761893113ac913fe66674a8f43c178","up":true},{"one":"0e80db9dfa8ce29bedfb2de031622bef8829bee52771322b6a7efb47afe540e7","other":"43d43e9ebcbceb4830fc1d2d5024650b90698306bbd2c4d0b4841a1a8fd09c93","up":true},{"one":"48f1ca6d433019f932fa4ae03e0decbcbea3fe635edff4458a669b83f8162b9a","other":"5a26ae73eebf27f6dbec2414f1277a249e814a7a06790d7061610e5227b086f6","up":true},{"one":"e09f98114da64e7547b351637190f6621a1f75568cfa9960980fc77618f8855b","other":"9c21cb3e56f8ac66a7917a9ba14e58f77e998ac70c178b88b5053d9ac2777e60","up":true},{"one":"4005fd1fa8fbb318b29a62c368ada579e5122ca0578e6a75c509552be4b63b76","other":"648a96d61898eb2d336ff7d5a229cfeb7b9f587282e40f9fe640e181ae26bdd3","up":true},{"one":"8b4318f86ad47976321af97bfbf95cd0a3b0aa22447aeb0611ed1a9bf1e6a4bf","other":"c8ea4177420785926e0929701f5e74c744920386f2a43b89d83c8281106cb95e","up":true},{"one":"05949ec1a582fa70cab95c59e7c0d315583bf9fc320c60c35268931f21e90853","other":"e64d90760cd81e4f112bbf1432e76c82fa4173fd474b988f4096ce187363fd81","up":true},{"one":"6dd3ac0fd9a04a2ce75875c683d135e52eaa1670cb55e78711620712e60fde47","other":"bbafac5ba5915db3c80e28b249cad260b9b5dad1f728063c48fa8f61d7556e17","up":true},{"one":"056152dd9dae85c426378d34acab8d6641da665d2f57359a27a0ff652f3f3d02","other":"1bd588263274543729d54529ae9e9bf4596db40649a1c2a3f73168d818f34b62","up":true},{"one":"a8f49e87156fda5510897601689ce968d77032134c523634916b96de16366f9e","other":"43d43e9ebcbceb4830fc1d2d5024650b90698306bbd2c4d0b4841a1a8fd09c93","up":true},{"one":"305162c472c71ddef2320b138102b67d1ce2b8bba79e2e587fc80e085c88e547","other":"4d381014783980b2f77f0d71160ad9e9d84672b576f4435ccdbae12752350c1c","up":true},{"one":"ec90a22f41ee659d5759a497946ac2991c916f00fe7caeeeb0908f3af1fe60b6","other":"fc3911383f74a982f6af8ab95a63426b56117d45f153b3c1441459d9191daaff","up":true},{"one":"e0a0ba7e7e89a7af805e24abde1a5a5b489ba197585051a8755e8c2345c3d57b","other":"a1c85ee75edb807a01f4ce930086c948918aade324752609b078c28991c04e86","up":true},{"one":"bea10868d5da506c1801de845c148c2f09761893113ac913fe66674a8f43c178","other":"a1c85ee75edb807a01f4ce930086c948918aade324752609b078c28991c04e86","up":true},{"one":"1b1dc3f9312df141855c545dd16aee325f9a609230ec6165bdbbb07d0c0862f6","other":"7895b2cb97b473f8893cc70a4421e0f8be1c033b27cd730fa13438b7a8f3fcb5","up":true},{"one":"4d9147e3bf98cb59a7648f616c0d7f713a8cf3b7d25e3115233ff5883128beab","other":"447cdbf1ff462aa67d6a46085b1a84fdc495a4142ab174c8e69b271b09732b4d","up":true},{"one":"7d162a11662585f8c38d88fb241623e67bacf90703065dae6c092b4b507d6543","other":"79e5c6c6d78c88c579003cda044882ecb04520fbad1f5feadbe7b6d23fe183c8","up":true},{"one":"ba911175d3aa3fcc266e2a5aa32fb706208b8a9b5021a5f37c0b85f547eb375d","other":"cdb13873ac058861f295ebca5d958bf2bb793e3f9e274cf5a73a633425a9276f","up":true},{"one":"096a8302b6f369c28ed9d47719a507ead8a3cc1ca4fa1e32318b7f97873955fe","other":"056152dd9dae85c426378d34acab8d6641da665d2f57359a27a0ff652f3f3d02","up":true},{"one":"84a9db7645c792dc38c1f2113a8f0590d04e1c94d9a8c464ab0ec8219303d966","other":"8e7b96d28edae711e1a4cee0d894e0bd92cdf410ba6f61713f7d9b0bee761d4c","up":true},{"one":"32ff1969d90aaa5a8ed2260968a8e2bac2d1cae597c906f90495f1dc5de7f8d3","other":"244c3c954ac612e51d4945ab9b77f0b4a3983285e8add7921777e0c45a1bf338","up":true},{"one":"c96146ee47ec7cd74551cf74f00213bc337d643c4327393f0e6848ecd4a0f8d3","other":"793322608055d4873776a9a0a6c40b04379bfd2f289a8ad49a7dc456bc65f871","up":true},{"one":"fc514c43c4eb5c62798458da5d622e9248a6e530e4288cd902019aa05c4374d8","other":"f645aab9cb2bd2709998b38e5789c9c5f68d40765e6cbd93b92e6383eb671dba","up":true},{"one":"8ea2c8acc111f38d5b4a5ed60252ee83f312d0f8359265d5b9266d54735052fe","other":"bdc5de01276157a0f3fc43a9cc3b41b2cacc8479118b75aec4ba9b2b7fa86d5e","up":true},{"one":"08f84878e44fed2adb4b2685b9f293dc3c73d5f9bc1c474870d943ec2ae73dbe","other":"36b93656cab02213fa76124af6251109356abc5e0ae5dd1e203c6a013e014548","up":true},{"one":"6b4ee1b73942ced78f97c0d0e221209933e63ae7353bb9ab3d37ac4127592e86","other":"885427318634c458a3050f2f26eb52454a75cea4a1263b9ed55e6eb899743854","up":true},{"one":"f9ded7b83e473e71be2fc0101d574c44521c96f77f9f84a384785a3af6b1093d","other":"be68267d77fb52424227267c665ca1193a010334cac057338aca77b49a4b94da","up":true},{"one":"a6165a4b02d58be116892982c0ed3d49d86fec0e9f436a516b61868331ed853f","other":"d3e913cf4a7dabfb5699131b65e533a40adb46ea37e0ed4ce9433f99015986ef","up":true},{"one":"9b8e6bb3a7fe4dc65ac97404e546d8b777d068c94bc2355f4f1a510ad6c11905","other":"af02c2f471e96ab8defbd229215695b95e64f7c78b145b6793a238961f556fbf","up":true},{"one":"c9c302de4afe7b4dcbb6f3e366ce747083f9dcd7d5c6a01b939da5cdc6ccc874","other":"af02c2f471e96ab8defbd229215695b95e64f7c78b145b6793a238961f556fbf","up":true},{"one":"a2a163ce2cb092b411c994cc5d5ef555d539d2dcf4e7e1aeb528d2216dc481e5","other":"d9cf19895e015cb534d915aed83c0d26bf40a11244027812e17c3bec6e645a8e","up":true},{"one":"67909bdcaef2330ef120e524c76e1e382b474f3332d86f65282028e051f34c75","other":"035f15499cdb0f079b3e358ad54a6122681442a5293c3ae2fdf6c527004b36d2","up":true},{"one":"ab3ff955033c0a2615932faf85fd20090b9121c7edcc8e6f7ce4c4fde0a96b8a","other":"a2a163ce2cb092b411c994cc5d5ef555d539d2dcf4e7e1aeb528d2216dc481e5","up":true},{"one":"4b79e83186f2ab05932eaa99982a2e53373b83780e32d224d15cb2c85462451f","other":"4005fd1fa8fbb318b29a62c368ada579e5122ca0578e6a75c509552be4b63b76","up":true},{"one":"5ff09c6859736aad7a82a3bfb3f1a1a8b3c0d58f831863540d9c3013dd35745e","other":"16868ec5d8f490ac73ea28b4e8fdda55ac149bb1aafb177545b54b84a5ad5367","up":true},{"one":"885427318634c458a3050f2f26eb52454a75cea4a1263b9ed55e6eb899743854","other":"be68267d77fb52424227267c665ca1193a010334cac057338aca77b49a4b94da","up":true},{"one":"244c3c954ac612e51d4945ab9b77f0b4a3983285e8add7921777e0c45a1bf338","other":"e0a0ba7e7e89a7af805e24abde1a5a5b489ba197585051a8755e8c2345c3d57b","up":true},{"one":"bcf85ecf421b871fca0247a7081188a8e2c08778b88ffad16db37ef024fec0fc","other":"9f7d72b7d9843872904b841e421985082428fba5010db27dd871ed76630a1e1d","up":true},{"one":"447a411c80fbd422bfa0c358d3f2a1fe6256c05e35acc6350958dfbe62cd5b9b","other":"67f383e5334e9b6701d1dbb20876d4ba9a7e578af0476caed4a7e1b701f2bedb","up":true},{"one":"81a5a07f92f813e85b501b0028e1caa6e6a6c7efa5195ecb693cd2d91d5132a0","other":"a0c88ba70599b0e72c18fa6aedd14d607cca3e9a49a5d50165d084e70328c2dd","up":true},{"one":"aceee75a260d45252060fe971eabd4bde25f912db4a3c6e47f4a09572fe01697","other":"a3309f8b8bba4d8fbd7c6193d7671cb907b94e71155ef6138e0248682ff00e58","up":true},{"one":"d408bb6f7af1590e1f162ce02cc016b1b86ede29851caa32434212ffa2a377c8","other":"d9cf19895e015cb534d915aed83c0d26bf40a11244027812e17c3bec6e645a8e","up":true},{"one":"08bd1e049859b4a7c8078ca9741fe3daa668b9fe478da06d1a435cd5566b3e11","other":"178401ec8d01a0a4f551d23e880a8e8a4eb87773565363843d51cf52660b1211","up":true},{"one":"741a854ae299df49a738725bc58abe614e5e4302ffecd8320bbede8412d160c0","other":"178401ec8d01a0a4f551d23e880a8e8a4eb87773565363843d51cf52660b1211","up":true},{"one":"8e282b0f27d4fa56fe14cfeb69fac5a53e3d882c7778eb190653e2eab7c93fd2","other":"a4ee49bb2caabb6b9448bcdff1fc3cc673a2db04eab9f5c62d1787f2c25990a0","up":true},{"one":"4a95d49f58057b039b55a34f67a348c052f61770065e41243ff055efc570a935","other":"5a26ae73eebf27f6dbec2414f1277a249e814a7a06790d7061610e5227b086f6","up":true},{"one":"34118166845c185d15c286b7e5433539ee98ed634baabd534d57369fd5f7c681","other":"32ff1969d90aaa5a8ed2260968a8e2bac2d1cae597c906f90495f1dc5de7f8d3","up":true},{"one":"5bd8faf93bcad07006e9426b45f5cc599f1963ab791deac4ff63d6739cd62a17","other":"7ce7fec833a2e8c7720fcc97f820f2ca2aca85388210f887c3efe78b020766e7","up":true},{"one":"a8ff8d69dcb36462d1116dafa5e3d0c7237bf65dbece482a316862c8d66e35b6","other":"b78fd21c063006e2e033d1d00fc21e1ad7ad7951bb5621cec9b56639745d65f9","up":true},{"one":"094256812084c6052a2604149aa3aba2379c483bf4ec25162f6b43934942775a","other":"50c1a8023bfecffb09472fdc50898f4d050a31443d40a6c07b629090beb0df3d","up":true},{"one":"2c85f5361b2d5abcf799de50fe58b1ed2006ea18f75823748c33eb7e95b1cc39","other":"741a854ae299df49a738725bc58abe614e5e4302ffecd8320bbede8412d160c0","up":true},{"one":"07f5d094a4b22e73cdd6c85452b3d928da9b4b16873824759cb7e8a622417fd5","other":"7c464054ea7b6c9ea0c7d4c209769c92f294a9db2ca159b8ef168e310a1eac3a","up":true},{"one":"ff75b19017c84128f38dec4f63e1f247a5691dc0fae186e667afedb5fe9d2c80","other":"e8676d17966625c4fdac6bd9437981a0cf869c8b0010812edf0c79805e0e1ff1","up":true},{"one":"aeb45fe10b0dbd0f72ab6a77fbf971a8f46dbcdd96c08f23279d1434b4f38b1d","other":"a0c88ba70599b0e72c18fa6aedd14d607cca3e9a49a5d50165d084e70328c2dd","up":true},{"one":"48d79ac55f8df512af8e7d868aa40ac9b61493fa4f1b0ce0b76bf6da2eb30e78","other":"5c373034770e413e700b1cd03b2035f769ecd9ab8eb54d32f7b2645be1991fe5","up":true},{"one":"5814be13c8550b9a5a83d08e7af6022002a8fdaa38ba6c2c30be58099a9f7744","other":"7895b2cb97b473f8893cc70a4421e0f8be1c033b27cd730fa13438b7a8f3fcb5","up":true},{"one":"9ec831d97418916fd9695465e041caf27824dbb51d6ff74d6b70f3bd561e70e6","other":"8ea2c8acc111f38d5b4a5ed60252ee83f312d0f8359265d5b9266d54735052fe","up":true},{"one":"1bd588263274543729d54529ae9e9bf4596db40649a1c2a3f73168d818f34b62","other":"c96146ee47ec7cd74551cf74f00213bc337d643c4327393f0e6848ecd4a0f8d3","up":true},{"one":"793322608055d4873776a9a0a6c40b04379bfd2f289a8ad49a7dc456bc65f871","other":"7c464054ea7b6c9ea0c7d4c209769c92f294a9db2ca159b8ef168e310a1eac3a","up":true},{"one":"2e65d05648b798fafbc9bb582c05e6f8f891131260e8c90ca725ddcbc823f315","other":"24f80c437be45898e594f821bba0f5c62e0c9a0c720118e362ee6f78410612bd","up":true},{"one":"3728152c88f1e5e61f6523b09e8f3bb1023b700deccdca5fcc1e6488136b0e57","other":"7660828fb0c8f89201d34e6f4d61cc6ba9a30cead6e4eb8253f6cc92e1845f23","up":true},{"one":"7c464054ea7b6c9ea0c7d4c209769c92f294a9db2ca159b8ef168e310a1eac3a","other":"dad08999cd2edc33cfdc59ea34c8adcd6a34eaa15f2e85b0622e9848b215c1d5","up":true},{"one":"951877b34ee1535b5059c49beb03e8960ff9c12b694ef64708c77c30ff1dc706","other":"8862cd85d7039119b984f752a458ac0495ddea98c69fc1d1241db7873a712c11","up":true},{"one":"4cece9bc134bc2b09400c9f7f8a4df9270d2fe3c077c5e441fffc911fcf6f42e","other":"447cdbf1ff462aa67d6a46085b1a84fdc495a4142ab174c8e69b271b09732b4d","up":true},{"one":"da36d1df95a158b0d3f9e7407d663a6b611dde0a77f00a584b97a939ab6a00de","other":"eb686a686fd70e41659cc69ec0db53d1512dfec238918afd0a515d8ce177d4d9","up":true},{"one":"56635699bd3bc78193adbdb8e8b7c2c91dab4140fdaa506fea2300ee86c4ba81","other":"7895b2cb97b473f8893cc70a4421e0f8be1c033b27cd730fa13438b7a8f3fcb5","up":true},{"one":"178401ec8d01a0a4f551d23e880a8e8a4eb87773565363843d51cf52660b1211","other":"0e3b7722f3f84d83b3d744bea4e893715a01d4df3cf4a1c6a6823a1f5c9ad6b8","up":true},{"one":"397a0a0e9fadcb571acd8981f5bfe8e059e707e0feae8a9c4c6bfe87bd39e66a","other":"31e670638acba3d58f4c67f3ff2f3f25d769e8a5d7a7838927f4d9d169a84404","up":true},{"one":"5ac0d00b8d647dec62d26e1a689fd05b8b7a1a79ab8c43493bd6d7d209816df1","other":"9b8e6bb3a7fe4dc65ac97404e546d8b777d068c94bc2355f4f1a510ad6c11905","up":true},{"one":"7c7ca5a7522a04f62f2bebd6197a03d78f255d0175c3dfceb5d92b684365b2aa","other":"67909bdcaef2330ef120e524c76e1e382b474f3332d86f65282028e051f34c75","up":true},{"one":"c6a8220726243cceaa6f2cebdac857a05efe721323f0a064c7f85a8340d3da96","other":"97daf2cbe03c80ce6c4dae39cd071dd93cb32ed245aa9aa77285e12296957ca3","up":true},{"one":"59876e7ff9e92243856dad23126e1d38d9a5ddae79772ed1b2bdb91f33a4a4b5","other":"3938e6b2c095084dc9975a3e8649133557495d34ac6df874c6d929266e3ffe6f","up":true},{"one":"b5eab4869b4cb65bdc1e5cab45c03016d202f9f5b668be50066451cfcf9ef299","other":"0e80db9dfa8ce29bedfb2de031622bef8829bee52771322b6a7efb47afe540e7","up":true},{"one":"ab719e60a77ba5253f1690c920df9dd9f3a62071e9cce9d62e0001a522b3409e","other":"e6812448728b4bda5962adceb1707b29f661d3d1a6b2ccd5f8183c9a1f4d01b6","up":true},{"one":"f8ff7440d6f4abb1c89496336843741ed53a544cedeeed71d8ebe0b08698438d","other":"97daf2cbe03c80ce6c4dae39cd071dd93cb32ed245aa9aa77285e12296957ca3","up":true},{"one":"807416cc70f02d481a188027f7932b48e8f7b5e8258f7e9623f3f6e2985d8f6a","other":"eb686a686fd70e41659cc69ec0db53d1512dfec238918afd0a515d8ce177d4d9","up":true},{"one":"52a8747e4ea35f6f50c72d7c481616f68a5e4396248332b8ff69d3a772de49ac","other":"447a411c80fbd422bfa0c358d3f2a1fe6256c05e35acc6350958dfbe62cd5b9b","up":true},{"one":"c190f9d08c78ed6dffadaef36e77fe6aa96099e4453753b0cfc8ec542fa96b9d","other":"6d3c6db15900f2596286f81cc0664d2c8291ead5bad2aa35bad515af088a2e48","up":true},{"one":"3c5b2e125020c80e3674df9cac34de4d8f3a94ee02556fb557921b6d5498b933","other":"298ae5d173c5360bc9ad5b492ed35de3b6e0cae868a34bfe6311a8ba5ea9877e","up":true},{"one":"8402bd62282811ed236b2fa1f0d41ad4bbe54e420ee34adc6164cfd4baf8658d","other":"ff75b19017c84128f38dec4f63e1f247a5691dc0fae186e667afedb5fe9d2c80","up":true},{"one":"1dc0ef1ce68dc681298177bde808af514efa52a5ad38c9cd2bd61968cdf19cfb","other":"035f15499cdb0f079b3e358ad54a6122681442a5293c3ae2fdf6c527004b36d2","up":true},{"one":"b659418885032905ea20ad47d70470e403e7e407e0e9ebf9277f9a2d81ec121c","other":"9f7d72b7d9843872904b841e421985082428fba5010db27dd871ed76630a1e1d","up":true},{"one":"87a337622455ae65daf3ab2555cee8985e9aa14bac245545d985296060e4a8de","other":"86d6f68ec0b8e1b3406943787f918bee74dd1827998bdb13ece8f690da2d296a","up":true},{"one":"84a9db7645c792dc38c1f2113a8f0590d04e1c94d9a8c464ab0ec8219303d966","other":"7e47a2f82984a600c8583605a91d5cb8f2d9a18961845e9c422edd78e20ac3a3","up":true},{"one":"a7a856a43293aa3004848a86f187e09343bd605e1a93e853a6f6b6b1031bd667","other":"b6dffac4b4eb2974ed0ed241799f97d2e5d9be671e311266826d0dcfecfcc209","up":true},{"one":"e471efbcf1def3915b3dda2dc65a86945c607be54a33e31e9625549becac0e34","other":"f215bc09268e60ebbec76f743bebd09d7e72d4cbeedc0b9d3417bb4a2ef42935","up":true},{"one":"a9700308516c02cf9aea8809000a4e0596d6b44753e10bd0928df83e2eb9b9e7","other":"a6165a4b02d58be116892982c0ed3d49d86fec0e9f436a516b61868331ed853f","up":true},{"one":"48b850974575ca57a3cc5f9a4cf5aafd8688cb32b993f69983ece63258ff876e","other":"e6812448728b4bda5962adceb1707b29f661d3d1a6b2ccd5f8183c9a1f4d01b6","up":true},{"one":"a606c79a018a6535375d851fcc82c42cc7c952720aa120434cedccf4a4be1f59","other":"cd6c8b42a0b092f41e6925577c9de7d1bea17231bcb3d08f3d3cce9c6fdcf22d","up":true},{"one":"0e3b7722f3f84d83b3d744bea4e893715a01d4df3cf4a1c6a6823a1f5c9ad6b8","other":"14849f811af20ce19fb29417d20c15fc16da1e45aebdf795a2c6ccb671e4bdac","up":true},{"one":"93c0e1adf23fdf1623359eb88c517bc521d5a26325554df890cc04c1fa17a5df","other":"9464ad8da1a5effdc0351742dfffae941ffd9fab469637b2491caece53c57dc8","up":true},{"one":"8cc3fb39009d0adc26fca1e2ee96822d168d4debc379fd516c15d4b4a1624231","other":"6c0142984d629ae6995894de9e7e5eb8d3fe45e1641d7ebd63959d2e61548ba3","up":true},{"one":"46bfa8bea56b0be1abfa5ad3561bb6bf49ed6695d83ee2b2c192c5a0408347cf","other":"7660828fb0c8f89201d34e6f4d61cc6ba9a30cead6e4eb8253f6cc92e1845f23","up":true},{"one":"8862cd85d7039119b984f752a458ac0495ddea98c69fc1d1241db7873a712c11","other":"9c8e1f23f260c5a46b0001572675b19e5293ca65e7fdfc131c07612e9c4072fa","up":true},{"one":"f9ded7b83e473e71be2fc0101d574c44521c96f77f9f84a384785a3af6b1093d","other":"f8ff7440d6f4abb1c89496336843741ed53a544cedeeed71d8ebe0b08698438d","up":true},{"one":"7660828fb0c8f89201d34e6f4d61cc6ba9a30cead6e4eb8253f6cc92e1845f23","other":"648a96d61898eb2d336ff7d5a229cfeb7b9f587282e40f9fe640e181ae26bdd3","up":true},{"one":"9f7d72b7d9843872904b841e421985082428fba5010db27dd871ed76630a1e1d","other":"8d192b11538072db750f71204e2e6adf9dc0508d9c5cf1eb457e4e996cd985bc","up":true},{"one":"cf52b3fc82ec24c3e9b40488d7c5f7ac8af731d159a103619bee932ec74d5e92","other":"c8ea4177420785926e0929701f5e74c744920386f2a43b89d83c8281106cb95e","up":true},{"one":"0111e720a84b310f863c2530fbe149e6a221acbad01065c5d052d2b3e1716f54","other":"031450ec20f353435b429b5fa64f616d07c9d586afabc7a2772e05ad5c88bf50","up":true},{"one":"26acc3c373c29150af30bbc9264d0c44c7c606ff7377399ddf844635e97afcfa","other":"2c8042517dfeaa01586e91e491dd4154fb24c0d84fedb0404b9d5136f60da1d9","up":true},{"one":"7850f5ee5048959559b3af0f95689669b250fc3aa58bcc9544dca61ca9c9769c","other":"60c5647aed152609979366fb33dc8b28fc60736098ff68d232415889b43dfa58","up":true},{"one":"09b3fa30780931e18b92c75d1cdeafa365609c565e4e8c253d393835cb82d98e","other":"397a0a0e9fadcb571acd8981f5bfe8e059e707e0feae8a9c4c6bfe87bd39e66a","up":true},{"one":"c8c8a93779ec4d9ac40925e8208478a00ee27fc220ddd73d8774cf6bfa255c46","other":"c6a8220726243cceaa6f2cebdac857a05efe721323f0a064c7f85a8340d3da96","up":true},{"one":"6d3c6db15900f2596286f81cc0664d2c8291ead5bad2aa35bad515af088a2e48","other":"6dd3ac0fd9a04a2ce75875c683d135e52eaa1670cb55e78711620712e60fde47","up":true},{"one":"955da15edae50a4c68bc8c579b9799d55f41b7c2a6178f645f79d772e0116662","other":"8d192b11538072db750f71204e2e6adf9dc0508d9c5cf1eb457e4e996cd985bc","up":true},{"one":"7895b2cb97b473f8893cc70a4421e0f8be1c033b27cd730fa13438b7a8f3fcb5","other":"50c1a8023bfecffb09472fdc50898f4d050a31443d40a6c07b629090beb0df3d","up":true},{"one":"aceee75a260d45252060fe971eabd4bde25f912db4a3c6e47f4a09572fe01697","other":"a0c88ba70599b0e72c18fa6aedd14d607cca3e9a49a5d50165d084e70328c2dd","up":true},{"one":"bcf85ecf421b871fca0247a7081188a8e2c08778b88ffad16db37ef024fec0fc","other":"9ec831d97418916fd9695465e041caf27824dbb51d6ff74d6b70f3bd561e70e6","up":true},{"one":"025de1d2ec529d3a7da302eef0f8c54996616d40c940c0956d470ffc2a007f33","other":"178401ec8d01a0a4f551d23e880a8e8a4eb87773565363843d51cf52660b1211","up":true},{"one":"30feca631f06041cb14cead384dfaa5fffa6dc34b0cee54230efbe15e56a5884","other":"0d1c35c6ea485cb33857b790ee262f974cf0d54cf8ce3003f8308ac2e87c2c25","up":true},{"one":"a6165a4b02d58be116892982c0ed3d49d86fec0e9f436a516b61868331ed853f","other":"eb686a686fd70e41659cc69ec0db53d1512dfec238918afd0a515d8ce177d4d9","up":true},{"one":"18e00a7e0f826a1aba3f8c0f533ed905f2eee607b697fff056ee7874d374adcd","other":"31e670638acba3d58f4c67f3ff2f3f25d769e8a5d7a7838927f4d9d169a84404","up":true},{"one":"08e5a268f397385c69a7fec855ae4d889cfa98afef5b7c09fc4841e3f8894ad8","other":"2c85f5361b2d5abcf799de50fe58b1ed2006ea18f75823748c33eb7e95b1cc39","up":true},{"one":"e2d36f335d90ad63148db8e353a78a30d8d9c0abe107be2cf8685f6a01ce74b9","other":"f1ed9d45622ff974a1e396cd878b2deb89e31aa5d08da773423f292ae8dbcbb6","up":true},{"one":"a3309f8b8bba4d8fbd7c6193d7671cb907b94e71155ef6138e0248682ff00e58","other":"aeb45fe10b0dbd0f72ab6a77fbf971a8f46dbcdd96c08f23279d1434b4f38b1d","up":true},{"one":"a1c85ee75edb807a01f4ce930086c948918aade324752609b078c28991c04e86","other":"b4a1b687fbdb754fd689e26f0870a7dcab5d76190c06f3ea2ea1e198f8aa5ab2","up":true},{"one":"a32749dc4e134a4fbb038618c58a7c05bbbaa06f1436de3754341af86402581b","other":"ec90a22f41ee659d5759a497946ac2991c916f00fe7caeeeb0908f3af1fe60b6","up":true},{"one":"ef99b6cdc05345a1ee82267890e3ccaeef1f2bd2fe7ae8b02b6b20b9a5ef85bb","other":"f215bc09268e60ebbec76f743bebd09d7e72d4cbeedc0b9d3417bb4a2ef42935","up":true},{"one":"14849f811af20ce19fb29417d20c15fc16da1e45aebdf795a2c6ccb671e4bdac","other":"178401ec8d01a0a4f551d23e880a8e8a4eb87773565363843d51cf52660b1211","up":true},{"one":"c53417f008e4550e1c4cb9a3e2955b3af6403e059b7b4b4c33869d9ed4a580a5","other":"87a337622455ae65daf3ab2555cee8985e9aa14bac245545d985296060e4a8de","up":true},{"one":"a5053958f0cefcff1826bf02525fda98c4dc954cc38690f3c43ecbf0b2ad57af","other":"95c0a351fb7aa6683280d159a7b808bfa63f63bff91a1c5936e973b2e5d3954f","up":true},{"one":"fa240411bc4f3e44dfca3faedd112c7743a67b522a910bc99696ef0b31732ee2","other":"a4ee49bb2caabb6b9448bcdff1fc3cc673a2db04eab9f5c62d1787f2c25990a0","up":true},{"one":"08bd1e049859b4a7c8078ca9741fe3daa668b9fe478da06d1a435cd5566b3e11","other":"36b93656cab02213fa76124af6251109356abc5e0ae5dd1e203c6a013e014548","up":true},{"one":"9ca1fd5d41975acb905f337997922849b4070360e47849bb4fd8cd1b9ddb4d73","other":"244c3c954ac612e51d4945ab9b77f0b4a3983285e8add7921777e0c45a1bf338","up":true},{"one":"046ca54165f0dd4d62fd7d8ee9e97c655db3d35f5452a0ccb0dffc79c047978c","other":"ef99b6cdc05345a1ee82267890e3ccaeef1f2bd2fe7ae8b02b6b20b9a5ef85bb","up":true},{"one":"5c7c15798e86fe794bb201614d46366ea96dc51091f5b19f149995e0d40df0a6","other":"67909bdcaef2330ef120e524c76e1e382b474f3332d86f65282028e051f34c75","up":true},{"one":"d20931ce3da972fd23ea306e5c604a1fbd9417ba02654c5cdbe278fe259f75d5","other":"f8ff7440d6f4abb1c89496336843741ed53a544cedeeed71d8ebe0b08698438d","up":true},{"one":"4b79e83186f2ab05932eaa99982a2e53373b83780e32d224d15cb2c85462451f","other":"51440ab47fc5076c00cad16a542b846c26b3281ecea4dbca795ae9b80183ec90","up":true},{"one":"9f0e2bf8a962156c9e0a83c3d42ad3dc5ac5c3e508f24200bfb151aad4e395ff","other":"bfc711793830779f49aa59bc6f7a205ab4e6eae7abfdafbf3bb5a1163a778ab2","up":true},{"one":"4d381014783980b2f77f0d71160ad9e9d84672b576f4435ccdbae12752350c1c","other":"5a8b84df651871fce72d11cb1c26c87ae4a0cc6b4c274d37e70532c94f27288e","up":true},{"one":"bea10868d5da506c1801de845c148c2f09761893113ac913fe66674a8f43c178","other":"a7a856a43293aa3004848a86f187e09343bd605e1a93e853a6f6b6b1031bd667","up":true},{"one":"24f80c437be45898e594f821bba0f5c62e0c9a0c720118e362ee6f78410612bd","other":"2fd2f77d76cca480ac18e9af7a462f297db168c3370b3bc0e2c04aa006c4d037","up":true},{"one":"482ec3dc05460579ea9bce87677bd3d9a1930e801fabeba607b8ab6b8729ff15","other":"48de553e15afd3e8a46bfc3a5ba8a298158aa3d60f140d2730230af5cce8084d","up":true},{"one":"a0c88ba70599b0e72c18fa6aedd14d607cca3e9a49a5d50165d084e70328c2dd","other":"80d7e892bbb26808abb1d1530077fec6b08768c151a9f220881da3c862bae0af","up":true},{"one":"994839e5f3a5b8b23aed84fb029413124af17804b79b0263ec6bfd5aec5dad78","other":"a4ee49bb2caabb6b9448bcdff1fc3cc673a2db04eab9f5c62d1787f2c25990a0","up":true},{"one":"1070df5e904e3865085b0319a81761e59146494c689e7567efe7465fc819ae8b","other":"046ca54165f0dd4d62fd7d8ee9e97c655db3d35f5452a0ccb0dffc79c047978c","up":true},{"one":"3b020c84fb60f59779324d451d9770d683e08133bbaa2d5762f61b8fd4b8d9fd","other":"80d7e892bbb26808abb1d1530077fec6b08768c151a9f220881da3c862bae0af","up":true},{"one":"67f383e5334e9b6701d1dbb20876d4ba9a7e578af0476caed4a7e1b701f2bedb","other":"67585dfd87a005bae9bffc2cccb83c69537247c74886b4fa52287f46c796bcb6","up":true},{"one":"a8b58013ff911871d1aa6c2bbea6c2e6ef9b00b87b80a41dc04724ad0488e2ff","other":"bdc5de01276157a0f3fc43a9cc3b41b2cacc8479118b75aec4ba9b2b7fa86d5e","up":true},{"one":"138dbc1662c4ce9b2b30ef5035914cc70465666fe18f313318e662d13f099621","other":"1dc0ef1ce68dc681298177bde808af514efa52a5ad38c9cd2bd61968cdf19cfb","up":true},{"one":"094256812084c6052a2604149aa3aba2379c483bf4ec25162f6b43934942775a","other":"1b1dc3f9312df141855c545dd16aee325f9a609230ec6165bdbbb07d0c0862f6","up":true},{"one":"eb686a686fd70e41659cc69ec0db53d1512dfec238918afd0a515d8ce177d4d9","other":"ff75b19017c84128f38dec4f63e1f247a5691dc0fae186e667afedb5fe9d2c80","up":true},{"one":"9464ad8da1a5effdc0351742dfffae941ffd9fab469637b2491caece53c57dc8","other":"c603138e40fe2f85cc634017956ada6399fca99969e3bf0c1ee8428374e779f1","up":true},{"one":"56ca9dd846a58a0ffa7b49a88aad559a338ba535a6f738468b8f146c97890cb2","other":"5ff09c6859736aad7a82a3bfb3f1a1a8b3c0d58f831863540d9c3013dd35745e","up":true},{"one":"fc514c43c4eb5c62798458da5d622e9248a6e530e4288cd902019aa05c4374d8","other":"a4ee49bb2caabb6b9448bcdff1fc3cc673a2db04eab9f5c62d1787f2c25990a0","up":true},{"one":"e09f98114da64e7547b351637190f6621a1f75568cfa9960980fc77618f8855b","other":"9ec831d97418916fd9695465e041caf27824dbb51d6ff74d6b70f3bd561e70e6","up":true},{"one":"648a96d61898eb2d336ff7d5a229cfeb7b9f587282e40f9fe640e181ae26bdd3","other":"679554b410e415cfcdf1b14ef87759269b2bcaf07f4541122977db3a40091da2","up":true},{"one":"b4a1b687fbdb754fd689e26f0870a7dcab5d76190c06f3ea2ea1e198f8aa5ab2","other":"0e80db9dfa8ce29bedfb2de031622bef8829bee52771322b6a7efb47afe540e7","up":true},{"one":"8358a74fc8d8e39ccc40b4d3a212b7a69a6a8f6afc25cff2c9c7b44bbaf9ec82","other":"1dc0ef1ce68dc681298177bde808af514efa52a5ad38c9cd2bd61968cdf19cfb","up":true},{"one":"08f84878e44fed2adb4b2685b9f293dc3c73d5f9bc1c474870d943ec2ae73dbe","other":"2c85f5361b2d5abcf799de50fe58b1ed2006ea18f75823748c33eb7e95b1cc39","up":true},{"one":"1049d321a450726cf39d1d7cea1c108be3bec137a644b62cdc73a853f5a5a22b","other":"fa240411bc4f3e44dfca3faedd112c7743a67b522a910bc99696ef0b31732ee2","up":true},{"one":"b78fd21c063006e2e033d1d00fc21e1ad7ad7951bb5621cec9b56639745d65f9","other":"c96146ee47ec7cd74551cf74f00213bc337d643c4327393f0e6848ecd4a0f8d3","up":true},{"one":"6c0142984d629ae6995894de9e7e5eb8d3fe45e1641d7ebd63959d2e61548ba3","other":"447a411c80fbd422bfa0c358d3f2a1fe6256c05e35acc6350958dfbe62cd5b9b","up":true},{"one":"f7561cb6740e17ec7c7d17068251b2c951d954c77804aa5af60464e9c3964e57","other":"c42e6492879439eeecd9938d17ff283fd8f5f24206906ca512b4daa4803b78b4","up":true},{"one":"51440ab47fc5076c00cad16a542b846c26b3281ecea4dbca795ae9b80183ec90","other":"4005fd1fa8fbb318b29a62c368ada579e5122ca0578e6a75c509552be4b63b76","up":true},{"one":"31e670638acba3d58f4c67f3ff2f3f25d769e8a5d7a7838927f4d9d169a84404","other":"05949ec1a582fa70cab95c59e7c0d315583bf9fc320c60c35268931f21e90853","up":true},{"one":"5a26ae73eebf27f6dbec2414f1277a249e814a7a06790d7061610e5227b086f6","other":"44adaabf9c46608a374ed816d3c40c63b6645f4f6e033a76431bc8f88713eb41","up":true},{"one":"a7a856a43293aa3004848a86f187e09343bd605e1a93e853a6f6b6b1031bd667","other":"b4a1b687fbdb754fd689e26f0870a7dcab5d76190c06f3ea2ea1e198f8aa5ab2","up":true},{"one":"ab719e60a77ba5253f1690c920df9dd9f3a62071e9cce9d62e0001a522b3409e","other":"e2770cef7c1ad312b70d94ca5570e45f324c798a31a93203f505167aeab122b6","up":true},{"one":"b659418885032905ea20ad47d70470e403e7e407e0e9ebf9277f9a2d81ec121c","other":"a1c85ee75edb807a01f4ce930086c948918aade324752609b078c28991c04e86","up":true},{"one":"ab3ff955033c0a2615932faf85fd20090b9121c7edcc8e6f7ce4c4fde0a96b8a","other":"a4ee49bb2caabb6b9448bcdff1fc3cc673a2db04eab9f5c62d1787f2c25990a0","up":true},{"one":"aaf051a087a92f874a3f6c7923015e4cffb4bb3ef381c977fd902f21e841d0f4","other":"da36d1df95a158b0d3f9e7407d663a6b611dde0a77f00a584b97a939ab6a00de","up":true},{"one":"05949ec1a582fa70cab95c59e7c0d315583bf9fc320c60c35268931f21e90853","other":"3a628ef171c1f26fa0966eb89210be0a14305aae8bfed10f4ed9017698f40f4b","up":true},{"one":"b5eab4869b4cb65bdc1e5cab45c03016d202f9f5b668be50066451cfcf9ef299","other":"af02c2f471e96ab8defbd229215695b95e64f7c78b145b6793a238961f556fbf","up":true},{"one":"80d7e892bbb26808abb1d1530077fec6b08768c151a9f220881da3c862bae0af","other":"aceee75a260d45252060fe971eabd4bde25f912db4a3c6e47f4a09572fe01697","up":true},{"one":"035f15499cdb0f079b3e358ad54a6122681442a5293c3ae2fdf6c527004b36d2","other":"1fd0192df1fbf33771ca575afbb4e27c6541cce4a3cff2dfc1f2c085e7fab79e","up":true},{"one":"48de553e15afd3e8a46bfc3a5ba8a298158aa3d60f140d2730230af5cce8084d","other":"5ff09c6859736aad7a82a3bfb3f1a1a8b3c0d58f831863540d9c3013dd35745e","up":true},{"one":"eebd48b367cbfe94a37c0deb274a697e628074f9560b909e66229c5c76ce68eb","other":"dad08999cd2edc33cfdc59ea34c8adcd6a34eaa15f2e85b0622e9848b215c1d5","up":true},{"one":"7660828fb0c8f89201d34e6f4d61cc6ba9a30cead6e4eb8253f6cc92e1845f23","other":"c603138e40fe2f85cc634017956ada6399fca99969e3bf0c1ee8428374e779f1","up":true},{"one":"1dec77c2f4caf053c2d0524ae34a2d970bf4743a0d009d8fc543077ddfdfe3d0","other":"e8676d17966625c4fdac6bd9437981a0cf869c8b0010812edf0c79805e0e1ff1","up":true},{"one":"140dd212f2b193ee6a9d7fc14f7da321c7ef6fd367fb4f194924fd0ad5d135cc","other":"435d721a568eb906a03c69dbd71337251a550521a4004ab5d4a7deb6f317061a","up":true},{"one":"b6dffac4b4eb2974ed0ed241799f97d2e5d9be671e311266826d0dcfecfcc209","other":"43d43e9ebcbceb4830fc1d2d5024650b90698306bbd2c4d0b4841a1a8fd09c93","up":true},{"one":"8d192b11538072db750f71204e2e6adf9dc0508d9c5cf1eb457e4e996cd985bc","other":"80735a728720bba0ac08daaccd093370d672a8f9a50845ad78ccd6cf8686c39f","up":true},{"one":"7ce7fec833a2e8c7720fcc97f820f2ca2aca85388210f887c3efe78b020766e7","other":"7660828fb0c8f89201d34e6f4d61cc6ba9a30cead6e4eb8253f6cc92e1845f23","up":true},{"one":"9257dc934dfbf17473b70cb85333c6fab67ee9b6228a646576c4f57253f1004e","other":"807416cc70f02d481a188027f7932b48e8f7b5e8258f7e9623f3f6e2985d8f6a","up":true},{"one":"0e80db9dfa8ce29bedfb2de031622bef8829bee52771322b6a7efb47afe540e7","other":"79e5c6c6d78c88c579003cda044882ecb04520fbad1f5feadbe7b6d23fe183c8","up":true},{"one":"435d721a568eb906a03c69dbd71337251a550521a4004ab5d4a7deb6f317061a","other":"7e47a2f82984a600c8583605a91d5cb8f2d9a18961845e9c422edd78e20ac3a3","up":true},{"one":"bfc711793830779f49aa59bc6f7a205ab4e6eae7abfdafbf3bb5a1163a778ab2","other":"dad08999cd2edc33cfdc59ea34c8adcd6a34eaa15f2e85b0622e9848b215c1d5","up":true},{"one":"6d3c6db15900f2596286f81cc0664d2c8291ead5bad2aa35bad515af088a2e48","other":"80735a728720bba0ac08daaccd093370d672a8f9a50845ad78ccd6cf8686c39f","up":true},{"one":"32ff1969d90aaa5a8ed2260968a8e2bac2d1cae597c906f90495f1dc5de7f8d3","other":"3938e6b2c095084dc9975a3e8649133557495d34ac6df874c6d929266e3ffe6f","up":true},{"one":"3c5b2e125020c80e3674df9cac34de4d8f3a94ee02556fb557921b6d5498b933","other":"679554b410e415cfcdf1b14ef87759269b2bcaf07f4541122977db3a40091da2","up":true},{"one":"36b93656cab02213fa76124af6251109356abc5e0ae5dd1e203c6a013e014548","other":"14849f811af20ce19fb29417d20c15fc16da1e45aebdf795a2c6ccb671e4bdac","up":true},{"one":"a8ff8d69dcb36462d1116dafa5e3d0c7237bf65dbece482a316862c8d66e35b6","other":"a606c79a018a6535375d851fcc82c42cc7c952720aa120434cedccf4a4be1f59","up":true},{"one":"c190f9d08c78ed6dffadaef36e77fe6aa96099e4453753b0cfc8ec542fa96b9d","other":"43d43e9ebcbceb4830fc1d2d5024650b90698306bbd2c4d0b4841a1a8fd09c93","up":true},{"one":"5814be13c8550b9a5a83d08e7af6022002a8fdaa38ba6c2c30be58099a9f7744","other":"50c1a8023bfecffb09472fdc50898f4d050a31443d40a6c07b629090beb0df3d","up":true},{"one":"f305273a7d08e72f69b0b153855e822f252cbbf34a18f305134eed9d1eb7b58a","other":"cf52b3fc82ec24c3e9b40488d7c5f7ac8af731d159a103619bee932ec74d5e92","up":true},{"one":"8402bd62282811ed236b2fa1f0d41ad4bbe54e420ee34adc6164cfd4baf8658d","other":"da36d1df95a158b0d3f9e7407d663a6b611dde0a77f00a584b97a939ab6a00de","up":true},{"one":"34118166845c185d15c286b7e5433539ee98ed634baabd534d57369fd5f7c681","other":"3938e6b2c095084dc9975a3e8649133557495d34ac6df874c6d929266e3ffe6f","up":true},{"one":"9b8e6bb3a7fe4dc65ac97404e546d8b777d068c94bc2355f4f1a510ad6c11905","other":"837f0993f6374039a5ad4472d6313e647a4c5db4583bd27ccfa98d3448a17731","up":true},{"one":"ef99b6cdc05345a1ee82267890e3ccaeef1f2bd2fe7ae8b02b6b20b9a5ef85bb","other":"f305273a7d08e72f69b0b153855e822f252cbbf34a18f305134eed9d1eb7b58a","up":true},{"one":"a6165a4b02d58be116892982c0ed3d49d86fec0e9f436a516b61868331ed853f","other":"c2d00c7d960174c0934129fdcec63525bfa728f78fb70b7c52036b772d6297ad","up":true},{"one":"84a9db7645c792dc38c1f2113a8f0590d04e1c94d9a8c464ab0ec8219303d966","other":"67f383e5334e9b6701d1dbb20876d4ba9a7e578af0476caed4a7e1b701f2bedb","up":true},{"one":"9ca1fd5d41975acb905f337997922849b4070360e47849bb4fd8cd1b9ddb4d73","other":"ec90a22f41ee659d5759a497946ac2991c916f00fe7caeeeb0908f3af1fe60b6","up":true},{"one":"025de1d2ec529d3a7da302eef0f8c54996616d40c940c0956d470ffc2a007f33","other":"2c85f5361b2d5abcf799de50fe58b1ed2006ea18f75823748c33eb7e95b1cc39","up":true},{"one":"951877b34ee1535b5059c49beb03e8960ff9c12b694ef64708c77c30ff1dc706","other":"8cc3fb39009d0adc26fca1e2ee96822d168d4debc379fd516c15d4b4a1624231","up":true},{"one":"dbd4d90e3342ef837b8ecf5c6e490f7c409f419cf36b77162a87cb2cfb8ae33c","other":"eebd48b367cbfe94a37c0deb274a697e628074f9560b909e66229c5c76ce68eb","up":true},{"one":"48f1ca6d433019f932fa4ae03e0decbcbea3fe635edff4458a669b83f8162b9a","other":"51440ab47fc5076c00cad16a542b846c26b3281ecea4dbca795ae9b80183ec90","up":true},{"one":"60c5647aed152609979366fb33dc8b28fc60736098ff68d232415889b43dfa58","other":"7d162a11662585f8c38d88fb241623e67bacf90703065dae6c092b4b507d6543","up":true},{"one":"837f0993f6374039a5ad4472d6313e647a4c5db4583bd27ccfa98d3448a17731","other":"93ea8ef251fd56b159e080cdf733d33e1fdfb3c7ae5bd9a6a328d0bf5458867b","up":true},{"one":"c74d801e85ac0fd8951480d107b41eddc5c92775614c4886b3f732fa3d1a791d","other":"f8ff7440d6f4abb1c89496336843741ed53a544cedeeed71d8ebe0b08698438d","up":true},{"one":"43d43e9ebcbceb4830fc1d2d5024650b90698306bbd2c4d0b4841a1a8fd09c93","other":"79e5c6c6d78c88c579003cda044882ecb04520fbad1f5feadbe7b6d23fe183c8","up":true},{"one":"50c1a8023bfecffb09472fdc50898f4d050a31443d40a6c07b629090beb0df3d","other":"046ca54165f0dd4d62fd7d8ee9e97c655db3d35f5452a0ccb0dffc79c047978c","up":true},{"one":"3b020c84fb60f59779324d451d9770d683e08133bbaa2d5762f61b8fd4b8d9fd","other":"a3309f8b8bba4d8fbd7c6193d7671cb907b94e71155ef6138e0248682ff00e58","up":true},{"one":"48d79ac55f8df512af8e7d868aa40ac9b61493fa4f1b0ce0b76bf6da2eb30e78","other":"5bd8faf93bcad07006e9426b45f5cc599f1963ab791deac4ff63d6739cd62a17","up":true},{"one":"43c9e1571c460cb9f599fa8ed79ddd0f9c3a21fd2fa455e0603109c55012f76b","other":"b6dffac4b4eb2974ed0ed241799f97d2e5d9be671e311266826d0dcfecfcc209","up":true},{"one":"a606c79a018a6535375d851fcc82c42cc7c952720aa120434cedccf4a4be1f59","other":"9f0e2bf8a962156c9e0a83c3d42ad3dc5ac5c3e508f24200bfb151aad4e395ff","up":true},{"one":"86d6f68ec0b8e1b3406943787f918bee74dd1827998bdb13ece8f690da2d296a","other":"93c0e1adf23fdf1623359eb88c517bc521d5a26325554df890cc04c1fa17a5df","up":true},{"one":"2e65d05648b798fafbc9bb582c05e6f8f891131260e8c90ca725ddcbc823f315","other":"0e80db9dfa8ce29bedfb2de031622bef8829bee52771322b6a7efb47afe540e7","up":true},{"one":"6d5ec591af4966ba024c6b2aeb45e0aab8aa1762f9cac30ce3934da529b738e9","other":"6b4ee1b73942ced78f97c0d0e221209933e63ae7353bb9ab3d37ac4127592e86","up":true},{"one":"8e282b0f27d4fa56fe14cfeb69fac5a53e3d882c7778eb190653e2eab7c93fd2","other":"b8e1a8622c256ef29acd52df7b3ace50820fb1a147716165ff862fdc973a48cd","up":true},{"one":"094256812084c6052a2604149aa3aba2379c483bf4ec25162f6b43934942775a","other":"5814be13c8550b9a5a83d08e7af6022002a8fdaa38ba6c2c30be58099a9f7744","up":true},{"one":"c8c8a93779ec4d9ac40925e8208478a00ee27fc220ddd73d8774cf6bfa255c46","other":"be68267d77fb52424227267c665ca1193a010334cac057338aca77b49a4b94da","up":true},{"one":"70f68562733da4e3b1c3949fb6e11ac0bdd49ea7e732925f937f87df5af698d6","other":"7c7ca5a7522a04f62f2bebd6197a03d78f255d0175c3dfceb5d92b684365b2aa","up":true},{"one":"26ab9c813822dbb4f1a230cd8e99e8ab280b242747deb55fdf93d160906ef331","other":"ff75b19017c84128f38dec4f63e1f247a5691dc0fae186e667afedb5fe9d2c80","up":true},{"one":"807416cc70f02d481a188027f7932b48e8f7b5e8258f7e9623f3f6e2985d8f6a","other":"8b4318f86ad47976321af97bfbf95cd0a3b0aa22447aeb0611ed1a9bf1e6a4bf","up":true},{"one":"318828fa893a28cc0652d3f81d97c5b8e023e853685f5d3e65fde20689abcc5a","other":"dbd4d90e3342ef837b8ecf5c6e490f7c409f419cf36b77162a87cb2cfb8ae33c","up":true},{"one":"b4a1b687fbdb754fd689e26f0870a7dcab5d76190c06f3ea2ea1e198f8aa5ab2","other":"68cbc4a5313080d5dca8ad34e8bf52a6144e0ff8ef3f795d7ae9d5f644fe2042","up":true},{"one":"9c21cb3e56f8ac66a7917a9ba14e58f77e998ac70c178b88b5053d9ac2777e60","other":"9ec831d97418916fd9695465e041caf27824dbb51d6ff74d6b70f3bd561e70e6","up":true},{"one":"5ff09c6859736aad7a82a3bfb3f1a1a8b3c0d58f831863540d9c3013dd35745e","other":"1049d321a450726cf39d1d7cea1c108be3bec137a644b62cdc73a853f5a5a22b","up":true},{"one":"c6a8220726243cceaa6f2cebdac857a05efe721323f0a064c7f85a8340d3da96","other":"95c0a351fb7aa6683280d159a7b808bfa63f63bff91a1c5936e973b2e5d3954f","up":true},{"one":"9959385385aade728d3f5763806596222bc1e7b9946c2c92407943d080b32f8d","other":"994839e5f3a5b8b23aed84fb029413124af17804b79b0263ec6bfd5aec5dad78","up":true},{"one":"a8b58013ff911871d1aa6c2bbea6c2e6ef9b00b87b80a41dc04724ad0488e2ff","other":"1dc0ef1ce68dc681298177bde808af514efa52a5ad38c9cd2bd61968cdf19cfb","up":true},{"one":"c603138e40fe2f85cc634017956ada6399fca99969e3bf0c1ee8428374e779f1","other":"d95965e449dd4069876384cf4b34f986731e255a7948f0a862d229b1dddbc502","up":true},{"one":"7049e92a396311fbf2f4a55bb5bd2fe3f7bb3c1a63f41bb88eb800edd45ac6e5","other":"48b850974575ca57a3cc5f9a4cf5aafd8688cb32b993f69983ece63258ff876e","up":true},{"one":"8cc3fb39009d0adc26fca1e2ee96822d168d4debc379fd516c15d4b4a1624231","other":"8e7b96d28edae711e1a4cee0d894e0bd92cdf410ba6f61713f7d9b0bee761d4c","up":true},{"one":"ed424d24d702520bf7cb5f6babbdc43a078435fb4a9884ed82a93d642839e127","other":"be68267d77fb52424227267c665ca1193a010334cac057338aca77b49a4b94da","up":true},{"one":"67909bdcaef2330ef120e524c76e1e382b474f3332d86f65282028e051f34c75","other":"5c373034770e413e700b1cd03b2035f769ecd9ab8eb54d32f7b2645be1991fe5","up":true},{"one":"bdc5de01276157a0f3fc43a9cc3b41b2cacc8479118b75aec4ba9b2b7fa86d5e","other":"807416cc70f02d481a188027f7932b48e8f7b5e8258f7e9623f3f6e2985d8f6a","up":true},{"one":"a2a163ce2cb092b411c994cc5d5ef555d539d2dcf4e7e1aeb528d2216dc481e5","other":"fc514c43c4eb5c62798458da5d622e9248a6e530e4288cd902019aa05c4374d8","up":true},{"one":"48b850974575ca57a3cc5f9a4cf5aafd8688cb32b993f69983ece63258ff876e","other":"c2d00c7d960174c0934129fdcec63525bfa728f78fb70b7c52036b772d6297ad","up":true},{"one":"5a26ae73eebf27f6dbec2414f1277a249e814a7a06790d7061610e5227b086f6","other":"84a9db7645c792dc38c1f2113a8f0590d04e1c94d9a8c464ab0ec8219303d966","up":true},{"one":"4d381014783980b2f77f0d71160ad9e9d84672b576f4435ccdbae12752350c1c","other":"7850f5ee5048959559b3af0f95689669b250fc3aa58bcc9544dca61ca9c9769c","up":true},{"one":"d700d96de1193456dc0bcf492c7c11b0951062974af2f7f47b8c901b17c23165","other":"0e80db9dfa8ce29bedfb2de031622bef8829bee52771322b6a7efb47afe540e7","up":true},{"one":"1addd4a9f01486212e13e43a9650b7f793617d1cb59fb8d941270d7ae55f575f","other":"e2770cef7c1ad312b70d94ca5570e45f324c798a31a93203f505167aeab122b6","up":true},{"one":"b5eab4869b4cb65bdc1e5cab45c03016d202f9f5b668be50066451cfcf9ef299","other":"24f80c437be45898e594f821bba0f5c62e0c9a0c720118e362ee6f78410612bd","up":true},{"one":"ba911175d3aa3fcc266e2a5aa32fb706208b8a9b5021a5f37c0b85f547eb375d","other":"cc3397e9e11f75273d3f81d91f980f4504755f80b27a183212de56cc5085e58d","up":true},{"one":"1b1dc3f9312df141855c545dd16aee325f9a609230ec6165bdbbb07d0c0862f6","other":"046ca54165f0dd4d62fd7d8ee9e97c655db3d35f5452a0ccb0dffc79c047978c","up":true},{"one":"305162c472c71ddef2320b138102b67d1ce2b8bba79e2e587fc80e085c88e547","other":"4d9147e3bf98cb59a7648f616c0d7f713a8cf3b7d25e3115233ff5883128beab","up":true},{"one":"9f7d72b7d9843872904b841e421985082428fba5010db27dd871ed76630a1e1d","other":"9ca1fd5d41975acb905f337997922849b4070360e47849bb4fd8cd1b9ddb4d73","up":true},{"one":"d20931ce3da972fd23ea306e5c604a1fbd9417ba02654c5cdbe278fe259f75d5","other":"eff2450bea797ff66d93e7c1c1b0977cddf3abba64bfa51bcc509d728569e2fa","up":true},{"one":"6b4ee1b73942ced78f97c0d0e221209933e63ae7353bb9ab3d37ac4127592e86","other":"97daf2cbe03c80ce6c4dae39cd071dd93cb32ed245aa9aa77285e12296957ca3","up":true},{"one":"398038811c1c7402fe2e6994c9ce2f15c8166b8e99f379feaaed66ac87702062","other":"60c5647aed152609979366fb33dc8b28fc60736098ff68d232415889b43dfa58","up":true},{"one":"d3022a46956e75bca85ba89d97b694a3a64f03ccc2d881ed0cd687d43d486925","other":"80d7e892bbb26808abb1d1530077fec6b08768c151a9f220881da3c862bae0af","up":true},{"one":"aaf051a087a92f874a3f6c7923015e4cffb4bb3ef381c977fd902f21e841d0f4","other":"81a5a07f92f813e85b501b0028e1caa6e6a6c7efa5195ecb693cd2d91d5132a0","up":true},{"one":"ec90a22f41ee659d5759a497946ac2991c916f00fe7caeeeb0908f3af1fe60b6","other":"feb3bc17ee7369a4fa9889d9250fed3c1257c70916871996e6eabd374dd8dc2e","up":true},{"one":"d3e913cf4a7dabfb5699131b65e533a40adb46ea37e0ed4ce9433f99015986ef","other":"eb686a686fd70e41659cc69ec0db53d1512dfec238918afd0a515d8ce177d4d9","up":true},{"one":"9257dc934dfbf17473b70cb85333c6fab67ee9b6228a646576c4f57253f1004e","other":"93c0e1adf23fdf1623359eb88c517bc521d5a26325554df890cc04c1fa17a5df","up":true},{"one":"d9cf19895e015cb534d915aed83c0d26bf40a11244027812e17c3bec6e645a8e","other":"60c5647aed152609979366fb33dc8b28fc60736098ff68d232415889b43dfa58","up":true},{"one":"3c5b2e125020c80e3674df9cac34de4d8f3a94ee02556fb557921b6d5498b933","other":"36b93656cab02213fa76124af6251109356abc5e0ae5dd1e203c6a013e014548","up":true},{"one":"e6812448728b4bda5962adceb1707b29f661d3d1a6b2ccd5f8183c9a1f4d01b6","other":"ff75b19017c84128f38dec4f63e1f247a5691dc0fae186e667afedb5fe9d2c80","up":true},{"one":"05949ec1a582fa70cab95c59e7c0d315583bf9fc320c60c35268931f21e90853","other":"397a0a0e9fadcb571acd8981f5bfe8e059e707e0feae8a9c4c6bfe87bd39e66a","up":true},{"one":"012ba278d582691241875c4c14ead91fff3983e190df7d9b43ade384e84c11fb","other":"178401ec8d01a0a4f551d23e880a8e8a4eb87773565363843d51cf52660b1211","up":true},{"one":"c190f9d08c78ed6dffadaef36e77fe6aa96099e4453753b0cfc8ec542fa96b9d","other":"5814be13c8550b9a5a83d08e7af6022002a8fdaa38ba6c2c30be58099a9f7744","up":true},{"one":"a5ac04d53b569e418ef5007961431155f2c226ee10157b30af71ea4836b08089","other":"bfc711793830779f49aa59bc6f7a205ab4e6eae7abfdafbf3bb5a1163a778ab2","up":true},{"one":"46bfa8bea56b0be1abfa5ad3561bb6bf49ed6695d83ee2b2c192c5a0408347cf","other":"741a854ae299df49a738725bc58abe614e5e4302ffecd8320bbede8412d160c0","up":true},{"one":"67585dfd87a005bae9bffc2cccb83c69537247c74886b4fa52287f46c796bcb6","other":"6b4ee1b73942ced78f97c0d0e221209933e63ae7353bb9ab3d37ac4127592e86","up":true},{"one":"1070df5e904e3865085b0319a81761e59146494c689e7567efe7465fc819ae8b","other":"1b1dc3f9312df141855c545dd16aee325f9a609230ec6165bdbbb07d0c0862f6","up":true},{"one":"18e00a7e0f826a1aba3f8c0f533ed905f2eee607b697fff056ee7874d374adcd","other":"31e129ab3df7e082cc27c649d9ee29a3ea646d6a97d2417875b80e3ff576c047","up":true},{"one":"08bd1e049859b4a7c8078ca9741fe3daa668b9fe478da06d1a435cd5566b3e11","other":"2c85f5361b2d5abcf799de50fe58b1ed2006ea18f75823748c33eb7e95b1cc39","up":true},{"one":"bea10868d5da506c1801de845c148c2f09761893113ac913fe66674a8f43c178","other":"b4a1b687fbdb754fd689e26f0870a7dcab5d76190c06f3ea2ea1e198f8aa5ab2","up":true},{"one":"793322608055d4873776a9a0a6c40b04379bfd2f289a8ad49a7dc456bc65f871","other":"7850f5ee5048959559b3af0f95689669b250fc3aa58bcc9544dca61ca9c9769c","up":true},{"one":"5ac0d00b8d647dec62d26e1a689fd05b8b7a1a79ab8c43493bd6d7d209816df1","other":"8f9aa2cd33d18e7cb4494d11a7532c97eb4a1cae172b2165c26ae4ed24887c0d","up":true},{"one":"f645aab9cb2bd2709998b38e5789c9c5f68d40765e6cbd93b92e6383eb671dba","other":"9b8e6bb3a7fe4dc65ac97404e546d8b777d068c94bc2355f4f1a510ad6c11905","up":true},{"one":"e0a0ba7e7e89a7af805e24abde1a5a5b489ba197585051a8755e8c2345c3d57b","other":"d700d96de1193456dc0bcf492c7c11b0951062974af2f7f47b8c901b17c23165","up":true},{"one":"8e7b96d28edae711e1a4cee0d894e0bd92cdf410ba6f61713f7d9b0bee761d4c","other":"951877b34ee1535b5059c49beb03e8960ff9c12b694ef64708c77c30ff1dc706","up":true},{"one":"a9700308516c02cf9aea8809000a4e0596d6b44753e10bd0928df83e2eb9b9e7","other":"a0c88ba70599b0e72c18fa6aedd14d607cca3e9a49a5d50165d084e70328c2dd","up":true},{"one":"f305273a7d08e72f69b0b153855e822f252cbbf34a18f305134eed9d1eb7b58a","other":"c272b12f4020ae5b20e3d29cd09de03fa0088e3eeb5f07aa7728b29a3e90e687","up":true},{"one":"b6dffac4b4eb2974ed0ed241799f97d2e5d9be671e311266826d0dcfecfcc209","other":"68cbc4a5313080d5dca8ad34e8bf52a6144e0ff8ef3f795d7ae9d5f644fe2042","up":true},{"one":"031450ec20f353435b429b5fa64f616d07c9d586afabc7a2772e05ad5c88bf50","other":"05949ec1a582fa70cab95c59e7c0d315583bf9fc320c60c35268931f21e90853","up":true},{"one":"3938e6b2c095084dc9975a3e8649133557495d34ac6df874c6d929266e3ffe6f","other":"7895b2cb97b473f8893cc70a4421e0f8be1c033b27cd730fa13438b7a8f3fcb5","up":true},{"one":"f7561cb6740e17ec7c7d17068251b2c951d954c77804aa5af60464e9c3964e57","other":"c272b12f4020ae5b20e3d29cd09de03fa0088e3eeb5f07aa7728b29a3e90e687","up":true},{"one":"eff2450bea797ff66d93e7c1c1b0977cddf3abba64bfa51bcc509d728569e2fa","other":"a0c88ba70599b0e72c18fa6aedd14d607cca3e9a49a5d50165d084e70328c2dd","up":true},{"one":"b3f95f225e2b6b76e6c7ef7c86caf83e35213f6a22da41e653ca1c190be23c9c","other":"8862cd85d7039119b984f752a458ac0495ddea98c69fc1d1241db7873a712c11","up":true},{"one":"08f84878e44fed2adb4b2685b9f293dc3c73d5f9bc1c474870d943ec2ae73dbe","other":"26ab9c813822dbb4f1a230cd8e99e8ab280b242747deb55fdf93d160906ef331","up":true},{"one":"b659418885032905ea20ad47d70470e403e7e407e0e9ebf9277f9a2d81ec121c","other":"cf52b3fc82ec24c3e9b40488d7c5f7ac8af731d159a103619bee932ec74d5e92","up":true},{"one":"2c85f5361b2d5abcf799de50fe58b1ed2006ea18f75823748c33eb7e95b1cc39","other":"1dec77c2f4caf053c2d0524ae34a2d970bf4743a0d009d8fc543077ddfdfe3d0","up":true},{"one":"a8ff8d69dcb36462d1116dafa5e3d0c7237bf65dbece482a316862c8d66e35b6","other":"a4ee49bb2caabb6b9448bcdff1fc3cc673a2db04eab9f5c62d1787f2c25990a0","up":true},{"one":"09b3fa30780931e18b92c75d1cdeafa365609c565e4e8c253d393835cb82d98e","other":"3a628ef171c1f26fa0966eb89210be0a14305aae8bfed10f4ed9017698f40f4b","up":true},{"one":"019109311d4888497aa194cce4a89b5ef243421cf0e7e7bb9115d086e1a1f7d7","other":"31e129ab3df7e082cc27c649d9ee29a3ea646d6a97d2417875b80e3ff576c047","up":true},{"one":"435d721a568eb906a03c69dbd71337251a550521a4004ab5d4a7deb6f317061a","other":"4d9147e3bf98cb59a7648f616c0d7f713a8cf3b7d25e3115233ff5883128beab","up":true},{"one":"43c9e1571c460cb9f599fa8ed79ddd0f9c3a21fd2fa455e0603109c55012f76b","other":"b4a1b687fbdb754fd689e26f0870a7dcab5d76190c06f3ea2ea1e198f8aa5ab2","up":true},{"one":"5c7c15798e86fe794bb201614d46366ea96dc51091f5b19f149995e0d40df0a6","other":"5bd8faf93bcad07006e9426b45f5cc599f1963ab791deac4ff63d6739cd62a17","up":true},{"one":"046ca54165f0dd4d62fd7d8ee9e97c655db3d35f5452a0ccb0dffc79c047978c","other":"c272b12f4020ae5b20e3d29cd09de03fa0088e3eeb5f07aa7728b29a3e90e687","up":true},{"one":"140dd212f2b193ee6a9d7fc14f7da321c7ef6fd367fb4f194924fd0ad5d135cc","other":"4d9147e3bf98cb59a7648f616c0d7f713a8cf3b7d25e3115233ff5883128beab","up":true},{"one":"837f0993f6374039a5ad4472d6313e647a4c5db4583bd27ccfa98d3448a17731","other":"994839e5f3a5b8b23aed84fb029413124af17804b79b0263ec6bfd5aec5dad78","up":true},{"one":"19ea0a685fc4edd298b736dc7a778c9ec4362de378876911105fa9ba2ce90204","other":"046ca54165f0dd4d62fd7d8ee9e97c655db3d35f5452a0ccb0dffc79c047978c","up":true},{"one":"26ab9c813822dbb4f1a230cd8e99e8ab280b242747deb55fdf93d160906ef331","other":"e6812448728b4bda5962adceb1707b29f661d3d1a6b2ccd5f8183c9a1f4d01b6","up":true},{"one":"c9c302de4afe7b4dcbb6f3e366ce747083f9dcd7d5c6a01b939da5cdc6ccc874","other":"fc514c43c4eb5c62798458da5d622e9248a6e530e4288cd902019aa05c4374d8","up":true},{"one":"07f5d094a4b22e73cdd6c85452b3d928da9b4b16873824759cb7e8a622417fd5","other":"1bd588263274543729d54529ae9e9bf4596db40649a1c2a3f73168d818f34b62","up":true},{"one":"1dec77c2f4caf053c2d0524ae34a2d970bf4743a0d009d8fc543077ddfdfe3d0","other":"140dd212f2b193ee6a9d7fc14f7da321c7ef6fd367fb4f194924fd0ad5d135cc","up":true},{"one":"741a854ae299df49a738725bc58abe614e5e4302ffecd8320bbede8412d160c0","other":"4005fd1fa8fbb318b29a62c368ada579e5122ca0578e6a75c509552be4b63b76","up":true},{"one":"b78fd21c063006e2e033d1d00fc21e1ad7ad7951bb5621cec9b56639745d65f9","other":"fc514c43c4eb5c62798458da5d622e9248a6e530e4288cd902019aa05c4374d8","up":true},{"one":"298ae5d173c5360bc9ad5b492ed35de3b6e0cae868a34bfe6311a8ba5ea9877e","other":"140dd212f2b193ee6a9d7fc14f7da321c7ef6fd367fb4f194924fd0ad5d135cc","up":true},{"one":"9ec831d97418916fd9695465e041caf27824dbb51d6ff74d6b70f3bd561e70e6","other":"86d6f68ec0b8e1b3406943787f918bee74dd1827998bdb13ece8f690da2d296a","up":true},{"one":"318828fa893a28cc0652d3f81d97c5b8e023e853685f5d3e65fde20689abcc5a","other":"cd6c8b42a0b092f41e6925577c9de7d1bea17231bcb3d08f3d3cce9c6fdcf22d","up":true},{"one":"1dc0ef1ce68dc681298177bde808af514efa52a5ad38c9cd2bd61968cdf19cfb","other":"26ab9c813822dbb4f1a230cd8e99e8ab280b242747deb55fdf93d160906ef331","up":true},{"one":"955da15edae50a4c68bc8c579b9799d55f41b7c2a6178f645f79d772e0116662","other":"8f9aa2cd33d18e7cb4494d11a7532c97eb4a1cae172b2165c26ae4ed24887c0d","up":true},{"one":"a742e8502c619703ce87890110f908bde32b59dc61d77a247759e5d0056e0c94","other":"f645aab9cb2bd2709998b38e5789c9c5f68d40765e6cbd93b92e6383eb671dba","up":true},{"one":"2fd2f77d76cca480ac18e9af7a462f297db168c3370b3bc0e2c04aa006c4d037","other":"a1c85ee75edb807a01f4ce930086c948918aade324752609b078c28991c04e86","up":true},{"one":"a5053958f0cefcff1826bf02525fda98c4dc954cc38690f3c43ecbf0b2ad57af","other":"9f0e2bf8a962156c9e0a83c3d42ad3dc5ac5c3e508f24200bfb151aad4e395ff","up":true},{"one":"34118166845c185d15c286b7e5433539ee98ed634baabd534d57369fd5f7c681","other":"7895b2cb97b473f8893cc70a4421e0f8be1c033b27cd730fa13438b7a8f3fcb5","up":true},{"one":"26acc3c373c29150af30bbc9264d0c44c7c606ff7377399ddf844635e97afcfa","other":"60c5647aed152609979366fb33dc8b28fc60736098ff68d232415889b43dfa58","up":true},{"one":"87a337622455ae65daf3ab2555cee8985e9aa14bac245545d985296060e4a8de","other":"5c7c15798e86fe794bb201614d46366ea96dc51091f5b19f149995e0d40df0a6","up":true},{"one":"c53417f008e4550e1c4cb9a3e2955b3af6403e059b7b4b4c33869d9ed4a580a5","other":"ba911175d3aa3fcc266e2a5aa32fb706208b8a9b5021a5f37c0b85f547eb375d","up":true},{"one":"80735a728720bba0ac08daaccd093370d672a8f9a50845ad78ccd6cf8686c39f","other":"43d43e9ebcbceb4830fc1d2d5024650b90698306bbd2c4d0b4841a1a8fd09c93","up":true},{"one":"e471efbcf1def3915b3dda2dc65a86945c607be54a33e31e9625549becac0e34","other":"cf52b3fc82ec24c3e9b40488d7c5f7ac8af731d159a103619bee932ec74d5e92","up":true},{"one":"1bd588263274543729d54529ae9e9bf4596db40649a1c2a3f73168d818f34b62","other":"93ea8ef251fd56b159e080cdf733d33e1fdfb3c7ae5bd9a6a328d0bf5458867b","up":true},{"one":"8358a74fc8d8e39ccc40b4d3a212b7a69a6a8f6afc25cff2c9c7b44bbaf9ec82","other":"0d1c35c6ea485cb33857b790ee262f974cf0d54cf8ce3003f8308ac2e87c2c25","up":true},{"one":"9464ad8da1a5effdc0351742dfffae941ffd9fab469637b2491caece53c57dc8","other":"9c8e1f23f260c5a46b0001572675b19e5293ca65e7fdfc131c07612e9c4072fa","up":true},{"one":"0cfc7309afabceeb7d248714e972cf3987205324f5ab8d048d17bea5dc87369d","other":"019109311d4888497aa194cce4a89b5ef243421cf0e7e7bb9115d086e1a1f7d7","up":true},{"one":"e09f98114da64e7547b351637190f6621a1f75568cfa9960980fc77618f8855b","other":"e471efbcf1def3915b3dda2dc65a86945c607be54a33e31e9625549becac0e34","up":true},{"one":"d20931ce3da972fd23ea306e5c604a1fbd9417ba02654c5cdbe278fe259f75d5","other":"e2770cef7c1ad312b70d94ca5570e45f324c798a31a93203f505167aeab122b6","up":true},{"one":"6c0142984d629ae6995894de9e7e5eb8d3fe45e1641d7ebd63959d2e61548ba3","other":"7660828fb0c8f89201d34e6f4d61cc6ba9a30cead6e4eb8253f6cc92e1845f23","up":true},{"one":"9959385385aade728d3f5763806596222bc1e7b9946c2c92407943d080b32f8d","other":"9b8e6bb3a7fe4dc65ac97404e546d8b777d068c94bc2355f4f1a510ad6c11905","up":true},{"one":"4a95d49f58057b039b55a34f67a348c052f61770065e41243ff055efc570a935","other":"51440ab47fc5076c00cad16a542b846c26b3281ecea4dbca795ae9b80183ec90","up":true},{"one":"096a8302b6f369c28ed9d47719a507ead8a3cc1ca4fa1e32318b7f97873955fe","other":"194ea3e14dc5d99f98d15607dc4c405769f5a371acc22d41a62d0537d716be32","up":true},{"one":"0e80db9dfa8ce29bedfb2de031622bef8829bee52771322b6a7efb47afe540e7","other":"6dd3ac0fd9a04a2ce75875c683d135e52eaa1670cb55e78711620712e60fde47","up":true},{"one":"194ea3e14dc5d99f98d15607dc4c405769f5a371acc22d41a62d0537d716be32","other":"67585dfd87a005bae9bffc2cccb83c69537247c74886b4fa52287f46c796bcb6","up":true},{"one":"397a0a0e9fadcb571acd8981f5bfe8e059e707e0feae8a9c4c6bfe87bd39e66a","other":"305162c472c71ddef2320b138102b67d1ce2b8bba79e2e587fc80e085c88e547","up":true},{"one":"3728152c88f1e5e61f6523b09e8f3bb1023b700deccdca5fcc1e6488136b0e57","other":"14849f811af20ce19fb29417d20c15fc16da1e45aebdf795a2c6ccb671e4bdac","up":true},{"one":"bfc711793830779f49aa59bc6f7a205ab4e6eae7abfdafbf3bb5a1163a778ab2","other":"93ea8ef251fd56b159e080cdf733d33e1fdfb3c7ae5bd9a6a328d0bf5458867b","up":true},{"one":"d408bb6f7af1590e1f162ce02cc016b1b86ede29851caa32434212ffa2a377c8","other":"ddb8be472c3d48dc4d3d112448e6c0c4a826a18af3f3b53fdfef8cd31053c75f","up":true},{"one":"e2d36f335d90ad63148db8e353a78a30d8d9c0abe107be2cf8685f6a01ce74b9","other":"c42e6492879439eeecd9938d17ff283fd8f5f24206906ca512b4daa4803b78b4","up":true},{"one":"3c5b2e125020c80e3674df9cac34de4d8f3a94ee02556fb557921b6d5498b933","other":"3a628ef171c1f26fa0966eb89210be0a14305aae8bfed10f4ed9017698f40f4b","up":true},{"one":"ed424d24d702520bf7cb5f6babbdc43a078435fb4a9884ed82a93d642839e127","other":"d3022a46956e75bca85ba89d97b694a3a64f03ccc2d881ed0cd687d43d486925","up":true},{"one":"70f68562733da4e3b1c3949fb6e11ac0bdd49ea7e732925f937f87df5af698d6","other":"50c1a8023bfecffb09472fdc50898f4d050a31443d40a6c07b629090beb0df3d","up":true},{"one":"30feca631f06041cb14cead384dfaa5fffa6dc34b0cee54230efbe15e56a5884","other":"035f15499cdb0f079b3e358ad54a6122681442a5293c3ae2fdf6c527004b36d2","up":true},{"one":"c190f9d08c78ed6dffadaef36e77fe6aa96099e4453753b0cfc8ec542fa96b9d","other":"2fd2f77d76cca480ac18e9af7a462f297db168c3370b3bc0e2c04aa006c4d037","up":true},{"one":"5814be13c8550b9a5a83d08e7af6022002a8fdaa38ba6c2c30be58099a9f7744","other":"f6c028d6a2b6408e90169151f4519b561ed183bd8925ed9a1702806f397666e7","up":true},{"one":"52a8747e4ea35f6f50c72d7c481616f68a5e4396248332b8ff69d3a772de49ac","other":"51440ab47fc5076c00cad16a542b846c26b3281ecea4dbca795ae9b80183ec90","up":true},{"one":"18e00a7e0f826a1aba3f8c0f533ed905f2eee607b697fff056ee7874d374adcd","other":"e64d90760cd81e4f112bbf1432e76c82fa4173fd474b988f4096ce187363fd81","up":true},{"one":"4cece9bc134bc2b09400c9f7f8a4df9270d2fe3c077c5e441fffc911fcf6f42e","other":"05949ec1a582fa70cab95c59e7c0d315583bf9fc320c60c35268931f21e90853","up":true},{"one":"68cbc4a5313080d5dca8ad34e8bf52a6144e0ff8ef3f795d7ae9d5f644fe2042","other":"79e5c6c6d78c88c579003cda044882ecb04520fbad1f5feadbe7b6d23fe183c8","up":true},{"one":"3f31ecaffaa6311c82c9a575bbc38d6bcb16630ac87e19d1853a64aa96c9dcde","other":"305162c472c71ddef2320b138102b67d1ce2b8bba79e2e587fc80e085c88e547","up":true},{"one":"f2b49a2247c9c5e8f6f755834a37fe5c17f208f994878e14b7001e404f52e125","other":"2e65d05648b798fafbc9bb582c05e6f8f891131260e8c90ca725ddcbc823f315","up":true},{"one":"0e2b48558ce2af1fbfee38a557d56072e3091cfcaee8d7847c7c9dcf7bef9bfa","other":"5ff09c6859736aad7a82a3bfb3f1a1a8b3c0d58f831863540d9c3013dd35745e","up":true},{"one":"a8f49e87156fda5510897601689ce968d77032134c523634916b96de16366f9e","other":"6dd3ac0fd9a04a2ce75875c683d135e52eaa1670cb55e78711620712e60fde47","up":true},{"one":"36b93656cab02213fa76124af6251109356abc5e0ae5dd1e203c6a013e014548","other":"012ba278d582691241875c4c14ead91fff3983e190df7d9b43ade384e84c11fb","up":true},{"one":"e0a0ba7e7e89a7af805e24abde1a5a5b489ba197585051a8755e8c2345c3d57b","other":"fc3911383f74a982f6af8ab95a63426b56117d45f153b3c1441459d9191daaff","up":true},{"one":"f305273a7d08e72f69b0b153855e822f252cbbf34a18f305134eed9d1eb7b58a","other":"c42e6492879439eeecd9938d17ff283fd8f5f24206906ca512b4daa4803b78b4","up":true},{"one":"c96146ee47ec7cd74551cf74f00213bc337d643c4327393f0e6848ecd4a0f8d3","other":"6e7f1f3d65364399617a4d95fdd04f2ca9b007b2366943e7ba5acd4616a7a425","up":true},{"one":"b6dffac4b4eb2974ed0ed241799f97d2e5d9be671e311266826d0dcfecfcc209","other":"b8e1a8622c256ef29acd52df7b3ace50820fb1a147716165ff862fdc973a48cd","up":true},{"one":"1addd4a9f01486212e13e43a9650b7f793617d1cb59fb8d941270d7ae55f575f","other":"140dd212f2b193ee6a9d7fc14f7da321c7ef6fd367fb4f194924fd0ad5d135cc","up":true},{"one":"ab719e60a77ba5253f1690c920df9dd9f3a62071e9cce9d62e0001a522b3409e","other":"9c8e1f23f260c5a46b0001572675b19e5293ca65e7fdfc131c07612e9c4072fa","up":true},{"one":"3938e6b2c095084dc9975a3e8649133557495d34ac6df874c6d929266e3ffe6f","other":"553824ef701d3cd0191ae3a67de564ed0cf553e74bd60ed9de321f9302732ba6","up":true},{"one":"8d192b11538072db750f71204e2e6adf9dc0508d9c5cf1eb457e4e996cd985bc","other":"ec90a22f41ee659d5759a497946ac2991c916f00fe7caeeeb0908f3af1fe60b6","up":true},{"one":"9f0e2bf8a962156c9e0a83c3d42ad3dc5ac5c3e508f24200bfb151aad4e395ff","other":"a2a163ce2cb092b411c994cc5d5ef555d539d2dcf4e7e1aeb528d2216dc481e5","up":true},{"one":"84a9db7645c792dc38c1f2113a8f0590d04e1c94d9a8c464ab0ec8219303d966","other":"c603138e40fe2f85cc634017956ada6399fca99969e3bf0c1ee8428374e779f1","up":true},{"one":"48f1ca6d433019f932fa4ae03e0decbcbea3fe635edff4458a669b83f8162b9a","other":"5c7c15798e86fe794bb201614d46366ea96dc51091f5b19f149995e0d40df0a6","up":true},{"one":"6b4ee1b73942ced78f97c0d0e221209933e63ae7353bb9ab3d37ac4127592e86","other":"a5053958f0cefcff1826bf02525fda98c4dc954cc38690f3c43ecbf0b2ad57af","up":true},{"one":"ddb8be472c3d48dc4d3d112448e6c0c4a826a18af3f3b53fdfef8cd31053c75f","other":"c9c302de4afe7b4dcbb6f3e366ce747083f9dcd7d5c6a01b939da5cdc6ccc874","up":true},{"one":"da36d1df95a158b0d3f9e7407d663a6b611dde0a77f00a584b97a939ab6a00de","other":"a0c88ba70599b0e72c18fa6aedd14d607cca3e9a49a5d50165d084e70328c2dd","up":true},{"one":"7c464054ea7b6c9ea0c7d4c209769c92f294a9db2ca159b8ef168e310a1eac3a","other":"d9cf19895e015cb534d915aed83c0d26bf40a11244027812e17c3bec6e645a8e","up":true},{"one":"2ddffddbf452f0c9268058a739f5757fb90281cbfd31bd6f760acc3392fec12a","other":"2e65d05648b798fafbc9bb582c05e6f8f891131260e8c90ca725ddcbc823f315","up":true},{"one":"09b3fa30780931e18b92c75d1cdeafa365609c565e4e8c253d393835cb82d98e","other":"31e129ab3df7e082cc27c649d9ee29a3ea646d6a97d2417875b80e3ff576c047","up":true},{"one":"fc3911383f74a982f6af8ab95a63426b56117d45f153b3c1441459d9191daaff","other":"9f7d72b7d9843872904b841e421985082428fba5010db27dd871ed76630a1e1d","up":true},{"one":"447cdbf1ff462aa67d6a46085b1a84fdc495a4142ab174c8e69b271b09732b4d","other":"ed424d24d702520bf7cb5f6babbdc43a078435fb4a9884ed82a93d642839e127","up":true},{"one":"fa240411bc4f3e44dfca3faedd112c7743a67b522a910bc99696ef0b31732ee2","other":"feb3bc17ee7369a4fa9889d9250fed3c1257c70916871996e6eabd374dd8dc2e","up":true},{"one":"1049d321a450726cf39d1d7cea1c108be3bec137a644b62cdc73a853f5a5a22b","other":"c9c302de4afe7b4dcbb6f3e366ce747083f9dcd7d5c6a01b939da5cdc6ccc874","up":true},{"one":"138dbc1662c4ce9b2b30ef5035914cc70465666fe18f313318e662d13f099621","other":"26ab9c813822dbb4f1a230cd8e99e8ab280b242747deb55fdf93d160906ef331","up":true},{"one":"a4ee49bb2caabb6b9448bcdff1fc3cc673a2db04eab9f5c62d1787f2c25990a0","other":"8f9aa2cd33d18e7cb4494d11a7532c97eb4a1cae172b2165c26ae4ed24887c0d","up":true},{"one":"a2e6c900511768c8c9947ab0fa2e73975cf2a4cec7fd15217abdba25c329317e","other":"8f9aa2cd33d18e7cb4494d11a7532c97eb4a1cae172b2165c26ae4ed24887c0d","up":true},{"one":"ba911175d3aa3fcc266e2a5aa32fb706208b8a9b5021a5f37c0b85f547eb375d","other":"d3e913cf4a7dabfb5699131b65e533a40adb46ea37e0ed4ce9433f99015986ef","up":true},{"one":"bcf85ecf421b871fca0247a7081188a8e2c08778b88ffad16db37ef024fec0fc","other":"bea10868d5da506c1801de845c148c2f09761893113ac913fe66674a8f43c178","up":true},{"one":"5a8b84df651871fce72d11cb1c26c87ae4a0cc6b4c274d37e70532c94f27288e","other":"6e7f1f3d65364399617a4d95fdd04f2ca9b007b2366943e7ba5acd4616a7a425","up":true},{"one":"a7a856a43293aa3004848a86f187e09343bd605e1a93e853a6f6b6b1031bd667","other":"a8f49e87156fda5510897601689ce968d77032134c523634916b96de16366f9e","up":true},{"one":"f8ff7440d6f4abb1c89496336843741ed53a544cedeeed71d8ebe0b08698438d","other":"be68267d77fb52424227267c665ca1193a010334cac057338aca77b49a4b94da","up":true},{"one":"b5eab4869b4cb65bdc1e5cab45c03016d202f9f5b668be50066451cfcf9ef299","other":"bbafac5ba5915db3c80e28b249cad260b9b5dad1f728063c48fa8f61d7556e17","up":true},{"one":"67909bdcaef2330ef120e524c76e1e382b474f3332d86f65282028e051f34c75","other":"553824ef701d3cd0191ae3a67de564ed0cf553e74bd60ed9de321f9302732ba6","up":true},{"one":"b4a1b687fbdb754fd689e26f0870a7dcab5d76190c06f3ea2ea1e198f8aa5ab2","other":"43d43e9ebcbceb4830fc1d2d5024650b90698306bbd2c4d0b4841a1a8fd09c93","up":true},{"one":"a32749dc4e134a4fbb038618c58a7c05bbbaa06f1436de3754341af86402581b","other":"f645aab9cb2bd2709998b38e5789c9c5f68d40765e6cbd93b92e6383eb671dba","up":true},{"one":"9c21cb3e56f8ac66a7917a9ba14e58f77e998ac70c178b88b5053d9ac2777e60","other":"9f7d72b7d9843872904b841e421985082428fba5010db27dd871ed76630a1e1d","up":true},{"one":"af02c2f471e96ab8defbd229215695b95e64f7c78b145b6793a238961f556fbf","other":"a4ee49bb2caabb6b9448bcdff1fc3cc673a2db04eab9f5c62d1787f2c25990a0","up":true},{"one":"56ca9dd846a58a0ffa7b49a88aad559a338ba535a6f738468b8f146c97890cb2","other":"1049d321a450726cf39d1d7cea1c108be3bec137a644b62cdc73a853f5a5a22b","up":true},{"one":"402cf9d0bffa017ebea34ede11207f3366b3ea450c0428029129a8e8026abbe7","other":"679554b410e415cfcdf1b14ef87759269b2bcaf07f4541122977db3a40091da2","up":true},{"one":"a3309f8b8bba4d8fbd7c6193d7671cb907b94e71155ef6138e0248682ff00e58","other":"d3022a46956e75bca85ba89d97b694a3a64f03ccc2d881ed0cd687d43d486925","up":true},{"one":"a606c79a018a6535375d851fcc82c42cc7c952720aa120434cedccf4a4be1f59","other":"fc514c43c4eb5c62798458da5d622e9248a6e530e4288cd902019aa05c4374d8","up":true},{"one":"d95965e449dd4069876384cf4b34f986731e255a7948f0a862d229b1dddbc502","other":"c6a8220726243cceaa6f2cebdac857a05efe721323f0a064c7f85a8340d3da96","up":true},{"one":"81a5a07f92f813e85b501b0028e1caa6e6a6c7efa5195ecb693cd2d91d5132a0","other":"9c8e1f23f260c5a46b0001572675b19e5293ca65e7fdfc131c07612e9c4072fa","up":true},{"one":"b8e1a8622c256ef29acd52df7b3ace50820fb1a147716165ff862fdc973a48cd","other":"955da15edae50a4c68bc8c579b9799d55f41b7c2a6178f645f79d772e0116662","up":true},{"one":"e09f98114da64e7547b351637190f6621a1f75568cfa9960980fc77618f8855b","other":"ba911175d3aa3fcc266e2a5aa32fb706208b8a9b5021a5f37c0b85f547eb375d","up":true},{"one":"59876e7ff9e92243856dad23126e1d38d9a5ddae79772ed1b2bdb91f33a4a4b5","other":"30feca631f06041cb14cead384dfaa5fffa6dc34b0cee54230efbe15e56a5884","up":true},{"one":"08bd1e049859b4a7c8078ca9741fe3daa668b9fe478da06d1a435cd5566b3e11","other":"26ab9c813822dbb4f1a230cd8e99e8ab280b242747deb55fdf93d160906ef331","up":true},{"one":"a5ac04d53b569e418ef5007961431155f2c226ee10157b30af71ea4836b08089","other":"a606c79a018a6535375d851fcc82c42cc7c952720aa120434cedccf4a4be1f59","up":true},{"one":"c2d00c7d960174c0934129fdcec63525bfa728f78fb70b7c52036b772d6297ad","other":"ba911175d3aa3fcc266e2a5aa32fb706208b8a9b5021a5f37c0b85f547eb375d","up":true},{"one":"1bd588263274543729d54529ae9e9bf4596db40649a1c2a3f73168d818f34b62","other":"a2a163ce2cb092b411c994cc5d5ef555d539d2dcf4e7e1aeb528d2216dc481e5","up":true},{"one":"6d5ec591af4966ba024c6b2aeb45e0aab8aa1762f9cac30ce3934da529b738e9","other":"6e7f1f3d65364399617a4d95fdd04f2ca9b007b2366943e7ba5acd4616a7a425","up":true},{"one":"d700d96de1193456dc0bcf492c7c11b0951062974af2f7f47b8c901b17c23165","other":"24f80c437be45898e594f821bba0f5c62e0c9a0c720118e362ee6f78410612bd","up":true},{"one":"c8c8a93779ec4d9ac40925e8208478a00ee27fc220ddd73d8774cf6bfa255c46","other":"cd6c8b42a0b092f41e6925577c9de7d1bea17231bcb3d08f3d3cce9c6fdcf22d","up":true},{"one":"f9ded7b83e473e71be2fc0101d574c44521c96f77f9f84a384785a3af6b1093d","other":"d3022a46956e75bca85ba89d97b694a3a64f03ccc2d881ed0cd687d43d486925","up":true},{"one":"9257dc934dfbf17473b70cb85333c6fab67ee9b6228a646576c4f57253f1004e","other":"a0c88ba70599b0e72c18fa6aedd14d607cca3e9a49a5d50165d084e70328c2dd","up":true},{"one":"48de553e15afd3e8a46bfc3a5ba8a298158aa3d60f140d2730230af5cce8084d","other":"5d82a418629cfbe7c57105309319ad695a198626fe3571de213a12ddf62f7308","up":true},{"one":"2a507f5cb921137a7225c9c4988a8514af0f7e3c442cb8bf2bb612dc522a7daf","other":"f8ff7440d6f4abb1c89496336843741ed53a544cedeeed71d8ebe0b08698438d","up":true},{"one":"32ff1969d90aaa5a8ed2260968a8e2bac2d1cae597c906f90495f1dc5de7f8d3","other":"c42e6492879439eeecd9938d17ff283fd8f5f24206906ca512b4daa4803b78b4","up":true},{"one":"8006b080c78a0ab54fa1be75a939bee2334322fded6c3563de1596b17c36172c","other":"a0c88ba70599b0e72c18fa6aedd14d607cca3e9a49a5d50165d084e70328c2dd","up":true},{"one":"5814be13c8550b9a5a83d08e7af6022002a8fdaa38ba6c2c30be58099a9f7744","other":"6d3c6db15900f2596286f81cc0664d2c8291ead5bad2aa35bad515af088a2e48","up":true},{"one":"18e00a7e0f826a1aba3f8c0f533ed905f2eee607b697fff056ee7874d374adcd","other":"031450ec20f353435b429b5fa64f616d07c9d586afabc7a2772e05ad5c88bf50","up":true},{"one":"eebd48b367cbfe94a37c0deb274a697e628074f9560b909e66229c5c76ce68eb","other":"d3022a46956e75bca85ba89d97b694a3a64f03ccc2d881ed0cd687d43d486925","up":true},{"one":"679554b410e415cfcdf1b14ef87759269b2bcaf07f4541122977db3a40091da2","other":"2c85f5361b2d5abcf799de50fe58b1ed2006ea18f75823748c33eb7e95b1cc39","up":true},{"one":"8402bd62282811ed236b2fa1f0d41ad4bbe54e420ee34adc6164cfd4baf8658d","other":"c603138e40fe2f85cc634017956ada6399fca99969e3bf0c1ee8428374e779f1","up":true},{"one":"19ea0a685fc4edd298b736dc7a778c9ec4362de378876911105fa9ba2ce90204","other":"1070df5e904e3865085b0319a81761e59146494c689e7567efe7465fc819ae8b","up":true},{"one":"482ec3dc05460579ea9bce87677bd3d9a1930e801fabeba607b8ab6b8729ff15","other":"7850f5ee5048959559b3af0f95689669b250fc3aa58bcc9544dca61ca9c9769c","up":true},{"one":"67f383e5334e9b6701d1dbb20876d4ba9a7e578af0476caed4a7e1b701f2bedb","other":"6b4ee1b73942ced78f97c0d0e221209933e63ae7353bb9ab3d37ac4127592e86","up":true},{"one":"398038811c1c7402fe2e6994c9ce2f15c8166b8e99f379feaaed66ac87702062","other":"793322608055d4873776a9a0a6c40b04379bfd2f289a8ad49a7dc456bc65f871","up":true},{"one":"305162c472c71ddef2320b138102b67d1ce2b8bba79e2e587fc80e085c88e547","other":"5a8b84df651871fce72d11cb1c26c87ae4a0cc6b4c274d37e70532c94f27288e","up":true},{"one":"5ac0d00b8d647dec62d26e1a689fd05b8b7a1a79ab8c43493bd6d7d209816df1","other":"79e5c6c6d78c88c579003cda044882ecb04520fbad1f5feadbe7b6d23fe183c8","up":true},{"one":"46bfa8bea56b0be1abfa5ad3561bb6bf49ed6695d83ee2b2c192c5a0408347cf","other":"52a8747e4ea35f6f50c72d7c481616f68a5e4396248332b8ff69d3a772de49ac","up":true},{"one":"26acc3c373c29150af30bbc9264d0c44c7c606ff7377399ddf844635e97afcfa","other":"6d3c6db15900f2596286f81cc0664d2c8291ead5bad2aa35bad515af088a2e48","up":true},{"one":"ec90a22f41ee659d5759a497946ac2991c916f00fe7caeeeb0908f3af1fe60b6","other":"b8e1a8622c256ef29acd52df7b3ace50820fb1a147716165ff862fdc973a48cd","up":true},{"one":"5d82a418629cfbe7c57105309319ad695a198626fe3571de213a12ddf62f7308","other":"93ea8ef251fd56b159e080cdf733d33e1fdfb3c7ae5bd9a6a328d0bf5458867b","up":true},{"one":"84a9db7645c792dc38c1f2113a8f0590d04e1c94d9a8c464ab0ec8219303d966","other":"a0c88ba70599b0e72c18fa6aedd14d607cca3e9a49a5d50165d084e70328c2dd","up":true},{"one":"80735a728720bba0ac08daaccd093370d672a8f9a50845ad78ccd6cf8686c39f","other":"56635699bd3bc78193adbdb8e8b7c2c91dab4140fdaa506fea2300ee86c4ba81","up":true},{"one":"48f1ca6d433019f932fa4ae03e0decbcbea3fe635edff4458a669b83f8162b9a","other":"679554b410e415cfcdf1b14ef87759269b2bcaf07f4541122977db3a40091da2","up":true},{"one":"f1ed9d45622ff974a1e396cd878b2deb89e31aa5d08da773423f292ae8dbcbb6","other":"50c1a8023bfecffb09472fdc50898f4d050a31443d40a6c07b629090beb0df3d","up":true},{"one":"ab3ff955033c0a2615932faf85fd20090b9121c7edcc8e6f7ce4c4fde0a96b8a","other":"a5053958f0cefcff1826bf02525fda98c4dc954cc38690f3c43ecbf0b2ad57af","up":true},{"one":"8b4318f86ad47976321af97bfbf95cd0a3b0aa22447aeb0611ed1a9bf1e6a4bf","other":"a8b58013ff911871d1aa6c2bbea6c2e6ef9b00b87b80a41dc04724ad0488e2ff","up":true},{"one":"a6165a4b02d58be116892982c0ed3d49d86fec0e9f436a516b61868331ed853f","other":"ff75b19017c84128f38dec4f63e1f247a5691dc0fae186e667afedb5fe9d2c80","up":true},{"one":"2ddffddbf452f0c9268058a739f5757fb90281cbfd31bd6f760acc3392fec12a","other":"0e80db9dfa8ce29bedfb2de031622bef8829bee52771322b6a7efb47afe540e7","up":true},{"one":"a8ff8d69dcb36462d1116dafa5e3d0c7237bf65dbece482a316862c8d66e35b6","other":"b8e1a8622c256ef29acd52df7b3ace50820fb1a147716165ff862fdc973a48cd","up":true},{"one":"096a8302b6f369c28ed9d47719a507ead8a3cc1ca4fa1e32318b7f97873955fe","other":"1bd588263274543729d54529ae9e9bf4596db40649a1c2a3f73168d818f34b62","up":true},{"one":"ab719e60a77ba5253f1690c920df9dd9f3a62071e9cce9d62e0001a522b3409e","other":"a0c88ba70599b0e72c18fa6aedd14d607cca3e9a49a5d50165d084e70328c2dd","up":true},{"one":"8cc3fb39009d0adc26fca1e2ee96822d168d4debc379fd516c15d4b4a1624231","other":"aeb45fe10b0dbd0f72ab6a77fbf971a8f46dbcdd96c08f23279d1434b4f38b1d","up":true},{"one":"aaf051a087a92f874a3f6c7923015e4cffb4bb3ef381c977fd902f21e841d0f4","other":"84a9db7645c792dc38c1f2113a8f0590d04e1c94d9a8c464ab0ec8219303d966","up":true},{"one":"8e7b96d28edae711e1a4cee0d894e0bd92cdf410ba6f61713f7d9b0bee761d4c","other":"80d7e892bbb26808abb1d1530077fec6b08768c151a9f220881da3c862bae0af","up":true},{"one":"bcf85ecf421b871fca0247a7081188a8e2c08778b88ffad16db37ef024fec0fc","other":"cf52b3fc82ec24c3e9b40488d7c5f7ac8af731d159a103619bee932ec74d5e92","up":true},{"one":"1070df5e904e3865085b0319a81761e59146494c689e7567efe7465fc819ae8b","other":"0d1c35c6ea485cb33857b790ee262f974cf0d54cf8ce3003f8308ac2e87c2c25","up":true},{"one":"7850f5ee5048959559b3af0f95689669b250fc3aa58bcc9544dca61ca9c9769c","other":"16868ec5d8f490ac73ea28b4e8fdda55ac149bb1aafb177545b54b84a5ad5367","up":true},{"one":"6d3c6db15900f2596286f81cc0664d2c8291ead5bad2aa35bad515af088a2e48","other":"79e5c6c6d78c88c579003cda044882ecb04520fbad1f5feadbe7b6d23fe183c8","up":true},{"one":"8e282b0f27d4fa56fe14cfeb69fac5a53e3d882c7778eb190653e2eab7c93fd2","other":"b5eab4869b4cb65bdc1e5cab45c03016d202f9f5b668be50066451cfcf9ef299","up":true},{"one":"9c8e1f23f260c5a46b0001572675b19e5293ca65e7fdfc131c07612e9c4072fa","other":"aceee75a260d45252060fe971eabd4bde25f912db4a3c6e47f4a09572fe01697","up":true},{"one":"dbd4d90e3342ef837b8ecf5c6e490f7c409f419cf36b77162a87cb2cfb8ae33c","other":"ddb8be472c3d48dc4d3d112448e6c0c4a826a18af3f3b53fdfef8cd31053c75f","up":true},{"one":"07f5d094a4b22e73cdd6c85452b3d928da9b4b16873824759cb7e8a622417fd5","other":"194ea3e14dc5d99f98d15607dc4c405769f5a371acc22d41a62d0537d716be32","up":true},{"one":"31e670638acba3d58f4c67f3ff2f3f25d769e8a5d7a7838927f4d9d169a84404","other":"019109311d4888497aa194cce4a89b5ef243421cf0e7e7bb9115d086e1a1f7d7","up":true},{"one":"9f7d72b7d9843872904b841e421985082428fba5010db27dd871ed76630a1e1d","other":"d700d96de1193456dc0bcf492c7c11b0951062974af2f7f47b8c901b17c23165","up":true},{"one":"ff75b19017c84128f38dec4f63e1f247a5691dc0fae186e667afedb5fe9d2c80","other":"e2770cef7c1ad312b70d94ca5570e45f324c798a31a93203f505167aeab122b6","up":true},{"one":"0cfc7309afabceeb7d248714e972cf3987205324f5ab8d048d17bea5dc87369d","other":"05949ec1a582fa70cab95c59e7c0d315583bf9fc320c60c35268931f21e90853","up":true},{"one":"402cf9d0bffa017ebea34ede11207f3366b3ea450c0428029129a8e8026abbe7","other":"6c0142984d629ae6995894de9e7e5eb8d3fe45e1641d7ebd63959d2e61548ba3","up":true},{"one":"97daf2cbe03c80ce6c4dae39cd071dd93cb32ed245aa9aa77285e12296957ca3","other":"95c0a351fb7aa6683280d159a7b808bfa63f63bff91a1c5936e973b2e5d3954f","up":true},{"one":"4b79e83186f2ab05932eaa99982a2e53373b83780e32d224d15cb2c85462451f","other":"5a26ae73eebf27f6dbec2414f1277a249e814a7a06790d7061610e5227b086f6","up":true},{"one":"4a95d49f58057b039b55a34f67a348c052f61770065e41243ff055efc570a935","other":"5c7c15798e86fe794bb201614d46366ea96dc51091f5b19f149995e0d40df0a6","up":true},{"one":"cd6c8b42a0b092f41e6925577c9de7d1bea17231bcb3d08f3d3cce9c6fdcf22d","other":"793322608055d4873776a9a0a6c40b04379bfd2f289a8ad49a7dc456bc65f871","up":true},{"one":"7660828fb0c8f89201d34e6f4d61cc6ba9a30cead6e4eb8253f6cc92e1845f23","other":"5a26ae73eebf27f6dbec2414f1277a249e814a7a06790d7061610e5227b086f6","up":true},{"one":"4cece9bc134bc2b09400c9f7f8a4df9270d2fe3c077c5e441fffc911fcf6f42e","other":"194ea3e14dc5d99f98d15607dc4c405769f5a371acc22d41a62d0537d716be32","up":true},{"one":"a8f49e87156fda5510897601689ce968d77032134c523634916b96de16366f9e","other":"a742e8502c619703ce87890110f908bde32b59dc61d77a247759e5d0056e0c94","up":true},{"one":"8358a74fc8d8e39ccc40b4d3a212b7a69a6a8f6afc25cff2c9c7b44bbaf9ec82","other":"93c0e1adf23fdf1623359eb88c517bc521d5a26325554df890cc04c1fa17a5df","up":true},{"one":"a742e8502c619703ce87890110f908bde32b59dc61d77a247759e5d0056e0c94","other":"ec90a22f41ee659d5759a497946ac2991c916f00fe7caeeeb0908f3af1fe60b6","up":true},{"one":"56635699bd3bc78193adbdb8e8b7c2c91dab4140fdaa506fea2300ee86c4ba81","other":"50c1a8023bfecffb09472fdc50898f4d050a31443d40a6c07b629090beb0df3d","up":true},{"one":"d20931ce3da972fd23ea306e5c604a1fbd9417ba02654c5cdbe278fe259f75d5","other":"c603138e40fe2f85cc634017956ada6399fca99969e3bf0c1ee8428374e779f1","up":true},{"one":"e0a0ba7e7e89a7af805e24abde1a5a5b489ba197585051a8755e8c2345c3d57b","other":"c272b12f4020ae5b20e3d29cd09de03fa0088e3eeb5f07aa7728b29a3e90e687","up":true},{"one":"f6c028d6a2b6408e90169151f4519b561ed183bd8925ed9a1702806f397666e7","other":"43c9e1571c460cb9f599fa8ed79ddd0f9c3a21fd2fa455e0603109c55012f76b","up":true},{"one":"1fd0192df1fbf33771ca575afbb4e27c6541cce4a3cff2dfc1f2c085e7fab79e","other":"0e3b7722f3f84d83b3d744bea4e893715a01d4df3cf4a1c6a6823a1f5c9ad6b8","up":true},{"one":"fc514c43c4eb5c62798458da5d622e9248a6e530e4288cd902019aa05c4374d8","other":"ddb8be472c3d48dc4d3d112448e6c0c4a826a18af3f3b53fdfef8cd31053c75f","up":true},{"one":"c53417f008e4550e1c4cb9a3e2955b3af6403e059b7b4b4c33869d9ed4a580a5","other":"8358a74fc8d8e39ccc40b4d3a212b7a69a6a8f6afc25cff2c9c7b44bbaf9ec82","up":true},{"one":"34118166845c185d15c286b7e5433539ee98ed634baabd534d57369fd5f7c681","other":"6d3c6db15900f2596286f81cc0664d2c8291ead5bad2aa35bad515af088a2e48","up":true},{"one":"741a854ae299df49a738725bc58abe614e5e4302ffecd8320bbede8412d160c0","other":"648a96d61898eb2d336ff7d5a229cfeb7b9f587282e40f9fe640e181ae26bdd3","up":true},{"one":"b659418885032905ea20ad47d70470e403e7e407e0e9ebf9277f9a2d81ec121c","other":"a8b58013ff911871d1aa6c2bbea6c2e6ef9b00b87b80a41dc04724ad0488e2ff","up":true},{"one":"094256812084c6052a2604149aa3aba2379c483bf4ec25162f6b43934942775a","other":"553824ef701d3cd0191ae3a67de564ed0cf553e74bd60ed9de321f9302732ba6","up":true},{"one":"e09f98114da64e7547b351637190f6621a1f75568cfa9960980fc77618f8855b","other":"a8b58013ff911871d1aa6c2bbea6c2e6ef9b00b87b80a41dc04724ad0488e2ff","up":true},{"one":"feb3bc17ee7369a4fa9889d9250fed3c1257c70916871996e6eabd374dd8dc2e","other":"f2b49a2247c9c5e8f6f755834a37fe5c17f208f994878e14b7001e404f52e125","up":true},{"one":"09b3fa30780931e18b92c75d1cdeafa365609c565e4e8c253d393835cb82d98e","other":"e64d90760cd81e4f112bbf1432e76c82fa4173fd474b988f4096ce187363fd81","up":true},{"one":"24f80c437be45898e594f821bba0f5c62e0c9a0c720118e362ee6f78410612bd","other":"2ddffddbf452f0c9268058a739f5757fb90281cbfd31bd6f760acc3392fec12a","up":true},{"one":"025de1d2ec529d3a7da302eef0f8c54996616d40c940c0956d470ffc2a007f33","other":"36b93656cab02213fa76124af6251109356abc5e0ae5dd1e203c6a013e014548","up":true},{"one":"9f0e2bf8a962156c9e0a83c3d42ad3dc5ac5c3e508f24200bfb151aad4e395ff","other":"837f0993f6374039a5ad4472d6313e647a4c5db4583bd27ccfa98d3448a17731","up":true},{"one":"6e7f1f3d65364399617a4d95fdd04f2ca9b007b2366943e7ba5acd4616a7a425","other":"67f383e5334e9b6701d1dbb20876d4ba9a7e578af0476caed4a7e1b701f2bedb","up":true},{"one":"30feca631f06041cb14cead384dfaa5fffa6dc34b0cee54230efbe15e56a5884","other":"138dbc1662c4ce9b2b30ef5035914cc70465666fe18f313318e662d13f099621","up":true},{"one":"2c8042517dfeaa01586e91e491dd4154fb24c0d84fedb0404b9d5136f60da1d9","other":"2e65d05648b798fafbc9bb582c05e6f8f891131260e8c90ca725ddcbc823f315","up":true},{"one":"3b020c84fb60f59779324d451d9770d683e08133bbaa2d5762f61b8fd4b8d9fd","other":"36b93656cab02213fa76124af6251109356abc5e0ae5dd1e203c6a013e014548","up":true},{"one":"035f15499cdb0f079b3e358ad54a6122681442a5293c3ae2fdf6c527004b36d2","other":"178401ec8d01a0a4f551d23e880a8e8a4eb87773565363843d51cf52660b1211","up":true},{"one":"95c0a351fb7aa6683280d159a7b808bfa63f63bff91a1c5936e973b2e5d3954f","other":"dad08999cd2edc33cfdc59ea34c8adcd6a34eaa15f2e85b0622e9848b215c1d5","up":true},{"one":"447cdbf1ff462aa67d6a46085b1a84fdc495a4142ab174c8e69b271b09732b4d","other":"4d381014783980b2f77f0d71160ad9e9d84672b576f4435ccdbae12752350c1c","up":true},{"one":"5c7c15798e86fe794bb201614d46366ea96dc51091f5b19f149995e0d40df0a6","other":"4005fd1fa8fbb318b29a62c368ada579e5122ca0578e6a75c509552be4b63b76","up":true},{"one":"834f14e9f325482adef62651ddf3685690dd5ebdd18014f2bd266b2143c290ff","other":"a606c79a018a6535375d851fcc82c42cc7c952720aa120434cedccf4a4be1f59","up":true},{"one":"31e129ab3df7e082cc27c649d9ee29a3ea646d6a97d2417875b80e3ff576c047","other":"298ae5d173c5360bc9ad5b492ed35de3b6e0cae868a34bfe6311a8ba5ea9877e","up":true},{"one":"807416cc70f02d481a188027f7932b48e8f7b5e8258f7e9623f3f6e2985d8f6a","other":"87a337622455ae65daf3ab2555cee8985e9aa14bac245545d985296060e4a8de","up":true},{"one":"8ea2c8acc111f38d5b4a5ed60252ee83f312d0f8359265d5b9266d54735052fe","other":"8b4318f86ad47976321af97bfbf95cd0a3b0aa22447aeb0611ed1a9bf1e6a4bf","up":true},{"one":"ef99b6cdc05345a1ee82267890e3ccaeef1f2bd2fe7ae8b02b6b20b9a5ef85bb","other":"e2d36f335d90ad63148db8e353a78a30d8d9c0abe107be2cf8685f6a01ce74b9","up":true},{"one":"e2d36f335d90ad63148db8e353a78a30d8d9c0abe107be2cf8685f6a01ce74b9","other":"f305273a7d08e72f69b0b153855e822f252cbbf34a18f305134eed9d1eb7b58a","up":true},{"one":"aeb45fe10b0dbd0f72ab6a77fbf971a8f46dbcdd96c08f23279d1434b4f38b1d","other":"b3f95f225e2b6b76e6c7ef7c86caf83e35213f6a22da41e653ca1c190be23c9c","up":true},{"one":"a9700308516c02cf9aea8809000a4e0596d6b44753e10bd0928df83e2eb9b9e7","other":"aaf051a087a92f874a3f6c7923015e4cffb4bb3ef381c977fd902f21e841d0f4","up":true},{"one":"0111e720a84b310f863c2530fbe149e6a221acbad01065c5d052d2b3e1716f54","other":"18e00a7e0f826a1aba3f8c0f533ed905f2eee607b697fff056ee7874d374adcd","up":true},{"one":"a2a163ce2cb092b411c994cc5d5ef555d539d2dcf4e7e1aeb528d2216dc481e5","other":"cd6c8b42a0b092f41e6925577c9de7d1bea17231bcb3d08f3d3cce9c6fdcf22d","up":true},{"one":"bea10868d5da506c1801de845c148c2f09761893113ac913fe66674a8f43c178","other":"a8f49e87156fda5510897601689ce968d77032134c523634916b96de16366f9e","up":true},{"one":"8006b080c78a0ab54fa1be75a939bee2334322fded6c3563de1596b17c36172c","other":"9c8e1f23f260c5a46b0001572675b19e5293ca65e7fdfc131c07612e9c4072fa","up":true},{"one":"5ac0d00b8d647dec62d26e1a689fd05b8b7a1a79ab8c43493bd6d7d209816df1","other":"bbafac5ba5915db3c80e28b249cad260b9b5dad1f728063c48fa8f61d7556e17","up":true},{"one":"43c9e1571c460cb9f599fa8ed79ddd0f9c3a21fd2fa455e0603109c55012f76b","other":"6d3c6db15900f2596286f81cc0664d2c8291ead5bad2aa35bad515af088a2e48","up":true},{"one":"7ce7fec833a2e8c7720fcc97f820f2ca2aca85388210f887c3efe78b020766e7","other":"67909bdcaef2330ef120e524c76e1e382b474f3332d86f65282028e051f34c75","up":true},{"one":"9257dc934dfbf17473b70cb85333c6fab67ee9b6228a646576c4f57253f1004e","other":"8b4318f86ad47976321af97bfbf95cd0a3b0aa22447aeb0611ed1a9bf1e6a4bf","up":true},{"one":"16868ec5d8f490ac73ea28b4e8fdda55ac149bb1aafb177545b54b84a5ad5367","other":"482ec3dc05460579ea9bce87677bd3d9a1930e801fabeba607b8ab6b8729ff15","up":true},{"one":"3f31ecaffaa6311c82c9a575bbc38d6bcb16630ac87e19d1853a64aa96c9dcde","other":"31e129ab3df7e082cc27c649d9ee29a3ea646d6a97d2417875b80e3ff576c047","up":true},{"one":"f215bc09268e60ebbec76f743bebd09d7e72d4cbeedc0b9d3417bb4a2ef42935","other":"e09f98114da64e7547b351637190f6621a1f75568cfa9960980fc77618f8855b","up":true},{"one":"b3f95f225e2b6b76e6c7ef7c86caf83e35213f6a22da41e653ca1c190be23c9c","other":"e2770cef7c1ad312b70d94ca5570e45f324c798a31a93203f505167aeab122b6","up":true},{"one":"a5053958f0cefcff1826bf02525fda98c4dc954cc38690f3c43ecbf0b2ad57af","other":"837f0993f6374039a5ad4472d6313e647a4c5db4583bd27ccfa98d3448a17731","up":true},{"one":"7e47a2f82984a600c8583605a91d5cb8f2d9a18961845e9c422edd78e20ac3a3","other":"2a507f5cb921137a7225c9c4988a8514af0f7e3c442cb8bf2bb612dc522a7daf","up":true},{"one":"7049e92a396311fbf2f4a55bb5bd2fe3f7bb3c1a63f41bb88eb800edd45ac6e5","other":"7ce7fec833a2e8c7720fcc97f820f2ca2aca85388210f887c3efe78b020766e7","up":true},{"one":"5a26ae73eebf27f6dbec2414f1277a249e814a7a06790d7061610e5227b086f6","other":"80d7e892bbb26808abb1d1530077fec6b08768c151a9f220881da3c862bae0af","up":true},{"one":"994839e5f3a5b8b23aed84fb029413124af17804b79b0263ec6bfd5aec5dad78","other":"b5eab4869b4cb65bdc1e5cab45c03016d202f9f5b668be50066451cfcf9ef299","up":true},{"one":"1b1dc3f9312df141855c545dd16aee325f9a609230ec6165bdbbb07d0c0862f6","other":"2fd2f77d76cca480ac18e9af7a462f297db168c3370b3bc0e2c04aa006c4d037","up":true},{"one":"398038811c1c7402fe2e6994c9ce2f15c8166b8e99f379feaaed66ac87702062","other":"5ff09c6859736aad7a82a3bfb3f1a1a8b3c0d58f831863540d9c3013dd35745e","up":true},{"one":"eb686a686fd70e41659cc69ec0db53d1512dfec238918afd0a515d8ce177d4d9","other":"c603138e40fe2f85cc634017956ada6399fca99969e3bf0c1ee8428374e779f1","up":true},{"one":"a742e8502c619703ce87890110f908bde32b59dc61d77a247759e5d0056e0c94","other":"af02c2f471e96ab8defbd229215695b95e64f7c78b145b6793a238961f556fbf","up":true},{"one":"08e5a268f397385c69a7fec855ae4d889cfa98afef5b7c09fc4841e3f8894ad8","other":"1addd4a9f01486212e13e43a9650b7f793617d1cb59fb8d941270d7ae55f575f","up":true},{"one":"c6a8220726243cceaa6f2cebdac857a05efe721323f0a064c7f85a8340d3da96","other":"a0c88ba70599b0e72c18fa6aedd14d607cca3e9a49a5d50165d084e70328c2dd","up":true},{"one":"ab3ff955033c0a2615932faf85fd20090b9121c7edcc8e6f7ce4c4fde0a96b8a","other":"af02c2f471e96ab8defbd229215695b95e64f7c78b145b6793a238961f556fbf","up":true},{"one":"dbd4d90e3342ef837b8ecf5c6e490f7c409f419cf36b77162a87cb2cfb8ae33c","other":"885427318634c458a3050f2f26eb52454a75cea4a1263b9ed55e6eb899743854","up":true},{"one":"f7561cb6740e17ec7c7d17068251b2c951d954c77804aa5af60464e9c3964e57","other":"cf52b3fc82ec24c3e9b40488d7c5f7ac8af731d159a103619bee932ec74d5e92","up":true},{"one":"9464ad8da1a5effdc0351742dfffae941ffd9fab469637b2491caece53c57dc8","other":"951877b34ee1535b5059c49beb03e8960ff9c12b694ef64708c77c30ff1dc706","up":true},{"one":"eff2450bea797ff66d93e7c1c1b0977cddf3abba64bfa51bcc509d728569e2fa","other":"a3309f8b8bba4d8fbd7c6193d7671cb907b94e71155ef6138e0248682ff00e58","up":true},{"one":"26acc3c373c29150af30bbc9264d0c44c7c606ff7377399ddf844635e97afcfa","other":"0e2b48558ce2af1fbfee38a557d56072e3091cfcaee8d7847c7c9dcf7bef9bfa","up":true},{"one":"f2b49a2247c9c5e8f6f755834a37fe5c17f208f994878e14b7001e404f52e125","other":"a4ee49bb2caabb6b9448bcdff1fc3cc673a2db04eab9f5c62d1787f2c25990a0","up":true},{"one":"cc3397e9e11f75273d3f81d91f980f4504755f80b27a183212de56cc5085e58d","other":"eb686a686fd70e41659cc69ec0db53d1512dfec238918afd0a515d8ce177d4d9","up":true},{"one":"e0a0ba7e7e89a7af805e24abde1a5a5b489ba197585051a8755e8c2345c3d57b","other":"cf52b3fc82ec24c3e9b40488d7c5f7ac8af731d159a103619bee932ec74d5e92","up":true},{"one":"951877b34ee1535b5059c49beb03e8960ff9c12b694ef64708c77c30ff1dc706","other":"8402bd62282811ed236b2fa1f0d41ad4bbe54e420ee34adc6164cfd4baf8658d","up":true},{"one":"094256812084c6052a2604149aa3aba2379c483bf4ec25162f6b43934942775a","other":"9ca1fd5d41975acb905f337997922849b4070360e47849bb4fd8cd1b9ddb4d73","up":true},{"one":"a2e6c900511768c8c9947ab0fa2e73975cf2a4cec7fd15217abdba25c329317e","other":"b5eab4869b4cb65bdc1e5cab45c03016d202f9f5b668be50066451cfcf9ef299","up":true},{"one":"46bfa8bea56b0be1abfa5ad3561bb6bf49ed6695d83ee2b2c192c5a0408347cf","other":"4b79e83186f2ab05932eaa99982a2e53373b83780e32d224d15cb2c85462451f","up":true},{"one":"318828fa893a28cc0652d3f81d97c5b8e023e853685f5d3e65fde20689abcc5a","other":"3f31ecaffaa6311c82c9a575bbc38d6bcb16630ac87e19d1853a64aa96c9dcde","up":true},{"one":"a7a856a43293aa3004848a86f187e09343bd605e1a93e853a6f6b6b1031bd667","other":"b8e1a8622c256ef29acd52df7b3ace50820fb1a147716165ff862fdc973a48cd","up":true},{"one":"52a8747e4ea35f6f50c72d7c481616f68a5e4396248332b8ff69d3a772de49ac","other":"402cf9d0bffa017ebea34ede11207f3366b3ea450c0428029129a8e8026abbe7","up":true},{"one":"c190f9d08c78ed6dffadaef36e77fe6aa96099e4453753b0cfc8ec542fa96b9d","other":"feb3bc17ee7369a4fa9889d9250fed3c1257c70916871996e6eabd374dd8dc2e","up":true},{"one":"f8ff7440d6f4abb1c89496336843741ed53a544cedeeed71d8ebe0b08698438d","other":"95c0a351fb7aa6683280d159a7b808bfa63f63bff91a1c5936e973b2e5d3954f","up":true},{"one":"d95965e449dd4069876384cf4b34f986731e255a7948f0a862d229b1dddbc502","other":"d3022a46956e75bca85ba89d97b694a3a64f03ccc2d881ed0cd687d43d486925","up":true},{"one":"09b3fa30780931e18b92c75d1cdeafa365609c565e4e8c253d393835cb82d98e","other":"2a507f5cb921137a7225c9c4988a8514af0f7e3c442cb8bf2bb612dc522a7daf","up":true},{"one":"8402bd62282811ed236b2fa1f0d41ad4bbe54e420ee34adc6164cfd4baf8658d","other":"81a5a07f92f813e85b501b0028e1caa6e6a6c7efa5195ecb693cd2d91d5132a0","up":true},{"one":"4cece9bc134bc2b09400c9f7f8a4df9270d2fe3c077c5e441fffc911fcf6f42e","other":"4d381014783980b2f77f0d71160ad9e9d84672b576f4435ccdbae12752350c1c","up":true},{"one":"056152dd9dae85c426378d34acab8d6641da665d2f57359a27a0ff652f3f3d02","other":"140dd212f2b193ee6a9d7fc14f7da321c7ef6fd367fb4f194924fd0ad5d135cc","up":true},{"one":"8e282b0f27d4fa56fe14cfeb69fac5a53e3d882c7778eb190653e2eab7c93fd2","other":"a742e8502c619703ce87890110f908bde32b59dc61d77a247759e5d0056e0c94","up":true},{"one":"aaf051a087a92f874a3f6c7923015e4cffb4bb3ef381c977fd902f21e841d0f4","other":"8402bd62282811ed236b2fa1f0d41ad4bbe54e420ee34adc6164cfd4baf8658d","up":true},{"one":"3b020c84fb60f59779324d451d9770d683e08133bbaa2d5762f61b8fd4b8d9fd","other":"3c5b2e125020c80e3674df9cac34de4d8f3a94ee02556fb557921b6d5498b933","up":true},{"one":"e2d36f335d90ad63148db8e353a78a30d8d9c0abe107be2cf8685f6a01ce74b9","other":"9c21cb3e56f8ac66a7917a9ba14e58f77e998ac70c178b88b5053d9ac2777e60","up":true},{"one":"c53417f008e4550e1c4cb9a3e2955b3af6403e059b7b4b4c33869d9ed4a580a5","other":"a1c85ee75edb807a01f4ce930086c948918aade324752609b078c28991c04e86","up":true},{"one":"ab719e60a77ba5253f1690c920df9dd9f3a62071e9cce9d62e0001a522b3409e","other":"aceee75a260d45252060fe971eabd4bde25f912db4a3c6e47f4a09572fe01697","up":true},{"one":"56ca9dd846a58a0ffa7b49a88aad559a338ba535a6f738468b8f146c97890cb2","other":"16868ec5d8f490ac73ea28b4e8fdda55ac149bb1aafb177545b54b84a5ad5367","up":true},{"one":"140dd212f2b193ee6a9d7fc14f7da321c7ef6fd367fb4f194924fd0ad5d135cc","other":"3a628ef171c1f26fa0966eb89210be0a14305aae8bfed10f4ed9017698f40f4b","up":true},{"one":"84a9db7645c792dc38c1f2113a8f0590d04e1c94d9a8c464ab0ec8219303d966","other":"8862cd85d7039119b984f752a458ac0495ddea98c69fc1d1241db7873a712c11","up":true},{"one":"d9cf19895e015cb534d915aed83c0d26bf40a11244027812e17c3bec6e645a8e","other":"fc514c43c4eb5c62798458da5d622e9248a6e530e4288cd902019aa05c4374d8","up":true},{"one":"d3e913cf4a7dabfb5699131b65e533a40adb46ea37e0ed4ce9433f99015986ef","other":"ff75b19017c84128f38dec4f63e1f247a5691dc0fae186e667afedb5fe9d2c80","up":true},{"one":"a32749dc4e134a4fbb038618c58a7c05bbbaa06f1436de3754341af86402581b","other":"c9c302de4afe7b4dcbb6f3e366ce747083f9dcd7d5c6a01b939da5cdc6ccc874","up":true},{"one":"59876e7ff9e92243856dad23126e1d38d9a5ddae79772ed1b2bdb91f33a4a4b5","other":"046ca54165f0dd4d62fd7d8ee9e97c655db3d35f5452a0ccb0dffc79c047978c","up":true},{"one":"14849f811af20ce19fb29417d20c15fc16da1e45aebdf795a2c6ccb671e4bdac","other":"08e5a268f397385c69a7fec855ae4d889cfa98afef5b7c09fc4841e3f8894ad8","up":true},{"one":"cdb13873ac058861f295ebca5d958bf2bb793e3f9e274cf5a73a633425a9276f","other":"f7561cb6740e17ec7c7d17068251b2c951d954c77804aa5af60464e9c3964e57","up":true},{"one":"3728152c88f1e5e61f6523b09e8f3bb1023b700deccdca5fcc1e6488136b0e57","other":"3c5b2e125020c80e3674df9cac34de4d8f3a94ee02556fb557921b6d5498b933","up":true},{"one":"48d79ac55f8df512af8e7d868aa40ac9b61493fa4f1b0ce0b76bf6da2eb30e78","other":"4b79e83186f2ab05932eaa99982a2e53373b83780e32d224d15cb2c85462451f","up":true},{"one":"08f84878e44fed2adb4b2685b9f293dc3c73d5f9bc1c474870d943ec2ae73dbe","other":"3728152c88f1e5e61f6523b09e8f3bb1023b700deccdca5fcc1e6488136b0e57","up":true},{"one":"955da15edae50a4c68bc8c579b9799d55f41b7c2a6178f645f79d772e0116662","other":"9ca1fd5d41975acb905f337997922849b4070360e47849bb4fd8cd1b9ddb4d73","up":true},{"one":"f215bc09268e60ebbec76f743bebd09d7e72d4cbeedc0b9d3417bb4a2ef42935","other":"e0a0ba7e7e89a7af805e24abde1a5a5b489ba197585051a8755e8c2345c3d57b","up":true},{"one":"8d192b11538072db750f71204e2e6adf9dc0508d9c5cf1eb457e4e996cd985bc","other":"b8e1a8622c256ef29acd52df7b3ace50820fb1a147716165ff862fdc973a48cd","up":true},{"one":"d408bb6f7af1590e1f162ce02cc016b1b86ede29851caa32434212ffa2a377c8","other":"f645aab9cb2bd2709998b38e5789c9c5f68d40765e6cbd93b92e6383eb671dba","up":true},{"one":"93c0e1adf23fdf1623359eb88c517bc521d5a26325554df890cc04c1fa17a5df","other":"ff75b19017c84128f38dec4f63e1f247a5691dc0fae186e667afedb5fe9d2c80","up":true},{"one":"81a5a07f92f813e85b501b0028e1caa6e6a6c7efa5195ecb693cd2d91d5132a0","other":"8862cd85d7039119b984f752a458ac0495ddea98c69fc1d1241db7873a712c11","up":true},{"one":"c74d801e85ac0fd8951480d107b41eddc5c92775614c4886b3f732fa3d1a791d","other":"e2770cef7c1ad312b70d94ca5570e45f324c798a31a93203f505167aeab122b6","up":true},{"one":"aceee75a260d45252060fe971eabd4bde25f912db4a3c6e47f4a09572fe01697","other":"b3f95f225e2b6b76e6c7ef7c86caf83e35213f6a22da41e653ca1c190be23c9c","up":true},{"one":"ef99b6cdc05345a1ee82267890e3ccaeef1f2bd2fe7ae8b02b6b20b9a5ef85bb","other":"fc3911383f74a982f6af8ab95a63426b56117d45f153b3c1441459d9191daaff","up":true},{"one":"e6812448728b4bda5962adceb1707b29f661d3d1a6b2ccd5f8183c9a1f4d01b6","other":"c2d00c7d960174c0934129fdcec63525bfa728f78fb70b7c52036b772d6297ad","up":true},{"one":"e471efbcf1def3915b3dda2dc65a86945c607be54a33e31e9625549becac0e34","other":"f1ed9d45622ff974a1e396cd878b2deb89e31aa5d08da773423f292ae8dbcbb6","up":true},{"one":"5ac0d00b8d647dec62d26e1a689fd05b8b7a1a79ab8c43493bd6d7d209816df1","other":"5d82a418629cfbe7c57105309319ad695a198626fe3571de213a12ddf62f7308","up":true},{"one":"994839e5f3a5b8b23aed84fb029413124af17804b79b0263ec6bfd5aec5dad78","other":"b78fd21c063006e2e033d1d00fc21e1ad7ad7951bb5621cec9b56639745d65f9","up":true},{"one":"c96146ee47ec7cd74551cf74f00213bc337d643c4327393f0e6848ecd4a0f8d3","other":"7c464054ea7b6c9ea0c7d4c209769c92f294a9db2ca159b8ef168e310a1eac3a","up":true},{"one":"6d5ec591af4966ba024c6b2aeb45e0aab8aa1762f9cac30ce3934da529b738e9","other":"402cf9d0bffa017ebea34ede11207f3366b3ea450c0428029129a8e8026abbe7","up":true},{"one":"6c0142984d629ae6995894de9e7e5eb8d3fe45e1641d7ebd63959d2e61548ba3","other":"7e47a2f82984a600c8583605a91d5cb8f2d9a18961845e9c422edd78e20ac3a3","up":true},{"one":"f9ded7b83e473e71be2fc0101d574c44521c96f77f9f84a384785a3af6b1093d","other":"dbd4d90e3342ef837b8ecf5c6e490f7c409f419cf36b77162a87cb2cfb8ae33c","up":true},{"one":"5bd8faf93bcad07006e9426b45f5cc599f1963ab791deac4ff63d6739cd62a17","other":"7660828fb0c8f89201d34e6f4d61cc6ba9a30cead6e4eb8253f6cc92e1845f23","up":true},{"one":"87a337622455ae65daf3ab2555cee8985e9aa14bac245545d985296060e4a8de","other":"9ec831d97418916fd9695465e041caf27824dbb51d6ff74d6b70f3bd561e70e6","up":true},{"one":"b659418885032905ea20ad47d70470e403e7e407e0e9ebf9277f9a2d81ec121c","other":"a7a856a43293aa3004848a86f187e09343bd605e1a93e853a6f6b6b1031bd667","up":true},{"one":"a5053958f0cefcff1826bf02525fda98c4dc954cc38690f3c43ecbf0b2ad57af","other":"97daf2cbe03c80ce6c4dae39cd071dd93cb32ed245aa9aa77285e12296957ca3","up":true},{"one":"837f0993f6374039a5ad4472d6313e647a4c5db4583bd27ccfa98d3448a17731","other":"a4ee49bb2caabb6b9448bcdff1fc3cc673a2db04eab9f5c62d1787f2c25990a0","up":true},{"one":"30feca631f06041cb14cead384dfaa5fffa6dc34b0cee54230efbe15e56a5884","other":"26ab9c813822dbb4f1a230cd8e99e8ab280b242747deb55fdf93d160906ef331","up":true},{"one":"7d162a11662585f8c38d88fb241623e67bacf90703065dae6c092b4b507d6543","other":"6dd3ac0fd9a04a2ce75875c683d135e52eaa1670cb55e78711620712e60fde47","up":true},{"one":"d20931ce3da972fd23ea306e5c604a1fbd9417ba02654c5cdbe278fe259f75d5","other":"e8676d17966625c4fdac6bd9437981a0cf869c8b0010812edf0c79805e0e1ff1","up":true},{"one":"1b1dc3f9312df141855c545dd16aee325f9a609230ec6165bdbbb07d0c0862f6","other":"19ea0a685fc4edd298b736dc7a778c9ec4362de378876911105fa9ba2ce90204","up":true},{"one":"80735a728720bba0ac08daaccd093370d672a8f9a50845ad78ccd6cf8686c39f","other":"5814be13c8550b9a5a83d08e7af6022002a8fdaa38ba6c2c30be58099a9f7744","up":true},{"one":"e0a0ba7e7e89a7af805e24abde1a5a5b489ba197585051a8755e8c2345c3d57b","other":"f1ed9d45622ff974a1e396cd878b2deb89e31aa5d08da773423f292ae8dbcbb6","up":true},{"one":"138dbc1662c4ce9b2b30ef5035914cc70465666fe18f313318e662d13f099621","other":"0e3b7722f3f84d83b3d744bea4e893715a01d4df3cf4a1c6a6823a1f5c9ad6b8","up":true},{"one":"793322608055d4873776a9a0a6c40b04379bfd2f289a8ad49a7dc456bc65f871","other":"6e7f1f3d65364399617a4d95fdd04f2ca9b007b2366943e7ba5acd4616a7a425","up":true},{"one":"a8b58013ff911871d1aa6c2bbea6c2e6ef9b00b87b80a41dc04724ad0488e2ff","other":"a6165a4b02d58be116892982c0ed3d49d86fec0e9f436a516b61868331ed853f","up":true},{"one":"318828fa893a28cc0652d3f81d97c5b8e023e853685f5d3e65fde20689abcc5a","other":"096a8302b6f369c28ed9d47719a507ead8a3cc1ca4fa1e32318b7f97873955fe","up":true},{"one":"8cc3fb39009d0adc26fca1e2ee96822d168d4debc379fd516c15d4b4a1624231","other":"aceee75a260d45252060fe971eabd4bde25f912db4a3c6e47f4a09572fe01697","up":true},{"one":"244c3c954ac612e51d4945ab9b77f0b4a3983285e8add7921777e0c45a1bf338","other":"7895b2cb97b473f8893cc70a4421e0f8be1c033b27cd730fa13438b7a8f3fcb5","up":true},{"one":"0cfc7309afabceeb7d248714e972cf3987205324f5ab8d048d17bea5dc87369d","other":"056152dd9dae85c426378d34acab8d6641da665d2f57359a27a0ff652f3f3d02","up":true},{"one":"b5eab4869b4cb65bdc1e5cab45c03016d202f9f5b668be50066451cfcf9ef299","other":"b6dffac4b4eb2974ed0ed241799f97d2e5d9be671e311266826d0dcfecfcc209","up":true},{"one":"9b8e6bb3a7fe4dc65ac97404e546d8b777d068c94bc2355f4f1a510ad6c11905","other":"994839e5f3a5b8b23aed84fb029413124af17804b79b0263ec6bfd5aec5dad78","up":true},{"one":"9ec831d97418916fd9695465e041caf27824dbb51d6ff74d6b70f3bd561e70e6","other":"ba911175d3aa3fcc266e2a5aa32fb706208b8a9b5021a5f37c0b85f547eb375d","up":true},{"one":"bdc5de01276157a0f3fc43a9cc3b41b2cacc8479118b75aec4ba9b2b7fa86d5e","other":"a9700308516c02cf9aea8809000a4e0596d6b44753e10bd0928df83e2eb9b9e7","up":true},{"one":"435d721a568eb906a03c69dbd71337251a550521a4004ab5d4a7deb6f317061a","other":"447cdbf1ff462aa67d6a46085b1a84fdc495a4142ab174c8e69b271b09732b4d","up":true},{"one":"a5ac04d53b569e418ef5007961431155f2c226ee10157b30af71ea4836b08089","other":"b78fd21c063006e2e033d1d00fc21e1ad7ad7951bb5621cec9b56639745d65f9","up":true},{"one":"7c7ca5a7522a04f62f2bebd6197a03d78f255d0175c3dfceb5d92b684365b2aa","other":"50c1a8023bfecffb09472fdc50898f4d050a31443d40a6c07b629090beb0df3d","up":true},{"one":"8358a74fc8d8e39ccc40b4d3a212b7a69a6a8f6afc25cff2c9c7b44bbaf9ec82","other":"9ec831d97418916fd9695465e041caf27824dbb51d6ff74d6b70f3bd561e70e6","up":true},{"one":"1049d321a450726cf39d1d7cea1c108be3bec137a644b62cdc73a853f5a5a22b","other":"0e2b48558ce2af1fbfee38a557d56072e3091cfcaee8d7847c7c9dcf7bef9bfa","up":true},{"one":"48de553e15afd3e8a46bfc3a5ba8a298158aa3d60f140d2730230af5cce8084d","other":"5ac0d00b8d647dec62d26e1a689fd05b8b7a1a79ab8c43493bd6d7d209816df1","up":true},{"one":"9959385385aade728d3f5763806596222bc1e7b9946c2c92407943d080b32f8d","other":"93ea8ef251fd56b159e080cdf733d33e1fdfb3c7ae5bd9a6a328d0bf5458867b","up":true},{"one":"2ddffddbf452f0c9268058a739f5757fb90281cbfd31bd6f760acc3392fec12a","other":"1049d321a450726cf39d1d7cea1c108be3bec137a644b62cdc73a853f5a5a22b","up":true},{"one":"bcf85ecf421b871fca0247a7081188a8e2c08778b88ffad16db37ef024fec0fc","other":"87a337622455ae65daf3ab2555cee8985e9aa14bac245545d985296060e4a8de","up":true},{"one":"67585dfd87a005bae9bffc2cccb83c69537247c74886b4fa52287f46c796bcb6","other":"a5053958f0cefcff1826bf02525fda98c4dc954cc38690f3c43ecbf0b2ad57af","up":true},{"one":"6d3c6db15900f2596286f81cc0664d2c8291ead5bad2aa35bad515af088a2e48","other":"5ac0d00b8d647dec62d26e1a689fd05b8b7a1a79ab8c43493bd6d7d209816df1","up":true},{"one":"56ca9dd846a58a0ffa7b49a88aad559a338ba535a6f738468b8f146c97890cb2","other":"2c8042517dfeaa01586e91e491dd4154fb24c0d84fedb0404b9d5136f60da1d9","up":true},{"one":"07f5d094a4b22e73cdd6c85452b3d928da9b4b16873824759cb7e8a622417fd5","other":"0cfc7309afabceeb7d248714e972cf3987205324f5ab8d048d17bea5dc87369d","up":true},{"one":"ab719e60a77ba5253f1690c920df9dd9f3a62071e9cce9d62e0001a522b3409e","other":"a3309f8b8bba4d8fbd7c6193d7671cb907b94e71155ef6138e0248682ff00e58","up":true},{"one":"4a95d49f58057b039b55a34f67a348c052f61770065e41243ff055efc570a935","other":"5c373034770e413e700b1cd03b2035f769ecd9ab8eb54d32f7b2645be1991fe5","up":true},{"one":"c190f9d08c78ed6dffadaef36e77fe6aa96099e4453753b0cfc8ec542fa96b9d","other":"b8e1a8622c256ef29acd52df7b3ace50820fb1a147716165ff862fdc973a48cd","up":true},{"one":"95c0a351fb7aa6683280d159a7b808bfa63f63bff91a1c5936e973b2e5d3954f","other":"885427318634c458a3050f2f26eb52454a75cea4a1263b9ed55e6eb899743854","up":true},{"one":"c8ea4177420785926e0929701f5e74c744920386f2a43b89d83c8281106cb95e","other":"d3e913cf4a7dabfb5699131b65e533a40adb46ea37e0ed4ce9433f99015986ef","up":true},{"one":"e8676d17966625c4fdac6bd9437981a0cf869c8b0010812edf0c79805e0e1ff1","other":"da36d1df95a158b0d3f9e7407d663a6b611dde0a77f00a584b97a939ab6a00de","up":true},{"one":"9f0e2bf8a962156c9e0a83c3d42ad3dc5ac5c3e508f24200bfb151aad4e395ff","other":"834f14e9f325482adef62651ddf3685690dd5ebdd18014f2bd266b2143c290ff","up":true},{"one":"094256812084c6052a2604149aa3aba2379c483bf4ec25162f6b43934942775a","other":"70f68562733da4e3b1c3949fb6e11ac0bdd49ea7e732925f937f87df5af698d6","up":true},{"one":"9257dc934dfbf17473b70cb85333c6fab67ee9b6228a646576c4f57253f1004e","other":"a6165a4b02d58be116892982c0ed3d49d86fec0e9f436a516b61868331ed853f","up":true},{"one":"ed424d24d702520bf7cb5f6babbdc43a078435fb4a9884ed82a93d642839e127","other":"e64d90760cd81e4f112bbf1432e76c82fa4173fd474b988f4096ce187363fd81","up":true},{"one":"26acc3c373c29150af30bbc9264d0c44c7c606ff7377399ddf844635e97afcfa","other":"24f80c437be45898e594f821bba0f5c62e0c9a0c720118e362ee6f78410612bd","up":true},{"one":"a8ff8d69dcb36462d1116dafa5e3d0c7237bf65dbece482a316862c8d66e35b6","other":"a5ac04d53b569e418ef5007961431155f2c226ee10157b30af71ea4836b08089","up":true},{"one":"31e670638acba3d58f4c67f3ff2f3f25d769e8a5d7a7838927f4d9d169a84404","other":"031450ec20f353435b429b5fa64f616d07c9d586afabc7a2772e05ad5c88bf50","up":true},{"one":"a32749dc4e134a4fbb038618c58a7c05bbbaa06f1436de3754341af86402581b","other":"c190f9d08c78ed6dffadaef36e77fe6aa96099e4453753b0cfc8ec542fa96b9d","up":true},{"one":"8006b080c78a0ab54fa1be75a939bee2334322fded6c3563de1596b17c36172c","other":"951877b34ee1535b5059c49beb03e8960ff9c12b694ef64708c77c30ff1dc706","up":true},{"one":"4d381014783980b2f77f0d71160ad9e9d84672b576f4435ccdbae12752350c1c","other":"4d9147e3bf98cb59a7648f616c0d7f713a8cf3b7d25e3115233ff5883128beab","up":true},{"one":"ef99b6cdc05345a1ee82267890e3ccaeef1f2bd2fe7ae8b02b6b20b9a5ef85bb","other":"e471efbcf1def3915b3dda2dc65a86945c607be54a33e31e9625549becac0e34","up":true},{"one":"482ec3dc05460579ea9bce87677bd3d9a1930e801fabeba607b8ab6b8729ff15","other":"79e5c6c6d78c88c579003cda044882ecb04520fbad1f5feadbe7b6d23fe183c8","up":true},{"one":"a1c85ee75edb807a01f4ce930086c948918aade324752609b078c28991c04e86","other":"b8e1a8622c256ef29acd52df7b3ace50820fb1a147716165ff862fdc973a48cd","up":true},{"one":"dbd4d90e3342ef837b8ecf5c6e490f7c409f419cf36b77162a87cb2cfb8ae33c","other":"fc514c43c4eb5c62798458da5d622e9248a6e530e4288cd902019aa05c4374d8","up":true},{"one":"398038811c1c7402fe2e6994c9ce2f15c8166b8e99f379feaaed66ac87702062","other":"2c8042517dfeaa01586e91e491dd4154fb24c0d84fedb0404b9d5136f60da1d9","up":true},{"one":"c6a8220726243cceaa6f2cebdac857a05efe721323f0a064c7f85a8340d3da96","other":"aeb45fe10b0dbd0f72ab6a77fbf971a8f46dbcdd96c08f23279d1434b4f38b1d","up":true},{"one":"8f9aa2cd33d18e7cb4494d11a7532c97eb4a1cae172b2165c26ae4ed24887c0d","other":"f645aab9cb2bd2709998b38e5789c9c5f68d40765e6cbd93b92e6383eb671dba","up":true},{"one":"1dec77c2f4caf053c2d0524ae34a2d970bf4743a0d009d8fc543077ddfdfe3d0","other":"0e3b7722f3f84d83b3d744bea4e893715a01d4df3cf4a1c6a6823a1f5c9ad6b8","up":true},{"one":"14849f811af20ce19fb29417d20c15fc16da1e45aebdf795a2c6ccb671e4bdac","other":"035f15499cdb0f079b3e358ad54a6122681442a5293c3ae2fdf6c527004b36d2","up":true},{"one":"84a9db7645c792dc38c1f2113a8f0590d04e1c94d9a8c464ab0ec8219303d966","other":"f8ff7440d6f4abb1c89496336843741ed53a544cedeeed71d8ebe0b08698438d","up":true},{"one":"48b850974575ca57a3cc5f9a4cf5aafd8688cb32b993f69983ece63258ff876e","other":"741a854ae299df49a738725bc58abe614e5e4302ffecd8320bbede8412d160c0","up":true},{"one":"a2e6c900511768c8c9947ab0fa2e73975cf2a4cec7fd15217abdba25c329317e","other":"bbafac5ba5915db3c80e28b249cad260b9b5dad1f728063c48fa8f61d7556e17","up":true},{"one":"5bd8faf93bcad07006e9426b45f5cc599f1963ab791deac4ff63d6739cd62a17","other":"7c7ca5a7522a04f62f2bebd6197a03d78f255d0175c3dfceb5d92b684365b2aa","up":true},{"one":"5c373034770e413e700b1cd03b2035f769ecd9ab8eb54d32f7b2645be1991fe5","other":"4005fd1fa8fbb318b29a62c368ada579e5122ca0578e6a75c509552be4b63b76","up":true},{"one":"86d6f68ec0b8e1b3406943787f918bee74dd1827998bdb13ece8f690da2d296a","other":"9c21cb3e56f8ac66a7917a9ba14e58f77e998ac70c178b88b5053d9ac2777e60","up":true},{"one":"f215bc09268e60ebbec76f743bebd09d7e72d4cbeedc0b9d3417bb4a2ef42935","other":"ba911175d3aa3fcc266e2a5aa32fb706208b8a9b5021a5f37c0b85f547eb375d","up":true},{"one":"87a337622455ae65daf3ab2555cee8985e9aa14bac245545d985296060e4a8de","other":"93c0e1adf23fdf1623359eb88c517bc521d5a26325554df890cc04c1fa17a5df","up":true},{"one":"cdb13873ac058861f295ebca5d958bf2bb793e3f9e274cf5a73a633425a9276f","other":"cf52b3fc82ec24c3e9b40488d7c5f7ac8af731d159a103619bee932ec74d5e92","up":true},{"one":"70f68562733da4e3b1c3949fb6e11ac0bdd49ea7e732925f937f87df5af698d6","other":"046ca54165f0dd4d62fd7d8ee9e97c655db3d35f5452a0ccb0dffc79c047978c","up":true},{"one":"837f0993f6374039a5ad4472d6313e647a4c5db4583bd27ccfa98d3448a17731","other":"a5ac04d53b569e418ef5007961431155f2c226ee10157b30af71ea4836b08089","up":true},{"one":"fa240411bc4f3e44dfca3faedd112c7743a67b522a910bc99696ef0b31732ee2","other":"c9c302de4afe7b4dcbb6f3e366ce747083f9dcd7d5c6a01b939da5cdc6ccc874","up":true},{"one":"a3309f8b8bba4d8fbd7c6193d7671cb907b94e71155ef6138e0248682ff00e58","other":"a0c88ba70599b0e72c18fa6aedd14d607cca3e9a49a5d50165d084e70328c2dd","up":true},{"one":"0e80db9dfa8ce29bedfb2de031622bef8829bee52771322b6a7efb47afe540e7","other":"2c8042517dfeaa01586e91e491dd4154fb24c0d84fedb0404b9d5136f60da1d9","up":true},{"one":"56635699bd3bc78193adbdb8e8b7c2c91dab4140fdaa506fea2300ee86c4ba81","other":"553824ef701d3cd0191ae3a67de564ed0cf553e74bd60ed9de321f9302732ba6","up":true},{"one":"a6165a4b02d58be116892982c0ed3d49d86fec0e9f436a516b61868331ed853f","other":"e6812448728b4bda5962adceb1707b29f661d3d1a6b2ccd5f8183c9a1f4d01b6","up":true},{"one":"7660828fb0c8f89201d34e6f4d61cc6ba9a30cead6e4eb8253f6cc92e1845f23","other":"51440ab47fc5076c00cad16a542b846c26b3281ecea4dbca795ae9b80183ec90","up":true},{"one":"834f14e9f325482adef62651ddf3685690dd5ebdd18014f2bd266b2143c290ff","other":"885427318634c458a3050f2f26eb52454a75cea4a1263b9ed55e6eb899743854","up":true},{"one":"3cabd3a567fc4e6f8da66eb35d938fe1e9a7f2bdd2d36c4dc2d0e0e9149f5e56","other":"298ae5d173c5360bc9ad5b492ed35de3b6e0cae868a34bfe6311a8ba5ea9877e","up":true},{"one":"bfc711793830779f49aa59bc6f7a205ab4e6eae7abfdafbf3bb5a1163a778ab2","other":"ed424d24d702520bf7cb5f6babbdc43a078435fb4a9884ed82a93d642839e127","up":true},{"one":"4cece9bc134bc2b09400c9f7f8a4df9270d2fe3c077c5e441fffc911fcf6f42e","other":"402cf9d0bffa017ebea34ede11207f3366b3ea450c0428029129a8e8026abbe7","up":true},{"one":"951877b34ee1535b5059c49beb03e8960ff9c12b694ef64708c77c30ff1dc706","other":"80d7e892bbb26808abb1d1530077fec6b08768c151a9f220881da3c862bae0af","up":true},{"one":"1070df5e904e3865085b0319a81761e59146494c689e7567efe7465fc819ae8b","other":"2fd2f77d76cca480ac18e9af7a462f297db168c3370b3bc0e2c04aa006c4d037","up":true},{"one":"52a8747e4ea35f6f50c72d7c481616f68a5e4396248332b8ff69d3a772de49ac","other":"4005fd1fa8fbb318b29a62c368ada579e5122ca0578e6a75c509552be4b63b76","up":true},{"one":"1b1dc3f9312df141855c545dd16aee325f9a609230ec6165bdbbb07d0c0862f6","other":"0e80db9dfa8ce29bedfb2de031622bef8829bee52771322b6a7efb47afe540e7","up":true},{"one":"ab3ff955033c0a2615932faf85fd20090b9121c7edcc8e6f7ce4c4fde0a96b8a","other":"a8ff8d69dcb36462d1116dafa5e3d0c7237bf65dbece482a316862c8d66e35b6","up":true},{"one":"d700d96de1193456dc0bcf492c7c11b0951062974af2f7f47b8c901b17c23165","other":"19ea0a685fc4edd298b736dc7a778c9ec4362de378876911105fa9ba2ce90204","up":true},{"one":"9464ad8da1a5effdc0351742dfffae941ffd9fab469637b2491caece53c57dc8","other":"d3e913cf4a7dabfb5699131b65e533a40adb46ea37e0ed4ce9433f99015986ef","up":true},{"one":"012ba278d582691241875c4c14ead91fff3983e190df7d9b43ade384e84c11fb","other":"2c85f5361b2d5abcf799de50fe58b1ed2006ea18f75823748c33eb7e95b1cc39","up":true},{"one":"68cbc4a5313080d5dca8ad34e8bf52a6144e0ff8ef3f795d7ae9d5f644fe2042","other":"7d162a11662585f8c38d88fb241623e67bacf90703065dae6c092b4b507d6543","up":true},{"one":"b5eab4869b4cb65bdc1e5cab45c03016d202f9f5b668be50066451cfcf9ef299","other":"a4ee49bb2caabb6b9448bcdff1fc3cc673a2db04eab9f5c62d1787f2c25990a0","up":true},{"one":"26ab9c813822dbb4f1a230cd8e99e8ab280b242747deb55fdf93d160906ef331","other":"0e3b7722f3f84d83b3d744bea4e893715a01d4df3cf4a1c6a6823a1f5c9ad6b8","up":true},{"one":"eebd48b367cbfe94a37c0deb274a697e628074f9560b909e66229c5c76ce68eb","other":"cd6c8b42a0b092f41e6925577c9de7d1bea17231bcb3d08f3d3cce9c6fdcf22d","up":true},{"one":"b659418885032905ea20ad47d70470e403e7e407e0e9ebf9277f9a2d81ec121c","other":"d700d96de1193456dc0bcf492c7c11b0951062974af2f7f47b8c901b17c23165","up":true},{"one":"bbafac5ba5915db3c80e28b249cad260b9b5dad1f728063c48fa8f61d7556e17","other":"9b8e6bb3a7fe4dc65ac97404e546d8b777d068c94bc2355f4f1a510ad6c11905","up":true},{"one":"d95965e449dd4069876384cf4b34f986731e255a7948f0a862d229b1dddbc502","other":"da36d1df95a158b0d3f9e7407d663a6b611dde0a77f00a584b97a939ab6a00de","up":true},{"one":"025de1d2ec529d3a7da302eef0f8c54996616d40c940c0956d470ffc2a007f33","other":"26ab9c813822dbb4f1a230cd8e99e8ab280b242747deb55fdf93d160906ef331","up":true},{"one":"8d192b11538072db750f71204e2e6adf9dc0508d9c5cf1eb457e4e996cd985bc","other":"bea10868d5da506c1801de845c148c2f09761893113ac913fe66674a8f43c178","up":true},{"one":"b78fd21c063006e2e033d1d00fc21e1ad7ad7951bb5621cec9b56639745d65f9","other":"c9c302de4afe7b4dcbb6f3e366ce747083f9dcd7d5c6a01b939da5cdc6ccc874","up":true},{"one":"aaf051a087a92f874a3f6c7923015e4cffb4bb3ef381c977fd902f21e841d0f4","other":"aceee75a260d45252060fe971eabd4bde25f912db4a3c6e47f4a09572fe01697","up":true},{"one":"a5053958f0cefcff1826bf02525fda98c4dc954cc38690f3c43ecbf0b2ad57af","other":"a2a163ce2cb092b411c994cc5d5ef555d539d2dcf4e7e1aeb528d2216dc481e5","up":true},{"one":"7049e92a396311fbf2f4a55bb5bd2fe3f7bb3c1a63f41bb88eb800edd45ac6e5","other":"7c7ca5a7522a04f62f2bebd6197a03d78f255d0175c3dfceb5d92b684365b2aa","up":true},{"one":"9959385385aade728d3f5763806596222bc1e7b9946c2c92407943d080b32f8d","other":"9f0e2bf8a962156c9e0a83c3d42ad3dc5ac5c3e508f24200bfb151aad4e395ff","up":true},{"one":"e2d36f335d90ad63148db8e353a78a30d8d9c0abe107be2cf8685f6a01ce74b9","other":"e471efbcf1def3915b3dda2dc65a86945c607be54a33e31e9625549becac0e34","up":true},{"one":"b6dffac4b4eb2974ed0ed241799f97d2e5d9be671e311266826d0dcfecfcc209","other":"bbafac5ba5915db3c80e28b249cad260b9b5dad1f728063c48fa8f61d7556e17","up":true},{"one":"3728152c88f1e5e61f6523b09e8f3bb1023b700deccdca5fcc1e6488136b0e57","other":"26ab9c813822dbb4f1a230cd8e99e8ab280b242747deb55fdf93d160906ef331","up":true},{"one":"56ca9dd846a58a0ffa7b49a88aad559a338ba535a6f738468b8f146c97890cb2","other":"60c5647aed152609979366fb33dc8b28fc60736098ff68d232415889b43dfa58","up":true},{"one":"07f5d094a4b22e73cdd6c85452b3d928da9b4b16873824759cb7e8a622417fd5","other":"140dd212f2b193ee6a9d7fc14f7da321c7ef6fd367fb4f194924fd0ad5d135cc","up":true},{"one":"46bfa8bea56b0be1abfa5ad3561bb6bf49ed6695d83ee2b2c192c5a0408347cf","other":"679554b410e415cfcdf1b14ef87759269b2bcaf07f4541122977db3a40091da2","up":true},{"one":"4a95d49f58057b039b55a34f67a348c052f61770065e41243ff055efc570a935","other":"648a96d61898eb2d336ff7d5a229cfeb7b9f587282e40f9fe640e181ae26bdd3","up":true},{"one":"44adaabf9c46608a374ed816d3c40c63b6645f4f6e033a76431bc8f88713eb41","other":"52a8747e4ea35f6f50c72d7c481616f68a5e4396248332b8ff69d3a772de49ac","up":true},{"one":"8ea2c8acc111f38d5b4a5ed60252ee83f312d0f8359265d5b9266d54735052fe","other":"a6165a4b02d58be116892982c0ed3d49d86fec0e9f436a516b61868331ed853f","up":true},{"one":"5ac0d00b8d647dec62d26e1a689fd05b8b7a1a79ab8c43493bd6d7d209816df1","other":"43d43e9ebcbceb4830fc1d2d5024650b90698306bbd2c4d0b4841a1a8fd09c93","up":true},{"one":"67f383e5334e9b6701d1dbb20876d4ba9a7e578af0476caed4a7e1b701f2bedb","other":"4d9147e3bf98cb59a7648f616c0d7f713a8cf3b7d25e3115233ff5883128beab","up":true},{"one":"8e7b96d28edae711e1a4cee0d894e0bd92cdf410ba6f61713f7d9b0bee761d4c","other":"8862cd85d7039119b984f752a458ac0495ddea98c69fc1d1241db7873a712c11","up":true},{"one":"9f0e2bf8a962156c9e0a83c3d42ad3dc5ac5c3e508f24200bfb151aad4e395ff","other":"95c0a351fb7aa6683280d159a7b808bfa63f63bff91a1c5936e973b2e5d3954f","up":true},{"one":"094256812084c6052a2604149aa3aba2379c483bf4ec25162f6b43934942775a","other":"56635699bd3bc78193adbdb8e8b7c2c91dab4140fdaa506fea2300ee86c4ba81","up":true},{"one":"34118166845c185d15c286b7e5433539ee98ed634baabd534d57369fd5f7c681","other":"68cbc4a5313080d5dca8ad34e8bf52a6144e0ff8ef3f795d7ae9d5f644fe2042","up":true},{"one":"9257dc934dfbf17473b70cb85333c6fab67ee9b6228a646576c4f57253f1004e","other":"80d7e892bbb26808abb1d1530077fec6b08768c151a9f220881da3c862bae0af","up":true},{"one":"a606c79a018a6535375d851fcc82c42cc7c952720aa120434cedccf4a4be1f59","other":"c96146ee47ec7cd74551cf74f00213bc337d643c4327393f0e6848ecd4a0f8d3","up":true},{"one":"32ff1969d90aaa5a8ed2260968a8e2bac2d1cae597c906f90495f1dc5de7f8d3","other":"553824ef701d3cd0191ae3a67de564ed0cf553e74bd60ed9de321f9302732ba6","up":true},{"one":"a8ff8d69dcb36462d1116dafa5e3d0c7237bf65dbece482a316862c8d66e35b6","other":"a5053958f0cefcff1826bf02525fda98c4dc954cc38690f3c43ecbf0b2ad57af","up":true},{"one":"48d79ac55f8df512af8e7d868aa40ac9b61493fa4f1b0ce0b76bf6da2eb30e78","other":"30feca631f06041cb14cead384dfaa5fffa6dc34b0cee54230efbe15e56a5884","up":true},{"one":"6d5ec591af4966ba024c6b2aeb45e0aab8aa1762f9cac30ce3934da529b738e9","other":"4d9147e3bf98cb59a7648f616c0d7f713a8cf3b7d25e3115233ff5883128beab","up":true},{"one":"48f1ca6d433019f932fa4ae03e0decbcbea3fe635edff4458a669b83f8162b9a","other":"5c373034770e413e700b1cd03b2035f769ecd9ab8eb54d32f7b2645be1991fe5","up":true},{"one":"096a8302b6f369c28ed9d47719a507ead8a3cc1ca4fa1e32318b7f97873955fe","other":"0cfc7309afabceeb7d248714e972cf3987205324f5ab8d048d17bea5dc87369d","up":true},{"one":"bcf85ecf421b871fca0247a7081188a8e2c08778b88ffad16db37ef024fec0fc","other":"86d6f68ec0b8e1b3406943787f918bee74dd1827998bdb13ece8f690da2d296a","up":true},{"one":"305162c472c71ddef2320b138102b67d1ce2b8bba79e2e587fc80e085c88e547","other":"31e129ab3df7e082cc27c649d9ee29a3ea646d6a97d2417875b80e3ff576c047","up":true},{"one":"ec90a22f41ee659d5759a497946ac2991c916f00fe7caeeeb0908f3af1fe60b6","other":"f2b49a2247c9c5e8f6f755834a37fe5c17f208f994878e14b7001e404f52e125","up":true},{"one":"5a8b84df651871fce72d11cb1c26c87ae4a0cc6b4c274d37e70532c94f27288e","other":"7850f5ee5048959559b3af0f95689669b250fc3aa58bcc9544dca61ca9c9769c","up":true},{"one":"c74d801e85ac0fd8951480d107b41eddc5c92775614c4886b3f732fa3d1a791d","other":"c6a8220726243cceaa6f2cebdac857a05efe721323f0a064c7f85a8340d3da96","up":true},{"one":"f6c028d6a2b6408e90169151f4519b561ed183bd8925ed9a1702806f397666e7","other":"7895b2cb97b473f8893cc70a4421e0f8be1c033b27cd730fa13438b7a8f3fcb5","up":true},{"one":"cc3397e9e11f75273d3f81d91f980f4504755f80b27a183212de56cc5085e58d","other":"e6812448728b4bda5962adceb1707b29f661d3d1a6b2ccd5f8183c9a1f4d01b6","up":true},{"one":"2a507f5cb921137a7225c9c4988a8514af0f7e3c442cb8bf2bb612dc522a7daf","other":"e8676d17966625c4fdac6bd9437981a0cf869c8b0010812edf0c79805e0e1ff1","up":true},{"one":"5814be13c8550b9a5a83d08e7af6022002a8fdaa38ba6c2c30be58099a9f7744","other":"68cbc4a5313080d5dca8ad34e8bf52a6144e0ff8ef3f795d7ae9d5f644fe2042","up":true},{"one":"885427318634c458a3050f2f26eb52454a75cea4a1263b9ed55e6eb899743854","other":"d3022a46956e75bca85ba89d97b694a3a64f03ccc2d881ed0cd687d43d486925","up":true},{"one":"43c9e1571c460cb9f599fa8ed79ddd0f9c3a21fd2fa455e0603109c55012f76b","other":"7895b2cb97b473f8893cc70a4421e0f8be1c033b27cd730fa13438b7a8f3fcb5","up":true},{"one":"4005fd1fa8fbb318b29a62c368ada579e5122ca0578e6a75c509552be4b63b76","other":"5a26ae73eebf27f6dbec2414f1277a249e814a7a06790d7061610e5227b086f6","up":true},{"one":"8e282b0f27d4fa56fe14cfeb69fac5a53e3d882c7778eb190653e2eab7c93fd2","other":"b78fd21c063006e2e033d1d00fc21e1ad7ad7951bb5621cec9b56639745d65f9","up":true},{"one":"81a5a07f92f813e85b501b0028e1caa6e6a6c7efa5195ecb693cd2d91d5132a0","other":"5a26ae73eebf27f6dbec2414f1277a249e814a7a06790d7061610e5227b086f6","up":true},{"one":"482ec3dc05460579ea9bce87677bd3d9a1930e801fabeba607b8ab6b8729ff15","other":"68cbc4a5313080d5dca8ad34e8bf52a6144e0ff8ef3f795d7ae9d5f644fe2042","up":true},{"one":"31e670638acba3d58f4c67f3ff2f3f25d769e8a5d7a7838927f4d9d169a84404","other":"298ae5d173c5360bc9ad5b492ed35de3b6e0cae868a34bfe6311a8ba5ea9877e","up":true},{"one":"c6a8220726243cceaa6f2cebdac857a05efe721323f0a064c7f85a8340d3da96","other":"eebd48b367cbfe94a37c0deb274a697e628074f9560b909e66229c5c76ce68eb","up":true},{"one":"f9ded7b83e473e71be2fc0101d574c44521c96f77f9f84a384785a3af6b1093d","other":"dad08999cd2edc33cfdc59ea34c8adcd6a34eaa15f2e85b0622e9848b215c1d5","up":true},{"one":"3b020c84fb60f59779324d451d9770d683e08133bbaa2d5762f61b8fd4b8d9fd","other":"3728152c88f1e5e61f6523b09e8f3bb1023b700deccdca5fcc1e6488136b0e57","up":true},{"one":"140dd212f2b193ee6a9d7fc14f7da321c7ef6fd367fb4f194924fd0ad5d135cc","other":"447a411c80fbd422bfa0c358d3f2a1fe6256c05e35acc6350958dfbe62cd5b9b","up":true},{"one":"09b3fa30780931e18b92c75d1cdeafa365609c565e4e8c253d393835cb82d98e","other":"0cfc7309afabceeb7d248714e972cf3987205324f5ab8d048d17bea5dc87369d","up":true},{"one":"4d381014783980b2f77f0d71160ad9e9d84672b576f4435ccdbae12752350c1c","other":"5d82a418629cfbe7c57105309319ad695a198626fe3571de213a12ddf62f7308","up":true},{"one":"14849f811af20ce19fb29417d20c15fc16da1e45aebdf795a2c6ccb671e4bdac","other":"2c85f5361b2d5abcf799de50fe58b1ed2006ea18f75823748c33eb7e95b1cc39","up":true},{"one":"d408bb6f7af1590e1f162ce02cc016b1b86ede29851caa32434212ffa2a377c8","other":"f2b49a2247c9c5e8f6f755834a37fe5c17f208f994878e14b7001e404f52e125","up":true},{"one":"b3f95f225e2b6b76e6c7ef7c86caf83e35213f6a22da41e653ca1c190be23c9c","other":"c2d00c7d960174c0934129fdcec63525bfa728f78fb70b7c52036b772d6297ad","up":true},{"one":"24f80c437be45898e594f821bba0f5c62e0c9a0c720118e362ee6f78410612bd","other":"32ff1969d90aaa5a8ed2260968a8e2bac2d1cae597c906f90495f1dc5de7f8d3","up":true},{"one":"59876e7ff9e92243856dad23126e1d38d9a5ddae79772ed1b2bdb91f33a4a4b5","other":"5814be13c8550b9a5a83d08e7af6022002a8fdaa38ba6c2c30be58099a9f7744","up":true},{"one":"056152dd9dae85c426378d34acab8d6641da665d2f57359a27a0ff652f3f3d02","other":"194ea3e14dc5d99f98d15607dc4c405769f5a371acc22d41a62d0537d716be32","up":true},{"one":"741a854ae299df49a738725bc58abe614e5e4302ffecd8320bbede8412d160c0","other":"5a26ae73eebf27f6dbec2414f1277a249e814a7a06790d7061610e5227b086f6","up":true},{"one":"e0a0ba7e7e89a7af805e24abde1a5a5b489ba197585051a8755e8c2345c3d57b","other":"c42e6492879439eeecd9938d17ff283fd8f5f24206906ca512b4daa4803b78b4","up":true},{"one":"08bd1e049859b4a7c8078ca9741fe3daa668b9fe478da06d1a435cd5566b3e11","other":"0e3b7722f3f84d83b3d744bea4e893715a01d4df3cf4a1c6a6823a1f5c9ad6b8","up":true},{"one":"b4a1b687fbdb754fd689e26f0870a7dcab5d76190c06f3ea2ea1e198f8aa5ab2","other":"a32749dc4e134a4fbb038618c58a7c05bbbaa06f1436de3754341af86402581b","up":true},{"one":"c53417f008e4550e1c4cb9a3e2955b3af6403e059b7b4b4c33869d9ed4a580a5","other":"d3e913cf4a7dabfb5699131b65e533a40adb46ea37e0ed4ce9433f99015986ef","up":true},{"one":"d3e913cf4a7dabfb5699131b65e533a40adb46ea37e0ed4ce9433f99015986ef","other":"e6812448728b4bda5962adceb1707b29f661d3d1a6b2ccd5f8183c9a1f4d01b6","up":true},{"one":"0d1c35c6ea485cb33857b790ee262f974cf0d54cf8ce3003f8308ac2e87c2c25","other":"3938e6b2c095084dc9975a3e8649133557495d34ac6df874c6d929266e3ffe6f","up":true},{"one":"8358a74fc8d8e39ccc40b4d3a212b7a69a6a8f6afc25cff2c9c7b44bbaf9ec82","other":"9c21cb3e56f8ac66a7917a9ba14e58f77e998ac70c178b88b5053d9ac2777e60","up":true},{"one":"1fd0192df1fbf33771ca575afbb4e27c6541cce4a3cff2dfc1f2c085e7fab79e","other":"08e5a268f397385c69a7fec855ae4d889cfa98afef5b7c09fc4841e3f8894ad8","up":true},{"one":"9ca1fd5d41975acb905f337997922849b4070360e47849bb4fd8cd1b9ddb4d73","other":"046ca54165f0dd4d62fd7d8ee9e97c655db3d35f5452a0ccb0dffc79c047978c","up":true},{"one":"a3309f8b8bba4d8fbd7c6193d7671cb907b94e71155ef6138e0248682ff00e58","other":"f8ff7440d6f4abb1c89496336843741ed53a544cedeeed71d8ebe0b08698438d","up":true},{"one":"3cabd3a567fc4e6f8da66eb35d938fe1e9a7f2bdd2d36c4dc2d0e0e9149f5e56","other":"3a628ef171c1f26fa0966eb89210be0a14305aae8bfed10f4ed9017698f40f4b","up":true},{"one":"7d162a11662585f8c38d88fb241623e67bacf90703065dae6c092b4b507d6543","other":"1049d321a450726cf39d1d7cea1c108be3bec137a644b62cdc73a853f5a5a22b","up":true},{"one":"3f31ecaffaa6311c82c9a575bbc38d6bcb16630ac87e19d1853a64aa96c9dcde","other":"31e670638acba3d58f4c67f3ff2f3f25d769e8a5d7a7838927f4d9d169a84404","up":true},{"one":"a8b58013ff911871d1aa6c2bbea6c2e6ef9b00b87b80a41dc04724ad0488e2ff","other":"138dbc1662c4ce9b2b30ef5035914cc70465666fe18f313318e662d13f099621","up":true},{"one":"b8e1a8622c256ef29acd52df7b3ace50820fb1a147716165ff862fdc973a48cd","other":"fa240411bc4f3e44dfca3faedd112c7743a67b522a910bc99696ef0b31732ee2","up":true},{"one":"398038811c1c7402fe2e6994c9ce2f15c8166b8e99f379feaaed66ac87702062","other":"26acc3c373c29150af30bbc9264d0c44c7c606ff7377399ddf844635e97afcfa","up":true},{"one":"c8c8a93779ec4d9ac40925e8208478a00ee27fc220ddd73d8774cf6bfa255c46","other":"dad08999cd2edc33cfdc59ea34c8adcd6a34eaa15f2e85b0622e9848b215c1d5","up":true},{"one":"b78fd21c063006e2e033d1d00fc21e1ad7ad7951bb5621cec9b56639745d65f9","other":"cd6c8b42a0b092f41e6925577c9de7d1bea17231bcb3d08f3d3cce9c6fdcf22d","up":true},{"one":"244c3c954ac612e51d4945ab9b77f0b4a3983285e8add7921777e0c45a1bf338","other":"43c9e1571c460cb9f599fa8ed79ddd0f9c3a21fd2fa455e0603109c55012f76b","up":true},{"one":"48de553e15afd3e8a46bfc3a5ba8a298158aa3d60f140d2730230af5cce8084d","other":"56ca9dd846a58a0ffa7b49a88aad559a338ba535a6f738468b8f146c97890cb2","up":true},{"one":"d20931ce3da972fd23ea306e5c604a1fbd9417ba02654c5cdbe278fe259f75d5","other":"c8c8a93779ec4d9ac40925e8208478a00ee27fc220ddd73d8774cf6bfa255c46","up":true},{"one":"1070df5e904e3865085b0319a81761e59146494c689e7567efe7465fc819ae8b","other":"0e80db9dfa8ce29bedfb2de031622bef8829bee52771322b6a7efb47afe540e7","up":true},{"one":"1addd4a9f01486212e13e43a9650b7f793617d1cb59fb8d941270d7ae55f575f","other":"18e00a7e0f826a1aba3f8c0f533ed905f2eee607b697fff056ee7874d374adcd","up":true},{"one":"f215bc09268e60ebbec76f743bebd09d7e72d4cbeedc0b9d3417bb4a2ef42935","other":"f1ed9d45622ff974a1e396cd878b2deb89e31aa5d08da773423f292ae8dbcbb6","up":true},{"one":"67585dfd87a005bae9bffc2cccb83c69537247c74886b4fa52287f46c796bcb6","other":"447a411c80fbd422bfa0c358d3f2a1fe6256c05e35acc6350958dfbe62cd5b9b","up":true},{"one":"eebd48b367cbfe94a37c0deb274a697e628074f9560b909e66229c5c76ce68eb","other":"f8ff7440d6f4abb1c89496336843741ed53a544cedeeed71d8ebe0b08698438d","up":true},{"one":"eff2450bea797ff66d93e7c1c1b0977cddf3abba64bfa51bcc509d728569e2fa","other":"aeb45fe10b0dbd0f72ab6a77fbf971a8f46dbcdd96c08f23279d1434b4f38b1d","up":true},{"one":"aaf051a087a92f874a3f6c7923015e4cffb4bb3ef381c977fd902f21e841d0f4","other":"80d7e892bbb26808abb1d1530077fec6b08768c151a9f220881da3c862bae0af","up":true},{"one":"f2b49a2247c9c5e8f6f755834a37fe5c17f208f994878e14b7001e404f52e125","other":"a742e8502c619703ce87890110f908bde32b59dc61d77a247759e5d0056e0c94","up":true},{"one":"cdb13873ac058861f295ebca5d958bf2bb793e3f9e274cf5a73a633425a9276f","other":"c42e6492879439eeecd9938d17ff283fd8f5f24206906ca512b4daa4803b78b4","up":true},{"one":"1049d321a450726cf39d1d7cea1c108be3bec137a644b62cdc73a853f5a5a22b","other":"0e80db9dfa8ce29bedfb2de031622bef8829bee52771322b6a7efb47afe540e7","up":true},{"one":"c8ea4177420785926e0929701f5e74c744920386f2a43b89d83c8281106cb95e","other":"c2d00c7d960174c0934129fdcec63525bfa728f78fb70b7c52036b772d6297ad","up":true},{"one":"05949ec1a582fa70cab95c59e7c0d315583bf9fc320c60c35268931f21e90853","other":"194ea3e14dc5d99f98d15607dc4c405769f5a371acc22d41a62d0537d716be32","up":true},{"one":"a2e6c900511768c8c9947ab0fa2e73975cf2a4cec7fd15217abdba25c329317e","other":"b8e1a8622c256ef29acd52df7b3ace50820fb1a147716165ff862fdc973a48cd","up":true},{"one":"ef99b6cdc05345a1ee82267890e3ccaeef1f2bd2fe7ae8b02b6b20b9a5ef85bb","other":"e0a0ba7e7e89a7af805e24abde1a5a5b489ba197585051a8755e8c2345c3d57b","up":true},{"one":"16868ec5d8f490ac73ea28b4e8fdda55ac149bb1aafb177545b54b84a5ad5367","other":"1049d321a450726cf39d1d7cea1c108be3bec137a644b62cdc73a853f5a5a22b","up":true},{"one":"e471efbcf1def3915b3dda2dc65a86945c607be54a33e31e9625549becac0e34","other":"ba911175d3aa3fcc266e2a5aa32fb706208b8a9b5021a5f37c0b85f547eb375d","up":true},{"one":"834f14e9f325482adef62651ddf3685690dd5ebdd18014f2bd266b2143c290ff","other":"837f0993f6374039a5ad4472d6313e647a4c5db4583bd27ccfa98d3448a17731","up":true},{"one":"4cece9bc134bc2b09400c9f7f8a4df9270d2fe3c077c5e441fffc911fcf6f42e","other":"7e47a2f82984a600c8583605a91d5cb8f2d9a18961845e9c422edd78e20ac3a3","up":true},{"one":"8cc3fb39009d0adc26fca1e2ee96822d168d4debc379fd516c15d4b4a1624231","other":"8862cd85d7039119b984f752a458ac0495ddea98c69fc1d1241db7873a712c11","up":true},{"one":"553824ef701d3cd0191ae3a67de564ed0cf553e74bd60ed9de321f9302732ba6","other":"7895b2cb97b473f8893cc70a4421e0f8be1c033b27cd730fa13438b7a8f3fcb5","up":true},{"one":"2c85f5361b2d5abcf799de50fe58b1ed2006ea18f75823748c33eb7e95b1cc39","other":"1fd0192df1fbf33771ca575afbb4e27c6541cce4a3cff2dfc1f2c085e7fab79e","up":true},{"one":"c96146ee47ec7cd74551cf74f00213bc337d643c4327393f0e6848ecd4a0f8d3","other":"eebd48b367cbfe94a37c0deb274a697e628074f9560b909e66229c5c76ce68eb","up":true},{"one":"5bd8faf93bcad07006e9426b45f5cc599f1963ab791deac4ff63d6739cd62a17","other":"4a95d49f58057b039b55a34f67a348c052f61770065e41243ff055efc570a935","up":true},{"one":"447a411c80fbd422bfa0c358d3f2a1fe6256c05e35acc6350958dfbe62cd5b9b","other":"648a96d61898eb2d336ff7d5a229cfeb7b9f587282e40f9fe640e181ae26bdd3","up":true},{"one":"c190f9d08c78ed6dffadaef36e77fe6aa96099e4453753b0cfc8ec542fa96b9d","other":"fc3911383f74a982f6af8ab95a63426b56117d45f153b3c1441459d9191daaff","up":true},{"one":"c272b12f4020ae5b20e3d29cd09de03fa0088e3eeb5f07aa7728b29a3e90e687","other":"19ea0a685fc4edd298b736dc7a778c9ec4362de378876911105fa9ba2ce90204","up":true},{"one":"a1c85ee75edb807a01f4ce930086c948918aade324752609b078c28991c04e86","other":"a8f49e87156fda5510897601689ce968d77032134c523634916b96de16366f9e","up":true},{"one":"c2d00c7d960174c0934129fdcec63525bfa728f78fb70b7c52036b772d6297ad","other":"eb686a686fd70e41659cc69ec0db53d1512dfec238918afd0a515d8ce177d4d9","up":true},{"one":"9257dc934dfbf17473b70cb85333c6fab67ee9b6228a646576c4f57253f1004e","other":"8862cd85d7039119b984f752a458ac0495ddea98c69fc1d1241db7873a712c11","up":true},{"one":"e8676d17966625c4fdac6bd9437981a0cf869c8b0010812edf0c79805e0e1ff1","other":"eb686a686fd70e41659cc69ec0db53d1512dfec238918afd0a515d8ce177d4d9","up":true},{"one":"f7561cb6740e17ec7c7d17068251b2c951d954c77804aa5af60464e9c3964e57","other":"a1c85ee75edb807a01f4ce930086c948918aade324752609b078c28991c04e86","up":true},{"one":"8e282b0f27d4fa56fe14cfeb69fac5a53e3d882c7778eb190653e2eab7c93fd2","other":"8f9aa2cd33d18e7cb4494d11a7532c97eb4a1cae172b2165c26ae4ed24887c0d","up":true},{"one":"cc3397e9e11f75273d3f81d91f980f4504755f80b27a183212de56cc5085e58d","other":"ff75b19017c84128f38dec4f63e1f247a5691dc0fae186e667afedb5fe9d2c80","up":true},{"one":"08f84878e44fed2adb4b2685b9f293dc3c73d5f9bc1c474870d943ec2ae73dbe","other":"1fd0192df1fbf33771ca575afbb4e27c6541cce4a3cff2dfc1f2c085e7fab79e","up":true},{"one":"f305273a7d08e72f69b0b153855e822f252cbbf34a18f305134eed9d1eb7b58a","other":"e471efbcf1def3915b3dda2dc65a86945c607be54a33e31e9625549becac0e34","up":true},{"one":"096a8302b6f369c28ed9d47719a507ead8a3cc1ca4fa1e32318b7f97873955fe","other":"31e129ab3df7e082cc27c649d9ee29a3ea646d6a97d2417875b80e3ff576c047","up":true},{"one":"807416cc70f02d481a188027f7932b48e8f7b5e8258f7e9623f3f6e2985d8f6a","other":"8ea2c8acc111f38d5b4a5ed60252ee83f312d0f8359265d5b9266d54735052fe","up":true},{"one":"025de1d2ec529d3a7da302eef0f8c54996616d40c940c0956d470ffc2a007f33","other":"298ae5d173c5360bc9ad5b492ed35de3b6e0cae868a34bfe6311a8ba5ea9877e","up":true},{"one":"1dc0ef1ce68dc681298177bde808af514efa52a5ad38c9cd2bd61968cdf19cfb","other":"0d1c35c6ea485cb33857b790ee262f974cf0d54cf8ce3003f8308ac2e87c2c25","up":true},{"one":"056152dd9dae85c426378d34acab8d6641da665d2f57359a27a0ff652f3f3d02","other":"019109311d4888497aa194cce4a89b5ef243421cf0e7e7bb9115d086e1a1f7d7","up":true},{"one":"fc514c43c4eb5c62798458da5d622e9248a6e530e4288cd902019aa05c4374d8","other":"f2b49a2247c9c5e8f6f755834a37fe5c17f208f994878e14b7001e404f52e125","up":true},{"one":"7ce7fec833a2e8c7720fcc97f820f2ca2aca85388210f887c3efe78b020766e7","other":"553824ef701d3cd0191ae3a67de564ed0cf553e74bd60ed9de321f9302732ba6","up":true},{"one":"48f1ca6d433019f932fa4ae03e0decbcbea3fe635edff4458a669b83f8162b9a","other":"48b850974575ca57a3cc5f9a4cf5aafd8688cb32b993f69983ece63258ff876e","up":true},{"one":"2a507f5cb921137a7225c9c4988a8514af0f7e3c442cb8bf2bb612dc522a7daf","other":"2c85f5361b2d5abcf799de50fe58b1ed2006ea18f75823748c33eb7e95b1cc39","up":true},{"one":"31e670638acba3d58f4c67f3ff2f3f25d769e8a5d7a7838927f4d9d169a84404","other":"3a628ef171c1f26fa0966eb89210be0a14305aae8bfed10f4ed9017698f40f4b","up":true},{"one":"08bd1e049859b4a7c8078ca9741fe3daa668b9fe478da06d1a435cd5566b3e11","other":"3728152c88f1e5e61f6523b09e8f3bb1023b700deccdca5fcc1e6488136b0e57","up":true},{"one":"ec90a22f41ee659d5759a497946ac2991c916f00fe7caeeeb0908f3af1fe60b6","other":"bbafac5ba5915db3c80e28b249cad260b9b5dad1f728063c48fa8f61d7556e17","up":true},{"one":"d408bb6f7af1590e1f162ce02cc016b1b86ede29851caa32434212ffa2a377c8","other":"feb3bc17ee7369a4fa9889d9250fed3c1257c70916871996e6eabd374dd8dc2e","up":true},{"one":"93ea8ef251fd56b159e080cdf733d33e1fdfb3c7ae5bd9a6a328d0bf5458867b","other":"a2a163ce2cb092b411c994cc5d5ef555d539d2dcf4e7e1aeb528d2216dc481e5","up":true},{"one":"9c21cb3e56f8ac66a7917a9ba14e58f77e998ac70c178b88b5053d9ac2777e60","other":"cf52b3fc82ec24c3e9b40488d7c5f7ac8af731d159a103619bee932ec74d5e92","up":true},{"one":"3938e6b2c095084dc9975a3e8649133557495d34ac6df874c6d929266e3ffe6f","other":"244c3c954ac612e51d4945ab9b77f0b4a3983285e8add7921777e0c45a1bf338","up":true},{"one":"b659418885032905ea20ad47d70470e403e7e407e0e9ebf9277f9a2d81ec121c","other":"e09f98114da64e7547b351637190f6621a1f75568cfa9960980fc77618f8855b","up":true},{"one":"9ec831d97418916fd9695465e041caf27824dbb51d6ff74d6b70f3bd561e70e6","other":"a1c85ee75edb807a01f4ce930086c948918aade324752609b078c28991c04e86","up":true},{"one":"48d79ac55f8df512af8e7d868aa40ac9b61493fa4f1b0ce0b76bf6da2eb30e78","other":"44adaabf9c46608a374ed816d3c40c63b6645f4f6e033a76431bc8f88713eb41","up":true},{"one":"397a0a0e9fadcb571acd8981f5bfe8e059e707e0feae8a9c4c6bfe87bd39e66a","other":"298ae5d173c5360bc9ad5b492ed35de3b6e0cae868a34bfe6311a8ba5ea9877e","up":true},{"one":"8e7b96d28edae711e1a4cee0d894e0bd92cdf410ba6f61713f7d9b0bee761d4c","other":"f8ff7440d6f4abb1c89496336843741ed53a544cedeeed71d8ebe0b08698438d","up":true},{"one":"dbd4d90e3342ef837b8ecf5c6e490f7c409f419cf36b77162a87cb2cfb8ae33c","other":"ed424d24d702520bf7cb5f6babbdc43a078435fb4a9884ed82a93d642839e127","up":true},{"one":"398038811c1c7402fe2e6994c9ce2f15c8166b8e99f379feaaed66ac87702062","other":"318828fa893a28cc0652d3f81d97c5b8e023e853685f5d3e65fde20689abcc5a","up":true},{"one":"84a9db7645c792dc38c1f2113a8f0590d04e1c94d9a8c464ab0ec8219303d966","other":"9c8e1f23f260c5a46b0001572675b19e5293ca65e7fdfc131c07612e9c4072fa","up":true},{"one":"34118166845c185d15c286b7e5433539ee98ed634baabd534d57369fd5f7c681","other":"70f68562733da4e3b1c3949fb6e11ac0bdd49ea7e732925f937f87df5af698d6","up":true},{"one":"cf52b3fc82ec24c3e9b40488d7c5f7ac8af731d159a103619bee932ec74d5e92","other":"32ff1969d90aaa5a8ed2260968a8e2bac2d1cae597c906f90495f1dc5de7f8d3","up":true},{"one":"68cbc4a5313080d5dca8ad34e8bf52a6144e0ff8ef3f795d7ae9d5f644fe2042","other":"5ff09c6859736aad7a82a3bfb3f1a1a8b3c0d58f831863540d9c3013dd35745e","up":true},{"one":"482ec3dc05460579ea9bce87677bd3d9a1930e801fabeba607b8ab6b8729ff15","other":"43d43e9ebcbceb4830fc1d2d5024650b90698306bbd2c4d0b4841a1a8fd09c93","up":true},{"one":"5ff09c6859736aad7a82a3bfb3f1a1a8b3c0d58f831863540d9c3013dd35745e","other":"5d82a418629cfbe7c57105309319ad695a198626fe3571de213a12ddf62f7308","up":true},{"one":"c6a8220726243cceaa6f2cebdac857a05efe721323f0a064c7f85a8340d3da96","other":"da36d1df95a158b0d3f9e7407d663a6b611dde0a77f00a584b97a939ab6a00de","up":true},{"one":"1dec77c2f4caf053c2d0524ae34a2d970bf4743a0d009d8fc543077ddfdfe3d0","other":"09b3fa30780931e18b92c75d1cdeafa365609c565e4e8c253d393835cb82d98e","up":true},{"one":"fa240411bc4f3e44dfca3faedd112c7743a67b522a910bc99696ef0b31732ee2","other":"d9cf19895e015cb534d915aed83c0d26bf40a11244027812e17c3bec6e645a8e","up":true},{"one":"67585dfd87a005bae9bffc2cccb83c69537247c74886b4fa52287f46c796bcb6","other":"7e47a2f82984a600c8583605a91d5cb8f2d9a18961845e9c422edd78e20ac3a3","up":true},{"one":"c8c8a93779ec4d9ac40925e8208478a00ee27fc220ddd73d8774cf6bfa255c46","other":"c96146ee47ec7cd74551cf74f00213bc337d643c4327393f0e6848ecd4a0f8d3","up":true},{"one":"07f5d094a4b22e73cdd6c85452b3d928da9b4b16873824759cb7e8a622417fd5","other":"019109311d4888497aa194cce4a89b5ef243421cf0e7e7bb9115d086e1a1f7d7","up":true},{"one":"178401ec8d01a0a4f551d23e880a8e8a4eb87773565363843d51cf52660b1211","other":"08f84878e44fed2adb4b2685b9f293dc3c73d5f9bc1c474870d943ec2ae73dbe","up":true},{"one":"094256812084c6052a2604149aa3aba2379c483bf4ec25162f6b43934942775a","other":"0d1c35c6ea485cb33857b790ee262f974cf0d54cf8ce3003f8308ac2e87c2c25","up":true},{"one":"9959385385aade728d3f5763806596222bc1e7b9946c2c92407943d080b32f8d","other":"af02c2f471e96ab8defbd229215695b95e64f7c78b145b6793a238961f556fbf","up":true},{"one":"140dd212f2b193ee6a9d7fc14f7da321c7ef6fd367fb4f194924fd0ad5d135cc","other":"194ea3e14dc5d99f98d15607dc4c405769f5a371acc22d41a62d0537d716be32","up":true},{"one":"a606c79a018a6535375d851fcc82c42cc7c952720aa120434cedccf4a4be1f59","other":"c9c302de4afe7b4dcbb6f3e366ce747083f9dcd7d5c6a01b939da5cdc6ccc874","up":true},{"one":"81a5a07f92f813e85b501b0028e1caa6e6a6c7efa5195ecb693cd2d91d5132a0","other":"8e7b96d28edae711e1a4cee0d894e0bd92cdf410ba6f61713f7d9b0bee761d4c","up":true},{"one":"9b8e6bb3a7fe4dc65ac97404e546d8b777d068c94bc2355f4f1a510ad6c11905","other":"8f9aa2cd33d18e7cb4494d11a7532c97eb4a1cae172b2165c26ae4ed24887c0d","up":true},{"one":"7850f5ee5048959559b3af0f95689669b250fc3aa58bcc9544dca61ca9c9769c","other":"6e7f1f3d65364399617a4d95fdd04f2ca9b007b2366943e7ba5acd4616a7a425","up":true},{"one":"1070df5e904e3865085b0319a81761e59146494c689e7567efe7465fc819ae8b","other":"a8f49e87156fda5510897601689ce968d77032134c523634916b96de16366f9e","up":true},{"one":"834f14e9f325482adef62651ddf3685690dd5ebdd18014f2bd266b2143c290ff","other":"93ea8ef251fd56b159e080cdf733d33e1fdfb3c7ae5bd9a6a328d0bf5458867b","up":true},{"one":"5bd8faf93bcad07006e9426b45f5cc599f1963ab791deac4ff63d6739cd62a17","other":"4b79e83186f2ab05932eaa99982a2e53373b83780e32d224d15cb2c85462451f","up":true},{"one":"46bfa8bea56b0be1abfa5ad3561bb6bf49ed6695d83ee2b2c192c5a0408347cf","other":"44adaabf9c46608a374ed816d3c40c63b6645f4f6e033a76431bc8f88713eb41","up":true},{"one":"e64d90760cd81e4f112bbf1432e76c82fa4173fd474b988f4096ce187363fd81","other":"aceee75a260d45252060fe971eabd4bde25f912db4a3c6e47f4a09572fe01697","up":true},{"one":"48b850974575ca57a3cc5f9a4cf5aafd8688cb32b993f69983ece63258ff876e","other":"7660828fb0c8f89201d34e6f4d61cc6ba9a30cead6e4eb8253f6cc92e1845f23","up":true},{"one":"08e5a268f397385c69a7fec855ae4d889cfa98afef5b7c09fc4841e3f8894ad8","other":"178401ec8d01a0a4f551d23e880a8e8a4eb87773565363843d51cf52660b1211","up":true},{"one":"9257dc934dfbf17473b70cb85333c6fab67ee9b6228a646576c4f57253f1004e","other":"9c8e1f23f260c5a46b0001572675b19e5293ca65e7fdfc131c07612e9c4072fa","up":true},{"one":"3f31ecaffaa6311c82c9a575bbc38d6bcb16630ac87e19d1853a64aa96c9dcde","other":"298ae5d173c5360bc9ad5b492ed35de3b6e0cae868a34bfe6311a8ba5ea9877e","up":true},{"one":"8cc3fb39009d0adc26fca1e2ee96822d168d4debc379fd516c15d4b4a1624231","other":"b3f95f225e2b6b76e6c7ef7c86caf83e35213f6a22da41e653ca1c190be23c9c","up":true},{"one":"6dd3ac0fd9a04a2ce75875c683d135e52eaa1670cb55e78711620712e60fde47","other":"60c5647aed152609979366fb33dc8b28fc60736098ff68d232415889b43dfa58","up":true},{"one":"8006b080c78a0ab54fa1be75a939bee2334322fded6c3563de1596b17c36172c","other":"80d7e892bbb26808abb1d1530077fec6b08768c151a9f220881da3c862bae0af","up":true},{"one":"298ae5d173c5360bc9ad5b492ed35de3b6e0cae868a34bfe6311a8ba5ea9877e","other":"194ea3e14dc5d99f98d15607dc4c405769f5a371acc22d41a62d0537d716be32","up":true},{"one":"031450ec20f353435b429b5fa64f616d07c9d586afabc7a2772e05ad5c88bf50","other":"08e5a268f397385c69a7fec855ae4d889cfa98afef5b7c09fc4841e3f8894ad8","up":true},{"one":"4b79e83186f2ab05932eaa99982a2e53373b83780e32d224d15cb2c85462451f","other":"5c7c15798e86fe794bb201614d46366ea96dc51091f5b19f149995e0d40df0a6","up":true},{"one":"70f68562733da4e3b1c3949fb6e11ac0bdd49ea7e732925f937f87df5af698d6","other":"67909bdcaef2330ef120e524c76e1e382b474f3332d86f65282028e051f34c75","up":true},{"one":"8402bd62282811ed236b2fa1f0d41ad4bbe54e420ee34adc6164cfd4baf8658d","other":"8862cd85d7039119b984f752a458ac0495ddea98c69fc1d1241db7873a712c11","up":true},{"one":"a32749dc4e134a4fbb038618c58a7c05bbbaa06f1436de3754341af86402581b","other":"d9cf19895e015cb534d915aed83c0d26bf40a11244027812e17c3bec6e645a8e","up":true},{"one":"08f84878e44fed2adb4b2685b9f293dc3c73d5f9bc1c474870d943ec2ae73dbe","other":"3c5b2e125020c80e3674df9cac34de4d8f3a94ee02556fb557921b6d5498b933","up":true},{"one":"6c0142984d629ae6995894de9e7e5eb8d3fe45e1641d7ebd63959d2e61548ba3","other":"4a95d49f58057b039b55a34f67a348c052f61770065e41243ff055efc570a935","up":true},{"one":"807416cc70f02d481a188027f7932b48e8f7b5e8258f7e9623f3f6e2985d8f6a","other":"86d6f68ec0b8e1b3406943787f918bee74dd1827998bdb13ece8f690da2d296a","up":true},{"one":"9f7d72b7d9843872904b841e421985082428fba5010db27dd871ed76630a1e1d","other":"80735a728720bba0ac08daaccd093370d672a8f9a50845ad78ccd6cf8686c39f","up":true},{"one":"025de1d2ec529d3a7da302eef0f8c54996616d40c940c0956d470ffc2a007f33","other":"3728152c88f1e5e61f6523b09e8f3bb1023b700deccdca5fcc1e6488136b0e57","up":true},{"one":"f305273a7d08e72f69b0b153855e822f252cbbf34a18f305134eed9d1eb7b58a","other":"f215bc09268e60ebbec76f743bebd09d7e72d4cbeedc0b9d3417bb4a2ef42935","up":true},{"one":"56ca9dd846a58a0ffa7b49a88aad559a338ba535a6f738468b8f146c97890cb2","other":"43d43e9ebcbceb4830fc1d2d5024650b90698306bbd2c4d0b4841a1a8fd09c93","up":true},{"one":"bdc5de01276157a0f3fc43a9cc3b41b2cacc8479118b75aec4ba9b2b7fa86d5e","other":"a6165a4b02d58be116892982c0ed3d49d86fec0e9f436a516b61868331ed853f","up":true},{"one":"7ce7fec833a2e8c7720fcc97f820f2ca2aca85388210f887c3efe78b020766e7","other":"7c7ca5a7522a04f62f2bebd6197a03d78f255d0175c3dfceb5d92b684365b2aa","up":true},{"one":"48f1ca6d433019f932fa4ae03e0decbcbea3fe635edff4458a669b83f8162b9a","other":"6c0142984d629ae6995894de9e7e5eb8d3fe45e1641d7ebd63959d2e61548ba3","up":true},{"one":"c74d801e85ac0fd8951480d107b41eddc5c92775614c4886b3f732fa3d1a791d","other":"c603138e40fe2f85cc634017956ada6399fca99969e3bf0c1ee8428374e779f1","up":true},{"one":"a9700308516c02cf9aea8809000a4e0596d6b44753e10bd0928df83e2eb9b9e7","other":"aeb45fe10b0dbd0f72ab6a77fbf971a8f46dbcdd96c08f23279d1434b4f38b1d","up":true},{"one":"f9ded7b83e473e71be2fc0101d574c44521c96f77f9f84a384785a3af6b1093d","other":"ddb8be472c3d48dc4d3d112448e6c0c4a826a18af3f3b53fdfef8cd31053c75f","up":true},{"one":"14849f811af20ce19fb29417d20c15fc16da1e45aebdf795a2c6ccb671e4bdac","other":"138dbc1662c4ce9b2b30ef5035914cc70465666fe18f313318e662d13f099621","up":true},{"one":"3cabd3a567fc4e6f8da66eb35d938fe1e9a7f2bdd2d36c4dc2d0e0e9149f5e56","other":"2a507f5cb921137a7225c9c4988a8514af0f7e3c442cb8bf2bb612dc522a7daf","up":true},{"one":"c2d00c7d960174c0934129fdcec63525bfa728f78fb70b7c52036b772d6297ad","other":"ff75b19017c84128f38dec4f63e1f247a5691dc0fae186e667afedb5fe9d2c80","up":true},{"one":"08bd1e049859b4a7c8078ca9741fe3daa668b9fe478da06d1a435cd5566b3e11","other":"138dbc1662c4ce9b2b30ef5035914cc70465666fe18f313318e662d13f099621","up":true},{"one":"4cece9bc134bc2b09400c9f7f8a4df9270d2fe3c077c5e441fffc911fcf6f42e","other":"447a411c80fbd422bfa0c358d3f2a1fe6256c05e35acc6350958dfbe62cd5b9b","up":true},{"one":"93c0e1adf23fdf1623359eb88c517bc521d5a26325554df890cc04c1fa17a5df","other":"951877b34ee1535b5059c49beb03e8960ff9c12b694ef64708c77c30ff1dc706","up":true},{"one":"d408bb6f7af1590e1f162ce02cc016b1b86ede29851caa32434212ffa2a377c8","other":"dad08999cd2edc33cfdc59ea34c8adcd6a34eaa15f2e85b0622e9848b215c1d5","up":true},{"one":"19ea0a685fc4edd298b736dc7a778c9ec4362de378876911105fa9ba2ce90204","other":"6d3c6db15900f2596286f81cc0664d2c8291ead5bad2aa35bad515af088a2e48","up":true},{"one":"48d79ac55f8df512af8e7d868aa40ac9b61493fa4f1b0ce0b76bf6da2eb30e78","other":"4005fd1fa8fbb318b29a62c368ada579e5122ca0578e6a75c509552be4b63b76","up":true},{"one":"244c3c954ac612e51d4945ab9b77f0b4a3983285e8add7921777e0c45a1bf338","other":"0d1c35c6ea485cb33857b790ee262f974cf0d54cf8ce3003f8308ac2e87c2c25","up":true},{"one":"dbd4d90e3342ef837b8ecf5c6e490f7c409f419cf36b77162a87cb2cfb8ae33c","other":"d9cf19895e015cb534d915aed83c0d26bf40a11244027812e17c3bec6e645a8e","up":true},{"one":"ed424d24d702520bf7cb5f6babbdc43a078435fb4a9884ed82a93d642839e127","other":"dad08999cd2edc33cfdc59ea34c8adcd6a34eaa15f2e85b0622e9848b215c1d5","up":true},{"one":"9f0e2bf8a962156c9e0a83c3d42ad3dc5ac5c3e508f24200bfb151aad4e395ff","other":"994839e5f3a5b8b23aed84fb029413124af17804b79b0263ec6bfd5aec5dad78","up":true},{"one":"e0a0ba7e7e89a7af805e24abde1a5a5b489ba197585051a8755e8c2345c3d57b","other":"c190f9d08c78ed6dffadaef36e77fe6aa96099e4453753b0cfc8ec542fa96b9d","up":true},{"one":"d9cf19895e015cb534d915aed83c0d26bf40a11244027812e17c3bec6e645a8e","other":"c9c302de4afe7b4dcbb6f3e366ce747083f9dcd7d5c6a01b939da5cdc6ccc874","up":true},{"one":"f215bc09268e60ebbec76f743bebd09d7e72d4cbeedc0b9d3417bb4a2ef42935","other":"f7561cb6740e17ec7c7d17068251b2c951d954c77804aa5af60464e9c3964e57","up":true},{"one":"019109311d4888497aa194cce4a89b5ef243421cf0e7e7bb9115d086e1a1f7d7","other":"05949ec1a582fa70cab95c59e7c0d315583bf9fc320c60c35268931f21e90853","up":true},{"one":"18e00a7e0f826a1aba3f8c0f533ed905f2eee607b697fff056ee7874d374adcd","other":"019109311d4888497aa194cce4a89b5ef243421cf0e7e7bb9115d086e1a1f7d7","up":true},{"one":"7d162a11662585f8c38d88fb241623e67bacf90703065dae6c092b4b507d6543","other":"43d43e9ebcbceb4830fc1d2d5024650b90698306bbd2c4d0b4841a1a8fd09c93","up":true},{"one":"b659418885032905ea20ad47d70470e403e7e407e0e9ebf9277f9a2d81ec121c","other":"b4a1b687fbdb754fd689e26f0870a7dcab5d76190c06f3ea2ea1e198f8aa5ab2","up":true},{"one":"59876e7ff9e92243856dad23126e1d38d9a5ddae79772ed1b2bdb91f33a4a4b5","other":"5c373034770e413e700b1cd03b2035f769ecd9ab8eb54d32f7b2645be1991fe5","up":true},{"one":"955da15edae50a4c68bc8c579b9799d55f41b7c2a6178f645f79d772e0116662","other":"9f7d72b7d9843872904b841e421985082428fba5010db27dd871ed76630a1e1d","up":true},{"one":"7049e92a396311fbf2f4a55bb5bd2fe3f7bb3c1a63f41bb88eb800edd45ac6e5","other":"7660828fb0c8f89201d34e6f4d61cc6ba9a30cead6e4eb8253f6cc92e1845f23","up":true},{"one":"f1ed9d45622ff974a1e396cd878b2deb89e31aa5d08da773423f292ae8dbcbb6","other":"e09f98114da64e7547b351637190f6621a1f75568cfa9960980fc77618f8855b","up":true},{"one":"c9c302de4afe7b4dcbb6f3e366ce747083f9dcd7d5c6a01b939da5cdc6ccc874","other":"f2b49a2247c9c5e8f6f755834a37fe5c17f208f994878e14b7001e404f52e125","up":true},{"one":"3b020c84fb60f59779324d451d9770d683e08133bbaa2d5762f61b8fd4b8d9fd","other":"31e129ab3df7e082cc27c649d9ee29a3ea646d6a97d2417875b80e3ff576c047","up":true},{"one":"679554b410e415cfcdf1b14ef87759269b2bcaf07f4541122977db3a40091da2","other":"7e47a2f82984a600c8583605a91d5cb8f2d9a18961845e9c422edd78e20ac3a3","up":true},{"one":"9464ad8da1a5effdc0351742dfffae941ffd9fab469637b2491caece53c57dc8","other":"da36d1df95a158b0d3f9e7407d663a6b611dde0a77f00a584b97a939ab6a00de","up":true},{"one":"8358a74fc8d8e39ccc40b4d3a212b7a69a6a8f6afc25cff2c9c7b44bbaf9ec82","other":"807416cc70f02d481a188027f7932b48e8f7b5e8258f7e9623f3f6e2985d8f6a","up":true},{"one":"e6812448728b4bda5962adceb1707b29f661d3d1a6b2ccd5f8183c9a1f4d01b6","other":"da36d1df95a158b0d3f9e7407d663a6b611dde0a77f00a584b97a939ab6a00de","up":true},{"one":"1addd4a9f01486212e13e43a9650b7f793617d1cb59fb8d941270d7ae55f575f","other":"2c85f5361b2d5abcf799de50fe58b1ed2006ea18f75823748c33eb7e95b1cc39","up":true},{"one":"1bd588263274543729d54529ae9e9bf4596db40649a1c2a3f73168d818f34b62","other":"194ea3e14dc5d99f98d15607dc4c405769f5a371acc22d41a62d0537d716be32","up":true},{"one":"05949ec1a582fa70cab95c59e7c0d315583bf9fc320c60c35268931f21e90853","other":"3cabd3a567fc4e6f8da66eb35d938fe1e9a7f2bdd2d36c4dc2d0e0e9149f5e56","up":true},{"one":"c8ea4177420785926e0929701f5e74c744920386f2a43b89d83c8281106cb95e","other":"c272b12f4020ae5b20e3d29cd09de03fa0088e3eeb5f07aa7728b29a3e90e687","up":true},{"one":"bcf85ecf421b871fca0247a7081188a8e2c08778b88ffad16db37ef024fec0fc","other":"8ea2c8acc111f38d5b4a5ed60252ee83f312d0f8359265d5b9266d54735052fe","up":true},{"one":"ddb8be472c3d48dc4d3d112448e6c0c4a826a18af3f3b53fdfef8cd31053c75f","other":"c96146ee47ec7cd74551cf74f00213bc337d643c4327393f0e6848ecd4a0f8d3","up":true},{"one":"ab3ff955033c0a2615932faf85fd20090b9121c7edcc8e6f7ce4c4fde0a96b8a","other":"1bd588263274543729d54529ae9e9bf4596db40649a1c2a3f73168d818f34b62","up":true},{"one":"81a5a07f92f813e85b501b0028e1caa6e6a6c7efa5195ecb693cd2d91d5132a0","other":"8cc3fb39009d0adc26fca1e2ee96822d168d4debc379fd516c15d4b4a1624231","up":true},{"one":"a7a856a43293aa3004848a86f187e09343bd605e1a93e853a6f6b6b1031bd667","other":"a742e8502c619703ce87890110f908bde32b59dc61d77a247759e5d0056e0c94","up":true},{"one":"5bd8faf93bcad07006e9426b45f5cc599f1963ab791deac4ff63d6739cd62a17","other":"44adaabf9c46608a374ed816d3c40c63b6645f4f6e033a76431bc8f88713eb41","up":true},{"one":"2e65d05648b798fafbc9bb582c05e6f8f891131260e8c90ca725ddcbc823f315","other":"16868ec5d8f490ac73ea28b4e8fdda55ac149bb1aafb177545b54b84a5ad5367","up":true},{"one":"5814be13c8550b9a5a83d08e7af6022002a8fdaa38ba6c2c30be58099a9f7744","other":"43d43e9ebcbceb4830fc1d2d5024650b90698306bbd2c4d0b4841a1a8fd09c93","up":true},{"one":"e64d90760cd81e4f112bbf1432e76c82fa4173fd474b988f4096ce187363fd81","other":"be68267d77fb52424227267c665ca1193a010334cac057338aca77b49a4b94da","up":true},{"one":"bfc711793830779f49aa59bc6f7a205ab4e6eae7abfdafbf3bb5a1163a778ab2","other":"a2a163ce2cb092b411c994cc5d5ef555d539d2dcf4e7e1aeb528d2216dc481e5","up":true},{"one":"d20931ce3da972fd23ea306e5c604a1fbd9417ba02654c5cdbe278fe259f75d5","other":"c6a8220726243cceaa6f2cebdac857a05efe721323f0a064c7f85a8340d3da96","up":true},{"one":"012ba278d582691241875c4c14ead91fff3983e190df7d9b43ade384e84c11fb","other":"26ab9c813822dbb4f1a230cd8e99e8ab280b242747deb55fdf93d160906ef331","up":true},{"one":"5c373034770e413e700b1cd03b2035f769ecd9ab8eb54d32f7b2645be1991fe5","other":"51440ab47fc5076c00cad16a542b846c26b3281ecea4dbca795ae9b80183ec90","up":true},{"one":"e09f98114da64e7547b351637190f6621a1f75568cfa9960980fc77618f8855b","other":"f7561cb6740e17ec7c7d17068251b2c951d954c77804aa5af60464e9c3964e57","up":true},{"one":"8ea2c8acc111f38d5b4a5ed60252ee83f312d0f8359265d5b9266d54735052fe","other":"93c0e1adf23fdf1623359eb88c517bc521d5a26325554df890cc04c1fa17a5df","up":true},{"one":"8e282b0f27d4fa56fe14cfeb69fac5a53e3d882c7778eb190653e2eab7c93fd2","other":"bbafac5ba5915db3c80e28b249cad260b9b5dad1f728063c48fa8f61d7556e17","up":true},{"one":"8006b080c78a0ab54fa1be75a939bee2334322fded6c3563de1596b17c36172c","other":"5a26ae73eebf27f6dbec2414f1277a249e814a7a06790d7061610e5227b086f6","up":true},{"one":"32ff1969d90aaa5a8ed2260968a8e2bac2d1cae597c906f90495f1dc5de7f8d3","other":"2fd2f77d76cca480ac18e9af7a462f297db168c3370b3bc0e2c04aa006c4d037","up":true},{"one":"34118166845c185d15c286b7e5433539ee98ed634baabd534d57369fd5f7c681","other":"0d1c35c6ea485cb33857b790ee262f974cf0d54cf8ce3003f8308ac2e87c2c25","up":true},{"one":"8402bd62282811ed236b2fa1f0d41ad4bbe54e420ee34adc6164cfd4baf8658d","other":"807416cc70f02d481a188027f7932b48e8f7b5e8258f7e9623f3f6e2985d8f6a","up":true},{"one":"08f84878e44fed2adb4b2685b9f293dc3c73d5f9bc1c474870d943ec2ae73dbe","other":"08bd1e049859b4a7c8078ca9741fe3daa668b9fe478da06d1a435cd5566b3e11","up":true},{"one":"c8c8a93779ec4d9ac40925e8208478a00ee27fc220ddd73d8774cf6bfa255c46","other":"c74d801e85ac0fd8951480d107b41eddc5c92775614c4886b3f732fa3d1a791d","up":true},{"one":"7e47a2f82984a600c8583605a91d5cb8f2d9a18961845e9c422edd78e20ac3a3","other":"4d9147e3bf98cb59a7648f616c0d7f713a8cf3b7d25e3115233ff5883128beab","up":true},{"one":"7c464054ea7b6c9ea0c7d4c209769c92f294a9db2ca159b8ef168e310a1eac3a","other":"60c5647aed152609979366fb33dc8b28fc60736098ff68d232415889b43dfa58","up":true},{"one":"26acc3c373c29150af30bbc9264d0c44c7c606ff7377399ddf844635e97afcfa","other":"0e80db9dfa8ce29bedfb2de031622bef8829bee52771322b6a7efb47afe540e7","up":true},{"one":"2ddffddbf452f0c9268058a739f5757fb90281cbfd31bd6f760acc3392fec12a","other":"5ff09c6859736aad7a82a3bfb3f1a1a8b3c0d58f831863540d9c3013dd35745e","up":true},{"one":"eff2450bea797ff66d93e7c1c1b0977cddf3abba64bfa51bcc509d728569e2fa","other":"ff75b19017c84128f38dec4f63e1f247a5691dc0fae186e667afedb5fe9d2c80","up":true},{"one":"e8676d17966625c4fdac6bd9437981a0cf869c8b0010812edf0c79805e0e1ff1","other":"f8ff7440d6f4abb1c89496336843741ed53a544cedeeed71d8ebe0b08698438d","up":true},{"one":"a3309f8b8bba4d8fbd7c6193d7671cb907b94e71155ef6138e0248682ff00e58","other":"9c8e1f23f260c5a46b0001572675b19e5293ca65e7fdfc131c07612e9c4072fa","up":true},{"one":"31e670638acba3d58f4c67f3ff2f3f25d769e8a5d7a7838927f4d9d169a84404","other":"305162c472c71ddef2320b138102b67d1ce2b8bba79e2e587fc80e085c88e547","up":true},{"one":"a606c79a018a6535375d851fcc82c42cc7c952720aa120434cedccf4a4be1f59","other":"a5053958f0cefcff1826bf02525fda98c4dc954cc38690f3c43ecbf0b2ad57af","up":true},{"one":"8862cd85d7039119b984f752a458ac0495ddea98c69fc1d1241db7873a712c11","other":"80d7e892bbb26808abb1d1530077fec6b08768c151a9f220881da3c862bae0af","up":true},{"one":"5a8b84df651871fce72d11cb1c26c87ae4a0cc6b4c274d37e70532c94f27288e","other":"4d9147e3bf98cb59a7648f616c0d7f713a8cf3b7d25e3115233ff5883128beab","up":true},{"one":"e471efbcf1def3915b3dda2dc65a86945c607be54a33e31e9625549becac0e34","other":"f7561cb6740e17ec7c7d17068251b2c951d954c77804aa5af60464e9c3964e57","up":true},{"one":"a9700308516c02cf9aea8809000a4e0596d6b44753e10bd0928df83e2eb9b9e7","other":"9c8e1f23f260c5a46b0001572675b19e5293ca65e7fdfc131c07612e9c4072fa","up":true},{"one":"da36d1df95a158b0d3f9e7407d663a6b611dde0a77f00a584b97a939ab6a00de","other":"aceee75a260d45252060fe971eabd4bde25f912db4a3c6e47f4a09572fe01697","up":true},{"one":"aeb45fe10b0dbd0f72ab6a77fbf971a8f46dbcdd96c08f23279d1434b4f38b1d","other":"d3022a46956e75bca85ba89d97b694a3a64f03ccc2d881ed0cd687d43d486925","up":true},{"one":"9257dc934dfbf17473b70cb85333c6fab67ee9b6228a646576c4f57253f1004e","other":"bdc5de01276157a0f3fc43a9cc3b41b2cacc8479118b75aec4ba9b2b7fa86d5e","up":true},{"one":"48de553e15afd3e8a46bfc3a5ba8a298158aa3d60f140d2730230af5cce8084d","other":"5a8b84df651871fce72d11cb1c26c87ae4a0cc6b4c274d37e70532c94f27288e","up":true},{"one":"4cece9bc134bc2b09400c9f7f8a4df9270d2fe3c077c5e441fffc911fcf6f42e","other":"7c464054ea7b6c9ea0c7d4c209769c92f294a9db2ca159b8ef168e310a1eac3a","up":true},{"one":"56635699bd3bc78193adbdb8e8b7c2c91dab4140fdaa506fea2300ee86c4ba81","other":"43d43e9ebcbceb4830fc1d2d5024650b90698306bbd2c4d0b4841a1a8fd09c93","up":true},{"one":"5c7c15798e86fe794bb201614d46366ea96dc51091f5b19f149995e0d40df0a6","other":"553824ef701d3cd0191ae3a67de564ed0cf553e74bd60ed9de321f9302732ba6","up":true},{"one":"994839e5f3a5b8b23aed84fb029413124af17804b79b0263ec6bfd5aec5dad78","other":"97daf2cbe03c80ce6c4dae39cd071dd93cb32ed245aa9aa77285e12296957ca3","up":true},{"one":"48d79ac55f8df512af8e7d868aa40ac9b61493fa4f1b0ce0b76bf6da2eb30e78","other":"48f1ca6d433019f932fa4ae03e0decbcbea3fe635edff4458a669b83f8162b9a","up":true},{"one":"955da15edae50a4c68bc8c579b9799d55f41b7c2a6178f645f79d772e0116662","other":"af02c2f471e96ab8defbd229215695b95e64f7c78b145b6793a238961f556fbf","up":true},{"one":"ab719e60a77ba5253f1690c920df9dd9f3a62071e9cce9d62e0001a522b3409e","other":"a6165a4b02d58be116892982c0ed3d49d86fec0e9f436a516b61868331ed853f","up":true},{"one":"7ce7fec833a2e8c7720fcc97f820f2ca2aca85388210f887c3efe78b020766e7","other":"741a854ae299df49a738725bc58abe614e5e4302ffecd8320bbede8412d160c0","up":true},{"one":"59876e7ff9e92243856dad23126e1d38d9a5ddae79772ed1b2bdb91f33a4a4b5","other":"5c7c15798e86fe794bb201614d46366ea96dc51091f5b19f149995e0d40df0a6","up":true},{"one":"3b020c84fb60f59779324d451d9770d683e08133bbaa2d5762f61b8fd4b8d9fd","other":"305162c472c71ddef2320b138102b67d1ce2b8bba79e2e587fc80e085c88e547","up":true},{"one":"5ff09c6859736aad7a82a3bfb3f1a1a8b3c0d58f831863540d9c3013dd35745e","other":"79e5c6c6d78c88c579003cda044882ecb04520fbad1f5feadbe7b6d23fe183c8","up":true},{"one":"a6165a4b02d58be116892982c0ed3d49d86fec0e9f436a516b61868331ed853f","other":"ba911175d3aa3fcc266e2a5aa32fb706208b8a9b5021a5f37c0b85f547eb375d","up":true},{"one":"c6a8220726243cceaa6f2cebdac857a05efe721323f0a064c7f85a8340d3da96","other":"dbd4d90e3342ef837b8ecf5c6e490f7c409f419cf36b77162a87cb2cfb8ae33c","up":true},{"one":"ef99b6cdc05345a1ee82267890e3ccaeef1f2bd2fe7ae8b02b6b20b9a5ef85bb","other":"8358a74fc8d8e39ccc40b4d3a212b7a69a6a8f6afc25cff2c9c7b44bbaf9ec82","up":true},{"one":"07f5d094a4b22e73cdd6c85452b3d928da9b4b16873824759cb7e8a622417fd5","other":"18e00a7e0f826a1aba3f8c0f533ed905f2eee607b697fff056ee7874d374adcd","up":true},{"one":"c8ea4177420785926e0929701f5e74c744920386f2a43b89d83c8281106cb95e","other":"c42e6492879439eeecd9938d17ff283fd8f5f24206906ca512b4daa4803b78b4","up":true},{"one":"1070df5e904e3865085b0319a81761e59146494c689e7567efe7465fc819ae8b","other":"a7a856a43293aa3004848a86f187e09343bd605e1a93e853a6f6b6b1031bd667","up":true},{"one":"2a507f5cb921137a7225c9c4988a8514af0f7e3c442cb8bf2bb612dc522a7daf","other":"ff75b19017c84128f38dec4f63e1f247a5691dc0fae186e667afedb5fe9d2c80","up":true},{"one":"ddb8be472c3d48dc4d3d112448e6c0c4a826a18af3f3b53fdfef8cd31053c75f","other":"f645aab9cb2bd2709998b38e5789c9c5f68d40765e6cbd93b92e6383eb671dba","up":true},{"one":"056152dd9dae85c426378d34acab8d6641da665d2f57359a27a0ff652f3f3d02","other":"0e2b48558ce2af1fbfee38a557d56072e3091cfcaee8d7847c7c9dcf7bef9bfa","up":true},{"one":"a2e6c900511768c8c9947ab0fa2e73975cf2a4cec7fd15217abdba25c329317e","other":"b78fd21c063006e2e033d1d00fc21e1ad7ad7951bb5621cec9b56639745d65f9","up":true},{"one":"3c5b2e125020c80e3674df9cac34de4d8f3a94ee02556fb557921b6d5498b933","other":"31e129ab3df7e082cc27c649d9ee29a3ea646d6a97d2417875b80e3ff576c047","up":true},{"one":"b659418885032905ea20ad47d70470e403e7e407e0e9ebf9277f9a2d81ec121c","other":"b6dffac4b4eb2974ed0ed241799f97d2e5d9be671e311266826d0dcfecfcc209","up":true},{"one":"5bd8faf93bcad07006e9426b45f5cc599f1963ab791deac4ff63d6739cd62a17","other":"4005fd1fa8fbb318b29a62c368ada579e5122ca0578e6a75c509552be4b63b76","up":true},{"one":"447cdbf1ff462aa67d6a46085b1a84fdc495a4142ab174c8e69b271b09732b4d","other":"7e47a2f82984a600c8583605a91d5cb8f2d9a18961845e9c422edd78e20ac3a3","up":true},{"one":"cc3397e9e11f75273d3f81d91f980f4504755f80b27a183212de56cc5085e58d","other":"e471efbcf1def3915b3dda2dc65a86945c607be54a33e31e9625549becac0e34","up":true},{"one":"b3f95f225e2b6b76e6c7ef7c86caf83e35213f6a22da41e653ca1c190be23c9c","other":"a0c88ba70599b0e72c18fa6aedd14d607cca3e9a49a5d50165d084e70328c2dd","up":true},{"one":"f1ed9d45622ff974a1e396cd878b2deb89e31aa5d08da773423f292ae8dbcbb6","other":"f6c028d6a2b6408e90169151f4519b561ed183bd8925ed9a1702806f397666e7","up":true},{"one":"5ac0d00b8d647dec62d26e1a689fd05b8b7a1a79ab8c43493bd6d7d209816df1","other":"0e80db9dfa8ce29bedfb2de031622bef8829bee52771322b6a7efb47afe540e7","up":true},{"one":"08e5a268f397385c69a7fec855ae4d889cfa98afef5b7c09fc4841e3f8894ad8","other":"0111e720a84b310f863c2530fbe149e6a221acbad01065c5d052d2b3e1716f54","up":true},{"one":"2e65d05648b798fafbc9bb582c05e6f8f891131260e8c90ca725ddcbc823f315","other":"1049d321a450726cf39d1d7cea1c108be3bec137a644b62cdc73a853f5a5a22b","up":true},{"one":"4b79e83186f2ab05932eaa99982a2e53373b83780e32d224d15cb2c85462451f","other":"648a96d61898eb2d336ff7d5a229cfeb7b9f587282e40f9fe640e181ae26bdd3","up":true},{"one":"5c373034770e413e700b1cd03b2035f769ecd9ab8eb54d32f7b2645be1991fe5","other":"44adaabf9c46608a374ed816d3c40c63b6645f4f6e033a76431bc8f88713eb41","up":true},{"one":"0e3b7722f3f84d83b3d744bea4e893715a01d4df3cf4a1c6a6823a1f5c9ad6b8","other":"18e00a7e0f826a1aba3f8c0f533ed905f2eee607b697fff056ee7874d374adcd","up":true},{"one":"14849f811af20ce19fb29417d20c15fc16da1e45aebdf795a2c6ccb671e4bdac","other":"1addd4a9f01486212e13e43a9650b7f793617d1cb59fb8d941270d7ae55f575f","up":true},{"one":"f9ded7b83e473e71be2fc0101d574c44521c96f77f9f84a384785a3af6b1093d","other":"2a507f5cb921137a7225c9c4988a8514af0f7e3c442cb8bf2bb612dc522a7daf","up":true},{"one":"bcf85ecf421b871fca0247a7081188a8e2c08778b88ffad16db37ef024fec0fc","other":"a1c85ee75edb807a01f4ce930086c948918aade324752609b078c28991c04e86","up":true},{"one":"d3e913cf4a7dabfb5699131b65e533a40adb46ea37e0ed4ce9433f99015986ef","other":"e471efbcf1def3915b3dda2dc65a86945c607be54a33e31e9625549becac0e34","up":true},{"one":"096a8302b6f369c28ed9d47719a507ead8a3cc1ca4fa1e32318b7f97873955fe","other":"140dd212f2b193ee6a9d7fc14f7da321c7ef6fd367fb4f194924fd0ad5d135cc","up":true},{"one":"a8f49e87156fda5510897601689ce968d77032134c523634916b96de16366f9e","other":"feb3bc17ee7369a4fa9889d9250fed3c1257c70916871996e6eabd374dd8dc2e","up":true},{"one":"7c464054ea7b6c9ea0c7d4c209769c92f294a9db2ca159b8ef168e310a1eac3a","other":"6e7f1f3d65364399617a4d95fdd04f2ca9b007b2366943e7ba5acd4616a7a425","up":true},{"one":"9464ad8da1a5effdc0351742dfffae941ffd9fab469637b2491caece53c57dc8","other":"8b4318f86ad47976321af97bfbf95cd0a3b0aa22447aeb0611ed1a9bf1e6a4bf","up":true},{"one":"84a9db7645c792dc38c1f2113a8f0590d04e1c94d9a8c464ab0ec8219303d966","other":"e64d90760cd81e4f112bbf1432e76c82fa4173fd474b988f4096ce187363fd81","up":true},{"one":"834f14e9f325482adef62651ddf3685690dd5ebdd18014f2bd266b2143c290ff","other":"b78fd21c063006e2e033d1d00fc21e1ad7ad7951bb5621cec9b56639745d65f9","up":true},{"one":"094256812084c6052a2604149aa3aba2379c483bf4ec25162f6b43934942775a","other":"2fd2f77d76cca480ac18e9af7a462f297db168c3370b3bc0e2c04aa006c4d037","up":true},{"one":"2ddffddbf452f0c9268058a739f5757fb90281cbfd31bd6f760acc3392fec12a","other":"16868ec5d8f490ac73ea28b4e8fdda55ac149bb1aafb177545b54b84a5ad5367","up":true},{"one":"eff2450bea797ff66d93e7c1c1b0977cddf3abba64bfa51bcc509d728569e2fa","other":"f8ff7440d6f4abb1c89496336843741ed53a544cedeeed71d8ebe0b08698438d","up":true},{"one":"a32749dc4e134a4fbb038618c58a7c05bbbaa06f1436de3754341af86402581b","other":"a1c85ee75edb807a01f4ce930086c948918aade324752609b078c28991c04e86","up":true},{"one":"31e129ab3df7e082cc27c649d9ee29a3ea646d6a97d2417875b80e3ff576c047","other":"031450ec20f353435b429b5fa64f616d07c9d586afabc7a2772e05ad5c88bf50","up":true},{"one":"87a337622455ae65daf3ab2555cee8985e9aa14bac245545d985296060e4a8de","other":"9c21cb3e56f8ac66a7917a9ba14e58f77e998ac70c178b88b5053d9ac2777e60","up":true},{"one":"cd6c8b42a0b092f41e6925577c9de7d1bea17231bcb3d08f3d3cce9c6fdcf22d","other":"95c0a351fb7aa6683280d159a7b808bfa63f63bff91a1c5936e973b2e5d3954f","up":true},{"one":"3f31ecaffaa6311c82c9a575bbc38d6bcb16630ac87e19d1853a64aa96c9dcde","other":"3a628ef171c1f26fa0966eb89210be0a14305aae8bfed10f4ed9017698f40f4b","up":true},{"one":"f305273a7d08e72f69b0b153855e822f252cbbf34a18f305134eed9d1eb7b58a","other":"fc3911383f74a982f6af8ab95a63426b56117d45f153b3c1441459d9191daaff","up":true},{"one":"81a5a07f92f813e85b501b0028e1caa6e6a6c7efa5195ecb693cd2d91d5132a0","other":"84a9db7645c792dc38c1f2113a8f0590d04e1c94d9a8c464ab0ec8219303d966","up":true},{"one":"7d162a11662585f8c38d88fb241623e67bacf90703065dae6c092b4b507d6543","other":"6d3c6db15900f2596286f81cc0664d2c8291ead5bad2aa35bad515af088a2e48","up":true},{"one":"8358a74fc8d8e39ccc40b4d3a212b7a69a6a8f6afc25cff2c9c7b44bbaf9ec82","other":"9464ad8da1a5effdc0351742dfffae941ffd9fab469637b2491caece53c57dc8","up":true},{"one":"8e282b0f27d4fa56fe14cfeb69fac5a53e3d882c7778eb190653e2eab7c93fd2","other":"955da15edae50a4c68bc8c579b9799d55f41b7c2a6178f645f79d772e0116662","up":true},{"one":"e2770cef7c1ad312b70d94ca5570e45f324c798a31a93203f505167aeab122b6","other":"f8ff7440d6f4abb1c89496336843741ed53a544cedeeed71d8ebe0b08698438d","up":true},{"one":"435d721a568eb906a03c69dbd71337251a550521a4004ab5d4a7deb6f317061a","other":"447a411c80fbd422bfa0c358d3f2a1fe6256c05e35acc6350958dfbe62cd5b9b","up":true},{"one":"d9cf19895e015cb534d915aed83c0d26bf40a11244027812e17c3bec6e645a8e","other":"f645aab9cb2bd2709998b38e5789c9c5f68d40765e6cbd93b92e6383eb671dba","up":true},{"one":"9257dc934dfbf17473b70cb85333c6fab67ee9b6228a646576c4f57253f1004e","other":"951877b34ee1535b5059c49beb03e8960ff9c12b694ef64708c77c30ff1dc706","up":true},{"one":"8006b080c78a0ab54fa1be75a939bee2334322fded6c3563de1596b17c36172c","other":"d3022a46956e75bca85ba89d97b694a3a64f03ccc2d881ed0cd687d43d486925","up":true},{"one":"b6dffac4b4eb2974ed0ed241799f97d2e5d9be671e311266826d0dcfecfcc209","other":"bea10868d5da506c1801de845c148c2f09761893113ac913fe66674a8f43c178","up":true},{"one":"48b850974575ca57a3cc5f9a4cf5aafd8688cb32b993f69983ece63258ff876e","other":"4005fd1fa8fbb318b29a62c368ada579e5122ca0578e6a75c509552be4b63b76","up":true},{"one":"d700d96de1193456dc0bcf492c7c11b0951062974af2f7f47b8c901b17c23165","other":"c272b12f4020ae5b20e3d29cd09de03fa0088e3eeb5f07aa7728b29a3e90e687","up":true},{"one":"837f0993f6374039a5ad4472d6313e647a4c5db4583bd27ccfa98d3448a17731","other":"8f9aa2cd33d18e7cb4494d11a7532c97eb4a1cae172b2165c26ae4ed24887c0d","up":true},{"one":"f7561cb6740e17ec7c7d17068251b2c951d954c77804aa5af60464e9c3964e57","other":"fc3911383f74a982f6af8ab95a63426b56117d45f153b3c1441459d9191daaff","up":true},{"one":"26acc3c373c29150af30bbc9264d0c44c7c606ff7377399ddf844635e97afcfa","other":"2e65d05648b798fafbc9bb582c05e6f8f891131260e8c90ca725ddcbc823f315","up":true},{"one":"a5ac04d53b569e418ef5007961431155f2c226ee10157b30af71ea4836b08089","other":"be68267d77fb52424227267c665ca1193a010334cac057338aca77b49a4b94da","up":true},{"one":"c53417f008e4550e1c4cb9a3e2955b3af6403e059b7b4b4c33869d9ed4a580a5","other":"c272b12f4020ae5b20e3d29cd09de03fa0088e3eeb5f07aa7728b29a3e90e687","up":true},{"one":"d20931ce3da972fd23ea306e5c604a1fbd9417ba02654c5cdbe278fe259f75d5","other":"da36d1df95a158b0d3f9e7407d663a6b611dde0a77f00a584b97a939ab6a00de","up":true},{"one":"d408bb6f7af1590e1f162ce02cc016b1b86ede29851caa32434212ffa2a377c8","other":"fa240411bc4f3e44dfca3faedd112c7743a67b522a910bc99696ef0b31732ee2","up":true},{"one":"24f80c437be45898e594f821bba0f5c62e0c9a0c720118e362ee6f78410612bd","other":"244c3c954ac612e51d4945ab9b77f0b4a3983285e8add7921777e0c45a1bf338","up":true},{"one":"34118166845c185d15c286b7e5433539ee98ed634baabd534d57369fd5f7c681","other":"30feca631f06041cb14cead384dfaa5fffa6dc34b0cee54230efbe15e56a5884","up":true},{"one":"397a0a0e9fadcb571acd8981f5bfe8e059e707e0feae8a9c4c6bfe87bd39e66a","other":"3a628ef171c1f26fa0966eb89210be0a14305aae8bfed10f4ed9017698f40f4b","up":true},{"one":"793322608055d4873776a9a0a6c40b04379bfd2f289a8ad49a7dc456bc65f871","other":"60c5647aed152609979366fb33dc8b28fc60736098ff68d232415889b43dfa58","up":true},{"one":"cdb13873ac058861f295ebca5d958bf2bb793e3f9e274cf5a73a633425a9276f","other":"d3e913cf4a7dabfb5699131b65e533a40adb46ea37e0ed4ce9433f99015986ef","up":true},{"one":"70f68562733da4e3b1c3949fb6e11ac0bdd49ea7e732925f937f87df5af698d6","other":"7895b2cb97b473f8893cc70a4421e0f8be1c033b27cd730fa13438b7a8f3fcb5","up":true},{"one":"398038811c1c7402fe2e6994c9ce2f15c8166b8e99f379feaaed66ac87702062","other":"1049d321a450726cf39d1d7cea1c108be3bec137a644b62cdc73a853f5a5a22b","up":true},{"one":"741a854ae299df49a738725bc58abe614e5e4302ffecd8320bbede8412d160c0","other":"6c0142984d629ae6995894de9e7e5eb8d3fe45e1641d7ebd63959d2e61548ba3","up":true},{"one":"140dd212f2b193ee6a9d7fc14f7da321c7ef6fd367fb4f194924fd0ad5d135cc","other":"31e670638acba3d58f4c67f3ff2f3f25d769e8a5d7a7838927f4d9d169a84404","up":true},{"one":"994839e5f3a5b8b23aed84fb029413124af17804b79b0263ec6bfd5aec5dad78","other":"b8e1a8622c256ef29acd52df7b3ace50820fb1a147716165ff862fdc973a48cd","up":true},{"one":"3b020c84fb60f59779324d451d9770d683e08133bbaa2d5762f61b8fd4b8d9fd","other":"31e670638acba3d58f4c67f3ff2f3f25d769e8a5d7a7838927f4d9d169a84404","up":true},{"one":"c190f9d08c78ed6dffadaef36e77fe6aa96099e4453753b0cfc8ec542fa96b9d","other":"fa240411bc4f3e44dfca3faedd112c7743a67b522a910bc99696ef0b31732ee2","up":true},{"one":"07f5d094a4b22e73cdd6c85452b3d928da9b4b16873824759cb7e8a622417fd5","other":"0e2b48558ce2af1fbfee38a557d56072e3091cfcaee8d7847c7c9dcf7bef9bfa","up":true},{"one":"6d3c6db15900f2596286f81cc0664d2c8291ead5bad2aa35bad515af088a2e48","other":"5ff09c6859736aad7a82a3bfb3f1a1a8b3c0d58f831863540d9c3013dd35745e","up":true},{"one":"046ca54165f0dd4d62fd7d8ee9e97c655db3d35f5452a0ccb0dffc79c047978c","other":"244c3c954ac612e51d4945ab9b77f0b4a3983285e8add7921777e0c45a1bf338","up":true},{"one":"4b79e83186f2ab05932eaa99982a2e53373b83780e32d224d15cb2c85462451f","other":"5c373034770e413e700b1cd03b2035f769ecd9ab8eb54d32f7b2645be1991fe5","up":true},{"one":"05949ec1a582fa70cab95c59e7c0d315583bf9fc320c60c35268931f21e90853","other":"18e00a7e0f826a1aba3f8c0f533ed905f2eee607b697fff056ee7874d374adcd","up":true},{"one":"7049e92a396311fbf2f4a55bb5bd2fe3f7bb3c1a63f41bb88eb800edd45ac6e5","other":"648a96d61898eb2d336ff7d5a229cfeb7b9f587282e40f9fe640e181ae26bdd3","up":true},{"one":"48d79ac55f8df512af8e7d868aa40ac9b61493fa4f1b0ce0b76bf6da2eb30e78","other":"67909bdcaef2330ef120e524c76e1e382b474f3332d86f65282028e051f34c75","up":true},{"one":"cc3397e9e11f75273d3f81d91f980f4504755f80b27a183212de56cc5085e58d","other":"f215bc09268e60ebbec76f743bebd09d7e72d4cbeedc0b9d3417bb4a2ef42935","up":true},{"one":"93c0e1adf23fdf1623359eb88c517bc521d5a26325554df890cc04c1fa17a5df","other":"8b4318f86ad47976321af97bfbf95cd0a3b0aa22447aeb0611ed1a9bf1e6a4bf","up":true},{"one":"0cfc7309afabceeb7d248714e972cf3987205324f5ab8d048d17bea5dc87369d","other":"031450ec20f353435b429b5fa64f616d07c9d586afabc7a2772e05ad5c88bf50","up":true},{"one":"3cabd3a567fc4e6f8da66eb35d938fe1e9a7f2bdd2d36c4dc2d0e0e9149f5e56","other":"3f31ecaffaa6311c82c9a575bbc38d6bcb16630ac87e19d1853a64aa96c9dcde","up":true},{"one":"67909bdcaef2330ef120e524c76e1e382b474f3332d86f65282028e051f34c75","other":"48b850974575ca57a3cc5f9a4cf5aafd8688cb32b993f69983ece63258ff876e","up":true},{"one":"1070df5e904e3865085b0319a81761e59146494c689e7567efe7465fc819ae8b","other":"c272b12f4020ae5b20e3d29cd09de03fa0088e3eeb5f07aa7728b29a3e90e687","up":true},{"one":"ef99b6cdc05345a1ee82267890e3ccaeef1f2bd2fe7ae8b02b6b20b9a5ef85bb","other":"e09f98114da64e7547b351637190f6621a1f75568cfa9960980fc77618f8855b","up":true},{"one":"19ea0a685fc4edd298b736dc7a778c9ec4362de378876911105fa9ba2ce90204","other":"70f68562733da4e3b1c3949fb6e11ac0bdd49ea7e732925f937f87df5af698d6","up":true},{"one":"52a8747e4ea35f6f50c72d7c481616f68a5e4396248332b8ff69d3a772de49ac","other":"48f1ca6d433019f932fa4ae03e0decbcbea3fe635edff4458a669b83f8162b9a","up":true},{"one":"012ba278d582691241875c4c14ead91fff3983e190df7d9b43ade384e84c11fb","other":"3728152c88f1e5e61f6523b09e8f3bb1023b700deccdca5fcc1e6488136b0e57","up":true},{"one":"3a628ef171c1f26fa0966eb89210be0a14305aae8bfed10f4ed9017698f40f4b","other":"36b93656cab02213fa76124af6251109356abc5e0ae5dd1e203c6a013e014548","up":true},{"one":"dbd4d90e3342ef837b8ecf5c6e490f7c409f419cf36b77162a87cb2cfb8ae33c","other":"d3022a46956e75bca85ba89d97b694a3a64f03ccc2d881ed0cd687d43d486925","up":true},{"one":"eff2450bea797ff66d93e7c1c1b0977cddf3abba64bfa51bcc509d728569e2fa","other":"c603138e40fe2f85cc634017956ada6399fca99969e3bf0c1ee8428374e779f1","up":true},{"one":"648a96d61898eb2d336ff7d5a229cfeb7b9f587282e40f9fe640e181ae26bdd3","other":"7e47a2f82984a600c8583605a91d5cb8f2d9a18961845e9c422edd78e20ac3a3","up":true},{"one":"a606c79a018a6535375d851fcc82c42cc7c952720aa120434cedccf4a4be1f59","other":"be68267d77fb52424227267c665ca1193a010334cac057338aca77b49a4b94da","up":true},{"one":"2e65d05648b798fafbc9bb582c05e6f8f891131260e8c90ca725ddcbc823f315","other":"32ff1969d90aaa5a8ed2260968a8e2bac2d1cae597c906f90495f1dc5de7f8d3","up":true},{"one":"bfc711793830779f49aa59bc6f7a205ab4e6eae7abfdafbf3bb5a1163a778ab2","other":"b78fd21c063006e2e033d1d00fc21e1ad7ad7951bb5621cec9b56639745d65f9","up":true},{"one":"bbafac5ba5915db3c80e28b249cad260b9b5dad1f728063c48fa8f61d7556e17","other":"b4a1b687fbdb754fd689e26f0870a7dcab5d76190c06f3ea2ea1e198f8aa5ab2","up":true},{"one":"5814be13c8550b9a5a83d08e7af6022002a8fdaa38ba6c2c30be58099a9f7744","other":"43c9e1571c460cb9f599fa8ed79ddd0f9c3a21fd2fa455e0603109c55012f76b","up":true},{"one":"9959385385aade728d3f5763806596222bc1e7b9946c2c92407943d080b32f8d","other":"97daf2cbe03c80ce6c4dae39cd071dd93cb32ed245aa9aa77285e12296957ca3","up":true},{"one":"6d5ec591af4966ba024c6b2aeb45e0aab8aa1762f9cac30ce3934da529b738e9","other":"6c0142984d629ae6995894de9e7e5eb8d3fe45e1641d7ebd63959d2e61548ba3","up":true},{"one":"46bfa8bea56b0be1abfa5ad3561bb6bf49ed6695d83ee2b2c192c5a0408347cf","other":"402cf9d0bffa017ebea34ede11207f3366b3ea450c0428029129a8e8026abbe7","up":true},{"one":"1dec77c2f4caf053c2d0524ae34a2d970bf4743a0d009d8fc543077ddfdfe3d0","other":"1fd0192df1fbf33771ca575afbb4e27c6541cce4a3cff2dfc1f2c085e7fab79e","up":true},{"one":"ab719e60a77ba5253f1690c920df9dd9f3a62071e9cce9d62e0001a522b3409e","other":"aeb45fe10b0dbd0f72ab6a77fbf971a8f46dbcdd96c08f23279d1434b4f38b1d","up":true},{"one":"5a8b84df651871fce72d11cb1c26c87ae4a0cc6b4c274d37e70532c94f27288e","other":"447cdbf1ff462aa67d6a46085b1a84fdc495a4142ab174c8e69b271b09732b4d","up":true},{"one":"48de553e15afd3e8a46bfc3a5ba8a298158aa3d60f140d2730230af5cce8084d","other":"7c464054ea7b6c9ea0c7d4c209769c92f294a9db2ca159b8ef168e310a1eac3a","up":true},{"one":"a2e6c900511768c8c9947ab0fa2e73975cf2a4cec7fd15217abdba25c329317e","other":"a2a163ce2cb092b411c994cc5d5ef555d539d2dcf4e7e1aeb528d2216dc481e5","up":true},{"one":"8402bd62282811ed236b2fa1f0d41ad4bbe54e420ee34adc6164cfd4baf8658d","other":"8e7b96d28edae711e1a4cee0d894e0bd92cdf410ba6f61713f7d9b0bee761d4c","up":true},{"one":"a32749dc4e134a4fbb038618c58a7c05bbbaa06f1436de3754341af86402581b","other":"9ca1fd5d41975acb905f337997922849b4070360e47849bb4fd8cd1b9ddb4d73","up":true},{"one":"f9ded7b83e473e71be2fc0101d574c44521c96f77f9f84a384785a3af6b1093d","other":"d9cf19895e015cb534d915aed83c0d26bf40a11244027812e17c3bec6e645a8e","up":true},{"one":"9257dc934dfbf17473b70cb85333c6fab67ee9b6228a646576c4f57253f1004e","other":"b3f95f225e2b6b76e6c7ef7c86caf83e35213f6a22da41e653ca1c190be23c9c","up":true},{"one":"8358a74fc8d8e39ccc40b4d3a212b7a69a6a8f6afc25cff2c9c7b44bbaf9ec82","other":"9257dc934dfbf17473b70cb85333c6fab67ee9b6228a646576c4f57253f1004e","up":true},{"one":"67f383e5334e9b6701d1dbb20876d4ba9a7e578af0476caed4a7e1b701f2bedb","other":"6c0142984d629ae6995894de9e7e5eb8d3fe45e1641d7ebd63959d2e61548ba3","up":true},{"one":"f7561cb6740e17ec7c7d17068251b2c951d954c77804aa5af60464e9c3964e57","other":"d700d96de1193456dc0bcf492c7c11b0951062974af2f7f47b8c901b17c23165","up":true},{"one":"9f0e2bf8a962156c9e0a83c3d42ad3dc5ac5c3e508f24200bfb151aad4e395ff","other":"885427318634c458a3050f2f26eb52454a75cea4a1263b9ed55e6eb899743854","up":true},{"one":"f305273a7d08e72f69b0b153855e822f252cbbf34a18f305134eed9d1eb7b58a","other":"d700d96de1193456dc0bcf492c7c11b0951062974af2f7f47b8c901b17c23165","up":true},{"one":"c53417f008e4550e1c4cb9a3e2955b3af6403e059b7b4b4c33869d9ed4a580a5","other":"c42e6492879439eeecd9938d17ff283fd8f5f24206906ca512b4daa4803b78b4","up":true},{"one":"67585dfd87a005bae9bffc2cccb83c69537247c74886b4fa52287f46c796bcb6","other":"793322608055d4873776a9a0a6c40b04379bfd2f289a8ad49a7dc456bc65f871","up":true},{"one":"178401ec8d01a0a4f551d23e880a8e8a4eb87773565363843d51cf52660b1211","other":"36b93656cab02213fa76124af6251109356abc5e0ae5dd1e203c6a013e014548","up":true},{"one":"a2a163ce2cb092b411c994cc5d5ef555d539d2dcf4e7e1aeb528d2216dc481e5","other":"f645aab9cb2bd2709998b38e5789c9c5f68d40765e6cbd93b92e6383eb671dba","up":true},{"one":"09b3fa30780931e18b92c75d1cdeafa365609c565e4e8c253d393835cb82d98e","other":"096a8302b6f369c28ed9d47719a507ead8a3cc1ca4fa1e32318b7f97873955fe","up":true},{"one":"7d162a11662585f8c38d88fb241623e67bacf90703065dae6c092b4b507d6543","other":"7c464054ea7b6c9ea0c7d4c209769c92f294a9db2ca159b8ef168e310a1eac3a","up":true},{"one":"c74d801e85ac0fd8951480d107b41eddc5c92775614c4886b3f732fa3d1a791d","other":"ff75b19017c84128f38dec4f63e1f247a5691dc0fae186e667afedb5fe9d2c80","up":true},{"one":"cdb13873ac058861f295ebca5d958bf2bb793e3f9e274cf5a73a633425a9276f","other":"cc3397e9e11f75273d3f81d91f980f4504755f80b27a183212de56cc5085e58d","up":true},{"one":"b5eab4869b4cb65bdc1e5cab45c03016d202f9f5b668be50066451cfcf9ef299","other":"b4a1b687fbdb754fd689e26f0870a7dcab5d76190c06f3ea2ea1e198f8aa5ab2","up":true},{"one":"056152dd9dae85c426378d34acab8d6641da665d2f57359a27a0ff652f3f3d02","other":"05949ec1a582fa70cab95c59e7c0d315583bf9fc320c60c35268931f21e90853","up":true},{"one":"741a854ae299df49a738725bc58abe614e5e4302ffecd8320bbede8412d160c0","other":"5c7c15798e86fe794bb201614d46366ea96dc51091f5b19f149995e0d40df0a6","up":true},{"one":"24f80c437be45898e594f821bba0f5c62e0c9a0c720118e362ee6f78410612bd","other":"1070df5e904e3865085b0319a81761e59146494c689e7567efe7465fc819ae8b","up":true},{"one":"5c7c15798e86fe794bb201614d46366ea96dc51091f5b19f149995e0d40df0a6","other":"51440ab47fc5076c00cad16a542b846c26b3281ecea4dbca795ae9b80183ec90","up":true},{"one":"140dd212f2b193ee6a9d7fc14f7da321c7ef6fd367fb4f194924fd0ad5d135cc","other":"447cdbf1ff462aa67d6a46085b1a84fdc495a4142ab174c8e69b271b09732b4d","up":true},{"one":"482ec3dc05460579ea9bce87677bd3d9a1930e801fabeba607b8ab6b8729ff15","other":"5d82a418629cfbe7c57105309319ad695a198626fe3571de213a12ddf62f7308","up":true},{"one":"e2d36f335d90ad63148db8e353a78a30d8d9c0abe107be2cf8685f6a01ce74b9","other":"a8b58013ff911871d1aa6c2bbea6c2e6ef9b00b87b80a41dc04724ad0488e2ff","up":true},{"one":"ec90a22f41ee659d5759a497946ac2991c916f00fe7caeeeb0908f3af1fe60b6","other":"f645aab9cb2bd2709998b38e5789c9c5f68d40765e6cbd93b92e6383eb671dba","up":true},{"one":"16868ec5d8f490ac73ea28b4e8fdda55ac149bb1aafb177545b54b84a5ad5367","other":"1bd588263274543729d54529ae9e9bf4596db40649a1c2a3f73168d818f34b62","up":true},{"one":"5bd8faf93bcad07006e9426b45f5cc599f1963ab791deac4ff63d6739cd62a17","other":"553824ef701d3cd0191ae3a67de564ed0cf553e74bd60ed9de321f9302732ba6","up":true},{"one":"b659418885032905ea20ad47d70470e403e7e407e0e9ebf9277f9a2d81ec121c","other":"ba911175d3aa3fcc266e2a5aa32fb706208b8a9b5021a5f37c0b85f547eb375d","up":true},{"one":"4a95d49f58057b039b55a34f67a348c052f61770065e41243ff055efc570a935","other":"447a411c80fbd422bfa0c358d3f2a1fe6256c05e35acc6350958dfbe62cd5b9b","up":true},{"one":"f1ed9d45622ff974a1e396cd878b2deb89e31aa5d08da773423f292ae8dbcbb6","other":"a7a856a43293aa3004848a86f187e09343bd605e1a93e853a6f6b6b1031bd667","up":true},{"one":"3728152c88f1e5e61f6523b09e8f3bb1023b700deccdca5fcc1e6488136b0e57","other":"3a628ef171c1f26fa0966eb89210be0a14305aae8bfed10f4ed9017698f40f4b","up":true},{"one":"c2d00c7d960174c0934129fdcec63525bfa728f78fb70b7c52036b772d6297ad","other":"c603138e40fe2f85cc634017956ada6399fca99969e3bf0c1ee8428374e779f1","up":true},{"one":"34118166845c185d15c286b7e5433539ee98ed634baabd534d57369fd5f7c681","other":"0e80db9dfa8ce29bedfb2de031622bef8829bee52771322b6a7efb47afe540e7","up":true},{"one":"a5053958f0cefcff1826bf02525fda98c4dc954cc38690f3c43ecbf0b2ad57af","other":"885427318634c458a3050f2f26eb52454a75cea4a1263b9ed55e6eb899743854","up":true},{"one":"da36d1df95a158b0d3f9e7407d663a6b611dde0a77f00a584b97a939ab6a00de","other":"e2770cef7c1ad312b70d94ca5570e45f324c798a31a93203f505167aeab122b6","up":true},{"one":"7049e92a396311fbf2f4a55bb5bd2fe3f7bb3c1a63f41bb88eb800edd45ac6e5","other":"70f68562733da4e3b1c3949fb6e11ac0bdd49ea7e732925f937f87df5af698d6","up":true},{"one":"0e3b7722f3f84d83b3d744bea4e893715a01d4df3cf4a1c6a6823a1f5c9ad6b8","other":"0111e720a84b310f863c2530fbe149e6a221acbad01065c5d052d2b3e1716f54","up":true},{"one":"56ca9dd846a58a0ffa7b49a88aad559a338ba535a6f738468b8f146c97890cb2","other":"0e80db9dfa8ce29bedfb2de031622bef8829bee52771322b6a7efb47afe540e7","up":true},{"one":"aaf051a087a92f874a3f6c7923015e4cffb4bb3ef381c977fd902f21e841d0f4","other":"8cc3fb39009d0adc26fca1e2ee96822d168d4debc379fd516c15d4b4a1624231","up":true},{"one":"3c5b2e125020c80e3674df9cac34de4d8f3a94ee02556fb557921b6d5498b933","other":"31e670638acba3d58f4c67f3ff2f3f25d769e8a5d7a7838927f4d9d169a84404","up":true},{"one":"93c0e1adf23fdf1623359eb88c517bc521d5a26325554df890cc04c1fa17a5df","other":"9ec831d97418916fd9695465e041caf27824dbb51d6ff74d6b70f3bd561e70e6","up":true},{"one":"bcf85ecf421b871fca0247a7081188a8e2c08778b88ffad16db37ef024fec0fc","other":"b4a1b687fbdb754fd689e26f0870a7dcab5d76190c06f3ea2ea1e198f8aa5ab2","up":true},{"one":"955da15edae50a4c68bc8c579b9799d55f41b7c2a6178f645f79d772e0116662","other":"bbafac5ba5915db3c80e28b249cad260b9b5dad1f728063c48fa8f61d7556e17","up":true},{"one":"c8ea4177420785926e0929701f5e74c744920386f2a43b89d83c8281106cb95e","other":"c53417f008e4550e1c4cb9a3e2955b3af6403e059b7b4b4c33869d9ed4a580a5","up":true},{"one":"e0a0ba7e7e89a7af805e24abde1a5a5b489ba197585051a8755e8c2345c3d57b","other":"b6dffac4b4eb2974ed0ed241799f97d2e5d9be671e311266826d0dcfecfcc209","up":true},{"one":"fc514c43c4eb5c62798458da5d622e9248a6e530e4288cd902019aa05c4374d8","other":"cd6c8b42a0b092f41e6925577c9de7d1bea17231bcb3d08f3d3cce9c6fdcf22d","up":true},{"one":"025de1d2ec529d3a7da302eef0f8c54996616d40c940c0956d470ffc2a007f33","other":"05949ec1a582fa70cab95c59e7c0d315583bf9fc320c60c35268931f21e90853","up":true},{"one":"52a8747e4ea35f6f50c72d7c481616f68a5e4396248332b8ff69d3a772de49ac","other":"435d721a568eb906a03c69dbd71337251a550521a4004ab5d4a7deb6f317061a","up":true},{"one":"648a96d61898eb2d336ff7d5a229cfeb7b9f587282e40f9fe640e181ae26bdd3","other":"402cf9d0bffa017ebea34ede11207f3366b3ea450c0428029129a8e8026abbe7","up":true},{"one":"a606c79a018a6535375d851fcc82c42cc7c952720aa120434cedccf4a4be1f59","other":"bfc711793830779f49aa59bc6f7a205ab4e6eae7abfdafbf3bb5a1163a778ab2","up":true},{"one":"2c8042517dfeaa01586e91e491dd4154fb24c0d84fedb0404b9d5136f60da1d9","other":"1049d321a450726cf39d1d7cea1c108be3bec137a644b62cdc73a853f5a5a22b","up":true},{"one":"1b1dc3f9312df141855c545dd16aee325f9a609230ec6165bdbbb07d0c0862f6","other":"0d1c35c6ea485cb33857b790ee262f974cf0d54cf8ce3003f8308ac2e87c2c25","up":true},{"one":"31e129ab3df7e082cc27c649d9ee29a3ea646d6a97d2417875b80e3ff576c047","other":"3a628ef171c1f26fa0966eb89210be0a14305aae8bfed10f4ed9017698f40f4b","up":true},{"one":"7ce7fec833a2e8c7720fcc97f820f2ca2aca85388210f887c3efe78b020766e7","other":"648a96d61898eb2d336ff7d5a229cfeb7b9f587282e40f9fe640e181ae26bdd3","up":true},{"one":"46bfa8bea56b0be1abfa5ad3561bb6bf49ed6695d83ee2b2c192c5a0408347cf","other":"4005fd1fa8fbb318b29a62c368ada579e5122ca0578e6a75c509552be4b63b76","up":true},{"one":"08bd1e049859b4a7c8078ca9741fe3daa668b9fe478da06d1a435cd5566b3e11","other":"0111e720a84b310f863c2530fbe149e6a221acbad01065c5d052d2b3e1716f54","up":true},{"one":"c96146ee47ec7cd74551cf74f00213bc337d643c4327393f0e6848ecd4a0f8d3","other":"ed424d24d702520bf7cb5f6babbdc43a078435fb4a9884ed82a93d642839e127","up":true},{"one":"2ddffddbf452f0c9268058a739f5757fb90281cbfd31bd6f760acc3392fec12a","other":"0e2b48558ce2af1fbfee38a557d56072e3091cfcaee8d7847c7c9dcf7bef9bfa","up":true},{"one":"1dc0ef1ce68dc681298177bde808af514efa52a5ad38c9cd2bd61968cdf19cfb","other":"012ba278d582691241875c4c14ead91fff3983e190df7d9b43ade384e84c11fb","up":true},{"one":"035f15499cdb0f079b3e358ad54a6122681442a5293c3ae2fdf6c527004b36d2","other":"0e3b7722f3f84d83b3d744bea4e893715a01d4df3cf4a1c6a6823a1f5c9ad6b8","up":true},{"one":"9959385385aade728d3f5763806596222bc1e7b9946c2c92407943d080b32f8d","other":"95c0a351fb7aa6683280d159a7b808bfa63f63bff91a1c5936e973b2e5d3954f","up":true},{"one":"a2e6c900511768c8c9947ab0fa2e73975cf2a4cec7fd15217abdba25c329317e","other":"80735a728720bba0ac08daaccd093370d672a8f9a50845ad78ccd6cf8686c39f","up":true},{"one":"08e5a268f397385c69a7fec855ae4d889cfa98afef5b7c09fc4841e3f8894ad8","other":"138dbc1662c4ce9b2b30ef5035914cc70465666fe18f313318e662d13f099621","up":true},{"one":"feb3bc17ee7369a4fa9889d9250fed3c1257c70916871996e6eabd374dd8dc2e","other":"c9c302de4afe7b4dcbb6f3e366ce747083f9dcd7d5c6a01b939da5cdc6ccc874","up":true},{"one":"f9ded7b83e473e71be2fc0101d574c44521c96f77f9f84a384785a3af6b1093d","other":"eebd48b367cbfe94a37c0deb274a697e628074f9560b909e66229c5c76ce68eb","up":true},{"one":"c190f9d08c78ed6dffadaef36e77fe6aa96099e4453753b0cfc8ec542fa96b9d","other":"f645aab9cb2bd2709998b38e5789c9c5f68d40765e6cbd93b92e6383eb671dba","up":true},{"one":"a32749dc4e134a4fbb038618c58a7c05bbbaa06f1436de3754341af86402581b","other":"9959385385aade728d3f5763806596222bc1e7b9946c2c92407943d080b32f8d","up":true},{"one":"ab719e60a77ba5253f1690c920df9dd9f3a62071e9cce9d62e0001a522b3409e","other":"a9700308516c02cf9aea8809000a4e0596d6b44753e10bd0928df83e2eb9b9e7","up":true},{"one":"d700d96de1193456dc0bcf492c7c11b0951062974af2f7f47b8c901b17c23165","other":"feb3bc17ee7369a4fa9889d9250fed3c1257c70916871996e6eabd374dd8dc2e","up":true},{"one":"f305273a7d08e72f69b0b153855e822f252cbbf34a18f305134eed9d1eb7b58a","other":"f6c028d6a2b6408e90169151f4519b561ed183bd8925ed9a1702806f397666e7","up":true},{"one":"096a8302b6f369c28ed9d47719a507ead8a3cc1ca4fa1e32318b7f97873955fe","other":"18e00a7e0f826a1aba3f8c0f533ed905f2eee607b697fff056ee7874d374adcd","up":true},{"one":"4cece9bc134bc2b09400c9f7f8a4df9270d2fe3c077c5e441fffc911fcf6f42e","other":"5d82a418629cfbe7c57105309319ad695a198626fe3571de213a12ddf62f7308","up":true},{"one":"67585dfd87a005bae9bffc2cccb83c69537247c74886b4fa52287f46c796bcb6","other":"7c464054ea7b6c9ea0c7d4c209769c92f294a9db2ca159b8ef168e310a1eac3a","up":true},{"one":"6b4ee1b73942ced78f97c0d0e221209933e63ae7353bb9ab3d37ac4127592e86","other":"6e7f1f3d65364399617a4d95fdd04f2ca9b007b2366943e7ba5acd4616a7a425","up":true},{"one":"56635699bd3bc78193adbdb8e8b7c2c91dab4140fdaa506fea2300ee86c4ba81","other":"43c9e1571c460cb9f599fa8ed79ddd0f9c3a21fd2fa455e0603109c55012f76b","up":true},{"one":"59876e7ff9e92243856dad23126e1d38d9a5ddae79772ed1b2bdb91f33a4a4b5","other":"5bd8faf93bcad07006e9426b45f5cc599f1963ab791deac4ff63d6739cd62a17","up":true},{"one":"ab3ff955033c0a2615932faf85fd20090b9121c7edcc8e6f7ce4c4fde0a96b8a","other":"194ea3e14dc5d99f98d15607dc4c405769f5a371acc22d41a62d0537d716be32","up":true},{"one":"5a8b84df651871fce72d11cb1c26c87ae4a0cc6b4c274d37e70532c94f27288e","other":"482ec3dc05460579ea9bce87677bd3d9a1930e801fabeba607b8ab6b8729ff15","up":true},{"one":"094256812084c6052a2604149aa3aba2379c483bf4ec25162f6b43934942775a","other":"0e80db9dfa8ce29bedfb2de031622bef8829bee52771322b6a7efb47afe540e7","up":true},{"one":"0cfc7309afabceeb7d248714e972cf3987205324f5ab8d048d17bea5dc87369d","other":"0111e720a84b310f863c2530fbe149e6a221acbad01065c5d052d2b3e1716f54","up":true},{"one":"679554b410e415cfcdf1b14ef87759269b2bcaf07f4541122977db3a40091da2","other":"7660828fb0c8f89201d34e6f4d61cc6ba9a30cead6e4eb8253f6cc92e1845f23","up":true},{"one":"a3309f8b8bba4d8fbd7c6193d7671cb907b94e71155ef6138e0248682ff00e58","other":"b3f95f225e2b6b76e6c7ef7c86caf83e35213f6a22da41e653ca1c190be23c9c","up":true},{"one":"3938e6b2c095084dc9975a3e8649133557495d34ac6df874c6d929266e3ffe6f","other":"2fd2f77d76cca480ac18e9af7a462f297db168c3370b3bc0e2c04aa006c4d037","up":true},{"one":"305162c472c71ddef2320b138102b67d1ce2b8bba79e2e587fc80e085c88e547","other":"3cabd3a567fc4e6f8da66eb35d938fe1e9a7f2bdd2d36c4dc2d0e0e9149f5e56","up":true},{"one":"a8f49e87156fda5510897601689ce968d77032134c523634916b96de16366f9e","other":"fc3911383f74a982f6af8ab95a63426b56117d45f153b3c1441459d9191daaff","up":true},{"one":"6d3c6db15900f2596286f81cc0664d2c8291ead5bad2aa35bad515af088a2e48","other":"7895b2cb97b473f8893cc70a4421e0f8be1c033b27cd730fa13438b7a8f3fcb5","up":true},{"one":"a9700308516c02cf9aea8809000a4e0596d6b44753e10bd0928df83e2eb9b9e7","other":"ba911175d3aa3fcc266e2a5aa32fb706208b8a9b5021a5f37c0b85f547eb375d","up":true},{"one":"a5ac04d53b569e418ef5007961431155f2c226ee10157b30af71ea4836b08089","other":"af02c2f471e96ab8defbd229215695b95e64f7c78b145b6793a238961f556fbf","up":true},{"one":"a8ff8d69dcb36462d1116dafa5e3d0c7237bf65dbece482a316862c8d66e35b6","other":"af02c2f471e96ab8defbd229215695b95e64f7c78b145b6793a238961f556fbf","up":true},{"one":"48f1ca6d433019f932fa4ae03e0decbcbea3fe635edff4458a669b83f8162b9a","other":"447a411c80fbd422bfa0c358d3f2a1fe6256c05e35acc6350958dfbe62cd5b9b","up":true},{"one":"178401ec8d01a0a4f551d23e880a8e8a4eb87773565363843d51cf52660b1211","other":"138dbc1662c4ce9b2b30ef5035914cc70465666fe18f313318e662d13f099621","up":true},{"one":"8e282b0f27d4fa56fe14cfeb69fac5a53e3d882c7778eb190653e2eab7c93fd2","other":"93ea8ef251fd56b159e080cdf733d33e1fdfb3c7ae5bd9a6a328d0bf5458867b","up":true},{"one":"ef99b6cdc05345a1ee82267890e3ccaeef1f2bd2fe7ae8b02b6b20b9a5ef85bb","other":"87a337622455ae65daf3ab2555cee8985e9aa14bac245545d985296060e4a8de","up":true},{"one":"cc3397e9e11f75273d3f81d91f980f4504755f80b27a183212de56cc5085e58d","other":"cf52b3fc82ec24c3e9b40488d7c5f7ac8af731d159a103619bee932ec74d5e92","up":true},{"one":"16868ec5d8f490ac73ea28b4e8fdda55ac149bb1aafb177545b54b84a5ad5367","other":"2c8042517dfeaa01586e91e491dd4154fb24c0d84fedb0404b9d5136f60da1d9","up":true},{"one":"30feca631f06041cb14cead384dfaa5fffa6dc34b0cee54230efbe15e56a5884","other":"025de1d2ec529d3a7da302eef0f8c54996616d40c940c0956d470ffc2a007f33","up":true},{"one":"43c9e1571c460cb9f599fa8ed79ddd0f9c3a21fd2fa455e0603109c55012f76b","other":"79e5c6c6d78c88c579003cda044882ecb04520fbad1f5feadbe7b6d23fe183c8","up":true},{"one":"a8b58013ff911871d1aa6c2bbea6c2e6ef9b00b87b80a41dc04724ad0488e2ff","other":"a1c85ee75edb807a01f4ce930086c948918aade324752609b078c28991c04e86","up":true},{"one":"dad08999cd2edc33cfdc59ea34c8adcd6a34eaa15f2e85b0622e9848b215c1d5","other":"ddb8be472c3d48dc4d3d112448e6c0c4a826a18af3f3b53fdfef8cd31053c75f","up":true},{"one":"5c373034770e413e700b1cd03b2035f769ecd9ab8eb54d32f7b2645be1991fe5","other":"50c1a8023bfecffb09472fdc50898f4d050a31443d40a6c07b629090beb0df3d","up":true},{"one":"1dec77c2f4caf053c2d0524ae34a2d970bf4743a0d009d8fc543077ddfdfe3d0","other":"18e00a7e0f826a1aba3f8c0f533ed905f2eee607b697fff056ee7874d374adcd","up":true},{"one":"5bd8faf93bcad07006e9426b45f5cc599f1963ab791deac4ff63d6739cd62a17","other":"30feca631f06041cb14cead384dfaa5fffa6dc34b0cee54230efbe15e56a5884","up":true},{"one":"1fd0192df1fbf33771ca575afbb4e27c6541cce4a3cff2dfc1f2c085e7fab79e","other":"1dc0ef1ce68dc681298177bde808af514efa52a5ad38c9cd2bd61968cdf19cfb","up":true},{"one":"86d6f68ec0b8e1b3406943787f918bee74dd1827998bdb13ece8f690da2d296a","other":"8402bd62282811ed236b2fa1f0d41ad4bbe54e420ee34adc6164cfd4baf8658d","up":true},{"one":"26ab9c813822dbb4f1a230cd8e99e8ab280b242747deb55fdf93d160906ef331","other":"36b93656cab02213fa76124af6251109356abc5e0ae5dd1e203c6a013e014548","up":true},{"one":"7d162a11662585f8c38d88fb241623e67bacf90703065dae6c092b4b507d6543","other":"7850f5ee5048959559b3af0f95689669b250fc3aa58bcc9544dca61ca9c9769c","up":true},{"one":"397a0a0e9fadcb571acd8981f5bfe8e059e707e0feae8a9c4c6bfe87bd39e66a","other":"7c464054ea7b6c9ea0c7d4c209769c92f294a9db2ca159b8ef168e310a1eac3a","up":true},{"one":"2e65d05648b798fafbc9bb582c05e6f8f891131260e8c90ca725ddcbc823f315","other":"19ea0a685fc4edd298b736dc7a778c9ec4362de378876911105fa9ba2ce90204","up":true},{"one":"837f0993f6374039a5ad4472d6313e647a4c5db4583bd27ccfa98d3448a17731","other":"95c0a351fb7aa6683280d159a7b808bfa63f63bff91a1c5936e973b2e5d3954f","up":true},{"one":"48de553e15afd3e8a46bfc3a5ba8a298158aa3d60f140d2730230af5cce8084d","other":"7d162a11662585f8c38d88fb241623e67bacf90703065dae6c092b4b507d6543","up":true},{"one":"93c0e1adf23fdf1623359eb88c517bc521d5a26325554df890cc04c1fa17a5df","other":"e8676d17966625c4fdac6bd9437981a0cf869c8b0010812edf0c79805e0e1ff1","up":true},{"one":"9f0e2bf8a962156c9e0a83c3d42ad3dc5ac5c3e508f24200bfb151aad4e395ff","other":"97daf2cbe03c80ce6c4dae39cd071dd93cb32ed245aa9aa77285e12296957ca3","up":true},{"one":"56ca9dd846a58a0ffa7b49a88aad559a338ba535a6f738468b8f146c97890cb2","other":"0e2b48558ce2af1fbfee38a557d56072e3091cfcaee8d7847c7c9dcf7bef9bfa","up":true},{"one":"67909bdcaef2330ef120e524c76e1e382b474f3332d86f65282028e051f34c75","other":"4005fd1fa8fbb318b29a62c368ada579e5122ca0578e6a75c509552be4b63b76","up":true},{"one":"dbd4d90e3342ef837b8ecf5c6e490f7c409f419cf36b77162a87cb2cfb8ae33c","other":"d408bb6f7af1590e1f162ce02cc016b1b86ede29851caa32434212ffa2a377c8","up":true},{"one":"a6165a4b02d58be116892982c0ed3d49d86fec0e9f436a516b61868331ed853f","other":"a0c88ba70599b0e72c18fa6aedd14d607cca3e9a49a5d50165d084e70328c2dd","up":true},{"one":"aaf051a087a92f874a3f6c7923015e4cffb4bb3ef381c977fd902f21e841d0f4","other":"8006b080c78a0ab54fa1be75a939bee2334322fded6c3563de1596b17c36172c","up":true},{"one":"07f5d094a4b22e73cdd6c85452b3d928da9b4b16873824759cb7e8a622417fd5","other":"031450ec20f353435b429b5fa64f616d07c9d586afabc7a2772e05ad5c88bf50","up":true},{"one":"e0a0ba7e7e89a7af805e24abde1a5a5b489ba197585051a8755e8c2345c3d57b","other":"ec90a22f41ee659d5759a497946ac2991c916f00fe7caeeeb0908f3af1fe60b6","up":true},{"one":"8e7b96d28edae711e1a4cee0d894e0bd92cdf410ba6f61713f7d9b0bee761d4c","other":"2c85f5361b2d5abcf799de50fe58b1ed2006ea18f75823748c33eb7e95b1cc39","up":true},{"one":"025de1d2ec529d3a7da302eef0f8c54996616d40c940c0956d470ffc2a007f33","other":"1dc0ef1ce68dc681298177bde808af514efa52a5ad38c9cd2bd61968cdf19cfb","up":true},{"one":"bbafac5ba5915db3c80e28b249cad260b9b5dad1f728063c48fa8f61d7556e17","other":"a4ee49bb2caabb6b9448bcdff1fc3cc673a2db04eab9f5c62d1787f2c25990a0","up":true},{"one":"87a337622455ae65daf3ab2555cee8985e9aa14bac245545d985296060e4a8de","other":"9464ad8da1a5effdc0351742dfffae941ffd9fab469637b2491caece53c57dc8","up":true},{"one":"c6a8220726243cceaa6f2cebdac857a05efe721323f0a064c7f85a8340d3da96","other":"c603138e40fe2f85cc634017956ada6399fca99969e3bf0c1ee8428374e779f1","up":true},{"one":"bfc711793830779f49aa59bc6f7a205ab4e6eae7abfdafbf3bb5a1163a778ab2","other":"be68267d77fb52424227267c665ca1193a010334cac057338aca77b49a4b94da","up":true},{"one":"80d7e892bbb26808abb1d1530077fec6b08768c151a9f220881da3c862bae0af","other":"9c8e1f23f260c5a46b0001572675b19e5293ca65e7fdfc131c07612e9c4072fa","up":true},{"one":"e2d36f335d90ad63148db8e353a78a30d8d9c0abe107be2cf8685f6a01ce74b9","other":"e0a0ba7e7e89a7af805e24abde1a5a5b489ba197585051a8755e8c2345c3d57b","up":true},{"one":"1bd588263274543729d54529ae9e9bf4596db40649a1c2a3f73168d818f34b62","other":"4d9147e3bf98cb59a7648f616c0d7f713a8cf3b7d25e3115233ff5883128beab","up":true},{"one":"a2a163ce2cb092b411c994cc5d5ef555d539d2dcf4e7e1aeb528d2216dc481e5","other":"8f9aa2cd33d18e7cb4494d11a7532c97eb4a1cae172b2165c26ae4ed24887c0d","up":true},{"one":"52a8747e4ea35f6f50c72d7c481616f68a5e4396248332b8ff69d3a772de49ac","other":"7e47a2f82984a600c8583605a91d5cb8f2d9a18961845e9c422edd78e20ac3a3","up":true},{"one":"012ba278d582691241875c4c14ead91fff3983e190df7d9b43ade384e84c11fb","other":"0111e720a84b310f863c2530fbe149e6a221acbad01065c5d052d2b3e1716f54","up":true},{"one":"b3f95f225e2b6b76e6c7ef7c86caf83e35213f6a22da41e653ca1c190be23c9c","other":"a6165a4b02d58be116892982c0ed3d49d86fec0e9f436a516b61868331ed853f","up":true},{"one":"1070df5e904e3865085b0319a81761e59146494c689e7567efe7465fc819ae8b","other":"3938e6b2c095084dc9975a3e8649133557495d34ac6df874c6d929266e3ffe6f","up":true},{"one":"f9ded7b83e473e71be2fc0101d574c44521c96f77f9f84a384785a3af6b1093d","other":"c96146ee47ec7cd74551cf74f00213bc337d643c4327393f0e6848ecd4a0f8d3","up":true},{"one":"24f80c437be45898e594f821bba0f5c62e0c9a0c720118e362ee6f78410612bd","other":"19ea0a685fc4edd298b736dc7a778c9ec4362de378876911105fa9ba2ce90204","up":true},{"one":"2ddffddbf452f0c9268058a739f5757fb90281cbfd31bd6f760acc3392fec12a","other":"32ff1969d90aaa5a8ed2260968a8e2bac2d1cae597c906f90495f1dc5de7f8d3","up":true},{"one":"7ce7fec833a2e8c7720fcc97f820f2ca2aca85388210f887c3efe78b020766e7","other":"70f68562733da4e3b1c3949fb6e11ac0bdd49ea7e732925f937f87df5af698d6","up":true},{"one":"81a5a07f92f813e85b501b0028e1caa6e6a6c7efa5195ecb693cd2d91d5132a0","other":"8006b080c78a0ab54fa1be75a939bee2334322fded6c3563de1596b17c36172c","up":true},{"one":"9b8e6bb3a7fe4dc65ac97404e546d8b777d068c94bc2355f4f1a510ad6c11905","other":"955da15edae50a4c68bc8c579b9799d55f41b7c2a6178f645f79d772e0116662","up":true},{"one":"3b020c84fb60f59779324d451d9770d683e08133bbaa2d5762f61b8fd4b8d9fd","other":"3f31ecaffaa6311c82c9a575bbc38d6bcb16630ac87e19d1853a64aa96c9dcde","up":true},{"one":"08bd1e049859b4a7c8078ca9741fe3daa668b9fe478da06d1a435cd5566b3e11","other":"035f15499cdb0f079b3e358ad54a6122681442a5293c3ae2fdf6c527004b36d2","up":true},{"one":"b5eab4869b4cb65bdc1e5cab45c03016d202f9f5b668be50066451cfcf9ef299","other":"16868ec5d8f490ac73ea28b4e8fdda55ac149bb1aafb177545b54b84a5ad5367","up":true},{"one":"741a854ae299df49a738725bc58abe614e5e4302ffecd8320bbede8412d160c0","other":"679554b410e415cfcdf1b14ef87759269b2bcaf07f4541122977db3a40091da2","up":true},{"one":"e64d90760cd81e4f112bbf1432e76c82fa4173fd474b988f4096ce187363fd81","other":"e2770cef7c1ad312b70d94ca5570e45f324c798a31a93203f505167aeab122b6","up":true},{"one":"4a95d49f58057b039b55a34f67a348c052f61770065e41243ff055efc570a935","other":"26ab9c813822dbb4f1a230cd8e99e8ab280b242747deb55fdf93d160906ef331","up":true},{"one":"f215bc09268e60ebbec76f743bebd09d7e72d4cbeedc0b9d3417bb4a2ef42935","other":"d3e913cf4a7dabfb5699131b65e533a40adb46ea37e0ed4ce9433f99015986ef","up":true},{"one":"fc514c43c4eb5c62798458da5d622e9248a6e530e4288cd902019aa05c4374d8","other":"fa240411bc4f3e44dfca3faedd112c7743a67b522a910bc99696ef0b31732ee2","up":true},{"one":"67f383e5334e9b6701d1dbb20876d4ba9a7e578af0476caed4a7e1b701f2bedb","other":"793322608055d4873776a9a0a6c40b04379bfd2f289a8ad49a7dc456bc65f871","up":true},{"one":"59876e7ff9e92243856dad23126e1d38d9a5ddae79772ed1b2bdb91f33a4a4b5","other":"56635699bd3bc78193adbdb8e8b7c2c91dab4140fdaa506fea2300ee86c4ba81","up":true},{"one":"8ea2c8acc111f38d5b4a5ed60252ee83f312d0f8359265d5b9266d54735052fe","other":"9c21cb3e56f8ac66a7917a9ba14e58f77e998ac70c178b88b5053d9ac2777e60","up":true},{"one":"a2e6c900511768c8c9947ab0fa2e73975cf2a4cec7fd15217abdba25c329317e","other":"a32749dc4e134a4fbb038618c58a7c05bbbaa06f1436de3754341af86402581b","up":true},{"one":"4cece9bc134bc2b09400c9f7f8a4df9270d2fe3c077c5e441fffc911fcf6f42e","other":"7850f5ee5048959559b3af0f95689669b250fc3aa58bcc9544dca61ca9c9769c","up":true},{"one":"2fd2f77d76cca480ac18e9af7a462f297db168c3370b3bc0e2c04aa006c4d037","other":"0e80db9dfa8ce29bedfb2de031622bef8829bee52771322b6a7efb47afe540e7","up":true},{"one":"eebd48b367cbfe94a37c0deb274a697e628074f9560b909e66229c5c76ce68eb","other":"a2a163ce2cb092b411c994cc5d5ef555d539d2dcf4e7e1aeb528d2216dc481e5","up":true},{"one":"b78fd21c063006e2e033d1d00fc21e1ad7ad7951bb5621cec9b56639745d65f9","other":"a4ee49bb2caabb6b9448bcdff1fc3cc673a2db04eab9f5c62d1787f2c25990a0","up":true},{"one":"8e282b0f27d4fa56fe14cfeb69fac5a53e3d882c7778eb190653e2eab7c93fd2","other":"8d192b11538072db750f71204e2e6adf9dc0508d9c5cf1eb457e4e996cd985bc","up":true},{"one":"18e00a7e0f826a1aba3f8c0f533ed905f2eee607b697fff056ee7874d374adcd","other":"194ea3e14dc5d99f98d15607dc4c405769f5a371acc22d41a62d0537d716be32","up":true},{"one":"885427318634c458a3050f2f26eb52454a75cea4a1263b9ed55e6eb899743854","other":"a5ac04d53b569e418ef5007961431155f2c226ee10157b30af71ea4836b08089","up":true},{"one":"51440ab47fc5076c00cad16a542b846c26b3281ecea4dbca795ae9b80183ec90","other":"402cf9d0bffa017ebea34ede11207f3366b3ea450c0428029129a8e8026abbe7","up":true},{"one":"318828fa893a28cc0652d3f81d97c5b8e023e853685f5d3e65fde20689abcc5a","other":"397a0a0e9fadcb571acd8981f5bfe8e059e707e0feae8a9c4c6bfe87bd39e66a","up":true},{"one":"bea10868d5da506c1801de845c148c2f09761893113ac913fe66674a8f43c178","other":"b8e1a8622c256ef29acd52df7b3ace50820fb1a147716165ff862fdc973a48cd","up":true},{"one":"c53417f008e4550e1c4cb9a3e2955b3af6403e059b7b4b4c33869d9ed4a580a5","other":"c2d00c7d960174c0934129fdcec63525bfa728f78fb70b7c52036b772d6297ad","up":true},{"one":"c272b12f4020ae5b20e3d29cd09de03fa0088e3eeb5f07aa7728b29a3e90e687","other":"cc3397e9e11f75273d3f81d91f980f4504755f80b27a183212de56cc5085e58d","up":true},{"one":"b4a1b687fbdb754fd689e26f0870a7dcab5d76190c06f3ea2ea1e198f8aa5ab2","other":"b8e1a8622c256ef29acd52df7b3ace50820fb1a147716165ff862fdc973a48cd","up":true},{"one":"09b3fa30780931e18b92c75d1cdeafa365609c565e4e8c253d393835cb82d98e","other":"a5053958f0cefcff1826bf02525fda98c4dc954cc38690f3c43ecbf0b2ad57af","up":true},{"one":"0d1c35c6ea485cb33857b790ee262f974cf0d54cf8ce3003f8308ac2e87c2c25","other":"19ea0a685fc4edd298b736dc7a778c9ec4362de378876911105fa9ba2ce90204","up":true},{"one":"1fd0192df1fbf33771ca575afbb4e27c6541cce4a3cff2dfc1f2c085e7fab79e","other":"3728152c88f1e5e61f6523b09e8f3bb1023b700deccdca5fcc1e6488136b0e57","up":true},{"one":"0e3b7722f3f84d83b3d744bea4e893715a01d4df3cf4a1c6a6823a1f5c9ad6b8","other":"1addd4a9f01486212e13e43a9650b7f793617d1cb59fb8d941270d7ae55f575f","up":true},{"one":"46bfa8bea56b0be1abfa5ad3561bb6bf49ed6695d83ee2b2c192c5a0408347cf","other":"48b850974575ca57a3cc5f9a4cf5aafd8688cb32b993f69983ece63258ff876e","up":true},{"one":"3938e6b2c095084dc9975a3e8649133557495d34ac6df874c6d929266e3ffe6f","other":"70f68562733da4e3b1c3949fb6e11ac0bdd49ea7e732925f937f87df5af698d6","up":true},{"one":"178401ec8d01a0a4f551d23e880a8e8a4eb87773565363843d51cf52660b1211","other":"3728152c88f1e5e61f6523b09e8f3bb1023b700deccdca5fcc1e6488136b0e57","up":true},{"one":"994839e5f3a5b8b23aed84fb029413124af17804b79b0263ec6bfd5aec5dad78","other":"93ea8ef251fd56b159e080cdf733d33e1fdfb3c7ae5bd9a6a328d0bf5458867b","up":true},{"one":"bdc5de01276157a0f3fc43a9cc3b41b2cacc8479118b75aec4ba9b2b7fa86d5e","other":"ab719e60a77ba5253f1690c920df9dd9f3a62071e9cce9d62e0001a522b3409e","up":true},{"one":"43c9e1571c460cb9f599fa8ed79ddd0f9c3a21fd2fa455e0603109c55012f76b","other":"68cbc4a5313080d5dca8ad34e8bf52a6144e0ff8ef3f795d7ae9d5f644fe2042","up":true},{"one":"34118166845c185d15c286b7e5433539ee98ed634baabd534d57369fd5f7c681","other":"2ddffddbf452f0c9268058a739f5757fb90281cbfd31bd6f760acc3392fec12a","up":true},{"one":"67909bdcaef2330ef120e524c76e1e382b474f3332d86f65282028e051f34c75","other":"44adaabf9c46608a374ed816d3c40c63b6645f4f6e033a76431bc8f88713eb41","up":true},{"one":"56ca9dd846a58a0ffa7b49a88aad559a338ba535a6f738468b8f146c97890cb2","other":"5d82a418629cfbe7c57105309319ad695a198626fe3571de213a12ddf62f7308","up":true},{"one":"9464ad8da1a5effdc0351742dfffae941ffd9fab469637b2491caece53c57dc8","other":"80d7e892bbb26808abb1d1530077fec6b08768c151a9f220881da3c862bae0af","up":true},{"one":"a8ff8d69dcb36462d1116dafa5e3d0c7237bf65dbece482a316862c8d66e35b6","other":"a742e8502c619703ce87890110f908bde32b59dc61d77a247759e5d0056e0c94","up":true},{"one":"d20931ce3da972fd23ea306e5c604a1fbd9417ba02654c5cdbe278fe259f75d5","other":"dbd4d90e3342ef837b8ecf5c6e490f7c409f419cf36b77162a87cb2cfb8ae33c","up":true},{"one":"1dec77c2f4caf053c2d0524ae34a2d970bf4743a0d009d8fc543077ddfdfe3d0","other":"194ea3e14dc5d99f98d15607dc4c405769f5a371acc22d41a62d0537d716be32","up":true},{"one":"cf52b3fc82ec24c3e9b40488d7c5f7ac8af731d159a103619bee932ec74d5e92","other":"244c3c954ac612e51d4945ab9b77f0b4a3983285e8add7921777e0c45a1bf338","up":true},{"one":"3f31ecaffaa6311c82c9a575bbc38d6bcb16630ac87e19d1853a64aa96c9dcde","other":"2a507f5cb921137a7225c9c4988a8514af0f7e3c442cb8bf2bb612dc522a7daf","up":true},{"one":"4d381014783980b2f77f0d71160ad9e9d84672b576f4435ccdbae12752350c1c","other":"48de553e15afd3e8a46bfc3a5ba8a298158aa3d60f140d2730230af5cce8084d","up":true},{"one":"cdb13873ac058861f295ebca5d958bf2bb793e3f9e274cf5a73a633425a9276f","other":"d700d96de1193456dc0bcf492c7c11b0951062974af2f7f47b8c901b17c23165","up":true},{"one":"2e65d05648b798fafbc9bb582c05e6f8f891131260e8c90ca725ddcbc823f315","other":"1070df5e904e3865085b0319a81761e59146494c689e7567efe7465fc819ae8b","up":true},{"one":"ab3ff955033c0a2615932faf85fd20090b9121c7edcc8e6f7ce4c4fde0a96b8a","other":"1049d321a450726cf39d1d7cea1c108be3bec137a644b62cdc73a853f5a5a22b","up":true},{"one":"5814be13c8550b9a5a83d08e7af6022002a8fdaa38ba6c2c30be58099a9f7744","other":"553824ef701d3cd0191ae3a67de564ed0cf553e74bd60ed9de321f9302732ba6","up":true},{"one":"d9cf19895e015cb534d915aed83c0d26bf40a11244027812e17c3bec6e645a8e","other":"cd6c8b42a0b092f41e6925577c9de7d1bea17231bcb3d08f3d3cce9c6fdcf22d","up":true},{"one":"bfc711793830779f49aa59bc6f7a205ab4e6eae7abfdafbf3bb5a1163a778ab2","other":"97daf2cbe03c80ce6c4dae39cd071dd93cb32ed245aa9aa77285e12296957ca3","up":true},{"one":"30feca631f06041cb14cead384dfaa5fffa6dc34b0cee54230efbe15e56a5884","other":"046ca54165f0dd4d62fd7d8ee9e97c655db3d35f5452a0ccb0dffc79c047978c","up":true},{"one":"e6812448728b4bda5962adceb1707b29f661d3d1a6b2ccd5f8183c9a1f4d01b6","other":"c603138e40fe2f85cc634017956ada6399fca99969e3bf0c1ee8428374e779f1","up":true},{"one":"9f7d72b7d9843872904b841e421985082428fba5010db27dd871ed76630a1e1d","other":"c190f9d08c78ed6dffadaef36e77fe6aa96099e4453753b0cfc8ec542fa96b9d","up":true},{"one":"bcf85ecf421b871fca0247a7081188a8e2c08778b88ffad16db37ef024fec0fc","other":"ba911175d3aa3fcc266e2a5aa32fb706208b8a9b5021a5f37c0b85f547eb375d","up":true},{"one":"d3e913cf4a7dabfb5699131b65e533a40adb46ea37e0ed4ce9433f99015986ef","other":"da36d1df95a158b0d3f9e7407d663a6b611dde0a77f00a584b97a939ab6a00de","up":true},{"one":"1bd588263274543729d54529ae9e9bf4596db40649a1c2a3f73168d818f34b62","other":"019109311d4888497aa194cce4a89b5ef243421cf0e7e7bb9115d086e1a1f7d7","up":true},{"one":"24f80c437be45898e594f821bba0f5c62e0c9a0c720118e362ee6f78410612bd","other":"3938e6b2c095084dc9975a3e8649133557495d34ac6df874c6d929266e3ffe6f","up":true},{"one":"48de553e15afd3e8a46bfc3a5ba8a298158aa3d60f140d2730230af5cce8084d","other":"79e5c6c6d78c88c579003cda044882ecb04520fbad1f5feadbe7b6d23fe183c8","up":true},{"one":"48d79ac55f8df512af8e7d868aa40ac9b61493fa4f1b0ce0b76bf6da2eb30e78","other":"70f68562733da4e3b1c3949fb6e11ac0bdd49ea7e732925f937f87df5af698d6","up":true},{"one":"f7561cb6740e17ec7c7d17068251b2c951d954c77804aa5af60464e9c3964e57","other":"f6c028d6a2b6408e90169151f4519b561ed183bd8925ed9a1702806f397666e7","up":true},{"one":"837f0993f6374039a5ad4472d6313e647a4c5db4583bd27ccfa98d3448a17731","other":"c96146ee47ec7cd74551cf74f00213bc337d643c4327393f0e6848ecd4a0f8d3","up":true},{"one":"244c3c954ac612e51d4945ab9b77f0b4a3983285e8add7921777e0c45a1bf338","other":"6d3c6db15900f2596286f81cc0664d2c8291ead5bad2aa35bad515af088a2e48","up":true},{"one":"68cbc4a5313080d5dca8ad34e8bf52a6144e0ff8ef3f795d7ae9d5f644fe2042","other":"60c5647aed152609979366fb33dc8b28fc60736098ff68d232415889b43dfa58","up":true},{"one":"aaf051a087a92f874a3f6c7923015e4cffb4bb3ef381c977fd902f21e841d0f4","other":"b3f95f225e2b6b76e6c7ef7c86caf83e35213f6a22da41e653ca1c190be23c9c","up":true},{"one":"ddb8be472c3d48dc4d3d112448e6c0c4a826a18af3f3b53fdfef8cd31053c75f","other":"f2b49a2247c9c5e8f6f755834a37fe5c17f208f994878e14b7001e404f52e125","up":true},{"one":"b5eab4869b4cb65bdc1e5cab45c03016d202f9f5b668be50066451cfcf9ef299","other":"b78fd21c063006e2e033d1d00fc21e1ad7ad7951bb5621cec9b56639745d65f9","up":true},{"one":"ed424d24d702520bf7cb5f6babbdc43a078435fb4a9884ed82a93d642839e127","other":"cd6c8b42a0b092f41e6925577c9de7d1bea17231bcb3d08f3d3cce9c6fdcf22d","up":true},{"one":"26acc3c373c29150af30bbc9264d0c44c7c606ff7377399ddf844635e97afcfa","other":"318828fa893a28cc0652d3f81d97c5b8e023e853685f5d3e65fde20689abcc5a","up":true},{"one":"67585dfd87a005bae9bffc2cccb83c69537247c74886b4fa52287f46c796bcb6","other":"7850f5ee5048959559b3af0f95689669b250fc3aa58bcc9544dca61ca9c9769c","up":true},{"one":"e64d90760cd81e4f112bbf1432e76c82fa4173fd474b988f4096ce187363fd81","other":"a3309f8b8bba4d8fbd7c6193d7671cb907b94e71155ef6138e0248682ff00e58","up":true},{"one":"95c0a351fb7aa6683280d159a7b808bfa63f63bff91a1c5936e973b2e5d3954f","other":"93ea8ef251fd56b159e080cdf733d33e1fdfb3c7ae5bd9a6a328d0bf5458867b","up":true},{"one":"8d192b11538072db750f71204e2e6adf9dc0508d9c5cf1eb457e4e996cd985bc","other":"8f9aa2cd33d18e7cb4494d11a7532c97eb4a1cae172b2165c26ae4ed24887c0d","up":true},{"one":"4d9147e3bf98cb59a7648f616c0d7f713a8cf3b7d25e3115233ff5883128beab","other":"402cf9d0bffa017ebea34ede11207f3366b3ea450c0428029129a8e8026abbe7","up":true},{"one":"d700d96de1193456dc0bcf492c7c11b0951062974af2f7f47b8c901b17c23165","other":"c42e6492879439eeecd9938d17ff283fd8f5f24206906ca512b4daa4803b78b4","up":true},{"one":"08f84878e44fed2adb4b2685b9f293dc3c73d5f9bc1c474870d943ec2ae73dbe","other":"08e5a268f397385c69a7fec855ae4d889cfa98afef5b7c09fc4841e3f8894ad8","up":true},{"one":"59876e7ff9e92243856dad23126e1d38d9a5ddae79772ed1b2bdb91f33a4a4b5","other":"48d79ac55f8df512af8e7d868aa40ac9b61493fa4f1b0ce0b76bf6da2eb30e78","up":true},{"one":"14849f811af20ce19fb29417d20c15fc16da1e45aebdf795a2c6ccb671e4bdac","other":"3a628ef171c1f26fa0966eb89210be0a14305aae8bfed10f4ed9017698f40f4b","up":true},{"one":"5ac0d00b8d647dec62d26e1a689fd05b8b7a1a79ab8c43493bd6d7d209816df1","other":"0e2b48558ce2af1fbfee38a557d56072e3091cfcaee8d7847c7c9dcf7bef9bfa","up":true},{"one":"d408bb6f7af1590e1f162ce02cc016b1b86ede29851caa32434212ffa2a377c8","other":"b8e1a8622c256ef29acd52df7b3ace50820fb1a147716165ff862fdc973a48cd","up":true},{"one":"7049e92a396311fbf2f4a55bb5bd2fe3f7bb3c1a63f41bb88eb800edd45ac6e5","other":"741a854ae299df49a738725bc58abe614e5e4302ffecd8320bbede8412d160c0","up":true},{"one":"a8f49e87156fda5510897601689ce968d77032134c523634916b96de16366f9e","other":"af02c2f471e96ab8defbd229215695b95e64f7c78b145b6793a238961f556fbf","up":true},{"one":"31e129ab3df7e082cc27c649d9ee29a3ea646d6a97d2417875b80e3ff576c047","other":"2a507f5cb921137a7225c9c4988a8514af0f7e3c442cb8bf2bb612dc522a7daf","up":true},{"one":"0e2b48558ce2af1fbfee38a557d56072e3091cfcaee8d7847c7c9dcf7bef9bfa","other":"096a8302b6f369c28ed9d47719a507ead8a3cc1ca4fa1e32318b7f97873955fe","up":true},{"one":"7c7ca5a7522a04f62f2bebd6197a03d78f255d0175c3dfceb5d92b684365b2aa","other":"7895b2cb97b473f8893cc70a4421e0f8be1c033b27cd730fa13438b7a8f3fcb5","up":true},{"one":"046ca54165f0dd4d62fd7d8ee9e97c655db3d35f5452a0ccb0dffc79c047978c","other":"2fd2f77d76cca480ac18e9af7a462f297db168c3370b3bc0e2c04aa006c4d037","up":true},{"one":"e2770cef7c1ad312b70d94ca5570e45f324c798a31a93203f505167aeab122b6","other":"e6812448728b4bda5962adceb1707b29f661d3d1a6b2ccd5f8183c9a1f4d01b6","up":true},{"one":"e2d36f335d90ad63148db8e353a78a30d8d9c0abe107be2cf8685f6a01ce74b9","other":"e6812448728b4bda5962adceb1707b29f661d3d1a6b2ccd5f8183c9a1f4d01b6","up":true},{"one":"9c21cb3e56f8ac66a7917a9ba14e58f77e998ac70c178b88b5053d9ac2777e60","other":"8b4318f86ad47976321af97bfbf95cd0a3b0aa22447aeb0611ed1a9bf1e6a4bf","up":true},{"one":"1b1dc3f9312df141855c545dd16aee325f9a609230ec6165bdbbb07d0c0862f6","other":"24f80c437be45898e594f821bba0f5c62e0c9a0c720118e362ee6f78410612bd","up":true},{"one":"398038811c1c7402fe2e6994c9ce2f15c8166b8e99f379feaaed66ac87702062","other":"2ddffddbf452f0c9268058a739f5757fb90281cbfd31bd6f760acc3392fec12a","up":true},{"one":"0d1c35c6ea485cb33857b790ee262f974cf0d54cf8ce3003f8308ac2e87c2c25","other":"046ca54165f0dd4d62fd7d8ee9e97c655db3d35f5452a0ccb0dffc79c047978c","up":true},{"one":"435d721a568eb906a03c69dbd71337251a550521a4004ab5d4a7deb6f317061a","other":"5a26ae73eebf27f6dbec2414f1277a249e814a7a06790d7061610e5227b086f6","up":true},{"one":"87a337622455ae65daf3ab2555cee8985e9aa14bac245545d985296060e4a8de","other":"9257dc934dfbf17473b70cb85333c6fab67ee9b6228a646576c4f57253f1004e","up":true},{"one":"8cc3fb39009d0adc26fca1e2ee96822d168d4debc379fd516c15d4b4a1624231","other":"95c0a351fb7aa6683280d159a7b808bfa63f63bff91a1c5936e973b2e5d3954f","up":true},{"one":"1049d321a450726cf39d1d7cea1c108be3bec137a644b62cdc73a853f5a5a22b","other":"7850f5ee5048959559b3af0f95689669b250fc3aa58bcc9544dca61ca9c9769c","up":true},{"one":"8358a74fc8d8e39ccc40b4d3a212b7a69a6a8f6afc25cff2c9c7b44bbaf9ec82","other":"bdc5de01276157a0f3fc43a9cc3b41b2cacc8479118b75aec4ba9b2b7fa86d5e","up":true},{"one":"c2d00c7d960174c0934129fdcec63525bfa728f78fb70b7c52036b772d6297ad","other":"c42e6492879439eeecd9938d17ff283fd8f5f24206906ca512b4daa4803b78b4","up":true},{"one":"a8b58013ff911871d1aa6c2bbea6c2e6ef9b00b87b80a41dc04724ad0488e2ff","other":"a9700308516c02cf9aea8809000a4e0596d6b44753e10bd0928df83e2eb9b9e7","up":true},{"one":"5c7c15798e86fe794bb201614d46366ea96dc51091f5b19f149995e0d40df0a6","other":"50c1a8023bfecffb09472fdc50898f4d050a31443d40a6c07b629090beb0df3d","up":true},{"one":"a9700308516c02cf9aea8809000a4e0596d6b44753e10bd0928df83e2eb9b9e7","other":"aceee75a260d45252060fe971eabd4bde25f912db4a3c6e47f4a09572fe01697","up":true},{"one":"951877b34ee1535b5059c49beb03e8960ff9c12b694ef64708c77c30ff1dc706","other":"84a9db7645c792dc38c1f2113a8f0590d04e1c94d9a8c464ab0ec8219303d966","up":true},{"one":"19ea0a685fc4edd298b736dc7a778c9ec4362de378876911105fa9ba2ce90204","other":"7c7ca5a7522a04f62f2bebd6197a03d78f255d0175c3dfceb5d92b684365b2aa","up":true},{"one":"dbd4d90e3342ef837b8ecf5c6e490f7c409f419cf36b77162a87cb2cfb8ae33c","other":"d95965e449dd4069876384cf4b34f986731e255a7948f0a862d229b1dddbc502","up":true},{"one":"34118166845c185d15c286b7e5433539ee98ed634baabd534d57369fd5f7c681","other":"2fd2f77d76cca480ac18e9af7a462f297db168c3370b3bc0e2c04aa006c4d037","up":true},{"one":"5ff09c6859736aad7a82a3bfb3f1a1a8b3c0d58f831863540d9c3013dd35745e","other":"6dd3ac0fd9a04a2ce75875c683d135e52eaa1670cb55e78711620712e60fde47","up":true},{"one":"305162c472c71ddef2320b138102b67d1ce2b8bba79e2e587fc80e085c88e547","other":"18e00a7e0f826a1aba3f8c0f533ed905f2eee607b697fff056ee7874d374adcd","up":true},{"one":"3b020c84fb60f59779324d451d9770d683e08133bbaa2d5762f61b8fd4b8d9fd","other":"2c85f5361b2d5abcf799de50fe58b1ed2006ea18f75823748c33eb7e95b1cc39","up":true},{"one":"52a8747e4ea35f6f50c72d7c481616f68a5e4396248332b8ff69d3a772de49ac","other":"5c373034770e413e700b1cd03b2035f769ecd9ab8eb54d32f7b2645be1991fe5","up":true},{"one":"447cdbf1ff462aa67d6a46085b1a84fdc495a4142ab174c8e69b271b09732b4d","other":"5d82a418629cfbe7c57105309319ad695a198626fe3571de213a12ddf62f7308","up":true},{"one":"32ff1969d90aaa5a8ed2260968a8e2bac2d1cae597c906f90495f1dc5de7f8d3","other":"0e80db9dfa8ce29bedfb2de031622bef8829bee52771322b6a7efb47afe540e7","up":true},{"one":"056152dd9dae85c426378d34acab8d6641da665d2f57359a27a0ff652f3f3d02","other":"1049d321a450726cf39d1d7cea1c108be3bec137a644b62cdc73a853f5a5a22b","up":true},{"one":"793322608055d4873776a9a0a6c40b04379bfd2f289a8ad49a7dc456bc65f871","other":"447cdbf1ff462aa67d6a46085b1a84fdc495a4142ab174c8e69b271b09732b4d","up":true},{"one":"4a95d49f58057b039b55a34f67a348c052f61770065e41243ff055efc570a935","other":"298ae5d173c5360bc9ad5b492ed35de3b6e0cae868a34bfe6311a8ba5ea9877e","up":true},{"one":"af02c2f471e96ab8defbd229215695b95e64f7c78b145b6793a238961f556fbf","other":"b8e1a8622c256ef29acd52df7b3ace50820fb1a147716165ff862fdc973a48cd","up":true},{"one":"70f68562733da4e3b1c3949fb6e11ac0bdd49ea7e732925f937f87df5af698d6","other":"48b850974575ca57a3cc5f9a4cf5aafd8688cb32b993f69983ece63258ff876e","up":true},{"one":"9b8e6bb3a7fe4dc65ac97404e546d8b777d068c94bc2355f4f1a510ad6c11905","other":"9ca1fd5d41975acb905f337997922849b4070360e47849bb4fd8cd1b9ddb4d73","up":true},{"one":"09b3fa30780931e18b92c75d1cdeafa365609c565e4e8c253d393835cb82d98e","other":"0e3b7722f3f84d83b3d744bea4e893715a01d4df3cf4a1c6a6823a1f5c9ad6b8","up":true},{"one":"f9ded7b83e473e71be2fc0101d574c44521c96f77f9f84a384785a3af6b1093d","other":"e64d90760cd81e4f112bbf1432e76c82fa4173fd474b988f4096ce187363fd81","up":true},{"one":"031450ec20f353435b429b5fa64f616d07c9d586afabc7a2772e05ad5c88bf50","other":"0e3b7722f3f84d83b3d744bea4e893715a01d4df3cf4a1c6a6823a1f5c9ad6b8","up":true},{"one":"397a0a0e9fadcb571acd8981f5bfe8e059e707e0feae8a9c4c6bfe87bd39e66a","other":"2a507f5cb921137a7225c9c4988a8514af0f7e3c442cb8bf2bb612dc522a7daf","up":true},{"one":"834f14e9f325482adef62651ddf3685690dd5ebdd18014f2bd266b2143c290ff","other":"8e7b96d28edae711e1a4cee0d894e0bd92cdf410ba6f61713f7d9b0bee761d4c","up":true},{"one":"ef99b6cdc05345a1ee82267890e3ccaeef1f2bd2fe7ae8b02b6b20b9a5ef85bb","other":"86d6f68ec0b8e1b3406943787f918bee74dd1827998bdb13ece8f690da2d296a","up":true},{"one":"a742e8502c619703ce87890110f908bde32b59dc61d77a247759e5d0056e0c94","other":"a4ee49bb2caabb6b9448bcdff1fc3cc673a2db04eab9f5c62d1787f2c25990a0","up":true},{"one":"5814be13c8550b9a5a83d08e7af6022002a8fdaa38ba6c2c30be58099a9f7744","other":"6dd3ac0fd9a04a2ce75875c683d135e52eaa1670cb55e78711620712e60fde47","up":true},{"one":"bcf85ecf421b871fca0247a7081188a8e2c08778b88ffad16db37ef024fec0fc","other":"a8b58013ff911871d1aa6c2bbea6c2e6ef9b00b87b80a41dc04724ad0488e2ff","up":true},{"one":"aaf051a087a92f874a3f6c7923015e4cffb4bb3ef381c977fd902f21e841d0f4","other":"a0c88ba70599b0e72c18fa6aedd14d607cca3e9a49a5d50165d084e70328c2dd","up":true},{"one":"08bd1e049859b4a7c8078ca9741fe3daa668b9fe478da06d1a435cd5566b3e11","other":"08e5a268f397385c69a7fec855ae4d889cfa98afef5b7c09fc4841e3f8894ad8","up":true},{"one":"26acc3c373c29150af30bbc9264d0c44c7c606ff7377399ddf844635e97afcfa","other":"32ff1969d90aaa5a8ed2260968a8e2bac2d1cae597c906f90495f1dc5de7f8d3","up":true},{"one":"d700d96de1193456dc0bcf492c7c11b0951062974af2f7f47b8c901b17c23165","other":"f2b49a2247c9c5e8f6f755834a37fe5c17f208f994878e14b7001e404f52e125","up":true},{"one":"679554b410e415cfcdf1b14ef87759269b2bcaf07f4541122977db3a40091da2","other":"447a411c80fbd422bfa0c358d3f2a1fe6256c05e35acc6350958dfbe62cd5b9b","up":true},{"one":"0cfc7309afabceeb7d248714e972cf3987205324f5ab8d048d17bea5dc87369d","other":"d408bb6f7af1590e1f162ce02cc016b1b86ede29851caa32434212ffa2a377c8","up":true},{"one":"46bfa8bea56b0be1abfa5ad3561bb6bf49ed6695d83ee2b2c192c5a0408347cf","other":"447a411c80fbd422bfa0c358d3f2a1fe6256c05e35acc6350958dfbe62cd5b9b","up":true},{"one":"c6a8220726243cceaa6f2cebdac857a05efe721323f0a064c7f85a8340d3da96","other":"ff75b19017c84128f38dec4f63e1f247a5691dc0fae186e667afedb5fe9d2c80","up":true},{"one":"c8c8a93779ec4d9ac40925e8208478a00ee27fc220ddd73d8774cf6bfa255c46","other":"d95965e449dd4069876384cf4b34f986731e255a7948f0a862d229b1dddbc502","up":true},{"one":"9ec831d97418916fd9695465e041caf27824dbb51d6ff74d6b70f3bd561e70e6","other":"9f7d72b7d9843872904b841e421985082428fba5010db27dd871ed76630a1e1d","up":true},{"one":"f1ed9d45622ff974a1e396cd878b2deb89e31aa5d08da773423f292ae8dbcbb6","other":"fc3911383f74a982f6af8ab95a63426b56117d45f153b3c1441459d9191daaff","up":true},{"one":"67909bdcaef2330ef120e524c76e1e382b474f3332d86f65282028e051f34c75","other":"4a95d49f58057b039b55a34f67a348c052f61770065e41243ff055efc570a935","up":true},{"one":"30feca631f06041cb14cead384dfaa5fffa6dc34b0cee54230efbe15e56a5884","other":"3938e6b2c095084dc9975a3e8649133557495d34ac6df874c6d929266e3ffe6f","up":true},{"one":"c603138e40fe2f85cc634017956ada6399fca99969e3bf0c1ee8428374e779f1","other":"d3022a46956e75bca85ba89d97b694a3a64f03ccc2d881ed0cd687d43d486925","up":true},{"one":"138dbc1662c4ce9b2b30ef5035914cc70465666fe18f313318e662d13f099621","other":"0d1c35c6ea485cb33857b790ee262f974cf0d54cf8ce3003f8308ac2e87c2c25","up":true},{"one":"ab3ff955033c0a2615932faf85fd20090b9121c7edcc8e6f7ce4c4fde0a96b8a","other":"a32749dc4e134a4fbb038618c58a7c05bbbaa06f1436de3754341af86402581b","up":true},{"one":"67f383e5334e9b6701d1dbb20876d4ba9a7e578af0476caed4a7e1b701f2bedb","other":"679554b410e415cfcdf1b14ef87759269b2bcaf07f4541122977db3a40091da2","up":true},{"one":"4d381014783980b2f77f0d71160ad9e9d84672b576f4435ccdbae12752350c1c","other":"5ac0d00b8d647dec62d26e1a689fd05b8b7a1a79ab8c43493bd6d7d209816df1","up":true},{"one":"0e2b48558ce2af1fbfee38a557d56072e3091cfcaee8d7847c7c9dcf7bef9bfa","other":"019109311d4888497aa194cce4a89b5ef243421cf0e7e7bb9115d086e1a1f7d7","up":true},{"one":"c272b12f4020ae5b20e3d29cd09de03fa0088e3eeb5f07aa7728b29a3e90e687","other":"c2d00c7d960174c0934129fdcec63525bfa728f78fb70b7c52036b772d6297ad","up":true},{"one":"08e5a268f397385c69a7fec855ae4d889cfa98afef5b7c09fc4841e3f8894ad8","other":"140dd212f2b193ee6a9d7fc14f7da321c7ef6fd367fb4f194924fd0ad5d135cc","up":true},{"one":"d408bb6f7af1590e1f162ce02cc016b1b86ede29851caa32434212ffa2a377c8","other":"cd6c8b42a0b092f41e6925577c9de7d1bea17231bcb3d08f3d3cce9c6fdcf22d","up":true},{"one":"80735a728720bba0ac08daaccd093370d672a8f9a50845ad78ccd6cf8686c39f","other":"8f9aa2cd33d18e7cb4494d11a7532c97eb4a1cae172b2165c26ae4ed24887c0d","up":true},{"one":"9ca1fd5d41975acb905f337997922849b4070360e47849bb4fd8cd1b9ddb4d73","other":"8f9aa2cd33d18e7cb4494d11a7532c97eb4a1cae172b2165c26ae4ed24887c0d","up":true},{"one":"c2d00c7d960174c0934129fdcec63525bfa728f78fb70b7c52036b772d6297ad","other":"e471efbcf1def3915b3dda2dc65a86945c607be54a33e31e9625549becac0e34","up":true},{"one":"fc514c43c4eb5c62798458da5d622e9248a6e530e4288cd902019aa05c4374d8","other":"feb3bc17ee7369a4fa9889d9250fed3c1257c70916871996e6eabd374dd8dc2e","up":true},{"one":"bfc711793830779f49aa59bc6f7a205ab4e6eae7abfdafbf3bb5a1163a778ab2","other":"d3022a46956e75bca85ba89d97b694a3a64f03ccc2d881ed0cd687d43d486925","up":true},{"one":"86d6f68ec0b8e1b3406943787f918bee74dd1827998bdb13ece8f690da2d296a","other":"a1c85ee75edb807a01f4ce930086c948918aade324752609b078c28991c04e86","up":true},{"one":"c8ea4177420785926e0929701f5e74c744920386f2a43b89d83c8281106cb95e","other":"f7561cb6740e17ec7c7d17068251b2c951d954c77804aa5af60464e9c3964e57","up":true},{"one":"a8b58013ff911871d1aa6c2bbea6c2e6ef9b00b87b80a41dc04724ad0488e2ff","other":"f7561cb6740e17ec7c7d17068251b2c951d954c77804aa5af60464e9c3964e57","up":true},{"one":"c9c302de4afe7b4dcbb6f3e366ce747083f9dcd7d5c6a01b939da5cdc6ccc874","other":"c96146ee47ec7cd74551cf74f00213bc337d643c4327393f0e6848ecd4a0f8d3","up":true},{"one":"994839e5f3a5b8b23aed84fb029413124af17804b79b0263ec6bfd5aec5dad78","other":"955da15edae50a4c68bc8c579b9799d55f41b7c2a6178f645f79d772e0116662","up":true},{"one":"1dec77c2f4caf053c2d0524ae34a2d970bf4743a0d009d8fc543077ddfdfe3d0","other":"08f84878e44fed2adb4b2685b9f293dc3c73d5f9bc1c474870d943ec2ae73dbe","up":true},{"one":"402cf9d0bffa017ebea34ede11207f3366b3ea450c0428029129a8e8026abbe7","other":"4005fd1fa8fbb318b29a62c368ada579e5122ca0578e6a75c509552be4b63b76","up":true},{"one":"cc3397e9e11f75273d3f81d91f980f4504755f80b27a183212de56cc5085e58d","other":"c42e6492879439eeecd9938d17ff283fd8f5f24206906ca512b4daa4803b78b4","up":true},{"one":"5a8b84df651871fce72d11cb1c26c87ae4a0cc6b4c274d37e70532c94f27288e","other":"60c5647aed152609979366fb33dc8b28fc60736098ff68d232415889b43dfa58","up":true},{"one":"8b4318f86ad47976321af97bfbf95cd0a3b0aa22447aeb0611ed1a9bf1e6a4bf","other":"9ec831d97418916fd9695465e041caf27824dbb51d6ff74d6b70f3bd561e70e6","up":true},{"one":"81a5a07f92f813e85b501b0028e1caa6e6a6c7efa5195ecb693cd2d91d5132a0","other":"80d7e892bbb26808abb1d1530077fec6b08768c151a9f220881da3c862bae0af","up":true},{"one":"e64d90760cd81e4f112bbf1432e76c82fa4173fd474b988f4096ce187363fd81","other":"aeb45fe10b0dbd0f72ab6a77fbf971a8f46dbcdd96c08f23279d1434b4f38b1d","up":true},{"one":"c190f9d08c78ed6dffadaef36e77fe6aa96099e4453753b0cfc8ec542fa96b9d","other":"c272b12f4020ae5b20e3d29cd09de03fa0088e3eeb5f07aa7728b29a3e90e687","up":true},{"one":"094256812084c6052a2604149aa3aba2379c483bf4ec25162f6b43934942775a","other":"244c3c954ac612e51d4945ab9b77f0b4a3983285e8add7921777e0c45a1bf338","up":true},{"one":"305162c472c71ddef2320b138102b67d1ce2b8bba79e2e587fc80e085c88e547","other":"298ae5d173c5360bc9ad5b492ed35de3b6e0cae868a34bfe6311a8ba5ea9877e","up":true},{"one":"a606c79a018a6535375d851fcc82c42cc7c952720aa120434cedccf4a4be1f59","other":"a4ee49bb2caabb6b9448bcdff1fc3cc673a2db04eab9f5c62d1787f2c25990a0","up":true},{"one":"4b79e83186f2ab05932eaa99982a2e53373b83780e32d224d15cb2c85462451f","other":"48b850974575ca57a3cc5f9a4cf5aafd8688cb32b993f69983ece63258ff876e","up":true},{"one":"9c21cb3e56f8ac66a7917a9ba14e58f77e998ac70c178b88b5053d9ac2777e60","other":"8d192b11538072db750f71204e2e6adf9dc0508d9c5cf1eb457e4e996cd985bc","up":true},{"one":"5d82a418629cfbe7c57105309319ad695a198626fe3571de213a12ddf62f7308","other":"4d9147e3bf98cb59a7648f616c0d7f713a8cf3b7d25e3115233ff5883128beab","up":true},{"one":"48f1ca6d433019f932fa4ae03e0decbcbea3fe635edff4458a669b83f8162b9a","other":"4b79e83186f2ab05932eaa99982a2e53373b83780e32d224d15cb2c85462451f","up":true},{"one":"34118166845c185d15c286b7e5433539ee98ed634baabd534d57369fd5f7c681","other":"2c8042517dfeaa01586e91e491dd4154fb24c0d84fedb0404b9d5136f60da1d9","up":true},{"one":"08f84878e44fed2adb4b2685b9f293dc3c73d5f9bc1c474870d943ec2ae73dbe","other":"0111e720a84b310f863c2530fbe149e6a221acbad01065c5d052d2b3e1716f54","up":true},{"one":"32ff1969d90aaa5a8ed2260968a8e2bac2d1cae597c906f90495f1dc5de7f8d3","other":"43d43e9ebcbceb4830fc1d2d5024650b90698306bbd2c4d0b4841a1a8fd09c93","up":true},{"one":"9959385385aade728d3f5763806596222bc1e7b9946c2c92407943d080b32f8d","other":"8f9aa2cd33d18e7cb4494d11a7532c97eb4a1cae172b2165c26ae4ed24887c0d","up":true},{"one":"5ff09c6859736aad7a82a3bfb3f1a1a8b3c0d58f831863540d9c3013dd35745e","other":"5a8b84df651871fce72d11cb1c26c87ae4a0cc6b4c274d37e70532c94f27288e","up":true},{"one":"318828fa893a28cc0652d3f81d97c5b8e023e853685f5d3e65fde20689abcc5a","other":"305162c472c71ddef2320b138102b67d1ce2b8bba79e2e587fc80e085c88e547","up":true},{"one":"a8ff8d69dcb36462d1116dafa5e3d0c7237bf65dbece482a316862c8d66e35b6","other":"a8f49e87156fda5510897601689ce968d77032134c523634916b96de16366f9e","up":true},{"one":"09b3fa30780931e18b92c75d1cdeafa365609c565e4e8c253d393835cb82d98e","other":"08e5a268f397385c69a7fec855ae4d889cfa98afef5b7c09fc4841e3f8894ad8","up":true},{"one":"bdc5de01276157a0f3fc43a9cc3b41b2cacc8479118b75aec4ba9b2b7fa86d5e","other":"bea10868d5da506c1801de845c148c2f09761893113ac913fe66674a8f43c178","up":true},{"one":"cdb13873ac058861f295ebca5d958bf2bb793e3f9e274cf5a73a633425a9276f","other":"c272b12f4020ae5b20e3d29cd09de03fa0088e3eeb5f07aa7728b29a3e90e687","up":true},{"one":"d9cf19895e015cb534d915aed83c0d26bf40a11244027812e17c3bec6e645a8e","other":"f2b49a2247c9c5e8f6f755834a37fe5c17f208f994878e14b7001e404f52e125","up":true},{"one":"36b93656cab02213fa76124af6251109356abc5e0ae5dd1e203c6a013e014548","other":"298ae5d173c5360bc9ad5b492ed35de3b6e0cae868a34bfe6311a8ba5ea9877e","up":true},{"one":"9f0e2bf8a962156c9e0a83c3d42ad3dc5ac5c3e508f24200bfb151aad4e395ff","other":"397a0a0e9fadcb571acd8981f5bfe8e059e707e0feae8a9c4c6bfe87bd39e66a","up":true},{"one":"07f5d094a4b22e73cdd6c85452b3d928da9b4b16873824759cb7e8a622417fd5","other":"05949ec1a582fa70cab95c59e7c0d315583bf9fc320c60c35268931f21e90853","up":true},{"one":"035f15499cdb0f079b3e358ad54a6122681442a5293c3ae2fdf6c527004b36d2","other":"0d1c35c6ea485cb33857b790ee262f974cf0d54cf8ce3003f8308ac2e87c2c25","up":true},{"one":"3b020c84fb60f59779324d451d9770d683e08133bbaa2d5762f61b8fd4b8d9fd","other":"3cabd3a567fc4e6f8da66eb35d938fe1e9a7f2bdd2d36c4dc2d0e0e9149f5e56","up":true},{"one":"837f0993f6374039a5ad4472d6313e647a4c5db4583bd27ccfa98d3448a17731","other":"885427318634c458a3050f2f26eb52454a75cea4a1263b9ed55e6eb899743854","up":true},{"one":"59876e7ff9e92243856dad23126e1d38d9a5ddae79772ed1b2bdb91f33a4a4b5","other":"4a95d49f58057b039b55a34f67a348c052f61770065e41243ff055efc570a935","up":true},{"one":"1070df5e904e3865085b0319a81761e59146494c689e7567efe7465fc819ae8b","other":"a742e8502c619703ce87890110f908bde32b59dc61d77a247759e5d0056e0c94","up":true},{"one":"ef99b6cdc05345a1ee82267890e3ccaeef1f2bd2fe7ae8b02b6b20b9a5ef85bb","other":"d700d96de1193456dc0bcf492c7c11b0951062974af2f7f47b8c901b17c23165","up":true},{"one":"c6a8220726243cceaa6f2cebdac857a05efe721323f0a064c7f85a8340d3da96","other":"cd6c8b42a0b092f41e6925577c9de7d1bea17231bcb3d08f3d3cce9c6fdcf22d","up":true},{"one":"2c85f5361b2d5abcf799de50fe58b1ed2006ea18f75823748c33eb7e95b1cc39","other":"26ab9c813822dbb4f1a230cd8e99e8ab280b242747deb55fdf93d160906ef331","up":true},{"one":"a5053958f0cefcff1826bf02525fda98c4dc954cc38690f3c43ecbf0b2ad57af","other":"a5ac04d53b569e418ef5007961431155f2c226ee10157b30af71ea4836b08089","up":true},{"one":"8006b080c78a0ab54fa1be75a939bee2334322fded6c3563de1596b17c36172c","other":"8402bd62282811ed236b2fa1f0d41ad4bbe54e420ee34adc6164cfd4baf8658d","up":true},{"one":"9464ad8da1a5effdc0351742dfffae941ffd9fab469637b2491caece53c57dc8","other":"d95965e449dd4069876384cf4b34f986731e255a7948f0a862d229b1dddbc502","up":true},{"one":"dad08999cd2edc33cfdc59ea34c8adcd6a34eaa15f2e85b0622e9848b215c1d5","other":"d9cf19895e015cb534d915aed83c0d26bf40a11244027812e17c3bec6e645a8e","up":true},{"one":"3c5b2e125020c80e3674df9cac34de4d8f3a94ee02556fb557921b6d5498b933","other":"2c85f5361b2d5abcf799de50fe58b1ed2006ea18f75823748c33eb7e95b1cc39","up":true},{"one":"ed424d24d702520bf7cb5f6babbdc43a078435fb4a9884ed82a93d642839e127","other":"f8ff7440d6f4abb1c89496336843741ed53a544cedeeed71d8ebe0b08698438d","up":true},{"one":"025de1d2ec529d3a7da302eef0f8c54996616d40c940c0956d470ffc2a007f33","other":"031450ec20f353435b429b5fa64f616d07c9d586afabc7a2772e05ad5c88bf50","up":true},{"one":"046ca54165f0dd4d62fd7d8ee9e97c655db3d35f5452a0ccb0dffc79c047978c","other":"56635699bd3bc78193adbdb8e8b7c2c91dab4140fdaa506fea2300ee86c4ba81","up":true},{"one":"f305273a7d08e72f69b0b153855e822f252cbbf34a18f305134eed9d1eb7b58a","other":"5c373034770e413e700b1cd03b2035f769ecd9ab8eb54d32f7b2645be1991fe5","up":true},{"one":"eebd48b367cbfe94a37c0deb274a697e628074f9560b909e66229c5c76ce68eb","other":"e64d90760cd81e4f112bbf1432e76c82fa4173fd474b988f4096ce187363fd81","up":true},{"one":"4a95d49f58057b039b55a34f67a348c052f61770065e41243ff055efc570a935","other":"2a507f5cb921137a7225c9c4988a8514af0f7e3c442cb8bf2bb612dc522a7daf","up":true},{"one":"d408bb6f7af1590e1f162ce02cc016b1b86ede29851caa32434212ffa2a377c8","other":"ec90a22f41ee659d5759a497946ac2991c916f00fe7caeeeb0908f3af1fe60b6","up":true},{"one":"f215bc09268e60ebbec76f743bebd09d7e72d4cbeedc0b9d3417bb4a2ef42935","other":"fc3911383f74a982f6af8ab95a63426b56117d45f153b3c1441459d9191daaff","up":true},{"one":"553824ef701d3cd0191ae3a67de564ed0cf553e74bd60ed9de321f9302732ba6","other":"5c373034770e413e700b1cd03b2035f769ecd9ab8eb54d32f7b2645be1991fe5","up":true},{"one":"b659418885032905ea20ad47d70470e403e7e407e0e9ebf9277f9a2d81ec121c","other":"8358a74fc8d8e39ccc40b4d3a212b7a69a6a8f6afc25cff2c9c7b44bbaf9ec82","up":true},{"one":"67585dfd87a005bae9bffc2cccb83c69537247c74886b4fa52287f46c796bcb6","other":"679554b410e415cfcdf1b14ef87759269b2bcaf07f4541122977db3a40091da2","up":true},{"one":"ab3ff955033c0a2615932faf85fd20090b9121c7edcc8e6f7ce4c4fde0a96b8a","other":"eebd48b367cbfe94a37c0deb274a697e628074f9560b909e66229c5c76ce68eb","up":true},{"one":"c9c302de4afe7b4dcbb6f3e366ce747083f9dcd7d5c6a01b939da5cdc6ccc874","other":"ec90a22f41ee659d5759a497946ac2991c916f00fe7caeeeb0908f3af1fe60b6","up":true},{"one":"a7a856a43293aa3004848a86f187e09343bd605e1a93e853a6f6b6b1031bd667","other":"a32749dc4e134a4fbb038618c58a7c05bbbaa06f1436de3754341af86402581b","up":true},{"one":"951877b34ee1535b5059c49beb03e8960ff9c12b694ef64708c77c30ff1dc706","other":"8b4318f86ad47976321af97bfbf95cd0a3b0aa22447aeb0611ed1a9bf1e6a4bf","up":true},{"one":"f9ded7b83e473e71be2fc0101d574c44521c96f77f9f84a384785a3af6b1093d","other":"fc514c43c4eb5c62798458da5d622e9248a6e530e4288cd902019aa05c4374d8","up":true},{"one":"bbafac5ba5915db3c80e28b249cad260b9b5dad1f728063c48fa8f61d7556e17","other":"9f7d72b7d9843872904b841e421985082428fba5010db27dd871ed76630a1e1d","up":true},{"one":"14849f811af20ce19fb29417d20c15fc16da1e45aebdf795a2c6ccb671e4bdac","other":"140dd212f2b193ee6a9d7fc14f7da321c7ef6fd367fb4f194924fd0ad5d135cc","up":true},{"one":"447a411c80fbd422bfa0c358d3f2a1fe6256c05e35acc6350958dfbe62cd5b9b","other":"4b79e83186f2ab05932eaa99982a2e53373b83780e32d224d15cb2c85462451f","up":true},{"one":"cf52b3fc82ec24c3e9b40488d7c5f7ac8af731d159a103619bee932ec74d5e92","other":"d3e913cf4a7dabfb5699131b65e533a40adb46ea37e0ed4ce9433f99015986ef","up":true},{"one":"c190f9d08c78ed6dffadaef36e77fe6aa96099e4453753b0cfc8ec542fa96b9d","other":"c9c302de4afe7b4dcbb6f3e366ce747083f9dcd7d5c6a01b939da5cdc6ccc874","up":true},{"one":"26acc3c373c29150af30bbc9264d0c44c7c606ff7377399ddf844635e97afcfa","other":"1bd588263274543729d54529ae9e9bf4596db40649a1c2a3f73168d818f34b62","up":true},{"one":"93c0e1adf23fdf1623359eb88c517bc521d5a26325554df890cc04c1fa17a5df","other":"eb686a686fd70e41659cc69ec0db53d1512dfec238918afd0a515d8ce177d4d9","up":true},{"one":"f6c028d6a2b6408e90169151f4519b561ed183bd8925ed9a1702806f397666e7","other":"feb3bc17ee7369a4fa9889d9250fed3c1257c70916871996e6eabd374dd8dc2e","up":true},{"one":"b78fd21c063006e2e033d1d00fc21e1ad7ad7951bb5621cec9b56639745d65f9","other":"be68267d77fb52424227267c665ca1193a010334cac057338aca77b49a4b94da","up":true},{"one":"398038811c1c7402fe2e6994c9ce2f15c8166b8e99f379feaaed66ac87702062","other":"1bd588263274543729d54529ae9e9bf4596db40649a1c2a3f73168d818f34b62","up":true},{"one":"4d381014783980b2f77f0d71160ad9e9d84672b576f4435ccdbae12752350c1c","other":"482ec3dc05460579ea9bce87677bd3d9a1930e801fabeba607b8ab6b8729ff15","up":true},{"one":"7049e92a396311fbf2f4a55bb5bd2fe3f7bb3c1a63f41bb88eb800edd45ac6e5","other":"6c0142984d629ae6995894de9e7e5eb8d3fe45e1641d7ebd63959d2e61548ba3","up":true},{"one":"feb3bc17ee7369a4fa9889d9250fed3c1257c70916871996e6eabd374dd8dc2e","other":"ddb8be472c3d48dc4d3d112448e6c0c4a826a18af3f3b53fdfef8cd31053c75f","up":true},{"one":"a8f49e87156fda5510897601689ce968d77032134c523634916b96de16366f9e","other":"fa240411bc4f3e44dfca3faedd112c7743a67b522a910bc99696ef0b31732ee2","up":true},{"one":"5ff09c6859736aad7a82a3bfb3f1a1a8b3c0d58f831863540d9c3013dd35745e","other":"43d43e9ebcbceb4830fc1d2d5024650b90698306bbd2c4d0b4841a1a8fd09c93","up":true},{"one":"f1ed9d45622ff974a1e396cd878b2deb89e31aa5d08da773423f292ae8dbcbb6","other":"a1c85ee75edb807a01f4ce930086c948918aade324752609b078c28991c04e86","up":true},{"one":"43c9e1571c460cb9f599fa8ed79ddd0f9c3a21fd2fa455e0603109c55012f76b","other":"6dd3ac0fd9a04a2ce75875c683d135e52eaa1670cb55e78711620712e60fde47","up":true},{"one":"834f14e9f325482adef62651ddf3685690dd5ebdd18014f2bd266b2143c290ff","other":"8cc3fb39009d0adc26fca1e2ee96822d168d4debc379fd516c15d4b4a1624231","up":true},{"one":"08bd1e049859b4a7c8078ca9741fe3daa668b9fe478da06d1a435cd5566b3e11","other":"031450ec20f353435b429b5fa64f616d07c9d586afabc7a2772e05ad5c88bf50","up":true},{"one":"1bd588263274543729d54529ae9e9bf4596db40649a1c2a3f73168d818f34b62","other":"447cdbf1ff462aa67d6a46085b1a84fdc495a4142ab174c8e69b271b09732b4d","up":true},{"one":"5bd8faf93bcad07006e9426b45f5cc599f1963ab791deac4ff63d6739cd62a17","other":"56635699bd3bc78193adbdb8e8b7c2c91dab4140fdaa506fea2300ee86c4ba81","up":true},{"one":"e2d36f335d90ad63148db8e353a78a30d8d9c0abe107be2cf8685f6a01ce74b9","other":"eb686a686fd70e41659cc69ec0db53d1512dfec238918afd0a515d8ce177d4d9","up":true},{"one":"435d721a568eb906a03c69dbd71337251a550521a4004ab5d4a7deb6f317061a","other":"5d82a418629cfbe7c57105309319ad695a198626fe3571de213a12ddf62f7308","up":true},{"one":"837f0993f6374039a5ad4472d6313e647a4c5db4583bd27ccfa98d3448a17731","other":"be68267d77fb52424227267c665ca1193a010334cac057338aca77b49a4b94da","up":true},{"one":"c8ea4177420785926e0929701f5e74c744920386f2a43b89d83c8281106cb95e","other":"f1ed9d45622ff974a1e396cd878b2deb89e31aa5d08da773423f292ae8dbcbb6","up":true},{"one":"07f5d094a4b22e73cdd6c85452b3d928da9b4b16873824759cb7e8a622417fd5","other":"1049d321a450726cf39d1d7cea1c108be3bec137a644b62cdc73a853f5a5a22b","up":true},{"one":"9b8e6bb3a7fe4dc65ac97404e546d8b777d068c94bc2355f4f1a510ad6c11905","other":"a32749dc4e134a4fbb038618c58a7c05bbbaa06f1436de3754341af86402581b","up":true},{"one":"8358a74fc8d8e39ccc40b4d3a212b7a69a6a8f6afc25cff2c9c7b44bbaf9ec82","other":"8b4318f86ad47976321af97bfbf95cd0a3b0aa22447aeb0611ed1a9bf1e6a4bf","up":true},{"one":"244c3c954ac612e51d4945ab9b77f0b4a3983285e8add7921777e0c45a1bf338","other":"0e80db9dfa8ce29bedfb2de031622bef8829bee52771322b6a7efb47afe540e7","up":true},{"one":"da36d1df95a158b0d3f9e7407d663a6b611dde0a77f00a584b97a939ab6a00de","other":"d3022a46956e75bca85ba89d97b694a3a64f03ccc2d881ed0cd687d43d486925","up":true},{"one":"a606c79a018a6535375d851fcc82c42cc7c952720aa120434cedccf4a4be1f59","other":"a742e8502c619703ce87890110f908bde32b59dc61d77a247759e5d0056e0c94","up":true},{"one":"6dd3ac0fd9a04a2ce75875c683d135e52eaa1670cb55e78711620712e60fde47","other":"5d82a418629cfbe7c57105309319ad695a198626fe3571de213a12ddf62f7308","up":true},{"one":"bea10868d5da506c1801de845c148c2f09761893113ac913fe66674a8f43c178","other":"bbafac5ba5915db3c80e28b249cad260b9b5dad1f728063c48fa8f61d7556e17","up":true},{"one":"9f0e2bf8a962156c9e0a83c3d42ad3dc5ac5c3e508f24200bfb151aad4e395ff","other":"398038811c1c7402fe2e6994c9ce2f15c8166b8e99f379feaaed66ac87702062","up":true},{"one":"86d6f68ec0b8e1b3406943787f918bee74dd1827998bdb13ece8f690da2d296a","other":"a0c88ba70599b0e72c18fa6aedd14d607cca3e9a49a5d50165d084e70328c2dd","up":true},{"one":"67909bdcaef2330ef120e524c76e1e382b474f3332d86f65282028e051f34c75","other":"741a854ae299df49a738725bc58abe614e5e4302ffecd8320bbede8412d160c0","up":true},{"one":"e09f98114da64e7547b351637190f6621a1f75568cfa9960980fc77618f8855b","other":"e0a0ba7e7e89a7af805e24abde1a5a5b489ba197585051a8755e8c2345c3d57b","up":true},{"one":"8ea2c8acc111f38d5b4a5ed60252ee83f312d0f8359265d5b9266d54735052fe","other":"9464ad8da1a5effdc0351742dfffae941ffd9fab469637b2491caece53c57dc8","up":true},{"one":"0e2b48558ce2af1fbfee38a557d56072e3091cfcaee8d7847c7c9dcf7bef9bfa","other":"2c8042517dfeaa01586e91e491dd4154fb24c0d84fedb0404b9d5136f60da1d9","up":true},{"one":"80735a728720bba0ac08daaccd093370d672a8f9a50845ad78ccd6cf8686c39f","other":"a32749dc4e134a4fbb038618c58a7c05bbbaa06f1436de3754341af86402581b","up":true},{"one":"1b1dc3f9312df141855c545dd16aee325f9a609230ec6165bdbbb07d0c0862f6","other":"3938e6b2c095084dc9975a3e8649133557495d34ac6df874c6d929266e3ffe6f","up":true},{"one":"a8b58013ff911871d1aa6c2bbea6c2e6ef9b00b87b80a41dc04724ad0488e2ff","other":"9464ad8da1a5effdc0351742dfffae941ffd9fab469637b2491caece53c57dc8","up":true},{"one":"ef99b6cdc05345a1ee82267890e3ccaeef1f2bd2fe7ae8b02b6b20b9a5ef85bb","other":"ec90a22f41ee659d5759a497946ac2991c916f00fe7caeeeb0908f3af1fe60b6","up":true},{"one":"8cc3fb39009d0adc26fca1e2ee96822d168d4debc379fd516c15d4b4a1624231","other":"9c8e1f23f260c5a46b0001572675b19e5293ca65e7fdfc131c07612e9c4072fa","up":true},{"one":"9959385385aade728d3f5763806596222bc1e7b9946c2c92407943d080b32f8d","other":"955da15edae50a4c68bc8c579b9799d55f41b7c2a6178f645f79d772e0116662","up":true},{"one":"ab3ff955033c0a2615932faf85fd20090b9121c7edcc8e6f7ce4c4fde0a96b8a","other":"a2e6c900511768c8c9947ab0fa2e73975cf2a4cec7fd15217abdba25c329317e","up":true},{"one":"eff2450bea797ff66d93e7c1c1b0977cddf3abba64bfa51bcc509d728569e2fa","other":"eb686a686fd70e41659cc69ec0db53d1512dfec238918afd0a515d8ce177d4d9","up":true},{"one":"08e5a268f397385c69a7fec855ae4d889cfa98afef5b7c09fc4841e3f8894ad8","other":"05949ec1a582fa70cab95c59e7c0d315583bf9fc320c60c35268931f21e90853","up":true},{"one":"1fd0192df1fbf33771ca575afbb4e27c6541cce4a3cff2dfc1f2c085e7fab79e","other":"36b93656cab02213fa76124af6251109356abc5e0ae5dd1e203c6a013e014548","up":true},{"one":"b659418885032905ea20ad47d70470e403e7e407e0e9ebf9277f9a2d81ec121c","other":"bdc5de01276157a0f3fc43a9cc3b41b2cacc8479118b75aec4ba9b2b7fa86d5e","up":true},{"one":"87a337622455ae65daf3ab2555cee8985e9aa14bac245545d985296060e4a8de","other":"8402bd62282811ed236b2fa1f0d41ad4bbe54e420ee34adc6164cfd4baf8658d","up":true},{"one":"14849f811af20ce19fb29417d20c15fc16da1e45aebdf795a2c6ccb671e4bdac","other":"1dc0ef1ce68dc681298177bde808af514efa52a5ad38c9cd2bd61968cdf19cfb","up":true},{"one":"5ac0d00b8d647dec62d26e1a689fd05b8b7a1a79ab8c43493bd6d7d209816df1","other":"43c9e1571c460cb9f599fa8ed79ddd0f9c3a21fd2fa455e0603109c55012f76b","up":true},{"one":"34118166845c185d15c286b7e5433539ee98ed634baabd534d57369fd5f7c681","other":"094256812084c6052a2604149aa3aba2379c483bf4ec25162f6b43934942775a","up":true},{"one":"e64d90760cd81e4f112bbf1432e76c82fa4173fd474b988f4096ce187363fd81","other":"a0c88ba70599b0e72c18fa6aedd14d607cca3e9a49a5d50165d084e70328c2dd","up":true},{"one":"1070df5e904e3865085b0319a81761e59146494c689e7567efe7465fc819ae8b","other":"1dc0ef1ce68dc681298177bde808af514efa52a5ad38c9cd2bd61968cdf19cfb","up":true},{"one":"178401ec8d01a0a4f551d23e880a8e8a4eb87773565363843d51cf52660b1211","other":"3c5b2e125020c80e3674df9cac34de4d8f3a94ee02556fb557921b6d5498b933","up":true},{"one":"19ea0a685fc4edd298b736dc7a778c9ec4362de378876911105fa9ba2ce90204","other":"0e80db9dfa8ce29bedfb2de031622bef8829bee52771322b6a7efb47afe540e7","up":true},{"one":"398038811c1c7402fe2e6994c9ce2f15c8166b8e99f379feaaed66ac87702062","other":"3f31ecaffaa6311c82c9a575bbc38d6bcb16630ac87e19d1853a64aa96c9dcde","up":true},{"one":"b4a1b687fbdb754fd689e26f0870a7dcab5d76190c06f3ea2ea1e198f8aa5ab2","other":"a742e8502c619703ce87890110f908bde32b59dc61d77a247759e5d0056e0c94","up":true},{"one":"f215bc09268e60ebbec76f743bebd09d7e72d4cbeedc0b9d3417bb4a2ef42935","other":"eb686a686fd70e41659cc69ec0db53d1512dfec238918afd0a515d8ce177d4d9","up":true},{"one":"48b850974575ca57a3cc5f9a4cf5aafd8688cb32b993f69983ece63258ff876e","other":"44adaabf9c46608a374ed816d3c40c63b6645f4f6e033a76431bc8f88713eb41","up":true},{"one":"26acc3c373c29150af30bbc9264d0c44c7c606ff7377399ddf844635e97afcfa","other":"9f0e2bf8a962156c9e0a83c3d42ad3dc5ac5c3e508f24200bfb151aad4e395ff","up":true},{"one":"ab719e60a77ba5253f1690c920df9dd9f3a62071e9cce9d62e0001a522b3409e","other":"ba911175d3aa3fcc266e2a5aa32fb706208b8a9b5021a5f37c0b85f547eb375d","up":true},{"one":"012ba278d582691241875c4c14ead91fff3983e190df7d9b43ade384e84c11fb","other":"08e5a268f397385c69a7fec855ae4d889cfa98afef5b7c09fc4841e3f8894ad8","up":true},{"one":"1dec77c2f4caf053c2d0524ae34a2d970bf4743a0d009d8fc543077ddfdfe3d0","other":"14849f811af20ce19fb29417d20c15fc16da1e45aebdf795a2c6ccb671e4bdac","up":true},{"one":"435d721a568eb906a03c69dbd71337251a550521a4004ab5d4a7deb6f317061a","other":"4d381014783980b2f77f0d71160ad9e9d84672b576f4435ccdbae12752350c1c","up":true},{"one":"5bd8faf93bcad07006e9426b45f5cc599f1963ab791deac4ff63d6739cd62a17","other":"3728152c88f1e5e61f6523b09e8f3bb1023b700deccdca5fcc1e6488136b0e57","up":true},{"one":"c74d801e85ac0fd8951480d107b41eddc5c92775614c4886b3f732fa3d1a791d","other":"cd6c8b42a0b092f41e6925577c9de7d1bea17231bcb3d08f3d3cce9c6fdcf22d","up":true},{"one":"56ca9dd846a58a0ffa7b49a88aad559a338ba535a6f738468b8f146c97890cb2","other":"43c9e1571c460cb9f599fa8ed79ddd0f9c3a21fd2fa455e0603109c55012f76b","up":true},{"one":"9257dc934dfbf17473b70cb85333c6fab67ee9b6228a646576c4f57253f1004e","other":"8ea2c8acc111f38d5b4a5ed60252ee83f312d0f8359265d5b9266d54735052fe","up":true},{"one":"36b93656cab02213fa76124af6251109356abc5e0ae5dd1e203c6a013e014548","other":"2a507f5cb921137a7225c9c4988a8514af0f7e3c442cb8bf2bb612dc522a7daf","up":true},{"one":"b78fd21c063006e2e033d1d00fc21e1ad7ad7951bb5621cec9b56639745d65f9","other":"f645aab9cb2bd2709998b38e5789c9c5f68d40765e6cbd93b92e6383eb671dba","up":true},{"one":"7ce7fec833a2e8c7720fcc97f820f2ca2aca85388210f887c3efe78b020766e7","other":"6c0142984d629ae6995894de9e7e5eb8d3fe45e1641d7ebd63959d2e61548ba3","up":true},{"one":"1bd588263274543729d54529ae9e9bf4596db40649a1c2a3f73168d818f34b62","other":"140dd212f2b193ee6a9d7fc14f7da321c7ef6fd367fb4f194924fd0ad5d135cc","up":true},{"one":"aaf051a087a92f874a3f6c7923015e4cffb4bb3ef381c977fd902f21e841d0f4","other":"a3309f8b8bba4d8fbd7c6193d7671cb907b94e71155ef6138e0248682ff00e58","up":true},{"one":"5814be13c8550b9a5a83d08e7af6022002a8fdaa38ba6c2c30be58099a9f7744","other":"5ac0d00b8d647dec62d26e1a689fd05b8b7a1a79ab8c43493bd6d7d209816df1","up":true},{"one":"4cece9bc134bc2b09400c9f7f8a4df9270d2fe3c077c5e441fffc911fcf6f42e","other":"52a8747e4ea35f6f50c72d7c481616f68a5e4396248332b8ff69d3a772de49ac","up":true},{"one":"305162c472c71ddef2320b138102b67d1ce2b8bba79e2e587fc80e085c88e547","other":"2a507f5cb921137a7225c9c4988a8514af0f7e3c442cb8bf2bb612dc522a7daf","up":true},{"one":"d700d96de1193456dc0bcf492c7c11b0951062974af2f7f47b8c901b17c23165","other":"b8e1a8622c256ef29acd52df7b3ace50820fb1a147716165ff862fdc973a48cd","up":true},{"one":"cdb13873ac058861f295ebca5d958bf2bb793e3f9e274cf5a73a633425a9276f","other":"c2d00c7d960174c0934129fdcec63525bfa728f78fb70b7c52036b772d6297ad","up":true},{"one":"482ec3dc05460579ea9bce87677bd3d9a1930e801fabeba607b8ab6b8729ff15","other":"56635699bd3bc78193adbdb8e8b7c2c91dab4140fdaa506fea2300ee86c4ba81","up":true},{"one":"6d3c6db15900f2596286f81cc0664d2c8291ead5bad2aa35bad515af088a2e48","other":"60c5647aed152609979366fb33dc8b28fc60736098ff68d232415889b43dfa58","up":true},{"one":"6b4ee1b73942ced78f97c0d0e221209933e63ae7353bb9ab3d37ac4127592e86","other":"7e47a2f82984a600c8583605a91d5cb8f2d9a18961845e9c422edd78e20ac3a3","up":true},{"one":"f7561cb6740e17ec7c7d17068251b2c951d954c77804aa5af60464e9c3964e57","other":"5c373034770e413e700b1cd03b2035f769ecd9ab8eb54d32f7b2645be1991fe5","up":true},{"one":"3b020c84fb60f59779324d451d9770d683e08133bbaa2d5762f61b8fd4b8d9fd","other":"138dbc1662c4ce9b2b30ef5035914cc70465666fe18f313318e662d13f099621","up":true},{"one":"5ff09c6859736aad7a82a3bfb3f1a1a8b3c0d58f831863540d9c3013dd35745e","other":"43c9e1571c460cb9f599fa8ed79ddd0f9c3a21fd2fa455e0603109c55012f76b","up":true},{"one":"c8ea4177420785926e0929701f5e74c744920386f2a43b89d83c8281106cb95e","other":"ff75b19017c84128f38dec4f63e1f247a5691dc0fae186e667afedb5fe9d2c80","up":true},{"one":"68cbc4a5313080d5dca8ad34e8bf52a6144e0ff8ef3f795d7ae9d5f644fe2042","other":"7895b2cb97b473f8893cc70a4421e0f8be1c033b27cd730fa13438b7a8f3fcb5","up":true},{"one":"a606c79a018a6535375d851fcc82c42cc7c952720aa120434cedccf4a4be1f59","other":"885427318634c458a3050f2f26eb52454a75cea4a1263b9ed55e6eb899743854","up":true},{"one":"019109311d4888497aa194cce4a89b5ef243421cf0e7e7bb9115d086e1a1f7d7","other":"031450ec20f353435b429b5fa64f616d07c9d586afabc7a2772e05ad5c88bf50","up":true},{"one":"1dc0ef1ce68dc681298177bde808af514efa52a5ad38c9cd2bd61968cdf19cfb","other":"08f84878e44fed2adb4b2685b9f293dc3c73d5f9bc1c474870d943ec2ae73dbe","up":true},{"one":"51440ab47fc5076c00cad16a542b846c26b3281ecea4dbca795ae9b80183ec90","other":"5bd8faf93bcad07006e9426b45f5cc599f1963ab791deac4ff63d6739cd62a17","up":true},{"one":"a8ff8d69dcb36462d1116dafa5e3d0c7237bf65dbece482a316862c8d66e35b6","other":"834f14e9f325482adef62651ddf3685690dd5ebdd18014f2bd266b2143c290ff","up":true},{"one":"7049e92a396311fbf2f4a55bb5bd2fe3f7bb3c1a63f41bb88eb800edd45ac6e5","other":"679554b410e415cfcdf1b14ef87759269b2bcaf07f4541122977db3a40091da2","up":true},{"one":"5ac0d00b8d647dec62d26e1a689fd05b8b7a1a79ab8c43493bd6d7d209816df1","other":"5a8b84df651871fce72d11cb1c26c87ae4a0cc6b4c274d37e70532c94f27288e","up":true},{"one":"19ea0a685fc4edd298b736dc7a778c9ec4362de378876911105fa9ba2ce90204","other":"68cbc4a5313080d5dca8ad34e8bf52a6144e0ff8ef3f795d7ae9d5f644fe2042","up":true},{"one":"ab3ff955033c0a2615932faf85fd20090b9121c7edcc8e6f7ce4c4fde0a96b8a","other":"be68267d77fb52424227267c665ca1193a010334cac057338aca77b49a4b94da","up":true},{"one":"8cc3fb39009d0adc26fca1e2ee96822d168d4debc379fd516c15d4b4a1624231","other":"be68267d77fb52424227267c665ca1193a010334cac057338aca77b49a4b94da","up":true},{"one":"f215bc09268e60ebbec76f743bebd09d7e72d4cbeedc0b9d3417bb4a2ef42935","other":"5c373034770e413e700b1cd03b2035f769ecd9ab8eb54d32f7b2645be1991fe5","up":true},{"one":"f305273a7d08e72f69b0b153855e822f252cbbf34a18f305134eed9d1eb7b58a","other":"ec90a22f41ee659d5759a497946ac2991c916f00fe7caeeeb0908f3af1fe60b6","up":true},{"one":"32ff1969d90aaa5a8ed2260968a8e2bac2d1cae597c906f90495f1dc5de7f8d3","other":"2c8042517dfeaa01586e91e491dd4154fb24c0d84fedb0404b9d5136f60da1d9","up":true},{"one":"c8c8a93779ec4d9ac40925e8208478a00ee27fc220ddd73d8774cf6bfa255c46","other":"dbd4d90e3342ef837b8ecf5c6e490f7c409f419cf36b77162a87cb2cfb8ae33c","up":true},{"one":"ef99b6cdc05345a1ee82267890e3ccaeef1f2bd2fe7ae8b02b6b20b9a5ef85bb","other":"d3e913cf4a7dabfb5699131b65e533a40adb46ea37e0ed4ce9433f99015986ef","up":true},{"one":"834f14e9f325482adef62651ddf3685690dd5ebdd18014f2bd266b2143c290ff","other":"8e282b0f27d4fa56fe14cfeb69fac5a53e3d882c7778eb190653e2eab7c93fd2","up":true},{"one":"59876e7ff9e92243856dad23126e1d38d9a5ddae79772ed1b2bdb91f33a4a4b5","other":"48b850974575ca57a3cc5f9a4cf5aafd8688cb32b993f69983ece63258ff876e","up":true},{"one":"a1c85ee75edb807a01f4ce930086c948918aade324752609b078c28991c04e86","other":"80735a728720bba0ac08daaccd093370d672a8f9a50845ad78ccd6cf8686c39f","up":true},{"one":"8402bd62282811ed236b2fa1f0d41ad4bbe54e420ee34adc6164cfd4baf8658d","other":"9c8e1f23f260c5a46b0001572675b19e5293ca65e7fdfc131c07612e9c4072fa","up":true},{"one":"7850f5ee5048959559b3af0f95689669b250fc3aa58bcc9544dca61ca9c9769c","other":"6dd3ac0fd9a04a2ce75875c683d135e52eaa1670cb55e78711620712e60fde47","up":true},{"one":"56ca9dd846a58a0ffa7b49a88aad559a338ba535a6f738468b8f146c97890cb2","other":"5a8b84df651871fce72d11cb1c26c87ae4a0cc6b4c274d37e70532c94f27288e","up":true},{"one":"81a5a07f92f813e85b501b0028e1caa6e6a6c7efa5195ecb693cd2d91d5132a0","other":"807416cc70f02d481a188027f7932b48e8f7b5e8258f7e9623f3f6e2985d8f6a","up":true},{"one":"096a8302b6f369c28ed9d47719a507ead8a3cc1ca4fa1e32318b7f97873955fe","other":"05949ec1a582fa70cab95c59e7c0d315583bf9fc320c60c35268931f21e90853","up":true},{"one":"e8676d17966625c4fdac6bd9437981a0cf869c8b0010812edf0c79805e0e1ff1","other":"e6812448728b4bda5962adceb1707b29f661d3d1a6b2ccd5f8183c9a1f4d01b6","up":true},{"one":"0cfc7309afabceeb7d248714e972cf3987205324f5ab8d048d17bea5dc87369d","other":"d3022a46956e75bca85ba89d97b694a3a64f03ccc2d881ed0cd687d43d486925","up":true},{"one":"86d6f68ec0b8e1b3406943787f918bee74dd1827998bdb13ece8f690da2d296a","other":"a6165a4b02d58be116892982c0ed3d49d86fec0e9f436a516b61868331ed853f","up":true},{"one":"07f5d094a4b22e73cdd6c85452b3d928da9b4b16873824759cb7e8a622417fd5","other":"16868ec5d8f490ac73ea28b4e8fdda55ac149bb1aafb177545b54b84a5ad5367","up":true},{"one":"1addd4a9f01486212e13e43a9650b7f793617d1cb59fb8d941270d7ae55f575f","other":"194ea3e14dc5d99f98d15607dc4c405769f5a371acc22d41a62d0537d716be32","up":true},{"one":"ec90a22f41ee659d5759a497946ac2991c916f00fe7caeeeb0908f3af1fe60b6","other":"fa240411bc4f3e44dfca3faedd112c7743a67b522a910bc99696ef0b31732ee2","up":true},{"one":"d20931ce3da972fd23ea306e5c604a1fbd9417ba02654c5cdbe278fe259f75d5","other":"d3e913cf4a7dabfb5699131b65e533a40adb46ea37e0ed4ce9433f99015986ef","up":true},{"one":"398038811c1c7402fe2e6994c9ce2f15c8166b8e99f379feaaed66ac87702062","other":"305162c472c71ddef2320b138102b67d1ce2b8bba79e2e587fc80e085c88e547","up":true},{"one":"67909bdcaef2330ef120e524c76e1e382b474f3332d86f65282028e051f34c75","other":"7660828fb0c8f89201d34e6f4d61cc6ba9a30cead6e4eb8253f6cc92e1845f23","up":true},{"one":"9f0e2bf8a962156c9e0a83c3d42ad3dc5ac5c3e508f24200bfb151aad4e395ff","other":"9b8e6bb3a7fe4dc65ac97404e546d8b777d068c94bc2355f4f1a510ad6c11905","up":true},{"one":"aeb45fe10b0dbd0f72ab6a77fbf971a8f46dbcdd96c08f23279d1434b4f38b1d","other":"a6165a4b02d58be116892982c0ed3d49d86fec0e9f436a516b61868331ed853f","up":true},{"one":"138dbc1662c4ce9b2b30ef5035914cc70465666fe18f313318e662d13f099621","other":"36b93656cab02213fa76124af6251109356abc5e0ae5dd1e203c6a013e014548","up":true},{"one":"1b1dc3f9312df141855c545dd16aee325f9a609230ec6165bdbbb07d0c0862f6","other":"1049d321a450726cf39d1d7cea1c108be3bec137a644b62cdc73a853f5a5a22b","up":true},{"one":"6d5ec591af4966ba024c6b2aeb45e0aab8aa1762f9cac30ce3934da529b738e9","other":"793322608055d4873776a9a0a6c40b04379bfd2f289a8ad49a7dc456bc65f871","up":true},{"one":"7c7ca5a7522a04f62f2bebd6197a03d78f255d0175c3dfceb5d92b684365b2aa","other":"741a854ae299df49a738725bc58abe614e5e4302ffecd8320bbede8412d160c0","up":true},{"one":"60c5647aed152609979366fb33dc8b28fc60736098ff68d232415889b43dfa58","other":"6e7f1f3d65364399617a4d95fdd04f2ca9b007b2366943e7ba5acd4616a7a425","up":true},{"one":"402cf9d0bffa017ebea34ede11207f3366b3ea450c0428029129a8e8026abbe7","other":"5a26ae73eebf27f6dbec2414f1277a249e814a7a06790d7061610e5227b086f6","up":true},{"one":"52a8747e4ea35f6f50c72d7c481616f68a5e4396248332b8ff69d3a772de49ac","other":"5c7c15798e86fe794bb201614d46366ea96dc51091f5b19f149995e0d40df0a6","up":true},{"one":"1dec77c2f4caf053c2d0524ae34a2d970bf4743a0d009d8fc543077ddfdfe3d0","other":"178401ec8d01a0a4f551d23e880a8e8a4eb87773565363843d51cf52660b1211","up":true},{"one":"08f84878e44fed2adb4b2685b9f293dc3c73d5f9bc1c474870d943ec2ae73dbe","other":"09b3fa30780931e18b92c75d1cdeafa365609c565e4e8c253d393835cb82d98e","up":true},{"one":"eff2450bea797ff66d93e7c1c1b0977cddf3abba64bfa51bcc509d728569e2fa","other":"e6812448728b4bda5962adceb1707b29f661d3d1a6b2ccd5f8183c9a1f4d01b6","up":true},{"one":"30feca631f06041cb14cead384dfaa5fffa6dc34b0cee54230efbe15e56a5884","other":"012ba278d582691241875c4c14ead91fff3983e190df7d9b43ade384e84c11fb","up":true},{"one":"9464ad8da1a5effdc0351742dfffae941ffd9fab469637b2491caece53c57dc8","other":"ba911175d3aa3fcc266e2a5aa32fb706208b8a9b5021a5f37c0b85f547eb375d","up":true},{"one":"994839e5f3a5b8b23aed84fb029413124af17804b79b0263ec6bfd5aec5dad78","other":"ec90a22f41ee659d5759a497946ac2991c916f00fe7caeeeb0908f3af1fe60b6","up":true},{"one":"aaf051a087a92f874a3f6c7923015e4cffb4bb3ef381c977fd902f21e841d0f4","other":"a6165a4b02d58be116892982c0ed3d49d86fec0e9f436a516b61868331ed853f","up":true},{"one":"955da15edae50a4c68bc8c579b9799d55f41b7c2a6178f645f79d772e0116662","other":"9c21cb3e56f8ac66a7917a9ba14e58f77e998ac70c178b88b5053d9ac2777e60","up":true},{"one":"056152dd9dae85c426378d34acab8d6641da665d2f57359a27a0ff652f3f3d02","other":"16868ec5d8f490ac73ea28b4e8fdda55ac149bb1aafb177545b54b84a5ad5367","up":true},{"one":"ddb8be472c3d48dc4d3d112448e6c0c4a826a18af3f3b53fdfef8cd31053c75f","other":"fa240411bc4f3e44dfca3faedd112c7743a67b522a910bc99696ef0b31732ee2","up":true},{"one":"68cbc4a5313080d5dca8ad34e8bf52a6144e0ff8ef3f795d7ae9d5f644fe2042","other":"7850f5ee5048959559b3af0f95689669b250fc3aa58bcc9544dca61ca9c9769c","up":true},{"one":"5ac0d00b8d647dec62d26e1a689fd05b8b7a1a79ab8c43493bd6d7d209816df1","other":"0cfc7309afabceeb7d248714e972cf3987205324f5ab8d048d17bea5dc87369d","up":true},{"one":"a3309f8b8bba4d8fbd7c6193d7671cb907b94e71155ef6138e0248682ff00e58","other":"be68267d77fb52424227267c665ca1193a010334cac057338aca77b49a4b94da","up":true},{"one":"a8b58013ff911871d1aa6c2bbea6c2e6ef9b00b87b80a41dc04724ad0488e2ff","other":"93c0e1adf23fdf1623359eb88c517bc521d5a26325554df890cc04c1fa17a5df","up":true},{"one":"4d381014783980b2f77f0d71160ad9e9d84672b576f4435ccdbae12752350c1c","other":"5ff09c6859736aad7a82a3bfb3f1a1a8b3c0d58f831863540d9c3013dd35745e","up":true},{"one":"178401ec8d01a0a4f551d23e880a8e8a4eb87773565363843d51cf52660b1211","other":"1dc0ef1ce68dc681298177bde808af514efa52a5ad38c9cd2bd61968cdf19cfb","up":true},{"one":"f6c028d6a2b6408e90169151f4519b561ed183bd8925ed9a1702806f397666e7","other":"f2b49a2247c9c5e8f6f755834a37fe5c17f208f994878e14b7001e404f52e125","up":true},{"one":"447cdbf1ff462aa67d6a46085b1a84fdc495a4142ab174c8e69b271b09732b4d","other":"447a411c80fbd422bfa0c358d3f2a1fe6256c05e35acc6350958dfbe62cd5b9b","up":true},{"one":"5814be13c8550b9a5a83d08e7af6022002a8fdaa38ba6c2c30be58099a9f7744","other":"482ec3dc05460579ea9bce87677bd3d9a1930e801fabeba607b8ab6b8729ff15","up":true},{"one":"4a95d49f58057b039b55a34f67a348c052f61770065e41243ff055efc570a935","other":"2c85f5361b2d5abcf799de50fe58b1ed2006ea18f75823748c33eb7e95b1cc39","up":true},{"one":"bcf85ecf421b871fca0247a7081188a8e2c08778b88ffad16db37ef024fec0fc","other":"a7a856a43293aa3004848a86f187e09343bd605e1a93e853a6f6b6b1031bd667","up":true},{"one":"f1ed9d45622ff974a1e396cd878b2deb89e31aa5d08da773423f292ae8dbcbb6","other":"5c373034770e413e700b1cd03b2035f769ecd9ab8eb54d32f7b2645be1991fe5","up":true},{"one":"012ba278d582691241875c4c14ead91fff3983e190df7d9b43ade384e84c11fb","other":"031450ec20f353435b429b5fa64f616d07c9d586afabc7a2772e05ad5c88bf50","up":true},{"one":"2ddffddbf452f0c9268058a739f5757fb90281cbfd31bd6f760acc3392fec12a","other":"2fd2f77d76cca480ac18e9af7a462f297db168c3370b3bc0e2c04aa006c4d037","up":true},{"one":"56ca9dd846a58a0ffa7b49a88aad559a338ba535a6f738468b8f146c97890cb2","other":"4d381014783980b2f77f0d71160ad9e9d84672b576f4435ccdbae12752350c1c","up":true},{"one":"48de553e15afd3e8a46bfc3a5ba8a298158aa3d60f140d2730230af5cce8084d","other":"793322608055d4873776a9a0a6c40b04379bfd2f289a8ad49a7dc456bc65f871","up":true},{"one":"80d7e892bbb26808abb1d1530077fec6b08768c151a9f220881da3c862bae0af","other":"97daf2cbe03c80ce6c4dae39cd071dd93cb32ed245aa9aa77285e12296957ca3","up":true},{"one":"14849f811af20ce19fb29417d20c15fc16da1e45aebdf795a2c6ccb671e4bdac","other":"18e00a7e0f826a1aba3f8c0f533ed905f2eee607b697fff056ee7874d374adcd","up":true},{"one":"0cfc7309afabceeb7d248714e972cf3987205324f5ab8d048d17bea5dc87369d","other":"ddb8be472c3d48dc4d3d112448e6c0c4a826a18af3f3b53fdfef8cd31053c75f","up":true},{"one":"3c5b2e125020c80e3674df9cac34de4d8f3a94ee02556fb557921b6d5498b933","other":"3cabd3a567fc4e6f8da66eb35d938fe1e9a7f2bdd2d36c4dc2d0e0e9149f5e56","up":true},{"one":"48d79ac55f8df512af8e7d868aa40ac9b61493fa4f1b0ce0b76bf6da2eb30e78","other":"6c0142984d629ae6995894de9e7e5eb8d3fe45e1641d7ebd63959d2e61548ba3","up":true},{"one":"3938e6b2c095084dc9975a3e8649133557495d34ac6df874c6d929266e3ffe6f","other":"138dbc1662c4ce9b2b30ef5035914cc70465666fe18f313318e662d13f099621","up":true},{"one":"c2d00c7d960174c0934129fdcec63525bfa728f78fb70b7c52036b772d6297ad","other":"da36d1df95a158b0d3f9e7407d663a6b611dde0a77f00a584b97a939ab6a00de","up":true},{"one":"9ec831d97418916fd9695465e041caf27824dbb51d6ff74d6b70f3bd561e70e6","other":"9464ad8da1a5effdc0351742dfffae941ffd9fab469637b2491caece53c57dc8","up":true},{"one":"a8f49e87156fda5510897601689ce968d77032134c523634916b96de16366f9e","other":"fc514c43c4eb5c62798458da5d622e9248a6e530e4288cd902019aa05c4374d8","up":true},{"one":"e8676d17966625c4fdac6bd9437981a0cf869c8b0010812edf0c79805e0e1ff1","other":"e64d90760cd81e4f112bbf1432e76c82fa4173fd474b988f4096ce187363fd81","up":true},{"one":"c8c8a93779ec4d9ac40925e8208478a00ee27fc220ddd73d8774cf6bfa255c46","other":"c9c302de4afe7b4dcbb6f3e366ce747083f9dcd7d5c6a01b939da5cdc6ccc874","up":true},{"one":"8006b080c78a0ab54fa1be75a939bee2334322fded6c3563de1596b17c36172c","other":"807416cc70f02d481a188027f7932b48e8f7b5e8258f7e9623f3f6e2985d8f6a","up":true},{"one":"31e670638acba3d58f4c67f3ff2f3f25d769e8a5d7a7838927f4d9d169a84404","other":"2a507f5cb921137a7225c9c4988a8514af0f7e3c442cb8bf2bb612dc522a7daf","up":true},{"one":"fc514c43c4eb5c62798458da5d622e9248a6e530e4288cd902019aa05c4374d8","other":"c96146ee47ec7cd74551cf74f00213bc337d643c4327393f0e6848ecd4a0f8d3","up":true},{"one":"6b4ee1b73942ced78f97c0d0e221209933e63ae7353bb9ab3d37ac4127592e86","other":"7850f5ee5048959559b3af0f95689669b250fc3aa58bcc9544dca61ca9c9769c","up":true},{"one":"8402bd62282811ed236b2fa1f0d41ad4bbe54e420ee34adc6164cfd4baf8658d","other":"8b4318f86ad47976321af97bfbf95cd0a3b0aa22447aeb0611ed1a9bf1e6a4bf","up":true},{"one":"05949ec1a582fa70cab95c59e7c0d315583bf9fc320c60c35268931f21e90853","other":"140dd212f2b193ee6a9d7fc14f7da321c7ef6fd367fb4f194924fd0ad5d135cc","up":true},{"one":"51440ab47fc5076c00cad16a542b846c26b3281ecea4dbca795ae9b80183ec90","other":"435d721a568eb906a03c69dbd71337251a550521a4004ab5d4a7deb6f317061a","up":true},{"one":"95c0a351fb7aa6683280d159a7b808bfa63f63bff91a1c5936e973b2e5d3954f","other":"80d7e892bbb26808abb1d1530077fec6b08768c151a9f220881da3c862bae0af","up":true},{"one":"6c0142984d629ae6995894de9e7e5eb8d3fe45e1641d7ebd63959d2e61548ba3","other":"6b4ee1b73942ced78f97c0d0e221209933e63ae7353bb9ab3d37ac4127592e86","up":true},{"one":"81a5a07f92f813e85b501b0028e1caa6e6a6c7efa5195ecb693cd2d91d5132a0","other":"8b4318f86ad47976321af97bfbf95cd0a3b0aa22447aeb0611ed1a9bf1e6a4bf","up":true},{"one":"a6165a4b02d58be116892982c0ed3d49d86fec0e9f436a516b61868331ed853f","other":"9c8e1f23f260c5a46b0001572675b19e5293ca65e7fdfc131c07612e9c4072fa","up":true},{"one":"8358a74fc8d8e39ccc40b4d3a212b7a69a6a8f6afc25cff2c9c7b44bbaf9ec82","other":"bcf85ecf421b871fca0247a7081188a8e2c08778b88ffad16db37ef024fec0fc","up":true},{"one":"7049e92a396311fbf2f4a55bb5bd2fe3f7bb3c1a63f41bb88eb800edd45ac6e5","other":"7895b2cb97b473f8893cc70a4421e0f8be1c033b27cd730fa13438b7a8f3fcb5","up":true},{"one":"f9ded7b83e473e71be2fc0101d574c44521c96f77f9f84a384785a3af6b1093d","other":"d408bb6f7af1590e1f162ce02cc016b1b86ede29851caa32434212ffa2a377c8","up":true},{"one":"9f0e2bf8a962156c9e0a83c3d42ad3dc5ac5c3e508f24200bfb151aad4e395ff","other":"2c8042517dfeaa01586e91e491dd4154fb24c0d84fedb0404b9d5136f60da1d9","up":true},{"one":"4cece9bc134bc2b09400c9f7f8a4df9270d2fe3c077c5e441fffc911fcf6f42e","other":"793322608055d4873776a9a0a6c40b04379bfd2f289a8ad49a7dc456bc65f871","up":true},{"one":"16868ec5d8f490ac73ea28b4e8fdda55ac149bb1aafb177545b54b84a5ad5367","other":"5d82a418629cfbe7c57105309319ad695a198626fe3571de213a12ddf62f7308","up":true},{"one":"6e7f1f3d65364399617a4d95fdd04f2ca9b007b2366943e7ba5acd4616a7a425","other":"7e47a2f82984a600c8583605a91d5cb8f2d9a18961845e9c422edd78e20ac3a3","up":true},{"one":"08bd1e049859b4a7c8078ca9741fe3daa668b9fe478da06d1a435cd5566b3e11","other":"2a507f5cb921137a7225c9c4988a8514af0f7e3c442cb8bf2bb612dc522a7daf","up":true},{"one":"bea10868d5da506c1801de845c148c2f09761893113ac913fe66674a8f43c178","other":"ba911175d3aa3fcc266e2a5aa32fb706208b8a9b5021a5f37c0b85f547eb375d","up":true},{"one":"b5eab4869b4cb65bdc1e5cab45c03016d202f9f5b668be50066451cfcf9ef299","other":"bea10868d5da506c1801de845c148c2f09761893113ac913fe66674a8f43c178","up":true},{"one":"c53417f008e4550e1c4cb9a3e2955b3af6403e059b7b4b4c33869d9ed4a580a5","other":"26ab9c813822dbb4f1a230cd8e99e8ab280b242747deb55fdf93d160906ef331","up":true},{"one":"bfc711793830779f49aa59bc6f7a205ab4e6eae7abfdafbf3bb5a1163a778ab2","other":"aceee75a260d45252060fe971eabd4bde25f912db4a3c6e47f4a09572fe01697","up":true},{"one":"a5ac04d53b569e418ef5007961431155f2c226ee10157b30af71ea4836b08089","other":"a2a163ce2cb092b411c994cc5d5ef555d539d2dcf4e7e1aeb528d2216dc481e5","up":true},{"one":"2e65d05648b798fafbc9bb582c05e6f8f891131260e8c90ca725ddcbc823f315","other":"2fd2f77d76cca480ac18e9af7a462f297db168c3370b3bc0e2c04aa006c4d037","up":true},{"one":"994839e5f3a5b8b23aed84fb029413124af17804b79b0263ec6bfd5aec5dad78","other":"f2b49a2247c9c5e8f6f755834a37fe5c17f208f994878e14b7001e404f52e125","up":true},{"one":"46bfa8bea56b0be1abfa5ad3561bb6bf49ed6695d83ee2b2c192c5a0408347cf","other":"4a95d49f58057b039b55a34f67a348c052f61770065e41243ff055efc570a935","up":true},{"one":"24f80c437be45898e594f821bba0f5c62e0c9a0c720118e362ee6f78410612bd","other":"1049d321a450726cf39d1d7cea1c108be3bec137a644b62cdc73a853f5a5a22b","up":true},{"one":"bdc5de01276157a0f3fc43a9cc3b41b2cacc8479118b75aec4ba9b2b7fa86d5e","other":"bcf85ecf421b871fca0247a7081188a8e2c08778b88ffad16db37ef024fec0fc","up":true},{"one":"1b1dc3f9312df141855c545dd16aee325f9a609230ec6165bdbbb07d0c0862f6","other":"398038811c1c7402fe2e6994c9ce2f15c8166b8e99f379feaaed66ac87702062","up":true},{"one":"f305273a7d08e72f69b0b153855e822f252cbbf34a18f305134eed9d1eb7b58a","other":"f2b49a2247c9c5e8f6f755834a37fe5c17f208f994878e14b7001e404f52e125","up":true},{"one":"ddb8be472c3d48dc4d3d112448e6c0c4a826a18af3f3b53fdfef8cd31053c75f","other":"cd6c8b42a0b092f41e6925577c9de7d1bea17231bcb3d08f3d3cce9c6fdcf22d","up":true},{"one":"298ae5d173c5360bc9ad5b492ed35de3b6e0cae868a34bfe6311a8ba5ea9877e","other":"2c85f5361b2d5abcf799de50fe58b1ed2006ea18f75823748c33eb7e95b1cc39","up":true},{"one":"0111e720a84b310f863c2530fbe149e6a221acbad01065c5d052d2b3e1716f54","other":"05949ec1a582fa70cab95c59e7c0d315583bf9fc320c60c35268931f21e90853","up":true},{"one":"ab3ff955033c0a2615932faf85fd20090b9121c7edcc8e6f7ce4c4fde0a96b8a","other":"ed424d24d702520bf7cb5f6babbdc43a078435fb4a9884ed82a93d642839e127","up":true},{"one":"7895b2cb97b473f8893cc70a4421e0f8be1c033b27cd730fa13438b7a8f3fcb5","other":"43d43e9ebcbceb4830fc1d2d5024650b90698306bbd2c4d0b4841a1a8fd09c93","up":true},{"one":"a8ff8d69dcb36462d1116dafa5e3d0c7237bf65dbece482a316862c8d66e35b6","other":"80735a728720bba0ac08daaccd093370d672a8f9a50845ad78ccd6cf8686c39f","up":true},{"one":"bcf85ecf421b871fca0247a7081188a8e2c08778b88ffad16db37ef024fec0fc","other":"9464ad8da1a5effdc0351742dfffae941ffd9fab469637b2491caece53c57dc8","up":true},{"one":"dbd4d90e3342ef837b8ecf5c6e490f7c409f419cf36b77162a87cb2cfb8ae33c","other":"c74d801e85ac0fd8951480d107b41eddc5c92775614c4886b3f732fa3d1a791d","up":true},{"one":"7c7ca5a7522a04f62f2bebd6197a03d78f255d0175c3dfceb5d92b684365b2aa","other":"7660828fb0c8f89201d34e6f4d61cc6ba9a30cead6e4eb8253f6cc92e1845f23","up":true},{"one":"9c21cb3e56f8ac66a7917a9ba14e58f77e998ac70c178b88b5053d9ac2777e60","other":"9ca1fd5d41975acb905f337997922849b4070360e47849bb4fd8cd1b9ddb4d73","up":true},{"one":"6d5ec591af4966ba024c6b2aeb45e0aab8aa1762f9cac30ce3934da529b738e9","other":"7850f5ee5048959559b3af0f95689669b250fc3aa58bcc9544dca61ca9c9769c","up":true},{"one":"244c3c954ac612e51d4945ab9b77f0b4a3983285e8add7921777e0c45a1bf338","other":"2c8042517dfeaa01586e91e491dd4154fb24c0d84fedb0404b9d5136f60da1d9","up":true},{"one":"035f15499cdb0f079b3e358ad54a6122681442a5293c3ae2fdf6c527004b36d2","other":"046ca54165f0dd4d62fd7d8ee9e97c655db3d35f5452a0ccb0dffc79c047978c","up":true},{"one":"435d721a568eb906a03c69dbd71337251a550521a4004ab5d4a7deb6f317061a","other":"402cf9d0bffa017ebea34ede11207f3366b3ea450c0428029129a8e8026abbe7","up":true},{"one":"cf52b3fc82ec24c3e9b40488d7c5f7ac8af731d159a103619bee932ec74d5e92","other":"c2d00c7d960174c0934129fdcec63525bfa728f78fb70b7c52036b772d6297ad","up":true},{"one":"a7a856a43293aa3004848a86f187e09343bd605e1a93e853a6f6b6b1031bd667","other":"af02c2f471e96ab8defbd229215695b95e64f7c78b145b6793a238961f556fbf","up":true},{"one":"178401ec8d01a0a4f551d23e880a8e8a4eb87773565363843d51cf52660b1211","other":"1addd4a9f01486212e13e43a9650b7f793617d1cb59fb8d941270d7ae55f575f","up":true},{"one":"397a0a0e9fadcb571acd8981f5bfe8e059e707e0feae8a9c4c6bfe87bd39e66a","other":"398038811c1c7402fe2e6994c9ce2f15c8166b8e99f379feaaed66ac87702062","up":true},{"one":"93ea8ef251fd56b159e080cdf733d33e1fdfb3c7ae5bd9a6a328d0bf5458867b","other":"97daf2cbe03c80ce6c4dae39cd071dd93cb32ed245aa9aa77285e12296957ca3","up":true},{"one":"305162c472c71ddef2320b138102b67d1ce2b8bba79e2e587fc80e085c88e547","other":"3a628ef171c1f26fa0966eb89210be0a14305aae8bfed10f4ed9017698f40f4b","up":true},{"one":"8cc3fb39009d0adc26fca1e2ee96822d168d4debc379fd516c15d4b4a1624231","other":"93c0e1adf23fdf1623359eb88c517bc521d5a26325554df890cc04c1fa17a5df","up":true},{"one":"c190f9d08c78ed6dffadaef36e77fe6aa96099e4453753b0cfc8ec542fa96b9d","other":"f2b49a2247c9c5e8f6f755834a37fe5c17f208f994878e14b7001e404f52e125","up":true},{"one":"8e282b0f27d4fa56fe14cfeb69fac5a53e3d882c7778eb190653e2eab7c93fd2","other":"95c0a351fb7aa6683280d159a7b808bfa63f63bff91a1c5936e973b2e5d3954f","up":true},{"one":"ec90a22f41ee659d5759a497946ac2991c916f00fe7caeeeb0908f3af1fe60b6","other":"ddb8be472c3d48dc4d3d112448e6c0c4a826a18af3f3b53fdfef8cd31053c75f","up":true},{"one":"a1c85ee75edb807a01f4ce930086c948918aade324752609b078c28991c04e86","other":"a742e8502c619703ce87890110f908bde32b59dc61d77a247759e5d0056e0c94","up":true},{"one":"2ddffddbf452f0c9268058a739f5757fb90281cbfd31bd6f760acc3392fec12a","other":"318828fa893a28cc0652d3f81d97c5b8e023e853685f5d3e65fde20689abcc5a","up":true},{"one":"eebd48b367cbfe94a37c0deb274a697e628074f9560b909e66229c5c76ce68eb","other":"e2770cef7c1ad312b70d94ca5570e45f324c798a31a93203f505167aeab122b6","up":true},{"one":"9b8e6bb3a7fe4dc65ac97404e546d8b777d068c94bc2355f4f1a510ad6c11905","other":"8d192b11538072db750f71204e2e6adf9dc0508d9c5cf1eb457e4e996cd985bc","up":true},{"one":"c8c8a93779ec4d9ac40925e8208478a00ee27fc220ddd73d8774cf6bfa255c46","other":"c603138e40fe2f85cc634017956ada6399fca99969e3bf0c1ee8428374e779f1","up":true},{"one":"4d381014783980b2f77f0d71160ad9e9d84672b576f4435ccdbae12752350c1c","other":"402cf9d0bffa017ebea34ede11207f3366b3ea450c0428029129a8e8026abbe7","up":true},{"one":"8e7b96d28edae711e1a4cee0d894e0bd92cdf410ba6f61713f7d9b0bee761d4c","other":"26ab9c813822dbb4f1a230cd8e99e8ab280b242747deb55fdf93d160906ef331","up":true},{"one":"81a5a07f92f813e85b501b0028e1caa6e6a6c7efa5195ecb693cd2d91d5132a0","other":"86d6f68ec0b8e1b3406943787f918bee74dd1827998bdb13ece8f690da2d296a","up":true},{"one":"cdb13873ac058861f295ebca5d958bf2bb793e3f9e274cf5a73a633425a9276f","other":"da36d1df95a158b0d3f9e7407d663a6b611dde0a77f00a584b97a939ab6a00de","up":true},{"one":"07f5d094a4b22e73cdd6c85452b3d928da9b4b16873824759cb7e8a622417fd5","other":"298ae5d173c5360bc9ad5b492ed35de3b6e0cae868a34bfe6311a8ba5ea9877e","up":true},{"one":"d408bb6f7af1590e1f162ce02cc016b1b86ede29851caa32434212ffa2a377c8","other":"c96146ee47ec7cd74551cf74f00213bc337d643c4327393f0e6848ecd4a0f8d3","up":true},{"one":"1addd4a9f01486212e13e43a9650b7f793617d1cb59fb8d941270d7ae55f575f","other":"26ab9c813822dbb4f1a230cd8e99e8ab280b242747deb55fdf93d160906ef331","up":true},{"one":"6b4ee1b73942ced78f97c0d0e221209933e63ae7353bb9ab3d37ac4127592e86","other":"793322608055d4873776a9a0a6c40b04379bfd2f289a8ad49a7dc456bc65f871","up":true},{"one":"056152dd9dae85c426378d34acab8d6641da665d2f57359a27a0ff652f3f3d02","other":"031450ec20f353435b429b5fa64f616d07c9d586afabc7a2772e05ad5c88bf50","up":true},{"one":"318828fa893a28cc0652d3f81d97c5b8e023e853685f5d3e65fde20689abcc5a","other":"31e670638acba3d58f4c67f3ff2f3f25d769e8a5d7a7838927f4d9d169a84404","up":true},{"one":"807416cc70f02d481a188027f7932b48e8f7b5e8258f7e9623f3f6e2985d8f6a","other":"80d7e892bbb26808abb1d1530077fec6b08768c151a9f220881da3c862bae0af","up":true},{"one":"025de1d2ec529d3a7da302eef0f8c54996616d40c940c0956d470ffc2a007f33","other":"035f15499cdb0f079b3e358ad54a6122681442a5293c3ae2fdf6c527004b36d2","up":true},{"one":"34118166845c185d15c286b7e5433539ee98ed634baabd534d57369fd5f7c681","other":"046ca54165f0dd4d62fd7d8ee9e97c655db3d35f5452a0ccb0dffc79c047978c","up":true},{"one":"f9ded7b83e473e71be2fc0101d574c44521c96f77f9f84a384785a3af6b1093d","other":"e2770cef7c1ad312b70d94ca5570e45f324c798a31a93203f505167aeab122b6","up":true},{"one":"b5eab4869b4cb65bdc1e5cab45c03016d202f9f5b668be50066451cfcf9ef299","other":"bfc711793830779f49aa59bc6f7a205ab4e6eae7abfdafbf3bb5a1163a778ab2","up":true},{"one":"8358a74fc8d8e39ccc40b4d3a212b7a69a6a8f6afc25cff2c9c7b44bbaf9ec82","other":"8402bd62282811ed236b2fa1f0d41ad4bbe54e420ee34adc6164cfd4baf8658d","up":true},{"one":"cc3397e9e11f75273d3f81d91f980f4504755f80b27a183212de56cc5085e58d","other":"c603138e40fe2f85cc634017956ada6399fca99969e3bf0c1ee8428374e779f1","up":true},{"one":"09b3fa30780931e18b92c75d1cdeafa365609c565e4e8c253d393835cb82d98e","other":"aceee75a260d45252060fe971eabd4bde25f912db4a3c6e47f4a09572fe01697","up":true},{"one":"bbafac5ba5915db3c80e28b249cad260b9b5dad1f728063c48fa8f61d7556e17","other":"a2a163ce2cb092b411c994cc5d5ef555d539d2dcf4e7e1aeb528d2216dc481e5","up":true},{"one":"8ea2c8acc111f38d5b4a5ed60252ee83f312d0f8359265d5b9266d54735052fe","other":"9c8e1f23f260c5a46b0001572675b19e5293ca65e7fdfc131c07612e9c4072fa","up":true},{"one":"3938e6b2c095084dc9975a3e8649133557495d34ac6df874c6d929266e3ffe6f","other":"046ca54165f0dd4d62fd7d8ee9e97c655db3d35f5452a0ccb0dffc79c047978c","up":true},{"one":"6d5ec591af4966ba024c6b2aeb45e0aab8aa1762f9cac30ce3934da529b738e9","other":"7c464054ea7b6c9ea0c7d4c209769c92f294a9db2ca159b8ef168e310a1eac3a","up":true},{"one":"44adaabf9c46608a374ed816d3c40c63b6645f4f6e033a76431bc8f88713eb41","other":"447a411c80fbd422bfa0c358d3f2a1fe6256c05e35acc6350958dfbe62cd5b9b","up":true},{"one":"e8676d17966625c4fdac6bd9437981a0cf869c8b0010812edf0c79805e0e1ff1","other":"ed424d24d702520bf7cb5f6babbdc43a078435fb4a9884ed82a93d642839e127","up":true},{"one":"70f68562733da4e3b1c3949fb6e11ac0bdd49ea7e732925f937f87df5af698d6","other":"741a854ae299df49a738725bc58abe614e5e4302ffecd8320bbede8412d160c0","up":true},{"one":"a3309f8b8bba4d8fbd7c6193d7671cb907b94e71155ef6138e0248682ff00e58","other":"09b3fa30780931e18b92c75d1cdeafa365609c565e4e8c253d393835cb82d98e","up":true},{"one":"1fd0192df1fbf33771ca575afbb4e27c6541cce4a3cff2dfc1f2c085e7fab79e","other":"18e00a7e0f826a1aba3f8c0f533ed905f2eee607b697fff056ee7874d374adcd","up":true},{"one":"035f15499cdb0f079b3e358ad54a6122681442a5293c3ae2fdf6c527004b36d2","other":"012ba278d582691241875c4c14ead91fff3983e190df7d9b43ade384e84c11fb","up":true},{"one":"08bd1e049859b4a7c8078ca9741fe3daa668b9fe478da06d1a435cd5566b3e11","other":"30feca631f06041cb14cead384dfaa5fffa6dc34b0cee54230efbe15e56a5884","up":true},{"one":"e471efbcf1def3915b3dda2dc65a86945c607be54a33e31e9625549becac0e34","other":"e6812448728b4bda5962adceb1707b29f661d3d1a6b2ccd5f8183c9a1f4d01b6","up":true},{"one":"bdc5de01276157a0f3fc43a9cc3b41b2cacc8479118b75aec4ba9b2b7fa86d5e","other":"aceee75a260d45252060fe971eabd4bde25f912db4a3c6e47f4a09572fe01697","up":true},{"one":"b78fd21c063006e2e033d1d00fc21e1ad7ad7951bb5621cec9b56639745d65f9","other":"b8e1a8622c256ef29acd52df7b3ace50820fb1a147716165ff862fdc973a48cd","up":true},{"one":"dbd4d90e3342ef837b8ecf5c6e490f7c409f419cf36b77162a87cb2cfb8ae33c","other":"da36d1df95a158b0d3f9e7407d663a6b611dde0a77f00a584b97a939ab6a00de","up":true},{"one":"f215bc09268e60ebbec76f743bebd09d7e72d4cbeedc0b9d3417bb4a2ef42935","other":"ff75b19017c84128f38dec4f63e1f247a5691dc0fae186e667afedb5fe9d2c80","up":true},{"one":"9f7d72b7d9843872904b841e421985082428fba5010db27dd871ed76630a1e1d","other":"a32749dc4e134a4fbb038618c58a7c05bbbaa06f1436de3754341af86402581b","up":true},{"one":"a1c85ee75edb807a01f4ce930086c948918aade324752609b078c28991c04e86","other":"ba911175d3aa3fcc266e2a5aa32fb706208b8a9b5021a5f37c0b85f547eb375d","up":true},{"one":"397a0a0e9fadcb571acd8981f5bfe8e059e707e0feae8a9c4c6bfe87bd39e66a","other":"7e47a2f82984a600c8583605a91d5cb8f2d9a18961845e9c422edd78e20ac3a3","up":true},{"one":"3f31ecaffaa6311c82c9a575bbc38d6bcb16630ac87e19d1853a64aa96c9dcde","other":"397a0a0e9fadcb571acd8981f5bfe8e059e707e0feae8a9c4c6bfe87bd39e66a","up":true},{"one":"ab3ff955033c0a2615932faf85fd20090b9121c7edcc8e6f7ce4c4fde0a96b8a","other":"bfc711793830779f49aa59bc6f7a205ab4e6eae7abfdafbf3bb5a1163a778ab2","up":true},{"one":"096a8302b6f369c28ed9d47719a507ead8a3cc1ca4fa1e32318b7f97873955fe","other":"08e5a268f397385c69a7fec855ae4d889cfa98afef5b7c09fc4841e3f8894ad8","up":true},{"one":"48b850974575ca57a3cc5f9a4cf5aafd8688cb32b993f69983ece63258ff876e","other":"4a95d49f58057b039b55a34f67a348c052f61770065e41243ff055efc570a935","up":true},{"one":"1b1dc3f9312df141855c545dd16aee325f9a609230ec6165bdbbb07d0c0862f6","other":"2e65d05648b798fafbc9bb582c05e6f8f891131260e8c90ca725ddcbc823f315","up":true},{"one":"094256812084c6052a2604149aa3aba2379c483bf4ec25162f6b43934942775a","other":"08f84878e44fed2adb4b2685b9f293dc3c73d5f9bc1c474870d943ec2ae73dbe","up":true},{"one":"d9cf19895e015cb534d915aed83c0d26bf40a11244027812e17c3bec6e645a8e","other":"c96146ee47ec7cd74551cf74f00213bc337d643c4327393f0e6848ecd4a0f8d3","up":true},{"one":"8e7b96d28edae711e1a4cee0d894e0bd92cdf410ba6f61713f7d9b0bee761d4c","other":"298ae5d173c5360bc9ad5b492ed35de3b6e0cae868a34bfe6311a8ba5ea9877e","up":true},{"one":"79e5c6c6d78c88c579003cda044882ecb04520fbad1f5feadbe7b6d23fe183c8","other":"60c5647aed152609979366fb33dc8b28fc60736098ff68d232415889b43dfa58","up":true},{"one":"fc3911383f74a982f6af8ab95a63426b56117d45f153b3c1441459d9191daaff","other":"feb3bc17ee7369a4fa9889d9250fed3c1257c70916871996e6eabd374dd8dc2e","up":true},{"one":"5bd8faf93bcad07006e9426b45f5cc599f1963ab791deac4ff63d6739cd62a17","other":"50c1a8023bfecffb09472fdc50898f4d050a31443d40a6c07b629090beb0df3d","up":true},{"one":"4cece9bc134bc2b09400c9f7f8a4df9270d2fe3c077c5e441fffc911fcf6f42e","other":"5a8b84df651871fce72d11cb1c26c87ae4a0cc6b4c274d37e70532c94f27288e","up":true},{"one":"f1ed9d45622ff974a1e396cd878b2deb89e31aa5d08da773423f292ae8dbcbb6","other":"a8f49e87156fda5510897601689ce968d77032134c523634916b96de16366f9e","up":true},{"one":"482ec3dc05460579ea9bce87677bd3d9a1930e801fabeba607b8ab6b8729ff15","other":"43c9e1571c460cb9f599fa8ed79ddd0f9c3a21fd2fa455e0603109c55012f76b","up":true},{"one":"07f5d094a4b22e73cdd6c85452b3d928da9b4b16873824759cb7e8a622417fd5","other":"2a507f5cb921137a7225c9c4988a8514af0f7e3c442cb8bf2bb612dc522a7daf","up":true},{"one":"8cc3fb39009d0adc26fca1e2ee96822d168d4debc379fd516c15d4b4a1624231","other":"885427318634c458a3050f2f26eb52454a75cea4a1263b9ed55e6eb899743854","up":true},{"one":"e09f98114da64e7547b351637190f6621a1f75568cfa9960980fc77618f8855b","other":"eb686a686fd70e41659cc69ec0db53d1512dfec238918afd0a515d8ce177d4d9","up":true},{"one":"a2e6c900511768c8c9947ab0fa2e73975cf2a4cec7fd15217abdba25c329317e","other":"a5ac04d53b569e418ef5007961431155f2c226ee10157b30af71ea4836b08089","up":true},{"one":"93c0e1adf23fdf1623359eb88c517bc521d5a26325554df890cc04c1fa17a5df","other":"e09f98114da64e7547b351637190f6621a1f75568cfa9960980fc77618f8855b","up":true},{"one":"3b020c84fb60f59779324d451d9770d683e08133bbaa2d5762f61b8fd4b8d9fd","other":"397a0a0e9fadcb571acd8981f5bfe8e059e707e0feae8a9c4c6bfe87bd39e66a","up":true},{"one":"7850f5ee5048959559b3af0f95689669b250fc3aa58bcc9544dca61ca9c9769c","other":"79e5c6c6d78c88c579003cda044882ecb04520fbad1f5feadbe7b6d23fe183c8","up":true},{"one":"a606c79a018a6535375d851fcc82c42cc7c952720aa120434cedccf4a4be1f59","other":"b78fd21c063006e2e033d1d00fc21e1ad7ad7951bb5621cec9b56639745d65f9","up":true},{"one":"398038811c1c7402fe2e6994c9ce2f15c8166b8e99f379feaaed66ac87702062","other":"3cabd3a567fc4e6f8da66eb35d938fe1e9a7f2bdd2d36c4dc2d0e0e9149f5e56","up":true},{"one":"807416cc70f02d481a188027f7932b48e8f7b5e8258f7e9623f3f6e2985d8f6a","other":"9c8e1f23f260c5a46b0001572675b19e5293ca65e7fdfc131c07612e9c4072fa","up":true},{"one":"eb686a686fd70e41659cc69ec0db53d1512dfec238918afd0a515d8ce177d4d9","other":"e2770cef7c1ad312b70d94ca5570e45f324c798a31a93203f505167aeab122b6","up":true},{"one":"056152dd9dae85c426378d34acab8d6641da665d2f57359a27a0ff652f3f3d02","other":"0111e720a84b310f863c2530fbe149e6a221acbad01065c5d052d2b3e1716f54","up":true},{"one":"cc3397e9e11f75273d3f81d91f980f4504755f80b27a183212de56cc5085e58d","other":"08f84878e44fed2adb4b2685b9f293dc3c73d5f9bc1c474870d943ec2ae73dbe","up":true},{"one":"648a96d61898eb2d336ff7d5a229cfeb7b9f587282e40f9fe640e181ae26bdd3","other":"67f383e5334e9b6701d1dbb20876d4ba9a7e578af0476caed4a7e1b701f2bedb","up":true},{"one":"ed424d24d702520bf7cb5f6babbdc43a078435fb4a9884ed82a93d642839e127","other":"e2770cef7c1ad312b70d94ca5570e45f324c798a31a93203f505167aeab122b6","up":true},{"one":"67f383e5334e9b6701d1dbb20876d4ba9a7e578af0476caed4a7e1b701f2bedb","other":"741a854ae299df49a738725bc58abe614e5e4302ffecd8320bbede8412d160c0","up":true},{"one":"09b3fa30780931e18b92c75d1cdeafa365609c565e4e8c253d393835cb82d98e","other":"aeb45fe10b0dbd0f72ab6a77fbf971a8f46dbcdd96c08f23279d1434b4f38b1d","up":true},{"one":"a5053958f0cefcff1826bf02525fda98c4dc954cc38690f3c43ecbf0b2ad57af","other":"a4ee49bb2caabb6b9448bcdff1fc3cc673a2db04eab9f5c62d1787f2c25990a0","up":true},{"one":"67585dfd87a005bae9bffc2cccb83c69537247c74886b4fa52287f46c796bcb6","other":"6c0142984d629ae6995894de9e7e5eb8d3fe45e1641d7ebd63959d2e61548ba3","up":true},{"one":"a8ff8d69dcb36462d1116dafa5e3d0c7237bf65dbece482a316862c8d66e35b6","other":"a32749dc4e134a4fbb038618c58a7c05bbbaa06f1436de3754341af86402581b","up":true},{"one":"8402bd62282811ed236b2fa1f0d41ad4bbe54e420ee34adc6164cfd4baf8658d","other":"84a9db7645c792dc38c1f2113a8f0590d04e1c94d9a8c464ab0ec8219303d966","up":true},{"one":"f6c028d6a2b6408e90169151f4519b561ed183bd8925ed9a1702806f397666e7","other":"fa240411bc4f3e44dfca3faedd112c7743a67b522a910bc99696ef0b31732ee2","up":true},{"one":"c6a8220726243cceaa6f2cebdac857a05efe721323f0a064c7f85a8340d3da96","other":"c96146ee47ec7cd74551cf74f00213bc337d643c4327393f0e6848ecd4a0f8d3","up":true},{"one":"31e129ab3df7e082cc27c649d9ee29a3ea646d6a97d2417875b80e3ff576c047","other":"3728152c88f1e5e61f6523b09e8f3bb1023b700deccdca5fcc1e6488136b0e57","up":true},{"one":"b3f95f225e2b6b76e6c7ef7c86caf83e35213f6a22da41e653ca1c190be23c9c","other":"a9700308516c02cf9aea8809000a4e0596d6b44753e10bd0928df83e2eb9b9e7","up":true},{"one":"f305273a7d08e72f69b0b153855e822f252cbbf34a18f305134eed9d1eb7b58a","other":"fa240411bc4f3e44dfca3faedd112c7743a67b522a910bc99696ef0b31732ee2","up":true},{"one":"e0a0ba7e7e89a7af805e24abde1a5a5b489ba197585051a8755e8c2345c3d57b","other":"e471efbcf1def3915b3dda2dc65a86945c607be54a33e31e9625549becac0e34","up":true},{"one":"5c7c15798e86fe794bb201614d46366ea96dc51091f5b19f149995e0d40df0a6","other":"5a26ae73eebf27f6dbec2414f1277a249e814a7a06790d7061610e5227b086f6","up":true},{"one":"318828fa893a28cc0652d3f81d97c5b8e023e853685f5d3e65fde20689abcc5a","other":"3a628ef171c1f26fa0966eb89210be0a14305aae8bfed10f4ed9017698f40f4b","up":true},{"one":"b6dffac4b4eb2974ed0ed241799f97d2e5d9be671e311266826d0dcfecfcc209","other":"b78fd21c063006e2e033d1d00fc21e1ad7ad7951bb5621cec9b56639745d65f9","up":true},{"one":"a8f49e87156fda5510897601689ce968d77032134c523634916b96de16366f9e","other":"8e282b0f27d4fa56fe14cfeb69fac5a53e3d882c7778eb190653e2eab7c93fd2","up":true},{"one":"aaf051a087a92f874a3f6c7923015e4cffb4bb3ef381c977fd902f21e841d0f4","other":"ba911175d3aa3fcc266e2a5aa32fb706208b8a9b5021a5f37c0b85f547eb375d","up":true},{"one":"885427318634c458a3050f2f26eb52454a75cea4a1263b9ed55e6eb899743854","other":"a2a163ce2cb092b411c994cc5d5ef555d539d2dcf4e7e1aeb528d2216dc481e5","up":true},{"one":"ef99b6cdc05345a1ee82267890e3ccaeef1f2bd2fe7ae8b02b6b20b9a5ef85bb","other":"c8ea4177420785926e0929701f5e74c744920386f2a43b89d83c8281106cb95e","up":true},{"one":"553824ef701d3cd0191ae3a67de564ed0cf553e74bd60ed9de321f9302732ba6","other":"44adaabf9c46608a374ed816d3c40c63b6645f4f6e033a76431bc8f88713eb41","up":true},{"one":"dad08999cd2edc33cfdc59ea34c8adcd6a34eaa15f2e85b0622e9848b215c1d5","other":"d3022a46956e75bca85ba89d97b694a3a64f03ccc2d881ed0cd687d43d486925","up":true},{"one":"bdc5de01276157a0f3fc43a9cc3b41b2cacc8479118b75aec4ba9b2b7fa86d5e","other":"b3f95f225e2b6b76e6c7ef7c86caf83e35213f6a22da41e653ca1c190be23c9c","up":true},{"one":"bea10868d5da506c1801de845c148c2f09761893113ac913fe66674a8f43c178","other":"a8b58013ff911871d1aa6c2bbea6c2e6ef9b00b87b80a41dc04724ad0488e2ff","up":true},{"one":"eff2450bea797ff66d93e7c1c1b0977cddf3abba64bfa51bcc509d728569e2fa","other":"e64d90760cd81e4f112bbf1432e76c82fa4173fd474b988f4096ce187363fd81","up":true},{"one":"48d79ac55f8df512af8e7d868aa40ac9b61493fa4f1b0ce0b76bf6da2eb30e78","other":"553824ef701d3cd0191ae3a67de564ed0cf553e74bd60ed9de321f9302732ba6","up":true},{"one":"a7a856a43293aa3004848a86f187e09343bd605e1a93e853a6f6b6b1031bd667","other":"a4ee49bb2caabb6b9448bcdff1fc3cc673a2db04eab9f5c62d1787f2c25990a0","up":true},{"one":"ddb8be472c3d48dc4d3d112448e6c0c4a826a18af3f3b53fdfef8cd31053c75f","other":"b8e1a8622c256ef29acd52df7b3ace50820fb1a147716165ff862fdc973a48cd","up":true},{"one":"48de553e15afd3e8a46bfc3a5ba8a298158aa3d60f140d2730230af5cce8084d","other":"43d43e9ebcbceb4830fc1d2d5024650b90698306bbd2c4d0b4841a1a8fd09c93","up":true},{"one":"c272b12f4020ae5b20e3d29cd09de03fa0088e3eeb5f07aa7728b29a3e90e687","other":"ff75b19017c84128f38dec4f63e1f247a5691dc0fae186e667afedb5fe9d2c80","up":true},{"one":"1070df5e904e3865085b0319a81761e59146494c689e7567efe7465fc819ae8b","other":"138dbc1662c4ce9b2b30ef5035914cc70465666fe18f313318e662d13f099621","up":true},{"one":"eebd48b367cbfe94a37c0deb274a697e628074f9560b909e66229c5c76ce68eb","other":"e8676d17966625c4fdac6bd9437981a0cf869c8b0010812edf0c79805e0e1ff1","up":true},{"one":"44adaabf9c46608a374ed816d3c40c63b6645f4f6e033a76431bc8f88713eb41","other":"402cf9d0bffa017ebea34ede11207f3366b3ea450c0428029129a8e8026abbe7","up":true},{"one":"0111e720a84b310f863c2530fbe149e6a221acbad01065c5d052d2b3e1716f54","other":"019109311d4888497aa194cce4a89b5ef243421cf0e7e7bb9115d086e1a1f7d7","up":true},{"one":"834f14e9f325482adef62651ddf3685690dd5ebdd18014f2bd266b2143c290ff","other":"80d7e892bbb26808abb1d1530077fec6b08768c151a9f220881da3c862bae0af","up":true},{"one":"447cdbf1ff462aa67d6a46085b1a84fdc495a4142ab174c8e69b271b09732b4d","other":"402cf9d0bffa017ebea34ede11207f3366b3ea450c0428029129a8e8026abbe7","up":true},{"one":"48b850974575ca57a3cc5f9a4cf5aafd8688cb32b993f69983ece63258ff876e","other":"50c1a8023bfecffb09472fdc50898f4d050a31443d40a6c07b629090beb0df3d","up":true},{"one":"d9cf19895e015cb534d915aed83c0d26bf40a11244027812e17c3bec6e645a8e","other":"b8e1a8622c256ef29acd52df7b3ace50820fb1a147716165ff862fdc973a48cd","up":true},{"one":"fc3911383f74a982f6af8ab95a63426b56117d45f153b3c1441459d9191daaff","other":"fa240411bc4f3e44dfca3faedd112c7743a67b522a910bc99696ef0b31732ee2","up":true},{"one":"48f1ca6d433019f932fa4ae03e0decbcbea3fe635edff4458a669b83f8162b9a","other":"553824ef701d3cd0191ae3a67de564ed0cf553e74bd60ed9de321f9302732ba6","up":true},{"one":"5bd8faf93bcad07006e9426b45f5cc599f1963ab791deac4ff63d6739cd62a17","other":"26ab9c813822dbb4f1a230cd8e99e8ab280b242747deb55fdf93d160906ef331","up":true},{"one":"f9ded7b83e473e71be2fc0101d574c44521c96f77f9f84a384785a3af6b1093d","other":"cd6c8b42a0b092f41e6925577c9de7d1bea17231bcb3d08f3d3cce9c6fdcf22d","up":true},{"one":"7d162a11662585f8c38d88fb241623e67bacf90703065dae6c092b4b507d6543","other":"6e7f1f3d65364399617a4d95fdd04f2ca9b007b2366943e7ba5acd4616a7a425","up":true},{"one":"f1ed9d45622ff974a1e396cd878b2deb89e31aa5d08da773423f292ae8dbcbb6","other":"b4a1b687fbdb754fd689e26f0870a7dcab5d76190c06f3ea2ea1e198f8aa5ab2","up":true},{"one":"035f15499cdb0f079b3e358ad54a6122681442a5293c3ae2fdf6c527004b36d2","other":"0111e720a84b310f863c2530fbe149e6a221acbad01065c5d052d2b3e1716f54","up":true},{"one":"482ec3dc05460579ea9bce87677bd3d9a1930e801fabeba607b8ab6b8729ff15","other":"1bd588263274543729d54529ae9e9bf4596db40649a1c2a3f73168d818f34b62","up":true},{"one":"7ce7fec833a2e8c7720fcc97f820f2ca2aca85388210f887c3efe78b020766e7","other":"679554b410e415cfcdf1b14ef87759269b2bcaf07f4541122977db3a40091da2","up":true},{"one":"ab3ff955033c0a2615932faf85fd20090b9121c7edcc8e6f7ce4c4fde0a96b8a","other":"ec90a22f41ee659d5759a497946ac2991c916f00fe7caeeeb0908f3af1fe60b6","up":true},{"one":"9b8e6bb3a7fe4dc65ac97404e546d8b777d068c94bc2355f4f1a510ad6c11905","other":"93ea8ef251fd56b159e080cdf733d33e1fdfb3c7ae5bd9a6a328d0bf5458867b","up":true},{"one":"1addd4a9f01486212e13e43a9650b7f793617d1cb59fb8d941270d7ae55f575f","other":"298ae5d173c5360bc9ad5b492ed35de3b6e0cae868a34bfe6311a8ba5ea9877e","up":true},{"one":"1b1dc3f9312df141855c545dd16aee325f9a609230ec6165bdbbb07d0c0862f6","other":"1dc0ef1ce68dc681298177bde808af514efa52a5ad38c9cd2bd61968cdf19cfb","up":true},{"one":"af02c2f471e96ab8defbd229215695b95e64f7c78b145b6793a238961f556fbf","other":"bbafac5ba5915db3c80e28b249cad260b9b5dad1f728063c48fa8f61d7556e17","up":true},{"one":"cc3397e9e11f75273d3f81d91f980f4504755f80b27a183212de56cc5085e58d","other":"da36d1df95a158b0d3f9e7407d663a6b611dde0a77f00a584b97a939ab6a00de","up":true},{"one":"8358a74fc8d8e39ccc40b4d3a212b7a69a6a8f6afc25cff2c9c7b44bbaf9ec82","other":"8e7b96d28edae711e1a4cee0d894e0bd92cdf410ba6f61713f7d9b0bee761d4c","up":true},{"one":"d3e913cf4a7dabfb5699131b65e533a40adb46ea37e0ed4ce9433f99015986ef","other":"c42e6492879439eeecd9938d17ff283fd8f5f24206906ca512b4daa4803b78b4","up":true},{"one":"837f0993f6374039a5ad4472d6313e647a4c5db4583bd27ccfa98d3448a17731","other":"97daf2cbe03c80ce6c4dae39cd071dd93cb32ed245aa9aa77285e12296957ca3","up":true},{"one":"a5053958f0cefcff1826bf02525fda98c4dc954cc38690f3c43ecbf0b2ad57af","other":"b78fd21c063006e2e033d1d00fc21e1ad7ad7951bb5621cec9b56639745d65f9","up":true},{"one":"cd6c8b42a0b092f41e6925577c9de7d1bea17231bcb3d08f3d3cce9c6fdcf22d","other":"f8ff7440d6f4abb1c89496336843741ed53a544cedeeed71d8ebe0b08698438d","up":true},{"one":"b3f95f225e2b6b76e6c7ef7c86caf83e35213f6a22da41e653ca1c190be23c9c","other":"84a9db7645c792dc38c1f2113a8f0590d04e1c94d9a8c464ab0ec8219303d966","up":true},{"one":"6c0142984d629ae6995894de9e7e5eb8d3fe45e1641d7ebd63959d2e61548ba3","other":"6e7f1f3d65364399617a4d95fdd04f2ca9b007b2366943e7ba5acd4616a7a425","up":true},{"one":"7c7ca5a7522a04f62f2bebd6197a03d78f255d0175c3dfceb5d92b684365b2aa","other":"6c0142984d629ae6995894de9e7e5eb8d3fe45e1641d7ebd63959d2e61548ba3","up":true},{"one":"a5ac04d53b569e418ef5007961431155f2c226ee10157b30af71ea4836b08089","other":"a4ee49bb2caabb6b9448bcdff1fc3cc673a2db04eab9f5c62d1787f2c25990a0","up":true},{"one":"a8f49e87156fda5510897601689ce968d77032134c523634916b96de16366f9e","other":"a2a163ce2cb092b411c994cc5d5ef555d539d2dcf4e7e1aeb528d2216dc481e5","up":true},{"one":"a2a163ce2cb092b411c994cc5d5ef555d539d2dcf4e7e1aeb528d2216dc481e5","other":"a32749dc4e134a4fbb038618c58a7c05bbbaa06f1436de3754341af86402581b","up":true},{"one":"d20931ce3da972fd23ea306e5c604a1fbd9417ba02654c5cdbe278fe259f75d5","other":"dad08999cd2edc33cfdc59ea34c8adcd6a34eaa15f2e85b0622e9848b215c1d5","up":true},{"one":"318828fa893a28cc0652d3f81d97c5b8e023e853685f5d3e65fde20689abcc5a","other":"298ae5d173c5360bc9ad5b492ed35de3b6e0cae868a34bfe6311a8ba5ea9877e","up":true},{"one":"f6c028d6a2b6408e90169151f4519b561ed183bd8925ed9a1702806f397666e7","other":"f645aab9cb2bd2709998b38e5789c9c5f68d40765e6cbd93b92e6383eb671dba","up":true},{"one":"0e2b48558ce2af1fbfee38a557d56072e3091cfcaee8d7847c7c9dcf7bef9bfa","other":"0e80db9dfa8ce29bedfb2de031622bef8829bee52771322b6a7efb47afe540e7","up":true},{"one":"aaf051a087a92f874a3f6c7923015e4cffb4bb3ef381c977fd902f21e841d0f4","other":"aeb45fe10b0dbd0f72ab6a77fbf971a8f46dbcdd96c08f23279d1434b4f38b1d","up":true},{"one":"885427318634c458a3050f2f26eb52454a75cea4a1263b9ed55e6eb899743854","other":"aceee75a260d45252060fe971eabd4bde25f912db4a3c6e47f4a09572fe01697","up":true},{"one":"a8ff8d69dcb36462d1116dafa5e3d0c7237bf65dbece482a316862c8d66e35b6","other":"837f0993f6374039a5ad4472d6313e647a4c5db4583bd27ccfa98d3448a17731","up":true},{"one":"9f0e2bf8a962156c9e0a83c3d42ad3dc5ac5c3e508f24200bfb151aad4e395ff","other":"298ae5d173c5360bc9ad5b492ed35de3b6e0cae868a34bfe6311a8ba5ea9877e","up":true},{"one":"056152dd9dae85c426378d34acab8d6641da665d2f57359a27a0ff652f3f3d02","other":"012ba278d582691241875c4c14ead91fff3983e190df7d9b43ade384e84c11fb","up":true},{"one":"6d5ec591af4966ba024c6b2aeb45e0aab8aa1762f9cac30ce3934da529b738e9","other":"741a854ae299df49a738725bc58abe614e5e4302ffecd8320bbede8412d160c0","up":true},{"one":"86d6f68ec0b8e1b3406943787f918bee74dd1827998bdb13ece8f690da2d296a","other":"80735a728720bba0ac08daaccd093370d672a8f9a50845ad78ccd6cf8686c39f","up":true},{"one":"8cc3fb39009d0adc26fca1e2ee96822d168d4debc379fd516c15d4b4a1624231","other":"807416cc70f02d481a188027f7932b48e8f7b5e8258f7e9623f3f6e2985d8f6a","up":true},{"one":"a2e6c900511768c8c9947ab0fa2e73975cf2a4cec7fd15217abdba25c329317e","other":"a1c85ee75edb807a01f4ce930086c948918aade324752609b078c28991c04e86","up":true},{"one":"9c21cb3e56f8ac66a7917a9ba14e58f77e998ac70c178b88b5053d9ac2777e60","other":"93c0e1adf23fdf1623359eb88c517bc521d5a26325554df890cc04c1fa17a5df","up":true},{"one":"d95965e449dd4069876384cf4b34f986731e255a7948f0a862d229b1dddbc502","other":"f8ff7440d6f4abb1c89496336843741ed53a544cedeeed71d8ebe0b08698438d","up":true},{"one":"ef99b6cdc05345a1ee82267890e3ccaeef1f2bd2fe7ae8b02b6b20b9a5ef85bb","other":"fa240411bc4f3e44dfca3faedd112c7743a67b522a910bc99696ef0b31732ee2","up":true},{"one":"1bd588263274543729d54529ae9e9bf4596db40649a1c2a3f73168d818f34b62","other":"18e00a7e0f826a1aba3f8c0f533ed905f2eee607b697fff056ee7874d374adcd","up":true},{"one":"e2d36f335d90ad63148db8e353a78a30d8d9c0abe107be2cf8685f6a01ce74b9","other":"ec90a22f41ee659d5759a497946ac2991c916f00fe7caeeeb0908f3af1fe60b6","up":true},{"one":"0cfc7309afabceeb7d248714e972cf3987205324f5ab8d048d17bea5dc87369d","other":"140dd212f2b193ee6a9d7fc14f7da321c7ef6fd367fb4f194924fd0ad5d135cc","up":true},{"one":"87a337622455ae65daf3ab2555cee8985e9aa14bac245545d985296060e4a8de","other":"8d192b11538072db750f71204e2e6adf9dc0508d9c5cf1eb457e4e996cd985bc","up":true},{"one":"51440ab47fc5076c00cad16a542b846c26b3281ecea4dbca795ae9b80183ec90","other":"553824ef701d3cd0191ae3a67de564ed0cf553e74bd60ed9de321f9302732ba6","up":true},{"one":"bdc5de01276157a0f3fc43a9cc3b41b2cacc8479118b75aec4ba9b2b7fa86d5e","other":"9464ad8da1a5effdc0351742dfffae941ffd9fab469637b2491caece53c57dc8","up":true},{"one":"30feca631f06041cb14cead384dfaa5fffa6dc34b0cee54230efbe15e56a5884","other":"3728152c88f1e5e61f6523b09e8f3bb1023b700deccdca5fcc1e6488136b0e57","up":true},{"one":"bea10868d5da506c1801de845c148c2f09761893113ac913fe66674a8f43c178","other":"af02c2f471e96ab8defbd229215695b95e64f7c78b145b6793a238961f556fbf","up":true},{"one":"8d192b11538072db750f71204e2e6adf9dc0508d9c5cf1eb457e4e996cd985bc","other":"9ec831d97418916fd9695465e041caf27824dbb51d6ff74d6b70f3bd561e70e6","up":true},{"one":"48d79ac55f8df512af8e7d868aa40ac9b61493fa4f1b0ce0b76bf6da2eb30e78","other":"46bfa8bea56b0be1abfa5ad3561bb6bf49ed6695d83ee2b2c192c5a0408347cf","up":true},{"one":"b6dffac4b4eb2974ed0ed241799f97d2e5d9be671e311266826d0dcfecfcc209","other":"af02c2f471e96ab8defbd229215695b95e64f7c78b145b6793a238961f556fbf","up":true},{"one":"c53417f008e4550e1c4cb9a3e2955b3af6403e059b7b4b4c33869d9ed4a580a5","other":"24f80c437be45898e594f821bba0f5c62e0c9a0c720118e362ee6f78410612bd","up":true},{"one":"07f5d094a4b22e73cdd6c85452b3d928da9b4b16873824759cb7e8a622417fd5","other":"0111e720a84b310f863c2530fbe149e6a221acbad01065c5d052d2b3e1716f54","up":true},{"one":"9959385385aade728d3f5763806596222bc1e7b9946c2c92407943d080b32f8d","other":"9ca1fd5d41975acb905f337997922849b4070360e47849bb4fd8cd1b9ddb4d73","up":true},{"one":"c6a8220726243cceaa6f2cebdac857a05efe721323f0a064c7f85a8340d3da96","other":"c2d00c7d960174c0934129fdcec63525bfa728f78fb70b7c52036b772d6297ad","up":true},{"one":"ab719e60a77ba5253f1690c920df9dd9f3a62071e9cce9d62e0001a522b3409e","other":"84a9db7645c792dc38c1f2113a8f0590d04e1c94d9a8c464ab0ec8219303d966","up":true},{"one":"5814be13c8550b9a5a83d08e7af6022002a8fdaa38ba6c2c30be58099a9f7744","other":"5ff09c6859736aad7a82a3bfb3f1a1a8b3c0d58f831863540d9c3013dd35745e","up":true},{"one":"025de1d2ec529d3a7da302eef0f8c54996616d40c940c0956d470ffc2a007f33","other":"0d1c35c6ea485cb33857b790ee262f974cf0d54cf8ce3003f8308ac2e87c2c25","up":true},{"one":"eebd48b367cbfe94a37c0deb274a697e628074f9560b909e66229c5c76ce68eb","other":"fa240411bc4f3e44dfca3faedd112c7743a67b522a910bc99696ef0b31732ee2","up":true},{"one":"c272b12f4020ae5b20e3d29cd09de03fa0088e3eeb5f07aa7728b29a3e90e687","other":"c74d801e85ac0fd8951480d107b41eddc5c92775614c4886b3f732fa3d1a791d","up":true},{"one":"cdb13873ac058861f295ebca5d958bf2bb793e3f9e274cf5a73a633425a9276f","other":"08f84878e44fed2adb4b2685b9f293dc3c73d5f9bc1c474870d943ec2ae73dbe","up":true},{"one":"16868ec5d8f490ac73ea28b4e8fdda55ac149bb1aafb177545b54b84a5ad5367","other":"019109311d4888497aa194cce4a89b5ef243421cf0e7e7bb9115d086e1a1f7d7","up":true},{"one":"da36d1df95a158b0d3f9e7407d663a6b611dde0a77f00a584b97a939ab6a00de","other":"c74d801e85ac0fd8951480d107b41eddc5c92775614c4886b3f732fa3d1a791d","up":true},{"one":"8ea2c8acc111f38d5b4a5ed60252ee83f312d0f8359265d5b9266d54735052fe","other":"8402bd62282811ed236b2fa1f0d41ad4bbe54e420ee34adc6164cfd4baf8658d","up":true},{"one":"c9c302de4afe7b4dcbb6f3e366ce747083f9dcd7d5c6a01b939da5cdc6ccc874","other":"dad08999cd2edc33cfdc59ea34c8adcd6a34eaa15f2e85b0622e9848b215c1d5","up":true},{"one":"7ce7fec833a2e8c7720fcc97f820f2ca2aca85388210f887c3efe78b020766e7","other":"7e47a2f82984a600c8583605a91d5cb8f2d9a18961845e9c422edd78e20ac3a3","up":true},{"one":"a8ff8d69dcb36462d1116dafa5e3d0c7237bf65dbece482a316862c8d66e35b6","other":"bfc711793830779f49aa59bc6f7a205ab4e6eae7abfdafbf3bb5a1163a778ab2","up":true},{"one":"e0a0ba7e7e89a7af805e24abde1a5a5b489ba197585051a8755e8c2345c3d57b","other":"feb3bc17ee7369a4fa9889d9250fed3c1257c70916871996e6eabd374dd8dc2e","up":true},{"one":"ab3ff955033c0a2615932faf85fd20090b9121c7edcc8e6f7ce4c4fde0a96b8a","other":"f2b49a2247c9c5e8f6f755834a37fe5c17f208f994878e14b7001e404f52e125","up":true},{"one":"52a8747e4ea35f6f50c72d7c481616f68a5e4396248332b8ff69d3a772de49ac","other":"553824ef701d3cd0191ae3a67de564ed0cf553e74bd60ed9de321f9302732ba6","up":true},{"one":"6b4ee1b73942ced78f97c0d0e221209933e63ae7353bb9ab3d37ac4127592e86","other":"7c464054ea7b6c9ea0c7d4c209769c92f294a9db2ca159b8ef168e310a1eac3a","up":true},{"one":"8862cd85d7039119b984f752a458ac0495ddea98c69fc1d1241db7873a712c11","other":"8b4318f86ad47976321af97bfbf95cd0a3b0aa22447aeb0611ed1a9bf1e6a4bf","up":true},{"one":"9b8e6bb3a7fe4dc65ac97404e546d8b777d068c94bc2355f4f1a510ad6c11905","other":"80735a728720bba0ac08daaccd093370d672a8f9a50845ad78ccd6cf8686c39f","up":true},{"one":"096a8302b6f369c28ed9d47719a507ead8a3cc1ca4fa1e32318b7f97873955fe","other":"0e3b7722f3f84d83b3d744bea4e893715a01d4df3cf4a1c6a6823a1f5c9ad6b8","up":true},{"one":"feb3bc17ee7369a4fa9889d9250fed3c1257c70916871996e6eabd374dd8dc2e","other":"f645aab9cb2bd2709998b38e5789c9c5f68d40765e6cbd93b92e6383eb671dba","up":true},{"one":"9ec831d97418916fd9695465e041caf27824dbb51d6ff74d6b70f3bd561e70e6","other":"9ca1fd5d41975acb905f337997922849b4070360e47849bb4fd8cd1b9ddb4d73","up":true},{"one":"9f0e2bf8a962156c9e0a83c3d42ad3dc5ac5c3e508f24200bfb151aad4e395ff","other":"3cabd3a567fc4e6f8da66eb35d938fe1e9a7f2bdd2d36c4dc2d0e0e9149f5e56","up":true},{"one":"ef99b6cdc05345a1ee82267890e3ccaeef1f2bd2fe7ae8b02b6b20b9a5ef85bb","other":"e6812448728b4bda5962adceb1707b29f661d3d1a6b2ccd5f8183c9a1f4d01b6","up":true},{"one":"87a337622455ae65daf3ab2555cee8985e9aa14bac245545d985296060e4a8de","other":"81a5a07f92f813e85b501b0028e1caa6e6a6c7efa5195ecb693cd2d91d5132a0","up":true},{"one":"f645aab9cb2bd2709998b38e5789c9c5f68d40765e6cbd93b92e6383eb671dba","other":"c96146ee47ec7cd74551cf74f00213bc337d643c4327393f0e6848ecd4a0f8d3","up":true},{"one":"a7a856a43293aa3004848a86f187e09343bd605e1a93e853a6f6b6b1031bd667","other":"a8b58013ff911871d1aa6c2bbea6c2e6ef9b00b87b80a41dc04724ad0488e2ff","up":true},{"one":"46bfa8bea56b0be1abfa5ad3561bb6bf49ed6695d83ee2b2c192c5a0408347cf","other":"435d721a568eb906a03c69dbd71337251a550521a4004ab5d4a7deb6f317061a","up":true},{"one":"6d5ec591af4966ba024c6b2aeb45e0aab8aa1762f9cac30ce3934da529b738e9","other":"7660828fb0c8f89201d34e6f4d61cc6ba9a30cead6e4eb8253f6cc92e1845f23","up":true},{"one":"b659418885032905ea20ad47d70470e403e7e407e0e9ebf9277f9a2d81ec121c","other":"b5eab4869b4cb65bdc1e5cab45c03016d202f9f5b668be50066451cfcf9ef299","up":true},{"one":"8cc3fb39009d0adc26fca1e2ee96822d168d4debc379fd516c15d4b4a1624231","other":"8402bd62282811ed236b2fa1f0d41ad4bbe54e420ee34adc6164cfd4baf8658d","up":true},{"one":"7e47a2f82984a600c8583605a91d5cb8f2d9a18961845e9c422edd78e20ac3a3","other":"741a854ae299df49a738725bc58abe614e5e4302ffecd8320bbede8412d160c0","up":true},{"one":"30feca631f06041cb14cead384dfaa5fffa6dc34b0cee54230efbe15e56a5884","other":"32ff1969d90aaa5a8ed2260968a8e2bac2d1cae597c906f90495f1dc5de7f8d3","up":true},{"one":"3c5b2e125020c80e3674df9cac34de4d8f3a94ee02556fb557921b6d5498b933","other":"397a0a0e9fadcb571acd8981f5bfe8e059e707e0feae8a9c4c6bfe87bd39e66a","up":true},{"one":"a2a163ce2cb092b411c994cc5d5ef555d539d2dcf4e7e1aeb528d2216dc481e5","other":"b8e1a8622c256ef29acd52df7b3ace50820fb1a147716165ff862fdc973a48cd","up":true},{"one":"3f31ecaffaa6311c82c9a575bbc38d6bcb16630ac87e19d1853a64aa96c9dcde","other":"3c5b2e125020c80e3674df9cac34de4d8f3a94ee02556fb557921b6d5498b933","up":true},{"one":"e8676d17966625c4fdac6bd9437981a0cf869c8b0010812edf0c79805e0e1ff1","other":"f7561cb6740e17ec7c7d17068251b2c951d954c77804aa5af60464e9c3964e57","up":true},{"one":"c272b12f4020ae5b20e3d29cd09de03fa0088e3eeb5f07aa7728b29a3e90e687","other":"d3e913cf4a7dabfb5699131b65e533a40adb46ea37e0ed4ce9433f99015986ef","up":true},{"one":"56ca9dd846a58a0ffa7b49a88aad559a338ba535a6f738468b8f146c97890cb2","other":"5814be13c8550b9a5a83d08e7af6022002a8fdaa38ba6c2c30be58099a9f7744","up":true},{"one":"a8f49e87156fda5510897601689ce968d77032134c523634916b96de16366f9e","other":"a32749dc4e134a4fbb038618c58a7c05bbbaa06f1436de3754341af86402581b","up":true},{"one":"031450ec20f353435b429b5fa64f616d07c9d586afabc7a2772e05ad5c88bf50","other":"035f15499cdb0f079b3e358ad54a6122681442a5293c3ae2fdf6c527004b36d2","up":true},{"one":"1070df5e904e3865085b0319a81761e59146494c689e7567efe7465fc819ae8b","other":"16868ec5d8f490ac73ea28b4e8fdda55ac149bb1aafb177545b54b84a5ad5367","up":true},{"one":"d95965e449dd4069876384cf4b34f986731e255a7948f0a862d229b1dddbc502","other":"dad08999cd2edc33cfdc59ea34c8adcd6a34eaa15f2e85b0622e9848b215c1d5","up":true},{"one":"9f7d72b7d9843872904b841e421985082428fba5010db27dd871ed76630a1e1d","other":"93c0e1adf23fdf1623359eb88c517bc521d5a26325554df890cc04c1fa17a5df","up":true},{"one":"994839e5f3a5b8b23aed84fb029413124af17804b79b0263ec6bfd5aec5dad78","other":"f645aab9cb2bd2709998b38e5789c9c5f68d40765e6cbd93b92e6383eb671dba","up":true},{"one":"056152dd9dae85c426378d34acab8d6641da665d2f57359a27a0ff652f3f3d02","other":"025de1d2ec529d3a7da302eef0f8c54996616d40c940c0956d470ffc2a007f33","up":true},{"one":"a8ff8d69dcb36462d1116dafa5e3d0c7237bf65dbece482a316862c8d66e35b6","other":"a2a163ce2cb092b411c994cc5d5ef555d539d2dcf4e7e1aeb528d2216dc481e5","up":true},{"one":"e0a0ba7e7e89a7af805e24abde1a5a5b489ba197585051a8755e8c2345c3d57b","other":"fa240411bc4f3e44dfca3faedd112c7743a67b522a910bc99696ef0b31732ee2","up":true},{"one":"c8ea4177420785926e0929701f5e74c744920386f2a43b89d83c8281106cb95e","other":"da36d1df95a158b0d3f9e7407d663a6b611dde0a77f00a584b97a939ab6a00de","up":true},{"one":"bcf85ecf421b871fca0247a7081188a8e2c08778b88ffad16db37ef024fec0fc","other":"a9700308516c02cf9aea8809000a4e0596d6b44753e10bd0928df83e2eb9b9e7","up":true},{"one":"c53417f008e4550e1c4cb9a3e2955b3af6403e059b7b4b4c33869d9ed4a580a5","other":"2fd2f77d76cca480ac18e9af7a462f297db168c3370b3bc0e2c04aa006c4d037","up":true},{"one":"48b850974575ca57a3cc5f9a4cf5aafd8688cb32b993f69983ece63258ff876e","other":"553824ef701d3cd0191ae3a67de564ed0cf553e74bd60ed9de321f9302732ba6","up":true},{"one":"26acc3c373c29150af30bbc9264d0c44c7c606ff7377399ddf844635e97afcfa","other":"244c3c954ac612e51d4945ab9b77f0b4a3983285e8add7921777e0c45a1bf338","up":true},{"one":"67909bdcaef2330ef120e524c76e1e382b474f3332d86f65282028e051f34c75","other":"56635699bd3bc78193adbdb8e8b7c2c91dab4140fdaa506fea2300ee86c4ba81","up":true},{"one":"8e7b96d28edae711e1a4cee0d894e0bd92cdf410ba6f61713f7d9b0bee761d4c","other":"885427318634c458a3050f2f26eb52454a75cea4a1263b9ed55e6eb899743854","up":true},{"one":"138dbc1662c4ce9b2b30ef5035914cc70465666fe18f313318e662d13f099621","other":"3728152c88f1e5e61f6523b09e8f3bb1023b700deccdca5fcc1e6488136b0e57","up":true},{"one":"1049d321a450726cf39d1d7cea1c108be3bec137a644b62cdc73a853f5a5a22b","other":"5d82a418629cfbe7c57105309319ad695a198626fe3571de213a12ddf62f7308","up":true},{"one":"34118166845c185d15c286b7e5433539ee98ed634baabd534d57369fd5f7c681","other":"2e65d05648b798fafbc9bb582c05e6f8f891131260e8c90ca725ddcbc823f315","up":true},{"one":"aeb45fe10b0dbd0f72ab6a77fbf971a8f46dbcdd96c08f23279d1434b4f38b1d","other":"be68267d77fb52424227267c665ca1193a010334cac057338aca77b49a4b94da","up":true},{"one":"0cfc7309afabceeb7d248714e972cf3987205324f5ab8d048d17bea5dc87369d","other":"08e5a268f397385c69a7fec855ae4d889cfa98afef5b7c09fc4841e3f8894ad8","up":true},{"one":"834f14e9f325482adef62651ddf3685690dd5ebdd18014f2bd266b2143c290ff","other":"8f9aa2cd33d18e7cb4494d11a7532c97eb4a1cae172b2165c26ae4ed24887c0d","up":true},{"one":"7c7ca5a7522a04f62f2bebd6197a03d78f255d0175c3dfceb5d92b684365b2aa","other":"648a96d61898eb2d336ff7d5a229cfeb7b9f587282e40f9fe640e181ae26bdd3","up":true},{"one":"9257dc934dfbf17473b70cb85333c6fab67ee9b6228a646576c4f57253f1004e","other":"9c21cb3e56f8ac66a7917a9ba14e58f77e998ac70c178b88b5053d9ac2777e60","up":true},{"one":"f1ed9d45622ff974a1e396cd878b2deb89e31aa5d08da773423f292ae8dbcbb6","other":"a32749dc4e134a4fbb038618c58a7c05bbbaa06f1436de3754341af86402581b","up":true},{"one":"2fd2f77d76cca480ac18e9af7a462f297db168c3370b3bc0e2c04aa006c4d037","other":"2c8042517dfeaa01586e91e491dd4154fb24c0d84fedb0404b9d5136f60da1d9","up":true},{"one":"84a9db7645c792dc38c1f2113a8f0590d04e1c94d9a8c464ab0ec8219303d966","other":"97daf2cbe03c80ce6c4dae39cd071dd93cb32ed245aa9aa77285e12296957ca3","up":true},{"one":"cf52b3fc82ec24c3e9b40488d7c5f7ac8af731d159a103619bee932ec74d5e92","other":"f6c028d6a2b6408e90169151f4519b561ed183bd8925ed9a1702806f397666e7","up":true},{"one":"e471efbcf1def3915b3dda2dc65a86945c607be54a33e31e9625549becac0e34","other":"e8676d17966625c4fdac6bd9437981a0cf869c8b0010812edf0c79805e0e1ff1","up":true},{"one":"9f0e2bf8a962156c9e0a83c3d42ad3dc5ac5c3e508f24200bfb151aad4e395ff","other":"3b020c84fb60f59779324d451d9770d683e08133bbaa2d5762f61b8fd4b8d9fd","up":true},{"one":"f215bc09268e60ebbec76f743bebd09d7e72d4cbeedc0b9d3417bb4a2ef42935","other":"e6812448728b4bda5962adceb1707b29f661d3d1a6b2ccd5f8183c9a1f4d01b6","up":true},{"one":"8cc3fb39009d0adc26fca1e2ee96822d168d4debc379fd516c15d4b4a1624231","other":"8b4318f86ad47976321af97bfbf95cd0a3b0aa22447aeb0611ed1a9bf1e6a4bf","up":true},{"one":"b3f95f225e2b6b76e6c7ef7c86caf83e35213f6a22da41e653ca1c190be23c9c","other":"ba911175d3aa3fcc266e2a5aa32fb706208b8a9b5021a5f37c0b85f547eb375d","up":true},{"one":"1dec77c2f4caf053c2d0524ae34a2d970bf4743a0d009d8fc543077ddfdfe3d0","other":"0cfc7309afabceeb7d248714e972cf3987205324f5ab8d048d17bea5dc87369d","up":true},{"one":"93c0e1adf23fdf1623359eb88c517bc521d5a26325554df890cc04c1fa17a5df","other":"f7561cb6740e17ec7c7d17068251b2c951d954c77804aa5af60464e9c3964e57","up":true},{"one":"2ddffddbf452f0c9268058a739f5757fb90281cbfd31bd6f760acc3392fec12a","other":"07f5d094a4b22e73cdd6c85452b3d928da9b4b16873824759cb7e8a622417fd5","up":true},{"one":"8e282b0f27d4fa56fe14cfeb69fac5a53e3d882c7778eb190653e2eab7c93fd2","other":"80735a728720bba0ac08daaccd093370d672a8f9a50845ad78ccd6cf8686c39f","up":true},{"one":"679554b410e415cfcdf1b14ef87759269b2bcaf07f4541122977db3a40091da2","other":"6b4ee1b73942ced78f97c0d0e221209933e63ae7353bb9ab3d37ac4127592e86","up":true},{"one":"b5eab4869b4cb65bdc1e5cab45c03016d202f9f5b668be50066451cfcf9ef299","other":"be68267d77fb52424227267c665ca1193a010334cac057338aca77b49a4b94da","up":true},{"one":"3cabd3a567fc4e6f8da66eb35d938fe1e9a7f2bdd2d36c4dc2d0e0e9149f5e56","other":"3728152c88f1e5e61f6523b09e8f3bb1023b700deccdca5fcc1e6488136b0e57","up":true},{"one":"16868ec5d8f490ac73ea28b4e8fdda55ac149bb1aafb177545b54b84a5ad5367","other":"194ea3e14dc5d99f98d15607dc4c405769f5a371acc22d41a62d0537d716be32","up":true},{"one":"da36d1df95a158b0d3f9e7407d663a6b611dde0a77f00a584b97a939ab6a00de","other":"f8ff7440d6f4abb1c89496336843741ed53a544cedeeed71d8ebe0b08698438d","up":true},{"one":"d700d96de1193456dc0bcf492c7c11b0951062974af2f7f47b8c901b17c23165","other":"f645aab9cb2bd2709998b38e5789c9c5f68d40765e6cbd93b92e6383eb671dba","up":true},{"one":"af02c2f471e96ab8defbd229215695b95e64f7c78b145b6793a238961f556fbf","other":"b78fd21c063006e2e033d1d00fc21e1ad7ad7951bb5621cec9b56639745d65f9","up":true},{"one":"ba911175d3aa3fcc266e2a5aa32fb706208b8a9b5021a5f37c0b85f547eb375d","other":"a0c88ba70599b0e72c18fa6aedd14d607cca3e9a49a5d50165d084e70328c2dd","up":true},{"one":"305162c472c71ddef2320b138102b67d1ce2b8bba79e2e587fc80e085c88e547","other":"3728152c88f1e5e61f6523b09e8f3bb1023b700deccdca5fcc1e6488136b0e57","up":true},{"one":"56ca9dd846a58a0ffa7b49a88aad559a338ba535a6f738468b8f146c97890cb2","other":"553824ef701d3cd0191ae3a67de564ed0cf553e74bd60ed9de321f9302732ba6","up":true},{"one":"59876e7ff9e92243856dad23126e1d38d9a5ddae79772ed1b2bdb91f33a4a4b5","other":"48f1ca6d433019f932fa4ae03e0decbcbea3fe635edff4458a669b83f8162b9a","up":true},{"one":"14849f811af20ce19fb29417d20c15fc16da1e45aebdf795a2c6ccb671e4bdac","other":"194ea3e14dc5d99f98d15607dc4c405769f5a371acc22d41a62d0537d716be32","up":true},{"one":"a606c79a018a6535375d851fcc82c42cc7c952720aa120434cedccf4a4be1f59","other":"a7a856a43293aa3004848a86f187e09343bd605e1a93e853a6f6b6b1031bd667","up":true},{"one":"7d162a11662585f8c38d88fb241623e67bacf90703065dae6c092b4b507d6543","other":"7895b2cb97b473f8893cc70a4421e0f8be1c033b27cd730fa13438b7a8f3fcb5","up":true},{"one":"aaf051a087a92f874a3f6c7923015e4cffb4bb3ef381c977fd902f21e841d0f4","other":"bdc5de01276157a0f3fc43a9cc3b41b2cacc8479118b75aec4ba9b2b7fa86d5e","up":true},{"one":"8862cd85d7039119b984f752a458ac0495ddea98c69fc1d1241db7873a712c11","other":"885427318634c458a3050f2f26eb52454a75cea4a1263b9ed55e6eb899743854","up":true},{"one":"79e5c6c6d78c88c579003cda044882ecb04520fbad1f5feadbe7b6d23fe183c8","other":"7895b2cb97b473f8893cc70a4421e0f8be1c033b27cd730fa13438b7a8f3fcb5","up":true},{"one":"1dc0ef1ce68dc681298177bde808af514efa52a5ad38c9cd2bd61968cdf19cfb","other":"19ea0a685fc4edd298b736dc7a778c9ec4362de378876911105fa9ba2ce90204","up":true},{"one":"bdc5de01276157a0f3fc43a9cc3b41b2cacc8479118b75aec4ba9b2b7fa86d5e","other":"b4a1b687fbdb754fd689e26f0870a7dcab5d76190c06f3ea2ea1e198f8aa5ab2","up":true},{"one":"67585dfd87a005bae9bffc2cccb83c69537247c74886b4fa52287f46c796bcb6","other":"60c5647aed152609979366fb33dc8b28fc60736098ff68d232415889b43dfa58","up":true},{"one":"9959385385aade728d3f5763806596222bc1e7b9946c2c92407943d080b32f8d","other":"885427318634c458a3050f2f26eb52454a75cea4a1263b9ed55e6eb899743854","up":true},{"one":"fc3911383f74a982f6af8ab95a63426b56117d45f153b3c1441459d9191daaff","other":"f2b49a2247c9c5e8f6f755834a37fe5c17f208f994878e14b7001e404f52e125","up":true},{"one":"a6165a4b02d58be116892982c0ed3d49d86fec0e9f436a516b61868331ed853f","other":"aceee75a260d45252060fe971eabd4bde25f912db4a3c6e47f4a09572fe01697","up":true},{"one":"a2e6c900511768c8c9947ab0fa2e73975cf2a4cec7fd15217abdba25c329317e","other":"a8f49e87156fda5510897601689ce968d77032134c523634916b96de16366f9e","up":true},{"one":"7049e92a396311fbf2f4a55bb5bd2fe3f7bb3c1a63f41bb88eb800edd45ac6e5","other":"79e5c6c6d78c88c579003cda044882ecb04520fbad1f5feadbe7b6d23fe183c8","up":true},{"one":"eebd48b367cbfe94a37c0deb274a697e628074f9560b909e66229c5c76ce68eb","other":"b78fd21c063006e2e033d1d00fc21e1ad7ad7951bb5621cec9b56639745d65f9","up":true},{"one":"447cdbf1ff462aa67d6a46085b1a84fdc495a4142ab174c8e69b271b09732b4d","other":"48de553e15afd3e8a46bfc3a5ba8a298158aa3d60f140d2730230af5cce8084d","up":true},{"one":"4d9147e3bf98cb59a7648f616c0d7f713a8cf3b7d25e3115233ff5883128beab","other":"447a411c80fbd422bfa0c358d3f2a1fe6256c05e35acc6350958dfbe62cd5b9b","up":true},{"one":"4cece9bc134bc2b09400c9f7f8a4df9270d2fe3c077c5e441fffc911fcf6f42e","other":"5ac0d00b8d647dec62d26e1a689fd05b8b7a1a79ab8c43493bd6d7d209816df1","up":true},{"one":"8358a74fc8d8e39ccc40b4d3a212b7a69a6a8f6afc25cff2c9c7b44bbaf9ec82","other":"8d192b11538072db750f71204e2e6adf9dc0508d9c5cf1eb457e4e996cd985bc","up":true},{"one":"138dbc1662c4ce9b2b30ef5035914cc70465666fe18f313318e662d13f099621","other":"18e00a7e0f826a1aba3f8c0f533ed905f2eee607b697fff056ee7874d374adcd","up":true},{"one":"c2d00c7d960174c0934129fdcec63525bfa728f78fb70b7c52036b772d6297ad","other":"c74d801e85ac0fd8951480d107b41eddc5c92775614c4886b3f732fa3d1a791d","up":true},{"one":"e09f98114da64e7547b351637190f6621a1f75568cfa9960980fc77618f8855b","other":"e8676d17966625c4fdac6bd9437981a0cf869c8b0010812edf0c79805e0e1ff1","up":true},{"one":"ef99b6cdc05345a1ee82267890e3ccaeef1f2bd2fe7ae8b02b6b20b9a5ef85bb","other":"f6c028d6a2b6408e90169151f4519b561ed183bd8925ed9a1702806f397666e7","up":true},{"one":"8006b080c78a0ab54fa1be75a939bee2334322fded6c3563de1596b17c36172c","other":"834f14e9f325482adef62651ddf3685690dd5ebdd18014f2bd266b2143c290ff","up":true},{"one":"bcf85ecf421b871fca0247a7081188a8e2c08778b88ffad16db37ef024fec0fc","other":"b6dffac4b4eb2974ed0ed241799f97d2e5d9be671e311266826d0dcfecfcc209","up":true},{"one":"c53417f008e4550e1c4cb9a3e2955b3af6403e059b7b4b4c33869d9ed4a580a5","other":"c603138e40fe2f85cc634017956ada6399fca99969e3bf0c1ee8428374e779f1","up":true},{"one":"951877b34ee1535b5059c49beb03e8960ff9c12b694ef64708c77c30ff1dc706","other":"95c0a351fb7aa6683280d159a7b808bfa63f63bff91a1c5936e973b2e5d3954f","up":true},{"one":"3b020c84fb60f59779324d451d9770d683e08133bbaa2d5762f61b8fd4b8d9fd","other":"26ab9c813822dbb4f1a230cd8e99e8ab280b242747deb55fdf93d160906ef331","up":true},{"one":"c190f9d08c78ed6dffadaef36e77fe6aa96099e4453753b0cfc8ec542fa96b9d","other":"ddb8be472c3d48dc4d3d112448e6c0c4a826a18af3f3b53fdfef8cd31053c75f","up":true},{"one":"3c5b2e125020c80e3674df9cac34de4d8f3a94ee02556fb557921b6d5498b933","other":"5c373034770e413e700b1cd03b2035f769ecd9ab8eb54d32f7b2645be1991fe5","up":true},{"one":"cf52b3fc82ec24c3e9b40488d7c5f7ac8af731d159a103619bee932ec74d5e92","other":"ff75b19017c84128f38dec4f63e1f247a5691dc0fae186e667afedb5fe9d2c80","up":true},{"one":"e2d36f335d90ad63148db8e353a78a30d8d9c0abe107be2cf8685f6a01ce74b9","other":"e8676d17966625c4fdac6bd9437981a0cf869c8b0010812edf0c79805e0e1ff1","up":true},{"one":"26acc3c373c29150af30bbc9264d0c44c7c606ff7377399ddf844635e97afcfa","other":"2fd2f77d76cca480ac18e9af7a462f297db168c3370b3bc0e2c04aa006c4d037","up":true},{"one":"c74d801e85ac0fd8951480d107b41eddc5c92775614c4886b3f732fa3d1a791d","other":"d3022a46956e75bca85ba89d97b694a3a64f03ccc2d881ed0cd687d43d486925","up":true},{"one":"5ac0d00b8d647dec62d26e1a689fd05b8b7a1a79ab8c43493bd6d7d209816df1","other":"56635699bd3bc78193adbdb8e8b7c2c91dab4140fdaa506fea2300ee86c4ba81","up":true},{"one":"bfc711793830779f49aa59bc6f7a205ab4e6eae7abfdafbf3bb5a1163a778ab2","other":"aeb45fe10b0dbd0f72ab6a77fbf971a8f46dbcdd96c08f23279d1434b4f38b1d","up":true},{"one":"f305273a7d08e72f69b0b153855e822f252cbbf34a18f305134eed9d1eb7b58a","other":"ff75b19017c84128f38dec4f63e1f247a5691dc0fae186e667afedb5fe9d2c80","up":true},{"one":"24f80c437be45898e594f821bba0f5c62e0c9a0c720118e362ee6f78410612bd","other":"398038811c1c7402fe2e6994c9ce2f15c8166b8e99f379feaaed66ac87702062","up":true},{"one":"025de1d2ec529d3a7da302eef0f8c54996616d40c940c0956d470ffc2a007f33","other":"0111e720a84b310f863c2530fbe149e6a221acbad01065c5d052d2b3e1716f54","up":true},{"one":"8402bd62282811ed236b2fa1f0d41ad4bbe54e420ee34adc6164cfd4baf8658d","other":"80d7e892bbb26808abb1d1530077fec6b08768c151a9f220881da3c862bae0af","up":true},{"one":"dbd4d90e3342ef837b8ecf5c6e490f7c409f419cf36b77162a87cb2cfb8ae33c","other":"c9c302de4afe7b4dcbb6f3e366ce747083f9dcd7d5c6a01b939da5cdc6ccc874","up":true},{"one":"86d6f68ec0b8e1b3406943787f918bee74dd1827998bdb13ece8f690da2d296a","other":"8862cd85d7039119b984f752a458ac0495ddea98c69fc1d1241db7873a712c11","up":true},{"one":"67909bdcaef2330ef120e524c76e1e382b474f3332d86f65282028e051f34c75","other":"7895b2cb97b473f8893cc70a4421e0f8be1c033b27cd730fa13438b7a8f3fcb5","up":true},{"one":"1b1dc3f9312df141855c545dd16aee325f9a609230ec6165bdbbb07d0c0862f6","other":"16868ec5d8f490ac73ea28b4e8fdda55ac149bb1aafb177545b54b84a5ad5367","up":true},{"one":"a5ac04d53b569e418ef5007961431155f2c226ee10157b30af71ea4836b08089","other":"a742e8502c619703ce87890110f908bde32b59dc61d77a247759e5d0056e0c94","up":true},{"one":"d700d96de1193456dc0bcf492c7c11b0951062974af2f7f47b8c901b17c23165","other":"d9cf19895e015cb534d915aed83c0d26bf40a11244027812e17c3bec6e645a8e","up":true},{"one":"52a8747e4ea35f6f50c72d7c481616f68a5e4396248332b8ff69d3a772de49ac","other":"5a8b84df651871fce72d11cb1c26c87ae4a0cc6b4c274d37e70532c94f27288e","up":true},{"one":"1070df5e904e3865085b0319a81761e59146494c689e7567efe7465fc819ae8b","other":"178401ec8d01a0a4f551d23e880a8e8a4eb87773565363843d51cf52660b1211","up":true},{"one":"a9700308516c02cf9aea8809000a4e0596d6b44753e10bd0928df83e2eb9b9e7","other":"bfc711793830779f49aa59bc6f7a205ab4e6eae7abfdafbf3bb5a1163a778ab2","up":true},{"one":"93c0e1adf23fdf1623359eb88c517bc521d5a26325554df890cc04c1fa17a5df","other":"9c8e1f23f260c5a46b0001572675b19e5293ca65e7fdfc131c07612e9c4072fa","up":true},{"one":"a5053958f0cefcff1826bf02525fda98c4dc954cc38690f3c43ecbf0b2ad57af","other":"b8e1a8622c256ef29acd52df7b3ace50820fb1a147716165ff862fdc973a48cd","up":true},{"one":"807416cc70f02d481a188027f7932b48e8f7b5e8258f7e9623f3f6e2985d8f6a","other":"9ec831d97418916fd9695465e041caf27824dbb51d6ff74d6b70f3bd561e70e6","up":true},{"one":"435d721a568eb906a03c69dbd71337251a550521a4004ab5d4a7deb6f317061a","other":"5a8b84df651871fce72d11cb1c26c87ae4a0cc6b4c274d37e70532c94f27288e","up":true},{"one":"56ca9dd846a58a0ffa7b49a88aad559a338ba535a6f738468b8f146c97890cb2","other":"56635699bd3bc78193adbdb8e8b7c2c91dab4140fdaa506fea2300ee86c4ba81","up":true},{"one":"7c7ca5a7522a04f62f2bebd6197a03d78f255d0175c3dfceb5d92b684365b2aa","other":"679554b410e415cfcdf1b14ef87759269b2bcaf07f4541122977db3a40091da2","up":true},{"one":"318828fa893a28cc0652d3f81d97c5b8e023e853685f5d3e65fde20689abcc5a","other":"2a507f5cb921137a7225c9c4988a8514af0f7e3c442cb8bf2bb612dc522a7daf","up":true},{"one":"bbafac5ba5915db3c80e28b249cad260b9b5dad1f728063c48fa8f61d7556e17","other":"b78fd21c063006e2e033d1d00fc21e1ad7ad7951bb5621cec9b56639745d65f9","up":true},{"one":"f215bc09268e60ebbec76f743bebd09d7e72d4cbeedc0b9d3417bb4a2ef42935","other":"e8676d17966625c4fdac6bd9437981a0cf869c8b0010812edf0c79805e0e1ff1","up":true},{"one":"68cbc4a5313080d5dca8ad34e8bf52a6144e0ff8ef3f795d7ae9d5f644fe2042","other":"70f68562733da4e3b1c3949fb6e11ac0bdd49ea7e732925f937f87df5af698d6","up":true},{"one":"a3309f8b8bba4d8fbd7c6193d7671cb907b94e71155ef6138e0248682ff00e58","other":"a6165a4b02d58be116892982c0ed3d49d86fec0e9f436a516b61868331ed853f","up":true},{"one":"7d162a11662585f8c38d88fb241623e67bacf90703065dae6c092b4b507d6543","other":"793322608055d4873776a9a0a6c40b04379bfd2f289a8ad49a7dc456bc65f871","up":true},{"one":"8862cd85d7039119b984f752a458ac0495ddea98c69fc1d1241db7873a712c11","other":"807416cc70f02d481a188027f7932b48e8f7b5e8258f7e9623f3f6e2985d8f6a","up":true},{"one":"09b3fa30780931e18b92c75d1cdeafa365609c565e4e8c253d393835cb82d98e","other":"0111e720a84b310f863c2530fbe149e6a221acbad01065c5d052d2b3e1716f54","up":true},{"one":"178401ec8d01a0a4f551d23e880a8e8a4eb87773565363843d51cf52660b1211","other":"0d1c35c6ea485cb33857b790ee262f974cf0d54cf8ce3003f8308ac2e87c2c25","up":true},{"one":"07f5d094a4b22e73cdd6c85452b3d928da9b4b16873824759cb7e8a622417fd5","other":"305162c472c71ddef2320b138102b67d1ce2b8bba79e2e587fc80e085c88e547","up":true},{"one":"7c464054ea7b6c9ea0c7d4c209769c92f294a9db2ca159b8ef168e310a1eac3a","other":"7e47a2f82984a600c8583605a91d5cb8f2d9a18961845e9c422edd78e20ac3a3","up":true},{"one":"994839e5f3a5b8b23aed84fb029413124af17804b79b0263ec6bfd5aec5dad78","other":"95c0a351fb7aa6683280d159a7b808bfa63f63bff91a1c5936e973b2e5d3954f","up":true},{"one":"4b79e83186f2ab05932eaa99982a2e53373b83780e32d224d15cb2c85462451f","other":"4d9147e3bf98cb59a7648f616c0d7f713a8cf3b7d25e3115233ff5883128beab","up":true},{"one":"398038811c1c7402fe2e6994c9ce2f15c8166b8e99f379feaaed66ac87702062","other":"2fd2f77d76cca480ac18e9af7a462f297db168c3370b3bc0e2c04aa006c4d037","up":true},{"one":"d95965e449dd4069876384cf4b34f986731e255a7948f0a862d229b1dddbc502","other":"ddb8be472c3d48dc4d3d112448e6c0c4a826a18af3f3b53fdfef8cd31053c75f","up":true},{"one":"81a5a07f92f813e85b501b0028e1caa6e6a6c7efa5195ecb693cd2d91d5132a0","other":"8e282b0f27d4fa56fe14cfeb69fac5a53e3d882c7778eb190653e2eab7c93fd2","up":true},{"one":"ab3ff955033c0a2615932faf85fd20090b9121c7edcc8e6f7ce4c4fde0a96b8a","other":"aeb45fe10b0dbd0f72ab6a77fbf971a8f46dbcdd96c08f23279d1434b4f38b1d","up":true},{"one":"5a26ae73eebf27f6dbec2414f1277a249e814a7a06790d7061610e5227b086f6","other":"6c0142984d629ae6995894de9e7e5eb8d3fe45e1641d7ebd63959d2e61548ba3","up":true},{"one":"a606c79a018a6535375d851fcc82c42cc7c952720aa120434cedccf4a4be1f59","other":"a2e6c900511768c8c9947ab0fa2e73975cf2a4cec7fd15217abdba25c329317e","up":true},{"one":"8358a74fc8d8e39ccc40b4d3a212b7a69a6a8f6afc25cff2c9c7b44bbaf9ec82","other":"80d7e892bbb26808abb1d1530077fec6b08768c151a9f220881da3c862bae0af","up":true},{"one":"a1c85ee75edb807a01f4ce930086c948918aade324752609b078c28991c04e86","other":"a4ee49bb2caabb6b9448bcdff1fc3cc673a2db04eab9f5c62d1787f2c25990a0","up":true},{"one":"951877b34ee1535b5059c49beb03e8960ff9c12b694ef64708c77c30ff1dc706","other":"9ec831d97418916fd9695465e041caf27824dbb51d6ff74d6b70f3bd561e70e6","up":true},{"one":"c53417f008e4550e1c4cb9a3e2955b3af6403e059b7b4b4c33869d9ed4a580a5","other":"2c85f5361b2d5abcf799de50fe58b1ed2006ea18f75823748c33eb7e95b1cc39","up":true},{"one":"3b020c84fb60f59779324d451d9770d683e08133bbaa2d5762f61b8fd4b8d9fd","other":"5c373034770e413e700b1cd03b2035f769ecd9ab8eb54d32f7b2645be1991fe5","up":true},{"one":"837f0993f6374039a5ad4472d6313e647a4c5db4583bd27ccfa98d3448a17731","other":"8d192b11538072db750f71204e2e6adf9dc0508d9c5cf1eb457e4e996cd985bc","up":true},{"one":"56635699bd3bc78193adbdb8e8b7c2c91dab4140fdaa506fea2300ee86c4ba81","other":"68cbc4a5313080d5dca8ad34e8bf52a6144e0ff8ef3f795d7ae9d5f644fe2042","up":true},{"one":"eff2450bea797ff66d93e7c1c1b0977cddf3abba64bfa51bcc509d728569e2fa","other":"ed424d24d702520bf7cb5f6babbdc43a078435fb4a9884ed82a93d642839e127","up":true},{"one":"482ec3dc05460579ea9bce87677bd3d9a1930e801fabeba607b8ab6b8729ff15","other":"4d9147e3bf98cb59a7648f616c0d7f713a8cf3b7d25e3115233ff5883128beab","up":true},{"one":"fc3911383f74a982f6af8ab95a63426b56117d45f153b3c1441459d9191daaff","other":"e471efbcf1def3915b3dda2dc65a86945c607be54a33e31e9625549becac0e34","up":true},{"one":"7ce7fec833a2e8c7720fcc97f820f2ca2aca85388210f887c3efe78b020766e7","other":"7895b2cb97b473f8893cc70a4421e0f8be1c033b27cd730fa13438b7a8f3fcb5","up":true},{"one":"3938e6b2c095084dc9975a3e8649133557495d34ac6df874c6d929266e3ffe6f","other":"1dc0ef1ce68dc681298177bde808af514efa52a5ad38c9cd2bd61968cdf19cfb","up":true},{"one":"86d6f68ec0b8e1b3406943787f918bee74dd1827998bdb13ece8f690da2d296a","other":"8d192b11538072db750f71204e2e6adf9dc0508d9c5cf1eb457e4e996cd985bc","up":true},{"one":"e471efbcf1def3915b3dda2dc65a86945c607be54a33e31e9625549becac0e34","other":"eb686a686fd70e41659cc69ec0db53d1512dfec238918afd0a515d8ce177d4d9","up":true},{"one":"244c3c954ac612e51d4945ab9b77f0b4a3983285e8add7921777e0c45a1bf338","other":"30feca631f06041cb14cead384dfaa5fffa6dc34b0cee54230efbe15e56a5884","up":true},{"one":"30feca631f06041cb14cead384dfaa5fffa6dc34b0cee54230efbe15e56a5884","other":"36b93656cab02213fa76124af6251109356abc5e0ae5dd1e203c6a013e014548","up":true},{"one":"0e2b48558ce2af1fbfee38a557d56072e3091cfcaee8d7847c7c9dcf7bef9bfa","other":"05949ec1a582fa70cab95c59e7c0d315583bf9fc320c60c35268931f21e90853","up":true},{"one":"9c21cb3e56f8ac66a7917a9ba14e58f77e998ac70c178b88b5053d9ac2777e60","other":"a8b58013ff911871d1aa6c2bbea6c2e6ef9b00b87b80a41dc04724ad0488e2ff","up":true},{"one":"a9700308516c02cf9aea8809000a4e0596d6b44753e10bd0928df83e2eb9b9e7","other":"84a9db7645c792dc38c1f2113a8f0590d04e1c94d9a8c464ab0ec8219303d966","up":true},{"one":"a5053958f0cefcff1826bf02525fda98c4dc954cc38690f3c43ecbf0b2ad57af","other":"aeb45fe10b0dbd0f72ab6a77fbf971a8f46dbcdd96c08f23279d1434b4f38b1d","up":true},{"one":"48d79ac55f8df512af8e7d868aa40ac9b61493fa4f1b0ce0b76bf6da2eb30e78","other":"50c1a8023bfecffb09472fdc50898f4d050a31443d40a6c07b629090beb0df3d","up":true},{"one":"f9ded7b83e473e71be2fc0101d574c44521c96f77f9f84a384785a3af6b1093d","other":"e8676d17966625c4fdac6bd9437981a0cf869c8b0010812edf0c79805e0e1ff1","up":true},{"one":"435d721a568eb906a03c69dbd71337251a550521a4004ab5d4a7deb6f317061a","other":"44adaabf9c46608a374ed816d3c40c63b6645f4f6e033a76431bc8f88713eb41","up":true},{"one":"9959385385aade728d3f5763806596222bc1e7b9946c2c92407943d080b32f8d","other":"9f7d72b7d9843872904b841e421985082428fba5010db27dd871ed76630a1e1d","up":true},{"one":"51440ab47fc5076c00cad16a542b846c26b3281ecea4dbca795ae9b80183ec90","other":"50c1a8023bfecffb09472fdc50898f4d050a31443d40a6c07b629090beb0df3d","up":true},{"one":"b659418885032905ea20ad47d70470e403e7e407e0e9ebf9277f9a2d81ec121c","other":"b78fd21c063006e2e033d1d00fc21e1ad7ad7951bb5621cec9b56639745d65f9","up":true},{"one":"2e65d05648b798fafbc9bb582c05e6f8f891131260e8c90ca725ddcbc823f315","other":"398038811c1c7402fe2e6994c9ce2f15c8166b8e99f379feaaed66ac87702062","up":true},{"one":"08bd1e049859b4a7c8078ca9741fe3daa668b9fe478da06d1a435cd5566b3e11","other":"0d1c35c6ea485cb33857b790ee262f974cf0d54cf8ce3003f8308ac2e87c2c25","up":true},{"one":"1b1dc3f9312df141855c545dd16aee325f9a609230ec6165bdbbb07d0c0862f6","other":"194ea3e14dc5d99f98d15607dc4c405769f5a371acc22d41a62d0537d716be32","up":true},{"one":"9f7d72b7d9843872904b841e421985082428fba5010db27dd871ed76630a1e1d","other":"994839e5f3a5b8b23aed84fb029413124af17804b79b0263ec6bfd5aec5dad78","up":true},{"one":"c8ea4177420785926e0929701f5e74c744920386f2a43b89d83c8281106cb95e","other":"08f84878e44fed2adb4b2685b9f293dc3c73d5f9bc1c474870d943ec2ae73dbe","up":true},{"one":"f2b49a2247c9c5e8f6f755834a37fe5c17f208f994878e14b7001e404f52e125","other":"cd6c8b42a0b092f41e6925577c9de7d1bea17231bcb3d08f3d3cce9c6fdcf22d","up":true},{"one":"0e3b7722f3f84d83b3d744bea4e893715a01d4df3cf4a1c6a6823a1f5c9ad6b8","other":"0d1c35c6ea485cb33857b790ee262f974cf0d54cf8ce3003f8308ac2e87c2c25","up":true},{"one":"7d162a11662585f8c38d88fb241623e67bacf90703065dae6c092b4b507d6543","other":"2fd2f77d76cca480ac18e9af7a462f297db168c3370b3bc0e2c04aa006c4d037","up":true},{"one":"bfc711793830779f49aa59bc6f7a205ab4e6eae7abfdafbf3bb5a1163a778ab2","other":"a0c88ba70599b0e72c18fa6aedd14d607cca3e9a49a5d50165d084e70328c2dd","up":true},{"one":"e09f98114da64e7547b351637190f6621a1f75568cfa9960980fc77618f8855b","other":"ec90a22f41ee659d5759a497946ac2991c916f00fe7caeeeb0908f3af1fe60b6","up":true},{"one":"87a337622455ae65daf3ab2555cee8985e9aa14bac245545d985296060e4a8de","other":"80d7e892bbb26808abb1d1530077fec6b08768c151a9f220881da3c862bae0af","up":true},{"one":"70f68562733da4e3b1c3949fb6e11ac0bdd49ea7e732925f937f87df5af698d6","other":"79e5c6c6d78c88c579003cda044882ecb04520fbad1f5feadbe7b6d23fe183c8","up":true},{"one":"dbd4d90e3342ef837b8ecf5c6e490f7c409f419cf36b77162a87cb2cfb8ae33c","other":"c96146ee47ec7cd74551cf74f00213bc337d643c4327393f0e6848ecd4a0f8d3","up":true},{"one":"43c9e1571c460cb9f599fa8ed79ddd0f9c3a21fd2fa455e0603109c55012f76b","other":"43d43e9ebcbceb4830fc1d2d5024650b90698306bbd2c4d0b4841a1a8fd09c93","up":true},{"one":"5bd8faf93bcad07006e9426b45f5cc599f1963ab791deac4ff63d6739cd62a17","other":"5a26ae73eebf27f6dbec2414f1277a249e814a7a06790d7061610e5227b086f6","up":true},{"one":"ab3ff955033c0a2615932faf85fd20090b9121c7edcc8e6f7ce4c4fde0a96b8a","other":"a8f49e87156fda5510897601689ce968d77032134c523634916b96de16366f9e","up":true},{"one":"67909bdcaef2330ef120e524c76e1e382b474f3332d86f65282028e051f34c75","other":"679554b410e415cfcdf1b14ef87759269b2bcaf07f4541122977db3a40091da2","up":true},{"one":"3f31ecaffaa6311c82c9a575bbc38d6bcb16630ac87e19d1853a64aa96c9dcde","other":"36b93656cab02213fa76124af6251109356abc5e0ae5dd1e203c6a013e014548","up":true},{"one":"c53417f008e4550e1c4cb9a3e2955b3af6403e059b7b4b4c33869d9ed4a580a5","other":"244c3c954ac612e51d4945ab9b77f0b4a3983285e8add7921777e0c45a1bf338","up":true},{"one":"a2e6c900511768c8c9947ab0fa2e73975cf2a4cec7fd15217abdba25c329317e","other":"a8ff8d69dcb36462d1116dafa5e3d0c7237bf65dbece482a316862c8d66e35b6","up":true},{"one":"4a95d49f58057b039b55a34f67a348c052f61770065e41243ff055efc570a935","other":"402cf9d0bffa017ebea34ede11207f3366b3ea450c0428029129a8e8026abbe7","up":true},{"one":"d3022a46956e75bca85ba89d97b694a3a64f03ccc2d881ed0cd687d43d486925","other":"cd6c8b42a0b092f41e6925577c9de7d1bea17231bcb3d08f3d3cce9c6fdcf22d","up":true},{"one":"3b020c84fb60f59779324d451d9770d683e08133bbaa2d5762f61b8fd4b8d9fd","other":"318828fa893a28cc0652d3f81d97c5b8e023e853685f5d3e65fde20689abcc5a","up":true},{"one":"1dc0ef1ce68dc681298177bde808af514efa52a5ad38c9cd2bd61968cdf19cfb","other":"3c5b2e125020c80e3674df9cac34de4d8f3a94ee02556fb557921b6d5498b933","up":true},{"one":"8358a74fc8d8e39ccc40b4d3a212b7a69a6a8f6afc25cff2c9c7b44bbaf9ec82","other":"8862cd85d7039119b984f752a458ac0495ddea98c69fc1d1241db7873a712c11","up":true},{"one":"a8ff8d69dcb36462d1116dafa5e3d0c7237bf65dbece482a316862c8d66e35b6","other":"a7a856a43293aa3004848a86f187e09343bd605e1a93e853a6f6b6b1031bd667","up":true},{"one":"52a8747e4ea35f6f50c72d7c481616f68a5e4396248332b8ff69d3a772de49ac","other":"50c1a8023bfecffb09472fdc50898f4d050a31443d40a6c07b629090beb0df3d","up":true},{"one":"a8f49e87156fda5510897601689ce968d77032134c523634916b96de16366f9e","other":"8f9aa2cd33d18e7cb4494d11a7532c97eb4a1cae172b2165c26ae4ed24887c0d","up":true},{"one":"244c3c954ac612e51d4945ab9b77f0b4a3983285e8add7921777e0c45a1bf338","other":"26ab9c813822dbb4f1a230cd8e99e8ab280b242747deb55fdf93d160906ef331","up":true},{"one":"fc514c43c4eb5c62798458da5d622e9248a6e530e4288cd902019aa05c4374d8","other":"f8ff7440d6f4abb1c89496336843741ed53a544cedeeed71d8ebe0b08698438d","up":true},{"one":"679554b410e415cfcdf1b14ef87759269b2bcaf07f4541122977db3a40091da2","other":"6e7f1f3d65364399617a4d95fdd04f2ca9b007b2366943e7ba5acd4616a7a425","up":true},{"one":"025de1d2ec529d3a7da302eef0f8c54996616d40c940c0956d470ffc2a007f33","other":"019109311d4888497aa194cce4a89b5ef243421cf0e7e7bb9115d086e1a1f7d7","up":true},{"one":"4d381014783980b2f77f0d71160ad9e9d84672b576f4435ccdbae12752350c1c","other":"43c9e1571c460cb9f599fa8ed79ddd0f9c3a21fd2fa455e0603109c55012f76b","up":true},{"one":"f6c028d6a2b6408e90169151f4519b561ed183bd8925ed9a1702806f397666e7","other":"c53417f008e4550e1c4cb9a3e2955b3af6403e059b7b4b4c33869d9ed4a580a5","up":true},{"one":"834f14e9f325482adef62651ddf3685690dd5ebdd18014f2bd266b2143c290ff","other":"807416cc70f02d481a188027f7932b48e8f7b5e8258f7e9623f3f6e2985d8f6a","up":true},{"one":"ef99b6cdc05345a1ee82267890e3ccaeef1f2bd2fe7ae8b02b6b20b9a5ef85bb","other":"e8676d17966625c4fdac6bd9437981a0cf869c8b0010812edf0c79805e0e1ff1","up":true},{"one":"c42e6492879439eeecd9938d17ff283fd8f5f24206906ca512b4daa4803b78b4","other":"ff75b19017c84128f38dec4f63e1f247a5691dc0fae186e667afedb5fe9d2c80","up":true},{"one":"c9c302de4afe7b4dcbb6f3e366ce747083f9dcd7d5c6a01b939da5cdc6ccc874","other":"cd6c8b42a0b092f41e6925577c9de7d1bea17231bcb3d08f3d3cce9c6fdcf22d","up":true},{"one":"1dec77c2f4caf053c2d0524ae34a2d970bf4743a0d009d8fc543077ddfdfe3d0","other":"16868ec5d8f490ac73ea28b4e8fdda55ac149bb1aafb177545b54b84a5ad5367","up":true},{"one":"b3f95f225e2b6b76e6c7ef7c86caf83e35213f6a22da41e653ca1c190be23c9c","other":"bfc711793830779f49aa59bc6f7a205ab4e6eae7abfdafbf3bb5a1163a778ab2","up":true},{"one":"951877b34ee1535b5059c49beb03e8960ff9c12b694ef64708c77c30ff1dc706","other":"9f7d72b7d9843872904b841e421985082428fba5010db27dd871ed76630a1e1d","up":true},{"one":"e2d36f335d90ad63148db8e353a78a30d8d9c0abe107be2cf8685f6a01ce74b9","other":"e2770cef7c1ad312b70d94ca5570e45f324c798a31a93203f505167aeab122b6","up":true},{"one":"397a0a0e9fadcb571acd8981f5bfe8e059e707e0feae8a9c4c6bfe87bd39e66a","other":"1bd588263274543729d54529ae9e9bf4596db40649a1c2a3f73168d818f34b62","up":true},{"one":"51440ab47fc5076c00cad16a542b846c26b3281ecea4dbca795ae9b80183ec90","other":"447a411c80fbd422bfa0c358d3f2a1fe6256c05e35acc6350958dfbe62cd5b9b","up":true},{"one":"46bfa8bea56b0be1abfa5ad3561bb6bf49ed6695d83ee2b2c192c5a0408347cf","other":"50c1a8023bfecffb09472fdc50898f4d050a31443d40a6c07b629090beb0df3d","up":true},{"one":"8e7b96d28edae711e1a4cee0d894e0bd92cdf410ba6f61713f7d9b0bee761d4c","other":"8b4318f86ad47976321af97bfbf95cd0a3b0aa22447aeb0611ed1a9bf1e6a4bf","up":true},{"one":"3728152c88f1e5e61f6523b09e8f3bb1023b700deccdca5fcc1e6488136b0e57","other":"31e670638acba3d58f4c67f3ff2f3f25d769e8a5d7a7838927f4d9d169a84404","up":true},{"one":"48f1ca6d433019f932fa4ae03e0decbcbea3fe635edff4458a669b83f8162b9a","other":"4d9147e3bf98cb59a7648f616c0d7f713a8cf3b7d25e3115233ff5883128beab","up":true},{"one":"1addd4a9f01486212e13e43a9650b7f793617d1cb59fb8d941270d7ae55f575f","other":"1bd588263274543729d54529ae9e9bf4596db40649a1c2a3f73168d818f34b62","up":true},{"one":"6dd3ac0fd9a04a2ce75875c683d135e52eaa1670cb55e78711620712e60fde47","other":"56635699bd3bc78193adbdb8e8b7c2c91dab4140fdaa506fea2300ee86c4ba81","up":true},{"one":"1b1dc3f9312df141855c545dd16aee325f9a609230ec6165bdbbb07d0c0862f6","other":"1fd0192df1fbf33771ca575afbb4e27c6541cce4a3cff2dfc1f2c085e7fab79e","up":true},{"one":"f7561cb6740e17ec7c7d17068251b2c951d954c77804aa5af60464e9c3964e57","other":"e2770cef7c1ad312b70d94ca5570e45f324c798a31a93203f505167aeab122b6","up":true},{"one":"af02c2f471e96ab8defbd229215695b95e64f7c78b145b6793a238961f556fbf","other":"be68267d77fb52424227267c665ca1193a010334cac057338aca77b49a4b94da","up":true},{"one":"f9ded7b83e473e71be2fc0101d574c44521c96f77f9f84a384785a3af6b1093d","other":"fa240411bc4f3e44dfca3faedd112c7743a67b522a910bc99696ef0b31732ee2","up":true},{"one":"e09f98114da64e7547b351637190f6621a1f75568cfa9960980fc77618f8855b","other":"e2770cef7c1ad312b70d94ca5570e45f324c798a31a93203f505167aeab122b6","up":true},{"one":"d3e913cf4a7dabfb5699131b65e533a40adb46ea37e0ed4ce9433f99015986ef","other":"d95965e449dd4069876384cf4b34f986731e255a7948f0a862d229b1dddbc502","up":true},{"one":"3938e6b2c095084dc9975a3e8649133557495d34ac6df874c6d929266e3ffe6f","other":"5c373034770e413e700b1cd03b2035f769ecd9ab8eb54d32f7b2645be1991fe5","up":true},{"one":"5814be13c8550b9a5a83d08e7af6022002a8fdaa38ba6c2c30be58099a9f7744","other":"5c373034770e413e700b1cd03b2035f769ecd9ab8eb54d32f7b2645be1991fe5","up":true},{"one":"07f5d094a4b22e73cdd6c85452b3d928da9b4b16873824759cb7e8a622417fd5","other":"012ba278d582691241875c4c14ead91fff3983e190df7d9b43ade384e84c11fb","up":true},{"one":"4cece9bc134bc2b09400c9f7f8a4df9270d2fe3c077c5e441fffc911fcf6f42e","other":"4a95d49f58057b039b55a34f67a348c052f61770065e41243ff055efc570a935","up":true},{"one":"a742e8502c619703ce87890110f908bde32b59dc61d77a247759e5d0056e0c94","other":"a2a163ce2cb092b411c994cc5d5ef555d539d2dcf4e7e1aeb528d2216dc481e5","up":true},{"one":"318828fa893a28cc0652d3f81d97c5b8e023e853685f5d3e65fde20689abcc5a","other":"31e129ab3df7e082cc27c649d9ee29a3ea646d6a97d2417875b80e3ff576c047","up":true},{"one":"094256812084c6052a2604149aa3aba2379c483bf4ec25162f6b43934942775a","other":"08e5a268f397385c69a7fec855ae4d889cfa98afef5b7c09fc4841e3f8894ad8","up":true},{"one":"056152dd9dae85c426378d34acab8d6641da665d2f57359a27a0ff652f3f3d02","other":"09b3fa30780931e18b92c75d1cdeafa365609c565e4e8c253d393835cb82d98e","up":true},{"one":"a5053958f0cefcff1826bf02525fda98c4dc954cc38690f3c43ecbf0b2ad57af","other":"bfc711793830779f49aa59bc6f7a205ab4e6eae7abfdafbf3bb5a1163a778ab2","up":true},{"one":"8006b080c78a0ab54fa1be75a939bee2334322fded6c3563de1596b17c36172c","other":"86d6f68ec0b8e1b3406943787f918bee74dd1827998bdb13ece8f690da2d296a","up":true},{"one":"c42e6492879439eeecd9938d17ff283fd8f5f24206906ca512b4daa4803b78b4","other":"c603138e40fe2f85cc634017956ada6399fca99969e3bf0c1ee8428374e779f1","up":true},{"one":"7660828fb0c8f89201d34e6f4d61cc6ba9a30cead6e4eb8253f6cc92e1845f23","other":"70f68562733da4e3b1c3949fb6e11ac0bdd49ea7e732925f937f87df5af698d6","up":true},{"one":"435d721a568eb906a03c69dbd71337251a550521a4004ab5d4a7deb6f317061a","other":"4a95d49f58057b039b55a34f67a348c052f61770065e41243ff055efc570a935","up":true},{"one":"08bd1e049859b4a7c8078ca9741fe3daa668b9fe478da06d1a435cd5566b3e11","other":"0cfc7309afabceeb7d248714e972cf3987205324f5ab8d048d17bea5dc87369d","up":true},{"one":"34118166845c185d15c286b7e5433539ee98ed634baabd534d57369fd5f7c681","other":"26ab9c813822dbb4f1a230cd8e99e8ab280b242747deb55fdf93d160906ef331","up":true},{"one":"447cdbf1ff462aa67d6a46085b1a84fdc495a4142ab174c8e69b271b09732b4d","other":"482ec3dc05460579ea9bce87677bd3d9a1930e801fabeba607b8ab6b8729ff15","up":true},{"one":"8ea2c8acc111f38d5b4a5ed60252ee83f312d0f8359265d5b9266d54735052fe","other":"8e7b96d28edae711e1a4cee0d894e0bd92cdf410ba6f61713f7d9b0bee761d4c","up":true},{"one":"f6c028d6a2b6408e90169151f4519b561ed183bd8925ed9a1702806f397666e7","other":"c42e6492879439eeecd9938d17ff283fd8f5f24206906ca512b4daa4803b78b4","up":true},{"one":"c272b12f4020ae5b20e3d29cd09de03fa0088e3eeb5f07aa7728b29a3e90e687","other":"f6c028d6a2b6408e90169151f4519b561ed183bd8925ed9a1702806f397666e7","up":true},{"one":"ef99b6cdc05345a1ee82267890e3ccaeef1f2bd2fe7ae8b02b6b20b9a5ef85bb","other":"e2770cef7c1ad312b70d94ca5570e45f324c798a31a93203f505167aeab122b6","up":true},{"one":"7e47a2f82984a600c8583605a91d5cb8f2d9a18961845e9c422edd78e20ac3a3","other":"7850f5ee5048959559b3af0f95689669b250fc3aa58bcc9544dca61ca9c9769c","up":true},{"one":"93c0e1adf23fdf1623359eb88c517bc521d5a26325554df890cc04c1fa17a5df","other":"9ca1fd5d41975acb905f337997922849b4070360e47849bb4fd8cd1b9ddb4d73","up":true},{"one":"b3f95f225e2b6b76e6c7ef7c86caf83e35213f6a22da41e653ca1c190be23c9c","other":"be68267d77fb52424227267c665ca1193a010334cac057338aca77b49a4b94da","up":true},{"one":"16868ec5d8f490ac73ea28b4e8fdda55ac149bb1aafb177545b54b84a5ad5367","other":"096a8302b6f369c28ed9d47719a507ead8a3cc1ca4fa1e32318b7f97873955fe","up":true},{"one":"994839e5f3a5b8b23aed84fb029413124af17804b79b0263ec6bfd5aec5dad78","other":"885427318634c458a3050f2f26eb52454a75cea4a1263b9ed55e6eb899743854","up":true},{"one":"09b3fa30780931e18b92c75d1cdeafa365609c565e4e8c253d393835cb82d98e","other":"019109311d4888497aa194cce4a89b5ef243421cf0e7e7bb9115d086e1a1f7d7","up":true},{"one":"5ac0d00b8d647dec62d26e1a689fd05b8b7a1a79ab8c43493bd6d7d209816df1","other":"5bd8faf93bcad07006e9426b45f5cc599f1963ab791deac4ff63d6739cd62a17","up":true},{"one":"1addd4a9f01486212e13e43a9650b7f793617d1cb59fb8d941270d7ae55f575f","other":"1fd0192df1fbf33771ca575afbb4e27c6541cce4a3cff2dfc1f2c085e7fab79e","up":true},{"one":"3a628ef171c1f26fa0966eb89210be0a14305aae8bfed10f4ed9017698f40f4b","other":"2c85f5361b2d5abcf799de50fe58b1ed2006ea18f75823748c33eb7e95b1cc39","up":true},{"one":"9c21cb3e56f8ac66a7917a9ba14e58f77e998ac70c178b88b5053d9ac2777e60","other":"80735a728720bba0ac08daaccd093370d672a8f9a50845ad78ccd6cf8686c39f","up":true},{"one":"af02c2f471e96ab8defbd229215695b95e64f7c78b145b6793a238961f556fbf","other":"a2a163ce2cb092b411c994cc5d5ef555d539d2dcf4e7e1aeb528d2216dc481e5","up":true},{"one":"f9ded7b83e473e71be2fc0101d574c44521c96f77f9f84a384785a3af6b1093d","other":"eff2450bea797ff66d93e7c1c1b0977cddf3abba64bfa51bcc509d728569e2fa","up":true},{"one":"bdc5de01276157a0f3fc43a9cc3b41b2cacc8479118b75aec4ba9b2b7fa86d5e","other":"a0c88ba70599b0e72c18fa6aedd14d607cca3e9a49a5d50165d084e70328c2dd","up":true},{"one":"e09f98114da64e7547b351637190f6621a1f75568cfa9960980fc77618f8855b","other":"e6812448728b4bda5962adceb1707b29f661d3d1a6b2ccd5f8183c9a1f4d01b6","up":true},{"one":"8f9aa2cd33d18e7cb4494d11a7532c97eb4a1cae172b2165c26ae4ed24887c0d","other":"d9cf19895e015cb534d915aed83c0d26bf40a11244027812e17c3bec6e645a8e","up":true},{"one":"5bd8faf93bcad07006e9426b45f5cc599f1963ab791deac4ff63d6739cd62a17","other":"447a411c80fbd422bfa0c358d3f2a1fe6256c05e35acc6350958dfbe62cd5b9b","up":true},{"one":"67f383e5334e9b6701d1dbb20876d4ba9a7e578af0476caed4a7e1b701f2bedb","other":"6dd3ac0fd9a04a2ce75875c683d135e52eaa1670cb55e78711620712e60fde47","up":true},{"one":"648a96d61898eb2d336ff7d5a229cfeb7b9f587282e40f9fe640e181ae26bdd3","other":"6b4ee1b73942ced78f97c0d0e221209933e63ae7353bb9ab3d37ac4127592e86","up":true},{"one":"80735a728720bba0ac08daaccd093370d672a8f9a50845ad78ccd6cf8686c39f","other":"9ec831d97418916fd9695465e041caf27824dbb51d6ff74d6b70f3bd561e70e6","up":true},{"one":"48d79ac55f8df512af8e7d868aa40ac9b61493fa4f1b0ce0b76bf6da2eb30e78","other":"402cf9d0bffa017ebea34ede11207f3366b3ea450c0428029129a8e8026abbe7","up":true},{"one":"d408bb6f7af1590e1f162ce02cc016b1b86ede29851caa32434212ffa2a377c8","other":"d3022a46956e75bca85ba89d97b694a3a64f03ccc2d881ed0cd687d43d486925","up":true},{"one":"36b93656cab02213fa76124af6251109356abc5e0ae5dd1e203c6a013e014548","other":"31e670638acba3d58f4c67f3ff2f3f25d769e8a5d7a7838927f4d9d169a84404","up":true},{"one":"48f1ca6d433019f932fa4ae03e0decbcbea3fe635edff4458a669b83f8162b9a","other":"402cf9d0bffa017ebea34ede11207f3366b3ea450c0428029129a8e8026abbe7","up":true},{"one":"c42e6492879439eeecd9938d17ff283fd8f5f24206906ca512b4daa4803b78b4","other":"c74d801e85ac0fd8951480d107b41eddc5c92775614c4886b3f732fa3d1a791d","up":true},{"one":"244c3c954ac612e51d4945ab9b77f0b4a3983285e8add7921777e0c45a1bf338","other":"2e65d05648b798fafbc9bb582c05e6f8f891131260e8c90ca725ddcbc823f315","up":true},{"one":"3938e6b2c095084dc9975a3e8649133557495d34ac6df874c6d929266e3ffe6f","other":"26ab9c813822dbb4f1a230cd8e99e8ab280b242747deb55fdf93d160906ef331","up":true},{"one":"aaf051a087a92f874a3f6c7923015e4cffb4bb3ef381c977fd902f21e841d0f4","other":"a8b58013ff911871d1aa6c2bbea6c2e6ef9b00b87b80a41dc04724ad0488e2ff","up":true},{"one":"3b020c84fb60f59779324d451d9770d683e08133bbaa2d5762f61b8fd4b8d9fd","other":"6b4ee1b73942ced78f97c0d0e221209933e63ae7353bb9ab3d37ac4127592e86","up":true},{"one":"e2d36f335d90ad63148db8e353a78a30d8d9c0abe107be2cf8685f6a01ce74b9","other":"ff75b19017c84128f38dec4f63e1f247a5691dc0fae186e667afedb5fe9d2c80","up":true},{"one":"a8b58013ff911871d1aa6c2bbea6c2e6ef9b00b87b80a41dc04724ad0488e2ff","other":"aeb45fe10b0dbd0f72ab6a77fbf971a8f46dbcdd96c08f23279d1434b4f38b1d","up":true},{"one":"5c373034770e413e700b1cd03b2035f769ecd9ab8eb54d32f7b2645be1991fe5","other":"3a628ef171c1f26fa0966eb89210be0a14305aae8bfed10f4ed9017698f40f4b","up":true},{"one":"7e47a2f82984a600c8583605a91d5cb8f2d9a18961845e9c422edd78e20ac3a3","other":"5a26ae73eebf27f6dbec2414f1277a249e814a7a06790d7061610e5227b086f6","up":true},{"one":"b4a1b687fbdb754fd689e26f0870a7dcab5d76190c06f3ea2ea1e198f8aa5ab2","other":"b78fd21c063006e2e033d1d00fc21e1ad7ad7951bb5621cec9b56639745d65f9","up":true},{"one":"ab719e60a77ba5253f1690c920df9dd9f3a62071e9cce9d62e0001a522b3409e","other":"a8b58013ff911871d1aa6c2bbea6c2e6ef9b00b87b80a41dc04724ad0488e2ff","up":true},{"one":"4b79e83186f2ab05932eaa99982a2e53373b83780e32d224d15cb2c85462451f","other":"435d721a568eb906a03c69dbd71337251a550521a4004ab5d4a7deb6f317061a","up":true},{"one":"5a8b84df651871fce72d11cb1c26c87ae4a0cc6b4c274d37e70532c94f27288e","other":"447a411c80fbd422bfa0c358d3f2a1fe6256c05e35acc6350958dfbe62cd5b9b","up":true},{"one":"a8ff8d69dcb36462d1116dafa5e3d0c7237bf65dbece482a316862c8d66e35b6","other":"885427318634c458a3050f2f26eb52454a75cea4a1263b9ed55e6eb899743854","up":true},{"one":"0d1c35c6ea485cb33857b790ee262f974cf0d54cf8ce3003f8308ac2e87c2c25","other":"08e5a268f397385c69a7fec855ae4d889cfa98afef5b7c09fc4841e3f8894ad8","up":true},{"one":"07f5d094a4b22e73cdd6c85452b3d928da9b4b16873824759cb7e8a622417fd5","other":"2c8042517dfeaa01586e91e491dd4154fb24c0d84fedb0404b9d5136f60da1d9","up":true},{"one":"435d721a568eb906a03c69dbd71337251a550521a4004ab5d4a7deb6f317061a","other":"482ec3dc05460579ea9bce87677bd3d9a1930e801fabeba607b8ab6b8729ff15","up":true},{"one":"81a5a07f92f813e85b501b0028e1caa6e6a6c7efa5195ecb693cd2d91d5132a0","other":"8358a74fc8d8e39ccc40b4d3a212b7a69a6a8f6afc25cff2c9c7b44bbaf9ec82","up":true},{"one":"e0a0ba7e7e89a7af805e24abde1a5a5b489ba197585051a8755e8c2345c3d57b","other":"f2b49a2247c9c5e8f6f755834a37fe5c17f208f994878e14b7001e404f52e125","up":true},{"one":"08bd1e049859b4a7c8078ca9741fe3daa668b9fe478da06d1a435cd5566b3e11","other":"09b3fa30780931e18b92c75d1cdeafa365609c565e4e8c253d393835cb82d98e","up":true},{"one":"67585dfd87a005bae9bffc2cccb83c69537247c74886b4fa52287f46c796bcb6","other":"648a96d61898eb2d336ff7d5a229cfeb7b9f587282e40f9fe640e181ae26bdd3","up":true},{"one":"86d6f68ec0b8e1b3406943787f918bee74dd1827998bdb13ece8f690da2d296a","other":"9c8e1f23f260c5a46b0001572675b19e5293ca65e7fdfc131c07612e9c4072fa","up":true},{"one":"6d3c6db15900f2596286f81cc0664d2c8291ead5bad2aa35bad515af088a2e48","other":"6e7f1f3d65364399617a4d95fdd04f2ca9b007b2366943e7ba5acd4616a7a425","up":true},{"one":"9b8e6bb3a7fe4dc65ac97404e546d8b777d068c94bc2355f4f1a510ad6c11905","other":"9c21cb3e56f8ac66a7917a9ba14e58f77e998ac70c178b88b5053d9ac2777e60","up":true},{"one":"793322608055d4873776a9a0a6c40b04379bfd2f289a8ad49a7dc456bc65f871","other":"79e5c6c6d78c88c579003cda044882ecb04520fbad1f5feadbe7b6d23fe183c8","up":true},{"one":"3cabd3a567fc4e6f8da66eb35d938fe1e9a7f2bdd2d36c4dc2d0e0e9149f5e56","other":"2c85f5361b2d5abcf799de50fe58b1ed2006ea18f75823748c33eb7e95b1cc39","up":true},{"one":"012ba278d582691241875c4c14ead91fff3983e190df7d9b43ade384e84c11fb","other":"05949ec1a582fa70cab95c59e7c0d315583bf9fc320c60c35268931f21e90853","up":true},{"one":"cf52b3fc82ec24c3e9b40488d7c5f7ac8af731d159a103619bee932ec74d5e92","other":"d700d96de1193456dc0bcf492c7c11b0951062974af2f7f47b8c901b17c23165","up":true},{"one":"834f14e9f325482adef62651ddf3685690dd5ebdd18014f2bd266b2143c290ff","other":"97daf2cbe03c80ce6c4dae39cd071dd93cb32ed245aa9aa77285e12296957ca3","up":true},{"one":"ec90a22f41ee659d5759a497946ac2991c916f00fe7caeeeb0908f3af1fe60b6","other":"b78fd21c063006e2e033d1d00fc21e1ad7ad7951bb5621cec9b56639745d65f9","up":true},{"one":"7c7ca5a7522a04f62f2bebd6197a03d78f255d0175c3dfceb5d92b684365b2aa","other":"6d3c6db15900f2596286f81cc0664d2c8291ead5bad2aa35bad515af088a2e48","up":true},{"one":"c96146ee47ec7cd74551cf74f00213bc337d643c4327393f0e6848ecd4a0f8d3","other":"d3022a46956e75bca85ba89d97b694a3a64f03ccc2d881ed0cd687d43d486925","up":true},{"one":"87a337622455ae65daf3ab2555cee8985e9aa14bac245545d985296060e4a8de","other":"9c8e1f23f260c5a46b0001572675b19e5293ca65e7fdfc131c07612e9c4072fa","up":true},{"one":"ff75b19017c84128f38dec4f63e1f247a5691dc0fae186e667afedb5fe9d2c80","other":"c603138e40fe2f85cc634017956ada6399fca99969e3bf0c1ee8428374e779f1","up":true},{"one":"6b4ee1b73942ced78f97c0d0e221209933e63ae7353bb9ab3d37ac4127592e86","other":"60c5647aed152609979366fb33dc8b28fc60736098ff68d232415889b43dfa58","up":true},{"one":"140dd212f2b193ee6a9d7fc14f7da321c7ef6fd367fb4f194924fd0ad5d135cc","other":"138dbc1662c4ce9b2b30ef5035914cc70465666fe18f313318e662d13f099621","up":true},{"one":"5d82a418629cfbe7c57105309319ad695a198626fe3571de213a12ddf62f7308","other":"194ea3e14dc5d99f98d15607dc4c405769f5a371acc22d41a62d0537d716be32","up":true},{"one":"67909bdcaef2330ef120e524c76e1e382b474f3332d86f65282028e051f34c75","other":"648a96d61898eb2d336ff7d5a229cfeb7b9f587282e40f9fe640e181ae26bdd3","up":true},{"one":"8b4318f86ad47976321af97bfbf95cd0a3b0aa22447aeb0611ed1a9bf1e6a4bf","other":"80d7e892bbb26808abb1d1530077fec6b08768c151a9f220881da3c862bae0af","up":true},{"one":"f215bc09268e60ebbec76f743bebd09d7e72d4cbeedc0b9d3417bb4a2ef42935","other":"e2770cef7c1ad312b70d94ca5570e45f324c798a31a93203f505167aeab122b6","up":true},{"one":"bbafac5ba5915db3c80e28b249cad260b9b5dad1f728063c48fa8f61d7556e17","other":"be68267d77fb52424227267c665ca1193a010334cac057338aca77b49a4b94da","up":true},{"one":"c2d00c7d960174c0934129fdcec63525bfa728f78fb70b7c52036b772d6297ad","other":"08f84878e44fed2adb4b2685b9f293dc3c73d5f9bc1c474870d943ec2ae73dbe","up":true},{"one":"eebd48b367cbfe94a37c0deb274a697e628074f9560b909e66229c5c76ce68eb","other":"f645aab9cb2bd2709998b38e5789c9c5f68d40765e6cbd93b92e6383eb671dba","up":true},{"one":"aceee75a260d45252060fe971eabd4bde25f912db4a3c6e47f4a09572fe01697","other":"be68267d77fb52424227267c665ca1193a010334cac057338aca77b49a4b94da","up":true},{"one":"8ea2c8acc111f38d5b4a5ed60252ee83f312d0f8359265d5b9266d54735052fe","other":"8d192b11538072db750f71204e2e6adf9dc0508d9c5cf1eb457e4e996cd985bc","up":true},{"one":"fc514c43c4eb5c62798458da5d622e9248a6e530e4288cd902019aa05c4374d8","other":"ec90a22f41ee659d5759a497946ac2991c916f00fe7caeeeb0908f3af1fe60b6","up":true},{"one":"0cfc7309afabceeb7d248714e972cf3987205324f5ab8d048d17bea5dc87369d","other":"1bd588263274543729d54529ae9e9bf4596db40649a1c2a3f73168d818f34b62","up":true},{"one":"447cdbf1ff462aa67d6a46085b1a84fdc495a4142ab174c8e69b271b09732b4d","other":"46bfa8bea56b0be1abfa5ad3561bb6bf49ed6695d83ee2b2c192c5a0408347cf","up":true},{"one":"094256812084c6052a2604149aa3aba2379c483bf4ec25162f6b43934942775a","other":"025de1d2ec529d3a7da302eef0f8c54996616d40c940c0956d470ffc2a007f33","up":true},{"one":"f645aab9cb2bd2709998b38e5789c9c5f68d40765e6cbd93b92e6383eb671dba","other":"dad08999cd2edc33cfdc59ea34c8adcd6a34eaa15f2e85b0622e9848b215c1d5","up":true},{"one":"09b3fa30780931e18b92c75d1cdeafa365609c565e4e8c253d393835cb82d98e","other":"07f5d094a4b22e73cdd6c85452b3d928da9b4b16873824759cb7e8a622417fd5","up":true},{"one":"9257dc934dfbf17473b70cb85333c6fab67ee9b6228a646576c4f57253f1004e","other":"95c0a351fb7aa6683280d159a7b808bfa63f63bff91a1c5936e973b2e5d3954f","up":true},{"one":"46bfa8bea56b0be1abfa5ad3561bb6bf49ed6695d83ee2b2c192c5a0408347cf","other":"ba911175d3aa3fcc266e2a5aa32fb706208b8a9b5021a5f37c0b85f547eb375d","up":true},{"one":"cc3397e9e11f75273d3f81d91f980f4504755f80b27a183212de56cc5085e58d","other":"d700d96de1193456dc0bcf492c7c11b0951062974af2f7f47b8c901b17c23165","up":true},{"one":"feb3bc17ee7369a4fa9889d9250fed3c1257c70916871996e6eabd374dd8dc2e","other":"f7561cb6740e17ec7c7d17068251b2c951d954c77804aa5af60464e9c3964e57","up":true},{"one":"031450ec20f353435b429b5fa64f616d07c9d586afabc7a2772e05ad5c88bf50","other":"0e2b48558ce2af1fbfee38a557d56072e3091cfcaee8d7847c7c9dcf7bef9bfa","up":true},{"one":"08bd1e049859b4a7c8078ca9741fe3daa668b9fe478da06d1a435cd5566b3e11","other":"096a8302b6f369c28ed9d47719a507ead8a3cc1ca4fa1e32318b7f97873955fe","up":true},{"one":"dbd4d90e3342ef837b8ecf5c6e490f7c409f419cf36b77162a87cb2cfb8ae33c","other":"f645aab9cb2bd2709998b38e5789c9c5f68d40765e6cbd93b92e6383eb671dba","up":true},{"one":"7049e92a396311fbf2f4a55bb5bd2fe3f7bb3c1a63f41bb88eb800edd45ac6e5","other":"7d162a11662585f8c38d88fb241623e67bacf90703065dae6c092b4b507d6543","up":true},{"one":"5a8b84df651871fce72d11cb1c26c87ae4a0cc6b4c274d37e70532c94f27288e","other":"56635699bd3bc78193adbdb8e8b7c2c91dab4140fdaa506fea2300ee86c4ba81","up":true},{"one":"cf52b3fc82ec24c3e9b40488d7c5f7ac8af731d159a103619bee932ec74d5e92","other":"c603138e40fe2f85cc634017956ada6399fca99969e3bf0c1ee8428374e779f1","up":true},{"one":"5ff09c6859736aad7a82a3bfb3f1a1a8b3c0d58f831863540d9c3013dd35745e","other":"56635699bd3bc78193adbdb8e8b7c2c91dab4140fdaa506fea2300ee86c4ba81","up":true},{"one":"1addd4a9f01486212e13e43a9650b7f793617d1cb59fb8d941270d7ae55f575f","other":"1dc0ef1ce68dc681298177bde808af514efa52a5ad38c9cd2bd61968cdf19cfb","up":true},{"one":"a8ff8d69dcb36462d1116dafa5e3d0c7237bf65dbece482a316862c8d66e35b6","other":"be68267d77fb52424227267c665ca1193a010334cac057338aca77b49a4b94da","up":true},{"one":"52a8747e4ea35f6f50c72d7c481616f68a5e4396248332b8ff69d3a772de49ac","other":"59876e7ff9e92243856dad23126e1d38d9a5ddae79772ed1b2bdb91f33a4a4b5","up":true},{"one":"7c7ca5a7522a04f62f2bebd6197a03d78f255d0175c3dfceb5d92b684365b2aa","other":"2fd2f77d76cca480ac18e9af7a462f297db168c3370b3bc0e2c04aa006c4d037","up":true},{"one":"b3f95f225e2b6b76e6c7ef7c86caf83e35213f6a22da41e653ca1c190be23c9c","other":"a5053958f0cefcff1826bf02525fda98c4dc954cc38690f3c43ecbf0b2ad57af","up":true},{"one":"8cc3fb39009d0adc26fca1e2ee96822d168d4debc379fd516c15d4b4a1624231","other":"8ea2c8acc111f38d5b4a5ed60252ee83f312d0f8359265d5b9266d54735052fe","up":true},{"one":"30feca631f06041cb14cead384dfaa5fffa6dc34b0cee54230efbe15e56a5884","other":"2c85f5361b2d5abcf799de50fe58b1ed2006ea18f75823748c33eb7e95b1cc39","up":true},{"one":"4d381014783980b2f77f0d71160ad9e9d84672b576f4435ccdbae12752350c1c","other":"43d43e9ebcbceb4830fc1d2d5024650b90698306bbd2c4d0b4841a1a8fd09c93","up":true},{"one":"4cece9bc134bc2b09400c9f7f8a4df9270d2fe3c077c5e441fffc911fcf6f42e","other":"482ec3dc05460579ea9bce87677bd3d9a1930e801fabeba607b8ab6b8729ff15","up":true},{"one":"c8ea4177420785926e0929701f5e74c744920386f2a43b89d83c8281106cb95e","other":"d700d96de1193456dc0bcf492c7c11b0951062974af2f7f47b8c901b17c23165","up":true},{"one":"951877b34ee1535b5059c49beb03e8960ff9c12b694ef64708c77c30ff1dc706","other":"97daf2cbe03c80ce6c4dae39cd071dd93cb32ed245aa9aa77285e12296957ca3","up":true},{"one":"43c9e1571c460cb9f599fa8ed79ddd0f9c3a21fd2fa455e0603109c55012f76b","other":"50c1a8023bfecffb09472fdc50898f4d050a31443d40a6c07b629090beb0df3d","up":true},{"one":"a8b58013ff911871d1aa6c2bbea6c2e6ef9b00b87b80a41dc04724ad0488e2ff","other":"a8f49e87156fda5510897601689ce968d77032134c523634916b96de16366f9e","up":true},{"one":"87a337622455ae65daf3ab2555cee8985e9aa14bac245545d985296060e4a8de","other":"80735a728720bba0ac08daaccd093370d672a8f9a50845ad78ccd6cf8686c39f","up":true},{"one":"3cabd3a567fc4e6f8da66eb35d938fe1e9a7f2bdd2d36c4dc2d0e0e9149f5e56","other":"318828fa893a28cc0652d3f81d97c5b8e023e853685f5d3e65fde20689abcc5a","up":true},{"one":"f7561cb6740e17ec7c7d17068251b2c951d954c77804aa5af60464e9c3964e57","other":"fa240411bc4f3e44dfca3faedd112c7743a67b522a910bc99696ef0b31732ee2","up":true},{"one":"6dd3ac0fd9a04a2ce75875c683d135e52eaa1670cb55e78711620712e60fde47","other":"6e7f1f3d65364399617a4d95fdd04f2ca9b007b2366943e7ba5acd4616a7a425","up":true},{"one":"31e129ab3df7e082cc27c649d9ee29a3ea646d6a97d2417875b80e3ff576c047","other":"36b93656cab02213fa76124af6251109356abc5e0ae5dd1e203c6a013e014548","up":true},{"one":"6d5ec591af4966ba024c6b2aeb45e0aab8aa1762f9cac30ce3934da529b738e9","other":"679554b410e415cfcdf1b14ef87759269b2bcaf07f4541122977db3a40091da2","up":true},{"one":"4b79e83186f2ab05932eaa99982a2e53373b83780e32d224d15cb2c85462451f","other":"4cece9bc134bc2b09400c9f7f8a4df9270d2fe3c077c5e441fffc911fcf6f42e","up":true},{"one":"7c464054ea7b6c9ea0c7d4c209769c92f294a9db2ca159b8ef168e310a1eac3a","other":"79e5c6c6d78c88c579003cda044882ecb04520fbad1f5feadbe7b6d23fe183c8","up":true},{"one":"096a8302b6f369c28ed9d47719a507ead8a3cc1ca4fa1e32318b7f97873955fe","other":"08f84878e44fed2adb4b2685b9f293dc3c73d5f9bc1c474870d943ec2ae73dbe","up":true},{"one":"eebd48b367cbfe94a37c0deb274a697e628074f9560b909e66229c5c76ce68eb","other":"eff2450bea797ff66d93e7c1c1b0977cddf3abba64bfa51bcc509d728569e2fa","up":true},{"one":"16868ec5d8f490ac73ea28b4e8fdda55ac149bb1aafb177545b54b84a5ad5367","other":"0e80db9dfa8ce29bedfb2de031622bef8829bee52771322b6a7efb47afe540e7","up":true},{"one":"837f0993f6374039a5ad4472d6313e647a4c5db4583bd27ccfa98d3448a17731","other":"80735a728720bba0ac08daaccd093370d672a8f9a50845ad78ccd6cf8686c39f","up":true},{"one":"046ca54165f0dd4d62fd7d8ee9e97c655db3d35f5452a0ccb0dffc79c047978c","other":"0e80db9dfa8ce29bedfb2de031622bef8829bee52771322b6a7efb47afe540e7","up":true},{"one":"019109311d4888497aa194cce4a89b5ef243421cf0e7e7bb9115d086e1a1f7d7","other":"012ba278d582691241875c4c14ead91fff3983e190df7d9b43ade384e84c11fb","up":true},{"one":"67f383e5334e9b6701d1dbb20876d4ba9a7e578af0476caed4a7e1b701f2bedb","other":"60c5647aed152609979366fb33dc8b28fc60736098ff68d232415889b43dfa58","up":true},{"one":"9b8e6bb3a7fe4dc65ac97404e546d8b777d068c94bc2355f4f1a510ad6c11905","other":"9f7d72b7d9843872904b841e421985082428fba5010db27dd871ed76630a1e1d","up":true},{"one":"3c5b2e125020c80e3674df9cac34de4d8f3a94ee02556fb557921b6d5498b933","other":"305162c472c71ddef2320b138102b67d1ce2b8bba79e2e587fc80e085c88e547","up":true},{"one":"bfc711793830779f49aa59bc6f7a205ab4e6eae7abfdafbf3bb5a1163a778ab2","other":"a4ee49bb2caabb6b9448bcdff1fc3cc673a2db04eab9f5c62d1787f2c25990a0","up":true},{"one":"2e65d05648b798fafbc9bb582c05e6f8f891131260e8c90ca725ddcbc823f315","other":"318828fa893a28cc0652d3f81d97c5b8e023e853685f5d3e65fde20689abcc5a","up":true},{"one":"8ea2c8acc111f38d5b4a5ed60252ee83f312d0f8359265d5b9266d54735052fe","other":"a8f49e87156fda5510897601689ce968d77032134c523634916b96de16366f9e","up":true},{"one":"a2e6c900511768c8c9947ab0fa2e73975cf2a4cec7fd15217abdba25c329317e","other":"be68267d77fb52424227267c665ca1193a010334cac057338aca77b49a4b94da","up":true},{"one":"025de1d2ec529d3a7da302eef0f8c54996616d40c940c0956d470ffc2a007f33","other":"046ca54165f0dd4d62fd7d8ee9e97c655db3d35f5452a0ccb0dffc79c047978c","up":true},{"one":"094256812084c6052a2604149aa3aba2379c483bf4ec25162f6b43934942775a","other":"0e3b7722f3f84d83b3d744bea4e893715a01d4df3cf4a1c6a6823a1f5c9ad6b8","up":true},{"one":"d95965e449dd4069876384cf4b34f986731e255a7948f0a862d229b1dddbc502","other":"d9cf19895e015cb534d915aed83c0d26bf40a11244027812e17c3bec6e645a8e","up":true},{"one":"955da15edae50a4c68bc8c579b9799d55f41b7c2a6178f645f79d772e0116662","other":"95c0a351fb7aa6683280d159a7b808bfa63f63bff91a1c5936e973b2e5d3954f","up":true},{"one":"d20931ce3da972fd23ea306e5c604a1fbd9417ba02654c5cdbe278fe259f75d5","other":"d408bb6f7af1590e1f162ce02cc016b1b86ede29851caa32434212ffa2a377c8","up":true},{"one":"c272b12f4020ae5b20e3d29cd09de03fa0088e3eeb5f07aa7728b29a3e90e687","other":"c9c302de4afe7b4dcbb6f3e366ce747083f9dcd7d5c6a01b939da5cdc6ccc874","up":true},{"one":"9c21cb3e56f8ac66a7917a9ba14e58f77e998ac70c178b88b5053d9ac2777e60","other":"a8f49e87156fda5510897601689ce968d77032134c523634916b96de16366f9e","up":true},{"one":"1fd0192df1fbf33771ca575afbb4e27c6541cce4a3cff2dfc1f2c085e7fab79e","other":"19ea0a685fc4edd298b736dc7a778c9ec4362de378876911105fa9ba2ce90204","up":true},{"one":"a8b58013ff911871d1aa6c2bbea6c2e6ef9b00b87b80a41dc04724ad0488e2ff","other":"aceee75a260d45252060fe971eabd4bde25f912db4a3c6e47f4a09572fe01697","up":true},{"one":"c8c8a93779ec4d9ac40925e8208478a00ee27fc220ddd73d8774cf6bfa255c46","other":"cdb13873ac058861f295ebca5d958bf2bb793e3f9e274cf5a73a633425a9276f","up":true},{"one":"834f14e9f325482adef62651ddf3685690dd5ebdd18014f2bd266b2143c290ff","other":"84a9db7645c792dc38c1f2113a8f0590d04e1c94d9a8c464ab0ec8219303d966","up":true},{"one":"43c9e1571c460cb9f599fa8ed79ddd0f9c3a21fd2fa455e0603109c55012f76b","other":"553824ef701d3cd0191ae3a67de564ed0cf553e74bd60ed9de321f9302732ba6","up":true},{"one":"68cbc4a5313080d5dca8ad34e8bf52a6144e0ff8ef3f795d7ae9d5f644fe2042","other":"6e7f1f3d65364399617a4d95fdd04f2ca9b007b2366943e7ba5acd4616a7a425","up":true},{"one":"8e7b96d28edae711e1a4cee0d894e0bd92cdf410ba6f61713f7d9b0bee761d4c","other":"807416cc70f02d481a188027f7932b48e8f7b5e8258f7e9623f3f6e2985d8f6a","up":true},{"one":"d700d96de1193456dc0bcf492c7c11b0951062974af2f7f47b8c901b17c23165","other":"c53417f008e4550e1c4cb9a3e2955b3af6403e059b7b4b4c33869d9ed4a580a5","up":true},{"one":"59876e7ff9e92243856dad23126e1d38d9a5ddae79772ed1b2bdb91f33a4a4b5","other":"5a26ae73eebf27f6dbec2414f1277a249e814a7a06790d7061610e5227b086f6","up":true},{"one":"44adaabf9c46608a374ed816d3c40c63b6645f4f6e033a76431bc8f88713eb41","other":"ba911175d3aa3fcc266e2a5aa32fb706208b8a9b5021a5f37c0b85f547eb375d","up":true},{"one":"3b020c84fb60f59779324d451d9770d683e08133bbaa2d5762f61b8fd4b8d9fd","other":"6e7f1f3d65364399617a4d95fdd04f2ca9b007b2366943e7ba5acd4616a7a425","up":true},{"one":"4b79e83186f2ab05932eaa99982a2e53373b83780e32d224d15cb2c85462451f","other":"ba911175d3aa3fcc266e2a5aa32fb706208b8a9b5021a5f37c0b85f547eb375d","up":true},{"one":"07f5d094a4b22e73cdd6c85452b3d928da9b4b16873824759cb7e8a622417fd5","other":"0e80db9dfa8ce29bedfb2de031622bef8829bee52771322b6a7efb47afe540e7","up":true},{"one":"84a9db7645c792dc38c1f2113a8f0590d04e1c94d9a8c464ab0ec8219303d966","other":"be68267d77fb52424227267c665ca1193a010334cac057338aca77b49a4b94da","up":true},{"one":"fa240411bc4f3e44dfca3faedd112c7743a67b522a910bc99696ef0b31732ee2","other":"cd6c8b42a0b092f41e6925577c9de7d1bea17231bcb3d08f3d3cce9c6fdcf22d","up":true},{"one":"c42e6492879439eeecd9938d17ff283fd8f5f24206906ca512b4daa4803b78b4","other":"08f84878e44fed2adb4b2685b9f293dc3c73d5f9bc1c474870d943ec2ae73dbe","up":true},{"one":"046ca54165f0dd4d62fd7d8ee9e97c655db3d35f5452a0ccb0dffc79c047978c","other":"012ba278d582691241875c4c14ead91fff3983e190df7d9b43ade384e84c11fb","up":true},{"one":"994839e5f3a5b8b23aed84fb029413124af17804b79b0263ec6bfd5aec5dad78","other":"9ca1fd5d41975acb905f337997922849b4070360e47849bb4fd8cd1b9ddb4d73","up":true},{"one":"ef99b6cdc05345a1ee82267890e3ccaeef1f2bd2fe7ae8b02b6b20b9a5ef85bb","other":"eb686a686fd70e41659cc69ec0db53d1512dfec238918afd0a515d8ce177d4d9","up":true},{"one":"a606c79a018a6535375d851fcc82c42cc7c952720aa120434cedccf4a4be1f59","other":"a1c85ee75edb807a01f4ce930086c948918aade324752609b078c28991c04e86","up":true},{"one":"8ea2c8acc111f38d5b4a5ed60252ee83f312d0f8359265d5b9266d54735052fe","other":"84a9db7645c792dc38c1f2113a8f0590d04e1c94d9a8c464ab0ec8219303d966","up":true},{"one":"398038811c1c7402fe2e6994c9ce2f15c8166b8e99f379feaaed66ac87702062","other":"3a628ef171c1f26fa0966eb89210be0a14305aae8bfed10f4ed9017698f40f4b","up":true},{"one":"e2d36f335d90ad63148db8e353a78a30d8d9c0abe107be2cf8685f6a01ce74b9","other":"f6c028d6a2b6408e90169151f4519b561ed183bd8925ed9a1702806f397666e7","up":true},{"one":"0cfc7309afabceeb7d248714e972cf3987205324f5ab8d048d17bea5dc87369d","other":"18e00a7e0f826a1aba3f8c0f533ed905f2eee607b697fff056ee7874d374adcd","up":true},{"one":"4005fd1fa8fbb318b29a62c368ada579e5122ca0578e6a75c509552be4b63b76","other":"447a411c80fbd422bfa0c358d3f2a1fe6256c05e35acc6350958dfbe62cd5b9b","up":true},{"one":"f305273a7d08e72f69b0b153855e822f252cbbf34a18f305134eed9d1eb7b58a","other":"f645aab9cb2bd2709998b38e5789c9c5f68d40765e6cbd93b92e6383eb671dba","up":true},{"one":"a6165a4b02d58be116892982c0ed3d49d86fec0e9f436a516b61868331ed853f","other":"bfc711793830779f49aa59bc6f7a205ab4e6eae7abfdafbf3bb5a1163a778ab2","up":true},{"one":"1b1dc3f9312df141855c545dd16aee325f9a609230ec6165bdbbb07d0c0862f6","other":"1bd588263274543729d54529ae9e9bf4596db40649a1c2a3f73168d818f34b62","up":true},{"one":"c190f9d08c78ed6dffadaef36e77fe6aa96099e4453753b0cfc8ec542fa96b9d","other":"dad08999cd2edc33cfdc59ea34c8adcd6a34eaa15f2e85b0622e9848b215c1d5","up":true},{"one":"1dec77c2f4caf053c2d0524ae34a2d970bf4743a0d009d8fc543077ddfdfe3d0","other":"19ea0a685fc4edd298b736dc7a778c9ec4362de378876911105fa9ba2ce90204","up":true},{"one":"c42e6492879439eeecd9938d17ff283fd8f5f24206906ca512b4daa4803b78b4","other":"c190f9d08c78ed6dffadaef36e77fe6aa96099e4453753b0cfc8ec542fa96b9d","up":true},{"one":"a742e8502c619703ce87890110f908bde32b59dc61d77a247759e5d0056e0c94","other":"a5053958f0cefcff1826bf02525fda98c4dc954cc38690f3c43ecbf0b2ad57af","up":true},{"one":"16868ec5d8f490ac73ea28b4e8fdda55ac149bb1aafb177545b54b84a5ad5367","other":"19ea0a685fc4edd298b736dc7a778c9ec4362de378876911105fa9ba2ce90204","up":true},{"one":"994839e5f3a5b8b23aed84fb029413124af17804b79b0263ec6bfd5aec5dad78","other":"80735a728720bba0ac08daaccd093370d672a8f9a50845ad78ccd6cf8686c39f","up":true},{"one":"8f9aa2cd33d18e7cb4494d11a7532c97eb4a1cae172b2165c26ae4ed24887c0d","other":"ddb8be472c3d48dc4d3d112448e6c0c4a826a18af3f3b53fdfef8cd31053c75f","up":true},{"one":"84a9db7645c792dc38c1f2113a8f0590d04e1c94d9a8c464ab0ec8219303d966","other":"bfc711793830779f49aa59bc6f7a205ab4e6eae7abfdafbf3bb5a1163a778ab2","up":true},{"one":"b5eab4869b4cb65bdc1e5cab45c03016d202f9f5b668be50066451cfcf9ef299","other":"ba911175d3aa3fcc266e2a5aa32fb706208b8a9b5021a5f37c0b85f547eb375d","up":true},{"one":"1dc0ef1ce68dc681298177bde808af514efa52a5ad38c9cd2bd61968cdf19cfb","other":"3a628ef171c1f26fa0966eb89210be0a14305aae8bfed10f4ed9017698f40f4b","up":true},{"one":"70f68562733da4e3b1c3949fb6e11ac0bdd49ea7e732925f937f87df5af698d6","other":"2fd2f77d76cca480ac18e9af7a462f297db168c3370b3bc0e2c04aa006c4d037","up":true},{"one":"0cfc7309afabceeb7d248714e972cf3987205324f5ab8d048d17bea5dc87369d","other":"0e2b48558ce2af1fbfee38a557d56072e3091cfcaee8d7847c7c9dcf7bef9bfa","up":true},{"one":"2e65d05648b798fafbc9bb582c05e6f8f891131260e8c90ca725ddcbc823f315","other":"397a0a0e9fadcb571acd8981f5bfe8e059e707e0feae8a9c4c6bfe87bd39e66a","up":true},{"one":"4a95d49f58057b039b55a34f67a348c052f61770065e41243ff055efc570a935","other":"553824ef701d3cd0191ae3a67de564ed0cf553e74bd60ed9de321f9302732ba6","up":true},{"one":"48de553e15afd3e8a46bfc3a5ba8a298158aa3d60f140d2730230af5cce8084d","other":"4d9147e3bf98cb59a7648f616c0d7f713a8cf3b7d25e3115233ff5883128beab","up":true},{"one":"7c464054ea7b6c9ea0c7d4c209769c92f294a9db2ca159b8ef168e310a1eac3a","other":"5a26ae73eebf27f6dbec2414f1277a249e814a7a06790d7061610e5227b086f6","up":true},{"one":"8862cd85d7039119b984f752a458ac0495ddea98c69fc1d1241db7873a712c11","other":"834f14e9f325482adef62651ddf3685690dd5ebdd18014f2bd266b2143c290ff","up":true},{"one":"3938e6b2c095084dc9975a3e8649133557495d34ac6df874c6d929266e3ffe6f","other":"36b93656cab02213fa76124af6251109356abc5e0ae5dd1e203c6a013e014548","up":true},{"one":"f7561cb6740e17ec7c7d17068251b2c951d954c77804aa5af60464e9c3964e57","other":"ff75b19017c84128f38dec4f63e1f247a5691dc0fae186e667afedb5fe9d2c80","up":true},{"one":"025de1d2ec529d3a7da302eef0f8c54996616d40c940c0956d470ffc2a007f33","other":"07f5d094a4b22e73cdd6c85452b3d928da9b4b16873824759cb7e8a622417fd5","up":true},{"one":"d700d96de1193456dc0bcf492c7c11b0951062974af2f7f47b8c901b17c23165","other":"8f9aa2cd33d18e7cb4494d11a7532c97eb4a1cae172b2165c26ae4ed24887c0d","up":true},{"one":"eebd48b367cbfe94a37c0deb274a697e628074f9560b909e66229c5c76ce68eb","other":"ec90a22f41ee659d5759a497946ac2991c916f00fe7caeeeb0908f3af1fe60b6","up":true},{"one":"0e3b7722f3f84d83b3d744bea4e893715a01d4df3cf4a1c6a6823a1f5c9ad6b8","other":"0cfc7309afabceeb7d248714e972cf3987205324f5ab8d048d17bea5dc87369d","up":true},{"one":"32ff1969d90aaa5a8ed2260968a8e2bac2d1cae597c906f90495f1dc5de7f8d3","other":"26ab9c813822dbb4f1a230cd8e99e8ab280b242747deb55fdf93d160906ef331","up":true},{"one":"e64d90760cd81e4f112bbf1432e76c82fa4173fd474b988f4096ce187363fd81","other":"ff75b19017c84128f38dec4f63e1f247a5691dc0fae186e667afedb5fe9d2c80","up":true},{"one":"3c5b2e125020c80e3674df9cac34de4d8f3a94ee02556fb557921b6d5498b933","other":"26ab9c813822dbb4f1a230cd8e99e8ab280b242747deb55fdf93d160906ef331","up":true},{"one":"c190f9d08c78ed6dffadaef36e77fe6aa96099e4453753b0cfc8ec542fa96b9d","other":"cf52b3fc82ec24c3e9b40488d7c5f7ac8af731d159a103619bee932ec74d5e92","up":true},{"one":"a1c85ee75edb807a01f4ce930086c948918aade324752609b078c28991c04e86","other":"a2a163ce2cb092b411c994cc5d5ef555d539d2dcf4e7e1aeb528d2216dc481e5","up":true},{"one":"8e7b96d28edae711e1a4cee0d894e0bd92cdf410ba6f61713f7d9b0bee761d4c","other":"8f9aa2cd33d18e7cb4494d11a7532c97eb4a1cae172b2165c26ae4ed24887c0d","up":true},{"one":"bfc711793830779f49aa59bc6f7a205ab4e6eae7abfdafbf3bb5a1163a778ab2","other":"af02c2f471e96ab8defbd229215695b95e64f7c78b145b6793a238961f556fbf","up":true},{"one":"fc514c43c4eb5c62798458da5d622e9248a6e530e4288cd902019aa05c4374d8","other":"eebd48b367cbfe94a37c0deb274a697e628074f9560b909e66229c5c76ce68eb","up":true},{"one":"138dbc1662c4ce9b2b30ef5035914cc70465666fe18f313318e662d13f099621","other":"31e670638acba3d58f4c67f3ff2f3f25d769e8a5d7a7838927f4d9d169a84404","up":true},{"one":"ba911175d3aa3fcc266e2a5aa32fb706208b8a9b5021a5f37c0b85f547eb375d","other":"aceee75a260d45252060fe971eabd4bde25f912db4a3c6e47f4a09572fe01697","up":true},{"one":"67585dfd87a005bae9bffc2cccb83c69537247c74886b4fa52287f46c796bcb6","other":"6dd3ac0fd9a04a2ce75875c683d135e52eaa1670cb55e78711620712e60fde47","up":true},{"one":"a5ac04d53b569e418ef5007961431155f2c226ee10157b30af71ea4836b08089","other":"a7a856a43293aa3004848a86f187e09343bd605e1a93e853a6f6b6b1031bd667","up":true},{"one":"5a8b84df651871fce72d11cb1c26c87ae4a0cc6b4c274d37e70532c94f27288e","other":"5a26ae73eebf27f6dbec2414f1277a249e814a7a06790d7061610e5227b086f6","up":true},{"one":"67909bdcaef2330ef120e524c76e1e382b474f3332d86f65282028e051f34c75","other":"67f383e5334e9b6701d1dbb20876d4ba9a7e578af0476caed4a7e1b701f2bedb","up":true},{"one":"8ea2c8acc111f38d5b4a5ed60252ee83f312d0f8359265d5b9266d54735052fe","other":"8862cd85d7039119b984f752a458ac0495ddea98c69fc1d1241db7873a712c11","up":true},{"one":"e471efbcf1def3915b3dda2dc65a86945c607be54a33e31e9625549becac0e34","other":"ec90a22f41ee659d5759a497946ac2991c916f00fe7caeeeb0908f3af1fe60b6","up":true},{"one":"c6a8220726243cceaa6f2cebdac857a05efe721323f0a064c7f85a8340d3da96","other":"c53417f008e4550e1c4cb9a3e2955b3af6403e059b7b4b4c33869d9ed4a580a5","up":true},{"one":"09b3fa30780931e18b92c75d1cdeafa365609c565e4e8c253d393835cb82d98e","other":"012ba278d582691241875c4c14ead91fff3983e190df7d9b43ade384e84c11fb","up":true},{"one":"a3309f8b8bba4d8fbd7c6193d7671cb907b94e71155ef6138e0248682ff00e58","other":"a5053958f0cefcff1826bf02525fda98c4dc954cc38690f3c43ecbf0b2ad57af","up":true},{"one":"34118166845c185d15c286b7e5433539ee98ed634baabd534d57369fd5f7c681","other":"398038811c1c7402fe2e6994c9ce2f15c8166b8e99f379feaaed66ac87702062","up":true},{"one":"16868ec5d8f490ac73ea28b4e8fdda55ac149bb1aafb177545b54b84a5ad5367","other":"18e00a7e0f826a1aba3f8c0f533ed905f2eee607b697fff056ee7874d374adcd","up":true},{"one":"af02c2f471e96ab8defbd229215695b95e64f7c78b145b6793a238961f556fbf","other":"a32749dc4e134a4fbb038618c58a7c05bbbaa06f1436de3754341af86402581b","up":true},{"one":"9c21cb3e56f8ac66a7917a9ba14e58f77e998ac70c178b88b5053d9ac2777e60","other":"a9700308516c02cf9aea8809000a4e0596d6b44753e10bd0928df83e2eb9b9e7","up":true},{"one":"a2e6c900511768c8c9947ab0fa2e73975cf2a4cec7fd15217abdba25c329317e","other":"a742e8502c619703ce87890110f908bde32b59dc61d77a247759e5d0056e0c94","up":true},{"one":"955da15edae50a4c68bc8c579b9799d55f41b7c2a6178f645f79d772e0116662","other":"93ea8ef251fd56b159e080cdf733d33e1fdfb3c7ae5bd9a6a328d0bf5458867b","up":true},{"one":"8cc3fb39009d0adc26fca1e2ee96822d168d4debc379fd516c15d4b4a1624231","other":"8e282b0f27d4fa56fe14cfeb69fac5a53e3d882c7778eb190653e2eab7c93fd2","up":true},{"one":"c53417f008e4550e1c4cb9a3e2955b3af6403e059b7b4b4c33869d9ed4a580a5","other":"2c8042517dfeaa01586e91e491dd4154fb24c0d84fedb0404b9d5136f60da1d9","up":true},{"one":"d3e913cf4a7dabfb5699131b65e533a40adb46ea37e0ed4ce9433f99015986ef","other":"c603138e40fe2f85cc634017956ada6399fca99969e3bf0c1ee8428374e779f1","up":true},{"one":"1dec77c2f4caf053c2d0524ae34a2d970bf4743a0d009d8fc543077ddfdfe3d0","other":"138dbc1662c4ce9b2b30ef5035914cc70465666fe18f313318e662d13f099621","up":true},{"one":"93c0e1adf23fdf1623359eb88c517bc521d5a26325554df890cc04c1fa17a5df","other":"80735a728720bba0ac08daaccd093370d672a8f9a50845ad78ccd6cf8686c39f","up":true},{"one":"c74d801e85ac0fd8951480d107b41eddc5c92775614c4886b3f732fa3d1a791d","other":"dad08999cd2edc33cfdc59ea34c8adcd6a34eaa15f2e85b0622e9848b215c1d5","up":true},{"one":"d700d96de1193456dc0bcf492c7c11b0951062974af2f7f47b8c901b17c23165","other":"ddb8be472c3d48dc4d3d112448e6c0c4a826a18af3f3b53fdfef8cd31053c75f","up":true},{"one":"d408bb6f7af1590e1f162ce02cc016b1b86ede29851caa32434212ffa2a377c8","other":"d700d96de1193456dc0bcf492c7c11b0951062974af2f7f47b8c901b17c23165","up":true},{"one":"ab719e60a77ba5253f1690c920df9dd9f3a62071e9cce9d62e0001a522b3409e","other":"a8ff8d69dcb36462d1116dafa5e3d0c7237bf65dbece482a316862c8d66e35b6","up":true},{"one":"435d721a568eb906a03c69dbd71337251a550521a4004ab5d4a7deb6f317061a","other":"4005fd1fa8fbb318b29a62c368ada579e5122ca0578e6a75c509552be4b63b76","up":true},{"one":"4005fd1fa8fbb318b29a62c368ada579e5122ca0578e6a75c509552be4b63b76","other":"ba911175d3aa3fcc266e2a5aa32fb706208b8a9b5021a5f37c0b85f547eb375d","up":true},{"one":"9f7d72b7d9843872904b841e421985082428fba5010db27dd871ed76630a1e1d","other":"9464ad8da1a5effdc0351742dfffae941ffd9fab469637b2491caece53c57dc8","up":true},{"one":"5c7c15798e86fe794bb201614d46366ea96dc51091f5b19f149995e0d40df0a6","other":"5814be13c8550b9a5a83d08e7af6022002a8fdaa38ba6c2c30be58099a9f7744","up":true},{"one":"c96146ee47ec7cd74551cf74f00213bc337d643c4327393f0e6848ecd4a0f8d3","other":"c603138e40fe2f85cc634017956ada6399fca99969e3bf0c1ee8428374e779f1","up":true},{"one":"8ea2c8acc111f38d5b4a5ed60252ee83f312d0f8359265d5b9266d54735052fe","other":"80735a728720bba0ac08daaccd093370d672a8f9a50845ad78ccd6cf8686c39f","up":true},{"one":"fc514c43c4eb5c62798458da5d622e9248a6e530e4288cd902019aa05c4374d8","other":"e2770cef7c1ad312b70d94ca5570e45f324c798a31a93203f505167aeab122b6","up":true},{"one":"34118166845c185d15c286b7e5433539ee98ed634baabd534d57369fd5f7c681","other":"36b93656cab02213fa76124af6251109356abc5e0ae5dd1e203c6a013e014548","up":true},{"one":"48de553e15afd3e8a46bfc3a5ba8a298158aa3d60f140d2730230af5cce8084d","other":"4cece9bc134bc2b09400c9f7f8a4df9270d2fe3c077c5e441fffc911fcf6f42e","up":true},{"one":"32ff1969d90aaa5a8ed2260968a8e2bac2d1cae597c906f90495f1dc5de7f8d3","other":"398038811c1c7402fe2e6994c9ce2f15c8166b8e99f379feaaed66ac87702062","up":true},{"one":"a8ff8d69dcb36462d1116dafa5e3d0c7237bf65dbece482a316862c8d66e35b6","other":"aceee75a260d45252060fe971eabd4bde25f912db4a3c6e47f4a09572fe01697","up":true},{"one":"9c21cb3e56f8ac66a7917a9ba14e58f77e998ac70c178b88b5053d9ac2777e60","other":"a6165a4b02d58be116892982c0ed3d49d86fec0e9f436a516b61868331ed853f","up":true},{"one":"a742e8502c619703ce87890110f908bde32b59dc61d77a247759e5d0056e0c94","other":"9c21cb3e56f8ac66a7917a9ba14e58f77e998ac70c178b88b5053d9ac2777e60","up":true},{"one":"48b850974575ca57a3cc5f9a4cf5aafd8688cb32b993f69983ece63258ff876e","other":"447a411c80fbd422bfa0c358d3f2a1fe6256c05e35acc6350958dfbe62cd5b9b","up":true},{"one":"5814be13c8550b9a5a83d08e7af6022002a8fdaa38ba6c2c30be58099a9f7744","other":"5bd8faf93bcad07006e9426b45f5cc599f1963ab791deac4ff63d6739cd62a17","up":true},{"one":"48f1ca6d433019f932fa4ae03e0decbcbea3fe635edff4458a669b83f8162b9a","other":"ba911175d3aa3fcc266e2a5aa32fb706208b8a9b5021a5f37c0b85f547eb375d","up":true},{"one":"f1ed9d45622ff974a1e396cd878b2deb89e31aa5d08da773423f292ae8dbcbb6","other":"e6812448728b4bda5962adceb1707b29f661d3d1a6b2ccd5f8183c9a1f4d01b6","up":true},{"one":"09b3fa30780931e18b92c75d1cdeafa365609c565e4e8c253d393835cb82d98e","other":"05949ec1a582fa70cab95c59e7c0d315583bf9fc320c60c35268931f21e90853","up":true},{"one":"a2e6c900511768c8c9947ab0fa2e73975cf2a4cec7fd15217abdba25c329317e","other":"a5053958f0cefcff1826bf02525fda98c4dc954cc38690f3c43ecbf0b2ad57af","up":true},{"one":"e471efbcf1def3915b3dda2dc65a86945c607be54a33e31e9625549becac0e34","other":"e2770cef7c1ad312b70d94ca5570e45f324c798a31a93203f505167aeab122b6","up":true},{"one":"305162c472c71ddef2320b138102b67d1ce2b8bba79e2e587fc80e085c88e547","other":"26ab9c813822dbb4f1a230cd8e99e8ab280b242747deb55fdf93d160906ef331","up":true},{"one":"ff75b19017c84128f38dec4f63e1f247a5691dc0fae186e667afedb5fe9d2c80","other":"f8ff7440d6f4abb1c89496336843741ed53a544cedeeed71d8ebe0b08698438d","up":true},{"one":"397a0a0e9fadcb571acd8981f5bfe8e059e707e0feae8a9c4c6bfe87bd39e66a","other":"36b93656cab02213fa76124af6251109356abc5e0ae5dd1e203c6a013e014548","up":true},{"one":"0d1c35c6ea485cb33857b790ee262f974cf0d54cf8ce3003f8308ac2e87c2c25","other":"0e80db9dfa8ce29bedfb2de031622bef8829bee52771322b6a7efb47afe540e7","up":true},{"one":"3cabd3a567fc4e6f8da66eb35d938fe1e9a7f2bdd2d36c4dc2d0e0e9149f5e56","other":"26ab9c813822dbb4f1a230cd8e99e8ab280b242747deb55fdf93d160906ef331","up":true},{"one":"c53417f008e4550e1c4cb9a3e2955b3af6403e059b7b4b4c33869d9ed4a580a5","other":"da36d1df95a158b0d3f9e7407d663a6b611dde0a77f00a584b97a939ab6a00de","up":true},{"one":"56635699bd3bc78193adbdb8e8b7c2c91dab4140fdaa506fea2300ee86c4ba81","other":"6d3c6db15900f2596286f81cc0664d2c8291ead5bad2aa35bad515af088a2e48","up":true},{"one":"a5053958f0cefcff1826bf02525fda98c4dc954cc38690f3c43ecbf0b2ad57af","other":"a32749dc4e134a4fbb038618c58a7c05bbbaa06f1436de3754341af86402581b","up":true},{"one":"8006b080c78a0ab54fa1be75a939bee2334322fded6c3563de1596b17c36172c","other":"87a337622455ae65daf3ab2555cee8985e9aa14bac245545d985296060e4a8de","up":true},{"one":"3b020c84fb60f59779324d451d9770d683e08133bbaa2d5762f61b8fd4b8d9fd","other":"30feca631f06041cb14cead384dfaa5fffa6dc34b0cee54230efbe15e56a5884","up":true},{"one":"a742e8502c619703ce87890110f908bde32b59dc61d77a247759e5d0056e0c94","other":"a8b58013ff911871d1aa6c2bbea6c2e6ef9b00b87b80a41dc04724ad0488e2ff","up":true},{"one":"d20931ce3da972fd23ea306e5c604a1fbd9417ba02654c5cdbe278fe259f75d5","other":"d700d96de1193456dc0bcf492c7c11b0951062974af2f7f47b8c901b17c23165","up":true},{"one":"81a5a07f92f813e85b501b0028e1caa6e6a6c7efa5195ecb693cd2d91d5132a0","other":"80735a728720bba0ac08daaccd093370d672a8f9a50845ad78ccd6cf8686c39f","up":true},{"one":"f7561cb6740e17ec7c7d17068251b2c951d954c77804aa5af60464e9c3964e57","other":"ec90a22f41ee659d5759a497946ac2991c916f00fe7caeeeb0908f3af1fe60b6","up":true},{"one":"34118166845c185d15c286b7e5433539ee98ed634baabd534d57369fd5f7c681","other":"397a0a0e9fadcb571acd8981f5bfe8e059e707e0feae8a9c4c6bfe87bd39e66a","up":true},{"one":"e0a0ba7e7e89a7af805e24abde1a5a5b489ba197585051a8755e8c2345c3d57b","other":"f645aab9cb2bd2709998b38e5789c9c5f68d40765e6cbd93b92e6383eb671dba","up":true},{"one":"4a95d49f58057b039b55a34f67a348c052f61770065e41243ff055efc570a935","other":"50c1a8023bfecffb09472fdc50898f4d050a31443d40a6c07b629090beb0df3d","up":true},{"one":"9c8e1f23f260c5a46b0001572675b19e5293ca65e7fdfc131c07612e9c4072fa","other":"885427318634c458a3050f2f26eb52454a75cea4a1263b9ed55e6eb899743854","up":true},{"one":"f645aab9cb2bd2709998b38e5789c9c5f68d40765e6cbd93b92e6383eb671dba","other":"cd6c8b42a0b092f41e6925577c9de7d1bea17231bcb3d08f3d3cce9c6fdcf22d","up":true},{"one":"9b8e6bb3a7fe4dc65ac97404e546d8b777d068c94bc2355f4f1a510ad6c11905","other":"95c0a351fb7aa6683280d159a7b808bfa63f63bff91a1c5936e973b2e5d3954f","up":true},{"one":"1070df5e904e3865085b0319a81761e59146494c689e7567efe7465fc819ae8b","other":"1049d321a450726cf39d1d7cea1c108be3bec137a644b62cdc73a853f5a5a22b","up":true},{"one":"7d162a11662585f8c38d88fb241623e67bacf90703065dae6c092b4b507d6543","other":"70f68562733da4e3b1c3949fb6e11ac0bdd49ea7e732925f937f87df5af698d6","up":true},{"one":"a8f49e87156fda5510897601689ce968d77032134c523634916b96de16366f9e","other":"8d192b11538072db750f71204e2e6adf9dc0508d9c5cf1eb457e4e996cd985bc","up":true},{"one":"3cabd3a567fc4e6f8da66eb35d938fe1e9a7f2bdd2d36c4dc2d0e0e9149f5e56","other":"36b93656cab02213fa76124af6251109356abc5e0ae5dd1e203c6a013e014548","up":true},{"one":"09b3fa30780931e18b92c75d1cdeafa365609c565e4e8c253d393835cb82d98e","other":"0e2b48558ce2af1fbfee38a557d56072e3091cfcaee8d7847c7c9dcf7bef9bfa","up":true},{"one":"a1c85ee75edb807a01f4ce930086c948918aade324752609b078c28991c04e86","other":"a5ac04d53b569e418ef5007961431155f2c226ee10157b30af71ea4836b08089","up":true},{"one":"a742e8502c619703ce87890110f908bde32b59dc61d77a247759e5d0056e0c94","other":"bfc711793830779f49aa59bc6f7a205ab4e6eae7abfdafbf3bb5a1163a778ab2","up":true},{"one":"86d6f68ec0b8e1b3406943787f918bee74dd1827998bdb13ece8f690da2d296a","other":"80d7e892bbb26808abb1d1530077fec6b08768c151a9f220881da3c862bae0af","up":true},{"one":"885427318634c458a3050f2f26eb52454a75cea4a1263b9ed55e6eb899743854","other":"93ea8ef251fd56b159e080cdf733d33e1fdfb3c7ae5bd9a6a328d0bf5458867b","up":true},{"one":"c8c8a93779ec4d9ac40925e8208478a00ee27fc220ddd73d8774cf6bfa255c46","other":"c8ea4177420785926e0929701f5e74c744920386f2a43b89d83c8281106cb95e","up":true},{"one":"79e5c6c6d78c88c579003cda044882ecb04520fbad1f5feadbe7b6d23fe183c8","other":"2fd2f77d76cca480ac18e9af7a462f297db168c3370b3bc0e2c04aa006c4d037","up":true},{"one":"c6a8220726243cceaa6f2cebdac857a05efe721323f0a064c7f85a8340d3da96","other":"c42e6492879439eeecd9938d17ff283fd8f5f24206906ca512b4daa4803b78b4","up":true},{"one":"bea10868d5da506c1801de845c148c2f09761893113ac913fe66674a8f43c178","other":"b3f95f225e2b6b76e6c7ef7c86caf83e35213f6a22da41e653ca1c190be23c9c","up":true},{"one":"0cfc7309afabceeb7d248714e972cf3987205324f5ab8d048d17bea5dc87369d","other":"08f84878e44fed2adb4b2685b9f293dc3c73d5f9bc1c474870d943ec2ae73dbe","up":true},{"one":"305162c472c71ddef2320b138102b67d1ce2b8bba79e2e587fc80e085c88e547","other":"36b93656cab02213fa76124af6251109356abc5e0ae5dd1e203c6a013e014548","up":true},{"one":"178401ec8d01a0a4f551d23e880a8e8a4eb87773565363843d51cf52660b1211","other":"140dd212f2b193ee6a9d7fc14f7da321c7ef6fd367fb4f194924fd0ad5d135cc","up":true},{"one":"1049d321a450726cf39d1d7cea1c108be3bec137a644b62cdc73a853f5a5a22b","other":"194ea3e14dc5d99f98d15607dc4c405769f5a371acc22d41a62d0537d716be32","up":true},{"one":"8b4318f86ad47976321af97bfbf95cd0a3b0aa22447aeb0611ed1a9bf1e6a4bf","other":"9c8e1f23f260c5a46b0001572675b19e5293ca65e7fdfc131c07612e9c4072fa","up":true},{"one":"648a96d61898eb2d336ff7d5a229cfeb7b9f587282e40f9fe640e181ae26bdd3","other":"6d5ec591af4966ba024c6b2aeb45e0aab8aa1762f9cac30ce3934da529b738e9","up":true},{"one":"1dc0ef1ce68dc681298177bde808af514efa52a5ad38c9cd2bd61968cdf19cfb","other":"18e00a7e0f826a1aba3f8c0f533ed905f2eee607b697fff056ee7874d374adcd","up":true},{"one":"b3f95f225e2b6b76e6c7ef7c86caf83e35213f6a22da41e653ca1c190be23c9c","other":"a5ac04d53b569e418ef5007961431155f2c226ee10157b30af71ea4836b08089","up":true},{"one":"7660828fb0c8f89201d34e6f4d61cc6ba9a30cead6e4eb8253f6cc92e1845f23","other":"56635699bd3bc78193adbdb8e8b7c2c91dab4140fdaa506fea2300ee86c4ba81","up":true},{"one":"955da15edae50a4c68bc8c579b9799d55f41b7c2a6178f645f79d772e0116662","other":"9ec831d97418916fd9695465e041caf27824dbb51d6ff74d6b70f3bd561e70e6","up":true},{"one":"30feca631f06041cb14cead384dfaa5fffa6dc34b0cee54230efbe15e56a5884","other":"3a628ef171c1f26fa0966eb89210be0a14305aae8bfed10f4ed9017698f40f4b","up":true},{"one":"67f383e5334e9b6701d1dbb20876d4ba9a7e578af0476caed4a7e1b701f2bedb","other":"68cbc4a5313080d5dca8ad34e8bf52a6144e0ff8ef3f795d7ae9d5f644fe2042","up":true},{"one":"a2a163ce2cb092b411c994cc5d5ef555d539d2dcf4e7e1aeb528d2216dc481e5","other":"a4ee49bb2caabb6b9448bcdff1fc3cc673a2db04eab9f5c62d1787f2c25990a0","up":true},{"one":"8358a74fc8d8e39ccc40b4d3a212b7a69a6a8f6afc25cff2c9c7b44bbaf9ec82","other":"80735a728720bba0ac08daaccd093370d672a8f9a50845ad78ccd6cf8686c39f","up":true},{"one":"8cc3fb39009d0adc26fca1e2ee96822d168d4debc379fd516c15d4b4a1624231","other":"8d192b11538072db750f71204e2e6adf9dc0508d9c5cf1eb457e4e996cd985bc","up":true},{"one":"d3022a46956e75bca85ba89d97b694a3a64f03ccc2d881ed0cd687d43d486925","other":"ddb8be472c3d48dc4d3d112448e6c0c4a826a18af3f3b53fdfef8cd31053c75f","up":true},{"one":"019109311d4888497aa194cce4a89b5ef243421cf0e7e7bb9115d086e1a1f7d7","other":"035f15499cdb0f079b3e358ad54a6122681442a5293c3ae2fdf6c527004b36d2","up":true},{"one":"51440ab47fc5076c00cad16a542b846c26b3281ecea4dbca795ae9b80183ec90","other":"56ca9dd846a58a0ffa7b49a88aad559a338ba535a6f738468b8f146c97890cb2","up":true},{"one":"86d6f68ec0b8e1b3406943787f918bee74dd1827998bdb13ece8f690da2d296a","other":"84a9db7645c792dc38c1f2113a8f0590d04e1c94d9a8c464ab0ec8219303d966","up":true},{"one":"d3022a46956e75bca85ba89d97b694a3a64f03ccc2d881ed0cd687d43d486925","other":"ff75b19017c84128f38dec4f63e1f247a5691dc0fae186e667afedb5fe9d2c80","up":true},{"one":"30feca631f06041cb14cead384dfaa5fffa6dc34b0cee54230efbe15e56a5884","other":"31e129ab3df7e082cc27c649d9ee29a3ea646d6a97d2417875b80e3ff576c047","up":true},{"one":"7ce7fec833a2e8c7720fcc97f820f2ca2aca85388210f887c3efe78b020766e7","other":"7c464054ea7b6c9ea0c7d4c209769c92f294a9db2ca159b8ef168e310a1eac3a","up":true},{"one":"32ff1969d90aaa5a8ed2260968a8e2bac2d1cae597c906f90495f1dc5de7f8d3","other":"318828fa893a28cc0652d3f81d97c5b8e023e853685f5d3e65fde20689abcc5a","up":true},{"one":"81a5a07f92f813e85b501b0028e1caa6e6a6c7efa5195ecb693cd2d91d5132a0","other":"834f14e9f325482adef62651ddf3685690dd5ebdd18014f2bd266b2143c290ff","up":true},{"one":"ed424d24d702520bf7cb5f6babbdc43a078435fb4a9884ed82a93d642839e127","other":"eb686a686fd70e41659cc69ec0db53d1512dfec238918afd0a515d8ce177d4d9","up":true},{"one":"447a411c80fbd422bfa0c358d3f2a1fe6256c05e35acc6350958dfbe62cd5b9b","other":"5c373034770e413e700b1cd03b2035f769ecd9ab8eb54d32f7b2645be1991fe5","up":true},{"one":"994839e5f3a5b8b23aed84fb029413124af17804b79b0263ec6bfd5aec5dad78","other":"9ec831d97418916fd9695465e041caf27824dbb51d6ff74d6b70f3bd561e70e6","up":true},{"one":"feb3bc17ee7369a4fa9889d9250fed3c1257c70916871996e6eabd374dd8dc2e","other":"e471efbcf1def3915b3dda2dc65a86945c607be54a33e31e9625549becac0e34","up":true},{"one":"f9ded7b83e473e71be2fc0101d574c44521c96f77f9f84a384785a3af6b1093d","other":"ff75b19017c84128f38dec4f63e1f247a5691dc0fae186e667afedb5fe9d2c80","up":true},{"one":"67909bdcaef2330ef120e524c76e1e382b474f3332d86f65282028e051f34c75","other":"6d5ec591af4966ba024c6b2aeb45e0aab8aa1762f9cac30ce3934da529b738e9","up":true},{"one":"87a337622455ae65daf3ab2555cee8985e9aa14bac245545d985296060e4a8de","other":"84a9db7645c792dc38c1f2113a8f0590d04e1c94d9a8c464ab0ec8219303d966","up":true},{"one":"fc514c43c4eb5c62798458da5d622e9248a6e530e4288cd902019aa05c4374d8","other":"f6c028d6a2b6408e90169151f4519b561ed183bd8925ed9a1702806f397666e7","up":true},{"one":"e471efbcf1def3915b3dda2dc65a86945c607be54a33e31e9625549becac0e34","other":"f6c028d6a2b6408e90169151f4519b561ed183bd8925ed9a1702806f397666e7","up":true},{"one":"094256812084c6052a2604149aa3aba2379c483bf4ec25162f6b43934942775a","other":"08bd1e049859b4a7c8078ca9741fe3daa668b9fe478da06d1a435cd5566b3e11","up":true},{"one":"885427318634c458a3050f2f26eb52454a75cea4a1263b9ed55e6eb899743854","other":"8e282b0f27d4fa56fe14cfeb69fac5a53e3d882c7778eb190653e2eab7c93fd2","up":true},{"one":"f2b49a2247c9c5e8f6f755834a37fe5c17f208f994878e14b7001e404f52e125","other":"b78fd21c063006e2e033d1d00fc21e1ad7ad7951bb5621cec9b56639745d65f9","up":true},{"one":"bea10868d5da506c1801de845c148c2f09761893113ac913fe66674a8f43c178","other":"be68267d77fb52424227267c665ca1193a010334cac057338aca77b49a4b94da","up":true},{"one":"807416cc70f02d481a188027f7932b48e8f7b5e8258f7e9623f3f6e2985d8f6a","other":"84a9db7645c792dc38c1f2113a8f0590d04e1c94d9a8c464ab0ec8219303d966","up":true},{"one":"19ea0a685fc4edd298b736dc7a778c9ec4362de378876911105fa9ba2ce90204","other":"1049d321a450726cf39d1d7cea1c108be3bec137a644b62cdc73a853f5a5a22b","up":true},{"one":"cdb13873ac058861f295ebca5d958bf2bb793e3f9e274cf5a73a633425a9276f","other":"c9c302de4afe7b4dcbb6f3e366ce747083f9dcd7d5c6a01b939da5cdc6ccc874","up":true},{"one":"2a507f5cb921137a7225c9c4988a8514af0f7e3c442cb8bf2bb612dc522a7daf","other":"26ab9c813822dbb4f1a230cd8e99e8ab280b242747deb55fdf93d160906ef331","up":true},{"one":"c8ea4177420785926e0929701f5e74c744920386f2a43b89d83c8281106cb95e","other":"c190f9d08c78ed6dffadaef36e77fe6aa96099e4453753b0cfc8ec542fa96b9d","up":true},{"one":"5d82a418629cfbe7c57105309319ad695a198626fe3571de213a12ddf62f7308","other":"43d43e9ebcbceb4830fc1d2d5024650b90698306bbd2c4d0b4841a1a8fd09c93","up":true},{"one":"9959385385aade728d3f5763806596222bc1e7b9946c2c92407943d080b32f8d","other":"9c21cb3e56f8ac66a7917a9ba14e58f77e998ac70c178b88b5053d9ac2777e60","up":true},{"one":"140dd212f2b193ee6a9d7fc14f7da321c7ef6fd367fb4f194924fd0ad5d135cc","other":"1fd0192df1fbf33771ca575afbb4e27c6541cce4a3cff2dfc1f2c085e7fab79e","up":true},{"one":"9f0e2bf8a962156c9e0a83c3d42ad3dc5ac5c3e508f24200bfb151aad4e395ff","other":"9c21cb3e56f8ac66a7917a9ba14e58f77e998ac70c178b88b5053d9ac2777e60","up":true},{"one":"834f14e9f325482adef62651ddf3685690dd5ebdd18014f2bd266b2143c290ff","other":"8402bd62282811ed236b2fa1f0d41ad4bbe54e420ee34adc6164cfd4baf8658d","up":true},{"one":"c42e6492879439eeecd9938d17ff283fd8f5f24206906ca512b4daa4803b78b4","other":"da36d1df95a158b0d3f9e7407d663a6b611dde0a77f00a584b97a939ab6a00de","up":true},{"one":"9ca1fd5d41975acb905f337997922849b4070360e47849bb4fd8cd1b9ddb4d73","other":"93ea8ef251fd56b159e080cdf733d33e1fdfb3c7ae5bd9a6a328d0bf5458867b","up":true},{"one":"bfc711793830779f49aa59bc6f7a205ab4e6eae7abfdafbf3bb5a1163a778ab2","other":"b8e1a8622c256ef29acd52df7b3ace50820fb1a147716165ff862fdc973a48cd","up":true},{"one":"a6165a4b02d58be116892982c0ed3d49d86fec0e9f436a516b61868331ed853f","other":"a7a856a43293aa3004848a86f187e09343bd605e1a93e853a6f6b6b1031bd667","up":true},{"one":"eebd48b367cbfe94a37c0deb274a697e628074f9560b909e66229c5c76ce68eb","other":"e09f98114da64e7547b351637190f6621a1f75568cfa9960980fc77618f8855b","up":true},{"one":"e64d90760cd81e4f112bbf1432e76c82fa4173fd474b988f4096ce187363fd81","other":"e6812448728b4bda5962adceb1707b29f661d3d1a6b2ccd5f8183c9a1f4d01b6","up":true},{"one":"67909bdcaef2330ef120e524c76e1e382b474f3332d86f65282028e051f34c75","other":"6b4ee1b73942ced78f97c0d0e221209933e63ae7353bb9ab3d37ac4127592e86","up":true},{"one":"1dc0ef1ce68dc681298177bde808af514efa52a5ad38c9cd2bd61968cdf19cfb","other":"3728152c88f1e5e61f6523b09e8f3bb1023b700deccdca5fcc1e6488136b0e57","up":true},{"one":"56ca9dd846a58a0ffa7b49a88aad559a338ba535a6f738468b8f146c97890cb2","other":"50c1a8023bfecffb09472fdc50898f4d050a31443d40a6c07b629090beb0df3d","up":true},{"one":"3a628ef171c1f26fa0966eb89210be0a14305aae8bfed10f4ed9017698f40f4b","other":"26ab9c813822dbb4f1a230cd8e99e8ab280b242747deb55fdf93d160906ef331","up":true},{"one":"5c373034770e413e700b1cd03b2035f769ecd9ab8eb54d32f7b2645be1991fe5","other":"5a26ae73eebf27f6dbec2414f1277a249e814a7a06790d7061610e5227b086f6","up":true},{"one":"51440ab47fc5076c00cad16a542b846c26b3281ecea4dbca795ae9b80183ec90","other":"56635699bd3bc78193adbdb8e8b7c2c91dab4140fdaa506fea2300ee86c4ba81","up":true},{"one":"ed424d24d702520bf7cb5f6babbdc43a078435fb4a9884ed82a93d642839e127","other":"f645aab9cb2bd2709998b38e5789c9c5f68d40765e6cbd93b92e6383eb671dba","up":true},{"one":"4cece9bc134bc2b09400c9f7f8a4df9270d2fe3c077c5e441fffc911fcf6f42e","other":"43d43e9ebcbceb4830fc1d2d5024650b90698306bbd2c4d0b4841a1a8fd09c93","up":true},{"one":"86d6f68ec0b8e1b3406943787f918bee74dd1827998bdb13ece8f690da2d296a","other":"834f14e9f325482adef62651ddf3685690dd5ebdd18014f2bd266b2143c290ff","up":true},{"one":"16868ec5d8f490ac73ea28b4e8fdda55ac149bb1aafb177545b54b84a5ad5367","other":"140dd212f2b193ee6a9d7fc14f7da321c7ef6fd367fb4f194924fd0ad5d135cc","up":true},{"one":"a5ac04d53b569e418ef5007961431155f2c226ee10157b30af71ea4836b08089","other":"a32749dc4e134a4fbb038618c58a7c05bbbaa06f1436de3754341af86402581b","up":true},{"one":"5a26ae73eebf27f6dbec2414f1277a249e814a7a06790d7061610e5227b086f6","other":"447a411c80fbd422bfa0c358d3f2a1fe6256c05e35acc6350958dfbe62cd5b9b","up":true},{"one":"48d79ac55f8df512af8e7d868aa40ac9b61493fa4f1b0ce0b76bf6da2eb30e78","other":"4d9147e3bf98cb59a7648f616c0d7f713a8cf3b7d25e3115233ff5883128beab","up":true},{"one":"f215bc09268e60ebbec76f743bebd09d7e72d4cbeedc0b9d3417bb4a2ef42935","other":"f2b49a2247c9c5e8f6f755834a37fe5c17f208f994878e14b7001e404f52e125","up":true},{"one":"793322608055d4873776a9a0a6c40b04379bfd2f289a8ad49a7dc456bc65f871","other":"7e47a2f82984a600c8583605a91d5cb8f2d9a18961845e9c422edd78e20ac3a3","up":true},{"one":"48f1ca6d433019f932fa4ae03e0decbcbea3fe635edff4458a669b83f8162b9a","other":"482ec3dc05460579ea9bce87677bd3d9a1930e801fabeba607b8ab6b8729ff15","up":true},{"one":"ddb8be472c3d48dc4d3d112448e6c0c4a826a18af3f3b53fdfef8cd31053c75f","other":"da36d1df95a158b0d3f9e7407d663a6b611dde0a77f00a584b97a939ab6a00de","up":true},{"one":"f1ed9d45622ff974a1e396cd878b2deb89e31aa5d08da773423f292ae8dbcbb6","other":"ff75b19017c84128f38dec4f63e1f247a5691dc0fae186e667afedb5fe9d2c80","up":true},{"one":"035f15499cdb0f079b3e358ad54a6122681442a5293c3ae2fdf6c527004b36d2","other":"05949ec1a582fa70cab95c59e7c0d315583bf9fc320c60c35268931f21e90853","up":true},{"one":"5ac0d00b8d647dec62d26e1a689fd05b8b7a1a79ab8c43493bd6d7d209816df1","other":"553824ef701d3cd0191ae3a67de564ed0cf553e74bd60ed9de321f9302732ba6","up":true},{"one":"447cdbf1ff462aa67d6a46085b1a84fdc495a4142ab174c8e69b271b09732b4d","other":"44adaabf9c46608a374ed816d3c40c63b6645f4f6e033a76431bc8f88713eb41","up":true},{"one":"08f84878e44fed2adb4b2685b9f293dc3c73d5f9bc1c474870d943ec2ae73dbe","other":"0d1c35c6ea485cb33857b790ee262f974cf0d54cf8ce3003f8308ac2e87c2c25","up":true},{"one":"5814be13c8550b9a5a83d08e7af6022002a8fdaa38ba6c2c30be58099a9f7744","other":"5d82a418629cfbe7c57105309319ad695a198626fe3571de213a12ddf62f7308","up":true},{"one":"a32749dc4e134a4fbb038618c58a7c05bbbaa06f1436de3754341af86402581b","other":"a4ee49bb2caabb6b9448bcdff1fc3cc673a2db04eab9f5c62d1787f2c25990a0","up":true},{"one":"9f0e2bf8a962156c9e0a83c3d42ad3dc5ac5c3e508f24200bfb151aad4e395ff","other":"9f7d72b7d9843872904b841e421985082428fba5010db27dd871ed76630a1e1d","up":true},{"one":"447cdbf1ff462aa67d6a46085b1a84fdc495a4142ab174c8e69b271b09732b4d","other":"4005fd1fa8fbb318b29a62c368ada579e5122ca0578e6a75c509552be4b63b76","up":true},{"one":"8862cd85d7039119b984f752a458ac0495ddea98c69fc1d1241db7873a712c11","other":"8d192b11538072db750f71204e2e6adf9dc0508d9c5cf1eb457e4e996cd985bc","up":true},{"one":"bea10868d5da506c1801de845c148c2f09761893113ac913fe66674a8f43c178","other":"bfc711793830779f49aa59bc6f7a205ab4e6eae7abfdafbf3bb5a1163a778ab2","up":true},{"one":"140dd212f2b193ee6a9d7fc14f7da321c7ef6fd367fb4f194924fd0ad5d135cc","other":"1dc0ef1ce68dc681298177bde808af514efa52a5ad38c9cd2bd61968cdf19cfb","up":true},{"one":"4a95d49f58057b039b55a34f67a348c052f61770065e41243ff055efc570a935","other":"4d9147e3bf98cb59a7648f616c0d7f713a8cf3b7d25e3115233ff5883128beab","up":true},{"one":"7660828fb0c8f89201d34e6f4d61cc6ba9a30cead6e4eb8253f6cc92e1845f23","other":"7e47a2f82984a600c8583605a91d5cb8f2d9a18961845e9c422edd78e20ac3a3","up":true},{"one":"d3e913cf4a7dabfb5699131b65e533a40adb46ea37e0ed4ce9433f99015986ef","other":"d3022a46956e75bca85ba89d97b694a3a64f03ccc2d881ed0cd687d43d486925","up":true},{"one":"34118166845c185d15c286b7e5433539ee98ed634baabd534d57369fd5f7c681","other":"318828fa893a28cc0652d3f81d97c5b8e023e853685f5d3e65fde20689abcc5a","up":true},{"one":"bcf85ecf421b871fca0247a7081188a8e2c08778b88ffad16db37ef024fec0fc","other":"bbafac5ba5915db3c80e28b249cad260b9b5dad1f728063c48fa8f61d7556e17","up":true},{"one":"ef99b6cdc05345a1ee82267890e3ccaeef1f2bd2fe7ae8b02b6b20b9a5ef85bb","other":"eff2450bea797ff66d93e7c1c1b0977cddf3abba64bfa51bcc509d728569e2fa","up":true},{"one":"2fd2f77d76cca480ac18e9af7a462f297db168c3370b3bc0e2c04aa006c4d037","other":"7c464054ea7b6c9ea0c7d4c209769c92f294a9db2ca159b8ef168e310a1eac3a","up":true},{"one":"5c7c15798e86fe794bb201614d46366ea96dc51091f5b19f149995e0d40df0a6","other":"5a8b84df651871fce72d11cb1c26c87ae4a0cc6b4c274d37e70532c94f27288e","up":true},{"one":"24f80c437be45898e594f821bba0f5c62e0c9a0c720118e362ee6f78410612bd","other":"26ab9c813822dbb4f1a230cd8e99e8ab280b242747deb55fdf93d160906ef331","up":true},{"one":"035f15499cdb0f079b3e358ad54a6122681442a5293c3ae2fdf6c527004b36d2","other":"07f5d094a4b22e73cdd6c85452b3d928da9b4b16873824759cb7e8a622417fd5","up":true},{"one":"4a95d49f58057b039b55a34f67a348c052f61770065e41243ff055efc570a935","other":"ba911175d3aa3fcc266e2a5aa32fb706208b8a9b5021a5f37c0b85f547eb375d","up":true},{"one":"a3309f8b8bba4d8fbd7c6193d7671cb907b94e71155ef6138e0248682ff00e58","other":"bfc711793830779f49aa59bc6f7a205ab4e6eae7abfdafbf3bb5a1163a778ab2","up":true},{"one":"8d192b11538072db750f71204e2e6adf9dc0508d9c5cf1eb457e4e996cd985bc","other":"8b4318f86ad47976321af97bfbf95cd0a3b0aa22447aeb0611ed1a9bf1e6a4bf","up":true},{"one":"18e00a7e0f826a1aba3f8c0f533ed905f2eee607b697fff056ee7874d374adcd","other":"1049d321a450726cf39d1d7cea1c108be3bec137a644b62cdc73a853f5a5a22b","up":true},{"one":"f7561cb6740e17ec7c7d17068251b2c951d954c77804aa5af60464e9c3964e57","other":"f645aab9cb2bd2709998b38e5789c9c5f68d40765e6cbd93b92e6383eb671dba","up":true},{"one":"9959385385aade728d3f5763806596222bc1e7b9946c2c92407943d080b32f8d","other":"9c8e1f23f260c5a46b0001572675b19e5293ca65e7fdfc131c07612e9c4072fa","up":true},{"one":"7d162a11662585f8c38d88fb241623e67bacf90703065dae6c092b4b507d6543","other":"7e47a2f82984a600c8583605a91d5cb8f2d9a18961845e9c422edd78e20ac3a3","up":true},{"one":"a0c88ba70599b0e72c18fa6aedd14d607cca3e9a49a5d50165d084e70328c2dd","other":"be68267d77fb52424227267c665ca1193a010334cac057338aca77b49a4b94da","up":true},{"one":"6d5ec591af4966ba024c6b2aeb45e0aab8aa1762f9cac30ce3934da529b738e9","other":"60c5647aed152609979366fb33dc8b28fc60736098ff68d232415889b43dfa58","up":true},{"one":"6d5ec591af4966ba024c6b2aeb45e0aab8aa1762f9cac30ce3934da529b738e9","other":"6dd3ac0fd9a04a2ce75875c683d135e52eaa1670cb55e78711620712e60fde47","up":true},{"one":"5d82a418629cfbe7c57105309319ad695a198626fe3571de213a12ddf62f7308","other":"56635699bd3bc78193adbdb8e8b7c2c91dab4140fdaa506fea2300ee86c4ba81","up":true},{"one":"c53417f008e4550e1c4cb9a3e2955b3af6403e059b7b4b4c33869d9ed4a580a5","other":"c74d801e85ac0fd8951480d107b41eddc5c92775614c4886b3f732fa3d1a791d","up":true},{"one":"f6c028d6a2b6408e90169151f4519b561ed183bd8925ed9a1702806f397666e7","other":"e6812448728b4bda5962adceb1707b29f661d3d1a6b2ccd5f8183c9a1f4d01b6","up":true},{"one":"bdc5de01276157a0f3fc43a9cc3b41b2cacc8479118b75aec4ba9b2b7fa86d5e","other":"be68267d77fb52424227267c665ca1193a010334cac057338aca77b49a4b94da","up":true},{"one":"2ddffddbf452f0c9268058a739f5757fb90281cbfd31bd6f760acc3392fec12a","other":"244c3c954ac612e51d4945ab9b77f0b4a3983285e8add7921777e0c45a1bf338","up":true},{"one":"a2a163ce2cb092b411c994cc5d5ef555d539d2dcf4e7e1aeb528d2216dc481e5","other":"be68267d77fb52424227267c665ca1193a010334cac057338aca77b49a4b94da","up":true},{"one":"1dec77c2f4caf053c2d0524ae34a2d970bf4743a0d009d8fc543077ddfdfe3d0","other":"1bd588263274543729d54529ae9e9bf4596db40649a1c2a3f73168d818f34b62","up":true},{"one":"7c7ca5a7522a04f62f2bebd6197a03d78f255d0175c3dfceb5d92b684365b2aa","other":"7e47a2f82984a600c8583605a91d5cb8f2d9a18961845e9c422edd78e20ac3a3","up":true},{"one":"955da15edae50a4c68bc8c579b9799d55f41b7c2a6178f645f79d772e0116662","other":"93c0e1adf23fdf1623359eb88c517bc521d5a26325554df890cc04c1fa17a5df","up":true},{"one":"1dec77c2f4caf053c2d0524ae34a2d970bf4743a0d009d8fc543077ddfdfe3d0","other":"1049d321a450726cf39d1d7cea1c108be3bec137a644b62cdc73a853f5a5a22b","up":true},{"one":"398038811c1c7402fe2e6994c9ce2f15c8166b8e99f379feaaed66ac87702062","other":"3b020c84fb60f59779324d451d9770d683e08133bbaa2d5762f61b8fd4b8d9fd","up":true},{"one":"f2b49a2247c9c5e8f6f755834a37fe5c17f208f994878e14b7001e404f52e125","other":"f8ff7440d6f4abb1c89496336843741ed53a544cedeeed71d8ebe0b08698438d","up":true},{"one":"48de553e15afd3e8a46bfc3a5ba8a298158aa3d60f140d2730230af5cce8084d","other":"43c9e1571c460cb9f599fa8ed79ddd0f9c3a21fd2fa455e0603109c55012f76b","up":true},{"one":"8006b080c78a0ab54fa1be75a939bee2334322fded6c3563de1596b17c36172c","other":"8358a74fc8d8e39ccc40b4d3a212b7a69a6a8f6afc25cff2c9c7b44bbaf9ec82","up":true},{"one":"a3309f8b8bba4d8fbd7c6193d7671cb907b94e71155ef6138e0248682ff00e58","other":"a606c79a018a6535375d851fcc82c42cc7c952720aa120434cedccf4a4be1f59","up":true},{"one":"648a96d61898eb2d336ff7d5a229cfeb7b9f587282e40f9fe640e181ae26bdd3","other":"6e7f1f3d65364399617a4d95fdd04f2ca9b007b2366943e7ba5acd4616a7a425","up":true},{"one":"5ac0d00b8d647dec62d26e1a689fd05b8b7a1a79ab8c43493bd6d7d209816df1","other":"59876e7ff9e92243856dad23126e1d38d9a5ddae79772ed1b2bdb91f33a4a4b5","up":true},{"one":"af02c2f471e96ab8defbd229215695b95e64f7c78b145b6793a238961f556fbf","other":"a8b58013ff911871d1aa6c2bbea6c2e6ef9b00b87b80a41dc04724ad0488e2ff","up":true},{"one":"af02c2f471e96ab8defbd229215695b95e64f7c78b145b6793a238961f556fbf","other":"a9700308516c02cf9aea8809000a4e0596d6b44753e10bd0928df83e2eb9b9e7","up":true},{"one":"f215bc09268e60ebbec76f743bebd09d7e72d4cbeedc0b9d3417bb4a2ef42935","other":"f6c028d6a2b6408e90169151f4519b561ed183bd8925ed9a1702806f397666e7","up":true},{"one":"0e3b7722f3f84d83b3d744bea4e893715a01d4df3cf4a1c6a6823a1f5c9ad6b8","other":"0e2b48558ce2af1fbfee38a557d56072e3091cfcaee8d7847c7c9dcf7bef9bfa","up":true},{"one":"7895b2cb97b473f8893cc70a4421e0f8be1c033b27cd730fa13438b7a8f3fcb5","other":"2fd2f77d76cca480ac18e9af7a462f297db168c3370b3bc0e2c04aa006c4d037","up":true},{"one":"feb3bc17ee7369a4fa9889d9250fed3c1257c70916871996e6eabd374dd8dc2e","other":"f9ded7b83e473e71be2fc0101d574c44521c96f77f9f84a384785a3af6b1093d","up":true},{"one":"a3309f8b8bba4d8fbd7c6193d7671cb907b94e71155ef6138e0248682ff00e58","other":"a5ac04d53b569e418ef5007961431155f2c226ee10157b30af71ea4836b08089","up":true},{"one":"30feca631f06041cb14cead384dfaa5fffa6dc34b0cee54230efbe15e56a5884","other":"3c5b2e125020c80e3674df9cac34de4d8f3a94ee02556fb557921b6d5498b933","up":true},{"one":"b659418885032905ea20ad47d70470e403e7e407e0e9ebf9277f9a2d81ec121c","other":"b3f95f225e2b6b76e6c7ef7c86caf83e35213f6a22da41e653ca1c190be23c9c","up":true},{"one":"30feca631f06041cb14cead384dfaa5fffa6dc34b0cee54230efbe15e56a5884","other":"31e670638acba3d58f4c67f3ff2f3f25d769e8a5d7a7838927f4d9d169a84404","up":true},{"one":"30feca631f06041cb14cead384dfaa5fffa6dc34b0cee54230efbe15e56a5884","other":"305162c472c71ddef2320b138102b67d1ce2b8bba79e2e587fc80e085c88e547","up":true},{"one":"7c7ca5a7522a04f62f2bebd6197a03d78f255d0175c3dfceb5d92b684365b2aa","other":"7d162a11662585f8c38d88fb241623e67bacf90703065dae6c092b4b507d6543","up":true},{"one":"48f1ca6d433019f932fa4ae03e0decbcbea3fe635edff4458a669b83f8162b9a","other":"4cece9bc134bc2b09400c9f7f8a4df9270d2fe3c077c5e441fffc911fcf6f42e","up":true},{"one":"837f0993f6374039a5ad4472d6313e647a4c5db4583bd27ccfa98d3448a17731","other":"8cc3fb39009d0adc26fca1e2ee96822d168d4debc379fd516c15d4b4a1624231","up":true},{"one":"1bd588263274543729d54529ae9e9bf4596db40649a1c2a3f73168d818f34b62","other":"1049d321a450726cf39d1d7cea1c108be3bec137a644b62cdc73a853f5a5a22b","up":true},{"one":"ba911175d3aa3fcc266e2a5aa32fb706208b8a9b5021a5f37c0b85f547eb375d","other":"b8e1a8622c256ef29acd52df7b3ace50820fb1a147716165ff862fdc973a48cd","up":true},{"one":"feb3bc17ee7369a4fa9889d9250fed3c1257c70916871996e6eabd374dd8dc2e","other":"f1ed9d45622ff974a1e396cd878b2deb89e31aa5d08da773423f292ae8dbcbb6","up":true},{"one":"398038811c1c7402fe2e6994c9ce2f15c8166b8e99f379feaaed66ac87702062","other":"31e129ab3df7e082cc27c649d9ee29a3ea646d6a97d2417875b80e3ff576c047","up":true},{"one":"6d5ec591af4966ba024c6b2aeb45e0aab8aa1762f9cac30ce3934da529b738e9","other":"70f68562733da4e3b1c3949fb6e11ac0bdd49ea7e732925f937f87df5af698d6","up":true},{"one":"dad08999cd2edc33cfdc59ea34c8adcd6a34eaa15f2e85b0622e9848b215c1d5","other":"da36d1df95a158b0d3f9e7407d663a6b611dde0a77f00a584b97a939ab6a00de","up":true},{"one":"2ddffddbf452f0c9268058a739f5757fb90281cbfd31bd6f760acc3392fec12a","other":"298ae5d173c5360bc9ad5b492ed35de3b6e0cae868a34bfe6311a8ba5ea9877e","up":true},{"one":"d408bb6f7af1590e1f162ce02cc016b1b86ede29851caa32434212ffa2a377c8","other":"cf52b3fc82ec24c3e9b40488d7c5f7ac8af731d159a103619bee932ec74d5e92","up":true},{"one":"6d3c6db15900f2596286f81cc0664d2c8291ead5bad2aa35bad515af088a2e48","other":"70f68562733da4e3b1c3949fb6e11ac0bdd49ea7e732925f937f87df5af698d6","up":true},{"one":"52a8747e4ea35f6f50c72d7c481616f68a5e4396248332b8ff69d3a772de49ac","other":"56ca9dd846a58a0ffa7b49a88aad559a338ba535a6f738468b8f146c97890cb2","up":true},{"one":"bfc711793830779f49aa59bc6f7a205ab4e6eae7abfdafbf3bb5a1163a778ab2","other":"ba911175d3aa3fcc266e2a5aa32fb706208b8a9b5021a5f37c0b85f547eb375d","up":true},{"one":"fc3911383f74a982f6af8ab95a63426b56117d45f153b3c1441459d9191daaff","other":"ff75b19017c84128f38dec4f63e1f247a5691dc0fae186e667afedb5fe9d2c80","up":true},{"one":"8358a74fc8d8e39ccc40b4d3a212b7a69a6a8f6afc25cff2c9c7b44bbaf9ec82","other":"834f14e9f325482adef62651ddf3685690dd5ebdd18014f2bd266b2143c290ff","up":true},{"one":"9b8e6bb3a7fe4dc65ac97404e546d8b777d068c94bc2355f4f1a510ad6c11905","other":"9ec831d97418916fd9695465e041caf27824dbb51d6ff74d6b70f3bd561e70e6","up":true},{"one":"8e7b96d28edae711e1a4cee0d894e0bd92cdf410ba6f61713f7d9b0bee761d4c","other":"8e282b0f27d4fa56fe14cfeb69fac5a53e3d882c7778eb190653e2eab7c93fd2","up":true},{"one":"9c8e1f23f260c5a46b0001572675b19e5293ca65e7fdfc131c07612e9c4072fa","other":"97daf2cbe03c80ce6c4dae39cd071dd93cb32ed245aa9aa77285e12296957ca3","up":true},{"one":"5814be13c8550b9a5a83d08e7af6022002a8fdaa38ba6c2c30be58099a9f7744","other":"5a8b84df651871fce72d11cb1c26c87ae4a0cc6b4c274d37e70532c94f27288e","up":true},{"one":"8e282b0f27d4fa56fe14cfeb69fac5a53e3d882c7778eb190653e2eab7c93fd2","other":"80d7e892bbb26808abb1d1530077fec6b08768c151a9f220881da3c862bae0af","up":true},{"one":"dbd4d90e3342ef837b8ecf5c6e490f7c409f419cf36b77162a87cb2cfb8ae33c","other":"cf52b3fc82ec24c3e9b40488d7c5f7ac8af731d159a103619bee932ec74d5e92","up":true},{"one":"24f80c437be45898e594f821bba0f5c62e0c9a0c720118e362ee6f78410612bd","other":"298ae5d173c5360bc9ad5b492ed35de3b6e0cae868a34bfe6311a8ba5ea9877e","up":true},{"one":"1b1dc3f9312df141855c545dd16aee325f9a609230ec6165bdbbb07d0c0862f6","other":"1addd4a9f01486212e13e43a9650b7f793617d1cb59fb8d941270d7ae55f575f","up":true},{"one":"ab3ff955033c0a2615932faf85fd20090b9121c7edcc8e6f7ce4c4fde0a96b8a","other":"aceee75a260d45252060fe971eabd4bde25f912db4a3c6e47f4a09572fe01697","up":true},{"one":"8358a74fc8d8e39ccc40b4d3a212b7a69a6a8f6afc25cff2c9c7b44bbaf9ec82","other":"84a9db7645c792dc38c1f2113a8f0590d04e1c94d9a8c464ab0ec8219303d966","up":true},{"one":"a8ff8d69dcb36462d1116dafa5e3d0c7237bf65dbece482a316862c8d66e35b6","other":"aeb45fe10b0dbd0f72ab6a77fbf971a8f46dbcdd96c08f23279d1434b4f38b1d","up":true},{"one":"ab3ff955033c0a2615932faf85fd20090b9121c7edcc8e6f7ce4c4fde0a96b8a","other":"a9700308516c02cf9aea8809000a4e0596d6b44753e10bd0928df83e2eb9b9e7","up":true},{"one":"dbd4d90e3342ef837b8ecf5c6e490f7c409f419cf36b77162a87cb2cfb8ae33c","other":"c42e6492879439eeecd9938d17ff283fd8f5f24206906ca512b4daa4803b78b4","up":true},{"one":"bbafac5ba5915db3c80e28b249cad260b9b5dad1f728063c48fa8f61d7556e17","other":"bfc711793830779f49aa59bc6f7a205ab4e6eae7abfdafbf3bb5a1163a778ab2","up":true},{"one":"e0a0ba7e7e89a7af805e24abde1a5a5b489ba197585051a8755e8c2345c3d57b","other":"e6812448728b4bda5962adceb1707b29f661d3d1a6b2ccd5f8183c9a1f4d01b6","up":true},{"one":"b6dffac4b4eb2974ed0ed241799f97d2e5d9be671e311266826d0dcfecfcc209","other":"bfc711793830779f49aa59bc6f7a205ab4e6eae7abfdafbf3bb5a1163a778ab2","up":true},{"one":"c603138e40fe2f85cc634017956ada6399fca99969e3bf0c1ee8428374e779f1","other":"cd6c8b42a0b092f41e6925577c9de7d1bea17231bcb3d08f3d3cce9c6fdcf22d","up":true},{"one":"807416cc70f02d481a188027f7932b48e8f7b5e8258f7e9623f3f6e2985d8f6a","other":"80735a728720bba0ac08daaccd093370d672a8f9a50845ad78ccd6cf8686c39f","up":true},{"one":"094256812084c6052a2604149aa3aba2379c483bf4ec25162f6b43934942775a","other":"096a8302b6f369c28ed9d47719a507ead8a3cc1ca4fa1e32318b7f97873955fe","up":true},{"one":"447a411c80fbd422bfa0c358d3f2a1fe6256c05e35acc6350958dfbe62cd5b9b","other":"43c9e1571c460cb9f599fa8ed79ddd0f9c3a21fd2fa455e0603109c55012f76b","up":true},{"one":"0e2b48558ce2af1fbfee38a557d56072e3091cfcaee8d7847c7c9dcf7bef9bfa","other":"08e5a268f397385c69a7fec855ae4d889cfa98afef5b7c09fc4841e3f8894ad8","up":true},{"one":"8e7b96d28edae711e1a4cee0d894e0bd92cdf410ba6f61713f7d9b0bee761d4c","other":"8d192b11538072db750f71204e2e6adf9dc0508d9c5cf1eb457e4e996cd985bc","up":true},{"one":"4b79e83186f2ab05932eaa99982a2e53373b83780e32d224d15cb2c85462451f","other":"482ec3dc05460579ea9bce87677bd3d9a1930e801fabeba607b8ab6b8729ff15","up":true},{"one":"95c0a351fb7aa6683280d159a7b808bfa63f63bff91a1c5936e973b2e5d3954f","other":"9c8e1f23f260c5a46b0001572675b19e5293ca65e7fdfc131c07612e9c4072fa","up":true},{"one":"885427318634c458a3050f2f26eb52454a75cea4a1263b9ed55e6eb899743854","other":"84a9db7645c792dc38c1f2113a8f0590d04e1c94d9a8c464ab0ec8219303d966","up":true},{"one":"7c7ca5a7522a04f62f2bebd6197a03d78f255d0175c3dfceb5d92b684365b2aa","other":"79e5c6c6d78c88c579003cda044882ecb04520fbad1f5feadbe7b6d23fe183c8","up":true},{"one":"b5eab4869b4cb65bdc1e5cab45c03016d202f9f5b668be50066451cfcf9ef299","other":"b3f95f225e2b6b76e6c7ef7c86caf83e35213f6a22da41e653ca1c190be23c9c","up":true},{"one":"994839e5f3a5b8b23aed84fb029413124af17804b79b0263ec6bfd5aec5dad78","other":"9c21cb3e56f8ac66a7917a9ba14e58f77e998ac70c178b88b5053d9ac2777e60","up":true},{"one":"eb686a686fd70e41659cc69ec0db53d1512dfec238918afd0a515d8ce177d4d9","other":"f1ed9d45622ff974a1e396cd878b2deb89e31aa5d08da773423f292ae8dbcbb6","up":true},{"one":"a1c85ee75edb807a01f4ce930086c948918aade324752609b078c28991c04e86","other":"a6165a4b02d58be116892982c0ed3d49d86fec0e9f436a516b61868331ed853f","up":true},{"one":"2ddffddbf452f0c9268058a739f5757fb90281cbfd31bd6f760acc3392fec12a","other":"2a507f5cb921137a7225c9c4988a8514af0f7e3c442cb8bf2bb612dc522a7daf","up":true},{"one":"fc3911383f74a982f6af8ab95a63426b56117d45f153b3c1441459d9191daaff","other":"fc514c43c4eb5c62798458da5d622e9248a6e530e4288cd902019aa05c4374d8","up":true},{"one":"c6a8220726243cceaa6f2cebdac857a05efe721323f0a064c7f85a8340d3da96","other":"c190f9d08c78ed6dffadaef36e77fe6aa96099e4453753b0cfc8ec542fa96b9d","up":true},{"one":"32ff1969d90aaa5a8ed2260968a8e2bac2d1cae597c906f90495f1dc5de7f8d3","other":"305162c472c71ddef2320b138102b67d1ce2b8bba79e2e587fc80e085c88e547","up":true},{"one":"f1ed9d45622ff974a1e396cd878b2deb89e31aa5d08da773423f292ae8dbcbb6","other":"f9ded7b83e473e71be2fc0101d574c44521c96f77f9f84a384785a3af6b1093d","up":true},{"one":"ec90a22f41ee659d5759a497946ac2991c916f00fe7caeeeb0908f3af1fe60b6","other":"e8676d17966625c4fdac6bd9437981a0cf869c8b0010812edf0c79805e0e1ff1","up":true},{"one":"fc514c43c4eb5c62798458da5d622e9248a6e530e4288cd902019aa05c4374d8","other":"e8676d17966625c4fdac6bd9437981a0cf869c8b0010812edf0c79805e0e1ff1","up":true},{"one":"435d721a568eb906a03c69dbd71337251a550521a4004ab5d4a7deb6f317061a","other":"43c9e1571c460cb9f599fa8ed79ddd0f9c3a21fd2fa455e0603109c55012f76b","up":true},{"one":"bbafac5ba5915db3c80e28b249cad260b9b5dad1f728063c48fa8f61d7556e17","other":"b3f95f225e2b6b76e6c7ef7c86caf83e35213f6a22da41e653ca1c190be23c9c","up":true},{"one":"b8e1a8622c256ef29acd52df7b3ace50820fb1a147716165ff862fdc973a48cd","other":"be68267d77fb52424227267c665ca1193a010334cac057338aca77b49a4b94da","up":true},{"one":"1b1dc3f9312df141855c545dd16aee325f9a609230ec6165bdbbb07d0c0862f6","other":"18e00a7e0f826a1aba3f8c0f533ed905f2eee607b697fff056ee7874d374adcd","up":true},{"one":"ab719e60a77ba5253f1690c920df9dd9f3a62071e9cce9d62e0001a522b3409e","other":"ab3ff955033c0a2615932faf85fd20090b9121c7edcc8e6f7ce4c4fde0a96b8a","up":true},{"one":"056152dd9dae85c426378d34acab8d6641da665d2f57359a27a0ff652f3f3d02","other":"046ca54165f0dd4d62fd7d8ee9e97c655db3d35f5452a0ccb0dffc79c047978c","up":true},{"one":"19ea0a685fc4edd298b736dc7a778c9ec4362de378876911105fa9ba2ce90204","other":"1addd4a9f01486212e13e43a9650b7f793617d1cb59fb8d941270d7ae55f575f","up":true},{"one":"5d82a418629cfbe7c57105309319ad695a198626fe3571de213a12ddf62f7308","other":"447a411c80fbd422bfa0c358d3f2a1fe6256c05e35acc6350958dfbe62cd5b9b","up":true},{"one":"955da15edae50a4c68bc8c579b9799d55f41b7c2a6178f645f79d772e0116662","other":"9464ad8da1a5effdc0351742dfffae941ffd9fab469637b2491caece53c57dc8","up":true},{"one":"26ab9c813822dbb4f1a230cd8e99e8ab280b242747deb55fdf93d160906ef331","other":"298ae5d173c5360bc9ad5b492ed35de3b6e0cae868a34bfe6311a8ba5ea9877e","up":true},{"one":"3938e6b2c095084dc9975a3e8649133557495d34ac6df874c6d929266e3ffe6f","other":"3c5b2e125020c80e3674df9cac34de4d8f3a94ee02556fb557921b6d5498b933","up":true},{"one":"3938e6b2c095084dc9975a3e8649133557495d34ac6df874c6d929266e3ffe6f","other":"3a628ef171c1f26fa0966eb89210be0a14305aae8bfed10f4ed9017698f40f4b","up":true},{"one":"951877b34ee1535b5059c49beb03e8960ff9c12b694ef64708c77c30ff1dc706","other":"93ea8ef251fd56b159e080cdf733d33e1fdfb3c7ae5bd9a6a328d0bf5458867b","up":true},{"one":"fc514c43c4eb5c62798458da5d622e9248a6e530e4288cd902019aa05c4374d8","other":"eff2450bea797ff66d93e7c1c1b0977cddf3abba64bfa51bcc509d728569e2fa","up":true},{"one":"6d3c6db15900f2596286f81cc0664d2c8291ead5bad2aa35bad515af088a2e48","other":"679554b410e415cfcdf1b14ef87759269b2bcaf07f4541122977db3a40091da2","up":true},{"one":"3938e6b2c095084dc9975a3e8649133557495d34ac6df874c6d929266e3ffe6f","other":"398038811c1c7402fe2e6994c9ce2f15c8166b8e99f379feaaed66ac87702062","up":true},{"one":"fa240411bc4f3e44dfca3faedd112c7743a67b522a910bc99696ef0b31732ee2","other":"f8ff7440d6f4abb1c89496336843741ed53a544cedeeed71d8ebe0b08698438d","up":true},{"one":"5c7c15798e86fe794bb201614d46366ea96dc51091f5b19f149995e0d40df0a6","other":"5ac0d00b8d647dec62d26e1a689fd05b8b7a1a79ab8c43493bd6d7d209816df1","up":true},{"one":"a9700308516c02cf9aea8809000a4e0596d6b44753e10bd0928df83e2eb9b9e7","other":"a8ff8d69dcb36462d1116dafa5e3d0c7237bf65dbece482a316862c8d66e35b6","up":true},{"one":"cc3397e9e11f75273d3f81d91f980f4504755f80b27a183212de56cc5085e58d","other":"c9c302de4afe7b4dcbb6f3e366ce747083f9dcd7d5c6a01b939da5cdc6ccc874","up":true},{"one":"447cdbf1ff462aa67d6a46085b1a84fdc495a4142ab174c8e69b271b09732b4d","other":"43c9e1571c460cb9f599fa8ed79ddd0f9c3a21fd2fa455e0603109c55012f76b","up":true},{"one":"793322608055d4873776a9a0a6c40b04379bfd2f289a8ad49a7dc456bc65f871","other":"741a854ae299df49a738725bc58abe614e5e4302ffecd8320bbede8412d160c0","up":true},{"one":"32ff1969d90aaa5a8ed2260968a8e2bac2d1cae597c906f90495f1dc5de7f8d3","other":"31e670638acba3d58f4c67f3ff2f3f25d769e8a5d7a7838927f4d9d169a84404","up":true},{"one":"32ff1969d90aaa5a8ed2260968a8e2bac2d1cae597c906f90495f1dc5de7f8d3","other":"31e129ab3df7e082cc27c649d9ee29a3ea646d6a97d2417875b80e3ff576c047","up":true},{"one":"837f0993f6374039a5ad4472d6313e647a4c5db4583bd27ccfa98d3448a17731","other":"80d7e892bbb26808abb1d1530077fec6b08768c151a9f220881da3c862bae0af","up":true},{"one":"f7561cb6740e17ec7c7d17068251b2c951d954c77804aa5af60464e9c3964e57","other":"f2b49a2247c9c5e8f6f755834a37fe5c17f208f994878e14b7001e404f52e125","up":true},{"one":"eff2450bea797ff66d93e7c1c1b0977cddf3abba64bfa51bcc509d728569e2fa","other":"ec90a22f41ee659d5759a497946ac2991c916f00fe7caeeeb0908f3af1fe60b6","up":true},{"one":"70f68562733da4e3b1c3949fb6e11ac0bdd49ea7e732925f937f87df5af698d6","other":"60c5647aed152609979366fb33dc8b28fc60736098ff68d232415889b43dfa58","up":true},{"one":"32ff1969d90aaa5a8ed2260968a8e2bac2d1cae597c906f90495f1dc5de7f8d3","other":"36b93656cab02213fa76124af6251109356abc5e0ae5dd1e203c6a013e014548","up":true},{"one":"f2b49a2247c9c5e8f6f755834a37fe5c17f208f994878e14b7001e404f52e125","other":"f9ded7b83e473e71be2fc0101d574c44521c96f77f9f84a384785a3af6b1093d","up":true},{"one":"8862cd85d7039119b984f752a458ac0495ddea98c69fc1d1241db7873a712c11","other":"8e282b0f27d4fa56fe14cfeb69fac5a53e3d882c7778eb190653e2eab7c93fd2","up":true},{"one":"48d79ac55f8df512af8e7d868aa40ac9b61493fa4f1b0ce0b76bf6da2eb30e78","other":"4cece9bc134bc2b09400c9f7f8a4df9270d2fe3c077c5e441fffc911fcf6f42e","up":true},{"one":"885427318634c458a3050f2f26eb52454a75cea4a1263b9ed55e6eb899743854","other":"80d7e892bbb26808abb1d1530077fec6b08768c151a9f220881da3c862bae0af","up":true},{"one":"c272b12f4020ae5b20e3d29cd09de03fa0088e3eeb5f07aa7728b29a3e90e687","other":"c603138e40fe2f85cc634017956ada6399fca99969e3bf0c1ee8428374e779f1","up":true},{"one":"7660828fb0c8f89201d34e6f4d61cc6ba9a30cead6e4eb8253f6cc92e1845f23","other":"7c464054ea7b6c9ea0c7d4c209769c92f294a9db2ca159b8ef168e310a1eac3a","up":true},{"one":"1070df5e904e3865085b0319a81761e59146494c689e7567efe7465fc819ae8b","other":"14849f811af20ce19fb29417d20c15fc16da1e45aebdf795a2c6ccb671e4bdac","up":true},{"one":"1070df5e904e3865085b0319a81761e59146494c689e7567efe7465fc819ae8b","other":"140dd212f2b193ee6a9d7fc14f7da321c7ef6fd367fb4f194924fd0ad5d135cc","up":true},{"one":"8006b080c78a0ab54fa1be75a939bee2334322fded6c3563de1596b17c36172c","other":"80735a728720bba0ac08daaccd093370d672a8f9a50845ad78ccd6cf8686c39f","up":true},{"one":"398038811c1c7402fe2e6994c9ce2f15c8166b8e99f379feaaed66ac87702062","other":"3c5b2e125020c80e3674df9cac34de4d8f3a94ee02556fb557921b6d5498b933","up":true},{"one":"8ea2c8acc111f38d5b4a5ed60252ee83f312d0f8359265d5b9266d54735052fe","other":"8e282b0f27d4fa56fe14cfeb69fac5a53e3d882c7778eb190653e2eab7c93fd2","up":true},{"one":"8b4318f86ad47976321af97bfbf95cd0a3b0aa22447aeb0611ed1a9bf1e6a4bf","other":"80735a728720bba0ac08daaccd093370d672a8f9a50845ad78ccd6cf8686c39f","up":true},{"one":"5c7c15798e86fe794bb201614d46366ea96dc51091f5b19f149995e0d40df0a6","other":"5d82a418629cfbe7c57105309319ad695a198626fe3571de213a12ddf62f7308","up":true},{"one":"b3f95f225e2b6b76e6c7ef7c86caf83e35213f6a22da41e653ca1c190be23c9c","other":"b78fd21c063006e2e033d1d00fc21e1ad7ad7951bb5621cec9b56639745d65f9","up":true},{"one":"26acc3c373c29150af30bbc9264d0c44c7c606ff7377399ddf844635e97afcfa","other":"2a507f5cb921137a7225c9c4988a8514af0f7e3c442cb8bf2bb612dc522a7daf","up":true},{"one":"48d79ac55f8df512af8e7d868aa40ac9b61493fa4f1b0ce0b76bf6da2eb30e78","other":"48de553e15afd3e8a46bfc3a5ba8a298158aa3d60f140d2730230af5cce8084d","up":true},{"one":"bcf85ecf421b871fca0247a7081188a8e2c08778b88ffad16db37ef024fec0fc","other":"b3f95f225e2b6b76e6c7ef7c86caf83e35213f6a22da41e653ca1c190be23c9c","up":true},{"one":"a742e8502c619703ce87890110f908bde32b59dc61d77a247759e5d0056e0c94","other":"a6165a4b02d58be116892982c0ed3d49d86fec0e9f436a516b61868331ed853f","up":true},{"one":"c6a8220726243cceaa6f2cebdac857a05efe721323f0a064c7f85a8340d3da96","other":"c272b12f4020ae5b20e3d29cd09de03fa0088e3eeb5f07aa7728b29a3e90e687","up":true},{"one":"ab719e60a77ba5253f1690c920df9dd9f3a62071e9cce9d62e0001a522b3409e","other":"a8f49e87156fda5510897601689ce968d77032134c523634916b96de16366f9e","up":true},{"one":"a1c85ee75edb807a01f4ce930086c948918aade324752609b078c28991c04e86","other":"a0c88ba70599b0e72c18fa6aedd14d607cca3e9a49a5d50165d084e70328c2dd","up":true},{"one":"447a411c80fbd422bfa0c358d3f2a1fe6256c05e35acc6350958dfbe62cd5b9b","other":"553824ef701d3cd0191ae3a67de564ed0cf553e74bd60ed9de321f9302732ba6","up":true},{"one":"7ce7fec833a2e8c7720fcc97f820f2ca2aca85388210f887c3efe78b020766e7","other":"7850f5ee5048959559b3af0f95689669b250fc3aa58bcc9544dca61ca9c9769c","up":true},{"one":"ef99b6cdc05345a1ee82267890e3ccaeef1f2bd2fe7ae8b02b6b20b9a5ef85bb","other":"fc514c43c4eb5c62798458da5d622e9248a6e530e4288cd902019aa05c4374d8","up":true},{"one":"9464ad8da1a5effdc0351742dfffae941ffd9fab469637b2491caece53c57dc8","other":"95c0a351fb7aa6683280d159a7b808bfa63f63bff91a1c5936e973b2e5d3954f","up":true},{"one":"046ca54165f0dd4d62fd7d8ee9e97c655db3d35f5452a0ccb0dffc79c047978c","other":"07f5d094a4b22e73cdd6c85452b3d928da9b4b16873824759cb7e8a622417fd5","up":true},{"one":"2e65d05648b798fafbc9bb582c05e6f8f891131260e8c90ca725ddcbc823f315","other":"26ab9c813822dbb4f1a230cd8e99e8ab280b242747deb55fdf93d160906ef331","up":true},{"one":"af02c2f471e96ab8defbd229215695b95e64f7c78b145b6793a238961f556fbf","other":"aceee75a260d45252060fe971eabd4bde25f912db4a3c6e47f4a09572fe01697","up":true},{"one":"7d162a11662585f8c38d88fb241623e67bacf90703065dae6c092b4b507d6543","other":"7660828fb0c8f89201d34e6f4d61cc6ba9a30cead6e4eb8253f6cc92e1845f23","up":true},{"one":"d700d96de1193456dc0bcf492c7c11b0951062974af2f7f47b8c901b17c23165","other":"c2d00c7d960174c0934129fdcec63525bfa728f78fb70b7c52036b772d6297ad","up":true},{"one":"34118166845c185d15c286b7e5433539ee98ed634baabd534d57369fd5f7c681","other":"3728152c88f1e5e61f6523b09e8f3bb1023b700deccdca5fcc1e6488136b0e57","up":true},{"one":"5c7c15798e86fe794bb201614d46366ea96dc51091f5b19f149995e0d40df0a6","other":"5ff09c6859736aad7a82a3bfb3f1a1a8b3c0d58f831863540d9c3013dd35745e","up":true},{"one":"9f0e2bf8a962156c9e0a83c3d42ad3dc5ac5c3e508f24200bfb151aad4e395ff","other":"9ca1fd5d41975acb905f337997922849b4070360e47849bb4fd8cd1b9ddb4d73","up":true},{"one":"7ce7fec833a2e8c7720fcc97f820f2ca2aca85388210f887c3efe78b020766e7","other":"793322608055d4873776a9a0a6c40b04379bfd2f289a8ad49a7dc456bc65f871","up":true},{"one":"a606c79a018a6535375d851fcc82c42cc7c952720aa120434cedccf4a4be1f59","other":"a0c88ba70599b0e72c18fa6aedd14d607cca3e9a49a5d50165d084e70328c2dd","up":true},{"one":"4cece9bc134bc2b09400c9f7f8a4df9270d2fe3c077c5e441fffc911fcf6f42e","other":"48b850974575ca57a3cc5f9a4cf5aafd8688cb32b993f69983ece63258ff876e","up":true},{"one":"244c3c954ac612e51d4945ab9b77f0b4a3983285e8add7921777e0c45a1bf338","other":"2a507f5cb921137a7225c9c4988a8514af0f7e3c442cb8bf2bb612dc522a7daf","up":true},{"one":"6c0142984d629ae6995894de9e7e5eb8d3fe45e1641d7ebd63959d2e61548ba3","other":"60c5647aed152609979366fb33dc8b28fc60736098ff68d232415889b43dfa58","up":true},{"one":"48d79ac55f8df512af8e7d868aa40ac9b61493fa4f1b0ce0b76bf6da2eb30e78","other":"482ec3dc05460579ea9bce87677bd3d9a1930e801fabeba607b8ab6b8729ff15","up":true},{"one":"9257dc934dfbf17473b70cb85333c6fab67ee9b6228a646576c4f57253f1004e","other":"955da15edae50a4c68bc8c579b9799d55f41b7c2a6178f645f79d772e0116662","up":true},{"one":"7c7ca5a7522a04f62f2bebd6197a03d78f255d0175c3dfceb5d92b684365b2aa","other":"7c464054ea7b6c9ea0c7d4c209769c92f294a9db2ca159b8ef168e310a1eac3a","up":true},{"one":"3938e6b2c095084dc9975a3e8649133557495d34ac6df874c6d929266e3ffe6f","other":"305162c472c71ddef2320b138102b67d1ce2b8bba79e2e587fc80e085c88e547","up":true},{"one":"70f68562733da4e3b1c3949fb6e11ac0bdd49ea7e732925f937f87df5af698d6","other":"6dd3ac0fd9a04a2ce75875c683d135e52eaa1670cb55e78711620712e60fde47","up":true},{"one":"67585dfd87a005bae9bffc2cccb83c69537247c74886b4fa52287f46c796bcb6","other":"67909bdcaef2330ef120e524c76e1e382b474f3332d86f65282028e051f34c75","up":true},{"one":"679554b410e415cfcdf1b14ef87759269b2bcaf07f4541122977db3a40091da2","other":"60c5647aed152609979366fb33dc8b28fc60736098ff68d232415889b43dfa58","up":true},{"one":"3938e6b2c095084dc9975a3e8649133557495d34ac6df874c6d929266e3ffe6f","other":"3b020c84fb60f59779324d451d9770d683e08133bbaa2d5762f61b8fd4b8d9fd","up":true},{"one":"7ce7fec833a2e8c7720fcc97f820f2ca2aca85388210f887c3efe78b020766e7","other":"7d162a11662585f8c38d88fb241623e67bacf90703065dae6c092b4b507d6543","up":true},{"one":"955da15edae50a4c68bc8c579b9799d55f41b7c2a6178f645f79d772e0116662","other":"97daf2cbe03c80ce6c4dae39cd071dd93cb32ed245aa9aa77285e12296957ca3","up":true},{"one":"834f14e9f325482adef62651ddf3685690dd5ebdd18014f2bd266b2143c290ff","other":"80735a728720bba0ac08daaccd093370d672a8f9a50845ad78ccd6cf8686c39f","up":true},{"one":"7c464054ea7b6c9ea0c7d4c209769c92f294a9db2ca159b8ef168e310a1eac3a","other":"741a854ae299df49a738725bc58abe614e5e4302ffecd8320bbede8412d160c0","up":true},{"one":"2e65d05648b798fafbc9bb582c05e6f8f891131260e8c90ca725ddcbc823f315","other":"298ae5d173c5360bc9ad5b492ed35de3b6e0cae868a34bfe6311a8ba5ea9877e","up":true},{"one":"2c8042517dfeaa01586e91e491dd4154fb24c0d84fedb0404b9d5136f60da1d9","other":"26ab9c813822dbb4f1a230cd8e99e8ab280b242747deb55fdf93d160906ef331","up":true},{"one":"6dd3ac0fd9a04a2ce75875c683d135e52eaa1670cb55e78711620712e60fde47","other":"6b4ee1b73942ced78f97c0d0e221209933e63ae7353bb9ab3d37ac4127592e86","up":true},{"one":"a0c88ba70599b0e72c18fa6aedd14d607cca3e9a49a5d50165d084e70328c2dd","other":"a7a856a43293aa3004848a86f187e09343bd605e1a93e853a6f6b6b1031bd667","up":true},{"one":"af02c2f471e96ab8defbd229215695b95e64f7c78b145b6793a238961f556fbf","other":"aeb45fe10b0dbd0f72ab6a77fbf971a8f46dbcdd96c08f23279d1434b4f38b1d","up":true},{"one":"2c8042517dfeaa01586e91e491dd4154fb24c0d84fedb0404b9d5136f60da1d9","other":"298ae5d173c5360bc9ad5b492ed35de3b6e0cae868a34bfe6311a8ba5ea9877e","up":true},{"one":"9c8e1f23f260c5a46b0001572675b19e5293ca65e7fdfc131c07612e9c4072fa","other":"9c21cb3e56f8ac66a7917a9ba14e58f77e998ac70c178b88b5053d9ac2777e60","up":true},{"one":"837f0993f6374039a5ad4472d6313e647a4c5db4583bd27ccfa98d3448a17731","other":"8e7b96d28edae711e1a4cee0d894e0bd92cdf410ba6f61713f7d9b0bee761d4c","up":true},{"one":"cc3397e9e11f75273d3f81d91f980f4504755f80b27a183212de56cc5085e58d","other":"c96146ee47ec7cd74551cf74f00213bc337d643c4327393f0e6848ecd4a0f8d3","up":true},{"one":"3728152c88f1e5e61f6523b09e8f3bb1023b700deccdca5fcc1e6488136b0e57","other":"318828fa893a28cc0652d3f81d97c5b8e023e853685f5d3e65fde20689abcc5a","up":true},{"one":"c9c302de4afe7b4dcbb6f3e366ce747083f9dcd7d5c6a01b939da5cdc6ccc874","other":"d700d96de1193456dc0bcf492c7c11b0951062974af2f7f47b8c901b17c23165","up":true},{"one":"bdc5de01276157a0f3fc43a9cc3b41b2cacc8479118b75aec4ba9b2b7fa86d5e","other":"b8e1a8622c256ef29acd52df7b3ace50820fb1a147716165ff862fdc973a48cd","up":true},{"one":"6c0142984d629ae6995894de9e7e5eb8d3fe45e1641d7ebd63959d2e61548ba3","other":"6dd3ac0fd9a04a2ce75875c683d135e52eaa1670cb55e78711620712e60fde47","up":true},{"one":"9959385385aade728d3f5763806596222bc1e7b9946c2c92407943d080b32f8d","other":"9ec831d97418916fd9695465e041caf27824dbb51d6ff74d6b70f3bd561e70e6","up":true},{"one":"bcf85ecf421b871fca0247a7081188a8e2c08778b88ffad16db37ef024fec0fc","other":"b8e1a8622c256ef29acd52df7b3ace50820fb1a147716165ff862fdc973a48cd","up":true},{"one":"5ff09c6859736aad7a82a3bfb3f1a1a8b3c0d58f831863540d9c3013dd35745e","other":"553824ef701d3cd0191ae3a67de564ed0cf553e74bd60ed9de321f9302732ba6","up":true},{"one":"8b4318f86ad47976321af97bfbf95cd0a3b0aa22447aeb0611ed1a9bf1e6a4bf","other":"885427318634c458a3050f2f26eb52454a75cea4a1263b9ed55e6eb899743854","up":true},{"one":"7ce7fec833a2e8c7720fcc97f820f2ca2aca85388210f887c3efe78b020766e7","other":"79e5c6c6d78c88c579003cda044882ecb04520fbad1f5feadbe7b6d23fe183c8","up":true},{"one":"7049e92a396311fbf2f4a55bb5bd2fe3f7bb3c1a63f41bb88eb800edd45ac6e5","other":"793322608055d4873776a9a0a6c40b04379bfd2f289a8ad49a7dc456bc65f871","up":true},{"one":"b4a1b687fbdb754fd689e26f0870a7dcab5d76190c06f3ea2ea1e198f8aa5ab2","other":"b3f95f225e2b6b76e6c7ef7c86caf83e35213f6a22da41e653ca1c190be23c9c","up":true},{"one":"bdc5de01276157a0f3fc43a9cc3b41b2cacc8479118b75aec4ba9b2b7fa86d5e","other":"bfc711793830779f49aa59bc6f7a205ab4e6eae7abfdafbf3bb5a1163a778ab2","up":true},{"one":"14849f811af20ce19fb29417d20c15fc16da1e45aebdf795a2c6ccb671e4bdac","other":"16868ec5d8f490ac73ea28b4e8fdda55ac149bb1aafb177545b54b84a5ad5367","up":true},{"one":"34118166845c185d15c286b7e5433539ee98ed634baabd534d57369fd5f7c681","other":"31e129ab3df7e082cc27c649d9ee29a3ea646d6a97d2417875b80e3ff576c047","up":true},{"one":"837f0993f6374039a5ad4472d6313e647a4c5db4583bd27ccfa98d3448a17731","other":"86d6f68ec0b8e1b3406943787f918bee74dd1827998bdb13ece8f690da2d296a","up":true},{"one":"b6dffac4b4eb2974ed0ed241799f97d2e5d9be671e311266826d0dcfecfcc209","other":"b3f95f225e2b6b76e6c7ef7c86caf83e35213f6a22da41e653ca1c190be23c9c","up":true},{"one":"837f0993f6374039a5ad4472d6313e647a4c5db4583bd27ccfa98d3448a17731","other":"8358a74fc8d8e39ccc40b4d3a212b7a69a6a8f6afc25cff2c9c7b44bbaf9ec82","up":true},{"one":"18e00a7e0f826a1aba3f8c0f533ed905f2eee607b697fff056ee7874d374adcd","other":"19ea0a685fc4edd298b736dc7a778c9ec4362de378876911105fa9ba2ce90204","up":true},{"one":"a8b58013ff911871d1aa6c2bbea6c2e6ef9b00b87b80a41dc04724ad0488e2ff","other":"a8ff8d69dcb36462d1116dafa5e3d0c7237bf65dbece482a316862c8d66e35b6","up":true},{"one":"a3309f8b8bba4d8fbd7c6193d7671cb907b94e71155ef6138e0248682ff00e58","other":"a2a163ce2cb092b411c994cc5d5ef555d539d2dcf4e7e1aeb528d2216dc481e5","up":true},{"one":"bbafac5ba5915db3c80e28b249cad260b9b5dad1f728063c48fa8f61d7556e17","other":"bdc5de01276157a0f3fc43a9cc3b41b2cacc8479118b75aec4ba9b2b7fa86d5e","up":true},{"one":"a2e6c900511768c8c9947ab0fa2e73975cf2a4cec7fd15217abdba25c329317e","other":"a6165a4b02d58be116892982c0ed3d49d86fec0e9f436a516b61868331ed853f","up":true},{"one":"26acc3c373c29150af30bbc9264d0c44c7c606ff7377399ddf844635e97afcfa","other":"2c85f5361b2d5abcf799de50fe58b1ed2006ea18f75823748c33eb7e95b1cc39","up":true},{"one":"5bd8faf93bcad07006e9426b45f5cc599f1963ab791deac4ff63d6739cd62a17","other":"5a8b84df651871fce72d11cb1c26c87ae4a0cc6b4c274d37e70532c94f27288e","up":true},{"one":"9257dc934dfbf17473b70cb85333c6fab67ee9b6228a646576c4f57253f1004e","other":"97daf2cbe03c80ce6c4dae39cd071dd93cb32ed245aa9aa77285e12296957ca3","up":true},{"one":"482ec3dc05460579ea9bce87677bd3d9a1930e801fabeba607b8ab6b8729ff15","other":"4a95d49f58057b039b55a34f67a348c052f61770065e41243ff055efc570a935","up":true},{"one":"402cf9d0bffa017ebea34ede11207f3366b3ea450c0428029129a8e8026abbe7","other":"43c9e1571c460cb9f599fa8ed79ddd0f9c3a21fd2fa455e0603109c55012f76b","up":true},{"one":"e0a0ba7e7e89a7af805e24abde1a5a5b489ba197585051a8755e8c2345c3d57b","other":"e2770cef7c1ad312b70d94ca5570e45f324c798a31a93203f505167aeab122b6","up":true},{"one":"cdb13873ac058861f295ebca5d958bf2bb793e3f9e274cf5a73a633425a9276f","other":"c96146ee47ec7cd74551cf74f00213bc337d643c4327393f0e6848ecd4a0f8d3","up":true},{"one":"be68267d77fb52424227267c665ca1193a010334cac057338aca77b49a4b94da","other":"a4ee49bb2caabb6b9448bcdff1fc3cc673a2db04eab9f5c62d1787f2c25990a0","up":true},{"one":"feb3bc17ee7369a4fa9889d9250fed3c1257c70916871996e6eabd374dd8dc2e","other":"ff75b19017c84128f38dec4f63e1f247a5691dc0fae186e667afedb5fe9d2c80","up":true},{"one":"955da15edae50a4c68bc8c579b9799d55f41b7c2a6178f645f79d772e0116662","other":"951877b34ee1535b5059c49beb03e8960ff9c12b694ef64708c77c30ff1dc706","up":true},{"one":"7c7ca5a7522a04f62f2bebd6197a03d78f255d0175c3dfceb5d92b684365b2aa","other":"7850f5ee5048959559b3af0f95689669b250fc3aa58bcc9544dca61ca9c9769c","up":true},{"one":"ed424d24d702520bf7cb5f6babbdc43a078435fb4a9884ed82a93d642839e127","other":"ec90a22f41ee659d5759a497946ac2991c916f00fe7caeeeb0908f3af1fe60b6","up":true},{"one":"a8f49e87156fda5510897601689ce968d77032134c523634916b96de16366f9e","other":"aeb45fe10b0dbd0f72ab6a77fbf971a8f46dbcdd96c08f23279d1434b4f38b1d","up":true},{"one":"a0c88ba70599b0e72c18fa6aedd14d607cca3e9a49a5d50165d084e70328c2dd","other":"a5053958f0cefcff1826bf02525fda98c4dc954cc38690f3c43ecbf0b2ad57af","up":true},{"one":"f9ded7b83e473e71be2fc0101d574c44521c96f77f9f84a384785a3af6b1093d","other":"f645aab9cb2bd2709998b38e5789c9c5f68d40765e6cbd93b92e6383eb671dba","up":true},{"one":"81a5a07f92f813e85b501b0028e1caa6e6a6c7efa5195ecb693cd2d91d5132a0","other":"837f0993f6374039a5ad4472d6313e647a4c5db4583bd27ccfa98d3448a17731","up":true},{"one":"9b8e6bb3a7fe4dc65ac97404e546d8b777d068c94bc2355f4f1a510ad6c11905","other":"9c8e1f23f260c5a46b0001572675b19e5293ca65e7fdfc131c07612e9c4072fa","up":true},{"one":"59876e7ff9e92243856dad23126e1d38d9a5ddae79772ed1b2bdb91f33a4a4b5","other":"5a8b84df651871fce72d11cb1c26c87ae4a0cc6b4c274d37e70532c94f27288e","up":true},{"one":"a3309f8b8bba4d8fbd7c6193d7671cb907b94e71155ef6138e0248682ff00e58","other":"a32749dc4e134a4fbb038618c58a7c05bbbaa06f1436de3754341af86402581b","up":true},{"one":"48de553e15afd3e8a46bfc3a5ba8a298158aa3d60f140d2730230af5cce8084d","other":"4b79e83186f2ab05932eaa99982a2e53373b83780e32d224d15cb2c85462451f","up":true},{"one":"019109311d4888497aa194cce4a89b5ef243421cf0e7e7bb9115d086e1a1f7d7","other":"046ca54165f0dd4d62fd7d8ee9e97c655db3d35f5452a0ccb0dffc79c047978c","up":true},{"one":"5d82a418629cfbe7c57105309319ad695a198626fe3571de213a12ddf62f7308","other":"5c373034770e413e700b1cd03b2035f769ecd9ab8eb54d32f7b2645be1991fe5","up":true},{"one":"a6165a4b02d58be116892982c0ed3d49d86fec0e9f436a516b61868331ed853f","other":"a5053958f0cefcff1826bf02525fda98c4dc954cc38690f3c43ecbf0b2ad57af","up":true},{"one":"2ddffddbf452f0c9268058a739f5757fb90281cbfd31bd6f760acc3392fec12a","other":"2c85f5361b2d5abcf799de50fe58b1ed2006ea18f75823748c33eb7e95b1cc39","up":true},{"one":"d9cf19895e015cb534d915aed83c0d26bf40a11244027812e17c3bec6e645a8e","other":"da36d1df95a158b0d3f9e7407d663a6b611dde0a77f00a584b97a939ab6a00de","up":true},{"one":"0e3b7722f3f84d83b3d744bea4e893715a01d4df3cf4a1c6a6823a1f5c9ad6b8","other":"0e80db9dfa8ce29bedfb2de031622bef8829bee52771322b6a7efb47afe540e7","up":true},{"one":"26acc3c373c29150af30bbc9264d0c44c7c606ff7377399ddf844635e97afcfa","other":"298ae5d173c5360bc9ad5b492ed35de3b6e0cae868a34bfe6311a8ba5ea9877e","up":true},{"one":"7049e92a396311fbf2f4a55bb5bd2fe3f7bb3c1a63f41bb88eb800edd45ac6e5","other":"7850f5ee5048959559b3af0f95689669b250fc3aa58bcc9544dca61ca9c9769c","up":true},{"one":"c190f9d08c78ed6dffadaef36e77fe6aa96099e4453753b0cfc8ec542fa96b9d","other":"c53417f008e4550e1c4cb9a3e2955b3af6403e059b7b4b4c33869d9ed4a580a5","up":true},{"one":"5ff09c6859736aad7a82a3bfb3f1a1a8b3c0d58f831863540d9c3013dd35745e","other":"50c1a8023bfecffb09472fdc50898f4d050a31443d40a6c07b629090beb0df3d","up":true},{"one":"648a96d61898eb2d336ff7d5a229cfeb7b9f587282e40f9fe640e181ae26bdd3","other":"60c5647aed152609979366fb33dc8b28fc60736098ff68d232415889b43dfa58","up":true},{"one":"52a8747e4ea35f6f50c72d7c481616f68a5e4396248332b8ff69d3a772de49ac","other":"5d82a418629cfbe7c57105309319ad695a198626fe3571de213a12ddf62f7308","up":true},{"one":"4d381014783980b2f77f0d71160ad9e9d84672b576f4435ccdbae12752350c1c","other":"48b850974575ca57a3cc5f9a4cf5aafd8688cb32b993f69983ece63258ff876e","up":true},{"one":"f215bc09268e60ebbec76f743bebd09d7e72d4cbeedc0b9d3417bb4a2ef42935","other":"f9ded7b83e473e71be2fc0101d574c44521c96f77f9f84a384785a3af6b1093d","up":true},{"one":"cf52b3fc82ec24c3e9b40488d7c5f7ac8af731d159a103619bee932ec74d5e92","other":"c9c302de4afe7b4dcbb6f3e366ce747083f9dcd7d5c6a01b939da5cdc6ccc874","up":true},{"one":"3cabd3a567fc4e6f8da66eb35d938fe1e9a7f2bdd2d36c4dc2d0e0e9149f5e56","other":"3938e6b2c095084dc9975a3e8649133557495d34ac6df874c6d929266e3ffe6f","up":true},{"one":"79e5c6c6d78c88c579003cda044882ecb04520fbad1f5feadbe7b6d23fe183c8","other":"7e47a2f82984a600c8583605a91d5cb8f2d9a18961845e9c422edd78e20ac3a3","up":true},{"one":"a8f49e87156fda5510897601689ce968d77032134c523634916b96de16366f9e","other":"a9700308516c02cf9aea8809000a4e0596d6b44753e10bd0928df83e2eb9b9e7","up":true},{"one":"f7561cb6740e17ec7c7d17068251b2c951d954c77804aa5af60464e9c3964e57","other":"f8ff7440d6f4abb1c89496336843741ed53a544cedeeed71d8ebe0b08698438d","up":true},{"one":"c190f9d08c78ed6dffadaef36e77fe6aa96099e4453753b0cfc8ec542fa96b9d","other":"c603138e40fe2f85cc634017956ada6399fca99969e3bf0c1ee8428374e779f1","up":true},{"one":"bbafac5ba5915db3c80e28b249cad260b9b5dad1f728063c48fa8f61d7556e17","other":"ba911175d3aa3fcc266e2a5aa32fb706208b8a9b5021a5f37c0b85f547eb375d","up":true},{"one":"f305273a7d08e72f69b0b153855e822f252cbbf34a18f305134eed9d1eb7b58a","other":"f8ff7440d6f4abb1c89496336843741ed53a544cedeeed71d8ebe0b08698438d","up":true},{"one":"26acc3c373c29150af30bbc9264d0c44c7c606ff7377399ddf844635e97afcfa","other":"26ab9c813822dbb4f1a230cd8e99e8ab280b242747deb55fdf93d160906ef331","up":true},{"one":"2e65d05648b798fafbc9bb582c05e6f8f891131260e8c90ca725ddcbc823f315","other":"2c85f5361b2d5abcf799de50fe58b1ed2006ea18f75823748c33eb7e95b1cc39","up":true},{"one":"3938e6b2c095084dc9975a3e8649133557495d34ac6df874c6d929266e3ffe6f","other":"397a0a0e9fadcb571acd8981f5bfe8e059e707e0feae8a9c4c6bfe87bd39e66a","up":true},{"one":"6d5ec591af4966ba024c6b2aeb45e0aab8aa1762f9cac30ce3934da529b738e9","other":"6d3c6db15900f2596286f81cc0664d2c8291ead5bad2aa35bad515af088a2e48","up":true},{"one":"6d5ec591af4966ba024c6b2aeb45e0aab8aa1762f9cac30ce3934da529b738e9","other":"68cbc4a5313080d5dca8ad34e8bf52a6144e0ff8ef3f795d7ae9d5f644fe2042","up":true},{"one":"2fd2f77d76cca480ac18e9af7a462f297db168c3370b3bc0e2c04aa006c4d037","other":"26ab9c813822dbb4f1a230cd8e99e8ab280b242747deb55fdf93d160906ef331","up":true},{"one":"6c0142984d629ae6995894de9e7e5eb8d3fe45e1641d7ebd63959d2e61548ba3","other":"6d3c6db15900f2596286f81cc0664d2c8291ead5bad2aa35bad515af088a2e48","up":true},{"one":"0111e720a84b310f863c2530fbe149e6a221acbad01065c5d052d2b3e1716f54","other":"046ca54165f0dd4d62fd7d8ee9e97c655db3d35f5452a0ccb0dffc79c047978c","up":true},{"one":"b3f95f225e2b6b76e6c7ef7c86caf83e35213f6a22da41e653ca1c190be23c9c","other":"b8e1a8622c256ef29acd52df7b3ace50820fb1a147716165ff862fdc973a48cd","up":true},{"one":"1bd588263274543729d54529ae9e9bf4596db40649a1c2a3f73168d818f34b62","other":"1dc0ef1ce68dc681298177bde808af514efa52a5ad38c9cd2bd61968cdf19cfb","up":true},{"one":"1b1dc3f9312df141855c545dd16aee325f9a609230ec6165bdbbb07d0c0862f6","other":"1dec77c2f4caf053c2d0524ae34a2d970bf4743a0d009d8fc543077ddfdfe3d0","up":true},{"one":"178401ec8d01a0a4f551d23e880a8e8a4eb87773565363843d51cf52660b1211","other":"1049d321a450726cf39d1d7cea1c108be3bec137a644b62cdc73a853f5a5a22b","up":true},{"one":"9464ad8da1a5effdc0351742dfffae941ffd9fab469637b2491caece53c57dc8","other":"97daf2cbe03c80ce6c4dae39cd071dd93cb32ed245aa9aa77285e12296957ca3","up":true},{"one":"955da15edae50a4c68bc8c579b9799d55f41b7c2a6178f645f79d772e0116662","other":"9c8e1f23f260c5a46b0001572675b19e5293ca65e7fdfc131c07612e9c4072fa","up":true},{"one":"93c0e1adf23fdf1623359eb88c517bc521d5a26325554df890cc04c1fa17a5df","other":"95c0a351fb7aa6683280d159a7b808bfa63f63bff91a1c5936e973b2e5d3954f","up":true},{"one":"5ac0d00b8d647dec62d26e1a689fd05b8b7a1a79ab8c43493bd6d7d209816df1","other":"5a26ae73eebf27f6dbec2414f1277a249e814a7a06790d7061610e5227b086f6","up":true},{"one":"0e2b48558ce2af1fbfee38a557d56072e3091cfcaee8d7847c7c9dcf7bef9bfa","other":"0d1c35c6ea485cb33857b790ee262f974cf0d54cf8ce3003f8308ac2e87c2c25","up":true},{"one":"994839e5f3a5b8b23aed84fb029413124af17804b79b0263ec6bfd5aec5dad78","other":"9c8e1f23f260c5a46b0001572675b19e5293ca65e7fdfc131c07612e9c4072fa","up":true},{"one":"094256812084c6052a2604149aa3aba2379c483bf4ec25162f6b43934942775a","other":"09b3fa30780931e18b92c75d1cdeafa365609c565e4e8c253d393835cb82d98e","up":true},{"one":"2e65d05648b798fafbc9bb582c05e6f8f891131260e8c90ca725ddcbc823f315","other":"2a507f5cb921137a7225c9c4988a8514af0f7e3c442cb8bf2bb612dc522a7daf","up":true},{"one":"e2d36f335d90ad63148db8e353a78a30d8d9c0abe107be2cf8685f6a01ce74b9","other":"e64d90760cd81e4f112bbf1432e76c82fa4173fd474b988f4096ce187363fd81","up":true},{"one":"178401ec8d01a0a4f551d23e880a8e8a4eb87773565363843d51cf52660b1211","other":"16868ec5d8f490ac73ea28b4e8fdda55ac149bb1aafb177545b54b84a5ad5367","up":true},{"one":"24f80c437be45898e594f821bba0f5c62e0c9a0c720118e362ee6f78410612bd","other":"2c85f5361b2d5abcf799de50fe58b1ed2006ea18f75823748c33eb7e95b1cc39","up":true},{"one":"c190f9d08c78ed6dffadaef36e77fe6aa96099e4453753b0cfc8ec542fa96b9d","other":"c2d00c7d960174c0934129fdcec63525bfa728f78fb70b7c52036b772d6297ad","up":true},{"one":"0d1c35c6ea485cb33857b790ee262f974cf0d54cf8ce3003f8308ac2e87c2c25","other":"0cfc7309afabceeb7d248714e972cf3987205324f5ab8d048d17bea5dc87369d","up":true},{"one":"93c0e1adf23fdf1623359eb88c517bc521d5a26325554df890cc04c1fa17a5df","other":"93ea8ef251fd56b159e080cdf733d33e1fdfb3c7ae5bd9a6a328d0bf5458867b","up":true},{"one":"140dd212f2b193ee6a9d7fc14f7da321c7ef6fd367fb4f194924fd0ad5d135cc","other":"1049d321a450726cf39d1d7cea1c108be3bec137a644b62cdc73a853f5a5a22b","up":true},{"one":"2a507f5cb921137a7225c9c4988a8514af0f7e3c442cb8bf2bb612dc522a7daf","other":"2c8042517dfeaa01586e91e491dd4154fb24c0d84fedb0404b9d5136f60da1d9","up":true},{"one":"f9ded7b83e473e71be2fc0101d574c44521c96f77f9f84a384785a3af6b1093d","other":"f7561cb6740e17ec7c7d17068251b2c951d954c77804aa5af60464e9c3964e57","up":true},{"one":"16868ec5d8f490ac73ea28b4e8fdda55ac149bb1aafb177545b54b84a5ad5367","other":"138dbc1662c4ce9b2b30ef5035914cc70465666fe18f313318e662d13f099621","up":true},{"one":"aaf051a087a92f874a3f6c7923015e4cffb4bb3ef381c977fd902f21e841d0f4","other":"a8f49e87156fda5510897601689ce968d77032134c523634916b96de16366f9e","up":true},{"one":"046ca54165f0dd4d62fd7d8ee9e97c655db3d35f5452a0ccb0dffc79c047978c","other":"05949ec1a582fa70cab95c59e7c0d315583bf9fc320c60c35268931f21e90853","up":true},{"one":"ddb8be472c3d48dc4d3d112448e6c0c4a826a18af3f3b53fdfef8cd31053c75f","other":"c53417f008e4550e1c4cb9a3e2955b3af6403e059b7b4b4c33869d9ed4a580a5","up":true},{"one":"d408bb6f7af1590e1f162ce02cc016b1b86ede29851caa32434212ffa2a377c8","other":"d3e913cf4a7dabfb5699131b65e533a40adb46ea37e0ed4ce9433f99015986ef","up":true},{"one":"a5053958f0cefcff1826bf02525fda98c4dc954cc38690f3c43ecbf0b2ad57af","other":"a7a856a43293aa3004848a86f187e09343bd605e1a93e853a6f6b6b1031bd667","up":true},{"one":"9c8e1f23f260c5a46b0001572675b19e5293ca65e7fdfc131c07612e9c4072fa","other":"9ec831d97418916fd9695465e041caf27824dbb51d6ff74d6b70f3bd561e70e6","up":true},{"one":"f215bc09268e60ebbec76f743bebd09d7e72d4cbeedc0b9d3417bb4a2ef42935","other":"f645aab9cb2bd2709998b38e5789c9c5f68d40765e6cbd93b92e6383eb671dba","up":true},{"one":"837f0993f6374039a5ad4472d6313e647a4c5db4583bd27ccfa98d3448a17731","other":"87a337622455ae65daf3ab2555cee8985e9aa14bac245545d985296060e4a8de","up":true},{"one":"bcf85ecf421b871fca0247a7081188a8e2c08778b88ffad16db37ef024fec0fc","other":"bfc711793830779f49aa59bc6f7a205ab4e6eae7abfdafbf3bb5a1163a778ab2","up":true},{"one":"837f0993f6374039a5ad4472d6313e647a4c5db4583bd27ccfa98d3448a17731","other":"807416cc70f02d481a188027f7932b48e8f7b5e8258f7e9623f3f6e2985d8f6a","up":true},{"one":"aaf051a087a92f874a3f6c7923015e4cffb4bb3ef381c977fd902f21e841d0f4","other":"ab3ff955033c0a2615932faf85fd20090b9121c7edcc8e6f7ce4c4fde0a96b8a","up":true},{"one":"5a26ae73eebf27f6dbec2414f1277a249e814a7a06790d7061610e5227b086f6","other":"5d82a418629cfbe7c57105309319ad695a198626fe3571de213a12ddf62f7308","up":true},{"one":"9f7d72b7d9843872904b841e421985082428fba5010db27dd871ed76630a1e1d","other":"9c8e1f23f260c5a46b0001572675b19e5293ca65e7fdfc131c07612e9c4072fa","up":true},{"one":"d700d96de1193456dc0bcf492c7c11b0951062974af2f7f47b8c901b17c23165","other":"d3022a46956e75bca85ba89d97b694a3a64f03ccc2d881ed0cd687d43d486925","up":true},{"one":"48de553e15afd3e8a46bfc3a5ba8a298158aa3d60f140d2730230af5cce8084d","other":"4a95d49f58057b039b55a34f67a348c052f61770065e41243ff055efc570a935","up":true},{"one":"f2b49a2247c9c5e8f6f755834a37fe5c17f208f994878e14b7001e404f52e125","other":"f1ed9d45622ff974a1e396cd878b2deb89e31aa5d08da773423f292ae8dbcbb6","up":true},{"one":"e471efbcf1def3915b3dda2dc65a86945c607be54a33e31e9625549becac0e34","other":"e64d90760cd81e4f112bbf1432e76c82fa4173fd474b988f4096ce187363fd81","up":true},{"one":"a3309f8b8bba4d8fbd7c6193d7671cb907b94e71155ef6138e0248682ff00e58","other":"a2e6c900511768c8c9947ab0fa2e73975cf2a4cec7fd15217abdba25c329317e","up":true},{"one":"c8c8a93779ec4d9ac40925e8208478a00ee27fc220ddd73d8774cf6bfa255c46","other":"cf52b3fc82ec24c3e9b40488d7c5f7ac8af731d159a103619bee932ec74d5e92","up":true},{"one":"cdb13873ac058861f295ebca5d958bf2bb793e3f9e274cf5a73a633425a9276f","other":"cd6c8b42a0b092f41e6925577c9de7d1bea17231bcb3d08f3d3cce9c6fdcf22d","up":true},{"one":"eb686a686fd70e41659cc69ec0db53d1512dfec238918afd0a515d8ce177d4d9","other":"ec90a22f41ee659d5759a497946ac2991c916f00fe7caeeeb0908f3af1fe60b6","up":true},{"one":"ef99b6cdc05345a1ee82267890e3ccaeef1f2bd2fe7ae8b02b6b20b9a5ef85bb","other":"ed424d24d702520bf7cb5f6babbdc43a078435fb4a9884ed82a93d642839e127","up":true},{"one":"1fd0192df1fbf33771ca575afbb4e27c6541cce4a3cff2dfc1f2c085e7fab79e","other":"194ea3e14dc5d99f98d15607dc4c405769f5a371acc22d41a62d0537d716be32","up":true},{"one":"6c0142984d629ae6995894de9e7e5eb8d3fe45e1641d7ebd63959d2e61548ba3","other":"68cbc4a5313080d5dca8ad34e8bf52a6144e0ff8ef3f795d7ae9d5f644fe2042","up":true},{"one":"8b4318f86ad47976321af97bfbf95cd0a3b0aa22447aeb0611ed1a9bf1e6a4bf","other":"8e282b0f27d4fa56fe14cfeb69fac5a53e3d882c7778eb190653e2eab7c93fd2","up":true},{"one":"0cfc7309afabceeb7d248714e972cf3987205324f5ab8d048d17bea5dc87369d","other":"0e80db9dfa8ce29bedfb2de031622bef8829bee52771322b6a7efb47afe540e7","up":true},{"one":"793322608055d4873776a9a0a6c40b04379bfd2f289a8ad49a7dc456bc65f871","other":"70f68562733da4e3b1c3949fb6e11ac0bdd49ea7e732925f937f87df5af698d6","up":true},{"one":"435d721a568eb906a03c69dbd71337251a550521a4004ab5d4a7deb6f317061a","other":"43d43e9ebcbceb4830fc1d2d5024650b90698306bbd2c4d0b4841a1a8fd09c93","up":true},{"one":"68cbc4a5313080d5dca8ad34e8bf52a6144e0ff8ef3f795d7ae9d5f644fe2042","other":"6b4ee1b73942ced78f97c0d0e221209933e63ae7353bb9ab3d37ac4127592e86","up":true},{"one":"48f1ca6d433019f932fa4ae03e0decbcbea3fe635edff4458a669b83f8162b9a","other":"48de553e15afd3e8a46bfc3a5ba8a298158aa3d60f140d2730230af5cce8084d","up":true},{"one":"8f9aa2cd33d18e7cb4494d11a7532c97eb4a1cae172b2165c26ae4ed24887c0d","other":"885427318634c458a3050f2f26eb52454a75cea4a1263b9ed55e6eb899743854","up":true},{"one":"ab3ff955033c0a2615932faf85fd20090b9121c7edcc8e6f7ce4c4fde0a96b8a","other":"a8b58013ff911871d1aa6c2bbea6c2e6ef9b00b87b80a41dc04724ad0488e2ff","up":true},{"one":"e64d90760cd81e4f112bbf1432e76c82fa4173fd474b988f4096ce187363fd81","other":"e09f98114da64e7547b351637190f6621a1f75568cfa9960980fc77618f8855b","up":true},{"one":"096a8302b6f369c28ed9d47719a507ead8a3cc1ca4fa1e32318b7f97873955fe","other":"0e80db9dfa8ce29bedfb2de031622bef8829bee52771322b6a7efb47afe540e7","up":true},{"one":"1dec77c2f4caf053c2d0524ae34a2d970bf4743a0d009d8fc543077ddfdfe3d0","other":"1dc0ef1ce68dc681298177bde808af514efa52a5ad38c9cd2bd61968cdf19cfb","up":true},{"one":"eebd48b367cbfe94a37c0deb274a697e628074f9560b909e66229c5c76ce68eb","other":"eb686a686fd70e41659cc69ec0db53d1512dfec238918afd0a515d8ce177d4d9","up":true},{"one":"244c3c954ac612e51d4945ab9b77f0b4a3983285e8add7921777e0c45a1bf338","other":"2c85f5361b2d5abcf799de50fe58b1ed2006ea18f75823748c33eb7e95b1cc39","up":true},{"one":"8006b080c78a0ab54fa1be75a939bee2334322fded6c3563de1596b17c36172c","other":"837f0993f6374039a5ad4472d6313e647a4c5db4583bd27ccfa98d3448a17731","up":true},{"one":"8f9aa2cd33d18e7cb4494d11a7532c97eb4a1cae172b2165c26ae4ed24887c0d","other":"8b4318f86ad47976321af97bfbf95cd0a3b0aa22447aeb0611ed1a9bf1e6a4bf","up":true},{"one":"24f80c437be45898e594f821bba0f5c62e0c9a0c720118e362ee6f78410612bd","other":"2a507f5cb921137a7225c9c4988a8514af0f7e3c442cb8bf2bb612dc522a7daf","up":true},{"one":"f1ed9d45622ff974a1e396cd878b2deb89e31aa5d08da773423f292ae8dbcbb6","other":"f645aab9cb2bd2709998b38e5789c9c5f68d40765e6cbd93b92e6383eb671dba","up":true},{"one":"80735a728720bba0ac08daaccd093370d672a8f9a50845ad78ccd6cf8686c39f","other":"80d7e892bbb26808abb1d1530077fec6b08768c151a9f220881da3c862bae0af","up":true},{"one":"a0c88ba70599b0e72c18fa6aedd14d607cca3e9a49a5d50165d084e70328c2dd","other":"a32749dc4e134a4fbb038618c58a7c05bbbaa06f1436de3754341af86402581b","up":true},{"one":"c8ea4177420785926e0929701f5e74c744920386f2a43b89d83c8281106cb95e","other":"c9c302de4afe7b4dcbb6f3e366ce747083f9dcd7d5c6a01b939da5cdc6ccc874","up":true},{"one":"8ea2c8acc111f38d5b4a5ed60252ee83f312d0f8359265d5b9266d54735052fe","other":"8f9aa2cd33d18e7cb4494d11a7532c97eb4a1cae172b2165c26ae4ed24887c0d","up":true},{"one":"bcf85ecf421b871fca0247a7081188a8e2c08778b88ffad16db37ef024fec0fc","other":"be68267d77fb52424227267c665ca1193a010334cac057338aca77b49a4b94da","up":true},{"one":"a3309f8b8bba4d8fbd7c6193d7671cb907b94e71155ef6138e0248682ff00e58","other":"a1c85ee75edb807a01f4ce930086c948918aade324752609b078c28991c04e86","up":true},{"one":"09b3fa30780931e18b92c75d1cdeafa365609c565e4e8c253d393835cb82d98e","other":"0e80db9dfa8ce29bedfb2de031622bef8829bee52771322b6a7efb47afe540e7","up":true},{"one":"67909bdcaef2330ef120e524c76e1e382b474f3332d86f65282028e051f34c75","other":"60c5647aed152609979366fb33dc8b28fc60736098ff68d232415889b43dfa58","up":true},{"one":"d3e913cf4a7dabfb5699131b65e533a40adb46ea37e0ed4ce9433f99015986ef","other":"d700d96de1193456dc0bcf492c7c11b0951062974af2f7f47b8c901b17c23165","up":true},{"one":"48b850974575ca57a3cc5f9a4cf5aafd8688cb32b993f69983ece63258ff876e","other":"4d9147e3bf98cb59a7648f616c0d7f713a8cf3b7d25e3115233ff5883128beab","up":true},{"one":"c8ea4177420785926e0929701f5e74c744920386f2a43b89d83c8281106cb95e","other":"cd6c8b42a0b092f41e6925577c9de7d1bea17231bcb3d08f3d3cce9c6fdcf22d","up":true},{"one":"4005fd1fa8fbb318b29a62c368ada579e5122ca0578e6a75c509552be4b63b76","other":"43c9e1571c460cb9f599fa8ed79ddd0f9c3a21fd2fa455e0603109c55012f76b","up":true},{"one":"d700d96de1193456dc0bcf492c7c11b0951062974af2f7f47b8c901b17c23165","other":"dad08999cd2edc33cfdc59ea34c8adcd6a34eaa15f2e85b0622e9848b215c1d5","up":true},{"one":"cf52b3fc82ec24c3e9b40488d7c5f7ac8af731d159a103619bee932ec74d5e92","other":"c96146ee47ec7cd74551cf74f00213bc337d643c4327393f0e6848ecd4a0f8d3","up":true},{"one":"c8ea4177420785926e0929701f5e74c744920386f2a43b89d83c8281106cb95e","other":"c96146ee47ec7cd74551cf74f00213bc337d643c4327393f0e6848ecd4a0f8d3","up":true},{"one":"fc3911383f74a982f6af8ab95a63426b56117d45f153b3c1441459d9191daaff","other":"f9ded7b83e473e71be2fc0101d574c44521c96f77f9f84a384785a3af6b1093d","up":true},{"one":"8d192b11538072db750f71204e2e6adf9dc0508d9c5cf1eb457e4e996cd985bc","other":"885427318634c458a3050f2f26eb52454a75cea4a1263b9ed55e6eb899743854","up":true},{"one":"cc3397e9e11f75273d3f81d91f980f4504755f80b27a183212de56cc5085e58d","other":"cd6c8b42a0b092f41e6925577c9de7d1bea17231bcb3d08f3d3cce9c6fdcf22d","up":true},{"one":"a5ac04d53b569e418ef5007961431155f2c226ee10157b30af71ea4836b08089","other":"a6165a4b02d58be116892982c0ed3d49d86fec0e9f436a516b61868331ed853f","up":true},{"one":"2fd2f77d76cca480ac18e9af7a462f297db168c3370b3bc0e2c04aa006c4d037","other":"298ae5d173c5360bc9ad5b492ed35de3b6e0cae868a34bfe6311a8ba5ea9877e","up":true},{"one":"6b4ee1b73942ced78f97c0d0e221209933e63ae7353bb9ab3d37ac4127592e86","other":"6d3c6db15900f2596286f81cc0664d2c8291ead5bad2aa35bad515af088a2e48","up":true},{"one":"5ff09c6859736aad7a82a3bfb3f1a1a8b3c0d58f831863540d9c3013dd35745e","other":"5c373034770e413e700b1cd03b2035f769ecd9ab8eb54d32f7b2645be1991fe5","up":true},{"one":"837f0993f6374039a5ad4472d6313e647a4c5db4583bd27ccfa98d3448a17731","other":"84a9db7645c792dc38c1f2113a8f0590d04e1c94d9a8c464ab0ec8219303d966","up":true},{"one":"9257dc934dfbf17473b70cb85333c6fab67ee9b6228a646576c4f57253f1004e","other":"93ea8ef251fd56b159e080cdf733d33e1fdfb3c7ae5bd9a6a328d0bf5458867b","up":true},{"one":"793322608055d4873776a9a0a6c40b04379bfd2f289a8ad49a7dc456bc65f871","other":"7895b2cb97b473f8893cc70a4421e0f8be1c033b27cd730fa13438b7a8f3fcb5","up":true},{"one":"14849f811af20ce19fb29417d20c15fc16da1e45aebdf795a2c6ccb671e4bdac","other":"1049d321a450726cf39d1d7cea1c108be3bec137a644b62cdc73a853f5a5a22b","up":true},{"one":"5d82a418629cfbe7c57105309319ad695a198626fe3571de213a12ddf62f7308","other":"553824ef701d3cd0191ae3a67de564ed0cf553e74bd60ed9de321f9302732ba6","up":true},{"one":"a606c79a018a6535375d851fcc82c42cc7c952720aa120434cedccf4a4be1f59","other":"a6165a4b02d58be116892982c0ed3d49d86fec0e9f436a516b61868331ed853f","up":true},{"one":"5814be13c8550b9a5a83d08e7af6022002a8fdaa38ba6c2c30be58099a9f7744","other":"5a26ae73eebf27f6dbec2414f1277a249e814a7a06790d7061610e5227b086f6","up":true},{"one":"ef99b6cdc05345a1ee82267890e3ccaeef1f2bd2fe7ae8b02b6b20b9a5ef85bb","other":"eebd48b367cbfe94a37c0deb274a697e628074f9560b909e66229c5c76ce68eb","up":true},{"one":"48de553e15afd3e8a46bfc3a5ba8a298158aa3d60f140d2730230af5cce8084d","other":"48b850974575ca57a3cc5f9a4cf5aafd8688cb32b993f69983ece63258ff876e","up":true},{"one":"7850f5ee5048959559b3af0f95689669b250fc3aa58bcc9544dca61ca9c9769c","other":"7660828fb0c8f89201d34e6f4d61cc6ba9a30cead6e4eb8253f6cc92e1845f23","up":true},{"one":"2c8042517dfeaa01586e91e491dd4154fb24c0d84fedb0404b9d5136f60da1d9","other":"2c85f5361b2d5abcf799de50fe58b1ed2006ea18f75823748c33eb7e95b1cc39","up":true},{"one":"0e80db9dfa8ce29bedfb2de031622bef8829bee52771322b6a7efb47afe540e7","other":"08f84878e44fed2adb4b2685b9f293dc3c73d5f9bc1c474870d943ec2ae73dbe","up":true},{"one":"1049d321a450726cf39d1d7cea1c108be3bec137a644b62cdc73a853f5a5a22b","other":"138dbc1662c4ce9b2b30ef5035914cc70465666fe18f313318e662d13f099621","up":true},{"one":"7850f5ee5048959559b3af0f95689669b250fc3aa58bcc9544dca61ca9c9769c","other":"741a854ae299df49a738725bc58abe614e5e4302ffecd8320bbede8412d160c0","up":true},{"one":"9f0e2bf8a962156c9e0a83c3d42ad3dc5ac5c3e508f24200bfb151aad4e395ff","other":"9ec831d97418916fd9695465e041caf27824dbb51d6ff74d6b70f3bd561e70e6","up":true},{"one":"7850f5ee5048959559b3af0f95689669b250fc3aa58bcc9544dca61ca9c9769c","other":"7895b2cb97b473f8893cc70a4421e0f8be1c033b27cd730fa13438b7a8f3fcb5","up":true},{"one":"a2a163ce2cb092b411c994cc5d5ef555d539d2dcf4e7e1aeb528d2216dc481e5","other":"a0c88ba70599b0e72c18fa6aedd14d607cca3e9a49a5d50165d084e70328c2dd","up":true},{"one":"482ec3dc05460579ea9bce87677bd3d9a1930e801fabeba607b8ab6b8729ff15","other":"48b850974575ca57a3cc5f9a4cf5aafd8688cb32b993f69983ece63258ff876e","up":true},{"one":"9ca1fd5d41975acb905f337997922849b4070360e47849bb4fd8cd1b9ddb4d73","other":"9c8e1f23f260c5a46b0001572675b19e5293ca65e7fdfc131c07612e9c4072fa","up":true},{"one":"44adaabf9c46608a374ed816d3c40c63b6645f4f6e033a76431bc8f88713eb41","other":"43d43e9ebcbceb4830fc1d2d5024650b90698306bbd2c4d0b4841a1a8fd09c93","up":true},{"one":"318828fa893a28cc0652d3f81d97c5b8e023e853685f5d3e65fde20689abcc5a","other":"30feca631f06041cb14cead384dfaa5fffa6dc34b0cee54230efbe15e56a5884","up":true},{"one":"5d82a418629cfbe7c57105309319ad695a198626fe3571de213a12ddf62f7308","other":"50c1a8023bfecffb09472fdc50898f4d050a31443d40a6c07b629090beb0df3d","up":true},{"one":"46bfa8bea56b0be1abfa5ad3561bb6bf49ed6695d83ee2b2c192c5a0408347cf","other":"43d43e9ebcbceb4830fc1d2d5024650b90698306bbd2c4d0b4841a1a8fd09c93","up":true},{"one":"2a507f5cb921137a7225c9c4988a8514af0f7e3c442cb8bf2bb612dc522a7daf","other":"2fd2f77d76cca480ac18e9af7a462f297db168c3370b3bc0e2c04aa006c4d037","up":true},{"one":"837f0993f6374039a5ad4472d6313e647a4c5db4583bd27ccfa98d3448a17731","other":"8402bd62282811ed236b2fa1f0d41ad4bbe54e420ee34adc6164cfd4baf8658d","up":true},{"one":"cf52b3fc82ec24c3e9b40488d7c5f7ac8af731d159a103619bee932ec74d5e92","other":"cd6c8b42a0b092f41e6925577c9de7d1bea17231bcb3d08f3d3cce9c6fdcf22d","up":true},{"one":"43d43e9ebcbceb4830fc1d2d5024650b90698306bbd2c4d0b4841a1a8fd09c93","other":"402cf9d0bffa017ebea34ede11207f3366b3ea450c0428029129a8e8026abbe7","up":true},{"one":"194ea3e14dc5d99f98d15607dc4c405769f5a371acc22d41a62d0537d716be32","other":"19ea0a685fc4edd298b736dc7a778c9ec4362de378876911105fa9ba2ce90204","up":true},{"one":"a2e6c900511768c8c9947ab0fa2e73975cf2a4cec7fd15217abdba25c329317e","other":"a0c88ba70599b0e72c18fa6aedd14d607cca3e9a49a5d50165d084e70328c2dd","up":true},{"one":"8cc3fb39009d0adc26fca1e2ee96822d168d4debc379fd516c15d4b4a1624231","other":"8f9aa2cd33d18e7cb4494d11a7532c97eb4a1cae172b2165c26ae4ed24887c0d","up":true},{"one":"1bd588263274543729d54529ae9e9bf4596db40649a1c2a3f73168d818f34b62","other":"19ea0a685fc4edd298b736dc7a778c9ec4362de378876911105fa9ba2ce90204","up":true},{"one":"447cdbf1ff462aa67d6a46085b1a84fdc495a4142ab174c8e69b271b09732b4d","other":"43d43e9ebcbceb4830fc1d2d5024650b90698306bbd2c4d0b4841a1a8fd09c93","up":true},{"one":"fc514c43c4eb5c62798458da5d622e9248a6e530e4288cd902019aa05c4374d8","other":"ff75b19017c84128f38dec4f63e1f247a5691dc0fae186e667afedb5fe9d2c80","up":true},{"one":"4005fd1fa8fbb318b29a62c368ada579e5122ca0578e6a75c509552be4b63b76","other":"43d43e9ebcbceb4830fc1d2d5024650b90698306bbd2c4d0b4841a1a8fd09c93","up":true},{"one":"2fd2f77d76cca480ac18e9af7a462f297db168c3370b3bc0e2c04aa006c4d037","other":"2c85f5361b2d5abcf799de50fe58b1ed2006ea18f75823748c33eb7e95b1cc39","up":true},{"one":"447a411c80fbd422bfa0c358d3f2a1fe6256c05e35acc6350958dfbe62cd5b9b","other":"43d43e9ebcbceb4830fc1d2d5024650b90698306bbd2c4d0b4841a1a8fd09c93","up":true}]} \ No newline at end of file diff --git a/vendor/github.com/ethereum/go-ethereum/swarm/pss/testdata/snapshot_3.json b/vendor/github.com/ethereum/go-ethereum/swarm/pss/testdata/snapshot_3.json deleted file mode 100644 index 15ed45bc..00000000 --- a/vendor/github.com/ethereum/go-ethereum/swarm/pss/testdata/snapshot_3.json +++ /dev/null @@ -1 +0,0 @@ -{"nodes":[{"node":{"info":{"id":"fd37e45210ddb36f8b5ecef9c9d9d3f8201ba9523bfd6a70291333cf3b9207e1","name":"node_fd37e45210ddb36f8b5ecef9c9d9d3f8201ba9523bfd6a70291333cf3b9207e1","enode":"enode://6a7dd306ace8a106c3b86ac6b0cd6eeccde4a9af5090ca4a6d1054787f9757875b6b8d02f88fafe3fd7f20f0349a0060ace7c0be1d65470e736a3319431b5c14@127.0.0.1:0","enr":"0xf88fb84096f5dd9030fc74da3701ef7b06dfe4d44068118f8041a728876904d70fa8c88c20df197c343522c76d75d3a12507c567213c13b46a94ed4800f47474643f4ee70183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1026a7dd306ace8a106c3b86ac6b0cd6eeccde4a9af5090ca4a6d1054787f975787","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"/TfkUhDds2+LXs75ydnT+CAbqVI7/WpwKRMzzzuSB+E=","hive":"\n=========================================================================\nThu Feb 28 17:15:44 UTC 2019 KΛÐΞMLIΛ hive: queen's address: fd37e4\npopulation: 2 (2), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n============ DEPTH: 0 ==========================================\n000 1 3594 | 1 3594 (0)\n001 0 | 0\n002 1 cb08 | 1 cb08 (0)\n003 0 | 0\n004 0 | 0\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"fd37e45210ddb36f8b5ecef9c9d9d3f8201ba9523bfd6a70291333cf3b9207e1","private_key":"6a02f87b1d13a15ce24bfa58456af8aaabdcf8cb58b9f86c19ab14c721c80f91","name":"node_fd37e45210ddb36f8b5ecef9c9d9d3f8201ba9523bfd6a70291333cf3b9207e1","services":["bzz","pss"],"enable_msg_events":true,"port":39341},"up":true}},{"node":{"info":{"id":"3594438a7480a5c3dc06440e28a16044c0c7d289219da02f9e41da1810827805","name":"node_3594438a7480a5c3dc06440e28a16044c0c7d289219da02f9e41da1810827805","enode":"enode://0972df8ba2504ddc155739320ab392e64d000c950e08ce42863449bc4757dd03397efbad98888f8d740b7cf55c357d1d6d74b5e8cb935f71b19e0e16ceef03f9@127.0.0.1:0","enr":"0xf88fb840d5f39b1ebcd5b616ef67b1c0239ed4501ef45c6a00e5bd8cd3f2ac88870d4c4b6ce4a4af820afab9a714d99a5fef53ec3c042fc3243f403819bcfb3504c2150d0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1030972df8ba2504ddc155739320ab392e64d000c950e08ce42863449bc4757dd03","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"NZRDinSApcPcBkQOKKFgRMDH0okhnaAvnkHaGBCCeAU=","hive":"\n=========================================================================\nThu Feb 28 17:15:44 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 359443\npopulation: 2 (2), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n============ DEPTH: 0 ==========================================\n000 2 fd37 cb08 | 2 fd37 (0) cb08 (0)\n001 0 | 0\n002 0 | 0\n003 0 | 0\n004 0 | 0\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"3594438a7480a5c3dc06440e28a16044c0c7d289219da02f9e41da1810827805","private_key":"26266470b7f4e9341cbbbb304b1aed116626cb1bea55d639cdbef1a069c18123","name":"node_3594438a7480a5c3dc06440e28a16044c0c7d289219da02f9e41da1810827805","services":["bzz","pss"],"enable_msg_events":true,"port":33055},"up":true}},{"node":{"info":{"id":"cb08a9355f39ba55e6a1ab02410402169a6300835412baa4bde049a3fa1443bd","name":"node_cb08a9355f39ba55e6a1ab02410402169a6300835412baa4bde049a3fa1443bd","enode":"enode://046f757c2632f0fbdb74f73ce67be9cf181f85a6d2a8ec0d5e8a329a8ede81fe476bb5a1e5896b9ce49201ec4a32561bbbe91ab46eb9f7d99bb9a0002df3a639@127.0.0.1:0","enr":"0xf88fb84022bde12be56af73a7793d7ffe9f22d205a7540d6cc337815697115edeafcc1d461427c8cdee33e602201d3b2dfac034b567a8270e5f0c8b3fe29e10883f4b1e40183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103046f757c2632f0fbdb74f73ce67be9cf181f85a6d2a8ec0d5e8a329a8ede81fe","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"ywipNV85ulXmoasCQQQCFppjAINUErqkveBJo/oUQ70=","hive":"\n=========================================================================\nThu Feb 28 17:15:44 UTC 2019 KΛÐΞMLIΛ hive: queen's address: cb08a9\npopulation: 2 (2), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n============ DEPTH: 0 ==========================================\n000 1 3594 | 1 3594 (0)\n001 0 | 0\n002 1 fd37 | 1 fd37 (0)\n003 0 | 0\n004 0 | 0\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"cb08a9355f39ba55e6a1ab02410402169a6300835412baa4bde049a3fa1443bd","private_key":"52fd9e67692ef0963c13052f85f88eac3a527cd50137e4c0a75ebc8ad471b8af","name":"node_cb08a9355f39ba55e6a1ab02410402169a6300835412baa4bde049a3fa1443bd","services":["bzz","pss"],"enable_msg_events":true,"port":38675},"up":true}}],"conns":[{"one":"fd37e45210ddb36f8b5ecef9c9d9d3f8201ba9523bfd6a70291333cf3b9207e1","other":"3594438a7480a5c3dc06440e28a16044c0c7d289219da02f9e41da1810827805","up":true},{"one":"3594438a7480a5c3dc06440e28a16044c0c7d289219da02f9e41da1810827805","other":"cb08a9355f39ba55e6a1ab02410402169a6300835412baa4bde049a3fa1443bd","up":true},{"one":"cb08a9355f39ba55e6a1ab02410402169a6300835412baa4bde049a3fa1443bd","other":"fd37e45210ddb36f8b5ecef9c9d9d3f8201ba9523bfd6a70291333cf3b9207e1","up":true}]} \ No newline at end of file diff --git a/vendor/github.com/ethereum/go-ethereum/swarm/pss/testdata/snapshot_32.json b/vendor/github.com/ethereum/go-ethereum/swarm/pss/testdata/snapshot_32.json deleted file mode 100644 index 05a40b2b..00000000 --- a/vendor/github.com/ethereum/go-ethereum/swarm/pss/testdata/snapshot_32.json +++ /dev/null @@ -1 +0,0 @@ -{"nodes":[{"node":{"info":{"id":"2345add1ed7d98db8816aad3fda0829e6b0c9c167087067a7ec3a890bec8ad58","name":"node_2345add1ed7d98db8816aad3fda0829e6b0c9c167087067a7ec3a890bec8ad58","enode":"enode://6e710e572097f299c352e4e1b8a2980de9e6d2cba35fc6b05623ed829c722148861d96fef1530c41ea27a53be8894dd32b299189b421f1f8f06f6a706b56433a@127.0.0.1:0","enr":"0xf88fb8409bf3f7dd13b162a205ccbe927f310ddf3b8c4c5f89183331a6317408259f970e7cec513e4ee7bafb3ae3378b24837e035bde558630c0e6b7db93527f043dc0de0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1026e710e572097f299c352e4e1b8a2980de9e6d2cba35fc6b05623ed829c722148","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"I0Wt0e19mNuIFqrT/aCCnmsMnBZwhwZ6fsOokL7IrVg=","hive":"\n=========================================================================\nThu Feb 28 17:37:30 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 2345ad\npopulation: 11 (31), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 8ee3 8115 | 13 8115 (0) 8ee3 (0) 9b33 (0) 97b7 (0)\n001 3 7fb9 6e31 4730 | 12 6e31 (0) 6a64 (0) 753a (0) 7fb9 (0)\n002 3 0518 0d53 0993 | 3 0518 (0) 0d53 (0) 0993 (0)\n============ DEPTH: 3 ==========================================\n003 2 3a42 39fe | 2 39fe (0) 3a42 (0)\n004 0 | 0\n005 1 24cb | 1 24cb (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"2345add1ed7d98db8816aad3fda0829e6b0c9c167087067a7ec3a890bec8ad58","private_key":"f020ebea0429ea9f2ed075c50df1841beb61cdb88a0b5a3b864fe27bf214a297","name":"node_2345add1ed7d98db8816aad3fda0829e6b0c9c167087067a7ec3a890bec8ad58","services":["bzz","pss"],"enable_msg_events":true,"port":38575},"up":true}},{"node":{"info":{"id":"4730360679acf630fc8aba14c7be3bbc13953cb1ea8d7a72f5a3b5764170ef76","name":"node_4730360679acf630fc8aba14c7be3bbc13953cb1ea8d7a72f5a3b5764170ef76","enode":"enode://e57ffbc9c56f76b56f9005ac74af0db50a8e6f883e392b744080f36b35441ef2031f57e8d5d1899d0343f59545dfdda51cfc3c861bd810e0cb75516e32384676@127.0.0.1:0","enr":"0xf88fb8406472138d3fd8bb33c916d5192587abed17160ddc25b5b725259f95b3b5ab17b92fbb75939667eebdd4a0dab29d5b6a5b0cf3878d40c7c412cd99d22e94ced4e40183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102e57ffbc9c56f76b56f9005ac74af0db50a8e6f883e392b744080f36b35441ef2","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"RzA2Bnms9jD8iroUx747vBOVPLHqjXpy9aO1dkFw73Y=","hive":"\n=========================================================================\nThu Feb 28 17:37:30 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 473036\npopulation: 13 (31), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 8115 f3ed | 13 8115 (0) 8ee3 (0) 9b33 (0) 97b7 (0)\n001 3 0518 39fe 2345 | 7 0518 (0) 0d53 (0) 0993 (0) 39fe (0)\n002 4 7df3 78c7 6a64 6e31 | 7 6e31 (0) 6a64 (0) 753a (0) 7fb9 (0)\n============ DEPTH: 3 ==========================================\n003 3 541f 579d 5743 | 3 5743 (0) 579d (0) 541f (0)\n004 0 | 0\n005 0 | 0\n006 1 4464 | 1 4464 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"4730360679acf630fc8aba14c7be3bbc13953cb1ea8d7a72f5a3b5764170ef76","private_key":"99552bc7c5ce5b7ea569a6d3b46502a171a9ae1a3a6bc88f3fa2da99b1b25ef7","name":"node_4730360679acf630fc8aba14c7be3bbc13953cb1ea8d7a72f5a3b5764170ef76","services":["bzz","pss"],"enable_msg_events":true,"port":41821},"up":true}},{"node":{"info":{"id":"f3ed1ac2fa19ae12beaabe227ec033f495300f0830a84014c839ff2e676c98d3","name":"node_f3ed1ac2fa19ae12beaabe227ec033f495300f0830a84014c839ff2e676c98d3","enode":"enode://0dd06e3e445d2cc141af19d7143f57fdb7fd08688718a628230c9e80ee2e700d12b98585be5c983630faa8061cca9dcee5fa267840ab63c7a177ed32c54abac9@127.0.0.1:0","enr":"0xf88fb8400bc5733ce0c6dab1ea57bf24e37a838bc7bfd4d4fa76002760aba33bf2b102b27f84c60b93282a95881f98a45f91c174957d61630a70e6bb91877a0417b99c970183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1030dd06e3e445d2cc141af19d7143f57fdb7fd08688718a628230c9e80ee2e700d","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"8+0awvoZrhK+qr4ifsAz9JUwDwgwqEAUyDn/LmdsmNM=","hive":"\n=========================================================================\nThu Feb 28 17:37:30 UTC 2019 KΛÐΞMLIΛ hive: queen's address: f3ed1a\npopulation: 12 (31), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 39fe 3a42 78c7 541f | 19 0518 (0) 0d53 (0) 0993 (0) 39fe (0)\n001 3 97b7 8115 8ee3 | 7 8ee3 (0) 8115 (0) 9b33 (0) 97b7 (0)\n002 2 d735 ceeb | 3 ceeb (0) d735 (0) df92 (0)\n============ DEPTH: 3 ==========================================\n003 2 e17a e25a | 2 e17a (0) e25a (0)\n004 0 | 0\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"f3ed1ac2fa19ae12beaabe227ec033f495300f0830a84014c839ff2e676c98d3","private_key":"6cd0d2e5beba190a7a871ae45b3bfa123d3c79b4fd171ef22eceedcfa35dd7d6","name":"node_f3ed1ac2fa19ae12beaabe227ec033f495300f0830a84014c839ff2e676c98d3","services":["bzz","pss"],"enable_msg_events":true,"port":46325},"up":true}},{"node":{"info":{"id":"541f15bbe58d9e1b2bd3d1582c5cfa62fdbcd4363bcf451964f8c6d74f179a34","name":"node_541f15bbe58d9e1b2bd3d1582c5cfa62fdbcd4363bcf451964f8c6d74f179a34","enode":"enode://1cf1ddffc042e967618bacdcf1e4aa0e765d65acc9e75c3ba8ed8b40c5f602eaf1cdb0652219fa04c169441b74ad07b014e7b94c54a54d7aefdb2b9e05d8ed48@127.0.0.1:0","enr":"0xf88fb84017719ad2bdcf75e3de4b6bd1d41115306432abcbd8d0ac6ea95bce768f5b06c12b4f507ff59afcb21724688f254f2f177b300c1f22995c184b3466cad698ff280183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1021cf1ddffc042e967618bacdcf1e4aa0e765d65acc9e75c3ba8ed8b40c5f602ea","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"VB8Vu+WNnhsr09FYLFz6Yv281DY7z0UZZPjG108XmjQ=","hive":"\n=========================================================================\nThu Feb 28 17:37:30 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 541f15\npopulation: 10 (31), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 8ee3 f3ed | 13 8ee3 (0) 8115 (0) 9b33 (0) 97b7 (0)\n001 2 0518 24cb | 7 0518 (0) 0d53 (0) 0993 (0) 39fe (0)\n002 2 7fb9 6e31 | 7 6e31 (0) 6a64 (0) 753a (0) 7fb9 (0)\n003 2 4730 4464 | 2 4464 (0) 4730 (0)\n============ DEPTH: 4 ==========================================\n004 0 | 0\n005 0 | 0\n006 2 5743 579d | 2 5743 (0) 579d (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"541f15bbe58d9e1b2bd3d1582c5cfa62fdbcd4363bcf451964f8c6d74f179a34","private_key":"92852d378cc44e9e13a49fb6eac32c7808f2415bd4882da6076b5c5c57147a52","name":"node_541f15bbe58d9e1b2bd3d1582c5cfa62fdbcd4363bcf451964f8c6d74f179a34","services":["bzz","pss"],"enable_msg_events":true,"port":35339},"up":true}},{"node":{"info":{"id":"24cb391b1984a5380af82f2fa622f1a02eb035ecb3401d538e41824965ddcc56","name":"node_24cb391b1984a5380af82f2fa622f1a02eb035ecb3401d538e41824965ddcc56","enode":"enode://793fc878556c2704dac445d6dd237d8d4a5ffd6a9ccc7b40315790785062fcc9423df4649fdbeed26a47e3220ac6798c43e8111357e37d8a186382805a2d0f7f@127.0.0.1:0","enr":"0xf88fb8405ec36b34d21bc6414e2a974f21a891aa1ba4f896e1787c7e94b253908b8eb9274cf5b6c102479de1aef263c90c09c275ffdc2c8480007c92034d7073ac56b4de0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103793fc878556c2704dac445d6dd237d8d4a5ffd6a9ccc7b40315790785062fcc9","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"JMs5GxmEpTgK+C8vpiLxoC6wNeyzQB1TjkGCSWXdzFY=","hive":"\n=========================================================================\nThu Feb 28 17:37:30 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 24cb39\npopulation: 12 (31), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 e17a 8ee3 bfeb a263 | 13 8ee3 (0) 8115 (0) 9b33 (0) 97b7 (0)\n001 2 7fb9 541f | 12 6e31 (0) 6a64 (0) 753a (0) 7fb9 (0)\n002 3 0993 0d53 0518 | 3 0518 (0) 0d53 (0) 0993 (0)\n============ DEPTH: 3 ==========================================\n003 2 3a42 39fe | 2 39fe (0) 3a42 (0)\n004 0 | 0\n005 1 2345 | 1 2345 (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"24cb391b1984a5380af82f2fa622f1a02eb035ecb3401d538e41824965ddcc56","private_key":"e9e78ca9c5aa6c4d52d7d6f39dc7ef585ac1b3a232beec65a7493e818276c04d","name":"node_24cb391b1984a5380af82f2fa622f1a02eb035ecb3401d538e41824965ddcc56","services":["bzz","pss"],"enable_msg_events":true,"port":40305},"up":true}},{"node":{"info":{"id":"a263a5769cf3f226db7d2cd91aee96a206c46b0ce2a8078a6d3841dc3f4c5c66","name":"node_a263a5769cf3f226db7d2cd91aee96a206c46b0ce2a8078a6d3841dc3f4c5c66","enode":"enode://0e4cad0aaad50693ff30730b850da74646d6742011b90cbb5ea2e8bd1d5430f553796beed70d373525d4bb7a136a7ff5b3acee77afb21b9c91ba93bab9c1e7c6@127.0.0.1:0","enr":"0xf88fb84093fd09e514cfed721f0cb368859e31ec619cc2d0d8482cd0b216d6d368d761b43c8a0ce93916b46d87f2338a934a1ae706f2070e4cd6599b891ec374c90aa1110183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1020e4cad0aaad50693ff30730b850da74646d6742011b90cbb5ea2e8bd1d5430f5","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"omOldpzz8ibbfSzZGu6WogbEawziqAeKbThB3D9MXGY=","hive":"\n=========================================================================\nThu Feb 28 17:37:30 UTC 2019 KΛÐΞMLIΛ hive: queen's address: a263a5\npopulation: 11 (31), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 5743 78b6 24cb 3a42 | 19 6e31 (0) 6a64 (0) 753a (0) 7fb9 (0)\n001 2 e17a d735 | 6 f3ed (0) e17a (0) e25a (0) ceeb (0)\n002 3 8115 8ee3 97b7 | 4 8ee3 (0) 8115 (0) 9b33 (0) 97b7 (0)\n============ DEPTH: 3 ==========================================\n003 1 bfeb | 1 bfeb (0)\n004 0 | 0\n005 0 | 0\n006 0 | 0\n007 1 a3d9 | 1 a3d9 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"a263a5769cf3f226db7d2cd91aee96a206c46b0ce2a8078a6d3841dc3f4c5c66","private_key":"ff1484b5140cd7e811e6ce51bf267644de2b44a4aaac227490a713ed17b998ad","name":"node_a263a5769cf3f226db7d2cd91aee96a206c46b0ce2a8078a6d3841dc3f4c5c66","services":["bzz","pss"],"enable_msg_events":true,"port":45663},"up":true}},{"node":{"info":{"id":"3a4298be13c39ddee046f4237863528c05ac1e3a6c9c2cc429636865d8ee4a15","name":"node_3a4298be13c39ddee046f4237863528c05ac1e3a6c9c2cc429636865d8ee4a15","enode":"enode://6cdb01e6d8e2f2d201ae9593e7234c2f954efe223726481576d9596ecebf45965ce6606620cd8ac5ce8a62dd03ad386319acc6b0b49caef9533b8fb39f928338@127.0.0.1:0","enr":"0xf88fb840d5a5fd5c60a2e5253b01fc73dc69320f4be754df21628a91874bc86ae8e00bc02c432f46859e14dbc35515f1864c6e482e0165490d7a2e9e73a868789e6dc1560183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1026cdb01e6d8e2f2d201ae9593e7234c2f954efe223726481576d9596ecebf4596","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"OkKYvhPDnd7gRvQjeGNSjAWsHjpsnCzEKWNoZdjuShU=","hive":"\n=========================================================================\nThu Feb 28 17:37:30 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 3a4298\npopulation: 11 (31), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 f3ed a263 | 13 f3ed (0) e17a (0) e25a (0) ceeb (0)\n001 3 4464 753a 78b6 | 12 4464 (0) 4730 (0) 541f (0) 5743 (0)\n002 3 0993 0d53 0518 | 3 0518 (0) 0d53 (0) 0993 (0)\n============ DEPTH: 3 ==========================================\n003 2 24cb 2345 | 2 2345 (0) 24cb (0)\n004 0 | 0\n005 0 | 0\n006 1 39fe | 1 39fe (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"3a4298be13c39ddee046f4237863528c05ac1e3a6c9c2cc429636865d8ee4a15","private_key":"c3bd98ec585a2bf57984ea44e3df5862d0ac4036367cf8a71530d6e3da5e19cf","name":"node_3a4298be13c39ddee046f4237863528c05ac1e3a6c9c2cc429636865d8ee4a15","services":["bzz","pss"],"enable_msg_events":true,"port":33977},"up":true}},{"node":{"info":{"id":"78b6a2fb3428954855fbdbf99938e1214b8f19fa334144984289d1fb03bb4f7c","name":"node_78b6a2fb3428954855fbdbf99938e1214b8f19fa334144984289d1fb03bb4f7c","enode":"enode://0020a4e955476d6774ca840c91a6f298f738eb8bc162cdf0bf919d6ff85430dd080d68b2519e7a8806e30bbedd04d9ca0455e9cfea9a9d1f8316b3e02a7739c5@127.0.0.1:0","enr":"0xf88fb840091444d053b7aaddb31d705918bf78a24089d8db087272558babdf3c35e7e1544ab5f6d6d130c38f71153b590cd6c4a8b0538b39505b3bd53caadb499d7efc350183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1030020a4e955476d6774ca840c91a6f298f738eb8bc162cdf0bf919d6ff85430dd","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"eLai+zQolUhV+9v5mTjhIUuPGfozQUSYQonR+wO7T3w=","hive":"\n=========================================================================\nThu Feb 28 17:37:30 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 78b6a2\npopulation: 12 (31), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 a3d9 a263 | 13 a3d9 (0) a263 (0) bfeb (0) 9b33 (0)\n001 2 0518 3a42 | 7 0518 (0) 0d53 (0) 0993 (0) 24cb (0)\n002 2 4464 5743 | 5 4464 (0) 4730 (0) 541f (0) 579d (0)\n003 2 6a64 6e31 | 2 6e31 (0) 6a64 (0)\n004 1 753a | 1 753a (0)\n============ DEPTH: 5 ==========================================\n005 2 7fb9 7df3 | 2 7fb9 (0) 7df3 (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 1 78c7 | 1 78c7 (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"78b6a2fb3428954855fbdbf99938e1214b8f19fa334144984289d1fb03bb4f7c","private_key":"5d3e69f521510ed62af7c34c089faa034445e525fae5789a5b2708e3e34a55b7","name":"node_78b6a2fb3428954855fbdbf99938e1214b8f19fa334144984289d1fb03bb4f7c","services":["bzz","pss"],"enable_msg_events":true,"port":44923},"up":true}},{"node":{"info":{"id":"5743bc09e713e7c4d58fef1951ab6b627a27e6f1a3c42db88827a1613bd7ef3f","name":"node_5743bc09e713e7c4d58fef1951ab6b627a27e6f1a3c42db88827a1613bd7ef3f","enode":"enode://9769d41ff8d1a2220be2c7a9f3f522b197606a2a9b771e70f7115b43e9a3f7f8a2bd1bd4a7eed179a8f5032b122e7a16cc3f38eabf55f2655cb183a12c425f59@127.0.0.1:0","enr":"0xf88fb840406de7323ba3d20449df0acbcba8c0a6104d62495aae6346997f988a71b197a7232ae0db83b24c4b90dc2e9c8192734fd6bae7b1b0d41e80102201920fa864d70183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1039769d41ff8d1a2220be2c7a9f3f522b197606a2a9b771e70f7115b43e9a3f7f8","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"V0O8CecT58TVj+8ZUatrYnon5vGjxC24iCehYTvX7z8=","hive":"\n=========================================================================\nThu Feb 28 17:37:30 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 5743bc\npopulation: 12 (31), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 a3d9 a263 | 13 a3d9 (0) a263 (0) bfeb (0) 9b33 (0)\n001 2 0d53 0518 | 7 0518 (0) 0d53 (0) 0993 (0) 24cb (0)\n002 4 6e31 753a 7fb9 78b6 | 7 6e31 (0) 6a64 (0) 753a (0) 7fb9 (0)\n003 2 4464 4730 | 2 4464 (0) 4730 (0)\n============ DEPTH: 4 ==========================================\n004 0 | 0\n005 0 | 0\n006 1 541f | 1 541f (0)\n007 0 | 0\n008 1 579d | 1 579d (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"5743bc09e713e7c4d58fef1951ab6b627a27e6f1a3c42db88827a1613bd7ef3f","private_key":"3ec49076ee0972b516c7ac98a7ab569014cf747935fe3dd076c683c1cc7d0509","name":"node_5743bc09e713e7c4d58fef1951ab6b627a27e6f1a3c42db88827a1613bd7ef3f","services":["bzz","pss"],"enable_msg_events":true,"port":35273},"up":true}},{"node":{"info":{"id":"579da170901ed911be3445d4422664a997eb14201589d702e0688f6146872993","name":"node_579da170901ed911be3445d4422664a997eb14201589d702e0688f6146872993","enode":"enode://024d47097bb5d264e382a071489167e48e9c4e56ee3d0eb6594603ed7847dbbb141b45523e4b174b7083472630e08dcc15bb2495bb1fccc0506b19d4e14fa297@127.0.0.1:0","enr":"0xf88fb840e1f4b1665503a11d8e8c261ffc24f744272c0d96ebaf17d03c2046f6a0c3161f264ff1c4ddc618cb5da9c35b4dae871aaf7ec77cee48cab46467acc27f7d812b0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103024d47097bb5d264e382a071489167e48e9c4e56ee3d0eb6594603ed7847dbbb","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"V52hcJAe2RG+NEXUQiZkqZfrFCAVidcC4GiPYUaHKZM=","hive":"\n=========================================================================\nThu Feb 28 17:37:30 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 579da1\npopulation: 10 (31), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 a3d9 d735 | 13 a3d9 (0) a263 (0) bfeb (0) 9b33 (0)\n001 2 0d53 0518 | 7 0518 (0) 0d53 (0) 0993 (0) 24cb (0)\n002 2 6a64 6e31 | 7 6e31 (0) 6a64 (0) 753a (0) 7fb9 (0)\n003 2 4730 4464 | 2 4464 (0) 4730 (0)\n============ DEPTH: 4 ==========================================\n004 0 | 0\n005 0 | 0\n006 1 541f | 1 541f (0)\n007 0 | 0\n008 1 5743 | 1 5743 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"579da170901ed911be3445d4422664a997eb14201589d702e0688f6146872993","private_key":"6e50f30bce1310aa06e28011d83829b6432b73e09ffaa327bcb09d0a871e56c5","name":"node_579da170901ed911be3445d4422664a997eb14201589d702e0688f6146872993","services":["bzz","pss"],"enable_msg_events":true,"port":37161},"up":true}},{"node":{"info":{"id":"d7351e47f0c746ed33c652b0f2aa2fed354c8dad8d87525a4b511581aff6c6fa","name":"node_d7351e47f0c746ed33c652b0f2aa2fed354c8dad8d87525a4b511581aff6c6fa","enode":"enode://e0063bc92893325b6f3aff3a1cdebe170f3a70c3ed8b6aa55607f96ffa9e199f1f37d6b4f5743adeb91e1aea7baea44fca78010706f2615c27840a341d926a4d@127.0.0.1:0","enr":"0xf88fb8407686b23d8d56528be1d859eb241e4228adbebf46b6664fb1a89141257a7552140a602485685a9256944106c9f9f57828d22cd7ce01c64fa504dd7977294b52cf0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103e0063bc92893325b6f3aff3a1cdebe170f3a70c3ed8b6aa55607f96ffa9e199f","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"1zUeR/DHRu0zxlKw8qov7TVMja2Nh1JaS1EVga/2xvo=","hive":"\n=========================================================================\nThu Feb 28 17:37:30 UTC 2019 KΛÐΞMLIΛ hive: queen's address: d7351e\npopulation: 9 (31), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 0518 7df3 579d | 19 0d53 (0) 0993 (0) 0518 (0) 24cb (0)\n001 2 a3d9 a263 | 7 a3d9 (0) a263 (0) bfeb (0) 9b33 (0)\n002 2 e25a f3ed | 3 f3ed (0) e25a (0) e17a (0)\n============ DEPTH: 3 ==========================================\n003 1 ceeb | 1 ceeb (0)\n004 1 df92 | 1 df92 (0)\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"d7351e47f0c746ed33c652b0f2aa2fed354c8dad8d87525a4b511581aff6c6fa","private_key":"e6ebe5c66707a0c89243e414155374afcdcd0529b7fb63d17696f685fe9554dc","name":"node_d7351e47f0c746ed33c652b0f2aa2fed354c8dad8d87525a4b511581aff6c6fa","services":["bzz","pss"],"enable_msg_events":true,"port":35925},"up":true}},{"node":{"info":{"id":"7df3074f4e1175a213e578939abd9c1e5ff71543eb5dc24ee5ded5f804e3b842","name":"node_7df3074f4e1175a213e578939abd9c1e5ff71543eb5dc24ee5ded5f804e3b842","enode":"enode://f0b310658f442f5bb853496ee598435dd08bdfdceb62499f0aa1583212529fb831b2d1f6db5a2faadc238f91204b7d5a51d7f9259983008bccba2d35d5bd7114@127.0.0.1:0","enr":"0xf88fb84015bb5fcc3a16b896d129418fd6304c5c4a07d2613278e74c38490a515d97e03074fb145cd653fcf028feb6f005d0ca8c83203df0ec9c042635e41c9a685264810183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102f0b310658f442f5bb853496ee598435dd08bdfdceb62499f0aa1583212529fb8","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"ffMHT04RdaIT5XiTmr2cHl/3FUPrXcJO5d7V+ATjuEI=","hive":"\n=========================================================================\nThu Feb 28 17:37:30 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 7df307\npopulation: 12 (31), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 a3d9 d735 | 13 a3d9 (0) a263 (0) bfeb (0) 9b33 (0)\n001 2 0993 0d53 | 7 0d53 (0) 0993 (0) 0518 (0) 24cb (0)\n002 2 4730 4464 | 5 4464 (0) 4730 (0) 541f (0) 5743 (0)\n003 2 6a64 6e31 | 2 6e31 (0) 6a64 (0)\n004 1 753a | 1 753a (0)\n============ DEPTH: 5 ==========================================\n005 2 78b6 78c7 | 2 78b6 (0) 78c7 (0)\n006 1 7fb9 | 1 7fb9 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"7df3074f4e1175a213e578939abd9c1e5ff71543eb5dc24ee5ded5f804e3b842","private_key":"2739d262560fd1c32320e01920f26d20fe756d085ea86b3a3c105ee36f6b13c4","name":"node_7df3074f4e1175a213e578939abd9c1e5ff71543eb5dc24ee5ded5f804e3b842","services":["bzz","pss"],"enable_msg_events":true,"port":34347},"up":true}},{"node":{"info":{"id":"78c70d33dfd131bcc1c64267bf71e6fe81e93f891b940a1114c657c826675bd7","name":"node_78c70d33dfd131bcc1c64267bf71e6fe81e93f891b940a1114c657c826675bd7","enode":"enode://2852c5c0c2cc4ce9ec1e680b5be7fdc6178bf36e6393d791817042b221a0f787dcb6f00600b95c177940bae3dcad8bb10d7e0601d92d6fee73033dcffe0af98a@127.0.0.1:0","enr":"0xf88fb840250093f9c808805726fa94afee9b1fbe20be7c6bcaf444a93e3073cb2eb4632d1eb840824f9ca949b40b26b9878f7399f4c3c1ee6ac0877c3f52efb88aae18510183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1022852c5c0c2cc4ce9ec1e680b5be7fdc6178bf36e6393d791817042b221a0f787","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"eMcNM9/RMbzBxkJnv3Hm/oHpP4kblAoRFMZXyCZnW9c=","hive":"\n=========================================================================\nThu Feb 28 17:37:30 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 78c70d\npopulation: 12 (31), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 f3ed a3d9 | 13 f3ed (0) e25a (0) e17a (0) ceeb (0)\n001 2 0993 0d53 | 7 0d53 (0) 0993 (0) 0518 (0) 24cb (0)\n002 2 4730 4464 | 5 4464 (0) 4730 (0) 541f (0) 5743 (0)\n003 2 6a64 6e31 | 2 6e31 (0) 6a64 (0)\n004 1 753a | 1 753a (0)\n============ DEPTH: 5 ==========================================\n005 2 7fb9 7df3 | 2 7fb9 (0) 7df3 (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 1 78b6 | 1 78b6 (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"78c70d33dfd131bcc1c64267bf71e6fe81e93f891b940a1114c657c826675bd7","private_key":"ecb17d33e2878ecc69683c97b16415ef66ea959593d5e15b0a376ab566cccdfb","name":"node_78c70d33dfd131bcc1c64267bf71e6fe81e93f891b940a1114c657c826675bd7","services":["bzz","pss"],"enable_msg_events":true,"port":37163},"up":true}},{"node":{"info":{"id":"a3d987795e19f8518e4770f72c9f80804b999a31bf22d09cfeb04d644b429bf9","name":"node_a3d987795e19f8518e4770f72c9f80804b999a31bf22d09cfeb04d644b429bf9","enode":"enode://abe44f262b43e0ddcc49d889a93f3f7d43ea44bf504d23937464edf104332b963d3635818c12867c25f4e43c4860e18cbedc28a87dd87ca65bf2b13db23ff93b@127.0.0.1:0","enr":"0xf88fb840c0a357ca865bdcbfbc5f575be6d2ab837c7354069d334c5ab7d618076595a70c5a8a53142161c36f6d759f2f8e196924f722f98635f3fbfbb86fe7a910868ad20183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103abe44f262b43e0ddcc49d889a93f3f7d43ea44bf504d23937464edf104332b96","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"o9mHeV4Z+FGOR3D3LJ+AgEuZmjG/ItCc/rBNZEtCm/k=","hive":"\n=========================================================================\nThu Feb 28 17:37:30 UTC 2019 KΛÐΞMLIΛ hive: queen's address: a3d987\npopulation: 15 (31), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 7 39fe 579d 5743 753a | 19 0d53 (0) 0993 (0) 0518 (0) 24cb (0)\n001 3 d735 df92 e25a | 6 f3ed (0) e25a (0) e17a (0) ceeb (0)\n002 3 8115 8ee3 9b33 | 4 9b33 (0) 97b7 (0) 8ee3 (0) 8115 (0)\n============ DEPTH: 3 ==========================================\n003 1 bfeb | 1 bfeb (0)\n004 0 | 0\n005 0 | 0\n006 0 | 0\n007 1 a263 | 1 a263 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"a3d987795e19f8518e4770f72c9f80804b999a31bf22d09cfeb04d644b429bf9","private_key":"765bfc005ad4dec671a2f1dee108fa60f9760b185dee1d2a2af53a0d56f53902","name":"node_a3d987795e19f8518e4770f72c9f80804b999a31bf22d09cfeb04d644b429bf9","services":["bzz","pss"],"enable_msg_events":true,"port":35675},"up":true}},{"node":{"info":{"id":"39fea76e2e430919cadb48ce290c11ad66b2f8a66886ae08b59e418fa4eade8b","name":"node_39fea76e2e430919cadb48ce290c11ad66b2f8a66886ae08b59e418fa4eade8b","enode":"enode://1a9002726d9442faaa087d3f865c4c5d7f2882a87866a710835cbb8d4dc3da7338b868cd888fd898e4016dd20fd21f98891a212f1b17a5427b5476b5b6f6c317@127.0.0.1:0","enr":"0xf88fb840fa5103638887af121c7fe3afedad54432df30561fc796f03459942a3f17f7cc03ea50cfe59d8af29e82b76f1295a8b5697f48525060ed90d804210a80df804bd0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1031a9002726d9442faaa087d3f865c4c5d7f2882a87866a710835cbb8d4dc3da73","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"Of6nbi5DCRnK20jOKQwRrWay+KZohq4ItZ5Bj6Tq3os=","hive":"\n=========================================================================\nThu Feb 28 17:37:30 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 39fea7\npopulation: 12 (31), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 f3ed e25a a3d9 | 13 f3ed (0) e25a (0) e17a (0) ceeb (0)\n001 3 4730 753a 6a64 | 12 4730 (0) 4464 (0) 541f (0) 5743 (0)\n002 3 0518 0993 0d53 | 3 0d53 (0) 0993 (0) 0518 (0)\n============ DEPTH: 3 ==========================================\n003 2 24cb 2345 | 2 24cb (0) 2345 (0)\n004 0 | 0\n005 0 | 0\n006 1 3a42 | 1 3a42 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"39fea76e2e430919cadb48ce290c11ad66b2f8a66886ae08b59e418fa4eade8b","private_key":"bd7dbd51baf88692c24a8d75636af1f00e609fe4eda6444b674b14ab09ecddc5","name":"node_39fea76e2e430919cadb48ce290c11ad66b2f8a66886ae08b59e418fa4eade8b","services":["bzz","pss"],"enable_msg_events":true,"port":33437},"up":true}},{"node":{"info":{"id":"6a64d765e40fde1190ff228bb86096b84182d719e6d1b713726db9aaeea437da","name":"node_6a64d765e40fde1190ff228bb86096b84182d719e6d1b713726db9aaeea437da","enode":"enode://ce647cc2ad911b8cb35aeb74b022bce733ae4cfd609859b6c348e72e4e03cc4284064126b5419e15e7ad1e321469b3fbc3cb30319247c36b0eeba7f5a069a78d@127.0.0.1:0","enr":"0xf88fb840d07202149bb989b7b0bc49a88fab6c8e70082ef55751246005290393cfe8979c72eac475f2a5fe1292b7a48ae288d9fa421806c36447be580061fb5ee11fe5f30183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103ce647cc2ad911b8cb35aeb74b022bce733ae4cfd609859b6c348e72e4e03cc42","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"amTXZeQP3hGQ/yKLuGCWuEGC1xnm0bcTcm25qu6kN9o=","hive":"\n=========================================================================\nThu Feb 28 17:37:30 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 6a64d7\npopulation: 14 (31), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 ceeb 9b33 | 13 ceeb (0) df92 (0) d735 (0) f3ed (0)\n001 3 0993 0d53 39fe | 7 0d53 (0) 0993 (0) 0518 (0) 24cb (0)\n002 3 579d 4464 4730 | 5 4730 (0) 4464 (0) 541f (0) 5743 (0)\n============ DEPTH: 3 ==========================================\n003 5 753a 78c7 78b6 7df3 | 5 753a (0) 7fb9 (0) 7df3 (0) 78b6 (0)\n004 0 | 0\n005 1 6e31 | 1 6e31 (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"6a64d765e40fde1190ff228bb86096b84182d719e6d1b713726db9aaeea437da","private_key":"2d1258592260e026c71f0e3d8f9b60ff4264cca8acb232abc3715ed0fa49e8cf","name":"node_6a64d765e40fde1190ff228bb86096b84182d719e6d1b713726db9aaeea437da","services":["bzz","pss"],"enable_msg_events":true,"port":37153},"up":true}},{"node":{"info":{"id":"9b335aeb69b7fbd396ace5182d3fe7930e5d9786531593310b48a857c2bb769e","name":"node_9b335aeb69b7fbd396ace5182d3fe7930e5d9786531593310b48a857c2bb769e","enode":"enode://ddf82056124d428300b2fbe2318d468707657ce7aed15add51629475f3bf3076eb42fd2da9394bef0c22e2fa4615e39e3cec3073587947862b347e7e30e046e6@127.0.0.1:0","enr":"0xf88fb8403df62e843c1aba232b75f4e1ef741cdcb6a1abc2d70c27548171885786d8cf6262354bc32298a1202bb3a1b484b9840592f11470af89955df5c5cff009f3d5470183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102ddf82056124d428300b2fbe2318d468707657ce7aed15add51629475f3bf3076","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"mzNa62m3+9OWrOUYLT/nkw5dl4ZTFZMxC0ioV8K7dp4=","hive":"\n=========================================================================\nThu Feb 28 17:37:30 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 9b335a\npopulation: 9 (31), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 4464 6a64 | 19 0d53 (0) 0993 (0) 0518 (0) 24cb (0)\n001 2 df92 ceeb | 6 ceeb (0) df92 (0) d735 (0) f3ed (0)\n002 2 bfeb a3d9 | 3 a3d9 (0) a263 (0) bfeb (0)\n============ DEPTH: 3 ==========================================\n003 2 8ee3 8115 | 2 8ee3 (0) 8115 (0)\n004 1 97b7 | 1 97b7 (0)\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"9b335aeb69b7fbd396ace5182d3fe7930e5d9786531593310b48a857c2bb769e","private_key":"f0dcfc2e5fe5cc19ae0e55c17cea621a344848ba6413de2fa1370d0ef5041cc1","name":"node_9b335aeb69b7fbd396ace5182d3fe7930e5d9786531593310b48a857c2bb769e","services":["bzz","pss"],"enable_msg_events":true,"port":36105},"up":true}},{"node":{"info":{"id":"8115abcf39747a7af3eece55f12cc9e4909a76e41853b2e126522150dbda9507","name":"node_8115abcf39747a7af3eece55f12cc9e4909a76e41853b2e126522150dbda9507","enode":"enode://519322960c41240dfdf0f6eb33cf4dbcd607f9c71552844f4c88b40535ee8e8edc4f81e969ee6418ecaeb731f6627c7553535db148d6af171aa90d3d4b52de5e@127.0.0.1:0","enr":"0xf88fb840beb59d1ae71c8e13e68f38f5dc4d35fd419423aeb66e9bd02825cd51675e195c59bfe74790a11d3660a429f51c7fa533b03f5de75f9c50bd9deb20aad7bdb3aa0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102519322960c41240dfdf0f6eb33cf4dbcd607f9c71552844f4c88b40535ee8e8e","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"gRWrzzl0enrz7s5V8SzJ5JCaduQYU7LhJlIhUNvalQc=","hive":"\n=========================================================================\nThu Feb 28 17:37:30 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 8115ab\npopulation: 10 (31), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 4730 0d53 2345 | 19 0d53 (0) 0993 (0) 0518 (0) 24cb (0)\n001 2 f3ed ceeb | 6 ceeb (0) df92 (0) d735 (0) f3ed (0)\n002 2 a263 a3d9 | 3 a3d9 (0) a263 (0) bfeb (0)\n============ DEPTH: 3 ==========================================\n003 2 97b7 9b33 | 2 97b7 (0) 9b33 (0)\n004 1 8ee3 | 1 8ee3 (0)\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"8115abcf39747a7af3eece55f12cc9e4909a76e41853b2e126522150dbda9507","private_key":"0cdcfe48b7096864bb66f2d09b7ef45a27b5f26606f6429a841a266fadc2b8de","name":"node_8115abcf39747a7af3eece55f12cc9e4909a76e41853b2e126522150dbda9507","services":["bzz","pss"],"enable_msg_events":true,"port":37937},"up":true}},{"node":{"info":{"id":"8ee387438bab716f3b6d20f4c5a117bceaec603cfa6b1bd60b1d0b84b11ab430","name":"node_8ee387438bab716f3b6d20f4c5a117bceaec603cfa6b1bd60b1d0b84b11ab430","enode":"enode://5eb100e652f1a20369cc22355e5ddbb1f3503d45ab5bc343e42d43c1189ac66d99472efb731fbdb43c086a9867494c340a3b93ec0c248313ed44f017b38f0c97@127.0.0.1:0","enr":"0xf88fb8407e0bff7bd1090185526f52a43ecdda7358286cc0468f0eca9f18958d2a3447361acab4fa03a4a0799aa4e50f8e84c306e840f8249a0308b34f82b76afe046eed0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1035eb100e652f1a20369cc22355e5ddbb1f3503d45ab5bc343e42d43c1189ac66d","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"juOHQ4urcW87bSD0xaEXvOrsYDz6axvWCx0LhLEatDA=","hive":"\n=========================================================================\nThu Feb 28 17:37:30 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 8ee387\npopulation: 11 (31), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 24cb 2345 541f 7fb9 | 19 24cb (0) 2345 (0) 3a42 (0) 39fe (0)\n001 2 ceeb f3ed | 6 ceeb (0) df92 (0) d735 (0) f3ed (0)\n002 2 a263 a3d9 | 3 a3d9 (0) a263 (0) bfeb (0)\n============ DEPTH: 3 ==========================================\n003 2 9b33 97b7 | 2 97b7 (0) 9b33 (0)\n004 1 8115 | 1 8115 (0)\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"8ee387438bab716f3b6d20f4c5a117bceaec603cfa6b1bd60b1d0b84b11ab430","private_key":"105b799734097e8023441f6939805723ac89fcb4ff9ccac50bd62460e87c247c","name":"node_8ee387438bab716f3b6d20f4c5a117bceaec603cfa6b1bd60b1d0b84b11ab430","services":["bzz","pss"],"enable_msg_events":true,"port":40859},"up":true}},{"node":{"info":{"id":"7fb955ee345c87e9d8e3c989bc0bccb15e448f0d99a88d33fb7be67092fb6f14","name":"node_7fb955ee345c87e9d8e3c989bc0bccb15e448f0d99a88d33fb7be67092fb6f14","enode":"enode://2fb00f3ef77f231e224d908fcbafa19fcc9384a8636a4f616e2bd1d0aaa901ed6e8af6ae1fe98835650624d7d5cd0d357b6716dfed0096c2a4784a303dacf52a@127.0.0.1:0","enr":"0xf88fb840d2aff8f47839e79ba53089410607c84c3a350f6549787298369c6b4aaee001711772c1ebe313391835a231f69078929006c5bc46a7a7a365339a43019105ee6a0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1022fb00f3ef77f231e224d908fcbafa19fcc9384a8636a4f616e2bd1d0aaa901ed","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"f7lV7jRch+nY48mJvAvMsV5Ejw2ZqI0z+3vmcJL7bxQ=","hive":"\n=========================================================================\nThu Feb 28 17:37:30 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 7fb955\npopulation: 12 (31), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 bfeb 8ee3 | 13 ceeb (0) df92 (0) d735 (0) f3ed (0)\n001 2 2345 24cb | 7 24cb (0) 2345 (0) 3a42 (0) 39fe (0)\n002 2 5743 541f | 5 541f (0) 5743 (0) 579d (0) 4730 (0)\n003 2 6a64 6e31 | 2 6a64 (0) 6e31 (0)\n004 1 753a | 1 753a (0)\n============ DEPTH: 5 ==========================================\n005 2 78b6 78c7 | 2 78b6 (0) 78c7 (0)\n006 1 7df3 | 1 7df3 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"7fb955ee345c87e9d8e3c989bc0bccb15e448f0d99a88d33fb7be67092fb6f14","private_key":"64333ce54c8da8d7e9c33f7be3b251a5ed1e5aa83a11249a82e29a110b1d5b2b","name":"node_7fb955ee345c87e9d8e3c989bc0bccb15e448f0d99a88d33fb7be67092fb6f14","services":["bzz","pss"],"enable_msg_events":true,"port":42481},"up":true}},{"node":{"info":{"id":"bfeb6c69fed16d29ba20d11cd8b2389de22765b6209bbb8f1994014a20a204e6","name":"node_bfeb6c69fed16d29ba20d11cd8b2389de22765b6209bbb8f1994014a20a204e6","enode":"enode://c59989c774f7e074cdf34e86b5606f6413731cb002d6e23fb7048b6abb8d4ab175993ac902afe935830d5aaf2323da442f6001f4efb4f744c8e815d7cbebc210@127.0.0.1:0","enr":"0xf88fb840e0f778f02886637fbd7ea40cc496e93293d426c0339594822cebdd56850aa36f407c7f9a63d251f0a2dff02c8462b150d7c771c2dbb09d6f886529e5a354906c0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102c59989c774f7e074cdf34e86b5606f6413731cb002d6e23fb7048b6abb8d4ab1","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"v+tsaf7RbSm6INEc2LI4neInZbYgm7uPGZQBSiCiBOY=","hive":"\n=========================================================================\nThu Feb 28 17:37:30 UTC 2019 KΛÐΞMLIΛ hive: queen's address: bfeb6c\npopulation: 10 (31), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 0993 24cb 7fb9 | 19 24cb (0) 2345 (0) 3a42 (0) 39fe (0)\n001 3 ceeb df92 e17a | 6 ceeb (0) df92 (0) d735 (0) f3ed (0)\n002 2 9b33 97b7 | 4 97b7 (0) 9b33 (0) 8115 (0) 8ee3 (0)\n============ DEPTH: 3 ==========================================\n003 2 a3d9 a263 | 2 a3d9 (0) a263 (0)\n004 0 | 0\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"bfeb6c69fed16d29ba20d11cd8b2389de22765b6209bbb8f1994014a20a204e6","private_key":"1d29cf23c9755015db0f67b0188c2c19bf24987efa6c1682ccf3cc0ad0ec5a23","name":"node_bfeb6c69fed16d29ba20d11cd8b2389de22765b6209bbb8f1994014a20a204e6","services":["bzz","pss"],"enable_msg_events":true,"port":46455},"up":true}},{"node":{"info":{"id":"e17a8623af7b2fe2287b92e0b3d917ba44d8f29730197bae2aae20503568ab3a","name":"node_e17a8623af7b2fe2287b92e0b3d917ba44d8f29730197bae2aae20503568ab3a","enode":"enode://a2dd668460422389d655b5663deec36cd2881ad83de1e61764a4ac0281dc04de5dfe0a1c77aebf15b1507f62433d08f839fdc45ccde68b1372da5fb05edb2626@127.0.0.1:0","enr":"0xf88fb8402cb1df00b6cd3322b435ed7d378f8f55f11e43f478d15b4c2a5944bc802ae37d5d27186bbb89602d74aba656f45abb719f1f24cbc09221a929fe3b9c49e73e4e0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102a2dd668460422389d655b5663deec36cd2881ad83de1e61764a4ac0281dc04de","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"4XqGI697L+Ioe5Lgs9kXukTY8pcwGXuuKq4gUDVoqzo=","hive":"\n=========================================================================\nThu Feb 28 17:37:30 UTC 2019 KΛÐΞMLIΛ hive: queen's address: e17a86\npopulation: 8 (31), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 24cb 6e31 | 19 24cb (0) 2345 (0) 3a42 (0) 39fe (0)\n001 2 a263 bfeb | 7 97b7 (0) 9b33 (0) 8115 (0) 8ee3 (0)\n002 2 ceeb df92 | 3 df92 (0) d735 (0) ceeb (0)\n============ DEPTH: 3 ==========================================\n003 1 f3ed | 1 f3ed (0)\n004 0 | 0\n005 0 | 0\n006 1 e25a | 1 e25a (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"e17a8623af7b2fe2287b92e0b3d917ba44d8f29730197bae2aae20503568ab3a","private_key":"77bd5acdbf27ca1f194007ebaae9a384db0ed52cdf49a440fce50fd8986663d1","name":"node_e17a8623af7b2fe2287b92e0b3d917ba44d8f29730197bae2aae20503568ab3a","services":["bzz","pss"],"enable_msg_events":true,"port":38823},"up":true}},{"node":{"info":{"id":"6e3156d5037fafd4e4d6ffbfb50fd957bb34a81cdad24c65b97159f6fbca82da","name":"node_6e3156d5037fafd4e4d6ffbfb50fd957bb34a81cdad24c65b97159f6fbca82da","enode":"enode://e8f703980df3e25fe82683b6d2a775262e07309814eaaa60c3d22d64d352431ff3fc485e8bea252e646e60acb14b08c53ac0d6c480e468a018c9940cfbb5995a@127.0.0.1:0","enr":"0xf88fb840808b5d498d23de164013220eb74d54a810a0d63485538a9b2e4d05fb854995732e8be73c9c32da53cc2ef4dc9d554295743188a22c08a5ce3731575770cf250f0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102e8f703980df3e25fe82683b6d2a775262e07309814eaaa60c3d22d64d352431f","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"bjFW1QN/r9Tk1v+/tQ/ZV7s0qBza0kxluXFZ9vvKgto=","hive":"\n=========================================================================\nThu Feb 28 17:37:30 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 6e3156\npopulation: 16 (31), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 ceeb e17a | 13 97b7 (0) 9b33 (0) 8115 (0) 8ee3 (0)\n001 4 2345 0d53 0993 0518 | 7 24cb (0) 2345 (0) 3a42 (0) 39fe (0)\n002 4 579d 5743 541f 4730 | 5 5743 (0) 579d (0) 541f (0) 4730 (0)\n============ DEPTH: 3 ==========================================\n003 5 753a 7df3 7fb9 78c7 | 5 7fb9 (0) 7df3 (0) 78b6 (0) 78c7 (0)\n004 0 | 0\n005 1 6a64 | 1 6a64 (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"6e3156d5037fafd4e4d6ffbfb50fd957bb34a81cdad24c65b97159f6fbca82da","private_key":"a2b5a8fc75c349602ab3f0c732403c34e0dd6d0983bdca9fd6e8e63fa7e625ee","name":"node_6e3156d5037fafd4e4d6ffbfb50fd957bb34a81cdad24c65b97159f6fbca82da","services":["bzz","pss"],"enable_msg_events":true,"port":44515},"up":true}},{"node":{"info":{"id":"051872c926211797f625a675b50c934ab5f29cbb7d140b6c89dec4b924a0ff41","name":"node_051872c926211797f625a675b50c934ab5f29cbb7d140b6c89dec4b924a0ff41","enode":"enode://f95dcdf6a7b67a12e461b7d620e9e5473ef6630fae5334cc81ee19f7ed5a86af2d898820ee10598f9886270bad22885f33bdd77da3ce1cebc35eab12a851bf29@127.0.0.1:0","enr":"0xf88fb840f83b0db1e290d22c0a001f3850407da61d152aa66b04657db08b30ad9b417d3b20a8c76d1f78787581e182bf5a52a4e4133d916f923ae20b81ea6baccb2500410183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103f95dcdf6a7b67a12e461b7d620e9e5473ef6630fae5334cc81ee19f7ed5a86af","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"BRhyySYhF5f2JaZ1tQyTSrXynLt9FAtsid7EuSSg/0E=","hive":"\n=========================================================================\nThu Feb 28 17:37:30 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 051872\npopulation: 15 (31), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 d735 df92 | 13 df92 (0) d735 (0) ceeb (0) f3ed (0)\n001 7 541f 5743 579d 4730 | 12 5743 (0) 579d (0) 541f (0) 4730 (0)\n002 4 2345 24cb 39fe 3a42 | 4 3a42 (0) 39fe (0) 24cb (0) 2345 (0)\n============ DEPTH: 3 ==========================================\n003 0 | 0\n004 2 0d53 0993 | 2 0d53 (0) 0993 (0)\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"051872c926211797f625a675b50c934ab5f29cbb7d140b6c89dec4b924a0ff41","private_key":"15d5b46039f63072fedea8221981c8ea5e41e2f76fb9f68e11af1dc629514ae9","name":"node_051872c926211797f625a675b50c934ab5f29cbb7d140b6c89dec4b924a0ff41","services":["bzz","pss"],"enable_msg_events":true,"port":41645},"up":true}},{"node":{"info":{"id":"4464d33aaaf606f00c232547c64d4d0c3d0bc10080c9d2ceef78f0c9a5198e62","name":"node_4464d33aaaf606f00c232547c64d4d0c3d0bc10080c9d2ceef78f0c9a5198e62","enode":"enode://0b5fa0bc32971346e7f724db70c7c2debd42aabad0ae08ddafdd9c2a3089b1e39cb62b34e36b3a4902a20bbd0b86e47b0e660eda5fcd203a2bb7ee411397aebb@127.0.0.1:0","enr":"0xf88fb84042ecaa56acb3a73b05756c24e1d9cb90f3941293a34b7e58d19cf3f3974f801b38ddf5de2c5cc06ab8cddc4f1d39d6429e6bcb5d45b3162cd8efb5e62ab2963a0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1030b5fa0bc32971346e7f724db70c7c2debd42aabad0ae08ddafdd9c2a3089b1e3","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"RGTTOqr2BvAMIyVHxk1NDD0LwQCAydLO73jwyaUZjmI=","hive":"\n=========================================================================\nThu Feb 28 17:37:30 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 4464d3\npopulation: 13 (31), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 97b7 9b33 | 13 9b33 (0) 97b7 (0) 8115 (0) 8ee3 (0)\n001 2 3a42 0518 | 7 3a42 (0) 39fe (0) 24cb (0) 2345 (0)\n002 5 6a64 78b6 78c7 7df3 | 7 6a64 (0) 6e31 (0) 7fb9 (0) 7df3 (0)\n============ DEPTH: 3 ==========================================\n003 3 5743 579d 541f | 3 5743 (0) 579d (0) 541f (0)\n004 0 | 0\n005 0 | 0\n006 1 4730 | 1 4730 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"4464d33aaaf606f00c232547c64d4d0c3d0bc10080c9d2ceef78f0c9a5198e62","private_key":"2adb4afe6ba823e733df48a3d5d09eb8fa4ed380cb5accf0aae706ef7781f344","name":"node_4464d33aaaf606f00c232547c64d4d0c3d0bc10080c9d2ceef78f0c9a5198e62","services":["bzz","pss"],"enable_msg_events":true,"port":42813},"up":true}},{"node":{"info":{"id":"753a8367fcdaf8caf1fe6ca25ed97b23f99828115a38d61352488bc3d02a3e17","name":"node_753a8367fcdaf8caf1fe6ca25ed97b23f99828115a38d61352488bc3d02a3e17","enode":"enode://1352929c4211f4c4cd4a13cbfdce725e4f1bc4ed263b8fb8e5d34ead2f6bf5c0947a7013057d1f5cf04ea9ca1ca19bfe3dcc236e3ce674702dc5e8926b75ba89@127.0.0.1:0","enr":"0xf88fb840b9ab15d6154f9a25168313678352c17719ca962b1c7518185075c93a3f88bf3e224bb5165b657547a61ce6c7d65b28834119ba9de142b3ca096c1bf614cf3ad20183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1031352929c4211f4c4cd4a13cbfdce725e4f1bc4ed263b8fb8e5d34ead2f6bf5c0","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"dTqDZ/za+Mrx/myiXtl7I/mYKBFaONYTUkiLw9AqPhc=","hive":"\n=========================================================================\nThu Feb 28 17:37:30 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 753a83\npopulation: 12 (31), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 a3d9 e25a | 13 a3d9 (0) a263 (0) bfeb (0) 8115 (0)\n001 2 39fe 3a42 | 7 3a42 (0) 39fe (0) 24cb (0) 2345 (0)\n002 2 5743 4464 | 5 5743 (0) 579d (0) 541f (0) 4730 (0)\n003 2 6a64 6e31 | 2 6a64 (0) 6e31 (0)\n============ DEPTH: 4 ==========================================\n004 4 78c7 78b6 7df3 7fb9 | 4 7fb9 (0) 7df3 (0) 78c7 (0) 78b6 (0)\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"753a8367fcdaf8caf1fe6ca25ed97b23f99828115a38d61352488bc3d02a3e17","private_key":"168b73a15e60830a02857df2b0829fd5a8763b349b554523b0159f54eb92e3aa","name":"node_753a8367fcdaf8caf1fe6ca25ed97b23f99828115a38d61352488bc3d02a3e17","services":["bzz","pss"],"enable_msg_events":true,"port":33315},"up":true}},{"node":{"info":{"id":"e25a611f7a069314050e8ffca0eb383f72a0505c5942fd9f21c0d8ac4fc2255d","name":"node_e25a611f7a069314050e8ffca0eb383f72a0505c5942fd9f21c0d8ac4fc2255d","enode":"enode://5ac2f47e9c71378005c153f9d63851ec5b6548902f310f0e0d1f70adab24930495a39c6e2f861e4f90a7f6115cdad65b3031270b3a622d53adedf1842c4d5b60@127.0.0.1:0","enr":"0xf88fb840850bea04ffb859769c059b511c2c57509fd3a9169027e68054a4da19741eee99346b08613ccbd87611a1731d116f5eb6e857eb89cd51afd1352d2def6921cc6e0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1025ac2f47e9c71378005c153f9d63851ec5b6548902f310f0e0d1f70adab249304","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"4lphH3oGkxQFDo/8oOs4P3KgUFxZQv2fIcDYrE/CJV0=","hive":"\n=========================================================================\nThu Feb 28 17:37:30 UTC 2019 KΛÐΞMLIΛ hive: queen's address: e25a61\npopulation: 8 (31), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 39fe 753a | 19 39fe (0) 3a42 (0) 24cb (0) 2345 (0)\n001 2 a3d9 97b7 | 7 a3d9 (0) a263 (0) bfeb (0) 8115 (0)\n002 2 d735 df92 | 3 df92 (0) d735 (0) ceeb (0)\n============ DEPTH: 3 ==========================================\n003 1 f3ed | 1 f3ed (0)\n004 0 | 0\n005 0 | 0\n006 1 e17a | 1 e17a (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"e25a611f7a069314050e8ffca0eb383f72a0505c5942fd9f21c0d8ac4fc2255d","private_key":"c4c13286dcde737ba9a3fc2e7953732cdab547e3e0b627aa3eb5aa41403370d0","name":"node_e25a611f7a069314050e8ffca0eb383f72a0505c5942fd9f21c0d8ac4fc2255d","services":["bzz","pss"],"enable_msg_events":true,"port":42117},"up":true}},{"node":{"info":{"id":"97b703afe00489321ce9805704e8c509671ab0e946d339595a3220dbcfba17d7","name":"node_97b703afe00489321ce9805704e8c509671ab0e946d339595a3220dbcfba17d7","enode":"enode://2c0df18912e105bbf6f9b8eb475be15fa4b2588774db19e58efa9f9004827b7b7c7ce8c6b85f09ed18d35525894c0fdab9db72bda999b840490a9bf69d4e9483@127.0.0.1:0","enr":"0xf88fb84047867575521a015ed256017d340f51f6b7b89dbf341e7198d2873cdf1643097d57e3353c5b2dedc7ac2f59f228207f23aaf85bd0d5ea22c839cd42093c008c520183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1032c0df18912e105bbf6f9b8eb475be15fa4b2588774db19e58efa9f9004827b7b","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"l7cDr+AEiTIc6YBXBOjFCWcasOlG0zlZWjIg28+6F9c=","hive":"\n=========================================================================\nThu Feb 28 17:37:30 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 97b703\npopulation: 9 (31), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 4464 0d53 | 19 6e31 (0) 6a64 (0) 753a (0) 7fb9 (0)\n001 2 f3ed e25a | 6 f3ed (0) e17a (0) e25a (0) ceeb (0)\n002 2 a263 bfeb | 3 a3d9 (0) a263 (0) bfeb (0)\n============ DEPTH: 3 ==========================================\n003 2 8ee3 8115 | 2 8115 (0) 8ee3 (0)\n004 1 9b33 | 1 9b33 (0)\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"97b703afe00489321ce9805704e8c509671ab0e946d339595a3220dbcfba17d7","private_key":"459c256ce29dce2b5e51c0ce9519d817687f2ae8d39291bd0bb8c45be3cac239","name":"node_97b703afe00489321ce9805704e8c509671ab0e946d339595a3220dbcfba17d7","services":["bzz","pss"],"enable_msg_events":true,"port":35847},"up":true}},{"node":{"info":{"id":"0d53919c3d5b0afdc3b738d82cb213f91e05ec3b0f42a3aa46e7a5044f8c4684","name":"node_0d53919c3d5b0afdc3b738d82cb213f91e05ec3b0f42a3aa46e7a5044f8c4684","enode":"enode://61b38c0b92a4c6ce5d27ea0b6d43d452e1e997c46f8ee202b2e75ea97ced9f4688972acf423e65ef43459bb16e39aebf26088a1f1ff7539524802bc73e3933ae@127.0.0.1:0","enr":"0xf88fb840303205621ea7bf25072f954d0d961007601360547291141945bb0093577673ef019f53965ee35755ee49420db016f5bbeb2033ca540a4697ac74f4a7d44f3f200183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10261b38c0b92a4c6ce5d27ea0b6d43d452e1e997c46f8ee202b2e75ea97ced9f46","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"DVORnD1bCv3DtzjYLLIT+R4F7DsPQqOqRuelBE+MRoQ=","hive":"\n=========================================================================\nThu Feb 28 17:37:30 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 0d5391\npopulation: 15 (31), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 df92 8115 97b7 | 13 f3ed (0) e17a (0) e25a (0) ceeb (0)\n001 6 579d 5743 6a64 6e31 | 12 6e31 (0) 6a64 (0) 753a (0) 7fb9 (0)\n002 4 2345 24cb 3a42 39fe | 4 39fe (0) 3a42 (0) 24cb (0) 2345 (0)\n============ DEPTH: 3 ==========================================\n003 0 | 0\n004 1 0518 | 1 0518 (0)\n005 1 0993 | 1 0993 (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"0d53919c3d5b0afdc3b738d82cb213f91e05ec3b0f42a3aa46e7a5044f8c4684","private_key":"c45ad9fcca69152984db9fed40d730632c1298936ade555a8cb20d1a817bd670","name":"node_0d53919c3d5b0afdc3b738d82cb213f91e05ec3b0f42a3aa46e7a5044f8c4684","services":["bzz","pss"],"enable_msg_events":true,"port":38753},"up":true}},{"node":{"info":{"id":"df926a66c26fd9f0314c8fa294d79a88f912ec38c45a4f0267f64beeacaa1bc5","name":"node_df926a66c26fd9f0314c8fa294d79a88f912ec38c45a4f0267f64beeacaa1bc5","enode":"enode://95f793890df976e2116b50757db31f18f9973a271201d253d5e7eb8045e883b2343ce7c251c3cef5a8a47fb2f7ee194a75fd6da2f6c86edc301d1a1c61967aab@127.0.0.1:0","enr":"0xf88fb840d94e3579279121df14a0951495d39187d19e1eaaf27ea43657c534f73f0478c57461adbb638a01bac20370acce51c6a7336966224889eba1a5c7c71ed0ea14210183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10395f793890df976e2116b50757db31f18f9973a271201d253d5e7eb8045e883b2","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"35JqZsJv2fAxTI+ilNeaiPkS7DjEWk8CZ/ZL7qyqG8U=","hive":"\n=========================================================================\nThu Feb 28 17:37:30 UTC 2019 KΛÐΞMLIΛ hive: queen's address: df926a\npopulation: 9 (31), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 0518 0d53 | 19 6e31 (0) 6a64 (0) 753a (0) 7fb9 (0)\n001 3 9b33 a3d9 bfeb | 7 bfeb (0) a3d9 (0) a263 (0) 8115 (0)\n002 2 e25a e17a | 3 f3ed (0) e17a (0) e25a (0)\n============ DEPTH: 3 ==========================================\n003 1 ceeb | 1 ceeb (0)\n004 1 d735 | 1 d735 (0)\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"df926a66c26fd9f0314c8fa294d79a88f912ec38c45a4f0267f64beeacaa1bc5","private_key":"eeb3903d4463417af9da2ea27fba13fd5093da36946266a277ec581558b2856c","name":"node_df926a66c26fd9f0314c8fa294d79a88f912ec38c45a4f0267f64beeacaa1bc5","services":["bzz","pss"],"enable_msg_events":true,"port":39343},"up":true}},{"node":{"info":{"id":"ceeb822ae31349abaddb5430e80433f4533e942960a2f51cc846df95daa5a8f8","name":"node_ceeb822ae31349abaddb5430e80433f4533e942960a2f51cc846df95daa5a8f8","enode":"enode://b3e2654630b1d6ebbb09ee959e76c7730ae9c6fc480911ff08fcdd24d7ba4b828729f5a4dfc7200e612a8c1fcf86eaeb7cbb8c21397b46c65f32e1aed42147d9@127.0.0.1:0","enr":"0xf88fb84092f5be44e027ba50e860ca40efdd29bbf06481e026e13a4a5ac92a23fbfc4abd14a3e017a8b06df176479a8d5f2917d4c34c2acef2bcf5759a288681f2ea97400183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103b3e2654630b1d6ebbb09ee959e76c7730ae9c6fc480911ff08fcdd24d7ba4b82","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"zuuCKuMTSaut21Qw6AQz9FM+lClgovUcyEbfldqlqPg=","hive":"\n=========================================================================\nThu Feb 28 17:37:30 UTC 2019 KΛÐΞMLIΛ hive: queen's address: ceeb82\npopulation: 11 (31), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 6a64 6e31 0993 | 19 6e31 (0) 6a64 (0) 753a (0) 7fb9 (0)\n001 4 bfeb 9b33 8ee3 8115 | 7 bfeb (0) a3d9 (0) a263 (0) 8115 (0)\n002 2 e17a f3ed | 3 f3ed (0) e17a (0) e25a (0)\n============ DEPTH: 3 ==========================================\n003 2 d735 df92 | 2 d735 (0) df92 (0)\n004 0 | 0\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"ceeb822ae31349abaddb5430e80433f4533e942960a2f51cc846df95daa5a8f8","private_key":"b6e0764b9a67a61d0b3d28f015fa324dcd1cf91184ffe3e19d09dd4c2e03eba9","name":"node_ceeb822ae31349abaddb5430e80433f4533e942960a2f51cc846df95daa5a8f8","services":["bzz","pss"],"enable_msg_events":true,"port":33733},"up":true}},{"node":{"info":{"id":"09937e27c0e52501dab72157877f99482a2b72da8a3690e55c517c0fc3f3bffc","name":"node_09937e27c0e52501dab72157877f99482a2b72da8a3690e55c517c0fc3f3bffc","enode":"enode://7865fabc9290d5908d0b0379da577a803da633ce87eca6a230cd485858f79d8732a353fd06bb730a194d4014ac932231ca83337c8523f7134c7d42d4c478d3a2@127.0.0.1:0","enr":"0xf88fb840d2dbe8ecd544c1c014c8f02cd34a100977754a6db7f5e02016625158c1bdd75c53f231aa89315cd6bf3d705704e49986dc7ed17eedc5540e7991a7f69c0df83b0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1027865fabc9290d5908d0b0379da577a803da633ce87eca6a230cd485858f79d87","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"CZN+J8DlJQHatyFXh3+ZSCorctqKNpDlXFF8D8Pzv/w=","hive":"\n=========================================================================\nThu Feb 28 17:37:30 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 09937e\npopulation: 12 (31), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 bfeb ceeb | 13 bfeb (0) a3d9 (0) a263 (0) 8115 (0)\n001 4 78c7 7df3 6a64 6e31 | 12 6e31 (0) 6a64 (0) 753a (0) 7fb9 (0)\n002 4 3a42 39fe 24cb 2345 | 4 39fe (0) 3a42 (0) 24cb (0) 2345 (0)\n============ DEPTH: 3 ==========================================\n003 0 | 0\n004 1 0518 | 1 0518 (0)\n005 1 0d53 | 1 0d53 (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"09937e27c0e52501dab72157877f99482a2b72da8a3690e55c517c0fc3f3bffc","private_key":"e412c080f6539c4ed5ecc3cb66b97b85ee903f61b67fc90fa515775522d067ac","name":"node_09937e27c0e52501dab72157877f99482a2b72da8a3690e55c517c0fc3f3bffc","services":["bzz","pss"],"enable_msg_events":true,"port":34047},"up":true}}],"conns":[{"one":"2345add1ed7d98db8816aad3fda0829e6b0c9c167087067a7ec3a890bec8ad58","other":"4730360679acf630fc8aba14c7be3bbc13953cb1ea8d7a72f5a3b5764170ef76","up":true},{"one":"4730360679acf630fc8aba14c7be3bbc13953cb1ea8d7a72f5a3b5764170ef76","other":"f3ed1ac2fa19ae12beaabe227ec033f495300f0830a84014c839ff2e676c98d3","up":true},{"one":"f3ed1ac2fa19ae12beaabe227ec033f495300f0830a84014c839ff2e676c98d3","other":"541f15bbe58d9e1b2bd3d1582c5cfa62fdbcd4363bcf451964f8c6d74f179a34","up":true},{"one":"541f15bbe58d9e1b2bd3d1582c5cfa62fdbcd4363bcf451964f8c6d74f179a34","other":"24cb391b1984a5380af82f2fa622f1a02eb035ecb3401d538e41824965ddcc56","up":true},{"one":"24cb391b1984a5380af82f2fa622f1a02eb035ecb3401d538e41824965ddcc56","other":"a263a5769cf3f226db7d2cd91aee96a206c46b0ce2a8078a6d3841dc3f4c5c66","up":true},{"one":"a263a5769cf3f226db7d2cd91aee96a206c46b0ce2a8078a6d3841dc3f4c5c66","other":"3a4298be13c39ddee046f4237863528c05ac1e3a6c9c2cc429636865d8ee4a15","up":true},{"one":"3a4298be13c39ddee046f4237863528c05ac1e3a6c9c2cc429636865d8ee4a15","other":"78b6a2fb3428954855fbdbf99938e1214b8f19fa334144984289d1fb03bb4f7c","up":true},{"one":"78b6a2fb3428954855fbdbf99938e1214b8f19fa334144984289d1fb03bb4f7c","other":"5743bc09e713e7c4d58fef1951ab6b627a27e6f1a3c42db88827a1613bd7ef3f","up":true},{"one":"5743bc09e713e7c4d58fef1951ab6b627a27e6f1a3c42db88827a1613bd7ef3f","other":"579da170901ed911be3445d4422664a997eb14201589d702e0688f6146872993","up":true},{"one":"579da170901ed911be3445d4422664a997eb14201589d702e0688f6146872993","other":"d7351e47f0c746ed33c652b0f2aa2fed354c8dad8d87525a4b511581aff6c6fa","up":true},{"one":"d7351e47f0c746ed33c652b0f2aa2fed354c8dad8d87525a4b511581aff6c6fa","other":"7df3074f4e1175a213e578939abd9c1e5ff71543eb5dc24ee5ded5f804e3b842","up":true},{"one":"7df3074f4e1175a213e578939abd9c1e5ff71543eb5dc24ee5ded5f804e3b842","other":"78c70d33dfd131bcc1c64267bf71e6fe81e93f891b940a1114c657c826675bd7","up":true},{"one":"78c70d33dfd131bcc1c64267bf71e6fe81e93f891b940a1114c657c826675bd7","other":"a3d987795e19f8518e4770f72c9f80804b999a31bf22d09cfeb04d644b429bf9","up":true},{"one":"a3d987795e19f8518e4770f72c9f80804b999a31bf22d09cfeb04d644b429bf9","other":"39fea76e2e430919cadb48ce290c11ad66b2f8a66886ae08b59e418fa4eade8b","up":true},{"one":"39fea76e2e430919cadb48ce290c11ad66b2f8a66886ae08b59e418fa4eade8b","other":"6a64d765e40fde1190ff228bb86096b84182d719e6d1b713726db9aaeea437da","up":true},{"one":"6a64d765e40fde1190ff228bb86096b84182d719e6d1b713726db9aaeea437da","other":"9b335aeb69b7fbd396ace5182d3fe7930e5d9786531593310b48a857c2bb769e","up":true},{"one":"9b335aeb69b7fbd396ace5182d3fe7930e5d9786531593310b48a857c2bb769e","other":"8115abcf39747a7af3eece55f12cc9e4909a76e41853b2e126522150dbda9507","up":true},{"one":"8115abcf39747a7af3eece55f12cc9e4909a76e41853b2e126522150dbda9507","other":"8ee387438bab716f3b6d20f4c5a117bceaec603cfa6b1bd60b1d0b84b11ab430","up":true},{"one":"8ee387438bab716f3b6d20f4c5a117bceaec603cfa6b1bd60b1d0b84b11ab430","other":"7fb955ee345c87e9d8e3c989bc0bccb15e448f0d99a88d33fb7be67092fb6f14","up":true},{"one":"7fb955ee345c87e9d8e3c989bc0bccb15e448f0d99a88d33fb7be67092fb6f14","other":"bfeb6c69fed16d29ba20d11cd8b2389de22765b6209bbb8f1994014a20a204e6","up":true},{"one":"bfeb6c69fed16d29ba20d11cd8b2389de22765b6209bbb8f1994014a20a204e6","other":"e17a8623af7b2fe2287b92e0b3d917ba44d8f29730197bae2aae20503568ab3a","up":true},{"one":"e17a8623af7b2fe2287b92e0b3d917ba44d8f29730197bae2aae20503568ab3a","other":"6e3156d5037fafd4e4d6ffbfb50fd957bb34a81cdad24c65b97159f6fbca82da","up":true},{"one":"6e3156d5037fafd4e4d6ffbfb50fd957bb34a81cdad24c65b97159f6fbca82da","other":"051872c926211797f625a675b50c934ab5f29cbb7d140b6c89dec4b924a0ff41","up":true},{"one":"051872c926211797f625a675b50c934ab5f29cbb7d140b6c89dec4b924a0ff41","other":"4464d33aaaf606f00c232547c64d4d0c3d0bc10080c9d2ceef78f0c9a5198e62","up":true},{"one":"4464d33aaaf606f00c232547c64d4d0c3d0bc10080c9d2ceef78f0c9a5198e62","other":"753a8367fcdaf8caf1fe6ca25ed97b23f99828115a38d61352488bc3d02a3e17","up":true},{"one":"753a8367fcdaf8caf1fe6ca25ed97b23f99828115a38d61352488bc3d02a3e17","other":"e25a611f7a069314050e8ffca0eb383f72a0505c5942fd9f21c0d8ac4fc2255d","up":true},{"one":"e25a611f7a069314050e8ffca0eb383f72a0505c5942fd9f21c0d8ac4fc2255d","other":"97b703afe00489321ce9805704e8c509671ab0e946d339595a3220dbcfba17d7","up":true},{"one":"97b703afe00489321ce9805704e8c509671ab0e946d339595a3220dbcfba17d7","other":"0d53919c3d5b0afdc3b738d82cb213f91e05ec3b0f42a3aa46e7a5044f8c4684","up":true},{"one":"0d53919c3d5b0afdc3b738d82cb213f91e05ec3b0f42a3aa46e7a5044f8c4684","other":"df926a66c26fd9f0314c8fa294d79a88f912ec38c45a4f0267f64beeacaa1bc5","up":true},{"one":"df926a66c26fd9f0314c8fa294d79a88f912ec38c45a4f0267f64beeacaa1bc5","other":"ceeb822ae31349abaddb5430e80433f4533e942960a2f51cc846df95daa5a8f8","up":true},{"one":"ceeb822ae31349abaddb5430e80433f4533e942960a2f51cc846df95daa5a8f8","other":"09937e27c0e52501dab72157877f99482a2b72da8a3690e55c517c0fc3f3bffc","up":true},{"one":"09937e27c0e52501dab72157877f99482a2b72da8a3690e55c517c0fc3f3bffc","other":"2345add1ed7d98db8816aad3fda0829e6b0c9c167087067a7ec3a890bec8ad58","up":true},{"one":"2345add1ed7d98db8816aad3fda0829e6b0c9c167087067a7ec3a890bec8ad58","other":"8115abcf39747a7af3eece55f12cc9e4909a76e41853b2e126522150dbda9507","up":true},{"one":"f3ed1ac2fa19ae12beaabe227ec033f495300f0830a84014c839ff2e676c98d3","other":"8ee387438bab716f3b6d20f4c5a117bceaec603cfa6b1bd60b1d0b84b11ab430","up":true},{"one":"4730360679acf630fc8aba14c7be3bbc13953cb1ea8d7a72f5a3b5764170ef76","other":"6e3156d5037fafd4e4d6ffbfb50fd957bb34a81cdad24c65b97159f6fbca82da","up":true},{"one":"541f15bbe58d9e1b2bd3d1582c5cfa62fdbcd4363bcf451964f8c6d74f179a34","other":"6e3156d5037fafd4e4d6ffbfb50fd957bb34a81cdad24c65b97159f6fbca82da","up":true},{"one":"3a4298be13c39ddee046f4237863528c05ac1e3a6c9c2cc429636865d8ee4a15","other":"051872c926211797f625a675b50c934ab5f29cbb7d140b6c89dec4b924a0ff41","up":true},{"one":"39fea76e2e430919cadb48ce290c11ad66b2f8a66886ae08b59e418fa4eade8b","other":"0d53919c3d5b0afdc3b738d82cb213f91e05ec3b0f42a3aa46e7a5044f8c4684","up":true},{"one":"7df3074f4e1175a213e578939abd9c1e5ff71543eb5dc24ee5ded5f804e3b842","other":"0d53919c3d5b0afdc3b738d82cb213f91e05ec3b0f42a3aa46e7a5044f8c4684","up":true},{"one":"09937e27c0e52501dab72157877f99482a2b72da8a3690e55c517c0fc3f3bffc","other":"6e3156d5037fafd4e4d6ffbfb50fd957bb34a81cdad24c65b97159f6fbca82da","up":true},{"one":"78b6a2fb3428954855fbdbf99938e1214b8f19fa334144984289d1fb03bb4f7c","other":"a263a5769cf3f226db7d2cd91aee96a206c46b0ce2a8078a6d3841dc3f4c5c66","up":true},{"one":"8115abcf39747a7af3eece55f12cc9e4909a76e41853b2e126522150dbda9507","other":"ceeb822ae31349abaddb5430e80433f4533e942960a2f51cc846df95daa5a8f8","up":true},{"one":"e17a8623af7b2fe2287b92e0b3d917ba44d8f29730197bae2aae20503568ab3a","other":"df926a66c26fd9f0314c8fa294d79a88f912ec38c45a4f0267f64beeacaa1bc5","up":true},{"one":"bfeb6c69fed16d29ba20d11cd8b2389de22765b6209bbb8f1994014a20a204e6","other":"97b703afe00489321ce9805704e8c509671ab0e946d339595a3220dbcfba17d7","up":true},{"one":"24cb391b1984a5380af82f2fa622f1a02eb035ecb3401d538e41824965ddcc56","other":"051872c926211797f625a675b50c934ab5f29cbb7d140b6c89dec4b924a0ff41","up":true},{"one":"a263a5769cf3f226db7d2cd91aee96a206c46b0ce2a8078a6d3841dc3f4c5c66","other":"e17a8623af7b2fe2287b92e0b3d917ba44d8f29730197bae2aae20503568ab3a","up":true},{"one":"d7351e47f0c746ed33c652b0f2aa2fed354c8dad8d87525a4b511581aff6c6fa","other":"a263a5769cf3f226db7d2cd91aee96a206c46b0ce2a8078a6d3841dc3f4c5c66","up":true},{"one":"6e3156d5037fafd4e4d6ffbfb50fd957bb34a81cdad24c65b97159f6fbca82da","other":"5743bc09e713e7c4d58fef1951ab6b627a27e6f1a3c42db88827a1613bd7ef3f","up":true},{"one":"7fb955ee345c87e9d8e3c989bc0bccb15e448f0d99a88d33fb7be67092fb6f14","other":"24cb391b1984a5380af82f2fa622f1a02eb035ecb3401d538e41824965ddcc56","up":true},{"one":"97b703afe00489321ce9805704e8c509671ab0e946d339595a3220dbcfba17d7","other":"a263a5769cf3f226db7d2cd91aee96a206c46b0ce2a8078a6d3841dc3f4c5c66","up":true},{"one":"a3d987795e19f8518e4770f72c9f80804b999a31bf22d09cfeb04d644b429bf9","other":"e25a611f7a069314050e8ffca0eb383f72a0505c5942fd9f21c0d8ac4fc2255d","up":true},{"one":"8ee387438bab716f3b6d20f4c5a117bceaec603cfa6b1bd60b1d0b84b11ab430","other":"ceeb822ae31349abaddb5430e80433f4533e942960a2f51cc846df95daa5a8f8","up":true},{"one":"051872c926211797f625a675b50c934ab5f29cbb7d140b6c89dec4b924a0ff41","other":"df926a66c26fd9f0314c8fa294d79a88f912ec38c45a4f0267f64beeacaa1bc5","up":true},{"one":"e25a611f7a069314050e8ffca0eb383f72a0505c5942fd9f21c0d8ac4fc2255d","other":"df926a66c26fd9f0314c8fa294d79a88f912ec38c45a4f0267f64beeacaa1bc5","up":true},{"one":"df926a66c26fd9f0314c8fa294d79a88f912ec38c45a4f0267f64beeacaa1bc5","other":"bfeb6c69fed16d29ba20d11cd8b2389de22765b6209bbb8f1994014a20a204e6","up":true},{"one":"9b335aeb69b7fbd396ace5182d3fe7930e5d9786531593310b48a857c2bb769e","other":"ceeb822ae31349abaddb5430e80433f4533e942960a2f51cc846df95daa5a8f8","up":true},{"one":"4464d33aaaf606f00c232547c64d4d0c3d0bc10080c9d2ceef78f0c9a5198e62","other":"9b335aeb69b7fbd396ace5182d3fe7930e5d9786531593310b48a857c2bb769e","up":true},{"one":"0d53919c3d5b0afdc3b738d82cb213f91e05ec3b0f42a3aa46e7a5044f8c4684","other":"6e3156d5037fafd4e4d6ffbfb50fd957bb34a81cdad24c65b97159f6fbca82da","up":true},{"one":"579da170901ed911be3445d4422664a997eb14201589d702e0688f6146872993","other":"051872c926211797f625a675b50c934ab5f29cbb7d140b6c89dec4b924a0ff41","up":true},{"one":"6a64d765e40fde1190ff228bb86096b84182d719e6d1b713726db9aaeea437da","other":"4730360679acf630fc8aba14c7be3bbc13953cb1ea8d7a72f5a3b5764170ef76","up":true},{"one":"5743bc09e713e7c4d58fef1951ab6b627a27e6f1a3c42db88827a1613bd7ef3f","other":"a263a5769cf3f226db7d2cd91aee96a206c46b0ce2a8078a6d3841dc3f4c5c66","up":true},{"one":"78c70d33dfd131bcc1c64267bf71e6fe81e93f891b940a1114c657c826675bd7","other":"0d53919c3d5b0afdc3b738d82cb213f91e05ec3b0f42a3aa46e7a5044f8c4684","up":true},{"one":"ceeb822ae31349abaddb5430e80433f4533e942960a2f51cc846df95daa5a8f8","other":"bfeb6c69fed16d29ba20d11cd8b2389de22765b6209bbb8f1994014a20a204e6","up":true},{"one":"753a8367fcdaf8caf1fe6ca25ed97b23f99828115a38d61352488bc3d02a3e17","other":"3a4298be13c39ddee046f4237863528c05ac1e3a6c9c2cc429636865d8ee4a15","up":true},{"one":"4730360679acf630fc8aba14c7be3bbc13953cb1ea8d7a72f5a3b5764170ef76","other":"5743bc09e713e7c4d58fef1951ab6b627a27e6f1a3c42db88827a1613bd7ef3f","up":true},{"one":"2345add1ed7d98db8816aad3fda0829e6b0c9c167087067a7ec3a890bec8ad58","other":"39fea76e2e430919cadb48ce290c11ad66b2f8a66886ae08b59e418fa4eade8b","up":true},{"one":"541f15bbe58d9e1b2bd3d1582c5cfa62fdbcd4363bcf451964f8c6d74f179a34","other":"4464d33aaaf606f00c232547c64d4d0c3d0bc10080c9d2ceef78f0c9a5198e62","up":true},{"one":"f3ed1ac2fa19ae12beaabe227ec033f495300f0830a84014c839ff2e676c98d3","other":"ceeb822ae31349abaddb5430e80433f4533e942960a2f51cc846df95daa5a8f8","up":true},{"one":"78b6a2fb3428954855fbdbf99938e1214b8f19fa334144984289d1fb03bb4f7c","other":"6e3156d5037fafd4e4d6ffbfb50fd957bb34a81cdad24c65b97159f6fbca82da","up":true},{"one":"3a4298be13c39ddee046f4237863528c05ac1e3a6c9c2cc429636865d8ee4a15","other":"2345add1ed7d98db8816aad3fda0829e6b0c9c167087067a7ec3a890bec8ad58","up":true},{"one":"a263a5769cf3f226db7d2cd91aee96a206c46b0ce2a8078a6d3841dc3f4c5c66","other":"bfeb6c69fed16d29ba20d11cd8b2389de22765b6209bbb8f1994014a20a204e6","up":true},{"one":"9b335aeb69b7fbd396ace5182d3fe7930e5d9786531593310b48a857c2bb769e","other":"a3d987795e19f8518e4770f72c9f80804b999a31bf22d09cfeb04d644b429bf9","up":true},{"one":"5743bc09e713e7c4d58fef1951ab6b627a27e6f1a3c42db88827a1613bd7ef3f","other":"051872c926211797f625a675b50c934ab5f29cbb7d140b6c89dec4b924a0ff41","up":true},{"one":"7df3074f4e1175a213e578939abd9c1e5ff71543eb5dc24ee5ded5f804e3b842","other":"4464d33aaaf606f00c232547c64d4d0c3d0bc10080c9d2ceef78f0c9a5198e62","up":true},{"one":"39fea76e2e430919cadb48ce290c11ad66b2f8a66886ae08b59e418fa4eade8b","other":"24cb391b1984a5380af82f2fa622f1a02eb035ecb3401d538e41824965ddcc56","up":true},{"one":"753a8367fcdaf8caf1fe6ca25ed97b23f99828115a38d61352488bc3d02a3e17","other":"6a64d765e40fde1190ff228bb86096b84182d719e6d1b713726db9aaeea437da","up":true},{"one":"4464d33aaaf606f00c232547c64d4d0c3d0bc10080c9d2ceef78f0c9a5198e62","other":"4730360679acf630fc8aba14c7be3bbc13953cb1ea8d7a72f5a3b5764170ef76","up":true},{"one":"e25a611f7a069314050e8ffca0eb383f72a0505c5942fd9f21c0d8ac4fc2255d","other":"f3ed1ac2fa19ae12beaabe227ec033f495300f0830a84014c839ff2e676c98d3","up":true},{"one":"d7351e47f0c746ed33c652b0f2aa2fed354c8dad8d87525a4b511581aff6c6fa","other":"f3ed1ac2fa19ae12beaabe227ec033f495300f0830a84014c839ff2e676c98d3","up":true},{"one":"df926a66c26fd9f0314c8fa294d79a88f912ec38c45a4f0267f64beeacaa1bc5","other":"d7351e47f0c746ed33c652b0f2aa2fed354c8dad8d87525a4b511581aff6c6fa","up":true},{"one":"7fb955ee345c87e9d8e3c989bc0bccb15e448f0d99a88d33fb7be67092fb6f14","other":"541f15bbe58d9e1b2bd3d1582c5cfa62fdbcd4363bcf451964f8c6d74f179a34","up":true},{"one":"051872c926211797f625a675b50c934ab5f29cbb7d140b6c89dec4b924a0ff41","other":"0d53919c3d5b0afdc3b738d82cb213f91e05ec3b0f42a3aa46e7a5044f8c4684","up":true},{"one":"579da170901ed911be3445d4422664a997eb14201589d702e0688f6146872993","other":"6e3156d5037fafd4e4d6ffbfb50fd957bb34a81cdad24c65b97159f6fbca82da","up":true},{"one":"8ee387438bab716f3b6d20f4c5a117bceaec603cfa6b1bd60b1d0b84b11ab430","other":"a3d987795e19f8518e4770f72c9f80804b999a31bf22d09cfeb04d644b429bf9","up":true},{"one":"78c70d33dfd131bcc1c64267bf71e6fe81e93f891b940a1114c657c826675bd7","other":"4464d33aaaf606f00c232547c64d4d0c3d0bc10080c9d2ceef78f0c9a5198e62","up":true},{"one":"09937e27c0e52501dab72157877f99482a2b72da8a3690e55c517c0fc3f3bffc","other":"051872c926211797f625a675b50c934ab5f29cbb7d140b6c89dec4b924a0ff41","up":true},{"one":"8115abcf39747a7af3eece55f12cc9e4909a76e41853b2e126522150dbda9507","other":"a3d987795e19f8518e4770f72c9f80804b999a31bf22d09cfeb04d644b429bf9","up":true},{"one":"97b703afe00489321ce9805704e8c509671ab0e946d339595a3220dbcfba17d7","other":"8115abcf39747a7af3eece55f12cc9e4909a76e41853b2e126522150dbda9507","up":true},{"one":"7fb955ee345c87e9d8e3c989bc0bccb15e448f0d99a88d33fb7be67092fb6f14","other":"6e3156d5037fafd4e4d6ffbfb50fd957bb34a81cdad24c65b97159f6fbca82da","up":true},{"one":"bfeb6c69fed16d29ba20d11cd8b2389de22765b6209bbb8f1994014a20a204e6","other":"a3d987795e19f8518e4770f72c9f80804b999a31bf22d09cfeb04d644b429bf9","up":true},{"one":"e17a8623af7b2fe2287b92e0b3d917ba44d8f29730197bae2aae20503568ab3a","other":"f3ed1ac2fa19ae12beaabe227ec033f495300f0830a84014c839ff2e676c98d3","up":true},{"one":"2345add1ed7d98db8816aad3fda0829e6b0c9c167087067a7ec3a890bec8ad58","other":"24cb391b1984a5380af82f2fa622f1a02eb035ecb3401d538e41824965ddcc56","up":true},{"one":"f3ed1ac2fa19ae12beaabe227ec033f495300f0830a84014c839ff2e676c98d3","other":"8115abcf39747a7af3eece55f12cc9e4909a76e41853b2e126522150dbda9507","up":true},{"one":"4730360679acf630fc8aba14c7be3bbc13953cb1ea8d7a72f5a3b5764170ef76","other":"8115abcf39747a7af3eece55f12cc9e4909a76e41853b2e126522150dbda9507","up":true},{"one":"a263a5769cf3f226db7d2cd91aee96a206c46b0ce2a8078a6d3841dc3f4c5c66","other":"a3d987795e19f8518e4770f72c9f80804b999a31bf22d09cfeb04d644b429bf9","up":true},{"one":"7df3074f4e1175a213e578939abd9c1e5ff71543eb5dc24ee5ded5f804e3b842","other":"6e3156d5037fafd4e4d6ffbfb50fd957bb34a81cdad24c65b97159f6fbca82da","up":true},{"one":"541f15bbe58d9e1b2bd3d1582c5cfa62fdbcd4363bcf451964f8c6d74f179a34","other":"5743bc09e713e7c4d58fef1951ab6b627a27e6f1a3c42db88827a1613bd7ef3f","up":true},{"one":"df926a66c26fd9f0314c8fa294d79a88f912ec38c45a4f0267f64beeacaa1bc5","other":"a3d987795e19f8518e4770f72c9f80804b999a31bf22d09cfeb04d644b429bf9","up":true},{"one":"3a4298be13c39ddee046f4237863528c05ac1e3a6c9c2cc429636865d8ee4a15","other":"39fea76e2e430919cadb48ce290c11ad66b2f8a66886ae08b59e418fa4eade8b","up":true},{"one":"0d53919c3d5b0afdc3b738d82cb213f91e05ec3b0f42a3aa46e7a5044f8c4684","other":"09937e27c0e52501dab72157877f99482a2b72da8a3690e55c517c0fc3f3bffc","up":true},{"one":"579da170901ed911be3445d4422664a997eb14201589d702e0688f6146872993","other":"4464d33aaaf606f00c232547c64d4d0c3d0bc10080c9d2ceef78f0c9a5198e62","up":true},{"one":"d7351e47f0c746ed33c652b0f2aa2fed354c8dad8d87525a4b511581aff6c6fa","other":"ceeb822ae31349abaddb5430e80433f4533e942960a2f51cc846df95daa5a8f8","up":true},{"one":"6e3156d5037fafd4e4d6ffbfb50fd957bb34a81cdad24c65b97159f6fbca82da","other":"78c70d33dfd131bcc1c64267bf71e6fe81e93f891b940a1114c657c826675bd7","up":true},{"one":"78b6a2fb3428954855fbdbf99938e1214b8f19fa334144984289d1fb03bb4f7c","other":"753a8367fcdaf8caf1fe6ca25ed97b23f99828115a38d61352488bc3d02a3e17","up":true},{"one":"7fb955ee345c87e9d8e3c989bc0bccb15e448f0d99a88d33fb7be67092fb6f14","other":"753a8367fcdaf8caf1fe6ca25ed97b23f99828115a38d61352488bc3d02a3e17","up":true},{"one":"9b335aeb69b7fbd396ace5182d3fe7930e5d9786531593310b48a857c2bb769e","other":"97b703afe00489321ce9805704e8c509671ab0e946d339595a3220dbcfba17d7","up":true},{"one":"e25a611f7a069314050e8ffca0eb383f72a0505c5942fd9f21c0d8ac4fc2255d","other":"e17a8623af7b2fe2287b92e0b3d917ba44d8f29730197bae2aae20503568ab3a","up":true},{"one":"8115abcf39747a7af3eece55f12cc9e4909a76e41853b2e126522150dbda9507","other":"0d53919c3d5b0afdc3b738d82cb213f91e05ec3b0f42a3aa46e7a5044f8c4684","up":true},{"one":"bfeb6c69fed16d29ba20d11cd8b2389de22765b6209bbb8f1994014a20a204e6","other":"24cb391b1984a5380af82f2fa622f1a02eb035ecb3401d538e41824965ddcc56","up":true},{"one":"8ee387438bab716f3b6d20f4c5a117bceaec603cfa6b1bd60b1d0b84b11ab430","other":"97b703afe00489321ce9805704e8c509671ab0e946d339595a3220dbcfba17d7","up":true},{"one":"6a64d765e40fde1190ff228bb86096b84182d719e6d1b713726db9aaeea437da","other":"7fb955ee345c87e9d8e3c989bc0bccb15e448f0d99a88d33fb7be67092fb6f14","up":true},{"one":"4464d33aaaf606f00c232547c64d4d0c3d0bc10080c9d2ceef78f0c9a5198e62","other":"97b703afe00489321ce9805704e8c509671ab0e946d339595a3220dbcfba17d7","up":true},{"one":"753a8367fcdaf8caf1fe6ca25ed97b23f99828115a38d61352488bc3d02a3e17","other":"6e3156d5037fafd4e4d6ffbfb50fd957bb34a81cdad24c65b97159f6fbca82da","up":true},{"one":"051872c926211797f625a675b50c934ab5f29cbb7d140b6c89dec4b924a0ff41","other":"d7351e47f0c746ed33c652b0f2aa2fed354c8dad8d87525a4b511581aff6c6fa","up":true},{"one":"6e3156d5037fafd4e4d6ffbfb50fd957bb34a81cdad24c65b97159f6fbca82da","other":"6a64d765e40fde1190ff228bb86096b84182d719e6d1b713726db9aaeea437da","up":true},{"one":"ceeb822ae31349abaddb5430e80433f4533e942960a2f51cc846df95daa5a8f8","other":"6e3156d5037fafd4e4d6ffbfb50fd957bb34a81cdad24c65b97159f6fbca82da","up":true},{"one":"541f15bbe58d9e1b2bd3d1582c5cfa62fdbcd4363bcf451964f8c6d74f179a34","other":"579da170901ed911be3445d4422664a997eb14201589d702e0688f6146872993","up":true},{"one":"4730360679acf630fc8aba14c7be3bbc13953cb1ea8d7a72f5a3b5764170ef76","other":"051872c926211797f625a675b50c934ab5f29cbb7d140b6c89dec4b924a0ff41","up":true},{"one":"24cb391b1984a5380af82f2fa622f1a02eb035ecb3401d538e41824965ddcc56","other":"0d53919c3d5b0afdc3b738d82cb213f91e05ec3b0f42a3aa46e7a5044f8c4684","up":true},{"one":"2345add1ed7d98db8816aad3fda0829e6b0c9c167087067a7ec3a890bec8ad58","other":"8ee387438bab716f3b6d20f4c5a117bceaec603cfa6b1bd60b1d0b84b11ab430","up":true},{"one":"3a4298be13c39ddee046f4237863528c05ac1e3a6c9c2cc429636865d8ee4a15","other":"f3ed1ac2fa19ae12beaabe227ec033f495300f0830a84014c839ff2e676c98d3","up":true},{"one":"7df3074f4e1175a213e578939abd9c1e5ff71543eb5dc24ee5ded5f804e3b842","other":"753a8367fcdaf8caf1fe6ca25ed97b23f99828115a38d61352488bc3d02a3e17","up":true},{"one":"5743bc09e713e7c4d58fef1951ab6b627a27e6f1a3c42db88827a1613bd7ef3f","other":"a3d987795e19f8518e4770f72c9f80804b999a31bf22d09cfeb04d644b429bf9","up":true},{"one":"d7351e47f0c746ed33c652b0f2aa2fed354c8dad8d87525a4b511581aff6c6fa","other":"a3d987795e19f8518e4770f72c9f80804b999a31bf22d09cfeb04d644b429bf9","up":true},{"one":"4464d33aaaf606f00c232547c64d4d0c3d0bc10080c9d2ceef78f0c9a5198e62","other":"3a4298be13c39ddee046f4237863528c05ac1e3a6c9c2cc429636865d8ee4a15","up":true},{"one":"a263a5769cf3f226db7d2cd91aee96a206c46b0ce2a8078a6d3841dc3f4c5c66","other":"8ee387438bab716f3b6d20f4c5a117bceaec603cfa6b1bd60b1d0b84b11ab430","up":true},{"one":"24cb391b1984a5380af82f2fa622f1a02eb035ecb3401d538e41824965ddcc56","other":"8ee387438bab716f3b6d20f4c5a117bceaec603cfa6b1bd60b1d0b84b11ab430","up":true},{"one":"e17a8623af7b2fe2287b92e0b3d917ba44d8f29730197bae2aae20503568ab3a","other":"24cb391b1984a5380af82f2fa622f1a02eb035ecb3401d538e41824965ddcc56","up":true},{"one":"78c70d33dfd131bcc1c64267bf71e6fe81e93f891b940a1114c657c826675bd7","other":"753a8367fcdaf8caf1fe6ca25ed97b23f99828115a38d61352488bc3d02a3e17","up":true},{"one":"09937e27c0e52501dab72157877f99482a2b72da8a3690e55c517c0fc3f3bffc","other":"bfeb6c69fed16d29ba20d11cd8b2389de22765b6209bbb8f1994014a20a204e6","up":true},{"one":"39fea76e2e430919cadb48ce290c11ad66b2f8a66886ae08b59e418fa4eade8b","other":"f3ed1ac2fa19ae12beaabe227ec033f495300f0830a84014c839ff2e676c98d3","up":true},{"one":"bfeb6c69fed16d29ba20d11cd8b2389de22765b6209bbb8f1994014a20a204e6","other":"9b335aeb69b7fbd396ace5182d3fe7930e5d9786531593310b48a857c2bb769e","up":true},{"one":"9b335aeb69b7fbd396ace5182d3fe7930e5d9786531593310b48a857c2bb769e","other":"df926a66c26fd9f0314c8fa294d79a88f912ec38c45a4f0267f64beeacaa1bc5","up":true},{"one":"7fb955ee345c87e9d8e3c989bc0bccb15e448f0d99a88d33fb7be67092fb6f14","other":"78b6a2fb3428954855fbdbf99938e1214b8f19fa334144984289d1fb03bb4f7c","up":true},{"one":"051872c926211797f625a675b50c934ab5f29cbb7d140b6c89dec4b924a0ff41","other":"39fea76e2e430919cadb48ce290c11ad66b2f8a66886ae08b59e418fa4eade8b","up":true},{"one":"8115abcf39747a7af3eece55f12cc9e4909a76e41853b2e126522150dbda9507","other":"a263a5769cf3f226db7d2cd91aee96a206c46b0ce2a8078a6d3841dc3f4c5c66","up":true},{"one":"e25a611f7a069314050e8ffca0eb383f72a0505c5942fd9f21c0d8ac4fc2255d","other":"39fea76e2e430919cadb48ce290c11ad66b2f8a66886ae08b59e418fa4eade8b","up":true},{"one":"6a64d765e40fde1190ff228bb86096b84182d719e6d1b713726db9aaeea437da","other":"ceeb822ae31349abaddb5430e80433f4533e942960a2f51cc846df95daa5a8f8","up":true},{"one":"0d53919c3d5b0afdc3b738d82cb213f91e05ec3b0f42a3aa46e7a5044f8c4684","other":"6a64d765e40fde1190ff228bb86096b84182d719e6d1b713726db9aaeea437da","up":true},{"one":"753a8367fcdaf8caf1fe6ca25ed97b23f99828115a38d61352488bc3d02a3e17","other":"a3d987795e19f8518e4770f72c9f80804b999a31bf22d09cfeb04d644b429bf9","up":true},{"one":"e17a8623af7b2fe2287b92e0b3d917ba44d8f29730197bae2aae20503568ab3a","other":"ceeb822ae31349abaddb5430e80433f4533e942960a2f51cc846df95daa5a8f8","up":true},{"one":"97b703afe00489321ce9805704e8c509671ab0e946d339595a3220dbcfba17d7","other":"f3ed1ac2fa19ae12beaabe227ec033f495300f0830a84014c839ff2e676c98d3","up":true},{"one":"6e3156d5037fafd4e4d6ffbfb50fd957bb34a81cdad24c65b97159f6fbca82da","other":"2345add1ed7d98db8816aad3fda0829e6b0c9c167087067a7ec3a890bec8ad58","up":true},{"one":"579da170901ed911be3445d4422664a997eb14201589d702e0688f6146872993","other":"4730360679acf630fc8aba14c7be3bbc13953cb1ea8d7a72f5a3b5764170ef76","up":true},{"one":"579da170901ed911be3445d4422664a997eb14201589d702e0688f6146872993","other":"a3d987795e19f8518e4770f72c9f80804b999a31bf22d09cfeb04d644b429bf9","up":true},{"one":"d7351e47f0c746ed33c652b0f2aa2fed354c8dad8d87525a4b511581aff6c6fa","other":"e25a611f7a069314050e8ffca0eb383f72a0505c5942fd9f21c0d8ac4fc2255d","up":true},{"one":"78c70d33dfd131bcc1c64267bf71e6fe81e93f891b940a1114c657c826675bd7","other":"78b6a2fb3428954855fbdbf99938e1214b8f19fa334144984289d1fb03bb4f7c","up":true},{"one":"78b6a2fb3428954855fbdbf99938e1214b8f19fa334144984289d1fb03bb4f7c","other":"7df3074f4e1175a213e578939abd9c1e5ff71543eb5dc24ee5ded5f804e3b842","up":true},{"one":"24cb391b1984a5380af82f2fa622f1a02eb035ecb3401d538e41824965ddcc56","other":"3a4298be13c39ddee046f4237863528c05ac1e3a6c9c2cc429636865d8ee4a15","up":true},{"one":"6a64d765e40fde1190ff228bb86096b84182d719e6d1b713726db9aaeea437da","other":"4464d33aaaf606f00c232547c64d4d0c3d0bc10080c9d2ceef78f0c9a5198e62","up":true},{"one":"3a4298be13c39ddee046f4237863528c05ac1e3a6c9c2cc429636865d8ee4a15","other":"0d53919c3d5b0afdc3b738d82cb213f91e05ec3b0f42a3aa46e7a5044f8c4684","up":true},{"one":"5743bc09e713e7c4d58fef1951ab6b627a27e6f1a3c42db88827a1613bd7ef3f","other":"0d53919c3d5b0afdc3b738d82cb213f91e05ec3b0f42a3aa46e7a5044f8c4684","up":true},{"one":"541f15bbe58d9e1b2bd3d1582c5cfa62fdbcd4363bcf451964f8c6d74f179a34","other":"8ee387438bab716f3b6d20f4c5a117bceaec603cfa6b1bd60b1d0b84b11ab430","up":true},{"one":"39fea76e2e430919cadb48ce290c11ad66b2f8a66886ae08b59e418fa4eade8b","other":"4730360679acf630fc8aba14c7be3bbc13953cb1ea8d7a72f5a3b5764170ef76","up":true},{"one":"9b335aeb69b7fbd396ace5182d3fe7930e5d9786531593310b48a857c2bb769e","other":"8ee387438bab716f3b6d20f4c5a117bceaec603cfa6b1bd60b1d0b84b11ab430","up":true},{"one":"7df3074f4e1175a213e578939abd9c1e5ff71543eb5dc24ee5ded5f804e3b842","other":"7fb955ee345c87e9d8e3c989bc0bccb15e448f0d99a88d33fb7be67092fb6f14","up":true},{"one":"7fb955ee345c87e9d8e3c989bc0bccb15e448f0d99a88d33fb7be67092fb6f14","other":"78c70d33dfd131bcc1c64267bf71e6fe81e93f891b940a1114c657c826675bd7","up":true},{"one":"4464d33aaaf606f00c232547c64d4d0c3d0bc10080c9d2ceef78f0c9a5198e62","other":"5743bc09e713e7c4d58fef1951ab6b627a27e6f1a3c42db88827a1613bd7ef3f","up":true},{"one":"051872c926211797f625a675b50c934ab5f29cbb7d140b6c89dec4b924a0ff41","other":"2345add1ed7d98db8816aad3fda0829e6b0c9c167087067a7ec3a890bec8ad58","up":true},{"one":"6a64d765e40fde1190ff228bb86096b84182d719e6d1b713726db9aaeea437da","other":"09937e27c0e52501dab72157877f99482a2b72da8a3690e55c517c0fc3f3bffc","up":true},{"one":"753a8367fcdaf8caf1fe6ca25ed97b23f99828115a38d61352488bc3d02a3e17","other":"39fea76e2e430919cadb48ce290c11ad66b2f8a66886ae08b59e418fa4eade8b","up":true},{"one":"4730360679acf630fc8aba14c7be3bbc13953cb1ea8d7a72f5a3b5764170ef76","other":"541f15bbe58d9e1b2bd3d1582c5cfa62fdbcd4363bcf451964f8c6d74f179a34","up":true},{"one":"541f15bbe58d9e1b2bd3d1582c5cfa62fdbcd4363bcf451964f8c6d74f179a34","other":"051872c926211797f625a675b50c934ab5f29cbb7d140b6c89dec4b924a0ff41","up":true},{"one":"a3d987795e19f8518e4770f72c9f80804b999a31bf22d09cfeb04d644b429bf9","other":"78b6a2fb3428954855fbdbf99938e1214b8f19fa334144984289d1fb03bb4f7c","up":true},{"one":"7df3074f4e1175a213e578939abd9c1e5ff71543eb5dc24ee5ded5f804e3b842","other":"a3d987795e19f8518e4770f72c9f80804b999a31bf22d09cfeb04d644b429bf9","up":true},{"one":"f3ed1ac2fa19ae12beaabe227ec033f495300f0830a84014c839ff2e676c98d3","other":"78c70d33dfd131bcc1c64267bf71e6fe81e93f891b940a1114c657c826675bd7","up":true},{"one":"579da170901ed911be3445d4422664a997eb14201589d702e0688f6146872993","other":"0d53919c3d5b0afdc3b738d82cb213f91e05ec3b0f42a3aa46e7a5044f8c4684","up":true},{"one":"6a64d765e40fde1190ff228bb86096b84182d719e6d1b713726db9aaeea437da","other":"7df3074f4e1175a213e578939abd9c1e5ff71543eb5dc24ee5ded5f804e3b842","up":true},{"one":"753a8367fcdaf8caf1fe6ca25ed97b23f99828115a38d61352488bc3d02a3e17","other":"5743bc09e713e7c4d58fef1951ab6b627a27e6f1a3c42db88827a1613bd7ef3f","up":true},{"one":"7fb955ee345c87e9d8e3c989bc0bccb15e448f0d99a88d33fb7be67092fb6f14","other":"2345add1ed7d98db8816aad3fda0829e6b0c9c167087067a7ec3a890bec8ad58","up":true},{"one":"09937e27c0e52501dab72157877f99482a2b72da8a3690e55c517c0fc3f3bffc","other":"39fea76e2e430919cadb48ce290c11ad66b2f8a66886ae08b59e418fa4eade8b","up":true},{"one":"0d53919c3d5b0afdc3b738d82cb213f91e05ec3b0f42a3aa46e7a5044f8c4684","other":"2345add1ed7d98db8816aad3fda0829e6b0c9c167087067a7ec3a890bec8ad58","up":true},{"one":"78b6a2fb3428954855fbdbf99938e1214b8f19fa334144984289d1fb03bb4f7c","other":"051872c926211797f625a675b50c934ab5f29cbb7d140b6c89dec4b924a0ff41","up":true},{"one":"579da170901ed911be3445d4422664a997eb14201589d702e0688f6146872993","other":"6a64d765e40fde1190ff228bb86096b84182d719e6d1b713726db9aaeea437da","up":true},{"one":"7df3074f4e1175a213e578939abd9c1e5ff71543eb5dc24ee5ded5f804e3b842","other":"09937e27c0e52501dab72157877f99482a2b72da8a3690e55c517c0fc3f3bffc","up":true},{"one":"09937e27c0e52501dab72157877f99482a2b72da8a3690e55c517c0fc3f3bffc","other":"78c70d33dfd131bcc1c64267bf71e6fe81e93f891b940a1114c657c826675bd7","up":true},{"one":"6a64d765e40fde1190ff228bb86096b84182d719e6d1b713726db9aaeea437da","other":"78b6a2fb3428954855fbdbf99938e1214b8f19fa334144984289d1fb03bb4f7c","up":true},{"one":"7fb955ee345c87e9d8e3c989bc0bccb15e448f0d99a88d33fb7be67092fb6f14","other":"5743bc09e713e7c4d58fef1951ab6b627a27e6f1a3c42db88827a1613bd7ef3f","up":true},{"one":"09937e27c0e52501dab72157877f99482a2b72da8a3690e55c517c0fc3f3bffc","other":"3a4298be13c39ddee046f4237863528c05ac1e3a6c9c2cc429636865d8ee4a15","up":true},{"one":"7df3074f4e1175a213e578939abd9c1e5ff71543eb5dc24ee5ded5f804e3b842","other":"4730360679acf630fc8aba14c7be3bbc13953cb1ea8d7a72f5a3b5764170ef76","up":true},{"one":"78c70d33dfd131bcc1c64267bf71e6fe81e93f891b940a1114c657c826675bd7","other":"4730360679acf630fc8aba14c7be3bbc13953cb1ea8d7a72f5a3b5764170ef76","up":true},{"one":"4464d33aaaf606f00c232547c64d4d0c3d0bc10080c9d2ceef78f0c9a5198e62","other":"78b6a2fb3428954855fbdbf99938e1214b8f19fa334144984289d1fb03bb4f7c","up":true},{"one":"6a64d765e40fde1190ff228bb86096b84182d719e6d1b713726db9aaeea437da","other":"78c70d33dfd131bcc1c64267bf71e6fe81e93f891b940a1114c657c826675bd7","up":true},{"one":"24cb391b1984a5380af82f2fa622f1a02eb035ecb3401d538e41824965ddcc56","other":"09937e27c0e52501dab72157877f99482a2b72da8a3690e55c517c0fc3f3bffc","up":true}]} \ No newline at end of file diff --git a/vendor/github.com/ethereum/go-ethereum/swarm/pss/testdata/snapshot_4.json b/vendor/github.com/ethereum/go-ethereum/swarm/pss/testdata/snapshot_4.json deleted file mode 100644 index 9296cad0..00000000 --- a/vendor/github.com/ethereum/go-ethereum/swarm/pss/testdata/snapshot_4.json +++ /dev/null @@ -1 +0,0 @@ -{"nodes":[{"node":{"info":{"id":"39637d86e6be6b1bcc342738a84a36f7c6202ca6e1da379524f5c8d9018ae993","name":"node_39637d86e6be6b1bcc342738a84a36f7c6202ca6e1da379524f5c8d9018ae993","enode":"enode://1adbc1635af8ae835d3041edc8a5c633f40a009111b6a74e0cce501181b7ea3b1f26b193294721540ec8970183ff74a9121899af5bc9425f2bd3506e4a164cd5@127.0.0.1:0","enr":"0xf88fb840dc163ce6d8e977e2d01bde715e6b77a6ae29ee68c87cd245047d2f0afc728e847b4674905af3780f2ef7e65dfdcebd5d5a59aa7ba20985ba5edc2edbacc2aa430183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1031adbc1635af8ae835d3041edc8a5c633f40a009111b6a74e0cce501181b7ea3b","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"OWN9hua+axvMNCc4qEo298YgLKbh2jeVJPXI2QGK6ZM=","hive":"\n=========================================================================\nThu Feb 28 17:15:36 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 39637d\npopulation: 3 (3), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n============ DEPTH: 0 ==========================================\n000 2 d9b8 f9ee | 2 d9b8 (0) f9ee (0)\n001 0 | 0\n002 0 | 0\n003 0 | 0\n004 0 | 0\n005 1 3eea | 1 3eea (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"39637d86e6be6b1bcc342738a84a36f7c6202ca6e1da379524f5c8d9018ae993","private_key":"777c522fea2223bf13c53cc946d4761b29a5f071939160197b8305faff375f5b","name":"node_39637d86e6be6b1bcc342738a84a36f7c6202ca6e1da379524f5c8d9018ae993","services":["bzz","pss"],"enable_msg_events":true,"port":45013},"up":true}},{"node":{"info":{"id":"f9ee770f6f9bddcb1ebe59afcc0068bb534864d66ce43d87fb255038c12a4fd5","name":"node_f9ee770f6f9bddcb1ebe59afcc0068bb534864d66ce43d87fb255038c12a4fd5","enode":"enode://81d15729673f044e747a296362aceca03a5cec3dbab718bdced562ed52ca46cadcd387403307d69e55793b1bcfd275428d5235492acc0b03d44fc7c320dbb8b8@127.0.0.1:0","enr":"0xf88fb840bcc07b798defeb3fce1c5c15a3a5a1e2ed4f586606b450bf24d63fd0ac43447041869c05e4809d6d7ff1f293d020ef37cd0d9d5ddbbba85db19b26e78cd4276c0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10281d15729673f044e747a296362aceca03a5cec3dbab718bdced562ed52ca46ca","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"+e53D2+b3csevlmvzABou1NIZNZs5D2H+yVQOMEqT9U=","hive":"\n=========================================================================\nThu Feb 28 17:15:36 UTC 2019 KΛÐΞMLIΛ hive: queen's address: f9ee77\npopulation: 3 (3), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n============ DEPTH: 0 ==========================================\n000 2 3eea 3963 | 2 3eea (0) 3963 (0)\n001 0 | 0\n002 1 d9b8 | 1 d9b8 (0)\n003 0 | 0\n004 0 | 0\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"f9ee770f6f9bddcb1ebe59afcc0068bb534864d66ce43d87fb255038c12a4fd5","private_key":"33058348a654e1f7083b1e151159be731dce92dc63fd6a8218d05a0a79556264","name":"node_f9ee770f6f9bddcb1ebe59afcc0068bb534864d66ce43d87fb255038c12a4fd5","services":["bzz","pss"],"enable_msg_events":true,"port":42259},"up":true}},{"node":{"info":{"id":"d9b8edffa3383b6f8467b8a14321b244f2eb811ffefe8162705ee61dd8319eb8","name":"node_d9b8edffa3383b6f8467b8a14321b244f2eb811ffefe8162705ee61dd8319eb8","enode":"enode://45ce3a7edb53c1ba49af48932d23cc431c8093e16363be0c164d7a2d91a9b42292fcab0a19f44961c660670ab35585f06671af76660e1879bac551649eeaf383@127.0.0.1:0","enr":"0xf88fb840e84fc1155908a63c768932ac73515e5badc69a4c9870628174f0ada2b2c51b884cd5023d2c99f9ea91f859daec2b6f1861dfbed2a79d64e2ec7d0d5e10b96a670183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10345ce3a7edb53c1ba49af48932d23cc431c8093e16363be0c164d7a2d91a9b422","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"2bjt/6M4O2+EZ7ihQyGyRPLrgR/+/oFicF7mHdgxnrg=","hive":"\n=========================================================================\nThu Feb 28 17:15:36 UTC 2019 KΛÐΞMLIΛ hive: queen's address: d9b8ed\npopulation: 3 (3), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n============ DEPTH: 0 ==========================================\n000 2 3963 3eea | 2 3963 (0) 3eea (0)\n001 0 | 0\n002 1 f9ee | 1 f9ee (0)\n003 0 | 0\n004 0 | 0\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"d9b8edffa3383b6f8467b8a14321b244f2eb811ffefe8162705ee61dd8319eb8","private_key":"212d7f1311d01b67472c5f08b993f423ae2479ce51b31e223b2d2569b8fe9b2b","name":"node_d9b8edffa3383b6f8467b8a14321b244f2eb811ffefe8162705ee61dd8319eb8","services":["bzz","pss"],"enable_msg_events":true,"port":42359},"up":true}},{"node":{"info":{"id":"3eea0647bbb68e10c4ed7eca646b65088241144fea43f39a8c1b69f025e3a8a3","name":"node_3eea0647bbb68e10c4ed7eca646b65088241144fea43f39a8c1b69f025e3a8a3","enode":"enode://a858788ee0cfe3e41f87f7f08d6e1f4af3b46aac21c031eb764995c70c13e103dccb92a70cd85004343bd6b52cdfbd448c0692ffb332a328d0655d1e82c67044@127.0.0.1:0","enr":"0xf88fb840e7edbd4abbf61818777dd83a7a33d3ae7965c97845955e1fe850d5826159898f076a7b650aadee767bcf047dbdd7b64e362f458e2dfadc5bf61a70e3bc98e4400183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102a858788ee0cfe3e41f87f7f08d6e1f4af3b46aac21c031eb764995c70c13e103","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"PuoGR7u2jhDE7X7KZGtlCIJBFE/qQ/OajBtp8CXjqKM=","hive":"\n=========================================================================\nThu Feb 28 17:15:36 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 3eea06\npopulation: 3 (3), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n============ DEPTH: 0 ==========================================\n000 2 f9ee d9b8 | 2 f9ee (0) d9b8 (0)\n001 0 | 0\n002 0 | 0\n003 0 | 0\n004 0 | 0\n005 1 3963 | 1 3963 (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"3eea0647bbb68e10c4ed7eca646b65088241144fea43f39a8c1b69f025e3a8a3","private_key":"0e14c45740f36d25300cd008dd1e1c1f98d39c519a1fee65fb30e004f1a992df","name":"node_3eea0647bbb68e10c4ed7eca646b65088241144fea43f39a8c1b69f025e3a8a3","services":["bzz","pss"],"enable_msg_events":true,"port":42157},"up":true}}],"conns":[{"one":"39637d86e6be6b1bcc342738a84a36f7c6202ca6e1da379524f5c8d9018ae993","other":"f9ee770f6f9bddcb1ebe59afcc0068bb534864d66ce43d87fb255038c12a4fd5","up":true},{"one":"f9ee770f6f9bddcb1ebe59afcc0068bb534864d66ce43d87fb255038c12a4fd5","other":"d9b8edffa3383b6f8467b8a14321b244f2eb811ffefe8162705ee61dd8319eb8","up":true},{"one":"d9b8edffa3383b6f8467b8a14321b244f2eb811ffefe8162705ee61dd8319eb8","other":"3eea0647bbb68e10c4ed7eca646b65088241144fea43f39a8c1b69f025e3a8a3","up":true},{"one":"3eea0647bbb68e10c4ed7eca646b65088241144fea43f39a8c1b69f025e3a8a3","other":"39637d86e6be6b1bcc342738a84a36f7c6202ca6e1da379524f5c8d9018ae993","up":true},{"one":"39637d86e6be6b1bcc342738a84a36f7c6202ca6e1da379524f5c8d9018ae993","other":"d9b8edffa3383b6f8467b8a14321b244f2eb811ffefe8162705ee61dd8319eb8","up":true},{"one":"3eea0647bbb68e10c4ed7eca646b65088241144fea43f39a8c1b69f025e3a8a3","other":"f9ee770f6f9bddcb1ebe59afcc0068bb534864d66ce43d87fb255038c12a4fd5","up":true}]} \ No newline at end of file diff --git a/vendor/github.com/ethereum/go-ethereum/swarm/pss/testdata/snapshot_64.json b/vendor/github.com/ethereum/go-ethereum/swarm/pss/testdata/snapshot_64.json deleted file mode 100644 index cd3d5593..00000000 --- a/vendor/github.com/ethereum/go-ethereum/swarm/pss/testdata/snapshot_64.json +++ /dev/null @@ -1 +0,0 @@ -{"nodes":[{"node":{"info":{"id":"177e232bdba970f4b001b228af9402e3fca0aaf00682a11bc9984f7db4b7feba","name":"node_177e232bdba970f4b001b228af9402e3fca0aaf00682a11bc9984f7db4b7feba","enode":"enode://b2ecd384df0c1911a363892a8f9f92276afdadbd9766d5367e9426baaf52db54607ef8ed20c6013bcd31216645721a66b33c2afd1f995665b49ef32554fa55c9@127.0.0.1:0","enr":"0xf88fb84084a65eedfefa09006c370680d7af5b4d4600e9775cc2fa0a778a6ca5adf131810dfcdc8b9509da7bbb1a1a865244daf2d32b34b96a9c005080f94eeaf270099f0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103b2ecd384df0c1911a363892a8f9f92276afdadbd9766d5367e9426baaf52db54","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"F34jK9upcPSwAbIor5QC4/ygqvAGgqEbyZhPfbS3/ro=","hive":"\n=========================================================================\nThu Feb 28 17:44:10 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 177e23\npopulation: 14 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 b73b be2b | 34 fb7e (0) f6e5 (0) f211 (0) f35a (0)\n001 3 452b 581a 5602 | 13 452b (0) 581a (0) 5e36 (0) 5f83 (0)\n002 3 255d 3103 3abf | 8 274f (0) 255d (0) 248a (0) 3103 (0)\n003 3 0acb 0727 0486 | 5 0727 (0) 0486 (0) 00ba (0) 0257 (0)\n============ DEPTH: 4 ==========================================\n004 0 | 0\n005 0 | 0\n006 2 154f 1455 | 2 1455 (0) 154f (0)\n007 0 | 0\n008 0 | 0\n009 1 172b | 1 172b (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"177e232bdba970f4b001b228af9402e3fca0aaf00682a11bc9984f7db4b7feba","private_key":"1286e8188fe5e907890aef4a270d2307e0937dd38d9340f4e56829fd23413f31","name":"node_177e232bdba970f4b001b228af9402e3fca0aaf00682a11bc9984f7db4b7feba","services":["bzz","pss"],"enable_msg_events":true,"port":40837},"up":true}},{"node":{"info":{"id":"be2bcb8fb4b34ee6981e6634b8f3298fbbee756f6e76566204a56bb86c8ec0f0","name":"node_be2bcb8fb4b34ee6981e6634b8f3298fbbee756f6e76566204a56bb86c8ec0f0","enode":"enode://7f0ebae8d5040cd874605d9ec6c3a7cb63c1b7cf90d06f7d0b0c7066569ef465f68eb09c19058d1c9cde1d99ae351e95196c1feb2a9ce64ef17076510dd0cd7d@127.0.0.1:0","enr":"0xf88fb840daad2aad3a4d7ff125994a1b8646db6d4bee82774004dd547373a34e6b456b4b34d740e306f79da7c50ae15a5d4dfb60af9dd435898e901986b0570d184a8c2e0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1037f0ebae8d5040cd874605d9ec6c3a7cb63c1b7cf90d06f7d0b0c7066569ef465","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"vivLj7SzTuaYHmY0uPMpj7vudW9udlZiBKVruGyOwPA=","hive":"\n=========================================================================\nThu Feb 28 17:44:10 UTC 2019 KΛÐΞMLIΛ hive: queen's address: be2bcb\npopulation: 17 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 7d69 177e | 30 452b (0) 581a (0) 5f83 (0) 5e36 (0)\n001 3 c0c2 d3c1 f6e5 | 17 fb7e (0) f6e5 (0) f211 (0) f35a (0)\n002 5 8673 856e 8926 8802 | 8 8802 (0) 8926 (0) 821a (0) 856e (0)\n003 3 afb1 ae60 a12b | 4 a12b (0) afb1 (0) ae60 (0) aabc (0)\n004 2 b73b b374 | 2 b374 (0) b73b (0)\n============ DEPTH: 5 ==========================================\n005 2 b8f9 b8f3 | 2 b8f9 (0) b8f3 (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"be2bcb8fb4b34ee6981e6634b8f3298fbbee756f6e76566204a56bb86c8ec0f0","private_key":"1bfc88f8747bfe3f0686c0dd06c6994f80bc3109cbce619c87194df9c0af35ec","name":"node_be2bcb8fb4b34ee6981e6634b8f3298fbbee756f6e76566204a56bb86c8ec0f0","services":["bzz","pss"],"enable_msg_events":true,"port":41679},"up":true}},{"node":{"info":{"id":"7d69b5707a4b99edd901317f1553ff15586aac350f38e0c81318f35d68b835a8","name":"node_7d69b5707a4b99edd901317f1553ff15586aac350f38e0c81318f35d68b835a8","enode":"enode://73efd5ce9d1348bb96a73682ab0e0523106c449265974c594f34a445de026e1225f2a1e0cd7d95a391563cdda852cb9ed50a12a5ba174447ac1320743429f15a@127.0.0.1:0","enr":"0xf88fb84027a696cdd03ce902b65824023e0014604a449a0ab2819e417b664ea0f292ea690de64c4fec6dc5b80d5f97fb7c03e0168027a60d77a65ee8845dd7a519d7a7f80183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10273efd5ce9d1348bb96a73682ab0e0523106c449265974c594f34a445de026e12","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"fWm1cHpLme3ZATF/FVP/FVhqrDUPOODIExjzXWi4Nag=","hive":"\n=========================================================================\nThu Feb 28 17:44:10 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 7d69b5\npopulation: 16 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 ebf2 fb7e 8802 be2b | 34 fb7e (0) f6e5 (0) f211 (0) f35a (0)\n001 3 255d 3103 154f | 17 274f (0) 255d (0) 248a (0) 3103 (0)\n002 5 452b 581a 5e36 52fc | 8 452b (0) 581a (0) 5e36 (0) 5f83 (0)\n003 1 6123 | 1 6123 (0)\n============ DEPTH: 4 ==========================================\n004 2 703d 70d0 | 2 70d0 (0) 703d (0)\n005 0 | 0\n006 1 7f80 | 1 7f80 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"7d69b5707a4b99edd901317f1553ff15586aac350f38e0c81318f35d68b835a8","private_key":"138b2b1614eba35db1d63a8b4cad155aae9ffe67aeba89da6b77c32d8085978c","name":"node_7d69b5707a4b99edd901317f1553ff15586aac350f38e0c81318f35d68b835a8","services":["bzz","pss"],"enable_msg_events":true,"port":37997},"up":true}},{"node":{"info":{"id":"154fec5fa728af956a1446bd5a35e63d716b79a804197b50fd9c72585d044b77","name":"node_154fec5fa728af956a1446bd5a35e63d716b79a804197b50fd9c72585d044b77","enode":"enode://5383cc445c43a2ed3afe5922fc466e7ad833fadea40c63e1fd3bf6c1beee0db531a26c526994d14249bf854f9b36b49e7416d55407d49a3a70608f02419bc8b9@127.0.0.1:0","enr":"0xf88fb8403a38e49c1e706672d35d764ebcf564cca19c96df63f8777ef17eff0305791fa14a022147e46d186121c4ff0d52488b51e3929b5ba536dffe4e7fb7957f7909940183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1035383cc445c43a2ed3afe5922fc466e7ad833fadea40c63e1fd3bf6c1beee0db5","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"FU/sX6cor5VqFEa9WjXmPXFreagEGXtQ/ZxyWF0ES3c=","hive":"\n=========================================================================\nThu Feb 28 17:44:10 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 154fec\npopulation: 16 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 a12b b8f3 f6e5 | 34 fb7e (0) f6e5 (0) f211 (0) f35a (0)\n001 4 581a 5e36 452b 7d69 | 13 452b (0) 581a (0) 5e36 (0) 5f83 (0)\n002 2 274f 3c40 | 8 274f (0) 255d (0) 248a (0) 3103 (0)\n003 4 00ba 0257 0486 0727 | 5 0727 (0) 0486 (0) 00ba (0) 0257 (0)\n============ DEPTH: 4 ==========================================\n004 0 | 0\n005 0 | 0\n006 2 177e 172b | 2 172b (0) 177e (0)\n007 1 1455 | 1 1455 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"154fec5fa728af956a1446bd5a35e63d716b79a804197b50fd9c72585d044b77","private_key":"ce1506c16008e68cab421b02e7de0e8bf64bd8061e84336dd3ee4e7382078bb5","name":"node_154fec5fa728af956a1446bd5a35e63d716b79a804197b50fd9c72585d044b77","services":["bzz","pss"],"enable_msg_events":true,"port":41399},"up":true}},{"node":{"info":{"id":"3c409e5b76e977ee3115a0a19540dd6745e60b8878fdc1a5c1d996e7e47ca969","name":"node_3c409e5b76e977ee3115a0a19540dd6745e60b8878fdc1a5c1d996e7e47ca969","enode":"enode://f98b58ce571bd762921cf62c8001f481eb582bf905c42e8d40eab48cfe6394065721413958fe1a1df85e350f6075bda55b7a8745eb329b11e462282dbc1e7012@127.0.0.1:0","enr":"0xf88fb840193b2d1eaa7d147a52bd4c4a65a9d70c37b92c837f74d8f919a893605560b33c4d5a6df29825a8a430f4e250e5e3a6ec8ce78ec940c759c0b3369cb52ea8e3c90183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102f98b58ce571bd762921cf62c8001f481eb582bf905c42e8d40eab48cfe639406","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"PECeW3bpd+4xFaChlUDdZ0XmC4h4/cGlwdmW5+R8qWk=","hive":"\n=========================================================================\nThu Feb 28 17:44:10 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 3c409e\npopulation: 17 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 821a e6cf c3b2 c461 | 34 821a (0) 856e (0) 87aa (0) 87ac (0)\n001 3 70d0 6123 5602 | 13 6123 (0) 70d0 (0) 703d (0) 7d69 (0)\n002 3 0727 0486 154f | 9 0727 (0) 0486 (0) 00ba (0) 0257 (0)\n003 3 274f 255d 248a | 3 274f (0) 255d (0) 248a (0)\n004 1 3103 | 1 3103 (0)\n============ DEPTH: 5 ==========================================\n005 3 38f0 3abf 3b4f | 3 3b4f (0) 3abf (0) 38f0 (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"3c409e5b76e977ee3115a0a19540dd6745e60b8878fdc1a5c1d996e7e47ca969","private_key":"4e158a7430c532fe0c5fbd4e063cbce5fbd793a516b0d9b2728daac7741a71b9","name":"node_3c409e5b76e977ee3115a0a19540dd6745e60b8878fdc1a5c1d996e7e47ca969","services":["bzz","pss"],"enable_msg_events":true,"port":33099},"up":true}},{"node":{"info":{"id":"c461e430c887894bbbff4e337b61ee449cf12cc07d0fc5fe41785d580d16ae98","name":"node_c461e430c887894bbbff4e337b61ee449cf12cc07d0fc5fe41785d580d16ae98","enode":"enode://a8deb108b6c33a1abc50c0ce0041d4c5de23f17171fb3558dc0a4aed942dc887bb56c0917ed3032af073d8b2415e0879e264370a800f64d060f8f8e1c096d04d@127.0.0.1:0","enr":"0xf88fb8409107e601aef81da4e1f9a95006f25aeec3f9d59b329245d0475a4a3347ee4f7e69b4c64a5401e0679d1ab092d618b1d678a77ba22e43159d1d46790338e165e00183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103a8deb108b6c33a1abc50c0ce0041d4c5de23f17171fb3558dc0a4aed942dc887","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"xGHkMMiHiUu7/04ze2HuRJzxLMB9D8X+QXhdWA0Wrpg=","hive":"\n=========================================================================\nThu Feb 28 17:44:10 UTC 2019 KΛÐΞMLIΛ hive: queen's address: c461e4\npopulation: 17 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 5f83 52fc 452b 6123 | 30 6123 (0) 70d0 (0) 703d (0) 7d69 (0)\n001 5 b374 87aa 856e 821a | 17 821a (0) 856e (0) 87aa (0) 87ac (0)\n002 2 f211 e558 | 11 fb7e (0) f6e5 (0) f211 (0) f35a (0)\n003 2 d904 d3c1 | 2 d3c1 (0) d904 (0)\n004 1 cb8d | 1 cb8d (0)\n============ DEPTH: 5 ==========================================\n005 2 c0c2 c3b2 | 2 c3b2 (0) c0c2 (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"c461e430c887894bbbff4e337b61ee449cf12cc07d0fc5fe41785d580d16ae98","private_key":"978cfc6313655f0d829dc91a0545aa1369f3b0baafc201c8cbc641c965f85b77","name":"node_c461e430c887894bbbff4e337b61ee449cf12cc07d0fc5fe41785d580d16ae98","services":["bzz","pss"],"enable_msg_events":true,"port":43525},"up":true}},{"node":{"info":{"id":"e558105d2aeb59c896f5fb70475b046d9034ef4596e9cd5f54f16c316449241e","name":"node_e558105d2aeb59c896f5fb70475b046d9034ef4596e9cd5f54f16c316449241e","enode":"enode://26b5014af36030418be4bbab747a56da3f0a0b96e77a5c732cfdf7f61ca71d565f2b43bbbb44d2d047a3c549971b88655d62a889afdbb724e8fefe656dbe2b5d@127.0.0.1:0","enr":"0xf88fb840015e82c76a09041b22bbd93a7ea12ce2f51fbc04bb6629d1f8055d626456b7215bbec219530291b84fb78db61bbd25983f693c69d221fa1155ee0947690be72b0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10326b5014af36030418be4bbab747a56da3f0a0b96e77a5c732cfdf7f61ca71d56","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"5VgQXSrrWciW9ftwR1sEbZA070WW6c1fVPFsMWRJJB4=","hive":"\n=========================================================================\nThu Feb 28 17:44:10 UTC 2019 KΛÐΞMLIΛ hive: queen's address: e55810\npopulation: 16 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 6123 70d0 7f80 | 30 6123 (0) 70d0 (0) 703d (0) 7d69 (0)\n001 2 87aa 821a | 17 821a (0) 87aa (0) 87ac (0) 8673 (0)\n002 3 d904 d3c1 c461 | 6 d3c1 (0) d904 (0) cb8d (0) c3b2 (0)\n003 3 fb7e f211 f6e5 | 5 fb7e (0) f6e5 (0) f211 (0) f35a (0)\n004 3 eb30 ebf2 e9fd | 3 ebf2 (0) eb30 (0) e9fd (0)\n============ DEPTH: 5 ==========================================\n005 0 | 0\n006 1 e6cf | 1 e6cf (0)\n007 0 | 0\n008 1 e5e1 | 1 e5e1 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"e558105d2aeb59c896f5fb70475b046d9034ef4596e9cd5f54f16c316449241e","private_key":"62f09d35ddecb1f76c961bd8188912d6ea354de35322e5add87d2eca8154ff74","name":"node_e558105d2aeb59c896f5fb70475b046d9034ef4596e9cd5f54f16c316449241e","services":["bzz","pss"],"enable_msg_events":true,"port":32823},"up":true}},{"node":{"info":{"id":"e9fd5cd7f8d28ca172a3d331da401e9853d3121923c81bf82787f7989009e43a","name":"node_e9fd5cd7f8d28ca172a3d331da401e9853d3121923c81bf82787f7989009e43a","enode":"enode://44a78245fbc89e776a8d27b4548fe61dc789a02628d3246a364971e9ebb1497b72d487ce9d7a0745d667c8adba7db2bf35aac7e327a49728bad8184be24dc311@127.0.0.1:0","enr":"0xf88fb840126f89ca6d674b29c05eb8517aa48cc039a7f289bc17d7e1bc24485e90fa504a1ab8b4c6df373aff9c75943533a3b5955016e0ef89824e23c4cb1b06b86d41d60183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10344a78245fbc89e776a8d27b4548fe61dc789a02628d3246a364971e9ebb1497b","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"6f1c1/jSjKFyo9Mx2kAemFPTEhkjyBv4J4f3mJAJ5Do=","hive":"\n=========================================================================\nThu Feb 28 17:44:10 UTC 2019 KΛÐΞMLIΛ hive: queen's address: e9fd5c\npopulation: 14 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 6123 70d0 7f80 | 30 6123 (0) 70d0 (0) 703d (0) 7d69 (0)\n001 2 821a 9629 | 17 9629 (0) 821a (0) 87aa (0) 87ac (0)\n002 2 d3c1 d904 | 6 d3c1 (0) d904 (0) cb8d (0) c3b2 (0)\n003 2 fb7e f0e9 | 5 fb7e (0) f6e5 (0) f211 (0) f35a (0)\n004 3 e6cf e5e1 e558 | 3 e6cf (0) e5e1 (0) e558 (0)\n============ DEPTH: 5 ==========================================\n005 0 | 0\n006 2 eb30 ebf2 | 2 ebf2 (0) eb30 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"e9fd5cd7f8d28ca172a3d331da401e9853d3121923c81bf82787f7989009e43a","private_key":"e1866d6c66f9cdff0845058b114b9a15a4967274ad9cda558e102be0a746e9dd","name":"node_e9fd5cd7f8d28ca172a3d331da401e9853d3121923c81bf82787f7989009e43a","services":["bzz","pss"],"enable_msg_events":true,"port":36597},"up":true}},{"node":{"info":{"id":"f0e900ef37baad6a1685aaf1700e9290e7e9c0d5d30e3265204ec943445248b3","name":"node_f0e900ef37baad6a1685aaf1700e9290e7e9c0d5d30e3265204ec943445248b3","enode":"enode://39fc37e1b4c1d8d2906469ea880448186e5246e849c0b6f79952d9254173f1d88e5e06d9331f14bd5052073d2c2d28106ca84ae08fab04d3217db4233fd750dd@127.0.0.1:0","enr":"0xf88fb84088c04103f60facca986ee3d5509cb1e58a231d8dc712d3df77c917f1aa9c27df5a9b0797512f9d61477075a6b766f14ea88d4ae2311b8ae23274327c0d9ba93c0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10339fc37e1b4c1d8d2906469ea880448186e5246e849c0b6f79952d9254173f1d8","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"8OkA7ze6rWoWharxcA6SkOfpwNXTDjJlIE7JQ0RSSLM=","hive":"\n=========================================================================\nThu Feb 28 17:44:10 UTC 2019 KΛÐΞMLIΛ hive: queen's address: f0e900\npopulation: 14 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 6123 70d0 7f80 | 30 6123 (0) 70d0 (0) 703d (0) 7d69 (0)\n001 3 821a 9629 aabc | 17 9629 (0) 821a (0) 8673 (0) 87aa (0)\n002 2 d904 d3c1 | 6 d3c1 (0) d904 (0) c461 (0) c3b2 (0)\n003 2 e6cf e9fd | 6 e6cf (0) e5e1 (0) e558 (0) ebf2 (0)\n004 1 fb7e | 1 fb7e (0)\n005 1 f6e5 | 1 f6e5 (0)\n============ DEPTH: 6 ==========================================\n006 2 f211 f35a | 2 f211 (0) f35a (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"f0e900ef37baad6a1685aaf1700e9290e7e9c0d5d30e3265204ec943445248b3","private_key":"d85d087c4d2770c08517c1b719cd6805713af1046aeba2bd6db5e31402388df2","name":"node_f0e900ef37baad6a1685aaf1700e9290e7e9c0d5d30e3265204ec943445248b3","services":["bzz","pss"],"enable_msg_events":true,"port":45551},"up":true}},{"node":{"info":{"id":"aabc587ddc3b7d493ce8e849b15d364265c57d3a3a52613076a5b31804cb753f","name":"node_aabc587ddc3b7d493ce8e849b15d364265c57d3a3a52613076a5b31804cb753f","enode":"enode://df29ae71bd1cab0ab806f7dea6545ae649dc9e0640e8d1bef8f6b518c4a75e822f1ac2a937b117eed3faf5f9a4e718d31899d4a6466c33fd6ee520daae0650f3@127.0.0.1:0","enr":"0xf88fb84046f68bd288eb808ea2aa0bbf41922e0e52f2bf6dbd65f83ce2d9632d94262fcf2af844233c694aec3e77cb82eb24aff844c4aa24be379900ec5323a3218b8c430183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103df29ae71bd1cab0ab806f7dea6545ae649dc9e0640e8d1bef8f6b518c4a75e82","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"qrxYfdw7fUk86OhJsV02QmXFfTo6UmEwdqWzGATLdT8=","hive":"\n=========================================================================\nThu Feb 28 17:44:10 UTC 2019 KΛÐΞMLIΛ hive: queen's address: aabc58\npopulation: 14 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 172b 6123 7f80 | 30 6123 (0) 70d0 (0) 703d (0) 7d69 (0)\n001 3 fb7e f6e5 f0e9 | 17 d3c1 (0) d904 (0) c461 (0) c3b2 (0)\n002 3 821a 87aa 9629 | 8 9629 (0) 821a (0) 8673 (0) 87aa (0)\n003 2 b73b b374 | 5 b374 (0) b73b (0) be2b (0) b8f9 (0)\n004 1 a12b | 1 a12b (0)\n============ DEPTH: 5 ==========================================\n005 2 afb1 ae60 | 2 afb1 (0) ae60 (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"aabc587ddc3b7d493ce8e849b15d364265c57d3a3a52613076a5b31804cb753f","private_key":"2338394db2f3550707f783ab13a9427021f5e6be8b3431444d735c6506fc2b2d","name":"node_aabc587ddc3b7d493ce8e849b15d364265c57d3a3a52613076a5b31804cb753f","services":["bzz","pss"],"enable_msg_events":true,"port":34323},"up":true}},{"node":{"info":{"id":"f6e5148d2421ae11e8a109852c9da77bbe498f9e6ed3aa361755a1ff3fd29b74","name":"node_f6e5148d2421ae11e8a109852c9da77bbe498f9e6ed3aa361755a1ff3fd29b74","enode":"enode://f5975ee0b5c78d6bc4a68b9b35744cec5ac5922b8da008a4b68a8e9ceee9a6d3a817b21d8b51f9fe35123317bc22cbd1dd37d18f93c433a8d82d25774bc84f59@127.0.0.1:0","enr":"0xf88fb8406c21f34341248451d882a4655a586feeb202f8cb7d47b0da9bd8a4f5f915128228efd4998dcfb8d43543463364a2937db016284e0bb78cfec37208079bb910020183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103f5975ee0b5c78d6bc4a68b9b35744cec5ac5922b8da008a4b68a8e9ceee9a6d3","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"9uUUjSQhrhHooQmFLJ2ne75Jj55u06o2F1Wh/z/Sm3Q=","hive":"\n=========================================================================\nThu Feb 28 17:44:10 UTC 2019 KΛÐΞMLIΛ hive: queen's address: f6e514\npopulation: 23 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 5508 154f 1455 | 30 6123 (0) 70d0 (0) 703d (0) 7d69 (0)\n001 8 8926 b73b b8f9 be2b | 17 9629 (0) 821a (0) 8673 (0) 87aa (0)\n002 3 cb8d c3b2 c0c2 | 6 d904 (0) d3c1 (0) c461 (0) c3b2 (0)\n003 5 eb30 ebf2 e6cf e558 | 6 e6cf (0) e5e1 (0) e558 (0) ebf2 (0)\n004 1 fb7e | 1 fb7e (0)\n============ DEPTH: 5 ==========================================\n005 3 f0e9 f35a f211 | 3 f211 (0) f35a (0) f0e9 (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"f6e5148d2421ae11e8a109852c9da77bbe498f9e6ed3aa361755a1ff3fd29b74","private_key":"f6740a5cf46069cee8cdfefdd049e563958cbda7e4c59315d0276a92915efe0a","name":"node_f6e5148d2421ae11e8a109852c9da77bbe498f9e6ed3aa361755a1ff3fd29b74","services":["bzz","pss"],"enable_msg_events":true,"port":40421},"up":true}},{"node":{"info":{"id":"1455d4713b5134e9157517b84b04e15292cf18d3e08b95d69f19648fb9e3823e","name":"node_1455d4713b5134e9157517b84b04e15292cf18d3e08b95d69f19648fb9e3823e","enode":"enode://b5e652612f7909a70ecaf98ed27cc962687c895a349dcc80a326794a291a3851a3ba447345a30263a39c29f730276e1b1810813d39975649c50537c0febf67f0@127.0.0.1:0","enr":"0xf88fb8405d344eda0bf71d02e1171dbf8e3b0ae13b7091d138dbc1ed3f568b08dea67f526ec263da507139112160bd3260e7f3582b1fe88aa0501cf52d73650bbdb2d6ac0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102b5e652612f7909a70ecaf98ed27cc962687c895a349dcc80a326794a291a3851","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"FFXUcTtRNOkVdRe4SwThUpLPGNPgi5XWnxlkj7njgj4=","hive":"\n=========================================================================\nThu Feb 28 17:44:10 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 1455d4\npopulation: 16 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 a12b f6e5 | 34 9629 (0) 821a (0) 8673 (0) 87aa (0)\n001 4 5f83 6123 703d 7f80 | 13 6123 (0) 703d (0) 70d0 (0) 7d69 (0)\n002 3 3103 3abf 38f0 | 8 274f (0) 255d (0) 248a (0) 3103 (0)\n003 4 0257 00ba 0727 0486 | 5 0727 (0) 0486 (0) 00ba (0) 0257 (0)\n============ DEPTH: 4 ==========================================\n004 0 | 0\n005 0 | 0\n006 2 172b 177e | 2 172b (0) 177e (0)\n007 1 154f | 1 154f (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"1455d4713b5134e9157517b84b04e15292cf18d3e08b95d69f19648fb9e3823e","private_key":"50925145323eadd436d028b14956413b9ce4a6e6e12ee61bc6f39b7bdeb607ce","name":"node_1455d4713b5134e9157517b84b04e15292cf18d3e08b95d69f19648fb9e3823e","services":["bzz","pss"],"enable_msg_events":true,"port":35787},"up":true}},{"node":{"info":{"id":"38f05af40cd0dc3974e896e24aa75ebda1c96f0ce7d9e3ff0ea840615186307d","name":"node_38f05af40cd0dc3974e896e24aa75ebda1c96f0ce7d9e3ff0ea840615186307d","enode":"enode://48f1b561316fb88b3f6966b6b77793eb73ade705dffda5b5e889665c61f61eb65fc53b12a893affa1626e2c066c218fbf0cacc47ae235f284b99d1ddb70a1b7b@127.0.0.1:0","enr":"0xf88fb840ac0a5221c7f96140e1c2b39e3ce570681198f21499c4ac2d4cf71f13084d1d463ea56145f4bc0ae39e1bcf6f728c0fb8bcb53b6f59ff82ca0c91761364ae2aeb0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10348f1b561316fb88b3f6966b6b77793eb73ade705dffda5b5e889665c61f61eb6","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"OPBa9AzQ3Dl06JbiSqdevaHJbwzn2eP/DqhAYVGGMH0=","hive":"\n=========================================================================\nThu Feb 28 17:44:10 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 38f05a\npopulation: 14 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 9629 821a 856e | 34 9629 (0) 821a (0) 8673 (0) 87aa (0)\n001 2 6123 5508 | 13 6123 (0) 703d (0) 70d0 (0) 7d69 (0)\n002 2 0acb 1455 | 9 00ba (0) 0257 (0) 0486 (0) 0727 (0)\n003 3 274f 255d 248a | 3 274f (0) 255d (0) 248a (0)\n004 1 3103 | 1 3103 (0)\n005 1 3c40 | 1 3c40 (0)\n============ DEPTH: 6 ==========================================\n006 2 3b4f 3abf | 2 3b4f (0) 3abf (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"38f05af40cd0dc3974e896e24aa75ebda1c96f0ce7d9e3ff0ea840615186307d","private_key":"72aaff493375ffe3fdf32b207dec2bf4b6947a83b0be8a39d016a620e5d84166","name":"node_38f05af40cd0dc3974e896e24aa75ebda1c96f0ce7d9e3ff0ea840615186307d","services":["bzz","pss"],"enable_msg_events":true,"port":46291},"up":true}},{"node":{"info":{"id":"0acb17334253408a773202041d4a67c7873b0e74e94c86e3343fb470bdcbed82","name":"node_0acb17334253408a773202041d4a67c7873b0e74e94c86e3343fb470bdcbed82","enode":"enode://f3639f1bd30e3cf2653b9a4f9d20fab2897ba468020ec336c3eff2d6a4b27c4d3f7f01a6e2cbc6496e8ab4b435a53a518f45a78752b9ecce6ff119cd83eae04c@127.0.0.1:0","enr":"0xf88fb84093cbe4a72d6dc31819c9cd24e75d7178f02135c11b41668880b6c4ce743b2602056aa9103ed6fbdaada4c85913a2f4bf90dd092942db61a1df54c4269cc2f46f0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102f3639f1bd30e3cf2653b9a4f9d20fab2897ba468020ec336c3eff2d6a4b27c4d","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"CssXM0JTQIp3MgIEHUpnx4c7DnTpTIbjND+0cL3L7YI=","hive":"\n=========================================================================\nThu Feb 28 17:44:10 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 0acb17\npopulation: 20 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 b8f3 821a 8926 9629 | 34 9629 (0) 821a (0) 8673 (0) 87aa (0)\n001 5 57d9 6123 70d0 703d | 13 6123 (0) 703d (0) 70d0 (0) 7d69 (0)\n002 3 274f 3b4f 38f0 | 8 274f (0) 255d (0) 248a (0) 3103 (0)\n003 2 177e 172b | 4 172b (0) 177e (0) 154f (0) 1455 (0)\n============ DEPTH: 4 ==========================================\n004 4 0727 0486 0257 00ba | 4 00ba (0) 0257 (0) 0486 (0) 0727 (0)\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"0acb17334253408a773202041d4a67c7873b0e74e94c86e3343fb470bdcbed82","private_key":"f732331fdd132dd9b4c64ae5c42247591f96dc911fe6a706b14a10ce3a8ed9d6","name":"node_0acb17334253408a773202041d4a67c7873b0e74e94c86e3343fb470bdcbed82","services":["bzz","pss"],"enable_msg_events":true,"port":44253},"up":true}},{"node":{"info":{"id":"f35a47e1d56a6d8e5caad50d88e55c83ff3b964b279b58a50d5e544ff9187864","name":"node_f35a47e1d56a6d8e5caad50d88e55c83ff3b964b279b58a50d5e544ff9187864","enode":"enode://e745eb6d9e95b82f6b4a6fbd9fb578c5ec53de4bf64bf008a25af4595cf01cd932b1070c197157ebeddcf79d4659acc3a6244177421656d601eb1a108f6c8ab8@127.0.0.1:0","enr":"0xf88fb840fd81f60522c3b56a658b661d599993ff0aca7eaadae4a28bff72103db1ffda910194afe2e3799b9f30d6b7c9134a70f7d05f79b082b70dba836d6ae907720f5a0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102e745eb6d9e95b82f6b4a6fbd9fb578c5ec53de4bf64bf008a25af4595cf01cd9","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"81pH4dVqbY5cqtUNiOVcg/87lksnm1ilDV5UT/kYeGQ=","hive":"\n=========================================================================\nThu Feb 28 17:44:10 UTC 2019 KΛÐΞMLIΛ hive: queen's address: f35a47\npopulation: 14 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 703d 6123 0acb | 30 6123 (0) 703d (0) 70d0 (0) 7d69 (0)\n001 3 9629 821a 856e | 17 9629 (0) 821a (0) 8673 (0) 87aa (0)\n002 2 d904 d3c1 | 6 d3c1 (0) d904 (0) c461 (0) c3b2 (0)\n003 2 ebf2 e5e1 | 6 ebf2 (0) eb30 (0) e9fd (0) e6cf (0)\n004 1 fb7e | 1 fb7e (0)\n005 1 f6e5 | 1 f6e5 (0)\n============ DEPTH: 6 ==========================================\n006 1 f0e9 | 1 f0e9 (0)\n007 1 f211 | 1 f211 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"f35a47e1d56a6d8e5caad50d88e55c83ff3b964b279b58a50d5e544ff9187864","private_key":"bc31ff1a3354902df6fdba93d648599c420dc962166cd94ba5c9c88781f7b1ac","name":"node_f35a47e1d56a6d8e5caad50d88e55c83ff3b964b279b58a50d5e544ff9187864","services":["bzz","pss"],"enable_msg_events":true,"port":40235},"up":true}},{"node":{"info":{"id":"e5e166f85ea9e264fc25734523869d9b916f388004cb4af9968956ce14a7a522","name":"node_e5e166f85ea9e264fc25734523869d9b916f388004cb4af9968956ce14a7a522","enode":"enode://12f560588c3394b54f4be445fbc804457f104c736613aa7516dcdc935bc1004c7489dbd657445bbcfd5d1b4f85571f2805789d680c6e7bdb08950b548093de42@127.0.0.1:0","enr":"0xf88fb840510aeffd2b76786cd66e778ad5f1c6301affb8c7f1a226cd32e3d61f23da281c79562ae15cbd94ce4a39dff5596492b2716cf58c476ce701e22a641d60a8a4af0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10212f560588c3394b54f4be445fbc804457f104c736613aa7516dcdc935bc1004c","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"5eFm+F6p4mT8JXNFI4adm5FvOIAEy0r5lolWzhSnpSI=","hive":"\n=========================================================================\nThu Feb 28 17:44:10 UTC 2019 KΛÐΞMLIΛ hive: queen's address: e5e166\npopulation: 15 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 6123 703d 7f80 | 30 6123 (0) 703d (0) 70d0 (0) 7d69 (0)\n001 3 8802 856e b8f3 | 17 9629 (0) 821a (0) 8673 (0) 87aa (0)\n002 2 d3c1 d904 | 6 d3c1 (0) d904 (0) c461 (0) c3b2 (0)\n003 3 f6e5 f211 f35a | 5 fb7e (0) f6e5 (0) f0e9 (0) f211 (0)\n004 2 ebf2 e9fd | 3 e9fd (0) ebf2 (0) eb30 (0)\n============ DEPTH: 5 ==========================================\n005 0 | 0\n006 1 e6cf | 1 e6cf (0)\n007 0 | 0\n008 1 e558 | 1 e558 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"e5e166f85ea9e264fc25734523869d9b916f388004cb4af9968956ce14a7a522","private_key":"25c5ec054b6f8975276f7c37381908b15ba3fdd204996e80188c27a45a120156","name":"node_e5e166f85ea9e264fc25734523869d9b916f388004cb4af9968956ce14a7a522","services":["bzz","pss"],"enable_msg_events":true,"port":42811},"up":true}},{"node":{"info":{"id":"b8f345940bced8831b30079ff2a276ab65fbed0dd8575c93a3ccd8c7bd1bc8b1","name":"node_b8f345940bced8831b30079ff2a276ab65fbed0dd8575c93a3ccd8c7bd1bc8b1","enode":"enode://1eafb72a59e875d1e4c6fcfc48e3b83060dc7edf1745dc4b4d69920b5c498a0aa5028ac463be2a03331b3f50634295010786205311e2dde4214f5375d846be46@127.0.0.1:0","enr":"0xf88fb840f39e6fb0bc59342b1e5379ca1dfe35c07ed85b72975e03d86b5eaacb2845d6013b15e070b59162b9da5f6a9459e9d69522dfd0dd5dc6eab1478e26446d3adf640183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1021eafb72a59e875d1e4c6fcfc48e3b83060dc7edf1745dc4b4d69920b5c498a0a","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"uPNFlAvO2IMbMAef8qJ2q2X77Q3YV1yTo8zYx70byLE=","hive":"\n=========================================================================\nThu Feb 28 17:44:10 UTC 2019 KΛÐΞMLIΛ hive: queen's address: b8f345\npopulation: 15 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 00ba 0acb 154f | 30 0acb (0) 00ba (0) 0257 (0) 0486 (0)\n001 2 cb8d e5e1 | 17 d3c1 (0) d904 (0) c461 (0) c3b2 (0)\n002 3 821a 8802 9629 | 8 9629 (0) 821a (0) 8673 (0) 87ac (0)\n003 3 afb1 ae60 a12b | 4 a12b (0) afb1 (0) ae60 (0) aabc (0)\n004 2 b73b b374 | 2 b374 (0) b73b (0)\n============ DEPTH: 5 ==========================================\n005 1 be2b | 1 be2b (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 1 b8f9 | 1 b8f9 (0)\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"b8f345940bced8831b30079ff2a276ab65fbed0dd8575c93a3ccd8c7bd1bc8b1","private_key":"f213075c2bb9ce044c3ea7e245d0e841eeb4448cb914bad8b7cc2aaf223494f5","name":"node_b8f345940bced8831b30079ff2a276ab65fbed0dd8575c93a3ccd8c7bd1bc8b1","services":["bzz","pss"],"enable_msg_events":true,"port":32901},"up":true}},{"node":{"info":{"id":"cb8df183e7fea4f808ed569d3fa0a6c26670f6451b9a9f48e8659871c2b9ab02","name":"node_cb8df183e7fea4f808ed569d3fa0a6c26670f6451b9a9f48e8659871c2b9ab02","enode":"enode://b86efbaace42f2f41e4faeb180734ba7b3bcd88ce25a4b671f0522e50bccc0544084a0f72f57d3183269bc433e8522e008fcf70990130bd428e679cd2ef2301e@127.0.0.1:0","enr":"0xf88fb840fd41041292742e2d87cfac656804056de57d38166539d75aa87d8ea4028c8b905a7395663eced2fb92ca0b03214bb0fd07d36096c4fa09e3b51edc25293577d50183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102b86efbaace42f2f41e4faeb180734ba7b3bcd88ce25a4b671f0522e50bccc054","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"y43xg+f+pPgI7VadP6CmwmZw9kUbmp9I6GWYccK5qwI=","hive":"\n=========================================================================\nThu Feb 28 17:44:10 UTC 2019 KΛÐΞMLIΛ hive: queen's address: cb8df1\npopulation: 21 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 8 274f 0486 0727 452b | 30 0acb (0) 00ba (0) 0257 (0) 0486 (0)\n001 5 8673 87ac 87aa b374 | 17 9629 (0) 821a (0) 8673 (0) 87ac (0)\n002 3 ebf2 f6e5 fb7e | 11 fb7e (0) f6e5 (0) f0e9 (0) f211 (0)\n003 2 d904 d3c1 | 2 d904 (0) d3c1 (0)\n============ DEPTH: 4 ==========================================\n004 3 c461 c3b2 c0c2 | 3 c461 (0) c3b2 (0) c0c2 (0)\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"cb8df183e7fea4f808ed569d3fa0a6c26670f6451b9a9f48e8659871c2b9ab02","private_key":"492d4a83cd01c80cafe080a10aba2708adad9d57c896ddd20c3f1783fb8c8ae2","name":"node_cb8df183e7fea4f808ed569d3fa0a6c26670f6451b9a9f48e8659871c2b9ab02","services":["bzz","pss"],"enable_msg_events":true,"port":37973},"up":true}},{"node":{"info":{"id":"c0c2d73abd2b6abc3ba0b098520c4cc3eda61b5fc9d1ab42ebd04ecc25ded224","name":"node_c0c2d73abd2b6abc3ba0b098520c4cc3eda61b5fc9d1ab42ebd04ecc25ded224","enode":"enode://5307ee476b7d4a7cc8fff3c91a49faff9ef919880ec9f6c2bbf3e57f27bd769f5692a37e70531c902a3d1e519fcbfee9cbd946d008e3653287786ead5083cedd@127.0.0.1:0","enr":"0xf88fb8400e91dade29f3fd1bfebe010d282d7b43d12bdf0bcae8e2e549a2e1ed15785ac4504f8048792eba8a6518ad1ae28b39fd2b21dac0adf4e65609f6da91de0b618f0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1035307ee476b7d4a7cc8fff3c91a49faff9ef919880ec9f6c2bbf3e57f27bd769f","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"wMLXOr0rarw7oLCYUgxMw+2mG1/J0atC69BOzCXe0iQ=","hive":"\n=========================================================================\nThu Feb 28 17:44:10 UTC 2019 KΛÐΞMLIΛ hive: queen's address: c0c2d7\npopulation: 12 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 0acb 00ba 0486 | 30 0acb (0) 00ba (0) 0257 (0) 0486 (0)\n001 2 be2b 8926 | 17 be2b (0) b8f9 (0) b8f3 (0) b374 (0)\n002 2 f211 f6e5 | 11 fb7e (0) f6e5 (0) f0e9 (0) f211 (0)\n003 2 d3c1 d904 | 2 d904 (0) d3c1 (0)\n004 1 cb8d | 1 cb8d (0)\n============ DEPTH: 5 ==========================================\n005 1 c461 | 1 c461 (0)\n006 1 c3b2 | 1 c3b2 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"c0c2d73abd2b6abc3ba0b098520c4cc3eda61b5fc9d1ab42ebd04ecc25ded224","private_key":"2c6df66c8a1843928d4ff1c1f86261392e9ba859e1d50dbc7e47344968446e7d","name":"node_c0c2d73abd2b6abc3ba0b098520c4cc3eda61b5fc9d1ab42ebd04ecc25ded224","services":["bzz","pss"],"enable_msg_events":true,"port":46541},"up":true}},{"node":{"info":{"id":"892603fc64fe169ad15519060cfb1d27780adff60da60f86a620f2bf9a7ca1e1","name":"node_892603fc64fe169ad15519060cfb1d27780adff60da60f86a620f2bf9a7ca1e1","enode":"enode://d2b6d26acb63edf3d8f2e7ba86fce1304441bb3a8c9138e4069412e556fe677e49bf669824144f7f2f752c1ba56d21e1d5b2583b7ce06db6f8e466929bb54fa3@127.0.0.1:0","enr":"0xf88fb84030e09ff37ec6e84f56137ccc06cfe91eec3cfba76fd5f655d4220c8984c2bf74694a268165a67c073623dd0c8ef0879ce3f78eddf5ce61832a0f755c5342a26a0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103d2b6d26acb63edf3d8f2e7ba86fce1304441bb3a8c9138e4069412e556fe677e","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"iSYD/GT+FprRVRkGDPsdJ3gK3/YNpg+GpiDyv5p8oeE=","hive":"\n=========================================================================\nThu Feb 28 17:44:10 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 892603\npopulation: 18 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 00ba 0acb 57d9 | 30 0acb (0) 00ba (0) 0257 (0) 0486 (0)\n001 3 f6e5 fb7e c0c2 | 17 fb7e (0) f6e5 (0) f0e9 (0) f211 (0)\n002 5 b73b be2b afb1 ae60 | 9 b8f9 (0) b8f3 (0) be2b (0) b374 (0)\n003 1 9629 | 1 9629 (0)\n============ DEPTH: 4 ==========================================\n004 5 821a 856e 8673 87aa | 5 821a (0) 8673 (0) 87ac (0) 87aa (0)\n005 0 | 0\n006 0 | 0\n007 1 8802 | 1 8802 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"892603fc64fe169ad15519060cfb1d27780adff60da60f86a620f2bf9a7ca1e1","private_key":"44e05a26b9222f67f884d2093377f119349ef6710b86f7b7edc2f0e61793a1ea","name":"node_892603fc64fe169ad15519060cfb1d27780adff60da60f86a620f2bf9a7ca1e1","services":["bzz","pss"],"enable_msg_events":true,"port":33109},"up":true}},{"node":{"info":{"id":"57d911f864be7a90d8807bc3fecd658c5697d70cf3ddcc1dde0dd9bd0fd7fb67","name":"node_57d911f864be7a90d8807bc3fecd658c5697d70cf3ddcc1dde0dd9bd0fd7fb67","enode":"enode://0527dc36e6d408034587180c2cadb429ac1ea5e4cf5ffaadf60e8af1bbef30368fc234f75f7ede63d70df8d932f3fae54ba14fdbdb033a18ec2e914b85594f0a@127.0.0.1:0","enr":"0xf88fb840783a349f43c192ad36b674821f63954fd4de02eb076100f9dab68b0fe5eafe8051d208f26c93e9ad609307b169dba4ea5236c4cb557365c16b94e96fc85372eb0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1020527dc36e6d408034587180c2cadb429ac1ea5e4cf5ffaadf60e8af1bbef3036","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"V9kR+GS+epDYgHvD/s1ljFaX1wzz3cwd3g3ZvQ/X+2c=","hive":"\n=========================================================================\nThu Feb 28 17:44:10 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 57d911\npopulation: 16 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 d3c1 eb30 8926 | 34 fb7e (0) f6e5 (0) f0e9 (0) f211 (0)\n001 4 0acb 0257 00ba 0486 | 17 0acb (0) 00ba (0) 0257 (0) 0486 (0)\n002 2 70d0 6123 | 5 6123 (0) 70d0 (0) 703d (0) 7d69 (0)\n003 1 452b | 1 452b (0)\n004 3 581a 5e36 5f83 | 3 5e36 (0) 5f83 (0) 581a (0)\n005 1 52fc | 1 52fc (0)\n============ DEPTH: 6 ==========================================\n006 1 5508 | 1 5508 (0)\n007 1 5602 | 1 5602 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"57d911f864be7a90d8807bc3fecd658c5697d70cf3ddcc1dde0dd9bd0fd7fb67","private_key":"34c80a58a443bb0e1518a14f812731f34ed2a04d27aad1978a43edfdc46b1219","name":"node_57d911f864be7a90d8807bc3fecd658c5697d70cf3ddcc1dde0dd9bd0fd7fb67","services":["bzz","pss"],"enable_msg_events":true,"port":44125},"up":true}},{"node":{"info":{"id":"eb307a6f333b30ebd1e3b2b51bd8095311d48707d6ca2c81447d01ad453e2542","name":"node_eb307a6f333b30ebd1e3b2b51bd8095311d48707d6ca2c81447d01ad453e2542","enode":"enode://f3a08e5df6a6bcf751846b6ace6f57a31a6d449df1d48df065dea5bfc74586b8933323a5b063ec3e7ae58f7e038d7c218ad2294587029267bb4c092388609234@127.0.0.1:0","enr":"0xf88fb84056d0cb9ccc119c03a9f1d32aedfd19f6e27d6813d9a2ea1813e35ac670286db72f8b2d4481d401b7f7464d2cacd28c10aacbde6fdb7a0b4a83ede973c90042310183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102f3a08e5df6a6bcf751846b6ace6f57a31a6d449df1d48df065dea5bfc74586b8","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"6zB6bzM7MOvR47K1G9gJUxHUhwfWyiyBRH0BrUU+JUI=","hive":"\n=========================================================================\nThu Feb 28 17:44:10 UTC 2019 KΛÐΞMLIΛ hive: queen's address: eb307a\npopulation: 13 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 3abf 57d9 | 30 177e (0) 172b (0) 154f (0) 1455 (0)\n001 3 8802 b73b a12b | 17 b73b (0) b374 (0) b8f9 (0) b8f3 (0)\n002 2 d3c1 d904 | 6 d904 (0) d3c1 (0) c0c2 (0) c3b2 (0)\n003 2 f6e5 fb7e | 5 fb7e (0) f6e5 (0) f0e9 (0) f211 (0)\n004 2 e558 e6cf | 3 e6cf (0) e558 (0) e5e1 (0)\n============ DEPTH: 5 ==========================================\n005 0 | 0\n006 1 e9fd | 1 e9fd (0)\n007 0 | 0\n008 1 ebf2 | 1 ebf2 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"eb307a6f333b30ebd1e3b2b51bd8095311d48707d6ca2c81447d01ad453e2542","private_key":"46e33ba68cfba7f42ff80b2a4e6e42af54661467f574487ae9dd64d58b7f1bff","name":"node_eb307a6f333b30ebd1e3b2b51bd8095311d48707d6ca2c81447d01ad453e2542","services":["bzz","pss"],"enable_msg_events":true,"port":43461},"up":true}},{"node":{"info":{"id":"3abfe9f4f6a8d34b536d02551f45c03a35987b94f7d33b3a0dc30ad34b15f82a","name":"node_3abfe9f4f6a8d34b536d02551f45c03a35987b94f7d33b3a0dc30ad34b15f82a","enode":"enode://51deaa308d9269c160365fdfcbb25f60a03a82f2efaff308a0eb09a18cf138beda36562ac1c16957da7172ce518f770d922c053efc2c3bce06419cc6e0928014@127.0.0.1:0","enr":"0xf88fb84053019049f1135e4048d6971781321d1f8b972fd8a2a99e110a64833ce5a36834048b662125d1775ff49679add18eb3d76c36c8ec11be8647e6c523b5fe93a8160183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10251deaa308d9269c160365fdfcbb25f60a03a82f2efaff308a0eb09a18cf138be","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"Or/p9Pao00tTbQJVH0XAOjWYe5T30zs6DcMK00sV+Co=","hive":"\n=========================================================================\nThu Feb 28 17:44:10 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 3abfe9\npopulation: 13 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 b73b eb30 | 34 b73b (0) b374 (0) b8f9 (0) b8f3 (0)\n001 2 452b 7f80 | 13 452b (0) 5f83 (0) 5e36 (0) 581a (0)\n002 2 177e 1455 | 9 154f (0) 1455 (0) 177e (0) 172b (0)\n003 3 255d 248a 274f | 3 274f (0) 255d (0) 248a (0)\n004 1 3103 | 1 3103 (0)\n005 1 3c40 | 1 3c40 (0)\n============ DEPTH: 6 ==========================================\n006 1 38f0 | 1 38f0 (0)\n007 1 3b4f | 1 3b4f (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"3abfe9f4f6a8d34b536d02551f45c03a35987b94f7d33b3a0dc30ad34b15f82a","private_key":"93982f270ea11ec36ba55e97235856f2ed6fab52aa3d0249bf628e2b9c91d9dd","name":"node_3abfe9f4f6a8d34b536d02551f45c03a35987b94f7d33b3a0dc30ad34b15f82a","services":["bzz","pss"],"enable_msg_events":true,"port":34193},"up":true}},{"node":{"info":{"id":"7f800e5a7970230f5273e49971c7ee521de97e69f56dd554e30dd12d6fb5c749","name":"node_7f800e5a7970230f5273e49971c7ee521de97e69f56dd554e30dd12d6fb5c749","enode":"enode://51bcf947a12e8ac505ec8b402224676a504d2c39b71e446006083d741c461c94ab190ab816afaef8a6b24df9b56e6e9f8a30eb2bebd6a7df58e67e31c8c4e405@127.0.0.1:0","enr":"0xf88fb840f65e01347df378f48f5e7ebbb387f2f2cde36dd9aaede48ab5819adf690d1f87361843b84b8b6ab295420b7bf4eb9b12d169c9c53f2ef3d01db492bf9ef0735c0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10351bcf947a12e8ac505ec8b402224676a504d2c39b71e446006083d741c461c94","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"f4AOWnlwIw9Sc+SZccfuUh3pfmn1bdVU4w3RLW+1x0k=","hive":"\n=========================================================================\nThu Feb 28 17:44:10 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 7f800e\npopulation: 19 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 7 f0e9 e9fd e5e1 e558 | 34 fb7e (0) f6e5 (0) f0e9 (0) f211 (0)\n001 4 0acb 1455 3103 3abf | 17 154f (0) 1455 (0) 177e (0) 172b (0)\n002 4 452b 5602 5508 581a | 8 452b (0) 5f83 (0) 5e36 (0) 581a (0)\n003 1 6123 | 1 6123 (0)\n============ DEPTH: 4 ==========================================\n004 2 703d 70d0 | 2 703d (0) 70d0 (0)\n005 0 | 0\n006 1 7d69 | 1 7d69 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"7f800e5a7970230f5273e49971c7ee521de97e69f56dd554e30dd12d6fb5c749","private_key":"015cba3c04c983b51b26debe83456fc5ce953a720c5d618632a551198845ce87","name":"node_7f800e5a7970230f5273e49971c7ee521de97e69f56dd554e30dd12d6fb5c749","services":["bzz","pss"],"enable_msg_events":true,"port":37409},"up":true}},{"node":{"info":{"id":"ae6023d416c87bb433eb9d8d44f97531797d292774304d996923a3fe67887478","name":"node_ae6023d416c87bb433eb9d8d44f97531797d292774304d996923a3fe67887478","enode":"enode://8d29ea4346f1503c80ef55fdb63d33a2d857bbda499bfd296afd75a9ae9badd16b3328fe1ba73b31a2b3cd6600d7fd33d2bfc6dcd1e61dc369f505b16c9df1d5@127.0.0.1:0","enr":"0xf88fb84025b8f01e1b8f2908011afc21980bd9d8b915e89b8851d351a509936bc3202d886b91cb5b9a1c2ba97ae71a5f776d2075237ee89af24379ed746fcf3e3e8eafe60183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1038d29ea4346f1503c80ef55fdb63d33a2d857bbda499bfd296afd75a9ae9badd1","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"rmAj1BbIe7Qz652NRPl1MXl9KSd0ME2ZaSOj/meIdHg=","hive":"\n=========================================================================\nThu Feb 28 17:44:10 UTC 2019 KΛÐΞMLIΛ hive: queen's address: ae6023\npopulation: 14 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 248a 7f80 | 30 154f (0) 1455 (0) 177e (0) 172b (0)\n001 4 e6cf fb7e f6e5 f211 | 17 fb7e (0) f6e5 (0) f0e9 (0) f211 (0)\n002 2 8926 9629 | 8 9629 (0) 8926 (0) 8802 (0) 821a (0)\n003 3 be2b b8f3 b8f9 | 5 b8f9 (0) b8f3 (0) be2b (0) b73b (0)\n004 1 a12b | 1 a12b (0)\n============ DEPTH: 5 ==========================================\n005 1 aabc | 1 aabc (0)\n006 0 | 0\n007 1 afb1 | 1 afb1 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"ae6023d416c87bb433eb9d8d44f97531797d292774304d996923a3fe67887478","private_key":"22c2fb65420237f8b89643102304e7ec4785bd727e32cf8d324a08c0c83bbcc9","name":"node_ae6023d416c87bb433eb9d8d44f97531797d292774304d996923a3fe67887478","services":["bzz","pss"],"enable_msg_events":true,"port":45469},"up":true}},{"node":{"info":{"id":"a12b12081b6d49e82378d5239765bca8c5f43232b30163bc46924cc3e98e1177","name":"node_a12b12081b6d49e82378d5239765bca8c5f43232b30163bc46924cc3e98e1177","enode":"enode://89914e07e3f818e5857dcf267822b10d9cf455fa7a2fa5b39ec98ad1f931ca0e8b152354d3514f26c9f1414aa10d95d96089819546a41a6f91a6e3c6d3399463@127.0.0.1:0","enr":"0xf88fb8400dc63a9d8ef5bc6b6aeef2fa584f5336ea901d50124c1606f8b2378173ebc2fd66efbc2bdcea10e1ae4587ac22cda0b5d5808a02865c0519648ccce893f76c9a0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10389914e07e3f818e5857dcf267822b10d9cf455fa7a2fa5b39ec98ad1f931ca0e","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"oSsSCBttSegjeNUjl2W8qMX0MjKzAWO8RpJMw+mOEXc=","hive":"\n=========================================================================\nThu Feb 28 17:44:10 UTC 2019 KΛÐΞMLIΛ hive: queen's address: a12b12\npopulation: 19 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 1455 154f 3103 | 30 154f (0) 1455 (0) 177e (0) 172b (0)\n001 3 e6cf eb30 f6e5 | 17 f6e5 (0) f0e9 (0) f211 (0) f35a (0)\n002 5 9629 8673 821a 8802 | 8 9629 (0) 8926 (0) 8802 (0) 821a (0)\n003 5 b73b b374 b8f3 b8f9 | 5 b8f9 (0) b8f3 (0) be2b (0) b73b (0)\n============ DEPTH: 4 ==========================================\n004 3 aabc afb1 ae60 | 3 aabc (0) afb1 (0) ae60 (0)\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"a12b12081b6d49e82378d5239765bca8c5f43232b30163bc46924cc3e98e1177","private_key":"d7090c3295beb236fb881805333f666cea56d6dea2f42bf3b4ac5b607c63808d","name":"node_a12b12081b6d49e82378d5239765bca8c5f43232b30163bc46924cc3e98e1177","services":["bzz","pss"],"enable_msg_events":true,"port":46387},"up":true}},{"node":{"info":{"id":"3103cd0b7654f593b7228d1715209f27e339ad014019a9738413a20cb6ac63e4","name":"node_3103cd0b7654f593b7228d1715209f27e339ad014019a9738413a20cb6ac63e4","enode":"enode://2566b869c3ead5eb369d120bdcfb5915162a7ab2b1ad732e88d9d977100c395a12867c8d6d2ce3be2dfed18ce3fc994523093fc48b01e1f7f6c1b9c6d2d2564e@127.0.0.1:0","enr":"0xf88fb84085e944ff27136b601bf818ec370a678631bb4b993981f6f37d4239904fd4c05c7a7bb06485217f380c84013e3ff57efd5f916325ce8929a2429a12af8a95a2bc0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1022566b869c3ead5eb369d120bdcfb5915162a7ab2b1ad732e88d9d977100c395a","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"MQPNC3ZU9ZO3Io0XFSCfJ+M5rQFAGalzhBOiDLasY+Q=","hive":"\n=========================================================================\nThu Feb 28 17:44:10 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 3103cd\npopulation: 15 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 856e a12b | 34 f6e5 (0) f0e9 (0) f35a (0) f211 (0)\n001 3 7f80 7d69 6123 | 13 7f80 (0) 7d69 (0) 703d (0) 70d0 (0)\n002 3 0486 177e 1455 | 9 154f (0) 1455 (0) 177e (0) 172b (0)\n003 3 274f 255d 248a | 3 274f (0) 255d (0) 248a (0)\n============ DEPTH: 4 ==========================================\n004 4 3b4f 3abf 38f0 3c40 | 4 3c40 (0) 38f0 (0) 3b4f (0) 3abf (0)\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"3103cd0b7654f593b7228d1715209f27e339ad014019a9738413a20cb6ac63e4","private_key":"95e6a35c4e714e2f717338757d55e091a179f90a24a9b669a758172f5685ca01","name":"node_3103cd0b7654f593b7228d1715209f27e339ad014019a9738413a20cb6ac63e4","services":["bzz","pss"],"enable_msg_events":true,"port":36983},"up":true}},{"node":{"info":{"id":"856e27ca689a9b2af4cd3ed958f2162b9c71074c726868ac7a10ac2f6f7d021d","name":"node_856e27ca689a9b2af4cd3ed958f2162b9c71074c726868ac7a10ac2f6f7d021d","enode":"enode://bed85f28b7443ca051f8cc01c76cc4b73c1f4d737c273cbb726decbe6e2f3b4b22529e7ae589c40805650784c8d367e53525041825bc8377747743342d1d5ffd@127.0.0.1:0","enr":"0xf88fb84059a5c37cb0e55cbcde717bcf88c22f5c5a45df4aa83358375f04b00efa5e65203ef0371f0755c1afc0d541bf9fab3e7292d4150fbafab8fbb2d627ef6b7605b50183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103bed85f28b7443ca051f8cc01c76cc4b73c1f4d737c273cbb726decbe6e2f3b4b","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"hW4nymiamyr0zT7ZWPIWK5xxB0xyaGisehCsL299Ah0=","hive":"\n=========================================================================\nThu Feb 28 17:44:10 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 856e27\npopulation: 14 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 38f0 3103 | 30 7d69 (0) 7f80 (0) 703d (0) 70d0 (0)\n001 3 c461 e5e1 f35a | 17 eb30 (0) ebf2 (0) e9fd (0) e6cf (0)\n002 2 b8f9 be2b | 9 b8f9 (0) b8f3 (0) be2b (0) b73b (0)\n003 1 9629 | 1 9629 (0)\n004 2 8926 8802 | 2 8926 (0) 8802 (0)\n005 1 821a | 1 821a (0)\n============ DEPTH: 6 ==========================================\n006 3 8673 87aa 87ac | 3 8673 (0) 87ac (0) 87aa (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"856e27ca689a9b2af4cd3ed958f2162b9c71074c726868ac7a10ac2f6f7d021d","private_key":"35fb992eb3f4de7a3ac9e68c81b4f1e62d1f474eedd1bbd0d6b588d4a123faa3","name":"node_856e27ca689a9b2af4cd3ed958f2162b9c71074c726868ac7a10ac2f6f7d021d","services":["bzz","pss"],"enable_msg_events":true,"port":42951},"up":true}},{"node":{"info":{"id":"88024b9f684346b775c1c1eb6e9709034135957ab418ec002725f10ef8919837","name":"node_88024b9f684346b775c1c1eb6e9709034135957ab418ec002725f10ef8919837","enode":"enode://e15ed0ea7080c438ee8f5e359fe828ea27f1cd348449b819cf9ec4df58dbac3a08423e6d525f011d5f41cecc440a49c9b12c6dc8ef3380b5bff38cf6b9ce0e11@127.0.0.1:0","enr":"0xf88fb840617403b8f0d402717d1f39440b4cf23b906c9df7c10b4c846599b0a4787e289b29afdd85207fcfe39147c0467347702bc44ce5da6fe7200a0e57dc2baa99433d0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103e15ed0ea7080c438ee8f5e359fe828ea27f1cd348449b819cf9ec4df58dbac3a","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"iAJLn2hDRrd1wcHrbpcJA0E1lXq0GOwAJyXxDviRmDc=","hive":"\n=========================================================================\nThu Feb 28 17:44:10 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 88024b\npopulation: 18 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 7f80 7d69 255d | 30 7d69 (0) 7f80 (0) 703d (0) 70d0 (0)\n001 3 ebf2 eb30 e5e1 | 17 eb30 (0) ebf2 (0) e9fd (0) e6cf (0)\n002 5 a12b b73b b374 b8f3 | 9 b8f9 (0) b8f3 (0) be2b (0) b73b (0)\n003 1 9629 | 1 9629 (0)\n============ DEPTH: 4 ==========================================\n004 5 821a 8673 87aa 87ac | 5 821a (0) 8673 (0) 87ac (0) 87aa (0)\n005 0 | 0\n006 0 | 0\n007 1 8926 | 1 8926 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"88024b9f684346b775c1c1eb6e9709034135957ab418ec002725f10ef8919837","private_key":"31dbecd3ca7aa370e3a50aaac4f98bef73f2527b1896da7ed889a43ad771c2e8","name":"node_88024b9f684346b775c1c1eb6e9709034135957ab418ec002725f10ef8919837","services":["bzz","pss"],"enable_msg_events":true,"port":40113},"up":true}},{"node":{"info":{"id":"255db8d311a66a7443b15d040afa06626d6919c0d20a6fd0f5afa34e87281732","name":"node_255db8d311a66a7443b15d040afa06626d6919c0d20a6fd0f5afa34e87281732","enode":"enode://bb25c5b1634689128e4f6bd8c31f0ac70a9b0dd37e9fbeda681e96ae04a19553f5534314a8e675e517d5ca0013bf79de3893a40c1c2734ef4243d1db4ed08060@127.0.0.1:0","enr":"0xf88fb840a4996422aeb3198fc58ab411a6910daa8a05d960911ef17cc7b14152653cd219771997a20423baa0c51b882a843135d99c31b01eabed91a4818f2cb573ab00660183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102bb25c5b1634689128e4f6bd8c31f0ac70a9b0dd37e9fbeda681e96ae04a19553","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"JV240xGmanRDsV0ECvoGYm1pGcDSCm/Q9a+jTocoFzI=","hive":"\n=========================================================================\nThu Feb 28 17:44:10 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 255db8\npopulation: 17 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 d3c1 d904 821a 8802 | 34 d904 (0) d3c1 (0) c461 (0) c3b2 (0)\n001 3 7d69 5e36 581a | 13 7d69 (0) 7f80 (0) 703d (0) 70d0 (0)\n002 3 0257 177e 172b | 9 154f (0) 1455 (0) 177e (0) 172b (0)\n003 5 3b4f 3abf 38f0 3c40 | 5 3103 (0) 3c40 (0) 38f0 (0) 3abf (0)\n============ DEPTH: 4 ==========================================\n004 0 | 0\n005 0 | 0\n006 1 274f | 1 274f (0)\n007 1 248a | 1 248a (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"255db8d311a66a7443b15d040afa06626d6919c0d20a6fd0f5afa34e87281732","private_key":"2ced13cc7febab95479e76339b80139922095bf66b8d47541c9bc22789123a9f","name":"node_255db8d311a66a7443b15d040afa06626d6919c0d20a6fd0f5afa34e87281732","services":["bzz","pss"],"enable_msg_events":true,"port":40487},"up":true}},{"node":{"info":{"id":"581ad92d4347834850c16e781983c09be340917527a35dd9650c5a3da1fc822b","name":"node_581ad92d4347834850c16e781983c09be340917527a35dd9650c5a3da1fc822b","enode":"enode://9096985dab960112b5511301c88595af2dc0a90852fc6a98c0970cd20b0b11ada5293e4f8b066fbaf3b0a207d51cf0e3d0a50ada11446814054b39e6265cda7e@127.0.0.1:0","enr":"0xf88fb8402f9d16c72c43c1856f7d778c531ea65e02a0450905075f9bdddc9c2938b042941177b8854391706ee69ca82d23eb5654fb434b767fa732ca8167c32c33f5e00a0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1029096985dab960112b5511301c88595af2dc0a90852fc6a98c0970cd20b0b11ad","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"WBrZLUNHg0hQwW54GYPAm+NAkXUno13ZZQxaPaH8gis=","hive":"\n=========================================================================\nThu Feb 28 17:44:10 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 581ad9\npopulation: 17 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 9629 d904 cb8d | 34 d904 (0) d3c1 (0) c461 (0) c3b2 (0)\n001 4 177e 154f 0727 255d | 17 154f (0) 1455 (0) 177e (0) 172b (0)\n002 3 703d 7d69 7f80 | 5 7d69 (0) 7f80 (0) 703d (0) 70d0 (0)\n003 1 452b | 1 452b (0)\n004 4 52fc 5508 57d9 5602 | 4 52fc (0) 5508 (0) 5602 (0) 57d9 (0)\n============ DEPTH: 5 ==========================================\n005 2 5e36 5f83 | 2 5e36 (0) 5f83 (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"581ad92d4347834850c16e781983c09be340917527a35dd9650c5a3da1fc822b","private_key":"39aed43a62aad671048b07d25383bb957d88b3bd53c0a52a9b73f132241f47bd","name":"node_581ad92d4347834850c16e781983c09be340917527a35dd9650c5a3da1fc822b","services":["bzz","pss"],"enable_msg_events":true,"port":38101},"up":true}},{"node":{"info":{"id":"0727d7e68c319d3a4cc5a161dd05b2a7e72350c139e65c2090c1232ebbed5f78","name":"node_0727d7e68c319d3a4cc5a161dd05b2a7e72350c139e65c2090c1232ebbed5f78","enode":"enode://90b8c983944e79f3081d0e6e7538f2e6fe78ba7a63412aa32fb3b08b02ed6efad44f45d6e2db83d67a03d0242e3ffd8e62703f0e4e6b74e48331c6b3a8c51db1@127.0.0.1:0","enr":"0xf88fb8409af7b76fd8c8b31f077a6f2fd5be9cd7b6f5f7d1c0dcd1d517334d649fc9f8140f432c4c4641c970093b46b75371213bf7e3e21e3b0e486e4160a092d71f53310183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10390b8c983944e79f3081d0e6e7538f2e6fe78ba7a63412aa32fb3b08b02ed6efa","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"ByfX5owxnTpMxaFh3QWyp+cjUME55lwgkMEjLrvtX3g=","hive":"\n=========================================================================\nThu Feb 28 17:44:10 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 0727d7\npopulation: 15 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 d3c1 d904 cb8d | 34 d904 (0) d3c1 (0) c461 (0) c3b2 (0)\n001 2 6123 581a | 13 7d69 (0) 7f80 (0) 703d (0) 70d0 (0)\n002 2 3c40 274f | 8 3103 (0) 3c40 (0) 38f0 (0) 3abf (0)\n003 4 172b 177e 1455 154f | 4 154f (0) 1455 (0) 177e (0) 172b (0)\n004 1 0acb | 1 0acb (0)\n============ DEPTH: 5 ==========================================\n005 2 0257 00ba | 2 00ba (0) 0257 (0)\n006 1 0486 | 1 0486 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"0727d7e68c319d3a4cc5a161dd05b2a7e72350c139e65c2090c1232ebbed5f78","private_key":"312ee0e8a214abbd131a0e03c9c30710cbea185776d03bc7e6319eb1ce1d8c9d","name":"node_0727d7e68c319d3a4cc5a161dd05b2a7e72350c139e65c2090c1232ebbed5f78","services":["bzz","pss"],"enable_msg_events":true,"port":34603},"up":true}},{"node":{"info":{"id":"6123b7777de3bc2591e3036a9adeba1f7d8ec933d05ee4fe0017910896925d1b","name":"node_6123b7777de3bc2591e3036a9adeba1f7d8ec933d05ee4fe0017910896925d1b","enode":"enode://9a0af04a8b33cefc1178e827baadd6211134e17e6d17dda345d9a1af47e657e487d46382b137bd50829a3b49663160237c9c4ae9e5aa57249791029026b71ad8@127.0.0.1:0","enr":"0xf88fb8408d49aa1cfaa238a09955f64747940c56d3e4efcb913e43f3f12bc586038ec8a40405758ebe81aeba159213fe543a4c60c4119097c6eec92157eba0659cd944b60183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1029a0af04a8b33cefc1178e827baadd6211134e17e6d17dda345d9a1af47e657e4","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"YSO3d33jvCWR4wNqmt66H32OyTPQXuT+ABeRCJaSXRs=","hive":"\n=========================================================================\nThu Feb 28 17:44:10 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 6123b7\npopulation: 33 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 13 aabc ebf2 e9fd e5e1 | 34 d904 (0) d3c1 (0) c461 (0) c3b2 (0)\n001 9 38f0 3b4f 3c40 3103 | 17 3103 (0) 3c40 (0) 38f0 (0) 3abf (0)\n002 7 452b 5e36 5f83 52fc | 8 452b (0) 5508 (0) 5602 (0) 57d9 (0)\n============ DEPTH: 3 ==========================================\n003 4 703d 70d0 7f80 7d69 | 4 7d69 (0) 7f80 (0) 703d (0) 70d0 (0)\n004 0 | 0\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"6123b7777de3bc2591e3036a9adeba1f7d8ec933d05ee4fe0017910896925d1b","private_key":"a32ad9e8eb034068af76013c458a289d8bb4faf6000aa63666404d8be13bf5d6","name":"node_6123b7777de3bc2591e3036a9adeba1f7d8ec933d05ee4fe0017910896925d1b","services":["bzz","pss"],"enable_msg_events":true,"port":37555},"up":true}},{"node":{"info":{"id":"04862550ef38f831085f378e2533addc2c904288394631208c49cb33615ada3b","name":"node_04862550ef38f831085f378e2533addc2c904288394631208c49cb33615ada3b","enode":"enode://0314da640d0324270183587d5ee38b6d7f82082def277f1fa70f2dff054becdaab3c31aa4921f4bdeb7f4c31adc8a70ad09609868642101b3e63eaab91727d69@127.0.0.1:0","enr":"0xf88fb84082ed1045bb3ffd5e7d12ace534321c835e31ed2db07e7eb5bfc3bb200d7e0fb23f55e4975e73ed36e6de025624ddc499148b4d9d8001734be2cd014a9e84cb8d0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1030314da640d0324270183587d5ee38b6d7f82082def277f1fa70f2dff054becda","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"BIYlUO84+DEIXzeOJTOt3CyQQog5RjEgjEnLM2Fa2js=","hive":"\n=========================================================================\nThu Feb 28 17:44:10 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 048625\npopulation: 17 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 b374 cb8d c0c2 | 34 be2b (0) b8f9 (0) b8f3 (0) b73b (0)\n001 2 57d9 6123 | 13 452b (0) 581a (0) 5e36 (0) 5f83 (0)\n002 4 3c40 3103 274f 248a | 8 3103 (0) 3c40 (0) 38f0 (0) 3abf (0)\n003 4 172b 177e 154f 1455 | 4 154f (0) 1455 (0) 177e (0) 172b (0)\n004 1 0acb | 1 0acb (0)\n============ DEPTH: 5 ==========================================\n005 2 0257 00ba | 2 00ba (0) 0257 (0)\n006 1 0727 | 1 0727 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"04862550ef38f831085f378e2533addc2c904288394631208c49cb33615ada3b","private_key":"dadc2a0436842f90010d95ae0b3d5e1612d72a28854573e679a8a336f5370e21","name":"node_04862550ef38f831085f378e2533addc2c904288394631208c49cb33615ada3b","services":["bzz","pss"],"enable_msg_events":true,"port":46049},"up":true}},{"node":{"info":{"id":"248a2e618091deeac458f4741616405e0bc5ffda1a9f9125307e32c781728a75","name":"node_248a2e618091deeac458f4741616405e0bc5ffda1a9f9125307e32c781728a75","enode":"enode://7f0f82c32f25e019be8cba115eba217f82432b010a401a273037351dca0b5c61089825d7b034801b2876318500c566b1991d1efcde1466bdcfee6a128c3bf81a@127.0.0.1:0","enr":"0xf88fb840bfa5193ddceefc65d57437eff8a7a774354003033fd5224a4d2edc41e43b3f5d50f4ea4346ea045e6985ccb53ff48ba17b317e791010248dbfa996b83c429aad0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1027f0f82c32f25e019be8cba115eba217f82432b010a401a273037351dca0b5c61","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"JIouYYCR3urEWPR0FhZAXgvF/9oan5ElMH4yx4FyinU=","hive":"\n=========================================================================\nThu Feb 28 17:44:10 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 248a2e\npopulation: 15 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 e6cf ae60 | 34 aabc (0) afb1 (0) ae60 (0) a12b (0)\n001 2 5e36 452b | 13 6123 (0) 7d69 (0) 7f80 (0) 703d (0)\n002 4 172b 0257 00ba 0486 | 9 154f (0) 1455 (0) 177e (0) 172b (0)\n003 5 3103 3c40 3b4f 3abf | 5 3103 (0) 3c40 (0) 38f0 (0) 3abf (0)\n============ DEPTH: 4 ==========================================\n004 0 | 0\n005 0 | 0\n006 1 274f | 1 274f (0)\n007 1 255d | 1 255d (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"248a2e618091deeac458f4741616405e0bc5ffda1a9f9125307e32c781728a75","private_key":"5eed72a77466e0457f248c4b926ad580c90bac7ee1e11bca5d5d20a9d2bfab5d","name":"node_248a2e618091deeac458f4741616405e0bc5ffda1a9f9125307e32c781728a75","services":["bzz","pss"],"enable_msg_events":true,"port":35737},"up":true}},{"node":{"info":{"id":"172bbbcaa57c37c24314a84fbd0b9de45f83a46016bd2395dc2adbab1bb90b5c","name":"node_172bbbcaa57c37c24314a84fbd0b9de45f83a46016bd2395dc2adbab1bb90b5c","enode":"enode://a9a9c0be91c80c150ed76c716242763e92cfd34102db458614b97a2fdc1aa9046a873d2e16d6b720a82abef0c3d3afe50c548e82064081f6d3722bfaa8ad5a7a@127.0.0.1:0","enr":"0xf88fb840af989a0c29715008d7c936ddbe8af501a4904339da4b799f99369a5ae9937a805b29f031c54f88d358a298b4ecd360bc06b55108ecaecb17a31f9902f367f44c0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102a9a9c0be91c80c150ed76c716242763e92cfd34102db458614b97a2fdc1aa904","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"Fyu7yqV8N8JDFKhPvQud5F+DpGAWvSOV3Crbqxu5C1w=","hive":"\n=========================================================================\nThu Feb 28 17:44:10 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 172bbb\npopulation: 15 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 afb1 aabc fb7e | 34 aabc (0) afb1 (0) ae60 (0) a12b (0)\n001 2 6123 70d0 | 13 6123 (0) 7d69 (0) 7f80 (0) 703d (0)\n002 2 255d 248a | 8 3103 (0) 3c40 (0) 38f0 (0) 3abf (0)\n003 5 0486 0727 0257 00ba | 5 0acb (0) 00ba (0) 0257 (0) 0727 (0)\n============ DEPTH: 4 ==========================================\n004 0 | 0\n005 0 | 0\n006 2 1455 154f | 2 1455 (0) 154f (0)\n007 0 | 0\n008 0 | 0\n009 1 177e | 1 177e (0)\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"172bbbcaa57c37c24314a84fbd0b9de45f83a46016bd2395dc2adbab1bb90b5c","private_key":"2016f3bc79c1f5a91c126a6f548bdd080c149e46cb1165cf1002068c6fcda411","name":"node_172bbbcaa57c37c24314a84fbd0b9de45f83a46016bd2395dc2adbab1bb90b5c","services":["bzz","pss"],"enable_msg_events":true,"port":42303},"up":true}},{"node":{"info":{"id":"fb7e6716614ac941b74e18a9bf3ded63bc00b453221b40976f783675a1c06c63","name":"node_fb7e6716614ac941b74e18a9bf3ded63bc00b453221b40976f783675a1c06c63","enode":"enode://f9175ab3d792f133155a959560213cc1c01279ed6e348a68906d8a96a87596baf128933900518e8d6aa1fda56b7139b3dc74dbb690196147ab6480b498c65dd1@127.0.0.1:0","enr":"0xf88fb8400494ee532414babfb684947ef027e954af32abe1255703856100999a37a3b27d4e3e6728f46532dffdb89272cb1948f5bc6df766b40fdd2797bed3c8148074870183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103f9175ab3d792f133155a959560213cc1c01279ed6e348a68906d8a96a87596ba","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"+35nFmFKyUG3Thipvz3tY7wAtFMiG0CXb3g2daHAbGM=","hive":"\n=========================================================================\nThu Feb 28 17:44:10 UTC 2019 KΛÐΞMLIΛ hive: queen's address: fb7e67\npopulation: 21 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 5508 7d69 6123 172b | 30 6123 (0) 7d69 (0) 7f80 (0) 703d (0)\n001 5 8926 b73b aabc ae60 | 17 aabc (0) afb1 (0) ae60 (0) a12b (0)\n002 3 c3b2 cb8d d904 | 6 d904 (0) d3c1 (0) c461 (0) c3b2 (0)\n003 5 e558 e6cf e9fd eb30 | 6 e6cf (0) e558 (0) e5e1 (0) e9fd (0)\n============ DEPTH: 4 ==========================================\n004 4 f6e5 f0e9 f35a f211 | 4 f6e5 (0) f0e9 (0) f35a (0) f211 (0)\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"fb7e6716614ac941b74e18a9bf3ded63bc00b453221b40976f783675a1c06c63","private_key":"8b2673cf73b2e993026f6a2c87caae15dba45720ad187f9c5f5ddbdc7d1b32a4","name":"node_fb7e6716614ac941b74e18a9bf3ded63bc00b453221b40976f783675a1c06c63","services":["bzz","pss"],"enable_msg_events":true,"port":40621},"up":true}},{"node":{"info":{"id":"f211376d46e6e0966ee984cf5837805240b2ba53c5ac75315c56dbdffb957a65","name":"node_f211376d46e6e0966ee984cf5837805240b2ba53c5ac75315c56dbdffb957a65","enode":"enode://3595a73fde880c53304b49c39683267c4fa90fa5773dc084a1affc7999314e2dab768ab82091fe068bb824cd54277129cc6f5d0065d9f2dfcf3392c048dcb7c5@127.0.0.1:0","enr":"0xf88fb840e00692e06d4b89b7bdd43adeba6626c5e4bba8988449a048ff3ce2ba802dad3a6f8c07c23a5d3ff37562cec16cff3eae3fb2dfd4e825a8e07ea04a4fa1a054b80183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1033595a73fde880c53304b49c39683267c4fa90fa5773dc084a1affc7999314e2d","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"8hE3bUbm4JZu6YTPWDeAUkCyulPFrHUxXFbb3/uVemU=","hive":"\n=========================================================================\nThu Feb 28 17:44:10 UTC 2019 KΛÐΞMLIΛ hive: queen's address: f21137\npopulation: 13 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 6123 3b4f | 30 6123 (0) 7f80 (0) 7d69 (0) 703d (0)\n001 2 b73b ae60 | 17 aabc (0) afb1 (0) ae60 (0) a12b (0)\n002 2 c0c2 c461 | 6 c461 (0) c0c2 (0) c3b2 (0) cb8d (0)\n003 3 e5e1 e558 e6cf | 6 e6cf (0) e558 (0) e5e1 (0) e9fd (0)\n004 1 fb7e | 1 fb7e (0)\n005 1 f6e5 | 1 f6e5 (0)\n============ DEPTH: 6 ==========================================\n006 1 f0e9 | 1 f0e9 (0)\n007 1 f35a | 1 f35a (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"f211376d46e6e0966ee984cf5837805240b2ba53c5ac75315c56dbdffb957a65","private_key":"cc85dc8007f84a1a4cef3b3f84345cf6212741fe8451882613368b13b8a21170","name":"node_f211376d46e6e0966ee984cf5837805240b2ba53c5ac75315c56dbdffb957a65","services":["bzz","pss"],"enable_msg_events":true,"port":33599},"up":true}},{"node":{"info":{"id":"3b4fa7d729129068a1281ef68494b61d055203de8c36a5fe27af3eb565832108","name":"node_3b4fa7d729129068a1281ef68494b61d055203de8c36a5fe27af3eb565832108","enode":"enode://185474977590e399a3bde82710d24deebb17ec414f3fa17d70550ccc7fd742d881f76c5ad58e5854b3cdc16d27789332ba975d840218a363adf9950251006852@127.0.0.1:0","enr":"0xf88fb84041802a5fbc1bf6e457fed3480b3d38fc2bd3d3fa40ca619ef6a09d58e5c1873958cd6cb13ab6d0709a9ee1172496e623f5c6d1ab202915f54b3f3bff6d1923ef0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102185474977590e399a3bde82710d24deebb17ec414f3fa17d70550ccc7fd742d8","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"O0+n1ykSkGihKB72hJS2HQVSA96MNqX+J68+tWWDIQg=","hive":"\n=========================================================================\nThu Feb 28 17:44:10 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 3b4fa7\npopulation: 13 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 87aa f211 | 34 aabc (0) afb1 (0) ae60 (0) a12b (0)\n001 2 6123 703d | 13 6123 (0) 7f80 (0) 7d69 (0) 703d (0)\n002 2 0acb 00ba | 9 0acb (0) 00ba (0) 0257 (0) 0486 (0)\n003 3 255d 248a 274f | 3 274f (0) 255d (0) 248a (0)\n004 1 3103 | 1 3103 (0)\n005 1 3c40 | 1 3c40 (0)\n============ DEPTH: 6 ==========================================\n006 1 38f0 | 1 38f0 (0)\n007 1 3abf | 1 3abf (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"3b4fa7d729129068a1281ef68494b61d055203de8c36a5fe27af3eb565832108","private_key":"6ad42cf2ce8ec2d947696df2ab9fd0b464376964980f542777118020ce0e5d7b","name":"node_3b4fa7d729129068a1281ef68494b61d055203de8c36a5fe27af3eb565832108","services":["bzz","pss"],"enable_msg_events":true,"port":33419},"up":true}},{"node":{"info":{"id":"87aa77dcef19b0c86a3e8ab64c8f12d9a733e77a7e12bcaec3a4cd8504c5a775","name":"node_87aa77dcef19b0c86a3e8ab64c8f12d9a733e77a7e12bcaec3a4cd8504c5a775","enode":"enode://35b27d332ce1f35bec177a8c636960cbfb79cf58bb3f2d1b874231b382a0cdc590c4e8353decd2fe3b1b4f8542b03f2171425bff56edccbbd15272b3cace9a0e@127.0.0.1:0","enr":"0xf88fb8407dbd42f95e5ae03d53a9da07975ce124ffe18be69ad76c445cd2cb001e85da44048d49dca08d4efae5512882c98113f26c2f540eba64a1fd289c35fafa598c040183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10235b27d332ce1f35bec177a8c636960cbfb79cf58bb3f2d1b874231b382a0cdc5","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"h6p33O8ZsMhqPoq2TI8S2acz53p+Eryuw6TNhQTFp3U=","hive":"\n=========================================================================\nThu Feb 28 17:44:10 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 87aa77\npopulation: 15 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 3b4f 70d0 | 30 0acb (0) 00ba (0) 0257 (0) 0486 (0)\n001 4 e558 c461 cb8d d904 | 17 cb8d (0) c461 (0) c0c2 (0) c3b2 (0)\n002 2 afb1 aabc | 9 aabc (0) afb1 (0) ae60 (0) a12b (0)\n003 1 9629 | 1 9629 (0)\n004 2 8926 8802 | 2 8802 (0) 8926 (0)\n005 1 821a | 1 821a (0)\n006 1 856e | 1 856e (0)\n============ DEPTH: 7 ==========================================\n007 1 8673 | 1 8673 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 1 87ac | 1 87ac (0)\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"87aa77dcef19b0c86a3e8ab64c8f12d9a733e77a7e12bcaec3a4cd8504c5a775","private_key":"f61f38cd9320f5d79569492609fbc059d0c28376d87733386c34ed0ee05f9b52","name":"node_87aa77dcef19b0c86a3e8ab64c8f12d9a733e77a7e12bcaec3a4cd8504c5a775","services":["bzz","pss"],"enable_msg_events":true,"port":45677},"up":true}},{"node":{"info":{"id":"70d0710b3894fabf32b343b9b59339f786ece39895c7eda5f162cc575c9c8253","name":"node_70d0710b3894fabf32b343b9b59339f786ece39895c7eda5f162cc575c9c8253","enode":"enode://75f2fb6caf9b53cf0b82b5c6751b2d06f05decbce5a26d8196d2240fdc8b8cb7cfdac4f123838a8895d81578515dcd5b07ed1ff432667c175ca092bb241e5d81@127.0.0.1:0","enr":"0xf88fb840ca369a7e8bad45d547ba1b43054168da9813f7ebf8143be24488270f9cf1a3373939a5b2c228aa93a6857cc0b50be949c909531bb4269dfce238c9433aca848e0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10375f2fb6caf9b53cf0b82b5c6751b2d06f05decbce5a26d8196d2240fdc8b8cb7","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"cNBxCziU+r8ys0O5tZM594bs45iVx+2l8WLMV1ycglM=","hive":"\n=========================================================================\nThu Feb 28 17:44:10 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 70d071\npopulation: 15 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 f0e9 e558 e9fd ebf2 | 34 cb8d (0) c461 (0) c0c2 (0) c3b2 (0)\n001 4 3c40 0acb 00ba 172b | 17 0acb (0) 00ba (0) 0257 (0) 0486 (0)\n002 2 57d9 52fc | 8 452b (0) 581a (0) 5e36 (0) 5f83 (0)\n003 1 6123 | 1 6123 (0)\n============ DEPTH: 4 ==========================================\n004 2 7d69 7f80 | 2 7d69 (0) 7f80 (0)\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 1 703d | 1 703d (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"70d0710b3894fabf32b343b9b59339f786ece39895c7eda5f162cc575c9c8253","private_key":"c1017fa00e291b4183d30ab17ef32b438afcfd234be6cecbb9897bdb585a9a86","name":"node_70d0710b3894fabf32b343b9b59339f786ece39895c7eda5f162cc575c9c8253","services":["bzz","pss"],"enable_msg_events":true,"port":39215},"up":true}},{"node":{"info":{"id":"52fc1e219bc518fbaf289da3236d98db1b63df1227ea32581229671473adc3bd","name":"node_52fc1e219bc518fbaf289da3236d98db1b63df1227ea32581229671473adc3bd","enode":"enode://b0a77e6fe1c5bc0275bbb7eca27007740ae80fe424fe6acf055bf84789dc99a14280d8c08d2d3a0cc7c2b996c091a5059ed083a8f289704b6e82234b20815447@127.0.0.1:0","enr":"0xf88fb840b35c45f9ad29f754a3318f771140615e64a3fc523df8dc7d6e4aba4bcafa4642422ae39afe0eba129bf9519377d0026bd546255261f4388dc0a7c89d2752e23c0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103b0a77e6fe1c5bc0275bbb7eca27007740ae80fe424fe6acf055bf84789dc99a1","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"UvweIZvFGPuvKJ2jI22Y2xtj3xIn6jJYEilnFHOtw70=","hive":"\n=========================================================================\nThu Feb 28 17:44:10 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 52fc1e\npopulation: 15 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 c461 cb8d b374 | 34 cb8d (0) c461 (0) c0c2 (0) c3b2 (0)\n001 2 00ba 0257 | 17 0acb (0) 00ba (0) 0257 (0) 0486 (0)\n002 3 6123 7d69 70d0 | 5 6123 (0) 7d69 (0) 7f80 (0) 703d (0)\n003 1 452b | 1 452b (0)\n004 3 581a 5f83 5e36 | 3 581a (0) 5e36 (0) 5f83 (0)\n============ DEPTH: 5 ==========================================\n005 3 5508 57d9 5602 | 3 57d9 (0) 5602 (0) 5508 (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"52fc1e219bc518fbaf289da3236d98db1b63df1227ea32581229671473adc3bd","private_key":"5128d9e0c20a65b00ada80037610ab8459cb99a9bc3cbc467f90e3d94868636e","name":"node_52fc1e219bc518fbaf289da3236d98db1b63df1227ea32581229671473adc3bd","services":["bzz","pss"],"enable_msg_events":true,"port":37815},"up":true}},{"node":{"info":{"id":"b3744cf6f180c2eb9a1ded0e6ddd600d5f79268387b97333070fb5a183affd89","name":"node_b3744cf6f180c2eb9a1ded0e6ddd600d5f79268387b97333070fb5a183affd89","enode":"enode://bddef211431764890d0c556f02492d623440dadef8220aa3d14cc5a4a176c0c6a3d9c51db26fa8d00e3b2919ae01708c6ccbcfb89300889f763e88e88f1cf62f@127.0.0.1:0","enr":"0xf88fb840fa92fb538dc1f10b99bd1a5ff04542a013336d8c78c82d02689092893de2558d3be1b76e10a87b2976ab77dba021345e4da01bcf57e968f16179262cbb7f7b610183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103bddef211431764890d0c556f02492d623440dadef8220aa3d14cc5a4a176c0c6","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"s3RM9vGAwuuaHe0Obd1gDV95JoOHuXMzBw+1oYOv/Yk=","hive":"\n=========================================================================\nThu Feb 28 17:44:10 UTC 2019 KΛÐΞMLIΛ hive: queen's address: b3744c\npopulation: 16 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 0486 274f 52fc | 30 0acb (0) 00ba (0) 0257 (0) 0486 (0)\n001 3 cb8d c461 c3b2 | 17 cb8d (0) c461 (0) c0c2 (0) c3b2 (0)\n002 3 9629 8802 8673 | 8 9629 (0) 8802 (0) 8926 (0) 821a (0)\n003 3 a12b afb1 aabc | 4 a12b (0) aabc (0) ae60 (0) afb1 (0)\n============ DEPTH: 4 ==========================================\n004 3 be2b b8f9 b8f3 | 3 be2b (0) b8f3 (0) b8f9 (0)\n005 1 b73b | 1 b73b (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"b3744cf6f180c2eb9a1ded0e6ddd600d5f79268387b97333070fb5a183affd89","private_key":"f9b4401c90628262d75ec2b1472b181d0ba586f207e512d8c2bff501f6969006","name":"node_b3744cf6f180c2eb9a1ded0e6ddd600d5f79268387b97333070fb5a183affd89","services":["bzz","pss"],"enable_msg_events":true,"port":39313},"up":true}},{"node":{"info":{"id":"274f8b752ef0c84a5c3098066b0b4d1c02b8a1b1730f59ed94064535eeda4756","name":"node_274f8b752ef0c84a5c3098066b0b4d1c02b8a1b1730f59ed94064535eeda4756","enode":"enode://cd29948d6981370c284ab296a55d43dbe7203b54193b763b157977ad2952be300cafaad9cb5d51517a90c64254bc6a0e9b50e40f37487d9a824ff9f6a442d543@127.0.0.1:0","enr":"0xf88fb8400df64191c8bf59e9ac7ad80c636ae992d431ba5d833d277a482b3d374ef08eb8697eef5cbddfdf88bb8e260cb007083c6e9333a667d0cb7e4560630ceeb951820183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103cd29948d6981370c284ab296a55d43dbe7203b54193b763b157977ad2952be30","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"J0+LdS7wyEpcMJgGawtNHAK4obFzD1ntlAZFNe7aR1Y=","hive":"\n=========================================================================\nThu Feb 28 17:44:10 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 274f8b\npopulation: 20 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 cb8d 87ac 821a b8f9 | 34 cb8d (0) c461 (0) c0c2 (0) c3b2 (0)\n001 4 703d 5508 5e36 5f83 | 13 6123 (0) 7f80 (0) 7d69 (0) 703d (0)\n002 4 154f 0acb 0486 0727 | 9 0acb (0) 0486 (0) 0727 (0) 00ba (0)\n003 5 3103 3c40 38f0 3b4f | 5 3103 (0) 3c40 (0) 38f0 (0) 3abf (0)\n============ DEPTH: 4 ==========================================\n004 0 | 0\n005 0 | 0\n006 2 255d 248a | 2 255d (0) 248a (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"274f8b752ef0c84a5c3098066b0b4d1c02b8a1b1730f59ed94064535eeda4756","private_key":"7ff83f61deceac3be4f65ab071b30e2906485aa9b9cf9762915bdab24ad3095d","name":"node_274f8b752ef0c84a5c3098066b0b4d1c02b8a1b1730f59ed94064535eeda4756","services":["bzz","pss"],"enable_msg_events":true,"port":37995},"up":true}},{"node":{"info":{"id":"5f832158cf84e0e48a3518955878b16ae253467f54664eb4ec1213fefc3f3277","name":"node_5f832158cf84e0e48a3518955878b16ae253467f54664eb4ec1213fefc3f3277","enode":"enode://a75b279e617f6db28bac0fc33337d87e284116d2e3e069685fe1f42f46fdea15c51124ed699840d171f47d4778553e545475580f510a2ec4f830fedf460df0d6@127.0.0.1:0","enr":"0xf88fb840ef24e78bea8bf572427a95c9bf7cb2faffec0a4a430715acd4aadcdcdb78125e54a5d26f68b4d1be1551eb00e29157acb4b1692b27e80546b20bfd2dd0cd43a70183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102a75b279e617f6db28bac0fc33337d87e284116d2e3e069685fe1f42f46fdea15","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"X4MhWM+E4OSKNRiVWHixauJTRn9UZk607BIT/vw/Mnc=","hive":"\n=========================================================================\nThu Feb 28 17:44:10 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 5f8321\npopulation: 14 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 cb8d c461 c3b2 | 34 cb8d (0) c461 (0) c0c2 (0) c3b2 (0)\n001 2 1455 274f | 17 1455 (0) 154f (0) 177e (0) 172b (0)\n002 2 6123 703d | 5 6123 (0) 7d69 (0) 7f80 (0) 703d (0)\n003 1 452b | 1 452b (0)\n004 4 52fc 5508 5602 57d9 | 4 57d9 (0) 5602 (0) 5508 (0) 52fc (0)\n============ DEPTH: 5 ==========================================\n005 1 581a | 1 581a (0)\n006 0 | 0\n007 1 5e36 | 1 5e36 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"5f832158cf84e0e48a3518955878b16ae253467f54664eb4ec1213fefc3f3277","private_key":"d19565076e49cecdfa86edf90fdaae204fb957d2aa8d76158101247c371fbecd","name":"node_5f832158cf84e0e48a3518955878b16ae253467f54664eb4ec1213fefc3f3277","services":["bzz","pss"],"enable_msg_events":true,"port":45427},"up":true}},{"node":{"info":{"id":"452b07d73433e7d6c205a504419ae100019aa1920723011272b596607db6684a","name":"node_452b07d73433e7d6c205a504419ae100019aa1920723011272b596607db6684a","enode":"enode://dea46c610b096ce0543a2ecbed5434bf207a65a42457ddbc6c3132b6809d56a4b3037879121fd53a0c2c0c92fb3736f8373c987c1ba95992e53e2dbf8f35cb79@127.0.0.1:0","enr":"0xf88fb84083953db305d8b6d3f2a3d38e0e8f81c2381c85a3d80ffe54c2a6582a7076e63124e85a302030bc72cf9e748b50ce103fb12c6cd072472f538ff96ccdb08359300183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103dea46c610b096ce0543a2ecbed5434bf207a65a42457ddbc6c3132b6809d56a4","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"RSsH1zQz59bCBaUEQZrhAAGaoZIHIwEScrWWYH22aEo=","hive":"\n=========================================================================\nThu Feb 28 17:44:10 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 452b07\npopulation: 19 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 c461 cb8d 9629 8673 | 34 cb8d (0) c461 (0) c0c2 (0) c3b2 (0)\n001 5 3abf 248a 177e 154f | 17 274f (0) 255d (0) 248a (0) 3103 (0)\n002 3 7d69 7f80 6123 | 5 6123 (0) 7d69 (0) 7f80 (0) 703d (0)\n============ DEPTH: 3 ==========================================\n003 7 52fc 5508 57d9 5602 | 7 57d9 (0) 5602 (0) 5508 (0) 52fc (0)\n004 0 | 0\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"452b07d73433e7d6c205a504419ae100019aa1920723011272b596607db6684a","private_key":"92e76eb57823fd78556776b404da0b21c27ef8c4824adef769ea1c5f49ae3db9","name":"node_452b07d73433e7d6c205a504419ae100019aa1920723011272b596607db6684a","services":["bzz","pss"],"enable_msg_events":true,"port":33293},"up":true}},{"node":{"info":{"id":"86735a46da76b3132f729b293b4d8502e939ecba776b8d85b3ae73efa2184b5f","name":"node_86735a46da76b3132f729b293b4d8502e939ecba776b8d85b3ae73efa2184b5f","enode":"enode://2733db14205f39cf4a5f52580a937dccc7220e36a80b7c541c95e9f5f1ab651bd96f451fecc2e2cdab225fc0e37fc63b70f3a4e84d99ceb7c2d7f1bf0a0f39f6@127.0.0.1:0","enr":"0xf88fb84044d30c7582fe27aa3b8c55da3f032e7cb56b288e44baf86177cfde6ed4c9149015288e5ba011d1c31348e0f182578ce8e67d5005e9643a93d79062b0b49214570183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1022733db14205f39cf4a5f52580a937dccc7220e36a80b7c541c95e9f5f1ab651b","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"hnNaRtp2sxMvcpspO02FAuk57Lp3a42Fs65z76IYS18=","hive":"\n=========================================================================\nThu Feb 28 17:44:10 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 86735a\npopulation: 15 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 452b 5e36 | 30 274f (0) 255d (0) 248a (0) 3103 (0)\n001 2 cb8d c3b2 | 17 cb8d (0) c461 (0) c0c2 (0) c3b2 (0)\n002 4 a12b afb1 be2b b374 | 9 b73b (0) b374 (0) be2b (0) b8f3 (0)\n003 1 9629 | 1 9629 (0)\n004 2 8802 8926 | 2 8926 (0) 8802 (0)\n005 1 821a | 1 821a (0)\n006 1 856e | 1 856e (0)\n============ DEPTH: 7 ==========================================\n007 2 87aa 87ac | 2 87aa (0) 87ac (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"86735a46da76b3132f729b293b4d8502e939ecba776b8d85b3ae73efa2184b5f","private_key":"b24570a9ec33187bd0150552ac01cdd88eec842a46287b6ac1b2deb18f33e085","name":"node_86735a46da76b3132f729b293b4d8502e939ecba776b8d85b3ae73efa2184b5f","services":["bzz","pss"],"enable_msg_events":true,"port":40543},"up":true}},{"node":{"info":{"id":"5e36542bbbc0d70231c9d00742cb30fccf3f206eecf10a0f34332a2986c86ffb","name":"node_5e36542bbbc0d70231c9d00742cb30fccf3f206eecf10a0f34332a2986c86ffb","enode":"enode://6828133036c9b44a750ebe723643ebb654f1e58df2ceeebc03acfb272369884cb2d2d655af0643f45967522375b8ffead57932e55b3b7dcfb52c9f7d82f137b9@127.0.0.1:0","enr":"0xf88fb84028bf1f9f6157f4c3f2d4ef7e1ea62299c768b52e33444503387ea891297151581142a59adab791688ddb3eac52f9b5edfedc501289011d1b817c4cbe2bada5770183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1036828133036c9b44a750ebe723643ebb654f1e58df2ceeebc03acfb272369884c","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"XjZUK7vA1wIxydAHQssw/M8/IG7s8QoPNDMqKYbIb/s=","hive":"\n=========================================================================\nThu Feb 28 17:44:10 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 5e3654\npopulation: 17 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 9629 87ac 8673 | 34 cb8d (0) c461 (0) c0c2 (0) c3b2 (0)\n001 4 154f 274f 255d 248a | 17 274f (0) 255d (0) 248a (0) 3103 (0)\n002 3 6123 7d69 703d | 5 6123 (0) 7f80 (0) 7d69 (0) 703d (0)\n003 1 452b | 1 452b (0)\n004 4 52fc 5508 57d9 5602 | 4 57d9 (0) 5602 (0) 5508 (0) 52fc (0)\n============ DEPTH: 5 ==========================================\n005 1 581a | 1 581a (0)\n006 0 | 0\n007 1 5f83 | 1 5f83 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"5e36542bbbc0d70231c9d00742cb30fccf3f206eecf10a0f34332a2986c86ffb","private_key":"89f0ff7aa444ba31932f2d98ccf6dfd9c65ff023efd774671320ecaf9a928885","name":"node_5e36542bbbc0d70231c9d00742cb30fccf3f206eecf10a0f34332a2986c86ffb","services":["bzz","pss"],"enable_msg_events":true,"port":45057},"up":true}},{"node":{"info":{"id":"87acf64b22c579751718dc093c00c82b39feb7023fe53c6486b288960ad9e146","name":"node_87acf64b22c579751718dc093c00c82b39feb7023fe53c6486b288960ad9e146","enode":"enode://fd65f331dd55b301498b1fd8690370c2150ce0c0cb0eba8fafb9401b873683998d605be7cbf6b1e4653a44decd3ce45eb6666582fb64a1549b8d6f6ea5136ccc@127.0.0.1:0","enr":"0xf88fb84067a97cfc4b4ead1783d6733994223dd4f8e0a4b58e380a6b43e24efb3992b7d765533669304855d20d5c0b1970f6756f7294840f8d7caf98d1292c63a1ae46860183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102fd65f331dd55b301498b1fd8690370c2150ce0c0cb0eba8fafb9401b87368399","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"h6z2SyLFeXUXGNwJPADIKzn+twI/5TxkhrKIlgrZ4UY=","hive":"\n=========================================================================\nThu Feb 28 17:44:10 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 87acf6\npopulation: 13 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 274f 5e36 | 30 274f (0) 255d (0) 248a (0) 3103 (0)\n001 2 cb8d ebf2 | 17 cb8d (0) c461 (0) c0c2 (0) c3b2 (0)\n002 2 b73b b8f9 | 9 b73b (0) b374 (0) be2b (0) b8f3 (0)\n003 1 9629 | 1 9629 (0)\n004 2 8926 8802 | 2 8802 (0) 8926 (0)\n005 1 821a | 1 821a (0)\n006 1 856e | 1 856e (0)\n============ DEPTH: 7 ==========================================\n007 1 8673 | 1 8673 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 1 87aa | 1 87aa (0)\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"87acf64b22c579751718dc093c00c82b39feb7023fe53c6486b288960ad9e146","private_key":"9037526f177112177c3d058d3b13b501be3a83fdd3c1e99b947fc4282b4ea6ec","name":"node_87acf64b22c579751718dc093c00c82b39feb7023fe53c6486b288960ad9e146","services":["bzz","pss"],"enable_msg_events":true,"port":39033},"up":true}},{"node":{"info":{"id":"ebf25ce427905106b70625c0084dcb117964a4d4b9951f5977457da5741b716c","name":"node_ebf25ce427905106b70625c0084dcb117964a4d4b9951f5977457da5741b716c","enode":"enode://6e0b7fe07cf0a0ef6aff0adebd4fa523361aa0a557c6d363f9e618c229187bba266e046891e4d574f089cb9a13f952a3be1d3484b2917e7a07d8f0504f24e32d@127.0.0.1:0","enr":"0xf88fb840ea01ea00dc23b440bab5e4b3afbb32e20216d4bb47fda6ac71084c371a93e32e5fa1f8064f95b4756488093c95804591ca4cf7045cae8e2d84a75c6f998a6ee10183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1036e0b7fe07cf0a0ef6aff0adebd4fa523361aa0a557c6d363f9e618c229187bba","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"6/Jc5CeQUQa3BiXACE3LEXlkpNS5lR9Zd0V9pXQbcWw=","hive":"\n=========================================================================\nThu Feb 28 17:44:10 UTC 2019 KΛÐΞMLIΛ hive: queen's address: ebf25c\npopulation: 14 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 6123 7d69 70d0 | 30 6123 (0) 7d69 (0) 7f80 (0) 70d0 (0)\n001 2 8802 87ac | 17 b73b (0) b374 (0) be2b (0) b8f3 (0)\n002 2 cb8d d3c1 | 6 cb8d (0) c461 (0) c0c2 (0) c3b2 (0)\n003 3 f35a f6e5 fb7e | 5 fb7e (0) f6e5 (0) f0e9 (0) f35a (0)\n004 2 e558 e5e1 | 3 e5e1 (0) e558 (0) e6cf (0)\n============ DEPTH: 5 ==========================================\n005 0 | 0\n006 1 e9fd | 1 e9fd (0)\n007 0 | 0\n008 1 eb30 | 1 eb30 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"ebf25ce427905106b70625c0084dcb117964a4d4b9951f5977457da5741b716c","private_key":"a5091bd57fcc7b35a7f062cffd9498b8ca19657267318836a47b545deb40052a","name":"node_ebf25ce427905106b70625c0084dcb117964a4d4b9951f5977457da5741b716c","services":["bzz","pss"],"enable_msg_events":true,"port":34261},"up":true}},{"node":{"info":{"id":"d3c19ad4c1abc9af03bffc1abc9717f4e765d5fff7ae776203438bac94d01806","name":"node_d3c19ad4c1abc9af03bffc1abc9717f4e765d5fff7ae776203438bac94d01806","enode":"enode://9dbd240d54a8ec88749a933200a7985b59dad0875db66a334b61ddf1a0475851fe15d0a2c521bb9b9c8dd762f98d16fb1606e18aaa7e9be9635a70684f792ce1@127.0.0.1:0","enr":"0xf88fb84081bae7fd011c17a28aec0c170fcf86fce22719550c958b1b76570e8ff83a371f434558ff6b1c828ee71f3809adc8e7e3ff1b17ab1c6a2ea47fa94ffcb9a2f6c00183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1039dbd240d54a8ec88749a933200a7985b59dad0875db66a334b61ddf1a0475851","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"08Ga1MGrya8Dv/wavJcX9Odl1f/3rndiA0OLrJTQGAY=","hive":"\n=========================================================================\nThu Feb 28 17:44:10 UTC 2019 KΛÐΞMLIΛ hive: queen's address: d3c19a\npopulation: 21 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 6123 5602 57d9 255d | 30 57d9 (0) 5602 (0) 5508 (0) 52fc (0)\n001 2 b8f9 be2b | 17 b374 (0) b73b (0) be2b (0) b8f3 (0)\n002 8 f35a f0e9 e6cf e558 | 11 fb7e (0) f6e5 (0) f0e9 (0) f35a (0)\n============ DEPTH: 3 ==========================================\n003 4 cb8d c461 c0c2 c3b2 | 4 cb8d (0) c461 (0) c0c2 (0) c3b2 (0)\n004 1 d904 | 1 d904 (0)\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"d3c19ad4c1abc9af03bffc1abc9717f4e765d5fff7ae776203438bac94d01806","private_key":"9e4ad8ba562de45511544b4f652f51689e2ad6dcfe4324845b41cab2a1cdb499","name":"node_d3c19ad4c1abc9af03bffc1abc9717f4e765d5fff7ae776203438bac94d01806","services":["bzz","pss"],"enable_msg_events":true,"port":42733},"up":true}},{"node":{"info":{"id":"0257ed46bd49271306fed0127019fd54db472284d00099f10cadd7e83588a63a","name":"node_0257ed46bd49271306fed0127019fd54db472284d00099f10cadd7e83588a63a","enode":"enode://9a31745dfa11805bdde500a1cfb7d3c0df78681ccd7705384e39e7c6b90278255f7273815bae322e633c7a7e7267f6c310d98ae8b849c34c87f94c40528e54f5@127.0.0.1:0","enr":"0xf88fb840a1f769829999e7af043cecab4b6b39ce1d53fdaf5a02a960165c8eda587bfd0378ad69db24c3f47258aaad5a06acf5dfd842cf65ba503e4cd72580a85176d6290183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1039a31745dfa11805bdde500a1cfb7d3c0df78681ccd7705384e39e7c6b9027825","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"AlftRr1JJxMG/tAScBn9VNtHIoTQAJnxDK3X6DWIpjo=","hive":"\n=========================================================================\nThu Feb 28 17:44:10 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 0257ed\npopulation: 14 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 d904 d3c1 | 34 9629 (0) 8802 (0) 8926 (0) 821a (0)\n001 3 5602 57d9 52fc | 13 52fc (0) 57d9 (0) 5602 (0) 5508 (0)\n002 2 255d 248a | 8 274f (0) 255d (0) 248a (0) 3103 (0)\n003 3 172b 1455 154f | 4 154f (0) 1455 (0) 172b (0) 177e (0)\n004 1 0acb | 1 0acb (0)\n============ DEPTH: 5 ==========================================\n005 2 0727 0486 | 2 0486 (0) 0727 (0)\n006 1 00ba | 1 00ba (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"0257ed46bd49271306fed0127019fd54db472284d00099f10cadd7e83588a63a","private_key":"93e56d43d2445522babc78fe39d069e01dced5497755d2a0a5690b1b3bc7f5aa","name":"node_0257ed46bd49271306fed0127019fd54db472284d00099f10cadd7e83588a63a","services":["bzz","pss"],"enable_msg_events":true,"port":39565},"up":true}},{"node":{"info":{"id":"d904f6d8790cc235063f54661521c3a197e3e9cdd9dbbcd6765ec6cda5d8f7b4","name":"node_d904f6d8790cc235063f54661521c3a197e3e9cdd9dbbcd6765ec6cda5d8f7b4","enode":"enode://a7d3655360abbdb952e9fdf7575d8fb2930309cf2d41bb6a7c8e33f0fb424c1e39c847da1cb0ec0bef9f7569e687f3d71ff62764ed431c2e149f839e060a8d61@127.0.0.1:0","enr":"0xf88fb8404ea64b440fd4d8c1d58f6d37ea7fa76455fb2e1df09a99d151cd5837622939a442f0b9e20b90df55a6c93c013fa1a6e2b6df5ed709823b48d4485e34a03687f70183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103a7d3655360abbdb952e9fdf7575d8fb2930309cf2d41bb6a7c8e33f0fb424c1e","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"2QT22HkMwjUGP1RmFSHDoZfj6c3Z27zWdl7GzaXY97Q=","hive":"\n=========================================================================\nThu Feb 28 17:44:10 UTC 2019 KΛÐΞMLIΛ hive: queen's address: d904f6\npopulation: 21 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 581a 6123 703d 255d | 30 581a (0) 5e36 (0) 5f83 (0) 52fc (0)\n001 2 87aa 821a | 17 8802 (0) 8926 (0) 821a (0) 856e (0)\n002 8 f35a f0e9 fb7e e9fd | 11 fb7e (0) f6e5 (0) f0e9 (0) f35a (0)\n============ DEPTH: 3 ==========================================\n003 4 cb8d c461 c3b2 c0c2 | 4 cb8d (0) c461 (0) c0c2 (0) c3b2 (0)\n004 1 d3c1 | 1 d3c1 (0)\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"d904f6d8790cc235063f54661521c3a197e3e9cdd9dbbcd6765ec6cda5d8f7b4","private_key":"b53f894c8449d42e7dfbb557649b7fd8816b55d7fd57c3ed65a65c5fdc643478","name":"node_d904f6d8790cc235063f54661521c3a197e3e9cdd9dbbcd6765ec6cda5d8f7b4","services":["bzz","pss"],"enable_msg_events":true,"port":39481},"up":true}},{"node":{"info":{"id":"703dc76ac724457c805abcc1ed2e3f321821409fb4cf0185e2f07ebc4c18144f","name":"node_703dc76ac724457c805abcc1ed2e3f321821409fb4cf0185e2f07ebc4c18144f","enode":"enode://123c89683b99e7d2cb71f5e7d6d6fad3200c8c9129dd11844158320310a15d658bdf8af970f938bbe2e97f72f08405e8c323d49f1c84a7b8cbc8c94bdb1ac762@127.0.0.1:0","enr":"0xf88fb8404488d9cd1ca1b9bdb277610eac83b22a38260188c4604d95f5d9b673feb11b6e262970fefd02bb8685d3be492dd5950f2d3db07395f949562dbcc9c154cc77bc0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102123c89683b99e7d2cb71f5e7d6d6fad3200c8c9129dd11844158320310a15d65","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"cD3HasckRXyAWrzB7S4/MhghQJ+0zwGF4vB+vEwYFE8=","hive":"\n=========================================================================\nThu Feb 28 17:44:10 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 703dc7\npopulation: 15 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 4 afb1 e5e1 f35a d904 | 34 8802 (0) 8926 (0) 856e (0) 8673 (0)\n001 4 0acb 1455 274f 3b4f | 17 274f (0) 255d (0) 248a (0) 3103 (0)\n002 3 581a 5f83 5e36 | 8 581a (0) 5e36 (0) 5f83 (0) 52fc (0)\n003 1 6123 | 1 6123 (0)\n============ DEPTH: 4 ==========================================\n004 2 7d69 7f80 | 2 7f80 (0) 7d69 (0)\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 1 70d0 | 1 70d0 (0)\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"703dc76ac724457c805abcc1ed2e3f321821409fb4cf0185e2f07ebc4c18144f","private_key":"e16c1c8c92402bfd9f8fe2a57e37c01f1898f2f128430398ac33ae7482108ebc","name":"node_703dc76ac724457c805abcc1ed2e3f321821409fb4cf0185e2f07ebc4c18144f","services":["bzz","pss"],"enable_msg_events":true,"port":36893},"up":true}},{"node":{"info":{"id":"afb1d0b8d1b1f6a341384c1f0818f6b28b85fefe6a45a892552de4de5379f6a5","name":"node_afb1d0b8d1b1f6a341384c1f0818f6b28b85fefe6a45a892552de4de5379f6a5","enode":"enode://50e65aecad41df245ddc2f29869d81db24b988a216918b80b305904ed62647ce8c03cc7fdcee80bbe864ca008714bce3d055bbfb50bec1214ae67ba54b9126bb@127.0.0.1:0","enr":"0xf88fb8401f728d3897ecb9512cf5eb7a662998136041c670409700a9f59b5e9b8a04a81e395e1d3f21b92032fb70f5ab6ffc3b648f6b884268426117ba50407330ee9eef0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10350e65aecad41df245ddc2f29869d81db24b988a216918b80b305904ed62647ce","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"r7HQuNGx9qNBOEwfCBj2souF/v5qRaiSVS3k3lN59qU=","hive":"\n=========================================================================\nThu Feb 28 17:44:10 UTC 2019 KΛÐΞMLIΛ hive: queen's address: afb1d0\npopulation: 17 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 172b 00ba 703d | 30 274f (0) 255d (0) 248a (0) 3103 (0)\n001 3 e6cf fb7e f6e5 | 17 fb7e (0) f6e5 (0) f35a (0) f211 (0)\n002 3 8926 87aa 8673 | 8 8926 (0) 8802 (0) 856e (0) 8673 (0)\n003 5 b73b b374 be2b b8f3 | 5 b374 (0) b73b (0) be2b (0) b8f3 (0)\n004 1 a12b | 1 a12b (0)\n============ DEPTH: 5 ==========================================\n005 1 aabc | 1 aabc (0)\n006 0 | 0\n007 1 ae60 | 1 ae60 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"afb1d0b8d1b1f6a341384c1f0818f6b28b85fefe6a45a892552de4de5379f6a5","private_key":"4354e176e57a83691528c333e221af5d016371701e1d7f08607a0a04f5fca409","name":"node_afb1d0b8d1b1f6a341384c1f0818f6b28b85fefe6a45a892552de4de5379f6a5","services":["bzz","pss"],"enable_msg_events":true,"port":33425},"up":true}},{"node":{"info":{"id":"00ba6c61b2d6480f53f48c3def3ac85587d9b7a92658d21c235fd0fddc246850","name":"node_00ba6c61b2d6480f53f48c3def3ac85587d9b7a92658d21c235fd0fddc246850","enode":"enode://d2088cb0561220a69e8efa4945b89411db2f73bd1432a997f9cf0f4316eda2a7f5962c0b0d5b314fea4cb73dc4df7fedcccc2027eb9d4cedf7fbe996d7f5e0bf@127.0.0.1:0","enr":"0xf88fb84063cbdaf9b29653c80c1532a4963d23258dc89555d21522053f86d7a73b54520d64eee9fa218232119ae212b2c9b0d27e5b8cacf6f3c727bf3dc4cbbf690dd51e0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103d2088cb0561220a69e8efa4945b89411db2f73bd1432a997f9cf0f4316eda2a7","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"ALpsYbLWSA9T9Iw97zrIVYfZt6kmWNIcI1/Q/dwkaFA=","hive":"\n=========================================================================\nThu Feb 28 17:44:10 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 00ba6c\npopulation: 18 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 c0c2 8926 9629 b8f3 | 34 fb7e (0) f6e5 (0) f35a (0) f211 (0)\n001 4 70d0 452b 57d9 52fc | 13 452b (0) 581a (0) 5e36 (0) 5f83 (0)\n002 2 248a 3b4f | 8 274f (0) 255d (0) 248a (0) 3103 (0)\n003 3 1455 154f 172b | 4 154f (0) 1455 (0) 172b (0) 177e (0)\n004 1 0acb | 1 0acb (0)\n============ DEPTH: 5 ==========================================\n005 2 0727 0486 | 2 0486 (0) 0727 (0)\n006 1 0257 | 1 0257 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"00ba6c61b2d6480f53f48c3def3ac85587d9b7a92658d21c235fd0fddc246850","private_key":"5a24ca759ff05fd20635c180866850474c9548f77adb55e3dd1b4745a871f0b7","name":"node_00ba6c61b2d6480f53f48c3def3ac85587d9b7a92658d21c235fd0fddc246850","services":["bzz","pss"],"enable_msg_events":true,"port":43657},"up":true}},{"node":{"info":{"id":"9629320d648fda3834eddac7263cc6c88651dc6074206cee00144918d2276289","name":"node_9629320d648fda3834eddac7263cc6c88651dc6074206cee00144918d2276289","enode":"enode://28248a4e3b947a840d138ec02d99874ec310f8a569c25dc8a34c5e334dc69bbd196f0769f32afad244552e8f321e4ab1b498e10ba875cb6e008146607b4b1748@127.0.0.1:0","enr":"0xf88fb840410401b0463d1535e6372c265c06ccac3b6116261f346d31b2c4da7487baa40b0d04f506d7a30412b7ca365e1283a8c1f6298c2a0fd14448a8b7b9d3d0e6f9f70183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10228248a4e3b947a840d138ec02d99874ec310f8a569c25dc8a34c5e334dc69bbd","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"likyDWSP2jg07drHJjzGyIZR3GB0IGzuABRJGNInYok=","hive":"\n=========================================================================\nThu Feb 28 17:44:10 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 962932\npopulation: 24 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 6 5e36 581a 452b 38f0 | 30 452b (0) 581a (0) 5e36 (0) 5f83 (0)\n001 5 f35a f0e9 e9fd c461 | 17 fb7e (0) f6e5 (0) f35a (0) f211 (0)\n002 6 a12b ae60 aabc b374 | 9 b73b (0) b374 (0) be2b (0) b8f3 (0)\n============ DEPTH: 3 ==========================================\n003 7 821a 856e 8673 87aa | 7 8926 (0) 8802 (0) 856e (0) 8673 (0)\n004 0 | 0\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"9629320d648fda3834eddac7263cc6c88651dc6074206cee00144918d2276289","private_key":"37f4999bea53d1c97ec6a575c20dd5a83d19dbf990fe54e165401484f46a0ad5","name":"node_9629320d648fda3834eddac7263cc6c88651dc6074206cee00144918d2276289","services":["bzz","pss"],"enable_msg_events":true,"port":41351},"up":true}},{"node":{"info":{"id":"c3b2d2f0c72753ed89fc4c580c81f50c66cb02c1f90054650e191a0105c40d1d","name":"node_c3b2d2f0c72753ed89fc4c580c81f50c66cb02c1f90054650e191a0105c40d1d","enode":"enode://6d97076d32b9b9f4b5283863a9e98ae3565c5b76c4d79066a19dcea55b59368e7608ba4756a6ad7c2abcfa2cd8a35687b72abc688594d2e75acf7c06224f070f@127.0.0.1:0","enr":"0xf88fb84051fb637bffdf225590478fd9c8d1191799580989e08e24be868d06fc5bcc1d331b83c265df3b5914dd08cb298f5c664aed93b478f82c2b79044d18b9e6e8e05e0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1036d97076d32b9b9f4b5283863a9e98ae3565c5b76c4d79066a19dcea55b59368e","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"w7LS8McnU+2J/ExYDIH1DGbLAsH5AFRlDhkaAQXEDR0=","hive":"\n=========================================================================\nThu Feb 28 17:44:10 UTC 2019 KΛÐΞMLIΛ hive: queen's address: c3b2d2\npopulation: 13 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 3c40 5f83 | 30 274f (0) 255d (0) 248a (0) 3103 (0)\n001 3 b374 8673 9629 | 17 a12b (0) afb1 (0) ae60 (0) aabc (0)\n002 3 f6e5 fb7e e6cf | 11 fb7e (0) f6e5 (0) f211 (0) f35a (0)\n003 2 d904 d3c1 | 2 d3c1 (0) d904 (0)\n004 1 cb8d | 1 cb8d (0)\n============ DEPTH: 5 ==========================================\n005 1 c461 | 1 c461 (0)\n006 1 c0c2 | 1 c0c2 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"c3b2d2f0c72753ed89fc4c580c81f50c66cb02c1f90054650e191a0105c40d1d","private_key":"3e87a7f0724932c97ccea342e08f9cbab0a16398baa4d83cf262cab27e823a00","name":"node_c3b2d2f0c72753ed89fc4c580c81f50c66cb02c1f90054650e191a0105c40d1d","services":["bzz","pss"],"enable_msg_events":true,"port":33597},"up":true}},{"node":{"info":{"id":"e6cf337d0e695e861ea36864e2ace1f4029d5b3246f7bd15ce4dcc220bfe3e48","name":"node_e6cf337d0e695e861ea36864e2ace1f4029d5b3246f7bd15ce4dcc220bfe3e48","enode":"enode://66956dc6f44f5a14fbd8cacccb4a0392af57212942e8ab9a389056d9577bf347a38cfdd762902a5edcb4eecf9651e855e67968089887e622490e8b69b548f496@127.0.0.1:0","enr":"0xf88fb840736618f919fc2c358b6f142a11f97cfe9676c53077ffac8dc2e6f386275e20054d088ed925aeddf27038b97725b58eb517ada94564ace17c71b2e679b3a0712e0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10266956dc6f44f5a14fbd8cacccb4a0392af57212942e8ab9a389056d9577bf347","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"5s8zfQ5pXoYeo2hk4qzh9AKdWzJG970Vzk3MIgv+Pkg=","hive":"\n=========================================================================\nThu Feb 28 17:44:10 UTC 2019 KΛÐΞMLIΛ hive: queen's address: e6cf33\npopulation: 17 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 248a 3c40 | 30 274f (0) 255d (0) 248a (0) 3103 (0)\n001 4 ae60 afb1 a12b 821a | 17 a12b (0) afb1 (0) ae60 (0) aabc (0)\n002 3 d904 d3c1 c3b2 | 6 d3c1 (0) d904 (0) cb8d (0) c461 (0)\n003 4 f6e5 f0e9 f211 fb7e | 5 fb7e (0) f6e5 (0) f211 (0) f35a (0)\n004 2 eb30 e9fd | 3 e9fd (0) eb30 (0) ebf2 (0)\n============ DEPTH: 5 ==========================================\n005 0 | 0\n006 2 e5e1 e558 | 2 e5e1 (0) e558 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"e6cf337d0e695e861ea36864e2ace1f4029d5b3246f7bd15ce4dcc220bfe3e48","private_key":"17299832d5703762960e077579ea9a6ffc090a4e52d4b7da5ac8f0a93fe3dc58","name":"node_e6cf337d0e695e861ea36864e2ace1f4029d5b3246f7bd15ce4dcc220bfe3e48","services":["bzz","pss"],"enable_msg_events":true,"port":42449},"up":true}},{"node":{"info":{"id":"821af25e6366237cca25681ec633eba88db48a4ff88b5920cdc92e14616140e4","name":"node_821af25e6366237cca25681ec633eba88db48a4ff88b5920cdc92e14616140e4","enode":"enode://9076c5a898a4ed3432a2f812f4c221429a92437f6e27430d6606d7e0d8d01467f860d0949c1bf61d8630a2f1cdcac9b59dff894910bb4d5f11793e03ca4812bc@127.0.0.1:0","enr":"0xf88fb840c4b0861f6a4c06646188be8b72ed472c5dce5473d4568b7bbfc15409a2b575fd1ffe9c6597915b5a0d3225f043bc7c42438fc6786f38fa60c9372592fbf0b3720183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1029076c5a898a4ed3432a2f812f4c221429a92437f6e27430d6606d7e0d8d01467","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"ghryXmNmI3zKJWgexjPrqI20ik/4i1kgzckuFGFhQOQ=","hive":"\n=========================================================================\nThu Feb 28 17:44:10 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 821af2\npopulation: 23 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 5 0acb 255d 274f 38f0 | 30 274f (0) 255d (0) 248a (0) 3103 (0)\n001 7 c461 d904 f35a f0e9 | 17 d3c1 (0) d904 (0) cb8d (0) c461 (0)\n002 4 a12b aabc b8f3 b8f9 | 9 a12b (0) afb1 (0) ae60 (0) aabc (0)\n003 1 9629 | 1 9629 (0)\n004 2 8926 8802 | 2 8802 (0) 8926 (0)\n============ DEPTH: 5 ==========================================\n005 4 8673 87aa 87ac 856e | 4 856e (0) 8673 (0) 87aa (0) 87ac (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"821af25e6366237cca25681ec633eba88db48a4ff88b5920cdc92e14616140e4","private_key":"7a3f8c7619489d91c82cd5712ea79f4a09bda58899b9c47305cecaaf474446e9","name":"node_821af25e6366237cca25681ec633eba88db48a4ff88b5920cdc92e14616140e4","services":["bzz","pss"],"enable_msg_events":true,"port":37855},"up":true}},{"node":{"info":{"id":"b8f9946b17cea5dbba4ba1c37cd4d00a35717c69fb0e391f24af9294f9030c2e","name":"node_b8f9946b17cea5dbba4ba1c37cd4d00a35717c69fb0e391f24af9294f9030c2e","enode":"enode://4d06d30c93bb00f7ea04113fb7db1f44cf2d64fa6fa84136844915317a078a5f515d67f2c9531726774eff1e1c55e794444413207a7a33f8efe69c3b9a1ce809@127.0.0.1:0","enr":"0xf88fb840da80dce04c535f4a03e572241364ebfcc260ac172c2f4f8613c30690c319e6916a57ccbc2ba5996f0eb97daa72b5f179ddc8c8402cbf34e3d4e25b6d5de65d560183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1034d06d30c93bb00f7ea04113fb7db1f44cf2d64fa6fa84136844915317a078a5f","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"uPmUaxfOpdu6S6HDfNTQCjVxfGn7DjkfJK+SlPkDDC4=","hive":"\n=========================================================================\nThu Feb 28 17:44:10 UTC 2019 KΛÐΞMLIΛ hive: queen's address: b8f994\npopulation: 14 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 274f 5508 | 30 274f (0) 255d (0) 248a (0) 3103 (0)\n001 2 d3c1 f6e5 | 17 fb7e (0) f6e5 (0) f211 (0) f35a (0)\n002 3 856e 87ac 821a | 8 9629 (0) 8802 (0) 8926 (0) 856e (0)\n003 3 ae60 afb1 a12b | 4 a12b (0) afb1 (0) ae60 (0) aabc (0)\n004 2 b374 b73b | 2 b73b (0) b374 (0)\n============ DEPTH: 5 ==========================================\n005 1 be2b | 1 be2b (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 1 b8f3 | 1 b8f3 (0)\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"b8f9946b17cea5dbba4ba1c37cd4d00a35717c69fb0e391f24af9294f9030c2e","private_key":"ba7822a917d871b0db8d2f35c273e03d2611d6b1ec22afa5f3904d5912715fe6","name":"node_b8f9946b17cea5dbba4ba1c37cd4d00a35717c69fb0e391f24af9294f9030c2e","services":["bzz","pss"],"enable_msg_events":true,"port":46635},"up":true}},{"node":{"info":{"id":"550857bac20787ca7f64937aedba0ba3d2b585052d6e824fde8403838a2c2adc","name":"node_550857bac20787ca7f64937aedba0ba3d2b585052d6e824fde8403838a2c2adc","enode":"enode://674d26ce4cfc8f488a5582293dcb0b48dbafe55633179a515be743fd8df0115312862eb9890c52caa8a448b0643237fa1cb52630bbb037f10a4b51c9bb03547c@127.0.0.1:0","enr":"0xf88fb840f50fd3df45a62d984c9335d268586911f8ca0e81aa4bcb0d91ba62cd4c9d788739972464e7736c25bafc230322b8cd066b8336706c3829ba54844c18cc2d1e510183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102674d26ce4cfc8f488a5582293dcb0b48dbafe55633179a515be743fd8df01153","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"VQhXusIHh8p/ZJN67boLo9K1hQUtboJP3oQDg4osKtw=","hive":"\n=========================================================================\nThu Feb 28 17:44:10 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 550857\npopulation: 14 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 f6e5 fb7e b8f9 | 34 fb7e (0) f6e5 (0) f211 (0) f35a (0)\n001 2 274f 38f0 | 17 274f (0) 255d (0) 248a (0) 3103 (0)\n002 2 7f80 6123 | 5 6123 (0) 7f80 (0) 7d69 (0) 70d0 (0)\n003 1 452b | 1 452b (0)\n004 3 5f83 5e36 581a | 3 581a (0) 5e36 (0) 5f83 (0)\n005 1 52fc | 1 52fc (0)\n============ DEPTH: 6 ==========================================\n006 2 57d9 5602 | 2 57d9 (0) 5602 (0)\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"550857bac20787ca7f64937aedba0ba3d2b585052d6e824fde8403838a2c2adc","private_key":"71212a2c0cc74c7f5acae0d49389517fb9f8125452e5ff53a87d9f94d1cdb656","name":"node_550857bac20787ca7f64937aedba0ba3d2b585052d6e824fde8403838a2c2adc","services":["bzz","pss"],"enable_msg_events":true,"port":38047},"up":true}},{"node":{"info":{"id":"56029e913c58f9a10a51c25fbf322aee54e844476cb1723c312f0f8bb9c24e39","name":"node_56029e913c58f9a10a51c25fbf322aee54e844476cb1723c312f0f8bb9c24e39","enode":"enode://6e7531fa1aad96956cb94991feb1de42184d663cf91edeec3ec9c44a40b74669a30ca1b149de068ad02287f4749aaa00baba98cfaf078c9616119971af4d8e41@127.0.0.1:0","enr":"0xf88fb840e9d8fe4011fb432017522b9895b5df21af7f12f9f032d6fe91afd6674259563329ec357a908efcdf03bf0ce90552bec005f8d8e48d4ff8501f5d4a78f5e140a90183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1036e7531fa1aad96956cb94991feb1de42184d663cf91edeec3ec9c44a40b74669","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"VgKekTxY+aEKUcJfvzIq7lToREdssXI8MS8Pi7nCTjk=","hive":"\n=========================================================================\nThu Feb 28 17:44:10 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 56029e\npopulation: 15 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 2 d3c1 b73b | 34 fb7e (0) f6e5 (0) f211 (0) f35a (0)\n001 3 3c40 0257 177e | 17 274f (0) 255d (0) 248a (0) 3103 (0)\n002 3 6123 7f80 7d69 | 5 6123 (0) 7f80 (0) 7d69 (0) 70d0 (0)\n003 1 452b | 1 452b (0)\n004 3 581a 5f83 5e36 | 3 581a (0) 5e36 (0) 5f83 (0)\n005 1 52fc | 1 52fc (0)\n============ DEPTH: 6 ==========================================\n006 1 5508 | 1 5508 (0)\n007 1 57d9 | 1 57d9 (0)\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"56029e913c58f9a10a51c25fbf322aee54e844476cb1723c312f0f8bb9c24e39","private_key":"4e9222727f6b16c6bf0ed7a54aa1b7469e124eba3236c02cdbcc687cd60b72bc","name":"node_56029e913c58f9a10a51c25fbf322aee54e844476cb1723c312f0f8bb9c24e39","services":["bzz","pss"],"enable_msg_events":true,"port":38635},"up":true}},{"node":{"info":{"id":"b73b9aa5a6264c9a018a988a813b9127d9bf970736478cf0dc3edd1c2023f6f2","name":"node_b73b9aa5a6264c9a018a988a813b9127d9bf970736478cf0dc3edd1c2023f6f2","enode":"enode://ab3e384377a188409c644d5b90e2c6ef1f2684a6f706d706a4648f7de14c6636e1879b40b73c0ae2f50e0a5b310fae9d87dec78077f765ea86d1d1692e7f30e9@127.0.0.1:0","enr":"0xf88fb8402367c86e536923173d2217bd08333ff411134bf6cfd0e621b7979b3e8e5858f46c7490fafa705e3e2039990a49492e9061617d5dc27a275fbb87b2b5af9a1b020183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a103ab3e384377a188409c644d5b90e2c6ef1f2684a6f706d706a4648f7de14c6636","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"tzuapaYmTJoBipiKgTuRJ9m/lwc2R4zw3D7dHCAj9vI=","hive":"\n=========================================================================\nThu Feb 28 17:44:10 UTC 2019 KΛÐΞMLIΛ hive: queen's address: b73b9a\npopulation: 17 (63), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 3 3abf 177e 5602 | 30 274f (0) 255d (0) 248a (0) 3103 (0)\n001 4 eb30 fb7e f211 f6e5 | 17 fb7e (0) f6e5 (0) f211 (0) f35a (0)\n002 3 87ac 8802 8926 | 8 8802 (0) 8926 (0) 821a (0) 856e (0)\n003 3 aabc afb1 a12b | 4 a12b (0) afb1 (0) ae60 (0) aabc (0)\n============ DEPTH: 4 ==========================================\n004 3 be2b b8f3 b8f9 | 3 b8f9 (0) b8f3 (0) be2b (0)\n005 1 b374 | 1 b374 (0)\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"b73b9aa5a6264c9a018a988a813b9127d9bf970736478cf0dc3edd1c2023f6f2","private_key":"7b8ef93d2a057f4d4cd38111d6f670c9ea7480d10fb335de23e95b1e66c6c445","name":"node_b73b9aa5a6264c9a018a988a813b9127d9bf970736478cf0dc3edd1c2023f6f2","services":["bzz","pss"],"enable_msg_events":true,"port":33079},"up":true}}],"conns":[{"one":"177e232bdba970f4b001b228af9402e3fca0aaf00682a11bc9984f7db4b7feba","other":"be2bcb8fb4b34ee6981e6634b8f3298fbbee756f6e76566204a56bb86c8ec0f0","up":true},{"one":"be2bcb8fb4b34ee6981e6634b8f3298fbbee756f6e76566204a56bb86c8ec0f0","other":"7d69b5707a4b99edd901317f1553ff15586aac350f38e0c81318f35d68b835a8","up":true},{"one":"7d69b5707a4b99edd901317f1553ff15586aac350f38e0c81318f35d68b835a8","other":"154fec5fa728af956a1446bd5a35e63d716b79a804197b50fd9c72585d044b77","up":true},{"one":"154fec5fa728af956a1446bd5a35e63d716b79a804197b50fd9c72585d044b77","other":"3c409e5b76e977ee3115a0a19540dd6745e60b8878fdc1a5c1d996e7e47ca969","up":true},{"one":"3c409e5b76e977ee3115a0a19540dd6745e60b8878fdc1a5c1d996e7e47ca969","other":"c461e430c887894bbbff4e337b61ee449cf12cc07d0fc5fe41785d580d16ae98","up":true},{"one":"c461e430c887894bbbff4e337b61ee449cf12cc07d0fc5fe41785d580d16ae98","other":"e558105d2aeb59c896f5fb70475b046d9034ef4596e9cd5f54f16c316449241e","up":true},{"one":"e558105d2aeb59c896f5fb70475b046d9034ef4596e9cd5f54f16c316449241e","other":"e9fd5cd7f8d28ca172a3d331da401e9853d3121923c81bf82787f7989009e43a","up":true},{"one":"e9fd5cd7f8d28ca172a3d331da401e9853d3121923c81bf82787f7989009e43a","other":"f0e900ef37baad6a1685aaf1700e9290e7e9c0d5d30e3265204ec943445248b3","up":true},{"one":"f0e900ef37baad6a1685aaf1700e9290e7e9c0d5d30e3265204ec943445248b3","other":"aabc587ddc3b7d493ce8e849b15d364265c57d3a3a52613076a5b31804cb753f","up":true},{"one":"aabc587ddc3b7d493ce8e849b15d364265c57d3a3a52613076a5b31804cb753f","other":"f6e5148d2421ae11e8a109852c9da77bbe498f9e6ed3aa361755a1ff3fd29b74","up":true},{"one":"f6e5148d2421ae11e8a109852c9da77bbe498f9e6ed3aa361755a1ff3fd29b74","other":"1455d4713b5134e9157517b84b04e15292cf18d3e08b95d69f19648fb9e3823e","up":true},{"one":"1455d4713b5134e9157517b84b04e15292cf18d3e08b95d69f19648fb9e3823e","other":"38f05af40cd0dc3974e896e24aa75ebda1c96f0ce7d9e3ff0ea840615186307d","up":true},{"one":"38f05af40cd0dc3974e896e24aa75ebda1c96f0ce7d9e3ff0ea840615186307d","other":"0acb17334253408a773202041d4a67c7873b0e74e94c86e3343fb470bdcbed82","up":true},{"one":"0acb17334253408a773202041d4a67c7873b0e74e94c86e3343fb470bdcbed82","other":"f35a47e1d56a6d8e5caad50d88e55c83ff3b964b279b58a50d5e544ff9187864","up":true},{"one":"f35a47e1d56a6d8e5caad50d88e55c83ff3b964b279b58a50d5e544ff9187864","other":"e5e166f85ea9e264fc25734523869d9b916f388004cb4af9968956ce14a7a522","up":true},{"one":"e5e166f85ea9e264fc25734523869d9b916f388004cb4af9968956ce14a7a522","other":"b8f345940bced8831b30079ff2a276ab65fbed0dd8575c93a3ccd8c7bd1bc8b1","up":true},{"one":"b8f345940bced8831b30079ff2a276ab65fbed0dd8575c93a3ccd8c7bd1bc8b1","other":"cb8df183e7fea4f808ed569d3fa0a6c26670f6451b9a9f48e8659871c2b9ab02","up":true},{"one":"cb8df183e7fea4f808ed569d3fa0a6c26670f6451b9a9f48e8659871c2b9ab02","other":"c0c2d73abd2b6abc3ba0b098520c4cc3eda61b5fc9d1ab42ebd04ecc25ded224","up":true},{"one":"c0c2d73abd2b6abc3ba0b098520c4cc3eda61b5fc9d1ab42ebd04ecc25ded224","other":"892603fc64fe169ad15519060cfb1d27780adff60da60f86a620f2bf9a7ca1e1","up":true},{"one":"892603fc64fe169ad15519060cfb1d27780adff60da60f86a620f2bf9a7ca1e1","other":"57d911f864be7a90d8807bc3fecd658c5697d70cf3ddcc1dde0dd9bd0fd7fb67","up":true},{"one":"57d911f864be7a90d8807bc3fecd658c5697d70cf3ddcc1dde0dd9bd0fd7fb67","other":"eb307a6f333b30ebd1e3b2b51bd8095311d48707d6ca2c81447d01ad453e2542","up":true},{"one":"eb307a6f333b30ebd1e3b2b51bd8095311d48707d6ca2c81447d01ad453e2542","other":"3abfe9f4f6a8d34b536d02551f45c03a35987b94f7d33b3a0dc30ad34b15f82a","up":true},{"one":"3abfe9f4f6a8d34b536d02551f45c03a35987b94f7d33b3a0dc30ad34b15f82a","other":"7f800e5a7970230f5273e49971c7ee521de97e69f56dd554e30dd12d6fb5c749","up":true},{"one":"7f800e5a7970230f5273e49971c7ee521de97e69f56dd554e30dd12d6fb5c749","other":"ae6023d416c87bb433eb9d8d44f97531797d292774304d996923a3fe67887478","up":true},{"one":"ae6023d416c87bb433eb9d8d44f97531797d292774304d996923a3fe67887478","other":"a12b12081b6d49e82378d5239765bca8c5f43232b30163bc46924cc3e98e1177","up":true},{"one":"a12b12081b6d49e82378d5239765bca8c5f43232b30163bc46924cc3e98e1177","other":"3103cd0b7654f593b7228d1715209f27e339ad014019a9738413a20cb6ac63e4","up":true},{"one":"3103cd0b7654f593b7228d1715209f27e339ad014019a9738413a20cb6ac63e4","other":"856e27ca689a9b2af4cd3ed958f2162b9c71074c726868ac7a10ac2f6f7d021d","up":true},{"one":"856e27ca689a9b2af4cd3ed958f2162b9c71074c726868ac7a10ac2f6f7d021d","other":"88024b9f684346b775c1c1eb6e9709034135957ab418ec002725f10ef8919837","up":true},{"one":"88024b9f684346b775c1c1eb6e9709034135957ab418ec002725f10ef8919837","other":"255db8d311a66a7443b15d040afa06626d6919c0d20a6fd0f5afa34e87281732","up":true},{"one":"255db8d311a66a7443b15d040afa06626d6919c0d20a6fd0f5afa34e87281732","other":"581ad92d4347834850c16e781983c09be340917527a35dd9650c5a3da1fc822b","up":true},{"one":"581ad92d4347834850c16e781983c09be340917527a35dd9650c5a3da1fc822b","other":"0727d7e68c319d3a4cc5a161dd05b2a7e72350c139e65c2090c1232ebbed5f78","up":true},{"one":"0727d7e68c319d3a4cc5a161dd05b2a7e72350c139e65c2090c1232ebbed5f78","other":"6123b7777de3bc2591e3036a9adeba1f7d8ec933d05ee4fe0017910896925d1b","up":true},{"one":"6123b7777de3bc2591e3036a9adeba1f7d8ec933d05ee4fe0017910896925d1b","other":"04862550ef38f831085f378e2533addc2c904288394631208c49cb33615ada3b","up":true},{"one":"04862550ef38f831085f378e2533addc2c904288394631208c49cb33615ada3b","other":"248a2e618091deeac458f4741616405e0bc5ffda1a9f9125307e32c781728a75","up":true},{"one":"248a2e618091deeac458f4741616405e0bc5ffda1a9f9125307e32c781728a75","other":"172bbbcaa57c37c24314a84fbd0b9de45f83a46016bd2395dc2adbab1bb90b5c","up":true},{"one":"172bbbcaa57c37c24314a84fbd0b9de45f83a46016bd2395dc2adbab1bb90b5c","other":"fb7e6716614ac941b74e18a9bf3ded63bc00b453221b40976f783675a1c06c63","up":true},{"one":"fb7e6716614ac941b74e18a9bf3ded63bc00b453221b40976f783675a1c06c63","other":"f211376d46e6e0966ee984cf5837805240b2ba53c5ac75315c56dbdffb957a65","up":true},{"one":"f211376d46e6e0966ee984cf5837805240b2ba53c5ac75315c56dbdffb957a65","other":"3b4fa7d729129068a1281ef68494b61d055203de8c36a5fe27af3eb565832108","up":true},{"one":"3b4fa7d729129068a1281ef68494b61d055203de8c36a5fe27af3eb565832108","other":"87aa77dcef19b0c86a3e8ab64c8f12d9a733e77a7e12bcaec3a4cd8504c5a775","up":true},{"one":"87aa77dcef19b0c86a3e8ab64c8f12d9a733e77a7e12bcaec3a4cd8504c5a775","other":"70d0710b3894fabf32b343b9b59339f786ece39895c7eda5f162cc575c9c8253","up":true},{"one":"70d0710b3894fabf32b343b9b59339f786ece39895c7eda5f162cc575c9c8253","other":"52fc1e219bc518fbaf289da3236d98db1b63df1227ea32581229671473adc3bd","up":true},{"one":"52fc1e219bc518fbaf289da3236d98db1b63df1227ea32581229671473adc3bd","other":"b3744cf6f180c2eb9a1ded0e6ddd600d5f79268387b97333070fb5a183affd89","up":true},{"one":"b3744cf6f180c2eb9a1ded0e6ddd600d5f79268387b97333070fb5a183affd89","other":"274f8b752ef0c84a5c3098066b0b4d1c02b8a1b1730f59ed94064535eeda4756","up":true},{"one":"274f8b752ef0c84a5c3098066b0b4d1c02b8a1b1730f59ed94064535eeda4756","other":"5f832158cf84e0e48a3518955878b16ae253467f54664eb4ec1213fefc3f3277","up":true},{"one":"5f832158cf84e0e48a3518955878b16ae253467f54664eb4ec1213fefc3f3277","other":"452b07d73433e7d6c205a504419ae100019aa1920723011272b596607db6684a","up":true},{"one":"452b07d73433e7d6c205a504419ae100019aa1920723011272b596607db6684a","other":"86735a46da76b3132f729b293b4d8502e939ecba776b8d85b3ae73efa2184b5f","up":true},{"one":"86735a46da76b3132f729b293b4d8502e939ecba776b8d85b3ae73efa2184b5f","other":"5e36542bbbc0d70231c9d00742cb30fccf3f206eecf10a0f34332a2986c86ffb","up":true},{"one":"5e36542bbbc0d70231c9d00742cb30fccf3f206eecf10a0f34332a2986c86ffb","other":"87acf64b22c579751718dc093c00c82b39feb7023fe53c6486b288960ad9e146","up":true},{"one":"87acf64b22c579751718dc093c00c82b39feb7023fe53c6486b288960ad9e146","other":"ebf25ce427905106b70625c0084dcb117964a4d4b9951f5977457da5741b716c","up":true},{"one":"ebf25ce427905106b70625c0084dcb117964a4d4b9951f5977457da5741b716c","other":"d3c19ad4c1abc9af03bffc1abc9717f4e765d5fff7ae776203438bac94d01806","up":true},{"one":"d3c19ad4c1abc9af03bffc1abc9717f4e765d5fff7ae776203438bac94d01806","other":"0257ed46bd49271306fed0127019fd54db472284d00099f10cadd7e83588a63a","up":true},{"one":"0257ed46bd49271306fed0127019fd54db472284d00099f10cadd7e83588a63a","other":"d904f6d8790cc235063f54661521c3a197e3e9cdd9dbbcd6765ec6cda5d8f7b4","up":true},{"one":"d904f6d8790cc235063f54661521c3a197e3e9cdd9dbbcd6765ec6cda5d8f7b4","other":"703dc76ac724457c805abcc1ed2e3f321821409fb4cf0185e2f07ebc4c18144f","up":true},{"one":"703dc76ac724457c805abcc1ed2e3f321821409fb4cf0185e2f07ebc4c18144f","other":"afb1d0b8d1b1f6a341384c1f0818f6b28b85fefe6a45a892552de4de5379f6a5","up":true},{"one":"afb1d0b8d1b1f6a341384c1f0818f6b28b85fefe6a45a892552de4de5379f6a5","other":"00ba6c61b2d6480f53f48c3def3ac85587d9b7a92658d21c235fd0fddc246850","up":true},{"one":"00ba6c61b2d6480f53f48c3def3ac85587d9b7a92658d21c235fd0fddc246850","other":"9629320d648fda3834eddac7263cc6c88651dc6074206cee00144918d2276289","up":true},{"one":"9629320d648fda3834eddac7263cc6c88651dc6074206cee00144918d2276289","other":"c3b2d2f0c72753ed89fc4c580c81f50c66cb02c1f90054650e191a0105c40d1d","up":true},{"one":"c3b2d2f0c72753ed89fc4c580c81f50c66cb02c1f90054650e191a0105c40d1d","other":"e6cf337d0e695e861ea36864e2ace1f4029d5b3246f7bd15ce4dcc220bfe3e48","up":true},{"one":"e6cf337d0e695e861ea36864e2ace1f4029d5b3246f7bd15ce4dcc220bfe3e48","other":"821af25e6366237cca25681ec633eba88db48a4ff88b5920cdc92e14616140e4","up":true},{"one":"821af25e6366237cca25681ec633eba88db48a4ff88b5920cdc92e14616140e4","other":"b8f9946b17cea5dbba4ba1c37cd4d00a35717c69fb0e391f24af9294f9030c2e","up":true},{"one":"b8f9946b17cea5dbba4ba1c37cd4d00a35717c69fb0e391f24af9294f9030c2e","other":"550857bac20787ca7f64937aedba0ba3d2b585052d6e824fde8403838a2c2adc","up":true},{"one":"550857bac20787ca7f64937aedba0ba3d2b585052d6e824fde8403838a2c2adc","other":"56029e913c58f9a10a51c25fbf322aee54e844476cb1723c312f0f8bb9c24e39","up":true},{"one":"56029e913c58f9a10a51c25fbf322aee54e844476cb1723c312f0f8bb9c24e39","other":"b73b9aa5a6264c9a018a988a813b9127d9bf970736478cf0dc3edd1c2023f6f2","up":true},{"one":"b73b9aa5a6264c9a018a988a813b9127d9bf970736478cf0dc3edd1c2023f6f2","other":"177e232bdba970f4b001b228af9402e3fca0aaf00682a11bc9984f7db4b7feba","up":true},{"one":"1455d4713b5134e9157517b84b04e15292cf18d3e08b95d69f19648fb9e3823e","other":"7f800e5a7970230f5273e49971c7ee521de97e69f56dd554e30dd12d6fb5c749","up":true},{"one":"177e232bdba970f4b001b228af9402e3fca0aaf00682a11bc9984f7db4b7feba","other":"56029e913c58f9a10a51c25fbf322aee54e844476cb1723c312f0f8bb9c24e39","up":true},{"one":"c461e430c887894bbbff4e337b61ee449cf12cc07d0fc5fe41785d580d16ae98","other":"9629320d648fda3834eddac7263cc6c88651dc6074206cee00144918d2276289","up":true},{"one":"be2bcb8fb4b34ee6981e6634b8f3298fbbee756f6e76566204a56bb86c8ec0f0","other":"f6e5148d2421ae11e8a109852c9da77bbe498f9e6ed3aa361755a1ff3fd29b74","up":true},{"one":"154fec5fa728af956a1446bd5a35e63d716b79a804197b50fd9c72585d044b77","other":"f6e5148d2421ae11e8a109852c9da77bbe498f9e6ed3aa361755a1ff3fd29b74","up":true},{"one":"7d69b5707a4b99edd901317f1553ff15586aac350f38e0c81318f35d68b835a8","other":"56029e913c58f9a10a51c25fbf322aee54e844476cb1723c312f0f8bb9c24e39","up":true},{"one":"3c409e5b76e977ee3115a0a19540dd6745e60b8878fdc1a5c1d996e7e47ca969","other":"56029e913c58f9a10a51c25fbf322aee54e844476cb1723c312f0f8bb9c24e39","up":true},{"one":"e5e166f85ea9e264fc25734523869d9b916f388004cb4af9968956ce14a7a522","other":"7f800e5a7970230f5273e49971c7ee521de97e69f56dd554e30dd12d6fb5c749","up":true},{"one":"e558105d2aeb59c896f5fb70475b046d9034ef4596e9cd5f54f16c316449241e","other":"7f800e5a7970230f5273e49971c7ee521de97e69f56dd554e30dd12d6fb5c749","up":true},{"one":"a12b12081b6d49e82378d5239765bca8c5f43232b30163bc46924cc3e98e1177","other":"f6e5148d2421ae11e8a109852c9da77bbe498f9e6ed3aa361755a1ff3fd29b74","up":true},{"one":"255db8d311a66a7443b15d040afa06626d6919c0d20a6fd0f5afa34e87281732","other":"172bbbcaa57c37c24314a84fbd0b9de45f83a46016bd2395dc2adbab1bb90b5c","up":true},{"one":"e9fd5cd7f8d28ca172a3d331da401e9853d3121923c81bf82787f7989009e43a","other":"7f800e5a7970230f5273e49971c7ee521de97e69f56dd554e30dd12d6fb5c749","up":true},{"one":"f0e900ef37baad6a1685aaf1700e9290e7e9c0d5d30e3265204ec943445248b3","other":"7f800e5a7970230f5273e49971c7ee521de97e69f56dd554e30dd12d6fb5c749","up":true},{"one":"aabc587ddc3b7d493ce8e849b15d364265c57d3a3a52613076a5b31804cb753f","other":"7f800e5a7970230f5273e49971c7ee521de97e69f56dd554e30dd12d6fb5c749","up":true},{"one":"f35a47e1d56a6d8e5caad50d88e55c83ff3b964b279b58a50d5e544ff9187864","other":"856e27ca689a9b2af4cd3ed958f2162b9c71074c726868ac7a10ac2f6f7d021d","up":true},{"one":"0acb17334253408a773202041d4a67c7873b0e74e94c86e3343fb470bdcbed82","other":"7f800e5a7970230f5273e49971c7ee521de97e69f56dd554e30dd12d6fb5c749","up":true},{"one":"f6e5148d2421ae11e8a109852c9da77bbe498f9e6ed3aa361755a1ff3fd29b74","other":"c0c2d73abd2b6abc3ba0b098520c4cc3eda61b5fc9d1ab42ebd04ecc25ded224","up":true},{"one":"892603fc64fe169ad15519060cfb1d27780adff60da60f86a620f2bf9a7ca1e1","other":"a12b12081b6d49e82378d5239765bca8c5f43232b30163bc46924cc3e98e1177","up":true},{"one":"b8f345940bced8831b30079ff2a276ab65fbed0dd8575c93a3ccd8c7bd1bc8b1","other":"154fec5fa728af956a1446bd5a35e63d716b79a804197b50fd9c72585d044b77","up":true},{"one":"3103cd0b7654f593b7228d1715209f27e339ad014019a9738413a20cb6ac63e4","other":"6123b7777de3bc2591e3036a9adeba1f7d8ec933d05ee4fe0017910896925d1b","up":true},{"one":"6123b7777de3bc2591e3036a9adeba1f7d8ec933d05ee4fe0017910896925d1b","other":"cb8df183e7fea4f808ed569d3fa0a6c26670f6451b9a9f48e8659871c2b9ab02","up":true},{"one":"c0c2d73abd2b6abc3ba0b098520c4cc3eda61b5fc9d1ab42ebd04ecc25ded224","other":"04862550ef38f831085f378e2533addc2c904288394631208c49cb33615ada3b","up":true},{"one":"88024b9f684346b775c1c1eb6e9709034135957ab418ec002725f10ef8919837","other":"e5e166f85ea9e264fc25734523869d9b916f388004cb4af9968956ce14a7a522","up":true},{"one":"856e27ca689a9b2af4cd3ed958f2162b9c71074c726868ac7a10ac2f6f7d021d","other":"e5e166f85ea9e264fc25734523869d9b916f388004cb4af9968956ce14a7a522","up":true},{"one":"eb307a6f333b30ebd1e3b2b51bd8095311d48707d6ca2c81447d01ad453e2542","other":"a12b12081b6d49e82378d5239765bca8c5f43232b30163bc46924cc3e98e1177","up":true},{"one":"cb8df183e7fea4f808ed569d3fa0a6c26670f6451b9a9f48e8659871c2b9ab02","other":"0727d7e68c319d3a4cc5a161dd05b2a7e72350c139e65c2090c1232ebbed5f78","up":true},{"one":"04862550ef38f831085f378e2533addc2c904288394631208c49cb33615ada3b","other":"b3744cf6f180c2eb9a1ded0e6ddd600d5f79268387b97333070fb5a183affd89","up":true},{"one":"3abfe9f4f6a8d34b536d02551f45c03a35987b94f7d33b3a0dc30ad34b15f82a","other":"1455d4713b5134e9157517b84b04e15292cf18d3e08b95d69f19648fb9e3823e","up":true},{"one":"57d911f864be7a90d8807bc3fecd658c5697d70cf3ddcc1dde0dd9bd0fd7fb67","other":"04862550ef38f831085f378e2533addc2c904288394631208c49cb33615ada3b","up":true},{"one":"cb8df183e7fea4f808ed569d3fa0a6c26670f6451b9a9f48e8659871c2b9ab02","other":"04862550ef38f831085f378e2533addc2c904288394631208c49cb33615ada3b","up":true},{"one":"172bbbcaa57c37c24314a84fbd0b9de45f83a46016bd2395dc2adbab1bb90b5c","other":"70d0710b3894fabf32b343b9b59339f786ece39895c7eda5f162cc575c9c8253","up":true},{"one":"ae6023d416c87bb433eb9d8d44f97531797d292774304d996923a3fe67887478","other":"248a2e618091deeac458f4741616405e0bc5ffda1a9f9125307e32c781728a75","up":true},{"one":"ae6023d416c87bb433eb9d8d44f97531797d292774304d996923a3fe67887478","other":"fb7e6716614ac941b74e18a9bf3ded63bc00b453221b40976f783675a1c06c63","up":true},{"one":"7f800e5a7970230f5273e49971c7ee521de97e69f56dd554e30dd12d6fb5c749","other":"581ad92d4347834850c16e781983c09be340917527a35dd9650c5a3da1fc822b","up":true},{"one":"70d0710b3894fabf32b343b9b59339f786ece39895c7eda5f162cc575c9c8253","other":"ebf25ce427905106b70625c0084dcb117964a4d4b9951f5977457da5741b716c","up":true},{"one":"38f05af40cd0dc3974e896e24aa75ebda1c96f0ce7d9e3ff0ea840615186307d","other":"856e27ca689a9b2af4cd3ed958f2162b9c71074c726868ac7a10ac2f6f7d021d","up":true},{"one":"581ad92d4347834850c16e781983c09be340917527a35dd9650c5a3da1fc822b","other":"cb8df183e7fea4f808ed569d3fa0a6c26670f6451b9a9f48e8659871c2b9ab02","up":true},{"one":"274f8b752ef0c84a5c3098066b0b4d1c02b8a1b1730f59ed94064535eeda4756","other":"0727d7e68c319d3a4cc5a161dd05b2a7e72350c139e65c2090c1232ebbed5f78","up":true},{"one":"3b4fa7d729129068a1281ef68494b61d055203de8c36a5fe27af3eb565832108","other":"703dc76ac724457c805abcc1ed2e3f321821409fb4cf0185e2f07ebc4c18144f","up":true},{"one":"f211376d46e6e0966ee984cf5837805240b2ba53c5ac75315c56dbdffb957a65","other":"ae6023d416c87bb433eb9d8d44f97531797d292774304d996923a3fe67887478","up":true},{"one":"87acf64b22c579751718dc093c00c82b39feb7023fe53c6486b288960ad9e146","other":"b8f9946b17cea5dbba4ba1c37cd4d00a35717c69fb0e391f24af9294f9030c2e","up":true},{"one":"b3744cf6f180c2eb9a1ded0e6ddd600d5f79268387b97333070fb5a183affd89","other":"c3b2d2f0c72753ed89fc4c580c81f50c66cb02c1f90054650e191a0105c40d1d","up":true},{"one":"b73b9aa5a6264c9a018a988a813b9127d9bf970736478cf0dc3edd1c2023f6f2","other":"f6e5148d2421ae11e8a109852c9da77bbe498f9e6ed3aa361755a1ff3fd29b74","up":true},{"one":"550857bac20787ca7f64937aedba0ba3d2b585052d6e824fde8403838a2c2adc","other":"38f05af40cd0dc3974e896e24aa75ebda1c96f0ce7d9e3ff0ea840615186307d","up":true},{"one":"821af25e6366237cca25681ec633eba88db48a4ff88b5920cdc92e14616140e4","other":"3c409e5b76e977ee3115a0a19540dd6745e60b8878fdc1a5c1d996e7e47ca969","up":true},{"one":"afb1d0b8d1b1f6a341384c1f0818f6b28b85fefe6a45a892552de4de5379f6a5","other":"f6e5148d2421ae11e8a109852c9da77bbe498f9e6ed3aa361755a1ff3fd29b74","up":true},{"one":"b8f9946b17cea5dbba4ba1c37cd4d00a35717c69fb0e391f24af9294f9030c2e","other":"f6e5148d2421ae11e8a109852c9da77bbe498f9e6ed3aa361755a1ff3fd29b74","up":true},{"one":"452b07d73433e7d6c205a504419ae100019aa1920723011272b596607db6684a","other":"248a2e618091deeac458f4741616405e0bc5ffda1a9f9125307e32c781728a75","up":true},{"one":"5e36542bbbc0d70231c9d00742cb30fccf3f206eecf10a0f34332a2986c86ffb","other":"248a2e618091deeac458f4741616405e0bc5ffda1a9f9125307e32c781728a75","up":true},{"one":"5f832158cf84e0e48a3518955878b16ae253467f54664eb4ec1213fefc3f3277","other":"c3b2d2f0c72753ed89fc4c580c81f50c66cb02c1f90054650e191a0105c40d1d","up":true},{"one":"56029e913c58f9a10a51c25fbf322aee54e844476cb1723c312f0f8bb9c24e39","other":"452b07d73433e7d6c205a504419ae100019aa1920723011272b596607db6684a","up":true},{"one":"86735a46da76b3132f729b293b4d8502e939ecba776b8d85b3ae73efa2184b5f","other":"c3b2d2f0c72753ed89fc4c580c81f50c66cb02c1f90054650e191a0105c40d1d","up":true},{"one":"d904f6d8790cc235063f54661521c3a197e3e9cdd9dbbcd6765ec6cda5d8f7b4","other":"821af25e6366237cca25681ec633eba88db48a4ff88b5920cdc92e14616140e4","up":true},{"one":"52fc1e219bc518fbaf289da3236d98db1b63df1227ea32581229671473adc3bd","other":"00ba6c61b2d6480f53f48c3def3ac85587d9b7a92658d21c235fd0fddc246850","up":true},{"one":"d3c19ad4c1abc9af03bffc1abc9717f4e765d5fff7ae776203438bac94d01806","other":"be2bcb8fb4b34ee6981e6634b8f3298fbbee756f6e76566204a56bb86c8ec0f0","up":true},{"one":"0257ed46bd49271306fed0127019fd54db472284d00099f10cadd7e83588a63a","other":"52fc1e219bc518fbaf289da3236d98db1b63df1227ea32581229671473adc3bd","up":true},{"one":"00ba6c61b2d6480f53f48c3def3ac85587d9b7a92658d21c235fd0fddc246850","other":"452b07d73433e7d6c205a504419ae100019aa1920723011272b596607db6684a","up":true},{"one":"e6cf337d0e695e861ea36864e2ace1f4029d5b3246f7bd15ce4dcc220bfe3e48","other":"3c409e5b76e977ee3115a0a19540dd6745e60b8878fdc1a5c1d996e7e47ca969","up":true},{"one":"87aa77dcef19b0c86a3e8ab64c8f12d9a733e77a7e12bcaec3a4cd8504c5a775","other":"d904f6d8790cc235063f54661521c3a197e3e9cdd9dbbcd6765ec6cda5d8f7b4","up":true},{"one":"70d0710b3894fabf32b343b9b59339f786ece39895c7eda5f162cc575c9c8253","other":"00ba6c61b2d6480f53f48c3def3ac85587d9b7a92658d21c235fd0fddc246850","up":true},{"one":"9629320d648fda3834eddac7263cc6c88651dc6074206cee00144918d2276289","other":"be2bcb8fb4b34ee6981e6634b8f3298fbbee756f6e76566204a56bb86c8ec0f0","up":true},{"one":"c3b2d2f0c72753ed89fc4c580c81f50c66cb02c1f90054650e191a0105c40d1d","other":"3c409e5b76e977ee3115a0a19540dd6745e60b8878fdc1a5c1d996e7e47ca969","up":true},{"one":"f211376d46e6e0966ee984cf5837805240b2ba53c5ac75315c56dbdffb957a65","other":"c461e430c887894bbbff4e337b61ee449cf12cc07d0fc5fe41785d580d16ae98","up":true},{"one":"b8f345940bced8831b30079ff2a276ab65fbed0dd8575c93a3ccd8c7bd1bc8b1","other":"9629320d648fda3834eddac7263cc6c88651dc6074206cee00144918d2276289","up":true},{"one":"3103cd0b7654f593b7228d1715209f27e339ad014019a9738413a20cb6ac63e4","other":"1455d4713b5134e9157517b84b04e15292cf18d3e08b95d69f19648fb9e3823e","up":true},{"one":"255db8d311a66a7443b15d040afa06626d6919c0d20a6fd0f5afa34e87281732","other":"3103cd0b7654f593b7228d1715209f27e339ad014019a9738413a20cb6ac63e4","up":true},{"one":"581ad92d4347834850c16e781983c09be340917527a35dd9650c5a3da1fc822b","other":"452b07d73433e7d6c205a504419ae100019aa1920723011272b596607db6684a","up":true},{"one":"e558105d2aeb59c896f5fb70475b046d9034ef4596e9cd5f54f16c316449241e","other":"821af25e6366237cca25681ec633eba88db48a4ff88b5920cdc92e14616140e4","up":true},{"one":"fb7e6716614ac941b74e18a9bf3ded63bc00b453221b40976f783675a1c06c63","other":"afb1d0b8d1b1f6a341384c1f0818f6b28b85fefe6a45a892552de4de5379f6a5","up":true},{"one":"aabc587ddc3b7d493ce8e849b15d364265c57d3a3a52613076a5b31804cb753f","other":"9629320d648fda3834eddac7263cc6c88651dc6074206cee00144918d2276289","up":true},{"one":"172bbbcaa57c37c24314a84fbd0b9de45f83a46016bd2395dc2adbab1bb90b5c","other":"00ba6c61b2d6480f53f48c3def3ac85587d9b7a92658d21c235fd0fddc246850","up":true},{"one":"f35a47e1d56a6d8e5caad50d88e55c83ff3b964b279b58a50d5e544ff9187864","other":"d3c19ad4c1abc9af03bffc1abc9717f4e765d5fff7ae776203438bac94d01806","up":true},{"one":"88024b9f684346b775c1c1eb6e9709034135957ab418ec002725f10ef8919837","other":"be2bcb8fb4b34ee6981e6634b8f3298fbbee756f6e76566204a56bb86c8ec0f0","up":true},{"one":"177e232bdba970f4b001b228af9402e3fca0aaf00682a11bc9984f7db4b7feba","other":"3abfe9f4f6a8d34b536d02551f45c03a35987b94f7d33b3a0dc30ad34b15f82a","up":true},{"one":"e5e166f85ea9e264fc25734523869d9b916f388004cb4af9968956ce14a7a522","other":"d904f6d8790cc235063f54661521c3a197e3e9cdd9dbbcd6765ec6cda5d8f7b4","up":true},{"one":"1455d4713b5134e9157517b84b04e15292cf18d3e08b95d69f19648fb9e3823e","other":"0727d7e68c319d3a4cc5a161dd05b2a7e72350c139e65c2090c1232ebbed5f78","up":true},{"one":"38f05af40cd0dc3974e896e24aa75ebda1c96f0ce7d9e3ff0ea840615186307d","other":"248a2e618091deeac458f4741616405e0bc5ffda1a9f9125307e32c781728a75","up":true},{"one":"f0e900ef37baad6a1685aaf1700e9290e7e9c0d5d30e3265204ec943445248b3","other":"d3c19ad4c1abc9af03bffc1abc9717f4e765d5fff7ae776203438bac94d01806","up":true},{"one":"248a2e618091deeac458f4741616405e0bc5ffda1a9f9125307e32c781728a75","other":"3103cd0b7654f593b7228d1715209f27e339ad014019a9738413a20cb6ac63e4","up":true},{"one":"be2bcb8fb4b34ee6981e6634b8f3298fbbee756f6e76566204a56bb86c8ec0f0","other":"892603fc64fe169ad15519060cfb1d27780adff60da60f86a620f2bf9a7ca1e1","up":true},{"one":"e9fd5cd7f8d28ca172a3d331da401e9853d3121923c81bf82787f7989009e43a","other":"9629320d648fda3834eddac7263cc6c88651dc6074206cee00144918d2276289","up":true},{"one":"ae6023d416c87bb433eb9d8d44f97531797d292774304d996923a3fe67887478","other":"9629320d648fda3834eddac7263cc6c88651dc6074206cee00144918d2276289","up":true},{"one":"0257ed46bd49271306fed0127019fd54db472284d00099f10cadd7e83588a63a","other":"248a2e618091deeac458f4741616405e0bc5ffda1a9f9125307e32c781728a75","up":true},{"one":"550857bac20787ca7f64937aedba0ba3d2b585052d6e824fde8403838a2c2adc","other":"6123b7777de3bc2591e3036a9adeba1f7d8ec933d05ee4fe0017910896925d1b","up":true},{"one":"52fc1e219bc518fbaf289da3236d98db1b63df1227ea32581229671473adc3bd","other":"452b07d73433e7d6c205a504419ae100019aa1920723011272b596607db6684a","up":true},{"one":"d3c19ad4c1abc9af03bffc1abc9717f4e765d5fff7ae776203438bac94d01806","other":"b8f9946b17cea5dbba4ba1c37cd4d00a35717c69fb0e391f24af9294f9030c2e","up":true},{"one":"703dc76ac724457c805abcc1ed2e3f321821409fb4cf0185e2f07ebc4c18144f","other":"5f832158cf84e0e48a3518955878b16ae253467f54664eb4ec1213fefc3f3277","up":true},{"one":"892603fc64fe169ad15519060cfb1d27780adff60da60f86a620f2bf9a7ca1e1","other":"9629320d648fda3834eddac7263cc6c88651dc6074206cee00144918d2276289","up":true},{"one":"274f8b752ef0c84a5c3098066b0b4d1c02b8a1b1730f59ed94064535eeda4756","other":"3c409e5b76e977ee3115a0a19540dd6745e60b8878fdc1a5c1d996e7e47ca969","up":true},{"one":"5f832158cf84e0e48a3518955878b16ae253467f54664eb4ec1213fefc3f3277","other":"6123b7777de3bc2591e3036a9adeba1f7d8ec933d05ee4fe0017910896925d1b","up":true},{"one":"856e27ca689a9b2af4cd3ed958f2162b9c71074c726868ac7a10ac2f6f7d021d","other":"be2bcb8fb4b34ee6981e6634b8f3298fbbee756f6e76566204a56bb86c8ec0f0","up":true},{"one":"3b4fa7d729129068a1281ef68494b61d055203de8c36a5fe27af3eb565832108","other":"00ba6c61b2d6480f53f48c3def3ac85587d9b7a92658d21c235fd0fddc246850","up":true},{"one":"c461e430c887894bbbff4e337b61ee449cf12cc07d0fc5fe41785d580d16ae98","other":"d3c19ad4c1abc9af03bffc1abc9717f4e765d5fff7ae776203438bac94d01806","up":true},{"one":"154fec5fa728af956a1446bd5a35e63d716b79a804197b50fd9c72585d044b77","other":"0727d7e68c319d3a4cc5a161dd05b2a7e72350c139e65c2090c1232ebbed5f78","up":true},{"one":"452b07d73433e7d6c205a504419ae100019aa1920723011272b596607db6684a","other":"7f800e5a7970230f5273e49971c7ee521de97e69f56dd554e30dd12d6fb5c749","up":true},{"one":"b3744cf6f180c2eb9a1ded0e6ddd600d5f79268387b97333070fb5a183affd89","other":"9629320d648fda3834eddac7263cc6c88651dc6074206cee00144918d2276289","up":true},{"one":"87aa77dcef19b0c86a3e8ab64c8f12d9a733e77a7e12bcaec3a4cd8504c5a775","other":"cb8df183e7fea4f808ed569d3fa0a6c26670f6451b9a9f48e8659871c2b9ab02","up":true},{"one":"56029e913c58f9a10a51c25fbf322aee54e844476cb1723c312f0f8bb9c24e39","other":"5e36542bbbc0d70231c9d00742cb30fccf3f206eecf10a0f34332a2986c86ffb","up":true},{"one":"c3b2d2f0c72753ed89fc4c580c81f50c66cb02c1f90054650e191a0105c40d1d","other":"d3c19ad4c1abc9af03bffc1abc9717f4e765d5fff7ae776203438bac94d01806","up":true},{"one":"57d911f864be7a90d8807bc3fecd658c5697d70cf3ddcc1dde0dd9bd0fd7fb67","other":"6123b7777de3bc2591e3036a9adeba1f7d8ec933d05ee4fe0017910896925d1b","up":true},{"one":"3abfe9f4f6a8d34b536d02551f45c03a35987b94f7d33b3a0dc30ad34b15f82a","other":"274f8b752ef0c84a5c3098066b0b4d1c02b8a1b1730f59ed94064535eeda4756","up":true},{"one":"eb307a6f333b30ebd1e3b2b51bd8095311d48707d6ca2c81447d01ad453e2542","other":"d904f6d8790cc235063f54661521c3a197e3e9cdd9dbbcd6765ec6cda5d8f7b4","up":true},{"one":"0acb17334253408a773202041d4a67c7873b0e74e94c86e3343fb470bdcbed82","other":"172bbbcaa57c37c24314a84fbd0b9de45f83a46016bd2395dc2adbab1bb90b5c","up":true},{"one":"e6cf337d0e695e861ea36864e2ace1f4029d5b3246f7bd15ce4dcc220bfe3e48","other":"248a2e618091deeac458f4741616405e0bc5ffda1a9f9125307e32c781728a75","up":true},{"one":"00ba6c61b2d6480f53f48c3def3ac85587d9b7a92658d21c235fd0fddc246850","other":"248a2e618091deeac458f4741616405e0bc5ffda1a9f9125307e32c781728a75","up":true},{"one":"c0c2d73abd2b6abc3ba0b098520c4cc3eda61b5fc9d1ab42ebd04ecc25ded224","other":"d904f6d8790cc235063f54661521c3a197e3e9cdd9dbbcd6765ec6cda5d8f7b4","up":true},{"one":"fb7e6716614ac941b74e18a9bf3ded63bc00b453221b40976f783675a1c06c63","other":"cb8df183e7fea4f808ed569d3fa0a6c26670f6451b9a9f48e8659871c2b9ab02","up":true},{"one":"87acf64b22c579751718dc093c00c82b39feb7023fe53c6486b288960ad9e146","other":"9629320d648fda3834eddac7263cc6c88651dc6074206cee00144918d2276289","up":true},{"one":"5e36542bbbc0d70231c9d00742cb30fccf3f206eecf10a0f34332a2986c86ffb","other":"703dc76ac724457c805abcc1ed2e3f321821409fb4cf0185e2f07ebc4c18144f","up":true},{"one":"b73b9aa5a6264c9a018a988a813b9127d9bf970736478cf0dc3edd1c2023f6f2","other":"892603fc64fe169ad15519060cfb1d27780adff60da60f86a620f2bf9a7ca1e1","up":true},{"one":"70d0710b3894fabf32b343b9b59339f786ece39895c7eda5f162cc575c9c8253","other":"7f800e5a7970230f5273e49971c7ee521de97e69f56dd554e30dd12d6fb5c749","up":true},{"one":"7d69b5707a4b99edd901317f1553ff15586aac350f38e0c81318f35d68b835a8","other":"6123b7777de3bc2591e3036a9adeba1f7d8ec933d05ee4fe0017910896925d1b","up":true},{"one":"e558105d2aeb59c896f5fb70475b046d9034ef4596e9cd5f54f16c316449241e","other":"87aa77dcef19b0c86a3e8ab64c8f12d9a733e77a7e12bcaec3a4cd8504c5a775","up":true},{"one":"b8f9946b17cea5dbba4ba1c37cd4d00a35717c69fb0e391f24af9294f9030c2e","other":"a12b12081b6d49e82378d5239765bca8c5f43232b30163bc46924cc3e98e1177","up":true},{"one":"6123b7777de3bc2591e3036a9adeba1f7d8ec933d05ee4fe0017910896925d1b","other":"452b07d73433e7d6c205a504419ae100019aa1920723011272b596607db6684a","up":true},{"one":"86735a46da76b3132f729b293b4d8502e939ecba776b8d85b3ae73efa2184b5f","other":"b3744cf6f180c2eb9a1ded0e6ddd600d5f79268387b97333070fb5a183affd89","up":true},{"one":"afb1d0b8d1b1f6a341384c1f0818f6b28b85fefe6a45a892552de4de5379f6a5","other":"86735a46da76b3132f729b293b4d8502e939ecba776b8d85b3ae73efa2184b5f","up":true},{"one":"177e232bdba970f4b001b228af9402e3fca0aaf00682a11bc9984f7db4b7feba","other":"255db8d311a66a7443b15d040afa06626d6919c0d20a6fd0f5afa34e87281732","up":true},{"one":"04862550ef38f831085f378e2533addc2c904288394631208c49cb33615ada3b","other":"1455d4713b5134e9157517b84b04e15292cf18d3e08b95d69f19648fb9e3823e","up":true},{"one":"3c409e5b76e977ee3115a0a19540dd6745e60b8878fdc1a5c1d996e7e47ca969","other":"248a2e618091deeac458f4741616405e0bc5ffda1a9f9125307e32c781728a75","up":true},{"one":"a12b12081b6d49e82378d5239765bca8c5f43232b30163bc46924cc3e98e1177","other":"be2bcb8fb4b34ee6981e6634b8f3298fbbee756f6e76566204a56bb86c8ec0f0","up":true},{"one":"821af25e6366237cca25681ec633eba88db48a4ff88b5920cdc92e14616140e4","other":"9629320d648fda3834eddac7263cc6c88651dc6074206cee00144918d2276289","up":true},{"one":"b8f345940bced8831b30079ff2a276ab65fbed0dd8575c93a3ccd8c7bd1bc8b1","other":"821af25e6366237cca25681ec633eba88db48a4ff88b5920cdc92e14616140e4","up":true},{"one":"581ad92d4347834850c16e781983c09be340917527a35dd9650c5a3da1fc822b","other":"52fc1e219bc518fbaf289da3236d98db1b63df1227ea32581229671473adc3bd","up":true},{"one":"f6e5148d2421ae11e8a109852c9da77bbe498f9e6ed3aa361755a1ff3fd29b74","other":"e5e166f85ea9e264fc25734523869d9b916f388004cb4af9968956ce14a7a522","up":true},{"one":"e558105d2aeb59c896f5fb70475b046d9034ef4596e9cd5f54f16c316449241e","other":"f6e5148d2421ae11e8a109852c9da77bbe498f9e6ed3aa361755a1ff3fd29b74","up":true},{"one":"0257ed46bd49271306fed0127019fd54db472284d00099f10cadd7e83588a63a","other":"255db8d311a66a7443b15d040afa06626d6919c0d20a6fd0f5afa34e87281732","up":true},{"one":"fb7e6716614ac941b74e18a9bf3ded63bc00b453221b40976f783675a1c06c63","other":"d904f6d8790cc235063f54661521c3a197e3e9cdd9dbbcd6765ec6cda5d8f7b4","up":true},{"one":"ebf25ce427905106b70625c0084dcb117964a4d4b9951f5977457da5741b716c","other":"fb7e6716614ac941b74e18a9bf3ded63bc00b453221b40976f783675a1c06c63","up":true},{"one":"e9fd5cd7f8d28ca172a3d331da401e9853d3121923c81bf82787f7989009e43a","other":"821af25e6366237cca25681ec633eba88db48a4ff88b5920cdc92e14616140e4","up":true},{"one":"aabc587ddc3b7d493ce8e849b15d364265c57d3a3a52613076a5b31804cb753f","other":"821af25e6366237cca25681ec633eba88db48a4ff88b5920cdc92e14616140e4","up":true},{"one":"154fec5fa728af956a1446bd5a35e63d716b79a804197b50fd9c72585d044b77","other":"04862550ef38f831085f378e2533addc2c904288394631208c49cb33615ada3b","up":true},{"one":"255db8d311a66a7443b15d040afa06626d6919c0d20a6fd0f5afa34e87281732","other":"3c409e5b76e977ee3115a0a19540dd6745e60b8878fdc1a5c1d996e7e47ca969","up":true},{"one":"f0e900ef37baad6a1685aaf1700e9290e7e9c0d5d30e3265204ec943445248b3","other":"d904f6d8790cc235063f54661521c3a197e3e9cdd9dbbcd6765ec6cda5d8f7b4","up":true},{"one":"3b4fa7d729129068a1281ef68494b61d055203de8c36a5fe27af3eb565832108","other":"0acb17334253408a773202041d4a67c7873b0e74e94c86e3343fb470bdcbed82","up":true},{"one":"7f800e5a7970230f5273e49971c7ee521de97e69f56dd554e30dd12d6fb5c749","other":"6123b7777de3bc2591e3036a9adeba1f7d8ec933d05ee4fe0017910896925d1b","up":true},{"one":"f35a47e1d56a6d8e5caad50d88e55c83ff3b964b279b58a50d5e544ff9187864","other":"d904f6d8790cc235063f54661521c3a197e3e9cdd9dbbcd6765ec6cda5d8f7b4","up":true},{"one":"ae6023d416c87bb433eb9d8d44f97531797d292774304d996923a3fe67887478","other":"892603fc64fe169ad15519060cfb1d27780adff60da60f86a620f2bf9a7ca1e1","up":true},{"one":"88024b9f684346b775c1c1eb6e9709034135957ab418ec002725f10ef8919837","other":"b8f345940bced8831b30079ff2a276ab65fbed0dd8575c93a3ccd8c7bd1bc8b1","up":true},{"one":"f211376d46e6e0966ee984cf5837805240b2ba53c5ac75315c56dbdffb957a65","other":"c0c2d73abd2b6abc3ba0b098520c4cc3eda61b5fc9d1ab42ebd04ecc25ded224","up":true},{"one":"57d911f864be7a90d8807bc3fecd658c5697d70cf3ddcc1dde0dd9bd0fd7fb67","other":"70d0710b3894fabf32b343b9b59339f786ece39895c7eda5f162cc575c9c8253","up":true},{"one":"eb307a6f333b30ebd1e3b2b51bd8095311d48707d6ca2c81447d01ad453e2542","other":"d3c19ad4c1abc9af03bffc1abc9717f4e765d5fff7ae776203438bac94d01806","up":true},{"one":"b73b9aa5a6264c9a018a988a813b9127d9bf970736478cf0dc3edd1c2023f6f2","other":"88024b9f684346b775c1c1eb6e9709034135957ab418ec002725f10ef8919837","up":true},{"one":"3abfe9f4f6a8d34b536d02551f45c03a35987b94f7d33b3a0dc30ad34b15f82a","other":"248a2e618091deeac458f4741616405e0bc5ffda1a9f9125307e32c781728a75","up":true},{"one":"856e27ca689a9b2af4cd3ed958f2162b9c71074c726868ac7a10ac2f6f7d021d","other":"b8f9946b17cea5dbba4ba1c37cd4d00a35717c69fb0e391f24af9294f9030c2e","up":true},{"one":"274f8b752ef0c84a5c3098066b0b4d1c02b8a1b1730f59ed94064535eeda4756","other":"3103cd0b7654f593b7228d1715209f27e339ad014019a9738413a20cb6ac63e4","up":true},{"one":"177e232bdba970f4b001b228af9402e3fca0aaf00682a11bc9984f7db4b7feba","other":"04862550ef38f831085f378e2533addc2c904288394631208c49cb33615ada3b","up":true},{"one":"550857bac20787ca7f64937aedba0ba3d2b585052d6e824fde8403838a2c2adc","other":"7f800e5a7970230f5273e49971c7ee521de97e69f56dd554e30dd12d6fb5c749","up":true},{"one":"87aa77dcef19b0c86a3e8ab64c8f12d9a733e77a7e12bcaec3a4cd8504c5a775","other":"aabc587ddc3b7d493ce8e849b15d364265c57d3a3a52613076a5b31804cb753f","up":true},{"one":"38f05af40cd0dc3974e896e24aa75ebda1c96f0ce7d9e3ff0ea840615186307d","other":"274f8b752ef0c84a5c3098066b0b4d1c02b8a1b1730f59ed94064535eeda4756","up":true},{"one":"c461e430c887894bbbff4e337b61ee449cf12cc07d0fc5fe41785d580d16ae98","other":"d904f6d8790cc235063f54661521c3a197e3e9cdd9dbbcd6765ec6cda5d8f7b4","up":true},{"one":"b3744cf6f180c2eb9a1ded0e6ddd600d5f79268387b97333070fb5a183affd89","other":"88024b9f684346b775c1c1eb6e9709034135957ab418ec002725f10ef8919837","up":true},{"one":"177e232bdba970f4b001b228af9402e3fca0aaf00682a11bc9984f7db4b7feba","other":"0727d7e68c319d3a4cc5a161dd05b2a7e72350c139e65c2090c1232ebbed5f78","up":true},{"one":"7d69b5707a4b99edd901317f1553ff15586aac350f38e0c81318f35d68b835a8","other":"70d0710b3894fabf32b343b9b59339f786ece39895c7eda5f162cc575c9c8253","up":true},{"one":"aabc587ddc3b7d493ce8e849b15d364265c57d3a3a52613076a5b31804cb753f","other":"fb7e6716614ac941b74e18a9bf3ded63bc00b453221b40976f783675a1c06c63","up":true},{"one":"892603fc64fe169ad15519060cfb1d27780adff60da60f86a620f2bf9a7ca1e1","other":"821af25e6366237cca25681ec633eba88db48a4ff88b5920cdc92e14616140e4","up":true},{"one":"b8f345940bced8831b30079ff2a276ab65fbed0dd8575c93a3ccd8c7bd1bc8b1","other":"a12b12081b6d49e82378d5239765bca8c5f43232b30163bc46924cc3e98e1177","up":true},{"one":"0acb17334253408a773202041d4a67c7873b0e74e94c86e3343fb470bdcbed82","other":"177e232bdba970f4b001b228af9402e3fca0aaf00682a11bc9984f7db4b7feba","up":true},{"one":"856e27ca689a9b2af4cd3ed958f2162b9c71074c726868ac7a10ac2f6f7d021d","other":"9629320d648fda3834eddac7263cc6c88651dc6074206cee00144918d2276289","up":true},{"one":"177e232bdba970f4b001b228af9402e3fca0aaf00682a11bc9984f7db4b7feba","other":"3103cd0b7654f593b7228d1715209f27e339ad014019a9738413a20cb6ac63e4","up":true},{"one":"5e36542bbbc0d70231c9d00742cb30fccf3f206eecf10a0f34332a2986c86ffb","other":"6123b7777de3bc2591e3036a9adeba1f7d8ec933d05ee4fe0017910896925d1b","up":true},{"one":"57d911f864be7a90d8807bc3fecd658c5697d70cf3ddcc1dde0dd9bd0fd7fb67","other":"5f832158cf84e0e48a3518955878b16ae253467f54664eb4ec1213fefc3f3277","up":true},{"one":"70d0710b3894fabf32b343b9b59339f786ece39895c7eda5f162cc575c9c8253","other":"6123b7777de3bc2591e3036a9adeba1f7d8ec933d05ee4fe0017910896925d1b","up":true},{"one":"b73b9aa5a6264c9a018a988a813b9127d9bf970736478cf0dc3edd1c2023f6f2","other":"b8f9946b17cea5dbba4ba1c37cd4d00a35717c69fb0e391f24af9294f9030c2e","up":true},{"one":"b73b9aa5a6264c9a018a988a813b9127d9bf970736478cf0dc3edd1c2023f6f2","other":"a12b12081b6d49e82378d5239765bca8c5f43232b30163bc46924cc3e98e1177","up":true},{"one":"e5e166f85ea9e264fc25734523869d9b916f388004cb4af9968956ce14a7a522","other":"d3c19ad4c1abc9af03bffc1abc9717f4e765d5fff7ae776203438bac94d01806","up":true},{"one":"e9fd5cd7f8d28ca172a3d331da401e9853d3121923c81bf82787f7989009e43a","other":"d3c19ad4c1abc9af03bffc1abc9717f4e765d5fff7ae776203438bac94d01806","up":true},{"one":"56029e913c58f9a10a51c25fbf322aee54e844476cb1723c312f0f8bb9c24e39","other":"581ad92d4347834850c16e781983c09be340917527a35dd9650c5a3da1fc822b","up":true},{"one":"ebf25ce427905106b70625c0084dcb117964a4d4b9951f5977457da5741b716c","other":"f6e5148d2421ae11e8a109852c9da77bbe498f9e6ed3aa361755a1ff3fd29b74","up":true},{"one":"c0c2d73abd2b6abc3ba0b098520c4cc3eda61b5fc9d1ab42ebd04ecc25ded224","other":"d3c19ad4c1abc9af03bffc1abc9717f4e765d5fff7ae776203438bac94d01806","up":true},{"one":"3c409e5b76e977ee3115a0a19540dd6745e60b8878fdc1a5c1d996e7e47ca969","other":"3103cd0b7654f593b7228d1715209f27e339ad014019a9738413a20cb6ac63e4","up":true},{"one":"afb1d0b8d1b1f6a341384c1f0818f6b28b85fefe6a45a892552de4de5379f6a5","other":"892603fc64fe169ad15519060cfb1d27780adff60da60f86a620f2bf9a7ca1e1","up":true},{"one":"e9fd5cd7f8d28ca172a3d331da401e9853d3121923c81bf82787f7989009e43a","other":"e5e166f85ea9e264fc25734523869d9b916f388004cb4af9968956ce14a7a522","up":true},{"one":"154fec5fa728af956a1446bd5a35e63d716b79a804197b50fd9c72585d044b77","other":"172bbbcaa57c37c24314a84fbd0b9de45f83a46016bd2395dc2adbab1bb90b5c","up":true},{"one":"550857bac20787ca7f64937aedba0ba3d2b585052d6e824fde8403838a2c2adc","other":"452b07d73433e7d6c205a504419ae100019aa1920723011272b596607db6684a","up":true},{"one":"87acf64b22c579751718dc093c00c82b39feb7023fe53c6486b288960ad9e146","other":"88024b9f684346b775c1c1eb6e9709034135957ab418ec002725f10ef8919837","up":true},{"one":"856e27ca689a9b2af4cd3ed958f2162b9c71074c726868ac7a10ac2f6f7d021d","other":"821af25e6366237cca25681ec633eba88db48a4ff88b5920cdc92e14616140e4","up":true},{"one":"ae6023d416c87bb433eb9d8d44f97531797d292774304d996923a3fe67887478","other":"b8f9946b17cea5dbba4ba1c37cd4d00a35717c69fb0e391f24af9294f9030c2e","up":true},{"one":"550857bac20787ca7f64937aedba0ba3d2b585052d6e824fde8403838a2c2adc","other":"581ad92d4347834850c16e781983c09be340917527a35dd9650c5a3da1fc822b","up":true},{"one":"eb307a6f333b30ebd1e3b2b51bd8095311d48707d6ca2c81447d01ad453e2542","other":"fb7e6716614ac941b74e18a9bf3ded63bc00b453221b40976f783675a1c06c63","up":true},{"one":"86735a46da76b3132f729b293b4d8502e939ecba776b8d85b3ae73efa2184b5f","other":"be2bcb8fb4b34ee6981e6634b8f3298fbbee756f6e76566204a56bb86c8ec0f0","up":true},{"one":"afb1d0b8d1b1f6a341384c1f0818f6b28b85fefe6a45a892552de4de5379f6a5","other":"b8f9946b17cea5dbba4ba1c37cd4d00a35717c69fb0e391f24af9294f9030c2e","up":true},{"one":"aabc587ddc3b7d493ce8e849b15d364265c57d3a3a52613076a5b31804cb753f","other":"b3744cf6f180c2eb9a1ded0e6ddd600d5f79268387b97333070fb5a183affd89","up":true},{"one":"b73b9aa5a6264c9a018a988a813b9127d9bf970736478cf0dc3edd1c2023f6f2","other":"be2bcb8fb4b34ee6981e6634b8f3298fbbee756f6e76566204a56bb86c8ec0f0","up":true},{"one":"7d69b5707a4b99edd901317f1553ff15586aac350f38e0c81318f35d68b835a8","other":"703dc76ac724457c805abcc1ed2e3f321821409fb4cf0185e2f07ebc4c18144f","up":true},{"one":"38f05af40cd0dc3974e896e24aa75ebda1c96f0ce7d9e3ff0ea840615186307d","other":"3103cd0b7654f593b7228d1715209f27e339ad014019a9738413a20cb6ac63e4","up":true},{"one":"154fec5fa728af956a1446bd5a35e63d716b79a804197b50fd9c72585d044b77","other":"0257ed46bd49271306fed0127019fd54db472284d00099f10cadd7e83588a63a","up":true},{"one":"7f800e5a7970230f5273e49971c7ee521de97e69f56dd554e30dd12d6fb5c749","other":"703dc76ac724457c805abcc1ed2e3f321821409fb4cf0185e2f07ebc4c18144f","up":true},{"one":"b3744cf6f180c2eb9a1ded0e6ddd600d5f79268387b97333070fb5a183affd89","other":"a12b12081b6d49e82378d5239765bca8c5f43232b30163bc46924cc3e98e1177","up":true},{"one":"f35a47e1d56a6d8e5caad50d88e55c83ff3b964b279b58a50d5e544ff9187864","other":"fb7e6716614ac941b74e18a9bf3ded63bc00b453221b40976f783675a1c06c63","up":true},{"one":"e9fd5cd7f8d28ca172a3d331da401e9853d3121923c81bf82787f7989009e43a","other":"d904f6d8790cc235063f54661521c3a197e3e9cdd9dbbcd6765ec6cda5d8f7b4","up":true},{"one":"cb8df183e7fea4f808ed569d3fa0a6c26670f6451b9a9f48e8659871c2b9ab02","other":"f6e5148d2421ae11e8a109852c9da77bbe498f9e6ed3aa361755a1ff3fd29b74","up":true},{"one":"f211376d46e6e0966ee984cf5837805240b2ba53c5ac75315c56dbdffb957a65","other":"e6cf337d0e695e861ea36864e2ace1f4029d5b3246f7bd15ce4dcc220bfe3e48","up":true},{"one":"ae6023d416c87bb433eb9d8d44f97531797d292774304d996923a3fe67887478","other":"b8f345940bced8831b30079ff2a276ab65fbed0dd8575c93a3ccd8c7bd1bc8b1","up":true},{"one":"eb307a6f333b30ebd1e3b2b51bd8095311d48707d6ca2c81447d01ad453e2542","other":"f6e5148d2421ae11e8a109852c9da77bbe498f9e6ed3aa361755a1ff3fd29b74","up":true},{"one":"154fec5fa728af956a1446bd5a35e63d716b79a804197b50fd9c72585d044b77","other":"a12b12081b6d49e82378d5239765bca8c5f43232b30163bc46924cc3e98e1177","up":true},{"one":"e558105d2aeb59c896f5fb70475b046d9034ef4596e9cd5f54f16c316449241e","other":"fb7e6716614ac941b74e18a9bf3ded63bc00b453221b40976f783675a1c06c63","up":true},{"one":"57d911f864be7a90d8807bc3fecd658c5697d70cf3ddcc1dde0dd9bd0fd7fb67","other":"452b07d73433e7d6c205a504419ae100019aa1920723011272b596607db6684a","up":true},{"one":"87acf64b22c579751718dc093c00c82b39feb7023fe53c6486b288960ad9e146","other":"892603fc64fe169ad15519060cfb1d27780adff60da60f86a620f2bf9a7ca1e1","up":true},{"one":"ebf25ce427905106b70625c0084dcb117964a4d4b9951f5977457da5741b716c","other":"e5e166f85ea9e264fc25734523869d9b916f388004cb4af9968956ce14a7a522","up":true},{"one":"57d911f864be7a90d8807bc3fecd658c5697d70cf3ddcc1dde0dd9bd0fd7fb67","other":"d3c19ad4c1abc9af03bffc1abc9717f4e765d5fff7ae776203438bac94d01806","up":true},{"one":"88024b9f684346b775c1c1eb6e9709034135957ab418ec002725f10ef8919837","other":"9629320d648fda3834eddac7263cc6c88651dc6074206cee00144918d2276289","up":true},{"one":"56029e913c58f9a10a51c25fbf322aee54e844476cb1723c312f0f8bb9c24e39","other":"52fc1e219bc518fbaf289da3236d98db1b63df1227ea32581229671473adc3bd","up":true},{"one":"56029e913c58f9a10a51c25fbf322aee54e844476cb1723c312f0f8bb9c24e39","other":"5f832158cf84e0e48a3518955878b16ae253467f54664eb4ec1213fefc3f3277","up":true},{"one":"b3744cf6f180c2eb9a1ded0e6ddd600d5f79268387b97333070fb5a183affd89","other":"be2bcb8fb4b34ee6981e6634b8f3298fbbee756f6e76566204a56bb86c8ec0f0","up":true},{"one":"52fc1e219bc518fbaf289da3236d98db1b63df1227ea32581229671473adc3bd","other":"5e36542bbbc0d70231c9d00742cb30fccf3f206eecf10a0f34332a2986c86ffb","up":true},{"one":"ebf25ce427905106b70625c0084dcb117964a4d4b9951f5977457da5741b716c","other":"e558105d2aeb59c896f5fb70475b046d9034ef4596e9cd5f54f16c316449241e","up":true},{"one":"e9fd5cd7f8d28ca172a3d331da401e9853d3121923c81bf82787f7989009e43a","other":"e6cf337d0e695e861ea36864e2ace1f4029d5b3246f7bd15ce4dcc220bfe3e48","up":true},{"one":"856e27ca689a9b2af4cd3ed958f2162b9c71074c726868ac7a10ac2f6f7d021d","other":"86735a46da76b3132f729b293b4d8502e939ecba776b8d85b3ae73efa2184b5f","up":true},{"one":"7d69b5707a4b99edd901317f1553ff15586aac350f38e0c81318f35d68b835a8","other":"7f800e5a7970230f5273e49971c7ee521de97e69f56dd554e30dd12d6fb5c749","up":true},{"one":"0727d7e68c319d3a4cc5a161dd05b2a7e72350c139e65c2090c1232ebbed5f78","other":"0acb17334253408a773202041d4a67c7873b0e74e94c86e3343fb470bdcbed82","up":true},{"one":"b73b9aa5a6264c9a018a988a813b9127d9bf970736478cf0dc3edd1c2023f6f2","other":"b3744cf6f180c2eb9a1ded0e6ddd600d5f79268387b97333070fb5a183affd89","up":true},{"one":"e6cf337d0e695e861ea36864e2ace1f4029d5b3246f7bd15ce4dcc220bfe3e48","other":"fb7e6716614ac941b74e18a9bf3ded63bc00b453221b40976f783675a1c06c63","up":true},{"one":"f0e900ef37baad6a1685aaf1700e9290e7e9c0d5d30e3265204ec943445248b3","other":"fb7e6716614ac941b74e18a9bf3ded63bc00b453221b40976f783675a1c06c63","up":true},{"one":"88024b9f684346b775c1c1eb6e9709034135957ab418ec002725f10ef8919837","other":"821af25e6366237cca25681ec633eba88db48a4ff88b5920cdc92e14616140e4","up":true},{"one":"b3744cf6f180c2eb9a1ded0e6ddd600d5f79268387b97333070fb5a183affd89","other":"afb1d0b8d1b1f6a341384c1f0818f6b28b85fefe6a45a892552de4de5379f6a5","up":true},{"one":"57d911f864be7a90d8807bc3fecd658c5697d70cf3ddcc1dde0dd9bd0fd7fb67","other":"52fc1e219bc518fbaf289da3236d98db1b63df1227ea32581229671473adc3bd","up":true},{"one":"f211376d46e6e0966ee984cf5837805240b2ba53c5ac75315c56dbdffb957a65","other":"f6e5148d2421ae11e8a109852c9da77bbe498f9e6ed3aa361755a1ff3fd29b74","up":true},{"one":"b73b9aa5a6264c9a018a988a813b9127d9bf970736478cf0dc3edd1c2023f6f2","other":"afb1d0b8d1b1f6a341384c1f0818f6b28b85fefe6a45a892552de4de5379f6a5","up":true},{"one":"703dc76ac724457c805abcc1ed2e3f321821409fb4cf0185e2f07ebc4c18144f","other":"6123b7777de3bc2591e3036a9adeba1f7d8ec933d05ee4fe0017910896925d1b","up":true},{"one":"5e36542bbbc0d70231c9d00742cb30fccf3f206eecf10a0f34332a2986c86ffb","other":"452b07d73433e7d6c205a504419ae100019aa1920723011272b596607db6684a","up":true},{"one":"86735a46da76b3132f729b293b4d8502e939ecba776b8d85b3ae73efa2184b5f","other":"9629320d648fda3834eddac7263cc6c88651dc6074206cee00144918d2276289","up":true},{"one":"255db8d311a66a7443b15d040afa06626d6919c0d20a6fd0f5afa34e87281732","other":"274f8b752ef0c84a5c3098066b0b4d1c02b8a1b1730f59ed94064535eeda4756","up":true},{"one":"550857bac20787ca7f64937aedba0ba3d2b585052d6e824fde8403838a2c2adc","other":"52fc1e219bc518fbaf289da3236d98db1b63df1227ea32581229671473adc3bd","up":true},{"one":"70d0710b3894fabf32b343b9b59339f786ece39895c7eda5f162cc575c9c8253","other":"703dc76ac724457c805abcc1ed2e3f321821409fb4cf0185e2f07ebc4c18144f","up":true},{"one":"87acf64b22c579751718dc093c00c82b39feb7023fe53c6486b288960ad9e146","other":"821af25e6366237cca25681ec633eba88db48a4ff88b5920cdc92e14616140e4","up":true},{"one":"7d69b5707a4b99edd901317f1553ff15586aac350f38e0c81318f35d68b835a8","other":"fb7e6716614ac941b74e18a9bf3ded63bc00b453221b40976f783675a1c06c63","up":true},{"one":"7d69b5707a4b99edd901317f1553ff15586aac350f38e0c81318f35d68b835a8","other":"3103cd0b7654f593b7228d1715209f27e339ad014019a9738413a20cb6ac63e4","up":true},{"one":"3b4fa7d729129068a1281ef68494b61d055203de8c36a5fe27af3eb565832108","other":"274f8b752ef0c84a5c3098066b0b4d1c02b8a1b1730f59ed94064535eeda4756","up":true},{"one":"87aa77dcef19b0c86a3e8ab64c8f12d9a733e77a7e12bcaec3a4cd8504c5a775","other":"afb1d0b8d1b1f6a341384c1f0818f6b28b85fefe6a45a892552de4de5379f6a5","up":true},{"one":"e558105d2aeb59c896f5fb70475b046d9034ef4596e9cd5f54f16c316449241e","other":"e6cf337d0e695e861ea36864e2ace1f4029d5b3246f7bd15ce4dcc220bfe3e48","up":true},{"one":"0acb17334253408a773202041d4a67c7873b0e74e94c86e3343fb470bdcbed82","other":"00ba6c61b2d6480f53f48c3def3ac85587d9b7a92658d21c235fd0fddc246850","up":true},{"one":"e6cf337d0e695e861ea36864e2ace1f4029d5b3246f7bd15ce4dcc220bfe3e48","other":"f6e5148d2421ae11e8a109852c9da77bbe498f9e6ed3aa361755a1ff3fd29b74","up":true},{"one":"0257ed46bd49271306fed0127019fd54db472284d00099f10cadd7e83588a63a","other":"0acb17334253408a773202041d4a67c7873b0e74e94c86e3343fb470bdcbed82","up":true},{"one":"154fec5fa728af956a1446bd5a35e63d716b79a804197b50fd9c72585d044b77","other":"177e232bdba970f4b001b228af9402e3fca0aaf00682a11bc9984f7db4b7feba","up":true},{"one":"86735a46da76b3132f729b293b4d8502e939ecba776b8d85b3ae73efa2184b5f","other":"892603fc64fe169ad15519060cfb1d27780adff60da60f86a620f2bf9a7ca1e1","up":true},{"one":"52fc1e219bc518fbaf289da3236d98db1b63df1227ea32581229671473adc3bd","other":"5f832158cf84e0e48a3518955878b16ae253467f54664eb4ec1213fefc3f3277","up":true},{"one":"38f05af40cd0dc3974e896e24aa75ebda1c96f0ce7d9e3ff0ea840615186307d","other":"3c409e5b76e977ee3115a0a19540dd6745e60b8878fdc1a5c1d996e7e47ca969","up":true},{"one":"88024b9f684346b775c1c1eb6e9709034135957ab418ec002725f10ef8919837","other":"892603fc64fe169ad15519060cfb1d27780adff60da60f86a620f2bf9a7ca1e1","up":true},{"one":"cb8df183e7fea4f808ed569d3fa0a6c26670f6451b9a9f48e8659871c2b9ab02","other":"c3b2d2f0c72753ed89fc4c580c81f50c66cb02c1f90054650e191a0105c40d1d","up":true},{"one":"3b4fa7d729129068a1281ef68494b61d055203de8c36a5fe27af3eb565832108","other":"3c409e5b76e977ee3115a0a19540dd6745e60b8878fdc1a5c1d996e7e47ca969","up":true},{"one":"172bbbcaa57c37c24314a84fbd0b9de45f83a46016bd2395dc2adbab1bb90b5c","other":"1455d4713b5134e9157517b84b04e15292cf18d3e08b95d69f19648fb9e3823e","up":true},{"one":"57d911f864be7a90d8807bc3fecd658c5697d70cf3ddcc1dde0dd9bd0fd7fb67","other":"56029e913c58f9a10a51c25fbf322aee54e844476cb1723c312f0f8bb9c24e39","up":true},{"one":"f35a47e1d56a6d8e5caad50d88e55c83ff3b964b279b58a50d5e544ff9187864","other":"f6e5148d2421ae11e8a109852c9da77bbe498f9e6ed3aa361755a1ff3fd29b74","up":true},{"one":"56029e913c58f9a10a51c25fbf322aee54e844476cb1723c312f0f8bb9c24e39","other":"d3c19ad4c1abc9af03bffc1abc9717f4e765d5fff7ae776203438bac94d01806","up":true},{"one":"0727d7e68c319d3a4cc5a161dd05b2a7e72350c139e65c2090c1232ebbed5f78","other":"00ba6c61b2d6480f53f48c3def3ac85587d9b7a92658d21c235fd0fddc246850","up":true},{"one":"c0c2d73abd2b6abc3ba0b098520c4cc3eda61b5fc9d1ab42ebd04ecc25ded224","other":"c461e430c887894bbbff4e337b61ee449cf12cc07d0fc5fe41785d580d16ae98","up":true},{"one":"d3c19ad4c1abc9af03bffc1abc9717f4e765d5fff7ae776203438bac94d01806","other":"d904f6d8790cc235063f54661521c3a197e3e9cdd9dbbcd6765ec6cda5d8f7b4","up":true},{"one":"f0e900ef37baad6a1685aaf1700e9290e7e9c0d5d30e3265204ec943445248b3","other":"f6e5148d2421ae11e8a109852c9da77bbe498f9e6ed3aa361755a1ff3fd29b74","up":true},{"one":"0257ed46bd49271306fed0127019fd54db472284d00099f10cadd7e83588a63a","other":"00ba6c61b2d6480f53f48c3def3ac85587d9b7a92658d21c235fd0fddc246850","up":true},{"one":"b8f345940bced8831b30079ff2a276ab65fbed0dd8575c93a3ccd8c7bd1bc8b1","other":"b3744cf6f180c2eb9a1ded0e6ddd600d5f79268387b97333070fb5a183affd89","up":true},{"one":"581ad92d4347834850c16e781983c09be340917527a35dd9650c5a3da1fc822b","other":"5e36542bbbc0d70231c9d00742cb30fccf3f206eecf10a0f34332a2986c86ffb","up":true},{"one":"c461e430c887894bbbff4e337b61ee449cf12cc07d0fc5fe41785d580d16ae98","other":"cb8df183e7fea4f808ed569d3fa0a6c26670f6451b9a9f48e8659871c2b9ab02","up":true},{"one":"cb8df183e7fea4f808ed569d3fa0a6c26670f6451b9a9f48e8659871c2b9ab02","other":"d904f6d8790cc235063f54661521c3a197e3e9cdd9dbbcd6765ec6cda5d8f7b4","up":true},{"one":"f6e5148d2421ae11e8a109852c9da77bbe498f9e6ed3aa361755a1ff3fd29b74","other":"fb7e6716614ac941b74e18a9bf3ded63bc00b453221b40976f783675a1c06c63","up":true},{"one":"87aa77dcef19b0c86a3e8ab64c8f12d9a733e77a7e12bcaec3a4cd8504c5a775","other":"9629320d648fda3834eddac7263cc6c88651dc6074206cee00144918d2276289","up":true},{"one":"1455d4713b5134e9157517b84b04e15292cf18d3e08b95d69f19648fb9e3823e","other":"177e232bdba970f4b001b228af9402e3fca0aaf00682a11bc9984f7db4b7feba","up":true},{"one":"154fec5fa728af956a1446bd5a35e63d716b79a804197b50fd9c72585d044b77","other":"1455d4713b5134e9157517b84b04e15292cf18d3e08b95d69f19648fb9e3823e","up":true},{"one":"581ad92d4347834850c16e781983c09be340917527a35dd9650c5a3da1fc822b","other":"9629320d648fda3834eddac7263cc6c88651dc6074206cee00144918d2276289","up":true},{"one":"255db8d311a66a7443b15d040afa06626d6919c0d20a6fd0f5afa34e87281732","other":"248a2e618091deeac458f4741616405e0bc5ffda1a9f9125307e32c781728a75","up":true},{"one":"3abfe9f4f6a8d34b536d02551f45c03a35987b94f7d33b3a0dc30ad34b15f82a","other":"3103cd0b7654f593b7228d1715209f27e339ad014019a9738413a20cb6ac63e4","up":true},{"one":"cb8df183e7fea4f808ed569d3fa0a6c26670f6451b9a9f48e8659871c2b9ab02","other":"452b07d73433e7d6c205a504419ae100019aa1920723011272b596607db6684a","up":true},{"one":"581ad92d4347834850c16e781983c09be340917527a35dd9650c5a3da1fc822b","other":"5f832158cf84e0e48a3518955878b16ae253467f54664eb4ec1213fefc3f3277","up":true},{"one":"3b4fa7d729129068a1281ef68494b61d055203de8c36a5fe27af3eb565832108","other":"3103cd0b7654f593b7228d1715209f27e339ad014019a9738413a20cb6ac63e4","up":true},{"one":"856e27ca689a9b2af4cd3ed958f2162b9c71074c726868ac7a10ac2f6f7d021d","other":"87acf64b22c579751718dc093c00c82b39feb7023fe53c6486b288960ad9e146","up":true},{"one":"c0c2d73abd2b6abc3ba0b098520c4cc3eda61b5fc9d1ab42ebd04ecc25ded224","other":"c3b2d2f0c72753ed89fc4c580c81f50c66cb02c1f90054650e191a0105c40d1d","up":true},{"one":"a12b12081b6d49e82378d5239765bca8c5f43232b30163bc46924cc3e98e1177","other":"1455d4713b5134e9157517b84b04e15292cf18d3e08b95d69f19648fb9e3823e","up":true},{"one":"3c409e5b76e977ee3115a0a19540dd6745e60b8878fdc1a5c1d996e7e47ca969","other":"3abfe9f4f6a8d34b536d02551f45c03a35987b94f7d33b3a0dc30ad34b15f82a","up":true},{"one":"a12b12081b6d49e82378d5239765bca8c5f43232b30163bc46924cc3e98e1177","other":"aabc587ddc3b7d493ce8e849b15d364265c57d3a3a52613076a5b31804cb753f","up":true},{"one":"cb8df183e7fea4f808ed569d3fa0a6c26670f6451b9a9f48e8659871c2b9ab02","other":"d3c19ad4c1abc9af03bffc1abc9717f4e765d5fff7ae776203438bac94d01806","up":true},{"one":"0acb17334253408a773202041d4a67c7873b0e74e94c86e3343fb470bdcbed82","other":"04862550ef38f831085f378e2533addc2c904288394631208c49cb33615ada3b","up":true},{"one":"9629320d648fda3834eddac7263cc6c88651dc6074206cee00144918d2276289","other":"452b07d73433e7d6c205a504419ae100019aa1920723011272b596607db6684a","up":true},{"one":"c461e430c887894bbbff4e337b61ee449cf12cc07d0fc5fe41785d580d16ae98","other":"c3b2d2f0c72753ed89fc4c580c81f50c66cb02c1f90054650e191a0105c40d1d","up":true},{"one":"b8f9946b17cea5dbba4ba1c37cd4d00a35717c69fb0e391f24af9294f9030c2e","other":"b3744cf6f180c2eb9a1ded0e6ddd600d5f79268387b97333070fb5a183affd89","up":true},{"one":"703dc76ac724457c805abcc1ed2e3f321821409fb4cf0185e2f07ebc4c18144f","other":"274f8b752ef0c84a5c3098066b0b4d1c02b8a1b1730f59ed94064535eeda4756","up":true},{"one":"eb307a6f333b30ebd1e3b2b51bd8095311d48707d6ca2c81447d01ad453e2542","other":"e6cf337d0e695e861ea36864e2ace1f4029d5b3246f7bd15ce4dcc220bfe3e48","up":true},{"one":"cb8df183e7fea4f808ed569d3fa0a6c26670f6451b9a9f48e8659871c2b9ab02","other":"274f8b752ef0c84a5c3098066b0b4d1c02b8a1b1730f59ed94064535eeda4756","up":true},{"one":"a12b12081b6d49e82378d5239765bca8c5f43232b30163bc46924cc3e98e1177","other":"afb1d0b8d1b1f6a341384c1f0818f6b28b85fefe6a45a892552de4de5379f6a5","up":true},{"one":"fb7e6716614ac941b74e18a9bf3ded63bc00b453221b40976f783675a1c06c63","other":"6123b7777de3bc2591e3036a9adeba1f7d8ec933d05ee4fe0017910896925d1b","up":true},{"one":"7f800e5a7970230f5273e49971c7ee521de97e69f56dd554e30dd12d6fb5c749","other":"3103cd0b7654f593b7228d1715209f27e339ad014019a9738413a20cb6ac63e4","up":true},{"one":"d3c19ad4c1abc9af03bffc1abc9717f4e765d5fff7ae776203438bac94d01806","other":"6123b7777de3bc2591e3036a9adeba1f7d8ec933d05ee4fe0017910896925d1b","up":true},{"one":"f0e900ef37baad6a1685aaf1700e9290e7e9c0d5d30e3265204ec943445248b3","other":"f211376d46e6e0966ee984cf5837805240b2ba53c5ac75315c56dbdffb957a65","up":true},{"one":"ae6023d416c87bb433eb9d8d44f97531797d292774304d996923a3fe67887478","other":"aabc587ddc3b7d493ce8e849b15d364265c57d3a3a52613076a5b31804cb753f","up":true},{"one":"f35a47e1d56a6d8e5caad50d88e55c83ff3b964b279b58a50d5e544ff9187864","other":"f0e900ef37baad6a1685aaf1700e9290e7e9c0d5d30e3265204ec943445248b3","up":true},{"one":"856e27ca689a9b2af4cd3ed958f2162b9c71074c726868ac7a10ac2f6f7d021d","other":"c461e430c887894bbbff4e337b61ee449cf12cc07d0fc5fe41785d580d16ae98","up":true},{"one":"9629320d648fda3834eddac7263cc6c88651dc6074206cee00144918d2276289","other":"0acb17334253408a773202041d4a67c7873b0e74e94c86e3343fb470bdcbed82","up":true},{"one":"6123b7777de3bc2591e3036a9adeba1f7d8ec933d05ee4fe0017910896925d1b","other":"d904f6d8790cc235063f54661521c3a197e3e9cdd9dbbcd6765ec6cda5d8f7b4","up":true},{"one":"172bbbcaa57c37c24314a84fbd0b9de45f83a46016bd2395dc2adbab1bb90b5c","other":"177e232bdba970f4b001b228af9402e3fca0aaf00682a11bc9984f7db4b7feba","up":true},{"one":"04862550ef38f831085f378e2533addc2c904288394631208c49cb33615ada3b","other":"00ba6c61b2d6480f53f48c3def3ac85587d9b7a92658d21c235fd0fddc246850","up":true},{"one":"0257ed46bd49271306fed0127019fd54db472284d00099f10cadd7e83588a63a","other":"04862550ef38f831085f378e2533addc2c904288394631208c49cb33615ada3b","up":true},{"one":"38f05af40cd0dc3974e896e24aa75ebda1c96f0ce7d9e3ff0ea840615186307d","other":"3b4fa7d729129068a1281ef68494b61d055203de8c36a5fe27af3eb565832108","up":true},{"one":"274f8b752ef0c84a5c3098066b0b4d1c02b8a1b1730f59ed94064535eeda4756","other":"248a2e618091deeac458f4741616405e0bc5ffda1a9f9125307e32c781728a75","up":true},{"one":"856e27ca689a9b2af4cd3ed958f2162b9c71074c726868ac7a10ac2f6f7d021d","other":"892603fc64fe169ad15519060cfb1d27780adff60da60f86a620f2bf9a7ca1e1","up":true},{"one":"eb307a6f333b30ebd1e3b2b51bd8095311d48707d6ca2c81447d01ad453e2542","other":"e558105d2aeb59c896f5fb70475b046d9034ef4596e9cd5f54f16c316449241e","up":true},{"one":"550857bac20787ca7f64937aedba0ba3d2b585052d6e824fde8403838a2c2adc","other":"fb7e6716614ac941b74e18a9bf3ded63bc00b453221b40976f783675a1c06c63","up":true},{"one":"eb307a6f333b30ebd1e3b2b51bd8095311d48707d6ca2c81447d01ad453e2542","other":"ebf25ce427905106b70625c0084dcb117964a4d4b9951f5977457da5741b716c","up":true},{"one":"172bbbcaa57c37c24314a84fbd0b9de45f83a46016bd2395dc2adbab1bb90b5c","other":"aabc587ddc3b7d493ce8e849b15d364265c57d3a3a52613076a5b31804cb753f","up":true},{"one":"c461e430c887894bbbff4e337b61ee449cf12cc07d0fc5fe41785d580d16ae98","other":"6123b7777de3bc2591e3036a9adeba1f7d8ec933d05ee4fe0017910896925d1b","up":true},{"one":"eb307a6f333b30ebd1e3b2b51bd8095311d48707d6ca2c81447d01ad453e2542","other":"e9fd5cd7f8d28ca172a3d331da401e9853d3121923c81bf82787f7989009e43a","up":true},{"one":"ae6023d416c87bb433eb9d8d44f97531797d292774304d996923a3fe67887478","other":"afb1d0b8d1b1f6a341384c1f0818f6b28b85fefe6a45a892552de4de5379f6a5","up":true},{"one":"c3b2d2f0c72753ed89fc4c580c81f50c66cb02c1f90054650e191a0105c40d1d","other":"d904f6d8790cc235063f54661521c3a197e3e9cdd9dbbcd6765ec6cda5d8f7b4","up":true},{"one":"172bbbcaa57c37c24314a84fbd0b9de45f83a46016bd2395dc2adbab1bb90b5c","other":"afb1d0b8d1b1f6a341384c1f0818f6b28b85fefe6a45a892552de4de5379f6a5","up":true},{"one":"255db8d311a66a7443b15d040afa06626d6919c0d20a6fd0f5afa34e87281732","other":"d904f6d8790cc235063f54661521c3a197e3e9cdd9dbbcd6765ec6cda5d8f7b4","up":true},{"one":"452b07d73433e7d6c205a504419ae100019aa1920723011272b596607db6684a","other":"c461e430c887894bbbff4e337b61ee449cf12cc07d0fc5fe41785d580d16ae98","up":true},{"one":"0257ed46bd49271306fed0127019fd54db472284d00099f10cadd7e83588a63a","other":"0727d7e68c319d3a4cc5a161dd05b2a7e72350c139e65c2090c1232ebbed5f78","up":true},{"one":"3b4fa7d729129068a1281ef68494b61d055203de8c36a5fe27af3eb565832108","other":"248a2e618091deeac458f4741616405e0bc5ffda1a9f9125307e32c781728a75","up":true},{"one":"38f05af40cd0dc3974e896e24aa75ebda1c96f0ce7d9e3ff0ea840615186307d","other":"3abfe9f4f6a8d34b536d02551f45c03a35987b94f7d33b3a0dc30ad34b15f82a","up":true},{"one":"1455d4713b5134e9157517b84b04e15292cf18d3e08b95d69f19648fb9e3823e","other":"6123b7777de3bc2591e3036a9adeba1f7d8ec933d05ee4fe0017910896925d1b","up":true},{"one":"0257ed46bd49271306fed0127019fd54db472284d00099f10cadd7e83588a63a","other":"57d911f864be7a90d8807bc3fecd658c5697d70cf3ddcc1dde0dd9bd0fd7fb67","up":true},{"one":"b73b9aa5a6264c9a018a988a813b9127d9bf970736478cf0dc3edd1c2023f6f2","other":"fb7e6716614ac941b74e18a9bf3ded63bc00b453221b40976f783675a1c06c63","up":true},{"one":"550857bac20787ca7f64937aedba0ba3d2b585052d6e824fde8403838a2c2adc","other":"57d911f864be7a90d8807bc3fecd658c5697d70cf3ddcc1dde0dd9bd0fd7fb67","up":true},{"one":"88024b9f684346b775c1c1eb6e9709034135957ab418ec002725f10ef8919837","other":"7d69b5707a4b99edd901317f1553ff15586aac350f38e0c81318f35d68b835a8","up":true},{"one":"ebf25ce427905106b70625c0084dcb117964a4d4b9951f5977457da5741b716c","other":"e9fd5cd7f8d28ca172a3d331da401e9853d3121923c81bf82787f7989009e43a","up":true},{"one":"7d69b5707a4b99edd901317f1553ff15586aac350f38e0c81318f35d68b835a8","other":"452b07d73433e7d6c205a504419ae100019aa1920723011272b596607db6684a","up":true},{"one":"86735a46da76b3132f729b293b4d8502e939ecba776b8d85b3ae73efa2184b5f","other":"821af25e6366237cca25681ec633eba88db48a4ff88b5920cdc92e14616140e4","up":true},{"one":"f35a47e1d56a6d8e5caad50d88e55c83ff3b964b279b58a50d5e544ff9187864","other":"f211376d46e6e0966ee984cf5837805240b2ba53c5ac75315c56dbdffb957a65","up":true},{"one":"e5e166f85ea9e264fc25734523869d9b916f388004cb4af9968956ce14a7a522","other":"e6cf337d0e695e861ea36864e2ace1f4029d5b3246f7bd15ce4dcc220bfe3e48","up":true},{"one":"b8f345940bced8831b30079ff2a276ab65fbed0dd8575c93a3ccd8c7bd1bc8b1","other":"be2bcb8fb4b34ee6981e6634b8f3298fbbee756f6e76566204a56bb86c8ec0f0","up":true},{"one":"ae6023d416c87bb433eb9d8d44f97531797d292774304d996923a3fe67887478","other":"f6e5148d2421ae11e8a109852c9da77bbe498f9e6ed3aa361755a1ff3fd29b74","up":true},{"one":"ae6023d416c87bb433eb9d8d44f97531797d292774304d996923a3fe67887478","other":"e6cf337d0e695e861ea36864e2ace1f4029d5b3246f7bd15ce4dcc220bfe3e48","up":true},{"one":"856e27ca689a9b2af4cd3ed958f2162b9c71074c726868ac7a10ac2f6f7d021d","other":"87aa77dcef19b0c86a3e8ab64c8f12d9a733e77a7e12bcaec3a4cd8504c5a775","up":true},{"one":"581ad92d4347834850c16e781983c09be340917527a35dd9650c5a3da1fc822b","other":"d904f6d8790cc235063f54661521c3a197e3e9cdd9dbbcd6765ec6cda5d8f7b4","up":true},{"one":"52fc1e219bc518fbaf289da3236d98db1b63df1227ea32581229671473adc3bd","other":"cb8df183e7fea4f808ed569d3fa0a6c26670f6451b9a9f48e8659871c2b9ab02","up":true},{"one":"87aa77dcef19b0c86a3e8ab64c8f12d9a733e77a7e12bcaec3a4cd8504c5a775","other":"88024b9f684346b775c1c1eb6e9709034135957ab418ec002725f10ef8919837","up":true},{"one":"b8f9946b17cea5dbba4ba1c37cd4d00a35717c69fb0e391f24af9294f9030c2e","other":"be2bcb8fb4b34ee6981e6634b8f3298fbbee756f6e76566204a56bb86c8ec0f0","up":true},{"one":"255db8d311a66a7443b15d040afa06626d6919c0d20a6fd0f5afa34e87281732","other":"d3c19ad4c1abc9af03bffc1abc9717f4e765d5fff7ae776203438bac94d01806","up":true},{"one":"f211376d46e6e0966ee984cf5837805240b2ba53c5ac75315c56dbdffb957a65","other":"b73b9aa5a6264c9a018a988a813b9127d9bf970736478cf0dc3edd1c2023f6f2","up":true},{"one":"172bbbcaa57c37c24314a84fbd0b9de45f83a46016bd2395dc2adbab1bb90b5c","other":"6123b7777de3bc2591e3036a9adeba1f7d8ec933d05ee4fe0017910896925d1b","up":true},{"one":"f211376d46e6e0966ee984cf5837805240b2ba53c5ac75315c56dbdffb957a65","other":"6123b7777de3bc2591e3036a9adeba1f7d8ec933d05ee4fe0017910896925d1b","up":true},{"one":"f35a47e1d56a6d8e5caad50d88e55c83ff3b964b279b58a50d5e544ff9187864","other":"6123b7777de3bc2591e3036a9adeba1f7d8ec933d05ee4fe0017910896925d1b","up":true},{"one":"ae6023d416c87bb433eb9d8d44f97531797d292774304d996923a3fe67887478","other":"be2bcb8fb4b34ee6981e6634b8f3298fbbee756f6e76566204a56bb86c8ec0f0","up":true},{"one":"87acf64b22c579751718dc093c00c82b39feb7023fe53c6486b288960ad9e146","other":"86735a46da76b3132f729b293b4d8502e939ecba776b8d85b3ae73efa2184b5f","up":true},{"one":"eb307a6f333b30ebd1e3b2b51bd8095311d48707d6ca2c81447d01ad453e2542","other":"b73b9aa5a6264c9a018a988a813b9127d9bf970736478cf0dc3edd1c2023f6f2","up":true},{"one":"87aa77dcef19b0c86a3e8ab64c8f12d9a733e77a7e12bcaec3a4cd8504c5a775","other":"892603fc64fe169ad15519060cfb1d27780adff60da60f86a620f2bf9a7ca1e1","up":true},{"one":"e5e166f85ea9e264fc25734523869d9b916f388004cb4af9968956ce14a7a522","other":"e558105d2aeb59c896f5fb70475b046d9034ef4596e9cd5f54f16c316449241e","up":true},{"one":"3b4fa7d729129068a1281ef68494b61d055203de8c36a5fe27af3eb565832108","other":"3abfe9f4f6a8d34b536d02551f45c03a35987b94f7d33b3a0dc30ad34b15f82a","up":true},{"one":"38f05af40cd0dc3974e896e24aa75ebda1c96f0ce7d9e3ff0ea840615186307d","other":"9629320d648fda3834eddac7263cc6c88651dc6074206cee00144918d2276289","up":true},{"one":"3b4fa7d729129068a1281ef68494b61d055203de8c36a5fe27af3eb565832108","other":"6123b7777de3bc2591e3036a9adeba1f7d8ec933d05ee4fe0017910896925d1b","up":true},{"one":"e6cf337d0e695e861ea36864e2ace1f4029d5b3246f7bd15ce4dcc220bfe3e48","other":"a12b12081b6d49e82378d5239765bca8c5f43232b30163bc46924cc3e98e1177","up":true},{"one":"255db8d311a66a7443b15d040afa06626d6919c0d20a6fd0f5afa34e87281732","other":"7d69b5707a4b99edd901317f1553ff15586aac350f38e0c81318f35d68b835a8","up":true},{"one":"04862550ef38f831085f378e2533addc2c904288394631208c49cb33615ada3b","other":"0727d7e68c319d3a4cc5a161dd05b2a7e72350c139e65c2090c1232ebbed5f78","up":true},{"one":"550857bac20787ca7f64937aedba0ba3d2b585052d6e824fde8403838a2c2adc","other":"f6e5148d2421ae11e8a109852c9da77bbe498f9e6ed3aa361755a1ff3fd29b74","up":true},{"one":"afb1d0b8d1b1f6a341384c1f0818f6b28b85fefe6a45a892552de4de5379f6a5","other":"aabc587ddc3b7d493ce8e849b15d364265c57d3a3a52613076a5b31804cb753f","up":true},{"one":"255db8d311a66a7443b15d040afa06626d6919c0d20a6fd0f5afa34e87281732","other":"5e36542bbbc0d70231c9d00742cb30fccf3f206eecf10a0f34332a2986c86ffb","up":true},{"one":"38f05af40cd0dc3974e896e24aa75ebda1c96f0ce7d9e3ff0ea840615186307d","other":"821af25e6366237cca25681ec633eba88db48a4ff88b5920cdc92e14616140e4","up":true},{"one":"7d69b5707a4b99edd901317f1553ff15586aac350f38e0c81318f35d68b835a8","other":"581ad92d4347834850c16e781983c09be340917527a35dd9650c5a3da1fc822b","up":true},{"one":"892603fc64fe169ad15519060cfb1d27780adff60da60f86a620f2bf9a7ca1e1","other":"0acb17334253408a773202041d4a67c7873b0e74e94c86e3343fb470bdcbed82","up":true},{"one":"0257ed46bd49271306fed0127019fd54db472284d00099f10cadd7e83588a63a","other":"56029e913c58f9a10a51c25fbf322aee54e844476cb1723c312f0f8bb9c24e39","up":true},{"one":"eb307a6f333b30ebd1e3b2b51bd8095311d48707d6ca2c81447d01ad453e2542","other":"88024b9f684346b775c1c1eb6e9709034135957ab418ec002725f10ef8919837","up":true},{"one":"1455d4713b5134e9157517b84b04e15292cf18d3e08b95d69f19648fb9e3823e","other":"703dc76ac724457c805abcc1ed2e3f321821409fb4cf0185e2f07ebc4c18144f","up":true},{"one":"38f05af40cd0dc3974e896e24aa75ebda1c96f0ce7d9e3ff0ea840615186307d","other":"255db8d311a66a7443b15d040afa06626d6919c0d20a6fd0f5afa34e87281732","up":true},{"one":"154fec5fa728af956a1446bd5a35e63d716b79a804197b50fd9c72585d044b77","other":"452b07d73433e7d6c205a504419ae100019aa1920723011272b596607db6684a","up":true},{"one":"70d0710b3894fabf32b343b9b59339f786ece39895c7eda5f162cc575c9c8253","other":"3c409e5b76e977ee3115a0a19540dd6745e60b8878fdc1a5c1d996e7e47ca969","up":true},{"one":"87aa77dcef19b0c86a3e8ab64c8f12d9a733e77a7e12bcaec3a4cd8504c5a775","other":"821af25e6366237cca25681ec633eba88db48a4ff88b5920cdc92e14616140e4","up":true},{"one":"87aa77dcef19b0c86a3e8ab64c8f12d9a733e77a7e12bcaec3a4cd8504c5a775","other":"c461e430c887894bbbff4e337b61ee449cf12cc07d0fc5fe41785d580d16ae98","up":true},{"one":"f35a47e1d56a6d8e5caad50d88e55c83ff3b964b279b58a50d5e544ff9187864","other":"703dc76ac724457c805abcc1ed2e3f321821409fb4cf0185e2f07ebc4c18144f","up":true},{"one":"57d911f864be7a90d8807bc3fecd658c5697d70cf3ddcc1dde0dd9bd0fd7fb67","other":"0acb17334253408a773202041d4a67c7873b0e74e94c86e3343fb470bdcbed82","up":true},{"one":"87aa77dcef19b0c86a3e8ab64c8f12d9a733e77a7e12bcaec3a4cd8504c5a775","other":"86735a46da76b3132f729b293b4d8502e939ecba776b8d85b3ae73efa2184b5f","up":true},{"one":"04862550ef38f831085f378e2533addc2c904288394631208c49cb33615ada3b","other":"3103cd0b7654f593b7228d1715209f27e339ad014019a9738413a20cb6ac63e4","up":true},{"one":"87aa77dcef19b0c86a3e8ab64c8f12d9a733e77a7e12bcaec3a4cd8504c5a775","other":"87acf64b22c579751718dc093c00c82b39feb7023fe53c6486b288960ad9e146","up":true},{"one":"a12b12081b6d49e82378d5239765bca8c5f43232b30163bc46924cc3e98e1177","other":"9629320d648fda3834eddac7263cc6c88651dc6074206cee00144918d2276289","up":true},{"one":"f0e900ef37baad6a1685aaf1700e9290e7e9c0d5d30e3265204ec943445248b3","other":"6123b7777de3bc2591e3036a9adeba1f7d8ec933d05ee4fe0017910896925d1b","up":true},{"one":"b8f9946b17cea5dbba4ba1c37cd4d00a35717c69fb0e391f24af9294f9030c2e","other":"b8f345940bced8831b30079ff2a276ab65fbed0dd8575c93a3ccd8c7bd1bc8b1","up":true},{"one":"00ba6c61b2d6480f53f48c3def3ac85587d9b7a92658d21c235fd0fddc246850","other":"154fec5fa728af956a1446bd5a35e63d716b79a804197b50fd9c72585d044b77","up":true},{"one":"b3744cf6f180c2eb9a1ded0e6ddd600d5f79268387b97333070fb5a183affd89","other":"cb8df183e7fea4f808ed569d3fa0a6c26670f6451b9a9f48e8659871c2b9ab02","up":true},{"one":"3b4fa7d729129068a1281ef68494b61d055203de8c36a5fe27af3eb565832108","other":"255db8d311a66a7443b15d040afa06626d6919c0d20a6fd0f5afa34e87281732","up":true},{"one":"550857bac20787ca7f64937aedba0ba3d2b585052d6e824fde8403838a2c2adc","other":"274f8b752ef0c84a5c3098066b0b4d1c02b8a1b1730f59ed94064535eeda4756","up":true},{"one":"0727d7e68c319d3a4cc5a161dd05b2a7e72350c139e65c2090c1232ebbed5f78","other":"d904f6d8790cc235063f54661521c3a197e3e9cdd9dbbcd6765ec6cda5d8f7b4","up":true},{"one":"5f832158cf84e0e48a3518955878b16ae253467f54664eb4ec1213fefc3f3277","other":"5e36542bbbc0d70231c9d00742cb30fccf3f206eecf10a0f34332a2986c86ffb","up":true},{"one":"04862550ef38f831085f378e2533addc2c904288394631208c49cb33615ada3b","other":"274f8b752ef0c84a5c3098066b0b4d1c02b8a1b1730f59ed94064535eeda4756","up":true},{"one":"1455d4713b5134e9157517b84b04e15292cf18d3e08b95d69f19648fb9e3823e","other":"00ba6c61b2d6480f53f48c3def3ac85587d9b7a92658d21c235fd0fddc246850","up":true},{"one":"f0e900ef37baad6a1685aaf1700e9290e7e9c0d5d30e3265204ec943445248b3","other":"70d0710b3894fabf32b343b9b59339f786ece39895c7eda5f162cc575c9c8253","up":true},{"one":"0acb17334253408a773202041d4a67c7873b0e74e94c86e3343fb470bdcbed82","other":"821af25e6366237cca25681ec633eba88db48a4ff88b5920cdc92e14616140e4","up":true},{"one":"f211376d46e6e0966ee984cf5837805240b2ba53c5ac75315c56dbdffb957a65","other":"e558105d2aeb59c896f5fb70475b046d9034ef4596e9cd5f54f16c316449241e","up":true},{"one":"afb1d0b8d1b1f6a341384c1f0818f6b28b85fefe6a45a892552de4de5379f6a5","other":"e6cf337d0e695e861ea36864e2ace1f4029d5b3246f7bd15ce4dcc220bfe3e48","up":true},{"one":"821af25e6366237cca25681ec633eba88db48a4ff88b5920cdc92e14616140e4","other":"c461e430c887894bbbff4e337b61ee449cf12cc07d0fc5fe41785d580d16ae98","up":true},{"one":"c3b2d2f0c72753ed89fc4c580c81f50c66cb02c1f90054650e191a0105c40d1d","other":"fb7e6716614ac941b74e18a9bf3ded63bc00b453221b40976f783675a1c06c63","up":true},{"one":"ebf25ce427905106b70625c0084dcb117964a4d4b9951f5977457da5741b716c","other":"6123b7777de3bc2591e3036a9adeba1f7d8ec933d05ee4fe0017910896925d1b","up":true},{"one":"172bbbcaa57c37c24314a84fbd0b9de45f83a46016bd2395dc2adbab1bb90b5c","other":"0257ed46bd49271306fed0127019fd54db472284d00099f10cadd7e83588a63a","up":true},{"one":"88024b9f684346b775c1c1eb6e9709034135957ab418ec002725f10ef8919837","other":"7f800e5a7970230f5273e49971c7ee521de97e69f56dd554e30dd12d6fb5c749","up":true},{"one":"9629320d648fda3834eddac7263cc6c88651dc6074206cee00144918d2276289","other":"5e36542bbbc0d70231c9d00742cb30fccf3f206eecf10a0f34332a2986c86ffb","up":true},{"one":"70d0710b3894fabf32b343b9b59339f786ece39895c7eda5f162cc575c9c8253","other":"e558105d2aeb59c896f5fb70475b046d9034ef4596e9cd5f54f16c316449241e","up":true},{"one":"7d69b5707a4b99edd901317f1553ff15586aac350f38e0c81318f35d68b835a8","other":"5e36542bbbc0d70231c9d00742cb30fccf3f206eecf10a0f34332a2986c86ffb","up":true},{"one":"255db8d311a66a7443b15d040afa06626d6919c0d20a6fd0f5afa34e87281732","other":"821af25e6366237cca25681ec633eba88db48a4ff88b5920cdc92e14616140e4","up":true},{"one":"b73b9aa5a6264c9a018a988a813b9127d9bf970736478cf0dc3edd1c2023f6f2","other":"b8f345940bced8831b30079ff2a276ab65fbed0dd8575c93a3ccd8c7bd1bc8b1","up":true},{"one":"04862550ef38f831085f378e2533addc2c904288394631208c49cb33615ada3b","other":"3c409e5b76e977ee3115a0a19540dd6745e60b8878fdc1a5c1d996e7e47ca969","up":true},{"one":"afb1d0b8d1b1f6a341384c1f0818f6b28b85fefe6a45a892552de4de5379f6a5","other":"be2bcb8fb4b34ee6981e6634b8f3298fbbee756f6e76566204a56bb86c8ec0f0","up":true},{"one":"52fc1e219bc518fbaf289da3236d98db1b63df1227ea32581229671473adc3bd","other":"c461e430c887894bbbff4e337b61ee449cf12cc07d0fc5fe41785d580d16ae98","up":true},{"one":"b73b9aa5a6264c9a018a988a813b9127d9bf970736478cf0dc3edd1c2023f6f2","other":"3abfe9f4f6a8d34b536d02551f45c03a35987b94f7d33b3a0dc30ad34b15f82a","up":true},{"one":"0257ed46bd49271306fed0127019fd54db472284d00099f10cadd7e83588a63a","other":"1455d4713b5134e9157517b84b04e15292cf18d3e08b95d69f19648fb9e3823e","up":true},{"one":"56029e913c58f9a10a51c25fbf322aee54e844476cb1723c312f0f8bb9c24e39","other":"6123b7777de3bc2591e3036a9adeba1f7d8ec933d05ee4fe0017910896925d1b","up":true},{"one":"70d0710b3894fabf32b343b9b59339f786ece39895c7eda5f162cc575c9c8253","other":"e9fd5cd7f8d28ca172a3d331da401e9853d3121923c81bf82787f7989009e43a","up":true},{"one":"e558105d2aeb59c896f5fb70475b046d9034ef4596e9cd5f54f16c316449241e","other":"6123b7777de3bc2591e3036a9adeba1f7d8ec933d05ee4fe0017910896925d1b","up":true},{"one":"b8f9946b17cea5dbba4ba1c37cd4d00a35717c69fb0e391f24af9294f9030c2e","other":"274f8b752ef0c84a5c3098066b0b4d1c02b8a1b1730f59ed94064535eeda4756","up":true},{"one":"581ad92d4347834850c16e781983c09be340917527a35dd9650c5a3da1fc822b","other":"154fec5fa728af956a1446bd5a35e63d716b79a804197b50fd9c72585d044b77","up":true},{"one":"88024b9f684346b775c1c1eb6e9709034135957ab418ec002725f10ef8919837","other":"a12b12081b6d49e82378d5239765bca8c5f43232b30163bc46924cc3e98e1177","up":true},{"one":"0727d7e68c319d3a4cc5a161dd05b2a7e72350c139e65c2090c1232ebbed5f78","other":"d3c19ad4c1abc9af03bffc1abc9717f4e765d5fff7ae776203438bac94d01806","up":true},{"one":"0acb17334253408a773202041d4a67c7873b0e74e94c86e3343fb470bdcbed82","other":"c0c2d73abd2b6abc3ba0b098520c4cc3eda61b5fc9d1ab42ebd04ecc25ded224","up":true},{"one":"38f05af40cd0dc3974e896e24aa75ebda1c96f0ce7d9e3ff0ea840615186307d","other":"6123b7777de3bc2591e3036a9adeba1f7d8ec933d05ee4fe0017910896925d1b","up":true},{"one":"0727d7e68c319d3a4cc5a161dd05b2a7e72350c139e65c2090c1232ebbed5f78","other":"3c409e5b76e977ee3115a0a19540dd6745e60b8878fdc1a5c1d996e7e47ca969","up":true},{"one":"b8f345940bced8831b30079ff2a276ab65fbed0dd8575c93a3ccd8c7bd1bc8b1","other":"0acb17334253408a773202041d4a67c7873b0e74e94c86e3343fb470bdcbed82","up":true},{"one":"0acb17334253408a773202041d4a67c7873b0e74e94c86e3343fb470bdcbed82","other":"274f8b752ef0c84a5c3098066b0b4d1c02b8a1b1730f59ed94064535eeda4756","up":true},{"one":"57d911f864be7a90d8807bc3fecd658c5697d70cf3ddcc1dde0dd9bd0fd7fb67","other":"00ba6c61b2d6480f53f48c3def3ac85587d9b7a92658d21c235fd0fddc246850","up":true},{"one":"7f800e5a7970230f5273e49971c7ee521de97e69f56dd554e30dd12d6fb5c749","other":"56029e913c58f9a10a51c25fbf322aee54e844476cb1723c312f0f8bb9c24e39","up":true},{"one":"177e232bdba970f4b001b228af9402e3fca0aaf00682a11bc9984f7db4b7feba","other":"452b07d73433e7d6c205a504419ae100019aa1920723011272b596607db6684a","up":true},{"one":"52fc1e219bc518fbaf289da3236d98db1b63df1227ea32581229671473adc3bd","other":"6123b7777de3bc2591e3036a9adeba1f7d8ec933d05ee4fe0017910896925d1b","up":true},{"one":"177e232bdba970f4b001b228af9402e3fca0aaf00682a11bc9984f7db4b7feba","other":"581ad92d4347834850c16e781983c09be340917527a35dd9650c5a3da1fc822b","up":true},{"one":"e5e166f85ea9e264fc25734523869d9b916f388004cb4af9968956ce14a7a522","other":"6123b7777de3bc2591e3036a9adeba1f7d8ec933d05ee4fe0017910896925d1b","up":true},{"one":"f35a47e1d56a6d8e5caad50d88e55c83ff3b964b279b58a50d5e544ff9187864","other":"9629320d648fda3834eddac7263cc6c88651dc6074206cee00144918d2276289","up":true},{"one":"581ad92d4347834850c16e781983c09be340917527a35dd9650c5a3da1fc822b","other":"703dc76ac724457c805abcc1ed2e3f321821409fb4cf0185e2f07ebc4c18144f","up":true},{"one":"ebf25ce427905106b70625c0084dcb117964a4d4b9951f5977457da5741b716c","other":"88024b9f684346b775c1c1eb6e9709034135957ab418ec002725f10ef8919837","up":true},{"one":"b73b9aa5a6264c9a018a988a813b9127d9bf970736478cf0dc3edd1c2023f6f2","other":"aabc587ddc3b7d493ce8e849b15d364265c57d3a3a52613076a5b31804cb753f","up":true},{"one":"892603fc64fe169ad15519060cfb1d27780adff60da60f86a620f2bf9a7ca1e1","other":"00ba6c61b2d6480f53f48c3def3ac85587d9b7a92658d21c235fd0fddc246850","up":true},{"one":"f211376d46e6e0966ee984cf5837805240b2ba53c5ac75315c56dbdffb957a65","other":"e5e166f85ea9e264fc25734523869d9b916f388004cb4af9968956ce14a7a522","up":true},{"one":"aabc587ddc3b7d493ce8e849b15d364265c57d3a3a52613076a5b31804cb753f","other":"6123b7777de3bc2591e3036a9adeba1f7d8ec933d05ee4fe0017910896925d1b","up":true},{"one":"ebf25ce427905106b70625c0084dcb117964a4d4b9951f5977457da5741b716c","other":"7d69b5707a4b99edd901317f1553ff15586aac350f38e0c81318f35d68b835a8","up":true},{"one":"172bbbcaa57c37c24314a84fbd0b9de45f83a46016bd2395dc2adbab1bb90b5c","other":"0727d7e68c319d3a4cc5a161dd05b2a7e72350c139e65c2090c1232ebbed5f78","up":true},{"one":"703dc76ac724457c805abcc1ed2e3f321821409fb4cf0185e2f07ebc4c18144f","other":"0acb17334253408a773202041d4a67c7873b0e74e94c86e3343fb470bdcbed82","up":true},{"one":"c3b2d2f0c72753ed89fc4c580c81f50c66cb02c1f90054650e191a0105c40d1d","other":"f6e5148d2421ae11e8a109852c9da77bbe498f9e6ed3aa361755a1ff3fd29b74","up":true},{"one":"00ba6c61b2d6480f53f48c3def3ac85587d9b7a92658d21c235fd0fddc246850","other":"c0c2d73abd2b6abc3ba0b098520c4cc3eda61b5fc9d1ab42ebd04ecc25ded224","up":true},{"one":"3abfe9f4f6a8d34b536d02551f45c03a35987b94f7d33b3a0dc30ad34b15f82a","other":"452b07d73433e7d6c205a504419ae100019aa1920723011272b596607db6684a","up":true},{"one":"87acf64b22c579751718dc093c00c82b39feb7023fe53c6486b288960ad9e146","other":"274f8b752ef0c84a5c3098066b0b4d1c02b8a1b1730f59ed94064535eeda4756","up":true},{"one":"154fec5fa728af956a1446bd5a35e63d716b79a804197b50fd9c72585d044b77","other":"5e36542bbbc0d70231c9d00742cb30fccf3f206eecf10a0f34332a2986c86ffb","up":true},{"one":"821af25e6366237cca25681ec633eba88db48a4ff88b5920cdc92e14616140e4","other":"274f8b752ef0c84a5c3098066b0b4d1c02b8a1b1730f59ed94064535eeda4756","up":true},{"one":"5f832158cf84e0e48a3518955878b16ae253467f54664eb4ec1213fefc3f3277","other":"cb8df183e7fea4f808ed569d3fa0a6c26670f6451b9a9f48e8659871c2b9ab02","up":true},{"one":"86735a46da76b3132f729b293b4d8502e939ecba776b8d85b3ae73efa2184b5f","other":"a12b12081b6d49e82378d5239765bca8c5f43232b30163bc46924cc3e98e1177","up":true},{"one":"550857bac20787ca7f64937aedba0ba3d2b585052d6e824fde8403838a2c2adc","other":"5e36542bbbc0d70231c9d00742cb30fccf3f206eecf10a0f34332a2986c86ffb","up":true},{"one":"b3744cf6f180c2eb9a1ded0e6ddd600d5f79268387b97333070fb5a183affd89","other":"c461e430c887894bbbff4e337b61ee449cf12cc07d0fc5fe41785d580d16ae98","up":true},{"one":"7d69b5707a4b99edd901317f1553ff15586aac350f38e0c81318f35d68b835a8","other":"52fc1e219bc518fbaf289da3236d98db1b63df1227ea32581229671473adc3bd","up":true},{"one":"afb1d0b8d1b1f6a341384c1f0818f6b28b85fefe6a45a892552de4de5379f6a5","other":"b8f345940bced8831b30079ff2a276ab65fbed0dd8575c93a3ccd8c7bd1bc8b1","up":true},{"one":"e9fd5cd7f8d28ca172a3d331da401e9853d3121923c81bf82787f7989009e43a","other":"6123b7777de3bc2591e3036a9adeba1f7d8ec933d05ee4fe0017910896925d1b","up":true},{"one":"57d911f864be7a90d8807bc3fecd658c5697d70cf3ddcc1dde0dd9bd0fd7fb67","other":"5e36542bbbc0d70231c9d00742cb30fccf3f206eecf10a0f34332a2986c86ffb","up":true},{"one":"a12b12081b6d49e82378d5239765bca8c5f43232b30163bc46924cc3e98e1177","other":"821af25e6366237cca25681ec633eba88db48a4ff88b5920cdc92e14616140e4","up":true},{"one":"86735a46da76b3132f729b293b4d8502e939ecba776b8d85b3ae73efa2184b5f","other":"cb8df183e7fea4f808ed569d3fa0a6c26670f6451b9a9f48e8659871c2b9ab02","up":true},{"one":"5f832158cf84e0e48a3518955878b16ae253467f54664eb4ec1213fefc3f3277","other":"c461e430c887894bbbff4e337b61ee449cf12cc07d0fc5fe41785d580d16ae98","up":true},{"one":"703dc76ac724457c805abcc1ed2e3f321821409fb4cf0185e2f07ebc4c18144f","other":"e5e166f85ea9e264fc25734523869d9b916f388004cb4af9968956ce14a7a522","up":true},{"one":"3c409e5b76e977ee3115a0a19540dd6745e60b8878fdc1a5c1d996e7e47ca969","other":"6123b7777de3bc2591e3036a9adeba1f7d8ec933d05ee4fe0017910896925d1b","up":true},{"one":"892603fc64fe169ad15519060cfb1d27780adff60da60f86a620f2bf9a7ca1e1","other":"fb7e6716614ac941b74e18a9bf3ded63bc00b453221b40976f783675a1c06c63","up":true},{"one":"5e36542bbbc0d70231c9d00742cb30fccf3f206eecf10a0f34332a2986c86ffb","other":"274f8b752ef0c84a5c3098066b0b4d1c02b8a1b1730f59ed94064535eeda4756","up":true},{"one":"70d0710b3894fabf32b343b9b59339f786ece39895c7eda5f162cc575c9c8253","other":"0acb17334253408a773202041d4a67c7873b0e74e94c86e3343fb470bdcbed82","up":true},{"one":"1455d4713b5134e9157517b84b04e15292cf18d3e08b95d69f19648fb9e3823e","other":"5f832158cf84e0e48a3518955878b16ae253467f54664eb4ec1213fefc3f3277","up":true},{"one":"57d911f864be7a90d8807bc3fecd658c5697d70cf3ddcc1dde0dd9bd0fd7fb67","other":"581ad92d4347834850c16e781983c09be340917527a35dd9650c5a3da1fc822b","up":true},{"one":"0acb17334253408a773202041d4a67c7873b0e74e94c86e3343fb470bdcbed82","other":"6123b7777de3bc2591e3036a9adeba1f7d8ec933d05ee4fe0017910896925d1b","up":true},{"one":"be2bcb8fb4b34ee6981e6634b8f3298fbbee756f6e76566204a56bb86c8ec0f0","other":"c0c2d73abd2b6abc3ba0b098520c4cc3eda61b5fc9d1ab42ebd04ecc25ded224","up":true},{"one":"b8f345940bced8831b30079ff2a276ab65fbed0dd8575c93a3ccd8c7bd1bc8b1","other":"00ba6c61b2d6480f53f48c3def3ac85587d9b7a92658d21c235fd0fddc246850","up":true},{"one":"f0e900ef37baad6a1685aaf1700e9290e7e9c0d5d30e3265204ec943445248b3","other":"9629320d648fda3834eddac7263cc6c88651dc6074206cee00144918d2276289","up":true},{"one":"f35a47e1d56a6d8e5caad50d88e55c83ff3b964b279b58a50d5e544ff9187864","other":"821af25e6366237cca25681ec633eba88db48a4ff88b5920cdc92e14616140e4","up":true},{"one":"e558105d2aeb59c896f5fb70475b046d9034ef4596e9cd5f54f16c316449241e","other":"d3c19ad4c1abc9af03bffc1abc9717f4e765d5fff7ae776203438bac94d01806","up":true},{"one":"154fec5fa728af956a1446bd5a35e63d716b79a804197b50fd9c72585d044b77","other":"274f8b752ef0c84a5c3098066b0b4d1c02b8a1b1730f59ed94064535eeda4756","up":true},{"one":"ebf25ce427905106b70625c0084dcb117964a4d4b9951f5977457da5741b716c","other":"cb8df183e7fea4f808ed569d3fa0a6c26670f6451b9a9f48e8659871c2b9ab02","up":true},{"one":"04862550ef38f831085f378e2533addc2c904288394631208c49cb33615ada3b","other":"172bbbcaa57c37c24314a84fbd0b9de45f83a46016bd2395dc2adbab1bb90b5c","up":true},{"one":"e6cf337d0e695e861ea36864e2ace1f4029d5b3246f7bd15ce4dcc220bfe3e48","other":"d3c19ad4c1abc9af03bffc1abc9717f4e765d5fff7ae776203438bac94d01806","up":true},{"one":"f0e900ef37baad6a1685aaf1700e9290e7e9c0d5d30e3265204ec943445248b3","other":"821af25e6366237cca25681ec633eba88db48a4ff88b5920cdc92e14616140e4","up":true},{"one":"892603fc64fe169ad15519060cfb1d27780adff60da60f86a620f2bf9a7ca1e1","other":"f6e5148d2421ae11e8a109852c9da77bbe498f9e6ed3aa361755a1ff3fd29b74","up":true},{"one":"3abfe9f4f6a8d34b536d02551f45c03a35987b94f7d33b3a0dc30ad34b15f82a","other":"255db8d311a66a7443b15d040afa06626d6919c0d20a6fd0f5afa34e87281732","up":true},{"one":"e558105d2aeb59c896f5fb70475b046d9034ef4596e9cd5f54f16c316449241e","other":"d904f6d8790cc235063f54661521c3a197e3e9cdd9dbbcd6765ec6cda5d8f7b4","up":true},{"one":"e6cf337d0e695e861ea36864e2ace1f4029d5b3246f7bd15ce4dcc220bfe3e48","other":"d904f6d8790cc235063f54661521c3a197e3e9cdd9dbbcd6765ec6cda5d8f7b4","up":true},{"one":"86735a46da76b3132f729b293b4d8502e939ecba776b8d85b3ae73efa2184b5f","other":"88024b9f684346b775c1c1eb6e9709034135957ab418ec002725f10ef8919837","up":true},{"one":"f0e900ef37baad6a1685aaf1700e9290e7e9c0d5d30e3265204ec943445248b3","other":"e6cf337d0e695e861ea36864e2ace1f4029d5b3246f7bd15ce4dcc220bfe3e48","up":true},{"one":"550857bac20787ca7f64937aedba0ba3d2b585052d6e824fde8403838a2c2adc","other":"5f832158cf84e0e48a3518955878b16ae253467f54664eb4ec1213fefc3f3277","up":true},{"one":"87acf64b22c579751718dc093c00c82b39feb7023fe53c6486b288960ad9e146","other":"cb8df183e7fea4f808ed569d3fa0a6c26670f6451b9a9f48e8659871c2b9ab02","up":true},{"one":"e9fd5cd7f8d28ca172a3d331da401e9853d3121923c81bf82787f7989009e43a","other":"fb7e6716614ac941b74e18a9bf3ded63bc00b453221b40976f783675a1c06c63","up":true},{"one":"f35a47e1d56a6d8e5caad50d88e55c83ff3b964b279b58a50d5e544ff9187864","other":"ebf25ce427905106b70625c0084dcb117964a4d4b9951f5977457da5741b716c","up":true},{"one":"87acf64b22c579751718dc093c00c82b39feb7023fe53c6486b288960ad9e146","other":"b73b9aa5a6264c9a018a988a813b9127d9bf970736478cf0dc3edd1c2023f6f2","up":true}]} \ No newline at end of file diff --git a/vendor/github.com/ethereum/go-ethereum/swarm/pss/testdata/snapshot_8.json b/vendor/github.com/ethereum/go-ethereum/swarm/pss/testdata/snapshot_8.json deleted file mode 100644 index 53fe4f96..00000000 --- a/vendor/github.com/ethereum/go-ethereum/swarm/pss/testdata/snapshot_8.json +++ /dev/null @@ -1 +0,0 @@ -{"nodes":[{"node":{"info":{"id":"b0c282b4841970517227552bdf630385551a8fd71884ce64ca865ba9519295d2","name":"node_b0c282b4841970517227552bdf630385551a8fd71884ce64ca865ba9519295d2","enode":"enode://1fdd80e21167da20c5b50282fff16b9d9ba26b1ba66f4b485f2a280c97d135d2650a0aec63b0c4f05ebc1fd1e26dd701c78c3d26660ae55b1ec443d0858d5fae@127.0.0.1:0","enr":"0xf88fb84089ca9b4322a861dc171283da9cf5f01c2f522abc20fea004cdc9e021133e69a63c392de428728d12dae699dc4db983978a7d49e9f842a2a97e608411c26b0f380183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1021fdd80e21167da20c5b50282fff16b9d9ba26b1ba66f4b485f2a280c97d135d2","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"sMKCtIQZcFFyJ1Ur32MDhVUaj9cYhM5kyoZbqVGSldI=","hive":"\n=========================================================================\nThu Feb 28 17:15:23 UTC 2019 KΛÐΞMLIΛ hive: queen's address: b0c282\npopulation: 7 (7), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 1 4f28 | 1 4f28 (0)\n001 2 e5c3 d20e | 2 e5c3 (0) d20e (0)\n============ DEPTH: 2 ==========================================\n002 3 9d65 8d78 857f | 3 9d65 (0) 8d78 (0) 857f (0)\n003 1 af5a | 1 af5a (0)\n004 0 | 0\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"b0c282b4841970517227552bdf630385551a8fd71884ce64ca865ba9519295d2","private_key":"4abb6d72d23ab230f5903ce4eade3e17621c344793b5b4478adc885ea16ccd5e","name":"node_b0c282b4841970517227552bdf630385551a8fd71884ce64ca865ba9519295d2","services":["bzz","pss"],"enable_msg_events":true,"port":38939},"up":true}},{"node":{"info":{"id":"857fddf8081787b4dd830459778e1ee2816b22bb6afbad629b04547ce830d4c4","name":"node_857fddf8081787b4dd830459778e1ee2816b22bb6afbad629b04547ce830d4c4","enode":"enode://1253be1d17f585c64b93f4521a8c9a6fc2219941cbd4c0a0f4f9c505ff25faf880745e2fbb7d85bdd43510ef61222a11730770d75060eeb8d2449198ca9d99d9@127.0.0.1:0","enr":"0xf88fb8401ff2d62982fa003d6d8138eddc966e3bb01f0418be800a888246409230f7331b2ae72c81e74b250219b1b53c54eb658716fae5653e2154f8e489d8fd9c556ac90183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a1031253be1d17f585c64b93f4521a8c9a6fc2219941cbd4c0a0f4f9c505ff25faf8","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"hX/d+AgXh7TdgwRZd44e4oFrIrtq+61imwRUfOgw1MQ=","hive":"\n=========================================================================\nThu Feb 28 17:15:23 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 857fdd\npopulation: 7 (7), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 1 4f28 | 1 4f28 (0)\n001 2 d20e e5c3 | 2 e5c3 (0) d20e (0)\n002 2 af5a b0c2 | 2 af5a (0) b0c2 (0)\n============ DEPTH: 3 ==========================================\n003 1 9d65 | 1 9d65 (0)\n004 1 8d78 | 1 8d78 (0)\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"857fddf8081787b4dd830459778e1ee2816b22bb6afbad629b04547ce830d4c4","private_key":"9ec93c440894afdab5919df0886cf410fed4c31a7a2a859ca39f7f702c0c68a7","name":"node_857fddf8081787b4dd830459778e1ee2816b22bb6afbad629b04547ce830d4c4","services":["bzz","pss"],"enable_msg_events":true,"port":37411},"up":true}},{"node":{"info":{"id":"9d6568536b24dfc4beaffaa2440a569019ed885569536ef3af366d4fd7e4155c","name":"node_9d6568536b24dfc4beaffaa2440a569019ed885569536ef3af366d4fd7e4155c","enode":"enode://f0854e632647b0c6194987efc857de2018a55c3e41fa83d66c1bc7a6b41b6410667343be112125a56d00813a2217a9c7f9de6294f90d1062868195b0209febee@127.0.0.1:0","enr":"0xf88fb84092a5952a80b7c2970b3026cba7242670edc3bfeb88145f517586537cf3c723cf0f843d8e4fd79b03865506c72c4e359828e844d734a156e9433ea8005a84e86e0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102f0854e632647b0c6194987efc857de2018a55c3e41fa83d66c1bc7a6b41b6410","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"nWVoU2sk38S+r/qiRApWkBntiFVpU27zrzZtT9fkFVw=","hive":"\n=========================================================================\nThu Feb 28 17:15:23 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 9d6568\npopulation: 7 (7), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 1 4f28 | 1 4f28 (0)\n001 2 d20e e5c3 | 2 d20e (0) e5c3 (0)\n002 2 af5a b0c2 | 2 b0c2 (0) af5a (0)\n============ DEPTH: 3 ==========================================\n003 2 8d78 857f | 2 8d78 (0) 857f (0)\n004 0 | 0\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"9d6568536b24dfc4beaffaa2440a569019ed885569536ef3af366d4fd7e4155c","private_key":"78c3cbec4b5203c57cb07bec48b1f6b483333254270f8c78369f663a67332275","name":"node_9d6568536b24dfc4beaffaa2440a569019ed885569536ef3af366d4fd7e4155c","services":["bzz","pss"],"enable_msg_events":true,"port":35167},"up":true}},{"node":{"info":{"id":"e5c3fa336c6deb81128bd63cfbf16cb64d4a83c6e6a7a65d1af51ee01e4b8ae1","name":"node_e5c3fa336c6deb81128bd63cfbf16cb64d4a83c6e6a7a65d1af51ee01e4b8ae1","enode":"enode://b942a7abe4d7bb812c4dd793e10b90bd0a052d02c8fd30a51d4fc7f2c0ba00a69f28d80b694d467a8e0dd3a91d8c002d7cc4b559c0814a3465c88c848ee67c78@127.0.0.1:0","enr":"0xf88fb840e652351f98a74786fc3ef30d88e198485e1d1d2dbcee24527737d3e7ed9f7e1c327b5e0e5222fad7b1b8849a7cf930a11d784b8b5df0a4e83f96bed207be80fe0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102b942a7abe4d7bb812c4dd793e10b90bd0a052d02c8fd30a51d4fc7f2c0ba00a6","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"5cP6M2xt64ESi9Y8+/Fstk1Kg8bmp6ZdGvUe4B5LiuE=","hive":"\n=========================================================================\nThu Feb 28 17:15:23 UTC 2019 KΛÐΞMLIΛ hive: queen's address: e5c3fa\npopulation: 7 (7), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 1 4f28 | 1 4f28 (0)\n============ DEPTH: 1 ==========================================\n001 5 af5a b0c2 8d78 857f | 5 b0c2 (0) af5a (0) 8d78 (0) 857f (0)\n002 1 d20e | 1 d20e (0)\n003 0 | 0\n004 0 | 0\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"e5c3fa336c6deb81128bd63cfbf16cb64d4a83c6e6a7a65d1af51ee01e4b8ae1","private_key":"e47c725966b157b8d5f82a845e7972a8f46f4afdd7e6936924b091f6903f206a","name":"node_e5c3fa336c6deb81128bd63cfbf16cb64d4a83c6e6a7a65d1af51ee01e4b8ae1","services":["bzz","pss"],"enable_msg_events":true,"port":40723},"up":true}},{"node":{"info":{"id":"4f281da0bff1fafe3c554d0d4ea1ae9a2d3a14ffbb842dc251a45b1f001631c5","name":"node_4f281da0bff1fafe3c554d0d4ea1ae9a2d3a14ffbb842dc251a45b1f001631c5","enode":"enode://07926b76c1525c50780e9665d8eece3669309dbe11901ecce0fdd4b58cb674d6492eb005708df46901b05fb100b3e0e7d5fa68063b264ece3b89dab0387f75eb@127.0.0.1:0","enr":"0xf88fb8409b7e55bf546e10ed700d31d91c0da7485440884d8765e8690b5a6d36622a9b1d3e701b927e7ec276477e7c249a7c6ed5a3d723e5c2b5343eda892e3b510e7f760183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10307926b76c1525c50780e9665d8eece3669309dbe11901ecce0fdd4b58cb674d6","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"TygdoL/x+v48VU0NTqGumi06FP+7hC3CUaRbHwAWMcU=","hive":"\n=========================================================================\nThu Feb 28 17:15:23 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 4f281d\npopulation: 7 (7), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n============ DEPTH: 0 ==========================================\n000 7 9d65 8d78 857f b0c2 | 7 b0c2 (0) af5a (0) 8d78 (0) 857f (0)\n001 0 | 0\n002 0 | 0\n003 0 | 0\n004 0 | 0\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"4f281da0bff1fafe3c554d0d4ea1ae9a2d3a14ffbb842dc251a45b1f001631c5","private_key":"314da8f87c03fe3bea0fc585c33443cd627cf93a51f609e88d0251a248cc8a2b","name":"node_4f281da0bff1fafe3c554d0d4ea1ae9a2d3a14ffbb842dc251a45b1f001631c5","services":["bzz","pss"],"enable_msg_events":true,"port":40771},"up":true}},{"node":{"info":{"id":"af5a438a47196aa29629479664d454e78104cc3c8f00435fa14da30755eb19b8","name":"node_af5a438a47196aa29629479664d454e78104cc3c8f00435fa14da30755eb19b8","enode":"enode://86e63eb120fa323784aab76c4586fc5f96764473b5e5181e5101d05f99b6a2ae42b40d2ada4ff77338a6189c68745b96d1a7535fa1a81211aaf719b7918344f0@127.0.0.1:0","enr":"0xf88fb840ef88957469c48aed8ea2da3a5d910b199f8506a13703fbfc55f28d26199820175dd29361863b9cd50ce0d032412687302fb1b12ad7ca026dab30c5c600e541ba0183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10286e63eb120fa323784aab76c4586fc5f96764473b5e5181e5101d05f99b6a2ae","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"r1pDikcZaqKWKUeWZNRU54EEzDyPAENfoU2jB1XrGbg=","hive":"\n=========================================================================\nThu Feb 28 17:15:23 UTC 2019 KΛÐΞMLIΛ hive: queen's address: af5a43\npopulation: 7 (7), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 1 4f28 | 1 4f28 (0)\n001 2 e5c3 d20e | 2 d20e (0) e5c3 (0)\n============ DEPTH: 2 ==========================================\n002 3 9d65 857f 8d78 | 3 9d65 (0) 857f (0) 8d78 (0)\n003 1 b0c2 | 1 b0c2 (0)\n004 0 | 0\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"af5a438a47196aa29629479664d454e78104cc3c8f00435fa14da30755eb19b8","private_key":"ca50145cbbcbb65bb54caae3f33b2253f05203a2825ad5e77aebe7513ac1f2f6","name":"node_af5a438a47196aa29629479664d454e78104cc3c8f00435fa14da30755eb19b8","services":["bzz","pss"],"enable_msg_events":true,"port":33411},"up":true}},{"node":{"info":{"id":"8d78b3f7fb8644d790ad4434e7c273558475afa3bd290748057c8aba8ccb18c2","name":"node_8d78b3f7fb8644d790ad4434e7c273558475afa3bd290748057c8aba8ccb18c2","enode":"enode://c0fbc89e69cc5371b97f530380e78cac1cd7e3ad87a6bc1597e714ba892d53da030438cfdc1d7f3f1a50f1328733feb1afaabe1bdfdb731d7c134f42637bc570@127.0.0.1:0","enr":"0xf88fb8402e0b00cc0ddeb598d3dd71f1538b77e52afb8b6ee456a56a15d73b850f88480d686962bb60c059abf4080bb090dd6960e00ccc3992a79682f4d0b32d7f1182f40183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a102c0fbc89e69cc5371b97f530380e78cac1cd7e3ad87a6bc1597e714ba892d53da","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"jXiz9/uGRNeQrUQ058JzVYR1r6O9KQdIBXyKuozLGMI=","hive":"\n=========================================================================\nThu Feb 28 17:15:23 UTC 2019 KΛÐΞMLIΛ hive: queen's address: 8d78b3\npopulation: 7 (7), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 1 4f28 | 1 4f28 (0)\n001 2 e5c3 d20e | 2 e5c3 (0) d20e (0)\n002 2 b0c2 af5a | 2 b0c2 (0) af5a (0)\n============ DEPTH: 3 ==========================================\n003 1 9d65 | 1 9d65 (0)\n004 1 857f | 1 857f (0)\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"8d78b3f7fb8644d790ad4434e7c273558475afa3bd290748057c8aba8ccb18c2","private_key":"3610f2b1d9031bcf4dd8e44f17d7262c53c302d49aae7068bf58bf63593b168c","name":"node_8d78b3f7fb8644d790ad4434e7c273558475afa3bd290748057c8aba8ccb18c2","services":["bzz","pss"],"enable_msg_events":true,"port":46461},"up":true}},{"node":{"info":{"id":"d20e9d79610898859b8f6e7543de96119b738f558d8737a3e776f421f82e86d0","name":"node_d20e9d79610898859b8f6e7543de96119b738f558d8737a3e776f421f82e86d0","enode":"enode://59a306fa22d2124205f53d5eb905896f7fe818569fc14221c50a3b0ce032b67c275381f7b3ccbc88fb679a42d19dc9b24f699f2f44cc34a9e92c4087f3df3224@127.0.0.1:0","enr":"0xf88fb84010c45aa3fc72b92b0a6c1999ec487c845993f1fe4210e415c1995ec007cf990b62cbe15723436c2b6324564678c3dcf711ec0dd6fea5cd02f59758e5ec8caf660183636170cdc583627a7a08c6846869766508826964827634826970847f00000189736563703235366b31a10259a306fa22d2124205f53d5eb905896f7fe818569fc14221c50a3b0ce032b67c","ip":"127.0.0.1","ports":{"discovery":0,"listener":0},"listenAddr":"","protocols":{"bzz":"0g6deWEImIWbj251Q96WEZtzj1WNhzej53b0IfguhtA=","hive":"\n=========================================================================\nThu Feb 28 17:15:23 UTC 2019 KΛÐΞMLIΛ hive: queen's address: d20e9d\npopulation: 7 (7), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4\n000 1 4f28 | 1 4f28 (0)\n============ DEPTH: 1 ==========================================\n001 5 af5a b0c2 9d65 857f | 5 af5a (0) b0c2 (0) 9d65 (0) 857f (0)\n002 1 e5c3 | 1 e5c3 (0)\n003 0 | 0\n004 0 | 0\n005 0 | 0\n006 0 | 0\n007 0 | 0\n008 0 | 0\n009 0 | 0\n010 0 | 0\n011 0 | 0\n012 0 | 0\n013 0 | 0\n014 0 | 0\n015 0 | 0\n========================================================================="}},"config":{"id":"d20e9d79610898859b8f6e7543de96119b738f558d8737a3e776f421f82e86d0","private_key":"4f08d74f4aae2cc502689afad5bb760072c6f1931f7872c3d4ca210972736b74","name":"node_d20e9d79610898859b8f6e7543de96119b738f558d8737a3e776f421f82e86d0","services":["bzz","pss"],"enable_msg_events":true,"port":36035},"up":true}}],"conns":[{"one":"b0c282b4841970517227552bdf630385551a8fd71884ce64ca865ba9519295d2","other":"857fddf8081787b4dd830459778e1ee2816b22bb6afbad629b04547ce830d4c4","up":true},{"one":"857fddf8081787b4dd830459778e1ee2816b22bb6afbad629b04547ce830d4c4","other":"9d6568536b24dfc4beaffaa2440a569019ed885569536ef3af366d4fd7e4155c","up":true},{"one":"9d6568536b24dfc4beaffaa2440a569019ed885569536ef3af366d4fd7e4155c","other":"e5c3fa336c6deb81128bd63cfbf16cb64d4a83c6e6a7a65d1af51ee01e4b8ae1","up":true},{"one":"e5c3fa336c6deb81128bd63cfbf16cb64d4a83c6e6a7a65d1af51ee01e4b8ae1","other":"4f281da0bff1fafe3c554d0d4ea1ae9a2d3a14ffbb842dc251a45b1f001631c5","up":true},{"one":"4f281da0bff1fafe3c554d0d4ea1ae9a2d3a14ffbb842dc251a45b1f001631c5","other":"af5a438a47196aa29629479664d454e78104cc3c8f00435fa14da30755eb19b8","up":true},{"one":"af5a438a47196aa29629479664d454e78104cc3c8f00435fa14da30755eb19b8","other":"8d78b3f7fb8644d790ad4434e7c273558475afa3bd290748057c8aba8ccb18c2","up":true},{"one":"8d78b3f7fb8644d790ad4434e7c273558475afa3bd290748057c8aba8ccb18c2","other":"d20e9d79610898859b8f6e7543de96119b738f558d8737a3e776f421f82e86d0","up":true},{"one":"d20e9d79610898859b8f6e7543de96119b738f558d8737a3e776f421f82e86d0","other":"b0c282b4841970517227552bdf630385551a8fd71884ce64ca865ba9519295d2","up":true},{"one":"9d6568536b24dfc4beaffaa2440a569019ed885569536ef3af366d4fd7e4155c","other":"b0c282b4841970517227552bdf630385551a8fd71884ce64ca865ba9519295d2","up":true},{"one":"e5c3fa336c6deb81128bd63cfbf16cb64d4a83c6e6a7a65d1af51ee01e4b8ae1","other":"d20e9d79610898859b8f6e7543de96119b738f558d8737a3e776f421f82e86d0","up":true},{"one":"857fddf8081787b4dd830459778e1ee2816b22bb6afbad629b04547ce830d4c4","other":"e5c3fa336c6deb81128bd63cfbf16cb64d4a83c6e6a7a65d1af51ee01e4b8ae1","up":true},{"one":"b0c282b4841970517227552bdf630385551a8fd71884ce64ca865ba9519295d2","other":"4f281da0bff1fafe3c554d0d4ea1ae9a2d3a14ffbb842dc251a45b1f001631c5","up":true},{"one":"b0c282b4841970517227552bdf630385551a8fd71884ce64ca865ba9519295d2","other":"af5a438a47196aa29629479664d454e78104cc3c8f00435fa14da30755eb19b8","up":true},{"one":"af5a438a47196aa29629479664d454e78104cc3c8f00435fa14da30755eb19b8","other":"d20e9d79610898859b8f6e7543de96119b738f558d8737a3e776f421f82e86d0","up":true},{"one":"8d78b3f7fb8644d790ad4434e7c273558475afa3bd290748057c8aba8ccb18c2","other":"9d6568536b24dfc4beaffaa2440a569019ed885569536ef3af366d4fd7e4155c","up":true},{"one":"b0c282b4841970517227552bdf630385551a8fd71884ce64ca865ba9519295d2","other":"e5c3fa336c6deb81128bd63cfbf16cb64d4a83c6e6a7a65d1af51ee01e4b8ae1","up":true},{"one":"857fddf8081787b4dd830459778e1ee2816b22bb6afbad629b04547ce830d4c4","other":"4f281da0bff1fafe3c554d0d4ea1ae9a2d3a14ffbb842dc251a45b1f001631c5","up":true},{"one":"d20e9d79610898859b8f6e7543de96119b738f558d8737a3e776f421f82e86d0","other":"4f281da0bff1fafe3c554d0d4ea1ae9a2d3a14ffbb842dc251a45b1f001631c5","up":true},{"one":"9d6568536b24dfc4beaffaa2440a569019ed885569536ef3af366d4fd7e4155c","other":"4f281da0bff1fafe3c554d0d4ea1ae9a2d3a14ffbb842dc251a45b1f001631c5","up":true},{"one":"8d78b3f7fb8644d790ad4434e7c273558475afa3bd290748057c8aba8ccb18c2","other":"4f281da0bff1fafe3c554d0d4ea1ae9a2d3a14ffbb842dc251a45b1f001631c5","up":true},{"one":"af5a438a47196aa29629479664d454e78104cc3c8f00435fa14da30755eb19b8","other":"e5c3fa336c6deb81128bd63cfbf16cb64d4a83c6e6a7a65d1af51ee01e4b8ae1","up":true},{"one":"8d78b3f7fb8644d790ad4434e7c273558475afa3bd290748057c8aba8ccb18c2","other":"b0c282b4841970517227552bdf630385551a8fd71884ce64ca865ba9519295d2","up":true},{"one":"e5c3fa336c6deb81128bd63cfbf16cb64d4a83c6e6a7a65d1af51ee01e4b8ae1","other":"8d78b3f7fb8644d790ad4434e7c273558475afa3bd290748057c8aba8ccb18c2","up":true},{"one":"8d78b3f7fb8644d790ad4434e7c273558475afa3bd290748057c8aba8ccb18c2","other":"857fddf8081787b4dd830459778e1ee2816b22bb6afbad629b04547ce830d4c4","up":true},{"one":"d20e9d79610898859b8f6e7543de96119b738f558d8737a3e776f421f82e86d0","other":"9d6568536b24dfc4beaffaa2440a569019ed885569536ef3af366d4fd7e4155c","up":true},{"one":"af5a438a47196aa29629479664d454e78104cc3c8f00435fa14da30755eb19b8","other":"9d6568536b24dfc4beaffaa2440a569019ed885569536ef3af366d4fd7e4155c","up":true},{"one":"d20e9d79610898859b8f6e7543de96119b738f558d8737a3e776f421f82e86d0","other":"857fddf8081787b4dd830459778e1ee2816b22bb6afbad629b04547ce830d4c4","up":true},{"one":"af5a438a47196aa29629479664d454e78104cc3c8f00435fa14da30755eb19b8","other":"857fddf8081787b4dd830459778e1ee2816b22bb6afbad629b04547ce830d4c4","up":true}]} \ No newline at end of file diff --git a/vendor/github.com/ethereum/go-ethereum/swarm/pss/types.go b/vendor/github.com/ethereum/go-ethereum/swarm/pss/types.go deleted file mode 100644 index 2ce1f5cf..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/p2p" - "github.com/ethereum/go-ethereum/rlp" - "github.com/ethereum/go-ethereum/swarm/storage" - whisper "github.com/ethereum/go-ethereum/whisper/whisperv6" -) - -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/vendor/github.com/ethereum/go-ethereum/swarm/pss/writeup.md b/vendor/github.com/ethereum/go-ethereum/swarm/pss/writeup.md deleted file mode 100644 index af731fe7..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/swarm/sctx/sctx.go b/vendor/github.com/ethereum/go-ethereum/swarm/sctx/sctx.go deleted file mode 100644 index fb7d35b0..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/swarm/services/swap/swap.go b/vendor/github.com/ethereum/go-ethereum/swarm/services/swap/swap.go deleted file mode 100644 index 91fa54fc..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/contracts/chequebook" - "github.com/ethereum/go-ethereum/contracts/chequebook/contract" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/swarm/log" - "github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/swarm/services/swap/swap/swap.go b/vendor/github.com/ethereum/go-ethereum/swarm/services/swap/swap/swap.go deleted file mode 100644 index 0afca9ab..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/swarm/shed/db.go b/vendor/github.com/ethereum/go-ethereum/swarm/shed/db.go deleted file mode 100644 index 8c11bf48..00000000 --- a/vendor/github.com/ethereum/go-ethereum/swarm/shed/db.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 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 ( - "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 - - quit chan struct{} // 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.quit = make(chan struct{}) - - 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 -} - -// Has wraps LevelDB Has method to increment metrics counter. -func (db *DB) Has(key []byte) (yes bool, err error) { - yes, err = db.ldb.Has(key, nil) - if err != nil { - metrics.GetOrRegisterCounter("DB.hasFail", nil).Inc(1) - return false, err - } - metrics.GetOrRegisterCounter("DB.has", nil).Inc(1) - return yes, 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.quit) - 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 - ) - - // Iterate ad infinitum and collect the stats - for i := 1; true; i++ { - // Retrieve the database stats - stats, err := db.ldb.GetProperty("leveldb.stats") - if err != nil { - log.Error("Failed to read database stats", "err", 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") - 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) - 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) - 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") - continue - } - duration, err = time.ParseDuration(delayDuration) - if err != nil { - log.Error("Failed to parse delay duration", "err", 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) - continue - } - var nRead, nWrite float64 - parts := strings.Split(ioStats, " ") - if len(parts) < 2 { - log.Error("Bad syntax of ioStats", "ioStats", 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]) - 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]) - 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 <-db.quit: - // Quit requesting, stop hammering the database - return - case <-time.After(refresh): - // Timeout, gather a new set of stats - } - } -} diff --git a/vendor/github.com/ethereum/go-ethereum/swarm/shed/field_string.go b/vendor/github.com/ethereum/go-ethereum/swarm/shed/field_string.go deleted file mode 100644 index a7e8f0c7..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/swarm/shed/field_struct.go b/vendor/github.com/ethereum/go-ethereum/swarm/shed/field_struct.go deleted file mode 100644 index 90daee7f..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/swarm/shed/field_uint64.go b/vendor/github.com/ethereum/go-ethereum/swarm/shed/field_uint64.go deleted file mode 100644 index 0417583a..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/swarm/shed/index.go b/vendor/github.com/ethereum/go-ethereum/swarm/shed/index.go deleted file mode 100644 index 6be018d2..00000000 --- a/vendor/github.com/ethereum/go-ethereum/swarm/shed/index.go +++ /dev/null @@ -1,392 +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" - "github.com/syndtr/goleveldb/leveldb/iterator" -) - -// 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 -} - -// Has accepts key fields represented as Item to check -// if there this Item's encoded key is stored in -// the index. -func (f Index) Has(keyFields Item) (bool, error) { - key, err := f.encodeKeyFunc(keyFields) - if err != nil { - return false, err - } - return f.db.Has(key) -} - -// 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() { - item, err := f.itemFromIterator(it, prefix) - if err != nil { - if err == leveldb.ErrNotFound { - break - } - return err - } - stop, err := fn(item) - if err != nil { - return err - } - if stop { - break - } - } - return it.Error() -} - -// First returns the first item in the Index which encoded key starts with a prefix. -// If the prefix is nil, the first element of the whole index is returned. -// If Index has no elements, a leveldb.ErrNotFound error is returned. -func (f Index) First(prefix []byte) (i Item, err error) { - it := f.db.NewIterator() - defer it.Release() - - totalPrefix := append(f.prefix, prefix...) - it.Seek(totalPrefix) - - return f.itemFromIterator(it, totalPrefix) -} - -// itemFromIterator returns the Item from the current iterator position. -// If the complete encoded key does not start with totalPrefix, -// leveldb.ErrNotFound is returned. Value for totalPrefix must start with -// Index prefix. -func (f Index) itemFromIterator(it iterator.Iterator, totalPrefix []byte) (i Item, err error) { - key := it.Key() - if !bytes.HasPrefix(key, totalPrefix) { - return i, leveldb.ErrNotFound - } - // 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 i, 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 i, err - } - return keyItem.Merge(valueItem), it.Error() -} - -// Last returns the last item in the Index which encoded key starts with a prefix. -// If the prefix is nil, the last element of the whole index is returned. -// If Index has no elements, a leveldb.ErrNotFound error is returned. -func (f Index) Last(prefix []byte) (i Item, err error) { - it := f.db.NewIterator() - defer it.Release() - - // get the next prefix in line - // since leveldb iterator Seek seeks to the - // next key if the key that it seeks to is not found - // and by getting the previous key, the last one for the - // actual prefix is found - nextPrefix := incByteSlice(prefix) - l := len(prefix) - - if l > 0 && nextPrefix != nil { - it.Seek(append(f.prefix, nextPrefix...)) - it.Prev() - } else { - it.Last() - } - - totalPrefix := append(f.prefix, prefix...) - return f.itemFromIterator(it, totalPrefix) -} - -// incByteSlice returns the byte slice of the same size -// of the provided one that is by one incremented in its -// total value. If all bytes in provided slice are equal -// to 255 a nil slice would be returned indicating that -// increment can not happen for the same length. -func incByteSlice(b []byte) (next []byte) { - l := len(b) - next = make([]byte, l) - copy(next, b) - for i := l - 1; i >= 0; i-- { - if b[i] == 255 { - next[i] = 0 - } else { - next[i] = b[i] + 1 - return next - } - } - return nil -} - -// 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/vendor/github.com/ethereum/go-ethereum/swarm/shed/schema.go b/vendor/github.com/ethereum/go-ethereum/swarm/shed/schema.go deleted file mode 100644 index cfb7c6d6..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/swarm/shed/vector_uint64.go b/vendor/github.com/ethereum/go-ethereum/swarm/shed/vector_uint64.go deleted file mode 100644 index 0926e64f..00000000 --- a/vendor/github.com/ethereum/go-ethereum/swarm/shed/vector_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" -) - -// Uint64Vector provides a way to have multiple counters in the database. -// It transparently encodes uint64 type value to bytes. -type Uint64Vector struct { - db *DB - key []byte -} - -// NewUint64Vector returns a new Uint64Vector. -// It validates its name and type against the database schema. -func (db *DB) NewUint64Vector(name string) (f Uint64Vector, err error) { - key, err := db.schemaFieldKey(name, "vector-uint64") - if err != nil { - return f, err - } - return Uint64Vector{ - db: db, - key: key, - }, nil -} - -// Get retrieves a uint64 value at index i from the database. -// If the value is not found in the database a 0 value -// is returned and no error. -func (f Uint64Vector) Get(i uint64) (val uint64, err error) { - b, err := f.db.Get(f.indexKey(i)) - 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 Uint64Vector) Put(i, val uint64) (err error) { - return f.db.Put(f.indexKey(i), encodeUint64(val)) -} - -// PutInBatch stores a uint64 value at index i in a batch -// that can be saved later in the database. -func (f Uint64Vector) PutInBatch(batch *leveldb.Batch, i, val uint64) { - batch.Put(f.indexKey(i), encodeUint64(val)) -} - -// Inc increments a uint64 value in the database. -// This operation is not goroutine safe. -func (f Uint64Vector) Inc(i uint64) (val uint64, err error) { - val, err = f.Get(i) - if err != nil { - if err == leveldb.ErrNotFound { - val = 0 - } else { - return 0, err - } - } - val++ - return val, f.Put(i, val) -} - -// IncInBatch increments a uint64 value at index i in the batch -// by retreiving a value from the database, not the same batch. -// This operation is not goroutine safe. -func (f Uint64Vector) IncInBatch(batch *leveldb.Batch, i uint64) (val uint64, err error) { - val, err = f.Get(i) - if err != nil { - if err == leveldb.ErrNotFound { - val = 0 - } else { - return 0, err - } - } - val++ - f.PutInBatch(batch, i, val) - return val, nil -} - -// Dec decrements a uint64 value at index i in the database. -// This operation is not goroutine safe. -// The field is protected from overflow to a negative value. -func (f Uint64Vector) Dec(i uint64) (val uint64, err error) { - val, err = f.Get(i) - if err != nil { - if err == leveldb.ErrNotFound { - val = 0 - } else { - return 0, err - } - } - if val != 0 { - val-- - } - return val, f.Put(i, val) -} - -// DecInBatch decrements a uint64 value at index i in the batch -// by retreiving a value from the database, not the same batch. -// This operation is not goroutine safe. -// The field is protected from overflow to a negative value. -func (f Uint64Vector) DecInBatch(batch *leveldb.Batch, i uint64) (val uint64, err error) { - val, err = f.Get(i) - if err != nil { - if err == leveldb.ErrNotFound { - val = 0 - } else { - return 0, err - } - } - if val != 0 { - val-- - } - f.PutInBatch(batch, i, val) - return val, nil -} - -// indexKey concatenates field prefix and vector index -// returning a unique database key for a specific vector element. -func (f Uint64Vector) indexKey(i uint64) (key []byte) { - b := make([]byte, 8) - binary.BigEndian.PutUint64(b, i) - return append(f.key, b...) -} diff --git a/vendor/github.com/ethereum/go-ethereum/swarm/spancontext/spancontext.go b/vendor/github.com/ethereum/go-ethereum/swarm/spancontext/spancontext.go deleted file mode 100644 index 2cb9f82f..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/swarm/state/dbstore.go b/vendor/github.com/ethereum/go-ethereum/swarm/state/dbstore.go deleted file mode 100644 index 1b541e78..00000000 --- a/vendor/github.com/ethereum/go-ethereum/swarm/state/dbstore.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 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 - if marshaler, ok := i.(encoding.BinaryMarshaler); ok { - if bytes, err = marshaler.MarshalBinary(); err != nil { - return err - } - } else { - if bytes, err = json.Marshal(i); 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/vendor/github.com/ethereum/go-ethereum/swarm/storage/chunker.go b/vendor/github.com/ethereum/go-ethereum/swarm/storage/chunker.go deleted file mode 100644 index b2f0f563..00000000 --- a/vendor/github.com/ethereum/go-ethereum/swarm/storage/chunker.go +++ /dev/null @@ -1,612 +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/ethereum/go-ethereum/metrics" - "github.com/ethereum/go-ethereum/swarm/chunk" - "github.com/ethereum/go-ethereum/swarm/log" - "github.com/ethereum/go-ethereum/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: chunk.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: chunk.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(cctx, 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(ctx context.Context, 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(ctx, Reference(childAddress)) - if err != nil { - metrics.GetOrRegisterResettingTimer("lcr.getter.get.err", nil).UpdateSince(startTime) - 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(ctx, 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.Trace("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.Trace("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) { - cctx, sp := spancontext.StartSpan( - r.ctx, - "lcr.seek") - defer sp.Finish() - - 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(cctx, 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/vendor/github.com/ethereum/go-ethereum/swarm/storage/database.go b/vendor/github.com/ethereum/go-ethereum/swarm/storage/database.go deleted file mode 100644 index 12367b90..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/swarm/storage/encryption/encryption.go b/vendor/github.com/ethereum/go-ethereum/swarm/storage/encryption/encryption.go deleted file mode 100644 index 6fbdab06..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/swarm/storage/feed/binaryserializer.go b/vendor/github.com/ethereum/go-ethereum/swarm/storage/feed/binaryserializer.go deleted file mode 100644 index 4e4f67a0..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/swarm/storage/feed/cacheentry.go b/vendor/github.com/ethereum/go-ethereum/swarm/storage/feed/cacheentry.go deleted file mode 100644 index be42008e..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/swarm/storage/feed/doc.go b/vendor/github.com/ethereum/go-ethereum/swarm/storage/feed/doc.go deleted file mode 100644 index 1f07948f..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/swarm/storage/feed/error.go b/vendor/github.com/ethereum/go-ethereum/swarm/storage/feed/error.go deleted file mode 100644 index 206ba331..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/swarm/storage/feed/feed.go b/vendor/github.com/ethereum/go-ethereum/swarm/storage/feed/feed.go deleted file mode 100644 index b6ea665a..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/swarm/storage/feed/handler.go b/vendor/github.com/ethereum/go-ethereum/swarm/storage/feed/handler.go deleted file mode 100644 index 063d3e92..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/ethereum/go-ethereum/swarm/storage/feed/lookup" - - "github.com/ethereum/go-ethereum/swarm/log" - "github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/swarm/storage/feed/id.go b/vendor/github.com/ethereum/go-ethereum/swarm/storage/feed/id.go deleted file mode 100644 index 7e17743c..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/swarm/storage/feed/lookup" - - "github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/swarm/storage/feed/lookup/epoch.go b/vendor/github.com/ethereum/go-ethereum/swarm/storage/feed/lookup/epoch.go deleted file mode 100644 index bafe9547..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/swarm/storage/feed/lookup/lookup.go b/vendor/github.com/ethereum/go-ethereum/swarm/storage/feed/lookup/lookup.go deleted file mode 100644 index 2f862d81..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/swarm/storage/feed/query.go b/vendor/github.com/ethereum/go-ethereum/swarm/storage/feed/query.go deleted file mode 100644 index 8be78a95..00000000 --- a/vendor/github.com/ethereum/go-ethereum/swarm/storage/feed/query.go +++ /dev/null @@ -1,78 +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/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/swarm/storage/feed/request.go b/vendor/github.com/ethereum/go-ethereum/swarm/storage/feed/request.go deleted file mode 100644 index dd91a7cf..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/swarm/storage" - "github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/swarm/storage/feed/sign.go b/vendor/github.com/ethereum/go-ethereum/swarm/storage/feed/sign.go deleted file mode 100644 index 5f0ea0b3..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/swarm/storage/feed/testutil.go b/vendor/github.com/ethereum/go-ethereum/swarm/storage/feed/testutil.go deleted file mode 100644 index caa39d9f..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/ethereum/go-ethereum/p2p/enode" - "github.com/ethereum/go-ethereum/swarm/storage" -) - -const ( - testDbDirName = "feeds" -) - -type TestHandler struct { - *Handler -} - -func (t *TestHandler) Close() { - t.chunkStore.Close() -} - -type mockNetFetcher struct{} - -func (m *mockNetFetcher) Request(hopCount uint8) { -} -func (m *mockNetFetcher) Offer(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/vendor/github.com/ethereum/go-ethereum/swarm/storage/feed/timestampprovider.go b/vendor/github.com/ethereum/go-ethereum/swarm/storage/feed/timestampprovider.go deleted file mode 100644 index fb60cea9..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/swarm/storage/feed/topic.go b/vendor/github.com/ethereum/go-ethereum/swarm/storage/feed/topic.go deleted file mode 100644 index 43a7b4ba..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/ethereum/go-ethereum/common/bitutil" - "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/swarm/storage/feed/update.go b/vendor/github.com/ethereum/go-ethereum/swarm/storage/feed/update.go deleted file mode 100644 index 21c004ca..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/swarm/storage/filestore.go b/vendor/github.com/ethereum/go-ethereum/swarm/storage/filestore.go deleted file mode 100644 index 0bad944e..00000000 --- a/vendor/github.com/ethereum/go-ethereum/swarm/storage/filestore.go +++ /dev/null @@ -1,146 +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" - "sort" - "sync" -) - -/* -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, - } -} - -// Retrieve is a 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 -} - -// Store is a 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() -} - -// GetAllReferences is a public API. This endpoint returns all chunk hashes (only) for a given file -func (f *FileStore) GetAllReferences(ctx context.Context, data io.Reader, toEncrypt bool) (addrs AddressCollection, err error) { - // create a special kind of putter, which only will store the references - putter := &hashExplorer{ - hasherStore: NewHasherStore(f.ChunkStore, f.hashFunc, toEncrypt), - } - // do the actual splitting anyway, no way around it - _, wait, err := PyramidSplit(ctx, data, putter, putter) - if err != nil { - return nil, err - } - // wait for splitting to be complete and all chunks processed - err = wait(ctx) - if err != nil { - return nil, err - } - // collect all references - addrs = NewAddressCollection(0) - for _, ref := range putter.references { - addrs = append(addrs, Address(ref)) - } - sort.Sort(addrs) - return addrs, nil -} - -// hashExplorer is a special kind of putter which will only store chunk references -type hashExplorer struct { - *hasherStore - references []Reference - lock sync.Mutex -} - -// HashExplorer's Put will add just the chunk hashes to its `References` -func (he *hashExplorer) Put(ctx context.Context, chunkData ChunkData) (Reference, error) { - // Need to do the actual Put, which returns the references - ref, err := he.hasherStore.Put(ctx, chunkData) - if err != nil { - return nil, err - } - // internally store the reference - he.lock.Lock() - he.references = append(he.references, ref) - he.lock.Unlock() - return ref, nil -} diff --git a/vendor/github.com/ethereum/go-ethereum/swarm/storage/hasherstore.go b/vendor/github.com/ethereum/go-ethereum/swarm/storage/hasherstore.go deleted file mode 100644 index 345ce743..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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" - - "github.com/ethereum/go-ethereum/swarm/chunk" - "github.com/ethereum/go-ethereum/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 > chunk.DefaultSize { - length = length + (chunk.DefaultSize - 1) - length = length / chunk.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(chunk.DefaultSize/h.refSize), sha3.NewLegacyKeccak256) -} - -func (h *hasherStore) newDataEncryption(key encryption.Key) encryption.Encryption { - return encryption.New(key, int(chunk.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/vendor/github.com/ethereum/go-ethereum/swarm/storage/ldbstore.go b/vendor/github.com/ethereum/go-ethereum/swarm/storage/ldbstore.go deleted file mode 100644 index fd5ec9e3..00000000 --- a/vendor/github.com/ethereum/go-ethereum/swarm/storage/ldbstore.go +++ /dev/null @@ -1,1082 +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/ethereum/go-ethereum/metrics" - "github.com/ethereum/go-ethereum/rlp" - "github.com/ethereum/go-ethereum/swarm/log" - "github.com/ethereum/go-ethereum/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) - - 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) - log.Trace("garbage collect batch done", "batch", singleIterationCount, "total", s.gc.count) - s.lock.Unlock() - it.Release() - } - - metrics.GetOrRegisterCounter("ldbstore.collectgarbage.delete", nil).Inc(int64(s.gc.count)) - log.Debug("garbage collect done", "c", s.gc.count) - s.gc.runC <- struct{}{} - - 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 - - // The highest possible proximity is 255, so exit loop upon overflow. - for po = uint8(1); po != 0; 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 - } - - sdata := c.Data() - - cs := int64(binary.LittleEndian.Uint64(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(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(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) -} - -// Has queries the underlying DB if a chunk with the given address is stored -// Returns true if the chunk is found, false if not -func (s *LDBStore) Has(_ context.Context, addr Address) bool { - s.lock.RLock() - defer s.lock.RUnlock() - - ikey := getIndexKey(addr) - _, err := s.db.Get(ikey) - - return err == nil -} - -// 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)) - if err == leveldb.ErrNotFound { - return nil, ErrChunkNotFound - } - return nil, err - } - } - - 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() - 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/vendor/github.com/ethereum/go-ethereum/swarm/storage/localstore.go b/vendor/github.com/ethereum/go-ethereum/swarm/storage/localstore.go deleted file mode 100644 index a8f6f037..00000000 --- a/vendor/github.com/ethereum/go-ethereum/swarm/storage/localstore.go +++ /dev/null @@ -1,251 +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/ethereum/go-ethereum/metrics" - "github.com/ethereum/go-ethereum/swarm/log" - "github.com/ethereum/go-ethereum/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 -} - -// Has queries the underlying DbStore if a chunk with the given address -// is being stored there. -// Returns true if it is stored, false if not -func (ls *LocalStore) Has(ctx context.Context, addr Address) bool { - return ls.DbStore.Has(ctx, addr) -} - -// 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/vendor/github.com/ethereum/go-ethereum/swarm/storage/localstore/doc.go b/vendor/github.com/ethereum/go-ethereum/swarm/storage/localstore/doc.go deleted file mode 100644 index 98f6fc40..00000000 --- a/vendor/github.com/ethereum/go-ethereum/swarm/storage/localstore/doc.go +++ /dev/null @@ -1,56 +0,0 @@ -// 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 localstore provides disk storage layer for Swarm Chunk persistence. -It uses swarm/shed abstractions on top of github.com/syndtr/goleveldb LevelDB -implementation. - -The main type is DB which manages the storage by providing methods to -access and add Chunks and to manage their status. - -Modes are abstractions that do specific changes to Chunks. There are three -mode types: - - - ModeGet, for Chunk access - - ModePut, for adding Chunks to the database - - ModeSet, for changing Chunk statuses - -Every mode type has a corresponding type (Getter, Putter and Setter) -that provides adequate method to perform the opperation and that type -should be injected into localstore consumers instead the whole DB. -This provides more clear insight which operations consumer is performing -on the database. - -Getters, Putters and Setters accept different get, put and set modes -to perform different actions. For example, ModeGet has two different -variables ModeGetRequest and ModeGetSync and two different Getters -can be constructed with them that are used when the chunk is requested -or when the chunk is synced as this two events are differently changing -the database. - -Subscription methods are implemented for a specific purpose of -continuous iterations over Chunks that should be provided to -Push and Pull syncing. - -DB implements an internal garbage collector that removes only synced -Chunks from the database based on their most recent access time. - -Internally, DB stores Chunk data and any required information, such as -store and access timestamps in different shed indexes that can be -iterated on by garbage collector or subscriptions. -*/ -package localstore diff --git a/vendor/github.com/ethereum/go-ethereum/swarm/storage/localstore/gc.go b/vendor/github.com/ethereum/go-ethereum/swarm/storage/localstore/gc.go deleted file mode 100644 index 84c4f596..00000000 --- a/vendor/github.com/ethereum/go-ethereum/swarm/storage/localstore/gc.go +++ /dev/null @@ -1,175 +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 localstore - -import ( - "github.com/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/swarm/shed" - "github.com/syndtr/goleveldb/leveldb" -) - -var ( - // gcTargetRatio defines the target number of items - // in garbage collection index that will not be removed - // on garbage collection. The target number of items - // is calculated by gcTarget function. This value must be - // in range (0,1]. For example, with 0.9 value, - // garbage collection will leave 90% of defined capacity - // in database after its run. This prevents frequent - // garbage collection runs. - gcTargetRatio = 0.9 - // gcBatchSize limits the number of chunks in a single - // leveldb batch on garbage collection. - gcBatchSize uint64 = 1000 -) - -// collectGarbageWorker is a long running function that waits for -// collectGarbageTrigger channel to signal a garbage collection -// run. GC run iterates on gcIndex and removes older items -// form retrieval and other indexes. -func (db *DB) collectGarbageWorker() { - defer close(db.collectGarbageWorkerDone) - - for { - select { - case <-db.collectGarbageTrigger: - // run a single collect garbage run and - // if done is false, gcBatchSize is reached and - // another collect garbage run is needed - collectedCount, done, err := db.collectGarbage() - if err != nil { - log.Error("localstore collect garbage", "err", err) - } - // check if another gc run is needed - if !done { - db.triggerGarbageCollection() - } - - if collectedCount > 0 && testHookCollectGarbage != nil { - testHookCollectGarbage(collectedCount) - } - case <-db.close: - return - } - } -} - -// collectGarbage removes chunks from retrieval and other -// indexes if maximal number of chunks in database is reached. -// This function returns the number of removed chunks. If done -// is false, another call to this function is needed to collect -// the rest of the garbage as the batch size limit is reached. -// This function is called in collectGarbageWorker. -func (db *DB) collectGarbage() (collectedCount uint64, done bool, err error) { - batch := new(leveldb.Batch) - target := db.gcTarget() - - // protect database from changing idexes and gcSize - db.batchMu.Lock() - defer db.batchMu.Unlock() - - gcSize, err := db.gcSize.Get() - if err != nil { - return 0, true, err - } - - done = true - err = db.gcIndex.Iterate(func(item shed.Item) (stop bool, err error) { - if gcSize-collectedCount <= target { - return true, nil - } - // delete from retrieve, pull, gc - db.retrievalDataIndex.DeleteInBatch(batch, item) - db.retrievalAccessIndex.DeleteInBatch(batch, item) - db.pullIndex.DeleteInBatch(batch, item) - db.gcIndex.DeleteInBatch(batch, item) - collectedCount++ - if collectedCount >= gcBatchSize { - // bach size limit reached, - // another gc run is needed - done = false - return true, nil - } - return false, nil - }, nil) - if err != nil { - return 0, false, err - } - - db.gcSize.PutInBatch(batch, gcSize-collectedCount) - - err = db.shed.WriteBatch(batch) - if err != nil { - return 0, false, err - } - return collectedCount, done, nil -} - -// gcTrigger retruns the absolute value for garbage collection -// target value, calculated from db.capacity and gcTargetRatio. -func (db *DB) gcTarget() (target uint64) { - return uint64(float64(db.capacity) * gcTargetRatio) -} - -// triggerGarbageCollection signals collectGarbageWorker -// to call collectGarbage. -func (db *DB) triggerGarbageCollection() { - select { - case db.collectGarbageTrigger <- struct{}{}: - case <-db.close: - default: - } -} - -// incGCSizeInBatch changes gcSize field value -// by change which can be negative. This function -// must be called under batchMu lock. -func (db *DB) incGCSizeInBatch(batch *leveldb.Batch, change int64) (err error) { - if change == 0 { - return nil - } - gcSize, err := db.gcSize.Get() - if err != nil { - return err - } - - var new uint64 - if change > 0 { - new = gcSize + uint64(change) - } else { - // 'change' is an int64 and is negative - // a conversion is needed with correct sign - c := uint64(-change) - if c > gcSize { - // protect uint64 undeflow - return nil - } - new = gcSize - c - } - db.gcSize.PutInBatch(batch, new) - - // trigger garbage collection if we reached the capacity - if new >= db.capacity { - db.triggerGarbageCollection() - } - return nil -} - -// testHookCollectGarbage is a hook that can provide -// information when a garbage collection run is done -// and how many items it removed. -var testHookCollectGarbage func(collectedCount uint64) diff --git a/vendor/github.com/ethereum/go-ethereum/swarm/storage/localstore/localstore.go b/vendor/github.com/ethereum/go-ethereum/swarm/storage/localstore/localstore.go deleted file mode 100644 index 98d4c788..00000000 --- a/vendor/github.com/ethereum/go-ethereum/swarm/storage/localstore/localstore.go +++ /dev/null @@ -1,360 +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 localstore - -import ( - "encoding/binary" - "errors" - "sync" - "time" - - "github.com/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/swarm/chunk" - "github.com/ethereum/go-ethereum/swarm/shed" - "github.com/ethereum/go-ethereum/swarm/storage/mock" -) - -var ( - // ErrInvalidMode is retuned when an unknown Mode - // is provided to the function. - ErrInvalidMode = errors.New("invalid mode") - // ErrAddressLockTimeout is returned when the same chunk - // is updated in parallel and one of the updates - // takes longer then the configured timeout duration. - ErrAddressLockTimeout = errors.New("address lock timeout") -) - -var ( - // Default value for Capacity DB option. - defaultCapacity uint64 = 5000000 - // Limit the number of goroutines created by Getters - // that call updateGC function. Value 0 sets no limit. - maxParallelUpdateGC = 1000 -) - -// DB is the local store implementation and holds -// database related objects. -type DB struct { - shed *shed.DB - - // schema name of loaded data - schemaName shed.StringField - - // retrieval indexes - retrievalDataIndex shed.Index - retrievalAccessIndex shed.Index - // push syncing index - pushIndex shed.Index - // push syncing subscriptions triggers - pushTriggers []chan struct{} - pushTriggersMu sync.RWMutex - - // pull syncing index - pullIndex shed.Index - // pull syncing subscriptions triggers per bin - pullTriggers map[uint8][]chan struct{} - pullTriggersMu sync.RWMutex - - // garbage collection index - gcIndex shed.Index - - // field that stores number of intems in gc index - gcSize shed.Uint64Field - - // garbage collection is triggered when gcSize exceeds - // the capacity value - capacity uint64 - - // triggers garbage collection event loop - collectGarbageTrigger chan struct{} - - // a buffered channel acting as a semaphore - // to limit the maximal number of goroutines - // created by Getters to call updateGC function - updateGCSem chan struct{} - // a wait group to ensure all updateGC goroutines - // are done before closing the database - updateGCWG sync.WaitGroup - - baseKey []byte - - batchMu sync.Mutex - - // this channel is closed when close function is called - // to terminate other goroutines - close chan struct{} - - // protect Close method from exiting before - // garbage collection and gc size write workers - // are done - collectGarbageWorkerDone chan struct{} -} - -// Options struct holds optional parameters for configuring DB. -type Options struct { - // MockStore is a mock node store that is used to store - // chunk data in a central store. It can be used to reduce - // total storage space requirements in testing large number - // of swarm nodes with chunk data deduplication provided by - // the mock global store. - MockStore *mock.NodeStore - // Capacity is a limit that triggers garbage collection when - // number of items in gcIndex equals or exceeds it. - Capacity uint64 - // MetricsPrefix defines a prefix for metrics names. - MetricsPrefix string -} - -// New returns a new DB. All fields and indexes are initialized -// and possible conflicts with schema from existing database is checked. -// One goroutine for writing batches is created. -func New(path string, baseKey []byte, o *Options) (db *DB, err error) { - if o == nil { - o = new(Options) - } - db = &DB{ - capacity: o.Capacity, - baseKey: baseKey, - // channel collectGarbageTrigger - // needs to be buffered with the size of 1 - // to signal another event if it - // is triggered during already running function - collectGarbageTrigger: make(chan struct{}, 1), - close: make(chan struct{}), - collectGarbageWorkerDone: make(chan struct{}), - } - if db.capacity <= 0 { - db.capacity = defaultCapacity - } - if maxParallelUpdateGC > 0 { - db.updateGCSem = make(chan struct{}, maxParallelUpdateGC) - } - - db.shed, err = shed.NewDB(path, o.MetricsPrefix) - if err != nil { - return nil, err - } - // Identify current storage schema by arbitrary name. - db.schemaName, err = db.shed.NewStringField("schema-name") - if err != nil { - return nil, err - } - // Persist gc size. - db.gcSize, err = db.shed.NewUint64Field("gc-size") - if err != nil { - return nil, err - } - // Functions for retrieval data index. - var ( - encodeValueFunc func(fields shed.Item) (value []byte, err error) - decodeValueFunc func(keyItem shed.Item, value []byte) (e shed.Item, err error) - ) - if o.MockStore != nil { - encodeValueFunc = func(fields shed.Item) (value []byte, err error) { - b := make([]byte, 8) - binary.BigEndian.PutUint64(b, uint64(fields.StoreTimestamp)) - err = o.MockStore.Put(fields.Address, fields.Data) - if err != nil { - return nil, err - } - return b, nil - } - decodeValueFunc = func(keyItem shed.Item, value []byte) (e shed.Item, err error) { - e.StoreTimestamp = int64(binary.BigEndian.Uint64(value[:8])) - e.Data, err = o.MockStore.Get(keyItem.Address) - return e, err - } - } else { - encodeValueFunc = 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 - } - decodeValueFunc = 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 - } - } - // Index storing actual chunk address, data and store timestamp. - db.retrievalDataIndex, err = db.shed.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: encodeValueFunc, - DecodeValue: decodeValueFunc, - }) - 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. - db.retrievalAccessIndex, err = db.shed.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 - } - // pull index allows history and live syncing per po bin - db.pullIndex, err = db.shed.NewIndex("PO|StoredTimestamp|Hash->nil", shed.IndexFuncs{ - EncodeKey: func(fields shed.Item) (key []byte, err error) { - key = make([]byte, 41) - key[0] = db.po(fields.Address) - binary.BigEndian.PutUint64(key[1:9], uint64(fields.StoreTimestamp)) - copy(key[9:], fields.Address[:]) - return key, nil - }, - DecodeKey: func(key []byte) (e shed.Item, err error) { - e.Address = key[9:] - e.StoreTimestamp = int64(binary.BigEndian.Uint64(key[1:9])) - 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 - } - // create a pull syncing triggers used by SubscribePull function - db.pullTriggers = make(map[uint8][]chan struct{}) - // push index contains as yet unsynced chunks - db.pushIndex, err = db.shed.NewIndex("StoredTimestamp|Hash->nil", shed.IndexFuncs{ - EncodeKey: func(fields shed.Item) (key []byte, err error) { - key = make([]byte, 40) - binary.BigEndian.PutUint64(key[:8], uint64(fields.StoreTimestamp)) - copy(key[8:], fields.Address[:]) - return key, nil - }, - DecodeKey: func(key []byte) (e shed.Item, err error) { - e.Address = key[8:] - e.StoreTimestamp = int64(binary.BigEndian.Uint64(key[:8])) - 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 - } - // create a push syncing triggers used by SubscribePush function - db.pushTriggers = make([]chan struct{}, 0) - // gc index for removable chunk ordered by ascending last access time - db.gcIndex, err = db.shed.NewIndex("AccessTimestamp|StoredTimestamp|Hash->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 - } - // start garbage collection worker - go db.collectGarbageWorker() - return db, nil -} - -// Close closes the underlying database. -func (db *DB) Close() (err error) { - close(db.close) - db.updateGCWG.Wait() - - // wait for gc worker to - // return before closing the shed - select { - case <-db.collectGarbageWorkerDone: - case <-time.After(5 * time.Second): - log.Error("localstore: collect garbage worker did not return after db close") - } - return db.shed.Close() -} - -// po computes the proximity order between the address -// and database base key. -func (db *DB) po(addr chunk.Address) (bin uint8) { - return uint8(chunk.Proximity(db.baseKey, addr)) -} - -// chunkToItem creates new Item with data provided by the Chunk. -func chunkToItem(ch chunk.Chunk) shed.Item { - return shed.Item{ - Address: ch.Address(), - Data: ch.Data(), - } -} - -// addressToItem creates new Item with a provided address. -func addressToItem(addr chunk.Address) shed.Item { - return shed.Item{ - Address: addr, - } -} - -// now is a helper function that returns a current unix timestamp -// in UTC timezone. -// It is set in the init function for usage in production, and -// optionally overridden in tests for data validation. -var now func() int64 - -func init() { - // set the now function - now = func() (t int64) { - return time.Now().UTC().UnixNano() - } -} diff --git a/vendor/github.com/ethereum/go-ethereum/swarm/storage/localstore/mode_get.go b/vendor/github.com/ethereum/go-ethereum/swarm/storage/localstore/mode_get.go deleted file mode 100644 index a6353e14..00000000 --- a/vendor/github.com/ethereum/go-ethereum/swarm/storage/localstore/mode_get.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 localstore - -import ( - "github.com/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/swarm/chunk" - "github.com/ethereum/go-ethereum/swarm/shed" - "github.com/syndtr/goleveldb/leveldb" -) - -// ModeGet enumerates different Getter modes. -type ModeGet int - -// Getter modes. -const ( - // ModeGetRequest: when accessed for retrieval - ModeGetRequest ModeGet = iota - // ModeGetSync: when accessed for syncing or proof of custody request - ModeGetSync -) - -// Getter provides Get method to retrieve Chunks -// from database. -type Getter struct { - db *DB - mode ModeGet -} - -// NewGetter returns a new Getter on database -// with a specific Mode. -func (db *DB) NewGetter(mode ModeGet) *Getter { - return &Getter{ - mode: mode, - db: db, - } -} - -// Get returns a chunk from the database. If the chunk is -// not found chunk.ErrChunkNotFound will be returned. -// All required indexes will be updated required by the -// Getter Mode. -func (g *Getter) Get(addr chunk.Address) (ch chunk.Chunk, err error) { - out, err := g.db.get(g.mode, addr) - if err != nil { - if err == leveldb.ErrNotFound { - return nil, chunk.ErrChunkNotFound - } - return nil, err - } - return chunk.NewChunk(out.Address, out.Data), nil -} - -// get returns Item from the retrieval index -// and updates other indexes. -func (db *DB) get(mode ModeGet, addr chunk.Address) (out shed.Item, err error) { - item := addressToItem(addr) - - out, err = db.retrievalDataIndex.Get(item) - if err != nil { - return out, err - } - switch mode { - // update the access timestamp and gc index - case ModeGetRequest: - if db.updateGCSem != nil { - // wait before creating new goroutines - // if updateGCSem buffer id full - db.updateGCSem <- struct{}{} - } - db.updateGCWG.Add(1) - go func() { - defer db.updateGCWG.Done() - if db.updateGCSem != nil { - // free a spot in updateGCSem buffer - // for a new goroutine - defer func() { <-db.updateGCSem }() - } - err := db.updateGC(out) - if err != nil { - log.Error("localstore update gc", "err", err) - } - // if gc update hook is defined, call it - if testHookUpdateGC != nil { - testHookUpdateGC() - } - }() - - // no updates to indexes - case ModeGetSync: - default: - return out, ErrInvalidMode - } - return out, nil -} - -// updateGC updates garbage collection index for -// a single item. Provided item is expected to have -// only Address and Data fields with non zero values, -// which is ensured by the get function. -func (db *DB) updateGC(item shed.Item) (err error) { - db.batchMu.Lock() - defer db.batchMu.Unlock() - - batch := new(leveldb.Batch) - - // update accessTimeStamp in retrieve, gc - - i, err := db.retrievalAccessIndex.Get(item) - switch err { - case nil: - item.AccessTimestamp = i.AccessTimestamp - case leveldb.ErrNotFound: - // no chunk accesses - default: - return err - } - if item.AccessTimestamp == 0 { - // chunk is not yet synced - // do not add it to the gc index - return nil - } - // delete current entry from the gc index - db.gcIndex.DeleteInBatch(batch, item) - // update access timestamp - item.AccessTimestamp = now() - // update retrieve access index - db.retrievalAccessIndex.PutInBatch(batch, item) - // add new entry to gc index - db.gcIndex.PutInBatch(batch, item) - - return db.shed.WriteBatch(batch) -} - -// testHookUpdateGC is a hook that can provide -// information when a garbage collection index is updated. -var testHookUpdateGC func() diff --git a/vendor/github.com/ethereum/go-ethereum/swarm/storage/localstore/mode_has.go b/vendor/github.com/ethereum/go-ethereum/swarm/storage/localstore/mode_has.go deleted file mode 100644 index 90feacee..00000000 --- a/vendor/github.com/ethereum/go-ethereum/swarm/storage/localstore/mode_has.go +++ /dev/null @@ -1,39 +0,0 @@ -// 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 localstore - -import ( - "github.com/ethereum/go-ethereum/swarm/chunk" -) - -// Hasser provides Has method to retrieve Chunks -// from database. -type Hasser struct { - db *DB -} - -// NewHasser returns a new Hasser on database. -func (db *DB) NewHasser() *Hasser { - return &Hasser{ - db: db, - } -} - -// Has returns true if the chunk is stored in database. -func (h *Hasser) Has(addr chunk.Address) (bool, error) { - return h.db.retrievalDataIndex.Has(addressToItem(addr)) -} diff --git a/vendor/github.com/ethereum/go-ethereum/swarm/storage/localstore/mode_put.go b/vendor/github.com/ethereum/go-ethereum/swarm/storage/localstore/mode_put.go deleted file mode 100644 index 1599ca8e..00000000 --- a/vendor/github.com/ethereum/go-ethereum/swarm/storage/localstore/mode_put.go +++ /dev/null @@ -1,158 +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 localstore - -import ( - "github.com/ethereum/go-ethereum/swarm/chunk" - "github.com/ethereum/go-ethereum/swarm/shed" - "github.com/syndtr/goleveldb/leveldb" -) - -// ModePut enumerates different Putter modes. -type ModePut int - -// Putter modes. -const ( - // ModePutRequest: when a chunk is received as a result of retrieve request and delivery - ModePutRequest ModePut = iota - // ModePutSync: when a chunk is received via syncing - ModePutSync - // ModePutUpload: when a chunk is created by local upload - ModePutUpload -) - -// Putter provides Put method to store Chunks -// to database. -type Putter struct { - db *DB - mode ModePut -} - -// NewPutter returns a new Putter on database -// with a specific Mode. -func (db *DB) NewPutter(mode ModePut) *Putter { - return &Putter{ - mode: mode, - db: db, - } -} - -// Put stores the Chunk to database and depending -// on the Putter mode, it updates required indexes. -func (p *Putter) Put(ch chunk.Chunk) (err error) { - return p.db.put(p.mode, chunkToItem(ch)) -} - -// put stores Item to database and updates other -// indexes. It acquires lockAddr to protect two calls -// of this function for the same address in parallel. -// Item fields Address and Data must not be -// with their nil values. -func (db *DB) put(mode ModePut, item shed.Item) (err error) { - // protect parallel updates - db.batchMu.Lock() - defer db.batchMu.Unlock() - - batch := new(leveldb.Batch) - - // variables that provide information for operations - // to be done after write batch function successfully executes - var gcSizeChange int64 // number to add or subtract from gcSize - var triggerPullFeed bool // signal pull feed subscriptions to iterate - var triggerPushFeed bool // signal push feed subscriptions to iterate - - switch mode { - case ModePutRequest: - // put to indexes: retrieve, gc; it does not enter the syncpool - - // check if the chunk already is in the database - // as gc index is updated - i, err := db.retrievalAccessIndex.Get(item) - switch err { - case nil: - item.AccessTimestamp = i.AccessTimestamp - case leveldb.ErrNotFound: - // no chunk accesses - default: - return err - } - i, err = db.retrievalDataIndex.Get(item) - switch err { - case nil: - item.StoreTimestamp = i.StoreTimestamp - case leveldb.ErrNotFound: - // no chunk accesses - default: - return err - } - if item.AccessTimestamp != 0 { - // delete current entry from the gc index - db.gcIndex.DeleteInBatch(batch, item) - gcSizeChange-- - } - if item.StoreTimestamp == 0 { - item.StoreTimestamp = now() - } - // update access timestamp - item.AccessTimestamp = now() - // update retrieve access index - db.retrievalAccessIndex.PutInBatch(batch, item) - // add new entry to gc index - db.gcIndex.PutInBatch(batch, item) - gcSizeChange++ - - db.retrievalDataIndex.PutInBatch(batch, item) - - case ModePutUpload: - // put to indexes: retrieve, push, pull - - item.StoreTimestamp = now() - db.retrievalDataIndex.PutInBatch(batch, item) - db.pullIndex.PutInBatch(batch, item) - triggerPullFeed = true - db.pushIndex.PutInBatch(batch, item) - triggerPushFeed = true - - case ModePutSync: - // put to indexes: retrieve, pull - - item.StoreTimestamp = now() - db.retrievalDataIndex.PutInBatch(batch, item) - db.pullIndex.PutInBatch(batch, item) - triggerPullFeed = true - - default: - return ErrInvalidMode - } - - err = db.incGCSizeInBatch(batch, gcSizeChange) - if err != nil { - return err - } - - err = db.shed.WriteBatch(batch) - if err != nil { - return err - } - if triggerPullFeed { - db.triggerPullSubscriptions(db.po(item.Address)) - } - if triggerPushFeed { - db.triggerPushSubscriptions() - } - return nil -} diff --git a/vendor/github.com/ethereum/go-ethereum/swarm/storage/localstore/mode_set.go b/vendor/github.com/ethereum/go-ethereum/swarm/storage/localstore/mode_set.go deleted file mode 100644 index 83fcbea5..00000000 --- a/vendor/github.com/ethereum/go-ethereum/swarm/storage/localstore/mode_set.go +++ /dev/null @@ -1,201 +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 localstore - -import ( - "github.com/ethereum/go-ethereum/swarm/chunk" - "github.com/syndtr/goleveldb/leveldb" -) - -// ModeSet enumerates different Setter modes. -type ModeSet int - -// Setter modes. -const ( - // ModeSetAccess: when an update request is received for a chunk or chunk is retrieved for delivery - ModeSetAccess ModeSet = iota - // ModeSetSync: when push sync receipt is received - ModeSetSync - // modeSetRemove: when GC-d - // unexported as no external packages should remove chunks from database - modeSetRemove -) - -// Setter sets the state of a particular -// Chunk in database by changing indexes. -type Setter struct { - db *DB - mode ModeSet -} - -// NewSetter returns a new Setter on database -// with a specific Mode. -func (db *DB) NewSetter(mode ModeSet) *Setter { - return &Setter{ - mode: mode, - db: db, - } -} - -// Set updates database indexes for a specific -// chunk represented by the address. -func (s *Setter) Set(addr chunk.Address) (err error) { - return s.db.set(s.mode, addr) -} - -// set updates database indexes for a specific -// chunk represented by the address. -// It acquires lockAddr to protect two calls -// of this function for the same address in parallel. -func (db *DB) set(mode ModeSet, addr chunk.Address) (err error) { - // protect parallel updates - db.batchMu.Lock() - defer db.batchMu.Unlock() - - batch := new(leveldb.Batch) - - // variables that provide information for operations - // to be done after write batch function successfully executes - var gcSizeChange int64 // number to add or subtract from gcSize - var triggerPullFeed bool // signal pull feed subscriptions to iterate - - item := addressToItem(addr) - - switch mode { - case ModeSetAccess: - // add to pull, insert to gc - - // need to get access timestamp here as it is not - // provided by the access function, and it is not - // a property of a chunk provided to Accessor.Put. - - i, err := db.retrievalDataIndex.Get(item) - switch err { - case nil: - item.StoreTimestamp = i.StoreTimestamp - case leveldb.ErrNotFound: - db.pushIndex.DeleteInBatch(batch, item) - item.StoreTimestamp = now() - default: - return err - } - - i, err = db.retrievalAccessIndex.Get(item) - switch err { - case nil: - item.AccessTimestamp = i.AccessTimestamp - db.gcIndex.DeleteInBatch(batch, item) - gcSizeChange-- - case leveldb.ErrNotFound: - // the chunk is not accessed before - default: - return err - } - item.AccessTimestamp = now() - db.retrievalAccessIndex.PutInBatch(batch, item) - db.pullIndex.PutInBatch(batch, item) - triggerPullFeed = true - db.gcIndex.PutInBatch(batch, item) - gcSizeChange++ - - case ModeSetSync: - // delete from push, insert to gc - - // need to get access timestamp here as it is not - // provided by the access function, and it is not - // a property of a chunk provided to Accessor.Put. - i, err := db.retrievalDataIndex.Get(item) - if err != nil { - if err == leveldb.ErrNotFound { - // chunk is not found, - // no need to update gc index - // just delete from the push index - // if it is there - db.pushIndex.DeleteInBatch(batch, item) - return nil - } - return err - } - item.StoreTimestamp = i.StoreTimestamp - - i, err = db.retrievalAccessIndex.Get(item) - switch err { - case nil: - item.AccessTimestamp = i.AccessTimestamp - db.gcIndex.DeleteInBatch(batch, item) - gcSizeChange-- - case leveldb.ErrNotFound: - // the chunk is not accessed before - default: - return err - } - item.AccessTimestamp = now() - db.retrievalAccessIndex.PutInBatch(batch, item) - db.pushIndex.DeleteInBatch(batch, item) - db.gcIndex.PutInBatch(batch, item) - gcSizeChange++ - - case modeSetRemove: - // delete from retrieve, pull, gc - - // need to get access timestamp here as it is not - // provided by the access function, and it is not - // a property of a chunk provided to Accessor.Put. - - i, err := db.retrievalAccessIndex.Get(item) - switch err { - case nil: - item.AccessTimestamp = i.AccessTimestamp - case leveldb.ErrNotFound: - default: - return err - } - i, err = db.retrievalDataIndex.Get(item) - if err != nil { - return err - } - item.StoreTimestamp = i.StoreTimestamp - - db.retrievalDataIndex.DeleteInBatch(batch, item) - db.retrievalAccessIndex.DeleteInBatch(batch, item) - db.pullIndex.DeleteInBatch(batch, item) - db.gcIndex.DeleteInBatch(batch, item) - // a check is needed for decrementing gcSize - // as delete is not reporting if the key/value pair - // is deleted or not - if _, err := db.gcIndex.Get(item); err == nil { - gcSizeChange = -1 - } - - default: - return ErrInvalidMode - } - - err = db.incGCSizeInBatch(batch, gcSizeChange) - if err != nil { - return err - } - - err = db.shed.WriteBatch(batch) - if err != nil { - return err - } - if triggerPullFeed { - db.triggerPullSubscriptions(db.po(item.Address)) - } - return nil -} diff --git a/vendor/github.com/ethereum/go-ethereum/swarm/storage/localstore/subscription_pull.go b/vendor/github.com/ethereum/go-ethereum/swarm/storage/localstore/subscription_pull.go deleted file mode 100644 index 0b96102e..00000000 --- a/vendor/github.com/ethereum/go-ethereum/swarm/storage/localstore/subscription_pull.go +++ /dev/null @@ -1,211 +0,0 @@ -// 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 localstore - -import ( - "bytes" - "context" - "errors" - "fmt" - "sync" - - "github.com/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/swarm/chunk" - "github.com/ethereum/go-ethereum/swarm/shed" - "github.com/syndtr/goleveldb/leveldb" -) - -// SubscribePull returns a channel that provides chunk addresses and stored times from pull syncing index. -// Pull syncing index can be only subscribed to a particular proximity order bin. If since -// is not nil, the iteration will start from the first item stored after that timestamp. If until is not nil, -// only chunks stored up to this timestamp will be send to the channel, and the returned channel will be -// closed. The since-until interval is open on the left and closed on the right (since,until]. Returned stop -// function will terminate current and further iterations without errors, and also close the returned channel. -// Make sure that you check the second returned parameter from the channel to stop iteration when its value -// is false. -func (db *DB) SubscribePull(ctx context.Context, bin uint8, since, until *ChunkDescriptor) (c <-chan ChunkDescriptor, stop func()) { - chunkDescriptors := make(chan ChunkDescriptor) - trigger := make(chan struct{}, 1) - - db.pullTriggersMu.Lock() - if _, ok := db.pullTriggers[bin]; !ok { - db.pullTriggers[bin] = make([]chan struct{}, 0) - } - db.pullTriggers[bin] = append(db.pullTriggers[bin], trigger) - db.pullTriggersMu.Unlock() - - // send signal for the initial iteration - trigger <- struct{}{} - - stopChan := make(chan struct{}) - var stopChanOnce sync.Once - - // used to provide information from the iterator to - // stop subscription when until chunk descriptor is reached - var errStopSubscription = errors.New("stop subscription") - - go func() { - // close the returned ChunkDescriptor channel at the end to - // signal that the subscription is done - defer close(chunkDescriptors) - // sinceItem is the Item from which the next iteration - // should start. The first iteration starts from the first Item. - var sinceItem *shed.Item - if since != nil { - sinceItem = &shed.Item{ - Address: since.Address, - StoreTimestamp: since.StoreTimestamp, - } - } - for { - select { - case <-trigger: - // iterate until: - // - last index Item is reached - // - subscription stop is called - // - context is done - err := db.pullIndex.Iterate(func(item shed.Item) (stop bool, err error) { - select { - case chunkDescriptors <- ChunkDescriptor{ - Address: item.Address, - StoreTimestamp: item.StoreTimestamp, - }: - // until chunk descriptor is sent - // break the iteration - if until != nil && - (item.StoreTimestamp >= until.StoreTimestamp || - bytes.Equal(item.Address, until.Address)) { - return true, errStopSubscription - } - // set next iteration start item - // when its chunk is successfully sent to channel - sinceItem = &item - return false, nil - case <-stopChan: - // gracefully stop the iteration - // on stop - return true, nil - case <-db.close: - // gracefully stop the iteration - // on database close - return true, nil - case <-ctx.Done(): - return true, ctx.Err() - } - }, &shed.IterateOptions{ - StartFrom: sinceItem, - // sinceItem was sent as the last Address in the previous - // iterator call, skip it in this one - SkipStartFromItem: true, - Prefix: []byte{bin}, - }) - if err != nil { - if err == errStopSubscription { - // stop subscription without any errors - // if until is reached - return - } - log.Error("localstore pull subscription iteration", "bin", bin, "since", since, "until", until, "err", err) - return - } - case <-stopChan: - // terminate the subscription - // on stop - return - case <-db.close: - // terminate the subscription - // on database close - return - case <-ctx.Done(): - err := ctx.Err() - if err != nil { - log.Error("localstore pull subscription", "bin", bin, "since", since, "until", until, "err", err) - } - return - } - } - }() - - stop = func() { - stopChanOnce.Do(func() { - close(stopChan) - }) - - db.pullTriggersMu.Lock() - defer db.pullTriggersMu.Unlock() - - for i, t := range db.pullTriggers[bin] { - if t == trigger { - db.pullTriggers[bin] = append(db.pullTriggers[bin][:i], db.pullTriggers[bin][i+1:]...) - break - } - } - } - - return chunkDescriptors, stop -} - -// LastPullSubscriptionChunk returns ChunkDescriptor of the latest Chunk -// in pull syncing index for a provided bin. If there are no chunks in -// that bin, chunk.ErrChunkNotFound is returned. -func (db *DB) LastPullSubscriptionChunk(bin uint8) (c *ChunkDescriptor, err error) { - item, err := db.pullIndex.Last([]byte{bin}) - if err != nil { - if err == leveldb.ErrNotFound { - return nil, chunk.ErrChunkNotFound - } - return nil, err - } - return &ChunkDescriptor{ - Address: item.Address, - StoreTimestamp: item.StoreTimestamp, - }, nil -} - -// ChunkDescriptor holds information required for Pull syncing. This struct -// is provided by subscribing to pull index. -type ChunkDescriptor struct { - Address chunk.Address - StoreTimestamp int64 -} - -func (c *ChunkDescriptor) String() string { - if c == nil { - return "none" - } - return fmt.Sprintf("%s stored at %v", c.Address.Hex(), c.StoreTimestamp) -} - -// triggerPullSubscriptions is used internally for starting iterations -// on Pull subscriptions for a particular bin. When new item with address -// that is in particular bin for DB's baseKey is added to pull index -// this function should be called. -func (db *DB) triggerPullSubscriptions(bin uint8) { - db.pullTriggersMu.RLock() - triggers, ok := db.pullTriggers[bin] - db.pullTriggersMu.RUnlock() - if !ok { - return - } - - for _, t := range triggers { - select { - case t <- struct{}{}: - default: - } - } -} diff --git a/vendor/github.com/ethereum/go-ethereum/swarm/storage/localstore/subscription_push.go b/vendor/github.com/ethereum/go-ethereum/swarm/storage/localstore/subscription_push.go deleted file mode 100644 index 5cbc2eb6..00000000 --- a/vendor/github.com/ethereum/go-ethereum/swarm/storage/localstore/subscription_push.go +++ /dev/null @@ -1,145 +0,0 @@ -// 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 localstore - -import ( - "context" - "sync" - - "github.com/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/swarm/chunk" - "github.com/ethereum/go-ethereum/swarm/shed" -) - -// SubscribePush returns a channel that provides storage chunks with ordering from push syncing index. -// Returned stop function will terminate current and further iterations, and also it will close -// the returned channel without any errors. Make sure that you check the second returned parameter -// from the channel to stop iteration when its value is false. -func (db *DB) SubscribePush(ctx context.Context) (c <-chan chunk.Chunk, stop func()) { - chunks := make(chan chunk.Chunk) - trigger := make(chan struct{}, 1) - - db.pushTriggersMu.Lock() - db.pushTriggers = append(db.pushTriggers, trigger) - db.pushTriggersMu.Unlock() - - // send signal for the initial iteration - trigger <- struct{}{} - - stopChan := make(chan struct{}) - var stopChanOnce sync.Once - - go func() { - // close the returned chunkInfo channel at the end to - // signal that the subscription is done - defer close(chunks) - // sinceItem is the Item from which the next iteration - // should start. The first iteration starts from the first Item. - var sinceItem *shed.Item - for { - select { - case <-trigger: - // iterate until: - // - last index Item is reached - // - subscription stop is called - // - context is done - err := db.pushIndex.Iterate(func(item shed.Item) (stop bool, err error) { - // get chunk data - dataItem, err := db.retrievalDataIndex.Get(item) - if err != nil { - return true, err - } - - select { - case chunks <- chunk.NewChunk(dataItem.Address, dataItem.Data): - // set next iteration start item - // when its chunk is successfully sent to channel - sinceItem = &item - return false, nil - case <-stopChan: - // gracefully stop the iteration - // on stop - return true, nil - case <-db.close: - // gracefully stop the iteration - // on database close - return true, nil - case <-ctx.Done(): - return true, ctx.Err() - } - }, &shed.IterateOptions{ - StartFrom: sinceItem, - // sinceItem was sent as the last Address in the previous - // iterator call, skip it in this one - SkipStartFromItem: true, - }) - if err != nil { - log.Error("localstore push subscription iteration", "err", err) - return - } - case <-stopChan: - // terminate the subscription - // on stop - return - case <-db.close: - // terminate the subscription - // on database close - return - case <-ctx.Done(): - err := ctx.Err() - if err != nil { - log.Error("localstore push subscription", "err", err) - } - return - } - } - }() - - stop = func() { - stopChanOnce.Do(func() { - close(stopChan) - }) - - db.pushTriggersMu.Lock() - defer db.pushTriggersMu.Unlock() - - for i, t := range db.pushTriggers { - if t == trigger { - db.pushTriggers = append(db.pushTriggers[:i], db.pushTriggers[i+1:]...) - break - } - } - } - - return chunks, stop -} - -// triggerPushSubscriptions is used internally for starting iterations -// on Push subscriptions. Whenever new item is added to the push index, -// this function should be called. -func (db *DB) triggerPushSubscriptions() { - db.pushTriggersMu.RLock() - triggers := db.pushTriggers - db.pushTriggersMu.RUnlock() - - for _, t := range triggers { - select { - case t <- struct{}{}: - default: - } - } -} diff --git a/vendor/github.com/ethereum/go-ethereum/swarm/storage/memstore.go b/vendor/github.com/ethereum/go-ethereum/swarm/storage/memstore.go deleted file mode 100644 index 611ac3bc..00000000 --- a/vendor/github.com/ethereum/go-ethereum/swarm/storage/memstore.go +++ /dev/null @@ -1,92 +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, - } -} - -// Has needed to implement SyncChunkStore -func (m *MemStore) Has(_ context.Context, addr Address) bool { - return m.cache.Contains(addr) -} - -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/vendor/github.com/ethereum/go-ethereum/swarm/storage/mock/db/db.go b/vendor/github.com/ethereum/go-ethereum/swarm/storage/mock/db/db.go deleted file mode 100644 index 313a61b4..00000000 --- a/vendor/github.com/ethereum/go-ethereum/swarm/storage/mock/db/db.go +++ /dev/null @@ -1,476 +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" - "errors" - "fmt" - "io" - "io/ioutil" - "sync" - "time" - - "github.com/syndtr/goleveldb/leveldb" - "github.com/syndtr/goleveldb/leveldb/util" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/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 - // protects nodes and keys indexes - // in Put and Delete methods - nodesLocks sync.Map - keysLocks sync.Map -} - -// 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(indexForHashesPerNode(addr, key), nil) - if err != nil { - return nil, mock.ErrNotFound - } - if !has { - return nil, mock.ErrNotFound - } - data, err = s.db.Get(indexDataKey(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 { - unlock, err := s.lock(addr, key) - if err != nil { - return err - } - defer unlock() - - batch := new(leveldb.Batch) - batch.Put(indexForHashesPerNode(addr, key), nil) - batch.Put(indexForNodesWithHash(key, addr), nil) - batch.Put(indexForNodes(addr), nil) - batch.Put(indexForHashes(key), nil) - batch.Put(indexDataKey(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 { - unlock, err := s.lock(addr, key) - if err != nil { - return err - } - defer unlock() - - batch := new(leveldb.Batch) - batch.Delete(indexForHashesPerNode(addr, key)) - batch.Delete(indexForNodesWithHash(key, addr)) - - // check if this node contains any keys, and if not - // remove it from the - x := indexForHashesPerNodePrefix(addr) - if k, _ := s.db.Get(x, nil); !bytes.HasPrefix(k, x) { - batch.Delete(indexForNodes(addr)) - } - - x = indexForNodesWithHashPrefix(key) - if k, _ := s.db.Get(x, nil); !bytes.HasPrefix(k, x) { - batch.Delete(indexForHashes(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(indexForHashesPerNode(addr, key), nil) - if err != nil { - has = false - } - return has -} - -// Keys returns a paginated list of keys on all nodes. -func (s *GlobalStore) Keys(startKey []byte, limit int) (keys mock.Keys, err error) { - return s.keys(nil, startKey, limit) -} - -// Nodes returns a paginated list of all known nodes. -func (s *GlobalStore) Nodes(startAddr *common.Address, limit int) (nodes mock.Nodes, err error) { - return s.nodes(nil, startAddr, limit) -} - -// NodeKeys returns a paginated list of keys on a node with provided address. -func (s *GlobalStore) NodeKeys(addr common.Address, startKey []byte, limit int) (keys mock.Keys, err error) { - return s.keys(&addr, startKey, limit) -} - -// KeyNodes returns a paginated list of nodes that contain a particular key. -func (s *GlobalStore) KeyNodes(key []byte, startAddr *common.Address, limit int) (nodes mock.Nodes, err error) { - return s.nodes(key, startAddr, limit) -} - -// keys returns a paginated list of keys. If addr is not nil, only keys on that -// node will be returned. -func (s *GlobalStore) keys(addr *common.Address, startKey []byte, limit int) (keys mock.Keys, err error) { - iter := s.db.NewIterator(nil, nil) - defer iter.Release() - - if limit <= 0 { - limit = mock.DefaultLimit - } - - prefix := []byte{indexForHashesPrefix} - if addr != nil { - prefix = indexForHashesPerNodePrefix(*addr) - } - if startKey != nil { - if addr != nil { - startKey = indexForHashesPerNode(*addr, startKey) - } else { - startKey = indexForHashes(startKey) - } - } else { - startKey = prefix - } - - ok := iter.Seek(startKey) - if !ok { - return keys, iter.Error() - } - for ; ok; ok = iter.Next() { - k := iter.Key() - if !bytes.HasPrefix(k, prefix) { - break - } - key := append([]byte(nil), bytes.TrimPrefix(k, prefix)...) - - if len(keys.Keys) >= limit { - keys.Next = key - break - } - - keys.Keys = append(keys.Keys, key) - } - return keys, iter.Error() -} - -// nodes returns a paginated list of node addresses. If key is not nil, -// only nodes that contain that key will be returned. -func (s *GlobalStore) nodes(key []byte, startAddr *common.Address, limit int) (nodes mock.Nodes, err error) { - iter := s.db.NewIterator(nil, nil) - defer iter.Release() - - if limit <= 0 { - limit = mock.DefaultLimit - } - - prefix := []byte{indexForNodesPrefix} - if key != nil { - prefix = indexForNodesWithHashPrefix(key) - } - startKey := prefix - if startAddr != nil { - if key != nil { - startKey = indexForNodesWithHash(key, *startAddr) - } else { - startKey = indexForNodes(*startAddr) - } - } - - ok := iter.Seek(startKey) - if !ok { - return nodes, iter.Error() - } - for ; ok; ok = iter.Next() { - k := iter.Key() - if !bytes.HasPrefix(k, prefix) { - break - } - addr := common.BytesToAddress(append([]byte(nil), bytes.TrimPrefix(k, prefix)...)) - - if len(nodes.Addrs) >= limit { - nodes.Next = &addr - break - } - - nodes.Addrs = append(nodes.Addrs, addr) - } - return nodes, iter.Error() -} - -// 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 - } - - key := common.Hex2Bytes(hdr.Name) - - batch := new(leveldb.Batch) - for _, addr := range c.Addrs { - batch.Put(indexForHashesPerNode(addr, key), nil) - batch.Put(indexForNodesWithHash(key, addr), nil) - batch.Put(indexForNodes(addr), nil) - } - - batch.Put(indexForHashes(key), nil) - batch.Put(indexDataKey(key), 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) - - snap, err := s.db.GetSnapshot() - if err != nil { - return 0, err - } - - iter := snap.NewIterator(util.BytesPrefix([]byte{indexForHashesByNodePrefix}), nil) - defer iter.Release() - - var currentKey string - var addrs []common.Address - - saveChunk := func() error { - hexKey := currentKey - - data, err := snap.Get(indexDataKey(common.Hex2Bytes(hexKey)), nil) - if err != nil { - return fmt.Errorf("get data %s: %v", hexKey, 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(), []byte{indexForHashesByNodePrefix}) - i := bytes.Index(k, []byte{keyTermByte}) - if i < 0 { - continue - } - hexKey := string(k[:i]) - - if currentKey == "" { - currentKey = hexKey - } - - if hexKey != currentKey { - if err = saveChunk(); err != nil { - return n, err - } - - addrs = addrs[:0] - } - - currentKey = hexKey - addrs = append(addrs, common.BytesToAddress(k[i+1:])) - } - - if len(addrs) > 0 { - if err = saveChunk(); err != nil { - return n, err - } - } - - return n, iter.Error() -} - -var ( - // maximal time for lock to wait until it returns error - lockTimeout = 3 * time.Second - // duration between two lock checks. - lockCheckDelay = 30 * time.Microsecond - // error returned by lock method when lock timeout is reached - errLockTimeout = errors.New("lock timeout") -) - -// lock protects parallel writes in Put and Delete methods for both -// node with provided address and for data with provided key. -func (s *GlobalStore) lock(addr common.Address, key []byte) (unlock func(), err error) { - start := time.Now() - nodeLockKey := addr.Hex() - for { - _, loaded := s.nodesLocks.LoadOrStore(nodeLockKey, struct{}{}) - if !loaded { - break - } - time.Sleep(lockCheckDelay) - if time.Since(start) > lockTimeout { - return nil, errLockTimeout - } - } - start = time.Now() - keyLockKey := common.Bytes2Hex(key) - for { - _, loaded := s.keysLocks.LoadOrStore(keyLockKey, struct{}{}) - if !loaded { - break - } - time.Sleep(lockCheckDelay) - if time.Since(start) > lockTimeout { - return nil, errLockTimeout - } - } - return func() { - s.nodesLocks.Delete(nodeLockKey) - s.keysLocks.Delete(keyLockKey) - }, nil -} - -const ( - // prefixes for different indexes - indexDataPrefix = 0 - indexForNodesWithHashesPrefix = 1 - indexForHashesByNodePrefix = 2 - indexForNodesPrefix = 3 - indexForHashesPrefix = 4 - - // keyTermByte splits keys and node addresses - // in database keys - keyTermByte = 0xff -) - -// indexForHashesPerNode constructs a database key to store keys used in -// NodeKeys method. -func indexForHashesPerNode(addr common.Address, key []byte) []byte { - return append(indexForHashesPerNodePrefix(addr), key...) -} - -// indexForHashesPerNodePrefix returns a prefix containing a node address used in -// NodeKeys method. Node address is hex encoded to be able to use keyTermByte -// for splitting node address and key. -func indexForHashesPerNodePrefix(addr common.Address) []byte { - return append([]byte{indexForNodesWithHashesPrefix}, append([]byte(addr.Hex()), keyTermByte)...) -} - -// indexForNodesWithHash constructs a database key to store keys used in -// KeyNodes method. -func indexForNodesWithHash(key []byte, addr common.Address) []byte { - return append(indexForNodesWithHashPrefix(key), addr[:]...) -} - -// indexForNodesWithHashPrefix returns a prefix containing a key used in -// KeyNodes method. Key is hex encoded to be able to use keyTermByte -// for splitting key and node address. -func indexForNodesWithHashPrefix(key []byte) []byte { - return append([]byte{indexForHashesByNodePrefix}, append([]byte(common.Bytes2Hex(key)), keyTermByte)...) -} - -// indexForNodes constructs a database key to store keys used in -// Nodes method. -func indexForNodes(addr common.Address) []byte { - return append([]byte{indexForNodesPrefix}, addr[:]...) -} - -// indexForHashes constructs a database key to store keys used in -// Keys method. -func indexForHashes(key []byte) []byte { - return append([]byte{indexForHashesPrefix}, key...) -} - -// indexDataKey constructs a database key for key/data storage. -func indexDataKey(key []byte) []byte { - return append([]byte{indexDataPrefix}, key...) -} diff --git a/vendor/github.com/ethereum/go-ethereum/swarm/storage/mock/explorer/explorer.go b/vendor/github.com/ethereum/go-ethereum/swarm/storage/mock/explorer/explorer.go deleted file mode 100644 index 8fffff8f..00000000 --- a/vendor/github.com/ethereum/go-ethereum/swarm/storage/mock/explorer/explorer.go +++ /dev/null @@ -1,257 +0,0 @@ -// 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 explorer - -import ( - "bytes" - "encoding/json" - "io" - "net/http" - "net/url" - "strconv" - "strings" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/swarm/log" - "github.com/ethereum/go-ethereum/swarm/storage/mock" - "github.com/rs/cors" -) - -const jsonContentType = "application/json; charset=utf-8" - -// NewHandler constructs an http.Handler with router -// that servers requests required by chunk explorer. -// -// /api/has-key/{node}/{key} -// /api/keys?start={key}&node={node}&limit={int[0..1000]} -// /api/nodes?start={node}&key={key}&limit={int[0..1000]} -// -// Data from global store will be served and appropriate -// CORS headers will be sent if allowed origins are provided. -func NewHandler(store mock.GlobalStorer, corsOrigins []string) (handler http.Handler) { - mux := http.NewServeMux() - mux.Handle("/api/has-key/", newHasKeyHandler(store)) - mux.Handle("/api/keys", newKeysHandler(store)) - mux.Handle("/api/nodes", newNodesHandler(store)) - mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { - jsonStatusResponse(w, http.StatusNotFound) - }) - handler = noCacheHandler(mux) - if corsOrigins != nil { - handler = cors.New(cors.Options{ - AllowedOrigins: corsOrigins, - AllowedMethods: []string{"GET"}, - MaxAge: 600, - }).Handler(handler) - } - return handler -} - -// newHasKeyHandler returns a new handler that serves -// requests for HasKey global store method. -// Possible responses are StatusResponse with -// status codes 200 or 404 if the chunk is found or not. -func newHasKeyHandler(store mock.GlobalStorer) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - addr, key, ok := parseHasKeyPath(r.URL.Path) - if !ok { - jsonStatusResponse(w, http.StatusNotFound) - return - } - found := store.HasKey(addr, key) - if !found { - jsonStatusResponse(w, http.StatusNotFound) - return - } - jsonStatusResponse(w, http.StatusOK) - } -} - -// KeysResponse is a JSON-encoded response for global store -// Keys and NodeKeys methods. -type KeysResponse struct { - Keys []string `json:"keys"` - Next string `json:"next,omitempty"` -} - -// newKeysHandler returns a new handler that serves -// requests for Key global store method. -// HTTP response body will be JSON-encoded KeysResponse. -func newKeysHandler(store mock.GlobalStorer) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - q := r.URL.Query() - node := q.Get("node") - start, limit := listingPage(q) - - var keys mock.Keys - if node == "" { - var err error - keys, err = store.Keys(common.Hex2Bytes(start), limit) - if err != nil { - log.Error("chunk explorer: keys handler: get keys", "start", start, "err", err) - jsonStatusResponse(w, http.StatusInternalServerError) - return - } - } else { - var err error - keys, err = store.NodeKeys(common.HexToAddress(node), common.Hex2Bytes(start), limit) - if err != nil { - log.Error("chunk explorer: keys handler: get node keys", "node", node, "start", start, "err", err) - jsonStatusResponse(w, http.StatusInternalServerError) - return - } - } - ks := make([]string, len(keys.Keys)) - for i, k := range keys.Keys { - ks[i] = common.Bytes2Hex(k) - } - data, err := json.Marshal(KeysResponse{ - Keys: ks, - Next: common.Bytes2Hex(keys.Next), - }) - if err != nil { - log.Error("chunk explorer: keys handler: json marshal", "err", err) - jsonStatusResponse(w, http.StatusInternalServerError) - return - } - w.Header().Set("Content-Type", jsonContentType) - _, err = io.Copy(w, bytes.NewReader(data)) - if err != nil { - log.Error("chunk explorer: keys handler: write response", "err", err) - } - } -} - -// NodesResponse is a JSON-encoded response for global store -// Nodes and KeyNodes methods. -type NodesResponse struct { - Nodes []string `json:"nodes"` - Next string `json:"next,omitempty"` -} - -// newNodesHandler returns a new handler that serves -// requests for Nodes global store method. -// HTTP response body will be JSON-encoded NodesResponse. -func newNodesHandler(store mock.GlobalStorer) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - q := r.URL.Query() - key := q.Get("key") - var start *common.Address - queryStart, limit := listingPage(q) - if queryStart != "" { - s := common.HexToAddress(queryStart) - start = &s - } - - var nodes mock.Nodes - if key == "" { - var err error - nodes, err = store.Nodes(start, limit) - if err != nil { - log.Error("chunk explorer: nodes handler: get nodes", "start", queryStart, "err", err) - jsonStatusResponse(w, http.StatusInternalServerError) - return - } - } else { - var err error - nodes, err = store.KeyNodes(common.Hex2Bytes(key), start, limit) - if err != nil { - log.Error("chunk explorer: nodes handler: get key nodes", "key", key, "start", queryStart, "err", err) - jsonStatusResponse(w, http.StatusInternalServerError) - return - } - } - ns := make([]string, len(nodes.Addrs)) - for i, n := range nodes.Addrs { - ns[i] = n.Hex() - } - var next string - if nodes.Next != nil { - next = nodes.Next.Hex() - } - data, err := json.Marshal(NodesResponse{ - Nodes: ns, - Next: next, - }) - if err != nil { - log.Error("chunk explorer: nodes handler", "err", err) - jsonStatusResponse(w, http.StatusInternalServerError) - return - } - w.Header().Set("Content-Type", jsonContentType) - _, err = io.Copy(w, bytes.NewReader(data)) - if err != nil { - log.Error("chunk explorer: nodes handler: write response", "err", err) - } - } -} - -// parseHasKeyPath extracts address and key from HTTP request -// path for HasKey route: /api/has-key/{node}/{key}. -// If ok is false, the provided path is not matched. -func parseHasKeyPath(p string) (addr common.Address, key []byte, ok bool) { - p = strings.TrimPrefix(p, "/api/has-key/") - parts := strings.SplitN(p, "/", 2) - if len(parts) != 2 || parts[0] == "" || parts[1] == "" { - return addr, nil, false - } - addr = common.HexToAddress(parts[0]) - key = common.Hex2Bytes(parts[1]) - return addr, key, true -} - -// listingPage returns start value and listing limit -// from url query values. -func listingPage(q url.Values) (start string, limit int) { - // if limit is not a valid integer (or blank string), - // ignore the error and use the returned 0 value - limit, _ = strconv.Atoi(q.Get("limit")) - return q.Get("start"), limit -} - -// StatusResponse is a standardized JSON-encoded response -// that contains information about HTTP response code -// for easier status identification. -type StatusResponse struct { - Message string `json:"message"` - Code int `json:"code"` -} - -// jsonStatusResponse writes to the response writer -// JSON-encoded StatusResponse based on the provided status code. -func jsonStatusResponse(w http.ResponseWriter, code int) { - w.Header().Set("Content-Type", jsonContentType) - w.WriteHeader(code) - err := json.NewEncoder(w).Encode(StatusResponse{ - Message: http.StatusText(code), - Code: code, - }) - if err != nil { - log.Error("chunk explorer: json status response", "err", err) - } -} - -// noCacheHandler sets required HTTP headers to prevent -// response caching at the client side. -func noCacheHandler(h http.Handler) http.Handler { - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Cache-Control", "no-cache, no-store, must-revalidate") - w.Header().Set("Pragma", "no-cache") - w.Header().Set("Expires", "0") - h.ServeHTTP(w, r) - }) -} diff --git a/vendor/github.com/ethereum/go-ethereum/swarm/storage/mock/explorer/swagger.yaml b/vendor/github.com/ethereum/go-ethereum/swarm/storage/mock/explorer/swagger.yaml deleted file mode 100644 index 2c014e92..00000000 --- a/vendor/github.com/ethereum/go-ethereum/swarm/storage/mock/explorer/swagger.yaml +++ /dev/null @@ -1,176 +0,0 @@ -swagger: '2.0' -info: - title: Swarm Global Store API - version: 0.1.0 -tags: - - name: Has Key - description: Checks if a Key is stored on a Node - - name: Keys - description: Lists Keys - - name: Nodes - description: Lists Node addresses - -paths: - '/api/has-key/{node}/{key}': - get: - tags: - - Has Key - summary: Checks if a Key is stored on a Node - operationId: hasKey - produces: - - application/json - - parameters: - - name: node - in: path - required: true - type: string - format: hex-endoded - description: Node address. - - - name: key - in: path - required: true - type: string - format: hex-endoded - description: Key. - - responses: - '200': - description: Key is stored on Node - schema: - $ref: '#/definitions/Status' - '404': - description: Key is not stored on Node - schema: - $ref: '#/definitions/Status' - '500': - description: Internal Server Error - schema: - $ref: '#/definitions/Status' - - '/api/keys': - get: - tags: - - Keys - summary: Lists Keys - operationId: keys - produces: - - application/json - - parameters: - - name: start - in: query - required: false - type: string - format: hex-encoded Key - description: A Key as the starting point for the returned list. It is usually a value from the returned "next" field in the Keys repsonse. - - - name: limit - in: query - required: false - type: integer - default: 100 - minimum: 1 - maximum: 1000 - description: Limits the number of Keys returned in on response. - - - name: node - in: query - required: false - type: string - format: hex-encoded Node address - description: If this parameter is provided, only Keys that are stored on this Node be returned in the response. If not, all known Keys will be returned. - - responses: - '200': - description: List of Keys - schema: - $ref: '#/definitions/Keys' - '500': - description: Internal Server Error - schema: - $ref: '#/definitions/Status' - - '/api/nodes': - get: - tags: - - Nodes - summary: Lists Node addresses - operationId: nodes - produces: - - application/json - - parameters: - - name: start - in: query - required: false - type: string - format: hex-encoded Node address - description: A Node address as the starting point for the returned list. It is usually a value from the returned "next" field in the Nodes repsonse. - - - name: limit - in: query - required: false - type: integer - default: 100 - minimum: 1 - maximum: 1000 - description: Limits the number of Node addresses returned in on response. - - - name: key - in: query - required: false - type: string - format: hex-encoded Key - description: If this parameter is provided, only addresses of Nodes that store this Key will be returned in the response. If not, all known Node addresses will be returned. - - responses: - '200': - description: List of Node addresses - schema: - $ref: '#/definitions/Nodes' - '500': - description: Internal Server Error - schema: - $ref: '#/definitions/Status' - -definitions: - - Status: - type: object - properties: - message: - type: string - description: HTTP Status Code name. - code: - type: integer - description: HTTP Status Code. - - Keys: - type: object - properties: - keys: - type: array - description: A list of Keys. - items: - type: string - format: hex-encoded Key - next: - type: string - format: hex-encoded Key - description: If present, the next Key in listing. Can be passed as "start" query parameter to continue the listing. If not present, the end of the listing is reached. - - Nodes: - type: object - properties: - nodes: - type: array - description: A list of Node addresses. - items: - type: string - format: hex-encoded Node address - next: - type: string - format: hex-encoded Node address - description: If present, the next Node address in listing. Can be passed as "start" query parameter to continue the listing. If not present, the end of the listing is reached. diff --git a/vendor/github.com/ethereum/go-ethereum/swarm/storage/mock/mem/mem.go b/vendor/github.com/ethereum/go-ethereum/swarm/storage/mock/mem/mem.go deleted file mode 100644 index 38bf098d..00000000 --- a/vendor/github.com/ethereum/go-ethereum/swarm/storage/mock/mem/mem.go +++ /dev/null @@ -1,385 +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" - "sort" - "sync" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/swarm/storage/mock" -) - -// GlobalStore stores all chunk data and also keys and node addresses relations. -// It implements mock.GlobalStore interface. -type GlobalStore struct { - // holds a slice of keys per node - nodeKeys map[common.Address][][]byte - // holds which key is stored on which nodes - keyNodes map[string][]common.Address - // all node addresses - nodes []common.Address - // all keys - keys [][]byte - // all keys data - data map[string][]byte - mu sync.RWMutex -} - -// NewGlobalStore creates a new instance of GlobalStore. -func NewGlobalStore() *GlobalStore { - return &GlobalStore{ - nodeKeys: make(map[common.Address][][]byte), - keyNodes: make(map[string][]common.Address), - nodes: make([]common.Address, 0), - keys: make([][]byte, 0), - 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.RLock() - defer s.mu.RUnlock() - - if _, has := s.nodeKeyIndex(addr, key); !has { - 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 i, found := s.nodeKeyIndex(addr, key); !found { - s.nodeKeys[addr] = append(s.nodeKeys[addr], nil) - copy(s.nodeKeys[addr][i+1:], s.nodeKeys[addr][i:]) - s.nodeKeys[addr][i] = key - } - - if i, found := s.keyNodeIndex(key, addr); !found { - k := string(key) - s.keyNodes[k] = append(s.keyNodes[k], addr) - copy(s.keyNodes[k][i+1:], s.keyNodes[k][i:]) - s.keyNodes[k][i] = addr - } - - if i, found := s.nodeIndex(addr); !found { - s.nodes = append(s.nodes, addr) - copy(s.nodes[i+1:], s.nodes[i:]) - s.nodes[i] = addr - } - - if i, found := s.keyIndex(key); !found { - s.keys = append(s.keys, nil) - copy(s.keys[i+1:], s.keys[i:]) - s.keys[i] = key - } - - 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() - - if i, has := s.nodeKeyIndex(addr, key); has { - s.nodeKeys[addr] = append(s.nodeKeys[addr][:i], s.nodeKeys[addr][i+1:]...) - } - - k := string(key) - if i, on := s.keyNodeIndex(key, addr); on { - s.keyNodes[k] = append(s.keyNodes[k][:i], s.keyNodes[k][i+1:]...) - } - - if len(s.nodeKeys[addr]) == 0 { - if i, found := s.nodeIndex(addr); found { - s.nodes = append(s.nodes[:i], s.nodes[i+1:]...) - } - } - - if len(s.keyNodes[k]) == 0 { - if i, found := s.keyIndex(key); found { - s.keys = append(s.keys[:i], s.keys[i+1:]...) - } - } - return nil -} - -// HasKey returns whether a node with addr contains the key. -func (s *GlobalStore) HasKey(addr common.Address, key []byte) (yes bool) { - s.mu.RLock() - defer s.mu.RUnlock() - - _, yes = s.nodeKeyIndex(addr, key) - return yes -} - -// keyIndex returns the index of a key in keys slice. -func (s *GlobalStore) keyIndex(key []byte) (index int, found bool) { - l := len(s.keys) - index = sort.Search(l, func(i int) bool { - return bytes.Compare(s.keys[i], key) >= 0 - }) - found = index < l && bytes.Equal(s.keys[index], key) - return index, found -} - -// nodeIndex returns the index of a node address in nodes slice. -func (s *GlobalStore) nodeIndex(addr common.Address) (index int, found bool) { - l := len(s.nodes) - index = sort.Search(l, func(i int) bool { - return bytes.Compare(s.nodes[i][:], addr[:]) >= 0 - }) - found = index < l && bytes.Equal(s.nodes[index][:], addr[:]) - return index, found -} - -// nodeKeyIndex returns the index of a key in nodeKeys slice. -func (s *GlobalStore) nodeKeyIndex(addr common.Address, key []byte) (index int, found bool) { - l := len(s.nodeKeys[addr]) - index = sort.Search(l, func(i int) bool { - return bytes.Compare(s.nodeKeys[addr][i], key) >= 0 - }) - found = index < l && bytes.Equal(s.nodeKeys[addr][index], key) - return index, found -} - -// keyNodeIndex returns the index of a node address in keyNodes slice. -func (s *GlobalStore) keyNodeIndex(key []byte, addr common.Address) (index int, found bool) { - k := string(key) - l := len(s.keyNodes[k]) - index = sort.Search(l, func(i int) bool { - return bytes.Compare(s.keyNodes[k][i][:], addr[:]) >= 0 - }) - found = index < l && s.keyNodes[k][index] == addr - return index, found -} - -// Keys returns a paginated list of keys on all nodes. -func (s *GlobalStore) Keys(startKey []byte, limit int) (keys mock.Keys, err error) { - s.mu.RLock() - defer s.mu.RUnlock() - - var i int - if startKey != nil { - i, _ = s.keyIndex(startKey) - } - total := len(s.keys) - max := maxIndex(i, limit, total) - keys.Keys = make([][]byte, 0, max-i) - for ; i < max; i++ { - keys.Keys = append(keys.Keys, append([]byte(nil), s.keys[i]...)) - } - if total > max { - keys.Next = s.keys[max] - } - return keys, nil -} - -// Nodes returns a paginated list of all known nodes. -func (s *GlobalStore) Nodes(startAddr *common.Address, limit int) (nodes mock.Nodes, err error) { - s.mu.RLock() - defer s.mu.RUnlock() - - var i int - if startAddr != nil { - i, _ = s.nodeIndex(*startAddr) - } - total := len(s.nodes) - max := maxIndex(i, limit, total) - nodes.Addrs = make([]common.Address, 0, max-i) - for ; i < max; i++ { - nodes.Addrs = append(nodes.Addrs, s.nodes[i]) - } - if total > max { - nodes.Next = &s.nodes[max] - } - return nodes, nil -} - -// NodeKeys returns a paginated list of keys on a node with provided address. -func (s *GlobalStore) NodeKeys(addr common.Address, startKey []byte, limit int) (keys mock.Keys, err error) { - s.mu.RLock() - defer s.mu.RUnlock() - - var i int - if startKey != nil { - i, _ = s.nodeKeyIndex(addr, startKey) - } - total := len(s.nodeKeys[addr]) - max := maxIndex(i, limit, total) - keys.Keys = make([][]byte, 0, max-i) - for ; i < max; i++ { - keys.Keys = append(keys.Keys, append([]byte(nil), s.nodeKeys[addr][i]...)) - } - if total > max { - keys.Next = s.nodeKeys[addr][max] - } - return keys, nil -} - -// KeyNodes returns a paginated list of nodes that contain a particular key. -func (s *GlobalStore) KeyNodes(key []byte, startAddr *common.Address, limit int) (nodes mock.Nodes, err error) { - s.mu.RLock() - defer s.mu.RUnlock() - - var i int - if startAddr != nil { - i, _ = s.keyNodeIndex(key, *startAddr) - } - total := len(s.keyNodes[string(key)]) - max := maxIndex(i, limit, total) - nodes.Addrs = make([]common.Address, 0, max-i) - for ; i < max; i++ { - nodes.Addrs = append(nodes.Addrs, s.keyNodes[string(key)][i]) - } - if total > max { - nodes.Next = &s.keyNodes[string(key)][max] - } - return nodes, nil -} - -// maxIndex returns the end index for one page listing -// based on the start index, limit and total number of elements. -func maxIndex(start, limit, total int) (max int) { - if limit <= 0 { - limit = mock.DefaultLimit - } - if limit > mock.MaxLimit { - limit = mock.MaxLimit - } - max = total - if start+limit < max { - max = start + limit - } - return max -} - -// 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 - } - - key := common.Hex2Bytes(hdr.Name) - s.keyNodes[string(key)] = c.Addrs - for _, addr := range c.Addrs { - if i, has := s.nodeKeyIndex(addr, key); !has { - s.nodeKeys[addr] = append(s.nodeKeys[addr], nil) - copy(s.nodeKeys[addr][i+1:], s.nodeKeys[addr][i:]) - s.nodeKeys[addr][i] = key - } - if i, found := s.nodeIndex(addr); !found { - s.nodes = append(s.nodes, addr) - copy(s.nodes[i+1:], s.nodes[i:]) - s.nodes[i] = addr - } - } - if i, found := s.keyIndex(key); !found { - s.keys = append(s.keys, nil) - copy(s.keys[i+1:], s.keys[i:]) - s.keys[i] = key - } - s.data[string(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.RLock() - defer s.mu.RUnlock() - - tw := tar.NewWriter(w) - defer tw.Close() - - buf := bytes.NewBuffer(make([]byte, 0, 1024)) - encoder := json.NewEncoder(buf) - for key, addrs := range s.keyNodes { - buf.Reset() - if err = encoder.Encode(mock.ExportedChunk{ - Addrs: addrs, - 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/vendor/github.com/ethereum/go-ethereum/swarm/storage/mock/mock.go b/vendor/github.com/ethereum/go-ethereum/swarm/storage/mock/mock.go deleted file mode 100644 index 586112a9..00000000 --- a/vendor/github.com/ethereum/go-ethereum/swarm/storage/mock/mock.go +++ /dev/null @@ -1,142 +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/ethereum/go-ethereum/common" -) - -const ( - // DefaultLimit should be used as default limit for - // Keys, Nodes, NodeKeys and KeyNodes GlobarStorer - // methids implementations. - DefaultLimit = 100 - // MaxLimit should be used as the maximal returned number - // of items for Keys, Nodes, NodeKeys and KeyNodes GlobarStorer - // methids implementations, regardless of provided limit. - MaxLimit = 1000 -) - -// 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) -} - -func (n *NodeStore) Keys(startKey []byte, limit int) (keys Keys, err error) { - return n.store.NodeKeys(n.addr, startKey, limit) -} - -// 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 - Keys(startKey []byte, limit int) (keys Keys, err error) - Nodes(startAddr *common.Address, limit int) (nodes Nodes, err error) - NodeKeys(addr common.Address, startKey []byte, limit int) (keys Keys, err error) - KeyNodes(key []byte, startAddr *common.Address, limit int) (nodes Nodes, err error) - // NewNodeStore creates an instance of NodeStore - // to be used by a single swarm node with - // address addr. - NewNodeStore(addr common.Address) *NodeStore -} - -// Keys are returned results by Keys and NodeKeys GlobalStorer methods. -type Keys struct { - Keys [][]byte - Next []byte -} - -// Nodes are returned results by Nodes and KeyNodes GlobalStorer methods. -type Nodes struct { - Addrs []common.Address - Next *common.Address -} - -// 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/vendor/github.com/ethereum/go-ethereum/swarm/storage/mock/rpc/rpc.go b/vendor/github.com/ethereum/go-ethereum/swarm/storage/mock/rpc/rpc.go deleted file mode 100644 index 8150ccff..00000000 --- a/vendor/github.com/ethereum/go-ethereum/swarm/storage/mock/rpc/rpc.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 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/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/rpc" - "github.com/ethereum/go-ethereum/swarm/log" - "github.com/ethereum/go-ethereum/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 -} - -// Keys returns a paginated list of keys on all nodes. -func (s *GlobalStore) Keys(startKey []byte, limit int) (keys mock.Keys, err error) { - err = s.client.Call(&keys, "mockStore_keys", startKey, limit) - return keys, err -} - -// Nodes returns a paginated list of all known nodes. -func (s *GlobalStore) Nodes(startAddr *common.Address, limit int) (nodes mock.Nodes, err error) { - err = s.client.Call(&nodes, "mockStore_nodes", startAddr, limit) - return nodes, err -} - -// NodeKeys returns a paginated list of keys on a node with provided address. -func (s *GlobalStore) NodeKeys(addr common.Address, startKey []byte, limit int) (keys mock.Keys, err error) { - err = s.client.Call(&keys, "mockStore_nodeKeys", addr, startKey, limit) - return keys, err -} - -// KeyNodes returns a paginated list of nodes that contain a particular key. -func (s *GlobalStore) KeyNodes(key []byte, startAddr *common.Address, limit int) (nodes mock.Nodes, err error) { - err = s.client.Call(&nodes, "mockStore_keyNodes", key, startAddr, limit) - return nodes, err -} diff --git a/vendor/github.com/ethereum/go-ethereum/swarm/storage/mock/test/test.go b/vendor/github.com/ethereum/go-ethereum/swarm/storage/mock/test/test.go deleted file mode 100644 index cc837f0b..00000000 --- a/vendor/github.com/ethereum/go-ethereum/swarm/storage/mock/test/test.go +++ /dev/null @@ -1,362 +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" - "encoding/binary" - "fmt" - "io" - "strconv" - "testing" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/swarm/storage" - "github.com/ethereum/go-ethereum/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) - } - } - } - }) - }) -} - -// MockStoreListings tests global store methods Keys, Nodes, NodeKeys and KeyNodes. -// It uses a provided globalstore to put chunks for n number of node addresses -// and to validate that methods are returning the right responses. -func MockStoreListings(t *testing.T, globalStore mock.GlobalStorer, n int) { - addrs := make([]common.Address, n) - for i := 0; i < n; i++ { - addrs[i] = common.HexToAddress(strconv.FormatInt(int64(i)+1, 16)) - } - type chunk struct { - key []byte - data []byte - } - const chunksPerNode = 5 - keys := make([][]byte, n*chunksPerNode) - for i := 0; i < n*chunksPerNode; i++ { - b := make([]byte, 8) - binary.BigEndian.PutUint64(b, uint64(i)) - keys[i] = b - } - - // keep track of keys on every node - nodeKeys := make(map[common.Address][][]byte) - // keep track of nodes that store particular key - keyNodes := make(map[string][]common.Address) - for i := 0; i < chunksPerNode; i++ { - // put chunks for every address - for j := 0; j < n; j++ { - addr := addrs[j] - key := keys[(i*n)+j] - err := globalStore.Put(addr, key, []byte("data")) - if err != nil { - t.Fatal(err) - } - nodeKeys[addr] = append(nodeKeys[addr], key) - keyNodes[string(key)] = append(keyNodes[string(key)], addr) - } - - // test Keys method - var startKey []byte - var gotKeys [][]byte - for { - keys, err := globalStore.Keys(startKey, 0) - if err != nil { - t.Fatal(err) - } - gotKeys = append(gotKeys, keys.Keys...) - if keys.Next == nil { - break - } - startKey = keys.Next - } - wantKeys := keys[:(i+1)*n] - if fmt.Sprint(gotKeys) != fmt.Sprint(wantKeys) { - t.Fatalf("got #%v keys %v, want %v", i+1, gotKeys, wantKeys) - } - - // test Nodes method - var startNode *common.Address - var gotNodes []common.Address - for { - nodes, err := globalStore.Nodes(startNode, 0) - if err != nil { - t.Fatal(err) - } - gotNodes = append(gotNodes, nodes.Addrs...) - if nodes.Next == nil { - break - } - startNode = nodes.Next - } - wantNodes := addrs - if fmt.Sprint(gotNodes) != fmt.Sprint(wantNodes) { - t.Fatalf("got #%v nodes %v, want %v", i+1, gotNodes, wantNodes) - } - - // test NodeKeys method - for addr, wantKeys := range nodeKeys { - var startKey []byte - var gotKeys [][]byte - for { - keys, err := globalStore.NodeKeys(addr, startKey, 0) - if err != nil { - t.Fatal(err) - } - gotKeys = append(gotKeys, keys.Keys...) - if keys.Next == nil { - break - } - startKey = keys.Next - } - if fmt.Sprint(gotKeys) != fmt.Sprint(wantKeys) { - t.Fatalf("got #%v %s node keys %v, want %v", i+1, addr.Hex(), gotKeys, wantKeys) - } - } - - // test KeyNodes method - for key, wantNodes := range keyNodes { - var startNode *common.Address - var gotNodes []common.Address - for { - nodes, err := globalStore.KeyNodes([]byte(key), startNode, 0) - if err != nil { - t.Fatal(err) - } - gotNodes = append(gotNodes, nodes.Addrs...) - if nodes.Next == nil { - break - } - startNode = nodes.Next - } - if fmt.Sprint(gotNodes) != fmt.Sprint(wantNodes) { - t.Fatalf("got #%v %x key nodes %v, want %v", i+1, []byte(key), gotNodes, wantNodes) - } - } - } -} - -// 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/vendor/github.com/ethereum/go-ethereum/swarm/storage/netstore.go b/vendor/github.com/ethereum/go-ethereum/swarm/storage/netstore.go deleted file mode 100644 index 7741b8f7..00000000 --- a/vendor/github.com/ethereum/go-ethereum/swarm/storage/netstore.go +++ /dev/null @@ -1,348 +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/ethereum/go-ethereum/p2p/enode" - "github.com/ethereum/go-ethereum/swarm/log" - "github.com/ethereum/go-ethereum/swarm/spancontext" - "github.com/opentracing/opentracing-go" - olog "github.com/opentracing/opentracing-go/log" - "github.com/syndtr/goleveldb/leveldb" - - lru "github.com/hashicorp/golang-lru" -) - -type ( - NewNetFetcherFunc func(ctx context.Context, addr Address, peers *sync.Map) NetFetcher -) - -type NetFetcher interface { - Request(hopCount uint8) - Offer(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) - log.Trace("n.getFetcher", "ref", ch.Address()) - if f := n.getFetcher(ch.Address()); f != nil { - log.Trace("n.getFetcher deliver", "ref", ch.Address()) - 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 { - // this is not measuring how long it takes to get the chunk for the localstore, but - // rather just adding a span for clarity when inspecting traces in Jaeger, in order - // to make it easier to reason which is the node that actually delivered a chunk. - _, sp := spancontext.StartSpan( - rctx, - "localstore.get") - defer sp.Finish() - - 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() - - wg := sync.WaitGroup{} - for _, key := range n.fetchers.Keys() { - if f, ok := n.fetchers.Get(key); ok { - if fetch, ok := f.(*fetcher); ok { - wg.Add(1) - go func(fetch *fetcher) { - defer wg.Done() - fetch.cancel() - - select { - case <-fetch.deliveredC: - case <-fetch.cancelledC: - } - }(fetch) - } - } - } - wg.Wait() -} - -// 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 { - // TODO: Fix comparison - we should be comparing against leveldb.ErrNotFound, this error should be wrapped. - if err != ErrChunkNotFound && err != leveldb.ErrNotFound { - 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(ctx, 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 -} - -// Has is the storage layer entry point to query the underlying -// database to return if it has a chunk or not. -// Called from the DebugAPI -func (n *NetStore) Has(ctx context.Context, ref Address) bool { - return n.store.Has(ctx, ref) -} - -// 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(ctx context.Context, 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 - cctx, cancel := context.WithTimeout(ctx, 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{} - - cctx, sp := spancontext.StartSpan( - cctx, - "netstore.fetcher", - ) - - sp.LogFields(olog.String("ref", ref.String())) - fetcher := newFetcher(sp, ref, n.NewNetFetcherFunc(cctx, 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 - span opentracing.Span // measure retrieve time per chunk -} - -// 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(span opentracing.Span, 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, - span: span, - } -} - -// 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() - } - f.span.Finish() - }() - - // 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(&source) - } else { - f.netFetcher.Request(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) - log.Trace("n.getFetcher close deliveredC", "ref", ch.Address()) - }) -} diff --git a/vendor/github.com/ethereum/go-ethereum/swarm/storage/pyramid.go b/vendor/github.com/ethereum/go-ethereum/swarm/storage/pyramid.go deleted file mode 100644 index 281bbe9f..00000000 --- a/vendor/github.com/ethereum/go-ethereum/swarm/storage/pyramid.go +++ /dev/null @@ -1,694 +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" - - "github.com/ethereum/go-ethereum/swarm/chunk" - "github.com/ethereum/go-ethereum/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, chunk.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, chunk.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) { - 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) { - // 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) { - 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 { - // 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) { - 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/vendor/github.com/ethereum/go-ethereum/swarm/storage/schema.go b/vendor/github.com/ethereum/go-ethereum/swarm/storage/schema.go deleted file mode 100644 index 91847ca0..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/swarm/storage/swarmhasher.go b/vendor/github.com/ethereum/go-ethereum/swarm/storage/swarmhasher.go deleted file mode 100644 index fae03f0c..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/swarm/storage/types.go b/vendor/github.com/ethereum/go-ethereum/swarm/storage/types.go deleted file mode 100644 index 2f39685b..00000000 --- a/vendor/github.com/ethereum/go-ethereum/swarm/storage/types.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 storage - -import ( - "bytes" - "context" - "crypto" - "crypto/rand" - "encoding/binary" - "io" - - "github.com/ethereum/go-ethereum/swarm/bmt" - "github.com/ethereum/go-ethereum/swarm/chunk" - "golang.org/x/crypto/sha3" -) - -// MaxPO is the same as chunk.MaxPO for backward compatibility. -const MaxPO = chunk.MaxPO - -// AddressLength is the same as chunk.AddressLength for backward compatibility. -const AddressLength = chunk.AddressLength - -type SwarmHasher func() SwarmHash - -// Address is an alias for chunk.Address for backward compatibility. -type Address = chunk.Address - -// Proximity is the same as chunk.Proximity for backward compatibility. -var Proximity = chunk.Proximity - -// ZeroAddr is the same as chunk.ZeroAddr for backward compatibility. -var ZeroAddr = chunk.ZeroAddr - -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 := chunk.DefaultSize / hasherSize - pool := bmt.NewTreePool(hasher, segmentCount, bmt.PoolSize) - return bmt.New(pool) - } - } - 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 is an alias for chunk.Chunk for backward compatibility. -type Chunk = chunk.Chunk - -// NewChunk is the same as chunk.NewChunk for backward compatibility. -var NewChunk = chunk.NewChunk - -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(ch Chunk) bool { - data := ch.Data() - if l := len(data); l < 9 || l > chunk.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, ch.Address()) -} - -type ChunkStore interface { - Put(ctx context.Context, ch Chunk) (err error) - Get(rctx context.Context, ref Address) (ch Chunk, err error) - Has(rctx context.Context, ref Address) bool - 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 -} - -// Has doesn't do anything it is just here to implement ChunkStore -func (f *FakeChunkStore) Has(_ context.Context, ref Address) bool { - panic("FakeChunkStore doesn't support HasChunk") -} - -// Get 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/vendor/github.com/ethereum/go-ethereum/swarm/swap/swap.go b/vendor/github.com/ethereum/go-ethereum/swarm/swap/swap.go deleted file mode 100644 index 5d636dc2..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/ethereum/go-ethereum/p2p/enode" - "github.com/ethereum/go-ethereum/p2p/protocols" - "github.com/ethereum/go-ethereum/swarm/log" - "github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/swarm/swarm.go b/vendor/github.com/ethereum/go-ethereum/swarm/swarm.go deleted file mode 100644 index 61813e23..00000000 --- a/vendor/github.com/ethereum/go-ethereum/swarm/swarm.go +++ /dev/null @@ -1,553 +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/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/contracts/chequebook" - "github.com/ethereum/go-ethereum/contracts/ens" - "github.com/ethereum/go-ethereum/ethclient" - "github.com/ethereum/go-ethereum/metrics" - "github.com/ethereum/go-ethereum/p2p" - "github.com/ethereum/go-ethereum/p2p/protocols" - "github.com/ethereum/go-ethereum/params" - "github.com/ethereum/go-ethereum/rpc" - "github.com/ethereum/go-ethereum/swarm/api" - httpapi "github.com/ethereum/go-ethereum/swarm/api/http" - "github.com/ethereum/go-ethereum/swarm/fuse" - "github.com/ethereum/go-ethereum/swarm/log" - "github.com/ethereum/go-ethereum/swarm/network" - "github.com/ethereum/go-ethereum/swarm/network/stream" - "github.com/ethereum/go-ethereum/swarm/pss" - "github.com/ethereum/go-ethereum/swarm/state" - "github.com/ethereum/go-ethereum/swarm/storage" - "github.com/ethereum/go-ethereum/swarm/storage/feed" - "github.com/ethereum/go-ethereum/swarm/storage/mock" - "github.com/ethereum/go-ethereum/swarm/swap" - "github.com/ethereum/go-ethereum/swarm/tracing" -) - -var ( - 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 - cleanupFuncs []func() error - - tracerClose io.Closer -} - -// NewSwarm 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(), - cleanupFuncs: []func() error{}, - } - 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, - BootnodeMode: config.BootnodeMode, - } - - 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")) - } - - nodeID := config.Enode.ID() - - 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 (s *Swarm) Start(srv *p2p.Server) error { - startTime := time.Now() - - s.tracerClose = tracing.Closer - - // update uaddr to correct enode - newaddr := s.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 s.config.SwapEnabled && s.config.SwapAPI != "" { - ctx := context.Background() // The initial setup has no deadline. - err := s.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", s.config.Swap.Chequebook())) - } else { - log.Debug(fmt.Sprintf("SWAP disabled: no cheque book set")) - } - - log.Info("Starting bzz service") - - err := s.bzz.Start(srv) - if err != nil { - log.Error("bzz failed", "err", err) - return err - } - log.Info("Swarm network started", "bzzaddr", fmt.Sprintf("%x", s.bzz.Hive.BaseAddr())) - - if s.ps != nil { - s.ps.Start(srv) - } - - // start swarm http proxy server - if s.config.Port != "" { - addr := net.JoinHostPort(s.config.ListenAddr, s.config.Port) - server := httpapi.NewServer(s.api, s.config.Cors) - - if s.config.Cors != "" { - log.Debug("Swarm HTTP proxy CORS headers", "allowedOrigins", s.config.Cors) - } - - log.Debug("Starting Swarm HTTP proxy", "port", s.config.Port) - go func() { - err := server.ListenAndServe(addr) - if err != nil { - log.Error("Could not start Swarm HTTP proxy", "err", err.Error()) - } - }() - } - - doneC := make(chan struct{}) - - s.cleanupFuncs = append(s.cleanupFuncs, func() error { - close(doneC) - return nil - }) - - go func(time.Time) { - for { - select { - case <-time.After(updateGaugesPeriod): - uptimeGauge.Update(time.Since(startTime).Nanoseconds()) - requestsCacheGauge.Update(int64(s.netStore.RequestsCacheLen())) - case <-doneC: - return - } - } - }(startTime) - - startCounter.Inc(1) - s.streamer.Start(srv) - return nil -} - -// implements the node.Service interface -// stops all component services. -func (s *Swarm) Stop() error { - if s.tracerClose != nil { - err := s.tracerClose.Close() - tracing.FinishSpans() - if err != nil { - return err - } - } - - if s.ps != nil { - s.ps.Stop() - } - if ch := s.config.Swap.Chequebook(); ch != nil { - ch.Stop() - ch.Save() - } - if s.swap != nil { - s.swap.Close() - } - if s.accountingMetrics != nil { - s.accountingMetrics.Close() - } - if s.netStore != nil { - s.netStore.Close() - } - s.sfs.Stop() - stopCounter.Inc(1) - s.streamer.Stop() - - err := s.bzz.Stop() - if s.stateStore != nil { - s.stateStore.Close() - } - - for _, cleanF := range s.cleanupFuncs { - err = cleanF() - if err != nil { - log.Error("encountered an error while running cleanup function", "err", err) - break - } - } - return err -} - -// Protocols implements the node.Service interface -func (s *Swarm) Protocols() (protos []p2p.Protocol) { - if s.config.BootnodeMode { - protos = append(protos, s.bzz.Protocols()...) - } else { - protos = append(protos, s.bzz.Protocols()...) - - if s.ps != nil { - protos = append(protos, s.ps.Protocols()...) - } - } - return -} - -// implements node.Service -// APIs returns the RPC API descriptors the Swarm implementation offers -func (s *Swarm) APIs() []rpc.API { - - apis := []rpc.API{ - // public APIs - { - Namespace: "bzz", - Version: "3.0", - Service: &Info{s.config, chequebook.ContractParams}, - Public: true, - }, - // admin APIs - { - Namespace: "bzz", - Version: "3.0", - Service: api.NewInspector(s.api, s.bzz.Hive, s.netStore), - Public: false, - }, - { - Namespace: "chequebook", - Version: chequebook.Version, - Service: chequebook.NewAPI(s.config.Swap.Chequebook), - Public: false, - }, - { - Namespace: "swarmfs", - Version: fuse.SwarmFSVersion, - Service: s.sfs, - Public: false, - }, - { - Namespace: "accounting", - Version: protocols.AccountingVersion, - Service: protocols.NewAccountingApi(s.accountingMetrics), - Public: false, - }, - } - - apis = append(apis, s.bzz.APIs()...) - - apis = append(apis, s.streamer.APIs()...) - - if s.ps != nil { - apis = append(apis, s.ps.APIs()...) - } - - return apis -} - -// SetChequebook ensures that the local checquebook is set up on chain. -func (s *Swarm) SetChequebook(ctx context.Context) error { - err := s.config.Swap.SetChequebook(ctx, s.backend, s.config.Path) - if err != nil { - return err - } - log.Info(fmt.Sprintf("new chequebook set (%v): saving config file, resetting all connections in the hive", s.config.Swap.Contract.Hex())) - return nil -} - -// RegisterPssProtocol adds a devp2p protocol to the swarm node's Pss instance -func (s *Swarm) RegisterPssProtocol(topic *pss.Topic, spec *protocols.Spec, targetprotocol *p2p.Protocol, options *pss.ProtocolParams) (*pss.Protocol, error) { - return pss.RegisterProtocol(s.ps, topic, spec, targetprotocol, options) -} - -// serialisable info about swarm -type Info struct { - *api.Config - *chequebook.Params -} - -func (s *Info) Info() *Info { - return s -} diff --git a/vendor/github.com/ethereum/go-ethereum/swarm/testutil/file.go b/vendor/github.com/ethereum/go-ethereum/swarm/testutil/file.go deleted file mode 100644 index 70732aa9..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/swarm/testutil/norace.go b/vendor/github.com/ethereum/go-ethereum/swarm/testutil/norace.go deleted file mode 100644 index bc652184..00000000 --- a/vendor/github.com/ethereum/go-ethereum/swarm/testutil/norace.go +++ /dev/null @@ -1,26 +0,0 @@ -// 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 !race - -package testutil - -// RaceEnabled is true when -race flag is provided to the go tool. This const -// might be used in tests to skip some cases as the race detector may increase -// memory usage 5-10x and execution time by 2-20x. That might causes problems -// on Travis. Please, use this flag sparingly and keep your unit tests -// as light on resources as possible. -const RaceEnabled = false diff --git a/vendor/github.com/ethereum/go-ethereum/swarm/tracing/tracing.go b/vendor/github.com/ethereum/go-ethereum/swarm/tracing/tracing.go deleted file mode 100644 index 55875464..00000000 --- a/vendor/github.com/ethereum/go-ethereum/swarm/tracing/tracing.go +++ /dev/null @@ -1,173 +0,0 @@ -package tracing - -import ( - "context" - "io" - "os" - "strings" - "sync" - "time" - - "github.com/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/swarm/spancontext" - - opentracing "github.com/opentracing/opentracing-go" - jaeger "github.com/uber/jaeger-client-go" - jaegercfg "github.com/uber/jaeger-client-go/config" - cli "gopkg.in/urfave/cli.v1" -) - -var ( - // Enabled turns tracing on for the current swarm instance - Enabled bool = false - store = spanStore{} -) - -const ( - // TracingEnabledFlag is the CLI flag name to use to enable trace collections. - TracingEnabledFlag = "tracing" - - // StoreLabelId is the context value key of the name of the span to be saved - StoreLabelId = "span_save_id" - - // StoreLabelMeta is the context value key that together with StoreLabelId constitutes the retrieval key for saved spans in the span store - // StartSaveSpan and ShiftSpanByKey - StoreLabelMeta = "span_save_meta" -) - -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 -} - -// spanStore holds saved spans -type spanStore struct { - spans sync.Map -} - -// StartSaveSpan stores the span specified in the passed context for later retrieval -// The span object but be context value on the key StoreLabelId. -// It will be stored under the the following string key context.Value(StoreLabelId)|.|context.Value(StoreLabelMeta) -func StartSaveSpan(ctx context.Context) context.Context { - if !Enabled { - return ctx - } - traceId := ctx.Value(StoreLabelId) - - if traceId != nil { - traceStr := traceId.(string) - var sp opentracing.Span - ctx, sp = spancontext.StartSpan( - ctx, - traceStr, - ) - traceMeta := ctx.Value(StoreLabelMeta) - if traceMeta != nil { - traceStr = traceStr + "." + traceMeta.(string) - } - store.spans.Store(traceStr, sp) - } - return ctx -} - -// ShiftSpanByKey retrieves the span stored under the key of the string given as argument -// The span is then deleted from the store -func ShiftSpanByKey(k string) opentracing.Span { - if !Enabled { - return nil - } - span, spanOk := store.spans.Load(k) - if !spanOk { - return nil - } - store.spans.Delete(k) - return span.(opentracing.Span) -} - -// FinishSpans calls `Finish()` on all stored spans -// It should be called on instance shutdown -func FinishSpans() { - store.spans.Range(func(_, v interface{}) bool { - v.(opentracing.Span).Finish() - return true - }) -} diff --git a/vendor/github.com/ethereum/go-ethereum/swarm/version/version.go b/vendor/github.com/ethereum/go-ethereum/swarm/version/version.go deleted file mode 100644 index 9729342a..00000000 --- a/vendor/github.com/ethereum/go-ethereum/swarm/version/version.go +++ /dev/null @@ -1,67 +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 = 15 // Patch version component of the current release - VersionMeta = "unstable" // 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 -}() - -// Git SHA1 commit hash of the release, will be set by main.init() function -var GitCommit string - -// 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/vendor/github.com/ethereum/go-ethereum/tests/gen_tttransaction.go b/vendor/github.com/ethereum/go-ethereum/tests/gen_tttransaction.go deleted file mode 100644 index 2948842d..00000000 --- a/vendor/github.com/ethereum/go-ethereum/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/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/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/vendor/github.com/ethereum/go-ethereum/tests/transaction_test_util.go b/vendor/github.com/ethereum/go-ethereum/tests/transaction_test_util.go index 8c3dac08..12444720 100644 --- a/vendor/github.com/ethereum/go-ethereum/tests/transaction_test_util.go +++ b/vendor/github.com/ethereum/go-ethereum/tests/transaction_test_util.go @@ -17,14 +17,11 @@ package tests import ( - "bytes" - "errors" "fmt" - "math/big" "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/types" "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/rlp" @@ -32,101 +29,80 @@ import ( // TransactionTest checks RLP decoding and sender derivation of transactions. type TransactionTest struct { - json ttJSON + RLP hexutil.Bytes `json:"rlp"` + Byzantium ttFork + Constantinople 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) (*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) + 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 + }{ + {"Frontier", types.FrontierSigner{}, tt.Frontier, false}, + {"Homestead", types.HomesteadSigner{}, tt.Homestead, true}, + {"EIP150", types.HomesteadSigner{}, tt.EIP150, true}, + {"EIP158", types.NewEIP155Signer(config.ChainID), tt.EIP158, true}, + {"Byzantium", types.NewEIP155Signer(config.ChainID), tt.Byzantium, true}, + {"Constantinople", types.NewEIP155Signer(config.ChainID), tt.Constantinople, true}, + } { + sender, txhash, err := validateTx(tt.RLP, testcase.signer, testcase.isHomestead) + + if testcase.fork.Sender == (common.UnprefixedAddress{}) { + if err == nil { + return fmt.Errorf("Expected error, got none (address %v)", sender.String()) + } + 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/vendor/github.com/ethereum/go-ethereum/trie/database.go b/vendor/github.com/ethereum/go-ethereum/trie/database.go index 9a4c05d1..d8a0fa9c 100644 --- a/vendor/github.com/ethereum/go-ethereum/trie/database.go +++ b/vendor/github.com/ethereum/go-ethereum/trie/database.go @@ -21,6 +21,7 @@ import ( "errors" "fmt" "io" + "reflect" "sync" "time" @@ -84,7 +85,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 @@ -146,6 +148,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 { @@ -300,15 +311,17 @@ func NewDatabaseWithCache(diskdb ethdb.KeyValueStore, cache int) *Database { }) } 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() ethdb.Reader { +func (db *Database) DiskDB() ethdb.KeyValueReader { return db.diskdb } @@ -491,11 +504,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. @@ -532,6 +549,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. @@ -566,6 +584,9 @@ 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 + } } } @@ -584,8 +605,9 @@ func (db *Database) Cap(limit common.StorageSize) error { // 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. @@ -621,10 +643,12 @@ func (db *Database) Cap(limit common.StorageSize) error { 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 @@ -646,6 +670,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{} @@ -803,7 +830,9 @@ func (c *cleaner) Put(key []byte, rlp []byte) error { // 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)) + } // Move the flushed node into the clean cache to prevent insta-reloads if c.db.cleans != nil { c.db.cleans.Set(string(hash[:]), rlp) @@ -823,9 +852,10 @@ 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 + // 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 } // verifyIntegrity is a debug method to iterate over the entire trie stored in diff --git a/vendor/github.com/ethereum/go-ethereum/trie/proof.go b/vendor/github.com/ethereum/go-ethereum/trie/proof.go index 26a41ed2..9985e730 100644 --- a/vendor/github.com/ethereum/go-ethereum/trie/proof.go +++ b/vendor/github.com/ethereum/go-ethereum/trie/proof.go @@ -21,7 +21,6 @@ import ( "fmt" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/rlp" @@ -34,7 +33,7 @@ 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.Writer) error { +func (t *Trie) Prove(key []byte, fromLevel uint, proofDb ethdb.KeyValueWriter) error { // Collect all nodes on the path to key. key = keybytesToHex(key) var nodes []node @@ -81,7 +80,7 @@ func (t *Trie) Prove(key []byte, fromLevel uint, proofDb ethdb.Writer) 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.Writer) 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.Writer) 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 ethdb.Reader) (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++ { diff --git a/vendor/github.com/ethereum/go-ethereum/trie/sync.go b/vendor/github.com/ethereum/go-ethereum/trie/sync.go index 85f1b0f8..6f40b45a 100644 --- a/vendor/github.com/ethereum/go-ethereum/trie/sync.go +++ b/vendor/github.com/ethereum/go-ethereum/trie/sync.go @@ -72,19 +72,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 ethdb.Reader // 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 ethdb.Reader, 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 +101,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); 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 +140,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{ @@ -213,14 +224,15 @@ 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.Writer) (int, error) { +func (s *Sync) Commit(dbw ethdb.KeyValueWriter) (int, 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 } + s.bloom.Add(key[:]) } - written := len(s.membatch.order) + written := len(s.membatch.order) // TODO(karalabe): could an order change improve write performance? // Drop the membatch data and return s.membatch = newSyncMemBatch() @@ -292,8 +304,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{ diff --git a/vendor/github.com/ethereum/go-ethereum/trie/sync_bloom.go b/vendor/github.com/ethereum/go-ethereum/trie/sync_bloom.go new file mode 100644 index 00000000..7b5b7488 --- /dev/null +++ b/vendor/github.com/ethereum/go-ethereum/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)) // Can't happen, here for sanity + } + 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/vendor/github.com/ethereum/go-ethereum/whisper/whisperv6/api.go b/vendor/github.com/ethereum/go-ethereum/whisper/whisperv6/api.go index 7609a03c..d6d4c8d3 100644 --- a/vendor/github.com/ethereum/go-ethereum/whisper/whisperv6/api.go +++ b/vendor/github.com/ethereum/go-ethereum/whisper/whisperv6/api.go @@ -103,7 +103,7 @@ func (api *PublicWhisperAPI) SetBloomFilter(ctx context.Context, bloom hexutil.B // MarkTrustedPeer marks a peer trusted, which will allow it to send historic (expired) messages. // Note: This function is not adding new nodes, the node needs to exists as a peer. func (api *PublicWhisperAPI) MarkTrustedPeer(ctx context.Context, url string) (bool, error) { - n, err := enode.ParseV4(url) + n, err := enode.Parse(enode.ValidSchemes, url) if err != nil { return false, err } @@ -291,7 +291,7 @@ func (api *PublicWhisperAPI) Post(ctx context.Context, req NewMessage) (hexutil. // send to specific node (skip PoW check) if len(req.TargetPeer) > 0 { - n, err := enode.ParseV4(req.TargetPeer) + n, err := enode.Parse(enode.ValidSchemes, req.TargetPeer) if err != nil { return nil, fmt.Errorf("failed to parse target peer: %s", err) } diff --git a/vendor/github.com/go-stack/stack/.travis.yml b/vendor/github.com/go-stack/stack/.travis.yml index d5e5dd52..5c5a2b51 100644 --- a/vendor/github.com/go-stack/stack/.travis.yml +++ b/vendor/github.com/go-stack/stack/.travis.yml @@ -1,16 +1,15 @@ language: go sudo: false go: - - 1.2 - - 1.3 - - 1.4 - - 1.5 - - 1.6 + - 1.7.x + - 1.8.x + - 1.9.x + - 1.10.x + - 1.11.x - tip before_install: - go get github.com/mattn/goveralls - - go get golang.org/x/tools/cmd/cover script: - goveralls -service=travis-ci diff --git a/vendor/github.com/go-stack/stack/go.mod b/vendor/github.com/go-stack/stack/go.mod new file mode 100644 index 00000000..96a53a10 --- /dev/null +++ b/vendor/github.com/go-stack/stack/go.mod @@ -0,0 +1 @@ +module github.com/go-stack/stack diff --git a/vendor/github.com/go-stack/stack/stack.go b/vendor/github.com/go-stack/stack/stack.go index 8033c401..ac3b93b1 100644 --- a/vendor/github.com/go-stack/stack/stack.go +++ b/vendor/github.com/go-stack/stack/stack.go @@ -1,3 +1,5 @@ +// +build go1.7 + // Package stack implements utilities to capture, manipulate, and format call // stacks. It provides a simpler API than package runtime. // @@ -21,29 +23,31 @@ import ( // Call records a single function invocation from a goroutine stack. type Call struct { - fn *runtime.Func - pc uintptr + frame runtime.Frame } // 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 + // As of Go 1.9 we need room for up to three PC entries. + // + // 0. An entry for the stack frame prior to the target to check for + // special handling needed if that prior entry is runtime.sigpanic. + // 1. A possible second entry to hold metadata about skipped inlined + // functions. If inline functions were not skipped the target frame + // PC will be here. + // 2. A third entry for the target frame PC when the second entry + // is used for skipped inline functions. + var pcs [3]uintptr n := runtime.Callers(skip+1, pcs[:]) + frames := runtime.CallersFrames(pcs[:n]) + frame, _ := frames.Next() + frame, _ = frames.Next() - var c Call - - if n < 2 { - return c + return Call{ + frame: frame, } - - 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). @@ -54,9 +58,10 @@ func (c Call) String() string { // 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 { + if c.frame == (runtime.Frame{}) { return nil, ErrNoFunc } + buf := bytes.Buffer{} fmt.Fprint(&buf, c) return buf.Bytes(), nil @@ -71,29 +76,33 @@ var ErrNoFunc = errors.New("no call stack information") // %s source file // %d line number // %n function name +// %k last segment of the package path // %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 path of source file relative to the compile time GOPATH, +// or the module path joined to the path of source file relative +// to module root // %#s full path of source file // %+n import path qualified function name +// %+k full package path // %+v equivalent to %+s:%d // %#v equivalent to %#s:%d func (c Call) Format(s fmt.State, verb rune) { - if c.fn == nil { + if c.frame == (runtime.Frame{}) { fmt.Fprintf(s, "%%!%c(NOFUNC)", verb) return } switch verb { case 's', 'v': - file, line := c.fn.FileLine(c.pc) + file := c.frame.File switch { case s.Flag('#'): // done case s.Flag('+'): - file = file[pkgIndex(file, c.fn.Name()):] + file = pkgFilePath(&c.frame) default: const sep = "/" if i := strings.LastIndex(file, sep); i != -1 { @@ -103,16 +112,31 @@ func (c Call) Format(s fmt.State, verb rune) { io.WriteString(s, file) if verb == 'v' { buf := [7]byte{':'} - s.Write(strconv.AppendInt(buf[:1], int64(line), 10)) + s.Write(strconv.AppendInt(buf[:1], int64(c.frame.Line), 10)) } case 'd': - _, line := c.fn.FileLine(c.pc) buf := [6]byte{} - s.Write(strconv.AppendInt(buf[:0], int64(line), 10)) + s.Write(strconv.AppendInt(buf[:0], int64(c.frame.Line), 10)) + + case 'k': + name := c.frame.Function + const pathSep = "/" + start, end := 0, len(name) + if i := strings.LastIndex(name, pathSep); i != -1 { + start = i + len(pathSep) + } + const pkgSep = "." + if i := strings.Index(name[start:], pkgSep); i != -1 { + end = start + i + } + if s.Flag('+') { + start = 0 + } + io.WriteString(s, name[start:end]) case 'n': - name := c.fn.Name() + name := c.frame.Function if !s.Flag('+') { const pathSep = "/" if i := strings.LastIndex(name, pathSep); i != -1 { @@ -127,35 +151,17 @@ func (c Call) Format(s fmt.State, verb rune) { } } +// Frame returns the call frame infomation for the Call. +func (c Call) Frame() runtime.Frame { + return c.frame +} + // PC returns the program counter for this call frame; multiple frames may // have the same PC value. +// +// Deprecated: Use Call.Frame instead. 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 + return c.frame.PC } // CallStack records a sequence of function invocations from a goroutine @@ -179,9 +185,6 @@ 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) } @@ -209,18 +212,18 @@ func (cs CallStack) Format(s fmt.State, verb rune) { // identifying the calling function. func Trace() CallStack { var pcs [512]uintptr - n := runtime.Callers(2, pcs[:]) - cs := make([]Call, n) + n := runtime.Callers(1, pcs[:]) - 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, - } + frames := runtime.CallersFrames(pcs[:n]) + cs := make(CallStack, 0, n) + + // Skip extra frame retrieved just to make sure the runtime.sigpanic + // special case is handled. + frame, more := frames.Next() + + for more { + frame, more = frames.Next() + cs = append(cs, Call{frame: frame}) } return cs @@ -229,7 +232,7 @@ func Trace() CallStack { // 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 { + for len(cs) > 0 && cs[0] != c { cs = cs[1:] } return cs @@ -238,7 +241,7 @@ func (cs CallStack) TrimBelow(c Call) CallStack { // 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 { + for len(cs) > 0 && cs[len(cs)-1] != c { cs = cs[:len(cs)-1] } return cs @@ -284,15 +287,90 @@ func pkgIndex(file, funcName string) int { return i + len(sep) } +// pkgFilePath returns the frame's filepath relative to the compile-time GOPATH, +// or its module path joined to its path relative to the module root. +// +// As of Go 1.11 there is no direct way to know the compile time GOPATH or +// module paths at runtime, but we can piece together the desired information +// from available information. We note that runtime.Frame.Function contains the +// function name qualified by the package path, which includes the module path +// but not the GOPATH. We can extract the package path from that and append the +// last segments of the file path to arrive at the desired package qualified +// file path. For example, given: +// +// GOPATH /home/user +// import path pkg/sub +// frame.File /home/user/src/pkg/sub/file.go +// frame.Function pkg/sub.Type.Method +// Desired return pkg/sub/file.go +// +// It appears that we simply need to trim ".Type.Method" from frame.Function and +// append "/" + path.Base(file). +// +// But there are other wrinkles. Although it is idiomatic to do so, the internal +// name of a package is not required to match the last segment of its import +// path. In addition, the introduction of modules in Go 1.11 allows working +// without a GOPATH. So we also must make these work right: +// +// GOPATH /home/user +// import path pkg/go-sub +// package name sub +// frame.File /home/user/src/pkg/go-sub/file.go +// frame.Function pkg/sub.Type.Method +// Desired return pkg/go-sub/file.go +// +// Module path pkg/v2 +// import path pkg/v2/go-sub +// package name sub +// frame.File /home/user/cloned-pkg/go-sub/file.go +// frame.Function pkg/v2/sub.Type.Method +// Desired return pkg/v2/go-sub/file.go +// +// We can handle all of these situations by using the package path extracted +// from frame.Function up to, but not including, the last segment as the prefix +// and the last two segments of frame.File as the suffix of the returned path. +// This preserves the existing behavior when working in a GOPATH without modules +// and a semantically equivalent behavior when used in module aware project. +func pkgFilePath(frame *runtime.Frame) string { + pre := pkgPrefix(frame.Function) + post := pathSuffix(frame.File) + if pre == "" { + return post + } + return pre + "/" + post +} + +// pkgPrefix returns the import path of the function's package with the final +// segment removed. +func pkgPrefix(funcName string) string { + const pathSep = "/" + end := strings.LastIndex(funcName, pathSep) + if end == -1 { + return "" + } + return funcName[:end] +} + +// pathSuffix returns the last two segments of path. +func pathSuffix(path string) string { + const pathSep = "/" + lastSep := strings.LastIndex(path, pathSep) + if lastSep == -1 { + return path + } + return path[strings.LastIndex(path[:lastSep], pathSep)+1:] +} + var runtimePath string func init() { - var pcs [1]uintptr + var pcs [3]uintptr runtime.Callers(0, pcs[:]) - fn := runtime.FuncForPC(pcs[0]) - file, _ := fn.FileLine(pcs[0]) + frames := runtime.CallersFrames(pcs[:]) + frame, _ := frames.Next() + file := frame.File - idx := pkgIndex(file, fn.Name()) + idx := pkgIndex(frame.File, frame.Function) runtimePath = file[:idx] if runtime.GOOS == "windows" { @@ -301,7 +379,7 @@ func init() { } func inGoroot(c Call) bool { - file := c.file() + file := c.frame.File if len(file) == 0 || file[0] == '?' { return true } diff --git a/vendor/github.com/gxed/hashland/keccak/LICENSE b/vendor/github.com/gxed/hashland/keccak/LICENSE deleted file mode 100644 index 9cbcfb5f..00000000 --- a/vendor/github.com/gxed/hashland/keccak/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -Copyright (c) 2013 Barry Allard - -Except for keccak_test.go, .h and .c files are licensed seperately - -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/gxed/hashland/keccakpg/go.mod b/vendor/github.com/gxed/hashland/keccakpg/go.mod deleted file mode 100644 index da524d9d..00000000 --- a/vendor/github.com/gxed/hashland/keccakpg/go.mod +++ /dev/null @@ -1 +0,0 @@ -module github.com/gxed/hashland/keccakpg diff --git a/vendor/github.com/gxed/hashland/keccakpg/keccak.go b/vendor/github.com/gxed/hashland/keccakpg/keccak.go deleted file mode 100644 index e97a49a4..00000000 --- a/vendor/github.com/gxed/hashland/keccakpg/keccak.go +++ /dev/null @@ -1,224 +0,0 @@ -// Package keccak implements the Keccak (SHA-3) hash algorithm. -// http://keccak.noekeon.org. -package keccakpg - -import ( - _ "fmt" - "hash" -) - -const stdRounds = 24 - -var roundConstants = []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, -} - -var rotationConstants = [24]uint{ - 1, 3, 6, 10, 15, 21, 28, 36, - 45, 55, 2, 14, 27, 41, 56, 8, - 25, 43, 62, 18, 39, 61, 20, 44, -} - -var piLane = [24]uint{ - 10, 7, 11, 17, 18, 3, 5, 16, - 8, 21, 24, 4, 15, 23, 19, 13, - 12, 2, 20, 14, 22, 9, 6, 1, -} - -type keccak struct { - S [25]uint64 - size int - blockSize int - rounds int - buf []byte -} - -func newKeccak(bitlen, rounds int) hash.Hash { - var h keccak - h.size = bitlen / 8 - h.blockSize = (200 - 2*h.size) - h.rounds = rounds - if rounds != stdRounds { - //fmt.Printf("keccak: warning non standard number of rounds %d vs %d\n", rounds, stdRounds) - } - return &h -} - -func NewCustom(bits, rounds int) hash.Hash { - return newKeccak(bits, rounds) -} - -func New160() hash.Hash { - return newKeccak(160, stdRounds) -} - -func New224() hash.Hash { - return newKeccak(224, stdRounds) -} - -func New256() hash.Hash { - return newKeccak(256, stdRounds) -} - -func New384() hash.Hash { - return newKeccak(384, stdRounds) -} - -func New512() hash.Hash { - return newKeccak(512, stdRounds) -} - -func (k *keccak) Write(b []byte) (int, error) { - n := len(b) - - if len(k.buf) > 0 { - x := k.blockSize - len(k.buf) - if x > len(b) { - x = len(b) - } - k.buf = append(k.buf, b[:x]...) - b = b[x:] - - if len(k.buf) < k.blockSize { - return n, nil - } - - k.f(k.buf) - k.buf = nil - } - - for len(b) >= k.blockSize { - k.f(b[:k.blockSize]) - b = b[k.blockSize:] - } - - k.buf = b - - return n, nil -} - -func (k0 *keccak) Sum(b []byte) []byte { - - k := *k0 - - last := k.pad(k.buf) - k.f(last) - - buf := make([]byte, len(k.S)*8) - for i := range k.S { - putUint64le(buf[i*8:], k.S[i]) - } - return append(b, buf[:k.size]...) -} - -func (k *keccak) Reset() { - for i := range k.S { - k.S[i] = 0 - } - k.buf = nil -} - -func (k *keccak) Size() int { - return k.size -} - -func (k *keccak) BlockSize() int { - return k.blockSize -} - -func rotl64(x uint64, n uint) uint64 { - return (x << n) | (x >> (64 - n)) -} - -func (k *keccak) f(block []byte) { - - if len(block) != k.blockSize { - panic("f() called with invalid block size") - } - - for i := 0; i < k.blockSize/8; i++ { - k.S[i] ^= uint64le(block[i*8:]) - } - - for r := 0; r < k.rounds; r++ { - var bc [5]uint64 - - // theta - for i := range bc { - bc[i] = k.S[i] ^ k.S[5+i] ^ k.S[10+i] ^ k.S[15+i] ^ k.S[20+i] - } - for i := range bc { - t := bc[(i+4)%5] ^ rotl64(bc[(i+1)%5], 1) - for j := 0; j < len(k.S); j += 5 { - k.S[i+j] ^= t - } - } - - // rho phi - temp := k.S[1] - for i := range piLane { - j := piLane[i] - temp2 := k.S[j] - k.S[j] = rotl64(temp, rotationConstants[i]) - temp = temp2 - } - - // chi - for j := 0; j < len(k.S); j += 5 { - for i := range bc { - bc[i] = k.S[j+i] - } - for i := range bc { - k.S[j+i] ^= (^bc[(i+1)%5]) & bc[(i+2)%5] - } - } - - // iota - k.S[0] ^= roundConstants[r] - } -} - -func (k *keccak) pad(block []byte) []byte { - - padded := make([]byte, k.blockSize) - - copy(padded, k.buf) - padded[len(k.buf)] = 0x01 - padded[len(padded)-1] |= 0x80 - - return padded -} - -func uint64le(v []byte) uint64 { - return uint64(v[0]) | - uint64(v[1])<<8 | - uint64(v[2])<<16 | - uint64(v[3])<<24 | - uint64(v[4])<<32 | - uint64(v[5])<<40 | - uint64(v[6])<<48 | - uint64(v[7])<<56 - -} - -func putUint64le(v []byte, x uint64) { - v[0] = byte(x) - v[1] = byte(x >> 8) - v[2] = byte(x >> 16) - v[3] = byte(x >> 24) - v[4] = byte(x >> 32) - v[5] = byte(x >> 40) - v[6] = byte(x >> 48) - v[7] = byte(x >> 56) -} diff --git a/vendor/github.com/gxed/hashland/keccakpg/package.json b/vendor/github.com/gxed/hashland/keccakpg/package.json deleted file mode 100644 index 9bc01c5d..00000000 --- a/vendor/github.com/gxed/hashland/keccakpg/package.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "author": "whyrusleeping", - "bugs": {}, - "gx": { - "dvcsimport": "github.com/gxed/hashland/keccakpg" - }, - "gxVersion": "0.10.0", - "language": "go", - "license": "", - "name": "keccakpg", - "releaseCmd": "git commit -a -m \"gx publish $VERSION\"", - "version": "0.0.1" -} - diff --git a/vendor/github.com/gxed/hashland/murmur3/LICENSE b/vendor/github.com/gxed/hashland/murmur3/LICENSE deleted file mode 100644 index 2a46fd75..00000000 --- a/vendor/github.com/gxed/hashland/murmur3/LICENSE +++ /dev/null @@ -1,24 +0,0 @@ -Copyright 2013, Sébastien Paolacci. -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 library 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/gxed/hashland/murmur3/README.md b/vendor/github.com/gxed/hashland/murmur3/README.md deleted file mode 100644 index 1edf6230..00000000 --- a/vendor/github.com/gxed/hashland/murmur3/README.md +++ /dev/null @@ -1,84 +0,0 @@ -murmur3 -======= - -Native Go implementation of Austin Appleby's third MurmurHash revision (aka -MurmurHash3). - -Reference algorithm has been slightly hacked as to support the streaming mode -required by Go's standard [Hash interface](http://golang.org/pkg/hash/#Hash). - - -Benchmarks ----------- - -Go tip as of 2014-06-12 (i.e almost go1.3), core i7 @ 3.4 Ghz. All runs -include hasher instantiation and sequence finalization. - -
-
-Benchmark32_1        500000000     7.69 ns/op      130.00 MB/s
-Benchmark32_2        200000000     8.83 ns/op      226.42 MB/s
-Benchmark32_4        500000000     7.99 ns/op      500.39 MB/s
-Benchmark32_8        200000000     9.47 ns/op      844.69 MB/s
-Benchmark32_16       100000000     12.1 ns/op     1321.61 MB/s
-Benchmark32_32       100000000     18.3 ns/op     1743.93 MB/s
-Benchmark32_64        50000000     30.9 ns/op     2071.64 MB/s
-Benchmark32_128       50000000     57.6 ns/op     2222.96 MB/s
-Benchmark32_256       20000000      116 ns/op     2188.60 MB/s
-Benchmark32_512       10000000      226 ns/op     2260.59 MB/s
-Benchmark32_1024       5000000      452 ns/op     2263.73 MB/s
-Benchmark32_2048       2000000      891 ns/op     2296.02 MB/s
-Benchmark32_4096       1000000     1787 ns/op     2290.92 MB/s
-Benchmark32_8192        500000     3593 ns/op     2279.68 MB/s
-Benchmark128_1       100000000     26.1 ns/op       38.33 MB/s
-Benchmark128_2       100000000     29.0 ns/op       69.07 MB/s
-Benchmark128_4        50000000     29.8 ns/op      134.17 MB/s
-Benchmark128_8        50000000     31.6 ns/op      252.86 MB/s
-Benchmark128_16      100000000     26.5 ns/op      603.42 MB/s
-Benchmark128_32      100000000     28.6 ns/op     1117.15 MB/s
-Benchmark128_64       50000000     35.5 ns/op     1800.97 MB/s
-Benchmark128_128      50000000     50.9 ns/op     2515.50 MB/s
-Benchmark128_256      20000000     76.9 ns/op     3330.11 MB/s
-Benchmark128_512      20000000      135 ns/op     3769.09 MB/s
-Benchmark128_1024     10000000      250 ns/op     4094.38 MB/s
-Benchmark128_2048      5000000      477 ns/op     4290.75 MB/s
-Benchmark128_4096      2000000      940 ns/op     4353.29 MB/s
-Benchmark128_8192      1000000     1838 ns/op     4455.47 MB/s
-
-
- - -
-
-benchmark              Go1.0 MB/s    Go1.1 MB/s  speedup    Go1.2 MB/s  speedup    Go1.3 MB/s  speedup
-Benchmark32_1               98.90        118.59    1.20x        114.79    0.97x        130.00    1.13x
-Benchmark32_2              168.04        213.31    1.27x        210.65    0.99x        226.42    1.07x
-Benchmark32_4              414.01        494.19    1.19x        490.29    0.99x        500.39    1.02x
-Benchmark32_8              662.19        836.09    1.26x        836.46    1.00x        844.69    1.01x
-Benchmark32_16             917.46       1304.62    1.42x       1297.63    0.99x       1321.61    1.02x
-Benchmark32_32            1141.93       1737.54    1.52x       1728.24    0.99x       1743.93    1.01x
-Benchmark32_64            1289.47       2039.51    1.58x       2038.20    1.00x       2071.64    1.02x
-Benchmark32_128           1299.23       2097.63    1.61x       2177.13    1.04x       2222.96    1.02x
-Benchmark32_256           1369.90       2202.34    1.61x       2213.15    1.00x       2188.60    0.99x
-Benchmark32_512           1399.56       2255.72    1.61x       2264.49    1.00x       2260.59    1.00x
-Benchmark32_1024          1410.90       2285.82    1.62x       2270.99    0.99x       2263.73    1.00x
-Benchmark32_2048          1422.14       2297.62    1.62x       2269.59    0.99x       2296.02    1.01x
-Benchmark32_4096          1420.53       2307.81    1.62x       2273.43    0.99x       2290.92    1.01x
-Benchmark32_8192          1424.79       2312.87    1.62x       2286.07    0.99x       2279.68    1.00x
-Benchmark128_1               8.32         30.15    3.62x         30.84    1.02x         38.33    1.24x
-Benchmark128_2              16.38         59.72    3.65x         59.37    0.99x         69.07    1.16x
-Benchmark128_4              32.26        112.96    3.50x        114.24    1.01x        134.17    1.17x
-Benchmark128_8              62.68        217.88    3.48x        218.18    1.00x        252.86    1.16x
-Benchmark128_16            128.47        451.57    3.51x        474.65    1.05x        603.42    1.27x
-Benchmark128_32            246.18        910.42    3.70x        871.06    0.96x       1117.15    1.28x
-Benchmark128_64            449.05       1477.64    3.29x       1449.24    0.98x       1800.97    1.24x
-Benchmark128_128           762.61       2222.42    2.91x       2217.30    1.00x       2515.50    1.13x
-Benchmark128_256          1179.92       3005.46    2.55x       2931.55    0.98x       3330.11    1.14x
-Benchmark128_512          1616.51       3590.75    2.22x       3592.08    1.00x       3769.09    1.05x
-Benchmark128_1024         1964.36       3979.67    2.03x       4034.01    1.01x       4094.38    1.01x
-Benchmark128_2048         2225.07       4156.93    1.87x       4244.17    1.02x       4290.75    1.01x
-Benchmark128_4096         2360.15       4299.09    1.82x       4392.35    1.02x       4353.29    0.99x
-Benchmark128_8192         2411.50       4356.84    1.81x       4480.68    1.03x       4455.47    0.99x
-
-
- diff --git a/vendor/github.com/gxed/hashland/murmur3/go.mod b/vendor/github.com/gxed/hashland/murmur3/go.mod deleted file mode 100644 index bef23952..00000000 --- a/vendor/github.com/gxed/hashland/murmur3/go.mod +++ /dev/null @@ -1 +0,0 @@ -module github.com/gxed/hashland/murmur3 diff --git a/vendor/github.com/gxed/hashland/murmur3/murmur.go b/vendor/github.com/gxed/hashland/murmur3/murmur.go deleted file mode 100644 index f99557cc..00000000 --- a/vendor/github.com/gxed/hashland/murmur3/murmur.go +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright 2013, Sébastien Paolacci. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -/* -Native (and fast) implementation of Austin Appleby's MurmurHash3. - -Package murmur3 implements Austin Appleby's non-cryptographic MurmurHash3. - - Reference implementation: - http://code.google.com/p/smhasher/wiki/MurmurHash3 - - History, characteristics and (legacy) perfs: - https://sites.google.com/site/murmurhash/ - https://sites.google.com/site/murmurhash/statistics -*/ -package murmur3 - -type bmixer interface { - bmix(p []byte) (tail []byte) - Size() (n int) - reset() -} - -type digest struct { - clen int // Digested input cumulative length. - tail []byte // 0 to Size()-1 bytes view of `buf'. - buf [16]byte // Expected (but not required) to be Size() large. - bmixer -} - -func (d *digest) BlockSize() int { return 1 } - -func (d *digest) Write(p []byte) (n int, err error) { - n = len(p) - d.clen += n - - if len(d.tail) > 0 { - // Stick back pending bytes. - nfree := d.Size() - len(d.tail) // nfree ∈ [1, d.Size()-1]. - if nfree < len(p) { - // One full block can be formed. - block := append(d.tail, p[:nfree]...) - p = p[nfree:] - _ = d.bmix(block) // No tail. - } else { - // Tail's buf is large enough to prevent reallocs. - p = append(d.tail, p...) - } - } - - d.tail = d.bmix(p) - - // Keep own copy of the 0 to Size()-1 pending bytes. - nn := copy(d.buf[:], d.tail) - d.tail = d.buf[:nn] - - return n, nil -} - -func (d *digest) Reset() { - d.clen = 0 - d.tail = nil - d.bmixer.reset() -} diff --git a/vendor/github.com/gxed/hashland/murmur3/murmur128.go b/vendor/github.com/gxed/hashland/murmur3/murmur128.go deleted file mode 100644 index 16c34d6f..00000000 --- a/vendor/github.com/gxed/hashland/murmur3/murmur128.go +++ /dev/null @@ -1,189 +0,0 @@ -package murmur3 - -import ( - //"encoding/binary" - "hash" - "unsafe" -) - -const ( - c1_128 = 0x87c37b91114253d5 - c2_128 = 0x4cf5ad432745937f -) - -// Make sure interfaces are correctly implemented. -var ( - _ hash.Hash = new(digest128) - _ Hash128 = new(digest128) - _ bmixer = new(digest128) -) - -// Hack: the standard api doesn't define any Hash128 interface. -type Hash128 interface { - hash.Hash - Sum128() (uint64, uint64) -} - -// digest128 represents a partial evaluation of a 128 bites hash. -type digest128 struct { - digest - h1 uint64 // Unfinalized running hash part 1. - h2 uint64 // Unfinalized running hash part 2. -} - -func New128() Hash128 { - d := new(digest128) - d.bmixer = d - d.Reset() - return d -} - -func (d *digest128) Size() int { return 16 } - -func (d *digest128) reset() { d.h1, d.h2 = 0, 0 } - -func (d *digest128) Sum(b []byte) []byte { - h1, h2 := d.h1, d.h2 - return append(b, - byte(h1>>56), byte(h1>>48), byte(h1>>40), byte(h1>>32), - byte(h1>>24), byte(h1>>16), byte(h1>>8), byte(h1), - - byte(h2>>56), byte(h2>>48), byte(h2>>40), byte(h2>>32), - byte(h2>>24), byte(h2>>16), byte(h2>>8), byte(h2), - ) -} - -func (d *digest128) bmix(p []byte) (tail []byte) { - h1, h2 := d.h1, d.h2 - - nblocks := len(p) / 16 - for i := 0; i < nblocks; i++ { - t := (*[2]uint64)(unsafe.Pointer(&p[i*16])) - k1, k2 := t[0], t[1] - - k1 *= c1_128 - k1 = (k1 << 31) | (k1 >> 33) // rotl64(k1, 31) - k1 *= c2_128 - h1 ^= k1 - - h1 = (h1 << 27) | (h1 >> 37) // rotl64(h1, 27) - h1 += h2 - h1 = h1*5 + 0x52dce729 - - k2 *= c2_128 - k2 = (k2 << 33) | (k2 >> 31) // rotl64(k2, 33) - k2 *= c1_128 - h2 ^= k2 - - h2 = (h2 << 31) | (h2 >> 33) // rotl64(h2, 31) - h2 += h1 - h2 = h2*5 + 0x38495ab5 - } - d.h1, d.h2 = h1, h2 - return p[nblocks*d.Size():] -} - -func (d *digest128) Sum128() (h1, h2 uint64) { - - h1, h2 = d.h1, d.h2 - - var k1, k2 uint64 - switch len(d.tail) & 15 { - case 15: - k2 ^= uint64(d.tail[14]) << 48 - fallthrough - case 14: - k2 ^= uint64(d.tail[13]) << 40 - fallthrough - case 13: - k2 ^= uint64(d.tail[12]) << 32 - fallthrough - case 12: - k2 ^= uint64(d.tail[11]) << 24 - fallthrough - case 11: - k2 ^= uint64(d.tail[10]) << 16 - fallthrough - case 10: - k2 ^= uint64(d.tail[9]) << 8 - fallthrough - case 9: - k2 ^= uint64(d.tail[8]) << 0 - - k2 *= c2_128 - k2 = (k2 << 33) | (k2 >> 31) // rotl64(k2, 33) - k2 *= c1_128 - h2 ^= k2 - - fallthrough - - case 8: - k1 ^= uint64(d.tail[7]) << 56 - fallthrough - case 7: - k1 ^= uint64(d.tail[6]) << 48 - fallthrough - case 6: - k1 ^= uint64(d.tail[5]) << 40 - fallthrough - case 5: - k1 ^= uint64(d.tail[4]) << 32 - fallthrough - case 4: - k1 ^= uint64(d.tail[3]) << 24 - fallthrough - case 3: - k1 ^= uint64(d.tail[2]) << 16 - fallthrough - case 2: - k1 ^= uint64(d.tail[1]) << 8 - fallthrough - case 1: - k1 ^= uint64(d.tail[0]) << 0 - k1 *= c1_128 - k1 = (k1 << 31) | (k1 >> 33) // rotl64(k1, 31) - k1 *= c2_128 - h1 ^= k1 - } - - h1 ^= uint64(d.clen) - h2 ^= uint64(d.clen) - - h1 += h2 - h2 += h1 - - h1 = fmix64(h1) - h2 = fmix64(h2) - - h1 += h2 - h2 += h1 - - return h1, h2 -} - -func fmix64(k uint64) uint64 { - k ^= k >> 33 - k *= 0xff51afd7ed558ccd - k ^= k >> 33 - k *= 0xc4ceb9fe1a85ec53 - k ^= k >> 33 - return k -} - -/* -func rotl64(x uint64, r byte) uint64 { - return (x << r) | (x >> (64 - r)) -} -*/ - -// Sum128 returns the MurmurHash3 sum of data. It is equivalent to the -// following sequence (without the extra burden and the extra allocation): -// hasher := New128() -// hasher.Write(data) -// return hasher.Sum128() -func Sum128(data []byte) (h1 uint64, h2 uint64) { - d := &digest128{h1: 0, h2: 0} - d.tail = d.bmix(data) - d.clen = len(data) - return d.Sum128() -} diff --git a/vendor/github.com/gxed/hashland/murmur3/murmur32.go b/vendor/github.com/gxed/hashland/murmur3/murmur32.go deleted file mode 100644 index bc89d268..00000000 --- a/vendor/github.com/gxed/hashland/murmur3/murmur32.go +++ /dev/null @@ -1,154 +0,0 @@ -package murmur3 - -// http://code.google.com/p/guava-libraries/source/browse/guava/src/com/google/common/hash/Murmur3_32HashFunction.java - -import ( - "hash" - "unsafe" -) - -// Make sure interfaces are correctly implemented. -var ( - _ hash.Hash = new(digest32) - _ hash.Hash32 = new(digest32) -) - -const ( - c1_32 uint32 = 0xcc9e2d51 - c2_32 uint32 = 0x1b873593 -) - -// digest32 represents a partial evaluation of a 32 bites hash. -type digest32 struct { - digest - h1 uint32 // Unfinalized running hash. -} - -func New32() hash.Hash32 { - d := new(digest32) - d.bmixer = d - d.Reset() - return d -} - -func (d *digest32) Size() int { return 4 } - -func (d *digest32) reset() { d.h1 = 0 } - -func (d *digest32) Sum(b []byte) []byte { - h := d.h1 - return append(b, byte(h>>24), byte(h>>16), byte(h>>8), byte(h)) -} - -// Digest as many blocks as possible. -func (d *digest32) bmix(p []byte) (tail []byte) { - h1 := d.h1 - - nblocks := len(p) / 4 - for i := 0; i < nblocks; i++ { - k1 := *(*uint32)(unsafe.Pointer(&p[i*4])) - - k1 *= c1_32 - k1 = (k1 << 15) | (k1 >> 17) // rotl32(k1, 15) - k1 *= c2_32 - - h1 ^= k1 - h1 = (h1 << 13) | (h1 >> 19) // rotl32(h1, 13) - h1 = h1*5 + 0xe6546b64 - } - d.h1 = h1 - return p[nblocks*d.Size():] -} - -func (d *digest32) Sum32() (h1 uint32) { - - h1 = d.h1 - - var k1 uint32 - switch len(d.tail) & 3 { - case 3: - k1 ^= uint32(d.tail[2]) << 16 - fallthrough - case 2: - k1 ^= uint32(d.tail[1]) << 8 - fallthrough - case 1: - k1 ^= uint32(d.tail[0]) - k1 *= c1_32 - k1 = (k1 << 15) | (k1 >> 17) // rotl32(k1, 15) - k1 *= c2_32 - h1 ^= k1 - } - - h1 ^= uint32(d.clen) - - h1 ^= h1 >> 16 - h1 *= 0x85ebca6b - h1 ^= h1 >> 13 - h1 *= 0xc2b2ae35 - h1 ^= h1 >> 16 - - return h1 -} - -/* -func rotl32(x uint32, r byte) uint32 { - return (x << r) | (x >> (32 - r)) -} -*/ - -// Sum32 returns the MurmurHash3 sum of data. It is equivalent to the -// following sequence (without the extra burden and the extra allocation): -// hasher := New32() -// hasher.Write(data) -// return hasher.Sum32() -func Sum32(data []byte) uint32 { - - var h1 uint32 = 0 - - nblocks := len(data) / 4 - var p uintptr - if len(data) > 0 { - p = uintptr(unsafe.Pointer(&data[0])) - } - p1 := p + uintptr(4*nblocks) - for ; p < p1; p += 4 { - k1 := *(*uint32)(unsafe.Pointer(p)) - - k1 *= c1_32 - k1 = (k1 << 15) | (k1 >> 17) // rotl32(k1, 15) - k1 *= c2_32 - - h1 ^= k1 - h1 = (h1 << 13) | (h1 >> 19) // rotl32(h1, 13) - h1 = h1*5 + 0xe6546b64 - } - - tail := data[nblocks*4:] - - var k1 uint32 - switch len(tail) & 3 { - case 3: - k1 ^= uint32(tail[2]) << 16 - fallthrough - case 2: - k1 ^= uint32(tail[1]) << 8 - fallthrough - case 1: - k1 ^= uint32(tail[0]) - k1 *= c1_32 - k1 = (k1 << 15) | (k1 >> 17) // rotl32(k1, 15) - k1 *= c2_32 - h1 ^= k1 - } - - h1 ^= uint32(len(data)) - - h1 ^= h1 >> 16 - h1 *= 0x85ebca6b - h1 ^= h1 >> 13 - h1 *= 0xc2b2ae35 - h1 ^= h1 >> 16 - - return h1 -} diff --git a/vendor/github.com/gxed/hashland/murmur3/murmur64.go b/vendor/github.com/gxed/hashland/murmur3/murmur64.go deleted file mode 100644 index fdd4398e..00000000 --- a/vendor/github.com/gxed/hashland/murmur3/murmur64.go +++ /dev/null @@ -1,45 +0,0 @@ -package murmur3 - -import ( - "hash" -) - -// Make sure interfaces are correctly implemented. -var ( - _ hash.Hash = new(digest64) - _ hash.Hash64 = new(digest64) - _ bmixer = new(digest64) -) - -// digest64 is half a digest128. -type digest64 digest128 - -func New64() hash.Hash64 { - d := (*digest64)(New128().(*digest128)) - return d -} - -func (d *digest64) Sum(b []byte) []byte { - h1 := d.h1 - return append(b, - byte(h1>>56), byte(h1>>48), byte(h1>>40), byte(h1>>32), - byte(h1>>24), byte(h1>>16), byte(h1>>8), byte(h1)) -} - -func (d *digest64) Sum64() uint64 { - h1, _ := (*digest128)(d).Sum128() - return h1 -} - -// Sum64 returns the MurmurHash3 sum of data. It is equivalent to the -// following sequence (without the extra burden and the extra allocation): -// hasher := New64() -// hasher.Write(data) -// return hasher.Sum64() -func Sum64(data []byte) uint64 { - d := &digest128{h1: 0, h2: 0} - d.tail = d.bmix(data) - d.clen = len(data) - h1, _ := d.Sum128() - return h1 -} diff --git a/vendor/github.com/hpcloud/tail/.travis.yml b/vendor/github.com/hpcloud/tail/.travis.yml index ad8971f8..9cf8bb7f 100644 --- a/vendor/github.com/hpcloud/tail/.travis.yml +++ b/vendor/github.com/hpcloud/tail/.travis.yml @@ -4,10 +4,9 @@ script: - go test -race -v ./... go: + - 1.4 - 1.5 - 1.6 - - 1.7 - - 1.8 - tip matrix: @@ -15,5 +14,5 @@ matrix: - go: tip install: - - go get gopkg.in/fsnotify/fsnotify.v1 + - go get gopkg.in/fsnotify.v1 - go get gopkg.in/tomb.v1 diff --git a/vendor/github.com/hpcloud/tail/README.md b/vendor/github.com/hpcloud/tail/README.md index ed8bd9ac..fb7fbc26 100644 --- a/vendor/github.com/hpcloud/tail/README.md +++ b/vendor/github.com/hpcloud/tail/README.md @@ -1,5 +1,5 @@ [![Build Status](https://travis-ci.org/hpcloud/tail.svg)](https://travis-ci.org/hpcloud/tail) -[![Build status](https://ci.appveyor.com/api/projects/status/vrl3paf9md0a7bgk/branch/master?svg=true)](https://ci.appveyor.com/project/Nino-K/tail/branch/master) +[![Build status](https://ci.appveyor.com/api/projects/status/kohpsf3rvhjhrox6?svg=true)](https://ci.appveyor.com/project/HelionCloudFoundry/tail) # Go package for tail-ing files diff --git a/vendor/github.com/hpcloud/tail/ratelimiter/memory.go b/vendor/github.com/hpcloud/tail/ratelimiter/memory.go index bf3c2131..8f6a5784 100644 --- a/vendor/github.com/hpcloud/tail/ratelimiter/memory.go +++ b/vendor/github.com/hpcloud/tail/ratelimiter/memory.go @@ -5,10 +5,7 @@ import ( "time" ) -const ( - GC_SIZE int = 100 - GC_PERIOD time.Duration = 60 * time.Second -) +const GC_SIZE int = 100 type Memory struct { store map[string]LeakyBucket @@ -47,10 +44,11 @@ func (m *Memory) GarbageCollect() { now := time.Now() // rate limit GC to once per minute - if now.Unix() >= m.lastGCCollected.Add(GC_PERIOD).Unix() { + if now.Add(60*time.Second).Unix() > m.lastGCCollected.Unix() { + for key, bucket := range m.store { // if the bucket is drained, then GC - if bucket.DrainedAt().Unix() < now.Unix() { + if bucket.DrainedAt().Unix() > now.Unix() { delete(m.store, key) } } diff --git a/vendor/github.com/hpcloud/tail/tail.go b/vendor/github.com/hpcloud/tail/tail.go index c99cdaa2..2d252d60 100644 --- a/vendor/github.com/hpcloud/tail/tail.go +++ b/vendor/github.com/hpcloud/tail/tail.go @@ -22,7 +22,7 @@ import ( ) var ( - ErrStop = errors.New("tail should now stop") + ErrStop = fmt.Errorf("tail should now stop") ) type Line struct { @@ -250,7 +250,7 @@ func (tail *Tail) tailFileSync() { tail.openReader() - var offset int64 + var offset int64 = 0 var err error // Read line by line. @@ -273,9 +273,10 @@ func (tail *Tail) tailFileSync() { if cooloff { // Wait a second before seeking till the end of // file when rate limit is reached. - msg := ("Too much log activity; waiting a second " + - "before resuming tailing") - tail.Lines <- &Line{msg, time.Now(), errors.New(msg)} + msg := fmt.Sprintf( + "Too much log activity; waiting a second " + + "before resuming tailing") + tail.Lines <- &Line{msg, time.Now(), fmt.Errorf(msg)} select { case <-time.After(time.Second): case <-tail.Dying(): diff --git a/vendor/github.com/hpcloud/tail/watch/filechanges.go b/vendor/github.com/hpcloud/tail/watch/filechanges.go index f80aead9..3ce5dcec 100644 --- a/vendor/github.com/hpcloud/tail/watch/filechanges.go +++ b/vendor/github.com/hpcloud/tail/watch/filechanges.go @@ -8,7 +8,7 @@ type FileChanges struct { func NewFileChanges() *FileChanges { return &FileChanges{ - make(chan bool, 1), make(chan bool, 1), make(chan bool, 1)} + make(chan bool), make(chan bool), make(chan bool)} } func (fc *FileChanges) NotifyModified() { diff --git a/vendor/github.com/hpcloud/tail/watch/inotify.go b/vendor/github.com/hpcloud/tail/watch/inotify.go index 2bbfe0b6..4478f1e1 100644 --- a/vendor/github.com/hpcloud/tail/watch/inotify.go +++ b/vendor/github.com/hpcloud/tail/watch/inotify.go @@ -10,7 +10,7 @@ import ( "github.com/hpcloud/tail/util" - "gopkg.in/fsnotify/fsnotify.v1" + "gopkg.in/fsnotify.v1" "gopkg.in/tomb.v1" ) @@ -75,6 +75,7 @@ func (fw *InotifyFileWatcher) ChangeEvents(t *tomb.Tomb, pos int64) (*FileChange fw.Size = pos go func() { + defer RemoveWatch(fw.Filename) events := Events(fw.Filename) @@ -87,11 +88,9 @@ func (fw *InotifyFileWatcher) ChangeEvents(t *tomb.Tomb, pos int64) (*FileChange select { case evt, ok = <-events: if !ok { - RemoveWatch(fw.Filename) return } case <-t.Dying(): - RemoveWatch(fw.Filename) return } @@ -100,19 +99,13 @@ func (fw *InotifyFileWatcher) ChangeEvents(t *tomb.Tomb, pos int64) (*FileChange fallthrough case evt.Op&fsnotify.Rename == fsnotify.Rename: - RemoveWatch(fw.Filename) changes.NotifyDeleted() return - //With an open fd, unlink(fd) - inotify returns IN_ATTRIB (==fsnotify.Chmod) - case evt.Op&fsnotify.Chmod == fsnotify.Chmod: - fallthrough - case evt.Op&fsnotify.Write == fsnotify.Write: fi, err := os.Stat(fw.Filename) if err != nil { if os.IsNotExist(err) { - RemoveWatch(fw.Filename) changes.NotifyDeleted() return } diff --git a/vendor/github.com/hpcloud/tail/watch/inotify_tracker.go b/vendor/github.com/hpcloud/tail/watch/inotify_tracker.go index 739b3c2a..03be4275 100644 --- a/vendor/github.com/hpcloud/tail/watch/inotify_tracker.go +++ b/vendor/github.com/hpcloud/tail/watch/inotify_tracker.go @@ -12,7 +12,7 @@ import ( "github.com/hpcloud/tail/util" - "gopkg.in/fsnotify/fsnotify.v1" + "gopkg.in/fsnotify.v1" ) type InotifyTracker struct { @@ -83,21 +83,21 @@ func watch(winfo *watchInfo) error { } // RemoveWatch signals the run goroutine to remove the watch for the input filename -func RemoveWatch(fname string) error { - return remove(&watchInfo{ +func RemoveWatch(fname string) { + remove(&watchInfo{ fname: fname, }) } // RemoveWatch create signals the run goroutine to remove the watch for the input filename -func RemoveWatchCreate(fname string) error { - return remove(&watchInfo{ +func RemoveWatchCreate(fname string) { + remove(&watchInfo{ op: fsnotify.Create, fname: fname, }) } -func remove(winfo *watchInfo) error { +func remove(winfo *watchInfo) { // start running the shared InotifyTracker if not already running once.Do(goRun) @@ -108,10 +108,27 @@ func remove(winfo *watchInfo) error { delete(shared.done, winfo.fname) close(done) } + + fname := winfo.fname + if winfo.isCreate() { + // Watch for new files to be created in the parent directory. + fname = filepath.Dir(fname) + } + shared.watchNums[fname]-- + watchNum := shared.watchNums[fname] + if watchNum == 0 { + delete(shared.watchNums, fname) + } shared.mux.Unlock() + // If we were the last ones to watch this file, unsubscribe from inotify. + // This needs to happen after releasing the lock because fsnotify waits + // synchronously for the kernel to acknowledge the removal of the watch + // for this file, which causes us to deadlock if we still held the lock. + if watchNum == 0 { + shared.watcher.Remove(fname) + } shared.remove <- winfo - return <-shared.error } // Events returns a channel to which FileEvents corresponding to the input filename @@ -125,8 +142,8 @@ func Events(fname string) <-chan fsnotify.Event { } // Cleanup removes the watch for the input filename if necessary. -func Cleanup(fname string) error { - return RemoveWatch(fname) +func Cleanup(fname string) { + RemoveWatch(fname) } // watchFlags calls fsnotify.WatchFlags for the input filename and flags, creating @@ -137,8 +154,6 @@ func (shared *InotifyTracker) addWatch(winfo *watchInfo) error { if shared.chans[winfo.fname] == nil { shared.chans[winfo.fname] = make(chan fsnotify.Event) - } - if shared.done[winfo.fname] == nil { shared.done[winfo.fname] = make(chan bool) } @@ -148,50 +163,47 @@ func (shared *InotifyTracker) addWatch(winfo *watchInfo) error { fname = filepath.Dir(fname) } - var err error // already in inotify watch - if shared.watchNums[fname] == 0 { - err = shared.watcher.Add(fname) + if shared.watchNums[fname] > 0 { + shared.watchNums[fname]++ + if winfo.isCreate() { + shared.watchNums[winfo.fname]++ + } + return nil } + + err := shared.watcher.Add(fname) if err == nil { shared.watchNums[fname]++ + if winfo.isCreate() { + shared.watchNums[winfo.fname]++ + } } return err } // removeWatch calls fsnotify.RemoveWatch for the input filename and closes the // corresponding events channel. -func (shared *InotifyTracker) removeWatch(winfo *watchInfo) error { +func (shared *InotifyTracker) removeWatch(winfo *watchInfo) { shared.mux.Lock() + defer shared.mux.Unlock() ch := shared.chans[winfo.fname] - if ch != nil { - delete(shared.chans, winfo.fname) - close(ch) + if ch == nil { + return } - fname := winfo.fname - if winfo.isCreate() { - // Watch for new files to be created in the parent directory. - fname = filepath.Dir(fname) - } - shared.watchNums[fname]-- - watchNum := shared.watchNums[fname] - if watchNum == 0 { - delete(shared.watchNums, fname) - } - shared.mux.Unlock() + delete(shared.chans, winfo.fname) + close(ch) - var err error - // If we were the last ones to watch this file, unsubscribe from inotify. - // This needs to happen after releasing the lock because fsnotify waits - // synchronously for the kernel to acknowledge the removal of the watch - // for this file, which causes us to deadlock if we still held the lock. - if watchNum == 0 { - err = shared.watcher.Remove(fname) + if !winfo.isCreate() { + return } - return err + shared.watchNums[winfo.fname]-- + if shared.watchNums[winfo.fname] == 0 { + delete(shared.watchNums, winfo.fname) + } } // sendEvent sends the input event to the appropriate Tail. @@ -226,7 +238,7 @@ func (shared *InotifyTracker) run() { shared.error <- shared.addWatch(winfo) case winfo := <-shared.remove: - shared.error <- shared.removeWatch(winfo) + shared.removeWatch(winfo) case event, open := <-shared.watcher.Events: if !open { diff --git a/vendor/github.com/ipfs/go-bitswap/.travis.yml b/vendor/github.com/ipfs/go-bitswap/.travis.yml index 4cfe98c2..923835bc 100644 --- a/vendor/github.com/ipfs/go-bitswap/.travis.yml +++ b/vendor/github.com/ipfs/go-bitswap/.travis.yml @@ -10,7 +10,6 @@ env: global: - GOTFLAGS="-race" matrix: - - BUILD_DEPTYPE=gx - BUILD_DEPTYPE=gomod diff --git a/vendor/github.com/ipfs/go-bitswap/bitswap.go b/vendor/github.com/ipfs/go-bitswap/bitswap.go index 217d5446..ec89982f 100644 --- a/vendor/github.com/ipfs/go-bitswap/bitswap.go +++ b/vendor/github.com/ipfs/go-bitswap/bitswap.go @@ -1,4 +1,4 @@ -// package bitswap implements the IPFS exchange interface with the BitSwap +// Package bitswap implements the IPFS exchange interface with the BitSwap // bilateral exchange protocol. package bitswap @@ -9,6 +9,7 @@ import ( "time" bssrs "github.com/ipfs/go-bitswap/sessionrequestsplitter" + delay "github.com/ipfs/go-ipfs-delay" decision "github.com/ipfs/go-bitswap/decision" bsgetter "github.com/ipfs/go-bitswap/getter" @@ -24,14 +25,12 @@ import ( blocks "github.com/ipfs/go-block-format" cid "github.com/ipfs/go-cid" blockstore "github.com/ipfs/go-ipfs-blockstore" - delay "github.com/ipfs/go-ipfs-delay" exchange "github.com/ipfs/go-ipfs-exchange-interface" - flags "github.com/ipfs/go-ipfs-flags" logging "github.com/ipfs/go-log" metrics "github.com/ipfs/go-metrics-interface" process "github.com/jbenet/goprocess" procctx "github.com/jbenet/goprocess/context" - peer "github.com/libp2p/go-libp2p-peer" + peer "github.com/libp2p/go-libp2p-core/peer" ) var log = logging.Logger("bitswap") @@ -39,19 +38,16 @@ var log = logging.Logger("bitswap") var _ exchange.SessionExchange = (*Bitswap)(nil) const ( - // maxProvidersPerRequest specifies the maximum number of providers desired - // from the network. This value is specified because the network streams - // results. - // TODO: if a 'non-nice' strategy is implemented, consider increasing this value - maxProvidersPerRequest = 3 - findProviderDelay = 1 * time.Second - providerRequestTimeout = time.Second * 10 // these requests take at _least_ two minutes at the moment. - provideTimeout = time.Minute * 3 - sizeBatchRequestChan = 32 + provideTimeout = time.Minute * 3 + defaultProvSearchDelay = time.Second ) var ( + // HasBlockBufferSize is the buffer size of the channel for new blocks + // that need to be provided. They should get pulled over by the + // provideCollector even before they are actually provided. + // TODO: Does this need to be this large givent that? HasBlockBufferSize = 256 provideKeysBufferSize = 2048 provideWorkerMax = 6 @@ -60,22 +56,36 @@ var ( metricsBuckets = []float64{1 << 6, 1 << 10, 1 << 14, 1 << 18, 1<<18 + 15, 1 << 22} ) -func init() { - if flags.LowMemMode { - HasBlockBufferSize = 64 - provideKeysBufferSize = 512 - provideWorkerMax = 16 +// Option defines the functional option type that can be used to configure +// bitswap instances +type Option func(*Bitswap) + +// ProvideEnabled is an option for enabling/disabling provide announcements +func ProvideEnabled(enabled bool) Option { + return func(bs *Bitswap) { + bs.provideEnabled = enabled + } +} + +// ProviderSearchDelay overwrites the global provider search delay +func ProviderSearchDelay(newProvSearchDelay time.Duration) Option { + return func(bs *Bitswap) { + bs.provSearchDelay = newProvSearchDelay } } -var rebroadcastDelay = delay.Fixed(time.Minute) +// RebroadcastDelay overwrites the global provider rebroadcast delay +func RebroadcastDelay(newRebroadcastDelay delay.D) Option { + return func(bs *Bitswap) { + bs.rebroadcastDelay = newRebroadcastDelay + } +} // New initializes a BitSwap instance that communicates over the provided // BitSwapNetwork. This function registers the returned instance as the network -// delegate. -// Runs until context is cancelled. +// delegate. Runs until context is cancelled or bitswap.Close is called. func New(parent context.Context, network bsnet.BitSwapNetwork, - bstore blockstore.Blockstore) exchange.Interface { + bstore blockstore.Blockstore, options ...Option) exchange.Interface { // important to use provided parent context (since it may include important // loggable data). It's probably not a good idea to allow bitswap to be @@ -102,11 +112,13 @@ func New(parent context.Context, network bsnet.BitSwapNetwork, return bsmq.New(ctx, p, network) } - wm := bswm.New(ctx) + wm := bswm.New(ctx, bspm.New(ctx, peerQueueFactory)) pqm := bspqm.New(ctx, network) - sessionFactory := func(ctx context.Context, id uint64, pm bssession.PeerManager, srs bssession.RequestSplitter) bssm.Session { - return bssession.New(ctx, id, wm, pm, srs) + sessionFactory := func(ctx context.Context, id uint64, pm bssession.PeerManager, srs bssession.RequestSplitter, + provSearchDelay time.Duration, + rebroadcastDelay delay.D) bssm.Session { + return bssession.New(ctx, id, wm, pm, srs, provSearchDelay, rebroadcastDelay) } sessionPeerManagerFactory := func(ctx context.Context, id uint64) bssession.PeerManager { return bsspm.New(ctx, id, network.ConnectionManager(), pqm) @@ -116,29 +128,35 @@ func New(parent context.Context, network bsnet.BitSwapNetwork, } bs := &Bitswap{ - blockstore: bstore, - engine: decision.NewEngine(ctx, bstore), // TODO close the engine with Close() method - network: network, - process: px, - newBlocks: make(chan cid.Cid, HasBlockBufferSize), - provideKeys: make(chan cid.Cid, provideKeysBufferSize), - wm: wm, - pqm: pqm, - pm: bspm.New(ctx, peerQueueFactory), - sm: bssm.New(ctx, sessionFactory, sessionPeerManagerFactory, sessionRequestSplitterFactory), - counters: new(counters), - dupMetric: dupHist, - allMetric: allHist, - sentHistogram: sentHistogram, + blockstore: bstore, + engine: decision.NewEngine(ctx, bstore, network.ConnectionManager()), // TODO close the engine with Close() method + network: network, + process: px, + newBlocks: make(chan cid.Cid, HasBlockBufferSize), + provideKeys: make(chan cid.Cid, provideKeysBufferSize), + wm: wm, + pqm: pqm, + sm: bssm.New(ctx, sessionFactory, sessionPeerManagerFactory, sessionRequestSplitterFactory), + counters: new(counters), + dupMetric: dupHist, + allMetric: allHist, + sentHistogram: sentHistogram, + provideEnabled: true, + provSearchDelay: defaultProvSearchDelay, + rebroadcastDelay: delay.Fixed(time.Minute), + } + + // apply functional options before starting and running bitswap + for _, option := range options { + option(bs) } - bs.wm.SetDelegate(bs.pm) bs.wm.Startup() bs.pqm.Startup() network.SetDelegate(bs) // Start up bitswaps async worker routines - bs.startWorkers(px, ctx) + bs.startWorkers(ctx, px) // bind the context and process. // do it over here to avoid closing before all setup is done. @@ -153,10 +171,6 @@ func New(parent context.Context, network bsnet.BitSwapNetwork, // Bitswap instances implement the bitswap protocol. type Bitswap struct { - // the peermanager manages sending messages to peers in a way that - // wont block bitswap operation - pm *bspm.PeerManager - // the wantlist tracks global wants for bitswap wm *bswm.WantManager @@ -193,6 +207,15 @@ type Bitswap struct { // the sessionmanager manages tracking sessions sm *bssm.SessionManager + + // whether or not to make provide announcements + provideEnabled bool + + // how long to wait before looking for providers in a session + provSearchDelay time.Duration + + // how often to rebroadcast providing requests to find more optimized providers + rebroadcastDelay delay.D } type counters struct { @@ -205,17 +228,14 @@ type counters struct { messagesRecvd uint64 } -type blockRequest struct { - Cid cid.Cid - Ctx context.Context -} - // GetBlock attempts to retrieve a particular block from peers within the // deadline enforced by the context. func (bs *Bitswap) GetBlock(parent context.Context, k cid.Cid) (blocks.Block, error) { return bsgetter.SyncGetBlock(parent, k, bs.GetBlocks) } +// WantlistForPeer returns the currently understood list of blocks requested by a +// given peer. func (bs *Bitswap) WantlistForPeer(p peer.ID) []cid.Cid { var out []cid.Cid for _, e := range bs.engine.WantlistForPeer(p) { @@ -224,6 +244,8 @@ func (bs *Bitswap) WantlistForPeer(p peer.ID) []cid.Cid { return out } +// LedgerForPeer returns aggregated data about blocks swapped and communication +// with a given peer. func (bs *Bitswap) LedgerForPeer(p peer.ID) *decision.Receipt { return bs.engine.LedgerForPeer(p) } @@ -236,7 +258,7 @@ func (bs *Bitswap) LedgerForPeer(p peer.ID) *decision.Receipt { // resources, provide a context with a reasonably short deadline (ie. not one // that lasts throughout the lifetime of the server) func (bs *Bitswap) GetBlocks(ctx context.Context, keys []cid.Cid) (<-chan blocks.Block, error) { - session := bs.sm.NewSession(ctx) + session := bs.sm.NewSession(ctx, bs.provSearchDelay, bs.rebroadcastDelay) return session.GetBlocks(ctx, keys) } @@ -273,15 +295,19 @@ func (bs *Bitswap) receiveBlockFrom(blk blocks.Block, from peer.ID) error { bs.engine.AddBlock(blk) - select { - case bs.newBlocks <- blk.Cid(): - // send block off to be reprovided - case <-bs.process.Closing(): - return bs.process.Close() + if bs.provideEnabled { + select { + case bs.newBlocks <- blk.Cid(): + // send block off to be reprovided + case <-bs.process.Closing(): + return bs.process.Close() + } } return nil } +// ReceiveMessage is called by the network interface when a new message is +// received. func (bs *Bitswap) ReceiveMessage(ctx context.Context, p peer.ID, incoming bsmsg.BitSwapMessage) { bs.counterLk.Lock() bs.counters.messagesRecvd++ @@ -324,8 +350,6 @@ func (bs *Bitswap) ReceiveMessage(ctx context.Context, p peer.ID, incoming bsmsg wg.Wait() } -var ErrAlreadyHaveBlock = errors.New("already have block") - func (bs *Bitswap) updateReceiveCounters(b blocks.Block) { blkLen := len(b.RawData()) has, err := bs.blockstore.Has(b.Cid()) @@ -351,28 +375,34 @@ func (bs *Bitswap) updateReceiveCounters(b blocks.Block) { } } -// Connected/Disconnected warns bitswap about peer connections. +// PeerConnected is called by the network interface +// when a peer initiates a new connection to bitswap. func (bs *Bitswap) PeerConnected(p peer.ID) { bs.wm.Connected(p) bs.engine.PeerConnected(p) } -// Connected/Disconnected warns bitswap about peer connections. +// PeerDisconnected is called by the network interface when a peer +// closes a connection func (bs *Bitswap) PeerDisconnected(p peer.ID) { bs.wm.Disconnected(p) bs.engine.PeerDisconnected(p) } +// ReceiveError is called by the network interface when an error happens +// at the network layer. Currently just logs error. func (bs *Bitswap) ReceiveError(err error) { log.Infof("Bitswap ReceiveError: %s", err) // TODO log the network error // TODO bubble the network error up to the parent context/error logger } +// Close is called to shutdown Bitswap func (bs *Bitswap) Close() error { return bs.process.Close() } +// GetWantlist returns the current local wantlist. func (bs *Bitswap) GetWantlist() []cid.Cid { entries := bs.wm.CurrentWants() out := make([]cid.Cid, 0, len(entries)) @@ -382,10 +412,17 @@ func (bs *Bitswap) GetWantlist() []cid.Cid { return out } +// IsOnline is needed to match go-ipfs-exchange-interface func (bs *Bitswap) IsOnline() bool { return true } +// NewSession generates a new Bitswap session. You should use this, rather +// that calling Bitswap.GetBlocks, any time you intend to do several related +// block requests in a row. The session returned will have it's own GetBlocks +// method, but the session will use the fact that the requests are related to +// be more efficient in its requests to peers. If you are using a session +// from go-blockservice, it will create a bitswap session automatically. func (bs *Bitswap) NewSession(ctx context.Context) exchange.Fetcher { - return bs.sm.NewSession(ctx) + return bs.sm.NewSession(ctx, bs.provSearchDelay, bs.rebroadcastDelay) } diff --git a/vendor/github.com/ipfs/go-bitswap/decision/engine.go b/vendor/github.com/ipfs/go-bitswap/decision/engine.go index a8e6f1d1..61bb4ca1 100644 --- a/vendor/github.com/ipfs/go-bitswap/decision/engine.go +++ b/vendor/github.com/ipfs/go-bitswap/decision/engine.go @@ -1,18 +1,22 @@ -// package decision implements the decision engine for the bitswap service. +// Package decision implements the decision engine for the bitswap service. package decision import ( "context" + "fmt" "sync" "time" + "github.com/google/uuid" bsmsg "github.com/ipfs/go-bitswap/message" wl "github.com/ipfs/go-bitswap/wantlist" - blocks "github.com/ipfs/go-block-format" + cid "github.com/ipfs/go-cid" bstore "github.com/ipfs/go-ipfs-blockstore" logging "github.com/ipfs/go-log" - peer "github.com/libp2p/go-libp2p-peer" + "github.com/ipfs/go-peertaskqueue" + "github.com/ipfs/go-peertaskqueue/peertask" + peer "github.com/libp2p/go-libp2p-core/peer" ) // TODO consider taking responsibility for other types of requests. For @@ -54,6 +58,11 @@ const ( outboxChanBuffer = 0 // maxMessageSize is the maximum size of the batched payload maxMessageSize = 512 * 1024 + // tagPrefix is the tag given to peers associated an engine + tagPrefix = "bs-engine-%s" + + // tagWeight is the default weight for peers associated with an engine + tagWeight = 5 ) // Envelope contains a message for a Peer. @@ -68,11 +77,19 @@ type Envelope struct { Sent func() } +// PeerTagger covers the methods on the connection manager used by the decision +// engine to tag peers +type PeerTagger interface { + TagPeer(peer.ID, string, int) + UntagPeer(p peer.ID, tag string) +} + +// Engine manages sending requested blocks to peers. type Engine struct { // peerRequestQueue is a priority queue of requests received from peers. // Requests are popped from the queue, packaged up, and placed in the // outbox. - peerRequestQueue *prq + peerRequestQueue *peertaskqueue.PeerTaskQueue // FIXME it's a bit odd for the client and the worker to both share memory // (both modify the peerRequestQueue) and also to communicate over the @@ -87,6 +104,9 @@ type Engine struct { bs bstore.Blockstore + peerTagger PeerTagger + + tag string lock sync.Mutex // protects the fields immediatly below // ledgerMap lists Ledgers by their Partner key. ledgerMap map[peer.ID]*ledger @@ -94,19 +114,31 @@ type Engine struct { ticker *time.Ticker } -func NewEngine(ctx context.Context, bs bstore.Blockstore) *Engine { +// NewEngine creates a new block sending engine for the given block store +func NewEngine(ctx context.Context, bs bstore.Blockstore, peerTagger PeerTagger) *Engine { e := &Engine{ - ledgerMap: make(map[peer.ID]*ledger), - bs: bs, - peerRequestQueue: newPRQ(), - outbox: make(chan (<-chan *Envelope), outboxChanBuffer), - workSignal: make(chan struct{}, 1), - ticker: time.NewTicker(time.Millisecond * 100), + ledgerMap: make(map[peer.ID]*ledger), + bs: bs, + peerTagger: peerTagger, + outbox: make(chan (<-chan *Envelope), outboxChanBuffer), + workSignal: make(chan struct{}, 1), + ticker: time.NewTicker(time.Millisecond * 100), } + e.tag = fmt.Sprintf(tagPrefix, uuid.New().String()) + e.peerRequestQueue = peertaskqueue.New(peertaskqueue.OnPeerAddedHook(e.onPeerAdded), peertaskqueue.OnPeerRemovedHook(e.onPeerRemoved)) go e.taskWorker(ctx) return e } +func (e *Engine) onPeerAdded(p peer.ID) { + e.peerTagger.TagPeer(p, e.tag, tagWeight) +} + +func (e *Engine) onPeerRemoved(p peer.ID) { + e.peerTagger.UntagPeer(p, e.tag) +} + +// WantlistForPeer returns the currently understood want list for a given peer func (e *Engine) WantlistForPeer(p peer.ID) (out []wl.Entry) { partner := e.findOrCreate(p) partner.lk.Lock() @@ -114,6 +146,8 @@ func (e *Engine) WantlistForPeer(p peer.ID) (out []wl.Entry) { return partner.wantList.SortedEntries() } +// LedgerForPeer returns aggregated data about blocks swapped and communication +// with a given peer. func (e *Engine) LedgerForPeer(p peer.ID) *Receipt { ledger := e.findOrCreate(p) @@ -154,23 +188,23 @@ func (e *Engine) taskWorker(ctx context.Context) { // context is cancelled before the next Envelope can be created. func (e *Engine) nextEnvelope(ctx context.Context) (*Envelope, error) { for { - nextTask := e.peerRequestQueue.Pop() + nextTask := e.peerRequestQueue.PopBlock() for nextTask == nil { select { case <-ctx.Done(): return nil, ctx.Err() case <-e.workSignal: - nextTask = e.peerRequestQueue.Pop() + nextTask = e.peerRequestQueue.PopBlock() case <-e.ticker.C: - e.peerRequestQueue.thawRound() - nextTask = e.peerRequestQueue.Pop() + e.peerRequestQueue.ThawRound() + nextTask = e.peerRequestQueue.PopBlock() } } // with a task in hand, we're ready to prepare the envelope... msg := bsmsg.New(true) - for _, entry := range nextTask.Entries { - block, err := e.bs.Get(entry.Cid) + for _, entry := range nextTask.Tasks { + block, err := e.bs.Get(entry.Identifier.(cid.Cid)) if err != nil { log.Errorf("tried to execute a task and errored fetching block: %s", err) continue @@ -181,7 +215,7 @@ func (e *Engine) nextEnvelope(ctx context.Context) (*Envelope, error) { if msg.Empty() { // If we don't have the block, don't hold that against the peer // make sure to update that the task has been 'completed' - nextTask.Done(nextTask.Entries) + nextTask.Done(nextTask.Tasks) continue } @@ -189,7 +223,7 @@ func (e *Engine) nextEnvelope(ctx context.Context) (*Envelope, error) { Peer: nextTask.Target, Message: msg, Sent: func() { - nextTask.Done(nextTask.Entries) + nextTask.Done(nextTask.Tasks) select { case e.workSignal <- struct{}{}: // work completing may mean that our queue will provide new @@ -221,7 +255,7 @@ func (e *Engine) Peers() []peer.ID { // MessageReceived performs book-keeping. Returns error if passed invalid // arguments. -func (e *Engine) MessageReceived(p peer.ID, m bsmsg.BitSwapMessage) error { +func (e *Engine) MessageReceived(p peer.ID, m bsmsg.BitSwapMessage) { if m.Empty() { log.Debugf("received empty message from %s", p) } @@ -241,7 +275,7 @@ func (e *Engine) MessageReceived(p peer.ID, m bsmsg.BitSwapMessage) error { } var msgSize int - var activeEntries []wl.Entry + var activeEntries []peertask.Task for _, entry := range m.Wantlist() { if entry.Cancel { log.Debugf("%s cancel %s", p, entry.Cid) @@ -260,23 +294,22 @@ func (e *Engine) MessageReceived(p peer.ID, m bsmsg.BitSwapMessage) error { // we have the block newWorkExists = true if msgSize+blockSize > maxMessageSize { - e.peerRequestQueue.Push(p, activeEntries...) - activeEntries = []wl.Entry{} + e.peerRequestQueue.PushBlock(p, activeEntries...) + activeEntries = []peertask.Task{} msgSize = 0 } - activeEntries = append(activeEntries, entry.Entry) + activeEntries = append(activeEntries, peertask.Task{Identifier: entry.Cid, Priority: entry.Priority}) msgSize += blockSize } } } if len(activeEntries) > 0 { - e.peerRequestQueue.Push(p, activeEntries...) + e.peerRequestQueue.PushBlock(p, activeEntries...) } for _, block := range m.Blocks() { log.Debugf("got block %s %d bytes", block, len(block.RawData())) l.ReceivedBytes(len(block.RawData())) } - return nil } func (e *Engine) addBlock(block blocks.Block) { @@ -285,7 +318,10 @@ func (e *Engine) addBlock(block blocks.Block) { for _, l := range e.ledgerMap { l.lk.Lock() if entry, ok := l.WantListContains(block.Cid()); ok { - e.peerRequestQueue.Push(l.Partner, entry) + e.peerRequestQueue.PushBlock(l.Partner, peertask.Task{ + Identifier: entry.Cid, + Priority: entry.Priority, + }) work = true } l.lk.Unlock() @@ -296,6 +332,8 @@ func (e *Engine) addBlock(block blocks.Block) { } } +// AddBlock is called to when a new block is received and added to a block store +// meaning there may be peers who want that block that we should send it to. func (e *Engine) AddBlock(block blocks.Block) { e.lock.Lock() defer e.lock.Unlock() @@ -309,7 +347,9 @@ func (e *Engine) AddBlock(block blocks.Block) { // inconsistent. Would need to ensure that Sends and acknowledgement of the // send happen atomically -func (e *Engine) MessageSent(p peer.ID, m bsmsg.BitSwapMessage) error { +// MessageSent is called when a message has successfully been sent out, to record +// changes. +func (e *Engine) MessageSent(p peer.ID, m bsmsg.BitSwapMessage) { l := e.findOrCreate(p) l.lk.Lock() defer l.lk.Unlock() @@ -320,9 +360,10 @@ func (e *Engine) MessageSent(p peer.ID, m bsmsg.BitSwapMessage) error { e.peerRequestQueue.Remove(block.Cid(), p) } - return nil } +// PeerConnected is called when a new peer connects, meaning we should start +// sending blocks. func (e *Engine) PeerConnected(p peer.ID) { e.lock.Lock() defer e.lock.Unlock() @@ -336,6 +377,7 @@ func (e *Engine) PeerConnected(p peer.ID) { l.ref++ } +// PeerDisconnected is called when a peer disconnects. func (e *Engine) PeerDisconnected(p peer.ID) { e.lock.Lock() defer e.lock.Unlock() diff --git a/vendor/github.com/ipfs/go-bitswap/decision/ledger.go b/vendor/github.com/ipfs/go-bitswap/decision/ledger.go index 374f0e7e..12eca63b 100644 --- a/vendor/github.com/ipfs/go-bitswap/decision/ledger.go +++ b/vendor/github.com/ipfs/go-bitswap/decision/ledger.go @@ -7,7 +7,7 @@ import ( wl "github.com/ipfs/go-bitswap/wantlist" cid "github.com/ipfs/go-cid" - peer "github.com/libp2p/go-libp2p-peer" + peer "github.com/libp2p/go-libp2p-core/peer" ) func newLedger(p peer.ID) *ledger { @@ -47,6 +47,9 @@ type ledger struct { lk sync.Mutex } +// Receipt is a summary of the ledger for a given peer +// collecting various pieces of aggregated data for external +// reporting purposes. type Receipt struct { Peer string Value float64 diff --git a/vendor/github.com/ipfs/go-bitswap/decision/peer_request_queue.go b/vendor/github.com/ipfs/go-bitswap/decision/peer_request_queue.go deleted file mode 100644 index 4f6ededc..00000000 --- a/vendor/github.com/ipfs/go-bitswap/decision/peer_request_queue.go +++ /dev/null @@ -1,342 +0,0 @@ -package decision - -import ( - "sync" - "time" - - wantlist "github.com/ipfs/go-bitswap/wantlist" - - cid "github.com/ipfs/go-cid" - pq "github.com/ipfs/go-ipfs-pq" - peer "github.com/libp2p/go-libp2p-peer" -) - -type peerRequestQueue interface { - // Pop returns the next peerRequestTask. Returns nil if the peerRequestQueue is empty. - Pop() *peerRequestTask - Push(to peer.ID, entries ...wantlist.Entry) - Remove(k cid.Cid, p peer.ID) - - // NB: cannot expose simply expose taskQueue.Len because trashed elements - // may exist. These trashed elements should not contribute to the count. -} - -func newPRQ() *prq { - return &prq{ - taskMap: make(map[taskEntryKey]*peerRequestTask), - partners: make(map[peer.ID]*activePartner), - frozen: make(map[peer.ID]*activePartner), - pQueue: pq.New(partnerCompare), - } -} - -// verify interface implementation -var _ peerRequestQueue = &prq{} - -// TODO: at some point, the strategy needs to plug in here -// to help decide how to sort tasks (on add) and how to select -// tasks (on getnext). For now, we are assuming a dumb/nice strategy. -type prq struct { - lock sync.Mutex - pQueue pq.PQ - taskMap map[taskEntryKey]*peerRequestTask - partners map[peer.ID]*activePartner - - frozen map[peer.ID]*activePartner -} - -// Push currently adds a new peerRequestTask to the end of the list. -func (tl *prq) Push(to peer.ID, entries ...wantlist.Entry) { - tl.lock.Lock() - defer tl.lock.Unlock() - partner, ok := tl.partners[to] - if !ok { - partner = newActivePartner() - tl.pQueue.Push(partner) - tl.partners[to] = partner - } - - partner.activelk.Lock() - defer partner.activelk.Unlock() - - var priority int - newEntries := make([]peerRequestTaskEntry, 0, len(entries)) - for _, entry := range entries { - if partner.activeBlocks.Has(entry.Cid) { - continue - } - if task, ok := tl.taskMap[taskEntryKey{to, entry.Cid}]; ok { - if entry.Priority > task.Priority { - task.Priority = entry.Priority - partner.taskQueue.Update(task.index) - } - continue - } - if entry.Priority > priority { - priority = entry.Priority - } - newEntries = append(newEntries, peerRequestTaskEntry{entry, false}) - } - - if len(newEntries) == 0 { - return - } - - task := &peerRequestTask{ - Entries: newEntries, - Target: to, - created: time.Now(), - Done: func(e []peerRequestTaskEntry) { - tl.lock.Lock() - for _, entry := range e { - partner.TaskDone(entry.Cid) - } - tl.pQueue.Update(partner.Index()) - tl.lock.Unlock() - }, - } - task.Priority = priority - partner.taskQueue.Push(task) - for _, entry := range newEntries { - tl.taskMap[taskEntryKey{to, entry.Cid}] = task - } - partner.requests += len(newEntries) - tl.pQueue.Update(partner.Index()) -} - -// Pop 'pops' the next task to be performed. Returns nil if no task exists. -func (tl *prq) Pop() *peerRequestTask { - tl.lock.Lock() - defer tl.lock.Unlock() - if tl.pQueue.Len() == 0 { - return nil - } - partner := tl.pQueue.Pop().(*activePartner) - - var out *peerRequestTask - for partner.taskQueue.Len() > 0 && partner.freezeVal == 0 { - out = partner.taskQueue.Pop().(*peerRequestTask) - - newEntries := make([]peerRequestTaskEntry, 0, len(out.Entries)) - for _, entry := range out.Entries { - delete(tl.taskMap, taskEntryKey{out.Target, entry.Cid}) - if entry.trash { - continue - } - partner.requests-- - partner.StartTask(entry.Cid) - newEntries = append(newEntries, entry) - } - if len(newEntries) > 0 { - out.Entries = newEntries - } else { - out = nil // discarding tasks that have been removed - continue - } - break // and return |out| - } - - tl.pQueue.Push(partner) - return out -} - -// Remove removes a task from the queue. -func (tl *prq) Remove(k cid.Cid, p peer.ID) { - tl.lock.Lock() - t, ok := tl.taskMap[taskEntryKey{p, k}] - if ok { - for i := range t.Entries { - if t.Entries[i].Cid.Equals(k) { - // remove the task "lazily" - // simply mark it as trash, so it'll be dropped when popped off the - // queue. - t.Entries[i].trash = true - break - } - } - - // having canceled a block, we now account for that in the given partner - partner := tl.partners[p] - partner.requests-- - - // we now also 'freeze' that partner. If they sent us a cancel for a - // block we were about to send them, we should wait a short period of time - // to make sure we receive any other in-flight cancels before sending - // them a block they already potentially have - if partner.freezeVal == 0 { - tl.frozen[p] = partner - } - - partner.freezeVal++ - tl.pQueue.Update(partner.index) - } - tl.lock.Unlock() -} - -func (tl *prq) fullThaw() { - tl.lock.Lock() - defer tl.lock.Unlock() - - for id, partner := range tl.frozen { - partner.freezeVal = 0 - delete(tl.frozen, id) - tl.pQueue.Update(partner.index) - } -} - -func (tl *prq) thawRound() { - tl.lock.Lock() - defer tl.lock.Unlock() - - for id, partner := range tl.frozen { - partner.freezeVal -= (partner.freezeVal + 1) / 2 - if partner.freezeVal <= 0 { - delete(tl.frozen, id) - } - tl.pQueue.Update(partner.index) - } -} - -type peerRequestTaskEntry struct { - wantlist.Entry - // trash in a book-keeping field - trash bool -} -type peerRequestTask struct { - Entries []peerRequestTaskEntry - Priority int - Target peer.ID - - // A callback to signal that this task has been completed - Done func([]peerRequestTaskEntry) - - // created marks the time that the task was added to the queue - created time.Time - index int // book-keeping field used by the pq container -} - -// Index implements pq.Elem. -func (t *peerRequestTask) Index() int { - return t.index -} - -// SetIndex implements pq.Elem. -func (t *peerRequestTask) SetIndex(i int) { - t.index = i -} - -// taskEntryKey is a key identifying a task. -type taskEntryKey struct { - p peer.ID - k cid.Cid -} - -// FIFO is a basic task comparator that returns tasks in the order created. -var FIFO = func(a, b *peerRequestTask) bool { - return a.created.Before(b.created) -} - -// V1 respects the target peer's wantlist priority. For tasks involving -// different peers, the oldest task is prioritized. -var V1 = func(a, b *peerRequestTask) bool { - if a.Target == b.Target { - return a.Priority > b.Priority - } - return FIFO(a, b) -} - -func wrapCmp(f func(a, b *peerRequestTask) bool) func(a, b pq.Elem) bool { - return func(a, b pq.Elem) bool { - return f(a.(*peerRequestTask), b.(*peerRequestTask)) - } -} - -type activePartner struct { - - // Active is the number of blocks this peer is currently being sent - // active must be locked around as it will be updated externally - activelk sync.Mutex - active int - - activeBlocks *cid.Set - - // requests is the number of blocks this peer is currently requesting - // request need not be locked around as it will only be modified under - // the peerRequestQueue's locks - requests int - - // for the PQ interface - index int - - freezeVal int - - // priority queue of tasks belonging to this peer - taskQueue pq.PQ -} - -func newActivePartner() *activePartner { - return &activePartner{ - taskQueue: pq.New(wrapCmp(V1)), - activeBlocks: cid.NewSet(), - } -} - -// partnerCompare implements pq.ElemComparator -// returns true if peer 'a' has higher priority than peer 'b' -func partnerCompare(a, b pq.Elem) bool { - pa := a.(*activePartner) - pb := b.(*activePartner) - - // having no blocks in their wantlist means lowest priority - // having both of these checks ensures stability of the sort - if pa.requests == 0 { - return false - } - if pb.requests == 0 { - return true - } - - if pa.freezeVal > pb.freezeVal { - return false - } - if pa.freezeVal < pb.freezeVal { - return true - } - - if pa.active == pb.active { - // sorting by taskQueue.Len() aids in cleaning out trash entries faster - // if we sorted instead by requests, one peer could potentially build up - // a huge number of cancelled entries in the queue resulting in a memory leak - return pa.taskQueue.Len() > pb.taskQueue.Len() - } - return pa.active < pb.active -} - -// StartTask signals that a task was started for this partner. -func (p *activePartner) StartTask(k cid.Cid) { - p.activelk.Lock() - p.activeBlocks.Add(k) - p.active++ - p.activelk.Unlock() -} - -// TaskDone signals that a task was completed for this partner. -func (p *activePartner) TaskDone(k cid.Cid) { - p.activelk.Lock() - p.activeBlocks.Remove(k) - p.active-- - if p.active < 0 { - panic("more tasks finished than started!") - } - p.activelk.Unlock() -} - -// Index implements pq.Elem. -func (p *activePartner) Index() int { - return p.index -} - -// SetIndex implements pq.Elem. -func (p *activePartner) SetIndex(i int) { - p.index = i -} diff --git a/vendor/github.com/ipfs/go-bitswap/go.mod b/vendor/github.com/ipfs/go-bitswap/go.mod index ccfa0983..9fb78e7f 100644 --- a/vendor/github.com/ipfs/go-bitswap/go.mod +++ b/vendor/github.com/ipfs/go-bitswap/go.mod @@ -1,34 +1,39 @@ module github.com/ipfs/go-bitswap require ( + github.com/btcsuite/btcd v0.0.0-20190605094302-a0d1e3e36d50 // indirect github.com/cskr/pubsub v1.0.2 + github.com/davecgh/go-spew v1.1.1 // indirect github.com/gogo/protobuf v1.2.1 + github.com/golang/protobuf v1.3.1 // indirect + github.com/google/uuid v1.1.1 github.com/hashicorp/golang-lru v0.5.1 github.com/ipfs/go-block-format v0.0.2 - github.com/ipfs/go-cid v0.0.1 - github.com/ipfs/go-datastore v0.0.1 + github.com/ipfs/go-cid v0.0.2 + github.com/ipfs/go-datastore v0.0.5 github.com/ipfs/go-detect-race v0.0.1 github.com/ipfs/go-ipfs-blockstore v0.0.1 github.com/ipfs/go-ipfs-blocksutil v0.0.1 github.com/ipfs/go-ipfs-delay v0.0.1 github.com/ipfs/go-ipfs-exchange-interface v0.0.1 - github.com/ipfs/go-ipfs-flags v0.0.1 - github.com/ipfs/go-ipfs-pq v0.0.1 - github.com/ipfs/go-ipfs-routing v0.0.1 + github.com/ipfs/go-ipfs-routing v0.1.0 github.com/ipfs/go-ipfs-util v0.0.1 github.com/ipfs/go-log v0.0.1 github.com/ipfs/go-metrics-interface v0.0.1 - github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8 - github.com/libp2p/go-libp2p v0.0.2 - github.com/libp2p/go-libp2p-host v0.0.1 - github.com/libp2p/go-libp2p-interface-connmgr v0.0.1 - github.com/libp2p/go-libp2p-loggables v0.0.1 - github.com/libp2p/go-libp2p-net v0.0.1 - github.com/libp2p/go-libp2p-netutil v0.0.1 - github.com/libp2p/go-libp2p-peer v0.0.1 - github.com/libp2p/go-libp2p-peerstore v0.0.1 - github.com/libp2p/go-libp2p-protocol v0.0.1 - github.com/libp2p/go-libp2p-routing v0.0.1 - github.com/libp2p/go-testutil v0.0.1 - github.com/multiformats/go-multiaddr v0.0.1 + github.com/ipfs/go-peertaskqueue v0.1.1 + github.com/jbenet/goprocess v0.1.3 + github.com/libp2p/go-libp2p v0.1.1 + github.com/libp2p/go-libp2p-core v0.0.3 + github.com/libp2p/go-libp2p-loggables v0.1.0 + github.com/libp2p/go-libp2p-netutil v0.1.0 + github.com/libp2p/go-libp2p-testing v0.0.4 + github.com/libp2p/go-msgio v0.0.3 // indirect + github.com/mattn/go-colorable v0.1.2 // indirect + github.com/multiformats/go-multiaddr v0.0.4 + github.com/opentracing/opentracing-go v1.1.0 // indirect + golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8 // indirect + golang.org/x/net v0.0.0-20190611141213-3f473d35a33a // indirect + golang.org/x/sys v0.0.0-20190610200419-93c9922d18ae // indirect + golang.org/x/text v0.3.2 // indirect + gopkg.in/yaml.v2 v2.2.2 // indirect ) diff --git a/vendor/github.com/ipfs/go-bitswap/go.sum b/vendor/github.com/ipfs/go-bitswap/go.sum index 165f526c..6740d9e1 100644 --- a/vendor/github.com/ipfs/go-bitswap/go.sum +++ b/vendor/github.com/ipfs/go-bitswap/go.sum @@ -3,25 +3,30 @@ github.com/Kubuxu/go-os-helper v0.0.1/go.mod h1:N8B+I7vPCT80IcP58r50u4+gEEcsZETF github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32 h1:qkOC5Gd33k54tobS36cXdAzJbeHaduLtnLQQwNoIi78= github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32/go.mod h1:DrZx5ec/dmnfpw9KyYoQyYo7d0KEvTkk/5M/vbZjAr8= +github.com/btcsuite/btcd v0.0.0-20190523000118-16327141da8c h1:aEbSeNALREWXk0G7UdNhR3ayBV7tZ4M2PNmnrCAph6Q= +github.com/btcsuite/btcd v0.0.0-20190523000118-16327141da8c/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI= +github.com/btcsuite/btcd v0.0.0-20190605094302-a0d1e3e36d50 h1:4i3KsuVA0o0KoBxAC5x+MY7RbteiMK1V7gf/G08NGIQ= +github.com/btcsuite/btcd v0.0.0-20190605094302-a0d1e3e36d50/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI= github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= github.com/btcsuite/btcutil v0.0.0-20190207003914-4c204d697803/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= +github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= -github.com/coreos/go-semver v0.2.0 h1:3Jm3tLmsgAYcjC+4Up7hJrFBPr+n7rAqYeSw/SZazuY= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/cskr/pubsub v1.0.2 h1:vlOzMhl6PFn60gRlTQQsIfVwaPB/B/8MziK8FhEPt/0= github.com/cskr/pubsub v1.0.2/go.mod h1:/8MzYXk/NJAz782G8RPkFzXTZVu63VotefPnR9TIRis= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= 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/dgraph-io/badger v1.5.5-0.20190226225317-8115aed38f8f/go.mod h1:VZxzAIRPHRVNRKRo6AXrX9BJegn6il06VMTZVJYCIjQ= github.com/dgryski/go-farm v0.0.0-20190104051053-3adb47b1fb0f/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/fd/go-nat v1.0.0 h1:DPyQ97sxA9ThrWYRPcWUz/z9TnpTIGRYODIQc/dy64M= -github.com/fd/go-nat v1.0.0/go.mod h1:BTBu/CKvMmOMUPkKVef1pngt2WFH/lg7E6yQnulfp6E= 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/go-check/check v0.0.0-20180628173108-788fd7840127 h1:0gkP6mzaMqkmpcJYCFOLkIBwI7xFExG03bbkOkCvUPI= @@ -31,6 +36,8 @@ github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zV github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.0 h1:kbxbvI4Un1LUWKxufD+BiE6AEExYYgkQLQmLFqA1LFk= github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0= +github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -44,8 +51,9 @@ github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+ github.com/hashicorp/golang-lru v0.5.1/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-20180415215157-1395d1447324 h1:PV190X5/DzQ/tbFFG5YpT5mH6q+cHlfgqI5JuRnH9oE= -github.com/huin/goupnp v0.0.0-20180415215157-1395d1447324/go.mod h1:MZ2ZmwcBpvOoJ22IJsc7va19ZwoheaBk43rKg12SKag= +github.com/huin/goupnp v1.0.0 h1:wg75sLpL6DZqwHQN6E1Cfk6mtfzS45z8OV+ic+DtHRo= +github.com/huin/goupnp v1.0.0/go.mod h1:n9v9KO1tAxYH82qOn+UTIFQDmx5n1Zxd/ClZDMX7Bnc= +github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= github.com/ipfs/bbloom v0.0.1 h1:s7KkiBPfxCeDVo47KySjK0ACPc5GJRUxFpdyWEuDjhw= github.com/ipfs/bbloom v0.0.1/go.mod h1:oqo8CVWsJFMOZqTglBG4wydCE4IQA/G2/SEofB0rjUI= github.com/ipfs/go-block-format v0.0.1/go.mod h1:DK/YYcsSUIVAFNwo/KZCdIIbpN0ROH/baNLgayt4pFc= @@ -53,8 +61,12 @@ github.com/ipfs/go-block-format v0.0.2 h1:qPDvcP19izTjU8rgo6p7gTXZlkMkF5bz5G3fqI github.com/ipfs/go-block-format v0.0.2/go.mod h1:AWR46JfpcObNfg3ok2JHDUfdiHRgWhJgCQF+KIgOPJY= github.com/ipfs/go-cid v0.0.1 h1:GBjWPktLnNyX0JiQCNFpUuUSoMw5KMyqrsejHYlILBE= github.com/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= +github.com/ipfs/go-cid v0.0.2 h1:tuuKaZPU1M6HcejsO3AcYWW8sZ8MTvyxfc4uqB4eFE8= +github.com/ipfs/go-cid v0.0.2/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= github.com/ipfs/go-datastore v0.0.1 h1:AW/KZCScnBWlSb5JbnEnLKFWXL224LBEh/9KXXOrUms= github.com/ipfs/go-datastore v0.0.1/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= +github.com/ipfs/go-datastore v0.0.5 h1:q3OfiOZV5rlsK1H5V8benjeUApRfMGs4Mrhmr6NriQo= +github.com/ipfs/go-datastore v0.0.5/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk= github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps= github.com/ipfs/go-ds-badger v0.0.2/go.mod h1:Y3QpeSFWQf6MopLTiZD+VT6IC1yZqaGmjvRcKeSGij8= @@ -70,33 +82,39 @@ github.com/ipfs/go-ipfs-ds-help v0.0.1 h1:QBg+Ts2zgeemK/dB0saiF/ykzRGgfoFMT90Rzo github.com/ipfs/go-ipfs-ds-help v0.0.1/go.mod h1:gtP9xRaZXqIQRh1HRpp595KbBEdgqWFxefeVKOV8sxo= github.com/ipfs/go-ipfs-exchange-interface v0.0.1 h1:LJXIo9W7CAmugqI+uofioIpRb6rY30GUu7G6LUfpMvM= github.com/ipfs/go-ipfs-exchange-interface v0.0.1/go.mod h1:c8MwfHjtQjPoDyiy9cFquVtVHkO9b9Ob3FG91qJnWCM= -github.com/ipfs/go-ipfs-flags v0.0.1 h1:OH5cEkJYL0QgA+bvD55TNG9ud8HA2Nqaav47b2c/UJk= -github.com/ipfs/go-ipfs-flags v0.0.1/go.mod h1:RnXBb9WV53GSfTrSDVK61NLTFKvWc60n+K9EgCDh+rA= github.com/ipfs/go-ipfs-pq v0.0.1 h1:zgUotX8dcAB/w/HidJh1zzc1yFq6Vm8J7T2F4itj/RU= github.com/ipfs/go-ipfs-pq v0.0.1/go.mod h1:LWIqQpqfRG3fNc5XsnIhz/wQ2XXGyugQwls7BgUmUfY= -github.com/ipfs/go-ipfs-routing v0.0.1 h1:394mZeTLcbM/LDO12PneBYvkZAUA+nRnmC0lAzDXKOY= -github.com/ipfs/go-ipfs-routing v0.0.1/go.mod h1:k76lf20iKFxQTjcJokbPM9iBXVXVZhcOwc360N4nuKs= +github.com/ipfs/go-ipfs-routing v0.1.0 h1:gAJTT1cEeeLj6/DlLX6t+NxD9fQe2ymTO6qWRDI/HQQ= +github.com/ipfs/go-ipfs-routing v0.1.0/go.mod h1:hYoUkJLyAUKhF58tysKpids8RNDPO42BVMgK5dNsoqY= github.com/ipfs/go-ipfs-util v0.0.1 h1:Wz9bL2wB2YBJqggkA4dD7oSmqB4cAnpNbGrlHJulv50= github.com/ipfs/go-ipfs-util v0.0.1/go.mod h1:spsl5z8KUnrve+73pOhSVZND1SIxPW5RyBCNzQxlJBc= github.com/ipfs/go-log v0.0.1 h1:9XTUN/rW64BCG1YhPK9Hoy3q8nr4gOmHHBpgFdfw6Lc= github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM= github.com/ipfs/go-metrics-interface v0.0.1 h1:j+cpbjYvu4R8zbleSs36gvB7jR+wsL2fGD6n0jO4kdg= github.com/ipfs/go-metrics-interface v0.0.1/go.mod h1:6s6euYU4zowdslK0GKHmqaIZ3j/b/tL7HTWtJ4VPgWY= -github.com/jackpal/gateway v1.0.4 h1:LS5EHkLuQ6jzaHwULi0vL+JO0mU/n4yUtK8oUjHHOlM= -github.com/jackpal/gateway v1.0.4/go.mod h1:lTpwd4ACLXmpyiCTRtfiNyVnUmqT9RivzCDQetPfnjA= +github.com/ipfs/go-peertaskqueue v0.1.1 h1:+gPjbI+V3NktXZOqJA1kzbms2pYmhjgQQal0MzZrOAY= +github.com/ipfs/go-peertaskqueue v0.1.1/go.mod h1:Jmk3IyCcfl1W3jTW3YpghSwSEC6IJ3Vzz/jUmWw8Z0U= +github.com/jackpal/gateway v1.0.5 h1:qzXWUJfuMdlLMtt0a3Dgt+xkWQiA5itDEITVJtuSwMc= +github.com/jackpal/gateway v1.0.5/go.mod h1:lTpwd4ACLXmpyiCTRtfiNyVnUmqT9RivzCDQetPfnjA= github.com/jackpal/go-nat-pmp v1.0.1 h1:i0LektDkO1QlrTm/cSuP+PyBCDnYvjPLGl4LdWEMiaA= github.com/jackpal/go-nat-pmp v1.0.1/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= github.com/jbenet/go-cienv v0.0.0-20150120210510-1bb1476777ec h1:DQqZhhDvrTrEQ3Qod5yfavcA064e53xlQ+xajiorXgM= github.com/jbenet/go-cienv v0.0.0-20150120210510-1bb1476777ec/go.mod h1:rGaEvXB4uRSZMmzKNLoXvTu1sfx+1kv/DojUlPrSZGs= +github.com/jbenet/go-cienv v0.1.0 h1:Vc/s0QbQtoxX8MwwSLWWh+xNNZvM3Lw7NsTcHrvvhMc= +github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA= github.com/jbenet/go-temp-err-catcher v0.0.0-20150120210811-aac704a3f4f2 h1:vhC1OXXiT9R2pczegwz6moDvuRpggaroAXhPIseh57A= github.com/jbenet/go-temp-err-catcher v0.0.0-20150120210811-aac704a3f4f2/go.mod h1:8GXXJV31xl8whumTzdZsTt3RnUIiPqzkyf7mxToRCMs= github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8 h1:bspPhN+oKYFk5fcGNuQzp6IGzYQSenLEgH3s6jkXrWw= github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8/go.mod h1:Ly/wlsjFq/qrU3Rar62tu1gASgGw6chQbSh/XgIIXCY= +github.com/jbenet/goprocess v0.1.3 h1:YKyIEECS/XvcfHtBzxtjBBbWK+MbvA6dG8ASiqwvr10= +github.com/jbenet/goprocess v0.1.3/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= +github.com/koron/go-ssdp v0.0.0-20180514024734-4a0ed625a78b h1:wxtKgYHEncAU00muMD06dzLiahtGM1eouRNOzVV7tdQ= +github.com/koron/go-ssdp v0.0.0-20180514024734-4a0ed625a78b/go.mod h1:5Ky9EC2xfoUKUor0Hjgi2BJhCSXJfMOFlmyYrVKGQMk= 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= @@ -106,119 +124,154 @@ github.com/libp2p/go-addr-util v0.0.1 h1:TpTQm9cXVRVSKsYbgQ7GKc3KbbHVTnbostgGaDE github.com/libp2p/go-addr-util v0.0.1/go.mod h1:4ac6O7n9rIAKB1dnd+s8IbbMXkt+oBpzX4/+RACcnlQ= github.com/libp2p/go-buffer-pool v0.0.1 h1:9Rrn/H46cXjaA2HQ5Y8lyhOS1NhTkZ4yuEs2r3Eechg= github.com/libp2p/go-buffer-pool v0.0.1/go.mod h1:xtyIz9PMobb13WaxR6Zo1Pd1zXJKYg0a8KiIvDp3TzQ= -github.com/libp2p/go-conn-security v0.0.1 h1:4kMMrqrt9EUNCNjX1xagSJC+bq16uqjMe9lk1KBMVNs= -github.com/libp2p/go-conn-security v0.0.1/go.mod h1:bGmu51N0KU9IEjX7kl2PQjgZa40JQWnayTvNMgD/vyk= -github.com/libp2p/go-conn-security-multistream v0.0.1 h1:XefjAQRHcnUaxKb26RGupToucx3uU4ecbOZ3aACXlDU= -github.com/libp2p/go-conn-security-multistream v0.0.1/go.mod h1:nc9vud7inQ+d6SO0I/6dSWrdMnHnzZNHeyUQqrAJulE= +github.com/libp2p/go-buffer-pool v0.0.2 h1:QNK2iAFa8gjAe1SPz6mHSMuCcjs+X1wlHzeOSqcmlfs= +github.com/libp2p/go-buffer-pool v0.0.2/go.mod h1:MvaB6xw5vOrDl8rYZGLFdKAuk/hRoRZd1Vi32+RXyFM= +github.com/libp2p/go-conn-security-multistream v0.1.0 h1:aqGmto+ttL/uJgX0JtQI0tD21CIEy5eYd1Hlp0juHY0= +github.com/libp2p/go-conn-security-multistream v0.1.0/go.mod h1:aw6eD7LOsHEX7+2hJkDxw1MteijaVcI+/eP2/x3J1xc= github.com/libp2p/go-flow-metrics v0.0.1 h1:0gxuFd2GuK7IIP5pKljLwps6TvcuYgvG7Atqi3INF5s= github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZxBdp967ls1g+k8= -github.com/libp2p/go-libp2p v0.0.1 h1:oEjzhRzymY7NILTMzOKNVOpNZGpcQHrHriWw91pbJNM= -github.com/libp2p/go-libp2p v0.0.1/go.mod h1:bmRs8I0vwn6iRaVssZnJx/epY6WPSKiLoK1vyle4EX0= -github.com/libp2p/go-libp2p v0.0.2 h1:+jvgi0Zy3y4TKXJKApchCk3pCBPZf1T54z3+vKie3gw= -github.com/libp2p/go-libp2p v0.0.2/go.mod h1:Qu8bWqFXiocPloabFGUcVG4kk94fLvfC8mWTDdFC9wE= -github.com/libp2p/go-libp2p-autonat v0.0.1/go.mod h1:fs71q5Xk+pdnKU014o2iq1RhMs9/PMaG5zXRFNnIIT4= -github.com/libp2p/go-libp2p-autonat v0.0.2 h1:ilo9QPzNPf1hMkqaPG55yzvhILf5ZtijstJhcii+l3s= -github.com/libp2p/go-libp2p-autonat v0.0.2/go.mod h1:fs71q5Xk+pdnKU014o2iq1RhMs9/PMaG5zXRFNnIIT4= -github.com/libp2p/go-libp2p-blankhost v0.0.1 h1:/mZuuiwntNR8RywnCFlGHLKrKLYne+qciBpQXWqp5fk= -github.com/libp2p/go-libp2p-blankhost v0.0.1/go.mod h1:Ibpbw/7cPPYwFb7PACIWdvxxv0t0XCCI10t7czjAjTc= -github.com/libp2p/go-libp2p-circuit v0.0.1 h1:DYbjyQ5ZY3QVAVYZWG4uzBQ6Wmcd1C82Bk8Q/pJlM1I= -github.com/libp2p/go-libp2p-circuit v0.0.1/go.mod h1:Dqm0s/BiV63j8EEAs8hr1H5HudqvCAeXxDyic59lCwE= -github.com/libp2p/go-libp2p-crypto v0.0.1 h1:JNQd8CmoGTohO/akqrH16ewsqZpci2CbgYH/LmYl8gw= -github.com/libp2p/go-libp2p-crypto v0.0.1/go.mod h1:yJkNyDmO341d5wwXxDUGO0LykUVT72ImHNUqh5D/dBE= -github.com/libp2p/go-libp2p-discovery v0.0.1 h1:VkjCKmJQMwpDUwtA8Qc1z3TQAHJgQ5nGQ6cdN0wQXOw= -github.com/libp2p/go-libp2p-discovery v0.0.1/go.mod h1:ZkkF9xIFRLA1xCc7bstYFkd80gBGK8Fc1JqGoU2i+zI= -github.com/libp2p/go-libp2p-host v0.0.1 h1:dnqusU+DheGcdxrE718kG4XgHNuL2n9eEv8Rg5zy8hQ= -github.com/libp2p/go-libp2p-host v0.0.1/go.mod h1:qWd+H1yuU0m5CwzAkvbSjqKairayEHdR5MMl7Cwa7Go= -github.com/libp2p/go-libp2p-interface-connmgr v0.0.1 h1:Q9EkNSLAOF+u90L88qmE9z/fTdjLh8OsJwGw74mkwk4= -github.com/libp2p/go-libp2p-interface-connmgr v0.0.1/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k= -github.com/libp2p/go-libp2p-interface-pnet v0.0.1 h1:7GnzRrBTJHEsofi1ahFdPN9Si6skwXQE9UqR2S+Pkh8= -github.com/libp2p/go-libp2p-interface-pnet v0.0.1/go.mod h1:el9jHpQAXK5dnTpKA4yfCNBZXvrzdOU75zz+C6ryp3k= -github.com/libp2p/go-libp2p-loggables v0.0.1 h1:HVww9oAnINIxbt69LJNkxD8lnbfgteXR97Xm4p3l9ps= -github.com/libp2p/go-libp2p-loggables v0.0.1/go.mod h1:lDipDlBNYbpyqyPX/KcoO+eq0sJYEVR2JgOexcivchg= -github.com/libp2p/go-libp2p-metrics v0.0.1 h1:yumdPC/P2VzINdmcKZd0pciSUCpou+s0lwYCjBbzQZU= -github.com/libp2p/go-libp2p-metrics v0.0.1/go.mod h1:jQJ95SXXA/K1VZi13h52WZMa9ja78zjyy5rspMsC/08= -github.com/libp2p/go-libp2p-nat v0.0.1 h1:on/zju7XE+JXc8gH+vTKmIh2UJFC1K8kGnJYluQrlz4= -github.com/libp2p/go-libp2p-nat v0.0.1/go.mod h1:4L6ajyUIlJvx1Cbh5pc6Ma6vMDpKXf3GgLO5u7W0oQ4= -github.com/libp2p/go-libp2p-nat v0.0.2 h1:sKI5hiCsGFhuEKdXMsF9mywQu2qhfoIGX6a+VG6zelE= -github.com/libp2p/go-libp2p-nat v0.0.2/go.mod h1:QrjXQSD5Dj4IJOdEcjHRkWTSomyxRo6HnUkf/TfQpLQ= -github.com/libp2p/go-libp2p-net v0.0.1 h1:xJ4Vh4yKF/XKb8fd1Ev0ebAGzVjMxXzrxG2kjtU+F5Q= -github.com/libp2p/go-libp2p-net v0.0.1/go.mod h1:Yt3zgmlsHOgUWSXmt5V/Jpz9upuJBE8EgNU9DrCcR8c= -github.com/libp2p/go-libp2p-netutil v0.0.1 h1:LgD6+skofkOx8z6odD9+MZHKjupv3ng1u6KRhaADTnA= -github.com/libp2p/go-libp2p-netutil v0.0.1/go.mod h1:GdusFvujWZI9Vt0X5BKqwWWmZFxecf9Gt03cKxm2f/Q= -github.com/libp2p/go-libp2p-peer v0.0.1 h1:0qwAOljzYewINrU+Kndoc+1jAL7vzY/oY2Go4DCGfyY= -github.com/libp2p/go-libp2p-peer v0.0.1/go.mod h1:nXQvOBbwVqoP+T5Y5nCjeH4sP9IX/J0AMzcDUVruVoo= -github.com/libp2p/go-libp2p-peerstore v0.0.1 h1:twKovq8YK5trLrd3nB7PD2Zu9JcyAIdm7Bz9yBWjhq8= -github.com/libp2p/go-libp2p-peerstore v0.0.1/go.mod h1:RabLyPVJLuNQ+GFyoEkfi8H4Ti6k/HtZJ7YKgtSq+20= -github.com/libp2p/go-libp2p-protocol v0.0.1 h1:+zkEmZ2yFDi5adpVE3t9dqh/N9TbpFWywowzeEzBbLM= -github.com/libp2p/go-libp2p-protocol v0.0.1/go.mod h1:Af9n4PiruirSDjHycM1QuiMi/1VZNHYcK8cLgFJLZ4s= -github.com/libp2p/go-libp2p-record v0.0.1 h1:zN7AS3X46qmwsw5JLxdDuI43cH5UYwovKxHPjKBYQxw= -github.com/libp2p/go-libp2p-record v0.0.1/go.mod h1:grzqg263Rug/sRex85QrDOLntdFAymLDLm7lxMgU79Q= -github.com/libp2p/go-libp2p-routing v0.0.1 h1:hPMAWktf9rYi3ME4MG48qE7dq1ofJxiQbfdvpNntjhc= -github.com/libp2p/go-libp2p-routing v0.0.1/go.mod h1:N51q3yTr4Zdr7V8Jt2JIktVU+3xBBylx1MZeVA6t1Ys= -github.com/libp2p/go-libp2p-secio v0.0.1 h1:CqE/RdsizOwItdgLe632iyft/w0tshDLmZGAiKDcUAI= -github.com/libp2p/go-libp2p-secio v0.0.1/go.mod h1:IdG6iQybdcYmbTzxp4J5dwtUEDTOvZrT0opIDVNPrJs= -github.com/libp2p/go-libp2p-swarm v0.0.1 h1:Vne+hjaDwXqzgNwQ2vb2YKbnbOTyXjtS47stT66Apc4= -github.com/libp2p/go-libp2p-swarm v0.0.1/go.mod h1:mh+KZxkbd3lQnveQ3j2q60BM1Cw2mX36XXQqwfPOShs= -github.com/libp2p/go-libp2p-transport v0.0.1/go.mod h1:UzbUs9X+PHOSw7S3ZmeOxfnwaQY5vGDzZmKPod3N3tk= -github.com/libp2p/go-libp2p-transport v0.0.4 h1:/CPHQMN75/IQwkhBxxIo6p6PtL3rwFZtlzBROT3e8mw= -github.com/libp2p/go-libp2p-transport v0.0.4/go.mod h1:StoY3sx6IqsP6XKoabsPnHCwqKXWUMWU7Rfcsubee/A= -github.com/libp2p/go-libp2p-transport-upgrader v0.0.1 h1:rNtXkY6dty46mxYOHHAZQchI7gQdJStF683FhVnei/k= -github.com/libp2p/go-libp2p-transport-upgrader v0.0.1/go.mod h1:NJpUAgQab/8K6K0m+JmZCe5RUXG10UMEx4kWe9Ipj5c= -github.com/libp2p/go-maddr-filter v0.0.1 h1:apvYTg0aIxxQyBX+XHKOR+0+lYhGs1Yv+JmTH9nyl5I= -github.com/libp2p/go-maddr-filter v0.0.1/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= -github.com/libp2p/go-mplex v0.0.1 h1:dn2XGSrUxLtz3/8u85bGrwhUEKPX8MOF3lpmcWBZCWc= -github.com/libp2p/go-mplex v0.0.1/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0= -github.com/libp2p/go-msgio v0.0.1 h1:znj97n5FtXGCLDwe9x8jpHmY770SW4WStBGcCDh6GJw= -github.com/libp2p/go-msgio v0.0.1/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= +github.com/libp2p/go-libp2p v0.1.1 h1:52sB0TJuDk2nYMcMfHOKaPoaayDZjaYVCq6Vk1ejUTk= +github.com/libp2p/go-libp2p v0.1.1/go.mod h1:I00BRo1UuUSdpuc8Q2mN7yDF/oTUTRAX6JWpTiK9Rp8= +github.com/libp2p/go-libp2p-autonat v0.1.0 h1:aCWAu43Ri4nU0ZPO7NyLzUvvfqd0nE3dX0R/ZGYVgOU= +github.com/libp2p/go-libp2p-autonat v0.1.0/go.mod h1:1tLf2yXxiE/oKGtDwPYWTSYG3PtvYlJmg7NeVtPRqH8= +github.com/libp2p/go-libp2p-blankhost v0.1.1 h1:X919sCh+KLqJcNRApj43xCSiQRYqOSI88Fdf55ngf78= +github.com/libp2p/go-libp2p-blankhost v0.1.1/go.mod h1:pf2fvdLJPsC1FsVrNP3DUUvMzUts2dsLLBEpo1vW1ro= +github.com/libp2p/go-libp2p-circuit v0.1.0 h1:eniLL3Y9aq/sryfyV1IAHj5rlvuyj3b7iz8tSiZpdhY= +github.com/libp2p/go-libp2p-circuit v0.1.0/go.mod h1:Ahq4cY3V9VJcHcn1SBXjr78AbFkZeIRmfunbA7pmFh8= +github.com/libp2p/go-libp2p-core v0.0.1 h1:HSTZtFIq/W5Ue43Zw+uWZyy2Vl5WtF0zDjKN8/DT/1I= +github.com/libp2p/go-libp2p-core v0.0.1/go.mod h1:g/VxnTZ/1ygHxH3dKok7Vno1VfpvGcGip57wjTU4fco= +github.com/libp2p/go-libp2p-core v0.0.2 h1:86uOwW+O6Uc7NbaK4diuLZo2/Ikvqw2rgyV03VcSbLE= +github.com/libp2p/go-libp2p-core v0.0.2/go.mod h1:9dAcntw/n46XycV4RnlBq3BpgrmyUi9LuoTNdPrbUco= +github.com/libp2p/go-libp2p-core v0.0.3 h1:+IonUYY0nJZLb5Fdv6a6DOjtGP1L8Bb3faamiI2q5FY= +github.com/libp2p/go-libp2p-core v0.0.3/go.mod h1:j+YQMNz9WNSkNezXOsahp9kwZBKBvxLpKD316QWSJXE= +github.com/libp2p/go-libp2p-crypto v0.1.0 h1:k9MFy+o2zGDNGsaoZl0MA3iZ75qXxr9OOoAZF+sD5OQ= +github.com/libp2p/go-libp2p-crypto v0.1.0/go.mod h1:sPUokVISZiy+nNuTTH/TY+leRSxnFj/2GLjtOTW90hI= +github.com/libp2p/go-libp2p-discovery v0.1.0 h1:j+R6cokKcGbnZLf4kcNwpx6mDEUPF3N6SrqMymQhmvs= +github.com/libp2p/go-libp2p-discovery v0.1.0/go.mod h1:4F/x+aldVHjHDHuX85x1zWoFTGElt8HnoDzwkFZm29g= +github.com/libp2p/go-libp2p-loggables v0.1.0 h1:h3w8QFfCt2UJl/0/NW4K829HX/0S4KD31PQ7m8UXXO8= +github.com/libp2p/go-libp2p-loggables v0.1.0/go.mod h1:EyumB2Y6PrYjr55Q3/tiJ/o3xoDasoRYM7nOzEpoa90= +github.com/libp2p/go-libp2p-mplex v0.2.0/go.mod h1:Ejl9IyjvXJ0T9iqUTE1jpYATQ9NM3g+OtR+EMMODbKo= +github.com/libp2p/go-libp2p-mplex v0.2.1 h1:E1xaJBQnbSiTHGI1gaBKmKhu1TUKkErKJnE8iGvirYI= +github.com/libp2p/go-libp2p-mplex v0.2.1/go.mod h1:SC99Rxs8Vuzrf/6WhmH41kNn13TiYdAWNYHrwImKLnE= +github.com/libp2p/go-libp2p-nat v0.0.4 h1:+KXK324yaY701On8a0aGjTnw8467kW3ExKcqW2wwmyw= +github.com/libp2p/go-libp2p-nat v0.0.4/go.mod h1:N9Js/zVtAXqaeT99cXgTV9e75KpnWCvVOiGzlcHmBbY= +github.com/libp2p/go-libp2p-netutil v0.1.0 h1:zscYDNVEcGxyUpMd0JReUZTrpMfia8PmLKcKF72EAMQ= +github.com/libp2p/go-libp2p-netutil v0.1.0/go.mod h1:3Qv/aDqtMLTUyQeundkKsA+YCThNdbQD54k3TqjpbFU= +github.com/libp2p/go-libp2p-peer v0.2.0 h1:EQ8kMjaCUwt/Y5uLgjT8iY2qg0mGUT0N1zUjer50DsY= +github.com/libp2p/go-libp2p-peer v0.2.0/go.mod h1:RCffaCvUyW2CJmG2gAWVqwePwW7JMgxjsHm7+J5kjWY= +github.com/libp2p/go-libp2p-peerstore v0.1.0 h1:MKh7pRNPHSh1fLPj8u/M/s/napdmeNpoi9BRy9lPN0E= +github.com/libp2p/go-libp2p-peerstore v0.1.0/go.mod h1:2CeHkQsr8svp4fZ+Oi9ykN1HBb6u0MOvdJ7YIsmcwtY= +github.com/libp2p/go-libp2p-record v0.1.0 h1:wHwBGbFzymoIl69BpgwIu0O6ta3TXGcMPvHUAcodzRc= +github.com/libp2p/go-libp2p-record v0.1.0/go.mod h1:ujNc8iuE5dlKWVy6wuL6dd58t0n7xI4hAIl8pE6wu5Q= +github.com/libp2p/go-libp2p-secio v0.1.0 h1:NNP5KLxuP97sE5Bu3iuwOWyT/dKEGMN5zSLMWdB7GTQ= +github.com/libp2p/go-libp2p-secio v0.1.0/go.mod h1:tMJo2w7h3+wN4pgU2LSYeiKPrfqBgkOsdiKK77hE7c8= +github.com/libp2p/go-libp2p-swarm v0.1.0 h1:HrFk2p0awrGEgch9JXK/qp/hfjqQfgNxpLWnCiWPg5s= +github.com/libp2p/go-libp2p-swarm v0.1.0/go.mod h1:wQVsCdjsuZoc730CgOvh5ox6K8evllckjebkdiY5ta4= +github.com/libp2p/go-libp2p-testing v0.0.2/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= +github.com/libp2p/go-libp2p-testing v0.0.3 h1:bdij4bKaaND7tCsaXVjRfYkMpvoOeKj9AVQGJllA6jM= +github.com/libp2p/go-libp2p-testing v0.0.3/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= +github.com/libp2p/go-libp2p-testing v0.0.4 h1:Qev57UR47GcLPXWjrunv5aLIQGO4n9mhI/8/EIrEEFc= +github.com/libp2p/go-libp2p-testing v0.0.4/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= +github.com/libp2p/go-libp2p-transport-upgrader v0.1.1 h1:PZMS9lhjK9VytzMCW3tWHAXtKXmlURSc3ZdvwEcKCzw= +github.com/libp2p/go-libp2p-transport-upgrader v0.1.1/go.mod h1:IEtA6or8JUbsV07qPW4r01GnTenLW4oi3lOPbUMGJJA= +github.com/libp2p/go-libp2p-yamux v0.2.0 h1:TSPZ5cMMz/wdoYsye/wU1TE4G3LDGMoeEN0xgnCKU/I= +github.com/libp2p/go-libp2p-yamux v0.2.0/go.mod h1:Db2gU+XfLpm6E4rG5uGCFX6uXA8MEXOxFcRoXUODaK8= +github.com/libp2p/go-libp2p-yamux v0.2.1 h1:Q3XYNiKCC2vIxrvUJL+Jg1kiyeEaIDNKLjgEjo3VQdI= +github.com/libp2p/go-libp2p-yamux v0.2.1/go.mod h1:1FBXiHDk1VyRM1C0aez2bCfHQ4vMZKkAQzZbkSQt5fI= +github.com/libp2p/go-maddr-filter v0.0.4 h1:hx8HIuuwk34KePddrp2mM5ivgPkZ09JH4AvsALRbFUs= +github.com/libp2p/go-maddr-filter v0.0.4/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= +github.com/libp2p/go-mplex v0.0.3/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0= +github.com/libp2p/go-mplex v0.1.0 h1:/nBTy5+1yRyY82YaO6HXQRnO5IAGsXTjEJaR3LdTPc0= +github.com/libp2p/go-mplex v0.1.0/go.mod h1:SXgmdki2kwCUlCCbfGLEgHjC4pFqhTp0ZoV6aiKgxDU= +github.com/libp2p/go-msgio v0.0.2 h1:ivPvEKHxmVkTClHzg6RXTYHqaJQ0V9cDbq+6lKb3UV0= +github.com/libp2p/go-msgio v0.0.2/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= +github.com/libp2p/go-msgio v0.0.3 h1:VsOlWispTivSsOMg70e0W77y6oiSBSRCyP6URrWvE04= +github.com/libp2p/go-msgio v0.0.3/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= +github.com/libp2p/go-nat v0.0.3 h1:l6fKV+p0Xa354EqQOQP+d8CivdLM4kl5GxC1hSc/UeI= +github.com/libp2p/go-nat v0.0.3/go.mod h1:88nUEt0k0JD45Bk93NIwDqjlhiOwOoV36GchpcVc1yI= github.com/libp2p/go-reuseport v0.0.1 h1:7PhkfH73VXfPJYKQ6JwS5I/eVcoyYi9IMNGc6FWpFLw= github.com/libp2p/go-reuseport v0.0.1/go.mod h1:jn6RmB1ufnQwl0Q1f+YxAj8isJgDCQzaaxIFYDhcYEA= -github.com/libp2p/go-reuseport-transport v0.0.1 h1:UIRneNxLDmEGNjGHpIiWzSWkZ5bhxMCP9x3Vh7BSc7E= -github.com/libp2p/go-reuseport-transport v0.0.1/go.mod h1:YkbSDrvjUVDL6b8XqriyA20obEtsW9BLkuOUyQAOCbs= +github.com/libp2p/go-reuseport-transport v0.0.2 h1:WglMwyXyBu61CMkjCCtnmqNqnjib0GIEjMiHTwR/KN4= +github.com/libp2p/go-reuseport-transport v0.0.2/go.mod h1:YkbSDrvjUVDL6b8XqriyA20obEtsW9BLkuOUyQAOCbs= github.com/libp2p/go-stream-muxer v0.0.1 h1:Ce6e2Pyu+b5MC1k3eeFtAax0pW4gc6MosYSLV05UeLw= github.com/libp2p/go-stream-muxer v0.0.1/go.mod h1:bAo8x7YkSpadMTbtTaxGVHWUQsR/l5MEaHbKaliuT14= -github.com/libp2p/go-tcp-transport v0.0.1 h1:WyvJVw2lYAnr6CU+GZZ4oCt06fvORlmvBlFX2+ZpZDM= -github.com/libp2p/go-tcp-transport v0.0.1/go.mod h1:mnjg0o0O5TmXUaUIanYPUqkW4+u6mK0en8rlpA6BBTs= -github.com/libp2p/go-testutil v0.0.1 h1:Xg+O0G2HIMfHqBOBDcMS1iSZJ3GEcId4qOxCQvsGZHk= -github.com/libp2p/go-testutil v0.0.1/go.mod h1:iAcJc/DKJQanJ5ws2V+u5ywdL2n12X1WbbEG+Jjy69I= -github.com/libp2p/go-ws-transport v0.0.1 h1:9ytMqq86Xvp8rcnC/1ZNuH612eXLDglvcu4ZHseJl8s= -github.com/libp2p/go-ws-transport v0.0.1/go.mod h1:p3bKjDWHEgtuKKj+2OdPYs5dAPIjtpQGHF2tJfGz7Ww= +github.com/libp2p/go-stream-muxer-multistream v0.2.0 h1:714bRJ4Zy9mdhyTLJ+ZKiROmAFwUHpeRidG+q7LTQOg= +github.com/libp2p/go-stream-muxer-multistream v0.2.0/go.mod h1:j9eyPol/LLRqT+GPLSxvimPhNph4sfYfMoDPd7HkzIc= +github.com/libp2p/go-tcp-transport v0.1.0 h1:IGhowvEqyMFknOar4FWCKSWE0zL36UFKQtiRQD60/8o= +github.com/libp2p/go-tcp-transport v0.1.0/go.mod h1:oJ8I5VXryj493DEJ7OsBieu8fcg2nHGctwtInJVpipc= +github.com/libp2p/go-ws-transport v0.1.0 h1:F+0OvvdmPTDsVc4AjPHjV7L7Pk1B7D5QwtDcKE2oag4= +github.com/libp2p/go-ws-transport v0.1.0/go.mod h1:rjw1MG1LU9YDC6gzmwObkPd/Sqwhw7yT74kj3raBFuo= +github.com/libp2p/go-yamux v1.2.2 h1:s6J6o7+ajoQMjHe7BEnq+EynOj5D2EoG8CuQgL3F2vg= +github.com/libp2p/go-yamux v1.2.2/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= +github.com/libp2p/go-yamux v1.2.3 h1:xX8A36vpXb59frIzWFdEgptLMsOANMFq2K7fPRlunYI= +github.com/libp2p/go-yamux v1.2.3/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= github.com/mattn/go-colorable v0.1.1 h1:G1f5SKeVxmagw/IyvzvtZE4Gybcc4Tr1tf7I8z0XgOg= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= +github.com/mattn/go-colorable v0.1.2 h1:/bC9yWikZXAL9uJdulbSfyVNIR3n3trXl+v8+1sx8mU= +github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-isatty v0.0.5 h1:tHXDdz1cpzGaovsTB+TVB8q90WEokoVmfMqoVcrLUgw= github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/miekg/dns v1.1.4/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/mattn/go-isatty v0.0.8 h1:HLtExJ+uU2HOZ+wI0Tt5DtUDrx8yhUqDcp7fYERX4CE= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/miekg/dns v1.1.12/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0OXOcUbGjvZxxijuBwbbmlSxLiuofa+g= github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16 h1:5W7KhL8HVF3XCFOweFD3BNESdnO8ewyYTFT2R+/b8FQ= github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= +github.com/minio/sha256-simd v0.0.0-20190328051042-05b4dd3047e5 h1:l16XLUUJ34wIz+RIvLhSwGvLvKyy+W598b135bJN6mg= +github.com/minio/sha256-simd v0.0.0-20190328051042-05b4dd3047e5/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= +github.com/minio/sha256-simd v0.1.0 h1:U41/2erhAKcmSI14xh/ZTUdBPOzDOIfS93ibzUSl8KM= +github.com/minio/sha256-simd v0.1.0/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= github.com/mr-tron/base58 v1.1.0 h1:Y51FGVJ91WBqCEabAi5OPUz38eAx8DakuAm5svLcsfQ= github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= +github.com/mr-tron/base58 v1.1.1/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= +github.com/mr-tron/base58 v1.1.2 h1:ZEw4I2EgPKDJ2iEw0cNmLB3ROrEmkOtXIkaG7wZg+78= +github.com/mr-tron/base58 v1.1.2/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= github.com/multiformats/go-base32 v0.0.3 h1:tw5+NhuwaOjJCC5Pp82QuXbrmLzWg7uxlMFp8Nq/kkI= github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= github.com/multiformats/go-multiaddr v0.0.1 h1:/QUV3VBMDI6pi6xfiw7lr6xhDWWvQKn9udPn68kLSdY= github.com/multiformats/go-multiaddr v0.0.1/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= +github.com/multiformats/go-multiaddr v0.0.2/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= +github.com/multiformats/go-multiaddr v0.0.4 h1:WgMSI84/eRLdbptXMkMWDXPjPq7SPLIgGUVm2eroyU4= +github.com/multiformats/go-multiaddr v0.0.4/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= github.com/multiformats/go-multiaddr-dns v0.0.1/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= github.com/multiformats/go-multiaddr-dns v0.0.2 h1:/Bbsgsy3R6e3jf2qBahzNHzww6usYaZ0NhNH3sqdFS8= github.com/multiformats/go-multiaddr-dns v0.0.2/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= +github.com/multiformats/go-multiaddr-fmt v0.0.1 h1:5YjeOIzbX8OTKVaN72aOzGIYW7PnrZrnkDyOfAWRSMA= +github.com/multiformats/go-multiaddr-fmt v0.0.1/go.mod h1:aBYjqL4T/7j4Qx+R73XSv/8JsgnRFlf0w2KGLCmXl3Q= github.com/multiformats/go-multiaddr-net v0.0.1 h1:76O59E3FavvHqNg7jvzWzsPSW5JSi/ek0E4eiDVbg9g= github.com/multiformats/go-multiaddr-net v0.0.1/go.mod h1:nw6HSxNmCIQH27XPGBuX+d1tnvM7ihcFwHMSstNAVUU= github.com/multiformats/go-multibase v0.0.1 h1:PN9/v21eLywrFWdFNsFKaU04kLJzuYzmrJR+ubhT9qA= github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs= github.com/multiformats/go-multihash v0.0.1 h1:HHwN1K12I+XllBCrqKnhX949Orn4oawPkegHMu2vDqQ= github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= -github.com/multiformats/go-multistream v0.0.1 h1:JV4VfSdY9n7ECTtY59/TlSyFCzRILvYx4T4Ws8ZgihU= -github.com/multiformats/go-multistream v0.0.1/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= +github.com/multiformats/go-multihash v0.0.5 h1:1wxmCvTXAifAepIMyF39vZinRw5sbqjPs/UIi93+uik= +github.com/multiformats/go-multihash v0.0.5/go.mod h1:lt/HCbqlQwlPBz7lv0sQCdtfcMtlJvakRUn/0Ual8po= +github.com/multiformats/go-multistream v0.1.0 h1:UpO6jrsjqs46mqAK3n6wKRYFhugss9ArzbyUzU+4wkQ= +github.com/multiformats/go-multistream v0.1.0/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= 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/ginkgo v1.8.0 h1:VkHVNpR4iVnU8XQR6DBm8BqYjN7CRzw+xKUbVVbbW9w= +github.com/onsi/ginkgo v1.8.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/onsi/gomega v1.5.0 h1:izbySO9zDPmjJ8rDjLvkA2zJHIo+HkYXHnf7eN7SSyo= +github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/opentracing/opentracing-go v1.0.2 h1:3jA2P6O1F9UOrWVpwrIo17pu01KWvNWg4X946/Y5Zwg= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +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/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/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a h1:/eS3yfGjQKG+9kayBkj0ip1BGhq6zJ3eaVksphxAaek= +github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a/go.mod h1:7AyxJNCJ7SBZ1MfVQCWD6Uqo2oubI2Eq2y2eqf+A5r0= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 h1:RC6RW7j+1+HkWaX/Yh71Ee5ZHaHYt7ZP4sQgUrm6cDU= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572/go.mod h1:w0SWMsp6j9O/dk4/ZpIhL+3CkG8ofA2vuv7k+ltqUMc= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= @@ -228,30 +281,28 @@ github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc h1:9lDbC6 github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc/go.mod h1:bopw91TMyo8J3tvftk8xmU2kPmlrt4nScJQZU2hE5EM= github.com/whyrusleeping/go-notifier v0.0.0-20170827234753-097c5d47330f h1:M/lL30eFZTKnomXY6huvM6G0+gVquFNf6mxghaWlFUg= github.com/whyrusleeping/go-notifier v0.0.0-20170827234753-097c5d47330f/go.mod h1:cZNvX9cFybI01GriPRMXDtczuvUhgbcYr9iCGaNlRv8= -github.com/whyrusleeping/go-smux-multiplex v3.0.16+incompatible h1:iqksILj8STw03EJQe7Laj4ubnw+ojOyik18cd5vPL1o= -github.com/whyrusleeping/go-smux-multiplex v3.0.16+incompatible/go.mod h1:34LEDbeKFZInPUrAG+bjuJmUXONGdEFW7XL0SpTY1y4= -github.com/whyrusleeping/go-smux-multistream v2.0.2+incompatible h1:BdYHctE9HJZLquG9tpTdwWcbG4FaX6tVKPGjCGgiVxo= -github.com/whyrusleeping/go-smux-multistream v2.0.2+incompatible/go.mod h1:dRWHHvc4HDQSHh9gbKEBbUZ+f2Q8iZTPG3UOGYODxSQ= -github.com/whyrusleeping/go-smux-yamux v2.0.8+incompatible h1:IGm/UP/JpEFS6D787sZnZg7RA6fZIR9c/Ms9DeAVNuk= -github.com/whyrusleeping/go-smux-yamux v2.0.8+incompatible/go.mod h1:6qHUzBXUbB9MXmw3AUdB52L8sEb/hScCqOdW2kj/wuI= -github.com/whyrusleeping/go-smux-yamux v2.0.9+incompatible h1:nVkExQ7pYlN9e45LcqTCOiDD0904fjtm0flnHZGbXkw= -github.com/whyrusleeping/go-smux-yamux v2.0.9+incompatible/go.mod h1:6qHUzBXUbB9MXmw3AUdB52L8sEb/hScCqOdW2kj/wuI= github.com/whyrusleeping/mafmt v1.2.8 h1:TCghSl5kkwEE0j+sU/gudyhVMRlpBin8fMBBHg59EbA= github.com/whyrusleeping/mafmt v1.2.8/go.mod h1:faQJFPbLSxzD9xpA02ttW/tS9vZykNvXwGvqIpk20FA= github.com/whyrusleeping/mdns v0.0.0-20180901202407-ef14215e6b30/go.mod h1:j4l84WPFclQPj320J9gp0XwNKBb3U0zt5CBqjPp22G4= github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7 h1:E9S12nwJwEOXe2d6gT6qxdvqMnNq+VnSsKPgm2ZZNds= github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7/go.mod h1:X2c0RVCI1eSUFI8eLcY3c0423ykwiUdxLJtkDvruhjI= -github.com/whyrusleeping/yamux v1.1.5 h1:4CK3aUUJQu0qpKZv5gEWJjNOQtdbdDhVVS6PJ+HimdE= -github.com/whyrusleeping/yamux v1.1.5/go.mod h1:E8LnQQ8HKx5KD29HZFUwM1PxCOdPRzGwur1mcYhXcD8= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25 h1:jsG6UpNLt9iAsb0S2AGW28DveNzzgmbXR+ENoPjUeIU= -golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/net v0.0.0-20180524181706-dfa909b99c79/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f h1:R423Cnkcp5JABoeemiGEPlt9tHXFfw5kvc0yqlxRPWo= +golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8 h1:1wopBVtVdWnn03fZelqdXTqk7U7zPQCb+T4rbU9ZEoU= +golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190227160552-c95aed5357e7 h1:C2F/nMkR/9sfUTpvR3QrjBuTdvMUC/cFajkphs1YLQo= golang.org/x/net v0.0.0-20190227160552-c95aed5357e7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190611141213-3f473d35a33a h1:+KkCgOMgnKSgenxTBoiwkMqTiouMIy/3o8RLdmSbGoY= +golang.org/x/net v0.0.0-20190611141213-3f473d35a33a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f h1:wMNYb4v58l5UBM7MYRLPG6ZhfOqbKu7X5eyFl8ZhKvA= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -260,9 +311,15 @@ golang.org/x/sys v0.0.0-20190219092855-153ac476189d/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190228124157-a34e9553db1e h1:ZytStCyV048ZqDsWHiYDdoI2Vd4msMcrDECFxS+tL9c= golang.org/x/sys v0.0.0-20190228124157-a34e9553db1e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190610200419-93c9922d18ae h1:xiXzMMEQdQcric9hXtr1QU98MHunKK7OTtsoU6bYWs4= +golang.org/x/sys v0.0.0-20190610200419-93c9922d18ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= 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/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= 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= @@ -273,3 +330,5 @@ gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkep gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.1 h1:mUhvW9EsL+naU5Q3cakzfE91YhliOondGd6ZrsDBHQE= 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= diff --git a/vendor/github.com/ipfs/go-bitswap/message/message.go b/vendor/github.com/ipfs/go-bitswap/message/message.go index b9035d8f..df44d112 100644 --- a/vendor/github.com/ipfs/go-bitswap/message/message.go +++ b/vendor/github.com/ipfs/go-bitswap/message/message.go @@ -10,12 +10,12 @@ import ( ggio "github.com/gogo/protobuf/io" cid "github.com/ipfs/go-cid" - inet "github.com/libp2p/go-libp2p-net" -) -// TODO move message.go into the bitswap package -// TODO move bs/msg/internal/pb to bs/internal/pb and rename pb package to bitswap_pb + "github.com/libp2p/go-libp2p-core/network" +) +// BitSwapMessage is the basic interface for interacting building, encoding, +// and decoding messages sent on the BitSwap protocol. type BitSwapMessage interface { // Wantlist returns a slice of unique keys that represent data wanted by // the sender. @@ -40,6 +40,8 @@ type BitSwapMessage interface { Loggable() map[string]interface{} } +// Exportable is an interface for structures than can be +// encoded in a bitswap protobuf. type Exportable interface { ToProtoV0() *pb.Message ToProtoV1() *pb.Message @@ -53,6 +55,7 @@ type impl struct { blocks map[cid.Cid]blocks.Block } +// New returns a new, empty bitswap message func New(full bool) BitSwapMessage { return newMsg(full) } @@ -65,6 +68,8 @@ func newMsg(full bool) *impl { } } +// Entry is an wantlist entry in a Bitswap message (along with whether it's an +// add or cancel). type Entry struct { wantlist.Entry Cancel bool @@ -163,11 +168,13 @@ func (m *impl) AddBlock(b blocks.Block) { m.blocks[b.Cid()] = b } +// FromNet generates a new BitswapMessage from incoming data on an io.Reader. func FromNet(r io.Reader) (BitSwapMessage, error) { - pbr := ggio.NewDelimitedReader(r, inet.MessageSizeMax) + pbr := ggio.NewDelimitedReader(r, network.MessageSizeMax) return FromPBReader(pbr) } +// FromPBReader generates a new Bitswap message from a gogo-protobuf reader func FromPBReader(pbr ggio.Reader) (BitSwapMessage, error) { pb := new(pb.Message) if err := pbr.ReadMsg(pb); err != nil { diff --git a/vendor/github.com/ipfs/go-bitswap/messagequeue/messagequeue.go b/vendor/github.com/ipfs/go-bitswap/messagequeue/messagequeue.go index a7142508..9e472424 100644 --- a/vendor/github.com/ipfs/go-bitswap/messagequeue/messagequeue.go +++ b/vendor/github.com/ipfs/go-bitswap/messagequeue/messagequeue.go @@ -9,7 +9,7 @@ import ( bsnet "github.com/ipfs/go-bitswap/network" wantlist "github.com/ipfs/go-bitswap/wantlist" logging "github.com/ipfs/go-log" - peer "github.com/libp2p/go-libp2p-peer" + peer "github.com/libp2p/go-libp2p-core/peer" ) var log = logging.Logger("bitswap") diff --git a/vendor/github.com/ipfs/go-bitswap/network/interface.go b/vendor/github.com/ipfs/go-bitswap/network/interface.go index 2d2c9b19..783e29e9 100644 --- a/vendor/github.com/ipfs/go-bitswap/network/interface.go +++ b/vendor/github.com/ipfs/go-bitswap/network/interface.go @@ -6,16 +6,19 @@ import ( bsmsg "github.com/ipfs/go-bitswap/message" cid "github.com/ipfs/go-cid" - ifconnmgr "github.com/libp2p/go-libp2p-interface-connmgr" - peer "github.com/libp2p/go-libp2p-peer" - protocol "github.com/libp2p/go-libp2p-protocol" + + "github.com/libp2p/go-libp2p-core/connmgr" + "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p-core/protocol" ) var ( - // These two are equivalent, legacy - ProtocolBitswapOne protocol.ID = "/ipfs/bitswap/1.0.0" + // ProtocolBitswapOne is the prefix for the legacy bitswap protocol + ProtocolBitswapOne protocol.ID = "/ipfs/bitswap/1.0.0" + // ProtocolBitswapNoVers is equivalent to the legacy bitswap protocol ProtocolBitswapNoVers protocol.ID = "/ipfs/bitswap" + // ProtocolBitswap is the current version of bitswap protocol, 1.1.0 ProtocolBitswap protocol.ID = "/ipfs/bitswap/1.1.0" ) @@ -36,20 +39,22 @@ type BitSwapNetwork interface { NewMessageSender(context.Context, peer.ID) (MessageSender, error) - ConnectionManager() ifconnmgr.ConnManager + ConnectionManager() connmgr.ConnManager - Stats() NetworkStats + Stats() Stats Routing } +// MessageSender is an interface for sending a series of messages over the bitswap +// network type MessageSender interface { SendMsg(context.Context, bsmsg.BitSwapMessage) error Close() error Reset() error } -// Implement Receiver to receive messages from the BitSwapNetwork. +// Receiver is an interface that can receive messages from the BitSwapNetwork. type Receiver interface { ReceiveMessage( ctx context.Context, @@ -63,6 +68,8 @@ type Receiver interface { PeerDisconnected(peer.ID) } +// Routing is an interface to providing and finding providers on a bitswap +// network. type Routing interface { // FindProvidersAsync returns a channel of providers for the given key. FindProvidersAsync(context.Context, cid.Cid, int) <-chan peer.ID @@ -71,10 +78,10 @@ type Routing interface { Provide(context.Context, cid.Cid) error } -// NetworkStats is a container for statistics about the bitswap network +// Stats is a container for statistics about the bitswap network // the numbers inside are specific to bitswap, and not any other protocols // using the same underlying network. -type NetworkStats struct { +type Stats struct { MessagesSent uint64 MessagesRecvd uint64 } diff --git a/vendor/github.com/ipfs/go-bitswap/network/ipfs_impl.go b/vendor/github.com/ipfs/go-bitswap/network/ipfs_impl.go index 8c2f5d68..2cfbbcbf 100644 --- a/vendor/github.com/ipfs/go-bitswap/network/ipfs_impl.go +++ b/vendor/github.com/ipfs/go-bitswap/network/ipfs_impl.go @@ -8,16 +8,17 @@ import ( "time" bsmsg "github.com/ipfs/go-bitswap/message" + "github.com/libp2p/go-libp2p-core/helpers" ggio "github.com/gogo/protobuf/io" cid "github.com/ipfs/go-cid" logging "github.com/ipfs/go-log" - host "github.com/libp2p/go-libp2p-host" - ifconnmgr "github.com/libp2p/go-libp2p-interface-connmgr" - inet "github.com/libp2p/go-libp2p-net" - peer "github.com/libp2p/go-libp2p-peer" - pstore "github.com/libp2p/go-libp2p-peerstore" - routing "github.com/libp2p/go-libp2p-routing" + "github.com/libp2p/go-libp2p-core/connmgr" + "github.com/libp2p/go-libp2p-core/host" + "github.com/libp2p/go-libp2p-core/network" + "github.com/libp2p/go-libp2p-core/peer" + peerstore "github.com/libp2p/go-libp2p-core/peerstore" + "github.com/libp2p/go-libp2p-core/routing" ma "github.com/multiformats/go-multiaddr" ) @@ -31,12 +32,6 @@ func NewFromIpfsHost(host host.Host, r routing.ContentRouting) BitSwapNetwork { host: host, routing: r, } - host.SetStreamHandler(ProtocolBitswap, bitswapNetwork.handleNewStream) - host.SetStreamHandler(ProtocolBitswapOne, bitswapNetwork.handleNewStream) - host.SetStreamHandler(ProtocolBitswapNoVers, bitswapNetwork.handleNewStream) - host.Network().Notify((*netNotifiee)(&bitswapNetwork)) - // TODO: StopNotify. - return &bitswapNetwork } @@ -49,15 +44,15 @@ type impl struct { // inbound messages from the network are forwarded to the receiver receiver Receiver - stats NetworkStats + stats Stats } type streamMessageSender struct { - s inet.Stream + s network.Stream } func (s *streamMessageSender) Close() error { - return inet.FullClose(s.s) + return helpers.FullClose(s.s) } func (s *streamMessageSender) Reset() error { @@ -68,7 +63,7 @@ func (s *streamMessageSender) SendMsg(ctx context.Context, msg bsmsg.BitSwapMess return msgToStream(ctx, s.s, msg) } -func msgToStream(ctx context.Context, s inet.Stream, msg bsmsg.BitSwapMessage) error { +func msgToStream(ctx context.Context, s network.Stream, msg bsmsg.BitSwapMessage) error { deadline := time.Now().Add(sendMessageTimeout) if dl, ok := ctx.Deadline(); ok { deadline = dl @@ -108,7 +103,7 @@ func (bsnet *impl) NewMessageSender(ctx context.Context, p peer.ID) (MessageSend return &streamMessageSender{s: s}, nil } -func (bsnet *impl) newStreamToPeer(ctx context.Context, p peer.ID) (inet.Stream, error) { +func (bsnet *impl) newStreamToPeer(ctx context.Context, p peer.ID) (network.Stream, error) { return bsnet.host.NewStream(ctx, p, ProtocolBitswap, ProtocolBitswapOne, ProtocolBitswapNoVers) } @@ -129,17 +124,23 @@ func (bsnet *impl) SendMessage( atomic.AddUint64(&bsnet.stats.MessagesSent, 1) // TODO(https://github.com/libp2p/go-libp2p-net/issues/28): Avoid this goroutine. - go inet.AwaitEOF(s) + go helpers.AwaitEOF(s) return s.Close() } func (bsnet *impl) SetDelegate(r Receiver) { bsnet.receiver = r + bsnet.host.SetStreamHandler(ProtocolBitswap, bsnet.handleNewStream) + bsnet.host.SetStreamHandler(ProtocolBitswapOne, bsnet.handleNewStream) + bsnet.host.SetStreamHandler(ProtocolBitswapNoVers, bsnet.handleNewStream) + bsnet.host.Network().Notify((*netNotifiee)(bsnet)) + // TODO: StopNotify. + } func (bsnet *impl) ConnectTo(ctx context.Context, p peer.ID) error { - return bsnet.host.Connect(ctx, pstore.PeerInfo{ID: p}) + return bsnet.host.Connect(ctx, peer.AddrInfo{ID: p}) } // FindProvidersAsync returns a channel of providers for the given key. @@ -152,7 +153,7 @@ func (bsnet *impl) FindProvidersAsync(ctx context.Context, k cid.Cid, max int) < if info.ID == bsnet.host.ID() { continue // ignore self as provider } - bsnet.host.Peerstore().AddAddrs(info.ID, info.Addrs, pstore.TempAddrTTL) + bsnet.host.Peerstore().AddAddrs(info.ID, info.Addrs, peerstore.TempAddrTTL) select { case <-ctx.Done(): return @@ -169,7 +170,7 @@ func (bsnet *impl) Provide(ctx context.Context, k cid.Cid) error { } // handleNewStream receives a new stream from the network. -func (bsnet *impl) handleNewStream(s inet.Stream) { +func (bsnet *impl) handleNewStream(s network.Stream) { defer s.Close() if bsnet.receiver == nil { @@ -177,7 +178,7 @@ func (bsnet *impl) handleNewStream(s inet.Stream) { return } - reader := ggio.NewDelimitedReader(s, inet.MessageSizeMax) + reader := ggio.NewDelimitedReader(s, network.MessageSizeMax) for { received, err := bsmsg.FromPBReader(reader) if err != nil { @@ -197,12 +198,12 @@ func (bsnet *impl) handleNewStream(s inet.Stream) { } } -func (bsnet *impl) ConnectionManager() ifconnmgr.ConnManager { +func (bsnet *impl) ConnectionManager() connmgr.ConnManager { return bsnet.host.ConnManager() } -func (bsnet *impl) Stats() NetworkStats { - return NetworkStats{ +func (bsnet *impl) Stats() Stats { + return Stats{ MessagesRecvd: atomic.LoadUint64(&bsnet.stats.MessagesRecvd), MessagesSent: atomic.LoadUint64(&bsnet.stats.MessagesSent), } @@ -214,15 +215,15 @@ func (nn *netNotifiee) impl() *impl { return (*impl)(nn) } -func (nn *netNotifiee) Connected(n inet.Network, v inet.Conn) { +func (nn *netNotifiee) Connected(n network.Network, v network.Conn) { nn.impl().receiver.PeerConnected(v.RemotePeer()) } -func (nn *netNotifiee) Disconnected(n inet.Network, v inet.Conn) { +func (nn *netNotifiee) Disconnected(n network.Network, v network.Conn) { nn.impl().receiver.PeerDisconnected(v.RemotePeer()) } -func (nn *netNotifiee) OpenedStream(n inet.Network, v inet.Stream) {} -func (nn *netNotifiee) ClosedStream(n inet.Network, v inet.Stream) {} -func (nn *netNotifiee) Listen(n inet.Network, a ma.Multiaddr) {} -func (nn *netNotifiee) ListenClose(n inet.Network, a ma.Multiaddr) {} +func (nn *netNotifiee) OpenedStream(n network.Network, v network.Stream) {} +func (nn *netNotifiee) ClosedStream(n network.Network, v network.Stream) {} +func (nn *netNotifiee) Listen(n network.Network, a ma.Multiaddr) {} +func (nn *netNotifiee) ListenClose(n network.Network, a ma.Multiaddr) {} diff --git a/vendor/github.com/ipfs/go-bitswap/notifications/notifications.go b/vendor/github.com/ipfs/go-bitswap/notifications/notifications.go index b29640be..0934fa5f 100644 --- a/vendor/github.com/ipfs/go-bitswap/notifications/notifications.go +++ b/vendor/github.com/ipfs/go-bitswap/notifications/notifications.go @@ -11,12 +11,16 @@ import ( const bufferSize = 16 +// PubSub is a simple interface for publishing blocks and being able to subscribe +// for cids. It's used internally by bitswap to decouple receiving blocks +// and actually providing them back to the GetBlocks caller. type PubSub interface { Publish(block blocks.Block) Subscribe(ctx context.Context, keys ...cid.Cid) <-chan blocks.Block Shutdown() } +// New generates a new PubSub interface. func New() PubSub { return &impl{ wrapped: *pubsub.New(bufferSize), diff --git a/vendor/github.com/ipfs/go-bitswap/package.json b/vendor/github.com/ipfs/go-bitswap/package.json deleted file mode 100644 index f9882e49..00000000 --- a/vendor/github.com/ipfs/go-bitswap/package.json +++ /dev/null @@ -1,196 +0,0 @@ -{ - "author": "why", - "bugs": { - "url": "https://github.com/ipfs/go-bitswap" - }, - "gx": { - "dvcsimport": "github.com/ipfs/go-bitswap" - }, - "gxDependencies": [ - { - "author": "whyrusleeping", - "hash": "QmTRN7hRxvGkxKxDdeudty7sRet4L7ZKZCqKsXHa79wmAc", - "name": "go-libp2p", - "version": "6.0.41" - }, - { - "author": "hsanjuan", - "hash": "QmZ22s3UgNi5vvYNH79jWJ63NPyQGiv4mdNaWCz4WKqMTZ", - "name": "go-ipfs-routing", - "version": "0.1.18" - }, - { - "author": "whyrusleeping", - "hash": "QmWapVoHjtKhn4MhvKNoPTkJKADFGACfXPFnt7combwp5W", - "name": "go-testutil", - "version": "1.2.19" - }, - { - "author": "whyrusleeping", - "hash": "QmYVXrKrKHDC9FobgmcmshCDyWwdrfwfanNQN4oxJ9Fk3h", - "name": "go-libp2p-peer", - "version": "3.1.2" - }, - { - "author": "whyrusleeping", - "hash": "QmTbxNB1NwDesLmKTscr4udL2tVP7MaxvXnD1D9yX7g3PN", - "name": "go-cid", - "version": "0.9.3" - }, - { - "author": "whyrusleeping", - "hash": "QmddjPSGZb3ieihSseFeCfVRpZzcqczPNsD2DvarSwnjJB", - "name": "gogo-protobuf", - "version": "1.2.1" - }, - { - "author": "stebalien", - "hash": "QmYYLnAzR28nAQ4U5MFniLprnktu6eTFKibeNt96V21EZK", - "name": "go-block-format", - "version": "0.2.2" - }, - { - "author": "ipfs", - "hash": "QmekzFM3hPZjTjUFGTABdQkEnQ3PTiMstY198PwSFr5w1Q", - "name": "go-metrics-interface", - "version": "0.2.0" - }, - { - "author": "cskr", - "hash": "QmPKLamJq9Z2apKJVCVXZ5aYNrWiFk5HTKjmEbU16Qjdcd", - "name": "pubsub", - "version": "1.0.2" - }, - { - "author": "hsanjuan", - "hash": "QmZUbTDJ39JpvtFCSubiWeUTQRvMA1tVE5RZCJrY4oeAsC", - "name": "go-ipfs-pq", - "version": "0.0.1" - }, - { - "author": "hsanjuan", - "hash": "QmcbQ44AgbtV1rnxZz5RsRVduxdgNYLANxnsuW5wvvu4ts", - "name": "go-ipfs-blocksutil", - "version": "0.1.2" - }, - { - "author": "hsanjuan", - "hash": "QmXjKkjMDTtXAiLBwstVexofB8LeruZmE2eBd85GwGFFLA", - "name": "go-ipfs-blockstore", - "version": "0.1.8" - }, - { - "author": "hector", - "hash": "QmRMGdC6HKdLsPDABL9aXPDidrpmEHzJqFWSvshkbn9Hj8", - "name": "go-ipfs-flags", - "version": "0.0.1" - }, - { - "author": "hsanjuan", - "hash": "QmWokDcQdSZCxrNxgaRzQDDBofALhActzNBaxRLtiRkUHg", - "name": "go-ipfs-exchange-interface", - "version": "0.1.3" - }, - { - "author": "whyrusleeping", - "hash": "QmNohiVssaPw3KVLZik59DBVGTSm2dGvYT9eoXt5DQ36Yz", - "name": "go-ipfs-util", - "version": "1.2.9" - }, - { - "author": "whyrusleeping", - "hash": "QmYrWiWM4qtrnCeT3R14jY3ZZyirDNJgwK57q4qFYePgbd", - "name": "go-libp2p-host", - "version": "3.0.26" - }, - { - "author": "hsanjuan", - "hash": "QmUe1WCHkQaz4UeNKiHDUBV2T6i9prc3DniqyHPXyfGaUq", - "name": "go-ipfs-delay", - "version": "0.1.0" - }, - { - "hash": "QmbkT7eMTyXfpeyB3ZMxxcxg7XH8t6uXp49jqzz4HB7BGF", - "name": "go-log", - "version": "1.5.9" - }, - { - "author": "whyrusleeping", - "hash": "QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP", - "name": "goprocess", - "version": "1.0.0" - }, - { - "author": "hashicorp", - "hash": "QmQjMHF8ptRgx4E57UFMiT4YM6kqaJeYxZ1MCDX23aw4rK", - "name": "golang-lru", - "version": "2017.10.18" - }, - { - "author": "whyrusleeping", - "hash": "QmQzyPDx8rLqJ5evnHAo4Mpbsb64RKGZzLABzsbXQM6a2j", - "name": "go-libp2p-netutil", - "version": "0.4.23" - }, - { - "author": "whyrusleeping", - "hash": "QmY3ArotKMKaL7YGfbQfyDrib6RVraLqZYWXZvVgZktBxp", - "name": "go-libp2p-net", - "version": "3.0.30" - }, - { - "author": "whyrusleeping", - "hash": "QmaCTz9RkrU13bm9kMB54f7atgqM4qkjDZpRwRoJiWXEqs", - "name": "go-libp2p-peerstore", - "version": "2.0.19" - }, - { - "author": "multiformats", - "hash": "QmTZBfrPJmjWsCvHEtX5FE6KimVJhsJg5sBbqEFYf4UZtL", - "name": "go-multiaddr", - "version": "1.4.1" - }, - { - "author": "whyrusleeping", - "hash": "QmZNkThpqfVXs9GNbexPrfBbXSLNYeKrE7jwFM2oqHbyqN", - "name": "go-libp2p-protocol", - "version": "1.0.0" - }, - { - "author": "whyrusleeping", - "hash": "QmUbSLukzZYZvEYxynj9Dtd1WrGLxxg9R4U68vCMPWHmRU", - "name": "go-libp2p-loggables", - "version": "1.1.33" - }, - { - "author": "why", - "hash": "QmXa6sgzUvP5bgF5CyyV36bZYv5VDRwttggQYUPvFybLVd", - "name": "go-libp2p-interface-connmgr", - "version": "0.0.32" - }, - { - "author": "jbenet", - "hash": "QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9", - "name": "go-datastore", - "version": "3.6.1" - }, - { - "hash": "QmYxUdYY9S6yg5tSPVin5GFTvtfsLauVcr7reHDD3dM8xf", - "name": "go-libp2p-routing", - "version": "2.7.13" - }, - { - "author": "jbenet", - "hash": "Qmf7HqcW7LtCi1W8y2bdx2eJpze74jkbKqpByxgXikdbLF", - "name": "go-detect-race", - "version": "1.0.1" - } - ], - "gxVersion": "0.12.1", - "language": "go", - "license": "", - "name": "go-bitswap", - "releaseCmd": "git commit -a -m \"gx publish $VERSION\"", - "version": "1.1.31" -} - diff --git a/vendor/github.com/ipfs/go-bitswap/peermanager/peermanager.go b/vendor/github.com/ipfs/go-bitswap/peermanager/peermanager.go index 59e8ca3d..3aefbbe6 100644 --- a/vendor/github.com/ipfs/go-bitswap/peermanager/peermanager.go +++ b/vendor/github.com/ipfs/go-bitswap/peermanager/peermanager.go @@ -2,19 +2,11 @@ package peermanager import ( "context" - "sync" bsmsg "github.com/ipfs/go-bitswap/message" wantlist "github.com/ipfs/go-bitswap/wantlist" - logging "github.com/ipfs/go-log" - peer "github.com/libp2p/go-libp2p-peer" -) - -var log = logging.Logger("bitswap") - -var ( - metricsBuckets = []float64{1 << 6, 1 << 10, 1 << 14, 1 << 18, 1<<18 + 15, 1 << 22} + peer "github.com/libp2p/go-libp2p-core/peer" ) // PeerQueue provides a queer of messages to be sent for a single peer. @@ -28,10 +20,6 @@ type PeerQueue interface { // PeerQueueFactory provides a function that will create a PeerQueue. type PeerQueueFactory func(ctx context.Context, p peer.ID) PeerQueue -type peerMessage interface { - handle(pm *PeerManager) -} - type peerQueueInstance struct { refcnt int pq PeerQueue @@ -40,8 +28,7 @@ type peerQueueInstance struct { // PeerManager manages a pool of peers and sends messages to peers in the pool. type PeerManager struct { // peerQueues -- interact through internal utility functions get/set/remove/iterate - peerQueues map[peer.ID]*peerQueueInstance - peerQueuesLk sync.RWMutex + peerQueues map[peer.ID]*peerQueueInstance createPeerQueue PeerQueueFactory ctx context.Context @@ -58,8 +45,6 @@ func New(ctx context.Context, createPeerQueue PeerQueueFactory) *PeerManager { // ConnectedPeers returns a list of peers this PeerManager is managing. func (pm *PeerManager) ConnectedPeers() []peer.ID { - pm.peerQueuesLk.RLock() - defer pm.peerQueuesLk.RUnlock() peers := make([]peer.ID, 0, len(pm.peerQueues)) for p := range pm.peerQueues { peers = append(peers, p) @@ -70,8 +55,6 @@ func (pm *PeerManager) ConnectedPeers() []peer.ID { // Connected is called to add a new peer to the pool, and send it an initial set // of wants. func (pm *PeerManager) Connected(p peer.ID, initialWants *wantlist.SessionTrackedWantlist) { - pm.peerQueuesLk.Lock() - pq := pm.getOrCreate(p) if pq.refcnt == 0 { @@ -79,47 +62,35 @@ func (pm *PeerManager) Connected(p peer.ID, initialWants *wantlist.SessionTracke } pq.refcnt++ - - pm.peerQueuesLk.Unlock() } // Disconnected is called to remove a peer from the pool. func (pm *PeerManager) Disconnected(p peer.ID) { - pm.peerQueuesLk.Lock() pq, ok := pm.peerQueues[p] if !ok { - pm.peerQueuesLk.Unlock() return } pq.refcnt-- if pq.refcnt > 0 { - pm.peerQueuesLk.Unlock() return } delete(pm.peerQueues, p) - pm.peerQueuesLk.Unlock() - pq.pq.Shutdown() - } // SendMessage is called to send a message to all or some peers in the pool; // if targets is nil, it sends to all. func (pm *PeerManager) SendMessage(entries []bsmsg.Entry, targets []peer.ID, from uint64) { if len(targets) == 0 { - pm.peerQueuesLk.RLock() for _, p := range pm.peerQueues { p.pq.AddMessage(entries, from) } - pm.peerQueuesLk.RUnlock() } else { for _, t := range targets { - pm.peerQueuesLk.Lock() pqi := pm.getOrCreate(t) - pm.peerQueuesLk.Unlock() pqi.pq.AddMessage(entries, from) } } diff --git a/vendor/github.com/ipfs/go-bitswap/providerquerymanager/providerquerymanager.go b/vendor/github.com/ipfs/go-bitswap/providerquerymanager/providerquerymanager.go index a84e1f91..e1f77edf 100644 --- a/vendor/github.com/ipfs/go-bitswap/providerquerymanager/providerquerymanager.go +++ b/vendor/github.com/ipfs/go-bitswap/providerquerymanager/providerquerymanager.go @@ -8,7 +8,7 @@ import ( "github.com/ipfs/go-cid" logging "github.com/ipfs/go-log" - peer "github.com/libp2p/go-libp2p-peer" + peer "github.com/libp2p/go-libp2p-core/peer" ) var log = logging.Logger("bitswap") diff --git a/vendor/github.com/ipfs/go-bitswap/session/session.go b/vendor/github.com/ipfs/go-bitswap/session/session.go index b57f472e..0757ab11 100644 --- a/vendor/github.com/ipfs/go-bitswap/session/session.go +++ b/vendor/github.com/ipfs/go-bitswap/session/session.go @@ -2,6 +2,7 @@ package session import ( "context" + "math/rand" "time" lru "github.com/hashicorp/golang-lru" @@ -9,9 +10,10 @@ import ( notifications "github.com/ipfs/go-bitswap/notifications" blocks "github.com/ipfs/go-block-format" cid "github.com/ipfs/go-cid" + delay "github.com/ipfs/go-ipfs-delay" logging "github.com/ipfs/go-log" + peer "github.com/libp2p/go-libp2p-core/peer" loggables "github.com/libp2p/go-libp2p-loggables" - peer "github.com/libp2p/go-libp2p-peer" bssrs "github.com/ipfs/go-bitswap/sessionrequestsplitter" ) @@ -75,14 +77,18 @@ type Session struct { tickDelayReqs chan time.Duration // do not touch outside run loop - tofetch *cidQueue - interest *lru.Cache - pastWants *cidQueue - liveWants map[cid.Cid]time.Time - tick *time.Timer - baseTickDelay time.Duration - latTotal time.Duration - fetchcnt int + tofetch *cidQueue + interest *lru.Cache + pastWants *cidQueue + liveWants map[cid.Cid]time.Time + idleTick *time.Timer + periodicSearchTimer *time.Timer + baseTickDelay time.Duration + latTotal time.Duration + fetchcnt int + consecutiveTicks int + initialSearchDelay time.Duration + periodicSearchDelay delay.D // identifiers notif notifications.PubSub uuid logging.Loggable @@ -91,25 +97,33 @@ type Session struct { // New creates a new bitswap session whose lifetime is bounded by the // given context. -func New(ctx context.Context, id uint64, wm WantManager, pm PeerManager, srs RequestSplitter) *Session { +func New(ctx context.Context, + id uint64, + wm WantManager, + pm PeerManager, + srs RequestSplitter, + initialSearchDelay time.Duration, + periodicSearchDelay delay.D) *Session { s := &Session{ - liveWants: make(map[cid.Cid]time.Time), - newReqs: make(chan []cid.Cid), - cancelKeys: make(chan []cid.Cid), - tofetch: newCidQueue(), - pastWants: newCidQueue(), - interestReqs: make(chan interestReq), - latencyReqs: make(chan chan time.Duration), - tickDelayReqs: make(chan time.Duration), - ctx: ctx, - wm: wm, - pm: pm, - srs: srs, - incoming: make(chan blkRecv), - notif: notifications.New(), - uuid: loggables.Uuid("GetBlockRequest"), - baseTickDelay: time.Millisecond * 500, - id: id, + liveWants: make(map[cid.Cid]time.Time), + newReqs: make(chan []cid.Cid), + cancelKeys: make(chan []cid.Cid), + tofetch: newCidQueue(), + pastWants: newCidQueue(), + interestReqs: make(chan interestReq), + latencyReqs: make(chan chan time.Duration), + tickDelayReqs: make(chan time.Duration), + ctx: ctx, + wm: wm, + pm: pm, + srs: srs, + incoming: make(chan blkRecv), + notif: notifications.New(), + uuid: loggables.Uuid("GetBlockRequest"), + baseTickDelay: time.Millisecond * 500, + id: id, + initialSearchDelay: initialSearchDelay, + periodicSearchDelay: periodicSearchDelay, } cache, _ := lru.New(2048) @@ -222,17 +236,11 @@ func (s *Session) SetBaseTickDelay(baseTickDelay time.Duration) { } } -var provSearchDelay = time.Second - -// SetProviderSearchDelay overwrites the global provider search delay -func SetProviderSearchDelay(newProvSearchDelay time.Duration) { - provSearchDelay = newProvSearchDelay -} - // Session run loop -- everything function below here should not be called // of this loop func (s *Session) run(ctx context.Context) { - s.tick = time.NewTimer(provSearchDelay) + s.idleTick = time.NewTimer(s.initialSearchDelay) + s.periodicSearchTimer = time.NewTimer(s.periodicSearchDelay.NextWaitTime()) for { select { case blk := <-s.incoming: @@ -245,8 +253,10 @@ func (s *Session) run(ctx context.Context) { s.handleNewRequest(ctx, keys) case keys := <-s.cancelKeys: s.handleCancel(keys) - case <-s.tick.C: - s.handleTick(ctx) + case <-s.idleTick.C: + s.handleIdleTick(ctx) + case <-s.periodicSearchTimer.C: + s.handlePeriodicSearch(ctx) case lwchk := <-s.interestReqs: lwchk.resp <- s.cidIsWanted(lwchk.c) case resp := <-s.latencyReqs: @@ -261,7 +271,7 @@ func (s *Session) run(ctx context.Context) { } func (s *Session) handleIncomingBlock(ctx context.Context, blk blkRecv) { - s.tick.Stop() + s.idleTick.Stop() if blk.from != "" { s.pm.RecordPeerResponse(blk.from, blk.blk.Cid()) @@ -269,7 +279,7 @@ func (s *Session) handleIncomingBlock(ctx context.Context, blk blkRecv) { s.receiveBlock(ctx, blk.blk) - s.resetTick() + s.resetIdleTick() } func (s *Session) handleNewRequest(ctx context.Context, keys []cid.Cid) { @@ -297,7 +307,7 @@ func (s *Session) handleCancel(keys []cid.Cid) { } } -func (s *Session) handleTick(ctx context.Context) { +func (s *Session) handleIdleTick(ctx context.Context) { live := make([]cid.Cid, 0, len(s.liveWants)) now := time.Now() @@ -310,14 +320,48 @@ func (s *Session) handleTick(ctx context.Context) { s.pm.RecordPeerRequests(nil, live) s.wm.WantBlocks(ctx, live, nil, s.id) - if len(live) > 0 { + // do no find providers on consecutive ticks + // -- just rely on periodic search widening + if len(live) > 0 && (s.consecutiveTicks == 0) { s.pm.FindMorePeers(ctx, live[0]) } - s.resetTick() + s.resetIdleTick() + + if len(s.liveWants) > 0 { + s.consecutiveTicks++ + } +} + +func (s *Session) handlePeriodicSearch(ctx context.Context) { + randomWant := s.randomLiveWant() + if !randomWant.Defined() { + return + } + + // TODO: come up with a better strategy for determining when to search + // for new providers for blocks. + s.pm.FindMorePeers(ctx, randomWant) + s.wm.WantBlocks(ctx, []cid.Cid{randomWant}, nil, s.id) + + s.periodicSearchTimer.Reset(s.periodicSearchDelay.NextWaitTime()) } +func (s *Session) randomLiveWant() cid.Cid { + if len(s.liveWants) == 0 { + return cid.Cid{} + } + i := rand.Intn(len(s.liveWants)) + // picking a random live want + for k := range s.liveWants { + if i == 0 { + return k + } + i-- + } + return cid.Cid{} +} func (s *Session) handleShutdown() { - s.tick.Stop() + s.idleTick.Stop() s.notif.Shutdown() live := make([]cid.Cid, 0, len(s.liveWants)) @@ -347,6 +391,8 @@ func (s *Session) receiveBlock(ctx context.Context, blk blocks.Block) { s.tofetch.Remove(c) } s.fetchcnt++ + // we've received new wanted blocks, so future ticks are not consecutive + s.consecutiveTicks = 0 s.notif.Publish(blk) toAdd := s.wantBudget() @@ -394,13 +440,16 @@ func (s *Session) averageLatency() time.Duration { return s.latTotal / time.Duration(s.fetchcnt) } -func (s *Session) resetTick() { +func (s *Session) resetIdleTick() { + var tickDelay time.Duration if s.latTotal == 0 { - s.tick.Reset(provSearchDelay) + tickDelay = s.initialSearchDelay } else { avLat := s.averageLatency() - s.tick.Reset(s.baseTickDelay + (3 * avLat)) + tickDelay = s.baseTickDelay + (3 * avLat) } + tickDelay = tickDelay * time.Duration(1+s.consecutiveTicks) + s.idleTick.Reset(tickDelay) } func (s *Session) wantBudget() int { diff --git a/vendor/github.com/ipfs/go-bitswap/sessionmanager/sessionmanager.go b/vendor/github.com/ipfs/go-bitswap/sessionmanager/sessionmanager.go index ac1bb700..a2617073 100644 --- a/vendor/github.com/ipfs/go-bitswap/sessionmanager/sessionmanager.go +++ b/vendor/github.com/ipfs/go-bitswap/sessionmanager/sessionmanager.go @@ -3,13 +3,15 @@ package sessionmanager import ( "context" "sync" + "time" blocks "github.com/ipfs/go-block-format" cid "github.com/ipfs/go-cid" + delay "github.com/ipfs/go-ipfs-delay" bssession "github.com/ipfs/go-bitswap/session" exchange "github.com/ipfs/go-ipfs-exchange-interface" - peer "github.com/libp2p/go-libp2p-peer" + peer "github.com/libp2p/go-libp2p-core/peer" ) // Session is a session that is managed by the session manager @@ -27,7 +29,7 @@ type sesTrk struct { } // SessionFactory generates a new session for the SessionManager to track. -type SessionFactory func(ctx context.Context, id uint64, pm bssession.PeerManager, srs bssession.RequestSplitter) Session +type SessionFactory func(ctx context.Context, id uint64, pm bssession.PeerManager, srs bssession.RequestSplitter, provSearchDelay time.Duration, rebroadcastDelay delay.D) Session // RequestSplitterFactory generates a new request splitter for a session. type RequestSplitterFactory func(ctx context.Context) bssession.RequestSplitter @@ -64,13 +66,15 @@ func New(ctx context.Context, sessionFactory SessionFactory, peerManagerFactory // NewSession initializes a session with the given context, and adds to the // session manager. -func (sm *SessionManager) NewSession(ctx context.Context) exchange.Fetcher { +func (sm *SessionManager) NewSession(ctx context.Context, + provSearchDelay time.Duration, + rebroadcastDelay delay.D) exchange.Fetcher { id := sm.GetNextSessionID() sessionctx, cancel := context.WithCancel(ctx) pm := sm.peerManagerFactory(sessionctx, id) srs := sm.requestSplitterFactory(sessionctx) - session := sm.sessionFactory(sessionctx, id, pm, srs) + session := sm.sessionFactory(sessionctx, id, pm, srs, provSearchDelay, rebroadcastDelay) tracked := sesTrk{session, pm, srs} sm.sessLk.Lock() sm.sessions = append(sm.sessions, tracked) diff --git a/vendor/github.com/ipfs/go-bitswap/sessionpeermanager/sessionpeermanager.go b/vendor/github.com/ipfs/go-bitswap/sessionpeermanager/sessionpeermanager.go index 0b02a2a2..59bfbf49 100644 --- a/vendor/github.com/ipfs/go-bitswap/sessionpeermanager/sessionpeermanager.go +++ b/vendor/github.com/ipfs/go-bitswap/sessionpeermanager/sessionpeermanager.go @@ -5,17 +5,15 @@ import ( "fmt" "math/rand" - logging "github.com/ipfs/go-log" - cid "github.com/ipfs/go-cid" - peer "github.com/libp2p/go-libp2p-peer" + peer "github.com/libp2p/go-libp2p-core/peer" ) -var log = logging.Logger("bitswap") - const ( - maxOptimizedPeers = 32 - reservePeers = 2 + maxOptimizedPeers = 32 + reservePeers = 2 + unoptimizedTagValue = 5 // tag value for "unoptimized" session peers. + optimizedTagValue = 10 // tag value for "optimized" session peers. ) // PeerTagger is an interface for tagging peers with metadata @@ -131,8 +129,8 @@ func (spm *SessionPeerManager) run(ctx context.Context) { } } -func (spm *SessionPeerManager) tagPeer(p peer.ID) { - spm.tagger.TagPeer(p, spm.tag, 10) +func (spm *SessionPeerManager) tagPeer(p peer.ID, value int) { + spm.tagger.TagPeer(p, spm.tag, value) } func (spm *SessionPeerManager) insertOptimizedPeer(p peer.ID) { @@ -173,7 +171,7 @@ func (pfm *peerFoundMessage) handle(spm *SessionPeerManager) { if _, ok := spm.activePeers[p]; !ok { spm.activePeers[p] = false spm.unoptimizedPeersArr = append(spm.unoptimizedPeersArr, p) - spm.tagPeer(p) + spm.tagPeer(p, unoptimizedTagValue) } } @@ -182,17 +180,16 @@ type peerResponseMessage struct { } func (prm *peerResponseMessage) handle(spm *SessionPeerManager) { - p := prm.p isOptimized, ok := spm.activePeers[p] - if !ok { - spm.activePeers[p] = true - spm.tagPeer(p) + if isOptimized { + spm.removeOptimizedPeer(p) } else { - if isOptimized { - spm.removeOptimizedPeer(p) - } else { - spm.activePeers[p] = true + spm.activePeers[p] = true + spm.tagPeer(p, optimizedTagValue) + + // transition from unoptimized. + if ok { spm.removeUnoptimizedPeer(p) } } diff --git a/vendor/github.com/ipfs/go-bitswap/sessionrequestsplitter/sessionrequestsplitter.go b/vendor/github.com/ipfs/go-bitswap/sessionrequestsplitter/sessionrequestsplitter.go index 1305b73b..5400fe5c 100644 --- a/vendor/github.com/ipfs/go-bitswap/sessionrequestsplitter/sessionrequestsplitter.go +++ b/vendor/github.com/ipfs/go-bitswap/sessionrequestsplitter/sessionrequestsplitter.go @@ -4,7 +4,7 @@ import ( "context" "github.com/ipfs/go-cid" - "github.com/libp2p/go-libp2p-peer" + "github.com/libp2p/go-libp2p-core/peer" ) const ( diff --git a/vendor/github.com/ipfs/go-bitswap/stat.go b/vendor/github.com/ipfs/go-bitswap/stat.go index 99b2def1..af39ecb2 100644 --- a/vendor/github.com/ipfs/go-bitswap/stat.go +++ b/vendor/github.com/ipfs/go-bitswap/stat.go @@ -6,6 +6,7 @@ import ( cid "github.com/ipfs/go-cid" ) +// Stat is a struct that provides various statistics on bitswap operations type Stat struct { ProvideBufLen int Wantlist []cid.Cid @@ -19,6 +20,7 @@ type Stat struct { MessagesReceived uint64 } +// Stat returns aggregated statistics about bitswap operations func (bs *Bitswap) Stat() (*Stat, error) { st := new(Stat) st.ProvideBufLen = len(bs.newBlocks) diff --git a/vendor/github.com/ipfs/go-bitswap/testnet/interface.go b/vendor/github.com/ipfs/go-bitswap/testnet/interface.go deleted file mode 100644 index ed7d4b1e..00000000 --- a/vendor/github.com/ipfs/go-bitswap/testnet/interface.go +++ /dev/null @@ -1,13 +0,0 @@ -package bitswap - -import ( - bsnet "github.com/ipfs/go-bitswap/network" - peer "github.com/libp2p/go-libp2p-peer" - "github.com/libp2p/go-testutil" -) - -type Network interface { - Adapter(testutil.Identity) bsnet.BitSwapNetwork - - HasPeer(peer.ID) bool -} diff --git a/vendor/github.com/ipfs/go-bitswap/testnet/internet_latency_delay_generator.go b/vendor/github.com/ipfs/go-bitswap/testnet/internet_latency_delay_generator.go deleted file mode 100644 index 25b9f5b8..00000000 --- a/vendor/github.com/ipfs/go-bitswap/testnet/internet_latency_delay_generator.go +++ /dev/null @@ -1,63 +0,0 @@ -package bitswap - -import ( - "math/rand" - "time" - - "github.com/ipfs/go-ipfs-delay" -) - -var sharedRNG = rand.New(rand.NewSource(time.Now().UnixNano())) - -// InternetLatencyDelayGenerator generates three clusters of delays, -// typical of the type of peers you would encounter on the interenet. -// Given a base delay time T, the wait time generated will be either: -// 1. A normalized distribution around the base time -// 2. A normalized distribution around the base time plus a "medium" delay -// 3. A normalized distribution around the base time plus a "large" delay -// The size of the medium & large delays are determined when the generator -// is constructed, as well as the relative percentages with which delays fall -// into each of the three different clusters, and the standard deviation for -// the normalized distribution. -// This can be used to generate a number of scenarios typical of latency -// distribution among peers on the internet. -func InternetLatencyDelayGenerator( - mediumDelay time.Duration, - largeDelay time.Duration, - percentMedium float64, - percentLarge float64, - std time.Duration, - rng *rand.Rand) delay.Generator { - if rng == nil { - rng = sharedRNG - } - - return &internetLatencyDelayGenerator{ - mediumDelay: mediumDelay, - largeDelay: largeDelay, - percentLarge: percentLarge, - percentMedium: percentMedium, - std: std, - rng: rng, - } -} - -type internetLatencyDelayGenerator struct { - mediumDelay time.Duration - largeDelay time.Duration - percentLarge float64 - percentMedium float64 - std time.Duration - rng *rand.Rand -} - -func (d *internetLatencyDelayGenerator) NextWaitTime(t time.Duration) time.Duration { - clusterDistribution := d.rng.Float64() - baseDelay := time.Duration(d.rng.NormFloat64()*float64(d.std)) + t - if clusterDistribution < d.percentLarge { - return baseDelay + d.largeDelay - } else if clusterDistribution < d.percentMedium+d.percentLarge { - return baseDelay + d.mediumDelay - } - return baseDelay -} diff --git a/vendor/github.com/ipfs/go-bitswap/testnet/peernet.go b/vendor/github.com/ipfs/go-bitswap/testnet/peernet.go deleted file mode 100644 index dbad1f65..00000000 --- a/vendor/github.com/ipfs/go-bitswap/testnet/peernet.go +++ /dev/null @@ -1,42 +0,0 @@ -package bitswap - -import ( - "context" - - bsnet "github.com/ipfs/go-bitswap/network" - - ds "github.com/ipfs/go-datastore" - mockrouting "github.com/ipfs/go-ipfs-routing/mock" - peer "github.com/libp2p/go-libp2p-peer" - mockpeernet "github.com/libp2p/go-libp2p/p2p/net/mock" - testutil "github.com/libp2p/go-testutil" -) - -type peernet struct { - mockpeernet.Mocknet - routingserver mockrouting.Server -} - -func StreamNet(ctx context.Context, net mockpeernet.Mocknet, rs mockrouting.Server) (Network, error) { - return &peernet{net, rs}, nil -} - -func (pn *peernet) Adapter(p testutil.Identity) bsnet.BitSwapNetwork { - client, err := pn.Mocknet.AddPeer(p.PrivateKey(), p.Address()) - if err != nil { - panic(err.Error()) - } - routing := pn.routingserver.ClientWithDatastore(context.TODO(), p, ds.NewMapDatastore()) - return bsnet.NewFromIpfsHost(client, routing) -} - -func (pn *peernet) HasPeer(p peer.ID) bool { - for _, member := range pn.Mocknet.Peers() { - if p == member { - return true - } - } - return false -} - -var _ Network = (*peernet)(nil) diff --git a/vendor/github.com/ipfs/go-bitswap/testnet/rate_limit_generators.go b/vendor/github.com/ipfs/go-bitswap/testnet/rate_limit_generators.go deleted file mode 100644 index 2c4a1cd5..00000000 --- a/vendor/github.com/ipfs/go-bitswap/testnet/rate_limit_generators.go +++ /dev/null @@ -1,42 +0,0 @@ -package bitswap - -import ( - "math/rand" -) - -type fixedRateLimitGenerator struct { - rateLimit float64 -} - -// FixedRateLimitGenerator returns a rate limit generatoe that always generates -// the specified rate limit in bytes/sec. -func FixedRateLimitGenerator(rateLimit float64) RateLimitGenerator { - return &fixedRateLimitGenerator{rateLimit} -} - -func (rateLimitGenerator *fixedRateLimitGenerator) NextRateLimit() float64 { - return rateLimitGenerator.rateLimit -} - -type variableRateLimitGenerator struct { - rateLimit float64 - std float64 - rng *rand.Rand -} - -// VariableRateLimitGenerator makes rate limites that following a normal distribution. -func VariableRateLimitGenerator(rateLimit float64, std float64, rng *rand.Rand) RateLimitGenerator { - if rng == nil { - rng = sharedRNG - } - - return &variableRateLimitGenerator{ - std: std, - rng: rng, - rateLimit: rateLimit, - } -} - -func (rateLimitGenerator *variableRateLimitGenerator) NextRateLimit() float64 { - return rateLimitGenerator.rng.NormFloat64()*rateLimitGenerator.std + rateLimitGenerator.rateLimit -} diff --git a/vendor/github.com/ipfs/go-bitswap/testnet/virtual.go b/vendor/github.com/ipfs/go-bitswap/testnet/virtual.go deleted file mode 100644 index e3af99d0..00000000 --- a/vendor/github.com/ipfs/go-bitswap/testnet/virtual.go +++ /dev/null @@ -1,330 +0,0 @@ -package bitswap - -import ( - "context" - "errors" - "sort" - "sync" - "sync/atomic" - "time" - - bsmsg "github.com/ipfs/go-bitswap/message" - bsnet "github.com/ipfs/go-bitswap/network" - - cid "github.com/ipfs/go-cid" - delay "github.com/ipfs/go-ipfs-delay" - mockrouting "github.com/ipfs/go-ipfs-routing/mock" - logging "github.com/ipfs/go-log" - ifconnmgr "github.com/libp2p/go-libp2p-interface-connmgr" - peer "github.com/libp2p/go-libp2p-peer" - routing "github.com/libp2p/go-libp2p-routing" - mocknet "github.com/libp2p/go-libp2p/p2p/net/mock" - testutil "github.com/libp2p/go-testutil" -) - -var log = logging.Logger("bstestnet") - -func VirtualNetwork(rs mockrouting.Server, d delay.D) Network { - return &network{ - latencies: make(map[peer.ID]map[peer.ID]time.Duration), - clients: make(map[peer.ID]*receiverQueue), - delay: d, - routingserver: rs, - isRateLimited: false, - rateLimitGenerator: nil, - conns: make(map[string]struct{}), - } -} - -type RateLimitGenerator interface { - NextRateLimit() float64 -} - -func RateLimitedVirtualNetwork(rs mockrouting.Server, d delay.D, rateLimitGenerator RateLimitGenerator) Network { - return &network{ - latencies: make(map[peer.ID]map[peer.ID]time.Duration), - rateLimiters: make(map[peer.ID]map[peer.ID]*mocknet.RateLimiter), - clients: make(map[peer.ID]*receiverQueue), - delay: d, - routingserver: rs, - isRateLimited: true, - rateLimitGenerator: rateLimitGenerator, - conns: make(map[string]struct{}), - } -} - -type network struct { - mu sync.Mutex - latencies map[peer.ID]map[peer.ID]time.Duration - rateLimiters map[peer.ID]map[peer.ID]*mocknet.RateLimiter - clients map[peer.ID]*receiverQueue - routingserver mockrouting.Server - delay delay.D - isRateLimited bool - rateLimitGenerator RateLimitGenerator - conns map[string]struct{} -} - -type message struct { - from peer.ID - msg bsmsg.BitSwapMessage - shouldSend time.Time -} - -// receiverQueue queues up a set of messages to be sent, and sends them *in -// order* with their delays respected as much as sending them in order allows -// for -type receiverQueue struct { - receiver *networkClient - queue []*message - active bool - lk sync.Mutex -} - -func (n *network) Adapter(p testutil.Identity) bsnet.BitSwapNetwork { - n.mu.Lock() - defer n.mu.Unlock() - - client := &networkClient{ - local: p.ID(), - network: n, - routing: n.routingserver.Client(p), - } - n.clients[p.ID()] = &receiverQueue{receiver: client} - return client -} - -func (n *network) HasPeer(p peer.ID) bool { - n.mu.Lock() - defer n.mu.Unlock() - - _, found := n.clients[p] - return found -} - -// TODO should this be completely asynchronous? -// TODO what does the network layer do with errors received from services? -func (n *network) SendMessage( - ctx context.Context, - from peer.ID, - to peer.ID, - mes bsmsg.BitSwapMessage) error { - - n.mu.Lock() - defer n.mu.Unlock() - - latencies, ok := n.latencies[from] - if !ok { - latencies = make(map[peer.ID]time.Duration) - n.latencies[from] = latencies - } - - latency, ok := latencies[to] - if !ok { - latency = n.delay.NextWaitTime() - latencies[to] = latency - } - - var bandwidthDelay time.Duration - if n.isRateLimited { - rateLimiters, ok := n.rateLimiters[from] - if !ok { - rateLimiters = make(map[peer.ID]*mocknet.RateLimiter) - n.rateLimiters[from] = rateLimiters - } - - rateLimiter, ok := rateLimiters[to] - if !ok { - rateLimiter = mocknet.NewRateLimiter(n.rateLimitGenerator.NextRateLimit()) - rateLimiters[to] = rateLimiter - } - - size := mes.ToProtoV1().Size() - bandwidthDelay = rateLimiter.Limit(size) - } else { - bandwidthDelay = 0 - } - - receiver, ok := n.clients[to] - if !ok { - return errors.New("cannot locate peer on network") - } - - // nb: terminate the context since the context wouldn't actually be passed - // over the network in a real scenario - - msg := &message{ - from: from, - msg: mes, - shouldSend: time.Now().Add(latency).Add(bandwidthDelay), - } - receiver.enqueue(msg) - - return nil -} - -type networkClient struct { - local peer.ID - bsnet.Receiver - network *network - routing routing.IpfsRouting - stats bsnet.NetworkStats -} - -func (nc *networkClient) SendMessage( - ctx context.Context, - to peer.ID, - message bsmsg.BitSwapMessage) error { - if err := nc.network.SendMessage(ctx, nc.local, to, message); err != nil { - return err - } - atomic.AddUint64(&nc.stats.MessagesSent, 1) - return nil -} - -func (nc *networkClient) Stats() bsnet.NetworkStats { - return bsnet.NetworkStats{ - MessagesRecvd: atomic.LoadUint64(&nc.stats.MessagesRecvd), - MessagesSent: atomic.LoadUint64(&nc.stats.MessagesSent), - } -} - -// FindProvidersAsync returns a channel of providers for the given key. -func (nc *networkClient) FindProvidersAsync(ctx context.Context, k cid.Cid, max int) <-chan peer.ID { - - // NB: this function duplicates the PeerInfo -> ID transformation in the - // bitswap network adapter. Not to worry. This network client will be - // deprecated once the ipfsnet.Mock is added. The code below is only - // temporary. - - out := make(chan peer.ID) - go func() { - defer close(out) - providers := nc.routing.FindProvidersAsync(ctx, k, max) - for info := range providers { - select { - case <-ctx.Done(): - case out <- info.ID: - } - } - }() - return out -} - -func (nc *networkClient) ConnectionManager() ifconnmgr.ConnManager { - return &ifconnmgr.NullConnMgr{} -} - -type messagePasser struct { - net *networkClient - target peer.ID - local peer.ID - ctx context.Context -} - -func (mp *messagePasser) SendMsg(ctx context.Context, m bsmsg.BitSwapMessage) error { - return mp.net.SendMessage(ctx, mp.target, m) -} - -func (mp *messagePasser) Close() error { - return nil -} - -func (mp *messagePasser) Reset() error { - return nil -} - -func (n *networkClient) NewMessageSender(ctx context.Context, p peer.ID) (bsnet.MessageSender, error) { - return &messagePasser{ - net: n, - target: p, - local: n.local, - ctx: ctx, - }, nil -} - -// Provide provides the key to the network. -func (nc *networkClient) Provide(ctx context.Context, k cid.Cid) error { - return nc.routing.Provide(ctx, k, true) -} - -func (nc *networkClient) SetDelegate(r bsnet.Receiver) { - nc.Receiver = r -} - -func (nc *networkClient) ConnectTo(_ context.Context, p peer.ID) error { - nc.network.mu.Lock() - - otherClient, ok := nc.network.clients[p] - if !ok { - nc.network.mu.Unlock() - return errors.New("no such peer in network") - } - - tag := tagForPeers(nc.local, p) - if _, ok := nc.network.conns[tag]; ok { - nc.network.mu.Unlock() - log.Warning("ALREADY CONNECTED TO PEER (is this a reconnect? test lib needs fixing)") - return nil - } - nc.network.conns[tag] = struct{}{} - nc.network.mu.Unlock() - - // TODO: add handling for disconnects - - otherClient.receiver.PeerConnected(nc.local) - nc.Receiver.PeerConnected(p) - return nil -} - -func (rq *receiverQueue) enqueue(m *message) { - rq.lk.Lock() - defer rq.lk.Unlock() - rq.queue = append(rq.queue, m) - if !rq.active { - rq.active = true - go rq.process() - } -} - -func (rq *receiverQueue) Swap(i, j int) { - rq.queue[i], rq.queue[j] = rq.queue[j], rq.queue[i] -} - -func (rq *receiverQueue) Len() int { - return len(rq.queue) -} - -func (rq *receiverQueue) Less(i, j int) bool { - return rq.queue[i].shouldSend.UnixNano() < rq.queue[j].shouldSend.UnixNano() -} - -func (rq *receiverQueue) process() { - for { - rq.lk.Lock() - sort.Sort(rq) - if len(rq.queue) == 0 { - rq.active = false - rq.lk.Unlock() - return - } - m := rq.queue[0] - if time.Until(m.shouldSend).Seconds() < 0.1 { - rq.queue = rq.queue[1:] - rq.lk.Unlock() - time.Sleep(time.Until(m.shouldSend)) - atomic.AddUint64(&rq.receiver.stats.MessagesRecvd, 1) - rq.receiver.ReceiveMessage(context.TODO(), m.from, m.msg) - } else { - rq.lk.Unlock() - time.Sleep(100 * time.Millisecond) - } - } -} - -func tagForPeers(a, b peer.ID) string { - if a < b { - return string(a + b) - } - return string(b + a) -} diff --git a/vendor/github.com/ipfs/go-bitswap/testutils.go b/vendor/github.com/ipfs/go-bitswap/testutils.go deleted file mode 100644 index f9be6943..00000000 --- a/vendor/github.com/ipfs/go-bitswap/testutils.go +++ /dev/null @@ -1,110 +0,0 @@ -package bitswap - -import ( - "context" - "time" - - tn "github.com/ipfs/go-bitswap/testnet" - - ds "github.com/ipfs/go-datastore" - delayed "github.com/ipfs/go-datastore/delayed" - ds_sync "github.com/ipfs/go-datastore/sync" - blockstore "github.com/ipfs/go-ipfs-blockstore" - delay "github.com/ipfs/go-ipfs-delay" - p2ptestutil "github.com/libp2p/go-libp2p-netutil" - peer "github.com/libp2p/go-libp2p-peer" - testutil "github.com/libp2p/go-testutil" -) - -// WARNING: this uses RandTestBogusIdentity DO NOT USE for NON TESTS! -func NewTestSessionGenerator( - net tn.Network) SessionGenerator { - ctx, cancel := context.WithCancel(context.Background()) - return SessionGenerator{ - net: net, - seq: 0, - ctx: ctx, // TODO take ctx as param to Next, Instances - cancel: cancel, - } -} - -// TODO move this SessionGenerator to the core package and export it as the core generator -type SessionGenerator struct { - seq int - net tn.Network - ctx context.Context - cancel context.CancelFunc -} - -func (g *SessionGenerator) Close() error { - g.cancel() - return nil // for Closer interface -} - -func (g *SessionGenerator) Next() Instance { - g.seq++ - p, err := p2ptestutil.RandTestBogusIdentity() - if err != nil { - panic("FIXME") // TODO change signature - } - return MkSession(g.ctx, g.net, p) -} - -func (g *SessionGenerator) Instances(n int) []Instance { - var instances []Instance - for j := 0; j < n; j++ { - inst := g.Next() - instances = append(instances, inst) - } - for i, inst := range instances { - for j := i + 1; j < len(instances); j++ { - oinst := instances[j] - inst.Exchange.network.ConnectTo(context.Background(), oinst.Peer) - } - } - return instances -} - -type Instance struct { - Peer peer.ID - Exchange *Bitswap - blockstore blockstore.Blockstore - - blockstoreDelay delay.D -} - -func (i *Instance) Blockstore() blockstore.Blockstore { - return i.blockstore -} - -func (i *Instance) SetBlockstoreLatency(t time.Duration) time.Duration { - return i.blockstoreDelay.Set(t) -} - -// session creates a test bitswap instance. -// -// NB: It's easy make mistakes by providing the same peer ID to two different -// sessions. To safeguard, use the SessionGenerator to generate sessions. It's -// just a much better idea. -func MkSession(ctx context.Context, net tn.Network, p testutil.Identity) Instance { - bsdelay := delay.Fixed(0) - - adapter := net.Adapter(p) - dstore := ds_sync.MutexWrap(delayed.New(ds.NewMapDatastore(), bsdelay)) - - bstore, err := blockstore.CachedBlockstore(ctx, - blockstore.NewBlockstore(ds_sync.MutexWrap(dstore)), - blockstore.DefaultCacheOpts()) - if err != nil { - panic(err.Error()) // FIXME perhaps change signature and return error. - } - - bs := New(ctx, adapter, bstore).(*Bitswap) - - return Instance{ - Peer: p.ID(), - Exchange: bs, - blockstore: bstore, - blockstoreDelay: bsdelay, - } -} diff --git a/vendor/github.com/ipfs/go-bitswap/wantlist/wantlist.go b/vendor/github.com/ipfs/go-bitswap/wantlist/wantlist.go index 999fcd9e..b5c2a602 100644 --- a/vendor/github.com/ipfs/go-bitswap/wantlist/wantlist.go +++ b/vendor/github.com/ipfs/go-bitswap/wantlist/wantlist.go @@ -8,14 +8,18 @@ import ( cid "github.com/ipfs/go-cid" ) +// SessionTrackedWantlist is a list of wants that also track which bitswap +// sessions have requested them type SessionTrackedWantlist struct { set map[cid.Cid]*sessionTrackedEntry } +// Wantlist is a raw list of wanted blocks and their priorities type Wantlist struct { set map[cid.Cid]Entry } +// Entry is an entry in a want list, consisting of a cid and its priority type Entry struct { Cid cid.Cid Priority int @@ -40,12 +44,14 @@ func (es entrySlice) Len() int { return len(es) } func (es entrySlice) Swap(i, j int) { es[i], es[j] = es[j], es[i] } func (es entrySlice) Less(i, j int) bool { return es[i].Priority > es[j].Priority } +// NewSessionTrackedWantlist generates a new SessionTrackedWantList. func NewSessionTrackedWantlist() *SessionTrackedWantlist { return &SessionTrackedWantlist{ set: make(map[cid.Cid]*sessionTrackedEntry), } } +// New generates a new raw Wantlist func New() *Wantlist { return &Wantlist{ set: make(map[cid.Cid]Entry), @@ -116,6 +122,7 @@ func (w *SessionTrackedWantlist) Contains(k cid.Cid) (Entry, bool) { return e.Entry, true } +// Entries returns all wantlist entries for a given session tracked want list. func (w *SessionTrackedWantlist) Entries() []Entry { es := make([]Entry, 0, len(w.set)) for _, e := range w.set { @@ -124,16 +131,20 @@ func (w *SessionTrackedWantlist) Entries() []Entry { return es } +// SortedEntries returns wantlist entries ordered by priority. func (w *SessionTrackedWantlist) SortedEntries() []Entry { es := w.Entries() sort.Sort(entrySlice(es)) return es } +// Len returns the number of entries in a wantlist. func (w *SessionTrackedWantlist) Len() int { return len(w.set) } +// CopyWants copies all wants from one SessionTrackWantlist to another (along with +// the session data) func (w *SessionTrackedWantlist) CopyWants(to *SessionTrackedWantlist) { for _, e := range w.set { for k := range e.sesTrk { @@ -142,10 +153,12 @@ func (w *SessionTrackedWantlist) CopyWants(to *SessionTrackedWantlist) { } } +// Len returns the number of entries in a wantlist. func (w *Wantlist) Len() int { return len(w.set) } +// Add adds an entry in a wantlist from CID & Priority, if not already present. func (w *Wantlist) Add(c cid.Cid, priority int) bool { if _, ok := w.set[c]; ok { return false @@ -159,6 +172,7 @@ func (w *Wantlist) Add(c cid.Cid, priority int) bool { return true } +// AddEntry adds an entry to a wantlist if not already present. func (w *Wantlist) AddEntry(e Entry) bool { if _, ok := w.set[e.Cid]; ok { return false @@ -167,6 +181,7 @@ func (w *Wantlist) AddEntry(e Entry) bool { return true } +// Remove removes the given cid from the wantlist. func (w *Wantlist) Remove(c cid.Cid) bool { _, ok := w.set[c] if !ok { @@ -177,11 +192,14 @@ func (w *Wantlist) Remove(c cid.Cid) bool { return true } +// Contains returns the entry, if present, for the given CID, plus whether it +// was present. func (w *Wantlist) Contains(c cid.Cid) (Entry, bool) { e, ok := w.set[c] return e, ok } +// Entries returns all wantlist entries for a want list. func (w *Wantlist) Entries() []Entry { es := make([]Entry, 0, len(w.set)) for _, e := range w.set { @@ -190,6 +208,7 @@ func (w *Wantlist) Entries() []Entry { return es } +// SortedEntries returns wantlist entries ordered by priority. func (w *Wantlist) SortedEntries() []Entry { es := w.Entries() sort.Sort(entrySlice(es)) diff --git a/vendor/github.com/ipfs/go-bitswap/wantmanager/wantmanager.go b/vendor/github.com/ipfs/go-bitswap/wantmanager/wantmanager.go index 0fd7d5a1..4203d14f 100644 --- a/vendor/github.com/ipfs/go-bitswap/wantmanager/wantmanager.go +++ b/vendor/github.com/ipfs/go-bitswap/wantmanager/wantmanager.go @@ -10,7 +10,7 @@ import ( cid "github.com/ipfs/go-cid" metrics "github.com/ipfs/go-metrics-interface" - peer "github.com/libp2p/go-libp2p-peer" + peer "github.com/libp2p/go-libp2p-core/peer" ) var log = logging.Logger("bitswap") @@ -53,7 +53,7 @@ type WantManager struct { } // New initializes a new WantManager for a given context. -func New(ctx context.Context) *WantManager { +func New(ctx context.Context, peerHandler PeerHandler) *WantManager { ctx, cancel := context.WithCancel(ctx) wantlistGauge := metrics.NewCtx(ctx, "wantlist_total", "Number of items in wantlist.").Gauge() @@ -63,15 +63,11 @@ func New(ctx context.Context) *WantManager { bcwl: wantlist.NewSessionTrackedWantlist(), ctx: ctx, cancel: cancel, + peerHandler: peerHandler, wantlistGauge: wantlistGauge, } } -// SetDelegate specifies who will send want changes out to the internet. -func (wm *WantManager) SetDelegate(peerHandler PeerHandler) { - wm.peerHandler = peerHandler -} - // WantBlocks adds the given cids to the wantlist, tracked by the given session. func (wm *WantManager) WantBlocks(ctx context.Context, ks []cid.Cid, peers []peer.ID, ses uint64) { log.Infof("want blocks: %s", ks) diff --git a/vendor/github.com/ipfs/go-bitswap/workers.go b/vendor/github.com/ipfs/go-bitswap/workers.go index 45f78615..fb3dc019 100644 --- a/vendor/github.com/ipfs/go-bitswap/workers.go +++ b/vendor/github.com/ipfs/go-bitswap/workers.go @@ -11,9 +11,11 @@ import ( procctx "github.com/jbenet/goprocess/context" ) +// TaskWorkerCount is the total number of simultaneous threads sending +// outgoing messages var TaskWorkerCount = 8 -func (bs *Bitswap) startWorkers(px process.Process, ctx context.Context) { +func (bs *Bitswap) startWorkers(ctx context.Context, px process.Process) { // Start up workers to handle requests from other nodes for the data on this node for i := 0; i < TaskWorkerCount; i++ { @@ -23,15 +25,17 @@ func (bs *Bitswap) startWorkers(px process.Process, ctx context.Context) { }) } - // Start up a worker to manage sending out provides messages - px.Go(func(px process.Process) { - bs.provideCollector(ctx) - }) + if bs.provideEnabled { + // Start up a worker to manage sending out provides messages + px.Go(func(px process.Process) { + bs.provideCollector(ctx) + }) - // Spawn up multiple workers to handle incoming blocks - // consider increasing number if providing blocks bottlenecks - // file transfers - px.Go(bs.provideWorker) + // Spawn up multiple workers to handle incoming blocks + // consider increasing number if providing blocks bottlenecks + // file transfers + px.Go(bs.provideWorker) + } } func (bs *Bitswap) taskWorker(ctx context.Context, id int) { diff --git a/vendor/github.com/ipfs/go-blockservice/.travis.yml b/vendor/github.com/ipfs/go-blockservice/.travis.yml index 4cfe98c2..5163d693 100644 --- a/vendor/github.com/ipfs/go-blockservice/.travis.yml +++ b/vendor/github.com/ipfs/go-blockservice/.travis.yml @@ -10,7 +10,6 @@ env: global: - GOTFLAGS="-race" matrix: - - BUILD_DEPTYPE=gx - BUILD_DEPTYPE=gomod @@ -24,7 +23,6 @@ script: cache: directories: - - $GOPATH/src/gx - $GOPATH/pkg/mod - $HOME/.cache/go-build diff --git a/vendor/github.com/ipfs/go-blockservice/README.md b/vendor/github.com/ipfs/go-blockservice/README.md index 0ec2aef8..3df67fde 100644 --- a/vendor/github.com/ipfs/go-blockservice/README.md +++ b/vendor/github.com/ipfs/go-blockservice/README.md @@ -5,7 +5,7 @@ go-blockservice [![](https://img.shields.io/badge/project-IPFS-blue.svg?style=flat-square)](http://ipfs.io/) [![](https://img.shields.io/badge/freenode-%23ipfs-blue.svg?style=flat-square)](http://webchat.freenode.net/?channels=%23ipfs) [![Coverage Status](https://codecov.io/gh/ipfs/go-block-format/branch/master/graph/badge.svg)](https://codecov.io/gh/ipfs/go-block-format/branch/master) -[![Travis CI](https://travis-ci.org/ipfs/go-block-format.svg?branch=master)](https://travis-ci.org/ipfs/go-block-format) +[![Travis CI](https://travis-ci.com/ipfs/go-blockservice.svg?branch=master)](https://travis-ci.com/ipfs/go-blockservice) > go-blockservice provides a seamless interface to both local and remote storage backends. diff --git a/vendor/github.com/ipfs/go-blockservice/blockservice.go b/vendor/github.com/ipfs/go-blockservice/blockservice.go index 3b5a1df6..ba88d1c2 100644 --- a/vendor/github.com/ipfs/go-blockservice/blockservice.go +++ b/vendor/github.com/ipfs/go-blockservice/blockservice.go @@ -114,16 +114,17 @@ func (s *blockService) Exchange() exchange.Interface { func NewSession(ctx context.Context, bs BlockService) *Session { exch := bs.Exchange() if sessEx, ok := exch.(exchange.SessionExchange); ok { - ses := sessEx.NewSession(ctx) return &Session{ - ses: ses, - sessEx: sessEx, - bs: bs.Blockstore(), + sessCtx: ctx, + ses: nil, + sessEx: sessEx, + bs: bs.Blockstore(), } } return &Session{ - ses: exch, - bs: bs.Blockstore(), + ses: exch, + sessCtx: ctx, + bs: bs.Blockstore(), } } @@ -179,6 +180,10 @@ func (s *blockService) AddBlocks(bs []blocks.Block) error { toput = bs } + if len(toput) == 0 { + return nil + } + err := s.blockstore.PutMany(toput) if err != nil { return err diff --git a/vendor/github.com/ipfs/go-blockservice/go.mod b/vendor/github.com/ipfs/go-blockservice/go.mod index b972140c..4644e9fa 100644 --- a/vendor/github.com/ipfs/go-blockservice/go.mod +++ b/vendor/github.com/ipfs/go-blockservice/go.mod @@ -1,17 +1,16 @@ module github.com/ipfs/go-blockservice require ( - github.com/gxed/pubsub v0.0.0-20180201040156-26ebdf44f824 // indirect - github.com/ipfs/go-bitswap v0.0.3 + github.com/ipfs/go-bitswap v0.1.3 github.com/ipfs/go-block-format v0.0.2 - github.com/ipfs/go-cid v0.0.1 - github.com/ipfs/go-datastore v0.0.1 + github.com/ipfs/go-cid v0.0.2 + github.com/ipfs/go-datastore v0.0.5 github.com/ipfs/go-ipfs-blockstore v0.0.1 github.com/ipfs/go-ipfs-blocksutil v0.0.1 github.com/ipfs/go-ipfs-delay v0.0.1 github.com/ipfs/go-ipfs-exchange-interface v0.0.1 github.com/ipfs/go-ipfs-exchange-offline v0.0.1 - github.com/ipfs/go-ipfs-routing v0.0.1 + github.com/ipfs/go-ipfs-routing v0.1.0 github.com/ipfs/go-ipfs-util v0.0.1 github.com/ipfs/go-log v0.0.1 github.com/ipfs/go-verifcid v0.0.1 diff --git a/vendor/github.com/ipfs/go-blockservice/go.sum b/vendor/github.com/ipfs/go-blockservice/go.sum index 7f3e2067..5cba9762 100644 --- a/vendor/github.com/ipfs/go-blockservice/go.sum +++ b/vendor/github.com/ipfs/go-blockservice/go.sum @@ -3,25 +3,30 @@ github.com/Kubuxu/go-os-helper v0.0.1/go.mod h1:N8B+I7vPCT80IcP58r50u4+gEEcsZETF github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32 h1:qkOC5Gd33k54tobS36cXdAzJbeHaduLtnLQQwNoIi78= github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32/go.mod h1:DrZx5ec/dmnfpw9KyYoQyYo7d0KEvTkk/5M/vbZjAr8= +github.com/btcsuite/btcd v0.0.0-20190523000118-16327141da8c h1:aEbSeNALREWXk0G7UdNhR3ayBV7tZ4M2PNmnrCAph6Q= +github.com/btcsuite/btcd v0.0.0-20190523000118-16327141da8c/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI= +github.com/btcsuite/btcd v0.0.0-20190605094302-a0d1e3e36d50 h1:4i3KsuVA0o0KoBxAC5x+MY7RbteiMK1V7gf/G08NGIQ= +github.com/btcsuite/btcd v0.0.0-20190605094302-a0d1e3e36d50/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI= github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= github.com/btcsuite/btcutil v0.0.0-20190207003914-4c204d697803/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= +github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= -github.com/coreos/go-semver v0.2.0 h1:3Jm3tLmsgAYcjC+4Up7hJrFBPr+n7rAqYeSw/SZazuY= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/cskr/pubsub v1.0.2 h1:vlOzMhl6PFn60gRlTQQsIfVwaPB/B/8MziK8FhEPt/0= github.com/cskr/pubsub v1.0.2/go.mod h1:/8MzYXk/NJAz782G8RPkFzXTZVu63VotefPnR9TIRis= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= 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/dgraph-io/badger v1.5.5-0.20190226225317-8115aed38f8f/go.mod h1:VZxzAIRPHRVNRKRo6AXrX9BJegn6il06VMTZVJYCIjQ= github.com/dgryski/go-farm v0.0.0-20190104051053-3adb47b1fb0f/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/fd/go-nat v1.0.0 h1:DPyQ97sxA9ThrWYRPcWUz/z9TnpTIGRYODIQc/dy64M= -github.com/fd/go-nat v1.0.0/go.mod h1:BTBu/CKvMmOMUPkKVef1pngt2WFH/lg7E6yQnulfp6E= 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/go-check/check v0.0.0-20180628173108-788fd7840127 h1:0gkP6mzaMqkmpcJYCFOLkIBwI7xFExG03bbkOkCvUPI= @@ -31,6 +36,8 @@ github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zV github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.0 h1:kbxbvI4Un1LUWKxufD+BiE6AEExYYgkQLQmLFqA1LFk= github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0= +github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -39,27 +46,28 @@ github.com/gxed/hashland/keccakpg v0.0.1 h1:wrk3uMNaMxbXiHibbPO4S0ymqJMm41WiudyF github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfmKFJ6tItnhQ67kU= github.com/gxed/hashland/murmur3 v0.0.1 h1:SheiaIt0sda5K+8FLz952/1iWS9zrnKsEJaOJu4ZbSc= github.com/gxed/hashland/murmur3 v0.0.1/go.mod h1:KjXop02n4/ckmZSnY2+HKcLud/tcmvhST0bie/0lS48= -github.com/gxed/pubsub v0.0.0-20180201040156-26ebdf44f824 h1:TF4mX7zXpeyz/xintezebSa7ZDxAGBnqDwcoobvaz2o= -github.com/gxed/pubsub v0.0.0-20180201040156-26ebdf44f824/go.mod h1:OiEWyHgK+CWrmOlVquHaIK1vhpUJydC9m0Je6mhaiNE= github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+dAcgU= github.com/hashicorp/golang-lru v0.5.1/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-20180415215157-1395d1447324 h1:PV190X5/DzQ/tbFFG5YpT5mH6q+cHlfgqI5JuRnH9oE= -github.com/huin/goupnp v0.0.0-20180415215157-1395d1447324/go.mod h1:MZ2ZmwcBpvOoJ22IJsc7va19ZwoheaBk43rKg12SKag= +github.com/huin/goupnp v1.0.0 h1:wg75sLpL6DZqwHQN6E1Cfk6mtfzS45z8OV+ic+DtHRo= +github.com/huin/goupnp v1.0.0/go.mod h1:n9v9KO1tAxYH82qOn+UTIFQDmx5n1Zxd/ClZDMX7Bnc= +github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= github.com/ipfs/bbloom v0.0.1 h1:s7KkiBPfxCeDVo47KySjK0ACPc5GJRUxFpdyWEuDjhw= github.com/ipfs/bbloom v0.0.1/go.mod h1:oqo8CVWsJFMOZqTglBG4wydCE4IQA/G2/SEofB0rjUI= -github.com/ipfs/go-bitswap v0.0.1 h1:Xx1ma7TWy9ISOx5zFq5YVQyrTHzUP4GkRPMsZokHxAg= -github.com/ipfs/go-bitswap v0.0.1/go.mod h1:z+tP3h+HTJ810n1R5yMy2ccKFffJ2F6Vqm/5Bf7vs2c= -github.com/ipfs/go-bitswap v0.0.3 h1:uFcSI9dkjUn67S7IM60vr2wA27aAvn8o9xYjaQCug3o= -github.com/ipfs/go-bitswap v0.0.3/go.mod h1:jadAZYsP/tcRMl47ZhFxhaNuDQoXawT8iHMg+iFoQbg= +github.com/ipfs/go-bitswap v0.1.3 h1:jAl9Z/TYObpGeGATUemnOZ7RYb0F/kzNVlhcYZesz+0= +github.com/ipfs/go-bitswap v0.1.3/go.mod h1:YEQlFy0kkxops5Vy+OxWdRSEZIoS7I7KDIwoa5Chkps= github.com/ipfs/go-block-format v0.0.1/go.mod h1:DK/YYcsSUIVAFNwo/KZCdIIbpN0ROH/baNLgayt4pFc= github.com/ipfs/go-block-format v0.0.2 h1:qPDvcP19izTjU8rgo6p7gTXZlkMkF5bz5G3fqIsSCPE= github.com/ipfs/go-block-format v0.0.2/go.mod h1:AWR46JfpcObNfg3ok2JHDUfdiHRgWhJgCQF+KIgOPJY= github.com/ipfs/go-cid v0.0.1 h1:GBjWPktLnNyX0JiQCNFpUuUSoMw5KMyqrsejHYlILBE= github.com/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= +github.com/ipfs/go-cid v0.0.2 h1:tuuKaZPU1M6HcejsO3AcYWW8sZ8MTvyxfc4uqB4eFE8= +github.com/ipfs/go-cid v0.0.2/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= github.com/ipfs/go-datastore v0.0.1 h1:AW/KZCScnBWlSb5JbnEnLKFWXL224LBEh/9KXXOrUms= github.com/ipfs/go-datastore v0.0.1/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= +github.com/ipfs/go-datastore v0.0.5 h1:q3OfiOZV5rlsK1H5V8benjeUApRfMGs4Mrhmr6NriQo= +github.com/ipfs/go-datastore v0.0.5/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk= github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps= github.com/ipfs/go-ds-badger v0.0.2/go.mod h1:Y3QpeSFWQf6MopLTiZD+VT6IC1yZqaGmjvRcKeSGij8= @@ -77,35 +85,41 @@ github.com/ipfs/go-ipfs-exchange-interface v0.0.1 h1:LJXIo9W7CAmugqI+uofioIpRb6r github.com/ipfs/go-ipfs-exchange-interface v0.0.1/go.mod h1:c8MwfHjtQjPoDyiy9cFquVtVHkO9b9Ob3FG91qJnWCM= github.com/ipfs/go-ipfs-exchange-offline v0.0.1 h1:P56jYKZF7lDDOLx5SotVh5KFxoY6C81I1NSHW1FxGew= github.com/ipfs/go-ipfs-exchange-offline v0.0.1/go.mod h1:WhHSFCVYX36H/anEKQboAzpUws3x7UeEGkzQc3iNkM0= -github.com/ipfs/go-ipfs-flags v0.0.1 h1:OH5cEkJYL0QgA+bvD55TNG9ud8HA2Nqaav47b2c/UJk= -github.com/ipfs/go-ipfs-flags v0.0.1/go.mod h1:RnXBb9WV53GSfTrSDVK61NLTFKvWc60n+K9EgCDh+rA= github.com/ipfs/go-ipfs-pq v0.0.1 h1:zgUotX8dcAB/w/HidJh1zzc1yFq6Vm8J7T2F4itj/RU= github.com/ipfs/go-ipfs-pq v0.0.1/go.mod h1:LWIqQpqfRG3fNc5XsnIhz/wQ2XXGyugQwls7BgUmUfY= -github.com/ipfs/go-ipfs-routing v0.0.1 h1:394mZeTLcbM/LDO12PneBYvkZAUA+nRnmC0lAzDXKOY= -github.com/ipfs/go-ipfs-routing v0.0.1/go.mod h1:k76lf20iKFxQTjcJokbPM9iBXVXVZhcOwc360N4nuKs= +github.com/ipfs/go-ipfs-routing v0.1.0 h1:gAJTT1cEeeLj6/DlLX6t+NxD9fQe2ymTO6qWRDI/HQQ= +github.com/ipfs/go-ipfs-routing v0.1.0/go.mod h1:hYoUkJLyAUKhF58tysKpids8RNDPO42BVMgK5dNsoqY= github.com/ipfs/go-ipfs-util v0.0.1 h1:Wz9bL2wB2YBJqggkA4dD7oSmqB4cAnpNbGrlHJulv50= github.com/ipfs/go-ipfs-util v0.0.1/go.mod h1:spsl5z8KUnrve+73pOhSVZND1SIxPW5RyBCNzQxlJBc= github.com/ipfs/go-log v0.0.1 h1:9XTUN/rW64BCG1YhPK9Hoy3q8nr4gOmHHBpgFdfw6Lc= github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM= github.com/ipfs/go-metrics-interface v0.0.1 h1:j+cpbjYvu4R8zbleSs36gvB7jR+wsL2fGD6n0jO4kdg= github.com/ipfs/go-metrics-interface v0.0.1/go.mod h1:6s6euYU4zowdslK0GKHmqaIZ3j/b/tL7HTWtJ4VPgWY= +github.com/ipfs/go-peertaskqueue v0.1.1 h1:+gPjbI+V3NktXZOqJA1kzbms2pYmhjgQQal0MzZrOAY= +github.com/ipfs/go-peertaskqueue v0.1.1/go.mod h1:Jmk3IyCcfl1W3jTW3YpghSwSEC6IJ3Vzz/jUmWw8Z0U= github.com/ipfs/go-verifcid v0.0.1 h1:m2HI7zIuR5TFyQ1b79Da5N9dnnCP1vcu2QqawmWlK2E= github.com/ipfs/go-verifcid v0.0.1/go.mod h1:5Hrva5KBeIog4A+UpqlaIU+DEstipcJYQQZc0g37pY0= -github.com/jackpal/gateway v1.0.4 h1:LS5EHkLuQ6jzaHwULi0vL+JO0mU/n4yUtK8oUjHHOlM= -github.com/jackpal/gateway v1.0.4/go.mod h1:lTpwd4ACLXmpyiCTRtfiNyVnUmqT9RivzCDQetPfnjA= +github.com/jackpal/gateway v1.0.5 h1:qzXWUJfuMdlLMtt0a3Dgt+xkWQiA5itDEITVJtuSwMc= +github.com/jackpal/gateway v1.0.5/go.mod h1:lTpwd4ACLXmpyiCTRtfiNyVnUmqT9RivzCDQetPfnjA= github.com/jackpal/go-nat-pmp v1.0.1 h1:i0LektDkO1QlrTm/cSuP+PyBCDnYvjPLGl4LdWEMiaA= github.com/jackpal/go-nat-pmp v1.0.1/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= github.com/jbenet/go-cienv v0.0.0-20150120210510-1bb1476777ec h1:DQqZhhDvrTrEQ3Qod5yfavcA064e53xlQ+xajiorXgM= github.com/jbenet/go-cienv v0.0.0-20150120210510-1bb1476777ec/go.mod h1:rGaEvXB4uRSZMmzKNLoXvTu1sfx+1kv/DojUlPrSZGs= +github.com/jbenet/go-cienv v0.1.0 h1:Vc/s0QbQtoxX8MwwSLWWh+xNNZvM3Lw7NsTcHrvvhMc= +github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA= github.com/jbenet/go-temp-err-catcher v0.0.0-20150120210811-aac704a3f4f2 h1:vhC1OXXiT9R2pczegwz6moDvuRpggaroAXhPIseh57A= github.com/jbenet/go-temp-err-catcher v0.0.0-20150120210811-aac704a3f4f2/go.mod h1:8GXXJV31xl8whumTzdZsTt3RnUIiPqzkyf7mxToRCMs= github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8 h1:bspPhN+oKYFk5fcGNuQzp6IGzYQSenLEgH3s6jkXrWw= github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8/go.mod h1:Ly/wlsjFq/qrU3Rar62tu1gASgGw6chQbSh/XgIIXCY= +github.com/jbenet/goprocess v0.1.3 h1:YKyIEECS/XvcfHtBzxtjBBbWK+MbvA6dG8ASiqwvr10= +github.com/jbenet/goprocess v0.1.3/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= +github.com/koron/go-ssdp v0.0.0-20180514024734-4a0ed625a78b h1:wxtKgYHEncAU00muMD06dzLiahtGM1eouRNOzVV7tdQ= +github.com/koron/go-ssdp v0.0.0-20180514024734-4a0ed625a78b/go.mod h1:5Ky9EC2xfoUKUor0Hjgi2BJhCSXJfMOFlmyYrVKGQMk= 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= @@ -115,115 +129,150 @@ github.com/libp2p/go-addr-util v0.0.1 h1:TpTQm9cXVRVSKsYbgQ7GKc3KbbHVTnbostgGaDE github.com/libp2p/go-addr-util v0.0.1/go.mod h1:4ac6O7n9rIAKB1dnd+s8IbbMXkt+oBpzX4/+RACcnlQ= github.com/libp2p/go-buffer-pool v0.0.1 h1:9Rrn/H46cXjaA2HQ5Y8lyhOS1NhTkZ4yuEs2r3Eechg= github.com/libp2p/go-buffer-pool v0.0.1/go.mod h1:xtyIz9PMobb13WaxR6Zo1Pd1zXJKYg0a8KiIvDp3TzQ= -github.com/libp2p/go-conn-security v0.0.1 h1:4kMMrqrt9EUNCNjX1xagSJC+bq16uqjMe9lk1KBMVNs= -github.com/libp2p/go-conn-security v0.0.1/go.mod h1:bGmu51N0KU9IEjX7kl2PQjgZa40JQWnayTvNMgD/vyk= -github.com/libp2p/go-conn-security-multistream v0.0.1 h1:XefjAQRHcnUaxKb26RGupToucx3uU4ecbOZ3aACXlDU= -github.com/libp2p/go-conn-security-multistream v0.0.1/go.mod h1:nc9vud7inQ+d6SO0I/6dSWrdMnHnzZNHeyUQqrAJulE= +github.com/libp2p/go-buffer-pool v0.0.2 h1:QNK2iAFa8gjAe1SPz6mHSMuCcjs+X1wlHzeOSqcmlfs= +github.com/libp2p/go-buffer-pool v0.0.2/go.mod h1:MvaB6xw5vOrDl8rYZGLFdKAuk/hRoRZd1Vi32+RXyFM= +github.com/libp2p/go-conn-security-multistream v0.1.0 h1:aqGmto+ttL/uJgX0JtQI0tD21CIEy5eYd1Hlp0juHY0= +github.com/libp2p/go-conn-security-multistream v0.1.0/go.mod h1:aw6eD7LOsHEX7+2hJkDxw1MteijaVcI+/eP2/x3J1xc= github.com/libp2p/go-flow-metrics v0.0.1 h1:0gxuFd2GuK7IIP5pKljLwps6TvcuYgvG7Atqi3INF5s= github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZxBdp967ls1g+k8= -github.com/libp2p/go-libp2p v0.0.1 h1:oEjzhRzymY7NILTMzOKNVOpNZGpcQHrHriWw91pbJNM= -github.com/libp2p/go-libp2p v0.0.1/go.mod h1:bmRs8I0vwn6iRaVssZnJx/epY6WPSKiLoK1vyle4EX0= -github.com/libp2p/go-libp2p v0.0.2 h1:+jvgi0Zy3y4TKXJKApchCk3pCBPZf1T54z3+vKie3gw= -github.com/libp2p/go-libp2p v0.0.2/go.mod h1:Qu8bWqFXiocPloabFGUcVG4kk94fLvfC8mWTDdFC9wE= -github.com/libp2p/go-libp2p-autonat v0.0.1/go.mod h1:fs71q5Xk+pdnKU014o2iq1RhMs9/PMaG5zXRFNnIIT4= -github.com/libp2p/go-libp2p-autonat v0.0.2/go.mod h1:fs71q5Xk+pdnKU014o2iq1RhMs9/PMaG5zXRFNnIIT4= -github.com/libp2p/go-libp2p-blankhost v0.0.1 h1:/mZuuiwntNR8RywnCFlGHLKrKLYne+qciBpQXWqp5fk= -github.com/libp2p/go-libp2p-blankhost v0.0.1/go.mod h1:Ibpbw/7cPPYwFb7PACIWdvxxv0t0XCCI10t7czjAjTc= -github.com/libp2p/go-libp2p-circuit v0.0.1/go.mod h1:Dqm0s/BiV63j8EEAs8hr1H5HudqvCAeXxDyic59lCwE= -github.com/libp2p/go-libp2p-crypto v0.0.1 h1:JNQd8CmoGTohO/akqrH16ewsqZpci2CbgYH/LmYl8gw= -github.com/libp2p/go-libp2p-crypto v0.0.1/go.mod h1:yJkNyDmO341d5wwXxDUGO0LykUVT72ImHNUqh5D/dBE= -github.com/libp2p/go-libp2p-discovery v0.0.1/go.mod h1:ZkkF9xIFRLA1xCc7bstYFkd80gBGK8Fc1JqGoU2i+zI= -github.com/libp2p/go-libp2p-host v0.0.1 h1:dnqusU+DheGcdxrE718kG4XgHNuL2n9eEv8Rg5zy8hQ= -github.com/libp2p/go-libp2p-host v0.0.1/go.mod h1:qWd+H1yuU0m5CwzAkvbSjqKairayEHdR5MMl7Cwa7Go= -github.com/libp2p/go-libp2p-interface-connmgr v0.0.1 h1:Q9EkNSLAOF+u90L88qmE9z/fTdjLh8OsJwGw74mkwk4= -github.com/libp2p/go-libp2p-interface-connmgr v0.0.1/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k= -github.com/libp2p/go-libp2p-interface-pnet v0.0.1 h1:7GnzRrBTJHEsofi1ahFdPN9Si6skwXQE9UqR2S+Pkh8= -github.com/libp2p/go-libp2p-interface-pnet v0.0.1/go.mod h1:el9jHpQAXK5dnTpKA4yfCNBZXvrzdOU75zz+C6ryp3k= -github.com/libp2p/go-libp2p-loggables v0.0.1 h1:HVww9oAnINIxbt69LJNkxD8lnbfgteXR97Xm4p3l9ps= -github.com/libp2p/go-libp2p-loggables v0.0.1/go.mod h1:lDipDlBNYbpyqyPX/KcoO+eq0sJYEVR2JgOexcivchg= -github.com/libp2p/go-libp2p-metrics v0.0.1 h1:yumdPC/P2VzINdmcKZd0pciSUCpou+s0lwYCjBbzQZU= -github.com/libp2p/go-libp2p-metrics v0.0.1/go.mod h1:jQJ95SXXA/K1VZi13h52WZMa9ja78zjyy5rspMsC/08= -github.com/libp2p/go-libp2p-nat v0.0.1 h1:on/zju7XE+JXc8gH+vTKmIh2UJFC1K8kGnJYluQrlz4= -github.com/libp2p/go-libp2p-nat v0.0.1/go.mod h1:4L6ajyUIlJvx1Cbh5pc6Ma6vMDpKXf3GgLO5u7W0oQ4= -github.com/libp2p/go-libp2p-nat v0.0.2 h1:sKI5hiCsGFhuEKdXMsF9mywQu2qhfoIGX6a+VG6zelE= -github.com/libp2p/go-libp2p-nat v0.0.2/go.mod h1:QrjXQSD5Dj4IJOdEcjHRkWTSomyxRo6HnUkf/TfQpLQ= -github.com/libp2p/go-libp2p-net v0.0.1 h1:xJ4Vh4yKF/XKb8fd1Ev0ebAGzVjMxXzrxG2kjtU+F5Q= -github.com/libp2p/go-libp2p-net v0.0.1/go.mod h1:Yt3zgmlsHOgUWSXmt5V/Jpz9upuJBE8EgNU9DrCcR8c= -github.com/libp2p/go-libp2p-netutil v0.0.1 h1:LgD6+skofkOx8z6odD9+MZHKjupv3ng1u6KRhaADTnA= -github.com/libp2p/go-libp2p-netutil v0.0.1/go.mod h1:GdusFvujWZI9Vt0X5BKqwWWmZFxecf9Gt03cKxm2f/Q= -github.com/libp2p/go-libp2p-peer v0.0.1 h1:0qwAOljzYewINrU+Kndoc+1jAL7vzY/oY2Go4DCGfyY= -github.com/libp2p/go-libp2p-peer v0.0.1/go.mod h1:nXQvOBbwVqoP+T5Y5nCjeH4sP9IX/J0AMzcDUVruVoo= -github.com/libp2p/go-libp2p-peerstore v0.0.1 h1:twKovq8YK5trLrd3nB7PD2Zu9JcyAIdm7Bz9yBWjhq8= -github.com/libp2p/go-libp2p-peerstore v0.0.1/go.mod h1:RabLyPVJLuNQ+GFyoEkfi8H4Ti6k/HtZJ7YKgtSq+20= -github.com/libp2p/go-libp2p-protocol v0.0.1 h1:+zkEmZ2yFDi5adpVE3t9dqh/N9TbpFWywowzeEzBbLM= -github.com/libp2p/go-libp2p-protocol v0.0.1/go.mod h1:Af9n4PiruirSDjHycM1QuiMi/1VZNHYcK8cLgFJLZ4s= -github.com/libp2p/go-libp2p-record v0.0.1 h1:zN7AS3X46qmwsw5JLxdDuI43cH5UYwovKxHPjKBYQxw= -github.com/libp2p/go-libp2p-record v0.0.1/go.mod h1:grzqg263Rug/sRex85QrDOLntdFAymLDLm7lxMgU79Q= -github.com/libp2p/go-libp2p-routing v0.0.1 h1:hPMAWktf9rYi3ME4MG48qE7dq1ofJxiQbfdvpNntjhc= -github.com/libp2p/go-libp2p-routing v0.0.1/go.mod h1:N51q3yTr4Zdr7V8Jt2JIktVU+3xBBylx1MZeVA6t1Ys= -github.com/libp2p/go-libp2p-secio v0.0.1 h1:CqE/RdsizOwItdgLe632iyft/w0tshDLmZGAiKDcUAI= -github.com/libp2p/go-libp2p-secio v0.0.1/go.mod h1:IdG6iQybdcYmbTzxp4J5dwtUEDTOvZrT0opIDVNPrJs= -github.com/libp2p/go-libp2p-swarm v0.0.1 h1:Vne+hjaDwXqzgNwQ2vb2YKbnbOTyXjtS47stT66Apc4= -github.com/libp2p/go-libp2p-swarm v0.0.1/go.mod h1:mh+KZxkbd3lQnveQ3j2q60BM1Cw2mX36XXQqwfPOShs= -github.com/libp2p/go-libp2p-transport v0.0.1/go.mod h1:UzbUs9X+PHOSw7S3ZmeOxfnwaQY5vGDzZmKPod3N3tk= -github.com/libp2p/go-libp2p-transport v0.0.4 h1:/CPHQMN75/IQwkhBxxIo6p6PtL3rwFZtlzBROT3e8mw= -github.com/libp2p/go-libp2p-transport v0.0.4/go.mod h1:StoY3sx6IqsP6XKoabsPnHCwqKXWUMWU7Rfcsubee/A= -github.com/libp2p/go-libp2p-transport-upgrader v0.0.1 h1:rNtXkY6dty46mxYOHHAZQchI7gQdJStF683FhVnei/k= -github.com/libp2p/go-libp2p-transport-upgrader v0.0.1/go.mod h1:NJpUAgQab/8K6K0m+JmZCe5RUXG10UMEx4kWe9Ipj5c= -github.com/libp2p/go-maddr-filter v0.0.1 h1:apvYTg0aIxxQyBX+XHKOR+0+lYhGs1Yv+JmTH9nyl5I= -github.com/libp2p/go-maddr-filter v0.0.1/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= -github.com/libp2p/go-mplex v0.0.1 h1:dn2XGSrUxLtz3/8u85bGrwhUEKPX8MOF3lpmcWBZCWc= -github.com/libp2p/go-mplex v0.0.1/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0= -github.com/libp2p/go-msgio v0.0.1 h1:znj97n5FtXGCLDwe9x8jpHmY770SW4WStBGcCDh6GJw= -github.com/libp2p/go-msgio v0.0.1/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= +github.com/libp2p/go-libp2p v0.1.1 h1:52sB0TJuDk2nYMcMfHOKaPoaayDZjaYVCq6Vk1ejUTk= +github.com/libp2p/go-libp2p v0.1.1/go.mod h1:I00BRo1UuUSdpuc8Q2mN7yDF/oTUTRAX6JWpTiK9Rp8= +github.com/libp2p/go-libp2p-autonat v0.1.0/go.mod h1:1tLf2yXxiE/oKGtDwPYWTSYG3PtvYlJmg7NeVtPRqH8= +github.com/libp2p/go-libp2p-blankhost v0.1.1 h1:X919sCh+KLqJcNRApj43xCSiQRYqOSI88Fdf55ngf78= +github.com/libp2p/go-libp2p-blankhost v0.1.1/go.mod h1:pf2fvdLJPsC1FsVrNP3DUUvMzUts2dsLLBEpo1vW1ro= +github.com/libp2p/go-libp2p-circuit v0.1.0/go.mod h1:Ahq4cY3V9VJcHcn1SBXjr78AbFkZeIRmfunbA7pmFh8= +github.com/libp2p/go-libp2p-core v0.0.1 h1:HSTZtFIq/W5Ue43Zw+uWZyy2Vl5WtF0zDjKN8/DT/1I= +github.com/libp2p/go-libp2p-core v0.0.1/go.mod h1:g/VxnTZ/1ygHxH3dKok7Vno1VfpvGcGip57wjTU4fco= +github.com/libp2p/go-libp2p-core v0.0.2 h1:86uOwW+O6Uc7NbaK4diuLZo2/Ikvqw2rgyV03VcSbLE= +github.com/libp2p/go-libp2p-core v0.0.2/go.mod h1:9dAcntw/n46XycV4RnlBq3BpgrmyUi9LuoTNdPrbUco= +github.com/libp2p/go-libp2p-core v0.0.3 h1:+IonUYY0nJZLb5Fdv6a6DOjtGP1L8Bb3faamiI2q5FY= +github.com/libp2p/go-libp2p-core v0.0.3/go.mod h1:j+YQMNz9WNSkNezXOsahp9kwZBKBvxLpKD316QWSJXE= +github.com/libp2p/go-libp2p-crypto v0.1.0 h1:k9MFy+o2zGDNGsaoZl0MA3iZ75qXxr9OOoAZF+sD5OQ= +github.com/libp2p/go-libp2p-crypto v0.1.0/go.mod h1:sPUokVISZiy+nNuTTH/TY+leRSxnFj/2GLjtOTW90hI= +github.com/libp2p/go-libp2p-discovery v0.1.0/go.mod h1:4F/x+aldVHjHDHuX85x1zWoFTGElt8HnoDzwkFZm29g= +github.com/libp2p/go-libp2p-loggables v0.1.0 h1:h3w8QFfCt2UJl/0/NW4K829HX/0S4KD31PQ7m8UXXO8= +github.com/libp2p/go-libp2p-loggables v0.1.0/go.mod h1:EyumB2Y6PrYjr55Q3/tiJ/o3xoDasoRYM7nOzEpoa90= +github.com/libp2p/go-libp2p-mplex v0.2.0/go.mod h1:Ejl9IyjvXJ0T9iqUTE1jpYATQ9NM3g+OtR+EMMODbKo= +github.com/libp2p/go-libp2p-mplex v0.2.1 h1:E1xaJBQnbSiTHGI1gaBKmKhu1TUKkErKJnE8iGvirYI= +github.com/libp2p/go-libp2p-mplex v0.2.1/go.mod h1:SC99Rxs8Vuzrf/6WhmH41kNn13TiYdAWNYHrwImKLnE= +github.com/libp2p/go-libp2p-nat v0.0.4 h1:+KXK324yaY701On8a0aGjTnw8467kW3ExKcqW2wwmyw= +github.com/libp2p/go-libp2p-nat v0.0.4/go.mod h1:N9Js/zVtAXqaeT99cXgTV9e75KpnWCvVOiGzlcHmBbY= +github.com/libp2p/go-libp2p-netutil v0.1.0 h1:zscYDNVEcGxyUpMd0JReUZTrpMfia8PmLKcKF72EAMQ= +github.com/libp2p/go-libp2p-netutil v0.1.0/go.mod h1:3Qv/aDqtMLTUyQeundkKsA+YCThNdbQD54k3TqjpbFU= +github.com/libp2p/go-libp2p-peer v0.2.0 h1:EQ8kMjaCUwt/Y5uLgjT8iY2qg0mGUT0N1zUjer50DsY= +github.com/libp2p/go-libp2p-peer v0.2.0/go.mod h1:RCffaCvUyW2CJmG2gAWVqwePwW7JMgxjsHm7+J5kjWY= +github.com/libp2p/go-libp2p-peerstore v0.1.0 h1:MKh7pRNPHSh1fLPj8u/M/s/napdmeNpoi9BRy9lPN0E= +github.com/libp2p/go-libp2p-peerstore v0.1.0/go.mod h1:2CeHkQsr8svp4fZ+Oi9ykN1HBb6u0MOvdJ7YIsmcwtY= +github.com/libp2p/go-libp2p-record v0.1.0 h1:wHwBGbFzymoIl69BpgwIu0O6ta3TXGcMPvHUAcodzRc= +github.com/libp2p/go-libp2p-record v0.1.0/go.mod h1:ujNc8iuE5dlKWVy6wuL6dd58t0n7xI4hAIl8pE6wu5Q= +github.com/libp2p/go-libp2p-secio v0.1.0 h1:NNP5KLxuP97sE5Bu3iuwOWyT/dKEGMN5zSLMWdB7GTQ= +github.com/libp2p/go-libp2p-secio v0.1.0/go.mod h1:tMJo2w7h3+wN4pgU2LSYeiKPrfqBgkOsdiKK77hE7c8= +github.com/libp2p/go-libp2p-swarm v0.1.0 h1:HrFk2p0awrGEgch9JXK/qp/hfjqQfgNxpLWnCiWPg5s= +github.com/libp2p/go-libp2p-swarm v0.1.0/go.mod h1:wQVsCdjsuZoc730CgOvh5ox6K8evllckjebkdiY5ta4= +github.com/libp2p/go-libp2p-testing v0.0.2 h1:p9ySW7MFvGGs83hAAe0MPGnjy/tPjl5KyxpMkojdZ+g= +github.com/libp2p/go-libp2p-testing v0.0.2/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= +github.com/libp2p/go-libp2p-testing v0.0.3 h1:bdij4bKaaND7tCsaXVjRfYkMpvoOeKj9AVQGJllA6jM= +github.com/libp2p/go-libp2p-testing v0.0.3/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= +github.com/libp2p/go-libp2p-testing v0.0.4 h1:Qev57UR47GcLPXWjrunv5aLIQGO4n9mhI/8/EIrEEFc= +github.com/libp2p/go-libp2p-testing v0.0.4/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= +github.com/libp2p/go-libp2p-transport-upgrader v0.1.1 h1:PZMS9lhjK9VytzMCW3tWHAXtKXmlURSc3ZdvwEcKCzw= +github.com/libp2p/go-libp2p-transport-upgrader v0.1.1/go.mod h1:IEtA6or8JUbsV07qPW4r01GnTenLW4oi3lOPbUMGJJA= +github.com/libp2p/go-libp2p-yamux v0.2.0 h1:TSPZ5cMMz/wdoYsye/wU1TE4G3LDGMoeEN0xgnCKU/I= +github.com/libp2p/go-libp2p-yamux v0.2.0/go.mod h1:Db2gU+XfLpm6E4rG5uGCFX6uXA8MEXOxFcRoXUODaK8= +github.com/libp2p/go-libp2p-yamux v0.2.1 h1:Q3XYNiKCC2vIxrvUJL+Jg1kiyeEaIDNKLjgEjo3VQdI= +github.com/libp2p/go-libp2p-yamux v0.2.1/go.mod h1:1FBXiHDk1VyRM1C0aez2bCfHQ4vMZKkAQzZbkSQt5fI= +github.com/libp2p/go-maddr-filter v0.0.4 h1:hx8HIuuwk34KePddrp2mM5ivgPkZ09JH4AvsALRbFUs= +github.com/libp2p/go-maddr-filter v0.0.4/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= +github.com/libp2p/go-mplex v0.0.3/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0= +github.com/libp2p/go-mplex v0.1.0 h1:/nBTy5+1yRyY82YaO6HXQRnO5IAGsXTjEJaR3LdTPc0= +github.com/libp2p/go-mplex v0.1.0/go.mod h1:SXgmdki2kwCUlCCbfGLEgHjC4pFqhTp0ZoV6aiKgxDU= +github.com/libp2p/go-msgio v0.0.2 h1:ivPvEKHxmVkTClHzg6RXTYHqaJQ0V9cDbq+6lKb3UV0= +github.com/libp2p/go-msgio v0.0.2/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= +github.com/libp2p/go-msgio v0.0.3 h1:VsOlWispTivSsOMg70e0W77y6oiSBSRCyP6URrWvE04= +github.com/libp2p/go-msgio v0.0.3/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= +github.com/libp2p/go-nat v0.0.3 h1:l6fKV+p0Xa354EqQOQP+d8CivdLM4kl5GxC1hSc/UeI= +github.com/libp2p/go-nat v0.0.3/go.mod h1:88nUEt0k0JD45Bk93NIwDqjlhiOwOoV36GchpcVc1yI= github.com/libp2p/go-reuseport v0.0.1 h1:7PhkfH73VXfPJYKQ6JwS5I/eVcoyYi9IMNGc6FWpFLw= github.com/libp2p/go-reuseport v0.0.1/go.mod h1:jn6RmB1ufnQwl0Q1f+YxAj8isJgDCQzaaxIFYDhcYEA= -github.com/libp2p/go-reuseport-transport v0.0.1 h1:UIRneNxLDmEGNjGHpIiWzSWkZ5bhxMCP9x3Vh7BSc7E= -github.com/libp2p/go-reuseport-transport v0.0.1/go.mod h1:YkbSDrvjUVDL6b8XqriyA20obEtsW9BLkuOUyQAOCbs= +github.com/libp2p/go-reuseport-transport v0.0.2 h1:WglMwyXyBu61CMkjCCtnmqNqnjib0GIEjMiHTwR/KN4= +github.com/libp2p/go-reuseport-transport v0.0.2/go.mod h1:YkbSDrvjUVDL6b8XqriyA20obEtsW9BLkuOUyQAOCbs= github.com/libp2p/go-stream-muxer v0.0.1 h1:Ce6e2Pyu+b5MC1k3eeFtAax0pW4gc6MosYSLV05UeLw= github.com/libp2p/go-stream-muxer v0.0.1/go.mod h1:bAo8x7YkSpadMTbtTaxGVHWUQsR/l5MEaHbKaliuT14= -github.com/libp2p/go-tcp-transport v0.0.1 h1:WyvJVw2lYAnr6CU+GZZ4oCt06fvORlmvBlFX2+ZpZDM= -github.com/libp2p/go-tcp-transport v0.0.1/go.mod h1:mnjg0o0O5TmXUaUIanYPUqkW4+u6mK0en8rlpA6BBTs= -github.com/libp2p/go-testutil v0.0.1 h1:Xg+O0G2HIMfHqBOBDcMS1iSZJ3GEcId4qOxCQvsGZHk= -github.com/libp2p/go-testutil v0.0.1/go.mod h1:iAcJc/DKJQanJ5ws2V+u5ywdL2n12X1WbbEG+Jjy69I= -github.com/libp2p/go-ws-transport v0.0.1/go.mod h1:p3bKjDWHEgtuKKj+2OdPYs5dAPIjtpQGHF2tJfGz7Ww= +github.com/libp2p/go-stream-muxer-multistream v0.2.0 h1:714bRJ4Zy9mdhyTLJ+ZKiROmAFwUHpeRidG+q7LTQOg= +github.com/libp2p/go-stream-muxer-multistream v0.2.0/go.mod h1:j9eyPol/LLRqT+GPLSxvimPhNph4sfYfMoDPd7HkzIc= +github.com/libp2p/go-tcp-transport v0.1.0 h1:IGhowvEqyMFknOar4FWCKSWE0zL36UFKQtiRQD60/8o= +github.com/libp2p/go-tcp-transport v0.1.0/go.mod h1:oJ8I5VXryj493DEJ7OsBieu8fcg2nHGctwtInJVpipc= +github.com/libp2p/go-ws-transport v0.1.0/go.mod h1:rjw1MG1LU9YDC6gzmwObkPd/Sqwhw7yT74kj3raBFuo= +github.com/libp2p/go-yamux v1.2.2 h1:s6J6o7+ajoQMjHe7BEnq+EynOj5D2EoG8CuQgL3F2vg= +github.com/libp2p/go-yamux v1.2.2/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= +github.com/libp2p/go-yamux v1.2.3 h1:xX8A36vpXb59frIzWFdEgptLMsOANMFq2K7fPRlunYI= +github.com/libp2p/go-yamux v1.2.3/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= github.com/mattn/go-colorable v0.1.1 h1:G1f5SKeVxmagw/IyvzvtZE4Gybcc4Tr1tf7I8z0XgOg= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= +github.com/mattn/go-colorable v0.1.2 h1:/bC9yWikZXAL9uJdulbSfyVNIR3n3trXl+v8+1sx8mU= +github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-isatty v0.0.5 h1:tHXDdz1cpzGaovsTB+TVB8q90WEokoVmfMqoVcrLUgw= github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/miekg/dns v1.1.4/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/mattn/go-isatty v0.0.8 h1:HLtExJ+uU2HOZ+wI0Tt5DtUDrx8yhUqDcp7fYERX4CE= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/miekg/dns v1.1.12/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0OXOcUbGjvZxxijuBwbbmlSxLiuofa+g= github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16 h1:5W7KhL8HVF3XCFOweFD3BNESdnO8ewyYTFT2R+/b8FQ= github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= +github.com/minio/sha256-simd v0.0.0-20190328051042-05b4dd3047e5/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= +github.com/minio/sha256-simd v0.1.0 h1:U41/2erhAKcmSI14xh/ZTUdBPOzDOIfS93ibzUSl8KM= +github.com/minio/sha256-simd v0.1.0/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= github.com/mr-tron/base58 v1.1.0 h1:Y51FGVJ91WBqCEabAi5OPUz38eAx8DakuAm5svLcsfQ= github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= +github.com/mr-tron/base58 v1.1.1/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= +github.com/mr-tron/base58 v1.1.2 h1:ZEw4I2EgPKDJ2iEw0cNmLB3ROrEmkOtXIkaG7wZg+78= +github.com/mr-tron/base58 v1.1.2/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= github.com/multiformats/go-base32 v0.0.3 h1:tw5+NhuwaOjJCC5Pp82QuXbrmLzWg7uxlMFp8Nq/kkI= github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= github.com/multiformats/go-multiaddr v0.0.1 h1:/QUV3VBMDI6pi6xfiw7lr6xhDWWvQKn9udPn68kLSdY= github.com/multiformats/go-multiaddr v0.0.1/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= +github.com/multiformats/go-multiaddr v0.0.2/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= +github.com/multiformats/go-multiaddr v0.0.4 h1:WgMSI84/eRLdbptXMkMWDXPjPq7SPLIgGUVm2eroyU4= +github.com/multiformats/go-multiaddr v0.0.4/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= github.com/multiformats/go-multiaddr-dns v0.0.1/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= github.com/multiformats/go-multiaddr-dns v0.0.2 h1:/Bbsgsy3R6e3jf2qBahzNHzww6usYaZ0NhNH3sqdFS8= github.com/multiformats/go-multiaddr-dns v0.0.2/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= +github.com/multiformats/go-multiaddr-fmt v0.0.1 h1:5YjeOIzbX8OTKVaN72aOzGIYW7PnrZrnkDyOfAWRSMA= +github.com/multiformats/go-multiaddr-fmt v0.0.1/go.mod h1:aBYjqL4T/7j4Qx+R73XSv/8JsgnRFlf0w2KGLCmXl3Q= github.com/multiformats/go-multiaddr-net v0.0.1 h1:76O59E3FavvHqNg7jvzWzsPSW5JSi/ek0E4eiDVbg9g= github.com/multiformats/go-multiaddr-net v0.0.1/go.mod h1:nw6HSxNmCIQH27XPGBuX+d1tnvM7ihcFwHMSstNAVUU= github.com/multiformats/go-multibase v0.0.1 h1:PN9/v21eLywrFWdFNsFKaU04kLJzuYzmrJR+ubhT9qA= github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs= github.com/multiformats/go-multihash v0.0.1 h1:HHwN1K12I+XllBCrqKnhX949Orn4oawPkegHMu2vDqQ= github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= -github.com/multiformats/go-multistream v0.0.1 h1:JV4VfSdY9n7ECTtY59/TlSyFCzRILvYx4T4Ws8ZgihU= -github.com/multiformats/go-multistream v0.0.1/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= +github.com/multiformats/go-multihash v0.0.5 h1:1wxmCvTXAifAepIMyF39vZinRw5sbqjPs/UIi93+uik= +github.com/multiformats/go-multihash v0.0.5/go.mod h1:lt/HCbqlQwlPBz7lv0sQCdtfcMtlJvakRUn/0Ual8po= +github.com/multiformats/go-multistream v0.1.0 h1:UpO6jrsjqs46mqAK3n6wKRYFhugss9ArzbyUzU+4wkQ= +github.com/multiformats/go-multistream v0.1.0/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= 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/ginkgo v1.8.0 h1:VkHVNpR4iVnU8XQR6DBm8BqYjN7CRzw+xKUbVVbbW9w= +github.com/onsi/ginkgo v1.8.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/onsi/gomega v1.5.0 h1:izbySO9zDPmjJ8rDjLvkA2zJHIo+HkYXHnf7eN7SSyo= +github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/opentracing/opentracing-go v1.0.2 h1:3jA2P6O1F9UOrWVpwrIo17pu01KWvNWg4X946/Y5Zwg= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +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/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/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a h1:/eS3yfGjQKG+9kayBkj0ip1BGhq6zJ3eaVksphxAaek= +github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a/go.mod h1:7AyxJNCJ7SBZ1MfVQCWD6Uqo2oubI2Eq2y2eqf+A5r0= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 h1:RC6RW7j+1+HkWaX/Yh71Ee5ZHaHYt7ZP4sQgUrm6cDU= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572/go.mod h1:w0SWMsp6j9O/dk4/ZpIhL+3CkG8ofA2vuv7k+ltqUMc= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= @@ -233,29 +282,28 @@ github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc h1:9lDbC6 github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc/go.mod h1:bopw91TMyo8J3tvftk8xmU2kPmlrt4nScJQZU2hE5EM= github.com/whyrusleeping/go-notifier v0.0.0-20170827234753-097c5d47330f h1:M/lL30eFZTKnomXY6huvM6G0+gVquFNf6mxghaWlFUg= github.com/whyrusleeping/go-notifier v0.0.0-20170827234753-097c5d47330f/go.mod h1:cZNvX9cFybI01GriPRMXDtczuvUhgbcYr9iCGaNlRv8= -github.com/whyrusleeping/go-smux-multiplex v3.0.16+incompatible h1:iqksILj8STw03EJQe7Laj4ubnw+ojOyik18cd5vPL1o= -github.com/whyrusleeping/go-smux-multiplex v3.0.16+incompatible/go.mod h1:34LEDbeKFZInPUrAG+bjuJmUXONGdEFW7XL0SpTY1y4= -github.com/whyrusleeping/go-smux-multistream v2.0.2+incompatible h1:BdYHctE9HJZLquG9tpTdwWcbG4FaX6tVKPGjCGgiVxo= -github.com/whyrusleeping/go-smux-multistream v2.0.2+incompatible/go.mod h1:dRWHHvc4HDQSHh9gbKEBbUZ+f2Q8iZTPG3UOGYODxSQ= -github.com/whyrusleeping/go-smux-yamux v2.0.8+incompatible h1:IGm/UP/JpEFS6D787sZnZg7RA6fZIR9c/Ms9DeAVNuk= -github.com/whyrusleeping/go-smux-yamux v2.0.8+incompatible/go.mod h1:6qHUzBXUbB9MXmw3AUdB52L8sEb/hScCqOdW2kj/wuI= -github.com/whyrusleeping/go-smux-yamux v2.0.9+incompatible/go.mod h1:6qHUzBXUbB9MXmw3AUdB52L8sEb/hScCqOdW2kj/wuI= github.com/whyrusleeping/mafmt v1.2.8 h1:TCghSl5kkwEE0j+sU/gudyhVMRlpBin8fMBBHg59EbA= github.com/whyrusleeping/mafmt v1.2.8/go.mod h1:faQJFPbLSxzD9xpA02ttW/tS9vZykNvXwGvqIpk20FA= github.com/whyrusleeping/mdns v0.0.0-20180901202407-ef14215e6b30/go.mod h1:j4l84WPFclQPj320J9gp0XwNKBb3U0zt5CBqjPp22G4= github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7 h1:E9S12nwJwEOXe2d6gT6qxdvqMnNq+VnSsKPgm2ZZNds= github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7/go.mod h1:X2c0RVCI1eSUFI8eLcY3c0423ykwiUdxLJtkDvruhjI= -github.com/whyrusleeping/yamux v1.1.5 h1:4CK3aUUJQu0qpKZv5gEWJjNOQtdbdDhVVS6PJ+HimdE= -github.com/whyrusleeping/yamux v1.1.5/go.mod h1:E8LnQQ8HKx5KD29HZFUwM1PxCOdPRzGwur1mcYhXcD8= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25 h1:jsG6UpNLt9iAsb0S2AGW28DveNzzgmbXR+ENoPjUeIU= -golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/net v0.0.0-20180524181706-dfa909b99c79/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f h1:R423Cnkcp5JABoeemiGEPlt9tHXFfw5kvc0yqlxRPWo= +golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8 h1:1wopBVtVdWnn03fZelqdXTqk7U7zPQCb+T4rbU9ZEoU= +golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190227160552-c95aed5357e7 h1:C2F/nMkR/9sfUTpvR3QrjBuTdvMUC/cFajkphs1YLQo= golang.org/x/net v0.0.0-20190227160552-c95aed5357e7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190611141213-3f473d35a33a h1:+KkCgOMgnKSgenxTBoiwkMqTiouMIy/3o8RLdmSbGoY= +golang.org/x/net v0.0.0-20190611141213-3f473d35a33a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f h1:wMNYb4v58l5UBM7MYRLPG6ZhfOqbKu7X5eyFl8ZhKvA= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -264,9 +312,15 @@ golang.org/x/sys v0.0.0-20190219092855-153ac476189d/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190228124157-a34e9553db1e h1:ZytStCyV048ZqDsWHiYDdoI2Vd4msMcrDECFxS+tL9c= golang.org/x/sys v0.0.0-20190228124157-a34e9553db1e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190610200419-93c9922d18ae h1:xiXzMMEQdQcric9hXtr1QU98MHunKK7OTtsoU6bYWs4= +golang.org/x/sys v0.0.0-20190610200419-93c9922d18ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= 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/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= 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= @@ -277,3 +331,5 @@ gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkep gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.1 h1:mUhvW9EsL+naU5Q3cakzfE91YhliOondGd6ZrsDBHQE= 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= diff --git a/vendor/github.com/ipfs/go-blockservice/package.json b/vendor/github.com/ipfs/go-blockservice/package.json deleted file mode 100644 index 6d3a9b94..00000000 --- a/vendor/github.com/ipfs/go-blockservice/package.json +++ /dev/null @@ -1,54 +0,0 @@ -{ - "author": "why", - "bugs": { - "url": "https://github.com/ipfs/go-blockservice" - }, - "gx": { - "dvcsimport": "github.com/ipfs/go-blockservice" - }, - "gxDependencies": [ - { - "author": "why", - "hash": "QmVNRbcH1kKEQUVhCsH75kTGUVFMw2b7zEWyFKyfCwmJjo", - "name": "go-bitswap", - "version": "1.1.31" - }, - { - "author": "hsanjuan", - "hash": "Qmb9fkAWgcyVRnFdXGqA6jcWGFj6q35oJjwRAYRhfEboGS", - "name": "go-ipfs-exchange-offline", - "version": "0.1.7" - }, - { - "author": "jbenet", - "hash": "QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9", - "name": "go-datastore", - "version": "3.6.1" - }, - { - "author": "hsanjuan", - "hash": "QmXjKkjMDTtXAiLBwstVexofB8LeruZmE2eBd85GwGFFLA", - "name": "go-ipfs-blockstore", - "version": "0.1.8" - }, - { - "author": "stebalien", - "hash": "QmYYLnAzR28nAQ4U5MFniLprnktu6eTFKibeNt96V21EZK", - "name": "go-block-format", - "version": "0.2.2" - }, - { - "author": "why", - "hash": "QmcVd2ApQdbfaYPKhCjj4WoQuxk4CMxPqmNpijKmFLh6qa", - "name": "go-verifcid", - "version": "0.1.2" - } - ], - "gxVersion": "0.12.1", - "language": "go", - "license": "", - "name": "go-blockservice", - "releaseCmd": "git commit -a -m \"gx publish $VERSION\"", - "version": "1.1.31" -} - diff --git a/vendor/github.com/ipfs/go-cid/README.md b/vendor/github.com/ipfs/go-cid/README.md index 866740ec..0824d519 100644 --- a/vendor/github.com/ipfs/go-cid/README.md +++ b/vendor/github.com/ipfs/go-cid/README.md @@ -67,7 +67,7 @@ This will make sure that dependencies are rewritten to known working versions. ```go // Create a cid from a marshaled string -c, err := cid.Decode("zdvgqEMYmNeH5fKciougvQcfzMcNjF3Z1tPouJ8C7pc3pe63k") +c, err := cid.Decode("bafzbeigai3eoy2ccc7ybwjfz5r3rdxqrinwi4rwytly24tdbh6yk7zslrm") if err != nil {...} fmt.Println("Got CID: ", c) diff --git a/vendor/github.com/ipfs/go-cid/cid.go b/vendor/github.com/ipfs/go-cid/cid.go index 7565edf6..6b62d30d 100644 --- a/vendor/github.com/ipfs/go-cid/cid.go +++ b/vendor/github.com/ipfs/go-cid/cid.go @@ -368,7 +368,7 @@ func (c Cid) String() string { case 0: return c.Hash().B58String() case 1: - mbstr, err := mbase.Encode(mbase.Base58BTC, c.Bytes()) + mbstr, err := mbase.Encode(mbase.Base32, c.Bytes()) if err != nil { panic("should not error with hardcoded mbase: " + err.Error()) } diff --git a/vendor/github.com/ipfs/go-cidutil/go.mod b/vendor/github.com/ipfs/go-cidutil/go.mod index eab409cc..73ce4c91 100644 --- a/vendor/github.com/ipfs/go-cidutil/go.mod +++ b/vendor/github.com/ipfs/go-cidutil/go.mod @@ -1,7 +1,7 @@ module github.com/ipfs/go-cidutil require ( - github.com/ipfs/go-cid v0.0.1 + github.com/ipfs/go-cid v0.0.2 github.com/multiformats/go-multibase v0.0.1 github.com/multiformats/go-multihash v0.0.1 ) diff --git a/vendor/github.com/ipfs/go-cidutil/go.sum b/vendor/github.com/ipfs/go-cidutil/go.sum index 4525c37e..7319f155 100644 --- a/vendor/github.com/ipfs/go-cidutil/go.sum +++ b/vendor/github.com/ipfs/go-cidutil/go.sum @@ -2,8 +2,8 @@ github.com/gxed/hashland/keccakpg v0.0.1 h1:wrk3uMNaMxbXiHibbPO4S0ymqJMm41WiudyF github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfmKFJ6tItnhQ67kU= github.com/gxed/hashland/murmur3 v0.0.1 h1:SheiaIt0sda5K+8FLz952/1iWS9zrnKsEJaOJu4ZbSc= github.com/gxed/hashland/murmur3 v0.0.1/go.mod h1:KjXop02n4/ckmZSnY2+HKcLud/tcmvhST0bie/0lS48= -github.com/ipfs/go-cid v0.0.1 h1:GBjWPktLnNyX0JiQCNFpUuUSoMw5KMyqrsejHYlILBE= -github.com/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= +github.com/ipfs/go-cid v0.0.2 h1:tuuKaZPU1M6HcejsO3AcYWW8sZ8MTvyxfc4uqB4eFE8= +github.com/ipfs/go-cid v0.0.2/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0OXOcUbGjvZxxijuBwbbmlSxLiuofa+g= github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16 h1:5W7KhL8HVF3XCFOweFD3BNESdnO8ewyYTFT2R+/b8FQ= diff --git a/vendor/github.com/ipfs/go-datastore/delayed/delayed.go b/vendor/github.com/ipfs/go-datastore/delayed/delayed.go deleted file mode 100644 index d34909fe..00000000 --- a/vendor/github.com/ipfs/go-datastore/delayed/delayed.go +++ /dev/null @@ -1,80 +0,0 @@ -// Package delayed wraps a datastore allowing to artificially -// delay all operations. -package delayed - -import ( - "io" - - ds "github.com/ipfs/go-datastore" - dsq "github.com/ipfs/go-datastore/query" - delay "github.com/ipfs/go-ipfs-delay" -) - -// New returns a new delayed datastore. -func New(ds ds.Datastore, delay delay.D) *Delayed { - return &Delayed{ds: ds, delay: delay} -} - -// Delayed is an adapter that delays operations on the inner datastore. -type Delayed struct { - ds ds.Datastore - delay delay.D -} - -var _ ds.Batching = (*Delayed)(nil) -var _ io.Closer = (*Delayed)(nil) - -// Put implements the ds.Datastore interface. -func (dds *Delayed) Put(key ds.Key, value []byte) (err error) { - dds.delay.Wait() - return dds.ds.Put(key, value) -} - -// Get implements the ds.Datastore interface. -func (dds *Delayed) Get(key ds.Key) (value []byte, err error) { - dds.delay.Wait() - return dds.ds.Get(key) -} - -// Has implements the ds.Datastore interface. -func (dds *Delayed) Has(key ds.Key) (exists bool, err error) { - dds.delay.Wait() - return dds.ds.Has(key) -} - -// GetSize implements the ds.Datastore interface. -func (dds *Delayed) GetSize(key ds.Key) (size int, err error) { - dds.delay.Wait() - return dds.ds.GetSize(key) -} - -// Delete implements the ds.Datastore interface. -func (dds *Delayed) Delete(key ds.Key) (err error) { - dds.delay.Wait() - return dds.ds.Delete(key) -} - -// Query implements the ds.Datastore interface. -func (dds *Delayed) Query(q dsq.Query) (dsq.Results, error) { - dds.delay.Wait() - return dds.ds.Query(q) -} - -// Batch implements the ds.Batching interface. -func (dds *Delayed) Batch() (ds.Batch, error) { - return ds.NewBasicBatch(dds), nil -} - -// DiskUsage implements the ds.PersistentDatastore interface. -func (dds *Delayed) DiskUsage() (uint64, error) { - dds.delay.Wait() - return ds.DiskUsage(dds.ds) -} - -// Close closes the inner datastore (if it implements the io.Closer interface). -func (dds *Delayed) Close() error { - if closer, ok := dds.ds.(io.Closer); ok { - return closer.Close() - } - return nil -} diff --git a/vendor/github.com/ipfs/go-ipfs-addr/Makefile b/vendor/github.com/ipfs/go-ipfs-addr/Makefile deleted file mode 100644 index 4f5206e4..00000000 --- a/vendor/github.com/ipfs/go-ipfs-addr/Makefile +++ /dev/null @@ -1,13 +0,0 @@ -export IPFS_API ?= v04x.ipfs.io - -gx: - go get github.com/whyrusleeping/gx - go get github.com/whyrusleeping/gx-go - -deps: gx - gx --verbose install --global - gx-go rewrite - -publish: - gx-go rewrite --undo - diff --git a/vendor/github.com/ipfs/go-ipfs-addr/README.md b/vendor/github.com/ipfs/go-ipfs-addr/README.md deleted file mode 100644 index 0ad6de5f..00000000 --- a/vendor/github.com/ipfs/go-ipfs-addr/README.md +++ /dev/null @@ -1,47 +0,0 @@ -go-ipfs-addr -================== - -[![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](http://ipn.io) -[![](https://img.shields.io/badge/project-IPFS-blue.svg?style=flat-square)](http://libp2p.io/) -[![](https://img.shields.io/badge/freenode-%23ipfs-blue.svg?style=flat-square)](http://webchat.freenode.net/?channels=%23ipfs) -[![Coverage Status](https://coveralls.io/repos/github/ipfs/go-ipfs-addr/badge.svg?branch=master)](https://coveralls.io/github/ipfs/go-ipfs-addr?branch=master) -[![Travis CI](https://travis-ci.org/ipfs/go-ipfs-addr.svg?branch=master)](https://travis-ci.org/ipfs/go-ipfs-addr) - -> A parsing utility for ipfs multiaddrs. - - -## Table of Contents - -- [Install](#install) -- [Usage](#usage) -- [API](#api) -- [Contribute](#contribute) -- [License](#license) - -## Install - -```sh -make install -``` - -## Examples - -```go -import "github.com/ipfs/go-ipfs-addr" - -addrstr := "/ip4/104.131.131.82/tcp/4001/ipfs/QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ" -a, _ := ipfsaddr.ParseString(addr) - -fmt.Println("peer id: ", a.ID()) -fmt.Println("transport multiaddr: ", a.Transport()) -``` - -## Contribute - -PRs are welcome! - -Small note: If editing the Readme, please conform to the [standard-readme](https://github.com/RichardLitt/standard-readme) specification. - -## License - -MIT © Whyrusleeping diff --git a/vendor/github.com/ipfs/go-ipfs-addr/codecov.yml b/vendor/github.com/ipfs/go-ipfs-addr/codecov.yml deleted file mode 100644 index 5f88a9ea..00000000 --- a/vendor/github.com/ipfs/go-ipfs-addr/codecov.yml +++ /dev/null @@ -1,3 +0,0 @@ -coverage: - range: "50...100" -comment: off diff --git a/vendor/github.com/ipfs/go-ipfs-addr/go.mod b/vendor/github.com/ipfs/go-ipfs-addr/go.mod deleted file mode 100644 index ebb10e2f..00000000 --- a/vendor/github.com/ipfs/go-ipfs-addr/go.mod +++ /dev/null @@ -1,7 +0,0 @@ -module github.com/ipfs/go-ipfs-addr - -require ( - github.com/ipfs/go-log v0.0.1 - github.com/libp2p/go-libp2p-peer v0.0.1 - github.com/multiformats/go-multiaddr v0.0.1 -) diff --git a/vendor/github.com/ipfs/go-ipfs-addr/ipfsaddr.go b/vendor/github.com/ipfs/go-ipfs-addr/ipfsaddr.go deleted file mode 100644 index 52ad72e7..00000000 --- a/vendor/github.com/ipfs/go-ipfs-addr/ipfsaddr.go +++ /dev/null @@ -1,114 +0,0 @@ -package ipfsaddr - -import ( - "errors" - "strings" - - logging "github.com/ipfs/go-log" - peer "github.com/libp2p/go-libp2p-peer" - ma "github.com/multiformats/go-multiaddr" -) - -var log = logging.Logger("ipfsaddr") - -// ErrInvalidAddr signals an address is not a valid IPFS address. -var ErrInvalidAddr = errors.New("invalid IPFS address") - -type IPFSAddr interface { - ID() peer.ID - Multiaddr() ma.Multiaddr - Transport() ma.Multiaddr - String() string - Equal(b interface{}) bool -} - -type ipfsAddr struct { - ma ma.Multiaddr - id peer.ID -} - -func (a ipfsAddr) ID() peer.ID { - return a.id -} - -func (a ipfsAddr) Multiaddr() ma.Multiaddr { - return a.ma -} - -func (a ipfsAddr) Transport() ma.Multiaddr { - return Transport(a) -} - -func (a ipfsAddr) String() string { - return a.ma.String() -} - -func (a ipfsAddr) Equal(b interface{}) bool { - if ib, ok := b.(IPFSAddr); ok { - return a.Multiaddr().Equal(ib.Multiaddr()) - } - if mb, ok := b.(ma.Multiaddr); ok { - return a.Multiaddr().Equal(mb) - } - return false -} - -// ParseString parses a string representation of an address into an IPFSAddr -func ParseString(str string) (a IPFSAddr, err error) { - if str == "" { - return nil, ErrInvalidAddr - } - - m, err := ma.NewMultiaddr(str) - if err != nil { - return nil, err - } - - return ParseMultiaddr(m) -} - -// ParseMultiaddr parses a multiaddr into an IPFSAddr -func ParseMultiaddr(m ma.Multiaddr) (a IPFSAddr, err error) { - // never panic. - defer func() { - if r := recover(); r != nil { - log.Debug("recovered from panic: ", r) - a = nil - err = ErrInvalidAddr - } - }() - - if m == nil { - return nil, ErrInvalidAddr - } - - // make sure it's an IPFS addr - parts := ma.Split(m) - if len(parts) < 1 { - return nil, ErrInvalidAddr - } - ipfspart := parts[len(parts)-1] // last part - if ipfspart.Protocols()[0].Code != ma.P_IPFS { - return nil, ErrInvalidAddr - } - - // make sure 'ipfs id' parses as a peer.ID - peerIdParts := strings.Split(ipfspart.String(), "/") - peerIdStr := peerIdParts[len(peerIdParts)-1] - id, err := peer.IDB58Decode(peerIdStr) - if err != nil { - return nil, err - } - - return ipfsAddr{ma: m, id: id}, nil -} - -func Transport(iaddr IPFSAddr) ma.Multiaddr { - maddr := iaddr.Multiaddr() - - split := ma.Split(maddr) - if len(split) == 1 { - return nil - } - return ma.Join(split[:len(split)-1]...) -} diff --git a/vendor/github.com/ipfs/go-ipfs-addr/package.json b/vendor/github.com/ipfs/go-ipfs-addr/package.json deleted file mode 100644 index 3b0615a3..00000000 --- a/vendor/github.com/ipfs/go-ipfs-addr/package.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "author": "why", - "bugs": { - "url": "https://github.com/ipfs/go-ipfs-addr" - }, - "gx": { - "dvcsimport": "github.com/ipfs/go-ipfs-addr" - }, - "gxDependencies": [ - { - "author": "multiformats", - "hash": "QmTZBfrPJmjWsCvHEtX5FE6KimVJhsJg5sBbqEFYf4UZtL", - "name": "go-multiaddr", - "version": "1.4.1" - }, - { - "hash": "QmbkT7eMTyXfpeyB3ZMxxcxg7XH8t6uXp49jqzz4HB7BGF", - "name": "go-log", - "version": "1.5.9" - }, - { - "author": "whyrusleeping", - "hash": "QmYVXrKrKHDC9FobgmcmshCDyWwdrfwfanNQN4oxJ9Fk3h", - "name": "go-libp2p-peer", - "version": "3.1.2" - } - ], - "gxVersion": "0.11.0", - "language": "go", - "license": "", - "name": "go-ipfs-addr", - "releaseCmd": "git commit -a -m \"gx publish $VERSION\"", - "version": "0.1.33" -} - diff --git a/vendor/github.com/ipfs/go-ipfs-config/.travis.yml b/vendor/github.com/ipfs/go-ipfs-config/.travis.yml index 4cfe98c2..5163d693 100644 --- a/vendor/github.com/ipfs/go-ipfs-config/.travis.yml +++ b/vendor/github.com/ipfs/go-ipfs-config/.travis.yml @@ -10,7 +10,6 @@ env: global: - GOTFLAGS="-race" matrix: - - BUILD_DEPTYPE=gx - BUILD_DEPTYPE=gomod @@ -24,7 +23,6 @@ script: cache: directories: - - $GOPATH/src/gx - $GOPATH/pkg/mod - $HOME/.cache/go-build diff --git a/vendor/github.com/ipfs/go-ipfs-config/bootstrap_peers.go b/vendor/github.com/ipfs/go-ipfs-config/bootstrap_peers.go index 92fc580e..f4a13dc9 100644 --- a/vendor/github.com/ipfs/go-ipfs-config/bootstrap_peers.go +++ b/vendor/github.com/ipfs/go-ipfs-config/bootstrap_peers.go @@ -4,7 +4,9 @@ import ( "errors" "fmt" - iaddr "github.com/ipfs/go-ipfs-addr" + peer "github.com/libp2p/go-libp2p-core/peer" + ma "github.com/multiformats/go-multiaddr" + // Needs to be imported so that users can import this package directly // and still parse the bootstrap addresses. _ "github.com/multiformats/go-multiaddr-dns" @@ -32,20 +34,17 @@ var DefaultBootstrapAddresses = []string{ "/ip6/2a03:b0c0:0:1010::23:1001/tcp/4001/ipfs/QmSoLer265NRgSp2LA3dPaeykiS1J6DifTC88f5uVQKNAd", // earth.i.ipfs.io } -// BootstrapPeer is a peer used to bootstrap the network. -type BootstrapPeer iaddr.IPFSAddr - // ErrInvalidPeerAddr signals an address is not a valid peer address. var ErrInvalidPeerAddr = errors.New("invalid peer address") -func (c *Config) BootstrapPeers() ([]BootstrapPeer, error) { +func (c *Config) BootstrapPeers() ([]peer.AddrInfo, error) { return ParseBootstrapPeers(c.Bootstrap) } // DefaultBootstrapPeers returns the (parsed) set of default bootstrap peers. // if it fails, it returns a meaningful error for the user. // This is here (and not inside cmd/ipfs/init) because of module dependency problems. -func DefaultBootstrapPeers() ([]BootstrapPeer, error) { +func DefaultBootstrapPeers() ([]peer.AddrInfo, error) { ps, err := ParseBootstrapPeers(DefaultBootstrapAddresses) if err != nil { return nil, fmt.Errorf(`failed to parse hardcoded bootstrap peers: %s @@ -54,34 +53,36 @@ This is a problem with the ipfs codebase. Please report it to the dev team.`, er return ps, nil } -func (c *Config) SetBootstrapPeers(bps []BootstrapPeer) { +func (c *Config) SetBootstrapPeers(bps []peer.AddrInfo) { c.Bootstrap = BootstrapPeerStrings(bps) } -func ParseBootstrapPeer(addr string) (BootstrapPeer, error) { - ia, err := iaddr.ParseString(addr) - if err != nil { - return nil, err - } - return BootstrapPeer(ia), err -} - -func ParseBootstrapPeers(addrs []string) ([]BootstrapPeer, error) { - peers := make([]BootstrapPeer, len(addrs)) - var err error +// ParseBootstrapPeer parses a bootstrap list into a list of AddrInfos. +func ParseBootstrapPeers(addrs []string) ([]peer.AddrInfo, error) { + maddrs := make([]ma.Multiaddr, len(addrs)) for i, addr := range addrs { - peers[i], err = ParseBootstrapPeer(addr) + var err error + maddrs[i], err = ma.NewMultiaddr(addr) if err != nil { return nil, err } } - return peers, nil + return peer.AddrInfosFromP2pAddrs(maddrs...) } -func BootstrapPeerStrings(bps []BootstrapPeer) []string { - bpss := make([]string, len(bps)) - for i, p := range bps { - bpss[i] = p.String() +// BootstrapPeerStrings formats a list of AddrInfos as a bootstrap peer list +// suitable for serialization. +func BootstrapPeerStrings(bps []peer.AddrInfo) []string { + bpss := make([]string, 0, len(bps)) + for _, pi := range bps { + addrs, err := peer.AddrInfoToP2pAddrs(&pi) + if err != nil { + // programmer error. + panic(err) + } + for _, addr := range addrs { + bpss = append(bpss, addr.String()) + } } return bpss } diff --git a/vendor/github.com/ipfs/go-ipfs-config/experiments.go b/vendor/github.com/ipfs/go-ipfs-config/experiments.go index c5cb0cf2..6821ed6b 100644 --- a/vendor/github.com/ipfs/go-ipfs-config/experiments.go +++ b/vendor/github.com/ipfs/go-ipfs-config/experiments.go @@ -8,4 +8,5 @@ type Experiments struct { P2pHttpProxy bool QUIC bool PreferTLS bool + StrategicProviding bool } diff --git a/vendor/github.com/ipfs/go-ipfs-config/go.mod b/vendor/github.com/ipfs/go-ipfs-config/go.mod index 5e868fc6..95b7006b 100644 --- a/vendor/github.com/ipfs/go-ipfs-config/go.mod +++ b/vendor/github.com/ipfs/go-ipfs-config/go.mod @@ -2,10 +2,9 @@ module github.com/ipfs/go-ipfs-config require ( github.com/facebookgo/atomicfile v0.0.0-20151019160806-2de1f203e7d5 - github.com/ipfs/go-ipfs-addr v0.0.1 github.com/ipfs/go-ipfs-util v0.0.1 - github.com/libp2p/go-libp2p-crypto v0.0.1 - github.com/libp2p/go-libp2p-peer v0.0.1 + github.com/libp2p/go-libp2p-core v0.0.3 github.com/mitchellh/go-homedir v1.1.0 + github.com/multiformats/go-multiaddr v0.0.4 github.com/multiformats/go-multiaddr-dns v0.0.2 ) diff --git a/vendor/github.com/ipfs/go-ipfs-config/go.sum b/vendor/github.com/ipfs/go-ipfs-config/go.sum index 01ba2fb5..de086052 100644 --- a/vendor/github.com/ipfs/go-ipfs-config/go.sum +++ b/vendor/github.com/ipfs/go-ipfs-config/go.sum @@ -1,16 +1,16 @@ github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= -github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32 h1:qkOC5Gd33k54tobS36cXdAzJbeHaduLtnLQQwNoIi78= -github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32/go.mod h1:DrZx5ec/dmnfpw9KyYoQyYo7d0KEvTkk/5M/vbZjAr8= +github.com/btcsuite/btcd v0.0.0-20190523000118-16327141da8c h1:aEbSeNALREWXk0G7UdNhR3ayBV7tZ4M2PNmnrCAph6Q= +github.com/btcsuite/btcd v0.0.0-20190523000118-16327141da8c/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI= github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= -github.com/btcsuite/btcutil v0.0.0-20190207003914-4c204d697803/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= +github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495 h1:6IyqGr3fnd0tM3YxipK27TUskaOVUjU2nG45yzwcQKY= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/facebookgo/atomicfile v0.0.0-20151019160806-2de1f203e7d5 h1:BBso6MBKW8ncyZLv37o+KNyy0HrrHgfnOaGQC2qvN+A= github.com/facebookgo/atomicfile v0.0.0-20151019160806-2de1f203e7d5/go.mod h1:JpoxHjuQauoxiFMl1ie8Xc/7TfLuMZ5eOCONd1sUBHg= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= @@ -22,63 +22,68 @@ github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfm github.com/gxed/hashland/murmur3 v0.0.1 h1:SheiaIt0sda5K+8FLz952/1iWS9zrnKsEJaOJu4ZbSc= github.com/gxed/hashland/murmur3 v0.0.1/go.mod h1:KjXop02n4/ckmZSnY2+HKcLud/tcmvhST0bie/0lS48= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/ipfs/go-ipfs-addr v0.0.1 h1:DpDFybnho9v3/a1dzJ5KnWdThWD1HrFLpQ+tWIyBaFI= -github.com/ipfs/go-ipfs-addr v0.0.1/go.mod h1:uKTDljHT3Q3SUWzDLp3aYUi8MrY32fgNgogsIa0npjg= +github.com/ipfs/go-cid v0.0.2/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= github.com/ipfs/go-ipfs-util v0.0.1 h1:Wz9bL2wB2YBJqggkA4dD7oSmqB4cAnpNbGrlHJulv50= github.com/ipfs/go-ipfs-util v0.0.1/go.mod h1:spsl5z8KUnrve+73pOhSVZND1SIxPW5RyBCNzQxlJBc= -github.com/ipfs/go-log v0.0.1 h1:9XTUN/rW64BCG1YhPK9Hoy3q8nr4gOmHHBpgFdfw6Lc= -github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM= +github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA= +github.com/jbenet/goprocess v0.1.3 h1:YKyIEECS/XvcfHtBzxtjBBbWK+MbvA6dG8ASiqwvr10= +github.com/jbenet/goprocess v0.1.3/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= -github.com/libp2p/go-libp2p-crypto v0.0.1 h1:JNQd8CmoGTohO/akqrH16ewsqZpci2CbgYH/LmYl8gw= -github.com/libp2p/go-libp2p-crypto v0.0.1/go.mod h1:yJkNyDmO341d5wwXxDUGO0LykUVT72ImHNUqh5D/dBE= -github.com/libp2p/go-libp2p-peer v0.0.1 h1:0qwAOljzYewINrU+Kndoc+1jAL7vzY/oY2Go4DCGfyY= -github.com/libp2p/go-libp2p-peer v0.0.1/go.mod h1:nXQvOBbwVqoP+T5Y5nCjeH4sP9IX/J0AMzcDUVruVoo= -github.com/mattn/go-colorable v0.1.1 h1:G1f5SKeVxmagw/IyvzvtZE4Gybcc4Tr1tf7I8z0XgOg= -github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= -github.com/mattn/go-isatty v0.0.5 h1:tHXDdz1cpzGaovsTB+TVB8q90WEokoVmfMqoVcrLUgw= -github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZxBdp967ls1g+k8= +github.com/libp2p/go-libp2p-core v0.0.3 h1:+IonUYY0nJZLb5Fdv6a6DOjtGP1L8Bb3faamiI2q5FY= +github.com/libp2p/go-libp2p-core v0.0.3/go.mod h1:j+YQMNz9WNSkNezXOsahp9kwZBKBvxLpKD316QWSJXE= github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0OXOcUbGjvZxxijuBwbbmlSxLiuofa+g= github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16 h1:5W7KhL8HVF3XCFOweFD3BNESdnO8ewyYTFT2R+/b8FQ= github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= +github.com/minio/sha256-simd v0.0.0-20190328051042-05b4dd3047e5/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= +github.com/minio/sha256-simd v0.1.0 h1:U41/2erhAKcmSI14xh/ZTUdBPOzDOIfS93ibzUSl8KM= +github.com/minio/sha256-simd v0.1.0/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mr-tron/base58 v1.1.0 h1:Y51FGVJ91WBqCEabAi5OPUz38eAx8DakuAm5svLcsfQ= github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= +github.com/mr-tron/base58 v1.1.2 h1:ZEw4I2EgPKDJ2iEw0cNmLB3ROrEmkOtXIkaG7wZg+78= +github.com/mr-tron/base58 v1.1.2/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= +github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= github.com/multiformats/go-multiaddr v0.0.1 h1:/QUV3VBMDI6pi6xfiw7lr6xhDWWvQKn9udPn68kLSdY= github.com/multiformats/go-multiaddr v0.0.1/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= +github.com/multiformats/go-multiaddr v0.0.4 h1:WgMSI84/eRLdbptXMkMWDXPjPq7SPLIgGUVm2eroyU4= +github.com/multiformats/go-multiaddr v0.0.4/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= github.com/multiformats/go-multiaddr-dns v0.0.2 h1:/Bbsgsy3R6e3jf2qBahzNHzww6usYaZ0NhNH3sqdFS8= github.com/multiformats/go-multiaddr-dns v0.0.2/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= +github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs= github.com/multiformats/go-multihash v0.0.1 h1:HHwN1K12I+XllBCrqKnhX949Orn4oawPkegHMu2vDqQ= github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= +github.com/multiformats/go-multihash v0.0.5 h1:1wxmCvTXAifAepIMyF39vZinRw5sbqjPs/UIi93+uik= +github.com/multiformats/go-multihash v0.0.5/go.mod h1:lt/HCbqlQwlPBz7lv0sQCdtfcMtlJvakRUn/0Ual8po= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/opentracing/opentracing-go v1.0.2 h1:3jA2P6O1F9UOrWVpwrIo17pu01KWvNWg4X946/Y5Zwg= -github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -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/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc h1:9lDbC6Rz4bwmou+oE6Dt4Cb2BGMur5eR/GYptkKUVHo= -github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc/go.mod h1:bopw91TMyo8J3tvftk8xmU2kPmlrt4nScJQZU2hE5EM= +github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a h1:/eS3yfGjQKG+9kayBkj0ip1BGhq6zJ3eaVksphxAaek= +github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a/go.mod h1:7AyxJNCJ7SBZ1MfVQCWD6Uqo2oubI2Eq2y2eqf+A5r0= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 h1:RC6RW7j+1+HkWaX/Yh71Ee5ZHaHYt7ZP4sQgUrm6cDU= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572/go.mod h1:w0SWMsp6j9O/dk4/ZpIhL+3CkG8ofA2vuv7k+ltqUMc= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b h1:+/WWzjwW6gidDJnMKWLKLX1gxn7irUTF1fLpQovfQ5M= -golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5 h1:8dUaAV7K4uHsF56JQWkprecIQKdPHtR9jCHF5nB8uzc= +golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190227160552-c95aed5357e7 h1:C2F/nMkR/9sfUTpvR3QrjBuTdvMUC/cFajkphs1YLQo= -golang.org/x/net v0.0.0-20190227160552-c95aed5357e7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/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-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190219092855-153ac476189d/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223 h1:DH4skfRX4EBpamg7iV4ZlCpblAHI6s6TDM39bFZumv8= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d h1:+R4KGOnez64A81RvjARKc4UT5/tI9ujCIVX+P5KiHuI= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/vendor/github.com/ipfs/go-ipfs-config/identity.go b/vendor/github.com/ipfs/go-ipfs-config/identity.go index c09af564..f4e7c872 100644 --- a/vendor/github.com/ipfs/go-ipfs-config/identity.go +++ b/vendor/github.com/ipfs/go-ipfs-config/identity.go @@ -3,7 +3,7 @@ package config import ( "encoding/base64" - ic "github.com/libp2p/go-libp2p-crypto" + ic "github.com/libp2p/go-libp2p-core/crypto" ) const IdentityTag = "Identity" diff --git a/vendor/github.com/ipfs/go-ipfs-config/init.go b/vendor/github.com/ipfs/go-ipfs-config/init.go index 0697cc4c..7f11c3a3 100644 --- a/vendor/github.com/ipfs/go-ipfs-config/init.go +++ b/vendor/github.com/ipfs/go-ipfs-config/init.go @@ -7,8 +7,8 @@ import ( "io" "time" - ci "github.com/libp2p/go-libp2p-crypto" - peer "github.com/libp2p/go-libp2p-peer" + ci "github.com/libp2p/go-libp2p-core/crypto" + peer "github.com/libp2p/go-libp2p-core/peer" ) func Init(out io.Writer, nBitsForKeypair int) (*Config, error) { diff --git a/vendor/github.com/ipfs/go-ipfs-config/package.json b/vendor/github.com/ipfs/go-ipfs-config/package.json deleted file mode 100644 index ddd61bf5..00000000 --- a/vendor/github.com/ipfs/go-ipfs-config/package.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "author": "magik6k", - "bugs": { - "url": "https://github.com/ipfs/go-ipfs-config" - }, - "gx": { - "dvcsimport": "github.com/ipfs/go-ipfs-config" - }, - "gxDependencies": [ - { - "author": "whyrusleeping", - "hash": "QmNohiVssaPw3KVLZik59DBVGTSm2dGvYT9eoXt5DQ36Yz", - "name": "go-ipfs-util", - "version": "1.2.9" - }, - { - "author": "facebookgo", - "hash": "QmdYwCmx8pZRkzdcd8MhmLJqYVoVTC1aGsy5Q4reMGLNLg", - "name": "atomicfile", - "version": "0.0.0" - }, - { - "author": "why", - "hash": "Qmdf1djucJ1jX5RMF1bDbFg5ybZnupmSAeETQQ3ZV7z6dU", - "name": "go-ipfs-addr", - "version": "0.1.33" - }, - { - "author": "lgierth", - "hash": "QmU98UaAEh4WJAcir2qjfztU77JQ14kAwHNFkjUXHZA3Vy", - "name": "go-multiaddr-dns", - "version": "0.3.1" - }, - { - "author": "mitchellh", - "hash": "QmdcULN1WCzgoQmcCaUAmEhwcxHYsDrbZ2LvRJKCL8dMrK", - "name": "go-homedir", - "version": "1.0.0" - }, - { - "author": "whyrusleeping", - "hash": "QmTW4SdgBWq9GjsBsHeUx8WuGxzhgzAf88UMH2w62PC8yK", - "name": "go-libp2p-crypto", - "version": "2.0.7" - }, - { - "author": "whyrusleeping", - "hash": "QmYVXrKrKHDC9FobgmcmshCDyWwdrfwfanNQN4oxJ9Fk3h", - "name": "go-libp2p-peer", - "version": "3.1.2" - } - ], - "gxVersion": "0.12.1", - "language": "go", - "license": "", - "name": "go-ipfs-config", - "releaseCmd": "git commit -a -m \"gx publish $VERSION\"", - "version": "0.2.27" -} - diff --git a/vendor/github.com/ipfs/go-ipfs-config/profile.go b/vendor/github.com/ipfs/go-ipfs-config/profile.go index f293202e..ac871f3f 100644 --- a/vendor/github.com/ipfs/go-ipfs-config/profile.go +++ b/vendor/github.com/ipfs/go-ipfs-config/profile.go @@ -3,6 +3,7 @@ package config import ( "fmt" "net" + "os" "time" ) @@ -18,8 +19,9 @@ type Profile struct { Transform Transformer } -// defaultServerFilters has a list of non-routable IPv4 prefixes -// according to http://www.iana.org/assignments/iana-ipv4-special-registry/iana-ipv4-special-registry.xhtml +// defaultServerFilters has is a list of IPv4 and IPv6 prefixes that are private, local only, or unrouteable. +// according to https://www.iana.org/assignments/iana-ipv4-special-registry/iana-ipv4-special-registry.xhtml +// and https://www.iana.org/assignments/iana-ipv6-special-registry/iana-ipv6-special-registry.xhtml var defaultServerFilters = []string{ "/ip4/10.0.0.0/ipcidr/8", "/ip4/100.64.0.0/ipcidr/10", @@ -36,6 +38,11 @@ var defaultServerFilters = []string{ "/ip4/198.51.100.0/ipcidr/24", "/ip4/203.0.113.0/ipcidr/24", "/ip4/240.0.0.0/ipcidr/4", + "/ip6/100::/ipcidr/64", + "/ip6/2001:2::/ipcidr/48", + "/ip6/2001:db8::/ipcidr/32", + "/ip6/fc00::/ipcidr/7", + "/ip6/fe80::/ipcidr/10", } // Profiles is a map holding configuration transformers. Docs are in docs/config.md @@ -131,6 +138,29 @@ Make sure to backup your data frequently.`, return nil }, }, + "postgresds": { + Description: `Replaces default datastore configuration with experimental +postgres datastore. + +WARNING: postgres datastore is experimental. +Make sure to backup your data frequently.`, + Transform: func(c *Config) error { + c.Datastore.Spec = map[string]interface{}{ + "type": "measure", + "prefix": "postgres.datastore", + "child": map[string]interface{}{ + "type": "postgres", + "host": os.Getenv("IPFS_PGHOST"), + "user": os.Getenv("IPFS_PGUSER"), + "passfile": os.Getenv("IPFS_PGPASSFILE"), + "password": os.Getenv("IPFS_PGPASSWORD"), + "dbname": os.Getenv("IPFS_PGDATABASE"), + "port": os.Getenv("IPFS_PGPORT"), + }, + } + return nil + }, + }, "default-datastore": { Description: `Restores default datastore configuration. diff --git a/vendor/github.com/ipfs/go-ipfs-files/webfile.go b/vendor/github.com/ipfs/go-ipfs-files/webfile.go index 0e26e277..594b81c8 100644 --- a/vendor/github.com/ipfs/go-ipfs-files/webfile.go +++ b/vendor/github.com/ipfs/go-ipfs-files/webfile.go @@ -2,6 +2,7 @@ package files import ( "errors" + "fmt" "io" "net/http" "net/url" @@ -25,19 +26,30 @@ func NewWebFile(url *url.URL) *WebFile { } } -// Read reads the File from it's web location. On the first -// call to Read, a GET request will be performed against the -// WebFile's URL, using Go's default HTTP client. Any further -// reads will keep reading from the HTTP Request body. -func (wf *WebFile) Read(b []byte) (int, error) { +func (wf *WebFile) start() error { if wf.body == nil { - resp, err := http.Get(wf.url.String()) + s := wf.url.String() + resp, err := http.Get(s) if err != nil { - return 0, err + return err + } + if resp.StatusCode < 200 || resp.StatusCode > 299 { + return fmt.Errorf("got non-2XX status code %d: %s", resp.StatusCode, s) } wf.body = resp.Body wf.contentLength = resp.ContentLength } + return nil +} + +// Read reads the File from it's web location. On the first +// call to Read, a GET request will be performed against the +// WebFile's URL, using Go's default HTTP client. Any further +// reads will keep reading from the HTTP Request body. +func (wf *WebFile) Read(b []byte) (int, error) { + if err := wf.start(); err != nil { + return 0, err + } return wf.body.Read(b) } @@ -55,6 +67,9 @@ func (wf *WebFile) Seek(offset int64, whence int) (int64, error) { } func (wf *WebFile) Size() (int64, error) { + if err := wf.start(); err != nil { + return 0, err + } if wf.contentLength < 0 { return -1, errors.New("Content-Length hearer was not set") } diff --git a/vendor/github.com/ipfs/go-ipfs-flags/Makefile b/vendor/github.com/ipfs/go-ipfs-flags/Makefile deleted file mode 100644 index 73f2841f..00000000 --- a/vendor/github.com/ipfs/go-ipfs-flags/Makefile +++ /dev/null @@ -1,18 +0,0 @@ -all: deps -gx: - go get github.com/whyrusleeping/gx - go get github.com/whyrusleeping/gx-go -deps: gx - gx --verbose install --global - gx-go rewrite -test: deps - gx test -v -race -coverprofile=coverage.txt -covermode=atomic . -rw: - gx-go rewrite -rwundo: - gx-go rewrite --undo -publish: rwundo - gx publish -.PHONY: all gx deps test rw rwundo publish - - diff --git a/vendor/github.com/ipfs/go-ipfs-flags/README.md b/vendor/github.com/ipfs/go-ipfs-flags/README.md deleted file mode 100644 index b5393162..00000000 --- a/vendor/github.com/ipfs/go-ipfs-flags/README.md +++ /dev/null @@ -1,42 +0,0 @@ -# go-ipfs-flags - -[![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](http://ipn.io) -[![](https://img.shields.io/badge/project-IPFS-blue.svg?style=flat-square)](http://ipfs.io/) -[![standard-readme compliant](https://img.shields.io/badge/standard--readme-OK-green.svg?style=flat-square)](https://github.com/RichardLitt/standard-readme) -[![GoDoc](https://godoc.org/github.com/ipfs/go-ipfs-flags?status.svg)](https://godoc.org/github.com/ipfs/go-ipfs-flags) -[![Build Status](https://travis-ci.org/ipfs/go-ipfs-flags.svg?branch=master)](https://travis-ci.org/ipfs/go-ipfs-flags) - -> go-ipfs-flags groups go-ipfs configuration options used by several modules. - -## Table of Contents - -- [Install](#install) -- [Usage](#usage) -- [Contribute](#contribute) -- [License](#license) - -## Install - -`go-ipfs-flags` works like a regular Go module: - -``` -> go get github.com/ipfs/go-ipfs-flags -``` - -## Usage - -``` -import "github.com/ipfs/go-ipfs-flags" -``` - -Check the [GoDoc documentation](https://godoc.org/github.com/ipfs/go-ipfs-flags) - -## Contribute - -PRs accepted. - -Small note: If editing the README, please conform to the [standard-readme](https://github.com/RichardLitt/standard-readme) specification. - -## License - -MIT © Protocol Labs, Inc. diff --git a/vendor/github.com/ipfs/go-ipfs-flags/flags.go b/vendor/github.com/ipfs/go-ipfs-flags/flags.go deleted file mode 100644 index d3e750ae..00000000 --- a/vendor/github.com/ipfs/go-ipfs-flags/flags.go +++ /dev/null @@ -1,14 +0,0 @@ -package flags - -import ( - "os" -) - -// LowMemMode specifies if we should try to reduce the memory footprint -var LowMemMode bool - -func init() { - if os.Getenv("IPFS_LOW_MEM") != "" { - LowMemMode = true - } -} diff --git a/vendor/github.com/ipfs/go-ipfs-flags/go.mod b/vendor/github.com/ipfs/go-ipfs-flags/go.mod deleted file mode 100644 index a8126fff..00000000 --- a/vendor/github.com/ipfs/go-ipfs-flags/go.mod +++ /dev/null @@ -1 +0,0 @@ -module github.com/ipfs/go-ipfs-flags diff --git a/vendor/github.com/ipfs/go-ipfs-flags/package.json b/vendor/github.com/ipfs/go-ipfs-flags/package.json deleted file mode 100644 index 1d95f253..00000000 --- a/vendor/github.com/ipfs/go-ipfs-flags/package.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "author": "hsanjuan", - "bugs": { - "url": "https://github.com/ipfs/go-ipfs-flags" - }, - "gx": { - "dvcsimport": "github.com/ipfs/go-ipfs-flags" - }, - "gxVersion": "0.12.1", - "language": "go", - "license": "", - "name": "go-ipfs-flags", - "releaseCmd": "git commit -a -m \"gx publish $VERSION\"", - "version": "0.0.1" -} - diff --git a/vendor/github.com/ipfs/go-ipfs-routing/mock/centralized_client.go b/vendor/github.com/ipfs/go-ipfs-routing/mock/centralized_client.go deleted file mode 100644 index e09350da..00000000 --- a/vendor/github.com/ipfs/go-ipfs-routing/mock/centralized_client.go +++ /dev/null @@ -1,90 +0,0 @@ -package mockrouting - -import ( - "context" - "time" - - cid "github.com/ipfs/go-cid" - logging "github.com/ipfs/go-log" - peer "github.com/libp2p/go-libp2p-peer" - pstore "github.com/libp2p/go-libp2p-peerstore" - routing "github.com/libp2p/go-libp2p-routing" - ropts "github.com/libp2p/go-libp2p-routing/options" - "github.com/libp2p/go-testutil" - ma "github.com/multiformats/go-multiaddr" -) - -var log = logging.Logger("mockrouter") - -type client struct { - vs routing.ValueStore - server server - peer testutil.Identity -} - -// FIXME(brian): is this method meant to simulate putting a value into the network? -func (c *client) PutValue(ctx context.Context, key string, val []byte, opts ...ropts.Option) error { - log.Debugf("PutValue: %s", key) - return c.vs.PutValue(ctx, key, val, opts...) -} - -// FIXME(brian): is this method meant to simulate getting a value from the network? -func (c *client) GetValue(ctx context.Context, key string, opts ...ropts.Option) ([]byte, error) { - log.Debugf("GetValue: %s", key) - return c.vs.GetValue(ctx, key, opts...) -} - -func (c *client) SearchValue(ctx context.Context, key string, opts ...ropts.Option) (<-chan []byte, error) { - log.Debugf("SearchValue: %s", key) - return c.vs.SearchValue(ctx, key, opts...) -} - -func (c *client) FindProviders(ctx context.Context, key cid.Cid) ([]pstore.PeerInfo, error) { - return c.server.Providers(key), nil -} - -func (c *client) FindPeer(ctx context.Context, pid peer.ID) (pstore.PeerInfo, error) { - log.Debugf("FindPeer: %s", pid) - return pstore.PeerInfo{}, nil -} - -func (c *client) FindProvidersAsync(ctx context.Context, k cid.Cid, max int) <-chan pstore.PeerInfo { - out := make(chan pstore.PeerInfo) - go func() { - defer close(out) - for i, p := range c.server.Providers(k) { - if max <= i { - return - } - select { - case out <- p: - case <-ctx.Done(): - return - } - } - }() - return out -} - -// Provide returns once the message is on the network. Value is not necessarily -// visible yet. -func (c *client) Provide(_ context.Context, key cid.Cid, brd bool) error { - if !brd { - return nil - } - info := pstore.PeerInfo{ - ID: c.peer.ID(), - Addrs: []ma.Multiaddr{c.peer.Address()}, - } - return c.server.Announce(info, key) -} - -func (c *client) Ping(ctx context.Context, p peer.ID) (time.Duration, error) { - return 0, nil -} - -func (c *client) Bootstrap(context.Context) error { - return nil -} - -var _ routing.IpfsRouting = &client{} diff --git a/vendor/github.com/ipfs/go-ipfs-routing/mock/centralized_server.go b/vendor/github.com/ipfs/go-ipfs-routing/mock/centralized_server.go deleted file mode 100644 index a223f911..00000000 --- a/vendor/github.com/ipfs/go-ipfs-routing/mock/centralized_server.go +++ /dev/null @@ -1,93 +0,0 @@ -package mockrouting - -import ( - "context" - "math/rand" - "sync" - "time" - - cid "github.com/ipfs/go-cid" - ds "github.com/ipfs/go-datastore" - dssync "github.com/ipfs/go-datastore/sync" - peer "github.com/libp2p/go-libp2p-peer" - pstore "github.com/libp2p/go-libp2p-peerstore" - "github.com/libp2p/go-testutil" - - offline "github.com/ipfs/go-ipfs-routing/offline" -) - -// server is the mockrouting.Client's private interface to the routing server -type server interface { - Announce(pstore.PeerInfo, cid.Cid) error - Providers(cid.Cid) []pstore.PeerInfo - - Server -} - -// s is an implementation of the private server interface -type s struct { - delayConf DelayConfig - - lock sync.RWMutex - providers map[string]map[peer.ID]providerRecord -} - -type providerRecord struct { - Peer pstore.PeerInfo - Created time.Time -} - -func (rs *s) Announce(p pstore.PeerInfo, c cid.Cid) error { - rs.lock.Lock() - defer rs.lock.Unlock() - - k := c.KeyString() - - _, ok := rs.providers[k] - if !ok { - rs.providers[k] = make(map[peer.ID]providerRecord) - } - rs.providers[k][p.ID] = providerRecord{ - Created: time.Now(), - Peer: p, - } - return nil -} - -func (rs *s) Providers(c cid.Cid) []pstore.PeerInfo { - rs.delayConf.Query.Wait() // before locking - - rs.lock.RLock() - defer rs.lock.RUnlock() - k := c.KeyString() - - var ret []pstore.PeerInfo - records, ok := rs.providers[k] - if !ok { - return ret - } - for _, r := range records { - if time.Since(r.Created) > rs.delayConf.ValueVisibility.Get() { - ret = append(ret, r.Peer) - } - } - - for i := range ret { - j := rand.Intn(i + 1) - ret[i], ret[j] = ret[j], ret[i] - } - - return ret -} - -func (rs *s) Client(p testutil.Identity) Client { - return rs.ClientWithDatastore(context.Background(), p, dssync.MutexWrap(ds.NewMapDatastore())) -} - -func (rs *s) ClientWithDatastore(_ context.Context, p testutil.Identity, datastore ds.Datastore) Client { - return &client{ - peer: p, - vs: offline.NewOfflineRouter(datastore, MockValidator{}), - server: rs, - } -} diff --git a/vendor/github.com/ipfs/go-ipfs-routing/mock/interface.go b/vendor/github.com/ipfs/go-ipfs-routing/mock/interface.go deleted file mode 100644 index 5d4e9f9a..00000000 --- a/vendor/github.com/ipfs/go-ipfs-routing/mock/interface.go +++ /dev/null @@ -1,59 +0,0 @@ -// Package mockrouting provides a virtual routing server. To use it, -// create a virtual routing server and use the Client() method to get a -// routing client (IpfsRouting). The server quacks like a DHT but is -// really a local in-memory hash table. -package mockrouting - -import ( - "context" - - ds "github.com/ipfs/go-datastore" - delay "github.com/ipfs/go-ipfs-delay" - peer "github.com/libp2p/go-libp2p-peer" - routing "github.com/libp2p/go-libp2p-routing" - "github.com/libp2p/go-testutil" -) - -// MockValidator is a record validator that always returns success. -type MockValidator struct{} - -func (MockValidator) Validate(_ string, _ []byte) error { return nil } -func (MockValidator) Select(_ string, _ [][]byte) (int, error) { return 0, nil } - -// Server provides mockrouting Clients -type Server interface { - Client(p testutil.Identity) Client - ClientWithDatastore(context.Context, testutil.Identity, ds.Datastore) Client -} - -// Client implements IpfsRouting -type Client interface { - routing.IpfsRouting -} - -// NewServer returns a mockrouting Server -func NewServer() Server { - return NewServerWithDelay(DelayConfig{ - ValueVisibility: delay.Fixed(0), - Query: delay.Fixed(0), - }) -} - -// NewServerWithDelay returns a mockrouting Server with a delay! -func NewServerWithDelay(conf DelayConfig) Server { - return &s{ - providers: make(map[string]map[peer.ID]providerRecord), - delayConf: conf, - } -} - -// DelayConfig can be used to configured the fake delays of a mock server. -// Use with NewServerWithDelay(). -type DelayConfig struct { - // ValueVisibility is the time it takes for a value to be visible in the network - // FIXME there _must_ be a better term for this - ValueVisibility delay.D - - // Query is the time it takes to receive a response from a routing query - Query delay.D -} diff --git a/vendor/github.com/ipfs/go-ipfs-routing/none/none_client.go b/vendor/github.com/ipfs/go-ipfs-routing/none/none_client.go index 45febc55..9604ab07 100644 --- a/vendor/github.com/ipfs/go-ipfs-routing/none/none_client.go +++ b/vendor/github.com/ipfs/go-ipfs-routing/none/none_client.go @@ -7,35 +7,35 @@ import ( cid "github.com/ipfs/go-cid" ds "github.com/ipfs/go-datastore" - p2phost "github.com/libp2p/go-libp2p-host" - peer "github.com/libp2p/go-libp2p-peer" - pstore "github.com/libp2p/go-libp2p-peerstore" + + "github.com/libp2p/go-libp2p-core/host" + "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p-core/routing" + record "github.com/libp2p/go-libp2p-record" - routing "github.com/libp2p/go-libp2p-routing" - ropts "github.com/libp2p/go-libp2p-routing/options" ) type nilclient struct { } -func (c *nilclient) PutValue(_ context.Context, _ string, _ []byte, _ ...ropts.Option) error { +func (c *nilclient) PutValue(_ context.Context, _ string, _ []byte, _ ...routing.Option) error { return nil } -func (c *nilclient) GetValue(_ context.Context, _ string, _ ...ropts.Option) ([]byte, error) { +func (c *nilclient) GetValue(_ context.Context, _ string, _ ...routing.Option) ([]byte, error) { return nil, errors.New("tried GetValue from nil routing") } -func (c *nilclient) SearchValue(_ context.Context, _ string, _ ...ropts.Option) (<-chan []byte, error) { +func (c *nilclient) SearchValue(_ context.Context, _ string, _ ...routing.Option) (<-chan []byte, error) { return nil, errors.New("tried SearchValue from nil routing") } -func (c *nilclient) FindPeer(_ context.Context, _ peer.ID) (pstore.PeerInfo, error) { - return pstore.PeerInfo{}, nil +func (c *nilclient) FindPeer(_ context.Context, _ peer.ID) (peer.AddrInfo, error) { + return peer.AddrInfo{}, nil } -func (c *nilclient) FindProvidersAsync(_ context.Context, _ cid.Cid, _ int) <-chan pstore.PeerInfo { - out := make(chan pstore.PeerInfo) +func (c *nilclient) FindProvidersAsync(_ context.Context, _ cid.Cid, _ int) <-chan peer.AddrInfo { + out := make(chan peer.AddrInfo) defer close(out) return out } @@ -48,10 +48,10 @@ func (c *nilclient) Bootstrap(_ context.Context) error { return nil } -// ConstructNilRouting creates an IpfsRouting client which does nothing. -func ConstructNilRouting(_ context.Context, _ p2phost.Host, _ ds.Batching, _ record.Validator) (routing.IpfsRouting, error) { +// ConstructNilRouting creates an Routing client which does nothing. +func ConstructNilRouting(_ context.Context, _ host.Host, _ ds.Batching, _ record.Validator) (routing.Routing, error) { return &nilclient{}, nil } // ensure nilclient satisfies interface -var _ routing.IpfsRouting = &nilclient{} +var _ routing.Routing = &nilclient{} diff --git a/vendor/github.com/ipfs/go-ipfs-routing/offline/offline.go b/vendor/github.com/ipfs/go-ipfs-routing/offline/offline.go index 1627490c..c76f9209 100644 --- a/vendor/github.com/ipfs/go-ipfs-routing/offline/offline.go +++ b/vendor/github.com/ipfs/go-ipfs-routing/offline/offline.go @@ -1,4 +1,4 @@ -// Package offline implements IpfsRouting with a client which +// Package offline implements Routing with a client which // is only able to perform offline operations. package offline @@ -12,29 +12,29 @@ import ( cid "github.com/ipfs/go-cid" ds "github.com/ipfs/go-datastore" dshelp "github.com/ipfs/go-ipfs-ds-help" - "github.com/libp2p/go-libp2p-peer" - pstore "github.com/libp2p/go-libp2p-peerstore" + + "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p-core/routing" + record "github.com/libp2p/go-libp2p-record" pb "github.com/libp2p/go-libp2p-record/pb" - routing "github.com/libp2p/go-libp2p-routing" - ropts "github.com/libp2p/go-libp2p-routing/options" ) // ErrOffline is returned when trying to perform operations that // require connectivity. var ErrOffline = errors.New("routing system in offline mode") -// NewOfflineRouter returns an IpfsRouting implementation which only performs +// NewOfflineRouter returns an Routing implementation which only performs // offline operations. It allows to Put and Get signed dht // records to and from the local datastore. -func NewOfflineRouter(dstore ds.Datastore, validator record.Validator) routing.IpfsRouting { +func NewOfflineRouter(dstore ds.Datastore, validator record.Validator) routing.Routing { return &offlineRouting{ datastore: dstore, validator: validator, } } -// offlineRouting implements the IpfsRouting interface, +// offlineRouting implements the Routing interface, // but only provides the capability to Put and Get signed dht // records to and from the local datastore. type offlineRouting struct { @@ -42,7 +42,7 @@ type offlineRouting struct { validator record.Validator } -func (c *offlineRouting) PutValue(ctx context.Context, key string, val []byte, _ ...ropts.Option) error { +func (c *offlineRouting) PutValue(ctx context.Context, key string, val []byte, _ ...routing.Option) error { if err := c.validator.Validate(key, val); err != nil { return err } @@ -70,7 +70,7 @@ func (c *offlineRouting) PutValue(ctx context.Context, key string, val []byte, _ return c.datastore.Put(dshelp.NewKeyFromBinary([]byte(key)), data) } -func (c *offlineRouting) GetValue(ctx context.Context, key string, _ ...ropts.Option) ([]byte, error) { +func (c *offlineRouting) GetValue(ctx context.Context, key string, _ ...routing.Option) ([]byte, error) { buf, err := c.datastore.Get(dshelp.NewKeyFromBinary([]byte(key))) if err != nil { return nil, err @@ -90,7 +90,7 @@ func (c *offlineRouting) GetValue(ctx context.Context, key string, _ ...ropts.Op return val, nil } -func (c *offlineRouting) SearchValue(ctx context.Context, key string, _ ...ropts.Option) (<-chan []byte, error) { +func (c *offlineRouting) SearchValue(ctx context.Context, key string, _ ...routing.Option) (<-chan []byte, error) { out := make(chan []byte, 1) go func() { defer close(out) @@ -102,12 +102,12 @@ func (c *offlineRouting) SearchValue(ctx context.Context, key string, _ ...ropts return out, nil } -func (c *offlineRouting) FindPeer(ctx context.Context, pid peer.ID) (pstore.PeerInfo, error) { - return pstore.PeerInfo{}, ErrOffline +func (c *offlineRouting) FindPeer(ctx context.Context, pid peer.ID) (peer.AddrInfo, error) { + return peer.AddrInfo{}, ErrOffline } -func (c *offlineRouting) FindProvidersAsync(ctx context.Context, k cid.Cid, max int) <-chan pstore.PeerInfo { - out := make(chan pstore.PeerInfo) +func (c *offlineRouting) FindProvidersAsync(ctx context.Context, k cid.Cid, max int) <-chan peer.AddrInfo { + out := make(chan peer.AddrInfo) close(out) return out } @@ -124,5 +124,5 @@ func (c *offlineRouting) Bootstrap(context.Context) error { return nil } -// ensure offlineRouting matches the IpfsRouting interface -var _ routing.IpfsRouting = &offlineRouting{} +// ensure offlineRouting matches the Routing interface +var _ routing.Routing = &offlineRouting{} diff --git a/vendor/github.com/ipfs/go-ipfs/.gitignore b/vendor/github.com/ipfs/go-ipfs/.gitignore index 9ead6675..f96cb84b 100644 --- a/vendor/github.com/ipfs/go-ipfs/.gitignore +++ b/vendor/github.com/ipfs/go-ipfs/.gitignore @@ -15,6 +15,7 @@ gx-workspace-update.json .ipfs bin/gx +bin/protoc-* bin/gx* bin/tmp bin/gocovmerge diff --git a/vendor/github.com/ipfs/go-ipfs/CHANGELOG.md b/vendor/github.com/ipfs/go-ipfs/CHANGELOG.md index f958515c..c6f2f085 100644 --- a/vendor/github.com/ipfs/go-ipfs/CHANGELOG.md +++ b/vendor/github.com/ipfs/go-ipfs/CHANGELOG.md @@ -1,5 +1,604 @@ # go-ipfs changelog +## 0.4.21 2019-05-30 + +We're happy to announce go-ipfs 0.4.21. This release has some critical bug fixes +and a handful of new features so every user should upgrade. + +Key bug fixes: + +* Too many open file descriptors/too many peers + ([#6237](https://github.com/ipfs/go-ipfs/issues/6237)). +* Adding multiple files at the same time doesn't work + ([#6254](https://github.com/ipfs/go-ipfs/pull/6255)). +* CPU utilization spikes and then holds at 100% + ([#5613](https://github.com/ipfs/go-ipfs/issues/5613)). + +Key features: + +* Experimental TLS1.3 support (to eventually replace secio). +* OpenSSL support for SECIO handshakes (performance improvement). + +**IMPORTANT:** This release fixes a bug in our security transport that could +potentially drop data from the channel. Note: This issue affects neither the +privacy nor the integrity of the data with respect to a third-party attacker. +Only the peer sending us data could trigger this bug. + +**ALL USERS MUST UPGRADE.** We intended to introduce a feature this release that, +unfortunately, [reliably triggered this bug][secio-bug]. To avoid partitioning +the network, we've decided to postpone this feature for a release or two. + +Specifically, we're going to provide a minimum _one month_ upgrade period. After +that, we'll start testing the impact of deploying the proposed changes. + +If you're running the mainline go-ipfs, please upgrade ASAP. If you're building +a separate app or working on a forked go-ipfs, make sure to upgrade +github.com/libp2p/go-libp2p-secio to _at least_ v0.0.3. + +[secio-bug]: https://github.com/libp2p/go-libp2p/issues/644 + +### Contributors + +First off, we'd like to give a shout-out to all contributors that participated +in this release (including contributions to ipld, libp2p, and multiformats): + +| Contributor | Commits | Lines ± | Files Changed | +|----------------------------|---------|-------------|---------------| +| Steven Allen | 220 | +6078/-4211 | 520 | +| Łukasz Magiera | 53 | +5039/-4557 | 274 | +| vyzo | 179 | +2929/-1704 | 238 | +| Raúl Kripalani | 44 | +757/-1895 | 134 | +| hannahhoward | 11 | +755/-1005 | 49 | +| Marten Seemann | 16 | +862/-203 | 44 | +| keks | 10 | +359/-110 | 12 | +| Jan Winkelmann | 8 | +368/-26 | 16 | +| Jakub Sztandera | 4 | +361/-8 | 7 | +| Adrian Lanzafame | 1 | +287/-18 | 5 | +| Erik Ingenito | 4 | +247/-28 | 8 | +| Reid 'arrdem' McKenzie | 1 | +220/-20 | 3 | +| Yusef Napora | 26 | +98/-130 | 26 | +| Michael Avila | 3 | +116/-59 | 8 | +| Raghav Gulati | 13 | +145/-26 | 13 | +| tg | 1 | +41/-33 | 1 | +| Matt Joiner | 6 | +41/-30 | 7 | +| Cole Brown | 1 | +37/-25 | 1 | +| Dominic Della Valle | 2 | +12/-40 | 4 | +| Overbool | 1 | +50/-0 | 2 | +| Christopher Buesser | 3 | +29/-16 | 10 | +| myself659 | 1 | +38/-5 | 2 | +| Alex Browne | 3 | +30/-8 | 3 | +| jmank88 | 1 | +27/-4 | 2 | +| Vikram | 1 | +25/-1 | 2 | +| MollyM | 7 | +17/-9 | 7 | +| Marcin Rataj | 1 | +17/-1 | 1 | +| requilence | 1 | +11/-4 | 1 | +| Teran McKinney | 1 | +8/-2 | 1 | +| Oli Evans | 1 | +5/-5 | 1 | +| Masashi Salvador Mitsuzawa | 1 | +5/-1 | 1 | +| chenminjian | 1 | +4/-0 | 1 | +| Edgar Lee | 1 | +3/-1 | 1 | +| Dirk McCormick | 1 | +2/-2 | 2 | +| ia | 1 | +1/-1 | 1 | +| Alan Shaw | 1 | +1/-1 | 1 | + +### Bug Fixes And Enhancements + +This release includes quite a number of critical bug fixes and +performance/reliability enhancements. + +#### Error when adding multiple files + +The last release broke the simple command `ipfs add file1 file2`. It turns out +we simply lacked a test case for this. Both of these issues (the bug and the +lack of a test case) have now been fixed. + +#### SECIO + +As noted above, we've fixed a bug that could cause data to be dropped from a +SECIO connection on read. Specifically, this happens when: + +1. The capacity of the read buffer is greater than the length. +2. The remote peer sent more than the length but less than the capacity in a + single secio "frame". + +In this case, we'd fill the read buffer to it's capacity instead of its length. + +#### Too many open files, too many peers, etc. + +Go-ipfs automatically closes the least useful connections when it accumulates +too many connections. Unfortunately, some relayed connections were blocking in +`Close()`, halting the entire process. + +#### Out of control CPU usage + +Many users noted out of control CPU usage this release. This turned out to be a +long-standing issue with how the DHT handled provider records (records recording +which peers have what content): + +1. It wasn't removing provider records for content until the set of providers + completely emptied. +2. It was loading every provider record into memory whenever we updated the set + of providers. + +Combined, these two issues were trashing the provider record cache, forcing the +DHT to repeatedly load and discard provider records. + +#### More Reliable Connection Management + +Go-ipfs has a subsystem called the "connection manager" to close the +least-useful connections when go-ipfs runs low on resources. + +Unfortunately, other IPFS subsystems may learn about connections _before_ the +connection manager. Previously, if some IPFS subsystem tried to mark a +connection as useful before the connection manager learned about it, the +connection manager would discard this information. We believe this was causing +[#6271](https://github.com/ipfs/go-ipfs/issues/6271). [It no longer does +that](https://github.com/libp2p/go-libp2p-connmgr/pull/39). + +#### Improved Bitswap Connection Management + +Bitswap now uses the connection manager to mark all peers downloading blocks as +important (while downloading). Previously, it only marked peers from which _it_ +was downloading blocks. + +#### Reduced Memory Usage + +The most noticeable memory reduction in this release comes from fixing connection +closing. However, we've made a few additional improvements: + +* Bitswap's "work queue" no longer remembers every peer it has seen + indefinitely. +* The peerstore now interns protocol names. +* The per-peer goroutine count has been reduced. +* The DHT now wastes less memory on idle peers by pooling buffered writers and + returning them to the pool when not actively using them. + +#### Increased File Descriptor Limit + +The default file descriptor limit has been raised to 8192 (from 2048). +Unfortunately, go-ipfs behaves poorly when it runs out of file descriptors and +it uses a _lot_ of file descriptors. + +Luckily, most modern kernels can handle thousands of file descriptors without +any difficulty. + +#### Decreased Connection Handshake Latency + +Libp2p now shaves off a couple of round trips when initiating connections by +beginning the protocol negotiation before the remote peer responds to the +initial handshake message. + +In the optimal case (when the target peer speaks our preferred protocol), this +reduces the number of handshake round-trips from 6 to 4 (including the TCP +handshake). + +### Commands + +This release brings no new commands but does introduce a few changes, bugfixes, +and enhancements. This section is hardly complete but it lists the most +noticeable changes. + +Take note: this release also introduces a few breaking changes. + +#### [DEPRECATION] The URLStore Command Deprecated + +The experimental `ipfs urlstore` command is now deprecated. Please use `ipfs add +--nocopy URL` instead. + +#### [BREAKING] The DHT Command Base64 Encodes Values + +When responding to an `ipfs dht get` command, the daemon now encodes the +returned value using base64. The `ipfs` command will automatically decode this +value before returning it to the user so this change should only affect those +using the HTTP API directly. + +Unfortunately, this change was necessary as DHT records are arbitrary binary +blobs which can't be directly stored in JSON strings. + +#### [BREAKING] Base32 Encoded v1 CIDs By Default + +Both js-ipfs and go-ipfs now encode CIDv1 CIDs using base32 by default, instead +of base58. Unfortunately, base58 is case-sensitive and doesn't play well with +browsers (see [#4143](https://github.com/ipfs/go-ipfs/issues/4143). + +#### Human Readable Numbers + +The `ipfs bitswap stat` and and `ipfs object stat` commands now support a +`--humanize` flag that formats numbers with human-readable units (GiB, MiB, +etc.). + +#### Improved Errors + +This release improves two types of errors: + +1. Commands that take paths/multiaddrs now include the path/multiaddr in the + error message when it fails to parse. +2. `ipfs swarm connect` now returns a detailed error describing which addresses + were tried and why the dial failed. + +#### Ping Improvements + +The ping command has received some small improvements and fixes: + +1. It now exits with a non-zero exit status on failure. +2. It no longer succeeds with zero successful pings if we have a zombie but + non-functional connection to the peer being pinged + ([#6298](https://github.com/ipfs/go-ipfs/issues/6298)). +3. It now prints out the average latency when canceled with `^C` (like the unix + `ping` command). + +#### Improved Help Text + +Go-ipfs now intelligently wraps help text for easier reading. On an 80 character +wide terminal, + +**Before** + +``` +USAGE + ipfs add ... - Add a file or directory to ipfs. + +SYNOPSIS + ipfs add [--recursive | -r] [--dereference-args] [--stdin-name=] [ +--hidden | -H] [--quiet | -q] [--quieter | -Q] [--silent] [--progress | -p] [--t +rickle | -t] [--only-hash | -n] [--wrap-with-directory | -w] [--chunker= | -s] [--pin=false] [--raw-leaves] [--nocopy] [--fscache] [--cid-version=] [--hash=] [--inline] [--inline-limit=] [--] +... + +ARGUMENTS + + ... - The path to a file to be added to ipfs. + +OPTIONS + + -r, --recursive bool - Add directory paths recursive +ly. + --dereference-args bool - Symlinks supplied in argument +s are dereferenced. + --stdin-name string - Assign a name if the file sou +rce is stdin. + -H, --hidden bool - Include files that are hidden +. Only takes effect on recursive add. + -q, --quiet bool - Write minimal output. + -Q, --quieter bool - Write only final hash. + --silent bool - Write no output. + -p, --progress bool - Stream progress data. + -t, --trickle bool - Use trickle-dag format for da +g generation. + -n, --only-hash bool - Only chunk and hash - do not +write to disk. + -w, --wrap-with-directory bool - Wrap files with a directory o +bject. + -s, --chunker string - Chunking algorithm, size-[byt +es] or rabin-[min]-[avg]-[max]. Default: size-262144. + --pin bool - Pin this object when adding. +Default: true. + --raw-leaves bool - Use raw blocks for leaf nodes +. (experimental). + --nocopy bool - Add the file using filestore. + Implies raw-leaves. (experimental). + --fscache bool - Check the filestore for pre-e +xisting blocks. (experimental). + --cid-version int - CID version. Defaults to 0 un +less an option that depends on CIDv1 is passed. (experimental). + --hash string - Hash function to use. Implies + CIDv1 if not sha2-256. (experimental). Default: sha2-256. + --inline bool - Inline small blocks into CIDs +. (experimental). + --inline-limit int - Maximum block size to inline. + (experimental). Default: 32. + +``` + + +**After** + +``` +USAGE + ipfs add ... - Add a file or directory to ipfs. + +SYNOPSIS + ipfs add [--recursive | -r] [--dereference-args] [--stdin-name=] + [--hidden | -H] [--quiet | -q] [--quieter | -Q] [--silent] + [--progress | -p] [--trickle | -t] [--only-hash | -n] + [--wrap-with-directory | -w] [--chunker= | -s] [--pin=false] + [--raw-leaves] [--nocopy] [--fscache] [--cid-version=] + [--hash=] [--inline] [--inline-limit=] [--] + ... + +ARGUMENTS + + ... - The path to a file to be added to ipfs. + +OPTIONS + + -r, --recursive bool - Add directory paths recursively. + --dereference-args bool - Symlinks supplied in arguments are + dereferenced. + --stdin-name string - Assign a name if the file source is stdin. + -H, --hidden bool - Include files that are hidden. Only takes + effect on recursive add. + -q, --quiet bool - Write minimal output. + -Q, --quieter bool - Write only final hash. + --silent bool - Write no output. + -p, --progress bool - Stream progress data. + -t, --trickle bool - Use trickle-dag format for dag generation. + -n, --only-hash bool - Only chunk and hash - do not write to + disk. + -w, --wrap-with-directory bool - Wrap files with a directory object. + -s, --chunker string - Chunking algorithm, size-[bytes] or + rabin-[min]-[avg]-[max]. Default: + size-262144. + --pin bool - Pin this object when adding. Default: + true. + --raw-leaves bool - Use raw blocks for leaf nodes. + (experimental). + --nocopy bool - Add the file using filestore. Implies + raw-leaves. (experimental). + --fscache bool - Check the filestore for pre-existing + blocks. (experimental). + --cid-version int - CID version. Defaults to 0 unless an + option that depends on CIDv1 is passed. + (experimental). + --hash string - Hash function to use. Implies CIDv1 if + not sha2-256. (experimental). Default: + sha2-256. + --inline bool - Inline small blocks into CIDs. + (experimental). + --inline-limit int - Maximum block size to inline. + (experimental). Default: 32. +``` + +### Features + +This release is primarily a bug fix release but it still includes two nice +features from libp2p. + +#### Experimental TLS1.3 support + +Go-ipfs now has experimental TLS1.3 support. Currently, libp2p (IPFS's +networking library) uses a custom TLS-like protocol we call SECIO. However, the +conventional wisdom concerning custom security transports is "just don't" so we +are working on replacing it with TLS1.3 + +To choose this protocol by default, set the `Experimental.PreferTLS` config +variable: + +```bash +> ipfs config --bool Experimental.PreferTLS true +``` + +Why TLS1.3 and not X (noise, etc.)? + +1. Libp2p allows negotiating transports so there's no reason not to add noise + support to libp2p as well. +2. TLS has wide language support which should make implementing libp2p for new + languages significantly simpler. + +#### OpenSSL Support + +Go-ipfs can now (optionally) be built with OpenSSL support for improved +performance when establishing connections. This is primarily useful for nodes +receiving multiple inbound connections per second. + +To enable openssl support, rebuild go-ipfs with: + +```bash +> make build GOFLAGS=-tags=openssl +``` + +### CoreAPI + +The CoreAPI refactor is still underway and we've made significant progress +towards a usable ipfs-as-a-library constructor. Specifically, we've integrated +the [fx](https://go.uber.org/fx) dependency injection system and are +now working on cleaning up our initialization logic. This should make it easier +to inject new services into a go-ipfs process without messing with the core +internals. + +### Build: `GOCC` Environment Variable + +Build system now uses `GOCC` environment variable allowing for use of specific +go versions during builds. + +### Changelog + +- github.com/ipfs/go-ipfs: + - fix: use http.Error for sending errors ([ipfs/go-ipfs#6379](https://github.com/ipfs/go-ipfs/pull/6379)) + - core: call app.Stop once ([ipfs/go-ipfs#6380](https://github.com/ipfs/go-ipfs/pull/6380)) + - explain what dhtclient does ([ipfs/go-ipfs#6375](https://github.com/ipfs/go-ipfs/pull/6375)) + - ci: actually enable golangci-lint ([ipfs/go-ipfs#6362](https://github.com/ipfs/go-ipfs/pull/6362)) + - commands/swarm(fix): handle empty multiaddrs ([ipfs/go-ipfs#6355](https://github.com/ipfs/go-ipfs/pull/6355)) + - feat: improve errors when a path fails to parse ([ipfs/go-ipfs#6346](https://github.com/ipfs/go-ipfs/pull/6346)) + - fix vendoring dependencies when building the source tarball ([ipfs/go-ipfs#6349](https://github.com/ipfs/go-ipfs/pull/6349)) + - core: Use correct default for connmgr lowWater ([ipfs/go-ipfs#6352](https://github.com/ipfs/go-ipfs/pull/6352)) + - doc: remove out of date documentation ([ipfs/go-ipfs#6345](https://github.com/ipfs/go-ipfs/pull/6345)) + - Add generation of dependency changes to mkreleaselog ([ipfs/go-ipfs#6348](https://github.com/ipfs/go-ipfs/pull/6348)) + - readme: remove mention of DCO ([ipfs/go-ipfs#6344](https://github.com/ipfs/go-ipfs/pull/6344)) + - Add golangci-lint ([ipfs/go-ipfs#6321](https://github.com/ipfs/go-ipfs/pull/6321)) + - docs+mk: update guidance for unsupported platforms ([ipfs/go-ipfs#6338](https://github.com/ipfs/go-ipfs/pull/6338)) + - fix formatting in object get ([ipfs/go-ipfs#6340](https://github.com/ipfs/go-ipfs/pull/6340)) + - fail start when loading a plugin fails ([ipfs/go-ipfs#6339](https://github.com/ipfs/go-ipfs/pull/6339)) + - fix a typo in the issue template ([ipfs/go-ipfs#6335](https://github.com/ipfs/go-ipfs/pull/6335)) + - github: turn issue template into a multiple-choice question ([ipfs/go-ipfs#6333](https://github.com/ipfs/go-ipfs/pull/6333)) + - object put: Allow empty objects ([ipfs/go-ipfs#6330](https://github.com/ipfs/go-ipfs/pull/6330)) + - Update fuse.md ([ipfs/go-ipfs#6332](https://github.com/ipfs/go-ipfs/pull/6332)) + - work towards fixing dht commands ([ipfs/go-ipfs#6277](https://github.com/ipfs/go-ipfs/pull/6277)) + - fix setting ulimit ([ipfs/go-ipfs#6319](https://github.com/ipfs/go-ipfs/pull/6319)) + - switch to base32 by default for CIDv1 ([ipfs/go-ipfs#6300](https://github.com/ipfs/go-ipfs/pull/6300)) + - cmdkit -> cmds ([ipfs/go-ipfs#6318](https://github.com/ipfs/go-ipfs/pull/6318)) + - raise default fd limit to 8192 ([ipfs/go-ipfs#6266](https://github.com/ipfs/go-ipfs/pull/6266)) + - pin: don't walk all pinned blocks when removing a non-existent pin ([ipfs/go-ipfs#6311](https://github.com/ipfs/go-ipfs/pull/6311)) + - ping: fix a bunch of issues ([ipfs/go-ipfs#6312](https://github.com/ipfs/go-ipfs/pull/6312)) + - test(coreapi): use a thread-safe datastore everywhere ([ipfs/go-ipfs#6222](https://github.com/ipfs/go-ipfs/pull/6222)) + - fix(Dockerfile): Allow ipfs mount in Docker container ([ipfs/go-ipfs#5560](https://github.com/ipfs/go-ipfs/pull/5560)) + - docs: fix Routing section ([ipfs/go-ipfs#6309](https://github.com/ipfs/go-ipfs/pull/6309)) + - License update to dual MIT and Apache 2 ([ipfs/go-ipfs#6301](https://github.com/ipfs/go-ipfs/pull/6301)) + - Go test fix ([ipfs/go-ipfs#6293](https://github.com/ipfs/go-ipfs/pull/6293)) + - commands(pin update): return resolved CIDs instead of paths ([ipfs/go-ipfs#6275](https://github.com/ipfs/go-ipfs/pull/6275)) + - core: fix autonat construction ([ipfs/go-ipfs#6289](https://github.com/ipfs/go-ipfs/pull/6289)) + - Test and fix GC/pin bug ([ipfs/go-ipfs#6288](https://github.com/ipfs/go-ipfs/pull/6288)) + - GOCC implementation & fix in make & build scripts ([ipfs/go-ipfs#6282](https://github.com/ipfs/go-ipfs/pull/6282)) + - gc: cancel context ([ipfs/go-ipfs#6281](https://github.com/ipfs/go-ipfs/pull/6281)) + - fix: windows friendly daemon help ([ipfs/go-ipfs#6278](https://github.com/ipfs/go-ipfs/pull/6278)) + - Invert constructor config handling ([ipfs/go-ipfs#6276](https://github.com/ipfs/go-ipfs/pull/6276)) + - docs: document environment variables ([ipfs/go-ipfs#6268](https://github.com/ipfs/go-ipfs/pull/6268)) + - add: Return error from iterator ([ipfs/go-ipfs#6272](https://github.com/ipfs/go-ipfs/pull/6272)) + - commands(feat): use the coreapi in the urlstore command ([ipfs/go-ipfs#6259](https://github.com/ipfs/go-ipfs/pull/6259)) + - humanize for ipfs bitswap stat ([ipfs/go-ipfs#6258](https://github.com/ipfs/go-ipfs/pull/6258)) + - Revert "raise default fd limit to 8192" ([ipfs/go-ipfs#6265](https://github.com/ipfs/go-ipfs/pull/6265)) + - raise default fd limit to 8192 ([ipfs/go-ipfs#6261](https://github.com/ipfs/go-ipfs/pull/6261)) + - Fix AutoNAT service for private network ([ipfs/go-ipfs#6251](https://github.com/ipfs/go-ipfs/pull/6251)) + - add: Fix adding multiple files ([ipfs/go-ipfs#6255](https://github.com/ipfs/go-ipfs/pull/6255)) + - reprovider: Use goprocess ([ipfs/go-ipfs#6248](https://github.com/ipfs/go-ipfs/pull/6248)) + - core/corehttp/gateway_handler: pass a request ctx instead of the node ([ipfs/go-ipfs#6244](https://github.com/ipfs/go-ipfs/pull/6244)) + - constructor: cleanup some things ([ipfs/go-ipfs#6246](https://github.com/ipfs/go-ipfs/pull/6246)) + - Support --human flag in cmd/object-stat ([ipfs/go-ipfs#6241](https://github.com/ipfs/go-ipfs/pull/6241)) + - build: fix macos build with fuse ([ipfs/go-ipfs#6235](https://github.com/ipfs/go-ipfs/pull/6235)) + - add an experiment to prefer TLS 1.3 over secio ([ipfs/go-ipfs#6229](https://github.com/ipfs/go-ipfs/pull/6229)) + - fix two small nits in the go-ipfs constructor ([ipfs/go-ipfs#6234](https://github.com/ipfs/go-ipfs/pull/6234)) + - DI-based core.NewNode ([ipfs/go-ipfs#6162](https://github.com/ipfs/go-ipfs/pull/6162)) + - coreapi: Drop error from ParsePath ([ipfs/go-ipfs#6122](https://github.com/ipfs/go-ipfs/pull/6122)) + - fix the wrong path configuration in root redirection ([ipfs/go-ipfs#6215](https://github.com/ipfs/go-ipfs/pull/6215)) +- github.com/ipfs/go-bitswap (v0.0.4 -> v0.0.7): + - feat(engine): tag peers with requests ([ipfs/go-bitswap#128](https://github.com/ipfs/go-bitswap/pull/128)) + - fix(network): add mutex to avoid data race ([ipfs/go-bitswap#127](https://github.com/ipfs/go-bitswap/pull/127)) + - Change bitswap provide toggle to not be static ([ipfs/go-bitswap#124](https://github.com/ipfs/go-bitswap/pull/124)) + - Use shared peer task queue with Graphsync ([ipfs/go-bitswap#119](https://github.com/ipfs/go-bitswap/pull/119)) + - Add missing godoc comments, refactor to avoid confusion ([ipfs/go-bitswap#117](https://github.com/ipfs/go-bitswap/pull/117)) + - fix(decision): cleanup request queues ([ipfs/go-bitswap#116](https://github.com/ipfs/go-bitswap/pull/116)) + - Control provider workers with experiment flag ([ipfs/go-bitswap#110](https://github.com/ipfs/go-bitswap/pull/110)) + - connmgr: give peers more weight when actively participating in a session ([ipfs/go-bitswap#111](https://github.com/ipfs/go-bitswap/pull/111)) + - make the WantlistManager own the PeerHandler ([ipfs/go-bitswap#78](https://github.com/ipfs/go-bitswap/pull/78)) + - remove IPFS_LOW_MEM flag support ([ipfs/go-bitswap#115](https://github.com/ipfs/go-bitswap/pull/115)) +- github.com/ipfs/go-cid (v0.0.1 -> v0.0.2): + - default cidv1 to base32 ([ipfs/go-cid#85](https://github.com/ipfs/go-cid/pull/85)) +- github.com/ipfs/go-cidutil (v0.0.1 -> v0.0.2): + - default cidv1 to base32 ([ipfs/go-cidutil#13](https://github.com/ipfs/go-cidutil/pull/13)) +- github.com/ipfs/go-datastore (v0.0.3 -> v0.0.5): + - MapDatastore: obey KeysOnly ([ipfs/go-datastore#130](https://github.com/ipfs/go-datastore/pull/130)) + - fix the keytransform datastore's query implementation ([ipfs/go-datastore#127](https://github.com/ipfs/go-datastore/pull/127)) + - sync: apply entire query while locked ([ipfs/go-datastore#129](https://github.com/ipfs/go-datastore/pull/129)) + - filter: values are now always bytes ([ipfs/go-datastore#126](https://github.com/ipfs/go-datastore/pull/126)) + - autobatch: batch deletes ([ipfs/go-datastore#128](https://github.com/ipfs/go-datastore/pull/128)) +- github.com/ipfs/go-ipfs-cmds (v0.0.5 -> v0.0.8): + - fix: use golang's http.Error to send errors ([ipfs/go-ipfs-cmds#167](https://github.com/ipfs/go-ipfs-cmds/pull/167)) + - improve help text on narrow terminals ([ipfs/go-ipfs-cmds#140](https://github.com/ipfs/go-ipfs-cmds/pull/140)) + - chore: remove an old hack ([ipfs/go-ipfs-cmds#165](https://github.com/ipfs/go-ipfs-cmds/pull/165)) + - http: use the request context ([ipfs/go-ipfs-cmds#163](https://github.com/ipfs/go-ipfs-cmds/pull/163)) + - merge in go-ipfs-cmdkit ([ipfs/go-ipfs-cmds#164](https://github.com/ipfs/go-ipfs-cmds/pull/164)) + - fix: return the correct error ([ipfs/go-ipfs-cmds#162](https://github.com/ipfs/go-ipfs-cmds/pull/162)) +- github.com/ipfs/go-ipfs-config (v0.0.1 -> v0.0.3): + - Closes: #6284 Add appropriate IPv6 ranges to defaultServerFilters ([ipfs/go-ipfs-config#34](https://github.com/ipfs/go-ipfs-config/pull/34)) + - add an experiment to prefer TLS 1.3 over secio ([ipfs/go-ipfs-config#32](https://github.com/ipfs/go-ipfs-config/pull/32)) +- github.com/ipfs/go-ipfs-files (v0.0.2 -> v0.0.3): + - webfile: make Size() work before Read ([ipfs/go-ipfs-files#18](https://github.com/ipfs/go-ipfs-files/pull/18)) + - check http status code during WebFile reads and return error for non-2XX ([ipfs/go-ipfs-files#17](https://github.com/ipfs/go-ipfs-files/pull/17)) +- github.com/ipfs/go-ipld-cbor (v0.0.1 -> v0.0.2): + - switch to base32 by default ([ipfs/go-ipld-cbor#62](https://github.com/ipfs/go-ipld-cbor/pull/62)) +- github.com/ipfs/go-ipld-git (v0.0.1 -> v0.0.2): + - switch to base32 by default ([ipfs/go-ipld-git#40](https://github.com/ipfs/go-ipld-git/pull/40)) +- github.com/ipfs/go-mfs (v0.0.4 -> v0.0.7): + - Fix directory mv and add tests ([ipfs/go-mfs#76](https://github.com/ipfs/go-mfs/pull/76)) + - fix: not remove file by mistakes ([ipfs/go-mfs#73](https://github.com/ipfs/go-mfs/pull/73)) +- github.com/ipfs/go-path (v0.0.3 -> v0.0.4): + - include the path in path errors ([ipfs/go-path#28](https://github.com/ipfs/go-path/pull/28)) +- github.com/ipfs/go-unixfs (v0.0.4 -> v0.0.6): + - chore: remove URL field ([ipfs/go-unixfs#72](https://github.com/ipfs/go-unixfs/pull/72)) +- github.com/ipfs/interface-go-ipfs-core (v0.0.6 -> v0.0.8): + - switch to base32 cidv1 by default ([ipfs/interface-go-ipfs-core#29](https://github.com/ipfs/interface-go-ipfs-core/pull/29)) + - path: drop error from ParsePath ([ipfs/interface-go-ipfs-core#22](https://github.com/ipfs/interface-go-ipfs-core/pull/22)) + - tests: fix a bunch of small test lints/issues ([ipfs/interface-go-ipfs-core#28](https://github.com/ipfs/interface-go-ipfs-core/pull/28)) + - Update Pin.RmRecursive docs to clarify shared indirect pins are not removed ([ipfs/interface-go-ipfs-core#26](https://github.com/ipfs/interface-go-ipfs-core/pull/26)) +- github.com/libp2p/go-buffer-pool (v0.0.1 -> v0.0.2): + - feat: add buffered writer ([libp2p/go-buffer-pool#9](https://github.com/libp2p/go-buffer-pool/pull/9)) +- github.com/libp2p/go-conn-security-multistream (v0.0.1 -> v0.0.2): + - block while writing ([libp2p/go-conn-security-multistream#10](https://github.com/libp2p/go-conn-security-multistream/pull/10)) +- github.com/libp2p/go-libp2p (v0.0.12 -> v0.0.28): + - Close the connection manager ([libp2p/go-libp2p#639](https://github.com/libp2p/go-libp2p/pull/639)) + - Frequent Relay Advertisements ([libp2p/go-libp2p#637](https://github.com/libp2p/go-libp2p/pull/637)) + - ping: return a stream of results ([libp2p/go-libp2p#626](https://github.com/libp2p/go-libp2p/pull/626)) + - Use cancelable background context in identify ([libp2p/go-libp2p#624](https://github.com/libp2p/go-libp2p/pull/624)) + - avoid intermediate allocation in relayAddrs ([libp2p/go-libp2p#609](https://github.com/libp2p/go-libp2p/pull/609)) + - cache relayAddrs for a short period of time ([libp2p/go-libp2p#608](https://github.com/libp2p/go-libp2p/pull/608)) + - autorelay: break findRelays into multiple functions and avoid the goto ([libp2p/go-libp2p#606](https://github.com/libp2p/go-libp2p/pull/606)) + - autorelay: curtail addrsplosion ([libp2p/go-libp2p#598](https://github.com/libp2p/go-libp2p/pull/598)) + - Periodically schedule identify push if the address set has changed ([libp2p/go-libp2p#597](https://github.com/libp2p/go-libp2p/pull/597)) + - Replace peer addresses in identify ([libp2p/go-libp2p#599](https://github.com/libp2p/go-libp2p/pull/599)) +- github.com/libp2p/go-libp2p-circuit (v0.0.4 -> v0.0.8): + - call Stream.Reset instead of Stream.Close ([libp2p/go-libp2p-circuit#76](https://github.com/libp2p/go-libp2p-circuit/pull/76)) + - Tag the hop relay when creating stop streams ([libp2p/go-libp2p-circuit#77](https://github.com/libp2p/go-libp2p-circuit/pull/77)) + - Tag peers with live hop streams ([libp2p/go-libp2p-circuit#75](https://github.com/libp2p/go-libp2p-circuit/pull/75)) + - Hard Limit the number of hop stream goroutines ([libp2p/go-libp2p-circuit#74](https://github.com/libp2p/go-libp2p-circuit/pull/74)) + - set deadline for stop handshake ([libp2p/go-libp2p-circuit#73](https://github.com/libp2p/go-libp2p-circuit/pull/73)) +- github.com/libp2p/go-libp2p-connmgr (v0.0.1 -> v0.0.6): + - Background trimming ([libp2p/go-libp2p-connmgr#43](https://github.com/libp2p/go-libp2p-connmgr/pull/43)) + - Implement UpsertTag ([libp2p/go-libp2p-connmgr#38](https://github.com/libp2p/go-libp2p-connmgr/pull/38)) + - Add peer protection capability (implementation) ([libp2p/go-libp2p-connmgr#36](https://github.com/libp2p/go-libp2p-connmgr/pull/36)) +- github.com/libp2p/go-libp2p-crypto (v0.0.1 -> v0.0.2): + - add openssl support ([libp2p/go-libp2p-crypto#61](https://github.com/libp2p/go-libp2p-crypto/pull/61)) +- github.com/libp2p/go-libp2p-discovery (v0.0.1 -> v0.0.4): + - More consistent use of options ([libp2p/go-libp2p-discovery#25](https://github.com/libp2p/go-libp2p-discovery/pull/25)) + - Use 3hrs as routing advertisement ttl ([libp2p/go-libp2p-discovery#23](https://github.com/libp2p/go-libp2p-discovery/pull/23)) +- github.com/libp2p/go-libp2p-interface-connmgr (v0.0.1 -> v0.0.5): + - Add Close method to the ConnManager interface ([libp2p/go-libp2p-interface-connmgr#18](https://github.com/libp2p/go-libp2p-interface-connmgr/pull/18)) + - Add UpsertTag to the interface ([libp2p/go-libp2p-interface-connmgr#17](https://github.com/libp2p/go-libp2p-interface-connmgr/pull/17)) + - Fix NullConnMgr to respect ConnManager interface ([libp2p/go-libp2p-interface-connmgr#15](https://github.com/libp2p/go-libp2p-interface-connmgr/pull/15)) + - Add peer protection capability ([libp2p/go-libp2p-interface-connmgr#14](https://github.com/libp2p/go-libp2p-interface-connmgr/pull/14)) +- github.com/libp2p/go-libp2p-kad-dht (v0.0.7 -> v0.0.13): + - fix: reduce memory used by buffered writers ([libp2p/go-libp2p-kad-dht#332](https://github.com/libp2p/go-libp2p-kad-dht/pull/332)) + - query: fix a goroutine leak when the routing table is empty ([libp2p/go-libp2p-kad-dht#329](https://github.com/libp2p/go-libp2p-kad-dht/pull/329)) + - query: fix error "leak" ([libp2p/go-libp2p-kad-dht#328](https://github.com/libp2p/go-libp2p-kad-dht/pull/328)) + - providers: run datastore GC concurrently ([libp2p/go-libp2p-kad-dht#326](https://github.com/libp2p/go-libp2p-kad-dht/pull/326)) + - fix(providers): gc ([libp2p/go-libp2p-kad-dht#325](https://github.com/libp2p/go-libp2p-kad-dht/pull/325)) + - Remove the old protocol from the defaults ([libp2p/go-libp2p-kad-dht#320](https://github.com/libp2p/go-libp2p-kad-dht/pull/320)) + - Fix some provider subsystem performance issues ([libp2p/go-libp2p-kad-dht#319](https://github.com/libp2p/go-libp2p-kad-dht/pull/319)) +- github.com/libp2p/go-libp2p-peerstore (v0.0.2 -> v0.0.6): + - segment the memory peerstore + granular locks ([libp2p/go-libp2p-peerstore#78](https://github.com/libp2p/go-libp2p-peerstore/pull/78)) + - don't delete under the read lock ([libp2p/go-libp2p-peerstore#76](https://github.com/libp2p/go-libp2p-peerstore/pull/76)) + - Read/Write locking ([libp2p/go-libp2p-peerstore#74](https://github.com/libp2p/go-libp2p-peerstore/pull/74)) + - optimize peerstore memory ([libp2p/go-libp2p-peerstore#71](https://github.com/libp2p/go-libp2p-peerstore/pull/71)) + - fix unmarshalling of peer IDs ([libp2p/go-libp2p-peerstore#72](https://github.com/libp2p/go-libp2p-peerstore/pull/72)) + - fix error handling in UpdateAddrs: return on error ([libp2p/go-libp2p-peerstore#70](https://github.com/libp2p/go-libp2p-peerstore/pull/70)) +- github.com/libp2p/go-libp2p-pubsub (v0.0.1 -> v0.0.3): + - rework validator pipeline ([libp2p/go-libp2p-pubsub#176](https://github.com/libp2p/go-libp2p-pubsub/pull/176)) + - Test adversarial signing ([libp2p/go-libp2p-pubsub#181](https://github.com/libp2p/go-libp2p-pubsub/pull/181)) + - Strict message signing by default ([libp2p/go-libp2p-pubsub#180](https://github.com/libp2p/go-libp2p-pubsub/pull/180)) +- github.com/libp2p/go-libp2p-secio (v0.0.1 -> v0.0.3): + - fix buffer size check ([libp2p/go-libp2p-secio#44](https://github.com/libp2p/go-libp2p-secio/pull/44)) +- github.com/libp2p/go-libp2p-swarm (v0.0.2 -> v0.0.6): + - dial: return a nice custom dial error ([libp2p/go-libp2p-swarm#121](https://github.com/libp2p/go-libp2p-swarm/pull/121)) +- github.com/libp2p/go-libp2p-tls (null -> v0.0.1): + - implement the new handshake ([libp2p/go-libp2p-tls#20](https://github.com/libp2p/go-libp2p-tls/pull/20)) + - use a prefix when signing the public key ([libp2p/go-libp2p-tls#26](https://github.com/libp2p/go-libp2p-tls/pull/26)) + - use ChaCha if one of the peers doesn't have AES hardware support ([libp2p/go-libp2p-tls#23](https://github.com/libp2p/go-libp2p-tls/pull/23)) + - improve peer verification ([libp2p/go-libp2p-tls#17](https://github.com/libp2p/go-libp2p-tls/pull/17)) + - add an example (mainly for development) ([libp2p/go-libp2p-tls#14](https://github.com/libp2p/go-libp2p-tls/pull/14)) +- github.com/libp2p/go-libp2p-transport-upgrader (v0.0.1 -> v0.0.4): + - improve correctness of closing connections on failure ([libp2p/go-libp2p-transport-upgrader#19](https://github.com/libp2p/go-libp2p-transport-upgrader/pull/19)) +- github.com/libp2p/go-maddr-filter (v0.0.1 -> v0.0.4): + - fix filter listing ([libp2p/go-maddr-filter#13](https://github.com/libp2p/go-maddr-filter/pull/13)) + - Reinstate deprecated Remove() method to reverse breakage ([libp2p/go-maddr-filter#12](https://github.com/libp2p/go-maddr-filter/pull/12)) + - Implement support for whitelists, default-deny/allow ([libp2p/go-maddr-filter#8](https://github.com/libp2p/go-maddr-filter/pull/8)) +- github.com/libp2p/go-mplex (v0.0.1 -> v0.0.4): + - disable write coalescing ([libp2p/go-mplex#61](https://github.com/libp2p/go-mplex/pull/61)) + - fix SetDeadline error conditions ([libp2p/go-mplex#59](https://github.com/libp2p/go-mplex/pull/59)) + - don't use contexts for deadlines ([libp2p/go-mplex#58](https://github.com/libp2p/go-mplex/pull/58)) + - don't reset on pathologies, just ignore the data ([libp2p/go-mplex#57](https://github.com/libp2p/go-mplex/pull/57)) + - coalesce writes ([libp2p/go-mplex#54](https://github.com/libp2p/go-mplex/pull/54)) + - read as much as we can in one go ([libp2p/go-mplex#53](https://github.com/libp2p/go-mplex/pull/53)) + - use timeouts when sending messages for stream open, close, and reset. ([libp2p/go-mplex#52](https://github.com/libp2p/go-mplex/pull/52)) + - fix: reset a stream even if closed remotely ([libp2p/go-mplex#50](https://github.com/libp2p/go-mplex/pull/50)) + - downgrade Error log to Warning ([libp2p/go-mplex#46](https://github.com/libp2p/go-mplex/pull/46)) + - Fix race condition by adding a mutex for deadline access ([libp2p/go-mplex#41](https://github.com/libp2p/go-mplex/pull/41)) +- github.com/libp2p/go-msgio (v0.0.1 -> v0.0.2): + - fix: never claim to read more than read ([libp2p/go-msgio#12](https://github.com/libp2p/go-msgio/pull/12)) +- github.com/libp2p/go-ws-transport (v0.0.2 -> v0.0.4): + - dep: import go-smux-* into the libp2p org ([libp2p/go-ws-transport#43](https://github.com/libp2p/go-ws-transport/pull/43)) + - replace gx instructions with note about gomod ([libp2p/go-ws-transport#42](https://github.com/libp2p/go-ws-transport/pull/42)) + + ## 0.4.20 2019-04-16 We're happy to release go-ipfs 0.4.20. This release includes some critical diff --git a/vendor/github.com/ipfs/go-ipfs/COPYRIGHT b/vendor/github.com/ipfs/go-ipfs/COPYRIGHT new file mode 100644 index 00000000..96971109 --- /dev/null +++ b/vendor/github.com/ipfs/go-ipfs/COPYRIGHT @@ -0,0 +1,5 @@ +This project is transitioning from an MIT-only license to a dual MIT/Apache-2.0 license. +Unless otherwise noted, all code contributed prior to 2019-05-06 and not contributed by +a user listed in [this signoff issue](https://github.com/ipfs/go-ipfs/issues/6302) is +licensed under MIT-only. All new contributions (and past contributions since 2019-05-06) +are licensed under a dual MIT/Apache-2.0 license. diff --git a/vendor/github.com/ipfs/go-ipfs/Dockerfile b/vendor/github.com/ipfs/go-ipfs/Dockerfile index 17e3c1c9..7a99e69c 100644 --- a/vendor/github.com/ipfs/go-ipfs/Dockerfile +++ b/vendor/github.com/ipfs/go-ipfs/Dockerfile @@ -33,6 +33,9 @@ RUN set -x \ # Get the TLS CA certificates, they're not provided by busybox. RUN apt-get update && apt-get install -y ca-certificates +# Install FUSE +RUN apt-get update && apt-get install -y fuse + # Now comes the actual target image, which aims to be as small as possible. FROM busybox:1-glibc MAINTAINER Lars Gierth @@ -43,8 +46,12 @@ COPY --from=0 $SRC_DIR/cmd/ipfs/ipfs /usr/local/bin/ipfs COPY --from=0 $SRC_DIR/bin/container_daemon /usr/local/bin/start_ipfs COPY --from=0 /tmp/su-exec/su-exec /sbin/su-exec COPY --from=0 /tmp/tini /sbin/tini +COPY --from=0 /bin/fusermount /usr/local/bin/fusermount COPY --from=0 /etc/ssl/certs /etc/ssl/certs +# Add suid bit on fusermount so it will run properly +RUN chmod 4755 /usr/local/bin/fusermount + # This shared lib (part of glibc) doesn't seem to be included with busybox. COPY --from=0 /lib/x86_64-linux-gnu/libdl-2.24.so /lib/libdl.so.2 @@ -63,6 +70,10 @@ RUN mkdir -p $IPFS_PATH \ && adduser -D -h $IPFS_PATH -u 1000 -G users ipfs \ && chown ipfs:users $IPFS_PATH +# Create mount points for `ipfs mount` command +RUN mkdir /ipfs /ipns \ + && chown ipfs:users /ipfs /ipns + # Expose the fs-repo as a volume. # start_ipfs initializes an fs-repo if none is mounted. # Important this happens after the USER directive so permission are correct. diff --git a/vendor/github.com/ipfs/go-ipfs/Gopkg.lock b/vendor/github.com/ipfs/go-ipfs/Gopkg.lock new file mode 100644 index 00000000..37044d34 --- /dev/null +++ b/vendor/github.com/ipfs/go-ipfs/Gopkg.lock @@ -0,0 +1,2642 @@ +# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'. + + +[[projects]] + branch = "master" + digest = "1:2fab77e19256b26d733b70e1f68cd965cb87e38e3a619fa960cf319aef743d53" + name = "bazil.org/fuse" + packages = [ + ".", + "fs", + "fs/fstestutil", + "fuseutil", + ] + pruneopts = "UT" + revision = "65cc252bf6691cb3c7014bcb2c8dc29de91e3a7e" + +[[projects]] + branch = "master" + digest = "1:6716c9fe6333591128e72848f246fc01dc72240e1e64185d8b4e124e7280b35d" + name = "github.com/AndreasBriese/bbloom" + packages = ["."] + pruneopts = "UT" + revision = "e2d15f34fcf99d5dbb871c820ec73f710fca9815" + +[[projects]] + digest = "1:9f3b30d9f8e0d7040f729b82dcbc8f0dead820a133b3147ce355fc451f32d761" + name = "github.com/BurntSushi/toml" + packages = ["."] + pruneopts = "UT" + revision = "3012a1dbe2e4bd1391d42b32f0577cb7bbc7f005" + version = "v0.3.1" + +[[projects]] + digest = "1:4a7be34ac4d3c56c039ece7d674236bde2d95f6adc93262cbb21d5b758566b15" + name = "github.com/Kubuxu/go-os-helper" + packages = ["."] + pruneopts = "UT" + revision = "3d3fc2fb493d8d889dddd5a4524283ac2faa4732" + version = "v0.0.1" + +[[projects]] + branch = "master" + digest = "1:c42df949106ee61667006128ed30161bea596cb773a94543bd2d8eec2f88fee5" + name = "github.com/Kubuxu/gocovmerge" + packages = ["."] + pruneopts = "UT" + revision = "7ecaa51963cdbbd985d4d0d8266fda9fab6680ca" + +[[projects]] + branch = "master" + digest = "1:166dc6852cbd78ca17b96e76b18f65853adf97989fcb14a0743f3aa6123f546b" + name = "github.com/OpenPeeDeeP/depguard" + packages = ["."] + pruneopts = "UT" + revision = "1f388ab2d81096755d25043aa729e2fb889f3dae" + +[[projects]] + digest = "1:bf67b338b8ad10f12e81c2f151d0be3246373c96681d06ba1312afe02d4e7fa4" + name = "github.com/Stebalien/go-bitfield" + packages = ["."] + pruneopts = "UT" + revision = "a911218965d225c9b5b8ba5e1a8ea539651ca036" + version = "v0.0.1" + +[[projects]] + digest = "1:d6afaeed1502aa28e80a4ed0981d570ad91b2579193404256ce672ed0a609e0d" + name = "github.com/beorn7/perks" + packages = ["quantile"] + pruneopts = "UT" + revision = "4b2b341e8d7715fae06375aa633dbb6e91b3fb46" + version = "v1.0.0" + +[[projects]] + digest = "1:b6d886569181ec96ca83d529f4d6ba0cbf92ace7bb6f633f90c5f34d9bba7aab" + name = "github.com/blang/semver" + packages = ["."] + pruneopts = "UT" + revision = "ba2c2ddd89069b46a7011d4106f6868f17ee1705" + version = "v3.6.1" + +[[projects]] + branch = "master" + digest = "1:02796fed67c64543bfe3343b26cdc9a221bca2d83e8c7dcf35b5b70f6b5b9c56" + name = "github.com/bren2010/proquint" + packages = ["."] + pruneopts = "UT" + revision = "38337c27106d8f06e9b5cddc6df973ceece1c8ea" + +[[projects]] + branch = "master" + digest = "1:9e7c5138114ff9c51a60731b3a425c319305013c6ea8b3f60fd2435baba1a0db" + name = "github.com/btcsuite/btcd" + packages = ["btcec"] + pruneopts = "UT" + revision = "a0d1e3e36d50f61ee6eaab26d7bd246aae1f9ece" + +[[projects]] + digest = "1:c1100fc71e23b6a32b2c68a5202a848fd13811d5a10b12edb8019c3667d1cd9a" + name = "github.com/cenkalti/backoff" + packages = ["."] + pruneopts = "UT" + revision = "4b4cebaf850ec58f1bb1fec5bdebdf8501c2bc3f" + version = "v3.0.0" + +[[projects]] + digest = "1:f438d91be142877c3ad83157992c91de787ddfbddcc2a7da1ef6ef61606cadc4" + name = "github.com/cheekybits/genny" + packages = ["generic"] + pruneopts = "UT" + revision = "d2cf3cdd35ce0d789056c4bc02a4d6349c947caf" + version = "v1.0.0" + +[[projects]] + digest = "1:05ffeeed3f0f05520de0679f6aa3219ffee69cfd6d9fb6c194879d4c818ad670" + name = "github.com/coreos/go-semver" + packages = ["semver"] + pruneopts = "UT" + revision = "e214231b295a8ea9479f11b70b35d5acf3556d9b" + version = "v0.3.0" + +[[projects]] + digest = "1:5bdd0581421e643e6c3163bb5da785600a2d7d0d73fec58acebaf2e693868e9d" + name = "github.com/cskr/pubsub" + packages = ["."] + pruneopts = "UT" + revision = "65166f5ae403cbf6dcdced31e1f8f8ad95485cb3" + version = "v1.0.2" + +[[projects]] + branch = "master" + digest = "1:ff0db56095c10bcdbf92ce2503f1d0d6e2ee0615184cfb96db2907fcb08d454e" + name = "github.com/davidlazar/go-crypto" + packages = ["salsa20"] + pruneopts = "UT" + revision = "62389b5e4ae0188549f6bb2f4877e7a22a1c420d" + +[[projects]] + digest = "1:98436a9785f711ffee66f06265296dd36afd6e3dc532410c98a9051b5fd4c2f1" + name = "github.com/dgraph-io/badger" + packages = [ + ".", + "options", + "pb", + "skl", + "table", + "y", + ] + pruneopts = "UT" + revision = "0ce1d2e26af1ba8b8a72ea864145a3e1e3b382cd" + +[[projects]] + branch = "master" + digest = "1:6e8109ce247a59ab1eeb5330166c12735f6590de99c9647b6162d11518d32c9a" + name = "github.com/dgryski/go-farm" + packages = ["."] + pruneopts = "UT" + revision = "6a90982ecee230ff6cba02d5bd386acc030be9d3" + +[[projects]] + digest = "1:6f9339c912bbdda81302633ad7e99a28dfa5a639c864061f1929510a9a64aa74" + name = "github.com/dustin/go-humanize" + packages = ["."] + pruneopts = "UT" + revision = "9f541cc9db5d55bce703bd99987c9d5cb8eea45e" + version = "v1.0.0" + +[[projects]] + branch = "master" + digest = "1:fffcae02150ef80950d18c721eaa249e6e80df5e0b9b645731949e586573f685" + name = "github.com/elgris/jsondiff" + packages = ["."] + pruneopts = "UT" + revision = "765b5c24c302e7c7fd032fdb8c69f101918229cb" + +[[projects]] + branch = "master" + digest = "1:c183111eaf02a9e6bb39c213bdfb5472b16f1955dd4c9dab82db83f114c64a63" + name = "github.com/facebookgo/atomicfile" + packages = ["."] + pruneopts = "UT" + revision = "2de1f203e7d5e386a6833233882782932729f27e" + +[[projects]] + digest = "1:938a2672d6ebbb7f7bc63eee3e4b9464c16ffcf77ec8913d3edbf32b4e3984dd" + name = "github.com/fatih/color" + packages = ["."] + pruneopts = "UT" + revision = "570b54cabe6b8eb0bc2dfce68d964677d63b5260" + version = "v1.5.0" + +[[projects]] + digest = "1:abeb38ade3f32a92943e5be54f55ed6d6e3b6602761d74b4aab4c9dd45c18abd" + name = "github.com/fsnotify/fsnotify" + packages = ["."] + pruneopts = "UT" + revision = "c2828203cd70a50dcccfb2761f8b1f8ceef9a8e9" + version = "v1.4.7" + +[[projects]] + digest = "1:b57b6448d97d626ca173056800c194c7cc7f1f6f6590eafd18fe86dfb434f080" + name = "github.com/go-critic/go-critic" + packages = [ + "checkers", + "checkers/internal/lintutil", + ] + pruneopts = "UT" + revision = "d7b3038bc7a1c35a1d02fdd7cf4094f0f1a12001" + version = "v0.3.4" + +[[projects]] + digest = "1:f12f53369294649f9d5046d1e8a40187ad36584201a9e1a135bf44589df1deb8" + name = "github.com/go-lintpack/lintpack" + packages = [ + ".", + "astwalk", + ] + pruneopts = "UT" + revision = "80adc0715ac409128d0b7212719896ad8d3444b7" + version = "v0.5.2" + +[[projects]] + digest = "1:b9a8d81ce273b216a3ad70ff95d98179ec2f5392523a9a305b3e38c70ca9d361" + name = "github.com/go-toolsmith/astcast" + packages = ["."] + pruneopts = "UT" + revision = "a6cb19f07b66b859a53f3f2be6e4c3bba892db7e" + version = "v1.0.0" + +[[projects]] + digest = "1:bd091673b35859ad8f831a5b3c961805e108be72d0778b9d07fd383e59ab4287" + name = "github.com/go-toolsmith/astcopy" + packages = ["."] + pruneopts = "UT" + revision = "245af3020944a15e09072c8ad3883c1451d1fdef" + version = "v1.0.0" + +[[projects]] + digest = "1:db8123e0896cf805cb30c7bacad0b1a1d562edbbcd2a765ceda1af926c9a99a4" + name = "github.com/go-toolsmith/astequal" + packages = ["."] + pruneopts = "UT" + revision = "dcb477bfacd6e00a13c6d63bfc73db28dd343160" + version = "v1.0.0" + +[[projects]] + digest = "1:1ef70bd4e2d06e76470c3cb43b89020201dcb0b4a409d9a961df77cfaf5ae3a8" + name = "github.com/go-toolsmith/astfmt" + packages = ["."] + pruneopts = "UT" + revision = "0d74c731079884bda287cf8df9ce7b92e688af8c" + version = "v1.0.0" + +[[projects]] + digest = "1:f2def520d33d9ba100161b0d2101f98b2104e62bafd3e45ae5deca271ac84000" + name = "github.com/go-toolsmith/astp" + packages = ["."] + pruneopts = "UT" + revision = "6373270dee65bfb0479f2acd16d4c8e9d5db13f8" + version = "v1.0.0" + +[[projects]] + digest = "1:aba9fa7c6dacad505e95d984ec0b07f6b5a4691ed2f4ff36c7b732b3704627a3" + name = "github.com/go-toolsmith/strparse" + packages = ["."] + pruneopts = "UT" + revision = "830b6daa1241714c12a9b9a4a56849fe2f93aedc" + version = "v1.0.0" + +[[projects]] + digest = "1:a51f9845b0dec6e372e229395e019cab7c032711c6ca3ec1895a58bfdf760962" + name = "github.com/go-toolsmith/typep" + packages = ["."] + pruneopts = "UT" + revision = "cab1745ffd84a567b524317c7f90e96755b18fcf" + version = "v1.0.0" + +[[projects]] + digest = "1:9ae31ce33b4bab257668963e844d98765b44160be4ee98cafc44637a213e530d" + name = "github.com/gobwas/glob" + packages = [ + ".", + "compiler", + "match", + "syntax", + "syntax/ast", + "syntax/lexer", + "util/runes", + "util/strings", + ] + pruneopts = "UT" + revision = "5ccd90ef52e1e632236f7326478d4faa74f99438" + version = "v0.2.3" + +[[projects]] + digest = "1:d0e00c8ccabdfe678667d6be78c9d08a6a4efc36d9fb596f098706728b00ba6b" + name = "github.com/gogo/protobuf" + packages = [ + "gogoproto", + "io", + "proto", + "protoc-gen-gogo/descriptor", + ] + pruneopts = "UT" + revision = "ba06b47c162d49f2af050fb4c75bcbc86a159d5c" + version = "v1.2.1" + +[[projects]] + digest = "1:be408f349cae090a7c17a279633d6e62b00068e64af66a582cae0983de8890ea" + name = "github.com/golang/mock" + packages = ["gomock"] + pruneopts = "UT" + revision = "9fa652df1129bef0e734c9cf9bf6dbae9ef3b9fa" + version = "1.3.1" + +[[projects]] + digest = "1:318f1c959a8a740366fce4b1e1eb2fd914036b4af58fbd0a003349b305f118ad" + name = "github.com/golang/protobuf" + packages = ["proto"] + pruneopts = "UT" + revision = "b5d812f8a3706043e23a9cd5babf2e5423744d30" + version = "v1.3.1" + +[[projects]] + digest = "1:e4f5819333ac698d294fe04dbf640f84719658d5c7ce195b10060cc37292ce79" + name = "github.com/golang/snappy" + packages = ["."] + pruneopts = "UT" + revision = "2a8bb927dd31d8daada140a5d09578521ce5c36a" + version = "v0.0.1" + +[[projects]] + branch = "master" + digest = "1:c173565780edcf5d43c5f983be0e9085266764465422d4ad230355abd2e0d252" + name = "github.com/golangci/check" + packages = [ + "cmd/structcheck", + "cmd/varcheck", + ] + pruneopts = "UT" + revision = "cfe4005ccda277a820149d44d6ededc400cc99a2" + +[[projects]] + branch = "master" + digest = "1:efb8cf3f0c2f47844104d6e879fc77d846649df794e378cae50e749fad1bb1dc" + name = "github.com/golangci/dupl" + packages = [ + ".", + "job", + "printer", + "suffixtree", + "syntax", + "syntax/golang", + ] + pruneopts = "UT" + revision = "3e9179ac440a0386ac7cc9a085fc44397c6b9bbc" + +[[projects]] + branch = "master" + digest = "1:f1761ff12ebf63f70390733f5804434f9b323996816cb9cddbb7041279872bcb" + name = "github.com/golangci/errcheck" + packages = [ + "golangci", + "internal/errcheck", + ] + pruneopts = "UT" + revision = "ef45e06d44b6e018d817c16c762d448990adc5e0" + +[[projects]] + branch = "master" + digest = "1:f63d85b6e551b6c8aa3ed2e42b64db15f5b525bdb01fa36af18288f1de4c859b" + name = "github.com/golangci/go-misc" + packages = ["deadcode"] + pruneopts = "UT" + revision = "927a3d87b613e9f6f0fb7ef8bb8de8b83c30a5a2" + +[[projects]] + branch = "master" + digest = "1:cc3a79e8819804582643d37b0664f3fa501dd0b6be958ebe77677e2f69aaba95" + name = "github.com/golangci/go-tools" + packages = [ + "arg", + "callgraph", + "callgraph/static", + "config", + "deprecated", + "functions", + "internal/sharedcheck", + "lint", + "lint/lintdsl", + "lint/lintutil", + "lint/lintutil/format", + "simple", + "ssa", + "ssa/ssautil", + "ssautil", + "staticcheck", + "staticcheck/vrp", + "stylecheck", + "unused", + "version", + ] + pruneopts = "UT" + revision = "35a9f45a5db090b0227d692d823151104cd695fa" + +[[projects]] + branch = "master" + digest = "1:e1b9fbecb1d985f291dbca59767070fe899f38d1b40f7e9433f9a42b7fb3bd4e" + name = "github.com/golangci/goconst" + packages = ["."] + pruneopts = "UT" + revision = "041c5f2b40f3dd334a4a6ee6a3f84ca3fc70680a" + +[[projects]] + branch = "master" + digest = "1:431fd101ab780d1916262a582e241d01cbcbca10f7d85ebdd4ba339b8485483e" + name = "github.com/golangci/gocyclo" + packages = ["pkg/gocyclo"] + pruneopts = "UT" + revision = "0a533e8fa43d6605069e94f455bf9d79d4b8ea8c" + +[[projects]] + branch = "master" + digest = "1:66fcab6100e2be1bb31ae5494a0eb928690e2a4bf739d44eb2923ac7dd687e03" + name = "github.com/golangci/gofmt" + packages = [ + "gofmt", + "goimports", + ] + pruneopts = "UT" + revision = "0b8337e80d98f7eec18e4504a4557b34423fd039" + +[[projects]] + digest = "1:959d250b56bb86b3a6a6b8a4f97749c90a68187f2bbce59888de884117dce849" + name = "github.com/golangci/golangci-lint" + packages = [ + "cmd/golangci-lint", + "pkg/commands", + "pkg/config", + "pkg/exitcodes", + "pkg/fsutils", + "pkg/golinters", + "pkg/golinters/goanalysis", + "pkg/golinters/goanalysis/checker", + "pkg/golinters/goanalysis/passes/nilness", + "pkg/goutil", + "pkg/lint", + "pkg/lint/astcache", + "pkg/lint/linter", + "pkg/lint/lintersdb", + "pkg/logutils", + "pkg/packages", + "pkg/printers", + "pkg/report", + "pkg/result", + "pkg/result/processors", + "pkg/timeutils", + ] + pruneopts = "UT" + revision = "4ba2155996359eabd8800d1fbf3e3a9777c80490" + version = "v1.17.1" + +[[projects]] + branch = "master" + digest = "1:bf573d0637989470dee90e11a6ea87b5de1ddb7a435334b80656b0df05b0630b" + name = "github.com/golangci/gosec" + packages = [ + ".", + "rules", + ] + pruneopts = "UT" + revision = "8afd9cbb6cfb34a3b4d4d5711bafdc6640ae892f" + +[[projects]] + branch = "master" + digest = "1:3a5ea92f78579dfd319260ce995575c07890c8aff429035637287a00da664647" + name = "github.com/golangci/ineffassign" + packages = ["."] + pruneopts = "UT" + revision = "2ee8f2867dde308c46d401d6d30f6c644094b167" + +[[projects]] + branch = "master" + digest = "1:3919f284dcb91eca214603fb11ba9a9d5b020975b577b2c85c541ac3d40fa114" + name = "github.com/golangci/lint-1" + packages = ["."] + pruneopts = "UT" + revision = "d2cdd8c0821928c61cb0903441f8b35457a98a61" + +[[projects]] + branch = "master" + digest = "1:8665edfb3c5371fbac9820d127fa0d9aed813cc2349a27a7d16064dd89fed146" + name = "github.com/golangci/maligned" + packages = ["."] + pruneopts = "UT" + revision = "b1d89398deca2fd3f8578e5a9551e819bd01ca5f" + +[[projects]] + digest = "1:73dfedbcb6b348638ef0066766a9e7d8f6cfc5cfcb3a8e00ceb631a4bca73cf1" + name = "github.com/golangci/misspell" + packages = ["."] + pruneopts = "UT" + revision = "b90dc15cfd220ecf8bbc9043ecb928cef381f011" + version = "v0.3.4" + +[[projects]] + branch = "master" + digest = "1:6bc38b03a76ac4ce44482b437c6a31ec441e494abd271d63722f99ac2e7e9e80" + name = "github.com/golangci/prealloc" + packages = ["."] + pruneopts = "UT" + revision = "215b22d4de21190b80ce05e7d8466677c1aa3223" + +[[projects]] + branch = "master" + digest = "1:6bea17ec2cee4996145d70cffbee98330adc2bfc24107373953a250abca159ff" + name = "github.com/golangci/revgrep" + packages = ["."] + pruneopts = "UT" + revision = "276a5c0a103935ee65af49afc254a65335bf1fcf" + +[[projects]] + branch = "master" + digest = "1:c553e7c7483f2d6db1e84a27a18df144ed4041792d7556916369f86ccf5409fe" + name = "github.com/golangci/unconvert" + packages = ["."] + pruneopts = "UT" + revision = "28b1c447d1f4a810737ee6ab40ea6c1d0ceae4ad" + +[[projects]] + digest = "1:582b704bebaa06b48c29b0cec224a6058a09c86883aaddabde889cd1a5f73e1b" + name = "github.com/google/uuid" + packages = ["."] + pruneopts = "UT" + revision = "0cd6bf5da1e1c83f8b45653022c74f71af0538a4" + version = "v1.1.1" + +[[projects]] + digest = "1:7b5c6e2eeaa9ae5907c391a91c132abfd5c9e8a784a341b5625e750c67e6825d" + name = "github.com/gorilla/websocket" + packages = ["."] + pruneopts = "UT" + revision = "66b9c49e59c6c48f0ffce28c2d8b8a5678502c6d" + version = "v1.4.0" + +[[projects]] + branch = "master" + digest = "1:6c612dcf6342c70b413171db9caa4eb6d64298ac92be7142d5f8757792bd0045" + name = "github.com/gostaticanalysis/analysisutil" + packages = ["."] + pruneopts = "UT" + revision = "56bca42c76353df8b3e08af308c2e3b915bdc4c2" + +[[projects]] + digest = "1:7efe48dea4db6b35dcc15e15394b627247e5b3fb814242de986b746ba8e0abf0" + name = "github.com/gxed/go-shellwords" + packages = ["."] + pruneopts = "UT" + revision = "02e3cf038dcea8290e44424da473dd12be796a8a" + version = "v1.0.3" + +[[projects]] + digest = "1:0ade334594e69404d80d9d323445d2297ff8161637f9b2d347cc6973d2d6f05b" + name = "github.com/hashicorp/errwrap" + packages = ["."] + pruneopts = "UT" + revision = "8a6fb523712970c966eefc6b39ed2c5e74880354" + version = "v1.0.0" + +[[projects]] + digest = "1:f668349b83f7d779567c880550534addeca7ebadfdcf44b0b9c39be61864b4b7" + name = "github.com/hashicorp/go-multierror" + packages = ["."] + pruneopts = "UT" + revision = "886a7fbe3eb1c874d46f623bfa70af45f425b3d1" + version = "v1.0.0" + +[[projects]] + digest = "1:d15ee511aa0f56baacc1eb4c6b922fa1c03b38413b6be18166b996d82a0156ea" + name = "github.com/hashicorp/golang-lru" + packages = [ + ".", + "simplelru", + ] + pruneopts = "UT" + revision = "7087cb70de9f7a8bc0a10c375cb0d2280a8edf9c" + version = "v0.5.1" + +[[projects]] + digest = "1:c0d19ab64b32ce9fe5cf4ddceba78d5bc9807f0016db6b1183599da3dcc24d10" + name = "github.com/hashicorp/hcl" + packages = [ + ".", + "hcl/ast", + "hcl/parser", + "hcl/printer", + "hcl/scanner", + "hcl/strconv", + "hcl/token", + "json/parser", + "json/scanner", + "json/token", + ] + pruneopts = "UT" + revision = "8cb6e5b959231cc1119e43259c4a608f9c51a241" + version = "v1.0.0" + +[[projects]] + digest = "1:541a489631d4084ea2b619e0edd3f8eb7e3858cd8725dd0239a361798863672e" + name = "github.com/hsanjuan/go-libp2p-http" + packages = ["."] + pruneopts = "UT" + revision = "9b0da0751e81069747a272ede6c1248394cbb560" + version = "v0.1.2" + +[[projects]] + digest = "1:c00cc6d95a674b4b923ac069d364445043bc67836e9bd8aeff8440cfbe6a2cc7" + name = "github.com/huin/goupnp" + packages = [ + ".", + "dcps/internetgateway1", + "dcps/internetgateway2", + "httpu", + "scpd", + "soap", + "ssdp", + ] + pruneopts = "UT" + revision = "656e61dfadd241c7cbdd22a023fa81ecb6860ea8" + version = "v1.0.0" + +[[projects]] + digest = "1:870d441fe217b8e689d7949fef6e43efbc787e50f200cb1e70dbca9204a1d6be" + name = "github.com/inconshreveable/mousetrap" + packages = ["."] + pruneopts = "UT" + revision = "76626ae9c91c4f2a10f34cad8ce83ea42c93bb75" + version = "v1.0" + +[[projects]] + digest = "1:fe9aa4ac8c8d9bf5eaec1a8dd8c029f2cecd1c4ad91072b7ac99ecb44ff66910" + name = "github.com/ipfs/bbloom" + packages = ["."] + pruneopts = "UT" + revision = "4492942caf937893b9cf1ebba71c297beda904b2" + version = "v0.0.1" + +[[projects]] + digest = "1:014f43937a01f4140d5c32584836c86dd1c6e524bf56e1b402d842a9d78eb652" + name = "github.com/ipfs/dir-index-html" + packages = ["."] + pruneopts = "UT" + revision = "76b6774a477fe6263d445972fe176f3f3b4ea176" + version = "v1.0.3" + +[[projects]] + digest = "1:01c18b3edc5ca147f9136e937ff4095aa1808bc51772e133273666ea069699bc" + name = "github.com/ipfs/go-bitswap" + packages = [ + ".", + "decision", + "getter", + "message", + "message/pb", + "messagequeue", + "network", + "notifications", + "peermanager", + "providerquerymanager", + "session", + "sessionmanager", + "sessionpeermanager", + "sessionrequestsplitter", + "wantlist", + "wantmanager", + ] + pruneopts = "UT" + revision = "1b921d216899ca84abc6a904efd2cbca77a67f65" + version = "v0.1.1" + +[[projects]] + digest = "1:97b7b1549d94c885626167359549d9164bb35a9a584faa7c3a576909be0ea37f" + name = "github.com/ipfs/go-block-format" + packages = ["."] + pruneopts = "UT" + revision = "9e46c0dce5d9a041b8ea1eed8ca924b36355c61b" + version = "v0.0.2" + +[[projects]] + digest = "1:4de47245d5ec315fb9c8f7aa3b0f2d19fb6df0cf33bf1cdb25673c6110fe4d95" + name = "github.com/ipfs/go-blockservice" + packages = ["."] + pruneopts = "UT" + revision = "4815cb7459d447756e8783e26a86dc8e1bfed774" + version = "v0.1.0" + +[[projects]] + digest = "1:664cf1fc1e6ec05988cc6b8f52a61fca914279a92dcd0bc1b8be5507fb3b0c8a" + name = "github.com/ipfs/go-cid" + packages = ["."] + pruneopts = "UT" + revision = "b1cc3e404d48791056147f118ea7e7ea94eb946f" + version = "v0.0.2" + +[[projects]] + digest = "1:b8b8567077bb9d92b85b2411d5e5a9bb79e79ce3a620f094931b909d6845328a" + name = "github.com/ipfs/go-cidutil" + packages = [ + ".", + "cid-fmt", + "cidenc", + ] + pruneopts = "UT" + revision = "fdf58ea0da03b6087e14bcce352303c1c0bad32d" + version = "v0.0.2" + +[[projects]] + digest = "1:079436f26cbece7e60cf4b4b851794a65dd5f360579b2f27a05415c70478dfb4" + name = "github.com/ipfs/go-datastore" + packages = [ + ".", + "autobatch", + "keytransform", + "mount", + "namespace", + "query", + "retrystore", + "sync", + ] + pruneopts = "UT" + revision = "aa9190c18f1576be98e974359fd08c64ca0b5a94" + version = "v0.0.5" + +[[projects]] + digest = "1:77f64288e27bdc74a4937129006037f89ea08ec55a0822531a9a76050f904528" + name = "github.com/ipfs/go-detect-race" + packages = ["."] + pruneopts = "UT" + revision = "52daa73989bc95b2fa97d6c610adf62d04eb7822" + version = "v0.0.1" + +[[projects]] + digest = "1:8270de0224f4c8ef01e23463a6c6f2a5026a2d3ccf3f2e3145ffcd67d7b9a62c" + name = "github.com/ipfs/go-ds-badger" + packages = ["."] + pruneopts = "UT" + revision = "7fe0af0808f565d460fa8d3851a5808d77f72628" + version = "v0.0.3" + +[[projects]] + digest = "1:f896dc92ae70c70f57ac8d47c0aa3e9fe185afcc35ee807975a621766ee6028f" + name = "github.com/ipfs/go-ds-flatfs" + packages = ["."] + pruneopts = "UT" + revision = "d5e3c1fa14d2fcc187a4a996eea3f48de9d7a5cd" + version = "v0.0.2" + +[[projects]] + digest = "1:ab70bd10c780d127a66393a14061ae69ae0145027e7207b7c43db68524f3f64a" + name = "github.com/ipfs/go-ds-leveldb" + packages = ["."] + pruneopts = "UT" + revision = "47a9627082eeb3e52570a75eb4fdfaff8b2f19a9" + version = "v0.0.2" + +[[projects]] + digest = "1:afbc88b3730097cd76ea72695941270547a5b3ed00d870ee0612897ac9943d79" + name = "github.com/ipfs/go-ds-measure" + packages = ["."] + pruneopts = "UT" + revision = "a74729db656decb31c9d0546aef893eaeb4247f7" + version = "v0.0.1" + +[[projects]] + digest = "1:bc3ed1378495622fd5eba7b63c86c10af1e5c4c1ae8642ab85b994ed89cf08bf" + name = "github.com/ipfs/go-fs-lock" + packages = ["."] + pruneopts = "UT" + revision = "66f8794e4aed94004486434cf8bf815e5991a0a4" + version = "v0.0.1" + +[[projects]] + digest = "1:429edc38cba9210059680d94ed67a8552632025635e666e112313986de135d74" + name = "github.com/ipfs/go-ipfs-blockstore" + packages = ["."] + pruneopts = "UT" + revision = "8d6a694a33d2729a94d848208c75d117b77c3492" + version = "v0.0.1" + +[[projects]] + digest = "1:25b55cfa6c762a2623c5b50b76e021c48c293e983cd38890f885e2f8d8a216c6" + name = "github.com/ipfs/go-ipfs-blocksutil" + packages = ["."] + pruneopts = "UT" + revision = "11463846b576c51999afeedd9a0eacda8b5cb2c4" + version = "v0.0.1" + +[[projects]] + digest = "1:cf743f8296553603264f68ae79fbd0ed9ce25636c28deedde111d6760b8b0c7d" + name = "github.com/ipfs/go-ipfs-chunker" + packages = ["."] + pruneopts = "UT" + revision = "ecef6090e78f549c5f48f18d398e7b7f97e8c32d" + version = "v0.0.1" + +[[projects]] + digest = "1:50f399a26a1a675a8d1709f69aafaee8b5a7d51d678902c98285d02197ea829e" + name = "github.com/ipfs/go-ipfs-cmds" + packages = [ + ".", + "cli", + "http", + ] + pruneopts = "UT" + revision = "6069424baf71e64d6075836733f34a6f9afba22d" + version = "v0.0.10" + +[[projects]] + digest = "1:4751a46363a69f324ef4ed1ef60e24a2f8d74c1b4de8672f094b9329a785ef18" + name = "github.com/ipfs/go-ipfs-config" + packages = [ + ".", + "serialize", + ] + pruneopts = "UT" + revision = "4a51393611d9580d17ecbccb0c4aec5eb81f21ce" + source = "github.com/vulcanize/go-ipfs-config" + +[[projects]] + digest = "1:ae1ee4c628ee8ad66d9505bb2685902c93e0cd89089a17b8804463b5cc1b766b" + name = "github.com/ipfs/go-ipfs-delay" + packages = ["."] + pruneopts = "UT" + revision = "6482ad624d0b4f4053563439f8ca0bd619fbc737" + version = "v0.0.1" + +[[projects]] + digest = "1:0fcfbb9a7c8245d19d5a79c13ad702201c1d9cd8ca79619379a22845de723278" + name = "github.com/ipfs/go-ipfs-ds-help" + packages = ["."] + pruneopts = "UT" + revision = "4a69beb72c1b4e6e7ed62c5c5cbc1bd7a3d219b2" + version = "v0.0.1" + +[[projects]] + digest = "1:c8bc4cbd7b94d84784f6f99cca35ebedebb5f9ded2d561e4130d8c67cc5127b0" + name = "github.com/ipfs/go-ipfs-exchange-interface" + packages = ["."] + pruneopts = "UT" + revision = "b6e88260772433e18af18bb3f237d78678e65f0b" + version = "v0.0.1" + +[[projects]] + digest = "1:284cfd2a17692d0e628a263854b8acea34427b9aa2f4f923b91570f07ae65d2e" + name = "github.com/ipfs/go-ipfs-exchange-offline" + packages = ["."] + pruneopts = "UT" + revision = "e3705b31117ceccfa67820f84c1085f74f5e039b" + version = "v0.0.1" + +[[projects]] + digest = "1:2f4c34c23f57eadaea0a620386dcc691e83f44cc52fb8163f53695e7aa3fbae4" + name = "github.com/ipfs/go-ipfs-files" + packages = ["."] + pruneopts = "UT" + revision = "cf8456081cd5fd17ae1716c5fdff7d4cfba1bbb2" + version = "v0.0.3" + +[[projects]] + digest = "1:990c3a92954ef12159a3564533e63edc53feeadcb513930250351b919c6756f5" + name = "github.com/ipfs/go-ipfs-posinfo" + packages = ["."] + pruneopts = "UT" + revision = "19b0f52f6bd140be93fb568203586a165eb1aadf" + version = "v0.0.1" + +[[projects]] + digest = "1:3d6b825f2ac90788f3ac6bb7927d339ded21d02951d08b5bb66bf5326af45ea9" + name = "github.com/ipfs/go-ipfs-pq" + packages = ["."] + pruneopts = "UT" + revision = "63128f5dd36a6c20c0f2d1c65eb4390d2590a273" + version = "v0.0.1" + +[[projects]] + digest = "1:962e8c6b42e9c2d36bbdb2e55a4cc893f7faec22da7de71c634090b96a87a4d6" + name = "github.com/ipfs/go-ipfs-routing" + packages = [ + "mock", + "none", + "offline", + ] + pruneopts = "UT" + revision = "d508458cea98e199ae7b84029b627ceb9e5db660" + version = "v0.1.0" + +[[projects]] + digest = "1:0b4439ae69776549e6489b261f66894a1390140dad53f1c3b1fbfc074478590d" + name = "github.com/ipfs/go-ipfs-util" + packages = ["."] + pruneopts = "UT" + revision = "a4bb5361e49427531f9a716ead2ce4bd9bdd7959" + version = "v0.0.1" + +[[projects]] + digest = "1:b67b5b49a303fbef8d0c30958b41754068898b0084813cf9021cc9ecd7e4c7e4" + name = "github.com/ipfs/go-ipld-cbor" + packages = [ + ".", + "encoding", + ] + pruneopts = "UT" + revision = "c084f45ab421fae38c99d98ce7aca9ca5ae85af3" + version = "v0.0.2" + +[[projects]] + digest = "1:60006152d40763463546fc6db3e21a223d9a1a5dedb6554bbe6d1679ae1bf7b3" + name = "github.com/ipfs/go-ipld-format" + packages = ["."] + pruneopts = "UT" + revision = "c8bb359ca21e831187139329dd4da249abc95602" + version = "v0.0.2" + +[[projects]] + digest = "1:fe257dab08c7455ab2afb1836d9933f09719d53e16c61df9a2e23316798ccfc2" + name = "github.com/ipfs/go-ipld-git" + packages = ["."] + pruneopts = "UT" + revision = "ee620e932c0cf00124e7c1c6f434eb89530caaf8" + version = "v0.0.2" + +[[projects]] + digest = "1:4638b57014e4a204350087e3a2d5631f8aaa197bb6af688ca6e280457a7a46fa" + name = "github.com/ipfs/go-ipns" + packages = [ + ".", + "pb", + ] + pruneopts = "UT" + revision = "a989b48e3b7d32af1c872cbf2f6e884a08a9b351" + version = "v0.0.1" + +[[projects]] + digest = "1:e8c78569402b8dcf846924dea6eb27b1de135c9a53d7adbd2629250ef66c021a" + name = "github.com/ipfs/go-log" + packages = [ + ".", + "tracer", + "tracer/wire", + "writer", + ] + pruneopts = "UT" + revision = "91b837264c0f35dd4e2be341d711316b91d3573d" + version = "v0.0.1" + +[[projects]] + digest = "1:1347cc59745de60dcec6e00aec552d654d0efa72b119cd3a92967b8a69a6ff47" + name = "github.com/ipfs/go-merkledag" + packages = [ + ".", + "pb", + "test", + ] + pruneopts = "UT" + revision = "e0c97528b5888969361ca8c0826e79944ea40682" + version = "v0.1.0" + +[[projects]] + digest = "1:2de37461901377cb21aae96aab4ca67ebbb6d77e5f140c8f376eb566b7805365" + name = "github.com/ipfs/go-metrics-interface" + packages = ["."] + pruneopts = "UT" + revision = "87aa106f53272f064ca7956a6db83f17a553f254" + version = "v0.0.1" + +[[projects]] + digest = "1:c78afe3d1578551c86f287fdac8fb883ae34b545084fa9b7d8f6cfb7a73e730f" + name = "github.com/ipfs/go-metrics-prometheus" + packages = ["."] + pruneopts = "UT" + revision = "8f6977cb23506737d1177332bd0b91a2352bcb98" + version = "v0.0.2" + +[[projects]] + digest = "1:87b290476fd7fbd45a38d7e2608ac51562d075cb7e709425cb1a060cf71fbf9a" + name = "github.com/ipfs/go-mfs" + packages = ["."] + pruneopts = "UT" + revision = "bb73cf40769a3306b932f156365f7e7662719fd2" + version = "v0.1.0" + +[[projects]] + digest = "1:78c440f94312bb5181ef6fdebf54ed91c7c115f6e79010aa5e513fdc9a7e3ddd" + name = "github.com/ipfs/go-path" + packages = [ + ".", + "resolver", + ] + pruneopts = "UT" + revision = "466e1ce7a7073faa0af3af8cd95c914ff1b1e945" + version = "v0.0.7" + +[[projects]] + digest = "1:d0b359ab95f5abe4d17eae347b5a2270912e728eaaa9826e6371c8a3d5325fff" + name = "github.com/ipfs/go-peertaskqueue" + packages = [ + ".", + "peertask", + "peertracker", + ] + pruneopts = "UT" + revision = "98cd87e43d9738e3409c0fbf44c9613b1f455207" + version = "v0.1.0" + +[[projects]] + digest = "1:5d5961815f8e4f1fbad28f6c7ff5e42fcd9527aa823a5daa19b622b9cc41d1ed" + name = "github.com/ipfs/go-todocounter" + packages = ["."] + pruneopts = "UT" + revision = "bc75efcf13e6e50fbba27679ba5451585d70c954" + version = "v0.0.1" + +[[projects]] + digest = "1:42a537f668fb79eeb79cd951d6459dd3eb8fba72a914ac15eda3a7cb1d5d2548" + name = "github.com/ipfs/go-unixfs" + packages = [ + ".", + "file", + "hamt", + "importer", + "importer/balanced", + "importer/helpers", + "importer/trickle", + "io", + "mod", + "pb", + ] + pruneopts = "UT" + revision = "5fc20dbc340ea48f74d111d139b2d539d8ffa3c0" + version = "v0.0.8" + +[[projects]] + digest = "1:78438260483c355139f9d83830a88ecd69578904f0f288134d3a95786c4f0864" + name = "github.com/ipfs/go-verifcid" + packages = ["."] + pruneopts = "UT" + revision = "34e41ba962e7ce0211a05915f788486c8db755f1" + version = "v0.0.1" + +[[projects]] + digest = "1:67444125b68f4adc123856dec40308ff0ef9b01f4b6c9a935f57dae78f2d3340" + name = "github.com/ipfs/hang-fds" + packages = ["."] + pruneopts = "UT" + revision = "7a8a28f4b275d193ef56fc921f61f68b4e8d64d0" + version = "v0.0.1" + +[[projects]] + digest = "1:49a5b375c716393e801f42bd704a07f2affa1b99e00e6431bbf012e08ef25af4" + name = "github.com/ipfs/interface-go-ipfs-core" + packages = [ + ".", + "options", + "options/namesys", + "path", + "tests", + ] + pruneopts = "UT" + revision = "f77aa7ee2c521ce3361de11b4e257b01f28f8db0" + version = "v0.1.0" + +[[projects]] + digest = "1:da000e612bc16400a8a0c53dda5b78c401fd7851e7b30a977a3087e7d36d80fc" + name = "github.com/ipfs/iptb" + packages = [ + "cli", + "commands", + "testbed", + "testbed/interfaces", + "util", + ] + pruneopts = "UT" + revision = "ae2b4b3d6c9166db00a845c9e88181c0886f585b" + version = "v1.4.0" + +[[projects]] + digest = "1:aefdc6057b4c5135a4eb07aa5e9a38d0364d1a5d28d1865fec17545799819ce3" + name = "github.com/ipfs/iptb-plugins" + packages = [ + ".", + "local", + ] + pruneopts = "UT" + revision = "a1cfafa7cc11f44e35a1ae4f7f1db896b12642e5" + version = "v0.1.0" + +[[projects]] + digest = "1:b352ae8b1a77cc6b48fc8e314e34a522cfc76d6ca3a06c93b29c9cde5de6771e" + name = "github.com/jackpal/gateway" + packages = ["."] + pruneopts = "UT" + revision = "cbcf4e3f3baee7952fc386c8b2534af4d267c875" + version = "v1.0.5" + +[[projects]] + digest = "1:32b82e71cf24f8b78323e0d7903c4b90278486283965aa2a19b1ea13763b8f34" + name = "github.com/jackpal/go-nat-pmp" + packages = ["."] + pruneopts = "UT" + revision = "c9cfead9f2a36ddf3daa40ba269aa7f4bbba6b62" + version = "v1.0.1" + +[[projects]] + digest = "1:30f857b000a0d14f978110222f1b1ba9cb1de8f6cabaca51933f3627ca6578a0" + name = "github.com/jbenet/go-is-domain" + packages = ["."] + pruneopts = "UT" + revision = "009bc9fc8d69261cc21e8eb2aa0925af155d1c11" + version = "v1.0.2" + +[[projects]] + branch = "master" + digest = "1:8cec67047e352e2a6e2c4ee4ce5b9886ac435c8b86df5941a7a10253e96fc0d3" + name = "github.com/jbenet/go-random" + packages = [ + ".", + "random", + ] + pruneopts = "UT" + revision = "123a90aedc0cfa3fbac8e2854d3d3b8219d9d156" + +[[projects]] + branch = "master" + digest = "1:cf7bb5b9d6a9136537450b5af1bc76578e1b6ec9bdbea01931c9917b74c50824" + name = "github.com/jbenet/go-random-files" + packages = [ + ".", + "random-files", + "ringreader", + ] + pruneopts = "UT" + revision = "31b3f20ebded11390a052597f61b9661e6e7c9ff" + +[[projects]] + branch = "master" + digest = "1:8f4aedc183dc8dfef9a7a1f1ba205dc87ecd2675eea350a736bda889e3bcf8ea" + name = "github.com/jbenet/go-temp-err-catcher" + packages = ["."] + pruneopts = "UT" + revision = "aac704a3f4f27190b4ccc05f303a4931fd1241ff" + +[[projects]] + digest = "1:ee4b434dc3622e5c25a611ce314d40dd724495f27968797a2589a4d89eeed7eb" + name = "github.com/jbenet/goprocess" + packages = [ + ".", + "context", + "periodic", + "ratelimit", + ] + pruneopts = "UT" + revision = "7f9d9ed286badffcf2122cfeb383ec37daf92508" + version = "v0.1.3" + +[[projects]] + digest = "1:75ab90ae3f5d876167e60f493beadfe66f0ed861a710f283fb06c86437a09538" + name = "github.com/jonboulle/clockwork" + packages = ["."] + pruneopts = "UT" + revision = "2eee05ed794112d45db504eb05aa693efd2b8b09" + version = "v0.1.0" + +[[projects]] + digest = "1:15ec2166e33ef6c60b344a04d050eec79193517e7f5082b6233b2d09ef0d10b8" + name = "github.com/kisielk/gotool" + packages = [ + ".", + "internal/load", + ] + pruneopts = "UT" + revision = "80517062f582ea3340cd4baf70e86d539ae7d84d" + version = "v1.0.0" + +[[projects]] + digest = "1:31e761d97c76151dde79e9d28964a812c46efc5baee4085b86f68f0c654450de" + name = "github.com/konsorten/go-windows-terminal-sequences" + packages = ["."] + pruneopts = "UT" + revision = "f55edac94c9bbba5d6182a4be46d86a2c9b5b50e" + version = "v1.0.2" + +[[projects]] + digest = "1:58ad79834dc097c36a857a8c325d646af0a8bbd73375a6958a639507c5399a61" + name = "github.com/koron/go-ssdp" + packages = ["."] + pruneopts = "UT" + revision = "6d1709049dead37ead37808479f88c9bffa2c4d6" + version = "v0.1" + +[[projects]] + digest = "1:bdd53b87de8185da386bae179c84d4848854c6870bacacf6a154fe63e2e750f7" + name = "github.com/lib/pq" + packages = [ + ".", + "oid", + "scram", + ] + pruneopts = "UT" + revision = "bc6a3c0594130b1e34005880bc600b6d3f49fa7f" + version = "v1.1.1" + +[[projects]] + digest = "1:483fcb9b21a758b47501f8880628b85aa3c4e99e33166867d06fa278965c66b2" + name = "github.com/libp2p/go-addr-util" + packages = ["."] + pruneopts = "UT" + revision = "4cd36c0f325f9e38f1e31ff7a10b9d94d53a11cf" + version = "v0.0.1" + +[[projects]] + digest = "1:b18a269f11ff51135d6f82987dbb53288f4d66098a6639b429f4f494a910155b" + name = "github.com/libp2p/go-buffer-pool" + packages = ["."] + pruneopts = "UT" + revision = "c4a5988a1e475884367015e1a2d0bd5fa4c491f4" + version = "v0.0.2" + +[[projects]] + digest = "1:041a5219e2f0c1fa2af5d25aee6970600ba2ac055ba386c18cfe960d392df3db" + name = "github.com/libp2p/go-conn-security-multistream" + packages = ["."] + pruneopts = "UT" + revision = "09b4134a655b5fc883a5bdd62ea12db6e0a1b095" + version = "v0.1.0" + +[[projects]] + digest = "1:83d3d59c84ff3da342ab63011d79750ccb987bda399eb64db3abd3e2fd32c18f" + name = "github.com/libp2p/go-flow-metrics" + packages = ["."] + pruneopts = "UT" + revision = "1f5b3acc846b2c8ce4c4e713296af74f5c24df55" + version = "v0.0.1" + +[[projects]] + digest = "1:d19d69803c50feab0b448d60dee41a3d9bd36af71f0c4b21d3075cfe5b288441" + name = "github.com/libp2p/go-libp2p" + packages = [ + ".", + "config", + "p2p/discovery", + "p2p/host/basic", + "p2p/host/relay", + "p2p/host/routed", + "p2p/net/mock", + "p2p/protocol/identify", + "p2p/protocol/identify/pb", + "p2p/protocol/ping", + ] + pruneopts = "UT" + revision = "d69c889ad97b02883e04164c6acf77a7381634c2" + version = "v0.1.1" + +[[projects]] + digest = "1:9a8251be38a87690510affa2e2fb04799a066b8ef49edc25a6acd30760d40792" + name = "github.com/libp2p/go-libp2p-autonat" + packages = [ + ".", + "pb", + ] + pruneopts = "UT" + revision = "3464f9b4f7bfbd7bb008813eacb626c7ab7fb9a3" + version = "v0.1.0" + +[[projects]] + digest = "1:04832a4429ccc5e9d793c6c27a5807c5854a79d44a893c80cb72d0bf8dfc157f" + name = "github.com/libp2p/go-libp2p-autonat-svc" + packages = ["."] + pruneopts = "UT" + revision = "51a8fe550623e6ebae91c9b43755e2ee9c310549" + version = "v0.1.0" + +[[projects]] + digest = "1:3da4ac7b6ea1fd52a22012966d7c744715a5cabfea013be30cb0d595bcfcdd3f" + name = "github.com/libp2p/go-libp2p-circuit" + packages = [ + ".", + "pb", + ] + pruneopts = "UT" + revision = "e65c36f3bb806cf658db0f0b612879899e2d28dc" + version = "v0.1.0" + +[[projects]] + digest = "1:15ffa5302d331a56efdc24ce2570ddf32bfff89daa4e3b0fed0c453a19b4960c" + name = "github.com/libp2p/go-libp2p-connmgr" + packages = ["."] + pruneopts = "UT" + revision = "152025a671fcc297333095f8e4afc98d90b30df7" + version = "v0.1.0" + +[[projects]] + digest = "1:acd95ce094e21559ddad0985e07709d5a1c9f7f648428681b423a5360cd71c74" + name = "github.com/libp2p/go-libp2p-core" + packages = [ + "connmgr", + "crypto", + "crypto/pb", + "discovery", + "helpers", + "host", + "metrics", + "mux", + "network", + "peer", + "peerstore", + "pnet", + "protocol", + "routing", + "sec", + "sec/insecure", + "test", + "transport", + ] + pruneopts = "UT" + revision = "8f222f4b5a872d9af86f74f2ec0982c7356adce6" + version = "v0.0.3" + +[[projects]] + digest = "1:35caf66f415bddda628d9410a20a6bcd8ac3deebbda33de1220d3f7ee3a14ccd" + name = "github.com/libp2p/go-libp2p-crypto" + packages = ["."] + pruneopts = "UT" + revision = "ddb6d72b5ad0ae81bf1ee77b628eac1d7237536a" + version = "v0.1.0" + +[[projects]] + digest = "1:0333065da4682126d7c1aa07dd11d94accc3b93b48945ebb7f6a921e2f6b0db2" + name = "github.com/libp2p/go-libp2p-discovery" + packages = ["."] + pruneopts = "UT" + revision = "d248d63b0af8c023307da18ad7000a12020e06f0" + version = "v0.1.0" + +[[projects]] + digest = "1:c370faf62c81c21ad23d2a5a30e4fb0347e80460e3abcc10901a48daf0999ddc" + name = "github.com/libp2p/go-libp2p-gostream" + packages = ["."] + pruneopts = "UT" + revision = "7fcf4dd149c1d97388f362aa139db26227d54bd4" + version = "v0.1.1" + +[[projects]] + digest = "1:7811b2a796bfc81952e70d14c5bb99ac550b18b1bbf815359a4d24cfc4329481" + name = "github.com/libp2p/go-libp2p-kad-dht" + packages = [ + ".", + "metrics", + "opts", + "pb", + "providers", + ] + pruneopts = "UT" + revision = "31765355df17ef818381169dc36180c84c119928" + version = "v0.1.0" + +[[projects]] + digest = "1:d750c3b6c1c69bab8ed996ca6c053e0a13db53d2c51937a0debc40174c77bfc1" + name = "github.com/libp2p/go-libp2p-kbucket" + packages = [ + ".", + "keyspace", + ] + pruneopts = "UT" + revision = "3752ea0128fd84b4fef0a66739b8ca95c8a471b6" + version = "v0.2.0" + +[[projects]] + digest = "1:645c5ab1429b06141e0d22852df9561e04b3759380f6657f0b510a30eef83665" + name = "github.com/libp2p/go-libp2p-loggables" + packages = ["."] + pruneopts = "UT" + revision = "814642b01726ff6f9302e8ce9eeeb00d25409520" + version = "v0.1.0" + +[[projects]] + digest = "1:714ce7cff748910cfc250713300d24ece7d4832156ba7a245e7ac5fc810c7319" + name = "github.com/libp2p/go-libp2p-mplex" + packages = ["."] + pruneopts = "UT" + revision = "811729f15f0af13fe3f0d9e410c22f6a4bc5c686" + version = "v0.2.1" + +[[projects]] + digest = "1:4614c7d351b9cc24ef6457107fad9830664615bb7d7de91de10c4a4ab1919545" + name = "github.com/libp2p/go-libp2p-nat" + packages = ["."] + pruneopts = "UT" + revision = "c50c291a61bceccb914366d93eb24f58594e9134" + version = "v0.0.4" + +[[projects]] + digest = "1:2930f937f465b6801ca4a89a701a5131aa215a6a854b0e7c344d6d62960d2563" + name = "github.com/libp2p/go-libp2p-netutil" + packages = ["."] + pruneopts = "UT" + revision = "cd42ce60b36206032242a27faa1121c08ae2829e" + version = "v0.1.0" + +[[projects]] + digest = "1:79d1cf3e88f9ae667c30039cc37a6ad0be8bf0fa9b5359b572253de74b24c644" + name = "github.com/libp2p/go-libp2p-peer" + packages = ["."] + pruneopts = "UT" + revision = "62676d8fb785a8fc279878cbe8e03b878f005910" + version = "v0.2.0" + +[[projects]] + digest = "1:9a42e258de3b7daa00e2a3499bfa34185fb0c94b31cfa12a0f85f9105ebf8072" + name = "github.com/libp2p/go-libp2p-peerstore" + packages = [ + ".", + "addr", + "pstoremem", + "queue", + ] + pruneopts = "UT" + revision = "4353646945045d89f77d0b362cb5e5533cbd117e" + version = "v0.1.0" + +[[projects]] + digest = "1:576fc983d8a7fae4f2d03f8bfcfee6c2b062b70fee73cb10cc6a7531445ba998" + name = "github.com/libp2p/go-libp2p-pnet" + packages = ["."] + pruneopts = "UT" + revision = "f0a2f186a5c972b76b55680d5ef21894491c2f81" + version = "v0.1.0" + +[[projects]] + digest = "1:639e2ee83cffd5445eeffd1cb8ba50b690028dc98464abac24e93a15abca8c8b" + name = "github.com/libp2p/go-libp2p-pubsub" + packages = [ + ".", + "pb", + ] + pruneopts = "UT" + revision = "49274b0e8aecdf6cad59d768e5702ff00aa48488" + version = "v0.1.0" + +[[projects]] + digest = "1:d1eeaaf0f74ecb34eb30a48fd20347cf5b3df17ca822e3a99e23100922072b31" + name = "github.com/libp2p/go-libp2p-pubsub-router" + packages = ["."] + pruneopts = "UT" + revision = "1b619f8d12950c3a6b91f93c08f29842af38a68c" + version = "v0.1.0" + +[[projects]] + digest = "1:0e004b6b20f295a4e3a0e11e0644b3cb05beb5011c751f52cb088bc6d15ba94c" + name = "github.com/libp2p/go-libp2p-quic-transport" + packages = ["."] + pruneopts = "UT" + revision = "2abd270a64ebf0e3b869ee6bc7a1e5ac8b001fe6" + version = "v0.1.1" + +[[projects]] + digest = "1:524733c74ff3b3fad069dbfda7b21c532c2411125b5bd60a7560f90cdbf82eab" + name = "github.com/libp2p/go-libp2p-record" + packages = [ + ".", + "pb", + ] + pruneopts = "UT" + revision = "4837430afd8f3864d4805d7a1675521abb1096b4" + version = "v0.1.0" + +[[projects]] + digest = "1:ab8374423f8b7148d55e6d7ec848d248a0707b2af8a8b8a5b3608887d9ec485d" + name = "github.com/libp2p/go-libp2p-routing" + packages = ["notifications"] + pruneopts = "UT" + revision = "f4ece6c1baa8e77ee488b25014fcb1059955ed0f" + version = "v0.1.0" + +[[projects]] + digest = "1:62994932ddbe31d1130589fb009538831afec171c787677a570cc9eba0dd96fe" + name = "github.com/libp2p/go-libp2p-routing-helpers" + packages = ["."] + pruneopts = "UT" + revision = "061228ae05eb858e5d99d80e96920a6de1df497a" + version = "v0.1.0" + +[[projects]] + digest = "1:d0bed92a182074cefb3f2e1beb5d250618ab38b2fb2dbcaf0496c20c77acf8da" + name = "github.com/libp2p/go-libp2p-secio" + packages = [ + ".", + "pb", + ] + pruneopts = "UT" + revision = "a158134b5708e33fa36545d8ba8e27ea1c8ae54e" + version = "v0.1.0" + +[[projects]] + digest = "1:112a23330f359f603c21f42d0917245829807671b8e819ff0397d73966df8195" + name = "github.com/libp2p/go-libp2p-swarm" + packages = [ + ".", + "testing", + ] + pruneopts = "UT" + revision = "99831444e78c8f23c9335c17d8f7c700ba25ca14" + version = "v0.1.0" + +[[projects]] + digest = "1:c639dcba227173d259cfd5e0ceb23df301eeddb1ce944fa1a72b60fd6f37d93d" + name = "github.com/libp2p/go-libp2p-testing" + packages = [ + "ci", + "ci/travis", + "etc", + "net", + ] + pruneopts = "UT" + revision = "6d4ca71943f35271918e28f9a9950002e17b4f16" + version = "v0.0.4" + +[[projects]] + digest = "1:af731b7005639d582a0353c22651e94d08d3970abfdddac742c9fad94b85bfd1" + name = "github.com/libp2p/go-libp2p-tls" + packages = ["."] + pruneopts = "UT" + revision = "d1a46ca5425197316b94a31953df645adaa21f67" + version = "v0.1.0" + +[[projects]] + digest = "1:2fcb80000123d80148ce210a053a226d52dc891419905d7ff076c164825da50d" + name = "github.com/libp2p/go-libp2p-transport-upgrader" + packages = ["."] + pruneopts = "UT" + revision = "07ed92ccf9aba3a2e4b2fddc4c17ced060524922" + version = "v0.1.1" + +[[projects]] + digest = "1:c476d8c20126fdc217055de367da2a8c4d78da52bf0818dedd6c92e87795021c" + name = "github.com/libp2p/go-libp2p-yamux" + packages = ["."] + pruneopts = "UT" + revision = "a61e80cb5770aa0d9b1bafe94da1278f58baa2c5" + version = "v0.2.1" + +[[projects]] + digest = "1:986c0c852c462da2cdc5d584dc2fd884cb898371cbc43cdc250149f40f8cd8fc" + name = "github.com/libp2p/go-maddr-filter" + packages = ["."] + pruneopts = "UT" + revision = "e3cdd802c04babcbec2c4711721d105cfe822cd3" + version = "v0.0.4" + +[[projects]] + digest = "1:fd01fc96631a63d323f17fcbd64161804439855404b9405db14deacba9e1b69c" + name = "github.com/libp2p/go-mplex" + packages = ["."] + pruneopts = "UT" + revision = "62fe9554facaec3f80333b61ea8d694fe615705f" + version = "v0.1.0" + +[[projects]] + digest = "1:fd524b598a7aa769d2bb5f0a6e5de4b95989070cf65ff100b87523fc2be7b9dc" + name = "github.com/libp2p/go-msgio" + packages = ["."] + pruneopts = "UT" + revision = "90cce7933451e8b170cf5d5a3627fd2950d155fd" + version = "v0.0.3" + +[[projects]] + digest = "1:82e0411449d8af0c34e200cd6b90e70689d692d17f836906194fa9fc28692e80" + name = "github.com/libp2p/go-nat" + packages = ["."] + pruneopts = "UT" + revision = "d13fdefb3bbb2fde2c6fc090a7ea992cec8b26df" + version = "v0.0.3" + +[[projects]] + digest = "1:3218d9edf75d814d2994ce4b14fae01c657a3284af84522efcc8dee89806f4ca" + name = "github.com/libp2p/go-reuseport" + packages = ["."] + pruneopts = "UT" + revision = "3e6d618acfdfacbbeff71cb2bd70fc188f897a0f" + version = "v0.0.1" + +[[projects]] + digest = "1:bf12fbd51fb864c9e2cb688581d3c14551a8c3d1c2fa60c9ad405c532e1b9d42" + name = "github.com/libp2p/go-reuseport-transport" + packages = ["."] + pruneopts = "UT" + revision = "c7583c88df654a2ecd621e863f661783d79b64d1" + version = "v0.0.2" + +[[projects]] + digest = "1:58a6c4b9e52e298228703f9bf480d65c40ede7152a9ad17aa1eafe618ed0b43a" + name = "github.com/libp2p/go-stream-muxer-multistream" + packages = ["."] + pruneopts = "UT" + revision = "2439b02deee2de8bb1fe24473d3d8333008a714a" + version = "v0.2.0" + +[[projects]] + digest = "1:ac5ce11098023fcf8164307727a2b99d69e2bb84a3b1f4bc3e1d10fd72f9bdbd" + name = "github.com/libp2p/go-tcp-transport" + packages = ["."] + pruneopts = "UT" + revision = "415627e90148700bf97890e54b193a42125c3b66" + version = "v0.1.0" + +[[projects]] + digest = "1:b1436d41d493ff2d51052838e0415c26366314febead5051f732f5c98e3729f1" + name = "github.com/libp2p/go-ws-transport" + packages = ["."] + pruneopts = "UT" + revision = "6efd965516262a6b6e46ea987b94904ef13e59bc" + version = "v0.1.0" + +[[projects]] + digest = "1:64fdef1e970d17504d960d18412125e85ca620703e495105b3fbffee27acf568" + name = "github.com/libp2p/go-yamux" + packages = ["."] + pruneopts = "UT" + revision = "663972181d409e7263040f0b668462f87c85e1bd" + version = "v1.2.3" + +[[projects]] + digest = "1:95de854fb72e6cd0344b875a04abace9abbef78c304c4f31b451bbedd9023338" + name = "github.com/lucas-clemente/quic-go" + packages = [ + ".", + "internal/ackhandler", + "internal/congestion", + "internal/flowcontrol", + "internal/handshake", + "internal/protocol", + "internal/qerr", + "internal/utils", + "internal/wire", + ] + pruneopts = "UT" + revision = "4355e1a7e961ba3b6005cb035ae17732181c9508" + version = "v0.11.2" + +[[projects]] + digest = "1:5a0ef768465592efca0412f7e838cdc0826712f8447e70e6ccc52eb441e9ab13" + name = "github.com/magiconair/properties" + packages = ["."] + pruneopts = "UT" + revision = "de8848e004dd33dc07a2947b3d76f618a7fc7ef1" + version = "v1.8.1" + +[[projects]] + digest = "1:9d377b8e6748a813a7fb25e99bf54bfaefba62eac5bf5152c2657f95dbe83172" + name = "github.com/marten-seemann/qtls" + packages = ["."] + pruneopts = "UT" + revision = "cd359ef406f82ab779fea7db4c512898eb3007a6" + version = "v0.2.4" + +[[projects]] + digest = "1:7c084e0e780596dd2a7e20d25803909a9a43689c153de953520dfbc0b0e51166" + name = "github.com/mattn/go-colorable" + packages = ["."] + pruneopts = "UT" + revision = "8029fb3788e5a4a9c00e415f586a6d033f5d38b3" + version = "v0.1.2" + +[[projects]] + digest = "1:9b90c7639a41697f3d4ad12d7d67dfacc9a7a4a6e0bbfae4fc72d0da57c28871" + name = "github.com/mattn/go-isatty" + packages = ["."] + pruneopts = "UT" + revision = "1311e847b0cb909da63b5fecfb5370aa66236465" + version = "v0.0.8" + +[[projects]] + digest = "1:0356f3312c9bd1cbeda81505b7fd437501d8e778ab66998ef69f00d7f9b3a0d7" + name = "github.com/mattn/go-runewidth" + packages = ["."] + pruneopts = "UT" + revision = "3ee7d812e62a0804a7d0a324e0249ca2db3476d3" + version = "v0.0.4" + +[[projects]] + digest = "1:ff5ebae34cfbf047d505ee150de27e60570e8c394b3b8fdbb720ff6ac71985fc" + name = "github.com/matttproud/golang_protobuf_extensions" + packages = ["pbutil"] + pruneopts = "UT" + revision = "c12348ce28de40eed0136aa2b644d0ee0650e56c" + version = "v1.0.1" + +[[projects]] + branch = "master" + digest = "1:2b32af4d2a529083275afc192d1067d8126b578c7a9613b26600e4df9c735155" + name = "github.com/mgutz/ansi" + packages = ["."] + pruneopts = "UT" + revision = "9520e82c474b0a04dd04f8a40959027271bab992" + +[[projects]] + digest = "1:7c572c76f914b3d3f7d75ce752c3a6ac5ba03be1f775e4602a3f18d7b08ddbbb" + name = "github.com/miekg/dns" + packages = ["."] + pruneopts = "UT" + revision = "9cfcfb2209aecb663673bd44b11f71c215186b80" + version = "v1.1.14" + +[[projects]] + branch = "master" + digest = "1:130cefe87d7eeefc824978dcb78e35672d4c49a11f25c153fbf0cfd952756fa3" + name = "github.com/minio/blake2b-simd" + packages = ["."] + pruneopts = "UT" + revision = "3f5f724cb5b182a5c278d6d3d55b40e7f8c2efb4" + +[[projects]] + digest = "1:d69117243f58a0d320c2889872d8c14d323d865277dc49fc85bfcf48b2846b8f" + name = "github.com/minio/sha256-simd" + packages = ["."] + pruneopts = "UT" + revision = "05b4dd3047e5d6e86cb4e0477164b850cd896261" + version = "v0.1.0" + +[[projects]] + digest = "1:5d231480e1c64a726869bc4142d270184c419749d34f167646baa21008eb0a79" + name = "github.com/mitchellh/go-homedir" + packages = ["."] + pruneopts = "UT" + revision = "af06845cf3004701891bf4fdb884bfe4920b3727" + version = "v1.1.0" + +[[projects]] + digest = "1:53bc4cd4914cd7cd52139990d5170d6dc99067ae31c56530621b18b35fc30318" + name = "github.com/mitchellh/mapstructure" + packages = ["."] + pruneopts = "UT" + revision = "3536a929edddb9a5b34bd6861dc4a9647cb459fe" + version = "v1.1.2" + +[[projects]] + branch = "master" + digest = "1:ae08d850ba158ea3ba4a7bb90f8372608172d8920644e5a6693b940a1f4e5d01" + name = "github.com/mmcloughlin/avo" + packages = [ + "attr", + "build", + "buildtags", + "gotypes", + "internal/prnt", + "internal/stack", + "ir", + "operand", + "pass", + "printer", + "reg", + "src", + "x86", + ] + pruneopts = "UT" + revision = "83fbad1a6b3cba8ac7711170e57953fd12cdc40a" + +[[projects]] + digest = "1:b6299badabd66eaede0651e2eaede106d8298b25564e4a7f23e335471d3e5a35" + name = "github.com/mr-tron/base58" + packages = ["base58"] + pruneopts = "UT" + revision = "d504ab2e22d97cb9f10b1d146a1e6a063f4a5f43" + version = "v1.1.2" + +[[projects]] + digest = "1:b9fe622bbadbb060338620752b1cb3aa1473855071195ebe83813af5ebb3629b" + name = "github.com/multiformats/go-base32" + packages = ["."] + pruneopts = "UT" + revision = "a9c2755c3d1672dbe6a7e4a5d182169fa30b6a8e" + version = "v0.0.3" + +[[projects]] + digest = "1:c95537699dfc9ecc62c2bb273fd2fdf5810ce23ed50f25529c17f755a052a7c3" + name = "github.com/multiformats/go-multiaddr" + packages = ["."] + pruneopts = "UT" + revision = "5b1de2f51ff2368d5ce94a659f15ef26be273cd0" + version = "v0.0.4" + +[[projects]] + digest = "1:e7b7007612b49b368d5b505b624b399a1de5fe2764271b92145aa9ca0440ab4e" + name = "github.com/multiformats/go-multiaddr-dns" + packages = ["."] + pruneopts = "UT" + revision = "e7c544d7a325c57bdbd7e9ba9c035a6701c5c7d2" + version = "v0.0.2" + +[[projects]] + digest = "1:1275cf8587ba416c439453ee4b194b803270b836831c487b3da3cf9d82f58bb7" + name = "github.com/multiformats/go-multiaddr-fmt" + packages = ["."] + pruneopts = "UT" + revision = "7d8102a98552c80f8a5ccb9c01e670fac17fd6df" + version = "v0.0.1" + +[[projects]] + digest = "1:ccb950e76138c70abe765c3b9c0e6cad0e55fc66ff53318cea8b651df9f892c7" + name = "github.com/multiformats/go-multiaddr-net" + packages = ["."] + pruneopts = "UT" + revision = "bd61b0499a3cfc893a8eb109c5669342b1671881" + version = "v0.0.1" + +[[projects]] + digest = "1:8f2a32f6d211bf2685d5c47ace5d6b59bd4359f69e92b632793d066129a65c4e" + name = "github.com/multiformats/go-multibase" + packages = ["."] + pruneopts = "UT" + revision = "d63641945dc1749baa23686ad0564ad63fef0493" + version = "v0.0.1" + +[[projects]] + digest = "1:5769b15a01346046ca7a66e2205326e0d5efcf7c4e2d116fcd26b6c8910c6872" + name = "github.com/multiformats/go-multihash" + packages = [ + ".", + "multihash", + "opts", + ] + pruneopts = "UT" + revision = "c242156eec223a58ac13b8c114a2b31e87bbf558" + version = "v0.0.5" + +[[projects]] + digest = "1:026ef80e6db7432132c7687d23b465e0c4bdb47a4aed893ee4b7d528a0550059" + name = "github.com/multiformats/go-multistream" + packages = ["."] + pruneopts = "UT" + revision = "039807e4901c4b2041f40a0e4aa32d72939608aa" + version = "v0.1.0" + +[[projects]] + digest = "1:66b0a65aba488ca6c72f77132d5b8d7e2c5baf07d577dee64502b69a2c90c791" + name = "github.com/nbutton23/zxcvbn-go" + packages = [ + ".", + "adjacency", + "data", + "entropy", + "frequency", + "match", + "matching", + "scoring", + "utils/math", + ] + pruneopts = "UT" + revision = "eafdab6b0663b4b528c35975c8b0e78be6e25261" + version = "v0.1" + +[[projects]] + digest = "1:11e62d6050198055e6cd87ed57e5d8c669e84f839c16e16f192374d913d1a70d" + name = "github.com/opentracing/opentracing-go" + packages = [ + ".", + "ext", + "log", + ] + pruneopts = "UT" + revision = "659c90643e714681897ec2521c60567dd21da733" + version = "v1.1.0" + +[[projects]] + digest = "1:93131d8002d7025da13582877c32d1fc302486775a1b06f62241741006428c5e" + name = "github.com/pelletier/go-toml" + packages = ["."] + pruneopts = "UT" + revision = "728039f679cbcd4f6a54e080d2219a4c4928c546" + version = "v1.4.0" + +[[projects]] + digest = "1:cf31692c14422fa27c83a05292eb5cbe0fb2775972e8f1f8446a71549bd8980b" + name = "github.com/pkg/errors" + packages = ["."] + pruneopts = "UT" + revision = "ba968bfe8b2f7e042a574c888954fccecfa385b4" + version = "v0.8.1" + +[[projects]] + branch = "master" + digest = "1:13e3ecd0eb9145fd62bebcc8fb8334b20408f31da7be3cacb68b5abcd09a1f42" + name = "github.com/polydawn/refmt" + packages = [ + ".", + "cbor", + "json", + "obj", + "obj/atlas", + "pretty", + "shared", + "tok", + ] + pruneopts = "UT" + revision = "01bf1e26dd14f9b71f26b7005a2b1ef514d5f9a4" + +[[projects]] + digest = "1:e89f2cdede55684adbe44b5566f55838ad2aee1dff348d14b73ccf733607b671" + name = "github.com/prometheus/client_golang" + packages = [ + "prometheus", + "prometheus/internal", + "prometheus/promhttp", + ] + pruneopts = "UT" + revision = "2641b987480bca71fb39738eb8c8b0d577cb1d76" + version = "v0.9.4" + +[[projects]] + branch = "master" + digest = "1:2d5cd61daa5565187e1d96bae64dbbc6080dacf741448e9629c64fd93203b0d4" + name = "github.com/prometheus/client_model" + packages = ["go"] + pruneopts = "UT" + revision = "fd36f4220a901265f90734c3183c5f0c91daa0b8" + +[[projects]] + digest = "1:8dcedf2e8f06c7f94e48267dea0bc0be261fa97b377f3ae3e87843a92a549481" + name = "github.com/prometheus/common" + packages = [ + "expfmt", + "internal/bitbucket.org/ww/goautoneg", + "model", + ] + pruneopts = "UT" + revision = "17f5ca1748182ddf24fc33a5a7caaaf790a52fcc" + version = "v0.4.1" + +[[projects]] + digest = "1:403b810b43500b5b0a9a24a47347e31dc2783ccae8cf97c891b46f5b0496fa1a" + name = "github.com/prometheus/procfs" + packages = [ + ".", + "internal/fs", + ] + pruneopts = "UT" + revision = "833678b5bb319f2d20a475cb165c6cc59c2cc77c" + version = "v0.0.2" + +[[projects]] + digest = "1:b0c25f00bad20d783d259af2af8666969e2fc343fa0dc9efe52936bbd67fb758" + name = "github.com/rs/cors" + packages = ["."] + pruneopts = "UT" + revision = "9a47f48565a795472d43519dd49aac781f3034fb" + version = "v1.6.0" + +[[projects]] + digest = "1:04457f9f6f3ffc5fea48e71d62f2ca256637dee0a04d710288e27e05c8b41976" + name = "github.com/sirupsen/logrus" + packages = ["."] + pruneopts = "UT" + revision = "839c75faf7f98a33d445d181f3018b5c3409a45e" + version = "v1.4.2" + +[[projects]] + digest = "1:f0be8922b4a34a3e07caef4c8bcb9377713af6edf3b7cb9ded42f095b7994374" + name = "github.com/sourcegraph/go-diff" + packages = ["diff"] + pruneopts = "UT" + revision = "042635e6444e67483d777aaa240274f13691500c" + version = "v0.5.1" + +[[projects]] + branch = "master" + digest = "1:74aa99ef18406ebfdedfb2a07b9a01f9ff2b6d2547b27b33fcdf1007223d75cc" + name = "github.com/spacemonkeygo/openssl" + packages = [ + ".", + "utils", + ] + pruneopts = "UT" + revision = "c2dcc5cca94ac8f7f3f0c20e20050d4cce9d9730" + +[[projects]] + branch = "master" + digest = "1:d6956eb95db39859627c18e1dd425b2ddd1a0d6000b643a4d4ada8fc887c1e09" + name = "github.com/spacemonkeygo/spacelog" + packages = ["."] + pruneopts = "UT" + revision = "2296661a0572a51438413369004fa931c2641923" + +[[projects]] + digest = "1:919bb3aa6d9d0b67648c219fa4925312bc3c2872da19e818fa769e9c97a2b643" + name = "github.com/spaolacci/murmur3" + packages = ["."] + pruneopts = "UT" + revision = "9f5d223c60793748f04a9d5b4b4eacddfc1f755d" + version = "v1.1" + +[[projects]] + digest = "1:bb495ec276ab82d3dd08504bbc0594a65de8c3b22c6f2aaa92d05b73fbf3a82e" + name = "github.com/spf13/afero" + packages = [ + ".", + "mem", + ] + pruneopts = "UT" + revision = "588a75ec4f32903aa5e39a2619ba6a4631e28424" + version = "v1.2.2" + +[[projects]] + digest = "1:08d65904057412fc0270fc4812a1c90c594186819243160dc779a402d4b6d0bc" + name = "github.com/spf13/cast" + packages = ["."] + pruneopts = "UT" + revision = "8c9545af88b134710ab1cd196795e7f2388358d7" + version = "v1.3.0" + +[[projects]] + digest = "1:e096613fb7cf34743d49af87d197663cfccd61876e2219853005a57baedfa562" + name = "github.com/spf13/cobra" + packages = ["."] + pruneopts = "UT" + revision = "f2b07da1e2c38d5f12845a4f607e2e1018cbb1f5" + version = "v0.0.5" + +[[projects]] + digest = "1:1b753ec16506f5864d26a28b43703c58831255059644351bbcb019b843950900" + name = "github.com/spf13/jwalterweatherman" + packages = ["."] + pruneopts = "UT" + revision = "94f6ae3ed3bceceafa716478c5fbf8d29ca601a1" + version = "v1.1.0" + +[[projects]] + digest = "1:c1b1102241e7f645bc8e0c22ae352e8f0dc6484b6cb4d132fa9f24174e0119e2" + name = "github.com/spf13/pflag" + packages = ["."] + pruneopts = "UT" + revision = "298182f68c66c05229eb03ac171abe6e309ee79a" + version = "v1.0.3" + +[[projects]] + digest = "1:11118bd196646c6515fea3d6c43f66162833c6ae4939bfb229b9956d91c6cf17" + name = "github.com/spf13/viper" + packages = ["."] + pruneopts = "UT" + revision = "b5bf975e5823809fb22c7644d008757f78a4259e" + version = "v1.4.0" + +[[projects]] + digest = "1:5b180f17d5bc50b765f4dcf0d126c72979531cbbd7f7929bf3edd87fb801ea2d" + name = "github.com/syndtr/goleveldb" + packages = [ + "leveldb", + "leveldb/cache", + "leveldb/comparer", + "leveldb/errors", + "leveldb/filter", + "leveldb/iterator", + "leveldb/journal", + "leveldb/memdb", + "leveldb/opt", + "leveldb/storage", + "leveldb/table", + "leveldb/util", + ] + pruneopts = "UT" + revision = "9d007e481048296f09f59bd19bb7ae584563cd95" + version = "v1.0.0" + +[[projects]] + branch = "master" + digest = "1:a38c75e7edd595bbaa03334c1ac26163a5e990d81f05cd9ec5fd0edc9c786078" + name = "github.com/texttheater/golang-levenshtein" + packages = ["levenshtein"] + pruneopts = "UT" + revision = "d188e65d659ef53fcdb0691c12f1bba64928b649" + +[[projects]] + branch = "master" + digest = "1:7393233424f587db9c11ea3b74c57e4955b47e4ba1b76ab5ea940b672a1263fb" + name = "github.com/timakin/bodyclose" + packages = ["passes/bodyclose"] + pruneopts = "UT" + revision = "4a873e97b2bb302885fe7592c4b2d5749cc62985" + +[[projects]] + digest = "1:b24d38b282bacf9791408a080f606370efa3d364e4b5fd9ba0f7b87786d3b679" + name = "github.com/urfave/cli" + packages = ["."] + pruneopts = "UT" + revision = "cfb38830724cc34fedffe9a2a29fb54fa9169cd1" + version = "v1.20.0" + +[[projects]] + branch = "master" + digest = "1:98fa13beefbf581ec173561adad6374c460631593b4bdcf03adc29cd18e5d2f5" + name = "github.com/whyrusleeping/base32" + packages = ["."] + pruneopts = "UT" + revision = "c30ac30633ccdabefe87eb12465113f06f1bab75" + +[[projects]] + branch = "master" + digest = "1:3ca7e47848bbb8fc6c17b86c9887117e2e83dd5d68f7c4daf8c8fd30471ea597" + name = "github.com/whyrusleeping/chunker" + packages = ["."] + pruneopts = "UT" + revision = "fe64bd25879f446bb7e8a4adf5d4a68552211bd3" + +[[projects]] + branch = "master" + digest = "1:b33eed6794f2b2d1a7d0b45cb705402f26af0f0ad6521667e144ffa71f52d9d9" + name = "github.com/whyrusleeping/go-keyspace" + packages = ["."] + pruneopts = "UT" + revision = "5b898ac5add1da7178a4a98e69cb7b9205c085ee" + +[[projects]] + branch = "master" + digest = "1:0102dfa2f98777db8ff68c920bef1be3ff8504e90485b6cdd24d61b981b487b6" + name = "github.com/whyrusleeping/go-logging" + packages = ["."] + pruneopts = "UT" + revision = "0457bb6b88fc1973573aaf6b5145d8d3ae972390" + +[[projects]] + branch = "master" + digest = "1:94796f9decedb46b17985693cbe996ce3642a991f0efcf7bf9a6c5197da3eefc" + name = "github.com/whyrusleeping/go-notifier" + packages = ["."] + pruneopts = "UT" + revision = "097c5d47330ff6a823f67e3515faa13566a62c6f" + +[[projects]] + branch = "master" + digest = "1:2fba6c6f47871875d89473514217f2e32380f72373ece98c10c93807981f35db" + name = "github.com/whyrusleeping/go-sysinfo" + packages = ["."] + pruneopts = "UT" + revision = "4a357d4b90b11a6fd867fdb51c21d686645830c2" + +[[projects]] + digest = "1:6c96967502c55c555abfe560f561a124951345e713a8e87cc6e2c214976e6e75" + name = "github.com/whyrusleeping/mafmt" + packages = ["."] + pruneopts = "UT" + revision = "7aa7fad2ede4e7157818e3e7af5061f866a9ae23" + version = "v1.2.8" + +[[projects]] + branch = "master" + digest = "1:0a017705731cb8ad506e72d842840ba89809e5b27b5593954c7eeeb631823735" + name = "github.com/whyrusleeping/mdns" + packages = ["."] + pruneopts = "UT" + revision = "ef14215e6b30606f4ce84174ed7a644a05cb1af3" + +[[projects]] + branch = "master" + digest = "1:94b933c1b26f1da25d25a089937d15987170a0a54109aa521a111345c3e84581" + name = "github.com/whyrusleeping/multiaddr-filter" + packages = ["."] + pruneopts = "UT" + revision = "e903e4adabd70b78bc9293b6ee4f359afb3f9f59" + +[[projects]] + branch = "master" + digest = "1:dc9bda956375dc82dacd2a78f32095aae7c6e40c676b2f971357ccb76cbf46c2" + name = "github.com/whyrusleeping/sql-datastore" + packages = [ + ".", + "postgres", + ] + pruneopts = "UT" + revision = "b24eb8d0ce144e31120c0708b0c987362d63c1a0" + +[[projects]] + branch = "master" + digest = "1:e2599924072678810fe41b00dead8e11e95fa55be2dbc01b5309c4bf04f2209c" + name = "github.com/whyrusleeping/tar-utils" + packages = ["."] + pruneopts = "UT" + revision = "8c6c8ba81d5c71fd69c0f48dbde4b2fb422b6dfc" + +[[projects]] + branch = "master" + digest = "1:1ccd9d66ae1abe6b3b28d8b68e09387533fee345d8bbaa753af2fa16e0505807" + name = "github.com/whyrusleeping/timecache" + packages = ["."] + pruneopts = "UT" + revision = "cfcb2f1abfee846c430233aef0b630a946e0a5a6" + +[[projects]] + digest = "1:0509a2e8721ffedf3c03ebed1ac8eda633b8f4ee812d5edcac5c5d77eaeb7f0d" + name = "go.opencensus.io" + packages = [ + "internal/tagencoding", + "metric/metricdata", + "metric/metricproducer", + "resource", + "stats", + "stats/internal", + "stats/view", + "tag", + ] + pruneopts = "UT" + revision = "9c377598961b706d1542bd2d84d538b5094d596e" + version = "v0.22.0" + +[[projects]] + digest = "1:ff6b126259880858441d0a43e63c3f2f9071601415e1f34a7f053f90cbef8464" + name = "go.uber.org/atomic" + packages = ["."] + pruneopts = "UT" + revision = "3b8db5e93c4c02efbc313e17b2e796b0914a01fb" + version = "v1.1.0" + +[[projects]] + digest = "1:2773e4e922e5af534775962ffef08770b8114e177590f7605886528d37417105" + name = "go.uber.org/dig" + packages = [ + ".", + "internal/digreflect", + "internal/dot", + ] + pruneopts = "UT" + revision = "7ff117f761a3f1b3eb521945c17a1091438eb6de" + version = "v1.7.0" + +[[projects]] + digest = "1:74e59bc785a76b467b9a5c0353193e8befa0c27863413e5fc52e87cf3d24fa4e" + name = "go.uber.org/fx" + packages = [ + ".", + "internal/fxlog", + "internal/fxreflect", + "internal/lifecycle", + ] + pruneopts = "UT" + revision = "3de044da969b90ad0a3e4a7867a74662f645f3f9" + version = "v1.9.0" + +[[projects]] + digest = "1:60bf2a5e347af463c42ed31a493d817f8a72f102543060ed992754e689805d1a" + name = "go.uber.org/multierr" + packages = ["."] + pruneopts = "UT" + revision = "3c4937480c32f4c13a875a1829af76c98ca3d40a" + version = "v1.1.0" + +[[projects]] + branch = "master" + digest = "1:52796c672f9529f506ac63c10bf44072c8156cb2c85c0784a8b8ccb164e94903" + name = "go4.org" + packages = ["lock"] + pruneopts = "UT" + revision = "94abd6928b1da39b1d757b60c93fb2419c409fa1" + +[[projects]] + branch = "master" + digest = "1:b7289611803360021aa5fe4469d9ff38eab6b6fa9898af160fc218d3edbbd1a6" + name = "golang.org/x/crypto" + packages = [ + "blake2s", + "blowfish", + "chacha20poly1305", + "cryptobyte", + "cryptobyte/asn1", + "curve25519", + "ed25519", + "ed25519/internal/edwards25519", + "hkdf", + "internal/chacha20", + "internal/subtle", + "poly1305", + "salsa20", + "salsa20/salsa", + "sha3", + "ssh/terminal", + ] + pruneopts = "UT" + revision = "5c40567a22f818bd14a1ea7245dad9f8ef0691aa" + +[[projects]] + branch = "master" + digest = "1:c094df8a7b79d5c6ddc9035b13516f5bf1d7516e785d1c57a6f9d6a1d0efe3ff" + name = "golang.org/x/net" + packages = [ + "bpf", + "context", + "html", + "html/atom", + "html/charset", + "internal/iana", + "internal/socket", + "internal/timeseries", + "ipv4", + "ipv6", + "trace", + ] + pruneopts = "UT" + revision = "3f473d35a33aa6fdd203e306dc439b797820e3f1" + +[[projects]] + branch = "master" + digest = "1:8ea0513faaf49c2491a6aa1c4962261295ed140478e3e84b5c699f42af0a3936" + name = "golang.org/x/sys" + packages = [ + "cpu", + "unix", + "windows", + ] + pruneopts = "UT" + revision = "93c9922d18aeb82498a065f07aec7ad7fa60dfb7" + +[[projects]] + digest = "1:a8790d49ff0b71048aa8170d2863918f9d22e74293ca92b90333c05a40514a84" + name = "golang.org/x/text" + packages = [ + "encoding", + "encoding/charmap", + "encoding/htmlindex", + "encoding/internal", + "encoding/internal/identifier", + "encoding/japanese", + "encoding/korean", + "encoding/simplifiedchinese", + "encoding/traditionalchinese", + "encoding/unicode", + "internal/gen", + "internal/language", + "internal/language/compact", + "internal/tag", + "internal/triegen", + "internal/ucd", + "internal/utf8internal", + "language", + "runes", + "transform", + "unicode/cldr", + "unicode/norm", + "width", + ] + pruneopts = "UT" + revision = "342b2e1fbaa52c93f31447ad2c6abc048c63e475" + version = "v0.3.2" + +[[projects]] + branch = "master" + digest = "1:319e7521886d58092551020028e8ddb691d5bd756f1ab58baa033e0ff3ff6c30" + name = "golang.org/x/tools" + packages = [ + "cover", + "go/analysis", + "go/analysis/passes/asmdecl", + "go/analysis/passes/assign", + "go/analysis/passes/atomic", + "go/analysis/passes/atomicalign", + "go/analysis/passes/bools", + "go/analysis/passes/buildssa", + "go/analysis/passes/buildtag", + "go/analysis/passes/cgocall", + "go/analysis/passes/composite", + "go/analysis/passes/copylock", + "go/analysis/passes/ctrlflow", + "go/analysis/passes/httpresponse", + "go/analysis/passes/inspect", + "go/analysis/passes/internal/analysisutil", + "go/analysis/passes/loopclosure", + "go/analysis/passes/lostcancel", + "go/analysis/passes/nilfunc", + "go/analysis/passes/printf", + "go/analysis/passes/shadow", + "go/analysis/passes/shift", + "go/analysis/passes/stdmethods", + "go/analysis/passes/structtag", + "go/analysis/passes/tests", + "go/analysis/passes/unmarshal", + "go/analysis/passes/unreachable", + "go/analysis/passes/unsafeptr", + "go/analysis/passes/unusedresult", + "go/ast/astutil", + "go/ast/inspector", + "go/buildutil", + "go/cfg", + "go/gcexportdata", + "go/internal/cgo", + "go/internal/gcimporter", + "go/internal/packagesdriver", + "go/loader", + "go/packages", + "go/ssa", + "go/ssa/ssautil", + "go/types/typeutil", + "imports", + "internal/fastwalk", + "internal/gopathwalk", + "internal/imports", + "internal/module", + "internal/semver", + ] + pruneopts = "UT" + revision = "d73e1c7e250b19f9948138e2df37cea712e8f06f" + +[[projects]] + branch = "master" + digest = "1:c44a77760372a998be8d4656e8d3c865f68735ec4cad1743a245903a58f64249" + name = "golang.org/x/xerrors" + packages = [ + ".", + "internal", + ] + pruneopts = "UT" + revision = "3ee3066db522c6628d440a3a91c4abdd7f5ef22f" + +[[projects]] + digest = "1:d219400f09c151f0ada918bab650ef46f7ebdb1ff4fea923fdcb839481ec7ec1" + name = "gopkg.in/cheggaaa/pb.v1" + packages = ["."] + pruneopts = "UT" + revision = "f907f6f5dd81f77c2bbc1cde92e4c5a04720cb11" + version = "v1.0.28" + +[[projects]] + digest = "1:4d2e5a73dc1500038e504a8d78b986630e3626dc027bc030ba5c75da257cdb96" + name = "gopkg.in/yaml.v2" + packages = ["."] + pruneopts = "UT" + revision = "51d6538a90f86fe93ac480b35f37b2be17fef232" + version = "v2.2.2" + +[[projects]] + digest = "1:7ee7d5148e71f169ebba5fa35fc04bf6e9224f91a7d054483a97e56f9bda9ea7" + name = "gotest.tools/gotestsum" + packages = [ + ".", + "internal/junitxml", + "testjson", + ] + pruneopts = "UT" + revision = "ab2fe5eb001028c964502a7ddf7ee721c5826b2c" + version = "v0.1" + +[[projects]] + branch = "master" + digest = "1:ef98efcb9462d27d251466fdc89656c5dbc28f4dc6b428a4270c3ba668ea412d" + name = "mvdan.cc/interfacer" + packages = ["check"] + pruneopts = "UT" + revision = "c20040233aedb03da82d460eca6130fcd91c629a" + +[[projects]] + branch = "master" + digest = "1:521f15c98723cb42db85f5b83980ffa5f707ddaff12976a0d366e6a6cdd1f791" + name = "mvdan.cc/lint" + packages = ["."] + pruneopts = "UT" + revision = "adc824a0674b99099789b6188a058d485eaf61c0" + +[[projects]] + branch = "master" + digest = "1:49663f044145c794116bde2cbcc8045164717b068a3194d26ae2243874de5994" + name = "mvdan.cc/unparam" + packages = ["check"] + pruneopts = "UT" + revision = "1b9ccfa71afe53433971717161c9666adfc4d8c5" + +[[projects]] + digest = "1:ffbeee69d5d01b594a4ca53e359861e3416c70bdbca8d423c72b815f470ecc49" + name = "sourcegraph.com/sqs/pbtypes" + packages = ["."] + pruneopts = "UT" + revision = "688c2c2cb411327a50aae0f89119af9f38b0fc03" + version = "v1.0.0" + +[solve-meta] + analyzer-name = "dep" + analyzer-version = 1 + input-imports = [ + "bazil.org/fuse", + "bazil.org/fuse/fs", + "bazil.org/fuse/fs/fstestutil", + "github.com/Kubuxu/go-os-helper", + "github.com/Kubuxu/gocovmerge", + "github.com/blang/semver", + "github.com/bren2010/proquint", + "github.com/cenkalti/backoff", + "github.com/dustin/go-humanize", + "github.com/elgris/jsondiff", + "github.com/fsnotify/fsnotify", + "github.com/gogo/protobuf/proto", + "github.com/golangci/golangci-lint/cmd/golangci-lint", + "github.com/hashicorp/go-multierror", + "github.com/hashicorp/golang-lru", + "github.com/hsanjuan/go-libp2p-http", + "github.com/ipfs/dir-index-html", + "github.com/ipfs/go-bitswap", + "github.com/ipfs/go-bitswap/decision", + "github.com/ipfs/go-bitswap/network", + "github.com/ipfs/go-block-format", + "github.com/ipfs/go-blockservice", + "github.com/ipfs/go-cid", + "github.com/ipfs/go-cidutil", + "github.com/ipfs/go-cidutil/cid-fmt", + "github.com/ipfs/go-cidutil/cidenc", + "github.com/ipfs/go-datastore", + "github.com/ipfs/go-datastore/mount", + "github.com/ipfs/go-datastore/namespace", + "github.com/ipfs/go-datastore/query", + "github.com/ipfs/go-datastore/retrystore", + "github.com/ipfs/go-datastore/sync", + "github.com/ipfs/go-detect-race", + "github.com/ipfs/go-ds-badger", + "github.com/ipfs/go-ds-flatfs", + "github.com/ipfs/go-ds-leveldb", + "github.com/ipfs/go-ds-measure", + "github.com/ipfs/go-fs-lock", + "github.com/ipfs/go-ipfs-blockstore", + "github.com/ipfs/go-ipfs-blocksutil", + "github.com/ipfs/go-ipfs-chunker", + "github.com/ipfs/go-ipfs-cmds", + "github.com/ipfs/go-ipfs-cmds/cli", + "github.com/ipfs/go-ipfs-cmds/http", + "github.com/ipfs/go-ipfs-config", + "github.com/ipfs/go-ipfs-config/serialize", + "github.com/ipfs/go-ipfs-ds-help", + "github.com/ipfs/go-ipfs-exchange-interface", + "github.com/ipfs/go-ipfs-exchange-offline", + "github.com/ipfs/go-ipfs-files", + "github.com/ipfs/go-ipfs-posinfo", + "github.com/ipfs/go-ipfs-routing/mock", + "github.com/ipfs/go-ipfs-routing/none", + "github.com/ipfs/go-ipfs-routing/offline", + "github.com/ipfs/go-ipfs-util", + "github.com/ipfs/go-ipld-cbor", + "github.com/ipfs/go-ipld-format", + "github.com/ipfs/go-ipld-git", + "github.com/ipfs/go-ipns", + "github.com/ipfs/go-ipns/pb", + "github.com/ipfs/go-log", + "github.com/ipfs/go-log/writer", + "github.com/ipfs/go-merkledag", + "github.com/ipfs/go-merkledag/test", + "github.com/ipfs/go-metrics-interface", + "github.com/ipfs/go-metrics-prometheus", + "github.com/ipfs/go-mfs", + "github.com/ipfs/go-path", + "github.com/ipfs/go-path/resolver", + "github.com/ipfs/go-unixfs", + "github.com/ipfs/go-unixfs/file", + "github.com/ipfs/go-unixfs/importer", + "github.com/ipfs/go-unixfs/importer/balanced", + "github.com/ipfs/go-unixfs/importer/helpers", + "github.com/ipfs/go-unixfs/importer/trickle", + "github.com/ipfs/go-unixfs/io", + "github.com/ipfs/go-unixfs/pb", + "github.com/ipfs/go-verifcid", + "github.com/ipfs/hang-fds", + "github.com/ipfs/interface-go-ipfs-core", + "github.com/ipfs/interface-go-ipfs-core/options", + "github.com/ipfs/interface-go-ipfs-core/options/namesys", + "github.com/ipfs/interface-go-ipfs-core/path", + "github.com/ipfs/interface-go-ipfs-core/tests", + "github.com/ipfs/iptb-plugins/local", + "github.com/ipfs/iptb/cli", + "github.com/ipfs/iptb/testbed", + "github.com/jbenet/go-is-domain", + "github.com/jbenet/go-random", + "github.com/jbenet/go-random-files/random-files", + "github.com/jbenet/go-random/random", + "github.com/jbenet/go-temp-err-catcher", + "github.com/jbenet/goprocess", + "github.com/jbenet/goprocess/context", + "github.com/jbenet/goprocess/periodic", + "github.com/jbenet/goprocess/ratelimit", + "github.com/libp2p/go-libp2p", + "github.com/libp2p/go-libp2p-autonat-svc", + "github.com/libp2p/go-libp2p-circuit", + "github.com/libp2p/go-libp2p-connmgr", + "github.com/libp2p/go-libp2p-core/connmgr", + "github.com/libp2p/go-libp2p-core/crypto", + "github.com/libp2p/go-libp2p-core/host", + "github.com/libp2p/go-libp2p-core/metrics", + "github.com/libp2p/go-libp2p-core/mux", + "github.com/libp2p/go-libp2p-core/network", + "github.com/libp2p/go-libp2p-core/peer", + "github.com/libp2p/go-libp2p-core/peerstore", + "github.com/libp2p/go-libp2p-core/protocol", + "github.com/libp2p/go-libp2p-core/routing", + "github.com/libp2p/go-libp2p-core/test", + "github.com/libp2p/go-libp2p-kad-dht", + "github.com/libp2p/go-libp2p-kad-dht/opts", + "github.com/libp2p/go-libp2p-kbucket", + "github.com/libp2p/go-libp2p-loggables", + "github.com/libp2p/go-libp2p-mplex", + "github.com/libp2p/go-libp2p-peerstore/pstoremem", + "github.com/libp2p/go-libp2p-pnet", + "github.com/libp2p/go-libp2p-pubsub", + "github.com/libp2p/go-libp2p-pubsub-router", + "github.com/libp2p/go-libp2p-quic-transport", + "github.com/libp2p/go-libp2p-record", + "github.com/libp2p/go-libp2p-routing-helpers", + "github.com/libp2p/go-libp2p-secio", + "github.com/libp2p/go-libp2p-swarm", + "github.com/libp2p/go-libp2p-swarm/testing", + "github.com/libp2p/go-libp2p-testing/ci", + "github.com/libp2p/go-libp2p-testing/net", + "github.com/libp2p/go-libp2p-tls", + "github.com/libp2p/go-libp2p-yamux", + "github.com/libp2p/go-libp2p/p2p/discovery", + "github.com/libp2p/go-libp2p/p2p/host/basic", + "github.com/libp2p/go-libp2p/p2p/host/routed", + "github.com/libp2p/go-libp2p/p2p/net/mock", + "github.com/libp2p/go-libp2p/p2p/protocol/identify", + "github.com/libp2p/go-libp2p/p2p/protocol/ping", + "github.com/libp2p/go-maddr-filter", + "github.com/mitchellh/go-homedir", + "github.com/mr-tron/base58/base58", + "github.com/multiformats/go-multiaddr", + "github.com/multiformats/go-multiaddr-dns", + "github.com/multiformats/go-multiaddr-net", + "github.com/multiformats/go-multibase", + "github.com/multiformats/go-multihash", + "github.com/multiformats/go-multihash/multihash", + "github.com/opentracing/opentracing-go", + "github.com/pkg/errors", + "github.com/prometheus/client_golang/prometheus", + "github.com/prometheus/client_golang/prometheus/promhttp", + "github.com/syndtr/goleveldb/leveldb/opt", + "github.com/whyrusleeping/base32", + "github.com/whyrusleeping/go-sysinfo", + "github.com/whyrusleeping/multiaddr-filter", + "github.com/whyrusleeping/sql-datastore/postgres", + "github.com/whyrusleeping/tar-utils", + "go.uber.org/fx", + "golang.org/x/sys/unix", + "gopkg.in/cheggaaa/pb.v1", + "gotest.tools/gotestsum", + ] + solver-name = "gps-cdcl" + solver-version = 1 diff --git a/vendor/github.com/ipfs/go-ipfs/Gopkg.toml b/vendor/github.com/ipfs/go-ipfs/Gopkg.toml new file mode 100644 index 00000000..53699ef2 --- /dev/null +++ b/vendor/github.com/ipfs/go-ipfs/Gopkg.toml @@ -0,0 +1,443 @@ +# Gopkg.toml example +# +# Refer to https://golang.github.io/dep/docs/Gopkg.toml.html +# for detailed Gopkg.toml documentation. +# +# required = ["github.com/user/thing/cmd/thing"] +# ignored = ["github.com/user/project/pkgX", "bitbucket.org/user/project/pkgA/pkgY"] +# +# [[constraint]] +# name = "github.com/user/project" +# version = "1.0.0" +# +# [[constraint]] +# name = "github.com/user/project2" +# branch = "dev" +# source = "github.com/myfork/project2" +# +# [[override]] +# name = "github.com/x/y" +# version = "2.4.0" +# +# [prune] +# non-go = false +# go-tests = true +# unused-packages = true + + +[[constraint]] + branch = "master" + name = "bazil.org/fuse" + +[[constraint]] + name = "github.com/Kubuxu/go-os-helper" + version = "0.0.1" + +[[constraint]] + branch = "master" + name = "github.com/Kubuxu/gocovmerge" + +[[constraint]] + name = "github.com/blang/semver" + version = "3.6.1" + +[[constraint]] + branch = "master" + name = "github.com/bren2010/proquint" + +[[constraint]] + name = "github.com/cenkalti/backoff" + version = "3.0.0" + +[[constraint]] + name = "github.com/dustin/go-humanize" + version = "1.0.0" + +[[constraint]] + branch = "master" + name = "github.com/elgris/jsondiff" + +[[constraint]] + name = "github.com/fsnotify/fsnotify" + version = "1.4.7" + +[[constraint]] + name = "github.com/gogo/protobuf" + version = "1.2.1" + +[[constraint]] + name = "github.com/golangci/golangci-lint" + version = "1.17.1" + +[[constraint]] + name = "github.com/hashicorp/go-multierror" + version = "1.0.0" + +[[constraint]] + name = "github.com/hashicorp/golang-lru" + version = "0.5.1" + +[[constraint]] + name = "github.com/hsanjuan/go-libp2p-http" + version = "0.1.2" + +[[constraint]] + name = "github.com/ipfs/dir-index-html" + version = "1.0.3" + +[[constraint]] + name = "github.com/ipfs/go-bitswap" + version = "0.1.1" + +[[constraint]] + name = "github.com/ipfs/go-block-format" + version = "0.0.2" + +[[constraint]] + name = "github.com/ipfs/go-blockservice" + version = "0.1.0" + +[[constraint]] + name = "github.com/ipfs/go-cid" + version = "0.0.2" + +[[constraint]] + name = "github.com/ipfs/go-cidutil" + version = "0.0.2" + +[[constraint]] + name = "github.com/ipfs/go-datastore" + version = "0.0.5" + +[[constraint]] + name = "github.com/ipfs/go-detect-race" + version = "0.0.1" + +[[constraint]] + name = "github.com/ipfs/go-ds-badger" + version = "0.0.3" + +[[constraint]] + name = "github.com/ipfs/go-ds-flatfs" + version = "0.0.2" + +[[constraint]] + name = "github.com/ipfs/go-ds-leveldb" + version = "0.0.2" + +[[constraint]] + name = "github.com/ipfs/go-ds-measure" + version = "0.0.1" + +[[constraint]] + name = "github.com/ipfs/go-fs-lock" + version = "0.0.1" + +[[constraint]] + name = "github.com/ipfs/go-ipfs-blockstore" + version = "0.0.1" + +[[constraint]] + name = "github.com/ipfs/go-ipfs-blocksutil" + version = "0.0.1" + +[[constraint]] + name = "github.com/ipfs/go-ipfs-chunker" + version = "0.0.1" + +[[constraint]] + name = "github.com/ipfs/go-ipfs-cmds" + version = "0.0.10" + +[[constraint]] + name = "github.com/ipfs/go-ipfs-config" + source = "github.com/vulcanize/go-ipfs-config" + revision = "4a51393611d9580d17ecbccb0c4aec5eb81f21ce" + +[[constraint]] + name = "github.com/ipfs/go-ipfs-ds-help" + version = "0.0.1" + +[[constraint]] + name = "github.com/ipfs/go-ipfs-exchange-interface" + version = "0.0.1" + +[[constraint]] + name = "github.com/ipfs/go-ipfs-exchange-offline" + version = "0.0.1" + +[[constraint]] + name = "github.com/ipfs/go-ipfs-files" + version = "0.0.3" + +[[constraint]] + name = "github.com/ipfs/go-ipfs-posinfo" + version = "0.0.1" + +[[constraint]] + name = "github.com/ipfs/go-ipfs-routing" + version = "0.1.0" + +[[constraint]] + name = "github.com/ipfs/go-ipfs-util" + version = "0.0.1" + +[[constraint]] + name = "github.com/ipfs/go-ipld-cbor" + version = "0.0.2" + +[[constraint]] + name = "github.com/ipfs/go-ipld-format" + version = "0.0.2" + +[[constraint]] + name = "github.com/ipfs/go-ipld-git" + version = "0.0.2" + +[[constraint]] + name = "github.com/ipfs/go-ipns" + version = "0.0.1" + +[[constraint]] + name = "github.com/ipfs/go-log" + version = "0.0.1" + +[[constraint]] + name = "github.com/ipfs/go-merkledag" + version = "0.1.0" + +[[constraint]] + name = "github.com/ipfs/go-metrics-interface" + version = "0.0.1" + +[[constraint]] + name = "github.com/ipfs/go-metrics-prometheus" + version = "0.0.2" + +[[constraint]] + name = "github.com/ipfs/go-mfs" + version = "0.1.0" + +[[constraint]] + name = "github.com/ipfs/go-path" + version = "0.0.7" + +[[constraint]] + name = "github.com/ipfs/go-unixfs" + version = "0.0.8" + +[[constraint]] + name = "github.com/ipfs/go-verifcid" + version = "0.0.1" + +[[constraint]] + name = "github.com/ipfs/hang-fds" + version = "0.0.1" + +[[constraint]] + name = "github.com/ipfs/interface-go-ipfs-core" + version = "0.1.0" + +[[constraint]] + name = "github.com/ipfs/iptb" + version = "1.4.0" + +[[constraint]] + name = "github.com/ipfs/iptb-plugins" + version = "0.1.0" + +[[constraint]] + name = "github.com/jbenet/go-is-domain" + version = "1.0.2" + +[[constraint]] + branch = "master" + name = "github.com/jbenet/go-random" + +[[constraint]] + branch = "master" + name = "github.com/jbenet/go-random-files" + +[[constraint]] + branch = "master" + name = "github.com/jbenet/go-temp-err-catcher" + +[[constraint]] + name = "github.com/jbenet/goprocess" + version = "0.1.3" + +[[constraint]] + name = "github.com/libp2p/go-libp2p" + version = "0.1.1" + +[[constraint]] + name = "github.com/libp2p/go-libp2p-autonat-svc" + version = "0.1.0" + +[[constraint]] + name = "github.com/libp2p/go-libp2p-circuit" + version = "0.1.0" + +[[constraint]] + name = "github.com/libp2p/go-libp2p-connmgr" + version = "0.1.0" + +[[constraint]] + name = "github.com/libp2p/go-libp2p-core" + version = "0.0.3" + +[[constraint]] + name = "github.com/libp2p/go-libp2p-kad-dht" + version = "0.1.0" + +[[constraint]] + name = "github.com/libp2p/go-libp2p-kbucket" + version = "0.2.0" + +[[constraint]] + name = "github.com/libp2p/go-libp2p-loggables" + version = "0.1.0" + +[[constraint]] + name = "github.com/libp2p/go-libp2p-mplex" + version = "0.2.1" + +[[constraint]] + name = "github.com/libp2p/go-libp2p-peerstore" + version = "0.1.0" + +[[constraint]] + name = "github.com/libp2p/go-libp2p-pnet" + version = "0.1.0" + +[[constraint]] + name = "github.com/libp2p/go-libp2p-pubsub" + version = "0.1.0" + +[[constraint]] + name = "github.com/libp2p/go-libp2p-pubsub-router" + version = "0.1.0" + +[[constraint]] + name = "github.com/libp2p/go-libp2p-quic-transport" + version = "0.1.1" + +[[constraint]] + name = "github.com/libp2p/go-libp2p-record" + version = "0.1.0" + +[[constraint]] + name = "github.com/libp2p/go-libp2p-routing-helpers" + version = "0.1.0" + +[[constraint]] + name = "github.com/libp2p/go-libp2p-secio" + version = "0.1.0" + +[[constraint]] + name = "github.com/libp2p/go-libp2p-swarm" + version = "0.1.0" + +[[constraint]] + name = "github.com/libp2p/go-libp2p-testing" + version = "0.0.4" + +[[constraint]] + name = "github.com/libp2p/go-libp2p-tls" + version = "0.1.0" + +[[constraint]] + name = "github.com/libp2p/go-libp2p-yamux" + version = "0.2.1" + +[[constraint]] + name = "github.com/libp2p/go-maddr-filter" + version = "0.0.4" + +[[constraint]] + name = "github.com/mitchellh/go-homedir" + version = "1.1.0" + +[[constraint]] + name = "github.com/mr-tron/base58" + version = "1.1.2" + +[[constraint]] + name = "github.com/multiformats/go-multiaddr" + version = "0.0.4" + +[[constraint]] + name = "github.com/multiformats/go-multiaddr-dns" + version = "0.0.2" + +[[constraint]] + name = "github.com/multiformats/go-multiaddr-net" + version = "0.0.1" + +[[constraint]] + name = "github.com/multiformats/go-multibase" + version = "0.0.1" + +[[constraint]] + name = "github.com/multiformats/go-multihash" + version = "0.0.5" + +[[constraint]] + name = "github.com/opentracing/opentracing-go" + version = "1.1.0" + +[[constraint]] + name = "github.com/pkg/errors" + version = "0.8.1" + +[[constraint]] + name = "github.com/prometheus/client_golang" + version = "0.9.4" + +[[constraint]] + name = "github.com/syndtr/goleveldb" + version = "1.0.0" + +[[constraint]] + branch = "master" + name = "github.com/whyrusleeping/base32" + +[[constraint]] + branch = "master" + name = "github.com/whyrusleeping/go-sysinfo" + +[[constraint]] + branch = "master" + name = "github.com/whyrusleeping/multiaddr-filter" + +[[constraint]] + branch = "master" + name = "github.com/whyrusleeping/tar-utils" + +[[constraint]] + name = "go.uber.org/fx" + version = "1.9.0" + +[[constraint]] + branch = "master" + name = "golang.org/x/sys" + +[[constraint]] + name = "gopkg.in/cheggaaa/pb.v1" + version = "1.0.28" + +[[constraint]] + name = "gotest.tools/gotestsum" + version = "0.1.0" + +[[constraint]] + branch = "master" + name = "github.com/whyrusleeping/sql-datastore" + +[[override]] + name = "github.com/dgraph-io/badger" + revision = "0ce1d2e26af1ba8b8a72ea864145a3e1e3b382cd" + +[prune] + go-tests = true + unused-packages = true diff --git a/vendor/github.com/ipfs/go-ipfs/ISSUE_TEMPLATE.md b/vendor/github.com/ipfs/go-ipfs/ISSUE_TEMPLATE.md deleted file mode 100644 index 1646b2af..00000000 --- a/vendor/github.com/ipfs/go-ipfs/ISSUE_TEMPLATE.md +++ /dev/null @@ -1,39 +0,0 @@ - - -#### Version information: - - -#### Type: - - -#### Description: - diff --git a/vendor/github.com/ipfs/go-ipfs/LICENSE b/vendor/github.com/ipfs/go-ipfs/LICENSE deleted file mode 100644 index 833dabb8..00000000 --- a/vendor/github.com/ipfs/go-ipfs/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014-2016 Juan Batiz-Benet - -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/ipfs/go-ipfs/LICENSE-APACHE b/vendor/github.com/ipfs/go-ipfs/LICENSE-APACHE new file mode 100644 index 00000000..14478a3b --- /dev/null +++ b/vendor/github.com/ipfs/go-ipfs/LICENSE-APACHE @@ -0,0 +1,5 @@ +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/libp2p/go-conn-security/LICENSE b/vendor/github.com/ipfs/go-ipfs/LICENSE-MIT similarity index 96% rename from vendor/github.com/libp2p/go-conn-security/LICENSE rename to vendor/github.com/ipfs/go-ipfs/LICENSE-MIT index 6cccfc2b..72dc60d8 100644 --- a/vendor/github.com/libp2p/go-conn-security/LICENSE +++ b/vendor/github.com/ipfs/go-ipfs/LICENSE-MIT @@ -1,7 +1,5 @@ The MIT License (MIT) -Copyright (c) 2018 Protocol Labs - 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 diff --git a/vendor/github.com/ipfs/go-ipfs/Makefile b/vendor/github.com/ipfs/go-ipfs/Makefile index 4bd63ac0..4c175dbc 100644 --- a/vendor/github.com/ipfs/go-ipfs/Makefile +++ b/vendor/github.com/ipfs/go-ipfs/Makefile @@ -2,8 +2,6 @@ SHELL=PATH='$(PATH)' /bin/sh -PROTOC = protoc --gogofaster_out=. --proto_path=.:$(GOPATH)/src:$(dir $@) $< - # enable second expansion .SECONDEXPANSION: diff --git a/vendor/github.com/ipfs/go-ipfs/README.md b/vendor/github.com/ipfs/go-ipfs/README.md index ab6251b7..a4af02c0 100644 --- a/vendor/github.com/ipfs/go-ipfs/README.md +++ b/vendor/github.com/ipfs/go-ipfs/README.md @@ -114,6 +114,18 @@ With snap, in any of the [supported Linux distributions](https://snapcraft.io/do $ sudo snap install ipfs ``` +### From Windows package managers + +- [Chocolatey](#chocolatey) + +#### Chocolatey + +The package [ipfs](https://chocolatey.org/packages/ipfs) currently points to go-ipfs and is being maintained. + +```Powershell +PS> choco install ipfs +``` + ### Build from Source #### Install Go @@ -138,12 +150,15 @@ $ cd go-ipfs $ make install ``` -If you are building on FreeBSD instead of `make install` use `gmake install`. +If you are building on a non-GNU system, use `gmake` in place of `make`. +Unsupported platforms (run `(g)make supported` for a list) will also need to set the `nofuse` gotag during build. +``` +$ GOTAGS=nofuse (g)make install +``` #### Troubleshooting - Separate [instructions are available for building on Windows](docs/windows.md). -- Also, [instructions for OpenBSD](docs/openbsd.md). - `git` is required in order for `go get` to fetch all dependencies. - Package managers often contain out-of-date `golang` packages. Ensure that `go version` reports at least 1.10. See above for how to install go. @@ -353,7 +368,6 @@ Listing of the main packages used in the IPFS ecosystem. There are also three sp | [`go-ipfs-blockstore`](//github.com/ipfs/go-ipfs-blockstore) | [![Travis CI](https://travis-ci.com/ipfs/go-ipfs-blockstore.svg?branch=master)](https://travis-ci.com/ipfs/go-ipfs-blockstore) | [![codecov](https://codecov.io/gh/ipfs/go-ipfs-blockstore/branch/master/graph/badge.svg)](https://codecov.io/gh/ipfs/go-ipfs-blockstore) | blockstore interfaces and implementations | | **Commands** | | [`go-ipfs-cmds`](//github.com/ipfs/go-ipfs-cmds) | [![Travis CI](https://travis-ci.com/ipfs/go-ipfs-cmds.svg?branch=master)](https://travis-ci.com/ipfs/go-ipfs-cmds) | [![codecov](https://codecov.io/gh/ipfs/go-ipfs-cmds/branch/master/graph/badge.svg)](https://codecov.io/gh/ipfs/go-ipfs-cmds) | CLI & HTTP commands library | -| [`go-ipfs-cmdkit`](//github.com/ipfs/go-ipfs-cmdkit) | [![Travis CI](https://travis-ci.com/ipfs/go-ipfs-cmdkit.svg?branch=master)](https://travis-ci.com/ipfs/go-ipfs-cmdkit) | [![codecov](https://codecov.io/gh/ipfs/go-ipfs-cmdkit/branch/master/graph/badge.svg)](https://codecov.io/gh/ipfs/go-ipfs-cmdkit) | helper types for the commands library | | [`go-ipfs-api`](//github.com/ipfs/go-ipfs-api) | [![Travis CI](https://travis-ci.com/ipfs/go-ipfs-api.svg?branch=master)](https://travis-ci.com/ipfs/go-ipfs-api) | [![codecov](https://codecov.io/gh/ipfs/go-ipfs-api/branch/master/graph/badge.svg)](https://codecov.io/gh/ipfs/go-ipfs-api) | a shell for the IPFS HTTP API | | **Metrics & Logging** | | [`go-metrics-interface`](//github.com/ipfs/go-metrics-interface) | [![Travis CI](https://travis-ci.com/ipfs/go-metrics-interface.svg?branch=master)](https://travis-ci.com/ipfs/go-metrics-interface) | [![codecov](https://codecov.io/gh/ipfs/go-metrics-interface/branch/master/graph/badge.svg)](https://codecov.io/gh/ipfs/go-metrics-interface) | metrics collection interfaces | diff --git a/vendor/github.com/ipfs/go-ipfs/Rules.mk b/vendor/github.com/ipfs/go-ipfs/Rules.mk index d28e3e0f..d4bdf361 100644 --- a/vendor/github.com/ipfs/go-ipfs/Rules.mk +++ b/vendor/github.com/ipfs/go-ipfs/Rules.mk @@ -4,6 +4,8 @@ COVERAGE := DISTCLEAN := TEST := TEST_SHORT := +GOCC ?= go +PROTOC ?= protoc all: help # all has to be first defined target .PHONY: all @@ -57,8 +59,8 @@ include $(dir)/Rules.mk # universal rules # # -------------------- # -%.pb.go: %.proto - $(PROTOC) +%.pb.go: %.proto bin/protoc-gen-gogofaster + $(PROTOC) --gogofaster_out=. --proto_path=.:$(GOPATH)/src:$(dir $@) $< # -------------------- # # core targets # @@ -104,9 +106,14 @@ install_unsupported: install .PHONY: install_unsupported uninstall: - go clean -i ./cmd/ipfs + $(GOCC) clean -i ./cmd/ipfs .PHONY: uninstall +supported: + @echo "Currently supported platforms:" + @for p in ${SUPPORTED_PLATFORMS}; do echo $$p; done +.PHONY: supported + help: @echo 'DEPENDENCY TARGETS:' @echo '' @@ -135,7 +142,7 @@ help: @echo ' test_go_test - Run all go tests' @echo ' test_go_expensive - Run all go tests and compile on all platforms' @echo ' test_go_race - Run go tests with the race detector enabled' - @echo ' test_go_megacheck - Run the `megacheck` vetting tool' + @echo ' test_go_lint - Run the `golangci-lint` vetting tool' @echo ' test_sharness_short - Run short sharness tests' @echo ' test_sharness_expensive - Run all sharness tests' @echo ' coverage - Collects coverage info from unit tests and sharness' diff --git a/vendor/github.com/ipfs/go-ipfs/core/bootstrap.go b/vendor/github.com/ipfs/go-ipfs/core/bootstrap/bootstrap.go similarity index 72% rename from vendor/github.com/ipfs/go-ipfs/core/bootstrap.go rename to vendor/github.com/ipfs/go-ipfs/core/bootstrap/bootstrap.go index 5ff4f8e1..02669036 100644 --- a/vendor/github.com/ipfs/go-ipfs/core/bootstrap.go +++ b/vendor/github.com/ipfs/go-ipfs/core/bootstrap/bootstrap.go @@ -1,4 +1,4 @@ -package core +package bootstrap import ( "context" @@ -9,19 +9,20 @@ import ( "sync" "time" - math2 "github.com/ipfs/go-ipfs/thirdparty/math2" - lgbl "github.com/libp2p/go-libp2p-loggables" - - config "github.com/ipfs/go-ipfs-config" - goprocess "github.com/jbenet/goprocess" - procctx "github.com/jbenet/goprocess/context" - periodicproc "github.com/jbenet/goprocess/periodic" - host "github.com/libp2p/go-libp2p-host" - inet "github.com/libp2p/go-libp2p-net" - peer "github.com/libp2p/go-libp2p-peer" - pstore "github.com/libp2p/go-libp2p-peerstore" + logging "github.com/ipfs/go-log" + "github.com/jbenet/goprocess" + "github.com/jbenet/goprocess/context" + "github.com/jbenet/goprocess/periodic" + "github.com/libp2p/go-libp2p-core/host" + "github.com/libp2p/go-libp2p-core/network" + "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p-core/peerstore" + "github.com/libp2p/go-libp2p-core/routing" + "github.com/libp2p/go-libp2p-loggables" ) +var log = logging.Logger("bootstrap") + // ErrNotEnoughBootstrapPeers signals that we do not have enough bootstrap // peers to bootstrap correctly. var ErrNotEnoughBootstrapPeers = errors.New("not enough bootstrap peers to bootstrap") @@ -29,7 +30,6 @@ var ErrNotEnoughBootstrapPeers = errors.New("not enough bootstrap peers to boots // BootstrapConfig specifies parameters used in an IpfsNode's network // bootstrapping process. type BootstrapConfig struct { - // MinPeerThreshold governs whether to bootstrap more connections. If the // node has less open connections than this number, it will open connections // to the bootstrap nodes. From there, the routing system should be able @@ -50,7 +50,7 @@ type BootstrapConfig struct { // BootstrapPeers is a function that returns a set of bootstrap peers // for the bootstrap process to use. This makes it possible for clients // to control the peers the process uses at any moment. - BootstrapPeers func() []pstore.PeerInfo + BootstrapPeers func() []peer.AddrInfo } // DefaultBootstrapConfig specifies default sane parameters for bootstrapping. @@ -60,9 +60,9 @@ var DefaultBootstrapConfig = BootstrapConfig{ ConnectionTimeout: (30 * time.Second) / 3, // Perod / 3 } -func BootstrapConfigWithPeers(pis []pstore.PeerInfo) BootstrapConfig { +func BootstrapConfigWithPeers(pis []peer.AddrInfo) BootstrapConfig { cfg := DefaultBootstrapConfig - cfg.BootstrapPeers = func() []pstore.PeerInfo { + cfg.BootstrapPeers = func() []peer.AddrInfo { return pis } return cfg @@ -72,7 +72,7 @@ func BootstrapConfigWithPeers(pis []pstore.PeerInfo) BootstrapConfig { // check the number of open connections and -- if there are too few -- initiate // connections to well-known bootstrap peers. It also kicks off subsystem // bootstrapping (i.e. routing). -func Bootstrap(n *IpfsNode, cfg BootstrapConfig) (io.Closer, error) { +func Bootstrap(id peer.ID, host host.Host, rt routing.Routing, cfg BootstrapConfig) (io.Closer, error) { // make a signal to wait for one bootstrap round to complete. doneWithRound := make(chan struct{}) @@ -85,12 +85,12 @@ func Bootstrap(n *IpfsNode, cfg BootstrapConfig) (io.Closer, error) { // the periodic bootstrap function -- the connection supervisor periodic := func(worker goprocess.Process) { - ctx := procctx.OnClosingContext(worker) - defer log.EventBegin(ctx, "periodicBootstrap", n.Identity).Done() + ctx := goprocessctx.OnClosingContext(worker) + defer log.EventBegin(ctx, "periodicBootstrap", id).Done() - if err := bootstrapRound(ctx, n.PeerHost, cfg); err != nil { - log.Event(ctx, "bootstrapError", n.Identity, lgbl.Error(err)) - log.Debugf("%s bootstrap error: %s", n.Identity, err) + if err := bootstrapRound(ctx, host, cfg); err != nil { + log.Event(ctx, "bootstrapError", id, loggables.Error(err)) + log.Debugf("%s bootstrap error: %s", id, err) } <-doneWithRound @@ -101,9 +101,9 @@ func Bootstrap(n *IpfsNode, cfg BootstrapConfig) (io.Closer, error) { proc.Go(periodic) // run one right now. // kick off Routing.Bootstrap - if n.Routing != nil { - ctx := procctx.OnClosingContext(proc) - if err := n.Routing.Bootstrap(ctx); err != nil { + if rt != nil { + ctx := goprocessctx.OnClosingContext(proc) + if err := rt.Bootstrap(ctx); err != nil { proc.Close() return nil, err } @@ -134,9 +134,9 @@ func bootstrapRound(ctx context.Context, host host.Host, cfg BootstrapConfig) er numToDial := cfg.MinPeerThreshold - len(connected) // filter out bootstrap nodes we are already connected to - var notConnected []pstore.PeerInfo + var notConnected []peer.AddrInfo for _, p := range peers { - if host.Network().Connectedness(p.ID) != inet.Connected { + if host.Network().Connectedness(p.ID) != network.Connected { notConnected = append(notConnected, p) } } @@ -155,7 +155,7 @@ func bootstrapRound(ctx context.Context, host host.Host, cfg BootstrapConfig) er return bootstrapConnect(ctx, host, randSubset) } -func bootstrapConnect(ctx context.Context, ph host.Host, peers []pstore.PeerInfo) error { +func bootstrapConnect(ctx context.Context, ph host.Host, peers []peer.AddrInfo) error { if len(peers) < 1 { return ErrNotEnoughBootstrapPeers } @@ -170,12 +170,12 @@ func bootstrapConnect(ctx context.Context, ph host.Host, peers []pstore.PeerInfo // Also, performed asynchronously for dial speed. wg.Add(1) - go func(p pstore.PeerInfo) { + go func(p peer.AddrInfo) { defer wg.Done() defer log.EventBegin(ctx, "bootstrapDial", ph.ID(), p.ID).Done() log.Debugf("%s bootstrapping to %s", ph.ID(), p.ID) - ph.Peerstore().AddAddrs(p.ID, p.Addrs, pstore.PermanentAddrTTL) + ph.Peerstore().AddAddrs(p.ID, p.Addrs, peerstore.PermanentAddrTTL) if err := ph.Connect(ctx, p); err != nil { log.Event(ctx, "bootstrapDialFailed", p.ID) log.Debugf("failed to bootstrap with %v: %s", p.ID, err) @@ -204,35 +204,14 @@ func bootstrapConnect(ctx context.Context, ph host.Host, peers []pstore.PeerInfo return nil } -func toPeerInfos(bpeers []config.BootstrapPeer) []pstore.PeerInfo { - pinfos := make(map[peer.ID]*pstore.PeerInfo) - for _, bootstrap := range bpeers { - pinfo, ok := pinfos[bootstrap.ID()] - if !ok { - pinfo = new(pstore.PeerInfo) - pinfos[bootstrap.ID()] = pinfo - pinfo.ID = bootstrap.ID() - } - - pinfo.Addrs = append(pinfo.Addrs, bootstrap.Transport()) +func randomSubsetOfPeers(in []peer.AddrInfo, max int) []peer.AddrInfo { + if max > len(in) { + max = len(in) } - var peers []pstore.PeerInfo - for _, pinfo := range pinfos { - peers = append(peers, *pinfo) - } - - return peers -} - -func randomSubsetOfPeers(in []pstore.PeerInfo, max int) []pstore.PeerInfo { - n := math2.IntMin(max, len(in)) - var out []pstore.PeerInfo - for _, val := range rand.Perm(len(in)) { - out = append(out, in[val]) - if len(out) >= n { - break - } + out := make([]peer.AddrInfo, max) + for i, val := range rand.Perm(len(in))[:max] { + out[i] = in[val] } return out } diff --git a/vendor/github.com/ipfs/go-ipfs/core/builder.go b/vendor/github.com/ipfs/go-ipfs/core/builder.go index 1fdec994..ff8fbd32 100644 --- a/vendor/github.com/ipfs/go-ipfs/core/builder.go +++ b/vendor/github.com/ipfs/go-ipfs/core/builder.go @@ -2,292 +2,64 @@ package core import ( "context" - "crypto/rand" - "encoding/base64" - "errors" - "github.com/ipfs/go-ipfs/provider" - "os" - "syscall" - "time" + "sync" - filestore "github.com/ipfs/go-ipfs/filestore" - namesys "github.com/ipfs/go-ipfs/namesys" - pin "github.com/ipfs/go-ipfs/pin" - repo "github.com/ipfs/go-ipfs/repo" - cidv0v1 "github.com/ipfs/go-ipfs/thirdparty/cidv0v1" - "github.com/ipfs/go-ipfs/thirdparty/verifbs" + "github.com/ipfs/go-ipfs/core/bootstrap" + "github.com/ipfs/go-ipfs/core/node" - bserv "github.com/ipfs/go-blockservice" - ds "github.com/ipfs/go-datastore" - retry "github.com/ipfs/go-datastore/retrystore" - dsync "github.com/ipfs/go-datastore/sync" - bstore "github.com/ipfs/go-ipfs-blockstore" - cfg "github.com/ipfs/go-ipfs-config" - offline "github.com/ipfs/go-ipfs-exchange-offline" - offroute "github.com/ipfs/go-ipfs-routing/offline" - ipns "github.com/ipfs/go-ipns" - dag "github.com/ipfs/go-merkledag" - metrics "github.com/ipfs/go-metrics-interface" - resolver "github.com/ipfs/go-path/resolver" - uio "github.com/ipfs/go-unixfs/io" - goprocessctx "github.com/jbenet/goprocess/context" - libp2p "github.com/libp2p/go-libp2p" - ci "github.com/libp2p/go-libp2p-crypto" - p2phost "github.com/libp2p/go-libp2p-host" - peer "github.com/libp2p/go-libp2p-peer" - pstore "github.com/libp2p/go-libp2p-peerstore" - pstoremem "github.com/libp2p/go-libp2p-peerstore/pstoremem" - record "github.com/libp2p/go-libp2p-record" + "github.com/ipfs/go-metrics-interface" + "go.uber.org/fx" ) -type BuildCfg struct { - // If online is set, the node will have networking enabled - Online bool - - // ExtraOpts is a map of extra options used to configure the ipfs nodes creation - ExtraOpts map[string]bool - - // If permanent then node should run more expensive processes - // that will improve performance in long run - Permanent bool - - // DisableEncryptedConnections disables connection encryption *entirely*. - // DO NOT SET THIS UNLESS YOU'RE TESTING. - DisableEncryptedConnections bool - - // If NilRepo is set, a repo backed by a nil datastore will be constructed - NilRepo bool - - Routing RoutingOption - Host HostOption - Repo repo.Repo -} - -func (cfg *BuildCfg) getOpt(key string) bool { - if cfg.ExtraOpts == nil { - return false - } - - return cfg.ExtraOpts[key] -} - -func (cfg *BuildCfg) fillDefaults() error { - if cfg.Repo != nil && cfg.NilRepo { - return errors.New("cannot set a repo and specify nilrepo at the same time") - } - - if cfg.Repo == nil { - var d ds.Datastore - if cfg.NilRepo { - d = ds.NewNullDatastore() - } else { - d = ds.NewMapDatastore() - } - r, err := defaultRepo(dsync.MutexWrap(d)) - if err != nil { - return err - } - cfg.Repo = r - } - - if cfg.Routing == nil { - cfg.Routing = DHTOption - } - - if cfg.Host == nil { - cfg.Host = DefaultHostOption - } - - return nil -} - -func defaultRepo(dstore repo.Datastore) (repo.Repo, error) { - c := cfg.Config{} - priv, pub, err := ci.GenerateKeyPairWithReader(ci.RSA, 1024, rand.Reader) - if err != nil { - return nil, err - } - - pid, err := peer.IDFromPublicKey(pub) - if err != nil { - return nil, err - } - - privkeyb, err := priv.Bytes() - if err != nil { - return nil, err - } - - c.Bootstrap = cfg.DefaultBootstrapAddresses - c.Addresses.Swarm = []string{"/ip4/0.0.0.0/tcp/4001"} - c.Identity.PeerID = pid.Pretty() - c.Identity.PrivKey = base64.StdEncoding.EncodeToString(privkeyb) - - return &repo.Mock{ - D: dstore, - C: c, - }, nil -} +type BuildCfg = node.BuildCfg // Alias for compatibility until we properly refactor the constructor interface // NewNode constructs and returns an IpfsNode using the given cfg. func NewNode(ctx context.Context, cfg *BuildCfg) (*IpfsNode, error) { - if cfg == nil { - cfg = new(BuildCfg) - } - - err := cfg.fillDefaults() - if err != nil { - return nil, err - } - ctx = metrics.CtxScope(ctx, "ipfs") n := &IpfsNode{ - IsOnline: cfg.Online, - Repo: cfg.Repo, - ctx: ctx, - Peerstore: pstoremem.NewPeerstore(), + ctx: ctx, } - n.RecordValidator = record.NamespacedValidator{ - "pk": record.PublicKeyValidator{}, - "ipns": ipns.Validator{KeyBook: n.Peerstore}, - } - - // TODO: this is a weird circular-ish dependency, rework it - n.proc = goprocessctx.WithContextAndTeardown(ctx, n.teardown) - - if err := setupNode(ctx, n, cfg); err != nil { - n.Close() - return nil, err - } - - return n, nil -} - -func isTooManyFDError(err error) bool { - perr, ok := err.(*os.PathError) - if ok && perr.Err == syscall.EMFILE { - return true - } - - return false -} - -func setupNode(ctx context.Context, n *IpfsNode, cfg *BuildCfg) error { - // setup local identity - if err := n.loadID(); err != nil { - return err - } - - // load the private key (if present) - if err := n.loadPrivateKey(); err != nil { - return err - } - - rds := &retry.Datastore{ - Batching: n.Repo.Datastore(), - Delay: time.Millisecond * 200, - Retries: 6, - TempErrFunc: isTooManyFDError, - } - - // hash security - bs := bstore.NewBlockstore(rds) - bs = &verifbs.VerifBS{Blockstore: bs} - - opts := bstore.DefaultCacheOpts() - conf, err := n.Repo.Config() - if err != nil { - return err - } + app := fx.New( + node.IPFS(ctx, cfg), - // TEMP: setting global sharding switch here - uio.UseHAMTSharding = conf.Experimental.ShardingEnabled + fx.NopLogger, + fx.Extract(n), + ) - opts.HasBloomFilterSize = conf.Datastore.BloomFilterSize - if !cfg.Permanent { - opts.HasBloomFilterSize = 0 + var once sync.Once + var stopErr error + n.stop = func() error { + once.Do(func() { + stopErr = app.Stop(context.Background()) + }) + return stopErr } + n.IsOnline = cfg.Online - if !cfg.NilRepo { - bs, err = bstore.CachedBlockstore(ctx, bs, opts) + go func() { + // Note that some services use contexts to signal shutting down, which is + // very suboptimal. This needs to be here until that's addressed somehow + <-ctx.Done() + err := n.stop() if err != nil { - return err + log.Error("failure on stop: ", err) } - } - - bs = bstore.NewIdStore(bs) - - bs = cidv0v1.NewBlockstore(bs) - - n.BaseBlocks = bs - n.GCLocker = bstore.NewGCLocker() - n.Blockstore = bstore.NewGCBlockstore(bs, n.GCLocker) - - if conf.Experimental.FilestoreEnabled || conf.Experimental.UrlstoreEnabled { - // hash security - n.Filestore = filestore.NewFilestore(bs, n.Repo.FileManager()) - n.Blockstore = bstore.NewGCBlockstore(n.Filestore, n.GCLocker) - n.Blockstore = &verifbs.VerifBSGC{GCBlockstore: n.Blockstore} - } - - rcfg, err := n.Repo.Config() - if err != nil { - return err - } + }() - if rcfg.Datastore.HashOnRead { - bs.HashOnRead(true) + if app.Err() != nil { + return nil, app.Err() } - hostOption := cfg.Host - if cfg.DisableEncryptedConnections { - innerHostOption := hostOption - hostOption = func(ctx context.Context, id peer.ID, ps pstore.Peerstore, options ...libp2p.Option) (p2phost.Host, error) { - return innerHostOption(ctx, id, ps, append(options, libp2p.NoSecurity)...) - } - log.Warningf(`Your IPFS node has been configured to run WITHOUT ENCRYPTED CONNECTIONS. - You will not be able to connect to any nodes configured to use encrypted connections`) - } - - if cfg.Online { - do := setupDiscoveryOption(rcfg.Discovery) - if err := n.startOnlineServices(ctx, cfg.Routing, hostOption, do, cfg.getOpt("pubsub"), cfg.getOpt("ipnsps"), cfg.getOpt("mplex")); err != nil { - return err - } - } else { - n.Exchange = offline.Exchange(n.Blockstore) - n.Routing = offroute.NewOfflineRouter(n.Repo.Datastore(), n.RecordValidator) - n.Namesys = namesys.NewNameSystem(n.Routing, n.Repo.Datastore(), 0) - } - - n.Blocks = bserv.New(n.Blockstore, n.Exchange) - n.DAG = dag.NewDAGService(n.Blocks) - - internalDag := dag.NewDAGService(bserv.New(n.Blockstore, offline.Exchange(n.Blockstore))) - n.Pinning, err = pin.LoadPinner(n.Repo.Datastore(), n.DAG, internalDag) - if err != nil { - // TODO: we should move towards only running 'NewPinner' explicitly on - // node init instead of implicitly here as a result of the pinner keys - // not being found in the datastore. - // this is kinda sketchy and could cause data loss - n.Pinning = pin.NewPinner(n.Repo.Datastore(), n.DAG, internalDag) - } - n.Resolver = resolver.NewBasicResolver(n.DAG) - - // Provider - queue, err := provider.NewQueue(ctx, "provider-v1", n.Repo.Datastore()) - if err != nil { - return err + if err := app.Start(ctx); err != nil { + return nil, err } - n.Provider = provider.NewProvider(ctx, queue, n.Routing) - if cfg.Online { - if err := n.startLateOnlineServices(ctx); err != nil { - return err - } + // TODO: How soon will bootstrap move to libp2p? + if !cfg.Online { + return n, nil } - return n.loadFilesRoot() + return n, n.Bootstrap(bootstrap.DefaultBootstrapConfig) } diff --git a/vendor/github.com/ipfs/go-ipfs/core/core.go b/vendor/github.com/ipfs/go-ipfs/core/core.go index 99379b85..24535208 100644 --- a/vendor/github.com/ipfs/go-ipfs/core/core.go +++ b/vendor/github.com/ipfs/go-ipfs/core/core.go @@ -10,81 +10,47 @@ interfaces and how core/... fits into the bigger IPFS picture, see: package core import ( - "bytes" "context" - "errors" - "fmt" "io" - "io/ioutil" - "os" - "strings" - "time" version "github.com/ipfs/go-ipfs" - rp "github.com/ipfs/go-ipfs/exchange/reprovide" - filestore "github.com/ipfs/go-ipfs/filestore" - mount "github.com/ipfs/go-ipfs/fuse/mount" - namesys "github.com/ipfs/go-ipfs/namesys" + "github.com/ipfs/go-ipfs/core/bootstrap" + "github.com/ipfs/go-ipfs/core/node" + "github.com/ipfs/go-ipfs/core/node/libp2p" + "github.com/ipfs/go-ipfs/filestore" + "github.com/ipfs/go-ipfs/fuse/mount" + "github.com/ipfs/go-ipfs/namesys" ipnsrp "github.com/ipfs/go-ipfs/namesys/republisher" - p2p "github.com/ipfs/go-ipfs/p2p" - pin "github.com/ipfs/go-ipfs/pin" - provider "github.com/ipfs/go-ipfs/provider" - repo "github.com/ipfs/go-ipfs/repo" + "github.com/ipfs/go-ipfs/p2p" + "github.com/ipfs/go-ipfs/pin" + "github.com/ipfs/go-ipfs/provider" + "github.com/ipfs/go-ipfs/repo" - bitswap "github.com/ipfs/go-bitswap" - bsnet "github.com/ipfs/go-bitswap/network" bserv "github.com/ipfs/go-blockservice" - cid "github.com/ipfs/go-cid" - ds "github.com/ipfs/go-datastore" bstore "github.com/ipfs/go-ipfs-blockstore" - config "github.com/ipfs/go-ipfs-config" exchange "github.com/ipfs/go-ipfs-exchange-interface" - nilrouting "github.com/ipfs/go-ipfs-routing/none" - u "github.com/ipfs/go-ipfs-util" ipld "github.com/ipfs/go-ipld-format" logging "github.com/ipfs/go-log" - merkledag "github.com/ipfs/go-merkledag" mfs "github.com/ipfs/go-mfs" resolver "github.com/ipfs/go-path/resolver" - ft "github.com/ipfs/go-unixfs" goprocess "github.com/jbenet/goprocess" - libp2p "github.com/libp2p/go-libp2p" autonat "github.com/libp2p/go-libp2p-autonat-svc" - circuit "github.com/libp2p/go-libp2p-circuit" - connmgr "github.com/libp2p/go-libp2p-connmgr" - ic "github.com/libp2p/go-libp2p-crypto" - p2phost "github.com/libp2p/go-libp2p-host" - ifconnmgr "github.com/libp2p/go-libp2p-interface-connmgr" + connmgr "github.com/libp2p/go-libp2p-core/connmgr" + ic "github.com/libp2p/go-libp2p-core/crypto" + p2phost "github.com/libp2p/go-libp2p-core/host" + metrics "github.com/libp2p/go-libp2p-core/metrics" + peer "github.com/libp2p/go-libp2p-core/peer" + pstore "github.com/libp2p/go-libp2p-core/peerstore" + routing "github.com/libp2p/go-libp2p-core/routing" dht "github.com/libp2p/go-libp2p-kad-dht" - dhtopts "github.com/libp2p/go-libp2p-kad-dht/opts" - metrics "github.com/libp2p/go-libp2p-metrics" - peer "github.com/libp2p/go-libp2p-peer" - pstore "github.com/libp2p/go-libp2p-peerstore" - pnet "github.com/libp2p/go-libp2p-pnet" pubsub "github.com/libp2p/go-libp2p-pubsub" psrouter "github.com/libp2p/go-libp2p-pubsub-router" - quic "github.com/libp2p/go-libp2p-quic-transport" record "github.com/libp2p/go-libp2p-record" - routing "github.com/libp2p/go-libp2p-routing" - rhelpers "github.com/libp2p/go-libp2p-routing-helpers" - discovery "github.com/libp2p/go-libp2p/p2p/discovery" + "github.com/libp2p/go-libp2p/p2p/discovery" p2pbhost "github.com/libp2p/go-libp2p/p2p/host/basic" - rhost "github.com/libp2p/go-libp2p/p2p/host/routed" - identify "github.com/libp2p/go-libp2p/p2p/protocol/identify" - mafilter "github.com/libp2p/go-maddr-filter" - smux "github.com/libp2p/go-stream-muxer" - ma "github.com/multiformats/go-multiaddr" - mplex "github.com/whyrusleeping/go-smux-multiplex" - yamux "github.com/whyrusleeping/go-smux-yamux" - mamask "github.com/whyrusleeping/multiaddr-filter" + "github.com/libp2p/go-libp2p/p2p/protocol/identify" ) -const IpnsValidatorTag = "ipns" - -const kReprovideFrequency = time.Hour * 12 -const discoveryConnTimeout = time.Second * 30 -const DefaultIpnsCacheSize = 128 - var log = logging.Logger("core") func init() { @@ -100,47 +66,48 @@ type IpfsNode struct { Repo repo.Repo // Local node - Pinning pin.Pinner // the pinning manager - Mounts Mounts // current mount state, if any. - PrivateKey ic.PrivKey // the local node's private Key - PNetFingerprint []byte // fingerprint of private network + Pinning pin.Pinner // the pinning manager + Mounts Mounts `optional:"true"` // current mount state, if any. + PrivateKey ic.PrivKey `optional:"true"` // the local node's private Key + PNetFingerprint libp2p.PNetFingerprint `optional:"true"` // fingerprint of private network // Services - Peerstore pstore.Peerstore // storage for other Peer instances + Peerstore pstore.Peerstore `optional:"true"` // storage for other Peer instances Blockstore bstore.GCBlockstore // the block store (lower level) - Filestore *filestore.Filestore // the filestore blockstore - BaseBlocks bstore.Blockstore // the raw blockstore, no filestore wrapping + Filestore *filestore.Filestore `optional:"true"` // the filestore blockstore + BaseBlocks node.BaseBlocks // the raw blockstore, no filestore wrapping GCLocker bstore.GCLocker // the locker used to protect the blockstore during gc Blocks bserv.BlockService // the block service, get/add blocks. DAG ipld.DAGService // the merkle dag service, get/add objects. Resolver *resolver.Resolver // the path resolution system - Reporter metrics.Reporter - Discovery discovery.Service + Reporter metrics.Reporter `optional:"true"` + Discovery discovery.Service `optional:"true"` FilesRoot *mfs.Root RecordValidator record.Validator // Online - PeerHost p2phost.Host // the network host (server+client) - Bootstrapper io.Closer // the periodic bootstrapper - Routing routing.IpfsRouting // the routing system. recommend ipfs-dht + PeerHost p2phost.Host `optional:"true"` // the network host (server+client) + Bootstrapper io.Closer `optional:"true"` // the periodic bootstrapper + Routing routing.Routing `optional:"true"` // the routing system. recommend ipfs-dht Exchange exchange.Interface // the block exchange + strategy (bitswap) Namesys namesys.NameSystem // the name system, resolves paths to hashes - Provider provider.Provider // the value provider system - Reprovider *rp.Reprovider // the value reprovider system - IpnsRepub *ipnsrp.Republisher + Provider provider.System // the value provider system + IpnsRepub *ipnsrp.Republisher `optional:"true"` + + AutoNAT *autonat.AutoNATService `optional:"true"` + PubSub *pubsub.PubSub `optional:"true"` + PSRouter *psrouter.PubsubValueStore `optional:"true"` + DHT *dht.IpfsDHT `optional:"true"` + P2P *p2p.P2P `optional:"true"` - AutoNAT *autonat.AutoNATService - PubSub *pubsub.PubSub - PSRouter *psrouter.PubsubValueStore - DHT *dht.IpfsDHT - P2P *p2p.P2P + Process goprocess.Process + ctx context.Context - proc goprocess.Process - ctx context.Context + stop func() error // Flags - IsOnline bool // Online is set when networking is enabled. - IsDaemon bool // Daemon is set when running on a long-running daemon. + IsOnline bool `optional:"true"` // Online is set when networking is enabled. + IsDaemon bool `optional:"true"` // Daemon is set when running on a long-running daemon. } // Mounts defines what the node's mount state is. This should @@ -151,508 +118,9 @@ type Mounts struct { Ipns mount.Mount } -func (n *IpfsNode) startOnlineServices(ctx context.Context, routingOption RoutingOption, hostOption HostOption, do DiscoveryOption, pubsub, ipnsps, mplex bool) error { - if n.PeerHost != nil { // already online. - return errors.New("node already online") - } - - if n.PrivateKey == nil { - return fmt.Errorf("private key not available") - } - - // get undialable addrs from config - cfg, err := n.Repo.Config() - if err != nil { - return err - } - - var libp2pOpts []libp2p.Option - for _, s := range cfg.Swarm.AddrFilters { - f, err := mamask.NewMask(s) - if err != nil { - return fmt.Errorf("incorrectly formatted address filter in config: %s", s) - } - libp2pOpts = append(libp2pOpts, libp2p.FilterAddresses(f)) - } - - if !cfg.Swarm.DisableBandwidthMetrics { - // Set reporter - n.Reporter = metrics.NewBandwidthCounter() - libp2pOpts = append(libp2pOpts, libp2p.BandwidthReporter(n.Reporter)) - } - - swarmkey, err := n.Repo.SwarmKey() - if err != nil { - return err - } - - if swarmkey != nil { - protec, err := pnet.NewProtector(bytes.NewReader(swarmkey)) - if err != nil { - return fmt.Errorf("failed to configure private network: %s", err) - } - n.PNetFingerprint = protec.Fingerprint() - go func() { - t := time.NewTicker(30 * time.Second) - <-t.C // swallow one tick - for { - select { - case <-t.C: - if ph := n.PeerHost; ph != nil { - if len(ph.Network().Peers()) == 0 { - log.Warning("We are in private network and have no peers.") - log.Warning("This might be configuration mistake.") - } - } - case <-n.Process().Closing(): - t.Stop() - return - } - } - }() - - libp2pOpts = append(libp2pOpts, libp2p.PrivateNetwork(protec)) - } - - addrsFactory, err := makeAddrsFactory(cfg.Addresses) - if err != nil { - return err - } - if !cfg.Swarm.DisableRelay { - addrsFactory = composeAddrsFactory(addrsFactory, filterRelayAddrs) - } - libp2pOpts = append(libp2pOpts, libp2p.AddrsFactory(addrsFactory)) - - connm, err := constructConnMgr(cfg.Swarm.ConnMgr) - if err != nil { - return err - } - libp2pOpts = append(libp2pOpts, libp2p.ConnectionManager(connm)) - - libp2pOpts = append(libp2pOpts, makeSmuxTransportOption(mplex)) - - if !cfg.Swarm.DisableNatPortMap { - libp2pOpts = append(libp2pOpts, libp2p.NATPortMap()) - } - - // disable the default listen addrs - libp2pOpts = append(libp2pOpts, libp2p.NoListenAddrs) - - if cfg.Swarm.DisableRelay { - // Enabled by default. - libp2pOpts = append(libp2pOpts, libp2p.DisableRelay()) - } else { - relayOpts := []circuit.RelayOpt{circuit.OptDiscovery} - if cfg.Swarm.EnableRelayHop { - relayOpts = append(relayOpts, circuit.OptHop) - } - libp2pOpts = append(libp2pOpts, libp2p.EnableRelay(relayOpts...)) - } - - // explicitly enable the default transports - libp2pOpts = append(libp2pOpts, libp2p.DefaultTransports) - - if cfg.Experimental.QUIC { - libp2pOpts = append(libp2pOpts, libp2p.Transport(quic.NewTransport)) - } - - // enable routing - libp2pOpts = append(libp2pOpts, libp2p.Routing(func(h p2phost.Host) (routing.PeerRouting, error) { - r, err := routingOption(ctx, h, n.Repo.Datastore(), n.RecordValidator) - n.Routing = r - return r, err - })) - - // enable autorelay - if cfg.Swarm.EnableAutoRelay { - libp2pOpts = append(libp2pOpts, libp2p.EnableAutoRelay()) - } - - peerhost, err := hostOption(ctx, n.Identity, n.Peerstore, libp2pOpts...) - - if err != nil { - return err - } - - n.PeerHost = peerhost - - if err := n.startOnlineServicesWithHost(ctx, routingOption, pubsub, ipnsps); err != nil { - return err - } - - // Ok, now we're ready to listen. - if err := startListening(n.PeerHost, cfg); err != nil { - return err - } - - n.P2P = p2p.NewP2P(n.Identity, n.PeerHost, n.Peerstore) - - // setup local discovery - if do != nil { - service, err := do(ctx, n.PeerHost) - if err != nil { - log.Error("mdns error: ", err) - } else { - service.RegisterNotifee(n) - n.Discovery = service - } - } - - return n.Bootstrap(DefaultBootstrapConfig) -} - -func constructConnMgr(cfg config.ConnMgr) (ifconnmgr.ConnManager, error) { - switch cfg.Type { - case "": - // 'default' value is the basic connection manager - return connmgr.NewConnManager(config.DefaultConnMgrLowWater, config.DefaultConnMgrHighWater, config.DefaultConnMgrGracePeriod), nil - case "none": - return nil, nil - case "basic": - grace, err := time.ParseDuration(cfg.GracePeriod) - if err != nil { - return nil, fmt.Errorf("parsing Swarm.ConnMgr.GracePeriod: %s", err) - } - - return connmgr.NewConnManager(cfg.LowWater, cfg.HighWater, grace), nil - default: - return nil, fmt.Errorf("unrecognized ConnMgr.Type: %q", cfg.Type) - } -} - -func (n *IpfsNode) startLateOnlineServices(ctx context.Context) error { - cfg, err := n.Repo.Config() - if err != nil { - return err - } - - // Provider - - n.Provider.Run() - - // Reprovider - - var keyProvider rp.KeyChanFunc - - switch cfg.Reprovider.Strategy { - case "all": - fallthrough - case "": - keyProvider = rp.NewBlockstoreProvider(n.Blockstore) - case "roots": - keyProvider = rp.NewPinnedProvider(n.Pinning, n.DAG, true) - case "pinned": - keyProvider = rp.NewPinnedProvider(n.Pinning, n.DAG, false) - default: - return fmt.Errorf("unknown reprovider strategy '%s'", cfg.Reprovider.Strategy) - } - n.Reprovider = rp.NewReprovider(ctx, n.Routing, keyProvider) - - reproviderInterval := kReprovideFrequency - if cfg.Reprovider.Interval != "" { - dur, err := time.ParseDuration(cfg.Reprovider.Interval) - if err != nil { - return err - } - - reproviderInterval = dur - } - - go n.Reprovider.Run(reproviderInterval) - - return nil -} - -func makeAddrsFactory(cfg config.Addresses) (p2pbhost.AddrsFactory, error) { - var annAddrs []ma.Multiaddr - for _, addr := range cfg.Announce { - maddr, err := ma.NewMultiaddr(addr) - if err != nil { - return nil, err - } - annAddrs = append(annAddrs, maddr) - } - - filters := mafilter.NewFilters() - noAnnAddrs := map[string]bool{} - for _, addr := range cfg.NoAnnounce { - f, err := mamask.NewMask(addr) - if err == nil { - filters.AddDialFilter(f) - continue - } - maddr, err := ma.NewMultiaddr(addr) - if err != nil { - return nil, err - } - noAnnAddrs[maddr.String()] = true - } - - return func(allAddrs []ma.Multiaddr) []ma.Multiaddr { - var addrs []ma.Multiaddr - if len(annAddrs) > 0 { - addrs = annAddrs - } else { - addrs = allAddrs - } - - var out []ma.Multiaddr - for _, maddr := range addrs { - // check for exact matches - ok := noAnnAddrs[maddr.String()] - // check for /ipcidr matches - if !ok && !filters.AddrBlocked(maddr) { - out = append(out, maddr) - } - } - return out - }, nil -} - -func makeSmuxTransportOption(mplexExp bool) libp2p.Option { - const yamuxID = "/yamux/1.0.0" - const mplexID = "/mplex/6.7.0" - - ymxtpt := &yamux.Transport{ - AcceptBacklog: 512, - ConnectionWriteTimeout: time.Second * 10, - KeepAliveInterval: time.Second * 30, - EnableKeepAlive: true, - MaxStreamWindowSize: uint32(16 * 1024 * 1024), // 16MiB - LogOutput: ioutil.Discard, - } - - if os.Getenv("YAMUX_DEBUG") != "" { - ymxtpt.LogOutput = os.Stderr - } - - muxers := map[string]smux.Transport{yamuxID: ymxtpt} - if mplexExp { - muxers[mplexID] = mplex.DefaultTransport - } - - // Allow muxer preference order overriding - order := []string{yamuxID, mplexID} - if prefs := os.Getenv("LIBP2P_MUX_PREFS"); prefs != "" { - order = strings.Fields(prefs) - } - - opts := make([]libp2p.Option, 0, len(order)) - for _, id := range order { - tpt, ok := muxers[id] - if !ok { - log.Warning("unknown or duplicate muxer in LIBP2P_MUX_PREFS: %s", id) - continue - } - delete(muxers, id) - opts = append(opts, libp2p.Muxer(id, tpt)) - } - - return libp2p.ChainOptions(opts...) -} - -func setupDiscoveryOption(d config.Discovery) DiscoveryOption { - if d.MDNS.Enabled { - return func(ctx context.Context, h p2phost.Host) (discovery.Service, error) { - if d.MDNS.Interval == 0 { - d.MDNS.Interval = 5 - } - return discovery.NewMdnsService(ctx, h, time.Duration(d.MDNS.Interval)*time.Second, discovery.ServiceTag) - } - } - return nil -} - -// HandlePeerFound attempts to connect to peer from `PeerInfo`, if it fails -// logs a warning log. -func (n *IpfsNode) HandlePeerFound(p pstore.PeerInfo) { - log.Warning("trying peer info: ", p) - ctx, cancel := context.WithTimeout(n.Context(), discoveryConnTimeout) - defer cancel() - if err := n.PeerHost.Connect(ctx, p); err != nil { - log.Warning("Failed to connect to peer found by discovery: ", err) - } -} - -// startOnlineServicesWithHost is the set of services which need to be -// initialized with the host and _before_ we start listening. -func (n *IpfsNode) startOnlineServicesWithHost(ctx context.Context, routingOption RoutingOption, enablePubsub bool, enableIpnsps bool) error { - cfg, err := n.Repo.Config() - if err != nil { - return err - } - - if cfg.Swarm.EnableAutoNATService { - var opts []libp2p.Option - if cfg.Experimental.QUIC { - opts = append(opts, libp2p.DefaultTransports, libp2p.Transport(quic.NewTransport)) - } - - svc, err := autonat.NewAutoNATService(ctx, n.PeerHost, opts...) - if err != nil { - return err - } - n.AutoNAT = svc - } - - if enablePubsub || enableIpnsps { - var service *pubsub.PubSub - - var pubsubOptions []pubsub.Option - if cfg.Pubsub.DisableSigning { - pubsubOptions = append(pubsubOptions, pubsub.WithMessageSigning(false)) - } - - if cfg.Pubsub.StrictSignatureVerification { - pubsubOptions = append(pubsubOptions, pubsub.WithStrictSignatureVerification(true)) - } - - switch cfg.Pubsub.Router { - case "": - fallthrough - case "floodsub": - service, err = pubsub.NewFloodSub(ctx, n.PeerHost, pubsubOptions...) - - case "gossipsub": - service, err = pubsub.NewGossipSub(ctx, n.PeerHost, pubsubOptions...) - - default: - err = fmt.Errorf("Unknown pubsub router %s", cfg.Pubsub.Router) - } - - if err != nil { - return err - } - n.PubSub = service - } - - // this code is necessary just for tests: mock network constructions - // ignore the libp2p constructor options that actually construct the routing! - if n.Routing == nil { - r, err := routingOption(ctx, n.PeerHost, n.Repo.Datastore(), n.RecordValidator) - if err != nil { - return err - } - n.Routing = r - n.PeerHost = rhost.Wrap(n.PeerHost, n.Routing) - } - - // TODO: I'm not a fan of type assertions like this but the - // `RoutingOption` system doesn't currently provide access to the - // IpfsNode. - // - // Ideally, we'd do something like: - // - // 1. Add some fancy method to introspect into tiered routers to extract - // things like the pubsub router or the DHT (complicated, messy, - // probably not worth it). - // 2. Pass the IpfsNode into the RoutingOption (would also remove the - // PSRouter case below. - // 3. Introduce some kind of service manager? (my personal favorite but - // that requires a fair amount of work). - if dht, ok := n.Routing.(*dht.IpfsDHT); ok { - n.DHT = dht - } - - if enableIpnsps { - n.PSRouter = psrouter.NewPubsubValueStore( - ctx, - n.PeerHost, - n.Routing, - n.PubSub, - n.RecordValidator, - ) - n.Routing = rhelpers.Tiered{ - Routers: []routing.IpfsRouting{ - // Always check pubsub first. - &rhelpers.Compose{ - ValueStore: &rhelpers.LimitedValueStore{ - ValueStore: n.PSRouter, - Namespaces: []string{"ipns"}, - }, - }, - n.Routing, - }, - Validator: n.RecordValidator, - } - } - - // setup exchange service - bitswapNetwork := bsnet.NewFromIpfsHost(n.PeerHost, n.Routing) - n.Exchange = bitswap.New(ctx, bitswapNetwork, n.Blockstore) - - size, err := n.getCacheSize() - if err != nil { - return err - } - - // setup name system - n.Namesys = namesys.NewNameSystem(n.Routing, n.Repo.Datastore(), size) - - // setup ipns republishing - return n.setupIpnsRepublisher() -} - -// getCacheSize returns cache life and cache size -func (n *IpfsNode) getCacheSize() (int, error) { - cfg, err := n.Repo.Config() - if err != nil { - return 0, err - } - - cs := cfg.Ipns.ResolveCacheSize - if cs == 0 { - cs = DefaultIpnsCacheSize - } - if cs < 0 { - return 0, fmt.Errorf("cannot specify negative resolve cache size") - } - return cs, nil -} - -func (n *IpfsNode) setupIpnsRepublisher() error { - cfg, err := n.Repo.Config() - if err != nil { - return err - } - - n.IpnsRepub = ipnsrp.NewRepublisher(n.Namesys, n.Repo.Datastore(), n.PrivateKey, n.Repo.Keystore()) - - if cfg.Ipns.RepublishPeriod != "" { - d, err := time.ParseDuration(cfg.Ipns.RepublishPeriod) - if err != nil { - return fmt.Errorf("failure to parse config setting IPNS.RepublishPeriod: %s", err) - } - - if !u.Debug && (d < time.Minute || d > (time.Hour*24)) { - return fmt.Errorf("config setting IPNS.RepublishPeriod is not between 1min and 1day: %s", d) - } - - n.IpnsRepub.Interval = d - } - - if cfg.Ipns.RecordLifetime != "" { - d, err := time.ParseDuration(cfg.Ipns.RecordLifetime) - if err != nil { - return fmt.Errorf("failure to parse config setting IPNS.RecordLifetime: %s", err) - } - - n.IpnsRepub.RecordLifetime = d - } - - n.Process().Go(n.IpnsRepub.Run) - - return nil -} - -// Process returns the Process object -func (n *IpfsNode) Process() goprocess.Process { - return n.proc -} - -// Close calls Close() on the Process object +// Close calls Close() on the App object func (n *IpfsNode) Close() error { - return n.proc.Close() + return n.stop() } // Context returns the IpfsNode context @@ -663,70 +131,8 @@ func (n *IpfsNode) Context() context.Context { return n.ctx } -// teardown closes owned children. If any errors occur, this function returns -// the first error. -func (n *IpfsNode) teardown() error { - log.Debug("core is shutting down...") - // owned objects are closed in this teardown to ensure that they're closed - // regardless of which constructor was used to add them to the node. - var closers []io.Closer - - // NOTE: The order that objects are added(closed) matters, if an object - // needs to use another during its shutdown/cleanup process, it should be - // closed before that other object - - if n.Provider != nil { - closers = append(closers, n.Provider) - } - - if n.FilesRoot != nil { - closers = append(closers, n.FilesRoot) - } - - if n.Exchange != nil { - closers = append(closers, n.Exchange) - } - - if n.Mounts.Ipfs != nil && !n.Mounts.Ipfs.IsActive() { - closers = append(closers, mount.Closer(n.Mounts.Ipfs)) - } - if n.Mounts.Ipns != nil && !n.Mounts.Ipns.IsActive() { - closers = append(closers, mount.Closer(n.Mounts.Ipns)) - } - - if n.DHT != nil { - closers = append(closers, n.DHT.Process()) - } - - if n.Blocks != nil { - closers = append(closers, n.Blocks) - } - - if n.Bootstrapper != nil { - closers = append(closers, n.Bootstrapper) - } - - if n.PeerHost != nil { - closers = append(closers, n.PeerHost) - } - - // Repo closed last, most things need to preserve state here - closers = append(closers, n.Repo) - - var errs []error - for _, closer := range closers { - if err := closer.Close(); err != nil { - errs = append(errs, err) - } - } - if len(errs) > 0 { - return errs[0] - } - return nil -} - // Bootstrap will set and call the IpfsNodes bootstrap function. -func (n *IpfsNode) Bootstrap(cfg BootstrapConfig) error { +func (n *IpfsNode) Bootstrap(cfg bootstrap.BootstrapConfig) error { // TODO what should return value be when in offlineMode? if n.Routing == nil { return nil @@ -739,7 +145,7 @@ func (n *IpfsNode) Bootstrap(cfg BootstrapConfig) error { // if the caller did not specify a bootstrap peer function, get the // freshest bootstrap peers from config. this responds to live changes. if cfg.BootstrapPeers == nil { - cfg.BootstrapPeers = func() []pstore.PeerInfo { + cfg.BootstrapPeers = func() []peer.AddrInfo { ps, err := n.loadBootstrapPeers() if err != nil { log.Warning("failed to parse bootstrap peers from config") @@ -750,172 +156,17 @@ func (n *IpfsNode) Bootstrap(cfg BootstrapConfig) error { } var err error - n.Bootstrapper, err = Bootstrap(n, cfg) + n.Bootstrapper, err = bootstrap.Bootstrap(n.Identity, n.PeerHost, n.Routing, cfg) return err } -func (n *IpfsNode) loadID() error { - if n.Identity != "" { - return errors.New("identity already loaded") - } - - cfg, err := n.Repo.Config() - if err != nil { - return err - } - - cid := cfg.Identity.PeerID - if cid == "" { - return errors.New("identity was not set in config (was 'ipfs init' run?)") - } - if len(cid) == 0 { - return errors.New("no peer ID in config! (was 'ipfs init' run?)") - } - - id, err := peer.IDB58Decode(cid) - if err != nil { - return fmt.Errorf("peer ID invalid: %s", err) - } - - n.Identity = id - return nil -} - -// GetKey will return a key from the Keystore with name `name`. -func (n *IpfsNode) GetKey(name string) (ic.PrivKey, error) { - if name == "self" { - if n.PrivateKey == nil { - return nil, fmt.Errorf("private key not available") - } - return n.PrivateKey, nil - } else { - return n.Repo.Keystore().Get(name) - } -} - -// loadPrivateKey loads the private key *if* available -func (n *IpfsNode) loadPrivateKey() error { - if n.Identity == "" || n.Peerstore == nil { - return errors.New("loaded private key out of order") - } - - if n.PrivateKey != nil { - log.Warning("private key already loaded") - return nil - } - - cfg, err := n.Repo.Config() - if err != nil { - return err - } - - if cfg.Identity.PrivKey == "" { - return nil - } - - sk, err := loadPrivateKey(&cfg.Identity, n.Identity) - if err != nil { - return err - } - - if err := n.Peerstore.AddPrivKey(n.Identity, sk); err != nil { - return err - } - if err := n.Peerstore.AddPubKey(n.Identity, sk.GetPublic()); err != nil { - return err - } - n.PrivateKey = sk - return nil -} - -func (n *IpfsNode) loadBootstrapPeers() ([]pstore.PeerInfo, error) { +func (n *IpfsNode) loadBootstrapPeers() ([]peer.AddrInfo, error) { cfg, err := n.Repo.Config() if err != nil { return nil, err } - parsed, err := cfg.BootstrapPeers() - if err != nil { - return nil, err - } - return toPeerInfos(parsed), nil -} - -func (n *IpfsNode) loadFilesRoot() error { - dsk := ds.NewKey("/local/filesroot") - pf := func(ctx context.Context, c cid.Cid) error { - return n.Repo.Datastore().Put(dsk, c.Bytes()) - } - - var nd *merkledag.ProtoNode - val, err := n.Repo.Datastore().Get(dsk) - - switch { - case err == ds.ErrNotFound || val == nil: - nd = ft.EmptyDirNode() - err := n.DAG.Add(n.Context(), nd) - if err != nil { - return fmt.Errorf("failure writing to dagstore: %s", err) - } - case err == nil: - c, err := cid.Cast(val) - if err != nil { - return err - } - - rnd, err := n.DAG.Get(n.Context(), c) - if err != nil { - return fmt.Errorf("error loading filesroot from DAG: %s", err) - } - - pbnd, ok := rnd.(*merkledag.ProtoNode) - if !ok { - return merkledag.ErrNotProtobuf - } - - nd = pbnd - default: - return err - } - - mr, err := mfs.NewRoot(n.Context(), n.DAG, nd, pf) - if err != nil { - return err - } - - n.FilesRoot = mr - return nil -} - -func loadPrivateKey(cfg *config.Identity, id peer.ID) (ic.PrivKey, error) { - sk, err := cfg.DecodePrivateKey("passphrase todo!") - if err != nil { - return nil, err - } - - id2, err := peer.IDFromPrivateKey(sk) - if err != nil { - return nil, err - } - - if id2 != id { - return nil, fmt.Errorf("private key in config does not match id: %s != %s", id, id2) - } - - return sk, nil -} - -func listenAddresses(cfg *config.Config) ([]ma.Multiaddr, error) { - var listen []ma.Multiaddr - for _, addr := range cfg.Addresses.Swarm { - maddr, err := ma.NewMultiaddr(addr) - if err != nil { - return nil, fmt.Errorf("failure to parse config.Addresses.Swarm: %s", cfg.Addresses.Swarm) - } - listen = append(listen, maddr) - } - - return listen, nil + return cfg.BootstrapPeers() } type ConstructPeerHostOpts struct { @@ -923,83 +174,5 @@ type ConstructPeerHostOpts struct { DisableNatPortMap bool DisableRelay bool EnableRelayHop bool - ConnectionManager ifconnmgr.ConnManager -} - -type HostOption func(ctx context.Context, id peer.ID, ps pstore.Peerstore, options ...libp2p.Option) (p2phost.Host, error) - -var DefaultHostOption HostOption = constructPeerHost - -// isolates the complex initialization steps -func constructPeerHost(ctx context.Context, id peer.ID, ps pstore.Peerstore, options ...libp2p.Option) (p2phost.Host, error) { - pkey := ps.PrivKey(id) - if pkey == nil { - return nil, fmt.Errorf("missing private key for node ID: %s", id.Pretty()) - } - options = append([]libp2p.Option{libp2p.Identity(pkey), libp2p.Peerstore(ps)}, options...) - return libp2p.New(ctx, options...) -} - -func filterRelayAddrs(addrs []ma.Multiaddr) []ma.Multiaddr { - var raddrs []ma.Multiaddr - for _, addr := range addrs { - _, err := addr.ValueForProtocol(circuit.P_CIRCUIT) - if err == nil { - continue - } - raddrs = append(raddrs, addr) - } - return raddrs + ConnectionManager connmgr.ConnManager } - -func composeAddrsFactory(f, g p2pbhost.AddrsFactory) p2pbhost.AddrsFactory { - return func(addrs []ma.Multiaddr) []ma.Multiaddr { - return f(g(addrs)) - } -} - -// startListening on the network addresses -func startListening(host p2phost.Host, cfg *config.Config) error { - listenAddrs, err := listenAddresses(cfg) - if err != nil { - return err - } - - // Actually start listening: - if err := host.Network().Listen(listenAddrs...); err != nil { - return err - } - - // list out our addresses - addrs, err := host.Network().InterfaceListenAddresses() - if err != nil { - return err - } - log.Infof("Swarm listening at: %s", addrs) - return nil -} - -func constructDHTRouting(ctx context.Context, host p2phost.Host, dstore ds.Batching, validator record.Validator) (routing.IpfsRouting, error) { - return dht.New( - ctx, host, - dhtopts.Datastore(dstore), - dhtopts.Validator(validator), - ) -} - -func constructClientDHTRouting(ctx context.Context, host p2phost.Host, dstore ds.Batching, validator record.Validator) (routing.IpfsRouting, error) { - return dht.New( - ctx, host, - dhtopts.Client(true), - dhtopts.Datastore(dstore), - dhtopts.Validator(validator), - ) -} - -type RoutingOption func(context.Context, p2phost.Host, ds.Batching, record.Validator) (routing.IpfsRouting, error) - -type DiscoveryOption func(context.Context, p2phost.Host) (discovery.Service, error) - -var DHTOption RoutingOption = constructDHTRouting -var DHTClientOption RoutingOption = constructClientDHTRouting -var NilRouterOption RoutingOption = nilrouting.ConstructNilRouting diff --git a/vendor/github.com/ipfs/go-ipfs/core/node/builder.go b/vendor/github.com/ipfs/go-ipfs/core/node/builder.go new file mode 100644 index 00000000..129ac0a3 --- /dev/null +++ b/vendor/github.com/ipfs/go-ipfs/core/node/builder.go @@ -0,0 +1,151 @@ +package node + +import ( + "context" + "crypto/rand" + "encoding/base64" + "errors" + + "go.uber.org/fx" + + "github.com/ipfs/go-ipfs/core/node/helpers" + "github.com/ipfs/go-ipfs/core/node/libp2p" + "github.com/ipfs/go-ipfs/repo" + + ds "github.com/ipfs/go-datastore" + dsync "github.com/ipfs/go-datastore/sync" + cfg "github.com/ipfs/go-ipfs-config" + ci "github.com/libp2p/go-libp2p-core/crypto" + peer "github.com/libp2p/go-libp2p-core/peer" +) + +type BuildCfg struct { + // If online is set, the node will have networking enabled + Online bool + + // ExtraOpts is a map of extra options used to configure the ipfs nodes creation + ExtraOpts map[string]bool + + // If permanent then node should run more expensive processes + // that will improve performance in long run + Permanent bool + + // DisableEncryptedConnections disables connection encryption *entirely*. + // DO NOT SET THIS UNLESS YOU'RE TESTING. + DisableEncryptedConnections bool + + // If NilRepo is set, a Repo backed by a nil datastore will be constructed + NilRepo bool + + Routing libp2p.RoutingOption + Host libp2p.HostOption + Repo repo.Repo +} + +func (cfg *BuildCfg) getOpt(key string) bool { + if cfg.ExtraOpts == nil { + return false + } + + return cfg.ExtraOpts[key] +} + +func (cfg *BuildCfg) fillDefaults() error { + if cfg.Repo != nil && cfg.NilRepo { + return errors.New("cannot set a Repo and specify nilrepo at the same time") + } + + if cfg.Repo == nil { + var d ds.Datastore + if cfg.NilRepo { + d = ds.NewNullDatastore() + } else { + d = ds.NewMapDatastore() + } + r, err := defaultRepo(dsync.MutexWrap(d)) + if err != nil { + return err + } + cfg.Repo = r + } + + if cfg.Routing == nil { + cfg.Routing = libp2p.DHTOption + } + + if cfg.Host == nil { + cfg.Host = libp2p.DefaultHostOption + } + + return nil +} + +// options creates fx option group from this build config +func (cfg *BuildCfg) options(ctx context.Context) (fx.Option, *cfg.Config) { + err := cfg.fillDefaults() + if err != nil { + return fx.Error(err), nil + } + + repoOption := fx.Provide(func(lc fx.Lifecycle) repo.Repo { + lc.Append(fx.Hook{ + OnStop: func(ctx context.Context) error { + return cfg.Repo.Close() + }, + }) + + return cfg.Repo + }) + + metricsCtx := fx.Provide(func() helpers.MetricsCtx { + return helpers.MetricsCtx(ctx) + }) + + hostOption := fx.Provide(func() libp2p.HostOption { + return cfg.Host + }) + + routingOption := fx.Provide(func() libp2p.RoutingOption { + return cfg.Routing + }) + + conf, err := cfg.Repo.Config() + if err != nil { + return fx.Error(err), nil + } + + return fx.Options( + repoOption, + hostOption, + routingOption, + metricsCtx, + ), conf +} + +func defaultRepo(dstore repo.Datastore) (repo.Repo, error) { + c := cfg.Config{} + priv, pub, err := ci.GenerateKeyPairWithReader(ci.RSA, 1024, rand.Reader) + if err != nil { + return nil, err + } + + pid, err := peer.IDFromPublicKey(pub) + if err != nil { + return nil, err + } + + privkeyb, err := priv.Bytes() + if err != nil { + return nil, err + } + + c.Bootstrap = cfg.DefaultBootstrapAddresses + c.Addresses.Swarm = []string{"/ip4/0.0.0.0/tcp/4001"} + c.Identity.PeerID = pid.Pretty() + c.Identity.PrivKey = base64.StdEncoding.EncodeToString(privkeyb) + + return &repo.Mock{ + D: dstore, + C: c, + }, nil +} diff --git a/vendor/github.com/ipfs/go-ipfs/core/node/core.go b/vendor/github.com/ipfs/go-ipfs/core/node/core.go new file mode 100644 index 00000000..ddb42aff --- /dev/null +++ b/vendor/github.com/ipfs/go-ipfs/core/node/core.go @@ -0,0 +1,124 @@ +package node + +import ( + "context" + "fmt" + + "github.com/ipfs/go-ipfs/core/node/helpers" + "github.com/ipfs/go-ipfs/pin" + "github.com/ipfs/go-ipfs/repo" + + "github.com/ipfs/go-bitswap" + "github.com/ipfs/go-bitswap/network" + "github.com/ipfs/go-blockservice" + "github.com/ipfs/go-cid" + "github.com/ipfs/go-datastore" + "github.com/ipfs/go-ipfs-blockstore" + "github.com/ipfs/go-ipfs-exchange-interface" + "github.com/ipfs/go-ipfs-exchange-offline" + "github.com/ipfs/go-ipld-format" + "github.com/ipfs/go-merkledag" + "github.com/ipfs/go-mfs" + "github.com/ipfs/go-unixfs" + "github.com/libp2p/go-libp2p-core/host" + "github.com/libp2p/go-libp2p-core/routing" + "go.uber.org/fx" +) + +// BlockService creates new blockservice which provides an interface to fetch content-addressable blocks +func BlockService(lc fx.Lifecycle, bs blockstore.Blockstore, rem exchange.Interface) blockservice.BlockService { + bsvc := blockservice.New(bs, rem) + + lc.Append(fx.Hook{ + OnStop: func(ctx context.Context) error { + return bsvc.Close() + }, + }) + + return bsvc +} + +// Pinning creates new pinner which tells GC which blocks should be kept +func Pinning(bstore blockstore.Blockstore, ds format.DAGService, repo repo.Repo) (pin.Pinner, error) { + internalDag := merkledag.NewDAGService(blockservice.New(bstore, offline.Exchange(bstore))) + pinning, err := pin.LoadPinner(repo.Datastore(), ds, internalDag) + if err != nil { + // TODO: we should move towards only running 'NewPinner' explicitly on + // node init instead of implicitly here as a result of the pinner keys + // not being found in the datastore. + // this is kinda sketchy and could cause data loss + pinning = pin.NewPinner(repo.Datastore(), ds, internalDag) + } + + return pinning, nil +} + +// Dag creates new DAGService +func Dag(bs blockservice.BlockService) format.DAGService { + return merkledag.NewDAGService(bs) +} + +// OnlineExchange creates new LibP2P backed block exchange (BitSwap) +func OnlineExchange(provide bool) interface{} { + return func(mctx helpers.MetricsCtx, lc fx.Lifecycle, host host.Host, rt routing.Routing, bs blockstore.GCBlockstore) exchange.Interface { + bitswapNetwork := network.NewFromIpfsHost(host, rt) + exch := bitswap.New(helpers.LifecycleCtx(mctx, lc), bitswapNetwork, bs, bitswap.ProvideEnabled(provide)) + lc.Append(fx.Hook{ + OnStop: func(ctx context.Context) error { + return exch.Close() + }, + }) + return exch + + } +} + +// Files loads persisted MFS root +func Files(mctx helpers.MetricsCtx, lc fx.Lifecycle, repo repo.Repo, dag format.DAGService) (*mfs.Root, error) { + dsk := datastore.NewKey("/local/filesroot") + pf := func(ctx context.Context, c cid.Cid) error { + return repo.Datastore().Put(dsk, c.Bytes()) + } + + var nd *merkledag.ProtoNode + val, err := repo.Datastore().Get(dsk) + ctx := helpers.LifecycleCtx(mctx, lc) + + switch { + case err == datastore.ErrNotFound || val == nil: + nd = unixfs.EmptyDirNode() + err := dag.Add(ctx, nd) + if err != nil { + return nil, fmt.Errorf("failure writing to dagstore: %s", err) + } + case err == nil: + c, err := cid.Cast(val) + if err != nil { + return nil, err + } + + rnd, err := dag.Get(ctx, c) + if err != nil { + return nil, fmt.Errorf("error loading filesroot from DAG: %s", err) + } + + pbnd, ok := rnd.(*merkledag.ProtoNode) + if !ok { + return nil, merkledag.ErrNotProtobuf + } + + nd = pbnd + default: + return nil, err + } + + root, err := mfs.NewRoot(ctx, dag, nd, pf) + + lc.Append(fx.Hook{ + OnStop: func(ctx context.Context) error { + return root.Close() + }, + }) + + return root, err +} diff --git a/vendor/github.com/ipfs/go-ipfs/core/node/groups.go b/vendor/github.com/ipfs/go-ipfs/core/node/groups.go new file mode 100644 index 00000000..1e5207b8 --- /dev/null +++ b/vendor/github.com/ipfs/go-ipfs/core/node/groups.go @@ -0,0 +1,294 @@ +package node + +import ( + "context" + "errors" + "fmt" + "time" + + blockstore "github.com/ipfs/go-ipfs-blockstore" + "github.com/ipfs/go-ipfs-config" + util "github.com/ipfs/go-ipfs-util" + peer "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p-peerstore/pstoremem" + pubsub "github.com/libp2p/go-libp2p-pubsub" + + "github.com/ipfs/go-ipfs/core/node/libp2p" + "github.com/ipfs/go-ipfs/p2p" + + offline "github.com/ipfs/go-ipfs-exchange-offline" + offroute "github.com/ipfs/go-ipfs-routing/offline" + "github.com/ipfs/go-path/resolver" + uio "github.com/ipfs/go-unixfs/io" + "go.uber.org/fx" +) + +var BaseLibP2P = fx.Options( + fx.Provide(libp2p.PNet), + fx.Provide(libp2p.ConnectionManager), + fx.Provide(libp2p.DefaultTransports), + + fx.Provide(libp2p.Host), + + fx.Provide(libp2p.DiscoveryHandler), + + fx.Invoke(libp2p.PNetChecker), +) + +func LibP2P(bcfg *BuildCfg, cfg *config.Config) fx.Option { + // parse ConnMgr config + + grace := config.DefaultConnMgrGracePeriod + low := config.DefaultConnMgrLowWater + high := config.DefaultConnMgrHighWater + + connmgr := fx.Options() + + if cfg.Swarm.ConnMgr.Type != "none" { + switch cfg.Swarm.ConnMgr.Type { + case "": + // 'default' value is the basic connection manager + break + case "basic": + var err error + grace, err = time.ParseDuration(cfg.Swarm.ConnMgr.GracePeriod) + if err != nil { + return fx.Error(fmt.Errorf("parsing Swarm.ConnMgr.GracePeriod: %s", err)) + } + + low = cfg.Swarm.ConnMgr.LowWater + high = cfg.Swarm.ConnMgr.HighWater + default: + return fx.Error(fmt.Errorf("unrecognized ConnMgr.Type: %q", cfg.Swarm.ConnMgr.Type)) + } + + connmgr = fx.Provide(libp2p.ConnectionManager(low, high, grace)) + } + + // parse PubSub config + + ps := fx.Options() + if bcfg.getOpt("pubsub") || bcfg.getOpt("ipnsps") { + var pubsubOptions []pubsub.Option + pubsubOptions = append( + pubsubOptions, + pubsub.WithMessageSigning(!cfg.Pubsub.DisableSigning), + pubsub.WithStrictSignatureVerification(cfg.Pubsub.StrictSignatureVerification), + ) + + switch cfg.Pubsub.Router { + case "": + fallthrough + case "floodsub": + ps = fx.Provide(libp2p.FloodSub(pubsubOptions...)) + case "gossipsub": + ps = fx.Provide(libp2p.GossipSub(pubsubOptions...)) + default: + return fx.Error(fmt.Errorf("unknown pubsub router %s", cfg.Pubsub.Router)) + } + } + + // Gather all the options + + opts := fx.Options( + BaseLibP2P, + + fx.Provide(libp2p.AddrFilters(cfg.Swarm.AddrFilters)), + fx.Provide(libp2p.AddrsFactory(cfg.Addresses.Announce, cfg.Addresses.NoAnnounce)), + fx.Provide(libp2p.SmuxTransport(bcfg.getOpt("mplex"))), + fx.Provide(libp2p.Relay(cfg.Swarm.DisableRelay, cfg.Swarm.EnableRelayHop)), + fx.Invoke(libp2p.StartListening(cfg.Addresses.Swarm)), + fx.Invoke(libp2p.SetupDiscovery(cfg.Discovery.MDNS.Enabled, cfg.Discovery.MDNS.Interval)), + + fx.Provide(libp2p.Security(!bcfg.DisableEncryptedConnections, cfg.Experimental.PreferTLS)), + + fx.Provide(libp2p.Routing), + fx.Provide(libp2p.BaseRouting), + maybeProvide(libp2p.PubsubRouter, bcfg.getOpt("ipnsps")), + + maybeProvide(libp2p.BandwidthCounter, !cfg.Swarm.DisableBandwidthMetrics), + maybeProvide(libp2p.NatPortMap, !cfg.Swarm.DisableNatPortMap), + maybeProvide(libp2p.AutoRealy, cfg.Swarm.EnableAutoRelay), + maybeProvide(libp2p.QUIC, cfg.Experimental.QUIC), + maybeInvoke(libp2p.AutoNATService(cfg.Experimental.QUIC), cfg.Swarm.EnableAutoNATService), + connmgr, + ps, + ) + + return opts +} + +// Storage groups units which setup datastore based persistence and blockstore layers +func Storage(bcfg *BuildCfg, cfg *config.Config) fx.Option { + cacheOpts := blockstore.DefaultCacheOpts() + cacheOpts.HasBloomFilterSize = cfg.Datastore.BloomFilterSize + if !bcfg.Permanent { + cacheOpts.HasBloomFilterSize = 0 + } + + finalBstore := fx.Provide(GcBlockstoreCtor) + if cfg.Experimental.FilestoreEnabled || cfg.Experimental.UrlstoreEnabled { + finalBstore = fx.Provide(FilestoreBlockstoreCtor) + } + + return fx.Options( + fx.Provide(RepoConfig), + fx.Provide(Datastore), + fx.Provide(BaseBlockstoreCtor(cacheOpts, bcfg.NilRepo, cfg.Datastore.HashOnRead)), + finalBstore, + ) +} + +// Identity groups units providing cryptographic identity +func Identity(cfg *config.Config) fx.Option { + // PeerID + + cid := cfg.Identity.PeerID + if cid == "" { + return fx.Error(errors.New("identity was not set in config (was 'ipfs init' run?)")) + } + if len(cid) == 0 { + return fx.Error(errors.New("no peer ID in config! (was 'ipfs init' run?)")) + } + + id, err := peer.IDB58Decode(cid) + if err != nil { + return fx.Error(fmt.Errorf("peer ID invalid: %s", err)) + } + + // Private Key + + if cfg.Identity.PrivKey == "" { + return fx.Options( // No PK (usually in tests) + fx.Provide(PeerID(id)), + fx.Provide(pstoremem.NewPeerstore), + ) + } + + sk, err := cfg.Identity.DecodePrivateKey("passphrase todo!") + if err != nil { + return fx.Error(err) + } + + return fx.Options( // Full identity + fx.Provide(PeerID(id)), + fx.Provide(PrivateKey(sk)), + fx.Provide(pstoremem.NewPeerstore), + + fx.Invoke(libp2p.PstoreAddSelfKeys), + ) +} + +// IPNS groups namesys related units +var IPNS = fx.Options( + fx.Provide(RecordValidator), +) + +// Online groups online-only units +func Online(bcfg *BuildCfg, cfg *config.Config) fx.Option { + + // Namesys params + + ipnsCacheSize := cfg.Ipns.ResolveCacheSize + if ipnsCacheSize == 0 { + ipnsCacheSize = DefaultIpnsCacheSize + } + if ipnsCacheSize < 0 { + return fx.Error(fmt.Errorf("cannot specify negative resolve cache size")) + } + + // Republisher params + + var repubPeriod, recordLifetime time.Duration + + if cfg.Ipns.RepublishPeriod != "" { + d, err := time.ParseDuration(cfg.Ipns.RepublishPeriod) + if err != nil { + return fx.Error(fmt.Errorf("failure to parse config setting IPNS.RepublishPeriod: %s", err)) + } + + if !util.Debug && (d < time.Minute || d > (time.Hour*24)) { + return fx.Error(fmt.Errorf("config setting IPNS.RepublishPeriod is not between 1min and 1day: %s", d)) + } + + repubPeriod = d + } + + if cfg.Ipns.RecordLifetime != "" { + d, err := time.ParseDuration(cfg.Ipns.RecordLifetime) + if err != nil { + return fx.Error(fmt.Errorf("failure to parse config setting IPNS.RecordLifetime: %s", err)) + } + + recordLifetime = d + } + + /* don't provide from bitswap when the strategic provider service is active */ + shouldBitswapProvide := !cfg.Experimental.StrategicProviding + + return fx.Options( + fx.Provide(OnlineExchange(shouldBitswapProvide)), + fx.Provide(Namesys(ipnsCacheSize)), + + fx.Invoke(IpnsRepublisher(repubPeriod, recordLifetime)), + + fx.Provide(p2p.New), + + LibP2P(bcfg, cfg), + OnlineProviders(cfg.Experimental.StrategicProviding, cfg.Reprovider.Strategy, cfg.Reprovider.Interval), + ) +} + +// Offline groups offline alternatives to Online units +func Offline(cfg *config.Config) fx.Option { + return fx.Options( + fx.Provide(offline.Exchange), + fx.Provide(Namesys(0)), + fx.Provide(offroute.NewOfflineRouter), + OfflineProviders(cfg.Experimental.StrategicProviding, cfg.Reprovider.Strategy, cfg.Reprovider.Interval), + ) +} + +// Core groups basic IPFS services +var Core = fx.Options( + fx.Provide(BlockService), + fx.Provide(Dag), + fx.Provide(resolver.NewBasicResolver), + fx.Provide(Pinning), + fx.Provide(Files), +) + +func Networked(bcfg *BuildCfg, cfg *config.Config) fx.Option { + if bcfg.Online { + return Online(bcfg, cfg) + } + return Offline(cfg) +} + +// IPFS builds a group of fx Options based on the passed BuildCfg +func IPFS(ctx context.Context, bcfg *BuildCfg) fx.Option { + if bcfg == nil { + bcfg = new(BuildCfg) + } + + bcfgOpts, cfg := bcfg.options(ctx) + if cfg == nil { + return bcfgOpts // error + } + + // TEMP: setting global sharding switch here + uio.UseHAMTSharding = cfg.Experimental.ShardingEnabled + + return fx.Options( + bcfgOpts, + + fx.Provide(baseProcess), + + Storage(bcfg, cfg), + Identity(cfg), + IPNS, + Networked(bcfg, cfg), + + Core, + ) +} diff --git a/vendor/github.com/ipfs/go-ipfs/core/node/helpers.go b/vendor/github.com/ipfs/go-ipfs/core/node/helpers.go new file mode 100644 index 00000000..9ecd8036 --- /dev/null +++ b/vendor/github.com/ipfs/go-ipfs/core/node/helpers.go @@ -0,0 +1,62 @@ +package node + +import ( + "context" + + "github.com/jbenet/goprocess" + "github.com/pkg/errors" + "go.uber.org/fx" +) + +type lcProcess struct { + fx.In + + LC fx.Lifecycle + Proc goprocess.Process +} + +// Append wraps ProcessFunc into a goprocess, and appends it to the lifecycle +func (lp *lcProcess) Append(f goprocess.ProcessFunc) { + // Hooks are guaranteed to run in sequence. If a hook fails to start, its + // OnStop won't be executed. + var proc goprocess.Process + + lp.LC.Append(fx.Hook{ + OnStart: func(ctx context.Context) error { + proc = lp.Proc.Go(f) + return nil + }, + OnStop: func(ctx context.Context) error { + if proc == nil { // Theoretically this shouldn't ever happen + return errors.New("lcProcess: proc was nil") + } + + return proc.Close() // todo: respect ctx, somehow + }, + }) +} + +func maybeProvide(opt interface{}, enable bool) fx.Option { + if enable { + return fx.Provide(opt) + } + return fx.Options() +} + +func maybeInvoke(opt interface{}, enable bool) fx.Option { + if enable { + return fx.Invoke(opt) + } + return fx.Options() +} + +// baseProcess creates a goprocess which is closed when the lifecycle signals it to stop +func baseProcess(lc fx.Lifecycle) goprocess.Process { + p := goprocess.WithParent(goprocess.Background()) + lc.Append(fx.Hook{ + OnStop: func(_ context.Context) error { + return p.Close() + }, + }) + return p +} diff --git a/vendor/github.com/ipfs/go-ipfs/core/node/helpers/helpers.go b/vendor/github.com/ipfs/go-ipfs/core/node/helpers/helpers.go new file mode 100644 index 00000000..546c8e97 --- /dev/null +++ b/vendor/github.com/ipfs/go-ipfs/core/node/helpers/helpers.go @@ -0,0 +1,23 @@ +package helpers + +import ( + "context" + "go.uber.org/fx" +) + +type MetricsCtx context.Context + +// LifecycleCtx creates a context which will be cancelled when lifecycle stops +// +// This is a hack which we need because most of our services use contexts in a +// wrong way +func LifecycleCtx(mctx MetricsCtx, lc fx.Lifecycle) context.Context { + ctx, cancel := context.WithCancel(mctx) + lc.Append(fx.Hook{ + OnStop: func(_ context.Context) error { + cancel() + return nil + }, + }) + return ctx +} diff --git a/vendor/github.com/ipfs/go-ipfs/core/node/identity.go b/vendor/github.com/ipfs/go-ipfs/core/node/identity.go new file mode 100644 index 00000000..ad6eb238 --- /dev/null +++ b/vendor/github.com/ipfs/go-ipfs/core/node/identity.go @@ -0,0 +1,29 @@ +package node + +import ( + "fmt" + + "github.com/libp2p/go-libp2p-core/crypto" + "github.com/libp2p/go-libp2p-core/peer" +) + +func PeerID(id peer.ID) func() peer.ID { + return func() peer.ID { + return id + } +} + +// PrivateKey loads the private key from config +func PrivateKey(sk crypto.PrivKey) func(id peer.ID) (crypto.PrivKey, error) { + return func(id peer.ID) (crypto.PrivKey, error) { + id2, err := peer.IDFromPrivateKey(sk) + if err != nil { + return nil, err + } + + if id2 != id { + return nil, fmt.Errorf("private key in config does not match id: %s != %s", id, id2) + } + return sk, nil + } +} diff --git a/vendor/github.com/ipfs/go-ipfs/core/node/ipns.go b/vendor/github.com/ipfs/go-ipfs/core/node/ipns.go new file mode 100644 index 00000000..11769d97 --- /dev/null +++ b/vendor/github.com/ipfs/go-ipfs/core/node/ipns.go @@ -0,0 +1,56 @@ +package node + +import ( + "fmt" + "time" + + "github.com/ipfs/go-ipfs-util" + "github.com/ipfs/go-ipns" + "github.com/libp2p/go-libp2p-core/crypto" + "github.com/libp2p/go-libp2p-core/peerstore" + "github.com/libp2p/go-libp2p-core/routing" + "github.com/libp2p/go-libp2p-record" + + "github.com/ipfs/go-ipfs/namesys" + "github.com/ipfs/go-ipfs/namesys/republisher" + "github.com/ipfs/go-ipfs/repo" +) + +const DefaultIpnsCacheSize = 128 + +// RecordValidator provides namesys compatible routing record validator +func RecordValidator(ps peerstore.Peerstore) record.Validator { + return record.NamespacedValidator{ + "pk": record.PublicKeyValidator{}, + "ipns": ipns.Validator{KeyBook: ps}, + } +} + +// Namesys creates new name system +func Namesys(cacheSize int) func(rt routing.Routing, repo repo.Repo) (namesys.NameSystem, error) { + return func(rt routing.Routing, repo repo.Repo) (namesys.NameSystem, error) { + return namesys.NewNameSystem(rt, repo.Datastore(), cacheSize), nil + } +} + +// IpnsRepublisher runs new IPNS republisher service +func IpnsRepublisher(repubPeriod time.Duration, recordLifetime time.Duration) func(lcProcess, namesys.NameSystem, repo.Repo, crypto.PrivKey) error { + return func(lc lcProcess, namesys namesys.NameSystem, repo repo.Repo, privKey crypto.PrivKey) error { + repub := republisher.NewRepublisher(namesys, repo.Datastore(), privKey, repo.Keystore()) + + if repubPeriod != 0 { + if !util.Debug && (repubPeriod < time.Minute || repubPeriod > (time.Hour*24)) { + return fmt.Errorf("config setting IPNS.RepublishPeriod is not between 1min and 1day: %s", repubPeriod) + } + + repub.Interval = repubPeriod + } + + if recordLifetime != 0 { + repub.RecordLifetime = recordLifetime + } + + lc.Append(repub.Run) + return nil + } +} diff --git a/vendor/github.com/ipfs/go-ipfs/core/node/libp2p/addrs.go b/vendor/github.com/ipfs/go-ipfs/core/node/libp2p/addrs.go new file mode 100644 index 00000000..703a959c --- /dev/null +++ b/vendor/github.com/ipfs/go-ipfs/core/node/libp2p/addrs.go @@ -0,0 +1,117 @@ +package libp2p + +import ( + "fmt" + + "github.com/libp2p/go-libp2p" + host "github.com/libp2p/go-libp2p-core/host" + p2pbhost "github.com/libp2p/go-libp2p/p2p/host/basic" + mafilter "github.com/libp2p/go-maddr-filter" + ma "github.com/multiformats/go-multiaddr" + mamask "github.com/whyrusleeping/multiaddr-filter" +) + +func AddrFilters(filters []string) func() (opts Libp2pOpts, err error) { + return func() (opts Libp2pOpts, err error) { + for _, s := range filters { + f, err := mamask.NewMask(s) + if err != nil { + return opts, fmt.Errorf("incorrectly formatted address filter in config: %s", s) + } + opts.Opts = append(opts.Opts, libp2p.FilterAddresses(f)) + } + return opts, nil + } +} + +func makeAddrsFactory(announce []string, noAnnounce []string) (p2pbhost.AddrsFactory, error) { + var annAddrs []ma.Multiaddr + for _, addr := range announce { + maddr, err := ma.NewMultiaddr(addr) + if err != nil { + return nil, err + } + annAddrs = append(annAddrs, maddr) + } + + filters := mafilter.NewFilters() + noAnnAddrs := map[string]bool{} + for _, addr := range noAnnounce { + f, err := mamask.NewMask(addr) + if err == nil { + filters.AddFilter(*f, mafilter.ActionDeny) + continue + } + maddr, err := ma.NewMultiaddr(addr) + if err != nil { + return nil, err + } + noAnnAddrs[string(maddr.Bytes())] = true + } + + return func(allAddrs []ma.Multiaddr) []ma.Multiaddr { + var addrs []ma.Multiaddr + if len(annAddrs) > 0 { + addrs = annAddrs + } else { + addrs = allAddrs + } + + var out []ma.Multiaddr + for _, maddr := range addrs { + // check for exact matches + ok := noAnnAddrs[string(maddr.Bytes())] + // check for /ipcidr matches + if !ok && !filters.AddrBlocked(maddr) { + out = append(out, maddr) + } + } + return out + }, nil +} + +func AddrsFactory(announce []string, noAnnounce []string) func() (opts Libp2pOpts, err error) { + return func() (opts Libp2pOpts, err error) { + addrsFactory, err := makeAddrsFactory(announce, noAnnounce) + if err != nil { + return opts, err + } + opts.Opts = append(opts.Opts, libp2p.AddrsFactory(addrsFactory)) + return + } +} + +func listenAddresses(addresses []string) ([]ma.Multiaddr, error) { + var listen []ma.Multiaddr + for _, addr := range addresses { + maddr, err := ma.NewMultiaddr(addr) + if err != nil { + return nil, fmt.Errorf("failure to parse config.Addresses.Swarm: %s", addresses) + } + listen = append(listen, maddr) + } + + return listen, nil +} + +func StartListening(addresses []string) func(host host.Host) error { + return func(host host.Host) error { + listenAddrs, err := listenAddresses(addresses) + if err != nil { + return err + } + + // Actually start listening: + if err := host.Network().Listen(listenAddrs...); err != nil { + return err + } + + // list out our addresses + addrs, err := host.Network().InterfaceListenAddresses() + if err != nil { + return err + } + log.Infof("Swarm listening at: %s", addrs) + return nil + } +} diff --git a/vendor/github.com/ipfs/go-ipfs/core/node/libp2p/discovery.go b/vendor/github.com/ipfs/go-ipfs/core/node/libp2p/discovery.go new file mode 100644 index 00000000..7b0c8263 --- /dev/null +++ b/vendor/github.com/ipfs/go-ipfs/core/node/libp2p/discovery.go @@ -0,0 +1,53 @@ +package libp2p + +import ( + "context" + "time" + + "github.com/libp2p/go-libp2p-core/host" + "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p/p2p/discovery" + "go.uber.org/fx" + + "github.com/ipfs/go-ipfs/core/node/helpers" +) + +const discoveryConnTimeout = time.Second * 30 + +type discoveryHandler struct { + ctx context.Context + host host.Host +} + +func (dh *discoveryHandler) HandlePeerFound(p peer.AddrInfo) { + log.Warning("trying peer info: ", p) + ctx, cancel := context.WithTimeout(dh.ctx, discoveryConnTimeout) + defer cancel() + if err := dh.host.Connect(ctx, p); err != nil { + log.Warning("Failed to connect to peer found by discovery: ", err) + } +} + +func DiscoveryHandler(mctx helpers.MetricsCtx, lc fx.Lifecycle, host host.Host) *discoveryHandler { + return &discoveryHandler{ + ctx: helpers.LifecycleCtx(mctx, lc), + host: host, + } +} + +func SetupDiscovery(mdns bool, mdnsInterval int) func(helpers.MetricsCtx, fx.Lifecycle, host.Host, *discoveryHandler) error { + return func(mctx helpers.MetricsCtx, lc fx.Lifecycle, host host.Host, handler *discoveryHandler) error { + if mdns { + if mdnsInterval == 0 { + mdnsInterval = 5 + } + service, err := discovery.NewMdnsService(helpers.LifecycleCtx(mctx, lc), host, time.Duration(mdnsInterval)*time.Second, discovery.ServiceTag) + if err != nil { + log.Error("mdns error: ", err) + return nil + } + service.RegisterNotifee(handler) + } + return nil + } +} diff --git a/vendor/github.com/ipfs/go-ipfs/core/node/libp2p/host.go b/vendor/github.com/ipfs/go-ipfs/core/node/libp2p/host.go new file mode 100644 index 00000000..57475316 --- /dev/null +++ b/vendor/github.com/ipfs/go-ipfs/core/node/libp2p/host.go @@ -0,0 +1,76 @@ +package libp2p + +import ( + "context" + + "github.com/libp2p/go-libp2p" + host "github.com/libp2p/go-libp2p-core/host" + peer "github.com/libp2p/go-libp2p-core/peer" + peerstore "github.com/libp2p/go-libp2p-core/peerstore" + routing "github.com/libp2p/go-libp2p-core/routing" + record "github.com/libp2p/go-libp2p-record" + routedhost "github.com/libp2p/go-libp2p/p2p/host/routed" + "go.uber.org/fx" + + "github.com/ipfs/go-ipfs/core/node/helpers" + "github.com/ipfs/go-ipfs/repo" +) + +type P2PHostIn struct { + fx.In + + Repo repo.Repo + Validator record.Validator + HostOption HostOption + RoutingOption RoutingOption + ID peer.ID + Peerstore peerstore.Peerstore + + Opts [][]libp2p.Option `group:"libp2p"` +} + +type P2PHostOut struct { + fx.Out + + Host host.Host + Routing BaseIpfsRouting +} + +func Host(mctx helpers.MetricsCtx, lc fx.Lifecycle, params P2PHostIn) (out P2PHostOut, err error) { + opts := []libp2p.Option{libp2p.NoListenAddrs} + for _, o := range params.Opts { + opts = append(opts, o...) + } + + ctx := helpers.LifecycleCtx(mctx, lc) + + opts = append(opts, libp2p.Routing(func(h host.Host) (routing.PeerRouting, error) { + r, err := params.RoutingOption(ctx, h, params.Repo.Datastore(), params.Validator) + out.Routing = r + return r, err + })) + + out.Host, err = params.HostOption(ctx, params.ID, params.Peerstore, opts...) + if err != nil { + return P2PHostOut{}, err + } + + // this code is necessary just for tests: mock network constructions + // ignore the libp2p constructor options that actually construct the routing! + if out.Routing == nil { + r, err := params.RoutingOption(ctx, out.Host, params.Repo.Datastore(), params.Validator) + if err != nil { + return P2PHostOut{}, err + } + out.Routing = r + out.Host = routedhost.Wrap(out.Host, out.Routing) + } + + lc.Append(fx.Hook{ + OnStop: func(ctx context.Context) error { + return out.Host.Close() + }, + }) + + return out, err +} diff --git a/vendor/github.com/ipfs/go-ipfs/core/node/libp2p/hostopt.go b/vendor/github.com/ipfs/go-ipfs/core/node/libp2p/hostopt.go new file mode 100644 index 00000000..26d6cad7 --- /dev/null +++ b/vendor/github.com/ipfs/go-ipfs/core/node/libp2p/hostopt.go @@ -0,0 +1,25 @@ +package libp2p + +import ( + "context" + "fmt" + + "github.com/libp2p/go-libp2p" + host "github.com/libp2p/go-libp2p-core/host" + peer "github.com/libp2p/go-libp2p-core/peer" + peerstore "github.com/libp2p/go-libp2p-core/peerstore" +) + +type HostOption func(ctx context.Context, id peer.ID, ps peerstore.Peerstore, options ...libp2p.Option) (host.Host, error) + +var DefaultHostOption HostOption = constructPeerHost + +// isolates the complex initialization steps +func constructPeerHost(ctx context.Context, id peer.ID, ps peerstore.Peerstore, options ...libp2p.Option) (host.Host, error) { + pkey := ps.PrivKey(id) + if pkey == nil { + return nil, fmt.Errorf("missing private key for node ID: %s", id.Pretty()) + } + options = append([]libp2p.Option{libp2p.Identity(pkey), libp2p.Peerstore(ps)}, options...) + return libp2p.New(ctx, options...) +} diff --git a/vendor/github.com/ipfs/go-ipfs/core/node/libp2p/libp2p.go b/vendor/github.com/ipfs/go-ipfs/core/node/libp2p/libp2p.go new file mode 100644 index 00000000..f0c84027 --- /dev/null +++ b/vendor/github.com/ipfs/go-ipfs/core/node/libp2p/libp2p.go @@ -0,0 +1,46 @@ +package libp2p + +import ( + "time" + + logging "github.com/ipfs/go-log" + "github.com/libp2p/go-libp2p" + "github.com/libp2p/go-libp2p-connmgr" + "github.com/libp2p/go-libp2p-core/crypto" + "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p-core/peerstore" + "go.uber.org/fx" +) + +var log = logging.Logger("p2pnode") + +type Libp2pOpts struct { + fx.Out + + Opts []libp2p.Option `group:"libp2p"` +} + +// Misc options + +func ConnectionManager(low, high int, grace time.Duration) func() (opts Libp2pOpts, err error) { + return func() (opts Libp2pOpts, err error) { + cm := connmgr.NewConnManager(low, high, grace) + opts.Opts = append(opts.Opts, libp2p.ConnectionManager(cm)) + return + } +} + +func PstoreAddSelfKeys(id peer.ID, sk crypto.PrivKey, ps peerstore.Peerstore) error { + if err := ps.AddPubKey(id, sk.GetPublic()); err != nil { + return err + } + + return ps.AddPrivKey(id, sk) +} + +func simpleOpt(opt libp2p.Option) func() (opts Libp2pOpts, err error) { + return func() (opts Libp2pOpts, err error) { + opts.Opts = append(opts.Opts, opt) + return + } +} diff --git a/vendor/github.com/ipfs/go-ipfs/core/node/libp2p/nat.go b/vendor/github.com/ipfs/go-ipfs/core/node/libp2p/nat.go new file mode 100644 index 00000000..6367d311 --- /dev/null +++ b/vendor/github.com/ipfs/go-ipfs/core/node/libp2p/nat.go @@ -0,0 +1,32 @@ +package libp2p + +import ( + "github.com/libp2p/go-libp2p" + autonat "github.com/libp2p/go-libp2p-autonat-svc" + host "github.com/libp2p/go-libp2p-core/host" + libp2pquic "github.com/libp2p/go-libp2p-quic-transport" + "go.uber.org/fx" + + "github.com/ipfs/go-ipfs/core/node/helpers" + "github.com/ipfs/go-ipfs/repo" +) + +var NatPortMap = simpleOpt(libp2p.NATPortMap()) + +func AutoNATService(quic bool) func(repo repo.Repo, mctx helpers.MetricsCtx, lc fx.Lifecycle, host host.Host) error { + return func(repo repo.Repo, mctx helpers.MetricsCtx, lc fx.Lifecycle, host host.Host) error { + // collect private net option in case swarm.key is presented + opts, _, err := PNet(repo) + if err != nil { + // swarm key exists but was failed to decode + return err + } + + if quic { + opts.Opts = append(opts.Opts, libp2p.DefaultTransports, libp2p.Transport(libp2pquic.NewTransport)) + } + + _, err = autonat.NewAutoNATService(helpers.LifecycleCtx(mctx, lc), host, opts.Opts...) + return err + } +} diff --git a/vendor/github.com/ipfs/go-ipfs/core/node/libp2p/pnet.go b/vendor/github.com/ipfs/go-ipfs/core/node/libp2p/pnet.go new file mode 100644 index 00000000..bf4cc556 --- /dev/null +++ b/vendor/github.com/ipfs/go-ipfs/core/node/libp2p/pnet.go @@ -0,0 +1,70 @@ +package libp2p + +import ( + "bytes" + "context" + "fmt" + "time" + + "github.com/libp2p/go-libp2p" + host "github.com/libp2p/go-libp2p-core/host" + pnet "github.com/libp2p/go-libp2p-pnet" + "go.uber.org/fx" + + "github.com/ipfs/go-ipfs/repo" +) + +type PNetFingerprint []byte + +func PNet(repo repo.Repo) (opts Libp2pOpts, fp PNetFingerprint, err error) { + swarmkey, err := repo.SwarmKey() + if err != nil || swarmkey == nil { + return opts, nil, err + } + + protec, err := pnet.NewProtector(bytes.NewReader(swarmkey)) + if err != nil { + return opts, nil, fmt.Errorf("failed to configure private network: %s", err) + } + fp = protec.Fingerprint() + + opts.Opts = append(opts.Opts, libp2p.PrivateNetwork(protec)) + return opts, fp, nil +} + +func PNetChecker(repo repo.Repo, ph host.Host, lc fx.Lifecycle) error { + // TODO: better check? + swarmkey, err := repo.SwarmKey() + if err != nil || swarmkey == nil { + return err + } + + done := make(chan struct{}) + lc.Append(fx.Hook{ + OnStart: func(_ context.Context) error { + go func() { + t := time.NewTicker(30 * time.Second) + defer t.Stop() + + <-t.C // swallow one tick + for { + select { + case <-t.C: + if len(ph.Network().Peers()) == 0 { + log.Warning("We are in private network and have no peers.") + log.Warning("This might be configuration mistake.") + } + case <-done: + return + } + } + }() + return nil + }, + OnStop: func(_ context.Context) error { + close(done) + return nil + }, + }) + return nil +} diff --git a/vendor/github.com/ipfs/go-ipfs/core/node/libp2p/pubsub.go b/vendor/github.com/ipfs/go-ipfs/core/node/libp2p/pubsub.go new file mode 100644 index 00000000..c065cd7e --- /dev/null +++ b/vendor/github.com/ipfs/go-ipfs/core/node/libp2p/pubsub.go @@ -0,0 +1,21 @@ +package libp2p + +import ( + host "github.com/libp2p/go-libp2p-core/host" + pubsub "github.com/libp2p/go-libp2p-pubsub" + "go.uber.org/fx" + + "github.com/ipfs/go-ipfs/core/node/helpers" +) + +func FloodSub(pubsubOptions ...pubsub.Option) interface{} { + return func(mctx helpers.MetricsCtx, lc fx.Lifecycle, host host.Host) (service *pubsub.PubSub, err error) { + return pubsub.NewFloodSub(helpers.LifecycleCtx(mctx, lc), host, pubsubOptions...) + } +} + +func GossipSub(pubsubOptions ...pubsub.Option) interface{} { + return func(mctx helpers.MetricsCtx, lc fx.Lifecycle, host host.Host) (service *pubsub.PubSub, err error) { + return pubsub.NewGossipSub(helpers.LifecycleCtx(mctx, lc), host, pubsubOptions...) + } +} diff --git a/vendor/github.com/ipfs/go-ipfs/core/node/libp2p/relay.go b/vendor/github.com/ipfs/go-ipfs/core/node/libp2p/relay.go new file mode 100644 index 00000000..b9e8afa4 --- /dev/null +++ b/vendor/github.com/ipfs/go-ipfs/core/node/libp2p/relay.go @@ -0,0 +1,24 @@ +package libp2p + +import ( + "github.com/libp2p/go-libp2p" + relay "github.com/libp2p/go-libp2p-circuit" +) + +func Relay(disable, enableHop bool) func() (opts Libp2pOpts, err error) { + return func() (opts Libp2pOpts, err error) { + if disable { + // Enabled by default. + opts.Opts = append(opts.Opts, libp2p.DisableRelay()) + } else { + relayOpts := []relay.RelayOpt{relay.OptDiscovery} + if enableHop { + relayOpts = append(relayOpts, relay.OptHop) + } + opts.Opts = append(opts.Opts, libp2p.EnableRelay(relayOpts...)) + } + return + } +} + +var AutoRealy = simpleOpt(libp2p.EnableAutoRelay()) diff --git a/vendor/github.com/ipfs/go-ipfs/core/node/libp2p/routing.go b/vendor/github.com/ipfs/go-ipfs/core/node/libp2p/routing.go new file mode 100644 index 00000000..e5ba1de3 --- /dev/null +++ b/vendor/github.com/ipfs/go-ipfs/core/node/libp2p/routing.go @@ -0,0 +1,106 @@ +package libp2p + +import ( + "context" + "sort" + + host "github.com/libp2p/go-libp2p-core/host" + routing "github.com/libp2p/go-libp2p-core/routing" + dht "github.com/libp2p/go-libp2p-kad-dht" + "github.com/libp2p/go-libp2p-pubsub" + namesys "github.com/libp2p/go-libp2p-pubsub-router" + record "github.com/libp2p/go-libp2p-record" + routinghelpers "github.com/libp2p/go-libp2p-routing-helpers" + "go.uber.org/fx" + + "github.com/ipfs/go-ipfs/core/node/helpers" +) + +type BaseIpfsRouting routing.Routing + +type Router struct { + routing.Routing + + Priority int // less = more important +} + +type p2pRouterOut struct { + fx.Out + + Router Router `group:"routers"` +} + +func BaseRouting(lc fx.Lifecycle, in BaseIpfsRouting) (out p2pRouterOut, dr *dht.IpfsDHT) { + if dht, ok := in.(*dht.IpfsDHT); ok { + dr = dht + + lc.Append(fx.Hook{ + OnStop: func(ctx context.Context) error { + return dr.Close() + }, + }) + } + + return p2pRouterOut{ + Router: Router{ + Priority: 1000, + Routing: in, + }, + }, dr +} + +type p2pOnlineRoutingIn struct { + fx.In + + Routers []Router `group:"routers"` + Validator record.Validator +} + +func Routing(in p2pOnlineRoutingIn) routing.Routing { + routers := in.Routers + + sort.SliceStable(routers, func(i, j int) bool { + return routers[i].Priority < routers[j].Priority + }) + + irouters := make([]routing.Routing, len(routers)) + for i, v := range routers { + irouters[i] = v.Routing + } + + return routinghelpers.Tiered{ + Routers: irouters, + Validator: in.Validator, + } +} + +type p2pPSRoutingIn struct { + fx.In + + BaseIpfsRouting BaseIpfsRouting + Validator record.Validator + Host host.Host + PubSub *pubsub.PubSub `optional:"true"` +} + +func PubsubRouter(mctx helpers.MetricsCtx, lc fx.Lifecycle, in p2pPSRoutingIn) (p2pRouterOut, *namesys.PubsubValueStore) { + psRouter := namesys.NewPubsubValueStore( + helpers.LifecycleCtx(mctx, lc), + in.Host, + in.BaseIpfsRouting, + in.PubSub, + in.Validator, + ) + + return p2pRouterOut{ + Router: Router{ + Routing: &routinghelpers.Compose{ + ValueStore: &routinghelpers.LimitedValueStore{ + ValueStore: psRouter, + Namespaces: []string{"ipns"}, + }, + }, + Priority: 100, + }, + }, psRouter +} diff --git a/vendor/github.com/ipfs/go-ipfs/core/node/libp2p/routingopt.go b/vendor/github.com/ipfs/go-ipfs/core/node/libp2p/routingopt.go new file mode 100644 index 00000000..35389d85 --- /dev/null +++ b/vendor/github.com/ipfs/go-ipfs/core/node/libp2p/routingopt.go @@ -0,0 +1,36 @@ +package libp2p + +import ( + "context" + + "github.com/ipfs/go-datastore" + nilrouting "github.com/ipfs/go-ipfs-routing/none" + host "github.com/libp2p/go-libp2p-core/host" + routing "github.com/libp2p/go-libp2p-core/routing" + dht "github.com/libp2p/go-libp2p-kad-dht" + dhtopts "github.com/libp2p/go-libp2p-kad-dht/opts" + record "github.com/libp2p/go-libp2p-record" +) + +type RoutingOption func(context.Context, host.Host, datastore.Batching, record.Validator) (routing.Routing, error) + +func constructDHTRouting(ctx context.Context, host host.Host, dstore datastore.Batching, validator record.Validator) (routing.Routing, error) { + return dht.New( + ctx, host, + dhtopts.Datastore(dstore), + dhtopts.Validator(validator), + ) +} + +func constructClientDHTRouting(ctx context.Context, host host.Host, dstore datastore.Batching, validator record.Validator) (routing.Routing, error) { + return dht.New( + ctx, host, + dhtopts.Client(true), + dhtopts.Datastore(dstore), + dhtopts.Validator(validator), + ) +} + +var DHTOption RoutingOption = constructDHTRouting +var DHTClientOption RoutingOption = constructClientDHTRouting +var NilRouterOption RoutingOption = nilrouting.ConstructNilRouting diff --git a/vendor/github.com/ipfs/go-ipfs/core/node/libp2p/smux.go b/vendor/github.com/ipfs/go-ipfs/core/node/libp2p/smux.go new file mode 100644 index 00000000..95e599ec --- /dev/null +++ b/vendor/github.com/ipfs/go-ipfs/core/node/libp2p/smux.go @@ -0,0 +1,54 @@ +package libp2p + +import ( + "os" + "strings" + + "github.com/libp2p/go-libp2p" + smux "github.com/libp2p/go-libp2p-core/mux" + mplex "github.com/libp2p/go-libp2p-mplex" + yamux "github.com/libp2p/go-libp2p-yamux" +) + +func makeSmuxTransportOption(mplexExp bool) libp2p.Option { + const yamuxID = "/yamux/1.0.0" + const mplexID = "/mplex/6.7.0" + + ymxtpt := *yamux.DefaultTransport + ymxtpt.AcceptBacklog = 512 + + if os.Getenv("YAMUX_DEBUG") != "" { + ymxtpt.LogOutput = os.Stderr + } + + muxers := map[string]smux.Multiplexer{yamuxID: &ymxtpt} + if mplexExp { + muxers[mplexID] = mplex.DefaultTransport + } + + // Allow muxer preference order overriding + order := []string{yamuxID, mplexID} + if prefs := os.Getenv("LIBP2P_MUX_PREFS"); prefs != "" { + order = strings.Fields(prefs) + } + + opts := make([]libp2p.Option, 0, len(order)) + for _, id := range order { + tpt, ok := muxers[id] + if !ok { + log.Warning("unknown or duplicate muxer in LIBP2P_MUX_PREFS: %s", id) + continue + } + delete(muxers, id) + opts = append(opts, libp2p.Muxer(id, tpt)) + } + + return libp2p.ChainOptions(opts...) +} + +func SmuxTransport(mplex bool) func() (opts Libp2pOpts, err error) { + return func() (opts Libp2pOpts, err error) { + opts.Opts = append(opts.Opts, makeSmuxTransportOption(mplex)) + return + } +} diff --git a/vendor/github.com/ipfs/go-ipfs/core/node/libp2p/transport.go b/vendor/github.com/ipfs/go-ipfs/core/node/libp2p/transport.go new file mode 100644 index 00000000..526776ab --- /dev/null +++ b/vendor/github.com/ipfs/go-ipfs/core/node/libp2p/transport.go @@ -0,0 +1,38 @@ +package libp2p + +import ( + "github.com/libp2p/go-libp2p" + metrics "github.com/libp2p/go-libp2p-core/metrics" + libp2pquic "github.com/libp2p/go-libp2p-quic-transport" + secio "github.com/libp2p/go-libp2p-secio" + tls "github.com/libp2p/go-libp2p-tls" +) + +var DefaultTransports = simpleOpt(libp2p.DefaultTransports) +var QUIC = simpleOpt(libp2p.Transport(libp2pquic.NewTransport)) + +func Security(enabled, preferTLS bool) interface{} { + if !enabled { + return func() (opts Libp2pOpts) { + // TODO: shouldn't this be Errorf to guarantee visibility? + log.Warningf(`Your IPFS node has been configured to run WITHOUT ENCRYPTED CONNECTIONS. + You will not be able to connect to any nodes configured to use encrypted connections`) + opts.Opts = append(opts.Opts, libp2p.NoSecurity) + return opts + } + } + return func() (opts Libp2pOpts) { + if preferTLS { + opts.Opts = append(opts.Opts, libp2p.ChainOptions(libp2p.Security(tls.ID, tls.New), libp2p.Security(secio.ID, secio.New))) + } else { + opts.Opts = append(opts.Opts, libp2p.ChainOptions(libp2p.Security(secio.ID, secio.New), libp2p.Security(tls.ID, tls.New))) + } + return opts + } +} + +func BandwidthCounter() (opts Libp2pOpts, reporter metrics.Reporter) { + reporter = metrics.NewBandwidthCounter() + opts.Opts = append(opts.Opts, libp2p.BandwidthReporter(reporter)) + return opts, reporter +} diff --git a/vendor/github.com/ipfs/go-ipfs/core/node/provider.go b/vendor/github.com/ipfs/go-ipfs/core/node/provider.go new file mode 100644 index 00000000..c87e2ac5 --- /dev/null +++ b/vendor/github.com/ipfs/go-ipfs/core/node/provider.go @@ -0,0 +1,117 @@ +package node + +import ( + "context" + "fmt" + "time" + + "github.com/ipfs/go-ipfs/core/node/helpers" + "github.com/ipfs/go-ipfs/provider" + q "github.com/ipfs/go-ipfs/provider/queue" + "github.com/ipfs/go-ipfs/provider/simple" + "github.com/ipfs/go-ipfs/repo" + "github.com/libp2p/go-libp2p-core/routing" + "go.uber.org/fx" +) + +const kReprovideFrequency = time.Hour * 12 + +// SIMPLE + +// ProviderQueue creates new datastore backed provider queue +func ProviderQueue(mctx helpers.MetricsCtx, lc fx.Lifecycle, repo repo.Repo) (*q.Queue, error) { + return q.NewQueue(helpers.LifecycleCtx(mctx, lc), "provider-v1", repo.Datastore()) +} + +// SimpleProvider creates new record provider +func SimpleProvider(mctx helpers.MetricsCtx, lc fx.Lifecycle, queue *q.Queue, rt routing.Routing) provider.Provider { + return simple.NewProvider(helpers.LifecycleCtx(mctx, lc), queue, rt) +} + +// SimpleReprovider creates new reprovider +func SimpleReprovider(reproviderInterval time.Duration) interface{} { + return func(mctx helpers.MetricsCtx, lc fx.Lifecycle, rt routing.Routing, keyProvider simple.KeyChanFunc) (provider.Reprovider, error) { + return simple.NewReprovider(helpers.LifecycleCtx(mctx, lc), reproviderInterval, rt, keyProvider), nil + } +} + +// SimpleProviderSys creates new provider system +func SimpleProviderSys(isOnline bool) interface{} { + return func(lc fx.Lifecycle, p provider.Provider, r provider.Reprovider) provider.System { + sys := provider.NewSystem(p, r) + + if isOnline { + lc.Append(fx.Hook{ + OnStart: func(ctx context.Context) error { + sys.Run() + return nil + }, + OnStop: func(ctx context.Context) error { + return sys.Close() + }, + }) + } + + return sys + } +} + +// ONLINE/OFFLINE + +// OnlineProviders groups units managing provider routing records online +func OnlineProviders(useStrategicProviding bool, reprovideStrategy string, reprovideInterval string) fx.Option { + if useStrategicProviding { + return fx.Provide(provider.NewOfflineProvider) + } + + return fx.Options( + SimpleProviders(reprovideStrategy, reprovideInterval), + fx.Provide(SimpleProviderSys(true)), + ) +} + +// OfflineProviders groups units managing provider routing records offline +func OfflineProviders(useStrategicProviding bool, reprovideStrategy string, reprovideInterval string) fx.Option { + if useStrategicProviding { + return fx.Provide(provider.NewOfflineProvider) + } + + return fx.Options( + SimpleProviders(reprovideStrategy, reprovideInterval), + fx.Provide(SimpleProviderSys(false)), + ) +} + +// SimpleProviders creates the simple provider/reprovider dependencies +func SimpleProviders(reprovideStrategy string, reprovideInterval string) fx.Option { + reproviderInterval := kReprovideFrequency + if reprovideInterval != "" { + dur, err := time.ParseDuration(reprovideInterval) + if err != nil { + return fx.Error(err) + } + + reproviderInterval = dur + } + + var keyProvider fx.Option + switch reprovideStrategy { + case "all": + fallthrough + case "": + keyProvider = fx.Provide(simple.NewBlockstoreProvider) + case "roots": + keyProvider = fx.Provide(simple.NewPinnedProvider(true)) + case "pinned": + keyProvider = fx.Provide(simple.NewPinnedProvider(false)) + default: + return fx.Error(fmt.Errorf("unknown reprovider strategy '%s'", reprovideStrategy)) + } + + return fx.Options( + fx.Provide(ProviderQueue), + fx.Provide(SimpleProvider), + keyProvider, + fx.Provide(SimpleReprovider(reproviderInterval)), + ) +} diff --git a/vendor/github.com/ipfs/go-ipfs/core/node/storage.go b/vendor/github.com/ipfs/go-ipfs/core/node/storage.go new file mode 100644 index 00000000..008b1970 --- /dev/null +++ b/vendor/github.com/ipfs/go-ipfs/core/node/storage.go @@ -0,0 +1,94 @@ +package node + +import ( + "os" + "syscall" + "time" + + "github.com/ipfs/go-datastore" + "github.com/ipfs/go-datastore/retrystore" + blockstore "github.com/ipfs/go-ipfs-blockstore" + config "github.com/ipfs/go-ipfs-config" + "go.uber.org/fx" + + "github.com/ipfs/go-ipfs/core/node/helpers" + "github.com/ipfs/go-ipfs/filestore" + "github.com/ipfs/go-ipfs/repo" + "github.com/ipfs/go-ipfs/thirdparty/cidv0v1" + "github.com/ipfs/go-ipfs/thirdparty/verifbs" +) + +func isTooManyFDError(err error) bool { + perr, ok := err.(*os.PathError) + if ok && perr.Err == syscall.EMFILE { + return true + } + + return false +} + +// RepoConfig loads configuration from the repo +func RepoConfig(repo repo.Repo) (*config.Config, error) { + return repo.Config() +} + +// Datastore provides the datastore +func Datastore(repo repo.Repo) datastore.Datastore { + return repo.Datastore() +} + +// BaseBlocks is the lower level blockstore without GC or Filestore layers +type BaseBlocks blockstore.Blockstore + +// BaseBlockstoreCtor creates cached blockstore backed by the provided datastore +func BaseBlockstoreCtor(cacheOpts blockstore.CacheOpts, nilRepo bool, hashOnRead bool) func(mctx helpers.MetricsCtx, repo repo.Repo, lc fx.Lifecycle) (bs BaseBlocks, err error) { + return func(mctx helpers.MetricsCtx, repo repo.Repo, lc fx.Lifecycle) (bs BaseBlocks, err error) { + rds := &retrystore.Datastore{ + Batching: repo.Datastore(), + Delay: time.Millisecond * 200, + Retries: 6, + TempErrFunc: isTooManyFDError, + } + // hash security + bs = blockstore.NewBlockstore(rds) + bs = &verifbs.VerifBS{Blockstore: bs} + + if !nilRepo { + bs, err = blockstore.CachedBlockstore(helpers.LifecycleCtx(mctx, lc), bs, cacheOpts) + if err != nil { + return nil, err + } + } + + bs = blockstore.NewIdStore(bs) + bs = cidv0v1.NewBlockstore(bs) + + if hashOnRead { // TODO: review: this is how it was done originally, is there a reason we can't just pass this directly? + bs.HashOnRead(true) + } + + return + } +} + +// GcBlockstoreCtor wraps the base blockstore with GC and Filestore layers +func GcBlockstoreCtor(bb BaseBlocks) (gclocker blockstore.GCLocker, gcbs blockstore.GCBlockstore, bs blockstore.Blockstore) { + gclocker = blockstore.NewGCLocker() + gcbs = blockstore.NewGCBlockstore(bb, gclocker) + + bs = gcbs + return +} + +// GcBlockstoreCtor wraps GcBlockstore and adds Filestore support +func FilestoreBlockstoreCtor(repo repo.Repo, bb BaseBlocks) (gclocker blockstore.GCLocker, gcbs blockstore.GCBlockstore, bs blockstore.Blockstore, fstore *filestore.Filestore) { + gclocker = blockstore.NewGCLocker() + + // hash security + fstore = filestore.NewFilestore(bb, repo.FileManager()) + gcbs = blockstore.NewGCBlockstore(fstore, gclocker) + gcbs = &verifbs.VerifBSGC{GCBlockstore: gcbs} + + bs = gcbs + return +} diff --git a/vendor/github.com/ipfs/go-ipfs/core/pathresolver.go b/vendor/github.com/ipfs/go-ipfs/core/pathresolver.go deleted file mode 100644 index 21c2a84b..00000000 --- a/vendor/github.com/ipfs/go-ipfs/core/pathresolver.go +++ /dev/null @@ -1,75 +0,0 @@ -package core - -import ( - "context" - "errors" - "strings" - - namesys "github.com/ipfs/go-ipfs/namesys" - - ipld "github.com/ipfs/go-ipld-format" - logging "github.com/ipfs/go-log" - path "github.com/ipfs/go-path" - resolver "github.com/ipfs/go-path/resolver" -) - -// ErrNoNamesys is an explicit error for when an IPFS node doesn't -// (yet) have a name system -var ErrNoNamesys = errors.New( - "core/resolve: no Namesys on IpfsNode - can't resolve ipns entry") - -// ResolveIPNS resolves /ipns paths -func ResolveIPNS(ctx context.Context, nsys namesys.NameSystem, p path.Path) (path.Path, error) { - if strings.HasPrefix(p.String(), "/ipns/") { - evt := log.EventBegin(ctx, "resolveIpnsPath") - defer evt.Done() - // resolve ipns paths - - // TODO(cryptix): we should be able to query the local cache for the path - if nsys == nil { - evt.Append(logging.LoggableMap{"error": ErrNoNamesys.Error()}) - return "", ErrNoNamesys - } - - seg := p.Segments() - - if len(seg) < 2 || seg[1] == "" { // just "/" without further segments - evt.Append(logging.LoggableMap{"error": path.ErrNoComponents.Error()}) - return "", path.ErrNoComponents - } - - extensions := seg[2:] - resolvable, err := path.FromSegments("/", seg[0], seg[1]) - if err != nil { - evt.Append(logging.LoggableMap{"error": err.Error()}) - return "", err - } - - respath, err := nsys.Resolve(ctx, resolvable.String()) - if err != nil { - evt.Append(logging.LoggableMap{"error": err.Error()}) - return "", err - } - - segments := append(respath.Segments(), extensions...) - p, err = path.FromSegments("/", segments...) - if err != nil { - evt.Append(logging.LoggableMap{"error": err.Error()}) - return "", err - } - } - return p, nil -} - -// Resolve resolves the given path by parsing out protocol-specific -// entries (e.g. /ipns/) and then going through the /ipfs/ -// entries and returning the final node. -func Resolve(ctx context.Context, nsys namesys.NameSystem, r *resolver.Resolver, p path.Path) (ipld.Node, error) { - p, err := ResolveIPNS(ctx, nsys, p) - if err != nil { - return nil, err - } - - // ok, we have an IPFS path now (or what we'll treat as one) - return r.ResolvePath(ctx, p) -} diff --git a/vendor/github.com/ipfs/go-ipfs/doc.go b/vendor/github.com/ipfs/go-ipfs/doc.go index fdf2f690..1183559a 100644 --- a/vendor/github.com/ipfs/go-ipfs/doc.go +++ b/vendor/github.com/ipfs/go-ipfs/doc.go @@ -1,27 +1,4 @@ /* IPFS is a global, versioned, peer-to-peer filesystem - -There are sub-packages within the ipfs package for various low-level -utilities, which are in turn assembled into: - -core/...: - The low-level API that gives consumers all the knobs they need, - which we try hard to keep stable. -shell/...: - The high-level API that gives consumers easy access to common - operations (e.g. create a file node from a reader without wrapping - with metadata). We work really hard to keep this stable. - -Then on top of the core/... and shell/... Go APIs, we have: - -cmd/...: - Command-line executables -test/...: - Integration tests, etc. - -To avoid cyclic imports, imports should never pull in higher-level -APIs into a lower-level package. For example, you could import all of -core and shell from cmd/... or test/..., but you couldn't import any -of shell from core/.... */ package ipfs diff --git a/vendor/github.com/ipfs/go-ipfs/exchange/reprovide/providers.go b/vendor/github.com/ipfs/go-ipfs/exchange/reprovide/providers.go deleted file mode 100644 index 77b19e2f..00000000 --- a/vendor/github.com/ipfs/go-ipfs/exchange/reprovide/providers.go +++ /dev/null @@ -1,73 +0,0 @@ -package reprovide - -import ( - "context" - - pin "github.com/ipfs/go-ipfs/pin" - - cid "github.com/ipfs/go-cid" - cidutil "github.com/ipfs/go-cidutil" - blocks "github.com/ipfs/go-ipfs-blockstore" - ipld "github.com/ipfs/go-ipld-format" - merkledag "github.com/ipfs/go-merkledag" -) - -// NewBlockstoreProvider returns key provider using bstore.AllKeysChan -func NewBlockstoreProvider(bstore blocks.Blockstore) KeyChanFunc { - return func(ctx context.Context) (<-chan cid.Cid, error) { - return bstore.AllKeysChan(ctx) - } -} - -// NewPinnedProvider returns provider supplying pinned keys -func NewPinnedProvider(pinning pin.Pinner, dag ipld.DAGService, onlyRoots bool) KeyChanFunc { - return func(ctx context.Context) (<-chan cid.Cid, error) { - set, err := pinSet(ctx, pinning, dag, onlyRoots) - if err != nil { - return nil, err - } - - outCh := make(chan cid.Cid) - go func() { - defer close(outCh) - for c := range set.New { - select { - case <-ctx.Done(): - return - case outCh <- c: - } - } - - }() - - return outCh, nil - } -} - -func pinSet(ctx context.Context, pinning pin.Pinner, dag ipld.DAGService, onlyRoots bool) (*cidutil.StreamingSet, error) { - set := cidutil.NewStreamingSet() - - go func() { - ctx, cancel := context.WithCancel(ctx) - defer cancel() - defer close(set.New) - - for _, key := range pinning.DirectKeys() { - set.Visitor(ctx)(key) - } - - for _, key := range pinning.RecursiveKeys() { - set.Visitor(ctx)(key) - - if !onlyRoots { - err := merkledag.EnumerateChildren(ctx, merkledag.GetLinksWithDAG(dag), key, set.Visitor(ctx)) - if err != nil { - log.Errorf("reprovide indirect pins: %s", err) - return - } - } - } - }() - - return set, nil -} diff --git a/vendor/github.com/ipfs/go-ipfs/filestore/fsrefstore.go b/vendor/github.com/ipfs/go-ipfs/filestore/fsrefstore.go index b4c66a32..320ee592 100644 --- a/vendor/github.com/ipfs/go-ipfs/filestore/fsrefstore.go +++ b/vendor/github.com/ipfs/go-ipfs/filestore/fsrefstore.go @@ -281,7 +281,7 @@ func (f *FileManager) putTo(b *posinfo.FilestoreNode, to putter) error { if !f.AllowFiles { return ErrFilestoreNotEnabled } - if !filepath.HasPrefix(b.PosInfo.FullPath, f.root) { + if !filepath.HasPrefix(b.PosInfo.FullPath, f.root) { //nolint:staticcheck return fmt.Errorf("cannot add filestore references outside ipfs root (%s)", f.root) } diff --git a/vendor/github.com/ipfs/go-ipfs/go.mod b/vendor/github.com/ipfs/go-ipfs/go.mod deleted file mode 100644 index 5ecc7fe7..00000000 --- a/vendor/github.com/ipfs/go-ipfs/go.mod +++ /dev/null @@ -1,119 +0,0 @@ -module github.com/ipfs/go-ipfs - -require ( - bazil.org/fuse v0.0.0-20180421153158-65cc252bf669 - github.com/Kubuxu/go-os-helper v0.0.1 - github.com/Kubuxu/gocovmerge v0.0.0-20161216165753-7ecaa51963cd - github.com/blang/semver v3.5.1+incompatible - github.com/bren2010/proquint v0.0.0-20160323162903-38337c27106d - github.com/cenkalti/backoff v2.1.1+incompatible - github.com/dustin/go-humanize v1.0.0 - github.com/elgris/jsondiff v0.0.0-20160530203242-765b5c24c302 - github.com/fatih/color v1.7.0 // indirect - github.com/fsnotify/fsnotify v1.4.7 - github.com/gogo/protobuf v1.2.1 - github.com/hashicorp/go-multierror v1.0.0 - github.com/hashicorp/golang-lru v0.5.1 - github.com/hsanjuan/go-libp2p-http v0.0.2 - github.com/ipfs/dir-index-html v1.0.3 - github.com/ipfs/go-bitswap v0.0.4 - github.com/ipfs/go-block-format v0.0.2 - github.com/ipfs/go-blockservice v0.0.3 - github.com/ipfs/go-cid v0.0.1 - github.com/ipfs/go-cidutil v0.0.1 - github.com/ipfs/go-datastore v0.0.3 - github.com/ipfs/go-detect-race v0.0.1 - github.com/ipfs/go-ds-badger v0.0.3 - github.com/ipfs/go-ds-flatfs v0.0.2 - github.com/ipfs/go-ds-leveldb v0.0.2 - github.com/ipfs/go-ds-measure v0.0.1 - github.com/ipfs/go-fs-lock v0.0.1 - github.com/ipfs/go-ipfs-addr v0.0.1 - github.com/ipfs/go-ipfs-blockstore v0.0.1 - github.com/ipfs/go-ipfs-blocksutil v0.0.1 - github.com/ipfs/go-ipfs-chunker v0.0.1 - github.com/ipfs/go-ipfs-cmdkit v0.0.1 - github.com/ipfs/go-ipfs-cmds v0.0.5 - github.com/ipfs/go-ipfs-config v0.0.1 - github.com/ipfs/go-ipfs-ds-help v0.0.1 - github.com/ipfs/go-ipfs-exchange-interface v0.0.1 - github.com/ipfs/go-ipfs-exchange-offline v0.0.1 - github.com/ipfs/go-ipfs-files v0.0.2 - github.com/ipfs/go-ipfs-posinfo v0.0.1 - github.com/ipfs/go-ipfs-routing v0.0.1 - github.com/ipfs/go-ipfs-util v0.0.1 - github.com/ipfs/go-ipld-cbor v0.0.1 - github.com/ipfs/go-ipld-format v0.0.1 - github.com/ipfs/go-ipld-git v0.0.1 - github.com/ipfs/go-ipns v0.0.1 - github.com/ipfs/go-log v0.0.1 - github.com/ipfs/go-merkledag v0.0.3 - github.com/ipfs/go-metrics-interface v0.0.1 - github.com/ipfs/go-metrics-prometheus v0.0.2 - github.com/ipfs/go-mfs v0.0.4 - github.com/ipfs/go-path v0.0.3 - github.com/ipfs/go-unixfs v0.0.4 - github.com/ipfs/go-verifcid v0.0.1 - github.com/ipfs/hang-fds v0.0.1 - github.com/ipfs/interface-go-ipfs-core v0.0.6 - github.com/ipfs/iptb v1.4.0 - github.com/ipfs/iptb-plugins v0.0.2 - github.com/jbenet/go-is-domain v1.0.2 - github.com/jbenet/go-random v0.0.0-20190219211222-123a90aedc0c - github.com/jbenet/go-random-files v0.0.0-20190219210431-31b3f20ebded - github.com/jbenet/go-temp-err-catcher v0.0.0-20150120210811-aac704a3f4f2 - github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8 - github.com/libp2p/go-libp2p v0.0.12 - github.com/libp2p/go-libp2p-autonat-svc v0.0.5 - github.com/libp2p/go-libp2p-circuit v0.0.4 - github.com/libp2p/go-libp2p-connmgr v0.0.1 - github.com/libp2p/go-libp2p-crypto v0.0.1 - github.com/libp2p/go-libp2p-host v0.0.1 - github.com/libp2p/go-libp2p-interface-connmgr v0.0.1 - github.com/libp2p/go-libp2p-kad-dht v0.0.7 - github.com/libp2p/go-libp2p-kbucket v0.1.1 - github.com/libp2p/go-libp2p-loggables v0.0.1 - github.com/libp2p/go-libp2p-metrics v0.0.1 - github.com/libp2p/go-libp2p-net v0.0.2 - github.com/libp2p/go-libp2p-peer v0.0.1 - github.com/libp2p/go-libp2p-peerstore v0.0.2 - github.com/libp2p/go-libp2p-pnet v0.0.1 - github.com/libp2p/go-libp2p-protocol v0.0.1 - github.com/libp2p/go-libp2p-pubsub v0.0.1 - github.com/libp2p/go-libp2p-pubsub-router v0.0.3 - github.com/libp2p/go-libp2p-quic-transport v0.0.3 - github.com/libp2p/go-libp2p-record v0.0.1 - github.com/libp2p/go-libp2p-routing v0.0.1 - github.com/libp2p/go-libp2p-routing-helpers v0.0.2 - github.com/libp2p/go-libp2p-secio v0.0.1 - github.com/libp2p/go-libp2p-swarm v0.0.2 - github.com/libp2p/go-maddr-filter v0.0.1 - github.com/libp2p/go-stream-muxer v0.0.1 - github.com/libp2p/go-testutil v0.0.1 - github.com/mattn/go-runewidth v0.0.4 // indirect - github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b // indirect - github.com/mitchellh/go-homedir v1.1.0 - github.com/mr-tron/base58 v1.1.0 - github.com/multiformats/go-multiaddr v0.0.1 - github.com/multiformats/go-multiaddr-dns v0.0.2 - github.com/multiformats/go-multiaddr-net v0.0.1 - github.com/multiformats/go-multibase v0.0.1 - github.com/multiformats/go-multihash v0.0.1 - github.com/opentracing/opentracing-go v1.0.2 - github.com/prometheus/client_golang v0.9.2 - github.com/syndtr/goleveldb v1.0.0 - github.com/whyrusleeping/base32 v0.0.0-20170828182744-c30ac30633cc - github.com/whyrusleeping/go-smux-multiplex v3.0.16+incompatible - github.com/whyrusleeping/go-smux-yamux v2.0.9+incompatible - github.com/whyrusleeping/go-sysinfo v0.0.0-20190219211824-4a357d4b90b1 - github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7 - github.com/whyrusleeping/tar-utils v0.0.0-20180509141711-8c6c8ba81d5c - golang.org/x/sys v0.0.0-20190302025703-b6889370fb10 - golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e // indirect - gopkg.in/airbrake/gobrake.v2 v2.0.9 // indirect - gopkg.in/cheggaaa/pb.v1 v1.0.28 - gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2 // indirect - gotest.tools/gotestsum v0.3.3 -) - -go 1.12 diff --git a/vendor/github.com/ipfs/go-ipfs/go.sum b/vendor/github.com/ipfs/go-ipfs/go.sum deleted file mode 100644 index 29afbf46..00000000 --- a/vendor/github.com/ipfs/go-ipfs/go.sum +++ /dev/null @@ -1,580 +0,0 @@ -bazil.org/fuse v0.0.0-20180421153158-65cc252bf669 h1:FNCRpXiquG1aoyqcIWVFmpTSKVcx2bQD38uZZeGtdlw= -bazil.org/fuse v0.0.0-20180421153158-65cc252bf669/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= -github.com/AndreasBriese/bbloom v0.0.0-20180913140656-343706a395b7 h1:PqzgE6kAMi81xWQA2QIVxjWkFHptGgC547vchpUbtFo= -github.com/AndreasBriese/bbloom v0.0.0-20180913140656-343706a395b7/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= -github.com/Kubuxu/go-os-helper v0.0.1 h1:EJiD2VUQyh5A9hWJLmc6iWg6yIcJ7jpBcwC8GMGXfDk= -github.com/Kubuxu/go-os-helper v0.0.1/go.mod h1:N8B+I7vPCT80IcP58r50u4+gEEcsZETFUpAzWW2ep1Y= -github.com/Kubuxu/gocovmerge v0.0.0-20161216165753-7ecaa51963cd h1:HNhzThEtZW714v8Eda8sWWRcu9WSzJC+oCyjRjvZgRA= -github.com/Kubuxu/gocovmerge v0.0.0-20161216165753-7ecaa51963cd/go.mod h1:bqoB8kInrTeEtYAwaIXoSRqdwnjQmFhsfusnzyui6yY= -github.com/Stebalien/go-bitfield v0.0.0-20180330043415-076a62f9ce6e h1:2Z+EBRrOJsA3psnUPcEWMIH2EIga1xHflQcr/EZslx8= -github.com/Stebalien/go-bitfield v0.0.0-20180330043415-076a62f9ce6e/go.mod h1:3oM7gXIttpYDAJXpVNnSCiUMYBLIZ6cb1t+Ip982MRo= -github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973 h1:xJ4a3vCFaGF/jqvzLMYoU8P317H5OQ+Via4RmuPwCS0= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/bifurcation/mint v0.0.0-20181105073638-824af6541065 h1:ArS0Fye/ZH2QmKVSj4JEf+9ARkXNe18jcFkmr4XPRiw= -github.com/bifurcation/mint v0.0.0-20181105073638-824af6541065/go.mod h1:zVt7zX3K/aDCk9Tj+VM7YymsX66ERvzCJzw8rFCX2JU= -github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= -github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/bren2010/proquint v0.0.0-20160323162903-38337c27106d h1:QgeLLoPD3kRVmeu/1al9iIpIANMi9O1zXFm8BnYGCJg= -github.com/bren2010/proquint v0.0.0-20160323162903-38337c27106d/go.mod h1:Jbj8eKecMNwf0KFI75skSUZqMB4UCRcndUScVBTWyUI= -github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32 h1:qkOC5Gd33k54tobS36cXdAzJbeHaduLtnLQQwNoIi78= -github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32/go.mod h1:DrZx5ec/dmnfpw9KyYoQyYo7d0KEvTkk/5M/vbZjAr8= -github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= -github.com/btcsuite/btcutil v0.0.0-20190207003914-4c204d697803/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= -github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= -github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= -github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= -github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= -github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= -github.com/cenkalti/backoff v2.1.1+incompatible h1:tKJnvO2kl0zmb/jA5UKAt4VoEVw1qxKWjE/Bpp46npY= -github.com/cenkalti/backoff v2.1.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= -github.com/cheekybits/genny v1.0.0 h1:uGGa4nei+j20rOSeDeP5Of12XVm7TGUd4dJA9RDitfE= -github.com/cheekybits/genny v1.0.0/go.mod h1:+tQajlRqAUrPI7DOSpB0XAqZYtQakVtB7wXkRAgjxjQ= -github.com/coreos/go-semver v0.2.0 h1:3Jm3tLmsgAYcjC+4Up7hJrFBPr+n7rAqYeSw/SZazuY= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/cskr/pubsub v1.0.2 h1:vlOzMhl6PFn60gRlTQQsIfVwaPB/B/8MziK8FhEPt/0= -github.com/cskr/pubsub v1.0.2/go.mod h1:/8MzYXk/NJAz782G8RPkFzXTZVu63VotefPnR9TIRis= -github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= -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/davidlazar/go-crypto v0.0.0-20170701192655-dcfb0a7ac018 h1:6xT9KW8zLC5IlbaIF5Q7JNieBoACT7iW0YTxQHR0in0= -github.com/davidlazar/go-crypto v0.0.0-20170701192655-dcfb0a7ac018/go.mod h1:rQYf4tfk5sSwFsnDg3qYaBxSjsD9S8+59vW0dKUgme4= -github.com/dgraph-io/badger v1.5.5-0.20190226225317-8115aed38f8f h1:6itBiEUtu+gOzXZWn46bM5/qm8LlV6/byR7Yflx/y6M= -github.com/dgraph-io/badger v1.5.5-0.20190226225317-8115aed38f8f/go.mod h1:VZxzAIRPHRVNRKRo6AXrX9BJegn6il06VMTZVJYCIjQ= -github.com/dgraph-io/badger v2.0.0-rc.2+incompatible h1:7KPp6xv5+wymkVUbkAnZZXvmDrJlf09m/7u1HG5lAYA= -github.com/dgraph-io/badger v2.0.0-rc.2+incompatible/go.mod h1:VZxzAIRPHRVNRKRo6AXrX9BJegn6il06VMTZVJYCIjQ= -github.com/dgryski/go-farm v0.0.0-20190104051053-3adb47b1fb0f h1:dDxpBYafY/GYpcl+LS4Bn3ziLPuEdGRkRjYAbSlWxSA= -github.com/dgryski/go-farm v0.0.0-20190104051053-3adb47b1fb0f/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/elgris/jsondiff v0.0.0-20160530203242-765b5c24c302 h1:QV0ZrfBLpFc2KDk+a4LJefDczXnonRwrYrQJY/9L4dA= -github.com/elgris/jsondiff v0.0.0-20160530203242-765b5c24c302/go.mod h1:qBlWZqWeVx9BjvqBsnC/8RUlAYpIFmPvgROcw0n1scE= -github.com/facebookgo/atomicfile v0.0.0-20151019160806-2de1f203e7d5 h1:BBso6MBKW8ncyZLv37o+KNyy0HrrHgfnOaGQC2qvN+A= -github.com/facebookgo/atomicfile v0.0.0-20151019160806-2de1f203e7d5/go.mod h1:JpoxHjuQauoxiFMl1ie8Xc/7TfLuMZ5eOCONd1sUBHg= -github.com/fatih/color v1.6.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fd/go-nat v1.0.0 h1:DPyQ97sxA9ThrWYRPcWUz/z9TnpTIGRYODIQc/dy64M= -github.com/fd/go-nat v1.0.0/go.mod h1:BTBu/CKvMmOMUPkKVef1pngt2WFH/lg7E6yQnulfp6E= -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/go-check/check v0.0.0-20180628173108-788fd7840127 h1:0gkP6mzaMqkmpcJYCFOLkIBwI7xFExG03bbkOkCvUPI= -github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= -github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/golang/mock v1.2.0 h1:28o5sBqPkBsMGnC6b4MvE2TzSr5/AT4c/1fLqVGIwlk= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.0 h1:kbxbvI4Un1LUWKxufD+BiE6AEExYYgkQLQmLFqA1LFk= -github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0= -github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db h1:woRePGFeVFfLKN/pOkfl+p/TAqKOfFu+7KPlMVpok/w= -github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/go-cmp v0.2.0 h1:+dTQ8DZQJz0Mb/HjFlkptS1FeQ4cWSnN941F8aEG4SQ= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gxed/go-shellwords v1.0.3 h1:2TP32H4TAklZUdz84oj95BJhVnIrRasyx2j1cqH5K38= -github.com/gxed/go-shellwords v1.0.3/go.mod h1:N7paucT91ByIjmVJHhvoarjoQnmsi3Jd3vH7VqgtMxQ= -github.com/gxed/hashland/keccakpg v0.0.1 h1:wrk3uMNaMxbXiHibbPO4S0ymqJMm41WiudyFSs7UnsU= -github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfmKFJ6tItnhQ67kU= -github.com/gxed/hashland/murmur3 v0.0.1 h1:SheiaIt0sda5K+8FLz952/1iWS9zrnKsEJaOJu4ZbSc= -github.com/gxed/hashland/murmur3 v0.0.1/go.mod h1:KjXop02n4/ckmZSnY2+HKcLud/tcmvhST0bie/0lS48= -github.com/gxed/pubsub v0.0.0-20180201040156-26ebdf44f824 h1:TF4mX7zXpeyz/xintezebSa7ZDxAGBnqDwcoobvaz2o= -github.com/gxed/pubsub v0.0.0-20180201040156-26ebdf44f824/go.mod h1:OiEWyHgK+CWrmOlVquHaIK1vhpUJydC9m0Je6mhaiNE= -github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-multierror v1.0.0 h1:iVjPR7a6H0tWELX5NxNe7bYopibicUzc7uPribsnS6o= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+dAcgU= -github.com/hashicorp/golang-lru v0.5.1/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/hsanjuan/go-libp2p-gostream v0.0.31 h1:9dIgHQPR0VWxhOyTZrbgLzTx0xvZ5rTpmhG9huGEPjY= -github.com/hsanjuan/go-libp2p-gostream v0.0.31/go.mod h1:cWvV5/NQ5XWi0eQZnX/svsAk6NLc4U26pItvj0eDeRk= -github.com/hsanjuan/go-libp2p-http v0.0.2 h1:hviJbUD3h1Ez2FYTUdnRjrkAzn/9i2V/cLZpFPgnuP8= -github.com/hsanjuan/go-libp2p-http v0.0.2/go.mod h1:MynY94gfOZxrw/0lVF4o7vbV2Zr84IC8sLBXmj8F5IE= -github.com/huin/goupnp v0.0.0-20180415215157-1395d1447324 h1:PV190X5/DzQ/tbFFG5YpT5mH6q+cHlfgqI5JuRnH9oE= -github.com/huin/goupnp v0.0.0-20180415215157-1395d1447324/go.mod h1:MZ2ZmwcBpvOoJ22IJsc7va19ZwoheaBk43rKg12SKag= -github.com/huin/goupnp v1.0.0 h1:wg75sLpL6DZqwHQN6E1Cfk6mtfzS45z8OV+ic+DtHRo= -github.com/huin/goupnp v1.0.0/go.mod h1:n9v9KO1tAxYH82qOn+UTIFQDmx5n1Zxd/ClZDMX7Bnc= -github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= -github.com/ipfs/bbloom v0.0.1 h1:s7KkiBPfxCeDVo47KySjK0ACPc5GJRUxFpdyWEuDjhw= -github.com/ipfs/bbloom v0.0.1/go.mod h1:oqo8CVWsJFMOZqTglBG4wydCE4IQA/G2/SEofB0rjUI= -github.com/ipfs/dir-index-html v1.0.3 h1:cKdOjJBKJgewgcv97zOlqsNOle52N91d3nAkbQadnuY= -github.com/ipfs/dir-index-html v1.0.3/go.mod h1:TG9zbaH/+4MnkGel0xF4SLNhk+YZvBNo6jjBkO/LaWc= -github.com/ipfs/go-bitswap v0.0.1 h1:Xx1ma7TWy9ISOx5zFq5YVQyrTHzUP4GkRPMsZokHxAg= -github.com/ipfs/go-bitswap v0.0.1/go.mod h1:z+tP3h+HTJ810n1R5yMy2ccKFffJ2F6Vqm/5Bf7vs2c= -github.com/ipfs/go-bitswap v0.0.3 h1:uFcSI9dkjUn67S7IM60vr2wA27aAvn8o9xYjaQCug3o= -github.com/ipfs/go-bitswap v0.0.3/go.mod h1:jadAZYsP/tcRMl47ZhFxhaNuDQoXawT8iHMg+iFoQbg= -github.com/ipfs/go-bitswap v0.0.4 h1:mrS8jBd+rCgKw7Owx4RM5QBiMi9DBc1Ih9FaEBYM4/M= -github.com/ipfs/go-bitswap v0.0.4/go.mod h1:jadAZYsP/tcRMl47ZhFxhaNuDQoXawT8iHMg+iFoQbg= -github.com/ipfs/go-block-format v0.0.1/go.mod h1:DK/YYcsSUIVAFNwo/KZCdIIbpN0ROH/baNLgayt4pFc= -github.com/ipfs/go-block-format v0.0.2 h1:qPDvcP19izTjU8rgo6p7gTXZlkMkF5bz5G3fqIsSCPE= -github.com/ipfs/go-block-format v0.0.2/go.mod h1:AWR46JfpcObNfg3ok2JHDUfdiHRgWhJgCQF+KIgOPJY= -github.com/ipfs/go-blockservice v0.0.1 h1:l6g1hwYDV6vb4bAvTqia6Cvo+zLMOPKel/n0zUX48bc= -github.com/ipfs/go-blockservice v0.0.1/go.mod h1:2Ao89U7jV1KIqqNk5EdhSTBG/Pgc1vMFr0bhkx376j4= -github.com/ipfs/go-blockservice v0.0.3 h1:40OvwrxeudTAlUGUAKNYnNPcwQeLtXedjzTWecnUinQ= -github.com/ipfs/go-blockservice v0.0.3/go.mod h1:/NNihwTi6V2Yr6g8wBI+BSwPuURpBRMtYNGrlxZ8KuI= -github.com/ipfs/go-cid v0.0.1 h1:GBjWPktLnNyX0JiQCNFpUuUSoMw5KMyqrsejHYlILBE= -github.com/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= -github.com/ipfs/go-cidutil v0.0.1 h1:UpDQI2LrihqOGY2mHaMhjrhh1DJ14N/58BQb7lKXvlQ= -github.com/ipfs/go-cidutil v0.0.1/go.mod h1:/0H649ymJksNEZvBAkM18HIctk7tkONH9tspTeLok48= -github.com/ipfs/go-datastore v0.0.1 h1:AW/KZCScnBWlSb5JbnEnLKFWXL224LBEh/9KXXOrUms= -github.com/ipfs/go-datastore v0.0.1/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= -github.com/ipfs/go-datastore v0.0.3 h1:/eP3nMDmLzMJNoWSSYvEkmMTTrm9FFCN+JraP9NdlwU= -github.com/ipfs/go-datastore v0.0.3/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= -github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk= -github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps= -github.com/ipfs/go-ds-badger v0.0.2 h1:7ToQt7QByBhOTuZF2USMv+PGlMcBC7FW7FdgQ4FCsoo= -github.com/ipfs/go-ds-badger v0.0.2/go.mod h1:Y3QpeSFWQf6MopLTiZD+VT6IC1yZqaGmjvRcKeSGij8= -github.com/ipfs/go-ds-badger v0.0.3 h1:sVYE2YlCzltznTZeAP1S+bp3qipz7VzogfZDtf6tGq0= -github.com/ipfs/go-ds-badger v0.0.3/go.mod h1:7AzMKCsGav0u46HpdLiAEAOqizR1H6AZsjpHpQSPYCQ= -github.com/ipfs/go-ds-flatfs v0.0.2 h1:1zujtU5bPBH6B8roE+TknKIbBCrpau865xUk0dH3x2A= -github.com/ipfs/go-ds-flatfs v0.0.2/go.mod h1:YsMGWjUieue+smePAWeH/YhHtlmEMnEGhiwIn6K6rEM= -github.com/ipfs/go-ds-leveldb v0.0.1 h1:Z0lsTFciec9qYsyngAw1f/czhRU35qBLR2vhavPFgqA= -github.com/ipfs/go-ds-leveldb v0.0.1/go.mod h1:feO8V3kubwsEF22n0YRQCffeb79OOYIykR4L04tMOYc= -github.com/ipfs/go-ds-leveldb v0.0.2 h1:P5HB59Zblym0B5XYOeEyw3YtPtbpIqQCavCSWaWEEk8= -github.com/ipfs/go-ds-leveldb v0.0.2/go.mod h1:CWFeBh5IAAscWyG/QRH+lJaAlnLWjsfPSNs4teyPUp0= -github.com/ipfs/go-ds-measure v0.0.1 h1:PrCueug+yZLkDCOthZTXKinuoCal/GvlAT7cNxzr03g= -github.com/ipfs/go-ds-measure v0.0.1/go.mod h1:wiH6bepKsgyNKpz3nyb4erwhhIVpIxnZbsjN1QpVbbE= -github.com/ipfs/go-fs-lock v0.0.1 h1:XHX8uW4jQBYWHj59XXcjg7BHlHxV9ZOYs6Y43yb7/l0= -github.com/ipfs/go-fs-lock v0.0.1/go.mod h1:DNBekbboPKcxs1aukPSaOtFA3QfSdi5C855v0i9XJ8Y= -github.com/ipfs/go-ipfs-addr v0.0.1 h1:DpDFybnho9v3/a1dzJ5KnWdThWD1HrFLpQ+tWIyBaFI= -github.com/ipfs/go-ipfs-addr v0.0.1/go.mod h1:uKTDljHT3Q3SUWzDLp3aYUi8MrY32fgNgogsIa0npjg= -github.com/ipfs/go-ipfs-blockstore v0.0.1 h1:O9n3PbmTYZoNhkgkEyrXTznbmktIXif62xLX+8dPHzc= -github.com/ipfs/go-ipfs-blockstore v0.0.1/go.mod h1:d3WClOmRQKFnJ0Jz/jj/zmksX0ma1gROTlovZKBmN08= -github.com/ipfs/go-ipfs-blocksutil v0.0.1 h1:Eh/H4pc1hsvhzsQoMEP3Bke/aW5P5rVM1IWFJMcGIPQ= -github.com/ipfs/go-ipfs-blocksutil v0.0.1/go.mod h1:Yq4M86uIOmxmGPUHv/uI7uKqZNtLb449gwKqXjIsnRk= -github.com/ipfs/go-ipfs-chunker v0.0.1 h1:cHUUxKFQ99pozdahi+uSC/3Y6HeRpi9oTeUHbE27SEw= -github.com/ipfs/go-ipfs-chunker v0.0.1/go.mod h1:tWewYK0we3+rMbOh7pPFGDyypCtvGcBFymgY4rSDLAw= -github.com/ipfs/go-ipfs-cmdkit v0.0.1 h1:X6YXEAjUljTzevE6DPUKXSqcgf+4FXzcn5B957F5MXo= -github.com/ipfs/go-ipfs-cmdkit v0.0.1/go.mod h1:9FtbMdUabcSqv/G4/8WCxSLxkZxn/aZEFrxxqnVcRbg= -github.com/ipfs/go-ipfs-cmds v0.0.5 h1:+blTEnA0MzkQO86WnpfGnchdojrY5wJLhsbby3/JXEM= -github.com/ipfs/go-ipfs-cmds v0.0.5/go.mod h1:1QVgxSgenZvOMGVC/XUTC7tJxRBGPLxYvpgPpCi3DUk= -github.com/ipfs/go-ipfs-config v0.0.1 h1:6ED08emzI1imdsAjixFi2pEyZxTVD5ECKtCOxLBx+Uc= -github.com/ipfs/go-ipfs-config v0.0.1/go.mod h1:KDbHjNyg4e6LLQSQpkgQMBz6Jf4LXiWAcmnkcwmH0DU= -github.com/ipfs/go-ipfs-delay v0.0.0-20181109222059-70721b86a9a8/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= -github.com/ipfs/go-ipfs-delay v0.0.1 h1:r/UXYyRcddO6thwOnhiznIAiSvxMECGgtv35Xs1IeRQ= -github.com/ipfs/go-ipfs-delay v0.0.1/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= -github.com/ipfs/go-ipfs-ds-help v0.0.1 h1:QBg+Ts2zgeemK/dB0saiF/ykzRGgfoFMT90Rzo0OnVU= -github.com/ipfs/go-ipfs-ds-help v0.0.1/go.mod h1:gtP9xRaZXqIQRh1HRpp595KbBEdgqWFxefeVKOV8sxo= -github.com/ipfs/go-ipfs-exchange-interface v0.0.1 h1:LJXIo9W7CAmugqI+uofioIpRb6rY30GUu7G6LUfpMvM= -github.com/ipfs/go-ipfs-exchange-interface v0.0.1/go.mod h1:c8MwfHjtQjPoDyiy9cFquVtVHkO9b9Ob3FG91qJnWCM= -github.com/ipfs/go-ipfs-exchange-offline v0.0.1 h1:P56jYKZF7lDDOLx5SotVh5KFxoY6C81I1NSHW1FxGew= -github.com/ipfs/go-ipfs-exchange-offline v0.0.1/go.mod h1:WhHSFCVYX36H/anEKQboAzpUws3x7UeEGkzQc3iNkM0= -github.com/ipfs/go-ipfs-files v0.0.1 h1:OroTsI58plHGX70HPLKy6LQhPR3HZJ5ip61fYlo6POM= -github.com/ipfs/go-ipfs-files v0.0.1/go.mod h1:INEFm0LL2LWXBhNJ2PMIIb2w45hpXgPjNoE7yA8Y1d4= -github.com/ipfs/go-ipfs-files v0.0.2 h1:fEEjF4H+1t8SFOHqUGp0KqcwgIRlbD2bu8CAS2sIggE= -github.com/ipfs/go-ipfs-files v0.0.2/go.mod h1:INEFm0LL2LWXBhNJ2PMIIb2w45hpXgPjNoE7yA8Y1d4= -github.com/ipfs/go-ipfs-flags v0.0.1 h1:OH5cEkJYL0QgA+bvD55TNG9ud8HA2Nqaav47b2c/UJk= -github.com/ipfs/go-ipfs-flags v0.0.1/go.mod h1:RnXBb9WV53GSfTrSDVK61NLTFKvWc60n+K9EgCDh+rA= -github.com/ipfs/go-ipfs-posinfo v0.0.1 h1:Esoxj+1JgSjX0+ylc0hUmJCOv6V2vFoZiETLR6OtpRs= -github.com/ipfs/go-ipfs-posinfo v0.0.1/go.mod h1:SwyeVP+jCwiDu0C313l/8jg6ZxM0qqtlt2a0vILTc1A= -github.com/ipfs/go-ipfs-pq v0.0.1 h1:zgUotX8dcAB/w/HidJh1zzc1yFq6Vm8J7T2F4itj/RU= -github.com/ipfs/go-ipfs-pq v0.0.1/go.mod h1:LWIqQpqfRG3fNc5XsnIhz/wQ2XXGyugQwls7BgUmUfY= -github.com/ipfs/go-ipfs-routing v0.0.1 h1:394mZeTLcbM/LDO12PneBYvkZAUA+nRnmC0lAzDXKOY= -github.com/ipfs/go-ipfs-routing v0.0.1/go.mod h1:k76lf20iKFxQTjcJokbPM9iBXVXVZhcOwc360N4nuKs= -github.com/ipfs/go-ipfs-util v0.0.1 h1:Wz9bL2wB2YBJqggkA4dD7oSmqB4cAnpNbGrlHJulv50= -github.com/ipfs/go-ipfs-util v0.0.1/go.mod h1:spsl5z8KUnrve+73pOhSVZND1SIxPW5RyBCNzQxlJBc= -github.com/ipfs/go-ipld-cbor v0.0.1 h1:g7yh27SznWP4CUbkFgjR+WQRjEeyxCpTR4iKVmXx1wA= -github.com/ipfs/go-ipld-cbor v0.0.1/go.mod h1:RXHr8s4k0NE0TKhnrxqZC9M888QfsBN9rhS5NjfKzY8= -github.com/ipfs/go-ipld-format v0.0.1 h1:HCu4eB/Gh+KD/Q0M8u888RFkorTWNIL3da4oc5dwc80= -github.com/ipfs/go-ipld-format v0.0.1/go.mod h1:kyJtbkDALmFHv3QR6et67i35QzO3S0dCDnkOJhcZkms= -github.com/ipfs/go-ipld-git v0.0.1 h1:Lvhu0SdeHuC8UZbWuM56v35XPtM5pEG6S4WgEffafmg= -github.com/ipfs/go-ipld-git v0.0.1/go.mod h1:/LtgvxOdzEI9Kkwy8j0+QtzTCGfurUBr3Bo23uBG40U= -github.com/ipfs/go-ipns v0.0.1 h1:5vX0+ehF55YWxE8Pmf4eB8szcP+fh24AXnvCkOmSLCc= -github.com/ipfs/go-ipns v0.0.1/go.mod h1:HOiAXgGiH0wCSwsFM1IKdOy6YGT4iZafcsUKni703/g= -github.com/ipfs/go-log v0.0.1 h1:9XTUN/rW64BCG1YhPK9Hoy3q8nr4gOmHHBpgFdfw6Lc= -github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM= -github.com/ipfs/go-merkledag v0.0.1 h1:HqvQsqqLvNOgItOy80Sd4T4rHvq6cXtAtrbEoWAON+I= -github.com/ipfs/go-merkledag v0.0.1/go.mod h1:CRdtHMROECqaehAGeJ0Wd9TtlmWv/ta5cUnvbTnniEI= -github.com/ipfs/go-merkledag v0.0.3 h1:A5DlOMzqTRDVmdgkf3dzCKCFmVWH4Zqwb0cbYXUs+Ro= -github.com/ipfs/go-merkledag v0.0.3/go.mod h1:Oc5kIXLHokkE1hWGMBHw+oxehkAaTOqtEb7Zbh6BhLA= -github.com/ipfs/go-metrics-interface v0.0.1 h1:j+cpbjYvu4R8zbleSs36gvB7jR+wsL2fGD6n0jO4kdg= -github.com/ipfs/go-metrics-interface v0.0.1/go.mod h1:6s6euYU4zowdslK0GKHmqaIZ3j/b/tL7HTWtJ4VPgWY= -github.com/ipfs/go-metrics-prometheus v0.0.2 h1:9i2iljLg12S78OhC6UAiXi176xvQGiZaGVF1CUVdE+s= -github.com/ipfs/go-metrics-prometheus v0.0.2/go.mod h1:ELLU99AQQNi+zX6GCGm2lAgnzdSH3u5UVlCdqSXnEks= -github.com/ipfs/go-mfs v0.0.4 h1:34qX5A7mQTYTkszSKIAFr+Y7BbvwVjHW9mzHDxSUqTo= -github.com/ipfs/go-mfs v0.0.4/go.mod h1:rUT0dKNWkKa1T+MobpBL2zANn7p8Y6unXANC0PV2FLk= -github.com/ipfs/go-path v0.0.1 h1:6UskTq8xYVs3zVnHjXDvoCqw22dKWK1BwD1cy1cuHyc= -github.com/ipfs/go-path v0.0.1/go.mod h1:ztzG4iSBN2/CJa93rtHAv/I+mpK+BGALeUoJzhclhw0= -github.com/ipfs/go-path v0.0.3 h1:G/VFcCMXtp36JUPPyytYQ1I3UsBUBf47M//uSdTLnFg= -github.com/ipfs/go-path v0.0.3/go.mod h1:zIRQUez3LuQIU25zFjC2hpBTHimWx7VK5bjZgRLbbdo= -github.com/ipfs/go-todocounter v0.0.1 h1:kITWA5ZcQZfrUnDNkRn04Xzh0YFaDFXsoO2A81Eb6Lw= -github.com/ipfs/go-todocounter v0.0.1/go.mod h1:l5aErvQc8qKE2r7NDMjmq5UNAvuZy0rC8BHOplkWvZ4= -github.com/ipfs/go-unixfs v0.0.1 h1:CTTGqLxU5+PRkkeA+w1peStqRWFD1Kya+yZgIT4Xy1w= -github.com/ipfs/go-unixfs v0.0.1/go.mod h1:ZlB83nMtxNMx4DAAE5/GixeKN1qHC+xspBksI7Q5NeI= -github.com/ipfs/go-unixfs v0.0.4 h1:IApzQ+SnY0tfjqM7aU2b80CFYLZNHvhLmEZDIWr4e/E= -github.com/ipfs/go-unixfs v0.0.4/go.mod h1:eIo/p9ADu/MFOuyxzwU+Th8D6xoxU//r590vUpWyfz8= -github.com/ipfs/go-verifcid v0.0.1 h1:m2HI7zIuR5TFyQ1b79Da5N9dnnCP1vcu2QqawmWlK2E= -github.com/ipfs/go-verifcid v0.0.1/go.mod h1:5Hrva5KBeIog4A+UpqlaIU+DEstipcJYQQZc0g37pY0= -github.com/ipfs/hang-fds v0.0.1 h1:KGAxiGtJPT3THVRNT6yxgpdFPeX4ZemUjENOt6NlOn4= -github.com/ipfs/hang-fds v0.0.1/go.mod h1:U4JNbzwTpk/qP2Ms4VgrZ4HcgJGVosBJqMXvwe4udSY= -github.com/ipfs/interface-go-ipfs-core v0.0.6 h1:yf9D2cMLVgBMXHL+gs/HepDc/M7ZXQXYdoN0eXl7z9c= -github.com/ipfs/interface-go-ipfs-core v0.0.6/go.mod h1:VceUOYu+kPEy8Ev/gAhzXFTIfc/7xILKnL4fgZg8tZM= -github.com/ipfs/iptb v1.4.0 h1:YFYTrCkLMRwk/35IMyC6+yjoQSHTEcNcefBStLJzgvo= -github.com/ipfs/iptb v1.4.0/go.mod h1:1rzHpCYtNp87/+hTxG5TfCVn/yMY3dKnLn8tBiMfdmg= -github.com/ipfs/iptb-plugins v0.0.2 h1:JZp4h/+7f00dY4Epr8gzF+VqKITXmVGsZabvmZp7E9I= -github.com/ipfs/iptb-plugins v0.0.2/go.mod h1:Vud+X6lHv5QlgVbqCPBHt91I0gPIRgmkD6/tMUsI07U= -github.com/jackpal/gateway v1.0.4 h1:LS5EHkLuQ6jzaHwULi0vL+JO0mU/n4yUtK8oUjHHOlM= -github.com/jackpal/gateway v1.0.4/go.mod h1:lTpwd4ACLXmpyiCTRtfiNyVnUmqT9RivzCDQetPfnjA= -github.com/jackpal/gateway v1.0.5 h1:qzXWUJfuMdlLMtt0a3Dgt+xkWQiA5itDEITVJtuSwMc= -github.com/jackpal/gateway v1.0.5/go.mod h1:lTpwd4ACLXmpyiCTRtfiNyVnUmqT9RivzCDQetPfnjA= -github.com/jackpal/go-nat-pmp v1.0.1 h1:i0LektDkO1QlrTm/cSuP+PyBCDnYvjPLGl4LdWEMiaA= -github.com/jackpal/go-nat-pmp v1.0.1/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= -github.com/jbenet/go-cienv v0.0.0-20150120210510-1bb1476777ec h1:DQqZhhDvrTrEQ3Qod5yfavcA064e53xlQ+xajiorXgM= -github.com/jbenet/go-cienv v0.0.0-20150120210510-1bb1476777ec/go.mod h1:rGaEvXB4uRSZMmzKNLoXvTu1sfx+1kv/DojUlPrSZGs= -github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= -github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= -github.com/jbenet/go-is-domain v1.0.2 h1:11r5MSptcNFZyBoqubBQnVMUKRWLuRjL1banaIk+iYo= -github.com/jbenet/go-is-domain v1.0.2/go.mod h1:xbRLRb0S7FgzDBTJlguhDVwLYM/5yNtvktxj2Ttfy7Q= -github.com/jbenet/go-random v0.0.0-20190219211222-123a90aedc0c h1:uUx61FiAa1GI6ZmVd2wf2vULeQZIKG66eybjNXKYCz4= -github.com/jbenet/go-random v0.0.0-20190219211222-123a90aedc0c/go.mod h1:sdx1xVM9UuLw1tXnhJWN3piypTUO3vCIHYmG15KE/dU= -github.com/jbenet/go-random-files v0.0.0-20190219210431-31b3f20ebded h1:fHCa28iw+qaRWZK4IqrntHxXALD5kKr/ESrpOCRRdrg= -github.com/jbenet/go-random-files v0.0.0-20190219210431-31b3f20ebded/go.mod h1:FKvZrl5nnaGnTAMewcq0i7wM5zHD75e0lwlnF8q46uo= -github.com/jbenet/go-temp-err-catcher v0.0.0-20150120210811-aac704a3f4f2 h1:vhC1OXXiT9R2pczegwz6moDvuRpggaroAXhPIseh57A= -github.com/jbenet/go-temp-err-catcher v0.0.0-20150120210811-aac704a3f4f2/go.mod h1:8GXXJV31xl8whumTzdZsTt3RnUIiPqzkyf7mxToRCMs= -github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8 h1:bspPhN+oKYFk5fcGNuQzp6IGzYQSenLEgH3s6jkXrWw= -github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8/go.mod h1:Ly/wlsjFq/qrU3Rar62tu1gASgGw6chQbSh/XgIIXCY= -github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jonboulle/clockwork v0.1.0 h1:VKV+ZcuP6l3yW9doeqz6ziZGgcynBVQO+obU0+0hcPo= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= -github.com/jtolds/gls v4.2.1+incompatible h1:fSuqC+Gmlu6l/ZYAoZzx2pyucC8Xza35fpRVWLVmUEE= -github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= -github.com/koron/go-ssdp v0.0.0-20180514024734-4a0ed625a78b h1:wxtKgYHEncAU00muMD06dzLiahtGM1eouRNOzVV7tdQ= -github.com/koron/go-ssdp v0.0.0-20180514024734-4a0ed625a78b/go.mod h1:5Ky9EC2xfoUKUor0Hjgi2BJhCSXJfMOFlmyYrVKGQMk= -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/libp2p/go-addr-util v0.0.1 h1:TpTQm9cXVRVSKsYbgQ7GKc3KbbHVTnbostgGaDEP+88= -github.com/libp2p/go-addr-util v0.0.1/go.mod h1:4ac6O7n9rIAKB1dnd+s8IbbMXkt+oBpzX4/+RACcnlQ= -github.com/libp2p/go-buffer-pool v0.0.1 h1:9Rrn/H46cXjaA2HQ5Y8lyhOS1NhTkZ4yuEs2r3Eechg= -github.com/libp2p/go-buffer-pool v0.0.1/go.mod h1:xtyIz9PMobb13WaxR6Zo1Pd1zXJKYg0a8KiIvDp3TzQ= -github.com/libp2p/go-conn-security v0.0.1 h1:4kMMrqrt9EUNCNjX1xagSJC+bq16uqjMe9lk1KBMVNs= -github.com/libp2p/go-conn-security v0.0.1/go.mod h1:bGmu51N0KU9IEjX7kl2PQjgZa40JQWnayTvNMgD/vyk= -github.com/libp2p/go-conn-security-multistream v0.0.1 h1:XefjAQRHcnUaxKb26RGupToucx3uU4ecbOZ3aACXlDU= -github.com/libp2p/go-conn-security-multistream v0.0.1/go.mod h1:nc9vud7inQ+d6SO0I/6dSWrdMnHnzZNHeyUQqrAJulE= -github.com/libp2p/go-flow-metrics v0.0.1 h1:0gxuFd2GuK7IIP5pKljLwps6TvcuYgvG7Atqi3INF5s= -github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZxBdp967ls1g+k8= -github.com/libp2p/go-libp2p v0.0.1 h1:oEjzhRzymY7NILTMzOKNVOpNZGpcQHrHriWw91pbJNM= -github.com/libp2p/go-libp2p v0.0.1/go.mod h1:bmRs8I0vwn6iRaVssZnJx/epY6WPSKiLoK1vyle4EX0= -github.com/libp2p/go-libp2p v0.0.2 h1:+jvgi0Zy3y4TKXJKApchCk3pCBPZf1T54z3+vKie3gw= -github.com/libp2p/go-libp2p v0.0.2/go.mod h1:Qu8bWqFXiocPloabFGUcVG4kk94fLvfC8mWTDdFC9wE= -github.com/libp2p/go-libp2p v0.0.4/go.mod h1:B9yfFVwbsEmGPlyJROAoqrjumbMB2n0YrgNm1intDOY= -github.com/libp2p/go-libp2p v0.0.12 h1:UbZO296s6/Cvoz4LmymvL7LrXtHkD58Xtt8Iddx/N+I= -github.com/libp2p/go-libp2p v0.0.12/go.mod h1:l8kmLMc4DToz2TtA0aWEaE4/jVMALRKw8Kv2WTR0LHc= -github.com/libp2p/go-libp2p-autonat v0.0.1 h1:d5eskFxeJ4ag1ekhMC3yLTK+z+6RTw9W1Yv8HQma75k= -github.com/libp2p/go-libp2p-autonat v0.0.1/go.mod h1:fs71q5Xk+pdnKU014o2iq1RhMs9/PMaG5zXRFNnIIT4= -github.com/libp2p/go-libp2p-autonat v0.0.2 h1:ilo9QPzNPf1hMkqaPG55yzvhILf5ZtijstJhcii+l3s= -github.com/libp2p/go-libp2p-autonat v0.0.2/go.mod h1:fs71q5Xk+pdnKU014o2iq1RhMs9/PMaG5zXRFNnIIT4= -github.com/libp2p/go-libp2p-autonat v0.0.3 h1:PUD+pAx8Qs9hh+Bowzxq8RCkg/Vwrz5oCFC4peixXQk= -github.com/libp2p/go-libp2p-autonat v0.0.3/go.mod h1:fs71q5Xk+pdnKU014o2iq1RhMs9/PMaG5zXRFNnIIT4= -github.com/libp2p/go-libp2p-autonat v0.0.4 h1:cZzdB9KW1ZkHnSjLCB6aFNw47XS4r+SecCVMuVB1xgo= -github.com/libp2p/go-libp2p-autonat v0.0.4/go.mod h1:fs71q5Xk+pdnKU014o2iq1RhMs9/PMaG5zXRFNnIIT4= -github.com/libp2p/go-libp2p-autonat-svc v0.0.2 h1:beAUwqt3wHWlguz1EYdG+bVOKyf5SIQpXfTSnfGoW7k= -github.com/libp2p/go-libp2p-autonat-svc v0.0.2/go.mod h1:j4iMiw0d3diRm5iB0noXumtb0mPvWrM1qAyh640cp8w= -github.com/libp2p/go-libp2p-autonat-svc v0.0.5 h1:bTom7QFAkJMXiA8ibSsKQ2+LKEHsXZz2IAWYolg/YYg= -github.com/libp2p/go-libp2p-autonat-svc v0.0.5/go.mod h1:6aLiQelA0CKEcPR0TvE9bqJ7U8Mc0nVdwCoho3ROdck= -github.com/libp2p/go-libp2p-blankhost v0.0.1 h1:/mZuuiwntNR8RywnCFlGHLKrKLYne+qciBpQXWqp5fk= -github.com/libp2p/go-libp2p-blankhost v0.0.1/go.mod h1:Ibpbw/7cPPYwFb7PACIWdvxxv0t0XCCI10t7czjAjTc= -github.com/libp2p/go-libp2p-circuit v0.0.1 h1:DYbjyQ5ZY3QVAVYZWG4uzBQ6Wmcd1C82Bk8Q/pJlM1I= -github.com/libp2p/go-libp2p-circuit v0.0.1/go.mod h1:Dqm0s/BiV63j8EEAs8hr1H5HudqvCAeXxDyic59lCwE= -github.com/libp2p/go-libp2p-circuit v0.0.4 h1:yOgEadnSVFj3e9KLBuLG+edqCImeav0VXxXvcimpOUQ= -github.com/libp2p/go-libp2p-circuit v0.0.4/go.mod h1:p1cHJnB9xnX5/1vZLkXgKwmNEOQQuF/Hp+SkATXnXYk= -github.com/libp2p/go-libp2p-connmgr v0.0.1 h1:9KP7UbP4a6fauLw954LhTGfovhkmMwvJsIf8G4CCons= -github.com/libp2p/go-libp2p-connmgr v0.0.1/go.mod h1:eUBBlbuwBBTd/eim7KV5x0fOD2UHDjSwhzmBL6miIx8= -github.com/libp2p/go-libp2p-crypto v0.0.1 h1:JNQd8CmoGTohO/akqrH16ewsqZpci2CbgYH/LmYl8gw= -github.com/libp2p/go-libp2p-crypto v0.0.1/go.mod h1:yJkNyDmO341d5wwXxDUGO0LykUVT72ImHNUqh5D/dBE= -github.com/libp2p/go-libp2p-daemon v0.0.6/go.mod h1:nkhjsjSzkF+tg6iScsTTgq9m+VfyMtXNpycYG4CFvC8= -github.com/libp2p/go-libp2p-discovery v0.0.1 h1:VkjCKmJQMwpDUwtA8Qc1z3TQAHJgQ5nGQ6cdN0wQXOw= -github.com/libp2p/go-libp2p-discovery v0.0.1/go.mod h1:ZkkF9xIFRLA1xCc7bstYFkd80gBGK8Fc1JqGoU2i+zI= -github.com/libp2p/go-libp2p-host v0.0.1 h1:dnqusU+DheGcdxrE718kG4XgHNuL2n9eEv8Rg5zy8hQ= -github.com/libp2p/go-libp2p-host v0.0.1/go.mod h1:qWd+H1yuU0m5CwzAkvbSjqKairayEHdR5MMl7Cwa7Go= -github.com/libp2p/go-libp2p-interface-connmgr v0.0.1 h1:Q9EkNSLAOF+u90L88qmE9z/fTdjLh8OsJwGw74mkwk4= -github.com/libp2p/go-libp2p-interface-connmgr v0.0.1/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k= -github.com/libp2p/go-libp2p-interface-pnet v0.0.1 h1:7GnzRrBTJHEsofi1ahFdPN9Si6skwXQE9UqR2S+Pkh8= -github.com/libp2p/go-libp2p-interface-pnet v0.0.1/go.mod h1:el9jHpQAXK5dnTpKA4yfCNBZXvrzdOU75zz+C6ryp3k= -github.com/libp2p/go-libp2p-kad-dht v0.0.4/go.mod h1:oaBflOQcuC8H+SVV0YN26H6AS+wcUEJyjUGV66vXuSY= -github.com/libp2p/go-libp2p-kad-dht v0.0.7 h1:06CbmDaYeQ5Hj+s48WCeev7wJPx3VcpJNOe9NytSXOc= -github.com/libp2p/go-libp2p-kad-dht v0.0.7/go.mod h1:X90f4pG3MNZN9VeCX0rcH8AY9g3AspA2x5EJ9AvU/gM= -github.com/libp2p/go-libp2p-kbucket v0.0.1 h1:7H5hM851hkEpLOFjrVNSrrxo6J4bWrUQxxv+z1JW9xk= -github.com/libp2p/go-libp2p-kbucket v0.0.1/go.mod h1:Y0iQDHRTk/ZgM8PC4jExoF+E4j+yXWwRkdldkMa5Xm4= -github.com/libp2p/go-libp2p-kbucket v0.1.1 h1:ZrvW3qCM+lAuv7nrNts/zfEiClq+GZe8OIzX4Vb3Dwo= -github.com/libp2p/go-libp2p-kbucket v0.1.1/go.mod h1:Y0iQDHRTk/ZgM8PC4jExoF+E4j+yXWwRkdldkMa5Xm4= -github.com/libp2p/go-libp2p-loggables v0.0.1 h1:HVww9oAnINIxbt69LJNkxD8lnbfgteXR97Xm4p3l9ps= -github.com/libp2p/go-libp2p-loggables v0.0.1/go.mod h1:lDipDlBNYbpyqyPX/KcoO+eq0sJYEVR2JgOexcivchg= -github.com/libp2p/go-libp2p-metrics v0.0.1 h1:yumdPC/P2VzINdmcKZd0pciSUCpou+s0lwYCjBbzQZU= -github.com/libp2p/go-libp2p-metrics v0.0.1/go.mod h1:jQJ95SXXA/K1VZi13h52WZMa9ja78zjyy5rspMsC/08= -github.com/libp2p/go-libp2p-nat v0.0.1 h1:on/zju7XE+JXc8gH+vTKmIh2UJFC1K8kGnJYluQrlz4= -github.com/libp2p/go-libp2p-nat v0.0.1/go.mod h1:4L6ajyUIlJvx1Cbh5pc6Ma6vMDpKXf3GgLO5u7W0oQ4= -github.com/libp2p/go-libp2p-nat v0.0.2 h1:sKI5hiCsGFhuEKdXMsF9mywQu2qhfoIGX6a+VG6zelE= -github.com/libp2p/go-libp2p-nat v0.0.2/go.mod h1:QrjXQSD5Dj4IJOdEcjHRkWTSomyxRo6HnUkf/TfQpLQ= -github.com/libp2p/go-libp2p-nat v0.0.4 h1:+KXK324yaY701On8a0aGjTnw8467kW3ExKcqW2wwmyw= -github.com/libp2p/go-libp2p-nat v0.0.4/go.mod h1:N9Js/zVtAXqaeT99cXgTV9e75KpnWCvVOiGzlcHmBbY= -github.com/libp2p/go-libp2p-net v0.0.0-20190226201932-e71fff5ba6e9/go.mod h1:8W6Wx3AZbTRTe8zSMLoAmT3mGyau+w6kGIRk+Z+MZ7Q= -github.com/libp2p/go-libp2p-net v0.0.1 h1:xJ4Vh4yKF/XKb8fd1Ev0ebAGzVjMxXzrxG2kjtU+F5Q= -github.com/libp2p/go-libp2p-net v0.0.1/go.mod h1:Yt3zgmlsHOgUWSXmt5V/Jpz9upuJBE8EgNU9DrCcR8c= -github.com/libp2p/go-libp2p-net v0.0.2 h1:qP06u4TYXfl7uW/hzqPhlVVTSA2nw1B/bHBJaUnbh6M= -github.com/libp2p/go-libp2p-net v0.0.2/go.mod h1:Yt3zgmlsHOgUWSXmt5V/Jpz9upuJBE8EgNU9DrCcR8c= -github.com/libp2p/go-libp2p-netutil v0.0.1 h1:LgD6+skofkOx8z6odD9+MZHKjupv3ng1u6KRhaADTnA= -github.com/libp2p/go-libp2p-netutil v0.0.1/go.mod h1:GdusFvujWZI9Vt0X5BKqwWWmZFxecf9Gt03cKxm2f/Q= -github.com/libp2p/go-libp2p-peer v0.0.1 h1:0qwAOljzYewINrU+Kndoc+1jAL7vzY/oY2Go4DCGfyY= -github.com/libp2p/go-libp2p-peer v0.0.1/go.mod h1:nXQvOBbwVqoP+T5Y5nCjeH4sP9IX/J0AMzcDUVruVoo= -github.com/libp2p/go-libp2p-peerstore v0.0.0-20190226201924-e2df3e49eabf/go.mod h1:lLfgn0N3z2t+ER57a88K7NTZjMO27ez5TyWSURd428E= -github.com/libp2p/go-libp2p-peerstore v0.0.1 h1:twKovq8YK5trLrd3nB7PD2Zu9JcyAIdm7Bz9yBWjhq8= -github.com/libp2p/go-libp2p-peerstore v0.0.1/go.mod h1:RabLyPVJLuNQ+GFyoEkfi8H4Ti6k/HtZJ7YKgtSq+20= -github.com/libp2p/go-libp2p-peerstore v0.0.2 h1:Lirt3A1Oq11jszJ4SPNBo8chNv61UWXE538KUEGxTVk= -github.com/libp2p/go-libp2p-peerstore v0.0.2/go.mod h1:RabLyPVJLuNQ+GFyoEkfi8H4Ti6k/HtZJ7YKgtSq+20= -github.com/libp2p/go-libp2p-pnet v0.0.1 h1:2e5d15M8XplUKsU4Fqrll5eDfqGg/7mHUufLkhbfKHM= -github.com/libp2p/go-libp2p-pnet v0.0.1/go.mod h1:bWN8HqdpgCdKnXSCsJhbWjiU3UZFa/tIe4no5jCmHVw= -github.com/libp2p/go-libp2p-protocol v0.0.0-20171212212132-b29f3d97e3a2/go.mod h1:Af9n4PiruirSDjHycM1QuiMi/1VZNHYcK8cLgFJLZ4s= -github.com/libp2p/go-libp2p-protocol v0.0.1 h1:+zkEmZ2yFDi5adpVE3t9dqh/N9TbpFWywowzeEzBbLM= -github.com/libp2p/go-libp2p-protocol v0.0.1/go.mod h1:Af9n4PiruirSDjHycM1QuiMi/1VZNHYcK8cLgFJLZ4s= -github.com/libp2p/go-libp2p-pubsub v0.0.1 h1:iJWpvBDZiZOoRBGqEifu9yUHti9ptnSODHt6tgrBC6c= -github.com/libp2p/go-libp2p-pubsub v0.0.1/go.mod h1:fYKlZBOF2yrJzYlgeEVFSbYWfbS+E8Zix6gMZ0A6WgE= -github.com/libp2p/go-libp2p-pubsub-router v0.0.3 h1:2EF+8nueIsA9Unpj1MxdlS9+dX29kwCxSttchMMfXsI= -github.com/libp2p/go-libp2p-pubsub-router v0.0.3/go.mod h1:h5z0kyMFRu2J46tt15eEuLHKEmu1MrFghsGHqTc/iII= -github.com/libp2p/go-libp2p-quic-transport v0.0.0-20190301030811-862195d91de1/go.mod h1:bw/6H57fSVn44ldP1Js6hnzpoiUm9YgBDKSv+ch+hWc= -github.com/libp2p/go-libp2p-quic-transport v0.0.3 h1:FGEPXsjpY9K6P3iMtJQPKGl45eXickBY1+xSJ84lVVI= -github.com/libp2p/go-libp2p-quic-transport v0.0.3/go.mod h1:v2oVuaFLkxlFpkFbXUty3dfEYSlNb0sCzvf8cRi1m/k= -github.com/libp2p/go-libp2p-record v0.0.1 h1:zN7AS3X46qmwsw5JLxdDuI43cH5UYwovKxHPjKBYQxw= -github.com/libp2p/go-libp2p-record v0.0.1/go.mod h1:grzqg263Rug/sRex85QrDOLntdFAymLDLm7lxMgU79Q= -github.com/libp2p/go-libp2p-routing v0.0.1 h1:hPMAWktf9rYi3ME4MG48qE7dq1ofJxiQbfdvpNntjhc= -github.com/libp2p/go-libp2p-routing v0.0.1/go.mod h1:N51q3yTr4Zdr7V8Jt2JIktVU+3xBBylx1MZeVA6t1Ys= -github.com/libp2p/go-libp2p-routing-helpers v0.0.2 h1:SLX7eDQE8Xo197NwNM/hM7WnH3w6fSGY9+G9HkiYwqQ= -github.com/libp2p/go-libp2p-routing-helpers v0.0.2/go.mod h1:zf1ook9HoOQpfnVXrF4gGorkPrGGf1g25vgH5+4SRNU= -github.com/libp2p/go-libp2p-secio v0.0.1 h1:CqE/RdsizOwItdgLe632iyft/w0tshDLmZGAiKDcUAI= -github.com/libp2p/go-libp2p-secio v0.0.1/go.mod h1:IdG6iQybdcYmbTzxp4J5dwtUEDTOvZrT0opIDVNPrJs= -github.com/libp2p/go-libp2p-swarm v0.0.1 h1:Vne+hjaDwXqzgNwQ2vb2YKbnbOTyXjtS47stT66Apc4= -github.com/libp2p/go-libp2p-swarm v0.0.1/go.mod h1:mh+KZxkbd3lQnveQ3j2q60BM1Cw2mX36XXQqwfPOShs= -github.com/libp2p/go-libp2p-swarm v0.0.2 h1:cpHHXTeU2IgUu8LPemF7vaLPGtVC6VxMoll2EwqlC+E= -github.com/libp2p/go-libp2p-swarm v0.0.2/go.mod h1:n0cAAcKyndIrJWctQwjqXlAdIPBZzfdpBjx1SSvz30g= -github.com/libp2p/go-libp2p-transport v0.0.0-20190226201958-e8580c8a519d/go.mod h1:lcwgOszllbhvQXul37Kv5YbSYXPoUhRB2Z+Nr3jaBmo= -github.com/libp2p/go-libp2p-transport v0.0.1/go.mod h1:UzbUs9X+PHOSw7S3ZmeOxfnwaQY5vGDzZmKPod3N3tk= -github.com/libp2p/go-libp2p-transport v0.0.4 h1:/CPHQMN75/IQwkhBxxIo6p6PtL3rwFZtlzBROT3e8mw= -github.com/libp2p/go-libp2p-transport v0.0.4/go.mod h1:StoY3sx6IqsP6XKoabsPnHCwqKXWUMWU7Rfcsubee/A= -github.com/libp2p/go-libp2p-transport-upgrader v0.0.1 h1:rNtXkY6dty46mxYOHHAZQchI7gQdJStF683FhVnei/k= -github.com/libp2p/go-libp2p-transport-upgrader v0.0.1/go.mod h1:NJpUAgQab/8K6K0m+JmZCe5RUXG10UMEx4kWe9Ipj5c= -github.com/libp2p/go-maddr-filter v0.0.1 h1:apvYTg0aIxxQyBX+XHKOR+0+lYhGs1Yv+JmTH9nyl5I= -github.com/libp2p/go-maddr-filter v0.0.1/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= -github.com/libp2p/go-mplex v0.0.1 h1:dn2XGSrUxLtz3/8u85bGrwhUEKPX8MOF3lpmcWBZCWc= -github.com/libp2p/go-mplex v0.0.1/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0= -github.com/libp2p/go-msgio v0.0.1 h1:znj97n5FtXGCLDwe9x8jpHmY770SW4WStBGcCDh6GJw= -github.com/libp2p/go-msgio v0.0.1/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= -github.com/libp2p/go-nat v0.0.3 h1:l6fKV+p0Xa354EqQOQP+d8CivdLM4kl5GxC1hSc/UeI= -github.com/libp2p/go-nat v0.0.3/go.mod h1:88nUEt0k0JD45Bk93NIwDqjlhiOwOoV36GchpcVc1yI= -github.com/libp2p/go-reuseport v0.0.1 h1:7PhkfH73VXfPJYKQ6JwS5I/eVcoyYi9IMNGc6FWpFLw= -github.com/libp2p/go-reuseport v0.0.1/go.mod h1:jn6RmB1ufnQwl0Q1f+YxAj8isJgDCQzaaxIFYDhcYEA= -github.com/libp2p/go-reuseport-transport v0.0.1 h1:UIRneNxLDmEGNjGHpIiWzSWkZ5bhxMCP9x3Vh7BSc7E= -github.com/libp2p/go-reuseport-transport v0.0.1/go.mod h1:YkbSDrvjUVDL6b8XqriyA20obEtsW9BLkuOUyQAOCbs= -github.com/libp2p/go-reuseport-transport v0.0.2 h1:WglMwyXyBu61CMkjCCtnmqNqnjib0GIEjMiHTwR/KN4= -github.com/libp2p/go-reuseport-transport v0.0.2/go.mod h1:YkbSDrvjUVDL6b8XqriyA20obEtsW9BLkuOUyQAOCbs= -github.com/libp2p/go-stream-muxer v0.0.0-20190218175335-a3f82916c8ad/go.mod h1:bAo8x7YkSpadMTbtTaxGVHWUQsR/l5MEaHbKaliuT14= -github.com/libp2p/go-stream-muxer v0.0.1 h1:Ce6e2Pyu+b5MC1k3eeFtAax0pW4gc6MosYSLV05UeLw= -github.com/libp2p/go-stream-muxer v0.0.1/go.mod h1:bAo8x7YkSpadMTbtTaxGVHWUQsR/l5MEaHbKaliuT14= -github.com/libp2p/go-tcp-transport v0.0.1 h1:WyvJVw2lYAnr6CU+GZZ4oCt06fvORlmvBlFX2+ZpZDM= -github.com/libp2p/go-tcp-transport v0.0.1/go.mod h1:mnjg0o0O5TmXUaUIanYPUqkW4+u6mK0en8rlpA6BBTs= -github.com/libp2p/go-tcp-transport v0.0.2 h1:EzOSRaHpyrGpJ5qe+9SaxJM1mrWlkSLFfNTufUkq0lg= -github.com/libp2p/go-tcp-transport v0.0.2/go.mod h1:VjZFHasNJ0QiJQNNwiFDy25qyGWTXQWs8GM5DR4/L1k= -github.com/libp2p/go-testutil v0.0.1 h1:Xg+O0G2HIMfHqBOBDcMS1iSZJ3GEcId4qOxCQvsGZHk= -github.com/libp2p/go-testutil v0.0.1/go.mod h1:iAcJc/DKJQanJ5ws2V+u5ywdL2n12X1WbbEG+Jjy69I= -github.com/libp2p/go-ws-transport v0.0.1 h1:9ytMqq86Xvp8rcnC/1ZNuH612eXLDglvcu4ZHseJl8s= -github.com/libp2p/go-ws-transport v0.0.1/go.mod h1:p3bKjDWHEgtuKKj+2OdPYs5dAPIjtpQGHF2tJfGz7Ww= -github.com/libp2p/go-ws-transport v0.0.2 h1:PtK1AoM16nm96FwPBQoq+4T4t9LdDwOhkB+mdXuGSlg= -github.com/libp2p/go-ws-transport v0.0.2/go.mod h1:p3bKjDWHEgtuKKj+2OdPYs5dAPIjtpQGHF2tJfGz7Ww= -github.com/lucas-clemente/aes12 v0.0.0-20171027163421-cd47fb39b79f h1:sSeNEkJrs+0F9TUau0CgWTTNEwF23HST3Eq0A+QIx+A= -github.com/lucas-clemente/aes12 v0.0.0-20171027163421-cd47fb39b79f/go.mod h1:JpH9J1c9oX6otFSgdUHwUBUizmKlrMjxWnIAjff4m04= -github.com/lucas-clemente/quic-go v0.10.0 h1:xEF+pSHYAOcu+U10Meunf+DTtc8vhQDRqlA0BJ6hufc= -github.com/lucas-clemente/quic-go v0.10.0/go.mod h1:wuD+2XqEx8G9jtwx5ou2BEYBsE+whgQmlj0Vz/77PrY= -github.com/lucas-clemente/quic-go v0.11.1 h1:zasajC848Dqq/+WqfqBCkmPw+YHNe1MBts/z7y7nXf4= -github.com/lucas-clemente/quic-go v0.11.1/go.mod h1:PpMmPfPKO9nKJ/psF49ESTAGQSdfXxlg1otPbEB2nOw= -github.com/lucas-clemente/quic-go-certificates v0.0.0-20160823095156-d2f86524cced h1:zqEC1GJZFbGZA0tRyNZqRjep92K5fujFtFsu5ZW7Aug= -github.com/lucas-clemente/quic-go-certificates v0.0.0-20160823095156-d2f86524cced/go.mod h1:NCcRLrOTZbzhZvixZLlERbJtDtYsmMw8Jc4vS8Z0g58= -github.com/marten-seemann/qtls v0.2.3 h1:0yWJ43C62LsZt08vuQJDK1uC1czUc3FJeCLPoNAI4vA= -github.com/marten-seemann/qtls v0.2.3/go.mod h1:xzjG7avBwGGbdZ8dTGxlBnLArsVKLvwmjgmPuiQEcYk= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.1 h1:G1f5SKeVxmagw/IyvzvtZE4Gybcc4Tr1tf7I8z0XgOg= -github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.5 h1:tHXDdz1cpzGaovsTB+TVB8q90WEokoVmfMqoVcrLUgw= -github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -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 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b h1:j7+1HpAFS1zy5+Q4qx1fWh90gTKwiN4QCGoY9TWyyO4= -github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= -github.com/miekg/dns v1.1.4 h1:rCMZsU2ScVSYcAsOXgmC6+AKOK+6pmQTOcw03nfwYV0= -github.com/miekg/dns v1.1.4/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0OXOcUbGjvZxxijuBwbbmlSxLiuofa+g= -github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= -github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16 h1:5W7KhL8HVF3XCFOweFD3BNESdnO8ewyYTFT2R+/b8FQ= -github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= -github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mr-tron/base58 v1.1.0 h1:Y51FGVJ91WBqCEabAi5OPUz38eAx8DakuAm5svLcsfQ= -github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= -github.com/multiformats/go-base32 v0.0.3 h1:tw5+NhuwaOjJCC5Pp82QuXbrmLzWg7uxlMFp8Nq/kkI= -github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= -github.com/multiformats/go-multiaddr v0.0.1 h1:/QUV3VBMDI6pi6xfiw7lr6xhDWWvQKn9udPn68kLSdY= -github.com/multiformats/go-multiaddr v0.0.1/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= -github.com/multiformats/go-multiaddr-dns v0.0.1/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= -github.com/multiformats/go-multiaddr-dns v0.0.2 h1:/Bbsgsy3R6e3jf2qBahzNHzww6usYaZ0NhNH3sqdFS8= -github.com/multiformats/go-multiaddr-dns v0.0.2/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= -github.com/multiformats/go-multiaddr-net v0.0.1 h1:76O59E3FavvHqNg7jvzWzsPSW5JSi/ek0E4eiDVbg9g= -github.com/multiformats/go-multiaddr-net v0.0.1/go.mod h1:nw6HSxNmCIQH27XPGBuX+d1tnvM7ihcFwHMSstNAVUU= -github.com/multiformats/go-multibase v0.0.1 h1:PN9/v21eLywrFWdFNsFKaU04kLJzuYzmrJR+ubhT9qA= -github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs= -github.com/multiformats/go-multicodec v0.1.6 h1:4u6lcjbE4VVVoigU4QJSSVYsGVP4j2jtDkR8lPwOrLE= -github.com/multiformats/go-multicodec v0.1.6/go.mod h1:lliaRHbcG8q33yf4Ot9BGD7JqR/Za9HE7HTyVyKwrUQ= -github.com/multiformats/go-multihash v0.0.1 h1:HHwN1K12I+XllBCrqKnhX949Orn4oawPkegHMu2vDqQ= -github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= -github.com/multiformats/go-multistream v0.0.1 h1:JV4VfSdY9n7ECTtY59/TlSyFCzRILvYx4T4Ws8ZgihU= -github.com/multiformats/go-multistream v0.0.1/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= -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.0.2 h1:3jA2P6O1F9UOrWVpwrIo17pu01KWvNWg4X946/Y5Zwg= -github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -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/polydawn/refmt v0.0.0-20190221155625-df39d6c2d992 h1:bzMe+2coZJYHnhGgVlcQKuRy4FSny4ds8dLQjw5P1XE= -github.com/polydawn/refmt v0.0.0-20190221155625-df39d6c2d992/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= -github.com/prometheus/client_golang v0.9.2 h1:awm861/B8OKDd2I/6o1dy3ra4BamzKhYOiGItCeZ740= -github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910 h1:idejC8f05m9MGOsuEi1ATq9shN03HrxNkD/luQvxCv8= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/common v0.0.0-20181126121408-4724e9255275 h1:PnBWHBf+6L0jOqq0gIVUe6Yk0/QMZ640k6NvkxcBf+8= -github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a h1:9a8MnZMP0X2nLJdBg+pBmGgkJlSaKC2KaQmTCk1XDtE= -github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/rs/cors v1.6.0 h1:G9tHG9lebljV9mfp9SNPDL36nCDxmo3zTlAf1YgvzmI= -github.com/rs/cors v1.6.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= -github.com/sirupsen/logrus v1.0.5 h1:8c8b5uO0zS4X6RPl/sd1ENwSkIc0/H2PaHxE3udaE8I= -github.com/sirupsen/logrus v1.0.5/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v0.0.0-20190222223459-a17d461953aa h1:E+gaaifzi2xF65PbDmuKI3PhLWY6G5opMLniFq8vmXA= -github.com/smartystreets/goconvey v0.0.0-20190222223459-a17d461953aa/go.mod h1:2RVY1rIf+2J2o/IM9+vPq9RzmHDSseB7FoXiSNIUsoU= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72 h1:qLC7fQah7D6K1B0ujays3HV9gkFtllcxhzImRR7ArPQ= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/pflag v1.0.1 h1:aCvUg6QPl3ibpQUxyLkrEkCHtPqYJL4x9AuhqVqFis4= -github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/syndtr/goleveldb v1.0.0 h1:fBdIW9lB4Iz0n9khmH8w27SJ3QEJ7+IgjPEwGSZiFdE= -github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= -github.com/texttheater/golang-levenshtein v0.0.0-20180516184445-d188e65d659e h1:T5PdfK/M1xyrHwynxMIVMWLS7f/qHwfslZphxtGnw7s= -github.com/texttheater/golang-levenshtein v0.0.0-20180516184445-d188e65d659e/go.mod h1:XDKHRm5ThF8YJjx001LtgelzsoaEcvnA7lVWz9EeX3g= -github.com/urfave/cli v1.20.0 h1:fDqGv3UG/4jbVl/QkFwEdddtEDjh/5Ov6X+0B/3bPaw= -github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= -github.com/warpfork/go-wish v0.0.0-20180510122957-5ad1f5abf436 h1:qOpVTI+BrstcjTZLm2Yz/3sOnqkzj3FQoh0g+E5s3Gc= -github.com/warpfork/go-wish v0.0.0-20180510122957-5ad1f5abf436/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= -github.com/whyrusleeping/base32 v0.0.0-20170828182744-c30ac30633cc h1:BCPnHtcboadS0DvysUuJXZ4lWVv5Bh5i7+tbIyi+ck4= -github.com/whyrusleeping/base32 v0.0.0-20170828182744-c30ac30633cc/go.mod h1:r45hJU7yEoA81k6MWNhpMj/kms0n14dkzkxYHoB96UM= -github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11 h1:5HZfQkwe0mIfyDmc1Em5GqlNRzcdtlv4HTNmdpt7XH0= -github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11/go.mod h1:Wlo/SzPmxVp6vXpGt/zaXhHH0fn4IxgqZc82aKg6bpQ= -github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f h1:jQa4QT2UP9WYv2nzyawpKMOCl+Z/jW7djv2/J50lj9E= -github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f/go.mod h1:p9UJB6dDgdPgMJZs7UjUOdulKyRr9fqkS+6JKAInPy8= -github.com/whyrusleeping/go-ctrlnet v0.0.0-20180313164037-f564fbbdaa95/go.mod h1:SJqKCCPXRfBFCwXjfNT/skfsceF7+MBFLI2OrvuRA7g= -github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1 h1:EKhdznlJHPMoKr0XTrX+IlJs1LH3lyx2nfr1dOlZ79k= -github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1/go.mod h1:8UvriyWtv5Q5EOgjHaSseUEdkQfvwFv1I/In/O2M9gc= -github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc h1:9lDbC6Rz4bwmou+oE6Dt4Cb2BGMur5eR/GYptkKUVHo= -github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc/go.mod h1:bopw91TMyo8J3tvftk8xmU2kPmlrt4nScJQZU2hE5EM= -github.com/whyrusleeping/go-notifier v0.0.0-20170827234753-097c5d47330f h1:M/lL30eFZTKnomXY6huvM6G0+gVquFNf6mxghaWlFUg= -github.com/whyrusleeping/go-notifier v0.0.0-20170827234753-097c5d47330f/go.mod h1:cZNvX9cFybI01GriPRMXDtczuvUhgbcYr9iCGaNlRv8= -github.com/whyrusleeping/go-smux-multiplex v3.0.16+incompatible h1:iqksILj8STw03EJQe7Laj4ubnw+ojOyik18cd5vPL1o= -github.com/whyrusleeping/go-smux-multiplex v3.0.16+incompatible/go.mod h1:34LEDbeKFZInPUrAG+bjuJmUXONGdEFW7XL0SpTY1y4= -github.com/whyrusleeping/go-smux-multistream v2.0.2+incompatible h1:BdYHctE9HJZLquG9tpTdwWcbG4FaX6tVKPGjCGgiVxo= -github.com/whyrusleeping/go-smux-multistream v2.0.2+incompatible/go.mod h1:dRWHHvc4HDQSHh9gbKEBbUZ+f2Q8iZTPG3UOGYODxSQ= -github.com/whyrusleeping/go-smux-yamux v2.0.8+incompatible h1:IGm/UP/JpEFS6D787sZnZg7RA6fZIR9c/Ms9DeAVNuk= -github.com/whyrusleeping/go-smux-yamux v2.0.8+incompatible/go.mod h1:6qHUzBXUbB9MXmw3AUdB52L8sEb/hScCqOdW2kj/wuI= -github.com/whyrusleeping/go-smux-yamux v2.0.9+incompatible h1:nVkExQ7pYlN9e45LcqTCOiDD0904fjtm0flnHZGbXkw= -github.com/whyrusleeping/go-smux-yamux v2.0.9+incompatible/go.mod h1:6qHUzBXUbB9MXmw3AUdB52L8sEb/hScCqOdW2kj/wuI= -github.com/whyrusleeping/go-sysinfo v0.0.0-20190219211824-4a357d4b90b1 h1:ctS9Anw/KozviCCtK6VWMz5kPL9nbQzbQY4yfqlIV4M= -github.com/whyrusleeping/go-sysinfo v0.0.0-20190219211824-4a357d4b90b1/go.mod h1:tKH72zYNt/exx6/5IQO6L9LoQ0rEjd5SbbWaDTs9Zso= -github.com/whyrusleeping/mafmt v1.2.8 h1:TCghSl5kkwEE0j+sU/gudyhVMRlpBin8fMBBHg59EbA= -github.com/whyrusleeping/mafmt v1.2.8/go.mod h1:faQJFPbLSxzD9xpA02ttW/tS9vZykNvXwGvqIpk20FA= -github.com/whyrusleeping/mdns v0.0.0-20180901202407-ef14215e6b30 h1:nMCC9Pwz1pxfC1Y6mYncdk+kq8d5aLx0Q+/gyZGE44M= -github.com/whyrusleeping/mdns v0.0.0-20180901202407-ef14215e6b30/go.mod h1:j4l84WPFclQPj320J9gp0XwNKBb3U0zt5CBqjPp22G4= -github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7 h1:E9S12nwJwEOXe2d6gT6qxdvqMnNq+VnSsKPgm2ZZNds= -github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7/go.mod h1:X2c0RVCI1eSUFI8eLcY3c0423ykwiUdxLJtkDvruhjI= -github.com/whyrusleeping/tar-utils v0.0.0-20180509141711-8c6c8ba81d5c h1:GGsyl0dZ2jJgVT+VvWBf/cNijrHRhkrTjkmp5wg7li0= -github.com/whyrusleeping/tar-utils v0.0.0-20180509141711-8c6c8ba81d5c/go.mod h1:xxcJeBb7SIUl/Wzkz1eVKJE/CB34YNrqX2TQI6jY9zs= -github.com/whyrusleeping/timecache v0.0.0-20160911033111-cfcb2f1abfee h1:lYbXeSvJi5zk5GLKVuid9TVjS9a0OmLIDKTfoZBL6Ow= -github.com/whyrusleeping/timecache v0.0.0-20160911033111-cfcb2f1abfee/go.mod h1:m2aV4LZI4Aez7dP5PMyVKEHhUyEJ/RjmPEDOpDvudHg= -github.com/whyrusleeping/yamux v1.1.5 h1:4CK3aUUJQu0qpKZv5gEWJjNOQtdbdDhVVS6PJ+HimdE= -github.com/whyrusleeping/yamux v1.1.5/go.mod h1:E8LnQQ8HKx5KD29HZFUwM1PxCOdPRzGwur1mcYhXcD8= -go4.org v0.0.0-20190218023631-ce4c26f7be8e h1:m9LfARr2VIOW0vsV19kEKp/sWQvZnGobA8JHui/XJoY= -go4.org v0.0.0-20190218023631-ce4c26f7be8e/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= -golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20180426230345-b49d69b5da94/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25 h1:jsG6UpNLt9iAsb0S2AGW28DveNzzgmbXR+ENoPjUeIU= -golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/net v0.0.0-20180524181706-dfa909b99c79/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181102091132-c10e9556a7bc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190227160552-c95aed5357e7 h1:C2F/nMkR/9sfUTpvR3QrjBuTdvMUC/cFajkphs1YLQo= -golang.org/x/net v0.0.0-20190227160552-c95aed5357e7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -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-20180427151831-cbbc999da32d/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/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-20190219092855-153ac476189d/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190228124157-a34e9553db1e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190302025703-b6889370fb10 h1:xQJI9OEiErEQ++DoXOHqEpzsGMrAv2Q2jyCpi7DmfpQ= -golang.org/x/sys v0.0.0-20190302025703-b6889370fb10/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/tools v0.0.0-20180221164845-07fd8470d635 h1:2eB4G6bDQDeP69ZXbOKC00S2Kf6TIiRS+DzfKsKeQU0= -golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e h1:FDhOuMEY4JVRztM/gsbk+IKUQ8kj74bxZrgw87eMMVc= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/xerrors v0.0.0-20190212162355-a5947ffaace3 h1:P6iTFmrTQqWrqLZPX1VMzCUbCRCAUXSUsSpkEOvWzJ0= -golang.org/x/xerrors v0.0.0-20190212162355-a5947ffaace3/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -gopkg.in/airbrake/gobrake.v2 v2.0.9 h1:7z2uVWwn7oVeeugY1DtlPAy5H+KYgB1KeKTnqjNatLo= -gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= -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/cheggaaa/pb.v1 v1.0.28 h1:n1tBJnnK2r7g9OW2btFH91V92STTUevLXYFb8gy9EMk= -gopkg.in/cheggaaa/pb.v1 v1.0.28/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= -gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2 h1:OAj3g0cR6Dx/R07QgQe8wkA9RNjB2u4i700xBkIT4e0= -gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= -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/yaml.v2 v2.2.1 h1:mUhvW9EsL+naU5Q3cakzfE91YhliOondGd6ZrsDBHQE= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gotest.tools v2.1.0+incompatible h1:5USw7CrJBYKqjg9R7QlA6jzqZKEAtvW82aNmsxxGPxw= -gotest.tools v2.1.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= -gotest.tools/gotestsum v0.3.3 h1:IsPJwo4jMjWDWcABLiJJO/g8R6jHTS6NaDYnuiOi+0k= -gotest.tools/gotestsum v0.3.3/go.mod h1:0qrQpYrdmNTIx/xcxDS62tIo5eLVdVd2ALLCk1ST0BU= diff --git a/vendor/github.com/ipfs/go-ipfs/keystore/keystore.go b/vendor/github.com/ipfs/go-ipfs/keystore/keystore.go index d9467f26..237d4b05 100644 --- a/vendor/github.com/ipfs/go-ipfs/keystore/keystore.go +++ b/vendor/github.com/ipfs/go-ipfs/keystore/keystore.go @@ -8,7 +8,7 @@ import ( "strings" logging "github.com/ipfs/go-log" - ci "github.com/libp2p/go-libp2p-crypto" + ci "github.com/libp2p/go-libp2p-core/crypto" ) var log = logging.Logger("keystore") diff --git a/vendor/github.com/ipfs/go-ipfs/keystore/memkeystore.go b/vendor/github.com/ipfs/go-ipfs/keystore/memkeystore.go index 4f505a99..4067bbce 100644 --- a/vendor/github.com/ipfs/go-ipfs/keystore/memkeystore.go +++ b/vendor/github.com/ipfs/go-ipfs/keystore/memkeystore.go @@ -1,6 +1,6 @@ package keystore -import ci "github.com/libp2p/go-libp2p-crypto" +import ci "github.com/libp2p/go-libp2p-core/crypto" // MemKeystore is an in memory keystore implementation that is not persisted to // any backing storage. diff --git a/vendor/github.com/ipfs/go-ipfs/namesys/interface.go b/vendor/github.com/ipfs/go-ipfs/namesys/interface.go index 4db95ab3..ecd80943 100644 --- a/vendor/github.com/ipfs/go-ipfs/namesys/interface.go +++ b/vendor/github.com/ipfs/go-ipfs/namesys/interface.go @@ -37,7 +37,7 @@ import ( path "github.com/ipfs/go-path" opts "github.com/ipfs/interface-go-ipfs-core/options/namesys" - ci "github.com/libp2p/go-libp2p-crypto" + ci "github.com/libp2p/go-libp2p-core/crypto" ) // ErrResolveFailed signals an error when attempting to resolve. diff --git a/vendor/github.com/ipfs/go-ipfs/namesys/namesys.go b/vendor/github.com/ipfs/go-ipfs/namesys/namesys.go index f8b8c6d1..6d59c62e 100644 --- a/vendor/github.com/ipfs/go-ipfs/namesys/namesys.go +++ b/vendor/github.com/ipfs/go-ipfs/namesys/namesys.go @@ -10,9 +10,9 @@ import ( path "github.com/ipfs/go-path" opts "github.com/ipfs/interface-go-ipfs-core/options/namesys" isd "github.com/jbenet/go-is-domain" - ci "github.com/libp2p/go-libp2p-crypto" - peer "github.com/libp2p/go-libp2p-peer" - routing "github.com/libp2p/go-libp2p-routing" + ci "github.com/libp2p/go-libp2p-core/crypto" + peer "github.com/libp2p/go-libp2p-core/peer" + routing "github.com/libp2p/go-libp2p-core/routing" mh "github.com/multiformats/go-multihash" ) diff --git a/vendor/github.com/ipfs/go-ipfs/namesys/publisher.go b/vendor/github.com/ipfs/go-ipfs/namesys/publisher.go index e43858d0..c06deb79 100644 --- a/vendor/github.com/ipfs/go-ipfs/namesys/publisher.go +++ b/vendor/github.com/ipfs/go-ipfs/namesys/publisher.go @@ -15,9 +15,9 @@ import ( pb "github.com/ipfs/go-ipns/pb" path "github.com/ipfs/go-path" ft "github.com/ipfs/go-unixfs" - ci "github.com/libp2p/go-libp2p-crypto" - peer "github.com/libp2p/go-libp2p-peer" - routing "github.com/libp2p/go-libp2p-routing" + ci "github.com/libp2p/go-libp2p-core/crypto" + peer "github.com/libp2p/go-libp2p-core/peer" + routing "github.com/libp2p/go-libp2p-core/routing" base32 "github.com/whyrusleeping/base32" ) diff --git a/vendor/github.com/ipfs/go-ipfs/namesys/republisher/repub.go b/vendor/github.com/ipfs/go-ipfs/namesys/republisher/repub.go index 1092ba3a..9e7272d3 100644 --- a/vendor/github.com/ipfs/go-ipfs/namesys/republisher/repub.go +++ b/vendor/github.com/ipfs/go-ipfs/namesys/republisher/repub.go @@ -15,8 +15,8 @@ import ( logging "github.com/ipfs/go-log" goprocess "github.com/jbenet/goprocess" gpctx "github.com/jbenet/goprocess/context" - ic "github.com/libp2p/go-libp2p-crypto" - peer "github.com/libp2p/go-libp2p-peer" + ic "github.com/libp2p/go-libp2p-core/crypto" + peer "github.com/libp2p/go-libp2p-core/peer" ) var errNoEntry = errors.New("no previous entry") diff --git a/vendor/github.com/ipfs/go-ipfs/namesys/routing.go b/vendor/github.com/ipfs/go-ipfs/namesys/routing.go index e89dd9c9..94c12a72 100644 --- a/vendor/github.com/ipfs/go-ipfs/namesys/routing.go +++ b/vendor/github.com/ipfs/go-ipfs/namesys/routing.go @@ -12,9 +12,9 @@ import ( logging "github.com/ipfs/go-log" path "github.com/ipfs/go-path" opts "github.com/ipfs/interface-go-ipfs-core/options/namesys" + peer "github.com/libp2p/go-libp2p-core/peer" + routing "github.com/libp2p/go-libp2p-core/routing" dht "github.com/libp2p/go-libp2p-kad-dht" - peer "github.com/libp2p/go-libp2p-peer" - routing "github.com/libp2p/go-libp2p-routing" mh "github.com/multiformats/go-multihash" ) diff --git a/vendor/github.com/ipfs/go-ipfs/p2p/listener.go b/vendor/github.com/ipfs/go-ipfs/p2p/listener.go index ff7859b0..65fe87c2 100644 --- a/vendor/github.com/ipfs/go-ipfs/p2p/listener.go +++ b/vendor/github.com/ipfs/go-ipfs/p2p/listener.go @@ -4,9 +4,9 @@ import ( "errors" "sync" - p2phost "github.com/libp2p/go-libp2p-host" - net "github.com/libp2p/go-libp2p-net" - "github.com/libp2p/go-libp2p-protocol" + p2phost "github.com/libp2p/go-libp2p-core/host" + net "github.com/libp2p/go-libp2p-core/network" + "github.com/libp2p/go-libp2p-core/protocol" ma "github.com/multiformats/go-multiaddr" ) diff --git a/vendor/github.com/ipfs/go-ipfs/p2p/local.go b/vendor/github.com/ipfs/go-ipfs/p2p/local.go index b96afa91..bff25e20 100644 --- a/vendor/github.com/ipfs/go-ipfs/p2p/local.go +++ b/vendor/github.com/ipfs/go-ipfs/p2p/local.go @@ -5,9 +5,9 @@ import ( "time" tec "github.com/jbenet/go-temp-err-catcher" - "github.com/libp2p/go-libp2p-net" - "github.com/libp2p/go-libp2p-peer" - "github.com/libp2p/go-libp2p-protocol" + net "github.com/libp2p/go-libp2p-core/network" + "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p-core/protocol" ma "github.com/multiformats/go-multiaddr" "github.com/multiformats/go-multiaddr-net" ) diff --git a/vendor/github.com/ipfs/go-ipfs/p2p/p2p.go b/vendor/github.com/ipfs/go-ipfs/p2p/p2p.go index 07f772b2..078ba51c 100644 --- a/vendor/github.com/ipfs/go-ipfs/p2p/p2p.go +++ b/vendor/github.com/ipfs/go-ipfs/p2p/p2p.go @@ -2,9 +2,9 @@ package p2p import ( logging "github.com/ipfs/go-log" - p2phost "github.com/libp2p/go-libp2p-host" - peer "github.com/libp2p/go-libp2p-peer" - pstore "github.com/libp2p/go-libp2p-peerstore" + p2phost "github.com/libp2p/go-libp2p-core/host" + peer "github.com/libp2p/go-libp2p-core/peer" + pstore "github.com/libp2p/go-libp2p-core/peerstore" ) var log = logging.Logger("p2p-mount") @@ -20,8 +20,8 @@ type P2P struct { peerstore pstore.Peerstore } -// NewP2P creates new P2P struct -func NewP2P(identity peer.ID, peerHost p2phost.Host, peerstore pstore.Peerstore) *P2P { +// New creates new P2P struct +func New(identity peer.ID, peerHost p2phost.Host, peerstore pstore.Peerstore) *P2P { return &P2P{ identity: identity, peerHost: peerHost, diff --git a/vendor/github.com/ipfs/go-ipfs/p2p/remote.go b/vendor/github.com/ipfs/go-ipfs/p2p/remote.go index f6b95682..a89b2f2f 100644 --- a/vendor/github.com/ipfs/go-ipfs/p2p/remote.go +++ b/vendor/github.com/ipfs/go-ipfs/p2p/remote.go @@ -4,8 +4,8 @@ import ( "context" "fmt" - net "github.com/libp2p/go-libp2p-net" - protocol "github.com/libp2p/go-libp2p-protocol" + net "github.com/libp2p/go-libp2p-core/network" + protocol "github.com/libp2p/go-libp2p-core/protocol" ma "github.com/multiformats/go-multiaddr" manet "github.com/multiformats/go-multiaddr-net" ) diff --git a/vendor/github.com/ipfs/go-ipfs/p2p/stream.go b/vendor/github.com/ipfs/go-ipfs/p2p/stream.go index e29c965b..137f14c1 100644 --- a/vendor/github.com/ipfs/go-ipfs/p2p/stream.go +++ b/vendor/github.com/ipfs/go-ipfs/p2p/stream.go @@ -4,10 +4,10 @@ import ( "io" "sync" - ifconnmgr "github.com/libp2p/go-libp2p-interface-connmgr" - net "github.com/libp2p/go-libp2p-net" - peer "github.com/libp2p/go-libp2p-peer" - protocol "github.com/libp2p/go-libp2p-protocol" + ifconnmgr "github.com/libp2p/go-libp2p-core/connmgr" + net "github.com/libp2p/go-libp2p-core/network" + peer "github.com/libp2p/go-libp2p-core/peer" + protocol "github.com/libp2p/go-libp2p-core/protocol" ma "github.com/multiformats/go-multiaddr" manet "github.com/multiformats/go-multiaddr-net" ) diff --git a/vendor/github.com/ipfs/go-ipfs/package-list.json b/vendor/github.com/ipfs/go-ipfs/package-list.json index 62ce82f5..5551193d 100644 --- a/vendor/github.com/ipfs/go-ipfs/package-list.json +++ b/vendor/github.com/ipfs/go-ipfs/package-list.json @@ -40,7 +40,6 @@ "Commands", ["ipfs/go-ipfs-cmds", "go-ipfs-cmds", "CLI & HTTP commands library"], - ["ipfs/go-ipfs-cmdkit", "go-ipfs-cmdkit", "helper types for the commands library"], ["ipfs/go-ipfs-api", "go-ipfs-api", "a shell for the IPFS HTTP API"], "Metrics & Logging", diff --git a/vendor/github.com/ipfs/go-ipfs/pin/pin.go b/vendor/github.com/ipfs/go-ipfs/pin/pin.go index 24dbf465..48a16f84 100644 --- a/vendor/github.com/ipfs/go-ipfs/pin/pin.go +++ b/vendor/github.com/ipfs/go-ipfs/pin/pin.go @@ -263,32 +263,24 @@ func (p *pinner) Pin(ctx context.Context, node ipld.Node, recurse bool) error { } // ErrNotPinned is returned when trying to unpin items which are not pinned. -var ErrNotPinned = fmt.Errorf("not pinned") +var ErrNotPinned = fmt.Errorf("not pinned or pinned indirectly") // Unpin a given key func (p *pinner) Unpin(ctx context.Context, c cid.Cid, recursive bool) error { p.lock.Lock() defer p.lock.Unlock() - reason, pinned, err := p.isPinnedWithType(c, Any) - if err != nil { - return err - } - if !pinned { - return ErrNotPinned - } - switch reason { - case "recursive": - if recursive { - p.recursePin.Remove(c) - return nil + if p.recursePin.Has(c) { + if !recursive { + return fmt.Errorf("%s is pinned recursively", c) } - return fmt.Errorf("%s is pinned recursively", c) - case "direct": + p.recursePin.Remove(c) + return nil + } + if p.directPin.Has(c) { p.directPin.Remove(c) return nil - default: - return fmt.Errorf("%s is pinned indirectly under %s", c, reason) } + return ErrNotPinned } func (p *pinner) isInternalPin(c cid.Cid) bool { @@ -506,11 +498,17 @@ func LoadPinner(d ds.Datastore, dserv, internal ipld.DAGService) (Pinner, error) // DirectKeys returns a slice containing the directly pinned keys func (p *pinner) DirectKeys() []cid.Cid { + p.lock.RLock() + defer p.lock.RUnlock() + return p.directPin.Keys() } // RecursiveKeys returns a slice containing the recursively pinned keys func (p *pinner) RecursiveKeys() []cid.Cid { + p.lock.RLock() + defer p.lock.RUnlock() + return p.recursePin.Keys() } diff --git a/vendor/github.com/ipfs/go-ipfs/provider/offline.go b/vendor/github.com/ipfs/go-ipfs/provider/offline.go index 0c91ed2a..5511364e 100644 --- a/vendor/github.com/ipfs/go-ipfs/provider/offline.go +++ b/vendor/github.com/ipfs/go-ipfs/provider/offline.go @@ -1,20 +1,28 @@ package provider -import "github.com/ipfs/go-cid" +import ( + "context" + "github.com/ipfs/go-cid" +) type offlineProvider struct{} -// NewOfflineProvider creates a Provider that does nothing -func NewOfflineProvider() Provider { +// NewOfflineProvider creates a ProviderSystem that does nothing +func NewOfflineProvider() System { return &offlineProvider{} } -func (op *offlineProvider) Run() {} +func (op *offlineProvider) Run() { +} -func (op *offlineProvider) Provide(cid cid.Cid) error { +func (op *offlineProvider) Close() error { return nil } -func (op *offlineProvider) Close() error { +func (op *offlineProvider) Provide(cid.Cid) error { + return nil +} + +func (op *offlineProvider) Reprovide(context.Context) error { return nil } diff --git a/vendor/github.com/ipfs/go-ipfs/provider/provider.go b/vendor/github.com/ipfs/go-ipfs/provider/provider.go index 67c5c6b6..7dec4c17 100644 --- a/vendor/github.com/ipfs/go-ipfs/provider/provider.go +++ b/vendor/github.com/ipfs/go-ipfs/provider/provider.go @@ -1,19 +1,10 @@ -// Package provider implements structures and methods to provide blocks, -// keep track of which blocks are provided, and to allow those blocks to -// be reprovided. package provider import ( "context" "github.com/ipfs/go-cid" - logging "github.com/ipfs/go-log" - "github.com/libp2p/go-libp2p-routing" ) -var log = logging.Logger("provider") - -const provideOutgoingWorkerLimit = 8 - // Provider announces blocks to the network type Provider interface { // Run is used to begin processing the provider work @@ -24,56 +15,12 @@ type Provider interface { Close() error } -type provider struct { - ctx context.Context - // the CIDs for which provide announcements should be made - queue *Queue - // used to announce providing to the network - contentRouting routing.ContentRouting -} - -// NewProvider creates a provider that announces blocks to the network using a content router -func NewProvider(ctx context.Context, queue *Queue, contentRouting routing.ContentRouting) Provider { - return &provider{ - ctx: ctx, - queue: queue, - contentRouting: contentRouting, - } -} - -// Close stops the provider -func (p *provider) Close() error { - p.queue.Close() - return nil -} - -// Start workers to handle provide requests. -func (p *provider) Run() { - p.handleAnnouncements() -} - -// Provide the given cid using specified strategy. -func (p *provider) Provide(root cid.Cid) error { - p.queue.Enqueue(root) - return nil -} - -// Handle all outgoing cids by providing (announcing) them -func (p *provider) handleAnnouncements() { - for workers := 0; workers < provideOutgoingWorkerLimit; workers++ { - go func() { - for p.ctx.Err() == nil { - select { - case <-p.ctx.Done(): - return - case c := <-p.queue.Dequeue(): - log.Info("announce - start - ", c) - if err := p.contentRouting.Provide(p.ctx, c, true); err != nil { - log.Warningf("Unable to provide entry: %s, %s", c, err) - } - log.Info("announce - end - ", c) - } - } - }() - } +// Reprovider reannounces blocks to the network +type Reprovider interface { + // Run is used to begin processing the reprovider work and waiting for reprovide triggers + Run() + // Trigger a reprovide + Trigger(context.Context) error + // Close stops the reprovider + Close() error } diff --git a/vendor/github.com/ipfs/go-ipfs/provider/queue.go b/vendor/github.com/ipfs/go-ipfs/provider/queue/queue.go similarity index 98% rename from vendor/github.com/ipfs/go-ipfs/provider/queue.go rename to vendor/github.com/ipfs/go-ipfs/provider/queue/queue.go index 8fdfca81..2afbc81e 100644 --- a/vendor/github.com/ipfs/go-ipfs/provider/queue.go +++ b/vendor/github.com/ipfs/go-ipfs/provider/queue/queue.go @@ -1,4 +1,4 @@ -package provider +package queue import ( "context" @@ -10,8 +10,11 @@ import ( datastore "github.com/ipfs/go-datastore" namespace "github.com/ipfs/go-datastore/namespace" query "github.com/ipfs/go-datastore/query" + logging "github.com/ipfs/go-log" ) +var log = logging.Logger("provider.queue") + // Queue provides a durable, FIFO interface to the datastore for storing cids // // Durability just means that cids in the process of being provided when a diff --git a/vendor/github.com/ipfs/go-ipfs/provider/simple/provider.go b/vendor/github.com/ipfs/go-ipfs/provider/simple/provider.go new file mode 100644 index 00000000..abe13ce5 --- /dev/null +++ b/vendor/github.com/ipfs/go-ipfs/provider/simple/provider.go @@ -0,0 +1,72 @@ +// Package simple implements structures and methods to provide blocks, +// keep track of which blocks are provided, and to allow those blocks to +// be reprovided. +package simple + +import ( + "context" + + cid "github.com/ipfs/go-cid" + q "github.com/ipfs/go-ipfs/provider/queue" + logging "github.com/ipfs/go-log" + routing "github.com/libp2p/go-libp2p-core/routing" +) + +var logP = logging.Logger("provider.simple") + +const provideOutgoingWorkerLimit = 8 + +// Provider announces blocks to the network +type Provider struct { + ctx context.Context + // the CIDs for which provide announcements should be made + queue *q.Queue + // used to announce providing to the network + contentRouting routing.ContentRouting +} + +// NewProvider creates a provider that announces blocks to the network using a content router +func NewProvider(ctx context.Context, queue *q.Queue, contentRouting routing.ContentRouting) *Provider { + return &Provider{ + ctx: ctx, + queue: queue, + contentRouting: contentRouting, + } +} + +// Close stops the provider +func (p *Provider) Close() error { + p.queue.Close() + return nil +} + +// Run workers to handle provide requests. +func (p *Provider) Run() { + p.handleAnnouncements() +} + +// Provide the given cid using specified strategy. +func (p *Provider) Provide(root cid.Cid) error { + p.queue.Enqueue(root) + return nil +} + +// Handle all outgoing cids by providing (announcing) them +func (p *Provider) handleAnnouncements() { + for workers := 0; workers < provideOutgoingWorkerLimit; workers++ { + go func() { + for p.ctx.Err() == nil { + select { + case <-p.ctx.Done(): + return + case c := <-p.queue.Dequeue(): + logP.Info("announce - start - ", c) + if err := p.contentRouting.Provide(p.ctx, c, true); err != nil { + logP.Warningf("Unable to provide entry: %s, %s", c, err) + } + logP.Info("announce - end - ", c) + } + } + }() + } +} diff --git a/vendor/github.com/ipfs/go-ipfs/exchange/reprovide/reprovide.go b/vendor/github.com/ipfs/go-ipfs/provider/simple/reprovide.go similarity index 52% rename from vendor/github.com/ipfs/go-ipfs/exchange/reprovide/reprovide.go rename to vendor/github.com/ipfs/go-ipfs/provider/simple/reprovide.go index 9c466651..ce5c7181 100644 --- a/vendor/github.com/ipfs/go-ipfs/exchange/reprovide/reprovide.go +++ b/vendor/github.com/ipfs/go-ipfs/provider/simple/reprovide.go @@ -1,4 +1,4 @@ -package reprovide +package simple import ( "context" @@ -7,17 +7,23 @@ import ( backoff "github.com/cenkalti/backoff" cid "github.com/ipfs/go-cid" + cidutil "github.com/ipfs/go-cidutil" + blocks "github.com/ipfs/go-ipfs-blockstore" + pin "github.com/ipfs/go-ipfs/pin" + ipld "github.com/ipfs/go-ipld-format" logging "github.com/ipfs/go-log" - "github.com/ipfs/go-verifcid" - routing "github.com/libp2p/go-libp2p-routing" + merkledag "github.com/ipfs/go-merkledag" + verifcid "github.com/ipfs/go-verifcid" + routing "github.com/libp2p/go-libp2p-core/routing" ) -var log = logging.Logger("reprovider") +var logR = logging.Logger("reprovider.simple") //KeyChanFunc is function streaming CIDs to pass to content routing type KeyChanFunc func(context.Context) (<-chan cid.Cid, error) type doneFunc func(error) +// Reprovider reannounces blocks to the network type Reprovider struct { ctx context.Context trigger chan doneFunc @@ -26,28 +32,36 @@ type Reprovider struct { rsys routing.ContentRouting keyProvider KeyChanFunc + + tick time.Duration } // NewReprovider creates new Reprovider instance. -func NewReprovider(ctx context.Context, rsys routing.ContentRouting, keyProvider KeyChanFunc) *Reprovider { +func NewReprovider(ctx context.Context, reprovideIniterval time.Duration, rsys routing.ContentRouting, keyProvider KeyChanFunc) *Reprovider { return &Reprovider{ ctx: ctx, trigger: make(chan doneFunc), rsys: rsys, keyProvider: keyProvider, + tick: reprovideIniterval, } } +// Close the reprovider +func (rp *Reprovider) Close() error { + return nil +} + // Run re-provides keys with 'tick' interval or when triggered -func (rp *Reprovider) Run(tick time.Duration) { +func (rp *Reprovider) Run() { // dont reprovide immediately. // may have just started the daemon and shutting it down immediately. // probability( up another minute | uptime ) increases with uptime. after := time.After(time.Minute) var done doneFunc for { - if tick == 0 { + if rp.tick == 0 { after = make(chan time.Time) } @@ -64,7 +78,7 @@ func (rp *Reprovider) Run(tick time.Duration) { err := rp.Reprovide() if err != nil { - log.Debug(err) + logR.Debug(err) } if done != nil { @@ -73,7 +87,7 @@ func (rp *Reprovider) Run(tick time.Duration) { unmute() - after = time.After(tick) + after = time.After(rp.tick) } } @@ -86,13 +100,13 @@ func (rp *Reprovider) Reprovide() error { for c := range keychan { // hash security if err := verifcid.ValidateCid(c); err != nil { - log.Errorf("insecure hash in reprovider, %s (%s)", c, err) + logR.Errorf("insecure hash in reprovider, %s (%s)", c, err) continue } op := func() error { err := rp.rsys.Provide(rp.ctx, c, true) if err != nil { - log.Debugf("Failed to provide key: %s", err) + logR.Debugf("Failed to provide key: %s", err) } return err } @@ -101,7 +115,7 @@ func (rp *Reprovider) Reprovide() error { // eventually work contexts into it. low priority. err := backoff.Retry(op, backoff.NewExponentialBackOff()) if err != nil { - log.Debugf("Providing failed after number of retries: %s", err) + logR.Debugf("Providing failed after number of retries: %s", err) return err } } @@ -145,3 +159,67 @@ func (rp *Reprovider) muteTrigger() context.CancelFunc { return cf } + +// Strategies + +// NewBlockstoreProvider returns key provider using bstore.AllKeysChan +func NewBlockstoreProvider(bstore blocks.Blockstore) KeyChanFunc { + return func(ctx context.Context) (<-chan cid.Cid, error) { + return bstore.AllKeysChan(ctx) + } +} + +// NewPinnedProvider returns provider supplying pinned keys +func NewPinnedProvider(onlyRoots bool) func(pin.Pinner, ipld.DAGService) KeyChanFunc { + return func(pinning pin.Pinner, dag ipld.DAGService) KeyChanFunc { + return func(ctx context.Context) (<-chan cid.Cid, error) { + set, err := pinSet(ctx, pinning, dag, onlyRoots) + if err != nil { + return nil, err + } + + outCh := make(chan cid.Cid) + go func() { + defer close(outCh) + for c := range set.New { + select { + case <-ctx.Done(): + return + case outCh <- c: + } + } + + }() + + return outCh, nil + } + } +} + +func pinSet(ctx context.Context, pinning pin.Pinner, dag ipld.DAGService, onlyRoots bool) (*cidutil.StreamingSet, error) { + set := cidutil.NewStreamingSet() + + go func() { + ctx, cancel := context.WithCancel(ctx) + defer cancel() + defer close(set.New) + + for _, key := range pinning.DirectKeys() { + set.Visitor(ctx)(key) + } + + for _, key := range pinning.RecursiveKeys() { + set.Visitor(ctx)(key) + + if !onlyRoots { + err := merkledag.EnumerateChildren(ctx, merkledag.GetLinksWithDAG(dag), key, set.Visitor(ctx)) + if err != nil { + logR.Errorf("reprovide indirect pins: %s", err) + return + } + } + } + }() + + return set, nil +} diff --git a/vendor/github.com/ipfs/go-ipfs/provider/system.go b/vendor/github.com/ipfs/go-ipfs/provider/system.go new file mode 100644 index 00000000..b3e17ee4 --- /dev/null +++ b/vendor/github.com/ipfs/go-ipfs/provider/system.go @@ -0,0 +1,59 @@ +package provider + +import ( + "context" + "github.com/ipfs/go-cid" +) + +// System defines the interface for interacting with the value +// provider system +type System interface { + Run() + Close() error + Provide(cid.Cid) error + Reprovide(context.Context) error +} + +type system struct { + provider Provider + reprovider Reprovider +} + +// NewSystem constructs a new provider system from a provider and reprovider +func NewSystem(provider Provider, reprovider Reprovider) System { + return &system{provider, reprovider} +} + +// Run the provider system by running the provider and reprovider +func (s *system) Run() { + go s.provider.Run() + go s.reprovider.Run() +} + +// Close the provider and reprovider +func (s *system) Close() error { + var errs []error + + if err := s.provider.Close(); err != nil { + errs = append(errs, err) + } + + if err := s.reprovider.Close(); err != nil { + errs = append(errs, err) + } + + if len(errs) > 0 { + return errs[0] + } + return nil +} + +// Provide a value +func (s *system) Provide(cid cid.Cid) error { + return s.provider.Provide(cid) +} + +// Reprovide all the previously provided values +func (s *system) Reprovide(ctx context.Context) error { + return s.reprovider.Trigger(ctx) +} diff --git a/vendor/github.com/ipfs/go-ipfs/thirdparty/math2/math2.go b/vendor/github.com/ipfs/go-ipfs/thirdparty/math2/math2.go deleted file mode 100644 index e8a75b5f..00000000 --- a/vendor/github.com/ipfs/go-ipfs/thirdparty/math2/math2.go +++ /dev/null @@ -1,9 +0,0 @@ -package math2 - -// IntMin returns the smaller of x or y. -func IntMin(x, y int) int { - if x < y { - return x - } - return y -} diff --git a/vendor/github.com/ipfs/go-ipfs/version.go b/vendor/github.com/ipfs/go-ipfs/version.go index c62c5847..5257125e 100644 --- a/vendor/github.com/ipfs/go-ipfs/version.go +++ b/vendor/github.com/ipfs/go-ipfs/version.go @@ -4,6 +4,6 @@ package ipfs var CurrentCommit string // CurrentVersionNumber is the current application's version literal -const CurrentVersionNumber = "0.4.20" +const CurrentVersionNumber = "0.4.22-dev" const ApiVersion = "/go-ipfs/" + CurrentVersionNumber + "/" diff --git a/vendor/github.com/ipfs/go-ipld-cbor/.travis.yml b/vendor/github.com/ipfs/go-ipld-cbor/.travis.yml index 4cfe98c2..923835bc 100644 --- a/vendor/github.com/ipfs/go-ipld-cbor/.travis.yml +++ b/vendor/github.com/ipfs/go-ipld-cbor/.travis.yml @@ -10,7 +10,6 @@ env: global: - GOTFLAGS="-race" matrix: - - BUILD_DEPTYPE=gx - BUILD_DEPTYPE=gomod diff --git a/vendor/github.com/ipfs/go-ipld-cbor/go.mod b/vendor/github.com/ipfs/go-ipld-cbor/go.mod index f59ae5f6..80f8c276 100644 --- a/vendor/github.com/ipfs/go-ipld-cbor/go.mod +++ b/vendor/github.com/ipfs/go-ipld-cbor/go.mod @@ -2,7 +2,7 @@ module github.com/ipfs/go-ipld-cbor require ( github.com/ipfs/go-block-format v0.0.2 - github.com/ipfs/go-cid v0.0.1 + github.com/ipfs/go-cid v0.0.2 github.com/ipfs/go-ipfs-util v0.0.1 github.com/ipfs/go-ipld-format v0.0.1 github.com/multiformats/go-multihash v0.0.1 diff --git a/vendor/github.com/ipfs/go-ipld-cbor/go.sum b/vendor/github.com/ipfs/go-ipld-cbor/go.sum index 6591da4b..94987205 100644 --- a/vendor/github.com/ipfs/go-ipld-cbor/go.sum +++ b/vendor/github.com/ipfs/go-ipld-cbor/go.sum @@ -8,6 +8,8 @@ github.com/ipfs/go-block-format v0.0.2 h1:qPDvcP19izTjU8rgo6p7gTXZlkMkF5bz5G3fqI github.com/ipfs/go-block-format v0.0.2/go.mod h1:AWR46JfpcObNfg3ok2JHDUfdiHRgWhJgCQF+KIgOPJY= github.com/ipfs/go-cid v0.0.1 h1:GBjWPktLnNyX0JiQCNFpUuUSoMw5KMyqrsejHYlILBE= github.com/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= +github.com/ipfs/go-cid v0.0.2 h1:tuuKaZPU1M6HcejsO3AcYWW8sZ8MTvyxfc4uqB4eFE8= +github.com/ipfs/go-cid v0.0.2/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= github.com/ipfs/go-ipfs-util v0.0.1 h1:Wz9bL2wB2YBJqggkA4dD7oSmqB4cAnpNbGrlHJulv50= github.com/ipfs/go-ipfs-util v0.0.1/go.mod h1:spsl5z8KUnrve+73pOhSVZND1SIxPW5RyBCNzQxlJBc= github.com/ipfs/go-ipld-format v0.0.1 h1:HCu4eB/Gh+KD/Q0M8u888RFkorTWNIL3da4oc5dwc80= diff --git a/vendor/github.com/ipfs/go-ipld-cbor/package.json b/vendor/github.com/ipfs/go-ipld-cbor/package.json deleted file mode 100644 index 8b19bc1f..00000000 --- a/vendor/github.com/ipfs/go-ipld-cbor/package.json +++ /dev/null @@ -1,54 +0,0 @@ -{ - "author": "whyrusleeping", - "bugs": { - "url": "https://github.com/ipfs/go-ipld-cbor" - }, - "gx": { - "dvcsimport": "github.com/ipfs/go-ipld-cbor" - }, - "gxDependencies": [ - { - "author": "whyrusleeping", - "hash": "QmZ6nzCLwGLVfRzYLpD7pW6UNuBDKEcA2imJtVpbEx2rxy", - "name": "go-ipld-format", - "version": "0.8.1" - }, - { - "author": "whyrusleeping", - "hash": "QmTbxNB1NwDesLmKTscr4udL2tVP7MaxvXnD1D9yX7g3PN", - "name": "go-cid", - "version": "0.9.3" - }, - { - "author": "whyrusleeping", - "hash": "QmNohiVssaPw3KVLZik59DBVGTSm2dGvYT9eoXt5DQ36Yz", - "name": "go-ipfs-util", - "version": "1.2.9" - }, - { - "author": "stebalien", - "hash": "QmYYLnAzR28nAQ4U5MFniLprnktu6eTFKibeNt96V21EZK", - "name": "go-block-format", - "version": "0.2.2" - }, - { - "author": "multiformats", - "hash": "QmerPMzPk1mJVowm8KgmoknWa4yCYvvugMPsgWmDNUvDLW", - "name": "go-multihash", - "version": "1.0.9" - }, - { - "author": "why", - "hash": "QmdBzoMxsBpojBfN1cv5GnKtB7sfYBMoLH7p9qSyEVYXcu", - "name": "refmt", - "version": "1.2.1" - } - ], - "gxVersion": "0.10.0", - "language": "go", - "license": "MIT", - "name": "go-ipld-cbor", - "releaseCmd": "git commit -a -m \"gx publish $VERSION\"", - "version": "1.5.10" -} - diff --git a/vendor/github.com/ipfs/go-ipld-format/.travis.yml b/vendor/github.com/ipfs/go-ipld-format/.travis.yml index 4cfe98c2..ba87d9a8 100644 --- a/vendor/github.com/ipfs/go-ipld-format/.travis.yml +++ b/vendor/github.com/ipfs/go-ipld-format/.travis.yml @@ -4,13 +4,12 @@ os: language: go go: - - 1.11.x + - 1.12.x env: global: - GOTFLAGS="-race" matrix: - - BUILD_DEPTYPE=gx - BUILD_DEPTYPE=gomod @@ -24,7 +23,6 @@ script: cache: directories: - - $GOPATH/src/gx - $GOPATH/pkg/mod - $HOME/.cache/go-build diff --git a/vendor/github.com/ipfs/go-ipld-format/go.mod b/vendor/github.com/ipfs/go-ipld-format/go.mod index b4caf2f0..f56c4536 100644 --- a/vendor/github.com/ipfs/go-ipld-format/go.mod +++ b/vendor/github.com/ipfs/go-ipld-format/go.mod @@ -2,6 +2,6 @@ module github.com/ipfs/go-ipld-format require ( github.com/ipfs/go-block-format v0.0.2 - github.com/ipfs/go-cid v0.0.1 + github.com/ipfs/go-cid v0.0.2 github.com/multiformats/go-multihash v0.0.1 ) diff --git a/vendor/github.com/ipfs/go-ipld-format/go.sum b/vendor/github.com/ipfs/go-ipld-format/go.sum index aa764c6a..79b1fea1 100644 --- a/vendor/github.com/ipfs/go-ipld-format/go.sum +++ b/vendor/github.com/ipfs/go-ipld-format/go.sum @@ -6,6 +6,8 @@ github.com/ipfs/go-block-format v0.0.2 h1:qPDvcP19izTjU8rgo6p7gTXZlkMkF5bz5G3fqI github.com/ipfs/go-block-format v0.0.2/go.mod h1:AWR46JfpcObNfg3ok2JHDUfdiHRgWhJgCQF+KIgOPJY= github.com/ipfs/go-cid v0.0.1 h1:GBjWPktLnNyX0JiQCNFpUuUSoMw5KMyqrsejHYlILBE= github.com/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= +github.com/ipfs/go-cid v0.0.2 h1:tuuKaZPU1M6HcejsO3AcYWW8sZ8MTvyxfc4uqB4eFE8= +github.com/ipfs/go-cid v0.0.2/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= github.com/ipfs/go-ipfs-util v0.0.1 h1:Wz9bL2wB2YBJqggkA4dD7oSmqB4cAnpNbGrlHJulv50= github.com/ipfs/go-ipfs-util v0.0.1/go.mod h1:spsl5z8KUnrve+73pOhSVZND1SIxPW5RyBCNzQxlJBc= github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0OXOcUbGjvZxxijuBwbbmlSxLiuofa+g= diff --git a/vendor/github.com/ipfs/go-ipld-format/package.json b/vendor/github.com/ipfs/go-ipld-format/package.json deleted file mode 100644 index ca1ff9b5..00000000 --- a/vendor/github.com/ipfs/go-ipld-format/package.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "author": "whyrusleeping", - "bugs": { - "url": "https://github.com/ipfs/go-ipld-format" - }, - "gx": { - "dvcsimport": "github.com/ipfs/go-ipld-format" - }, - "gxDependencies": [ - { - "author": "whyrusleeping", - "hash": "QmTbxNB1NwDesLmKTscr4udL2tVP7MaxvXnD1D9yX7g3PN", - "name": "go-cid", - "version": "0.9.3" - }, - { - "author": "stebalien", - "hash": "QmYYLnAzR28nAQ4U5MFniLprnktu6eTFKibeNt96V21EZK", - "name": "go-block-format", - "version": "0.2.2" - }, - { - "author": "multiformats", - "hash": "QmerPMzPk1mJVowm8KgmoknWa4yCYvvugMPsgWmDNUvDLW", - "name": "go-multihash", - "version": "1.0.9" - } - ], - "gxVersion": "0.10.0", - "language": "go", - "license": "", - "name": "go-ipld-format", - "releaseCmd": "git commit -a -m \"gx publish $VERSION\"", - "version": "0.8.1" -} - diff --git a/vendor/github.com/ipfs/go-ipld-format/walker.go b/vendor/github.com/ipfs/go-ipld-format/walker.go index a0c4bbef..81380936 100644 --- a/vendor/github.com/ipfs/go-ipld-format/walker.go +++ b/vendor/github.com/ipfs/go-ipld-format/walker.go @@ -88,7 +88,6 @@ type Walker struct { // * Active node. // * Path to the active node. - // Function called each time a node is arrived upon in a walk operation // through the `down` method (not when going back `up`). It is the main // API to implement DAG functionality (e.g., read and seek a file DAG) diff --git a/vendor/github.com/ipfs/go-merkledag/go.mod b/vendor/github.com/ipfs/go-merkledag/go.mod index 5cb093ef..6747fa35 100644 --- a/vendor/github.com/ipfs/go-merkledag/go.mod +++ b/vendor/github.com/ipfs/go-merkledag/go.mod @@ -3,13 +3,13 @@ module github.com/ipfs/go-merkledag require ( github.com/gogo/protobuf v1.2.1 github.com/ipfs/go-block-format v0.0.2 - github.com/ipfs/go-blockservice v0.0.3 - github.com/ipfs/go-cid v0.0.1 - github.com/ipfs/go-datastore v0.0.1 + github.com/ipfs/go-blockservice v0.1.0 + github.com/ipfs/go-cid v0.0.2 + github.com/ipfs/go-datastore v0.0.5 github.com/ipfs/go-ipfs-blockstore v0.0.1 github.com/ipfs/go-ipfs-exchange-offline v0.0.1 github.com/ipfs/go-ipfs-util v0.0.1 - github.com/ipfs/go-ipld-cbor v0.0.1 - github.com/ipfs/go-ipld-format v0.0.1 - github.com/multiformats/go-multihash v0.0.1 + github.com/ipfs/go-ipld-cbor v0.0.2 + github.com/ipfs/go-ipld-format v0.0.2 + github.com/multiformats/go-multihash v0.0.5 ) diff --git a/vendor/github.com/ipfs/go-merkledag/go.sum b/vendor/github.com/ipfs/go-merkledag/go.sum index 9d479dba..196e76bf 100644 --- a/vendor/github.com/ipfs/go-merkledag/go.sum +++ b/vendor/github.com/ipfs/go-merkledag/go.sum @@ -3,24 +3,28 @@ github.com/Kubuxu/go-os-helper v0.0.1/go.mod h1:N8B+I7vPCT80IcP58r50u4+gEEcsZETF github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32 h1:qkOC5Gd33k54tobS36cXdAzJbeHaduLtnLQQwNoIi78= github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32/go.mod h1:DrZx5ec/dmnfpw9KyYoQyYo7d0KEvTkk/5M/vbZjAr8= +github.com/btcsuite/btcd v0.0.0-20190523000118-16327141da8c h1:aEbSeNALREWXk0G7UdNhR3ayBV7tZ4M2PNmnrCAph6Q= +github.com/btcsuite/btcd v0.0.0-20190523000118-16327141da8c/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI= github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= github.com/btcsuite/btcutil v0.0.0-20190207003914-4c204d697803/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= +github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= -github.com/coreos/go-semver v0.2.0 h1:3Jm3tLmsgAYcjC+4Up7hJrFBPr+n7rAqYeSw/SZazuY= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/cskr/pubsub v1.0.2 h1:vlOzMhl6PFn60gRlTQQsIfVwaPB/B/8MziK8FhEPt/0= github.com/cskr/pubsub v1.0.2/go.mod h1:/8MzYXk/NJAz782G8RPkFzXTZVu63VotefPnR9TIRis= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= 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/dgraph-io/badger v1.5.5-0.20190226225317-8115aed38f8f/go.mod h1:VZxzAIRPHRVNRKRo6AXrX9BJegn6il06VMTZVJYCIjQ= github.com/dgryski/go-farm v0.0.0-20190104051053-3adb47b1fb0f/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/fd/go-nat v1.0.0 h1:DPyQ97sxA9ThrWYRPcWUz/z9TnpTIGRYODIQc/dy64M= -github.com/fd/go-nat v1.0.0/go.mod h1:BTBu/CKvMmOMUPkKVef1pngt2WFH/lg7E6yQnulfp6E= 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/go-check/check v0.0.0-20180628173108-788fd7840127 h1:0gkP6mzaMqkmpcJYCFOLkIBwI7xFExG03bbkOkCvUPI= @@ -30,6 +34,8 @@ github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zV github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.0 h1:kbxbvI4Un1LUWKxufD+BiE6AEExYYgkQLQmLFqA1LFk= github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0= +github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -40,30 +46,30 @@ github.com/gxed/hashland/keccakpg v0.0.1 h1:wrk3uMNaMxbXiHibbPO4S0ymqJMm41WiudyF github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfmKFJ6tItnhQ67kU= github.com/gxed/hashland/murmur3 v0.0.1 h1:SheiaIt0sda5K+8FLz952/1iWS9zrnKsEJaOJu4ZbSc= github.com/gxed/hashland/murmur3 v0.0.1/go.mod h1:KjXop02n4/ckmZSnY2+HKcLud/tcmvhST0bie/0lS48= -github.com/gxed/pubsub v0.0.0-20180201040156-26ebdf44f824 h1:TF4mX7zXpeyz/xintezebSa7ZDxAGBnqDwcoobvaz2o= -github.com/gxed/pubsub v0.0.0-20180201040156-26ebdf44f824/go.mod h1:OiEWyHgK+CWrmOlVquHaIK1vhpUJydC9m0Je6mhaiNE= github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+dAcgU= github.com/hashicorp/golang-lru v0.5.1/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-20180415215157-1395d1447324 h1:PV190X5/DzQ/tbFFG5YpT5mH6q+cHlfgqI5JuRnH9oE= -github.com/huin/goupnp v0.0.0-20180415215157-1395d1447324/go.mod h1:MZ2ZmwcBpvOoJ22IJsc7va19ZwoheaBk43rKg12SKag= +github.com/huin/goupnp v1.0.0 h1:wg75sLpL6DZqwHQN6E1Cfk6mtfzS45z8OV+ic+DtHRo= +github.com/huin/goupnp v1.0.0/go.mod h1:n9v9KO1tAxYH82qOn+UTIFQDmx5n1Zxd/ClZDMX7Bnc= +github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= github.com/ipfs/bbloom v0.0.1 h1:s7KkiBPfxCeDVo47KySjK0ACPc5GJRUxFpdyWEuDjhw= github.com/ipfs/bbloom v0.0.1/go.mod h1:oqo8CVWsJFMOZqTglBG4wydCE4IQA/G2/SEofB0rjUI= -github.com/ipfs/go-bitswap v0.0.1 h1:Xx1ma7TWy9ISOx5zFq5YVQyrTHzUP4GkRPMsZokHxAg= -github.com/ipfs/go-bitswap v0.0.1/go.mod h1:z+tP3h+HTJ810n1R5yMy2ccKFffJ2F6Vqm/5Bf7vs2c= -github.com/ipfs/go-bitswap v0.0.3/go.mod h1:jadAZYsP/tcRMl47ZhFxhaNuDQoXawT8iHMg+iFoQbg= +github.com/ipfs/go-bitswap v0.1.0 h1:28YsHYw9ut6wootnImPXH0WpnU5Dbo3qm6cvQ6e6wYY= +github.com/ipfs/go-bitswap v0.1.0/go.mod h1:FFJEf18E9izuCqUtHxbWEvq+reg7o4CW5wSAE1wsxj0= github.com/ipfs/go-block-format v0.0.1/go.mod h1:DK/YYcsSUIVAFNwo/KZCdIIbpN0ROH/baNLgayt4pFc= github.com/ipfs/go-block-format v0.0.2 h1:qPDvcP19izTjU8rgo6p7gTXZlkMkF5bz5G3fqIsSCPE= github.com/ipfs/go-block-format v0.0.2/go.mod h1:AWR46JfpcObNfg3ok2JHDUfdiHRgWhJgCQF+KIgOPJY= -github.com/ipfs/go-blockservice v0.0.1 h1:l6g1hwYDV6vb4bAvTqia6Cvo+zLMOPKel/n0zUX48bc= -github.com/ipfs/go-blockservice v0.0.1/go.mod h1:2Ao89U7jV1KIqqNk5EdhSTBG/Pgc1vMFr0bhkx376j4= -github.com/ipfs/go-blockservice v0.0.3 h1:40OvwrxeudTAlUGUAKNYnNPcwQeLtXedjzTWecnUinQ= -github.com/ipfs/go-blockservice v0.0.3/go.mod h1:/NNihwTi6V2Yr6g8wBI+BSwPuURpBRMtYNGrlxZ8KuI= +github.com/ipfs/go-blockservice v0.1.0 h1:dh2i7xjMbCtf0ZSMyQAF2qpV/pEEmM7yVpQ00+gik6U= +github.com/ipfs/go-blockservice v0.1.0/go.mod h1:hzmMScl1kXHg3M2BjTymbVPjv627N7sYcvYaKbop39M= github.com/ipfs/go-cid v0.0.1 h1:GBjWPktLnNyX0JiQCNFpUuUSoMw5KMyqrsejHYlILBE= github.com/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= +github.com/ipfs/go-cid v0.0.2 h1:tuuKaZPU1M6HcejsO3AcYWW8sZ8MTvyxfc4uqB4eFE8= +github.com/ipfs/go-cid v0.0.2/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= github.com/ipfs/go-datastore v0.0.1 h1:AW/KZCScnBWlSb5JbnEnLKFWXL224LBEh/9KXXOrUms= github.com/ipfs/go-datastore v0.0.1/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= +github.com/ipfs/go-datastore v0.0.5 h1:q3OfiOZV5rlsK1H5V8benjeUApRfMGs4Mrhmr6NriQo= +github.com/ipfs/go-datastore v0.0.5/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk= github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps= github.com/ipfs/go-ds-badger v0.0.2/go.mod h1:Y3QpeSFWQf6MopLTiZD+VT6IC1yZqaGmjvRcKeSGij8= @@ -81,34 +87,40 @@ github.com/ipfs/go-ipfs-exchange-interface v0.0.1 h1:LJXIo9W7CAmugqI+uofioIpRb6r github.com/ipfs/go-ipfs-exchange-interface v0.0.1/go.mod h1:c8MwfHjtQjPoDyiy9cFquVtVHkO9b9Ob3FG91qJnWCM= github.com/ipfs/go-ipfs-exchange-offline v0.0.1 h1:P56jYKZF7lDDOLx5SotVh5KFxoY6C81I1NSHW1FxGew= github.com/ipfs/go-ipfs-exchange-offline v0.0.1/go.mod h1:WhHSFCVYX36H/anEKQboAzpUws3x7UeEGkzQc3iNkM0= -github.com/ipfs/go-ipfs-flags v0.0.1 h1:OH5cEkJYL0QgA+bvD55TNG9ud8HA2Nqaav47b2c/UJk= -github.com/ipfs/go-ipfs-flags v0.0.1/go.mod h1:RnXBb9WV53GSfTrSDVK61NLTFKvWc60n+K9EgCDh+rA= github.com/ipfs/go-ipfs-pq v0.0.1 h1:zgUotX8dcAB/w/HidJh1zzc1yFq6Vm8J7T2F4itj/RU= github.com/ipfs/go-ipfs-pq v0.0.1/go.mod h1:LWIqQpqfRG3fNc5XsnIhz/wQ2XXGyugQwls7BgUmUfY= -github.com/ipfs/go-ipfs-routing v0.0.1 h1:394mZeTLcbM/LDO12PneBYvkZAUA+nRnmC0lAzDXKOY= -github.com/ipfs/go-ipfs-routing v0.0.1/go.mod h1:k76lf20iKFxQTjcJokbPM9iBXVXVZhcOwc360N4nuKs= +github.com/ipfs/go-ipfs-routing v0.1.0 h1:gAJTT1cEeeLj6/DlLX6t+NxD9fQe2ymTO6qWRDI/HQQ= +github.com/ipfs/go-ipfs-routing v0.1.0/go.mod h1:hYoUkJLyAUKhF58tysKpids8RNDPO42BVMgK5dNsoqY= github.com/ipfs/go-ipfs-util v0.0.1 h1:Wz9bL2wB2YBJqggkA4dD7oSmqB4cAnpNbGrlHJulv50= github.com/ipfs/go-ipfs-util v0.0.1/go.mod h1:spsl5z8KUnrve+73pOhSVZND1SIxPW5RyBCNzQxlJBc= -github.com/ipfs/go-ipld-cbor v0.0.1 h1:g7yh27SznWP4CUbkFgjR+WQRjEeyxCpTR4iKVmXx1wA= -github.com/ipfs/go-ipld-cbor v0.0.1/go.mod h1:RXHr8s4k0NE0TKhnrxqZC9M888QfsBN9rhS5NjfKzY8= +github.com/ipfs/go-ipld-cbor v0.0.2 h1:amzFztBQQQ69UA5+f7JRfoXF/z2l//MGfEDHVkS20+s= +github.com/ipfs/go-ipld-cbor v0.0.2/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA0AQFOn7Nc= github.com/ipfs/go-ipld-format v0.0.1 h1:HCu4eB/Gh+KD/Q0M8u888RFkorTWNIL3da4oc5dwc80= github.com/ipfs/go-ipld-format v0.0.1/go.mod h1:kyJtbkDALmFHv3QR6et67i35QzO3S0dCDnkOJhcZkms= +github.com/ipfs/go-ipld-format v0.0.2 h1:OVAGlyYT6JPZ0pEfGntFPS40lfrDmaDbQwNHEY2G9Zs= +github.com/ipfs/go-ipld-format v0.0.2/go.mod h1:4B6+FM2u9OJ9zCV+kSbgFAZlOrv1Hqbf0INGQgiKf9k= github.com/ipfs/go-log v0.0.1 h1:9XTUN/rW64BCG1YhPK9Hoy3q8nr4gOmHHBpgFdfw6Lc= github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM= github.com/ipfs/go-metrics-interface v0.0.1 h1:j+cpbjYvu4R8zbleSs36gvB7jR+wsL2fGD6n0jO4kdg= github.com/ipfs/go-metrics-interface v0.0.1/go.mod h1:6s6euYU4zowdslK0GKHmqaIZ3j/b/tL7HTWtJ4VPgWY= +github.com/ipfs/go-peertaskqueue v0.1.0 h1:bpRbgv76eT4avutNPDFZuCPOQus6qTgurEYxfulgZW4= +github.com/ipfs/go-peertaskqueue v0.1.0/go.mod h1:Jmk3IyCcfl1W3jTW3YpghSwSEC6IJ3Vzz/jUmWw8Z0U= github.com/ipfs/go-verifcid v0.0.1 h1:m2HI7zIuR5TFyQ1b79Da5N9dnnCP1vcu2QqawmWlK2E= github.com/ipfs/go-verifcid v0.0.1/go.mod h1:5Hrva5KBeIog4A+UpqlaIU+DEstipcJYQQZc0g37pY0= -github.com/jackpal/gateway v1.0.4 h1:LS5EHkLuQ6jzaHwULi0vL+JO0mU/n4yUtK8oUjHHOlM= -github.com/jackpal/gateway v1.0.4/go.mod h1:lTpwd4ACLXmpyiCTRtfiNyVnUmqT9RivzCDQetPfnjA= +github.com/jackpal/gateway v1.0.5 h1:qzXWUJfuMdlLMtt0a3Dgt+xkWQiA5itDEITVJtuSwMc= +github.com/jackpal/gateway v1.0.5/go.mod h1:lTpwd4ACLXmpyiCTRtfiNyVnUmqT9RivzCDQetPfnjA= github.com/jackpal/go-nat-pmp v1.0.1 h1:i0LektDkO1QlrTm/cSuP+PyBCDnYvjPLGl4LdWEMiaA= github.com/jackpal/go-nat-pmp v1.0.1/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= github.com/jbenet/go-cienv v0.0.0-20150120210510-1bb1476777ec h1:DQqZhhDvrTrEQ3Qod5yfavcA064e53xlQ+xajiorXgM= github.com/jbenet/go-cienv v0.0.0-20150120210510-1bb1476777ec/go.mod h1:rGaEvXB4uRSZMmzKNLoXvTu1sfx+1kv/DojUlPrSZGs= +github.com/jbenet/go-cienv v0.1.0 h1:Vc/s0QbQtoxX8MwwSLWWh+xNNZvM3Lw7NsTcHrvvhMc= +github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA= github.com/jbenet/go-temp-err-catcher v0.0.0-20150120210811-aac704a3f4f2 h1:vhC1OXXiT9R2pczegwz6moDvuRpggaroAXhPIseh57A= github.com/jbenet/go-temp-err-catcher v0.0.0-20150120210811-aac704a3f4f2/go.mod h1:8GXXJV31xl8whumTzdZsTt3RnUIiPqzkyf7mxToRCMs= github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8 h1:bspPhN+oKYFk5fcGNuQzp6IGzYQSenLEgH3s6jkXrWw= github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8/go.mod h1:Ly/wlsjFq/qrU3Rar62tu1gASgGw6chQbSh/XgIIXCY= +github.com/jbenet/goprocess v0.1.3 h1:YKyIEECS/XvcfHtBzxtjBBbWK+MbvA6dG8ASiqwvr10= +github.com/jbenet/goprocess v0.1.3/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= github.com/jtolds/gls v4.2.1+incompatible h1:fSuqC+Gmlu6l/ZYAoZzx2pyucC8Xza35fpRVWLVmUEE= @@ -116,6 +128,8 @@ github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVY github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= +github.com/koron/go-ssdp v0.0.0-20180514024734-4a0ed625a78b h1:wxtKgYHEncAU00muMD06dzLiahtGM1eouRNOzVV7tdQ= +github.com/koron/go-ssdp v0.0.0-20180514024734-4a0ed625a78b/go.mod h1:5Ky9EC2xfoUKUor0Hjgi2BJhCSXJfMOFlmyYrVKGQMk= 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= @@ -125,109 +139,132 @@ github.com/libp2p/go-addr-util v0.0.1 h1:TpTQm9cXVRVSKsYbgQ7GKc3KbbHVTnbostgGaDE github.com/libp2p/go-addr-util v0.0.1/go.mod h1:4ac6O7n9rIAKB1dnd+s8IbbMXkt+oBpzX4/+RACcnlQ= github.com/libp2p/go-buffer-pool v0.0.1 h1:9Rrn/H46cXjaA2HQ5Y8lyhOS1NhTkZ4yuEs2r3Eechg= github.com/libp2p/go-buffer-pool v0.0.1/go.mod h1:xtyIz9PMobb13WaxR6Zo1Pd1zXJKYg0a8KiIvDp3TzQ= -github.com/libp2p/go-conn-security v0.0.1 h1:4kMMrqrt9EUNCNjX1xagSJC+bq16uqjMe9lk1KBMVNs= -github.com/libp2p/go-conn-security v0.0.1/go.mod h1:bGmu51N0KU9IEjX7kl2PQjgZa40JQWnayTvNMgD/vyk= -github.com/libp2p/go-conn-security-multistream v0.0.1 h1:XefjAQRHcnUaxKb26RGupToucx3uU4ecbOZ3aACXlDU= -github.com/libp2p/go-conn-security-multistream v0.0.1/go.mod h1:nc9vud7inQ+d6SO0I/6dSWrdMnHnzZNHeyUQqrAJulE= +github.com/libp2p/go-buffer-pool v0.0.2 h1:QNK2iAFa8gjAe1SPz6mHSMuCcjs+X1wlHzeOSqcmlfs= +github.com/libp2p/go-buffer-pool v0.0.2/go.mod h1:MvaB6xw5vOrDl8rYZGLFdKAuk/hRoRZd1Vi32+RXyFM= +github.com/libp2p/go-conn-security-multistream v0.1.0 h1:aqGmto+ttL/uJgX0JtQI0tD21CIEy5eYd1Hlp0juHY0= +github.com/libp2p/go-conn-security-multistream v0.1.0/go.mod h1:aw6eD7LOsHEX7+2hJkDxw1MteijaVcI+/eP2/x3J1xc= github.com/libp2p/go-flow-metrics v0.0.1 h1:0gxuFd2GuK7IIP5pKljLwps6TvcuYgvG7Atqi3INF5s= github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZxBdp967ls1g+k8= -github.com/libp2p/go-libp2p v0.0.1 h1:oEjzhRzymY7NILTMzOKNVOpNZGpcQHrHriWw91pbJNM= -github.com/libp2p/go-libp2p v0.0.1/go.mod h1:bmRs8I0vwn6iRaVssZnJx/epY6WPSKiLoK1vyle4EX0= -github.com/libp2p/go-libp2p v0.0.2/go.mod h1:Qu8bWqFXiocPloabFGUcVG4kk94fLvfC8mWTDdFC9wE= -github.com/libp2p/go-libp2p-autonat v0.0.1/go.mod h1:fs71q5Xk+pdnKU014o2iq1RhMs9/PMaG5zXRFNnIIT4= -github.com/libp2p/go-libp2p-autonat v0.0.2/go.mod h1:fs71q5Xk+pdnKU014o2iq1RhMs9/PMaG5zXRFNnIIT4= -github.com/libp2p/go-libp2p-blankhost v0.0.1 h1:/mZuuiwntNR8RywnCFlGHLKrKLYne+qciBpQXWqp5fk= -github.com/libp2p/go-libp2p-blankhost v0.0.1/go.mod h1:Ibpbw/7cPPYwFb7PACIWdvxxv0t0XCCI10t7czjAjTc= -github.com/libp2p/go-libp2p-circuit v0.0.1/go.mod h1:Dqm0s/BiV63j8EEAs8hr1H5HudqvCAeXxDyic59lCwE= -github.com/libp2p/go-libp2p-crypto v0.0.1 h1:JNQd8CmoGTohO/akqrH16ewsqZpci2CbgYH/LmYl8gw= -github.com/libp2p/go-libp2p-crypto v0.0.1/go.mod h1:yJkNyDmO341d5wwXxDUGO0LykUVT72ImHNUqh5D/dBE= -github.com/libp2p/go-libp2p-discovery v0.0.1/go.mod h1:ZkkF9xIFRLA1xCc7bstYFkd80gBGK8Fc1JqGoU2i+zI= -github.com/libp2p/go-libp2p-host v0.0.1 h1:dnqusU+DheGcdxrE718kG4XgHNuL2n9eEv8Rg5zy8hQ= -github.com/libp2p/go-libp2p-host v0.0.1/go.mod h1:qWd+H1yuU0m5CwzAkvbSjqKairayEHdR5MMl7Cwa7Go= -github.com/libp2p/go-libp2p-interface-connmgr v0.0.1 h1:Q9EkNSLAOF+u90L88qmE9z/fTdjLh8OsJwGw74mkwk4= -github.com/libp2p/go-libp2p-interface-connmgr v0.0.1/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k= -github.com/libp2p/go-libp2p-interface-pnet v0.0.1 h1:7GnzRrBTJHEsofi1ahFdPN9Si6skwXQE9UqR2S+Pkh8= -github.com/libp2p/go-libp2p-interface-pnet v0.0.1/go.mod h1:el9jHpQAXK5dnTpKA4yfCNBZXvrzdOU75zz+C6ryp3k= -github.com/libp2p/go-libp2p-loggables v0.0.1 h1:HVww9oAnINIxbt69LJNkxD8lnbfgteXR97Xm4p3l9ps= -github.com/libp2p/go-libp2p-loggables v0.0.1/go.mod h1:lDipDlBNYbpyqyPX/KcoO+eq0sJYEVR2JgOexcivchg= -github.com/libp2p/go-libp2p-metrics v0.0.1 h1:yumdPC/P2VzINdmcKZd0pciSUCpou+s0lwYCjBbzQZU= -github.com/libp2p/go-libp2p-metrics v0.0.1/go.mod h1:jQJ95SXXA/K1VZi13h52WZMa9ja78zjyy5rspMsC/08= -github.com/libp2p/go-libp2p-nat v0.0.1 h1:on/zju7XE+JXc8gH+vTKmIh2UJFC1K8kGnJYluQrlz4= -github.com/libp2p/go-libp2p-nat v0.0.1/go.mod h1:4L6ajyUIlJvx1Cbh5pc6Ma6vMDpKXf3GgLO5u7W0oQ4= -github.com/libp2p/go-libp2p-nat v0.0.2/go.mod h1:QrjXQSD5Dj4IJOdEcjHRkWTSomyxRo6HnUkf/TfQpLQ= -github.com/libp2p/go-libp2p-net v0.0.1 h1:xJ4Vh4yKF/XKb8fd1Ev0ebAGzVjMxXzrxG2kjtU+F5Q= -github.com/libp2p/go-libp2p-net v0.0.1/go.mod h1:Yt3zgmlsHOgUWSXmt5V/Jpz9upuJBE8EgNU9DrCcR8c= -github.com/libp2p/go-libp2p-netutil v0.0.1 h1:LgD6+skofkOx8z6odD9+MZHKjupv3ng1u6KRhaADTnA= -github.com/libp2p/go-libp2p-netutil v0.0.1/go.mod h1:GdusFvujWZI9Vt0X5BKqwWWmZFxecf9Gt03cKxm2f/Q= -github.com/libp2p/go-libp2p-peer v0.0.1 h1:0qwAOljzYewINrU+Kndoc+1jAL7vzY/oY2Go4DCGfyY= -github.com/libp2p/go-libp2p-peer v0.0.1/go.mod h1:nXQvOBbwVqoP+T5Y5nCjeH4sP9IX/J0AMzcDUVruVoo= -github.com/libp2p/go-libp2p-peerstore v0.0.1 h1:twKovq8YK5trLrd3nB7PD2Zu9JcyAIdm7Bz9yBWjhq8= -github.com/libp2p/go-libp2p-peerstore v0.0.1/go.mod h1:RabLyPVJLuNQ+GFyoEkfi8H4Ti6k/HtZJ7YKgtSq+20= -github.com/libp2p/go-libp2p-protocol v0.0.1 h1:+zkEmZ2yFDi5adpVE3t9dqh/N9TbpFWywowzeEzBbLM= -github.com/libp2p/go-libp2p-protocol v0.0.1/go.mod h1:Af9n4PiruirSDjHycM1QuiMi/1VZNHYcK8cLgFJLZ4s= -github.com/libp2p/go-libp2p-record v0.0.1 h1:zN7AS3X46qmwsw5JLxdDuI43cH5UYwovKxHPjKBYQxw= -github.com/libp2p/go-libp2p-record v0.0.1/go.mod h1:grzqg263Rug/sRex85QrDOLntdFAymLDLm7lxMgU79Q= -github.com/libp2p/go-libp2p-routing v0.0.1 h1:hPMAWktf9rYi3ME4MG48qE7dq1ofJxiQbfdvpNntjhc= -github.com/libp2p/go-libp2p-routing v0.0.1/go.mod h1:N51q3yTr4Zdr7V8Jt2JIktVU+3xBBylx1MZeVA6t1Ys= -github.com/libp2p/go-libp2p-secio v0.0.1 h1:CqE/RdsizOwItdgLe632iyft/w0tshDLmZGAiKDcUAI= -github.com/libp2p/go-libp2p-secio v0.0.1/go.mod h1:IdG6iQybdcYmbTzxp4J5dwtUEDTOvZrT0opIDVNPrJs= -github.com/libp2p/go-libp2p-swarm v0.0.1 h1:Vne+hjaDwXqzgNwQ2vb2YKbnbOTyXjtS47stT66Apc4= -github.com/libp2p/go-libp2p-swarm v0.0.1/go.mod h1:mh+KZxkbd3lQnveQ3j2q60BM1Cw2mX36XXQqwfPOShs= -github.com/libp2p/go-libp2p-transport v0.0.1/go.mod h1:UzbUs9X+PHOSw7S3ZmeOxfnwaQY5vGDzZmKPod3N3tk= -github.com/libp2p/go-libp2p-transport v0.0.4 h1:/CPHQMN75/IQwkhBxxIo6p6PtL3rwFZtlzBROT3e8mw= -github.com/libp2p/go-libp2p-transport v0.0.4/go.mod h1:StoY3sx6IqsP6XKoabsPnHCwqKXWUMWU7Rfcsubee/A= -github.com/libp2p/go-libp2p-transport-upgrader v0.0.1 h1:rNtXkY6dty46mxYOHHAZQchI7gQdJStF683FhVnei/k= -github.com/libp2p/go-libp2p-transport-upgrader v0.0.1/go.mod h1:NJpUAgQab/8K6K0m+JmZCe5RUXG10UMEx4kWe9Ipj5c= -github.com/libp2p/go-maddr-filter v0.0.1 h1:apvYTg0aIxxQyBX+XHKOR+0+lYhGs1Yv+JmTH9nyl5I= -github.com/libp2p/go-maddr-filter v0.0.1/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= -github.com/libp2p/go-mplex v0.0.1 h1:dn2XGSrUxLtz3/8u85bGrwhUEKPX8MOF3lpmcWBZCWc= -github.com/libp2p/go-mplex v0.0.1/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0= -github.com/libp2p/go-msgio v0.0.1 h1:znj97n5FtXGCLDwe9x8jpHmY770SW4WStBGcCDh6GJw= -github.com/libp2p/go-msgio v0.0.1/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= +github.com/libp2p/go-libp2p v0.1.0 h1:8VXadcPNni74ODoZ+7326LMAppFYmz1fRQOUuT5iZvQ= +github.com/libp2p/go-libp2p v0.1.0/go.mod h1:6D/2OBauqLUoqcADOJpn9WbKqvaM07tDw68qHM0BxUM= +github.com/libp2p/go-libp2p-autonat v0.1.0/go.mod h1:1tLf2yXxiE/oKGtDwPYWTSYG3PtvYlJmg7NeVtPRqH8= +github.com/libp2p/go-libp2p-blankhost v0.1.1 h1:X919sCh+KLqJcNRApj43xCSiQRYqOSI88Fdf55ngf78= +github.com/libp2p/go-libp2p-blankhost v0.1.1/go.mod h1:pf2fvdLJPsC1FsVrNP3DUUvMzUts2dsLLBEpo1vW1ro= +github.com/libp2p/go-libp2p-circuit v0.1.0/go.mod h1:Ahq4cY3V9VJcHcn1SBXjr78AbFkZeIRmfunbA7pmFh8= +github.com/libp2p/go-libp2p-core v0.0.1 h1:HSTZtFIq/W5Ue43Zw+uWZyy2Vl5WtF0zDjKN8/DT/1I= +github.com/libp2p/go-libp2p-core v0.0.1/go.mod h1:g/VxnTZ/1ygHxH3dKok7Vno1VfpvGcGip57wjTU4fco= +github.com/libp2p/go-libp2p-core v0.0.2 h1:86uOwW+O6Uc7NbaK4diuLZo2/Ikvqw2rgyV03VcSbLE= +github.com/libp2p/go-libp2p-core v0.0.2/go.mod h1:9dAcntw/n46XycV4RnlBq3BpgrmyUi9LuoTNdPrbUco= +github.com/libp2p/go-libp2p-crypto v0.1.0 h1:k9MFy+o2zGDNGsaoZl0MA3iZ75qXxr9OOoAZF+sD5OQ= +github.com/libp2p/go-libp2p-crypto v0.1.0/go.mod h1:sPUokVISZiy+nNuTTH/TY+leRSxnFj/2GLjtOTW90hI= +github.com/libp2p/go-libp2p-discovery v0.1.0/go.mod h1:4F/x+aldVHjHDHuX85x1zWoFTGElt8HnoDzwkFZm29g= +github.com/libp2p/go-libp2p-loggables v0.1.0 h1:h3w8QFfCt2UJl/0/NW4K829HX/0S4KD31PQ7m8UXXO8= +github.com/libp2p/go-libp2p-loggables v0.1.0/go.mod h1:EyumB2Y6PrYjr55Q3/tiJ/o3xoDasoRYM7nOzEpoa90= +github.com/libp2p/go-libp2p-mplex v0.2.0/go.mod h1:Ejl9IyjvXJ0T9iqUTE1jpYATQ9NM3g+OtR+EMMODbKo= +github.com/libp2p/go-libp2p-mplex v0.2.1 h1:E1xaJBQnbSiTHGI1gaBKmKhu1TUKkErKJnE8iGvirYI= +github.com/libp2p/go-libp2p-mplex v0.2.1/go.mod h1:SC99Rxs8Vuzrf/6WhmH41kNn13TiYdAWNYHrwImKLnE= +github.com/libp2p/go-libp2p-nat v0.0.4 h1:+KXK324yaY701On8a0aGjTnw8467kW3ExKcqW2wwmyw= +github.com/libp2p/go-libp2p-nat v0.0.4/go.mod h1:N9Js/zVtAXqaeT99cXgTV9e75KpnWCvVOiGzlcHmBbY= +github.com/libp2p/go-libp2p-netutil v0.1.0 h1:zscYDNVEcGxyUpMd0JReUZTrpMfia8PmLKcKF72EAMQ= +github.com/libp2p/go-libp2p-netutil v0.1.0/go.mod h1:3Qv/aDqtMLTUyQeundkKsA+YCThNdbQD54k3TqjpbFU= +github.com/libp2p/go-libp2p-peer v0.2.0 h1:EQ8kMjaCUwt/Y5uLgjT8iY2qg0mGUT0N1zUjer50DsY= +github.com/libp2p/go-libp2p-peer v0.2.0/go.mod h1:RCffaCvUyW2CJmG2gAWVqwePwW7JMgxjsHm7+J5kjWY= +github.com/libp2p/go-libp2p-peerstore v0.1.0 h1:MKh7pRNPHSh1fLPj8u/M/s/napdmeNpoi9BRy9lPN0E= +github.com/libp2p/go-libp2p-peerstore v0.1.0/go.mod h1:2CeHkQsr8svp4fZ+Oi9ykN1HBb6u0MOvdJ7YIsmcwtY= +github.com/libp2p/go-libp2p-record v0.1.0 h1:wHwBGbFzymoIl69BpgwIu0O6ta3TXGcMPvHUAcodzRc= +github.com/libp2p/go-libp2p-record v0.1.0/go.mod h1:ujNc8iuE5dlKWVy6wuL6dd58t0n7xI4hAIl8pE6wu5Q= +github.com/libp2p/go-libp2p-secio v0.1.0 h1:NNP5KLxuP97sE5Bu3iuwOWyT/dKEGMN5zSLMWdB7GTQ= +github.com/libp2p/go-libp2p-secio v0.1.0/go.mod h1:tMJo2w7h3+wN4pgU2LSYeiKPrfqBgkOsdiKK77hE7c8= +github.com/libp2p/go-libp2p-swarm v0.1.0 h1:HrFk2p0awrGEgch9JXK/qp/hfjqQfgNxpLWnCiWPg5s= +github.com/libp2p/go-libp2p-swarm v0.1.0/go.mod h1:wQVsCdjsuZoc730CgOvh5ox6K8evllckjebkdiY5ta4= +github.com/libp2p/go-libp2p-testing v0.0.2 h1:p9ySW7MFvGGs83hAAe0MPGnjy/tPjl5KyxpMkojdZ+g= +github.com/libp2p/go-libp2p-testing v0.0.2/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= +github.com/libp2p/go-libp2p-testing v0.0.3 h1:bdij4bKaaND7tCsaXVjRfYkMpvoOeKj9AVQGJllA6jM= +github.com/libp2p/go-libp2p-testing v0.0.3/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= +github.com/libp2p/go-libp2p-transport-upgrader v0.1.1 h1:PZMS9lhjK9VytzMCW3tWHAXtKXmlURSc3ZdvwEcKCzw= +github.com/libp2p/go-libp2p-transport-upgrader v0.1.1/go.mod h1:IEtA6or8JUbsV07qPW4r01GnTenLW4oi3lOPbUMGJJA= +github.com/libp2p/go-libp2p-yamux v0.2.0 h1:TSPZ5cMMz/wdoYsye/wU1TE4G3LDGMoeEN0xgnCKU/I= +github.com/libp2p/go-libp2p-yamux v0.2.0/go.mod h1:Db2gU+XfLpm6E4rG5uGCFX6uXA8MEXOxFcRoXUODaK8= +github.com/libp2p/go-maddr-filter v0.0.4 h1:hx8HIuuwk34KePddrp2mM5ivgPkZ09JH4AvsALRbFUs= +github.com/libp2p/go-maddr-filter v0.0.4/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= +github.com/libp2p/go-mplex v0.0.3/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0= +github.com/libp2p/go-mplex v0.1.0 h1:/nBTy5+1yRyY82YaO6HXQRnO5IAGsXTjEJaR3LdTPc0= +github.com/libp2p/go-mplex v0.1.0/go.mod h1:SXgmdki2kwCUlCCbfGLEgHjC4pFqhTp0ZoV6aiKgxDU= +github.com/libp2p/go-msgio v0.0.2 h1:ivPvEKHxmVkTClHzg6RXTYHqaJQ0V9cDbq+6lKb3UV0= +github.com/libp2p/go-msgio v0.0.2/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= +github.com/libp2p/go-nat v0.0.3 h1:l6fKV+p0Xa354EqQOQP+d8CivdLM4kl5GxC1hSc/UeI= +github.com/libp2p/go-nat v0.0.3/go.mod h1:88nUEt0k0JD45Bk93NIwDqjlhiOwOoV36GchpcVc1yI= github.com/libp2p/go-reuseport v0.0.1 h1:7PhkfH73VXfPJYKQ6JwS5I/eVcoyYi9IMNGc6FWpFLw= github.com/libp2p/go-reuseport v0.0.1/go.mod h1:jn6RmB1ufnQwl0Q1f+YxAj8isJgDCQzaaxIFYDhcYEA= -github.com/libp2p/go-reuseport-transport v0.0.1 h1:UIRneNxLDmEGNjGHpIiWzSWkZ5bhxMCP9x3Vh7BSc7E= -github.com/libp2p/go-reuseport-transport v0.0.1/go.mod h1:YkbSDrvjUVDL6b8XqriyA20obEtsW9BLkuOUyQAOCbs= +github.com/libp2p/go-reuseport-transport v0.0.2 h1:WglMwyXyBu61CMkjCCtnmqNqnjib0GIEjMiHTwR/KN4= +github.com/libp2p/go-reuseport-transport v0.0.2/go.mod h1:YkbSDrvjUVDL6b8XqriyA20obEtsW9BLkuOUyQAOCbs= github.com/libp2p/go-stream-muxer v0.0.1 h1:Ce6e2Pyu+b5MC1k3eeFtAax0pW4gc6MosYSLV05UeLw= github.com/libp2p/go-stream-muxer v0.0.1/go.mod h1:bAo8x7YkSpadMTbtTaxGVHWUQsR/l5MEaHbKaliuT14= -github.com/libp2p/go-tcp-transport v0.0.1 h1:WyvJVw2lYAnr6CU+GZZ4oCt06fvORlmvBlFX2+ZpZDM= -github.com/libp2p/go-tcp-transport v0.0.1/go.mod h1:mnjg0o0O5TmXUaUIanYPUqkW4+u6mK0en8rlpA6BBTs= -github.com/libp2p/go-testutil v0.0.1 h1:Xg+O0G2HIMfHqBOBDcMS1iSZJ3GEcId4qOxCQvsGZHk= -github.com/libp2p/go-testutil v0.0.1/go.mod h1:iAcJc/DKJQanJ5ws2V+u5ywdL2n12X1WbbEG+Jjy69I= -github.com/libp2p/go-ws-transport v0.0.1/go.mod h1:p3bKjDWHEgtuKKj+2OdPYs5dAPIjtpQGHF2tJfGz7Ww= +github.com/libp2p/go-stream-muxer-multistream v0.2.0 h1:714bRJ4Zy9mdhyTLJ+ZKiROmAFwUHpeRidG+q7LTQOg= +github.com/libp2p/go-stream-muxer-multistream v0.2.0/go.mod h1:j9eyPol/LLRqT+GPLSxvimPhNph4sfYfMoDPd7HkzIc= +github.com/libp2p/go-tcp-transport v0.1.0 h1:IGhowvEqyMFknOar4FWCKSWE0zL36UFKQtiRQD60/8o= +github.com/libp2p/go-tcp-transport v0.1.0/go.mod h1:oJ8I5VXryj493DEJ7OsBieu8fcg2nHGctwtInJVpipc= +github.com/libp2p/go-testutil v0.1.0 h1:4QhjaWGO89udplblLVpgGDOQjzFlRavZOjuEnz2rLMc= +github.com/libp2p/go-testutil v0.1.0/go.mod h1:81b2n5HypcVyrCg/MJx4Wgfp/VHojytjVe/gLzZ2Ehc= +github.com/libp2p/go-ws-transport v0.1.0/go.mod h1:rjw1MG1LU9YDC6gzmwObkPd/Sqwhw7yT74kj3raBFuo= +github.com/libp2p/go-yamux v1.2.2 h1:s6J6o7+ajoQMjHe7BEnq+EynOj5D2EoG8CuQgL3F2vg= +github.com/libp2p/go-yamux v1.2.2/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= github.com/mattn/go-colorable v0.1.1 h1:G1f5SKeVxmagw/IyvzvtZE4Gybcc4Tr1tf7I8z0XgOg= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= +github.com/mattn/go-colorable v0.1.2 h1:/bC9yWikZXAL9uJdulbSfyVNIR3n3trXl+v8+1sx8mU= +github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-isatty v0.0.5 h1:tHXDdz1cpzGaovsTB+TVB8q90WEokoVmfMqoVcrLUgw= github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/miekg/dns v1.1.4/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/mattn/go-isatty v0.0.8 h1:HLtExJ+uU2HOZ+wI0Tt5DtUDrx8yhUqDcp7fYERX4CE= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/miekg/dns v1.1.12/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0OXOcUbGjvZxxijuBwbbmlSxLiuofa+g= github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16 h1:5W7KhL8HVF3XCFOweFD3BNESdnO8ewyYTFT2R+/b8FQ= github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= +github.com/minio/sha256-simd v0.0.0-20190328051042-05b4dd3047e5/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= +github.com/minio/sha256-simd v0.1.0 h1:U41/2erhAKcmSI14xh/ZTUdBPOzDOIfS93ibzUSl8KM= +github.com/minio/sha256-simd v0.1.0/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= github.com/mr-tron/base58 v1.1.0 h1:Y51FGVJ91WBqCEabAi5OPUz38eAx8DakuAm5svLcsfQ= github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= +github.com/mr-tron/base58 v1.1.1/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= +github.com/mr-tron/base58 v1.1.2 h1:ZEw4I2EgPKDJ2iEw0cNmLB3ROrEmkOtXIkaG7wZg+78= +github.com/mr-tron/base58 v1.1.2/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= github.com/multiformats/go-base32 v0.0.3 h1:tw5+NhuwaOjJCC5Pp82QuXbrmLzWg7uxlMFp8Nq/kkI= github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= github.com/multiformats/go-multiaddr v0.0.1 h1:/QUV3VBMDI6pi6xfiw7lr6xhDWWvQKn9udPn68kLSdY= github.com/multiformats/go-multiaddr v0.0.1/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= +github.com/multiformats/go-multiaddr v0.0.2/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= +github.com/multiformats/go-multiaddr v0.0.4 h1:WgMSI84/eRLdbptXMkMWDXPjPq7SPLIgGUVm2eroyU4= +github.com/multiformats/go-multiaddr v0.0.4/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= github.com/multiformats/go-multiaddr-dns v0.0.1/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= github.com/multiformats/go-multiaddr-dns v0.0.2 h1:/Bbsgsy3R6e3jf2qBahzNHzww6usYaZ0NhNH3sqdFS8= github.com/multiformats/go-multiaddr-dns v0.0.2/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= +github.com/multiformats/go-multiaddr-fmt v0.0.1 h1:5YjeOIzbX8OTKVaN72aOzGIYW7PnrZrnkDyOfAWRSMA= +github.com/multiformats/go-multiaddr-fmt v0.0.1/go.mod h1:aBYjqL4T/7j4Qx+R73XSv/8JsgnRFlf0w2KGLCmXl3Q= github.com/multiformats/go-multiaddr-net v0.0.1 h1:76O59E3FavvHqNg7jvzWzsPSW5JSi/ek0E4eiDVbg9g= github.com/multiformats/go-multiaddr-net v0.0.1/go.mod h1:nw6HSxNmCIQH27XPGBuX+d1tnvM7ihcFwHMSstNAVUU= github.com/multiformats/go-multibase v0.0.1 h1:PN9/v21eLywrFWdFNsFKaU04kLJzuYzmrJR+ubhT9qA= github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs= github.com/multiformats/go-multihash v0.0.1 h1:HHwN1K12I+XllBCrqKnhX949Orn4oawPkegHMu2vDqQ= github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= -github.com/multiformats/go-multistream v0.0.1 h1:JV4VfSdY9n7ECTtY59/TlSyFCzRILvYx4T4Ws8ZgihU= -github.com/multiformats/go-multistream v0.0.1/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= +github.com/multiformats/go-multihash v0.0.5 h1:1wxmCvTXAifAepIMyF39vZinRw5sbqjPs/UIi93+uik= +github.com/multiformats/go-multihash v0.0.5/go.mod h1:lt/HCbqlQwlPBz7lv0sQCdtfcMtlJvakRUn/0Ual8po= +github.com/multiformats/go-multistream v0.1.0 h1:UpO6jrsjqs46mqAK3n6wKRYFhugss9ArzbyUzU+4wkQ= +github.com/multiformats/go-multistream v0.1.0/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= 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/ginkgo v1.8.0 h1:VkHVNpR4iVnU8XQR6DBm8BqYjN7CRzw+xKUbVVbbW9w= +github.com/onsi/ginkgo v1.8.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/onsi/gomega v1.5.0 h1:izbySO9zDPmjJ8rDjLvkA2zJHIo+HkYXHnf7eN7SSyo= +github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/opentracing/opentracing-go v1.0.2 h1:3jA2P6O1F9UOrWVpwrIo17pu01KWvNWg4X946/Y5Zwg= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +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/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= @@ -238,6 +275,12 @@ github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykE github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v0.0.0-20190222223459-a17d461953aa h1:E+gaaifzi2xF65PbDmuKI3PhLWY6G5opMLniFq8vmXA= github.com/smartystreets/goconvey v0.0.0-20190222223459-a17d461953aa/go.mod h1:2RVY1rIf+2J2o/IM9+vPq9RzmHDSseB7FoXiSNIUsoU= +github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a h1:/eS3yfGjQKG+9kayBkj0ip1BGhq6zJ3eaVksphxAaek= +github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a/go.mod h1:7AyxJNCJ7SBZ1MfVQCWD6Uqo2oubI2Eq2y2eqf+A5r0= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 h1:RC6RW7j+1+HkWaX/Yh71Ee5ZHaHYt7ZP4sQgUrm6cDU= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572/go.mod h1:w0SWMsp6j9O/dk4/ZpIhL+3CkG8ofA2vuv7k+ltqUMc= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= @@ -249,29 +292,25 @@ github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc h1:9lDbC6 github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc/go.mod h1:bopw91TMyo8J3tvftk8xmU2kPmlrt4nScJQZU2hE5EM= github.com/whyrusleeping/go-notifier v0.0.0-20170827234753-097c5d47330f h1:M/lL30eFZTKnomXY6huvM6G0+gVquFNf6mxghaWlFUg= github.com/whyrusleeping/go-notifier v0.0.0-20170827234753-097c5d47330f/go.mod h1:cZNvX9cFybI01GriPRMXDtczuvUhgbcYr9iCGaNlRv8= -github.com/whyrusleeping/go-smux-multiplex v3.0.16+incompatible h1:iqksILj8STw03EJQe7Laj4ubnw+ojOyik18cd5vPL1o= -github.com/whyrusleeping/go-smux-multiplex v3.0.16+incompatible/go.mod h1:34LEDbeKFZInPUrAG+bjuJmUXONGdEFW7XL0SpTY1y4= -github.com/whyrusleeping/go-smux-multistream v2.0.2+incompatible h1:BdYHctE9HJZLquG9tpTdwWcbG4FaX6tVKPGjCGgiVxo= -github.com/whyrusleeping/go-smux-multistream v2.0.2+incompatible/go.mod h1:dRWHHvc4HDQSHh9gbKEBbUZ+f2Q8iZTPG3UOGYODxSQ= -github.com/whyrusleeping/go-smux-yamux v2.0.8+incompatible h1:IGm/UP/JpEFS6D787sZnZg7RA6fZIR9c/Ms9DeAVNuk= -github.com/whyrusleeping/go-smux-yamux v2.0.8+incompatible/go.mod h1:6qHUzBXUbB9MXmw3AUdB52L8sEb/hScCqOdW2kj/wuI= -github.com/whyrusleeping/go-smux-yamux v2.0.9+incompatible/go.mod h1:6qHUzBXUbB9MXmw3AUdB52L8sEb/hScCqOdW2kj/wuI= github.com/whyrusleeping/mafmt v1.2.8 h1:TCghSl5kkwEE0j+sU/gudyhVMRlpBin8fMBBHg59EbA= github.com/whyrusleeping/mafmt v1.2.8/go.mod h1:faQJFPbLSxzD9xpA02ttW/tS9vZykNvXwGvqIpk20FA= github.com/whyrusleeping/mdns v0.0.0-20180901202407-ef14215e6b30/go.mod h1:j4l84WPFclQPj320J9gp0XwNKBb3U0zt5CBqjPp22G4= github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7 h1:E9S12nwJwEOXe2d6gT6qxdvqMnNq+VnSsKPgm2ZZNds= github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7/go.mod h1:X2c0RVCI1eSUFI8eLcY3c0423ykwiUdxLJtkDvruhjI= -github.com/whyrusleeping/yamux v1.1.5 h1:4CK3aUUJQu0qpKZv5gEWJjNOQtdbdDhVVS6PJ+HimdE= -github.com/whyrusleeping/yamux v1.1.5/go.mod h1:E8LnQQ8HKx5KD29HZFUwM1PxCOdPRzGwur1mcYhXcD8= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25 h1:jsG6UpNLt9iAsb0S2AGW28DveNzzgmbXR+ENoPjUeIU= -golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/net v0.0.0-20180524181706-dfa909b99c79/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f h1:R423Cnkcp5JABoeemiGEPlt9tHXFfw5kvc0yqlxRPWo= +golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190227160552-c95aed5357e7 h1:C2F/nMkR/9sfUTpvR3QrjBuTdvMUC/cFajkphs1YLQo= golang.org/x/net v0.0.0-20190227160552-c95aed5357e7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190522155817-f3200d17e092 h1:4QSRKanuywn15aTZvI/mIDEgPQpswuFndXpOj3rKEco= +golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f h1:wMNYb4v58l5UBM7MYRLPG6ZhfOqbKu7X5eyFl8ZhKvA= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -280,9 +319,15 @@ golang.org/x/sys v0.0.0-20190219092855-153ac476189d/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190228124157-a34e9553db1e h1:ZytStCyV048ZqDsWHiYDdoI2Vd4msMcrDECFxS+tL9c= golang.org/x/sys v0.0.0-20190228124157-a34e9553db1e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190524122548-abf6ff778158 h1:v73Zw0Y1htnV0qaOAYSNiuIAviPSBkNtdy1tPi1+zpY= +golang.org/x/sys v0.0.0-20190524122548-abf6ff778158/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= 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/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= 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= @@ -293,3 +338,5 @@ gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkep gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.1 h1:mUhvW9EsL+naU5Q3cakzfE91YhliOondGd6ZrsDBHQE= 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= diff --git a/vendor/github.com/ipfs/go-mfs/.travis.yml b/vendor/github.com/ipfs/go-mfs/.travis.yml index 4cfe98c2..5163d693 100644 --- a/vendor/github.com/ipfs/go-mfs/.travis.yml +++ b/vendor/github.com/ipfs/go-mfs/.travis.yml @@ -10,7 +10,6 @@ env: global: - GOTFLAGS="-race" matrix: - - BUILD_DEPTYPE=gx - BUILD_DEPTYPE=gomod @@ -24,7 +23,6 @@ script: cache: directories: - - $GOPATH/src/gx - $GOPATH/pkg/mod - $HOME/.cache/go-build diff --git a/vendor/github.com/ipfs/go-mfs/go.mod b/vendor/github.com/ipfs/go-mfs/go.mod index 2ff3ec9e..6e1d925f 100644 --- a/vendor/github.com/ipfs/go-mfs/go.mod +++ b/vendor/github.com/ipfs/go-mfs/go.mod @@ -1,17 +1,17 @@ module github.com/ipfs/go-mfs require ( - github.com/ipfs/go-blockservice v0.0.3 - github.com/ipfs/go-cid v0.0.1 - github.com/ipfs/go-datastore v0.0.1 + github.com/ipfs/go-blockservice v0.1.1 + github.com/ipfs/go-cid v0.0.2 + github.com/ipfs/go-datastore v0.0.5 github.com/ipfs/go-ipfs-blockstore v0.0.1 github.com/ipfs/go-ipfs-chunker v0.0.1 github.com/ipfs/go-ipfs-exchange-offline v0.0.1 github.com/ipfs/go-ipfs-util v0.0.1 - github.com/ipfs/go-ipld-format v0.0.1 + github.com/ipfs/go-ipld-format v0.0.2 github.com/ipfs/go-log v0.0.1 - github.com/ipfs/go-merkledag v0.0.3 - github.com/ipfs/go-path v0.0.3 - github.com/ipfs/go-unixfs v0.0.4 - github.com/libp2p/go-testutil v0.0.1 + github.com/ipfs/go-merkledag v0.1.0 + github.com/ipfs/go-path v0.0.7 + github.com/ipfs/go-unixfs v0.1.0 + github.com/libp2p/go-libp2p-testing v0.0.4 ) diff --git a/vendor/github.com/ipfs/go-mfs/go.sum b/vendor/github.com/ipfs/go-mfs/go.sum index 7572bde9..7dbab573 100644 --- a/vendor/github.com/ipfs/go-mfs/go.sum +++ b/vendor/github.com/ipfs/go-mfs/go.sum @@ -1,12 +1,17 @@ github.com/AndreasBriese/bbloom v0.0.0-20180913140656-343706a395b7/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= github.com/Kubuxu/go-os-helper v0.0.1/go.mod h1:N8B+I7vPCT80IcP58r50u4+gEEcsZETFUpAzWW2ep1Y= -github.com/Stebalien/go-bitfield v0.0.0-20180330043415-076a62f9ce6e h1:2Z+EBRrOJsA3psnUPcEWMIH2EIga1xHflQcr/EZslx8= -github.com/Stebalien/go-bitfield v0.0.0-20180330043415-076a62f9ce6e/go.mod h1:3oM7gXIttpYDAJXpVNnSCiUMYBLIZ6cb1t+Ip982MRo= +github.com/Stebalien/go-bitfield v0.0.1 h1:X3kbSSPUaJK60wV2hjOPZwmpljr6VGCqdq4cBLhbQBo= +github.com/Stebalien/go-bitfield v0.0.1/go.mod h1:GNjFpasyUVkHMsfEOk8EFLJ9syQ6SI+XWrX9Wf2XH0s= github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32 h1:qkOC5Gd33k54tobS36cXdAzJbeHaduLtnLQQwNoIi78= github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32/go.mod h1:DrZx5ec/dmnfpw9KyYoQyYo7d0KEvTkk/5M/vbZjAr8= +github.com/btcsuite/btcd v0.0.0-20190523000118-16327141da8c h1:aEbSeNALREWXk0G7UdNhR3ayBV7tZ4M2PNmnrCAph6Q= +github.com/btcsuite/btcd v0.0.0-20190523000118-16327141da8c/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI= +github.com/btcsuite/btcd v0.0.0-20190605094302-a0d1e3e36d50 h1:4i3KsuVA0o0KoBxAC5x+MY7RbteiMK1V7gf/G08NGIQ= +github.com/btcsuite/btcd v0.0.0-20190605094302-a0d1e3e36d50/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI= github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= github.com/btcsuite/btcutil v0.0.0-20190207003914-4c204d697803/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= +github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= @@ -14,16 +19,19 @@ github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtE github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= github.com/coreos/go-semver v0.2.0 h1:3Jm3tLmsgAYcjC+4Up7hJrFBPr+n7rAqYeSw/SZazuY= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-semver v0.2.1-0.20180108230905-e214231b295a/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/cskr/pubsub v1.0.2 h1:vlOzMhl6PFn60gRlTQQsIfVwaPB/B/8MziK8FhEPt/0= github.com/cskr/pubsub v1.0.2/go.mod h1:/8MzYXk/NJAz782G8RPkFzXTZVu63VotefPnR9TIRis= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= 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/dgraph-io/badger v1.5.5-0.20190226225317-8115aed38f8f/go.mod h1:VZxzAIRPHRVNRKRo6AXrX9BJegn6il06VMTZVJYCIjQ= github.com/dgryski/go-farm v0.0.0-20190104051053-3adb47b1fb0f/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/fd/go-nat v1.0.0 h1:DPyQ97sxA9ThrWYRPcWUz/z9TnpTIGRYODIQc/dy64M= -github.com/fd/go-nat v1.0.0/go.mod h1:BTBu/CKvMmOMUPkKVef1pngt2WFH/lg7E6yQnulfp6E= 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/go-check/check v0.0.0-20180628173108-788fd7840127 h1:0gkP6mzaMqkmpcJYCFOLkIBwI7xFExG03bbkOkCvUPI= @@ -33,37 +41,53 @@ github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zV github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.0 h1:kbxbvI4Un1LUWKxufD+BiE6AEExYYgkQLQmLFqA1LFk= github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0= +github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gopherjs/gopherjs v0.0.0-20190430165422-3e4dfb77656c h1:7lF+Vz0LqiRidnzC1Oq86fpX1q/iEv2KJdrCtttYjT4= +github.com/gopherjs/gopherjs v0.0.0-20190430165422-3e4dfb77656c/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gxed/hashland/keccakpg v0.0.1 h1:wrk3uMNaMxbXiHibbPO4S0ymqJMm41WiudyFSs7UnsU= github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfmKFJ6tItnhQ67kU= github.com/gxed/hashland/murmur3 v0.0.1 h1:SheiaIt0sda5K+8FLz952/1iWS9zrnKsEJaOJu4ZbSc= github.com/gxed/hashland/murmur3 v0.0.1/go.mod h1:KjXop02n4/ckmZSnY2+HKcLud/tcmvhST0bie/0lS48= -github.com/gxed/pubsub v0.0.0-20180201040156-26ebdf44f824 h1:TF4mX7zXpeyz/xintezebSa7ZDxAGBnqDwcoobvaz2o= -github.com/gxed/pubsub v0.0.0-20180201040156-26ebdf44f824/go.mod h1:OiEWyHgK+CWrmOlVquHaIK1vhpUJydC9m0Je6mhaiNE= github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+dAcgU= github.com/hashicorp/golang-lru v0.5.1/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-20180415215157-1395d1447324 h1:PV190X5/DzQ/tbFFG5YpT5mH6q+cHlfgqI5JuRnH9oE= -github.com/huin/goupnp v0.0.0-20180415215157-1395d1447324/go.mod h1:MZ2ZmwcBpvOoJ22IJsc7va19ZwoheaBk43rKg12SKag= +github.com/huin/goupnp v1.0.0 h1:wg75sLpL6DZqwHQN6E1Cfk6mtfzS45z8OV+ic+DtHRo= +github.com/huin/goupnp v1.0.0/go.mod h1:n9v9KO1tAxYH82qOn+UTIFQDmx5n1Zxd/ClZDMX7Bnc= +github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= github.com/ipfs/bbloom v0.0.1 h1:s7KkiBPfxCeDVo47KySjK0ACPc5GJRUxFpdyWEuDjhw= github.com/ipfs/bbloom v0.0.1/go.mod h1:oqo8CVWsJFMOZqTglBG4wydCE4IQA/G2/SEofB0rjUI= -github.com/ipfs/go-bitswap v0.0.3 h1:uFcSI9dkjUn67S7IM60vr2wA27aAvn8o9xYjaQCug3o= -github.com/ipfs/go-bitswap v0.0.3/go.mod h1:jadAZYsP/tcRMl47ZhFxhaNuDQoXawT8iHMg+iFoQbg= +github.com/ipfs/go-bitswap v0.0.9 h1:Dy0qvYlaOd2E2FOL2gApJ21qVjepJsGNNfstLrGf+0I= +github.com/ipfs/go-bitswap v0.0.9/go.mod h1:kAPf5qgn2W2DrgAcscZ3HrM9qh4pH+X8Fkk3UPrwvis= +github.com/ipfs/go-bitswap v0.1.0 h1:28YsHYw9ut6wootnImPXH0WpnU5Dbo3qm6cvQ6e6wYY= +github.com/ipfs/go-bitswap v0.1.0/go.mod h1:FFJEf18E9izuCqUtHxbWEvq+reg7o4CW5wSAE1wsxj0= +github.com/ipfs/go-bitswap v0.1.2/go.mod h1:qxSWS4NXGs7jQ6zQvoPY3+NmOfHHG47mhkiLzBpJQIs= +github.com/ipfs/go-bitswap v0.1.3 h1:jAl9Z/TYObpGeGATUemnOZ7RYb0F/kzNVlhcYZesz+0= +github.com/ipfs/go-bitswap v0.1.3/go.mod h1:YEQlFy0kkxops5Vy+OxWdRSEZIoS7I7KDIwoa5Chkps= github.com/ipfs/go-block-format v0.0.1/go.mod h1:DK/YYcsSUIVAFNwo/KZCdIIbpN0ROH/baNLgayt4pFc= github.com/ipfs/go-block-format v0.0.2 h1:qPDvcP19izTjU8rgo6p7gTXZlkMkF5bz5G3fqIsSCPE= github.com/ipfs/go-block-format v0.0.2/go.mod h1:AWR46JfpcObNfg3ok2JHDUfdiHRgWhJgCQF+KIgOPJY= -github.com/ipfs/go-blockservice v0.0.3 h1:40OvwrxeudTAlUGUAKNYnNPcwQeLtXedjzTWecnUinQ= -github.com/ipfs/go-blockservice v0.0.3/go.mod h1:/NNihwTi6V2Yr6g8wBI+BSwPuURpBRMtYNGrlxZ8KuI= +github.com/ipfs/go-blockservice v0.0.7 h1:VRRVjgahs7r//MdO7yY5DJ2/i2fmkKOnxfSyfuPjTm0= +github.com/ipfs/go-blockservice v0.0.7/go.mod h1:EOfb9k/Y878ZTRY/CH0x5+ATtaipfbRhbvNSdgc/7So= +github.com/ipfs/go-blockservice v0.1.0 h1:dh2i7xjMbCtf0ZSMyQAF2qpV/pEEmM7yVpQ00+gik6U= +github.com/ipfs/go-blockservice v0.1.0/go.mod h1:hzmMScl1kXHg3M2BjTymbVPjv627N7sYcvYaKbop39M= +github.com/ipfs/go-blockservice v0.1.1 h1:HHIvLuOhW0DQSrVserYcZYUl++nJPEzqZP+spRMaVzw= +github.com/ipfs/go-blockservice v0.1.1/go.mod h1:t+411r7psEUhLueM8C7aPA7cxCclv4O3VsUVxt9kz2I= github.com/ipfs/go-cid v0.0.1 h1:GBjWPktLnNyX0JiQCNFpUuUSoMw5KMyqrsejHYlILBE= github.com/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= +github.com/ipfs/go-cid v0.0.2 h1:tuuKaZPU1M6HcejsO3AcYWW8sZ8MTvyxfc4uqB4eFE8= +github.com/ipfs/go-cid v0.0.2/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= github.com/ipfs/go-datastore v0.0.1 h1:AW/KZCScnBWlSb5JbnEnLKFWXL224LBEh/9KXXOrUms= github.com/ipfs/go-datastore v0.0.1/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= +github.com/ipfs/go-datastore v0.0.5 h1:q3OfiOZV5rlsK1H5V8benjeUApRfMGs4Mrhmr6NriQo= +github.com/ipfs/go-datastore v0.0.5/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk= github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps= github.com/ipfs/go-ds-badger v0.0.2/go.mod h1:Y3QpeSFWQf6MopLTiZD+VT6IC1yZqaGmjvRcKeSGij8= @@ -83,54 +107,69 @@ github.com/ipfs/go-ipfs-exchange-interface v0.0.1 h1:LJXIo9W7CAmugqI+uofioIpRb6r github.com/ipfs/go-ipfs-exchange-interface v0.0.1/go.mod h1:c8MwfHjtQjPoDyiy9cFquVtVHkO9b9Ob3FG91qJnWCM= github.com/ipfs/go-ipfs-exchange-offline v0.0.1 h1:P56jYKZF7lDDOLx5SotVh5KFxoY6C81I1NSHW1FxGew= github.com/ipfs/go-ipfs-exchange-offline v0.0.1/go.mod h1:WhHSFCVYX36H/anEKQboAzpUws3x7UeEGkzQc3iNkM0= -github.com/ipfs/go-ipfs-files v0.0.1 h1:OroTsI58plHGX70HPLKy6LQhPR3HZJ5ip61fYlo6POM= -github.com/ipfs/go-ipfs-files v0.0.1/go.mod h1:INEFm0LL2LWXBhNJ2PMIIb2w45hpXgPjNoE7yA8Y1d4= -github.com/ipfs/go-ipfs-files v0.0.2/go.mod h1:INEFm0LL2LWXBhNJ2PMIIb2w45hpXgPjNoE7yA8Y1d4= -github.com/ipfs/go-ipfs-flags v0.0.1 h1:OH5cEkJYL0QgA+bvD55TNG9ud8HA2Nqaav47b2c/UJk= -github.com/ipfs/go-ipfs-flags v0.0.1/go.mod h1:RnXBb9WV53GSfTrSDVK61NLTFKvWc60n+K9EgCDh+rA= +github.com/ipfs/go-ipfs-files v0.0.3 h1:ME+QnC3uOyla1ciRPezDW0ynQYK2ikOh9OCKAEg4uUA= +github.com/ipfs/go-ipfs-files v0.0.3/go.mod h1:INEFm0LL2LWXBhNJ2PMIIb2w45hpXgPjNoE7yA8Y1d4= github.com/ipfs/go-ipfs-posinfo v0.0.1 h1:Esoxj+1JgSjX0+ylc0hUmJCOv6V2vFoZiETLR6OtpRs= github.com/ipfs/go-ipfs-posinfo v0.0.1/go.mod h1:SwyeVP+jCwiDu0C313l/8jg6ZxM0qqtlt2a0vILTc1A= github.com/ipfs/go-ipfs-pq v0.0.1 h1:zgUotX8dcAB/w/HidJh1zzc1yFq6Vm8J7T2F4itj/RU= github.com/ipfs/go-ipfs-pq v0.0.1/go.mod h1:LWIqQpqfRG3fNc5XsnIhz/wQ2XXGyugQwls7BgUmUfY= github.com/ipfs/go-ipfs-routing v0.0.1 h1:394mZeTLcbM/LDO12PneBYvkZAUA+nRnmC0lAzDXKOY= github.com/ipfs/go-ipfs-routing v0.0.1/go.mod h1:k76lf20iKFxQTjcJokbPM9iBXVXVZhcOwc360N4nuKs= +github.com/ipfs/go-ipfs-routing v0.1.0 h1:gAJTT1cEeeLj6/DlLX6t+NxD9fQe2ymTO6qWRDI/HQQ= +github.com/ipfs/go-ipfs-routing v0.1.0/go.mod h1:hYoUkJLyAUKhF58tysKpids8RNDPO42BVMgK5dNsoqY= github.com/ipfs/go-ipfs-util v0.0.1 h1:Wz9bL2wB2YBJqggkA4dD7oSmqB4cAnpNbGrlHJulv50= github.com/ipfs/go-ipfs-util v0.0.1/go.mod h1:spsl5z8KUnrve+73pOhSVZND1SIxPW5RyBCNzQxlJBc= -github.com/ipfs/go-ipld-cbor v0.0.1 h1:g7yh27SznWP4CUbkFgjR+WQRjEeyxCpTR4iKVmXx1wA= -github.com/ipfs/go-ipld-cbor v0.0.1/go.mod h1:RXHr8s4k0NE0TKhnrxqZC9M888QfsBN9rhS5NjfKzY8= +github.com/ipfs/go-ipld-cbor v0.0.2 h1:amzFztBQQQ69UA5+f7JRfoXF/z2l//MGfEDHVkS20+s= +github.com/ipfs/go-ipld-cbor v0.0.2/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA0AQFOn7Nc= github.com/ipfs/go-ipld-format v0.0.1 h1:HCu4eB/Gh+KD/Q0M8u888RFkorTWNIL3da4oc5dwc80= github.com/ipfs/go-ipld-format v0.0.1/go.mod h1:kyJtbkDALmFHv3QR6et67i35QzO3S0dCDnkOJhcZkms= +github.com/ipfs/go-ipld-format v0.0.2 h1:OVAGlyYT6JPZ0pEfGntFPS40lfrDmaDbQwNHEY2G9Zs= +github.com/ipfs/go-ipld-format v0.0.2/go.mod h1:4B6+FM2u9OJ9zCV+kSbgFAZlOrv1Hqbf0INGQgiKf9k= github.com/ipfs/go-log v0.0.1 h1:9XTUN/rW64BCG1YhPK9Hoy3q8nr4gOmHHBpgFdfw6Lc= github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM= -github.com/ipfs/go-merkledag v0.0.3 h1:A5DlOMzqTRDVmdgkf3dzCKCFmVWH4Zqwb0cbYXUs+Ro= -github.com/ipfs/go-merkledag v0.0.3/go.mod h1:Oc5kIXLHokkE1hWGMBHw+oxehkAaTOqtEb7Zbh6BhLA= +github.com/ipfs/go-merkledag v0.0.6 h1:rYZc0yzhO7y1cKi3Rw425a2HhEJDdLvNOWsqtmO3PF0= +github.com/ipfs/go-merkledag v0.0.6/go.mod h1:QYPdnlvkOg7GnQRofu9XZimC5ZW5Wi3bKys/4GQQfto= +github.com/ipfs/go-merkledag v0.1.0 h1:CAEXjRFEDPvealQj3TgEjV1IJckwjvmxAqtq5QSXJrg= +github.com/ipfs/go-merkledag v0.1.0/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk= github.com/ipfs/go-metrics-interface v0.0.1 h1:j+cpbjYvu4R8zbleSs36gvB7jR+wsL2fGD6n0jO4kdg= github.com/ipfs/go-metrics-interface v0.0.1/go.mod h1:6s6euYU4zowdslK0GKHmqaIZ3j/b/tL7HTWtJ4VPgWY= -github.com/ipfs/go-path v0.0.3 h1:G/VFcCMXtp36JUPPyytYQ1I3UsBUBf47M//uSdTLnFg= -github.com/ipfs/go-path v0.0.3/go.mod h1:zIRQUez3LuQIU25zFjC2hpBTHimWx7VK5bjZgRLbbdo= -github.com/ipfs/go-unixfs v0.0.3 h1:09koecZaoJVoYy6Wkd/vo1lyQ4AdgAe83eJylQ7gAZw= -github.com/ipfs/go-unixfs v0.0.3/go.mod h1:FX/6aS/Xg95JRc6UMyiMdZeNn+N5VkD8/yfLNwKW0Ks= -github.com/ipfs/go-unixfs v0.0.4 h1:IApzQ+SnY0tfjqM7aU2b80CFYLZNHvhLmEZDIWr4e/E= -github.com/ipfs/go-unixfs v0.0.4/go.mod h1:eIo/p9ADu/MFOuyxzwU+Th8D6xoxU//r590vUpWyfz8= +github.com/ipfs/go-path v0.0.7 h1:H06hKMquQ0aYtHiHryOMLpQC1qC3QwXwkahcEVD51Ho= +github.com/ipfs/go-path v0.0.7/go.mod h1:6KTKmeRnBXgqrTvzFrPV3CamxcgvXX/4z79tfAd2Sno= +github.com/ipfs/go-peertaskqueue v0.0.4 h1:i0JprfjjILYcWM1xguO/1MCS8XKVxLSl+ECEVr6i8nw= +github.com/ipfs/go-peertaskqueue v0.0.4/go.mod h1:03H8fhyeMfKNFWqzYEVyMbcPUeYrqP1MX6Kd+aN+rMQ= +github.com/ipfs/go-peertaskqueue v0.1.0 h1:bpRbgv76eT4avutNPDFZuCPOQus6qTgurEYxfulgZW4= +github.com/ipfs/go-peertaskqueue v0.1.0/go.mod h1:Jmk3IyCcfl1W3jTW3YpghSwSEC6IJ3Vzz/jUmWw8Z0U= +github.com/ipfs/go-peertaskqueue v0.1.1 h1:+gPjbI+V3NktXZOqJA1kzbms2pYmhjgQQal0MzZrOAY= +github.com/ipfs/go-peertaskqueue v0.1.1/go.mod h1:Jmk3IyCcfl1W3jTW3YpghSwSEC6IJ3Vzz/jUmWw8Z0U= +github.com/ipfs/go-unixfs v0.1.0 h1:KkjcfqObdNwUN8heMtt5OdrgrRKYTIWEvpGl1bDYIho= +github.com/ipfs/go-unixfs v0.1.0/go.mod h1:lysk5ELhOso8+Fed9U1QTGey2ocsfaZ18h0NCO2Fj9s= github.com/ipfs/go-verifcid v0.0.1 h1:m2HI7zIuR5TFyQ1b79Da5N9dnnCP1vcu2QqawmWlK2E= github.com/ipfs/go-verifcid v0.0.1/go.mod h1:5Hrva5KBeIog4A+UpqlaIU+DEstipcJYQQZc0g37pY0= -github.com/jackpal/gateway v1.0.4 h1:LS5EHkLuQ6jzaHwULi0vL+JO0mU/n4yUtK8oUjHHOlM= -github.com/jackpal/gateway v1.0.4/go.mod h1:lTpwd4ACLXmpyiCTRtfiNyVnUmqT9RivzCDQetPfnjA= +github.com/jackpal/gateway v1.0.5 h1:qzXWUJfuMdlLMtt0a3Dgt+xkWQiA5itDEITVJtuSwMc= +github.com/jackpal/gateway v1.0.5/go.mod h1:lTpwd4ACLXmpyiCTRtfiNyVnUmqT9RivzCDQetPfnjA= github.com/jackpal/go-nat-pmp v1.0.1 h1:i0LektDkO1QlrTm/cSuP+PyBCDnYvjPLGl4LdWEMiaA= github.com/jackpal/go-nat-pmp v1.0.1/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= github.com/jbenet/go-cienv v0.0.0-20150120210510-1bb1476777ec h1:DQqZhhDvrTrEQ3Qod5yfavcA064e53xlQ+xajiorXgM= github.com/jbenet/go-cienv v0.0.0-20150120210510-1bb1476777ec/go.mod h1:rGaEvXB4uRSZMmzKNLoXvTu1sfx+1kv/DojUlPrSZGs= +github.com/jbenet/go-cienv v0.1.0 h1:Vc/s0QbQtoxX8MwwSLWWh+xNNZvM3Lw7NsTcHrvvhMc= +github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA= github.com/jbenet/go-temp-err-catcher v0.0.0-20150120210811-aac704a3f4f2 h1:vhC1OXXiT9R2pczegwz6moDvuRpggaroAXhPIseh57A= github.com/jbenet/go-temp-err-catcher v0.0.0-20150120210811-aac704a3f4f2/go.mod h1:8GXXJV31xl8whumTzdZsTt3RnUIiPqzkyf7mxToRCMs= github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8 h1:bspPhN+oKYFk5fcGNuQzp6IGzYQSenLEgH3s6jkXrWw= github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8/go.mod h1:Ly/wlsjFq/qrU3Rar62tu1gASgGw6chQbSh/XgIIXCY= +github.com/jbenet/goprocess v0.1.3 h1:YKyIEECS/XvcfHtBzxtjBBbWK+MbvA6dG8ASiqwvr10= +github.com/jbenet/goprocess v0.1.3/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= github.com/jtolds/gls v4.2.1+incompatible h1:fSuqC+Gmlu6l/ZYAoZzx2pyucC8Xza35fpRVWLVmUEE= github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= +github.com/koron/go-ssdp v0.0.0-20180514024734-4a0ed625a78b h1:wxtKgYHEncAU00muMD06dzLiahtGM1eouRNOzVV7tdQ= +github.com/koron/go-ssdp v0.0.0-20180514024734-4a0ed625a78b/go.mod h1:5Ky9EC2xfoUKUor0Hjgi2BJhCSXJfMOFlmyYrVKGQMk= 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= @@ -140,124 +179,254 @@ github.com/libp2p/go-addr-util v0.0.1 h1:TpTQm9cXVRVSKsYbgQ7GKc3KbbHVTnbostgGaDE github.com/libp2p/go-addr-util v0.0.1/go.mod h1:4ac6O7n9rIAKB1dnd+s8IbbMXkt+oBpzX4/+RACcnlQ= github.com/libp2p/go-buffer-pool v0.0.1 h1:9Rrn/H46cXjaA2HQ5Y8lyhOS1NhTkZ4yuEs2r3Eechg= github.com/libp2p/go-buffer-pool v0.0.1/go.mod h1:xtyIz9PMobb13WaxR6Zo1Pd1zXJKYg0a8KiIvDp3TzQ= +github.com/libp2p/go-buffer-pool v0.0.2 h1:QNK2iAFa8gjAe1SPz6mHSMuCcjs+X1wlHzeOSqcmlfs= +github.com/libp2p/go-buffer-pool v0.0.2/go.mod h1:MvaB6xw5vOrDl8rYZGLFdKAuk/hRoRZd1Vi32+RXyFM= github.com/libp2p/go-conn-security v0.0.1 h1:4kMMrqrt9EUNCNjX1xagSJC+bq16uqjMe9lk1KBMVNs= github.com/libp2p/go-conn-security v0.0.1/go.mod h1:bGmu51N0KU9IEjX7kl2PQjgZa40JQWnayTvNMgD/vyk= -github.com/libp2p/go-conn-security-multistream v0.0.1 h1:XefjAQRHcnUaxKb26RGupToucx3uU4ecbOZ3aACXlDU= -github.com/libp2p/go-conn-security-multistream v0.0.1/go.mod h1:nc9vud7inQ+d6SO0I/6dSWrdMnHnzZNHeyUQqrAJulE= +github.com/libp2p/go-conn-security-multistream v0.0.2 h1:Ykz0lnNjxk+0SdslUmlLNyrleqdpS1S/VW+dxFdt74Y= +github.com/libp2p/go-conn-security-multistream v0.0.2/go.mod h1:nc9vud7inQ+d6SO0I/6dSWrdMnHnzZNHeyUQqrAJulE= +github.com/libp2p/go-conn-security-multistream v0.1.0 h1:aqGmto+ttL/uJgX0JtQI0tD21CIEy5eYd1Hlp0juHY0= +github.com/libp2p/go-conn-security-multistream v0.1.0/go.mod h1:aw6eD7LOsHEX7+2hJkDxw1MteijaVcI+/eP2/x3J1xc= github.com/libp2p/go-flow-metrics v0.0.1 h1:0gxuFd2GuK7IIP5pKljLwps6TvcuYgvG7Atqi3INF5s= github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZxBdp967ls1g+k8= -github.com/libp2p/go-libp2p v0.0.2 h1:+jvgi0Zy3y4TKXJKApchCk3pCBPZf1T54z3+vKie3gw= -github.com/libp2p/go-libp2p v0.0.2/go.mod h1:Qu8bWqFXiocPloabFGUcVG4kk94fLvfC8mWTDdFC9wE= -github.com/libp2p/go-libp2p-autonat v0.0.2/go.mod h1:fs71q5Xk+pdnKU014o2iq1RhMs9/PMaG5zXRFNnIIT4= +github.com/libp2p/go-libp2p v0.0.30 h1:mwCWAusLhRGUzZ/VaCatsrEQTsuWExmXqVcvGBV72EQ= +github.com/libp2p/go-libp2p v0.0.30/go.mod h1:XWT8FGHlhptAv1+3V/+J5mEpzyui/5bvFsNuWYs611A= +github.com/libp2p/go-libp2p v0.1.0 h1:8VXadcPNni74ODoZ+7326LMAppFYmz1fRQOUuT5iZvQ= +github.com/libp2p/go-libp2p v0.1.0/go.mod h1:6D/2OBauqLUoqcADOJpn9WbKqvaM07tDw68qHM0BxUM= +github.com/libp2p/go-libp2p v0.1.1 h1:52sB0TJuDk2nYMcMfHOKaPoaayDZjaYVCq6Vk1ejUTk= +github.com/libp2p/go-libp2p v0.1.1/go.mod h1:I00BRo1UuUSdpuc8Q2mN7yDF/oTUTRAX6JWpTiK9Rp8= +github.com/libp2p/go-libp2p-autonat v0.0.6/go.mod h1:uZneLdOkZHro35xIhpbtTzLlgYturpu4J5+0cZK3MqE= +github.com/libp2p/go-libp2p-autonat v0.1.0/go.mod h1:1tLf2yXxiE/oKGtDwPYWTSYG3PtvYlJmg7NeVtPRqH8= github.com/libp2p/go-libp2p-blankhost v0.0.1 h1:/mZuuiwntNR8RywnCFlGHLKrKLYne+qciBpQXWqp5fk= github.com/libp2p/go-libp2p-blankhost v0.0.1/go.mod h1:Ibpbw/7cPPYwFb7PACIWdvxxv0t0XCCI10t7czjAjTc= -github.com/libp2p/go-libp2p-circuit v0.0.1/go.mod h1:Dqm0s/BiV63j8EEAs8hr1H5HudqvCAeXxDyic59lCwE= +github.com/libp2p/go-libp2p-blankhost v0.1.1 h1:X919sCh+KLqJcNRApj43xCSiQRYqOSI88Fdf55ngf78= +github.com/libp2p/go-libp2p-blankhost v0.1.1/go.mod h1:pf2fvdLJPsC1FsVrNP3DUUvMzUts2dsLLBEpo1vW1ro= +github.com/libp2p/go-libp2p-circuit v0.0.9/go.mod h1:uU+IBvEQzCu953/ps7bYzC/D/R0Ho2A9LfKVVCatlqU= +github.com/libp2p/go-libp2p-circuit v0.1.0/go.mod h1:Ahq4cY3V9VJcHcn1SBXjr78AbFkZeIRmfunbA7pmFh8= +github.com/libp2p/go-libp2p-core v0.0.1 h1:HSTZtFIq/W5Ue43Zw+uWZyy2Vl5WtF0zDjKN8/DT/1I= +github.com/libp2p/go-libp2p-core v0.0.1/go.mod h1:g/VxnTZ/1ygHxH3dKok7Vno1VfpvGcGip57wjTU4fco= +github.com/libp2p/go-libp2p-core v0.0.2 h1:86uOwW+O6Uc7NbaK4diuLZo2/Ikvqw2rgyV03VcSbLE= +github.com/libp2p/go-libp2p-core v0.0.2/go.mod h1:9dAcntw/n46XycV4RnlBq3BpgrmyUi9LuoTNdPrbUco= +github.com/libp2p/go-libp2p-core v0.0.3 h1:+IonUYY0nJZLb5Fdv6a6DOjtGP1L8Bb3faamiI2q5FY= +github.com/libp2p/go-libp2p-core v0.0.3/go.mod h1:j+YQMNz9WNSkNezXOsahp9kwZBKBvxLpKD316QWSJXE= github.com/libp2p/go-libp2p-crypto v0.0.1 h1:JNQd8CmoGTohO/akqrH16ewsqZpci2CbgYH/LmYl8gw= github.com/libp2p/go-libp2p-crypto v0.0.1/go.mod h1:yJkNyDmO341d5wwXxDUGO0LykUVT72ImHNUqh5D/dBE= -github.com/libp2p/go-libp2p-discovery v0.0.1/go.mod h1:ZkkF9xIFRLA1xCc7bstYFkd80gBGK8Fc1JqGoU2i+zI= +github.com/libp2p/go-libp2p-crypto v0.0.2/go.mod h1:eETI5OUfBnvARGOHrJz2eWNyTUxEGZnBxMcbUjfIj4I= +github.com/libp2p/go-libp2p-crypto v0.1.0 h1:k9MFy+o2zGDNGsaoZl0MA3iZ75qXxr9OOoAZF+sD5OQ= +github.com/libp2p/go-libp2p-crypto v0.1.0/go.mod h1:sPUokVISZiy+nNuTTH/TY+leRSxnFj/2GLjtOTW90hI= +github.com/libp2p/go-libp2p-discovery v0.0.5/go.mod h1:YtF20GUxjgoKZ4zmXj8j3Nb2TUSBHFlOCetzYdbZL5I= +github.com/libp2p/go-libp2p-discovery v0.1.0/go.mod h1:4F/x+aldVHjHDHuX85x1zWoFTGElt8HnoDzwkFZm29g= github.com/libp2p/go-libp2p-host v0.0.1 h1:dnqusU+DheGcdxrE718kG4XgHNuL2n9eEv8Rg5zy8hQ= github.com/libp2p/go-libp2p-host v0.0.1/go.mod h1:qWd+H1yuU0m5CwzAkvbSjqKairayEHdR5MMl7Cwa7Go= +github.com/libp2p/go-libp2p-host v0.0.3 h1:BB/1Z+4X0rjKP5lbQTmjEjLbDVbrcmLOlA6QDsN5/j4= +github.com/libp2p/go-libp2p-host v0.0.3/go.mod h1:Y/qPyA6C8j2coYyos1dfRm0I8+nvd4TGrDGt4tA7JR8= github.com/libp2p/go-libp2p-interface-connmgr v0.0.1 h1:Q9EkNSLAOF+u90L88qmE9z/fTdjLh8OsJwGw74mkwk4= github.com/libp2p/go-libp2p-interface-connmgr v0.0.1/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k= +github.com/libp2p/go-libp2p-interface-connmgr v0.0.4/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k= +github.com/libp2p/go-libp2p-interface-connmgr v0.0.5 h1:KG/KNYL2tYzXAfMvQN5K1aAGTYSYUMJ1prgYa2/JI1E= +github.com/libp2p/go-libp2p-interface-connmgr v0.0.5/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k= github.com/libp2p/go-libp2p-interface-pnet v0.0.1 h1:7GnzRrBTJHEsofi1ahFdPN9Si6skwXQE9UqR2S+Pkh8= github.com/libp2p/go-libp2p-interface-pnet v0.0.1/go.mod h1:el9jHpQAXK5dnTpKA4yfCNBZXvrzdOU75zz+C6ryp3k= github.com/libp2p/go-libp2p-loggables v0.0.1 h1:HVww9oAnINIxbt69LJNkxD8lnbfgteXR97Xm4p3l9ps= github.com/libp2p/go-libp2p-loggables v0.0.1/go.mod h1:lDipDlBNYbpyqyPX/KcoO+eq0sJYEVR2JgOexcivchg= +github.com/libp2p/go-libp2p-loggables v0.1.0 h1:h3w8QFfCt2UJl/0/NW4K829HX/0S4KD31PQ7m8UXXO8= +github.com/libp2p/go-libp2p-loggables v0.1.0/go.mod h1:EyumB2Y6PrYjr55Q3/tiJ/o3xoDasoRYM7nOzEpoa90= github.com/libp2p/go-libp2p-metrics v0.0.1 h1:yumdPC/P2VzINdmcKZd0pciSUCpou+s0lwYCjBbzQZU= github.com/libp2p/go-libp2p-metrics v0.0.1/go.mod h1:jQJ95SXXA/K1VZi13h52WZMa9ja78zjyy5rspMsC/08= -github.com/libp2p/go-libp2p-nat v0.0.2 h1:sKI5hiCsGFhuEKdXMsF9mywQu2qhfoIGX6a+VG6zelE= -github.com/libp2p/go-libp2p-nat v0.0.2/go.mod h1:QrjXQSD5Dj4IJOdEcjHRkWTSomyxRo6HnUkf/TfQpLQ= +github.com/libp2p/go-libp2p-mplex v0.1.1 h1:lSPS1VJ36P01gGO//KgcsmSah5uoC3X9r7WY5j+iP4c= +github.com/libp2p/go-libp2p-mplex v0.1.1/go.mod h1:KUQWpGkCzfV7UIpi8SKsAVxyBgz1c9R5EvxgnwLsb/I= +github.com/libp2p/go-libp2p-mplex v0.2.0/go.mod h1:Ejl9IyjvXJ0T9iqUTE1jpYATQ9NM3g+OtR+EMMODbKo= +github.com/libp2p/go-libp2p-mplex v0.2.1 h1:E1xaJBQnbSiTHGI1gaBKmKhu1TUKkErKJnE8iGvirYI= +github.com/libp2p/go-libp2p-mplex v0.2.1/go.mod h1:SC99Rxs8Vuzrf/6WhmH41kNn13TiYdAWNYHrwImKLnE= +github.com/libp2p/go-libp2p-nat v0.0.4 h1:+KXK324yaY701On8a0aGjTnw8467kW3ExKcqW2wwmyw= +github.com/libp2p/go-libp2p-nat v0.0.4/go.mod h1:N9Js/zVtAXqaeT99cXgTV9e75KpnWCvVOiGzlcHmBbY= github.com/libp2p/go-libp2p-net v0.0.1 h1:xJ4Vh4yKF/XKb8fd1Ev0ebAGzVjMxXzrxG2kjtU+F5Q= github.com/libp2p/go-libp2p-net v0.0.1/go.mod h1:Yt3zgmlsHOgUWSXmt5V/Jpz9upuJBE8EgNU9DrCcR8c= +github.com/libp2p/go-libp2p-net v0.0.2 h1:qP06u4TYXfl7uW/hzqPhlVVTSA2nw1B/bHBJaUnbh6M= +github.com/libp2p/go-libp2p-net v0.0.2/go.mod h1:Yt3zgmlsHOgUWSXmt5V/Jpz9upuJBE8EgNU9DrCcR8c= github.com/libp2p/go-libp2p-netutil v0.0.1 h1:LgD6+skofkOx8z6odD9+MZHKjupv3ng1u6KRhaADTnA= github.com/libp2p/go-libp2p-netutil v0.0.1/go.mod h1:GdusFvujWZI9Vt0X5BKqwWWmZFxecf9Gt03cKxm2f/Q= +github.com/libp2p/go-libp2p-netutil v0.1.0 h1:zscYDNVEcGxyUpMd0JReUZTrpMfia8PmLKcKF72EAMQ= +github.com/libp2p/go-libp2p-netutil v0.1.0/go.mod h1:3Qv/aDqtMLTUyQeundkKsA+YCThNdbQD54k3TqjpbFU= github.com/libp2p/go-libp2p-peer v0.0.1 h1:0qwAOljzYewINrU+Kndoc+1jAL7vzY/oY2Go4DCGfyY= github.com/libp2p/go-libp2p-peer v0.0.1/go.mod h1:nXQvOBbwVqoP+T5Y5nCjeH4sP9IX/J0AMzcDUVruVoo= +github.com/libp2p/go-libp2p-peer v0.1.1/go.mod h1:jkF12jGB4Gk/IOo+yomm+7oLWxF278F7UnrYUQ1Q8es= +github.com/libp2p/go-libp2p-peer v0.2.0 h1:EQ8kMjaCUwt/Y5uLgjT8iY2qg0mGUT0N1zUjer50DsY= +github.com/libp2p/go-libp2p-peer v0.2.0/go.mod h1:RCffaCvUyW2CJmG2gAWVqwePwW7JMgxjsHm7+J5kjWY= github.com/libp2p/go-libp2p-peerstore v0.0.1 h1:twKovq8YK5trLrd3nB7PD2Zu9JcyAIdm7Bz9yBWjhq8= github.com/libp2p/go-libp2p-peerstore v0.0.1/go.mod h1:RabLyPVJLuNQ+GFyoEkfi8H4Ti6k/HtZJ7YKgtSq+20= +github.com/libp2p/go-libp2p-peerstore v0.0.6/go.mod h1:RabLyPVJLuNQ+GFyoEkfi8H4Ti6k/HtZJ7YKgtSq+20= +github.com/libp2p/go-libp2p-peerstore v0.1.0 h1:MKh7pRNPHSh1fLPj8u/M/s/napdmeNpoi9BRy9lPN0E= +github.com/libp2p/go-libp2p-peerstore v0.1.0/go.mod h1:2CeHkQsr8svp4fZ+Oi9ykN1HBb6u0MOvdJ7YIsmcwtY= github.com/libp2p/go-libp2p-protocol v0.0.1 h1:+zkEmZ2yFDi5adpVE3t9dqh/N9TbpFWywowzeEzBbLM= github.com/libp2p/go-libp2p-protocol v0.0.1/go.mod h1:Af9n4PiruirSDjHycM1QuiMi/1VZNHYcK8cLgFJLZ4s= +github.com/libp2p/go-libp2p-protocol v0.1.0 h1:HdqhEyhg0ToCaxgMhnOmUO8snQtt/kQlcjVk3UoJU3c= +github.com/libp2p/go-libp2p-protocol v0.1.0/go.mod h1:KQPHpAabB57XQxGrXCNvbL6UEXfQqUgC/1adR2Xtflk= github.com/libp2p/go-libp2p-record v0.0.1 h1:zN7AS3X46qmwsw5JLxdDuI43cH5UYwovKxHPjKBYQxw= github.com/libp2p/go-libp2p-record v0.0.1/go.mod h1:grzqg263Rug/sRex85QrDOLntdFAymLDLm7lxMgU79Q= +github.com/libp2p/go-libp2p-record v0.1.0 h1:wHwBGbFzymoIl69BpgwIu0O6ta3TXGcMPvHUAcodzRc= +github.com/libp2p/go-libp2p-record v0.1.0/go.mod h1:ujNc8iuE5dlKWVy6wuL6dd58t0n7xI4hAIl8pE6wu5Q= github.com/libp2p/go-libp2p-routing v0.0.1 h1:hPMAWktf9rYi3ME4MG48qE7dq1ofJxiQbfdvpNntjhc= github.com/libp2p/go-libp2p-routing v0.0.1/go.mod h1:N51q3yTr4Zdr7V8Jt2JIktVU+3xBBylx1MZeVA6t1Ys= -github.com/libp2p/go-libp2p-secio v0.0.1 h1:CqE/RdsizOwItdgLe632iyft/w0tshDLmZGAiKDcUAI= -github.com/libp2p/go-libp2p-secio v0.0.1/go.mod h1:IdG6iQybdcYmbTzxp4J5dwtUEDTOvZrT0opIDVNPrJs= -github.com/libp2p/go-libp2p-swarm v0.0.1 h1:Vne+hjaDwXqzgNwQ2vb2YKbnbOTyXjtS47stT66Apc4= -github.com/libp2p/go-libp2p-swarm v0.0.1/go.mod h1:mh+KZxkbd3lQnveQ3j2q60BM1Cw2mX36XXQqwfPOShs= +github.com/libp2p/go-libp2p-secio v0.0.3 h1:h3fPeDrej7bvvARnC2oSjAfcLZOaS4REZKgWCRQNpE4= +github.com/libp2p/go-libp2p-secio v0.0.3/go.mod h1:hS7HQ00MgLhRO/Wyu1bTX6ctJKhVpm+j2/S2A5UqYb0= +github.com/libp2p/go-libp2p-secio v0.1.0 h1:NNP5KLxuP97sE5Bu3iuwOWyT/dKEGMN5zSLMWdB7GTQ= +github.com/libp2p/go-libp2p-secio v0.1.0/go.mod h1:tMJo2w7h3+wN4pgU2LSYeiKPrfqBgkOsdiKK77hE7c8= +github.com/libp2p/go-libp2p-swarm v0.0.6 h1:gE0P/v2h+KEXtAi9YTw2UBOSODJ4m9VuuJ+ktc2LVUo= +github.com/libp2p/go-libp2p-swarm v0.0.6/go.mod h1:s5GZvzg9xXe8sbeESuFpjt8CJPTCa8mhEusweJqyFy8= +github.com/libp2p/go-libp2p-swarm v0.1.0 h1:HrFk2p0awrGEgch9JXK/qp/hfjqQfgNxpLWnCiWPg5s= +github.com/libp2p/go-libp2p-swarm v0.1.0/go.mod h1:wQVsCdjsuZoc730CgOvh5ox6K8evllckjebkdiY5ta4= +github.com/libp2p/go-libp2p-testing v0.0.1/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= +github.com/libp2p/go-libp2p-testing v0.0.2 h1:p9ySW7MFvGGs83hAAe0MPGnjy/tPjl5KyxpMkojdZ+g= +github.com/libp2p/go-libp2p-testing v0.0.2/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= +github.com/libp2p/go-libp2p-testing v0.0.3 h1:bdij4bKaaND7tCsaXVjRfYkMpvoOeKj9AVQGJllA6jM= +github.com/libp2p/go-libp2p-testing v0.0.3/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= +github.com/libp2p/go-libp2p-testing v0.0.4 h1:Qev57UR47GcLPXWjrunv5aLIQGO4n9mhI/8/EIrEEFc= +github.com/libp2p/go-libp2p-testing v0.0.4/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= github.com/libp2p/go-libp2p-transport v0.0.1/go.mod h1:UzbUs9X+PHOSw7S3ZmeOxfnwaQY5vGDzZmKPod3N3tk= -github.com/libp2p/go-libp2p-transport v0.0.4 h1:/CPHQMN75/IQwkhBxxIo6p6PtL3rwFZtlzBROT3e8mw= -github.com/libp2p/go-libp2p-transport v0.0.4/go.mod h1:StoY3sx6IqsP6XKoabsPnHCwqKXWUMWU7Rfcsubee/A= -github.com/libp2p/go-libp2p-transport-upgrader v0.0.1 h1:rNtXkY6dty46mxYOHHAZQchI7gQdJStF683FhVnei/k= -github.com/libp2p/go-libp2p-transport-upgrader v0.0.1/go.mod h1:NJpUAgQab/8K6K0m+JmZCe5RUXG10UMEx4kWe9Ipj5c= +github.com/libp2p/go-libp2p-transport v0.0.5 h1:pV6+UlRxyDpASSGD+60vMvdifSCby6JkJDfi+yUMHac= +github.com/libp2p/go-libp2p-transport v0.0.5/go.mod h1:StoY3sx6IqsP6XKoabsPnHCwqKXWUMWU7Rfcsubee/A= +github.com/libp2p/go-libp2p-transport-upgrader v0.0.4 h1:uGMOd14BL1oFlfb/cGfOxPjiTKBhzWV4aMjjoCF1Z1o= +github.com/libp2p/go-libp2p-transport-upgrader v0.0.4/go.mod h1:RGq+tupk+oj7PzL2kn/m1w6YXxcIAYJYeI90h6BGgUc= +github.com/libp2p/go-libp2p-transport-upgrader v0.1.1 h1:PZMS9lhjK9VytzMCW3tWHAXtKXmlURSc3ZdvwEcKCzw= +github.com/libp2p/go-libp2p-transport-upgrader v0.1.1/go.mod h1:IEtA6or8JUbsV07qPW4r01GnTenLW4oi3lOPbUMGJJA= +github.com/libp2p/go-libp2p-yamux v0.1.2/go.mod h1:xUoV/RmYkg6BW/qGxA9XJyg+HzXFYkeXbnhjmnYzKp8= +github.com/libp2p/go-libp2p-yamux v0.1.3 h1:HmKvv2jWJ4GEm3iP7cEKjuw0POa6rK+Hcsu1FBKzpLc= +github.com/libp2p/go-libp2p-yamux v0.1.3/go.mod h1:VGSQVrqkh6y4nm0189qqxMtvyBft44MOYYPpYKXiVt4= +github.com/libp2p/go-libp2p-yamux v0.2.0 h1:TSPZ5cMMz/wdoYsye/wU1TE4G3LDGMoeEN0xgnCKU/I= +github.com/libp2p/go-libp2p-yamux v0.2.0/go.mod h1:Db2gU+XfLpm6E4rG5uGCFX6uXA8MEXOxFcRoXUODaK8= +github.com/libp2p/go-libp2p-yamux v0.2.1 h1:Q3XYNiKCC2vIxrvUJL+Jg1kiyeEaIDNKLjgEjo3VQdI= +github.com/libp2p/go-libp2p-yamux v0.2.1/go.mod h1:1FBXiHDk1VyRM1C0aez2bCfHQ4vMZKkAQzZbkSQt5fI= github.com/libp2p/go-maddr-filter v0.0.1 h1:apvYTg0aIxxQyBX+XHKOR+0+lYhGs1Yv+JmTH9nyl5I= github.com/libp2p/go-maddr-filter v0.0.1/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= -github.com/libp2p/go-mplex v0.0.1 h1:dn2XGSrUxLtz3/8u85bGrwhUEKPX8MOF3lpmcWBZCWc= -github.com/libp2p/go-mplex v0.0.1/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0= -github.com/libp2p/go-msgio v0.0.1 h1:znj97n5FtXGCLDwe9x8jpHmY770SW4WStBGcCDh6GJw= -github.com/libp2p/go-msgio v0.0.1/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= +github.com/libp2p/go-maddr-filter v0.0.4 h1:hx8HIuuwk34KePddrp2mM5ivgPkZ09JH4AvsALRbFUs= +github.com/libp2p/go-maddr-filter v0.0.4/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= +github.com/libp2p/go-mplex v0.0.3/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0= +github.com/libp2p/go-mplex v0.0.4 h1:043XJ3Zr7/Oz5cfyUaJwxUZyP02TngTpt4oq8R5UizQ= +github.com/libp2p/go-mplex v0.0.4/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0= +github.com/libp2p/go-mplex v0.1.0 h1:/nBTy5+1yRyY82YaO6HXQRnO5IAGsXTjEJaR3LdTPc0= +github.com/libp2p/go-mplex v0.1.0/go.mod h1:SXgmdki2kwCUlCCbfGLEgHjC4pFqhTp0ZoV6aiKgxDU= +github.com/libp2p/go-msgio v0.0.2 h1:ivPvEKHxmVkTClHzg6RXTYHqaJQ0V9cDbq+6lKb3UV0= +github.com/libp2p/go-msgio v0.0.2/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= +github.com/libp2p/go-msgio v0.0.3 h1:VsOlWispTivSsOMg70e0W77y6oiSBSRCyP6URrWvE04= +github.com/libp2p/go-msgio v0.0.3/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= +github.com/libp2p/go-nat v0.0.3 h1:l6fKV+p0Xa354EqQOQP+d8CivdLM4kl5GxC1hSc/UeI= +github.com/libp2p/go-nat v0.0.3/go.mod h1:88nUEt0k0JD45Bk93NIwDqjlhiOwOoV36GchpcVc1yI= github.com/libp2p/go-reuseport v0.0.1 h1:7PhkfH73VXfPJYKQ6JwS5I/eVcoyYi9IMNGc6FWpFLw= github.com/libp2p/go-reuseport v0.0.1/go.mod h1:jn6RmB1ufnQwl0Q1f+YxAj8isJgDCQzaaxIFYDhcYEA= -github.com/libp2p/go-reuseport-transport v0.0.1 h1:UIRneNxLDmEGNjGHpIiWzSWkZ5bhxMCP9x3Vh7BSc7E= -github.com/libp2p/go-reuseport-transport v0.0.1/go.mod h1:YkbSDrvjUVDL6b8XqriyA20obEtsW9BLkuOUyQAOCbs= +github.com/libp2p/go-reuseport-transport v0.0.2 h1:WglMwyXyBu61CMkjCCtnmqNqnjib0GIEjMiHTwR/KN4= +github.com/libp2p/go-reuseport-transport v0.0.2/go.mod h1:YkbSDrvjUVDL6b8XqriyA20obEtsW9BLkuOUyQAOCbs= github.com/libp2p/go-stream-muxer v0.0.1 h1:Ce6e2Pyu+b5MC1k3eeFtAax0pW4gc6MosYSLV05UeLw= github.com/libp2p/go-stream-muxer v0.0.1/go.mod h1:bAo8x7YkSpadMTbtTaxGVHWUQsR/l5MEaHbKaliuT14= -github.com/libp2p/go-tcp-transport v0.0.1 h1:WyvJVw2lYAnr6CU+GZZ4oCt06fvORlmvBlFX2+ZpZDM= -github.com/libp2p/go-tcp-transport v0.0.1/go.mod h1:mnjg0o0O5TmXUaUIanYPUqkW4+u6mK0en8rlpA6BBTs= +github.com/libp2p/go-stream-muxer v0.1.0 h1:3ToDXUzx8pDC6RfuOzGsUYP5roMDthbUKRdMRRhqAqY= +github.com/libp2p/go-stream-muxer v0.1.0/go.mod h1:8JAVsjeRBCWwPoZeH0W1imLOcriqXJyFvB0mR4A04sQ= +github.com/libp2p/go-stream-muxer-multistream v0.1.1 h1:DhHqb4nu1fQv/vQKeLAaZGmhLsUA4SF77IdYJiWE1d4= +github.com/libp2p/go-stream-muxer-multistream v0.1.1/go.mod h1:zmGdfkQ1AzOECIAcccoL8L//laqawOsO03zX8Sa+eGw= +github.com/libp2p/go-stream-muxer-multistream v0.2.0 h1:714bRJ4Zy9mdhyTLJ+ZKiROmAFwUHpeRidG+q7LTQOg= +github.com/libp2p/go-stream-muxer-multistream v0.2.0/go.mod h1:j9eyPol/LLRqT+GPLSxvimPhNph4sfYfMoDPd7HkzIc= +github.com/libp2p/go-tcp-transport v0.0.4 h1:2iRu994wCT/iEz62F+c60FUoSkijNEQ0q2Itc+79XlQ= +github.com/libp2p/go-tcp-transport v0.0.4/go.mod h1:+E8HvC8ezEVOxIo3V5vCK9l1y/19K427vCzQ+xHKH/o= +github.com/libp2p/go-tcp-transport v0.1.0 h1:IGhowvEqyMFknOar4FWCKSWE0zL36UFKQtiRQD60/8o= +github.com/libp2p/go-tcp-transport v0.1.0/go.mod h1:oJ8I5VXryj493DEJ7OsBieu8fcg2nHGctwtInJVpipc= github.com/libp2p/go-testutil v0.0.1 h1:Xg+O0G2HIMfHqBOBDcMS1iSZJ3GEcId4qOxCQvsGZHk= github.com/libp2p/go-testutil v0.0.1/go.mod h1:iAcJc/DKJQanJ5ws2V+u5ywdL2n12X1WbbEG+Jjy69I= -github.com/libp2p/go-ws-transport v0.0.1/go.mod h1:p3bKjDWHEgtuKKj+2OdPYs5dAPIjtpQGHF2tJfGz7Ww= +github.com/libp2p/go-testutil v0.1.0 h1:4QhjaWGO89udplblLVpgGDOQjzFlRavZOjuEnz2rLMc= +github.com/libp2p/go-testutil v0.1.0/go.mod h1:81b2n5HypcVyrCg/MJx4Wgfp/VHojytjVe/gLzZ2Ehc= +github.com/libp2p/go-ws-transport v0.0.5/go.mod h1:Qbl4BxPfXXhhd/o0wcrgoaItHqA9tnZjoFZnxykuaXU= +github.com/libp2p/go-ws-transport v0.1.0/go.mod h1:rjw1MG1LU9YDC6gzmwObkPd/Sqwhw7yT74kj3raBFuo= +github.com/libp2p/go-yamux v1.2.1/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= +github.com/libp2p/go-yamux v1.2.2/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= +github.com/libp2p/go-yamux v1.2.3 h1:xX8A36vpXb59frIzWFdEgptLMsOANMFq2K7fPRlunYI= +github.com/libp2p/go-yamux v1.2.3/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= github.com/mattn/go-colorable v0.1.1 h1:G1f5SKeVxmagw/IyvzvtZE4Gybcc4Tr1tf7I8z0XgOg= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= +github.com/mattn/go-colorable v0.1.2 h1:/bC9yWikZXAL9uJdulbSfyVNIR3n3trXl+v8+1sx8mU= +github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-isatty v0.0.5 h1:tHXDdz1cpzGaovsTB+TVB8q90WEokoVmfMqoVcrLUgw= github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/miekg/dns v1.1.4/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/mattn/go-isatty v0.0.8 h1:HLtExJ+uU2HOZ+wI0Tt5DtUDrx8yhUqDcp7fYERX4CE= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/miekg/dns v1.1.12/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0OXOcUbGjvZxxijuBwbbmlSxLiuofa+g= github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16 h1:5W7KhL8HVF3XCFOweFD3BNESdnO8ewyYTFT2R+/b8FQ= github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= +github.com/minio/sha256-simd v0.0.0-20190328051042-05b4dd3047e5/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= +github.com/minio/sha256-simd v0.1.0 h1:U41/2erhAKcmSI14xh/ZTUdBPOzDOIfS93ibzUSl8KM= +github.com/minio/sha256-simd v0.1.0/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= github.com/mr-tron/base58 v1.1.0 h1:Y51FGVJ91WBqCEabAi5OPUz38eAx8DakuAm5svLcsfQ= github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= +github.com/mr-tron/base58 v1.1.1/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= +github.com/mr-tron/base58 v1.1.2 h1:ZEw4I2EgPKDJ2iEw0cNmLB3ROrEmkOtXIkaG7wZg+78= +github.com/mr-tron/base58 v1.1.2/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= github.com/multiformats/go-base32 v0.0.3 h1:tw5+NhuwaOjJCC5Pp82QuXbrmLzWg7uxlMFp8Nq/kkI= github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= github.com/multiformats/go-multiaddr v0.0.1 h1:/QUV3VBMDI6pi6xfiw7lr6xhDWWvQKn9udPn68kLSdY= github.com/multiformats/go-multiaddr v0.0.1/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= +github.com/multiformats/go-multiaddr v0.0.2/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= +github.com/multiformats/go-multiaddr v0.0.4 h1:WgMSI84/eRLdbptXMkMWDXPjPq7SPLIgGUVm2eroyU4= +github.com/multiformats/go-multiaddr v0.0.4/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= github.com/multiformats/go-multiaddr-dns v0.0.1/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= github.com/multiformats/go-multiaddr-dns v0.0.2 h1:/Bbsgsy3R6e3jf2qBahzNHzww6usYaZ0NhNH3sqdFS8= github.com/multiformats/go-multiaddr-dns v0.0.2/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= +github.com/multiformats/go-multiaddr-fmt v0.0.1 h1:5YjeOIzbX8OTKVaN72aOzGIYW7PnrZrnkDyOfAWRSMA= +github.com/multiformats/go-multiaddr-fmt v0.0.1/go.mod h1:aBYjqL4T/7j4Qx+R73XSv/8JsgnRFlf0w2KGLCmXl3Q= github.com/multiformats/go-multiaddr-net v0.0.1 h1:76O59E3FavvHqNg7jvzWzsPSW5JSi/ek0E4eiDVbg9g= github.com/multiformats/go-multiaddr-net v0.0.1/go.mod h1:nw6HSxNmCIQH27XPGBuX+d1tnvM7ihcFwHMSstNAVUU= github.com/multiformats/go-multibase v0.0.1 h1:PN9/v21eLywrFWdFNsFKaU04kLJzuYzmrJR+ubhT9qA= github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs= github.com/multiformats/go-multihash v0.0.1 h1:HHwN1K12I+XllBCrqKnhX949Orn4oawPkegHMu2vDqQ= github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= +github.com/multiformats/go-multihash v0.0.5 h1:1wxmCvTXAifAepIMyF39vZinRw5sbqjPs/UIi93+uik= +github.com/multiformats/go-multihash v0.0.5/go.mod h1:lt/HCbqlQwlPBz7lv0sQCdtfcMtlJvakRUn/0Ual8po= github.com/multiformats/go-multistream v0.0.1 h1:JV4VfSdY9n7ECTtY59/TlSyFCzRILvYx4T4Ws8ZgihU= github.com/multiformats/go-multistream v0.0.1/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= +github.com/multiformats/go-multistream v0.0.4/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= +github.com/multiformats/go-multistream v0.1.0 h1:UpO6jrsjqs46mqAK3n6wKRYFhugss9ArzbyUzU+4wkQ= +github.com/multiformats/go-multistream v0.1.0/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= 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/ginkgo v1.8.0 h1:VkHVNpR4iVnU8XQR6DBm8BqYjN7CRzw+xKUbVVbbW9w= +github.com/onsi/ginkgo v1.8.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/onsi/gomega v1.5.0 h1:izbySO9zDPmjJ8rDjLvkA2zJHIo+HkYXHnf7eN7SSyo= +github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/opentracing/opentracing-go v1.0.2 h1:3jA2P6O1F9UOrWVpwrIo17pu01KWvNWg4X946/Y5Zwg= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +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/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/polydawn/refmt v0.0.0-20190221155625-df39d6c2d992 h1:bzMe+2coZJYHnhGgVlcQKuRy4FSny4ds8dLQjw5P1XE= github.com/polydawn/refmt v0.0.0-20190221155625-df39d6c2d992/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= +github.com/polydawn/refmt v0.0.0-20190408063855-01bf1e26dd14 h1:2m16U/rLwVaRdz7ANkHtHTodP3zTP3N451MADg64x5k= +github.com/polydawn/refmt v0.0.0-20190408063855-01bf1e26dd14/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/assertions v1.0.0 h1:UVQPSSmc3qtTi+zPPkCXvZX9VvW/xT/NsRvKfwY81a8= +github.com/smartystreets/assertions v1.0.0/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= github.com/smartystreets/goconvey v0.0.0-20190222223459-a17d461953aa h1:E+gaaifzi2xF65PbDmuKI3PhLWY6G5opMLniFq8vmXA= github.com/smartystreets/goconvey v0.0.0-20190222223459-a17d461953aa/go.mod h1:2RVY1rIf+2J2o/IM9+vPq9RzmHDSseB7FoXiSNIUsoU= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72 h1:qLC7fQah7D6K1B0ujays3HV9gkFtllcxhzImRR7ArPQ= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a h1:pa8hGb/2YqsZKovtsgrwcDH1RZhVbTKCjLp47XpqCDs= +github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a h1:/eS3yfGjQKG+9kayBkj0ip1BGhq6zJ3eaVksphxAaek= +github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a/go.mod h1:7AyxJNCJ7SBZ1MfVQCWD6Uqo2oubI2Eq2y2eqf+A5r0= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 h1:RC6RW7j+1+HkWaX/Yh71Ee5ZHaHYt7ZP4sQgUrm6cDU= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572/go.mod h1:w0SWMsp6j9O/dk4/ZpIhL+3CkG8ofA2vuv7k+ltqUMc= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= github.com/warpfork/go-wish v0.0.0-20180510122957-5ad1f5abf436 h1:qOpVTI+BrstcjTZLm2Yz/3sOnqkzj3FQoh0g+E5s3Gc= github.com/warpfork/go-wish v0.0.0-20180510122957-5ad1f5abf436/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= +github.com/warpfork/go-wish v0.0.0-20190328234359-8b3e70f8e830 h1:8kxMKmKzXXL4Ru1nyhvdms/JjWt+3YLpvRb/bAjO/y0= +github.com/warpfork/go-wish v0.0.0-20190328234359-8b3e70f8e830/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f h1:jQa4QT2UP9WYv2nzyawpKMOCl+Z/jW7djv2/J50lj9E= github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f/go.mod h1:p9UJB6dDgdPgMJZs7UjUOdulKyRr9fqkS+6JKAInPy8= github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1/go.mod h1:8UvriyWtv5Q5EOgjHaSseUEdkQfvwFv1I/In/O2M9gc= @@ -265,30 +434,33 @@ github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc h1:9lDbC6 github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc/go.mod h1:bopw91TMyo8J3tvftk8xmU2kPmlrt4nScJQZU2hE5EM= github.com/whyrusleeping/go-notifier v0.0.0-20170827234753-097c5d47330f h1:M/lL30eFZTKnomXY6huvM6G0+gVquFNf6mxghaWlFUg= github.com/whyrusleeping/go-notifier v0.0.0-20170827234753-097c5d47330f/go.mod h1:cZNvX9cFybI01GriPRMXDtczuvUhgbcYr9iCGaNlRv8= -github.com/whyrusleeping/go-smux-multiplex v3.0.16+incompatible h1:iqksILj8STw03EJQe7Laj4ubnw+ojOyik18cd5vPL1o= -github.com/whyrusleeping/go-smux-multiplex v3.0.16+incompatible/go.mod h1:34LEDbeKFZInPUrAG+bjuJmUXONGdEFW7XL0SpTY1y4= -github.com/whyrusleeping/go-smux-multistream v2.0.2+incompatible h1:BdYHctE9HJZLquG9tpTdwWcbG4FaX6tVKPGjCGgiVxo= -github.com/whyrusleeping/go-smux-multistream v2.0.2+incompatible/go.mod h1:dRWHHvc4HDQSHh9gbKEBbUZ+f2Q8iZTPG3UOGYODxSQ= -github.com/whyrusleeping/go-smux-yamux v2.0.8+incompatible h1:IGm/UP/JpEFS6D787sZnZg7RA6fZIR9c/Ms9DeAVNuk= -github.com/whyrusleeping/go-smux-yamux v2.0.8+incompatible/go.mod h1:6qHUzBXUbB9MXmw3AUdB52L8sEb/hScCqOdW2kj/wuI= -github.com/whyrusleeping/go-smux-yamux v2.0.9+incompatible h1:nVkExQ7pYlN9e45LcqTCOiDD0904fjtm0flnHZGbXkw= -github.com/whyrusleeping/go-smux-yamux v2.0.9+incompatible/go.mod h1:6qHUzBXUbB9MXmw3AUdB52L8sEb/hScCqOdW2kj/wuI= github.com/whyrusleeping/mafmt v1.2.8 h1:TCghSl5kkwEE0j+sU/gudyhVMRlpBin8fMBBHg59EbA= github.com/whyrusleeping/mafmt v1.2.8/go.mod h1:faQJFPbLSxzD9xpA02ttW/tS9vZykNvXwGvqIpk20FA= github.com/whyrusleeping/mdns v0.0.0-20180901202407-ef14215e6b30/go.mod h1:j4l84WPFclQPj320J9gp0XwNKBb3U0zt5CBqjPp22G4= github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7 h1:E9S12nwJwEOXe2d6gT6qxdvqMnNq+VnSsKPgm2ZZNds= github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7/go.mod h1:X2c0RVCI1eSUFI8eLcY3c0423ykwiUdxLJtkDvruhjI= -github.com/whyrusleeping/yamux v1.1.5 h1:4CK3aUUJQu0qpKZv5gEWJjNOQtdbdDhVVS6PJ+HimdE= -github.com/whyrusleeping/yamux v1.1.5/go.mod h1:E8LnQQ8HKx5KD29HZFUwM1PxCOdPRzGwur1mcYhXcD8= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25 h1:jsG6UpNLt9iAsb0S2AGW28DveNzzgmbXR+ENoPjUeIU= golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/net v0.0.0-20180524181706-dfa909b99c79/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f h1:R423Cnkcp5JABoeemiGEPlt9tHXFfw5kvc0yqlxRPWo= +golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8 h1:1wopBVtVdWnn03fZelqdXTqk7U7zPQCb+T4rbU9ZEoU= +golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190227160552-c95aed5357e7 h1:C2F/nMkR/9sfUTpvR3QrjBuTdvMUC/cFajkphs1YLQo= golang.org/x/net v0.0.0-20190227160552-c95aed5357e7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190522155817-f3200d17e092 h1:4QSRKanuywn15aTZvI/mIDEgPQpswuFndXpOj3rKEco= +golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190611141213-3f473d35a33a h1:+KkCgOMgnKSgenxTBoiwkMqTiouMIy/3o8RLdmSbGoY= +golang.org/x/net v0.0.0-20190611141213-3f473d35a33a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f h1:wMNYb4v58l5UBM7MYRLPG6ZhfOqbKu7X5eyFl8ZhKvA= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -298,9 +470,19 @@ golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20190228124157-a34e9553db1e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190302025703-b6889370fb10 h1:xQJI9OEiErEQ++DoXOHqEpzsGMrAv2Q2jyCpi7DmfpQ= golang.org/x/sys v0.0.0-20190302025703-b6889370fb10/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190524122548-abf6ff778158/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190524152521-dbbf3f1254d4 h1:VSJ45BzqrVgR4clSx415y1rHH7QAGhGt71J0ZmhLYrc= +golang.org/x/sys v0.0.0-20190524152521-dbbf3f1254d4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190610200419-93c9922d18ae h1:xiXzMMEQdQcric9hXtr1QU98MHunKK7OTtsoU6bYWs4= +golang.org/x/sys v0.0.0-20190610200419-93c9922d18ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= 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/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= 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= @@ -311,3 +493,5 @@ gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkep gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.1 h1:mUhvW9EsL+naU5Q3cakzfE91YhliOondGd6ZrsDBHQE= 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= diff --git a/vendor/github.com/ipfs/go-mfs/ops.go b/vendor/github.com/ipfs/go-mfs/ops.go index bf05cd44..2b290728 100644 --- a/vendor/github.com/ipfs/go-mfs/ops.go +++ b/vendor/github.com/ipfs/go-mfs/ops.go @@ -21,29 +21,29 @@ import ( // Mv moves the file or directory at 'src' to 'dst' // TODO: Document what the strings 'src' and 'dst' represent. func Mv(r *Root, src, dst string) error { - srcDir, srcFname := gopath.Split(src) + srcDirName, srcFname := gopath.Split(src) - var dstDirStr string - var filename string + var dstDirName string + var dstFname string if dst[len(dst)-1] == '/' { - dstDirStr = dst - filename = srcFname + dstDirName = dst + dstFname = srcFname } else { - dstDirStr, filename = gopath.Split(dst) + dstDirName, dstFname = gopath.Split(dst) } // get parent directories of both src and dest first - dstDir, err := lookupDir(r, dstDirStr) + dstDir, err := lookupDir(r, dstDirName) if err != nil { return err } - srcDirObj, err := lookupDir(r, srcDir) + srcDir, err := lookupDir(r, srcDirName) if err != nil { return err } - srcObj, err := srcDirObj.Child(srcFname) + srcObj, err := srcDir.Child(srcFname) if err != nil { return err } @@ -53,14 +53,14 @@ func Mv(r *Root, src, dst string) error { return err } - fsn, err := dstDir.Child(filename) + fsn, err := dstDir.Child(dstFname) if err == nil { switch n := fsn.(type) { case *File: - _ = dstDir.Unlink(filename) + _ = dstDir.Unlink(dstFname) case *Directory: dstDir = n - filename = srcFname + dstFname = srcFname default: return fmt.Errorf("unexpected type at path: %s", dst) } @@ -68,12 +68,16 @@ func Mv(r *Root, src, dst string) error { return err } - err = dstDir.AddChild(filename, nd) + err = dstDir.AddChild(dstFname, nd) if err != nil { return err } - return srcDirObj.Unlink(srcFname) + if srcDir.name == dstDir.name && srcFname == dstFname { + return nil + } + + return srcDir.Unlink(srcFname) } func lookupDir(r *Root, path string) (*Directory, error) { diff --git a/vendor/github.com/ipfs/go-path/error.go b/vendor/github.com/ipfs/go-path/error.go new file mode 100644 index 00000000..ca2e8416 --- /dev/null +++ b/vendor/github.com/ipfs/go-path/error.go @@ -0,0 +1,23 @@ +package path + +import ( + "fmt" +) + +// helper type so path parsing errors include the path +type pathError struct { + error error + path string +} + +func (e *pathError) Error() string { + return fmt.Sprintf("invalid path %q: %s", e.path, e.error) +} + +func (e *pathError) Unwrap() error { + return e.error +} + +func (e *pathError) Path() string { + return e.path +} diff --git a/vendor/github.com/ipfs/go-path/go.mod b/vendor/github.com/ipfs/go-path/go.mod index 0278fc8f..a048a15a 100644 --- a/vendor/github.com/ipfs/go-path/go.mod +++ b/vendor/github.com/ipfs/go-path/go.mod @@ -1,8 +1,8 @@ module github.com/ipfs/go-path require ( - github.com/ipfs/go-cid v0.0.1 - github.com/ipfs/go-ipld-format v0.0.1 + github.com/ipfs/go-cid v0.0.2 + github.com/ipfs/go-ipld-format v0.0.2 github.com/ipfs/go-log v0.0.1 - github.com/ipfs/go-merkledag v0.0.3 + github.com/ipfs/go-merkledag v0.0.6 ) diff --git a/vendor/github.com/ipfs/go-path/go.sum b/vendor/github.com/ipfs/go-path/go.sum index 223c1c37..3879972f 100644 --- a/vendor/github.com/ipfs/go-path/go.sum +++ b/vendor/github.com/ipfs/go-path/go.sum @@ -3,8 +3,11 @@ github.com/Kubuxu/go-os-helper v0.0.1/go.mod h1:N8B+I7vPCT80IcP58r50u4+gEEcsZETF github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32 h1:qkOC5Gd33k54tobS36cXdAzJbeHaduLtnLQQwNoIi78= github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32/go.mod h1:DrZx5ec/dmnfpw9KyYoQyYo7d0KEvTkk/5M/vbZjAr8= +github.com/btcsuite/btcd v0.0.0-20190523000118-16327141da8c h1:aEbSeNALREWXk0G7UdNhR3ayBV7tZ4M2PNmnrCAph6Q= +github.com/btcsuite/btcd v0.0.0-20190523000118-16327141da8c/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI= github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= github.com/btcsuite/btcutil v0.0.0-20190207003914-4c204d697803/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= +github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= @@ -12,16 +15,19 @@ github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtE github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= github.com/coreos/go-semver v0.2.0 h1:3Jm3tLmsgAYcjC+4Up7hJrFBPr+n7rAqYeSw/SZazuY= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-semver v0.2.1-0.20180108230905-e214231b295a/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/cskr/pubsub v1.0.2 h1:vlOzMhl6PFn60gRlTQQsIfVwaPB/B/8MziK8FhEPt/0= github.com/cskr/pubsub v1.0.2/go.mod h1:/8MzYXk/NJAz782G8RPkFzXTZVu63VotefPnR9TIRis= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= 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/dgraph-io/badger v1.5.5-0.20190226225317-8115aed38f8f/go.mod h1:VZxzAIRPHRVNRKRo6AXrX9BJegn6il06VMTZVJYCIjQ= github.com/dgryski/go-farm v0.0.0-20190104051053-3adb47b1fb0f/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/fd/go-nat v1.0.0 h1:DPyQ97sxA9ThrWYRPcWUz/z9TnpTIGRYODIQc/dy64M= -github.com/fd/go-nat v1.0.0/go.mod h1:BTBu/CKvMmOMUPkKVef1pngt2WFH/lg7E6yQnulfp6E= 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/go-check/check v0.0.0-20180628173108-788fd7840127 h1:0gkP6mzaMqkmpcJYCFOLkIBwI7xFExG03bbkOkCvUPI= @@ -31,6 +37,8 @@ github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zV github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.0 h1:kbxbvI4Un1LUWKxufD+BiE6AEExYYgkQLQmLFqA1LFk= github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0= +github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -41,27 +49,30 @@ github.com/gxed/hashland/keccakpg v0.0.1 h1:wrk3uMNaMxbXiHibbPO4S0ymqJMm41WiudyF github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfmKFJ6tItnhQ67kU= github.com/gxed/hashland/murmur3 v0.0.1 h1:SheiaIt0sda5K+8FLz952/1iWS9zrnKsEJaOJu4ZbSc= github.com/gxed/hashland/murmur3 v0.0.1/go.mod h1:KjXop02n4/ckmZSnY2+HKcLud/tcmvhST0bie/0lS48= -github.com/gxed/pubsub v0.0.0-20180201040156-26ebdf44f824 h1:TF4mX7zXpeyz/xintezebSa7ZDxAGBnqDwcoobvaz2o= -github.com/gxed/pubsub v0.0.0-20180201040156-26ebdf44f824/go.mod h1:OiEWyHgK+CWrmOlVquHaIK1vhpUJydC9m0Je6mhaiNE= github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+dAcgU= github.com/hashicorp/golang-lru v0.5.1/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-20180415215157-1395d1447324 h1:PV190X5/DzQ/tbFFG5YpT5mH6q+cHlfgqI5JuRnH9oE= -github.com/huin/goupnp v0.0.0-20180415215157-1395d1447324/go.mod h1:MZ2ZmwcBpvOoJ22IJsc7va19ZwoheaBk43rKg12SKag= +github.com/huin/goupnp v1.0.0 h1:wg75sLpL6DZqwHQN6E1Cfk6mtfzS45z8OV+ic+DtHRo= +github.com/huin/goupnp v1.0.0/go.mod h1:n9v9KO1tAxYH82qOn+UTIFQDmx5n1Zxd/ClZDMX7Bnc= +github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= github.com/ipfs/bbloom v0.0.1 h1:s7KkiBPfxCeDVo47KySjK0ACPc5GJRUxFpdyWEuDjhw= github.com/ipfs/bbloom v0.0.1/go.mod h1:oqo8CVWsJFMOZqTglBG4wydCE4IQA/G2/SEofB0rjUI= -github.com/ipfs/go-bitswap v0.0.3 h1:uFcSI9dkjUn67S7IM60vr2wA27aAvn8o9xYjaQCug3o= -github.com/ipfs/go-bitswap v0.0.3/go.mod h1:jadAZYsP/tcRMl47ZhFxhaNuDQoXawT8iHMg+iFoQbg= +github.com/ipfs/go-bitswap v0.0.9 h1:Dy0qvYlaOd2E2FOL2gApJ21qVjepJsGNNfstLrGf+0I= +github.com/ipfs/go-bitswap v0.0.9/go.mod h1:kAPf5qgn2W2DrgAcscZ3HrM9qh4pH+X8Fkk3UPrwvis= github.com/ipfs/go-block-format v0.0.1/go.mod h1:DK/YYcsSUIVAFNwo/KZCdIIbpN0ROH/baNLgayt4pFc= github.com/ipfs/go-block-format v0.0.2 h1:qPDvcP19izTjU8rgo6p7gTXZlkMkF5bz5G3fqIsSCPE= github.com/ipfs/go-block-format v0.0.2/go.mod h1:AWR46JfpcObNfg3ok2JHDUfdiHRgWhJgCQF+KIgOPJY= -github.com/ipfs/go-blockservice v0.0.3 h1:40OvwrxeudTAlUGUAKNYnNPcwQeLtXedjzTWecnUinQ= -github.com/ipfs/go-blockservice v0.0.3/go.mod h1:/NNihwTi6V2Yr6g8wBI+BSwPuURpBRMtYNGrlxZ8KuI= +github.com/ipfs/go-blockservice v0.0.7 h1:VRRVjgahs7r//MdO7yY5DJ2/i2fmkKOnxfSyfuPjTm0= +github.com/ipfs/go-blockservice v0.0.7/go.mod h1:EOfb9k/Y878ZTRY/CH0x5+ATtaipfbRhbvNSdgc/7So= github.com/ipfs/go-cid v0.0.1 h1:GBjWPktLnNyX0JiQCNFpUuUSoMw5KMyqrsejHYlILBE= github.com/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= +github.com/ipfs/go-cid v0.0.2 h1:tuuKaZPU1M6HcejsO3AcYWW8sZ8MTvyxfc4uqB4eFE8= +github.com/ipfs/go-cid v0.0.2/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= github.com/ipfs/go-datastore v0.0.1 h1:AW/KZCScnBWlSb5JbnEnLKFWXL224LBEh/9KXXOrUms= github.com/ipfs/go-datastore v0.0.1/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= +github.com/ipfs/go-datastore v0.0.5 h1:q3OfiOZV5rlsK1H5V8benjeUApRfMGs4Mrhmr6NriQo= +github.com/ipfs/go-datastore v0.0.5/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk= github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps= github.com/ipfs/go-ds-badger v0.0.2/go.mod h1:Y3QpeSFWQf6MopLTiZD+VT6IC1yZqaGmjvRcKeSGij8= @@ -79,36 +90,42 @@ github.com/ipfs/go-ipfs-exchange-interface v0.0.1 h1:LJXIo9W7CAmugqI+uofioIpRb6r github.com/ipfs/go-ipfs-exchange-interface v0.0.1/go.mod h1:c8MwfHjtQjPoDyiy9cFquVtVHkO9b9Ob3FG91qJnWCM= github.com/ipfs/go-ipfs-exchange-offline v0.0.1 h1:P56jYKZF7lDDOLx5SotVh5KFxoY6C81I1NSHW1FxGew= github.com/ipfs/go-ipfs-exchange-offline v0.0.1/go.mod h1:WhHSFCVYX36H/anEKQboAzpUws3x7UeEGkzQc3iNkM0= -github.com/ipfs/go-ipfs-flags v0.0.1 h1:OH5cEkJYL0QgA+bvD55TNG9ud8HA2Nqaav47b2c/UJk= -github.com/ipfs/go-ipfs-flags v0.0.1/go.mod h1:RnXBb9WV53GSfTrSDVK61NLTFKvWc60n+K9EgCDh+rA= github.com/ipfs/go-ipfs-pq v0.0.1 h1:zgUotX8dcAB/w/HidJh1zzc1yFq6Vm8J7T2F4itj/RU= github.com/ipfs/go-ipfs-pq v0.0.1/go.mod h1:LWIqQpqfRG3fNc5XsnIhz/wQ2XXGyugQwls7BgUmUfY= github.com/ipfs/go-ipfs-routing v0.0.1 h1:394mZeTLcbM/LDO12PneBYvkZAUA+nRnmC0lAzDXKOY= github.com/ipfs/go-ipfs-routing v0.0.1/go.mod h1:k76lf20iKFxQTjcJokbPM9iBXVXVZhcOwc360N4nuKs= github.com/ipfs/go-ipfs-util v0.0.1 h1:Wz9bL2wB2YBJqggkA4dD7oSmqB4cAnpNbGrlHJulv50= github.com/ipfs/go-ipfs-util v0.0.1/go.mod h1:spsl5z8KUnrve+73pOhSVZND1SIxPW5RyBCNzQxlJBc= -github.com/ipfs/go-ipld-cbor v0.0.1 h1:g7yh27SznWP4CUbkFgjR+WQRjEeyxCpTR4iKVmXx1wA= -github.com/ipfs/go-ipld-cbor v0.0.1/go.mod h1:RXHr8s4k0NE0TKhnrxqZC9M888QfsBN9rhS5NjfKzY8= +github.com/ipfs/go-ipld-cbor v0.0.2 h1:amzFztBQQQ69UA5+f7JRfoXF/z2l//MGfEDHVkS20+s= +github.com/ipfs/go-ipld-cbor v0.0.2/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA0AQFOn7Nc= github.com/ipfs/go-ipld-format v0.0.1 h1:HCu4eB/Gh+KD/Q0M8u888RFkorTWNIL3da4oc5dwc80= github.com/ipfs/go-ipld-format v0.0.1/go.mod h1:kyJtbkDALmFHv3QR6et67i35QzO3S0dCDnkOJhcZkms= +github.com/ipfs/go-ipld-format v0.0.2 h1:OVAGlyYT6JPZ0pEfGntFPS40lfrDmaDbQwNHEY2G9Zs= +github.com/ipfs/go-ipld-format v0.0.2/go.mod h1:4B6+FM2u9OJ9zCV+kSbgFAZlOrv1Hqbf0INGQgiKf9k= github.com/ipfs/go-log v0.0.1 h1:9XTUN/rW64BCG1YhPK9Hoy3q8nr4gOmHHBpgFdfw6Lc= github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM= -github.com/ipfs/go-merkledag v0.0.3 h1:A5DlOMzqTRDVmdgkf3dzCKCFmVWH4Zqwb0cbYXUs+Ro= -github.com/ipfs/go-merkledag v0.0.3/go.mod h1:Oc5kIXLHokkE1hWGMBHw+oxehkAaTOqtEb7Zbh6BhLA= +github.com/ipfs/go-merkledag v0.0.6 h1:rYZc0yzhO7y1cKi3Rw425a2HhEJDdLvNOWsqtmO3PF0= +github.com/ipfs/go-merkledag v0.0.6/go.mod h1:QYPdnlvkOg7GnQRofu9XZimC5ZW5Wi3bKys/4GQQfto= github.com/ipfs/go-metrics-interface v0.0.1 h1:j+cpbjYvu4R8zbleSs36gvB7jR+wsL2fGD6n0jO4kdg= github.com/ipfs/go-metrics-interface v0.0.1/go.mod h1:6s6euYU4zowdslK0GKHmqaIZ3j/b/tL7HTWtJ4VPgWY= +github.com/ipfs/go-peertaskqueue v0.0.4 h1:i0JprfjjILYcWM1xguO/1MCS8XKVxLSl+ECEVr6i8nw= +github.com/ipfs/go-peertaskqueue v0.0.4/go.mod h1:03H8fhyeMfKNFWqzYEVyMbcPUeYrqP1MX6Kd+aN+rMQ= github.com/ipfs/go-verifcid v0.0.1 h1:m2HI7zIuR5TFyQ1b79Da5N9dnnCP1vcu2QqawmWlK2E= github.com/ipfs/go-verifcid v0.0.1/go.mod h1:5Hrva5KBeIog4A+UpqlaIU+DEstipcJYQQZc0g37pY0= -github.com/jackpal/gateway v1.0.4 h1:LS5EHkLuQ6jzaHwULi0vL+JO0mU/n4yUtK8oUjHHOlM= -github.com/jackpal/gateway v1.0.4/go.mod h1:lTpwd4ACLXmpyiCTRtfiNyVnUmqT9RivzCDQetPfnjA= +github.com/jackpal/gateway v1.0.5 h1:qzXWUJfuMdlLMtt0a3Dgt+xkWQiA5itDEITVJtuSwMc= +github.com/jackpal/gateway v1.0.5/go.mod h1:lTpwd4ACLXmpyiCTRtfiNyVnUmqT9RivzCDQetPfnjA= github.com/jackpal/go-nat-pmp v1.0.1 h1:i0LektDkO1QlrTm/cSuP+PyBCDnYvjPLGl4LdWEMiaA= github.com/jackpal/go-nat-pmp v1.0.1/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= github.com/jbenet/go-cienv v0.0.0-20150120210510-1bb1476777ec h1:DQqZhhDvrTrEQ3Qod5yfavcA064e53xlQ+xajiorXgM= github.com/jbenet/go-cienv v0.0.0-20150120210510-1bb1476777ec/go.mod h1:rGaEvXB4uRSZMmzKNLoXvTu1sfx+1kv/DojUlPrSZGs= +github.com/jbenet/go-cienv v0.1.0 h1:Vc/s0QbQtoxX8MwwSLWWh+xNNZvM3Lw7NsTcHrvvhMc= +github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA= github.com/jbenet/go-temp-err-catcher v0.0.0-20150120210811-aac704a3f4f2 h1:vhC1OXXiT9R2pczegwz6moDvuRpggaroAXhPIseh57A= github.com/jbenet/go-temp-err-catcher v0.0.0-20150120210811-aac704a3f4f2/go.mod h1:8GXXJV31xl8whumTzdZsTt3RnUIiPqzkyf7mxToRCMs= github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8 h1:bspPhN+oKYFk5fcGNuQzp6IGzYQSenLEgH3s6jkXrWw= github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8/go.mod h1:Ly/wlsjFq/qrU3Rar62tu1gASgGw6chQbSh/XgIIXCY= +github.com/jbenet/goprocess v0.1.3 h1:YKyIEECS/XvcfHtBzxtjBBbWK+MbvA6dG8ASiqwvr10= +github.com/jbenet/goprocess v0.1.3/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= github.com/jtolds/gls v4.2.1+incompatible h1:fSuqC+Gmlu6l/ZYAoZzx2pyucC8Xza35fpRVWLVmUEE= @@ -116,6 +133,8 @@ github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVY github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= +github.com/koron/go-ssdp v0.0.0-20180514024734-4a0ed625a78b h1:wxtKgYHEncAU00muMD06dzLiahtGM1eouRNOzVV7tdQ= +github.com/koron/go-ssdp v0.0.0-20180514024734-4a0ed625a78b/go.mod h1:5Ky9EC2xfoUKUor0Hjgi2BJhCSXJfMOFlmyYrVKGQMk= 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= @@ -125,88 +144,144 @@ github.com/libp2p/go-addr-util v0.0.1 h1:TpTQm9cXVRVSKsYbgQ7GKc3KbbHVTnbostgGaDE github.com/libp2p/go-addr-util v0.0.1/go.mod h1:4ac6O7n9rIAKB1dnd+s8IbbMXkt+oBpzX4/+RACcnlQ= github.com/libp2p/go-buffer-pool v0.0.1 h1:9Rrn/H46cXjaA2HQ5Y8lyhOS1NhTkZ4yuEs2r3Eechg= github.com/libp2p/go-buffer-pool v0.0.1/go.mod h1:xtyIz9PMobb13WaxR6Zo1Pd1zXJKYg0a8KiIvDp3TzQ= +github.com/libp2p/go-buffer-pool v0.0.2 h1:QNK2iAFa8gjAe1SPz6mHSMuCcjs+X1wlHzeOSqcmlfs= +github.com/libp2p/go-buffer-pool v0.0.2/go.mod h1:MvaB6xw5vOrDl8rYZGLFdKAuk/hRoRZd1Vi32+RXyFM= github.com/libp2p/go-conn-security v0.0.1 h1:4kMMrqrt9EUNCNjX1xagSJC+bq16uqjMe9lk1KBMVNs= github.com/libp2p/go-conn-security v0.0.1/go.mod h1:bGmu51N0KU9IEjX7kl2PQjgZa40JQWnayTvNMgD/vyk= -github.com/libp2p/go-conn-security-multistream v0.0.1 h1:XefjAQRHcnUaxKb26RGupToucx3uU4ecbOZ3aACXlDU= -github.com/libp2p/go-conn-security-multistream v0.0.1/go.mod h1:nc9vud7inQ+d6SO0I/6dSWrdMnHnzZNHeyUQqrAJulE= +github.com/libp2p/go-conn-security-multistream v0.0.2 h1:Ykz0lnNjxk+0SdslUmlLNyrleqdpS1S/VW+dxFdt74Y= +github.com/libp2p/go-conn-security-multistream v0.0.2/go.mod h1:nc9vud7inQ+d6SO0I/6dSWrdMnHnzZNHeyUQqrAJulE= github.com/libp2p/go-flow-metrics v0.0.1 h1:0gxuFd2GuK7IIP5pKljLwps6TvcuYgvG7Atqi3INF5s= github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZxBdp967ls1g+k8= -github.com/libp2p/go-libp2p v0.0.2 h1:+jvgi0Zy3y4TKXJKApchCk3pCBPZf1T54z3+vKie3gw= -github.com/libp2p/go-libp2p v0.0.2/go.mod h1:Qu8bWqFXiocPloabFGUcVG4kk94fLvfC8mWTDdFC9wE= -github.com/libp2p/go-libp2p-autonat v0.0.2/go.mod h1:fs71q5Xk+pdnKU014o2iq1RhMs9/PMaG5zXRFNnIIT4= +github.com/libp2p/go-libp2p v0.0.30 h1:mwCWAusLhRGUzZ/VaCatsrEQTsuWExmXqVcvGBV72EQ= +github.com/libp2p/go-libp2p v0.0.30/go.mod h1:XWT8FGHlhptAv1+3V/+J5mEpzyui/5bvFsNuWYs611A= +github.com/libp2p/go-libp2p-autonat v0.0.6/go.mod h1:uZneLdOkZHro35xIhpbtTzLlgYturpu4J5+0cZK3MqE= github.com/libp2p/go-libp2p-blankhost v0.0.1 h1:/mZuuiwntNR8RywnCFlGHLKrKLYne+qciBpQXWqp5fk= github.com/libp2p/go-libp2p-blankhost v0.0.1/go.mod h1:Ibpbw/7cPPYwFb7PACIWdvxxv0t0XCCI10t7czjAjTc= -github.com/libp2p/go-libp2p-circuit v0.0.1/go.mod h1:Dqm0s/BiV63j8EEAs8hr1H5HudqvCAeXxDyic59lCwE= +github.com/libp2p/go-libp2p-circuit v0.0.9/go.mod h1:uU+IBvEQzCu953/ps7bYzC/D/R0Ho2A9LfKVVCatlqU= +github.com/libp2p/go-libp2p-core v0.0.1 h1:HSTZtFIq/W5Ue43Zw+uWZyy2Vl5WtF0zDjKN8/DT/1I= +github.com/libp2p/go-libp2p-core v0.0.1/go.mod h1:g/VxnTZ/1ygHxH3dKok7Vno1VfpvGcGip57wjTU4fco= github.com/libp2p/go-libp2p-crypto v0.0.1 h1:JNQd8CmoGTohO/akqrH16ewsqZpci2CbgYH/LmYl8gw= github.com/libp2p/go-libp2p-crypto v0.0.1/go.mod h1:yJkNyDmO341d5wwXxDUGO0LykUVT72ImHNUqh5D/dBE= -github.com/libp2p/go-libp2p-discovery v0.0.1/go.mod h1:ZkkF9xIFRLA1xCc7bstYFkd80gBGK8Fc1JqGoU2i+zI= +github.com/libp2p/go-libp2p-crypto v0.0.2/go.mod h1:eETI5OUfBnvARGOHrJz2eWNyTUxEGZnBxMcbUjfIj4I= +github.com/libp2p/go-libp2p-crypto v0.1.0 h1:k9MFy+o2zGDNGsaoZl0MA3iZ75qXxr9OOoAZF+sD5OQ= +github.com/libp2p/go-libp2p-crypto v0.1.0/go.mod h1:sPUokVISZiy+nNuTTH/TY+leRSxnFj/2GLjtOTW90hI= +github.com/libp2p/go-libp2p-discovery v0.0.5/go.mod h1:YtF20GUxjgoKZ4zmXj8j3Nb2TUSBHFlOCetzYdbZL5I= github.com/libp2p/go-libp2p-host v0.0.1 h1:dnqusU+DheGcdxrE718kG4XgHNuL2n9eEv8Rg5zy8hQ= github.com/libp2p/go-libp2p-host v0.0.1/go.mod h1:qWd+H1yuU0m5CwzAkvbSjqKairayEHdR5MMl7Cwa7Go= +github.com/libp2p/go-libp2p-host v0.0.3 h1:BB/1Z+4X0rjKP5lbQTmjEjLbDVbrcmLOlA6QDsN5/j4= +github.com/libp2p/go-libp2p-host v0.0.3/go.mod h1:Y/qPyA6C8j2coYyos1dfRm0I8+nvd4TGrDGt4tA7JR8= github.com/libp2p/go-libp2p-interface-connmgr v0.0.1 h1:Q9EkNSLAOF+u90L88qmE9z/fTdjLh8OsJwGw74mkwk4= github.com/libp2p/go-libp2p-interface-connmgr v0.0.1/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k= +github.com/libp2p/go-libp2p-interface-connmgr v0.0.4/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k= +github.com/libp2p/go-libp2p-interface-connmgr v0.0.5 h1:KG/KNYL2tYzXAfMvQN5K1aAGTYSYUMJ1prgYa2/JI1E= +github.com/libp2p/go-libp2p-interface-connmgr v0.0.5/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k= github.com/libp2p/go-libp2p-interface-pnet v0.0.1 h1:7GnzRrBTJHEsofi1ahFdPN9Si6skwXQE9UqR2S+Pkh8= github.com/libp2p/go-libp2p-interface-pnet v0.0.1/go.mod h1:el9jHpQAXK5dnTpKA4yfCNBZXvrzdOU75zz+C6ryp3k= github.com/libp2p/go-libp2p-loggables v0.0.1 h1:HVww9oAnINIxbt69LJNkxD8lnbfgteXR97Xm4p3l9ps= github.com/libp2p/go-libp2p-loggables v0.0.1/go.mod h1:lDipDlBNYbpyqyPX/KcoO+eq0sJYEVR2JgOexcivchg= github.com/libp2p/go-libp2p-metrics v0.0.1 h1:yumdPC/P2VzINdmcKZd0pciSUCpou+s0lwYCjBbzQZU= github.com/libp2p/go-libp2p-metrics v0.0.1/go.mod h1:jQJ95SXXA/K1VZi13h52WZMa9ja78zjyy5rspMsC/08= -github.com/libp2p/go-libp2p-nat v0.0.2 h1:sKI5hiCsGFhuEKdXMsF9mywQu2qhfoIGX6a+VG6zelE= -github.com/libp2p/go-libp2p-nat v0.0.2/go.mod h1:QrjXQSD5Dj4IJOdEcjHRkWTSomyxRo6HnUkf/TfQpLQ= +github.com/libp2p/go-libp2p-mplex v0.1.1 h1:lSPS1VJ36P01gGO//KgcsmSah5uoC3X9r7WY5j+iP4c= +github.com/libp2p/go-libp2p-mplex v0.1.1/go.mod h1:KUQWpGkCzfV7UIpi8SKsAVxyBgz1c9R5EvxgnwLsb/I= +github.com/libp2p/go-libp2p-nat v0.0.4 h1:+KXK324yaY701On8a0aGjTnw8467kW3ExKcqW2wwmyw= +github.com/libp2p/go-libp2p-nat v0.0.4/go.mod h1:N9Js/zVtAXqaeT99cXgTV9e75KpnWCvVOiGzlcHmBbY= github.com/libp2p/go-libp2p-net v0.0.1 h1:xJ4Vh4yKF/XKb8fd1Ev0ebAGzVjMxXzrxG2kjtU+F5Q= github.com/libp2p/go-libp2p-net v0.0.1/go.mod h1:Yt3zgmlsHOgUWSXmt5V/Jpz9upuJBE8EgNU9DrCcR8c= +github.com/libp2p/go-libp2p-net v0.0.2 h1:qP06u4TYXfl7uW/hzqPhlVVTSA2nw1B/bHBJaUnbh6M= +github.com/libp2p/go-libp2p-net v0.0.2/go.mod h1:Yt3zgmlsHOgUWSXmt5V/Jpz9upuJBE8EgNU9DrCcR8c= github.com/libp2p/go-libp2p-netutil v0.0.1 h1:LgD6+skofkOx8z6odD9+MZHKjupv3ng1u6KRhaADTnA= github.com/libp2p/go-libp2p-netutil v0.0.1/go.mod h1:GdusFvujWZI9Vt0X5BKqwWWmZFxecf9Gt03cKxm2f/Q= github.com/libp2p/go-libp2p-peer v0.0.1 h1:0qwAOljzYewINrU+Kndoc+1jAL7vzY/oY2Go4DCGfyY= github.com/libp2p/go-libp2p-peer v0.0.1/go.mod h1:nXQvOBbwVqoP+T5Y5nCjeH4sP9IX/J0AMzcDUVruVoo= +github.com/libp2p/go-libp2p-peer v0.1.1/go.mod h1:jkF12jGB4Gk/IOo+yomm+7oLWxF278F7UnrYUQ1Q8es= +github.com/libp2p/go-libp2p-peer v0.2.0 h1:EQ8kMjaCUwt/Y5uLgjT8iY2qg0mGUT0N1zUjer50DsY= +github.com/libp2p/go-libp2p-peer v0.2.0/go.mod h1:RCffaCvUyW2CJmG2gAWVqwePwW7JMgxjsHm7+J5kjWY= github.com/libp2p/go-libp2p-peerstore v0.0.1 h1:twKovq8YK5trLrd3nB7PD2Zu9JcyAIdm7Bz9yBWjhq8= github.com/libp2p/go-libp2p-peerstore v0.0.1/go.mod h1:RabLyPVJLuNQ+GFyoEkfi8H4Ti6k/HtZJ7YKgtSq+20= +github.com/libp2p/go-libp2p-peerstore v0.0.6/go.mod h1:RabLyPVJLuNQ+GFyoEkfi8H4Ti6k/HtZJ7YKgtSq+20= +github.com/libp2p/go-libp2p-peerstore v0.1.0 h1:MKh7pRNPHSh1fLPj8u/M/s/napdmeNpoi9BRy9lPN0E= +github.com/libp2p/go-libp2p-peerstore v0.1.0/go.mod h1:2CeHkQsr8svp4fZ+Oi9ykN1HBb6u0MOvdJ7YIsmcwtY= github.com/libp2p/go-libp2p-protocol v0.0.1 h1:+zkEmZ2yFDi5adpVE3t9dqh/N9TbpFWywowzeEzBbLM= github.com/libp2p/go-libp2p-protocol v0.0.1/go.mod h1:Af9n4PiruirSDjHycM1QuiMi/1VZNHYcK8cLgFJLZ4s= +github.com/libp2p/go-libp2p-protocol v0.1.0 h1:HdqhEyhg0ToCaxgMhnOmUO8snQtt/kQlcjVk3UoJU3c= +github.com/libp2p/go-libp2p-protocol v0.1.0/go.mod h1:KQPHpAabB57XQxGrXCNvbL6UEXfQqUgC/1adR2Xtflk= github.com/libp2p/go-libp2p-record v0.0.1 h1:zN7AS3X46qmwsw5JLxdDuI43cH5UYwovKxHPjKBYQxw= github.com/libp2p/go-libp2p-record v0.0.1/go.mod h1:grzqg263Rug/sRex85QrDOLntdFAymLDLm7lxMgU79Q= github.com/libp2p/go-libp2p-routing v0.0.1 h1:hPMAWktf9rYi3ME4MG48qE7dq1ofJxiQbfdvpNntjhc= github.com/libp2p/go-libp2p-routing v0.0.1/go.mod h1:N51q3yTr4Zdr7V8Jt2JIktVU+3xBBylx1MZeVA6t1Ys= -github.com/libp2p/go-libp2p-secio v0.0.1 h1:CqE/RdsizOwItdgLe632iyft/w0tshDLmZGAiKDcUAI= -github.com/libp2p/go-libp2p-secio v0.0.1/go.mod h1:IdG6iQybdcYmbTzxp4J5dwtUEDTOvZrT0opIDVNPrJs= -github.com/libp2p/go-libp2p-swarm v0.0.1 h1:Vne+hjaDwXqzgNwQ2vb2YKbnbOTyXjtS47stT66Apc4= -github.com/libp2p/go-libp2p-swarm v0.0.1/go.mod h1:mh+KZxkbd3lQnveQ3j2q60BM1Cw2mX36XXQqwfPOShs= +github.com/libp2p/go-libp2p-secio v0.0.3 h1:h3fPeDrej7bvvARnC2oSjAfcLZOaS4REZKgWCRQNpE4= +github.com/libp2p/go-libp2p-secio v0.0.3/go.mod h1:hS7HQ00MgLhRO/Wyu1bTX6ctJKhVpm+j2/S2A5UqYb0= +github.com/libp2p/go-libp2p-swarm v0.0.6 h1:gE0P/v2h+KEXtAi9YTw2UBOSODJ4m9VuuJ+ktc2LVUo= +github.com/libp2p/go-libp2p-swarm v0.0.6/go.mod h1:s5GZvzg9xXe8sbeESuFpjt8CJPTCa8mhEusweJqyFy8= +github.com/libp2p/go-libp2p-testing v0.0.1/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= +github.com/libp2p/go-libp2p-testing v0.0.2 h1:p9ySW7MFvGGs83hAAe0MPGnjy/tPjl5KyxpMkojdZ+g= +github.com/libp2p/go-libp2p-testing v0.0.2/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= github.com/libp2p/go-libp2p-transport v0.0.1/go.mod h1:UzbUs9X+PHOSw7S3ZmeOxfnwaQY5vGDzZmKPod3N3tk= -github.com/libp2p/go-libp2p-transport v0.0.4 h1:/CPHQMN75/IQwkhBxxIo6p6PtL3rwFZtlzBROT3e8mw= -github.com/libp2p/go-libp2p-transport v0.0.4/go.mod h1:StoY3sx6IqsP6XKoabsPnHCwqKXWUMWU7Rfcsubee/A= -github.com/libp2p/go-libp2p-transport-upgrader v0.0.1 h1:rNtXkY6dty46mxYOHHAZQchI7gQdJStF683FhVnei/k= -github.com/libp2p/go-libp2p-transport-upgrader v0.0.1/go.mod h1:NJpUAgQab/8K6K0m+JmZCe5RUXG10UMEx4kWe9Ipj5c= +github.com/libp2p/go-libp2p-transport v0.0.5 h1:pV6+UlRxyDpASSGD+60vMvdifSCby6JkJDfi+yUMHac= +github.com/libp2p/go-libp2p-transport v0.0.5/go.mod h1:StoY3sx6IqsP6XKoabsPnHCwqKXWUMWU7Rfcsubee/A= +github.com/libp2p/go-libp2p-transport-upgrader v0.0.4 h1:uGMOd14BL1oFlfb/cGfOxPjiTKBhzWV4aMjjoCF1Z1o= +github.com/libp2p/go-libp2p-transport-upgrader v0.0.4/go.mod h1:RGq+tupk+oj7PzL2kn/m1w6YXxcIAYJYeI90h6BGgUc= +github.com/libp2p/go-libp2p-yamux v0.1.2/go.mod h1:xUoV/RmYkg6BW/qGxA9XJyg+HzXFYkeXbnhjmnYzKp8= +github.com/libp2p/go-libp2p-yamux v0.1.3 h1:HmKvv2jWJ4GEm3iP7cEKjuw0POa6rK+Hcsu1FBKzpLc= +github.com/libp2p/go-libp2p-yamux v0.1.3/go.mod h1:VGSQVrqkh6y4nm0189qqxMtvyBft44MOYYPpYKXiVt4= github.com/libp2p/go-maddr-filter v0.0.1 h1:apvYTg0aIxxQyBX+XHKOR+0+lYhGs1Yv+JmTH9nyl5I= github.com/libp2p/go-maddr-filter v0.0.1/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= -github.com/libp2p/go-mplex v0.0.1 h1:dn2XGSrUxLtz3/8u85bGrwhUEKPX8MOF3lpmcWBZCWc= -github.com/libp2p/go-mplex v0.0.1/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0= -github.com/libp2p/go-msgio v0.0.1 h1:znj97n5FtXGCLDwe9x8jpHmY770SW4WStBGcCDh6GJw= -github.com/libp2p/go-msgio v0.0.1/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= +github.com/libp2p/go-maddr-filter v0.0.4 h1:hx8HIuuwk34KePddrp2mM5ivgPkZ09JH4AvsALRbFUs= +github.com/libp2p/go-maddr-filter v0.0.4/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= +github.com/libp2p/go-mplex v0.0.3/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0= +github.com/libp2p/go-mplex v0.0.4 h1:043XJ3Zr7/Oz5cfyUaJwxUZyP02TngTpt4oq8R5UizQ= +github.com/libp2p/go-mplex v0.0.4/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0= +github.com/libp2p/go-msgio v0.0.2 h1:ivPvEKHxmVkTClHzg6RXTYHqaJQ0V9cDbq+6lKb3UV0= +github.com/libp2p/go-msgio v0.0.2/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= +github.com/libp2p/go-nat v0.0.3 h1:l6fKV+p0Xa354EqQOQP+d8CivdLM4kl5GxC1hSc/UeI= +github.com/libp2p/go-nat v0.0.3/go.mod h1:88nUEt0k0JD45Bk93NIwDqjlhiOwOoV36GchpcVc1yI= github.com/libp2p/go-reuseport v0.0.1 h1:7PhkfH73VXfPJYKQ6JwS5I/eVcoyYi9IMNGc6FWpFLw= github.com/libp2p/go-reuseport v0.0.1/go.mod h1:jn6RmB1ufnQwl0Q1f+YxAj8isJgDCQzaaxIFYDhcYEA= -github.com/libp2p/go-reuseport-transport v0.0.1 h1:UIRneNxLDmEGNjGHpIiWzSWkZ5bhxMCP9x3Vh7BSc7E= -github.com/libp2p/go-reuseport-transport v0.0.1/go.mod h1:YkbSDrvjUVDL6b8XqriyA20obEtsW9BLkuOUyQAOCbs= +github.com/libp2p/go-reuseport-transport v0.0.2 h1:WglMwyXyBu61CMkjCCtnmqNqnjib0GIEjMiHTwR/KN4= +github.com/libp2p/go-reuseport-transport v0.0.2/go.mod h1:YkbSDrvjUVDL6b8XqriyA20obEtsW9BLkuOUyQAOCbs= github.com/libp2p/go-stream-muxer v0.0.1 h1:Ce6e2Pyu+b5MC1k3eeFtAax0pW4gc6MosYSLV05UeLw= github.com/libp2p/go-stream-muxer v0.0.1/go.mod h1:bAo8x7YkSpadMTbtTaxGVHWUQsR/l5MEaHbKaliuT14= -github.com/libp2p/go-tcp-transport v0.0.1 h1:WyvJVw2lYAnr6CU+GZZ4oCt06fvORlmvBlFX2+ZpZDM= -github.com/libp2p/go-tcp-transport v0.0.1/go.mod h1:mnjg0o0O5TmXUaUIanYPUqkW4+u6mK0en8rlpA6BBTs= +github.com/libp2p/go-stream-muxer v0.1.0 h1:3ToDXUzx8pDC6RfuOzGsUYP5roMDthbUKRdMRRhqAqY= +github.com/libp2p/go-stream-muxer v0.1.0/go.mod h1:8JAVsjeRBCWwPoZeH0W1imLOcriqXJyFvB0mR4A04sQ= +github.com/libp2p/go-stream-muxer-multistream v0.1.1 h1:DhHqb4nu1fQv/vQKeLAaZGmhLsUA4SF77IdYJiWE1d4= +github.com/libp2p/go-stream-muxer-multistream v0.1.1/go.mod h1:zmGdfkQ1AzOECIAcccoL8L//laqawOsO03zX8Sa+eGw= +github.com/libp2p/go-tcp-transport v0.0.4 h1:2iRu994wCT/iEz62F+c60FUoSkijNEQ0q2Itc+79XlQ= +github.com/libp2p/go-tcp-transport v0.0.4/go.mod h1:+E8HvC8ezEVOxIo3V5vCK9l1y/19K427vCzQ+xHKH/o= github.com/libp2p/go-testutil v0.0.1 h1:Xg+O0G2HIMfHqBOBDcMS1iSZJ3GEcId4qOxCQvsGZHk= github.com/libp2p/go-testutil v0.0.1/go.mod h1:iAcJc/DKJQanJ5ws2V+u5ywdL2n12X1WbbEG+Jjy69I= -github.com/libp2p/go-ws-transport v0.0.1/go.mod h1:p3bKjDWHEgtuKKj+2OdPYs5dAPIjtpQGHF2tJfGz7Ww= +github.com/libp2p/go-ws-transport v0.0.5/go.mod h1:Qbl4BxPfXXhhd/o0wcrgoaItHqA9tnZjoFZnxykuaXU= +github.com/libp2p/go-yamux v1.2.1/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= +github.com/libp2p/go-yamux v1.2.2/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= +github.com/libp2p/go-yamux v1.2.3 h1:xX8A36vpXb59frIzWFdEgptLMsOANMFq2K7fPRlunYI= +github.com/libp2p/go-yamux v1.2.3/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= github.com/mattn/go-colorable v0.1.1 h1:G1f5SKeVxmagw/IyvzvtZE4Gybcc4Tr1tf7I8z0XgOg= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= +github.com/mattn/go-colorable v0.1.2 h1:/bC9yWikZXAL9uJdulbSfyVNIR3n3trXl+v8+1sx8mU= +github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-isatty v0.0.5 h1:tHXDdz1cpzGaovsTB+TVB8q90WEokoVmfMqoVcrLUgw= github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/miekg/dns v1.1.4/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/mattn/go-isatty v0.0.8 h1:HLtExJ+uU2HOZ+wI0Tt5DtUDrx8yhUqDcp7fYERX4CE= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/miekg/dns v1.1.12/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0OXOcUbGjvZxxijuBwbbmlSxLiuofa+g= github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16 h1:5W7KhL8HVF3XCFOweFD3BNESdnO8ewyYTFT2R+/b8FQ= github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= +github.com/minio/sha256-simd v0.0.0-20190328051042-05b4dd3047e5/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= +github.com/minio/sha256-simd v0.1.0 h1:U41/2erhAKcmSI14xh/ZTUdBPOzDOIfS93ibzUSl8KM= +github.com/minio/sha256-simd v0.1.0/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= github.com/mr-tron/base58 v1.1.0 h1:Y51FGVJ91WBqCEabAi5OPUz38eAx8DakuAm5svLcsfQ= github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= +github.com/mr-tron/base58 v1.1.1/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= +github.com/mr-tron/base58 v1.1.2 h1:ZEw4I2EgPKDJ2iEw0cNmLB3ROrEmkOtXIkaG7wZg+78= +github.com/mr-tron/base58 v1.1.2/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= github.com/multiformats/go-base32 v0.0.3 h1:tw5+NhuwaOjJCC5Pp82QuXbrmLzWg7uxlMFp8Nq/kkI= github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= github.com/multiformats/go-multiaddr v0.0.1 h1:/QUV3VBMDI6pi6xfiw7lr6xhDWWvQKn9udPn68kLSdY= github.com/multiformats/go-multiaddr v0.0.1/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= +github.com/multiformats/go-multiaddr v0.0.2/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= +github.com/multiformats/go-multiaddr v0.0.4 h1:WgMSI84/eRLdbptXMkMWDXPjPq7SPLIgGUVm2eroyU4= +github.com/multiformats/go-multiaddr v0.0.4/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= github.com/multiformats/go-multiaddr-dns v0.0.1/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= github.com/multiformats/go-multiaddr-dns v0.0.2 h1:/Bbsgsy3R6e3jf2qBahzNHzww6usYaZ0NhNH3sqdFS8= github.com/multiformats/go-multiaddr-dns v0.0.2/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= @@ -216,15 +291,26 @@ github.com/multiformats/go-multibase v0.0.1 h1:PN9/v21eLywrFWdFNsFKaU04kLJzuYzmr github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs= github.com/multiformats/go-multihash v0.0.1 h1:HHwN1K12I+XllBCrqKnhX949Orn4oawPkegHMu2vDqQ= github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= +github.com/multiformats/go-multihash v0.0.5 h1:1wxmCvTXAifAepIMyF39vZinRw5sbqjPs/UIi93+uik= +github.com/multiformats/go-multihash v0.0.5/go.mod h1:lt/HCbqlQwlPBz7lv0sQCdtfcMtlJvakRUn/0Ual8po= github.com/multiformats/go-multistream v0.0.1 h1:JV4VfSdY9n7ECTtY59/TlSyFCzRILvYx4T4Ws8ZgihU= github.com/multiformats/go-multistream v0.0.1/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= +github.com/multiformats/go-multistream v0.0.4/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= +github.com/multiformats/go-multistream v0.1.0 h1:UpO6jrsjqs46mqAK3n6wKRYFhugss9ArzbyUzU+4wkQ= +github.com/multiformats/go-multistream v0.1.0/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= 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/ginkgo v1.8.0 h1:VkHVNpR4iVnU8XQR6DBm8BqYjN7CRzw+xKUbVVbbW9w= +github.com/onsi/ginkgo v1.8.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/onsi/gomega v1.5.0 h1:izbySO9zDPmjJ8rDjLvkA2zJHIo+HkYXHnf7eN7SSyo= +github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/opentracing/opentracing-go v1.0.2 h1:3jA2P6O1F9UOrWVpwrIo17pu01KWvNWg4X946/Y5Zwg= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +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/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= @@ -235,6 +321,12 @@ github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykE github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v0.0.0-20190222223459-a17d461953aa h1:E+gaaifzi2xF65PbDmuKI3PhLWY6G5opMLniFq8vmXA= github.com/smartystreets/goconvey v0.0.0-20190222223459-a17d461953aa/go.mod h1:2RVY1rIf+2J2o/IM9+vPq9RzmHDSseB7FoXiSNIUsoU= +github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a h1:/eS3yfGjQKG+9kayBkj0ip1BGhq6zJ3eaVksphxAaek= +github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a/go.mod h1:7AyxJNCJ7SBZ1MfVQCWD6Uqo2oubI2Eq2y2eqf+A5r0= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 h1:RC6RW7j+1+HkWaX/Yh71Ee5ZHaHYt7ZP4sQgUrm6cDU= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572/go.mod h1:w0SWMsp6j9O/dk4/ZpIhL+3CkG8ofA2vuv7k+ltqUMc= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= @@ -246,30 +338,27 @@ github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc h1:9lDbC6 github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc/go.mod h1:bopw91TMyo8J3tvftk8xmU2kPmlrt4nScJQZU2hE5EM= github.com/whyrusleeping/go-notifier v0.0.0-20170827234753-097c5d47330f h1:M/lL30eFZTKnomXY6huvM6G0+gVquFNf6mxghaWlFUg= github.com/whyrusleeping/go-notifier v0.0.0-20170827234753-097c5d47330f/go.mod h1:cZNvX9cFybI01GriPRMXDtczuvUhgbcYr9iCGaNlRv8= -github.com/whyrusleeping/go-smux-multiplex v3.0.16+incompatible h1:iqksILj8STw03EJQe7Laj4ubnw+ojOyik18cd5vPL1o= -github.com/whyrusleeping/go-smux-multiplex v3.0.16+incompatible/go.mod h1:34LEDbeKFZInPUrAG+bjuJmUXONGdEFW7XL0SpTY1y4= -github.com/whyrusleeping/go-smux-multistream v2.0.2+incompatible h1:BdYHctE9HJZLquG9tpTdwWcbG4FaX6tVKPGjCGgiVxo= -github.com/whyrusleeping/go-smux-multistream v2.0.2+incompatible/go.mod h1:dRWHHvc4HDQSHh9gbKEBbUZ+f2Q8iZTPG3UOGYODxSQ= -github.com/whyrusleeping/go-smux-yamux v2.0.8+incompatible h1:IGm/UP/JpEFS6D787sZnZg7RA6fZIR9c/Ms9DeAVNuk= -github.com/whyrusleeping/go-smux-yamux v2.0.8+incompatible/go.mod h1:6qHUzBXUbB9MXmw3AUdB52L8sEb/hScCqOdW2kj/wuI= -github.com/whyrusleeping/go-smux-yamux v2.0.9+incompatible h1:nVkExQ7pYlN9e45LcqTCOiDD0904fjtm0flnHZGbXkw= -github.com/whyrusleeping/go-smux-yamux v2.0.9+incompatible/go.mod h1:6qHUzBXUbB9MXmw3AUdB52L8sEb/hScCqOdW2kj/wuI= github.com/whyrusleeping/mafmt v1.2.8 h1:TCghSl5kkwEE0j+sU/gudyhVMRlpBin8fMBBHg59EbA= github.com/whyrusleeping/mafmt v1.2.8/go.mod h1:faQJFPbLSxzD9xpA02ttW/tS9vZykNvXwGvqIpk20FA= github.com/whyrusleeping/mdns v0.0.0-20180901202407-ef14215e6b30/go.mod h1:j4l84WPFclQPj320J9gp0XwNKBb3U0zt5CBqjPp22G4= github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7 h1:E9S12nwJwEOXe2d6gT6qxdvqMnNq+VnSsKPgm2ZZNds= github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7/go.mod h1:X2c0RVCI1eSUFI8eLcY3c0423ykwiUdxLJtkDvruhjI= -github.com/whyrusleeping/yamux v1.1.5 h1:4CK3aUUJQu0qpKZv5gEWJjNOQtdbdDhVVS6PJ+HimdE= -github.com/whyrusleeping/yamux v1.1.5/go.mod h1:E8LnQQ8HKx5KD29HZFUwM1PxCOdPRzGwur1mcYhXcD8= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25 h1:jsG6UpNLt9iAsb0S2AGW28DveNzzgmbXR+ENoPjUeIU= golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/net v0.0.0-20180524181706-dfa909b99c79/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f h1:R423Cnkcp5JABoeemiGEPlt9tHXFfw5kvc0yqlxRPWo= +golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190227160552-c95aed5357e7 h1:C2F/nMkR/9sfUTpvR3QrjBuTdvMUC/cFajkphs1YLQo= golang.org/x/net v0.0.0-20190227160552-c95aed5357e7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190522155817-f3200d17e092 h1:4QSRKanuywn15aTZvI/mIDEgPQpswuFndXpOj3rKEco= +golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f h1:wMNYb4v58l5UBM7MYRLPG6ZhfOqbKu7X5eyFl8ZhKvA= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -278,9 +367,16 @@ golang.org/x/sys v0.0.0-20190219092855-153ac476189d/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190228124157-a34e9553db1e h1:ZytStCyV048ZqDsWHiYDdoI2Vd4msMcrDECFxS+tL9c= golang.org/x/sys v0.0.0-20190228124157-a34e9553db1e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190524122548-abf6ff778158/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190524152521-dbbf3f1254d4 h1:VSJ45BzqrVgR4clSx415y1rHH7QAGhGt71J0ZmhLYrc= +golang.org/x/sys v0.0.0-20190524152521-dbbf3f1254d4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= 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/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= 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= @@ -291,3 +387,5 @@ gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkep gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.1 h1:mUhvW9EsL+naU5Q3cakzfE91YhliOondGd6ZrsDBHQE= 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= diff --git a/vendor/github.com/ipfs/go-path/path.go b/vendor/github.com/ipfs/go-path/path.go index b0d6cdcd..18a85a90 100644 --- a/vendor/github.com/ipfs/go-path/path.go +++ b/vendor/github.com/ipfs/go-path/path.go @@ -2,23 +2,13 @@ package path import ( - "errors" + "fmt" "path" "strings" cid "github.com/ipfs/go-cid" ) -var ( - // ErrBadPath is returned when a given path is incorrectly formatted - ErrBadPath = errors.New("invalid 'ipfs ref' path") - - // ErrNoComponents is used when Paths after a protocol - // do not contain at least one component - ErrNoComponents = errors.New( - "path must contain at least one component") -) - // A Path represents an ipfs content path: // * //path/to/file // * /ipfs/ @@ -107,33 +97,33 @@ func ParsePath(txt string) (Path, error) { // we expect this to start with a hash, and be an 'ipfs' path if parts[0] != "" { if _, err := cid.Decode(parts[0]); err != nil { - return "", ErrBadPath + return "", &pathError{error: err, path: txt} } // The case when the path starts with hash without a protocol prefix return Path("/ipfs/" + txt), nil } if len(parts) < 3 { - return "", ErrBadPath + return "", &pathError{error: fmt.Errorf("path does not begin with '/'"), path: txt} } //TODO: make this smarter switch parts[1] { case "ipfs", "ipld": if parts[2] == "" { - return "", ErrNoComponents + return "", &pathError{error: fmt.Errorf("not enough path components"), path: txt} } // Validate Cid. _, err := cid.Decode(parts[2]) if err != nil { - return "", err + return "", &pathError{error: fmt.Errorf("invalid CID: %s", err), path: txt} } case "ipns": if parts[2] == "" { - return "", ErrNoComponents + return "", &pathError{error: fmt.Errorf("not enough path components"), path: txt} } default: - return "", ErrBadPath + return "", &pathError{error: fmt.Errorf("unknown namespace %q", parts[1]), path: txt} } return Path(txt), nil @@ -142,12 +132,12 @@ func ParsePath(txt string) (Path, error) { // ParseCidToPath takes a CID in string form and returns a valid ipfs Path. func ParseCidToPath(txt string) (Path, error) { if txt == "" { - return "", ErrNoComponents + return "", &pathError{error: fmt.Errorf("empty"), path: txt} } c, err := cid.Decode(txt) if err != nil { - return "", err + return "", &pathError{error: err, path: txt} } return FromCid(c), nil @@ -179,13 +169,13 @@ func SplitAbsPath(fpath Path) (cid.Cid, []string, error) { // if nothing, bail. if len(parts) == 0 { - return cid.Cid{}, nil, ErrNoComponents + return cid.Cid{}, nil, &pathError{error: fmt.Errorf("empty"), path: string(fpath)} } c, err := cid.Decode(parts[0]) // first element in the path is a cid if err != nil { - return cid.Cid{}, nil, err + return cid.Cid{}, nil, &pathError{error: fmt.Errorf("invalid CID: %s", err), path: string(fpath)} } return c, parts[1:], nil diff --git a/vendor/github.com/libp2p/go-conn-security/.travis.yml b/vendor/github.com/ipfs/go-peertaskqueue/.travis.yml similarity index 94% rename from vendor/github.com/libp2p/go-conn-security/.travis.yml rename to vendor/github.com/ipfs/go-peertaskqueue/.travis.yml index 4cfe98c2..c8102833 100644 --- a/vendor/github.com/libp2p/go-conn-security/.travis.yml +++ b/vendor/github.com/ipfs/go-peertaskqueue/.travis.yml @@ -10,7 +10,6 @@ env: global: - GOTFLAGS="-race" matrix: - - BUILD_DEPTYPE=gx - BUILD_DEPTYPE=gomod @@ -30,3 +29,5 @@ cache: notifications: email: false + + diff --git a/vendor/github.com/ipfs/go-peertaskqueue/COPYRIGHT b/vendor/github.com/ipfs/go-peertaskqueue/COPYRIGHT new file mode 100644 index 00000000..771e6f7c --- /dev/null +++ b/vendor/github.com/ipfs/go-peertaskqueue/COPYRIGHT @@ -0,0 +1,3 @@ +Copyright 2019. Protocol Labs, Inc. + +This library is dual-licensed under Apache 2.0 and MIT terms. diff --git a/vendor/github.com/whyrusleeping/cbor/LICENSE b/vendor/github.com/ipfs/go-peertaskqueue/LICENSE-APACHE similarity index 93% rename from vendor/github.com/whyrusleeping/cbor/LICENSE rename to vendor/github.com/ipfs/go-peertaskqueue/LICENSE-APACHE index 6286cbbb..54651436 100644 --- a/vendor/github.com/whyrusleeping/cbor/LICENSE +++ b/vendor/github.com/ipfs/go-peertaskqueue/LICENSE-APACHE @@ -1,4 +1,4 @@ -Copyright 2014-2015 Brian Olson +Copyright 2019. Protocol Labs, Inc. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/github.com/ipfs/go-ipfs-flags/LICENSE b/vendor/github.com/ipfs/go-peertaskqueue/LICENSE-MIT similarity index 96% rename from vendor/github.com/ipfs/go-ipfs-flags/LICENSE rename to vendor/github.com/ipfs/go-peertaskqueue/LICENSE-MIT index e4224df5..ea532a83 100644 --- a/vendor/github.com/ipfs/go-ipfs-flags/LICENSE +++ b/vendor/github.com/ipfs/go-peertaskqueue/LICENSE-MIT @@ -1,6 +1,4 @@ -MIT License - -Copyright (c) 2018 IPFS +Copyright 2019. Protocol Labs, 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 diff --git a/vendor/github.com/ipfs/go-peertaskqueue/go.mod b/vendor/github.com/ipfs/go-peertaskqueue/go.mod new file mode 100644 index 00000000..e093129c --- /dev/null +++ b/vendor/github.com/ipfs/go-peertaskqueue/go.mod @@ -0,0 +1,9 @@ +module github.com/ipfs/go-peertaskqueue + +go 1.12 + +require ( + github.com/ipfs/go-ipfs-pq v0.0.1 + github.com/libp2p/go-libp2p-core v0.0.1 + github.com/multiformats/go-multihash v0.0.5 // indirect +) diff --git a/vendor/github.com/ipfs/go-peertaskqueue/go.sum b/vendor/github.com/ipfs/go-peertaskqueue/go.sum new file mode 100644 index 00000000..9249ebfb --- /dev/null +++ b/vendor/github.com/ipfs/go-peertaskqueue/go.sum @@ -0,0 +1,84 @@ +github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= +github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32 h1:qkOC5Gd33k54tobS36cXdAzJbeHaduLtnLQQwNoIi78= +github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32/go.mod h1:DrZx5ec/dmnfpw9KyYoQyYo7d0KEvTkk/5M/vbZjAr8= +github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= +github.com/btcsuite/btcutil v0.0.0-20190207003914-4c204d697803/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= +github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= +github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= +github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= +github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= +github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495 h1:6IyqGr3fnd0tM3YxipK27TUskaOVUjU2nG45yzwcQKY= +github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE= +github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/gxed/hashland/keccakpg v0.0.1 h1:wrk3uMNaMxbXiHibbPO4S0ymqJMm41WiudyFSs7UnsU= +github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfmKFJ6tItnhQ67kU= +github.com/gxed/hashland/murmur3 v0.0.1 h1:SheiaIt0sda5K+8FLz952/1iWS9zrnKsEJaOJu4ZbSc= +github.com/gxed/hashland/murmur3 v0.0.1/go.mod h1:KjXop02n4/ckmZSnY2+HKcLud/tcmvhST0bie/0lS48= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= +github.com/ipfs/go-ipfs-pq v0.0.1 h1:zgUotX8dcAB/w/HidJh1zzc1yFq6Vm8J7T2F4itj/RU= +github.com/ipfs/go-ipfs-pq v0.0.1/go.mod h1:LWIqQpqfRG3fNc5XsnIhz/wQ2XXGyugQwls7BgUmUfY= +github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8/go.mod h1:Ly/wlsjFq/qrU3Rar62tu1gASgGw6chQbSh/XgIIXCY= +github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= +github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= +github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZxBdp967ls1g+k8= +github.com/libp2p/go-libp2p-core v0.0.1 h1:HSTZtFIq/W5Ue43Zw+uWZyy2Vl5WtF0zDjKN8/DT/1I= +github.com/libp2p/go-libp2p-core v0.0.1/go.mod h1:g/VxnTZ/1ygHxH3dKok7Vno1VfpvGcGip57wjTU4fco= +github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0OXOcUbGjvZxxijuBwbbmlSxLiuofa+g= +github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= +github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16 h1:5W7KhL8HVF3XCFOweFD3BNESdnO8ewyYTFT2R+/b8FQ= +github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= +github.com/minio/sha256-simd v0.0.0-20190328051042-05b4dd3047e5 h1:l16XLUUJ34wIz+RIvLhSwGvLvKyy+W598b135bJN6mg= +github.com/minio/sha256-simd v0.0.0-20190328051042-05b4dd3047e5/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= +github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= +github.com/mr-tron/base58 v1.1.1 h1:OJIdWOWYe2l5PQNgimGtuwHY8nDskvJ5vvs//YnzRLs= +github.com/mr-tron/base58 v1.1.1/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= +github.com/mr-tron/base58 v1.1.2 h1:ZEw4I2EgPKDJ2iEw0cNmLB3ROrEmkOtXIkaG7wZg+78= +github.com/mr-tron/base58 v1.1.2/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= +github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= +github.com/multiformats/go-multiaddr v0.0.2 h1:RBysRCv5rv3FWlhKWKoXv8tnsCUpEpIZpCmqAGZos2s= +github.com/multiformats/go-multiaddr v0.0.2/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= +github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs= +github.com/multiformats/go-multihash v0.0.1 h1:HHwN1K12I+XllBCrqKnhX949Orn4oawPkegHMu2vDqQ= +github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= +github.com/multiformats/go-multihash v0.0.5 h1:1wxmCvTXAifAepIMyF39vZinRw5sbqjPs/UIi93+uik= +github.com/multiformats/go-multihash v0.0.5/go.mod h1:lt/HCbqlQwlPBz7lv0sQCdtfcMtlJvakRUn/0Ual8po= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a h1:/eS3yfGjQKG+9kayBkj0ip1BGhq6zJ3eaVksphxAaek= +github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a/go.mod h1:7AyxJNCJ7SBZ1MfVQCWD6Uqo2oubI2Eq2y2eqf+A5r0= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 h1:RC6RW7j+1+HkWaX/Yh71Ee5ZHaHYt7ZP4sQgUrm6cDU= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572/go.mod h1:w0SWMsp6j9O/dk4/ZpIhL+3CkG8ofA2vuv7k+ltqUMc= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b h1:+/WWzjwW6gidDJnMKWLKLX1gxn7irUTF1fLpQovfQ5M= +golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734 h1:p/H982KKEjUnLJkM3tt/LemDnOc1GiZL5FCVlORJ5zo= +golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/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-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190219092855-153ac476189d h1:Z0Ahzd7HltpJtjAHHxX8QFP3j1yYgiuvjbjRzDj/KH0= +golang.org/x/sys v0.0.0-20190219092855-153ac476189d/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d h1:+R4KGOnez64A81RvjARKc4UT5/tI9ujCIVX+P5KiHuI= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/vendor/github.com/ipfs/go-peertaskqueue/peertask/peertask.go b/vendor/github.com/ipfs/go-peertaskqueue/peertask/peertask.go new file mode 100644 index 00000000..a91b4ecd --- /dev/null +++ b/vendor/github.com/ipfs/go-peertaskqueue/peertask/peertask.go @@ -0,0 +1,97 @@ +package peertask + +import ( + "time" + + pq "github.com/ipfs/go-ipfs-pq" + peer "github.com/libp2p/go-libp2p-core/peer" +) + +// FIFOCompare is a basic task comparator that returns tasks in the order created. +var FIFOCompare = func(a, b *TaskBlock) bool { + return a.created.Before(b.created) +} + +// PriorityCompare respects the target peer's task priority. For tasks involving +// different peers, the oldest task is prioritized. +var PriorityCompare = func(a, b *TaskBlock) bool { + if a.Target == b.Target { + return a.Priority > b.Priority + } + return FIFOCompare(a, b) +} + +// WrapCompare wraps a TaskBlock comparison function so it can be used as +// comparison for a priority queue +func WrapCompare(f func(a, b *TaskBlock) bool) func(a, b pq.Elem) bool { + return func(a, b pq.Elem) bool { + return f(a.(*TaskBlock), b.(*TaskBlock)) + } +} + +// Identifier is a unique identifier for a task. It's used by the client library +// to act on a task once it exits the queue. +type Identifier interface{} + +// Task is a single task to be executed as part of a task block. +type Task struct { + Identifier Identifier + Priority int +} + +// TaskBlock is a block of tasks to execute on a single peer. +type TaskBlock struct { + Tasks []Task + Priority int + Target peer.ID + + // A callback to signal that this task block has been completed + Done func([]Task) + + // toPrune are the tasks that have already been taken care of as part of + // a different task block which can be removed from the task block. + toPrune map[Identifier]struct{} + created time.Time // created marks the time that the task was added to the queue + index int // book-keeping field used by the pq container +} + +// NewTaskBlock creates a new task block with the given tasks, priority, target +// peer, and task completion function. +func NewTaskBlock(tasks []Task, priority int, target peer.ID, done func([]Task)) *TaskBlock { + return &TaskBlock{ + Tasks: tasks, + Priority: priority, + Target: target, + Done: done, + toPrune: make(map[Identifier]struct{}, len(tasks)), + created: time.Now(), + } +} + +// MarkPrunable marks any tasks with the given identifier as prunable at the time +// the task block is pulled of the queue to execute (because they've already been removed). +func (pt *TaskBlock) MarkPrunable(identifier Identifier) { + pt.toPrune[identifier] = struct{}{} +} + +// PruneTasks removes all tasks previously marked as prunable from the lists of +// tasks in the block +func (pt *TaskBlock) PruneTasks() { + newTasks := make([]Task, 0, len(pt.Tasks)-len(pt.toPrune)) + for _, task := range pt.Tasks { + if _, ok := pt.toPrune[task.Identifier]; !ok { + newTasks = append(newTasks, task) + } + } + pt.Tasks = newTasks +} + +// Index implements pq.Elem. +func (pt *TaskBlock) Index() int { + return pt.index +} + +// SetIndex implements pq.Elem. +func (pt *TaskBlock) SetIndex(i int) { + pt.index = i +} diff --git a/vendor/github.com/ipfs/go-peertaskqueue/peertaskqueue.go b/vendor/github.com/ipfs/go-peertaskqueue/peertaskqueue.go new file mode 100644 index 00000000..40200bdc --- /dev/null +++ b/vendor/github.com/ipfs/go-peertaskqueue/peertaskqueue.go @@ -0,0 +1,220 @@ +package peertaskqueue + +import ( + "sync" + + pq "github.com/ipfs/go-ipfs-pq" + "github.com/ipfs/go-peertaskqueue/peertask" + "github.com/ipfs/go-peertaskqueue/peertracker" + peer "github.com/libp2p/go-libp2p-core/peer" +) + +type peerTaskQueueEvent int + +const ( + peerAdded = peerTaskQueueEvent(1) + peerRemoved = peerTaskQueueEvent(2) +) + +type hookFunc func(p peer.ID, event peerTaskQueueEvent) + +// PeerTaskQueue is a prioritized list of tasks to be executed on peers. +// The queue puts tasks on in blocks, then alternates between peers (roughly) +// to execute the block with the highest priority, or otherwise the one added +// first if priorities are equal. +type PeerTaskQueue struct { + lock sync.Mutex + pQueue pq.PQ + peerTrackers map[peer.ID]*peertracker.PeerTracker + frozenPeers map[peer.ID]struct{} + hooks []hookFunc + ignoreFreezing bool +} + +// Option is a function that configures the peer task queue +type Option func(*PeerTaskQueue) Option + +func chain(firstOption Option, secondOption Option) Option { + return func(ptq *PeerTaskQueue) Option { + firstReverse := firstOption(ptq) + secondReverse := secondOption(ptq) + return chain(secondReverse, firstReverse) + } +} + +// IgnoreFreezing is an option that can make the task queue ignore freezing and unfreezing +func IgnoreFreezing(ignoreFreezing bool) Option { + return func(ptq *PeerTaskQueue) Option { + previous := ptq.ignoreFreezing + ptq.ignoreFreezing = ignoreFreezing + return IgnoreFreezing(previous) + } +} + +func removeHook(hook hookFunc) Option { + return func(ptq *PeerTaskQueue) Option { + for i, testHook := range ptq.hooks { + if &hook == &testHook { + ptq.hooks = append(ptq.hooks[:i], ptq.hooks[i+1:]...) + break + } + } + return addHook(hook) + } +} + +func addHook(hook hookFunc) Option { + return func(ptq *PeerTaskQueue) Option { + ptq.hooks = append(ptq.hooks, hook) + return removeHook(hook) + } +} + +// OnPeerAddedHook adds a hook function that gets called whenever the ptq adds a new peer +func OnPeerAddedHook(onPeerAddedHook func(p peer.ID)) Option { + hook := func(p peer.ID, event peerTaskQueueEvent) { + if event == peerAdded { + onPeerAddedHook(p) + } + } + return addHook(hook) +} + +// OnPeerRemovedHook adds a hook function that gets called whenever the ptq adds a new peer +func OnPeerRemovedHook(onPeerRemovedHook func(p peer.ID)) Option { + hook := func(p peer.ID, event peerTaskQueueEvent) { + if event == peerRemoved { + onPeerRemovedHook(p) + } + } + return addHook(hook) +} + +// New creates a new PeerTaskQueue +func New(options ...Option) *PeerTaskQueue { + ptq := &PeerTaskQueue{ + peerTrackers: make(map[peer.ID]*peertracker.PeerTracker), + frozenPeers: make(map[peer.ID]struct{}), + pQueue: pq.New(peertracker.PeerCompare), + } + ptq.Options(options...) + return ptq +} + +// Options uses configuration functions to configure the peer task queue. +// It returns an Option that can be called to reverse the changes. +func (ptq *PeerTaskQueue) Options(options ...Option) Option { + if len(options) == 0 { + return nil + } + if len(options) == 1 { + return options[0](ptq) + } + reverse := options[0](ptq) + return chain(ptq.Options(options[1:]...), reverse) +} + +func (ptq *PeerTaskQueue) callHooks(to peer.ID, event peerTaskQueueEvent) { + for _, hook := range ptq.hooks { + hook(to, event) + } +} + +// PushBlock adds a new block of tasks for the given peer to the queue +func (ptq *PeerTaskQueue) PushBlock(to peer.ID, tasks ...peertask.Task) { + ptq.lock.Lock() + defer ptq.lock.Unlock() + peerTracker, ok := ptq.peerTrackers[to] + if !ok { + peerTracker = peertracker.New(to) + ptq.pQueue.Push(peerTracker) + ptq.peerTrackers[to] = peerTracker + ptq.callHooks(to, peerAdded) + } + + peerTracker.PushBlock(to, tasks, func(e []peertask.Task) { + ptq.lock.Lock() + for _, task := range e { + peerTracker.TaskDone(task.Identifier) + } + ptq.pQueue.Update(peerTracker.Index()) + ptq.lock.Unlock() + }) + ptq.pQueue.Update(peerTracker.Index()) +} + +// PopBlock 'pops' the next block of tasks to be performed. Returns nil if no block exists. +func (ptq *PeerTaskQueue) PopBlock() *peertask.TaskBlock { + ptq.lock.Lock() + defer ptq.lock.Unlock() + if ptq.pQueue.Len() == 0 { + return nil + } + peerTracker := ptq.pQueue.Pop().(*peertracker.PeerTracker) + + out := peerTracker.PopBlock() + if peerTracker.IsIdle() { + target := peerTracker.Target() + delete(ptq.peerTrackers, target) + delete(ptq.frozenPeers, target) + ptq.callHooks(target, peerRemoved) + } else { + ptq.pQueue.Push(peerTracker) + } + return out +} + +// Remove removes a task from the queue. +func (ptq *PeerTaskQueue) Remove(identifier peertask.Identifier, p peer.ID) { + ptq.lock.Lock() + peerTracker, ok := ptq.peerTrackers[p] + if ok { + if peerTracker.Remove(identifier) { + // we now also 'freeze' that partner. If they sent us a cancel for a + // block we were about to send them, we should wait a short period of time + // to make sure we receive any other in-flight cancels before sending + // them a block they already potentially have + if !ptq.ignoreFreezing { + if !peerTracker.IsFrozen() { + ptq.frozenPeers[p] = struct{}{} + } + + peerTracker.Freeze() + } + ptq.pQueue.Update(peerTracker.Index()) + } + } + ptq.lock.Unlock() +} + +// FullThaw completely thaws all peers in the queue so they can execute tasks. +func (ptq *PeerTaskQueue) FullThaw() { + ptq.lock.Lock() + defer ptq.lock.Unlock() + + for p := range ptq.frozenPeers { + peerTracker, ok := ptq.peerTrackers[p] + if ok { + peerTracker.FullThaw() + delete(ptq.frozenPeers, p) + ptq.pQueue.Update(peerTracker.Index()) + } + } +} + +// ThawRound unthaws peers incrementally, so that those have been frozen the least +// become unfrozen and able to execute tasks first. +func (ptq *PeerTaskQueue) ThawRound() { + ptq.lock.Lock() + defer ptq.lock.Unlock() + + for p := range ptq.frozenPeers { + peerTracker, ok := ptq.peerTrackers[p] + if ok { + if peerTracker.Thaw() { + delete(ptq.frozenPeers, p) + } + ptq.pQueue.Update(peerTracker.Index()) + } + } +} diff --git a/vendor/github.com/ipfs/go-peertaskqueue/peertracker/peertracker.go b/vendor/github.com/ipfs/go-peertaskqueue/peertracker/peertracker.go new file mode 100644 index 00000000..3b7451b6 --- /dev/null +++ b/vendor/github.com/ipfs/go-peertaskqueue/peertracker/peertracker.go @@ -0,0 +1,212 @@ +package peertracker + +import ( + "sync" + + pq "github.com/ipfs/go-ipfs-pq" + "github.com/ipfs/go-peertaskqueue/peertask" + peer "github.com/libp2p/go-libp2p-core/peer" +) + +// PeerTracker tracks task blocks for a single peer, as well as active tasks +// for that peer +type PeerTracker struct { + target peer.ID + // Active is the number of track tasks this peer is currently + // processing + // active must be locked around as it will be updated externally + activelk sync.Mutex + active int + activeTasks map[peertask.Identifier]struct{} + + // total number of task tasks for this task + numTasks int + + // for the PQ interface + index int + + freezeVal int + + taskMap map[peertask.Identifier]*peertask.TaskBlock + + // priority queue of tasks belonging to this peer + taskBlockQueue pq.PQ +} + +// New creates a new PeerTracker +func New(target peer.ID) *PeerTracker { + return &PeerTracker{ + target: target, + taskBlockQueue: pq.New(peertask.WrapCompare(peertask.PriorityCompare)), + taskMap: make(map[peertask.Identifier]*peertask.TaskBlock), + activeTasks: make(map[peertask.Identifier]struct{}), + } +} + +// PeerCompare implements pq.ElemComparator +// returns true if peer 'a' has higher priority than peer 'b' +func PeerCompare(a, b pq.Elem) bool { + pa := a.(*PeerTracker) + pb := b.(*PeerTracker) + + // having no tasks means lowest priority + // having both of these checks ensures stability of the sort + if pa.numTasks == 0 { + return false + } + if pb.numTasks == 0 { + return true + } + + if pa.freezeVal > pb.freezeVal { + return false + } + if pa.freezeVal < pb.freezeVal { + return true + } + + if pa.active == pb.active { + // sorting by taskQueue.Len() aids in cleaning out trash tasks faster + // if we sorted instead by requests, one peer could potentially build up + // a huge number of cancelled tasks in the queue resulting in a memory leak + return pa.taskBlockQueue.Len() > pb.taskBlockQueue.Len() + } + return pa.active < pb.active +} + +// StartTask signals that a task was started for this peer. +func (p *PeerTracker) StartTask(identifier peertask.Identifier) { + p.activelk.Lock() + p.activeTasks[identifier] = struct{}{} + p.active++ + p.activelk.Unlock() +} + +// TaskDone signals that a task was completed for this peer. +func (p *PeerTracker) TaskDone(identifier peertask.Identifier) { + p.activelk.Lock() + delete(p.activeTasks, identifier) + p.active-- + if p.active < 0 { + panic("more tasks finished than started!") + } + p.activelk.Unlock() +} + +// Target returns the peer that this peer tracker tracks tasks for +func (p *PeerTracker) Target() peer.ID { + return p.target +} + +// IsIdle returns true if the peer has no active tasks or queued tasks +func (p *PeerTracker) IsIdle() bool { + p.activelk.Lock() + defer p.activelk.Unlock() + return p.numTasks == 0 && p.active == 0 +} + +// Index implements pq.Elem. +func (p *PeerTracker) Index() int { + return p.index +} + +// SetIndex implements pq.Elem. +func (p *PeerTracker) SetIndex(i int) { + p.index = i +} + +// PushBlock adds a new block of tasks on to a peers queue from the given +// peer ID, list of tasks, and task block completion function +func (p *PeerTracker) PushBlock(target peer.ID, tasks []peertask.Task, done func(e []peertask.Task)) { + + p.activelk.Lock() + defer p.activelk.Unlock() + + var priority int + newTasks := make([]peertask.Task, 0, len(tasks)) + for _, task := range tasks { + if _, ok := p.activeTasks[task.Identifier]; ok { + continue + } + if taskBlock, ok := p.taskMap[task.Identifier]; ok { + if task.Priority > taskBlock.Priority { + taskBlock.Priority = task.Priority + p.taskBlockQueue.Update(taskBlock.Index()) + } + continue + } + if task.Priority > priority { + priority = task.Priority + } + newTasks = append(newTasks, task) + } + + if len(newTasks) == 0 { + return + } + + taskBlock := peertask.NewTaskBlock(newTasks, priority, target, done) + p.taskBlockQueue.Push(taskBlock) + for _, task := range newTasks { + p.taskMap[task.Identifier] = taskBlock + } + p.numTasks += len(newTasks) +} + +// PopBlock removes a block of tasks from this peers queue +func (p *PeerTracker) PopBlock() *peertask.TaskBlock { + var out *peertask.TaskBlock + for p.taskBlockQueue.Len() > 0 && p.freezeVal == 0 { + out = p.taskBlockQueue.Pop().(*peertask.TaskBlock) + + for _, task := range out.Tasks { + delete(p.taskMap, task.Identifier) + } + out.PruneTasks() + + if len(out.Tasks) > 0 { + for _, task := range out.Tasks { + p.numTasks-- + p.StartTask(task.Identifier) + } + } else { + out = nil + continue + } + break + } + return out +} + +// Remove removes the task with the given identifier from this peers queue +func (p *PeerTracker) Remove(identifier peertask.Identifier) bool { + taskBlock, ok := p.taskMap[identifier] + if ok { + taskBlock.MarkPrunable(identifier) + p.numTasks-- + } + return ok +} + +// Freeze increments the freeze value for this peer. While a peer is frozen +// (freeze value > 0) it will not execute tasks. +func (p *PeerTracker) Freeze() { + p.freezeVal++ +} + +// Thaw decrements the freeze value for this peer. While a peer is frozen +// (freeze value > 0) it will not execute tasks. +func (p *PeerTracker) Thaw() bool { + p.freezeVal -= (p.freezeVal + 1) / 2 + return p.freezeVal <= 0 +} + +// FullThaw completely unfreezes this peer so it can execute tasks. +func (p *PeerTracker) FullThaw() { + p.freezeVal = 0 +} + +// IsFrozen returns whether this peer is frozen and unable to execute tasks. +func (p *PeerTracker) IsFrozen() bool { + return p.freezeVal > 0 +} diff --git a/vendor/github.com/ipfs/go-unixfs/go.mod b/vendor/github.com/ipfs/go-unixfs/go.mod index 425230fc..d44a3006 100644 --- a/vendor/github.com/ipfs/go-unixfs/go.mod +++ b/vendor/github.com/ipfs/go-unixfs/go.mod @@ -1,15 +1,15 @@ module github.com/ipfs/go-unixfs require ( - github.com/Stebalien/go-bitfield v0.0.0-20180330043415-076a62f9ce6e + github.com/Stebalien/go-bitfield v0.0.1 github.com/gogo/protobuf v1.2.1 - github.com/ipfs/go-cid v0.0.1 + github.com/ipfs/go-cid v0.0.2 github.com/ipfs/go-ipfs-chunker v0.0.1 - github.com/ipfs/go-ipfs-files v0.0.2 + github.com/ipfs/go-ipfs-files v0.0.3 github.com/ipfs/go-ipfs-posinfo v0.0.1 github.com/ipfs/go-ipfs-util v0.0.1 - github.com/ipfs/go-ipld-format v0.0.1 - github.com/ipfs/go-merkledag v0.0.3 - github.com/multiformats/go-multihash v0.0.1 - github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72 + github.com/ipfs/go-ipld-format v0.0.2 + github.com/ipfs/go-merkledag v0.0.6 + github.com/multiformats/go-multihash v0.0.5 + github.com/spaolacci/murmur3 v1.1.0 ) diff --git a/vendor/github.com/ipfs/go-unixfs/go.sum b/vendor/github.com/ipfs/go-unixfs/go.sum index 02b7c007..9b8ea5f2 100644 --- a/vendor/github.com/ipfs/go-unixfs/go.sum +++ b/vendor/github.com/ipfs/go-unixfs/go.sum @@ -1,12 +1,15 @@ github.com/AndreasBriese/bbloom v0.0.0-20180913140656-343706a395b7/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= github.com/Kubuxu/go-os-helper v0.0.1/go.mod h1:N8B+I7vPCT80IcP58r50u4+gEEcsZETFUpAzWW2ep1Y= -github.com/Stebalien/go-bitfield v0.0.0-20180330043415-076a62f9ce6e h1:2Z+EBRrOJsA3psnUPcEWMIH2EIga1xHflQcr/EZslx8= -github.com/Stebalien/go-bitfield v0.0.0-20180330043415-076a62f9ce6e/go.mod h1:3oM7gXIttpYDAJXpVNnSCiUMYBLIZ6cb1t+Ip982MRo= +github.com/Stebalien/go-bitfield v0.0.1 h1:X3kbSSPUaJK60wV2hjOPZwmpljr6VGCqdq4cBLhbQBo= +github.com/Stebalien/go-bitfield v0.0.1/go.mod h1:GNjFpasyUVkHMsfEOk8EFLJ9syQ6SI+XWrX9Wf2XH0s= github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32 h1:qkOC5Gd33k54tobS36cXdAzJbeHaduLtnLQQwNoIi78= github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32/go.mod h1:DrZx5ec/dmnfpw9KyYoQyYo7d0KEvTkk/5M/vbZjAr8= +github.com/btcsuite/btcd v0.0.0-20190523000118-16327141da8c h1:aEbSeNALREWXk0G7UdNhR3ayBV7tZ4M2PNmnrCAph6Q= +github.com/btcsuite/btcd v0.0.0-20190523000118-16327141da8c/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI= github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= github.com/btcsuite/btcutil v0.0.0-20190207003914-4c204d697803/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= +github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= @@ -14,15 +17,19 @@ github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtE github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= github.com/coreos/go-semver v0.2.0 h1:3Jm3tLmsgAYcjC+4Up7hJrFBPr+n7rAqYeSw/SZazuY= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-semver v0.2.1-0.20180108230905-e214231b295a/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/cskr/pubsub v1.0.2 h1:vlOzMhl6PFn60gRlTQQsIfVwaPB/B/8MziK8FhEPt/0= github.com/cskr/pubsub v1.0.2/go.mod h1:/8MzYXk/NJAz782G8RPkFzXTZVu63VotefPnR9TIRis= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= 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/dgraph-io/badger v1.5.5-0.20190226225317-8115aed38f8f/go.mod h1:VZxzAIRPHRVNRKRo6AXrX9BJegn6il06VMTZVJYCIjQ= github.com/dgryski/go-farm v0.0.0-20190104051053-3adb47b1fb0f/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/fd/go-nat v1.0.0 h1:DPyQ97sxA9ThrWYRPcWUz/z9TnpTIGRYODIQc/dy64M= -github.com/fd/go-nat v1.0.0/go.mod h1:BTBu/CKvMmOMUPkKVef1pngt2WFH/lg7E6yQnulfp6E= 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/go-check/check v0.0.0-20180628173108-788fd7840127 h1:0gkP6mzaMqkmpcJYCFOLkIBwI7xFExG03bbkOkCvUPI= @@ -32,6 +39,8 @@ github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zV github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.0 h1:kbxbvI4Un1LUWKxufD+BiE6AEExYYgkQLQmLFqA1LFk= github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0= +github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -42,30 +51,30 @@ github.com/gxed/hashland/keccakpg v0.0.1 h1:wrk3uMNaMxbXiHibbPO4S0ymqJMm41WiudyF github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfmKFJ6tItnhQ67kU= github.com/gxed/hashland/murmur3 v0.0.1 h1:SheiaIt0sda5K+8FLz952/1iWS9zrnKsEJaOJu4ZbSc= github.com/gxed/hashland/murmur3 v0.0.1/go.mod h1:KjXop02n4/ckmZSnY2+HKcLud/tcmvhST0bie/0lS48= -github.com/gxed/pubsub v0.0.0-20180201040156-26ebdf44f824 h1:TF4mX7zXpeyz/xintezebSa7ZDxAGBnqDwcoobvaz2o= -github.com/gxed/pubsub v0.0.0-20180201040156-26ebdf44f824/go.mod h1:OiEWyHgK+CWrmOlVquHaIK1vhpUJydC9m0Je6mhaiNE= github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+dAcgU= github.com/hashicorp/golang-lru v0.5.1/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-20180415215157-1395d1447324 h1:PV190X5/DzQ/tbFFG5YpT5mH6q+cHlfgqI5JuRnH9oE= -github.com/huin/goupnp v0.0.0-20180415215157-1395d1447324/go.mod h1:MZ2ZmwcBpvOoJ22IJsc7va19ZwoheaBk43rKg12SKag= +github.com/huin/goupnp v1.0.0 h1:wg75sLpL6DZqwHQN6E1Cfk6mtfzS45z8OV+ic+DtHRo= +github.com/huin/goupnp v1.0.0/go.mod h1:n9v9KO1tAxYH82qOn+UTIFQDmx5n1Zxd/ClZDMX7Bnc= +github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= github.com/ipfs/bbloom v0.0.1 h1:s7KkiBPfxCeDVo47KySjK0ACPc5GJRUxFpdyWEuDjhw= github.com/ipfs/bbloom v0.0.1/go.mod h1:oqo8CVWsJFMOZqTglBG4wydCE4IQA/G2/SEofB0rjUI= -github.com/ipfs/go-bitswap v0.0.1 h1:Xx1ma7TWy9ISOx5zFq5YVQyrTHzUP4GkRPMsZokHxAg= -github.com/ipfs/go-bitswap v0.0.1/go.mod h1:z+tP3h+HTJ810n1R5yMy2ccKFffJ2F6Vqm/5Bf7vs2c= -github.com/ipfs/go-bitswap v0.0.3/go.mod h1:jadAZYsP/tcRMl47ZhFxhaNuDQoXawT8iHMg+iFoQbg= +github.com/ipfs/go-bitswap v0.0.9 h1:Dy0qvYlaOd2E2FOL2gApJ21qVjepJsGNNfstLrGf+0I= +github.com/ipfs/go-bitswap v0.0.9/go.mod h1:kAPf5qgn2W2DrgAcscZ3HrM9qh4pH+X8Fkk3UPrwvis= github.com/ipfs/go-block-format v0.0.1/go.mod h1:DK/YYcsSUIVAFNwo/KZCdIIbpN0ROH/baNLgayt4pFc= github.com/ipfs/go-block-format v0.0.2 h1:qPDvcP19izTjU8rgo6p7gTXZlkMkF5bz5G3fqIsSCPE= github.com/ipfs/go-block-format v0.0.2/go.mod h1:AWR46JfpcObNfg3ok2JHDUfdiHRgWhJgCQF+KIgOPJY= -github.com/ipfs/go-blockservice v0.0.1 h1:l6g1hwYDV6vb4bAvTqia6Cvo+zLMOPKel/n0zUX48bc= -github.com/ipfs/go-blockservice v0.0.1/go.mod h1:2Ao89U7jV1KIqqNk5EdhSTBG/Pgc1vMFr0bhkx376j4= -github.com/ipfs/go-blockservice v0.0.3 h1:40OvwrxeudTAlUGUAKNYnNPcwQeLtXedjzTWecnUinQ= -github.com/ipfs/go-blockservice v0.0.3/go.mod h1:/NNihwTi6V2Yr6g8wBI+BSwPuURpBRMtYNGrlxZ8KuI= +github.com/ipfs/go-blockservice v0.0.7 h1:VRRVjgahs7r//MdO7yY5DJ2/i2fmkKOnxfSyfuPjTm0= +github.com/ipfs/go-blockservice v0.0.7/go.mod h1:EOfb9k/Y878ZTRY/CH0x5+ATtaipfbRhbvNSdgc/7So= github.com/ipfs/go-cid v0.0.1 h1:GBjWPktLnNyX0JiQCNFpUuUSoMw5KMyqrsejHYlILBE= github.com/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= +github.com/ipfs/go-cid v0.0.2 h1:tuuKaZPU1M6HcejsO3AcYWW8sZ8MTvyxfc4uqB4eFE8= +github.com/ipfs/go-cid v0.0.2/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= github.com/ipfs/go-datastore v0.0.1 h1:AW/KZCScnBWlSb5JbnEnLKFWXL224LBEh/9KXXOrUms= github.com/ipfs/go-datastore v0.0.1/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= +github.com/ipfs/go-datastore v0.0.5 h1:q3OfiOZV5rlsK1H5V8benjeUApRfMGs4Mrhmr6NriQo= +github.com/ipfs/go-datastore v0.0.5/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk= github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps= github.com/ipfs/go-ds-badger v0.0.2/go.mod h1:Y3QpeSFWQf6MopLTiZD+VT6IC1yZqaGmjvRcKeSGij8= @@ -85,12 +94,8 @@ github.com/ipfs/go-ipfs-exchange-interface v0.0.1 h1:LJXIo9W7CAmugqI+uofioIpRb6r github.com/ipfs/go-ipfs-exchange-interface v0.0.1/go.mod h1:c8MwfHjtQjPoDyiy9cFquVtVHkO9b9Ob3FG91qJnWCM= github.com/ipfs/go-ipfs-exchange-offline v0.0.1 h1:P56jYKZF7lDDOLx5SotVh5KFxoY6C81I1NSHW1FxGew= github.com/ipfs/go-ipfs-exchange-offline v0.0.1/go.mod h1:WhHSFCVYX36H/anEKQboAzpUws3x7UeEGkzQc3iNkM0= -github.com/ipfs/go-ipfs-files v0.0.1 h1:OroTsI58plHGX70HPLKy6LQhPR3HZJ5ip61fYlo6POM= -github.com/ipfs/go-ipfs-files v0.0.1/go.mod h1:INEFm0LL2LWXBhNJ2PMIIb2w45hpXgPjNoE7yA8Y1d4= -github.com/ipfs/go-ipfs-files v0.0.2 h1:fEEjF4H+1t8SFOHqUGp0KqcwgIRlbD2bu8CAS2sIggE= -github.com/ipfs/go-ipfs-files v0.0.2/go.mod h1:INEFm0LL2LWXBhNJ2PMIIb2w45hpXgPjNoE7yA8Y1d4= -github.com/ipfs/go-ipfs-flags v0.0.1 h1:OH5cEkJYL0QgA+bvD55TNG9ud8HA2Nqaav47b2c/UJk= -github.com/ipfs/go-ipfs-flags v0.0.1/go.mod h1:RnXBb9WV53GSfTrSDVK61NLTFKvWc60n+K9EgCDh+rA= +github.com/ipfs/go-ipfs-files v0.0.3 h1:ME+QnC3uOyla1ciRPezDW0ynQYK2ikOh9OCKAEg4uUA= +github.com/ipfs/go-ipfs-files v0.0.3/go.mod h1:INEFm0LL2LWXBhNJ2PMIIb2w45hpXgPjNoE7yA8Y1d4= github.com/ipfs/go-ipfs-posinfo v0.0.1 h1:Esoxj+1JgSjX0+ylc0hUmJCOv6V2vFoZiETLR6OtpRs= github.com/ipfs/go-ipfs-posinfo v0.0.1/go.mod h1:SwyeVP+jCwiDu0C313l/8jg6ZxM0qqtlt2a0vILTc1A= github.com/ipfs/go-ipfs-pq v0.0.1 h1:zgUotX8dcAB/w/HidJh1zzc1yFq6Vm8J7T2F4itj/RU= @@ -99,30 +104,36 @@ github.com/ipfs/go-ipfs-routing v0.0.1 h1:394mZeTLcbM/LDO12PneBYvkZAUA+nRnmC0lAz github.com/ipfs/go-ipfs-routing v0.0.1/go.mod h1:k76lf20iKFxQTjcJokbPM9iBXVXVZhcOwc360N4nuKs= github.com/ipfs/go-ipfs-util v0.0.1 h1:Wz9bL2wB2YBJqggkA4dD7oSmqB4cAnpNbGrlHJulv50= github.com/ipfs/go-ipfs-util v0.0.1/go.mod h1:spsl5z8KUnrve+73pOhSVZND1SIxPW5RyBCNzQxlJBc= -github.com/ipfs/go-ipld-cbor v0.0.1 h1:g7yh27SznWP4CUbkFgjR+WQRjEeyxCpTR4iKVmXx1wA= -github.com/ipfs/go-ipld-cbor v0.0.1/go.mod h1:RXHr8s4k0NE0TKhnrxqZC9M888QfsBN9rhS5NjfKzY8= +github.com/ipfs/go-ipld-cbor v0.0.2 h1:amzFztBQQQ69UA5+f7JRfoXF/z2l//MGfEDHVkS20+s= +github.com/ipfs/go-ipld-cbor v0.0.2/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA0AQFOn7Nc= github.com/ipfs/go-ipld-format v0.0.1 h1:HCu4eB/Gh+KD/Q0M8u888RFkorTWNIL3da4oc5dwc80= github.com/ipfs/go-ipld-format v0.0.1/go.mod h1:kyJtbkDALmFHv3QR6et67i35QzO3S0dCDnkOJhcZkms= +github.com/ipfs/go-ipld-format v0.0.2 h1:OVAGlyYT6JPZ0pEfGntFPS40lfrDmaDbQwNHEY2G9Zs= +github.com/ipfs/go-ipld-format v0.0.2/go.mod h1:4B6+FM2u9OJ9zCV+kSbgFAZlOrv1Hqbf0INGQgiKf9k= github.com/ipfs/go-log v0.0.1 h1:9XTUN/rW64BCG1YhPK9Hoy3q8nr4gOmHHBpgFdfw6Lc= github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM= -github.com/ipfs/go-merkledag v0.0.1 h1:HqvQsqqLvNOgItOy80Sd4T4rHvq6cXtAtrbEoWAON+I= -github.com/ipfs/go-merkledag v0.0.1/go.mod h1:CRdtHMROECqaehAGeJ0Wd9TtlmWv/ta5cUnvbTnniEI= -github.com/ipfs/go-merkledag v0.0.3 h1:A5DlOMzqTRDVmdgkf3dzCKCFmVWH4Zqwb0cbYXUs+Ro= -github.com/ipfs/go-merkledag v0.0.3/go.mod h1:Oc5kIXLHokkE1hWGMBHw+oxehkAaTOqtEb7Zbh6BhLA= +github.com/ipfs/go-merkledag v0.0.6 h1:rYZc0yzhO7y1cKi3Rw425a2HhEJDdLvNOWsqtmO3PF0= +github.com/ipfs/go-merkledag v0.0.6/go.mod h1:QYPdnlvkOg7GnQRofu9XZimC5ZW5Wi3bKys/4GQQfto= github.com/ipfs/go-metrics-interface v0.0.1 h1:j+cpbjYvu4R8zbleSs36gvB7jR+wsL2fGD6n0jO4kdg= github.com/ipfs/go-metrics-interface v0.0.1/go.mod h1:6s6euYU4zowdslK0GKHmqaIZ3j/b/tL7HTWtJ4VPgWY= +github.com/ipfs/go-peertaskqueue v0.0.4 h1:i0JprfjjILYcWM1xguO/1MCS8XKVxLSl+ECEVr6i8nw= +github.com/ipfs/go-peertaskqueue v0.0.4/go.mod h1:03H8fhyeMfKNFWqzYEVyMbcPUeYrqP1MX6Kd+aN+rMQ= github.com/ipfs/go-verifcid v0.0.1 h1:m2HI7zIuR5TFyQ1b79Da5N9dnnCP1vcu2QqawmWlK2E= github.com/ipfs/go-verifcid v0.0.1/go.mod h1:5Hrva5KBeIog4A+UpqlaIU+DEstipcJYQQZc0g37pY0= -github.com/jackpal/gateway v1.0.4 h1:LS5EHkLuQ6jzaHwULi0vL+JO0mU/n4yUtK8oUjHHOlM= -github.com/jackpal/gateway v1.0.4/go.mod h1:lTpwd4ACLXmpyiCTRtfiNyVnUmqT9RivzCDQetPfnjA= +github.com/jackpal/gateway v1.0.5 h1:qzXWUJfuMdlLMtt0a3Dgt+xkWQiA5itDEITVJtuSwMc= +github.com/jackpal/gateway v1.0.5/go.mod h1:lTpwd4ACLXmpyiCTRtfiNyVnUmqT9RivzCDQetPfnjA= github.com/jackpal/go-nat-pmp v1.0.1 h1:i0LektDkO1QlrTm/cSuP+PyBCDnYvjPLGl4LdWEMiaA= github.com/jackpal/go-nat-pmp v1.0.1/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= github.com/jbenet/go-cienv v0.0.0-20150120210510-1bb1476777ec h1:DQqZhhDvrTrEQ3Qod5yfavcA064e53xlQ+xajiorXgM= github.com/jbenet/go-cienv v0.0.0-20150120210510-1bb1476777ec/go.mod h1:rGaEvXB4uRSZMmzKNLoXvTu1sfx+1kv/DojUlPrSZGs= +github.com/jbenet/go-cienv v0.1.0 h1:Vc/s0QbQtoxX8MwwSLWWh+xNNZvM3Lw7NsTcHrvvhMc= +github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA= github.com/jbenet/go-temp-err-catcher v0.0.0-20150120210811-aac704a3f4f2 h1:vhC1OXXiT9R2pczegwz6moDvuRpggaroAXhPIseh57A= github.com/jbenet/go-temp-err-catcher v0.0.0-20150120210811-aac704a3f4f2/go.mod h1:8GXXJV31xl8whumTzdZsTt3RnUIiPqzkyf7mxToRCMs= github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8 h1:bspPhN+oKYFk5fcGNuQzp6IGzYQSenLEgH3s6jkXrWw= github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8/go.mod h1:Ly/wlsjFq/qrU3Rar62tu1gASgGw6chQbSh/XgIIXCY= +github.com/jbenet/goprocess v0.1.3 h1:YKyIEECS/XvcfHtBzxtjBBbWK+MbvA6dG8ASiqwvr10= +github.com/jbenet/goprocess v0.1.3/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= github.com/jtolds/gls v4.2.1+incompatible h1:fSuqC+Gmlu6l/ZYAoZzx2pyucC8Xza35fpRVWLVmUEE= @@ -130,6 +141,8 @@ github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVY github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= +github.com/koron/go-ssdp v0.0.0-20180514024734-4a0ed625a78b h1:wxtKgYHEncAU00muMD06dzLiahtGM1eouRNOzVV7tdQ= +github.com/koron/go-ssdp v0.0.0-20180514024734-4a0ed625a78b/go.mod h1:5Ky9EC2xfoUKUor0Hjgi2BJhCSXJfMOFlmyYrVKGQMk= 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= @@ -139,91 +152,144 @@ github.com/libp2p/go-addr-util v0.0.1 h1:TpTQm9cXVRVSKsYbgQ7GKc3KbbHVTnbostgGaDE github.com/libp2p/go-addr-util v0.0.1/go.mod h1:4ac6O7n9rIAKB1dnd+s8IbbMXkt+oBpzX4/+RACcnlQ= github.com/libp2p/go-buffer-pool v0.0.1 h1:9Rrn/H46cXjaA2HQ5Y8lyhOS1NhTkZ4yuEs2r3Eechg= github.com/libp2p/go-buffer-pool v0.0.1/go.mod h1:xtyIz9PMobb13WaxR6Zo1Pd1zXJKYg0a8KiIvDp3TzQ= +github.com/libp2p/go-buffer-pool v0.0.2 h1:QNK2iAFa8gjAe1SPz6mHSMuCcjs+X1wlHzeOSqcmlfs= +github.com/libp2p/go-buffer-pool v0.0.2/go.mod h1:MvaB6xw5vOrDl8rYZGLFdKAuk/hRoRZd1Vi32+RXyFM= github.com/libp2p/go-conn-security v0.0.1 h1:4kMMrqrt9EUNCNjX1xagSJC+bq16uqjMe9lk1KBMVNs= github.com/libp2p/go-conn-security v0.0.1/go.mod h1:bGmu51N0KU9IEjX7kl2PQjgZa40JQWnayTvNMgD/vyk= -github.com/libp2p/go-conn-security-multistream v0.0.1 h1:XefjAQRHcnUaxKb26RGupToucx3uU4ecbOZ3aACXlDU= -github.com/libp2p/go-conn-security-multistream v0.0.1/go.mod h1:nc9vud7inQ+d6SO0I/6dSWrdMnHnzZNHeyUQqrAJulE= +github.com/libp2p/go-conn-security-multistream v0.0.2 h1:Ykz0lnNjxk+0SdslUmlLNyrleqdpS1S/VW+dxFdt74Y= +github.com/libp2p/go-conn-security-multistream v0.0.2/go.mod h1:nc9vud7inQ+d6SO0I/6dSWrdMnHnzZNHeyUQqrAJulE= github.com/libp2p/go-flow-metrics v0.0.1 h1:0gxuFd2GuK7IIP5pKljLwps6TvcuYgvG7Atqi3INF5s= github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZxBdp967ls1g+k8= -github.com/libp2p/go-libp2p v0.0.1 h1:oEjzhRzymY7NILTMzOKNVOpNZGpcQHrHriWw91pbJNM= -github.com/libp2p/go-libp2p v0.0.1/go.mod h1:bmRs8I0vwn6iRaVssZnJx/epY6WPSKiLoK1vyle4EX0= -github.com/libp2p/go-libp2p v0.0.2/go.mod h1:Qu8bWqFXiocPloabFGUcVG4kk94fLvfC8mWTDdFC9wE= -github.com/libp2p/go-libp2p-autonat v0.0.1/go.mod h1:fs71q5Xk+pdnKU014o2iq1RhMs9/PMaG5zXRFNnIIT4= -github.com/libp2p/go-libp2p-autonat v0.0.2/go.mod h1:fs71q5Xk+pdnKU014o2iq1RhMs9/PMaG5zXRFNnIIT4= +github.com/libp2p/go-libp2p v0.0.30 h1:mwCWAusLhRGUzZ/VaCatsrEQTsuWExmXqVcvGBV72EQ= +github.com/libp2p/go-libp2p v0.0.30/go.mod h1:XWT8FGHlhptAv1+3V/+J5mEpzyui/5bvFsNuWYs611A= +github.com/libp2p/go-libp2p-autonat v0.0.6/go.mod h1:uZneLdOkZHro35xIhpbtTzLlgYturpu4J5+0cZK3MqE= github.com/libp2p/go-libp2p-blankhost v0.0.1 h1:/mZuuiwntNR8RywnCFlGHLKrKLYne+qciBpQXWqp5fk= github.com/libp2p/go-libp2p-blankhost v0.0.1/go.mod h1:Ibpbw/7cPPYwFb7PACIWdvxxv0t0XCCI10t7czjAjTc= -github.com/libp2p/go-libp2p-circuit v0.0.1/go.mod h1:Dqm0s/BiV63j8EEAs8hr1H5HudqvCAeXxDyic59lCwE= +github.com/libp2p/go-libp2p-circuit v0.0.9/go.mod h1:uU+IBvEQzCu953/ps7bYzC/D/R0Ho2A9LfKVVCatlqU= +github.com/libp2p/go-libp2p-core v0.0.1 h1:HSTZtFIq/W5Ue43Zw+uWZyy2Vl5WtF0zDjKN8/DT/1I= +github.com/libp2p/go-libp2p-core v0.0.1/go.mod h1:g/VxnTZ/1ygHxH3dKok7Vno1VfpvGcGip57wjTU4fco= github.com/libp2p/go-libp2p-crypto v0.0.1 h1:JNQd8CmoGTohO/akqrH16ewsqZpci2CbgYH/LmYl8gw= github.com/libp2p/go-libp2p-crypto v0.0.1/go.mod h1:yJkNyDmO341d5wwXxDUGO0LykUVT72ImHNUqh5D/dBE= -github.com/libp2p/go-libp2p-discovery v0.0.1/go.mod h1:ZkkF9xIFRLA1xCc7bstYFkd80gBGK8Fc1JqGoU2i+zI= +github.com/libp2p/go-libp2p-crypto v0.0.2/go.mod h1:eETI5OUfBnvARGOHrJz2eWNyTUxEGZnBxMcbUjfIj4I= +github.com/libp2p/go-libp2p-crypto v0.1.0 h1:k9MFy+o2zGDNGsaoZl0MA3iZ75qXxr9OOoAZF+sD5OQ= +github.com/libp2p/go-libp2p-crypto v0.1.0/go.mod h1:sPUokVISZiy+nNuTTH/TY+leRSxnFj/2GLjtOTW90hI= +github.com/libp2p/go-libp2p-discovery v0.0.5/go.mod h1:YtF20GUxjgoKZ4zmXj8j3Nb2TUSBHFlOCetzYdbZL5I= github.com/libp2p/go-libp2p-host v0.0.1 h1:dnqusU+DheGcdxrE718kG4XgHNuL2n9eEv8Rg5zy8hQ= github.com/libp2p/go-libp2p-host v0.0.1/go.mod h1:qWd+H1yuU0m5CwzAkvbSjqKairayEHdR5MMl7Cwa7Go= +github.com/libp2p/go-libp2p-host v0.0.3 h1:BB/1Z+4X0rjKP5lbQTmjEjLbDVbrcmLOlA6QDsN5/j4= +github.com/libp2p/go-libp2p-host v0.0.3/go.mod h1:Y/qPyA6C8j2coYyos1dfRm0I8+nvd4TGrDGt4tA7JR8= github.com/libp2p/go-libp2p-interface-connmgr v0.0.1 h1:Q9EkNSLAOF+u90L88qmE9z/fTdjLh8OsJwGw74mkwk4= github.com/libp2p/go-libp2p-interface-connmgr v0.0.1/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k= +github.com/libp2p/go-libp2p-interface-connmgr v0.0.4/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k= +github.com/libp2p/go-libp2p-interface-connmgr v0.0.5 h1:KG/KNYL2tYzXAfMvQN5K1aAGTYSYUMJ1prgYa2/JI1E= +github.com/libp2p/go-libp2p-interface-connmgr v0.0.5/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k= github.com/libp2p/go-libp2p-interface-pnet v0.0.1 h1:7GnzRrBTJHEsofi1ahFdPN9Si6skwXQE9UqR2S+Pkh8= github.com/libp2p/go-libp2p-interface-pnet v0.0.1/go.mod h1:el9jHpQAXK5dnTpKA4yfCNBZXvrzdOU75zz+C6ryp3k= github.com/libp2p/go-libp2p-loggables v0.0.1 h1:HVww9oAnINIxbt69LJNkxD8lnbfgteXR97Xm4p3l9ps= github.com/libp2p/go-libp2p-loggables v0.0.1/go.mod h1:lDipDlBNYbpyqyPX/KcoO+eq0sJYEVR2JgOexcivchg= github.com/libp2p/go-libp2p-metrics v0.0.1 h1:yumdPC/P2VzINdmcKZd0pciSUCpou+s0lwYCjBbzQZU= github.com/libp2p/go-libp2p-metrics v0.0.1/go.mod h1:jQJ95SXXA/K1VZi13h52WZMa9ja78zjyy5rspMsC/08= -github.com/libp2p/go-libp2p-nat v0.0.1 h1:on/zju7XE+JXc8gH+vTKmIh2UJFC1K8kGnJYluQrlz4= -github.com/libp2p/go-libp2p-nat v0.0.1/go.mod h1:4L6ajyUIlJvx1Cbh5pc6Ma6vMDpKXf3GgLO5u7W0oQ4= -github.com/libp2p/go-libp2p-nat v0.0.2/go.mod h1:QrjXQSD5Dj4IJOdEcjHRkWTSomyxRo6HnUkf/TfQpLQ= +github.com/libp2p/go-libp2p-mplex v0.1.1 h1:lSPS1VJ36P01gGO//KgcsmSah5uoC3X9r7WY5j+iP4c= +github.com/libp2p/go-libp2p-mplex v0.1.1/go.mod h1:KUQWpGkCzfV7UIpi8SKsAVxyBgz1c9R5EvxgnwLsb/I= +github.com/libp2p/go-libp2p-nat v0.0.4 h1:+KXK324yaY701On8a0aGjTnw8467kW3ExKcqW2wwmyw= +github.com/libp2p/go-libp2p-nat v0.0.4/go.mod h1:N9Js/zVtAXqaeT99cXgTV9e75KpnWCvVOiGzlcHmBbY= github.com/libp2p/go-libp2p-net v0.0.1 h1:xJ4Vh4yKF/XKb8fd1Ev0ebAGzVjMxXzrxG2kjtU+F5Q= github.com/libp2p/go-libp2p-net v0.0.1/go.mod h1:Yt3zgmlsHOgUWSXmt5V/Jpz9upuJBE8EgNU9DrCcR8c= +github.com/libp2p/go-libp2p-net v0.0.2 h1:qP06u4TYXfl7uW/hzqPhlVVTSA2nw1B/bHBJaUnbh6M= +github.com/libp2p/go-libp2p-net v0.0.2/go.mod h1:Yt3zgmlsHOgUWSXmt5V/Jpz9upuJBE8EgNU9DrCcR8c= github.com/libp2p/go-libp2p-netutil v0.0.1 h1:LgD6+skofkOx8z6odD9+MZHKjupv3ng1u6KRhaADTnA= github.com/libp2p/go-libp2p-netutil v0.0.1/go.mod h1:GdusFvujWZI9Vt0X5BKqwWWmZFxecf9Gt03cKxm2f/Q= github.com/libp2p/go-libp2p-peer v0.0.1 h1:0qwAOljzYewINrU+Kndoc+1jAL7vzY/oY2Go4DCGfyY= github.com/libp2p/go-libp2p-peer v0.0.1/go.mod h1:nXQvOBbwVqoP+T5Y5nCjeH4sP9IX/J0AMzcDUVruVoo= +github.com/libp2p/go-libp2p-peer v0.1.1/go.mod h1:jkF12jGB4Gk/IOo+yomm+7oLWxF278F7UnrYUQ1Q8es= +github.com/libp2p/go-libp2p-peer v0.2.0 h1:EQ8kMjaCUwt/Y5uLgjT8iY2qg0mGUT0N1zUjer50DsY= +github.com/libp2p/go-libp2p-peer v0.2.0/go.mod h1:RCffaCvUyW2CJmG2gAWVqwePwW7JMgxjsHm7+J5kjWY= github.com/libp2p/go-libp2p-peerstore v0.0.1 h1:twKovq8YK5trLrd3nB7PD2Zu9JcyAIdm7Bz9yBWjhq8= github.com/libp2p/go-libp2p-peerstore v0.0.1/go.mod h1:RabLyPVJLuNQ+GFyoEkfi8H4Ti6k/HtZJ7YKgtSq+20= +github.com/libp2p/go-libp2p-peerstore v0.0.6/go.mod h1:RabLyPVJLuNQ+GFyoEkfi8H4Ti6k/HtZJ7YKgtSq+20= +github.com/libp2p/go-libp2p-peerstore v0.1.0 h1:MKh7pRNPHSh1fLPj8u/M/s/napdmeNpoi9BRy9lPN0E= +github.com/libp2p/go-libp2p-peerstore v0.1.0/go.mod h1:2CeHkQsr8svp4fZ+Oi9ykN1HBb6u0MOvdJ7YIsmcwtY= github.com/libp2p/go-libp2p-protocol v0.0.1 h1:+zkEmZ2yFDi5adpVE3t9dqh/N9TbpFWywowzeEzBbLM= github.com/libp2p/go-libp2p-protocol v0.0.1/go.mod h1:Af9n4PiruirSDjHycM1QuiMi/1VZNHYcK8cLgFJLZ4s= +github.com/libp2p/go-libp2p-protocol v0.1.0 h1:HdqhEyhg0ToCaxgMhnOmUO8snQtt/kQlcjVk3UoJU3c= +github.com/libp2p/go-libp2p-protocol v0.1.0/go.mod h1:KQPHpAabB57XQxGrXCNvbL6UEXfQqUgC/1adR2Xtflk= github.com/libp2p/go-libp2p-record v0.0.1 h1:zN7AS3X46qmwsw5JLxdDuI43cH5UYwovKxHPjKBYQxw= github.com/libp2p/go-libp2p-record v0.0.1/go.mod h1:grzqg263Rug/sRex85QrDOLntdFAymLDLm7lxMgU79Q= github.com/libp2p/go-libp2p-routing v0.0.1 h1:hPMAWktf9rYi3ME4MG48qE7dq1ofJxiQbfdvpNntjhc= github.com/libp2p/go-libp2p-routing v0.0.1/go.mod h1:N51q3yTr4Zdr7V8Jt2JIktVU+3xBBylx1MZeVA6t1Ys= -github.com/libp2p/go-libp2p-secio v0.0.1 h1:CqE/RdsizOwItdgLe632iyft/w0tshDLmZGAiKDcUAI= -github.com/libp2p/go-libp2p-secio v0.0.1/go.mod h1:IdG6iQybdcYmbTzxp4J5dwtUEDTOvZrT0opIDVNPrJs= -github.com/libp2p/go-libp2p-swarm v0.0.1 h1:Vne+hjaDwXqzgNwQ2vb2YKbnbOTyXjtS47stT66Apc4= -github.com/libp2p/go-libp2p-swarm v0.0.1/go.mod h1:mh+KZxkbd3lQnveQ3j2q60BM1Cw2mX36XXQqwfPOShs= +github.com/libp2p/go-libp2p-secio v0.0.3 h1:h3fPeDrej7bvvARnC2oSjAfcLZOaS4REZKgWCRQNpE4= +github.com/libp2p/go-libp2p-secio v0.0.3/go.mod h1:hS7HQ00MgLhRO/Wyu1bTX6ctJKhVpm+j2/S2A5UqYb0= +github.com/libp2p/go-libp2p-swarm v0.0.6 h1:gE0P/v2h+KEXtAi9YTw2UBOSODJ4m9VuuJ+ktc2LVUo= +github.com/libp2p/go-libp2p-swarm v0.0.6/go.mod h1:s5GZvzg9xXe8sbeESuFpjt8CJPTCa8mhEusweJqyFy8= +github.com/libp2p/go-libp2p-testing v0.0.1/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= +github.com/libp2p/go-libp2p-testing v0.0.2 h1:p9ySW7MFvGGs83hAAe0MPGnjy/tPjl5KyxpMkojdZ+g= +github.com/libp2p/go-libp2p-testing v0.0.2/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= github.com/libp2p/go-libp2p-transport v0.0.1/go.mod h1:UzbUs9X+PHOSw7S3ZmeOxfnwaQY5vGDzZmKPod3N3tk= -github.com/libp2p/go-libp2p-transport v0.0.4 h1:/CPHQMN75/IQwkhBxxIo6p6PtL3rwFZtlzBROT3e8mw= -github.com/libp2p/go-libp2p-transport v0.0.4/go.mod h1:StoY3sx6IqsP6XKoabsPnHCwqKXWUMWU7Rfcsubee/A= -github.com/libp2p/go-libp2p-transport-upgrader v0.0.1 h1:rNtXkY6dty46mxYOHHAZQchI7gQdJStF683FhVnei/k= -github.com/libp2p/go-libp2p-transport-upgrader v0.0.1/go.mod h1:NJpUAgQab/8K6K0m+JmZCe5RUXG10UMEx4kWe9Ipj5c= +github.com/libp2p/go-libp2p-transport v0.0.5 h1:pV6+UlRxyDpASSGD+60vMvdifSCby6JkJDfi+yUMHac= +github.com/libp2p/go-libp2p-transport v0.0.5/go.mod h1:StoY3sx6IqsP6XKoabsPnHCwqKXWUMWU7Rfcsubee/A= +github.com/libp2p/go-libp2p-transport-upgrader v0.0.4 h1:uGMOd14BL1oFlfb/cGfOxPjiTKBhzWV4aMjjoCF1Z1o= +github.com/libp2p/go-libp2p-transport-upgrader v0.0.4/go.mod h1:RGq+tupk+oj7PzL2kn/m1w6YXxcIAYJYeI90h6BGgUc= +github.com/libp2p/go-libp2p-yamux v0.1.2/go.mod h1:xUoV/RmYkg6BW/qGxA9XJyg+HzXFYkeXbnhjmnYzKp8= +github.com/libp2p/go-libp2p-yamux v0.1.3 h1:HmKvv2jWJ4GEm3iP7cEKjuw0POa6rK+Hcsu1FBKzpLc= +github.com/libp2p/go-libp2p-yamux v0.1.3/go.mod h1:VGSQVrqkh6y4nm0189qqxMtvyBft44MOYYPpYKXiVt4= github.com/libp2p/go-maddr-filter v0.0.1 h1:apvYTg0aIxxQyBX+XHKOR+0+lYhGs1Yv+JmTH9nyl5I= github.com/libp2p/go-maddr-filter v0.0.1/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= -github.com/libp2p/go-mplex v0.0.1 h1:dn2XGSrUxLtz3/8u85bGrwhUEKPX8MOF3lpmcWBZCWc= -github.com/libp2p/go-mplex v0.0.1/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0= -github.com/libp2p/go-msgio v0.0.1 h1:znj97n5FtXGCLDwe9x8jpHmY770SW4WStBGcCDh6GJw= -github.com/libp2p/go-msgio v0.0.1/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= +github.com/libp2p/go-maddr-filter v0.0.4 h1:hx8HIuuwk34KePddrp2mM5ivgPkZ09JH4AvsALRbFUs= +github.com/libp2p/go-maddr-filter v0.0.4/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= +github.com/libp2p/go-mplex v0.0.3/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0= +github.com/libp2p/go-mplex v0.0.4 h1:043XJ3Zr7/Oz5cfyUaJwxUZyP02TngTpt4oq8R5UizQ= +github.com/libp2p/go-mplex v0.0.4/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0= +github.com/libp2p/go-msgio v0.0.2 h1:ivPvEKHxmVkTClHzg6RXTYHqaJQ0V9cDbq+6lKb3UV0= +github.com/libp2p/go-msgio v0.0.2/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= +github.com/libp2p/go-nat v0.0.3 h1:l6fKV+p0Xa354EqQOQP+d8CivdLM4kl5GxC1hSc/UeI= +github.com/libp2p/go-nat v0.0.3/go.mod h1:88nUEt0k0JD45Bk93NIwDqjlhiOwOoV36GchpcVc1yI= github.com/libp2p/go-reuseport v0.0.1 h1:7PhkfH73VXfPJYKQ6JwS5I/eVcoyYi9IMNGc6FWpFLw= github.com/libp2p/go-reuseport v0.0.1/go.mod h1:jn6RmB1ufnQwl0Q1f+YxAj8isJgDCQzaaxIFYDhcYEA= -github.com/libp2p/go-reuseport-transport v0.0.1 h1:UIRneNxLDmEGNjGHpIiWzSWkZ5bhxMCP9x3Vh7BSc7E= -github.com/libp2p/go-reuseport-transport v0.0.1/go.mod h1:YkbSDrvjUVDL6b8XqriyA20obEtsW9BLkuOUyQAOCbs= +github.com/libp2p/go-reuseport-transport v0.0.2 h1:WglMwyXyBu61CMkjCCtnmqNqnjib0GIEjMiHTwR/KN4= +github.com/libp2p/go-reuseport-transport v0.0.2/go.mod h1:YkbSDrvjUVDL6b8XqriyA20obEtsW9BLkuOUyQAOCbs= github.com/libp2p/go-stream-muxer v0.0.1 h1:Ce6e2Pyu+b5MC1k3eeFtAax0pW4gc6MosYSLV05UeLw= github.com/libp2p/go-stream-muxer v0.0.1/go.mod h1:bAo8x7YkSpadMTbtTaxGVHWUQsR/l5MEaHbKaliuT14= -github.com/libp2p/go-tcp-transport v0.0.1 h1:WyvJVw2lYAnr6CU+GZZ4oCt06fvORlmvBlFX2+ZpZDM= -github.com/libp2p/go-tcp-transport v0.0.1/go.mod h1:mnjg0o0O5TmXUaUIanYPUqkW4+u6mK0en8rlpA6BBTs= +github.com/libp2p/go-stream-muxer v0.1.0 h1:3ToDXUzx8pDC6RfuOzGsUYP5roMDthbUKRdMRRhqAqY= +github.com/libp2p/go-stream-muxer v0.1.0/go.mod h1:8JAVsjeRBCWwPoZeH0W1imLOcriqXJyFvB0mR4A04sQ= +github.com/libp2p/go-stream-muxer-multistream v0.1.1 h1:DhHqb4nu1fQv/vQKeLAaZGmhLsUA4SF77IdYJiWE1d4= +github.com/libp2p/go-stream-muxer-multistream v0.1.1/go.mod h1:zmGdfkQ1AzOECIAcccoL8L//laqawOsO03zX8Sa+eGw= +github.com/libp2p/go-tcp-transport v0.0.4 h1:2iRu994wCT/iEz62F+c60FUoSkijNEQ0q2Itc+79XlQ= +github.com/libp2p/go-tcp-transport v0.0.4/go.mod h1:+E8HvC8ezEVOxIo3V5vCK9l1y/19K427vCzQ+xHKH/o= github.com/libp2p/go-testutil v0.0.1 h1:Xg+O0G2HIMfHqBOBDcMS1iSZJ3GEcId4qOxCQvsGZHk= github.com/libp2p/go-testutil v0.0.1/go.mod h1:iAcJc/DKJQanJ5ws2V+u5ywdL2n12X1WbbEG+Jjy69I= -github.com/libp2p/go-ws-transport v0.0.1/go.mod h1:p3bKjDWHEgtuKKj+2OdPYs5dAPIjtpQGHF2tJfGz7Ww= +github.com/libp2p/go-ws-transport v0.0.5/go.mod h1:Qbl4BxPfXXhhd/o0wcrgoaItHqA9tnZjoFZnxykuaXU= +github.com/libp2p/go-yamux v1.2.1/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= +github.com/libp2p/go-yamux v1.2.2/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= +github.com/libp2p/go-yamux v1.2.3 h1:xX8A36vpXb59frIzWFdEgptLMsOANMFq2K7fPRlunYI= +github.com/libp2p/go-yamux v1.2.3/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= github.com/mattn/go-colorable v0.1.1 h1:G1f5SKeVxmagw/IyvzvtZE4Gybcc4Tr1tf7I8z0XgOg= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= +github.com/mattn/go-colorable v0.1.2 h1:/bC9yWikZXAL9uJdulbSfyVNIR3n3trXl+v8+1sx8mU= +github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-isatty v0.0.5 h1:tHXDdz1cpzGaovsTB+TVB8q90WEokoVmfMqoVcrLUgw= github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/miekg/dns v1.1.4/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/mattn/go-isatty v0.0.8 h1:HLtExJ+uU2HOZ+wI0Tt5DtUDrx8yhUqDcp7fYERX4CE= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/miekg/dns v1.1.12/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0OXOcUbGjvZxxijuBwbbmlSxLiuofa+g= github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16 h1:5W7KhL8HVF3XCFOweFD3BNESdnO8ewyYTFT2R+/b8FQ= github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= +github.com/minio/sha256-simd v0.0.0-20190328051042-05b4dd3047e5/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= +github.com/minio/sha256-simd v0.1.0 h1:U41/2erhAKcmSI14xh/ZTUdBPOzDOIfS93ibzUSl8KM= +github.com/minio/sha256-simd v0.1.0/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= github.com/mr-tron/base58 v1.1.0 h1:Y51FGVJ91WBqCEabAi5OPUz38eAx8DakuAm5svLcsfQ= github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= +github.com/mr-tron/base58 v1.1.1/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= +github.com/mr-tron/base58 v1.1.2 h1:ZEw4I2EgPKDJ2iEw0cNmLB3ROrEmkOtXIkaG7wZg+78= +github.com/mr-tron/base58 v1.1.2/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= github.com/multiformats/go-base32 v0.0.3 h1:tw5+NhuwaOjJCC5Pp82QuXbrmLzWg7uxlMFp8Nq/kkI= github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= github.com/multiformats/go-multiaddr v0.0.1 h1:/QUV3VBMDI6pi6xfiw7lr6xhDWWvQKn9udPn68kLSdY= github.com/multiformats/go-multiaddr v0.0.1/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= +github.com/multiformats/go-multiaddr v0.0.2/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= +github.com/multiformats/go-multiaddr v0.0.4 h1:WgMSI84/eRLdbptXMkMWDXPjPq7SPLIgGUVm2eroyU4= +github.com/multiformats/go-multiaddr v0.0.4/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= github.com/multiformats/go-multiaddr-dns v0.0.1/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= github.com/multiformats/go-multiaddr-dns v0.0.2 h1:/Bbsgsy3R6e3jf2qBahzNHzww6usYaZ0NhNH3sqdFS8= github.com/multiformats/go-multiaddr-dns v0.0.2/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= @@ -233,15 +299,26 @@ github.com/multiformats/go-multibase v0.0.1 h1:PN9/v21eLywrFWdFNsFKaU04kLJzuYzmr github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs= github.com/multiformats/go-multihash v0.0.1 h1:HHwN1K12I+XllBCrqKnhX949Orn4oawPkegHMu2vDqQ= github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= +github.com/multiformats/go-multihash v0.0.5 h1:1wxmCvTXAifAepIMyF39vZinRw5sbqjPs/UIi93+uik= +github.com/multiformats/go-multihash v0.0.5/go.mod h1:lt/HCbqlQwlPBz7lv0sQCdtfcMtlJvakRUn/0Ual8po= github.com/multiformats/go-multistream v0.0.1 h1:JV4VfSdY9n7ECTtY59/TlSyFCzRILvYx4T4Ws8ZgihU= github.com/multiformats/go-multistream v0.0.1/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= +github.com/multiformats/go-multistream v0.0.4/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= +github.com/multiformats/go-multistream v0.1.0 h1:UpO6jrsjqs46mqAK3n6wKRYFhugss9ArzbyUzU+4wkQ= +github.com/multiformats/go-multistream v0.1.0/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= 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/ginkgo v1.8.0 h1:VkHVNpR4iVnU8XQR6DBm8BqYjN7CRzw+xKUbVVbbW9w= +github.com/onsi/ginkgo v1.8.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/onsi/gomega v1.5.0 h1:izbySO9zDPmjJ8rDjLvkA2zJHIo+HkYXHnf7eN7SSyo= +github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/opentracing/opentracing-go v1.0.2 h1:3jA2P6O1F9UOrWVpwrIo17pu01KWvNWg4X946/Y5Zwg= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +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/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= @@ -252,8 +329,12 @@ github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykE github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v0.0.0-20190222223459-a17d461953aa h1:E+gaaifzi2xF65PbDmuKI3PhLWY6G5opMLniFq8vmXA= github.com/smartystreets/goconvey v0.0.0-20190222223459-a17d461953aa/go.mod h1:2RVY1rIf+2J2o/IM9+vPq9RzmHDSseB7FoXiSNIUsoU= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72 h1:qLC7fQah7D6K1B0ujays3HV9gkFtllcxhzImRR7ArPQ= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a h1:/eS3yfGjQKG+9kayBkj0ip1BGhq6zJ3eaVksphxAaek= +github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a/go.mod h1:7AyxJNCJ7SBZ1MfVQCWD6Uqo2oubI2Eq2y2eqf+A5r0= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 h1:RC6RW7j+1+HkWaX/Yh71Ee5ZHaHYt7ZP4sQgUrm6cDU= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572/go.mod h1:w0SWMsp6j9O/dk4/ZpIhL+3CkG8ofA2vuv7k+ltqUMc= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= @@ -267,29 +348,27 @@ github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc h1:9lDbC6 github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc/go.mod h1:bopw91TMyo8J3tvftk8xmU2kPmlrt4nScJQZU2hE5EM= github.com/whyrusleeping/go-notifier v0.0.0-20170827234753-097c5d47330f h1:M/lL30eFZTKnomXY6huvM6G0+gVquFNf6mxghaWlFUg= github.com/whyrusleeping/go-notifier v0.0.0-20170827234753-097c5d47330f/go.mod h1:cZNvX9cFybI01GriPRMXDtczuvUhgbcYr9iCGaNlRv8= -github.com/whyrusleeping/go-smux-multiplex v3.0.16+incompatible h1:iqksILj8STw03EJQe7Laj4ubnw+ojOyik18cd5vPL1o= -github.com/whyrusleeping/go-smux-multiplex v3.0.16+incompatible/go.mod h1:34LEDbeKFZInPUrAG+bjuJmUXONGdEFW7XL0SpTY1y4= -github.com/whyrusleeping/go-smux-multistream v2.0.2+incompatible h1:BdYHctE9HJZLquG9tpTdwWcbG4FaX6tVKPGjCGgiVxo= -github.com/whyrusleeping/go-smux-multistream v2.0.2+incompatible/go.mod h1:dRWHHvc4HDQSHh9gbKEBbUZ+f2Q8iZTPG3UOGYODxSQ= -github.com/whyrusleeping/go-smux-yamux v2.0.8+incompatible h1:IGm/UP/JpEFS6D787sZnZg7RA6fZIR9c/Ms9DeAVNuk= -github.com/whyrusleeping/go-smux-yamux v2.0.8+incompatible/go.mod h1:6qHUzBXUbB9MXmw3AUdB52L8sEb/hScCqOdW2kj/wuI= -github.com/whyrusleeping/go-smux-yamux v2.0.9+incompatible/go.mod h1:6qHUzBXUbB9MXmw3AUdB52L8sEb/hScCqOdW2kj/wuI= github.com/whyrusleeping/mafmt v1.2.8 h1:TCghSl5kkwEE0j+sU/gudyhVMRlpBin8fMBBHg59EbA= github.com/whyrusleeping/mafmt v1.2.8/go.mod h1:faQJFPbLSxzD9xpA02ttW/tS9vZykNvXwGvqIpk20FA= github.com/whyrusleeping/mdns v0.0.0-20180901202407-ef14215e6b30/go.mod h1:j4l84WPFclQPj320J9gp0XwNKBb3U0zt5CBqjPp22G4= github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7 h1:E9S12nwJwEOXe2d6gT6qxdvqMnNq+VnSsKPgm2ZZNds= github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7/go.mod h1:X2c0RVCI1eSUFI8eLcY3c0423ykwiUdxLJtkDvruhjI= -github.com/whyrusleeping/yamux v1.1.5 h1:4CK3aUUJQu0qpKZv5gEWJjNOQtdbdDhVVS6PJ+HimdE= -github.com/whyrusleeping/yamux v1.1.5/go.mod h1:E8LnQQ8HKx5KD29HZFUwM1PxCOdPRzGwur1mcYhXcD8= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25 h1:jsG6UpNLt9iAsb0S2AGW28DveNzzgmbXR+ENoPjUeIU= golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/net v0.0.0-20180524181706-dfa909b99c79/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f h1:R423Cnkcp5JABoeemiGEPlt9tHXFfw5kvc0yqlxRPWo= +golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190227160552-c95aed5357e7 h1:C2F/nMkR/9sfUTpvR3QrjBuTdvMUC/cFajkphs1YLQo= golang.org/x/net v0.0.0-20190227160552-c95aed5357e7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190522155817-f3200d17e092 h1:4QSRKanuywn15aTZvI/mIDEgPQpswuFndXpOj3rKEco= +golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f h1:wMNYb4v58l5UBM7MYRLPG6ZhfOqbKu7X5eyFl8ZhKvA= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -299,9 +378,16 @@ golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20190228124157-a34e9553db1e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190302025703-b6889370fb10 h1:xQJI9OEiErEQ++DoXOHqEpzsGMrAv2Q2jyCpi7DmfpQ= golang.org/x/sys v0.0.0-20190302025703-b6889370fb10/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190524122548-abf6ff778158/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190524152521-dbbf3f1254d4 h1:VSJ45BzqrVgR4clSx415y1rHH7QAGhGt71J0ZmhLYrc= +golang.org/x/sys v0.0.0-20190524152521-dbbf3f1254d4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= 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/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= 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= @@ -312,3 +398,5 @@ gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkep gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.1 h1:mUhvW9EsL+naU5Q3cakzfE91YhliOondGd6ZrsDBHQE= 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= diff --git a/vendor/github.com/ipfs/go-unixfs/importer/helpers/dagbuilder.go b/vendor/github.com/ipfs/go-unixfs/importer/helpers/dagbuilder.go index a624217f..e3cf7b44 100644 --- a/vendor/github.com/ipfs/go-unixfs/importer/helpers/dagbuilder.go +++ b/vendor/github.com/ipfs/go-unixfs/importer/helpers/dagbuilder.go @@ -65,11 +65,6 @@ type DagBuilderParams struct { // NoCopy signals to the chunker that it should track fileinfo for // filestore adds NoCopy bool - - // URL if non-empty (and NoCopy is also true) indicates that the - // file will not be stored in the datastore but instead retrieved - // from this location via the urlstore. - URL string } // New generates a new DagBuilderHelper from the given params and a given @@ -87,10 +82,6 @@ func (dbp *DagBuilderParams) New(spl chunker.Splitter) (*DagBuilderHelper, error db.stat = fi.Stat() } - if dbp.URL != "" && dbp.NoCopy { - db.fullPath = dbp.URL - } - if dbp.NoCopy && db.fullPath == "" { // Enforce NoCopy return nil, ErrMissingFsRef } diff --git a/vendor/github.com/ipfs/interface-go-ipfs-core/.travis.yml b/vendor/github.com/ipfs/interface-go-ipfs-core/.travis.yml index 4cfe98c2..5163d693 100644 --- a/vendor/github.com/ipfs/interface-go-ipfs-core/.travis.yml +++ b/vendor/github.com/ipfs/interface-go-ipfs-core/.travis.yml @@ -10,7 +10,6 @@ env: global: - GOTFLAGS="-race" matrix: - - BUILD_DEPTYPE=gx - BUILD_DEPTYPE=gomod @@ -24,7 +23,6 @@ script: cache: directories: - - $GOPATH/src/gx - $GOPATH/pkg/mod - $HOME/.cache/go-build diff --git a/vendor/github.com/ipfs/interface-go-ipfs-core/dht.go b/vendor/github.com/ipfs/interface-go-ipfs-core/dht.go index 0cb7893e..5f49e74a 100644 --- a/vendor/github.com/ipfs/interface-go-ipfs-core/dht.go +++ b/vendor/github.com/ipfs/interface-go-ipfs-core/dht.go @@ -6,8 +6,7 @@ import ( "github.com/ipfs/interface-go-ipfs-core/options" - "github.com/libp2p/go-libp2p-peer" - pstore "github.com/libp2p/go-libp2p-peerstore" + "github.com/libp2p/go-libp2p-core/peer" ) // DhtAPI specifies the interface to the DHT @@ -16,11 +15,11 @@ import ( type DhtAPI interface { // FindPeer queries the DHT for all of the multiaddresses associated with a // Peer ID - FindPeer(context.Context, peer.ID) (pstore.PeerInfo, error) + FindPeer(context.Context, peer.ID) (peer.AddrInfo, error) // FindProviders finds peers in the DHT who can provide a specific value // given a key. - FindProviders(context.Context, path.Path, ...options.DhtFindProvidersOption) (<-chan pstore.PeerInfo, error) + FindProviders(context.Context, path.Path, ...options.DhtFindProvidersOption) (<-chan peer.AddrInfo, error) // Provide announces to the network that you are providing given values Provide(context.Context, path.Path, ...options.DhtProvideOption) error diff --git a/vendor/github.com/ipfs/interface-go-ipfs-core/go.mod b/vendor/github.com/ipfs/interface-go-ipfs-core/go.mod index 45826085..89c92120 100644 --- a/vendor/github.com/ipfs/interface-go-ipfs-core/go.mod +++ b/vendor/github.com/ipfs/interface-go-ipfs-core/go.mod @@ -1,17 +1,14 @@ module github.com/ipfs/interface-go-ipfs-core require ( - github.com/ipfs/go-cid v0.0.1 + github.com/ipfs/go-cid v0.0.2 github.com/ipfs/go-ipfs-files v0.0.2 github.com/ipfs/go-ipld-cbor v0.0.1 github.com/ipfs/go-ipld-format v0.0.1 github.com/ipfs/go-merkledag v0.0.3 github.com/ipfs/go-path v0.0.3 github.com/ipfs/go-unixfs v0.0.4 - github.com/libp2p/go-libp2p-net v0.0.1 - github.com/libp2p/go-libp2p-peer v0.0.1 - github.com/libp2p/go-libp2p-peerstore v0.0.1 - github.com/libp2p/go-libp2p-protocol v0.0.1 - github.com/multiformats/go-multiaddr v0.0.1 - github.com/multiformats/go-multihash v0.0.1 + github.com/libp2p/go-libp2p-core v0.0.2 + github.com/multiformats/go-multiaddr v0.0.4 + github.com/multiformats/go-multihash v0.0.5 ) diff --git a/vendor/github.com/ipfs/interface-go-ipfs-core/go.sum b/vendor/github.com/ipfs/interface-go-ipfs-core/go.sum index ada0df62..2df61ab6 100644 --- a/vendor/github.com/ipfs/interface-go-ipfs-core/go.sum +++ b/vendor/github.com/ipfs/interface-go-ipfs-core/go.sum @@ -4,8 +4,11 @@ github.com/Stebalien/go-bitfield v0.0.0-20180330043415-076a62f9ce6e/go.mod h1:3o github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32 h1:qkOC5Gd33k54tobS36cXdAzJbeHaduLtnLQQwNoIi78= github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32/go.mod h1:DrZx5ec/dmnfpw9KyYoQyYo7d0KEvTkk/5M/vbZjAr8= +github.com/btcsuite/btcd v0.0.0-20190523000118-16327141da8c h1:aEbSeNALREWXk0G7UdNhR3ayBV7tZ4M2PNmnrCAph6Q= +github.com/btcsuite/btcd v0.0.0-20190523000118-16327141da8c/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI= github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= github.com/btcsuite/btcutil v0.0.0-20190207003914-4c204d697803/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= +github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= @@ -13,6 +16,8 @@ github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtE github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= github.com/coreos/go-semver v0.2.0 h1:3Jm3tLmsgAYcjC+4Up7hJrFBPr+n7rAqYeSw/SZazuY= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/cskr/pubsub v1.0.2 h1:vlOzMhl6PFn60gRlTQQsIfVwaPB/B/8MziK8FhEPt/0= github.com/cskr/pubsub v1.0.2/go.mod h1:/8MzYXk/NJAz782G8RPkFzXTZVu63VotefPnR9TIRis= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -61,6 +66,8 @@ github.com/ipfs/go-blockservice v0.0.3 h1:40OvwrxeudTAlUGUAKNYnNPcwQeLtXedjzTWec github.com/ipfs/go-blockservice v0.0.3/go.mod h1:/NNihwTi6V2Yr6g8wBI+BSwPuURpBRMtYNGrlxZ8KuI= github.com/ipfs/go-cid v0.0.1 h1:GBjWPktLnNyX0JiQCNFpUuUSoMw5KMyqrsejHYlILBE= github.com/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= +github.com/ipfs/go-cid v0.0.2 h1:tuuKaZPU1M6HcejsO3AcYWW8sZ8MTvyxfc4uqB4eFE8= +github.com/ipfs/go-cid v0.0.2/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= github.com/ipfs/go-datastore v0.0.1 h1:AW/KZCScnBWlSb5JbnEnLKFWXL224LBEh/9KXXOrUms= github.com/ipfs/go-datastore v0.0.1/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk= @@ -82,8 +89,6 @@ github.com/ipfs/go-ipfs-exchange-interface v0.0.1 h1:LJXIo9W7CAmugqI+uofioIpRb6r github.com/ipfs/go-ipfs-exchange-interface v0.0.1/go.mod h1:c8MwfHjtQjPoDyiy9cFquVtVHkO9b9Ob3FG91qJnWCM= github.com/ipfs/go-ipfs-exchange-offline v0.0.1 h1:P56jYKZF7lDDOLx5SotVh5KFxoY6C81I1NSHW1FxGew= github.com/ipfs/go-ipfs-exchange-offline v0.0.1/go.mod h1:WhHSFCVYX36H/anEKQboAzpUws3x7UeEGkzQc3iNkM0= -github.com/ipfs/go-ipfs-files v0.0.1 h1:OroTsI58plHGX70HPLKy6LQhPR3HZJ5ip61fYlo6POM= -github.com/ipfs/go-ipfs-files v0.0.1/go.mod h1:INEFm0LL2LWXBhNJ2PMIIb2w45hpXgPjNoE7yA8Y1d4= github.com/ipfs/go-ipfs-files v0.0.2 h1:fEEjF4H+1t8SFOHqUGp0KqcwgIRlbD2bu8CAS2sIggE= github.com/ipfs/go-ipfs-files v0.0.2/go.mod h1:INEFm0LL2LWXBhNJ2PMIIb2w45hpXgPjNoE7yA8Y1d4= github.com/ipfs/go-ipfs-flags v0.0.1 h1:OH5cEkJYL0QgA+bvD55TNG9ud8HA2Nqaav47b2c/UJk= @@ -108,8 +113,6 @@ github.com/ipfs/go-metrics-interface v0.0.1 h1:j+cpbjYvu4R8zbleSs36gvB7jR+wsL2fG github.com/ipfs/go-metrics-interface v0.0.1/go.mod h1:6s6euYU4zowdslK0GKHmqaIZ3j/b/tL7HTWtJ4VPgWY= github.com/ipfs/go-path v0.0.3 h1:G/VFcCMXtp36JUPPyytYQ1I3UsBUBf47M//uSdTLnFg= github.com/ipfs/go-path v0.0.3/go.mod h1:zIRQUez3LuQIU25zFjC2hpBTHimWx7VK5bjZgRLbbdo= -github.com/ipfs/go-unixfs v0.0.3 h1:09koecZaoJVoYy6Wkd/vo1lyQ4AdgAe83eJylQ7gAZw= -github.com/ipfs/go-unixfs v0.0.3/go.mod h1:FX/6aS/Xg95JRc6UMyiMdZeNn+N5VkD8/yfLNwKW0Ks= github.com/ipfs/go-unixfs v0.0.4 h1:IApzQ+SnY0tfjqM7aU2b80CFYLZNHvhLmEZDIWr4e/E= github.com/ipfs/go-unixfs v0.0.4/go.mod h1:eIo/p9ADu/MFOuyxzwU+Th8D6xoxU//r590vUpWyfz8= github.com/ipfs/go-verifcid v0.0.1 h1:m2HI7zIuR5TFyQ1b79Da5N9dnnCP1vcu2QqawmWlK2E= @@ -120,10 +123,14 @@ github.com/jackpal/go-nat-pmp v1.0.1 h1:i0LektDkO1QlrTm/cSuP+PyBCDnYvjPLGl4LdWEM github.com/jackpal/go-nat-pmp v1.0.1/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= github.com/jbenet/go-cienv v0.0.0-20150120210510-1bb1476777ec h1:DQqZhhDvrTrEQ3Qod5yfavcA064e53xlQ+xajiorXgM= github.com/jbenet/go-cienv v0.0.0-20150120210510-1bb1476777ec/go.mod h1:rGaEvXB4uRSZMmzKNLoXvTu1sfx+1kv/DojUlPrSZGs= +github.com/jbenet/go-cienv v0.1.0 h1:Vc/s0QbQtoxX8MwwSLWWh+xNNZvM3Lw7NsTcHrvvhMc= +github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA= github.com/jbenet/go-temp-err-catcher v0.0.0-20150120210811-aac704a3f4f2 h1:vhC1OXXiT9R2pczegwz6moDvuRpggaroAXhPIseh57A= github.com/jbenet/go-temp-err-catcher v0.0.0-20150120210811-aac704a3f4f2/go.mod h1:8GXXJV31xl8whumTzdZsTt3RnUIiPqzkyf7mxToRCMs= github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8 h1:bspPhN+oKYFk5fcGNuQzp6IGzYQSenLEgH3s6jkXrWw= github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8/go.mod h1:Ly/wlsjFq/qrU3Rar62tu1gASgGw6chQbSh/XgIIXCY= +github.com/jbenet/goprocess v0.1.3 h1:YKyIEECS/XvcfHtBzxtjBBbWK+MbvA6dG8ASiqwvr10= +github.com/jbenet/goprocess v0.1.3/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= github.com/jtolds/gls v4.2.1+incompatible h1:fSuqC+Gmlu6l/ZYAoZzx2pyucC8Xza35fpRVWLVmUEE= @@ -152,6 +159,8 @@ github.com/libp2p/go-libp2p-autonat v0.0.2/go.mod h1:fs71q5Xk+pdnKU014o2iq1RhMs9 github.com/libp2p/go-libp2p-blankhost v0.0.1 h1:/mZuuiwntNR8RywnCFlGHLKrKLYne+qciBpQXWqp5fk= github.com/libp2p/go-libp2p-blankhost v0.0.1/go.mod h1:Ibpbw/7cPPYwFb7PACIWdvxxv0t0XCCI10t7czjAjTc= github.com/libp2p/go-libp2p-circuit v0.0.1/go.mod h1:Dqm0s/BiV63j8EEAs8hr1H5HudqvCAeXxDyic59lCwE= +github.com/libp2p/go-libp2p-core v0.0.2 h1:86uOwW+O6Uc7NbaK4diuLZo2/Ikvqw2rgyV03VcSbLE= +github.com/libp2p/go-libp2p-core v0.0.2/go.mod h1:9dAcntw/n46XycV4RnlBq3BpgrmyUi9LuoTNdPrbUco= github.com/libp2p/go-libp2p-crypto v0.0.1 h1:JNQd8CmoGTohO/akqrH16ewsqZpci2CbgYH/LmYl8gw= github.com/libp2p/go-libp2p-crypto v0.0.1/go.mod h1:yJkNyDmO341d5wwXxDUGO0LykUVT72ImHNUqh5D/dBE= github.com/libp2p/go-libp2p-discovery v0.0.1/go.mod h1:ZkkF9xIFRLA1xCc7bstYFkd80gBGK8Fc1JqGoU2i+zI= @@ -216,12 +225,18 @@ github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0 github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16 h1:5W7KhL8HVF3XCFOweFD3BNESdnO8ewyYTFT2R+/b8FQ= github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= +github.com/minio/sha256-simd v0.0.0-20190328051042-05b4dd3047e5 h1:l16XLUUJ34wIz+RIvLhSwGvLvKyy+W598b135bJN6mg= +github.com/minio/sha256-simd v0.0.0-20190328051042-05b4dd3047e5/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= github.com/mr-tron/base58 v1.1.0 h1:Y51FGVJ91WBqCEabAi5OPUz38eAx8DakuAm5svLcsfQ= github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= +github.com/mr-tron/base58 v1.1.2 h1:ZEw4I2EgPKDJ2iEw0cNmLB3ROrEmkOtXIkaG7wZg+78= +github.com/mr-tron/base58 v1.1.2/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= github.com/multiformats/go-base32 v0.0.3 h1:tw5+NhuwaOjJCC5Pp82QuXbrmLzWg7uxlMFp8Nq/kkI= github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= github.com/multiformats/go-multiaddr v0.0.1 h1:/QUV3VBMDI6pi6xfiw7lr6xhDWWvQKn9udPn68kLSdY= github.com/multiformats/go-multiaddr v0.0.1/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= +github.com/multiformats/go-multiaddr v0.0.4 h1:WgMSI84/eRLdbptXMkMWDXPjPq7SPLIgGUVm2eroyU4= +github.com/multiformats/go-multiaddr v0.0.4/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= github.com/multiformats/go-multiaddr-dns v0.0.1/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= github.com/multiformats/go-multiaddr-dns v0.0.2 h1:/Bbsgsy3R6e3jf2qBahzNHzww6usYaZ0NhNH3sqdFS8= github.com/multiformats/go-multiaddr-dns v0.0.2/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= @@ -231,6 +246,8 @@ github.com/multiformats/go-multibase v0.0.1 h1:PN9/v21eLywrFWdFNsFKaU04kLJzuYzmr github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs= github.com/multiformats/go-multihash v0.0.1 h1:HHwN1K12I+XllBCrqKnhX949Orn4oawPkegHMu2vDqQ= github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= +github.com/multiformats/go-multihash v0.0.5 h1:1wxmCvTXAifAepIMyF39vZinRw5sbqjPs/UIi93+uik= +github.com/multiformats/go-multihash v0.0.5/go.mod h1:lt/HCbqlQwlPBz7lv0sQCdtfcMtlJvakRUn/0Ual8po= github.com/multiformats/go-multistream v0.0.1 h1:JV4VfSdY9n7ECTtY59/TlSyFCzRILvYx4T4Ws8ZgihU= github.com/multiformats/go-multistream v0.0.1/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= @@ -250,7 +267,13 @@ github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykE github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v0.0.0-20190222223459-a17d461953aa h1:E+gaaifzi2xF65PbDmuKI3PhLWY6G5opMLniFq8vmXA= github.com/smartystreets/goconvey v0.0.0-20190222223459-a17d461953aa/go.mod h1:2RVY1rIf+2J2o/IM9+vPq9RzmHDSseB7FoXiSNIUsoU= +github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a h1:/eS3yfGjQKG+9kayBkj0ip1BGhq6zJ3eaVksphxAaek= +github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a/go.mod h1:7AyxJNCJ7SBZ1MfVQCWD6Uqo2oubI2Eq2y2eqf+A5r0= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 h1:RC6RW7j+1+HkWaX/Yh71Ee5ZHaHYt7ZP4sQgUrm6cDU= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572/go.mod h1:w0SWMsp6j9O/dk4/ZpIhL+3CkG8ofA2vuv7k+ltqUMc= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= @@ -284,10 +307,16 @@ golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnf golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25 h1:jsG6UpNLt9iAsb0S2AGW28DveNzzgmbXR+ENoPjUeIU= golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f h1:R423Cnkcp5JABoeemiGEPlt9tHXFfw5kvc0yqlxRPWo= +golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/net v0.0.0-20180524181706-dfa909b99c79/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190227160552-c95aed5357e7 h1:C2F/nMkR/9sfUTpvR3QrjBuTdvMUC/cFajkphs1YLQo= golang.org/x/net v0.0.0-20190227160552-c95aed5357e7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3 h1:0GoQqolDA55aaLxZyTzK/Y2ePZzZTUrRacwib7cNsYQ= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f h1:wMNYb4v58l5UBM7MYRLPG6ZhfOqbKu7X5eyFl8ZhKvA= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -297,6 +326,8 @@ golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20190228124157-a34e9553db1e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190302025703-b6889370fb10 h1:xQJI9OEiErEQ++DoXOHqEpzsGMrAv2Q2jyCpi7DmfpQ= golang.org/x/sys v0.0.0-20190302025703-b6889370fb10/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d h1:+R4KGOnez64A81RvjARKc4UT5/tI9ujCIVX+P5KiHuI= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= diff --git a/vendor/github.com/ipfs/interface-go-ipfs-core/key.go b/vendor/github.com/ipfs/interface-go-ipfs-core/key.go index e7fb3f44..db729b3b 100644 --- a/vendor/github.com/ipfs/interface-go-ipfs-core/key.go +++ b/vendor/github.com/ipfs/interface-go-ipfs-core/key.go @@ -6,7 +6,7 @@ import ( "github.com/ipfs/interface-go-ipfs-core/options" - "github.com/libp2p/go-libp2p-peer" + "github.com/libp2p/go-libp2p-core/peer" ) // Key specifies the interface to Keys in KeyAPI Keystore diff --git a/vendor/github.com/ipfs/interface-go-ipfs-core/package.json b/vendor/github.com/ipfs/interface-go-ipfs-core/package.json deleted file mode 100644 index 63933ad4..00000000 --- a/vendor/github.com/ipfs/interface-go-ipfs-core/package.json +++ /dev/null @@ -1,96 +0,0 @@ -{ - "author": "magik6k", - "bugs": { - "url": "https://github.com/ipfs/interface-go-ipfs-core" - }, - "gx": { - "dvcsimport": "github.com/ipfs/interface-go-ipfs-core" - }, - "gxDependencies": [ - { - "author": "magik6k", - "hash": "QmRHcZ5ngUxZo8phLR3fpoqk9wA7VdGc5mhwkGSnB2nZ9F", - "name": "go-ipfs-files", - "version": "2.0.7" - }, - { - "author": "multiformats", - "hash": "QmerPMzPk1mJVowm8KgmoknWa4yCYvvugMPsgWmDNUvDLW", - "name": "go-multihash", - "version": "1.0.9" - }, - { - "author": "multiformats", - "hash": "QmTZBfrPJmjWsCvHEtX5FE6KimVJhsJg5sBbqEFYf4UZtL", - "name": "go-multiaddr", - "version": "1.4.1" - }, - { - "author": "whyrusleeping", - "hash": "QmYVXrKrKHDC9FobgmcmshCDyWwdrfwfanNQN4oxJ9Fk3h", - "name": "go-libp2p-peer", - "version": "3.1.2" - }, - { - "author": "why", - "hash": "QmUquHAkyh9phs4ojSuHcHcZnUMGDwDNJZWnRXkNks1qLB", - "name": "go-path", - "version": "1.1.41" - }, - { - "author": "whyrusleeping", - "hash": "QmaCTz9RkrU13bm9kMB54f7atgqM4qkjDZpRwRoJiWXEqs", - "name": "go-libp2p-peerstore", - "version": "2.0.19" - }, - { - "author": "whyrusleeping", - "hash": "QmTbxNB1NwDesLmKTscr4udL2tVP7MaxvXnD1D9yX7g3PN", - "name": "go-cid", - "version": "0.9.3" - }, - { - "author": "whyrusleeping", - "hash": "QmZ6nzCLwGLVfRzYLpD7pW6UNuBDKEcA2imJtVpbEx2rxy", - "name": "go-ipld-format", - "version": "0.8.1" - }, - { - "author": "whyrusleeping", - "hash": "QmVwsD9oGSAKcCoD4BGi3Hx8XRo4jNy6aMzsjDHVTgYv2D", - "name": "go-ipld-cbor", - "version": "1.5.10" - }, - { - "author": "why", - "hash": "QmY6UwsN3D6uoxrRkYpJ8Wos8R66gwLmdn3wy7jM7CCRQ1", - "name": "go-merkledag", - "version": "1.1.40" - }, - { - "author": "whyrusleeping", - "hash": "QmY3ArotKMKaL7YGfbQfyDrib6RVraLqZYWXZvVgZktBxp", - "name": "go-libp2p-net", - "version": "3.0.30" - }, - { - "author": "why", - "hash": "QmVmueix5wxmr8UWpfpcKw6F1xT7T8AS7CXQRM37BE29eX", - "name": "go-unixfs", - "version": "1.3.15" - }, - { - "author": "whyrusleeping", - "hash": "QmZNkThpqfVXs9GNbexPrfBbXSLNYeKrE7jwFM2oqHbyqN", - "name": "go-libp2p-protocol", - "version": "1.0.0" - } - ], - "gxVersion": "0.14.0", - "language": "go", - "license": "", - "name": "interface-go-ipfs-core", - "releaseCmd": "git commit -a -m \"gx publish $VERSION\"", - "version": "0.1.16" -} - diff --git a/vendor/github.com/ipfs/interface-go-ipfs-core/pubsub.go b/vendor/github.com/ipfs/interface-go-ipfs-core/pubsub.go index 212e7722..d9826551 100644 --- a/vendor/github.com/ipfs/interface-go-ipfs-core/pubsub.go +++ b/vendor/github.com/ipfs/interface-go-ipfs-core/pubsub.go @@ -6,7 +6,7 @@ import ( options "github.com/ipfs/interface-go-ipfs-core/options" - peer "github.com/libp2p/go-libp2p-peer" + "github.com/libp2p/go-libp2p-core/peer" ) // PubSubSubscription is an active PubSub subscription diff --git a/vendor/github.com/ipfs/interface-go-ipfs-core/swarm.go b/vendor/github.com/ipfs/interface-go-ipfs-core/swarm.go index 2e00ecbd..d7b25d5e 100644 --- a/vendor/github.com/ipfs/interface-go-ipfs-core/swarm.go +++ b/vendor/github.com/ipfs/interface-go-ipfs-core/swarm.go @@ -5,10 +5,10 @@ import ( "errors" "time" - net "github.com/libp2p/go-libp2p-net" - "github.com/libp2p/go-libp2p-peer" - pstore "github.com/libp2p/go-libp2p-peerstore" - "github.com/libp2p/go-libp2p-protocol" + "github.com/libp2p/go-libp2p-core/network" + "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p-core/protocol" + ma "github.com/multiformats/go-multiaddr" ) @@ -26,7 +26,7 @@ type ConnectionInfo interface { Address() ma.Multiaddr // Direction returns which way the connection was established - Direction() net.Direction + Direction() network.Direction // Latency returns last known round trip time to the peer Latency() (time.Duration, error) @@ -38,7 +38,7 @@ type ConnectionInfo interface { // SwarmAPI specifies the interface to libp2p swarm type SwarmAPI interface { // Connect to a given peer - Connect(context.Context, pstore.PeerInfo) error + Connect(context.Context, peer.AddrInfo) error // Disconnect from a given address Disconnect(context.Context, ma.Multiaddr) error diff --git a/vendor/github.com/jbenet/go-context/io/ctxio.go b/vendor/github.com/jbenet/go-context/io/ctxio.go deleted file mode 100644 index b4f24542..00000000 --- a/vendor/github.com/jbenet/go-context/io/ctxio.go +++ /dev/null @@ -1,120 +0,0 @@ -// Package ctxio provides io.Reader and io.Writer wrappers that -// respect context.Contexts. Use these at the interface between -// your context code and your io. -// -// WARNING: read the code. see how writes and reads will continue -// until you cancel the io. Maybe this package should provide -// versions of io.ReadCloser and io.WriteCloser that automatically -// call .Close when the context expires. But for now -- since in my -// use cases I have long-lived connections with ephemeral io wrappers -// -- this has yet to be a need. -package ctxio - -import ( - "io" - - context "golang.org/x/net/context" -) - -type ioret struct { - n int - err error -} - -type Writer interface { - io.Writer -} - -type ctxWriter struct { - w io.Writer - ctx context.Context -} - -// NewWriter wraps a writer to make it respect given Context. -// If there is a blocking write, the returned Writer will return -// whenever the context is cancelled (the return values are n=0 -// and err=ctx.Err().) -// -// Note well: this wrapper DOES NOT ACTUALLY cancel the underlying -// write-- there is no way to do that with the standard go io -// interface. So the read and write _will_ happen or hang. So, use -// this sparingly, make sure to cancel the read or write as necesary -// (e.g. closing a connection whose context is up, etc.) -// -// Furthermore, in order to protect your memory from being read -// _after_ you've cancelled the context, this io.Writer will -// first make a **copy** of the buffer. -func NewWriter(ctx context.Context, w io.Writer) *ctxWriter { - if ctx == nil { - ctx = context.Background() - } - return &ctxWriter{ctx: ctx, w: w} -} - -func (w *ctxWriter) Write(buf []byte) (int, error) { - buf2 := make([]byte, len(buf)) - copy(buf2, buf) - - c := make(chan ioret, 1) - - go func() { - n, err := w.w.Write(buf2) - c <- ioret{n, err} - close(c) - }() - - select { - case r := <-c: - return r.n, r.err - case <-w.ctx.Done(): - return 0, w.ctx.Err() - } -} - -type Reader interface { - io.Reader -} - -type ctxReader struct { - r io.Reader - ctx context.Context -} - -// NewReader wraps a reader to make it respect given Context. -// If there is a blocking read, the returned Reader will return -// whenever the context is cancelled (the return values are n=0 -// and err=ctx.Err().) -// -// Note well: this wrapper DOES NOT ACTUALLY cancel the underlying -// write-- there is no way to do that with the standard go io -// interface. So the read and write _will_ happen or hang. So, use -// this sparingly, make sure to cancel the read or write as necesary -// (e.g. closing a connection whose context is up, etc.) -// -// Furthermore, in order to protect your memory from being read -// _before_ you've cancelled the context, this io.Reader will -// allocate a buffer of the same size, and **copy** into the client's -// if the read succeeds in time. -func NewReader(ctx context.Context, r io.Reader) *ctxReader { - return &ctxReader{ctx: ctx, r: r} -} - -func (r *ctxReader) Read(buf []byte) (int, error) { - buf2 := make([]byte, len(buf)) - - c := make(chan ioret, 1) - - go func() { - n, err := r.r.Read(buf2) - c <- ioret{n, err} - close(c) - }() - - select { - case ret := <-c: - copy(buf, buf2) - return ret.n, ret.err - case <-r.ctx.Done(): - return 0, r.ctx.Err() - } -} diff --git a/vendor/github.com/jbenet/goprocess/.travis.yml b/vendor/github.com/jbenet/goprocess/.travis.yml index 482adaf9..77d0e7d7 100644 --- a/vendor/github.com/jbenet/goprocess/.travis.yml +++ b/vendor/github.com/jbenet/goprocess/.travis.yml @@ -3,7 +3,7 @@ sudo: false language: go go: - - 1.7 + - 1.12 script: - go test -race -v ./... diff --git a/vendor/github.com/jbenet/goprocess/background.go b/vendor/github.com/jbenet/goprocess/background.go new file mode 100644 index 00000000..d6581570 --- /dev/null +++ b/vendor/github.com/jbenet/goprocess/background.go @@ -0,0 +1,33 @@ +package goprocess + +// Background returns the "bgProcess" Process: a statically allocated +// process that can _never_ close. It also never enters Closing() state. +// Calling Background().Close() will hang indefinitely. +func Background() Process { + return background +} + +var background = new(bgProcess) + +type bgProcess struct{} + +func (*bgProcess) WaitFor(q Process) {} +func (*bgProcess) AddChildNoWait(q Process) {} +func (*bgProcess) AddChild(q Process) {} +func (*bgProcess) Close() error { select {} } +func (*bgProcess) CloseAfterChildren() error { select {} } +func (*bgProcess) Closing() <-chan struct{} { return nil } +func (*bgProcess) Closed() <-chan struct{} { return nil } +func (*bgProcess) Err() error { select {} } + +func (*bgProcess) SetTeardown(tf TeardownFunc) { + panic("can't set teardown on bgProcess process") +} +func (*bgProcess) Go(f ProcessFunc) Process { + child := newProcess(nil) + go func() { + f(child) + child.Close() + }() + return child +} diff --git a/vendor/github.com/jbenet/goprocess/context/context.go b/vendor/github.com/jbenet/goprocess/context/context.go index 07308dad..54d2d13c 100644 --- a/vendor/github.com/jbenet/goprocess/context/context.go +++ b/vendor/github.com/jbenet/goprocess/context/context.go @@ -56,15 +56,17 @@ func CloseAfterContext(p goprocess.Process, ctx context.Context) { panic("nil Context") } - // context.Background(). if ctx.Done() is nil, it will never be done. - // we check for this to avoid wasting a goroutine forever. - if ctx.Done() == nil { + // Avoid a goroutine for both context.Background() and goprocess.Background(). + if ctx.Done() == nil || p.Closed() == nil { return } go func() { - <-ctx.Done() - p.Close() + select { + case <-ctx.Done(): + p.Close() + case <-p.Closed(): + } }() } @@ -82,10 +84,10 @@ func CloseAfterContext(p goprocess.Process, ctx context.Context) { // func WithProcessClosing(ctx context.Context, p goprocess.Process) context.Context { ctx, cancel := context.WithCancel(ctx) - go func() { - <-p.Closing() + p.AddChildNoWait(goprocess.WithTeardown(func() error { cancel() - }() + return nil + })) return ctx } @@ -103,9 +105,13 @@ func WithProcessClosing(ctx context.Context, p goprocess.Process) context.Contex // func WithProcessClosed(ctx context.Context, p goprocess.Process) context.Context { ctx, cancel := context.WithCancel(ctx) - go func() { - <-p.Closed() + p.AddChildNoWait(goprocess.WithTeardown(func() error { + select { + case <-p.Closed(): + case <-ctx.Done(): + } cancel() - }() + return nil + })) return ctx } diff --git a/vendor/github.com/jbenet/goprocess/context/derive.go b/vendor/github.com/jbenet/goprocess/context/derive.go index c7b91306..92e4d272 100644 --- a/vendor/github.com/jbenet/goprocess/context/derive.go +++ b/vendor/github.com/jbenet/goprocess/context/derive.go @@ -2,58 +2,18 @@ package goprocessctx import ( "context" - "errors" - "time" goprocess "github.com/jbenet/goprocess" ) -const ( - closing = iota - closed -) - -type procContext struct { - done <-chan struct{} - which int -} - // OnClosingContext derives a context from a given goprocess that will // be 'Done' when the process is closing func OnClosingContext(p goprocess.Process) context.Context { - return &procContext{ - done: p.Closing(), - which: closing, - } + return WithProcessClosing(context.Background(), p) } // OnClosedContext derives a context from a given goprocess that will // be 'Done' when the process is closed func OnClosedContext(p goprocess.Process) context.Context { - return &procContext{ - done: p.Closed(), - which: closed, - } -} - -func (c *procContext) Done() <-chan struct{} { - return c.done -} - -func (c *procContext) Deadline() (time.Time, bool) { - return time.Time{}, false -} - -func (c *procContext) Err() error { - if c.which == closing { - return errors.New("process closing") - } else if c.which == closed { - return errors.New("process closed") - } else { - panic("unrecognized process context type") - } -} - -func (c *procContext) Value(key interface{}) interface{} { - return nil + return WithProcessClosed(context.Background(), p) } diff --git a/vendor/github.com/jbenet/goprocess/go.mod b/vendor/github.com/jbenet/goprocess/go.mod new file mode 100644 index 00000000..e22f17f2 --- /dev/null +++ b/vendor/github.com/jbenet/goprocess/go.mod @@ -0,0 +1,5 @@ +module github.com/jbenet/goprocess + +go 1.12 + +require github.com/jbenet/go-cienv v0.1.0 diff --git a/vendor/github.com/jbenet/goprocess/go.sum b/vendor/github.com/jbenet/goprocess/go.sum new file mode 100644 index 00000000..82fea79c --- /dev/null +++ b/vendor/github.com/jbenet/goprocess/go.sum @@ -0,0 +1,2 @@ +github.com/jbenet/go-cienv v0.1.0 h1:Vc/s0QbQtoxX8MwwSLWWh+xNNZvM3Lw7NsTcHrvvhMc= +github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA= diff --git a/vendor/github.com/jbenet/goprocess/goprocess.go b/vendor/github.com/jbenet/goprocess/goprocess.go index a81ec8b9..48b76e2e 100644 --- a/vendor/github.com/jbenet/goprocess/goprocess.go +++ b/vendor/github.com/jbenet/goprocess/goprocess.go @@ -66,11 +66,10 @@ type Process interface { // WaitFor makes p wait for q before exiting. Thus, p will _always_ close // _after_ q. Note well: a waiting cycle is deadlock. // - // If q is already Closed, WaitFor calls p.Close() - // If p is already Closing or Closed, WaitFor panics. This is the same thing - // as calling Add(1) _after_ calling Done() on a wait group. Calling WaitFor - // on an already-closed process is a programming error likely due to bad - // synchronization + // If p is already Closed, WaitFor panics. This is the same thing as + // calling Add(1) _after_ calling Done() on a wait group. Calling + // WaitFor on an already-closed process is a programming error likely + // due to bad synchronization WaitFor(q Process) // AddChildNoWait registers child as a "child" of Process. As in UNIX, @@ -92,6 +91,8 @@ type Process interface { // AddChild is the equivalent of calling: // parent.AddChildNoWait(q) // parent.WaitFor(q) + // + // It will _panic_ if the parent is already closed. AddChild(q Process) // Go is much like `go`, as it runs a function in a newly spawned goroutine. @@ -251,7 +252,7 @@ func WithParent(parent Process) Process { // This is useful to bind Process trees to syscall.SIGTERM, SIGKILL, etc. func WithSignals(sig ...os.Signal) Process { p := WithParent(Background()) - c := make(chan os.Signal) + c := make(chan os.Signal, 1) signal.Notify(c, sig...) go func() { <-c @@ -260,24 +261,3 @@ func WithSignals(sig ...os.Signal) Process { }() return p } - -// Background returns the "background" Process: a statically allocated -// process that can _never_ close. It also never enters Closing() state. -// Calling Background().Close() will hang indefinitely. -func Background() Process { - return background -} - -// background is the background process -var background = &unclosable{Process: newProcess(nil)} - -// unclosable is a process that _cannot_ be closed. calling Close simply hangs. -type unclosable struct { - Process -} - -func (p *unclosable) Close() error { - var hang chan struct{} - <-hang // hang forever - return nil -} diff --git a/vendor/github.com/jbenet/goprocess/impl-mutex.go b/vendor/github.com/jbenet/goprocess/impl-mutex.go index fb86fcce..9cb6ae75 100644 --- a/vendor/github.com/jbenet/goprocess/impl-mutex.go +++ b/vendor/github.com/jbenet/goprocess/impl-mutex.go @@ -11,7 +11,6 @@ type process struct { waiters []*processLink // processes that wait for us. for gc. teardown TeardownFunc // called to run the teardown logic. - waiting chan struct{} // closed when CloseAfterChildrenClosed is called. closing chan struct{} // closed once close starts. closed chan struct{} // closed once close is done. closeErr error // error to return to clients of Close() @@ -40,6 +39,7 @@ func (p *process) WaitFor(q Process) { } p.Lock() + defer p.Unlock() select { case <-p.Closed(): @@ -48,8 +48,12 @@ func (p *process) WaitFor(q Process) { } pl := newProcessLink(p, q) + if p.waitfors == nil { + // This may be nil when we're closing. In close, we'll keep + // reading this map till it stays nil. + p.waitfors = make(map[*processLink]struct{}, 1) + } p.waitfors[pl] = struct{}{} - p.Unlock() go pl.AddToChild() } @@ -59,18 +63,22 @@ func (p *process) AddChildNoWait(child Process) { } p.Lock() + defer p.Unlock() select { - case <-p.Closed(): - panic("Process cannot add children after being closed") case <-p.Closing(): + // Either closed or closing, close child immediately. This is + // correct because we aren't asked to _wait_ on this child. go child.Close() + // Wait for the child to start closing so the child is in the + // "correct" state after this function finishes (see #17). + <-child.Closing() + return default: } pl := newProcessLink(p, child) p.children[pl] = struct{}{} - p.Unlock() go pl.AddToChild() } @@ -80,23 +88,37 @@ func (p *process) AddChild(child Process) { } p.Lock() + defer p.Unlock() + + pl := newProcessLink(p, child) select { case <-p.Closed(): + // AddChild must not be called on a dead process. Maybe that's + // too strict? panic("Process cannot add children after being closed") + default: + } + + select { case <-p.Closing(): + // Already closing, close child in background. go child.Close() + // Wait for the child to start closing so the child is in the + // "correct" state after this function finishes (see #17). + <-child.Closing() default: + // Only add the child when not closing. When closing, just add + // it to the "waitfors" list. + p.children[pl] = struct{}{} } - pl := newProcessLink(p, child) - if p.waitfors != nil { // if p.waitfors hasn't been set nil - p.waitfors[pl] = struct{}{} - } - if p.children != nil { // if p.children hasn't been set nil - p.children[pl] = struct{}{} + if p.waitfors == nil { + // This may be be nil when we're closing. In close, we'll keep + // reading this map till it stays nil. + p.waitfors = make(map[*processLink]struct{}, 1) } - p.Unlock() + p.waitfors[pl] = struct{}{} go pl.AddToChild() } @@ -175,16 +197,22 @@ func (p *process) doClose() { close(p.closing) // signal that we're shutting down (Closing) - for len(p.children) > 0 || len(p.waitfors) > 0 { - for plc, _ := range p.children { - child := plc.Child() - if child != nil { // check because child may already have been removed. - go child.Close() // force all children to shut down - } - plc.ParentClear() + // We won't add any children after we start closing so we can do this + // once. + for plc, _ := range p.children { + child := plc.Child() + if child != nil { // check because child may already have been removed. + go child.Close() // force all children to shut down } - p.children = nil // clear them. release memory. + // safe to call multiple times per link + plc.ParentClear() + } + p.children = nil // clear them. release memory. + + // We may repeatedly continue to add waiters while we wait to close so + // we have to do this in a loop. + for len(p.waitfors) > 0 { // we must be careful not to iterate over waitfors directly, as it may // change under our feet. wf := p.waitfors @@ -195,6 +223,8 @@ func (p *process) doClose() { p.Unlock() <-w.ChildClosed() // wait till all waitfors are fully closed (before teardown) p.Lock() + + // safe to call multiple times per link w.ParentClear() } } @@ -231,10 +261,6 @@ func (p *process) CloseAfterChildren() error { case <-p.Closed(): p.Unlock() return p.Close() // get error. safe, after p.Closed() - case <-p.waiting: // already called it. - p.Unlock() - <-p.Closed() - return p.Close() // get error. safe, after p.Closed() default: } p.Unlock() diff --git a/vendor/github.com/jbenet/goprocess/link.go b/vendor/github.com/jbenet/goprocess/link.go index c344c1e6..f46d81f6 100644 --- a/vendor/github.com/jbenet/goprocess/link.go +++ b/vendor/github.com/jbenet/goprocess/link.go @@ -97,8 +97,15 @@ func (pl *processLink) AddToChild() { cp := pl.Child() // is it a *process ? if not... panic. - c, ok := cp.(*process) - if !ok { + var c *process + switch cp := cp.(type) { + case *process: + c = cp + case *bgProcess: + // Background process never closes so we don't need to do + // anything. + return + default: panic("goprocess does not yet support other process impls.") } diff --git a/vendor/github.com/libp2p/go-buffer-pool/.travis.yml b/vendor/github.com/libp2p/go-buffer-pool/.travis.yml index 4cfe98c2..5163d693 100644 --- a/vendor/github.com/libp2p/go-buffer-pool/.travis.yml +++ b/vendor/github.com/libp2p/go-buffer-pool/.travis.yml @@ -10,7 +10,6 @@ env: global: - GOTFLAGS="-race" matrix: - - BUILD_DEPTYPE=gx - BUILD_DEPTYPE=gomod @@ -24,7 +23,6 @@ script: cache: directories: - - $GOPATH/src/gx - $GOPATH/pkg/mod - $HOME/.cache/go-build diff --git a/vendor/github.com/libp2p/go-buffer-pool/Makefile b/vendor/github.com/libp2p/go-buffer-pool/Makefile deleted file mode 100644 index 2c5fbfe2..00000000 --- a/vendor/github.com/libp2p/go-buffer-pool/Makefile +++ /dev/null @@ -1,10 +0,0 @@ -gx: - go get github.com/whyrusleeping/gx - go get github.com/whyrusleeping/gx-go - -deps: gx - gx --verbose install --global - gx-go rewrite - -publish: - gx-go rewrite --undo diff --git a/vendor/github.com/libp2p/go-buffer-pool/README.md b/vendor/github.com/libp2p/go-buffer-pool/README.md index 745d21cc..830cb562 100644 --- a/vendor/github.com/libp2p/go-buffer-pool/README.md +++ b/vendor/github.com/libp2p/go-buffer-pool/README.md @@ -2,10 +2,11 @@ go-buffer-pool ================== [![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](https://protocol.ai) -[![](https://img.shields.io/badge/project-libp2p-blue.svg?style=flat-square)](https://libp2p.io/) -[![](https://img.shields.io/badge/freenode-%23libp2p-blue.svg?style=flat-square)](https://webchat.freenode.net/?channels=%23libp2p) +[![](https://img.shields.io/badge/project-libp2p-yellow.svg?style=flat-square)](https://libp2p.io/) +[![](https://img.shields.io/badge/freenode-%23libp2p-yellow.svg?style=flat-square)](https://webchat.freenode.net/?channels=%23libp2p) [![codecov](https://codecov.io/gh/libp2p/go-buffer-pool/branch/master/graph/badge.svg)](https://codecov.io/gh/libp2p/go-buffer-pool) [![Travis CI](https://travis-ci.org/libp2p/go-buffer-pool.svg?branch=master)](https://travis-ci.org/libp2p/go-buffer-pool) +[![Discourse posts](https://img.shields.io/discourse/https/discuss.libp2p.io/posts.svg)](https://discuss.libp2p.io) > A variable size buffer pool for go. @@ -46,3 +47,7 @@ Small note: If editing the Readme, please conform to the [standard-readme](https MIT © Protocol Labs BSD © The Go Authors + +--- + +The last gx published version of this module was: 0.1.3: QmQDvJoB6aJWN3sjr3xsgXqKCXf4jU5zdMXpDMsBkYVNqa diff --git a/vendor/github.com/libp2p/go-buffer-pool/go.mod b/vendor/github.com/libp2p/go-buffer-pool/go.mod index 4e3c78e9..02b140dd 100644 --- a/vendor/github.com/libp2p/go-buffer-pool/go.mod +++ b/vendor/github.com/libp2p/go-buffer-pool/go.mod @@ -1 +1,3 @@ module github.com/libp2p/go-buffer-pool + +go 1.12 diff --git a/vendor/github.com/libp2p/go-buffer-pool/package.json b/vendor/github.com/libp2p/go-buffer-pool/package.json deleted file mode 100644 index bf5ed0ca..00000000 --- a/vendor/github.com/libp2p/go-buffer-pool/package.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "author": "Stebalien", - "bugs": { - "url": "github.com/libp2p/go-buffer-pool/issues" - }, - "gx": { - "dvcsimport": "github.com/libp2p/go-buffer-pool" - }, - "gxVersion": "0.12.1", - "language": "go", - "license": "MIT+BSD", - "name": "go-buffer-pool", - "releaseCmd": "git commit -a -m \"gx publish $VERSION\"", - "version": "0.1.3" -} - diff --git a/vendor/github.com/libp2p/go-buffer-pool/writer.go b/vendor/github.com/libp2p/go-buffer-pool/writer.go new file mode 100644 index 00000000..cea83f92 --- /dev/null +++ b/vendor/github.com/libp2p/go-buffer-pool/writer.go @@ -0,0 +1,119 @@ +package pool + +import ( + "bufio" + "io" + "sync" +) + +const WriterBufferSize = 4096 + +var bufioWriterPool = sync.Pool{ + New: func() interface{} { + return bufio.NewWriterSize(nil, WriterBufferSize) + }, +} + +// Writer is a buffered writer that returns its internal buffer in a pool when +// not in use. +type Writer struct { + W io.Writer + bufw *bufio.Writer +} + +func (w *Writer) ensureBuffer() { + if w.bufw == nil { + w.bufw = bufioWriterPool.Get().(*bufio.Writer) + w.bufw.Reset(w.W) + } +} + +// Write writes the given byte slice to the underlying connection. +// +// Note: Write won't return the write buffer to the pool even if it ends up +// being empty after the write. You must call Flush() to do that. +func (w *Writer) Write(b []byte) (int, error) { + if w.bufw == nil { + if len(b) >= WriterBufferSize { + return w.W.Write(b) + } + w.bufw = bufioWriterPool.Get().(*bufio.Writer) + w.bufw.Reset(w.W) + } + return w.bufw.Write(b) +} + +// Size returns the size of the underlying buffer. +func (w *Writer) Size() int { + return WriterBufferSize +} + +// Available returns the amount buffer space available. +func (w *Writer) Available() int { + if w.bufw != nil { + return w.bufw.Available() + } + return WriterBufferSize +} + +// Buffered returns the amount of data buffered. +func (w *Writer) Buffered() int { + if w.bufw != nil { + return w.bufw.Buffered() + } + return 0 +} + +// WriteByte writes a single byte. +func (w *Writer) WriteByte(b byte) error { + w.ensureBuffer() + return w.bufw.WriteByte(b) +} + +// WriteRune writes a single rune, returning the number of bytes written. +func (w *Writer) WriteRune(r rune) (int, error) { + w.ensureBuffer() + return w.bufw.WriteRune(r) +} + +// WriteString writes a string, returning the number of bytes written. +func (w *Writer) WriteString(s string) (int, error) { + w.ensureBuffer() + return w.bufw.WriteString(s) +} + +// Flush flushes the write buffer, if any, and returns it to the pool. +func (w *Writer) Flush() error { + if w.bufw == nil { + return nil + } + if err := w.bufw.Flush(); err != nil { + return err + } + w.bufw.Reset(nil) + bufioWriterPool.Put(w.bufw) + w.bufw = nil + return nil +} + +// Close flushes the underlying writer and closes it if it implements the +// io.Closer interface. +// +// Note: Close() closes the writer even if Flush() fails to avoid leaking system +// resources. If you want to make sure Flush() succeeds, call it first. +func (w *Writer) Close() error { + var ( + ferr, cerr error + ) + ferr = w.Flush() + + // always close even if flush fails. + if closer, ok := w.W.(io.Closer); ok { + cerr = closer.Close() + } + + if ferr != nil { + return ferr + } + return cerr +} diff --git a/vendor/github.com/libp2p/go-conn-security-multistream/.travis.yml b/vendor/github.com/libp2p/go-conn-security-multistream/.travis.yml index 4cfe98c2..5163d693 100644 --- a/vendor/github.com/libp2p/go-conn-security-multistream/.travis.yml +++ b/vendor/github.com/libp2p/go-conn-security-multistream/.travis.yml @@ -10,7 +10,6 @@ env: global: - GOTFLAGS="-race" matrix: - - BUILD_DEPTYPE=gx - BUILD_DEPTYPE=gomod @@ -24,7 +23,6 @@ script: cache: directories: - - $GOPATH/src/gx - $GOPATH/pkg/mod - $HOME/.cache/go-build diff --git a/vendor/github.com/libp2p/go-conn-security-multistream/README.md b/vendor/github.com/libp2p/go-conn-security-multistream/README.md index be78746e..fdffd716 100644 --- a/vendor/github.com/libp2p/go-conn-security-multistream/README.md +++ b/vendor/github.com/libp2p/go-conn-security-multistream/README.md @@ -1,12 +1,10 @@ # go-conn-security-multistream -[![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](http://ipn.io) -[![](https://img.shields.io/badge/freenode-%23ipfs-blue.svg?style=flat-square)](http://webchat.freenode.net/?channels=%23ipfs) -[![](https://img.shields.io/badge/project-IPFS-blue.svg?style=flat-square)](http://ipfs.io/) -[![standard-readme compliant](https://img.shields.io/badge/standard--readme-OK-green.svg?style=flat-square)](https://github.com/RichardLitt/standard-readme) +[![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](https://protocol.ai) +[![](https://img.shields.io/badge/project-libp2p-yellow.svg?style=flat-square)](https://libp2p.io/) +[![](https://img.shields.io/badge/freenode-%23libp2p-yellow.svg?style=flat-square)](http://webchat.freenode.net/?channels=%23libp2p) +[![Discourse posts](https://img.shields.io/discourse/https/discuss.libp2p.io/posts.svg)](https://discuss.libp2p.io) [![GoDoc](https://godoc.org/github.com/libp2p/go-conn-security-multistream?status.svg)](https://godoc.org/github.com/libp2p/go-conn-security-multistream) -[![Coverage Status](https://coveralls.io/repos/github/libp2p/go-conn-security-multistream/badge.svg?branch=master)](https://coveralls.io/github/libp2p/go-conn-security-multistream?branch=master) -[![Build Status](https://travis-ci.org/libp2p/go-conn-security-multistream.svg?branch=master)](https://travis-ci.org/libp2p/go-conn-security-multistream) > Connection security multistream multiplexer @@ -27,24 +25,13 @@ Known libp2p security transports include: go get github.com/libp2p/go-conn-security-multistream ``` -Note that `go-conn-security-multistream` is packaged with Gx, so it is recommended to use Gx to install and use it (see the Usage section). +This repo is [gomod](https://github.com/golang/go/wiki/Modules)-compatible, and users of +go 1.11 and later with modules enabled will automatically pull the latest tagged release +by referencing this package. Upgrades to future releases can be managed using `go get`, +or by editing your `go.mod` file as [described by the gomod documentation](https://github.com/golang/go/wiki/Modules#how-to-upgrade-and-downgrade-dependencies). ## Usage -This module is packaged with [Gx](https://github.com/whyrusleeping/gx). In order to use it in your own project it is recommended that you: - -```sh -go get -u github.com/whyrusleeping/gx -go get -u github.com/whyrusleeping/gx-go -cd -gx init -gx import github.com/libp2p/go-conn-security-multistream -gx install --global -gx-go --rewrite -``` - -Please check [Gx](https://github.com/whyrusleeping/gx) and [Gx-go](https://github.com/whyrusleeping/gx-go) documentation for more information. - For more information about how `go-conn-security-multistream` is used in the libp2p context, you can see the [go-libp2p-conn](https://github.com/libp2p/go-libp2p-conn) module. ## Contribute @@ -60,3 +47,7 @@ This repository falls under the IPFS [Code of Conduct](https://github.com/libp2p ## License MIT + +--- + +The last gx published version of this module was: 0.1.26: QmZWmFkMm28sWeDr5Xh1LexdKBGYGp946MNCfgtLqfX73z diff --git a/vendor/github.com/libp2p/go-conn-security-multistream/go.mod b/vendor/github.com/libp2p/go-conn-security-multistream/go.mod index 2ea048c8..2556ff56 100644 --- a/vendor/github.com/libp2p/go-conn-security-multistream/go.mod +++ b/vendor/github.com/libp2p/go-conn-security-multistream/go.mod @@ -1,7 +1,9 @@ module github.com/libp2p/go-conn-security-multistream +go 1.12 + require ( - github.com/libp2p/go-conn-security v0.0.1 - github.com/libp2p/go-libp2p-peer v0.0.1 - github.com/multiformats/go-multistream v0.0.1 + github.com/libp2p/go-libp2p-core v0.0.1 + github.com/libp2p/go-libp2p-testing v0.0.2 + github.com/multiformats/go-multistream v0.1.0 ) diff --git a/vendor/github.com/libp2p/go-conn-security-multistream/go.sum b/vendor/github.com/libp2p/go-conn-security-multistream/go.sum index 1e848e71..ac3782da 100644 --- a/vendor/github.com/libp2p/go-conn-security-multistream/go.sum +++ b/vendor/github.com/libp2p/go-conn-security-multistream/go.sum @@ -1,5 +1,3 @@ -github.com/AndreasBriese/bbloom v0.0.0-20180913140656-343706a395b7/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= -github.com/Kubuxu/go-os-helper v0.0.1/go.mod h1:N8B+I7vPCT80IcP58r50u4+gEEcsZETFUpAzWW2ep1Y= github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32 h1:qkOC5Gd33k54tobS36cXdAzJbeHaduLtnLQQwNoIi78= github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32/go.mod h1:DrZx5ec/dmnfpw9KyYoQyYo7d0KEvTkk/5M/vbZjAr8= @@ -10,31 +8,20 @@ github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVa github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dgraph-io/badger v1.5.5-0.20190226225317-8115aed38f8f/go.mod h1:VZxzAIRPHRVNRKRo6AXrX9BJegn6il06VMTZVJYCIjQ= -github.com/dgryski/go-farm v0.0.0-20190104051053-3adb47b1fb0f/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0= -github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gxed/hashland/keccakpg v0.0.1 h1:wrk3uMNaMxbXiHibbPO4S0ymqJMm41WiudyFSs7UnsU= github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfmKFJ6tItnhQ67kU= github.com/gxed/hashland/murmur3 v0.0.1 h1:SheiaIt0sda5K+8FLz952/1iWS9zrnKsEJaOJu4ZbSc= github.com/gxed/hashland/murmur3 v0.0.1/go.mod h1:KjXop02n4/ckmZSnY2+HKcLud/tcmvhST0bie/0lS48= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/ipfs/go-datastore v0.0.1/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= -github.com/ipfs/go-ds-badger v0.0.2/go.mod h1:Y3QpeSFWQf6MopLTiZD+VT6IC1yZqaGmjvRcKeSGij8= -github.com/ipfs/go-ds-leveldb v0.0.1/go.mod h1:feO8V3kubwsEF22n0YRQCffeb79OOYIykR4L04tMOYc= -github.com/ipfs/go-ipfs-delay v0.0.0-20181109222059-70721b86a9a8/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= -github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM= +github.com/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8 h1:bspPhN+oKYFk5fcGNuQzp6IGzYQSenLEgH3s6jkXrWw= github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8/go.mod h1:Ly/wlsjFq/qrU3Rar62tu1gASgGw6chQbSh/XgIIXCY= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= @@ -42,69 +29,61 @@ github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlT github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= -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/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/libp2p/go-buffer-pool v0.0.1/go.mod h1:xtyIz9PMobb13WaxR6Zo1Pd1zXJKYg0a8KiIvDp3TzQ= -github.com/libp2p/go-conn-security v0.0.1 h1:4kMMrqrt9EUNCNjX1xagSJC+bq16uqjMe9lk1KBMVNs= -github.com/libp2p/go-conn-security v0.0.1/go.mod h1:bGmu51N0KU9IEjX7kl2PQjgZa40JQWnayTvNMgD/vyk= -github.com/libp2p/go-libp2p-crypto v0.0.1 h1:JNQd8CmoGTohO/akqrH16ewsqZpci2CbgYH/LmYl8gw= -github.com/libp2p/go-libp2p-crypto v0.0.1/go.mod h1:yJkNyDmO341d5wwXxDUGO0LykUVT72ImHNUqh5D/dBE= -github.com/libp2p/go-libp2p-net v0.0.1 h1:xJ4Vh4yKF/XKb8fd1Ev0ebAGzVjMxXzrxG2kjtU+F5Q= -github.com/libp2p/go-libp2p-net v0.0.1/go.mod h1:Yt3zgmlsHOgUWSXmt5V/Jpz9upuJBE8EgNU9DrCcR8c= -github.com/libp2p/go-libp2p-peer v0.0.1 h1:0qwAOljzYewINrU+Kndoc+1jAL7vzY/oY2Go4DCGfyY= -github.com/libp2p/go-libp2p-peer v0.0.1/go.mod h1:nXQvOBbwVqoP+T5Y5nCjeH4sP9IX/J0AMzcDUVruVoo= -github.com/libp2p/go-libp2p-peerstore v0.0.1 h1:twKovq8YK5trLrd3nB7PD2Zu9JcyAIdm7Bz9yBWjhq8= -github.com/libp2p/go-libp2p-peerstore v0.0.1/go.mod h1:RabLyPVJLuNQ+GFyoEkfi8H4Ti6k/HtZJ7YKgtSq+20= -github.com/libp2p/go-libp2p-protocol v0.0.1 h1:+zkEmZ2yFDi5adpVE3t9dqh/N9TbpFWywowzeEzBbLM= -github.com/libp2p/go-libp2p-protocol v0.0.1/go.mod h1:Af9n4PiruirSDjHycM1QuiMi/1VZNHYcK8cLgFJLZ4s= -github.com/libp2p/go-stream-muxer v0.0.1 h1:Ce6e2Pyu+b5MC1k3eeFtAax0pW4gc6MosYSLV05UeLw= -github.com/libp2p/go-stream-muxer v0.0.1/go.mod h1:bAo8x7YkSpadMTbtTaxGVHWUQsR/l5MEaHbKaliuT14= -github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= -github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/libp2p/go-conn-security v0.1.0 h1:q8ii9TUOtSBD1gIoKTSOZIzPFP/agPM28amrCCoeIIA= +github.com/libp2p/go-conn-security v0.1.0/go.mod h1:NQdPF4opCZ5twtEUadzPL0tNSdkrbFc/HmLO7eWqEzY= +github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZxBdp967ls1g+k8= +github.com/libp2p/go-libp2p-core v0.0.1 h1:HSTZtFIq/W5Ue43Zw+uWZyy2Vl5WtF0zDjKN8/DT/1I= +github.com/libp2p/go-libp2p-core v0.0.1/go.mod h1:g/VxnTZ/1ygHxH3dKok7Vno1VfpvGcGip57wjTU4fco= +github.com/libp2p/go-libp2p-crypto v0.1.0 h1:k9MFy+o2zGDNGsaoZl0MA3iZ75qXxr9OOoAZF+sD5OQ= +github.com/libp2p/go-libp2p-crypto v0.1.0/go.mod h1:sPUokVISZiy+nNuTTH/TY+leRSxnFj/2GLjtOTW90hI= +github.com/libp2p/go-libp2p-peer v0.2.0 h1:EQ8kMjaCUwt/Y5uLgjT8iY2qg0mGUT0N1zUjer50DsY= +github.com/libp2p/go-libp2p-peer v0.2.0/go.mod h1:RCffaCvUyW2CJmG2gAWVqwePwW7JMgxjsHm7+J5kjWY= +github.com/libp2p/go-libp2p-testing v0.0.2 h1:p9ySW7MFvGGs83hAAe0MPGnjy/tPjl5KyxpMkojdZ+g= +github.com/libp2p/go-libp2p-testing v0.0.2/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0OXOcUbGjvZxxijuBwbbmlSxLiuofa+g= github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16 h1:5W7KhL8HVF3XCFOweFD3BNESdnO8ewyYTFT2R+/b8FQ= github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= github.com/mr-tron/base58 v1.1.0 h1:Y51FGVJ91WBqCEabAi5OPUz38eAx8DakuAm5svLcsfQ= github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= +github.com/mr-tron/base58 v1.1.1 h1:OJIdWOWYe2l5PQNgimGtuwHY8nDskvJ5vvs//YnzRLs= +github.com/mr-tron/base58 v1.1.1/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= -github.com/multiformats/go-multiaddr v0.0.1 h1:/QUV3VBMDI6pi6xfiw7lr6xhDWWvQKn9udPn68kLSdY= -github.com/multiformats/go-multiaddr v0.0.1/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= -github.com/multiformats/go-multiaddr-dns v0.0.1/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= -github.com/multiformats/go-multiaddr-net v0.0.1/go.mod h1:nw6HSxNmCIQH27XPGBuX+d1tnvM7ihcFwHMSstNAVUU= +github.com/multiformats/go-multiaddr v0.0.2 h1:RBysRCv5rv3FWlhKWKoXv8tnsCUpEpIZpCmqAGZos2s= +github.com/multiformats/go-multiaddr v0.0.2/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= +github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs= github.com/multiformats/go-multihash v0.0.1 h1:HHwN1K12I+XllBCrqKnhX949Orn4oawPkegHMu2vDqQ= github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= github.com/multiformats/go-multistream v0.0.1 h1:JV4VfSdY9n7ECTtY59/TlSyFCzRILvYx4T4Ws8ZgihU= github.com/multiformats/go-multistream v0.0.1/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= +github.com/multiformats/go-multistream v0.1.0 h1:UpO6jrsjqs46mqAK3n6wKRYFhugss9ArzbyUzU+4wkQ= +github.com/multiformats/go-multistream v0.1.0/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= -github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1/go.mod h1:8UvriyWtv5Q5EOgjHaSseUEdkQfvwFv1I/In/O2M9gc= -github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc/go.mod h1:bopw91TMyo8J3tvftk8xmU2kPmlrt4nScJQZU2hE5EM= -github.com/whyrusleeping/mafmt v1.2.8/go.mod h1:faQJFPbLSxzD9xpA02ttW/tS9vZykNvXwGvqIpk20FA= +github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a h1:/eS3yfGjQKG+9kayBkj0ip1BGhq6zJ3eaVksphxAaek= +github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a/go.mod h1:7AyxJNCJ7SBZ1MfVQCWD6Uqo2oubI2Eq2y2eqf+A5r0= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 h1:RC6RW7j+1+HkWaX/Yh71Ee5ZHaHYt7ZP4sQgUrm6cDU= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572/go.mod h1:w0SWMsp6j9O/dk4/ZpIhL+3CkG8ofA2vuv7k+ltqUMc= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b h1:+/WWzjwW6gidDJnMKWLKLX1gxn7irUTF1fLpQovfQ5M= golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25 h1:jsG6UpNLt9iAsb0S2AGW28DveNzzgmbXR+ENoPjUeIU= +golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25/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-20190227160552-c95aed5357e7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/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-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190219092855-153ac476189d h1:Z0Ahzd7HltpJtjAHHxX8QFP3j1yYgiuvjbjRzDj/KH0= golang.org/x/sys v0.0.0-20190219092855-153ac476189d/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223 h1:DH4skfRX4EBpamg7iV4ZlCpblAHI6s6TDM39bFZumv8= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190228124157-a34e9553db1e h1:ZytStCyV048ZqDsWHiYDdoI2Vd4msMcrDECFxS+tL9c= +golang.org/x/sys v0.0.0-20190228124157-a34e9553db1e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/vendor/github.com/libp2p/go-conn-security-multistream/package.json b/vendor/github.com/libp2p/go-conn-security-multistream/package.json deleted file mode 100644 index f14cb147..00000000 --- a/vendor/github.com/libp2p/go-conn-security-multistream/package.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "author": "stebalien", - "bugs": { - "url": "https://github.com/libp2p/go-conn-security" - }, - "gx": { - "dvcsimport": "github.com/libp2p/go-conn-security-multistream" - }, - "gxDependencies": [ - { - "author": "Stebalien", - "hash": "QmPRoHqULmP4MuKAN5EFaJ64MLpeMY8cny2318xDBDmmkp", - "name": "go-conn-security", - "version": "0.1.28" - }, - { - "author": "whyrusleeping", - "hash": "QmYVXrKrKHDC9FobgmcmshCDyWwdrfwfanNQN4oxJ9Fk3h", - "name": "go-libp2p-peer", - "version": "3.1.2" - }, - { - "author": "whyrusleeping", - "hash": "QmabLh8TrJ3emfAoQk5AbqbLTbMyj7XqumMFmAFxa9epo8", - "name": "go-multistream", - "version": "0.3.9" - } - ], - "gxVersion": "0.12.1", - "language": "go", - "license": "MIT", - "name": "go-conn-security-multistream", - "releaseCmd": "git commit -a -m \"gx publish $VERSION\"", - "version": "0.1.26" -} - diff --git a/vendor/github.com/libp2p/go-conn-security-multistream/ssms.go b/vendor/github.com/libp2p/go-conn-security-multistream/ssms.go index 312b775c..219ee6fc 100644 --- a/vendor/github.com/libp2p/go-conn-security-multistream/ssms.go +++ b/vendor/github.com/libp2p/go-conn-security-multistream/ssms.go @@ -5,8 +5,8 @@ import ( "fmt" "net" - connsec "github.com/libp2p/go-conn-security" - peer "github.com/libp2p/go-libp2p-peer" + "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p-core/sec" mss "github.com/multiformats/go-multistream" ) @@ -16,19 +16,19 @@ import ( // after use. type SSMuxer struct { mux mss.MultistreamMuxer - tpts map[string]connsec.Transport + tpts map[string]sec.SecureTransport OrderPreference []string } -var _ connsec.Transport = (*SSMuxer)(nil) +var _ sec.SecureTransport = (*SSMuxer)(nil) // AddTransport adds a stream security transport to this multistream muxer. // // This method is *not* thread-safe. It should be called only when initializing // the SSMuxer. -func (sm *SSMuxer) AddTransport(path string, transport connsec.Transport) { +func (sm *SSMuxer) AddTransport(path string, transport sec.SecureTransport) { if sm.tpts == nil { - sm.tpts = make(map[string]connsec.Transport, 1) + sm.tpts = make(map[string]sec.SecureTransport, 1) } sm.mux.AddHandler(path, nil) @@ -38,7 +38,7 @@ func (sm *SSMuxer) AddTransport(path string, transport connsec.Transport) { // SecureInbound secures an inbound connection using this multistream // multiplexed stream security transport. -func (sm *SSMuxer) SecureInbound(ctx context.Context, insecure net.Conn) (connsec.Conn, error) { +func (sm *SSMuxer) SecureInbound(ctx context.Context, insecure net.Conn) (sec.SecureConn, error) { tpt, err := sm.selectProto(ctx, insecure, true) if err != nil { return nil, err @@ -48,7 +48,7 @@ func (sm *SSMuxer) SecureInbound(ctx context.Context, insecure net.Conn) (connse // SecureOutbound secures an outbound connection using this multistream // multiplexed stream security transport. -func (sm *SSMuxer) SecureOutbound(ctx context.Context, insecure net.Conn, p peer.ID) (connsec.Conn, error) { +func (sm *SSMuxer) SecureOutbound(ctx context.Context, insecure net.Conn, p peer.ID) (sec.SecureConn, error) { tpt, err := sm.selectProto(ctx, insecure, false) if err != nil { return nil, err @@ -56,7 +56,7 @@ func (sm *SSMuxer) SecureOutbound(ctx context.Context, insecure net.Conn, p peer return tpt.SecureOutbound(ctx, insecure, p) } -func (sm *SSMuxer) selectProto(ctx context.Context, insecure net.Conn, server bool) (connsec.Transport, error) { +func (sm *SSMuxer) selectProto(ctx context.Context, insecure net.Conn, server bool) (sec.SecureTransport, error) { var proto string var err error done := make(chan struct{}) @@ -82,6 +82,7 @@ func (sm *SSMuxer) selectProto(ctx context.Context, insecure net.Conn, server bo // We *must* do this. We have outstanding work on the connection // and it's no longer safe to use. insecure.Close() + <-done // wait to stop using the connection. return nil, ctx.Err() } } diff --git a/vendor/github.com/libp2p/go-conn-security/README.md b/vendor/github.com/libp2p/go-conn-security/README.md deleted file mode 100644 index f34ab8d8..00000000 --- a/vendor/github.com/libp2p/go-conn-security/README.md +++ /dev/null @@ -1,59 +0,0 @@ -# go-conn-security - -[![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](http://ipn.io) -[![](https://img.shields.io/badge/freenode-%23ipfs-blue.svg?style=flat-square)](http://webchat.freenode.net/?channels=%23ipfs) -[![](https://img.shields.io/badge/project-IPFS-blue.svg?style=flat-square)](http://ipfs.io/) -[![standard-readme compliant](https://img.shields.io/badge/standard--readme-OK-green.svg?style=flat-square)](https://github.com/RichardLitt/standard-readme) -[![GoDoc](https://godoc.org/github.com/libp2p/go-conn-security?status.svg)](https://godoc.org/github.com/libp2p/go-conn-security) -[![Coverage Status](https://coveralls.io/repos/github/libp2p/go-conn-security/badge.svg?branch=master)](https://coveralls.io/github/libp2p/go-conn-security?branch=master) -[![Build Status](https://travis-ci.org/libp2p/go-conn-security.svg?branch=master)](https://travis-ci.org/libp2p/go-conn-security) - -> Stream security transport interfaces - -This package defines the interfaces that must be fulfilled by libp2p network security transports. Security transports take go `net.Conn` connections and upgrade them to encrypted and authenticated connections. - -Known libp2p security transports include: - -* [go-libp2p-secio](https://github.com/libp2p/go-libp2p-secio) - -## Install - -`go-conn-security` is a standard Go module which can be installed with: - -```sh -go get github.com/libp2p/go-conn-security -``` - -Note that `go-conn-security` is packaged with Gx, so it is recommended to use Gx to install and use it (see the Usage section). - -## Usage - -This module is packaged with [Gx](https://github.com/whyrusleeping/gx). In order to use it in your own project it is recommended that you: - -```sh -go get -u github.com/whyrusleeping/gx -go get -u github.com/whyrusleeping/gx-go -cd -gx init -gx import github.com/libp2p/go-conn-security -gx install --global -gx-go --rewrite -``` - -Please check [Gx](https://github.com/whyrusleeping/gx) and [Gx-go](https://github.com/whyrusleeping/gx-go) documentation for more information. - -For more information about how `go-conn-security` is used in the libp2p context, you can see the [go-libp2p-transport-upgrader](https://github.com/libp2p/go-libp2p-transport-upgrader) module. - -## Contribute - -Feel free to join in. All welcome. Open an [issue](https://github.com/libp2p/go-conn-security/issues)! - -This repository falls under the IPFS [Code of Conduct](https://github.com/libp2p/community/blob/master/code-of-conduct.md). - -### Want to hack on IPFS? - -[![](https://cdn.rawgit.com/jbenet/contribute-ipfs-gif/master/img/contribute.gif)](https://github.com/ipfs/community/blob/master/contributing.md) - -## License - -MIT diff --git a/vendor/github.com/libp2p/go-conn-security/go.mod b/vendor/github.com/libp2p/go-conn-security/go.mod deleted file mode 100644 index e5831d35..00000000 --- a/vendor/github.com/libp2p/go-conn-security/go.mod +++ /dev/null @@ -1,7 +0,0 @@ -module github.com/libp2p/go-conn-security - -require ( - github.com/libp2p/go-libp2p-crypto v0.0.1 - github.com/libp2p/go-libp2p-net v0.0.1 - github.com/libp2p/go-libp2p-peer v0.0.1 -) diff --git a/vendor/github.com/libp2p/go-conn-security/go.sum b/vendor/github.com/libp2p/go-conn-security/go.sum deleted file mode 100644 index 90920ecf..00000000 --- a/vendor/github.com/libp2p/go-conn-security/go.sum +++ /dev/null @@ -1,106 +0,0 @@ -github.com/AndreasBriese/bbloom v0.0.0-20180913140656-343706a395b7/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= -github.com/Kubuxu/go-os-helper v0.0.1/go.mod h1:N8B+I7vPCT80IcP58r50u4+gEEcsZETFUpAzWW2ep1Y= -github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= -github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32 h1:qkOC5Gd33k54tobS36cXdAzJbeHaduLtnLQQwNoIi78= -github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32/go.mod h1:DrZx5ec/dmnfpw9KyYoQyYo7d0KEvTkk/5M/vbZjAr8= -github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= -github.com/btcsuite/btcutil v0.0.0-20190207003914-4c204d697803/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= -github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= -github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= -github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= -github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= -github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= -github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dgraph-io/badger v1.5.5-0.20190226225317-8115aed38f8f/go.mod h1:VZxzAIRPHRVNRKRo6AXrX9BJegn6il06VMTZVJYCIjQ= -github.com/dgryski/go-farm v0.0.0-20190104051053-3adb47b1fb0f/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= -github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0= -github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/gxed/hashland/keccakpg v0.0.1 h1:wrk3uMNaMxbXiHibbPO4S0ymqJMm41WiudyFSs7UnsU= -github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfmKFJ6tItnhQ67kU= -github.com/gxed/hashland/murmur3 v0.0.1 h1:SheiaIt0sda5K+8FLz952/1iWS9zrnKsEJaOJu4ZbSc= -github.com/gxed/hashland/murmur3 v0.0.1/go.mod h1:KjXop02n4/ckmZSnY2+HKcLud/tcmvhST0bie/0lS48= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/ipfs/go-datastore v0.0.1/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= -github.com/ipfs/go-ds-badger v0.0.2/go.mod h1:Y3QpeSFWQf6MopLTiZD+VT6IC1yZqaGmjvRcKeSGij8= -github.com/ipfs/go-ds-leveldb v0.0.1/go.mod h1:feO8V3kubwsEF22n0YRQCffeb79OOYIykR4L04tMOYc= -github.com/ipfs/go-ipfs-delay v0.0.0-20181109222059-70721b86a9a8/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= -github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM= -github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8 h1:bspPhN+oKYFk5fcGNuQzp6IGzYQSenLEgH3s6jkXrWw= -github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8/go.mod h1:Ly/wlsjFq/qrU3Rar62tu1gASgGw6chQbSh/XgIIXCY= -github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= -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/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/libp2p/go-buffer-pool v0.0.1/go.mod h1:xtyIz9PMobb13WaxR6Zo1Pd1zXJKYg0a8KiIvDp3TzQ= -github.com/libp2p/go-libp2p-crypto v0.0.1 h1:JNQd8CmoGTohO/akqrH16ewsqZpci2CbgYH/LmYl8gw= -github.com/libp2p/go-libp2p-crypto v0.0.1/go.mod h1:yJkNyDmO341d5wwXxDUGO0LykUVT72ImHNUqh5D/dBE= -github.com/libp2p/go-libp2p-net v0.0.1 h1:xJ4Vh4yKF/XKb8fd1Ev0ebAGzVjMxXzrxG2kjtU+F5Q= -github.com/libp2p/go-libp2p-net v0.0.1/go.mod h1:Yt3zgmlsHOgUWSXmt5V/Jpz9upuJBE8EgNU9DrCcR8c= -github.com/libp2p/go-libp2p-peer v0.0.1 h1:0qwAOljzYewINrU+Kndoc+1jAL7vzY/oY2Go4DCGfyY= -github.com/libp2p/go-libp2p-peer v0.0.1/go.mod h1:nXQvOBbwVqoP+T5Y5nCjeH4sP9IX/J0AMzcDUVruVoo= -github.com/libp2p/go-libp2p-peerstore v0.0.1 h1:twKovq8YK5trLrd3nB7PD2Zu9JcyAIdm7Bz9yBWjhq8= -github.com/libp2p/go-libp2p-peerstore v0.0.1/go.mod h1:RabLyPVJLuNQ+GFyoEkfi8H4Ti6k/HtZJ7YKgtSq+20= -github.com/libp2p/go-libp2p-protocol v0.0.1 h1:+zkEmZ2yFDi5adpVE3t9dqh/N9TbpFWywowzeEzBbLM= -github.com/libp2p/go-libp2p-protocol v0.0.1/go.mod h1:Af9n4PiruirSDjHycM1QuiMi/1VZNHYcK8cLgFJLZ4s= -github.com/libp2p/go-stream-muxer v0.0.1 h1:Ce6e2Pyu+b5MC1k3eeFtAax0pW4gc6MosYSLV05UeLw= -github.com/libp2p/go-stream-muxer v0.0.1/go.mod h1:bAo8x7YkSpadMTbtTaxGVHWUQsR/l5MEaHbKaliuT14= -github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= -github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0OXOcUbGjvZxxijuBwbbmlSxLiuofa+g= -github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= -github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16 h1:5W7KhL8HVF3XCFOweFD3BNESdnO8ewyYTFT2R+/b8FQ= -github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= -github.com/mr-tron/base58 v1.1.0 h1:Y51FGVJ91WBqCEabAi5OPUz38eAx8DakuAm5svLcsfQ= -github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= -github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= -github.com/multiformats/go-multiaddr v0.0.1 h1:/QUV3VBMDI6pi6xfiw7lr6xhDWWvQKn9udPn68kLSdY= -github.com/multiformats/go-multiaddr v0.0.1/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= -github.com/multiformats/go-multiaddr-dns v0.0.1/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= -github.com/multiformats/go-multiaddr-net v0.0.1/go.mod h1:nw6HSxNmCIQH27XPGBuX+d1tnvM7ihcFwHMSstNAVUU= -github.com/multiformats/go-multihash v0.0.1 h1:HHwN1K12I+XllBCrqKnhX949Orn4oawPkegHMu2vDqQ= -github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= -github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1/go.mod h1:8UvriyWtv5Q5EOgjHaSseUEdkQfvwFv1I/In/O2M9gc= -github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc/go.mod h1:bopw91TMyo8J3tvftk8xmU2kPmlrt4nScJQZU2hE5EM= -github.com/whyrusleeping/mafmt v1.2.8/go.mod h1:faQJFPbLSxzD9xpA02ttW/tS9vZykNvXwGvqIpk20FA= -golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b h1:+/WWzjwW6gidDJnMKWLKLX1gxn7irUTF1fLpQovfQ5M= -golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190227160552-c95aed5357e7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/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-20190219092855-153ac476189d/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223 h1:DH4skfRX4EBpamg7iV4ZlCpblAHI6s6TDM39bFZumv8= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/vendor/github.com/libp2p/go-conn-security/interface.go b/vendor/github.com/libp2p/go-conn-security/interface.go deleted file mode 100644 index 844c1399..00000000 --- a/vendor/github.com/libp2p/go-conn-security/interface.go +++ /dev/null @@ -1,25 +0,0 @@ -package connsec - -import ( - "context" - "net" - - inet "github.com/libp2p/go-libp2p-net" - peer "github.com/libp2p/go-libp2p-peer" -) - -// A Transport turns inbound and outbound unauthenticated, -// plain-text connections into authenticated, encrypted connections. -type Transport interface { - // SecureInbound secures an inbound connection. - SecureInbound(ctx context.Context, insecure net.Conn) (Conn, error) - - // SecureOutbound secures an outbound connection. - SecureOutbound(ctx context.Context, insecure net.Conn, p peer.ID) (Conn, error) -} - -// Conn is an authenticated, encrypted connection. -type Conn interface { - net.Conn - inet.ConnSecurity -} diff --git a/vendor/github.com/libp2p/go-conn-security/package.json b/vendor/github.com/libp2p/go-conn-security/package.json deleted file mode 100644 index 90bd2373..00000000 --- a/vendor/github.com/libp2p/go-conn-security/package.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "author": "Stebalien", - "bugs": { - "url": "https://github.com/libp2p/go-conn-security" - }, - "gx": { - "dvcsimport": "github.com/libp2p/go-conn-security" - }, - "gxDependencies": [ - { - "author": "whyrusleeping", - "hash": "QmYVXrKrKHDC9FobgmcmshCDyWwdrfwfanNQN4oxJ9Fk3h", - "name": "go-libp2p-peer", - "version": "3.1.2" - }, - { - "author": "whyrusleeping", - "hash": "QmTW4SdgBWq9GjsBsHeUx8WuGxzhgzAf88UMH2w62PC8yK", - "name": "go-libp2p-crypto", - "version": "2.0.7" - }, - { - "author": "whyrusleeping", - "hash": "QmY3ArotKMKaL7YGfbQfyDrib6RVraLqZYWXZvVgZktBxp", - "name": "go-libp2p-net", - "version": "3.0.30" - } - ], - "gxVersion": "0.12.1", - "language": "go", - "license": "MIT", - "name": "go-conn-security", - "releaseCmd": "git commit -a -m \"gx publish $VERSION\"", - "version": "0.1.28" -} - diff --git a/vendor/github.com/libp2p/go-libp2p-autonat-svc/.travis.yml b/vendor/github.com/libp2p/go-libp2p-autonat-svc/.travis.yml index 4cfe98c2..5163d693 100644 --- a/vendor/github.com/libp2p/go-libp2p-autonat-svc/.travis.yml +++ b/vendor/github.com/libp2p/go-libp2p-autonat-svc/.travis.yml @@ -10,7 +10,6 @@ env: global: - GOTFLAGS="-race" matrix: - - BUILD_DEPTYPE=gx - BUILD_DEPTYPE=gomod @@ -24,7 +23,6 @@ script: cache: directories: - - $GOPATH/src/gx - $GOPATH/pkg/mod - $HOME/.cache/go-build diff --git a/vendor/github.com/libp2p/go-libp2p-autonat-svc/README.md b/vendor/github.com/libp2p/go-libp2p-autonat-svc/README.md index 2c30ea90..181415db 100644 --- a/vendor/github.com/libp2p/go-libp2p-autonat-svc/README.md +++ b/vendor/github.com/libp2p/go-libp2p-autonat-svc/README.md @@ -23,3 +23,7 @@ This repository falls under the IPFS [Code of Conduct](https://github.com/ipfs/c ## License MIT + +--- + +The last gx published version of this module was: 1.0.15: QmS4vFMsoH5BwxfWdMBeMt6sBdcBAB5mik1ATADySymLZW diff --git a/vendor/github.com/libp2p/go-libp2p-autonat-svc/go.mod b/vendor/github.com/libp2p/go-libp2p-autonat-svc/go.mod index 521af1a8..9c726a4a 100644 --- a/vendor/github.com/libp2p/go-libp2p-autonat-svc/go.mod +++ b/vendor/github.com/libp2p/go-libp2p-autonat-svc/go.mod @@ -3,12 +3,9 @@ module github.com/libp2p/go-libp2p-autonat-svc require ( github.com/gogo/protobuf v1.2.1 github.com/ipfs/go-log v0.0.1 - github.com/libp2p/go-libp2p v0.0.2 - github.com/libp2p/go-libp2p-autonat v0.0.3 - github.com/libp2p/go-libp2p-host v0.0.1 - github.com/libp2p/go-libp2p-net v0.0.1 - github.com/libp2p/go-libp2p-peer v0.0.1 - github.com/libp2p/go-libp2p-peerstore v0.0.1 - github.com/multiformats/go-multiaddr v0.0.1 + github.com/libp2p/go-libp2p v0.1.0 + github.com/libp2p/go-libp2p-autonat v0.1.0 + github.com/libp2p/go-libp2p-core v0.0.1 + github.com/multiformats/go-multiaddr v0.0.4 github.com/multiformats/go-multiaddr-net v0.0.1 ) diff --git a/vendor/github.com/libp2p/go-libp2p-autonat-svc/go.sum b/vendor/github.com/libp2p/go-libp2p-autonat-svc/go.sum index e736cc49..2116a4ed 100644 --- a/vendor/github.com/libp2p/go-libp2p-autonat-svc/go.sum +++ b/vendor/github.com/libp2p/go-libp2p-autonat-svc/go.sum @@ -10,16 +10,14 @@ github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVa github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= -github.com/coreos/go-semver v0.2.0 h1:3Jm3tLmsgAYcjC+4Up7hJrFBPr+n7rAqYeSw/SZazuY= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dgraph-io/badger v1.5.5-0.20190226225317-8115aed38f8f/go.mod h1:VZxzAIRPHRVNRKRo6AXrX9BJegn6il06VMTZVJYCIjQ= github.com/dgryski/go-farm v0.0.0-20190104051053-3adb47b1fb0f/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/fd/go-nat v1.0.0 h1:DPyQ97sxA9ThrWYRPcWUz/z9TnpTIGRYODIQc/dy64M= -github.com/fd/go-nat v1.0.0/go.mod h1:BTBu/CKvMmOMUPkKVef1pngt2WFH/lg7E6yQnulfp6E= 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/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= @@ -33,17 +31,17 @@ github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gxed/hashland/keccakpg v0.0.1 h1:wrk3uMNaMxbXiHibbPO4S0ymqJMm41WiudyFSs7UnsU= github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfmKFJ6tItnhQ67kU= -github.com/gxed/hashland/murmur3 v0.0.1 h1:SheiaIt0sda5K+8FLz952/1iWS9zrnKsEJaOJu4ZbSc= github.com/gxed/hashland/murmur3 v0.0.1/go.mod h1:KjXop02n4/ckmZSnY2+HKcLud/tcmvhST0bie/0lS48= github.com/hashicorp/golang-lru v0.5.1/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-20180415215157-1395d1447324 h1:PV190X5/DzQ/tbFFG5YpT5mH6q+cHlfgqI5JuRnH9oE= -github.com/huin/goupnp v0.0.0-20180415215157-1395d1447324/go.mod h1:MZ2ZmwcBpvOoJ22IJsc7va19ZwoheaBk43rKg12SKag= -github.com/ipfs/go-cid v0.0.1 h1:GBjWPktLnNyX0JiQCNFpUuUSoMw5KMyqrsejHYlILBE= +github.com/huin/goupnp v1.0.0 h1:wg75sLpL6DZqwHQN6E1Cfk6mtfzS45z8OV+ic+DtHRo= +github.com/huin/goupnp v1.0.0/go.mod h1:n9v9KO1tAxYH82qOn+UTIFQDmx5n1Zxd/ClZDMX7Bnc= +github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= github.com/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= +github.com/ipfs/go-cid v0.0.2 h1:tuuKaZPU1M6HcejsO3AcYWW8sZ8MTvyxfc4uqB4eFE8= +github.com/ipfs/go-cid v0.0.2/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= github.com/ipfs/go-datastore v0.0.1/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk= github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps= @@ -54,21 +52,25 @@ github.com/ipfs/go-ipfs-util v0.0.1 h1:Wz9bL2wB2YBJqggkA4dD7oSmqB4cAnpNbGrlHJulv github.com/ipfs/go-ipfs-util v0.0.1/go.mod h1:spsl5z8KUnrve+73pOhSVZND1SIxPW5RyBCNzQxlJBc= github.com/ipfs/go-log v0.0.1 h1:9XTUN/rW64BCG1YhPK9Hoy3q8nr4gOmHHBpgFdfw6Lc= github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM= -github.com/jackpal/gateway v1.0.4 h1:LS5EHkLuQ6jzaHwULi0vL+JO0mU/n4yUtK8oUjHHOlM= -github.com/jackpal/gateway v1.0.4/go.mod h1:lTpwd4ACLXmpyiCTRtfiNyVnUmqT9RivzCDQetPfnjA= +github.com/jackpal/gateway v1.0.5 h1:qzXWUJfuMdlLMtt0a3Dgt+xkWQiA5itDEITVJtuSwMc= +github.com/jackpal/gateway v1.0.5/go.mod h1:lTpwd4ACLXmpyiCTRtfiNyVnUmqT9RivzCDQetPfnjA= github.com/jackpal/go-nat-pmp v1.0.1 h1:i0LektDkO1QlrTm/cSuP+PyBCDnYvjPLGl4LdWEMiaA= github.com/jackpal/go-nat-pmp v1.0.1/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= -github.com/jbenet/go-cienv v0.0.0-20150120210510-1bb1476777ec h1:DQqZhhDvrTrEQ3Qod5yfavcA064e53xlQ+xajiorXgM= github.com/jbenet/go-cienv v0.0.0-20150120210510-1bb1476777ec/go.mod h1:rGaEvXB4uRSZMmzKNLoXvTu1sfx+1kv/DojUlPrSZGs= +github.com/jbenet/go-cienv v0.1.0 h1:Vc/s0QbQtoxX8MwwSLWWh+xNNZvM3Lw7NsTcHrvvhMc= +github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA= github.com/jbenet/go-temp-err-catcher v0.0.0-20150120210811-aac704a3f4f2 h1:vhC1OXXiT9R2pczegwz6moDvuRpggaroAXhPIseh57A= github.com/jbenet/go-temp-err-catcher v0.0.0-20150120210811-aac704a3f4f2/go.mod h1:8GXXJV31xl8whumTzdZsTt3RnUIiPqzkyf7mxToRCMs= -github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8 h1:bspPhN+oKYFk5fcGNuQzp6IGzYQSenLEgH3s6jkXrWw= github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8/go.mod h1:Ly/wlsjFq/qrU3Rar62tu1gASgGw6chQbSh/XgIIXCY= +github.com/jbenet/goprocess v0.1.3 h1:YKyIEECS/XvcfHtBzxtjBBbWK+MbvA6dG8ASiqwvr10= +github.com/jbenet/goprocess v0.1.3/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= +github.com/koron/go-ssdp v0.0.0-20180514024734-4a0ed625a78b h1:wxtKgYHEncAU00muMD06dzLiahtGM1eouRNOzVV7tdQ= +github.com/koron/go-ssdp v0.0.0-20180514024734-4a0ed625a78b/go.mod h1:5Ky9EC2xfoUKUor0Hjgi2BJhCSXJfMOFlmyYrVKGQMk= 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= @@ -76,121 +78,129 @@ 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/libp2p/go-addr-util v0.0.1 h1:TpTQm9cXVRVSKsYbgQ7GKc3KbbHVTnbostgGaDEP+88= github.com/libp2p/go-addr-util v0.0.1/go.mod h1:4ac6O7n9rIAKB1dnd+s8IbbMXkt+oBpzX4/+RACcnlQ= -github.com/libp2p/go-buffer-pool v0.0.1 h1:9Rrn/H46cXjaA2HQ5Y8lyhOS1NhTkZ4yuEs2r3Eechg= github.com/libp2p/go-buffer-pool v0.0.1/go.mod h1:xtyIz9PMobb13WaxR6Zo1Pd1zXJKYg0a8KiIvDp3TzQ= -github.com/libp2p/go-conn-security v0.0.1 h1:4kMMrqrt9EUNCNjX1xagSJC+bq16uqjMe9lk1KBMVNs= -github.com/libp2p/go-conn-security v0.0.1/go.mod h1:bGmu51N0KU9IEjX7kl2PQjgZa40JQWnayTvNMgD/vyk= -github.com/libp2p/go-conn-security-multistream v0.0.1 h1:XefjAQRHcnUaxKb26RGupToucx3uU4ecbOZ3aACXlDU= -github.com/libp2p/go-conn-security-multistream v0.0.1/go.mod h1:nc9vud7inQ+d6SO0I/6dSWrdMnHnzZNHeyUQqrAJulE= +github.com/libp2p/go-buffer-pool v0.0.2 h1:QNK2iAFa8gjAe1SPz6mHSMuCcjs+X1wlHzeOSqcmlfs= +github.com/libp2p/go-buffer-pool v0.0.2/go.mod h1:MvaB6xw5vOrDl8rYZGLFdKAuk/hRoRZd1Vi32+RXyFM= +github.com/libp2p/go-conn-security-multistream v0.1.0 h1:aqGmto+ttL/uJgX0JtQI0tD21CIEy5eYd1Hlp0juHY0= +github.com/libp2p/go-conn-security-multistream v0.1.0/go.mod h1:aw6eD7LOsHEX7+2hJkDxw1MteijaVcI+/eP2/x3J1xc= github.com/libp2p/go-flow-metrics v0.0.1 h1:0gxuFd2GuK7IIP5pKljLwps6TvcuYgvG7Atqi3INF5s= github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZxBdp967ls1g+k8= -github.com/libp2p/go-libp2p v0.0.1 h1:oEjzhRzymY7NILTMzOKNVOpNZGpcQHrHriWw91pbJNM= -github.com/libp2p/go-libp2p v0.0.1/go.mod h1:bmRs8I0vwn6iRaVssZnJx/epY6WPSKiLoK1vyle4EX0= -github.com/libp2p/go-libp2p v0.0.2 h1:+jvgi0Zy3y4TKXJKApchCk3pCBPZf1T54z3+vKie3gw= -github.com/libp2p/go-libp2p v0.0.2/go.mod h1:Qu8bWqFXiocPloabFGUcVG4kk94fLvfC8mWTDdFC9wE= -github.com/libp2p/go-libp2p-autonat v0.0.1 h1:d5eskFxeJ4ag1ekhMC3yLTK+z+6RTw9W1Yv8HQma75k= -github.com/libp2p/go-libp2p-autonat v0.0.1/go.mod h1:fs71q5Xk+pdnKU014o2iq1RhMs9/PMaG5zXRFNnIIT4= -github.com/libp2p/go-libp2p-autonat v0.0.2 h1:ilo9QPzNPf1hMkqaPG55yzvhILf5ZtijstJhcii+l3s= -github.com/libp2p/go-libp2p-autonat v0.0.2/go.mod h1:fs71q5Xk+pdnKU014o2iq1RhMs9/PMaG5zXRFNnIIT4= -github.com/libp2p/go-libp2p-autonat v0.0.3 h1:PUD+pAx8Qs9hh+Bowzxq8RCkg/Vwrz5oCFC4peixXQk= -github.com/libp2p/go-libp2p-autonat v0.0.3/go.mod h1:fs71q5Xk+pdnKU014o2iq1RhMs9/PMaG5zXRFNnIIT4= -github.com/libp2p/go-libp2p-blankhost v0.0.1 h1:/mZuuiwntNR8RywnCFlGHLKrKLYne+qciBpQXWqp5fk= -github.com/libp2p/go-libp2p-blankhost v0.0.1/go.mod h1:Ibpbw/7cPPYwFb7PACIWdvxxv0t0XCCI10t7czjAjTc= -github.com/libp2p/go-libp2p-circuit v0.0.1 h1:DYbjyQ5ZY3QVAVYZWG4uzBQ6Wmcd1C82Bk8Q/pJlM1I= -github.com/libp2p/go-libp2p-circuit v0.0.1/go.mod h1:Dqm0s/BiV63j8EEAs8hr1H5HudqvCAeXxDyic59lCwE= -github.com/libp2p/go-libp2p-crypto v0.0.1 h1:JNQd8CmoGTohO/akqrH16ewsqZpci2CbgYH/LmYl8gw= -github.com/libp2p/go-libp2p-crypto v0.0.1/go.mod h1:yJkNyDmO341d5wwXxDUGO0LykUVT72ImHNUqh5D/dBE= -github.com/libp2p/go-libp2p-discovery v0.0.1 h1:VkjCKmJQMwpDUwtA8Qc1z3TQAHJgQ5nGQ6cdN0wQXOw= -github.com/libp2p/go-libp2p-discovery v0.0.1/go.mod h1:ZkkF9xIFRLA1xCc7bstYFkd80gBGK8Fc1JqGoU2i+zI= -github.com/libp2p/go-libp2p-host v0.0.1 h1:dnqusU+DheGcdxrE718kG4XgHNuL2n9eEv8Rg5zy8hQ= -github.com/libp2p/go-libp2p-host v0.0.1/go.mod h1:qWd+H1yuU0m5CwzAkvbSjqKairayEHdR5MMl7Cwa7Go= -github.com/libp2p/go-libp2p-interface-connmgr v0.0.1 h1:Q9EkNSLAOF+u90L88qmE9z/fTdjLh8OsJwGw74mkwk4= -github.com/libp2p/go-libp2p-interface-connmgr v0.0.1/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k= -github.com/libp2p/go-libp2p-interface-pnet v0.0.1 h1:7GnzRrBTJHEsofi1ahFdPN9Si6skwXQE9UqR2S+Pkh8= -github.com/libp2p/go-libp2p-interface-pnet v0.0.1/go.mod h1:el9jHpQAXK5dnTpKA4yfCNBZXvrzdOU75zz+C6ryp3k= -github.com/libp2p/go-libp2p-loggables v0.0.1 h1:HVww9oAnINIxbt69LJNkxD8lnbfgteXR97Xm4p3l9ps= -github.com/libp2p/go-libp2p-loggables v0.0.1/go.mod h1:lDipDlBNYbpyqyPX/KcoO+eq0sJYEVR2JgOexcivchg= -github.com/libp2p/go-libp2p-metrics v0.0.1 h1:yumdPC/P2VzINdmcKZd0pciSUCpou+s0lwYCjBbzQZU= -github.com/libp2p/go-libp2p-metrics v0.0.1/go.mod h1:jQJ95SXXA/K1VZi13h52WZMa9ja78zjyy5rspMsC/08= -github.com/libp2p/go-libp2p-nat v0.0.1 h1:on/zju7XE+JXc8gH+vTKmIh2UJFC1K8kGnJYluQrlz4= -github.com/libp2p/go-libp2p-nat v0.0.1/go.mod h1:4L6ajyUIlJvx1Cbh5pc6Ma6vMDpKXf3GgLO5u7W0oQ4= -github.com/libp2p/go-libp2p-nat v0.0.2 h1:sKI5hiCsGFhuEKdXMsF9mywQu2qhfoIGX6a+VG6zelE= -github.com/libp2p/go-libp2p-nat v0.0.2/go.mod h1:QrjXQSD5Dj4IJOdEcjHRkWTSomyxRo6HnUkf/TfQpLQ= -github.com/libp2p/go-libp2p-net v0.0.1 h1:xJ4Vh4yKF/XKb8fd1Ev0ebAGzVjMxXzrxG2kjtU+F5Q= -github.com/libp2p/go-libp2p-net v0.0.1/go.mod h1:Yt3zgmlsHOgUWSXmt5V/Jpz9upuJBE8EgNU9DrCcR8c= -github.com/libp2p/go-libp2p-netutil v0.0.1/go.mod h1:GdusFvujWZI9Vt0X5BKqwWWmZFxecf9Gt03cKxm2f/Q= -github.com/libp2p/go-libp2p-peer v0.0.1 h1:0qwAOljzYewINrU+Kndoc+1jAL7vzY/oY2Go4DCGfyY= -github.com/libp2p/go-libp2p-peer v0.0.1/go.mod h1:nXQvOBbwVqoP+T5Y5nCjeH4sP9IX/J0AMzcDUVruVoo= -github.com/libp2p/go-libp2p-peerstore v0.0.1 h1:twKovq8YK5trLrd3nB7PD2Zu9JcyAIdm7Bz9yBWjhq8= -github.com/libp2p/go-libp2p-peerstore v0.0.1/go.mod h1:RabLyPVJLuNQ+GFyoEkfi8H4Ti6k/HtZJ7YKgtSq+20= -github.com/libp2p/go-libp2p-protocol v0.0.1 h1:+zkEmZ2yFDi5adpVE3t9dqh/N9TbpFWywowzeEzBbLM= -github.com/libp2p/go-libp2p-protocol v0.0.1/go.mod h1:Af9n4PiruirSDjHycM1QuiMi/1VZNHYcK8cLgFJLZ4s= -github.com/libp2p/go-libp2p-routing v0.0.1 h1:hPMAWktf9rYi3ME4MG48qE7dq1ofJxiQbfdvpNntjhc= -github.com/libp2p/go-libp2p-routing v0.0.1/go.mod h1:N51q3yTr4Zdr7V8Jt2JIktVU+3xBBylx1MZeVA6t1Ys= -github.com/libp2p/go-libp2p-secio v0.0.1 h1:CqE/RdsizOwItdgLe632iyft/w0tshDLmZGAiKDcUAI= -github.com/libp2p/go-libp2p-secio v0.0.1/go.mod h1:IdG6iQybdcYmbTzxp4J5dwtUEDTOvZrT0opIDVNPrJs= -github.com/libp2p/go-libp2p-swarm v0.0.1 h1:Vne+hjaDwXqzgNwQ2vb2YKbnbOTyXjtS47stT66Apc4= -github.com/libp2p/go-libp2p-swarm v0.0.1/go.mod h1:mh+KZxkbd3lQnveQ3j2q60BM1Cw2mX36XXQqwfPOShs= -github.com/libp2p/go-libp2p-transport v0.0.1/go.mod h1:UzbUs9X+PHOSw7S3ZmeOxfnwaQY5vGDzZmKPod3N3tk= -github.com/libp2p/go-libp2p-transport v0.0.4 h1:/CPHQMN75/IQwkhBxxIo6p6PtL3rwFZtlzBROT3e8mw= -github.com/libp2p/go-libp2p-transport v0.0.4/go.mod h1:StoY3sx6IqsP6XKoabsPnHCwqKXWUMWU7Rfcsubee/A= -github.com/libp2p/go-libp2p-transport-upgrader v0.0.1 h1:rNtXkY6dty46mxYOHHAZQchI7gQdJStF683FhVnei/k= -github.com/libp2p/go-libp2p-transport-upgrader v0.0.1/go.mod h1:NJpUAgQab/8K6K0m+JmZCe5RUXG10UMEx4kWe9Ipj5c= -github.com/libp2p/go-maddr-filter v0.0.1 h1:apvYTg0aIxxQyBX+XHKOR+0+lYhGs1Yv+JmTH9nyl5I= -github.com/libp2p/go-maddr-filter v0.0.1/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= -github.com/libp2p/go-mplex v0.0.1 h1:dn2XGSrUxLtz3/8u85bGrwhUEKPX8MOF3lpmcWBZCWc= -github.com/libp2p/go-mplex v0.0.1/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0= -github.com/libp2p/go-msgio v0.0.1 h1:znj97n5FtXGCLDwe9x8jpHmY770SW4WStBGcCDh6GJw= -github.com/libp2p/go-msgio v0.0.1/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= +github.com/libp2p/go-libp2p v0.1.0 h1:8VXadcPNni74ODoZ+7326LMAppFYmz1fRQOUuT5iZvQ= +github.com/libp2p/go-libp2p v0.1.0/go.mod h1:6D/2OBauqLUoqcADOJpn9WbKqvaM07tDw68qHM0BxUM= +github.com/libp2p/go-libp2p-autonat v0.1.0 h1:aCWAu43Ri4nU0ZPO7NyLzUvvfqd0nE3dX0R/ZGYVgOU= +github.com/libp2p/go-libp2p-autonat v0.1.0/go.mod h1:1tLf2yXxiE/oKGtDwPYWTSYG3PtvYlJmg7NeVtPRqH8= +github.com/libp2p/go-libp2p-blankhost v0.1.1 h1:X919sCh+KLqJcNRApj43xCSiQRYqOSI88Fdf55ngf78= +github.com/libp2p/go-libp2p-blankhost v0.1.1/go.mod h1:pf2fvdLJPsC1FsVrNP3DUUvMzUts2dsLLBEpo1vW1ro= +github.com/libp2p/go-libp2p-circuit v0.1.0 h1:eniLL3Y9aq/sryfyV1IAHj5rlvuyj3b7iz8tSiZpdhY= +github.com/libp2p/go-libp2p-circuit v0.1.0/go.mod h1:Ahq4cY3V9VJcHcn1SBXjr78AbFkZeIRmfunbA7pmFh8= +github.com/libp2p/go-libp2p-core v0.0.1 h1:HSTZtFIq/W5Ue43Zw+uWZyy2Vl5WtF0zDjKN8/DT/1I= +github.com/libp2p/go-libp2p-core v0.0.1/go.mod h1:g/VxnTZ/1ygHxH3dKok7Vno1VfpvGcGip57wjTU4fco= +github.com/libp2p/go-libp2p-crypto v0.1.0 h1:k9MFy+o2zGDNGsaoZl0MA3iZ75qXxr9OOoAZF+sD5OQ= +github.com/libp2p/go-libp2p-crypto v0.1.0/go.mod h1:sPUokVISZiy+nNuTTH/TY+leRSxnFj/2GLjtOTW90hI= +github.com/libp2p/go-libp2p-discovery v0.1.0 h1:j+R6cokKcGbnZLf4kcNwpx6mDEUPF3N6SrqMymQhmvs= +github.com/libp2p/go-libp2p-discovery v0.1.0/go.mod h1:4F/x+aldVHjHDHuX85x1zWoFTGElt8HnoDzwkFZm29g= +github.com/libp2p/go-libp2p-loggables v0.1.0 h1:h3w8QFfCt2UJl/0/NW4K829HX/0S4KD31PQ7m8UXXO8= +github.com/libp2p/go-libp2p-loggables v0.1.0/go.mod h1:EyumB2Y6PrYjr55Q3/tiJ/o3xoDasoRYM7nOzEpoa90= +github.com/libp2p/go-libp2p-mplex v0.2.0/go.mod h1:Ejl9IyjvXJ0T9iqUTE1jpYATQ9NM3g+OtR+EMMODbKo= +github.com/libp2p/go-libp2p-mplex v0.2.1 h1:E1xaJBQnbSiTHGI1gaBKmKhu1TUKkErKJnE8iGvirYI= +github.com/libp2p/go-libp2p-mplex v0.2.1/go.mod h1:SC99Rxs8Vuzrf/6WhmH41kNn13TiYdAWNYHrwImKLnE= +github.com/libp2p/go-libp2p-nat v0.0.4 h1:+KXK324yaY701On8a0aGjTnw8467kW3ExKcqW2wwmyw= +github.com/libp2p/go-libp2p-nat v0.0.4/go.mod h1:N9Js/zVtAXqaeT99cXgTV9e75KpnWCvVOiGzlcHmBbY= +github.com/libp2p/go-libp2p-netutil v0.1.0/go.mod h1:3Qv/aDqtMLTUyQeundkKsA+YCThNdbQD54k3TqjpbFU= +github.com/libp2p/go-libp2p-peer v0.2.0 h1:EQ8kMjaCUwt/Y5uLgjT8iY2qg0mGUT0N1zUjer50DsY= +github.com/libp2p/go-libp2p-peer v0.2.0/go.mod h1:RCffaCvUyW2CJmG2gAWVqwePwW7JMgxjsHm7+J5kjWY= +github.com/libp2p/go-libp2p-peerstore v0.1.0 h1:MKh7pRNPHSh1fLPj8u/M/s/napdmeNpoi9BRy9lPN0E= +github.com/libp2p/go-libp2p-peerstore v0.1.0/go.mod h1:2CeHkQsr8svp4fZ+Oi9ykN1HBb6u0MOvdJ7YIsmcwtY= +github.com/libp2p/go-libp2p-secio v0.1.0 h1:NNP5KLxuP97sE5Bu3iuwOWyT/dKEGMN5zSLMWdB7GTQ= +github.com/libp2p/go-libp2p-secio v0.1.0/go.mod h1:tMJo2w7h3+wN4pgU2LSYeiKPrfqBgkOsdiKK77hE7c8= +github.com/libp2p/go-libp2p-swarm v0.1.0 h1:HrFk2p0awrGEgch9JXK/qp/hfjqQfgNxpLWnCiWPg5s= +github.com/libp2p/go-libp2p-swarm v0.1.0/go.mod h1:wQVsCdjsuZoc730CgOvh5ox6K8evllckjebkdiY5ta4= +github.com/libp2p/go-libp2p-testing v0.0.2/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= +github.com/libp2p/go-libp2p-testing v0.0.3 h1:bdij4bKaaND7tCsaXVjRfYkMpvoOeKj9AVQGJllA6jM= +github.com/libp2p/go-libp2p-testing v0.0.3/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= +github.com/libp2p/go-libp2p-transport-upgrader v0.1.1 h1:PZMS9lhjK9VytzMCW3tWHAXtKXmlURSc3ZdvwEcKCzw= +github.com/libp2p/go-libp2p-transport-upgrader v0.1.1/go.mod h1:IEtA6or8JUbsV07qPW4r01GnTenLW4oi3lOPbUMGJJA= +github.com/libp2p/go-libp2p-yamux v0.2.0 h1:TSPZ5cMMz/wdoYsye/wU1TE4G3LDGMoeEN0xgnCKU/I= +github.com/libp2p/go-libp2p-yamux v0.2.0/go.mod h1:Db2gU+XfLpm6E4rG5uGCFX6uXA8MEXOxFcRoXUODaK8= +github.com/libp2p/go-maddr-filter v0.0.4 h1:hx8HIuuwk34KePddrp2mM5ivgPkZ09JH4AvsALRbFUs= +github.com/libp2p/go-maddr-filter v0.0.4/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= +github.com/libp2p/go-mplex v0.0.3 h1:YiMaevQcZtFU6DmKIF8xEO0vaui5kM5HJ1V1xkWQv14= +github.com/libp2p/go-mplex v0.0.3/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0= +github.com/libp2p/go-mplex v0.1.0 h1:/nBTy5+1yRyY82YaO6HXQRnO5IAGsXTjEJaR3LdTPc0= +github.com/libp2p/go-mplex v0.1.0/go.mod h1:SXgmdki2kwCUlCCbfGLEgHjC4pFqhTp0ZoV6aiKgxDU= +github.com/libp2p/go-msgio v0.0.2 h1:ivPvEKHxmVkTClHzg6RXTYHqaJQ0V9cDbq+6lKb3UV0= +github.com/libp2p/go-msgio v0.0.2/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= +github.com/libp2p/go-nat v0.0.3 h1:l6fKV+p0Xa354EqQOQP+d8CivdLM4kl5GxC1hSc/UeI= +github.com/libp2p/go-nat v0.0.3/go.mod h1:88nUEt0k0JD45Bk93NIwDqjlhiOwOoV36GchpcVc1yI= github.com/libp2p/go-reuseport v0.0.1 h1:7PhkfH73VXfPJYKQ6JwS5I/eVcoyYi9IMNGc6FWpFLw= github.com/libp2p/go-reuseport v0.0.1/go.mod h1:jn6RmB1ufnQwl0Q1f+YxAj8isJgDCQzaaxIFYDhcYEA= -github.com/libp2p/go-reuseport-transport v0.0.1 h1:UIRneNxLDmEGNjGHpIiWzSWkZ5bhxMCP9x3Vh7BSc7E= -github.com/libp2p/go-reuseport-transport v0.0.1/go.mod h1:YkbSDrvjUVDL6b8XqriyA20obEtsW9BLkuOUyQAOCbs= +github.com/libp2p/go-reuseport-transport v0.0.2 h1:WglMwyXyBu61CMkjCCtnmqNqnjib0GIEjMiHTwR/KN4= +github.com/libp2p/go-reuseport-transport v0.0.2/go.mod h1:YkbSDrvjUVDL6b8XqriyA20obEtsW9BLkuOUyQAOCbs= github.com/libp2p/go-stream-muxer v0.0.1 h1:Ce6e2Pyu+b5MC1k3eeFtAax0pW4gc6MosYSLV05UeLw= github.com/libp2p/go-stream-muxer v0.0.1/go.mod h1:bAo8x7YkSpadMTbtTaxGVHWUQsR/l5MEaHbKaliuT14= -github.com/libp2p/go-tcp-transport v0.0.1 h1:WyvJVw2lYAnr6CU+GZZ4oCt06fvORlmvBlFX2+ZpZDM= -github.com/libp2p/go-tcp-transport v0.0.1/go.mod h1:mnjg0o0O5TmXUaUIanYPUqkW4+u6mK0en8rlpA6BBTs= -github.com/libp2p/go-testutil v0.0.1 h1:Xg+O0G2HIMfHqBOBDcMS1iSZJ3GEcId4qOxCQvsGZHk= -github.com/libp2p/go-testutil v0.0.1/go.mod h1:iAcJc/DKJQanJ5ws2V+u5ywdL2n12X1WbbEG+Jjy69I= -github.com/libp2p/go-ws-transport v0.0.1 h1:9ytMqq86Xvp8rcnC/1ZNuH612eXLDglvcu4ZHseJl8s= -github.com/libp2p/go-ws-transport v0.0.1/go.mod h1:p3bKjDWHEgtuKKj+2OdPYs5dAPIjtpQGHF2tJfGz7Ww= +github.com/libp2p/go-stream-muxer-multistream v0.2.0 h1:714bRJ4Zy9mdhyTLJ+ZKiROmAFwUHpeRidG+q7LTQOg= +github.com/libp2p/go-stream-muxer-multistream v0.2.0/go.mod h1:j9eyPol/LLRqT+GPLSxvimPhNph4sfYfMoDPd7HkzIc= +github.com/libp2p/go-tcp-transport v0.1.0 h1:IGhowvEqyMFknOar4FWCKSWE0zL36UFKQtiRQD60/8o= +github.com/libp2p/go-tcp-transport v0.1.0/go.mod h1:oJ8I5VXryj493DEJ7OsBieu8fcg2nHGctwtInJVpipc= +github.com/libp2p/go-ws-transport v0.1.0 h1:F+0OvvdmPTDsVc4AjPHjV7L7Pk1B7D5QwtDcKE2oag4= +github.com/libp2p/go-ws-transport v0.1.0/go.mod h1:rjw1MG1LU9YDC6gzmwObkPd/Sqwhw7yT74kj3raBFuo= +github.com/libp2p/go-yamux v1.2.2 h1:s6J6o7+ajoQMjHe7BEnq+EynOj5D2EoG8CuQgL3F2vg= +github.com/libp2p/go-yamux v1.2.2/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= github.com/mattn/go-colorable v0.1.1 h1:G1f5SKeVxmagw/IyvzvtZE4Gybcc4Tr1tf7I8z0XgOg= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= github.com/mattn/go-isatty v0.0.5 h1:tHXDdz1cpzGaovsTB+TVB8q90WEokoVmfMqoVcrLUgw= github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/miekg/dns v1.1.4/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/miekg/dns v1.1.12/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0OXOcUbGjvZxxijuBwbbmlSxLiuofa+g= github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= -github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16 h1:5W7KhL8HVF3XCFOweFD3BNESdnO8ewyYTFT2R+/b8FQ= github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= -github.com/mr-tron/base58 v1.1.0 h1:Y51FGVJ91WBqCEabAi5OPUz38eAx8DakuAm5svLcsfQ= +github.com/minio/sha256-simd v0.0.0-20190328051042-05b4dd3047e5 h1:l16XLUUJ34wIz+RIvLhSwGvLvKyy+W598b135bJN6mg= +github.com/minio/sha256-simd v0.0.0-20190328051042-05b4dd3047e5/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= +github.com/minio/sha256-simd v0.1.0 h1:U41/2erhAKcmSI14xh/ZTUdBPOzDOIfS93ibzUSl8KM= +github.com/minio/sha256-simd v0.1.0/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= +github.com/mr-tron/base58 v1.1.1/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= +github.com/mr-tron/base58 v1.1.2 h1:ZEw4I2EgPKDJ2iEw0cNmLB3ROrEmkOtXIkaG7wZg+78= +github.com/mr-tron/base58 v1.1.2/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= github.com/multiformats/go-base32 v0.0.3 h1:tw5+NhuwaOjJCC5Pp82QuXbrmLzWg7uxlMFp8Nq/kkI= github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= -github.com/multiformats/go-multiaddr v0.0.1 h1:/QUV3VBMDI6pi6xfiw7lr6xhDWWvQKn9udPn68kLSdY= github.com/multiformats/go-multiaddr v0.0.1/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= +github.com/multiformats/go-multiaddr v0.0.2/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= +github.com/multiformats/go-multiaddr v0.0.4 h1:WgMSI84/eRLdbptXMkMWDXPjPq7SPLIgGUVm2eroyU4= +github.com/multiformats/go-multiaddr v0.0.4/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= github.com/multiformats/go-multiaddr-dns v0.0.1/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= github.com/multiformats/go-multiaddr-dns v0.0.2 h1:/Bbsgsy3R6e3jf2qBahzNHzww6usYaZ0NhNH3sqdFS8= github.com/multiformats/go-multiaddr-dns v0.0.2/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= +github.com/multiformats/go-multiaddr-fmt v0.0.1 h1:5YjeOIzbX8OTKVaN72aOzGIYW7PnrZrnkDyOfAWRSMA= +github.com/multiformats/go-multiaddr-fmt v0.0.1/go.mod h1:aBYjqL4T/7j4Qx+R73XSv/8JsgnRFlf0w2KGLCmXl3Q= github.com/multiformats/go-multiaddr-net v0.0.1 h1:76O59E3FavvHqNg7jvzWzsPSW5JSi/ek0E4eiDVbg9g= github.com/multiformats/go-multiaddr-net v0.0.1/go.mod h1:nw6HSxNmCIQH27XPGBuX+d1tnvM7ihcFwHMSstNAVUU= github.com/multiformats/go-multibase v0.0.1 h1:PN9/v21eLywrFWdFNsFKaU04kLJzuYzmrJR+ubhT9qA= github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs= -github.com/multiformats/go-multihash v0.0.1 h1:HHwN1K12I+XllBCrqKnhX949Orn4oawPkegHMu2vDqQ= github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= -github.com/multiformats/go-multistream v0.0.1 h1:JV4VfSdY9n7ECTtY59/TlSyFCzRILvYx4T4Ws8ZgihU= -github.com/multiformats/go-multistream v0.0.1/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= +github.com/multiformats/go-multihash v0.0.5 h1:1wxmCvTXAifAepIMyF39vZinRw5sbqjPs/UIi93+uik= +github.com/multiformats/go-multihash v0.0.5/go.mod h1:lt/HCbqlQwlPBz7lv0sQCdtfcMtlJvakRUn/0Ual8po= +github.com/multiformats/go-multistream v0.1.0 h1:UpO6jrsjqs46mqAK3n6wKRYFhugss9ArzbyUzU+4wkQ= +github.com/multiformats/go-multistream v0.1.0/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= 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/ginkgo v1.8.0 h1:VkHVNpR4iVnU8XQR6DBm8BqYjN7CRzw+xKUbVVbbW9w= +github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.5.0 h1:izbySO9zDPmjJ8rDjLvkA2zJHIo+HkYXHnf7eN7SSyo= +github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/opentracing/opentracing-go v1.0.2 h1:3jA2P6O1F9UOrWVpwrIo17pu01KWvNWg4X946/Y5Zwg= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= 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/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a h1:/eS3yfGjQKG+9kayBkj0ip1BGhq6zJ3eaVksphxAaek= +github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a/go.mod h1:7AyxJNCJ7SBZ1MfVQCWD6Uqo2oubI2Eq2y2eqf+A5r0= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 h1:RC6RW7j+1+HkWaX/Yh71Ee5ZHaHYt7ZP4sQgUrm6cDU= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572/go.mod h1:w0SWMsp6j9O/dk4/ZpIhL+3CkG8ofA2vuv7k+ltqUMc= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= @@ -200,38 +210,33 @@ github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc h1:9lDbC6 github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc/go.mod h1:bopw91TMyo8J3tvftk8xmU2kPmlrt4nScJQZU2hE5EM= github.com/whyrusleeping/go-notifier v0.0.0-20170827234753-097c5d47330f h1:M/lL30eFZTKnomXY6huvM6G0+gVquFNf6mxghaWlFUg= github.com/whyrusleeping/go-notifier v0.0.0-20170827234753-097c5d47330f/go.mod h1:cZNvX9cFybI01GriPRMXDtczuvUhgbcYr9iCGaNlRv8= -github.com/whyrusleeping/go-smux-multiplex v3.0.16+incompatible h1:iqksILj8STw03EJQe7Laj4ubnw+ojOyik18cd5vPL1o= -github.com/whyrusleeping/go-smux-multiplex v3.0.16+incompatible/go.mod h1:34LEDbeKFZInPUrAG+bjuJmUXONGdEFW7XL0SpTY1y4= -github.com/whyrusleeping/go-smux-multistream v2.0.2+incompatible h1:BdYHctE9HJZLquG9tpTdwWcbG4FaX6tVKPGjCGgiVxo= -github.com/whyrusleeping/go-smux-multistream v2.0.2+incompatible/go.mod h1:dRWHHvc4HDQSHh9gbKEBbUZ+f2Q8iZTPG3UOGYODxSQ= -github.com/whyrusleeping/go-smux-yamux v2.0.8+incompatible h1:IGm/UP/JpEFS6D787sZnZg7RA6fZIR9c/Ms9DeAVNuk= -github.com/whyrusleeping/go-smux-yamux v2.0.8+incompatible/go.mod h1:6qHUzBXUbB9MXmw3AUdB52L8sEb/hScCqOdW2kj/wuI= -github.com/whyrusleeping/go-smux-yamux v2.0.9+incompatible h1:nVkExQ7pYlN9e45LcqTCOiDD0904fjtm0flnHZGbXkw= -github.com/whyrusleeping/go-smux-yamux v2.0.9+incompatible/go.mod h1:6qHUzBXUbB9MXmw3AUdB52L8sEb/hScCqOdW2kj/wuI= github.com/whyrusleeping/mafmt v1.2.8 h1:TCghSl5kkwEE0j+sU/gudyhVMRlpBin8fMBBHg59EbA= github.com/whyrusleeping/mafmt v1.2.8/go.mod h1:faQJFPbLSxzD9xpA02ttW/tS9vZykNvXwGvqIpk20FA= github.com/whyrusleeping/mdns v0.0.0-20180901202407-ef14215e6b30/go.mod h1:j4l84WPFclQPj320J9gp0XwNKBb3U0zt5CBqjPp22G4= github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7 h1:E9S12nwJwEOXe2d6gT6qxdvqMnNq+VnSsKPgm2ZZNds= github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7/go.mod h1:X2c0RVCI1eSUFI8eLcY3c0423ykwiUdxLJtkDvruhjI= -github.com/whyrusleeping/yamux v1.1.5 h1:4CK3aUUJQu0qpKZv5gEWJjNOQtdbdDhVVS6PJ+HimdE= -github.com/whyrusleeping/yamux v1.1.5/go.mod h1:E8LnQQ8HKx5KD29HZFUwM1PxCOdPRzGwur1mcYhXcD8= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25 h1:jsG6UpNLt9iAsb0S2AGW28DveNzzgmbXR+ENoPjUeIU= -golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/net v0.0.0-20180524181706-dfa909b99c79/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734 h1:p/H982KKEjUnLJkM3tt/LemDnOc1GiZL5FCVlORJ5zo= +golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f h1:R423Cnkcp5JABoeemiGEPlt9tHXFfw5kvc0yqlxRPWo= +golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190227160552-c95aed5357e7 h1:C2F/nMkR/9sfUTpvR3QrjBuTdvMUC/cFajkphs1YLQo= +golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190227160552-c95aed5357e7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3 h1:0GoQqolDA55aaLxZyTzK/Y2ePZzZTUrRacwib7cNsYQ= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f h1:wMNYb4v58l5UBM7MYRLPG6ZhfOqbKu7X5eyFl8ZhKvA= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/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-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190219092855-153ac476189d/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190228124157-a34e9553db1e h1:ZytStCyV048ZqDsWHiYDdoI2Vd4msMcrDECFxS+tL9c= golang.org/x/sys v0.0.0-20190228124157-a34e9553db1e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d h1:+R4KGOnez64A81RvjARKc4UT5/tI9ujCIVX+P5KiHuI= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= diff --git a/vendor/github.com/libp2p/go-libp2p-autonat-svc/package.json b/vendor/github.com/libp2p/go-libp2p-autonat-svc/package.json deleted file mode 100644 index 1ed05afe..00000000 --- a/vendor/github.com/libp2p/go-libp2p-autonat-svc/package.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "author": "vyzo", - "bugs": {}, - "gx": { - "dvcsimport": "github.com/libp2p/go-libp2p-autonat-svc" - }, - "gxDependencies": [ - { - "author": "whyrusleeping", - "hash": "QmTRN7hRxvGkxKxDdeudty7sRet4L7ZKZCqKsXHa79wmAc", - "name": "go-libp2p", - "version": "6.0.41" - } - ], - "gxVersion": "0.12.1", - "language": "go", - "license": "", - "name": "go-libp2p-autonat-svc", - "releaseCmd": "git commit -a -m \"gx publish $VERSION\"", - "version": "1.0.15" -} diff --git a/vendor/github.com/libp2p/go-libp2p-autonat-svc/svc.go b/vendor/github.com/libp2p/go-libp2p-autonat-svc/svc.go index febae7a4..a685f3d3 100644 --- a/vendor/github.com/libp2p/go-libp2p-autonat-svc/svc.go +++ b/vendor/github.com/libp2p/go-libp2p-autonat-svc/svc.go @@ -5,15 +5,16 @@ import ( "sync" "time" + "github.com/libp2p/go-libp2p" + "github.com/libp2p/go-libp2p-core/helpers" + "github.com/libp2p/go-libp2p-core/host" + "github.com/libp2p/go-libp2p-core/network" + "github.com/libp2p/go-libp2p-core/peer" + pb "github.com/libp2p/go-libp2p-autonat/pb" ggio "github.com/gogo/protobuf/io" - libp2p "github.com/libp2p/go-libp2p" autonat "github.com/libp2p/go-libp2p-autonat" - host "github.com/libp2p/go-libp2p-host" - inet "github.com/libp2p/go-libp2p-net" - peer "github.com/libp2p/go-libp2p-peer" - pstore "github.com/libp2p/go-libp2p-peerstore" ma "github.com/multiformats/go-multiaddr" manet "github.com/multiformats/go-multiaddr-net" ) @@ -57,13 +58,13 @@ func NewAutoNATService(ctx context.Context, h host.Host, opts ...libp2p.Option) return as, nil } -func (as *AutoNATService) handleStream(s inet.Stream) { - defer inet.FullClose(s) +func (as *AutoNATService) handleStream(s network.Stream) { + defer helpers.FullClose(s) pid := s.Conn().RemotePeer() log.Debugf("New stream from %s", pid.Pretty()) - r := ggio.NewDelimitedReader(s, inet.MessageSizeMax) + r := ggio.NewDelimitedReader(s, network.MessageSizeMax) w := ggio.NewDelimitedWriter(s) var req pb.Message @@ -146,7 +147,7 @@ func (as *AutoNATService) handleDial(p peer.ID, obsaddr ma.Multiaddr, mpi *pb.Me return newDialResponseError(pb.Message_E_DIAL_ERROR, "no dialable addresses") } - return as.doDial(pstore.PeerInfo{ID: p, Addrs: addrs}) + return as.doDial(peer.AddrInfo{ID: p, Addrs: addrs}) } func (as *AutoNATService) skipDial(addr ma.Multiaddr) bool { @@ -164,7 +165,7 @@ func (as *AutoNATService) skipDial(addr ma.Multiaddr) bool { return false } -func (as *AutoNATService) doDial(pi pstore.PeerInfo) *pb.Message_DialResponse { +func (as *AutoNATService) doDial(pi peer.AddrInfo) *pb.Message_DialResponse { // rate limit check as.mx.Lock() count := as.reqs[pi.ID] diff --git a/vendor/github.com/libp2p/go-libp2p-autonat/.travis.yml b/vendor/github.com/libp2p/go-libp2p-autonat/.travis.yml index 4cfe98c2..5163d693 100644 --- a/vendor/github.com/libp2p/go-libp2p-autonat/.travis.yml +++ b/vendor/github.com/libp2p/go-libp2p-autonat/.travis.yml @@ -10,7 +10,6 @@ env: global: - GOTFLAGS="-race" matrix: - - BUILD_DEPTYPE=gx - BUILD_DEPTYPE=gomod @@ -24,7 +23,6 @@ script: cache: directories: - - $GOPATH/src/gx - $GOPATH/pkg/mod - $HOME/.cache/go-build diff --git a/vendor/github.com/libp2p/go-libp2p-autonat/Makefile b/vendor/github.com/libp2p/go-libp2p-autonat/Makefile deleted file mode 100644 index 3c64b37d..00000000 --- a/vendor/github.com/libp2p/go-libp2p-autonat/Makefile +++ /dev/null @@ -1,7 +0,0 @@ -gx: - go get -u github.com/whyrusleeping/gx - go get -u github.com/whyrusleeping/gx-go - -deps: gx - gx --verbose install --global - gx-go rewrite diff --git a/vendor/github.com/libp2p/go-libp2p-autonat/README.md b/vendor/github.com/libp2p/go-libp2p-autonat/README.md index 1daed18e..97420373 100644 --- a/vendor/github.com/libp2p/go-libp2p-autonat/README.md +++ b/vendor/github.com/libp2p/go-libp2p-autonat/README.md @@ -25,3 +25,7 @@ This repository falls under the IPFS [Code of Conduct](https://github.com/ipfs/c ## License MIT + +--- + +The last gx published version of this module was: 1.0.14: QmNnJhrc4ZtcPZg3oXDVdJ7HRtxDfLE2ccH56cZZjZ6y3p diff --git a/vendor/github.com/libp2p/go-libp2p-autonat/autonat.go b/vendor/github.com/libp2p/go-libp2p-autonat/autonat.go index 60188c94..7e839ddd 100644 --- a/vendor/github.com/libp2p/go-libp2p-autonat/autonat.go +++ b/vendor/github.com/libp2p/go-libp2p-autonat/autonat.go @@ -7,10 +7,10 @@ import ( "sync" "time" - host "github.com/libp2p/go-libp2p-host" - inet "github.com/libp2p/go-libp2p-net" - peer "github.com/libp2p/go-libp2p-peer" - pstore "github.com/libp2p/go-libp2p-peerstore" + "github.com/libp2p/go-libp2p-core/host" + "github.com/libp2p/go-libp2p-core/network" + "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p-core/peerstore" ma "github.com/multiformats/go-multiaddr" ) @@ -157,10 +157,10 @@ func (as *AmbientAutoNAT) autodetect() { for _, pi := range peers[:probe] { wg.Add(1) - go func(pi pstore.PeerInfo) { + go func(pi peer.AddrInfo) { defer wg.Done() - as.host.Peerstore().AddAddrs(pi.ID, pi.Addrs, pstore.TempAddrTTL) + as.host.Peerstore().AddAddrs(pi.ID, pi.Addrs, peerstore.TempAddrTTL) a, err := cli.DialBack(ctx, pi.ID) switch { @@ -217,7 +217,7 @@ func (as *AmbientAutoNAT) autodetect() { as.mx.Unlock() } -func (as *AmbientAutoNAT) getPeers() []pstore.PeerInfo { +func (as *AmbientAutoNAT) getPeers() []peer.AddrInfo { as.mx.Lock() defer as.mx.Unlock() @@ -225,13 +225,13 @@ func (as *AmbientAutoNAT) getPeers() []pstore.PeerInfo { return nil } - var connected, others []pstore.PeerInfo + var connected, others []peer.AddrInfo for p, addrs := range as.peers { - if as.host.Network().Connectedness(p) == inet.Connected { - connected = append(connected, pstore.PeerInfo{ID: p, Addrs: addrs}) + if as.host.Network().Connectedness(p) == network.Connected { + connected = append(connected, peer.AddrInfo{ID: p, Addrs: addrs}) } else { - others = append(others, pstore.PeerInfo{ID: p, Addrs: addrs}) + others = append(others, peer.AddrInfo{ID: p, Addrs: addrs}) } } @@ -245,7 +245,7 @@ func (as *AmbientAutoNAT) getPeers() []pstore.PeerInfo { } } -func shufflePeers(peers []pstore.PeerInfo) { +func shufflePeers(peers []peer.AddrInfo) { for i := range peers { j := rand.Intn(i + 1) peers[i], peers[j] = peers[j], peers[i] diff --git a/vendor/github.com/libp2p/go-libp2p-autonat/client.go b/vendor/github.com/libp2p/go-libp2p-autonat/client.go index aa3075e4..0d8549b4 100644 --- a/vendor/github.com/libp2p/go-libp2p-autonat/client.go +++ b/vendor/github.com/libp2p/go-libp2p-autonat/client.go @@ -5,12 +5,12 @@ import ( "fmt" pb "github.com/libp2p/go-libp2p-autonat/pb" + "github.com/libp2p/go-libp2p-core/helpers" ggio "github.com/gogo/protobuf/io" - host "github.com/libp2p/go-libp2p-host" - inet "github.com/libp2p/go-libp2p-net" - peer "github.com/libp2p/go-libp2p-peer" - pstore "github.com/libp2p/go-libp2p-peerstore" + "github.com/libp2p/go-libp2p-core/host" + "github.com/libp2p/go-libp2p-core/network" + "github.com/libp2p/go-libp2p-core/peer" ma "github.com/multiformats/go-multiaddr" ) @@ -51,12 +51,12 @@ func (c *client) DialBack(ctx context.Context, p peer.ID) (ma.Multiaddr, error) } // Might as well just reset the stream. Once we get to this point, we // don't care about being nice. - defer inet.FullClose(s) + defer helpers.FullClose(s) - r := ggio.NewDelimitedReader(s, inet.MessageSizeMax) + r := ggio.NewDelimitedReader(s, network.MessageSizeMax) w := ggio.NewDelimitedWriter(s) - req := newDialMessage(pstore.PeerInfo{ID: c.h.ID(), Addrs: c.getAddrs()}) + req := newDialMessage(peer.AddrInfo{ID: c.h.ID(), Addrs: c.getAddrs()}) err = w.WriteMsg(req) if err != nil { s.Reset() diff --git a/vendor/github.com/libp2p/go-libp2p-autonat/go.mod b/vendor/github.com/libp2p/go-libp2p-autonat/go.mod index c489716f..531d4b2e 100644 --- a/vendor/github.com/libp2p/go-libp2p-autonat/go.mod +++ b/vendor/github.com/libp2p/go-libp2p-autonat/go.mod @@ -3,11 +3,8 @@ module github.com/libp2p/go-libp2p-autonat require ( github.com/gogo/protobuf v1.2.1 github.com/ipfs/go-log v0.0.1 - github.com/libp2p/go-libp2p-blankhost v0.0.1 - github.com/libp2p/go-libp2p-host v0.0.1 - github.com/libp2p/go-libp2p-net v0.0.1 - github.com/libp2p/go-libp2p-peer v0.0.1 - github.com/libp2p/go-libp2p-peerstore v0.0.1 - github.com/libp2p/go-libp2p-swarm v0.0.1 - github.com/multiformats/go-multiaddr v0.0.1 + github.com/libp2p/go-libp2p-blankhost v0.1.1 + github.com/libp2p/go-libp2p-core v0.0.1 + github.com/libp2p/go-libp2p-swarm v0.1.0 + github.com/multiformats/go-multiaddr v0.0.4 ) diff --git a/vendor/github.com/libp2p/go-libp2p-autonat/go.sum b/vendor/github.com/libp2p/go-libp2p-autonat/go.sum index ecce8ed1..e2d20f17 100644 --- a/vendor/github.com/libp2p/go-libp2p-autonat/go.sum +++ b/vendor/github.com/libp2p/go-libp2p-autonat/go.sum @@ -10,8 +10,8 @@ github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVa github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= -github.com/coreos/go-semver v0.2.0 h1:3Jm3tLmsgAYcjC+4Up7hJrFBPr+n7rAqYeSw/SZazuY= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -36,18 +36,20 @@ github.com/gxed/hashland/murmur3 v0.0.1/go.mod h1:KjXop02n4/ckmZSnY2+HKcLud/tcmv github.com/hashicorp/golang-lru v0.5.1/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/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= github.com/ipfs/go-datastore v0.0.1/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= -github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk= -github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps= github.com/ipfs/go-ds-badger v0.0.2/go.mod h1:Y3QpeSFWQf6MopLTiZD+VT6IC1yZqaGmjvRcKeSGij8= github.com/ipfs/go-ds-leveldb v0.0.1/go.mod h1:feO8V3kubwsEF22n0YRQCffeb79OOYIykR4L04tMOYc= github.com/ipfs/go-ipfs-delay v0.0.0-20181109222059-70721b86a9a8/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= github.com/ipfs/go-log v0.0.1 h1:9XTUN/rW64BCG1YhPK9Hoy3q8nr4gOmHHBpgFdfw6Lc= github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM= +github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA= github.com/jbenet/go-temp-err-catcher v0.0.0-20150120210811-aac704a3f4f2 h1:vhC1OXXiT9R2pczegwz6moDvuRpggaroAXhPIseh57A= github.com/jbenet/go-temp-err-catcher v0.0.0-20150120210811-aac704a3f4f2/go.mod h1:8GXXJV31xl8whumTzdZsTt3RnUIiPqzkyf7mxToRCMs= github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8 h1:bspPhN+oKYFk5fcGNuQzp6IGzYQSenLEgH3s6jkXrWw= github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8/go.mod h1:Ly/wlsjFq/qrU3Rar62tu1gASgGw6chQbSh/XgIIXCY= +github.com/jbenet/goprocess v0.1.3 h1:YKyIEECS/XvcfHtBzxtjBBbWK+MbvA6dG8ASiqwvr10= +github.com/jbenet/goprocess v0.1.3/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= @@ -60,61 +62,57 @@ 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/libp2p/go-addr-util v0.0.1 h1:TpTQm9cXVRVSKsYbgQ7GKc3KbbHVTnbostgGaDEP+88= github.com/libp2p/go-addr-util v0.0.1/go.mod h1:4ac6O7n9rIAKB1dnd+s8IbbMXkt+oBpzX4/+RACcnlQ= -github.com/libp2p/go-buffer-pool v0.0.1 h1:9Rrn/H46cXjaA2HQ5Y8lyhOS1NhTkZ4yuEs2r3Eechg= github.com/libp2p/go-buffer-pool v0.0.1/go.mod h1:xtyIz9PMobb13WaxR6Zo1Pd1zXJKYg0a8KiIvDp3TzQ= -github.com/libp2p/go-conn-security v0.0.1 h1:4kMMrqrt9EUNCNjX1xagSJC+bq16uqjMe9lk1KBMVNs= -github.com/libp2p/go-conn-security v0.0.1/go.mod h1:bGmu51N0KU9IEjX7kl2PQjgZa40JQWnayTvNMgD/vyk= -github.com/libp2p/go-conn-security-multistream v0.0.1 h1:XefjAQRHcnUaxKb26RGupToucx3uU4ecbOZ3aACXlDU= -github.com/libp2p/go-conn-security-multistream v0.0.1/go.mod h1:nc9vud7inQ+d6SO0I/6dSWrdMnHnzZNHeyUQqrAJulE= +github.com/libp2p/go-buffer-pool v0.0.2 h1:QNK2iAFa8gjAe1SPz6mHSMuCcjs+X1wlHzeOSqcmlfs= +github.com/libp2p/go-buffer-pool v0.0.2/go.mod h1:MvaB6xw5vOrDl8rYZGLFdKAuk/hRoRZd1Vi32+RXyFM= +github.com/libp2p/go-conn-security-multistream v0.1.0 h1:aqGmto+ttL/uJgX0JtQI0tD21CIEy5eYd1Hlp0juHY0= +github.com/libp2p/go-conn-security-multistream v0.1.0/go.mod h1:aw6eD7LOsHEX7+2hJkDxw1MteijaVcI+/eP2/x3J1xc= github.com/libp2p/go-flow-metrics v0.0.1 h1:0gxuFd2GuK7IIP5pKljLwps6TvcuYgvG7Atqi3INF5s= github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZxBdp967ls1g+k8= -github.com/libp2p/go-libp2p-blankhost v0.0.1 h1:/mZuuiwntNR8RywnCFlGHLKrKLYne+qciBpQXWqp5fk= -github.com/libp2p/go-libp2p-blankhost v0.0.1/go.mod h1:Ibpbw/7cPPYwFb7PACIWdvxxv0t0XCCI10t7czjAjTc= -github.com/libp2p/go-libp2p-crypto v0.0.1 h1:JNQd8CmoGTohO/akqrH16ewsqZpci2CbgYH/LmYl8gw= -github.com/libp2p/go-libp2p-crypto v0.0.1/go.mod h1:yJkNyDmO341d5wwXxDUGO0LykUVT72ImHNUqh5D/dBE= -github.com/libp2p/go-libp2p-host v0.0.1 h1:dnqusU+DheGcdxrE718kG4XgHNuL2n9eEv8Rg5zy8hQ= -github.com/libp2p/go-libp2p-host v0.0.1/go.mod h1:qWd+H1yuU0m5CwzAkvbSjqKairayEHdR5MMl7Cwa7Go= -github.com/libp2p/go-libp2p-interface-connmgr v0.0.1 h1:Q9EkNSLAOF+u90L88qmE9z/fTdjLh8OsJwGw74mkwk4= -github.com/libp2p/go-libp2p-interface-connmgr v0.0.1/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k= -github.com/libp2p/go-libp2p-interface-pnet v0.0.1 h1:7GnzRrBTJHEsofi1ahFdPN9Si6skwXQE9UqR2S+Pkh8= -github.com/libp2p/go-libp2p-interface-pnet v0.0.1/go.mod h1:el9jHpQAXK5dnTpKA4yfCNBZXvrzdOU75zz+C6ryp3k= -github.com/libp2p/go-libp2p-loggables v0.0.1 h1:HVww9oAnINIxbt69LJNkxD8lnbfgteXR97Xm4p3l9ps= -github.com/libp2p/go-libp2p-loggables v0.0.1/go.mod h1:lDipDlBNYbpyqyPX/KcoO+eq0sJYEVR2JgOexcivchg= -github.com/libp2p/go-libp2p-metrics v0.0.1 h1:yumdPC/P2VzINdmcKZd0pciSUCpou+s0lwYCjBbzQZU= -github.com/libp2p/go-libp2p-metrics v0.0.1/go.mod h1:jQJ95SXXA/K1VZi13h52WZMa9ja78zjyy5rspMsC/08= -github.com/libp2p/go-libp2p-net v0.0.1 h1:xJ4Vh4yKF/XKb8fd1Ev0ebAGzVjMxXzrxG2kjtU+F5Q= -github.com/libp2p/go-libp2p-net v0.0.1/go.mod h1:Yt3zgmlsHOgUWSXmt5V/Jpz9upuJBE8EgNU9DrCcR8c= -github.com/libp2p/go-libp2p-peer v0.0.1 h1:0qwAOljzYewINrU+Kndoc+1jAL7vzY/oY2Go4DCGfyY= -github.com/libp2p/go-libp2p-peer v0.0.1/go.mod h1:nXQvOBbwVqoP+T5Y5nCjeH4sP9IX/J0AMzcDUVruVoo= -github.com/libp2p/go-libp2p-peerstore v0.0.1 h1:twKovq8YK5trLrd3nB7PD2Zu9JcyAIdm7Bz9yBWjhq8= -github.com/libp2p/go-libp2p-peerstore v0.0.1/go.mod h1:RabLyPVJLuNQ+GFyoEkfi8H4Ti6k/HtZJ7YKgtSq+20= -github.com/libp2p/go-libp2p-protocol v0.0.1 h1:+zkEmZ2yFDi5adpVE3t9dqh/N9TbpFWywowzeEzBbLM= -github.com/libp2p/go-libp2p-protocol v0.0.1/go.mod h1:Af9n4PiruirSDjHycM1QuiMi/1VZNHYcK8cLgFJLZ4s= -github.com/libp2p/go-libp2p-secio v0.0.1 h1:CqE/RdsizOwItdgLe632iyft/w0tshDLmZGAiKDcUAI= -github.com/libp2p/go-libp2p-secio v0.0.1/go.mod h1:IdG6iQybdcYmbTzxp4J5dwtUEDTOvZrT0opIDVNPrJs= -github.com/libp2p/go-libp2p-swarm v0.0.1 h1:Vne+hjaDwXqzgNwQ2vb2YKbnbOTyXjtS47stT66Apc4= -github.com/libp2p/go-libp2p-swarm v0.0.1/go.mod h1:mh+KZxkbd3lQnveQ3j2q60BM1Cw2mX36XXQqwfPOShs= -github.com/libp2p/go-libp2p-transport v0.0.1/go.mod h1:UzbUs9X+PHOSw7S3ZmeOxfnwaQY5vGDzZmKPod3N3tk= -github.com/libp2p/go-libp2p-transport v0.0.4 h1:/CPHQMN75/IQwkhBxxIo6p6PtL3rwFZtlzBROT3e8mw= -github.com/libp2p/go-libp2p-transport v0.0.4/go.mod h1:StoY3sx6IqsP6XKoabsPnHCwqKXWUMWU7Rfcsubee/A= -github.com/libp2p/go-libp2p-transport-upgrader v0.0.1 h1:rNtXkY6dty46mxYOHHAZQchI7gQdJStF683FhVnei/k= -github.com/libp2p/go-libp2p-transport-upgrader v0.0.1/go.mod h1:NJpUAgQab/8K6K0m+JmZCe5RUXG10UMEx4kWe9Ipj5c= -github.com/libp2p/go-maddr-filter v0.0.1 h1:apvYTg0aIxxQyBX+XHKOR+0+lYhGs1Yv+JmTH9nyl5I= -github.com/libp2p/go-maddr-filter v0.0.1/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= -github.com/libp2p/go-mplex v0.0.1 h1:dn2XGSrUxLtz3/8u85bGrwhUEKPX8MOF3lpmcWBZCWc= -github.com/libp2p/go-mplex v0.0.1/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0= -github.com/libp2p/go-msgio v0.0.1 h1:znj97n5FtXGCLDwe9x8jpHmY770SW4WStBGcCDh6GJw= -github.com/libp2p/go-msgio v0.0.1/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= +github.com/libp2p/go-libp2p-blankhost v0.1.1 h1:X919sCh+KLqJcNRApj43xCSiQRYqOSI88Fdf55ngf78= +github.com/libp2p/go-libp2p-blankhost v0.1.1/go.mod h1:pf2fvdLJPsC1FsVrNP3DUUvMzUts2dsLLBEpo1vW1ro= +github.com/libp2p/go-libp2p-core v0.0.1 h1:HSTZtFIq/W5Ue43Zw+uWZyy2Vl5WtF0zDjKN8/DT/1I= +github.com/libp2p/go-libp2p-core v0.0.1/go.mod h1:g/VxnTZ/1ygHxH3dKok7Vno1VfpvGcGip57wjTU4fco= +github.com/libp2p/go-libp2p-crypto v0.1.0 h1:k9MFy+o2zGDNGsaoZl0MA3iZ75qXxr9OOoAZF+sD5OQ= +github.com/libp2p/go-libp2p-crypto v0.1.0/go.mod h1:sPUokVISZiy+nNuTTH/TY+leRSxnFj/2GLjtOTW90hI= +github.com/libp2p/go-libp2p-loggables v0.1.0 h1:h3w8QFfCt2UJl/0/NW4K829HX/0S4KD31PQ7m8UXXO8= +github.com/libp2p/go-libp2p-loggables v0.1.0/go.mod h1:EyumB2Y6PrYjr55Q3/tiJ/o3xoDasoRYM7nOzEpoa90= +github.com/libp2p/go-libp2p-mplex v0.2.0/go.mod h1:Ejl9IyjvXJ0T9iqUTE1jpYATQ9NM3g+OtR+EMMODbKo= +github.com/libp2p/go-libp2p-mplex v0.2.1 h1:E1xaJBQnbSiTHGI1gaBKmKhu1TUKkErKJnE8iGvirYI= +github.com/libp2p/go-libp2p-mplex v0.2.1/go.mod h1:SC99Rxs8Vuzrf/6WhmH41kNn13TiYdAWNYHrwImKLnE= +github.com/libp2p/go-libp2p-peer v0.2.0 h1:EQ8kMjaCUwt/Y5uLgjT8iY2qg0mGUT0N1zUjer50DsY= +github.com/libp2p/go-libp2p-peer v0.2.0/go.mod h1:RCffaCvUyW2CJmG2gAWVqwePwW7JMgxjsHm7+J5kjWY= +github.com/libp2p/go-libp2p-peerstore v0.1.0 h1:MKh7pRNPHSh1fLPj8u/M/s/napdmeNpoi9BRy9lPN0E= +github.com/libp2p/go-libp2p-peerstore v0.1.0/go.mod h1:2CeHkQsr8svp4fZ+Oi9ykN1HBb6u0MOvdJ7YIsmcwtY= +github.com/libp2p/go-libp2p-secio v0.1.0 h1:NNP5KLxuP97sE5Bu3iuwOWyT/dKEGMN5zSLMWdB7GTQ= +github.com/libp2p/go-libp2p-secio v0.1.0/go.mod h1:tMJo2w7h3+wN4pgU2LSYeiKPrfqBgkOsdiKK77hE7c8= +github.com/libp2p/go-libp2p-swarm v0.1.0 h1:HrFk2p0awrGEgch9JXK/qp/hfjqQfgNxpLWnCiWPg5s= +github.com/libp2p/go-libp2p-swarm v0.1.0/go.mod h1:wQVsCdjsuZoc730CgOvh5ox6K8evllckjebkdiY5ta4= +github.com/libp2p/go-libp2p-testing v0.0.2/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= +github.com/libp2p/go-libp2p-testing v0.0.3 h1:bdij4bKaaND7tCsaXVjRfYkMpvoOeKj9AVQGJllA6jM= +github.com/libp2p/go-libp2p-testing v0.0.3/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= +github.com/libp2p/go-libp2p-transport-upgrader v0.1.1 h1:PZMS9lhjK9VytzMCW3tWHAXtKXmlURSc3ZdvwEcKCzw= +github.com/libp2p/go-libp2p-transport-upgrader v0.1.1/go.mod h1:IEtA6or8JUbsV07qPW4r01GnTenLW4oi3lOPbUMGJJA= +github.com/libp2p/go-libp2p-yamux v0.2.0 h1:TSPZ5cMMz/wdoYsye/wU1TE4G3LDGMoeEN0xgnCKU/I= +github.com/libp2p/go-libp2p-yamux v0.2.0/go.mod h1:Db2gU+XfLpm6E4rG5uGCFX6uXA8MEXOxFcRoXUODaK8= +github.com/libp2p/go-maddr-filter v0.0.4 h1:hx8HIuuwk34KePddrp2mM5ivgPkZ09JH4AvsALRbFUs= +github.com/libp2p/go-maddr-filter v0.0.4/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= +github.com/libp2p/go-mplex v0.0.3/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0= +github.com/libp2p/go-mplex v0.1.0 h1:/nBTy5+1yRyY82YaO6HXQRnO5IAGsXTjEJaR3LdTPc0= +github.com/libp2p/go-mplex v0.1.0/go.mod h1:SXgmdki2kwCUlCCbfGLEgHjC4pFqhTp0ZoV6aiKgxDU= +github.com/libp2p/go-msgio v0.0.2 h1:ivPvEKHxmVkTClHzg6RXTYHqaJQ0V9cDbq+6lKb3UV0= +github.com/libp2p/go-msgio v0.0.2/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= github.com/libp2p/go-reuseport v0.0.1 h1:7PhkfH73VXfPJYKQ6JwS5I/eVcoyYi9IMNGc6FWpFLw= github.com/libp2p/go-reuseport v0.0.1/go.mod h1:jn6RmB1ufnQwl0Q1f+YxAj8isJgDCQzaaxIFYDhcYEA= -github.com/libp2p/go-reuseport-transport v0.0.1 h1:UIRneNxLDmEGNjGHpIiWzSWkZ5bhxMCP9x3Vh7BSc7E= -github.com/libp2p/go-reuseport-transport v0.0.1/go.mod h1:YkbSDrvjUVDL6b8XqriyA20obEtsW9BLkuOUyQAOCbs= -github.com/libp2p/go-stream-muxer v0.0.1 h1:Ce6e2Pyu+b5MC1k3eeFtAax0pW4gc6MosYSLV05UeLw= +github.com/libp2p/go-reuseport-transport v0.0.2 h1:WglMwyXyBu61CMkjCCtnmqNqnjib0GIEjMiHTwR/KN4= +github.com/libp2p/go-reuseport-transport v0.0.2/go.mod h1:YkbSDrvjUVDL6b8XqriyA20obEtsW9BLkuOUyQAOCbs= github.com/libp2p/go-stream-muxer v0.0.1/go.mod h1:bAo8x7YkSpadMTbtTaxGVHWUQsR/l5MEaHbKaliuT14= -github.com/libp2p/go-tcp-transport v0.0.1 h1:WyvJVw2lYAnr6CU+GZZ4oCt06fvORlmvBlFX2+ZpZDM= -github.com/libp2p/go-tcp-transport v0.0.1/go.mod h1:mnjg0o0O5TmXUaUIanYPUqkW4+u6mK0en8rlpA6BBTs= -github.com/libp2p/go-testutil v0.0.1 h1:Xg+O0G2HIMfHqBOBDcMS1iSZJ3GEcId4qOxCQvsGZHk= -github.com/libp2p/go-testutil v0.0.1/go.mod h1:iAcJc/DKJQanJ5ws2V+u5ywdL2n12X1WbbEG+Jjy69I= +github.com/libp2p/go-stream-muxer-multistream v0.2.0 h1:714bRJ4Zy9mdhyTLJ+ZKiROmAFwUHpeRidG+q7LTQOg= +github.com/libp2p/go-stream-muxer-multistream v0.2.0/go.mod h1:j9eyPol/LLRqT+GPLSxvimPhNph4sfYfMoDPd7HkzIc= +github.com/libp2p/go-tcp-transport v0.1.0 h1:IGhowvEqyMFknOar4FWCKSWE0zL36UFKQtiRQD60/8o= +github.com/libp2p/go-tcp-transport v0.1.0/go.mod h1:oJ8I5VXryj493DEJ7OsBieu8fcg2nHGctwtInJVpipc= +github.com/libp2p/go-yamux v1.2.2 h1:s6J6o7+ajoQMjHe7BEnq+EynOj5D2EoG8CuQgL3F2vg= +github.com/libp2p/go-yamux v1.2.2/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= github.com/mattn/go-colorable v0.1.1 h1:G1f5SKeVxmagw/IyvzvtZE4Gybcc4Tr1tf7I8z0XgOg= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= github.com/mattn/go-isatty v0.0.5 h1:tHXDdz1cpzGaovsTB+TVB8q90WEokoVmfMqoVcrLUgw= @@ -123,30 +121,52 @@ github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0 github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16 h1:5W7KhL8HVF3XCFOweFD3BNESdnO8ewyYTFT2R+/b8FQ= github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= -github.com/mr-tron/base58 v1.1.0 h1:Y51FGVJ91WBqCEabAi5OPUz38eAx8DakuAm5svLcsfQ= +github.com/minio/sha256-simd v0.0.0-20190328051042-05b4dd3047e5/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= +github.com/minio/sha256-simd v0.1.0 h1:U41/2erhAKcmSI14xh/ZTUdBPOzDOIfS93ibzUSl8KM= +github.com/minio/sha256-simd v0.1.0/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= +github.com/mr-tron/base58 v1.1.1 h1:OJIdWOWYe2l5PQNgimGtuwHY8nDskvJ5vvs//YnzRLs= +github.com/mr-tron/base58 v1.1.1/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= +github.com/mr-tron/base58 v1.1.2 h1:ZEw4I2EgPKDJ2iEw0cNmLB3ROrEmkOtXIkaG7wZg+78= +github.com/mr-tron/base58 v1.1.2/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= -github.com/multiformats/go-multiaddr v0.0.1 h1:/QUV3VBMDI6pi6xfiw7lr6xhDWWvQKn9udPn68kLSdY= github.com/multiformats/go-multiaddr v0.0.1/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= -github.com/multiformats/go-multiaddr-dns v0.0.1 h1:jQt9c6tDSdQLIlBo4tXYx7QUHCPjxsB1zXcag/2S7zc= +github.com/multiformats/go-multiaddr v0.0.2/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= +github.com/multiformats/go-multiaddr v0.0.4 h1:WgMSI84/eRLdbptXMkMWDXPjPq7SPLIgGUVm2eroyU4= +github.com/multiformats/go-multiaddr v0.0.4/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= github.com/multiformats/go-multiaddr-dns v0.0.1/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= +github.com/multiformats/go-multiaddr-dns v0.0.2 h1:/Bbsgsy3R6e3jf2qBahzNHzww6usYaZ0NhNH3sqdFS8= +github.com/multiformats/go-multiaddr-dns v0.0.2/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= +github.com/multiformats/go-multiaddr-fmt v0.0.1 h1:5YjeOIzbX8OTKVaN72aOzGIYW7PnrZrnkDyOfAWRSMA= +github.com/multiformats/go-multiaddr-fmt v0.0.1/go.mod h1:aBYjqL4T/7j4Qx+R73XSv/8JsgnRFlf0w2KGLCmXl3Q= github.com/multiformats/go-multiaddr-net v0.0.1 h1:76O59E3FavvHqNg7jvzWzsPSW5JSi/ek0E4eiDVbg9g= github.com/multiformats/go-multiaddr-net v0.0.1/go.mod h1:nw6HSxNmCIQH27XPGBuX+d1tnvM7ihcFwHMSstNAVUU= +github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs= github.com/multiformats/go-multihash v0.0.1 h1:HHwN1K12I+XllBCrqKnhX949Orn4oawPkegHMu2vDqQ= github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= -github.com/multiformats/go-multistream v0.0.1 h1:JV4VfSdY9n7ECTtY59/TlSyFCzRILvYx4T4Ws8ZgihU= -github.com/multiformats/go-multistream v0.0.1/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= +github.com/multiformats/go-multihash v0.0.5 h1:1wxmCvTXAifAepIMyF39vZinRw5sbqjPs/UIi93+uik= +github.com/multiformats/go-multihash v0.0.5/go.mod h1:lt/HCbqlQwlPBz7lv0sQCdtfcMtlJvakRUn/0Ual8po= +github.com/multiformats/go-multistream v0.1.0 h1:UpO6jrsjqs46mqAK3n6wKRYFhugss9ArzbyUzU+4wkQ= +github.com/multiformats/go-multistream v0.1.0/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= 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/ginkgo v1.8.0 h1:VkHVNpR4iVnU8XQR6DBm8BqYjN7CRzw+xKUbVVbbW9w= +github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.5.0 h1:izbySO9zDPmjJ8rDjLvkA2zJHIo+HkYXHnf7eN7SSyo= +github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/opentracing/opentracing-go v1.0.2 h1:3jA2P6O1F9UOrWVpwrIo17pu01KWvNWg4X946/Y5Zwg= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= 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/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a h1:/eS3yfGjQKG+9kayBkj0ip1BGhq6zJ3eaVksphxAaek= +github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a/go.mod h1:7AyxJNCJ7SBZ1MfVQCWD6Uqo2oubI2Eq2y2eqf+A5r0= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 h1:RC6RW7j+1+HkWaX/Yh71Ee5ZHaHYt7ZP4sQgUrm6cDU= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572/go.mod h1:w0SWMsp6j9O/dk4/ZpIhL+3CkG8ofA2vuv7k+ltqUMc= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= @@ -154,27 +174,23 @@ github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpP github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1/go.mod h1:8UvriyWtv5Q5EOgjHaSseUEdkQfvwFv1I/In/O2M9gc= github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc h1:9lDbC6Rz4bwmou+oE6Dt4Cb2BGMur5eR/GYptkKUVHo= github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc/go.mod h1:bopw91TMyo8J3tvftk8xmU2kPmlrt4nScJQZU2hE5EM= -github.com/whyrusleeping/go-smux-multiplex v3.0.16+incompatible h1:iqksILj8STw03EJQe7Laj4ubnw+ojOyik18cd5vPL1o= -github.com/whyrusleeping/go-smux-multiplex v3.0.16+incompatible/go.mod h1:34LEDbeKFZInPUrAG+bjuJmUXONGdEFW7XL0SpTY1y4= -github.com/whyrusleeping/go-smux-multistream v2.0.2+incompatible h1:BdYHctE9HJZLquG9tpTdwWcbG4FaX6tVKPGjCGgiVxo= -github.com/whyrusleeping/go-smux-multistream v2.0.2+incompatible/go.mod h1:dRWHHvc4HDQSHh9gbKEBbUZ+f2Q8iZTPG3UOGYODxSQ= -github.com/whyrusleeping/go-smux-yamux v2.0.8+incompatible h1:IGm/UP/JpEFS6D787sZnZg7RA6fZIR9c/Ms9DeAVNuk= -github.com/whyrusleeping/go-smux-yamux v2.0.8+incompatible/go.mod h1:6qHUzBXUbB9MXmw3AUdB52L8sEb/hScCqOdW2kj/wuI= github.com/whyrusleeping/mafmt v1.2.8 h1:TCghSl5kkwEE0j+sU/gudyhVMRlpBin8fMBBHg59EbA= github.com/whyrusleeping/mafmt v1.2.8/go.mod h1:faQJFPbLSxzD9xpA02ttW/tS9vZykNvXwGvqIpk20FA= github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7 h1:E9S12nwJwEOXe2d6gT6qxdvqMnNq+VnSsKPgm2ZZNds= github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7/go.mod h1:X2c0RVCI1eSUFI8eLcY3c0423ykwiUdxLJtkDvruhjI= -github.com/whyrusleeping/yamux v1.1.5 h1:4CK3aUUJQu0qpKZv5gEWJjNOQtdbdDhVVS6PJ+HimdE= -github.com/whyrusleeping/yamux v1.1.5/go.mod h1:E8LnQQ8HKx5KD29HZFUwM1PxCOdPRzGwur1mcYhXcD8= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b h1:+/WWzjwW6gidDJnMKWLKLX1gxn7irUTF1fLpQovfQ5M= golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25 h1:jsG6UpNLt9iAsb0S2AGW28DveNzzgmbXR+ENoPjUeIU= -golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f h1:R423Cnkcp5JABoeemiGEPlt9tHXFfw5kvc0yqlxRPWo= +golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190227160552-c95aed5357e7 h1:C2F/nMkR/9sfUTpvR3QrjBuTdvMUC/cFajkphs1YLQo= golang.org/x/net v0.0.0-20190227160552-c95aed5357e7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3 h1:0GoQqolDA55aaLxZyTzK/Y2ePZzZTUrRacwib7cNsYQ= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f h1:wMNYb4v58l5UBM7MYRLPG6ZhfOqbKu7X5eyFl8ZhKvA= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -182,8 +198,9 @@ golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20190219092855-153ac476189d/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223 h1:DH4skfRX4EBpamg7iV4ZlCpblAHI6s6TDM39bFZumv8= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190228124157-a34e9553db1e h1:ZytStCyV048ZqDsWHiYDdoI2Vd4msMcrDECFxS+tL9c= golang.org/x/sys v0.0.0-20190228124157-a34e9553db1e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d h1:+R4KGOnez64A81RvjARKc4UT5/tI9ujCIVX+P5KiHuI= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= diff --git a/vendor/github.com/libp2p/go-libp2p-autonat/notify.go b/vendor/github.com/libp2p/go-libp2p-autonat/notify.go index 69f5a645..4ea65616 100644 --- a/vendor/github.com/libp2p/go-libp2p-autonat/notify.go +++ b/vendor/github.com/libp2p/go-libp2p-autonat/notify.go @@ -3,20 +3,21 @@ package autonat import ( "time" - inet "github.com/libp2p/go-libp2p-net" + "github.com/libp2p/go-libp2p-core/network" + ma "github.com/multiformats/go-multiaddr" ) -var _ inet.Notifiee = (*AmbientAutoNAT)(nil) +var _ network.Notifiee = (*AmbientAutoNAT)(nil) var AutoNATIdentifyDelay = 5 * time.Second -func (as *AmbientAutoNAT) Listen(net inet.Network, a ma.Multiaddr) {} -func (as *AmbientAutoNAT) ListenClose(net inet.Network, a ma.Multiaddr) {} -func (as *AmbientAutoNAT) OpenedStream(net inet.Network, s inet.Stream) {} -func (as *AmbientAutoNAT) ClosedStream(net inet.Network, s inet.Stream) {} +func (as *AmbientAutoNAT) Listen(net network.Network, a ma.Multiaddr) {} +func (as *AmbientAutoNAT) ListenClose(net network.Network, a ma.Multiaddr) {} +func (as *AmbientAutoNAT) OpenedStream(net network.Network, s network.Stream) {} +func (as *AmbientAutoNAT) ClosedStream(net network.Network, s network.Stream) {} -func (as *AmbientAutoNAT) Connected(net inet.Network, c inet.Conn) { +func (as *AmbientAutoNAT) Connected(net network.Network, c network.Conn) { p := c.RemotePeer() go func() { @@ -38,4 +39,4 @@ func (as *AmbientAutoNAT) Connected(net inet.Network, c inet.Conn) { }() } -func (as *AmbientAutoNAT) Disconnected(net inet.Network, c inet.Conn) {} +func (as *AmbientAutoNAT) Disconnected(net network.Network, c network.Conn) {} diff --git a/vendor/github.com/libp2p/go-libp2p-autonat/package.json b/vendor/github.com/libp2p/go-libp2p-autonat/package.json deleted file mode 100644 index fa6b7def..00000000 --- a/vendor/github.com/libp2p/go-libp2p-autonat/package.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "author": "vyzo", - "bugs": {}, - "gx": { - "dvcsimport": "github.com/libp2p/go-libp2p-autonat" - }, - "gxDependencies": [ - { - "author": "whyrusleeping", - "hash": "QmYrWiWM4qtrnCeT3R14jY3ZZyirDNJgwK57q4qFYePgbd", - "name": "go-libp2p-host", - "version": "3.0.26" - }, - { - "author": "whyrusleeping", - "hash": "QmY3ArotKMKaL7YGfbQfyDrib6RVraLqZYWXZvVgZktBxp", - "name": "go-libp2p-net", - "version": "3.0.30" - }, - { - "author": "whyrusleeping", - "hash": "QmYVXrKrKHDC9FobgmcmshCDyWwdrfwfanNQN4oxJ9Fk3h", - "name": "go-libp2p-peer", - "version": "3.1.2" - }, - { - "author": "whyrusleeping", - "hash": "QmaCTz9RkrU13bm9kMB54f7atgqM4qkjDZpRwRoJiWXEqs", - "name": "go-libp2p-peerstore", - "version": "2.0.19" - }, - { - "hash": "QmbkT7eMTyXfpeyB3ZMxxcxg7XH8t6uXp49jqzz4HB7BGF", - "name": "go-log", - "version": "1.5.9" - }, - { - "author": "whyrusleeping", - "hash": "QmcBTHN7uAMBdkzRoQ3n9cE7tGu8Ubd9zmahjskjTRw4Uf", - "name": "go-libp2p-blankhost", - "version": "0.3.26" - }, - { - "author": "whyrusleeping", - "hash": "QmQVoMEL1CxrVusTSUdYsiJXVBnvSqNUpBsGybkwSfksEF", - "name": "go-libp2p-swarm", - "version": "3.0.35" - }, - { - "author": "whyrusleeping", - "hash": "QmddjPSGZb3ieihSseFeCfVRpZzcqczPNsD2DvarSwnjJB", - "name": "gogo-protobuf", - "version": "1.2.1" - }, - { - "author": "multiformats", - "hash": "QmTZBfrPJmjWsCvHEtX5FE6KimVJhsJg5sBbqEFYf4UZtL", - "name": "go-multiaddr", - "version": "1.4.1" - } - ], - "gxVersion": "0.12.1", - "language": "go", - "license": "", - "name": "go-libp2p-autonat", - "releaseCmd": "git commit -a -m \"gx publish $VERSION\"", - "version": "1.0.14" -} diff --git a/vendor/github.com/libp2p/go-libp2p-autonat/proto.go b/vendor/github.com/libp2p/go-libp2p-autonat/proto.go index 2dbb8eba..61ef986d 100644 --- a/vendor/github.com/libp2p/go-libp2p-autonat/proto.go +++ b/vendor/github.com/libp2p/go-libp2p-autonat/proto.go @@ -3,15 +3,16 @@ package autonat import ( pb "github.com/libp2p/go-libp2p-autonat/pb" + "github.com/libp2p/go-libp2p-core/peer" + logging "github.com/ipfs/go-log" - pstore "github.com/libp2p/go-libp2p-peerstore" ) const AutoNATProto = "/libp2p/autonat/1.0.0" var log = logging.Logger("autonat") -func newDialMessage(pi pstore.PeerInfo) *pb.Message { +func newDialMessage(pi peer.AddrInfo) *pb.Message { msg := new(pb.Message) msg.Type = pb.Message_DIAL.Enum() msg.Dial = new(pb.Message_Dial) diff --git a/vendor/github.com/libp2p/go-libp2p-circuit/conn.go b/vendor/github.com/libp2p/go-libp2p-circuit/conn.go index df39f119..8fa53b3d 100644 --- a/vendor/github.com/libp2p/go-libp2p-circuit/conn.go +++ b/vendor/github.com/libp2p/go-libp2p-circuit/conn.go @@ -3,16 +3,20 @@ package relay import ( "fmt" "net" + "time" + + "github.com/libp2p/go-libp2p-core/host" + "github.com/libp2p/go-libp2p-core/network" + "github.com/libp2p/go-libp2p-core/peer" - inet "github.com/libp2p/go-libp2p-net" - pstore "github.com/libp2p/go-libp2p-peerstore" ma "github.com/multiformats/go-multiaddr" manet "github.com/multiformats/go-multiaddr-net" ) type Conn struct { - inet.Stream - remote pstore.PeerInfo + stream network.Stream + remote peer.AddrInfo + host host.Host } type NetAddr struct { @@ -28,17 +32,56 @@ func (n *NetAddr) String() string { return fmt.Sprintf("relay[%s-%s]", n.Remote, n.Relay) } +func (c *Conn) Close() error { + c.untagHop() + return c.stream.Reset() +} + +func (c *Conn) Read(buf []byte) (int, error) { + return c.stream.Read(buf) +} + +func (c *Conn) Write(buf []byte) (int, error) { + return c.stream.Write(buf) +} + +func (c *Conn) SetDeadline(t time.Time) error { + return c.stream.SetDeadline(t) +} + +func (c *Conn) SetReadDeadline(t time.Time) error { + return c.stream.SetReadDeadline(t) +} + +func (c *Conn) SetWriteDeadline(t time.Time) error { + return c.stream.SetWriteDeadline(t) +} + func (c *Conn) RemoteAddr() net.Addr { return &NetAddr{ - Relay: c.Conn().RemotePeer().Pretty(), + Relay: c.stream.Conn().RemotePeer().Pretty(), Remote: c.remote.ID.Pretty(), } } +// Increment the underlying relay connection tag by 1, thus increasing its protection from +// connection pruning. This ensures that connections to relays are not accidentally closed, +// by the connection manager, taking with them all the relayed connections (that may themselves +// be protected). +func (c *Conn) tagHop() { + c.host.ConnManager().UpsertTag(c.stream.Conn().RemotePeer(), "relay-hop-stream", incrementTag) +} + +// Decrement the underlying relay connection tag by 1; this is performed when we close the +// relayed connection. +func (c *Conn) untagHop() { + c.host.ConnManager().UpsertTag(c.stream.Conn().RemotePeer(), "relay-hop-stream", decrementTag) +} + // TODO: is it okay to cast c.Conn().RemotePeer() into a multiaddr? might be "user input" func (c *Conn) RemoteMultiaddr() ma.Multiaddr { proto := ma.ProtocolWithCode(ma.P_P2P).Name - peerid := c.Conn().RemotePeer().Pretty() + peerid := c.stream.Conn().RemotePeer().Pretty() p2paddr := ma.StringCast(fmt.Sprintf("/%s/%s", proto, peerid)) circaddr := ma.Cast(ma.CodeToVarint(P_CIRCUIT)) @@ -46,11 +89,11 @@ func (c *Conn) RemoteMultiaddr() ma.Multiaddr { } func (c *Conn) LocalMultiaddr() ma.Multiaddr { - return c.Conn().LocalMultiaddr() + return c.stream.Conn().LocalMultiaddr() } func (c *Conn) LocalAddr() net.Addr { - na, err := manet.ToNetAddr(c.Conn().LocalMultiaddr()) + na, err := manet.ToNetAddr(c.stream.Conn().LocalMultiaddr()) if err != nil { log.Error("failed to convert local multiaddr to net addr:", err) return nil diff --git a/vendor/github.com/libp2p/go-libp2p-circuit/dial.go b/vendor/github.com/libp2p/go-libp2p-circuit/dial.go index ecfd23fe..6668f397 100644 --- a/vendor/github.com/libp2p/go-libp2p-circuit/dial.go +++ b/vendor/github.com/libp2p/go-libp2p-circuit/dial.go @@ -5,17 +5,17 @@ import ( "fmt" "math/rand" - peer "github.com/libp2p/go-libp2p-peer" - pstore "github.com/libp2p/go-libp2p-peerstore" - tpt "github.com/libp2p/go-libp2p-transport" + "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p-core/transport" ma "github.com/multiformats/go-multiaddr" ) -func (d *RelayTransport) Dial(ctx context.Context, a ma.Multiaddr, p peer.ID) (tpt.Conn, error) { +func (d *RelayTransport) Dial(ctx context.Context, a ma.Multiaddr, p peer.ID) (transport.CapableConn, error) { c, err := d.Relay().Dial(ctx, a, p) if err != nil { return nil, err } + c.tagHop() return d.upgrader.UpgradeOutbound(ctx, d, c, p) } @@ -36,7 +36,7 @@ func (r *Relay) Dial(ctx context.Context, a ma.Multiaddr, p peer.ID) (*Conn, err } } - dinfo := &pstore.PeerInfo{ID: p, Addrs: []ma.Multiaddr{}} + dinfo := &peer.AddrInfo{ID: p, Addrs: []ma.Multiaddr{}} if len(destaddr.Bytes()) > 0 { dinfo.Addrs = append(dinfo.Addrs, destaddr) } @@ -46,8 +46,8 @@ func (r *Relay) Dial(ctx context.Context, a ma.Multiaddr, p peer.ID) (*Conn, err return r.tryDialRelays(ctx, *dinfo) } - var rinfo *pstore.PeerInfo - rinfo, err := pstore.InfoFromP2pAddr(relayaddr) + var rinfo *peer.AddrInfo + rinfo, err := peer.AddrInfoFromP2pAddr(relayaddr) if err != nil { return nil, fmt.Errorf("error parsing multiaddr '%s': %s", relayaddr.String(), err) } @@ -55,7 +55,7 @@ func (r *Relay) Dial(ctx context.Context, a ma.Multiaddr, p peer.ID) (*Conn, err return r.DialPeer(ctx, *rinfo, *dinfo) } -func (r *Relay) tryDialRelays(ctx context.Context, dinfo pstore.PeerInfo) (*Conn, error) { +func (r *Relay) tryDialRelays(ctx context.Context, dinfo peer.AddrInfo) (*Conn, error) { var relays []peer.ID r.mx.Lock() for p := range r.relays { @@ -75,7 +75,7 @@ func (r *Relay) tryDialRelays(ctx context.Context, dinfo pstore.PeerInfo) (*Conn } rctx, cancel := context.WithTimeout(ctx, HopConnectTimeout) - c, err := r.DialPeer(rctx, pstore.PeerInfo{ID: relay}, dinfo) + c, err := r.DialPeer(rctx, peer.AddrInfo{ID: relay}, dinfo) cancel() if err == nil { diff --git a/vendor/github.com/libp2p/go-libp2p-circuit/go.mod b/vendor/github.com/libp2p/go-libp2p-circuit/go.mod index bf6d5b72..c9fb8216 100644 --- a/vendor/github.com/libp2p/go-libp2p-circuit/go.mod +++ b/vendor/github.com/libp2p/go-libp2p-circuit/go.mod @@ -3,15 +3,11 @@ module github.com/libp2p/go-libp2p-circuit require ( github.com/gogo/protobuf v1.2.1 github.com/ipfs/go-log v0.0.1 - github.com/libp2p/go-buffer-pool v0.0.1 - github.com/libp2p/go-libp2p-blankhost v0.0.1 - github.com/libp2p/go-libp2p-host v0.0.1 - github.com/libp2p/go-libp2p-net v0.0.2 - github.com/libp2p/go-libp2p-peer v0.0.1 - github.com/libp2p/go-libp2p-peerstore v0.0.1 - github.com/libp2p/go-libp2p-swarm v0.0.2 - github.com/libp2p/go-libp2p-transport v0.0.4 - github.com/libp2p/go-libp2p-transport-upgrader v0.0.1 - github.com/multiformats/go-multiaddr v0.0.1 + github.com/libp2p/go-buffer-pool v0.0.2 + github.com/libp2p/go-libp2p-blankhost v0.1.1 + github.com/libp2p/go-libp2p-core v0.0.1 + github.com/libp2p/go-libp2p-swarm v0.1.0 + github.com/libp2p/go-libp2p-transport-upgrader v0.1.1 + github.com/multiformats/go-multiaddr v0.0.4 github.com/multiformats/go-multiaddr-net v0.0.1 ) diff --git a/vendor/github.com/libp2p/go-libp2p-circuit/go.sum b/vendor/github.com/libp2p/go-libp2p-circuit/go.sum index d491a45b..fd879b2b 100644 --- a/vendor/github.com/libp2p/go-libp2p-circuit/go.sum +++ b/vendor/github.com/libp2p/go-libp2p-circuit/go.sum @@ -10,8 +10,8 @@ github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVa github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= -github.com/coreos/go-semver v0.2.0 h1:3Jm3tLmsgAYcjC+4Up7hJrFBPr+n7rAqYeSw/SZazuY= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -29,27 +29,24 @@ github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/gxed/hashland/keccakpg v0.0.1 h1:wrk3uMNaMxbXiHibbPO4S0ymqJMm41WiudyFSs7UnsU= github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfmKFJ6tItnhQ67kU= -github.com/gxed/hashland/murmur3 v0.0.1 h1:SheiaIt0sda5K+8FLz952/1iWS9zrnKsEJaOJu4ZbSc= github.com/gxed/hashland/murmur3 v0.0.1/go.mod h1:KjXop02n4/ckmZSnY2+HKcLud/tcmvhST0bie/0lS48= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= github.com/hashicorp/golang-lru v0.5.1/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/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= github.com/ipfs/go-datastore v0.0.1/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= -github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk= -github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps= github.com/ipfs/go-ds-badger v0.0.2/go.mod h1:Y3QpeSFWQf6MopLTiZD+VT6IC1yZqaGmjvRcKeSGij8= github.com/ipfs/go-ds-leveldb v0.0.1/go.mod h1:feO8V3kubwsEF22n0YRQCffeb79OOYIykR4L04tMOYc= github.com/ipfs/go-ipfs-delay v0.0.0-20181109222059-70721b86a9a8/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= github.com/ipfs/go-log v0.0.1 h1:9XTUN/rW64BCG1YhPK9Hoy3q8nr4gOmHHBpgFdfw6Lc= github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM= +github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA= github.com/jbenet/go-temp-err-catcher v0.0.0-20150120210811-aac704a3f4f2 h1:vhC1OXXiT9R2pczegwz6moDvuRpggaroAXhPIseh57A= github.com/jbenet/go-temp-err-catcher v0.0.0-20150120210811-aac704a3f4f2/go.mod h1:8GXXJV31xl8whumTzdZsTt3RnUIiPqzkyf7mxToRCMs= -github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8 h1:bspPhN+oKYFk5fcGNuQzp6IGzYQSenLEgH3s6jkXrWw= github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8/go.mod h1:Ly/wlsjFq/qrU3Rar62tu1gASgGw6chQbSh/XgIIXCY= +github.com/jbenet/goprocess v0.1.3 h1:YKyIEECS/XvcfHtBzxtjBBbWK+MbvA6dG8ASiqwvr10= +github.com/jbenet/goprocess v0.1.3/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= @@ -62,95 +59,108 @@ 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/libp2p/go-addr-util v0.0.1 h1:TpTQm9cXVRVSKsYbgQ7GKc3KbbHVTnbostgGaDEP+88= github.com/libp2p/go-addr-util v0.0.1/go.mod h1:4ac6O7n9rIAKB1dnd+s8IbbMXkt+oBpzX4/+RACcnlQ= -github.com/libp2p/go-buffer-pool v0.0.1 h1:9Rrn/H46cXjaA2HQ5Y8lyhOS1NhTkZ4yuEs2r3Eechg= github.com/libp2p/go-buffer-pool v0.0.1/go.mod h1:xtyIz9PMobb13WaxR6Zo1Pd1zXJKYg0a8KiIvDp3TzQ= -github.com/libp2p/go-conn-security v0.0.1 h1:4kMMrqrt9EUNCNjX1xagSJC+bq16uqjMe9lk1KBMVNs= -github.com/libp2p/go-conn-security v0.0.1/go.mod h1:bGmu51N0KU9IEjX7kl2PQjgZa40JQWnayTvNMgD/vyk= -github.com/libp2p/go-conn-security-multistream v0.0.1 h1:XefjAQRHcnUaxKb26RGupToucx3uU4ecbOZ3aACXlDU= -github.com/libp2p/go-conn-security-multistream v0.0.1/go.mod h1:nc9vud7inQ+d6SO0I/6dSWrdMnHnzZNHeyUQqrAJulE= +github.com/libp2p/go-buffer-pool v0.0.2 h1:QNK2iAFa8gjAe1SPz6mHSMuCcjs+X1wlHzeOSqcmlfs= +github.com/libp2p/go-buffer-pool v0.0.2/go.mod h1:MvaB6xw5vOrDl8rYZGLFdKAuk/hRoRZd1Vi32+RXyFM= +github.com/libp2p/go-conn-security-multistream v0.1.0 h1:aqGmto+ttL/uJgX0JtQI0tD21CIEy5eYd1Hlp0juHY0= +github.com/libp2p/go-conn-security-multistream v0.1.0/go.mod h1:aw6eD7LOsHEX7+2hJkDxw1MteijaVcI+/eP2/x3J1xc= github.com/libp2p/go-flow-metrics v0.0.1 h1:0gxuFd2GuK7IIP5pKljLwps6TvcuYgvG7Atqi3INF5s= github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZxBdp967ls1g+k8= -github.com/libp2p/go-libp2p-blankhost v0.0.1 h1:/mZuuiwntNR8RywnCFlGHLKrKLYne+qciBpQXWqp5fk= -github.com/libp2p/go-libp2p-blankhost v0.0.1/go.mod h1:Ibpbw/7cPPYwFb7PACIWdvxxv0t0XCCI10t7czjAjTc= -github.com/libp2p/go-libp2p-crypto v0.0.1 h1:JNQd8CmoGTohO/akqrH16ewsqZpci2CbgYH/LmYl8gw= -github.com/libp2p/go-libp2p-crypto v0.0.1/go.mod h1:yJkNyDmO341d5wwXxDUGO0LykUVT72ImHNUqh5D/dBE= -github.com/libp2p/go-libp2p-host v0.0.1 h1:dnqusU+DheGcdxrE718kG4XgHNuL2n9eEv8Rg5zy8hQ= -github.com/libp2p/go-libp2p-host v0.0.1/go.mod h1:qWd+H1yuU0m5CwzAkvbSjqKairayEHdR5MMl7Cwa7Go= -github.com/libp2p/go-libp2p-interface-connmgr v0.0.1 h1:Q9EkNSLAOF+u90L88qmE9z/fTdjLh8OsJwGw74mkwk4= -github.com/libp2p/go-libp2p-interface-connmgr v0.0.1/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k= -github.com/libp2p/go-libp2p-interface-pnet v0.0.1 h1:7GnzRrBTJHEsofi1ahFdPN9Si6skwXQE9UqR2S+Pkh8= -github.com/libp2p/go-libp2p-interface-pnet v0.0.1/go.mod h1:el9jHpQAXK5dnTpKA4yfCNBZXvrzdOU75zz+C6ryp3k= -github.com/libp2p/go-libp2p-loggables v0.0.1 h1:HVww9oAnINIxbt69LJNkxD8lnbfgteXR97Xm4p3l9ps= -github.com/libp2p/go-libp2p-loggables v0.0.1/go.mod h1:lDipDlBNYbpyqyPX/KcoO+eq0sJYEVR2JgOexcivchg= -github.com/libp2p/go-libp2p-metrics v0.0.1 h1:yumdPC/P2VzINdmcKZd0pciSUCpou+s0lwYCjBbzQZU= -github.com/libp2p/go-libp2p-metrics v0.0.1/go.mod h1:jQJ95SXXA/K1VZi13h52WZMa9ja78zjyy5rspMsC/08= -github.com/libp2p/go-libp2p-net v0.0.1 h1:xJ4Vh4yKF/XKb8fd1Ev0ebAGzVjMxXzrxG2kjtU+F5Q= -github.com/libp2p/go-libp2p-net v0.0.1/go.mod h1:Yt3zgmlsHOgUWSXmt5V/Jpz9upuJBE8EgNU9DrCcR8c= -github.com/libp2p/go-libp2p-net v0.0.2 h1:qP06u4TYXfl7uW/hzqPhlVVTSA2nw1B/bHBJaUnbh6M= -github.com/libp2p/go-libp2p-net v0.0.2/go.mod h1:Yt3zgmlsHOgUWSXmt5V/Jpz9upuJBE8EgNU9DrCcR8c= -github.com/libp2p/go-libp2p-peer v0.0.1 h1:0qwAOljzYewINrU+Kndoc+1jAL7vzY/oY2Go4DCGfyY= -github.com/libp2p/go-libp2p-peer v0.0.1/go.mod h1:nXQvOBbwVqoP+T5Y5nCjeH4sP9IX/J0AMzcDUVruVoo= -github.com/libp2p/go-libp2p-peerstore v0.0.1 h1:twKovq8YK5trLrd3nB7PD2Zu9JcyAIdm7Bz9yBWjhq8= -github.com/libp2p/go-libp2p-peerstore v0.0.1/go.mod h1:RabLyPVJLuNQ+GFyoEkfi8H4Ti6k/HtZJ7YKgtSq+20= -github.com/libp2p/go-libp2p-protocol v0.0.1 h1:+zkEmZ2yFDi5adpVE3t9dqh/N9TbpFWywowzeEzBbLM= -github.com/libp2p/go-libp2p-protocol v0.0.1/go.mod h1:Af9n4PiruirSDjHycM1QuiMi/1VZNHYcK8cLgFJLZ4s= -github.com/libp2p/go-libp2p-secio v0.0.1 h1:CqE/RdsizOwItdgLe632iyft/w0tshDLmZGAiKDcUAI= -github.com/libp2p/go-libp2p-secio v0.0.1/go.mod h1:IdG6iQybdcYmbTzxp4J5dwtUEDTOvZrT0opIDVNPrJs= -github.com/libp2p/go-libp2p-swarm v0.0.2 h1:cpHHXTeU2IgUu8LPemF7vaLPGtVC6VxMoll2EwqlC+E= -github.com/libp2p/go-libp2p-swarm v0.0.2/go.mod h1:n0cAAcKyndIrJWctQwjqXlAdIPBZzfdpBjx1SSvz30g= -github.com/libp2p/go-libp2p-transport v0.0.1/go.mod h1:UzbUs9X+PHOSw7S3ZmeOxfnwaQY5vGDzZmKPod3N3tk= -github.com/libp2p/go-libp2p-transport v0.0.4 h1:/CPHQMN75/IQwkhBxxIo6p6PtL3rwFZtlzBROT3e8mw= -github.com/libp2p/go-libp2p-transport v0.0.4/go.mod h1:StoY3sx6IqsP6XKoabsPnHCwqKXWUMWU7Rfcsubee/A= -github.com/libp2p/go-libp2p-transport-upgrader v0.0.1 h1:rNtXkY6dty46mxYOHHAZQchI7gQdJStF683FhVnei/k= -github.com/libp2p/go-libp2p-transport-upgrader v0.0.1/go.mod h1:NJpUAgQab/8K6K0m+JmZCe5RUXG10UMEx4kWe9Ipj5c= -github.com/libp2p/go-maddr-filter v0.0.1 h1:apvYTg0aIxxQyBX+XHKOR+0+lYhGs1Yv+JmTH9nyl5I= -github.com/libp2p/go-maddr-filter v0.0.1/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= -github.com/libp2p/go-mplex v0.0.1 h1:dn2XGSrUxLtz3/8u85bGrwhUEKPX8MOF3lpmcWBZCWc= -github.com/libp2p/go-mplex v0.0.1/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0= -github.com/libp2p/go-msgio v0.0.1 h1:znj97n5FtXGCLDwe9x8jpHmY770SW4WStBGcCDh6GJw= -github.com/libp2p/go-msgio v0.0.1/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= +github.com/libp2p/go-libp2p-blankhost v0.1.1 h1:X919sCh+KLqJcNRApj43xCSiQRYqOSI88Fdf55ngf78= +github.com/libp2p/go-libp2p-blankhost v0.1.1/go.mod h1:pf2fvdLJPsC1FsVrNP3DUUvMzUts2dsLLBEpo1vW1ro= +github.com/libp2p/go-libp2p-core v0.0.1 h1:HSTZtFIq/W5Ue43Zw+uWZyy2Vl5WtF0zDjKN8/DT/1I= +github.com/libp2p/go-libp2p-core v0.0.1/go.mod h1:g/VxnTZ/1ygHxH3dKok7Vno1VfpvGcGip57wjTU4fco= +github.com/libp2p/go-libp2p-crypto v0.1.0 h1:k9MFy+o2zGDNGsaoZl0MA3iZ75qXxr9OOoAZF+sD5OQ= +github.com/libp2p/go-libp2p-crypto v0.1.0/go.mod h1:sPUokVISZiy+nNuTTH/TY+leRSxnFj/2GLjtOTW90hI= +github.com/libp2p/go-libp2p-loggables v0.1.0 h1:h3w8QFfCt2UJl/0/NW4K829HX/0S4KD31PQ7m8UXXO8= +github.com/libp2p/go-libp2p-loggables v0.1.0/go.mod h1:EyumB2Y6PrYjr55Q3/tiJ/o3xoDasoRYM7nOzEpoa90= +github.com/libp2p/go-libp2p-mplex v0.2.0/go.mod h1:Ejl9IyjvXJ0T9iqUTE1jpYATQ9NM3g+OtR+EMMODbKo= +github.com/libp2p/go-libp2p-mplex v0.2.1 h1:E1xaJBQnbSiTHGI1gaBKmKhu1TUKkErKJnE8iGvirYI= +github.com/libp2p/go-libp2p-mplex v0.2.1/go.mod h1:SC99Rxs8Vuzrf/6WhmH41kNn13TiYdAWNYHrwImKLnE= +github.com/libp2p/go-libp2p-peer v0.2.0 h1:EQ8kMjaCUwt/Y5uLgjT8iY2qg0mGUT0N1zUjer50DsY= +github.com/libp2p/go-libp2p-peer v0.2.0/go.mod h1:RCffaCvUyW2CJmG2gAWVqwePwW7JMgxjsHm7+J5kjWY= +github.com/libp2p/go-libp2p-peerstore v0.1.0 h1:MKh7pRNPHSh1fLPj8u/M/s/napdmeNpoi9BRy9lPN0E= +github.com/libp2p/go-libp2p-peerstore v0.1.0/go.mod h1:2CeHkQsr8svp4fZ+Oi9ykN1HBb6u0MOvdJ7YIsmcwtY= +github.com/libp2p/go-libp2p-secio v0.1.0 h1:NNP5KLxuP97sE5Bu3iuwOWyT/dKEGMN5zSLMWdB7GTQ= +github.com/libp2p/go-libp2p-secio v0.1.0/go.mod h1:tMJo2w7h3+wN4pgU2LSYeiKPrfqBgkOsdiKK77hE7c8= +github.com/libp2p/go-libp2p-swarm v0.1.0 h1:HrFk2p0awrGEgch9JXK/qp/hfjqQfgNxpLWnCiWPg5s= +github.com/libp2p/go-libp2p-swarm v0.1.0/go.mod h1:wQVsCdjsuZoc730CgOvh5ox6K8evllckjebkdiY5ta4= +github.com/libp2p/go-libp2p-testing v0.0.2/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= +github.com/libp2p/go-libp2p-testing v0.0.3 h1:bdij4bKaaND7tCsaXVjRfYkMpvoOeKj9AVQGJllA6jM= +github.com/libp2p/go-libp2p-testing v0.0.3/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= +github.com/libp2p/go-libp2p-transport-upgrader v0.1.1 h1:PZMS9lhjK9VytzMCW3tWHAXtKXmlURSc3ZdvwEcKCzw= +github.com/libp2p/go-libp2p-transport-upgrader v0.1.1/go.mod h1:IEtA6or8JUbsV07qPW4r01GnTenLW4oi3lOPbUMGJJA= +github.com/libp2p/go-libp2p-yamux v0.2.0 h1:TSPZ5cMMz/wdoYsye/wU1TE4G3LDGMoeEN0xgnCKU/I= +github.com/libp2p/go-libp2p-yamux v0.2.0/go.mod h1:Db2gU+XfLpm6E4rG5uGCFX6uXA8MEXOxFcRoXUODaK8= +github.com/libp2p/go-maddr-filter v0.0.4 h1:hx8HIuuwk34KePddrp2mM5ivgPkZ09JH4AvsALRbFUs= +github.com/libp2p/go-maddr-filter v0.0.4/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= +github.com/libp2p/go-mplex v0.0.3/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0= +github.com/libp2p/go-mplex v0.1.0 h1:/nBTy5+1yRyY82YaO6HXQRnO5IAGsXTjEJaR3LdTPc0= +github.com/libp2p/go-mplex v0.1.0/go.mod h1:SXgmdki2kwCUlCCbfGLEgHjC4pFqhTp0ZoV6aiKgxDU= +github.com/libp2p/go-msgio v0.0.2 h1:ivPvEKHxmVkTClHzg6RXTYHqaJQ0V9cDbq+6lKb3UV0= +github.com/libp2p/go-msgio v0.0.2/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= github.com/libp2p/go-reuseport v0.0.1 h1:7PhkfH73VXfPJYKQ6JwS5I/eVcoyYi9IMNGc6FWpFLw= github.com/libp2p/go-reuseport v0.0.1/go.mod h1:jn6RmB1ufnQwl0Q1f+YxAj8isJgDCQzaaxIFYDhcYEA= -github.com/libp2p/go-reuseport-transport v0.0.1 h1:UIRneNxLDmEGNjGHpIiWzSWkZ5bhxMCP9x3Vh7BSc7E= -github.com/libp2p/go-reuseport-transport v0.0.1/go.mod h1:YkbSDrvjUVDL6b8XqriyA20obEtsW9BLkuOUyQAOCbs= -github.com/libp2p/go-stream-muxer v0.0.1 h1:Ce6e2Pyu+b5MC1k3eeFtAax0pW4gc6MosYSLV05UeLw= +github.com/libp2p/go-reuseport-transport v0.0.2 h1:WglMwyXyBu61CMkjCCtnmqNqnjib0GIEjMiHTwR/KN4= +github.com/libp2p/go-reuseport-transport v0.0.2/go.mod h1:YkbSDrvjUVDL6b8XqriyA20obEtsW9BLkuOUyQAOCbs= github.com/libp2p/go-stream-muxer v0.0.1/go.mod h1:bAo8x7YkSpadMTbtTaxGVHWUQsR/l5MEaHbKaliuT14= -github.com/libp2p/go-tcp-transport v0.0.1 h1:WyvJVw2lYAnr6CU+GZZ4oCt06fvORlmvBlFX2+ZpZDM= -github.com/libp2p/go-tcp-transport v0.0.1/go.mod h1:mnjg0o0O5TmXUaUIanYPUqkW4+u6mK0en8rlpA6BBTs= -github.com/libp2p/go-testutil v0.0.1 h1:Xg+O0G2HIMfHqBOBDcMS1iSZJ3GEcId4qOxCQvsGZHk= -github.com/libp2p/go-testutil v0.0.1/go.mod h1:iAcJc/DKJQanJ5ws2V+u5ywdL2n12X1WbbEG+Jjy69I= +github.com/libp2p/go-stream-muxer-multistream v0.2.0 h1:714bRJ4Zy9mdhyTLJ+ZKiROmAFwUHpeRidG+q7LTQOg= +github.com/libp2p/go-stream-muxer-multistream v0.2.0/go.mod h1:j9eyPol/LLRqT+GPLSxvimPhNph4sfYfMoDPd7HkzIc= +github.com/libp2p/go-tcp-transport v0.1.0 h1:IGhowvEqyMFknOar4FWCKSWE0zL36UFKQtiRQD60/8o= +github.com/libp2p/go-tcp-transport v0.1.0/go.mod h1:oJ8I5VXryj493DEJ7OsBieu8fcg2nHGctwtInJVpipc= +github.com/libp2p/go-yamux v1.2.2 h1:s6J6o7+ajoQMjHe7BEnq+EynOj5D2EoG8CuQgL3F2vg= +github.com/libp2p/go-yamux v1.2.2/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= github.com/mattn/go-colorable v0.1.1 h1:G1f5SKeVxmagw/IyvzvtZE4Gybcc4Tr1tf7I8z0XgOg= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= github.com/mattn/go-isatty v0.0.5 h1:tHXDdz1cpzGaovsTB+TVB8q90WEokoVmfMqoVcrLUgw= github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0OXOcUbGjvZxxijuBwbbmlSxLiuofa+g= github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= -github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16 h1:5W7KhL8HVF3XCFOweFD3BNESdnO8ewyYTFT2R+/b8FQ= github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= -github.com/mr-tron/base58 v1.1.0 h1:Y51FGVJ91WBqCEabAi5OPUz38eAx8DakuAm5svLcsfQ= +github.com/minio/sha256-simd v0.0.0-20190328051042-05b4dd3047e5/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= +github.com/minio/sha256-simd v0.1.0 h1:U41/2erhAKcmSI14xh/ZTUdBPOzDOIfS93ibzUSl8KM= +github.com/minio/sha256-simd v0.1.0/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= +github.com/mr-tron/base58 v1.1.1/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= +github.com/mr-tron/base58 v1.1.2 h1:ZEw4I2EgPKDJ2iEw0cNmLB3ROrEmkOtXIkaG7wZg+78= +github.com/mr-tron/base58 v1.1.2/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= -github.com/multiformats/go-multiaddr v0.0.1 h1:/QUV3VBMDI6pi6xfiw7lr6xhDWWvQKn9udPn68kLSdY= github.com/multiformats/go-multiaddr v0.0.1/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= -github.com/multiformats/go-multiaddr-dns v0.0.1 h1:jQt9c6tDSdQLIlBo4tXYx7QUHCPjxsB1zXcag/2S7zc= +github.com/multiformats/go-multiaddr v0.0.2/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= +github.com/multiformats/go-multiaddr v0.0.4 h1:WgMSI84/eRLdbptXMkMWDXPjPq7SPLIgGUVm2eroyU4= +github.com/multiformats/go-multiaddr v0.0.4/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= github.com/multiformats/go-multiaddr-dns v0.0.1/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= +github.com/multiformats/go-multiaddr-dns v0.0.2 h1:/Bbsgsy3R6e3jf2qBahzNHzww6usYaZ0NhNH3sqdFS8= +github.com/multiformats/go-multiaddr-dns v0.0.2/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= +github.com/multiformats/go-multiaddr-fmt v0.0.1 h1:5YjeOIzbX8OTKVaN72aOzGIYW7PnrZrnkDyOfAWRSMA= +github.com/multiformats/go-multiaddr-fmt v0.0.1/go.mod h1:aBYjqL4T/7j4Qx+R73XSv/8JsgnRFlf0w2KGLCmXl3Q= github.com/multiformats/go-multiaddr-net v0.0.1 h1:76O59E3FavvHqNg7jvzWzsPSW5JSi/ek0E4eiDVbg9g= github.com/multiformats/go-multiaddr-net v0.0.1/go.mod h1:nw6HSxNmCIQH27XPGBuX+d1tnvM7ihcFwHMSstNAVUU= -github.com/multiformats/go-multihash v0.0.1 h1:HHwN1K12I+XllBCrqKnhX949Orn4oawPkegHMu2vDqQ= +github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs= github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= -github.com/multiformats/go-multistream v0.0.1 h1:JV4VfSdY9n7ECTtY59/TlSyFCzRILvYx4T4Ws8ZgihU= -github.com/multiformats/go-multistream v0.0.1/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= +github.com/multiformats/go-multihash v0.0.5 h1:1wxmCvTXAifAepIMyF39vZinRw5sbqjPs/UIi93+uik= +github.com/multiformats/go-multihash v0.0.5/go.mod h1:lt/HCbqlQwlPBz7lv0sQCdtfcMtlJvakRUn/0Ual8po= +github.com/multiformats/go-multistream v0.1.0 h1:UpO6jrsjqs46mqAK3n6wKRYFhugss9ArzbyUzU+4wkQ= +github.com/multiformats/go-multistream v0.1.0/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= 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/ginkgo v1.8.0 h1:VkHVNpR4iVnU8XQR6DBm8BqYjN7CRzw+xKUbVVbbW9w= +github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.5.0 h1:izbySO9zDPmjJ8rDjLvkA2zJHIo+HkYXHnf7eN7SSyo= +github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/opentracing/opentracing-go v1.0.2 h1:3jA2P6O1F9UOrWVpwrIo17pu01KWvNWg4X946/Y5Zwg= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= 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/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a h1:/eS3yfGjQKG+9kayBkj0ip1BGhq6zJ3eaVksphxAaek= +github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a/go.mod h1:7AyxJNCJ7SBZ1MfVQCWD6Uqo2oubI2Eq2y2eqf+A5r0= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 h1:RC6RW7j+1+HkWaX/Yh71Ee5ZHaHYt7ZP4sQgUrm6cDU= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572/go.mod h1:w0SWMsp6j9O/dk4/ZpIhL+3CkG8ofA2vuv7k+ltqUMc= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= @@ -158,36 +168,30 @@ github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpP github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1/go.mod h1:8UvriyWtv5Q5EOgjHaSseUEdkQfvwFv1I/In/O2M9gc= github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc h1:9lDbC6Rz4bwmou+oE6Dt4Cb2BGMur5eR/GYptkKUVHo= github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc/go.mod h1:bopw91TMyo8J3tvftk8xmU2kPmlrt4nScJQZU2hE5EM= -github.com/whyrusleeping/go-smux-multiplex v3.0.16+incompatible h1:iqksILj8STw03EJQe7Laj4ubnw+ojOyik18cd5vPL1o= -github.com/whyrusleeping/go-smux-multiplex v3.0.16+incompatible/go.mod h1:34LEDbeKFZInPUrAG+bjuJmUXONGdEFW7XL0SpTY1y4= -github.com/whyrusleeping/go-smux-multistream v2.0.2+incompatible h1:BdYHctE9HJZLquG9tpTdwWcbG4FaX6tVKPGjCGgiVxo= -github.com/whyrusleeping/go-smux-multistream v2.0.2+incompatible/go.mod h1:dRWHHvc4HDQSHh9gbKEBbUZ+f2Q8iZTPG3UOGYODxSQ= -github.com/whyrusleeping/go-smux-yamux v2.0.8+incompatible h1:IGm/UP/JpEFS6D787sZnZg7RA6fZIR9c/Ms9DeAVNuk= -github.com/whyrusleeping/go-smux-yamux v2.0.8+incompatible/go.mod h1:6qHUzBXUbB9MXmw3AUdB52L8sEb/hScCqOdW2kj/wuI= github.com/whyrusleeping/mafmt v1.2.8 h1:TCghSl5kkwEE0j+sU/gudyhVMRlpBin8fMBBHg59EbA= github.com/whyrusleeping/mafmt v1.2.8/go.mod h1:faQJFPbLSxzD9xpA02ttW/tS9vZykNvXwGvqIpk20FA= github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7 h1:E9S12nwJwEOXe2d6gT6qxdvqMnNq+VnSsKPgm2ZZNds= github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7/go.mod h1:X2c0RVCI1eSUFI8eLcY3c0423ykwiUdxLJtkDvruhjI= -github.com/whyrusleeping/yamux v1.1.5 h1:4CK3aUUJQu0qpKZv5gEWJjNOQtdbdDhVVS6PJ+HimdE= -github.com/whyrusleeping/yamux v1.1.5/go.mod h1:E8LnQQ8HKx5KD29HZFUwM1PxCOdPRzGwur1mcYhXcD8= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b h1:+/WWzjwW6gidDJnMKWLKLX1gxn7irUTF1fLpQovfQ5M= golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25 h1:jsG6UpNLt9iAsb0S2AGW28DveNzzgmbXR+ENoPjUeIU= -golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f h1:R423Cnkcp5JABoeemiGEPlt9tHXFfw5kvc0yqlxRPWo= +golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190227160552-c95aed5357e7 h1:C2F/nMkR/9sfUTpvR3QrjBuTdvMUC/cFajkphs1YLQo= golang.org/x/net v0.0.0-20190227160552-c95aed5357e7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3 h1:0GoQqolDA55aaLxZyTzK/Y2ePZzZTUrRacwib7cNsYQ= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f h1:wMNYb4v58l5UBM7MYRLPG6ZhfOqbKu7X5eyFl8ZhKvA= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/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-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190219092855-153ac476189d/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223 h1:DH4skfRX4EBpamg7iV4ZlCpblAHI6s6TDM39bFZumv8= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190228124157-a34e9553db1e h1:ZytStCyV048ZqDsWHiYDdoI2Vd4msMcrDECFxS+tL9c= golang.org/x/sys v0.0.0-20190228124157-a34e9553db1e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d h1:+R4KGOnez64A81RvjARKc4UT5/tI9ujCIVX+P5KiHuI= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= diff --git a/vendor/github.com/libp2p/go-libp2p-circuit/listen.go b/vendor/github.com/libp2p/go-libp2p-circuit/listen.go index 35661cb8..b00015b5 100644 --- a/vendor/github.com/libp2p/go-libp2p-circuit/listen.go +++ b/vendor/github.com/libp2p/go-libp2p-circuit/listen.go @@ -25,16 +25,17 @@ func (r *Relay) Listener() *RelayListener { func (l *RelayListener) Accept() (manet.Conn, error) { select { case c := <-l.incoming: - err := l.Relay().writeResponse(c.Stream, pb.CircuitRelay_SUCCESS) + err := l.Relay().writeResponse(c.stream, pb.CircuitRelay_SUCCESS) if err != nil { log.Debugf("error writing relay response: %s", err.Error()) - c.Stream.Reset() + c.stream.Reset() return nil, err } // TODO: Pretty print. log.Infof("accepted relay connection: %q", c) + c.tagHop() return c, nil case <-l.ctx.Done(): return nil, l.ctx.Err() diff --git a/vendor/github.com/libp2p/go-libp2p-circuit/notify.go b/vendor/github.com/libp2p/go-libp2p-circuit/notify.go index 6d9f62dc..813daed4 100644 --- a/vendor/github.com/libp2p/go-libp2p-circuit/notify.go +++ b/vendor/github.com/libp2p/go-libp2p-circuit/notify.go @@ -4,8 +4,8 @@ import ( "context" "time" - inet "github.com/libp2p/go-libp2p-net" - peer "github.com/libp2p/go-libp2p-peer" + inet "github.com/libp2p/go-libp2p-core/network" + peer "github.com/libp2p/go-libp2p-core/peer" ma "github.com/multiformats/go-multiaddr" ) diff --git a/vendor/github.com/libp2p/go-libp2p-circuit/relay.go b/vendor/github.com/libp2p/go-libp2p-circuit/relay.go index b15841b2..1bb7cc0d 100644 --- a/vendor/github.com/libp2p/go-libp2p-circuit/relay.go +++ b/vendor/github.com/libp2p/go-libp2p-circuit/relay.go @@ -5,17 +5,21 @@ import ( "fmt" "io" "sync" + "sync/atomic" "time" pb "github.com/libp2p/go-libp2p-circuit/pb" - logging "github.com/ipfs/go-log" + "github.com/libp2p/go-libp2p-core/helpers" + "github.com/libp2p/go-libp2p-core/host" + "github.com/libp2p/go-libp2p-core/network" + "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p-core/peerstore" + pool "github.com/libp2p/go-buffer-pool" - host "github.com/libp2p/go-libp2p-host" - inet "github.com/libp2p/go-libp2p-net" - peer "github.com/libp2p/go-libp2p-peer" - pstore "github.com/libp2p/go-libp2p-peerstore" tptu "github.com/libp2p/go-libp2p-transport-upgrader" + + logging "github.com/ipfs/go-log" ma "github.com/multiformats/go-multiaddr" ) @@ -25,8 +29,14 @@ const ProtoID = "/libp2p/circuit/relay/0.1.0" const maxMessageSize = 4096 -var RelayAcceptTimeout = time.Minute -var HopConnectTimeout = 10 * time.Second +var ( + RelayAcceptTimeout = 10 * time.Second + HopConnectTimeout = 30 * time.Second + StopHandshakeTimeout = 1 * time.Minute + + HopStreamBufferSize = 4096 + HopStreamLimit = 1 << 19 // 512K hops for 1M goroutines +) // Relay is the relay transport and service. type Relay struct { @@ -44,9 +54,9 @@ type Relay struct { relays map[peer.ID]struct{} mx sync.Mutex - liveHops map[peer.ID]map[peer.ID]int - lhCount uint64 - lhLk sync.Mutex + // atomic counters + streamCount int32 + liveHopCount int32 } // RelayOpts are options for configuring the relay transport. @@ -85,7 +95,6 @@ func NewRelay(ctx context.Context, h host.Host, upgrader *tptu.Upgrader, opts .. self: h.ID(), incoming: make(chan *Conn), relays: make(map[peer.ID]struct{}), - liveHops: make(map[peer.ID]map[peer.ID]int), } for _, opt := range opts { @@ -110,57 +119,34 @@ func NewRelay(ctx context.Context, h host.Host, upgrader *tptu.Upgrader, opts .. return r, nil } +// Increment the live hop count and increment the connection manager tags by 1 for the two +// sides of the hop stream. This ensures that connections with many hop streams will be protected +// from pruning, thus minimizing disruption from connection trimming in a relay node. func (r *Relay) addLiveHop(from, to peer.ID) { - r.lhLk.Lock() - defer r.lhLk.Unlock() - - trg, ok := r.liveHops[from] - if !ok { - trg = make(map[peer.ID]int) - r.liveHops[from] = trg - } - trg[to]++ - r.lhCount++ + atomic.AddInt32(&r.liveHopCount, 1) + r.host.ConnManager().UpsertTag(from, "relay-hop-stream", incrementTag) + r.host.ConnManager().UpsertTag(to, "relay-hop-stream", incrementTag) } +// Decrement the live hpo count and decrement the connection manager tags for the two sides +// of the hop stream. func (r *Relay) rmLiveHop(from, to peer.ID) { - r.lhLk.Lock() - defer r.lhLk.Unlock() + atomic.AddInt32(&r.liveHopCount, -1) + r.host.ConnManager().UpsertTag(from, "relay-hop-stream", decrementTag) + r.host.ConnManager().UpsertTag(to, "relay-hop-stream", decrementTag) - trg, ok := r.liveHops[from] - if !ok { - return - } - var count int - if count, ok = trg[to]; !ok { - return - } - count-- - - r.lhCount-- - if count <= 0 { - delete(trg, to) - if len(trg) == 0 { - delete(r.liveHops, from) - } - } else { - trg[to] = count - } } -func (r *Relay) GetActiveHops() uint64 { - r.lhLk.Lock() - defer r.lhLk.Unlock() - - return r.lhCount +func (r *Relay) GetActiveHops() int32 { + return atomic.LoadInt32(&r.liveHopCount) } -func (r *Relay) DialPeer(ctx context.Context, relay pstore.PeerInfo, dest pstore.PeerInfo) (*Conn, error) { +func (r *Relay) DialPeer(ctx context.Context, relay peer.AddrInfo, dest peer.AddrInfo) (*Conn, error) { log.Debugf("dialing peer %s through relay %s", dest.ID, relay.ID) if len(relay.Addrs) > 0 { - r.host.Peerstore().AddAddrs(relay.ID, relay.Addrs, pstore.TempAddrTTL) + r.host.Peerstore().AddAddrs(relay.ID, relay.Addrs, peerstore.TempAddrTTL) } s, err := r.host.NewStream(ctx, relay.ID, ProtoID) @@ -202,7 +188,7 @@ func (r *Relay) DialPeer(ctx context.Context, relay pstore.PeerInfo, dest pstore return nil, RelayError{msg.GetCode()} } - return &Conn{Stream: s, remote: dest}, nil + return &Conn{stream: s, remote: dest, host: r.host}, nil } func (r *Relay) Matches(addr ma.Multiaddr) bool { @@ -236,7 +222,7 @@ func (r *Relay) CanHop(ctx context.Context, id peer.ID) (bool, error) { s.Reset() return false, err } - if err := inet.FullClose(s); err != nil { + if err := helpers.FullClose(s); err != nil { return false, err } @@ -247,7 +233,7 @@ func (r *Relay) CanHop(ctx context.Context, id peer.ID) (bool, error) { return msg.GetCode() == pb.CircuitRelay_SUCCESS, nil } -func (r *Relay) handleNewStream(s inet.Stream) { +func (r *Relay) handleNewStream(s network.Stream) { log.Infof("new relay stream from: %s", s.Conn().RemotePeer()) rd := newDelimitedReader(s, maxMessageSize) @@ -274,12 +260,22 @@ func (r *Relay) handleNewStream(s inet.Stream) { } } -func (r *Relay) handleHopStream(s inet.Stream, msg *pb.CircuitRelay) { +func (r *Relay) handleHopStream(s network.Stream, msg *pb.CircuitRelay) { if !r.hop { r.handleError(s, pb.CircuitRelay_HOP_CANT_SPEAK_RELAY) return } + streamCount := atomic.AddInt32(&r.streamCount, 1) + liveHopCount := atomic.LoadInt32(&r.liveHopCount) + defer atomic.AddInt32(&r.streamCount, -1) + + if (streamCount + liveHopCount) > int32(HopStreamLimit) { + log.Warning("hop stream limit exceeded; resetting stream") + s.Reset() + return + } + src, err := peerToPeerInfo(msg.GetSrcPeer()) if err != nil { r.handleError(s, pb.CircuitRelay_HOP_SRC_MULTIADDR_INVALID) @@ -307,15 +303,15 @@ func (r *Relay) handleHopStream(s inet.Stream, msg *pb.CircuitRelay) { defer cancel() if !r.active { - ctx = inet.WithNoDial(ctx, "relay hop") + ctx = network.WithNoDial(ctx, "relay hop") } else if len(dst.Addrs) > 0 { - r.host.Peerstore().AddAddrs(dst.ID, dst.Addrs, pstore.TempAddrTTL) + r.host.Peerstore().AddAddrs(dst.ID, dst.Addrs, peerstore.TempAddrTTL) } bs, err := r.host.NewStream(ctx, dst.ID, ProtoID) if err != nil { log.Debugf("error opening relay stream to %s: %s", dst.ID.Pretty(), err.Error()) - if err == inet.ErrNoConn { + if err == network.ErrNoConn { r.handleError(s, pb.CircuitRelay_HOP_NO_CONN_TO_DST) } else { r.handleError(s, pb.CircuitRelay_HOP_CANT_DIAL_DST) @@ -328,6 +324,9 @@ func (r *Relay) handleHopStream(s inet.Stream, msg *pb.CircuitRelay) { wr := newDelimitedWriter(bs) defer rd.Close() + // set handshake deadline + bs.SetDeadline(time.Now().Add(StopHandshakeTimeout)) + msg.Type = pb.CircuitRelay_STOP.Enum() err = wr.WriteMsg(msg) @@ -373,14 +372,25 @@ func (r *Relay) handleHopStream(s inet.Stream, msg *pb.CircuitRelay) { // relay connection log.Infof("relaying connection between %s and %s", src.ID.Pretty(), dst.ID.Pretty()) + // reset deadline + bs.SetDeadline(time.Time{}) + r.addLiveHop(src.ID, dst.ID) + goroutines := new(int32) + *goroutines = 2 + done := func() { + if atomic.AddInt32(goroutines, -1) == 0 { + r.rmLiveHop(src.ID, dst.ID) + } + } + // Don't reset streams after finishing or the other side will get an // error, not an EOF. go func() { - defer r.rmLiveHop(src.ID, dst.ID) + defer done() - buf := pool.Get(4096) + buf := pool.Get(HopStreamBufferSize) defer pool.Put(buf) count, err := io.CopyBuffer(s, bs, buf) @@ -397,7 +407,9 @@ func (r *Relay) handleHopStream(s inet.Stream, msg *pb.CircuitRelay) { }() go func() { - buf := pool.Get(4096) + defer done() + + buf := pool.Get(HopStreamBufferSize) defer pool.Put(buf) count, err := io.CopyBuffer(bs, s, buf) @@ -414,7 +426,7 @@ func (r *Relay) handleHopStream(s inet.Stream, msg *pb.CircuitRelay) { }() } -func (r *Relay) handleStopStream(s inet.Stream, msg *pb.CircuitRelay) { +func (r *Relay) handleStopStream(s network.Stream, msg *pb.CircuitRelay) { src, err := peerToPeerInfo(msg.GetSrcPeer()) if err != nil { r.handleError(s, pb.CircuitRelay_STOP_SRC_MULTIADDR_INVALID) @@ -430,17 +442,17 @@ func (r *Relay) handleStopStream(s inet.Stream, msg *pb.CircuitRelay) { log.Infof("relay connection from: %s", src.ID) if len(src.Addrs) > 0 { - r.host.Peerstore().AddAddrs(src.ID, src.Addrs, pstore.TempAddrTTL) + r.host.Peerstore().AddAddrs(src.ID, src.Addrs, peerstore.TempAddrTTL) } select { - case r.incoming <- &Conn{Stream: s, remote: src}: + case r.incoming <- &Conn{stream: s, remote: src, host: r.host}: case <-time.After(RelayAcceptTimeout): r.handleError(s, pb.CircuitRelay_STOP_RELAY_REFUSED) } } -func (r *Relay) handleCanHop(s inet.Stream, msg *pb.CircuitRelay) { +func (r *Relay) handleCanHop(s network.Stream, msg *pb.CircuitRelay) { var err error if r.hop { @@ -453,22 +465,22 @@ func (r *Relay) handleCanHop(s inet.Stream, msg *pb.CircuitRelay) { s.Reset() log.Debugf("error writing relay response: %s", err.Error()) } else { - inet.FullClose(s) + helpers.FullClose(s) } } -func (r *Relay) handleError(s inet.Stream, code pb.CircuitRelay_Status) { +func (r *Relay) handleError(s network.Stream, code pb.CircuitRelay_Status) { log.Warningf("relay error: %s (%d)", pb.CircuitRelay_Status_name[int32(code)], code) err := r.writeResponse(s, code) if err != nil { s.Reset() log.Debugf("error writing relay response: %s", err.Error()) } else { - inet.FullClose(s) + helpers.FullClose(s) } } -func (r *Relay) writeResponse(s inet.Stream, code pb.CircuitRelay_Status) error { +func (r *Relay) writeResponse(s network.Stream, code pb.CircuitRelay_Status) error { wr := newDelimitedWriter(s) var msg pb.CircuitRelay diff --git a/vendor/github.com/libp2p/go-libp2p-circuit/transport.go b/vendor/github.com/libp2p/go-libp2p-circuit/transport.go index 86821d32..57a65779 100644 --- a/vendor/github.com/libp2p/go-libp2p-circuit/transport.go +++ b/vendor/github.com/libp2p/go-libp2p-circuit/transport.go @@ -4,8 +4,9 @@ import ( "context" "fmt" - host "github.com/libp2p/go-libp2p-host" - tpt "github.com/libp2p/go-libp2p-transport" + "github.com/libp2p/go-libp2p-core/host" + "github.com/libp2p/go-libp2p-core/transport" + tptu "github.com/libp2p/go-libp2p-transport-upgrader" ma "github.com/multiformats/go-multiaddr" ) @@ -23,7 +24,7 @@ func init() { ma.AddProtocol(Protocol) } -var _ tpt.Transport = (*RelayTransport)(nil) +var _ transport.Transport = (*RelayTransport)(nil) type RelayTransport Relay @@ -35,7 +36,7 @@ func (r *Relay) Transport() *RelayTransport { return (*RelayTransport)(r) } -func (t *RelayTransport) Listen(laddr ma.Multiaddr) (tpt.Listener, error) { +func (t *RelayTransport) Listen(laddr ma.Multiaddr) (transport.Listener, error) { // TODO: Ensure we have a connection to the relay, if specified. Also, // make sure the multiaddr makes sense. if !t.Relay().Matches(laddr) { @@ -58,7 +59,7 @@ func (t *RelayTransport) Protocols() []int { // AddRelayTransport constructs a relay and adds it as a transport to the host network. func AddRelayTransport(ctx context.Context, h host.Host, upgrader *tptu.Upgrader, opts ...RelayOpt) error { - n, ok := h.Network().(tpt.Network) + n, ok := h.Network().(transport.TransportNetwork) if !ok { return fmt.Errorf("%v is not a transport network", h.Network()) } diff --git a/vendor/github.com/libp2p/go-libp2p-circuit/util.go b/vendor/github.com/libp2p/go-libp2p-circuit/util.go index 7d56b895..ca7a23f3 100644 --- a/vendor/github.com/libp2p/go-libp2p-circuit/util.go +++ b/vendor/github.com/libp2p/go-libp2p-circuit/util.go @@ -7,22 +7,22 @@ import ( pb "github.com/libp2p/go-libp2p-circuit/pb" + "github.com/libp2p/go-libp2p-core/peer" + ggio "github.com/gogo/protobuf/io" proto "github.com/gogo/protobuf/proto" pool "github.com/libp2p/go-buffer-pool" - peer "github.com/libp2p/go-libp2p-peer" - pstore "github.com/libp2p/go-libp2p-peerstore" ma "github.com/multiformats/go-multiaddr" ) -func peerToPeerInfo(p *pb.CircuitRelay_Peer) (pstore.PeerInfo, error) { +func peerToPeerInfo(p *pb.CircuitRelay_Peer) (peer.AddrInfo, error) { if p == nil { - return pstore.PeerInfo{}, errors.New("nil peer") + return peer.AddrInfo{}, errors.New("nil peer") } id, err := peer.IDFromBytes(p.Id) if err != nil { - return pstore.PeerInfo{}, err + return peer.AddrInfo{}, err } addrs := make([]ma.Multiaddr, 0, len(p.Addrs)) @@ -33,10 +33,10 @@ func peerToPeerInfo(p *pb.CircuitRelay_Peer) (pstore.PeerInfo, error) { } } - return pstore.PeerInfo{ID: id, Addrs: addrs}, nil + return peer.AddrInfo{ID: id, Addrs: addrs}, nil } -func peerInfoToPeer(pi pstore.PeerInfo) *pb.CircuitRelay_Peer { +func peerInfoToPeer(pi peer.AddrInfo) *pb.CircuitRelay_Peer { addrs := make([][]byte, len(pi.Addrs)) for i, addr := range pi.Addrs { addrs[i] = addr.Bytes() @@ -49,6 +49,18 @@ func peerInfoToPeer(pi pstore.PeerInfo) *pb.CircuitRelay_Peer { return p } +func incrementTag(v int) int { + return v + 1 +} + +func decrementTag(v int) int { + if v > 0 { + return v - 1 + } else { + return v + } +} + type delimitedReader struct { r io.Reader buf []byte diff --git a/vendor/github.com/libp2p/go-libp2p-connmgr/.travis.yml b/vendor/github.com/libp2p/go-libp2p-connmgr/.travis.yml index 4cfe98c2..5163d693 100644 --- a/vendor/github.com/libp2p/go-libp2p-connmgr/.travis.yml +++ b/vendor/github.com/libp2p/go-libp2p-connmgr/.travis.yml @@ -10,7 +10,6 @@ env: global: - GOTFLAGS="-race" matrix: - - BUILD_DEPTYPE=gx - BUILD_DEPTYPE=gomod @@ -24,7 +23,6 @@ script: cache: directories: - - $GOPATH/src/gx - $GOPATH/pkg/mod - $HOME/.cache/go-build diff --git a/vendor/github.com/libp2p/go-libp2p-connmgr/Makefile b/vendor/github.com/libp2p/go-libp2p-connmgr/Makefile deleted file mode 100644 index 5c996090..00000000 --- a/vendor/github.com/libp2p/go-libp2p-connmgr/Makefile +++ /dev/null @@ -1,13 +0,0 @@ -all: deps - -gx: - go get github.com/whyrusleeping/gx - go get github.com/whyrusleeping/gx-go - -deps: gx - gx --verbose install --global - gx-go rewrite - -publish: - gx-go rewrite --undo - diff --git a/vendor/github.com/libp2p/go-libp2p-connmgr/README.md b/vendor/github.com/libp2p/go-libp2p-connmgr/README.md index e0e727dc..3373fb26 100644 --- a/vendor/github.com/libp2p/go-libp2p-connmgr/README.md +++ b/vendor/github.com/libp2p/go-libp2p-connmgr/README.md @@ -2,32 +2,25 @@ go-libp2p-connmgr ================== [![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](http://ipn.io) -[![](https://img.shields.io/badge/project-IPFS-blue.svg?style=flat-square)](http://libp2p.io/) -[![](https://img.shields.io/badge/freenode-%23ipfs-blue.svg?style=flat-square)](http://webchat.freenode.net/?channels=%23ipfs) -[![Coverage Status](https://coveralls.io/repos/github/libp2p/go-libp2p-connmgr/badge.svg?branch=master)](https://coveralls.io/github/libp2p/go-libp2p-connmgr?branch=master) -[![Travis CI](https://travis-ci.org/libp2p/go-libp2p-connmgr.svg?branch=master)](https://travis-ci.org/libp2p/go-libp2p-connmgr) +[![](https://img.shields.io/badge/project-libp2p-yellow.svg?style=flat-square)](https://libp2p.io/) +[![](https://img.shields.io/badge/freenode-%23libp2p-yellow.svg?style=flat-square)](http://webchat.freenode.net/?channels=%23libp2p) +[![Travis CI](https://travis-ci.com/libp2p/go-libp2p-connmgr.svg?branch=master)](https://travis-ci.com/libp2p/go-libp2p-connmgr) +[![Discourse posts](https://img.shields.io/discourse/https/discuss.libp2p.io/posts.svg)](https://discuss.libp2p.io) -> A package to help manage connections in go-libp2p + +> A package to help manage connections in go-libp2p. ## Table of Contents - [Install](#install) -- [Usage](#usage) -- [API](#api) - [Contribute](#contribute) - [License](#license) ## Install ```sh -make install -``` - -## Examples - -```go -// TODO: +go get github.com/libp2p/go-libp2p-connmgr ``` ## Contribute @@ -39,3 +32,7 @@ Small note: If editing the Readme, please conform to the [standard-readme](https ## License MIT © Whyrusleeping + +--- + +The last gx published version of this module was: 0.3.34: QmSTKY2v62v9RjcfTMCFKMVAWvVjWGixkYWEi68iG7e1TT diff --git a/vendor/github.com/libp2p/go-libp2p-connmgr/connmgr.go b/vendor/github.com/libp2p/go-libp2p-connmgr/connmgr.go index 2629dffd..0ee89017 100644 --- a/vendor/github.com/libp2p/go-libp2p-connmgr/connmgr.go +++ b/vendor/github.com/libp2p/go-libp2p-connmgr/connmgr.go @@ -4,12 +4,14 @@ import ( "context" "sort" "sync" + "sync/atomic" "time" + "github.com/libp2p/go-libp2p-core/connmgr" + "github.com/libp2p/go-libp2p-core/network" + "github.com/libp2p/go-libp2p-core/peer" + logging "github.com/ipfs/go-log" - ifconnmgr "github.com/libp2p/go-libp2p-interface-connmgr" - inet "github.com/libp2p/go-libp2p-net" - peer "github.com/libp2p/go-libp2p-peer" ma "github.com/multiformats/go-multiaddr" ) @@ -25,12 +27,11 @@ var log = logging.Logger("connmgr") // // See configuration parameters in NewConnManager. type BasicConnMgr struct { - lk sync.Mutex highWater int lowWater int - connCount int + connCount int32 gracePeriod time.Duration - peers map[peer.ID]*peerInfo + segments segments plk sync.RWMutex protected map[peer.ID]map[string]struct{} @@ -39,9 +40,49 @@ type BasicConnMgr struct { trimRunningCh chan struct{} lastTrim time.Time silencePeriod time.Duration + + ctx context.Context + cancel func() +} + +var _ connmgr.ConnManager = (*BasicConnMgr)(nil) + +type segment struct { + sync.Mutex + peers map[peer.ID]*peerInfo +} + +type segments [256]*segment + +func (ss *segments) get(p peer.ID) *segment { + return ss[byte(p[len(p)-1])] +} + +func (ss *segments) countPeers() (count int) { + for _, seg := range ss { + seg.Lock() + count += len(seg.peers) + seg.Unlock() + } + return count } -var _ ifconnmgr.ConnManager = (*BasicConnMgr)(nil) +func (s *segment) tagInfoFor(p peer.ID) *peerInfo { + pi, ok := s.peers[p] + if ok { + return pi + } + // create a temporary peer to buffer early tags before the Connected notification arrives. + pi = &peerInfo{ + id: p, + firstSeen: time.Now(), // this timestamp will be updated when the first Connected notification arrives. + temp: true, + tags: make(map[string]int), + conns: make(map[network.Conn]time.Time), + } + s.peers[p] = pi + return pi +} // NewConnManager creates a new BasicConnMgr with the provided params: // * lo and hi are watermarks governing the number of connections that'll be maintained. @@ -50,15 +91,33 @@ var _ ifconnmgr.ConnManager = (*BasicConnMgr)(nil) // * grace is the amount of time a newly opened connection is given before it becomes // subject to pruning. func NewConnManager(low, hi int, grace time.Duration) *BasicConnMgr { - return &BasicConnMgr{ + ctx, cancel := context.WithCancel(context.Background()) + cm := &BasicConnMgr{ highWater: hi, lowWater: low, gracePeriod: grace, - peers: make(map[peer.ID]*peerInfo), trimRunningCh: make(chan struct{}, 1), protected: make(map[peer.ID]map[string]struct{}, 16), silencePeriod: SilencePeriod, + ctx: ctx, + cancel: cancel, + segments: func() (ret segments) { + for i := range ret { + ret[i] = &segment{ + peers: make(map[peer.ID]*peerInfo), + } + } + return ret + }(), } + + go cm.background() + return cm +} + +func (cm *BasicConnMgr) Close() error { + cm.cancel() + return nil } func (cm *BasicConnMgr) Protect(id peer.ID, tag string) { @@ -93,8 +152,9 @@ type peerInfo struct { id peer.ID tags map[string]int // value for each tag value int // cached sum of all tag values + temp bool // this is a temporary entry holding early tags, and awaiting connections - conns map[inet.Conn]time.Time // start time of each connection + conns map[network.Conn]time.Time // start time of each connection firstSeen time.Time // timestamp when we began tracking this peer. } @@ -117,68 +177,104 @@ func (cm *BasicConnMgr) TrimOpenConns(ctx context.Context) { // skip this attempt to trim as the last one just took place. return } + defer log.EventBegin(ctx, "connCleanup").Done() for _, c := range cm.getConnsToClose(ctx) { log.Info("closing conn: ", c.RemotePeer()) log.Event(ctx, "closeConn", c.RemotePeer()) c.Close() } + cm.lastTrim = time.Now() } +func (cm *BasicConnMgr) background() { + ticker := time.NewTicker(time.Minute) + defer ticker.Stop() + + for { + select { + case <-ticker.C: + if atomic.LoadInt32(&cm.connCount) > int32(cm.highWater) { + cm.TrimOpenConns(cm.ctx) + } + + case <-cm.ctx.Done(): + return + } + } +} + // getConnsToClose runs the heuristics described in TrimOpenConns and returns the // connections to close. -func (cm *BasicConnMgr) getConnsToClose(ctx context.Context) []inet.Conn { - cm.lk.Lock() - defer cm.lk.Unlock() - +func (cm *BasicConnMgr) getConnsToClose(ctx context.Context) []network.Conn { if cm.lowWater == 0 || cm.highWater == 0 { // disabled return nil } now := time.Now() - if len(cm.peers) < cm.lowWater { + nconns := int(atomic.LoadInt32(&cm.connCount)) + if nconns <= cm.lowWater { log.Info("open connection count below limit") return nil } - var candidates []*peerInfo + npeers := cm.segments.countPeers() + candidates := make([]*peerInfo, 0, npeers) cm.plk.RLock() - for id, inf := range cm.peers { - if _, ok := cm.protected[id]; ok { - // skip over protected peer. - continue + for _, s := range cm.segments { + s.Lock() + for id, inf := range s.peers { + if _, ok := cm.protected[id]; ok { + // skip over protected peer. + continue + } + candidates = append(candidates, inf) } - candidates = append(candidates, inf) + s.Unlock() } cm.plk.RUnlock() // Sort peers according to their value. sort.Slice(candidates, func(i, j int) bool { - return candidates[i].value < candidates[j].value + left, right := candidates[i], candidates[j] + // temporary peers are preferred for pruning. + if left.temp != right.temp { + return left.temp + } + // otherwise, compare by value. + return left.value < right.value }) - target := len(cm.peers) - cm.lowWater + target := nconns - cm.lowWater - // 2x number of peers we're disconnecting from because we may have more - // than one connection per peer. Slightly over allocating isn't an issue - // as this is a very short-lived array. - selected := make([]inet.Conn, 0, target*2) + // slightly overallocate because we may have more than one conns per peer + selected := make([]network.Conn, 0, target+10) for _, inf := range candidates { + if target <= 0 { + break + } // TODO: should we be using firstSeen or the time associated with the connection itself? if inf.firstSeen.Add(cm.gracePeriod).After(now) { continue } - for c := range inf.conns { - selected = append(selected, c) - } - - target-- - if target == 0 { - break + // lock this to protect from concurrent modifications from connect/disconnect events + s := cm.segments.get(inf.id) + s.Lock() + + if len(inf.conns) == 0 && inf.temp { + // handle temporary entries for early tags -- this entry has gone past the grace period + // and still holds no connections, so prune it. + delete(s.peers, inf.id) + } else { + for c := range inf.conns { + selected = append(selected, c) + } } + target -= len(inf.conns) + s.Unlock() } return selected @@ -186,16 +282,17 @@ func (cm *BasicConnMgr) getConnsToClose(ctx context.Context) []inet.Conn { // GetTagInfo is called to fetch the tag information associated with a given // peer, nil is returned if p refers to an unknown peer. -func (cm *BasicConnMgr) GetTagInfo(p peer.ID) *ifconnmgr.TagInfo { - cm.lk.Lock() - defer cm.lk.Unlock() +func (cm *BasicConnMgr) GetTagInfo(p peer.ID) *connmgr.TagInfo { + s := cm.segments.get(p) + s.Lock() + defer s.Unlock() - pi, ok := cm.peers[p] + pi, ok := s.peers[p] if !ok { return nil } - out := &ifconnmgr.TagInfo{ + out := &connmgr.TagInfo{ FirstSeen: pi.firstSeen, Value: pi.value, Tags: make(map[string]int), @@ -214,26 +311,24 @@ func (cm *BasicConnMgr) GetTagInfo(p peer.ID) *ifconnmgr.TagInfo { // TagPeer is called to associate a string and integer with a given peer. func (cm *BasicConnMgr) TagPeer(p peer.ID, tag string, val int) { - cm.lk.Lock() - defer cm.lk.Unlock() + s := cm.segments.get(p) + s.Lock() + defer s.Unlock() - pi, ok := cm.peers[p] - if !ok { - log.Info("tried to tag conn from untracked peer: ", p) - return - } + pi := s.tagInfoFor(p) // Update the total value of the peer. - pi.value += (val - pi.tags[tag]) + pi.value += val - pi.tags[tag] pi.tags[tag] = val } // UntagPeer is called to disassociate a string and integer from a given peer. func (cm *BasicConnMgr) UntagPeer(p peer.ID, tag string) { - cm.lk.Lock() - defer cm.lk.Unlock() + s := cm.segments.get(p) + s.Lock() + defer s.Unlock() - pi, ok := cm.peers[p] + pi, ok := s.peers[p] if !ok { log.Info("tried to remove tag from untracked peer: ", p) return @@ -244,6 +339,20 @@ func (cm *BasicConnMgr) UntagPeer(p peer.ID, tag string) { delete(pi.tags, tag) } +// UpsertTag is called to insert/update a peer tag +func (cm *BasicConnMgr) UpsertTag(p peer.ID, tag string, upsert func(int) int) { + s := cm.segments.get(p) + s.Lock() + defer s.Unlock() + + pi := s.tagInfoFor(p) + + oldval := pi.tags[tag] + newval := upsert(oldval) + pi.value += newval - oldval + pi.tags[tag] = newval +} + // CMInfo holds the configuration for BasicConnMgr, as well as status data. type CMInfo struct { // The low watermark, as described in NewConnManager. @@ -264,22 +373,19 @@ type CMInfo struct { // GetInfo returns the configuration and status data for this connection manager. func (cm *BasicConnMgr) GetInfo() CMInfo { - cm.lk.Lock() - defer cm.lk.Unlock() - return CMInfo{ HighWater: cm.highWater, LowWater: cm.lowWater, LastTrim: cm.lastTrim, GracePeriod: cm.gracePeriod, - ConnCount: cm.connCount, + ConnCount: int(atomic.LoadInt32(&cm.connCount)), } } // Notifee returns a sink through which Notifiers can inform the BasicConnMgr when // events occur. Currently, the notifee only reacts upon connection events // {Connected, Disconnected}. -func (cm *BasicConnMgr) Notifee() inet.Notifiee { +func (cm *BasicConnMgr) Notifee() network.Notifiee { return (*cmNotifee)(cm) } @@ -292,71 +398,79 @@ func (nn *cmNotifee) cm() *BasicConnMgr { // Connected is called by notifiers to inform that a new connection has been established. // The notifee updates the BasicConnMgr to start tracking the connection. If the new connection // count exceeds the high watermark, a trim may be triggered. -func (nn *cmNotifee) Connected(n inet.Network, c inet.Conn) { +func (nn *cmNotifee) Connected(n network.Network, c network.Conn) { cm := nn.cm() - cm.lk.Lock() - defer cm.lk.Unlock() + p := c.RemotePeer() + s := cm.segments.get(p) + s.Lock() + defer s.Unlock() - pinfo, ok := cm.peers[c.RemotePeer()] + id := c.RemotePeer() + pinfo, ok := s.peers[id] if !ok { pinfo = &peerInfo{ + id: id, firstSeen: time.Now(), tags: make(map[string]int), - conns: make(map[inet.Conn]time.Time), + conns: make(map[network.Conn]time.Time), } - cm.peers[c.RemotePeer()] = pinfo + s.peers[id] = pinfo + } else if pinfo.temp { + // we had created a temporary entry for this peer to buffer early tags before the + // Connected notification arrived: flip the temporary flag, and update the firstSeen + // timestamp to the real one. + pinfo.temp = false + pinfo.firstSeen = time.Now() } _, ok = pinfo.conns[c] if ok { - log.Error("received connected notification for conn we are already tracking: ", c.RemotePeer()) + log.Error("received connected notification for conn we are already tracking: ", p) return } pinfo.conns[c] = time.Now() - cm.connCount++ - - if cm.connCount > nn.highWater { - go cm.TrimOpenConns(context.Background()) - } + atomic.AddInt32(&cm.connCount, 1) } // Disconnected is called by notifiers to inform that an existing connection has been closed or terminated. // The notifee updates the BasicConnMgr accordingly to stop tracking the connection, and performs housekeeping. -func (nn *cmNotifee) Disconnected(n inet.Network, c inet.Conn) { +func (nn *cmNotifee) Disconnected(n network.Network, c network.Conn) { cm := nn.cm() - cm.lk.Lock() - defer cm.lk.Unlock() + p := c.RemotePeer() + s := cm.segments.get(p) + s.Lock() + defer s.Unlock() - cinf, ok := cm.peers[c.RemotePeer()] + cinf, ok := s.peers[p] if !ok { - log.Error("received disconnected notification for peer we are not tracking: ", c.RemotePeer()) + log.Error("received disconnected notification for peer we are not tracking: ", p) return } _, ok = cinf.conns[c] if !ok { - log.Error("received disconnected notification for conn we are not tracking: ", c.RemotePeer()) + log.Error("received disconnected notification for conn we are not tracking: ", p) return } delete(cinf.conns, c) - cm.connCount-- if len(cinf.conns) == 0 { - delete(cm.peers, c.RemotePeer()) + delete(s.peers, p) } + atomic.AddInt32(&cm.connCount, -1) } // Listen is no-op in this implementation. -func (nn *cmNotifee) Listen(n inet.Network, addr ma.Multiaddr) {} +func (nn *cmNotifee) Listen(n network.Network, addr ma.Multiaddr) {} // ListenClose is no-op in this implementation. -func (nn *cmNotifee) ListenClose(n inet.Network, addr ma.Multiaddr) {} +func (nn *cmNotifee) ListenClose(n network.Network, addr ma.Multiaddr) {} // OpenedStream is no-op in this implementation. -func (nn *cmNotifee) OpenedStream(inet.Network, inet.Stream) {} +func (nn *cmNotifee) OpenedStream(network.Network, network.Stream) {} // ClosedStream is no-op in this implementation. -func (nn *cmNotifee) ClosedStream(inet.Network, inet.Stream) {} +func (nn *cmNotifee) ClosedStream(network.Network, network.Stream) {} diff --git a/vendor/github.com/libp2p/go-libp2p-connmgr/go.mod b/vendor/github.com/libp2p/go-libp2p-connmgr/go.mod index 275a7418..227a85dc 100644 --- a/vendor/github.com/libp2p/go-libp2p-connmgr/go.mod +++ b/vendor/github.com/libp2p/go-libp2p-connmgr/go.mod @@ -1,10 +1,8 @@ module github.com/libp2p/go-libp2p-connmgr require ( + github.com/ipfs/go-detect-race v0.0.1 github.com/ipfs/go-log v0.0.1 - github.com/libp2p/go-libp2p-interface-connmgr v0.0.3 - github.com/libp2p/go-libp2p-net v0.0.1 - github.com/libp2p/go-libp2p-peer v0.0.1 - github.com/libp2p/go-testutil v0.0.1 - github.com/multiformats/go-multiaddr v0.0.1 + github.com/libp2p/go-libp2p-core v0.0.1 + github.com/multiformats/go-multiaddr v0.0.2 ) diff --git a/vendor/github.com/libp2p/go-libp2p-connmgr/go.sum b/vendor/github.com/libp2p/go-libp2p-connmgr/go.sum index 826f269b..663f0401 100644 --- a/vendor/github.com/libp2p/go-libp2p-connmgr/go.sum +++ b/vendor/github.com/libp2p/go-libp2p-connmgr/go.sum @@ -1,5 +1,3 @@ -github.com/AndreasBriese/bbloom v0.0.0-20180913140656-343706a395b7/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= -github.com/Kubuxu/go-os-helper v0.0.1/go.mod h1:N8B+I7vPCT80IcP58r50u4+gEEcsZETFUpAzWW2ep1Y= github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32 h1:qkOC5Gd33k54tobS36cXdAzJbeHaduLtnLQQwNoIi78= github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32/go.mod h1:DrZx5ec/dmnfpw9KyYoQyYo7d0KEvTkk/5M/vbZjAr8= @@ -10,30 +8,22 @@ github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVa github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dgraph-io/badger v1.5.5-0.20190226225317-8115aed38f8f/go.mod h1:VZxzAIRPHRVNRKRo6AXrX9BJegn6il06VMTZVJYCIjQ= -github.com/dgryski/go-farm v0.0.0-20190104051053-3adb47b1fb0f/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0= -github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gxed/hashland/keccakpg v0.0.1 h1:wrk3uMNaMxbXiHibbPO4S0ymqJMm41WiudyFSs7UnsU= github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfmKFJ6tItnhQ67kU= github.com/gxed/hashland/murmur3 v0.0.1 h1:SheiaIt0sda5K+8FLz952/1iWS9zrnKsEJaOJu4ZbSc= github.com/gxed/hashland/murmur3 v0.0.1/go.mod h1:KjXop02n4/ckmZSnY2+HKcLud/tcmvhST0bie/0lS48= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/ipfs/go-datastore v0.0.1/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= -github.com/ipfs/go-ds-badger v0.0.2/go.mod h1:Y3QpeSFWQf6MopLTiZD+VT6IC1yZqaGmjvRcKeSGij8= -github.com/ipfs/go-ds-leveldb v0.0.1/go.mod h1:feO8V3kubwsEF22n0YRQCffeb79OOYIykR4L04tMOYc= -github.com/ipfs/go-ipfs-delay v0.0.0-20181109222059-70721b86a9a8/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= +github.com/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= +github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk= +github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps= github.com/ipfs/go-log v0.0.1 h1:9XTUN/rW64BCG1YhPK9Hoy3q8nr4gOmHHBpgFdfw6Lc= github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM= github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8 h1:bspPhN+oKYFk5fcGNuQzp6IGzYQSenLEgH3s6jkXrWw= @@ -43,28 +33,9 @@ github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlT github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= -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/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/libp2p/go-buffer-pool v0.0.1/go.mod h1:xtyIz9PMobb13WaxR6Zo1Pd1zXJKYg0a8KiIvDp3TzQ= -github.com/libp2p/go-libp2p-crypto v0.0.1 h1:JNQd8CmoGTohO/akqrH16ewsqZpci2CbgYH/LmYl8gw= -github.com/libp2p/go-libp2p-crypto v0.0.1/go.mod h1:yJkNyDmO341d5wwXxDUGO0LykUVT72ImHNUqh5D/dBE= -github.com/libp2p/go-libp2p-interface-connmgr v0.0.2 h1:E0APsnVLuz/v1XGtqCi24GFQA6z2OKw/v4y8ps5EvuA= -github.com/libp2p/go-libp2p-interface-connmgr v0.0.2/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k= -github.com/libp2p/go-libp2p-interface-connmgr v0.0.3 h1:uN9FGH9OUJAtQ2G19F60Huu7s3TIYRBaJLUaW0PlCUo= -github.com/libp2p/go-libp2p-interface-connmgr v0.0.3/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k= -github.com/libp2p/go-libp2p-net v0.0.1 h1:xJ4Vh4yKF/XKb8fd1Ev0ebAGzVjMxXzrxG2kjtU+F5Q= -github.com/libp2p/go-libp2p-net v0.0.1/go.mod h1:Yt3zgmlsHOgUWSXmt5V/Jpz9upuJBE8EgNU9DrCcR8c= -github.com/libp2p/go-libp2p-peer v0.0.1 h1:0qwAOljzYewINrU+Kndoc+1jAL7vzY/oY2Go4DCGfyY= -github.com/libp2p/go-libp2p-peer v0.0.1/go.mod h1:nXQvOBbwVqoP+T5Y5nCjeH4sP9IX/J0AMzcDUVruVoo= -github.com/libp2p/go-libp2p-peerstore v0.0.1 h1:twKovq8YK5trLrd3nB7PD2Zu9JcyAIdm7Bz9yBWjhq8= -github.com/libp2p/go-libp2p-peerstore v0.0.1/go.mod h1:RabLyPVJLuNQ+GFyoEkfi8H4Ti6k/HtZJ7YKgtSq+20= -github.com/libp2p/go-libp2p-protocol v0.0.1 h1:+zkEmZ2yFDi5adpVE3t9dqh/N9TbpFWywowzeEzBbLM= -github.com/libp2p/go-libp2p-protocol v0.0.1/go.mod h1:Af9n4PiruirSDjHycM1QuiMi/1VZNHYcK8cLgFJLZ4s= -github.com/libp2p/go-stream-muxer v0.0.1 h1:Ce6e2Pyu+b5MC1k3eeFtAax0pW4gc6MosYSLV05UeLw= -github.com/libp2p/go-stream-muxer v0.0.1/go.mod h1:bAo8x7YkSpadMTbtTaxGVHWUQsR/l5MEaHbKaliuT14= -github.com/libp2p/go-testutil v0.0.1 h1:Xg+O0G2HIMfHqBOBDcMS1iSZJ3GEcId4qOxCQvsGZHk= -github.com/libp2p/go-testutil v0.0.1/go.mod h1:iAcJc/DKJQanJ5ws2V+u5ywdL2n12X1WbbEG+Jjy69I= +github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZxBdp967ls1g+k8= +github.com/libp2p/go-libp2p-core v0.0.1 h1:HSTZtFIq/W5Ue43Zw+uWZyy2Vl5WtF0zDjKN8/DT/1I= +github.com/libp2p/go-libp2p-core v0.0.1/go.mod h1:g/VxnTZ/1ygHxH3dKok7Vno1VfpvGcGip57wjTU4fco= github.com/mattn/go-colorable v0.1.1 h1:G1f5SKeVxmagw/IyvzvtZE4Gybcc4Tr1tf7I8z0XgOg= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= github.com/mattn/go-isatty v0.0.5 h1:tHXDdz1cpzGaovsTB+TVB8q90WEokoVmfMqoVcrLUgw= @@ -75,11 +46,12 @@ github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16 h1:5W7KhL8HVF3XC github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= github.com/mr-tron/base58 v1.1.0 h1:Y51FGVJ91WBqCEabAi5OPUz38eAx8DakuAm5svLcsfQ= github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= +github.com/mr-tron/base58 v1.1.1 h1:OJIdWOWYe2l5PQNgimGtuwHY8nDskvJ5vvs//YnzRLs= +github.com/mr-tron/base58 v1.1.1/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= -github.com/multiformats/go-multiaddr v0.0.1 h1:/QUV3VBMDI6pi6xfiw7lr6xhDWWvQKn9udPn68kLSdY= -github.com/multiformats/go-multiaddr v0.0.1/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= -github.com/multiformats/go-multiaddr-dns v0.0.1/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= -github.com/multiformats/go-multiaddr-net v0.0.1/go.mod h1:nw6HSxNmCIQH27XPGBuX+d1tnvM7ihcFwHMSstNAVUU= +github.com/multiformats/go-multiaddr v0.0.2 h1:RBysRCv5rv3FWlhKWKoXv8tnsCUpEpIZpCmqAGZos2s= +github.com/multiformats/go-multiaddr v0.0.2/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= +github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs= github.com/multiformats/go-multihash v0.0.1 h1:HHwN1K12I+XllBCrqKnhX949Orn4oawPkegHMu2vDqQ= github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= @@ -87,17 +59,17 @@ github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+W github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/opentracing/opentracing-go v1.0.2 h1:3jA2P6O1F9UOrWVpwrIo17pu01KWvNWg4X946/Y5Zwg= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -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/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a h1:/eS3yfGjQKG+9kayBkj0ip1BGhq6zJ3eaVksphxAaek= +github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a/go.mod h1:7AyxJNCJ7SBZ1MfVQCWD6Uqo2oubI2Eq2y2eqf+A5r0= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 h1:RC6RW7j+1+HkWaX/Yh71Ee5ZHaHYt7ZP4sQgUrm6cDU= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572/go.mod h1:w0SWMsp6j9O/dk4/ZpIhL+3CkG8ofA2vuv7k+ltqUMc= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= -github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1/go.mod h1:8UvriyWtv5Q5EOgjHaSseUEdkQfvwFv1I/In/O2M9gc= github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc h1:9lDbC6Rz4bwmou+oE6Dt4Cb2BGMur5eR/GYptkKUVHo= github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc/go.mod h1:bopw91TMyo8J3tvftk8xmU2kPmlrt4nScJQZU2hE5EM= -github.com/whyrusleeping/mafmt v1.2.8/go.mod h1:faQJFPbLSxzD9xpA02ttW/tS9vZykNvXwGvqIpk20FA= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b h1:+/WWzjwW6gidDJnMKWLKLX1gxn7irUTF1fLpQovfQ5M= @@ -112,9 +84,7 @@ golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223 h1:DH4skfRX4EBpamg7iV4ZlCpbl golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/vendor/github.com/libp2p/go-libp2p-connmgr/package.json b/vendor/github.com/libp2p/go-libp2p-connmgr/package.json deleted file mode 100644 index 560d6533..00000000 --- a/vendor/github.com/libp2p/go-libp2p-connmgr/package.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "author": "whyrusleeping", - "bugs": { - "url": "https://github.com/libp2p/go-libp2p-connmgr" - }, - "gx": { - "dvcsimport": "github.com/libp2p/go-libp2p-connmgr" - }, - "gxDependencies": [ - { - "hash": "QmbkT7eMTyXfpeyB3ZMxxcxg7XH8t6uXp49jqzz4HB7BGF", - "name": "go-log", - "version": "1.5.9" - }, - { - "author": "whyrusleeping", - "hash": "QmY3ArotKMKaL7YGfbQfyDrib6RVraLqZYWXZvVgZktBxp", - "name": "go-libp2p-net", - "version": "3.0.30" - }, - { - "author": "multiformats", - "hash": "QmTZBfrPJmjWsCvHEtX5FE6KimVJhsJg5sBbqEFYf4UZtL", - "name": "go-multiaddr", - "version": "1.4.1" - }, - { - "author": "whyrusleeping", - "hash": "QmWapVoHjtKhn4MhvKNoPTkJKADFGACfXPFnt7combwp5W", - "name": "go-testutil", - "version": "1.2.19" - }, - { - "author": "why", - "hash": "QmXa6sgzUvP5bgF5CyyV36bZYv5VDRwttggQYUPvFybLVd", - "name": "go-libp2p-interface-connmgr", - "version": "0.0.32" - }, - { - "author": "whyrusleeping", - "hash": "QmYVXrKrKHDC9FobgmcmshCDyWwdrfwfanNQN4oxJ9Fk3h", - "name": "go-libp2p-peer", - "version": "3.1.2" - } - ], - "gxVersion": "0.11.0", - "language": "go", - "license": "MIT", - "name": "go-libp2p-connmgr", - "releaseCmd": "git commit -a -m \"gx publish $VERSION\"", - "version": "0.3.34" -} - diff --git a/vendor/github.com/libp2p/go-libp2p-interface-connmgr/interface.go b/vendor/github.com/libp2p/go-libp2p-core/connmgr/connmgr.go similarity index 65% rename from vendor/github.com/libp2p/go-libp2p-interface-connmgr/interface.go rename to vendor/github.com/libp2p/go-libp2p-core/connmgr/connmgr.go index 8b5faf0f..98baf8b9 100644 --- a/vendor/github.com/libp2p/go-libp2p-interface-connmgr/interface.go +++ b/vendor/github.com/libp2p/go-libp2p-core/connmgr/connmgr.go @@ -1,17 +1,25 @@ -package ifconnmgr +// Package connmgr provides connection tracking and management interfaces for libp2p. +// +// The ConnManager interface exported from this package allows libp2p to enforce an +// upper bound on the total number of open connections. To avoid service disruptions, +// connections can be tagged with metadata and optionally "protected" to ensure that +// essential connections are not arbitrarily cut. +package connmgr import ( "context" "time" - inet "github.com/libp2p/go-libp2p-net" - peer "github.com/libp2p/go-libp2p-peer" + "github.com/libp2p/go-libp2p-core/network" + "github.com/libp2p/go-libp2p-core/peer" ) // ConnManager tracks connections to peers, and allows consumers to associate metadata // with each peer. // // It enables connections to be trimmed based on implementation-defined heuristics. +// The ConnManager allows libp2p to enforce an upper bound on the total number of +// open connections. type ConnManager interface { // TagPeer tags a peer with a string, associating a weight with the tag. @@ -20,6 +28,13 @@ type ConnManager interface { // Untag removes the tagged value from the peer. UntagPeer(p peer.ID, tag string) + // UpsertTag updates an existing tag or inserts a new one. + // + // The connection manager calls the upsert function supplying the current + // value of the tag (or zero if inexistent). The return value is used as + // the new value of the tag. + UpsertTag(p peer.ID, tag string, upsert func(int) int) + // GetTagInfo returns the metadata associated with the peer, // or nil if no metadata has been recorded for the peer. GetTagInfo(p peer.ID) *TagInfo @@ -30,7 +45,7 @@ type ConnManager interface { // Notifee returns an implementation that can be called back to inform of // opened and closed connections. - Notifee() inet.Notifiee + Notifee() network.Notifiee // Protect protects a peer from having its connection(s) pruned. // @@ -45,6 +60,9 @@ type ConnManager interface { // The return value indicates whether the peer continues to be protected after this call, by way of a different tag. // See notes on Protect() for more info. Unprotect(id peer.ID, tag string) (protected bool) + + // Close closes the connection manager and stops background processes + Close() error } // TagInfo stores metadata associated with a peer. diff --git a/vendor/github.com/libp2p/go-libp2p-core/connmgr/null.go b/vendor/github.com/libp2p/go-libp2p-core/connmgr/null.go new file mode 100644 index 00000000..473af328 --- /dev/null +++ b/vendor/github.com/libp2p/go-libp2p-core/connmgr/null.go @@ -0,0 +1,23 @@ +package connmgr + +import ( + "context" + + "github.com/libp2p/go-libp2p-core/network" + "github.com/libp2p/go-libp2p-core/peer" +) + +// NullConnMgr is a ConnMgr that provides no functionality. +type NullConnMgr struct{} + +var _ ConnManager = (*NullConnMgr)(nil) + +func (_ NullConnMgr) TagPeer(peer.ID, string, int) {} +func (_ NullConnMgr) UntagPeer(peer.ID, string) {} +func (_ NullConnMgr) UpsertTag(peer.ID, string, func(int) int) {} +func (_ NullConnMgr) GetTagInfo(peer.ID) *TagInfo { return &TagInfo{} } +func (_ NullConnMgr) TrimOpenConns(ctx context.Context) {} +func (_ NullConnMgr) Notifee() network.Notifiee { return network.GlobalNoopNotifiee } +func (_ NullConnMgr) Protect(peer.ID, string) {} +func (_ NullConnMgr) Unprotect(peer.ID, string) bool { return false } +func (_ NullConnMgr) Close() error { return nil } diff --git a/vendor/github.com/libp2p/go-libp2p-crypto/ecdsa.go b/vendor/github.com/libp2p/go-libp2p-core/crypto/ecdsa.go similarity index 98% rename from vendor/github.com/libp2p/go-libp2p-crypto/ecdsa.go rename to vendor/github.com/libp2p/go-libp2p-core/crypto/ecdsa.go index 80229a45..58e5d5f5 100644 --- a/vendor/github.com/libp2p/go-libp2p-crypto/ecdsa.go +++ b/vendor/github.com/libp2p/go-libp2p-core/crypto/ecdsa.go @@ -10,7 +10,7 @@ import ( "io" "math/big" - pb "github.com/libp2p/go-libp2p-crypto/pb" + pb "github.com/libp2p/go-libp2p-core/crypto/pb" sha256 "github.com/minio/sha256-simd" ) diff --git a/vendor/github.com/libp2p/go-libp2p-crypto/ed25519.go b/vendor/github.com/libp2p/go-libp2p-core/crypto/ed25519.go similarity index 96% rename from vendor/github.com/libp2p/go-libp2p-crypto/ed25519.go rename to vendor/github.com/libp2p/go-libp2p-core/crypto/ed25519.go index 960ad313..b6e55314 100644 --- a/vendor/github.com/libp2p/go-libp2p-crypto/ed25519.go +++ b/vendor/github.com/libp2p/go-libp2p-core/crypto/ed25519.go @@ -6,7 +6,7 @@ import ( "fmt" "io" - pb "github.com/libp2p/go-libp2p-crypto/pb" + pb "github.com/libp2p/go-libp2p-core/crypto/pb" "golang.org/x/crypto/ed25519" ) @@ -21,7 +21,7 @@ type Ed25519PublicKey struct { k ed25519.PublicKey } -// GenerateEd25519Key generate a new ed25519 private and public key pair. +// GenerateEd25519Key generates a new ed25519 private and public key pair. func GenerateEd25519Key(src io.Reader) (PrivKey, PubKey, error) { pub, priv, err := ed25519.GenerateKey(src) if err != nil { diff --git a/vendor/github.com/libp2p/go-libp2p-crypto/key.go b/vendor/github.com/libp2p/go-libp2p-core/crypto/key.go similarity index 94% rename from vendor/github.com/libp2p/go-libp2p-crypto/key.go rename to vendor/github.com/libp2p/go-libp2p-core/crypto/key.go index 9900772d..50167dbe 100644 --- a/vendor/github.com/libp2p/go-libp2p-crypto/key.go +++ b/vendor/github.com/libp2p/go-libp2p-core/crypto/key.go @@ -1,6 +1,6 @@ -// Package crypto implements various cryptographic utilities used by ipfs. -// This includes a Public and Private key interface and an RSA key implementation -// that satisfies it. +// Package crypto implements various cryptographic utilities used by libp2p. +// This includes a Public and Private key interface and key implementations +// for supported key algorithms. package crypto import ( @@ -16,7 +16,7 @@ import ( "hash" "io" - pb "github.com/libp2p/go-libp2p-crypto/pb" + pb "github.com/libp2p/go-libp2p-core/crypto/pb" "github.com/gogo/protobuf/proto" sha256 "github.com/minio/sha256-simd" @@ -86,8 +86,7 @@ type Key interface { Type() pb.KeyType } -// PrivKey represents a private key that can be used to generate a public key, -// sign data, and decrypt data that was encrypted with a public key +// PrivKey represents a private key that can be used to generate a public key and sign data type PrivKey interface { Key @@ -98,7 +97,7 @@ type PrivKey interface { GetPublic() PubKey } -// PubKey is a public key +// PubKey is a public key that can be used to verifiy data signed with the corresponding private key type PubKey interface { Key @@ -194,7 +193,7 @@ func KeyStretcher(cipherType string, hashType string, secret []byte) (StretchedK cipherKeySize = 32 case "Blowfish": ivSize = 8 - // Note: 24 arbitrarily selected, needs more thought + // Note: cypherKeySize arbitrarily selected, needs more thought cipherKeySize = 32 } @@ -340,7 +339,7 @@ func ConfigEncodeKey(b []byte) string { return base64.StdEncoding.EncodeToString(b) } -// KeyEqual checks whether two +// KeyEqual checks whether two Keys are equivalent (have identical byte representations). func KeyEqual(k1, k2 Key) bool { if k1 == k2 { return true diff --git a/vendor/github.com/libp2p/go-libp2p-core/crypto/openssl_common.go b/vendor/github.com/libp2p/go-libp2p-core/crypto/openssl_common.go new file mode 100644 index 00000000..f235e75f --- /dev/null +++ b/vendor/github.com/libp2p/go-libp2p-core/crypto/openssl_common.go @@ -0,0 +1,98 @@ +// +build openssl + +package crypto + +import ( + pb "github.com/libp2p/go-libp2p-core/crypto/pb" + + openssl "github.com/spacemonkeygo/openssl" +) + +// define these as separate types so we can add more key types later and reuse +// code. + +type opensslPublicKey struct { + key openssl.PublicKey +} + +type opensslPrivateKey struct { + key openssl.PrivateKey +} + +func unmarshalOpensslPrivateKey(b []byte) (opensslPrivateKey, error) { + sk, err := openssl.LoadPrivateKeyFromDER(b) + if err != nil { + return opensslPrivateKey{}, err + } + return opensslPrivateKey{sk}, nil +} + +func unmarshalOpensslPublicKey(b []byte) (opensslPublicKey, error) { + sk, err := openssl.LoadPublicKeyFromDER(b) + if err != nil { + return opensslPublicKey{}, err + } + return opensslPublicKey{sk}, nil +} + +// Verify compares a signature against input data +func (pk *opensslPublicKey) Verify(data, sig []byte) (bool, error) { + err := pk.key.VerifyPKCS1v15(openssl.SHA256_Method, data, sig) + return err == nil, err +} + +func (pk *opensslPublicKey) Type() pb.KeyType { + switch pk.key.KeyType() { + case openssl.KeyTypeRSA: + return pb.KeyType_RSA + default: + return -1 + } +} + +// Bytes returns protobuf bytes of a public key +func (pk *opensslPublicKey) Bytes() ([]byte, error) { + return MarshalPublicKey(pk) +} + +func (pk *opensslPublicKey) Raw() ([]byte, error) { + return pk.key.MarshalPKIXPublicKeyDER() +} + +// Equals checks whether this key is equal to another +func (pk *opensslPublicKey) Equals(k Key) bool { + return KeyEqual(pk, k) +} + +// Sign returns a signature of the input data +func (sk *opensslPrivateKey) Sign(message []byte) ([]byte, error) { + return sk.key.SignPKCS1v15(openssl.SHA256_Method, message) +} + +// GetPublic returns a public key +func (sk *opensslPrivateKey) GetPublic() PubKey { + return &opensslPublicKey{sk.key} +} + +func (sk *opensslPrivateKey) Type() pb.KeyType { + switch sk.key.KeyType() { + case openssl.KeyTypeRSA: + return pb.KeyType_RSA + default: + return -1 + } +} + +// Bytes returns protobuf bytes from a private key +func (sk *opensslPrivateKey) Bytes() ([]byte, error) { + return MarshalPrivateKey(sk) +} + +func (sk *opensslPrivateKey) Raw() ([]byte, error) { + return sk.key.MarshalPKCS1PrivateKeyDER() +} + +// Equals checks whether this key is equal to another +func (sk *opensslPrivateKey) Equals(k Key) bool { + return KeyEqual(sk, k) +} diff --git a/vendor/github.com/libp2p/go-libp2p-crypto/pb/Makefile b/vendor/github.com/libp2p/go-libp2p-core/crypto/pb/Makefile similarity index 100% rename from vendor/github.com/libp2p/go-libp2p-crypto/pb/Makefile rename to vendor/github.com/libp2p/go-libp2p-core/crypto/pb/Makefile diff --git a/vendor/github.com/libp2p/go-libp2p-crypto/pb/crypto.pb.go b/vendor/github.com/libp2p/go-libp2p-core/crypto/pb/crypto.pb.go similarity index 100% rename from vendor/github.com/libp2p/go-libp2p-crypto/pb/crypto.pb.go rename to vendor/github.com/libp2p/go-libp2p-core/crypto/pb/crypto.pb.go diff --git a/vendor/github.com/libp2p/go-libp2p-crypto/pb/crypto.proto b/vendor/github.com/libp2p/go-libp2p-core/crypto/pb/crypto.proto similarity index 100% rename from vendor/github.com/libp2p/go-libp2p-crypto/pb/crypto.proto rename to vendor/github.com/libp2p/go-libp2p-core/crypto/pb/crypto.proto diff --git a/vendor/github.com/libp2p/go-libp2p-core/crypto/rsa_common.go b/vendor/github.com/libp2p/go-libp2p-core/crypto/rsa_common.go new file mode 100644 index 00000000..d50651f2 --- /dev/null +++ b/vendor/github.com/libp2p/go-libp2p-core/crypto/rsa_common.go @@ -0,0 +1,10 @@ +package crypto + +import ( + "errors" +) + +// ErrRsaKeyTooSmall is returned when trying to generate or parse an RSA key +// that's smaller than 512 bits. Keys need to be larger enough to sign a 256bit +// hash so this is a reasonable absolute minimum. +var ErrRsaKeyTooSmall = errors.New("rsa keys must be >= 512 bits to be useful") diff --git a/vendor/github.com/libp2p/go-libp2p-crypto/rsa.go b/vendor/github.com/libp2p/go-libp2p-core/crypto/rsa_go.go similarity index 60% rename from vendor/github.com/libp2p/go-libp2p-crypto/rsa.go rename to vendor/github.com/libp2p/go-libp2p-core/crypto/rsa_go.go index e1ab22d6..e9813779 100644 --- a/vendor/github.com/libp2p/go-libp2p-crypto/rsa.go +++ b/vendor/github.com/libp2p/go-libp2p-core/crypto/rsa_go.go @@ -1,3 +1,5 @@ +// +build !openssl + package crypto import ( @@ -8,25 +10,19 @@ import ( "errors" "io" - pb "github.com/libp2p/go-libp2p-crypto/pb" + pb "github.com/libp2p/go-libp2p-core/crypto/pb" - sha256 "github.com/minio/sha256-simd" + "github.com/minio/sha256-simd" ) -// ErrRsaKeyTooSmall is returned when trying to generate or parse an RSA key -// that's smaller than 512 bits. Keys need to be larger enough to sign a 256bit -// hash so this is a reasonable absolute minimum. -var ErrRsaKeyTooSmall = errors.New("rsa keys must be >= 512 bits to be useful") - // RsaPrivateKey is an rsa private key type RsaPrivateKey struct { - sk *rsa.PrivateKey - pk *rsa.PublicKey + sk rsa.PrivateKey } // RsaPublicKey is an rsa public key type RsaPublicKey struct { - k *rsa.PublicKey + k rsa.PublicKey } // GenerateRSAKeyPair generates a new rsa private and public key @@ -38,14 +34,14 @@ func GenerateRSAKeyPair(bits int, src io.Reader) (PrivKey, PubKey, error) { if err != nil { return nil, nil, err } - pk := &priv.PublicKey - return &RsaPrivateKey{sk: priv}, &RsaPublicKey{pk}, nil + pk := priv.PublicKey + return &RsaPrivateKey{sk: *priv}, &RsaPublicKey{pk}, nil } // Verify compares a signature against input data func (pk *RsaPublicKey) Verify(data, sig []byte) (bool, error) { hashed := sha256.Sum256(data) - err := rsa.VerifyPKCS1v15(pk.k, crypto.SHA256, hashed[:], sig) + err := rsa.VerifyPKCS1v15(&pk.k, crypto.SHA256, hashed[:], sig) if err != nil { return false, err } @@ -62,12 +58,7 @@ func (pk *RsaPublicKey) Bytes() ([]byte, error) { } func (pk *RsaPublicKey) Raw() ([]byte, error) { - return x509.MarshalPKIXPublicKey(pk.k) -} - -// Encrypt returns encrypted bytes from the inpu data -func (pk *RsaPublicKey) Encrypt(b []byte) ([]byte, error) { - return rsa.EncryptPKCS1v15(rand.Reader, pk.k, b) + return x509.MarshalPKIXPublicKey(&pk.k) } // Equals checks whether this key is equal to another @@ -78,20 +69,12 @@ func (pk *RsaPublicKey) Equals(k Key) bool { // Sign returns a signature of the input data func (sk *RsaPrivateKey) Sign(message []byte) ([]byte, error) { hashed := sha256.Sum256(message) - return rsa.SignPKCS1v15(rand.Reader, sk.sk, crypto.SHA256, hashed[:]) + return rsa.SignPKCS1v15(rand.Reader, &sk.sk, crypto.SHA256, hashed[:]) } // GetPublic returns a public key func (sk *RsaPrivateKey) GetPublic() PubKey { - if sk.pk == nil { - sk.pk = &sk.sk.PublicKey - } - return &RsaPublicKey{sk.pk} -} - -// Decrypt returns decrypted bytes of the input encrypted bytes -func (sk *RsaPrivateKey) Decrypt(b []byte) ([]byte, error) { - return rsa.DecryptPKCS1v15(rand.Reader, sk.sk, b) + return &RsaPublicKey{sk.sk.PublicKey} } func (sk *RsaPrivateKey) Type() pb.KeyType { @@ -104,7 +87,7 @@ func (sk *RsaPrivateKey) Bytes() ([]byte, error) { } func (sk *RsaPrivateKey) Raw() ([]byte, error) { - b := x509.MarshalPKCS1PrivateKey(sk.sk) + b := x509.MarshalPKCS1PrivateKey(&sk.sk) return b, nil } @@ -122,12 +105,7 @@ func UnmarshalRsaPrivateKey(b []byte) (PrivKey, error) { if sk.N.BitLen() < 512 { return nil, ErrRsaKeyTooSmall } - return &RsaPrivateKey{sk: sk}, nil -} - -// MarshalRsaPrivateKey returns the x509 bytes of the private key -func MarshalRsaPrivateKey(k *RsaPrivateKey) []byte { - return x509.MarshalPKCS1PrivateKey(k.sk) + return &RsaPrivateKey{sk: *sk}, nil } // UnmarshalRsaPublicKey returns a public key from the input x509 bytes @@ -143,10 +121,5 @@ func UnmarshalRsaPublicKey(b []byte) (PubKey, error) { if pk.N.BitLen() < 512 { return nil, ErrRsaKeyTooSmall } - return &RsaPublicKey{pk}, nil -} - -// MarshalRsaPublicKey returns the x509 bytes from the public key -func MarshalRsaPublicKey(k *RsaPublicKey) ([]byte, error) { - return x509.MarshalPKIXPublicKey(k.k) + return &RsaPublicKey{*pk}, nil } diff --git a/vendor/github.com/libp2p/go-libp2p-core/crypto/rsa_openssl.go b/vendor/github.com/libp2p/go-libp2p-core/crypto/rsa_openssl.go new file mode 100644 index 00000000..96c55886 --- /dev/null +++ b/vendor/github.com/libp2p/go-libp2p-core/crypto/rsa_openssl.go @@ -0,0 +1,62 @@ +// +build openssl + +package crypto + +import ( + "errors" + "io" + + openssl "github.com/spacemonkeygo/openssl" +) + +// RsaPrivateKey is an rsa private key +type RsaPrivateKey struct { + opensslPrivateKey +} + +// RsaPublicKey is an rsa public key +type RsaPublicKey struct { + opensslPublicKey +} + +// GenerateRSAKeyPair generates a new rsa private and public key +func GenerateRSAKeyPair(bits int, _ io.Reader) (PrivKey, PubKey, error) { + if bits < 512 { + return nil, nil, ErrRsaKeyTooSmall + } + + key, err := openssl.GenerateRSAKey(bits) + if err != nil { + return nil, nil, err + } + return &RsaPrivateKey{opensslPrivateKey{key}}, &RsaPublicKey{opensslPublicKey{key}}, nil +} + +// GetPublic returns a public key +func (sk *RsaPrivateKey) GetPublic() PubKey { + return &RsaPublicKey{opensslPublicKey{sk.opensslPrivateKey.key}} +} + +// UnmarshalRsaPrivateKey returns a private key from the input x509 bytes +func UnmarshalRsaPrivateKey(b []byte) (PrivKey, error) { + key, err := unmarshalOpensslPrivateKey(b) + if err != nil { + return nil, err + } + if key.Type() != RSA { + return nil, errors.New("not actually an rsa public key") + } + return &RsaPrivateKey{key}, nil +} + +// UnmarshalRsaPublicKey returns a public key from the input x509 bytes +func UnmarshalRsaPublicKey(b []byte) (PubKey, error) { + key, err := unmarshalOpensslPublicKey(b) + if err != nil { + return nil, err + } + if key.Type() != RSA { + return nil, errors.New("not actually an rsa public key") + } + return &RsaPublicKey{key}, nil +} diff --git a/vendor/github.com/libp2p/go-libp2p-crypto/secp256k1.go b/vendor/github.com/libp2p/go-libp2p-core/crypto/secp256k1.go similarity index 98% rename from vendor/github.com/libp2p/go-libp2p-crypto/secp256k1.go rename to vendor/github.com/libp2p/go-libp2p-core/crypto/secp256k1.go index 8bca33e7..d2ac74b9 100644 --- a/vendor/github.com/libp2p/go-libp2p-crypto/secp256k1.go +++ b/vendor/github.com/libp2p/go-libp2p-core/crypto/secp256k1.go @@ -4,7 +4,7 @@ import ( "fmt" "io" - pb "github.com/libp2p/go-libp2p-crypto/pb" + pb "github.com/libp2p/go-libp2p-core/crypto/pb" btcec "github.com/btcsuite/btcd/btcec" sha256 "github.com/minio/sha256-simd" diff --git a/vendor/github.com/libp2p/go-libp2p-discovery/interface.go b/vendor/github.com/libp2p/go-libp2p-core/discovery/discovery.go similarity index 78% rename from vendor/github.com/libp2p/go-libp2p-discovery/interface.go rename to vendor/github.com/libp2p/go-libp2p-core/discovery/discovery.go index f4e5f719..f463e0e8 100644 --- a/vendor/github.com/libp2p/go-libp2p-discovery/interface.go +++ b/vendor/github.com/libp2p/go-libp2p-core/discovery/discovery.go @@ -1,10 +1,11 @@ +// Package discovery provides service advertisement and peer discovery interfaces for libp2p. package discovery import ( "context" "time" - pstore "github.com/libp2p/go-libp2p-peerstore" + "github.com/libp2p/go-libp2p-core/peer" ) // Advertiser is an interface for advertising services @@ -16,7 +17,7 @@ type Advertiser interface { // Discoverer is an interface for peer discovery type Discoverer interface { // FindPeers discovers peers providing a service - FindPeers(ctx context.Context, ns string, opts ...Option) (<-chan pstore.PeerInfo, error) + FindPeers(ctx context.Context, ns string, opts ...Option) (<-chan peer.AddrInfo, error) } // Discovery is an interface that combines service advertisement and peer discovery diff --git a/vendor/github.com/libp2p/go-libp2p-discovery/options.go b/vendor/github.com/libp2p/go-libp2p-core/discovery/options.go similarity index 81% rename from vendor/github.com/libp2p/go-libp2p-discovery/options.go rename to vendor/github.com/libp2p/go-libp2p-core/discovery/options.go index f59e56ca..7b283052 100644 --- a/vendor/github.com/libp2p/go-libp2p-discovery/options.go +++ b/vendor/github.com/libp2p/go-libp2p-core/discovery/options.go @@ -1,21 +1,20 @@ package discovery -import ( - "time" -) +import "time" -// Option is a single discovery option +// DiscoveryOpt is a single discovery option. type Option func(opts *Options) error -// Options is a set of discovery options +// DiscoveryOpts is a set of discovery options. type Options struct { Ttl time.Duration Limit int + // Other (implementation-specific) options Other map[interface{}]interface{} } -// Apply applies the given options to this Options +// Apply applies the given options to this DiscoveryOpts func (opts *Options) Apply(options ...Option) error { for _, o := range options { if err := o(opts); err != nil { diff --git a/vendor/github.com/libp2p/go-libp2p-host/match.go b/vendor/github.com/libp2p/go-libp2p-core/helpers/match.go similarity index 90% rename from vendor/github.com/libp2p/go-libp2p-host/match.go rename to vendor/github.com/libp2p/go-libp2p-core/helpers/match.go index 8a0044e5..2e246678 100644 --- a/vendor/github.com/libp2p/go-libp2p-host/match.go +++ b/vendor/github.com/libp2p/go-libp2p-core/helpers/match.go @@ -1,10 +1,10 @@ -package host +package helpers import ( "strings" - semver "github.com/coreos/go-semver/semver" - "github.com/libp2p/go-libp2p-protocol" + "github.com/coreos/go-semver/semver" + "github.com/libp2p/go-libp2p-core/protocol" ) // MultistreamSemverMatcher returns a matcher function for a given base protocol. @@ -12,6 +12,7 @@ import ( // matches the base protocol. A given protocol ID matches the base protocol if // the IDs are the same and if the semantic version of the base protocol is the // same or higher than that of the protocol ID provided. +// TODO func MultistreamSemverMatcher(base protocol.ID) (func(string) bool, error) { parts := strings.Split(string(base), "/") vers, err := semver.NewVersion(parts[len(parts)-1]) diff --git a/vendor/github.com/libp2p/go-libp2p-net/stream_util.go b/vendor/github.com/libp2p/go-libp2p-core/helpers/stream.go similarity index 91% rename from vendor/github.com/libp2p/go-libp2p-net/stream_util.go rename to vendor/github.com/libp2p/go-libp2p-core/helpers/stream.go index 762b8116..0b4c1f3e 100644 --- a/vendor/github.com/libp2p/go-libp2p-net/stream_util.go +++ b/vendor/github.com/libp2p/go-libp2p-core/helpers/stream.go @@ -1,9 +1,11 @@ -package net +package helpers import ( "errors" "io" "time" + + "github.com/libp2p/go-libp2p-core/network" ) // EOFTimeout is the maximum amount of time to wait to successfully observe an @@ -20,7 +22,7 @@ var ErrExpectedEOF = errors.New("read data when expecting EOF") // // You'll likely want to invoke this as `go FullClose(stream)` to close the // stream in the background. -func FullClose(s Stream) error { +func FullClose(s network.Stream) error { if err := s.Close(); err != nil { s.Reset() return err @@ -31,7 +33,7 @@ func FullClose(s Stream) error { // AwaitEOF waits for an EOF on the given stream, returning an error if that // fails. It waits at most EOFTimeout (defaults to 1 minute) after which it // resets the stream. -func AwaitEOF(s Stream) error { +func AwaitEOF(s network.Stream) error { // So we don't wait forever s.SetDeadline(time.Now().Add(EOFTimeout)) diff --git a/vendor/github.com/libp2p/go-libp2p-core/host/helpers.go b/vendor/github.com/libp2p/go-libp2p-core/host/helpers.go new file mode 100644 index 00000000..a24beb1b --- /dev/null +++ b/vendor/github.com/libp2p/go-libp2p-core/host/helpers.go @@ -0,0 +1,11 @@ +package host + +import "github.com/libp2p/go-libp2p-core/peer" + +// InfoFromHost returns a peer.AddrInfo struct with the Host's ID and all of its Addrs. +func InfoFromHost(h Host) *peer.AddrInfo { + return &peer.AddrInfo{ + ID: h.ID(), + Addrs: h.Addrs(), + } +} diff --git a/vendor/github.com/libp2p/go-libp2p-host/host.go b/vendor/github.com/libp2p/go-libp2p-core/host/host.go similarity index 70% rename from vendor/github.com/libp2p/go-libp2p-host/host.go rename to vendor/github.com/libp2p/go-libp2p-core/host/host.go index 3530c6ea..d4b3c03f 100644 --- a/vendor/github.com/libp2p/go-libp2p-host/host.go +++ b/vendor/github.com/libp2p/go-libp2p-core/host/host.go @@ -1,15 +1,18 @@ +// Package host provides the core Host interface for libp2p. +// +// Host represents a single libp2p node in a peer-to-peer network. package host import ( "context" - ifconnmgr "github.com/libp2p/go-libp2p-interface-connmgr" - inet "github.com/libp2p/go-libp2p-net" - peer "github.com/libp2p/go-libp2p-peer" - pstore "github.com/libp2p/go-libp2p-peerstore" - protocol "github.com/libp2p/go-libp2p-protocol" + "github.com/libp2p/go-libp2p-core/connmgr" + "github.com/libp2p/go-libp2p-core/network" + "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p-core/peerstore" + "github.com/libp2p/go-libp2p-core/protocol" + ma "github.com/multiformats/go-multiaddr" - msmux "github.com/multiformats/go-multistream" ) // Host is an object participating in a p2p network, which @@ -22,47 +25,47 @@ type Host interface { ID() peer.ID // Peerstore returns the Host's repository of Peer Addresses and Keys. - Peerstore() pstore.Peerstore + Peerstore() peerstore.Peerstore // Returns the listen addresses of the Host Addrs() []ma.Multiaddr // Networks returns the Network interface of the Host - Network() inet.Network + Network() network.Network // Mux returns the Mux multiplexing incoming streams to protocol handlers - Mux() *msmux.MultistreamMuxer + Mux() protocol.Switch // Connect ensures there is a connection between this host and the peer with // given peer.ID. Connect will absorb the addresses in pi into its internal // peerstore. If there is not an active connection, Connect will issue a // h.Network.Dial, and block until a connection is open, or an error is // returned. // TODO: Relay + NAT. - Connect(ctx context.Context, pi pstore.PeerInfo) error + Connect(ctx context.Context, pi peer.AddrInfo) error // SetStreamHandler sets the protocol handler on the Host's Mux. // This is equivalent to: // host.Mux().SetHandler(proto, handler) // (Threadsafe) - SetStreamHandler(pid protocol.ID, handler inet.StreamHandler) + SetStreamHandler(pid protocol.ID, handler network.StreamHandler) // SetStreamHandlerMatch sets the protocol handler on the Host's Mux // using a matching function for protocol selection. - SetStreamHandlerMatch(protocol.ID, func(string) bool, inet.StreamHandler) + SetStreamHandlerMatch(protocol.ID, func(string) bool, network.StreamHandler) // RemoveStreamHandler removes a handler on the mux that was set by // SetStreamHandler RemoveStreamHandler(pid protocol.ID) // NewStream opens a new stream to given peer p, and writes a p2p/protocol - // header with given protocol.ID. If there is no connection to p, attempts + // header with given ProtocolID. If there is no connection to p, attempts // to create one. If ProtocolID is "", writes no header. // (Threadsafe) - NewStream(ctx context.Context, p peer.ID, pids ...protocol.ID) (inet.Stream, error) + NewStream(ctx context.Context, p peer.ID, pids ...protocol.ID) (network.Stream, error) // Close shuts down the host, its Network, and services. Close() error // ConnManager returns this hosts connection manager - ConnManager() ifconnmgr.ConnManager + ConnManager() connmgr.ConnManager } diff --git a/vendor/github.com/libp2p/go-libp2p-core/metrics/bandwidth.go b/vendor/github.com/libp2p/go-libp2p-core/metrics/bandwidth.go new file mode 100644 index 00000000..e2c8acf3 --- /dev/null +++ b/vendor/github.com/libp2p/go-libp2p-core/metrics/bandwidth.go @@ -0,0 +1,153 @@ +// Package metrics provides metrics collection and reporting interfaces for libp2p. +package metrics + +import ( + "github.com/libp2p/go-flow-metrics" + "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p-core/protocol" +) + +// BandwidthCounter tracks incoming and outgoing data transferred by the local peer. +// Metrics are available for total bandwidth across all peers / protocols, as well +// as segmented by remote peer ID and protocol ID. +type BandwidthCounter struct { + totalIn flow.Meter + totalOut flow.Meter + + protocolIn flow.MeterRegistry + protocolOut flow.MeterRegistry + + peerIn flow.MeterRegistry + peerOut flow.MeterRegistry +} + +// NewBandwidthCounter creates a new BandwidthCounter. +func NewBandwidthCounter() *BandwidthCounter { + return new(BandwidthCounter) +} + +// LogSentMessage records the size of an outgoing message +// without associating the bandwidth to a specific peer or protocol. +func (bwc *BandwidthCounter) LogSentMessage(size int64) { + bwc.totalOut.Mark(uint64(size)) +} + +// LogRecvMessage records the size of an incoming message +// without associating the bandwith to a specific peer or protocol. +func (bwc *BandwidthCounter) LogRecvMessage(size int64) { + bwc.totalIn.Mark(uint64(size)) +} + +// LogSentMessageStream records the size of an outgoing message over a single logical stream. +// Bandwidth is associated with the given protocol.ID and peer.ID. +func (bwc *BandwidthCounter) LogSentMessageStream(size int64, proto protocol.ID, p peer.ID) { + bwc.protocolOut.Get(string(proto)).Mark(uint64(size)) + bwc.peerOut.Get(string(p)).Mark(uint64(size)) +} + +// LogRecvMessageStream records the size of an incoming message over a single logical stream. +// Bandwidth is associated with the given protocol.ID and peer.ID. +func (bwc *BandwidthCounter) LogRecvMessageStream(size int64, proto protocol.ID, p peer.ID) { + bwc.protocolIn.Get(string(proto)).Mark(uint64(size)) + bwc.peerIn.Get(string(p)).Mark(uint64(size)) +} + +// GetBandwidthForPeer returns a Stats struct with bandwidth metrics associated with the given peer.ID. +// The metrics returned include all traffic sent / received for the peer, regardless of protocol. +func (bwc *BandwidthCounter) GetBandwidthForPeer(p peer.ID) (out Stats) { + inSnap := bwc.peerIn.Get(string(p)).Snapshot() + outSnap := bwc.peerOut.Get(string(p)).Snapshot() + + return Stats{ + TotalIn: int64(inSnap.Total), + TotalOut: int64(outSnap.Total), + RateIn: inSnap.Rate, + RateOut: outSnap.Rate, + } +} + +// GetBandwidthForProtocol returns a Stats struct with bandwidth metrics associated with the given protocol.ID. +// The metrics returned include all traffic sent / recieved for the protocol, regardless of which peers were +// involved. +func (bwc *BandwidthCounter) GetBandwidthForProtocol(proto protocol.ID) (out Stats) { + inSnap := bwc.protocolIn.Get(string(proto)).Snapshot() + outSnap := bwc.protocolOut.Get(string(proto)).Snapshot() + + return Stats{ + TotalIn: int64(inSnap.Total), + TotalOut: int64(outSnap.Total), + RateIn: inSnap.Rate, + RateOut: outSnap.Rate, + } +} + +// GetBandwidthTotals returns a Stats struct with bandwidth metrics for all data sent / recieved by the +// local peer, regardless of protocol or remote peer IDs. +func (bwc *BandwidthCounter) GetBandwidthTotals() (out Stats) { + inSnap := bwc.totalIn.Snapshot() + outSnap := bwc.totalOut.Snapshot() + + return Stats{ + TotalIn: int64(inSnap.Total), + TotalOut: int64(outSnap.Total), + RateIn: inSnap.Rate, + RateOut: outSnap.Rate, + } +} + +// GetBandwidthByPeer returns a map of all remembered peers and the bandwidth +// metrics with respect to each. This method may be very expensive. +func (bwc *BandwidthCounter) GetBandwidthByPeer() map[peer.ID]Stats { + peers := make(map[peer.ID]Stats) + + bwc.peerIn.ForEach(func(p string, meter *flow.Meter) { + id := peer.ID(p) + snap := meter.Snapshot() + + stat := peers[id] + stat.TotalIn = int64(snap.Total) + stat.RateIn = snap.Rate + peers[id] = stat + }) + + bwc.peerOut.ForEach(func(p string, meter *flow.Meter) { + id := peer.ID(p) + snap := meter.Snapshot() + + stat := peers[id] + stat.TotalOut = int64(snap.Total) + stat.RateOut = snap.Rate + peers[id] = stat + }) + + return peers +} + +// GetBandwidthByProtocol returns a map of all remembered protocols and +// the bandwidth metrics with respect to each. This method may be moderately +// expensive. +func (bwc *BandwidthCounter) GetBandwidthByProtocol() map[protocol.ID]Stats { + protocols := make(map[protocol.ID]Stats) + + bwc.protocolIn.ForEach(func(p string, meter *flow.Meter) { + id := protocol.ID(p) + snap := meter.Snapshot() + + stat := protocols[id] + stat.TotalIn = int64(snap.Total) + stat.RateIn = snap.Rate + protocols[id] = stat + }) + + bwc.protocolOut.ForEach(func(p string, meter *flow.Meter) { + id := protocol.ID(p) + snap := meter.Snapshot() + + stat := protocols[id] + stat.TotalOut = int64(snap.Total) + stat.RateOut = snap.Rate + protocols[id] = stat + }) + + return protocols +} diff --git a/vendor/github.com/libp2p/go-libp2p-core/metrics/reporter.go b/vendor/github.com/libp2p/go-libp2p-core/metrics/reporter.go new file mode 100644 index 00000000..860345d6 --- /dev/null +++ b/vendor/github.com/libp2p/go-libp2p-core/metrics/reporter.go @@ -0,0 +1,31 @@ +// Package metrics provides metrics collection and reporting interfaces for libp2p. +package metrics + +import ( + "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p-core/protocol" +) + +// Stats represents a point-in-time snapshot of bandwidth metrics. +// +// The TotalIn and TotalOut fields record cumulative bytes sent / received. +// The RateIn and RateOut fields record bytes sent / received per second. +type Stats struct { + TotalIn int64 + TotalOut int64 + RateIn float64 + RateOut float64 +} + +// Reporter provides methods for logging and retrieving metrics. +type Reporter interface { + LogSentMessage(int64) + LogRecvMessage(int64) + LogSentMessageStream(int64, protocol.ID, peer.ID) + LogRecvMessageStream(int64, protocol.ID, peer.ID) + GetBandwidthForPeer(peer.ID) Stats + GetBandwidthForProtocol(protocol.ID) Stats + GetBandwidthTotals() Stats + GetBandwidthByPeer() map[peer.ID]Stats + GetBandwidthByProtocol() map[protocol.ID]Stats +} diff --git a/vendor/github.com/libp2p/go-libp2p-core/mux/mux.go b/vendor/github.com/libp2p/go-libp2p-core/mux/mux.go new file mode 100644 index 00000000..39f2e51c --- /dev/null +++ b/vendor/github.com/libp2p/go-libp2p-core/mux/mux.go @@ -0,0 +1,70 @@ +// Package mux provides stream multiplexing interfaces for libp2p. +// +// For a conceptual overview of stream multiplexing in libp2p, see +// https://docs.libp2p.io/concepts/stream-multiplexing/ +package mux + +import ( + "errors" + "io" + "net" + "time" +) + +// ErrReset is returned when reading or writing on a reset stream. +var ErrReset = errors.New("stream reset") + +// Stream is a bidirectional io pipe within a connection. +type MuxedStream interface { + io.Reader + io.Writer + + // Close closes the stream for writing. Reading will still work (that + // is, the remote side can still write). + io.Closer + + // Reset closes both ends of the stream. Use this to tell the remote + // side to hang up and go away. + Reset() error + + SetDeadline(time.Time) error + SetReadDeadline(time.Time) error + SetWriteDeadline(time.Time) error +} + +// NoopHandler do nothing. Resets streams as soon as they are opened. +var NoopHandler = func(s MuxedStream) { s.Reset() } + +// MuxedConn represents a connection to a remote peer that has been +// extended to support stream multiplexing. +// +// A MuxedConn allows a single net.Conn connection to carry many logically +// independent bidirectional streams of binary data. +// +// Together with network.ConnSecurity, MuxedConn is a component of the +// transport.CapableConn interface, which represents a "raw" network +// connection that has been "upgraded" to support the libp2p capabilities +// of secure communication and stream multiplexing. +type MuxedConn interface { + // Close closes the stream muxer and the the underlying net.Conn. + io.Closer + + // IsClosed returns whether a connection is fully closed, so it can + // be garbage collected. + IsClosed() bool + + // OpenStream creates a new stream. + OpenStream() (MuxedStream, error) + + // AcceptStream accepts a stream opened by the other side. + AcceptStream() (MuxedStream, error) +} + +// Multiplexer wraps a net.Conn with a stream multiplexing +// implementation and returns a MuxedConn that supports opening +// multiple streams over the underlying net.Conn +type Multiplexer interface { + + // NewConn constructs a new connection + NewConn(c net.Conn, isServer bool) (MuxedConn, error) +} diff --git a/vendor/github.com/libp2p/go-libp2p-core/network/conn.go b/vendor/github.com/libp2p/go-libp2p-core/network/conn.go new file mode 100644 index 00000000..e7844a0e --- /dev/null +++ b/vendor/github.com/libp2p/go-libp2p-core/network/conn.go @@ -0,0 +1,58 @@ +package network + +import ( + "io" + + ic "github.com/libp2p/go-libp2p-core/crypto" + "github.com/libp2p/go-libp2p-core/peer" + + ma "github.com/multiformats/go-multiaddr" +) + +// Conn is a connection to a remote peer. It multiplexes streams. +// Usually there is no need to use a Conn directly, but it may +// be useful to get information about the peer on the other side: +// stream.Conn().RemotePeer() +type Conn interface { + io.Closer + + ConnSecurity + ConnMultiaddrs + + // NewStream constructs a new Stream over this conn. + NewStream() (Stream, error) + + // GetStreams returns all open streams over this conn. + GetStreams() []Stream + + // Stat stores metadata pertaining to this conn. + Stat() Stat +} + +// ConnSecurity is the interface that one can mix into a connection interface to +// give it the security methods. +type ConnSecurity interface { + // LocalPeer returns our peer ID + LocalPeer() peer.ID + + // LocalPrivateKey returns our private key + LocalPrivateKey() ic.PrivKey + + // RemotePeer returns the peer ID of the remote peer. + RemotePeer() peer.ID + + // RemotePublicKey returns the public key of the remote peer. + RemotePublicKey() ic.PubKey +} + +// ConnMultiaddrs is an interface mixin for connection types that provide multiaddr +// addresses for the endpoints. +type ConnMultiaddrs interface { + // LocalMultiaddr returns the local Multiaddr associated + // with this connection + LocalMultiaddr() ma.Multiaddr + + // RemoteMultiaddr returns the remote Multiaddr associated + // with this connection + RemoteMultiaddr() ma.Multiaddr +} diff --git a/vendor/github.com/libp2p/go-libp2p-net/timeouts.go b/vendor/github.com/libp2p/go-libp2p-core/network/context.go similarity index 61% rename from vendor/github.com/libp2p/go-libp2p-net/timeouts.go rename to vendor/github.com/libp2p/go-libp2p-core/network/context.go index 922232c0..9025f83a 100644 --- a/vendor/github.com/libp2p/go-libp2p-net/timeouts.go +++ b/vendor/github.com/libp2p/go-libp2p-core/network/context.go @@ -1,4 +1,4 @@ -package net +package network import ( "context" @@ -10,8 +10,27 @@ import ( // each independently. var DialPeerTimeout = 60 * time.Second +type noDialCtxKey struct{} type dialPeerTimeoutCtxKey struct{} +var noDial = noDialCtxKey{} + +// WithNoDial constructs a new context with an option that instructs the network +// to not attempt a new dial when opening a stream. +func WithNoDial(ctx context.Context, reason string) context.Context { + return context.WithValue(ctx, noDial, reason) +} + +// GetNoDial returns true if the no dial option is set in the context. +func GetNoDial(ctx context.Context) (nodial bool, reason string) { + v := ctx.Value(noDial) + if v != nil { + return true, v.(string) + } + + return false, "" +} + // GetDialPeerTimeout returns the current DialPeer timeout (or the default). func GetDialPeerTimeout(ctx context.Context) time.Duration { if to, ok := ctx.Value(dialPeerTimeoutCtxKey{}).(time.Duration); ok { diff --git a/vendor/github.com/libp2p/go-libp2p-core/network/errors.go b/vendor/github.com/libp2p/go-libp2p-core/network/errors.go new file mode 100644 index 00000000..f0cf7291 --- /dev/null +++ b/vendor/github.com/libp2p/go-libp2p-core/network/errors.go @@ -0,0 +1,10 @@ +package network + +import "errors" + +// ErrNoRemoteAddrs is returned when there are no addresses associated with a peer during a dial. +var ErrNoRemoteAddrs = errors.New("no remote addresses") + +// ErrNoConn is returned when attempting to open a stream to a peer with the NoDial +// option and no usable connection is available. +var ErrNoConn = errors.New("no usable connection to peer") diff --git a/vendor/github.com/libp2p/go-libp2p-net/interface.go b/vendor/github.com/libp2p/go-libp2p-core/network/network.go similarity index 55% rename from vendor/github.com/libp2p/go-libp2p-net/interface.go rename to vendor/github.com/libp2p/go-libp2p-core/network/network.go index cf143664..467109c4 100644 --- a/vendor/github.com/libp2p/go-libp2p-net/interface.go +++ b/vendor/github.com/libp2p/go-libp2p-core/network/network.go @@ -1,16 +1,18 @@ -package net +// Package network provides core networking abstractions for libp2p. +// +// The network package provides the high-level Network interface for interacting +// with other libp2p peers, which is the primary public API for initiating and +// accepting connections to remote peers. +package network import ( "context" - "errors" "io" "github.com/jbenet/goprocess" - ic "github.com/libp2p/go-libp2p-crypto" - peer "github.com/libp2p/go-libp2p-peer" - pstore "github.com/libp2p/go-libp2p-peerstore" - protocol "github.com/libp2p/go-libp2p-protocol" - smux "github.com/libp2p/go-stream-muxer" + "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p-core/peerstore" + ma "github.com/multiformats/go-multiaddr" ) @@ -20,23 +22,6 @@ import ( // a single, large serialized object. const MessageSizeMax = 1 << 22 // 4 MB -// Stream represents a bidirectional channel between two agents in -// the IPFS network. "agent" is as granular as desired, potentially -// being a "request -> reply" pair, or whole protocols. -// Streams are backed by stream-muxer streams underneath the hood. -type Stream interface { - smux.Stream - - Protocol() protocol.ID - SetProtocol(protocol.ID) - - // Stat returns metadata pertaining to this stream. - Stat() Stat - - // Conn returns the connection this stream is part of. - Conn() Conn -} - // Direction represents which peer in a stream initiated a connection. type Direction int @@ -49,6 +34,25 @@ const ( DirOutbound ) +// Connectedness signals the capacity for a connection with a given node. +// It is used to signal to services and other peers whether a node is reachable. +type Connectedness int + +const ( + // NotConnected means no connection to peer, and no extra information (default) + NotConnected Connectedness = iota + + // Connected means has an open, live connection to peer + Connected + + // CanConnect means recently connected to peer, terminated gracefully + CanConnect + + // CannotConnect means recently attempted connecting but failed to connect. + // (should signal "made effort, failed") + CannotConnect +) + // Stat stores metadata pertaining to a given Stream/Conn. type Stat struct { Direction Direction @@ -59,61 +63,13 @@ type Stat struct { // streams opened by the remote side. type StreamHandler func(Stream) -// ConnSecurity is the interface that one can mix into a connection interface to -// give it the security methods. -type ConnSecurity interface { - // LocalPeer returns our peer ID - LocalPeer() peer.ID - - // LocalPrivateKey returns our private key - LocalPrivateKey() ic.PrivKey - - // RemotePeer returns the peer ID of the remote peer. - RemotePeer() peer.ID - - // RemotePublicKey returns the public key of the remote peer. - RemotePublicKey() ic.PubKey -} - -// ConnMultiaddrs is an interface mixin for connection types that provide multiaddr -// addresses for the endpoints. -type ConnMultiaddrs interface { - // LocalMultiaddr returns the local Multiaddr associated - // with this connection - LocalMultiaddr() ma.Multiaddr - - // RemoteMultiaddr returns the remote Multiaddr associated - // with this connection - RemoteMultiaddr() ma.Multiaddr -} - -// Conn is a connection to a remote peer. It multiplexes streams. -// Usually there is no need to use a Conn directly, but it may -// be useful to get information about the peer on the other side: -// stream.Conn().RemotePeer() -type Conn interface { - io.Closer - - ConnSecurity - ConnMultiaddrs - - // NewStream constructs a new Stream over this conn. - NewStream() (Stream, error) - - // GetStreams returns all open streams over this conn. - GetStreams() []Stream - - // Stat stores metadata pertaining to this conn. - Stat() Stat -} - // ConnHandler is the type of function used to listen for // connections opened by the remote side. type ConnHandler func(Conn) // Network is the interface used to connect to the outside world. // It dials and listens for connections. it uses a Swarm to pool -// connnections (see swarm pkg, and peerstream.Swarm). Connections +// connections (see swarm pkg, and peerstream.Swarm). Connections // are encrypted with a TLS-like protocol. type Network interface { Dialer @@ -146,22 +102,14 @@ type Network interface { Process() goprocess.Process } -// There are no addresses associated with a peer when they were needed. -var ErrNoRemoteAddrs = errors.New("no remote addresses") - -// ErrNoConn is returned when attempting to open a stream to a peer with the NoDial -// option and no usable connection is available. -var ErrNoConn = errors.New("no usable connection to peer") - // Dialer represents a service that can dial out to peers // (this is usually just a Network, but other services may not need the whole // stack, and thus it becomes easier to mock) type Dialer interface { - // Peerstore returns the internal peerstore // This is useful to tell the dialer about a new address for a peer. // Or use one of the public keys found out over the network. - Peerstore() pstore.Peerstore + Peerstore() peerstore.Peerstore // LocalPeer returns the local peer associated with this network LocalPeer() peer.ID @@ -188,37 +136,3 @@ type Dialer interface { Notify(Notifiee) StopNotify(Notifiee) } - -// Connectedness signals the capacity for a connection with a given node. -// It is used to signal to services and other peers whether a node is reachable. -type Connectedness int - -const ( - // NotConnected means no connection to peer, and no extra information (default) - NotConnected Connectedness = iota - - // Connected means has an open, live connection to peer - Connected - - // CanConnect means recently connected to peer, terminated gracefully - CanConnect - - // CannotConnect means recently attempted connecting but failed to connect. - // (should signal "made effort, failed") - CannotConnect -) - -// Notifiee is an interface for an object wishing to receive -// notifications from a Network. -type Notifiee interface { - Listen(Network, ma.Multiaddr) // called when network starts listening on an addr - ListenClose(Network, ma.Multiaddr) // called when network stops listening on an addr - Connected(Network, Conn) // called when a connection opened - Disconnected(Network, Conn) // called when a connection closed - OpenedStream(Network, Stream) // called when a stream opened - ClosedStream(Network, Stream) // called when a stream closed - - // TODO - // PeerConnected(Network, peer.ID) // called when a peer connected - // PeerDisconnected(Network, peer.ID) // called when a peer disconnected -} diff --git a/vendor/github.com/libp2p/go-libp2p-net/notifiee.go b/vendor/github.com/libp2p/go-libp2p-core/network/notifee.go similarity index 54% rename from vendor/github.com/libp2p/go-libp2p-net/notifiee.go rename to vendor/github.com/libp2p/go-libp2p-core/network/notifee.go index 74a80f5c..10ef72f1 100644 --- a/vendor/github.com/libp2p/go-libp2p-net/notifiee.go +++ b/vendor/github.com/libp2p/go-libp2p-core/network/notifee.go @@ -1,9 +1,24 @@ -package net +package network import ( ma "github.com/multiformats/go-multiaddr" ) +// Notifiee is an interface for an object wishing to receive +// notifications from a Network. +type Notifiee interface { + Listen(Network, ma.Multiaddr) // called when network starts listening on an addr + ListenClose(Network, ma.Multiaddr) // called when network stops listening on an addr + Connected(Network, Conn) // called when a connection opened + Disconnected(Network, Conn) // called when a connection closed + OpenedStream(Network, Stream) // called when a stream opened + ClosedStream(Network, Stream) // called when a stream closed + + // TODO + // PeerConnected(Network, peer.ID) // called when a peer connected + // PeerDisconnected(Network, peer.ID) // called when a peer disconnected +} + // NotifyBundle implements Notifiee by calling any of the functions set on it, // and nop'ing if they are unset. This is the easy way to register for // notifications. @@ -61,3 +76,17 @@ func (nb *NotifyBundle) ClosedStream(n Network, s Stream) { nb.ClosedStreamF(n, s) } } + +// Global noop notifiee. Do not change. +var GlobalNoopNotifiee = &NoopNotifiee{} + +type NoopNotifiee struct{} + +var _ Notifiee = (*NoopNotifiee)(nil) + +func (nn *NoopNotifiee) Connected(n Network, c Conn) {} +func (nn *NoopNotifiee) Disconnected(n Network, c Conn) {} +func (nn *NoopNotifiee) Listen(n Network, addr ma.Multiaddr) {} +func (nn *NoopNotifiee) ListenClose(n Network, addr ma.Multiaddr) {} +func (nn *NoopNotifiee) OpenedStream(Network, Stream) {} +func (nn *NoopNotifiee) ClosedStream(Network, Stream) {} diff --git a/vendor/github.com/libp2p/go-libp2p-core/network/stream.go b/vendor/github.com/libp2p/go-libp2p-core/network/stream.go new file mode 100644 index 00000000..d13dc305 --- /dev/null +++ b/vendor/github.com/libp2p/go-libp2p-core/network/stream.go @@ -0,0 +1,24 @@ +package network + +import ( + "github.com/libp2p/go-libp2p-core/mux" + "github.com/libp2p/go-libp2p-core/protocol" +) + +// Stream represents a bidirectional channel between two agents in +// a libp2p network. "agent" is as granular as desired, potentially +// being a "request -> reply" pair, or whole protocols. +// +// Streams are backed by a multiplexer underneath the hood. +type Stream interface { + mux.MuxedStream + + Protocol() protocol.ID + SetProtocol(id protocol.ID) + + // Stat returns metadata pertaining to this stream. + Stat() Stat + + // Conn returns the connection this stream is part of. + Conn() Conn +} diff --git a/vendor/github.com/libp2p/go-libp2p-core/peer/addrinfo.go b/vendor/github.com/libp2p/go-libp2p-core/peer/addrinfo.go new file mode 100644 index 00000000..6423d846 --- /dev/null +++ b/vendor/github.com/libp2p/go-libp2p-core/peer/addrinfo.go @@ -0,0 +1,98 @@ +package peer + +import ( + "fmt" + + ma "github.com/multiformats/go-multiaddr" +) + +// AddrInfo is a small struct used to pass around a peer with +// a set of addresses (and later, keys?). +type AddrInfo struct { + ID ID + Addrs []ma.Multiaddr +} + +var _ fmt.Stringer = AddrInfo{} + +func (pi AddrInfo) String() string { + return fmt.Sprintf("{%v: %v}", pi.ID, pi.Addrs) +} + +var ErrInvalidAddr = fmt.Errorf("invalid p2p multiaddr") + +// AddrInfosFromP2pAddrs converts a set of Multiaddrs to a set of AddrInfos. +func AddrInfosFromP2pAddrs(maddrs ...ma.Multiaddr) ([]AddrInfo, error) { + m := make(map[ID][]ma.Multiaddr) + for _, maddr := range maddrs { + transport, id := SplitAddr(maddr) + if id == "" { + return nil, ErrInvalidAddr + } + if transport == nil { + if _, ok := m[id]; !ok { + m[id] = nil + } + } else { + m[id] = append(m[id], transport) + } + } + ais := make([]AddrInfo, 0, len(m)) + for id, maddrs := range m { + ais = append(ais, AddrInfo{ID: id, Addrs: maddrs}) + } + return ais, nil +} + +// SplitAddr splits a p2p Multiaddr into a transport multiaddr and a peer ID. +// +// * Returns a nil transport if the address only contains a /p2p part. +// * Returns a empty peer ID if the address doesn't contain a /p2p part. +func SplitAddr(m ma.Multiaddr) (transport ma.Multiaddr, id ID) { + if m == nil { + return nil, "" + } + + transport, p2ppart := ma.SplitLast(m) + if p2ppart == nil || p2ppart.Protocol().Code != ma.P_P2P { + return m, "" + } + id = ID(p2ppart.RawValue()) // already validated by the multiaddr library. + return transport, id +} + +// AddrInfoFromP2pAddr converts a Multiaddr to an AddrInfo. +func AddrInfoFromP2pAddr(m ma.Multiaddr) (*AddrInfo, error) { + transport, id := SplitAddr(m) + if id == "" { + return nil, ErrInvalidAddr + } + info := &AddrInfo{ID: id} + if transport != nil { + info.Addrs = []ma.Multiaddr{transport} + } + return info, nil +} + +// AddrInfoToP2pAddr converts an AddrInfo to a list of Multiaddrs. +func AddrInfoToP2pAddrs(pi *AddrInfo) ([]ma.Multiaddr, error) { + var addrs []ma.Multiaddr + p2ppart, err := ma.NewComponent("p2p", IDB58Encode(pi.ID)) + if err != nil { + return nil, err + } + if len(pi.Addrs) == 0 { + return []ma.Multiaddr{p2ppart}, nil + } + for _, addr := range pi.Addrs { + addrs = append(addrs, addr.Encapsulate(p2ppart)) + } + return addrs, nil +} + +func (pi *AddrInfo) Loggable() map[string]interface{} { + return map[string]interface{}{ + "peerID": pi.ID.Pretty(), + "addrs": pi.Addrs, + } +} diff --git a/vendor/github.com/libp2p/go-libp2p-core/peer/addrinfo_serde.go b/vendor/github.com/libp2p/go-libp2p-core/peer/addrinfo_serde.go new file mode 100644 index 00000000..1df24e2b --- /dev/null +++ b/vendor/github.com/libp2p/go-libp2p-core/peer/addrinfo_serde.go @@ -0,0 +1,38 @@ +package peer + +import ( + "encoding/json" + + ma "github.com/multiformats/go-multiaddr" +) + +func (pi AddrInfo) MarshalJSON() ([]byte, error) { + out := make(map[string]interface{}) + out["ID"] = pi.ID.Pretty() + var addrs []string + for _, a := range pi.Addrs { + addrs = append(addrs, a.String()) + } + out["Addrs"] = addrs + return json.Marshal(out) +} + +func (pi *AddrInfo) UnmarshalJSON(b []byte) error { + var data map[string]interface{} + err := json.Unmarshal(b, &data) + if err != nil { + return err + } + pid, err := IDB58Decode(data["ID"].(string)) + if err != nil { + return err + } + pi.ID = pid + addrs, ok := data["Addrs"].([]interface{}) + if ok { + for _, a := range addrs { + pi.Addrs = append(pi.Addrs, ma.StringCast(a.(string))) + } + } + return nil +} diff --git a/vendor/github.com/libp2p/go-libp2p-peer/peer.go b/vendor/github.com/libp2p/go-libp2p-core/peer/peer.go similarity index 74% rename from vendor/github.com/libp2p/go-libp2p-peer/peer.go rename to vendor/github.com/libp2p/go-libp2p-core/peer/peer.go index bd1fbd3a..db307ee1 100644 --- a/vendor/github.com/libp2p/go-libp2p-peer/peer.go +++ b/vendor/github.com/libp2p/go-libp2p-core/peer/peer.go @@ -1,4 +1,4 @@ -// Package peer implements an object used to represent peers in the ipfs network. +// Package peer implements an object used to represent peers in the libp2p network. package peer import ( @@ -6,7 +6,7 @@ import ( "errors" "fmt" - ic "github.com/libp2p/go-libp2p-crypto" + ic "github.com/libp2p/go-libp2p-core/crypto" b58 "github.com/mr-tron/base58/base58" mh "github.com/multiformats/go-multihash" ) @@ -34,14 +34,17 @@ var AdvancedEnableInlining = true const maxInlineKeyLength = 42 // ID is a libp2p peer identity. +// +// Peer IDs are derived by hashing a peer's public key and encoding the +// hash output as a multihash. See IDFromPublicKey for details. type ID string -// Pretty returns a b58-encoded string of the ID +// Pretty returns a base58-encoded string representation of the ID. func (id ID) Pretty() string { return IDB58Encode(id) } -// Loggable returns a pretty peerID string in loggable JSON format +// Loggable returns a pretty peer ID string in loggable JSON format. func (id ID) Loggable() map[string]interface{} { return map[string]interface{}{ "peerID": id.Pretty(), @@ -52,7 +55,7 @@ func (id ID) String() string { return id.Pretty() } -// String prints out the peer. +// String prints out the peer ID. // // TODO(brian): ensure correctness at ID generation and // enforce this by only exposing functions that generate @@ -66,12 +69,12 @@ func (id ID) ShortString() string { return fmt.Sprintf("", pid[:2], pid[len(pid)-6:]) } -// MatchesPrivateKey tests whether this ID was derived from sk +// MatchesPrivateKey tests whether this ID was derived from the secret key sk. func (id ID) MatchesPrivateKey(sk ic.PrivKey) bool { return id.MatchesPublicKey(sk.GetPublic()) } -// MatchesPublicKey tests whether this ID was derived from pk +// MatchesPublicKey tests whether this ID was derived from the public key pk. func (id ID) MatchesPublicKey(pk ic.PubKey) bool { oid, err := IDFromPublicKey(pk) if err != nil { @@ -99,7 +102,7 @@ func (id ID) ExtractPublicKey() (ic.PubKey, error) { return pk, nil } -// Validate check if ID is empty or not +// Validate checks if ID is empty or not. func (id ID) Validate() error { if id == ID("") { return ErrEmptyPeerID @@ -108,8 +111,8 @@ func (id ID) Validate() error { return nil } -// IDFromString cast a string to ID type, and validate -// the id to make sure it is a multihash. +// IDFromString casts a string to the ID type, and validates +// the value to make sure it is a multihash. func IDFromString(s string) (ID, error) { if _, err := mh.Cast([]byte(s)); err != nil { return ID(""), err @@ -117,8 +120,8 @@ func IDFromString(s string) (ID, error) { return ID(s), nil } -// IDFromBytes cast a string to ID type, and validate -// the id to make sure it is a multihash. +// IDFromBytes casts a byte slice to the ID type, and validates +// the value to make sure it is a multihash. func IDFromBytes(b []byte) (ID, error) { if _, err := mh.Cast(b); err != nil { return ID(""), err @@ -126,7 +129,8 @@ func IDFromBytes(b []byte) (ID, error) { return ID(b), nil } -// IDB58Decode returns a b58-decoded Peer +// IDB58Decode accepts a base58-encoded multihash representing a peer ID +// and returns the decoded ID if the input is valid. func IDB58Decode(s string) (ID, error) { m, err := mh.FromB58String(s) if err != nil { @@ -135,12 +139,13 @@ func IDB58Decode(s string) (ID, error) { return ID(m), err } -// IDB58Encode returns b58-encoded string +// IDB58Encode returns the base58-encoded multihash representation of the ID. func IDB58Encode(id ID) string { return b58.Encode([]byte(id)) } -// IDHexDecode returns a hex-decoded Peer +// IDHexDecode accepts a hex-encoded multihash representing a peer ID +// and returns the decoded ID if the input is valid. func IDHexDecode(s string) (ID, error) { m, err := mh.FromHexString(s) if err != nil { @@ -149,12 +154,12 @@ func IDHexDecode(s string) (ID, error) { return ID(m), err } -// IDHexEncode returns hex-encoded string +// IDHexEncode returns the hex-encoded multihash representation of the ID. func IDHexEncode(id ID) string { return hex.EncodeToString([]byte(id)) } -// IDFromPublicKey returns the Peer ID corresponding to pk +// IDFromPublicKey returns the Peer ID corresponding to the public key pk. func IDFromPublicKey(pk ic.PubKey) (ID, error) { b, err := pk.Bytes() if err != nil { @@ -168,7 +173,7 @@ func IDFromPublicKey(pk ic.PubKey) (ID, error) { return ID(hash), nil } -// IDFromPrivateKey returns the Peer ID corresponding to sk +// IDFromPrivateKey returns the Peer ID corresponding to the secret key sk. func IDFromPrivateKey(sk ic.PrivKey) (ID, error) { return IDFromPublicKey(sk.GetPublic()) } diff --git a/vendor/github.com/libp2p/go-libp2p-peer/peer_serde.go b/vendor/github.com/libp2p/go-libp2p-core/peer/peer_serde.go similarity index 100% rename from vendor/github.com/libp2p/go-libp2p-peer/peer_serde.go rename to vendor/github.com/libp2p/go-libp2p-core/peer/peer_serde.go diff --git a/vendor/github.com/libp2p/go-libp2p-peer/peerset/peerset.go b/vendor/github.com/libp2p/go-libp2p-core/peer/set.go similarity index 59% rename from vendor/github.com/libp2p/go-libp2p-peer/peerset/peerset.go rename to vendor/github.com/libp2p/go-libp2p-core/peer/set.go index 0cc87dd8..ea82ea80 100644 --- a/vendor/github.com/libp2p/go-libp2p-peer/peerset/peerset.go +++ b/vendor/github.com/libp2p/go-libp2p-core/peer/set.go @@ -1,46 +1,45 @@ -package peerset +package peer import ( "sync" - - peer "github.com/libp2p/go-libp2p-peer" ) // PeerSet is a threadsafe set of peers -type PeerSet struct { - ps map[peer.ID]struct{} - lk sync.RWMutex +type Set struct { + lk sync.RWMutex + ps map[ID]struct{} + size int } -func New() *PeerSet { - ps := new(PeerSet) - ps.ps = make(map[peer.ID]struct{}) +func NewSet() *Set { + ps := new(Set) + ps.ps = make(map[ID]struct{}) ps.size = -1 return ps } -func NewLimited(size int) *PeerSet { - ps := new(PeerSet) - ps.ps = make(map[peer.ID]struct{}) +func NewLimitedSet(size int) *Set { + ps := new(Set) + ps.ps = make(map[ID]struct{}) ps.size = size return ps } -func (ps *PeerSet) Add(p peer.ID) { +func (ps *Set) Add(p ID) { ps.lk.Lock() ps.ps[p] = struct{}{} ps.lk.Unlock() } -func (ps *PeerSet) Contains(p peer.ID) bool { +func (ps *Set) Contains(p ID) bool { ps.lk.RLock() _, ok := ps.ps[p] ps.lk.RUnlock() return ok } -func (ps *PeerSet) Size() int { +func (ps *Set) Size() int { ps.lk.RLock() defer ps.lk.RUnlock() return len(ps.ps) @@ -50,7 +49,7 @@ func (ps *PeerSet) Size() int { // This operation can fail for one of two reasons: // 1) The given peer is already in the set // 2) The number of peers in the set is equal to size -func (ps *PeerSet) TryAdd(p peer.ID) bool { +func (ps *Set) TryAdd(p ID) bool { var success bool ps.lk.Lock() if _, ok := ps.ps[p]; !ok && (len(ps.ps) < ps.size || ps.size == -1) { @@ -61,9 +60,9 @@ func (ps *PeerSet) TryAdd(p peer.ID) bool { return success } -func (ps *PeerSet) Peers() []peer.ID { +func (ps *Set) Peers() []ID { ps.lk.Lock() - out := make([]peer.ID, 0, len(ps.ps)) + out := make([]ID, 0, len(ps.ps)) for p, _ := range ps.ps { out = append(out, p) } diff --git a/vendor/github.com/libp2p/go-libp2p-core/peerstore/peerstore.go b/vendor/github.com/libp2p/go-libp2p-core/peerstore/peerstore.go new file mode 100644 index 00000000..2e1b6449 --- /dev/null +++ b/vendor/github.com/libp2p/go-libp2p-core/peerstore/peerstore.go @@ -0,0 +1,162 @@ +// Package peerstore provides types and interfaces for local storage of address information, +// metadata, and public key material about libp2p peers. +package peerstore + +import ( + "context" + "errors" + "io" + "math" + "time" + + "github.com/libp2p/go-libp2p-core/peer" + + ic "github.com/libp2p/go-libp2p-core/crypto" + + ma "github.com/multiformats/go-multiaddr" +) + +var ErrNotFound = errors.New("item not found") + +var ( + // AddressTTL is the expiration time of addresses. + AddressTTL = time.Hour + + // TempAddrTTL is the ttl used for a short lived address + TempAddrTTL = time.Minute * 2 + + // ProviderAddrTTL is the TTL of an address we've received from a provider. + // This is also a temporary address, but lasts longer. After this expires, + // the records we return will require an extra lookup. + ProviderAddrTTL = time.Minute * 10 + + // RecentlyConnectedAddrTTL is used when we recently connected to a peer. + // It means that we are reasonably certain of the peer's address. + RecentlyConnectedAddrTTL = time.Minute * 10 + + // OwnObservedAddrTTL is used for our own external addresses observed by peers. + OwnObservedAddrTTL = time.Minute * 10 +) + +// Permanent TTLs (distinct so we can distinguish between them, constant as they +// are, in fact, permanent) +const ( + // PermanentAddrTTL is the ttl for a "permanent address" (e.g. bootstrap nodes). + PermanentAddrTTL = math.MaxInt64 - iota + + // ConnectedAddrTTL is the ttl used for the addresses of a peer to whom + // we're connected directly. This is basically permanent, as we will + // clear them + re-add under a TempAddrTTL after disconnecting. + ConnectedAddrTTL +) + +// Peerstore provides a threadsafe store of Peer related +// information. +type Peerstore interface { + io.Closer + + AddrBook + KeyBook + PeerMetadata + Metrics + ProtoBook + + // PeerInfo returns a peer.PeerInfo struct for given peer.ID. + // This is a small slice of the information Peerstore has on + // that peer, useful to other services. + PeerInfo(peer.ID) peer.AddrInfo + + // Peers returns all of the peer IDs stored across all inner stores. + Peers() peer.IDSlice +} + +// PeerMetadata can handle values of any type. Serializing values is +// up to the implementation. Dynamic type introspection may not be +// supported, in which case explicitly enlisting types in the +// serializer may be required. +// +// Refer to the docs of the underlying implementation for more +// information. +type PeerMetadata interface { + // Get/Put is a simple registry for other peer-related key/value pairs. + // if we find something we use often, it should become its own set of + // methods. this is a last resort. + Get(p peer.ID, key string) (interface{}, error) + Put(p peer.ID, key string, val interface{}) error +} + +// AddrBook holds the multiaddrs of peers. +type AddrBook interface { + + // AddAddr calls AddAddrs(p, []ma.Multiaddr{addr}, ttl) + AddAddr(p peer.ID, addr ma.Multiaddr, ttl time.Duration) + + // AddAddrs gives this AddrBook addresses to use, with a given ttl + // (time-to-live), after which the address is no longer valid. + // If the manager has a longer TTL, the operation is a no-op for that address + AddAddrs(p peer.ID, addrs []ma.Multiaddr, ttl time.Duration) + + // SetAddr calls mgr.SetAddrs(p, addr, ttl) + SetAddr(p peer.ID, addr ma.Multiaddr, ttl time.Duration) + + // SetAddrs sets the ttl on addresses. This clears any TTL there previously. + // This is used when we receive the best estimate of the validity of an address. + SetAddrs(p peer.ID, addrs []ma.Multiaddr, ttl time.Duration) + + // UpdateAddrs updates the addresses associated with the given peer that have + // the given oldTTL to have the given newTTL. + UpdateAddrs(p peer.ID, oldTTL time.Duration, newTTL time.Duration) + + // Addresses returns all known (and valid) addresses for a given peer + Addrs(p peer.ID) []ma.Multiaddr + + // AddrStream returns a channel that gets all addresses for a given + // peer sent on it. If new addresses are added after the call is made + // they will be sent along through the channel as well. + AddrStream(context.Context, peer.ID) <-chan ma.Multiaddr + + // ClearAddresses removes all previously stored addresses + ClearAddrs(p peer.ID) + + // PeersWithAddrs returns all of the peer IDs stored in the AddrBook + PeersWithAddrs() peer.IDSlice +} + +// KeyBook tracks the keys of Peers. +type KeyBook interface { + // PubKey stores the public key of a peer. + PubKey(peer.ID) ic.PubKey + + // AddPubKey stores the public key of a peer. + AddPubKey(peer.ID, ic.PubKey) error + + // PrivKey returns the private key of a peer, if known. Generally this might only be our own + // private key, see + // https://discuss.libp2p.io/t/what-is-the-purpose-of-having-map-peer-id-privatekey-in-peerstore/74. + PrivKey(peer.ID) ic.PrivKey + + // AddPrivKey stores the private key of a peer. + AddPrivKey(peer.ID, ic.PrivKey) error + + // PeersWithKeys returns all the peer IDs stored in the KeyBook + PeersWithKeys() peer.IDSlice +} + +// Metrics is just an object that tracks metrics +// across a set of peers. +type Metrics interface { + // RecordLatency records a new latency measurement + RecordLatency(peer.ID, time.Duration) + + // LatencyEWMA returns an exponentially-weighted moving avg. + // of all measurements of a peer's latency. + LatencyEWMA(peer.ID) time.Duration +} + +// ProtoBook tracks the protocols supported by peers +type ProtoBook interface { + GetProtocols(peer.ID) ([]string, error) + AddProtocols(peer.ID, ...string) error + SetProtocols(peer.ID, ...string) error + SupportsProtocols(peer.ID, ...string) ([]string, error) +} diff --git a/vendor/github.com/libp2p/go-libp2p-core/pnet/env.go b/vendor/github.com/libp2p/go-libp2p-core/pnet/env.go new file mode 100644 index 00000000..c8db5e3c --- /dev/null +++ b/vendor/github.com/libp2p/go-libp2p-core/pnet/env.go @@ -0,0 +1,19 @@ +package pnet + +import "os" + +// EnvKey defines environment variable name for forcing usage of PNet in libp2p +// When environment variable of this name is set to "1" the ForcePrivateNetwork +// variable will be set to true. +const EnvKey = "LIBP2P_FORCE_PNET" + +// ForcePrivateNetwork is boolean variable that forces usage of PNet in libp2p +// Setting this variable to true or setting LIBP2P_FORCE_PNET environment variable +// to true will make libp2p to require private network protector. +// If no network protector is provided and this variable is set to true libp2p will +// refuse to connect. +var ForcePrivateNetwork = false + +func init() { + ForcePrivateNetwork = os.Getenv(EnvKey) == "1" +} diff --git a/vendor/github.com/libp2p/go-libp2p-core/pnet/error.go b/vendor/github.com/libp2p/go-libp2p-core/pnet/error.go new file mode 100644 index 00000000..184b71d6 --- /dev/null +++ b/vendor/github.com/libp2p/go-libp2p-core/pnet/error.go @@ -0,0 +1,34 @@ +package pnet + +// ErrNotInPrivateNetwork is an error that should be returned by libp2p when it +// tries to dial with ForcePrivateNetwork set and no PNet Protector +var ErrNotInPrivateNetwork = NewError("private network was not configured but" + + " is enforced by the environment") + +// Error is error type for ease of detecting PNet errors +type Error interface { + IsPNetError() bool +} + +// NewError creates new Error +func NewError(err string) error { + return pnetErr("privnet: " + err) +} + +// IsPNetError checks if given error is PNet Error +func IsPNetError(err error) bool { + v, ok := err.(Error) + return ok && v.IsPNetError() +} + +type pnetErr string + +var _ Error = (*pnetErr)(nil) + +func (p pnetErr) Error() string { + return string(p) +} + +func (pnetErr) IsPNetError() bool { + return true +} diff --git a/vendor/github.com/libp2p/go-libp2p-core/pnet/protector.go b/vendor/github.com/libp2p/go-libp2p-core/pnet/protector.go new file mode 100644 index 00000000..c443ee8f --- /dev/null +++ b/vendor/github.com/libp2p/go-libp2p-core/pnet/protector.go @@ -0,0 +1,15 @@ +// Package pnet provides interfaces for private networking in libp2p. +package pnet + +import "net" + +// Protector interface is a way for private network implementation to be transparent in +// libp2p. It is created by implementation and use by libp2p-conn to secure connections +// so they can be only established with selected number of peers. +type Protector interface { + // Wraps passed connection to protect it + Protect(net.Conn) (net.Conn, error) + + // Returns key fingerprint that is safe to expose + Fingerprint() []byte +} diff --git a/vendor/github.com/libp2p/go-libp2p-protocol/protocol.go b/vendor/github.com/libp2p/go-libp2p-core/protocol/id.go similarity index 100% rename from vendor/github.com/libp2p/go-libp2p-protocol/protocol.go rename to vendor/github.com/libp2p/go-libp2p-core/protocol/id.go diff --git a/vendor/github.com/libp2p/go-libp2p-core/protocol/switch.go b/vendor/github.com/libp2p/go-libp2p-core/protocol/switch.go new file mode 100644 index 00000000..f3ac369b --- /dev/null +++ b/vendor/github.com/libp2p/go-libp2p-core/protocol/switch.go @@ -0,0 +1,81 @@ +// Package protocol provides core interfaces for protocol routing and negotiation in libp2p. +package protocol + +import ( + "io" +) + +// HandlerFunc is a user-provided function used by the Router to +// handle a protocol/stream. +// +// Will be invoked with the protocol ID string as the first argument, +// which may differ from the ID used for registration if the handler +// was registered using a match function. +type HandlerFunc = func(protocol string, rwc io.ReadWriteCloser) error + +// Router is an interface that allows users to add and remove protocol handlers, +// which will be invoked when incoming stream requests for registered protocols +// are accepted. +// +// Upon receiving an incoming stream request, the Router will check all registered +// protocol handlers to determine which (if any) is capable of handling the stream. +// The handlers are checked in order of registration; if multiple handlers are +// eligible, only the first to be registered will be invoked. +type Router interface { + + // AddHandler registers the given handler to be invoked for + // an exact literal match of the given protocol ID string. + AddHandler(protocol string, handler HandlerFunc) + + // AddHandlerWithFunc registers the given handler to be invoked + // when the provided match function returns true. + // + // The match function will be invoked with an incoming protocol + // ID string, and should return true if the handler supports + // the protocol. Note that the protocol ID argument is not + // used for matching; if you want to match the protocol ID + // string exactly, you must check for it in your match function. + AddHandlerWithFunc(protocol string, match func(string) bool, handler HandlerFunc) + + // RemoveHandler removes the registered handler (if any) for the + // given protocol ID string. + RemoveHandler(protocol string) + + // Protocols returns a list of all registered protocol ID strings. + // Note that the Router may be able to handle protocol IDs not + // included in this list if handlers were added with match functions + // using AddHandlerWithFunc. + Protocols() []string +} + +// Negotiator is a component capable of reaching agreement over what protocols +// to use for inbound streams of communication. +type Negotiator interface { + + // NegotiateLazy will return the registered protocol handler to use + // for a given inbound stream, returning as soon as the protocol has been + // determined. Returns an error if negotiation fails. + // + // NegotiateLazy may return before all protocol negotiation responses have been + // written to the stream. This is in contrast to Negotiate, which will block until + // the Negotiator is finished with the stream. + NegotiateLazy(rwc io.ReadWriteCloser) (io.ReadWriteCloser, string, HandlerFunc, error) + + // Negotiate will return the registered protocol handler to use for a given + // inbound stream, returning after the protocol has been determined and the + // Negotiator has finished using the stream for negotiation. Returns an + // error if negotiation fails. + Negotiate(rwc io.ReadWriteCloser) (string, HandlerFunc, error) + + // Handle calls Negotiate to determine which protocol handler to use for an + // inbound stream, then invokes the protocol handler function, passing it + // the protocol ID and the stream. Returns an error if negotiation fails. + Handle(rwc io.ReadWriteCloser) error +} + +// Switch is the component responsible for "dispatching" incoming stream requests to +// their corresponding stream handlers. It is both a Negotiator and a Router. +type Switch interface { + Router + Negotiator +} diff --git a/vendor/github.com/libp2p/go-libp2p-routing/options/options.go b/vendor/github.com/libp2p/go-libp2p-core/routing/options.go similarity index 98% rename from vendor/github.com/libp2p/go-libp2p-routing/options/options.go rename to vendor/github.com/libp2p/go-libp2p-core/routing/options.go index e0c9a52d..4b235cbf 100644 --- a/vendor/github.com/libp2p/go-libp2p-routing/options/options.go +++ b/vendor/github.com/libp2p/go-libp2p-core/routing/options.go @@ -1,4 +1,4 @@ -package ropts +package routing // Option is a single routing option. type Option func(opts *Options) error diff --git a/vendor/github.com/libp2p/go-libp2p-routing/notifications/query.go b/vendor/github.com/libp2p/go-libp2p-core/routing/query.go similarity index 66% rename from vendor/github.com/libp2p/go-libp2p-routing/notifications/query.go rename to vendor/github.com/libp2p/go-libp2p-core/routing/query.go index 84eba85a..3769d1c2 100644 --- a/vendor/github.com/libp2p/go-libp2p-routing/notifications/query.go +++ b/vendor/github.com/libp2p/go-libp2p-core/routing/query.go @@ -1,12 +1,10 @@ -package notifications +package routing import ( "context" - "encoding/json" "sync" - peer "github.com/libp2p/go-libp2p-peer" - pstore "github.com/libp2p/go-libp2p-peerstore" + "github.com/libp2p/go-libp2p-core/peer" ) type QueryEventType int @@ -28,7 +26,7 @@ const ( type QueryEvent struct { ID peer.ID Type QueryEventType - Responses []*pstore.PeerInfo + Responses []*peer.AddrInfo Extra string } @@ -86,36 +84,3 @@ func PublishQueryEvent(ctx context.Context, ev *QueryEvent) { ech := ich.(*eventChannel) ech.send(ctx, ev) } - -func (qe *QueryEvent) MarshalJSON() ([]byte, error) { - return json.Marshal(map[string]interface{}{ - "ID": peer.IDB58Encode(qe.ID), - "Type": int(qe.Type), - "Responses": qe.Responses, - "Extra": qe.Extra, - }) -} - -func (qe *QueryEvent) UnmarshalJSON(b []byte) error { - temp := struct { - ID string - Type int - Responses []*pstore.PeerInfo - Extra string - }{} - err := json.Unmarshal(b, &temp) - if err != nil { - return err - } - if len(temp.ID) > 0 { - pid, err := peer.IDB58Decode(temp.ID) - if err != nil { - return err - } - qe.ID = pid - } - qe.Type = QueryEventType(temp.Type) - qe.Responses = temp.Responses - qe.Extra = temp.Extra - return nil -} diff --git a/vendor/github.com/libp2p/go-libp2p-core/routing/query_serde.go b/vendor/github.com/libp2p/go-libp2p-core/routing/query_serde.go new file mode 100644 index 00000000..c7423ffe --- /dev/null +++ b/vendor/github.com/libp2p/go-libp2p-core/routing/query_serde.go @@ -0,0 +1,40 @@ +package routing + +import ( + "encoding/json" + + "github.com/libp2p/go-libp2p-core/peer" +) + +func (qe *QueryEvent) MarshalJSON() ([]byte, error) { + return json.Marshal(map[string]interface{}{ + "ID": peer.IDB58Encode(qe.ID), + "Type": int(qe.Type), + "Responses": qe.Responses, + "Extra": qe.Extra, + }) +} + +func (qe *QueryEvent) UnmarshalJSON(b []byte) error { + temp := struct { + ID string + Type int + Responses []*peer.AddrInfo + Extra string + }{} + err := json.Unmarshal(b, &temp) + if err != nil { + return err + } + if len(temp.ID) > 0 { + pid, err := peer.IDB58Decode(temp.ID) + if err != nil { + return err + } + qe.ID = pid + } + qe.Type = QueryEventType(temp.Type) + qe.Responses = temp.Responses + qe.Extra = temp.Extra + return nil +} diff --git a/vendor/github.com/libp2p/go-libp2p-routing/routing.go b/vendor/github.com/libp2p/go-libp2p-core/routing/routing.go similarity index 77% rename from vendor/github.com/libp2p/go-libp2p-routing/routing.go rename to vendor/github.com/libp2p/go-libp2p-core/routing/routing.go index 5fc1e9fe..c7078054 100644 --- a/vendor/github.com/libp2p/go-libp2p-routing/routing.go +++ b/vendor/github.com/libp2p/go-libp2p-core/routing/routing.go @@ -1,16 +1,14 @@ -// package routing defines the interface for a routing system used by ipfs. +// Package routing provides interfaces for peer routing and content routing in libp2p. package routing import ( "context" "errors" - ropts "github.com/libp2p/go-libp2p-routing/options" + ci "github.com/libp2p/go-libp2p-core/crypto" + "github.com/libp2p/go-libp2p-core/peer" cid "github.com/ipfs/go-cid" - ci "github.com/libp2p/go-libp2p-crypto" - peer "github.com/libp2p/go-libp2p-peer" - pstore "github.com/libp2p/go-libp2p-peerstore" ) // ErrNotFound is returned when the router fails to find the requested record. @@ -22,6 +20,9 @@ var ErrNotSupported = errors.New("routing: operation or key not supported") // ContentRouting is a value provider layer of indirection. It is used to find // information about who has what content. +// +// Content is identified by CID (content identifier), which encodes a hash +// of the identified content in a future-proof manner. type ContentRouting interface { // Provide adds the given cid to the content routing system. If 'true' is // passed, it also announces it, otherwise it is just kept in the local @@ -29,27 +30,27 @@ type ContentRouting interface { Provide(context.Context, cid.Cid, bool) error // Search for peers who are able to provide a given key - FindProvidersAsync(context.Context, cid.Cid, int) <-chan pstore.PeerInfo + FindProvidersAsync(context.Context, cid.Cid, int) <-chan peer.AddrInfo } -// PeerRouting is a way to find information about certain peers. +// PeerRouting is a way to find address information about certain peers. // This can be implemented by a simple lookup table, a tracking server, // or even a DHT. type PeerRouting interface { // Find specific Peer - // FindPeer searches for a peer with given ID, returns a pstore.PeerInfo + // FindPeer searches for a peer with given ID, returns a peer.AddrInfo // with relevant addresses. - FindPeer(context.Context, peer.ID) (pstore.PeerInfo, error) + FindPeer(context.Context, peer.ID) (peer.AddrInfo, error) } // ValueStore is a basic Put/Get interface. type ValueStore interface { // PutValue adds value corresponding to given Key. - PutValue(context.Context, string, []byte, ...ropts.Option) error + PutValue(context.Context, string, []byte, ...Option) error // GetValue searches for the value corresponding to given Key. - GetValue(context.Context, string, ...ropts.Option) ([]byte, error) + GetValue(context.Context, string, ...Option) ([]byte, error) // SearchValue searches for better and better values from this value // store corresponding to the given Key. By default implementations must @@ -61,13 +62,13 @@ type ValueStore interface { // // Implementations of this methods won't return ErrNotFound. When a value // couldn't be found, the channel will get closed without passing any results - SearchValue(context.Context, string, ...ropts.Option) (<-chan []byte, error) + SearchValue(context.Context, string, ...Option) (<-chan []byte, error) } -// IpfsRouting is the combination of different routing types that IPFS uses. +// Routing is the combination of different routing types supported by libp2p. // It can be satisfied by a single item (such as a DHT) or multiple different // pieces that are more optimized to each task. -type IpfsRouting interface { +type Routing interface { ContentRouting PeerRouting ValueStore @@ -82,7 +83,7 @@ type IpfsRouting interface { // PubKeyFetcher is an interfaces that should be implemented by value stores // that can optimize retrieval of public keys. // -// TODO(steb): Consider removing, see #22. +// TODO(steb): Consider removing, see https://github.com/libp2p/go-libp2p-routing/issues/22. type PubKeyFetcher interface { // GetPublicKey returns the public key for the given peer. GetPublicKey(context.Context, peer.ID) (ci.PubKey, error) diff --git a/vendor/github.com/libp2p/go-conn-security/insecure/insecure.go b/vendor/github.com/libp2p/go-libp2p-core/sec/insecure/insecure.go similarity index 74% rename from vendor/github.com/libp2p/go-conn-security/insecure/insecure.go rename to vendor/github.com/libp2p/go-libp2p-core/sec/insecure/insecure.go index 4c2cf6b0..801569cb 100644 --- a/vendor/github.com/libp2p/go-conn-security/insecure/insecure.go +++ b/vendor/github.com/libp2p/go-libp2p-core/sec/insecure/insecure.go @@ -1,13 +1,16 @@ +// Package insecure provides an insecure, unencrypted implementation of the the SecureConn and SecureTransport interfaces. +// +// Recommended only for testing and other non-production usage. package insecure import ( "context" "net" - security "github.com/libp2p/go-conn-security" + "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p-core/sec" - ci "github.com/libp2p/go-libp2p-crypto" - peer "github.com/libp2p/go-libp2p-peer" + ci "github.com/libp2p/go-libp2p-core/crypto" ) // ID is the multistream-select protocol ID that should be used when identifying @@ -15,7 +18,8 @@ import ( const ID = "/plaintext/1.0.0" // Transport is a no-op stream security transport. It provides no -// security and simply wraps connections in blank +// security and simply mocks the security and identity methods to +// return peer IDs known ahead of time. type Transport struct { id peer.ID } @@ -38,7 +42,7 @@ func (t *Transport) LocalPrivateKey() ci.PrivKey { } // SecureInbound *pretends to secure* an outbound connection to the given peer. -func (t *Transport) SecureInbound(ctx context.Context, insecure net.Conn) (security.Conn, error) { +func (t *Transport) SecureInbound(ctx context.Context, insecure net.Conn) (sec.SecureConn, error) { return &Conn{ Conn: insecure, local: t.id, @@ -46,7 +50,7 @@ func (t *Transport) SecureInbound(ctx context.Context, insecure net.Conn) (secur } // SecureOutbound *pretends to secure* an outbound connection to the given peer. -func (t *Transport) SecureOutbound(ctx context.Context, insecure net.Conn, p peer.ID) (security.Conn, error) { +func (t *Transport) SecureOutbound(ctx context.Context, insecure net.Conn, p peer.ID) (sec.SecureConn, error) { return &Conn{ Conn: insecure, local: t.id, @@ -82,5 +86,5 @@ func (ic *Conn) LocalPrivateKey() ci.PrivKey { return nil } -var _ security.Transport = (*Transport)(nil) -var _ security.Conn = (*Conn)(nil) +var _ sec.SecureTransport = (*Transport)(nil) +var _ sec.SecureConn = (*Conn)(nil) diff --git a/vendor/github.com/libp2p/go-libp2p-core/sec/security.go b/vendor/github.com/libp2p/go-libp2p-core/sec/security.go new file mode 100644 index 00000000..95c8e6a6 --- /dev/null +++ b/vendor/github.com/libp2p/go-libp2p-core/sec/security.go @@ -0,0 +1,26 @@ +// Package sec provides secure connection and transport interfaces for libp2p. +package sec + +import ( + "context" + "net" + + "github.com/libp2p/go-libp2p-core/network" + "github.com/libp2p/go-libp2p-core/peer" +) + +// SecureConn is an authenticated, encrypted connection. +type SecureConn interface { + net.Conn + network.ConnSecurity +} + +// A SecureTransport turns inbound and outbound unauthenticated, +// plain-text, native connections into authenticated, encrypted connections. +type SecureTransport interface { + // SecureInbound secures an inbound connection. + SecureInbound(ctx context.Context, insecure net.Conn) (SecureConn, error) + + // SecureOutbound secures an outbound connection. + SecureOutbound(ctx context.Context, insecure net.Conn, p peer.ID) (SecureConn, error) +} diff --git a/vendor/github.com/libp2p/go-libp2p-transport/transport.go b/vendor/github.com/libp2p/go-libp2p-core/transport/transport.go similarity index 62% rename from vendor/github.com/libp2p/go-libp2p-transport/transport.go rename to vendor/github.com/libp2p/go-libp2p-core/transport/transport.go index e81428e2..774b8d82 100644 --- a/vendor/github.com/libp2p/go-libp2p-transport/transport.go +++ b/vendor/github.com/libp2p/go-libp2p-core/transport/transport.go @@ -1,3 +1,5 @@ +// Package transport provides the Transport interface, which represents +// the devices and network protocols used to send and recieve data. package transport import ( @@ -5,10 +7,10 @@ import ( "net" "time" - logging "github.com/ipfs/go-log" - inet "github.com/libp2p/go-libp2p-net" - peer "github.com/libp2p/go-libp2p-peer" - smux "github.com/libp2p/go-stream-muxer" + "github.com/libp2p/go-libp2p-core/mux" + "github.com/libp2p/go-libp2p-core/network" + "github.com/libp2p/go-libp2p-core/peer" + ma "github.com/multiformats/go-multiaddr" ) @@ -22,27 +24,41 @@ var DialTimeout = 60 * time.Second // protocol selection as well as the handshake, if applicable. var AcceptTimeout = 60 * time.Second -var log = logging.Logger("transport") - -// Conn is an extension of the net.Conn interface that provides multiaddr -// information, and an accessor for the transport used to create the conn -type Conn interface { - smux.Conn - inet.ConnSecurity - inet.ConnMultiaddrs +// A CapableConn represents a connection that has offers the basic +// capabilities required by libp2p: stream multiplexing, encryption and +// peer authentication. +// +// These capabilities may be natively provided by the transport, or they +// may be shimmed via the "connection upgrade" process, which converts a +// "raw" network connection into one that supports such capabilities by +// layering an encryption channel and a stream multiplexer. +// +// CapableConn provides accessors for the local and remote multiaddrs used to +// establish the connection and an accessor for the underlying Transport. +type CapableConn interface { + mux.MuxedConn + network.ConnSecurity + network.ConnMultiaddrs // Transport returns the transport to which this connection belongs. Transport() Transport } // Transport represents any device by which you can connect to and accept -// connections from other peers. The built-in transports provided are TCP and UTP -// but many more can be implemented, sctp, audio signals, sneakernet, UDT, a -// network of drones carrying usb flash drives, and so on. +// connections from other peers. +// +// The Transport interface allows you to open connections to other peers +// by dialing them, and also lets you listen for incoming connections. +// +// Connections returned by Dial and passed into Listeners are of type +// CapableConn, which means that they have been upgraded to support +// stream multiplexing and connection security (encryption and authentication). +// +// For a conceptual overview, see https://docs.libp2p.io/concepts/transport/ type Transport interface { // Dial dials a remote peer. It should try to reuse local listener // addresses if possible but it may choose not to. - Dial(ctx context.Context, raddr ma.Multiaddr, p peer.ID) (Conn, error) + Dial(ctx context.Context, raddr ma.Multiaddr, p peer.ID) (CapableConn, error) // CanDial returns true if this transport knows how to dial the given // multiaddr. @@ -67,20 +83,20 @@ type Transport interface { Proxy() bool } -// Listener is an interface closely resembling the net.Listener interface. The +// Listener is an interface closely resembling the net.Listener interface. The // only real difference is that Accept() returns Conn's of the type in this // package, and also exposes a Multiaddr method as opposed to a regular Addr // method type Listener interface { - Accept() (Conn, error) + Accept() (CapableConn, error) Close() error Addr() net.Addr Multiaddr() ma.Multiaddr } // Network is an inet.Network with methods for managing transports. -type Network interface { - inet.Network +type TransportNetwork interface { + network.Network // AddTransport adds a transport to this Network. // diff --git a/vendor/github.com/libp2p/go-libp2p-crypto/.travis.yml b/vendor/github.com/libp2p/go-libp2p-crypto/.travis.yml index 4cfe98c2..97be2f5c 100644 --- a/vendor/github.com/libp2p/go-libp2p-crypto/.travis.yml +++ b/vendor/github.com/libp2p/go-libp2p-crypto/.travis.yml @@ -8,11 +8,10 @@ go: env: global: - - GOTFLAGS="-race" - matrix: - - BUILD_DEPTYPE=gx - BUILD_DEPTYPE=gomod - + matrix: + - GOTFLAGS="-race" + - GOTFLAGS="-race -tags=openssl" # disable travis install install: @@ -24,7 +23,6 @@ script: cache: directories: - - $GOPATH/src/gx - $GOPATH/pkg/mod - $HOME/.cache/go-build diff --git a/vendor/github.com/libp2p/go-libp2p-crypto/Makefile b/vendor/github.com/libp2p/go-libp2p-crypto/Makefile deleted file mode 100644 index 7c146b10..00000000 --- a/vendor/github.com/libp2p/go-libp2p-crypto/Makefile +++ /dev/null @@ -1,14 +0,0 @@ -test: deps - go test -race -v ./... - -export IPFS_API ?= v04x.ipfs.io - -gx: - go get -u github.com/whyrusleeping/gx - go get -u github.com/whyrusleeping/gx-go - -deps: gx - gx --verbose install --global - gx-go rewrite - go get -t ./... - diff --git a/vendor/github.com/libp2p/go-libp2p-crypto/README.md b/vendor/github.com/libp2p/go-libp2p-crypto/README.md index ac1b554a..1d61419b 100644 --- a/vendor/github.com/libp2p/go-libp2p-crypto/README.md +++ b/vendor/github.com/libp2p/go-libp2p-crypto/README.md @@ -1,11 +1,9 @@ # go-libp2p-crypto [![](https://img.shields.io/badge/project-libp2p-yellow.svg?style=flat-square)](http://libp2p.io/) -[![](https://img.shields.io/badge/pm-waffle-yellow.svg?style=flat-square)](http://github.com/libp2p/libp2p) [![](https://img.shields.io/badge/freenode-%23libp2p-yellow.svg?style=flat-square)](http://webchat.freenode.net/?channels=%23libp2p) -[![standard-readme compliant](https://img.shields.io/badge/standard--readme-OK-green.svg?style=flat-square)](https://github.com/RichardLitt/standard-readme) [![GoDoc](https://godoc.org/github.com/libp2p/go-libp2p-crypto?status.svg)](https://godoc.org/github.com/ipfs/go-libp2p-crypto) -[![Coverage Status](https://coveralls.io/repos/github/ipfs/go-libp2p-crypto/badge.svg?branch=master)](https://coveralls.io/github/ipfs/go-libp2p-crypto?branch=master) [![Build Status](https://travis-ci.org/libp2p/go-libp2p-crypto.svg?branch=master)](https://travis-ci.org/libp2p/go-libp2p-crypto) +[![Discourse posts](https://img.shields.io/discourse/https/discuss.libp2p.io/posts.svg)](https://discuss.libp2p.io) > Various cryptographic utilities used by ipfs @@ -38,3 +36,7 @@ Small note: If editing the README, please conform to the [standard-readme](https ## License [MIT](LICENSE) © 2016 Jeromy Johnson + +--- + +The last gx published version of this module was: 2.0.7: QmTW4SdgBWq9GjsBsHeUx8WuGxzhgzAf88UMH2w62PC8yK diff --git a/vendor/github.com/libp2p/go-libp2p-crypto/ecdsa_deprecated.go b/vendor/github.com/libp2p/go-libp2p-crypto/ecdsa_deprecated.go new file mode 100644 index 00000000..f37d6618 --- /dev/null +++ b/vendor/github.com/libp2p/go-libp2p-crypto/ecdsa_deprecated.go @@ -0,0 +1,64 @@ +package crypto + +import ( + "crypto/ecdsa" + "crypto/elliptic" + "io" + + core "github.com/libp2p/go-libp2p-core/crypto" +) + +// Deprecated: use github.com/libp2p/go-libp2p-core/crypto.ECDSAPrivateKey instead. +type ECDSAPrivateKey = core.ECDSAPrivateKey + +// Deprecated: use github.com/libp2p/go-libp2p-core/crypto.ECDSAPublicKey instead. +type ECDSAPublicKey = core.ECDSAPublicKey + +// Deprecated: use github.com/libp2p/go-libp2p-core/crypto.ECDSASig instead. +type ECDSASig = core.ECDSASig + +var ( + // Deprecated: use github.com/libp2p/go-libp2p-core/crypto.ErrNotECDSAPubKey instead. + ErrNotECDSAPubKey = core.ErrNotECDSAPubKey + // Deprecated: use github.com/libp2p/go-libp2p-core/crypto.ErrNilSig instead. + ErrNilSig = core.ErrNilSig + // Deprecated: use github.com/libp2p/go-libp2p-core/crypto.ErrNilPrivateKey instead. + ErrNilPrivateKey = core.ErrNilPrivateKey + // Deprecated: use github.com/libp2p/go-libp2p-core/crypto.ECDSACurve instead. + ECDSACurve = core.ECDSACurve +) + +// Deprecated: use github.com/libp2p/go-libp2p-core/crypto.GenerateECDSAKeyPair instead. +func GenerateECDSAKeyPair(src io.Reader) (PrivKey, PubKey, error) { + return core.GenerateECDSAKeyPair(src) +} + +// Deprecated: use github.com/libp2p/go-libp2p-core/crypto.GenerateECDSAKeyPairWithCurve instead. +func GenerateECDSAKeyPairWithCurve(curve elliptic.Curve, src io.Reader) (PrivKey, PubKey, error) { + return core.GenerateECDSAKeyPairWithCurve(curve, src) +} + +// Deprecated: use github.com/libp2p/go-libp2p-core/crypto.ECDSAKeyPairFromKey instead. +func ECDSAKeyPairFromKey(priv *ecdsa.PrivateKey) (PrivKey, PubKey, error) { + return core.ECDSAKeyPairFromKey(priv) +} + +// Deprecated: use github.com/libp2p/go-libp2p-core/crypto.MarshalECDSAPrivateKey instead. +func MarshalECDSAPrivateKey(ePriv ECDSAPrivateKey) ([]byte, error) { + return core.MarshalECDSAPrivateKey(ePriv) +} + +// Deprecated: use github.com/libp2p/go-libp2p-core/crypto.MarshalECDSAPublicKey instead. +func MarshalECDSAPublicKey(ePub ECDSAPublicKey) ([]byte, error) { + return core.MarshalECDSAPublicKey(ePub) +} + +// Deprecated: use github.com/libp2p/go-libp2p-core/crypto.UnmarshalECDSAPrivateKey instead. +func UnmarshalECDSAPrivateKey(data []byte) (PrivKey, error) { + return core.UnmarshalECDSAPrivateKey(data) +} + +// Deprecated: use github.com/libp2p/go-libp2p-core/crypto.UnmarshalECDSAPublicKey instead. +func UnmarshalECDSAPublicKey(data []byte) (PubKey, error) { + return core.UnmarshalECDSAPublicKey(data) +} diff --git a/vendor/github.com/libp2p/go-libp2p-crypto/ed25519_deprecated.go b/vendor/github.com/libp2p/go-libp2p-crypto/ed25519_deprecated.go new file mode 100644 index 00000000..3d9a4b47 --- /dev/null +++ b/vendor/github.com/libp2p/go-libp2p-crypto/ed25519_deprecated.go @@ -0,0 +1,28 @@ +package crypto + +import ( + "io" + + core "github.com/libp2p/go-libp2p-core/crypto" +) + +// Deprecated: use github.com/libp2p/go-libp2p-core/crypto.Ed25519PrivateKey instead. +type Ed25519PrivateKey = core.Ed25519PrivateKey + +// Deprecated: use github.com/libp2p/go-libp2p-core/crypto.Ed25519PublicKey instead. +type Ed25519PublicKey = core.Ed25519PublicKey + +// Deprecated: use github.com/libp2p/go-libp2p-core/crypto.GenerateEd25519Key instead. +func GenerateEd25519Key(src io.Reader) (PrivKey, PubKey, error) { + return core.GenerateEd25519Key(src) +} + +// Deprecated: use github.com/libp2p/go-libp2p-core/crypto.UnmarshalEd25519PublicKey instead. +func UnmarshalEd25519PublicKey(data []byte) (PubKey, error) { + return core.UnmarshalEd25519PublicKey(data) +} + +// Deprecated: use github.com/libp2p/go-libp2p-core/crypto.UnmarshalEd25519PrivateKey instead. +func UnmarshalEd25519PrivateKey(data []byte) (PrivKey, error) { + return core.UnmarshalEd25519PrivateKey(data) +} diff --git a/vendor/github.com/libp2p/go-libp2p-crypto/go.mod b/vendor/github.com/libp2p/go-libp2p-crypto/go.mod index a9f8eecb..38a007ab 100644 --- a/vendor/github.com/libp2p/go-libp2p-crypto/go.mod +++ b/vendor/github.com/libp2p/go-libp2p-crypto/go.mod @@ -1,8 +1,3 @@ module github.com/libp2p/go-libp2p-crypto -require ( - github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32 - github.com/gogo/protobuf v1.2.1 - github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16 - golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b -) +require github.com/libp2p/go-libp2p-core v0.0.1 diff --git a/vendor/github.com/libp2p/go-libp2p-crypto/go.sum b/vendor/github.com/libp2p/go-libp2p-crypto/go.sum index c52becaf..669c0351 100644 --- a/vendor/github.com/libp2p/go-libp2p-crypto/go.sum +++ b/vendor/github.com/libp2p/go-libp2p-crypto/go.sum @@ -8,29 +8,57 @@ github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVa github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495 h1:6IyqGr3fnd0tM3YxipK27TUskaOVUjU2nG45yzwcQKY= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/gxed/hashland/keccakpg v0.0.1 h1:wrk3uMNaMxbXiHibbPO4S0ymqJMm41WiudyFSs7UnsU= +github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfmKFJ6tItnhQ67kU= +github.com/gxed/hashland/murmur3 v0.0.1 h1:SheiaIt0sda5K+8FLz952/1iWS9zrnKsEJaOJu4ZbSc= +github.com/gxed/hashland/murmur3 v0.0.1/go.mod h1:KjXop02n4/ckmZSnY2+HKcLud/tcmvhST0bie/0lS48= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= +github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8/go.mod h1:Ly/wlsjFq/qrU3Rar62tu1gASgGw6chQbSh/XgIIXCY= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= +github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZxBdp967ls1g+k8= +github.com/libp2p/go-libp2p-core v0.0.1 h1:HSTZtFIq/W5Ue43Zw+uWZyy2Vl5WtF0zDjKN8/DT/1I= +github.com/libp2p/go-libp2p-core v0.0.1/go.mod h1:g/VxnTZ/1ygHxH3dKok7Vno1VfpvGcGip57wjTU4fco= +github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0OXOcUbGjvZxxijuBwbbmlSxLiuofa+g= +github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16 h1:5W7KhL8HVF3XCFOweFD3BNESdnO8ewyYTFT2R+/b8FQ= github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= +github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= +github.com/mr-tron/base58 v1.1.1 h1:OJIdWOWYe2l5PQNgimGtuwHY8nDskvJ5vvs//YnzRLs= +github.com/mr-tron/base58 v1.1.1/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= +github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= +github.com/multiformats/go-multiaddr v0.0.2 h1:RBysRCv5rv3FWlhKWKoXv8tnsCUpEpIZpCmqAGZos2s= +github.com/multiformats/go-multiaddr v0.0.2/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= +github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs= +github.com/multiformats/go-multihash v0.0.1 h1:HHwN1K12I+XllBCrqKnhX949Orn4oawPkegHMu2vDqQ= +github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a h1:/eS3yfGjQKG+9kayBkj0ip1BGhq6zJ3eaVksphxAaek= +github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a/go.mod h1:7AyxJNCJ7SBZ1MfVQCWD6Uqo2oubI2Eq2y2eqf+A5r0= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 h1:RC6RW7j+1+HkWaX/Yh71Ee5ZHaHYt7ZP4sQgUrm6cDU= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572/go.mod h1:w0SWMsp6j9O/dk4/ZpIhL+3CkG8ofA2vuv7k+ltqUMc= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b h1:+/WWzjwW6gidDJnMKWLKLX1gxn7irUTF1fLpQovfQ5M= golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/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-20190219092855-153ac476189d h1:Z0Ahzd7HltpJtjAHHxX8QFP3j1yYgiuvjbjRzDj/KH0= +golang.org/x/sys v0.0.0-20190219092855-153ac476189d/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/vendor/github.com/libp2p/go-libp2p-crypto/key_deprecated.go b/vendor/github.com/libp2p/go-libp2p-crypto/key_deprecated.go new file mode 100644 index 00000000..57342690 --- /dev/null +++ b/vendor/github.com/libp2p/go-libp2p-crypto/key_deprecated.go @@ -0,0 +1,108 @@ +// Deprecated: use github.com/libp2p/go-libp2p-core/crypto instead. +package crypto + +import ( + "io" + + core "github.com/libp2p/go-libp2p-core/crypto" +) + +const ( + // Deprecated: use github.com/libp2p/go-libp2p-core/crypto.RSA instead. + RSA = core.RSA + // Deprecated: use github.com/libp2p/go-libp2p-core/crypto.Ed25519 instead. + Ed25519 = core.Ed25519 + // Deprecated: use github.com/libp2p/go-libp2p-core/crypto.Secp256k1 instead. + Secp256k1 = core.Secp256k1 + // Deprecated: use github.com/libp2p/go-libp2p-core/crypto.ECDSA instead. + ECDSA = core.ECDSA +) + +var ( + // Deprecated: use github.com/libp2p/go-libp2p-core/crypto.ErrBadKeyType instead. + ErrBadKeyType = core.ErrBadKeyType + // Deprecated: use github.com/libp2p/go-libp2p-core/crypto.KeyTypes instead. + KeyTypes = core.KeyTypes +) + +// Deprecated: use github.com/libp2p/go-libp2p-core/crypto.PubKeyUnmarshaller instead. +type PubKeyUnmarshaller = core.PubKeyUnmarshaller + +// Deprecated: use github.com/libp2p/go-libp2p-core/crypto.PrivKeyUnmarshaller instead. +type PrivKeyUnmarshaller = core.PrivKeyUnmarshaller + +// Deprecated: use github.com/libp2p/go-libp2p-core/crypto.PubKeyUnmarshallers instead. +var PubKeyUnmarshallers = core.PubKeyUnmarshallers + +// Deprecated: use github.com/libp2p/go-libp2p-core/crypto.PrivKeyUnmarshallers instead. +var PrivKeyUnmarshallers = core.PrivKeyUnmarshallers + +// Deprecated: use github.com/libp2p/go-libp2p-core/crypto.Key instead. +type Key = core.Key + +// Deprecated: use github.com/libp2p/go-libp2p-core/crypto.PrivKey instead. +type PrivKey = core.PrivKey + +// Deprecated: use github.com/libp2p/go-libp2p-core/crypto.PubKey instead. +type PubKey = core.PubKey + +// Deprecated: use github.com/libp2p/go-libp2p-core/crypto.GenSharedKey instead. +type GenSharedKey = core.GenSharedKey + +// Deprecated: use github.com/libp2p/go-libp2p-core/crypto.GenerateKeyPair instead. +func GenerateKeyPair(typ, bits int) (PrivKey, PubKey, error) { + return core.GenerateKeyPair(typ, bits) +} + +// Deprecated: use github.com/libp2p/go-libp2p-core/crypto.GenerateKeyPairWithReader instead. +func GenerateKeyPairWithReader(typ, bits int, src io.Reader) (PrivKey, PubKey, error) { + return core.GenerateKeyPairWithReader(typ, bits, src) +} + +// Deprecated: use github.com/libp2p/go-libp2p-core/crypto.GenerateEKeyPair instead. +func GenerateEKeyPair(curveName string) ([]byte, GenSharedKey, error) { + return core.GenerateEKeyPair(curveName) +} + +// Deprecated: use github.com/libp2p/go-libp2p-core/crypto.GenSharedKey instead. +type StretchedKeys = core.StretchedKeys + +// Deprecated: use github.com/libp2p/go-libp2p-core/crypto.KeyStretcher instead. +func KeyStretcher(cipherType string, hashType string, secret []byte) (StretchedKeys, StretchedKeys) { + return core.KeyStretcher(cipherType, hashType, secret) +} + +// Deprecated: use github.com/libp2p/go-libp2p-core/crypto.UnmarshalPublicKey instead. +func UnmarshalPublicKey(data []byte) (PubKey, error) { + return core.UnmarshalPublicKey(data) +} + +// Deprecated: use github.com/libp2p/go-libp2p-core/crypto.MarshalPublicKey instead. +func MarshalPublicKey(k PubKey) ([]byte, error) { + return core.MarshalPublicKey(k) +} + +// Deprecated: use github.com/libp2p/go-libp2p-core/crypto.UnmarshalPrivateKey instead. +func UnmarshalPrivateKey(data []byte) (PrivKey, error) { + return core.UnmarshalPrivateKey(data) +} + +// Deprecated: use github.com/libp2p/go-libp2p-core/crypto.MarshalPrivateKey instead. +func MarshalPrivateKey(k PrivKey) ([]byte, error) { + return core.MarshalPrivateKey(k) +} + +// Deprecated: use github.com/libp2p/go-libp2p-core/crypto.ConfigDecodeKey instead. +func ConfigDecodeKey(b string) ([]byte, error) { + return core.ConfigDecodeKey(b) +} + +// Deprecated: use github.com/libp2p/go-libp2p-core/crypto.ConfigEncodeKey instead. +func ConfigEncodeKey(b []byte) string { + return core.ConfigEncodeKey(b) +} + +// Deprecated: use github.com/libp2p/go-libp2p-core/crypto.KeyEqual instead. +func KeyEqual(k1, k2 Key) bool { + return core.KeyEqual(k1, k2) +} diff --git a/vendor/github.com/libp2p/go-libp2p-crypto/package.json b/vendor/github.com/libp2p/go-libp2p-crypto/package.json deleted file mode 100644 index f44acbf9..00000000 --- a/vendor/github.com/libp2p/go-libp2p-crypto/package.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "author": "whyrusleeping", - "bugs": { - "url": "https://github.com/libp2p/go-libp2p-transport" - }, - "gx": { - "dvcsimport": "github.com/libp2p/go-libp2p-crypto" - }, - "gxDependencies": [ - { - "author": "btcsuite", - "hash": "QmWq5PJgAQKDWQerAijYUVKW8mN5MDatK5j7VMp8rizKQd", - "name": "btcec", - "version": "0.0.1" - }, - { - "author": "minio", - "hash": "QmcTzQXRcU2vf8yX5EEboz1BSvWC7wWmeYAKVQmhp8WZYU", - "name": "sha256-simd", - "version": "0.1.2" - }, - { - "author": "whyrusleeping", - "hash": "QmddjPSGZb3ieihSseFeCfVRpZzcqczPNsD2DvarSwnjJB", - "name": "gogo-protobuf", - "version": "1.2.1" - }, - { - "author": "golang", - "hash": "QmW7VUmSvhvSGbYbdsh7uRjhGmsYkc9fL8aJ5CorxxrU5N", - "name": "go-crypto", - "version": "0.2.1" - } - ], - "gxVersion": "0.4.0", - "language": "go", - "license": "MIT", - "name": "go-libp2p-crypto", - "releaseCmd": "git commit -a -m \"gx publish $VERSION\"", - "version": "2.0.7" -} - diff --git a/vendor/github.com/libp2p/go-libp2p-crypto/rsa_deprecated.go b/vendor/github.com/libp2p/go-libp2p-crypto/rsa_deprecated.go new file mode 100644 index 00000000..8c3e4c4c --- /dev/null +++ b/vendor/github.com/libp2p/go-libp2p-crypto/rsa_deprecated.go @@ -0,0 +1,31 @@ +package crypto + +import ( + "io" + + core "github.com/libp2p/go-libp2p-core/crypto" +) + +// Deprecated: use github.com/libp2p/go-libp2p-core/crypto.ErrRsaKeyTooSmall instead. +var ErrRsaKeyTooSmall = core.ErrRsaKeyTooSmall + +// Deprecated: use github.com/libp2p/go-libp2p-core/crypto.RsaPrivateKey instead. +type RsaPrivateKey = core.RsaPrivateKey + +// Deprecated: use github.com/libp2p/go-libp2p-core/crypto.RsaPublicKey instead. +type RsaPublicKey = core.RsaPublicKey + +// Deprecated: use github.com/libp2p/go-libp2p-core/crypto.GenerateRSAKeyPair instead. +func GenerateRSAKeyPair(bits int, src io.Reader) (PrivKey, PubKey, error) { + return core.GenerateRSAKeyPair(bits, src) +} + +// Deprecated: use github.com/libp2p/go-libp2p-core/crypto.UnmarshalRsaPrivateKey instead. +func UnmarshalRsaPrivateKey(b []byte) (PrivKey, error) { + return core.UnmarshalRsaPrivateKey(b) +} + +// Deprecated: use github.com/libp2p/go-libp2p-core/crypto.UnmarshalRsaPublicKey instead. +func UnmarshalRsaPublicKey(b []byte) (PubKey, error) { + return core.UnmarshalRsaPublicKey(b) +} diff --git a/vendor/github.com/libp2p/go-libp2p-crypto/secp256k1_deprecated.go b/vendor/github.com/libp2p/go-libp2p-crypto/secp256k1_deprecated.go new file mode 100644 index 00000000..741321c2 --- /dev/null +++ b/vendor/github.com/libp2p/go-libp2p-crypto/secp256k1_deprecated.go @@ -0,0 +1,28 @@ +package crypto + +import ( + "io" + + core "github.com/libp2p/go-libp2p-core/crypto" +) + +// Deprecated: use github.com/libp2p/go-libp2p-core/crypto.Secp256k1PrivateKey instead. +type Secp256k1PrivateKey = core.Secp256k1PrivateKey + +// Deprecated: use github.com/libp2p/go-libp2p-core/crypto.Secp256k1PublicKey instead. +type Secp256k1PublicKey = core.Secp256k1PublicKey + +// Deprecated: use github.com/libp2p/go-libp2p-core/crypto.GenerateSecp256k1Key instead. +func GenerateSecp256k1Key(src io.Reader) (PrivKey, PubKey, error) { + return core.GenerateSecp256k1Key(src) +} + +// Deprecated: use github.com/libp2p/go-libp2p-core/crypto.UnmarshalSecp256k1PrivateKey instead. +func UnmarshalSecp256k1PrivateKey(data []byte) (PrivKey, error) { + return core.UnmarshalSecp256k1PrivateKey(data) +} + +// Deprecated: use github.com/libp2p/go-libp2p-core/crypto.UnmarshalSecp256k1PublicKey instead. +func UnmarshalSecp256k1PublicKey(data []byte) (PubKey, error) { + return core.UnmarshalSecp256k1PublicKey(data) +} diff --git a/vendor/github.com/libp2p/go-libp2p-discovery/deprecated.go b/vendor/github.com/libp2p/go-libp2p-discovery/deprecated.go new file mode 100644 index 00000000..7ad4149e --- /dev/null +++ b/vendor/github.com/libp2p/go-libp2p-discovery/deprecated.go @@ -0,0 +1,32 @@ +package discovery + +import ( + "time" + + core "github.com/libp2p/go-libp2p-core/discovery" +) + +// Deprecated: use skel.Advertiser instead. +type Advertiser = core.Advertiser + +// Deprecated: use skel.Discoverer instead. +type Discoverer = core.Discoverer + +// Deprecated: use skel.Discovery instead. +type Discovery = core.Discovery + +// Deprecated: use github.com/libp2p/go-libp2p-core/discovery.Option instead. +type Option = core.Option + +// Deprecated: use github.com/libp2p/go-libp2p-core/discovery.Options instead. +type Options = core.Options + +// Deprecated: use github.com/libp2p/go-libp2p-core/discovery.TTL instead. +func TTL(ttl time.Duration) core.Option { + return core.TTL(ttl) +} + +// Deprecated: use github.com/libp2p/go-libp2p-core/discovery.Limit instead. +func Limit(limit int) core.Option { + return core.Limit(limit) +} diff --git a/vendor/github.com/libp2p/go-libp2p-discovery/go.mod b/vendor/github.com/libp2p/go-libp2p-discovery/go.mod index 8dd2e8b1..f8ea495a 100644 --- a/vendor/github.com/libp2p/go-libp2p-discovery/go.mod +++ b/vendor/github.com/libp2p/go-libp2p-discovery/go.mod @@ -1,13 +1,10 @@ module github.com/libp2p/go-libp2p-discovery require ( - github.com/ipfs/go-cid v0.0.1 + github.com/ipfs/go-cid v0.0.2 github.com/ipfs/go-log v0.0.1 - github.com/libp2p/go-libp2p-blankhost v0.0.1 - github.com/libp2p/go-libp2p-host v0.0.1 - github.com/libp2p/go-libp2p-peer v0.0.1 - github.com/libp2p/go-libp2p-peerstore v0.0.1 - github.com/libp2p/go-libp2p-routing v0.0.1 - github.com/libp2p/go-libp2p-swarm v0.0.1 - github.com/multiformats/go-multihash v0.0.1 + github.com/libp2p/go-libp2p-blankhost v0.1.1 + github.com/libp2p/go-libp2p-core v0.0.1 + github.com/libp2p/go-libp2p-swarm v0.1.0 + github.com/multiformats/go-multihash v0.0.5 ) diff --git a/vendor/github.com/libp2p/go-libp2p-discovery/go.sum b/vendor/github.com/libp2p/go-libp2p-discovery/go.sum index 49b4d9b3..eed16efc 100644 --- a/vendor/github.com/libp2p/go-libp2p-discovery/go.sum +++ b/vendor/github.com/libp2p/go-libp2p-discovery/go.sum @@ -10,8 +10,8 @@ github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVa github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= -github.com/coreos/go-semver v0.2.0 h1:3Jm3tLmsgAYcjC+4Up7hJrFBPr+n7rAqYeSw/SZazuY= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -38,18 +38,21 @@ github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/ipfs/go-cid v0.0.1 h1:GBjWPktLnNyX0JiQCNFpUuUSoMw5KMyqrsejHYlILBE= github.com/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= +github.com/ipfs/go-cid v0.0.2 h1:tuuKaZPU1M6HcejsO3AcYWW8sZ8MTvyxfc4uqB4eFE8= +github.com/ipfs/go-cid v0.0.2/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= github.com/ipfs/go-datastore v0.0.1/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= -github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk= -github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps= github.com/ipfs/go-ds-badger v0.0.2/go.mod h1:Y3QpeSFWQf6MopLTiZD+VT6IC1yZqaGmjvRcKeSGij8= github.com/ipfs/go-ds-leveldb v0.0.1/go.mod h1:feO8V3kubwsEF22n0YRQCffeb79OOYIykR4L04tMOYc= github.com/ipfs/go-ipfs-delay v0.0.0-20181109222059-70721b86a9a8/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= github.com/ipfs/go-log v0.0.1 h1:9XTUN/rW64BCG1YhPK9Hoy3q8nr4gOmHHBpgFdfw6Lc= github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM= +github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA= github.com/jbenet/go-temp-err-catcher v0.0.0-20150120210811-aac704a3f4f2 h1:vhC1OXXiT9R2pczegwz6moDvuRpggaroAXhPIseh57A= github.com/jbenet/go-temp-err-catcher v0.0.0-20150120210811-aac704a3f4f2/go.mod h1:8GXXJV31xl8whumTzdZsTt3RnUIiPqzkyf7mxToRCMs= github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8 h1:bspPhN+oKYFk5fcGNuQzp6IGzYQSenLEgH3s6jkXrWw= github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8/go.mod h1:Ly/wlsjFq/qrU3Rar62tu1gASgGw6chQbSh/XgIIXCY= +github.com/jbenet/goprocess v0.1.3 h1:YKyIEECS/XvcfHtBzxtjBBbWK+MbvA6dG8ASiqwvr10= +github.com/jbenet/goprocess v0.1.3/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= @@ -64,61 +67,57 @@ github.com/libp2p/go-addr-util v0.0.1 h1:TpTQm9cXVRVSKsYbgQ7GKc3KbbHVTnbostgGaDE github.com/libp2p/go-addr-util v0.0.1/go.mod h1:4ac6O7n9rIAKB1dnd+s8IbbMXkt+oBpzX4/+RACcnlQ= github.com/libp2p/go-buffer-pool v0.0.1 h1:9Rrn/H46cXjaA2HQ5Y8lyhOS1NhTkZ4yuEs2r3Eechg= github.com/libp2p/go-buffer-pool v0.0.1/go.mod h1:xtyIz9PMobb13WaxR6Zo1Pd1zXJKYg0a8KiIvDp3TzQ= -github.com/libp2p/go-conn-security v0.0.1 h1:4kMMrqrt9EUNCNjX1xagSJC+bq16uqjMe9lk1KBMVNs= -github.com/libp2p/go-conn-security v0.0.1/go.mod h1:bGmu51N0KU9IEjX7kl2PQjgZa40JQWnayTvNMgD/vyk= -github.com/libp2p/go-conn-security-multistream v0.0.1 h1:XefjAQRHcnUaxKb26RGupToucx3uU4ecbOZ3aACXlDU= -github.com/libp2p/go-conn-security-multistream v0.0.1/go.mod h1:nc9vud7inQ+d6SO0I/6dSWrdMnHnzZNHeyUQqrAJulE= +github.com/libp2p/go-buffer-pool v0.0.2 h1:QNK2iAFa8gjAe1SPz6mHSMuCcjs+X1wlHzeOSqcmlfs= +github.com/libp2p/go-buffer-pool v0.0.2/go.mod h1:MvaB6xw5vOrDl8rYZGLFdKAuk/hRoRZd1Vi32+RXyFM= +github.com/libp2p/go-conn-security-multistream v0.1.0 h1:aqGmto+ttL/uJgX0JtQI0tD21CIEy5eYd1Hlp0juHY0= +github.com/libp2p/go-conn-security-multistream v0.1.0/go.mod h1:aw6eD7LOsHEX7+2hJkDxw1MteijaVcI+/eP2/x3J1xc= github.com/libp2p/go-flow-metrics v0.0.1 h1:0gxuFd2GuK7IIP5pKljLwps6TvcuYgvG7Atqi3INF5s= github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZxBdp967ls1g+k8= -github.com/libp2p/go-libp2p-blankhost v0.0.1 h1:/mZuuiwntNR8RywnCFlGHLKrKLYne+qciBpQXWqp5fk= -github.com/libp2p/go-libp2p-blankhost v0.0.1/go.mod h1:Ibpbw/7cPPYwFb7PACIWdvxxv0t0XCCI10t7czjAjTc= -github.com/libp2p/go-libp2p-crypto v0.0.1 h1:JNQd8CmoGTohO/akqrH16ewsqZpci2CbgYH/LmYl8gw= -github.com/libp2p/go-libp2p-crypto v0.0.1/go.mod h1:yJkNyDmO341d5wwXxDUGO0LykUVT72ImHNUqh5D/dBE= -github.com/libp2p/go-libp2p-host v0.0.1 h1:dnqusU+DheGcdxrE718kG4XgHNuL2n9eEv8Rg5zy8hQ= -github.com/libp2p/go-libp2p-host v0.0.1/go.mod h1:qWd+H1yuU0m5CwzAkvbSjqKairayEHdR5MMl7Cwa7Go= -github.com/libp2p/go-libp2p-interface-connmgr v0.0.1 h1:Q9EkNSLAOF+u90L88qmE9z/fTdjLh8OsJwGw74mkwk4= -github.com/libp2p/go-libp2p-interface-connmgr v0.0.1/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k= -github.com/libp2p/go-libp2p-interface-pnet v0.0.1 h1:7GnzRrBTJHEsofi1ahFdPN9Si6skwXQE9UqR2S+Pkh8= -github.com/libp2p/go-libp2p-interface-pnet v0.0.1/go.mod h1:el9jHpQAXK5dnTpKA4yfCNBZXvrzdOU75zz+C6ryp3k= -github.com/libp2p/go-libp2p-loggables v0.0.1 h1:HVww9oAnINIxbt69LJNkxD8lnbfgteXR97Xm4p3l9ps= -github.com/libp2p/go-libp2p-loggables v0.0.1/go.mod h1:lDipDlBNYbpyqyPX/KcoO+eq0sJYEVR2JgOexcivchg= -github.com/libp2p/go-libp2p-metrics v0.0.1 h1:yumdPC/P2VzINdmcKZd0pciSUCpou+s0lwYCjBbzQZU= -github.com/libp2p/go-libp2p-metrics v0.0.1/go.mod h1:jQJ95SXXA/K1VZi13h52WZMa9ja78zjyy5rspMsC/08= -github.com/libp2p/go-libp2p-net v0.0.1 h1:xJ4Vh4yKF/XKb8fd1Ev0ebAGzVjMxXzrxG2kjtU+F5Q= -github.com/libp2p/go-libp2p-net v0.0.1/go.mod h1:Yt3zgmlsHOgUWSXmt5V/Jpz9upuJBE8EgNU9DrCcR8c= -github.com/libp2p/go-libp2p-peer v0.0.1 h1:0qwAOljzYewINrU+Kndoc+1jAL7vzY/oY2Go4DCGfyY= -github.com/libp2p/go-libp2p-peer v0.0.1/go.mod h1:nXQvOBbwVqoP+T5Y5nCjeH4sP9IX/J0AMzcDUVruVoo= -github.com/libp2p/go-libp2p-peerstore v0.0.1 h1:twKovq8YK5trLrd3nB7PD2Zu9JcyAIdm7Bz9yBWjhq8= -github.com/libp2p/go-libp2p-peerstore v0.0.1/go.mod h1:RabLyPVJLuNQ+GFyoEkfi8H4Ti6k/HtZJ7YKgtSq+20= -github.com/libp2p/go-libp2p-protocol v0.0.1 h1:+zkEmZ2yFDi5adpVE3t9dqh/N9TbpFWywowzeEzBbLM= -github.com/libp2p/go-libp2p-protocol v0.0.1/go.mod h1:Af9n4PiruirSDjHycM1QuiMi/1VZNHYcK8cLgFJLZ4s= -github.com/libp2p/go-libp2p-routing v0.0.1 h1:hPMAWktf9rYi3ME4MG48qE7dq1ofJxiQbfdvpNntjhc= -github.com/libp2p/go-libp2p-routing v0.0.1/go.mod h1:N51q3yTr4Zdr7V8Jt2JIktVU+3xBBylx1MZeVA6t1Ys= -github.com/libp2p/go-libp2p-secio v0.0.1 h1:CqE/RdsizOwItdgLe632iyft/w0tshDLmZGAiKDcUAI= -github.com/libp2p/go-libp2p-secio v0.0.1/go.mod h1:IdG6iQybdcYmbTzxp4J5dwtUEDTOvZrT0opIDVNPrJs= -github.com/libp2p/go-libp2p-swarm v0.0.1 h1:Vne+hjaDwXqzgNwQ2vb2YKbnbOTyXjtS47stT66Apc4= -github.com/libp2p/go-libp2p-swarm v0.0.1/go.mod h1:mh+KZxkbd3lQnveQ3j2q60BM1Cw2mX36XXQqwfPOShs= -github.com/libp2p/go-libp2p-transport v0.0.1/go.mod h1:UzbUs9X+PHOSw7S3ZmeOxfnwaQY5vGDzZmKPod3N3tk= -github.com/libp2p/go-libp2p-transport v0.0.4 h1:/CPHQMN75/IQwkhBxxIo6p6PtL3rwFZtlzBROT3e8mw= -github.com/libp2p/go-libp2p-transport v0.0.4/go.mod h1:StoY3sx6IqsP6XKoabsPnHCwqKXWUMWU7Rfcsubee/A= -github.com/libp2p/go-libp2p-transport-upgrader v0.0.1 h1:rNtXkY6dty46mxYOHHAZQchI7gQdJStF683FhVnei/k= -github.com/libp2p/go-libp2p-transport-upgrader v0.0.1/go.mod h1:NJpUAgQab/8K6K0m+JmZCe5RUXG10UMEx4kWe9Ipj5c= -github.com/libp2p/go-maddr-filter v0.0.1 h1:apvYTg0aIxxQyBX+XHKOR+0+lYhGs1Yv+JmTH9nyl5I= -github.com/libp2p/go-maddr-filter v0.0.1/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= -github.com/libp2p/go-mplex v0.0.1 h1:dn2XGSrUxLtz3/8u85bGrwhUEKPX8MOF3lpmcWBZCWc= -github.com/libp2p/go-mplex v0.0.1/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0= -github.com/libp2p/go-msgio v0.0.1 h1:znj97n5FtXGCLDwe9x8jpHmY770SW4WStBGcCDh6GJw= -github.com/libp2p/go-msgio v0.0.1/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= +github.com/libp2p/go-libp2p-blankhost v0.1.1 h1:X919sCh+KLqJcNRApj43xCSiQRYqOSI88Fdf55ngf78= +github.com/libp2p/go-libp2p-blankhost v0.1.1/go.mod h1:pf2fvdLJPsC1FsVrNP3DUUvMzUts2dsLLBEpo1vW1ro= +github.com/libp2p/go-libp2p-core v0.0.1 h1:HSTZtFIq/W5Ue43Zw+uWZyy2Vl5WtF0zDjKN8/DT/1I= +github.com/libp2p/go-libp2p-core v0.0.1/go.mod h1:g/VxnTZ/1ygHxH3dKok7Vno1VfpvGcGip57wjTU4fco= +github.com/libp2p/go-libp2p-crypto v0.1.0 h1:k9MFy+o2zGDNGsaoZl0MA3iZ75qXxr9OOoAZF+sD5OQ= +github.com/libp2p/go-libp2p-crypto v0.1.0/go.mod h1:sPUokVISZiy+nNuTTH/TY+leRSxnFj/2GLjtOTW90hI= +github.com/libp2p/go-libp2p-loggables v0.1.0 h1:h3w8QFfCt2UJl/0/NW4K829HX/0S4KD31PQ7m8UXXO8= +github.com/libp2p/go-libp2p-loggables v0.1.0/go.mod h1:EyumB2Y6PrYjr55Q3/tiJ/o3xoDasoRYM7nOzEpoa90= +github.com/libp2p/go-libp2p-mplex v0.2.0/go.mod h1:Ejl9IyjvXJ0T9iqUTE1jpYATQ9NM3g+OtR+EMMODbKo= +github.com/libp2p/go-libp2p-mplex v0.2.1 h1:E1xaJBQnbSiTHGI1gaBKmKhu1TUKkErKJnE8iGvirYI= +github.com/libp2p/go-libp2p-mplex v0.2.1/go.mod h1:SC99Rxs8Vuzrf/6WhmH41kNn13TiYdAWNYHrwImKLnE= +github.com/libp2p/go-libp2p-peer v0.2.0 h1:EQ8kMjaCUwt/Y5uLgjT8iY2qg0mGUT0N1zUjer50DsY= +github.com/libp2p/go-libp2p-peer v0.2.0/go.mod h1:RCffaCvUyW2CJmG2gAWVqwePwW7JMgxjsHm7+J5kjWY= +github.com/libp2p/go-libp2p-peerstore v0.1.0 h1:MKh7pRNPHSh1fLPj8u/M/s/napdmeNpoi9BRy9lPN0E= +github.com/libp2p/go-libp2p-peerstore v0.1.0/go.mod h1:2CeHkQsr8svp4fZ+Oi9ykN1HBb6u0MOvdJ7YIsmcwtY= +github.com/libp2p/go-libp2p-secio v0.1.0 h1:NNP5KLxuP97sE5Bu3iuwOWyT/dKEGMN5zSLMWdB7GTQ= +github.com/libp2p/go-libp2p-secio v0.1.0/go.mod h1:tMJo2w7h3+wN4pgU2LSYeiKPrfqBgkOsdiKK77hE7c8= +github.com/libp2p/go-libp2p-swarm v0.1.0 h1:HrFk2p0awrGEgch9JXK/qp/hfjqQfgNxpLWnCiWPg5s= +github.com/libp2p/go-libp2p-swarm v0.1.0/go.mod h1:wQVsCdjsuZoc730CgOvh5ox6K8evllckjebkdiY5ta4= +github.com/libp2p/go-libp2p-testing v0.0.2/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= +github.com/libp2p/go-libp2p-testing v0.0.3 h1:bdij4bKaaND7tCsaXVjRfYkMpvoOeKj9AVQGJllA6jM= +github.com/libp2p/go-libp2p-testing v0.0.3/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= +github.com/libp2p/go-libp2p-transport-upgrader v0.1.1 h1:PZMS9lhjK9VytzMCW3tWHAXtKXmlURSc3ZdvwEcKCzw= +github.com/libp2p/go-libp2p-transport-upgrader v0.1.1/go.mod h1:IEtA6or8JUbsV07qPW4r01GnTenLW4oi3lOPbUMGJJA= +github.com/libp2p/go-libp2p-yamux v0.2.0 h1:TSPZ5cMMz/wdoYsye/wU1TE4G3LDGMoeEN0xgnCKU/I= +github.com/libp2p/go-libp2p-yamux v0.2.0/go.mod h1:Db2gU+XfLpm6E4rG5uGCFX6uXA8MEXOxFcRoXUODaK8= +github.com/libp2p/go-maddr-filter v0.0.4 h1:hx8HIuuwk34KePddrp2mM5ivgPkZ09JH4AvsALRbFUs= +github.com/libp2p/go-maddr-filter v0.0.4/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= +github.com/libp2p/go-mplex v0.0.3/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0= +github.com/libp2p/go-mplex v0.1.0 h1:/nBTy5+1yRyY82YaO6HXQRnO5IAGsXTjEJaR3LdTPc0= +github.com/libp2p/go-mplex v0.1.0/go.mod h1:SXgmdki2kwCUlCCbfGLEgHjC4pFqhTp0ZoV6aiKgxDU= +github.com/libp2p/go-msgio v0.0.2 h1:ivPvEKHxmVkTClHzg6RXTYHqaJQ0V9cDbq+6lKb3UV0= +github.com/libp2p/go-msgio v0.0.2/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= github.com/libp2p/go-reuseport v0.0.1 h1:7PhkfH73VXfPJYKQ6JwS5I/eVcoyYi9IMNGc6FWpFLw= github.com/libp2p/go-reuseport v0.0.1/go.mod h1:jn6RmB1ufnQwl0Q1f+YxAj8isJgDCQzaaxIFYDhcYEA= -github.com/libp2p/go-reuseport-transport v0.0.1 h1:UIRneNxLDmEGNjGHpIiWzSWkZ5bhxMCP9x3Vh7BSc7E= -github.com/libp2p/go-reuseport-transport v0.0.1/go.mod h1:YkbSDrvjUVDL6b8XqriyA20obEtsW9BLkuOUyQAOCbs= +github.com/libp2p/go-reuseport-transport v0.0.2 h1:WglMwyXyBu61CMkjCCtnmqNqnjib0GIEjMiHTwR/KN4= +github.com/libp2p/go-reuseport-transport v0.0.2/go.mod h1:YkbSDrvjUVDL6b8XqriyA20obEtsW9BLkuOUyQAOCbs= github.com/libp2p/go-stream-muxer v0.0.1 h1:Ce6e2Pyu+b5MC1k3eeFtAax0pW4gc6MosYSLV05UeLw= github.com/libp2p/go-stream-muxer v0.0.1/go.mod h1:bAo8x7YkSpadMTbtTaxGVHWUQsR/l5MEaHbKaliuT14= -github.com/libp2p/go-tcp-transport v0.0.1 h1:WyvJVw2lYAnr6CU+GZZ4oCt06fvORlmvBlFX2+ZpZDM= -github.com/libp2p/go-tcp-transport v0.0.1/go.mod h1:mnjg0o0O5TmXUaUIanYPUqkW4+u6mK0en8rlpA6BBTs= -github.com/libp2p/go-testutil v0.0.1 h1:Xg+O0G2HIMfHqBOBDcMS1iSZJ3GEcId4qOxCQvsGZHk= -github.com/libp2p/go-testutil v0.0.1/go.mod h1:iAcJc/DKJQanJ5ws2V+u5ywdL2n12X1WbbEG+Jjy69I= +github.com/libp2p/go-stream-muxer-multistream v0.2.0 h1:714bRJ4Zy9mdhyTLJ+ZKiROmAFwUHpeRidG+q7LTQOg= +github.com/libp2p/go-stream-muxer-multistream v0.2.0/go.mod h1:j9eyPol/LLRqT+GPLSxvimPhNph4sfYfMoDPd7HkzIc= +github.com/libp2p/go-tcp-transport v0.1.0 h1:IGhowvEqyMFknOar4FWCKSWE0zL36UFKQtiRQD60/8o= +github.com/libp2p/go-tcp-transport v0.1.0/go.mod h1:oJ8I5VXryj493DEJ7OsBieu8fcg2nHGctwtInJVpipc= +github.com/libp2p/go-yamux v1.2.2 h1:s6J6o7+ajoQMjHe7BEnq+EynOj5D2EoG8CuQgL3F2vg= +github.com/libp2p/go-yamux v1.2.2/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= github.com/mattn/go-colorable v0.1.1 h1:G1f5SKeVxmagw/IyvzvtZE4Gybcc4Tr1tf7I8z0XgOg= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= github.com/mattn/go-isatty v0.0.5 h1:tHXDdz1cpzGaovsTB+TVB8q90WEokoVmfMqoVcrLUgw= @@ -127,33 +126,59 @@ github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0 github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16 h1:5W7KhL8HVF3XCFOweFD3BNESdnO8ewyYTFT2R+/b8FQ= github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= +github.com/minio/sha256-simd v0.0.0-20190328051042-05b4dd3047e5/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= +github.com/minio/sha256-simd v0.1.0 h1:U41/2erhAKcmSI14xh/ZTUdBPOzDOIfS93ibzUSl8KM= +github.com/minio/sha256-simd v0.1.0/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= github.com/mr-tron/base58 v1.1.0 h1:Y51FGVJ91WBqCEabAi5OPUz38eAx8DakuAm5svLcsfQ= github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= +github.com/mr-tron/base58 v1.1.1 h1:OJIdWOWYe2l5PQNgimGtuwHY8nDskvJ5vvs//YnzRLs= +github.com/mr-tron/base58 v1.1.1/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= +github.com/mr-tron/base58 v1.1.2 h1:ZEw4I2EgPKDJ2iEw0cNmLB3ROrEmkOtXIkaG7wZg+78= +github.com/mr-tron/base58 v1.1.2/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= github.com/multiformats/go-base32 v0.0.3 h1:tw5+NhuwaOjJCC5Pp82QuXbrmLzWg7uxlMFp8Nq/kkI= github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= -github.com/multiformats/go-multiaddr v0.0.1 h1:/QUV3VBMDI6pi6xfiw7lr6xhDWWvQKn9udPn68kLSdY= github.com/multiformats/go-multiaddr v0.0.1/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= +github.com/multiformats/go-multiaddr v0.0.2 h1:RBysRCv5rv3FWlhKWKoXv8tnsCUpEpIZpCmqAGZos2s= +github.com/multiformats/go-multiaddr v0.0.2/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= +github.com/multiformats/go-multiaddr v0.0.4 h1:WgMSI84/eRLdbptXMkMWDXPjPq7SPLIgGUVm2eroyU4= +github.com/multiformats/go-multiaddr v0.0.4/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= github.com/multiformats/go-multiaddr-dns v0.0.1 h1:jQt9c6tDSdQLIlBo4tXYx7QUHCPjxsB1zXcag/2S7zc= github.com/multiformats/go-multiaddr-dns v0.0.1/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= +github.com/multiformats/go-multiaddr-dns v0.0.2 h1:/Bbsgsy3R6e3jf2qBahzNHzww6usYaZ0NhNH3sqdFS8= +github.com/multiformats/go-multiaddr-dns v0.0.2/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= +github.com/multiformats/go-multiaddr-fmt v0.0.1 h1:5YjeOIzbX8OTKVaN72aOzGIYW7PnrZrnkDyOfAWRSMA= +github.com/multiformats/go-multiaddr-fmt v0.0.1/go.mod h1:aBYjqL4T/7j4Qx+R73XSv/8JsgnRFlf0w2KGLCmXl3Q= github.com/multiformats/go-multiaddr-net v0.0.1 h1:76O59E3FavvHqNg7jvzWzsPSW5JSi/ek0E4eiDVbg9g= github.com/multiformats/go-multiaddr-net v0.0.1/go.mod h1:nw6HSxNmCIQH27XPGBuX+d1tnvM7ihcFwHMSstNAVUU= github.com/multiformats/go-multibase v0.0.1 h1:PN9/v21eLywrFWdFNsFKaU04kLJzuYzmrJR+ubhT9qA= github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs= github.com/multiformats/go-multihash v0.0.1 h1:HHwN1K12I+XllBCrqKnhX949Orn4oawPkegHMu2vDqQ= github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= -github.com/multiformats/go-multistream v0.0.1 h1:JV4VfSdY9n7ECTtY59/TlSyFCzRILvYx4T4Ws8ZgihU= -github.com/multiformats/go-multistream v0.0.1/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= +github.com/multiformats/go-multihash v0.0.5 h1:1wxmCvTXAifAepIMyF39vZinRw5sbqjPs/UIi93+uik= +github.com/multiformats/go-multihash v0.0.5/go.mod h1:lt/HCbqlQwlPBz7lv0sQCdtfcMtlJvakRUn/0Ual8po= +github.com/multiformats/go-multistream v0.1.0 h1:UpO6jrsjqs46mqAK3n6wKRYFhugss9ArzbyUzU+4wkQ= +github.com/multiformats/go-multistream v0.1.0/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= 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/ginkgo v1.8.0 h1:VkHVNpR4iVnU8XQR6DBm8BqYjN7CRzw+xKUbVVbbW9w= +github.com/onsi/ginkgo v1.8.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/onsi/gomega v1.5.0 h1:izbySO9zDPmjJ8rDjLvkA2zJHIo+HkYXHnf7eN7SSyo= +github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/opentracing/opentracing-go v1.0.2 h1:3jA2P6O1F9UOrWVpwrIo17pu01KWvNWg4X946/Y5Zwg= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= 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/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a h1:/eS3yfGjQKG+9kayBkj0ip1BGhq6zJ3eaVksphxAaek= +github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a/go.mod h1:7AyxJNCJ7SBZ1MfVQCWD6Uqo2oubI2Eq2y2eqf+A5r0= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 h1:RC6RW7j+1+HkWaX/Yh71Ee5ZHaHYt7ZP4sQgUrm6cDU= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572/go.mod h1:w0SWMsp6j9O/dk4/ZpIhL+3CkG8ofA2vuv7k+ltqUMc= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= @@ -161,36 +186,32 @@ github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpP github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1/go.mod h1:8UvriyWtv5Q5EOgjHaSseUEdkQfvwFv1I/In/O2M9gc= github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc h1:9lDbC6Rz4bwmou+oE6Dt4Cb2BGMur5eR/GYptkKUVHo= github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc/go.mod h1:bopw91TMyo8J3tvftk8xmU2kPmlrt4nScJQZU2hE5EM= -github.com/whyrusleeping/go-smux-multiplex v3.0.16+incompatible h1:iqksILj8STw03EJQe7Laj4ubnw+ojOyik18cd5vPL1o= -github.com/whyrusleeping/go-smux-multiplex v3.0.16+incompatible/go.mod h1:34LEDbeKFZInPUrAG+bjuJmUXONGdEFW7XL0SpTY1y4= -github.com/whyrusleeping/go-smux-multistream v2.0.2+incompatible h1:BdYHctE9HJZLquG9tpTdwWcbG4FaX6tVKPGjCGgiVxo= -github.com/whyrusleeping/go-smux-multistream v2.0.2+incompatible/go.mod h1:dRWHHvc4HDQSHh9gbKEBbUZ+f2Q8iZTPG3UOGYODxSQ= -github.com/whyrusleeping/go-smux-yamux v2.0.8+incompatible h1:IGm/UP/JpEFS6D787sZnZg7RA6fZIR9c/Ms9DeAVNuk= -github.com/whyrusleeping/go-smux-yamux v2.0.8+incompatible/go.mod h1:6qHUzBXUbB9MXmw3AUdB52L8sEb/hScCqOdW2kj/wuI= github.com/whyrusleeping/mafmt v1.2.8 h1:TCghSl5kkwEE0j+sU/gudyhVMRlpBin8fMBBHg59EbA= github.com/whyrusleeping/mafmt v1.2.8/go.mod h1:faQJFPbLSxzD9xpA02ttW/tS9vZykNvXwGvqIpk20FA= github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7 h1:E9S12nwJwEOXe2d6gT6qxdvqMnNq+VnSsKPgm2ZZNds= github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7/go.mod h1:X2c0RVCI1eSUFI8eLcY3c0423ykwiUdxLJtkDvruhjI= -github.com/whyrusleeping/yamux v1.1.5 h1:4CK3aUUJQu0qpKZv5gEWJjNOQtdbdDhVVS6PJ+HimdE= -github.com/whyrusleeping/yamux v1.1.5/go.mod h1:E8LnQQ8HKx5KD29HZFUwM1PxCOdPRzGwur1mcYhXcD8= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b h1:+/WWzjwW6gidDJnMKWLKLX1gxn7irUTF1fLpQovfQ5M= golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25 h1:jsG6UpNLt9iAsb0S2AGW28DveNzzgmbXR+ENoPjUeIU= -golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f h1:R423Cnkcp5JABoeemiGEPlt9tHXFfw5kvc0yqlxRPWo= +golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190227160552-c95aed5357e7 h1:C2F/nMkR/9sfUTpvR3QrjBuTdvMUC/cFajkphs1YLQo= golang.org/x/net v0.0.0-20190227160552-c95aed5357e7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3 h1:0GoQqolDA55aaLxZyTzK/Y2ePZzZTUrRacwib7cNsYQ= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f h1:wMNYb4v58l5UBM7MYRLPG6ZhfOqbKu7X5eyFl8ZhKvA= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/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-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190219092855-153ac476189d/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223 h1:DH4skfRX4EBpamg7iV4ZlCpblAHI6s6TDM39bFZumv8= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190228124157-a34e9553db1e h1:ZytStCyV048ZqDsWHiYDdoI2Vd4msMcrDECFxS+tL9c= golang.org/x/sys v0.0.0-20190228124157-a34e9553db1e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d h1:+R4KGOnez64A81RvjARKc4UT5/tI9ujCIVX+P5KiHuI= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= diff --git a/vendor/github.com/libp2p/go-libp2p-discovery/routing.go b/vendor/github.com/libp2p/go-libp2p-discovery/routing.go index c618ba7c..70e70870 100644 --- a/vendor/github.com/libp2p/go-libp2p-discovery/routing.go +++ b/vendor/github.com/libp2p/go-libp2p-discovery/routing.go @@ -5,8 +5,10 @@ import ( "time" cid "github.com/ipfs/go-cid" - pstore "github.com/libp2p/go-libp2p-peerstore" - routing "github.com/libp2p/go-libp2p-routing" + + "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p-core/routing" + mh "github.com/multiformats/go-multihash" ) @@ -21,6 +23,19 @@ func NewRoutingDiscovery(router routing.ContentRouting) *RoutingDiscovery { } func (d *RoutingDiscovery) Advertise(ctx context.Context, ns string, opts ...Option) (time.Duration, error) { + var options Options + err := options.Apply(opts...) + if err != nil { + return 0, err + } + + ttl := options.Ttl + if ttl == 0 || ttl > 3*time.Hour { + // the DHT provider record validity is 24hrs, but it is recommnded to republish at least every 6hrs + // we go one step further and republish every 3hrs + ttl = 3 * time.Hour + } + cid, err := nsToCid(ns) if err != nil { return 0, err @@ -37,12 +52,10 @@ func (d *RoutingDiscovery) Advertise(ctx context.Context, ns string, opts ...Opt return 0, err } - // the DHT provider record validity is 24hrs, but it is recommnded to republish at least every 6hrs - // we go one step further and republish every 3hrs - return 3 * time.Hour, nil + return ttl, nil } -func (d *RoutingDiscovery) FindPeers(ctx context.Context, ns string, opts ...Option) (<-chan pstore.PeerInfo, error) { +func (d *RoutingDiscovery) FindPeers(ctx context.Context, ns string, opts ...Option) (<-chan peer.AddrInfo, error) { var options Options err := options.Apply(opts...) if err != nil { diff --git a/vendor/github.com/libp2p/go-libp2p-discovery/util.go b/vendor/github.com/libp2p/go-libp2p-discovery/util.go index be43a4b1..f2f2d2b0 100644 --- a/vendor/github.com/libp2p/go-libp2p-discovery/util.go +++ b/vendor/github.com/libp2p/go-libp2p-discovery/util.go @@ -4,17 +4,18 @@ import ( "context" "time" + "github.com/libp2p/go-libp2p-core/peer" + logging "github.com/ipfs/go-log" - pstore "github.com/libp2p/go-libp2p-peerstore" ) var log = logging.Logger("discovery") -// FindPeers is a utility function that synchonously collects peers from a Discoverer -func FindPeers(ctx context.Context, d Discoverer, ns string, limit int) ([]pstore.PeerInfo, error) { - res := make([]pstore.PeerInfo, 0, limit) +// FindPeers is a utility function that synchronously collects peers from a Discoverer. +func FindPeers(ctx context.Context, d Discoverer, ns string, opts ...Option) ([]peer.AddrInfo, error) { + var res []peer.AddrInfo - ch, err := d.FindPeers(ctx, ns, Limit(limit)) + ch, err := d.FindPeers(ctx, ns, opts...) if err != nil { return nil, err } @@ -26,11 +27,11 @@ func FindPeers(ctx context.Context, d Discoverer, ns string, limit int) ([]pstor return res, nil } -// Advertise is a utility function that persistently advertises a service through an Advertiser -func Advertise(ctx context.Context, a Advertiser, ns string) { +// Advertise is a utility function that persistently advertises a service through an Advertiser. +func Advertise(ctx context.Context, a Advertiser, ns string, opts ...Option) { go func() { for { - ttl, err := a.Advertise(ctx, ns) + ttl, err := a.Advertise(ctx, ns, opts...) if err != nil { log.Debugf("Error advertising %s: %s", ns, err.Error()) if ctx.Err() != nil { diff --git a/vendor/github.com/libp2p/go-libp2p-host/Makefile b/vendor/github.com/libp2p/go-libp2p-host/Makefile deleted file mode 100644 index 4f5206e4..00000000 --- a/vendor/github.com/libp2p/go-libp2p-host/Makefile +++ /dev/null @@ -1,13 +0,0 @@ -export IPFS_API ?= v04x.ipfs.io - -gx: - go get github.com/whyrusleeping/gx - go get github.com/whyrusleeping/gx-go - -deps: gx - gx --verbose install --global - gx-go rewrite - -publish: - gx-go rewrite --undo - diff --git a/vendor/github.com/libp2p/go-libp2p-host/README.md b/vendor/github.com/libp2p/go-libp2p-host/README.md deleted file mode 100644 index 72397ad3..00000000 --- a/vendor/github.com/libp2p/go-libp2p-host/README.md +++ /dev/null @@ -1,33 +0,0 @@ -go-libp2p-host -================== - -[![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](http://ipn.io) -[![](https://img.shields.io/badge/project-IPFS-blue.svg?style=flat-square)](http://libp2p.io/) -[![](https://img.shields.io/badge/freenode-%23ipfs-blue.svg?style=flat-square)](http://webchat.freenode.net/?channels=%23ipfs) -[![Coverage Status](https://coveralls.io/repos/github/libp2p/go-libp2p-host/badge.svg?branch=master)](https://coveralls.io/github/libp2p/go-libp2p-host?branch=master) -[![Travis CI](https://travis-ci.org/libp2p/go-libp2p-host.svg?branch=master)](https://travis-ci.org/libp2p/go-libp2p-host) - -> The host interface for libp2p. - - -## Table of Contents - -- [Install](#install) -- [Contribute](#contribute) -- [License](#license) - -## Install - -```sh -make deps -``` - -## Contribute - -PRs are welcome! - -Small note: If editing the Readme, please conform to the [standard-readme](https://github.com/RichardLitt/standard-readme) specification. - -## License - -MIT © Jeromy Johnson diff --git a/vendor/github.com/libp2p/go-libp2p-host/codecov.yml b/vendor/github.com/libp2p/go-libp2p-host/codecov.yml deleted file mode 100644 index 5f88a9ea..00000000 --- a/vendor/github.com/libp2p/go-libp2p-host/codecov.yml +++ /dev/null @@ -1,3 +0,0 @@ -coverage: - range: "50...100" -comment: off diff --git a/vendor/github.com/libp2p/go-libp2p-host/go.mod b/vendor/github.com/libp2p/go-libp2p-host/go.mod deleted file mode 100644 index 22131c47..00000000 --- a/vendor/github.com/libp2p/go-libp2p-host/go.mod +++ /dev/null @@ -1,12 +0,0 @@ -module github.com/libp2p/go-libp2p-host - -require ( - github.com/coreos/go-semver v0.2.1-0.20180108230905-e214231b295a - github.com/libp2p/go-libp2p-interface-connmgr v0.0.1 - github.com/libp2p/go-libp2p-net v0.0.1 - github.com/libp2p/go-libp2p-peer v0.0.1 - github.com/libp2p/go-libp2p-peerstore v0.0.1 - github.com/libp2p/go-libp2p-protocol v0.0.1 - github.com/multiformats/go-multiaddr v0.0.1 - github.com/multiformats/go-multistream v0.0.1 -) diff --git a/vendor/github.com/libp2p/go-libp2p-host/go.sum b/vendor/github.com/libp2p/go-libp2p-host/go.sum deleted file mode 100644 index 5b101007..00000000 --- a/vendor/github.com/libp2p/go-libp2p-host/go.sum +++ /dev/null @@ -1,118 +0,0 @@ -github.com/AndreasBriese/bbloom v0.0.0-20180913140656-343706a395b7/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= -github.com/Kubuxu/go-os-helper v0.0.1/go.mod h1:N8B+I7vPCT80IcP58r50u4+gEEcsZETFUpAzWW2ep1Y= -github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= -github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32 h1:qkOC5Gd33k54tobS36cXdAzJbeHaduLtnLQQwNoIi78= -github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32/go.mod h1:DrZx5ec/dmnfpw9KyYoQyYo7d0KEvTkk/5M/vbZjAr8= -github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= -github.com/btcsuite/btcutil v0.0.0-20190207003914-4c204d697803/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= -github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= -github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= -github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= -github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= -github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= -github.com/coreos/go-semver v0.2.0 h1:3Jm3tLmsgAYcjC+4Up7hJrFBPr+n7rAqYeSw/SZazuY= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-semver v0.2.1-0.20180108230905-e214231b295a h1:U0BbGfKnviqVBJQB4etvm+mKx53KfkumNLBt6YeF/0Q= -github.com/coreos/go-semver v0.2.1-0.20180108230905-e214231b295a/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dgraph-io/badger v1.5.5-0.20190226225317-8115aed38f8f/go.mod h1:VZxzAIRPHRVNRKRo6AXrX9BJegn6il06VMTZVJYCIjQ= -github.com/dgryski/go-farm v0.0.0-20190104051053-3adb47b1fb0f/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= -github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0= -github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/gxed/hashland/keccakpg v0.0.1 h1:wrk3uMNaMxbXiHibbPO4S0ymqJMm41WiudyFSs7UnsU= -github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfmKFJ6tItnhQ67kU= -github.com/gxed/hashland/murmur3 v0.0.1 h1:SheiaIt0sda5K+8FLz952/1iWS9zrnKsEJaOJu4ZbSc= -github.com/gxed/hashland/murmur3 v0.0.1/go.mod h1:KjXop02n4/ckmZSnY2+HKcLud/tcmvhST0bie/0lS48= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/ipfs/go-datastore v0.0.1/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= -github.com/ipfs/go-ds-badger v0.0.2/go.mod h1:Y3QpeSFWQf6MopLTiZD+VT6IC1yZqaGmjvRcKeSGij8= -github.com/ipfs/go-ds-leveldb v0.0.1/go.mod h1:feO8V3kubwsEF22n0YRQCffeb79OOYIykR4L04tMOYc= -github.com/ipfs/go-ipfs-delay v0.0.0-20181109222059-70721b86a9a8/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= -github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM= -github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8 h1:bspPhN+oKYFk5fcGNuQzp6IGzYQSenLEgH3s6jkXrWw= -github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8/go.mod h1:Ly/wlsjFq/qrU3Rar62tu1gASgGw6chQbSh/XgIIXCY= -github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= -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/libp2p/go-buffer-pool v0.0.1/go.mod h1:xtyIz9PMobb13WaxR6Zo1Pd1zXJKYg0a8KiIvDp3TzQ= -github.com/libp2p/go-libp2p-crypto v0.0.1 h1:JNQd8CmoGTohO/akqrH16ewsqZpci2CbgYH/LmYl8gw= -github.com/libp2p/go-libp2p-crypto v0.0.1/go.mod h1:yJkNyDmO341d5wwXxDUGO0LykUVT72ImHNUqh5D/dBE= -github.com/libp2p/go-libp2p-interface-connmgr v0.0.1 h1:Q9EkNSLAOF+u90L88qmE9z/fTdjLh8OsJwGw74mkwk4= -github.com/libp2p/go-libp2p-interface-connmgr v0.0.1/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k= -github.com/libp2p/go-libp2p-net v0.0.1 h1:xJ4Vh4yKF/XKb8fd1Ev0ebAGzVjMxXzrxG2kjtU+F5Q= -github.com/libp2p/go-libp2p-net v0.0.1/go.mod h1:Yt3zgmlsHOgUWSXmt5V/Jpz9upuJBE8EgNU9DrCcR8c= -github.com/libp2p/go-libp2p-peer v0.0.1 h1:0qwAOljzYewINrU+Kndoc+1jAL7vzY/oY2Go4DCGfyY= -github.com/libp2p/go-libp2p-peer v0.0.1/go.mod h1:nXQvOBbwVqoP+T5Y5nCjeH4sP9IX/J0AMzcDUVruVoo= -github.com/libp2p/go-libp2p-peerstore v0.0.1 h1:twKovq8YK5trLrd3nB7PD2Zu9JcyAIdm7Bz9yBWjhq8= -github.com/libp2p/go-libp2p-peerstore v0.0.1/go.mod h1:RabLyPVJLuNQ+GFyoEkfi8H4Ti6k/HtZJ7YKgtSq+20= -github.com/libp2p/go-libp2p-protocol v0.0.1 h1:+zkEmZ2yFDi5adpVE3t9dqh/N9TbpFWywowzeEzBbLM= -github.com/libp2p/go-libp2p-protocol v0.0.1/go.mod h1:Af9n4PiruirSDjHycM1QuiMi/1VZNHYcK8cLgFJLZ4s= -github.com/libp2p/go-stream-muxer v0.0.1 h1:Ce6e2Pyu+b5MC1k3eeFtAax0pW4gc6MosYSLV05UeLw= -github.com/libp2p/go-stream-muxer v0.0.1/go.mod h1:bAo8x7YkSpadMTbtTaxGVHWUQsR/l5MEaHbKaliuT14= -github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= -github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0OXOcUbGjvZxxijuBwbbmlSxLiuofa+g= -github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= -github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16 h1:5W7KhL8HVF3XCFOweFD3BNESdnO8ewyYTFT2R+/b8FQ= -github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= -github.com/mr-tron/base58 v1.1.0 h1:Y51FGVJ91WBqCEabAi5OPUz38eAx8DakuAm5svLcsfQ= -github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= -github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= -github.com/multiformats/go-multiaddr v0.0.1 h1:/QUV3VBMDI6pi6xfiw7lr6xhDWWvQKn9udPn68kLSdY= -github.com/multiformats/go-multiaddr v0.0.1/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= -github.com/multiformats/go-multiaddr-dns v0.0.1/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= -github.com/multiformats/go-multiaddr-net v0.0.1/go.mod h1:nw6HSxNmCIQH27XPGBuX+d1tnvM7ihcFwHMSstNAVUU= -github.com/multiformats/go-multihash v0.0.1 h1:HHwN1K12I+XllBCrqKnhX949Orn4oawPkegHMu2vDqQ= -github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= -github.com/multiformats/go-multistream v0.0.1 h1:JV4VfSdY9n7ECTtY59/TlSyFCzRILvYx4T4Ws8ZgihU= -github.com/multiformats/go-multistream v0.0.1/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= -github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1/go.mod h1:8UvriyWtv5Q5EOgjHaSseUEdkQfvwFv1I/In/O2M9gc= -github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc/go.mod h1:bopw91TMyo8J3tvftk8xmU2kPmlrt4nScJQZU2hE5EM= -github.com/whyrusleeping/mafmt v1.2.8/go.mod h1:faQJFPbLSxzD9xpA02ttW/tS9vZykNvXwGvqIpk20FA= -golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b h1:+/WWzjwW6gidDJnMKWLKLX1gxn7irUTF1fLpQovfQ5M= -golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190227160552-c95aed5357e7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/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-20190219092855-153ac476189d/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223 h1:DH4skfRX4EBpamg7iV4ZlCpblAHI6s6TDM39bFZumv8= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -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/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.2.1 h1:mUhvW9EsL+naU5Q3cakzfE91YhliOondGd6ZrsDBHQE= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/vendor/github.com/libp2p/go-libp2p-host/helpers.go b/vendor/github.com/libp2p/go-libp2p-host/helpers.go deleted file mode 100644 index 17f97ea0..00000000 --- a/vendor/github.com/libp2p/go-libp2p-host/helpers.go +++ /dev/null @@ -1,11 +0,0 @@ -package host - -import pstore "github.com/libp2p/go-libp2p-peerstore" - -// PeerInfoFromHost returns a PeerInfo struct with the Host's ID and all of its Addrs. -func PeerInfoFromHost(h Host) *pstore.PeerInfo { - return &pstore.PeerInfo{ - ID: h.ID(), - Addrs: h.Addrs(), - } -} diff --git a/vendor/github.com/libp2p/go-libp2p-host/package.json b/vendor/github.com/libp2p/go-libp2p-host/package.json deleted file mode 100644 index c242c30d..00000000 --- a/vendor/github.com/libp2p/go-libp2p-host/package.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "author": "whyrusleeping", - "bugs": { - "url": "https://github.com/libp2p/go-libp2p-host" - }, - "gx": { - "dvcsimport": "github.com/libp2p/go-libp2p-host" - }, - "gxDependencies": [ - { - "author": "whyrusleeping", - "hash": "QmcrrEpx3VMUbrbgVroH3YiYyUS5c4YAykzyPJWKspUYLa", - "name": "go-semver", - "version": "0.0.0" - }, - { - "author": "whyrusleeping", - "hash": "QmTZBfrPJmjWsCvHEtX5FE6KimVJhsJg5sBbqEFYf4UZtL", - "name": "go-multiaddr", - "version": "1.4.1" - }, - { - "author": "whyrusleeping", - "hash": "QmZNkThpqfVXs9GNbexPrfBbXSLNYeKrE7jwFM2oqHbyqN", - "name": "go-libp2p-protocol", - "version": "1.0.0" - }, - { - "author": "whyrusleeping", - "hash": "QmabLh8TrJ3emfAoQk5AbqbLTbMyj7XqumMFmAFxa9epo8", - "name": "go-multistream", - "version": "0.3.9" - }, - { - "author": "whyrusleeping", - "hash": "QmY3ArotKMKaL7YGfbQfyDrib6RVraLqZYWXZvVgZktBxp", - "name": "go-libp2p-net", - "version": "3.0.30" - }, - { - "author": "whyrusleeping", - "hash": "QmaCTz9RkrU13bm9kMB54f7atgqM4qkjDZpRwRoJiWXEqs", - "name": "go-libp2p-peerstore", - "version": "2.0.19" - }, - { - "author": "whyrusleeping", - "hash": "QmYVXrKrKHDC9FobgmcmshCDyWwdrfwfanNQN4oxJ9Fk3h", - "name": "go-libp2p-peer", - "version": "3.1.2" - }, - { - "author": "why", - "hash": "QmXa6sgzUvP5bgF5CyyV36bZYv5VDRwttggQYUPvFybLVd", - "name": "go-libp2p-interface-connmgr", - "version": "0.0.32" - } - ], - "gxVersion": "0.9.1", - "language": "go", - "license": "", - "name": "go-libp2p-host", - "releaseCmd": "git commit -a -m \"gx publish $VERSION\"", - "version": "3.0.26" -} - diff --git a/vendor/github.com/libp2p/go-libp2p-interface-connmgr/.travis.yml b/vendor/github.com/libp2p/go-libp2p-interface-connmgr/.travis.yml deleted file mode 100644 index 4cfe98c2..00000000 --- a/vendor/github.com/libp2p/go-libp2p-interface-connmgr/.travis.yml +++ /dev/null @@ -1,32 +0,0 @@ -os: - - linux - -language: go - -go: - - 1.11.x - -env: - global: - - GOTFLAGS="-race" - matrix: - - BUILD_DEPTYPE=gx - - BUILD_DEPTYPE=gomod - - -# disable travis install -install: - - true - -script: - - bash <(curl -s https://raw.githubusercontent.com/ipfs/ci-helpers/master/travis-ci/run-standard-tests.sh) - - -cache: - directories: - - $GOPATH/src/gx - - $GOPATH/pkg/mod - - $HOME/.cache/go-build - -notifications: - email: false diff --git a/vendor/github.com/libp2p/go-libp2p-interface-connmgr/Makefile b/vendor/github.com/libp2p/go-libp2p-interface-connmgr/Makefile deleted file mode 100644 index 5c996090..00000000 --- a/vendor/github.com/libp2p/go-libp2p-interface-connmgr/Makefile +++ /dev/null @@ -1,13 +0,0 @@ -all: deps - -gx: - go get github.com/whyrusleeping/gx - go get github.com/whyrusleeping/gx-go - -deps: gx - gx --verbose install --global - gx-go rewrite - -publish: - gx-go rewrite --undo - diff --git a/vendor/github.com/libp2p/go-libp2p-interface-connmgr/README.md b/vendor/github.com/libp2p/go-libp2p-interface-connmgr/README.md deleted file mode 100644 index bf61b45f..00000000 --- a/vendor/github.com/libp2p/go-libp2p-interface-connmgr/README.md +++ /dev/null @@ -1,35 +0,0 @@ -go-libp2p-interface-connmgr -================== - -[![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](http://ipn.io) -[![](https://img.shields.io/badge/project-IPFS-blue.svg?style=flat-square)](http://libp2p.io/) -[![](https://img.shields.io/badge/freenode-%23ipfs-blue.svg?style=flat-square)](http://webchat.freenode.net/?channels=%23ipfs) -[![Coverage Status](https://coveralls.io/repos/github/libp2p/go-libp2p-interface-connmgr/badge.svg?branch=master)](https://coveralls.io/github/libp2p/go-libp2p-interface-connmgr?branch=master) -[![Travis CI](https://travis-ci.org/libp2p/go-libp2p-interface-connmgr.svg?branch=master)](https://travis-ci.org/libp2p/go-libp2p-interface-connmgr) - -> The interface for libp2p connection managers - - -## Table of Contents - -- [Install](#install) -- [Usage](#usage) -- [API](#api) -- [Contribute](#contribute) -- [License](#license) - -## Install - -```sh -make install -``` - -## Contribute - -PRs are welcome! - -Small note: If editing the Readme, please conform to the [standard-readme](https://github.com/RichardLitt/standard-readme) specification. - -## License - -MIT © Jeromy Johnson diff --git a/vendor/github.com/libp2p/go-libp2p-interface-connmgr/codecov.yml b/vendor/github.com/libp2p/go-libp2p-interface-connmgr/codecov.yml deleted file mode 100644 index 5f88a9ea..00000000 --- a/vendor/github.com/libp2p/go-libp2p-interface-connmgr/codecov.yml +++ /dev/null @@ -1,3 +0,0 @@ -coverage: - range: "50...100" -comment: off diff --git a/vendor/github.com/libp2p/go-libp2p-interface-connmgr/go.mod b/vendor/github.com/libp2p/go-libp2p-interface-connmgr/go.mod deleted file mode 100644 index 8b9c22a7..00000000 --- a/vendor/github.com/libp2p/go-libp2p-interface-connmgr/go.mod +++ /dev/null @@ -1,7 +0,0 @@ -module github.com/libp2p/go-libp2p-interface-connmgr - -require ( - github.com/libp2p/go-libp2p-net v0.0.1 - github.com/libp2p/go-libp2p-peer v0.0.1 - github.com/multiformats/go-multiaddr v0.0.1 -) diff --git a/vendor/github.com/libp2p/go-libp2p-interface-connmgr/go.sum b/vendor/github.com/libp2p/go-libp2p-interface-connmgr/go.sum deleted file mode 100644 index 90920ecf..00000000 --- a/vendor/github.com/libp2p/go-libp2p-interface-connmgr/go.sum +++ /dev/null @@ -1,106 +0,0 @@ -github.com/AndreasBriese/bbloom v0.0.0-20180913140656-343706a395b7/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= -github.com/Kubuxu/go-os-helper v0.0.1/go.mod h1:N8B+I7vPCT80IcP58r50u4+gEEcsZETFUpAzWW2ep1Y= -github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= -github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32 h1:qkOC5Gd33k54tobS36cXdAzJbeHaduLtnLQQwNoIi78= -github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32/go.mod h1:DrZx5ec/dmnfpw9KyYoQyYo7d0KEvTkk/5M/vbZjAr8= -github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= -github.com/btcsuite/btcutil v0.0.0-20190207003914-4c204d697803/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= -github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= -github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= -github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= -github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= -github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= -github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dgraph-io/badger v1.5.5-0.20190226225317-8115aed38f8f/go.mod h1:VZxzAIRPHRVNRKRo6AXrX9BJegn6il06VMTZVJYCIjQ= -github.com/dgryski/go-farm v0.0.0-20190104051053-3adb47b1fb0f/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= -github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0= -github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/gxed/hashland/keccakpg v0.0.1 h1:wrk3uMNaMxbXiHibbPO4S0ymqJMm41WiudyFSs7UnsU= -github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfmKFJ6tItnhQ67kU= -github.com/gxed/hashland/murmur3 v0.0.1 h1:SheiaIt0sda5K+8FLz952/1iWS9zrnKsEJaOJu4ZbSc= -github.com/gxed/hashland/murmur3 v0.0.1/go.mod h1:KjXop02n4/ckmZSnY2+HKcLud/tcmvhST0bie/0lS48= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/ipfs/go-datastore v0.0.1/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= -github.com/ipfs/go-ds-badger v0.0.2/go.mod h1:Y3QpeSFWQf6MopLTiZD+VT6IC1yZqaGmjvRcKeSGij8= -github.com/ipfs/go-ds-leveldb v0.0.1/go.mod h1:feO8V3kubwsEF22n0YRQCffeb79OOYIykR4L04tMOYc= -github.com/ipfs/go-ipfs-delay v0.0.0-20181109222059-70721b86a9a8/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= -github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM= -github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8 h1:bspPhN+oKYFk5fcGNuQzp6IGzYQSenLEgH3s6jkXrWw= -github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8/go.mod h1:Ly/wlsjFq/qrU3Rar62tu1gASgGw6chQbSh/XgIIXCY= -github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= -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/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/libp2p/go-buffer-pool v0.0.1/go.mod h1:xtyIz9PMobb13WaxR6Zo1Pd1zXJKYg0a8KiIvDp3TzQ= -github.com/libp2p/go-libp2p-crypto v0.0.1 h1:JNQd8CmoGTohO/akqrH16ewsqZpci2CbgYH/LmYl8gw= -github.com/libp2p/go-libp2p-crypto v0.0.1/go.mod h1:yJkNyDmO341d5wwXxDUGO0LykUVT72ImHNUqh5D/dBE= -github.com/libp2p/go-libp2p-net v0.0.1 h1:xJ4Vh4yKF/XKb8fd1Ev0ebAGzVjMxXzrxG2kjtU+F5Q= -github.com/libp2p/go-libp2p-net v0.0.1/go.mod h1:Yt3zgmlsHOgUWSXmt5V/Jpz9upuJBE8EgNU9DrCcR8c= -github.com/libp2p/go-libp2p-peer v0.0.1 h1:0qwAOljzYewINrU+Kndoc+1jAL7vzY/oY2Go4DCGfyY= -github.com/libp2p/go-libp2p-peer v0.0.1/go.mod h1:nXQvOBbwVqoP+T5Y5nCjeH4sP9IX/J0AMzcDUVruVoo= -github.com/libp2p/go-libp2p-peerstore v0.0.1 h1:twKovq8YK5trLrd3nB7PD2Zu9JcyAIdm7Bz9yBWjhq8= -github.com/libp2p/go-libp2p-peerstore v0.0.1/go.mod h1:RabLyPVJLuNQ+GFyoEkfi8H4Ti6k/HtZJ7YKgtSq+20= -github.com/libp2p/go-libp2p-protocol v0.0.1 h1:+zkEmZ2yFDi5adpVE3t9dqh/N9TbpFWywowzeEzBbLM= -github.com/libp2p/go-libp2p-protocol v0.0.1/go.mod h1:Af9n4PiruirSDjHycM1QuiMi/1VZNHYcK8cLgFJLZ4s= -github.com/libp2p/go-stream-muxer v0.0.1 h1:Ce6e2Pyu+b5MC1k3eeFtAax0pW4gc6MosYSLV05UeLw= -github.com/libp2p/go-stream-muxer v0.0.1/go.mod h1:bAo8x7YkSpadMTbtTaxGVHWUQsR/l5MEaHbKaliuT14= -github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= -github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0OXOcUbGjvZxxijuBwbbmlSxLiuofa+g= -github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= -github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16 h1:5W7KhL8HVF3XCFOweFD3BNESdnO8ewyYTFT2R+/b8FQ= -github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= -github.com/mr-tron/base58 v1.1.0 h1:Y51FGVJ91WBqCEabAi5OPUz38eAx8DakuAm5svLcsfQ= -github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= -github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= -github.com/multiformats/go-multiaddr v0.0.1 h1:/QUV3VBMDI6pi6xfiw7lr6xhDWWvQKn9udPn68kLSdY= -github.com/multiformats/go-multiaddr v0.0.1/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= -github.com/multiformats/go-multiaddr-dns v0.0.1/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= -github.com/multiformats/go-multiaddr-net v0.0.1/go.mod h1:nw6HSxNmCIQH27XPGBuX+d1tnvM7ihcFwHMSstNAVUU= -github.com/multiformats/go-multihash v0.0.1 h1:HHwN1K12I+XllBCrqKnhX949Orn4oawPkegHMu2vDqQ= -github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= -github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1/go.mod h1:8UvriyWtv5Q5EOgjHaSseUEdkQfvwFv1I/In/O2M9gc= -github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc/go.mod h1:bopw91TMyo8J3tvftk8xmU2kPmlrt4nScJQZU2hE5EM= -github.com/whyrusleeping/mafmt v1.2.8/go.mod h1:faQJFPbLSxzD9xpA02ttW/tS9vZykNvXwGvqIpk20FA= -golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b h1:+/WWzjwW6gidDJnMKWLKLX1gxn7irUTF1fLpQovfQ5M= -golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190227160552-c95aed5357e7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/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-20190219092855-153ac476189d/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223 h1:DH4skfRX4EBpamg7iV4ZlCpblAHI6s6TDM39bFZumv8= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/vendor/github.com/libp2p/go-libp2p-interface-connmgr/null.go b/vendor/github.com/libp2p/go-libp2p-interface-connmgr/null.go deleted file mode 100644 index 21039ac3..00000000 --- a/vendor/github.com/libp2p/go-libp2p-interface-connmgr/null.go +++ /dev/null @@ -1,30 +0,0 @@ -package ifconnmgr - -import ( - "context" - - inet "github.com/libp2p/go-libp2p-net" - peer "github.com/libp2p/go-libp2p-peer" - ma "github.com/multiformats/go-multiaddr" -) - -type NullConnMgr struct{} - -var _ ConnManager = (*NullConnMgr)(nil) - -func (_ NullConnMgr) TagPeer(peer.ID, string, int) {} -func (_ NullConnMgr) UntagPeer(peer.ID, string) {} -func (_ NullConnMgr) GetTagInfo(peer.ID) *TagInfo { return &TagInfo{} } -func (_ NullConnMgr) TrimOpenConns(context.Context) {} -func (_ NullConnMgr) Notifee() inet.Notifiee { return &cmNotifee{} } -func (_ NullConnMgr) Protect(peer.ID, string) {} -func (_ NullConnMgr) Unprotect(peer.ID, string) bool { return false } - -type cmNotifee struct{} - -func (nn *cmNotifee) Connected(n inet.Network, c inet.Conn) {} -func (nn *cmNotifee) Disconnected(n inet.Network, c inet.Conn) {} -func (nn *cmNotifee) Listen(n inet.Network, addr ma.Multiaddr) {} -func (nn *cmNotifee) ListenClose(n inet.Network, addr ma.Multiaddr) {} -func (nn *cmNotifee) OpenedStream(inet.Network, inet.Stream) {} -func (nn *cmNotifee) ClosedStream(inet.Network, inet.Stream) {} diff --git a/vendor/github.com/libp2p/go-libp2p-interface-connmgr/package.json b/vendor/github.com/libp2p/go-libp2p-interface-connmgr/package.json deleted file mode 100644 index 2d90568e..00000000 --- a/vendor/github.com/libp2p/go-libp2p-interface-connmgr/package.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "author": "why", - "bugs": { - "url": "https://github.com/libp2p/go-libp2p-interface-connmgr" - }, - "gx": { - "dvcsimport": "github.com/libp2p/go-libp2p-interface-connmgr" - }, - "gxDependencies": [ - { - "author": "whyrusleeping", - "hash": "QmY3ArotKMKaL7YGfbQfyDrib6RVraLqZYWXZvVgZktBxp", - "name": "go-libp2p-net", - "version": "3.0.30" - }, - { - "author": "whyrusleeping", - "hash": "QmYVXrKrKHDC9FobgmcmshCDyWwdrfwfanNQN4oxJ9Fk3h", - "name": "go-libp2p-peer", - "version": "3.1.2" - }, - { - "author": "multiformats", - "hash": "QmTZBfrPJmjWsCvHEtX5FE6KimVJhsJg5sBbqEFYf4UZtL", - "name": "go-multiaddr", - "version": "1.4.1" - } - ], - "gxVersion": "0.11.0", - "language": "go", - "license": "", - "name": "go-libp2p-interface-connmgr", - "releaseCmd": "git commit -a -m \"gx publish $VERSION\"", - "version": "0.0.32" -} - diff --git a/vendor/github.com/libp2p/go-libp2p-interface-pnet/.travis.yml b/vendor/github.com/libp2p/go-libp2p-interface-pnet/.travis.yml deleted file mode 100644 index dde69d1a..00000000 --- a/vendor/github.com/libp2p/go-libp2p-interface-pnet/.travis.yml +++ /dev/null @@ -1,32 +0,0 @@ -os: - - linux - -language: go - -go: - - 1.11.x - -env: - global: - - GOTFLAGS="-race" - matrix: - - BUILD_DEPTYPE=gx - - BUILD_DEPTYPE=gomod - - -# disable travis install -install: - - true - -script: - - bash <(curl -s https://raw.githubusercontent.com/ipfs/ci-helpers/master/travis-ci/run-standard-tests.sh) - - -cache: - directories: - - /Users/raul/go/src/gx - - /Users/raul/go/pkg/mod - - /Users/raul/.cache/go-build - -notifications: - email: false diff --git a/vendor/github.com/libp2p/go-libp2p-interface-pnet/LICENSE b/vendor/github.com/libp2p/go-libp2p-interface-pnet/LICENSE deleted file mode 100644 index 244b53da..00000000 --- a/vendor/github.com/libp2p/go-libp2p-interface-pnet/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -MIT License - -Copyright (c) 2018 Jakub Sztandera - -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/libp2p/go-libp2p-interface-pnet/Makefile b/vendor/github.com/libp2p/go-libp2p-interface-pnet/Makefile deleted file mode 100644 index 20619413..00000000 --- a/vendor/github.com/libp2p/go-libp2p-interface-pnet/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -gx: - go get github.com/whyrusleeping/gx - go get github.com/whyrusleeping/gx-go - -deps: gx - gx --verbose install --global - gx-go rewrite - -publish: - gx-go rewrite --undo - diff --git a/vendor/github.com/libp2p/go-libp2p-interface-pnet/README.md b/vendor/github.com/libp2p/go-libp2p-interface-pnet/README.md deleted file mode 100644 index fe5be28b..00000000 --- a/vendor/github.com/libp2p/go-libp2p-interface-pnet/README.md +++ /dev/null @@ -1,37 +0,0 @@ -go-libp2p-interface-pnet -================== - -[![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](http://ipn.io) -[![](https://img.shields.io/badge/project-IPFS-blue.svg?style=flat-square)](http://libp2p.io/) -[![](https://img.shields.io/badge/freenode-%23ipfs-blue.svg?style=flat-square)](http://webchat.freenode.net/?channels=%23ipfs) - -> An interface providing abstraction of swarm protection for libp2p. - - -## Table of Contents - -- [Usage](#usage) -- [Contribute](#contribute) -- [License](#license) - -## Usage - -Core of this interface in `Protector` that is used to protect the swarm. -It makes decisions about which streams are allowed to pass. - -This interface is accepted in multiple places in libp2p but most importantly in -go-libp2p-swarm `NewSwarmWithProtector` and `NewNetworkWithProtector`. - -## Implementations: - - - [go-libp2p-pnet](//github.com/libp2p/go-libp2p-pnet) - simple PSK based Protector, using XSalsa20 - -## Contribute - -PRs are welcome! - -Small note: If editing the Readme, please conform to the [standard-readme](https://github.com/RichardLitt/standard-readme) specification. - -## License - -MIT © Jeromy Johnson diff --git a/vendor/github.com/libp2p/go-libp2p-interface-pnet/codecov.yml b/vendor/github.com/libp2p/go-libp2p-interface-pnet/codecov.yml deleted file mode 100644 index 5f88a9ea..00000000 --- a/vendor/github.com/libp2p/go-libp2p-interface-pnet/codecov.yml +++ /dev/null @@ -1,3 +0,0 @@ -coverage: - range: "50...100" -comment: off diff --git a/vendor/github.com/libp2p/go-libp2p-interface-pnet/error.go b/vendor/github.com/libp2p/go-libp2p-interface-pnet/error.go deleted file mode 100644 index e4cb9f7c..00000000 --- a/vendor/github.com/libp2p/go-libp2p-interface-pnet/error.go +++ /dev/null @@ -1,29 +0,0 @@ -package ipnet - -// PNetError is error type for ease of detecting PNet errors -type PNetError interface { - IsPNetError() bool -} - -// NewError creates new PNetError -func NewError(err string) error { - return pnetErr("privnet: " + err) -} - -// IsPNetError checks if given error is PNet Error -func IsPNetError(err error) bool { - v, ok := err.(PNetError) - return ok && v.IsPNetError() -} - -type pnetErr string - -var _ PNetError = (PNetError)(pnetErr("")) - -func (p pnetErr) Error() string { - return string(p) -} - -func (pnetErr) IsPNetError() bool { - return true -} diff --git a/vendor/github.com/libp2p/go-libp2p-interface-pnet/go.mod b/vendor/github.com/libp2p/go-libp2p-interface-pnet/go.mod deleted file mode 100644 index d4ab6b5e..00000000 --- a/vendor/github.com/libp2p/go-libp2p-interface-pnet/go.mod +++ /dev/null @@ -1 +0,0 @@ -module github.com/libp2p/go-libp2p-interface-pnet diff --git a/vendor/github.com/libp2p/go-libp2p-interface-pnet/interface.go b/vendor/github.com/libp2p/go-libp2p-interface-pnet/interface.go deleted file mode 100644 index 85632b48..00000000 --- a/vendor/github.com/libp2p/go-libp2p-interface-pnet/interface.go +++ /dev/null @@ -1,38 +0,0 @@ -package ipnet - -import ( - "net" - "os" -) - -// EnvKey defines environment variable name for forcing usage of PNet in libp2p -// When environment variable of this name is set to "1" the ForcePrivateNetwork -// variable will be set to true. -const EnvKey = "LIBP2P_FORCE_PNET" - -// ForcePrivateNetwork is boolean variable that forces usage of PNet in libp2p -// Setting this variable to true or setting LIBP2P_FORCE_PNET environment variable -// to true will make libp2p to require private network protector. -// If no network protector is provided and this variable is set to true libp2p will -// refuse to connect. -var ForcePrivateNetwork = false - -func init() { - ForcePrivateNetwork = os.Getenv(EnvKey) == "1" -} - -// ErrNotInPrivateNetwork is an error that should be returned by libp2p when it -// tries to dial with ForcePrivateNetwork set and no PNet Protector -var ErrNotInPrivateNetwork = NewError("private network was not configured but" + - " is enforced by the environment") - -// Protector interface is a way for private network implementation to be transparent in -// libp2p. It is created by implementation and use by libp2p-conn to secure connections -// so they can be only established with selected number of peers. -type Protector interface { - // Wraps passed connection to protect it - Protect(net.Conn) (net.Conn, error) - - // Returns key fingerprint that is safe to expose - Fingerprint() []byte -} diff --git a/vendor/github.com/libp2p/go-libp2p-interface-pnet/package.json b/vendor/github.com/libp2p/go-libp2p-interface-pnet/package.json deleted file mode 100644 index 998e1145..00000000 --- a/vendor/github.com/libp2p/go-libp2p-interface-pnet/package.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "author": "libp2p", - "bugs": { - "URL": "https://github.com/libp2p/go-libp2p-interface-pnet/issues", - "url": "https://github.com/libp2p/go-libp2p-interface-pnet/issues" - }, - "gx": { - "dvcsimport": "github.com/libp2p/go-libp2p-interface-pnet" - }, - "gxDependencies": [], - "gxVersion": "0.9.1", - "language": "go", - "license": "MIT", - "name": "go-libp2p-interface-pnet", - "releaseCmd": "git commit -a -m \"gx publish $VERSION\"", - "version": "3.0.0" -} - diff --git a/vendor/github.com/libp2p/go-libp2p-kad-dht/dht.go b/vendor/github.com/libp2p/go-libp2p-kad-dht/dht.go index 426e0942..da3c5cc3 100644 --- a/vendor/github.com/libp2p/go-libp2p-kad-dht/dht.go +++ b/vendor/github.com/libp2p/go-libp2p-kad-dht/dht.go @@ -8,6 +8,13 @@ import ( "sync" "time" + "github.com/libp2p/go-libp2p-core/host" + "github.com/libp2p/go-libp2p-core/network" + "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p-core/peerstore" + "github.com/libp2p/go-libp2p-core/protocol" + "github.com/libp2p/go-libp2p-core/routing" + "go.opencensus.io/tag" "golang.org/x/xerrors" @@ -22,15 +29,9 @@ import ( logging "github.com/ipfs/go-log" goprocess "github.com/jbenet/goprocess" goprocessctx "github.com/jbenet/goprocess/context" - host "github.com/libp2p/go-libp2p-host" kb "github.com/libp2p/go-libp2p-kbucket" - inet "github.com/libp2p/go-libp2p-net" - peer "github.com/libp2p/go-libp2p-peer" - pstore "github.com/libp2p/go-libp2p-peerstore" - protocol "github.com/libp2p/go-libp2p-protocol" record "github.com/libp2p/go-libp2p-record" recpb "github.com/libp2p/go-libp2p-record/pb" - routing "github.com/libp2p/go-libp2p-routing" base32 "github.com/whyrusleeping/base32" ) @@ -41,11 +42,11 @@ var logger = logging.Logger("dht") const NumBootstrapQueries = 5 // IpfsDHT is an implementation of Kademlia with S/Kademlia modifications. -// It is used to implement the base IpfsRouting module. +// It is used to implement the base Routing module. type IpfsDHT struct { - host host.Host // the network services we need - self peer.ID // Local peer (yourself) - peerstore pstore.Peerstore // Peer Registry + host host.Host // the network services we need + self peer.ID // Local peer (yourself) + peerstore peerstore.Peerstore // Peer Registry datastore ds.Datastore // Local data @@ -71,7 +72,7 @@ type IpfsDHT struct { // guarantee, but we can use them to aid refactoring. var ( _ routing.ContentRouting = (*IpfsDHT)(nil) - _ routing.IpfsRouting = (*IpfsDHT)(nil) + _ routing.Routing = (*IpfsDHT)(nil) _ routing.PeerRouting = (*IpfsDHT)(nil) _ routing.PubKeyFetcher = (*IpfsDHT)(nil) _ routing.ValueStore = (*IpfsDHT)(nil) @@ -182,7 +183,7 @@ var errInvalidRecord = errors.New("received invalid record") // key. It returns either the value or a list of closer peers. // NOTE: It will update the dht's peerstore with any new addresses // it finds for the given peer. -func (dht *IpfsDHT) getValueOrPeers(ctx context.Context, p peer.ID, key string) (*recpb.Record, []*pstore.PeerInfo, error) { +func (dht *IpfsDHT) getValueOrPeers(ctx context.Context, p peer.ID, key string) (*recpb.Record, []*peer.AddrInfo, error) { pmes, err := dht.getValueSingle(ctx, p, key) if err != nil { @@ -278,12 +279,12 @@ func (dht *IpfsDHT) Update(ctx context.Context, p peer.ID) { } // FindLocal looks for a peer with a given ID connected to this dht and returns the peer and the table it was found in. -func (dht *IpfsDHT) FindLocal(id peer.ID) pstore.PeerInfo { +func (dht *IpfsDHT) FindLocal(id peer.ID) peer.AddrInfo { switch dht.host.Network().Connectedness(id) { - case inet.Connected, inet.CanConnect: + case network.Connected, network.CanConnect: return dht.peerstore.PeerInfo(id) default: - return pstore.PeerInfo{} + return peer.AddrInfo{} } } diff --git a/vendor/github.com/libp2p/go-libp2p-kad-dht/dht_bootstrap.go b/vendor/github.com/libp2p/go-libp2p-kad-dht/dht_bootstrap.go index b70d81b1..0dd18848 100644 --- a/vendor/github.com/libp2p/go-libp2p-kad-dht/dht_bootstrap.go +++ b/vendor/github.com/libp2p/go-libp2p-kad-dht/dht_bootstrap.go @@ -6,11 +6,11 @@ import ( "fmt" "time" + "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p-core/routing" + u "github.com/ipfs/go-ipfs-util" - peer "github.com/libp2p/go-libp2p-peer" - pstore "github.com/libp2p/go-libp2p-peerstore" - routing "github.com/libp2p/go-libp2p-routing" - multiaddr "github.com/multiformats/go-multiaddr" + "github.com/multiformats/go-multiaddr" _ "github.com/multiformats/go-multiaddr-dns" ) @@ -112,7 +112,7 @@ func newRandomPeerId() peer.ID { } // Traverse the DHT toward the given ID. -func (dht *IpfsDHT) walk(ctx context.Context, target peer.ID) (pstore.PeerInfo, error) { +func (dht *IpfsDHT) walk(ctx context.Context, target peer.ID) (peer.AddrInfo, error) { // TODO: Extract the query action (traversal logic?) inside FindPeer, // don't actually call through the FindPeer machinery, which can return // things out of the peer store etc. diff --git a/vendor/github.com/libp2p/go-libp2p-kad-dht/dht_net.go b/vendor/github.com/libp2p/go-libp2p-kad-dht/dht_net.go index f6261089..ce9e5de3 100644 --- a/vendor/github.com/libp2p/go-libp2p-kad-dht/dht_net.go +++ b/vendor/github.com/libp2p/go-libp2p-kad-dht/dht_net.go @@ -8,24 +8,23 @@ import ( "sync" "time" - ggio "github.com/gogo/protobuf/io" - ctxio "github.com/jbenet/go-context/io" + "github.com/libp2p/go-libp2p-core/helpers" + "github.com/libp2p/go-libp2p-core/network" + "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p-kad-dht/metrics" pb "github.com/libp2p/go-libp2p-kad-dht/pb" - inet "github.com/libp2p/go-libp2p-net" - peer "github.com/libp2p/go-libp2p-peer" + + ggio "github.com/gogo/protobuf/io" + "go.opencensus.io/stats" "go.opencensus.io/tag" ) var dhtReadMessageTimeout = time.Minute +var dhtStreamIdleTimeout = 10 * time.Minute var ErrReadTimeout = fmt.Errorf("timed out reading response") -type bufferedWriteCloser interface { - ggio.WriteCloser - Flush() error -} - // The Protobuf writer performs multiple small writes when writing a message. // We need to buffer those writes, to make sure that we're not sending a new // packet for every single write. @@ -34,20 +33,34 @@ type bufferedDelimitedWriter struct { ggio.WriteCloser } -func newBufferedDelimitedWriter(str io.Writer) bufferedWriteCloser { - w := bufio.NewWriter(str) - return &bufferedDelimitedWriter{ - Writer: w, - WriteCloser: ggio.NewDelimitedWriter(w), +var writerPool = sync.Pool{ + New: func() interface{} { + w := bufio.NewWriter(nil) + return &bufferedDelimitedWriter{ + Writer: w, + WriteCloser: ggio.NewDelimitedWriter(w), + } + }, +} + +func writeMsg(w io.Writer, mes *pb.Message) error { + bw := writerPool.Get().(*bufferedDelimitedWriter) + bw.Reset(w) + err := bw.WriteMsg(mes) + if err == nil { + err = bw.Flush() } + bw.Reset(nil) + writerPool.Put(bw) + return err } func (w *bufferedDelimitedWriter) Flush() error { return w.Writer.Flush() } -// handleNewStream implements the inet.StreamHandler -func (dht *IpfsDHT) handleNewStream(s inet.Stream) { +// handleNewStream implements the network.StreamHandler +func (dht *IpfsDHT) handleNewStream(s network.Stream) { defer s.Reset() if dht.handleNewMessage(s) { // Gracefully close the stream for writes. @@ -56,15 +69,15 @@ func (dht *IpfsDHT) handleNewStream(s inet.Stream) { } // Returns true on orderly completion of writes (so we can Close the stream). -func (dht *IpfsDHT) handleNewMessage(s inet.Stream) bool { +func (dht *IpfsDHT) handleNewMessage(s network.Stream) bool { ctx := dht.ctx + r := ggio.NewDelimitedReader(s, network.MessageSizeMax) - cr := ctxio.NewReader(ctx, s) // ok to use. we defer close stream in this func - cw := ctxio.NewWriter(ctx, s) // ok to use. we defer close stream in this func - r := ggio.NewDelimitedReader(cr, inet.MessageSizeMax) - w := newBufferedDelimitedWriter(cw) mPeer := s.Conn().RemotePeer() + timer := time.AfterFunc(dhtStreamIdleTimeout, func() { s.Reset() }) + defer timer.Stop() + for { var req pb.Message switch err := r.ReadMsg(&req); err { @@ -85,6 +98,8 @@ func (dht *IpfsDHT) handleNewMessage(s inet.Stream) bool { case nil: } + timer.Reset(dhtStreamIdleTimeout) + startTime := time.Now() ctx, _ = tag.New( ctx, @@ -118,10 +133,7 @@ func (dht *IpfsDHT) handleNewMessage(s inet.Stream) bool { } // send out response msg - err = w.WriteMsg(resp) - if err == nil { - err = w.Flush() - } + err = writeMsg(s, resp) if err != nil { stats.Record(ctx, metrics.ReceivedMessageErrors.M(1)) logger.Debugf("error writing response: %v", err) @@ -235,9 +247,8 @@ func (dht *IpfsDHT) messageSenderForPeer(ctx context.Context, p peer.ID) (*messa } type messageSender struct { - s inet.Stream + s network.Stream r ggio.ReadCloser - w bufferedWriteCloser lk sync.Mutex p peer.ID dht *IpfsDHT @@ -280,8 +291,7 @@ func (ms *messageSender) prep(ctx context.Context) error { return err } - ms.r = ggio.NewDelimitedReader(nstr, inet.MessageSizeMax) - ms.w = newBufferedDelimitedWriter(nstr) + ms.r = ggio.NewDelimitedReader(nstr, network.MessageSizeMax) ms.s = nstr return nil @@ -317,7 +327,7 @@ func (ms *messageSender) SendMessage(ctx context.Context, pmes *pb.Message) erro logger.Event(ctx, "dhtSentMessage", ms.dht.self, ms.p, pmes) if ms.singleMes > streamReuseTries { - go inet.FullClose(ms.s) + go helpers.FullClose(ms.s) ms.s = nil } else if retry { ms.singleMes++ @@ -366,7 +376,7 @@ func (ms *messageSender) SendRequest(ctx context.Context, pmes *pb.Message) (*pb logger.Event(ctx, "dhtSentMessage", ms.dht.self, ms.p, pmes) if ms.singleMes > streamReuseTries { - go inet.FullClose(ms.s) + go helpers.FullClose(ms.s) ms.s = nil } else if retry { ms.singleMes++ @@ -377,10 +387,7 @@ func (ms *messageSender) SendRequest(ctx context.Context, pmes *pb.Message) (*pb } func (ms *messageSender) writeMsg(pmes *pb.Message) error { - if err := ms.w.WriteMsg(pmes); err != nil { - return err - } - return ms.w.Flush() + return writeMsg(ms.s, pmes) } func (ms *messageSender) ctxReadMsg(ctx context.Context, mes *pb.Message) error { diff --git a/vendor/github.com/libp2p/go-libp2p-kad-dht/dial_queue.go b/vendor/github.com/libp2p/go-libp2p-kad-dht/dial_queue.go index 07adddf8..23bd352d 100644 --- a/vendor/github.com/libp2p/go-libp2p-kad-dht/dial_queue.go +++ b/vendor/github.com/libp2p/go-libp2p-kad-dht/dial_queue.go @@ -6,7 +6,7 @@ import ( "sync" "time" - peer "github.com/libp2p/go-libp2p-peer" + "github.com/libp2p/go-libp2p-core/peer" queue "github.com/libp2p/go-libp2p-peerstore/queue" ) diff --git a/vendor/github.com/libp2p/go-libp2p-kad-dht/go.mod b/vendor/github.com/libp2p/go-libp2p-kad-dht/go.mod index 2a835cf7..a29d2756 100644 --- a/vendor/github.com/libp2p/go-libp2p-kad-dht/go.mod +++ b/vendor/github.com/libp2p/go-libp2p-kad-dht/go.mod @@ -2,33 +2,27 @@ module github.com/libp2p/go-libp2p-kad-dht require ( github.com/gogo/protobuf v1.2.1 - github.com/golang/protobuf v1.3.1 // indirect github.com/hashicorp/golang-lru v0.5.1 - github.com/ipfs/go-cid v0.0.1 - github.com/ipfs/go-datastore v0.0.4 + github.com/ipfs/go-cid v0.0.2 + github.com/ipfs/go-datastore v0.0.5 github.com/ipfs/go-ipfs-util v0.0.1 github.com/ipfs/go-log v0.0.1 github.com/ipfs/go-todocounter v0.0.1 - github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 - github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8 - github.com/libp2p/go-libp2p v0.0.12 - github.com/libp2p/go-libp2p-crypto v0.0.1 - github.com/libp2p/go-libp2p-host v0.0.1 - github.com/libp2p/go-libp2p-kbucket v0.1.1 - github.com/libp2p/go-libp2p-net v0.0.2 - github.com/libp2p/go-libp2p-peer v0.1.0 - github.com/libp2p/go-libp2p-peerstore v0.0.2 - github.com/libp2p/go-libp2p-protocol v0.0.1 - github.com/libp2p/go-libp2p-record v0.0.1 - github.com/libp2p/go-libp2p-routing v0.0.1 - github.com/libp2p/go-libp2p-swarm v0.0.2 - github.com/libp2p/go-testutil v0.0.1 - github.com/mr-tron/base58 v1.1.0 - github.com/multiformats/go-multiaddr v0.0.1 + github.com/jbenet/goprocess v0.1.3 + github.com/libp2p/go-libp2p v0.1.0 + github.com/libp2p/go-libp2p-core v0.0.1 + github.com/libp2p/go-libp2p-kbucket v0.2.0 + github.com/libp2p/go-libp2p-peerstore v0.1.0 + github.com/libp2p/go-libp2p-record v0.1.0 + github.com/libp2p/go-libp2p-routing v0.1.0 + github.com/libp2p/go-libp2p-swarm v0.1.0 + github.com/libp2p/go-libp2p-testing v0.0.3 + github.com/mr-tron/base58 v1.1.2 + github.com/multiformats/go-multiaddr v0.0.4 github.com/multiformats/go-multiaddr-dns v0.0.2 - github.com/multiformats/go-multistream v0.0.1 + github.com/multiformats/go-multistream v0.1.0 github.com/stretchr/testify v1.3.0 github.com/whyrusleeping/base32 v0.0.0-20170828182744-c30ac30633cc - go.opencensus.io v0.20.2 - golang.org/x/xerrors v0.0.0-20190212162355-a5947ffaace3 + go.opencensus.io v0.21.0 + golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522 ) diff --git a/vendor/github.com/libp2p/go-libp2p-kad-dht/go.sum b/vendor/github.com/libp2p/go-libp2p-kad-dht/go.sum index 19ad0658..2a04aeb9 100644 --- a/vendor/github.com/libp2p/go-libp2p-kad-dht/go.sum +++ b/vendor/github.com/libp2p/go-libp2p-kad-dht/go.sum @@ -1,15 +1,8 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= github.com/AndreasBriese/bbloom v0.0.0-20180913140656-343706a395b7/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/Kubuxu/go-os-helper v0.0.1/go.mod h1:N8B+I7vPCT80IcP58r50u4+gEEcsZETFUpAzWW2ep1Y= -github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= -github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= -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/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32 h1:qkOC5Gd33k54tobS36cXdAzJbeHaduLtnLQQwNoIi78= github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32/go.mod h1:DrZx5ec/dmnfpw9KyYoQyYo7d0KEvTkk/5M/vbZjAr8= github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= @@ -20,28 +13,18 @@ github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/coreos/go-semver v0.2.0 h1:3Jm3tLmsgAYcjC+4Up7hJrFBPr+n7rAqYeSw/SZazuY= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= 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/dgraph-io/badger v1.5.5-0.20190226225317-8115aed38f8f/go.mod h1:VZxzAIRPHRVNRKRo6AXrX9BJegn6il06VMTZVJYCIjQ= github.com/dgryski/go-farm v0.0.0-20190104051053-3adb47b1fb0f/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= -github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= -github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= 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/go-check/check v0.0.0-20180628173108-788fd7840127 h1:0gkP6mzaMqkmpcJYCFOLkIBwI7xFExG03bbkOkCvUPI= github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -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/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= @@ -49,25 +32,17 @@ github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfb github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.0 h1:kbxbvI4Un1LUWKxufD+BiE6AEExYYgkQLQmLFqA1LFk= github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0= -github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/go-cmp v0.2.0 h1:+dTQ8DZQJz0Mb/HjFlkptS1FeQ4cWSnN941F8aEG4SQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= -github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gxed/hashland/keccakpg v0.0.1 h1:wrk3uMNaMxbXiHibbPO4S0ymqJMm41WiudyFSs7UnsU= github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfmKFJ6tItnhQ67kU= github.com/gxed/hashland/murmur3 v0.0.1 h1:SheiaIt0sda5K+8FLz952/1iWS9zrnKsEJaOJu4ZbSc= github.com/gxed/hashland/murmur3 v0.0.1/go.mod h1:KjXop02n4/ckmZSnY2+HKcLud/tcmvhST0bie/0lS48= -github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-multierror v1.0.0 h1:iVjPR7a6H0tWELX5NxNe7bYopibicUzc7uPribsnS6o= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+dAcgU= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= @@ -78,10 +53,12 @@ github.com/huin/goupnp v1.0.0/go.mod h1:n9v9KO1tAxYH82qOn+UTIFQDmx5n1Zxd/ClZDMX7 github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= github.com/ipfs/go-cid v0.0.1 h1:GBjWPktLnNyX0JiQCNFpUuUSoMw5KMyqrsejHYlILBE= github.com/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= +github.com/ipfs/go-cid v0.0.2 h1:tuuKaZPU1M6HcejsO3AcYWW8sZ8MTvyxfc4uqB4eFE8= +github.com/ipfs/go-cid v0.0.2/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= github.com/ipfs/go-datastore v0.0.1 h1:AW/KZCScnBWlSb5JbnEnLKFWXL224LBEh/9KXXOrUms= github.com/ipfs/go-datastore v0.0.1/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= -github.com/ipfs/go-datastore v0.0.4 h1:FZgezmkbkMGXal1nXXFMyCKkWNglxK1c4jVqO1Emlso= -github.com/ipfs/go-datastore v0.0.4/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= +github.com/ipfs/go-datastore v0.0.5 h1:q3OfiOZV5rlsK1H5V8benjeUApRfMGs4Mrhmr6NriQo= +github.com/ipfs/go-datastore v0.0.5/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk= github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps= github.com/ipfs/go-ds-badger v0.0.2/go.mod h1:Y3QpeSFWQf6MopLTiZD+VT6IC1yZqaGmjvRcKeSGij8= @@ -99,22 +76,21 @@ github.com/jackpal/go-nat-pmp v1.0.1 h1:i0LektDkO1QlrTm/cSuP+PyBCDnYvjPLGl4LdWEM github.com/jackpal/go-nat-pmp v1.0.1/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= github.com/jbenet/go-cienv v0.0.0-20150120210510-1bb1476777ec h1:DQqZhhDvrTrEQ3Qod5yfavcA064e53xlQ+xajiorXgM= github.com/jbenet/go-cienv v0.0.0-20150120210510-1bb1476777ec/go.mod h1:rGaEvXB4uRSZMmzKNLoXvTu1sfx+1kv/DojUlPrSZGs= -github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= -github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= +github.com/jbenet/go-cienv v0.1.0 h1:Vc/s0QbQtoxX8MwwSLWWh+xNNZvM3Lw7NsTcHrvvhMc= +github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA= github.com/jbenet/go-temp-err-catcher v0.0.0-20150120210811-aac704a3f4f2 h1:vhC1OXXiT9R2pczegwz6moDvuRpggaroAXhPIseh57A= github.com/jbenet/go-temp-err-catcher v0.0.0-20150120210811-aac704a3f4f2/go.mod h1:8GXXJV31xl8whumTzdZsTt3RnUIiPqzkyf7mxToRCMs= github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8 h1:bspPhN+oKYFk5fcGNuQzp6IGzYQSenLEgH3s6jkXrWw= github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8/go.mod h1:Ly/wlsjFq/qrU3Rar62tu1gASgGw6chQbSh/XgIIXCY= +github.com/jbenet/goprocess v0.1.3 h1:YKyIEECS/XvcfHtBzxtjBBbWK+MbvA6dG8ASiqwvr10= +github.com/jbenet/goprocess v0.1.3/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/koron/go-ssdp v0.0.0-20180514024734-4a0ed625a78b h1:wxtKgYHEncAU00muMD06dzLiahtGM1eouRNOzVV7tdQ= github.com/koron/go-ssdp v0.0.0-20180514024734-4a0ed625a78b/go.mod h1:5Ky9EC2xfoUKUor0Hjgi2BJhCSXJfMOFlmyYrVKGQMk= -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= @@ -124,144 +100,138 @@ github.com/libp2p/go-addr-util v0.0.1 h1:TpTQm9cXVRVSKsYbgQ7GKc3KbbHVTnbostgGaDE github.com/libp2p/go-addr-util v0.0.1/go.mod h1:4ac6O7n9rIAKB1dnd+s8IbbMXkt+oBpzX4/+RACcnlQ= github.com/libp2p/go-buffer-pool v0.0.1 h1:9Rrn/H46cXjaA2HQ5Y8lyhOS1NhTkZ4yuEs2r3Eechg= github.com/libp2p/go-buffer-pool v0.0.1/go.mod h1:xtyIz9PMobb13WaxR6Zo1Pd1zXJKYg0a8KiIvDp3TzQ= -github.com/libp2p/go-conn-security v0.0.1 h1:4kMMrqrt9EUNCNjX1xagSJC+bq16uqjMe9lk1KBMVNs= -github.com/libp2p/go-conn-security v0.0.1/go.mod h1:bGmu51N0KU9IEjX7kl2PQjgZa40JQWnayTvNMgD/vyk= -github.com/libp2p/go-conn-security-multistream v0.0.1 h1:XefjAQRHcnUaxKb26RGupToucx3uU4ecbOZ3aACXlDU= -github.com/libp2p/go-conn-security-multistream v0.0.1/go.mod h1:nc9vud7inQ+d6SO0I/6dSWrdMnHnzZNHeyUQqrAJulE= +github.com/libp2p/go-buffer-pool v0.0.2 h1:QNK2iAFa8gjAe1SPz6mHSMuCcjs+X1wlHzeOSqcmlfs= +github.com/libp2p/go-buffer-pool v0.0.2/go.mod h1:MvaB6xw5vOrDl8rYZGLFdKAuk/hRoRZd1Vi32+RXyFM= +github.com/libp2p/go-conn-security-multistream v0.1.0 h1:aqGmto+ttL/uJgX0JtQI0tD21CIEy5eYd1Hlp0juHY0= +github.com/libp2p/go-conn-security-multistream v0.1.0/go.mod h1:aw6eD7LOsHEX7+2hJkDxw1MteijaVcI+/eP2/x3J1xc= github.com/libp2p/go-flow-metrics v0.0.1 h1:0gxuFd2GuK7IIP5pKljLwps6TvcuYgvG7Atqi3INF5s= github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZxBdp967ls1g+k8= -github.com/libp2p/go-libp2p v0.0.12 h1:UbZO296s6/Cvoz4LmymvL7LrXtHkD58Xtt8Iddx/N+I= -github.com/libp2p/go-libp2p v0.0.12/go.mod h1:l8kmLMc4DToz2TtA0aWEaE4/jVMALRKw8Kv2WTR0LHc= -github.com/libp2p/go-libp2p-autonat v0.0.4/go.mod h1:fs71q5Xk+pdnKU014o2iq1RhMs9/PMaG5zXRFNnIIT4= -github.com/libp2p/go-libp2p-blankhost v0.0.1 h1:/mZuuiwntNR8RywnCFlGHLKrKLYne+qciBpQXWqp5fk= -github.com/libp2p/go-libp2p-blankhost v0.0.1/go.mod h1:Ibpbw/7cPPYwFb7PACIWdvxxv0t0XCCI10t7czjAjTc= -github.com/libp2p/go-libp2p-circuit v0.0.4/go.mod h1:p1cHJnB9xnX5/1vZLkXgKwmNEOQQuF/Hp+SkATXnXYk= -github.com/libp2p/go-libp2p-crypto v0.0.1 h1:JNQd8CmoGTohO/akqrH16ewsqZpci2CbgYH/LmYl8gw= -github.com/libp2p/go-libp2p-crypto v0.0.1/go.mod h1:yJkNyDmO341d5wwXxDUGO0LykUVT72ImHNUqh5D/dBE= -github.com/libp2p/go-libp2p-discovery v0.0.1 h1:VkjCKmJQMwpDUwtA8Qc1z3TQAHJgQ5nGQ6cdN0wQXOw= -github.com/libp2p/go-libp2p-discovery v0.0.1/go.mod h1:ZkkF9xIFRLA1xCc7bstYFkd80gBGK8Fc1JqGoU2i+zI= -github.com/libp2p/go-libp2p-host v0.0.1 h1:dnqusU+DheGcdxrE718kG4XgHNuL2n9eEv8Rg5zy8hQ= -github.com/libp2p/go-libp2p-host v0.0.1/go.mod h1:qWd+H1yuU0m5CwzAkvbSjqKairayEHdR5MMl7Cwa7Go= -github.com/libp2p/go-libp2p-interface-connmgr v0.0.1 h1:Q9EkNSLAOF+u90L88qmE9z/fTdjLh8OsJwGw74mkwk4= -github.com/libp2p/go-libp2p-interface-connmgr v0.0.1/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k= -github.com/libp2p/go-libp2p-interface-pnet v0.0.1 h1:7GnzRrBTJHEsofi1ahFdPN9Si6skwXQE9UqR2S+Pkh8= -github.com/libp2p/go-libp2p-interface-pnet v0.0.1/go.mod h1:el9jHpQAXK5dnTpKA4yfCNBZXvrzdOU75zz+C6ryp3k= -github.com/libp2p/go-libp2p-kbucket v0.1.1 h1:ZrvW3qCM+lAuv7nrNts/zfEiClq+GZe8OIzX4Vb3Dwo= -github.com/libp2p/go-libp2p-kbucket v0.1.1/go.mod h1:Y0iQDHRTk/ZgM8PC4jExoF+E4j+yXWwRkdldkMa5Xm4= -github.com/libp2p/go-libp2p-loggables v0.0.1 h1:HVww9oAnINIxbt69LJNkxD8lnbfgteXR97Xm4p3l9ps= -github.com/libp2p/go-libp2p-loggables v0.0.1/go.mod h1:lDipDlBNYbpyqyPX/KcoO+eq0sJYEVR2JgOexcivchg= -github.com/libp2p/go-libp2p-metrics v0.0.1 h1:yumdPC/P2VzINdmcKZd0pciSUCpou+s0lwYCjBbzQZU= -github.com/libp2p/go-libp2p-metrics v0.0.1/go.mod h1:jQJ95SXXA/K1VZi13h52WZMa9ja78zjyy5rspMsC/08= +github.com/libp2p/go-libp2p v0.1.0 h1:8VXadcPNni74ODoZ+7326LMAppFYmz1fRQOUuT5iZvQ= +github.com/libp2p/go-libp2p v0.1.0/go.mod h1:6D/2OBauqLUoqcADOJpn9WbKqvaM07tDw68qHM0BxUM= +github.com/libp2p/go-libp2p-autonat v0.1.0/go.mod h1:1tLf2yXxiE/oKGtDwPYWTSYG3PtvYlJmg7NeVtPRqH8= +github.com/libp2p/go-libp2p-blankhost v0.1.1 h1:X919sCh+KLqJcNRApj43xCSiQRYqOSI88Fdf55ngf78= +github.com/libp2p/go-libp2p-blankhost v0.1.1/go.mod h1:pf2fvdLJPsC1FsVrNP3DUUvMzUts2dsLLBEpo1vW1ro= +github.com/libp2p/go-libp2p-circuit v0.1.0/go.mod h1:Ahq4cY3V9VJcHcn1SBXjr78AbFkZeIRmfunbA7pmFh8= +github.com/libp2p/go-libp2p-core v0.0.1 h1:HSTZtFIq/W5Ue43Zw+uWZyy2Vl5WtF0zDjKN8/DT/1I= +github.com/libp2p/go-libp2p-core v0.0.1/go.mod h1:g/VxnTZ/1ygHxH3dKok7Vno1VfpvGcGip57wjTU4fco= +github.com/libp2p/go-libp2p-crypto v0.1.0 h1:k9MFy+o2zGDNGsaoZl0MA3iZ75qXxr9OOoAZF+sD5OQ= +github.com/libp2p/go-libp2p-crypto v0.1.0/go.mod h1:sPUokVISZiy+nNuTTH/TY+leRSxnFj/2GLjtOTW90hI= +github.com/libp2p/go-libp2p-discovery v0.1.0/go.mod h1:4F/x+aldVHjHDHuX85x1zWoFTGElt8HnoDzwkFZm29g= +github.com/libp2p/go-libp2p-kbucket v0.2.0 h1:FB2a0VkOTNGTP5gu/I444u4WabNM9V1zCkQcWb7zajI= +github.com/libp2p/go-libp2p-kbucket v0.2.0/go.mod h1:JNymBToym3QXKBMKGy3m29+xprg0EVr/GJFHxFEdgh8= +github.com/libp2p/go-libp2p-loggables v0.1.0 h1:h3w8QFfCt2UJl/0/NW4K829HX/0S4KD31PQ7m8UXXO8= +github.com/libp2p/go-libp2p-loggables v0.1.0/go.mod h1:EyumB2Y6PrYjr55Q3/tiJ/o3xoDasoRYM7nOzEpoa90= +github.com/libp2p/go-libp2p-mplex v0.2.0/go.mod h1:Ejl9IyjvXJ0T9iqUTE1jpYATQ9NM3g+OtR+EMMODbKo= +github.com/libp2p/go-libp2p-mplex v0.2.1 h1:E1xaJBQnbSiTHGI1gaBKmKhu1TUKkErKJnE8iGvirYI= +github.com/libp2p/go-libp2p-mplex v0.2.1/go.mod h1:SC99Rxs8Vuzrf/6WhmH41kNn13TiYdAWNYHrwImKLnE= github.com/libp2p/go-libp2p-nat v0.0.4 h1:+KXK324yaY701On8a0aGjTnw8467kW3ExKcqW2wwmyw= github.com/libp2p/go-libp2p-nat v0.0.4/go.mod h1:N9Js/zVtAXqaeT99cXgTV9e75KpnWCvVOiGzlcHmBbY= -github.com/libp2p/go-libp2p-net v0.0.1 h1:xJ4Vh4yKF/XKb8fd1Ev0ebAGzVjMxXzrxG2kjtU+F5Q= -github.com/libp2p/go-libp2p-net v0.0.1/go.mod h1:Yt3zgmlsHOgUWSXmt5V/Jpz9upuJBE8EgNU9DrCcR8c= -github.com/libp2p/go-libp2p-net v0.0.2 h1:qP06u4TYXfl7uW/hzqPhlVVTSA2nw1B/bHBJaUnbh6M= -github.com/libp2p/go-libp2p-net v0.0.2/go.mod h1:Yt3zgmlsHOgUWSXmt5V/Jpz9upuJBE8EgNU9DrCcR8c= -github.com/libp2p/go-libp2p-netutil v0.0.1 h1:LgD6+skofkOx8z6odD9+MZHKjupv3ng1u6KRhaADTnA= -github.com/libp2p/go-libp2p-netutil v0.0.1/go.mod h1:GdusFvujWZI9Vt0X5BKqwWWmZFxecf9Gt03cKxm2f/Q= -github.com/libp2p/go-libp2p-peer v0.0.1 h1:0qwAOljzYewINrU+Kndoc+1jAL7vzY/oY2Go4DCGfyY= -github.com/libp2p/go-libp2p-peer v0.0.1/go.mod h1:nXQvOBbwVqoP+T5Y5nCjeH4sP9IX/J0AMzcDUVruVoo= -github.com/libp2p/go-libp2p-peer v0.1.0 h1:9D1St1vqXRkeAhNdDtpt8AivS1bhzA6yH+YWrVXWcWI= -github.com/libp2p/go-libp2p-peer v0.1.0/go.mod h1:nXQvOBbwVqoP+T5Y5nCjeH4sP9IX/J0AMzcDUVruVoo= -github.com/libp2p/go-libp2p-peerstore v0.0.1 h1:twKovq8YK5trLrd3nB7PD2Zu9JcyAIdm7Bz9yBWjhq8= -github.com/libp2p/go-libp2p-peerstore v0.0.1/go.mod h1:RabLyPVJLuNQ+GFyoEkfi8H4Ti6k/HtZJ7YKgtSq+20= -github.com/libp2p/go-libp2p-peerstore v0.0.2 h1:Lirt3A1Oq11jszJ4SPNBo8chNv61UWXE538KUEGxTVk= -github.com/libp2p/go-libp2p-peerstore v0.0.2/go.mod h1:RabLyPVJLuNQ+GFyoEkfi8H4Ti6k/HtZJ7YKgtSq+20= -github.com/libp2p/go-libp2p-protocol v0.0.1 h1:+zkEmZ2yFDi5adpVE3t9dqh/N9TbpFWywowzeEzBbLM= -github.com/libp2p/go-libp2p-protocol v0.0.1/go.mod h1:Af9n4PiruirSDjHycM1QuiMi/1VZNHYcK8cLgFJLZ4s= -github.com/libp2p/go-libp2p-record v0.0.1 h1:zN7AS3X46qmwsw5JLxdDuI43cH5UYwovKxHPjKBYQxw= -github.com/libp2p/go-libp2p-record v0.0.1/go.mod h1:grzqg263Rug/sRex85QrDOLntdFAymLDLm7lxMgU79Q= -github.com/libp2p/go-libp2p-routing v0.0.1 h1:hPMAWktf9rYi3ME4MG48qE7dq1ofJxiQbfdvpNntjhc= -github.com/libp2p/go-libp2p-routing v0.0.1/go.mod h1:N51q3yTr4Zdr7V8Jt2JIktVU+3xBBylx1MZeVA6t1Ys= -github.com/libp2p/go-libp2p-secio v0.0.1 h1:CqE/RdsizOwItdgLe632iyft/w0tshDLmZGAiKDcUAI= -github.com/libp2p/go-libp2p-secio v0.0.1/go.mod h1:IdG6iQybdcYmbTzxp4J5dwtUEDTOvZrT0opIDVNPrJs= -github.com/libp2p/go-libp2p-swarm v0.0.1 h1:Vne+hjaDwXqzgNwQ2vb2YKbnbOTyXjtS47stT66Apc4= -github.com/libp2p/go-libp2p-swarm v0.0.1/go.mod h1:mh+KZxkbd3lQnveQ3j2q60BM1Cw2mX36XXQqwfPOShs= -github.com/libp2p/go-libp2p-swarm v0.0.2 h1:cpHHXTeU2IgUu8LPemF7vaLPGtVC6VxMoll2EwqlC+E= -github.com/libp2p/go-libp2p-swarm v0.0.2/go.mod h1:n0cAAcKyndIrJWctQwjqXlAdIPBZzfdpBjx1SSvz30g= -github.com/libp2p/go-libp2p-transport v0.0.1/go.mod h1:UzbUs9X+PHOSw7S3ZmeOxfnwaQY5vGDzZmKPod3N3tk= -github.com/libp2p/go-libp2p-transport v0.0.4 h1:/CPHQMN75/IQwkhBxxIo6p6PtL3rwFZtlzBROT3e8mw= -github.com/libp2p/go-libp2p-transport v0.0.4/go.mod h1:StoY3sx6IqsP6XKoabsPnHCwqKXWUMWU7Rfcsubee/A= -github.com/libp2p/go-libp2p-transport-upgrader v0.0.1 h1:rNtXkY6dty46mxYOHHAZQchI7gQdJStF683FhVnei/k= -github.com/libp2p/go-libp2p-transport-upgrader v0.0.1/go.mod h1:NJpUAgQab/8K6K0m+JmZCe5RUXG10UMEx4kWe9Ipj5c= -github.com/libp2p/go-maddr-filter v0.0.1 h1:apvYTg0aIxxQyBX+XHKOR+0+lYhGs1Yv+JmTH9nyl5I= -github.com/libp2p/go-maddr-filter v0.0.1/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= -github.com/libp2p/go-mplex v0.0.1 h1:dn2XGSrUxLtz3/8u85bGrwhUEKPX8MOF3lpmcWBZCWc= -github.com/libp2p/go-mplex v0.0.1/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0= -github.com/libp2p/go-msgio v0.0.1 h1:znj97n5FtXGCLDwe9x8jpHmY770SW4WStBGcCDh6GJw= -github.com/libp2p/go-msgio v0.0.1/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= +github.com/libp2p/go-libp2p-netutil v0.1.0 h1:zscYDNVEcGxyUpMd0JReUZTrpMfia8PmLKcKF72EAMQ= +github.com/libp2p/go-libp2p-netutil v0.1.0/go.mod h1:3Qv/aDqtMLTUyQeundkKsA+YCThNdbQD54k3TqjpbFU= +github.com/libp2p/go-libp2p-peer v0.2.0 h1:EQ8kMjaCUwt/Y5uLgjT8iY2qg0mGUT0N1zUjer50DsY= +github.com/libp2p/go-libp2p-peer v0.2.0/go.mod h1:RCffaCvUyW2CJmG2gAWVqwePwW7JMgxjsHm7+J5kjWY= +github.com/libp2p/go-libp2p-peerstore v0.1.0 h1:MKh7pRNPHSh1fLPj8u/M/s/napdmeNpoi9BRy9lPN0E= +github.com/libp2p/go-libp2p-peerstore v0.1.0/go.mod h1:2CeHkQsr8svp4fZ+Oi9ykN1HBb6u0MOvdJ7YIsmcwtY= +github.com/libp2p/go-libp2p-record v0.1.0 h1:wHwBGbFzymoIl69BpgwIu0O6ta3TXGcMPvHUAcodzRc= +github.com/libp2p/go-libp2p-record v0.1.0/go.mod h1:ujNc8iuE5dlKWVy6wuL6dd58t0n7xI4hAIl8pE6wu5Q= +github.com/libp2p/go-libp2p-routing v0.1.0 h1:hFnj3WR3E2tOcKaGpyzfP4gvFZ3t8JkQmbapN0Ct+oU= +github.com/libp2p/go-libp2p-routing v0.1.0/go.mod h1:zfLhI1RI8RLEzmEaaPwzonRvXeeSHddONWkcTcB54nE= +github.com/libp2p/go-libp2p-secio v0.1.0 h1:NNP5KLxuP97sE5Bu3iuwOWyT/dKEGMN5zSLMWdB7GTQ= +github.com/libp2p/go-libp2p-secio v0.1.0/go.mod h1:tMJo2w7h3+wN4pgU2LSYeiKPrfqBgkOsdiKK77hE7c8= +github.com/libp2p/go-libp2p-swarm v0.1.0 h1:HrFk2p0awrGEgch9JXK/qp/hfjqQfgNxpLWnCiWPg5s= +github.com/libp2p/go-libp2p-swarm v0.1.0/go.mod h1:wQVsCdjsuZoc730CgOvh5ox6K8evllckjebkdiY5ta4= +github.com/libp2p/go-libp2p-testing v0.0.2/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= +github.com/libp2p/go-libp2p-testing v0.0.3 h1:bdij4bKaaND7tCsaXVjRfYkMpvoOeKj9AVQGJllA6jM= +github.com/libp2p/go-libp2p-testing v0.0.3/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= +github.com/libp2p/go-libp2p-transport-upgrader v0.1.1 h1:PZMS9lhjK9VytzMCW3tWHAXtKXmlURSc3ZdvwEcKCzw= +github.com/libp2p/go-libp2p-transport-upgrader v0.1.1/go.mod h1:IEtA6or8JUbsV07qPW4r01GnTenLW4oi3lOPbUMGJJA= +github.com/libp2p/go-libp2p-yamux v0.2.0 h1:TSPZ5cMMz/wdoYsye/wU1TE4G3LDGMoeEN0xgnCKU/I= +github.com/libp2p/go-libp2p-yamux v0.2.0/go.mod h1:Db2gU+XfLpm6E4rG5uGCFX6uXA8MEXOxFcRoXUODaK8= +github.com/libp2p/go-maddr-filter v0.0.4 h1:hx8HIuuwk34KePddrp2mM5ivgPkZ09JH4AvsALRbFUs= +github.com/libp2p/go-maddr-filter v0.0.4/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= +github.com/libp2p/go-mplex v0.0.3 h1:YiMaevQcZtFU6DmKIF8xEO0vaui5kM5HJ1V1xkWQv14= +github.com/libp2p/go-mplex v0.0.3/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0= +github.com/libp2p/go-mplex v0.1.0 h1:/nBTy5+1yRyY82YaO6HXQRnO5IAGsXTjEJaR3LdTPc0= +github.com/libp2p/go-mplex v0.1.0/go.mod h1:SXgmdki2kwCUlCCbfGLEgHjC4pFqhTp0ZoV6aiKgxDU= +github.com/libp2p/go-msgio v0.0.2 h1:ivPvEKHxmVkTClHzg6RXTYHqaJQ0V9cDbq+6lKb3UV0= +github.com/libp2p/go-msgio v0.0.2/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= github.com/libp2p/go-nat v0.0.3 h1:l6fKV+p0Xa354EqQOQP+d8CivdLM4kl5GxC1hSc/UeI= github.com/libp2p/go-nat v0.0.3/go.mod h1:88nUEt0k0JD45Bk93NIwDqjlhiOwOoV36GchpcVc1yI= github.com/libp2p/go-reuseport v0.0.1 h1:7PhkfH73VXfPJYKQ6JwS5I/eVcoyYi9IMNGc6FWpFLw= github.com/libp2p/go-reuseport v0.0.1/go.mod h1:jn6RmB1ufnQwl0Q1f+YxAj8isJgDCQzaaxIFYDhcYEA= -github.com/libp2p/go-reuseport-transport v0.0.1 h1:UIRneNxLDmEGNjGHpIiWzSWkZ5bhxMCP9x3Vh7BSc7E= -github.com/libp2p/go-reuseport-transport v0.0.1/go.mod h1:YkbSDrvjUVDL6b8XqriyA20obEtsW9BLkuOUyQAOCbs= github.com/libp2p/go-reuseport-transport v0.0.2 h1:WglMwyXyBu61CMkjCCtnmqNqnjib0GIEjMiHTwR/KN4= github.com/libp2p/go-reuseport-transport v0.0.2/go.mod h1:YkbSDrvjUVDL6b8XqriyA20obEtsW9BLkuOUyQAOCbs= github.com/libp2p/go-stream-muxer v0.0.1 h1:Ce6e2Pyu+b5MC1k3eeFtAax0pW4gc6MosYSLV05UeLw= github.com/libp2p/go-stream-muxer v0.0.1/go.mod h1:bAo8x7YkSpadMTbtTaxGVHWUQsR/l5MEaHbKaliuT14= -github.com/libp2p/go-tcp-transport v0.0.1 h1:WyvJVw2lYAnr6CU+GZZ4oCt06fvORlmvBlFX2+ZpZDM= -github.com/libp2p/go-tcp-transport v0.0.1/go.mod h1:mnjg0o0O5TmXUaUIanYPUqkW4+u6mK0en8rlpA6BBTs= -github.com/libp2p/go-tcp-transport v0.0.2 h1:EzOSRaHpyrGpJ5qe+9SaxJM1mrWlkSLFfNTufUkq0lg= -github.com/libp2p/go-tcp-transport v0.0.2/go.mod h1:VjZFHasNJ0QiJQNNwiFDy25qyGWTXQWs8GM5DR4/L1k= -github.com/libp2p/go-testutil v0.0.1 h1:Xg+O0G2HIMfHqBOBDcMS1iSZJ3GEcId4qOxCQvsGZHk= -github.com/libp2p/go-testutil v0.0.1/go.mod h1:iAcJc/DKJQanJ5ws2V+u5ywdL2n12X1WbbEG+Jjy69I= -github.com/libp2p/go-ws-transport v0.0.2/go.mod h1:p3bKjDWHEgtuKKj+2OdPYs5dAPIjtpQGHF2tJfGz7Ww= +github.com/libp2p/go-stream-muxer-multistream v0.2.0 h1:714bRJ4Zy9mdhyTLJ+ZKiROmAFwUHpeRidG+q7LTQOg= +github.com/libp2p/go-stream-muxer-multistream v0.2.0/go.mod h1:j9eyPol/LLRqT+GPLSxvimPhNph4sfYfMoDPd7HkzIc= +github.com/libp2p/go-tcp-transport v0.1.0 h1:IGhowvEqyMFknOar4FWCKSWE0zL36UFKQtiRQD60/8o= +github.com/libp2p/go-tcp-transport v0.1.0/go.mod h1:oJ8I5VXryj493DEJ7OsBieu8fcg2nHGctwtInJVpipc= +github.com/libp2p/go-ws-transport v0.1.0/go.mod h1:rjw1MG1LU9YDC6gzmwObkPd/Sqwhw7yT74kj3raBFuo= +github.com/libp2p/go-yamux v1.2.2 h1:s6J6o7+ajoQMjHe7BEnq+EynOj5D2EoG8CuQgL3F2vg= +github.com/libp2p/go-yamux v1.2.2/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= github.com/mattn/go-colorable v0.1.1 h1:G1f5SKeVxmagw/IyvzvtZE4Gybcc4Tr1tf7I8z0XgOg= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= github.com/mattn/go-isatty v0.0.5 h1:tHXDdz1cpzGaovsTB+TVB8q90WEokoVmfMqoVcrLUgw= github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/miekg/dns v1.1.4/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/miekg/dns v1.1.12/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0OXOcUbGjvZxxijuBwbbmlSxLiuofa+g= github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16 h1:5W7KhL8HVF3XCFOweFD3BNESdnO8ewyYTFT2R+/b8FQ= github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= +github.com/minio/sha256-simd v0.0.0-20190328051042-05b4dd3047e5 h1:l16XLUUJ34wIz+RIvLhSwGvLvKyy+W598b135bJN6mg= +github.com/minio/sha256-simd v0.0.0-20190328051042-05b4dd3047e5/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= +github.com/minio/sha256-simd v0.1.0 h1:U41/2erhAKcmSI14xh/ZTUdBPOzDOIfS93ibzUSl8KM= +github.com/minio/sha256-simd v0.1.0/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= github.com/mr-tron/base58 v1.1.0 h1:Y51FGVJ91WBqCEabAi5OPUz38eAx8DakuAm5svLcsfQ= github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= +github.com/mr-tron/base58 v1.1.1/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= +github.com/mr-tron/base58 v1.1.2 h1:ZEw4I2EgPKDJ2iEw0cNmLB3ROrEmkOtXIkaG7wZg+78= +github.com/mr-tron/base58 v1.1.2/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= github.com/multiformats/go-base32 v0.0.3 h1:tw5+NhuwaOjJCC5Pp82QuXbrmLzWg7uxlMFp8Nq/kkI= github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= github.com/multiformats/go-multiaddr v0.0.1 h1:/QUV3VBMDI6pi6xfiw7lr6xhDWWvQKn9udPn68kLSdY= github.com/multiformats/go-multiaddr v0.0.1/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= +github.com/multiformats/go-multiaddr v0.0.2/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= +github.com/multiformats/go-multiaddr v0.0.4 h1:WgMSI84/eRLdbptXMkMWDXPjPq7SPLIgGUVm2eroyU4= +github.com/multiformats/go-multiaddr v0.0.4/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= github.com/multiformats/go-multiaddr-dns v0.0.1/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= github.com/multiformats/go-multiaddr-dns v0.0.2 h1:/Bbsgsy3R6e3jf2qBahzNHzww6usYaZ0NhNH3sqdFS8= github.com/multiformats/go-multiaddr-dns v0.0.2/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= +github.com/multiformats/go-multiaddr-fmt v0.0.1 h1:5YjeOIzbX8OTKVaN72aOzGIYW7PnrZrnkDyOfAWRSMA= +github.com/multiformats/go-multiaddr-fmt v0.0.1/go.mod h1:aBYjqL4T/7j4Qx+R73XSv/8JsgnRFlf0w2KGLCmXl3Q= github.com/multiformats/go-multiaddr-net v0.0.1 h1:76O59E3FavvHqNg7jvzWzsPSW5JSi/ek0E4eiDVbg9g= github.com/multiformats/go-multiaddr-net v0.0.1/go.mod h1:nw6HSxNmCIQH27XPGBuX+d1tnvM7ihcFwHMSstNAVUU= github.com/multiformats/go-multibase v0.0.1 h1:PN9/v21eLywrFWdFNsFKaU04kLJzuYzmrJR+ubhT9qA= github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs= github.com/multiformats/go-multihash v0.0.1 h1:HHwN1K12I+XllBCrqKnhX949Orn4oawPkegHMu2vDqQ= github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= -github.com/multiformats/go-multistream v0.0.1 h1:JV4VfSdY9n7ECTtY59/TlSyFCzRILvYx4T4Ws8ZgihU= -github.com/multiformats/go-multistream v0.0.1/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/multiformats/go-multihash v0.0.5 h1:1wxmCvTXAifAepIMyF39vZinRw5sbqjPs/UIi93+uik= +github.com/multiformats/go-multihash v0.0.5/go.mod h1:lt/HCbqlQwlPBz7lv0sQCdtfcMtlJvakRUn/0Ual8po= +github.com/multiformats/go-multistream v0.1.0 h1:UpO6jrsjqs46mqAK3n6wKRYFhugss9ArzbyUzU+4wkQ= +github.com/multiformats/go-multistream v0.1.0/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= 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/ginkgo v1.8.0 h1:VkHVNpR4iVnU8XQR6DBm8BqYjN7CRzw+xKUbVVbbW9w= +github.com/onsi/ginkgo v1.8.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/onsi/gomega v1.5.0 h1:izbySO9zDPmjJ8rDjLvkA2zJHIo+HkYXHnf7eN7SSyo= +github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/opentracing/opentracing-go v1.0.2 h1:3jA2P6O1F9UOrWVpwrIo17pu01KWvNWg4X946/Y5Zwg= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= -github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= -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_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a h1:/eS3yfGjQKG+9kayBkj0ip1BGhq6zJ3eaVksphxAaek= +github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a/go.mod h1:7AyxJNCJ7SBZ1MfVQCWD6Uqo2oubI2Eq2y2eqf+A5r0= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 h1:RC6RW7j+1+HkWaX/Yh71Ee5ZHaHYt7ZP4sQgUrm6cDU= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572/go.mod h1:w0SWMsp6j9O/dk4/ZpIhL+3CkG8ofA2vuv7k+ltqUMc= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/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 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= @@ -273,86 +243,66 @@ github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc h1:9lDbC6 github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc/go.mod h1:bopw91TMyo8J3tvftk8xmU2kPmlrt4nScJQZU2hE5EM= github.com/whyrusleeping/go-notifier v0.0.0-20170827234753-097c5d47330f h1:M/lL30eFZTKnomXY6huvM6G0+gVquFNf6mxghaWlFUg= github.com/whyrusleeping/go-notifier v0.0.0-20170827234753-097c5d47330f/go.mod h1:cZNvX9cFybI01GriPRMXDtczuvUhgbcYr9iCGaNlRv8= -github.com/whyrusleeping/go-smux-multiplex v3.0.16+incompatible h1:iqksILj8STw03EJQe7Laj4ubnw+ojOyik18cd5vPL1o= -github.com/whyrusleeping/go-smux-multiplex v3.0.16+incompatible/go.mod h1:34LEDbeKFZInPUrAG+bjuJmUXONGdEFW7XL0SpTY1y4= -github.com/whyrusleeping/go-smux-multistream v2.0.2+incompatible h1:BdYHctE9HJZLquG9tpTdwWcbG4FaX6tVKPGjCGgiVxo= -github.com/whyrusleeping/go-smux-multistream v2.0.2+incompatible/go.mod h1:dRWHHvc4HDQSHh9gbKEBbUZ+f2Q8iZTPG3UOGYODxSQ= -github.com/whyrusleeping/go-smux-yamux v2.0.8+incompatible h1:IGm/UP/JpEFS6D787sZnZg7RA6fZIR9c/Ms9DeAVNuk= -github.com/whyrusleeping/go-smux-yamux v2.0.8+incompatible/go.mod h1:6qHUzBXUbB9MXmw3AUdB52L8sEb/hScCqOdW2kj/wuI= -github.com/whyrusleeping/go-smux-yamux v2.0.9+incompatible h1:nVkExQ7pYlN9e45LcqTCOiDD0904fjtm0flnHZGbXkw= -github.com/whyrusleeping/go-smux-yamux v2.0.9+incompatible/go.mod h1:6qHUzBXUbB9MXmw3AUdB52L8sEb/hScCqOdW2kj/wuI= github.com/whyrusleeping/mafmt v1.2.8 h1:TCghSl5kkwEE0j+sU/gudyhVMRlpBin8fMBBHg59EbA= github.com/whyrusleeping/mafmt v1.2.8/go.mod h1:faQJFPbLSxzD9xpA02ttW/tS9vZykNvXwGvqIpk20FA= github.com/whyrusleeping/mdns v0.0.0-20180901202407-ef14215e6b30/go.mod h1:j4l84WPFclQPj320J9gp0XwNKBb3U0zt5CBqjPp22G4= github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7 h1:E9S12nwJwEOXe2d6gT6qxdvqMnNq+VnSsKPgm2ZZNds= github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7/go.mod h1:X2c0RVCI1eSUFI8eLcY3c0423ykwiUdxLJtkDvruhjI= -github.com/whyrusleeping/yamux v1.1.5 h1:4CK3aUUJQu0qpKZv5gEWJjNOQtdbdDhVVS6PJ+HimdE= -github.com/whyrusleeping/yamux v1.1.5/go.mod h1:E8LnQQ8HKx5KD29HZFUwM1PxCOdPRzGwur1mcYhXcD8= -go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= -go.opencensus.io v0.20.2 h1:NAfh7zF0/3/HqtMvJNZ/RFrSlCE6ZTlHmKfhL/Dm1Jk= -go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= +go.opencensus.io v0.21.0 h1:mU6zScU4U1YAFPHEHYk+3JC4SY7JxgkqS10ZOSyksNg= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b h1:+/WWzjwW6gidDJnMKWLKLX1gxn7irUTF1fLpQovfQ5M= golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25 h1:jsG6UpNLt9iAsb0S2AGW28DveNzzgmbXR+ENoPjUeIU= -golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= 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/crypto v0.0.0-20190426145343-a29dc8fdc734 h1:p/H982KKEjUnLJkM3tt/LemDnOc1GiZL5FCVlORJ5zo= +golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f h1:R423Cnkcp5JABoeemiGEPlt9tHXFfw5kvc0yqlxRPWo= +golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190227160552-c95aed5357e7 h1:C2F/nMkR/9sfUTpvR3QrjBuTdvMUC/cFajkphs1YLQo= golang.org/x/net v0.0.0-20190227160552-c95aed5357e7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a h1:oWX7TPOiFAMXLq8o0ikBYfCJVlRHBcsciT5bXOrH628= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3 h1:0GoQqolDA55aaLxZyTzK/Y2ePZzZTUrRacwib7cNsYQ= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f h1:wMNYb4v58l5UBM7MYRLPG6ZhfOqbKu7X5eyFl8ZhKvA= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6 h1:bjcUS9ztw9kFmmIxJInhon/0Is3p+EHBKNgquIzo1OI= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/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-20190219092855-153ac476189d/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223 h1:DH4skfRX4EBpamg7iV4ZlCpblAHI6s6TDM39bFZumv8= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190228124157-a34e9553db1e h1:ZytStCyV048ZqDsWHiYDdoI2Vd4msMcrDECFxS+tL9c= golang.org/x/sys v0.0.0-20190228124157-a34e9553db1e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d h1:+R4KGOnez64A81RvjARKc4UT5/tI9ujCIVX+P5KiHuI= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/xerrors v0.0.0-20190212162355-a5947ffaace3 h1:P6iTFmrTQqWrqLZPX1VMzCUbCRCAUXSUsSpkEOvWzJ0= -golang.org/x/xerrors v0.0.0-20190212162355-a5947ffaace3/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= +golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522 h1:bhOzK9QyoD0ogCnFro1m2mz41+Ib0oOhfJnBp5MR4K4= +golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -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= @@ -362,5 +312,4 @@ gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkep gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.1 h1:mUhvW9EsL+naU5Q3cakzfE91YhliOondGd6ZrsDBHQE= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/vendor/github.com/libp2p/go-libp2p-kad-dht/handlers.go b/vendor/github.com/libp2p/go-libp2p-kad-dht/handlers.go index 99ad280f..aaeef7ca 100644 --- a/vendor/github.com/libp2p/go-libp2p-kad-dht/handlers.go +++ b/vendor/github.com/libp2p/go-libp2p-kad-dht/handlers.go @@ -7,14 +7,16 @@ import ( "fmt" "time" + "github.com/libp2p/go-libp2p-core/network" + "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p-core/peerstore" + pstore "github.com/libp2p/go-libp2p-peerstore" + proto "github.com/gogo/protobuf/proto" cid "github.com/ipfs/go-cid" ds "github.com/ipfs/go-datastore" u "github.com/ipfs/go-ipfs-util" pb "github.com/libp2p/go-libp2p-kad-dht/pb" - inet "github.com/libp2p/go-libp2p-net" - peer "github.com/libp2p/go-libp2p-peer" - pstore "github.com/libp2p/go-libp2p-peerstore" recpb "github.com/libp2p/go-libp2p-record/pb" base32 "github.com/whyrusleeping/base32" ) @@ -69,6 +71,7 @@ func (dht *IpfsDHT) handleGetValue(ctx context.Context, p peer.ID, pmes *pb.Mess // Find closest peer on given cluster to desired key and reply with that info closer := dht.betterPeersToQuery(pmes, p, CloserPeerCount) if len(closer) > 0 { + // TODO: pstore.PeerInfos should move to core (=> peerstore.AddrInfos). closerinfos := pstore.PeerInfos(dht.peerstore, closer) for _, pi := range closerinfos { logger.Debugf("handleGetValue returning closer peer: '%s'", pi.ID) @@ -265,7 +268,7 @@ func (dht *IpfsDHT) handleFindPeer(ctx context.Context, p peer.ID, pmes *pb.Mess // add a progressive, asynchronous `SearchPeer` function // and improve peer routing in the host. switch dht.host.Network().Connectedness(targetPid) { - case inet.Connected, inet.CanConnect: + case network.Connected, network.CanConnect: closest = append(closest, targetPid) } } @@ -276,9 +279,10 @@ func (dht *IpfsDHT) handleFindPeer(ctx context.Context, p peer.ID, pmes *pb.Mess return resp, nil } + // TODO: pstore.PeerInfos should move to core (=> peerstore.AddrInfos). closestinfos := pstore.PeerInfos(dht.peerstore, closest) // possibly an over-allocation but this array is temporary anyways. - withAddresses := make([]pstore.PeerInfo, 0, len(closestinfos)) + withAddresses := make([]peer.AddrInfo, 0, len(closestinfos)) for _, pi := range closestinfos { if len(pi.Addrs) > 0 { withAddresses = append(withAddresses, pi) @@ -321,6 +325,7 @@ func (dht *IpfsDHT) handleGetProviders(ctx context.Context, p peer.ID, pmes *pb. } if len(providers) > 0 { + // TODO: pstore.PeerInfos should move to core (=> peerstore.AddrInfos). infos := pstore.PeerInfos(dht.peerstore, providers) resp.ProviderPeers = pb.PeerInfosToPBPeers(dht.host.Network(), infos) logger.Debugf("%s have %d providers: %s", reqDesc, len(providers), infos) @@ -329,6 +334,7 @@ func (dht *IpfsDHT) handleGetProviders(ctx context.Context, p peer.ID, pmes *pb. // Also send closer peers. closer := dht.betterPeersToQuery(pmes, p, CloserPeerCount) if closer != nil { + // TODO: pstore.PeerInfos should move to core (=> peerstore.AddrInfos). infos := pstore.PeerInfos(dht.peerstore, closer) resp.CloserPeers = pb.PeerInfosToPBPeers(dht.host.Network(), infos) logger.Debugf("%s have %d closer peers: %s", reqDesc, len(closer), infos) @@ -368,7 +374,7 @@ func (dht *IpfsDHT) handleAddProvider(ctx context.Context, p peer.ID, pmes *pb.M logger.Debugf("received provider %s for %s (addrs: %s)", p, c, pi.Addrs) if pi.ID != dht.self { // don't add own addrs. // add the received addresses to our peerstore. - dht.peerstore.AddAddrs(pi.ID, pi.Addrs, pstore.ProviderAddrTTL) + dht.peerstore.AddAddrs(pi.ID, pi.Addrs, peerstore.ProviderAddrTTL) } dht.providers.AddProvider(ctx, c, p) } diff --git a/vendor/github.com/libp2p/go-libp2p-kad-dht/lookup.go b/vendor/github.com/libp2p/go-libp2p-kad-dht/lookup.go index 9d482292..ea5bb31a 100644 --- a/vendor/github.com/libp2p/go-libp2p-kad-dht/lookup.go +++ b/vendor/github.com/libp2p/go-libp2p-kad-dht/lookup.go @@ -5,11 +5,12 @@ import ( "fmt" "strings" + "github.com/libp2p/go-libp2p-core/peer" + cid "github.com/ipfs/go-cid" logging "github.com/ipfs/go-log" pb "github.com/libp2p/go-libp2p-kad-dht/pb" kb "github.com/libp2p/go-libp2p-kbucket" - peer "github.com/libp2p/go-libp2p-peer" notif "github.com/libp2p/go-libp2p-routing/notifications" ) diff --git a/vendor/github.com/libp2p/go-libp2p-kad-dht/metrics/metrics.go b/vendor/github.com/libp2p/go-libp2p-kad-dht/metrics/metrics.go index da07e701..bbe48015 100644 --- a/vendor/github.com/libp2p/go-libp2p-kad-dht/metrics/metrics.go +++ b/vendor/github.com/libp2p/go-libp2p-kad-dht/metrics/metrics.go @@ -41,56 +41,55 @@ var ( SentBytes = stats.Int64("libp2p.io/dht/kad/sent_bytes", "Total sent bytes per RPC", stats.UnitBytes) ) -// Views -var ( - ReceivedMessagesView = &view.View{ +var DefaultViews = []*view.View{ + &view.View{ Measure: ReceivedMessages, TagKeys: []tag.Key{KeyMessageType, KeyPeerID, KeyInstanceID}, Aggregation: view.Count(), - } - ReceivedMessageErrorsView = &view.View{ + }, + &view.View{ Measure: ReceivedMessageErrors, TagKeys: []tag.Key{KeyMessageType, KeyPeerID, KeyInstanceID}, Aggregation: view.Count(), - } - ReceivedBytesView = &view.View{ + }, + &view.View{ Measure: ReceivedBytes, TagKeys: []tag.Key{KeyMessageType, KeyPeerID, KeyInstanceID}, Aggregation: defaultBytesDistribution, - } - InboundRequestLatencyView = &view.View{ + }, + &view.View{ Measure: InboundRequestLatency, TagKeys: []tag.Key{KeyMessageType, KeyPeerID, KeyInstanceID}, Aggregation: defaultMillisecondsDistribution, - } - OutboundRequestLatencyView = &view.View{ + }, + &view.View{ Measure: OutboundRequestLatency, TagKeys: []tag.Key{KeyMessageType, KeyPeerID, KeyInstanceID}, Aggregation: defaultMillisecondsDistribution, - } - SentMessagesView = &view.View{ + }, + &view.View{ Measure: SentMessages, TagKeys: []tag.Key{KeyMessageType, KeyPeerID, KeyInstanceID}, Aggregation: view.Count(), - } - SentMessageErrorsView = &view.View{ + }, + &view.View{ Measure: SentMessageErrors, TagKeys: []tag.Key{KeyMessageType, KeyPeerID, KeyInstanceID}, Aggregation: view.Count(), - } - SentRequestsView = &view.View{ + }, + &view.View{ Measure: SentRequests, TagKeys: []tag.Key{KeyMessageType, KeyPeerID, KeyInstanceID}, Aggregation: view.Count(), - } - SentRequestErrorsView = &view.View{ + }, + &view.View{ Measure: SentRequestErrors, TagKeys: []tag.Key{KeyMessageType, KeyPeerID, KeyInstanceID}, Aggregation: view.Count(), - } - SentBytesView = &view.View{ + }, + &view.View{ Measure: SentBytes, TagKeys: []tag.Key{KeyMessageType, KeyPeerID, KeyInstanceID}, Aggregation: defaultBytesDistribution, - } -) + }, +} diff --git a/vendor/github.com/libp2p/go-libp2p-kad-dht/notif.go b/vendor/github.com/libp2p/go-libp2p-kad-dht/notif.go index fbcb073b..3af75849 100644 --- a/vendor/github.com/libp2p/go-libp2p-kad-dht/notif.go +++ b/vendor/github.com/libp2p/go-libp2p-kad-dht/notif.go @@ -1,7 +1,9 @@ package dht import ( - inet "github.com/libp2p/go-libp2p-net" + "github.com/libp2p/go-libp2p-core/helpers" + "github.com/libp2p/go-libp2p-core/network" + ma "github.com/multiformats/go-multiaddr" mstream "github.com/multiformats/go-multistream" ) @@ -13,7 +15,7 @@ func (nn *netNotifiee) DHT() *IpfsDHT { return (*IpfsDHT)(nn) } -func (nn *netNotifiee) Connected(n inet.Network, v inet.Conn) { +func (nn *netNotifiee) Connected(n network.Network, v network.Conn) { dht := nn.DHT() select { case <-dht.Process().Closing(): @@ -29,7 +31,7 @@ func (nn *netNotifiee) Connected(n inet.Network, v inet.Conn) { // notifications are serialized but it's nice to be consistent. dht.plk.Lock() defer dht.plk.Unlock() - if dht.host.Network().Connectedness(p) == inet.Connected { + if dht.host.Network().Connectedness(p) == network.Connected { dht.Update(dht.Context(), p) } return @@ -41,7 +43,7 @@ func (nn *netNotifiee) Connected(n inet.Network, v inet.Conn) { go nn.testConnection(v) } -func (nn *netNotifiee) testConnection(v inet.Conn) { +func (nn *netNotifiee) testConnection(v network.Conn) { dht := nn.DHT() p := v.RemotePeer() @@ -53,7 +55,7 @@ func (nn *netNotifiee) testConnection(v inet.Conn) { // Connection error return } - defer inet.FullClose(s) + defer helpers.FullClose(s) selected, err := mstream.SelectOneOf(dht.protocolStrs(), s) if err != nil { @@ -68,12 +70,12 @@ func (nn *netNotifiee) testConnection(v inet.Conn) { // event and add the peer to the routing table after removing it. dht.plk.Lock() defer dht.plk.Unlock() - if dht.host.Network().Connectedness(p) == inet.Connected { + if dht.host.Network().Connectedness(p) == network.Connected { dht.Update(dht.Context(), p) } } -func (nn *netNotifiee) Disconnected(n inet.Network, v inet.Conn) { +func (nn *netNotifiee) Disconnected(n network.Network, v network.Conn) { dht := nn.DHT() select { case <-dht.Process().Closing(): @@ -87,7 +89,7 @@ func (nn *netNotifiee) Disconnected(n inet.Network, v inet.Conn) { // we don't concurrently process a connect event. dht.plk.Lock() defer dht.plk.Unlock() - if dht.host.Network().Connectedness(p) == inet.Connected { + if dht.host.Network().Connectedness(p) == network.Connected { // We're still connected. return } @@ -110,7 +112,7 @@ func (nn *netNotifiee) Disconnected(n inet.Network, v inet.Conn) { }() } -func (nn *netNotifiee) OpenedStream(n inet.Network, v inet.Stream) {} -func (nn *netNotifiee) ClosedStream(n inet.Network, v inet.Stream) {} -func (nn *netNotifiee) Listen(n inet.Network, a ma.Multiaddr) {} -func (nn *netNotifiee) ListenClose(n inet.Network, a ma.Multiaddr) {} +func (nn *netNotifiee) OpenedStream(n network.Network, v network.Stream) {} +func (nn *netNotifiee) ClosedStream(n network.Network, v network.Stream) {} +func (nn *netNotifiee) Listen(n network.Network, a ma.Multiaddr) {} +func (nn *netNotifiee) ListenClose(n network.Network, a ma.Multiaddr) {} diff --git a/vendor/github.com/libp2p/go-libp2p-kad-dht/opts/options.go b/vendor/github.com/libp2p/go-libp2p-kad-dht/opts/options.go index fc73da8b..93ce6c0d 100644 --- a/vendor/github.com/libp2p/go-libp2p-kad-dht/opts/options.go +++ b/vendor/github.com/libp2p/go-libp2p-kad-dht/opts/options.go @@ -5,7 +5,7 @@ import ( ds "github.com/ipfs/go-datastore" dssync "github.com/ipfs/go-datastore/sync" - protocol "github.com/libp2p/go-libp2p-protocol" + protocol "github.com/libp2p/go-libp2p-core/protocol" record "github.com/libp2p/go-libp2p-record" ) diff --git a/vendor/github.com/libp2p/go-libp2p-kad-dht/pb/message.go b/vendor/github.com/libp2p/go-libp2p-kad-dht/pb/message.go index a2a41254..d8fd2727 100644 --- a/vendor/github.com/libp2p/go-libp2p-kad-dht/pb/message.go +++ b/vendor/github.com/libp2p/go-libp2p-kad-dht/pb/message.go @@ -1,10 +1,10 @@ package dht_pb import ( + "github.com/libp2p/go-libp2p-core/network" + "github.com/libp2p/go-libp2p-core/peer" + logging "github.com/ipfs/go-log" - inet "github.com/libp2p/go-libp2p-net" - peer "github.com/libp2p/go-libp2p-peer" - pstore "github.com/libp2p/go-libp2p-peerstore" b58 "github.com/mr-tron/base58/base58" ma "github.com/multiformats/go-multiaddr" ) @@ -12,8 +12,8 @@ import ( var log = logging.Logger("dht.pb") type PeerRoutingInfo struct { - pstore.PeerInfo - inet.Connectedness + peer.AddrInfo + network.Connectedness } // NewMessage constructs a new dht message with given type, key, and level @@ -40,7 +40,7 @@ func peerRoutingInfoToPBPeer(p PeerRoutingInfo) *Message_Peer { return pbp } -func peerInfoToPBPeer(p pstore.PeerInfo) *Message_Peer { +func peerInfoToPBPeer(p peer.AddrInfo) *Message_Peer { pbp := new(Message_Peer) pbp.Addrs = make([][]byte, len(p.Addrs)) @@ -51,9 +51,9 @@ func peerInfoToPBPeer(p pstore.PeerInfo) *Message_Peer { return pbp } -// PBPeerToPeer turns a *Message_Peer into its pstore.PeerInfo counterpart -func PBPeerToPeerInfo(pbp *Message_Peer) *pstore.PeerInfo { - return &pstore.PeerInfo{ +// PBPeerToPeer turns a *Message_Peer into its peer.AddrInfo counterpart +func PBPeerToPeerInfo(pbp *Message_Peer) *peer.AddrInfo { + return &peer.AddrInfo{ ID: peer.ID(pbp.GetId()), Addrs: pbp.Addresses(), } @@ -61,7 +61,7 @@ func PBPeerToPeerInfo(pbp *Message_Peer) *pstore.PeerInfo { // RawPeerInfosToPBPeers converts a slice of Peers into a slice of *Message_Peers, // ready to go out on the wire. -func RawPeerInfosToPBPeers(peers []pstore.PeerInfo) []*Message_Peer { +func RawPeerInfosToPBPeers(peers []peer.AddrInfo) []*Message_Peer { pbpeers := make([]*Message_Peer, len(peers)) for i, p := range peers { pbpeers[i] = peerInfoToPBPeer(p) @@ -72,8 +72,8 @@ func RawPeerInfosToPBPeers(peers []pstore.PeerInfo) []*Message_Peer { // PeersToPBPeers converts given []peer.Peer into a set of []*Message_Peer, // which can be written to a message and sent out. the key thing this function // does (in addition to PeersToPBPeers) is set the ConnectionType with -// information from the given inet.Network. -func PeerInfosToPBPeers(n inet.Network, peers []pstore.PeerInfo) []*Message_Peer { +// information from the given network.Network. +func PeerInfosToPBPeers(n network.Network, peers []peer.AddrInfo) []*Message_Peer { pbps := RawPeerInfosToPBPeers(peers) for i, pbp := range pbps { c := ConnectionType(n.Connectedness(peers[i].ID)) @@ -90,10 +90,10 @@ func PeerRoutingInfosToPBPeers(peers []PeerRoutingInfo) []*Message_Peer { return pbpeers } -// PBPeersToPeerInfos converts given []*Message_Peer into []pstore.PeerInfo +// PBPeersToPeerInfos converts given []*Message_Peer into []peer.AddrInfo // Invalid addresses will be silently omitted. -func PBPeersToPeerInfos(pbps []*Message_Peer) []*pstore.PeerInfo { - peers := make([]*pstore.PeerInfo, 0, len(pbps)) +func PBPeersToPeerInfos(pbps []*Message_Peer) []*peer.AddrInfo { + peers := make([]*peer.AddrInfo, 0, len(pbps)) for _, pbp := range pbps { peers = append(peers, PBPeerToPeerInfo(pbp)) } @@ -149,35 +149,35 @@ func (m *Message) Loggable() map[string]interface{} { } // ConnectionType returns a Message_ConnectionType associated with the -// inet.Connectedness. -func ConnectionType(c inet.Connectedness) Message_ConnectionType { +// network.Connectedness. +func ConnectionType(c network.Connectedness) Message_ConnectionType { switch c { default: return Message_NOT_CONNECTED - case inet.NotConnected: + case network.NotConnected: return Message_NOT_CONNECTED - case inet.Connected: + case network.Connected: return Message_CONNECTED - case inet.CanConnect: + case network.CanConnect: return Message_CAN_CONNECT - case inet.CannotConnect: + case network.CannotConnect: return Message_CANNOT_CONNECT } } -// Connectedness returns an inet.Connectedness associated with the +// Connectedness returns an network.Connectedness associated with the // Message_ConnectionType. -func Connectedness(c Message_ConnectionType) inet.Connectedness { +func Connectedness(c Message_ConnectionType) network.Connectedness { switch c { default: - return inet.NotConnected + return network.NotConnected case Message_NOT_CONNECTED: - return inet.NotConnected + return network.NotConnected case Message_CONNECTED: - return inet.Connected + return network.Connected case Message_CAN_CONNECT: - return inet.CanConnect + return network.CanConnect case Message_CANNOT_CONNECT: - return inet.CannotConnect + return network.CannotConnect } } diff --git a/vendor/github.com/libp2p/go-libp2p-kad-dht/providers/providers.go b/vendor/github.com/libp2p/go-libp2p-kad-dht/providers/providers.go index fd696c30..ec44cc51 100644 --- a/vendor/github.com/libp2p/go-libp2p-kad-dht/providers/providers.go +++ b/vendor/github.com/libp2p/go-libp2p-kad-dht/providers/providers.go @@ -7,6 +7,8 @@ import ( "strings" "time" + "github.com/libp2p/go-libp2p-core/peer" + lru "github.com/hashicorp/golang-lru/simplelru" cid "github.com/ipfs/go-cid" ds "github.com/ipfs/go-datastore" @@ -15,7 +17,6 @@ import ( logging "github.com/ipfs/go-log" goprocess "github.com/jbenet/goprocess" goprocessctx "github.com/jbenet/goprocess/context" - peer "github.com/libp2p/go-libp2p-peer" base32 "github.com/whyrusleeping/base32" ) diff --git a/vendor/github.com/libp2p/go-libp2p-kad-dht/query.go b/vendor/github.com/libp2p/go-libp2p-kad-dht/query.go index 9e9c3596..c0211a56 100644 --- a/vendor/github.com/libp2p/go-libp2p-kad-dht/query.go +++ b/vendor/github.com/libp2p/go-libp2p-kad-dht/query.go @@ -2,22 +2,27 @@ package dht import ( "context" + "errors" "sync" - u "github.com/ipfs/go-ipfs-util" + "github.com/libp2p/go-libp2p-core/network" + "github.com/libp2p/go-libp2p-core/peer" + logging "github.com/ipfs/go-log" todoctr "github.com/ipfs/go-todocounter" process "github.com/jbenet/goprocess" ctxproc "github.com/jbenet/goprocess/context" - inet "github.com/libp2p/go-libp2p-net" - peer "github.com/libp2p/go-libp2p-peer" - pset "github.com/libp2p/go-libp2p-peer/peerset" - pstore "github.com/libp2p/go-libp2p-peerstore" + kb "github.com/libp2p/go-libp2p-kbucket" + + pstore "github.com/libp2p/go-libp2p-core/peerstore" + "github.com/libp2p/go-libp2p-core/routing" queue "github.com/libp2p/go-libp2p-peerstore/queue" - routing "github.com/libp2p/go-libp2p-routing" notif "github.com/libp2p/go-libp2p-routing/notifications" ) +// ErrNoPeersQueried is returned when we failed to connect to any peers. +var ErrNoPeersQueried = errors.New("failed to query any peers") + var maxQueryConcurrency = AlphaValue type dhtQuery struct { @@ -28,12 +33,12 @@ type dhtQuery struct { } type dhtQueryResult struct { - peer *pstore.PeerInfo // FindPeer - closerPeers []*pstore.PeerInfo // * + peer *peer.AddrInfo // FindPeer + closerPeers []*peer.AddrInfo // * success bool - finalSet *pset.PeerSet - queriedSet *pset.PeerSet + finalSet *peer.Set + queriedSet *peer.Set } // constructs query @@ -55,6 +60,11 @@ type queryFunc func(context.Context, peer.ID) (*dhtQueryResult, error) // Run runs the query at hand. pass in a list of peers to use first. func (q *dhtQuery) Run(ctx context.Context, peers []peer.ID) (*dhtQueryResult, error) { + if len(peers) == 0 { + logger.Warning("Running query with no peers!") + return nil, kb.ErrLookupFailure + } + select { case <-ctx.Done(): return nil, ctx.Err() @@ -70,14 +80,13 @@ func (q *dhtQuery) Run(ctx context.Context, peers []peer.ID) (*dhtQueryResult, e type dhtQueryRunner struct { query *dhtQuery // query to run - peersSeen *pset.PeerSet // all peers queried. prevent querying same peer 2x - peersQueried *pset.PeerSet // peers successfully connected to and queried + peersSeen *peer.Set // all peers queried. prevent querying same peer 2x + peersQueried *peer.Set // peers successfully connected to and queried peersDialed *dialQueue // peers we have dialed to peersToQuery *queue.ChanQueue // peers remaining to be queried peersRemaining todoctr.Counter // peersToQuery + currently processing result *dhtQueryResult // query result - errs u.MultiErr // result errors. maybe should be a map[peer.ID]error rateLimit chan struct{} // processing semaphore log logging.EventLogger @@ -95,8 +104,8 @@ func newQueryRunner(q *dhtQuery) *dhtQueryRunner { r := &dhtQueryRunner{ query: q, peersRemaining: todoctr.NewSyncCounter(), - peersSeen: pset.New(), - peersQueried: pset.New(), + peersSeen: peer.NewSet(), + peersQueried: peer.NewSet(), rateLimit: make(chan struct{}, q.concurrency), peersToQuery: peersToQuery, proc: proc, @@ -119,11 +128,6 @@ func (r *dhtQueryRunner) Run(ctx context.Context, peers []peer.ID) (*dhtQueryRes r.log = logger r.runCtx = ctx - if len(peers) == 0 { - logger.Warning("Running query with no peers!") - return nil, nil - } - // setup concurrency rate limiting for i := 0; i < r.query.concurrency; i++ { r.rateLimit <- struct{}{} @@ -155,23 +159,19 @@ func (r *dhtQueryRunner) Run(ctx context.Context, peers []peer.ID) (*dhtQueryRes select { case <-r.peersRemaining.Done(): r.proc.Close() - r.RLock() - defer r.RUnlock() - - err = routing.ErrNotFound - - // if every query to every peer failed, something must be very wrong. - if len(r.errs) > 0 && len(r.errs) == r.peersSeen.Size() { - logger.Debugf("query errs: %s", r.errs) - err = r.errs[0] + if r.peersQueried.Size() == 0 { + err = ErrNoPeersQueried + } else { + err = routing.ErrNotFound } case <-r.proc.Closed(): - r.RLock() - defer r.RUnlock() err = r.runCtx.Err() } + r.RLock() + defer r.RUnlock() + if r.result != nil && r.result.success { return r.result, nil } @@ -238,7 +238,7 @@ func (r *dhtQueryRunner) spawnWorkers(proc process.Process) { func (r *dhtQueryRunner) dialPeer(ctx context.Context, p peer.ID) error { // short-circuit if we're already connected. - if r.query.dht.host.Network().Connectedness(p) == inet.Connected { + if r.query.dht.host.Network().Connectedness(p) == network.Connected { return nil } @@ -248,7 +248,7 @@ func (r *dhtQueryRunner) dialPeer(ctx context.Context, p peer.ID) error { ID: p, }) - pi := pstore.PeerInfo{ID: p} + pi := peer.AddrInfo{ID: p} if err := r.query.dht.host.Connect(ctx, pi); err != nil { logger.Debugf("error connecting: %s", err) notif.PublishQueryEvent(r.runCtx, ¬if.QueryEvent{ @@ -257,10 +257,6 @@ func (r *dhtQueryRunner) dialPeer(ctx context.Context, p peer.ID) error { ID: p, }) - r.Lock() - r.errs = append(r.errs, err) - r.Unlock() - // This peer is dropping out of the race. r.peersRemaining.Decrement(1) return err @@ -289,10 +285,6 @@ func (r *dhtQueryRunner) queryPeer(proc process.Process, p peer.ID) { if err != nil { logger.Debugf("ERROR worker for: %v %v", p, err) - r.Lock() - r.errs = append(r.errs, err) - r.Unlock() - } else if res.success { logger.Debugf("SUCCESS worker for: %v %s", p, res) r.Lock() diff --git a/vendor/github.com/libp2p/go-libp2p-kad-dht/records.go b/vendor/github.com/libp2p/go-libp2p-kad-dht/records.go index 5e508dba..5f641b05 100644 --- a/vendor/github.com/libp2p/go-libp2p-kad-dht/records.go +++ b/vendor/github.com/libp2p/go-libp2p-kad-dht/records.go @@ -5,9 +5,10 @@ import ( "fmt" "time" - ci "github.com/libp2p/go-libp2p-crypto" - peer "github.com/libp2p/go-libp2p-peer" - routing "github.com/libp2p/go-libp2p-routing" + "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p-core/routing" + + ci "github.com/libp2p/go-libp2p-core/crypto" ) // MaxRecordAge specifies the maximum time that any node will hold onto a record diff --git a/vendor/github.com/libp2p/go-libp2p-kad-dht/routing.go b/vendor/github.com/libp2p/go-libp2p-kad-dht/routing.go index 585196c1..9050ef51 100644 --- a/vendor/github.com/libp2p/go-libp2p-kad-dht/routing.go +++ b/vendor/github.com/libp2p/go-libp2p-kad-dht/routing.go @@ -8,19 +8,17 @@ import ( "sync" "time" + "github.com/libp2p/go-libp2p-core/network" + "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p-core/peerstore" + "github.com/libp2p/go-libp2p-core/routing" + cid "github.com/ipfs/go-cid" u "github.com/ipfs/go-ipfs-util" logging "github.com/ipfs/go-log" pb "github.com/libp2p/go-libp2p-kad-dht/pb" kb "github.com/libp2p/go-libp2p-kbucket" - inet "github.com/libp2p/go-libp2p-net" - peer "github.com/libp2p/go-libp2p-peer" - pset "github.com/libp2p/go-libp2p-peer/peerset" - pstore "github.com/libp2p/go-libp2p-peerstore" record "github.com/libp2p/go-libp2p-record" - routing "github.com/libp2p/go-libp2p-routing" - notif "github.com/libp2p/go-libp2p-routing/notifications" - ropts "github.com/libp2p/go-libp2p-routing/options" ) // asyncQueryBuffer is the size of buffered channels in async queries. This @@ -35,7 +33,7 @@ var asyncQueryBuffer = 10 // PutValue adds value corresponding to given Key. // This is the top level "Store" operation of the DHT -func (dht *IpfsDHT) PutValue(ctx context.Context, key string, value []byte, opts ...ropts.Option) (err error) { +func (dht *IpfsDHT) PutValue(ctx context.Context, key string, value []byte, opts ...routing.Option) (err error) { eip := logger.EventBegin(ctx, "PutValue") defer func() { eip.Append(loggableKey(key)) @@ -88,8 +86,8 @@ func (dht *IpfsDHT) PutValue(ctx context.Context, key string, value []byte, opts ctx, cancel := context.WithCancel(ctx) defer cancel() defer wg.Done() - notif.PublishQueryEvent(ctx, ¬if.QueryEvent{ - Type: notif.Value, + routing.PublishQueryEvent(ctx, &routing.QueryEvent{ + Type: routing.Value, ID: p, }) @@ -110,7 +108,7 @@ type RecvdVal struct { } // GetValue searches for the value corresponding to given Key. -func (dht *IpfsDHT) GetValue(ctx context.Context, key string, opts ...ropts.Option) (_ []byte, err error) { +func (dht *IpfsDHT) GetValue(ctx context.Context, key string, opts ...routing.Option) (_ []byte, err error) { eip := logger.EventBegin(ctx, "GetValue") defer func() { eip.Append(loggableKey(key)) @@ -121,7 +119,7 @@ func (dht *IpfsDHT) GetValue(ctx context.Context, key string, opts ...ropts.Opti }() // apply defaultQuorum if relevant - var cfg ropts.Options + var cfg routing.Options if err := cfg.Apply(opts...); err != nil { return nil, err } @@ -148,8 +146,8 @@ func (dht *IpfsDHT) GetValue(ctx context.Context, key string, opts ...ropts.Opti return best, nil } -func (dht *IpfsDHT) SearchValue(ctx context.Context, key string, opts ...ropts.Option) (<-chan []byte, error) { - var cfg ropts.Options +func (dht *IpfsDHT) SearchValue(ctx context.Context, key string, opts ...routing.Option) (<-chan []byte, error) { + var cfg routing.Options if err := cfg.Apply(opts...); err != nil { return nil, err } @@ -316,8 +314,8 @@ func (dht *IpfsDHT) getValues(ctx context.Context, key string, nvals int) (<-cha // setup the Query parent := ctx query := dht.newQuery(key, func(ctx context.Context, p peer.ID) (*dhtQueryResult, error) { - notif.PublishQueryEvent(parent, ¬if.QueryEvent{ - Type: notif.SendingQuery, + routing.PublishQueryEvent(parent, &routing.QueryEvent{ + Type: routing.SendingQuery, ID: p, }) @@ -327,8 +325,8 @@ func (dht *IpfsDHT) getValues(ctx context.Context, key string, nvals int) (<-cha // in this case, they responded with nothing, // still send a notification so listeners can know the // request has completed 'successfully' - notif.PublishQueryEvent(parent, ¬if.QueryEvent{ - Type: notif.PeerResponse, + routing.PublishQueryEvent(parent, &routing.QueryEvent{ + Type: routing.PeerResponse, ID: p, }) return nil, err @@ -362,8 +360,8 @@ func (dht *IpfsDHT) getValues(ctx context.Context, key string, nvals int) (<-cha valslock.Unlock() } - notif.PublishQueryEvent(parent, ¬if.QueryEvent{ - Type: notif.PeerResponse, + routing.PublishQueryEvent(parent, &routing.QueryEvent{ + Type: routing.PeerResponse, ID: p, Responses: peers, }) @@ -436,7 +434,7 @@ func (dht *IpfsDHT) Provide(ctx context.Context, key cid.Cid, brdcst bool) (err return nil } func (dht *IpfsDHT) makeProvRecord(skey cid.Cid) (*pb.Message, error) { - pi := pstore.PeerInfo{ + pi := peer.AddrInfo{ ID: dht.self, Addrs: dht.host.Addrs(), } @@ -448,13 +446,13 @@ func (dht *IpfsDHT) makeProvRecord(skey cid.Cid) (*pb.Message, error) { } pmes := pb.NewMessage(pb.Message_ADD_PROVIDER, skey.Bytes(), 0) - pmes.ProviderPeers = pb.RawPeerInfosToPBPeers([]pstore.PeerInfo{pi}) + pmes.ProviderPeers = pb.RawPeerInfosToPBPeers([]peer.AddrInfo{pi}) return pmes, nil } // FindProviders searches until the context expires. -func (dht *IpfsDHT) FindProviders(ctx context.Context, c cid.Cid) ([]pstore.PeerInfo, error) { - var providers []pstore.PeerInfo +func (dht *IpfsDHT) FindProviders(ctx context.Context, c cid.Cid) ([]peer.AddrInfo, error) { + var providers []peer.AddrInfo for p := range dht.FindProvidersAsync(ctx, c, KValue) { providers = append(providers, p) } @@ -464,18 +462,18 @@ func (dht *IpfsDHT) FindProviders(ctx context.Context, c cid.Cid) ([]pstore.Peer // FindProvidersAsync is the same thing as FindProviders, but returns a channel. // Peers will be returned on the channel as soon as they are found, even before // the search query completes. -func (dht *IpfsDHT) FindProvidersAsync(ctx context.Context, key cid.Cid, count int) <-chan pstore.PeerInfo { +func (dht *IpfsDHT) FindProvidersAsync(ctx context.Context, key cid.Cid, count int) <-chan peer.AddrInfo { logger.Event(ctx, "findProviders", key) - peerOut := make(chan pstore.PeerInfo, count) + peerOut := make(chan peer.AddrInfo, count) go dht.findProvidersAsyncRoutine(ctx, key, count, peerOut) return peerOut } -func (dht *IpfsDHT) findProvidersAsyncRoutine(ctx context.Context, key cid.Cid, count int, peerOut chan pstore.PeerInfo) { +func (dht *IpfsDHT) findProvidersAsyncRoutine(ctx context.Context, key cid.Cid, count int, peerOut chan peer.AddrInfo) { defer logger.EventBegin(ctx, "findProvidersAsync", key).Done() defer close(peerOut) - ps := pset.NewLimited(count) + ps := peer.NewLimitedSet(count) provs := dht.providers.GetProviders(ctx, key) for _, p := range provs { // NOTE: Assuming that this list of peers is unique @@ -495,11 +493,20 @@ func (dht *IpfsDHT) findProvidersAsyncRoutine(ctx context.Context, key cid.Cid, } } + peers := dht.routingTable.NearestPeers(kb.ConvertKey(key.KeyString()), AlphaValue) + if len(peers) == 0 { + routing.PublishQueryEvent(ctx, &routing.QueryEvent{ + Type: routing.QueryError, + Extra: kb.ErrLookupFailure.Error(), + }) + return + } + // setup the Query parent := ctx query := dht.newQuery(key.KeyString(), func(ctx context.Context, p peer.ID) (*dhtQueryResult, error) { - notif.PublishQueryEvent(parent, ¬if.QueryEvent{ - Type: notif.SendingQuery, + routing.PublishQueryEvent(parent, &routing.QueryEvent{ + Type: routing.SendingQuery, ID: p, }) pmes, err := dht.findProvidersSingle(ctx, p, key) @@ -514,7 +521,7 @@ func (dht *IpfsDHT) findProvidersAsyncRoutine(ctx context.Context, key cid.Cid, // Add unique providers from request, up to 'count' for _, prov := range provs { if prov.ID != dht.self { - dht.peerstore.AddAddrs(prov.ID, prov.Addrs, pstore.TempAddrTTL) + dht.peerstore.AddAddrs(prov.ID, prov.Addrs, peerstore.TempAddrTTL) } logger.Debugf("got provider: %s", prov) if ps.TryAdd(prov.ID) { @@ -537,15 +544,14 @@ func (dht *IpfsDHT) findProvidersAsyncRoutine(ctx context.Context, key cid.Cid, clpeers := pb.PBPeersToPeerInfos(closer) logger.Debugf("got closer peers: %d %s", len(clpeers), clpeers) - notif.PublishQueryEvent(parent, ¬if.QueryEvent{ - Type: notif.PeerResponse, + routing.PublishQueryEvent(parent, &routing.QueryEvent{ + Type: routing.PeerResponse, ID: p, Responses: clpeers, }) return &dhtQueryResult{closerPeers: clpeers}, nil }) - peers := dht.routingTable.NearestPeers(kb.ConvertKey(key.KeyString()), AlphaValue) _, err := query.Run(ctx, peers) if err != nil { logger.Debugf("Query error: %s", err) @@ -559,15 +565,15 @@ func (dht *IpfsDHT) findProvidersAsyncRoutine(ctx context.Context, key cid.Cid, // replace problematic error with something that won't crash the daemon err = fmt.Errorf("") } - notif.PublishQueryEvent(ctx, ¬if.QueryEvent{ - Type: notif.QueryError, + routing.PublishQueryEvent(ctx, &routing.QueryEvent{ + Type: routing.QueryError, Extra: err.Error(), }) } } // FindPeer searches for a peer with given ID. -func (dht *IpfsDHT) FindPeer(ctx context.Context, id peer.ID) (_ pstore.PeerInfo, err error) { +func (dht *IpfsDHT) FindPeer(ctx context.Context, id peer.ID) (_ peer.AddrInfo, err error) { eip := logger.EventBegin(ctx, "FindPeer", id) defer func() { if err != nil { @@ -583,7 +589,7 @@ func (dht *IpfsDHT) FindPeer(ctx context.Context, id peer.ID) (_ pstore.PeerInfo peers := dht.routingTable.NearestPeers(kb.ConvertPeerID(id), AlphaValue) if len(peers) == 0 { - return pstore.PeerInfo{}, kb.ErrLookupFailure + return peer.AddrInfo{}, kb.ErrLookupFailure } // Sanity... @@ -597,8 +603,8 @@ func (dht *IpfsDHT) FindPeer(ctx context.Context, id peer.ID) (_ pstore.PeerInfo // setup the Query parent := ctx query := dht.newQuery(string(id), func(ctx context.Context, p peer.ID) (*dhtQueryResult, error) { - notif.PublishQueryEvent(parent, ¬if.QueryEvent{ - Type: notif.SendingQuery, + routing.PublishQueryEvent(parent, &routing.QueryEvent{ + Type: routing.SendingQuery, ID: p, }) @@ -620,8 +626,8 @@ func (dht *IpfsDHT) FindPeer(ctx context.Context, id peer.ID) (_ pstore.PeerInfo } } - notif.PublishQueryEvent(parent, ¬if.QueryEvent{ - Type: notif.PeerResponse, + routing.PublishQueryEvent(parent, &routing.QueryEvent{ + Type: routing.PeerResponse, ID: p, Responses: clpeerInfos, }) @@ -632,21 +638,21 @@ func (dht *IpfsDHT) FindPeer(ctx context.Context, id peer.ID) (_ pstore.PeerInfo // run it! result, err := query.Run(ctx, peers) if err != nil { - return pstore.PeerInfo{}, err + return peer.AddrInfo{}, err } logger.Debugf("FindPeer %v %v", id, result.success) if result.peer.ID == "" { - return pstore.PeerInfo{}, routing.ErrNotFound + return peer.AddrInfo{}, routing.ErrNotFound } return *result.peer, nil } // FindPeersConnectedToPeer searches for peers directly connected to a given peer. -func (dht *IpfsDHT) FindPeersConnectedToPeer(ctx context.Context, id peer.ID) (<-chan *pstore.PeerInfo, error) { +func (dht *IpfsDHT) FindPeersConnectedToPeer(ctx context.Context, id peer.ID) (<-chan *peer.AddrInfo, error) { - peerchan := make(chan *pstore.PeerInfo, asyncQueryBuffer) + peerchan := make(chan *peer.AddrInfo, asyncQueryBuffer) peersSeen := make(map[peer.ID]struct{}) var peersSeenMx sync.Mutex @@ -663,7 +669,7 @@ func (dht *IpfsDHT) FindPeersConnectedToPeer(ctx context.Context, id peer.ID) (< return nil, err } - var clpeers []*pstore.PeerInfo + var clpeers []*peer.AddrInfo closer := pmes.GetCloserPeers() for _, pbp := range closer { pi := pb.PBPeerToPeerInfo(pbp) @@ -678,7 +684,7 @@ func (dht *IpfsDHT) FindPeersConnectedToPeer(ctx context.Context, id peer.ID) (< peersSeenMx.Unlock() // if peer is connected, send it to our client. - if pb.Connectedness(pbp.Connection) == inet.Connected { + if pb.Connectedness(pbp.Connection) == network.Connected { select { case <-ctx.Done(): return nil, ctx.Err() @@ -688,7 +694,7 @@ func (dht *IpfsDHT) FindPeersConnectedToPeer(ctx context.Context, id peer.ID) (< // if peer is the peer we're looking for, don't bother querying it. // TODO maybe query it? - if pb.Connectedness(pbp.Connection) != inet.Connected { + if pb.Connectedness(pbp.Connection) != network.Connected { clpeers = append(clpeers, pi) } } diff --git a/vendor/github.com/libp2p/go-libp2p-kad-dht/routing_options.go b/vendor/github.com/libp2p/go-libp2p-kad-dht/routing_options.go index 46083ea5..591ce54c 100644 --- a/vendor/github.com/libp2p/go-libp2p-kad-dht/routing_options.go +++ b/vendor/github.com/libp2p/go-libp2p-kad-dht/routing_options.go @@ -1,8 +1,6 @@ package dht -import ( - ropts "github.com/libp2p/go-libp2p-routing/options" -) +import "github.com/libp2p/go-libp2p-core/routing" type quorumOptionKey struct{} @@ -12,8 +10,8 @@ const defaultQuorum = 16 // values from before returning the best one. // // Default: 16 -func Quorum(n int) ropts.Option { - return func(opts *ropts.Options) error { +func Quorum(n int) routing.Option { + return func(opts *routing.Options) error { if opts.Other == nil { opts.Other = make(map[interface{}]interface{}, 1) } @@ -22,7 +20,7 @@ func Quorum(n int) ropts.Option { } } -func getQuorum(opts *ropts.Options, ndefault int) int { +func getQuorum(opts *routing.Options, ndefault int) int { responsesNeeded, ok := opts.Other[quorumOptionKey{}].(int) if !ok { responsesNeeded = ndefault diff --git a/vendor/github.com/libp2p/go-libp2p-kbucket/.travis.yml b/vendor/github.com/libp2p/go-libp2p-kbucket/.travis.yml index 4cfe98c2..5163d693 100644 --- a/vendor/github.com/libp2p/go-libp2p-kbucket/.travis.yml +++ b/vendor/github.com/libp2p/go-libp2p-kbucket/.travis.yml @@ -10,7 +10,6 @@ env: global: - GOTFLAGS="-race" matrix: - - BUILD_DEPTYPE=gx - BUILD_DEPTYPE=gomod @@ -24,7 +23,6 @@ script: cache: directories: - - $GOPATH/src/gx - $GOPATH/pkg/mod - $HOME/.cache/go-build diff --git a/vendor/github.com/libp2p/go-libp2p-kbucket/Makefile b/vendor/github.com/libp2p/go-libp2p-kbucket/Makefile deleted file mode 100644 index a89e6d08..00000000 --- a/vendor/github.com/libp2p/go-libp2p-kbucket/Makefile +++ /dev/null @@ -1,9 +0,0 @@ -export IPFS_API ?= v04x.ipfs.io - -gx: - go get -u github.com/whyrusleeping/gx - go get -u github.com/whyrusleeping/gx-go - -deps: gx - gx --verbose install --global - gx-go rewrite \ No newline at end of file diff --git a/vendor/github.com/libp2p/go-libp2p-kbucket/README.md b/vendor/github.com/libp2p/go-libp2p-kbucket/README.md index 7b115a2f..6ce5db6f 100644 --- a/vendor/github.com/libp2p/go-libp2p-kbucket/README.md +++ b/vendor/github.com/libp2p/go-libp2p-kbucket/README.md @@ -24,3 +24,7 @@ This repository falls under the IPFS [Code of Conduct](https://github.com/ipfs/c ## License MIT + +--- + +The last gx published version of this module was: 2.2.23: QmSNE1XryoCMnZCbRaj1D23k6YKCaTQ386eJciu1pAfu8M diff --git a/vendor/github.com/libp2p/go-libp2p-kbucket/bucket.go b/vendor/github.com/libp2p/go-libp2p-kbucket/bucket.go index 391669ac..bf3f2ee6 100644 --- a/vendor/github.com/libp2p/go-libp2p-kbucket/bucket.go +++ b/vendor/github.com/libp2p/go-libp2p-kbucket/bucket.go @@ -4,7 +4,7 @@ import ( "container/list" "sync" - peer "github.com/libp2p/go-libp2p-peer" + "github.com/libp2p/go-libp2p-core/peer" ) // Bucket holds a list of peers. diff --git a/vendor/github.com/libp2p/go-libp2p-kbucket/go.mod b/vendor/github.com/libp2p/go-libp2p-kbucket/go.mod index 0a4e7f32..982ac344 100644 --- a/vendor/github.com/libp2p/go-libp2p-kbucket/go.mod +++ b/vendor/github.com/libp2p/go-libp2p-kbucket/go.mod @@ -3,7 +3,7 @@ module github.com/libp2p/go-libp2p-kbucket require ( github.com/ipfs/go-ipfs-util v0.0.1 github.com/ipfs/go-log v0.0.1 - github.com/libp2p/go-libp2p-peer v0.0.1 - github.com/libp2p/go-libp2p-peerstore v0.0.1 - github.com/libp2p/go-testutil v0.0.1 + github.com/libp2p/go-libp2p-core v0.0.1 + github.com/libp2p/go-libp2p-peerstore v0.1.0 + github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16 ) diff --git a/vendor/github.com/libp2p/go-libp2p-kbucket/go.sum b/vendor/github.com/libp2p/go-libp2p-kbucket/go.sum index d131c950..ac70a977 100644 --- a/vendor/github.com/libp2p/go-libp2p-kbucket/go.sum +++ b/vendor/github.com/libp2p/go-libp2p-kbucket/go.sum @@ -10,6 +10,7 @@ github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVa github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -30,6 +31,7 @@ github.com/gxed/hashland/murmur3 v0.0.1 h1:SheiaIt0sda5K+8FLz952/1iWS9zrnKsEJaOJ github.com/gxed/hashland/murmur3 v0.0.1/go.mod h1:KjXop02n4/ckmZSnY2+HKcLud/tcmvhST0bie/0lS48= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= github.com/ipfs/go-datastore v0.0.1/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= github.com/ipfs/go-ds-badger v0.0.2/go.mod h1:Y3QpeSFWQf6MopLTiZD+VT6IC1yZqaGmjvRcKeSGij8= github.com/ipfs/go-ds-leveldb v0.0.1/go.mod h1:feO8V3kubwsEF22n0YRQCffeb79OOYIykR4L04tMOYc= @@ -48,14 +50,15 @@ github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORN github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/libp2p/go-buffer-pool v0.0.1/go.mod h1:xtyIz9PMobb13WaxR6Zo1Pd1zXJKYg0a8KiIvDp3TzQ= -github.com/libp2p/go-libp2p-crypto v0.0.1 h1:JNQd8CmoGTohO/akqrH16ewsqZpci2CbgYH/LmYl8gw= -github.com/libp2p/go-libp2p-crypto v0.0.1/go.mod h1:yJkNyDmO341d5wwXxDUGO0LykUVT72ImHNUqh5D/dBE= -github.com/libp2p/go-libp2p-peer v0.0.1 h1:0qwAOljzYewINrU+Kndoc+1jAL7vzY/oY2Go4DCGfyY= -github.com/libp2p/go-libp2p-peer v0.0.1/go.mod h1:nXQvOBbwVqoP+T5Y5nCjeH4sP9IX/J0AMzcDUVruVoo= -github.com/libp2p/go-libp2p-peerstore v0.0.1 h1:twKovq8YK5trLrd3nB7PD2Zu9JcyAIdm7Bz9yBWjhq8= -github.com/libp2p/go-libp2p-peerstore v0.0.1/go.mod h1:RabLyPVJLuNQ+GFyoEkfi8H4Ti6k/HtZJ7YKgtSq+20= -github.com/libp2p/go-testutil v0.0.1 h1:Xg+O0G2HIMfHqBOBDcMS1iSZJ3GEcId4qOxCQvsGZHk= -github.com/libp2p/go-testutil v0.0.1/go.mod h1:iAcJc/DKJQanJ5ws2V+u5ywdL2n12X1WbbEG+Jjy69I= +github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZxBdp967ls1g+k8= +github.com/libp2p/go-libp2p-core v0.0.1 h1:HSTZtFIq/W5Ue43Zw+uWZyy2Vl5WtF0zDjKN8/DT/1I= +github.com/libp2p/go-libp2p-core v0.0.1/go.mod h1:g/VxnTZ/1ygHxH3dKok7Vno1VfpvGcGip57wjTU4fco= +github.com/libp2p/go-libp2p-crypto v0.1.0 h1:k9MFy+o2zGDNGsaoZl0MA3iZ75qXxr9OOoAZF+sD5OQ= +github.com/libp2p/go-libp2p-crypto v0.1.0/go.mod h1:sPUokVISZiy+nNuTTH/TY+leRSxnFj/2GLjtOTW90hI= +github.com/libp2p/go-libp2p-peer v0.2.0 h1:EQ8kMjaCUwt/Y5uLgjT8iY2qg0mGUT0N1zUjer50DsY= +github.com/libp2p/go-libp2p-peer v0.2.0/go.mod h1:RCffaCvUyW2CJmG2gAWVqwePwW7JMgxjsHm7+J5kjWY= +github.com/libp2p/go-libp2p-peerstore v0.1.0 h1:MKh7pRNPHSh1fLPj8u/M/s/napdmeNpoi9BRy9lPN0E= +github.com/libp2p/go-libp2p-peerstore v0.1.0/go.mod h1:2CeHkQsr8svp4fZ+Oi9ykN1HBb6u0MOvdJ7YIsmcwtY= github.com/mattn/go-colorable v0.1.1 h1:G1f5SKeVxmagw/IyvzvtZE4Gybcc4Tr1tf7I8z0XgOg= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= github.com/mattn/go-isatty v0.0.5 h1:tHXDdz1cpzGaovsTB+TVB8q90WEokoVmfMqoVcrLUgw= @@ -64,13 +67,16 @@ github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0 github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16 h1:5W7KhL8HVF3XCFOweFD3BNESdnO8ewyYTFT2R+/b8FQ= github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= -github.com/mr-tron/base58 v1.1.0 h1:Y51FGVJ91WBqCEabAi5OPUz38eAx8DakuAm5svLcsfQ= github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= +github.com/mr-tron/base58 v1.1.1 h1:OJIdWOWYe2l5PQNgimGtuwHY8nDskvJ5vvs//YnzRLs= +github.com/mr-tron/base58 v1.1.1/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= -github.com/multiformats/go-multiaddr v0.0.1 h1:/QUV3VBMDI6pi6xfiw7lr6xhDWWvQKn9udPn68kLSdY= github.com/multiformats/go-multiaddr v0.0.1/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= +github.com/multiformats/go-multiaddr v0.0.2 h1:RBysRCv5rv3FWlhKWKoXv8tnsCUpEpIZpCmqAGZos2s= +github.com/multiformats/go-multiaddr v0.0.2/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= github.com/multiformats/go-multiaddr-dns v0.0.1/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= github.com/multiformats/go-multiaddr-net v0.0.1/go.mod h1:nw6HSxNmCIQH27XPGBuX+d1tnvM7ihcFwHMSstNAVUU= +github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs= github.com/multiformats/go-multihash v0.0.1 h1:HHwN1K12I+XllBCrqKnhX949Orn4oawPkegHMu2vDqQ= github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= @@ -81,6 +87,10 @@ github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFSt 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/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a h1:/eS3yfGjQKG+9kayBkj0ip1BGhq6zJ3eaVksphxAaek= +github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a/go.mod h1:7AyxJNCJ7SBZ1MfVQCWD6Uqo2oubI2Eq2y2eqf+A5r0= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 h1:RC6RW7j+1+HkWaX/Yh71Ee5ZHaHYt7ZP4sQgUrm6cDU= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572/go.mod h1:w0SWMsp6j9O/dk4/ZpIhL+3CkG8ofA2vuv7k+ltqUMc= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= diff --git a/vendor/github.com/libp2p/go-libp2p-kbucket/keyspace/xor.go b/vendor/github.com/libp2p/go-libp2p-kbucket/keyspace/xor.go index ee6c65ce..6750b0bb 100644 --- a/vendor/github.com/libp2p/go-libp2p-kbucket/keyspace/xor.go +++ b/vendor/github.com/libp2p/go-libp2p-kbucket/keyspace/xor.go @@ -2,11 +2,11 @@ package keyspace import ( "bytes" - "crypto/sha256" "math/big" "math/bits" u "github.com/ipfs/go-ipfs-util" + sha256 "github.com/minio/sha256-simd" ) // XORKeySpace is a KeySpace which: diff --git a/vendor/github.com/libp2p/go-libp2p-kbucket/package.json b/vendor/github.com/libp2p/go-libp2p-kbucket/package.json deleted file mode 100644 index 33e6cfd0..00000000 --- a/vendor/github.com/libp2p/go-libp2p-kbucket/package.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "bugs": { - "url": "https://github.com/libp2p/go-libp2p-kbucket" - }, - "gx": { - "dvcsimport": "github.com/libp2p/go-libp2p-kbucket", - "goversion": "1.5.2" - }, - "gxDependencies": [ - { - "hash": "QmbkT7eMTyXfpeyB3ZMxxcxg7XH8t6uXp49jqzz4HB7BGF", - "name": "go-log", - "version": "1.5.9" - }, - { - "author": "whyrusleeping", - "hash": "QmYVXrKrKHDC9FobgmcmshCDyWwdrfwfanNQN4oxJ9Fk3h", - "name": "go-libp2p-peer", - "version": "3.1.2" - }, - { - "author": "whyrusleeping", - "hash": "QmaCTz9RkrU13bm9kMB54f7atgqM4qkjDZpRwRoJiWXEqs", - "name": "go-libp2p-peerstore", - "version": "2.0.19" - }, - { - "hash": "QmWapVoHjtKhn4MhvKNoPTkJKADFGACfXPFnt7combwp5W", - "name": "go-testutil", - "version": "1.2.19" - }, - { - "author": "whyrusleeping", - "hash": "QmNohiVssaPw3KVLZik59DBVGTSm2dGvYT9eoXt5DQ36Yz", - "name": "go-ipfs-util", - "version": "1.2.9" - } - ], - "gxVersion": "0.4.0", - "language": "go", - "license": "MIT", - "name": "go-libp2p-kbucket", - "releaseCmd": "git commit -a -m \"gx publish $VERSION\"", - "version": "2.2.23" -} - diff --git a/vendor/github.com/libp2p/go-libp2p-kbucket/sorting.go b/vendor/github.com/libp2p/go-libp2p-kbucket/sorting.go index da7315df..3b670723 100644 --- a/vendor/github.com/libp2p/go-libp2p-kbucket/sorting.go +++ b/vendor/github.com/libp2p/go-libp2p-kbucket/sorting.go @@ -4,7 +4,7 @@ import ( "container/list" "sort" - peer "github.com/libp2p/go-libp2p-peer" + "github.com/libp2p/go-libp2p-core/peer" ) // A helper struct to sort peers by their distance to the local node @@ -13,48 +13,49 @@ type peerDistance struct { distance ID } -// peerSorterArr implements sort.Interface to sort peers by xor distance -type peerSorterArr []*peerDistance +// peerDistanceSorter implements sort.Interface to sort peers by xor distance +type peerDistanceSorter struct { + peers []peerDistance + target ID +} -func (p peerSorterArr) Len() int { return len(p) } -func (p peerSorterArr) Swap(a, b int) { p[a], p[b] = p[b], p[a] } -func (p peerSorterArr) Less(a, b int) bool { - return p[a].distance.less(p[b].distance) +func (pds *peerDistanceSorter) Len() int { return len(pds.peers) } +func (pds *peerDistanceSorter) Swap(a, b int) { pds.peers[a], pds.peers[b] = pds.peers[b], pds.peers[a] } +func (pds *peerDistanceSorter) Less(a, b int) bool { + return pds.peers[a].distance.less(pds.peers[b].distance) } -// +// Append the peer.ID to the sorter's slice. It may no longer be sorted. +func (pds *peerDistanceSorter) appendPeer(p peer.ID) { + pds.peers = append(pds.peers, peerDistance{ + p: p, + distance: xor(pds.target, ConvertPeerID(p)), + }) +} -func copyPeersFromList(target ID, peerArr peerSorterArr, peerList *list.List) peerSorterArr { - if cap(peerArr) < len(peerArr)+peerList.Len() { - newArr := make(peerSorterArr, len(peerArr), len(peerArr)+peerList.Len()) - copy(newArr, peerArr) - peerArr = newArr - } - for e := peerList.Front(); e != nil; e = e.Next() { - p := e.Value.(peer.ID) - pID := ConvertPeerID(p) - pd := peerDistance{ - p: p, - distance: xor(target, pID), - } - peerArr = append(peerArr, &pd) +// Append the peer.ID values in the list to the sorter's slice. It may no longer be sorted. +func (pds *peerDistanceSorter) appendPeersFromList(l *list.List) { + for e := l.Front(); e != nil; e = e.Next() { + pds.appendPeer(e.Value.(peer.ID)) } - return peerArr } +func (pds *peerDistanceSorter) sort() { + sort.Sort(pds) +} + +// Sort the given peers by their ascending distance from the target. A new slice is returned. func SortClosestPeers(peers []peer.ID, target ID) []peer.ID { - psarr := make(peerSorterArr, 0, len(peers)) + sorter := peerDistanceSorter{ + peers: make([]peerDistance, 0, len(peers)), + target: target, + } for _, p := range peers { - pID := ConvertPeerID(p) - pd := &peerDistance{ - p: p, - distance: xor(target, pID), - } - psarr = append(psarr, pd) + sorter.appendPeer(p) } - sort.Sort(psarr) - out := make([]peer.ID, 0, len(psarr)) - for _, p := range psarr { + sorter.sort() + out := make([]peer.ID, 0, sorter.Len()) + for _, p := range sorter.peers { out = append(out, p.p) } return out diff --git a/vendor/github.com/libp2p/go-libp2p-kbucket/table.go b/vendor/github.com/libp2p/go-libp2p-kbucket/table.go index 881102fd..ec8bfd0e 100644 --- a/vendor/github.com/libp2p/go-libp2p-kbucket/table.go +++ b/vendor/github.com/libp2p/go-libp2p-kbucket/table.go @@ -4,13 +4,13 @@ package kbucket import ( "errors" "fmt" - "sort" "sync" "time" + "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p-core/peerstore" + logging "github.com/ipfs/go-log" - peer "github.com/libp2p/go-libp2p-peer" - pstore "github.com/libp2p/go-libp2p-peerstore" ) var log = logging.Logger("table") @@ -28,7 +28,7 @@ type RoutingTable struct { tabLock sync.RWMutex // latency metrics - metrics pstore.Metrics + metrics peerstore.Metrics // Maximum acceptable latency for peers in this cluster maxLatency time.Duration @@ -43,7 +43,7 @@ type RoutingTable struct { } // NewRoutingTable creates a new routing table with a given bucketsize, local ID, and latency tolerance. -func NewRoutingTable(bucketsize int, localID ID, latency time.Duration, m pstore.Metrics) *RoutingTable { +func NewRoutingTable(bucketsize int, localID ID, latency time.Duration, m peerstore.Metrics) *RoutingTable { rt := &RoutingTable{ Buckets: []*Bucket{newBucket()}, bucketsize: bucketsize, @@ -114,11 +114,12 @@ func (rt *RoutingTable) Update(p peer.ID) (evicted peer.ID, err error) { // Remove deletes a peer from the routing table. This is to be used // when we are sure a node has disconnected completely. func (rt *RoutingTable) Remove(p peer.ID) { - rt.tabLock.Lock() - defer rt.tabLock.Unlock() peerID := ConvertPeerID(p) cpl := CommonPrefixLen(peerID, rt.local) + rt.tabLock.Lock() + defer rt.tabLock.Unlock() + bucketID := cpl if bucketID >= len(rt.Buckets) { bucketID = len(rt.Buckets) - 1 @@ -169,6 +170,7 @@ func (rt *RoutingTable) NearestPeer(id ID) peer.ID { func (rt *RoutingTable) NearestPeers(id ID, count int) []peer.ID { cpl := CommonPrefixLen(id, rt.local) + // It's assumed that this also protects the buckets. rt.tabLock.RLock() // Get bucket at cpl index or last bucket @@ -178,32 +180,32 @@ func (rt *RoutingTable) NearestPeers(id ID, count int) []peer.ID { } bucket = rt.Buckets[cpl] - peerArr := make(peerSorterArr, 0, count) - peerArr = copyPeersFromList(id, peerArr, bucket.list) - if len(peerArr) < count { + pds := peerDistanceSorter{ + peers: make([]peerDistance, 0, 3*rt.bucketsize), + target: id, + } + pds.appendPeersFromList(bucket.list) + if pds.Len() < count { // In the case of an unusual split, one bucket may be short or empty. // if this happens, search both surrounding buckets for nearby peers if cpl > 0 { - plist := rt.Buckets[cpl-1].list - peerArr = copyPeersFromList(id, peerArr, plist) + pds.appendPeersFromList(rt.Buckets[cpl-1].list) } - if cpl < len(rt.Buckets)-1 { - plist := rt.Buckets[cpl+1].list - peerArr = copyPeersFromList(id, peerArr, plist) + pds.appendPeersFromList(rt.Buckets[cpl+1].list) } } rt.tabLock.RUnlock() // Sort by distance to local peer - sort.Sort(peerArr) + pds.sort() - if count < len(peerArr) { - peerArr = peerArr[:count] + if count < pds.Len() { + pds.peers = pds.peers[:count] } - out := make([]peer.ID, 0, len(peerArr)) - for _, p := range peerArr { + out := make([]peer.ID, 0, pds.Len()) + for _, p := range pds.peers { out = append(out, p.p) } diff --git a/vendor/github.com/libp2p/go-libp2p-kbucket/util.go b/vendor/github.com/libp2p/go-libp2p-kbucket/util.go index 058aa3c4..71d8709f 100644 --- a/vendor/github.com/libp2p/go-libp2p-kbucket/util.go +++ b/vendor/github.com/libp2p/go-libp2p-kbucket/util.go @@ -2,12 +2,13 @@ package kbucket import ( "bytes" - "crypto/sha256" "errors" - u "github.com/ipfs/go-ipfs-util" + "github.com/libp2p/go-libp2p-core/peer" ks "github.com/libp2p/go-libp2p-kbucket/keyspace" - peer "github.com/libp2p/go-libp2p-peer" + + u "github.com/ipfs/go-ipfs-util" + sha256 "github.com/minio/sha256-simd" ) // Returned if a routing table query returns no results. This is NOT expected diff --git a/vendor/github.com/libp2p/go-libp2p-loggables/.travis.yml b/vendor/github.com/libp2p/go-libp2p-loggables/.travis.yml index dde69d1a..5163d693 100644 --- a/vendor/github.com/libp2p/go-libp2p-loggables/.travis.yml +++ b/vendor/github.com/libp2p/go-libp2p-loggables/.travis.yml @@ -10,7 +10,6 @@ env: global: - GOTFLAGS="-race" matrix: - - BUILD_DEPTYPE=gx - BUILD_DEPTYPE=gomod @@ -24,9 +23,8 @@ script: cache: directories: - - /Users/raul/go/src/gx - - /Users/raul/go/pkg/mod - - /Users/raul/.cache/go-build + - $GOPATH/pkg/mod + - $HOME/.cache/go-build notifications: email: false diff --git a/vendor/github.com/libp2p/go-libp2p-loggables/Makefile b/vendor/github.com/libp2p/go-libp2p-loggables/Makefile deleted file mode 100644 index 7c146b10..00000000 --- a/vendor/github.com/libp2p/go-libp2p-loggables/Makefile +++ /dev/null @@ -1,14 +0,0 @@ -test: deps - go test -race -v ./... - -export IPFS_API ?= v04x.ipfs.io - -gx: - go get -u github.com/whyrusleeping/gx - go get -u github.com/whyrusleeping/gx-go - -deps: gx - gx --verbose install --global - gx-go rewrite - go get -t ./... - diff --git a/vendor/github.com/libp2p/go-libp2p-loggables/README.md b/vendor/github.com/libp2p/go-libp2p-loggables/README.md index d644151e..3fce6e7b 100644 --- a/vendor/github.com/libp2p/go-libp2p-loggables/README.md +++ b/vendor/github.com/libp2p/go-libp2p-loggables/README.md @@ -1,9 +1,9 @@ # go-libp2p-loggables -[![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](http://ipn.io) -[![](https://img.shields.io/badge/project-libp2p-blue.svg?style=flat-square)](http://github.com/libp2p/libp2p) -[![](https://img.shields.io/badge/freenode-%23ipfs-blue.svg?style=flat-square)](http://webchat.freenode.net/?channels=%23ipfs) -[![standard-readme compliant](https://img.shields.io/badge/standard--readme-OK-green.svg?style=flat-square)](https://github.com/RichardLitt/standard-readme) +[![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](https://protocol.ai) +[![](https://img.shields.io/badge/project-libp2p-yellow.svg?style=flat-square)](https://libp2p.io) +[![](https://img.shields.io/badge/freenode-%23libp2p-yellpw.svg?style=flat-square)](http://webchat.freenode.net/?channels=%23libp2p) +[![Discourse posts](https://img.shields.io/discourse/https/discuss.libp2p.io/posts.svg)](https://discuss.libp2p.io) > logging helpers for go-libp2p @@ -28,3 +28,7 @@ Small note: If editing the README, please conform to the [standard-readme](https ## License [MIT](LICENSE) © 2016 Jeromy Johnson. + +--- + +The last gx published version of this module was: 1.1.33: QmUbSLukzZYZvEYxynj9Dtd1WrGLxxg9R4U68vCMPWHmRU diff --git a/vendor/github.com/libp2p/go-libp2p-loggables/go.mod b/vendor/github.com/libp2p/go-libp2p-loggables/go.mod index de5b01d9..56d6b8ff 100644 --- a/vendor/github.com/libp2p/go-libp2p-loggables/go.mod +++ b/vendor/github.com/libp2p/go-libp2p-loggables/go.mod @@ -3,7 +3,6 @@ module github.com/libp2p/go-libp2p-loggables require ( github.com/google/uuid v1.1.1 github.com/ipfs/go-log v0.0.1 - github.com/libp2p/go-libp2p-crypto v0.0.1 - github.com/libp2p/go-libp2p-peer v0.0.1 - github.com/multiformats/go-multiaddr v0.0.1 + github.com/libp2p/go-libp2p-core v0.0.1 + github.com/multiformats/go-multiaddr v0.0.2 ) diff --git a/vendor/github.com/libp2p/go-libp2p-loggables/go.sum b/vendor/github.com/libp2p/go-libp2p-loggables/go.sum index 4e7c74c1..8d11a7b3 100644 --- a/vendor/github.com/libp2p/go-libp2p-loggables/go.sum +++ b/vendor/github.com/libp2p/go-libp2p-loggables/go.sum @@ -8,6 +8,7 @@ github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVa github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -22,17 +23,18 @@ github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfm github.com/gxed/hashland/murmur3 v0.0.1 h1:SheiaIt0sda5K+8FLz952/1iWS9zrnKsEJaOJu4ZbSc= github.com/gxed/hashland/murmur3 v0.0.1/go.mod h1:KjXop02n4/ckmZSnY2+HKcLud/tcmvhST0bie/0lS48= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= github.com/ipfs/go-log v0.0.1 h1:9XTUN/rW64BCG1YhPK9Hoy3q8nr4gOmHHBpgFdfw6Lc= github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM= +github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8/go.mod h1:Ly/wlsjFq/qrU3Rar62tu1gASgGw6chQbSh/XgIIXCY= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= -github.com/libp2p/go-libp2p-crypto v0.0.1 h1:JNQd8CmoGTohO/akqrH16ewsqZpci2CbgYH/LmYl8gw= -github.com/libp2p/go-libp2p-crypto v0.0.1/go.mod h1:yJkNyDmO341d5wwXxDUGO0LykUVT72ImHNUqh5D/dBE= -github.com/libp2p/go-libp2p-peer v0.0.1 h1:0qwAOljzYewINrU+Kndoc+1jAL7vzY/oY2Go4DCGfyY= -github.com/libp2p/go-libp2p-peer v0.0.1/go.mod h1:nXQvOBbwVqoP+T5Y5nCjeH4sP9IX/J0AMzcDUVruVoo= +github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZxBdp967ls1g+k8= +github.com/libp2p/go-libp2p-core v0.0.1 h1:HSTZtFIq/W5Ue43Zw+uWZyy2Vl5WtF0zDjKN8/DT/1I= +github.com/libp2p/go-libp2p-core v0.0.1/go.mod h1:g/VxnTZ/1ygHxH3dKok7Vno1VfpvGcGip57wjTU4fco= github.com/mattn/go-colorable v0.1.1 h1:G1f5SKeVxmagw/IyvzvtZE4Gybcc4Tr1tf7I8z0XgOg= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= github.com/mattn/go-isatty v0.0.5 h1:tHXDdz1cpzGaovsTB+TVB8q90WEokoVmfMqoVcrLUgw= @@ -41,10 +43,13 @@ github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0 github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16 h1:5W7KhL8HVF3XCFOweFD3BNESdnO8ewyYTFT2R+/b8FQ= github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= -github.com/mr-tron/base58 v1.1.0 h1:Y51FGVJ91WBqCEabAi5OPUz38eAx8DakuAm5svLcsfQ= github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= -github.com/multiformats/go-multiaddr v0.0.1 h1:/QUV3VBMDI6pi6xfiw7lr6xhDWWvQKn9udPn68kLSdY= -github.com/multiformats/go-multiaddr v0.0.1/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= +github.com/mr-tron/base58 v1.1.1 h1:OJIdWOWYe2l5PQNgimGtuwHY8nDskvJ5vvs//YnzRLs= +github.com/mr-tron/base58 v1.1.1/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= +github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= +github.com/multiformats/go-multiaddr v0.0.2 h1:RBysRCv5rv3FWlhKWKoXv8tnsCUpEpIZpCmqAGZos2s= +github.com/multiformats/go-multiaddr v0.0.2/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= +github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs= github.com/multiformats/go-multihash v0.0.1 h1:HHwN1K12I+XllBCrqKnhX949Orn4oawPkegHMu2vDqQ= github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= @@ -54,6 +59,10 @@ github.com/opentracing/opentracing-go v1.0.2 h1:3jA2P6O1F9UOrWVpwrIo17pu01KWvNWg github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= 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/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a h1:/eS3yfGjQKG+9kayBkj0ip1BGhq6zJ3eaVksphxAaek= +github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a/go.mod h1:7AyxJNCJ7SBZ1MfVQCWD6Uqo2oubI2Eq2y2eqf+A5r0= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 h1:RC6RW7j+1+HkWaX/Yh71Ee5ZHaHYt7ZP4sQgUrm6cDU= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572/go.mod h1:w0SWMsp6j9O/dk4/ZpIhL+3CkG8ofA2vuv7k+ltqUMc= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= diff --git a/vendor/github.com/libp2p/go-libp2p-loggables/loggables.go b/vendor/github.com/libp2p/go-libp2p-loggables/loggables.go index 6fda0f7e..30b2a3ab 100644 --- a/vendor/github.com/libp2p/go-libp2p-loggables/loggables.go +++ b/vendor/github.com/libp2p/go-libp2p-loggables/loggables.go @@ -11,7 +11,7 @@ import ( uuid "github.com/google/uuid" logging "github.com/ipfs/go-log" - peer "github.com/libp2p/go-libp2p-peer" + "github.com/libp2p/go-libp2p-core/peer" ma "github.com/multiformats/go-multiaddr" ) diff --git a/vendor/github.com/libp2p/go-libp2p-loggables/package.json b/vendor/github.com/libp2p/go-libp2p-loggables/package.json deleted file mode 100644 index d93bef55..00000000 --- a/vendor/github.com/libp2p/go-libp2p-loggables/package.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "author": "whyrusleeping", - "bugs": { - "url": "https://github.com/libp2p/go-libp2p-loggables" - }, - "gx": { - "dvcsimport": "github.com/libp2p/go-libp2p-loggables" - }, - "gxDependencies": [ - { - "author": "whyrusleeping", - "hash": "QmYVXrKrKHDC9FobgmcmshCDyWwdrfwfanNQN4oxJ9Fk3h", - "name": "go-libp2p-peer", - "version": "3.1.2" - }, - { - "author": "whyrusleeping", - "hash": "QmbkT7eMTyXfpeyB3ZMxxcxg7XH8t6uXp49jqzz4HB7BGF", - "name": "go-log", - "version": "1.5.9" - }, - { - "author": "whyrusleeping", - "hash": "QmTZBfrPJmjWsCvHEtX5FE6KimVJhsJg5sBbqEFYf4UZtL", - "name": "go-multiaddr", - "version": "1.4.1" - }, - { - "author": "google", - "hash": "QmSSeQqc5QeuefkaM6JFV5tSF9knLUkXKVhW1eYRiqe72W", - "name": "uuid", - "version": "0.1.0" - } - ], - "gxVersion": "0.4.0", - "language": "go", - "license": "MIT", - "name": "go-libp2p-loggables", - "releaseCmd": "git commit -a -m \"gx publish $VERSION\"", - "version": "1.1.33" -} - diff --git a/vendor/github.com/libp2p/go-libp2p-metrics/.travis.yml b/vendor/github.com/libp2p/go-libp2p-metrics/.travis.yml deleted file mode 100644 index dde69d1a..00000000 --- a/vendor/github.com/libp2p/go-libp2p-metrics/.travis.yml +++ /dev/null @@ -1,32 +0,0 @@ -os: - - linux - -language: go - -go: - - 1.11.x - -env: - global: - - GOTFLAGS="-race" - matrix: - - BUILD_DEPTYPE=gx - - BUILD_DEPTYPE=gomod - - -# disable travis install -install: - - true - -script: - - bash <(curl -s https://raw.githubusercontent.com/ipfs/ci-helpers/master/travis-ci/run-standard-tests.sh) - - -cache: - directories: - - /Users/raul/go/src/gx - - /Users/raul/go/pkg/mod - - /Users/raul/.cache/go-build - -notifications: - email: false diff --git a/vendor/github.com/libp2p/go-libp2p-metrics/Makefile b/vendor/github.com/libp2p/go-libp2p-metrics/Makefile deleted file mode 100644 index 20619413..00000000 --- a/vendor/github.com/libp2p/go-libp2p-metrics/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -gx: - go get github.com/whyrusleeping/gx - go get github.com/whyrusleeping/gx-go - -deps: gx - gx --verbose install --global - gx-go rewrite - -publish: - gx-go rewrite --undo - diff --git a/vendor/github.com/libp2p/go-libp2p-metrics/README.md b/vendor/github.com/libp2p/go-libp2p-metrics/README.md deleted file mode 100644 index 5da7bb5f..00000000 --- a/vendor/github.com/libp2p/go-libp2p-metrics/README.md +++ /dev/null @@ -1,33 +0,0 @@ -go-libp2p-metrics -================== - -[![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](http://ipn.io) -[![](https://img.shields.io/badge/project-IPFS-blue.svg?style=flat-square)](http://libp2p.io/) -[![](https://img.shields.io/badge/freenode-%23ipfs-blue.svg?style=flat-square)](http://webchat.freenode.net/?channels=%23ipfs) -[![Coverage Status](https://coveralls.io/repos/github/libp2p/go-libp2p-metrics/badge.svg?branch=master)](https://coveralls.io/github/libp2p/go-libp2p-metrics?branch=master) -[![Travis CI](https://travis-ci.org/libp2p/go-libp2p-metrics.svg?branch=master)](https://travis-ci.org/libp2p/go-libp2p-metrics) - -> A connection wrapper for go-libp2p that provides bandwidth statistics for wrapped connections. - - -## Table of Contents - -- [Install](#install) -- [Contribute](#contribute) -- [License](#license) - -## Install - -```sh -make install -``` - -## Contribute - -PRs are welcome! - -Small note: If editing the Readme, please conform to the [standard-readme](https://github.com/RichardLitt/standard-readme) specification. - -## License - -MIT © Jeromy Johnson diff --git a/vendor/github.com/libp2p/go-libp2p-metrics/bw_stats.go b/vendor/github.com/libp2p/go-libp2p-metrics/bw_stats.go deleted file mode 100644 index 3936312b..00000000 --- a/vendor/github.com/libp2p/go-libp2p-metrics/bw_stats.go +++ /dev/null @@ -1,83 +0,0 @@ -package metrics - -import ( - flow "github.com/libp2p/go-flow-metrics" - peer "github.com/libp2p/go-libp2p-peer" - protocol "github.com/libp2p/go-libp2p-protocol" -) - -type Stats struct { - TotalIn int64 - TotalOut int64 - RateIn float64 - RateOut float64 -} - -type BandwidthCounter struct { - totalIn flow.Meter - totalOut flow.Meter - - protocolIn flow.MeterRegistry - protocolOut flow.MeterRegistry - - peerIn flow.MeterRegistry - peerOut flow.MeterRegistry -} - -func NewBandwidthCounter() *BandwidthCounter { - return new(BandwidthCounter) -} - -func (bwc *BandwidthCounter) LogSentMessage(size int64) { - bwc.totalOut.Mark(uint64(size)) -} - -func (bwc *BandwidthCounter) LogRecvMessage(size int64) { - bwc.totalIn.Mark(uint64(size)) -} - -func (bwc *BandwidthCounter) LogSentMessageStream(size int64, proto protocol.ID, p peer.ID) { - bwc.protocolOut.Get(string(proto)).Mark(uint64(size)) - bwc.peerOut.Get(string(p)).Mark(uint64(size)) -} - -func (bwc *BandwidthCounter) LogRecvMessageStream(size int64, proto protocol.ID, p peer.ID) { - bwc.protocolIn.Get(string(proto)).Mark(uint64(size)) - bwc.peerIn.Get(string(p)).Mark(uint64(size)) -} - -func (bwc *BandwidthCounter) GetBandwidthForPeer(p peer.ID) (out Stats) { - inSnap := bwc.peerIn.Get(string(p)).Snapshot() - outSnap := bwc.peerOut.Get(string(p)).Snapshot() - - return Stats{ - TotalIn: int64(inSnap.Total), - TotalOut: int64(outSnap.Total), - RateIn: inSnap.Rate, - RateOut: outSnap.Rate, - } -} - -func (bwc *BandwidthCounter) GetBandwidthForProtocol(proto protocol.ID) (out Stats) { - inSnap := bwc.protocolIn.Get(string(proto)).Snapshot() - outSnap := bwc.protocolOut.Get(string(proto)).Snapshot() - - return Stats{ - TotalIn: int64(inSnap.Total), - TotalOut: int64(outSnap.Total), - RateIn: inSnap.Rate, - RateOut: outSnap.Rate, - } -} - -func (bwc *BandwidthCounter) GetBandwidthTotals() (out Stats) { - inSnap := bwc.totalIn.Snapshot() - outSnap := bwc.totalOut.Snapshot() - - return Stats{ - TotalIn: int64(inSnap.Total), - TotalOut: int64(outSnap.Total), - RateIn: inSnap.Rate, - RateOut: outSnap.Rate, - } -} diff --git a/vendor/github.com/libp2p/go-libp2p-metrics/codecov.yml b/vendor/github.com/libp2p/go-libp2p-metrics/codecov.yml deleted file mode 100644 index 5f88a9ea..00000000 --- a/vendor/github.com/libp2p/go-libp2p-metrics/codecov.yml +++ /dev/null @@ -1,3 +0,0 @@ -coverage: - range: "50...100" -comment: off diff --git a/vendor/github.com/libp2p/go-libp2p-metrics/go.mod b/vendor/github.com/libp2p/go-libp2p-metrics/go.mod deleted file mode 100644 index ac2b430b..00000000 --- a/vendor/github.com/libp2p/go-libp2p-metrics/go.mod +++ /dev/null @@ -1,7 +0,0 @@ -module github.com/libp2p/go-libp2p-metrics - -require ( - github.com/libp2p/go-flow-metrics v0.0.1 - github.com/libp2p/go-libp2p-peer v0.0.1 - github.com/libp2p/go-libp2p-protocol v0.0.1 -) diff --git a/vendor/github.com/libp2p/go-libp2p-metrics/interface.go b/vendor/github.com/libp2p/go-libp2p-metrics/interface.go deleted file mode 100644 index ef1bb97e..00000000 --- a/vendor/github.com/libp2p/go-libp2p-metrics/interface.go +++ /dev/null @@ -1,16 +0,0 @@ -package metrics - -import ( - peer "github.com/libp2p/go-libp2p-peer" - protocol "github.com/libp2p/go-libp2p-protocol" -) - -type Reporter interface { - LogSentMessage(int64) - LogRecvMessage(int64) - LogSentMessageStream(int64, protocol.ID, peer.ID) - LogRecvMessageStream(int64, protocol.ID, peer.ID) - GetBandwidthForPeer(peer.ID) Stats - GetBandwidthForProtocol(protocol.ID) Stats - GetBandwidthTotals() Stats -} diff --git a/vendor/github.com/libp2p/go-libp2p-metrics/package.json b/vendor/github.com/libp2p/go-libp2p-metrics/package.json deleted file mode 100644 index e4ac0ee4..00000000 --- a/vendor/github.com/libp2p/go-libp2p-metrics/package.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "author": "whyrusleeping", - "bugs": { - "url": "https://github.com/libp2p/go-libp2p-metrics" - }, - "gx": { - "dvcsimport": "github.com/libp2p/go-libp2p-metrics" - }, - "gxDependencies": [ - { - "author": "whyrusleeping", - "hash": "QmYVXrKrKHDC9FobgmcmshCDyWwdrfwfanNQN4oxJ9Fk3h", - "name": "go-libp2p-peer", - "version": "3.1.2" - }, - { - "author": "whyrusleeping", - "hash": "QmZNkThpqfVXs9GNbexPrfBbXSLNYeKrE7jwFM2oqHbyqN", - "name": "go-libp2p-protocol", - "version": "1.0.0" - }, - { - "author": "Stebalien", - "hash": "QmQFXpvKpF34dK9HcE7k8Ksk8V4BwWYZtdEcjzu5aUgRVr", - "name": "go-flow-metrics", - "version": "0.2.0" - } - ], - "gxVersion": "0.9.1", - "language": "go", - "license": "", - "name": "go-libp2p-metrics", - "releaseCmd": "git commit -a -m \"gx publish $VERSION\"", - "version": "2.1.14" -} - diff --git a/vendor/github.com/libp2p/go-libp2p-transport/.gitignore b/vendor/github.com/libp2p/go-libp2p-mplex/.gitignore similarity index 100% rename from vendor/github.com/libp2p/go-libp2p-transport/.gitignore rename to vendor/github.com/libp2p/go-libp2p-mplex/.gitignore diff --git a/vendor/github.com/ipfs/go-ipfs-flags/.travis.yml b/vendor/github.com/libp2p/go-libp2p-mplex/.travis.yml similarity index 89% rename from vendor/github.com/ipfs/go-ipfs-flags/.travis.yml rename to vendor/github.com/libp2p/go-libp2p-mplex/.travis.yml index 4cfe98c2..5163d693 100644 --- a/vendor/github.com/ipfs/go-ipfs-flags/.travis.yml +++ b/vendor/github.com/libp2p/go-libp2p-mplex/.travis.yml @@ -10,7 +10,6 @@ env: global: - GOTFLAGS="-race" matrix: - - BUILD_DEPTYPE=gx - BUILD_DEPTYPE=gomod @@ -24,7 +23,6 @@ script: cache: directories: - - $GOPATH/src/gx - $GOPATH/pkg/mod - $HOME/.cache/go-build diff --git a/vendor/github.com/jbenet/go-context/LICENSE b/vendor/github.com/libp2p/go-libp2p-mplex/LICENSE similarity index 100% rename from vendor/github.com/jbenet/go-context/LICENSE rename to vendor/github.com/libp2p/go-libp2p-mplex/LICENSE diff --git a/vendor/github.com/whyrusleeping/go-smux-multiplex/Makefile b/vendor/github.com/libp2p/go-libp2p-mplex/Makefile similarity index 100% rename from vendor/github.com/whyrusleeping/go-smux-multiplex/Makefile rename to vendor/github.com/libp2p/go-libp2p-mplex/Makefile diff --git a/vendor/github.com/whyrusleeping/go-smux-multiplex/README.md b/vendor/github.com/libp2p/go-libp2p-mplex/README.md similarity index 76% rename from vendor/github.com/whyrusleeping/go-smux-multiplex/README.md rename to vendor/github.com/libp2p/go-libp2p-mplex/README.md index 4011314f..fc3d7889 100644 --- a/vendor/github.com/whyrusleeping/go-smux-multiplex/README.md +++ b/vendor/github.com/libp2p/go-libp2p-mplex/README.md @@ -1,4 +1,4 @@ -# go-smux-multiplex - a go-stream-muxer shim for multiplex +# go-libp2p-mplex - a go-stream-muxer shim for multiplex [![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](http://ipn.io) [![](https://img.shields.io/badge/freenode-%23ipfs-blue.svg?style=flat-square)](http://webchat.freenode.net/?channels=%23ipfs) ![](https://raw.githubusercontent.com/libp2p/go-stream-muxer/master/img/badge.png) @@ -7,7 +7,7 @@ This is an implementation of the [go-stream-muxer](https://github.com/libp2p/go- ## Installation ```sh -go get -d github.com/whyrusleeping/go-smux-multiplex -cd $GOPATH/src/github.com/whyrusleeping/go-smux-multiplex +go get -d github.com/libp2p/go-libp2p-mplex +cd $GOPATH/src/github.com/libp2p/go-libp2p-mplex make deps ``` diff --git a/vendor/github.com/libp2p/go-libp2p-mplex/go.mod b/vendor/github.com/libp2p/go-libp2p-mplex/go.mod new file mode 100644 index 00000000..08091671 --- /dev/null +++ b/vendor/github.com/libp2p/go-libp2p-mplex/go.mod @@ -0,0 +1,9 @@ +module github.com/libp2p/go-libp2p-mplex + +go 1.12 + +require ( + github.com/libp2p/go-libp2p-core v0.0.1 + github.com/libp2p/go-libp2p-testing v0.0.3 + github.com/libp2p/go-mplex v0.1.0 +) diff --git a/vendor/github.com/libp2p/go-libp2p-netutil/go.sum b/vendor/github.com/libp2p/go-libp2p-mplex/go.sum similarity index 78% rename from vendor/github.com/libp2p/go-libp2p-netutil/go.sum rename to vendor/github.com/libp2p/go-libp2p-mplex/go.sum index 0a044a24..44811af3 100644 --- a/vendor/github.com/libp2p/go-libp2p-netutil/go.sum +++ b/vendor/github.com/libp2p/go-libp2p-mplex/go.sum @@ -1,5 +1,4 @@ github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= -github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32 h1:qkOC5Gd33k54tobS36cXdAzJbeHaduLtnLQQwNoIi78= github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32/go.mod h1:DrZx5ec/dmnfpw9KyYoQyYo7d0KEvTkk/5M/vbZjAr8= github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= github.com/btcsuite/btcutil v0.0.0-20190207003914-4c204d697803/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= @@ -8,6 +7,7 @@ github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVa github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -15,37 +15,38 @@ github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMo github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/gxed/hashland/keccakpg v0.0.1 h1:wrk3uMNaMxbXiHibbPO4S0ymqJMm41WiudyFSs7UnsU= github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfmKFJ6tItnhQ67kU= -github.com/gxed/hashland/murmur3 v0.0.1 h1:SheiaIt0sda5K+8FLz952/1iWS9zrnKsEJaOJu4ZbSc= github.com/gxed/hashland/murmur3 v0.0.1/go.mod h1:KjXop02n4/ckmZSnY2+HKcLud/tcmvhST0bie/0lS48= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= github.com/ipfs/go-log v0.0.1 h1:9XTUN/rW64BCG1YhPK9Hoy3q8nr4gOmHHBpgFdfw6Lc= github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM= +github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8/go.mod h1:Ly/wlsjFq/qrU3Rar62tu1gASgGw6chQbSh/XgIIXCY= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= -github.com/libp2p/go-libp2p-crypto v0.0.1 h1:JNQd8CmoGTohO/akqrH16ewsqZpci2CbgYH/LmYl8gw= -github.com/libp2p/go-libp2p-crypto v0.0.1/go.mod h1:yJkNyDmO341d5wwXxDUGO0LykUVT72ImHNUqh5D/dBE= -github.com/libp2p/go-libp2p-peer v0.0.1 h1:0qwAOljzYewINrU+Kndoc+1jAL7vzY/oY2Go4DCGfyY= -github.com/libp2p/go-libp2p-peer v0.0.1/go.mod h1:nXQvOBbwVqoP+T5Y5nCjeH4sP9IX/J0AMzcDUVruVoo= -github.com/libp2p/go-testutil v0.0.1 h1:Xg+O0G2HIMfHqBOBDcMS1iSZJ3GEcId4qOxCQvsGZHk= -github.com/libp2p/go-testutil v0.0.1/go.mod h1:iAcJc/DKJQanJ5ws2V+u5ywdL2n12X1WbbEG+Jjy69I= +github.com/libp2p/go-buffer-pool v0.0.1 h1:9Rrn/H46cXjaA2HQ5Y8lyhOS1NhTkZ4yuEs2r3Eechg= +github.com/libp2p/go-buffer-pool v0.0.1/go.mod h1:xtyIz9PMobb13WaxR6Zo1Pd1zXJKYg0a8KiIvDp3TzQ= +github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZxBdp967ls1g+k8= +github.com/libp2p/go-libp2p-core v0.0.1 h1:HSTZtFIq/W5Ue43Zw+uWZyy2Vl5WtF0zDjKN8/DT/1I= +github.com/libp2p/go-libp2p-core v0.0.1/go.mod h1:g/VxnTZ/1ygHxH3dKok7Vno1VfpvGcGip57wjTU4fco= +github.com/libp2p/go-libp2p-testing v0.0.3 h1:bdij4bKaaND7tCsaXVjRfYkMpvoOeKj9AVQGJllA6jM= +github.com/libp2p/go-libp2p-testing v0.0.3/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= +github.com/libp2p/go-mplex v0.1.0 h1:/nBTy5+1yRyY82YaO6HXQRnO5IAGsXTjEJaR3LdTPc0= +github.com/libp2p/go-mplex v0.1.0/go.mod h1:SXgmdki2kwCUlCCbfGLEgHjC4pFqhTp0ZoV6aiKgxDU= github.com/mattn/go-colorable v0.1.1 h1:G1f5SKeVxmagw/IyvzvtZE4Gybcc4Tr1tf7I8z0XgOg= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= github.com/mattn/go-isatty v0.0.5 h1:tHXDdz1cpzGaovsTB+TVB8q90WEokoVmfMqoVcrLUgw= github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0OXOcUbGjvZxxijuBwbbmlSxLiuofa+g= github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= -github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16 h1:5W7KhL8HVF3XCFOweFD3BNESdnO8ewyYTFT2R+/b8FQ= github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= -github.com/mr-tron/base58 v1.1.0 h1:Y51FGVJ91WBqCEabAi5OPUz38eAx8DakuAm5svLcsfQ= github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= -github.com/multiformats/go-multiaddr v0.0.1 h1:/QUV3VBMDI6pi6xfiw7lr6xhDWWvQKn9udPn68kLSdY= -github.com/multiformats/go-multiaddr v0.0.1/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= -github.com/multiformats/go-multihash v0.0.1 h1:HHwN1K12I+XllBCrqKnhX949Orn4oawPkegHMu2vDqQ= +github.com/mr-tron/base58 v1.1.1/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= +github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= +github.com/multiformats/go-multiaddr v0.0.2/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= +github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs= github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= @@ -54,6 +55,8 @@ github.com/opentracing/opentracing-go v1.0.2 h1:3jA2P6O1F9UOrWVpwrIo17pu01KWvNWg github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= 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/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a/go.mod h1:7AyxJNCJ7SBZ1MfVQCWD6Uqo2oubI2Eq2y2eqf+A5r0= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572/go.mod h1:w0SWMsp6j9O/dk4/ZpIhL+3CkG8ofA2vuv7k+ltqUMc= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= @@ -61,7 +64,6 @@ github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc h1:9lDbC6 github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc/go.mod h1:bopw91TMyo8J3tvftk8xmU2kPmlrt4nScJQZU2hE5EM= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b h1:+/WWzjwW6gidDJnMKWLKLX1gxn7irUTF1fLpQovfQ5M= golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190227160552-c95aed5357e7 h1:C2F/nMkR/9sfUTpvR3QrjBuTdvMUC/cFajkphs1YLQo= diff --git a/vendor/github.com/whyrusleeping/go-smux-multiplex/multiplex.go b/vendor/github.com/libp2p/go-libp2p-mplex/multiplex.go similarity index 64% rename from vendor/github.com/whyrusleeping/go-smux-multiplex/multiplex.go rename to vendor/github.com/libp2p/go-libp2p-mplex/multiplex.go index 1cef4ef3..bf53c9e7 100644 --- a/vendor/github.com/whyrusleeping/go-smux-multiplex/multiplex.go +++ b/vendor/github.com/libp2p/go-libp2p-mplex/multiplex.go @@ -3,8 +3,9 @@ package peerstream_multiplex import ( "net" - mp "github.com/libp2p/go-mplex" // Conn is a connection to a remote peer. - smux "github.com/libp2p/go-stream-muxer" // Conn is a connection to a remote peer. + "github.com/libp2p/go-libp2p-core/mux" + + mp "github.com/libp2p/go-mplex" ) type conn struct { @@ -20,12 +21,12 @@ func (c *conn) IsClosed() bool { } // OpenStream creates a new stream. -func (c *conn) OpenStream() (smux.Stream, error) { +func (c *conn) OpenStream() (mux.MuxedStream, error) { return c.Multiplex.NewStream() } // AcceptStream accepts a stream opened by the other side. -func (c *conn) AcceptStream() (smux.Stream, error) { +func (c *conn) AcceptStream() (mux.MuxedStream, error) { return c.Multiplex.Accept() } @@ -36,6 +37,6 @@ type Transport struct{} // DefaultTransport has default settings for multiplex var DefaultTransport = &Transport{} -func (t *Transport) NewConn(nc net.Conn, isServer bool) (smux.Conn, error) { +func (t *Transport) NewConn(nc net.Conn, isServer bool) (mux.MuxedConn, error) { return &conn{mp.NewMultiplex(nc, isServer)}, nil } diff --git a/vendor/github.com/libp2p/go-libp2p-net/.travis.yml b/vendor/github.com/libp2p/go-libp2p-net/.travis.yml deleted file mode 100644 index 4cfe98c2..00000000 --- a/vendor/github.com/libp2p/go-libp2p-net/.travis.yml +++ /dev/null @@ -1,32 +0,0 @@ -os: - - linux - -language: go - -go: - - 1.11.x - -env: - global: - - GOTFLAGS="-race" - matrix: - - BUILD_DEPTYPE=gx - - BUILD_DEPTYPE=gomod - - -# disable travis install -install: - - true - -script: - - bash <(curl -s https://raw.githubusercontent.com/ipfs/ci-helpers/master/travis-ci/run-standard-tests.sh) - - -cache: - directories: - - $GOPATH/src/gx - - $GOPATH/pkg/mod - - $HOME/.cache/go-build - -notifications: - email: false diff --git a/vendor/github.com/libp2p/go-libp2p-net/LICENSE b/vendor/github.com/libp2p/go-libp2p-net/LICENSE deleted file mode 100644 index 0c354d06..00000000 --- a/vendor/github.com/libp2p/go-libp2p-net/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2016-2018 Protocol Labs - -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/libp2p/go-libp2p-net/Makefile b/vendor/github.com/libp2p/go-libp2p-net/Makefile deleted file mode 100644 index 5c996090..00000000 --- a/vendor/github.com/libp2p/go-libp2p-net/Makefile +++ /dev/null @@ -1,13 +0,0 @@ -all: deps - -gx: - go get github.com/whyrusleeping/gx - go get github.com/whyrusleeping/gx-go - -deps: gx - gx --verbose install --global - gx-go rewrite - -publish: - gx-go rewrite --undo - diff --git a/vendor/github.com/libp2p/go-libp2p-net/README.md b/vendor/github.com/libp2p/go-libp2p-net/README.md deleted file mode 100644 index b7d6b505..00000000 --- a/vendor/github.com/libp2p/go-libp2p-net/README.md +++ /dev/null @@ -1,44 +0,0 @@ -# go-libp2p-net - -[![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](https://protocol.ai) -[![](https://img.shields.io/badge/project-libp2p-yellow.svg?style=flat-square)](https://libp2p.io) -[![](https://img.shields.io/badge/freenode-%23libp2p-yellow.svg?style=flat-square)](http://webchat.freenode.net/?channels=%23libp2p) -[![Discourse posts](https://img.shields.io/discourse/https/discuss.libp2p.io/posts.svg)](https://discuss.libp2p.io) - -> Network interfaces for go-libp2p - -The libp2p Network package handles all of the peer-to-peer networking. It connects to other hosts, it encrypts communications, it muxes messages between the network's client services and target hosts. It has multiple subcomponents: - -- `Conn` - a connection to a single Peer - - `MultiConn` - a set of connections to a single Peer - - `SecureConn` - an encrypted (tls-like) connection -- `Swarm` - holds connections to Peers, multiplexes from/to each `MultiConn` -- `Muxer` - multiplexes between `Services` and `Swarm`. Handles `Request/Reply`. - - `Service` - connects between an outside client service and Network. - - `Handler` - the client service part that handles requests - -It looks a bit like this: - -[![](https://docs.google.com/drawings/d/1FvU7GImRsb9GvAWDDo1le85jIrnFJNVB_OTPXC15WwM/pub?h=480)] - -## Install - -```sh -go get libp2p/go-libp2p-net -``` - -## Contribute - -Feel free to join in. All welcome. Open an [issue](https://github.com/ipfs/go-libp2p-net/issues)! - -Check out our [contributing document](https://github.com/libp2p/community/blob/master/CONTRIBUTE.md) for more information on how we work, and about contributing in general. Please be aware that all interactions related to libp2p are subject to the IPFS [Code of Conduct](https://github.com/ipfs/community/blob/master/code-of-conduct.md). - -Small note: If editing the README, please conform to the [standard-readme](https://github.com/RichardLitt/standard-readme) specification. - -### Want to hack on IPFS? - -[![](https://cdn.rawgit.com/jbenet/contribute-ipfs-gif/master/img/contribute.gif)](https://github.com/ipfs/community/blob/master/contributing.md) - -## License - -[MIT](LICENSE) © 2016 Jeromy Johnson diff --git a/vendor/github.com/libp2p/go-libp2p-net/codecov.yml b/vendor/github.com/libp2p/go-libp2p-net/codecov.yml deleted file mode 100644 index 5f88a9ea..00000000 --- a/vendor/github.com/libp2p/go-libp2p-net/codecov.yml +++ /dev/null @@ -1,3 +0,0 @@ -coverage: - range: "50...100" -comment: off diff --git a/vendor/github.com/libp2p/go-libp2p-net/go.mod b/vendor/github.com/libp2p/go-libp2p-net/go.mod deleted file mode 100644 index 54482511..00000000 --- a/vendor/github.com/libp2p/go-libp2p-net/go.mod +++ /dev/null @@ -1,11 +0,0 @@ -module github.com/libp2p/go-libp2p-net - -require ( - github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8 - github.com/libp2p/go-libp2p-crypto v0.0.1 - github.com/libp2p/go-libp2p-peer v0.0.1 - github.com/libp2p/go-libp2p-peerstore v0.0.1 - github.com/libp2p/go-libp2p-protocol v0.0.1 - github.com/libp2p/go-stream-muxer v0.0.1 - github.com/multiformats/go-multiaddr v0.0.1 -) diff --git a/vendor/github.com/libp2p/go-libp2p-net/go.sum b/vendor/github.com/libp2p/go-libp2p-net/go.sum deleted file mode 100644 index 9af7b291..00000000 --- a/vendor/github.com/libp2p/go-libp2p-net/go.sum +++ /dev/null @@ -1,104 +0,0 @@ -github.com/AndreasBriese/bbloom v0.0.0-20180913140656-343706a395b7/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= -github.com/Kubuxu/go-os-helper v0.0.1/go.mod h1:N8B+I7vPCT80IcP58r50u4+gEEcsZETFUpAzWW2ep1Y= -github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= -github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32 h1:qkOC5Gd33k54tobS36cXdAzJbeHaduLtnLQQwNoIi78= -github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32/go.mod h1:DrZx5ec/dmnfpw9KyYoQyYo7d0KEvTkk/5M/vbZjAr8= -github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= -github.com/btcsuite/btcutil v0.0.0-20190207003914-4c204d697803/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= -github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= -github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= -github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= -github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= -github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= -github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dgraph-io/badger v1.5.5-0.20190226225317-8115aed38f8f/go.mod h1:VZxzAIRPHRVNRKRo6AXrX9BJegn6il06VMTZVJYCIjQ= -github.com/dgryski/go-farm v0.0.0-20190104051053-3adb47b1fb0f/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= -github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0= -github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/gxed/hashland/keccakpg v0.0.1 h1:wrk3uMNaMxbXiHibbPO4S0ymqJMm41WiudyFSs7UnsU= -github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfmKFJ6tItnhQ67kU= -github.com/gxed/hashland/murmur3 v0.0.1 h1:SheiaIt0sda5K+8FLz952/1iWS9zrnKsEJaOJu4ZbSc= -github.com/gxed/hashland/murmur3 v0.0.1/go.mod h1:KjXop02n4/ckmZSnY2+HKcLud/tcmvhST0bie/0lS48= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/ipfs/go-datastore v0.0.1/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= -github.com/ipfs/go-ds-badger v0.0.2/go.mod h1:Y3QpeSFWQf6MopLTiZD+VT6IC1yZqaGmjvRcKeSGij8= -github.com/ipfs/go-ds-leveldb v0.0.1/go.mod h1:feO8V3kubwsEF22n0YRQCffeb79OOYIykR4L04tMOYc= -github.com/ipfs/go-ipfs-delay v0.0.0-20181109222059-70721b86a9a8/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= -github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM= -github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8 h1:bspPhN+oKYFk5fcGNuQzp6IGzYQSenLEgH3s6jkXrWw= -github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8/go.mod h1:Ly/wlsjFq/qrU3Rar62tu1gASgGw6chQbSh/XgIIXCY= -github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= -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/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/libp2p/go-buffer-pool v0.0.1/go.mod h1:xtyIz9PMobb13WaxR6Zo1Pd1zXJKYg0a8KiIvDp3TzQ= -github.com/libp2p/go-libp2p-crypto v0.0.1 h1:JNQd8CmoGTohO/akqrH16ewsqZpci2CbgYH/LmYl8gw= -github.com/libp2p/go-libp2p-crypto v0.0.1/go.mod h1:yJkNyDmO341d5wwXxDUGO0LykUVT72ImHNUqh5D/dBE= -github.com/libp2p/go-libp2p-peer v0.0.1 h1:0qwAOljzYewINrU+Kndoc+1jAL7vzY/oY2Go4DCGfyY= -github.com/libp2p/go-libp2p-peer v0.0.1/go.mod h1:nXQvOBbwVqoP+T5Y5nCjeH4sP9IX/J0AMzcDUVruVoo= -github.com/libp2p/go-libp2p-peerstore v0.0.1 h1:twKovq8YK5trLrd3nB7PD2Zu9JcyAIdm7Bz9yBWjhq8= -github.com/libp2p/go-libp2p-peerstore v0.0.1/go.mod h1:RabLyPVJLuNQ+GFyoEkfi8H4Ti6k/HtZJ7YKgtSq+20= -github.com/libp2p/go-libp2p-protocol v0.0.1 h1:+zkEmZ2yFDi5adpVE3t9dqh/N9TbpFWywowzeEzBbLM= -github.com/libp2p/go-libp2p-protocol v0.0.1/go.mod h1:Af9n4PiruirSDjHycM1QuiMi/1VZNHYcK8cLgFJLZ4s= -github.com/libp2p/go-stream-muxer v0.0.1 h1:Ce6e2Pyu+b5MC1k3eeFtAax0pW4gc6MosYSLV05UeLw= -github.com/libp2p/go-stream-muxer v0.0.1/go.mod h1:bAo8x7YkSpadMTbtTaxGVHWUQsR/l5MEaHbKaliuT14= -github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= -github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0OXOcUbGjvZxxijuBwbbmlSxLiuofa+g= -github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= -github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16 h1:5W7KhL8HVF3XCFOweFD3BNESdnO8ewyYTFT2R+/b8FQ= -github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= -github.com/mr-tron/base58 v1.1.0 h1:Y51FGVJ91WBqCEabAi5OPUz38eAx8DakuAm5svLcsfQ= -github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= -github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= -github.com/multiformats/go-multiaddr v0.0.1 h1:/QUV3VBMDI6pi6xfiw7lr6xhDWWvQKn9udPn68kLSdY= -github.com/multiformats/go-multiaddr v0.0.1/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= -github.com/multiformats/go-multiaddr-dns v0.0.1/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= -github.com/multiformats/go-multiaddr-net v0.0.1/go.mod h1:nw6HSxNmCIQH27XPGBuX+d1tnvM7ihcFwHMSstNAVUU= -github.com/multiformats/go-multihash v0.0.1 h1:HHwN1K12I+XllBCrqKnhX949Orn4oawPkegHMu2vDqQ= -github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= -github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1/go.mod h1:8UvriyWtv5Q5EOgjHaSseUEdkQfvwFv1I/In/O2M9gc= -github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc/go.mod h1:bopw91TMyo8J3tvftk8xmU2kPmlrt4nScJQZU2hE5EM= -github.com/whyrusleeping/mafmt v1.2.8/go.mod h1:faQJFPbLSxzD9xpA02ttW/tS9vZykNvXwGvqIpk20FA= -golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b h1:+/WWzjwW6gidDJnMKWLKLX1gxn7irUTF1fLpQovfQ5M= -golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190227160552-c95aed5357e7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/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-20190219092855-153ac476189d/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223 h1:DH4skfRX4EBpamg7iV4ZlCpblAHI6s6TDM39bFZumv8= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/vendor/github.com/libp2p/go-libp2p-net/options.go b/vendor/github.com/libp2p/go-libp2p-net/options.go deleted file mode 100644 index 16d25f16..00000000 --- a/vendor/github.com/libp2p/go-libp2p-net/options.go +++ /dev/null @@ -1,25 +0,0 @@ -package net - -import ( - "context" -) - -type noDialCtxKey struct{} - -var noDial = noDialCtxKey{} - -// WithNoDial constructs a new context with an option that instructs the network -// to not attempt a new dial when opening a stream. -func WithNoDial(ctx context.Context, reason string) context.Context { - return context.WithValue(ctx, noDial, reason) -} - -// GetNoDial returns true if the no dial option is set in the context. -func GetNoDial(ctx context.Context) (nodial bool, reason string) { - v := ctx.Value(noDial) - if v != nil { - return true, v.(string) - } - - return false, "" -} diff --git a/vendor/github.com/libp2p/go-libp2p-net/package.json b/vendor/github.com/libp2p/go-libp2p-net/package.json deleted file mode 100644 index efac1a00..00000000 --- a/vendor/github.com/libp2p/go-libp2p-net/package.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "author": "whyrusleeping", - "bugs": { - "url": "https://github.com/libp2p/go-libp2p-net" - }, - "gx": { - "dvcsimport": "github.com/libp2p/go-libp2p-net" - }, - "gxDependencies": [ - { - "author": "whyrusleeping", - "hash": "QmZNkThpqfVXs9GNbexPrfBbXSLNYeKrE7jwFM2oqHbyqN", - "name": "go-libp2p-protocol", - "version": "1.0.0" - }, - { - "author": "whyrusleeping", - "hash": "QmaCTz9RkrU13bm9kMB54f7atgqM4qkjDZpRwRoJiWXEqs", - "name": "go-libp2p-peerstore", - "version": "2.0.19" - }, - { - "author": "whyrusleeping", - "hash": "QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP", - "name": "goprocess", - "version": "1.0.0" - }, - { - "author": "multiformats", - "hash": "QmTZBfrPJmjWsCvHEtX5FE6KimVJhsJg5sBbqEFYf4UZtL", - "name": "go-multiaddr", - "version": "1.4.1" - }, - { - "author": "whyrusleeping", - "hash": "QmYVXrKrKHDC9FobgmcmshCDyWwdrfwfanNQN4oxJ9Fk3h", - "name": "go-libp2p-peer", - "version": "3.1.2" - }, - { - "author": "whyrusleeping", - "hash": "QmVtV1y2e8W4eQgzsP6qfSpCCZ6zWYE4m6NzJjB7iswwrT", - "name": "go-stream-muxer", - "version": "3.1.0" - }, - { - "author": "whyrusleeping", - "hash": "QmTW4SdgBWq9GjsBsHeUx8WuGxzhgzAf88UMH2w62PC8yK", - "name": "go-libp2p-crypto", - "version": "2.0.7" - } - ], - "gxVersion": "0.9.1", - "language": "go", - "license": "", - "name": "go-libp2p-net", - "releaseCmd": "git commit -a -m \"gx publish $VERSION\"", - "version": "3.0.30" -} - diff --git a/vendor/github.com/libp2p/go-libp2p-netutil/.travis.yml b/vendor/github.com/libp2p/go-libp2p-netutil/.travis.yml deleted file mode 100644 index 4cfe98c2..00000000 --- a/vendor/github.com/libp2p/go-libp2p-netutil/.travis.yml +++ /dev/null @@ -1,32 +0,0 @@ -os: - - linux - -language: go - -go: - - 1.11.x - -env: - global: - - GOTFLAGS="-race" - matrix: - - BUILD_DEPTYPE=gx - - BUILD_DEPTYPE=gomod - - -# disable travis install -install: - - true - -script: - - bash <(curl -s https://raw.githubusercontent.com/ipfs/ci-helpers/master/travis-ci/run-standard-tests.sh) - - -cache: - directories: - - $GOPATH/src/gx - - $GOPATH/pkg/mod - - $HOME/.cache/go-build - -notifications: - email: false diff --git a/vendor/github.com/libp2p/go-libp2p-netutil/Makefile b/vendor/github.com/libp2p/go-libp2p-netutil/Makefile deleted file mode 100644 index 20619413..00000000 --- a/vendor/github.com/libp2p/go-libp2p-netutil/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -gx: - go get github.com/whyrusleeping/gx - go get github.com/whyrusleeping/gx-go - -deps: gx - gx --verbose install --global - gx-go rewrite - -publish: - gx-go rewrite --undo - diff --git a/vendor/github.com/libp2p/go-libp2p-netutil/README.md b/vendor/github.com/libp2p/go-libp2p-netutil/README.md deleted file mode 100644 index 6a212fb1..00000000 --- a/vendor/github.com/libp2p/go-libp2p-netutil/README.md +++ /dev/null @@ -1,10 +0,0 @@ -go-libp2p-netutil -================== - -[![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](https://protocol.ai) -[![](https://img.shields.io/badge/project-libp2p-blue.svg?style=flat-square)](http://libp2p.io/) -[![](https://img.shields.io/badge/freenode-%23libp2p-blue.svg?style=flat-square)](http://webchat.freenode.net/?channels=%23libp2p) -[![codecov](https://codecov.io/gh/libp2p/go-libp2p-netutil/branch/master/graph/badge.svg)](https://codecov.io/gh/libp2p/go-libp2p-netutil) -[![Travis CI](https://travis-ci.org/libp2p/go-libp2p-netutil.svg?branch=master)](https://travis-ci.org/libp2p/go-libp2p-netutil) - -> Utility methods for creating public and private keys for use in tests. \ No newline at end of file diff --git a/vendor/github.com/libp2p/go-libp2p-netutil/codecov.yml b/vendor/github.com/libp2p/go-libp2p-netutil/codecov.yml deleted file mode 100644 index 5f88a9ea..00000000 --- a/vendor/github.com/libp2p/go-libp2p-netutil/codecov.yml +++ /dev/null @@ -1,3 +0,0 @@ -coverage: - range: "50...100" -comment: off diff --git a/vendor/github.com/libp2p/go-libp2p-netutil/go.mod b/vendor/github.com/libp2p/go-libp2p-netutil/go.mod deleted file mode 100644 index fe1fd0b3..00000000 --- a/vendor/github.com/libp2p/go-libp2p-netutil/go.mod +++ /dev/null @@ -1,9 +0,0 @@ -module github.com/libp2p/go-libp2p-netutil - -require ( - github.com/ipfs/go-log v0.0.1 - github.com/libp2p/go-libp2p-crypto v0.0.1 - github.com/libp2p/go-libp2p-peer v0.0.1 - github.com/libp2p/go-testutil v0.0.1 - github.com/multiformats/go-multiaddr v0.0.1 -) diff --git a/vendor/github.com/libp2p/go-libp2p-netutil/key.go b/vendor/github.com/libp2p/go-libp2p-netutil/key.go deleted file mode 100644 index 1ba25cdb..00000000 --- a/vendor/github.com/libp2p/go-libp2p-netutil/key.go +++ /dev/null @@ -1,178 +0,0 @@ -package testutil - -import ( - "bytes" - "crypto/rand" - "io" - "testing" - - logging "github.com/ipfs/go-log" - ic "github.com/libp2p/go-libp2p-crypto" - pb "github.com/libp2p/go-libp2p-crypto/pb" - peer "github.com/libp2p/go-libp2p-peer" - testutil "github.com/libp2p/go-testutil" - - ma "github.com/multiformats/go-multiaddr" -) - -var log = logging.Logger("boguskey") - -// TestBogusPrivateKey is a key used for testing (to avoid expensive keygen) -type TestBogusPrivateKey []byte - -// TestBogusPublicKey is a key used for testing (to avoid expensive keygen) -type TestBogusPublicKey []byte - -func (pk TestBogusPublicKey) Verify(data, sig []byte) (bool, error) { - log.Errorf("TestBogusPublicKey.Verify -- this better be a test!") - return bytes.Equal(data, reverse(sig)), nil -} - -func (pk TestBogusPublicKey) Bytes() ([]byte, error) { - return []byte(pk), nil -} - -func (pk TestBogusPublicKey) Encrypt(b []byte) ([]byte, error) { - log.Errorf("TestBogusPublicKey.Encrypt -- this better be a test!") - return reverse(b), nil -} - -// Equals checks whether this key is equal to another -func (pk TestBogusPublicKey) Equals(k ic.Key) bool { - return ic.KeyEqual(pk, k) -} - -// Raw returns the raw bytes of the key (not wrapped in the -// libp2p-crypto protobuf). -func (pk TestBogusPublicKey) Raw() ([]byte, error) { - return pk, nil -} - -// Type returns the protobof key type. -func (pk TestBogusPublicKey) Type() pb.KeyType { - return pb.KeyType_RSA -} - -func (sk TestBogusPrivateKey) GenSecret() []byte { - return []byte(sk) -} - -func (sk TestBogusPrivateKey) Sign(message []byte) ([]byte, error) { - log.Errorf("TestBogusPrivateKey.Sign -- this better be a test!") - return reverse(message), nil -} - -func (sk TestBogusPrivateKey) GetPublic() ic.PubKey { - return TestBogusPublicKey(sk) -} - -func (sk TestBogusPrivateKey) Decrypt(b []byte) ([]byte, error) { - log.Errorf("TestBogusPrivateKey.Decrypt -- this better be a test!") - return reverse(b), nil -} - -func (sk TestBogusPrivateKey) Bytes() ([]byte, error) { - return []byte(sk), nil -} - -// Equals checks whether this key is equal to another -func (sk TestBogusPrivateKey) Equals(k ic.Key) bool { - return ic.KeyEqual(sk, k) -} - -// Raw returns the raw bytes of the key (not wrapped in the -// libp2p-crypto protobuf). -func (sk TestBogusPrivateKey) Raw() ([]byte, error) { - return sk, nil -} - -// Type returns the protobof key type. -func (pk TestBogusPrivateKey) Type() pb.KeyType { - return pb.KeyType_RSA -} - -func RandTestBogusPrivateKey() (TestBogusPrivateKey, error) { - k := make([]byte, 5) - if _, err := io.ReadFull(rand.Reader, k); err != nil { - return nil, err - } - return TestBogusPrivateKey(k), nil -} - -func RandTestBogusPublicKey() (TestBogusPublicKey, error) { - k, err := RandTestBogusPrivateKey() - return TestBogusPublicKey(k), err -} - -func RandTestBogusPrivateKeyOrFatal(t *testing.T) TestBogusPrivateKey { - k, err := RandTestBogusPrivateKey() - if err != nil { - t.Fatal(err) - } - return k -} - -func RandTestBogusPublicKeyOrFatal(t *testing.T) TestBogusPublicKey { - k, err := RandTestBogusPublicKey() - if err != nil { - t.Fatal(err) - } - return k -} - -func RandTestBogusIdentity() (testutil.Identity, error) { - k, err := RandTestBogusPrivateKey() - if err != nil { - return nil, err - } - - id, err := peer.IDFromPrivateKey(k) - if err != nil { - return nil, err - } - - return &identity{ - k: k, - id: id, - a: testutil.RandLocalTCPAddress(), - }, nil -} - -func RandTestBogusIdentityOrFatal(t *testing.T) testutil.Identity { - k, err := RandTestBogusIdentity() - if err != nil { - t.Fatal(err) - } - return k -} - -// identity is a temporary shim to delay binding of PeerNetParams. -type identity struct { - k TestBogusPrivateKey - id peer.ID - a ma.Multiaddr -} - -func (p *identity) ID() peer.ID { - return p.id -} - -func (p *identity) Address() ma.Multiaddr { - return p.a -} - -func (p *identity) PrivateKey() ic.PrivKey { - return p.k -} - -func (p *identity) PublicKey() ic.PubKey { - return p.k.GetPublic() -} - -func reverse(a []byte) []byte { - b := make([]byte, len(a)) - for i := 0; i < len(a); i++ { - b[i] = a[len(a)-1-i] - } - return b -} diff --git a/vendor/github.com/libp2p/go-libp2p-netutil/package.json b/vendor/github.com/libp2p/go-libp2p-netutil/package.json deleted file mode 100644 index de55ff64..00000000 --- a/vendor/github.com/libp2p/go-libp2p-netutil/package.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "author": "whyrusleeping", - "bugs": { - "url": "https://github.com/libp2p/go-libp2p-netutil" - }, - "gx": { - "dvcsimport": "github.com/libp2p/go-libp2p-netutil" - }, - "gxDependencies": [ - { - "author": "whyrusleeping", - "hash": "QmTW4SdgBWq9GjsBsHeUx8WuGxzhgzAf88UMH2w62PC8yK", - "name": "go-libp2p-crypto", - "version": "2.0.7" - }, - { - "author": "whyrusleeping", - "hash": "QmaCTz9RkrU13bm9kMB54f7atgqM4qkjDZpRwRoJiWXEqs", - "name": "go-libp2p-peerstore", - "version": "2.0.19" - }, - { - "hash": "QmbkT7eMTyXfpeyB3ZMxxcxg7XH8t6uXp49jqzz4HB7BGF", - "name": "go-log", - "version": "1.5.9" - }, - { - "author": "multiformats", - "hash": "QmTZBfrPJmjWsCvHEtX5FE6KimVJhsJg5sBbqEFYf4UZtL", - "name": "go-multiaddr", - "version": "1.4.1" - }, - { - "author": "whyrusleeping", - "hash": "QmYVXrKrKHDC9FobgmcmshCDyWwdrfwfanNQN4oxJ9Fk3h", - "name": "go-libp2p-peer", - "version": "3.1.2" - }, - { - "author": "whyrusleeping", - "hash": "QmWapVoHjtKhn4MhvKNoPTkJKADFGACfXPFnt7combwp5W", - "name": "go-testutil", - "version": "1.2.19" - } - ], - "gxVersion": "0.10.0", - "language": "go", - "license": "", - "name": "go-libp2p-netutil", - "releaseCmd": "git commit -a -m \"gx publish $VERSION\"", - "version": "0.4.23" -} - diff --git a/vendor/github.com/libp2p/go-libp2p-peer/.travis.yml b/vendor/github.com/libp2p/go-libp2p-peer/.travis.yml index 4cfe98c2..5163d693 100644 --- a/vendor/github.com/libp2p/go-libp2p-peer/.travis.yml +++ b/vendor/github.com/libp2p/go-libp2p-peer/.travis.yml @@ -10,7 +10,6 @@ env: global: - GOTFLAGS="-race" matrix: - - BUILD_DEPTYPE=gx - BUILD_DEPTYPE=gomod @@ -24,7 +23,6 @@ script: cache: directories: - - $GOPATH/src/gx - $GOPATH/pkg/mod - $HOME/.cache/go-build diff --git a/vendor/github.com/libp2p/go-libp2p-peer/Makefile b/vendor/github.com/libp2p/go-libp2p-peer/Makefile deleted file mode 100644 index 20619413..00000000 --- a/vendor/github.com/libp2p/go-libp2p-peer/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -gx: - go get github.com/whyrusleeping/gx - go get github.com/whyrusleeping/gx-go - -deps: gx - gx --verbose install --global - gx-go rewrite - -publish: - gx-go rewrite --undo - diff --git a/vendor/github.com/libp2p/go-libp2p-peer/README.md b/vendor/github.com/libp2p/go-libp2p-peer/README.md index 035e168a..ab9b684e 100644 --- a/vendor/github.com/libp2p/go-libp2p-peer/README.md +++ b/vendor/github.com/libp2p/go-libp2p-peer/README.md @@ -1,12 +1,12 @@ # go-libp2p-peer [![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](https://protocol.ai) -[![](https://img.shields.io/badge/freenode-%23ipfs-blue.svg?style=flat-square)](https://webchat.freenode.net/?channels=%23ipfs) -[![](https://img.shields.io/badge/project-IPFS-blue.svg?style=flat-square)](https://ipfs.io/) -[![standard-readme compliant](https://img.shields.io/badge/standard--readme-OK-green.svg?style=flat-square)](https://github.com/RichardLitt/standard-readme) +[![](https://img.shields.io/badge/freenode-%23libp2p-yellow.svg?style=flat-square)](https://webchat.freenode.net/?channels=%23libp2p) +[![](https://img.shields.io/badge/project-libp2p-yellow.svg?style=flat-square)](https://libp2p.io/) [![GoDoc](https://godoc.org/github.com/libp2p/go-libp2p-peer?status.svg)](https://godoc.org/github.com/libp2p/go-libp2p-peer) [![Coverage Status](https://codecov.io/gh/libp2p/go-libp2p-peer/branch/master/graph/badge.svg)](https://codecov.io/gh/libp2p/go-libp2p-peer/branch/master) [![Build Status](https://travis-ci.org/libp2p/go-libp2p-peer.svg?branch=master)](https://travis-ci.org/libp2p/go-libp2p-peer) +[![Discourse posts](https://img.shields.io/discourse/https/discuss.libp2p.io/posts.svg)](https://discuss.libp2p.io) > PKI based identities for use in go-libp2p @@ -31,3 +31,7 @@ This repository falls under the IPFS [Code of Conduct](https://github.com/ipfs/c ## License MIT + +--- + +The last gx published version of this module was: 3.1.2: QmYVXrKrKHDC9FobgmcmshCDyWwdrfwfanNQN4oxJ9Fk3h diff --git a/vendor/github.com/libp2p/go-libp2p-peer/deprecated.go b/vendor/github.com/libp2p/go-libp2p-peer/deprecated.go new file mode 100644 index 00000000..600b5ece --- /dev/null +++ b/vendor/github.com/libp2p/go-libp2p-peer/deprecated.go @@ -0,0 +1,65 @@ +// Deprecated: use github.com/libp2p/go-libp2p-core/peer instead. +package peer + +import ( + core "github.com/libp2p/go-libp2p-core/peer" + ic "github.com/libp2p/go-libp2p-crypto" +) + +var ( + // Deprecated: use github.com/libp2p/go-libp2p-core/peer.ErrEmptyPeerID instead. + ErrEmptyPeerID = core.ErrEmptyPeerID + // Deprecated: use github.com/libp2p/go-libp2p-core/peer.ErrNoPublicKey instead. + ErrNoPublicKey = core.ErrNoPublicKey +) + +// Deprecated: use github.com/libp2p/go-libp2p-core/peer.AdvanceEnableInlining instead. +// Warning: this variable's type makes it impossible to alias by reference. +// Reads and writes from/to this variable may be inaccurate or not have the intended effect. +var AdvancedEnableInlining = core.AdvancedEnableInlining + +// Deprecated: use github.com/libp2p/go-libp2p-core/peer.ID instead. +type ID = core.ID + +// Deprecated: use github.com/libp2p/go-libp2p-core/peer.IDSlice instead. +type IDSlice = core.IDSlice + +// Deprecated: use github.com/libp2p/go-libp2p-core/peer.IDFromString instead. +func IDFromString(s string) (core.ID, error) { + return core.IDFromString(s) +} + +// Deprecated: use github.com/libp2p/go-libp2p-core/peer.IDFromBytes instead. +func IDFromBytes(b []byte) (core.ID, error) { + return core.IDFromBytes(b) +} + +// Deprecated: use github.com/libp2p/go-libp2p-core/peer.IDB58Decode instead. +func IDB58Decode(s string) (core.ID, error) { + return core.IDB58Decode(s) +} + +// Deprecated: use github.com/libp2p/go-libp2p-core/peer.IDB58Encode instead. +func IDB58Encode(id ID) string { + return core.IDB58Encode(id) +} + +// Deprecated: use github.com/libp2p/go-libp2p-core/peer.IDHexDecode instead. +func IDHexDecode(s string) (core.ID, error) { + return core.IDHexDecode(s) +} + +// Deprecated: use github.com/libp2p/go-libp2p-core/peer.IDHexEncode instead. +func IDHexEncode(id ID) string { + return core.IDHexEncode(id) +} + +// Deprecated: use github.com/libp2p/go-libp2p-core/peer.IDFromPublicKey instead. +func IDFromPublicKey(pk ic.PubKey) (core.ID, error) { + return core.IDFromPublicKey(pk) +} + +// Deprecated: use github.com/libp2p/go-libp2p-core/peer.IDFromPrivateKey instead. +func IDFromPrivateKey(sk ic.PrivKey) (core.ID, error) { + return core.IDFromPrivateKey(sk) +} diff --git a/vendor/github.com/libp2p/go-libp2p-peer/go.mod b/vendor/github.com/libp2p/go-libp2p-peer/go.mod index 3880bb10..c2e26e78 100644 --- a/vendor/github.com/libp2p/go-libp2p-peer/go.mod +++ b/vendor/github.com/libp2p/go-libp2p-peer/go.mod @@ -1,7 +1,7 @@ module github.com/libp2p/go-libp2p-peer require ( - github.com/libp2p/go-libp2p-crypto v0.0.1 - github.com/mr-tron/base58 v1.1.0 - github.com/multiformats/go-multihash v0.0.1 + github.com/libp2p/go-libp2p-core v0.0.1 + github.com/libp2p/go-libp2p-crypto v0.1.0 + golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223 // indirect ) diff --git a/vendor/github.com/libp2p/go-libp2p-peer/go.sum b/vendor/github.com/libp2p/go-libp2p-peer/go.sum index fd8fc4d0..e5bf65d5 100644 --- a/vendor/github.com/libp2p/go-libp2p-peer/go.sum +++ b/vendor/github.com/libp2p/go-libp2p-peer/go.sum @@ -8,6 +8,7 @@ github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVa github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495 h1:6IyqGr3fnd0tM3YxipK27TUskaOVUjU2nG45yzwcQKY= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= @@ -19,24 +20,38 @@ github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfm github.com/gxed/hashland/murmur3 v0.0.1 h1:SheiaIt0sda5K+8FLz952/1iWS9zrnKsEJaOJu4ZbSc= github.com/gxed/hashland/murmur3 v0.0.1/go.mod h1:KjXop02n4/ckmZSnY2+HKcLud/tcmvhST0bie/0lS48= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= +github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8/go.mod h1:Ly/wlsjFq/qrU3Rar62tu1gASgGw6chQbSh/XgIIXCY= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= -github.com/libp2p/go-libp2p-crypto v0.0.1 h1:JNQd8CmoGTohO/akqrH16ewsqZpci2CbgYH/LmYl8gw= -github.com/libp2p/go-libp2p-crypto v0.0.1/go.mod h1:yJkNyDmO341d5wwXxDUGO0LykUVT72ImHNUqh5D/dBE= +github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZxBdp967ls1g+k8= +github.com/libp2p/go-libp2p-core v0.0.1 h1:HSTZtFIq/W5Ue43Zw+uWZyy2Vl5WtF0zDjKN8/DT/1I= +github.com/libp2p/go-libp2p-core v0.0.1/go.mod h1:g/VxnTZ/1ygHxH3dKok7Vno1VfpvGcGip57wjTU4fco= +github.com/libp2p/go-libp2p-crypto v0.1.0 h1:k9MFy+o2zGDNGsaoZl0MA3iZ75qXxr9OOoAZF+sD5OQ= +github.com/libp2p/go-libp2p-crypto v0.1.0/go.mod h1:sPUokVISZiy+nNuTTH/TY+leRSxnFj/2GLjtOTW90hI= github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0OXOcUbGjvZxxijuBwbbmlSxLiuofa+g= github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16 h1:5W7KhL8HVF3XCFOweFD3BNESdnO8ewyYTFT2R+/b8FQ= github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= -github.com/mr-tron/base58 v1.1.0 h1:Y51FGVJ91WBqCEabAi5OPUz38eAx8DakuAm5svLcsfQ= github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= +github.com/mr-tron/base58 v1.1.1 h1:OJIdWOWYe2l5PQNgimGtuwHY8nDskvJ5vvs//YnzRLs= +github.com/mr-tron/base58 v1.1.1/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= +github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= +github.com/multiformats/go-multiaddr v0.0.2 h1:RBysRCv5rv3FWlhKWKoXv8tnsCUpEpIZpCmqAGZos2s= +github.com/multiformats/go-multiaddr v0.0.2/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= +github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs= github.com/multiformats/go-multihash v0.0.1 h1:HHwN1K12I+XllBCrqKnhX949Orn4oawPkegHMu2vDqQ= github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a h1:/eS3yfGjQKG+9kayBkj0ip1BGhq6zJ3eaVksphxAaek= +github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a/go.mod h1:7AyxJNCJ7SBZ1MfVQCWD6Uqo2oubI2Eq2y2eqf+A5r0= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 h1:RC6RW7j+1+HkWaX/Yh71Ee5ZHaHYt7ZP4sQgUrm6cDU= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572/go.mod h1:w0SWMsp6j9O/dk4/ZpIhL+3CkG8ofA2vuv7k+ltqUMc= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b h1:+/WWzjwW6gidDJnMKWLKLX1gxn7irUTF1fLpQovfQ5M= @@ -44,8 +59,9 @@ golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b/go.mod h1:6SG95UA2DQfeDnf golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/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-20190219092855-153ac476189d h1:Z0Ahzd7HltpJtjAHHxX8QFP3j1yYgiuvjbjRzDj/KH0= golang.org/x/sys v0.0.0-20190219092855-153ac476189d/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223 h1:DH4skfRX4EBpamg7iV4ZlCpblAHI6s6TDM39bFZumv8= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/vendor/github.com/libp2p/go-libp2p-peer/package.json b/vendor/github.com/libp2p/go-libp2p-peer/package.json deleted file mode 100644 index a9b6b699..00000000 --- a/vendor/github.com/libp2p/go-libp2p-peer/package.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "author": "whyrusleeping", - "bugs": { - "url": "https://github.com/libp2p/go-libp2p-peer" - }, - "gx": { - "dvcsimport": "github.com/libp2p/go-libp2p-peer" - }, - "gxDependencies": [ - { - "author": "whyrusleeping", - "hash": "QmTW4SdgBWq9GjsBsHeUx8WuGxzhgzAf88UMH2w62PC8yK", - "name": "go-libp2p-crypto", - "version": "2.0.7" - }, - { - "author": "multiformats", - "hash": "QmerPMzPk1mJVowm8KgmoknWa4yCYvvugMPsgWmDNUvDLW", - "name": "go-multihash", - "version": "1.0.9" - }, - { - "author": "mr-tron", - "hash": "QmWFAMPqsEyUX7gDUsRVmMWz59FxSpJ1b2v6bJ1yYzo7jY", - "name": "go-base58-fast", - "version": "0.1.1" - } - ], - "gxVersion": "0.4.0", - "language": "go", - "license": "MIT", - "name": "go-libp2p-peer", - "releaseCmd": "git commit -a -m \"gx publish $VERSION\"", - "version": "3.1.2" -} - diff --git a/vendor/github.com/libp2p/go-libp2p-peer/test/utils.go b/vendor/github.com/libp2p/go-libp2p-peer/test/utils.go deleted file mode 100644 index fd23d1d0..00000000 --- a/vendor/github.com/libp2p/go-libp2p-peer/test/utils.go +++ /dev/null @@ -1,39 +0,0 @@ -package testutil - -import ( - "io" - "math/rand" - "sync/atomic" - "time" - - ci "github.com/libp2p/go-libp2p-crypto" - peer "github.com/libp2p/go-libp2p-peer" - mh "github.com/multiformats/go-multihash" -) - -var generatedPairs int64 = 0 - -func RandPeerID() (peer.ID, error) { - r := rand.New(rand.NewSource(time.Now().UnixNano())) - buf := make([]byte, 16) - if _, err := io.ReadFull(r, buf); err != nil { - return "", err - } - h, _ := mh.Sum(buf, mh.SHA2_256, -1) - return peer.ID(h), nil -} - -func RandTestKeyPair(bits int) (ci.PrivKey, ci.PubKey, error) { - seed := time.Now().UnixNano() - - // workaround for low time resolution - seed += atomic.AddInt64(&generatedPairs, 1) << 32 - - r := rand.New(rand.NewSource(seed)) - return ci.GenerateKeyPairWithReader(ci.RSA, bits, r) -} - -func SeededTestKeyPair(seed int64) (ci.PrivKey, ci.PubKey, error) { - r := rand.New(rand.NewSource(seed)) - return ci.GenerateKeyPairWithReader(ci.RSA, 512, r) -} diff --git a/vendor/github.com/libp2p/go-libp2p-peerstore/go.mod b/vendor/github.com/libp2p/go-libp2p-peerstore/go.mod index 72b60496..86338f38 100644 --- a/vendor/github.com/libp2p/go-libp2p-peerstore/go.mod +++ b/vendor/github.com/libp2p/go-libp2p-peerstore/go.mod @@ -8,10 +8,11 @@ require ( github.com/ipfs/go-ds-leveldb v0.0.1 github.com/ipfs/go-log v0.0.1 github.com/libp2p/go-buffer-pool v0.0.1 - github.com/libp2p/go-libp2p-crypto v0.0.1 - github.com/libp2p/go-libp2p-peer v0.0.1 + github.com/libp2p/go-libp2p-core v0.0.1 + github.com/libp2p/go-libp2p-crypto v0.1.0 + github.com/libp2p/go-libp2p-peer v0.2.0 github.com/multiformats/go-base32 v0.0.3 - github.com/multiformats/go-multiaddr v0.0.1 + github.com/multiformats/go-multiaddr v0.0.2 github.com/multiformats/go-multiaddr-net v0.0.1 github.com/multiformats/go-multihash v0.0.1 github.com/pkg/errors v0.8.1 diff --git a/vendor/github.com/libp2p/go-libp2p-peerstore/go.sum b/vendor/github.com/libp2p/go-libp2p-peerstore/go.sum index 67176d5a..6df7a493 100644 --- a/vendor/github.com/libp2p/go-libp2p-peerstore/go.sum +++ b/vendor/github.com/libp2p/go-libp2p-peerstore/go.sum @@ -12,6 +12,7 @@ github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVa github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -42,6 +43,7 @@ github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+ github.com/hashicorp/golang-lru v0.5.1/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/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= github.com/ipfs/go-datastore v0.0.1 h1:AW/KZCScnBWlSb5JbnEnLKFWXL224LBEh/9KXXOrUms= github.com/ipfs/go-datastore v0.0.1/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= github.com/ipfs/go-ds-badger v0.0.2 h1:7ToQt7QByBhOTuZF2USMv+PGlMcBC7FW7FdgQ4FCsoo= @@ -65,10 +67,13 @@ 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/libp2p/go-buffer-pool v0.0.1 h1:9Rrn/H46cXjaA2HQ5Y8lyhOS1NhTkZ4yuEs2r3Eechg= github.com/libp2p/go-buffer-pool v0.0.1/go.mod h1:xtyIz9PMobb13WaxR6Zo1Pd1zXJKYg0a8KiIvDp3TzQ= -github.com/libp2p/go-libp2p-crypto v0.0.1 h1:JNQd8CmoGTohO/akqrH16ewsqZpci2CbgYH/LmYl8gw= -github.com/libp2p/go-libp2p-crypto v0.0.1/go.mod h1:yJkNyDmO341d5wwXxDUGO0LykUVT72ImHNUqh5D/dBE= -github.com/libp2p/go-libp2p-peer v0.0.1 h1:0qwAOljzYewINrU+Kndoc+1jAL7vzY/oY2Go4DCGfyY= -github.com/libp2p/go-libp2p-peer v0.0.1/go.mod h1:nXQvOBbwVqoP+T5Y5nCjeH4sP9IX/J0AMzcDUVruVoo= +github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZxBdp967ls1g+k8= +github.com/libp2p/go-libp2p-core v0.0.1 h1:HSTZtFIq/W5Ue43Zw+uWZyy2Vl5WtF0zDjKN8/DT/1I= +github.com/libp2p/go-libp2p-core v0.0.1/go.mod h1:g/VxnTZ/1ygHxH3dKok7Vno1VfpvGcGip57wjTU4fco= +github.com/libp2p/go-libp2p-crypto v0.1.0 h1:k9MFy+o2zGDNGsaoZl0MA3iZ75qXxr9OOoAZF+sD5OQ= +github.com/libp2p/go-libp2p-crypto v0.1.0/go.mod h1:sPUokVISZiy+nNuTTH/TY+leRSxnFj/2GLjtOTW90hI= +github.com/libp2p/go-libp2p-peer v0.2.0 h1:EQ8kMjaCUwt/Y5uLgjT8iY2qg0mGUT0N1zUjer50DsY= +github.com/libp2p/go-libp2p-peer v0.2.0/go.mod h1:RCffaCvUyW2CJmG2gAWVqwePwW7JMgxjsHm7+J5kjWY= github.com/mattn/go-colorable v0.1.1 h1:G1f5SKeVxmagw/IyvzvtZE4Gybcc4Tr1tf7I8z0XgOg= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= github.com/mattn/go-isatty v0.0.5 h1:tHXDdz1cpzGaovsTB+TVB8q90WEokoVmfMqoVcrLUgw= @@ -77,16 +82,19 @@ github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0 github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16 h1:5W7KhL8HVF3XCFOweFD3BNESdnO8ewyYTFT2R+/b8FQ= github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= -github.com/mr-tron/base58 v1.1.0 h1:Y51FGVJ91WBqCEabAi5OPUz38eAx8DakuAm5svLcsfQ= github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= +github.com/mr-tron/base58 v1.1.1 h1:OJIdWOWYe2l5PQNgimGtuwHY8nDskvJ5vvs//YnzRLs= +github.com/mr-tron/base58 v1.1.1/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= github.com/multiformats/go-base32 v0.0.3 h1:tw5+NhuwaOjJCC5Pp82QuXbrmLzWg7uxlMFp8Nq/kkI= github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= -github.com/multiformats/go-multiaddr v0.0.1 h1:/QUV3VBMDI6pi6xfiw7lr6xhDWWvQKn9udPn68kLSdY= github.com/multiformats/go-multiaddr v0.0.1/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= +github.com/multiformats/go-multiaddr v0.0.2 h1:RBysRCv5rv3FWlhKWKoXv8tnsCUpEpIZpCmqAGZos2s= +github.com/multiformats/go-multiaddr v0.0.2/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= github.com/multiformats/go-multiaddr-dns v0.0.1 h1:jQt9c6tDSdQLIlBo4tXYx7QUHCPjxsB1zXcag/2S7zc= github.com/multiformats/go-multiaddr-dns v0.0.1/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= github.com/multiformats/go-multiaddr-net v0.0.1 h1:76O59E3FavvHqNg7jvzWzsPSW5JSi/ek0E4eiDVbg9g= github.com/multiformats/go-multiaddr-net v0.0.1/go.mod h1:nw6HSxNmCIQH27XPGBuX+d1tnvM7ihcFwHMSstNAVUU= +github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs= github.com/multiformats/go-multihash v0.0.1 h1:HHwN1K12I+XllBCrqKnhX949Orn4oawPkegHMu2vDqQ= github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= @@ -100,6 +108,10 @@ 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/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a h1:/eS3yfGjQKG+9kayBkj0ip1BGhq6zJ3eaVksphxAaek= +github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a/go.mod h1:7AyxJNCJ7SBZ1MfVQCWD6Uqo2oubI2Eq2y2eqf+A5r0= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 h1:RC6RW7j+1+HkWaX/Yh71Ee5ZHaHYt7ZP4sQgUrm6cDU= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572/go.mod h1:w0SWMsp6j9O/dk4/ZpIhL+3CkG8ofA2vuv7k+ltqUMc= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= diff --git a/vendor/github.com/libp2p/go-libp2p-peerstore/interface.go b/vendor/github.com/libp2p/go-libp2p-peerstore/interface.go index c669ba94..105dedc7 100644 --- a/vendor/github.com/libp2p/go-libp2p-peerstore/interface.go +++ b/vendor/github.com/libp2p/go-libp2p-peerstore/interface.go @@ -1,144 +1,46 @@ package peerstore -import ( - "context" - "errors" - "io" - "math" - "time" +import core "github.com/libp2p/go-libp2p-core/peerstore" - ic "github.com/libp2p/go-libp2p-crypto" - peer "github.com/libp2p/go-libp2p-peer" - ma "github.com/multiformats/go-multiaddr" -) - -var ErrNotFound = errors.New("item not found") +// Deprecated: use github.com/libp2p/go-libp2p-core/peerstore.ErrNotFound instead. +var ErrNotFound = core.ErrNotFound var ( - // AddressTTL is the expiration time of addresses. - AddressTTL = time.Hour + // Deprecated: use github.com/libp2p/go-libp2p-core/peerstore.AddressTTL instead. + AddressTTL = core.AddressTTL - // TempAddrTTL is the ttl used for a short lived address - TempAddrTTL = time.Minute * 2 + // Deprecated: use github.com/libp2p/go-libp2p-core/peerstore.TempAddrTTL instead. + TempAddrTTL = core.TempAddrTTL - // ProviderAddrTTL is the TTL of an address we've received from a provider. - // This is also a temporary address, but lasts longer. After this expires, - // the records we return will require an extra lookup. - ProviderAddrTTL = time.Minute * 10 + // Deprecated: use github.com/libp2p/go-libp2p-core/peerstore.ProviderAddrTTL instead. + ProviderAddrTTL = core.ProviderAddrTTL - // RecentlyConnectedAddrTTL is used when we recently connected to a peer. - // It means that we are reasonably certain of the peer's address. - RecentlyConnectedAddrTTL = time.Minute * 10 + // Deprecated: use github.com/libp2p/go-libp2p-core/peerstore.RecentlyConnectedAddrTTL instead. + RecentlyConnectedAddrTTL = core.RecentlyConnectedAddrTTL - // OwnObservedAddrTTL is used for our own external addresses observed by peers. - OwnObservedAddrTTL = time.Minute * 10 + // Deprecated: use github.com/libp2p/go-libp2p-core/peerstore.OwnObservedAddrTTL instead. + OwnObservedAddrTTL = core.OwnObservedAddrTTL ) -// Permanent TTLs (distinct so we can distinguish between them, constant as they -// are, in fact, permanent) const ( + // Deprecated: use github.com/libp2p/go-libp2p-core/peerstore.PermanentAddrTTL instead. + PermanentAddrTTL = core.PermanentAddrTTL - // PermanentAddrTTL is the ttl for a "permanent address" (e.g. bootstrap nodes). - PermanentAddrTTL = math.MaxInt64 - iota - - // ConnectedAddrTTL is the ttl used for the addresses of a peer to whom - // we're connected directly. This is basically permanent, as we will - // clear them + re-add under a TempAddrTTL after disconnecting. - ConnectedAddrTTL + // Deprecated: use github.com/libp2p/go-libp2p-core/peerstore.ConnectedAddrTTL instead. + ConnectedAddrTTL = core.ConnectedAddrTTL ) -// Peerstore provides a threadsafe store of Peer related -// information. -type Peerstore interface { - io.Closer - - AddrBook - KeyBook - PeerMetadata - Metrics - - // PeerInfo returns a peer.PeerInfo struct for given peer.ID. - // This is a small slice of the information Peerstore has on - // that peer, useful to other services. - PeerInfo(peer.ID) PeerInfo - - GetProtocols(peer.ID) ([]string, error) - AddProtocols(peer.ID, ...string) error - SetProtocols(peer.ID, ...string) error - SupportsProtocols(peer.ID, ...string) ([]string, error) - - // Peers returns all of the peer IDs stored across all inner stores. - Peers() peer.IDSlice -} - -// PeerMetadata can handle values of any type. Serializing values is -// up to the implementation. Dynamic type introspection may not be -// supported, in which case explicitly enlisting types in the -// serializer may be required. -// -// Refer to the docs of the underlying implementation for more -// information. -type PeerMetadata interface { - // Get/Put is a simple registry for other peer-related key/value pairs. - // if we find something we use often, it should become its own set of - // methods. this is a last resort. - Get(p peer.ID, key string) (interface{}, error) - Put(p peer.ID, key string, val interface{}) error -} - -// AddrBook holds the multiaddrs of peers. -type AddrBook interface { - - // AddAddr calls AddAddrs(p, []ma.Multiaddr{addr}, ttl) - AddAddr(p peer.ID, addr ma.Multiaddr, ttl time.Duration) - - // AddAddrs gives this AddrBook addresses to use, with a given ttl - // (time-to-live), after which the address is no longer valid. - // If the manager has a longer TTL, the operation is a no-op for that address - AddAddrs(p peer.ID, addrs []ma.Multiaddr, ttl time.Duration) - - // SetAddr calls mgr.SetAddrs(p, addr, ttl) - SetAddr(p peer.ID, addr ma.Multiaddr, ttl time.Duration) - - // SetAddrs sets the ttl on addresses. This clears any TTL there previously. - // This is used when we receive the best estimate of the validity of an address. - SetAddrs(p peer.ID, addrs []ma.Multiaddr, ttl time.Duration) - - // UpdateAddrs updates the addresses associated with the given peer that have - // the given oldTTL to have the given newTTL. - UpdateAddrs(p peer.ID, oldTTL time.Duration, newTTL time.Duration) - - // Addresses returns all known (and valid) addresses for a given peer - Addrs(p peer.ID) []ma.Multiaddr - - // AddrStream returns a channel that gets all addresses for a given - // peer sent on it. If new addresses are added after the call is made - // they will be sent along through the channel as well. - AddrStream(context.Context, peer.ID) <-chan ma.Multiaddr - - // ClearAddresses removes all previously stored addresses - ClearAddrs(p peer.ID) - - // PeersWithAddrs returns all of the peer IDs stored in the AddrBook - PeersWithAddrs() peer.IDSlice -} - -// KeyBook tracks the keys of Peers. -type KeyBook interface { - // PubKey stores the public key of a peer. - PubKey(peer.ID) ic.PubKey +// Deprecated: use github.com/libp2p/go-libp2p-core/peerstore.Peerstore instead. +type Peerstore = core.Peerstore - // AddPubKey stores the public key of a peer. - AddPubKey(peer.ID, ic.PubKey) error +// Deprecated: use github.com/libp2p/go-libp2p-core/peerstore.PeerMetadata instead. +type PeerMetadata = core.PeerMetadata - // PrivKey returns the private key of a peer, if known. Generally this might only be our own - // private key, see - // https://discuss.libp2p.io/t/what-is-the-purpose-of-having-map-peer-id-privatekey-in-peerstore/74. - PrivKey(peer.ID) ic.PrivKey +// Deprecated: use github.com/libp2p/go-libp2p-core/peerstore.AddrBook instead. +type AddrBook = core.AddrBook - // AddPrivKey stores the private key of a peer. - AddPrivKey(peer.ID, ic.PrivKey) error +// Deprecated: use github.com/libp2p/go-libp2p-core/peerstore.KeyBook instead. +type KeyBook = core.KeyBook - // PeersWithKeys returns all the peer IDs stored in the KeyBook - PeersWithKeys() peer.IDSlice -} +// Deprecated: use github.com/libp2p/go-libp2p-core/peerstore.ProtoBook instead. +type ProtoBook = core.ProtoBook diff --git a/vendor/github.com/libp2p/go-libp2p-peerstore/metrics.go b/vendor/github.com/libp2p/go-libp2p-peerstore/metrics.go index 05b86769..f6d0ccb5 100644 --- a/vendor/github.com/libp2p/go-libp2p-peerstore/metrics.go +++ b/vendor/github.com/libp2p/go-libp2p-peerstore/metrics.go @@ -4,6 +4,7 @@ import ( "sync" "time" + moved "github.com/libp2p/go-libp2p-core/peerstore" "github.com/libp2p/go-libp2p-peer" ) @@ -12,17 +13,8 @@ import ( // 1 is 100% change, 0 is no change. var LatencyEWMASmoothing = 0.1 -// Metrics is just an object that tracks metrics -// across a set of peers. -type Metrics interface { - - // RecordLatency records a new latency measurement - RecordLatency(peer.ID, time.Duration) - - // LatencyEWMA returns an exponentially-weighted moving avg. - // of all measurements of a peer's latency. - LatencyEWMA(peer.ID) time.Duration -} +// Deprecated: use github.com/libp2p/go-libp2p-core/peerstore.Metrics instead. +type Metrics = moved.Metrics type metrics struct { latmap map[peer.ID]time.Duration diff --git a/vendor/github.com/libp2p/go-libp2p-peerstore/peerinfo.go b/vendor/github.com/libp2p/go-libp2p-peerstore/peerinfo.go index 6adaa203..24c8c31f 100644 --- a/vendor/github.com/libp2p/go-libp2p-peerstore/peerinfo.go +++ b/vendor/github.com/libp2p/go-libp2p-peerstore/peerinfo.go @@ -1,115 +1,22 @@ package peerstore import ( - "encoding/json" - "fmt" - "strings" - - peer "github.com/libp2p/go-libp2p-peer" + core "github.com/libp2p/go-libp2p-core/peer" ma "github.com/multiformats/go-multiaddr" ) -// PeerInfo is a small struct used to pass around a peer with -// a set of addresses (and later, keys?). This is not meant to be -// a complete view of the system, but rather to model updates to -// the peerstore. It is used by things like the routing system. -type PeerInfo struct { - ID peer.ID - Addrs []ma.Multiaddr -} - -var _ fmt.Stringer = PeerInfo{} - -func (pi PeerInfo) String() string { - return fmt.Sprintf("{%v: %v}", pi.ID, pi.Addrs) -} - -var ErrInvalidAddr = fmt.Errorf("invalid p2p multiaddr") - -func InfoFromP2pAddr(m ma.Multiaddr) (*PeerInfo, error) { - if m == nil { - return nil, ErrInvalidAddr - } - - // make sure it's an IPFS addr - parts := ma.Split(m) - if len(parts) < 1 { - return nil, ErrInvalidAddr - } +// Deprecated: use github.com/libp2p/go-libp2p-core/peer.Info instead. +type PeerInfo = core.AddrInfo - // TODO(lgierth): we shouldn't assume /ipfs is the last part - ipfspart := parts[len(parts)-1] - if ipfspart.Protocols()[0].Code != ma.P_IPFS { - return nil, ErrInvalidAddr - } - - // make sure the /ipfs value parses as a peer.ID - peerIdParts := strings.Split(ipfspart.String(), "/") - peerIdStr := peerIdParts[len(peerIdParts)-1] - id, err := peer.IDB58Decode(peerIdStr) - if err != nil { - return nil, err - } - - // we might have received just an /ipfs part, which means there's no addr. - var addrs []ma.Multiaddr - if len(parts) > 1 { - addrs = append(addrs, ma.Join(parts[:len(parts)-1]...)) - } - - return &PeerInfo{ - ID: id, - Addrs: addrs, - }, nil -} - -func InfoToP2pAddrs(pi *PeerInfo) ([]ma.Multiaddr, error) { - var addrs []ma.Multiaddr - tpl := "/" + ma.ProtocolWithCode(ma.P_IPFS).Name + "/" - for _, addr := range pi.Addrs { - p2paddr, err := ma.NewMultiaddr(tpl + peer.IDB58Encode(pi.ID)) - if err != nil { - return nil, err - } - addrs = append(addrs, addr.Encapsulate(p2paddr)) - } - return addrs, nil -} - -func (pi *PeerInfo) Loggable() map[string]interface{} { - return map[string]interface{}{ - "peerID": pi.ID.Pretty(), - "addrs": pi.Addrs, - } -} +// Deprecated: use github.com/libp2p/go-libp2p-core/peer.ErrInvalidAddr instead. +var ErrInvalidAddr = core.ErrInvalidAddr -func (pi PeerInfo) MarshalJSON() ([]byte, error) { - out := make(map[string]interface{}) - out["ID"] = pi.ID.Pretty() - var addrs []string - for _, a := range pi.Addrs { - addrs = append(addrs, a.String()) - } - out["Addrs"] = addrs - return json.Marshal(out) +// Deprecated: use github.com/libp2p/go-libp2p-core/peer.AddrInfoFromP2pAddr instead. +func InfoFromP2pAddr(m ma.Multiaddr) (*core.AddrInfo, error) { + return core.AddrInfoFromP2pAddr(m) } -func (pi *PeerInfo) UnmarshalJSON(b []byte) error { - var data map[string]interface{} - err := json.Unmarshal(b, &data) - if err != nil { - return err - } - pid, err := peer.IDB58Decode(data["ID"].(string)) - if err != nil { - return err - } - pi.ID = pid - addrs, ok := data["Addrs"].([]interface{}) - if ok { - for _, a := range addrs { - pi.Addrs = append(pi.Addrs, ma.StringCast(a.(string))) - } - } - return nil +// Deprecated: use github.com/libp2p/go-libp2p-core/peer.AddrInfoToP2pAddrs instead. +func InfoToP2pAddrs(pi *core.AddrInfo) ([]ma.Multiaddr, error) { + return core.AddrInfoToP2pAddrs(pi) } diff --git a/vendor/github.com/libp2p/go-libp2p-peerstore/peerstore.go b/vendor/github.com/libp2p/go-libp2p-peerstore/peerstore.go index 306127e3..ea29a17f 100644 --- a/vendor/github.com/libp2p/go-libp2p-peerstore/peerstore.go +++ b/vendor/github.com/libp2p/go-libp2p-peerstore/peerstore.go @@ -3,37 +3,30 @@ package peerstore import ( "fmt" "io" - "sync" peer "github.com/libp2p/go-libp2p-peer" ) var _ Peerstore = (*peerstore)(nil) -const maxInternedProtocols = 512 -const maxInternedProtocolSize = 256 - type peerstore struct { Metrics KeyBook AddrBook + ProtoBook PeerMetadata - - // lock for protocol information, separate from datastore lock - protolock sync.Mutex - internedProtocols map[string]string } // NewPeerstore creates a data structure that stores peer data, backed by the // supplied implementations of KeyBook, AddrBook and PeerMetadata. -func NewPeerstore(kb KeyBook, ab AddrBook, md PeerMetadata) Peerstore { +func NewPeerstore(kb KeyBook, ab AddrBook, pb ProtoBook, md PeerMetadata) Peerstore { return &peerstore{ - KeyBook: kb, - AddrBook: ab, - PeerMetadata: md, - Metrics: NewMetrics(), - internedProtocols: make(map[string]string), + KeyBook: kb, + AddrBook: ab, + ProtoBook: pb, + PeerMetadata: md, + Metrics: NewMetrics(), } } @@ -49,6 +42,7 @@ func (ps *peerstore) Close() (err error) { weakClose("keybook", ps.KeyBook) weakClose("addressbook", ps.AddrBook) + weakClose("protobook", ps.ProtoBook) weakClose("peermetadata", ps.PeerMetadata) if len(errs) > 0 { @@ -80,101 +74,6 @@ func (ps *peerstore) PeerInfo(p peer.ID) PeerInfo { } } -func (ps *peerstore) internProtocol(s string) string { - if len(s) > maxInternedProtocolSize { - return s - } - - if interned, ok := ps.internedProtocols[s]; ok { - return interned - } - - if len(ps.internedProtocols) >= maxInternedProtocols { - ps.internedProtocols = make(map[string]string, maxInternedProtocols) - } - - ps.internedProtocols[s] = s - return s -} - -func (ps *peerstore) SetProtocols(p peer.ID, protos ...string) error { - ps.protolock.Lock() - defer ps.protolock.Unlock() - - protomap := make(map[string]struct{}, len(protos)) - for _, proto := range protos { - protomap[ps.internProtocol(proto)] = struct{}{} - } - - return ps.Put(p, "protocols", protomap) -} - -func (ps *peerstore) AddProtocols(p peer.ID, protos ...string) error { - ps.protolock.Lock() - defer ps.protolock.Unlock() - protomap, err := ps.getProtocolMap(p) - if err != nil { - return err - } - - for _, proto := range protos { - protomap[ps.internProtocol(proto)] = struct{}{} - } - - return ps.Put(p, "protocols", protomap) -} - -func (ps *peerstore) getProtocolMap(p peer.ID) (map[string]struct{}, error) { - iprotomap, err := ps.Get(p, "protocols") - switch err { - default: - return nil, err - case ErrNotFound: - return make(map[string]struct{}), nil - case nil: - cast, ok := iprotomap.(map[string]struct{}) - if !ok { - return nil, fmt.Errorf("stored protocol set was not a map") - } - - return cast, nil - } -} - -func (ps *peerstore) GetProtocols(p peer.ID) ([]string, error) { - ps.protolock.Lock() - defer ps.protolock.Unlock() - pmap, err := ps.getProtocolMap(p) - if err != nil { - return nil, err - } - - out := make([]string, 0, len(pmap)) - for k := range pmap { - out = append(out, k) - } - - return out, nil -} - -func (ps *peerstore) SupportsProtocols(p peer.ID, protos ...string) ([]string, error) { - ps.protolock.Lock() - defer ps.protolock.Unlock() - pmap, err := ps.getProtocolMap(p) - if err != nil { - return nil, err - } - - out := make([]string, 0, len(protos)) - for _, proto := range protos { - if _, ok := pmap[proto]; ok { - out = append(out, proto) - } - } - - return out, nil -} - func PeerInfos(ps Peerstore, peers peer.IDSlice) []PeerInfo { pi := make([]PeerInfo, len(peers)) for i, p := range peers { diff --git a/vendor/github.com/libp2p/go-libp2p-peerstore/pstoremem/addr_book.go b/vendor/github.com/libp2p/go-libp2p-peerstore/pstoremem/addr_book.go index 723b4337..a497821d 100644 --- a/vendor/github.com/libp2p/go-libp2p-peerstore/pstoremem/addr_book.go +++ b/vendor/github.com/libp2p/go-libp2p-peerstore/pstoremem/addr_book.go @@ -26,54 +26,101 @@ func (e *expiringAddr) ExpiredBy(t time.Time) bool { return t.After(e.Expires) } -var _ pstore.AddrBook = (*memoryAddrBook)(nil) +type addrSegments [256]*addrSegment + +type addrSegment struct { + sync.RWMutex -// memoryAddrBook manages addresses. -type memoryAddrBook struct { - addrmu sync.Mutex // Use pointers to save memory. Maps always leave some fraction of their // space unused. storing the *values* directly in the map will // drastically increase the space waste. In our case, by 6x. addrs map[peer.ID]map[string]*expiringAddr +} - nextGC time.Time +func (s *addrSegments) get(p peer.ID) *addrSegment { + return s[byte(p[len(p)-1])] +} + +// memoryAddrBook manages addresses. +type memoryAddrBook struct { + segments addrSegments + + ctx context.Context + cancel func() subManager *AddrSubManager } +var _ pstore.AddrBook = (*memoryAddrBook)(nil) + func NewAddrBook() pstore.AddrBook { - return &memoryAddrBook{ - addrs: make(map[peer.ID]map[string]*expiringAddr), + ctx, cancel := context.WithCancel(context.Background()) + + ab := &memoryAddrBook{ + segments: func() (ret addrSegments) { + for i, _ := range ret { + ret[i] = &addrSegment{addrs: make(map[peer.ID]map[string]*expiringAddr)} + } + return ret + }(), subManager: NewAddrSubManager(), + ctx: ctx, + cancel: cancel, } + + go ab.background() + return ab } -// gc garbage collects the in-memory address book. The caller *must* hold the addrmu lock. +// background periodically schedules a gc +func (mab *memoryAddrBook) background() { + ticker := time.NewTicker(1 * time.Hour) + defer ticker.Stop() + + for { + select { + case <-ticker.C: + mab.gc() + + case <-mab.ctx.Done(): + return + } + } +} + +func (mab *memoryAddrBook) Close() error { + mab.cancel() + return nil +} + +// gc garbage collects the in-memory address book. func (mab *memoryAddrBook) gc() { now := time.Now() - if !now.After(mab.nextGC) { - return - } - for p, amap := range mab.addrs { - for k, addr := range amap { - if addr.ExpiredBy(now) { - delete(amap, k) + for _, s := range mab.segments { + s.Lock() + for p, amap := range s.addrs { + for k, addr := range amap { + if addr.ExpiredBy(now) { + delete(amap, k) + } + } + if len(amap) == 0 { + delete(s.addrs, p) } } - if len(amap) == 0 { - delete(mab.addrs, p) - } + s.Unlock() } - mab.nextGC = time.Now().Add(pstore.AddressTTL) + } func (mab *memoryAddrBook) PeersWithAddrs() peer.IDSlice { - mab.addrmu.Lock() - defer mab.addrmu.Unlock() - - pids := make(peer.IDSlice, 0, len(mab.addrs)) - for pid := range mab.addrs { - pids = append(pids, pid) + var pids peer.IDSlice + for _, s := range mab.segments { + s.RLock() + for pid, _ := range s.addrs { + pids = append(pids, pid) + } + s.RUnlock() } return pids } @@ -87,18 +134,19 @@ func (mab *memoryAddrBook) AddAddr(p peer.ID, addr ma.Multiaddr, ttl time.Durati // (time-to-live), after which the address is no longer valid. // If the manager has a longer TTL, the operation is a no-op for that address func (mab *memoryAddrBook) AddAddrs(p peer.ID, addrs []ma.Multiaddr, ttl time.Duration) { - mab.addrmu.Lock() - defer mab.addrmu.Unlock() - // if ttl is zero, exit. nothing to do. if ttl <= 0 { return } - amap := mab.addrs[p] + s := mab.segments.get(p) + s.Lock() + defer s.Unlock() + + amap := s.addrs[p] if amap == nil { amap = make(map[string]*expiringAddr, len(addrs)) - mab.addrs[p] = amap + s.addrs[p] = amap } exp := time.Now().Add(ttl) for _, addr := range addrs { @@ -114,7 +162,6 @@ func (mab *memoryAddrBook) AddAddrs(p peer.ID, addrs []ma.Multiaddr, ttl time.Du mab.subManager.BroadcastAddr(p, addr) } } - mab.gc() } // SetAddr calls mgr.SetAddrs(p, addr, ttl) @@ -125,13 +172,14 @@ func (mab *memoryAddrBook) SetAddr(p peer.ID, addr ma.Multiaddr, ttl time.Durati // SetAddrs sets the ttl on addresses. This clears any TTL there previously. // This is used when we receive the best estimate of the validity of an address. func (mab *memoryAddrBook) SetAddrs(p peer.ID, addrs []ma.Multiaddr, ttl time.Duration) { - mab.addrmu.Lock() - defer mab.addrmu.Unlock() + s := mab.segments.get(p) + s.Lock() + defer s.Unlock() - amap := mab.addrs[p] + amap := s.addrs[p] if amap == nil { amap = make(map[string]*expiringAddr, len(addrs)) - mab.addrs[p] = amap + s.addrs[p] = amap } exp := time.Now().Add(ttl) @@ -145,22 +193,21 @@ func (mab *memoryAddrBook) SetAddrs(p peer.ID, addrs []ma.Multiaddr, ttl time.Du if ttl > 0 { amap[addrstr] = &expiringAddr{Addr: addr, Expires: exp, TTL: ttl} - mab.subManager.BroadcastAddr(p, addr) } else { delete(amap, addrstr) } } - mab.gc() } // UpdateAddrs updates the addresses associated with the given peer that have // the given oldTTL to have the given newTTL. func (mab *memoryAddrBook) UpdateAddrs(p peer.ID, oldTTL time.Duration, newTTL time.Duration) { - mab.addrmu.Lock() - defer mab.addrmu.Unlock() + s := mab.segments.get(p) + s.Lock() + defer s.Unlock() - amap, found := mab.addrs[p] + amap, found := s.addrs[p] if !found { return } @@ -173,26 +220,24 @@ func (mab *memoryAddrBook) UpdateAddrs(p peer.ID, oldTTL time.Duration, newTTL t amap[k] = addr } } - mab.gc() } // Addresses returns all known (and valid) addresses for a given func (mab *memoryAddrBook) Addrs(p peer.ID) []ma.Multiaddr { - mab.addrmu.Lock() - defer mab.addrmu.Unlock() + s := mab.segments.get(p) + s.RLock() + defer s.RUnlock() - amap, found := mab.addrs[p] + amap, found := s.addrs[p] if !found { return nil } now := time.Now() good := make([]ma.Multiaddr, 0, len(amap)) - for k, m := range amap { + for _, m := range amap { if !m.ExpiredBy(now) { good = append(good, m.Addr) - } else { - delete(amap, k) } } @@ -201,19 +246,21 @@ func (mab *memoryAddrBook) Addrs(p peer.ID) []ma.Multiaddr { // ClearAddrs removes all previously stored addresses func (mab *memoryAddrBook) ClearAddrs(p peer.ID) { - mab.addrmu.Lock() - defer mab.addrmu.Unlock() + s := mab.segments.get(p) + s.Lock() + defer s.Unlock() - delete(mab.addrs, p) + delete(s.addrs, p) } // AddrStream returns a channel on which all new addresses discovered for a // given peer ID will be published. func (mab *memoryAddrBook) AddrStream(ctx context.Context, p peer.ID) <-chan ma.Multiaddr { - mab.addrmu.Lock() - defer mab.addrmu.Unlock() + s := mab.segments.get(p) + s.RLock() + defer s.RUnlock() - baseaddrslice := mab.addrs[p] + baseaddrslice := s.addrs[p] initial := make([]ma.Multiaddr, 0, len(baseaddrslice)) for _, a := range baseaddrslice { initial = append(initial, a.Addr) diff --git a/vendor/github.com/libp2p/go-libp2p-peerstore/pstoremem/metadata.go b/vendor/github.com/libp2p/go-libp2p-peerstore/pstoremem/metadata.go index 5562c9cf..162bee50 100644 --- a/vendor/github.com/libp2p/go-libp2p-peerstore/pstoremem/metadata.go +++ b/vendor/github.com/libp2p/go-libp2p-peerstore/pstoremem/metadata.go @@ -16,7 +16,7 @@ type memoryPeerMetadata struct { // store other data, like versions //ds ds.ThreadSafeDatastore ds map[metakey]interface{} - dslock sync.Mutex + dslock sync.RWMutex } var _ pstore.PeerMetadata = (*memoryPeerMetadata)(nil) @@ -35,8 +35,8 @@ func (ps *memoryPeerMetadata) Put(p peer.ID, key string, val interface{}) error } func (ps *memoryPeerMetadata) Get(p peer.ID, key string) (interface{}, error) { - ps.dslock.Lock() - defer ps.dslock.Unlock() + ps.dslock.RLock() + defer ps.dslock.RUnlock() i, ok := ps.ds[metakey{p, key}] if !ok { return nil, pstore.ErrNotFound diff --git a/vendor/github.com/libp2p/go-libp2p-peerstore/pstoremem/peerstore.go b/vendor/github.com/libp2p/go-libp2p-peerstore/pstoremem/peerstore.go index 7d87313d..c7cbd672 100644 --- a/vendor/github.com/libp2p/go-libp2p-peerstore/pstoremem/peerstore.go +++ b/vendor/github.com/libp2p/go-libp2p-peerstore/pstoremem/peerstore.go @@ -7,5 +7,6 @@ func NewPeerstore() pstore.Peerstore { return pstore.NewPeerstore( NewKeyBook(), NewAddrBook(), + NewProtoBook(), NewPeerMetadata()) } diff --git a/vendor/github.com/libp2p/go-libp2p-peerstore/pstoremem/protobook.go b/vendor/github.com/libp2p/go-libp2p-peerstore/pstoremem/protobook.go new file mode 100644 index 00000000..04cd1459 --- /dev/null +++ b/vendor/github.com/libp2p/go-libp2p-peerstore/pstoremem/protobook.go @@ -0,0 +1,142 @@ +package pstoremem + +import ( + "sync" + + peer "github.com/libp2p/go-libp2p-peer" + + pstore "github.com/libp2p/go-libp2p-peerstore" +) + +const ( + maxInternedProtocols = 512 + maxInternedProtocolSize = 256 +) + +type protoSegment struct { + sync.RWMutex + protocols map[peer.ID]map[string]struct{} +} + +type protoSegments [256]*protoSegment + +func (s *protoSegments) get(p peer.ID) *protoSegment { + return s[byte(p[len(p)-1])] +} + +type memoryProtoBook struct { + segments protoSegments + + lk sync.RWMutex + interned map[string]string +} + +var _ pstore.ProtoBook = (*memoryProtoBook)(nil) + +func NewProtoBook() pstore.ProtoBook { + return &memoryProtoBook{ + interned: make(map[string]string, maxInternedProtocols), + segments: func() (ret protoSegments) { + for i := range ret { + ret[i] = &protoSegment{ + protocols: make(map[peer.ID]map[string]struct{}), + } + } + return ret + }(), + } +} + +func (pb *memoryProtoBook) internProtocol(proto string) string { + if len(proto) > maxInternedProtocolSize { + return proto + } + + // check if it is interned with the read lock + pb.lk.RLock() + interned, ok := pb.interned[proto] + pb.lk.RUnlock() + + if ok { + return interned + } + + // intern with the write lock + pb.lk.Lock() + defer pb.lk.Unlock() + + // check again in case it got interned in between locks + interned, ok = pb.interned[proto] + if ok { + return interned + } + + // if we've filled the table, throw it away and start over + if len(pb.interned) >= maxInternedProtocols { + pb.interned = make(map[string]string, maxInternedProtocols) + } + + pb.interned[proto] = proto + return proto +} + +func (pb *memoryProtoBook) SetProtocols(p peer.ID, protos ...string) error { + s := pb.segments.get(p) + s.Lock() + defer s.Unlock() + + newprotos := make(map[string]struct{}, len(protos)) + for _, proto := range protos { + newprotos[pb.internProtocol(proto)] = struct{}{} + } + + s.protocols[p] = newprotos + + return nil +} + +func (pb *memoryProtoBook) AddProtocols(p peer.ID, protos ...string) error { + s := pb.segments.get(p) + s.Lock() + defer s.Unlock() + + protomap, ok := s.protocols[p] + if !ok { + protomap = make(map[string]struct{}) + s.protocols[p] = protomap + } + + for _, proto := range protos { + protomap[pb.internProtocol(proto)] = struct{}{} + } + + return nil +} + +func (pb *memoryProtoBook) GetProtocols(p peer.ID) ([]string, error) { + s := pb.segments.get(p) + s.RLock() + defer s.RUnlock() + + out := make([]string, 0, len(s.protocols)) + for k := range s.protocols[p] { + out = append(out, k) + } + + return out, nil +} + +func (pb *memoryProtoBook) SupportsProtocols(p peer.ID, protos ...string) ([]string, error) { + s := pb.segments.get(p) + s.RLock() + defer s.RUnlock() + + out := make([]string, 0, len(protos)) + for _, proto := range protos { + if _, ok := s.protocols[p][proto]; ok { + out = append(out, proto) + } + } + + return out, nil +} diff --git a/vendor/github.com/libp2p/go-libp2p-pnet/.travis.yml b/vendor/github.com/libp2p/go-libp2p-pnet/.travis.yml index dde69d1a..5163d693 100644 --- a/vendor/github.com/libp2p/go-libp2p-pnet/.travis.yml +++ b/vendor/github.com/libp2p/go-libp2p-pnet/.travis.yml @@ -10,7 +10,6 @@ env: global: - GOTFLAGS="-race" matrix: - - BUILD_DEPTYPE=gx - BUILD_DEPTYPE=gomod @@ -24,9 +23,8 @@ script: cache: directories: - - /Users/raul/go/src/gx - - /Users/raul/go/pkg/mod - - /Users/raul/.cache/go-build + - $GOPATH/pkg/mod + - $HOME/.cache/go-build notifications: email: false diff --git a/vendor/github.com/libp2p/go-libp2p-pnet/Makefile b/vendor/github.com/libp2p/go-libp2p-pnet/Makefile deleted file mode 100644 index 68ddbaec..00000000 --- a/vendor/github.com/libp2p/go-libp2p-pnet/Makefile +++ /dev/null @@ -1,8 +0,0 @@ -gx: - go get github.com/whyrusleeping/gx - go get github.com/whyrusleeping/gx-go - -deps: gx - gx install --global - gx-go rewrite - diff --git a/vendor/github.com/libp2p/go-libp2p-pnet/README.md b/vendor/github.com/libp2p/go-libp2p-pnet/README.md index 84574469..77ea2881 100644 --- a/vendor/github.com/libp2p/go-libp2p-pnet/README.md +++ b/vendor/github.com/libp2p/go-libp2p-pnet/README.md @@ -1,11 +1,12 @@ go-libp2p-pnet ================== -[![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](http://ipn.io) -[![](https://img.shields.io/badge/project-IPFS-blue.svg?style=flat-square)](http://libp2p.io/) -[![](https://img.shields.io/badge/freenode-%23ipfs-blue.svg?style=flat-square)](http://webchat.freenode.net/?channels=%23ipfs) +[![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](https://protocol.ai) +[![](https://img.shields.io/badge/project-libp2p-yellow.svg?style=flat-square)](https://libp2p.io/) +[![](https://img.shields.io/badge/freenode-%23libp2p-yellow.svg?style=flat-square)](http://webchat.freenode.net/?channels=%23libp2p) [![Travis CI](https://img.shields.io/travis/libp2p/go-libp2p-pnet.svg?style=flat-square&branch=master)](https://travis-ci.org/libp2p/go-libp2p-pnet) [![codecov.io](https://img.shields.io/codecov/c/github/libp2p/go-libp2p-pnet.svg?style=flat-square&branch=master)](https://codecov.io/github/libp2p/go-libp2p-pnet?branch=master) +[![Discourse posts](https://img.shields.io/discourse/https/discuss.libp2p.io/posts.svg)](https://discuss.libp2p.io) > An implementation of go-libp2p-interface-pnet @@ -29,3 +30,7 @@ Small note: If editing the Readme, please conform to the [standard-readme](https ## License MIT © Jakub Sztandera + +--- + +The last gx published version of this module was: 3.0.5: QmTwDsJUPioMKoiuXkAmiPxL1i4tjuG5vkxJgNpiHpXb3Y diff --git a/vendor/github.com/libp2p/go-libp2p-pnet/codec.go b/vendor/github.com/libp2p/go-libp2p-pnet/codec.go index ac698283..19b929f6 100644 --- a/vendor/github.com/libp2p/go-libp2p-pnet/codec.go +++ b/vendor/github.com/libp2p/go-libp2p-pnet/codec.go @@ -1,35 +1,66 @@ package pnet import ( + "bufio" + "bytes" + "encoding/base64" + "encoding/hex" "fmt" "io" - - mc "github.com/multiformats/go-multicodec" - bmux "github.com/multiformats/go-multicodec/base/mux" ) var ( - pathPSKv1 = []byte("/key/swarm/psk/1.0.0/") - headerPSKv1 = mc.Header(pathPSKv1) + pathPSKv1 = []byte("/key/swarm/psk/1.0.0/") + pathBin = "/bin/" + pathBase16 = "/base16/" + pathBase64 = "/base64/" ) -func decodeV1PSK(in io.Reader) (*[32]byte, error) { - var err error - in, err = mc.WrapTransformPathToHeader(in) +func readHeader(r *bufio.Reader) ([]byte, error) { + header, err := r.ReadBytes('\n') if err != nil { return nil, err } - err = mc.ConsumeHeader(in, headerPSKv1) + + return bytes.TrimRight(header, "\r\n"), nil +} + +func expectHeader(r *bufio.Reader, expected []byte) error { + header, err := readHeader(r) if err != nil { - return nil, fmt.Errorf("psk header error: %s", err.Error()) + return err + } + if !bytes.Equal(header, expected) { + return fmt.Errorf("expected file header %s, got: %s", pathPSKv1, header) } + return nil +} - in, err = mc.WrapTransformPathToHeader(in) +func decodeV1PSK(in io.Reader) (*[32]byte, error) { + reader := bufio.NewReader(in) + if err := expectHeader(reader, pathPSKv1); err != nil { + return nil, err + } + header, err := readHeader(reader) if err != nil { - return nil, fmt.Errorf("wrapping error: %s", err.Error()) + return nil, err } - out := [32]byte{} - err = bmux.AllBasesMux().Decoder(in).Decode(out[:]) - return &out, err + var decoder io.Reader + switch string(header) { + case pathBase16: + decoder = hex.NewDecoder(reader) + case pathBase64: + decoder = base64.NewDecoder(base64.StdEncoding, reader) + case pathBin: + decoder = reader + default: + return nil, fmt.Errorf("unknown encoding: %s", header) + } + out := new([32]byte) + _, err = io.ReadFull(decoder, out[:]) + if err != nil { + return nil, err + } + return out, nil } diff --git a/vendor/github.com/libp2p/go-libp2p-pnet/go.mod b/vendor/github.com/libp2p/go-libp2p-pnet/go.mod index 1b4bf11e..6cd9a515 100644 --- a/vendor/github.com/libp2p/go-libp2p-pnet/go.mod +++ b/vendor/github.com/libp2p/go-libp2p-pnet/go.mod @@ -2,10 +2,7 @@ module github.com/libp2p/go-libp2p-pnet require ( github.com/davidlazar/go-crypto v0.0.0-20170701192655-dcfb0a7ac018 - github.com/libp2p/go-buffer-pool v0.0.1 - github.com/libp2p/go-libp2p-interface-pnet v0.0.1 - github.com/libp2p/go-msgio v0.0.1 // indirect - github.com/multiformats/go-multicodec v0.1.6 - github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11 // indirect - golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25 + github.com/libp2p/go-buffer-pool v0.0.2 + github.com/libp2p/go-libp2p-core v0.0.1 + golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f ) diff --git a/vendor/github.com/libp2p/go-libp2p-pnet/go.sum b/vendor/github.com/libp2p/go-libp2p-pnet/go.sum index d0cae833..281a6348 100644 --- a/vendor/github.com/libp2p/go-libp2p-pnet/go.sum +++ b/vendor/github.com/libp2p/go-libp2p-pnet/go.sum @@ -1,16 +1,64 @@ +github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= +github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32/go.mod h1:DrZx5ec/dmnfpw9KyYoQyYo7d0KEvTkk/5M/vbZjAr8= +github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= +github.com/btcsuite/btcutil v0.0.0-20190207003914-4c204d697803/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= +github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= +github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= +github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= +github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= +github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davidlazar/go-crypto v0.0.0-20170701192655-dcfb0a7ac018 h1:6xT9KW8zLC5IlbaIF5Q7JNieBoACT7iW0YTxQHR0in0= github.com/davidlazar/go-crypto v0.0.0-20170701192655-dcfb0a7ac018/go.mod h1:rQYf4tfk5sSwFsnDg3qYaBxSjsD9S8+59vW0dKUgme4= -github.com/libp2p/go-buffer-pool v0.0.1 h1:9Rrn/H46cXjaA2HQ5Y8lyhOS1NhTkZ4yuEs2r3Eechg= -github.com/libp2p/go-buffer-pool v0.0.1/go.mod h1:xtyIz9PMobb13WaxR6Zo1Pd1zXJKYg0a8KiIvDp3TzQ= -github.com/libp2p/go-libp2p-interface-pnet v0.0.1 h1:7GnzRrBTJHEsofi1ahFdPN9Si6skwXQE9UqR2S+Pkh8= -github.com/libp2p/go-libp2p-interface-pnet v0.0.1/go.mod h1:el9jHpQAXK5dnTpKA4yfCNBZXvrzdOU75zz+C6ryp3k= -github.com/libp2p/go-msgio v0.0.1 h1:znj97n5FtXGCLDwe9x8jpHmY770SW4WStBGcCDh6GJw= -github.com/libp2p/go-msgio v0.0.1/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= -github.com/multiformats/go-multicodec v0.1.6 h1:4u6lcjbE4VVVoigU4QJSSVYsGVP4j2jtDkR8lPwOrLE= -github.com/multiformats/go-multicodec v0.1.6/go.mod h1:lliaRHbcG8q33yf4Ot9BGD7JqR/Za9HE7HTyVyKwrUQ= -github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11 h1:5HZfQkwe0mIfyDmc1Em5GqlNRzcdtlv4HTNmdpt7XH0= -github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11/go.mod h1:Wlo/SzPmxVp6vXpGt/zaXhHH0fn4IxgqZc82aKg6bpQ= -golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25 h1:jsG6UpNLt9iAsb0S2AGW28DveNzzgmbXR+ENoPjUeIU= -golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv3hCI0z56oJR5vAMgBU= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfmKFJ6tItnhQ67kU= +github.com/gxed/hashland/murmur3 v0.0.1/go.mod h1:KjXop02n4/ckmZSnY2+HKcLud/tcmvhST0bie/0lS48= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= +github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8/go.mod h1:Ly/wlsjFq/qrU3Rar62tu1gASgGw6chQbSh/XgIIXCY= +github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= +github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= +github.com/libp2p/go-buffer-pool v0.0.2 h1:QNK2iAFa8gjAe1SPz6mHSMuCcjs+X1wlHzeOSqcmlfs= +github.com/libp2p/go-buffer-pool v0.0.2/go.mod h1:MvaB6xw5vOrDl8rYZGLFdKAuk/hRoRZd1Vi32+RXyFM= +github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZxBdp967ls1g+k8= +github.com/libp2p/go-libp2p-core v0.0.1 h1:HSTZtFIq/W5Ue43Zw+uWZyy2Vl5WtF0zDjKN8/DT/1I= +github.com/libp2p/go-libp2p-core v0.0.1/go.mod h1:g/VxnTZ/1ygHxH3dKok7Vno1VfpvGcGip57wjTU4fco= +github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= +github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= +github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= +github.com/mr-tron/base58 v1.1.1/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= +github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= +github.com/multiformats/go-multiaddr v0.0.2/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= +github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs= +github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a/go.mod h1:7AyxJNCJ7SBZ1MfVQCWD6Uqo2oubI2Eq2y2eqf+A5r0= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572/go.mod h1:w0SWMsp6j9O/dk4/ZpIhL+3CkG8ofA2vuv7k+ltqUMc= +golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f h1:R423Cnkcp5JABoeemiGEPlt9tHXFfw5kvc0yqlxRPWo= +golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/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-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190219092855-153ac476189d/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d h1:+R4KGOnez64A81RvjARKc4UT5/tI9ujCIVX+P5KiHuI= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/vendor/github.com/libp2p/go-libp2p-pnet/package.json b/vendor/github.com/libp2p/go-libp2p-pnet/package.json deleted file mode 100644 index e30162b6..00000000 --- a/vendor/github.com/libp2p/go-libp2p-pnet/package.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "author": "libp2p", - "bugs": { - "URL": "https://github.com/libp2p/go-libp2p-pnet/issues", - "url": "https://github.com/libp2p/go-libp2p-pnet/issues" - }, - "gx": { - "dvcsimport": "github.com/libp2p/go-libp2p-pnet" - }, - "gxDependencies": [ - { - "author": "libp2p", - "hash": "QmW7Ump7YyBMr712Ta3iEVh3ZYcfVvJaPryfbCnyE826b4", - "name": "go-libp2p-interface-pnet", - "version": "3.0.0" - }, - { - "author": "multiformats", - "hash": "QmZb2Hc6sQeFpmnSuFLYH2eWjaMcPPtzDzXY1PkMM1sjnP", - "name": "go-multicodec", - "version": "0.1.8" - }, - { - "author": "davidlazar", - "hash": "QmNi5J1mEQKAKWbPRBEMKKYVNok9EN4MsGM4YUqPvraPEX", - "name": "go-crypto-dav", - "version": "0.2.2" - }, - { - "author": "Stebalien", - "hash": "QmQDvJoB6aJWN3sjr3xsgXqKCXf4jU5zdMXpDMsBkYVNqa", - "name": "go-buffer-pool", - "version": "0.1.3" - } - ], - "gxVersion": "0.9.1", - "language": "go", - "license": "MIT", - "name": "go-libp2p-pnet", - "releaseCmd": "git commit -a -m \"gx release $VERSION\"", - "version": "3.0.5" -} - diff --git a/vendor/github.com/libp2p/go-libp2p-pnet/protector.go b/vendor/github.com/libp2p/go-libp2p-pnet/protector.go index 38706817..8b8d2dd0 100644 --- a/vendor/github.com/libp2p/go-libp2p-pnet/protector.go +++ b/vendor/github.com/libp2p/go-libp2p-pnet/protector.go @@ -5,7 +5,7 @@ import ( "io" "net" - ipnet "github.com/libp2p/go-libp2p-interface-pnet" + ipnet "github.com/libp2p/go-libp2p-core/pnet" ) var _ ipnet.Protector = (*protector)(nil) diff --git a/vendor/github.com/libp2p/go-libp2p-pnet/psk_conn.go b/vendor/github.com/libp2p/go-libp2p-pnet/psk_conn.go index 5b16ef7a..5d35d879 100644 --- a/vendor/github.com/libp2p/go-libp2p-pnet/psk_conn.go +++ b/vendor/github.com/libp2p/go-libp2p-pnet/psk_conn.go @@ -6,17 +6,18 @@ import ( "io" "net" - salsa20 "github.com/davidlazar/go-crypto/salsa20" + "github.com/libp2p/go-libp2p-core/pnet" + + "github.com/davidlazar/go-crypto/salsa20" pool "github.com/libp2p/go-buffer-pool" - ipnet "github.com/libp2p/go-libp2p-interface-pnet" ) // we are using buffer pool as user needs their slice back // so we can't do XOR cripter in place var ( - errShortNonce = ipnet.NewError("could not read full nonce") - errInsecureNil = ipnet.NewError("insecure is nil") - errPSKNil = ipnet.NewError("pre-shread key is nil") + errShortNonce = pnet.NewError("could not read full nonce") + errInsecureNil = pnet.NewError("insecure is nil") + errPSKNil = pnet.NewError("pre-shread key is nil") ) type pskConn struct { diff --git a/vendor/github.com/libp2p/go-libp2p-protocol/.travis.yml b/vendor/github.com/libp2p/go-libp2p-protocol/.travis.yml deleted file mode 100644 index 4cfe98c2..00000000 --- a/vendor/github.com/libp2p/go-libp2p-protocol/.travis.yml +++ /dev/null @@ -1,32 +0,0 @@ -os: - - linux - -language: go - -go: - - 1.11.x - -env: - global: - - GOTFLAGS="-race" - matrix: - - BUILD_DEPTYPE=gx - - BUILD_DEPTYPE=gomod - - -# disable travis install -install: - - true - -script: - - bash <(curl -s https://raw.githubusercontent.com/ipfs/ci-helpers/master/travis-ci/run-standard-tests.sh) - - -cache: - directories: - - $GOPATH/src/gx - - $GOPATH/pkg/mod - - $HOME/.cache/go-build - -notifications: - email: false diff --git a/vendor/github.com/libp2p/go-libp2p-protocol/LICENSE b/vendor/github.com/libp2p/go-libp2p-protocol/LICENSE deleted file mode 100644 index f64ffb04..00000000 --- a/vendor/github.com/libp2p/go-libp2p-protocol/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2016 Protocol Labs 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/libp2p/go-libp2p-protocol/Makefile b/vendor/github.com/libp2p/go-libp2p-protocol/Makefile deleted file mode 100644 index 20619413..00000000 --- a/vendor/github.com/libp2p/go-libp2p-protocol/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -gx: - go get github.com/whyrusleeping/gx - go get github.com/whyrusleeping/gx-go - -deps: gx - gx --verbose install --global - gx-go rewrite - -publish: - gx-go rewrite --undo - diff --git a/vendor/github.com/libp2p/go-libp2p-protocol/README.md b/vendor/github.com/libp2p/go-libp2p-protocol/README.md deleted file mode 100644 index e258b914..00000000 --- a/vendor/github.com/libp2p/go-libp2p-protocol/README.md +++ /dev/null @@ -1,42 +0,0 @@ -# go-libp2p-protocol - -[![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](http://ipn.io) -[![](https://img.shields.io/badge/project-libp2p-blue.svg?style=flat-square)](http://github.com/libp2p/libp2p) -[![](https://img.shields.io/badge/freenode-%23ipfs-blue.svg?style=flat-square)](http://webchat.freenode.net/?channels=%23ipfs) -[![standard-readme compliant](https://img.shields.io/badge/standard--readme-OK-green.svg?style=flat-square)](https://github.com/RichardLitt/standard-readme) -[![GoDoc](https://godoc.org/github.com/libp2p/go-libp2p-protocol?status.svg)](https://godoc.org/github.com/libp2p/go-libp2p-protocol) -[![Coverage Status](https://img.shields.io/codecov/c/github/libp2p/go-libp2p-protocol.svg?style=flat-square&branch=master)](https://codecov.io/github/libp2p/go-libp2p-protocol?branch=master) -[![Build Status](https://travis-ci.org/libp2p/go-libp2p-protocol.svg?branch=master)](https://travis-ci.org/libp2p/go-libp2p-protocol) - -> Just a type for protocol strings. Nothing more - -## Table of Contents - -- [Install](#install) -- [Usage](#usage) -- [Contribute](#contribute) - - [Want to hack on IPFS?](#want-to-hack-on-ipfs) -- [License](#license) - -## Install - -```sh -go get github.com/libp2p/go-libp2p-protocol -``` - -## Usage - -Go to https://godoc.org/github.com/libp2p/go-libp2p-protocol. - -## Contribute - -Feel free to join in. All welcome. Open an [issue](https://github.com/libp2p/go-libp2p-protocol/issues)! - -Check out our [contributing document](https://github.com/libp2p/community/blob/master/CONTRIBUTE.md) for more information on how we work, and about contributing in general. Please be aware that all interactions related to libp2p are subject to the IPFS [Code of Conduct](https://github.com/ipfs/community/blob/master/code-of-conduct.md). - -Small note: If editing the README, please conform to the [standard-readme](https://github.com/RichardLitt/standard-readme) specification. - -### Want to hack on IPFS? - -[![](https://cdn.rawgit.com/jbenet/contribute-ipfs-gif/master/img/contribute.gif)](https://github.com/ipfs/community/blob/master/contributing.md) - diff --git a/vendor/github.com/libp2p/go-libp2p-protocol/codecov.yml b/vendor/github.com/libp2p/go-libp2p-protocol/codecov.yml deleted file mode 100644 index 5f88a9ea..00000000 --- a/vendor/github.com/libp2p/go-libp2p-protocol/codecov.yml +++ /dev/null @@ -1,3 +0,0 @@ -coverage: - range: "50...100" -comment: off diff --git a/vendor/github.com/libp2p/go-libp2p-protocol/go.mod b/vendor/github.com/libp2p/go-libp2p-protocol/go.mod deleted file mode 100644 index 18ac1448..00000000 --- a/vendor/github.com/libp2p/go-libp2p-protocol/go.mod +++ /dev/null @@ -1 +0,0 @@ -module github.com/libp2p/go-libp2p-protocol diff --git a/vendor/github.com/libp2p/go-libp2p-protocol/package.json b/vendor/github.com/libp2p/go-libp2p-protocol/package.json deleted file mode 100644 index 02531a18..00000000 --- a/vendor/github.com/libp2p/go-libp2p-protocol/package.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "author": "whyrusleeping", - "bugs": { - "url": "https://github.com/libp2p/go-libp2p-protocol" - }, - "gx": { - "dvcsimport": "github.com/libp2p/go-libp2p-protocol" - }, - "gxVersion": "0.9.1", - "language": "go", - "license": "", - "name": "go-libp2p-protocol", - "version": "1.0.0" -} - diff --git a/vendor/github.com/libp2p/go-libp2p-pubsub-router/.travis.yml b/vendor/github.com/libp2p/go-libp2p-pubsub-router/.travis.yml index 4cfe98c2..5163d693 100644 --- a/vendor/github.com/libp2p/go-libp2p-pubsub-router/.travis.yml +++ b/vendor/github.com/libp2p/go-libp2p-pubsub-router/.travis.yml @@ -10,7 +10,6 @@ env: global: - GOTFLAGS="-race" matrix: - - BUILD_DEPTYPE=gx - BUILD_DEPTYPE=gomod @@ -24,7 +23,6 @@ script: cache: directories: - - $GOPATH/src/gx - $GOPATH/pkg/mod - $HOME/.cache/go-build diff --git a/vendor/github.com/libp2p/go-libp2p-pubsub-router/Makefile b/vendor/github.com/libp2p/go-libp2p-pubsub-router/Makefile deleted file mode 100644 index a89e6d08..00000000 --- a/vendor/github.com/libp2p/go-libp2p-pubsub-router/Makefile +++ /dev/null @@ -1,9 +0,0 @@ -export IPFS_API ?= v04x.ipfs.io - -gx: - go get -u github.com/whyrusleeping/gx - go get -u github.com/whyrusleeping/gx-go - -deps: gx - gx --verbose install --global - gx-go rewrite \ No newline at end of file diff --git a/vendor/github.com/libp2p/go-libp2p-pubsub-router/README.md b/vendor/github.com/libp2p/go-libp2p-pubsub-router/README.md index feb070bf..00890fdd 100644 --- a/vendor/github.com/libp2p/go-libp2p-pubsub-router/README.md +++ b/vendor/github.com/libp2p/go-libp2p-pubsub-router/README.md @@ -1,12 +1,12 @@ # go-libp2p-pubsub-router -[![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](http://ipn.io) -[![](https://img.shields.io/badge/project-IPFS-blue.svg?style=flat-square)](http://ipfs.io/) -[![](https://img.shields.io/badge/freenode-%23ipfs-blue.svg?style=flat-square)](http://webchat.freenode.net/?channels=%23ipfs) -[![standard-readme compliant](https://img.shields.io/badge/standard--readme-OK-green.svg?style=flat-square)](https://github.com/RichardLitt/standard-readme) +[![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](https://protocol.ai) +[![](https://img.shields.io/badge/project-libp2p-yellow.svg?style=flat-square)](https://libp2p.io/) +[![](https://img.shields.io/badge/freenode-%23libp2p-yellow.svg?style=flat-square)](http://webchat.freenode.net/?channels=%23libp2p) [![GoDoc](https://godoc.org/github.com/libp2p/go-libp2p-pubsub-router?status.svg)](https://godoc.org/github.com/libp2p/go-libp2p-pubsub-router) [![Coverage Status](https://img.shields.io/codecov/c/github/libp2p/go-libp2p-pubsub-router.svg?style=flat-square&branch=master)](https://codecov.io/github/libp2p/go-libp2p-pubsub-router?branch=master) [![Build Status](https://travis-ci.org/libp2p/go-libp2p-pubsub-router.svg?branch=master)](https://travis-ci.org/libp2p/go-libp2p-pubsub-router) +[![Discourse posts](https://img.shields.io/discourse/https/discuss.libp2p.io/posts.svg)](https://discuss.libp2p.io) > A libp2p router that uses pubsub. @@ -29,3 +29,7 @@ This repository falls under the IPFS [Code of Conduct](https://github.com/ipfs/c ## License MIT + +--- + +The last gx published version of this module was: 0.5.18: QmaHVH3EqQD6DsE1yPgwfCThvFCwfkJ396uyrRSo3Ku1kH diff --git a/vendor/github.com/libp2p/go-libp2p-pubsub-router/go.mod b/vendor/github.com/libp2p/go-libp2p-pubsub-router/go.mod index 2f994da3..6b013d63 100644 --- a/vendor/github.com/libp2p/go-libp2p-pubsub-router/go.mod +++ b/vendor/github.com/libp2p/go-libp2p-pubsub-router/go.mod @@ -1,18 +1,15 @@ module github.com/libp2p/go-libp2p-pubsub-router require ( - github.com/ipfs/go-cid v0.0.1 - github.com/ipfs/go-datastore v0.0.1 + github.com/ipfs/go-cid v0.0.2 + github.com/ipfs/go-datastore v0.0.5 github.com/ipfs/go-ipfs-ds-help v0.0.1 github.com/ipfs/go-ipfs-util v0.0.1 github.com/ipfs/go-log v0.0.1 - github.com/libp2p/go-libp2p-blankhost v0.0.1 - github.com/libp2p/go-libp2p-host v0.0.1 - github.com/libp2p/go-libp2p-peer v0.0.1 - github.com/libp2p/go-libp2p-peerstore v0.0.1 - github.com/libp2p/go-libp2p-pubsub v0.0.1 - github.com/libp2p/go-libp2p-record v0.0.1 - github.com/libp2p/go-libp2p-routing v0.0.1 - github.com/libp2p/go-libp2p-routing-helpers v0.0.2 - github.com/libp2p/go-libp2p-swarm v0.0.1 + github.com/libp2p/go-libp2p-blankhost v0.1.1 + github.com/libp2p/go-libp2p-core v0.0.1 + github.com/libp2p/go-libp2p-pubsub v0.1.0 + github.com/libp2p/go-libp2p-record v0.1.0 + github.com/libp2p/go-libp2p-routing-helpers v0.1.0 + github.com/libp2p/go-libp2p-swarm v0.1.0 ) diff --git a/vendor/github.com/libp2p/go-libp2p-pubsub-router/go.sum b/vendor/github.com/libp2p/go-libp2p-pubsub-router/go.sum index 6dc1df7a..6479b98a 100644 --- a/vendor/github.com/libp2p/go-libp2p-pubsub-router/go.sum +++ b/vendor/github.com/libp2p/go-libp2p-pubsub-router/go.sum @@ -10,8 +10,8 @@ github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVa github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= -github.com/coreos/go-semver v0.2.0 h1:3Jm3tLmsgAYcjC+4Up7hJrFBPr+n7rAqYeSw/SZazuY= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -30,9 +30,7 @@ github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/gxed/hashland/keccakpg v0.0.1 h1:wrk3uMNaMxbXiHibbPO4S0ymqJMm41WiudyFSs7UnsU= github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfmKFJ6tItnhQ67kU= -github.com/gxed/hashland/murmur3 v0.0.1 h1:SheiaIt0sda5K+8FLz952/1iWS9zrnKsEJaOJu4ZbSc= github.com/gxed/hashland/murmur3 v0.0.1/go.mod h1:KjXop02n4/ckmZSnY2+HKcLud/tcmvhST0bie/0lS48= github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= @@ -42,12 +40,12 @@ github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+ github.com/hashicorp/golang-lru v0.5.1/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/ipfs/go-cid v0.0.1 h1:GBjWPktLnNyX0JiQCNFpUuUSoMw5KMyqrsejHYlILBE= github.com/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= -github.com/ipfs/go-datastore v0.0.1 h1:AW/KZCScnBWlSb5JbnEnLKFWXL224LBEh/9KXXOrUms= +github.com/ipfs/go-cid v0.0.2 h1:tuuKaZPU1M6HcejsO3AcYWW8sZ8MTvyxfc4uqB4eFE8= +github.com/ipfs/go-cid v0.0.2/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= github.com/ipfs/go-datastore v0.0.1/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= -github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk= -github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps= +github.com/ipfs/go-datastore v0.0.5 h1:q3OfiOZV5rlsK1H5V8benjeUApRfMGs4Mrhmr6NriQo= +github.com/ipfs/go-datastore v0.0.5/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= github.com/ipfs/go-ds-badger v0.0.2/go.mod h1:Y3QpeSFWQf6MopLTiZD+VT6IC1yZqaGmjvRcKeSGij8= github.com/ipfs/go-ds-leveldb v0.0.1/go.mod h1:feO8V3kubwsEF22n0YRQCffeb79OOYIykR4L04tMOYc= github.com/ipfs/go-ipfs-delay v0.0.0-20181109222059-70721b86a9a8/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= @@ -57,10 +55,12 @@ github.com/ipfs/go-ipfs-util v0.0.1 h1:Wz9bL2wB2YBJqggkA4dD7oSmqB4cAnpNbGrlHJulv github.com/ipfs/go-ipfs-util v0.0.1/go.mod h1:spsl5z8KUnrve+73pOhSVZND1SIxPW5RyBCNzQxlJBc= github.com/ipfs/go-log v0.0.1 h1:9XTUN/rW64BCG1YhPK9Hoy3q8nr4gOmHHBpgFdfw6Lc= github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM= +github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA= github.com/jbenet/go-temp-err-catcher v0.0.0-20150120210811-aac704a3f4f2 h1:vhC1OXXiT9R2pczegwz6moDvuRpggaroAXhPIseh57A= github.com/jbenet/go-temp-err-catcher v0.0.0-20150120210811-aac704a3f4f2/go.mod h1:8GXXJV31xl8whumTzdZsTt3RnUIiPqzkyf7mxToRCMs= -github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8 h1:bspPhN+oKYFk5fcGNuQzp6IGzYQSenLEgH3s6jkXrWw= github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8/go.mod h1:Ly/wlsjFq/qrU3Rar62tu1gASgGw6chQbSh/XgIIXCY= +github.com/jbenet/goprocess v0.1.3 h1:YKyIEECS/XvcfHtBzxtjBBbWK+MbvA6dG8ASiqwvr10= +github.com/jbenet/goprocess v0.1.3/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= @@ -73,106 +73,116 @@ 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/libp2p/go-addr-util v0.0.1 h1:TpTQm9cXVRVSKsYbgQ7GKc3KbbHVTnbostgGaDEP+88= github.com/libp2p/go-addr-util v0.0.1/go.mod h1:4ac6O7n9rIAKB1dnd+s8IbbMXkt+oBpzX4/+RACcnlQ= -github.com/libp2p/go-buffer-pool v0.0.1 h1:9Rrn/H46cXjaA2HQ5Y8lyhOS1NhTkZ4yuEs2r3Eechg= github.com/libp2p/go-buffer-pool v0.0.1/go.mod h1:xtyIz9PMobb13WaxR6Zo1Pd1zXJKYg0a8KiIvDp3TzQ= -github.com/libp2p/go-conn-security v0.0.1 h1:4kMMrqrt9EUNCNjX1xagSJC+bq16uqjMe9lk1KBMVNs= -github.com/libp2p/go-conn-security v0.0.1/go.mod h1:bGmu51N0KU9IEjX7kl2PQjgZa40JQWnayTvNMgD/vyk= -github.com/libp2p/go-conn-security-multistream v0.0.1 h1:XefjAQRHcnUaxKb26RGupToucx3uU4ecbOZ3aACXlDU= -github.com/libp2p/go-conn-security-multistream v0.0.1/go.mod h1:nc9vud7inQ+d6SO0I/6dSWrdMnHnzZNHeyUQqrAJulE= +github.com/libp2p/go-buffer-pool v0.0.2 h1:QNK2iAFa8gjAe1SPz6mHSMuCcjs+X1wlHzeOSqcmlfs= +github.com/libp2p/go-buffer-pool v0.0.2/go.mod h1:MvaB6xw5vOrDl8rYZGLFdKAuk/hRoRZd1Vi32+RXyFM= +github.com/libp2p/go-conn-security-multistream v0.1.0 h1:aqGmto+ttL/uJgX0JtQI0tD21CIEy5eYd1Hlp0juHY0= +github.com/libp2p/go-conn-security-multistream v0.1.0/go.mod h1:aw6eD7LOsHEX7+2hJkDxw1MteijaVcI+/eP2/x3J1xc= github.com/libp2p/go-flow-metrics v0.0.1 h1:0gxuFd2GuK7IIP5pKljLwps6TvcuYgvG7Atqi3INF5s= github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZxBdp967ls1g+k8= -github.com/libp2p/go-libp2p-blankhost v0.0.1 h1:/mZuuiwntNR8RywnCFlGHLKrKLYne+qciBpQXWqp5fk= -github.com/libp2p/go-libp2p-blankhost v0.0.1/go.mod h1:Ibpbw/7cPPYwFb7PACIWdvxxv0t0XCCI10t7czjAjTc= -github.com/libp2p/go-libp2p-crypto v0.0.1 h1:JNQd8CmoGTohO/akqrH16ewsqZpci2CbgYH/LmYl8gw= -github.com/libp2p/go-libp2p-crypto v0.0.1/go.mod h1:yJkNyDmO341d5wwXxDUGO0LykUVT72ImHNUqh5D/dBE= -github.com/libp2p/go-libp2p-host v0.0.1 h1:dnqusU+DheGcdxrE718kG4XgHNuL2n9eEv8Rg5zy8hQ= -github.com/libp2p/go-libp2p-host v0.0.1/go.mod h1:qWd+H1yuU0m5CwzAkvbSjqKairayEHdR5MMl7Cwa7Go= -github.com/libp2p/go-libp2p-interface-connmgr v0.0.1 h1:Q9EkNSLAOF+u90L88qmE9z/fTdjLh8OsJwGw74mkwk4= -github.com/libp2p/go-libp2p-interface-connmgr v0.0.1/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k= -github.com/libp2p/go-libp2p-interface-pnet v0.0.1 h1:7GnzRrBTJHEsofi1ahFdPN9Si6skwXQE9UqR2S+Pkh8= -github.com/libp2p/go-libp2p-interface-pnet v0.0.1/go.mod h1:el9jHpQAXK5dnTpKA4yfCNBZXvrzdOU75zz+C6ryp3k= -github.com/libp2p/go-libp2p-loggables v0.0.1 h1:HVww9oAnINIxbt69LJNkxD8lnbfgteXR97Xm4p3l9ps= -github.com/libp2p/go-libp2p-loggables v0.0.1/go.mod h1:lDipDlBNYbpyqyPX/KcoO+eq0sJYEVR2JgOexcivchg= -github.com/libp2p/go-libp2p-metrics v0.0.1 h1:yumdPC/P2VzINdmcKZd0pciSUCpou+s0lwYCjBbzQZU= -github.com/libp2p/go-libp2p-metrics v0.0.1/go.mod h1:jQJ95SXXA/K1VZi13h52WZMa9ja78zjyy5rspMsC/08= -github.com/libp2p/go-libp2p-net v0.0.1 h1:xJ4Vh4yKF/XKb8fd1Ev0ebAGzVjMxXzrxG2kjtU+F5Q= -github.com/libp2p/go-libp2p-net v0.0.1/go.mod h1:Yt3zgmlsHOgUWSXmt5V/Jpz9upuJBE8EgNU9DrCcR8c= -github.com/libp2p/go-libp2p-peer v0.0.1 h1:0qwAOljzYewINrU+Kndoc+1jAL7vzY/oY2Go4DCGfyY= -github.com/libp2p/go-libp2p-peer v0.0.1/go.mod h1:nXQvOBbwVqoP+T5Y5nCjeH4sP9IX/J0AMzcDUVruVoo= -github.com/libp2p/go-libp2p-peerstore v0.0.1 h1:twKovq8YK5trLrd3nB7PD2Zu9JcyAIdm7Bz9yBWjhq8= -github.com/libp2p/go-libp2p-peerstore v0.0.1/go.mod h1:RabLyPVJLuNQ+GFyoEkfi8H4Ti6k/HtZJ7YKgtSq+20= -github.com/libp2p/go-libp2p-protocol v0.0.1 h1:+zkEmZ2yFDi5adpVE3t9dqh/N9TbpFWywowzeEzBbLM= -github.com/libp2p/go-libp2p-protocol v0.0.1/go.mod h1:Af9n4PiruirSDjHycM1QuiMi/1VZNHYcK8cLgFJLZ4s= -github.com/libp2p/go-libp2p-pubsub v0.0.1 h1:iJWpvBDZiZOoRBGqEifu9yUHti9ptnSODHt6tgrBC6c= -github.com/libp2p/go-libp2p-pubsub v0.0.1/go.mod h1:fYKlZBOF2yrJzYlgeEVFSbYWfbS+E8Zix6gMZ0A6WgE= -github.com/libp2p/go-libp2p-record v0.0.1 h1:zN7AS3X46qmwsw5JLxdDuI43cH5UYwovKxHPjKBYQxw= -github.com/libp2p/go-libp2p-record v0.0.1/go.mod h1:grzqg263Rug/sRex85QrDOLntdFAymLDLm7lxMgU79Q= -github.com/libp2p/go-libp2p-routing v0.0.1 h1:hPMAWktf9rYi3ME4MG48qE7dq1ofJxiQbfdvpNntjhc= -github.com/libp2p/go-libp2p-routing v0.0.1/go.mod h1:N51q3yTr4Zdr7V8Jt2JIktVU+3xBBylx1MZeVA6t1Ys= -github.com/libp2p/go-libp2p-routing-helpers v0.0.1 h1:fl02yxCXoPxt3tIRUC5yxKEIkKfJoZVkAkm+JN97SFE= -github.com/libp2p/go-libp2p-routing-helpers v0.0.1/go.mod h1:zf1ook9HoOQpfnVXrF4gGorkPrGGf1g25vgH5+4SRNU= -github.com/libp2p/go-libp2p-routing-helpers v0.0.2 h1:SLX7eDQE8Xo197NwNM/hM7WnH3w6fSGY9+G9HkiYwqQ= -github.com/libp2p/go-libp2p-routing-helpers v0.0.2/go.mod h1:zf1ook9HoOQpfnVXrF4gGorkPrGGf1g25vgH5+4SRNU= -github.com/libp2p/go-libp2p-secio v0.0.1 h1:CqE/RdsizOwItdgLe632iyft/w0tshDLmZGAiKDcUAI= -github.com/libp2p/go-libp2p-secio v0.0.1/go.mod h1:IdG6iQybdcYmbTzxp4J5dwtUEDTOvZrT0opIDVNPrJs= -github.com/libp2p/go-libp2p-swarm v0.0.1 h1:Vne+hjaDwXqzgNwQ2vb2YKbnbOTyXjtS47stT66Apc4= -github.com/libp2p/go-libp2p-swarm v0.0.1/go.mod h1:mh+KZxkbd3lQnveQ3j2q60BM1Cw2mX36XXQqwfPOShs= -github.com/libp2p/go-libp2p-transport v0.0.1/go.mod h1:UzbUs9X+PHOSw7S3ZmeOxfnwaQY5vGDzZmKPod3N3tk= -github.com/libp2p/go-libp2p-transport v0.0.4 h1:/CPHQMN75/IQwkhBxxIo6p6PtL3rwFZtlzBROT3e8mw= -github.com/libp2p/go-libp2p-transport v0.0.4/go.mod h1:StoY3sx6IqsP6XKoabsPnHCwqKXWUMWU7Rfcsubee/A= -github.com/libp2p/go-libp2p-transport-upgrader v0.0.1 h1:rNtXkY6dty46mxYOHHAZQchI7gQdJStF683FhVnei/k= -github.com/libp2p/go-libp2p-transport-upgrader v0.0.1/go.mod h1:NJpUAgQab/8K6K0m+JmZCe5RUXG10UMEx4kWe9Ipj5c= -github.com/libp2p/go-maddr-filter v0.0.1 h1:apvYTg0aIxxQyBX+XHKOR+0+lYhGs1Yv+JmTH9nyl5I= -github.com/libp2p/go-maddr-filter v0.0.1/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= -github.com/libp2p/go-mplex v0.0.1 h1:dn2XGSrUxLtz3/8u85bGrwhUEKPX8MOF3lpmcWBZCWc= -github.com/libp2p/go-mplex v0.0.1/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0= -github.com/libp2p/go-msgio v0.0.1 h1:znj97n5FtXGCLDwe9x8jpHmY770SW4WStBGcCDh6GJw= -github.com/libp2p/go-msgio v0.0.1/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= +github.com/libp2p/go-libp2p-blankhost v0.1.1 h1:X919sCh+KLqJcNRApj43xCSiQRYqOSI88Fdf55ngf78= +github.com/libp2p/go-libp2p-blankhost v0.1.1/go.mod h1:pf2fvdLJPsC1FsVrNP3DUUvMzUts2dsLLBEpo1vW1ro= +github.com/libp2p/go-libp2p-core v0.0.1 h1:HSTZtFIq/W5Ue43Zw+uWZyy2Vl5WtF0zDjKN8/DT/1I= +github.com/libp2p/go-libp2p-core v0.0.1/go.mod h1:g/VxnTZ/1ygHxH3dKok7Vno1VfpvGcGip57wjTU4fco= +github.com/libp2p/go-libp2p-crypto v0.1.0 h1:k9MFy+o2zGDNGsaoZl0MA3iZ75qXxr9OOoAZF+sD5OQ= +github.com/libp2p/go-libp2p-crypto v0.1.0/go.mod h1:sPUokVISZiy+nNuTTH/TY+leRSxnFj/2GLjtOTW90hI= +github.com/libp2p/go-libp2p-loggables v0.1.0 h1:h3w8QFfCt2UJl/0/NW4K829HX/0S4KD31PQ7m8UXXO8= +github.com/libp2p/go-libp2p-loggables v0.1.0/go.mod h1:EyumB2Y6PrYjr55Q3/tiJ/o3xoDasoRYM7nOzEpoa90= +github.com/libp2p/go-libp2p-mplex v0.2.0/go.mod h1:Ejl9IyjvXJ0T9iqUTE1jpYATQ9NM3g+OtR+EMMODbKo= +github.com/libp2p/go-libp2p-mplex v0.2.1 h1:E1xaJBQnbSiTHGI1gaBKmKhu1TUKkErKJnE8iGvirYI= +github.com/libp2p/go-libp2p-mplex v0.2.1/go.mod h1:SC99Rxs8Vuzrf/6WhmH41kNn13TiYdAWNYHrwImKLnE= +github.com/libp2p/go-libp2p-peer v0.2.0 h1:EQ8kMjaCUwt/Y5uLgjT8iY2qg0mGUT0N1zUjer50DsY= +github.com/libp2p/go-libp2p-peer v0.2.0/go.mod h1:RCffaCvUyW2CJmG2gAWVqwePwW7JMgxjsHm7+J5kjWY= +github.com/libp2p/go-libp2p-peerstore v0.1.0 h1:MKh7pRNPHSh1fLPj8u/M/s/napdmeNpoi9BRy9lPN0E= +github.com/libp2p/go-libp2p-peerstore v0.1.0/go.mod h1:2CeHkQsr8svp4fZ+Oi9ykN1HBb6u0MOvdJ7YIsmcwtY= +github.com/libp2p/go-libp2p-pubsub v0.1.0 h1:SmQeMa7IUv5vadh0fYgYsafWCBA1sCy5d/68kIYqGcU= +github.com/libp2p/go-libp2p-pubsub v0.1.0/go.mod h1:ZwlKzRSe1eGvSIdU5bD7+8RZN/Uzw0t1Bp9R1znpR/Q= +github.com/libp2p/go-libp2p-record v0.1.0 h1:wHwBGbFzymoIl69BpgwIu0O6ta3TXGcMPvHUAcodzRc= +github.com/libp2p/go-libp2p-record v0.1.0/go.mod h1:ujNc8iuE5dlKWVy6wuL6dd58t0n7xI4hAIl8pE6wu5Q= +github.com/libp2p/go-libp2p-routing-helpers v0.1.0 h1:BaFvpyv8TyhCN7TihawTiKuzeu8/Pyw7ZnMA4IvqIN8= +github.com/libp2p/go-libp2p-routing-helpers v0.1.0/go.mod h1:oUs0h39vNwYtYXnQWOTU5BaafbedSyWCCal3gqHuoOQ= +github.com/libp2p/go-libp2p-secio v0.1.0 h1:NNP5KLxuP97sE5Bu3iuwOWyT/dKEGMN5zSLMWdB7GTQ= +github.com/libp2p/go-libp2p-secio v0.1.0/go.mod h1:tMJo2w7h3+wN4pgU2LSYeiKPrfqBgkOsdiKK77hE7c8= +github.com/libp2p/go-libp2p-swarm v0.1.0 h1:HrFk2p0awrGEgch9JXK/qp/hfjqQfgNxpLWnCiWPg5s= +github.com/libp2p/go-libp2p-swarm v0.1.0/go.mod h1:wQVsCdjsuZoc730CgOvh5ox6K8evllckjebkdiY5ta4= +github.com/libp2p/go-libp2p-testing v0.0.2/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= +github.com/libp2p/go-libp2p-testing v0.0.3 h1:bdij4bKaaND7tCsaXVjRfYkMpvoOeKj9AVQGJllA6jM= +github.com/libp2p/go-libp2p-testing v0.0.3/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= +github.com/libp2p/go-libp2p-transport-upgrader v0.1.1 h1:PZMS9lhjK9VytzMCW3tWHAXtKXmlURSc3ZdvwEcKCzw= +github.com/libp2p/go-libp2p-transport-upgrader v0.1.1/go.mod h1:IEtA6or8JUbsV07qPW4r01GnTenLW4oi3lOPbUMGJJA= +github.com/libp2p/go-libp2p-yamux v0.2.0 h1:TSPZ5cMMz/wdoYsye/wU1TE4G3LDGMoeEN0xgnCKU/I= +github.com/libp2p/go-libp2p-yamux v0.2.0/go.mod h1:Db2gU+XfLpm6E4rG5uGCFX6uXA8MEXOxFcRoXUODaK8= +github.com/libp2p/go-maddr-filter v0.0.4 h1:hx8HIuuwk34KePddrp2mM5ivgPkZ09JH4AvsALRbFUs= +github.com/libp2p/go-maddr-filter v0.0.4/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= +github.com/libp2p/go-mplex v0.0.3/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0= +github.com/libp2p/go-mplex v0.1.0 h1:/nBTy5+1yRyY82YaO6HXQRnO5IAGsXTjEJaR3LdTPc0= +github.com/libp2p/go-mplex v0.1.0/go.mod h1:SXgmdki2kwCUlCCbfGLEgHjC4pFqhTp0ZoV6aiKgxDU= +github.com/libp2p/go-msgio v0.0.2 h1:ivPvEKHxmVkTClHzg6RXTYHqaJQ0V9cDbq+6lKb3UV0= +github.com/libp2p/go-msgio v0.0.2/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= github.com/libp2p/go-reuseport v0.0.1 h1:7PhkfH73VXfPJYKQ6JwS5I/eVcoyYi9IMNGc6FWpFLw= github.com/libp2p/go-reuseport v0.0.1/go.mod h1:jn6RmB1ufnQwl0Q1f+YxAj8isJgDCQzaaxIFYDhcYEA= -github.com/libp2p/go-reuseport-transport v0.0.1 h1:UIRneNxLDmEGNjGHpIiWzSWkZ5bhxMCP9x3Vh7BSc7E= -github.com/libp2p/go-reuseport-transport v0.0.1/go.mod h1:YkbSDrvjUVDL6b8XqriyA20obEtsW9BLkuOUyQAOCbs= -github.com/libp2p/go-stream-muxer v0.0.1 h1:Ce6e2Pyu+b5MC1k3eeFtAax0pW4gc6MosYSLV05UeLw= +github.com/libp2p/go-reuseport-transport v0.0.2 h1:WglMwyXyBu61CMkjCCtnmqNqnjib0GIEjMiHTwR/KN4= +github.com/libp2p/go-reuseport-transport v0.0.2/go.mod h1:YkbSDrvjUVDL6b8XqriyA20obEtsW9BLkuOUyQAOCbs= github.com/libp2p/go-stream-muxer v0.0.1/go.mod h1:bAo8x7YkSpadMTbtTaxGVHWUQsR/l5MEaHbKaliuT14= -github.com/libp2p/go-tcp-transport v0.0.1 h1:WyvJVw2lYAnr6CU+GZZ4oCt06fvORlmvBlFX2+ZpZDM= -github.com/libp2p/go-tcp-transport v0.0.1/go.mod h1:mnjg0o0O5TmXUaUIanYPUqkW4+u6mK0en8rlpA6BBTs= -github.com/libp2p/go-testutil v0.0.1 h1:Xg+O0G2HIMfHqBOBDcMS1iSZJ3GEcId4qOxCQvsGZHk= -github.com/libp2p/go-testutil v0.0.1/go.mod h1:iAcJc/DKJQanJ5ws2V+u5ywdL2n12X1WbbEG+Jjy69I= +github.com/libp2p/go-stream-muxer-multistream v0.2.0 h1:714bRJ4Zy9mdhyTLJ+ZKiROmAFwUHpeRidG+q7LTQOg= +github.com/libp2p/go-stream-muxer-multistream v0.2.0/go.mod h1:j9eyPol/LLRqT+GPLSxvimPhNph4sfYfMoDPd7HkzIc= +github.com/libp2p/go-tcp-transport v0.1.0 h1:IGhowvEqyMFknOar4FWCKSWE0zL36UFKQtiRQD60/8o= +github.com/libp2p/go-tcp-transport v0.1.0/go.mod h1:oJ8I5VXryj493DEJ7OsBieu8fcg2nHGctwtInJVpipc= +github.com/libp2p/go-yamux v1.2.2 h1:s6J6o7+ajoQMjHe7BEnq+EynOj5D2EoG8CuQgL3F2vg= +github.com/libp2p/go-yamux v1.2.2/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= github.com/mattn/go-colorable v0.1.1 h1:G1f5SKeVxmagw/IyvzvtZE4Gybcc4Tr1tf7I8z0XgOg= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= github.com/mattn/go-isatty v0.0.5 h1:tHXDdz1cpzGaovsTB+TVB8q90WEokoVmfMqoVcrLUgw= github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0OXOcUbGjvZxxijuBwbbmlSxLiuofa+g= github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= -github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16 h1:5W7KhL8HVF3XCFOweFD3BNESdnO8ewyYTFT2R+/b8FQ= github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= -github.com/mr-tron/base58 v1.1.0 h1:Y51FGVJ91WBqCEabAi5OPUz38eAx8DakuAm5svLcsfQ= +github.com/minio/sha256-simd v0.0.0-20190328051042-05b4dd3047e5/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= +github.com/minio/sha256-simd v0.1.0 h1:U41/2erhAKcmSI14xh/ZTUdBPOzDOIfS93ibzUSl8KM= +github.com/minio/sha256-simd v0.1.0/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= +github.com/mr-tron/base58 v1.1.1/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= +github.com/mr-tron/base58 v1.1.2 h1:ZEw4I2EgPKDJ2iEw0cNmLB3ROrEmkOtXIkaG7wZg+78= +github.com/mr-tron/base58 v1.1.2/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= github.com/multiformats/go-base32 v0.0.3 h1:tw5+NhuwaOjJCC5Pp82QuXbrmLzWg7uxlMFp8Nq/kkI= github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= -github.com/multiformats/go-multiaddr v0.0.1 h1:/QUV3VBMDI6pi6xfiw7lr6xhDWWvQKn9udPn68kLSdY= github.com/multiformats/go-multiaddr v0.0.1/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= -github.com/multiformats/go-multiaddr-dns v0.0.1 h1:jQt9c6tDSdQLIlBo4tXYx7QUHCPjxsB1zXcag/2S7zc= +github.com/multiformats/go-multiaddr v0.0.2/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= +github.com/multiformats/go-multiaddr v0.0.4 h1:WgMSI84/eRLdbptXMkMWDXPjPq7SPLIgGUVm2eroyU4= +github.com/multiformats/go-multiaddr v0.0.4/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= github.com/multiformats/go-multiaddr-dns v0.0.1/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= +github.com/multiformats/go-multiaddr-dns v0.0.2 h1:/Bbsgsy3R6e3jf2qBahzNHzww6usYaZ0NhNH3sqdFS8= +github.com/multiformats/go-multiaddr-dns v0.0.2/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= +github.com/multiformats/go-multiaddr-fmt v0.0.1 h1:5YjeOIzbX8OTKVaN72aOzGIYW7PnrZrnkDyOfAWRSMA= +github.com/multiformats/go-multiaddr-fmt v0.0.1/go.mod h1:aBYjqL4T/7j4Qx+R73XSv/8JsgnRFlf0w2KGLCmXl3Q= github.com/multiformats/go-multiaddr-net v0.0.1 h1:76O59E3FavvHqNg7jvzWzsPSW5JSi/ek0E4eiDVbg9g= github.com/multiformats/go-multiaddr-net v0.0.1/go.mod h1:nw6HSxNmCIQH27XPGBuX+d1tnvM7ihcFwHMSstNAVUU= github.com/multiformats/go-multibase v0.0.1 h1:PN9/v21eLywrFWdFNsFKaU04kLJzuYzmrJR+ubhT9qA= github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs= -github.com/multiformats/go-multihash v0.0.1 h1:HHwN1K12I+XllBCrqKnhX949Orn4oawPkegHMu2vDqQ= github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= -github.com/multiformats/go-multistream v0.0.1 h1:JV4VfSdY9n7ECTtY59/TlSyFCzRILvYx4T4Ws8ZgihU= -github.com/multiformats/go-multistream v0.0.1/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= +github.com/multiformats/go-multihash v0.0.5 h1:1wxmCvTXAifAepIMyF39vZinRw5sbqjPs/UIi93+uik= +github.com/multiformats/go-multihash v0.0.5/go.mod h1:lt/HCbqlQwlPBz7lv0sQCdtfcMtlJvakRUn/0Ual8po= +github.com/multiformats/go-multistream v0.1.0 h1:UpO6jrsjqs46mqAK3n6wKRYFhugss9ArzbyUzU+4wkQ= +github.com/multiformats/go-multistream v0.1.0/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= 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/ginkgo v1.8.0 h1:VkHVNpR4iVnU8XQR6DBm8BqYjN7CRzw+xKUbVVbbW9w= +github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.5.0 h1:izbySO9zDPmjJ8rDjLvkA2zJHIo+HkYXHnf7eN7SSyo= +github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/opentracing/opentracing-go v1.0.2 h1:3jA2P6O1F9UOrWVpwrIo17pu01KWvNWg4X946/Y5Zwg= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= 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/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a h1:/eS3yfGjQKG+9kayBkj0ip1BGhq6zJ3eaVksphxAaek= +github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a/go.mod h1:7AyxJNCJ7SBZ1MfVQCWD6Uqo2oubI2Eq2y2eqf+A5r0= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 h1:RC6RW7j+1+HkWaX/Yh71Ee5ZHaHYt7ZP4sQgUrm6cDU= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572/go.mod h1:w0SWMsp6j9O/dk4/ZpIhL+3CkG8ofA2vuv7k+ltqUMc= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= @@ -180,36 +190,32 @@ github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpP github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1/go.mod h1:8UvriyWtv5Q5EOgjHaSseUEdkQfvwFv1I/In/O2M9gc= github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc h1:9lDbC6Rz4bwmou+oE6Dt4Cb2BGMur5eR/GYptkKUVHo= github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc/go.mod h1:bopw91TMyo8J3tvftk8xmU2kPmlrt4nScJQZU2hE5EM= -github.com/whyrusleeping/go-smux-multiplex v3.0.16+incompatible h1:iqksILj8STw03EJQe7Laj4ubnw+ojOyik18cd5vPL1o= -github.com/whyrusleeping/go-smux-multiplex v3.0.16+incompatible/go.mod h1:34LEDbeKFZInPUrAG+bjuJmUXONGdEFW7XL0SpTY1y4= -github.com/whyrusleeping/go-smux-multistream v2.0.2+incompatible h1:BdYHctE9HJZLquG9tpTdwWcbG4FaX6tVKPGjCGgiVxo= -github.com/whyrusleeping/go-smux-multistream v2.0.2+incompatible/go.mod h1:dRWHHvc4HDQSHh9gbKEBbUZ+f2Q8iZTPG3UOGYODxSQ= -github.com/whyrusleeping/go-smux-yamux v2.0.8+incompatible h1:IGm/UP/JpEFS6D787sZnZg7RA6fZIR9c/Ms9DeAVNuk= -github.com/whyrusleeping/go-smux-yamux v2.0.8+incompatible/go.mod h1:6qHUzBXUbB9MXmw3AUdB52L8sEb/hScCqOdW2kj/wuI= github.com/whyrusleeping/mafmt v1.2.8 h1:TCghSl5kkwEE0j+sU/gudyhVMRlpBin8fMBBHg59EbA= github.com/whyrusleeping/mafmt v1.2.8/go.mod h1:faQJFPbLSxzD9xpA02ttW/tS9vZykNvXwGvqIpk20FA= github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7 h1:E9S12nwJwEOXe2d6gT6qxdvqMnNq+VnSsKPgm2ZZNds= github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7/go.mod h1:X2c0RVCI1eSUFI8eLcY3c0423ykwiUdxLJtkDvruhjI= github.com/whyrusleeping/timecache v0.0.0-20160911033111-cfcb2f1abfee h1:lYbXeSvJi5zk5GLKVuid9TVjS9a0OmLIDKTfoZBL6Ow= github.com/whyrusleeping/timecache v0.0.0-20160911033111-cfcb2f1abfee/go.mod h1:m2aV4LZI4Aez7dP5PMyVKEHhUyEJ/RjmPEDOpDvudHg= -github.com/whyrusleeping/yamux v1.1.5 h1:4CK3aUUJQu0qpKZv5gEWJjNOQtdbdDhVVS6PJ+HimdE= -github.com/whyrusleeping/yamux v1.1.5/go.mod h1:E8LnQQ8HKx5KD29HZFUwM1PxCOdPRzGwur1mcYhXcD8= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25 h1:jsG6UpNLt9iAsb0S2AGW28DveNzzgmbXR+ENoPjUeIU= -golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f h1:R423Cnkcp5JABoeemiGEPlt9tHXFfw5kvc0yqlxRPWo= +golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190227160552-c95aed5357e7 h1:C2F/nMkR/9sfUTpvR3QrjBuTdvMUC/cFajkphs1YLQo= golang.org/x/net v0.0.0-20190227160552-c95aed5357e7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3 h1:0GoQqolDA55aaLxZyTzK/Y2ePZzZTUrRacwib7cNsYQ= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f h1:wMNYb4v58l5UBM7MYRLPG6ZhfOqbKu7X5eyFl8ZhKvA= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/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-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190219092855-153ac476189d/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190228124157-a34e9553db1e h1:ZytStCyV048ZqDsWHiYDdoI2Vd4msMcrDECFxS+tL9c= golang.org/x/sys v0.0.0-20190228124157-a34e9553db1e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d h1:+R4KGOnez64A81RvjARKc4UT5/tI9ujCIVX+P5KiHuI= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= diff --git a/vendor/github.com/libp2p/go-libp2p-pubsub-router/package.json b/vendor/github.com/libp2p/go-libp2p-pubsub-router/package.json deleted file mode 100644 index 19579e3a..00000000 --- a/vendor/github.com/libp2p/go-libp2p-pubsub-router/package.json +++ /dev/null @@ -1,97 +0,0 @@ -{ - "author": "stebalien", - "bugs": {}, - "gx": { - "dvcsimport": "github.com/libp2p/go-libp2p-pubsub-router" - }, - "gxDependencies": [ - { - "author": "whyrusleeping", - "hash": "QmTbxNB1NwDesLmKTscr4udL2tVP7MaxvXnD1D9yX7g3PN", - "name": "go-cid", - "version": "0.9.3" - }, - { - "author": "jbenet", - "hash": "QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9", - "name": "go-datastore", - "version": "3.6.1" - }, - { - "author": "hsanjuan", - "hash": "QmXSEqXLCzpCByJU4wqbJ37TcBEj77FKMUWUP1qLh56847", - "name": "go-ipfs-ds-help", - "version": "0.1.7" - }, - { - "author": "whyrusleeping", - "hash": "QmNohiVssaPw3KVLZik59DBVGTSm2dGvYT9eoXt5DQ36Yz", - "name": "go-ipfs-util", - "version": "1.2.9" - }, - { - "hash": "QmbkT7eMTyXfpeyB3ZMxxcxg7XH8t6uXp49jqzz4HB7BGF", - "name": "go-log", - "version": "1.5.9" - }, - { - "author": "whyrusleeping", - "hash": "QmcBTHN7uAMBdkzRoQ3n9cE7tGu8Ubd9zmahjskjTRw4Uf", - "name": "go-libp2p-blankhost", - "version": "0.3.26" - }, - { - "author": "whyrusleeping", - "hash": "QmYrWiWM4qtrnCeT3R14jY3ZZyirDNJgwK57q4qFYePgbd", - "name": "go-libp2p-host", - "version": "3.0.26" - }, - { - "author": "whyrusleeping", - "hash": "QmaCTz9RkrU13bm9kMB54f7atgqM4qkjDZpRwRoJiWXEqs", - "name": "go-libp2p-peerstore", - "version": "2.0.19" - }, - { - "hash": "QmbeHtaBy9nZsW4cHRcvgVY4CnDhXudE2Dr6qDxS7yg9rX", - "name": "go-libp2p-record", - "version": "4.1.15" - }, - { - "hash": "QmYxUdYY9S6yg5tSPVin5GFTvtfsLauVcr7reHDD3dM8xf", - "name": "go-libp2p-routing", - "version": "2.7.13" - }, - { - "author": "Stebalien", - "hash": "QmXwV9RskR8vpoYWu9bvKAeAWaBKyxEsEiM9yy6ezbpNBm", - "name": "go-libp2p-routing-helpers", - "version": "0.4.0" - }, - { - "author": "whyrusleeping", - "hash": "QmQVoMEL1CxrVusTSUdYsiJXVBnvSqNUpBsGybkwSfksEF", - "name": "go-libp2p-swarm", - "version": "3.0.35" - }, - { - "author": "whyrusleeping", - "hash": "QmfB4oDUTiaGEqT13P1JqCEhqW7cB1wpKtq3PP4BN8PhQd", - "name": "go-libp2p-pubsub", - "version": "0.11.16" - }, - { - "author": "whyrusleeping", - "hash": "QmYVXrKrKHDC9FobgmcmshCDyWwdrfwfanNQN4oxJ9Fk3h", - "name": "go-libp2p-peer", - "version": "3.1.2" - } - ], - "gxVersion": "0.12.1", - "language": "go", - "license": "", - "name": "go-libp2p-pubsub-router", - "releaseCmd": "git commit -a -m \"gx publish $VERSION\"", - "version": "0.5.18" -} - diff --git a/vendor/github.com/libp2p/go-libp2p-pubsub-router/pubsub.go b/vendor/github.com/libp2p/go-libp2p-pubsub-router/pubsub.go index 22b1d974..7023cb35 100644 --- a/vendor/github.com/libp2p/go-libp2p-pubsub-router/pubsub.go +++ b/vendor/github.com/libp2p/go-libp2p-pubsub-router/pubsub.go @@ -8,19 +8,19 @@ import ( "sync" "time" - cid "github.com/ipfs/go-cid" + "github.com/libp2p/go-libp2p-core/host" + "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p-core/routing" + + pubsub "github.com/libp2p/go-libp2p-pubsub" + record "github.com/libp2p/go-libp2p-record" + + "github.com/ipfs/go-cid" ds "github.com/ipfs/go-datastore" dssync "github.com/ipfs/go-datastore/sync" dshelp "github.com/ipfs/go-ipfs-ds-help" u "github.com/ipfs/go-ipfs-util" logging "github.com/ipfs/go-log" - p2phost "github.com/libp2p/go-libp2p-host" - peer "github.com/libp2p/go-libp2p-peer" - pstore "github.com/libp2p/go-libp2p-peerstore" - pubsub "github.com/libp2p/go-libp2p-pubsub" - record "github.com/libp2p/go-libp2p-record" - routing "github.com/libp2p/go-libp2p-routing" - ropts "github.com/libp2p/go-libp2p-routing/options" ) var log = logging.Logger("pubsub-valuestore") @@ -33,7 +33,7 @@ type watchGroup struct { type PubsubValueStore struct { ctx context.Context ds ds.Datastore - host p2phost.Host + host host.Host cr routing.ContentRouting ps *pubsub.PubSub @@ -60,7 +60,7 @@ func KeyToTopic(key string) string { // NewPubsubPublisher constructs a new Publisher that publishes IPNS records through pubsub. // The constructor interface is complicated by the need to bootstrap the pubsub topic. // This could be greatly simplified if the pubsub implementation handled bootstrap itself -func NewPubsubValueStore(ctx context.Context, host p2phost.Host, cr routing.ContentRouting, ps *pubsub.PubSub, validator record.Validator) *PubsubValueStore { +func NewPubsubValueStore(ctx context.Context, host host.Host, cr routing.ContentRouting, ps *pubsub.PubSub, validator record.Validator) *PubsubValueStore { return &PubsubValueStore{ ctx: ctx, @@ -77,21 +77,13 @@ func NewPubsubValueStore(ctx context.Context, host p2phost.Host, cr routing.Cont } // Publish publishes an IPNS record through pubsub with default TTL -func (p *PubsubValueStore) PutValue(ctx context.Context, key string, value []byte, opts ...ropts.Option) error { +func (p *PubsubValueStore) PutValue(ctx context.Context, key string, value []byte, opts ...routing.Option) error { // Record-store keys are arbitrary binary. However, pubsub requires UTF-8 string topic IDs. // Encode to "/record/base64url(key)" topic := KeyToTopic(key) - p.mx.Lock() - _, bootstraped := p.subs[key] - - if !bootstraped { - p.subs[key] = nil - p.mx.Unlock() - - bootstrapPubsub(p.ctx, p.cr, p.host, topic) - } else { - p.mx.Unlock() + if err := p.Subscribe(key); err != nil { + return err } log.Debugf("PubsubPublish: publish value for key", key) @@ -183,7 +175,7 @@ func (p *PubsubValueStore) getLocal(key string) ([]byte, error) { return val, nil } -func (p *PubsubValueStore) GetValue(ctx context.Context, key string, opts ...ropts.Option) ([]byte, error) { +func (p *PubsubValueStore) GetValue(ctx context.Context, key string, opts ...routing.Option) ([]byte, error) { if err := p.Subscribe(key); err != nil { return nil, err } @@ -191,7 +183,7 @@ func (p *PubsubValueStore) GetValue(ctx context.Context, key string, opts ...rop return p.getLocal(key) } -func (p *PubsubValueStore) SearchValue(ctx context.Context, key string, opts ...ropts.Option) (<-chan []byte, error) { +func (p *PubsubValueStore) SearchValue(ctx context.Context, key string, opts ...routing.Option) (<-chan []byte, error) { if err := p.Subscribe(key); err != nil { return nil, err } @@ -336,18 +328,18 @@ func (p *PubsubValueStore) notifyWatchers(key string, data []byte) { // rendezvous with peers in the name topic through provider records // Note: rendezvous/boostrap should really be handled by the pubsub implementation itself! -func bootstrapPubsub(ctx context.Context, cr routing.ContentRouting, host p2phost.Host, name string) { +func bootstrapPubsub(ctx context.Context, cr routing.ContentRouting, host host.Host, name string) { // TODO: consider changing this to `pubsub:...` topic := "floodsub:" + name hash := u.Hash([]byte(topic)) rz := cid.NewCidV1(cid.Raw, hash) - err := cr.Provide(ctx, rz, true) - if err != nil { - log.Warningf("bootstrapPubsub: error providing rendezvous for %s: %s", topic, err.Error()) - } - go func() { + err := cr.Provide(ctx, rz, true) + if err != nil { + log.Warningf("bootstrapPubsub: error providing rendezvous for %s: %s", topic, err.Error()) + } + for { select { case <-time.After(8 * time.Hour): @@ -370,7 +362,7 @@ func bootstrapPubsub(ctx context.Context, cr routing.ContentRouting, host p2phos continue } wg.Add(1) - go func(pi pstore.PeerInfo) { + go func(pi peer.AddrInfo) { defer wg.Done() ctx, cancel := context.WithTimeout(ctx, time.Second*10) diff --git a/vendor/github.com/libp2p/go-libp2p-pubsub/.travis.yml b/vendor/github.com/libp2p/go-libp2p-pubsub/.travis.yml index 4cfe98c2..5163d693 100644 --- a/vendor/github.com/libp2p/go-libp2p-pubsub/.travis.yml +++ b/vendor/github.com/libp2p/go-libp2p-pubsub/.travis.yml @@ -10,7 +10,6 @@ env: global: - GOTFLAGS="-race" matrix: - - BUILD_DEPTYPE=gx - BUILD_DEPTYPE=gomod @@ -24,7 +23,6 @@ script: cache: directories: - - $GOPATH/src/gx - $GOPATH/pkg/mod - $HOME/.cache/go-build diff --git a/vendor/github.com/libp2p/go-libp2p-pubsub/Makefile b/vendor/github.com/libp2p/go-libp2p-pubsub/Makefile deleted file mode 100644 index 3c64b37d..00000000 --- a/vendor/github.com/libp2p/go-libp2p-pubsub/Makefile +++ /dev/null @@ -1,7 +0,0 @@ -gx: - go get -u github.com/whyrusleeping/gx - go get -u github.com/whyrusleeping/gx-go - -deps: gx - gx --verbose install --global - gx-go rewrite diff --git a/vendor/github.com/libp2p/go-libp2p-pubsub/README.md b/vendor/github.com/libp2p/go-libp2p-pubsub/README.md index 38d20644..c571e7c4 100644 --- a/vendor/github.com/libp2p/go-libp2p-pubsub/README.md +++ b/vendor/github.com/libp2p/go-libp2p-pubsub/README.md @@ -3,6 +3,7 @@ [![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](http://protocol.ai) [![](https://img.shields.io/badge/project-libp2p-yellow.svg?style=flat-square)](http://github.com/libp2p/libp2p) [![](https://img.shields.io/badge/freenode-%23libp2p-yellow.svg?style=flat-square)](http://webchat.freenode.net/?channels=%23libp2p) +[![Discourse posts](https://img.shields.io/discourse/https/discuss.libp2p.io/posts.svg)](https://discuss.libp2p.io) > A pubsub system with flooding and gossiping variants. @@ -53,3 +54,7 @@ Small note: If editing the README, please conform to the [standard-readme](https ## License [MIT](LICENSE) © Jeromy Johnson + +--- + +The last gx published version of this module was: 0.11.16: QmfB4oDUTiaGEqT13P1JqCEhqW7cB1wpKtq3PP4BN8PhQd diff --git a/vendor/github.com/libp2p/go-libp2p-pubsub/blacklist.go b/vendor/github.com/libp2p/go-libp2p-pubsub/blacklist.go index 84f2efb5..ba747d81 100644 --- a/vendor/github.com/libp2p/go-libp2p-pubsub/blacklist.go +++ b/vendor/github.com/libp2p/go-libp2p-pubsub/blacklist.go @@ -2,7 +2,7 @@ package pubsub import ( lru "github.com/hashicorp/golang-lru" - peer "github.com/libp2p/go-libp2p-peer" + "github.com/libp2p/go-libp2p-core/peer" ) // Blacklist is an interface for peer blacklisting. diff --git a/vendor/github.com/libp2p/go-libp2p-pubsub/comm.go b/vendor/github.com/libp2p/go-libp2p-pubsub/comm.go index 48b620c8..d0d40da5 100644 --- a/vendor/github.com/libp2p/go-libp2p-pubsub/comm.go +++ b/vendor/github.com/libp2p/go-libp2p-pubsub/comm.go @@ -5,12 +5,14 @@ import ( "context" "io" - pb "github.com/libp2p/go-libp2p-pubsub/pb" + "github.com/libp2p/go-libp2p-core/helpers" + "github.com/libp2p/go-libp2p-core/network" + "github.com/libp2p/go-libp2p-core/peer" ggio "github.com/gogo/protobuf/io" proto "github.com/gogo/protobuf/proto" - inet "github.com/libp2p/go-libp2p-net" - peer "github.com/libp2p/go-libp2p-peer" + pb "github.com/libp2p/go-libp2p-pubsub/pb" + ms "github.com/multiformats/go-multistream" ) @@ -27,7 +29,7 @@ func (p *PubSub) getHelloPacket() *RPC { return &rpc } -func (p *PubSub) handleNewStream(s inet.Stream) { +func (p *PubSub) handleNewStream(s network.Stream) { r := ggio.NewDelimitedReader(s, 1<<20) for { rpc := new(RPC) @@ -82,7 +84,7 @@ func (p *PubSub) handleNewPeer(ctx context.Context, pid peer.ID, outgoing <-chan } } -func (p *PubSub) handlePeerEOF(ctx context.Context, s inet.Stream) { +func (p *PubSub) handlePeerEOF(ctx context.Context, s network.Stream) { r := ggio.NewDelimitedReader(s, 1<<20) rpc := new(RPC) for { @@ -98,7 +100,7 @@ func (p *PubSub) handlePeerEOF(ctx context.Context, s inet.Stream) { } } -func (p *PubSub) handleSendingMessages(ctx context.Context, s inet.Stream, outgoing <-chan *RPC) { +func (p *PubSub) handleSendingMessages(ctx context.Context, s network.Stream, outgoing <-chan *RPC) { bufw := bufio.NewWriter(s) wc := ggio.NewDelimitedWriter(bufw) @@ -111,7 +113,7 @@ func (p *PubSub) handleSendingMessages(ctx context.Context, s inet.Stream, outgo return bufw.Flush() } - defer inet.FullClose(s) + defer helpers.FullClose(s) for { select { case rpc, ok := <-outgoing: diff --git a/vendor/github.com/libp2p/go-libp2p-pubsub/floodsub.go b/vendor/github.com/libp2p/go-libp2p-pubsub/floodsub.go index ff48d957..0d57c991 100644 --- a/vendor/github.com/libp2p/go-libp2p-pubsub/floodsub.go +++ b/vendor/github.com/libp2p/go-libp2p-pubsub/floodsub.go @@ -5,9 +5,9 @@ import ( pb "github.com/libp2p/go-libp2p-pubsub/pb" - host "github.com/libp2p/go-libp2p-host" - peer "github.com/libp2p/go-libp2p-peer" - protocol "github.com/libp2p/go-libp2p-protocol" + "github.com/libp2p/go-libp2p-core/host" + "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p-core/protocol" ) const ( diff --git a/vendor/github.com/libp2p/go-libp2p-pubsub/go.mod b/vendor/github.com/libp2p/go-libp2p-pubsub/go.mod index 8b9a7c01..c22fa9b7 100644 --- a/vendor/github.com/libp2p/go-libp2p-pubsub/go.mod +++ b/vendor/github.com/libp2p/go-libp2p-pubsub/go.mod @@ -4,14 +4,10 @@ require ( github.com/gogo/protobuf v1.2.1 github.com/hashicorp/golang-lru v0.5.1 github.com/ipfs/go-log v0.0.1 - github.com/libp2p/go-libp2p-blankhost v0.0.1 - github.com/libp2p/go-libp2p-crypto v0.0.1 - github.com/libp2p/go-libp2p-host v0.0.1 - github.com/libp2p/go-libp2p-net v0.0.1 - github.com/libp2p/go-libp2p-peer v0.0.1 - github.com/libp2p/go-libp2p-protocol v0.0.1 - github.com/libp2p/go-libp2p-swarm v0.0.1 - github.com/multiformats/go-multiaddr v0.0.1 - github.com/multiformats/go-multistream v0.0.1 + github.com/libp2p/go-libp2p-blankhost v0.1.1 + github.com/libp2p/go-libp2p-core v0.0.1 + github.com/libp2p/go-libp2p-swarm v0.1.0 + github.com/multiformats/go-multiaddr v0.0.4 + github.com/multiformats/go-multistream v0.1.0 github.com/whyrusleeping/timecache v0.0.0-20160911033111-cfcb2f1abfee ) diff --git a/vendor/github.com/libp2p/go-libp2p-pubsub/go.sum b/vendor/github.com/libp2p/go-libp2p-pubsub/go.sum index 1a7e37f9..2352c3cd 100644 --- a/vendor/github.com/libp2p/go-libp2p-pubsub/go.sum +++ b/vendor/github.com/libp2p/go-libp2p-pubsub/go.sum @@ -10,8 +10,8 @@ github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVa github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= -github.com/coreos/go-semver v0.2.0 h1:3Jm3tLmsgAYcjC+4Up7hJrFBPr+n7rAqYeSw/SZazuY= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -37,18 +37,20 @@ github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+ github.com/hashicorp/golang-lru v0.5.1/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/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= github.com/ipfs/go-datastore v0.0.1/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= -github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk= -github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps= github.com/ipfs/go-ds-badger v0.0.2/go.mod h1:Y3QpeSFWQf6MopLTiZD+VT6IC1yZqaGmjvRcKeSGij8= github.com/ipfs/go-ds-leveldb v0.0.1/go.mod h1:feO8V3kubwsEF22n0YRQCffeb79OOYIykR4L04tMOYc= github.com/ipfs/go-ipfs-delay v0.0.0-20181109222059-70721b86a9a8/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= github.com/ipfs/go-log v0.0.1 h1:9XTUN/rW64BCG1YhPK9Hoy3q8nr4gOmHHBpgFdfw6Lc= github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM= +github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA= github.com/jbenet/go-temp-err-catcher v0.0.0-20150120210811-aac704a3f4f2 h1:vhC1OXXiT9R2pczegwz6moDvuRpggaroAXhPIseh57A= github.com/jbenet/go-temp-err-catcher v0.0.0-20150120210811-aac704a3f4f2/go.mod h1:8GXXJV31xl8whumTzdZsTt3RnUIiPqzkyf7mxToRCMs= github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8 h1:bspPhN+oKYFk5fcGNuQzp6IGzYQSenLEgH3s6jkXrWw= github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8/go.mod h1:Ly/wlsjFq/qrU3Rar62tu1gASgGw6chQbSh/XgIIXCY= +github.com/jbenet/goprocess v0.1.3 h1:YKyIEECS/XvcfHtBzxtjBBbWK+MbvA6dG8ASiqwvr10= +github.com/jbenet/goprocess v0.1.3/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= @@ -61,61 +63,57 @@ 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/libp2p/go-addr-util v0.0.1 h1:TpTQm9cXVRVSKsYbgQ7GKc3KbbHVTnbostgGaDEP+88= github.com/libp2p/go-addr-util v0.0.1/go.mod h1:4ac6O7n9rIAKB1dnd+s8IbbMXkt+oBpzX4/+RACcnlQ= -github.com/libp2p/go-buffer-pool v0.0.1 h1:9Rrn/H46cXjaA2HQ5Y8lyhOS1NhTkZ4yuEs2r3Eechg= github.com/libp2p/go-buffer-pool v0.0.1/go.mod h1:xtyIz9PMobb13WaxR6Zo1Pd1zXJKYg0a8KiIvDp3TzQ= -github.com/libp2p/go-conn-security v0.0.1 h1:4kMMrqrt9EUNCNjX1xagSJC+bq16uqjMe9lk1KBMVNs= -github.com/libp2p/go-conn-security v0.0.1/go.mod h1:bGmu51N0KU9IEjX7kl2PQjgZa40JQWnayTvNMgD/vyk= -github.com/libp2p/go-conn-security-multistream v0.0.1 h1:XefjAQRHcnUaxKb26RGupToucx3uU4ecbOZ3aACXlDU= -github.com/libp2p/go-conn-security-multistream v0.0.1/go.mod h1:nc9vud7inQ+d6SO0I/6dSWrdMnHnzZNHeyUQqrAJulE= +github.com/libp2p/go-buffer-pool v0.0.2 h1:QNK2iAFa8gjAe1SPz6mHSMuCcjs+X1wlHzeOSqcmlfs= +github.com/libp2p/go-buffer-pool v0.0.2/go.mod h1:MvaB6xw5vOrDl8rYZGLFdKAuk/hRoRZd1Vi32+RXyFM= +github.com/libp2p/go-conn-security-multistream v0.1.0 h1:aqGmto+ttL/uJgX0JtQI0tD21CIEy5eYd1Hlp0juHY0= +github.com/libp2p/go-conn-security-multistream v0.1.0/go.mod h1:aw6eD7LOsHEX7+2hJkDxw1MteijaVcI+/eP2/x3J1xc= github.com/libp2p/go-flow-metrics v0.0.1 h1:0gxuFd2GuK7IIP5pKljLwps6TvcuYgvG7Atqi3INF5s= github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZxBdp967ls1g+k8= -github.com/libp2p/go-libp2p-blankhost v0.0.1 h1:/mZuuiwntNR8RywnCFlGHLKrKLYne+qciBpQXWqp5fk= -github.com/libp2p/go-libp2p-blankhost v0.0.1/go.mod h1:Ibpbw/7cPPYwFb7PACIWdvxxv0t0XCCI10t7czjAjTc= -github.com/libp2p/go-libp2p-crypto v0.0.1 h1:JNQd8CmoGTohO/akqrH16ewsqZpci2CbgYH/LmYl8gw= -github.com/libp2p/go-libp2p-crypto v0.0.1/go.mod h1:yJkNyDmO341d5wwXxDUGO0LykUVT72ImHNUqh5D/dBE= -github.com/libp2p/go-libp2p-host v0.0.1 h1:dnqusU+DheGcdxrE718kG4XgHNuL2n9eEv8Rg5zy8hQ= -github.com/libp2p/go-libp2p-host v0.0.1/go.mod h1:qWd+H1yuU0m5CwzAkvbSjqKairayEHdR5MMl7Cwa7Go= -github.com/libp2p/go-libp2p-interface-connmgr v0.0.1 h1:Q9EkNSLAOF+u90L88qmE9z/fTdjLh8OsJwGw74mkwk4= -github.com/libp2p/go-libp2p-interface-connmgr v0.0.1/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k= -github.com/libp2p/go-libp2p-interface-pnet v0.0.1 h1:7GnzRrBTJHEsofi1ahFdPN9Si6skwXQE9UqR2S+Pkh8= -github.com/libp2p/go-libp2p-interface-pnet v0.0.1/go.mod h1:el9jHpQAXK5dnTpKA4yfCNBZXvrzdOU75zz+C6ryp3k= -github.com/libp2p/go-libp2p-loggables v0.0.1 h1:HVww9oAnINIxbt69LJNkxD8lnbfgteXR97Xm4p3l9ps= -github.com/libp2p/go-libp2p-loggables v0.0.1/go.mod h1:lDipDlBNYbpyqyPX/KcoO+eq0sJYEVR2JgOexcivchg= -github.com/libp2p/go-libp2p-metrics v0.0.1 h1:yumdPC/P2VzINdmcKZd0pciSUCpou+s0lwYCjBbzQZU= -github.com/libp2p/go-libp2p-metrics v0.0.1/go.mod h1:jQJ95SXXA/K1VZi13h52WZMa9ja78zjyy5rspMsC/08= -github.com/libp2p/go-libp2p-net v0.0.1 h1:xJ4Vh4yKF/XKb8fd1Ev0ebAGzVjMxXzrxG2kjtU+F5Q= -github.com/libp2p/go-libp2p-net v0.0.1/go.mod h1:Yt3zgmlsHOgUWSXmt5V/Jpz9upuJBE8EgNU9DrCcR8c= -github.com/libp2p/go-libp2p-peer v0.0.1 h1:0qwAOljzYewINrU+Kndoc+1jAL7vzY/oY2Go4DCGfyY= -github.com/libp2p/go-libp2p-peer v0.0.1/go.mod h1:nXQvOBbwVqoP+T5Y5nCjeH4sP9IX/J0AMzcDUVruVoo= -github.com/libp2p/go-libp2p-peerstore v0.0.1 h1:twKovq8YK5trLrd3nB7PD2Zu9JcyAIdm7Bz9yBWjhq8= -github.com/libp2p/go-libp2p-peerstore v0.0.1/go.mod h1:RabLyPVJLuNQ+GFyoEkfi8H4Ti6k/HtZJ7YKgtSq+20= -github.com/libp2p/go-libp2p-protocol v0.0.1 h1:+zkEmZ2yFDi5adpVE3t9dqh/N9TbpFWywowzeEzBbLM= -github.com/libp2p/go-libp2p-protocol v0.0.1/go.mod h1:Af9n4PiruirSDjHycM1QuiMi/1VZNHYcK8cLgFJLZ4s= -github.com/libp2p/go-libp2p-secio v0.0.1 h1:CqE/RdsizOwItdgLe632iyft/w0tshDLmZGAiKDcUAI= -github.com/libp2p/go-libp2p-secio v0.0.1/go.mod h1:IdG6iQybdcYmbTzxp4J5dwtUEDTOvZrT0opIDVNPrJs= -github.com/libp2p/go-libp2p-swarm v0.0.1 h1:Vne+hjaDwXqzgNwQ2vb2YKbnbOTyXjtS47stT66Apc4= -github.com/libp2p/go-libp2p-swarm v0.0.1/go.mod h1:mh+KZxkbd3lQnveQ3j2q60BM1Cw2mX36XXQqwfPOShs= -github.com/libp2p/go-libp2p-transport v0.0.1/go.mod h1:UzbUs9X+PHOSw7S3ZmeOxfnwaQY5vGDzZmKPod3N3tk= -github.com/libp2p/go-libp2p-transport v0.0.4 h1:/CPHQMN75/IQwkhBxxIo6p6PtL3rwFZtlzBROT3e8mw= -github.com/libp2p/go-libp2p-transport v0.0.4/go.mod h1:StoY3sx6IqsP6XKoabsPnHCwqKXWUMWU7Rfcsubee/A= -github.com/libp2p/go-libp2p-transport-upgrader v0.0.1 h1:rNtXkY6dty46mxYOHHAZQchI7gQdJStF683FhVnei/k= -github.com/libp2p/go-libp2p-transport-upgrader v0.0.1/go.mod h1:NJpUAgQab/8K6K0m+JmZCe5RUXG10UMEx4kWe9Ipj5c= -github.com/libp2p/go-maddr-filter v0.0.1 h1:apvYTg0aIxxQyBX+XHKOR+0+lYhGs1Yv+JmTH9nyl5I= -github.com/libp2p/go-maddr-filter v0.0.1/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= -github.com/libp2p/go-mplex v0.0.1 h1:dn2XGSrUxLtz3/8u85bGrwhUEKPX8MOF3lpmcWBZCWc= -github.com/libp2p/go-mplex v0.0.1/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0= -github.com/libp2p/go-msgio v0.0.1 h1:znj97n5FtXGCLDwe9x8jpHmY770SW4WStBGcCDh6GJw= -github.com/libp2p/go-msgio v0.0.1/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= +github.com/libp2p/go-libp2p-blankhost v0.1.1 h1:X919sCh+KLqJcNRApj43xCSiQRYqOSI88Fdf55ngf78= +github.com/libp2p/go-libp2p-blankhost v0.1.1/go.mod h1:pf2fvdLJPsC1FsVrNP3DUUvMzUts2dsLLBEpo1vW1ro= +github.com/libp2p/go-libp2p-core v0.0.1 h1:HSTZtFIq/W5Ue43Zw+uWZyy2Vl5WtF0zDjKN8/DT/1I= +github.com/libp2p/go-libp2p-core v0.0.1/go.mod h1:g/VxnTZ/1ygHxH3dKok7Vno1VfpvGcGip57wjTU4fco= +github.com/libp2p/go-libp2p-crypto v0.1.0 h1:k9MFy+o2zGDNGsaoZl0MA3iZ75qXxr9OOoAZF+sD5OQ= +github.com/libp2p/go-libp2p-crypto v0.1.0/go.mod h1:sPUokVISZiy+nNuTTH/TY+leRSxnFj/2GLjtOTW90hI= +github.com/libp2p/go-libp2p-loggables v0.1.0 h1:h3w8QFfCt2UJl/0/NW4K829HX/0S4KD31PQ7m8UXXO8= +github.com/libp2p/go-libp2p-loggables v0.1.0/go.mod h1:EyumB2Y6PrYjr55Q3/tiJ/o3xoDasoRYM7nOzEpoa90= +github.com/libp2p/go-libp2p-mplex v0.2.0/go.mod h1:Ejl9IyjvXJ0T9iqUTE1jpYATQ9NM3g+OtR+EMMODbKo= +github.com/libp2p/go-libp2p-mplex v0.2.1 h1:E1xaJBQnbSiTHGI1gaBKmKhu1TUKkErKJnE8iGvirYI= +github.com/libp2p/go-libp2p-mplex v0.2.1/go.mod h1:SC99Rxs8Vuzrf/6WhmH41kNn13TiYdAWNYHrwImKLnE= +github.com/libp2p/go-libp2p-peer v0.2.0 h1:EQ8kMjaCUwt/Y5uLgjT8iY2qg0mGUT0N1zUjer50DsY= +github.com/libp2p/go-libp2p-peer v0.2.0/go.mod h1:RCffaCvUyW2CJmG2gAWVqwePwW7JMgxjsHm7+J5kjWY= +github.com/libp2p/go-libp2p-peerstore v0.1.0 h1:MKh7pRNPHSh1fLPj8u/M/s/napdmeNpoi9BRy9lPN0E= +github.com/libp2p/go-libp2p-peerstore v0.1.0/go.mod h1:2CeHkQsr8svp4fZ+Oi9ykN1HBb6u0MOvdJ7YIsmcwtY= +github.com/libp2p/go-libp2p-secio v0.1.0 h1:NNP5KLxuP97sE5Bu3iuwOWyT/dKEGMN5zSLMWdB7GTQ= +github.com/libp2p/go-libp2p-secio v0.1.0/go.mod h1:tMJo2w7h3+wN4pgU2LSYeiKPrfqBgkOsdiKK77hE7c8= +github.com/libp2p/go-libp2p-swarm v0.1.0 h1:HrFk2p0awrGEgch9JXK/qp/hfjqQfgNxpLWnCiWPg5s= +github.com/libp2p/go-libp2p-swarm v0.1.0/go.mod h1:wQVsCdjsuZoc730CgOvh5ox6K8evllckjebkdiY5ta4= +github.com/libp2p/go-libp2p-testing v0.0.2/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= +github.com/libp2p/go-libp2p-testing v0.0.3 h1:bdij4bKaaND7tCsaXVjRfYkMpvoOeKj9AVQGJllA6jM= +github.com/libp2p/go-libp2p-testing v0.0.3/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= +github.com/libp2p/go-libp2p-transport-upgrader v0.1.1 h1:PZMS9lhjK9VytzMCW3tWHAXtKXmlURSc3ZdvwEcKCzw= +github.com/libp2p/go-libp2p-transport-upgrader v0.1.1/go.mod h1:IEtA6or8JUbsV07qPW4r01GnTenLW4oi3lOPbUMGJJA= +github.com/libp2p/go-libp2p-yamux v0.2.0 h1:TSPZ5cMMz/wdoYsye/wU1TE4G3LDGMoeEN0xgnCKU/I= +github.com/libp2p/go-libp2p-yamux v0.2.0/go.mod h1:Db2gU+XfLpm6E4rG5uGCFX6uXA8MEXOxFcRoXUODaK8= +github.com/libp2p/go-maddr-filter v0.0.4 h1:hx8HIuuwk34KePddrp2mM5ivgPkZ09JH4AvsALRbFUs= +github.com/libp2p/go-maddr-filter v0.0.4/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= +github.com/libp2p/go-mplex v0.0.3/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0= +github.com/libp2p/go-mplex v0.1.0 h1:/nBTy5+1yRyY82YaO6HXQRnO5IAGsXTjEJaR3LdTPc0= +github.com/libp2p/go-mplex v0.1.0/go.mod h1:SXgmdki2kwCUlCCbfGLEgHjC4pFqhTp0ZoV6aiKgxDU= +github.com/libp2p/go-msgio v0.0.2 h1:ivPvEKHxmVkTClHzg6RXTYHqaJQ0V9cDbq+6lKb3UV0= +github.com/libp2p/go-msgio v0.0.2/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= github.com/libp2p/go-reuseport v0.0.1 h1:7PhkfH73VXfPJYKQ6JwS5I/eVcoyYi9IMNGc6FWpFLw= github.com/libp2p/go-reuseport v0.0.1/go.mod h1:jn6RmB1ufnQwl0Q1f+YxAj8isJgDCQzaaxIFYDhcYEA= -github.com/libp2p/go-reuseport-transport v0.0.1 h1:UIRneNxLDmEGNjGHpIiWzSWkZ5bhxMCP9x3Vh7BSc7E= -github.com/libp2p/go-reuseport-transport v0.0.1/go.mod h1:YkbSDrvjUVDL6b8XqriyA20obEtsW9BLkuOUyQAOCbs= -github.com/libp2p/go-stream-muxer v0.0.1 h1:Ce6e2Pyu+b5MC1k3eeFtAax0pW4gc6MosYSLV05UeLw= +github.com/libp2p/go-reuseport-transport v0.0.2 h1:WglMwyXyBu61CMkjCCtnmqNqnjib0GIEjMiHTwR/KN4= +github.com/libp2p/go-reuseport-transport v0.0.2/go.mod h1:YkbSDrvjUVDL6b8XqriyA20obEtsW9BLkuOUyQAOCbs= github.com/libp2p/go-stream-muxer v0.0.1/go.mod h1:bAo8x7YkSpadMTbtTaxGVHWUQsR/l5MEaHbKaliuT14= -github.com/libp2p/go-tcp-transport v0.0.1 h1:WyvJVw2lYAnr6CU+GZZ4oCt06fvORlmvBlFX2+ZpZDM= -github.com/libp2p/go-tcp-transport v0.0.1/go.mod h1:mnjg0o0O5TmXUaUIanYPUqkW4+u6mK0en8rlpA6BBTs= -github.com/libp2p/go-testutil v0.0.1 h1:Xg+O0G2HIMfHqBOBDcMS1iSZJ3GEcId4qOxCQvsGZHk= -github.com/libp2p/go-testutil v0.0.1/go.mod h1:iAcJc/DKJQanJ5ws2V+u5ywdL2n12X1WbbEG+Jjy69I= +github.com/libp2p/go-stream-muxer-multistream v0.2.0 h1:714bRJ4Zy9mdhyTLJ+ZKiROmAFwUHpeRidG+q7LTQOg= +github.com/libp2p/go-stream-muxer-multistream v0.2.0/go.mod h1:j9eyPol/LLRqT+GPLSxvimPhNph4sfYfMoDPd7HkzIc= +github.com/libp2p/go-tcp-transport v0.1.0 h1:IGhowvEqyMFknOar4FWCKSWE0zL36UFKQtiRQD60/8o= +github.com/libp2p/go-tcp-transport v0.1.0/go.mod h1:oJ8I5VXryj493DEJ7OsBieu8fcg2nHGctwtInJVpipc= +github.com/libp2p/go-yamux v1.2.2 h1:s6J6o7+ajoQMjHe7BEnq+EynOj5D2EoG8CuQgL3F2vg= +github.com/libp2p/go-yamux v1.2.2/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= github.com/mattn/go-colorable v0.1.1 h1:G1f5SKeVxmagw/IyvzvtZE4Gybcc4Tr1tf7I8z0XgOg= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= github.com/mattn/go-isatty v0.0.5 h1:tHXDdz1cpzGaovsTB+TVB8q90WEokoVmfMqoVcrLUgw= @@ -124,30 +122,52 @@ github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0 github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16 h1:5W7KhL8HVF3XCFOweFD3BNESdnO8ewyYTFT2R+/b8FQ= github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= -github.com/mr-tron/base58 v1.1.0 h1:Y51FGVJ91WBqCEabAi5OPUz38eAx8DakuAm5svLcsfQ= +github.com/minio/sha256-simd v0.0.0-20190328051042-05b4dd3047e5/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= +github.com/minio/sha256-simd v0.1.0 h1:U41/2erhAKcmSI14xh/ZTUdBPOzDOIfS93ibzUSl8KM= +github.com/minio/sha256-simd v0.1.0/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= +github.com/mr-tron/base58 v1.1.1 h1:OJIdWOWYe2l5PQNgimGtuwHY8nDskvJ5vvs//YnzRLs= +github.com/mr-tron/base58 v1.1.1/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= +github.com/mr-tron/base58 v1.1.2 h1:ZEw4I2EgPKDJ2iEw0cNmLB3ROrEmkOtXIkaG7wZg+78= +github.com/mr-tron/base58 v1.1.2/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= -github.com/multiformats/go-multiaddr v0.0.1 h1:/QUV3VBMDI6pi6xfiw7lr6xhDWWvQKn9udPn68kLSdY= github.com/multiformats/go-multiaddr v0.0.1/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= -github.com/multiformats/go-multiaddr-dns v0.0.1 h1:jQt9c6tDSdQLIlBo4tXYx7QUHCPjxsB1zXcag/2S7zc= +github.com/multiformats/go-multiaddr v0.0.2/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= +github.com/multiformats/go-multiaddr v0.0.4 h1:WgMSI84/eRLdbptXMkMWDXPjPq7SPLIgGUVm2eroyU4= +github.com/multiformats/go-multiaddr v0.0.4/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= github.com/multiformats/go-multiaddr-dns v0.0.1/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= +github.com/multiformats/go-multiaddr-dns v0.0.2 h1:/Bbsgsy3R6e3jf2qBahzNHzww6usYaZ0NhNH3sqdFS8= +github.com/multiformats/go-multiaddr-dns v0.0.2/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= +github.com/multiformats/go-multiaddr-fmt v0.0.1 h1:5YjeOIzbX8OTKVaN72aOzGIYW7PnrZrnkDyOfAWRSMA= +github.com/multiformats/go-multiaddr-fmt v0.0.1/go.mod h1:aBYjqL4T/7j4Qx+R73XSv/8JsgnRFlf0w2KGLCmXl3Q= github.com/multiformats/go-multiaddr-net v0.0.1 h1:76O59E3FavvHqNg7jvzWzsPSW5JSi/ek0E4eiDVbg9g= github.com/multiformats/go-multiaddr-net v0.0.1/go.mod h1:nw6HSxNmCIQH27XPGBuX+d1tnvM7ihcFwHMSstNAVUU= +github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs= github.com/multiformats/go-multihash v0.0.1 h1:HHwN1K12I+XllBCrqKnhX949Orn4oawPkegHMu2vDqQ= github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= -github.com/multiformats/go-multistream v0.0.1 h1:JV4VfSdY9n7ECTtY59/TlSyFCzRILvYx4T4Ws8ZgihU= -github.com/multiformats/go-multistream v0.0.1/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= +github.com/multiformats/go-multihash v0.0.5 h1:1wxmCvTXAifAepIMyF39vZinRw5sbqjPs/UIi93+uik= +github.com/multiformats/go-multihash v0.0.5/go.mod h1:lt/HCbqlQwlPBz7lv0sQCdtfcMtlJvakRUn/0Ual8po= +github.com/multiformats/go-multistream v0.1.0 h1:UpO6jrsjqs46mqAK3n6wKRYFhugss9ArzbyUzU+4wkQ= +github.com/multiformats/go-multistream v0.1.0/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= 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/ginkgo v1.8.0 h1:VkHVNpR4iVnU8XQR6DBm8BqYjN7CRzw+xKUbVVbbW9w= +github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.5.0 h1:izbySO9zDPmjJ8rDjLvkA2zJHIo+HkYXHnf7eN7SSyo= +github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/opentracing/opentracing-go v1.0.2 h1:3jA2P6O1F9UOrWVpwrIo17pu01KWvNWg4X946/Y5Zwg= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= 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/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a h1:/eS3yfGjQKG+9kayBkj0ip1BGhq6zJ3eaVksphxAaek= +github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a/go.mod h1:7AyxJNCJ7SBZ1MfVQCWD6Uqo2oubI2Eq2y2eqf+A5r0= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 h1:RC6RW7j+1+HkWaX/Yh71Ee5ZHaHYt7ZP4sQgUrm6cDU= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572/go.mod h1:w0SWMsp6j9O/dk4/ZpIhL+3CkG8ofA2vuv7k+ltqUMc= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= @@ -155,29 +175,25 @@ github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpP github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1/go.mod h1:8UvriyWtv5Q5EOgjHaSseUEdkQfvwFv1I/In/O2M9gc= github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc h1:9lDbC6Rz4bwmou+oE6Dt4Cb2BGMur5eR/GYptkKUVHo= github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc/go.mod h1:bopw91TMyo8J3tvftk8xmU2kPmlrt4nScJQZU2hE5EM= -github.com/whyrusleeping/go-smux-multiplex v3.0.16+incompatible h1:iqksILj8STw03EJQe7Laj4ubnw+ojOyik18cd5vPL1o= -github.com/whyrusleeping/go-smux-multiplex v3.0.16+incompatible/go.mod h1:34LEDbeKFZInPUrAG+bjuJmUXONGdEFW7XL0SpTY1y4= -github.com/whyrusleeping/go-smux-multistream v2.0.2+incompatible h1:BdYHctE9HJZLquG9tpTdwWcbG4FaX6tVKPGjCGgiVxo= -github.com/whyrusleeping/go-smux-multistream v2.0.2+incompatible/go.mod h1:dRWHHvc4HDQSHh9gbKEBbUZ+f2Q8iZTPG3UOGYODxSQ= -github.com/whyrusleeping/go-smux-yamux v2.0.8+incompatible h1:IGm/UP/JpEFS6D787sZnZg7RA6fZIR9c/Ms9DeAVNuk= -github.com/whyrusleeping/go-smux-yamux v2.0.8+incompatible/go.mod h1:6qHUzBXUbB9MXmw3AUdB52L8sEb/hScCqOdW2kj/wuI= github.com/whyrusleeping/mafmt v1.2.8 h1:TCghSl5kkwEE0j+sU/gudyhVMRlpBin8fMBBHg59EbA= github.com/whyrusleeping/mafmt v1.2.8/go.mod h1:faQJFPbLSxzD9xpA02ttW/tS9vZykNvXwGvqIpk20FA= github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7 h1:E9S12nwJwEOXe2d6gT6qxdvqMnNq+VnSsKPgm2ZZNds= github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7/go.mod h1:X2c0RVCI1eSUFI8eLcY3c0423ykwiUdxLJtkDvruhjI= github.com/whyrusleeping/timecache v0.0.0-20160911033111-cfcb2f1abfee h1:lYbXeSvJi5zk5GLKVuid9TVjS9a0OmLIDKTfoZBL6Ow= github.com/whyrusleeping/timecache v0.0.0-20160911033111-cfcb2f1abfee/go.mod h1:m2aV4LZI4Aez7dP5PMyVKEHhUyEJ/RjmPEDOpDvudHg= -github.com/whyrusleeping/yamux v1.1.5 h1:4CK3aUUJQu0qpKZv5gEWJjNOQtdbdDhVVS6PJ+HimdE= -github.com/whyrusleeping/yamux v1.1.5/go.mod h1:E8LnQQ8HKx5KD29HZFUwM1PxCOdPRzGwur1mcYhXcD8= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b h1:+/WWzjwW6gidDJnMKWLKLX1gxn7irUTF1fLpQovfQ5M= golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25 h1:jsG6UpNLt9iAsb0S2AGW28DveNzzgmbXR+ENoPjUeIU= -golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f h1:R423Cnkcp5JABoeemiGEPlt9tHXFfw5kvc0yqlxRPWo= +golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190227160552-c95aed5357e7 h1:C2F/nMkR/9sfUTpvR3QrjBuTdvMUC/cFajkphs1YLQo= golang.org/x/net v0.0.0-20190227160552-c95aed5357e7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3 h1:0GoQqolDA55aaLxZyTzK/Y2ePZzZTUrRacwib7cNsYQ= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f h1:wMNYb4v58l5UBM7MYRLPG6ZhfOqbKu7X5eyFl8ZhKvA= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -185,8 +201,9 @@ golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20190219092855-153ac476189d/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223 h1:DH4skfRX4EBpamg7iV4ZlCpblAHI6s6TDM39bFZumv8= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190228124157-a34e9553db1e h1:ZytStCyV048ZqDsWHiYDdoI2Vd4msMcrDECFxS+tL9c= golang.org/x/sys v0.0.0-20190228124157-a34e9553db1e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d h1:+R4KGOnez64A81RvjARKc4UT5/tI9ujCIVX+P5KiHuI= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= diff --git a/vendor/github.com/libp2p/go-libp2p-pubsub/gossipsub.go b/vendor/github.com/libp2p/go-libp2p-pubsub/gossipsub.go index 81e7f616..3bb9eda1 100644 --- a/vendor/github.com/libp2p/go-libp2p-pubsub/gossipsub.go +++ b/vendor/github.com/libp2p/go-libp2p-pubsub/gossipsub.go @@ -8,9 +8,9 @@ import ( pb "github.com/libp2p/go-libp2p-pubsub/pb" - host "github.com/libp2p/go-libp2p-host" - peer "github.com/libp2p/go-libp2p-peer" - protocol "github.com/libp2p/go-libp2p-protocol" + "github.com/libp2p/go-libp2p-core/host" + "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p-core/protocol" ) const ( diff --git a/vendor/github.com/libp2p/go-libp2p-pubsub/notify.go b/vendor/github.com/libp2p/go-libp2p-pubsub/notify.go index 35f02ccb..1067cb4e 100644 --- a/vendor/github.com/libp2p/go-libp2p-pubsub/notify.go +++ b/vendor/github.com/libp2p/go-libp2p-pubsub/notify.go @@ -1,21 +1,21 @@ package pubsub import ( - inet "github.com/libp2p/go-libp2p-net" + "github.com/libp2p/go-libp2p-core/network" ma "github.com/multiformats/go-multiaddr" ) -var _ inet.Notifiee = (*PubSubNotif)(nil) +var _ network.Notifiee = (*PubSubNotif)(nil) type PubSubNotif PubSub -func (p *PubSubNotif) OpenedStream(n inet.Network, s inet.Stream) { +func (p *PubSubNotif) OpenedStream(n network.Network, s network.Stream) { } -func (p *PubSubNotif) ClosedStream(n inet.Network, s inet.Stream) { +func (p *PubSubNotif) ClosedStream(n network.Network, s network.Stream) { } -func (p *PubSubNotif) Connected(n inet.Network, c inet.Conn) { +func (p *PubSubNotif) Connected(n network.Network, c network.Conn) { go func() { select { case p.newPeers <- c.RemotePeer(): @@ -24,11 +24,11 @@ func (p *PubSubNotif) Connected(n inet.Network, c inet.Conn) { }() } -func (p *PubSubNotif) Disconnected(n inet.Network, c inet.Conn) { +func (p *PubSubNotif) Disconnected(n network.Network, c network.Conn) { } -func (p *PubSubNotif) Listen(n inet.Network, _ ma.Multiaddr) { +func (p *PubSubNotif) Listen(n network.Network, _ ma.Multiaddr) { } -func (p *PubSubNotif) ListenClose(n inet.Network, _ ma.Multiaddr) { +func (p *PubSubNotif) ListenClose(n network.Network, _ ma.Multiaddr) { } diff --git a/vendor/github.com/libp2p/go-libp2p-pubsub/package.json b/vendor/github.com/libp2p/go-libp2p-pubsub/package.json deleted file mode 100644 index b6ad15e9..00000000 --- a/vendor/github.com/libp2p/go-libp2p-pubsub/package.json +++ /dev/null @@ -1,95 +0,0 @@ -{ - "author": "whyrusleeping", - "bugs": { - "url": "https://github.com/libp2p/go-libp2p-pubsub" - }, - "gx": { - "dvcsimport": "github.com/libp2p/go-libp2p-pubsub" - }, - "gxDependencies": [ - { - "author": "whyrusleeping", - "hash": "QmYftoT56eEfUBTD3erR6heXuPSUhGRezSmhSU8LeczP8b", - "name": "timecache", - "version": "1.0.0" - }, - { - "author": "whyrusleeping", - "hash": "QmYrWiWM4qtrnCeT3R14jY3ZZyirDNJgwK57q4qFYePgbd", - "name": "go-libp2p-host", - "version": "3.0.26" - }, - { - "author": "whyrusleeping", - "hash": "QmcBTHN7uAMBdkzRoQ3n9cE7tGu8Ubd9zmahjskjTRw4Uf", - "name": "go-libp2p-blankhost", - "version": "0.3.26" - }, - { - "author": "whyrusleeping", - "hash": "QmY3ArotKMKaL7YGfbQfyDrib6RVraLqZYWXZvVgZktBxp", - "name": "go-libp2p-net", - "version": "3.0.30" - }, - { - "hash": "QmbkT7eMTyXfpeyB3ZMxxcxg7XH8t6uXp49jqzz4HB7BGF", - "name": "go-log", - "version": "1.5.9" - }, - { - "author": "multiformats", - "hash": "QmTZBfrPJmjWsCvHEtX5FE6KimVJhsJg5sBbqEFYf4UZtL", - "name": "go-multiaddr", - "version": "1.4.1" - }, - { - "author": "whyrusleeping", - "hash": "QmYVXrKrKHDC9FobgmcmshCDyWwdrfwfanNQN4oxJ9Fk3h", - "name": "go-libp2p-peer", - "version": "3.1.2" - }, - { - "author": "whyrusleeping", - "hash": "QmZNkThpqfVXs9GNbexPrfBbXSLNYeKrE7jwFM2oqHbyqN", - "name": "go-libp2p-protocol", - "version": "1.0.0" - }, - { - "author": "whyrusleeping", - "hash": "Qma3Xp3FXFSP4prirEiRYHJ2tgGE8EAx9i6JLziPLpAQjq", - "name": "go-libp2p-swarm", - "version": "3.0.34" - }, - { - "author": "whyrusleeping", - "hash": "QmddjPSGZb3ieihSseFeCfVRpZzcqczPNsD2DvarSwnjJB", - "name": "gogo-protobuf", - "version": "1.2.1" - }, - { - "author": "whyrusleeping", - "hash": "QmTW4SdgBWq9GjsBsHeUx8WuGxzhgzAf88UMH2w62PC8yK", - "name": "go-libp2p-crypto", - "version": "2.0.7" - }, - { - "author": "whyrusleeping", - "hash": "QmabLh8TrJ3emfAoQk5AbqbLTbMyj7XqumMFmAFxa9epo8", - "name": "go-multistream", - "version": "0.3.9" - }, - { - "author": "hashicorp", - "hash": "QmQjMHF8ptRgx4E57UFMiT4YM6kqaJeYxZ1MCDX23aw4rK", - "name": "golang-lru", - "version": "2017.10.18" - } - ], - "gxVersion": "0.9.0", - "language": "go", - "license": "MIT", - "name": "go-libp2p-pubsub", - "releaseCmd": "git commit -a -m \"gx publish $VERSION\"", - "version": "0.11.15" -} - diff --git a/vendor/github.com/libp2p/go-libp2p-pubsub/pubsub.go b/vendor/github.com/libp2p/go-libp2p-pubsub/pubsub.go index 79e48d0d..6df169d8 100644 --- a/vendor/github.com/libp2p/go-libp2p-pubsub/pubsub.go +++ b/vendor/github.com/libp2p/go-libp2p-pubsub/pubsub.go @@ -5,26 +5,22 @@ import ( "encoding/binary" "fmt" "math/rand" + "sync" "sync/atomic" "time" pb "github.com/libp2p/go-libp2p-pubsub/pb" + "github.com/libp2p/go-libp2p-core/crypto" + "github.com/libp2p/go-libp2p-core/host" + "github.com/libp2p/go-libp2p-core/network" + "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p-core/protocol" + logging "github.com/ipfs/go-log" - crypto "github.com/libp2p/go-libp2p-crypto" - host "github.com/libp2p/go-libp2p-host" - inet "github.com/libp2p/go-libp2p-net" - peer "github.com/libp2p/go-libp2p-peer" - protocol "github.com/libp2p/go-libp2p-protocol" timecache "github.com/whyrusleeping/timecache" ) -const ( - defaultValidateTimeout = 150 * time.Millisecond - defaultValidateConcurrency = 100 - defaultValidateThrottle = 8192 -) - var ( TimeCacheDuration = 120 * time.Second ) @@ -44,6 +40,8 @@ type PubSub struct { rt PubSubRouter + val *validation + // incoming messages from other peers incoming chan *RPC @@ -66,7 +64,7 @@ type PubSub struct { newPeers chan peer.ID // a notification channel for new outoging peer streams - newPeerStream chan inet.Stream + newPeerStream chan network.Stream // a notification channel for errors opening new peer streams newPeerError chan peer.ID @@ -89,12 +87,6 @@ type PubSub struct { // rmVal handles validator unregistration requests rmVal chan *rmValReq - // topicVals tracks per topic validators - topicVals map[string]*topicVal - - // validateThrottle limits the number of active validation goroutines - validateThrottle chan struct{} - // eval thunk in event loop eval chan func() @@ -102,8 +94,10 @@ type PubSub struct { blacklist Blacklist blacklistPeer chan peer.ID - peers map[peer.ID]chan *RPC - seenMessages *timecache.TimeCache + peers map[peer.ID]chan *RPC + + seenMessagesMx sync.Mutex + seenMessages *timecache.TimeCache // key for signing messages; nil when signing is disabled (default for now) signKey crypto.PrivKey @@ -159,34 +153,34 @@ type Option func(*PubSub) error // NewPubSub returns a new PubSub management object. func NewPubSub(ctx context.Context, h host.Host, rt PubSubRouter, opts ...Option) (*PubSub, error) { ps := &PubSub{ - host: h, - ctx: ctx, - rt: rt, - signID: h.ID(), - signKey: h.Peerstore().PrivKey(h.ID()), - incoming: make(chan *RPC, 32), - publish: make(chan *Message), - newPeers: make(chan peer.ID), - newPeerStream: make(chan inet.Stream), - newPeerError: make(chan peer.ID), - peerDead: make(chan peer.ID), - cancelCh: make(chan *Subscription), - getPeers: make(chan *listPeerReq), - addSub: make(chan *addSubReq), - getTopics: make(chan *topicReq), - sendMsg: make(chan *sendReq, 32), - addVal: make(chan *addValReq), - rmVal: make(chan *rmValReq), - validateThrottle: make(chan struct{}, defaultValidateThrottle), - eval: make(chan func()), - myTopics: make(map[string]map[*Subscription]struct{}), - topics: make(map[string]map[peer.ID]struct{}), - peers: make(map[peer.ID]chan *RPC), - topicVals: make(map[string]*topicVal), - blacklist: NewMapBlacklist(), - blacklistPeer: make(chan peer.ID), - seenMessages: timecache.NewTimeCache(TimeCacheDuration), - counter: uint64(time.Now().UnixNano()), + host: h, + ctx: ctx, + rt: rt, + val: newValidation(), + signID: h.ID(), + signKey: h.Peerstore().PrivKey(h.ID()), + signStrict: true, + incoming: make(chan *RPC, 32), + publish: make(chan *Message), + newPeers: make(chan peer.ID), + newPeerStream: make(chan network.Stream), + newPeerError: make(chan peer.ID), + peerDead: make(chan peer.ID), + cancelCh: make(chan *Subscription), + getPeers: make(chan *listPeerReq), + addSub: make(chan *addSubReq), + getTopics: make(chan *topicReq), + sendMsg: make(chan *sendReq, 32), + addVal: make(chan *addValReq), + rmVal: make(chan *rmValReq), + eval: make(chan func()), + myTopics: make(map[string]map[*Subscription]struct{}), + topics: make(map[string]map[peer.ID]struct{}), + peers: make(map[peer.ID]chan *RPC), + blacklist: NewMapBlacklist(), + blacklistPeer: make(chan peer.ID), + seenMessages: timecache.NewTimeCache(TimeCacheDuration), + counter: uint64(time.Now().UnixNano()), } for _, opt := range opts { @@ -207,20 +201,13 @@ func NewPubSub(ctx context.Context, h host.Host, rt PubSubRouter, opts ...Option } h.Network().Notify((*PubSubNotif)(ps)) + ps.val.Start(ps) + go ps.processLoop(ctx) return ps, nil } -// WithValidateThrottle sets the upper bound on the number of active validation -// goroutines. -func WithValidateThrottle(n int) Option { - return func(ps *PubSub) error { - ps.validateThrottle = make(chan struct{}, n) - return nil - } -} - // WithMessageSigning enables or disables message signing (enabled by default). func WithMessageSigning(enabled bool) Option { return func(p *PubSub) error { @@ -231,6 +218,7 @@ func WithMessageSigning(enabled bool) Option { } } else { p.signKey = nil + p.signStrict = false } return nil } @@ -256,11 +244,8 @@ func WithMessageAuthor(author peer.ID) Option { } } -// WithStrictSignatureVerification enforces message signing. If set, unsigned -// messages will be discarded. -// -// This currently defaults to false but, as we transition to signing by default, -// will eventually default to true. +// WithStrictSignatureVerification is an option to enable or disable strict message signing. +// When enabled (which is the default), unsigned messages will be discarded. func WithStrictSignatureVerification(required bool) Option { return func(p *PubSub) error { p.signStrict = required @@ -336,7 +321,7 @@ func (p *PubSub) processLoop(ctx context.Context) { close(ch) - if p.host.Network().Connectedness(pid) == inet.Connected { + if p.host.Network().Connectedness(pid) == network.Connected { // still connected, must be a duplicate connection being closed. // we respawn the writer as we need to ensure there is a stream active log.Warning("peer declared dead but still connected; respawning writer: ", pid) @@ -385,17 +370,16 @@ func (p *PubSub) processLoop(ctx context.Context) { p.handleIncomingRPC(rpc) case msg := <-p.publish: - vals := p.getValidators(msg) - p.pushMsg(vals, p.host.ID(), msg) + p.pushMsg(p.host.ID(), msg) case req := <-p.sendMsg: p.publishMessage(req.from, req.msg.Message) case req := <-p.addVal: - p.addValidator(req) + p.val.AddValidator(req) case req := <-p.rmVal: - p.rmValidator(req) + p.val.RemoveValidator(req) case thunk := <-p.eval: thunk() @@ -543,12 +527,22 @@ func (p *PubSub) notifySubs(msg *pb.Message) { // seenMessage returns whether we already saw this message before func (p *PubSub) seenMessage(id string) bool { + p.seenMessagesMx.Lock() + defer p.seenMessagesMx.Unlock() return p.seenMessages.Has(id) } // markSeen marks a message as seen such that seenMessage returns `true' for the given id -func (p *PubSub) markSeen(id string) { +// returns true if the message was freshly marked +func (p *PubSub) markSeen(id string) bool { + p.seenMessagesMx.Lock() + defer p.seenMessagesMx.Unlock() + if p.seenMessages.Has(id) { + return false + } + p.seenMessages.Add(id) + return true } // subscribedToMessage returns whether we are subscribed to one of the topics @@ -593,8 +587,7 @@ func (p *PubSub) handleIncomingRPC(rpc *RPC) { } msg := &Message{pmsg} - vals := p.getValidators(msg) - p.pushMsg(vals, rpc.from, msg) + p.pushMsg(rpc.from, msg) } p.rt.HandleRPC(rpc) @@ -606,7 +599,7 @@ func msgID(pmsg *pb.Message) string { } // pushMsg pushes a message performing validation as necessary -func (p *PubSub) pushMsg(vals []*topicVal, src peer.ID, msg *Message) { +func (p *PubSub) pushMsg(src peer.ID, msg *Message) { // reject messages from blacklisted peers if p.blacklist.Contains(src) { log.Warningf("dropping message from blacklisted peer %s", src) @@ -631,148 +624,20 @@ func (p *PubSub) pushMsg(vals []*topicVal, src peer.ID, msg *Message) { return } - if len(vals) > 0 || msg.Signature != nil { - // validation is asynchronous and globally throttled with the throttleValidate semaphore. - // the purpose of the global throttle is to bound the goncurrency possible from incoming - // network traffic; each validator also has an individual throttle to preclude - // slow (or faulty) validators from starving other topics; see validate below. - select { - case p.validateThrottle <- struct{}{}: - go func() { - p.validate(vals, src, msg) - <-p.validateThrottle - }() - default: - log.Warningf("message validation throttled; dropping message from %s", src) - } + if !p.val.Push(src, msg) { return } - p.publishMessage(src, msg.Message) -} - -// validate performs validation and only sends the message if all validators succeed -func (p *PubSub) validate(vals []*topicVal, src peer.ID, msg *Message) { - if msg.Signature != nil { - if !p.validateSignature(msg) { - log.Warningf("message signature validation failed; dropping message from %s", src) - return - } - } - - if len(vals) > 0 { - if !p.validateTopic(vals, src, msg) { - log.Warningf("message validation failed; dropping message from %s", src) - return - } - } - - // all validators were successful, send the message - p.sendMsg <- &sendReq{ - from: src, - msg: msg, - } -} - -func (p *PubSub) validateSignature(msg *Message) bool { - err := verifyMessageSignature(msg.Message) - if err != nil { - log.Debugf("signature verification error: %s", err.Error()) - return false - } - - return true -} - -func (p *PubSub) validateTopic(vals []*topicVal, src peer.ID, msg *Message) bool { - if len(vals) == 1 { - return p.validateSingleTopic(vals[0], src, msg) - } - - ctx, cancel := context.WithCancel(p.ctx) - defer cancel() - - rch := make(chan bool, len(vals)) - rcount := 0 - throttle := false - -loop: - for _, val := range vals { - rcount++ - - select { - case val.validateThrottle <- struct{}{}: - go func(val *topicVal) { - rch <- val.validateMsg(ctx, src, msg) - <-val.validateThrottle - }(val) - - default: - log.Debugf("validation throttled for topic %s", val.topic) - throttle = true - break loop - } - } - - if throttle { - return false - } - - for i := 0; i < rcount; i++ { - valid := <-rch - if !valid { - return false - } - } - - return true -} - -// fast path for single topic validation that avoids the extra goroutine -func (p *PubSub) validateSingleTopic(val *topicVal, src peer.ID, msg *Message) bool { - select { - case val.validateThrottle <- struct{}{}: - ctx, cancel := context.WithCancel(p.ctx) - defer cancel() - - res := val.validateMsg(ctx, src, msg) - <-val.validateThrottle - - return res - - default: - log.Debugf("validation throttled for topic %s", val.topic) - return false + if p.markSeen(id) { + p.publishMessage(src, msg.Message) } } func (p *PubSub) publishMessage(from peer.ID, pmsg *pb.Message) { - id := msgID(pmsg) - if p.seenMessage(id) { - return - } - p.markSeen(id) - p.notifySubs(pmsg) p.rt.Publish(from, pmsg) } -// getValidators returns all validators that apply to a given message -func (p *PubSub) getValidators(msg *Message) []*topicVal { - var vals []*topicVal - - for _, topic := range msg.GetTopicIDs() { - val, ok := p.topicVals[topic] - if !ok { - continue - } - - vals = append(vals, val) - } - - return vals -} - type addSubReq struct { sub *Subscription resp chan *Subscription @@ -884,50 +749,10 @@ func (p *PubSub) BlacklistPeer(pid peer.ID) { p.blacklistPeer <- pid } -// per topic validators -type addValReq struct { - topic string - validate Validator - timeout time.Duration - throttle int - resp chan error -} - -type rmValReq struct { - topic string - resp chan error -} - -type topicVal struct { - topic string - validate Validator - validateTimeout time.Duration - validateThrottle chan struct{} -} - -// Validator is a function that validates a message. -type Validator func(context.Context, peer.ID, *Message) bool - -// ValidatorOpt is an option for RegisterTopicValidator. -type ValidatorOpt func(addVal *addValReq) error - -// WithValidatorTimeout is an option that sets the topic validator timeout. -func WithValidatorTimeout(timeout time.Duration) ValidatorOpt { - return func(addVal *addValReq) error { - addVal.timeout = timeout - return nil - } -} - -// WithValidatorConcurrency is an option that sets topic validator throttle. -func WithValidatorConcurrency(n int) ValidatorOpt { - return func(addVal *addValReq) error { - addVal.throttle = n - return nil - } -} - // RegisterTopicValidator registers a validator for topic. +// By default validators are asynchronous, which means they will run in a separate goroutine. +// The number of active goroutines is controlled by global and per topic validator +// throttles; if it exceeds the throttle threshold, messages will be dropped. func (p *PubSub) RegisterTopicValidator(topic string, val Validator, opts ...ValidatorOpt) error { addVal := &addValReq{ topic: topic, @@ -946,34 +771,6 @@ func (p *PubSub) RegisterTopicValidator(topic string, val Validator, opts ...Val return <-addVal.resp } -func (ps *PubSub) addValidator(req *addValReq) { - topic := req.topic - - _, ok := ps.topicVals[topic] - if ok { - req.resp <- fmt.Errorf("Duplicate validator for topic %s", topic) - return - } - - val := &topicVal{ - topic: topic, - validate: req.validate, - validateTimeout: defaultValidateTimeout, - validateThrottle: make(chan struct{}, defaultValidateConcurrency), - } - - if req.timeout > 0 { - val.validateTimeout = req.timeout - } - - if req.throttle > 0 { - val.validateThrottle = make(chan struct{}, req.throttle) - } - - ps.topicVals[topic] = val - req.resp <- nil -} - // UnregisterTopicValidator removes a validator from a topic. // Returns an error if there was no validator registered with the topic. func (p *PubSub) UnregisterTopicValidator(topic string) error { @@ -985,27 +782,3 @@ func (p *PubSub) UnregisterTopicValidator(topic string) error { p.rmVal <- rmVal return <-rmVal.resp } - -func (ps *PubSub) rmValidator(req *rmValReq) { - topic := req.topic - - _, ok := ps.topicVals[topic] - if ok { - delete(ps.topicVals, topic) - req.resp <- nil - } else { - req.resp <- fmt.Errorf("No validator for topic %s", topic) - } -} - -func (val *topicVal) validateMsg(ctx context.Context, src peer.ID, msg *Message) bool { - vctx, cancel := context.WithTimeout(ctx, val.validateTimeout) - defer cancel() - - valid := val.validate(vctx, src, msg) - if !valid { - log.Debugf("validation failed for topic %s", val.topic) - } - - return valid -} diff --git a/vendor/github.com/libp2p/go-libp2p-pubsub/randomsub.go b/vendor/github.com/libp2p/go-libp2p-pubsub/randomsub.go index adb85ad5..e4304d23 100644 --- a/vendor/github.com/libp2p/go-libp2p-pubsub/randomsub.go +++ b/vendor/github.com/libp2p/go-libp2p-pubsub/randomsub.go @@ -5,9 +5,9 @@ import ( pb "github.com/libp2p/go-libp2p-pubsub/pb" - host "github.com/libp2p/go-libp2p-host" - peer "github.com/libp2p/go-libp2p-peer" - protocol "github.com/libp2p/go-libp2p-protocol" + "github.com/libp2p/go-libp2p-core/host" + "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p-core/protocol" ) const ( diff --git a/vendor/github.com/libp2p/go-libp2p-pubsub/sign.go b/vendor/github.com/libp2p/go-libp2p-pubsub/sign.go index 056c96b1..ea76214e 100644 --- a/vendor/github.com/libp2p/go-libp2p-pubsub/sign.go +++ b/vendor/github.com/libp2p/go-libp2p-pubsub/sign.go @@ -5,8 +5,8 @@ import ( pb "github.com/libp2p/go-libp2p-pubsub/pb" - crypto "github.com/libp2p/go-libp2p-crypto" - peer "github.com/libp2p/go-libp2p-peer" + "github.com/libp2p/go-libp2p-core/crypto" + "github.com/libp2p/go-libp2p-core/peer" ) const SignPrefix = "libp2p-pubsub:" diff --git a/vendor/github.com/libp2p/go-libp2p-pubsub/validation.go b/vendor/github.com/libp2p/go-libp2p-pubsub/validation.go new file mode 100644 index 00000000..b7e473d9 --- /dev/null +++ b/vendor/github.com/libp2p/go-libp2p-pubsub/validation.go @@ -0,0 +1,391 @@ +package pubsub + +import ( + "context" + "fmt" + "runtime" + "time" + + "github.com/libp2p/go-libp2p-core/peer" +) + +const ( + defaultValidateConcurrency = 1024 + defaultValidateThrottle = 8192 +) + +// Validator is a function that validates a message. +type Validator func(context.Context, peer.ID, *Message) bool + +// ValidatorOpt is an option for RegisterTopicValidator. +type ValidatorOpt func(addVal *addValReq) error + +// validation represents the validator pipeline. +// The validator pipeline performs signature validation and runs a +// sequence of user-configured validators per-topic. It is possible to +// adjust various concurrency parameters, such as the number of +// workers and the max number of simultaneous validations. The user +// can also attach inline validators that will be executed +// synchronously; this may be useful to prevent superfluous +// context-switching for lightweight tasks. +type validation struct { + p *PubSub + + // topicVals tracks per topic validators + topicVals map[string]*topicVal + + // validateQ is the front-end to the validation pipeline + validateQ chan *validateReq + + // validateThrottle limits the number of active validation goroutines + validateThrottle chan struct{} + + // this is the number of synchronous validation workers + validateWorkers int +} + +// validation requests +type validateReq struct { + vals []*topicVal + src peer.ID + msg *Message +} + +// representation of topic validators +type topicVal struct { + topic string + validate Validator + validateTimeout time.Duration + validateThrottle chan struct{} + validateInline bool +} + +// async request to add a topic validators +type addValReq struct { + topic string + validate Validator + timeout time.Duration + throttle int + inline bool + resp chan error +} + +// async request to remove a topic validator +type rmValReq struct { + topic string + resp chan error +} + +// newValidation creates a new validation pipeline +func newValidation() *validation { + return &validation{ + topicVals: make(map[string]*topicVal), + validateQ: make(chan *validateReq, 32), + validateThrottle: make(chan struct{}, defaultValidateThrottle), + validateWorkers: runtime.NumCPU(), + } +} + +// Start attaches the validation pipeline to a pubsub instance and starts background +// workers +func (v *validation) Start(p *PubSub) { + v.p = p + for i := 0; i < v.validateWorkers; i++ { + go v.validateWorker() + } +} + +// AddValidator adds a new validator +func (v *validation) AddValidator(req *addValReq) { + topic := req.topic + + _, ok := v.topicVals[topic] + if ok { + req.resp <- fmt.Errorf("Duplicate validator for topic %s", topic) + return + } + + val := &topicVal{ + topic: topic, + validate: req.validate, + validateTimeout: 0, + validateThrottle: make(chan struct{}, defaultValidateConcurrency), + validateInline: req.inline, + } + + if req.timeout > 0 { + val.validateTimeout = req.timeout + } + + if req.throttle > 0 { + val.validateThrottle = make(chan struct{}, req.throttle) + } + + v.topicVals[topic] = val + req.resp <- nil +} + +// RemoveValidator removes an existing validator +func (v *validation) RemoveValidator(req *rmValReq) { + topic := req.topic + + _, ok := v.topicVals[topic] + if ok { + delete(v.topicVals, topic) + req.resp <- nil + } else { + req.resp <- fmt.Errorf("No validator for topic %s", topic) + } +} + +// Push pushes a message into the validation pipeline. +// It returns true if the message can be forwarded immediately without validation. +func (v *validation) Push(src peer.ID, msg *Message) bool { + vals := v.getValidators(msg) + + if len(vals) > 0 || msg.Signature != nil { + select { + case v.validateQ <- &validateReq{vals, src, msg}: + default: + log.Warningf("message validation throttled; dropping message from %s", src) + } + return false + } + + return true +} + +// getValidators returns all validators that apply to a given message +func (v *validation) getValidators(msg *Message) []*topicVal { + var vals []*topicVal + + for _, topic := range msg.GetTopicIDs() { + val, ok := v.topicVals[topic] + if !ok { + continue + } + + vals = append(vals, val) + } + + return vals +} + +// validateWorker is an active goroutine performing inline validation +func (v *validation) validateWorker() { + for { + select { + case req := <-v.validateQ: + v.validate(req.vals, req.src, req.msg) + case <-v.p.ctx.Done(): + return + } + } +} + +// validate performs validation and only sends the message if all validators succeed +// signature validation is performed synchronously, while user validators are invoked +// asynchronously, throttled by the global validation throttle. +func (v *validation) validate(vals []*topicVal, src peer.ID, msg *Message) { + if msg.Signature != nil { + if !v.validateSignature(msg) { + log.Warningf("message signature validation failed; dropping message from %s", src) + return + } + } + + // we can mark the message as seen now that we have verified the signature + // and avoid invoking user validators more than once + id := msgID(msg.Message) + if !v.p.markSeen(id) { + return + } + + var inline, async []*topicVal + for _, val := range vals { + if val.validateInline { + inline = append(inline, val) + } else { + async = append(async, val) + } + } + + // apply inline (synchronous) validators + for _, val := range inline { + if !val.validateMsg(v.p.ctx, src, msg) { + log.Debugf("message validation failed; dropping message from %s", src) + return + } + } + + // apply async validators + if len(async) > 0 { + select { + case v.validateThrottle <- struct{}{}: + go func() { + v.doValidateTopic(async, src, msg) + <-v.validateThrottle + }() + default: + log.Warningf("message validation throttled; dropping message from %s", src) + } + return + } + + // no async validators, send the message + v.p.sendMsg <- &sendReq{ + from: src, + msg: msg, + } +} + +func (v *validation) validateSignature(msg *Message) bool { + err := verifyMessageSignature(msg.Message) + if err != nil { + log.Debugf("signature verification error: %s", err.Error()) + return false + } + + return true +} + +func (v *validation) doValidateTopic(vals []*topicVal, src peer.ID, msg *Message) { + if !v.validateTopic(vals, src, msg) { + log.Warningf("message validation failed; dropping message from %s", src) + return + } + + v.p.sendMsg <- &sendReq{ + from: src, + msg: msg, + } +} + +func (v *validation) validateTopic(vals []*topicVal, src peer.ID, msg *Message) bool { + if len(vals) == 1 { + return v.validateSingleTopic(vals[0], src, msg) + } + + ctx, cancel := context.WithCancel(v.p.ctx) + defer cancel() + + rch := make(chan bool, len(vals)) + rcount := 0 + throttle := false + +loop: + for _, val := range vals { + rcount++ + + select { + case val.validateThrottle <- struct{}{}: + go func(val *topicVal) { + rch <- val.validateMsg(ctx, src, msg) + <-val.validateThrottle + }(val) + + default: + log.Debugf("validation throttled for topic %s", val.topic) + throttle = true + break loop + } + } + + if throttle { + return false + } + + for i := 0; i < rcount; i++ { + valid := <-rch + if !valid { + return false + } + } + + return true +} + +// fast path for single topic validation that avoids the extra goroutine +func (v *validation) validateSingleTopic(val *topicVal, src peer.ID, msg *Message) bool { + select { + case val.validateThrottle <- struct{}{}: + res := val.validateMsg(v.p.ctx, src, msg) + <-val.validateThrottle + + return res + + default: + log.Debugf("validation throttled for topic %s", val.topic) + return false + } +} + +func (val *topicVal) validateMsg(ctx context.Context, src peer.ID, msg *Message) bool { + if val.validateTimeout > 0 { + var cancel func() + ctx, cancel = context.WithTimeout(ctx, val.validateTimeout) + defer cancel() + } + + valid := val.validate(ctx, src, msg) + if !valid { + log.Debugf("validation failed for topic %s", val.topic) + } + + return valid +} + +/// Options + +// WithValidateThrottle sets the upper bound on the number of active validation +// goroutines across all topics. The default is 8192. +func WithValidateThrottle(n int) Option { + return func(ps *PubSub) error { + ps.val.validateThrottle = make(chan struct{}, n) + return nil + } +} + +// WithValidateWorkers sets the number of synchronous validation worker goroutines. +// Defaults to NumCPU. +// +// The synchronous validation workers perform signature validation, apply inline +// user validators, and schedule asynchronous user validators. +// You can adjust this parameter to devote less cpu time to synchronous validation. +func WithValidateWorkers(n int) Option { + return func(ps *PubSub) error { + if n > 0 { + ps.val.validateWorkers = n + return nil + } + return fmt.Errorf("number of validation workers must be > 0") + } +} + +// WithValidatorTimeout is an option that sets a timeout for an (asynchronous) topic validator. +// By default there is no timeout in asynchronous validators. +func WithValidatorTimeout(timeout time.Duration) ValidatorOpt { + return func(addVal *addValReq) error { + addVal.timeout = timeout + return nil + } +} + +// WithValidatorConcurrency is an option that sets the topic validator throttle. +// This controls the number of active validation goroutines for the topic; the default is 1024. +func WithValidatorConcurrency(n int) ValidatorOpt { + return func(addVal *addValReq) error { + addVal.throttle = n + return nil + } +} + +// WithValidatorInline is an option that sets the validation disposition to synchronous: +// it will be executed inline in validation front-end, without spawning a new goroutine. +// This is suitable for simple or cpu-bound validators that do not block. +func WithValidatorInline(inline bool) ValidatorOpt { + return func(addVal *addValReq) error { + addVal.inline = inline + return nil + } +} diff --git a/vendor/github.com/libp2p/go-libp2p-quic-transport/.travis.yml b/vendor/github.com/libp2p/go-libp2p-quic-transport/.travis.yml index 82a83dbf..6188a488 100644 --- a/vendor/github.com/libp2p/go-libp2p-quic-transport/.travis.yml +++ b/vendor/github.com/libp2p/go-libp2p-quic-transport/.travis.yml @@ -34,4 +34,3 @@ after_success: cache: directories: - - $GOPATH/src/gx diff --git a/vendor/github.com/libp2p/go-libp2p-quic-transport/README.md b/vendor/github.com/libp2p/go-libp2p-quic-transport/README.md index 21f6379c..e480b1bd 100644 --- a/vendor/github.com/libp2p/go-libp2p-quic-transport/README.md +++ b/vendor/github.com/libp2p/go-libp2p-quic-transport/README.md @@ -1,11 +1,19 @@ # go-quic-transport +[![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](https://protocol.ai) +[![](https://img.shields.io/badge/project-libp2p-yellow.svg?style=flat-square)](https://libp2p.io/) +[![](https://img.shields.io/badge/freenode-%23libp2p-yellow.svg?style=flat-square)](http://webchat.freenode.net/?channels=%23libp2p) [![Godoc Reference](https://img.shields.io/badge/godoc-reference-blue.svg?style=flat-square)](https://godoc.org/github.com/libp2p/go-libp2p-quic-transport) [![Linux Build Status](https://img.shields.io/travis/libp2p/go-libp2p-quic-transport/master.svg?style=flat-square&label=linux+build)](https://travis-ci.org/libp2p/go-libp2p-quic-transport) [![Code Coverage](https://img.shields.io/codecov/c/github/libp2p/go-libp2p-quic-transport/master.svg?style=flat-square)](https://codecov.io/gh/libp2p/go-libp2p-quic-transport/) +[![Discourse posts](https://img.shields.io/discourse/https/discuss.libp2p.io/posts.svg)](https://discuss.libp2p.io) This is an implementation of the [libp2p transport](https://github.com/libp2p/go-libp2p-transport/blob/master/transport.go) and the [libp2p stream muxer](https://github.com/libp2p/go-stream-muxer) using QUIC. ## Known limitations * currently only works with RSA host keys + +--- + +The last gx published version of this module was: diff --git a/vendor/github.com/libp2p/go-libp2p-quic-transport/conn.go b/vendor/github.com/libp2p/go-libp2p-quic-transport/conn.go index ed837835..bf173458 100644 --- a/vendor/github.com/libp2p/go-libp2p-quic-transport/conn.go +++ b/vendor/github.com/libp2p/go-libp2p-quic-transport/conn.go @@ -1,10 +1,11 @@ package libp2pquic import ( - ic "github.com/libp2p/go-libp2p-crypto" - peer "github.com/libp2p/go-libp2p-peer" - tpt "github.com/libp2p/go-libp2p-transport" - smux "github.com/libp2p/go-stream-muxer" + ic "github.com/libp2p/go-libp2p-core/crypto" + "github.com/libp2p/go-libp2p-core/mux" + "github.com/libp2p/go-libp2p-core/peer" + tpt "github.com/libp2p/go-libp2p-core/transport" + quic "github.com/lucas-clemente/quic-go" ma "github.com/multiformats/go-multiaddr" ) @@ -22,7 +23,7 @@ type conn struct { remoteMultiaddr ma.Multiaddr } -var _ tpt.Conn = &conn{} +var _ tpt.CapableConn = &conn{} func (c *conn) Close() error { return c.sess.Close() @@ -34,13 +35,13 @@ func (c *conn) IsClosed() bool { } // OpenStream creates a new stream. -func (c *conn) OpenStream() (smux.Stream, error) { +func (c *conn) OpenStream() (mux.MuxedStream, error) { qstr, err := c.sess.OpenStreamSync() return &stream{Stream: qstr}, err } // AcceptStream accepts a stream opened by the other side. -func (c *conn) AcceptStream() (smux.Stream, error) { +func (c *conn) AcceptStream() (mux.MuxedStream, error) { qstr, err := c.sess.AcceptStream() return &stream{Stream: qstr}, err } diff --git a/vendor/github.com/libp2p/go-libp2p-quic-transport/crypto.go b/vendor/github.com/libp2p/go-libp2p-quic-transport/crypto.go index 1ce18bcb..68a30a62 100644 --- a/vendor/github.com/libp2p/go-libp2p-quic-transport/crypto.go +++ b/vendor/github.com/libp2p/go-libp2p-quic-transport/crypto.go @@ -11,8 +11,8 @@ import ( "time" "github.com/gogo/protobuf/proto" - ic "github.com/libp2p/go-libp2p-crypto" - pb "github.com/libp2p/go-libp2p-crypto/pb" + ic "github.com/libp2p/go-libp2p-core/crypto" + pb "github.com/libp2p/go-libp2p-core/crypto/pb" ) // mint certificate selection is broken. diff --git a/vendor/github.com/libp2p/go-libp2p-quic-transport/go.mod b/vendor/github.com/libp2p/go-libp2p-quic-transport/go.mod index c7bf89e2..c5bdc64c 100644 --- a/vendor/github.com/libp2p/go-libp2p-quic-transport/go.mod +++ b/vendor/github.com/libp2p/go-libp2p-quic-transport/go.mod @@ -2,12 +2,9 @@ module github.com/libp2p/go-libp2p-quic-transport require ( github.com/gogo/protobuf v1.2.1 - github.com/libp2p/go-libp2p-crypto v0.0.1 - github.com/libp2p/go-libp2p-peer v0.0.1 - github.com/libp2p/go-libp2p-transport v0.0.4 - github.com/libp2p/go-stream-muxer v0.0.1 - github.com/lucas-clemente/quic-go v0.11.1 - github.com/multiformats/go-multiaddr v0.0.1 + github.com/libp2p/go-libp2p-core v0.0.1 + github.com/lucas-clemente/quic-go v0.11.2 + github.com/multiformats/go-multiaddr v0.0.4 github.com/multiformats/go-multiaddr-net v0.0.1 github.com/onsi/ginkgo v1.7.0 github.com/onsi/gomega v1.4.3 diff --git a/vendor/github.com/libp2p/go-libp2p-quic-transport/go.sum b/vendor/github.com/libp2p/go-libp2p-quic-transport/go.sum index 7de3d406..9018cdf2 100644 --- a/vendor/github.com/libp2p/go-libp2p-quic-transport/go.sum +++ b/vendor/github.com/libp2p/go-libp2p-quic-transport/go.sum @@ -1,5 +1,3 @@ -github.com/AndreasBriese/bbloom v0.0.0-20180913140656-343706a395b7/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= -github.com/Kubuxu/go-os-helper v0.0.1/go.mod h1:N8B+I7vPCT80IcP58r50u4+gEEcsZETFUpAzWW2ep1Y= github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32 h1:qkOC5Gd33k54tobS36cXdAzJbeHaduLtnLQQwNoIi78= github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32/go.mod h1:DrZx5ec/dmnfpw9KyYoQyYo7d0KEvTkk/5M/vbZjAr8= @@ -12,39 +10,24 @@ github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtE github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= github.com/cheekybits/genny v1.0.0 h1:uGGa4nei+j20rOSeDeP5Of12XVm7TGUd4dJA9RDitfE= github.com/cheekybits/genny v1.0.0/go.mod h1:+tQajlRqAUrPI7DOSpB0XAqZYtQakVtB7wXkRAgjxjQ= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495 h1:6IyqGr3fnd0tM3YxipK27TUskaOVUjU2nG45yzwcQKY= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dgraph-io/badger v1.5.5-0.20190226225317-8115aed38f8f/go.mod h1:VZxzAIRPHRVNRKRo6AXrX9BJegn6il06VMTZVJYCIjQ= -github.com/dgryski/go-farm v0.0.0-20190104051053-3adb47b1fb0f/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= 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/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/golang/mock v1.2.0 h1:28o5sBqPkBsMGnC6b4MvE2TzSr5/AT4c/1fLqVGIwlk= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.0 h1:kbxbvI4Un1LUWKxufD+BiE6AEExYYgkQLQmLFqA1LFk= -github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0= -github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gxed/hashland/keccakpg v0.0.1 h1:wrk3uMNaMxbXiHibbPO4S0ymqJMm41WiudyFSs7UnsU= github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfmKFJ6tItnhQ67kU= github.com/gxed/hashland/murmur3 v0.0.1 h1:SheiaIt0sda5K+8FLz952/1iWS9zrnKsEJaOJu4ZbSc= github.com/gxed/hashland/murmur3 v0.0.1/go.mod h1:KjXop02n4/ckmZSnY2+HKcLud/tcmvhST0bie/0lS48= -github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+dAcgU= -github.com/hashicorp/golang-lru v0.5.1/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/ipfs/go-datastore v0.0.1/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= -github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps= -github.com/ipfs/go-ds-badger v0.0.2/go.mod h1:Y3QpeSFWQf6MopLTiZD+VT6IC1yZqaGmjvRcKeSGij8= -github.com/ipfs/go-ds-leveldb v0.0.1/go.mod h1:feO8V3kubwsEF22n0YRQCffeb79OOYIykR4L04tMOYc= -github.com/ipfs/go-ipfs-delay v0.0.0-20181109222059-70721b86a9a8/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= -github.com/ipfs/go-log v0.0.1 h1:9XTUN/rW64BCG1YhPK9Hoy3q8nr4gOmHHBpgFdfw6Lc= -github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM= +github.com/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8 h1:bspPhN+oKYFk5fcGNuQzp6IGzYQSenLEgH3s6jkXrWw= github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8/go.mod h1:Ly/wlsjFq/qrU3Rar62tu1gASgGw6chQbSh/XgIIXCY= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= @@ -52,49 +35,33 @@ github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlT github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= -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/libp2p/go-buffer-pool v0.0.1/go.mod h1:xtyIz9PMobb13WaxR6Zo1Pd1zXJKYg0a8KiIvDp3TzQ= -github.com/libp2p/go-libp2p-crypto v0.0.1 h1:JNQd8CmoGTohO/akqrH16ewsqZpci2CbgYH/LmYl8gw= -github.com/libp2p/go-libp2p-crypto v0.0.1/go.mod h1:yJkNyDmO341d5wwXxDUGO0LykUVT72ImHNUqh5D/dBE= -github.com/libp2p/go-libp2p-net v0.0.1 h1:xJ4Vh4yKF/XKb8fd1Ev0ebAGzVjMxXzrxG2kjtU+F5Q= -github.com/libp2p/go-libp2p-net v0.0.1/go.mod h1:Yt3zgmlsHOgUWSXmt5V/Jpz9upuJBE8EgNU9DrCcR8c= -github.com/libp2p/go-libp2p-peer v0.0.1 h1:0qwAOljzYewINrU+Kndoc+1jAL7vzY/oY2Go4DCGfyY= -github.com/libp2p/go-libp2p-peer v0.0.1/go.mod h1:nXQvOBbwVqoP+T5Y5nCjeH4sP9IX/J0AMzcDUVruVoo= -github.com/libp2p/go-libp2p-peerstore v0.0.1 h1:twKovq8YK5trLrd3nB7PD2Zu9JcyAIdm7Bz9yBWjhq8= -github.com/libp2p/go-libp2p-peerstore v0.0.1/go.mod h1:RabLyPVJLuNQ+GFyoEkfi8H4Ti6k/HtZJ7YKgtSq+20= -github.com/libp2p/go-libp2p-protocol v0.0.1 h1:+zkEmZ2yFDi5adpVE3t9dqh/N9TbpFWywowzeEzBbLM= -github.com/libp2p/go-libp2p-protocol v0.0.1/go.mod h1:Af9n4PiruirSDjHycM1QuiMi/1VZNHYcK8cLgFJLZ4s= -github.com/libp2p/go-libp2p-transport v0.0.4 h1:/CPHQMN75/IQwkhBxxIo6p6PtL3rwFZtlzBROT3e8mw= -github.com/libp2p/go-libp2p-transport v0.0.4/go.mod h1:StoY3sx6IqsP6XKoabsPnHCwqKXWUMWU7Rfcsubee/A= -github.com/libp2p/go-stream-muxer v0.0.1 h1:Ce6e2Pyu+b5MC1k3eeFtAax0pW4gc6MosYSLV05UeLw= -github.com/libp2p/go-stream-muxer v0.0.1/go.mod h1:bAo8x7YkSpadMTbtTaxGVHWUQsR/l5MEaHbKaliuT14= -github.com/lucas-clemente/quic-go v0.11.0 h1:R7uxGrBWWSp817cdhkrunFsOA26vadf4EI9slWzkjlQ= -github.com/lucas-clemente/quic-go v0.11.0/go.mod h1:PpMmPfPKO9nKJ/psF49ESTAGQSdfXxlg1otPbEB2nOw= -github.com/lucas-clemente/quic-go v0.11.1 h1:zasajC848Dqq/+WqfqBCkmPw+YHNe1MBts/z7y7nXf4= -github.com/lucas-clemente/quic-go v0.11.1/go.mod h1:PpMmPfPKO9nKJ/psF49ESTAGQSdfXxlg1otPbEB2nOw= +github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZxBdp967ls1g+k8= +github.com/libp2p/go-libp2p-core v0.0.1 h1:HSTZtFIq/W5Ue43Zw+uWZyy2Vl5WtF0zDjKN8/DT/1I= +github.com/libp2p/go-libp2p-core v0.0.1/go.mod h1:g/VxnTZ/1ygHxH3dKok7Vno1VfpvGcGip57wjTU4fco= +github.com/lucas-clemente/quic-go v0.11.2 h1:Mop0ac3zALaBR3wGs6j8OYe/tcFvFsxTUFMkE/7yUOI= +github.com/lucas-clemente/quic-go v0.11.2/go.mod h1:PpMmPfPKO9nKJ/psF49ESTAGQSdfXxlg1otPbEB2nOw= github.com/marten-seemann/qtls v0.2.3 h1:0yWJ43C62LsZt08vuQJDK1uC1czUc3FJeCLPoNAI4vA= github.com/marten-seemann/qtls v0.2.3/go.mod h1:xzjG7avBwGGbdZ8dTGxlBnLArsVKLvwmjgmPuiQEcYk= -github.com/mattn/go-colorable v0.1.1 h1:G1f5SKeVxmagw/IyvzvtZE4Gybcc4Tr1tf7I8z0XgOg= -github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= -github.com/mattn/go-isatty v0.0.5 h1:tHXDdz1cpzGaovsTB+TVB8q90WEokoVmfMqoVcrLUgw= -github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0OXOcUbGjvZxxijuBwbbmlSxLiuofa+g= github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16 h1:5W7KhL8HVF3XCFOweFD3BNESdnO8ewyYTFT2R+/b8FQ= github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= github.com/mr-tron/base58 v1.1.0 h1:Y51FGVJ91WBqCEabAi5OPUz38eAx8DakuAm5svLcsfQ= github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= +github.com/mr-tron/base58 v1.1.1 h1:OJIdWOWYe2l5PQNgimGtuwHY8nDskvJ5vvs//YnzRLs= +github.com/mr-tron/base58 v1.1.1/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= github.com/multiformats/go-multiaddr v0.0.1 h1:/QUV3VBMDI6pi6xfiw7lr6xhDWWvQKn9udPn68kLSdY= github.com/multiformats/go-multiaddr v0.0.1/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= +github.com/multiformats/go-multiaddr v0.0.2 h1:RBysRCv5rv3FWlhKWKoXv8tnsCUpEpIZpCmqAGZos2s= +github.com/multiformats/go-multiaddr v0.0.2/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= +github.com/multiformats/go-multiaddr v0.0.4 h1:WgMSI84/eRLdbptXMkMWDXPjPq7SPLIgGUVm2eroyU4= +github.com/multiformats/go-multiaddr v0.0.4/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= github.com/multiformats/go-multiaddr-dns v0.0.1 h1:jQt9c6tDSdQLIlBo4tXYx7QUHCPjxsB1zXcag/2S7zc= github.com/multiformats/go-multiaddr-dns v0.0.1/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= github.com/multiformats/go-multiaddr-net v0.0.1 h1:76O59E3FavvHqNg7jvzWzsPSW5JSi/ek0E4eiDVbg9g= github.com/multiformats/go-multiaddr-net v0.0.1/go.mod h1:nw6HSxNmCIQH27XPGBuX+d1tnvM7ihcFwHMSstNAVUU= +github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs= github.com/multiformats/go-multihash v0.0.1 h1:HHwN1K12I+XllBCrqKnhX949Orn4oawPkegHMu2vDqQ= github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= @@ -102,18 +69,10 @@ 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.0.2 h1:3jA2P6O1F9UOrWVpwrIo17pu01KWvNWg4X946/Y5Zwg= -github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -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/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= -github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1/go.mod h1:8UvriyWtv5Q5EOgjHaSseUEdkQfvwFv1I/In/O2M9gc= -github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc h1:9lDbC6Rz4bwmou+oE6Dt4Cb2BGMur5eR/GYptkKUVHo= -github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc/go.mod h1:bopw91TMyo8J3tvftk8xmU2kPmlrt4nScJQZU2hE5EM= +github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a h1:/eS3yfGjQKG+9kayBkj0ip1BGhq6zJ3eaVksphxAaek= +github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a/go.mod h1:7AyxJNCJ7SBZ1MfVQCWD6Uqo2oubI2Eq2y2eqf+A5r0= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 h1:RC6RW7j+1+HkWaX/Yh71Ee5ZHaHYt7ZP4sQgUrm6cDU= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572/go.mod h1:w0SWMsp6j9O/dk4/ZpIhL+3CkG8ofA2vuv7k+ltqUMc= github.com/whyrusleeping/mafmt v1.2.8 h1:TCghSl5kkwEE0j+sU/gudyhVMRlpBin8fMBBHg59EbA= github.com/whyrusleeping/mafmt v1.2.8/go.mod h1:faQJFPbLSxzD9xpA02ttW/tS9vZykNvXwGvqIpk20FA= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -122,25 +81,20 @@ golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b h1:+/WWzjwW6gidDJnMKWLKLX golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25 h1:jsG6UpNLt9iAsb0S2AGW28DveNzzgmbXR+ENoPjUeIU= golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd h1:nTDtHvHSdCn1m6ITfMRqtOd/9+7a3s8RBNOZ3eYZzJA= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190227160552-c95aed5357e7 h1:C2F/nMkR/9sfUTpvR3QrjBuTdvMUC/cFajkphs1YLQo= -golang.org/x/net v0.0.0-20190227160552-c95aed5357e7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f h1:wMNYb4v58l5UBM7MYRLPG6ZhfOqbKu7X5eyFl8ZhKvA= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/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-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190219092855-153ac476189d/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223 h1:DH4skfRX4EBpamg7iV4ZlCpblAHI6s6TDM39bFZumv8= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190228124157-a34e9553db1e h1:ZytStCyV048ZqDsWHiYDdoI2Vd4msMcrDECFxS+tL9c= golang.org/x/sys v0.0.0-20190228124157-a34e9553db1e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= 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/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= diff --git a/vendor/github.com/libp2p/go-libp2p-quic-transport/listener.go b/vendor/github.com/libp2p/go-libp2p-quic-transport/listener.go index ef8b0190..327af2f4 100644 --- a/vendor/github.com/libp2p/go-libp2p-quic-transport/listener.go +++ b/vendor/github.com/libp2p/go-libp2p-quic-transport/listener.go @@ -4,9 +4,10 @@ import ( "crypto/tls" "net" - ic "github.com/libp2p/go-libp2p-crypto" - peer "github.com/libp2p/go-libp2p-peer" - tpt "github.com/libp2p/go-libp2p-transport" + ic "github.com/libp2p/go-libp2p-core/crypto" + "github.com/libp2p/go-libp2p-core/peer" + tpt "github.com/libp2p/go-libp2p-core/transport" + quic "github.com/lucas-clemente/quic-go" ma "github.com/multiformats/go-multiaddr" manet "github.com/multiformats/go-multiaddr-net" @@ -57,7 +58,7 @@ func newListener(addr ma.Multiaddr, transport tpt.Transport, localPeer peer.ID, } // Accept accepts new connections. -func (l *listener) Accept() (tpt.Conn, error) { +func (l *listener) Accept() (tpt.CapableConn, error) { for { sess, err := l.quicListener.Accept() if err != nil { @@ -72,7 +73,7 @@ func (l *listener) Accept() (tpt.Conn, error) { } } -func (l *listener) setupConn(sess quic.Session) (tpt.Conn, error) { +func (l *listener) setupConn(sess quic.Session) (tpt.CapableConn, error) { remotePubKey, err := getRemotePubKey(sess.ConnectionState().PeerCertificates) if err != nil { return nil, err diff --git a/vendor/github.com/libp2p/go-libp2p-quic-transport/stream.go b/vendor/github.com/libp2p/go-libp2p-quic-transport/stream.go index 10853656..e757de20 100644 --- a/vendor/github.com/libp2p/go-libp2p-quic-transport/stream.go +++ b/vendor/github.com/libp2p/go-libp2p-quic-transport/stream.go @@ -1,7 +1,8 @@ package libp2pquic import ( - smux "github.com/libp2p/go-stream-muxer" + "github.com/libp2p/go-libp2p-core/mux" + quic "github.com/lucas-clemente/quic-go" ) @@ -9,7 +10,7 @@ type stream struct { quic.Stream } -var _ smux.Stream = &stream{} +var _ mux.MuxedStream = &stream{} func (s *stream) Reset() error { s.Stream.CancelRead(0) diff --git a/vendor/github.com/libp2p/go-libp2p-quic-transport/transport.go b/vendor/github.com/libp2p/go-libp2p-quic-transport/transport.go index 2351959c..c33b2417 100644 --- a/vendor/github.com/libp2p/go-libp2p-quic-transport/transport.go +++ b/vendor/github.com/libp2p/go-libp2p-quic-transport/transport.go @@ -9,9 +9,10 @@ import ( "net" "sync" - ic "github.com/libp2p/go-libp2p-crypto" - peer "github.com/libp2p/go-libp2p-peer" - tpt "github.com/libp2p/go-libp2p-transport" + ic "github.com/libp2p/go-libp2p-core/crypto" + "github.com/libp2p/go-libp2p-core/peer" + tpt "github.com/libp2p/go-libp2p-core/transport" + quic "github.com/lucas-clemente/quic-go" ma "github.com/multiformats/go-multiaddr" manet "github.com/multiformats/go-multiaddr-net" @@ -31,26 +32,30 @@ var quicConfig = &quic.Config{ } type connManager struct { - connIPv4Once sync.Once - connIPv4 net.PacketConn + mutex sync.Mutex - connIPv6Once sync.Once - connIPv6 net.PacketConn + connIPv4 net.PacketConn + connIPv6 net.PacketConn } func (c *connManager) GetConnForAddr(network string) (net.PacketConn, error) { + c.mutex.Lock() + defer c.mutex.Unlock() + switch network { case "udp4": + if c.connIPv4 != nil { + return c.connIPv4, nil + } var err error - c.connIPv4Once.Do(func() { - c.connIPv4, err = c.createConn(network, "0.0.0.0:0") - }) + c.connIPv4, err = c.createConn(network, "0.0.0.0:0") return c.connIPv4, err case "udp6": + if c.connIPv6 != nil { + return c.connIPv6, nil + } var err error - c.connIPv6Once.Do(func() { - c.connIPv6, err = c.createConn(network, ":0") - }) + c.connIPv6, err = c.createConn(network, ":0") return c.connIPv6, err default: return nil, fmt.Errorf("unsupported network: %s", network) @@ -95,7 +100,7 @@ func NewTransport(key ic.PrivKey) (tpt.Transport, error) { } // Dial dials a new QUIC connection -func (t *transport) Dial(ctx context.Context, raddr ma.Multiaddr, p peer.ID) (tpt.Conn, error) { +func (t *transport) Dial(ctx context.Context, raddr ma.Multiaddr, p peer.ID) (tpt.CapableConn, error) { network, host, err := manet.DialArgs(raddr) if err != nil { return nil, err diff --git a/vendor/github.com/libp2p/go-libp2p-record/.travis.yml b/vendor/github.com/libp2p/go-libp2p-record/.travis.yml index 4cfe98c2..5163d693 100644 --- a/vendor/github.com/libp2p/go-libp2p-record/.travis.yml +++ b/vendor/github.com/libp2p/go-libp2p-record/.travis.yml @@ -10,7 +10,6 @@ env: global: - GOTFLAGS="-race" matrix: - - BUILD_DEPTYPE=gx - BUILD_DEPTYPE=gomod @@ -24,7 +23,6 @@ script: cache: directories: - - $GOPATH/src/gx - $GOPATH/pkg/mod - $HOME/.cache/go-build diff --git a/vendor/github.com/libp2p/go-libp2p-record/Makefile b/vendor/github.com/libp2p/go-libp2p-record/Makefile deleted file mode 100644 index a89e6d08..00000000 --- a/vendor/github.com/libp2p/go-libp2p-record/Makefile +++ /dev/null @@ -1,9 +0,0 @@ -export IPFS_API ?= v04x.ipfs.io - -gx: - go get -u github.com/whyrusleeping/gx - go get -u github.com/whyrusleeping/gx-go - -deps: gx - gx --verbose install --global - gx-go rewrite \ No newline at end of file diff --git a/vendor/github.com/libp2p/go-libp2p-record/README.md b/vendor/github.com/libp2p/go-libp2p-record/README.md index 875d77e3..63fe5011 100644 --- a/vendor/github.com/libp2p/go-libp2p-record/README.md +++ b/vendor/github.com/libp2p/go-libp2p-record/README.md @@ -1,9 +1,9 @@ # go-libp2p-record -[![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](http://ipn.io) -[![](https://img.shields.io/badge/project-libp2p-blue.svg?style=flat-square)](http://libp2p.io/) -[![](https://img.shields.io/badge/freenode-%23libp2p-blue.svg?style=flat-square)](http://webchat.freenode.net/?channels=%23libp2p) -[![standard-readme compliant](https://img.shields.io/badge/standard--readme-OK-green.svg?style=flat-square)](https://github.com/RichardLitt/standard-readme) +[![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](https://protocol.ai) +[![](https://img.shields.io/badge/project-libp2p-yellow.svg?style=flat-square)](https://libp2p.io/) +[![](https://img.shields.io/badge/freenode-%23libp2p-yellow.svg?style=flat-square)](http://webchat.freenode.net/?channels=%23libp2p) +[![Discourse posts](https://img.shields.io/discourse/https/discuss.libp2p.io/posts.svg)](https://discuss.libp2p.io) > signed records for use with routing systems @@ -24,3 +24,7 @@ This repository falls under the IPFS [Code of Conduct](https://github.com/ipfs/c ## License MIT + +--- + +The last gx published version of this module was: 4.1.15: QmbeHtaBy9nZsW4cHRcvgVY4CnDhXudE2Dr6qDxS7yg9rX diff --git a/vendor/github.com/libp2p/go-libp2p-record/go.mod b/vendor/github.com/libp2p/go-libp2p-record/go.mod index 4c69846e..3e24bfb4 100644 --- a/vendor/github.com/libp2p/go-libp2p-record/go.mod +++ b/vendor/github.com/libp2p/go-libp2p-record/go.mod @@ -4,6 +4,6 @@ require ( github.com/gogo/protobuf v1.2.1 github.com/ipfs/go-ipfs-util v0.0.1 github.com/ipfs/go-log v0.0.1 - github.com/libp2p/go-libp2p-crypto v0.0.1 - github.com/multiformats/go-multihash v0.0.1 + github.com/libp2p/go-libp2p-core v0.0.1 + github.com/multiformats/go-multihash v0.0.5 ) diff --git a/vendor/github.com/libp2p/go-libp2p-record/go.sum b/vendor/github.com/libp2p/go-libp2p-record/go.sum index d2f5c269..fd61127d 100644 --- a/vendor/github.com/libp2p/go-libp2p-record/go.sum +++ b/vendor/github.com/libp2p/go-libp2p-record/go.sum @@ -8,66 +8,80 @@ github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVa github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/gxed/hashland/keccakpg v0.0.1 h1:wrk3uMNaMxbXiHibbPO4S0ymqJMm41WiudyFSs7UnsU= github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfmKFJ6tItnhQ67kU= -github.com/gxed/hashland/murmur3 v0.0.1 h1:SheiaIt0sda5K+8FLz952/1iWS9zrnKsEJaOJu4ZbSc= github.com/gxed/hashland/murmur3 v0.0.1/go.mod h1:KjXop02n4/ckmZSnY2+HKcLud/tcmvhST0bie/0lS48= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= github.com/ipfs/go-ipfs-util v0.0.1 h1:Wz9bL2wB2YBJqggkA4dD7oSmqB4cAnpNbGrlHJulv50= github.com/ipfs/go-ipfs-util v0.0.1/go.mod h1:spsl5z8KUnrve+73pOhSVZND1SIxPW5RyBCNzQxlJBc= github.com/ipfs/go-log v0.0.1 h1:9XTUN/rW64BCG1YhPK9Hoy3q8nr4gOmHHBpgFdfw6Lc= github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM= +github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8/go.mod h1:Ly/wlsjFq/qrU3Rar62tu1gASgGw6chQbSh/XgIIXCY= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= -github.com/libp2p/go-libp2p-crypto v0.0.1 h1:JNQd8CmoGTohO/akqrH16ewsqZpci2CbgYH/LmYl8gw= -github.com/libp2p/go-libp2p-crypto v0.0.1/go.mod h1:yJkNyDmO341d5wwXxDUGO0LykUVT72ImHNUqh5D/dBE= +github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZxBdp967ls1g+k8= +github.com/libp2p/go-libp2p-core v0.0.1 h1:HSTZtFIq/W5Ue43Zw+uWZyy2Vl5WtF0zDjKN8/DT/1I= +github.com/libp2p/go-libp2p-core v0.0.1/go.mod h1:g/VxnTZ/1ygHxH3dKok7Vno1VfpvGcGip57wjTU4fco= github.com/mattn/go-colorable v0.1.1 h1:G1f5SKeVxmagw/IyvzvtZE4Gybcc4Tr1tf7I8z0XgOg= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= github.com/mattn/go-isatty v0.0.5 h1:tHXDdz1cpzGaovsTB+TVB8q90WEokoVmfMqoVcrLUgw= github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0OXOcUbGjvZxxijuBwbbmlSxLiuofa+g= github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= -github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16 h1:5W7KhL8HVF3XCFOweFD3BNESdnO8ewyYTFT2R+/b8FQ= github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= -github.com/mr-tron/base58 v1.1.0 h1:Y51FGVJ91WBqCEabAi5OPUz38eAx8DakuAm5svLcsfQ= +github.com/minio/sha256-simd v0.0.0-20190328051042-05b4dd3047e5 h1:l16XLUUJ34wIz+RIvLhSwGvLvKyy+W598b135bJN6mg= +github.com/minio/sha256-simd v0.0.0-20190328051042-05b4dd3047e5/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= -github.com/multiformats/go-multihash v0.0.1 h1:HHwN1K12I+XllBCrqKnhX949Orn4oawPkegHMu2vDqQ= +github.com/mr-tron/base58 v1.1.1/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= +github.com/mr-tron/base58 v1.1.2 h1:ZEw4I2EgPKDJ2iEw0cNmLB3ROrEmkOtXIkaG7wZg+78= +github.com/mr-tron/base58 v1.1.2/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= +github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= +github.com/multiformats/go-multiaddr v0.0.2/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= +github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs= github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= +github.com/multiformats/go-multihash v0.0.5 h1:1wxmCvTXAifAepIMyF39vZinRw5sbqjPs/UIi93+uik= +github.com/multiformats/go-multihash v0.0.5/go.mod h1:lt/HCbqlQwlPBz7lv0sQCdtfcMtlJvakRUn/0Ual8po= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/opentracing/opentracing-go v1.0.2 h1:3jA2P6O1F9UOrWVpwrIo17pu01KWvNWg4X946/Y5Zwg= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -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/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a/go.mod h1:7AyxJNCJ7SBZ1MfVQCWD6Uqo2oubI2Eq2y2eqf+A5r0= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572/go.mod h1:w0SWMsp6j9O/dk4/ZpIhL+3CkG8ofA2vuv7k+ltqUMc= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc h1:9lDbC6Rz4bwmou+oE6Dt4Cb2BGMur5eR/GYptkKUVHo= github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc/go.mod h1:bopw91TMyo8J3tvftk8xmU2kPmlrt4nScJQZU2hE5EM= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67 h1:ng3VDlRp5/DHpSWl02R4rM9I+8M2rhmsuLwAMmkLQWE= golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b h1:+/WWzjwW6gidDJnMKWLKLX1gxn7irUTF1fLpQovfQ5M= golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734 h1:p/H982KKEjUnLJkM3tt/LemDnOc1GiZL5FCVlORJ5zo= +golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190227160552-c95aed5357e7 h1:C2F/nMkR/9sfUTpvR3QrjBuTdvMUC/cFajkphs1YLQo= golang.org/x/net v0.0.0-20190227160552-c95aed5357e7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3 h1:0GoQqolDA55aaLxZyTzK/Y2ePZzZTUrRacwib7cNsYQ= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/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-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190219092855-153ac476189d/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223 h1:DH4skfRX4EBpamg7iV4ZlCpblAHI6s6TDM39bFZumv8= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d h1:+R4KGOnez64A81RvjARKc4UT5/tI9ujCIVX+P5KiHuI= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/vendor/github.com/libp2p/go-libp2p-record/package.json b/vendor/github.com/libp2p/go-libp2p-record/package.json deleted file mode 100644 index 5a77e37c..00000000 --- a/vendor/github.com/libp2p/go-libp2p-record/package.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "bugs": { - "url": "https://github.com/libp2p/go-libp2p-record" - }, - "gx": { - "dvcsimport": "github.com/libp2p/go-libp2p-record", - "goversion": "1.5.2" - }, - "gxDependencies": [ - { - "hash": "QmbkT7eMTyXfpeyB3ZMxxcxg7XH8t6uXp49jqzz4HB7BGF", - "name": "go-log", - "version": "1.5.9" - }, - { - "author": "whyrusleeping", - "hash": "QmTW4SdgBWq9GjsBsHeUx8WuGxzhgzAf88UMH2w62PC8yK", - "name": "go-libp2p-crypto", - "version": "2.0.7" - }, - { - "author": "whyrusleeping", - "hash": "QmYVXrKrKHDC9FobgmcmshCDyWwdrfwfanNQN4oxJ9Fk3h", - "name": "go-libp2p-peer", - "version": "3.1.2" - }, - { - "hash": "QmerPMzPk1mJVowm8KgmoknWa4yCYvvugMPsgWmDNUvDLW", - "name": "go-multihash", - "version": "1.0.9" - }, - { - "hash": "QmNohiVssaPw3KVLZik59DBVGTSm2dGvYT9eoXt5DQ36Yz", - "name": "go-ipfs-util", - "version": "1.2.9" - }, - { - "hash": "QmddjPSGZb3ieihSseFeCfVRpZzcqczPNsD2DvarSwnjJB", - "name": "gogo-protobuf", - "version": "1.2.1" - } - ], - "gxVersion": "0.4.0", - "language": "go", - "license": "MIT", - "name": "go-libp2p-record", - "releaseCmd": "git commit -a -m \"gx publish $VERSION\"", - "version": "4.1.15" -} - diff --git a/vendor/github.com/libp2p/go-libp2p-routing-helpers/.travis.yml b/vendor/github.com/libp2p/go-libp2p-routing-helpers/.travis.yml index 4cfe98c2..5163d693 100644 --- a/vendor/github.com/libp2p/go-libp2p-routing-helpers/.travis.yml +++ b/vendor/github.com/libp2p/go-libp2p-routing-helpers/.travis.yml @@ -10,7 +10,6 @@ env: global: - GOTFLAGS="-race" matrix: - - BUILD_DEPTYPE=gx - BUILD_DEPTYPE=gomod @@ -24,7 +23,6 @@ script: cache: directories: - - $GOPATH/src/gx - $GOPATH/pkg/mod - $HOME/.cache/go-build diff --git a/vendor/github.com/libp2p/go-libp2p-routing-helpers/Makefile b/vendor/github.com/libp2p/go-libp2p-routing-helpers/Makefile deleted file mode 100644 index a89e6d08..00000000 --- a/vendor/github.com/libp2p/go-libp2p-routing-helpers/Makefile +++ /dev/null @@ -1,9 +0,0 @@ -export IPFS_API ?= v04x.ipfs.io - -gx: - go get -u github.com/whyrusleeping/gx - go get -u github.com/whyrusleeping/gx-go - -deps: gx - gx --verbose install --global - gx-go rewrite \ No newline at end of file diff --git a/vendor/github.com/libp2p/go-libp2p-routing-helpers/README.md b/vendor/github.com/libp2p/go-libp2p-routing-helpers/README.md index 133df308..9a551e7b 100644 --- a/vendor/github.com/libp2p/go-libp2p-routing-helpers/README.md +++ b/vendor/github.com/libp2p/go-libp2p-routing-helpers/README.md @@ -1,12 +1,12 @@ # go-libp2p-routing-helpers -[![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](http://ipn.io) -[![](https://img.shields.io/badge/project-IPFS-blue.svg?style=flat-square)](http://ipfs.io/) -[![](https://img.shields.io/badge/freenode-%23ipfs-blue.svg?style=flat-square)](http://webchat.freenode.net/?channels=%23ipfs) -[![standard-readme compliant](https://img.shields.io/badge/standard--readme-OK-green.svg?style=flat-square)](https://github.com/RichardLitt/standard-readme) +[![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](https://protocol.ai) +[![](https://img.shields.io/badge/project-libp2p-yellow.svg?style=flat-square)](https://libp2p.io/) +[![](https://img.shields.io/badge/freenode-%23libp2p-yellow.svg?style=flat-square)](http://webchat.freenode.net/?channels=%23libp2p) [![GoDoc](https://godoc.org/github.com/libp2p/go-libp2p-routing-helpers?status.svg)](https://godoc.org/github.com/libp2p/go-libp2p-routing-helpers) [![Coverage Status](https://img.shields.io/codecov/c/github/libp2p/go-libp2p-routing-helpers.svg?style=flat-square&branch=master)](https://codecov.io/github/libp2p/go-libp2p-routing-helpers?branch=master) [![Build Status](https://travis-ci.org/libp2p/go-libp2p-routing-helpers.svg?branch=master)](https://travis-ci.org/libp2p/go-libp2p-routing-helpers) +[![Discourse posts](https://img.shields.io/discourse/https/discuss.libp2p.io/posts.svg)](https://discuss.libp2p.io) > A collection of helper types for composing different types of routers. @@ -27,3 +27,7 @@ This repository falls under the IPFS [Code of Conduct](https://github.com/ipfs/c ## License MIT + +--- + +The last gx published version of this module was: 0.4.0: QmXwV9RskR8vpoYWu9bvKAeAWaBKyxEsEiM9yy6ezbpNBm diff --git a/vendor/github.com/libp2p/go-libp2p-routing-helpers/composed.go b/vendor/github.com/libp2p/go-libp2p-routing-helpers/composed.go index 4a137627..5ffa0d02 100644 --- a/vendor/github.com/libp2p/go-libp2p-routing-helpers/composed.go +++ b/vendor/github.com/libp2p/go-libp2p-routing-helpers/composed.go @@ -3,13 +3,12 @@ package routinghelpers import ( "context" + ci "github.com/libp2p/go-libp2p-core/crypto" + "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p-core/routing" + multierror "github.com/hashicorp/go-multierror" cid "github.com/ipfs/go-cid" - ci "github.com/libp2p/go-libp2p-crypto" - peer "github.com/libp2p/go-libp2p-peer" - pstore "github.com/libp2p/go-libp2p-peerstore" - routing "github.com/libp2p/go-libp2p-routing" - ropts "github.com/libp2p/go-libp2p-routing/options" ) // Compose composes the components into a single router. Not specifying a @@ -29,7 +28,7 @@ type Compose struct { // functionality. // PutValue adds value corresponding to given Key. -func (cr *Compose) PutValue(ctx context.Context, key string, value []byte, opts ...ropts.Option) error { +func (cr *Compose) PutValue(ctx context.Context, key string, value []byte, opts ...routing.Option) error { if cr.ValueStore == nil { return routing.ErrNotSupported } @@ -37,7 +36,7 @@ func (cr *Compose) PutValue(ctx context.Context, key string, value []byte, opts } // GetValue searches for the value corresponding to given Key. -func (cr *Compose) GetValue(ctx context.Context, key string, opts ...ropts.Option) ([]byte, error) { +func (cr *Compose) GetValue(ctx context.Context, key string, opts ...routing.Option) ([]byte, error) { if cr.ValueStore == nil { return nil, routing.ErrNotFound } @@ -45,7 +44,7 @@ func (cr *Compose) GetValue(ctx context.Context, key string, opts ...ropts.Optio } // SearchValue searches for the value corresponding to given Key. -func (cr *Compose) SearchValue(ctx context.Context, key string, opts ...ropts.Option) (<-chan []byte, error) { +func (cr *Compose) SearchValue(ctx context.Context, key string, opts ...routing.Option) (<-chan []byte, error) { if cr.ValueStore == nil { out := make(chan []byte) close(out) @@ -65,20 +64,20 @@ func (cr *Compose) Provide(ctx context.Context, c cid.Cid, local bool) error { } // FindProvidersAsync searches for peers who are able to provide a given key -func (cr *Compose) FindProvidersAsync(ctx context.Context, c cid.Cid, count int) <-chan pstore.PeerInfo { +func (cr *Compose) FindProvidersAsync(ctx context.Context, c cid.Cid, count int) <-chan peer.AddrInfo { if cr.ContentRouting == nil { - ch := make(chan pstore.PeerInfo) + ch := make(chan peer.AddrInfo) close(ch) return ch } return cr.ContentRouting.FindProvidersAsync(ctx, c, count) } -// FindPeer searches for a peer with given ID, returns a pstore.PeerInfo +// FindPeer searches for a peer with given ID, returns a peer.AddrInfo // with relevant addresses. -func (cr *Compose) FindPeer(ctx context.Context, p peer.ID) (pstore.PeerInfo, error) { +func (cr *Compose) FindPeer(ctx context.Context, p peer.ID) (peer.AddrInfo, error) { if cr.PeerRouting == nil { - return pstore.PeerInfo{}, routing.ErrNotFound + return peer.AddrInfo{}, routing.ErrNotFound } return cr.PeerRouting.FindPeer(ctx, p) } @@ -119,5 +118,5 @@ func (cr *Compose) Bootstrap(ctx context.Context) error { return me.ErrorOrNil() } -var _ routing.IpfsRouting = (*Compose)(nil) +var _ routing.Routing = (*Compose)(nil) var _ routing.PubKeyFetcher = (*Compose)(nil) diff --git a/vendor/github.com/libp2p/go-libp2p-routing-helpers/go.mod b/vendor/github.com/libp2p/go-libp2p-routing-helpers/go.mod index 3aab2e29..43aeb8ce 100644 --- a/vendor/github.com/libp2p/go-libp2p-routing-helpers/go.mod +++ b/vendor/github.com/libp2p/go-libp2p-routing-helpers/go.mod @@ -3,11 +3,8 @@ module github.com/libp2p/go-libp2p-routing-helpers require ( github.com/hashicorp/errwrap v1.0.0 github.com/hashicorp/go-multierror v1.0.0 - github.com/ipfs/go-cid v0.0.1 - github.com/libp2p/go-libp2p-crypto v0.0.1 - github.com/libp2p/go-libp2p-peer v0.0.1 - github.com/libp2p/go-libp2p-peerstore v0.0.1 - github.com/libp2p/go-libp2p-record v0.0.1 - github.com/libp2p/go-libp2p-routing v0.0.1 - github.com/multiformats/go-multihash v0.0.1 + github.com/ipfs/go-cid v0.0.2 + github.com/libp2p/go-libp2p-core v0.0.1 + github.com/libp2p/go-libp2p-record v0.1.0 + github.com/multiformats/go-multihash v0.0.5 ) diff --git a/vendor/github.com/libp2p/go-libp2p-routing-helpers/go.sum b/vendor/github.com/libp2p/go-libp2p-routing-helpers/go.sum index d85f80af..2917e51e 100644 --- a/vendor/github.com/libp2p/go-libp2p-routing-helpers/go.sum +++ b/vendor/github.com/libp2p/go-libp2p-routing-helpers/go.sum @@ -1,5 +1,3 @@ -github.com/AndreasBriese/bbloom v0.0.0-20180913140656-343706a395b7/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= -github.com/Kubuxu/go-os-helper v0.0.1/go.mod h1:N8B+I7vPCT80IcP58r50u4+gEEcsZETFUpAzWW2ep1Y= github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32 h1:qkOC5Gd33k54tobS36cXdAzJbeHaduLtnLQQwNoIi78= github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32/go.mod h1:DrZx5ec/dmnfpw9KyYoQyYo7d0KEvTkk/5M/vbZjAr8= @@ -10,20 +8,14 @@ github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVa github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dgraph-io/badger v1.5.5-0.20190226225317-8115aed38f8f/go.mod h1:VZxzAIRPHRVNRKRo6AXrX9BJegn6il06VMTZVJYCIjQ= -github.com/dgryski/go-farm v0.0.0-20190104051053-3adb47b1fb0f/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0= -github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gxed/hashland/keccakpg v0.0.1 h1:wrk3uMNaMxbXiHibbPO4S0ymqJMm41WiudyFSs7UnsU= github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfmKFJ6tItnhQ67kU= github.com/gxed/hashland/murmur3 v0.0.1 h1:SheiaIt0sda5K+8FLz952/1iWS9zrnKsEJaOJu4ZbSc= @@ -32,14 +24,11 @@ github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/U github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-multierror v1.0.0 h1:iVjPR7a6H0tWELX5NxNe7bYopibicUzc7uPribsnS6o= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/ipfs/go-cid v0.0.1 h1:GBjWPktLnNyX0JiQCNFpUuUSoMw5KMyqrsejHYlILBE= github.com/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= -github.com/ipfs/go-datastore v0.0.1/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= -github.com/ipfs/go-ds-badger v0.0.2/go.mod h1:Y3QpeSFWQf6MopLTiZD+VT6IC1yZqaGmjvRcKeSGij8= -github.com/ipfs/go-ds-leveldb v0.0.1/go.mod h1:feO8V3kubwsEF22n0YRQCffeb79OOYIykR4L04tMOYc= -github.com/ipfs/go-ipfs-delay v0.0.0-20181109222059-70721b86a9a8/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= +github.com/ipfs/go-cid v0.0.2 h1:tuuKaZPU1M6HcejsO3AcYWW8sZ8MTvyxfc4uqB4eFE8= +github.com/ipfs/go-cid v0.0.2/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= github.com/ipfs/go-ipfs-util v0.0.1 h1:Wz9bL2wB2YBJqggkA4dD7oSmqB4cAnpNbGrlHJulv50= github.com/ipfs/go-ipfs-util v0.0.1/go.mod h1:spsl5z8KUnrve+73pOhSVZND1SIxPW5RyBCNzQxlJBc= github.com/ipfs/go-log v0.0.1 h1:9XTUN/rW64BCG1YhPK9Hoy3q8nr4gOmHHBpgFdfw6Lc= @@ -50,20 +39,11 @@ github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlT github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= -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/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/libp2p/go-buffer-pool v0.0.1/go.mod h1:xtyIz9PMobb13WaxR6Zo1Pd1zXJKYg0a8KiIvDp3TzQ= -github.com/libp2p/go-libp2p-crypto v0.0.1 h1:JNQd8CmoGTohO/akqrH16ewsqZpci2CbgYH/LmYl8gw= -github.com/libp2p/go-libp2p-crypto v0.0.1/go.mod h1:yJkNyDmO341d5wwXxDUGO0LykUVT72ImHNUqh5D/dBE= -github.com/libp2p/go-libp2p-peer v0.0.1 h1:0qwAOljzYewINrU+Kndoc+1jAL7vzY/oY2Go4DCGfyY= -github.com/libp2p/go-libp2p-peer v0.0.1/go.mod h1:nXQvOBbwVqoP+T5Y5nCjeH4sP9IX/J0AMzcDUVruVoo= -github.com/libp2p/go-libp2p-peerstore v0.0.1 h1:twKovq8YK5trLrd3nB7PD2Zu9JcyAIdm7Bz9yBWjhq8= -github.com/libp2p/go-libp2p-peerstore v0.0.1/go.mod h1:RabLyPVJLuNQ+GFyoEkfi8H4Ti6k/HtZJ7YKgtSq+20= -github.com/libp2p/go-libp2p-record v0.0.1 h1:zN7AS3X46qmwsw5JLxdDuI43cH5UYwovKxHPjKBYQxw= -github.com/libp2p/go-libp2p-record v0.0.1/go.mod h1:grzqg263Rug/sRex85QrDOLntdFAymLDLm7lxMgU79Q= -github.com/libp2p/go-libp2p-routing v0.0.1 h1:hPMAWktf9rYi3ME4MG48qE7dq1ofJxiQbfdvpNntjhc= -github.com/libp2p/go-libp2p-routing v0.0.1/go.mod h1:N51q3yTr4Zdr7V8Jt2JIktVU+3xBBylx1MZeVA6t1Ys= +github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZxBdp967ls1g+k8= +github.com/libp2p/go-libp2p-core v0.0.1 h1:HSTZtFIq/W5Ue43Zw+uWZyy2Vl5WtF0zDjKN8/DT/1I= +github.com/libp2p/go-libp2p-core v0.0.1/go.mod h1:g/VxnTZ/1ygHxH3dKok7Vno1VfpvGcGip57wjTU4fco= +github.com/libp2p/go-libp2p-record v0.1.0 h1:wHwBGbFzymoIl69BpgwIu0O6ta3TXGcMPvHUAcodzRc= +github.com/libp2p/go-libp2p-record v0.1.0/go.mod h1:ujNc8iuE5dlKWVy6wuL6dd58t0n7xI4hAIl8pE6wu5Q= github.com/mattn/go-colorable v0.1.1 h1:G1f5SKeVxmagw/IyvzvtZE4Gybcc4Tr1tf7I8z0XgOg= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= github.com/mattn/go-isatty v0.0.5 h1:tHXDdz1cpzGaovsTB+TVB8q90WEokoVmfMqoVcrLUgw= @@ -72,51 +52,67 @@ github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0 github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16 h1:5W7KhL8HVF3XCFOweFD3BNESdnO8ewyYTFT2R+/b8FQ= github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= +github.com/minio/sha256-simd v0.0.0-20190328051042-05b4dd3047e5 h1:l16XLUUJ34wIz+RIvLhSwGvLvKyy+W598b135bJN6mg= +github.com/minio/sha256-simd v0.0.0-20190328051042-05b4dd3047e5/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= github.com/mr-tron/base58 v1.1.0 h1:Y51FGVJ91WBqCEabAi5OPUz38eAx8DakuAm5svLcsfQ= github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= +github.com/mr-tron/base58 v1.1.1 h1:OJIdWOWYe2l5PQNgimGtuwHY8nDskvJ5vvs//YnzRLs= +github.com/mr-tron/base58 v1.1.1/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= +github.com/mr-tron/base58 v1.1.2 h1:ZEw4I2EgPKDJ2iEw0cNmLB3ROrEmkOtXIkaG7wZg+78= +github.com/mr-tron/base58 v1.1.2/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= github.com/multiformats/go-base32 v0.0.3 h1:tw5+NhuwaOjJCC5Pp82QuXbrmLzWg7uxlMFp8Nq/kkI= github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= -github.com/multiformats/go-multiaddr v0.0.1 h1:/QUV3VBMDI6pi6xfiw7lr6xhDWWvQKn9udPn68kLSdY= -github.com/multiformats/go-multiaddr v0.0.1/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= -github.com/multiformats/go-multiaddr-dns v0.0.1/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= -github.com/multiformats/go-multiaddr-net v0.0.1/go.mod h1:nw6HSxNmCIQH27XPGBuX+d1tnvM7ihcFwHMSstNAVUU= +github.com/multiformats/go-multiaddr v0.0.2 h1:RBysRCv5rv3FWlhKWKoXv8tnsCUpEpIZpCmqAGZos2s= +github.com/multiformats/go-multiaddr v0.0.2/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= github.com/multiformats/go-multibase v0.0.1 h1:PN9/v21eLywrFWdFNsFKaU04kLJzuYzmrJR+ubhT9qA= github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs= github.com/multiformats/go-multihash v0.0.1 h1:HHwN1K12I+XllBCrqKnhX949Orn4oawPkegHMu2vDqQ= github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= +github.com/multiformats/go-multihash v0.0.5 h1:1wxmCvTXAifAepIMyF39vZinRw5sbqjPs/UIi93+uik= +github.com/multiformats/go-multihash v0.0.5/go.mod h1:lt/HCbqlQwlPBz7lv0sQCdtfcMtlJvakRUn/0Ual8po= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/opentracing/opentracing-go v1.0.2 h1:3jA2P6O1F9UOrWVpwrIo17pu01KWvNWg4X946/Y5Zwg= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -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/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a h1:/eS3yfGjQKG+9kayBkj0ip1BGhq6zJ3eaVksphxAaek= +github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a/go.mod h1:7AyxJNCJ7SBZ1MfVQCWD6Uqo2oubI2Eq2y2eqf+A5r0= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 h1:RC6RW7j+1+HkWaX/Yh71Ee5ZHaHYt7ZP4sQgUrm6cDU= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572/go.mod h1:w0SWMsp6j9O/dk4/ZpIhL+3CkG8ofA2vuv7k+ltqUMc= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= -github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1/go.mod h1:8UvriyWtv5Q5EOgjHaSseUEdkQfvwFv1I/In/O2M9gc= github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc h1:9lDbC6Rz4bwmou+oE6Dt4Cb2BGMur5eR/GYptkKUVHo= github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc/go.mod h1:bopw91TMyo8J3tvftk8xmU2kPmlrt4nScJQZU2hE5EM= -github.com/whyrusleeping/mafmt v1.2.8/go.mod h1:faQJFPbLSxzD9xpA02ttW/tS9vZykNvXwGvqIpk20FA= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67 h1:ng3VDlRp5/DHpSWl02R4rM9I+8M2rhmsuLwAMmkLQWE= golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b h1:+/WWzjwW6gidDJnMKWLKLX1gxn7irUTF1fLpQovfQ5M= golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734 h1:p/H982KKEjUnLJkM3tt/LemDnOc1GiZL5FCVlORJ5zo= +golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190227160552-c95aed5357e7 h1:C2F/nMkR/9sfUTpvR3QrjBuTdvMUC/cFajkphs1YLQo= golang.org/x/net v0.0.0-20190227160552-c95aed5357e7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3 h1:0GoQqolDA55aaLxZyTzK/Y2ePZzZTUrRacwib7cNsYQ= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/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-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190219092855-153ac476189d h1:Z0Ahzd7HltpJtjAHHxX8QFP3j1yYgiuvjbjRzDj/KH0= golang.org/x/sys v0.0.0-20190219092855-153ac476189d/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223 h1:DH4skfRX4EBpamg7iV4ZlCpblAHI6s6TDM39bFZumv8= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d h1:+R4KGOnez64A81RvjARKc4UT5/tI9ujCIVX+P5KiHuI= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/vendor/github.com/libp2p/go-libp2p-routing-helpers/limited.go b/vendor/github.com/libp2p/go-libp2p-routing-helpers/limited.go index 308942af..bc1187f5 100644 --- a/vendor/github.com/libp2p/go-libp2p-routing-helpers/limited.go +++ b/vendor/github.com/libp2p/go-libp2p-routing-helpers/limited.go @@ -4,11 +4,9 @@ import ( "context" "strings" - routing "github.com/libp2p/go-libp2p-routing" - ropts "github.com/libp2p/go-libp2p-routing/options" - - ci "github.com/libp2p/go-libp2p-crypto" - peer "github.com/libp2p/go-libp2p-peer" + ci "github.com/libp2p/go-libp2p-core/crypto" + "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p-core/routing" ) // LimitedValueStore limits the internal value store to the given namespaces. @@ -28,7 +26,7 @@ func (lvs *LimitedValueStore) GetPublicKey(ctx context.Context, p peer.ID) (ci.P } // PutValue returns ErrNotSupported -func (lvs *LimitedValueStore) PutValue(ctx context.Context, key string, value []byte, opts ...ropts.Option) error { +func (lvs *LimitedValueStore) PutValue(ctx context.Context, key string, value []byte, opts ...routing.Option) error { if !lvs.KeySupported(key) { return routing.ErrNotSupported } @@ -53,7 +51,7 @@ func (lvs *LimitedValueStore) KeySupported(key string) bool { } // GetValue returns routing.ErrNotFound if key isn't supported -func (lvs *LimitedValueStore) GetValue(ctx context.Context, key string, opts ...ropts.Option) ([]byte, error) { +func (lvs *LimitedValueStore) GetValue(ctx context.Context, key string, opts ...routing.Option) ([]byte, error) { if !lvs.KeySupported(key) { return nil, routing.ErrNotFound } @@ -62,7 +60,7 @@ func (lvs *LimitedValueStore) GetValue(ctx context.Context, key string, opts ... // SearchValue returns empty channel if key isn't supported or calls SearchValue // on the underlying ValueStore -func (lvs *LimitedValueStore) SearchValue(ctx context.Context, key string, opts ...ropts.Option) (<-chan []byte, error) { +func (lvs *LimitedValueStore) SearchValue(ctx context.Context, key string, opts ...routing.Option) (<-chan []byte, error) { if !lvs.KeySupported(key) { out := make(chan []byte) close(out) diff --git a/vendor/github.com/libp2p/go-libp2p-routing-helpers/null.go b/vendor/github.com/libp2p/go-libp2p-routing-helpers/null.go index 31c26404..6a69d697 100644 --- a/vendor/github.com/libp2p/go-libp2p-routing-helpers/null.go +++ b/vendor/github.com/libp2p/go-libp2p-routing-helpers/null.go @@ -3,29 +3,27 @@ package routinghelpers import ( "context" - routing "github.com/libp2p/go-libp2p-routing" - ropts "github.com/libp2p/go-libp2p-routing/options" + "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p-core/routing" - cid "github.com/ipfs/go-cid" - peer "github.com/libp2p/go-libp2p-peer" - pstore "github.com/libp2p/go-libp2p-peerstore" + "github.com/ipfs/go-cid" ) // Null is a router that doesn't do anything. type Null struct{} // PutValue always returns ErrNotSupported -func (nr Null) PutValue(context.Context, string, []byte, ...ropts.Option) error { +func (nr Null) PutValue(context.Context, string, []byte, ...routing.Option) error { return routing.ErrNotSupported } // GetValue always returns ErrNotFound -func (nr Null) GetValue(context.Context, string, ...ropts.Option) ([]byte, error) { +func (nr Null) GetValue(context.Context, string, ...routing.Option) ([]byte, error) { return nil, routing.ErrNotFound } // SearchValue always returns ErrNotFound -func (nr Null) SearchValue(ctx context.Context, key string, opts ...ropts.Option) (<-chan []byte, error) { +func (nr Null) SearchValue(ctx context.Context, key string, opts ...routing.Option) (<-chan []byte, error) { return nil, routing.ErrNotFound } @@ -35,15 +33,15 @@ func (nr Null) Provide(context.Context, cid.Cid, bool) error { } // FindProvidersAsync always returns a closed channel -func (nr Null) FindProvidersAsync(context.Context, cid.Cid, int) <-chan pstore.PeerInfo { - ch := make(chan pstore.PeerInfo) +func (nr Null) FindProvidersAsync(context.Context, cid.Cid, int) <-chan peer.AddrInfo { + ch := make(chan peer.AddrInfo) close(ch) return ch } // FindPeer always returns ErrNotFound -func (nr Null) FindPeer(context.Context, peer.ID) (pstore.PeerInfo, error) { - return pstore.PeerInfo{}, routing.ErrNotFound +func (nr Null) FindPeer(context.Context, peer.ID) (peer.AddrInfo, error) { + return peer.AddrInfo{}, routing.ErrNotFound } // Bootstrap always succeeds instantly @@ -51,4 +49,4 @@ func (nr Null) Bootstrap(context.Context) error { return nil } -var _ routing.IpfsRouting = Null{} +var _ routing.Routing = Null{} diff --git a/vendor/github.com/libp2p/go-libp2p-routing-helpers/package.json b/vendor/github.com/libp2p/go-libp2p-routing-helpers/package.json deleted file mode 100644 index 94eb5fe6..00000000 --- a/vendor/github.com/libp2p/go-libp2p-routing-helpers/package.json +++ /dev/null @@ -1,70 +0,0 @@ -{ - "author": "Stebalien", - "bugs": { - "url": "https://github.com/libp2p/go-libp2p-routing-helpers" - }, - "gx": { - "dvcsimport": "github.com/libp2p/go-libp2p-routing-helpers" - }, - "gxDependencies": [ - { - "author": "whyrusleeping", - "hash": "QmTbxNB1NwDesLmKTscr4udL2tVP7MaxvXnD1D9yX7g3PN", - "name": "go-cid", - "version": "0.9.3" - }, - { - "author": "whyrusleeping", - "hash": "QmTW4SdgBWq9GjsBsHeUx8WuGxzhgzAf88UMH2w62PC8yK", - "name": "go-libp2p-crypto", - "version": "2.0.7" - }, - { - "author": "multiformats", - "hash": "QmerPMzPk1mJVowm8KgmoknWa4yCYvvugMPsgWmDNUvDLW", - "name": "go-multihash", - "version": "1.0.9" - }, - { - "author": "whyrusleeping", - "hash": "QmYVXrKrKHDC9FobgmcmshCDyWwdrfwfanNQN4oxJ9Fk3h", - "name": "go-libp2p-peer", - "version": "3.1.2" - }, - { - "author": "whyrusleeping", - "hash": "QmaCTz9RkrU13bm9kMB54f7atgqM4qkjDZpRwRoJiWXEqs", - "name": "go-libp2p-peerstore", - "version": "2.0.19" - }, - { - "hash": "QmYxUdYY9S6yg5tSPVin5GFTvtfsLauVcr7reHDD3dM8xf", - "name": "go-libp2p-routing", - "version": "2.7.13" - }, - { - "author": "hashicorp", - "hash": "Qmbg4PQLEvf2XW8vrai9STFDerV7kttkfKcVdkoRf9Z7Xu", - "name": "go-errwrap", - "version": "0.1.0" - }, - { - "author": "hashicorp", - "hash": "QmfGQp6VVqdPCDyzEM6EGwMY74YPabTSEoQWHUxZuCSWj3", - "name": "go-multierror", - "version": "0.1.0" - }, - { - "hash": "QmbeHtaBy9nZsW4cHRcvgVY4CnDhXudE2Dr6qDxS7yg9rX", - "name": "go-libp2p-record", - "version": "4.1.15" - } - ], - "gxVersion": "0.12.1", - "language": "go", - "license": "MIT", - "name": "go-libp2p-routing-helpers", - "releaseCmd": "git commit -a -m \"gx publish $VERSION\"", - "version": "0.4.0" -} - diff --git a/vendor/github.com/libp2p/go-libp2p-routing-helpers/parallel.go b/vendor/github.com/libp2p/go-libp2p-routing-helpers/parallel.go index 01f8256f..14e272a5 100644 --- a/vendor/github.com/libp2p/go-libp2p-routing-helpers/parallel.go +++ b/vendor/github.com/libp2p/go-libp2p-routing-helpers/parallel.go @@ -6,19 +6,18 @@ import ( "reflect" "sync" + ci "github.com/libp2p/go-libp2p-core/crypto" + "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p-core/routing" + multierror "github.com/hashicorp/go-multierror" cid "github.com/ipfs/go-cid" - ci "github.com/libp2p/go-libp2p-crypto" - peer "github.com/libp2p/go-libp2p-peer" - pstore "github.com/libp2p/go-libp2p-peerstore" record "github.com/libp2p/go-libp2p-record" - routing "github.com/libp2p/go-libp2p-routing" - ropts "github.com/libp2p/go-libp2p-routing/options" ) // Parallel operates on the slice of routers in parallel. type Parallel struct { - Routers []routing.IpfsRouting + Routers []routing.Routing Validator record.Validator } @@ -101,8 +100,8 @@ func supportsContent(vs routing.ContentRouting) bool { } } -func (r Parallel) filter(filter func(routing.IpfsRouting) bool) Parallel { - cpy := make([]routing.IpfsRouting, 0, len(r.Routers)) +func (r Parallel) filter(filter func(routing.Routing) bool) Parallel { + cpy := make([]routing.Routing, 0, len(r.Routers)) for _, ri := range r.Routers { if filter(ri) { cpy = append(cpy, ri) @@ -111,7 +110,7 @@ func (r Parallel) filter(filter func(routing.IpfsRouting) bool) Parallel { return Parallel{Routers: cpy, Validator: r.Validator} } -func (r Parallel) put(do func(routing.IpfsRouting) error) error { +func (r Parallel) put(do func(routing.Routing) error) error { switch len(r.Routers) { case 0: return routing.ErrNotSupported @@ -123,7 +122,7 @@ func (r Parallel) put(do func(routing.IpfsRouting) error) error { results := make([]error, len(r.Routers)) wg.Add(len(r.Routers)) for i, ri := range r.Routers { - go func(ri routing.IpfsRouting, i int) { + go func(ri routing.Routing, i int) { results[i] = do(ri) wg.Done() }(ri, i) @@ -160,7 +159,7 @@ func (r Parallel) put(do func(routing.IpfsRouting) error) error { } } -func (r Parallel) search(ctx context.Context, do func(routing.IpfsRouting) (<-chan []byte, error)) (<-chan []byte, error) { +func (r Parallel) search(ctx context.Context, do func(routing.Routing) (<-chan []byte, error)) (<-chan []byte, error) { switch len(r.Routers) { case 0: return nil, routing.ErrNotFound @@ -221,7 +220,7 @@ func (r Parallel) search(ctx context.Context, do func(routing.IpfsRouting) (<-ch return out, nil } -func (r Parallel) get(ctx context.Context, do func(routing.IpfsRouting) (interface{}, error)) (interface{}, error) { +func (r Parallel) get(ctx context.Context, do func(routing.Routing) (interface{}, error)) (interface{}, error) { switch len(r.Routers) { case 0: return nil, routing.ErrNotFound @@ -237,7 +236,7 @@ func (r Parallel) get(ctx context.Context, do func(routing.IpfsRouting) (interfa err error }) for _, ri := range r.Routers { - go func(ri routing.IpfsRouting) { + go func(ri routing.Routing) { value, err := do(ri) select { case results <- struct { @@ -284,27 +283,27 @@ func (r Parallel) get(ctx context.Context, do func(routing.IpfsRouting) (interfa } func (r Parallel) forKey(key string) Parallel { - return r.filter(func(ri routing.IpfsRouting) bool { + return r.filter(func(ri routing.Routing) bool { return supportsKey(ri, key) }) } -func (r Parallel) PutValue(ctx context.Context, key string, value []byte, opts ...ropts.Option) error { - return r.forKey(key).put(func(ri routing.IpfsRouting) error { +func (r Parallel) PutValue(ctx context.Context, key string, value []byte, opts ...routing.Option) error { + return r.forKey(key).put(func(ri routing.Routing) error { return ri.PutValue(ctx, key, value, opts...) }) } -func (r Parallel) GetValue(ctx context.Context, key string, opts ...ropts.Option) ([]byte, error) { - vInt, err := r.forKey(key).get(ctx, func(ri routing.IpfsRouting) (interface{}, error) { +func (r Parallel) GetValue(ctx context.Context, key string, opts ...routing.Option) ([]byte, error) { + vInt, err := r.forKey(key).get(ctx, func(ri routing.Routing) (interface{}, error) { return ri.GetValue(ctx, key, opts...) }) val, _ := vInt.([]byte) return val, err } -func (r Parallel) SearchValue(ctx context.Context, key string, opts ...ropts.Option) (<-chan []byte, error) { - resCh, err := r.forKey(key).search(ctx, func(ri routing.IpfsRouting) (<-chan []byte, error) { +func (r Parallel) SearchValue(ctx context.Context, key string, opts ...routing.Option) (<-chan []byte, error) { + resCh, err := r.forKey(key).search(ctx, func(ri routing.Routing) (<-chan []byte, error) { return ri.SearchValue(ctx, key, opts...) }) if err != nil { @@ -345,50 +344,50 @@ func (r Parallel) SearchValue(ctx context.Context, key string, opts ...ropts.Opt func (r Parallel) GetPublicKey(ctx context.Context, p peer.ID) (ci.PubKey, error) { vInt, err := r. forKey(routing.KeyForPublicKey(p)). - get(ctx, func(ri routing.IpfsRouting) (interface{}, error) { + get(ctx, func(ri routing.Routing) (interface{}, error) { return routing.GetPublicKey(ri, ctx, p) }) val, _ := vInt.(ci.PubKey) return val, err } -func (r Parallel) FindPeer(ctx context.Context, p peer.ID) (pstore.PeerInfo, error) { - vInt, err := r.filter(func(ri routing.IpfsRouting) bool { +func (r Parallel) FindPeer(ctx context.Context, p peer.ID) (peer.AddrInfo, error) { + vInt, err := r.filter(func(ri routing.Routing) bool { return supportsPeer(ri) - }).get(ctx, func(ri routing.IpfsRouting) (interface{}, error) { + }).get(ctx, func(ri routing.Routing) (interface{}, error) { return ri.FindPeer(ctx, p) }) - pi, _ := vInt.(pstore.PeerInfo) + pi, _ := vInt.(peer.AddrInfo) return pi, err } func (r Parallel) Provide(ctx context.Context, c cid.Cid, local bool) error { - return r.filter(func(ri routing.IpfsRouting) bool { + return r.filter(func(ri routing.Routing) bool { return supportsContent(ri) - }).put(func(ri routing.IpfsRouting) error { + }).put(func(ri routing.Routing) error { return ri.Provide(ctx, c, local) }) } -func (r Parallel) FindProvidersAsync(ctx context.Context, c cid.Cid, count int) <-chan pstore.PeerInfo { - routers := r.filter(func(ri routing.IpfsRouting) bool { +func (r Parallel) FindProvidersAsync(ctx context.Context, c cid.Cid, count int) <-chan peer.AddrInfo { + routers := r.filter(func(ri routing.Routing) bool { return supportsContent(ri) }) switch len(routers.Routers) { case 0: - ch := make(chan pstore.PeerInfo) + ch := make(chan peer.AddrInfo) close(ch) return ch case 1: return routers.Routers[0].FindProvidersAsync(ctx, c, count) } - out := make(chan pstore.PeerInfo) + out := make(chan peer.AddrInfo) ctx, cancel := context.WithCancel(ctx) - providers := make([]<-chan pstore.PeerInfo, len(routers.Routers)) + providers := make([]<-chan peer.AddrInfo, len(routers.Routers)) for i, ri := range routers.Routers { providers[i] = ri.FindProvidersAsync(ctx, c, count) } @@ -408,7 +407,7 @@ func (r Parallel) FindProvidersAsync(ctx context.Context, c cid.Cid, count int) // Unoptimized many provider case. Doing this with reflection is a bit slow but // definitely simpler. If we start having more than 8 peer routers running in // parallel, we can revisit this. -func manyProviders(ctx context.Context, out chan<- pstore.PeerInfo, in []<-chan pstore.PeerInfo, count int) { +func manyProviders(ctx context.Context, out chan<- peer.AddrInfo, in []<-chan peer.AddrInfo, count int) { found := make(map[peer.ID]struct{}, count) selectCases := make([]reflect.SelectCase, len(in)) @@ -427,7 +426,7 @@ func manyProviders(ctx context.Context, out chan<- pstore.PeerInfo, in []<-chan continue } - pi := val.Interface().(pstore.PeerInfo) + pi := val.Interface().(peer.AddrInfo) if _, ok := found[pi.ID]; ok { continue } @@ -443,19 +442,19 @@ func manyProviders(ctx context.Context, out chan<- pstore.PeerInfo, in []<-chan } // Optimization for few providers (<=8). -func fewProviders(ctx context.Context, out chan<- pstore.PeerInfo, in []<-chan pstore.PeerInfo, count int) { +func fewProviders(ctx context.Context, out chan<- peer.AddrInfo, in []<-chan peer.AddrInfo, count int) { if len(in) > 8 { panic("case only valid for combining fewer than 8 channels") } found := make(map[peer.ID]struct{}, count) - cases := make([]<-chan pstore.PeerInfo, 8) + cases := make([]<-chan peer.AddrInfo, 8) copy(cases, in) // Oh go, what would we do without you! nch := len(in) - var pi pstore.PeerInfo + var pi peer.AddrInfo for nch > 0 && count > 0 { var ok bool var selected int @@ -506,4 +505,4 @@ func (r Parallel) Bootstrap(ctx context.Context) error { return me.ErrorOrNil() } -var _ routing.IpfsRouting = Parallel{} +var _ routing.Routing = Parallel{} diff --git a/vendor/github.com/libp2p/go-libp2p-routing-helpers/tiered.go b/vendor/github.com/libp2p/go-libp2p-routing-helpers/tiered.go index 7d13eb27..36fa6caf 100644 --- a/vendor/github.com/libp2p/go-libp2p-routing-helpers/tiered.go +++ b/vendor/github.com/libp2p/go-libp2p-routing-helpers/tiered.go @@ -3,29 +3,27 @@ package routinghelpers import ( "context" - routing "github.com/libp2p/go-libp2p-routing" - ropts "github.com/libp2p/go-libp2p-routing/options" + ci "github.com/libp2p/go-libp2p-core/crypto" + "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p-core/routing" multierror "github.com/hashicorp/go-multierror" cid "github.com/ipfs/go-cid" - ci "github.com/libp2p/go-libp2p-crypto" - peer "github.com/libp2p/go-libp2p-peer" - pstore "github.com/libp2p/go-libp2p-peerstore" record "github.com/libp2p/go-libp2p-record" ) // Tiered is like the Parallel except that GetValue and FindPeer // are called in series. type Tiered struct { - Routers []routing.IpfsRouting + Routers []routing.Routing Validator record.Validator } -func (r Tiered) PutValue(ctx context.Context, key string, value []byte, opts ...ropts.Option) error { +func (r Tiered) PutValue(ctx context.Context, key string, value []byte, opts ...routing.Option) error { return Parallel{Routers: r.Routers}.PutValue(ctx, key, value, opts...) } -func (r Tiered) get(ctx context.Context, do func(routing.IpfsRouting) (interface{}, error)) (interface{}, error) { +func (r Tiered) get(ctx context.Context, do func(routing.Routing) (interface{}, error)) (interface{}, error) { var errs []error for _, ri := range r.Routers { val, err := do(ri) @@ -50,20 +48,20 @@ func (r Tiered) get(ctx context.Context, do func(routing.IpfsRouting) (interface } } -func (r Tiered) GetValue(ctx context.Context, key string, opts ...ropts.Option) ([]byte, error) { - valInt, err := r.get(ctx, func(ri routing.IpfsRouting) (interface{}, error) { +func (r Tiered) GetValue(ctx context.Context, key string, opts ...routing.Option) ([]byte, error) { + valInt, err := r.get(ctx, func(ri routing.Routing) (interface{}, error) { return ri.GetValue(ctx, key, opts...) }) val, _ := valInt.([]byte) return val, err } -func (r Tiered) SearchValue(ctx context.Context, key string, opts ...ropts.Option) (<-chan []byte, error) { +func (r Tiered) SearchValue(ctx context.Context, key string, opts ...routing.Option) (<-chan []byte, error) { return Parallel{Routers: r.Routers, Validator: r.Validator}.SearchValue(ctx, key, opts...) } func (r Tiered) GetPublicKey(ctx context.Context, p peer.ID) (ci.PubKey, error) { - vInt, err := r.get(ctx, func(ri routing.IpfsRouting) (interface{}, error) { + vInt, err := r.get(ctx, func(ri routing.Routing) (interface{}, error) { return routing.GetPublicKey(ri, ctx, p) }) val, _ := vInt.(ci.PubKey) @@ -74,15 +72,15 @@ func (r Tiered) Provide(ctx context.Context, c cid.Cid, local bool) error { return Parallel{Routers: r.Routers}.Provide(ctx, c, local) } -func (r Tiered) FindProvidersAsync(ctx context.Context, c cid.Cid, count int) <-chan pstore.PeerInfo { +func (r Tiered) FindProvidersAsync(ctx context.Context, c cid.Cid, count int) <-chan peer.AddrInfo { return Parallel{Routers: r.Routers}.FindProvidersAsync(ctx, c, count) } -func (r Tiered) FindPeer(ctx context.Context, p peer.ID) (pstore.PeerInfo, error) { - valInt, err := r.get(ctx, func(ri routing.IpfsRouting) (interface{}, error) { +func (r Tiered) FindPeer(ctx context.Context, p peer.ID) (peer.AddrInfo, error) { + valInt, err := r.get(ctx, func(ri routing.Routing) (interface{}, error) { return ri.FindPeer(ctx, p) }) - val, _ := valInt.(pstore.PeerInfo) + val, _ := valInt.(peer.AddrInfo) return val, err } @@ -90,4 +88,4 @@ func (r Tiered) Bootstrap(ctx context.Context) error { return Parallel{Routers: r.Routers}.Bootstrap(ctx) } -var _ routing.IpfsRouting = Tiered{} +var _ routing.Routing = Tiered{} diff --git a/vendor/github.com/libp2p/go-libp2p-routing/.travis.yml b/vendor/github.com/libp2p/go-libp2p-routing/.travis.yml deleted file mode 100644 index 4cfe98c2..00000000 --- a/vendor/github.com/libp2p/go-libp2p-routing/.travis.yml +++ /dev/null @@ -1,32 +0,0 @@ -os: - - linux - -language: go - -go: - - 1.11.x - -env: - global: - - GOTFLAGS="-race" - matrix: - - BUILD_DEPTYPE=gx - - BUILD_DEPTYPE=gomod - - -# disable travis install -install: - - true - -script: - - bash <(curl -s https://raw.githubusercontent.com/ipfs/ci-helpers/master/travis-ci/run-standard-tests.sh) - - -cache: - directories: - - $GOPATH/src/gx - - $GOPATH/pkg/mod - - $HOME/.cache/go-build - -notifications: - email: false diff --git a/vendor/github.com/libp2p/go-libp2p-routing/Makefile b/vendor/github.com/libp2p/go-libp2p-routing/Makefile deleted file mode 100644 index a89e6d08..00000000 --- a/vendor/github.com/libp2p/go-libp2p-routing/Makefile +++ /dev/null @@ -1,9 +0,0 @@ -export IPFS_API ?= v04x.ipfs.io - -gx: - go get -u github.com/whyrusleeping/gx - go get -u github.com/whyrusleeping/gx-go - -deps: gx - gx --verbose install --global - gx-go rewrite \ No newline at end of file diff --git a/vendor/github.com/libp2p/go-libp2p-routing/README.md b/vendor/github.com/libp2p/go-libp2p-routing/README.md deleted file mode 100644 index 5b196bf5..00000000 --- a/vendor/github.com/libp2p/go-libp2p-routing/README.md +++ /dev/null @@ -1,26 +0,0 @@ -# go-libp2p-routing - -[![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](http://ipn.io) -[![](https://img.shields.io/badge/project-IPFS-blue.svg?style=flat-square)](http://ipfs.io/) -[![](https://img.shields.io/badge/freenode-%23ipfs-blue.svg?style=flat-square)](http://webchat.freenode.net/?channels=%23ipfs) -[![standard-readme compliant](https://img.shields.io/badge/standard--readme-OK-green.svg?style=flat-square)](https://github.com/RichardLitt/standard-readme) - -> A collection of routing interfaces for go-libp2p - -## Documenation - -See https://godoc.org/github.com/libp2p/go-libp2p-routing. - -## Contribute - -Feel free to join in. All welcome. Open an [issue](https://github.com/libp2p/go-libp2p-routing/issues)! - -This repository falls under the IPFS [Code of Conduct](https://github.com/ipfs/community/blob/master/code-of-conduct.md). - -### Want to hack on IPFS? - -[![](https://cdn.rawgit.com/jbenet/contribute-ipfs-gif/master/img/contribute.gif)](https://github.com/ipfs/community/blob/master/contributing.md) - -## License - -MIT \ No newline at end of file diff --git a/vendor/github.com/libp2p/go-libp2p-routing/codecov.yml b/vendor/github.com/libp2p/go-libp2p-routing/codecov.yml deleted file mode 100644 index 5f88a9ea..00000000 --- a/vendor/github.com/libp2p/go-libp2p-routing/codecov.yml +++ /dev/null @@ -1,3 +0,0 @@ -coverage: - range: "50...100" -comment: off diff --git a/vendor/github.com/libp2p/go-libp2p-routing/go.mod b/vendor/github.com/libp2p/go-libp2p-routing/go.mod deleted file mode 100644 index e661bcab..00000000 --- a/vendor/github.com/libp2p/go-libp2p-routing/go.mod +++ /dev/null @@ -1,8 +0,0 @@ -module github.com/libp2p/go-libp2p-routing - -require ( - github.com/ipfs/go-cid v0.0.1 - github.com/libp2p/go-libp2p-crypto v0.0.1 - github.com/libp2p/go-libp2p-peer v0.0.1 - github.com/libp2p/go-libp2p-peerstore v0.0.1 -) diff --git a/vendor/github.com/libp2p/go-libp2p-routing/go.sum b/vendor/github.com/libp2p/go-libp2p-routing/go.sum deleted file mode 100644 index 4105d68a..00000000 --- a/vendor/github.com/libp2p/go-libp2p-routing/go.sum +++ /dev/null @@ -1,104 +0,0 @@ -github.com/AndreasBriese/bbloom v0.0.0-20180913140656-343706a395b7/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= -github.com/Kubuxu/go-os-helper v0.0.1/go.mod h1:N8B+I7vPCT80IcP58r50u4+gEEcsZETFUpAzWW2ep1Y= -github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= -github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32 h1:qkOC5Gd33k54tobS36cXdAzJbeHaduLtnLQQwNoIi78= -github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32/go.mod h1:DrZx5ec/dmnfpw9KyYoQyYo7d0KEvTkk/5M/vbZjAr8= -github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= -github.com/btcsuite/btcutil v0.0.0-20190207003914-4c204d697803/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= -github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= -github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= -github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= -github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= -github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= -github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dgraph-io/badger v1.5.5-0.20190226225317-8115aed38f8f/go.mod h1:VZxzAIRPHRVNRKRo6AXrX9BJegn6il06VMTZVJYCIjQ= -github.com/dgryski/go-farm v0.0.0-20190104051053-3adb47b1fb0f/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= -github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0= -github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/gxed/hashland/keccakpg v0.0.1 h1:wrk3uMNaMxbXiHibbPO4S0ymqJMm41WiudyFSs7UnsU= -github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfmKFJ6tItnhQ67kU= -github.com/gxed/hashland/murmur3 v0.0.1 h1:SheiaIt0sda5K+8FLz952/1iWS9zrnKsEJaOJu4ZbSc= -github.com/gxed/hashland/murmur3 v0.0.1/go.mod h1:KjXop02n4/ckmZSnY2+HKcLud/tcmvhST0bie/0lS48= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/ipfs/go-cid v0.0.1 h1:GBjWPktLnNyX0JiQCNFpUuUSoMw5KMyqrsejHYlILBE= -github.com/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= -github.com/ipfs/go-datastore v0.0.1/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= -github.com/ipfs/go-ds-badger v0.0.2/go.mod h1:Y3QpeSFWQf6MopLTiZD+VT6IC1yZqaGmjvRcKeSGij8= -github.com/ipfs/go-ds-leveldb v0.0.1/go.mod h1:feO8V3kubwsEF22n0YRQCffeb79OOYIykR4L04tMOYc= -github.com/ipfs/go-ipfs-delay v0.0.0-20181109222059-70721b86a9a8/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= -github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM= -github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8/go.mod h1:Ly/wlsjFq/qrU3Rar62tu1gASgGw6chQbSh/XgIIXCY= -github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= -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/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/libp2p/go-buffer-pool v0.0.1/go.mod h1:xtyIz9PMobb13WaxR6Zo1Pd1zXJKYg0a8KiIvDp3TzQ= -github.com/libp2p/go-libp2p-crypto v0.0.1 h1:JNQd8CmoGTohO/akqrH16ewsqZpci2CbgYH/LmYl8gw= -github.com/libp2p/go-libp2p-crypto v0.0.1/go.mod h1:yJkNyDmO341d5wwXxDUGO0LykUVT72ImHNUqh5D/dBE= -github.com/libp2p/go-libp2p-peer v0.0.1 h1:0qwAOljzYewINrU+Kndoc+1jAL7vzY/oY2Go4DCGfyY= -github.com/libp2p/go-libp2p-peer v0.0.1/go.mod h1:nXQvOBbwVqoP+T5Y5nCjeH4sP9IX/J0AMzcDUVruVoo= -github.com/libp2p/go-libp2p-peerstore v0.0.1 h1:twKovq8YK5trLrd3nB7PD2Zu9JcyAIdm7Bz9yBWjhq8= -github.com/libp2p/go-libp2p-peerstore v0.0.1/go.mod h1:RabLyPVJLuNQ+GFyoEkfi8H4Ti6k/HtZJ7YKgtSq+20= -github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= -github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0OXOcUbGjvZxxijuBwbbmlSxLiuofa+g= -github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= -github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16 h1:5W7KhL8HVF3XCFOweFD3BNESdnO8ewyYTFT2R+/b8FQ= -github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= -github.com/mr-tron/base58 v1.1.0 h1:Y51FGVJ91WBqCEabAi5OPUz38eAx8DakuAm5svLcsfQ= -github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= -github.com/multiformats/go-base32 v0.0.3 h1:tw5+NhuwaOjJCC5Pp82QuXbrmLzWg7uxlMFp8Nq/kkI= -github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= -github.com/multiformats/go-multiaddr v0.0.1 h1:/QUV3VBMDI6pi6xfiw7lr6xhDWWvQKn9udPn68kLSdY= -github.com/multiformats/go-multiaddr v0.0.1/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= -github.com/multiformats/go-multiaddr-dns v0.0.1/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= -github.com/multiformats/go-multiaddr-net v0.0.1/go.mod h1:nw6HSxNmCIQH27XPGBuX+d1tnvM7ihcFwHMSstNAVUU= -github.com/multiformats/go-multibase v0.0.1 h1:PN9/v21eLywrFWdFNsFKaU04kLJzuYzmrJR+ubhT9qA= -github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs= -github.com/multiformats/go-multihash v0.0.1 h1:HHwN1K12I+XllBCrqKnhX949Orn4oawPkegHMu2vDqQ= -github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= -github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1/go.mod h1:8UvriyWtv5Q5EOgjHaSseUEdkQfvwFv1I/In/O2M9gc= -github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc/go.mod h1:bopw91TMyo8J3tvftk8xmU2kPmlrt4nScJQZU2hE5EM= -github.com/whyrusleeping/mafmt v1.2.8/go.mod h1:faQJFPbLSxzD9xpA02ttW/tS9vZykNvXwGvqIpk20FA= -golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b h1:+/WWzjwW6gidDJnMKWLKLX1gxn7irUTF1fLpQovfQ5M= -golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190227160552-c95aed5357e7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/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-20190219092855-153ac476189d/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223 h1:DH4skfRX4EBpamg7iV4ZlCpblAHI6s6TDM39bFZumv8= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/vendor/github.com/libp2p/go-libp2p-routing/notifications/deprecated.go b/vendor/github.com/libp2p/go-libp2p-routing/notifications/deprecated.go new file mode 100644 index 00000000..29e9e925 --- /dev/null +++ b/vendor/github.com/libp2p/go-libp2p-routing/notifications/deprecated.go @@ -0,0 +1,48 @@ +// Deprecated: use github.com/libp2p/go-libp2p-core/routing instead. +package notifications + +import ( + "context" + + core "github.com/libp2p/go-libp2p-core/routing" +) + +// Deprecated: use github.com/libp2p/go-libp2p-core/routing/QueryEventType instead. +type QueryEventType = core.QueryEventType + +// Deprecated: use github.com/libp2p/go-libp2p-core/routing/QueryEventBufferSize instead. +// Warning: it's impossible to alias a var in go, so reads and writes to this variable may be inaccurate +// or not have the intended effect. +var QueryEventBufferSize = core.QueryEventBufferSize + +const ( + // Deprecated: use github.com/libp2p/go-libp2p-core/routing/SendingQuery instead. + SendingQuery = core.SendingQuery + // Deprecated: use github.com/libp2p/go-libp2p-core/routing/PeerResponse instead. + PeerResponse = core.PeerResponse + // Deprecated: use github.com/libp2p/go-libp2p-core/routing/FinalPeer instead. + FinalPeer = core.FinalPeer + // Deprecated: use github.com/libp2p/go-libp2p-core/routing/QueryError instead. + QueryError = core.QueryError + // Deprecated: use github.com/libp2p/go-libp2p-core/routing/Provider instead. + Provider = core.Provider + // Deprecated: use github.com/libp2p/go-libp2p-core/routing/Value instead. + Value = core.Value + // Deprecated: use github.com/libp2p/go-libp2p-core/routing/AddingPeer instead. + AddingPeer = core.AddingPeer + // Deprecated: use github.com/libp2p/go-libp2p-core/routing/DialingPeer instead. + DialingPeer = core.DialingPeer +) + +// Deprecated: use github.com/libp2p/go-libp2p-core/routing/QueryEvent instead. +type QueryEvent = core.QueryEvent + +// Deprecated: use github.com/libp2p/go-libp2p-core/routing/RegisterForQueryEvents instead. +func RegisterForQueryEvents(ctx context.Context) (context.Context, <-chan *core.QueryEvent) { + return core.RegisterForQueryEvents(ctx) +} + +// Deprecated: use github.com/libp2p/go-libp2p-core/routing/PublishQueryEvent instead. +func PublishQueryEvent(ctx context.Context, ev *core.QueryEvent) { + core.PublishQueryEvent(ctx, ev) +} diff --git a/vendor/github.com/libp2p/go-libp2p-routing/package.json b/vendor/github.com/libp2p/go-libp2p-routing/package.json deleted file mode 100644 index da12cf8c..00000000 --- a/vendor/github.com/libp2p/go-libp2p-routing/package.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "bugs": { - "url": "https://github.com/libp2p/go-libp2p-routing" - }, - "gx": { - "dvcsimport": "github.com/libp2p/go-libp2p-routing", - "goversion": "1.5.2" - }, - "gxDependencies": [ - { - "author": "whyrusleeping", - "hash": "QmTW4SdgBWq9GjsBsHeUx8WuGxzhgzAf88UMH2w62PC8yK", - "name": "go-libp2p-crypto", - "version": "2.0.7" - }, - { - "author": "whyrusleeping", - "hash": "QmaCTz9RkrU13bm9kMB54f7atgqM4qkjDZpRwRoJiWXEqs", - "name": "go-libp2p-peerstore", - "version": "2.0.19" - }, - { - "author": "whyrusleeping", - "hash": "QmTbxNB1NwDesLmKTscr4udL2tVP7MaxvXnD1D9yX7g3PN", - "name": "go-cid", - "version": "0.9.3" - }, - { - "author": "whyrusleeping", - "hash": "QmYVXrKrKHDC9FobgmcmshCDyWwdrfwfanNQN4oxJ9Fk3h", - "name": "go-libp2p-peer", - "version": "3.1.2" - } - ], - "gxVersion": "0.4.0", - "language": "go", - "license": "MIT", - "name": "go-libp2p-routing", - "releaseCmd": "git commit -a -m \"gx publish $VERSION\"", - "version": "2.7.13" -} - diff --git a/vendor/github.com/libp2p/go-libp2p-secio/al.go b/vendor/github.com/libp2p/go-libp2p-secio/al.go index 7f557d28..6423f3f2 100644 --- a/vendor/github.com/libp2p/go-libp2p-secio/al.go +++ b/vendor/github.com/libp2p/go-libp2p-secio/al.go @@ -12,7 +12,7 @@ import ( "crypto/sha512" "hash" - ci "github.com/libp2p/go-libp2p-crypto" + ci "github.com/libp2p/go-libp2p-core/crypto" sha256 "github.com/minio/sha256-simd" bfish "golang.org/x/crypto/blowfish" ) diff --git a/vendor/github.com/libp2p/go-libp2p-secio/go.mod b/vendor/github.com/libp2p/go-libp2p-secio/go.mod index 00640012..259f7549 100644 --- a/vendor/github.com/libp2p/go-libp2p-secio/go.mod +++ b/vendor/github.com/libp2p/go-libp2p-secio/go.mod @@ -1,14 +1,15 @@ module github.com/libp2p/go-libp2p-secio +go 1.12 + require ( github.com/gogo/protobuf v1.2.1 github.com/ipfs/go-log v0.0.1 - github.com/libp2p/go-buffer-pool v0.0.1 - github.com/libp2p/go-conn-security v0.0.1 - github.com/libp2p/go-libp2p-crypto v0.0.1 - github.com/libp2p/go-libp2p-peer v0.0.1 + github.com/libp2p/go-buffer-pool v0.0.2 + github.com/libp2p/go-libp2p-core v0.0.1 + github.com/libp2p/go-libp2p-testing v0.0.2 github.com/libp2p/go-msgio v0.0.2 - github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16 - github.com/multiformats/go-multihash v0.0.1 - golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25 + github.com/minio/sha256-simd v0.1.0 + github.com/multiformats/go-multihash v0.0.5 + golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f ) diff --git a/vendor/github.com/libp2p/go-libp2p-secio/go.sum b/vendor/github.com/libp2p/go-libp2p-secio/go.sum index 93892ca5..80a4d90c 100644 --- a/vendor/github.com/libp2p/go-libp2p-secio/go.sum +++ b/vendor/github.com/libp2p/go-libp2p-secio/go.sum @@ -10,6 +10,7 @@ github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVa github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -30,6 +31,7 @@ github.com/gxed/hashland/murmur3 v0.0.1 h1:SheiaIt0sda5K+8FLz952/1iWS9zrnKsEJaOJ github.com/gxed/hashland/murmur3 v0.0.1/go.mod h1:KjXop02n4/ckmZSnY2+HKcLud/tcmvhST0bie/0lS48= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= github.com/ipfs/go-datastore v0.0.1/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= github.com/ipfs/go-ds-badger v0.0.2/go.mod h1:Y3QpeSFWQf6MopLTiZD+VT6IC1yZqaGmjvRcKeSGij8= github.com/ipfs/go-ds-leveldb v0.0.1/go.mod h1:feO8V3kubwsEF22n0YRQCffeb79OOYIykR4L04tMOYc= @@ -48,10 +50,18 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/libp2p/go-buffer-pool v0.0.1 h1:9Rrn/H46cXjaA2HQ5Y8lyhOS1NhTkZ4yuEs2r3Eechg= github.com/libp2p/go-buffer-pool v0.0.1/go.mod h1:xtyIz9PMobb13WaxR6Zo1Pd1zXJKYg0a8KiIvDp3TzQ= +github.com/libp2p/go-buffer-pool v0.0.2 h1:QNK2iAFa8gjAe1SPz6mHSMuCcjs+X1wlHzeOSqcmlfs= +github.com/libp2p/go-buffer-pool v0.0.2/go.mod h1:MvaB6xw5vOrDl8rYZGLFdKAuk/hRoRZd1Vi32+RXyFM= github.com/libp2p/go-conn-security v0.0.1 h1:4kMMrqrt9EUNCNjX1xagSJC+bq16uqjMe9lk1KBMVNs= github.com/libp2p/go-conn-security v0.0.1/go.mod h1:bGmu51N0KU9IEjX7kl2PQjgZa40JQWnayTvNMgD/vyk= +github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZxBdp967ls1g+k8= +github.com/libp2p/go-libp2p-core v0.0.0-20190422125857-3a54eb68d178 h1:+wsyafI3SBZy7fMT8bTdHyrzKnPJfDShnbfjxXM3uqk= +github.com/libp2p/go-libp2p-core v0.0.0-20190422125857-3a54eb68d178/go.mod h1:GYAqGjbAd2HxtkR5D6HsOp1ZPBrGvCD0eCLX8rQtNMw= +github.com/libp2p/go-libp2p-core v0.0.1 h1:HSTZtFIq/W5Ue43Zw+uWZyy2Vl5WtF0zDjKN8/DT/1I= +github.com/libp2p/go-libp2p-core v0.0.1/go.mod h1:g/VxnTZ/1ygHxH3dKok7Vno1VfpvGcGip57wjTU4fco= github.com/libp2p/go-libp2p-crypto v0.0.1 h1:JNQd8CmoGTohO/akqrH16ewsqZpci2CbgYH/LmYl8gw= github.com/libp2p/go-libp2p-crypto v0.0.1/go.mod h1:yJkNyDmO341d5wwXxDUGO0LykUVT72ImHNUqh5D/dBE= +github.com/libp2p/go-libp2p-crypto v0.0.2-0.20190422130203-0dad27f616de/go.mod h1:WJ6wEfm4tBdTVrgE7Mle69TjHcAxZArSmhNasnU5HXg= github.com/libp2p/go-libp2p-net v0.0.1 h1:xJ4Vh4yKF/XKb8fd1Ev0ebAGzVjMxXzrxG2kjtU+F5Q= github.com/libp2p/go-libp2p-net v0.0.1/go.mod h1:Yt3zgmlsHOgUWSXmt5V/Jpz9upuJBE8EgNU9DrCcR8c= github.com/libp2p/go-libp2p-peer v0.0.1 h1:0qwAOljzYewINrU+Kndoc+1jAL7vzY/oY2Go4DCGfyY= @@ -60,6 +70,8 @@ github.com/libp2p/go-libp2p-peerstore v0.0.1 h1:twKovq8YK5trLrd3nB7PD2Zu9JcyAIdm github.com/libp2p/go-libp2p-peerstore v0.0.1/go.mod h1:RabLyPVJLuNQ+GFyoEkfi8H4Ti6k/HtZJ7YKgtSq+20= github.com/libp2p/go-libp2p-protocol v0.0.1 h1:+zkEmZ2yFDi5adpVE3t9dqh/N9TbpFWywowzeEzBbLM= github.com/libp2p/go-libp2p-protocol v0.0.1/go.mod h1:Af9n4PiruirSDjHycM1QuiMi/1VZNHYcK8cLgFJLZ4s= +github.com/libp2p/go-libp2p-testing v0.0.2 h1:p9ySW7MFvGGs83hAAe0MPGnjy/tPjl5KyxpMkojdZ+g= +github.com/libp2p/go-libp2p-testing v0.0.2/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= github.com/libp2p/go-msgio v0.0.2 h1:ivPvEKHxmVkTClHzg6RXTYHqaJQ0V9cDbq+6lKb3UV0= github.com/libp2p/go-msgio v0.0.2/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= github.com/libp2p/go-stream-muxer v0.0.1 h1:Ce6e2Pyu+b5MC1k3eeFtAax0pW4gc6MosYSLV05UeLw= @@ -72,15 +84,27 @@ github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0 github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16 h1:5W7KhL8HVF3XCFOweFD3BNESdnO8ewyYTFT2R+/b8FQ= github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= +github.com/minio/sha256-simd v0.0.0-20190328051042-05b4dd3047e5/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= +github.com/minio/sha256-simd v0.1.0 h1:U41/2erhAKcmSI14xh/ZTUdBPOzDOIfS93ibzUSl8KM= +github.com/minio/sha256-simd v0.1.0/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= github.com/mr-tron/base58 v1.1.0 h1:Y51FGVJ91WBqCEabAi5OPUz38eAx8DakuAm5svLcsfQ= github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= +github.com/mr-tron/base58 v1.1.1 h1:OJIdWOWYe2l5PQNgimGtuwHY8nDskvJ5vvs//YnzRLs= +github.com/mr-tron/base58 v1.1.1/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= +github.com/mr-tron/base58 v1.1.2 h1:ZEw4I2EgPKDJ2iEw0cNmLB3ROrEmkOtXIkaG7wZg+78= +github.com/mr-tron/base58 v1.1.2/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= github.com/multiformats/go-multiaddr v0.0.1 h1:/QUV3VBMDI6pi6xfiw7lr6xhDWWvQKn9udPn68kLSdY= github.com/multiformats/go-multiaddr v0.0.1/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= +github.com/multiformats/go-multiaddr v0.0.2 h1:RBysRCv5rv3FWlhKWKoXv8tnsCUpEpIZpCmqAGZos2s= +github.com/multiformats/go-multiaddr v0.0.2/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= github.com/multiformats/go-multiaddr-dns v0.0.1/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= github.com/multiformats/go-multiaddr-net v0.0.1/go.mod h1:nw6HSxNmCIQH27XPGBuX+d1tnvM7ihcFwHMSstNAVUU= +github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs= github.com/multiformats/go-multihash v0.0.1 h1:HHwN1K12I+XllBCrqKnhX949Orn4oawPkegHMu2vDqQ= github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= +github.com/multiformats/go-multihash v0.0.5 h1:1wxmCvTXAifAepIMyF39vZinRw5sbqjPs/UIi93+uik= +github.com/multiformats/go-multihash v0.0.5/go.mod h1:lt/HCbqlQwlPBz7lv0sQCdtfcMtlJvakRUn/0Ual8po= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= @@ -89,6 +113,10 @@ github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFSt 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/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a/go.mod h1:7AyxJNCJ7SBZ1MfVQCWD6Uqo2oubI2Eq2y2eqf+A5r0= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572/go.mod h1:w0SWMsp6j9O/dk4/ZpIhL+3CkG8ofA2vuv7k+ltqUMc= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= @@ -102,15 +130,25 @@ golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnf golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25 h1:jsG6UpNLt9iAsb0S2AGW28DveNzzgmbXR+ENoPjUeIU= golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f h1:R423Cnkcp5JABoeemiGEPlt9tHXFfw5kvc0yqlxRPWo= +golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190227160552-c95aed5357e7 h1:C2F/nMkR/9sfUTpvR3QrjBuTdvMUC/cFajkphs1YLQo= golang.org/x/net v0.0.0-20190227160552-c95aed5357e7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3 h1:0GoQqolDA55aaLxZyTzK/Y2ePZzZTUrRacwib7cNsYQ= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/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-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190219092855-153ac476189d/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223 h1:DH4skfRX4EBpamg7iV4ZlCpblAHI6s6TDM39bFZumv8= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190228124157-a34e9553db1e h1:ZytStCyV048ZqDsWHiYDdoI2Vd4msMcrDECFxS+tL9c= +golang.org/x/sys v0.0.0-20190228124157-a34e9553db1e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d h1:+R4KGOnez64A81RvjARKc4UT5/tI9ujCIVX+P5KiHuI= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= diff --git a/vendor/github.com/libp2p/go-libp2p-secio/gx-workspace-update.json b/vendor/github.com/libp2p/go-libp2p-secio/gx-workspace-update.json deleted file mode 100644 index 4dceb63f..00000000 --- a/vendor/github.com/libp2p/go-libp2p-secio/gx-workspace-update.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "Roots": [ - "go-libp2p-peer", - "go-multihash", - "go-libp2p-crypto" - ], - "Changes": { - "go-conn-security": "QmSdqPqBFMHnXJRGPdAHkLFrivJhrBh9xDmKmgpoRis4nn", - "go-libp2p-crypto": "QmaZ1F8vQdJaQqA8hjAzH8a7Qnqqb2n2ZYeUbKMjMcxAZe", - "go-libp2p-net": "QmPzduUbd2aomCUmjnu6anSPxYHV7dv6nJaQRwycPPKRgk", - "go-libp2p-peer": "QmUz7HmU4ws577TMEVNoTjNghVvq2jXnxnVhbkNXKPKpgK", - "go-libp2p-peerstore": "Qma8NCDUKLxeQ42JBN1erM52f5NtxkTSrBbt2UUYpqg5Cn", - "go-multiaddr": "QmRKLtwMw131aK7ugC3G7ybpumMz78YrJe5dzneyindvG1", - "go-multiaddr-net": "QmQVUtnrNGtCRkCMpXgpApfzQjc8FDaDVxHqWH8cnZQeh5", - "go-multihash": "QmerPMzPk1mJVowm8KgmoknWa4yCYvvugMPsgWmDNUvDLW", - "mafmt": "QmXZVrmSiWPyuET6BMbGK3PjzVnQBrcnYc4GkHKhK2KXLp" - }, - "Todo": [], - "Current": "", - "Done": [ - "go-multiaddr", - "go-multiaddr-net", - "mafmt", - "go-libp2p-peerstore", - "go-libp2p-net", - "go-conn-security", - "go-libp2p-secio" - ], - "Skipped": [ - "go-libp2p-peer" - ], - "GoPath": "/home/steb/.gx/update-fzw9j3", - "Branch": "gx/update-fzw9j3", - "PullRequests": null -} \ No newline at end of file diff --git a/vendor/github.com/libp2p/go-libp2p-secio/protocol.go b/vendor/github.com/libp2p/go-libp2p-secio/protocol.go index 4e54d87e..40848ddd 100644 --- a/vendor/github.com/libp2p/go-libp2p-secio/protocol.go +++ b/vendor/github.com/libp2p/go-libp2p-secio/protocol.go @@ -9,11 +9,12 @@ import ( "net" "time" + "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p-core/sec" + proto "github.com/gogo/protobuf/proto" logging "github.com/ipfs/go-log" - cs "github.com/libp2p/go-conn-security" - ci "github.com/libp2p/go-libp2p-crypto" - peer "github.com/libp2p/go-libp2p-peer" + ci "github.com/libp2p/go-libp2p-core/crypto" pb "github.com/libp2p/go-libp2p-secio/pb" msgio "github.com/libp2p/go-msgio" mh "github.com/multiformats/go-multihash" @@ -63,7 +64,7 @@ type secureSession struct { sharedSecret []byte } -var _ cs.Conn = &secureSession{} +var _ sec.SecureConn = &secureSession{} func (s *secureSession) Loggable() map[string]interface{} { m := make(map[string]interface{}) diff --git a/vendor/github.com/libp2p/go-libp2p-secio/rw.go b/vendor/github.com/libp2p/go-libp2p-secio/rw.go index f3dd39b6..6a084023 100644 --- a/vendor/github.com/libp2p/go-libp2p-secio/rw.go +++ b/vendor/github.com/libp2p/go-libp2p-secio/rw.go @@ -167,7 +167,7 @@ func (r *etmReader) Read(buf []byte) (int, error) { // If the destination buffer is too short, fill an internal buffer and then // drain as much of that into the output buffer as will fit. - if cap(buf) < fullLen { + if len(buf) < fullLen { err := r.fill() if err != nil { return 0, err diff --git a/vendor/github.com/libp2p/go-libp2p-secio/transport.go b/vendor/github.com/libp2p/go-libp2p-secio/transport.go index 323f32fa..edd6f8ef 100644 --- a/vendor/github.com/libp2p/go-libp2p-secio/transport.go +++ b/vendor/github.com/libp2p/go-libp2p-secio/transport.go @@ -6,9 +6,9 @@ import ( "net" "time" - cs "github.com/libp2p/go-conn-security" - ci "github.com/libp2p/go-libp2p-crypto" - peer "github.com/libp2p/go-libp2p-peer" + ci "github.com/libp2p/go-libp2p-core/crypto" + "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p-core/sec" ) // ID is secio's protocol ID (used when negotiating with multistream) @@ -31,12 +31,12 @@ func New(sk ci.PrivKey) (*Transport, error) { }, nil } -var _ cs.Transport = (*Transport)(nil) +var _ sec.SecureTransport = (*Transport)(nil) -func (sg *Transport) SecureInbound(ctx context.Context, insecure net.Conn) (cs.Conn, error) { +func (sg *Transport) SecureInbound(ctx context.Context, insecure net.Conn) (sec.SecureConn, error) { return newSecureSession(ctx, sg.LocalID, sg.PrivateKey, insecure, "") } -func (sg *Transport) SecureOutbound(ctx context.Context, insecure net.Conn, p peer.ID) (cs.Conn, error) { +func (sg *Transport) SecureOutbound(ctx context.Context, insecure net.Conn, p peer.ID) (sec.SecureConn, error) { return newSecureSession(ctx, sg.LocalID, sg.PrivateKey, insecure, p) } diff --git a/vendor/github.com/libp2p/go-libp2p-swarm/.travis.yml b/vendor/github.com/libp2p/go-libp2p-swarm/.travis.yml index 4cfe98c2..5163d693 100644 --- a/vendor/github.com/libp2p/go-libp2p-swarm/.travis.yml +++ b/vendor/github.com/libp2p/go-libp2p-swarm/.travis.yml @@ -10,7 +10,6 @@ env: global: - GOTFLAGS="-race" matrix: - - BUILD_DEPTYPE=gx - BUILD_DEPTYPE=gomod @@ -24,7 +23,6 @@ script: cache: directories: - - $GOPATH/src/gx - $GOPATH/pkg/mod - $HOME/.cache/go-build diff --git a/vendor/github.com/libp2p/go-libp2p-swarm/Makefile b/vendor/github.com/libp2p/go-libp2p-swarm/Makefile deleted file mode 100644 index 4f5206e4..00000000 --- a/vendor/github.com/libp2p/go-libp2p-swarm/Makefile +++ /dev/null @@ -1,13 +0,0 @@ -export IPFS_API ?= v04x.ipfs.io - -gx: - go get github.com/whyrusleeping/gx - go get github.com/whyrusleeping/gx-go - -deps: gx - gx --verbose install --global - gx-go rewrite - -publish: - gx-go rewrite --undo - diff --git a/vendor/github.com/libp2p/go-libp2p-swarm/README.md b/vendor/github.com/libp2p/go-libp2p-swarm/README.md index 4ba762bf..0675fc25 100644 --- a/vendor/github.com/libp2p/go-libp2p-swarm/README.md +++ b/vendor/github.com/libp2p/go-libp2p-swarm/README.md @@ -150,3 +150,7 @@ Small note: If editing the Readme, please conform to the [standard-readme](https ## License MIT © Jeromy Johnson + +--- + +The last gx published version of this module was: 3.0.35: QmQVoMEL1CxrVusTSUdYsiJXVBnvSqNUpBsGybkwSfksEF diff --git a/vendor/github.com/libp2p/go-libp2p-swarm/dial_error.go b/vendor/github.com/libp2p/go-libp2p-swarm/dial_error.go new file mode 100644 index 00000000..d2179617 --- /dev/null +++ b/vendor/github.com/libp2p/go-libp2p-swarm/dial_error.go @@ -0,0 +1,70 @@ +package swarm + +import ( + "fmt" + "strings" + + "github.com/libp2p/go-libp2p-core/peer" + + ma "github.com/multiformats/go-multiaddr" +) + +// maxDialDialErrors is the maximum number of dial errors we record +const maxDialDialErrors = 16 + +// DialError is the error type returned when dialing. +type DialError struct { + Peer peer.ID + DialErrors []TransportError + Cause error + Skipped int +} + +func (e *DialError) recordErr(addr ma.Multiaddr, err error) { + if len(e.DialErrors) >= maxDialDialErrors { + e.Skipped++ + return + } + e.DialErrors = append(e.DialErrors, TransportError{ + Address: addr, + Cause: err, + }) +} + +func (e *DialError) Error() string { + var builder strings.Builder + fmt.Fprintf(&builder, "failed to dial %s:", e.Peer) + if e.Cause != nil { + fmt.Fprintf(&builder, " %s", e.Cause) + } + for _, te := range e.DialErrors { + fmt.Fprintf(&builder, "\n * [%s] %s", te.Address, te.Cause) + } + if e.Skipped > 0 { + fmt.Fprintf(&builder, "\n ... skipping %d errors ...", e.Skipped) + } + return builder.String() +} + +// Unwrap implements https://godoc.org/golang.org/x/xerrors#Wrapper. +func (e *DialError) Unwrap() error { + // If we have a context error, that's the "ultimate" error. + if e.Cause != nil { + return e.Cause + } + return nil +} + +var _ error = (*DialError)(nil) + +// TransportError is the error returned when dialing a specific address. +type TransportError struct { + Address ma.Multiaddr + Cause error +} + +func (e *TransportError) Error() string { + return fmt.Sprintf("failed to dial %s: %s", e.Address, e.Cause) +} + +var _ error = (*TransportError)(nil) diff --git a/vendor/github.com/libp2p/go-libp2p-swarm/dial_sync.go b/vendor/github.com/libp2p/go-libp2p-swarm/dial_sync.go index 82256eca..f746b9a9 100644 --- a/vendor/github.com/libp2p/go-libp2p-swarm/dial_sync.go +++ b/vendor/github.com/libp2p/go-libp2p-swarm/dial_sync.go @@ -4,7 +4,7 @@ import ( "context" "sync" - peer "github.com/libp2p/go-libp2p-peer" + "github.com/libp2p/go-libp2p-core/peer" ) // DialFunc is the type of function expected by DialSync. diff --git a/vendor/github.com/libp2p/go-libp2p-swarm/go.mod b/vendor/github.com/libp2p/go-libp2p-swarm/go.mod index 15b27b0b..6d3662d9 100644 --- a/vendor/github.com/libp2p/go-libp2p-swarm/go.mod +++ b/vendor/github.com/libp2p/go-libp2p-swarm/go.mod @@ -1,30 +1,22 @@ module github.com/libp2p/go-libp2p-swarm require ( - github.com/hashicorp/go-multierror v1.0.0 github.com/ipfs/go-log v0.0.1 - github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8 + github.com/jbenet/goprocess v0.1.3 github.com/libp2p/go-addr-util v0.0.1 - github.com/libp2p/go-conn-security-multistream v0.0.1 - github.com/libp2p/go-libp2p-crypto v0.0.1 - github.com/libp2p/go-libp2p-loggables v0.0.1 - github.com/libp2p/go-libp2p-metrics v0.0.1 - github.com/libp2p/go-libp2p-net v0.0.2 - github.com/libp2p/go-libp2p-peer v0.0.1 - github.com/libp2p/go-libp2p-peerstore v0.0.1 - github.com/libp2p/go-libp2p-protocol v0.0.1 - github.com/libp2p/go-libp2p-secio v0.0.1 - github.com/libp2p/go-libp2p-transport v0.0.4 - github.com/libp2p/go-libp2p-transport-upgrader v0.0.1 - github.com/libp2p/go-maddr-filter v0.0.1 - github.com/libp2p/go-stream-muxer v0.0.1 - github.com/libp2p/go-tcp-transport v0.0.1 - github.com/libp2p/go-testutil v0.0.1 - github.com/multiformats/go-multiaddr v0.0.1 + github.com/libp2p/go-conn-security-multistream v0.1.0 + github.com/libp2p/go-libp2p-core v0.0.1 + github.com/libp2p/go-libp2p-loggables v0.1.0 + github.com/libp2p/go-libp2p-peerstore v0.1.0 + github.com/libp2p/go-libp2p-secio v0.1.0 + github.com/libp2p/go-libp2p-testing v0.0.3 + github.com/libp2p/go-libp2p-transport-upgrader v0.1.1 + github.com/libp2p/go-libp2p-yamux v0.2.0 + github.com/libp2p/go-maddr-filter v0.0.4 + github.com/libp2p/go-stream-muxer-multistream v0.2.0 + github.com/libp2p/go-tcp-transport v0.1.0 + github.com/multiformats/go-multiaddr v0.0.4 github.com/multiformats/go-multiaddr-net v0.0.1 - github.com/whyrusleeping/go-smux-multistream v2.0.2+incompatible - github.com/whyrusleeping/go-smux-yamux v2.0.8+incompatible github.com/whyrusleeping/mafmt v1.2.8 github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7 - github.com/whyrusleeping/yamux v1.1.5 // indirect ) diff --git a/vendor/github.com/libp2p/go-libp2p-swarm/go.sum b/vendor/github.com/libp2p/go-libp2p-swarm/go.sum index 2fae010f..256f3314 100644 --- a/vendor/github.com/libp2p/go-libp2p-swarm/go.sum +++ b/vendor/github.com/libp2p/go-libp2p-swarm/go.sum @@ -10,6 +10,7 @@ github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVa github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -27,29 +28,24 @@ github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/gxed/hashland/keccakpg v0.0.1 h1:wrk3uMNaMxbXiHibbPO4S0ymqJMm41WiudyFSs7UnsU= github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfmKFJ6tItnhQ67kU= -github.com/gxed/hashland/murmur3 v0.0.1 h1:SheiaIt0sda5K+8FLz952/1iWS9zrnKsEJaOJu4ZbSc= github.com/gxed/hashland/murmur3 v0.0.1/go.mod h1:KjXop02n4/ckmZSnY2+HKcLud/tcmvhST0bie/0lS48= -github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-multierror v1.0.0 h1:iVjPR7a6H0tWELX5NxNe7bYopibicUzc7uPribsnS6o= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= github.com/hashicorp/golang-lru v0.5.1/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/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= github.com/ipfs/go-datastore v0.0.1/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= -github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk= -github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps= github.com/ipfs/go-ds-badger v0.0.2/go.mod h1:Y3QpeSFWQf6MopLTiZD+VT6IC1yZqaGmjvRcKeSGij8= github.com/ipfs/go-ds-leveldb v0.0.1/go.mod h1:feO8V3kubwsEF22n0YRQCffeb79OOYIykR4L04tMOYc= github.com/ipfs/go-ipfs-delay v0.0.0-20181109222059-70721b86a9a8/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= github.com/ipfs/go-log v0.0.1 h1:9XTUN/rW64BCG1YhPK9Hoy3q8nr4gOmHHBpgFdfw6Lc= github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM= +github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA= github.com/jbenet/go-temp-err-catcher v0.0.0-20150120210811-aac704a3f4f2 h1:vhC1OXXiT9R2pczegwz6moDvuRpggaroAXhPIseh57A= github.com/jbenet/go-temp-err-catcher v0.0.0-20150120210811-aac704a3f4f2/go.mod h1:8GXXJV31xl8whumTzdZsTt3RnUIiPqzkyf7mxToRCMs= -github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8 h1:bspPhN+oKYFk5fcGNuQzp6IGzYQSenLEgH3s6jkXrWw= github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8/go.mod h1:Ly/wlsjFq/qrU3Rar62tu1gASgGw6chQbSh/XgIIXCY= +github.com/jbenet/goprocess v0.1.3 h1:YKyIEECS/XvcfHtBzxtjBBbWK+MbvA6dG8ASiqwvr10= +github.com/jbenet/goprocess v0.1.3/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= @@ -62,87 +58,104 @@ 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/libp2p/go-addr-util v0.0.1 h1:TpTQm9cXVRVSKsYbgQ7GKc3KbbHVTnbostgGaDEP+88= github.com/libp2p/go-addr-util v0.0.1/go.mod h1:4ac6O7n9rIAKB1dnd+s8IbbMXkt+oBpzX4/+RACcnlQ= -github.com/libp2p/go-buffer-pool v0.0.1 h1:9Rrn/H46cXjaA2HQ5Y8lyhOS1NhTkZ4yuEs2r3Eechg= github.com/libp2p/go-buffer-pool v0.0.1/go.mod h1:xtyIz9PMobb13WaxR6Zo1Pd1zXJKYg0a8KiIvDp3TzQ= -github.com/libp2p/go-conn-security v0.0.1 h1:4kMMrqrt9EUNCNjX1xagSJC+bq16uqjMe9lk1KBMVNs= -github.com/libp2p/go-conn-security v0.0.1/go.mod h1:bGmu51N0KU9IEjX7kl2PQjgZa40JQWnayTvNMgD/vyk= -github.com/libp2p/go-conn-security-multistream v0.0.1 h1:XefjAQRHcnUaxKb26RGupToucx3uU4ecbOZ3aACXlDU= -github.com/libp2p/go-conn-security-multistream v0.0.1/go.mod h1:nc9vud7inQ+d6SO0I/6dSWrdMnHnzZNHeyUQqrAJulE= +github.com/libp2p/go-buffer-pool v0.0.2 h1:QNK2iAFa8gjAe1SPz6mHSMuCcjs+X1wlHzeOSqcmlfs= +github.com/libp2p/go-buffer-pool v0.0.2/go.mod h1:MvaB6xw5vOrDl8rYZGLFdKAuk/hRoRZd1Vi32+RXyFM= +github.com/libp2p/go-conn-security-multistream v0.1.0 h1:aqGmto+ttL/uJgX0JtQI0tD21CIEy5eYd1Hlp0juHY0= +github.com/libp2p/go-conn-security-multistream v0.1.0/go.mod h1:aw6eD7LOsHEX7+2hJkDxw1MteijaVcI+/eP2/x3J1xc= github.com/libp2p/go-flow-metrics v0.0.1 h1:0gxuFd2GuK7IIP5pKljLwps6TvcuYgvG7Atqi3INF5s= github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZxBdp967ls1g+k8= -github.com/libp2p/go-libp2p-crypto v0.0.1 h1:JNQd8CmoGTohO/akqrH16ewsqZpci2CbgYH/LmYl8gw= -github.com/libp2p/go-libp2p-crypto v0.0.1/go.mod h1:yJkNyDmO341d5wwXxDUGO0LykUVT72ImHNUqh5D/dBE= -github.com/libp2p/go-libp2p-interface-pnet v0.0.1 h1:7GnzRrBTJHEsofi1ahFdPN9Si6skwXQE9UqR2S+Pkh8= -github.com/libp2p/go-libp2p-interface-pnet v0.0.1/go.mod h1:el9jHpQAXK5dnTpKA4yfCNBZXvrzdOU75zz+C6ryp3k= -github.com/libp2p/go-libp2p-loggables v0.0.1 h1:HVww9oAnINIxbt69LJNkxD8lnbfgteXR97Xm4p3l9ps= -github.com/libp2p/go-libp2p-loggables v0.0.1/go.mod h1:lDipDlBNYbpyqyPX/KcoO+eq0sJYEVR2JgOexcivchg= -github.com/libp2p/go-libp2p-metrics v0.0.1 h1:yumdPC/P2VzINdmcKZd0pciSUCpou+s0lwYCjBbzQZU= -github.com/libp2p/go-libp2p-metrics v0.0.1/go.mod h1:jQJ95SXXA/K1VZi13h52WZMa9ja78zjyy5rspMsC/08= -github.com/libp2p/go-libp2p-net v0.0.1 h1:xJ4Vh4yKF/XKb8fd1Ev0ebAGzVjMxXzrxG2kjtU+F5Q= -github.com/libp2p/go-libp2p-net v0.0.1/go.mod h1:Yt3zgmlsHOgUWSXmt5V/Jpz9upuJBE8EgNU9DrCcR8c= -github.com/libp2p/go-libp2p-net v0.0.2 h1:qP06u4TYXfl7uW/hzqPhlVVTSA2nw1B/bHBJaUnbh6M= -github.com/libp2p/go-libp2p-net v0.0.2/go.mod h1:Yt3zgmlsHOgUWSXmt5V/Jpz9upuJBE8EgNU9DrCcR8c= -github.com/libp2p/go-libp2p-peer v0.0.1 h1:0qwAOljzYewINrU+Kndoc+1jAL7vzY/oY2Go4DCGfyY= -github.com/libp2p/go-libp2p-peer v0.0.1/go.mod h1:nXQvOBbwVqoP+T5Y5nCjeH4sP9IX/J0AMzcDUVruVoo= -github.com/libp2p/go-libp2p-peerstore v0.0.1 h1:twKovq8YK5trLrd3nB7PD2Zu9JcyAIdm7Bz9yBWjhq8= -github.com/libp2p/go-libp2p-peerstore v0.0.1/go.mod h1:RabLyPVJLuNQ+GFyoEkfi8H4Ti6k/HtZJ7YKgtSq+20= -github.com/libp2p/go-libp2p-protocol v0.0.1 h1:+zkEmZ2yFDi5adpVE3t9dqh/N9TbpFWywowzeEzBbLM= -github.com/libp2p/go-libp2p-protocol v0.0.1/go.mod h1:Af9n4PiruirSDjHycM1QuiMi/1VZNHYcK8cLgFJLZ4s= -github.com/libp2p/go-libp2p-secio v0.0.1 h1:CqE/RdsizOwItdgLe632iyft/w0tshDLmZGAiKDcUAI= -github.com/libp2p/go-libp2p-secio v0.0.1/go.mod h1:IdG6iQybdcYmbTzxp4J5dwtUEDTOvZrT0opIDVNPrJs= -github.com/libp2p/go-libp2p-transport v0.0.1/go.mod h1:UzbUs9X+PHOSw7S3ZmeOxfnwaQY5vGDzZmKPod3N3tk= -github.com/libp2p/go-libp2p-transport v0.0.4 h1:/CPHQMN75/IQwkhBxxIo6p6PtL3rwFZtlzBROT3e8mw= -github.com/libp2p/go-libp2p-transport v0.0.4/go.mod h1:StoY3sx6IqsP6XKoabsPnHCwqKXWUMWU7Rfcsubee/A= -github.com/libp2p/go-libp2p-transport-upgrader v0.0.1 h1:rNtXkY6dty46mxYOHHAZQchI7gQdJStF683FhVnei/k= -github.com/libp2p/go-libp2p-transport-upgrader v0.0.1/go.mod h1:NJpUAgQab/8K6K0m+JmZCe5RUXG10UMEx4kWe9Ipj5c= -github.com/libp2p/go-maddr-filter v0.0.1 h1:apvYTg0aIxxQyBX+XHKOR+0+lYhGs1Yv+JmTH9nyl5I= -github.com/libp2p/go-maddr-filter v0.0.1/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= -github.com/libp2p/go-mplex v0.0.1 h1:dn2XGSrUxLtz3/8u85bGrwhUEKPX8MOF3lpmcWBZCWc= -github.com/libp2p/go-mplex v0.0.1/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0= -github.com/libp2p/go-msgio v0.0.1 h1:znj97n5FtXGCLDwe9x8jpHmY770SW4WStBGcCDh6GJw= -github.com/libp2p/go-msgio v0.0.1/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= +github.com/libp2p/go-libp2p-core v0.0.1 h1:HSTZtFIq/W5Ue43Zw+uWZyy2Vl5WtF0zDjKN8/DT/1I= +github.com/libp2p/go-libp2p-core v0.0.1/go.mod h1:g/VxnTZ/1ygHxH3dKok7Vno1VfpvGcGip57wjTU4fco= +github.com/libp2p/go-libp2p-crypto v0.1.0 h1:k9MFy+o2zGDNGsaoZl0MA3iZ75qXxr9OOoAZF+sD5OQ= +github.com/libp2p/go-libp2p-crypto v0.1.0/go.mod h1:sPUokVISZiy+nNuTTH/TY+leRSxnFj/2GLjtOTW90hI= +github.com/libp2p/go-libp2p-loggables v0.1.0 h1:h3w8QFfCt2UJl/0/NW4K829HX/0S4KD31PQ7m8UXXO8= +github.com/libp2p/go-libp2p-loggables v0.1.0/go.mod h1:EyumB2Y6PrYjr55Q3/tiJ/o3xoDasoRYM7nOzEpoa90= +github.com/libp2p/go-libp2p-mplex v0.2.0/go.mod h1:Ejl9IyjvXJ0T9iqUTE1jpYATQ9NM3g+OtR+EMMODbKo= +github.com/libp2p/go-libp2p-mplex v0.2.1 h1:E1xaJBQnbSiTHGI1gaBKmKhu1TUKkErKJnE8iGvirYI= +github.com/libp2p/go-libp2p-mplex v0.2.1/go.mod h1:SC99Rxs8Vuzrf/6WhmH41kNn13TiYdAWNYHrwImKLnE= +github.com/libp2p/go-libp2p-peer v0.2.0 h1:EQ8kMjaCUwt/Y5uLgjT8iY2qg0mGUT0N1zUjer50DsY= +github.com/libp2p/go-libp2p-peer v0.2.0/go.mod h1:RCffaCvUyW2CJmG2gAWVqwePwW7JMgxjsHm7+J5kjWY= +github.com/libp2p/go-libp2p-peerstore v0.1.0 h1:MKh7pRNPHSh1fLPj8u/M/s/napdmeNpoi9BRy9lPN0E= +github.com/libp2p/go-libp2p-peerstore v0.1.0/go.mod h1:2CeHkQsr8svp4fZ+Oi9ykN1HBb6u0MOvdJ7YIsmcwtY= +github.com/libp2p/go-libp2p-secio v0.1.0 h1:NNP5KLxuP97sE5Bu3iuwOWyT/dKEGMN5zSLMWdB7GTQ= +github.com/libp2p/go-libp2p-secio v0.1.0/go.mod h1:tMJo2w7h3+wN4pgU2LSYeiKPrfqBgkOsdiKK77hE7c8= +github.com/libp2p/go-libp2p-testing v0.0.2/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= +github.com/libp2p/go-libp2p-testing v0.0.3 h1:bdij4bKaaND7tCsaXVjRfYkMpvoOeKj9AVQGJllA6jM= +github.com/libp2p/go-libp2p-testing v0.0.3/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= +github.com/libp2p/go-libp2p-transport-upgrader v0.1.1 h1:PZMS9lhjK9VytzMCW3tWHAXtKXmlURSc3ZdvwEcKCzw= +github.com/libp2p/go-libp2p-transport-upgrader v0.1.1/go.mod h1:IEtA6or8JUbsV07qPW4r01GnTenLW4oi3lOPbUMGJJA= +github.com/libp2p/go-libp2p-yamux v0.2.0 h1:TSPZ5cMMz/wdoYsye/wU1TE4G3LDGMoeEN0xgnCKU/I= +github.com/libp2p/go-libp2p-yamux v0.2.0/go.mod h1:Db2gU+XfLpm6E4rG5uGCFX6uXA8MEXOxFcRoXUODaK8= +github.com/libp2p/go-maddr-filter v0.0.4 h1:hx8HIuuwk34KePddrp2mM5ivgPkZ09JH4AvsALRbFUs= +github.com/libp2p/go-maddr-filter v0.0.4/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= +github.com/libp2p/go-mplex v0.0.3/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0= +github.com/libp2p/go-mplex v0.1.0 h1:/nBTy5+1yRyY82YaO6HXQRnO5IAGsXTjEJaR3LdTPc0= +github.com/libp2p/go-mplex v0.1.0/go.mod h1:SXgmdki2kwCUlCCbfGLEgHjC4pFqhTp0ZoV6aiKgxDU= +github.com/libp2p/go-msgio v0.0.2 h1:ivPvEKHxmVkTClHzg6RXTYHqaJQ0V9cDbq+6lKb3UV0= +github.com/libp2p/go-msgio v0.0.2/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= github.com/libp2p/go-reuseport v0.0.1 h1:7PhkfH73VXfPJYKQ6JwS5I/eVcoyYi9IMNGc6FWpFLw= github.com/libp2p/go-reuseport v0.0.1/go.mod h1:jn6RmB1ufnQwl0Q1f+YxAj8isJgDCQzaaxIFYDhcYEA= -github.com/libp2p/go-reuseport-transport v0.0.1 h1:UIRneNxLDmEGNjGHpIiWzSWkZ5bhxMCP9x3Vh7BSc7E= -github.com/libp2p/go-reuseport-transport v0.0.1/go.mod h1:YkbSDrvjUVDL6b8XqriyA20obEtsW9BLkuOUyQAOCbs= -github.com/libp2p/go-stream-muxer v0.0.1 h1:Ce6e2Pyu+b5MC1k3eeFtAax0pW4gc6MosYSLV05UeLw= +github.com/libp2p/go-reuseport-transport v0.0.2 h1:WglMwyXyBu61CMkjCCtnmqNqnjib0GIEjMiHTwR/KN4= +github.com/libp2p/go-reuseport-transport v0.0.2/go.mod h1:YkbSDrvjUVDL6b8XqriyA20obEtsW9BLkuOUyQAOCbs= github.com/libp2p/go-stream-muxer v0.0.1/go.mod h1:bAo8x7YkSpadMTbtTaxGVHWUQsR/l5MEaHbKaliuT14= -github.com/libp2p/go-tcp-transport v0.0.1 h1:WyvJVw2lYAnr6CU+GZZ4oCt06fvORlmvBlFX2+ZpZDM= -github.com/libp2p/go-tcp-transport v0.0.1/go.mod h1:mnjg0o0O5TmXUaUIanYPUqkW4+u6mK0en8rlpA6BBTs= -github.com/libp2p/go-testutil v0.0.1 h1:Xg+O0G2HIMfHqBOBDcMS1iSZJ3GEcId4qOxCQvsGZHk= -github.com/libp2p/go-testutil v0.0.1/go.mod h1:iAcJc/DKJQanJ5ws2V+u5ywdL2n12X1WbbEG+Jjy69I= +github.com/libp2p/go-stream-muxer-multistream v0.2.0 h1:714bRJ4Zy9mdhyTLJ+ZKiROmAFwUHpeRidG+q7LTQOg= +github.com/libp2p/go-stream-muxer-multistream v0.2.0/go.mod h1:j9eyPol/LLRqT+GPLSxvimPhNph4sfYfMoDPd7HkzIc= +github.com/libp2p/go-tcp-transport v0.1.0 h1:IGhowvEqyMFknOar4FWCKSWE0zL36UFKQtiRQD60/8o= +github.com/libp2p/go-tcp-transport v0.1.0/go.mod h1:oJ8I5VXryj493DEJ7OsBieu8fcg2nHGctwtInJVpipc= +github.com/libp2p/go-yamux v1.2.2 h1:s6J6o7+ajoQMjHe7BEnq+EynOj5D2EoG8CuQgL3F2vg= +github.com/libp2p/go-yamux v1.2.2/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= github.com/mattn/go-colorable v0.1.1 h1:G1f5SKeVxmagw/IyvzvtZE4Gybcc4Tr1tf7I8z0XgOg= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= github.com/mattn/go-isatty v0.0.5 h1:tHXDdz1cpzGaovsTB+TVB8q90WEokoVmfMqoVcrLUgw= github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0OXOcUbGjvZxxijuBwbbmlSxLiuofa+g= github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= -github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16 h1:5W7KhL8HVF3XCFOweFD3BNESdnO8ewyYTFT2R+/b8FQ= github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= -github.com/mr-tron/base58 v1.1.0 h1:Y51FGVJ91WBqCEabAi5OPUz38eAx8DakuAm5svLcsfQ= +github.com/minio/sha256-simd v0.0.0-20190328051042-05b4dd3047e5/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= +github.com/minio/sha256-simd v0.1.0 h1:U41/2erhAKcmSI14xh/ZTUdBPOzDOIfS93ibzUSl8KM= +github.com/minio/sha256-simd v0.1.0/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= +github.com/mr-tron/base58 v1.1.1/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= +github.com/mr-tron/base58 v1.1.2 h1:ZEw4I2EgPKDJ2iEw0cNmLB3ROrEmkOtXIkaG7wZg+78= +github.com/mr-tron/base58 v1.1.2/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= -github.com/multiformats/go-multiaddr v0.0.1 h1:/QUV3VBMDI6pi6xfiw7lr6xhDWWvQKn9udPn68kLSdY= github.com/multiformats/go-multiaddr v0.0.1/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= -github.com/multiformats/go-multiaddr-dns v0.0.1 h1:jQt9c6tDSdQLIlBo4tXYx7QUHCPjxsB1zXcag/2S7zc= +github.com/multiformats/go-multiaddr v0.0.2/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= +github.com/multiformats/go-multiaddr v0.0.4 h1:WgMSI84/eRLdbptXMkMWDXPjPq7SPLIgGUVm2eroyU4= +github.com/multiformats/go-multiaddr v0.0.4/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= github.com/multiformats/go-multiaddr-dns v0.0.1/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= +github.com/multiformats/go-multiaddr-dns v0.0.2 h1:/Bbsgsy3R6e3jf2qBahzNHzww6usYaZ0NhNH3sqdFS8= +github.com/multiformats/go-multiaddr-dns v0.0.2/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= +github.com/multiformats/go-multiaddr-fmt v0.0.1 h1:5YjeOIzbX8OTKVaN72aOzGIYW7PnrZrnkDyOfAWRSMA= +github.com/multiformats/go-multiaddr-fmt v0.0.1/go.mod h1:aBYjqL4T/7j4Qx+R73XSv/8JsgnRFlf0w2KGLCmXl3Q= github.com/multiformats/go-multiaddr-net v0.0.1 h1:76O59E3FavvHqNg7jvzWzsPSW5JSi/ek0E4eiDVbg9g= github.com/multiformats/go-multiaddr-net v0.0.1/go.mod h1:nw6HSxNmCIQH27XPGBuX+d1tnvM7ihcFwHMSstNAVUU= -github.com/multiformats/go-multihash v0.0.1 h1:HHwN1K12I+XllBCrqKnhX949Orn4oawPkegHMu2vDqQ= +github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs= github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= -github.com/multiformats/go-multistream v0.0.1 h1:JV4VfSdY9n7ECTtY59/TlSyFCzRILvYx4T4Ws8ZgihU= -github.com/multiformats/go-multistream v0.0.1/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= +github.com/multiformats/go-multihash v0.0.5 h1:1wxmCvTXAifAepIMyF39vZinRw5sbqjPs/UIi93+uik= +github.com/multiformats/go-multihash v0.0.5/go.mod h1:lt/HCbqlQwlPBz7lv0sQCdtfcMtlJvakRUn/0Ual8po= +github.com/multiformats/go-multistream v0.1.0 h1:UpO6jrsjqs46mqAK3n6wKRYFhugss9ArzbyUzU+4wkQ= +github.com/multiformats/go-multistream v0.1.0/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= 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/ginkgo v1.8.0 h1:VkHVNpR4iVnU8XQR6DBm8BqYjN7CRzw+xKUbVVbbW9w= +github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.5.0 h1:izbySO9zDPmjJ8rDjLvkA2zJHIo+HkYXHnf7eN7SSyo= +github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/opentracing/opentracing-go v1.0.2 h1:3jA2P6O1F9UOrWVpwrIo17pu01KWvNWg4X946/Y5Zwg= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= 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/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a h1:/eS3yfGjQKG+9kayBkj0ip1BGhq6zJ3eaVksphxAaek= +github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a/go.mod h1:7AyxJNCJ7SBZ1MfVQCWD6Uqo2oubI2Eq2y2eqf+A5r0= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 h1:RC6RW7j+1+HkWaX/Yh71Ee5ZHaHYt7ZP4sQgUrm6cDU= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572/go.mod h1:w0SWMsp6j9O/dk4/ZpIhL+3CkG8ofA2vuv7k+ltqUMc= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= @@ -150,34 +163,30 @@ github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpP github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1/go.mod h1:8UvriyWtv5Q5EOgjHaSseUEdkQfvwFv1I/In/O2M9gc= github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc h1:9lDbC6Rz4bwmou+oE6Dt4Cb2BGMur5eR/GYptkKUVHo= github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc/go.mod h1:bopw91TMyo8J3tvftk8xmU2kPmlrt4nScJQZU2hE5EM= -github.com/whyrusleeping/go-smux-multiplex v3.0.16+incompatible h1:iqksILj8STw03EJQe7Laj4ubnw+ojOyik18cd5vPL1o= -github.com/whyrusleeping/go-smux-multiplex v3.0.16+incompatible/go.mod h1:34LEDbeKFZInPUrAG+bjuJmUXONGdEFW7XL0SpTY1y4= -github.com/whyrusleeping/go-smux-multistream v2.0.2+incompatible h1:BdYHctE9HJZLquG9tpTdwWcbG4FaX6tVKPGjCGgiVxo= -github.com/whyrusleeping/go-smux-multistream v2.0.2+incompatible/go.mod h1:dRWHHvc4HDQSHh9gbKEBbUZ+f2Q8iZTPG3UOGYODxSQ= -github.com/whyrusleeping/go-smux-yamux v2.0.8+incompatible h1:IGm/UP/JpEFS6D787sZnZg7RA6fZIR9c/Ms9DeAVNuk= -github.com/whyrusleeping/go-smux-yamux v2.0.8+incompatible/go.mod h1:6qHUzBXUbB9MXmw3AUdB52L8sEb/hScCqOdW2kj/wuI= github.com/whyrusleeping/mafmt v1.2.8 h1:TCghSl5kkwEE0j+sU/gudyhVMRlpBin8fMBBHg59EbA= github.com/whyrusleeping/mafmt v1.2.8/go.mod h1:faQJFPbLSxzD9xpA02ttW/tS9vZykNvXwGvqIpk20FA= github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7 h1:E9S12nwJwEOXe2d6gT6qxdvqMnNq+VnSsKPgm2ZZNds= github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7/go.mod h1:X2c0RVCI1eSUFI8eLcY3c0423ykwiUdxLJtkDvruhjI= -github.com/whyrusleeping/yamux v1.1.5 h1:4CK3aUUJQu0qpKZv5gEWJjNOQtdbdDhVVS6PJ+HimdE= -github.com/whyrusleeping/yamux v1.1.5/go.mod h1:E8LnQQ8HKx5KD29HZFUwM1PxCOdPRzGwur1mcYhXcD8= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25 h1:jsG6UpNLt9iAsb0S2AGW28DveNzzgmbXR+ENoPjUeIU= -golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f h1:R423Cnkcp5JABoeemiGEPlt9tHXFfw5kvc0yqlxRPWo= +golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190227160552-c95aed5357e7 h1:C2F/nMkR/9sfUTpvR3QrjBuTdvMUC/cFajkphs1YLQo= golang.org/x/net v0.0.0-20190227160552-c95aed5357e7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3 h1:0GoQqolDA55aaLxZyTzK/Y2ePZzZTUrRacwib7cNsYQ= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f h1:wMNYb4v58l5UBM7MYRLPG6ZhfOqbKu7X5eyFl8ZhKvA= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/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-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190219092855-153ac476189d/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190228124157-a34e9553db1e h1:ZytStCyV048ZqDsWHiYDdoI2Vd4msMcrDECFxS+tL9c= golang.org/x/sys v0.0.0-20190228124157-a34e9553db1e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d h1:+R4KGOnez64A81RvjARKc4UT5/tI9ujCIVX+P5KiHuI= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= diff --git a/vendor/github.com/libp2p/go-libp2p-swarm/limiter.go b/vendor/github.com/libp2p/go-libp2p-swarm/limiter.go index bd4ab572..6808dd71 100644 --- a/vendor/github.com/libp2p/go-libp2p-swarm/limiter.go +++ b/vendor/github.com/libp2p/go-libp2p-swarm/limiter.go @@ -7,14 +7,15 @@ import ( "sync" "time" + "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p-core/transport" + addrutil "github.com/libp2p/go-addr-util" - peer "github.com/libp2p/go-libp2p-peer" - transport "github.com/libp2p/go-libp2p-transport" ma "github.com/multiformats/go-multiaddr" ) type dialResult struct { - Conn transport.Conn + Conn transport.CapableConn Addr ma.Multiaddr Err error } @@ -53,7 +54,7 @@ type dialLimiter struct { waitingOnPeerLimit map[peer.ID][]*dialJob } -type dialfunc func(context.Context, peer.ID, ma.Multiaddr) (transport.Conn, error) +type dialfunc func(context.Context, peer.ID, ma.Multiaddr) (transport.CapableConn, error) func newDialLimiter(df dialfunc) *dialLimiter { fd := ConcurrentFdDials diff --git a/vendor/github.com/libp2p/go-libp2p-swarm/package.json b/vendor/github.com/libp2p/go-libp2p-swarm/package.json deleted file mode 100644 index 8bd05c24..00000000 --- a/vendor/github.com/libp2p/go-libp2p-swarm/package.json +++ /dev/null @@ -1,167 +0,0 @@ -{ - "author": "whyrusleeping", - "bugs": { - "url": "https://github.com/libp2p/go-libp2p-swarm/issues" - }, - "gx": { - "dvcsimport": "github.com/libp2p/go-libp2p-swarm" - }, - "gxDependencies": [ - { - "author": "whyrusleeping", - "hash": "QmY3ArotKMKaL7YGfbQfyDrib6RVraLqZYWXZvVgZktBxp", - "name": "go-libp2p-net", - "version": "3.0.30" - }, - { - "author": "whyrusleeping", - "hash": "QmTW4SdgBWq9GjsBsHeUx8WuGxzhgzAf88UMH2w62PC8yK", - "name": "go-libp2p-crypto", - "version": "2.0.7" - }, - { - "author": "whyrusleeping", - "hash": "QmaCTz9RkrU13bm9kMB54f7atgqM4qkjDZpRwRoJiWXEqs", - "name": "go-libp2p-peerstore", - "version": "2.0.19" - }, - { - "author": "whyrusleeping", - "hash": "QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP", - "name": "goprocess", - "version": "1.0.0" - }, - { - "author": "whyrusleeping", - "hash": "QmNQWMWWBmkAcaVEspSNwYB95axzKFhYTdqZtABA2zXoPu", - "name": "go-libp2p-transport", - "version": "3.0.27" - }, - { - "author": "whyrusleeping", - "hash": "QmUWkEreTZdTxUVDfpQ2fLywJh6dinfEYahEoBDTMQ2hks", - "name": "go-smux-multistream", - "version": "2.0.3" - }, - { - "author": "whyrusleeping", - "hash": "QmcqwxmCsWjNvQFzeZ4rzYVycWDY8C7Ejtiw2G3djArQzf", - "name": "go-smux-yamux", - "version": "2.0.10" - }, - { - "author": "whyrusleeping", - "hash": "QmSMZwvs3n4GBikZ7hKzT17c3bk65FmyZo2JqtJ16swqCv", - "name": "multiaddr-filter", - "version": "1.0.2" - }, - { - "author": "whyrusleeping", - "hash": "QmSwVwKUWzdf3ppM3FbBbpuqHUNtUFJPQQdfvKmgZoz2gR", - "name": "go-libp2p-metrics", - "version": "2.1.14" - }, - { - "author": "whyrusleeping", - "hash": "QmTGiDkw4eeKq31wwpQRk5GwWiReaxrcTQLuCCLWgfKo5M", - "name": "go-tcp-transport", - "version": "2.0.28" - }, - { - "author": "whyrusleeping", - "hash": "QmVtV1y2e8W4eQgzsP6qfSpCCZ6zWYE4m6NzJjB7iswwrT", - "name": "go-stream-muxer", - "version": "3.1.0" - }, - { - "author": "whyrusleeping", - "hash": "QmT6C5ebDy92zyRzdmSNyda5q7zkNXy68X47RDJiHpvaxd", - "name": "go-maddr-filter", - "version": "1.1.13" - }, - { - "author": "whyrusleeping", - "hash": "QmZomXpA4HrYKRV2ftnE5odWMT2JNnhAXTvEyQrzXrnyEX", - "name": "go-addr-util", - "version": "2.0.11" - }, - { - "hash": "QmbkT7eMTyXfpeyB3ZMxxcxg7XH8t6uXp49jqzz4HB7BGF", - "name": "go-log", - "version": "1.5.9" - }, - { - "author": "whyrusleeping", - "hash": "QmWapVoHjtKhn4MhvKNoPTkJKADFGACfXPFnt7combwp5W", - "name": "go-testutil", - "version": "1.2.19" - }, - { - "author": "whyrusleeping", - "hash": "QmUbSLukzZYZvEYxynj9Dtd1WrGLxxg9R4U68vCMPWHmRU", - "name": "go-libp2p-loggables", - "version": "1.1.33" - }, - { - "author": "multiformats", - "hash": "Qmc85NSvmSG4Frn9Vb2cBc1rMyULH6D3TNVEfCzSKoUpip", - "name": "go-multiaddr-net", - "version": "1.7.2" - }, - { - "author": "multiformats", - "hash": "QmTZBfrPJmjWsCvHEtX5FE6KimVJhsJg5sBbqEFYf4UZtL", - "name": "go-multiaddr", - "version": "1.4.1" - }, - { - "author": "whyrusleeping", - "hash": "QmYVXrKrKHDC9FobgmcmshCDyWwdrfwfanNQN4oxJ9Fk3h", - "name": "go-libp2p-peer", - "version": "3.1.2" - }, - { - "author": "whyrusleeping", - "hash": "QmZNkThpqfVXs9GNbexPrfBbXSLNYeKrE7jwFM2oqHbyqN", - "name": "go-libp2p-protocol", - "version": "1.0.0" - }, - { - "author": "whyrusleeping", - "hash": "QmUrZZavcArYChpibtP8KgQXsAEpvgzUk73B2oj3HLbWc4", - "name": "mafmt", - "version": "1.2.11" - }, - { - "author": "stebalien", - "hash": "QmZWmFkMm28sWeDr5Xh1LexdKBGYGp946MNCfgtLqfX73z", - "name": "go-conn-security-multistream", - "version": "0.1.26" - }, - { - "author": "steb", - "hash": "QmeqC5shQjEBRG9B8roZqQCJ9xb7Pq6AbWxJFMyLgqBBWh", - "name": "go-libp2p-transport-upgrader", - "version": "0.1.28" - }, - { - "author": "whyrusleeping", - "hash": "QmSVaJe1aRjc78cZARTtf4pqvXERYwihyYhZWoVWceHnsK", - "name": "go-libp2p-secio", - "version": "2.0.30" - }, - { - "author": "hashicorp", - "hash": "QmfGQp6VVqdPCDyzEM6EGwMY74YPabTSEoQWHUxZuCSWj3", - "name": "go-multierror", - "version": "0.1.0" - } - ], - "gxVersion": "0.9.1", - "language": "go", - "license": "MIT", - "name": "go-libp2p-swarm", - "releaseCmd": "git commit -a -m \"gx publish $VERSION\"", - "version": "3.0.35" -} - diff --git a/vendor/github.com/libp2p/go-libp2p-swarm/swarm.go b/vendor/github.com/libp2p/go-libp2p-swarm/swarm.go index 1094e72e..b14e9cf0 100644 --- a/vendor/github.com/libp2p/go-libp2p-swarm/swarm.go +++ b/vendor/github.com/libp2p/go-libp2p-swarm/swarm.go @@ -9,14 +9,16 @@ import ( "sync/atomic" "time" + "github.com/libp2p/go-libp2p-core/metrics" + "github.com/libp2p/go-libp2p-core/network" + "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p-core/peerstore" + "github.com/libp2p/go-libp2p-core/transport" + logging "github.com/ipfs/go-log" "github.com/jbenet/goprocess" goprocessctx "github.com/jbenet/goprocess/context" - metrics "github.com/libp2p/go-libp2p-metrics" - inet "github.com/libp2p/go-libp2p-net" - peer "github.com/libp2p/go-libp2p-peer" - pstore "github.com/libp2p/go-libp2p-peerstore" - transport "github.com/libp2p/go-libp2p-transport" + filter "github.com/libp2p/go-maddr-filter" mafilter "github.com/whyrusleeping/multiaddr-filter" ) @@ -47,7 +49,7 @@ type Swarm struct { refs sync.WaitGroup local peer.ID - peers pstore.Peerstore + peers peerstore.Peerstore conns struct { sync.RWMutex @@ -61,7 +63,7 @@ type Swarm struct { notifs struct { sync.RWMutex - m map[inet.Notifiee]struct{} + m map[network.Notifiee]struct{} } transports struct { @@ -87,7 +89,7 @@ type Swarm struct { } // NewSwarm constructs a Swarm -func NewSwarm(ctx context.Context, local peer.ID, peers pstore.Peerstore, bwc metrics.Reporter) *Swarm { +func NewSwarm(ctx context.Context, local peer.ID, peers peerstore.Peerstore, bwc metrics.Reporter) *Swarm { s := &Swarm{ local: local, peers: peers, @@ -98,7 +100,7 @@ func NewSwarm(ctx context.Context, local peer.ID, peers pstore.Peerstore, bwc me s.conns.m = make(map[peer.ID][]*Conn) s.listeners.m = make(map[transport.Listener]struct{}) s.transports.m = make(map[int]transport.Transport) - s.notifs.m = make(map[inet.Notifiee]struct{}) + s.notifs.m = make(map[network.Notifiee]struct{}) s.dsync = NewDialSync(s.doDial) s.limiter = newDialLimiter(s.dialAddr) @@ -165,7 +167,7 @@ func (s *Swarm) Process() goprocess.Process { return s.proc } -func (s *Swarm) addConn(tc transport.Conn, dir inet.Direction) (*Conn, error) { +func (s *Swarm) addConn(tc transport.CapableConn, dir network.Direction) (*Conn, error) { // The underlying transport (or the dialer) *should* filter it's own // connections but we should double check anyways. raddr := tc.RemoteMultiaddr() @@ -194,7 +196,7 @@ func (s *Swarm) addConn(tc transport.Conn, dir inet.Direction) (*Conn, error) { } // Wrap and register the connection. - stat := inet.Stat{Direction: dir} + stat := network.Stat{Direction: dir} c := &Conn{ conn: tc, swarm: s, @@ -217,7 +219,7 @@ func (s *Swarm) addConn(tc transport.Conn, dir inet.Direction) (*Conn, error) { // This should be fast, no reason to wait till later. s.dsync.CancelDial(p) - s.notifyAll(func(f inet.Notifiee) { + s.notifyAll(func(f network.Notifiee) { f.Connected(s, c) }) c.notifyLk.Unlock() @@ -235,7 +237,7 @@ func (s *Swarm) addConn(tc transport.Conn, dir inet.Direction) (*Conn, error) { } // Peerstore returns this swarms internal Peerstore. -func (s *Swarm) Peerstore() pstore.Peerstore { +func (s *Swarm) Peerstore() peerstore.Peerstore { return s.peers } @@ -253,30 +255,30 @@ func (s *Swarm) Close() error { // SetConnHandler assigns the handler for new connections. // You will rarely use this. See SetStreamHandler -func (s *Swarm) SetConnHandler(handler inet.ConnHandler) { +func (s *Swarm) SetConnHandler(handler network.ConnHandler) { s.connh.Store(handler) } // ConnHandler gets the handler for new connections. -func (s *Swarm) ConnHandler() inet.ConnHandler { - handler, _ := s.connh.Load().(inet.ConnHandler) +func (s *Swarm) ConnHandler() network.ConnHandler { + handler, _ := s.connh.Load().(network.ConnHandler) return handler } // SetStreamHandler assigns the handler for new streams. -func (s *Swarm) SetStreamHandler(handler inet.StreamHandler) { +func (s *Swarm) SetStreamHandler(handler network.StreamHandler) { s.streamh.Store(handler) } // StreamHandler gets the handler for new streams. -func (s *Swarm) StreamHandler() inet.StreamHandler { - handler, _ := s.streamh.Load().(inet.StreamHandler) +func (s *Swarm) StreamHandler() network.StreamHandler { + handler, _ := s.streamh.Load().(network.StreamHandler) return handler } // NewStream creates a new stream on any available connection to peer, dialing // if necessary. -func (s *Swarm) NewStream(ctx context.Context, p peer.ID) (inet.Stream, error) { +func (s *Swarm) NewStream(ctx context.Context, p peer.ID) (network.Stream, error) { log.Debugf("[%s] opening stream to peer [%s]", s.local, p) // Algorithm: @@ -295,8 +297,8 @@ func (s *Swarm) NewStream(ctx context.Context, p peer.ID) (inet.Stream, error) { for { c := s.bestConnToPeer(p) if c == nil { - if nodial, _ := inet.GetNoDial(ctx); nodial { - return nil, inet.ErrNoConn + if nodial, _ := network.GetNoDial(ctx); nodial { + return nil, network.ErrNoConn } if dials >= DialAttempts { @@ -322,13 +324,13 @@ func (s *Swarm) NewStream(ctx context.Context, p peer.ID) (inet.Stream, error) { } // ConnsToPeer returns all the live connections to peer. -func (s *Swarm) ConnsToPeer(p peer.ID) []inet.Conn { +func (s *Swarm) ConnsToPeer(p peer.ID) []network.Conn { // TODO: Consider sorting the connection list best to worst. Currently, // it's sorted oldest to newest. s.conns.RLock() defer s.conns.RUnlock() conns := s.conns.m[p] - output := make([]inet.Conn, len(conns)) + output := make([]network.Conn, len(conns)) for i, c := range conns { output[i] = c } @@ -366,20 +368,20 @@ func (s *Swarm) bestConnToPeer(p peer.ID) *Conn { // Connectedness returns our "connectedness" state with the given peer. // // To check if we have an open connection, use `s.Connectedness(p) == -// inet.Connected`. -func (s *Swarm) Connectedness(p peer.ID) inet.Connectedness { +// network.Connected`. +func (s *Swarm) Connectedness(p peer.ID) network.Connectedness { if s.bestConnToPeer(p) != nil { - return inet.Connected + return network.Connected } - return inet.NotConnected + return network.NotConnected } // Conns returns a slice of all connections. -func (s *Swarm) Conns() []inet.Conn { +func (s *Swarm) Conns() []network.Conn { s.conns.RLock() defer s.conns.RUnlock() - conns := make([]inet.Conn, 0, len(s.conns.m)) + conns := make([]network.Conn, 0, len(s.conns.m)) for _, cs := range s.conns.m { for _, c := range cs { conns = append(conns, c) @@ -399,7 +401,7 @@ func (s *Swarm) ClosePeer(p peer.ID) error { default: errCh := make(chan error) for _, c := range conns { - go func(c inet.Conn) { + go func(c network.Conn) { errCh <- c.Close() }(c) } @@ -441,13 +443,13 @@ func (s *Swarm) Backoff() *DialBackoff { } // notifyAll sends a signal to all Notifiees -func (s *Swarm) notifyAll(notify func(inet.Notifiee)) { +func (s *Swarm) notifyAll(notify func(network.Notifiee)) { var wg sync.WaitGroup s.notifs.RLock() wg.Add(len(s.notifs.m)) for f := range s.notifs.m { - go func(f inet.Notifiee) { + go func(f network.Notifiee) { defer wg.Done() notify(f) }(f) @@ -458,14 +460,14 @@ func (s *Swarm) notifyAll(notify func(inet.Notifiee)) { } // Notify signs up Notifiee to receive signals when events happen -func (s *Swarm) Notify(f inet.Notifiee) { +func (s *Swarm) Notify(f network.Notifiee) { s.notifs.Lock() s.notifs.m[f] = struct{}{} s.notifs.Unlock() } // StopNotify unregisters Notifiee fromr receiving signals -func (s *Swarm) StopNotify(f inet.Notifiee) { +func (s *Swarm) StopNotify(f network.Notifiee) { s.notifs.Lock() delete(s.notifs.m, f) s.notifs.Unlock() @@ -500,5 +502,5 @@ func (s *Swarm) String() string { } // Swarm is a Network. -var _ inet.Network = (*Swarm)(nil) -var _ transport.Network = (*Swarm)(nil) +var _ network.Network = (*Swarm)(nil) +var _ transport.TransportNetwork = (*Swarm)(nil) diff --git a/vendor/github.com/libp2p/go-libp2p-swarm/swarm_conn.go b/vendor/github.com/libp2p/go-libp2p-swarm/swarm_conn.go index 26a7794d..cdb9866a 100644 --- a/vendor/github.com/libp2p/go-libp2p-swarm/swarm_conn.go +++ b/vendor/github.com/libp2p/go-libp2p-swarm/swarm_conn.go @@ -5,11 +5,12 @@ import ( "fmt" "sync" - ic "github.com/libp2p/go-libp2p-crypto" - inet "github.com/libp2p/go-libp2p-net" - peer "github.com/libp2p/go-libp2p-peer" - transport "github.com/libp2p/go-libp2p-transport" - smux "github.com/libp2p/go-stream-muxer" + ic "github.com/libp2p/go-libp2p-core/crypto" + "github.com/libp2p/go-libp2p-core/mux" + "github.com/libp2p/go-libp2p-core/network" + "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p-core/transport" + ma "github.com/multiformats/go-multiaddr" ) @@ -21,7 +22,7 @@ var ErrConnClosed = errors.New("connection closed") // Conn is the connection type used by swarm. In general, you won't use this // type directly. type Conn struct { - conn transport.Conn + conn transport.CapableConn swarm *Swarm closeOnce sync.Once @@ -34,7 +35,7 @@ type Conn struct { m map[*Stream]struct{} } - stat inet.Stat + stat network.Stat } // Close closes this connection. @@ -71,7 +72,7 @@ func (c *Conn) doClose() { c.notifyLk.Lock() defer c.notifyLk.Unlock() - c.swarm.notifyAll(func(f inet.Notifiee) { + c.swarm.notifyAll(func(f network.Notifiee) { f.Disconnected(c.swarm, c) }) c.swarm.refs.Done() // taken in Swarm.addConn @@ -100,7 +101,7 @@ func (c *Conn) start() { } c.swarm.refs.Add(1) go func() { - s, err := c.addStream(ts, inet.DirInbound) + s, err := c.addStream(ts, network.DirInbound) // Don't defer this. We don't want to block // swarm shutdown on the connection handler. @@ -161,20 +162,20 @@ func (c *Conn) RemotePublicKey() ic.PubKey { } // Stat returns metadata pertaining to this connection -func (c *Conn) Stat() inet.Stat { +func (c *Conn) Stat() network.Stat { return c.stat } // NewStream returns a new Stream from this connection -func (c *Conn) NewStream() (inet.Stream, error) { +func (c *Conn) NewStream() (network.Stream, error) { ts, err := c.conn.OpenStream() if err != nil { return nil, err } - return c.addStream(ts, inet.DirOutbound) + return c.addStream(ts, network.DirOutbound) } -func (c *Conn) addStream(ts smux.Stream, dir inet.Direction) (*Stream, error) { +func (c *Conn) addStream(ts mux.MuxedStream, dir network.Direction) (*Stream, error) { c.streams.Lock() // Are we still online? if c.streams.m == nil { @@ -184,7 +185,7 @@ func (c *Conn) addStream(ts smux.Stream, dir inet.Direction) (*Stream, error) { } // Wrap and register the stream. - stat := inet.Stat{Direction: dir} + stat := network.Stat{Direction: dir} s := &Stream{ stream: ts, conn: c, @@ -202,7 +203,7 @@ func (c *Conn) addStream(ts smux.Stream, dir inet.Direction) (*Stream, error) { s.notifyLk.Lock() c.streams.Unlock() - c.swarm.notifyAll(func(f inet.Notifiee) { + c.swarm.notifyAll(func(f network.Notifiee) { f.OpenedStream(c.swarm, s) }) s.notifyLk.Unlock() @@ -211,10 +212,10 @@ func (c *Conn) addStream(ts smux.Stream, dir inet.Direction) (*Stream, error) { } // GetStreams returns the streams associated with this connection. -func (c *Conn) GetStreams() []inet.Stream { +func (c *Conn) GetStreams() []network.Stream { c.streams.Lock() defer c.streams.Unlock() - streams := make([]inet.Stream, 0, len(c.streams.m)) + streams := make([]network.Stream, 0, len(c.streams.m)) for s := range c.streams.m { streams = append(streams, s) } diff --git a/vendor/github.com/libp2p/go-libp2p-swarm/swarm_dial.go b/vendor/github.com/libp2p/go-libp2p-swarm/swarm_dial.go index d4b31552..40faad78 100644 --- a/vendor/github.com/libp2p/go-libp2p-swarm/swarm_dial.go +++ b/vendor/github.com/libp2p/go-libp2p-swarm/swarm_dial.go @@ -7,14 +7,13 @@ import ( "sync" "time" - "github.com/hashicorp/go-multierror" + "github.com/libp2p/go-libp2p-core/network" + "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p-core/transport" + lgbl "github.com/libp2p/go-libp2p-loggables" logging "github.com/ipfs/go-log" addrutil "github.com/libp2p/go-addr-util" - lgbl "github.com/libp2p/go-libp2p-loggables" - inet "github.com/libp2p/go-libp2p-net" - peer "github.com/libp2p/go-libp2p-peer" - transport "github.com/libp2p/go-libp2p-transport" ma "github.com/multiformats/go-multiaddr" ) @@ -34,15 +33,23 @@ var ( // been dialed too frequently ErrDialBackoff = errors.New("dial backoff") - // ErrDialFailed is returned when connecting to a peer has ultimately failed - ErrDialFailed = errors.New("dial attempt failed") - // ErrDialToSelf is returned if we attempt to dial our own peer ErrDialToSelf = errors.New("dial to self attempted") // ErrNoTransport is returned when we don't know a transport for the // given multiaddr. ErrNoTransport = errors.New("no transport for protocol") + + // ErrAllDialsFailed is returned when connecting to a peer has ultimately failed + ErrAllDialsFailed = errors.New("all dials failed") + + // ErrNoAddresses is returned when we fail to find any addresses for a + // peer we're trying to dial. + ErrNoAddresses = errors.New("no addresses") + + // ErrNoAddresses is returned when we find addresses for a peer but + // can't use any of them. + ErrNoGoodAddresses = errors.New("no good addresses") ) // DialAttempts governs how many times a goroutine will try to dial a given peer. @@ -174,7 +181,7 @@ func (db *DialBackoff) Clear(p peer.ID) { // the connection will happen over. Swarm can use whichever it choses. // This allows us to use various transport protocols, do NAT traversal/relay, // etc. to achieve connection. -func (s *Swarm) DialPeer(ctx context.Context, p peer.ID) (inet.Conn, error) { +func (s *Swarm) DialPeer(ctx context.Context, p peer.ID) (network.Conn, error) { return s.dialPeer(ctx, p) } @@ -210,7 +217,7 @@ func (s *Swarm) dialPeer(ctx context.Context, p peer.ID) (*Conn, error) { } // apply the DialPeer timeout - ctx, cancel := context.WithTimeout(ctx, inet.GetDialPeerTimeout(ctx)) + ctx, cancel := context.WithTimeout(ctx, network.GetDialPeerTimeout(ctx)) defer cancel() conn, err = s.dsync.DialLock(ctx, p) @@ -256,7 +263,7 @@ func (s *Swarm) doDial(ctx context.Context, p peer.ID) (*Conn, error) { } // ok, we failed. - return nil, fmt.Errorf("dial attempt failed: %s", err) + return nil, err } return conn, nil } @@ -293,11 +300,11 @@ func (s *Swarm) dial(ctx context.Context, p peer.ID) (*Conn, error) { */ peerAddrs := s.peers.Addrs(p) if len(peerAddrs) == 0 { - return nil, errors.New("no addresses") + return nil, &DialError{Peer: p, Cause: ErrNoAddresses} } goodAddrs := s.filterKnownUndialables(peerAddrs) if len(goodAddrs) == 0 { - return nil, errors.New("no good addresses") + return nil, &DialError{Peer: p, Cause: ErrNoGoodAddresses} } goodAddrsChan := make(chan ma.Multiaddr, len(goodAddrs)) for _, a := range goodAddrs { @@ -307,20 +314,28 @@ func (s *Swarm) dial(ctx context.Context, p peer.ID) (*Conn, error) { ///////// // try to get a connection to any addr - connC, err := s.dialAddrs(ctx, p, goodAddrsChan) - if err != nil { - logdial["error"] = err.Error() - return nil, err + connC, dialErr := s.dialAddrs(ctx, p, goodAddrsChan) + if dialErr != nil { + logdial["error"] = dialErr.Cause.Error() + if dialErr.Cause == context.Canceled { + // always prefer the "context canceled" error. + // we rely on behing able to check `err == context.Canceled` + // + // Removing this will BREAK backoff (causing us to + // backoff when canceling dials). + return nil, context.Canceled + } + return nil, dialErr } logdial["conn"] = logging.Metadata{ "localAddr": connC.LocalMultiaddr(), "remoteAddr": connC.RemoteMultiaddr(), } - swarmC, err := s.addConn(connC, inet.DirOutbound) + swarmC, err := s.addConn(connC, network.DirOutbound) if err != nil { logdial["error"] = err.Error() connC.Close() // close the connection. didn't work out :( - return nil, err + return nil, &DialError{Peer: p, Cause: err} } logdial["dial"] = "success" @@ -352,7 +367,7 @@ func (s *Swarm) filterKnownUndialables(addrs []ma.Multiaddr) []ma.Multiaddr { ) } -func (s *Swarm) dialAddrs(ctx context.Context, p peer.ID, remoteAddrs <-chan ma.Multiaddr) (transport.Conn, error) { +func (s *Swarm) dialAddrs(ctx context.Context, p peer.ID, remoteAddrs <-chan ma.Multiaddr) (transport.CapableConn, *DialError) { log.Debugf("%s swarm dialing %s", s.local, p) ctx, cancel := context.WithCancel(ctx) @@ -360,26 +375,23 @@ func (s *Swarm) dialAddrs(ctx context.Context, p peer.ID, remoteAddrs <-chan ma. // use a single response type instead of errs and conns, reduces complexity *a ton* respch := make(chan dialResult) - var dialErrors *multierror.Error + err := new(DialError) defer s.limiter.clearAllPeerDials(p) var active int +dialLoop: for remoteAddrs != nil || active > 0 { // Check for context cancellations and/or responses first. select { case <-ctx.Done(): - if dialError := dialErrors.ErrorOrNil(); dialError != nil { - return nil, dialError - } - - return nil, ctx.Err() + break dialLoop case resp := <-respch: active-- if resp.Err != nil { // Errors are normal, lots of dials will fail log.Infof("got error on dial: %s", resp.Err) - dialErrors = multierror.Append(dialErrors, resp.Err) + err.recordErr(resp.Addr, resp.Err) } else if resp.Conn != nil { return resp.Conn, nil } @@ -400,28 +412,27 @@ func (s *Swarm) dialAddrs(ctx context.Context, p peer.ID, remoteAddrs <-chan ma. s.limitedDial(ctx, p, addr, respch) active++ case <-ctx.Done(): - if dialError := dialErrors.ErrorOrNil(); dialError != nil { - return nil, dialError - } - - return nil, ctx.Err() + break dialLoop case resp := <-respch: active-- if resp.Err != nil { // Errors are normal, lots of dials will fail log.Infof("got error on dial: %s", resp.Err) - dialErrors = multierror.Append(dialErrors, resp.Err) + err.recordErr(resp.Addr, resp.Err) } else if resp.Conn != nil { return resp.Conn, nil } } } - if dialError := dialErrors.ErrorOrNil(); dialError != nil { - return nil, dialError + if ctxErr := ctx.Err(); ctxErr != nil { + err.Cause = ctxErr + } else if len(err.DialErrors) == 0 { + err.Cause = network.ErrNoRemoteAddrs + } else { + err.Cause = ErrAllDialsFailed } - - return nil, inet.ErrNoRemoteAddrs + return nil, err } // limitedDial will start a dial to the given peer when @@ -436,7 +447,7 @@ func (s *Swarm) limitedDial(ctx context.Context, p peer.ID, a ma.Multiaddr, resp }) } -func (s *Swarm) dialAddr(ctx context.Context, p peer.ID, addr ma.Multiaddr) (transport.Conn, error) { +func (s *Swarm) dialAddr(ctx context.Context, p peer.ID, addr ma.Multiaddr) (transport.CapableConn, error) { // Just to double check. Costs nothing. if s.local == p { return nil, ErrDialToSelf @@ -450,7 +461,7 @@ func (s *Swarm) dialAddr(ctx context.Context, p peer.ID, addr ma.Multiaddr) (tra connC, err := tpt.Dial(ctx, addr, p) if err != nil { - return nil, fmt.Errorf("%s --> %s (%s) dial attempt failed: %s", s.local, p, addr, err) + return nil, err } // Trust the transport? Yeah... right. diff --git a/vendor/github.com/libp2p/go-libp2p-swarm/swarm_listen.go b/vendor/github.com/libp2p/go-libp2p-swarm/swarm_listen.go index 7b37d534..85060c4e 100644 --- a/vendor/github.com/libp2p/go-libp2p-swarm/swarm_listen.go +++ b/vendor/github.com/libp2p/go-libp2p-swarm/swarm_listen.go @@ -3,7 +3,8 @@ package swarm import ( "fmt" - inet "github.com/libp2p/go-libp2p-net" + "github.com/libp2p/go-libp2p-core/network" + ma "github.com/multiformats/go-multiaddr" ) @@ -59,7 +60,7 @@ func (s *Swarm) AddListenAddr(a ma.Multiaddr) error { maddr := list.Multiaddr() // signal to our notifiees on successful conn. - s.notifyAll(func(n inet.Notifiee) { + s.notifyAll(func(n network.Notifiee) { n.Listen(s, maddr) }) @@ -83,7 +84,7 @@ func (s *Swarm) AddListenAddr(a ma.Multiaddr) error { s.refs.Add(1) go func() { defer s.refs.Done() - _, err := s.addConn(c, inet.DirInbound) + _, err := s.addConn(c, network.DirInbound) if err != nil { // Probably just means that the swarm has been closed. log.Warningf("add conn failed: ", err) diff --git a/vendor/github.com/libp2p/go-libp2p-swarm/swarm_stream.go b/vendor/github.com/libp2p/go-libp2p-swarm/swarm_stream.go index 754dbd50..9dded2a9 100644 --- a/vendor/github.com/libp2p/go-libp2p-swarm/swarm_stream.go +++ b/vendor/github.com/libp2p/go-libp2p-swarm/swarm_stream.go @@ -7,9 +7,9 @@ import ( "sync/atomic" "time" - inet "github.com/libp2p/go-libp2p-net" - protocol "github.com/libp2p/go-libp2p-protocol" - smux "github.com/libp2p/go-stream-muxer" + "github.com/libp2p/go-libp2p-core/mux" + "github.com/libp2p/go-libp2p-core/network" + "github.com/libp2p/go-libp2p-core/protocol" ) type streamState int @@ -23,12 +23,12 @@ const ( ) // Validate Stream conforms to the go-libp2p-net Stream interface -var _ inet.Stream = &Stream{} +var _ network.Stream = &Stream{} // Stream is the stream type used by swarm. In general, you won't use this type // directly. type Stream struct { - stream smux.Stream + stream mux.MuxedStream conn *Conn state struct { @@ -40,7 +40,7 @@ type Stream struct { protocol atomic.Value - stat inet.Stat + stat network.Stat } func (s *Stream) String() string { @@ -54,8 +54,8 @@ func (s *Stream) String() string { ) } -// Conn returns the Conn associated with this stream, as an inet.Conn -func (s *Stream) Conn() inet.Conn { +// Conn returns the Conn associated with this stream, as an network.Conn +func (s *Stream) Conn() network.Conn { return s.conn } @@ -133,7 +133,7 @@ func (s *Stream) remove() { s.notifyLk.Lock() defer s.notifyLk.Unlock() - s.conn.swarm.notifyAll(func(f inet.Notifiee) { + s.conn.swarm.notifyAll(func(f network.Notifiee) { f.ClosedStream(s.conn.swarm, s) }) s.conn.swarm.refs.Done() @@ -172,6 +172,6 @@ func (s *Stream) SetWriteDeadline(t time.Time) error { } // Stat returns metadata information for this stream. -func (s *Stream) Stat() inet.Stat { +func (s *Stream) Stat() network.Stat { return s.stat } diff --git a/vendor/github.com/libp2p/go-libp2p-swarm/swarm_transport.go b/vendor/github.com/libp2p/go-libp2p-swarm/swarm_transport.go index 04314887..307bfe64 100644 --- a/vendor/github.com/libp2p/go-libp2p-swarm/swarm_transport.go +++ b/vendor/github.com/libp2p/go-libp2p-swarm/swarm_transport.go @@ -4,7 +4,8 @@ import ( "fmt" "strings" - transport "github.com/libp2p/go-libp2p-transport" + "github.com/libp2p/go-libp2p-core/transport" + ma "github.com/multiformats/go-multiaddr" ) diff --git a/vendor/github.com/libp2p/go-libp2p-tls/.travis.yml b/vendor/github.com/libp2p/go-libp2p-tls/.travis.yml new file mode 100644 index 00000000..4f8a4d25 --- /dev/null +++ b/vendor/github.com/libp2p/go-libp2p-tls/.travis.yml @@ -0,0 +1,36 @@ +language: go + +go: + - "1.12.x" + +# first part of the GOARCH workaround +# setting the GOARCH directly doesn't work, since the value will be overwritten later +# so set it to a temporary environment variable first +env: + - TRAVIS_GOARCH=amd64 + - TRAVIS_GOARCH=386 + +# second part of the GOARCH workaround +# now actually set the GOARCH env variable to the value of the temporary variable set earlier +before_install: + - | + export GO111MODULE=on; + go get golang.org/x/tools/cmd/cover; + go get github.com/onsi/ginkgo/ginkgo; + go get github.com/onsi/gomega; + - export GOARCH=$TRAVIS_GOARCH + - go env + +script: + # some tests are randomized. Run them a few times. + - for i in `seq 1 10`; do + ginkgo -r -v --cover --randomizeAllSpecs --randomizeSuites --trace --progress; + done + +after_success: + - cat go-libp2p-tls.coverprofile > coverage.txt + - cat */*.coverprofile >> coverage.txt + - bash <(curl -s https://codecov.io/bash) -f coverage.txt + +cache: + directories: diff --git a/vendor/github.com/libp2p/go-libp2p-tls/LICENSE.md b/vendor/github.com/libp2p/go-libp2p-tls/LICENSE.md new file mode 100644 index 00000000..a94e82cc --- /dev/null +++ b/vendor/github.com/libp2p/go-libp2p-tls/LICENSE.md @@ -0,0 +1,7 @@ +Copyright 2018 Marten Seemann + +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/libp2p/go-libp2p-tls/README.md b/vendor/github.com/libp2p/go-libp2p-tls/README.md new file mode 100644 index 00000000..64390a04 --- /dev/null +++ b/vendor/github.com/libp2p/go-libp2p-tls/README.md @@ -0,0 +1,44 @@ +# go-libp2p-tls + +[![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](https://protocol.ai) +[![](https://img.shields.io/badge/project-libp2p-yellow.svg?style=flat-square)](http://libp2p.io/) +[![](https://img.shields.io/badge/freenode-%23libp2p-yellow.svg?style=flat-square)](http://webchat.freenode.net/?channels=%23libp2p) +[![GoDoc](https://godoc.org/github.com/libp2p/go-libp2p-tls?status.svg)](https://godoc.org/github.com/libp2p/go-libp2p-tls) +[![Linux Build Status](https://img.shields.io/travis/libp2p/go-libp2p-tls/master.svg?style=flat-square&label=linux+build)](https://travis-ci.org/libp2p/go-libp2p-tls) +[![Code Coverage](https://img.shields.io/codecov/c/github/libp2p/go-libp2p-tls/master.svg?style=flat-square)](https://codecov.io/gh/libp2p/go-libp2p-tls/) +[![Discourse posts](https://img.shields.io/discourse/https/discuss.libp2p.io/posts.svg)](https://discuss.libp2p.io) + +> go-libp2p's TLS encrypted transport + +Package `go-libp2p-tls` is a libp2p [conn security transport](https://github.com/libp2p/go-conn-security). It uses TLS to setup the communication channel. + +## Install + +`go-libp2p-tls` is a standard Go module which can be installed with: + +```sh +go get github.com/libp2p/go-libp2p-tls +``` + +This repo is [gomod](https://github.com/golang/go/wiki/Modules)-compatible, and users of +go 1.11 and later with modules enabled will automatically pull the latest tagged release +by referencing this package. Upgrades to future releases can be managed using `go get`, +or by editing your `go.mod` file as [described by the gomod documentation](https://github.com/golang/go/wiki/Modules#how-to-upgrade-and-downgrade-dependencies). + +## Contribute + +Feel free to join in. All welcome. Open an [issue](https://github.com/libp2p/go-libp2p-tls/issues)! + +This repository falls under the IPFS [Code of Conduct](https://github.com/libp2p/community/blob/master/code-of-conduct.md). + +### Want to hack on IPFS? + +[![](https://cdn.rawgit.com/jbenet/contribute-ipfs-gif/master/img/contribute.gif)](https://github.com/ipfs/community/blob/master/CONTRIBUTING.md) + +## License + +MIT + +--- + +The last gx published version of this module was: 0.1.0: QmR4qpcxA1UoHg7SZ89hJHYCpfrxToPjH9xSCug1cQeH1M diff --git a/vendor/github.com/libp2p/go-libp2p-tls/codecov.yml b/vendor/github.com/libp2p/go-libp2p-tls/codecov.yml new file mode 100644 index 00000000..00064af3 --- /dev/null +++ b/vendor/github.com/libp2p/go-libp2p-tls/codecov.yml @@ -0,0 +1,7 @@ +coverage: + round: nearest + status: + project: + default: + threshold: 1 + patch: false diff --git a/vendor/github.com/libp2p/go-libp2p-tls/conn.go b/vendor/github.com/libp2p/go-libp2p-tls/conn.go new file mode 100644 index 00000000..cf32fa45 --- /dev/null +++ b/vendor/github.com/libp2p/go-libp2p-tls/conn.go @@ -0,0 +1,37 @@ +package libp2ptls + +import ( + "crypto/tls" + + ci "github.com/libp2p/go-libp2p-core/crypto" + "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p-core/sec" +) + +type conn struct { + *tls.Conn + + localPeer peer.ID + privKey ci.PrivKey + + remotePeer peer.ID + remotePubKey ci.PubKey +} + +var _ sec.SecureConn = &conn{} + +func (c *conn) LocalPeer() peer.ID { + return c.localPeer +} + +func (c *conn) LocalPrivateKey() ci.PrivKey { + return c.privKey +} + +func (c *conn) RemotePeer() peer.ID { + return c.remotePeer +} + +func (c *conn) RemotePublicKey() ci.PubKey { + return c.remotePubKey +} diff --git a/vendor/github.com/libp2p/go-libp2p-tls/crypto.go b/vendor/github.com/libp2p/go-libp2p-tls/crypto.go new file mode 100644 index 00000000..917c65a6 --- /dev/null +++ b/vendor/github.com/libp2p/go-libp2p-tls/crypto.go @@ -0,0 +1,223 @@ +package libp2ptls + +import ( + "crypto/ecdsa" + "crypto/elliptic" + "crypto/rand" + "crypto/tls" + "crypto/x509" + "crypto/x509/pkix" + "encoding/asn1" + "errors" + "fmt" + "math/big" + "time" + + crypto "github.com/libp2p/go-libp2p-crypto" + "golang.org/x/sys/cpu" + + ic "github.com/libp2p/go-libp2p-core/crypto" + "github.com/libp2p/go-libp2p-core/peer" +) + +const certValidityPeriod = 100 * 365 * 24 * time.Hour // ~100 years +const certificatePrefix = "libp2p-tls-handshake:" + +var extensionID = getPrefixedExtensionID([]int{1, 1}) + +type signedKey struct { + PubKey []byte + Signature []byte +} + +// Identity is used to secure connections +type Identity struct { + config tls.Config +} + +// NewIdentity creates a new identity +func NewIdentity(privKey ic.PrivKey) (*Identity, error) { + cert, err := keyToCertificate(privKey) + if err != nil { + return nil, err + } + return &Identity{ + config: tls.Config{ + MinVersion: tls.VersionTLS13, + PreferServerCipherSuites: preferServerCipherSuites(), + InsecureSkipVerify: true, // This is not insecure here. We will verify the cert chain ourselves. + ClientAuth: tls.RequireAnyClientCert, + Certificates: []tls.Certificate{*cert}, + VerifyPeerCertificate: func(_ [][]byte, _ [][]*x509.Certificate) error { + panic("tls config not specialized for peer") + }, + SessionTicketsDisabled: true, + }, + }, nil +} + +// ConfigForAny is a short-hand for ConfigForPeer(""). +func (i *Identity) ConfigForAny() (*tls.Config, <-chan ic.PubKey) { + return i.ConfigForPeer("") +} + +// ConfigForPeer creates a new single-use tls.Config that verifies the peer's +// certificate chain and returns the peer's public key via the channel. If the +// peer ID is empty, the returned config will accept any peer. +// +// It should be used to create a new tls.Config before securing either an +// incoming or outgoing connection. +func (i *Identity) ConfigForPeer( + remote peer.ID, +) (*tls.Config, <-chan ic.PubKey) { + keyCh := make(chan ic.PubKey, 1) + // We need to check the peer ID in the VerifyPeerCertificate callback. + // The tls.Config it is also used for listening, and we might also have concurrent dials. + // Clone it so we can check for the specific peer ID we're dialing here. + conf := i.config.Clone() + // We're using InsecureSkipVerify, so the verifiedChains parameter will always be empty. + // We need to parse the certificates ourselves from the raw certs. + conf.VerifyPeerCertificate = func(rawCerts [][]byte, _ [][]*x509.Certificate) error { + defer close(keyCh) + + chain := make([]*x509.Certificate, len(rawCerts)) + for i := 0; i < len(rawCerts); i++ { + cert, err := x509.ParseCertificate(rawCerts[i]) + if err != nil { + return err + } + chain[i] = cert + } + + pubKey, err := getRemotePubKey(chain) + if err != nil { + return err + } + if remote != "" && !remote.MatchesPublicKey(pubKey) { + return errors.New("peer IDs don't match") + } + keyCh <- pubKey + return nil + } + return conf, keyCh +} + +// getRemotePubKey derives the remote's public key from the certificate chain. +func getRemotePubKey(chain []*x509.Certificate) (ic.PubKey, error) { + if len(chain) != 1 { + return nil, errors.New("expected one certificates in the chain") + } + cert := chain[0] + pool := x509.NewCertPool() + pool.AddCert(cert) + if _, err := cert.Verify(x509.VerifyOptions{Roots: pool}); err != nil { + // If we return an x509 error here, it will be sent on the wire. + // Wrap the error to avoid that. + return nil, fmt.Errorf("certificate verification failed: %s", err) + } + + var found bool + var keyExt pkix.Extension + // find the libp2p key extension, skipping all unknown extensions + for _, ext := range cert.Extensions { + if extensionIDEqual(ext.Id, extensionID) { + keyExt = ext + found = true + break + } + } + if !found { + return nil, errors.New("expected certificate to contain the key extension") + } + var sk signedKey + if _, err := asn1.Unmarshal(keyExt.Value, &sk); err != nil { + return nil, fmt.Errorf("unmarshalling signed certificate failed: %s", err) + } + pubKey, err := ic.UnmarshalPublicKey(sk.PubKey) + if err != nil { + return nil, fmt.Errorf("unmarshalling public key failed: %s", err) + } + certKeyPub, err := x509.MarshalPKIXPublicKey(cert.PublicKey) + if err != nil { + return nil, err + } + valid, err := pubKey.Verify(append([]byte(certificatePrefix), certKeyPub...), sk.Signature) + if err != nil { + return nil, fmt.Errorf("signature verification failed: %s", err) + } + if !valid { + return nil, errors.New("signature invalid") + } + return pubKey, nil +} + +func keyToCertificate(sk ic.PrivKey) (*tls.Certificate, error) { + certKey, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader) + if err != nil { + return nil, err + } + + keyBytes, err := crypto.MarshalPublicKey(sk.GetPublic()) + if err != nil { + return nil, err + } + certKeyPub, err := x509.MarshalPKIXPublicKey(certKey.Public()) + if err != nil { + return nil, err + } + signature, err := sk.Sign(append([]byte(certificatePrefix), certKeyPub...)) + if err != nil { + return nil, err + } + value, err := asn1.Marshal(signedKey{ + PubKey: keyBytes, + Signature: signature, + }) + if err != nil { + return nil, err + } + + sn, err := rand.Int(rand.Reader, big.NewInt(1<<62)) + if err != nil { + return nil, err + } + tmpl := &x509.Certificate{ + SerialNumber: sn, + NotBefore: time.Time{}, + NotAfter: time.Now().Add(certValidityPeriod), + // after calling CreateCertificate, these will end up in Certificate.Extensions + ExtraExtensions: []pkix.Extension{ + {Id: extensionID, Value: value}, + }, + } + certDER, err := x509.CreateCertificate(rand.Reader, tmpl, tmpl, certKey.Public(), certKey) + if err != nil { + return nil, err + } + return &tls.Certificate{ + Certificate: [][]byte{certDER}, + PrivateKey: certKey, + }, nil +} + +// We want nodes without AES hardware (e.g. ARM) support to always use ChaCha. +// Only if both nodes have AES hardware support (e.g. x86), AES should be used. +// x86->x86: AES, ARM->x86: ChaCha, x86->ARM: ChaCha and ARM->ARM: Chacha +// This function returns true if we don't have AES hardware support, and false otherwise. +// Thus, ARM servers will always use their own cipher suite preferences (ChaCha first), +// and x86 servers will aways use the client's cipher suite preferences. +func preferServerCipherSuites() bool { + // Copied from the Go TLS implementation. + + // Check the cpu flags for each platform that has optimized GCM implementations. + // Worst case, these variables will just all be false. + var ( + hasGCMAsmAMD64 = cpu.X86.HasAES && cpu.X86.HasPCLMULQDQ + hasGCMAsmARM64 = cpu.ARM64.HasAES && cpu.ARM64.HasPMULL + // Keep in sync with crypto/aes/cipher_s390x.go. + hasGCMAsmS390X = cpu.S390X.HasAES && cpu.S390X.HasAESCBC && cpu.S390X.HasAESCTR && (cpu.S390X.HasGHASH || cpu.S390X.HasAESGCM) + + hasGCMAsm = hasGCMAsmAMD64 || hasGCMAsmARM64 || hasGCMAsmS390X + ) + return !hasGCMAsm +} diff --git a/vendor/github.com/libp2p/go-libp2p-tls/extension.go b/vendor/github.com/libp2p/go-libp2p-tls/extension.go new file mode 100644 index 00000000..9472c77e --- /dev/null +++ b/vendor/github.com/libp2p/go-libp2p-tls/extension.go @@ -0,0 +1,22 @@ +package libp2ptls + +var extensionPrefix = []int{1, 3, 6, 1, 4, 1, 53594} + +// getPrefixedExtensionID returns an Object Identifier +// that can be used in x509 Certificates. +func getPrefixedExtensionID(suffix []int) []int { + return append(extensionPrefix, suffix...) +} + +// extensionIDEqual compares two extension IDs. +func extensionIDEqual(a, b []int) bool { + if len(a) != len(b) { + return false + } + for i := range a { + if a[i] != b[i] { + return false + } + } + return true +} diff --git a/vendor/github.com/libp2p/go-libp2p-tls/go.mod b/vendor/github.com/libp2p/go-libp2p-tls/go.mod new file mode 100644 index 00000000..f299848c --- /dev/null +++ b/vendor/github.com/libp2p/go-libp2p-tls/go.mod @@ -0,0 +1,11 @@ +module github.com/libp2p/go-libp2p-tls + +go 1.12 + +require ( + github.com/libp2p/go-libp2p-core v0.0.1 + github.com/libp2p/go-libp2p-crypto v0.1.0 + github.com/onsi/ginkgo v1.7.0 + github.com/onsi/gomega v1.4.3 + golang.org/x/sys v0.0.0-20190526052359-791d8a0f4d09 +) diff --git a/vendor/github.com/ipfs/go-ipfs-addr/go.sum b/vendor/github.com/libp2p/go-libp2p-tls/go.sum similarity index 60% rename from vendor/github.com/ipfs/go-ipfs-addr/go.sum rename to vendor/github.com/libp2p/go-libp2p-tls/go.sum index df30b1ad..508f4305 100644 --- a/vendor/github.com/ipfs/go-ipfs-addr/go.sum +++ b/vendor/github.com/libp2p/go-libp2p-tls/go.sum @@ -8,70 +8,76 @@ github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVa github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495 h1:6IyqGr3fnd0tM3YxipK27TUskaOVUjU2nG45yzwcQKY= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +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/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/gxed/hashland/keccakpg v0.0.1 h1:wrk3uMNaMxbXiHibbPO4S0ymqJMm41WiudyFSs7UnsU= github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfmKFJ6tItnhQ67kU= github.com/gxed/hashland/murmur3 v0.0.1 h1:SheiaIt0sda5K+8FLz952/1iWS9zrnKsEJaOJu4ZbSc= github.com/gxed/hashland/murmur3 v0.0.1/go.mod h1:KjXop02n4/ckmZSnY2+HKcLud/tcmvhST0bie/0lS48= +github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/ipfs/go-log v0.0.1 h1:9XTUN/rW64BCG1YhPK9Hoy3q8nr4gOmHHBpgFdfw6Lc= -github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM= +github.com/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= +github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8 h1:bspPhN+oKYFk5fcGNuQzp6IGzYQSenLEgH3s6jkXrWw= +github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8/go.mod h1:Ly/wlsjFq/qrU3Rar62tu1gASgGw6chQbSh/XgIIXCY= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= -github.com/libp2p/go-libp2p-crypto v0.0.1 h1:JNQd8CmoGTohO/akqrH16ewsqZpci2CbgYH/LmYl8gw= -github.com/libp2p/go-libp2p-crypto v0.0.1/go.mod h1:yJkNyDmO341d5wwXxDUGO0LykUVT72ImHNUqh5D/dBE= -github.com/libp2p/go-libp2p-peer v0.0.1 h1:0qwAOljzYewINrU+Kndoc+1jAL7vzY/oY2Go4DCGfyY= -github.com/libp2p/go-libp2p-peer v0.0.1/go.mod h1:nXQvOBbwVqoP+T5Y5nCjeH4sP9IX/J0AMzcDUVruVoo= -github.com/mattn/go-colorable v0.1.1 h1:G1f5SKeVxmagw/IyvzvtZE4Gybcc4Tr1tf7I8z0XgOg= -github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= -github.com/mattn/go-isatty v0.0.5 h1:tHXDdz1cpzGaovsTB+TVB8q90WEokoVmfMqoVcrLUgw= -github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZxBdp967ls1g+k8= +github.com/libp2p/go-libp2p-core v0.0.1 h1:HSTZtFIq/W5Ue43Zw+uWZyy2Vl5WtF0zDjKN8/DT/1I= +github.com/libp2p/go-libp2p-core v0.0.1/go.mod h1:g/VxnTZ/1ygHxH3dKok7Vno1VfpvGcGip57wjTU4fco= +github.com/libp2p/go-libp2p-crypto v0.1.0 h1:k9MFy+o2zGDNGsaoZl0MA3iZ75qXxr9OOoAZF+sD5OQ= +github.com/libp2p/go-libp2p-crypto v0.1.0/go.mod h1:sPUokVISZiy+nNuTTH/TY+leRSxnFj/2GLjtOTW90hI= github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0OXOcUbGjvZxxijuBwbbmlSxLiuofa+g= github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16 h1:5W7KhL8HVF3XCFOweFD3BNESdnO8ewyYTFT2R+/b8FQ= github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= -github.com/mr-tron/base58 v1.1.0 h1:Y51FGVJ91WBqCEabAi5OPUz38eAx8DakuAm5svLcsfQ= github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= -github.com/multiformats/go-multiaddr v0.0.1 h1:/QUV3VBMDI6pi6xfiw7lr6xhDWWvQKn9udPn68kLSdY= -github.com/multiformats/go-multiaddr v0.0.1/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= +github.com/mr-tron/base58 v1.1.1 h1:OJIdWOWYe2l5PQNgimGtuwHY8nDskvJ5vvs//YnzRLs= +github.com/mr-tron/base58 v1.1.1/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= +github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= +github.com/multiformats/go-multiaddr v0.0.2 h1:RBysRCv5rv3FWlhKWKoXv8tnsCUpEpIZpCmqAGZos2s= +github.com/multiformats/go-multiaddr v0.0.2/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= +github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs= github.com/multiformats/go-multihash v0.0.1 h1:HHwN1K12I+XllBCrqKnhX949Orn4oawPkegHMu2vDqQ= github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= 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.0.2 h1:3jA2P6O1F9UOrWVpwrIo17pu01KWvNWg4X946/Y5Zwg= -github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -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/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc h1:9lDbC6Rz4bwmou+oE6Dt4Cb2BGMur5eR/GYptkKUVHo= -github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc/go.mod h1:bopw91TMyo8J3tvftk8xmU2kPmlrt4nScJQZU2hE5EM= +github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a h1:/eS3yfGjQKG+9kayBkj0ip1BGhq6zJ3eaVksphxAaek= +github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a/go.mod h1:7AyxJNCJ7SBZ1MfVQCWD6Uqo2oubI2Eq2y2eqf+A5r0= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 h1:RC6RW7j+1+HkWaX/Yh71Ee5ZHaHYt7ZP4sQgUrm6cDU= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572/go.mod h1:w0SWMsp6j9O/dk4/ZpIhL+3CkG8ofA2vuv7k+ltqUMc= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b h1:+/WWzjwW6gidDJnMKWLKLX1gxn7irUTF1fLpQovfQ5M= golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd h1:nTDtHvHSdCn1m6ITfMRqtOd/9+7a3s8RBNOZ3eYZzJA= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190227160552-c95aed5357e7 h1:C2F/nMkR/9sfUTpvR3QrjBuTdvMUC/cFajkphs1YLQo= -golang.org/x/net v0.0.0-20190227160552-c95aed5357e7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f h1:wMNYb4v58l5UBM7MYRLPG6ZhfOqbKu7X5eyFl8ZhKvA= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/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-20190219092855-153ac476189d/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223 h1:DH4skfRX4EBpamg7iV4ZlCpblAHI6s6TDM39bFZumv8= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190526052359-791d8a0f4d09 h1:IlD35wZE03o2qJy2o37WIskL33b7PT6cHdGnE8bieZs= +golang.org/x/sys v0.0.0-20190526052359-791d8a0f4d09/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/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/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/yaml.v2 v2.2.1 h1:mUhvW9EsL+naU5Q3cakzfE91YhliOondGd6ZrsDBHQE= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/vendor/github.com/libp2p/go-libp2p-tls/transport.go b/vendor/github.com/libp2p/go-libp2p-tls/transport.go new file mode 100644 index 00000000..2dc4257a --- /dev/null +++ b/vendor/github.com/libp2p/go-libp2p-tls/transport.go @@ -0,0 +1,136 @@ +package libp2ptls + +import ( + "context" + "crypto/tls" + "errors" + "net" + "os" + + ci "github.com/libp2p/go-libp2p-core/crypto" + "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p-core/sec" +) + +// TLS 1.3 is opt-in in Go 1.12 +// Activate it by setting the tls13 GODEBUG flag. +func init() { + os.Setenv("GODEBUG", os.Getenv("GODEBUG")+",tls13=1") +} + +// ID is the protocol ID (used when negotiating with multistream) +const ID = "/tls/1.0.0" + +// Transport constructs secure communication sessions for a peer. +type Transport struct { + identity *Identity + + localPeer peer.ID + privKey ci.PrivKey +} + +// New creates a TLS encrypted transport +func New(key ci.PrivKey) (*Transport, error) { + id, err := peer.IDFromPrivateKey(key) + if err != nil { + return nil, err + } + t := &Transport{ + localPeer: id, + privKey: key, + } + + identity, err := NewIdentity(key) + if err != nil { + return nil, err + } + t.identity = identity + return t, nil +} + +var _ sec.SecureTransport = &Transport{} + +// SecureInbound runs the TLS handshake as a server. +func (t *Transport) SecureInbound(ctx context.Context, insecure net.Conn) (sec.SecureConn, error) { + config, keyCh := t.identity.ConfigForAny() + return t.handshake(ctx, tls.Server(insecure, config), keyCh) +} + +// SecureOutbound runs the TLS handshake as a client. +// Note that SecureOutbound will not return an error if the server doesn't +// accept the certificate. This is due to the fact that in TLS 1.3, the client +// sends its certificate and the ClientFinished in the same flight, and can send +// application data immediately afterwards. +// If the handshake fails, the server will close the connection. The client will +// notice this after 1 RTT when calling Read. +func (t *Transport) SecureOutbound(ctx context.Context, insecure net.Conn, p peer.ID) (sec.SecureConn, error) { + config, keyCh := t.identity.ConfigForPeer(p) + return t.handshake(ctx, tls.Client(insecure, config), keyCh) +} + +func (t *Transport) handshake( + ctx context.Context, + tlsConn *tls.Conn, + keyCh <-chan ci.PubKey, +) (sec.SecureConn, error) { + // There's no way to pass a context to tls.Conn.Handshake(). + // See https://github.com/golang/go/issues/18482. + // Close the connection instead. + select { + case <-ctx.Done(): + tlsConn.Close() + default: + } + done := make(chan struct{}) + defer close(done) + go func() { + select { + case <-done: + case <-ctx.Done(): + tlsConn.Close() + } + }() + + if err := tlsConn.Handshake(); err != nil { + // if the context was canceled, return the context error + if ctxErr := ctx.Err(); ctxErr != nil { + return nil, ctxErr + } + return nil, err + } + + // Should be ready by this point, don't block. + var remotePubKey ci.PubKey + select { + case remotePubKey = <-keyCh: + default: + } + + conn, err := t.setupConn(tlsConn, remotePubKey) + if err != nil { + // if the context was canceled, return the context error + if ctxErr := ctx.Err(); ctxErr != nil { + return nil, ctxErr + } + return nil, err + } + return conn, nil +} + +func (t *Transport) setupConn(tlsConn *tls.Conn, remotePubKey ci.PubKey) (sec.SecureConn, error) { + if remotePubKey == nil { + return nil, errors.New("go-libp2p-tls BUG: expected remote pub key to be set") + } + + remotePeerID, err := peer.IDFromPublicKey(remotePubKey) + if err != nil { + return nil, err + } + return &conn{ + Conn: tlsConn, + localPeer: t.localPeer, + privKey: t.privKey, + remotePeer: remotePeerID, + remotePubKey: remotePubKey, + }, nil +} diff --git a/vendor/github.com/libp2p/go-libp2p-transport-upgrader/.travis.yml b/vendor/github.com/libp2p/go-libp2p-transport-upgrader/.travis.yml index 4cfe98c2..5163d693 100644 --- a/vendor/github.com/libp2p/go-libp2p-transport-upgrader/.travis.yml +++ b/vendor/github.com/libp2p/go-libp2p-transport-upgrader/.travis.yml @@ -10,7 +10,6 @@ env: global: - GOTFLAGS="-race" matrix: - - BUILD_DEPTYPE=gx - BUILD_DEPTYPE=gomod @@ -24,7 +23,6 @@ script: cache: directories: - - $GOPATH/src/gx - $GOPATH/pkg/mod - $HOME/.cache/go-build diff --git a/vendor/github.com/libp2p/go-libp2p-transport-upgrader/Makefile b/vendor/github.com/libp2p/go-libp2p-transport-upgrader/Makefile deleted file mode 100644 index 20619413..00000000 --- a/vendor/github.com/libp2p/go-libp2p-transport-upgrader/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -gx: - go get github.com/whyrusleeping/gx - go get github.com/whyrusleeping/gx-go - -deps: gx - gx --verbose install --global - gx-go rewrite - -publish: - gx-go rewrite --undo - diff --git a/vendor/github.com/libp2p/go-libp2p-transport-upgrader/README.md b/vendor/github.com/libp2p/go-libp2p-transport-upgrader/README.md index 01832e50..ef143810 100644 --- a/vendor/github.com/libp2p/go-libp2p-transport-upgrader/README.md +++ b/vendor/github.com/libp2p/go-libp2p-transport-upgrader/README.md @@ -1,12 +1,11 @@ # go-libp2p-transport-upgrader -[![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](http://ipn.io) -[![](https://img.shields.io/badge/freenode-%23ipfs-blue.svg?style=flat-square)](http://webchat.freenode.net/?channels=%23ipfs) -[![](https://img.shields.io/badge/project-IPFS-blue.svg?style=flat-square)](http://ipfs.io/) -[![standard-readme compliant](https://img.shields.io/badge/standard--readme-OK-green.svg?style=flat-square)](https://github.com/RichardLitt/standard-readme) +[![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](https://protocol.ai) +[![](https://img.shields.io/badge/project-libp2p-yellow.svg?style=flat-square)](https://libp2p.io/) +[![](https://img.shields.io/badge/freenode-%23libp2p-yellow.svg?style=flat-square)](http://webchat.freenode.net/?channels=%23libp2p) [![GoDoc](https://godoc.org/github.com/libp2p/go-libp2p-transport-upgrader?status.svg)](https://godoc.org/github.com/libp2p/go-libp2p-transport-upgrader) -[![Coverage Status](https://coveralls.io/repos/github/libp2p/go-libp2p-transport-upgrader/badge.svg?branch=master)](https://coveralls.io/github/libp2p/go-libp2p-transport-upgrader?branch=master) [![Build Status](https://travis-ci.org/libp2p/go-libp2p-transport-upgrader.svg?branch=master)](https://travis-ci.org/libp2p/go-libp2p-transport-upgrader) +[![Discourse posts](https://img.shields.io/discourse/https/discuss.libp2p.io/posts.svg)](https://discuss.libp2p.io) > Stream connection to libp2p connection upgrader @@ -35,24 +34,13 @@ Note: This package largely replaces the functionality of [go-libp2p-conn](https: go get github.com/libp2p/go-libp2p-transport-upgrader ``` -Note that `go-libp2p-transport-upgrader` is packaged with Gx, so it is recommended to use Gx to install and use it (see the Usage section). +This repo is [gomod](https://github.com/golang/go/wiki/Modules)-compatible, and users of +go 1.11 and later with modules enabled will automatically pull the latest tagged release +by referencing this package. Upgrades to future releases can be managed using `go get`, +or by editing your `go.mod` file as [described by the gomod documentation](https://github.com/golang/go/wiki/Modules#how-to-upgrade-and-downgrade-dependencies). ## Usage -This module is packaged with [Gx](https://github.com/whyrusleeping/gx). In order to use it in your own project it is recommended that you: - -```sh -go get -u github.com/whyrusleeping/gx -go get -u github.com/whyrusleeping/gx-go -cd -gx init -gx import github.com/libp2p/go-libp2p-transport-upgrader -gx install --global -gx-go --rewrite -``` - -Please check [Gx](https://github.com/whyrusleeping/gx) and [Gx-go](https://github.com/whyrusleeping/gx-go) documentation for more information. - ## Example Below is a simplified TCP transport implementation using the transport upgrader. In practice, you'll want to use [go-tcp-transport](https://github.com/libp2p/go-tcp-transport) (which has reuseport support). @@ -134,3 +122,7 @@ This repository falls under the IPFS [Code of Conduct](https://github.com/libp2p ## License MIT + +--- + +The last gx published version of this module was: 0.1.28: QmeqC5shQjEBRG9B8roZqQCJ9xb7Pq6AbWxJFMyLgqBBWh diff --git a/vendor/github.com/libp2p/go-libp2p-transport-upgrader/conn.go b/vendor/github.com/libp2p/go-libp2p-transport-upgrader/conn.go index 48e48141..2098b151 100644 --- a/vendor/github.com/libp2p/go-libp2p-transport-upgrader/conn.go +++ b/vendor/github.com/libp2p/go-libp2p-transport-upgrader/conn.go @@ -3,15 +3,15 @@ package stream import ( "fmt" - inet "github.com/libp2p/go-libp2p-net" - transport "github.com/libp2p/go-libp2p-transport" - smux "github.com/libp2p/go-stream-muxer" + "github.com/libp2p/go-libp2p-core/mux" + "github.com/libp2p/go-libp2p-core/network" + "github.com/libp2p/go-libp2p-core/transport" ) type transportConn struct { - smux.Conn - inet.ConnMultiaddrs - inet.ConnSecurity + mux.MuxedConn + network.ConnMultiaddrs + network.ConnSecurity transport transport.Transport } diff --git a/vendor/github.com/libp2p/go-libp2p-transport-upgrader/go.mod b/vendor/github.com/libp2p/go-libp2p-transport-upgrader/go.mod index 54baad7b..d7b59886 100644 --- a/vendor/github.com/libp2p/go-libp2p-transport-upgrader/go.mod +++ b/vendor/github.com/libp2p/go-libp2p-transport-upgrader/go.mod @@ -3,17 +3,11 @@ module github.com/libp2p/go-libp2p-transport-upgrader require ( github.com/ipfs/go-log v0.0.1 github.com/jbenet/go-temp-err-catcher v0.0.0-20150120210811-aac704a3f4f2 - github.com/libp2p/go-conn-security v0.0.1 - github.com/libp2p/go-libp2p-interface-pnet v0.0.1 - github.com/libp2p/go-libp2p-net v0.0.1 - github.com/libp2p/go-libp2p-peer v0.0.1 - github.com/libp2p/go-libp2p-transport v0.0.1 - github.com/libp2p/go-maddr-filter v0.0.1 - github.com/libp2p/go-mplex v0.0.1 // indirect - github.com/libp2p/go-stream-muxer v0.0.1 - github.com/multiformats/go-multiaddr v0.0.1 + github.com/libp2p/go-libp2p-core v0.0.1 + github.com/libp2p/go-libp2p-mplex v0.2.0 + github.com/libp2p/go-maddr-filter v0.0.4 + github.com/multiformats/go-multiaddr v0.0.4 github.com/multiformats/go-multiaddr-net v0.0.1 - github.com/onsi/ginkgo v1.7.0 - github.com/onsi/gomega v1.4.3 - github.com/whyrusleeping/go-smux-multiplex v3.0.16+incompatible + github.com/onsi/ginkgo v1.8.0 + github.com/onsi/gomega v1.5.0 ) diff --git a/vendor/github.com/libp2p/go-libp2p-transport-upgrader/go.sum b/vendor/github.com/libp2p/go-libp2p-transport-upgrader/go.sum index 613dbae0..83358689 100644 --- a/vendor/github.com/libp2p/go-libp2p-transport-upgrader/go.sum +++ b/vendor/github.com/libp2p/go-libp2p-transport-upgrader/go.sum @@ -1,5 +1,3 @@ -github.com/AndreasBriese/bbloom v0.0.0-20180913140656-343706a395b7/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= -github.com/Kubuxu/go-os-helper v0.0.1/go.mod h1:N8B+I7vPCT80IcP58r50u4+gEEcsZETFUpAzWW2ep1Y= github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32 h1:qkOC5Gd33k54tobS36cXdAzJbeHaduLtnLQQwNoIi78= github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32/go.mod h1:DrZx5ec/dmnfpw9KyYoQyYo7d0KEvTkk/5M/vbZjAr8= @@ -10,33 +8,23 @@ github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVa github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dgraph-io/badger v1.5.5-0.20190226225317-8115aed38f8f/go.mod h1:VZxzAIRPHRVNRKRo6AXrX9BJegn6il06VMTZVJYCIjQ= -github.com/dgryski/go-farm v0.0.0-20190104051053-3adb47b1fb0f/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= 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/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.0 h1:kbxbvI4Un1LUWKxufD+BiE6AEExYYgkQLQmLFqA1LFk= -github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0= -github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gxed/hashland/keccakpg v0.0.1 h1:wrk3uMNaMxbXiHibbPO4S0ymqJMm41WiudyFSs7UnsU= github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfmKFJ6tItnhQ67kU= github.com/gxed/hashland/murmur3 v0.0.1 h1:SheiaIt0sda5K+8FLz952/1iWS9zrnKsEJaOJu4ZbSc= github.com/gxed/hashland/murmur3 v0.0.1/go.mod h1:KjXop02n4/ckmZSnY2+HKcLud/tcmvhST0bie/0lS48= -github.com/hashicorp/golang-lru v0.5.1/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/ipfs/go-datastore v0.0.1/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= -github.com/ipfs/go-ds-badger v0.0.2/go.mod h1:Y3QpeSFWQf6MopLTiZD+VT6IC1yZqaGmjvRcKeSGij8= -github.com/ipfs/go-ds-leveldb v0.0.1/go.mod h1:feO8V3kubwsEF22n0YRQCffeb79OOYIykR4L04tMOYc= -github.com/ipfs/go-ipfs-delay v0.0.0-20181109222059-70721b86a9a8/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= +github.com/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= github.com/ipfs/go-log v0.0.1 h1:9XTUN/rW64BCG1YhPK9Hoy3q8nr4gOmHHBpgFdfw6Lc= github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM= github.com/jbenet/go-temp-err-catcher v0.0.0-20150120210811-aac704a3f4f2 h1:vhC1OXXiT9R2pczegwz6moDvuRpggaroAXhPIseh57A= @@ -48,33 +36,19 @@ github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlT github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= -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/libp2p/go-buffer-pool v0.0.1 h1:9Rrn/H46cXjaA2HQ5Y8lyhOS1NhTkZ4yuEs2r3Eechg= github.com/libp2p/go-buffer-pool v0.0.1/go.mod h1:xtyIz9PMobb13WaxR6Zo1Pd1zXJKYg0a8KiIvDp3TzQ= -github.com/libp2p/go-conn-security v0.0.1 h1:4kMMrqrt9EUNCNjX1xagSJC+bq16uqjMe9lk1KBMVNs= -github.com/libp2p/go-conn-security v0.0.1/go.mod h1:bGmu51N0KU9IEjX7kl2PQjgZa40JQWnayTvNMgD/vyk= -github.com/libp2p/go-libp2p-crypto v0.0.1 h1:JNQd8CmoGTohO/akqrH16ewsqZpci2CbgYH/LmYl8gw= -github.com/libp2p/go-libp2p-crypto v0.0.1/go.mod h1:yJkNyDmO341d5wwXxDUGO0LykUVT72ImHNUqh5D/dBE= -github.com/libp2p/go-libp2p-interface-pnet v0.0.1 h1:7GnzRrBTJHEsofi1ahFdPN9Si6skwXQE9UqR2S+Pkh8= -github.com/libp2p/go-libp2p-interface-pnet v0.0.1/go.mod h1:el9jHpQAXK5dnTpKA4yfCNBZXvrzdOU75zz+C6ryp3k= -github.com/libp2p/go-libp2p-net v0.0.1 h1:xJ4Vh4yKF/XKb8fd1Ev0ebAGzVjMxXzrxG2kjtU+F5Q= -github.com/libp2p/go-libp2p-net v0.0.1/go.mod h1:Yt3zgmlsHOgUWSXmt5V/Jpz9upuJBE8EgNU9DrCcR8c= -github.com/libp2p/go-libp2p-peer v0.0.1 h1:0qwAOljzYewINrU+Kndoc+1jAL7vzY/oY2Go4DCGfyY= -github.com/libp2p/go-libp2p-peer v0.0.1/go.mod h1:nXQvOBbwVqoP+T5Y5nCjeH4sP9IX/J0AMzcDUVruVoo= -github.com/libp2p/go-libp2p-peerstore v0.0.1 h1:twKovq8YK5trLrd3nB7PD2Zu9JcyAIdm7Bz9yBWjhq8= -github.com/libp2p/go-libp2p-peerstore v0.0.1/go.mod h1:RabLyPVJLuNQ+GFyoEkfi8H4Ti6k/HtZJ7YKgtSq+20= -github.com/libp2p/go-libp2p-protocol v0.0.1 h1:+zkEmZ2yFDi5adpVE3t9dqh/N9TbpFWywowzeEzBbLM= -github.com/libp2p/go-libp2p-protocol v0.0.1/go.mod h1:Af9n4PiruirSDjHycM1QuiMi/1VZNHYcK8cLgFJLZ4s= -github.com/libp2p/go-libp2p-transport v0.0.1 h1:uF0ZSQvm9EDlGadHSaaWwXihpsh4HvWO4DOtsPyldXM= -github.com/libp2p/go-libp2p-transport v0.0.1/go.mod h1:UzbUs9X+PHOSw7S3ZmeOxfnwaQY5vGDzZmKPod3N3tk= -github.com/libp2p/go-maddr-filter v0.0.1 h1:apvYTg0aIxxQyBX+XHKOR+0+lYhGs1Yv+JmTH9nyl5I= -github.com/libp2p/go-maddr-filter v0.0.1/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= -github.com/libp2p/go-mplex v0.0.1 h1:dn2XGSrUxLtz3/8u85bGrwhUEKPX8MOF3lpmcWBZCWc= -github.com/libp2p/go-mplex v0.0.1/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0= +github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZxBdp967ls1g+k8= +github.com/libp2p/go-libp2p-core v0.0.1 h1:HSTZtFIq/W5Ue43Zw+uWZyy2Vl5WtF0zDjKN8/DT/1I= +github.com/libp2p/go-libp2p-core v0.0.1/go.mod h1:g/VxnTZ/1ygHxH3dKok7Vno1VfpvGcGip57wjTU4fco= +github.com/libp2p/go-libp2p-mplex v0.2.0 h1:vnR+/fUnL5d2kTB1Lfce1KVSP+bCCy2aJIvqvb9cFqE= +github.com/libp2p/go-libp2p-mplex v0.2.0/go.mod h1:Ejl9IyjvXJ0T9iqUTE1jpYATQ9NM3g+OtR+EMMODbKo= +github.com/libp2p/go-libp2p-testing v0.0.3 h1:bdij4bKaaND7tCsaXVjRfYkMpvoOeKj9AVQGJllA6jM= +github.com/libp2p/go-libp2p-testing v0.0.3/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= +github.com/libp2p/go-maddr-filter v0.0.4 h1:hx8HIuuwk34KePddrp2mM5ivgPkZ09JH4AvsALRbFUs= +github.com/libp2p/go-maddr-filter v0.0.4/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= +github.com/libp2p/go-mplex v0.0.3 h1:YiMaevQcZtFU6DmKIF8xEO0vaui5kM5HJ1V1xkWQv14= +github.com/libp2p/go-mplex v0.0.3/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0= github.com/libp2p/go-stream-muxer v0.0.1 h1:Ce6e2Pyu+b5MC1k3eeFtAax0pW4gc6MosYSLV05UeLw= github.com/libp2p/go-stream-muxer v0.0.1/go.mod h1:bAo8x7YkSpadMTbtTaxGVHWUQsR/l5MEaHbKaliuT14= github.com/mattn/go-colorable v0.1.1 h1:G1f5SKeVxmagw/IyvzvtZE4Gybcc4Tr1tf7I8z0XgOg= @@ -85,37 +59,41 @@ github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0 github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16 h1:5W7KhL8HVF3XCFOweFD3BNESdnO8ewyYTFT2R+/b8FQ= github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= -github.com/mr-tron/base58 v1.1.0 h1:Y51FGVJ91WBqCEabAi5OPUz38eAx8DakuAm5svLcsfQ= github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= +github.com/mr-tron/base58 v1.1.1 h1:OJIdWOWYe2l5PQNgimGtuwHY8nDskvJ5vvs//YnzRLs= +github.com/mr-tron/base58 v1.1.1/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= -github.com/multiformats/go-multiaddr v0.0.1 h1:/QUV3VBMDI6pi6xfiw7lr6xhDWWvQKn9udPn68kLSdY= github.com/multiformats/go-multiaddr v0.0.1/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= +github.com/multiformats/go-multiaddr v0.0.2/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= +github.com/multiformats/go-multiaddr v0.0.4 h1:WgMSI84/eRLdbptXMkMWDXPjPq7SPLIgGUVm2eroyU4= +github.com/multiformats/go-multiaddr v0.0.4/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= github.com/multiformats/go-multiaddr-dns v0.0.1 h1:jQt9c6tDSdQLIlBo4tXYx7QUHCPjxsB1zXcag/2S7zc= github.com/multiformats/go-multiaddr-dns v0.0.1/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= github.com/multiformats/go-multiaddr-net v0.0.1 h1:76O59E3FavvHqNg7jvzWzsPSW5JSi/ek0E4eiDVbg9g= github.com/multiformats/go-multiaddr-net v0.0.1/go.mod h1:nw6HSxNmCIQH27XPGBuX+d1tnvM7ihcFwHMSstNAVUU= +github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs= github.com/multiformats/go-multihash v0.0.1 h1:HHwN1K12I+XllBCrqKnhX949Orn4oawPkegHMu2vDqQ= github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= 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/ginkgo v1.8.0 h1:VkHVNpR4iVnU8XQR6DBm8BqYjN7CRzw+xKUbVVbbW9w= +github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.5.0 h1:izbySO9zDPmjJ8rDjLvkA2zJHIo+HkYXHnf7eN7SSyo= +github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/opentracing/opentracing-go v1.0.2 h1:3jA2P6O1F9UOrWVpwrIo17pu01KWvNWg4X946/Y5Zwg= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -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/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a h1:/eS3yfGjQKG+9kayBkj0ip1BGhq6zJ3eaVksphxAaek= +github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a/go.mod h1:7AyxJNCJ7SBZ1MfVQCWD6Uqo2oubI2Eq2y2eqf+A5r0= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 h1:RC6RW7j+1+HkWaX/Yh71Ee5ZHaHYt7ZP4sQgUrm6cDU= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572/go.mod h1:w0SWMsp6j9O/dk4/ZpIhL+3CkG8ofA2vuv7k+ltqUMc= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= -github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1/go.mod h1:8UvriyWtv5Q5EOgjHaSseUEdkQfvwFv1I/In/O2M9gc= github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc h1:9lDbC6Rz4bwmou+oE6Dt4Cb2BGMur5eR/GYptkKUVHo= github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc/go.mod h1:bopw91TMyo8J3tvftk8xmU2kPmlrt4nScJQZU2hE5EM= -github.com/whyrusleeping/go-smux-multiplex v3.0.16+incompatible h1:iqksILj8STw03EJQe7Laj4ubnw+ojOyik18cd5vPL1o= -github.com/whyrusleeping/go-smux-multiplex v3.0.16+incompatible/go.mod h1:34LEDbeKFZInPUrAG+bjuJmUXONGdEFW7XL0SpTY1y4= -github.com/whyrusleeping/mafmt v1.2.8/go.mod h1:faQJFPbLSxzD9xpA02ttW/tS9vZykNvXwGvqIpk20FA= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b h1:+/WWzjwW6gidDJnMKWLKLX1gxn7irUTF1fLpQovfQ5M= @@ -132,10 +110,8 @@ golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= 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/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= diff --git a/vendor/github.com/libp2p/go-libp2p-transport-upgrader/listener.go b/vendor/github.com/libp2p/go-libp2p-transport-upgrader/listener.go index fa26825f..f792c991 100644 --- a/vendor/github.com/libp2p/go-libp2p-transport-upgrader/listener.go +++ b/vendor/github.com/libp2p/go-libp2p-transport-upgrader/listener.go @@ -5,16 +5,17 @@ import ( "fmt" "sync" + "github.com/libp2p/go-libp2p-core/transport" + logging "github.com/ipfs/go-log" tec "github.com/jbenet/go-temp-err-catcher" - transport "github.com/libp2p/go-libp2p-transport" manet "github.com/multiformats/go-multiaddr-net" ) var log = logging.Logger("stream-upgrader") type connErr struct { - conn transport.Conn + conn transport.CapableConn err error } @@ -24,7 +25,7 @@ type listener struct { transport transport.Transport upgrader *Upgrader - incoming chan transport.Conn + incoming chan transport.CapableConn err error // Used for backpressure @@ -139,7 +140,7 @@ func (l *listener) handleIncoming() { } // Accept accepts a connection. -func (l *listener) Accept() (transport.Conn, error) { +func (l *listener) Accept() (transport.CapableConn, error) { for c := range l.incoming { // Could have been sitting there for a while. if !c.IsClosed() { diff --git a/vendor/github.com/libp2p/go-libp2p-transport-upgrader/package.json b/vendor/github.com/libp2p/go-libp2p-transport-upgrader/package.json deleted file mode 100644 index dc5eb7f8..00000000 --- a/vendor/github.com/libp2p/go-libp2p-transport-upgrader/package.json +++ /dev/null @@ -1,101 +0,0 @@ -{ - "author": "steb", - "bugs": { - "url": "https://github.com/libp2p/go-libp2p-transport-upgrader" - }, - "gx": { - "dvcsimport": "github.com/libp2p/go-libp2p-transport-upgrader" - }, - "gxDependencies": [ - { - "author": "Stebalien", - "hash": "QmPRoHqULmP4MuKAN5EFaJ64MLpeMY8cny2318xDBDmmkp", - "name": "go-conn-security", - "version": "0.1.28" - }, - { - "author": "whyrusleeping", - "hash": "QmVtV1y2e8W4eQgzsP6qfSpCCZ6zWYE4m6NzJjB7iswwrT", - "name": "go-stream-muxer", - "version": "3.1.0" - }, - { - "author": "whyrusleeping", - "hash": "QmT6C5ebDy92zyRzdmSNyda5q7zkNXy68X47RDJiHpvaxd", - "name": "go-maddr-filter", - "version": "1.1.13" - }, - { - "author": "whyrusleeping", - "hash": "QmNQWMWWBmkAcaVEspSNwYB95axzKFhYTdqZtABA2zXoPu", - "name": "go-libp2p-transport", - "version": "3.0.27" - }, - { - "author": "libp2p", - "hash": "QmW7Ump7YyBMr712Ta3iEVh3ZYcfVvJaPryfbCnyE826b4", - "name": "go-libp2p-interface-pnet", - "version": "3.0.0" - }, - { - "author": "whyrusleeping", - "hash": "QmYVXrKrKHDC9FobgmcmshCDyWwdrfwfanNQN4oxJ9Fk3h", - "name": "go-libp2p-peer", - "version": "3.1.2" - }, - { - "author": "whyrusleeping", - "hash": "QmaJvNdDccVkTELQLCGXWrLxgaQ14aMdhzZx1EiHPXKbDc", - "name": "go-smux-multiplex", - "version": "3.0.19" - }, - { - "author": "multiformats", - "hash": "QmTZBfrPJmjWsCvHEtX5FE6KimVJhsJg5sBbqEFYf4UZtL", - "name": "go-multiaddr", - "version": "1.4.1" - }, - { - "author": "multiformats", - "hash": "Qmc85NSvmSG4Frn9Vb2cBc1rMyULH6D3TNVEfCzSKoUpip", - "name": "go-multiaddr-net", - "version": "1.7.2" - }, - { - "hash": "QmbkT7eMTyXfpeyB3ZMxxcxg7XH8t6uXp49jqzz4HB7BGF", - "name": "go-log", - "version": "1.5.9" - }, - { - "author": "whyrusleeping", - "hash": "QmWHgLqrghM9zw77nF6gdvT9ExQ2RB9pLxkd8sDHZf1rWb", - "name": "go-temp-err-catcher", - "version": "0.0.0" - }, - { - "author": "whyrusleeping", - "hash": "QmY3ArotKMKaL7YGfbQfyDrib6RVraLqZYWXZvVgZktBxp", - "name": "go-libp2p-net", - "version": "3.0.30" - }, - { - "author": "onsi", - "hash": "QmNuLxhqRhfimRZeLttPe6Sa44MNwuHAdaFFa9TDuNZUmf", - "name": "ginkgo", - "version": "1.1.0" - }, - { - "author": "onsi", - "hash": "QmUWtNQd8JdEiYiDqNYTUcaqyteJZ2rTNQLiw3dauLPccy", - "name": "gomega", - "version": "1.1.0" - } - ], - "gxVersion": "0.12.1", - "language": "go", - "license": "", - "name": "go-libp2p-transport-upgrader", - "releaseCmd": "git commit -a -m \"gx publish $VERSION\"", - "version": "0.1.28" -} - diff --git a/vendor/github.com/libp2p/go-libp2p-transport-upgrader/upgrader.go b/vendor/github.com/libp2p/go-libp2p-transport-upgrader/upgrader.go index 1c901b27..5e3854b0 100644 --- a/vendor/github.com/libp2p/go-libp2p-transport-upgrader/upgrader.go +++ b/vendor/github.com/libp2p/go-libp2p-transport-upgrader/upgrader.go @@ -6,12 +6,13 @@ import ( "fmt" "net" - ss "github.com/libp2p/go-conn-security" - pnet "github.com/libp2p/go-libp2p-interface-pnet" - peer "github.com/libp2p/go-libp2p-peer" - transport "github.com/libp2p/go-libp2p-transport" + "github.com/libp2p/go-libp2p-core/mux" + "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p-core/pnet" + "github.com/libp2p/go-libp2p-core/sec" + "github.com/libp2p/go-libp2p-core/transport" + filter "github.com/libp2p/go-maddr-filter" - smux "github.com/libp2p/go-stream-muxer" manet "github.com/multiformats/go-multiaddr-net" ) @@ -26,8 +27,8 @@ var AcceptQueueLength = 16 // to a full transport connection (secure and multiplexed). type Upgrader struct { Protector pnet.Protector - Secure ss.Transport - Muxer smux.Transport + Secure sec.SecureTransport + Muxer mux.Multiplexer Filters *filter.Filters } @@ -39,7 +40,7 @@ func (u *Upgrader) UpgradeListener(t transport.Transport, list manet.Listener) t upgrader: u, transport: t, threshold: newThreshold(AcceptQueueLength), - incoming: make(chan transport.Conn), + incoming: make(chan transport.CapableConn), cancel: cancel, ctx: ctx, } @@ -49,7 +50,7 @@ func (u *Upgrader) UpgradeListener(t transport.Transport, list manet.Listener) t // UpgradeOutbound upgrades the given outbound multiaddr-net connection into a // full libp2p-transport connection. -func (u *Upgrader) UpgradeOutbound(ctx context.Context, t transport.Transport, maconn manet.Conn, p peer.ID) (transport.Conn, error) { +func (u *Upgrader) UpgradeOutbound(ctx context.Context, t transport.Transport, maconn manet.Conn, p peer.ID) (transport.CapableConn, error) { if p == "" { return nil, ErrNilPeer } @@ -58,11 +59,11 @@ func (u *Upgrader) UpgradeOutbound(ctx context.Context, t transport.Transport, m // UpgradeInbound upgrades the given inbound multiaddr-net connection into a // full libp2p-transport connection. -func (u *Upgrader) UpgradeInbound(ctx context.Context, t transport.Transport, maconn manet.Conn) (transport.Conn, error) { +func (u *Upgrader) UpgradeInbound(ctx context.Context, t transport.Transport, maconn manet.Conn) (transport.CapableConn, error) { return u.upgrade(ctx, t, maconn, "") } -func (u *Upgrader) upgrade(ctx context.Context, t transport.Transport, maconn manet.Conn, p peer.ID) (transport.Conn, error) { +func (u *Upgrader) upgrade(ctx context.Context, t transport.Transport, maconn manet.Conn, p peer.ID) (transport.CapableConn, error) { if u.Filters != nil && u.Filters.AddrBlocked(maconn.RemoteMultiaddr()) { log.Debugf("blocked connection from %s", maconn.RemoteMultiaddr()) maconn.Close() @@ -89,29 +90,29 @@ func (u *Upgrader) upgrade(ctx context.Context, t transport.Transport, maconn ma } smconn, err := u.setupMuxer(ctx, sconn, p) if err != nil { - conn.Close() + sconn.Close() return nil, fmt.Errorf("failed to negotiate security stream multiplexer: %s", err) } return &transportConn{ - Conn: smconn, + MuxedConn: smconn, ConnMultiaddrs: maconn, ConnSecurity: sconn, transport: t, }, nil } -func (u *Upgrader) setupSecurity(ctx context.Context, conn net.Conn, p peer.ID) (ss.Conn, error) { +func (u *Upgrader) setupSecurity(ctx context.Context, conn net.Conn, p peer.ID) (sec.SecureConn, error) { if p == "" { return u.Secure.SecureInbound(ctx, conn) } return u.Secure.SecureOutbound(ctx, conn, p) } -func (u *Upgrader) setupMuxer(ctx context.Context, conn net.Conn, p peer.ID) (smux.Conn, error) { +func (u *Upgrader) setupMuxer(ctx context.Context, conn net.Conn, p peer.ID) (mux.MuxedConn, error) { // TODO: The muxer should take a context. done := make(chan struct{}) - var smconn smux.Conn + var smconn mux.MuxedConn var err error go func() { defer close(done) @@ -122,6 +123,10 @@ func (u *Upgrader) setupMuxer(ctx context.Context, conn net.Conn, p peer.ID) (sm case <-done: return smconn, err case <-ctx.Done(): + // interrupt this process + conn.Close() + // wait to finish + <-done return nil, ctx.Err() } } diff --git a/vendor/github.com/libp2p/go-libp2p-transport/.travis.yml b/vendor/github.com/libp2p/go-libp2p-transport/.travis.yml deleted file mode 100644 index 4cfe98c2..00000000 --- a/vendor/github.com/libp2p/go-libp2p-transport/.travis.yml +++ /dev/null @@ -1,32 +0,0 @@ -os: - - linux - -language: go - -go: - - 1.11.x - -env: - global: - - GOTFLAGS="-race" - matrix: - - BUILD_DEPTYPE=gx - - BUILD_DEPTYPE=gomod - - -# disable travis install -install: - - true - -script: - - bash <(curl -s https://raw.githubusercontent.com/ipfs/ci-helpers/master/travis-ci/run-standard-tests.sh) - - -cache: - directories: - - $GOPATH/src/gx - - $GOPATH/pkg/mod - - $HOME/.cache/go-build - -notifications: - email: false diff --git a/vendor/github.com/libp2p/go-libp2p-transport/LICENSE b/vendor/github.com/libp2p/go-libp2p-transport/LICENSE deleted file mode 100644 index 26100332..00000000 --- a/vendor/github.com/libp2p/go-libp2p-transport/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2016 Jeromy Johnson - -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/libp2p/go-libp2p-transport/Makefile b/vendor/github.com/libp2p/go-libp2p-transport/Makefile deleted file mode 100644 index 20619413..00000000 --- a/vendor/github.com/libp2p/go-libp2p-transport/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -gx: - go get github.com/whyrusleeping/gx - go get github.com/whyrusleeping/gx-go - -deps: gx - gx --verbose install --global - gx-go rewrite - -publish: - gx-go rewrite --undo - diff --git a/vendor/github.com/libp2p/go-libp2p-transport/README.md b/vendor/github.com/libp2p/go-libp2p-transport/README.md deleted file mode 100644 index 0e9b4ce2..00000000 --- a/vendor/github.com/libp2p/go-libp2p-transport/README.md +++ /dev/null @@ -1,48 +0,0 @@ -# go-libp2p-transport - -[![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](https://protocol.ai) -[![](https://img.shields.io/badge/freenode-%23ipfs-blue.svg?style=flat-square)](https://webchat.freenode.net/?channels=%23ipfs) -[![](https://img.shields.io/badge/project-IPFS-blue.svg?style=flat-square)](https://libp2p.io/) -[![standard-readme compliant](https://img.shields.io/badge/standard--readme-OK-green.svg?style=flat-square)](https://github.com/RichardLitt/standard-readme) -[![GoDoc](https://godoc.org/github.com/libp2p/go-libp2p-transport?status.svg)](https://godoc.org/github.com/libp2p/go-libp2p-transport) -[![Coverage Status](https://img.shields.io/codecov/c/github/libp2p/go-libp2p-transport.svg?style=flat-square&branch=master)](https://codecov.io/github/libp2p/go-libp2p-transport?branch=master) -[![Build Status](https://travis-ci.org/libp2p/go-libp2p-transport.svg?branch=master)](https://travis-ci.org/libp2p/go-libp2p-transport) - -> libp2p transport code - -A common interface for network transports. - -This is the 'base' layer for any transport that wants to be used by libp2p and ipfs. If you want to make 'ipfs work over X', the first thing you'll want to do is to implement the `Transport` interface for 'X'. - -Transports are: - -* Encrypted: Connections must be end-to-end encrypted. -* Authenticated: The endpoints, RemotePeer and LocalPeer, must be authenticated. -* Multiplexed: It must be possible to multiplex multiple reliable streams over a single transport connection. - -## Install - -```sh -> gx install --global -> gx-go rewrite -``` - -## Usage - -To actually *use* a transport, you'll likely want to register it with a `transport.Network` (e.g., [go-libp2p-swarm](https://github.com/libp2p/go-libp2p-swarm)). However, you're probably more interested in *implementing* transports. - -Transports construct fully featured, encrypted, multiplexed connections. However, there's a fairly good chance your transport won't meet all of those requirements. To make life easier, we've created a helper library called [go-libp2p-transport-upgrader](https://github.com/libp2p/go-libp2p-transport-upgrader) for upgrading simple stream transports to fully-featured (encrypted, authenticated, multiplexed) transports. Check out that package's [README](https://github.com/libp2p/go-libp2p-transport-upgrader/blob/master/README.md) for an example. - -## Contribute - -Feel free to join in. All welcome. Open an [issue](https://github.com/libp2p/go-libp2p-transport/issues)! - -This repository falls under the IPFS [Code of Conduct](https://github.com/ipfs/community/blob/master/code-of-conduct.md). - -### Want to hack on IPFS? - -[![](https://cdn.rawgit.com/jbenet/contribute-ipfs-gif/master/img/contribute.gif)](https://github.com/ipfs/community/blob/master/contributing.md) - -## License - -MIT diff --git a/vendor/github.com/libp2p/go-libp2p-transport/codecov.yml b/vendor/github.com/libp2p/go-libp2p-transport/codecov.yml deleted file mode 100644 index 5f88a9ea..00000000 --- a/vendor/github.com/libp2p/go-libp2p-transport/codecov.yml +++ /dev/null @@ -1,3 +0,0 @@ -coverage: - range: "50...100" -comment: off diff --git a/vendor/github.com/libp2p/go-libp2p-transport/go.mod b/vendor/github.com/libp2p/go-libp2p-transport/go.mod deleted file mode 100644 index e9cd4566..00000000 --- a/vendor/github.com/libp2p/go-libp2p-transport/go.mod +++ /dev/null @@ -1,10 +0,0 @@ -module github.com/libp2p/go-libp2p-transport - -require ( - github.com/ipfs/go-detect-race v0.0.1 - github.com/ipfs/go-log v0.0.1 - github.com/libp2p/go-libp2p-net v0.0.1 - github.com/libp2p/go-libp2p-peer v0.0.1 - github.com/libp2p/go-stream-muxer v0.0.1 - github.com/multiformats/go-multiaddr v0.0.1 -) diff --git a/vendor/github.com/libp2p/go-libp2p-transport/go.sum b/vendor/github.com/libp2p/go-libp2p-transport/go.sum deleted file mode 100644 index 8ab21f08..00000000 --- a/vendor/github.com/libp2p/go-libp2p-transport/go.sum +++ /dev/null @@ -1,116 +0,0 @@ -github.com/AndreasBriese/bbloom v0.0.0-20180913140656-343706a395b7/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= -github.com/Kubuxu/go-os-helper v0.0.1/go.mod h1:N8B+I7vPCT80IcP58r50u4+gEEcsZETFUpAzWW2ep1Y= -github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= -github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32 h1:qkOC5Gd33k54tobS36cXdAzJbeHaduLtnLQQwNoIi78= -github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32/go.mod h1:DrZx5ec/dmnfpw9KyYoQyYo7d0KEvTkk/5M/vbZjAr8= -github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= -github.com/btcsuite/btcutil v0.0.0-20190207003914-4c204d697803/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= -github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= -github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= -github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= -github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= -github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= -github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dgraph-io/badger v1.5.5-0.20190226225317-8115aed38f8f/go.mod h1:VZxzAIRPHRVNRKRo6AXrX9BJegn6il06VMTZVJYCIjQ= -github.com/dgryski/go-farm v0.0.0-20190104051053-3adb47b1fb0f/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= -github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0= -github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/gxed/hashland/keccakpg v0.0.1 h1:wrk3uMNaMxbXiHibbPO4S0ymqJMm41WiudyFSs7UnsU= -github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfmKFJ6tItnhQ67kU= -github.com/gxed/hashland/murmur3 v0.0.1 h1:SheiaIt0sda5K+8FLz952/1iWS9zrnKsEJaOJu4ZbSc= -github.com/gxed/hashland/murmur3 v0.0.1/go.mod h1:KjXop02n4/ckmZSnY2+HKcLud/tcmvhST0bie/0lS48= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/ipfs/go-datastore v0.0.1/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= -github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk= -github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps= -github.com/ipfs/go-ds-badger v0.0.2/go.mod h1:Y3QpeSFWQf6MopLTiZD+VT6IC1yZqaGmjvRcKeSGij8= -github.com/ipfs/go-ds-leveldb v0.0.1/go.mod h1:feO8V3kubwsEF22n0YRQCffeb79OOYIykR4L04tMOYc= -github.com/ipfs/go-ipfs-delay v0.0.0-20181109222059-70721b86a9a8/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= -github.com/ipfs/go-log v0.0.1 h1:9XTUN/rW64BCG1YhPK9Hoy3q8nr4gOmHHBpgFdfw6Lc= -github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM= -github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8 h1:bspPhN+oKYFk5fcGNuQzp6IGzYQSenLEgH3s6jkXrWw= -github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8/go.mod h1:Ly/wlsjFq/qrU3Rar62tu1gASgGw6chQbSh/XgIIXCY= -github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= -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/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/libp2p/go-buffer-pool v0.0.1/go.mod h1:xtyIz9PMobb13WaxR6Zo1Pd1zXJKYg0a8KiIvDp3TzQ= -github.com/libp2p/go-libp2p-crypto v0.0.1 h1:JNQd8CmoGTohO/akqrH16ewsqZpci2CbgYH/LmYl8gw= -github.com/libp2p/go-libp2p-crypto v0.0.1/go.mod h1:yJkNyDmO341d5wwXxDUGO0LykUVT72ImHNUqh5D/dBE= -github.com/libp2p/go-libp2p-net v0.0.1 h1:xJ4Vh4yKF/XKb8fd1Ev0ebAGzVjMxXzrxG2kjtU+F5Q= -github.com/libp2p/go-libp2p-net v0.0.1/go.mod h1:Yt3zgmlsHOgUWSXmt5V/Jpz9upuJBE8EgNU9DrCcR8c= -github.com/libp2p/go-libp2p-peer v0.0.1 h1:0qwAOljzYewINrU+Kndoc+1jAL7vzY/oY2Go4DCGfyY= -github.com/libp2p/go-libp2p-peer v0.0.1/go.mod h1:nXQvOBbwVqoP+T5Y5nCjeH4sP9IX/J0AMzcDUVruVoo= -github.com/libp2p/go-libp2p-peerstore v0.0.1 h1:twKovq8YK5trLrd3nB7PD2Zu9JcyAIdm7Bz9yBWjhq8= -github.com/libp2p/go-libp2p-peerstore v0.0.1/go.mod h1:RabLyPVJLuNQ+GFyoEkfi8H4Ti6k/HtZJ7YKgtSq+20= -github.com/libp2p/go-libp2p-protocol v0.0.1 h1:+zkEmZ2yFDi5adpVE3t9dqh/N9TbpFWywowzeEzBbLM= -github.com/libp2p/go-libp2p-protocol v0.0.1/go.mod h1:Af9n4PiruirSDjHycM1QuiMi/1VZNHYcK8cLgFJLZ4s= -github.com/libp2p/go-stream-muxer v0.0.1 h1:Ce6e2Pyu+b5MC1k3eeFtAax0pW4gc6MosYSLV05UeLw= -github.com/libp2p/go-stream-muxer v0.0.1/go.mod h1:bAo8x7YkSpadMTbtTaxGVHWUQsR/l5MEaHbKaliuT14= -github.com/mattn/go-colorable v0.1.1 h1:G1f5SKeVxmagw/IyvzvtZE4Gybcc4Tr1tf7I8z0XgOg= -github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= -github.com/mattn/go-isatty v0.0.5 h1:tHXDdz1cpzGaovsTB+TVB8q90WEokoVmfMqoVcrLUgw= -github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0OXOcUbGjvZxxijuBwbbmlSxLiuofa+g= -github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= -github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16 h1:5W7KhL8HVF3XCFOweFD3BNESdnO8ewyYTFT2R+/b8FQ= -github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= -github.com/mr-tron/base58 v1.1.0 h1:Y51FGVJ91WBqCEabAi5OPUz38eAx8DakuAm5svLcsfQ= -github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= -github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= -github.com/multiformats/go-multiaddr v0.0.1 h1:/QUV3VBMDI6pi6xfiw7lr6xhDWWvQKn9udPn68kLSdY= -github.com/multiformats/go-multiaddr v0.0.1/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= -github.com/multiformats/go-multiaddr-dns v0.0.1/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= -github.com/multiformats/go-multiaddr-net v0.0.1/go.mod h1:nw6HSxNmCIQH27XPGBuX+d1tnvM7ihcFwHMSstNAVUU= -github.com/multiformats/go-multihash v0.0.1 h1:HHwN1K12I+XllBCrqKnhX949Orn4oawPkegHMu2vDqQ= -github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/opentracing/opentracing-go v1.0.2 h1:3jA2P6O1F9UOrWVpwrIo17pu01KWvNWg4X946/Y5Zwg= -github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -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/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= -github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1/go.mod h1:8UvriyWtv5Q5EOgjHaSseUEdkQfvwFv1I/In/O2M9gc= -github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc h1:9lDbC6Rz4bwmou+oE6Dt4Cb2BGMur5eR/GYptkKUVHo= -github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc/go.mod h1:bopw91TMyo8J3tvftk8xmU2kPmlrt4nScJQZU2hE5EM= -github.com/whyrusleeping/mafmt v1.2.8/go.mod h1:faQJFPbLSxzD9xpA02ttW/tS9vZykNvXwGvqIpk20FA= -golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b h1:+/WWzjwW6gidDJnMKWLKLX1gxn7irUTF1fLpQovfQ5M= -golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190227160552-c95aed5357e7 h1:C2F/nMkR/9sfUTpvR3QrjBuTdvMUC/cFajkphs1YLQo= -golang.org/x/net v0.0.0-20190227160552-c95aed5357e7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/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-20190219092855-153ac476189d/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223 h1:DH4skfRX4EBpamg7iV4ZlCpblAHI6s6TDM39bFZumv8= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/vendor/github.com/libp2p/go-libp2p-transport/package.json b/vendor/github.com/libp2p/go-libp2p-transport/package.json deleted file mode 100644 index a0b8f0db..00000000 --- a/vendor/github.com/libp2p/go-libp2p-transport/package.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "author": "whyrusleeping", - "bugs": { - "url": "https://github.com/libp2p/go-libp2p-transport" - }, - "gx": { - "dvcsimport": "github.com/libp2p/go-libp2p-transport" - }, - "gxDependencies": [ - { - "hash": "QmbkT7eMTyXfpeyB3ZMxxcxg7XH8t6uXp49jqzz4HB7BGF", - "name": "go-log", - "version": "1.5.9" - }, - { - "author": "multiformats", - "hash": "QmTZBfrPJmjWsCvHEtX5FE6KimVJhsJg5sBbqEFYf4UZtL", - "name": "go-multiaddr", - "version": "1.4.1" - }, - { - "author": "whyrusleeping", - "hash": "QmY3ArotKMKaL7YGfbQfyDrib6RVraLqZYWXZvVgZktBxp", - "name": "go-libp2p-net", - "version": "3.0.30" - }, - { - "author": "whyrusleeping", - "hash": "QmVtV1y2e8W4eQgzsP6qfSpCCZ6zWYE4m6NzJjB7iswwrT", - "name": "go-stream-muxer", - "version": "3.1.0" - }, - { - "author": "whyrusleeping", - "hash": "QmYVXrKrKHDC9FobgmcmshCDyWwdrfwfanNQN4oxJ9Fk3h", - "name": "go-libp2p-peer", - "version": "3.1.2" - }, - { - "author": "jbenet", - "hash": "Qmf7HqcW7LtCi1W8y2bdx2eJpze74jkbKqpByxgXikdbLF", - "name": "go-detect-race", - "version": "1.0.1" - } - ], - "gxVersion": "0.4.0", - "language": "go", - "license": "MIT", - "name": "go-libp2p-transport", - "releaseCmd": "git commit -a -m \"gx publish $VERSION\"", - "version": "3.0.27" -} - diff --git a/vendor/github.com/libp2p/go-stream-muxer/.gitignore b/vendor/github.com/libp2p/go-libp2p-yamux/.gitignore similarity index 100% rename from vendor/github.com/libp2p/go-stream-muxer/.gitignore rename to vendor/github.com/libp2p/go-libp2p-yamux/.gitignore diff --git a/vendor/github.com/ipfs/go-ipfs-addr/.travis.yml b/vendor/github.com/libp2p/go-libp2p-yamux/.travis.yml similarity index 89% rename from vendor/github.com/ipfs/go-ipfs-addr/.travis.yml rename to vendor/github.com/libp2p/go-libp2p-yamux/.travis.yml index 4cfe98c2..5163d693 100644 --- a/vendor/github.com/ipfs/go-ipfs-addr/.travis.yml +++ b/vendor/github.com/libp2p/go-libp2p-yamux/.travis.yml @@ -10,7 +10,6 @@ env: global: - GOTFLAGS="-race" matrix: - - BUILD_DEPTYPE=gx - BUILD_DEPTYPE=gomod @@ -24,7 +23,6 @@ script: cache: directories: - - $GOPATH/src/gx - $GOPATH/pkg/mod - $HOME/.cache/go-build diff --git a/vendor/github.com/libp2p/go-libp2p-netutil/LICENSE b/vendor/github.com/libp2p/go-libp2p-yamux/LICENSE similarity index 100% rename from vendor/github.com/libp2p/go-libp2p-netutil/LICENSE rename to vendor/github.com/libp2p/go-libp2p-yamux/LICENSE diff --git a/vendor/github.com/whyrusleeping/go-smux-multistream/Makefile b/vendor/github.com/libp2p/go-libp2p-yamux/Makefile similarity index 100% rename from vendor/github.com/whyrusleeping/go-smux-multistream/Makefile rename to vendor/github.com/libp2p/go-libp2p-yamux/Makefile diff --git a/vendor/github.com/libp2p/go-libp2p-yamux/README.md b/vendor/github.com/libp2p/go-libp2p-yamux/README.md new file mode 100644 index 00000000..46165b7c --- /dev/null +++ b/vendor/github.com/libp2p/go-libp2p-yamux/README.md @@ -0,0 +1,25 @@ +# go-libp2p-yamux + +[![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](https://protocol.ai) +[![](https://img.shields.io/badge/project-libp2p-yellow.svg?style=flat-square)](https://libp2p.io/) +[![](https://img.shields.io/badge/freenode-%23libp2p-yellow.svg?style=flat-square)](http://webchat.freenode.net/?channels=%23libp2p) +[![GoDoc](https://godoc.org/github.com/libp2p/go-libp2p-yamux?status.svg)](https://godoc.org/github.com/libp2p/go-libp2p-yamux) +[![Coverage Status](https://coveralls.io/repos/github/libp2p/go-libp2p-yamux/badge.svg?branch=master)](https://coveralls.io/github/libp2p/go-libp2p-yamux?branch=master) +[![Build Status](https://travis-ci.com/libp2p/go-libp2p-yamux.svg?branch=master)](https://travis-ci.com/libp2p/go-libp2p-yamux) +[![Discourse posts](https://img.shields.io/discourse/https/discuss.libp2p.io/posts.svg)](https://discuss.libp2p.io) + +> An adapter to integrate the yamux multiplexer into libp2p as a stream muxer. + +## Install + +```sh +go get github.com/libp2p/go-libp2p-yamux +``` + +## Usage + +Check out the [GoDocs](https://godoc.org/github.com/libp2p/go-libp2p-yamux). + +## License + +Dual-licensed under MIT and ASLv2, by way of the [Permissive License Stack](https://protocol.ai/blog/announcing-the-permissive-license-stack/). diff --git a/vendor/github.com/libp2p/go-libp2p-yamux/go.mod b/vendor/github.com/libp2p/go-libp2p-yamux/go.mod new file mode 100644 index 00000000..d935b0b4 --- /dev/null +++ b/vendor/github.com/libp2p/go-libp2p-yamux/go.mod @@ -0,0 +1,7 @@ +module github.com/libp2p/go-libp2p-yamux + +require ( + github.com/libp2p/go-libp2p-core v0.0.1 + github.com/libp2p/go-libp2p-testing v0.0.4 + github.com/libp2p/go-yamux v1.2.3 +) diff --git a/vendor/github.com/libp2p/go-libp2p-metrics/go.sum b/vendor/github.com/libp2p/go-libp2p-yamux/go.sum similarity index 71% rename from vendor/github.com/libp2p/go-libp2p-metrics/go.sum rename to vendor/github.com/libp2p/go-libp2p-yamux/go.sum index 41922ab6..d2bf1dea 100644 --- a/vendor/github.com/libp2p/go-libp2p-metrics/go.sum +++ b/vendor/github.com/libp2p/go-libp2p-yamux/go.sum @@ -1,5 +1,4 @@ github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= -github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32 h1:qkOC5Gd33k54tobS36cXdAzJbeHaduLtnLQQwNoIi78= github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32/go.mod h1:DrZx5ec/dmnfpw9KyYoQyYo7d0KEvTkk/5M/vbZjAr8= github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= github.com/btcsuite/btcutil v0.0.0-20190207003914-4c204d697803/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= @@ -8,49 +7,49 @@ github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVa github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= -github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495 h1:6IyqGr3fnd0tM3YxipK27TUskaOVUjU2nG45yzwcQKY= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/gxed/hashland/keccakpg v0.0.1 h1:wrk3uMNaMxbXiHibbPO4S0ymqJMm41WiudyFSs7UnsU= github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfmKFJ6tItnhQ67kU= -github.com/gxed/hashland/murmur3 v0.0.1 h1:SheiaIt0sda5K+8FLz952/1iWS9zrnKsEJaOJu4ZbSc= github.com/gxed/hashland/murmur3 v0.0.1/go.mod h1:KjXop02n4/ckmZSnY2+HKcLud/tcmvhST0bie/0lS48= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= +github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8/go.mod h1:Ly/wlsjFq/qrU3Rar62tu1gASgGw6chQbSh/XgIIXCY= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= -github.com/libp2p/go-flow-metrics v0.0.1 h1:0gxuFd2GuK7IIP5pKljLwps6TvcuYgvG7Atqi3INF5s= +github.com/libp2p/go-buffer-pool v0.0.2 h1:QNK2iAFa8gjAe1SPz6mHSMuCcjs+X1wlHzeOSqcmlfs= +github.com/libp2p/go-buffer-pool v0.0.2/go.mod h1:MvaB6xw5vOrDl8rYZGLFdKAuk/hRoRZd1Vi32+RXyFM= github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZxBdp967ls1g+k8= -github.com/libp2p/go-libp2p-crypto v0.0.1 h1:JNQd8CmoGTohO/akqrH16ewsqZpci2CbgYH/LmYl8gw= -github.com/libp2p/go-libp2p-crypto v0.0.1/go.mod h1:yJkNyDmO341d5wwXxDUGO0LykUVT72ImHNUqh5D/dBE= -github.com/libp2p/go-libp2p-peer v0.0.1 h1:0qwAOljzYewINrU+Kndoc+1jAL7vzY/oY2Go4DCGfyY= -github.com/libp2p/go-libp2p-peer v0.0.1/go.mod h1:nXQvOBbwVqoP+T5Y5nCjeH4sP9IX/J0AMzcDUVruVoo= -github.com/libp2p/go-libp2p-protocol v0.0.1 h1:+zkEmZ2yFDi5adpVE3t9dqh/N9TbpFWywowzeEzBbLM= -github.com/libp2p/go-libp2p-protocol v0.0.1/go.mod h1:Af9n4PiruirSDjHycM1QuiMi/1VZNHYcK8cLgFJLZ4s= -github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0OXOcUbGjvZxxijuBwbbmlSxLiuofa+g= +github.com/libp2p/go-libp2p-core v0.0.1 h1:HSTZtFIq/W5Ue43Zw+uWZyy2Vl5WtF0zDjKN8/DT/1I= +github.com/libp2p/go-libp2p-core v0.0.1/go.mod h1:g/VxnTZ/1ygHxH3dKok7Vno1VfpvGcGip57wjTU4fco= +github.com/libp2p/go-libp2p-testing v0.0.4 h1:Qev57UR47GcLPXWjrunv5aLIQGO4n9mhI/8/EIrEEFc= +github.com/libp2p/go-libp2p-testing v0.0.4/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= +github.com/libp2p/go-yamux v1.2.3 h1:xX8A36vpXb59frIzWFdEgptLMsOANMFq2K7fPRlunYI= +github.com/libp2p/go-yamux v1.2.3/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= -github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16 h1:5W7KhL8HVF3XCFOweFD3BNESdnO8ewyYTFT2R+/b8FQ= github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= -github.com/mr-tron/base58 v1.1.0 h1:Y51FGVJ91WBqCEabAi5OPUz38eAx8DakuAm5svLcsfQ= github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= -github.com/multiformats/go-multihash v0.0.1 h1:HHwN1K12I+XllBCrqKnhX949Orn4oawPkegHMu2vDqQ= +github.com/mr-tron/base58 v1.1.1/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= +github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= +github.com/multiformats/go-multiaddr v0.0.2/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= +github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs= github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a/go.mod h1:7AyxJNCJ7SBZ1MfVQCWD6Uqo2oubI2Eq2y2eqf+A5r0= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572/go.mod h1:w0SWMsp6j9O/dk4/ZpIhL+3CkG8ofA2vuv7k+ltqUMc= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b h1:+/WWzjwW6gidDJnMKWLKLX1gxn7irUTF1fLpQovfQ5M= golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/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-20190219092855-153ac476189d h1:Z0Ahzd7HltpJtjAHHxX8QFP3j1yYgiuvjbjRzDj/KH0= golang.org/x/sys v0.0.0-20190219092855-153ac476189d/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= diff --git a/vendor/github.com/whyrusleeping/go-smux-yamux/package.json b/vendor/github.com/libp2p/go-libp2p-yamux/package.json similarity index 96% rename from vendor/github.com/whyrusleeping/go-smux-yamux/package.json rename to vendor/github.com/libp2p/go-libp2p-yamux/package.json index e227012c..72c6f64b 100644 --- a/vendor/github.com/whyrusleeping/go-smux-yamux/package.json +++ b/vendor/github.com/libp2p/go-libp2p-yamux/package.json @@ -25,6 +25,6 @@ "license": "", "name": "go-smux-yamux", "releaseCmd": "git commit -a -m \"gx publish $VERSION\"", - "version": "2.0.9" + "version": "2.0.10" } diff --git a/vendor/github.com/whyrusleeping/go-smux-yamux/yamux.go b/vendor/github.com/libp2p/go-libp2p-yamux/yamux.go similarity index 58% rename from vendor/github.com/whyrusleeping/go-smux-yamux/yamux.go rename to vendor/github.com/libp2p/go-libp2p-yamux/yamux.go index 12212eeb..4875761c 100644 --- a/vendor/github.com/whyrusleeping/go-smux-yamux/yamux.go +++ b/vendor/github.com/libp2p/go-libp2p-yamux/yamux.go @@ -3,10 +3,9 @@ package sm_yamux import ( "io/ioutil" "net" - "time" - smux "github.com/libp2p/go-stream-muxer" - yamux "github.com/whyrusleeping/yamux" + mux "github.com/libp2p/go-libp2p-core/mux" + yamux "github.com/libp2p/go-yamux" ) // Conn is a connection to a remote peer. @@ -25,7 +24,7 @@ func (c *conn) IsClosed() bool { } // OpenStream creates a new stream. -func (c *conn) OpenStream() (smux.Stream, error) { +func (c *conn) OpenStream() (mux.MuxedStream, error) { s, err := c.yamuxSession().OpenStream() if err != nil { return nil, err @@ -35,7 +34,7 @@ func (c *conn) OpenStream() (smux.Stream, error) { } // AcceptStream accepts a stream opened by the other side. -func (c *conn) AcceptStream() (smux.Stream, error) { +func (c *conn) AcceptStream() (mux.MuxedStream, error) { s, err := c.yamuxSession().AcceptStream() return s, err } @@ -44,22 +43,25 @@ func (c *conn) AcceptStream() (smux.Stream, error) { // yamux-backed connections. type Transport yamux.Config -// DefaultTransport has default settings for yamux -var DefaultTransport = (*Transport)(&yamux.Config{ - AcceptBacklog: 256, // from yamux.DefaultConfig - EnableKeepAlive: true, // from yamux.DefaultConfig - KeepAliveInterval: 30 * time.Second, // from yamux.DefaultConfig - ConnectionWriteTimeout: 10 * time.Second, // from yamux.DefaultConfig - // We've bumped this to 1MiB as this critically limits throughput. +var DefaultTransport *Transport + +func init() { + config := yamux.DefaultConfig() + // We've bumped this to 16MiB as this critically limits throughput. // // 1MiB means a best case of 10MiB/s (83.89Mbps) on a connection with // 100ms latency. The default gave us 2.4MiB *best case* which was // totally unacceptable. - MaxStreamWindowSize: uint32(1024 * 1024), - LogOutput: ioutil.Discard, -}) + config.MaxStreamWindowSize = uint32(16 * 1024 * 1024) + // don't spam + config.LogOutput = ioutil.Discard + // We always run over a security transport that buffers internally + // (i.e., uses a block cipher). + config.ReadBufSize = 0 + DefaultTransport = (*Transport)(config) +} -func (t *Transport) NewConn(nc net.Conn, isServer bool) (smux.Conn, error) { +func (t *Transport) NewConn(nc net.Conn, isServer bool) (mux.MuxedConn, error) { var s *yamux.Session var err error if isServer { diff --git a/vendor/github.com/libp2p/go-libp2p/config/config.go b/vendor/github.com/libp2p/go-libp2p/config/config.go index 79b04420..3bb51bf1 100644 --- a/vendor/github.com/libp2p/go-libp2p/config/config.go +++ b/vendor/github.com/libp2p/go-libp2p/config/config.go @@ -4,24 +4,26 @@ import ( "context" "fmt" + "github.com/libp2p/go-libp2p-core/connmgr" + "github.com/libp2p/go-libp2p-core/crypto" + "github.com/libp2p/go-libp2p-core/host" + "github.com/libp2p/go-libp2p-core/metrics" + "github.com/libp2p/go-libp2p-core/network" + "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p-core/peerstore" + "github.com/libp2p/go-libp2p-core/pnet" + "github.com/libp2p/go-libp2p-core/routing" + bhost "github.com/libp2p/go-libp2p/p2p/host/basic" relay "github.com/libp2p/go-libp2p/p2p/host/relay" routed "github.com/libp2p/go-libp2p/p2p/host/routed" - logging "github.com/ipfs/go-log" circuit "github.com/libp2p/go-libp2p-circuit" - crypto "github.com/libp2p/go-libp2p-crypto" discovery "github.com/libp2p/go-libp2p-discovery" - host "github.com/libp2p/go-libp2p-host" - ifconnmgr "github.com/libp2p/go-libp2p-interface-connmgr" - pnet "github.com/libp2p/go-libp2p-interface-pnet" - metrics "github.com/libp2p/go-libp2p-metrics" - inet "github.com/libp2p/go-libp2p-net" - peer "github.com/libp2p/go-libp2p-peer" - pstore "github.com/libp2p/go-libp2p-peerstore" - routing "github.com/libp2p/go-libp2p-routing" swarm "github.com/libp2p/go-libp2p-swarm" tptu "github.com/libp2p/go-libp2p-transport-upgrader" + + logging "github.com/ipfs/go-log" filter "github.com/libp2p/go-maddr-filter" ma "github.com/multiformats/go-multiaddr" ) @@ -33,7 +35,7 @@ var log = logging.Logger("p2p-config") type AddrsFactory = bhost.AddrsFactory // NATManagerC is a NATManager constructor. -type NATManagerC func(inet.Network) bhost.NATManager +type NATManagerC func(network.Network) bhost.NATManager type RoutingC func(host.Host) (routing.PeerRouting, error) @@ -58,9 +60,9 @@ type Config struct { AddrsFactory bhost.AddrsFactory Filters *filter.Filters - ConnManager ifconnmgr.ConnManager + ConnManager connmgr.ConnManager NATManager NATManagerC - Peerstore pstore.Peerstore + Peerstore peerstore.Peerstore Reporter metrics.Reporter DisablePing bool diff --git a/vendor/github.com/libp2p/go-libp2p/config/constructor_types.go b/vendor/github.com/libp2p/go-libp2p/config/constructor_types.go index 0cf4163f..6f58c266 100644 --- a/vendor/github.com/libp2p/go-libp2p/config/constructor_types.go +++ b/vendor/github.com/libp2p/go-libp2p/config/constructor_types.go @@ -4,30 +4,31 @@ import ( "fmt" "reflect" - security "github.com/libp2p/go-conn-security" - crypto "github.com/libp2p/go-libp2p-crypto" - host "github.com/libp2p/go-libp2p-host" - pnet "github.com/libp2p/go-libp2p-interface-pnet" - inet "github.com/libp2p/go-libp2p-net" - peer "github.com/libp2p/go-libp2p-peer" - pstore "github.com/libp2p/go-libp2p-peerstore" - transport "github.com/libp2p/go-libp2p-transport" + "github.com/libp2p/go-libp2p-core/crypto" + "github.com/libp2p/go-libp2p-core/host" + "github.com/libp2p/go-libp2p-core/mux" + "github.com/libp2p/go-libp2p-core/network" + "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p-core/peerstore" + "github.com/libp2p/go-libp2p-core/pnet" + "github.com/libp2p/go-libp2p-core/sec" + "github.com/libp2p/go-libp2p-core/transport" + tptu "github.com/libp2p/go-libp2p-transport-upgrader" filter "github.com/libp2p/go-maddr-filter" - mux "github.com/libp2p/go-stream-muxer" ) var ( // interfaces hostType = reflect.TypeOf((*host.Host)(nil)).Elem() - networkType = reflect.TypeOf((*inet.Network)(nil)).Elem() + networkType = reflect.TypeOf((*network.Network)(nil)).Elem() transportType = reflect.TypeOf((*transport.Transport)(nil)).Elem() - muxType = reflect.TypeOf((*mux.Transport)(nil)).Elem() - securityType = reflect.TypeOf((*security.Transport)(nil)).Elem() + muxType = reflect.TypeOf((*mux.Multiplexer)(nil)).Elem() + securityType = reflect.TypeOf((*sec.SecureTransport)(nil)).Elem() protectorType = reflect.TypeOf((*pnet.Protector)(nil)).Elem() privKeyType = reflect.TypeOf((*crypto.PrivKey)(nil)).Elem() pubKeyType = reflect.TypeOf((*crypto.PubKey)(nil)).Elem() - pstoreType = reflect.TypeOf((*pstore.Peerstore)(nil)).Elem() + pstoreType = reflect.TypeOf((*peerstore.Peerstore)(nil)).Elem() // concrete types peerIDType = reflect.TypeOf((peer.ID)("")) diff --git a/vendor/github.com/libp2p/go-libp2p/config/muxer.go b/vendor/github.com/libp2p/go-libp2p/config/muxer.go index ee2adeb0..6f99336c 100644 --- a/vendor/github.com/libp2p/go-libp2p/config/muxer.go +++ b/vendor/github.com/libp2p/go-libp2p/config/muxer.go @@ -3,13 +3,13 @@ package config import ( "fmt" - host "github.com/libp2p/go-libp2p-host" - mux "github.com/libp2p/go-stream-muxer" - msmux "github.com/whyrusleeping/go-smux-multistream" + "github.com/libp2p/go-libp2p-core/host" + "github.com/libp2p/go-libp2p-core/mux" + msmux "github.com/libp2p/go-stream-muxer-multistream" ) // MuxC is a stream multiplex transport constructor -type MuxC func(h host.Host) (mux.Transport, error) +type MuxC func(h host.Host) (mux.Multiplexer, error) // MsMuxC is a tuple containing a multiplex transport constructor and a protocol // ID. @@ -24,8 +24,8 @@ var muxArgTypes = newArgTypeSet(hostType, networkType, peerIDType, pstoreType) // using reflection. func MuxerConstructor(m interface{}) (MuxC, error) { // Already constructed? - if t, ok := m.(mux.Transport); ok { - return func(_ host.Host) (mux.Transport, error) { + if t, ok := m.(mux.Multiplexer); ok { + return func(_ host.Host) (mux.Multiplexer, error) { return t, nil }, nil } @@ -34,16 +34,16 @@ func MuxerConstructor(m interface{}) (MuxC, error) { if err != nil { return nil, err } - return func(h host.Host) (mux.Transport, error) { + return func(h host.Host) (mux.Multiplexer, error) { t, err := ctor(h, nil) if err != nil { return nil, err } - return t.(mux.Transport), nil + return t.(mux.Multiplexer), nil }, nil } -func makeMuxer(h host.Host, tpts []MsMuxC) (mux.Transport, error) { +func makeMuxer(h host.Host, tpts []MsMuxC) (mux.Multiplexer, error) { muxMuxer := msmux.NewBlankTransport() transportSet := make(map[string]struct{}, len(tpts)) for _, tptC := range tpts { diff --git a/vendor/github.com/libp2p/go-libp2p/config/reflection_magic.go b/vendor/github.com/libp2p/go-libp2p/config/reflection_magic.go index d66a26e2..b422cf71 100644 --- a/vendor/github.com/libp2p/go-libp2p/config/reflection_magic.go +++ b/vendor/github.com/libp2p/go-libp2p/config/reflection_magic.go @@ -5,7 +5,7 @@ import ( "reflect" "runtime" - host "github.com/libp2p/go-libp2p-host" + "github.com/libp2p/go-libp2p-core/host" tptu "github.com/libp2p/go-libp2p-transport-upgrader" ) diff --git a/vendor/github.com/libp2p/go-libp2p/config/security.go b/vendor/github.com/libp2p/go-libp2p/config/security.go index 2798fda8..8e1c710c 100644 --- a/vendor/github.com/libp2p/go-libp2p/config/security.go +++ b/vendor/github.com/libp2p/go-libp2p/config/security.go @@ -3,15 +3,16 @@ package config import ( "fmt" - security "github.com/libp2p/go-conn-security" + "github.com/libp2p/go-libp2p-core/host" + "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p-core/sec" + "github.com/libp2p/go-libp2p-core/sec/insecure" + csms "github.com/libp2p/go-conn-security-multistream" - insecure "github.com/libp2p/go-conn-security/insecure" - host "github.com/libp2p/go-libp2p-host" - peer "github.com/libp2p/go-libp2p-peer" ) // SecC is a security transport constructor -type SecC func(h host.Host) (security.Transport, error) +type SecC func(h host.Host) (sec.SecureTransport, error) // MsSecC is a tuple containing a security transport constructor and a protocol // ID. @@ -27,34 +28,34 @@ var securityArgTypes = newArgTypeSet( // SecurityConstructor creates a security constructor from the passed parameter // using reflection. -func SecurityConstructor(sec interface{}) (SecC, error) { +func SecurityConstructor(security interface{}) (SecC, error) { // Already constructed? - if t, ok := sec.(security.Transport); ok { - return func(_ host.Host) (security.Transport, error) { + if t, ok := security.(sec.SecureTransport); ok { + return func(_ host.Host) (sec.SecureTransport, error) { return t, nil }, nil } - ctor, err := makeConstructor(sec, securityType, securityArgTypes) + ctor, err := makeConstructor(security, securityType, securityArgTypes) if err != nil { return nil, err } - return func(h host.Host) (security.Transport, error) { + return func(h host.Host) (sec.SecureTransport, error) { t, err := ctor(h, nil) if err != nil { return nil, err } - return t.(security.Transport), nil + return t.(sec.SecureTransport), nil }, nil } -func makeInsecureTransport(id peer.ID) security.Transport { +func makeInsecureTransport(id peer.ID) sec.SecureTransport { secMuxer := new(csms.SSMuxer) secMuxer.AddTransport(insecure.ID, insecure.New(id)) return secMuxer } -func makeSecurityTransport(h host.Host, tpts []MsSecC) (security.Transport, error) { +func makeSecurityTransport(h host.Host, tpts []MsSecC) (sec.SecureTransport, error) { secMuxer := new(csms.SSMuxer) transportSet := make(map[string]struct{}, len(tpts)) for _, tptC := range tpts { diff --git a/vendor/github.com/libp2p/go-libp2p/config/transport.go b/vendor/github.com/libp2p/go-libp2p/config/transport.go index d9b4414d..ac8f8ee7 100644 --- a/vendor/github.com/libp2p/go-libp2p/config/transport.go +++ b/vendor/github.com/libp2p/go-libp2p/config/transport.go @@ -1,8 +1,9 @@ package config import ( - host "github.com/libp2p/go-libp2p-host" - transport "github.com/libp2p/go-libp2p-transport" + "github.com/libp2p/go-libp2p-core/host" + "github.com/libp2p/go-libp2p-core/transport" + tptu "github.com/libp2p/go-libp2p-transport-upgrader" ) diff --git a/vendor/github.com/libp2p/go-libp2p/defaults.go b/vendor/github.com/libp2p/go-libp2p/defaults.go index 679fd7af..18de400d 100644 --- a/vendor/github.com/libp2p/go-libp2p/defaults.go +++ b/vendor/github.com/libp2p/go-libp2p/defaults.go @@ -5,14 +5,14 @@ package libp2p import ( "crypto/rand" - crypto "github.com/libp2p/go-libp2p-crypto" + crypto "github.com/libp2p/go-libp2p-core/crypto" + mplex "github.com/libp2p/go-libp2p-mplex" pstoremem "github.com/libp2p/go-libp2p-peerstore/pstoremem" secio "github.com/libp2p/go-libp2p-secio" + yamux "github.com/libp2p/go-libp2p-yamux" tcp "github.com/libp2p/go-tcp-transport" ws "github.com/libp2p/go-ws-transport" multiaddr "github.com/multiformats/go-multiaddr" - mplex "github.com/whyrusleeping/go-smux-multiplex" - yamux "github.com/whyrusleeping/go-smux-yamux" ) // DefaultSecurity is the default security option. diff --git a/vendor/github.com/libp2p/go-libp2p/go.mod b/vendor/github.com/libp2p/go-libp2p/go.mod index 8bd4be5b..d951ad3a 100644 --- a/vendor/github.com/libp2p/go-libp2p/go.mod +++ b/vendor/github.com/libp2p/go-libp2p/go.mod @@ -2,46 +2,36 @@ module github.com/libp2p/go-libp2p require ( github.com/gogo/protobuf v1.2.1 - github.com/ipfs/go-cid v0.0.1 + github.com/ipfs/go-cid v0.0.2 github.com/ipfs/go-detect-race v0.0.1 github.com/ipfs/go-ipfs-util v0.0.1 github.com/ipfs/go-log v0.0.1 - github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8 - github.com/libp2p/go-conn-security v0.0.1 - github.com/libp2p/go-conn-security-multistream v0.0.1 - github.com/libp2p/go-libp2p-autonat v0.0.4 - github.com/libp2p/go-libp2p-blankhost v0.0.1 - github.com/libp2p/go-libp2p-circuit v0.0.4 - github.com/libp2p/go-libp2p-crypto v0.0.1 - github.com/libp2p/go-libp2p-discovery v0.0.2 - github.com/libp2p/go-libp2p-host v0.0.1 - github.com/libp2p/go-libp2p-interface-connmgr v0.0.1 - github.com/libp2p/go-libp2p-interface-pnet v0.0.1 - github.com/libp2p/go-libp2p-loggables v0.0.1 - github.com/libp2p/go-libp2p-metrics v0.0.1 + github.com/jbenet/go-cienv v0.1.0 + github.com/jbenet/goprocess v0.1.3 + github.com/libp2p/go-conn-security-multistream v0.1.0 + github.com/libp2p/go-libp2p-autonat v0.1.0 + github.com/libp2p/go-libp2p-blankhost v0.1.1 + github.com/libp2p/go-libp2p-circuit v0.1.0 + github.com/libp2p/go-libp2p-core v0.0.1 + github.com/libp2p/go-libp2p-discovery v0.1.0 + github.com/libp2p/go-libp2p-loggables v0.1.0 + github.com/libp2p/go-libp2p-mplex v0.2.1 github.com/libp2p/go-libp2p-nat v0.0.4 - github.com/libp2p/go-libp2p-net v0.0.2 - github.com/libp2p/go-libp2p-netutil v0.0.1 - github.com/libp2p/go-libp2p-peer v0.0.1 - github.com/libp2p/go-libp2p-peerstore v0.0.2 - github.com/libp2p/go-libp2p-protocol v0.0.1 - github.com/libp2p/go-libp2p-routing v0.0.1 - github.com/libp2p/go-libp2p-secio v0.0.2 - github.com/libp2p/go-libp2p-swarm v0.0.2 - github.com/libp2p/go-libp2p-transport v0.0.4 - github.com/libp2p/go-libp2p-transport-upgrader v0.0.1 - github.com/libp2p/go-maddr-filter v0.0.1 - github.com/libp2p/go-stream-muxer v0.0.1 - github.com/libp2p/go-tcp-transport v0.0.2 - github.com/libp2p/go-testutil v0.0.1 - github.com/libp2p/go-ws-transport v0.0.2 - github.com/miekg/dns v1.1.4 // indirect - github.com/multiformats/go-multiaddr v0.0.1 + github.com/libp2p/go-libp2p-netutil v0.1.0 + github.com/libp2p/go-libp2p-peerstore v0.1.0 + github.com/libp2p/go-libp2p-secio v0.1.0 + github.com/libp2p/go-libp2p-swarm v0.1.0 + github.com/libp2p/go-libp2p-testing v0.0.4 + github.com/libp2p/go-libp2p-transport-upgrader v0.1.1 + github.com/libp2p/go-libp2p-yamux v0.2.1 + github.com/libp2p/go-maddr-filter v0.0.4 + github.com/libp2p/go-stream-muxer-multistream v0.2.0 + github.com/libp2p/go-tcp-transport v0.1.0 + github.com/libp2p/go-ws-transport v0.1.0 + github.com/miekg/dns v1.1.12 // indirect + github.com/multiformats/go-multiaddr v0.0.4 github.com/multiformats/go-multiaddr-dns v0.0.2 github.com/multiformats/go-multiaddr-net v0.0.1 - github.com/multiformats/go-multistream v0.0.1 - github.com/whyrusleeping/go-smux-multiplex v3.0.16+incompatible - github.com/whyrusleeping/go-smux-multistream v2.0.2+incompatible - github.com/whyrusleeping/go-smux-yamux v2.0.9+incompatible + github.com/multiformats/go-multistream v0.1.0 github.com/whyrusleeping/mdns v0.0.0-20180901202407-ef14215e6b30 ) diff --git a/vendor/github.com/libp2p/go-libp2p/go.sum b/vendor/github.com/libp2p/go-libp2p/go.sum index 0526379e..47c9026c 100644 --- a/vendor/github.com/libp2p/go-libp2p/go.sum +++ b/vendor/github.com/libp2p/go-libp2p/go.sum @@ -10,8 +10,8 @@ github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVa github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= -github.com/coreos/go-semver v0.2.0 h1:3Jm3tLmsgAYcjC+4Up7hJrFBPr+n7rAqYeSw/SZazuY= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -35,18 +35,15 @@ github.com/gxed/hashland/keccakpg v0.0.1 h1:wrk3uMNaMxbXiHibbPO4S0ymqJMm41WiudyF github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfmKFJ6tItnhQ67kU= github.com/gxed/hashland/murmur3 v0.0.1 h1:SheiaIt0sda5K+8FLz952/1iWS9zrnKsEJaOJu4ZbSc= github.com/gxed/hashland/murmur3 v0.0.1/go.mod h1:KjXop02n4/ckmZSnY2+HKcLud/tcmvhST0bie/0lS48= -github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-multierror v1.0.0 h1:iVjPR7a6H0tWELX5NxNe7bYopibicUzc7uPribsnS6o= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= github.com/hashicorp/golang-lru v0.5.1/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 v1.0.0 h1:wg75sLpL6DZqwHQN6E1Cfk6mtfzS45z8OV+ic+DtHRo= github.com/huin/goupnp v1.0.0/go.mod h1:n9v9KO1tAxYH82qOn+UTIFQDmx5n1Zxd/ClZDMX7Bnc= github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= -github.com/ipfs/go-cid v0.0.1 h1:GBjWPktLnNyX0JiQCNFpUuUSoMw5KMyqrsejHYlILBE= github.com/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= +github.com/ipfs/go-cid v0.0.2 h1:tuuKaZPU1M6HcejsO3AcYWW8sZ8MTvyxfc4uqB4eFE8= +github.com/ipfs/go-cid v0.0.2/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= github.com/ipfs/go-datastore v0.0.1/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk= github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps= @@ -61,12 +58,14 @@ github.com/jackpal/gateway v1.0.5 h1:qzXWUJfuMdlLMtt0a3Dgt+xkWQiA5itDEITVJtuSwMc github.com/jackpal/gateway v1.0.5/go.mod h1:lTpwd4ACLXmpyiCTRtfiNyVnUmqT9RivzCDQetPfnjA= github.com/jackpal/go-nat-pmp v1.0.1 h1:i0LektDkO1QlrTm/cSuP+PyBCDnYvjPLGl4LdWEMiaA= github.com/jackpal/go-nat-pmp v1.0.1/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= -github.com/jbenet/go-cienv v0.0.0-20150120210510-1bb1476777ec h1:DQqZhhDvrTrEQ3Qod5yfavcA064e53xlQ+xajiorXgM= github.com/jbenet/go-cienv v0.0.0-20150120210510-1bb1476777ec/go.mod h1:rGaEvXB4uRSZMmzKNLoXvTu1sfx+1kv/DojUlPrSZGs= +github.com/jbenet/go-cienv v0.1.0 h1:Vc/s0QbQtoxX8MwwSLWWh+xNNZvM3Lw7NsTcHrvvhMc= +github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA= github.com/jbenet/go-temp-err-catcher v0.0.0-20150120210811-aac704a3f4f2 h1:vhC1OXXiT9R2pczegwz6moDvuRpggaroAXhPIseh57A= github.com/jbenet/go-temp-err-catcher v0.0.0-20150120210811-aac704a3f4f2/go.mod h1:8GXXJV31xl8whumTzdZsTt3RnUIiPqzkyf7mxToRCMs= -github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8 h1:bspPhN+oKYFk5fcGNuQzp6IGzYQSenLEgH3s6jkXrWw= github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8/go.mod h1:Ly/wlsjFq/qrU3Rar62tu1gASgGw6chQbSh/XgIIXCY= +github.com/jbenet/goprocess v0.1.3 h1:YKyIEECS/XvcfHtBzxtjBBbWK+MbvA6dG8ASiqwvr10= +github.com/jbenet/goprocess v0.1.3/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= @@ -81,129 +80,136 @@ 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/libp2p/go-addr-util v0.0.1 h1:TpTQm9cXVRVSKsYbgQ7GKc3KbbHVTnbostgGaDEP+88= github.com/libp2p/go-addr-util v0.0.1/go.mod h1:4ac6O7n9rIAKB1dnd+s8IbbMXkt+oBpzX4/+RACcnlQ= -github.com/libp2p/go-buffer-pool v0.0.1 h1:9Rrn/H46cXjaA2HQ5Y8lyhOS1NhTkZ4yuEs2r3Eechg= github.com/libp2p/go-buffer-pool v0.0.1/go.mod h1:xtyIz9PMobb13WaxR6Zo1Pd1zXJKYg0a8KiIvDp3TzQ= -github.com/libp2p/go-conn-security v0.0.1 h1:4kMMrqrt9EUNCNjX1xagSJC+bq16uqjMe9lk1KBMVNs= -github.com/libp2p/go-conn-security v0.0.1/go.mod h1:bGmu51N0KU9IEjX7kl2PQjgZa40JQWnayTvNMgD/vyk= -github.com/libp2p/go-conn-security-multistream v0.0.1 h1:XefjAQRHcnUaxKb26RGupToucx3uU4ecbOZ3aACXlDU= -github.com/libp2p/go-conn-security-multistream v0.0.1/go.mod h1:nc9vud7inQ+d6SO0I/6dSWrdMnHnzZNHeyUQqrAJulE= +github.com/libp2p/go-buffer-pool v0.0.2 h1:QNK2iAFa8gjAe1SPz6mHSMuCcjs+X1wlHzeOSqcmlfs= +github.com/libp2p/go-buffer-pool v0.0.2/go.mod h1:MvaB6xw5vOrDl8rYZGLFdKAuk/hRoRZd1Vi32+RXyFM= +github.com/libp2p/go-conn-security-multistream v0.1.0 h1:aqGmto+ttL/uJgX0JtQI0tD21CIEy5eYd1Hlp0juHY0= +github.com/libp2p/go-conn-security-multistream v0.1.0/go.mod h1:aw6eD7LOsHEX7+2hJkDxw1MteijaVcI+/eP2/x3J1xc= github.com/libp2p/go-flow-metrics v0.0.1 h1:0gxuFd2GuK7IIP5pKljLwps6TvcuYgvG7Atqi3INF5s= github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZxBdp967ls1g+k8= -github.com/libp2p/go-libp2p-autonat v0.0.4 h1:cZzdB9KW1ZkHnSjLCB6aFNw47XS4r+SecCVMuVB1xgo= -github.com/libp2p/go-libp2p-autonat v0.0.4/go.mod h1:fs71q5Xk+pdnKU014o2iq1RhMs9/PMaG5zXRFNnIIT4= -github.com/libp2p/go-libp2p-blankhost v0.0.1 h1:/mZuuiwntNR8RywnCFlGHLKrKLYne+qciBpQXWqp5fk= -github.com/libp2p/go-libp2p-blankhost v0.0.1/go.mod h1:Ibpbw/7cPPYwFb7PACIWdvxxv0t0XCCI10t7czjAjTc= -github.com/libp2p/go-libp2p-circuit v0.0.4 h1:yOgEadnSVFj3e9KLBuLG+edqCImeav0VXxXvcimpOUQ= -github.com/libp2p/go-libp2p-circuit v0.0.4/go.mod h1:p1cHJnB9xnX5/1vZLkXgKwmNEOQQuF/Hp+SkATXnXYk= -github.com/libp2p/go-libp2p-crypto v0.0.1 h1:JNQd8CmoGTohO/akqrH16ewsqZpci2CbgYH/LmYl8gw= -github.com/libp2p/go-libp2p-crypto v0.0.1/go.mod h1:yJkNyDmO341d5wwXxDUGO0LykUVT72ImHNUqh5D/dBE= -github.com/libp2p/go-libp2p-discovery v0.0.2 h1:Rf+20nsFcCnHo4Kxvf8ofAft75+fW+cXy9FonNVyU/g= -github.com/libp2p/go-libp2p-discovery v0.0.2/go.mod h1:ZkkF9xIFRLA1xCc7bstYFkd80gBGK8Fc1JqGoU2i+zI= -github.com/libp2p/go-libp2p-host v0.0.1 h1:dnqusU+DheGcdxrE718kG4XgHNuL2n9eEv8Rg5zy8hQ= -github.com/libp2p/go-libp2p-host v0.0.1/go.mod h1:qWd+H1yuU0m5CwzAkvbSjqKairayEHdR5MMl7Cwa7Go= -github.com/libp2p/go-libp2p-interface-connmgr v0.0.1 h1:Q9EkNSLAOF+u90L88qmE9z/fTdjLh8OsJwGw74mkwk4= -github.com/libp2p/go-libp2p-interface-connmgr v0.0.1/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k= -github.com/libp2p/go-libp2p-interface-pnet v0.0.1 h1:7GnzRrBTJHEsofi1ahFdPN9Si6skwXQE9UqR2S+Pkh8= -github.com/libp2p/go-libp2p-interface-pnet v0.0.1/go.mod h1:el9jHpQAXK5dnTpKA4yfCNBZXvrzdOU75zz+C6ryp3k= -github.com/libp2p/go-libp2p-loggables v0.0.1 h1:HVww9oAnINIxbt69LJNkxD8lnbfgteXR97Xm4p3l9ps= -github.com/libp2p/go-libp2p-loggables v0.0.1/go.mod h1:lDipDlBNYbpyqyPX/KcoO+eq0sJYEVR2JgOexcivchg= -github.com/libp2p/go-libp2p-metrics v0.0.1 h1:yumdPC/P2VzINdmcKZd0pciSUCpou+s0lwYCjBbzQZU= -github.com/libp2p/go-libp2p-metrics v0.0.1/go.mod h1:jQJ95SXXA/K1VZi13h52WZMa9ja78zjyy5rspMsC/08= +github.com/libp2p/go-libp2p-autonat v0.1.0 h1:aCWAu43Ri4nU0ZPO7NyLzUvvfqd0nE3dX0R/ZGYVgOU= +github.com/libp2p/go-libp2p-autonat v0.1.0/go.mod h1:1tLf2yXxiE/oKGtDwPYWTSYG3PtvYlJmg7NeVtPRqH8= +github.com/libp2p/go-libp2p-blankhost v0.1.1 h1:X919sCh+KLqJcNRApj43xCSiQRYqOSI88Fdf55ngf78= +github.com/libp2p/go-libp2p-blankhost v0.1.1/go.mod h1:pf2fvdLJPsC1FsVrNP3DUUvMzUts2dsLLBEpo1vW1ro= +github.com/libp2p/go-libp2p-circuit v0.1.0 h1:eniLL3Y9aq/sryfyV1IAHj5rlvuyj3b7iz8tSiZpdhY= +github.com/libp2p/go-libp2p-circuit v0.1.0/go.mod h1:Ahq4cY3V9VJcHcn1SBXjr78AbFkZeIRmfunbA7pmFh8= +github.com/libp2p/go-libp2p-core v0.0.1 h1:HSTZtFIq/W5Ue43Zw+uWZyy2Vl5WtF0zDjKN8/DT/1I= +github.com/libp2p/go-libp2p-core v0.0.1/go.mod h1:g/VxnTZ/1ygHxH3dKok7Vno1VfpvGcGip57wjTU4fco= +github.com/libp2p/go-libp2p-crypto v0.1.0 h1:k9MFy+o2zGDNGsaoZl0MA3iZ75qXxr9OOoAZF+sD5OQ= +github.com/libp2p/go-libp2p-crypto v0.1.0/go.mod h1:sPUokVISZiy+nNuTTH/TY+leRSxnFj/2GLjtOTW90hI= +github.com/libp2p/go-libp2p-discovery v0.1.0 h1:j+R6cokKcGbnZLf4kcNwpx6mDEUPF3N6SrqMymQhmvs= +github.com/libp2p/go-libp2p-discovery v0.1.0/go.mod h1:4F/x+aldVHjHDHuX85x1zWoFTGElt8HnoDzwkFZm29g= +github.com/libp2p/go-libp2p-loggables v0.1.0 h1:h3w8QFfCt2UJl/0/NW4K829HX/0S4KD31PQ7m8UXXO8= +github.com/libp2p/go-libp2p-loggables v0.1.0/go.mod h1:EyumB2Y6PrYjr55Q3/tiJ/o3xoDasoRYM7nOzEpoa90= +github.com/libp2p/go-libp2p-mplex v0.2.0/go.mod h1:Ejl9IyjvXJ0T9iqUTE1jpYATQ9NM3g+OtR+EMMODbKo= +github.com/libp2p/go-libp2p-mplex v0.2.1 h1:E1xaJBQnbSiTHGI1gaBKmKhu1TUKkErKJnE8iGvirYI= +github.com/libp2p/go-libp2p-mplex v0.2.1/go.mod h1:SC99Rxs8Vuzrf/6WhmH41kNn13TiYdAWNYHrwImKLnE= github.com/libp2p/go-libp2p-nat v0.0.4 h1:+KXK324yaY701On8a0aGjTnw8467kW3ExKcqW2wwmyw= github.com/libp2p/go-libp2p-nat v0.0.4/go.mod h1:N9Js/zVtAXqaeT99cXgTV9e75KpnWCvVOiGzlcHmBbY= -github.com/libp2p/go-libp2p-net v0.0.1 h1:xJ4Vh4yKF/XKb8fd1Ev0ebAGzVjMxXzrxG2kjtU+F5Q= -github.com/libp2p/go-libp2p-net v0.0.1/go.mod h1:Yt3zgmlsHOgUWSXmt5V/Jpz9upuJBE8EgNU9DrCcR8c= -github.com/libp2p/go-libp2p-net v0.0.2 h1:qP06u4TYXfl7uW/hzqPhlVVTSA2nw1B/bHBJaUnbh6M= -github.com/libp2p/go-libp2p-net v0.0.2/go.mod h1:Yt3zgmlsHOgUWSXmt5V/Jpz9upuJBE8EgNU9DrCcR8c= -github.com/libp2p/go-libp2p-netutil v0.0.1 h1:LgD6+skofkOx8z6odD9+MZHKjupv3ng1u6KRhaADTnA= -github.com/libp2p/go-libp2p-netutil v0.0.1/go.mod h1:GdusFvujWZI9Vt0X5BKqwWWmZFxecf9Gt03cKxm2f/Q= -github.com/libp2p/go-libp2p-peer v0.0.1 h1:0qwAOljzYewINrU+Kndoc+1jAL7vzY/oY2Go4DCGfyY= -github.com/libp2p/go-libp2p-peer v0.0.1/go.mod h1:nXQvOBbwVqoP+T5Y5nCjeH4sP9IX/J0AMzcDUVruVoo= -github.com/libp2p/go-libp2p-peerstore v0.0.1 h1:twKovq8YK5trLrd3nB7PD2Zu9JcyAIdm7Bz9yBWjhq8= -github.com/libp2p/go-libp2p-peerstore v0.0.1/go.mod h1:RabLyPVJLuNQ+GFyoEkfi8H4Ti6k/HtZJ7YKgtSq+20= -github.com/libp2p/go-libp2p-peerstore v0.0.2 h1:Lirt3A1Oq11jszJ4SPNBo8chNv61UWXE538KUEGxTVk= -github.com/libp2p/go-libp2p-peerstore v0.0.2/go.mod h1:RabLyPVJLuNQ+GFyoEkfi8H4Ti6k/HtZJ7YKgtSq+20= -github.com/libp2p/go-libp2p-protocol v0.0.1 h1:+zkEmZ2yFDi5adpVE3t9dqh/N9TbpFWywowzeEzBbLM= -github.com/libp2p/go-libp2p-protocol v0.0.1/go.mod h1:Af9n4PiruirSDjHycM1QuiMi/1VZNHYcK8cLgFJLZ4s= -github.com/libp2p/go-libp2p-routing v0.0.1 h1:hPMAWktf9rYi3ME4MG48qE7dq1ofJxiQbfdvpNntjhc= -github.com/libp2p/go-libp2p-routing v0.0.1/go.mod h1:N51q3yTr4Zdr7V8Jt2JIktVU+3xBBylx1MZeVA6t1Ys= -github.com/libp2p/go-libp2p-secio v0.0.1 h1:CqE/RdsizOwItdgLe632iyft/w0tshDLmZGAiKDcUAI= -github.com/libp2p/go-libp2p-secio v0.0.1/go.mod h1:IdG6iQybdcYmbTzxp4J5dwtUEDTOvZrT0opIDVNPrJs= -github.com/libp2p/go-libp2p-secio v0.0.2 h1:P8Sv1aAQ9bdLb58T4T7kUC1kXsPovdUFhUSmVy4z3oM= -github.com/libp2p/go-libp2p-secio v0.0.2/go.mod h1:hS7HQ00MgLhRO/Wyu1bTX6ctJKhVpm+j2/S2A5UqYb0= -github.com/libp2p/go-libp2p-swarm v0.0.1 h1:Vne+hjaDwXqzgNwQ2vb2YKbnbOTyXjtS47stT66Apc4= -github.com/libp2p/go-libp2p-swarm v0.0.1/go.mod h1:mh+KZxkbd3lQnveQ3j2q60BM1Cw2mX36XXQqwfPOShs= -github.com/libp2p/go-libp2p-swarm v0.0.2 h1:cpHHXTeU2IgUu8LPemF7vaLPGtVC6VxMoll2EwqlC+E= -github.com/libp2p/go-libp2p-swarm v0.0.2/go.mod h1:n0cAAcKyndIrJWctQwjqXlAdIPBZzfdpBjx1SSvz30g= -github.com/libp2p/go-libp2p-transport v0.0.1/go.mod h1:UzbUs9X+PHOSw7S3ZmeOxfnwaQY5vGDzZmKPod3N3tk= -github.com/libp2p/go-libp2p-transport v0.0.4 h1:/CPHQMN75/IQwkhBxxIo6p6PtL3rwFZtlzBROT3e8mw= -github.com/libp2p/go-libp2p-transport v0.0.4/go.mod h1:StoY3sx6IqsP6XKoabsPnHCwqKXWUMWU7Rfcsubee/A= -github.com/libp2p/go-libp2p-transport-upgrader v0.0.1 h1:rNtXkY6dty46mxYOHHAZQchI7gQdJStF683FhVnei/k= -github.com/libp2p/go-libp2p-transport-upgrader v0.0.1/go.mod h1:NJpUAgQab/8K6K0m+JmZCe5RUXG10UMEx4kWe9Ipj5c= -github.com/libp2p/go-maddr-filter v0.0.1 h1:apvYTg0aIxxQyBX+XHKOR+0+lYhGs1Yv+JmTH9nyl5I= -github.com/libp2p/go-maddr-filter v0.0.1/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= -github.com/libp2p/go-mplex v0.0.1 h1:dn2XGSrUxLtz3/8u85bGrwhUEKPX8MOF3lpmcWBZCWc= -github.com/libp2p/go-mplex v0.0.1/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0= -github.com/libp2p/go-msgio v0.0.1 h1:znj97n5FtXGCLDwe9x8jpHmY770SW4WStBGcCDh6GJw= -github.com/libp2p/go-msgio v0.0.1/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= +github.com/libp2p/go-libp2p-netutil v0.1.0 h1:zscYDNVEcGxyUpMd0JReUZTrpMfia8PmLKcKF72EAMQ= +github.com/libp2p/go-libp2p-netutil v0.1.0/go.mod h1:3Qv/aDqtMLTUyQeundkKsA+YCThNdbQD54k3TqjpbFU= +github.com/libp2p/go-libp2p-peer v0.2.0 h1:EQ8kMjaCUwt/Y5uLgjT8iY2qg0mGUT0N1zUjer50DsY= +github.com/libp2p/go-libp2p-peer v0.2.0/go.mod h1:RCffaCvUyW2CJmG2gAWVqwePwW7JMgxjsHm7+J5kjWY= +github.com/libp2p/go-libp2p-peerstore v0.1.0 h1:MKh7pRNPHSh1fLPj8u/M/s/napdmeNpoi9BRy9lPN0E= +github.com/libp2p/go-libp2p-peerstore v0.1.0/go.mod h1:2CeHkQsr8svp4fZ+Oi9ykN1HBb6u0MOvdJ7YIsmcwtY= +github.com/libp2p/go-libp2p-secio v0.1.0 h1:NNP5KLxuP97sE5Bu3iuwOWyT/dKEGMN5zSLMWdB7GTQ= +github.com/libp2p/go-libp2p-secio v0.1.0/go.mod h1:tMJo2w7h3+wN4pgU2LSYeiKPrfqBgkOsdiKK77hE7c8= +github.com/libp2p/go-libp2p-swarm v0.1.0 h1:HrFk2p0awrGEgch9JXK/qp/hfjqQfgNxpLWnCiWPg5s= +github.com/libp2p/go-libp2p-swarm v0.1.0/go.mod h1:wQVsCdjsuZoc730CgOvh5ox6K8evllckjebkdiY5ta4= +github.com/libp2p/go-libp2p-testing v0.0.2/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= +github.com/libp2p/go-libp2p-testing v0.0.3 h1:bdij4bKaaND7tCsaXVjRfYkMpvoOeKj9AVQGJllA6jM= +github.com/libp2p/go-libp2p-testing v0.0.3/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= +github.com/libp2p/go-libp2p-testing v0.0.4 h1:Qev57UR47GcLPXWjrunv5aLIQGO4n9mhI/8/EIrEEFc= +github.com/libp2p/go-libp2p-testing v0.0.4/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= +github.com/libp2p/go-libp2p-transport-upgrader v0.1.1 h1:PZMS9lhjK9VytzMCW3tWHAXtKXmlURSc3ZdvwEcKCzw= +github.com/libp2p/go-libp2p-transport-upgrader v0.1.1/go.mod h1:IEtA6or8JUbsV07qPW4r01GnTenLW4oi3lOPbUMGJJA= +github.com/libp2p/go-libp2p-yamux v0.2.0 h1:TSPZ5cMMz/wdoYsye/wU1TE4G3LDGMoeEN0xgnCKU/I= +github.com/libp2p/go-libp2p-yamux v0.2.0/go.mod h1:Db2gU+XfLpm6E4rG5uGCFX6uXA8MEXOxFcRoXUODaK8= +github.com/libp2p/go-libp2p-yamux v0.2.1 h1:Q3XYNiKCC2vIxrvUJL+Jg1kiyeEaIDNKLjgEjo3VQdI= +github.com/libp2p/go-libp2p-yamux v0.2.1/go.mod h1:1FBXiHDk1VyRM1C0aez2bCfHQ4vMZKkAQzZbkSQt5fI= +github.com/libp2p/go-maddr-filter v0.0.4 h1:hx8HIuuwk34KePddrp2mM5ivgPkZ09JH4AvsALRbFUs= +github.com/libp2p/go-maddr-filter v0.0.4/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= +github.com/libp2p/go-mplex v0.0.3/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0= +github.com/libp2p/go-mplex v0.1.0 h1:/nBTy5+1yRyY82YaO6HXQRnO5IAGsXTjEJaR3LdTPc0= +github.com/libp2p/go-mplex v0.1.0/go.mod h1:SXgmdki2kwCUlCCbfGLEgHjC4pFqhTp0ZoV6aiKgxDU= github.com/libp2p/go-msgio v0.0.2 h1:ivPvEKHxmVkTClHzg6RXTYHqaJQ0V9cDbq+6lKb3UV0= github.com/libp2p/go-msgio v0.0.2/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= github.com/libp2p/go-nat v0.0.3 h1:l6fKV+p0Xa354EqQOQP+d8CivdLM4kl5GxC1hSc/UeI= github.com/libp2p/go-nat v0.0.3/go.mod h1:88nUEt0k0JD45Bk93NIwDqjlhiOwOoV36GchpcVc1yI= github.com/libp2p/go-reuseport v0.0.1 h1:7PhkfH73VXfPJYKQ6JwS5I/eVcoyYi9IMNGc6FWpFLw= github.com/libp2p/go-reuseport v0.0.1/go.mod h1:jn6RmB1ufnQwl0Q1f+YxAj8isJgDCQzaaxIFYDhcYEA= -github.com/libp2p/go-reuseport-transport v0.0.1 h1:UIRneNxLDmEGNjGHpIiWzSWkZ5bhxMCP9x3Vh7BSc7E= -github.com/libp2p/go-reuseport-transport v0.0.1/go.mod h1:YkbSDrvjUVDL6b8XqriyA20obEtsW9BLkuOUyQAOCbs= github.com/libp2p/go-reuseport-transport v0.0.2 h1:WglMwyXyBu61CMkjCCtnmqNqnjib0GIEjMiHTwR/KN4= github.com/libp2p/go-reuseport-transport v0.0.2/go.mod h1:YkbSDrvjUVDL6b8XqriyA20obEtsW9BLkuOUyQAOCbs= -github.com/libp2p/go-stream-muxer v0.0.1 h1:Ce6e2Pyu+b5MC1k3eeFtAax0pW4gc6MosYSLV05UeLw= github.com/libp2p/go-stream-muxer v0.0.1/go.mod h1:bAo8x7YkSpadMTbtTaxGVHWUQsR/l5MEaHbKaliuT14= -github.com/libp2p/go-tcp-transport v0.0.1 h1:WyvJVw2lYAnr6CU+GZZ4oCt06fvORlmvBlFX2+ZpZDM= -github.com/libp2p/go-tcp-transport v0.0.1/go.mod h1:mnjg0o0O5TmXUaUIanYPUqkW4+u6mK0en8rlpA6BBTs= -github.com/libp2p/go-tcp-transport v0.0.2 h1:EzOSRaHpyrGpJ5qe+9SaxJM1mrWlkSLFfNTufUkq0lg= -github.com/libp2p/go-tcp-transport v0.0.2/go.mod h1:VjZFHasNJ0QiJQNNwiFDy25qyGWTXQWs8GM5DR4/L1k= -github.com/libp2p/go-testutil v0.0.1 h1:Xg+O0G2HIMfHqBOBDcMS1iSZJ3GEcId4qOxCQvsGZHk= -github.com/libp2p/go-testutil v0.0.1/go.mod h1:iAcJc/DKJQanJ5ws2V+u5ywdL2n12X1WbbEG+Jjy69I= -github.com/libp2p/go-ws-transport v0.0.2 h1:PtK1AoM16nm96FwPBQoq+4T4t9LdDwOhkB+mdXuGSlg= -github.com/libp2p/go-ws-transport v0.0.2/go.mod h1:p3bKjDWHEgtuKKj+2OdPYs5dAPIjtpQGHF2tJfGz7Ww= +github.com/libp2p/go-stream-muxer-multistream v0.2.0 h1:714bRJ4Zy9mdhyTLJ+ZKiROmAFwUHpeRidG+q7LTQOg= +github.com/libp2p/go-stream-muxer-multistream v0.2.0/go.mod h1:j9eyPol/LLRqT+GPLSxvimPhNph4sfYfMoDPd7HkzIc= +github.com/libp2p/go-tcp-transport v0.1.0 h1:IGhowvEqyMFknOar4FWCKSWE0zL36UFKQtiRQD60/8o= +github.com/libp2p/go-tcp-transport v0.1.0/go.mod h1:oJ8I5VXryj493DEJ7OsBieu8fcg2nHGctwtInJVpipc= +github.com/libp2p/go-ws-transport v0.1.0 h1:F+0OvvdmPTDsVc4AjPHjV7L7Pk1B7D5QwtDcKE2oag4= +github.com/libp2p/go-ws-transport v0.1.0/go.mod h1:rjw1MG1LU9YDC6gzmwObkPd/Sqwhw7yT74kj3raBFuo= +github.com/libp2p/go-yamux v1.2.2 h1:s6J6o7+ajoQMjHe7BEnq+EynOj5D2EoG8CuQgL3F2vg= +github.com/libp2p/go-yamux v1.2.2/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= +github.com/libp2p/go-yamux v1.2.3 h1:xX8A36vpXb59frIzWFdEgptLMsOANMFq2K7fPRlunYI= +github.com/libp2p/go-yamux v1.2.3/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= github.com/mattn/go-colorable v0.1.1 h1:G1f5SKeVxmagw/IyvzvtZE4Gybcc4Tr1tf7I8z0XgOg= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= github.com/mattn/go-isatty v0.0.5 h1:tHXDdz1cpzGaovsTB+TVB8q90WEokoVmfMqoVcrLUgw= github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/miekg/dns v1.1.4 h1:rCMZsU2ScVSYcAsOXgmC6+AKOK+6pmQTOcw03nfwYV0= -github.com/miekg/dns v1.1.4/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/miekg/dns v1.1.12 h1:WMhc1ik4LNkTg8U9l3hI1LvxKmIL+f1+WV/SZtCbDDA= +github.com/miekg/dns v1.1.12/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0OXOcUbGjvZxxijuBwbbmlSxLiuofa+g= github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16 h1:5W7KhL8HVF3XCFOweFD3BNESdnO8ewyYTFT2R+/b8FQ= github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= +github.com/minio/sha256-simd v0.0.0-20190328051042-05b4dd3047e5/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= +github.com/minio/sha256-simd v0.1.0 h1:U41/2erhAKcmSI14xh/ZTUdBPOzDOIfS93ibzUSl8KM= +github.com/minio/sha256-simd v0.1.0/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= github.com/mr-tron/base58 v1.1.0 h1:Y51FGVJ91WBqCEabAi5OPUz38eAx8DakuAm5svLcsfQ= github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= +github.com/mr-tron/base58 v1.1.1/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= +github.com/mr-tron/base58 v1.1.2 h1:ZEw4I2EgPKDJ2iEw0cNmLB3ROrEmkOtXIkaG7wZg+78= +github.com/mr-tron/base58 v1.1.2/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= github.com/multiformats/go-base32 v0.0.3 h1:tw5+NhuwaOjJCC5Pp82QuXbrmLzWg7uxlMFp8Nq/kkI= github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= github.com/multiformats/go-multiaddr v0.0.1 h1:/QUV3VBMDI6pi6xfiw7lr6xhDWWvQKn9udPn68kLSdY= github.com/multiformats/go-multiaddr v0.0.1/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= +github.com/multiformats/go-multiaddr v0.0.2/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= +github.com/multiformats/go-multiaddr v0.0.4 h1:WgMSI84/eRLdbptXMkMWDXPjPq7SPLIgGUVm2eroyU4= +github.com/multiformats/go-multiaddr v0.0.4/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= github.com/multiformats/go-multiaddr-dns v0.0.1/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= github.com/multiformats/go-multiaddr-dns v0.0.2 h1:/Bbsgsy3R6e3jf2qBahzNHzww6usYaZ0NhNH3sqdFS8= github.com/multiformats/go-multiaddr-dns v0.0.2/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= +github.com/multiformats/go-multiaddr-fmt v0.0.1 h1:5YjeOIzbX8OTKVaN72aOzGIYW7PnrZrnkDyOfAWRSMA= +github.com/multiformats/go-multiaddr-fmt v0.0.1/go.mod h1:aBYjqL4T/7j4Qx+R73XSv/8JsgnRFlf0w2KGLCmXl3Q= github.com/multiformats/go-multiaddr-net v0.0.1 h1:76O59E3FavvHqNg7jvzWzsPSW5JSi/ek0E4eiDVbg9g= github.com/multiformats/go-multiaddr-net v0.0.1/go.mod h1:nw6HSxNmCIQH27XPGBuX+d1tnvM7ihcFwHMSstNAVUU= github.com/multiformats/go-multibase v0.0.1 h1:PN9/v21eLywrFWdFNsFKaU04kLJzuYzmrJR+ubhT9qA= github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs= github.com/multiformats/go-multihash v0.0.1 h1:HHwN1K12I+XllBCrqKnhX949Orn4oawPkegHMu2vDqQ= github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= -github.com/multiformats/go-multistream v0.0.1 h1:JV4VfSdY9n7ECTtY59/TlSyFCzRILvYx4T4Ws8ZgihU= -github.com/multiformats/go-multistream v0.0.1/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= +github.com/multiformats/go-multihash v0.0.5 h1:1wxmCvTXAifAepIMyF39vZinRw5sbqjPs/UIi93+uik= +github.com/multiformats/go-multihash v0.0.5/go.mod h1:lt/HCbqlQwlPBz7lv0sQCdtfcMtlJvakRUn/0Ual8po= +github.com/multiformats/go-multistream v0.1.0 h1:UpO6jrsjqs46mqAK3n6wKRYFhugss9ArzbyUzU+4wkQ= +github.com/multiformats/go-multistream v0.1.0/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= 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/ginkgo v1.8.0 h1:VkHVNpR4iVnU8XQR6DBm8BqYjN7CRzw+xKUbVVbbW9w= +github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.5.0 h1:izbySO9zDPmjJ8rDjLvkA2zJHIo+HkYXHnf7eN7SSyo= +github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/opentracing/opentracing-go v1.0.2 h1:3jA2P6O1F9UOrWVpwrIo17pu01KWvNWg4X946/Y5Zwg= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= 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/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a h1:/eS3yfGjQKG+9kayBkj0ip1BGhq6zJ3eaVksphxAaek= +github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a/go.mod h1:7AyxJNCJ7SBZ1MfVQCWD6Uqo2oubI2Eq2y2eqf+A5r0= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 h1:RC6RW7j+1+HkWaX/Yh71Ee5ZHaHYt7ZP4sQgUrm6cDU= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572/go.mod h1:w0SWMsp6j9O/dk4/ZpIhL+3CkG8ofA2vuv7k+ltqUMc= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= @@ -213,39 +219,36 @@ github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc h1:9lDbC6 github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc/go.mod h1:bopw91TMyo8J3tvftk8xmU2kPmlrt4nScJQZU2hE5EM= github.com/whyrusleeping/go-notifier v0.0.0-20170827234753-097c5d47330f h1:M/lL30eFZTKnomXY6huvM6G0+gVquFNf6mxghaWlFUg= github.com/whyrusleeping/go-notifier v0.0.0-20170827234753-097c5d47330f/go.mod h1:cZNvX9cFybI01GriPRMXDtczuvUhgbcYr9iCGaNlRv8= -github.com/whyrusleeping/go-smux-multiplex v3.0.16+incompatible h1:iqksILj8STw03EJQe7Laj4ubnw+ojOyik18cd5vPL1o= -github.com/whyrusleeping/go-smux-multiplex v3.0.16+incompatible/go.mod h1:34LEDbeKFZInPUrAG+bjuJmUXONGdEFW7XL0SpTY1y4= -github.com/whyrusleeping/go-smux-multistream v2.0.2+incompatible h1:BdYHctE9HJZLquG9tpTdwWcbG4FaX6tVKPGjCGgiVxo= -github.com/whyrusleeping/go-smux-multistream v2.0.2+incompatible/go.mod h1:dRWHHvc4HDQSHh9gbKEBbUZ+f2Q8iZTPG3UOGYODxSQ= -github.com/whyrusleeping/go-smux-yamux v2.0.8+incompatible h1:IGm/UP/JpEFS6D787sZnZg7RA6fZIR9c/Ms9DeAVNuk= -github.com/whyrusleeping/go-smux-yamux v2.0.8+incompatible/go.mod h1:6qHUzBXUbB9MXmw3AUdB52L8sEb/hScCqOdW2kj/wuI= -github.com/whyrusleeping/go-smux-yamux v2.0.9+incompatible h1:nVkExQ7pYlN9e45LcqTCOiDD0904fjtm0flnHZGbXkw= -github.com/whyrusleeping/go-smux-yamux v2.0.9+incompatible/go.mod h1:6qHUzBXUbB9MXmw3AUdB52L8sEb/hScCqOdW2kj/wuI= github.com/whyrusleeping/mafmt v1.2.8 h1:TCghSl5kkwEE0j+sU/gudyhVMRlpBin8fMBBHg59EbA= github.com/whyrusleeping/mafmt v1.2.8/go.mod h1:faQJFPbLSxzD9xpA02ttW/tS9vZykNvXwGvqIpk20FA= github.com/whyrusleeping/mdns v0.0.0-20180901202407-ef14215e6b30 h1:nMCC9Pwz1pxfC1Y6mYncdk+kq8d5aLx0Q+/gyZGE44M= github.com/whyrusleeping/mdns v0.0.0-20180901202407-ef14215e6b30/go.mod h1:j4l84WPFclQPj320J9gp0XwNKBb3U0zt5CBqjPp22G4= github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7 h1:E9S12nwJwEOXe2d6gT6qxdvqMnNq+VnSsKPgm2ZZNds= github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7/go.mod h1:X2c0RVCI1eSUFI8eLcY3c0423ykwiUdxLJtkDvruhjI= -github.com/whyrusleeping/yamux v1.1.5 h1:4CK3aUUJQu0qpKZv5gEWJjNOQtdbdDhVVS6PJ+HimdE= -github.com/whyrusleeping/yamux v1.1.5/go.mod h1:E8LnQQ8HKx5KD29HZFUwM1PxCOdPRzGwur1mcYhXcD8= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67 h1:ng3VDlRp5/DHpSWl02R4rM9I+8M2rhmsuLwAMmkLQWE= golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25 h1:jsG6UpNLt9iAsb0S2AGW28DveNzzgmbXR+ENoPjUeIU= -golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f h1:R423Cnkcp5JABoeemiGEPlt9tHXFfw5kvc0yqlxRPWo= +golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190227160552-c95aed5357e7 h1:C2F/nMkR/9sfUTpvR3QrjBuTdvMUC/cFajkphs1YLQo= golang.org/x/net v0.0.0-20190227160552-c95aed5357e7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3 h1:0GoQqolDA55aaLxZyTzK/Y2ePZzZTUrRacwib7cNsYQ= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f h1:wMNYb4v58l5UBM7MYRLPG6ZhfOqbKu7X5eyFl8ZhKvA= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/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-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190219092855-153ac476189d/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223 h1:DH4skfRX4EBpamg7iV4ZlCpblAHI6s6TDM39bFZumv8= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190228124157-a34e9553db1e h1:ZytStCyV048ZqDsWHiYDdoI2Vd4msMcrDECFxS+tL9c= golang.org/x/sys v0.0.0-20190228124157-a34e9553db1e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d h1:+R4KGOnez64A81RvjARKc4UT5/tI9ujCIVX+P5KiHuI= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= diff --git a/vendor/github.com/libp2p/go-libp2p/libp2p.go b/vendor/github.com/libp2p/go-libp2p/libp2p.go index 252c9a29..32fddbdb 100644 --- a/vendor/github.com/libp2p/go-libp2p/libp2p.go +++ b/vendor/github.com/libp2p/go-libp2p/libp2p.go @@ -5,7 +5,7 @@ import ( config "github.com/libp2p/go-libp2p/config" - host "github.com/libp2p/go-libp2p-host" + "github.com/libp2p/go-libp2p-core/host" ) // Config describes a set of settings for a libp2p node diff --git a/vendor/github.com/libp2p/go-libp2p/options.go b/vendor/github.com/libp2p/go-libp2p/options.go index e98edda9..6d310f1a 100644 --- a/vendor/github.com/libp2p/go-libp2p/options.go +++ b/vendor/github.com/libp2p/go-libp2p/options.go @@ -7,15 +7,16 @@ import ( "fmt" "net" + "github.com/libp2p/go-libp2p-core/connmgr" + "github.com/libp2p/go-libp2p-core/crypto" + "github.com/libp2p/go-libp2p-core/metrics" + "github.com/libp2p/go-libp2p-core/peerstore" + "github.com/libp2p/go-libp2p-core/pnet" + + circuit "github.com/libp2p/go-libp2p-circuit" config "github.com/libp2p/go-libp2p/config" bhost "github.com/libp2p/go-libp2p/p2p/host/basic" - circuit "github.com/libp2p/go-libp2p-circuit" - crypto "github.com/libp2p/go-libp2p-crypto" - ifconnmgr "github.com/libp2p/go-libp2p-interface-connmgr" - pnet "github.com/libp2p/go-libp2p-interface-pnet" - metrics "github.com/libp2p/go-libp2p-metrics" - pstore "github.com/libp2p/go-libp2p-peerstore" filter "github.com/libp2p/go-maddr-filter" ma "github.com/multiformats/go-multiaddr" ) @@ -132,7 +133,7 @@ func Transport(tpt interface{}) Option { } // Peerstore configures libp2p to use the given peerstore. -func Peerstore(ps pstore.Peerstore) Option { +func Peerstore(ps peerstore.Peerstore) Option { return func(cfg *Config) error { if cfg.Peerstore != nil { return fmt.Errorf("cannot specify multiple peerstore options") @@ -180,7 +181,7 @@ func Identity(sk crypto.PrivKey) Option { } // ConnectionManager configures libp2p to use the given connection manager. -func ConnectionManager(connman ifconnmgr.ConnManager) Option { +func ConnectionManager(connman connmgr.ConnManager) Option { return func(cfg *Config) error { if cfg.ConnManager != nil { return fmt.Errorf("cannot specify multiple connection managers") diff --git a/vendor/github.com/libp2p/go-libp2p/p2p/discovery/mdns.go b/vendor/github.com/libp2p/go-libp2p/p2p/discovery/mdns.go index e41c175c..3476e6eb 100644 --- a/vendor/github.com/libp2p/go-libp2p/p2p/discovery/mdns.go +++ b/vendor/github.com/libp2p/go-libp2p/p2p/discovery/mdns.go @@ -8,10 +8,10 @@ import ( "sync" "time" + "github.com/libp2p/go-libp2p-core/host" + "github.com/libp2p/go-libp2p-core/peer" + logging "github.com/ipfs/go-log" - "github.com/libp2p/go-libp2p-host" - "github.com/libp2p/go-libp2p-peer" - pstore "github.com/libp2p/go-libp2p-peerstore" ma "github.com/multiformats/go-multiaddr" manet "github.com/multiformats/go-multiaddr-net" "github.com/whyrusleeping/mdns" @@ -33,7 +33,7 @@ type Service interface { } type Notifee interface { - HandlePeerFound(pstore.PeerInfo) + HandlePeerFound(peer.AddrInfo) } type mdnsService struct { @@ -173,7 +173,7 @@ func (m *mdnsService) handleEntry(e *mdns.ServiceEntry) { return } - pi := pstore.PeerInfo{ + pi := peer.AddrInfo{ ID: mpeer, Addrs: []ma.Multiaddr{maddr}, } diff --git a/vendor/github.com/libp2p/go-libp2p/p2p/host/basic/basic_host.go b/vendor/github.com/libp2p/go-libp2p/p2p/host/basic/basic_host.go index 1b11bbdc..b1d8cbcd 100644 --- a/vendor/github.com/libp2p/go-libp2p/p2p/host/basic/basic_host.go +++ b/vendor/github.com/libp2p/go-libp2p/p2p/host/basic/basic_host.go @@ -7,15 +7,19 @@ import ( "sync" "time" + "github.com/libp2p/go-libp2p-core/connmgr" + "github.com/libp2p/go-libp2p-core/host" + "github.com/libp2p/go-libp2p-core/network" + "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p-core/peerstore" + "github.com/libp2p/go-libp2p-core/protocol" + logging "github.com/ipfs/go-log" goprocess "github.com/jbenet/goprocess" goprocessctx "github.com/jbenet/goprocess/context" - ifconnmgr "github.com/libp2p/go-libp2p-interface-connmgr" + inat "github.com/libp2p/go-libp2p-nat" - inet "github.com/libp2p/go-libp2p-net" - peer "github.com/libp2p/go-libp2p-peer" - pstore "github.com/libp2p/go-libp2p-peerstore" - protocol "github.com/libp2p/go-libp2p-protocol" + identify "github.com/libp2p/go-libp2p/p2p/protocol/identify" ping "github.com/libp2p/go-libp2p/p2p/protocol/ping" ma "github.com/multiformats/go-multiaddr" @@ -58,13 +62,13 @@ const NATPortMap Option = iota // * uses an identity service to send + receive node information // * uses a nat service to establish NAT port mappings type BasicHost struct { - network inet.Network + network network.Network mux *msmux.MultistreamMuxer ids *identify.IDService pings *ping.PingService natmgr NATManager maResolver *madns.Resolver - cmgr ifconnmgr.ConnManager + cmgr connmgr.ConnManager AddrsFactory AddrsFactory @@ -78,6 +82,8 @@ type BasicHost struct { lastAddrs []ma.Multiaddr } +var _ host.Host = (*BasicHost)(nil) + // HostOpts holds options that can be passed to NewHost in order to // customize construction of the *BasicHost. type HostOpts struct { @@ -104,23 +110,27 @@ type HostOpts struct { // NATManager takes care of setting NAT port mappings, and discovering external addresses. // If omitted, this will simply be disabled. - NATManager func(inet.Network) NATManager + NATManager func(network.Network) NATManager // ConnManager is a libp2p connection manager - ConnManager ifconnmgr.ConnManager + ConnManager connmgr.ConnManager // EnablePing indicates whether to instantiate the ping service EnablePing bool } // NewHost constructs a new *BasicHost and activates it by attaching its stream and connection handlers to the given inet.Network. -func NewHost(ctx context.Context, net inet.Network, opts *HostOpts) (*BasicHost, error) { +func NewHost(ctx context.Context, net network.Network, opts *HostOpts) (*BasicHost, error) { + bgctx, cancel := context.WithCancel(ctx) + h := &BasicHost{ network: net, mux: msmux.NewMultistreamMuxer(), negtimeout: DefaultNegotiationTimeout, AddrsFactory: DefaultAddrsFactory, maResolver: madns.DefaultResolver, + ctx: bgctx, + cancel: cancel, } h.proc = goprocessctx.WithContextAndTeardown(ctx, func() error { @@ -138,7 +148,7 @@ func NewHost(ctx context.Context, net inet.Network, opts *HostOpts) (*BasicHost, h.ids = opts.IdentifyService } else { // we can't set this as a default above because it depends on the *BasicHost. - h.ids = identify.NewIDService(ctx, h) + h.ids = identify.NewIDService(bgctx, h) } if uint64(opts.NegotiationTimeout) != 0 { @@ -158,7 +168,7 @@ func NewHost(ctx context.Context, net inet.Network, opts *HostOpts) (*BasicHost, } if opts.ConnManager == nil { - h.cmgr = &ifconnmgr.NullConnMgr{} + h.cmgr = &connmgr.NullConnMgr{} } else { h.cmgr = opts.ConnManager net.Notify(h.cmgr.Notifee()) @@ -171,10 +181,6 @@ func NewHost(ctx context.Context, net inet.Network, opts *HostOpts) (*BasicHost, net.SetConnHandler(h.newConnHandler) net.SetStreamHandler(h.newStreamHandler) - bgctx, cancel := context.WithCancel(ctx) - h.ctx = bgctx - h.cancel = cancel - return h, nil } @@ -182,11 +188,11 @@ func NewHost(ctx context.Context, net inet.Network, opts *HostOpts) (*BasicHost, // The following options can be passed: // * NATPortMap // * AddrsFactory -// * ifconnmgr.ConnManager +// * connmgr.ConnManager // * madns.Resolver // // This function is deprecated in favor of NewHost and HostOpts. -func New(net inet.Network, opts ...interface{}) *BasicHost { +func New(net network.Network, opts ...interface{}) *BasicHost { hostopts := &HostOpts{} for _, o := range opts { @@ -198,7 +204,7 @@ func New(net inet.Network, opts ...interface{}) *BasicHost { } case AddrsFactory: hostopts.AddrsFactory = AddrsFactory(o) - case ifconnmgr.ConnManager: + case connmgr.ConnManager: hostopts.ConnManager = o case *madns.Resolver: hostopts.MultiaddrResolver = o @@ -221,16 +227,16 @@ func (h *BasicHost) Start() { } // newConnHandler is the remote-opened conn handler for inet.Network -func (h *BasicHost) newConnHandler(c inet.Conn) { +func (h *BasicHost) newConnHandler(c network.Conn) { // Clear protocols on connecting to new peer to avoid issues caused // by misremembering protocols between reconnects h.Peerstore().SetProtocols(c.RemotePeer()) h.ids.IdentifyConn(c) } -// newStreamHandler is the remote-opened stream handler for inet.Network +// newStreamHandler is the remote-opened stream handler for network.Network // TODO: this feels a bit wonky -func (h *BasicHost) newStreamHandler(s inet.Stream) { +func (h *BasicHost) newStreamHandler(s network.Stream) { before := time.Now() if h.negtimeout > 0 { @@ -344,17 +350,17 @@ func (h *BasicHost) ID() peer.ID { } // Peerstore returns the Host's repository of Peer Addresses and Keys. -func (h *BasicHost) Peerstore() pstore.Peerstore { +func (h *BasicHost) Peerstore() peerstore.Peerstore { return h.Network().Peerstore() } // Network returns the Network interface of the Host -func (h *BasicHost) Network() inet.Network { +func (h *BasicHost) Network() network.Network { return h.network } // Mux returns the Mux multiplexing incoming streams to protocol handlers -func (h *BasicHost) Mux() *msmux.MultistreamMuxer { +func (h *BasicHost) Mux() protocol.Switch { return h.mux } @@ -367,9 +373,9 @@ func (h *BasicHost) IDService() *identify.IDService { // This is equivalent to: // host.Mux().SetHandler(proto, handler) // (Threadsafe) -func (h *BasicHost) SetStreamHandler(pid protocol.ID, handler inet.StreamHandler) { +func (h *BasicHost) SetStreamHandler(pid protocol.ID, handler network.StreamHandler) { h.Mux().AddHandler(string(pid), func(p string, rwc io.ReadWriteCloser) error { - is := rwc.(inet.Stream) + is := rwc.(network.Stream) is.SetProtocol(protocol.ID(p)) handler(is) return nil @@ -378,9 +384,9 @@ func (h *BasicHost) SetStreamHandler(pid protocol.ID, handler inet.StreamHandler // SetStreamHandlerMatch sets the protocol handler on the Host's Mux // using a matching function to do protocol comparisons -func (h *BasicHost) SetStreamHandlerMatch(pid protocol.ID, m func(string) bool, handler inet.StreamHandler) { +func (h *BasicHost) SetStreamHandlerMatch(pid protocol.ID, m func(string) bool, handler network.StreamHandler) { h.Mux().AddHandlerWithFunc(string(pid), m, func(p string, rwc io.ReadWriteCloser) error { - is := rwc.(inet.Stream) + is := rwc.(network.Stream) is.SetProtocol(protocol.ID(p)) handler(is) return nil @@ -396,7 +402,7 @@ func (h *BasicHost) RemoveStreamHandler(pid protocol.ID) { // header with given protocol.ID. If there is no connection to p, attempts // to create one. If ProtocolID is "", writes no header. // (Threadsafe) -func (h *BasicHost) NewStream(ctx context.Context, p peer.ID, pids ...protocol.ID) (inet.Stream, error) { +func (h *BasicHost) NewStream(ctx context.Context, p peer.ID, pids ...protocol.ID) (network.Stream, error) { pref, err := h.preferredProtocol(p, pids) if err != nil { return nil, err @@ -450,7 +456,7 @@ func (h *BasicHost) preferredProtocol(p peer.ID, pids []protocol.ID) (protocol.I return out, nil } -func (h *BasicHost) newStream(ctx context.Context, p peer.ID, pid protocol.ID) (inet.Stream, error) { +func (h *BasicHost) newStream(ctx context.Context, p peer.ID, pid protocol.ID) (network.Stream, error) { s, err := h.Network().NewStream(ctx, p) if err != nil { return nil, err @@ -470,11 +476,11 @@ func (h *BasicHost) newStream(ctx context.Context, p peer.ID, pid protocol.ID) ( // h.Network.Dial, and block until a connection is open, or an error is returned. // Connect will absorb the addresses in pi into its internal peerstore. // It will also resolve any /dns4, /dns6, and /dnsaddr addresses. -func (h *BasicHost) Connect(ctx context.Context, pi pstore.PeerInfo) error { +func (h *BasicHost) Connect(ctx context.Context, pi peer.AddrInfo) error { // absorb addresses into peerstore - h.Peerstore().AddAddrs(pi.ID, pi.Addrs, pstore.TempAddrTTL) + h.Peerstore().AddAddrs(pi.ID, pi.Addrs, peerstore.TempAddrTTL) - if h.Network().Connectedness(pi.ID) == inet.Connected { + if h.Network().Connectedness(pi.ID) == network.Connected { return nil } @@ -482,12 +488,12 @@ func (h *BasicHost) Connect(ctx context.Context, pi pstore.PeerInfo) error { if err != nil { return err } - h.Peerstore().AddAddrs(pi.ID, resolved, pstore.TempAddrTTL) + h.Peerstore().AddAddrs(pi.ID, resolved, peerstore.TempAddrTTL) return h.dialPeer(ctx, pi.ID) } -func (h *BasicHost) resolveAddrs(ctx context.Context, pi pstore.PeerInfo) ([]ma.Multiaddr, error) { +func (h *BasicHost) resolveAddrs(ctx context.Context, pi peer.AddrInfo) ([]ma.Multiaddr, error) { proto := ma.ProtocolWithCode(ma.P_P2P).Name p2paddr, err := ma.NewMultiaddr("/" + proto + "/" + pi.ID.Pretty()) if err != nil { @@ -507,7 +513,7 @@ func (h *BasicHost) resolveAddrs(ctx context.Context, pi pstore.PeerInfo) ([]ma. log.Infof("error resolving %s: %s", reqaddr, err) } for _, res := range resaddrs { - pi, err := pstore.InfoFromP2pAddr(res) + pi, err := peer.AddrInfoFromP2pAddr(res) if err != nil { log.Infof("error parsing %s: %s", res, err) } @@ -549,7 +555,7 @@ func (h *BasicHost) dialPeer(ctx context.Context, p peer.ID) error { return nil } -func (h *BasicHost) ConnManager() ifconnmgr.ConnManager { +func (h *BasicHost) ConnManager() connmgr.ConnManager { return h.cmgr } @@ -719,11 +725,12 @@ func (h *BasicHost) AllAddrs() []ma.Multiaddr { // Close shuts down the Host's services (network, etc). func (h *BasicHost) Close() error { h.cancel() + h.cmgr.Close() return h.proc.Close() } type streamWrapper struct { - inet.Stream + network.Stream rw io.ReadWriter } diff --git a/vendor/github.com/libp2p/go-libp2p/p2p/host/basic/natmgr.go b/vendor/github.com/libp2p/go-libp2p/p2p/host/basic/natmgr.go index 25c8b029..c0bf96a8 100644 --- a/vendor/github.com/libp2p/go-libp2p/p2p/host/basic/natmgr.go +++ b/vendor/github.com/libp2p/go-libp2p/p2p/host/basic/natmgr.go @@ -7,8 +7,8 @@ import ( goprocess "github.com/jbenet/goprocess" goprocessctx "github.com/jbenet/goprocess/context" + "github.com/libp2p/go-libp2p-core/network" inat "github.com/libp2p/go-libp2p-nat" - inet "github.com/libp2p/go-libp2p-net" ma "github.com/multiformats/go-multiaddr" ) @@ -26,7 +26,7 @@ type NATManager interface { } // Create a NAT manager. -func NewNATManager(net inet.Network) NATManager { +func NewNATManager(net network.Network) NATManager { return newNatManager(net) } @@ -37,7 +37,7 @@ func NewNATManager(net inet.Network) NATManager { // as the network signals Listen() or ListenClose(). // * closing the natManager closes the nat and its mappings. type natManager struct { - net inet.Network + net network.Network natmu sync.RWMutex nat *inat.NAT @@ -48,7 +48,7 @@ type natManager struct { proc goprocess.Process // natManager has a process + children. can be closed. } -func newNatManager(net inet.Network) *natManager { +func newNatManager(net network.Network) *natManager { nmgr := &natManager{ net: net, ready: make(chan struct{}), @@ -229,15 +229,15 @@ func (nn *nmgrNetNotifiee) natManager() *natManager { return (*natManager)(nn) } -func (nn *nmgrNetNotifiee) Listen(n inet.Network, addr ma.Multiaddr) { +func (nn *nmgrNetNotifiee) Listen(n network.Network, addr ma.Multiaddr) { nn.natManager().sync() } -func (nn *nmgrNetNotifiee) ListenClose(n inet.Network, addr ma.Multiaddr) { +func (nn *nmgrNetNotifiee) ListenClose(n network.Network, addr ma.Multiaddr) { nn.natManager().sync() } -func (nn *nmgrNetNotifiee) Connected(inet.Network, inet.Conn) {} -func (nn *nmgrNetNotifiee) Disconnected(inet.Network, inet.Conn) {} -func (nn *nmgrNetNotifiee) OpenedStream(inet.Network, inet.Stream) {} -func (nn *nmgrNetNotifiee) ClosedStream(inet.Network, inet.Stream) {} +func (nn *nmgrNetNotifiee) Connected(network.Network, network.Conn) {} +func (nn *nmgrNetNotifiee) Disconnected(network.Network, network.Conn) {} +func (nn *nmgrNetNotifiee) OpenedStream(network.Network, network.Stream) {} +func (nn *nmgrNetNotifiee) ClosedStream(network.Network, network.Stream) {} diff --git a/vendor/github.com/libp2p/go-libp2p/p2p/host/relay/autorelay.go b/vendor/github.com/libp2p/go-libp2p/p2p/host/relay/autorelay.go index 11fc436f..ac381ac6 100644 --- a/vendor/github.com/libp2p/go-libp2p/p2p/host/relay/autorelay.go +++ b/vendor/github.com/libp2p/go-libp2p/p2p/host/relay/autorelay.go @@ -7,15 +7,15 @@ import ( "sync" "time" - basic "github.com/libp2p/go-libp2p/p2p/host/basic" + "github.com/libp2p/go-libp2p-core/network" + "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p-core/routing" autonat "github.com/libp2p/go-libp2p-autonat" _ "github.com/libp2p/go-libp2p-circuit" discovery "github.com/libp2p/go-libp2p-discovery" - inet "github.com/libp2p/go-libp2p-net" - peer "github.com/libp2p/go-libp2p-peer" - pstore "github.com/libp2p/go-libp2p-peerstore" - routing "github.com/libp2p/go-libp2p-routing" + basic "github.com/libp2p/go-libp2p/p2p/host/basic" + ma "github.com/multiformats/go-multiaddr" manet "github.com/multiformats/go-multiaddr-net" ) @@ -188,7 +188,7 @@ func (ar *AutoRelay) usingRelay(p peer.ID) bool { // addRelay adds the given relay to our set of relays. // returns true when we add a new relay -func (ar *AutoRelay) tryRelay(ctx context.Context, pi pstore.PeerInfo) bool { +func (ar *AutoRelay) tryRelay(ctx context.Context, pi peer.AddrInfo) bool { if ar.usingRelay(pi.ID) { return false } @@ -201,7 +201,7 @@ func (ar *AutoRelay) tryRelay(ctx context.Context, pi pstore.PeerInfo) bool { defer ar.mx.Unlock() // make sure we're still connected. - if ar.host.Network().Connectedness(pi.ID) != inet.Connected { + if ar.host.Network().Connectedness(pi.ID) != network.Connected { return false } ar.relays[pi.ID] = struct{}{} @@ -209,7 +209,7 @@ func (ar *AutoRelay) tryRelay(ctx context.Context, pi pstore.PeerInfo) bool { return true } -func (ar *AutoRelay) connect(ctx context.Context, pi pstore.PeerInfo) bool { +func (ar *AutoRelay) connect(ctx context.Context, pi peer.AddrInfo) bool { ctx, cancel := context.WithTimeout(ctx, 60*time.Second) defer cancel() @@ -233,13 +233,13 @@ func (ar *AutoRelay) connect(ctx context.Context, pi pstore.PeerInfo) bool { return true } -func (ar *AutoRelay) discoverRelays(ctx context.Context) ([]pstore.PeerInfo, error) { +func (ar *AutoRelay) discoverRelays(ctx context.Context) ([]peer.AddrInfo, error) { ctx, cancel := context.WithTimeout(ctx, 30*time.Second) defer cancel() - return discovery.FindPeers(ctx, ar.discover, RelayRendezvous, 1000) + return discovery.FindPeers(ctx, ar.discover, RelayRendezvous, discovery.Limit(1000)) } -func (ar *AutoRelay) selectRelays(ctx context.Context, pis []pstore.PeerInfo) []pstore.PeerInfo { +func (ar *AutoRelay) selectRelays(ctx context.Context, pis []peer.AddrInfo) []peer.AddrInfo { // TODO better relay selection strategy; this just selects random relays // but we should probably use ping latency as the selection metric @@ -296,7 +296,7 @@ func (ar *AutoRelay) relayAddrs(addrs []ma.Multiaddr) []ma.Multiaddr { return raddrs } -func shuffleRelays(pis []pstore.PeerInfo) { +func shuffleRelays(pis []peer.AddrInfo) { for i := range pis { j := rand.Intn(i + 1) pis[i], pis[j] = pis[j], pis[i] @@ -304,17 +304,17 @@ func shuffleRelays(pis []pstore.PeerInfo) { } // Notifee -func (ar *AutoRelay) Listen(inet.Network, ma.Multiaddr) {} -func (ar *AutoRelay) ListenClose(inet.Network, ma.Multiaddr) {} -func (ar *AutoRelay) Connected(inet.Network, inet.Conn) {} +func (ar *AutoRelay) Listen(network.Network, ma.Multiaddr) {} +func (ar *AutoRelay) ListenClose(network.Network, ma.Multiaddr) {} +func (ar *AutoRelay) Connected(network.Network, network.Conn) {} -func (ar *AutoRelay) Disconnected(net inet.Network, c inet.Conn) { +func (ar *AutoRelay) Disconnected(net network.Network, c network.Conn) { p := c.RemotePeer() ar.mx.Lock() defer ar.mx.Unlock() - if ar.host.Network().Connectedness(p) == inet.Connected { + if ar.host.Network().Connectedness(p) == network.Connected { // We have a second connection. return } @@ -328,5 +328,5 @@ func (ar *AutoRelay) Disconnected(net inet.Network, c inet.Conn) { } } -func (ar *AutoRelay) OpenedStream(inet.Network, inet.Stream) {} -func (ar *AutoRelay) ClosedStream(inet.Network, inet.Stream) {} +func (ar *AutoRelay) OpenedStream(network.Network, network.Stream) {} +func (ar *AutoRelay) ClosedStream(network.Network, network.Stream) {} diff --git a/vendor/github.com/libp2p/go-libp2p/p2p/host/relay/relay.go b/vendor/github.com/libp2p/go-libp2p/p2p/host/relay/relay.go index 2adea8fc..f72b74ff 100644 --- a/vendor/github.com/libp2p/go-libp2p/p2p/host/relay/relay.go +++ b/vendor/github.com/libp2p/go-libp2p/p2p/host/relay/relay.go @@ -4,13 +4,15 @@ import ( "context" "time" - discovery "github.com/libp2p/go-libp2p-discovery" + "github.com/libp2p/go-libp2p-discovery" + ma "github.com/multiformats/go-multiaddr" ) var ( // this is purposefully long to require some node stability before advertising as a relay AdvertiseBootDelay = 15 * time.Minute + AdvertiseTTL = 30 * time.Minute ) // Advertise advertises this node as a libp2p relay. @@ -18,7 +20,7 @@ func Advertise(ctx context.Context, advertise discovery.Advertiser) { go func() { select { case <-time.After(AdvertiseBootDelay): - discovery.Advertise(ctx, advertise, RelayRendezvous) + discovery.Advertise(ctx, advertise, RelayRendezvous, discovery.TTL(AdvertiseTTL)) case <-ctx.Done(): } }() diff --git a/vendor/github.com/libp2p/go-libp2p/p2p/host/routed/routed.go b/vendor/github.com/libp2p/go-libp2p/p2p/host/routed/routed.go index e5b2e40d..1282020b 100644 --- a/vendor/github.com/libp2p/go-libp2p/p2p/host/routed/routed.go +++ b/vendor/github.com/libp2p/go-libp2p/p2p/host/routed/routed.go @@ -5,18 +5,18 @@ import ( "fmt" "time" - host "github.com/libp2p/go-libp2p-host" + "github.com/libp2p/go-libp2p-core/connmgr" + "github.com/libp2p/go-libp2p-core/host" + "github.com/libp2p/go-libp2p-core/network" + "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p-core/peerstore" + "github.com/libp2p/go-libp2p-core/protocol" logging "github.com/ipfs/go-log" circuit "github.com/libp2p/go-libp2p-circuit" - ifconnmgr "github.com/libp2p/go-libp2p-interface-connmgr" lgbl "github.com/libp2p/go-libp2p-loggables" - inet "github.com/libp2p/go-libp2p-net" - peer "github.com/libp2p/go-libp2p-peer" - pstore "github.com/libp2p/go-libp2p-peerstore" - protocol "github.com/libp2p/go-libp2p-protocol" + ma "github.com/multiformats/go-multiaddr" - msmux "github.com/multiformats/go-multistream" ) var log = logging.Logger("routedhost") @@ -34,7 +34,7 @@ type RoutedHost struct { } type Routing interface { - FindPeer(context.Context, peer.ID) (pstore.PeerInfo, error) + FindPeer(context.Context, peer.ID) (peer.AddrInfo, error) } func Wrap(h host.Host, r Routing) *RoutedHost { @@ -46,15 +46,15 @@ func Wrap(h host.Host, r Routing) *RoutedHost { // // RoutedHost's Connect differs in that if the host has no addresses for a // given peer, it will use its routing system to try to find some. -func (rh *RoutedHost) Connect(ctx context.Context, pi pstore.PeerInfo) error { +func (rh *RoutedHost) Connect(ctx context.Context, pi peer.AddrInfo) error { // first, check if we're already connected. - if rh.Network().Connectedness(pi.ID) == inet.Connected { + if rh.Network().Connectedness(pi.ID) == network.Connected { return nil } // if we were given some addresses, keep + use them. if len(pi.Addrs) > 0 { - rh.Peerstore().AddAddrs(pi.ID, pi.Addrs, pstore.TempAddrTTL) + rh.Peerstore().AddAddrs(pi.ID, pi.Addrs, peerstore.TempAddrTTL) } // Check if we have some addresses in our recent memory. @@ -102,7 +102,7 @@ func (rh *RoutedHost) Connect(ctx context.Context, pi pstore.PeerInfo) error { continue } - rh.Peerstore().AddAddrs(relayID, relayAddrs, pstore.TempAddrTTL) + rh.Peerstore().AddAddrs(relayID, relayAddrs, peerstore.TempAddrTTL) } // if we're here, we got some addrs. let's use our wrapped host to connect. @@ -137,7 +137,7 @@ func (rh *RoutedHost) ID() peer.ID { return rh.host.ID() } -func (rh *RoutedHost) Peerstore() pstore.Peerstore { +func (rh *RoutedHost) Peerstore() peerstore.Peerstore { return rh.host.Peerstore() } @@ -145,19 +145,19 @@ func (rh *RoutedHost) Addrs() []ma.Multiaddr { return rh.host.Addrs() } -func (rh *RoutedHost) Network() inet.Network { +func (rh *RoutedHost) Network() network.Network { return rh.host.Network() } -func (rh *RoutedHost) Mux() *msmux.MultistreamMuxer { +func (rh *RoutedHost) Mux() protocol.Switch { return rh.host.Mux() } -func (rh *RoutedHost) SetStreamHandler(pid protocol.ID, handler inet.StreamHandler) { +func (rh *RoutedHost) SetStreamHandler(pid protocol.ID, handler network.StreamHandler) { rh.host.SetStreamHandler(pid, handler) } -func (rh *RoutedHost) SetStreamHandlerMatch(pid protocol.ID, m func(string) bool, handler inet.StreamHandler) { +func (rh *RoutedHost) SetStreamHandlerMatch(pid protocol.ID, m func(string) bool, handler network.StreamHandler) { rh.host.SetStreamHandlerMatch(pid, m, handler) } @@ -165,13 +165,13 @@ func (rh *RoutedHost) RemoveStreamHandler(pid protocol.ID) { rh.host.RemoveStreamHandler(pid) } -func (rh *RoutedHost) NewStream(ctx context.Context, p peer.ID, pids ...protocol.ID) (inet.Stream, error) { +func (rh *RoutedHost) NewStream(ctx context.Context, p peer.ID, pids ...protocol.ID) (network.Stream, error) { // Ensure we have a connection, with peer addresses resolved by the routing system (#207) // It is not sufficient to let the underlying host connect, it will most likely not have // any addresses for the peer without any prior connections. // If the caller wants to prevent the host from dialing, it should use the NoDial option. - if nodial, _ := inet.GetNoDial(ctx); !nodial { - err := rh.Connect(ctx, pstore.PeerInfo{ID: p}) + if nodial, _ := network.GetNoDial(ctx); !nodial { + err := rh.Connect(ctx, peer.AddrInfo{ID: p}) if err != nil { return nil, err } @@ -183,7 +183,7 @@ func (rh *RoutedHost) Close() error { // no need to close IpfsRouting. we dont own it. return rh.host.Close() } -func (rh *RoutedHost) ConnManager() ifconnmgr.ConnManager { +func (rh *RoutedHost) ConnManager() connmgr.ConnManager { return rh.host.ConnManager() } diff --git a/vendor/github.com/libp2p/go-libp2p/p2p/net/mock/interface.go b/vendor/github.com/libp2p/go-libp2p/p2p/net/mock/interface.go deleted file mode 100644 index e62fc4d7..00000000 --- a/vendor/github.com/libp2p/go-libp2p/p2p/net/mock/interface.go +++ /dev/null @@ -1,105 +0,0 @@ -// Package mocknet provides a mock net.Network to test with. -// -// - a Mocknet has many inet.Networks -// - a Mocknet has many Links -// - a Link joins two inet.Networks -// - inet.Conns and inet.Streams are created by inet.Networks -package mocknet - -import ( - "io" - "time" - - host "github.com/libp2p/go-libp2p-host" - - ic "github.com/libp2p/go-libp2p-crypto" - inet "github.com/libp2p/go-libp2p-net" - peer "github.com/libp2p/go-libp2p-peer" - pstore "github.com/libp2p/go-libp2p-peerstore" - ma "github.com/multiformats/go-multiaddr" -) - -type Mocknet interface { - - // GenPeer generates a peer and its inet.Network in the Mocknet - GenPeer() (host.Host, error) - - // AddPeer adds an existing peer. we need both a privkey and addr. - // ID is derived from PrivKey - AddPeer(ic.PrivKey, ma.Multiaddr) (host.Host, error) - AddPeerWithPeerstore(peer.ID, pstore.Peerstore) (host.Host, error) - - // retrieve things (with randomized iteration order) - Peers() []peer.ID - Net(peer.ID) inet.Network - Nets() []inet.Network - Host(peer.ID) host.Host - Hosts() []host.Host - Links() LinkMap - LinksBetweenPeers(a, b peer.ID) []Link - LinksBetweenNets(a, b inet.Network) []Link - - // Links are the **ability to connect**. - // think of Links as the physical medium. - // For p1 and p2 to connect, a link must exist between them. - // (this makes it possible to test dial failures, and - // things like relaying traffic) - LinkPeers(peer.ID, peer.ID) (Link, error) - LinkNets(inet.Network, inet.Network) (Link, error) - Unlink(Link) error - UnlinkPeers(peer.ID, peer.ID) error - UnlinkNets(inet.Network, inet.Network) error - - // LinkDefaults are the default options that govern links - // if they do not have thier own option set. - SetLinkDefaults(LinkOptions) - LinkDefaults() LinkOptions - - // Connections are the usual. Connecting means Dialing. - // **to succeed, peers must be linked beforehand** - ConnectPeers(peer.ID, peer.ID) (inet.Conn, error) - ConnectNets(inet.Network, inet.Network) (inet.Conn, error) - DisconnectPeers(peer.ID, peer.ID) error - DisconnectNets(inet.Network, inet.Network) error - LinkAll() error - ConnectAllButSelf() error -} - -// LinkOptions are used to change aspects of the links. -// Sorry but they dont work yet :( -type LinkOptions struct { - Latency time.Duration - Bandwidth float64 // in bytes-per-second - // we can make these values distributions down the road. -} - -// Link represents the **possibility** of a connection between -// two peers. Think of it like physical network links. Without -// them, the peers can try and try but they won't be able to -// connect. This allows constructing topologies where specific -// nodes cannot talk to each other directly. :) -type Link interface { - Networks() []inet.Network - Peers() []peer.ID - - SetOptions(LinkOptions) - Options() LinkOptions - - // Metrics() Metrics -} - -// LinkMap is a 3D map to give us an easy way to track links. -// (wow, much map. so data structure. how compose. ahhh pointer) -type LinkMap map[string]map[string]map[Link]struct{} - -// Printer lets you inspect things :) -type Printer interface { - // MocknetLinks shows the entire Mocknet's link table :) - MocknetLinks(mn Mocknet) - NetworkConns(ni inet.Network) -} - -// PrinterTo returns a Printer ready to write to w. -func PrinterTo(w io.Writer) Printer { - return &printer{w} -} diff --git a/vendor/github.com/libp2p/go-libp2p/p2p/net/mock/mock.go b/vendor/github.com/libp2p/go-libp2p/p2p/net/mock/mock.go deleted file mode 100644 index 55256f86..00000000 --- a/vendor/github.com/libp2p/go-libp2p/p2p/net/mock/mock.go +++ /dev/null @@ -1,52 +0,0 @@ -package mocknet - -import ( - "context" - - logging "github.com/ipfs/go-log" -) - -var log = logging.Logger("mocknet") - -// WithNPeers constructs a Mocknet with N peers. -func WithNPeers(ctx context.Context, n int) (Mocknet, error) { - m := New(ctx) - for i := 0; i < n; i++ { - if _, err := m.GenPeer(); err != nil { - return nil, err - } - } - return m, nil -} - -// FullMeshLinked constructs a Mocknet with full mesh of Links. -// This means that all the peers **can** connect to each other -// (not that they already are connected. you can use m.ConnectAll()) -func FullMeshLinked(ctx context.Context, n int) (Mocknet, error) { - m, err := WithNPeers(ctx, n) - if err != nil { - return nil, err - } - - if err := m.LinkAll(); err != nil { - return nil, err - } - - return m, nil -} - -// FullMeshConnected constructs a Mocknet with full mesh of Connections. -// This means that all the peers have dialed and are ready to talk to -// each other. -func FullMeshConnected(ctx context.Context, n int) (Mocknet, error) { - m, err := FullMeshLinked(ctx, n) - if err != nil { - return nil, err - } - - err = m.ConnectAllButSelf() - if err != nil { - return nil, err - } - return m, nil -} diff --git a/vendor/github.com/libp2p/go-libp2p/p2p/net/mock/mock_conn.go b/vendor/github.com/libp2p/go-libp2p/p2p/net/mock/mock_conn.go deleted file mode 100644 index 3e0af726..00000000 --- a/vendor/github.com/libp2p/go-libp2p/p2p/net/mock/mock_conn.go +++ /dev/null @@ -1,160 +0,0 @@ -package mocknet - -import ( - "container/list" - "sync" - - process "github.com/jbenet/goprocess" - ic "github.com/libp2p/go-libp2p-crypto" - inet "github.com/libp2p/go-libp2p-net" - peer "github.com/libp2p/go-libp2p-peer" - ma "github.com/multiformats/go-multiaddr" -) - -// conn represents one side's perspective of a -// live connection between two peers. -// it goes over a particular link. -type conn struct { - local peer.ID - remote peer.ID - - localAddr ma.Multiaddr - remoteAddr ma.Multiaddr - - localPrivKey ic.PrivKey - remotePubKey ic.PubKey - - net *peernet - link *link - rconn *conn // counterpart - streams list.List - proc process.Process - stat inet.Stat - - sync.RWMutex -} - -func newConn(ln, rn *peernet, l *link, dir inet.Direction) *conn { - c := &conn{net: ln, link: l} - c.local = ln.peer - c.remote = rn.peer - c.stat = inet.Stat{Direction: dir} - - c.localAddr = ln.ps.Addrs(ln.peer)[0] - c.remoteAddr = rn.ps.Addrs(rn.peer)[0] - - c.localPrivKey = ln.ps.PrivKey(ln.peer) - c.remotePubKey = rn.ps.PubKey(rn.peer) - - c.proc = process.WithTeardown(c.teardown) - return c -} - -func (c *conn) Close() error { - return c.proc.Close() -} - -func (c *conn) teardown() error { - for _, s := range c.allStreams() { - s.Reset() - } - c.net.removeConn(c) - c.net.notifyAll(func(n inet.Notifiee) { - n.Disconnected(c.net, c) - }) - return nil -} - -func (c *conn) addStream(s *stream) { - c.Lock() - s.conn = c - c.streams.PushBack(s) - c.Unlock() -} - -func (c *conn) removeStream(s *stream) { - c.Lock() - defer c.Unlock() - for e := c.streams.Front(); e != nil; e = e.Next() { - if s == e.Value { - c.streams.Remove(e) - return - } - } -} - -func (c *conn) allStreams() []inet.Stream { - c.RLock() - defer c.RUnlock() - - strs := make([]inet.Stream, 0, c.streams.Len()) - for e := c.streams.Front(); e != nil; e = e.Next() { - s := e.Value.(*stream) - strs = append(strs, s) - } - return strs -} - -func (c *conn) remoteOpenedStream(s *stream) { - c.addStream(s) - c.net.handleNewStream(s) - c.net.notifyAll(func(n inet.Notifiee) { - n.OpenedStream(c.net, s) - }) -} - -func (c *conn) openStream() *stream { - sl, sr := c.link.newStreamPair() - c.addStream(sl) - c.net.notifyAll(func(n inet.Notifiee) { - n.OpenedStream(c.net, sl) - }) - c.rconn.remoteOpenedStream(sr) - return sl -} - -func (c *conn) NewStream() (inet.Stream, error) { - log.Debugf("Conn.NewStreamWithProtocol: %s --> %s", c.local, c.remote) - - s := c.openStream() - return s, nil -} - -func (c *conn) GetStreams() []inet.Stream { - return c.allStreams() -} - -// LocalMultiaddr is the Multiaddr on this side -func (c *conn) LocalMultiaddr() ma.Multiaddr { - return c.localAddr -} - -// LocalPeer is the Peer on our side of the connection -func (c *conn) LocalPeer() peer.ID { - return c.local -} - -// LocalPrivateKey is the private key of the peer on our side. -func (c *conn) LocalPrivateKey() ic.PrivKey { - return c.localPrivKey -} - -// RemoteMultiaddr is the Multiaddr on the remote side -func (c *conn) RemoteMultiaddr() ma.Multiaddr { - return c.remoteAddr -} - -// RemotePeer is the Peer on the remote side -func (c *conn) RemotePeer() peer.ID { - return c.remote -} - -// RemotePublicKey is the private key of the peer on our side. -func (c *conn) RemotePublicKey() ic.PubKey { - return c.remotePubKey -} - -// Stat returns metadata about the connection -func (c *conn) Stat() inet.Stat { - return c.stat -} diff --git a/vendor/github.com/libp2p/go-libp2p/p2p/net/mock/mock_link.go b/vendor/github.com/libp2p/go-libp2p/p2p/net/mock/mock_link.go deleted file mode 100644 index 9e31cbec..00000000 --- a/vendor/github.com/libp2p/go-libp2p/p2p/net/mock/mock_link.go +++ /dev/null @@ -1,99 +0,0 @@ -package mocknet - -import ( - // "fmt" - "io" - "sync" - "time" - - inet "github.com/libp2p/go-libp2p-net" - peer "github.com/libp2p/go-libp2p-peer" -) - -// link implements mocknet.Link -// and, for simplicity, inet.Conn -type link struct { - mock *mocknet - nets []*peernet - opts LinkOptions - ratelimiter *RateLimiter - // this could have addresses on both sides. - - sync.RWMutex -} - -func newLink(mn *mocknet, opts LinkOptions) *link { - l := &link{mock: mn, - opts: opts, - ratelimiter: NewRateLimiter(opts.Bandwidth)} - return l -} - -func (l *link) newConnPair(dialer *peernet) (*conn, *conn) { - l.RLock() - defer l.RUnlock() - - c1 := newConn(l.nets[0], l.nets[1], l, inet.DirOutbound) - c2 := newConn(l.nets[1], l.nets[0], l, inet.DirInbound) - c1.rconn = c2 - c2.rconn = c1 - - if dialer == c1.net { - return c1, c2 - } - return c2, c1 -} - -func (l *link) newStreamPair() (*stream, *stream) { - ra, wb := io.Pipe() - rb, wa := io.Pipe() - - sa := NewStream(wa, ra, inet.DirOutbound) - sb := NewStream(wb, rb, inet.DirInbound) - return sa, sb -} - -func (l *link) Networks() []inet.Network { - l.RLock() - defer l.RUnlock() - - cp := make([]inet.Network, len(l.nets)) - for i, n := range l.nets { - cp[i] = n - } - return cp -} - -func (l *link) Peers() []peer.ID { - l.RLock() - defer l.RUnlock() - - cp := make([]peer.ID, len(l.nets)) - for i, n := range l.nets { - cp[i] = n.peer - } - return cp -} - -func (l *link) SetOptions(o LinkOptions) { - l.Lock() - defer l.Unlock() - l.opts = o - l.ratelimiter.UpdateBandwidth(l.opts.Bandwidth) -} - -func (l *link) Options() LinkOptions { - l.RLock() - defer l.RUnlock() - return l.opts -} - -func (l *link) GetLatency() time.Duration { - l.RLock() - defer l.RUnlock() - return l.opts.Latency -} - -func (l *link) RateLimit(dataSize int) time.Duration { - return l.ratelimiter.Limit(dataSize) -} diff --git a/vendor/github.com/libp2p/go-libp2p/p2p/net/mock/mock_net.go b/vendor/github.com/libp2p/go-libp2p/p2p/net/mock/mock_net.go deleted file mode 100644 index 2e34d3f7..00000000 --- a/vendor/github.com/libp2p/go-libp2p/p2p/net/mock/mock_net.go +++ /dev/null @@ -1,396 +0,0 @@ -package mocknet - -import ( - "context" - "fmt" - "net" - "sort" - "sync" - - host "github.com/libp2p/go-libp2p-host" - bhost "github.com/libp2p/go-libp2p/p2p/host/basic" - - "github.com/jbenet/goprocess" - goprocessctx "github.com/jbenet/goprocess/context" - ic "github.com/libp2p/go-libp2p-crypto" - inet "github.com/libp2p/go-libp2p-net" - p2putil "github.com/libp2p/go-libp2p-netutil" - peer "github.com/libp2p/go-libp2p-peer" - pstore "github.com/libp2p/go-libp2p-peerstore" - pstoremem "github.com/libp2p/go-libp2p-peerstore/pstoremem" - ma "github.com/multiformats/go-multiaddr" -) - -// IP6 range that gets blackholed (in case our traffic ever makes it out onto -// the internet). -var blackholeIP6 = net.ParseIP("100::") - -// mocknet implements mocknet.Mocknet -type mocknet struct { - nets map[peer.ID]*peernet - hosts map[peer.ID]*bhost.BasicHost - - // links make it possible to connect two peers. - // think of links as the physical medium. - // usually only one, but there could be multiple - // **links are shared between peers** - links map[peer.ID]map[peer.ID]map[*link]struct{} - - linkDefaults LinkOptions - - proc goprocess.Process // for Context closing - ctx context.Context - sync.Mutex -} - -func New(ctx context.Context) Mocknet { - return &mocknet{ - nets: map[peer.ID]*peernet{}, - hosts: map[peer.ID]*bhost.BasicHost{}, - links: map[peer.ID]map[peer.ID]map[*link]struct{}{}, - proc: goprocessctx.WithContext(ctx), - ctx: ctx, - } -} - -func (mn *mocknet) GenPeer() (host.Host, error) { - sk, err := p2putil.RandTestBogusPrivateKey() - if err != nil { - return nil, err - } - id, err := peer.IDFromPrivateKey(sk) - if err != nil { - return nil, err - } - suffix := id - if len(id) > 8 { - suffix = id[len(id)-8:] - } - ip := append(net.IP{}, blackholeIP6...) - copy(ip[net.IPv6len-len(suffix):], suffix) - a, err := ma.NewMultiaddr(fmt.Sprintf("/ip6/%s/tcp/4242", ip)) - if err != nil { - return nil, fmt.Errorf("failed to create test multiaddr: %s", err) - } - - h, err := mn.AddPeer(sk, a) - if err != nil { - return nil, err - } - - return h, nil -} - -func (mn *mocknet) AddPeer(k ic.PrivKey, a ma.Multiaddr) (host.Host, error) { - p, err := peer.IDFromPublicKey(k.GetPublic()) - if err != nil { - return nil, err - } - - ps := pstoremem.NewPeerstore() - ps.AddAddr(p, a, pstore.PermanentAddrTTL) - ps.AddPrivKey(p, k) - ps.AddPubKey(p, k.GetPublic()) - - return mn.AddPeerWithPeerstore(p, ps) -} - -func (mn *mocknet) AddPeerWithPeerstore(p peer.ID, ps pstore.Peerstore) (host.Host, error) { - n, err := newPeernet(mn.ctx, mn, p, ps) - if err != nil { - return nil, err - } - - opts := &bhost.HostOpts{ - NegotiationTimeout: -1, - } - - h, err := bhost.NewHost(mn.ctx, n, opts) - if err != nil { - return nil, err - } - - mn.proc.AddChild(n.proc) - - mn.Lock() - mn.nets[n.peer] = n - mn.hosts[n.peer] = h - mn.Unlock() - return h, nil -} - -func (mn *mocknet) Peers() []peer.ID { - mn.Lock() - defer mn.Unlock() - - cp := make([]peer.ID, 0, len(mn.nets)) - for _, n := range mn.nets { - cp = append(cp, n.peer) - } - sort.Sort(peer.IDSlice(cp)) - return cp -} - -func (mn *mocknet) Host(pid peer.ID) host.Host { - mn.Lock() - host := mn.hosts[pid] - mn.Unlock() - return host -} - -func (mn *mocknet) Net(pid peer.ID) inet.Network { - mn.Lock() - n := mn.nets[pid] - mn.Unlock() - return n -} - -func (mn *mocknet) Hosts() []host.Host { - mn.Lock() - defer mn.Unlock() - - cp := make([]host.Host, 0, len(mn.hosts)) - for _, h := range mn.hosts { - cp = append(cp, h) - } - - sort.Sort(hostSlice(cp)) - return cp -} - -func (mn *mocknet) Nets() []inet.Network { - mn.Lock() - defer mn.Unlock() - - cp := make([]inet.Network, 0, len(mn.nets)) - for _, n := range mn.nets { - cp = append(cp, n) - } - sort.Sort(netSlice(cp)) - return cp -} - -// Links returns a copy of the internal link state map. -// (wow, much map. so data structure. how compose. ahhh pointer) -func (mn *mocknet) Links() LinkMap { - mn.Lock() - defer mn.Unlock() - - links := map[string]map[string]map[Link]struct{}{} - for p1, lm := range mn.links { - sp1 := string(p1) - links[sp1] = map[string]map[Link]struct{}{} - for p2, ls := range lm { - sp2 := string(p2) - links[sp1][sp2] = map[Link]struct{}{} - for l := range ls { - links[sp1][sp2][l] = struct{}{} - } - } - } - return links -} - -func (mn *mocknet) LinkAll() error { - nets := mn.Nets() - for _, n1 := range nets { - for _, n2 := range nets { - if _, err := mn.LinkNets(n1, n2); err != nil { - return err - } - } - } - return nil -} - -func (mn *mocknet) LinkPeers(p1, p2 peer.ID) (Link, error) { - mn.Lock() - n1 := mn.nets[p1] - n2 := mn.nets[p2] - mn.Unlock() - - if n1 == nil { - return nil, fmt.Errorf("network for p1 not in mocknet") - } - - if n2 == nil { - return nil, fmt.Errorf("network for p2 not in mocknet") - } - - return mn.LinkNets(n1, n2) -} - -func (mn *mocknet) validate(n inet.Network) (*peernet, error) { - // WARNING: assumes locks acquired - - nr, ok := n.(*peernet) - if !ok { - return nil, fmt.Errorf("Network not supported (use mock package nets only)") - } - - if _, found := mn.nets[nr.peer]; !found { - return nil, fmt.Errorf("Network not on mocknet. is it from another mocknet?") - } - - return nr, nil -} - -func (mn *mocknet) LinkNets(n1, n2 inet.Network) (Link, error) { - mn.Lock() - n1r, err1 := mn.validate(n1) - n2r, err2 := mn.validate(n2) - ld := mn.linkDefaults - mn.Unlock() - - if err1 != nil { - return nil, err1 - } - if err2 != nil { - return nil, err2 - } - - l := newLink(mn, ld) - l.nets = append(l.nets, n1r, n2r) - mn.addLink(l) - return l, nil -} - -func (mn *mocknet) Unlink(l2 Link) error { - - l, ok := l2.(*link) - if !ok { - return fmt.Errorf("only links from mocknet are supported") - } - - mn.removeLink(l) - return nil -} - -func (mn *mocknet) UnlinkPeers(p1, p2 peer.ID) error { - ls := mn.LinksBetweenPeers(p1, p2) - if ls == nil { - return fmt.Errorf("no link between p1 and p2") - } - - for _, l := range ls { - if err := mn.Unlink(l); err != nil { - return err - } - } - return nil -} - -func (mn *mocknet) UnlinkNets(n1, n2 inet.Network) error { - return mn.UnlinkPeers(n1.LocalPeer(), n2.LocalPeer()) -} - -// get from the links map. and lazily contruct. -func (mn *mocknet) linksMapGet(p1, p2 peer.ID) map[*link]struct{} { - - l1, found := mn.links[p1] - if !found { - mn.links[p1] = map[peer.ID]map[*link]struct{}{} - l1 = mn.links[p1] // so we make sure it's there. - } - - l2, found := l1[p2] - if !found { - m := map[*link]struct{}{} - l1[p2] = m - l2 = l1[p2] - } - - return l2 -} - -func (mn *mocknet) addLink(l *link) { - mn.Lock() - defer mn.Unlock() - - n1, n2 := l.nets[0], l.nets[1] - mn.linksMapGet(n1.peer, n2.peer)[l] = struct{}{} - mn.linksMapGet(n2.peer, n1.peer)[l] = struct{}{} -} - -func (mn *mocknet) removeLink(l *link) { - mn.Lock() - defer mn.Unlock() - - n1, n2 := l.nets[0], l.nets[1] - delete(mn.linksMapGet(n1.peer, n2.peer), l) - delete(mn.linksMapGet(n2.peer, n1.peer), l) -} - -func (mn *mocknet) ConnectAllButSelf() error { - nets := mn.Nets() - for _, n1 := range nets { - for _, n2 := range nets { - if n1 == n2 { - continue - } - - if _, err := mn.ConnectNets(n1, n2); err != nil { - return err - } - } - } - return nil -} - -func (mn *mocknet) ConnectPeers(a, b peer.ID) (inet.Conn, error) { - return mn.Net(a).DialPeer(mn.ctx, b) -} - -func (mn *mocknet) ConnectNets(a, b inet.Network) (inet.Conn, error) { - return a.DialPeer(mn.ctx, b.LocalPeer()) -} - -func (mn *mocknet) DisconnectPeers(p1, p2 peer.ID) error { - return mn.Net(p1).ClosePeer(p2) -} - -func (mn *mocknet) DisconnectNets(n1, n2 inet.Network) error { - return n1.ClosePeer(n2.LocalPeer()) -} - -func (mn *mocknet) LinksBetweenPeers(p1, p2 peer.ID) []Link { - mn.Lock() - defer mn.Unlock() - - ls2 := mn.linksMapGet(p1, p2) - cp := make([]Link, 0, len(ls2)) - for l := range ls2 { - cp = append(cp, l) - } - return cp -} - -func (mn *mocknet) LinksBetweenNets(n1, n2 inet.Network) []Link { - return mn.LinksBetweenPeers(n1.LocalPeer(), n2.LocalPeer()) -} - -func (mn *mocknet) SetLinkDefaults(o LinkOptions) { - mn.Lock() - mn.linkDefaults = o - mn.Unlock() -} - -func (mn *mocknet) LinkDefaults() LinkOptions { - mn.Lock() - defer mn.Unlock() - return mn.linkDefaults -} - -// netSlice for sorting by peer -type netSlice []inet.Network - -func (es netSlice) Len() int { return len(es) } -func (es netSlice) Swap(i, j int) { es[i], es[j] = es[j], es[i] } -func (es netSlice) Less(i, j int) bool { return string(es[i].LocalPeer()) < string(es[j].LocalPeer()) } - -// hostSlice for sorting by peer -type hostSlice []host.Host - -func (es hostSlice) Len() int { return len(es) } -func (es hostSlice) Swap(i, j int) { es[i], es[j] = es[j], es[i] } -func (es hostSlice) Less(i, j int) bool { return string(es[i].ID()) < string(es[j].ID()) } diff --git a/vendor/github.com/libp2p/go-libp2p/p2p/net/mock/mock_peernet.go b/vendor/github.com/libp2p/go-libp2p/p2p/net/mock/mock_peernet.go deleted file mode 100644 index 35c9bbe6..00000000 --- a/vendor/github.com/libp2p/go-libp2p/p2p/net/mock/mock_peernet.go +++ /dev/null @@ -1,385 +0,0 @@ -package mocknet - -import ( - "context" - "fmt" - "math/rand" - "sync" - - "github.com/jbenet/goprocess" - goprocessctx "github.com/jbenet/goprocess/context" - inet "github.com/libp2p/go-libp2p-net" - peer "github.com/libp2p/go-libp2p-peer" - pstore "github.com/libp2p/go-libp2p-peerstore" - ma "github.com/multiformats/go-multiaddr" -) - -// peernet implements inet.Network -type peernet struct { - mocknet *mocknet // parent - - peer peer.ID - ps pstore.Peerstore - - // conns are actual live connections between peers. - // many conns could run over each link. - // **conns are NOT shared between peers** - connsByPeer map[peer.ID]map[*conn]struct{} - connsByLink map[*link]map[*conn]struct{} - - // implement inet.Network - streamHandler inet.StreamHandler - connHandler inet.ConnHandler - - notifmu sync.Mutex - notifs map[inet.Notifiee]struct{} - - proc goprocess.Process - sync.RWMutex -} - -// newPeernet constructs a new peernet -func newPeernet(ctx context.Context, m *mocknet, p peer.ID, ps pstore.Peerstore) (*peernet, error) { - - n := &peernet{ - mocknet: m, - peer: p, - ps: ps, - - connsByPeer: map[peer.ID]map[*conn]struct{}{}, - connsByLink: map[*link]map[*conn]struct{}{}, - - notifs: make(map[inet.Notifiee]struct{}), - } - - n.proc = goprocessctx.WithContextAndTeardown(ctx, n.teardown) - return n, nil -} - -func (pn *peernet) teardown() error { - - // close the connections - for _, c := range pn.allConns() { - c.Close() - } - return nil -} - -// allConns returns all the connections between this peer and others -func (pn *peernet) allConns() []*conn { - pn.RLock() - var cs []*conn - for _, csl := range pn.connsByPeer { - for c := range csl { - cs = append(cs, c) - } - } - pn.RUnlock() - return cs -} - -// Close calls the ContextCloser func -func (pn *peernet) Close() error { - return pn.proc.Close() -} - -func (pn *peernet) Peerstore() pstore.Peerstore { - return pn.ps -} - -func (pn *peernet) String() string { - return fmt.Sprintf("", pn.peer, len(pn.allConns())) -} - -// handleNewStream is an internal function to trigger the client's handler -func (pn *peernet) handleNewStream(s inet.Stream) { - pn.RLock() - handler := pn.streamHandler - pn.RUnlock() - if handler != nil { - go handler(s) - } -} - -// handleNewConn is an internal function to trigger the client's handler -func (pn *peernet) handleNewConn(c inet.Conn) { - pn.RLock() - handler := pn.connHandler - pn.RUnlock() - if handler != nil { - go handler(c) - } -} - -// DialPeer attempts to establish a connection to a given peer. -// Respects the context. -func (pn *peernet) DialPeer(ctx context.Context, p peer.ID) (inet.Conn, error) { - return pn.connect(p) -} - -func (pn *peernet) connect(p peer.ID) (*conn, error) { - if p == pn.peer { - return nil, fmt.Errorf("attempted to dial self %s", p) - } - - // first, check if we already have live connections - pn.RLock() - cs, found := pn.connsByPeer[p] - if found && len(cs) > 0 { - var chosen *conn - for c := range cs { // because cs is a map - chosen = c // select first - break - } - pn.RUnlock() - return chosen, nil - } - pn.RUnlock() - - log.Debugf("%s (newly) dialing %s", pn.peer, p) - - // ok, must create a new connection. we need a link - links := pn.mocknet.LinksBetweenPeers(pn.peer, p) - if len(links) < 1 { - return nil, fmt.Errorf("%s cannot connect to %s", pn.peer, p) - } - - // if many links found, how do we select? for now, randomly... - // this would be an interesting place to test logic that can measure - // links (network interfaces) and select properly - l := links[rand.Intn(len(links))] - - log.Debugf("%s dialing %s openingConn", pn.peer, p) - // create a new connection with link - c := pn.openConn(p, l.(*link)) - return c, nil -} - -func (pn *peernet) openConn(r peer.ID, l *link) *conn { - lc, rc := l.newConnPair(pn) - log.Debugf("%s opening connection to %s", pn.LocalPeer(), lc.RemotePeer()) - pn.addConn(lc) - pn.notifyAll(func(n inet.Notifiee) { - n.Connected(pn, lc) - }) - rc.net.remoteOpenedConn(rc) - return lc -} - -func (pn *peernet) remoteOpenedConn(c *conn) { - log.Debugf("%s accepting connection from %s", pn.LocalPeer(), c.RemotePeer()) - pn.addConn(c) - pn.handleNewConn(c) - pn.notifyAll(func(n inet.Notifiee) { - n.Connected(pn, c) - }) -} - -// addConn constructs and adds a connection -// to given remote peer over given link -func (pn *peernet) addConn(c *conn) { - pn.Lock() - defer pn.Unlock() - - cs, found := pn.connsByPeer[c.RemotePeer()] - if !found { - cs = map[*conn]struct{}{} - pn.connsByPeer[c.RemotePeer()] = cs - } - pn.connsByPeer[c.RemotePeer()][c] = struct{}{} - - cs, found = pn.connsByLink[c.link] - if !found { - cs = map[*conn]struct{}{} - pn.connsByLink[c.link] = cs - } - pn.connsByLink[c.link][c] = struct{}{} -} - -// removeConn removes a given conn -func (pn *peernet) removeConn(c *conn) { - pn.Lock() - defer pn.Unlock() - - cs, found := pn.connsByLink[c.link] - if !found || len(cs) < 1 { - panic(fmt.Sprintf("attempting to remove a conn that doesnt exist %p", c.link)) - } - delete(cs, c) - - cs, found = pn.connsByPeer[c.remote] - if !found { - panic(fmt.Sprintf("attempting to remove a conn that doesnt exist %v", c.remote)) - } - delete(cs, c) -} - -// Process returns the network's Process -func (pn *peernet) Process() goprocess.Process { - return pn.proc -} - -// LocalPeer the network's LocalPeer -func (pn *peernet) LocalPeer() peer.ID { - return pn.peer -} - -// Peers returns the connected peers -func (pn *peernet) Peers() []peer.ID { - pn.RLock() - defer pn.RUnlock() - - peers := make([]peer.ID, 0, len(pn.connsByPeer)) - for _, cs := range pn.connsByPeer { - for c := range cs { - peers = append(peers, c.remote) - break - } - } - return peers -} - -// Conns returns all the connections of this peer -func (pn *peernet) Conns() []inet.Conn { - pn.RLock() - defer pn.RUnlock() - - out := make([]inet.Conn, 0, len(pn.connsByPeer)) - for _, cs := range pn.connsByPeer { - for c := range cs { - out = append(out, c) - } - } - return out -} - -func (pn *peernet) ConnsToPeer(p peer.ID) []inet.Conn { - pn.RLock() - defer pn.RUnlock() - - cs, found := pn.connsByPeer[p] - if !found || len(cs) == 0 { - return nil - } - - var cs2 []inet.Conn - for c := range cs { - cs2 = append(cs2, c) - } - return cs2 -} - -// ClosePeer connections to peer -func (pn *peernet) ClosePeer(p peer.ID) error { - pn.RLock() - cs, found := pn.connsByPeer[p] - if !found { - pn.RUnlock() - return nil - } - - var conns []*conn - for c := range cs { - conns = append(conns, c) - } - pn.RUnlock() - for _, c := range conns { - c.Close() - } - return nil -} - -// BandwidthTotals returns the total amount of bandwidth transferred -func (pn *peernet) BandwidthTotals() (in uint64, out uint64) { - // need to implement this. probably best to do it in swarm this time. - // need a "metrics" object - return 0, 0 -} - -// Listen tells the network to start listening on given multiaddrs. -func (pn *peernet) Listen(addrs ...ma.Multiaddr) error { - pn.Peerstore().AddAddrs(pn.LocalPeer(), addrs, pstore.PermanentAddrTTL) - return nil -} - -// ListenAddresses returns a list of addresses at which this network listens. -func (pn *peernet) ListenAddresses() []ma.Multiaddr { - return pn.Peerstore().Addrs(pn.LocalPeer()) -} - -// InterfaceListenAddresses returns a list of addresses at which this network -// listens. It expands "any interface" addresses (/ip4/0.0.0.0, /ip6/::) to -// use the known local interfaces. -func (pn *peernet) InterfaceListenAddresses() ([]ma.Multiaddr, error) { - return pn.ListenAddresses(), nil -} - -// Connectedness returns a state signaling connection capabilities -// For now only returns Connecter || NotConnected. Expand into more later. -func (pn *peernet) Connectedness(p peer.ID) inet.Connectedness { - pn.Lock() - defer pn.Unlock() - - cs, found := pn.connsByPeer[p] - if found && len(cs) > 0 { - return inet.Connected - } - return inet.NotConnected -} - -// NewStream returns a new stream to given peer p. -// If there is no connection to p, attempts to create one. -func (pn *peernet) NewStream(ctx context.Context, p peer.ID) (inet.Stream, error) { - c, err := pn.DialPeer(ctx, p) - if err != nil { - return nil, err - } - return c.NewStream() -} - -// SetStreamHandler sets the new stream handler on the Network. -// This operation is threadsafe. -func (pn *peernet) SetStreamHandler(h inet.StreamHandler) { - pn.Lock() - pn.streamHandler = h - pn.Unlock() -} - -// SetConnHandler sets the new conn handler on the Network. -// This operation is threadsafe. -func (pn *peernet) SetConnHandler(h inet.ConnHandler) { - pn.Lock() - pn.connHandler = h - pn.Unlock() -} - -// Notify signs up Notifiee to receive signals when events happen -func (pn *peernet) Notify(f inet.Notifiee) { - pn.notifmu.Lock() - pn.notifs[f] = struct{}{} - pn.notifmu.Unlock() -} - -// StopNotify unregisters Notifiee from receiving signals -func (pn *peernet) StopNotify(f inet.Notifiee) { - pn.notifmu.Lock() - delete(pn.notifs, f) - pn.notifmu.Unlock() -} - -// notifyAll runs the notification function on all Notifiees -func (pn *peernet) notifyAll(notification func(f inet.Notifiee)) { - pn.notifmu.Lock() - var wg sync.WaitGroup - for n := range pn.notifs { - // make sure we dont block - // and they dont block each other. - wg.Add(1) - go func(n inet.Notifiee) { - defer wg.Done() - notification(n) - }(n) - } - wg.Wait() - pn.notifmu.Unlock() -} diff --git a/vendor/github.com/libp2p/go-libp2p/p2p/net/mock/mock_printer.go b/vendor/github.com/libp2p/go-libp2p/p2p/net/mock/mock_printer.go deleted file mode 100644 index 4990811a..00000000 --- a/vendor/github.com/libp2p/go-libp2p/p2p/net/mock/mock_printer.go +++ /dev/null @@ -1,36 +0,0 @@ -package mocknet - -import ( - "fmt" - "io" - - inet "github.com/libp2p/go-libp2p-net" - peer "github.com/libp2p/go-libp2p-peer" -) - -// separate object so our interfaces are separate :) -type printer struct { - w io.Writer -} - -func (p *printer) MocknetLinks(mn Mocknet) { - links := mn.Links() - - fmt.Fprintf(p.w, "Mocknet link map:\n") - for p1, lm := range links { - fmt.Fprintf(p.w, "\t%s linked to:\n", peer.ID(p1)) - for p2, l := range lm { - fmt.Fprintf(p.w, "\t\t%s (%d links)\n", peer.ID(p2), len(l)) - } - } - fmt.Fprintf(p.w, "\n") -} - -func (p *printer) NetworkConns(ni inet.Network) { - - fmt.Fprintf(p.w, "%s connected to:\n", ni.LocalPeer()) - for _, c := range ni.Conns() { - fmt.Fprintf(p.w, "\t%s (addr: %s)\n", c.RemotePeer(), c.RemoteMultiaddr()) - } - fmt.Fprintf(p.w, "\n") -} diff --git a/vendor/github.com/libp2p/go-libp2p/p2p/net/mock/mock_stream.go b/vendor/github.com/libp2p/go-libp2p/p2p/net/mock/mock_stream.go deleted file mode 100644 index 331b8960..00000000 --- a/vendor/github.com/libp2p/go-libp2p/p2p/net/mock/mock_stream.go +++ /dev/null @@ -1,266 +0,0 @@ -package mocknet - -import ( - "bytes" - "errors" - "io" - "net" - "sync/atomic" - "time" - - inet "github.com/libp2p/go-libp2p-net" - protocol "github.com/libp2p/go-libp2p-protocol" -) - -// stream implements inet.Stream -type stream struct { - write *io.PipeWriter - read *io.PipeReader - conn *conn - toDeliver chan *transportObject - - reset chan struct{} - close chan struct{} - closed chan struct{} - - writeErr error - - protocol atomic.Value - stat inet.Stat -} - -var ErrReset error = errors.New("stream reset") -var ErrClosed error = errors.New("stream closed") - -type transportObject struct { - msg []byte - arrivalTime time.Time -} - -func NewStream(w *io.PipeWriter, r *io.PipeReader, dir inet.Direction) *stream { - s := &stream{ - read: r, - write: w, - reset: make(chan struct{}, 1), - close: make(chan struct{}, 1), - closed: make(chan struct{}), - toDeliver: make(chan *transportObject), - stat: inet.Stat{Direction: dir}, - } - - go s.transport() - return s -} - -// How to handle errors with writes? -func (s *stream) Write(p []byte) (n int, err error) { - l := s.conn.link - delay := l.GetLatency() + l.RateLimit(len(p)) - t := time.Now().Add(delay) - - // Copy it. - cpy := make([]byte, len(p)) - copy(cpy, p) - - select { - case <-s.closed: // bail out if we're closing. - return 0, s.writeErr - case s.toDeliver <- &transportObject{msg: cpy, arrivalTime: t}: - } - return len(p), nil -} - -func (s *stream) Protocol() protocol.ID { - // Ignore type error. It means that the protocol is unset. - p, _ := s.protocol.Load().(protocol.ID) - return p -} - -func (s *stream) Stat() inet.Stat { - return s.stat -} - -func (s *stream) SetProtocol(proto protocol.ID) { - s.protocol.Store(proto) -} - -func (s *stream) Close() error { - select { - case s.close <- struct{}{}: - default: - } - <-s.closed - if s.writeErr != ErrClosed { - return s.writeErr - } - return nil -} - -func (s *stream) Reset() error { - // Cancel any pending reads/writes with an error. - s.write.CloseWithError(ErrReset) - s.read.CloseWithError(ErrReset) - - select { - case s.reset <- struct{}{}: - default: - } - <-s.closed - - // No meaningful error case here. - return nil -} - -func (s *stream) teardown() { - // at this point, no streams are writing. - s.conn.removeStream(s) - - // Mark as closed. - close(s.closed) - - s.conn.net.notifyAll(func(n inet.Notifiee) { - n.ClosedStream(s.conn.net, s) - }) -} - -func (s *stream) Conn() inet.Conn { - return s.conn -} - -func (s *stream) SetDeadline(t time.Time) error { - return &net.OpError{Op: "set", Net: "pipe", Source: nil, Addr: nil, Err: errors.New("deadline not supported")} -} - -func (s *stream) SetReadDeadline(t time.Time) error { - return &net.OpError{Op: "set", Net: "pipe", Source: nil, Addr: nil, Err: errors.New("deadline not supported")} -} - -func (s *stream) SetWriteDeadline(t time.Time) error { - return &net.OpError{Op: "set", Net: "pipe", Source: nil, Addr: nil, Err: errors.New("deadline not supported")} -} - -func (s *stream) Read(b []byte) (int, error) { - return s.read.Read(b) -} - -// transport will grab message arrival times, wait until that time, and -// then write the message out when it is scheduled to arrive -func (s *stream) transport() { - defer s.teardown() - - bufsize := 256 - buf := new(bytes.Buffer) - timer := time.NewTimer(0) - if !timer.Stop() { - select { - case <-timer.C: - default: - } - } - - // cleanup - defer timer.Stop() - - // writeBuf writes the contents of buf through to the s.Writer. - // done only when arrival time makes sense. - drainBuf := func() error { - if buf.Len() > 0 { - _, err := s.write.Write(buf.Bytes()) - if err != nil { - return err - } - buf.Reset() - } - return nil - } - - // deliverOrWait is a helper func that processes - // an incoming packet. it waits until the arrival time, - // and then writes things out. - deliverOrWait := func(o *transportObject) error { - buffered := len(o.msg) + buf.Len() - - // Yes, we can end up extending a timer multiple times if we - // keep on making small writes but that shouldn't be too much of an - // issue. Fixing that would be painful. - if !timer.Stop() { - // FIXME: So, we *shouldn't* need to do this but we hang - // here if we don't... Go bug? - select { - case <-timer.C: - default: - } - } - delay := o.arrivalTime.Sub(time.Now()) - if delay >= 0 { - timer.Reset(delay) - } else { - timer.Reset(0) - } - - if buffered >= bufsize { - select { - case <-timer.C: - case <-s.reset: - select { - case s.reset <- struct{}{}: - default: - } - return ErrReset - } - if err := drainBuf(); err != nil { - return err - } - // write this message. - _, err := s.write.Write(o.msg) - if err != nil { - return err - } - } else { - buf.Write(o.msg) - } - return nil - } - - for { - // Reset takes precedent. - select { - case <-s.reset: - s.writeErr = ErrReset - return - default: - } - - select { - case <-s.reset: - s.writeErr = ErrReset - return - case <-s.close: - if err := drainBuf(); err != nil { - s.resetWith(err) - return - } - s.writeErr = s.write.Close() - if s.writeErr == nil { - s.writeErr = ErrClosed - } - return - case o := <-s.toDeliver: - if err := deliverOrWait(o); err != nil { - s.resetWith(err) - return - } - case <-timer.C: // ok, due to write it out. - if err := drainBuf(); err != nil { - s.resetWith(err) - return - } - } - } -} - -func (s *stream) resetWith(err error) { - s.write.CloseWithError(err) - s.read.CloseWithError(err) - s.writeErr = err -} diff --git a/vendor/github.com/libp2p/go-libp2p/p2p/net/mock/ratelimiter.go b/vendor/github.com/libp2p/go-libp2p/p2p/net/mock/ratelimiter.go deleted file mode 100644 index d4e5797b..00000000 --- a/vendor/github.com/libp2p/go-libp2p/p2p/net/mock/ratelimiter.go +++ /dev/null @@ -1,75 +0,0 @@ -package mocknet - -import ( - "sync" - "time" -) - -// A RateLimiter is used by a link to determine how long to wait before sending -// data given a bandwidth cap. -type RateLimiter struct { - lock sync.Mutex - bandwidth float64 // bytes per nanosecond - allowance float64 // in bytes - maxAllowance float64 // in bytes - lastUpdate time.Time // when allowance was updated last - count int // number of times rate limiting was applied - duration time.Duration // total delay introduced due to rate limiting -} - -// Creates a new RateLimiter with bandwidth (in bytes/sec) -func NewRateLimiter(bandwidth float64) *RateLimiter { - // convert bandwidth to bytes per nanosecond - b := bandwidth / float64(time.Second) - return &RateLimiter{ - bandwidth: b, - allowance: 0, - maxAllowance: bandwidth, - lastUpdate: time.Now(), - } -} - -// Changes bandwidth of a RateLimiter and resets its allowance -func (r *RateLimiter) UpdateBandwidth(bandwidth float64) { - r.lock.Lock() - defer r.lock.Unlock() - // Convert bandwidth from bytes/second to bytes/nanosecond - b := bandwidth / float64(time.Second) - r.bandwidth = b - // Reset allowance - r.allowance = 0 - r.maxAllowance = bandwidth - r.lastUpdate = time.Now() -} - -// Returns how long to wait before sending data with length 'dataSize' bytes -func (r *RateLimiter) Limit(dataSize int) time.Duration { - r.lock.Lock() - defer r.lock.Unlock() - // update time - var duration time.Duration = time.Duration(0) - if r.bandwidth == 0 { - return duration - } - current := time.Now() - elapsedTime := current.Sub(r.lastUpdate) - r.lastUpdate = current - - allowance := r.allowance + float64(elapsedTime)*r.bandwidth - // allowance can't exceed bandwidth - if allowance > r.maxAllowance { - allowance = r.maxAllowance - } - - allowance -= float64(dataSize) - if allowance < 0 { - // sleep until allowance is back to 0 - duration = time.Duration(-allowance / r.bandwidth) - // rate limiting was applied, record stats - r.count++ - r.duration += duration - } - - r.allowance = allowance - return duration -} diff --git a/vendor/github.com/libp2p/go-libp2p/p2p/protocol/identify/id.go b/vendor/github.com/libp2p/go-libp2p/p2p/protocol/identify/id.go index cfc4d088..a3ddddaa 100644 --- a/vendor/github.com/libp2p/go-libp2p/p2p/protocol/identify/id.go +++ b/vendor/github.com/libp2p/go-libp2p/p2p/protocol/identify/id.go @@ -5,16 +5,20 @@ import ( "sync" "time" + ic "github.com/libp2p/go-libp2p-core/crypto" + "github.com/libp2p/go-libp2p-core/helpers" + "github.com/libp2p/go-libp2p-core/host" + "github.com/libp2p/go-libp2p-core/network" + "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p-core/peerstore" + pb "github.com/libp2p/go-libp2p/p2p/protocol/identify/pb" ggio "github.com/gogo/protobuf/io" logging "github.com/ipfs/go-log" - ic "github.com/libp2p/go-libp2p-crypto" - host "github.com/libp2p/go-libp2p-host" + lgbl "github.com/libp2p/go-libp2p-loggables" - inet "github.com/libp2p/go-libp2p-net" - peer "github.com/libp2p/go-libp2p-peer" - pstore "github.com/libp2p/go-libp2p-peerstore" + ma "github.com/multiformats/go-multiaddr" msmux "github.com/multiformats/go-multistream" ) @@ -51,7 +55,7 @@ type IDService struct { // connections undergoing identification // for wait purposes - currid map[inet.Conn]chan struct{} + currid map[network.Conn]chan struct{} currmu sync.RWMutex addrMu sync.Mutex @@ -67,7 +71,7 @@ func NewIDService(ctx context.Context, h host.Host) *IDService { s := &IDService{ Host: h, ctx: ctx, - currid: make(map[inet.Conn]chan struct{}), + currid: make(map[network.Conn]chan struct{}), observedAddrs: NewObservedAddrSet(ctx), } h.SetStreamHandler(ID, s.requestHandler) @@ -85,7 +89,7 @@ func (ids *IDService) ObservedAddrsFor(local ma.Multiaddr) []ma.Multiaddr { return ids.observedAddrs.AddrsFor(local) } -func (ids *IDService) IdentifyConn(c inet.Conn) { +func (ids *IDService) IdentifyConn(c network.Conn) { ids.currmu.Lock() if wait, found := ids.currid[c]; found { ids.currmu.Unlock() @@ -124,8 +128,8 @@ func (ids *IDService) IdentifyConn(c inet.Conn) { ids.responseHandler(s) } -func (ids *IDService) requestHandler(s inet.Stream) { - defer inet.FullClose(s) +func (ids *IDService) requestHandler(s network.Stream) { + defer helpers.FullClose(s) c := s.Conn() w := ggio.NewDelimitedWriter(s) @@ -137,7 +141,7 @@ func (ids *IDService) requestHandler(s inet.Stream) { c.RemotePeer(), c.RemoteMultiaddr()) } -func (ids *IDService) responseHandler(s inet.Stream) { +func (ids *IDService) responseHandler(s network.Stream) { c := s.Conn() r := ggio.NewDelimitedReader(s, 2048) @@ -151,10 +155,10 @@ func (ids *IDService) responseHandler(s inet.Stream) { log.Debugf("%s received message from %s %s", ID, c.RemotePeer(), c.RemoteMultiaddr()) - go inet.FullClose(s) + go helpers.FullClose(s) } -func (ids *IDService) pushHandler(s inet.Stream) { +func (ids *IDService) pushHandler(s network.Stream) { ids.responseHandler(s) } @@ -162,7 +166,7 @@ func (ids *IDService) Push() { var wg sync.WaitGroup ctx, cancel := context.WithTimeout(ids.ctx, 30*time.Second) - ctx = inet.WithNoDial(ctx, "identify push") + ctx = network.WithNoDial(ctx, "identify push") for _, p := range ids.Host.Network().Peers() { wg.Add(1) @@ -197,7 +201,7 @@ func (ids *IDService) Push() { }() } -func (ids *IDService) populateMessage(mes *pb.Identify, c inet.Conn) { +func (ids *IDService) populateMessage(mes *pb.Identify, c network.Conn) { // set protocols this node is currently handling protos := ids.Host.Mux().Protocols() @@ -246,7 +250,7 @@ func (ids *IDService) populateMessage(mes *pb.Identify, c inet.Conn) { mes.AgentVersion = &av } -func (ids *IDService) consumeMessage(mes *pb.Identify, c inet.Conn) { +func (ids *IDService) consumeMessage(mes *pb.Identify, c network.Conn) { p := c.RemotePeer() // mes.Protocols @@ -280,14 +284,14 @@ func (ids *IDService) consumeMessage(mes *pb.Identify, c inet.Conn) { // Taking the lock ensures that we don't concurrently process a disconnect. ids.addrMu.Lock() switch ids.Host.Network().Connectedness(p) { - case inet.Connected: + case network.Connected: // invalidate previous addrs -- we use a transient ttl instead of 0 to ensure there // is no period of having no good addrs whatsoever - ids.Host.Peerstore().UpdateAddrs(p, pstore.ConnectedAddrTTL, transientTTL) - ids.Host.Peerstore().AddAddrs(p, lmaddrs, pstore.ConnectedAddrTTL) + ids.Host.Peerstore().UpdateAddrs(p, peerstore.ConnectedAddrTTL, transientTTL) + ids.Host.Peerstore().AddAddrs(p, lmaddrs, peerstore.ConnectedAddrTTL) default: - ids.Host.Peerstore().UpdateAddrs(p, pstore.ConnectedAddrTTL, transientTTL) - ids.Host.Peerstore().AddAddrs(p, lmaddrs, pstore.RecentlyConnectedAddrTTL) + ids.Host.Peerstore().UpdateAddrs(p, peerstore.ConnectedAddrTTL, transientTTL) + ids.Host.Peerstore().AddAddrs(p, lmaddrs, peerstore.RecentlyConnectedAddrTTL) } ids.addrMu.Unlock() @@ -304,7 +308,7 @@ func (ids *IDService) consumeMessage(mes *pb.Identify, c inet.Conn) { ids.consumeReceivedPubKey(c, mes.PublicKey) } -func (ids *IDService) consumeReceivedPubKey(c inet.Conn, kb []byte) { +func (ids *IDService) consumeReceivedPubKey(c network.Conn, kb []byte) { lp := c.LocalPeer() rp := c.RemotePeer() @@ -412,7 +416,7 @@ func HasConsistentTransport(a ma.Multiaddr, green []ma.Multiaddr) bool { // This happens async so the connection can start to be used // even if handshake3 knowledge is not necesary. // Users **MUST** call IdentifyWait _after_ IdentifyConn -func (ids *IDService) IdentifyWait(c inet.Conn) <-chan struct{} { +func (ids *IDService) IdentifyWait(c network.Conn) <-chan struct{} { ids.currmu.Lock() ch, found := ids.currid[c] ids.currmu.Unlock() @@ -427,7 +431,7 @@ func (ids *IDService) IdentifyWait(c inet.Conn) <-chan struct{} { return ch } -func (ids *IDService) consumeObservedAddress(observed []byte, c inet.Conn) { +func (ids *IDService) consumeObservedAddress(observed []byte, c network.Conn) { if observed == nil { return } @@ -481,30 +485,30 @@ func (nn *netNotifiee) IDService() *IDService { return (*IDService)(nn) } -func (nn *netNotifiee) Connected(n inet.Network, v inet.Conn) { +func (nn *netNotifiee) Connected(n network.Network, v network.Conn) { // TODO: deprecate the setConnHandler hook, and kick off // identification here. } -func (nn *netNotifiee) Disconnected(n inet.Network, v inet.Conn) { +func (nn *netNotifiee) Disconnected(n network.Network, v network.Conn) { // undo the setting of addresses to peer.ConnectedAddrTTL we did ids := nn.IDService() ids.addrMu.Lock() defer ids.addrMu.Unlock() - if ids.Host.Network().Connectedness(v.RemotePeer()) != inet.Connected { + if ids.Host.Network().Connectedness(v.RemotePeer()) != network.Connected { // Last disconnect. ps := ids.Host.Peerstore() - ps.UpdateAddrs(v.RemotePeer(), pstore.ConnectedAddrTTL, pstore.RecentlyConnectedAddrTTL) + ps.UpdateAddrs(v.RemotePeer(), peerstore.ConnectedAddrTTL, peerstore.RecentlyConnectedAddrTTL) } } -func (nn *netNotifiee) OpenedStream(n inet.Network, v inet.Stream) {} -func (nn *netNotifiee) ClosedStream(n inet.Network, v inet.Stream) {} -func (nn *netNotifiee) Listen(n inet.Network, a ma.Multiaddr) {} -func (nn *netNotifiee) ListenClose(n inet.Network, a ma.Multiaddr) {} +func (nn *netNotifiee) OpenedStream(n network.Network, v network.Stream) {} +func (nn *netNotifiee) ClosedStream(n network.Network, v network.Stream) {} +func (nn *netNotifiee) Listen(n network.Network, a ma.Multiaddr) {} +func (nn *netNotifiee) ListenClose(n network.Network, a ma.Multiaddr) {} -func logProtocolMismatchDisconnect(c inet.Conn, protocol, agent string) { +func logProtocolMismatchDisconnect(c network.Conn, protocol, agent string) { lm := make(lgbl.DeferredMap) lm["remotePeer"] = func() interface{} { return c.RemotePeer().Pretty() } lm["remoteAddr"] = func() interface{} { return c.RemoteMultiaddr().String() } diff --git a/vendor/github.com/libp2p/go-libp2p/p2p/protocol/identify/obsaddr.go b/vendor/github.com/libp2p/go-libp2p/p2p/protocol/identify/obsaddr.go index 685e5f10..12e22860 100644 --- a/vendor/github.com/libp2p/go-libp2p/p2p/protocol/identify/obsaddr.go +++ b/vendor/github.com/libp2p/go-libp2p/p2p/protocol/identify/obsaddr.go @@ -5,8 +5,9 @@ import ( "sync" "time" - net "github.com/libp2p/go-libp2p-net" - pstore "github.com/libp2p/go-libp2p-peerstore" + "github.com/libp2p/go-libp2p-core/network" + "github.com/libp2p/go-libp2p-core/peerstore" + ma "github.com/multiformats/go-multiaddr" ) @@ -16,7 +17,7 @@ var GCInterval = 10 * time.Minute type observation struct { seenTime time.Time - connDirection net.Direction + connDirection network.Direction } // ObservedAddr is an entry for an address reported by our peers. @@ -38,7 +39,7 @@ func (oa *ObservedAddr) activated(ttl time.Duration) bool { type newObservation struct { observed, local, observer ma.Multiaddr - direction net.Direction + direction network.Direction } // ObservedAddrSet keeps track of a set of ObservedAddrs @@ -57,7 +58,7 @@ type ObservedAddrSet struct { func NewObservedAddrSet(ctx context.Context) *ObservedAddrSet { oas := &ObservedAddrSet{ addrs: make(map[string][]*ObservedAddr), - ttl: pstore.OwnObservedAddrTTL, + ttl: peerstore.OwnObservedAddrTTL, wch: make(chan newObservation, 16), } go oas.worker(ctx) @@ -111,7 +112,7 @@ func (oas *ObservedAddrSet) Addrs() (addrs []ma.Multiaddr) { } func (oas *ObservedAddrSet) Add(observed, local, observer ma.Multiaddr, - direction net.Direction) { + direction network.Direction) { select { case oas.wch <- newObservation{observed: observed, local: local, observer: observer, direction: direction}: default: @@ -168,7 +169,7 @@ func (oas *ObservedAddrSet) gc() { } func (oas *ObservedAddrSet) doAdd(observed, local, observer ma.Multiaddr, - direction net.Direction) { + direction network.Direction) { now := time.Now() observerString := observerGroup(observer) diff --git a/vendor/github.com/libp2p/go-libp2p/p2p/protocol/ping/ping.go b/vendor/github.com/libp2p/go-libp2p/p2p/protocol/ping/ping.go index b76133cc..9d9b571e 100644 --- a/vendor/github.com/libp2p/go-libp2p/p2p/protocol/ping/ping.go +++ b/vendor/github.com/libp2p/go-libp2p/p2p/protocol/ping/ping.go @@ -9,9 +9,9 @@ import ( u "github.com/ipfs/go-ipfs-util" logging "github.com/ipfs/go-log" - host "github.com/libp2p/go-libp2p-host" - inet "github.com/libp2p/go-libp2p-net" - peer "github.com/libp2p/go-libp2p-peer" + "github.com/libp2p/go-libp2p-core/host" + "github.com/libp2p/go-libp2p-core/network" + "github.com/libp2p/go-libp2p-core/peer" ) var log = logging.Logger("ping") @@ -32,7 +32,7 @@ func NewPingService(h host.Host) *PingService { return ps } -func (p *PingService) PingHandler(s inet.Stream) { +func (p *PingService) PingHandler(s network.Stream) { buf := make([]byte, PingSize) errCh := make(chan error, 1) @@ -71,45 +71,65 @@ func (p *PingService) PingHandler(s inet.Stream) { } } -func (ps *PingService) Ping(ctx context.Context, p peer.ID) (<-chan time.Duration, error) { +// Result is a result of a ping attempt, either an RTT or an error. +type Result struct { + RTT time.Duration + Error error +} + +func (ps *PingService) Ping(ctx context.Context, p peer.ID) <-chan Result { return Ping(ctx, ps.Host, p) } -func Ping(ctx context.Context, h host.Host, p peer.ID) (<-chan time.Duration, error) { +// Ping pings the remote peer until the context is canceled, returning a stream +// of RTTs or errors. +func Ping(ctx context.Context, h host.Host, p peer.ID) <-chan Result { s, err := h.NewStream(ctx, p, ID) if err != nil { - return nil, err + ch := make(chan Result, 1) + ch <- Result{Error: err} + close(ch) + return ch } - out := make(chan time.Duration) + ctx, cancel := context.WithCancel(ctx) + + out := make(chan Result) go func() { defer close(out) - defer s.Reset() - for { + defer cancel() + + for ctx.Err() == nil { + var res Result + res.RTT, res.Error = ping(s) + + // canceled, ignore everything. + if ctx.Err() != nil { + return + } + + // No error, record the RTT. + if res.Error == nil { + h.Peerstore().RecordLatency(p, res.RTT) + } + select { + case out <- res: case <-ctx.Done(): return - default: - t, err := ping(s) - if err != nil { - log.Debugf("ping error: %s", err) - return - } - - h.Peerstore().RecordLatency(p, t) - select { - case out <- t: - case <-ctx.Done(): - return - } } } }() + go func() { + // forces the ping to abort. + <-ctx.Done() + s.Reset() + }() - return out, nil + return out } -func ping(s inet.Stream) (time.Duration, error) { +func ping(s network.Stream) (time.Duration, error) { buf := make([]byte, PingSize) u.NewTimeSeededRand().Read(buf) diff --git a/vendor/github.com/libp2p/go-maddr-filter/.travis.yml b/vendor/github.com/libp2p/go-maddr-filter/.travis.yml index 4cfe98c2..5163d693 100644 --- a/vendor/github.com/libp2p/go-maddr-filter/.travis.yml +++ b/vendor/github.com/libp2p/go-maddr-filter/.travis.yml @@ -10,7 +10,6 @@ env: global: - GOTFLAGS="-race" matrix: - - BUILD_DEPTYPE=gx - BUILD_DEPTYPE=gomod @@ -24,7 +23,6 @@ script: cache: directories: - - $GOPATH/src/gx - $GOPATH/pkg/mod - $HOME/.cache/go-build diff --git a/vendor/github.com/libp2p/go-maddr-filter/Makefile b/vendor/github.com/libp2p/go-maddr-filter/Makefile deleted file mode 100644 index 20619413..00000000 --- a/vendor/github.com/libp2p/go-maddr-filter/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -gx: - go get github.com/whyrusleeping/gx - go get github.com/whyrusleeping/gx-go - -deps: gx - gx --verbose install --global - gx-go rewrite - -publish: - gx-go rewrite --undo - diff --git a/vendor/github.com/libp2p/go-maddr-filter/README.md b/vendor/github.com/libp2p/go-maddr-filter/README.md index f6787a2b..db9ba5e0 100644 --- a/vendor/github.com/libp2p/go-maddr-filter/README.md +++ b/vendor/github.com/libp2p/go-maddr-filter/README.md @@ -1,13 +1,14 @@ go-maddr-filter ================== -[![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](http://ipn.io) -[![](https://img.shields.io/badge/project-IPFS-blue.svg?style=flat-square)](http://libp2p.io/) -[![](https://img.shields.io/badge/freenode-%23ipfs-blue.svg?style=flat-square)](http://webchat.freenode.net/?channels=%23ipfs) +[![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](https://protocol.ai) +[![](https://img.shields.io/badge/project-libp2p-yellow.svg?style=flat-square)](https://libp2p.io/) +[![](https://img.shields.io/badge/freenode-%23libp2p-yellow.svg?style=flat-square)](http://webchat.freenode.net/?channels=%23libp2p) [![Coverage Status](https://coveralls.io/repos/github/libp2p/go-maddr-filter/badge.svg?branch=master)](https://coveralls.io/github/libp2p/go-maddr-filter?branch=master) [![Travis CI](https://travis-ci.org/libp2p/go-maddr-filter.svg?branch=master)](https://travis-ci.org/libp2p/go-maddr-filter) +[![Discourse posts](https://img.shields.io/discourse/https/discuss.libp2p.io/posts.svg)](https://discuss.libp2p.io) -> A library to perform filtering of multiaddrs. +> A library to perform filtering of [multiaddrs](https://github.com/multiformats/multiaddr). ## Table of Contents @@ -32,12 +33,20 @@ f := NewFilters() // filter out addresses on the 192.168 subnet _, ipnet, _ := net.ParseCIDR("192.168.0.0/16") -f.AddDialFilter(ipnet) - +f.AddFilter(ipnet, ActionDeny) // check if an address is blocked lanaddr, _ := ma.NewMultiaddr("/ip4/192.168.0.17/tcp/4050") fmt.Println(f.AddrBlocked(lanaddr)) + +// the default for a filter is accept, but we can change that +f.RemoveLiteral(ipnet) +f.DefaultAction = ActionDeny +fmt.Println(f.AddrBlocked(lanaddr)) + +// we can now allow the local LAN, denying everything else +f.AddFilter(ipnet, ActionAccept) +fmt.Println(f.AddrBlocked(lanaddr)) ``` ## Contribute @@ -49,3 +58,7 @@ Small note: If editing the Readme, please conform to the [standard-readme](https ## License MIT © Jeromy Johnson + +--- + +The last gx published version of this module was: 1.1.13: QmT6C5ebDy92zyRzdmSNyda5q7zkNXy68X47RDJiHpvaxd diff --git a/vendor/github.com/libp2p/go-maddr-filter/filter.go b/vendor/github.com/libp2p/go-maddr-filter/filter.go index 88f9792e..a555df51 100644 --- a/vendor/github.com/libp2p/go-maddr-filter/filter.go +++ b/vendor/github.com/libp2p/go-maddr-filter/filter.go @@ -8,60 +8,167 @@ import ( manet "github.com/multiformats/go-multiaddr-net" ) +// Action is an enum modelling all possible filter actions. +type Action int32 + +const ( + ActionNone Action = iota // zero value. + ActionAccept + ActionDeny +) + +type filterEntry struct { + f net.IPNet + action Action +} + +// Filters is a structure representing a collection of accept/deny +// net.IPNet filters, together with the DefaultAction flag, which +// represents the default filter policy. +// +// Note that the last policy added to the Filters is authoritative. type Filters struct { + DefaultAction Action + mu sync.RWMutex - filters map[string]*net.IPNet + filters []*filterEntry } +// NewFilters constructs and returns a new set of net.IPNet filters. +// By default, the new filter accepts all addresses. func NewFilters() *Filters { return &Filters{ - filters: make(map[string]*net.IPNet), + DefaultAction: ActionAccept, + filters: make([]*filterEntry, 0), + } +} + +func (fs *Filters) find(ipnet net.IPNet) (int, *filterEntry) { + s := ipnet.String() + for idx, ft := range fs.filters { + if ft.f.String() == s { + return idx, ft + } } + return -1, nil } +// AddDialFilter adds a deny rule to this Filters set. Hosts +// matching the given net.IPNet filter will be denied, unless +// another rule is added which states that they should be accepted. +// +// No effort is made to prevent duplication of filters, or to simplify +// the filters list. +// +// Deprecated: Use AddFilter(). func (fs *Filters) AddDialFilter(f *net.IPNet) { + fs.AddFilter(*f, ActionDeny) +} + +// AddFilter adds a rule to the Filters set, enforcing the desired action for +// the provided IPNet mask. +func (fs *Filters) AddFilter(ipnet net.IPNet, action Action) { + fs.mu.Lock() + defer fs.mu.Unlock() + + if _, f := fs.find(ipnet); f != nil { + f.action = action + } else { + fs.filters = append(fs.filters, &filterEntry{ipnet, action}) + } +} + +// RemoveLiteral removes the first filter associated with the supplied IPNet, +// returning whether something was removed or not. It makes no distinction +// between whether the rule is an accept or a deny. +// +// Deprecated: use RemoveLiteral() instead. +func (fs *Filters) Remove(ipnet *net.IPNet) (removed bool) { + return fs.RemoveLiteral(*ipnet) +} + +// RemoveLiteral removes the first filter associated with the supplied IPNet, +// returning whether something was removed or not. It makes no distinction +// between whether the rule is an accept or a deny. +func (fs *Filters) RemoveLiteral(ipnet net.IPNet) (removed bool) { fs.mu.Lock() defer fs.mu.Unlock() - fs.filters[f.String()] = f + + if idx, _ := fs.find(ipnet); idx != -1 { + fs.filters = append(fs.filters[:idx], fs.filters[idx+1:]...) + return true + } + return false } -func (f *Filters) AddrBlocked(a ma.Multiaddr) bool { +// AddrBlocked parses a ma.Multiaddr and, if a valid netip is found, it applies the +// Filter set rules, returning true if the given address should be denied, and false if +// the given address is accepted. +// +// If a parsing error occurs, or no filter matches, the Filters' +// default is returned. +// +// TODO: currently, the last filter to match wins always, but it shouldn't be that way. +// Instead, the highest-specific last filter should win; that way more specific filters +// override more general ones. +func (fs *Filters) AddrBlocked(a ma.Multiaddr) (deny bool) { maddr := ma.Split(a) if len(maddr) == 0 { - return false + return fs.DefaultAction == ActionDeny } netaddr, err := manet.ToNetAddr(maddr[0]) if err != nil { - // if we can't parse it, it's probably not blocked - return false + // if we can't parse it, it's probably not blocked. + return fs.DefaultAction == ActionDeny } netip := net.ParseIP(netaddr.String()) if netip == nil { - return false + return fs.DefaultAction == ActionDeny } - f.mu.RLock() - defer f.mu.RUnlock() - for _, ft := range f.filters { - if ft.Contains(netip) { - return true + fs.mu.RLock() + defer fs.mu.RUnlock() + + action := fs.DefaultAction + for _, ft := range fs.filters { + if ft.f.Contains(netip) { + action = ft.action } } - return false + + return action == ActionDeny +} + +// Filters returns the list of DENY net.IPNet masks. For backwards compatibility. +// +// A copy of the filters is made prior to returning, so the inner state is not exposed. +// +// Deprecated: Use FiltersForAction(). +func (fs *Filters) Filters() (result []*net.IPNet) { + ffa := fs.FiltersForAction(ActionDeny) + for _, res := range ffa { + res := res // allocate a new copy + result = append(result, &res) + } + return result } -func (f *Filters) Filters() []*net.IPNet { - var out []*net.IPNet - f.mu.RLock() - defer f.mu.RUnlock() - for _, ff := range f.filters { - out = append(out, ff) +func (fs *Filters) ActionForFilter(ipnet net.IPNet) (action Action, ok bool) { + if _, f := fs.find(ipnet); f != nil { + return f.action, true } - return out + return ActionNone, false } -func (f *Filters) Remove(ff *net.IPNet) { - f.mu.Lock() - defer f.mu.Unlock() - delete(f.filters, ff.String()) +// FiltersForAction returns the filters associated with the indicated action. +func (fs *Filters) FiltersForAction(action Action) (result []net.IPNet) { + fs.mu.RLock() + defer fs.mu.RUnlock() + + for _, ff := range fs.filters { + if ff.action == action { + result = append(result, ff.f) + } + } + return result } diff --git a/vendor/github.com/libp2p/go-maddr-filter/package.json b/vendor/github.com/libp2p/go-maddr-filter/package.json deleted file mode 100644 index bfb12114..00000000 --- a/vendor/github.com/libp2p/go-maddr-filter/package.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "author": "whyrusleeping", - "bugs": { - "url": "https://github.com/libp2p/go-maddr-filter" - }, - "gx": { - "dvcsimport": "github.com/libp2p/go-maddr-filter" - }, - "gxDependencies": [ - { - "author": "jbenet", - "hash": "Qmc85NSvmSG4Frn9Vb2cBc1rMyULH6D3TNVEfCzSKoUpip", - "name": "go-multiaddr-net", - "version": "1.7.2" - }, - { - "author": "multiformats", - "hash": "QmTZBfrPJmjWsCvHEtX5FE6KimVJhsJg5sBbqEFYf4UZtL", - "name": "go-multiaddr", - "version": "1.4.1" - } - ], - "gxVersion": "0.9.1", - "language": "go", - "license": "", - "name": "go-maddr-filter", - "releaseCmd": "git commit -a -m \"gx publish $VERSION\"", - "version": "1.1.13" -} - diff --git a/vendor/github.com/libp2p/go-mplex/.travis.yml b/vendor/github.com/libp2p/go-mplex/.travis.yml index 4cfe98c2..5163d693 100644 --- a/vendor/github.com/libp2p/go-mplex/.travis.yml +++ b/vendor/github.com/libp2p/go-mplex/.travis.yml @@ -10,7 +10,6 @@ env: global: - GOTFLAGS="-race" matrix: - - BUILD_DEPTYPE=gx - BUILD_DEPTYPE=gomod @@ -24,7 +23,6 @@ script: cache: directories: - - $GOPATH/src/gx - $GOPATH/pkg/mod - $HOME/.cache/go-build diff --git a/vendor/github.com/libp2p/go-mplex/Makefile b/vendor/github.com/libp2p/go-mplex/Makefile deleted file mode 100644 index 5c996090..00000000 --- a/vendor/github.com/libp2p/go-mplex/Makefile +++ /dev/null @@ -1,13 +0,0 @@ -all: deps - -gx: - go get github.com/whyrusleeping/gx - go get github.com/whyrusleeping/gx-go - -deps: gx - gx --verbose install --global - gx-go rewrite - -publish: - gx-go rewrite --undo - diff --git a/vendor/github.com/libp2p/go-mplex/README.md b/vendor/github.com/libp2p/go-mplex/README.md index e741b307..ff7cc708 100644 --- a/vendor/github.com/libp2p/go-mplex/README.md +++ b/vendor/github.com/libp2p/go-mplex/README.md @@ -1,6 +1,11 @@ # go-mplex -A super simple stream muxing library implementing [mplex](https://github.com/libp2p/mplex/). +[![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](https://protocol.ai) +[![](https://img.shields.io/badge/project-libp2p-yellow.svg?style=flat-square)](https://libp2p.io/) +[![](https://img.shields.io/badge/freenode-%23libp2p-yellow.svg?style=flat-square)](http://webchat.freenode.net/?channels=%23libp2p) +[![Discourse posts](https://img.shields.io/discourse/https/discuss.libp2p.io/posts.svg)](https://discuss.libp2p.io) + +A super simple [stream muxing](https://docs.libp2p.io/concepts/stream-multiplexing/) library implementing [mplex](https://github.com/libp2p/specs/tree/master/mplex). ## Usage @@ -15,3 +20,7 @@ os, _ := mplex.Accept() // echo back everything received io.Copy(os, os) ``` + +--- + +The last gx published version of this module was: 0.2.35: QmWGQQ6Tz8AdUpxktLf3zgnVN9Vy8fcWVezZJSU3ZmiANj diff --git a/vendor/github.com/libp2p/go-mplex/deadline.go b/vendor/github.com/libp2p/go-mplex/deadline.go new file mode 100644 index 00000000..dd2dfaf9 --- /dev/null +++ b/vendor/github.com/libp2p/go-mplex/deadline.go @@ -0,0 +1,80 @@ +// Copied from the go standard library. +// +// 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-BSD file. + +package multiplex + +import ( + "sync" + "time" +) + +// pipeDeadline is an abstraction for handling timeouts. +type pipeDeadline struct { + mu sync.Mutex // Guards timer and cancel + timer *time.Timer + cancel chan struct{} // Must be non-nil +} + +func makePipeDeadline() pipeDeadline { + return pipeDeadline{cancel: make(chan struct{})} +} + +// set sets the point in time when the deadline will time out. +// A timeout event is signaled by closing the channel returned by waiter. +// Once a timeout has occurred, the deadline can be refreshed by specifying a +// t value in the future. +// +// A zero value for t prevents timeout. +func (d *pipeDeadline) set(t time.Time) { + d.mu.Lock() + defer d.mu.Unlock() + + if d.timer != nil && !d.timer.Stop() { + <-d.cancel // Wait for the timer callback to finish and close cancel + } + d.timer = nil + + // Time is zero, then there is no deadline. + closed := isClosedChan(d.cancel) + if t.IsZero() { + if closed { + d.cancel = make(chan struct{}) + } + return + } + + // Time in the future, setup a timer to cancel in the future. + if dur := time.Until(t); dur > 0 { + if closed { + d.cancel = make(chan struct{}) + } + d.timer = time.AfterFunc(dur, func() { + close(d.cancel) + }) + return + } + + // Time in the past, so close immediately. + if !closed { + close(d.cancel) + } +} + +// wait returns a channel that is closed when the deadline is exceeded. +func (d *pipeDeadline) wait() chan struct{} { + d.mu.Lock() + defer d.mu.Unlock() + return d.cancel +} + +func isClosedChan(c <-chan struct{}) bool { + select { + case <-c: + return true + default: + return false + } +} diff --git a/vendor/github.com/libp2p/go-mplex/go.mod b/vendor/github.com/libp2p/go-mplex/go.mod index 9f8bc87b..8f9939fc 100644 --- a/vendor/github.com/libp2p/go-mplex/go.mod +++ b/vendor/github.com/libp2p/go-mplex/go.mod @@ -3,5 +3,5 @@ module github.com/libp2p/go-mplex require ( github.com/ipfs/go-log v0.0.1 github.com/libp2p/go-buffer-pool v0.0.1 - github.com/libp2p/go-stream-muxer v0.0.1 + github.com/libp2p/go-libp2p-core v0.0.1 ) diff --git a/vendor/github.com/libp2p/go-mplex/go.sum b/vendor/github.com/libp2p/go-mplex/go.sum index 996558a7..09699363 100644 --- a/vendor/github.com/libp2p/go-mplex/go.sum +++ b/vendor/github.com/libp2p/go-mplex/go.sum @@ -1,30 +1,77 @@ +github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= +github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32/go.mod h1:DrZx5ec/dmnfpw9KyYoQyYo7d0KEvTkk/5M/vbZjAr8= +github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= +github.com/btcsuite/btcutil v0.0.0-20190207003914-4c204d697803/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= +github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= +github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= +github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= +github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= +github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfmKFJ6tItnhQ67kU= +github.com/gxed/hashland/murmur3 v0.0.1/go.mod h1:KjXop02n4/ckmZSnY2+HKcLud/tcmvhST0bie/0lS48= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= github.com/ipfs/go-log v0.0.1 h1:9XTUN/rW64BCG1YhPK9Hoy3q8nr4gOmHHBpgFdfw6Lc= github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM= +github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8/go.mod h1:Ly/wlsjFq/qrU3Rar62tu1gASgGw6chQbSh/XgIIXCY= +github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= github.com/libp2p/go-buffer-pool v0.0.1 h1:9Rrn/H46cXjaA2HQ5Y8lyhOS1NhTkZ4yuEs2r3Eechg= github.com/libp2p/go-buffer-pool v0.0.1/go.mod h1:xtyIz9PMobb13WaxR6Zo1Pd1zXJKYg0a8KiIvDp3TzQ= -github.com/libp2p/go-stream-muxer v0.0.1 h1:Ce6e2Pyu+b5MC1k3eeFtAax0pW4gc6MosYSLV05UeLw= -github.com/libp2p/go-stream-muxer v0.0.1/go.mod h1:bAo8x7YkSpadMTbtTaxGVHWUQsR/l5MEaHbKaliuT14= +github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZxBdp967ls1g+k8= +github.com/libp2p/go-libp2p-core v0.0.1 h1:HSTZtFIq/W5Ue43Zw+uWZyy2Vl5WtF0zDjKN8/DT/1I= +github.com/libp2p/go-libp2p-core v0.0.1/go.mod h1:g/VxnTZ/1ygHxH3dKok7Vno1VfpvGcGip57wjTU4fco= github.com/mattn/go-colorable v0.1.1 h1:G1f5SKeVxmagw/IyvzvtZE4Gybcc4Tr1tf7I8z0XgOg= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= github.com/mattn/go-isatty v0.0.5 h1:tHXDdz1cpzGaovsTB+TVB8q90WEokoVmfMqoVcrLUgw= github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= +github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= +github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= +github.com/mr-tron/base58 v1.1.1/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= +github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= +github.com/multiformats/go-multiaddr v0.0.2/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= +github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs= +github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/opentracing/opentracing-go v1.0.2 h1:3jA2P6O1F9UOrWVpwrIo17pu01KWvNWg4X946/Y5Zwg= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= 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/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a/go.mod h1:7AyxJNCJ7SBZ1MfVQCWD6Uqo2oubI2Eq2y2eqf+A5r0= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572/go.mod h1:w0SWMsp6j9O/dk4/ZpIhL+3CkG8ofA2vuv7k+ltqUMc= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc h1:9lDbC6Rz4bwmou+oE6Dt4Cb2BGMur5eR/GYptkKUVHo= github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc/go.mod h1:bopw91TMyo8J3tvftk8xmU2kPmlrt4nScJQZU2hE5EM= +golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190227160552-c95aed5357e7 h1:C2F/nMkR/9sfUTpvR3QrjBuTdvMUC/cFajkphs1YLQo= golang.org/x/net v0.0.0-20190227160552-c95aed5357e7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/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-20190219092855-153ac476189d/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223 h1:DH4skfRX4EBpamg7iV4ZlCpblAHI6s6TDM39bFZumv8= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/vendor/github.com/libp2p/go-mplex/multiplex.go b/vendor/github.com/libp2p/go-mplex/multiplex.go index 0442616c..1c75baa7 100644 --- a/vendor/github.com/libp2p/go-mplex/multiplex.go +++ b/vendor/github.com/libp2p/go-mplex/multiplex.go @@ -34,6 +34,30 @@ var ErrTwoInitiators = errors.New("two initiators") // In this case, we close the connection to be safe. var ErrInvalidState = errors.New("received an unexpected message from the peer") +var errTimeout = timeout{} +var errStreamClosed = errors.New("stream closed") + +var ( + NewStreamTimeout = time.Minute + ResetStreamTimeout = 2 * time.Minute + + WriteCoalesceDelay = 100 * time.Microsecond +) + +type timeout struct{} + +func (_ timeout) Error() string { + return "i/o deadline exceeded" +} + +func (_ timeout) Temporary() bool { + return true +} + +func (_ timeout) Timeout() bool { + return true +} + // +1 for initiator const ( newStreamTag = 0 @@ -54,7 +78,9 @@ type Multiplex struct { shutdownErr error shutdownLock sync.Mutex - wrTkn chan struct{} + writeCh chan []byte + writeTimer *time.Timer + writeTimerFired bool nstreams chan *Stream @@ -65,30 +91,32 @@ type Multiplex struct { // NewMultiplex creates a new multiplexer session. func NewMultiplex(con net.Conn, initiator bool) *Multiplex { mp := &Multiplex{ - con: con, - initiator: initiator, - buf: bufio.NewReader(con), - channels: make(map[streamID]*Stream), - closed: make(chan struct{}), - shutdown: make(chan struct{}), - wrTkn: make(chan struct{}, 1), - nstreams: make(chan *Stream, 16), + con: con, + initiator: initiator, + buf: bufio.NewReader(con), + channels: make(map[streamID]*Stream), + closed: make(chan struct{}), + shutdown: make(chan struct{}), + writeCh: make(chan []byte, 16), + writeTimer: time.NewTimer(0), + nstreams: make(chan *Stream, 16), } go mp.handleIncoming() - - mp.wrTkn <- struct{}{} + go mp.handleOutgoing() return mp } func (mp *Multiplex) newStream(id streamID, name string) (s *Stream) { s = &Stream{ - id: id, - name: name, - dataIn: make(chan []byte, 8), - reset: make(chan struct{}), - mp: mp, + id: id, + name: name, + dataIn: make(chan []byte, 8), + reset: make(chan struct{}), + rDeadline: makePipeDeadline(), + wDeadline: makePipeDeadline(), + mp: mp, } s.closedLocal, s.doCloseLocal = context.WithCancel(context.Background()) @@ -139,42 +167,117 @@ func (mp *Multiplex) IsClosed() bool { } } -func (mp *Multiplex) sendMsg(ctx context.Context, header uint64, data []byte) error { - select { - case tkn := <-mp.wrTkn: - defer func() { mp.wrTkn <- tkn }() - case <-ctx.Done(): - return ctx.Err() - } - - dl, hasDl := ctx.Deadline() - if hasDl { - if err := mp.con.SetWriteDeadline(dl); err != nil { - return err - } - } +func (mp *Multiplex) sendMsg(done <-chan struct{}, header uint64, data []byte) error { buf := pool.Get(len(data) + 20) - defer pool.Put(buf) n := 0 n += binary.PutUvarint(buf[n:], header) n += binary.PutUvarint(buf[n:], uint64(len(data))) n += copy(buf[n:], data) - written, err := mp.con.Write(buf[:n]) - if err != nil && written > 0 { - // Bail. We've written partial message and can't do anything - // about this. - mp.con.Close() + select { + case mp.writeCh <- buf[:n]: + return nil + case <-mp.shutdown: + return ErrShutdown + case <-done: + return errTimeout + } +} + +func (mp *Multiplex) handleOutgoing() { + for { + select { + case <-mp.shutdown: + return + + case data := <-mp.writeCh: + // FIXME: https://github.com/libp2p/go-libp2p/issues/644 + // write coalescing disabled until this can be fixed. + //err := mp.writeMsg(data) + err := mp.doWriteMsg(data) + pool.Put(data) + if err != nil { + // the connection is closed by this time + log.Warningf("error writing data: %s", err.Error()) + return + } + } + } +} + +func (mp *Multiplex) writeMsg(data []byte) error { + if len(data) >= 512 { + err := mp.doWriteMsg(data) + pool.Put(data) return err } - if hasDl { - // only return this error if we don't *already* have an error from the write. - if err2 := mp.con.SetWriteDeadline(time.Time{}); err == nil && err2 != nil { - return err2 + buf := pool.Get(4096) + defer pool.Put(buf) + + n := copy(buf, data) + pool.Put(data) + + if !mp.writeTimerFired { + if !mp.writeTimer.Stop() { + <-mp.writeTimer.C } } + mp.writeTimer.Reset(WriteCoalesceDelay) + mp.writeTimerFired = false + + for { + select { + case data = <-mp.writeCh: + wr := copy(buf[n:], data) + if wr < len(data) { + // we filled the buffer, send it + err := mp.doWriteMsg(buf) + if err != nil { + pool.Put(data) + return err + } + + if len(data)-wr >= 512 { + // the remaining data is not a small write, send it + err := mp.doWriteMsg(data[wr:]) + pool.Put(data) + return err + } + + n = copy(buf, data[wr:]) + + // we've written some, reset the timer to coalesce the rest + if !mp.writeTimer.Stop() { + <-mp.writeTimer.C + } + mp.writeTimer.Reset(WriteCoalesceDelay) + } else { + n += wr + } + + pool.Put(data) + + case <-mp.writeTimer.C: + mp.writeTimerFired = true + return mp.doWriteMsg(buf[:n]) + + case <-mp.shutdown: + return ErrShutdown + } + } +} + +func (mp *Multiplex) doWriteMsg(data []byte) error { + if mp.isShutdown() { + return ErrShutdown + } + + _, err := mp.con.Write(data) + if err != nil { + mp.closeNoWait() + } return err } @@ -214,7 +317,10 @@ func (mp *Multiplex) NewNamedStream(name string) (*Stream, error) { mp.channels[s.id] = s mp.chLock.Unlock() - err := mp.sendMsg(context.Background(), header, []byte(name)) + ctx, cancel := context.WithTimeout(context.Background(), NewStreamTimeout) + defer cancel() + + err := mp.sendMsg(ctx.Done(), header, []byte(name)) if err != nil { return nil, err } @@ -316,23 +422,21 @@ func (mp *Multiplex) handleIncoming() { } msch.clLock.Lock() - // Honestly, this check should never be true... It means we've leaked. - // However, this is an error on *our* side so we shouldn't just bail. isClosed := msch.isClosed() - if isClosed && msch.closedRemote { - msch.clLock.Unlock() - log.Errorf("leaked a completely closed stream") - continue - } if !msch.closedRemote { close(msch.reset) + msch.closedRemote = true + } + + if !isClosed { + msch.doCloseLocal() } - msch.closedRemote = true - msch.doCloseLocal() msch.clLock.Unlock() + msch.cancelDeadlines() + mp.chLock.Lock() delete(mp.channels, ch) mp.chLock.Unlock() @@ -358,6 +462,7 @@ func (mp *Multiplex) handleIncoming() { msch.clLock.Unlock() if cleanup { + msch.cancelDeadlines() mp.chLock.Lock() delete(mp.channels, ch) mp.chLock.Unlock() @@ -370,7 +475,7 @@ func (mp *Multiplex) handleIncoming() { // This is a perfectly valid case when we reset // and forget about the stream. log.Debugf("message for non-existant stream, dropping data: %d", ch) - go mp.sendMsg(context.Background(), ch.header(resetTag), nil) + // go mp.sendResetMsg(ch.header(resetTag), false) continue } @@ -381,8 +486,8 @@ func (mp *Multiplex) handleIncoming() { // closed stream, return b pool.Put(b) - log.Errorf("Received data from remote after stream was closed by them. (len = %d)", len(b)) - go mp.sendMsg(context.Background(), msch.id.header(resetTag), nil) + log.Warningf("Received data from remote after stream was closed by them. (len = %d)", len(b)) + // go mp.sendResetMsg(msch.id.header(resetTag), false) continue } @@ -415,6 +520,30 @@ func (mp *Multiplex) handleIncoming() { } } +func (mp *Multiplex) isShutdown() bool { + select { + case <-mp.shutdown: + return true + default: + return false + } +} + +func (mp *Multiplex) sendResetMsg(header uint64, hard bool) { + ctx, cancel := context.WithTimeout(context.Background(), ResetStreamTimeout) + defer cancel() + + err := mp.sendMsg(ctx.Done(), header, nil) + if err != nil && !mp.isShutdown() { + if hard { + log.Warningf("error sending reset message: %s; killing connection", err.Error()) + mp.Close() + } else { + log.Debugf("error sending reset message: %s", err.Error()) + } + } +} + func (mp *Multiplex) readNextHeader() (uint64, uint64, error) { h, err := binary.ReadUvarint(mp.buf) if err != nil { @@ -452,3 +581,11 @@ func (mp *Multiplex) readNext() ([]byte, error) { return buf[:n], nil } + +func isFatalNetworkError(err error) bool { + nerr, ok := err.(net.Error) + if ok { + return !(nerr.Timeout() || nerr.Temporary()) + } + return false +} diff --git a/vendor/github.com/libp2p/go-mplex/package.json b/vendor/github.com/libp2p/go-mplex/package.json deleted file mode 100644 index 3184646f..00000000 --- a/vendor/github.com/libp2p/go-mplex/package.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "author": "whyrusleeping", - "bugs": { - "url": "https://github.com/libp2p/go-mplex" - }, - "gx": { - "dvcsimport": "github.com/libp2p/go-mplex" - }, - "gxDependencies": [ - { - "hash": "QmbkT7eMTyXfpeyB3ZMxxcxg7XH8t6uXp49jqzz4HB7BGF", - "name": "go-log", - "version": "1.5.9" - }, - { - "author": "Stebalien", - "hash": "QmQDvJoB6aJWN3sjr3xsgXqKCXf4jU5zdMXpDMsBkYVNqa", - "name": "go-buffer-pool", - "version": "0.1.3" - }, - { - "author": "whyrusleeping", - "hash": "QmVtV1y2e8W4eQgzsP6qfSpCCZ6zWYE4m6NzJjB7iswwrT", - "name": "go-stream-muxer", - "version": "3.1.0" - } - ], - "gxVersion": "0.7.0", - "language": "go", - "license": "MIT", - "name": "go-mplex", - "releaseCmd": "git commit -a -m \"gx publish $VERSION\"", - "version": "0.2.35" -} - diff --git a/vendor/github.com/libp2p/go-mplex/stream.go b/vendor/github.com/libp2p/go-mplex/stream.go index 910a9fd8..4004ed12 100644 --- a/vendor/github.com/libp2p/go-mplex/stream.go +++ b/vendor/github.com/libp2p/go-mplex/stream.go @@ -7,8 +7,9 @@ import ( "sync" "time" + "github.com/libp2p/go-libp2p-core/mux" + pool "github.com/libp2p/go-buffer-pool" - streammux "github.com/libp2p/go-stream-muxer" ) // streamID is a convenience type for operating on stream IDs @@ -38,8 +39,7 @@ type Stream struct { // for later memory pool freeing exbuf []byte - wDeadline time.Time - rDeadline time.Time + rDeadline, wDeadline pipeDeadline clLock sync.Mutex closedRemote bool @@ -56,18 +56,25 @@ func (s *Stream) Name() string { return s.name } -func (s *Stream) waitForData(ctx context.Context) error { - if !s.rDeadline.IsZero() { - dctx, cancel := context.WithDeadline(ctx, s.rDeadline) - defer cancel() - ctx = dctx +// tries to preload pending data +func (s *Stream) preloadData() { + select { + case read, ok := <-s.dataIn: + if !ok { + return + } + s.extra = read + s.exbuf = read + default: } +} +func (s *Stream) waitForData() error { select { case <-s.reset: // This is the only place where it's safe to return these. s.returnBuffers() - return streammux.ErrReset + return mux.ErrReset case read, ok := <-s.dataIn: if !ok { return io.EOF @@ -75,8 +82,8 @@ func (s *Stream) waitForData(ctx context.Context) error { s.extra = read s.exbuf = read return nil - case <-ctx.Done(): - return ctx.Err() + case <-s.rDeadline.wait(): + return errTimeout } } @@ -103,21 +110,31 @@ func (s *Stream) returnBuffers() { } func (s *Stream) Read(b []byte) (int, error) { + select { + case <-s.reset: + return 0, mux.ErrReset + default: + } if s.extra == nil { - err := s.waitForData(context.Background()) + err := s.waitForData() if err != nil { return 0, err } } - n := copy(b, s.extra) - if n < len(s.extra) { - s.extra = s.extra[n:] - } else { - if s.exbuf != nil { - pool.Put(s.exbuf) + n := 0 + for s.extra != nil && n < len(b) { + read := copy(b[n:], s.extra) + n += read + if read < len(s.extra) { + s.extra = s.extra[read:] + } else { + if s.exbuf != nil { + pool.Put(s.exbuf) + } + s.extra = nil + s.exbuf = nil + s.preloadData() } - s.extra = nil - s.exbuf = nil } return n, nil } @@ -146,19 +163,7 @@ func (s *Stream) write(b []byte) (int, error) { return 0, errors.New("cannot write to closed stream") } - wDeadlineCtx, cleanup := func(s *Stream) (context.Context, context.CancelFunc) { - if s.wDeadline.IsZero() { - return s.closedLocal, nil - } else { - return context.WithDeadline(s.closedLocal, s.wDeadline) - } - }(s) - - err := s.mp.sendMsg(wDeadlineCtx, s.id.header(messageTag), b) - - if cleanup != nil { - cleanup() - } + err := s.mp.sendMsg(s.wDeadline.wait(), s.id.header(messageTag), b) if err != nil { if err == context.Canceled { @@ -175,7 +180,10 @@ func (s *Stream) isClosed() bool { } func (s *Stream) Close() error { - err := s.mp.sendMsg(context.Background(), s.id.header(closeTag), nil) + ctx, cancel := context.WithTimeout(context.Background(), ResetStreamTimeout) + defer cancel() + + err := s.mp.sendMsg(ctx.Done(), s.id.header(closeTag), nil) if s.isClosed() { return nil @@ -188,31 +196,43 @@ func (s *Stream) Close() error { s.doCloseLocal() if remote { + s.cancelDeadlines() s.mp.chLock.Lock() delete(s.mp.channels, s.id) s.mp.chLock.Unlock() } + if err != nil && !s.mp.isShutdown() { + log.Warningf("Error closing stream: %s; killing connection", err.Error()) + s.mp.Close() + } + return err } func (s *Stream) Reset() error { s.clLock.Lock() - isClosed := s.isClosed() - if s.closedRemote && isClosed { + + // Don't reset when fully closed. + if s.closedRemote && s.isClosed() { s.clLock.Unlock() return nil } - if !s.closedRemote { - close(s.reset) - // We generally call this to tell the other side to go away. No point in waiting around. - go s.mp.sendMsg(context.Background(), s.id.header(resetTag), nil) + // Don't reset twice. + select { + case <-s.reset: + s.clLock.Unlock() + return nil + default: } + close(s.reset) s.doCloseLocal() - s.closedRemote = true + s.cancelDeadlines() + + go s.mp.sendResetMsg(s.id.header(resetTag), true) s.clLock.Unlock() @@ -223,18 +243,50 @@ func (s *Stream) Reset() error { return nil } +func (s *Stream) cancelDeadlines() { + s.rDeadline.set(time.Time{}) + s.wDeadline.set(time.Time{}) +} + func (s *Stream) SetDeadline(t time.Time) error { - s.rDeadline = t - s.wDeadline = t + s.clLock.Lock() + defer s.clLock.Unlock() + + if s.closedRemote && s.isClosed() { + return errStreamClosed + } + + if !s.closedRemote { + s.rDeadline.set(t) + } + + if !s.isClosed() { + s.wDeadline.set(t) + } + return nil } func (s *Stream) SetReadDeadline(t time.Time) error { - s.rDeadline = t + s.clLock.Lock() + defer s.clLock.Unlock() + + if s.closedRemote { + return errStreamClosed + } + + s.rDeadline.set(t) return nil } func (s *Stream) SetWriteDeadline(t time.Time) error { - s.wDeadline = t + s.clLock.Lock() + defer s.clLock.Unlock() + + if s.isClosed() { + return errStreamClosed + } + + s.wDeadline.set(t) return nil } diff --git a/vendor/github.com/libp2p/go-msgio/chan.go b/vendor/github.com/libp2p/go-msgio/chan.go index 4e5183f5..571393c1 100644 --- a/vendor/github.com/libp2p/go-msgio/chan.go +++ b/vendor/github.com/libp2p/go-msgio/chan.go @@ -38,9 +38,6 @@ func (s *Chan) ReadFromWithPool(r io.Reader, p *pool.BufferPool) { // ReadFrom wraps the given io.Reader with a msgio.Reader, reads all // messages, ands sends them down the channel. func (s *Chan) readFrom(mr Reader) { - // single reader, no need for Mutex - mr.(*reader).lock = new(nullLocker) - Loop: for { buf, err := mr.ReadMsg() @@ -74,8 +71,6 @@ func (s *Chan) WriteTo(w io.Writer) { // if bottleneck, cycle around a set of buffers mw := NewWriter(w) - // single writer, no need for Mutex - mw.(*writer).lock = new(nullLocker) Loop: for { select { diff --git a/vendor/github.com/libp2p/go-msgio/msgio.go b/vendor/github.com/libp2p/go-msgio/msgio.go index 2a67025d..5e61142c 100644 --- a/vendor/github.com/libp2p/go-msgio/msgio.go +++ b/vendor/github.com/libp2p/go-msgio/msgio.go @@ -76,13 +76,20 @@ type ReadWriteCloser interface { type writer struct { W io.Writer - lock sync.Locker + pool *pool.BufferPool + lock sync.Mutex } // NewWriter wraps an io.Writer with a msgio framed writer. The msgio.Writer // will write the length prefix of every message written. func NewWriter(w io.Writer) WriteCloser { - return &writer{W: w, lock: new(sync.Mutex)} + return NewWriterWithPool(w, pool.GlobalPool) +} + +// NewWriterWithPool is identical to NewWriter but allows the user to pass a +// custom buffer pool. +func NewWriterWithPool(w io.Writer, p *pool.BufferPool) WriteCloser { + return &writer{W: w, pool: p} } func (s *writer) Write(msg []byte) (int, error) { @@ -96,10 +103,13 @@ func (s *writer) Write(msg []byte) (int, error) { func (s *writer) WriteMsg(msg []byte) (err error) { s.lock.Lock() defer s.lock.Unlock() - if err := WriteLen(s.W, len(msg)); err != nil { - return err - } - _, err = s.W.Write(msg) + + buf := s.pool.Get(len(msg) + lengthSize) + NBO.PutUint32(buf, uint32(len(msg))) + copy(buf[lengthSize:], msg) + _, err = s.W.Write(buf) + s.pool.Put(buf) + return err } @@ -114,10 +124,10 @@ func (s *writer) Close() error { type reader struct { R io.Reader - lbuf []byte + lbuf [lengthSize]byte next int pool *pool.BufferPool - lock sync.Locker + lock sync.Mutex max int // the maximal message size (in bytes) this reader handles } @@ -128,20 +138,29 @@ func NewReader(r io.Reader) ReadCloser { return NewReaderWithPool(r, pool.GlobalPool) } -// NewReaderWithPool wraps an io.Reader with a msgio framed reader. The msgio.Reader -// will read whole messages at a time (using the length). Assumes an equivalent -// writer on the other side. It uses a given pool.BufferPool +// NewReaderSize is equivalent to NewReader but allows one to +// specify a max message size. +func NewReaderSize(r io.Reader, maxMessageSize int) ReadCloser { + return NewReaderSizeWithPool(r, maxMessageSize, pool.GlobalPool) +} + +// NewReaderWithPool is the same as NewReader but allows one to specify a buffer +// pool. func NewReaderWithPool(r io.Reader, p *pool.BufferPool) ReadCloser { + return NewReaderSizeWithPool(r, defaultMaxSize, p) +} + +// NewReaderWithPool is the same as NewReader but allows one to specify a buffer +// pool and a max message size. +func NewReaderSizeWithPool(r io.Reader, maxMessageSize int, p *pool.BufferPool) ReadCloser { if p == nil { panic("nil pool") } return &reader{ R: r, - lbuf: make([]byte, lengthSize), next: -1, pool: p, - lock: new(sync.Mutex), - max: defaultMaxSize, + max: maxMessageSize, } } @@ -156,7 +175,7 @@ func (s *reader) NextMsgLen() (int, error) { func (s *reader) nextMsgLen() (int, error) { if s.next == -1 { - n, err := ReadLen(s.R, s.lbuf) + n, err := ReadLen(s.R, s.lbuf[:]) if err != nil { return 0, err } diff --git a/vendor/github.com/libp2p/go-msgio/varint.go b/vendor/github.com/libp2p/go-msgio/varint.go index 5915af91..0872fc36 100644 --- a/vendor/github.com/libp2p/go-msgio/varint.go +++ b/vendor/github.com/libp2p/go-msgio/varint.go @@ -12,18 +12,21 @@ import ( type varintWriter struct { W io.Writer - lbuf []byte // for encoding varints - lock sync.Locker // for threadsafe writes + pool *pool.BufferPool + lock sync.Mutex // for threadsafe writes } // NewVarintWriter wraps an io.Writer with a varint msgio framed writer. // The msgio.Writer will write the length prefix of every message written // as a varint, using https://golang.org/pkg/encoding/binary/#PutUvarint func NewVarintWriter(w io.Writer) WriteCloser { + return NewVarintWriterWithPool(w, pool.GlobalPool) +} + +func NewVarintWriterWithPool(w io.Writer, p *pool.BufferPool) WriteCloser { return &varintWriter{ + pool: p, W: w, - lbuf: make([]byte, binary.MaxVarintLen64), - lock: new(sync.Mutex), } } @@ -39,12 +42,12 @@ func (s *varintWriter) WriteMsg(msg []byte) error { s.lock.Lock() defer s.lock.Unlock() - length := uint64(len(msg)) - n := binary.PutUvarint(s.lbuf, length) - if _, err := s.W.Write(s.lbuf[:n]); err != nil { - return err - } - _, err := s.W.Write(msg) + buf := s.pool.Get(len(msg) + binary.MaxVarintLen64) + n := binary.PutUvarint(buf, uint64(len(msg))) + n += copy(buf[n:], msg) + _, err := s.W.Write(buf[:n]) + s.pool.Put(buf) + return err } @@ -60,10 +63,9 @@ type varintReader struct { R io.Reader br io.ByteReader // for reading varints. - lbuf []byte next int pool *pool.BufferPool - lock sync.Locker + lock sync.Mutex max int // the maximal message size (in bytes) this reader handles } @@ -72,26 +74,33 @@ type varintReader struct { // Varints read according to https://golang.org/pkg/encoding/binary/#ReadUvarint // Assumes an equivalent writer on the other side. func NewVarintReader(r io.Reader) ReadCloser { - return NewVarintReaderWithPool(r, pool.GlobalPool) + return NewVarintReaderSize(r, defaultMaxSize) } -// NewVarintReaderWithPool wraps an io.Reader with a varint msgio framed reader. -// The msgio.Reader will read whole messages at a time (using the length). -// Varints read according to https://golang.org/pkg/encoding/binary/#ReadUvarint -// Assumes an equivalent writer on the other side. It uses a given -// pool.BufferPool. +// NewVarintReaderSize is equivalent to NewVarintReader but allows one to +// specify a max message size. +func NewVarintReaderSize(r io.Reader, maxMessageSize int) ReadCloser { + return NewVarintReaderSizeWithPool(r, maxMessageSize, pool.GlobalPool) +} + +// NewVarintReaderWithPool is the same as NewVarintReader but allows one to +// specify a buffer pool. func NewVarintReaderWithPool(r io.Reader, p *pool.BufferPool) ReadCloser { + return NewVarintReaderSizeWithPool(r, defaultMaxSize, p) +} + +// NewVarintReaderWithPool is the same as NewVarintReader but allows one to +// specify a buffer pool and a max message size. +func NewVarintReaderSizeWithPool(r io.Reader, maxMessageSize int, p *pool.BufferPool) ReadCloser { if p == nil { panic("nil pool") } return &varintReader{ R: r, br: &simpleByteReader{R: r}, - lbuf: make([]byte, binary.MaxVarintLen64), next: -1, pool: p, - lock: new(sync.Mutex), - max: defaultMaxSize, + max: maxMessageSize, } } @@ -168,15 +177,11 @@ func (s *varintReader) Close() error { type simpleByteReader struct { R io.Reader - buf []byte + buf [1]byte } func (r *simpleByteReader) ReadByte() (c byte, err error) { - if r.buf == nil { - r.buf = make([]byte, 1) - } - - if _, err := io.ReadFull(r.R, r.buf); err != nil { + if _, err := io.ReadFull(r.R, r.buf[:]); err != nil { return 0, err } return r.buf[0], nil diff --git a/vendor/github.com/whyrusleeping/go-smux-multiplex/.gitignore b/vendor/github.com/libp2p/go-stream-muxer-multistream/.gitignore similarity index 100% rename from vendor/github.com/whyrusleeping/go-smux-multiplex/.gitignore rename to vendor/github.com/libp2p/go-stream-muxer-multistream/.gitignore diff --git a/vendor/github.com/libp2p/go-libp2p-host/.travis.yml b/vendor/github.com/libp2p/go-stream-muxer-multistream/.travis.yml similarity index 89% rename from vendor/github.com/libp2p/go-libp2p-host/.travis.yml rename to vendor/github.com/libp2p/go-stream-muxer-multistream/.travis.yml index 4cfe98c2..5163d693 100644 --- a/vendor/github.com/libp2p/go-libp2p-host/.travis.yml +++ b/vendor/github.com/libp2p/go-stream-muxer-multistream/.travis.yml @@ -10,7 +10,6 @@ env: global: - GOTFLAGS="-race" matrix: - - BUILD_DEPTYPE=gx - BUILD_DEPTYPE=gomod @@ -24,7 +23,6 @@ script: cache: directories: - - $GOPATH/src/gx - $GOPATH/pkg/mod - $HOME/.cache/go-build diff --git a/vendor/github.com/libp2p/go-stream-muxer/LICENSE b/vendor/github.com/libp2p/go-stream-muxer-multistream/LICENSE similarity index 100% rename from vendor/github.com/libp2p/go-stream-muxer/LICENSE rename to vendor/github.com/libp2p/go-stream-muxer-multistream/LICENSE diff --git a/vendor/github.com/whyrusleeping/go-smux-yamux/Makefile b/vendor/github.com/libp2p/go-stream-muxer-multistream/Makefile similarity index 100% rename from vendor/github.com/whyrusleeping/go-smux-yamux/Makefile rename to vendor/github.com/libp2p/go-stream-muxer-multistream/Makefile diff --git a/vendor/github.com/whyrusleeping/go-smux-yamux/README.md b/vendor/github.com/libp2p/go-stream-muxer-multistream/README.md similarity index 84% rename from vendor/github.com/whyrusleeping/go-smux-yamux/README.md rename to vendor/github.com/libp2p/go-stream-muxer-multistream/README.md index cbf3e2e5..68bc2da6 100644 --- a/vendor/github.com/whyrusleeping/go-smux-yamux/README.md +++ b/vendor/github.com/libp2p/go-stream-muxer-multistream/README.md @@ -7,7 +7,7 @@ This is an implementation of the [go-stream-muxer](https://github.com/libp2p/go- ## Installation ```sh -go get -d github.com/whyrusleeping/go-smux-yamux -cd $GOPATH/src/github.com/whyrusleeping/go-smux-yamux +go get -d github.com/libp2p/go-stream-muxer-multistream +cd $GOPATH/src/github.com/libp2p/go-stream-muxer-multistream make deps ``` diff --git a/vendor/github.com/libp2p/go-stream-muxer-multistream/go.mod b/vendor/github.com/libp2p/go-stream-muxer-multistream/go.mod new file mode 100644 index 00000000..bce71707 --- /dev/null +++ b/vendor/github.com/libp2p/go-stream-muxer-multistream/go.mod @@ -0,0 +1,8 @@ +module github.com/libp2p/go-stream-muxer-multistream + +go 1.12 + +require ( + github.com/libp2p/go-libp2p-core v0.0.1 + github.com/multiformats/go-multistream v0.1.0 +) diff --git a/vendor/github.com/libp2p/go-testutil/go.sum b/vendor/github.com/libp2p/go-stream-muxer-multistream/go.sum similarity index 72% rename from vendor/github.com/libp2p/go-testutil/go.sum rename to vendor/github.com/libp2p/go-stream-muxer-multistream/go.sum index 6d30cad9..3c9d3258 100644 --- a/vendor/github.com/libp2p/go-testutil/go.sum +++ b/vendor/github.com/libp2p/go-stream-muxer-multistream/go.sum @@ -1,5 +1,4 @@ github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= -github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32 h1:qkOC5Gd33k54tobS36cXdAzJbeHaduLtnLQQwNoIi78= github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32/go.mod h1:DrZx5ec/dmnfpw9KyYoQyYo7d0KEvTkk/5M/vbZjAr8= github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= github.com/btcsuite/btcutil v0.0.0-20190207003914-4c204d697803/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= @@ -8,47 +7,45 @@ github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVa github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= -github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495 h1:6IyqGr3fnd0tM3YxipK27TUskaOVUjU2nG45yzwcQKY= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/gxed/hashland/keccakpg v0.0.1 h1:wrk3uMNaMxbXiHibbPO4S0ymqJMm41WiudyFSs7UnsU= github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfmKFJ6tItnhQ67kU= -github.com/gxed/hashland/murmur3 v0.0.1 h1:SheiaIt0sda5K+8FLz952/1iWS9zrnKsEJaOJu4ZbSc= github.com/gxed/hashland/murmur3 v0.0.1/go.mod h1:KjXop02n4/ckmZSnY2+HKcLud/tcmvhST0bie/0lS48= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= +github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8/go.mod h1:Ly/wlsjFq/qrU3Rar62tu1gASgGw6chQbSh/XgIIXCY= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= -github.com/libp2p/go-libp2p-crypto v0.0.1 h1:JNQd8CmoGTohO/akqrH16ewsqZpci2CbgYH/LmYl8gw= -github.com/libp2p/go-libp2p-crypto v0.0.1/go.mod h1:yJkNyDmO341d5wwXxDUGO0LykUVT72ImHNUqh5D/dBE= -github.com/libp2p/go-libp2p-peer v0.0.1 h1:0qwAOljzYewINrU+Kndoc+1jAL7vzY/oY2Go4DCGfyY= -github.com/libp2p/go-libp2p-peer v0.0.1/go.mod h1:nXQvOBbwVqoP+T5Y5nCjeH4sP9IX/J0AMzcDUVruVoo= -github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0OXOcUbGjvZxxijuBwbbmlSxLiuofa+g= +github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZxBdp967ls1g+k8= +github.com/libp2p/go-libp2p-core v0.0.1 h1:HSTZtFIq/W5Ue43Zw+uWZyy2Vl5WtF0zDjKN8/DT/1I= +github.com/libp2p/go-libp2p-core v0.0.1/go.mod h1:g/VxnTZ/1ygHxH3dKok7Vno1VfpvGcGip57wjTU4fco= github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= -github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16 h1:5W7KhL8HVF3XCFOweFD3BNESdnO8ewyYTFT2R+/b8FQ= github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= -github.com/mr-tron/base58 v1.1.0 h1:Y51FGVJ91WBqCEabAi5OPUz38eAx8DakuAm5svLcsfQ= github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= -github.com/multiformats/go-multiaddr v0.0.1 h1:/QUV3VBMDI6pi6xfiw7lr6xhDWWvQKn9udPn68kLSdY= -github.com/multiformats/go-multiaddr v0.0.1/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= -github.com/multiformats/go-multihash v0.0.1 h1:HHwN1K12I+XllBCrqKnhX949Orn4oawPkegHMu2vDqQ= +github.com/mr-tron/base58 v1.1.1/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= +github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= +github.com/multiformats/go-multiaddr v0.0.2/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= +github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs= github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= +github.com/multiformats/go-multistream v0.1.0 h1:UpO6jrsjqs46mqAK3n6wKRYFhugss9ArzbyUzU+4wkQ= +github.com/multiformats/go-multistream v0.1.0/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a/go.mod h1:7AyxJNCJ7SBZ1MfVQCWD6Uqo2oubI2Eq2y2eqf+A5r0= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572/go.mod h1:w0SWMsp6j9O/dk4/ZpIhL+3CkG8ofA2vuv7k+ltqUMc= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b h1:+/WWzjwW6gidDJnMKWLKLX1gxn7irUTF1fLpQovfQ5M= golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/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-20190219092855-153ac476189d h1:Z0Ahzd7HltpJtjAHHxX8QFP3j1yYgiuvjbjRzDj/KH0= golang.org/x/sys v0.0.0-20190219092855-153ac476189d/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= diff --git a/vendor/github.com/whyrusleeping/go-smux-multistream/multistream.go b/vendor/github.com/libp2p/go-stream-muxer-multistream/multistream.go similarity index 82% rename from vendor/github.com/whyrusleeping/go-smux-multistream/multistream.go rename to vendor/github.com/libp2p/go-stream-muxer-multistream/multistream.go index ad453a99..c7b58879 100644 --- a/vendor/github.com/whyrusleeping/go-smux-multistream/multistream.go +++ b/vendor/github.com/libp2p/go-stream-muxer-multistream/multistream.go @@ -7,7 +7,8 @@ import ( "net" "time" - smux "github.com/libp2p/go-stream-muxer" + "github.com/libp2p/go-libp2p-core/mux" + mss "github.com/multiformats/go-multistream" ) @@ -16,7 +17,7 @@ var DefaultNegotiateTimeout = time.Second * 60 type Transport struct { mux *mss.MultistreamMuxer - tpts map[string]smux.Transport + tpts map[string]mux.Multiplexer NegotiateTimeout time.Duration @@ -26,18 +27,18 @@ type Transport struct { func NewBlankTransport() *Transport { return &Transport{ mux: mss.NewMultistreamMuxer(), - tpts: make(map[string]smux.Transport), + tpts: make(map[string]mux.Multiplexer), NegotiateTimeout: DefaultNegotiateTimeout, } } -func (t *Transport) AddTransport(path string, tpt smux.Transport) { +func (t *Transport) AddTransport(path string, tpt mux.Multiplexer) { t.mux.AddHandler(path, nil) t.tpts[path] = tpt t.OrderPreference = append(t.OrderPreference, path) } -func (t *Transport) NewConn(nc net.Conn, isServer bool) (smux.Conn, error) { +func (t *Transport) NewConn(nc net.Conn, isServer bool) (mux.MuxedConn, error) { if t.NegotiateTimeout != 0 { if err := nc.SetDeadline(time.Now().Add(t.NegotiateTimeout)); err != nil { return nil, err diff --git a/vendor/github.com/libp2p/go-stream-muxer/.gxignore b/vendor/github.com/libp2p/go-stream-muxer/.gxignore deleted file mode 100644 index 69ae75fb..00000000 --- a/vendor/github.com/libp2p/go-stream-muxer/.gxignore +++ /dev/null @@ -1 +0,0 @@ -suite/* diff --git a/vendor/github.com/libp2p/go-stream-muxer/.travis.yml b/vendor/github.com/libp2p/go-stream-muxer/.travis.yml deleted file mode 100644 index 4cfe98c2..00000000 --- a/vendor/github.com/libp2p/go-stream-muxer/.travis.yml +++ /dev/null @@ -1,32 +0,0 @@ -os: - - linux - -language: go - -go: - - 1.11.x - -env: - global: - - GOTFLAGS="-race" - matrix: - - BUILD_DEPTYPE=gx - - BUILD_DEPTYPE=gomod - - -# disable travis install -install: - - true - -script: - - bash <(curl -s https://raw.githubusercontent.com/ipfs/ci-helpers/master/travis-ci/run-standard-tests.sh) - - -cache: - directories: - - $GOPATH/src/gx - - $GOPATH/pkg/mod - - $HOME/.cache/go-build - -notifications: - email: false diff --git a/vendor/github.com/libp2p/go-stream-muxer/Makefile b/vendor/github.com/libp2p/go-stream-muxer/Makefile deleted file mode 100644 index 5c996090..00000000 --- a/vendor/github.com/libp2p/go-stream-muxer/Makefile +++ /dev/null @@ -1,13 +0,0 @@ -all: deps - -gx: - go get github.com/whyrusleeping/gx - go get github.com/whyrusleeping/gx-go - -deps: gx - gx --verbose install --global - gx-go rewrite - -publish: - gx-go rewrite --undo - diff --git a/vendor/github.com/libp2p/go-stream-muxer/README.md b/vendor/github.com/libp2p/go-stream-muxer/README.md deleted file mode 100644 index 759ec5b6..00000000 --- a/vendor/github.com/libp2p/go-stream-muxer/README.md +++ /dev/null @@ -1,114 +0,0 @@ -# go-stream-muxer - generalized stream multiplexing - - -go-stream-muxer is a common interface for stream muxers, with common tests. It wraps other stream muxers (like [muxado](https://github.com/inconshreveable/muxado), [spdystream](https://github.com/docker/spdystream) and [yamux](https://github.com/hashicorp/yamux)). - -[![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](http://ipn.io) [![](https://img.shields.io/badge/freenode-%23ipfs-blue.svg?style=flat-square)](http://webchat.freenode.net/?channels=%23ipfs) - -> A test suite and interface you can use to implement a stream muxer. - -### Godoc: https://godoc.org/github.com/libp2p/go-stream-muxer - -## Implementations - -* [yamux](https://github.com/whyrusleeping/go-smux-yamux) -* [muxado](https://github.com/whyrusleeping/go-smux-muxado) -* [multiplex](https://github.com/whyrusleeping/go-smux-multiplex) -* [spdystream](https://github.com/whyrusleeping/go-smux-spdystream) - -## Badge - -Include this badge in your readme if you make a new module that uses abstract-stream-muxer API. - -![](img/badge.png) - -## Installation - -```sh -go get -d github.com/libp2p/go-stream-muxer -cd $GOPATH/src/github.com/libp2p/go-stream-muxer -make deps -``` - -## Client example - -```go -import ( - "net" - "fmt" - "io" - "os" - - ymux "github.com/whyrusleeping/go-smux-yamux" -) - -func dial() { - nconn, _ := net.Dial("tcp", "localhost:1234") - sconn, _ := ymux.DefaultTransport.NewConn(nconn, false) // false == client - - go func() { - // no-op - for { - sconn.AcceptStream() - } - }() - - s1, _ := sconn.OpenStream() - s1.Write([]byte("hello")) - - s2, _ := sconn.OpenStream() - s2.Write([]byte("world")) - - length := 20 - buf2 := make([]byte, length) - fmt.Printf("reading %d bytes from stream (echoed)\n", length) - - s1.Read(buf2) - - fmt.Printf("received %s as a response\n", string(buf2)) - - s3, _ := sconn.OpenStream() - io.Copy(s3, os.Stdin) -} -``` - -## Server example - -```go -import ( - "net" - "fmt" - "io" - - smux "github.com/libp2p/go-stream-muxer" - ymux "github.com/whyrusleeping/go-smux-yamux" -) - -func listen() { - tr := ymux.DefaultTransport - l, _ := net.Listen("tcp", "localhost:1234") - - for { - c, _ := l.Accept() - - fmt.Println("accepted connection") - sc, _ := tr.NewConn(c, true) - - go func() { - fmt.Println("serving connection") - for { - s, _ := sc.AcceptStream() - echoStream(s) - } - }() - } -} - -func echoStream(s smux.Stream) { - defer s.Close() - - fmt.Println("accepted stream") - io.Copy(s, s) // echo everything - fmt.Println("closing stream") -} -``` diff --git a/vendor/github.com/libp2p/go-stream-muxer/codecov.yml b/vendor/github.com/libp2p/go-stream-muxer/codecov.yml deleted file mode 100644 index 5f88a9ea..00000000 --- a/vendor/github.com/libp2p/go-stream-muxer/codecov.yml +++ /dev/null @@ -1,3 +0,0 @@ -coverage: - range: "50...100" -comment: off diff --git a/vendor/github.com/libp2p/go-stream-muxer/go.mod b/vendor/github.com/libp2p/go-stream-muxer/go.mod deleted file mode 100644 index f07e3803..00000000 --- a/vendor/github.com/libp2p/go-stream-muxer/go.mod +++ /dev/null @@ -1 +0,0 @@ -module github.com/libp2p/go-stream-muxer diff --git a/vendor/github.com/libp2p/go-stream-muxer/muxer.go b/vendor/github.com/libp2p/go-stream-muxer/muxer.go deleted file mode 100644 index c534af5e..00000000 --- a/vendor/github.com/libp2p/go-stream-muxer/muxer.go +++ /dev/null @@ -1,55 +0,0 @@ -package streammux - -import ( - "errors" - "io" - "net" - "time" -) - -// ErrReset is returned when reading or writing on a reset stream. -var ErrReset = errors.New("stream reset") - -// Stream is a bidirectional io pipe within a connection. -type Stream interface { - io.Reader - io.Writer - - // Close closes the stream for writing. Reading will still work (that - // is, the remote side can still write). - io.Closer - - // Reset closes both ends of the stream. Use this to tell the remote - // side to hang up and go away. - Reset() error - - SetDeadline(time.Time) error - SetReadDeadline(time.Time) error - SetWriteDeadline(time.Time) error -} - -// NoOpHandler do nothing. Resets streams as soon as they are opened. -var NoOpHandler = func(s Stream) { s.Reset() } - -// Conn is a stream-multiplexing connection to a remote peer. -type Conn interface { - // Close closes the stream muxer and the the underlying net.Conn. - io.Closer - - // IsClosed returns whether a connection is fully closed, so it can - // be garbage collected. - IsClosed() bool - - // OpenStream creates a new stream. - OpenStream() (Stream, error) - - // AcceptStream accepts a stream opened by the other side. - AcceptStream() (Stream, error) -} - -// Transport constructs go-stream-muxer compatible connections. -type Transport interface { - - // NewConn constructs a new connection - NewConn(c net.Conn, isServer bool) (Conn, error) -} diff --git a/vendor/github.com/libp2p/go-stream-muxer/package.json b/vendor/github.com/libp2p/go-stream-muxer/package.json deleted file mode 100644 index c63d0829..00000000 --- a/vendor/github.com/libp2p/go-stream-muxer/package.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "author": "whyrusleeping", - "bugs": { - "url": "https://github.com/libp2p/go-stream-muxer" - }, - "gx": { - "dvcsimport": "github.com/libp2p/go-stream-muxer" - }, - "gxVersion": "0.7.0", - "language": "go", - "license": "", - "name": "go-stream-muxer", - "version": "3.1.0" -} - diff --git a/vendor/github.com/libp2p/go-tcp-transport/Makefile b/vendor/github.com/libp2p/go-tcp-transport/Makefile deleted file mode 100644 index 20619413..00000000 --- a/vendor/github.com/libp2p/go-tcp-transport/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -gx: - go get github.com/whyrusleeping/gx - go get github.com/whyrusleeping/gx-go - -deps: gx - gx --verbose install --global - gx-go rewrite - -publish: - gx-go rewrite --undo - diff --git a/vendor/github.com/libp2p/go-tcp-transport/README.md b/vendor/github.com/libp2p/go-tcp-transport/README.md index aaaed218..ce8ad967 100644 --- a/vendor/github.com/libp2p/go-tcp-transport/README.md +++ b/vendor/github.com/libp2p/go-tcp-transport/README.md @@ -1,11 +1,12 @@ go-tcp-transport ================== -[![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](http://ipn.io) -[![](https://img.shields.io/badge/project-IPFS-blue.svg?style=flat-square)](http://libp2p.io/) -[![](https://img.shields.io/badge/freenode-%23ipfs-blue.svg?style=flat-square)](http://webchat.freenode.net/?channels=%23ipfs) +[![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](https://protocol.ai) +[![](https://img.shields.io/badge/project-libp2p-yellow.svg?style=flat-square)](https://libp2p.io/) +[![](https://img.shields.io/badge/freenode-%23libp2p-yellow.svg?style=flat-square)](http://webchat.freenode.net/?channels=%23libp2p) +[![Discourse posts](https://img.shields.io/discourse/https/discuss.libp2p.io/posts.svg)](https://discuss.libp2p.io) [![Coverage Status](https://coveralls.io/repos/github/libp2p/go-tcp-transport/badge.svg?branch=master)](https://coveralls.io/github/libp2p/go-tcp-transport?branch=master) -[![Travis CI](https://travis-ci.org/libp2p/go-tcp-transport.svg?branch=master)](https://travis-ci.org/libp2p/go-tcp-transport) +[![Travis CI](https://travis-ci.com/libp2p/go-tcp-transport.svg?branch=master)](https://travis-ci.com/libp2p/go-tcp-transport) > A libp2p transport implementation for tcp, including reuseport socket options. @@ -33,3 +34,7 @@ Small note: If editing the Readme, please conform to the [standard-readme](https ## License MIT © Jeromy Johnson + +--- + +The last gx published version of this module was: 2.0.28: QmTGiDkw4eeKq31wwpQRk5GwWiReaxrcTQLuCCLWgfKo5M diff --git a/vendor/github.com/libp2p/go-tcp-transport/go.mod b/vendor/github.com/libp2p/go-tcp-transport/go.mod index 7f0f5b70..acfb03f4 100644 --- a/vendor/github.com/libp2p/go-tcp-transport/go.mod +++ b/vendor/github.com/libp2p/go-tcp-transport/go.mod @@ -2,14 +2,14 @@ module github.com/libp2p/go-tcp-transport require ( github.com/ipfs/go-log v0.0.1 - github.com/libp2p/go-conn-security v0.0.1 - github.com/libp2p/go-libp2p-peer v0.0.1 - github.com/libp2p/go-libp2p-transport v0.0.4 - github.com/libp2p/go-libp2p-transport-upgrader v0.0.1 + github.com/libp2p/go-libp2p-core v0.0.1 + github.com/libp2p/go-libp2p-mplex v0.2.1 + github.com/libp2p/go-libp2p-testing v0.0.3 + github.com/libp2p/go-libp2p-transport-upgrader v0.1.1 github.com/libp2p/go-reuseport v0.0.1 github.com/libp2p/go-reuseport-transport v0.0.2 - github.com/multiformats/go-multiaddr v0.0.1 + github.com/multiformats/go-multiaddr v0.0.4 + github.com/multiformats/go-multiaddr-fmt v0.0.1 github.com/multiformats/go-multiaddr-net v0.0.1 - github.com/whyrusleeping/go-smux-multiplex v3.0.16+incompatible - github.com/whyrusleeping/mafmt v1.2.8 + github.com/multiformats/go-multihash v0.0.5 // indirect ) diff --git a/vendor/github.com/libp2p/go-tcp-transport/go.sum b/vendor/github.com/libp2p/go-tcp-transport/go.sum index 39982699..b81940b2 100644 --- a/vendor/github.com/libp2p/go-tcp-transport/go.sum +++ b/vendor/github.com/libp2p/go-tcp-transport/go.sum @@ -1,5 +1,3 @@ -github.com/AndreasBriese/bbloom v0.0.0-20180913140656-343706a395b7/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= -github.com/Kubuxu/go-os-helper v0.0.1/go.mod h1:N8B+I7vPCT80IcP58r50u4+gEEcsZETFUpAzWW2ep1Y= github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32 h1:qkOC5Gd33k54tobS36cXdAzJbeHaduLtnLQQwNoIi78= github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32/go.mod h1:DrZx5ec/dmnfpw9KyYoQyYo7d0KEvTkk/5M/vbZjAr8= @@ -10,35 +8,24 @@ github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVa github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= +github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dgraph-io/badger v1.5.5-0.20190226225317-8115aed38f8f/go.mod h1:VZxzAIRPHRVNRKRo6AXrX9BJegn6il06VMTZVJYCIjQ= -github.com/dgryski/go-farm v0.0.0-20190104051053-3adb47b1fb0f/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= 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/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.0 h1:kbxbvI4Un1LUWKxufD+BiE6AEExYYgkQLQmLFqA1LFk= -github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0= -github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gxed/hashland/keccakpg v0.0.1 h1:wrk3uMNaMxbXiHibbPO4S0ymqJMm41WiudyFSs7UnsU= github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfmKFJ6tItnhQ67kU= github.com/gxed/hashland/murmur3 v0.0.1 h1:SheiaIt0sda5K+8FLz952/1iWS9zrnKsEJaOJu4ZbSc= github.com/gxed/hashland/murmur3 v0.0.1/go.mod h1:KjXop02n4/ckmZSnY2+HKcLud/tcmvhST0bie/0lS48= -github.com/hashicorp/golang-lru v0.5.1/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/ipfs/go-datastore v0.0.1/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= -github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk= -github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps= -github.com/ipfs/go-ds-badger v0.0.2/go.mod h1:Y3QpeSFWQf6MopLTiZD+VT6IC1yZqaGmjvRcKeSGij8= -github.com/ipfs/go-ds-leveldb v0.0.1/go.mod h1:feO8V3kubwsEF22n0YRQCffeb79OOYIykR4L04tMOYc= -github.com/ipfs/go-ipfs-delay v0.0.0-20181109222059-70721b86a9a8/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= +github.com/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= github.com/ipfs/go-log v0.0.1 h1:9XTUN/rW64BCG1YhPK9Hoy3q8nr4gOmHHBpgFdfw6Lc= github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM= github.com/jbenet/go-temp-err-catcher v0.0.0-20150120210811-aac704a3f4f2 h1:vhC1OXXiT9R2pczegwz6moDvuRpggaroAXhPIseh57A= @@ -50,36 +37,24 @@ github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlT github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= -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/libp2p/go-buffer-pool v0.0.1 h1:9Rrn/H46cXjaA2HQ5Y8lyhOS1NhTkZ4yuEs2r3Eechg= github.com/libp2p/go-buffer-pool v0.0.1/go.mod h1:xtyIz9PMobb13WaxR6Zo1Pd1zXJKYg0a8KiIvDp3TzQ= -github.com/libp2p/go-conn-security v0.0.1 h1:4kMMrqrt9EUNCNjX1xagSJC+bq16uqjMe9lk1KBMVNs= -github.com/libp2p/go-conn-security v0.0.1/go.mod h1:bGmu51N0KU9IEjX7kl2PQjgZa40JQWnayTvNMgD/vyk= -github.com/libp2p/go-libp2p-crypto v0.0.1 h1:JNQd8CmoGTohO/akqrH16ewsqZpci2CbgYH/LmYl8gw= -github.com/libp2p/go-libp2p-crypto v0.0.1/go.mod h1:yJkNyDmO341d5wwXxDUGO0LykUVT72ImHNUqh5D/dBE= -github.com/libp2p/go-libp2p-interface-pnet v0.0.1 h1:7GnzRrBTJHEsofi1ahFdPN9Si6skwXQE9UqR2S+Pkh8= -github.com/libp2p/go-libp2p-interface-pnet v0.0.1/go.mod h1:el9jHpQAXK5dnTpKA4yfCNBZXvrzdOU75zz+C6ryp3k= -github.com/libp2p/go-libp2p-net v0.0.1 h1:xJ4Vh4yKF/XKb8fd1Ev0ebAGzVjMxXzrxG2kjtU+F5Q= -github.com/libp2p/go-libp2p-net v0.0.1/go.mod h1:Yt3zgmlsHOgUWSXmt5V/Jpz9upuJBE8EgNU9DrCcR8c= -github.com/libp2p/go-libp2p-peer v0.0.1 h1:0qwAOljzYewINrU+Kndoc+1jAL7vzY/oY2Go4DCGfyY= -github.com/libp2p/go-libp2p-peer v0.0.1/go.mod h1:nXQvOBbwVqoP+T5Y5nCjeH4sP9IX/J0AMzcDUVruVoo= -github.com/libp2p/go-libp2p-peerstore v0.0.1 h1:twKovq8YK5trLrd3nB7PD2Zu9JcyAIdm7Bz9yBWjhq8= -github.com/libp2p/go-libp2p-peerstore v0.0.1/go.mod h1:RabLyPVJLuNQ+GFyoEkfi8H4Ti6k/HtZJ7YKgtSq+20= -github.com/libp2p/go-libp2p-protocol v0.0.1 h1:+zkEmZ2yFDi5adpVE3t9dqh/N9TbpFWywowzeEzBbLM= -github.com/libp2p/go-libp2p-protocol v0.0.1/go.mod h1:Af9n4PiruirSDjHycM1QuiMi/1VZNHYcK8cLgFJLZ4s= -github.com/libp2p/go-libp2p-transport v0.0.1/go.mod h1:UzbUs9X+PHOSw7S3ZmeOxfnwaQY5vGDzZmKPod3N3tk= -github.com/libp2p/go-libp2p-transport v0.0.4 h1:/CPHQMN75/IQwkhBxxIo6p6PtL3rwFZtlzBROT3e8mw= -github.com/libp2p/go-libp2p-transport v0.0.4/go.mod h1:StoY3sx6IqsP6XKoabsPnHCwqKXWUMWU7Rfcsubee/A= -github.com/libp2p/go-libp2p-transport-upgrader v0.0.1 h1:rNtXkY6dty46mxYOHHAZQchI7gQdJStF683FhVnei/k= -github.com/libp2p/go-libp2p-transport-upgrader v0.0.1/go.mod h1:NJpUAgQab/8K6K0m+JmZCe5RUXG10UMEx4kWe9Ipj5c= -github.com/libp2p/go-maddr-filter v0.0.1 h1:apvYTg0aIxxQyBX+XHKOR+0+lYhGs1Yv+JmTH9nyl5I= -github.com/libp2p/go-maddr-filter v0.0.1/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= -github.com/libp2p/go-mplex v0.0.1 h1:dn2XGSrUxLtz3/8u85bGrwhUEKPX8MOF3lpmcWBZCWc= -github.com/libp2p/go-mplex v0.0.1/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0= +github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZxBdp967ls1g+k8= +github.com/libp2p/go-libp2p-core v0.0.1 h1:HSTZtFIq/W5Ue43Zw+uWZyy2Vl5WtF0zDjKN8/DT/1I= +github.com/libp2p/go-libp2p-core v0.0.1/go.mod h1:g/VxnTZ/1ygHxH3dKok7Vno1VfpvGcGip57wjTU4fco= +github.com/libp2p/go-libp2p-mplex v0.2.0 h1:vnR+/fUnL5d2kTB1Lfce1KVSP+bCCy2aJIvqvb9cFqE= +github.com/libp2p/go-libp2p-mplex v0.2.0/go.mod h1:Ejl9IyjvXJ0T9iqUTE1jpYATQ9NM3g+OtR+EMMODbKo= +github.com/libp2p/go-libp2p-mplex v0.2.1 h1:E1xaJBQnbSiTHGI1gaBKmKhu1TUKkErKJnE8iGvirYI= +github.com/libp2p/go-libp2p-mplex v0.2.1/go.mod h1:SC99Rxs8Vuzrf/6WhmH41kNn13TiYdAWNYHrwImKLnE= +github.com/libp2p/go-libp2p-testing v0.0.3 h1:bdij4bKaaND7tCsaXVjRfYkMpvoOeKj9AVQGJllA6jM= +github.com/libp2p/go-libp2p-testing v0.0.3/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= +github.com/libp2p/go-libp2p-transport-upgrader v0.1.1 h1:PZMS9lhjK9VytzMCW3tWHAXtKXmlURSc3ZdvwEcKCzw= +github.com/libp2p/go-libp2p-transport-upgrader v0.1.1/go.mod h1:IEtA6or8JUbsV07qPW4r01GnTenLW4oi3lOPbUMGJJA= +github.com/libp2p/go-maddr-filter v0.0.4 h1:hx8HIuuwk34KePddrp2mM5ivgPkZ09JH4AvsALRbFUs= +github.com/libp2p/go-maddr-filter v0.0.4/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= +github.com/libp2p/go-mplex v0.0.3/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0= +github.com/libp2p/go-mplex v0.1.0 h1:/nBTy5+1yRyY82YaO6HXQRnO5IAGsXTjEJaR3LdTPc0= +github.com/libp2p/go-mplex v0.1.0/go.mod h1:SXgmdki2kwCUlCCbfGLEgHjC4pFqhTp0ZoV6aiKgxDU= github.com/libp2p/go-reuseport v0.0.1 h1:7PhkfH73VXfPJYKQ6JwS5I/eVcoyYi9IMNGc6FWpFLw= github.com/libp2p/go-reuseport v0.0.1/go.mod h1:jn6RmB1ufnQwl0Q1f+YxAj8isJgDCQzaaxIFYDhcYEA= github.com/libp2p/go-reuseport-transport v0.0.2 h1:WglMwyXyBu61CMkjCCtnmqNqnjib0GIEjMiHTwR/KN4= @@ -94,60 +69,87 @@ github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0 github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16 h1:5W7KhL8HVF3XCFOweFD3BNESdnO8ewyYTFT2R+/b8FQ= github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= +github.com/minio/sha256-simd v0.0.0-20190328051042-05b4dd3047e5 h1:l16XLUUJ34wIz+RIvLhSwGvLvKyy+W598b135bJN6mg= +github.com/minio/sha256-simd v0.0.0-20190328051042-05b4dd3047e5/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= github.com/mr-tron/base58 v1.1.0 h1:Y51FGVJ91WBqCEabAi5OPUz38eAx8DakuAm5svLcsfQ= github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= +github.com/mr-tron/base58 v1.1.1 h1:OJIdWOWYe2l5PQNgimGtuwHY8nDskvJ5vvs//YnzRLs= +github.com/mr-tron/base58 v1.1.1/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= +github.com/mr-tron/base58 v1.1.2 h1:ZEw4I2EgPKDJ2iEw0cNmLB3ROrEmkOtXIkaG7wZg+78= +github.com/mr-tron/base58 v1.1.2/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= github.com/multiformats/go-multiaddr v0.0.1 h1:/QUV3VBMDI6pi6xfiw7lr6xhDWWvQKn9udPn68kLSdY= github.com/multiformats/go-multiaddr v0.0.1/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= +github.com/multiformats/go-multiaddr v0.0.2 h1:RBysRCv5rv3FWlhKWKoXv8tnsCUpEpIZpCmqAGZos2s= +github.com/multiformats/go-multiaddr v0.0.2/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= +github.com/multiformats/go-multiaddr v0.0.4 h1:WgMSI84/eRLdbptXMkMWDXPjPq7SPLIgGUVm2eroyU4= +github.com/multiformats/go-multiaddr v0.0.4/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= github.com/multiformats/go-multiaddr-dns v0.0.1 h1:jQt9c6tDSdQLIlBo4tXYx7QUHCPjxsB1zXcag/2S7zc= github.com/multiformats/go-multiaddr-dns v0.0.1/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= +github.com/multiformats/go-multiaddr-dns v0.0.2 h1:/Bbsgsy3R6e3jf2qBahzNHzww6usYaZ0NhNH3sqdFS8= +github.com/multiformats/go-multiaddr-dns v0.0.2/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= +github.com/multiformats/go-multiaddr-fmt v0.0.1 h1:5YjeOIzbX8OTKVaN72aOzGIYW7PnrZrnkDyOfAWRSMA= +github.com/multiformats/go-multiaddr-fmt v0.0.1/go.mod h1:aBYjqL4T/7j4Qx+R73XSv/8JsgnRFlf0w2KGLCmXl3Q= github.com/multiformats/go-multiaddr-net v0.0.1 h1:76O59E3FavvHqNg7jvzWzsPSW5JSi/ek0E4eiDVbg9g= github.com/multiformats/go-multiaddr-net v0.0.1/go.mod h1:nw6HSxNmCIQH27XPGBuX+d1tnvM7ihcFwHMSstNAVUU= +github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs= github.com/multiformats/go-multihash v0.0.1 h1:HHwN1K12I+XllBCrqKnhX949Orn4oawPkegHMu2vDqQ= github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= +github.com/multiformats/go-multihash v0.0.5 h1:1wxmCvTXAifAepIMyF39vZinRw5sbqjPs/UIi93+uik= +github.com/multiformats/go-multihash v0.0.5/go.mod h1:lt/HCbqlQwlPBz7lv0sQCdtfcMtlJvakRUn/0Ual8po= 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/ginkgo v1.8.0 h1:VkHVNpR4iVnU8XQR6DBm8BqYjN7CRzw+xKUbVVbbW9w= +github.com/onsi/ginkgo v1.8.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/onsi/gomega v1.5.0 h1:izbySO9zDPmjJ8rDjLvkA2zJHIo+HkYXHnf7eN7SSyo= +github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/opentracing/opentracing-go v1.0.2 h1:3jA2P6O1F9UOrWVpwrIo17pu01KWvNWg4X946/Y5Zwg= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= 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/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a h1:/eS3yfGjQKG+9kayBkj0ip1BGhq6zJ3eaVksphxAaek= +github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a/go.mod h1:7AyxJNCJ7SBZ1MfVQCWD6Uqo2oubI2Eq2y2eqf+A5r0= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 h1:RC6RW7j+1+HkWaX/Yh71Ee5ZHaHYt7ZP4sQgUrm6cDU= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572/go.mod h1:w0SWMsp6j9O/dk4/ZpIhL+3CkG8ofA2vuv7k+ltqUMc= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= -github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1/go.mod h1:8UvriyWtv5Q5EOgjHaSseUEdkQfvwFv1I/In/O2M9gc= github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc h1:9lDbC6Rz4bwmou+oE6Dt4Cb2BGMur5eR/GYptkKUVHo= github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc/go.mod h1:bopw91TMyo8J3tvftk8xmU2kPmlrt4nScJQZU2hE5EM= -github.com/whyrusleeping/go-smux-multiplex v3.0.16+incompatible h1:iqksILj8STw03EJQe7Laj4ubnw+ojOyik18cd5vPL1o= -github.com/whyrusleeping/go-smux-multiplex v3.0.16+incompatible/go.mod h1:34LEDbeKFZInPUrAG+bjuJmUXONGdEFW7XL0SpTY1y4= -github.com/whyrusleeping/mafmt v1.2.8 h1:TCghSl5kkwEE0j+sU/gudyhVMRlpBin8fMBBHg59EbA= -github.com/whyrusleeping/mafmt v1.2.8/go.mod h1:faQJFPbLSxzD9xpA02ttW/tS9vZykNvXwGvqIpk20FA= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b h1:+/WWzjwW6gidDJnMKWLKLX1gxn7irUTF1fLpQovfQ5M= golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734 h1:p/H982KKEjUnLJkM3tt/LemDnOc1GiZL5FCVlORJ5zo= +golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190227160552-c95aed5357e7 h1:C2F/nMkR/9sfUTpvR3QrjBuTdvMUC/cFajkphs1YLQo= golang.org/x/net v0.0.0-20190227160552-c95aed5357e7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3 h1:0GoQqolDA55aaLxZyTzK/Y2ePZzZTUrRacwib7cNsYQ= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f h1:wMNYb4v58l5UBM7MYRLPG6ZhfOqbKu7X5eyFl8ZhKvA= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/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-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190219092855-153ac476189d/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190228124157-a34e9553db1e h1:ZytStCyV048ZqDsWHiYDdoI2Vd4msMcrDECFxS+tL9c= golang.org/x/sys v0.0.0-20190228124157-a34e9553db1e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d h1:+R4KGOnez64A81RvjARKc4UT5/tI9ujCIVX+P5KiHuI= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= 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/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= diff --git a/vendor/github.com/libp2p/go-tcp-transport/package.json b/vendor/github.com/libp2p/go-tcp-transport/package.json deleted file mode 100644 index 7ac42a9f..00000000 --- a/vendor/github.com/libp2p/go-tcp-transport/package.json +++ /dev/null @@ -1,83 +0,0 @@ -{ - "author": "whyrusleeping", - "bugs": { - "url": "https://github.com/libp2p/go-tcp-transport" - }, - "gx": { - "dvcsimport": "github.com/libp2p/go-tcp-transport" - }, - "gxDependencies": [ - { - "author": "whyrusleeping", - "hash": "Qme8kdM7thoCqLqd7GYCRqipoZJS64rhJo5MBcTpyWfsL9", - "name": "go-reuseport", - "version": "0.2.2" - }, - { - "author": "whyrusleeping", - "hash": "Qmc85NSvmSG4Frn9Vb2cBc1rMyULH6D3TNVEfCzSKoUpip", - "name": "go-multiaddr-net", - "version": "1.7.2" - }, - { - "author": "whyrusleeping", - "hash": "QmUrZZavcArYChpibtP8KgQXsAEpvgzUk73B2oj3HLbWc4", - "name": "mafmt", - "version": "1.2.11" - }, - { - "author": "whyrusleeping", - "hash": "QmNQWMWWBmkAcaVEspSNwYB95axzKFhYTdqZtABA2zXoPu", - "name": "go-libp2p-transport", - "version": "3.0.27" - }, - { - "hash": "QmbkT7eMTyXfpeyB3ZMxxcxg7XH8t6uXp49jqzz4HB7BGF", - "name": "go-log", - "version": "1.5.9" - }, - { - "author": "multiformats", - "hash": "QmTZBfrPJmjWsCvHEtX5FE6KimVJhsJg5sBbqEFYf4UZtL", - "name": "go-multiaddr", - "version": "1.4.1" - }, - { - "author": "Stebalien", - "hash": "QmPRoHqULmP4MuKAN5EFaJ64MLpeMY8cny2318xDBDmmkp", - "name": "go-conn-security", - "version": "0.1.28" - }, - { - "author": "stebalien", - "hash": "QmTmbamDjDWgHe8qeMt7ZpaeNpTj349JpFKuwTF321XavT", - "name": "go-reuseport-transport", - "version": "0.2.3" - }, - { - "author": "steb", - "hash": "QmeqC5shQjEBRG9B8roZqQCJ9xb7Pq6AbWxJFMyLgqBBWh", - "name": "go-libp2p-transport-upgrader", - "version": "0.1.28" - }, - { - "author": "whyrusleeping", - "hash": "QmaJvNdDccVkTELQLCGXWrLxgaQ14aMdhzZx1EiHPXKbDc", - "name": "go-smux-multiplex", - "version": "3.0.19" - }, - { - "author": "whyrusleeping", - "hash": "QmYVXrKrKHDC9FobgmcmshCDyWwdrfwfanNQN4oxJ9Fk3h", - "name": "go-libp2p-peer", - "version": "3.1.2" - } - ], - "gxVersion": "0.4.0", - "language": "go", - "license": "MIT", - "name": "go-tcp-transport", - "releaseCmd": "git commit -a -m \"gx publish $VERSION\"", - "version": "2.0.28" -} - diff --git a/vendor/github.com/libp2p/go-tcp-transport/reuseport.go b/vendor/github.com/libp2p/go-tcp-transport/reuseport.go index 04a5da3e..e3b7e125 100644 --- a/vendor/github.com/libp2p/go-tcp-transport/reuseport.go +++ b/vendor/github.com/libp2p/go-tcp-transport/reuseport.go @@ -4,7 +4,7 @@ import ( "os" "strings" - reuseport "github.com/libp2p/go-reuseport" + "github.com/libp2p/go-reuseport" ) // envReuseport is the env variable name used to turn off reuse port. diff --git a/vendor/github.com/libp2p/go-tcp-transport/tcp.go b/vendor/github.com/libp2p/go-tcp-transport/tcp.go index 5f7fec8a..1483d67e 100644 --- a/vendor/github.com/libp2p/go-tcp-transport/tcp.go +++ b/vendor/github.com/libp2p/go-tcp-transport/tcp.go @@ -6,13 +6,14 @@ import ( "time" logging "github.com/ipfs/go-log" - peer "github.com/libp2p/go-libp2p-peer" - tpt "github.com/libp2p/go-libp2p-transport" + "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p-core/transport" tptu "github.com/libp2p/go-libp2p-transport-upgrader" rtpt "github.com/libp2p/go-reuseport-transport" + ma "github.com/multiformats/go-multiaddr" + mafmt "github.com/multiformats/go-multiaddr-fmt" manet "github.com/multiformats/go-multiaddr-net" - mafmt "github.com/whyrusleeping/mafmt" ) // DefaultConnectTimeout is the (default) maximum amount of time the TCP @@ -23,9 +24,11 @@ var log = logging.Logger("tcp-tpt") // try to set linger on the connection, if possible. func tryLinger(conn net.Conn, sec int) { - if lingerConn, ok := conn.(interface { + type canLinger interface { SetLinger(int) error - }); ok { + } + + if lingerConn, ok := conn.(canLinger); ok { _ = lingerConn.SetLinger(sec) } } @@ -59,7 +62,7 @@ type TcpTransport struct { reuse rtpt.Transport } -var _ tpt.Transport = &TcpTransport{} +var _ transport.Transport = &TcpTransport{} // NewTCPTransport creates a tcp transport object that tracks dialers and listeners // created. It represents an entire tcp stack (though it might not necessarily be) @@ -92,7 +95,7 @@ func (t *TcpTransport) maDial(ctx context.Context, raddr ma.Multiaddr) (manet.Co } // Dial dials the peer at the remote address. -func (t *TcpTransport) Dial(ctx context.Context, raddr ma.Multiaddr, p peer.ID) (tpt.Conn, error) { +func (t *TcpTransport) Dial(ctx context.Context, raddr ma.Multiaddr, p peer.ID) (transport.CapableConn, error) { conn, err := t.maDial(ctx, raddr) if err != nil { return nil, err @@ -117,7 +120,7 @@ func (t *TcpTransport) maListen(laddr ma.Multiaddr) (manet.Listener, error) { } // Listen listens on the given multiaddr. -func (t *TcpTransport) Listen(laddr ma.Multiaddr) (tpt.Listener, error) { +func (t *TcpTransport) Listen(laddr ma.Multiaddr) (transport.Listener, error) { list, err := t.maListen(laddr) if err != nil { return nil, err diff --git a/vendor/github.com/libp2p/go-testutil/.travis.yml b/vendor/github.com/libp2p/go-testutil/.travis.yml deleted file mode 100644 index 4cfe98c2..00000000 --- a/vendor/github.com/libp2p/go-testutil/.travis.yml +++ /dev/null @@ -1,32 +0,0 @@ -os: - - linux - -language: go - -go: - - 1.11.x - -env: - global: - - GOTFLAGS="-race" - matrix: - - BUILD_DEPTYPE=gx - - BUILD_DEPTYPE=gomod - - -# disable travis install -install: - - true - -script: - - bash <(curl -s https://raw.githubusercontent.com/ipfs/ci-helpers/master/travis-ci/run-standard-tests.sh) - - -cache: - directories: - - $GOPATH/src/gx - - $GOPATH/pkg/mod - - $HOME/.cache/go-build - -notifications: - email: false diff --git a/vendor/github.com/libp2p/go-testutil/LICENSE b/vendor/github.com/libp2p/go-testutil/LICENSE deleted file mode 100644 index 172a8eb2..00000000 --- a/vendor/github.com/libp2p/go-testutil/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2016 Protocol Labs, 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. \ No newline at end of file diff --git a/vendor/github.com/libp2p/go-testutil/Makefile b/vendor/github.com/libp2p/go-testutil/Makefile deleted file mode 100644 index 2c5fbfe2..00000000 --- a/vendor/github.com/libp2p/go-testutil/Makefile +++ /dev/null @@ -1,10 +0,0 @@ -gx: - go get github.com/whyrusleeping/gx - go get github.com/whyrusleeping/gx-go - -deps: gx - gx --verbose install --global - gx-go rewrite - -publish: - gx-go rewrite --undo diff --git a/vendor/github.com/libp2p/go-testutil/README.md b/vendor/github.com/libp2p/go-testutil/README.md deleted file mode 100644 index 247d9624..00000000 --- a/vendor/github.com/libp2p/go-testutil/README.md +++ /dev/null @@ -1,34 +0,0 @@ -# go-testutil - -[![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](http://ipn.io) -[![](https://img.shields.io/badge/project-IPFS-blue.svg?style=flat-square)](http://ipfs.io/) -[![](https://img.shields.io/badge/freenode-%23ipfs-blue.svg?style=flat-square)](http://webchat.freenode.net/?channels=%23ipfs) -[![standard-readme compliant](https://img.shields.io/badge/standard--readme-OK-green.svg?style=flat-square)](https://github.com/RichardLitt/standard-readme) -[![Coverage Status](https://coveralls.io/repos/github/libp2p/go-testutil/badge.svg?branch=master)](https://coveralls.io/github/libp2p/go-testutil?branch=master) -[![Travis CI](https://travis-ci.org/libp2p/go-testutil.svg?branch=master)](https://travis-ci.org/libp2p/go-testutil) - -> A collection of testing utilities for ipfs and libp2p - -## Install - -```sh -go get github.com/libp2p/go-testutil -``` - -## Usage - -See the [documentation](https://godoc.org/github.com/libp2p/go-testutil). - -## Contribute - -Feel free to join in. All welcome. Open an [issue](https://github.com/libp2p/go-testutil/issues)! - -This repository falls under the IPFS [Code of Conduct](https://github.com/ipfs/community/blob/master/code-of-conduct.md). - -### Want to hack on IPFS? - -[![](https://cdn.rawgit.com/jbenet/contribute-ipfs-gif/master/img/contribute.gif)](https://github.com/ipfs/community/blob/master/contributing.md) - -## License - -[MIT](LICENSE) © Protocol Labs, Inc. diff --git a/vendor/github.com/libp2p/go-testutil/codecov.yml b/vendor/github.com/libp2p/go-testutil/codecov.yml deleted file mode 100644 index 5f88a9ea..00000000 --- a/vendor/github.com/libp2p/go-testutil/codecov.yml +++ /dev/null @@ -1,3 +0,0 @@ -coverage: - range: "50...100" -comment: off diff --git a/vendor/github.com/libp2p/go-testutil/gen.go b/vendor/github.com/libp2p/go-testutil/gen.go deleted file mode 100644 index 18bb6fe2..00000000 --- a/vendor/github.com/libp2p/go-testutil/gen.go +++ /dev/null @@ -1,154 +0,0 @@ -package testutil - -import ( - "bytes" - "errors" - "fmt" - "math/rand" - "sync" - "testing" - - ci "github.com/libp2p/go-libp2p-crypto" - peer "github.com/libp2p/go-libp2p-peer" - ptest "github.com/libp2p/go-libp2p-peer/test" - ma "github.com/multiformats/go-multiaddr" - mh "github.com/multiformats/go-multihash" -) - -// ZeroLocalTCPAddress is the "zero" tcp local multiaddr. This means: -// /ip4/127.0.0.1/tcp/0 -var ZeroLocalTCPAddress ma.Multiaddr - -func init() { - // initialize ZeroLocalTCPAddress - maddr, err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/0") - if err != nil { - panic(err) - } - ZeroLocalTCPAddress = maddr -} - -func RandTestKeyPair(bits int) (ci.PrivKey, ci.PubKey, error) { - return ptest.RandTestKeyPair(bits) -} - -func SeededTestKeyPair(seed int64) (ci.PrivKey, ci.PubKey, error) { - return ptest.SeededTestKeyPair(seed) -} - -// RandPeerID generates random "valid" peer IDs. it does not NEED to generate -// keys because it is as if we lost the key right away. fine to read randomness -// and hash it. to generate proper keys and corresponding PeerID, use: -// sk, pk, _ := testutil.RandKeyPair() -// id, _ := peer.IDFromPublicKey(pk) -func RandPeerID() (peer.ID, error) { - buf := make([]byte, 16) - rand.Read(buf) - h, _ := mh.Sum(buf, mh.SHA2_256, -1) - return peer.ID(h), nil -} - -func RandPeerIDFatal(t testing.TB) peer.ID { - p, err := RandPeerID() - if err != nil { - t.Fatal(err) - } - return p -} - -// RandLocalTCPAddress returns a random multiaddr. it suppresses errors -// for nice composability-- do check the address isn't nil. -// -// NOTE: for real network tests, use ZeroLocalTCPAddress so the kernel -// assigns an unused TCP port. otherwise you may get clashes. This -// function remains here so that p2p/net/mock (which does not touch the -// real network) can assign different addresses to peers. -func RandLocalTCPAddress() ma.Multiaddr { - - // chances are it will work out, but it **might** fail if the port is in use - // most ports above 10000 aren't in use by long running processes, so yay. - // (maybe there should be a range of "loopback" ports that are guaranteed - // to be open for the process, but naturally can only talk to self.) - - lastPort.Lock() - if lastPort.port == 0 { - lastPort.port = 10000 + SeededRand.Intn(50000) - } - port := lastPort.port - lastPort.port++ - lastPort.Unlock() - - addr := fmt.Sprintf("/ip4/127.0.0.1/tcp/%d", port) - maddr, _ := ma.NewMultiaddr(addr) - return maddr -} - -var lastPort = struct { - port int - sync.Mutex -}{} - -// PeerNetParams is a struct to bundle together the four things -// you need to run a connection with a peer: id, 2keys, and addr. -type PeerNetParams struct { - ID peer.ID - PrivKey ci.PrivKey - PubKey ci.PubKey - Addr ma.Multiaddr -} - -func (p *PeerNetParams) checkKeys() error { - if !p.ID.MatchesPrivateKey(p.PrivKey) { - return errors.New("p.ID does not match p.PrivKey") - } - - if !p.ID.MatchesPublicKey(p.PubKey) { - return errors.New("p.ID does not match p.PubKey") - } - - buf := new(bytes.Buffer) - buf.Write([]byte("hello world. this is me, I swear.")) - b := buf.Bytes() - - sig, err := p.PrivKey.Sign(b) - if err != nil { - return fmt.Errorf("sig signing failed: %s", err) - } - - sigok, err := p.PubKey.Verify(b, sig) - if err != nil { - return fmt.Errorf("sig verify failed: %s", err) - } - if !sigok { - return fmt.Errorf("sig verify failed: sig invalid") - } - - return nil // ok. move along. -} - -func RandPeerNetParamsOrFatal(t *testing.T) PeerNetParams { - p, err := RandPeerNetParams() - if err != nil { - t.Fatal(err) - return PeerNetParams{} // TODO return nil - } - return *p -} - -func RandPeerNetParams() (*PeerNetParams, error) { - var p PeerNetParams - var err error - p.Addr = ZeroLocalTCPAddress - p.PrivKey, p.PubKey, err = RandTestKeyPair(1024) - if err != nil { - return nil, err - } - p.ID, err = peer.IDFromPublicKey(p.PubKey) - if err != nil { - return nil, err - } - if err := p.checkKeys(); err != nil { - return nil, err - } - return &p, nil -} diff --git a/vendor/github.com/libp2p/go-testutil/go.mod b/vendor/github.com/libp2p/go-testutil/go.mod deleted file mode 100644 index 78fb4fec..00000000 --- a/vendor/github.com/libp2p/go-testutil/go.mod +++ /dev/null @@ -1,8 +0,0 @@ -module github.com/libp2p/go-testutil - -require ( - github.com/libp2p/go-libp2p-crypto v0.0.1 - github.com/libp2p/go-libp2p-peer v0.0.1 - github.com/multiformats/go-multiaddr v0.0.1 - github.com/multiformats/go-multihash v0.0.1 -) diff --git a/vendor/github.com/libp2p/go-testutil/identity.go b/vendor/github.com/libp2p/go-testutil/identity.go deleted file mode 100644 index de096d2e..00000000 --- a/vendor/github.com/libp2p/go-testutil/identity.go +++ /dev/null @@ -1,60 +0,0 @@ -package testutil - -import ( - "testing" - - ci "github.com/libp2p/go-libp2p-crypto" - peer "github.com/libp2p/go-libp2p-peer" - ma "github.com/multiformats/go-multiaddr" -) - -type Identity interface { - Address() ma.Multiaddr - ID() peer.ID - PrivateKey() ci.PrivKey - PublicKey() ci.PubKey -} - -// TODO add a cheaper way to generate identities - -func RandIdentity() (Identity, error) { - p, err := RandPeerNetParams() - if err != nil { - return nil, err - } - return &identity{*p}, nil -} - -func RandIdentityOrFatal(t *testing.T) Identity { - p, err := RandPeerNetParams() - if err != nil { - t.Fatal(err) - } - return &identity{*p} -} - -// identity is a temporary shim to delay binding of PeerNetParams. -type identity struct { - PeerNetParams -} - -func (p *identity) ID() peer.ID { - return p.PeerNetParams.ID -} - -func (p *identity) Address() ma.Multiaddr { - return p.Addr -} - -func (p *identity) PrivateKey() ci.PrivKey { - return p.PrivKey -} - -func (p *identity) PublicKey() ci.PubKey { - return p.PubKey -} - -// NewIdentity constructs a new identity object with specific parameters -func NewIdentity(ID peer.ID, addr ma.Multiaddr, privk ci.PrivKey, pubk ci.PubKey) Identity { - return &identity{PeerNetParams{ID: ID, Addr: addr, PrivKey: privk, PubKey: pubk}} -} diff --git a/vendor/github.com/libp2p/go-testutil/latency_config.go b/vendor/github.com/libp2p/go-testutil/latency_config.go deleted file mode 100644 index 5628d9ed..00000000 --- a/vendor/github.com/libp2p/go-testutil/latency_config.go +++ /dev/null @@ -1,48 +0,0 @@ -package testutil - -import "time" - -type LatencyConfig struct { - BlockstoreLatency time.Duration - NetworkLatency time.Duration - RoutingLatency time.Duration -} - -func (c LatencyConfig) AllInstantaneous() LatencyConfig { - // Could use a zero value but whatever. Consistency of interface - c.NetworkLatency = 0 - c.RoutingLatency = 0 - c.BlockstoreLatency = 0 - return c -} - -func (c LatencyConfig) NetworkNYtoSF() LatencyConfig { - c.NetworkLatency = 20 * time.Millisecond - return c -} - -func (c LatencyConfig) NetworkIntraDatacenter2014() LatencyConfig { - c.NetworkLatency = 250 * time.Microsecond - return c -} - -func (c LatencyConfig) BlockstoreFastSSD2014() LatencyConfig { - const iops = 100000 - c.BlockstoreLatency = (1 / iops) * time.Second - return c -} - -func (c LatencyConfig) BlockstoreSlowSSD2014() LatencyConfig { - c.BlockstoreLatency = 150 * time.Microsecond - return c -} - -func (c LatencyConfig) Blockstore7200RPM() LatencyConfig { - c.BlockstoreLatency = 8 * time.Millisecond - return c -} - -func (c LatencyConfig) RoutingSlow() LatencyConfig { - c.RoutingLatency = 200 * time.Millisecond - return c -} diff --git a/vendor/github.com/libp2p/go-testutil/package.json b/vendor/github.com/libp2p/go-testutil/package.json deleted file mode 100644 index b81b72f0..00000000 --- a/vendor/github.com/libp2p/go-testutil/package.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "author": "whyrusleeping", - "bugs": { - "url": "https://github.com/libp2p/go-testutil" - }, - "gx": { - "dvcsimport": "github.com/libp2p/go-testutil", - "goversion": "1.7" - }, - "gxDependencies": [ - { - "hash": "QmbkT7eMTyXfpeyB3ZMxxcxg7XH8t6uXp49jqzz4HB7BGF", - "name": "go-log", - "version": "1.5.9" - }, - { - "author": "whyrusleeping", - "hash": "QmTW4SdgBWq9GjsBsHeUx8WuGxzhgzAf88UMH2w62PC8yK", - "name": "go-libp2p-crypto", - "version": "2.0.7" - }, - { - "author": "whyrusleeping", - "hash": "QmYVXrKrKHDC9FobgmcmshCDyWwdrfwfanNQN4oxJ9Fk3h", - "name": "go-libp2p-peer", - "version": "3.1.2" - }, - { - "hash": "QmTZBfrPJmjWsCvHEtX5FE6KimVJhsJg5sBbqEFYf4UZtL", - "name": "go-multiaddr", - "version": "1.4.1" - }, - { - "author": "multiformats", - "hash": "QmerPMzPk1mJVowm8KgmoknWa4yCYvvugMPsgWmDNUvDLW", - "name": "go-multihash", - "version": "1.0.9" - } - ], - "gxVersion": "0.8.0", - "language": "go", - "license": "MIT", - "name": "go-testutil", - "releaseCmd": "git commit -a -m \"gx publish $VERSION\"", - "version": "1.2.19" -} - diff --git a/vendor/github.com/libp2p/go-testutil/rand.go b/vendor/github.com/libp2p/go-testutil/rand.go deleted file mode 100644 index 9630bc14..00000000 --- a/vendor/github.com/libp2p/go-testutil/rand.go +++ /dev/null @@ -1,36 +0,0 @@ -package testutil - -import ( - "math/rand" - "sync" - "time" -) - -var SeededRand *rand.Rand - -func init() { - SeededRand = NewSeededRand(time.Now().UTC().UnixNano()) -} - -func NewSeededRand(seed int64) *rand.Rand { - src := rand.NewSource(seed) - return rand.New(&LockedRandSource{src: src}) -} - -type LockedRandSource struct { - lk sync.Mutex - src rand.Source -} - -func (r *LockedRandSource) Int63() (n int64) { - r.lk.Lock() - n = r.src.Int63() - r.lk.Unlock() - return -} - -func (r *LockedRandSource) Seed(seed int64) { - r.lk.Lock() - r.src.Seed(seed) - r.lk.Unlock() -} diff --git a/vendor/github.com/libp2p/go-testutil/util.go b/vendor/github.com/libp2p/go-testutil/util.go deleted file mode 100644 index ca27ea03..00000000 --- a/vendor/github.com/libp2p/go-testutil/util.go +++ /dev/null @@ -1,21 +0,0 @@ -package testutil - -import ( - "context" - "time" -) - -// WaitFor waits for `check` to stop returning an error or for the context to be -// canceled (whichever comes first). -func WaitFor(ctx context.Context, check func() error) error { - for { - time.Sleep(time.Millisecond * 10) - err := check() - if err == nil { - return nil - } - if ctx.Err() != nil { - return err - } - } -} diff --git a/vendor/github.com/libp2p/go-ws-transport/.travis.yml b/vendor/github.com/libp2p/go-ws-transport/.travis.yml index 923835bc..5163d693 100644 --- a/vendor/github.com/libp2p/go-ws-transport/.travis.yml +++ b/vendor/github.com/libp2p/go-ws-transport/.travis.yml @@ -23,7 +23,6 @@ script: cache: directories: - - $GOPATH/src/gx - $GOPATH/pkg/mod - $HOME/.cache/go-build diff --git a/vendor/github.com/libp2p/go-ws-transport/Makefile b/vendor/github.com/libp2p/go-ws-transport/Makefile deleted file mode 100644 index 2c5fbfe2..00000000 --- a/vendor/github.com/libp2p/go-ws-transport/Makefile +++ /dev/null @@ -1,10 +0,0 @@ -gx: - go get github.com/whyrusleeping/gx - go get github.com/whyrusleeping/gx-go - -deps: gx - gx --verbose install --global - gx-go rewrite - -publish: - gx-go rewrite --undo diff --git a/vendor/github.com/libp2p/go-ws-transport/README.md b/vendor/github.com/libp2p/go-ws-transport/README.md index 13761e21..e9c52a0d 100644 --- a/vendor/github.com/libp2p/go-ws-transport/README.md +++ b/vendor/github.com/libp2p/go-ws-transport/README.md @@ -1,9 +1,9 @@ # go-ws-transport -[![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](http://ipn.io) -[![](https://img.shields.io/badge/freenode-%23ipfs-blue.svg?style=flat-square)](http://webchat.freenode.net/?channels=%23ipfs) -[![](https://img.shields.io/badge/project-IPFS-blue.svg?style=flat-square)](http://ipfs.io/) -[![standard-readme compliant](https://img.shields.io/badge/standard--readme-OK-green.svg?style=flat-square)](https://github.com/RichardLitt/standard-readme) +[![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](https://protocol.ai) +[![](https://img.shields.io/badge/project-libp2p-yellow.svg?style=flat-square)](https://libp2p.io/) +[![](https://img.shields.io/badge/freenode-%23libp2p-yellow.svg?style=flat-square)](http://webchat.freenode.net/?channels=%23libp2p) +[![Discourse posts](https://img.shields.io/discourse/https/discuss.libp2p.io/posts.svg)](https://discuss.libp2p.io) [![GoDoc](https://godoc.org/github.com/libp2p/go-ws-transport?status.svg)](https://godoc.org/github.com/libp2p/go-ws-transport) [![Coverage Status](https://coveralls.io/repos/github/libp2p/go-ws-transport/badge.svg?branch=master)](https://coveralls.io/github/libp2p/go-ws-transport?branch=master) [![Build Status](https://travis-ci.org/libp2p/go-ws-transport.svg?branch=master)](https://travis-ci.org/libp2p/go-ws-transport) @@ -13,10 +13,14 @@ ## Install ```sh -> gx install --global -> gx-go rewrite +> go get github.com/libp2p/go-ws-transport ``` +This repo is [gomod](https://github.com/golang/go/wiki/Modules)-compatible, and users of +go 1.11 and later with modules enabled will automatically pull the latest tagged release +by referencing this package. Upgrades to future releases can be managed using `go get`, +or by editing your `go.mod` file as [described by the gomod documentation](https://github.com/golang/go/wiki/Modules#how-to-upgrade-and-downgrade-dependencies). + ## Usage @@ -33,3 +37,7 @@ This repository falls under the IPFS [Code of Conduct](https://github.com/ipfs/c ## License MIT + +--- + +The last gx published version of this module was: 2.0.27: QmaSWc4ox6SZQF6DHZvDuM9sP1syNajkKuPXmKR1t5BAz5 diff --git a/vendor/github.com/libp2p/go-ws-transport/go.mod b/vendor/github.com/libp2p/go-ws-transport/go.mod index 9fb1001c..b25b7dff 100644 --- a/vendor/github.com/libp2p/go-ws-transport/go.mod +++ b/vendor/github.com/libp2p/go-ws-transport/go.mod @@ -2,12 +2,11 @@ module github.com/libp2p/go-ws-transport require ( github.com/gorilla/websocket v1.4.0 - github.com/libp2p/go-conn-security v0.0.1 - github.com/libp2p/go-libp2p-peer v0.0.1 - github.com/libp2p/go-libp2p-transport v0.0.4 - github.com/libp2p/go-libp2p-transport-upgrader v0.0.1 - github.com/multiformats/go-multiaddr v0.0.1 + github.com/libp2p/go-libp2p-core v0.0.1 + github.com/libp2p/go-libp2p-mplex v0.2.0 + github.com/libp2p/go-libp2p-testing v0.0.3 + github.com/libp2p/go-libp2p-transport-upgrader v0.1.1 + github.com/multiformats/go-multiaddr v0.0.4 github.com/multiformats/go-multiaddr-net v0.0.1 - github.com/whyrusleeping/go-smux-multiplex v3.0.16+incompatible github.com/whyrusleeping/mafmt v1.2.8 ) diff --git a/vendor/github.com/libp2p/go-ws-transport/go.sum b/vendor/github.com/libp2p/go-ws-transport/go.sum index d01c0324..ad6d7b54 100644 --- a/vendor/github.com/libp2p/go-ws-transport/go.sum +++ b/vendor/github.com/libp2p/go-ws-transport/go.sum @@ -1,5 +1,3 @@ -github.com/AndreasBriese/bbloom v0.0.0-20180913140656-343706a395b7/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= -github.com/Kubuxu/go-os-helper v0.0.1/go.mod h1:N8B+I7vPCT80IcP58r50u4+gEEcsZETFUpAzWW2ep1Y= github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32 h1:qkOC5Gd33k54tobS36cXdAzJbeHaduLtnLQQwNoIi78= github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32/go.mod h1:DrZx5ec/dmnfpw9KyYoQyYo7d0KEvTkk/5M/vbZjAr8= @@ -10,37 +8,25 @@ github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVa github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dgraph-io/badger v1.5.5-0.20190226225317-8115aed38f8f/go.mod h1:VZxzAIRPHRVNRKRo6AXrX9BJegn6il06VMTZVJYCIjQ= -github.com/dgryski/go-farm v0.0.0-20190104051053-3adb47b1fb0f/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= 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/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.0 h1:kbxbvI4Un1LUWKxufD+BiE6AEExYYgkQLQmLFqA1LFk= -github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0= -github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gxed/hashland/keccakpg v0.0.1 h1:wrk3uMNaMxbXiHibbPO4S0ymqJMm41WiudyFSs7UnsU= github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfmKFJ6tItnhQ67kU= github.com/gxed/hashland/murmur3 v0.0.1 h1:SheiaIt0sda5K+8FLz952/1iWS9zrnKsEJaOJu4ZbSc= github.com/gxed/hashland/murmur3 v0.0.1/go.mod h1:KjXop02n4/ckmZSnY2+HKcLud/tcmvhST0bie/0lS48= -github.com/hashicorp/golang-lru v0.5.1/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/ipfs/go-datastore v0.0.1/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= -github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk= -github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps= -github.com/ipfs/go-ds-badger v0.0.2/go.mod h1:Y3QpeSFWQf6MopLTiZD+VT6IC1yZqaGmjvRcKeSGij8= -github.com/ipfs/go-ds-leveldb v0.0.1/go.mod h1:feO8V3kubwsEF22n0YRQCffeb79OOYIykR4L04tMOYc= -github.com/ipfs/go-ipfs-delay v0.0.0-20181109222059-70721b86a9a8/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= +github.com/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= github.com/ipfs/go-log v0.0.1 h1:9XTUN/rW64BCG1YhPK9Hoy3q8nr4gOmHHBpgFdfw6Lc= github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM= github.com/jbenet/go-temp-err-catcher v0.0.0-20150120210811-aac704a3f4f2 h1:vhC1OXXiT9R2pczegwz6moDvuRpggaroAXhPIseh57A= @@ -52,36 +38,21 @@ github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlT github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= -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/libp2p/go-buffer-pool v0.0.1 h1:9Rrn/H46cXjaA2HQ5Y8lyhOS1NhTkZ4yuEs2r3Eechg= github.com/libp2p/go-buffer-pool v0.0.1/go.mod h1:xtyIz9PMobb13WaxR6Zo1Pd1zXJKYg0a8KiIvDp3TzQ= -github.com/libp2p/go-conn-security v0.0.1 h1:4kMMrqrt9EUNCNjX1xagSJC+bq16uqjMe9lk1KBMVNs= -github.com/libp2p/go-conn-security v0.0.1/go.mod h1:bGmu51N0KU9IEjX7kl2PQjgZa40JQWnayTvNMgD/vyk= -github.com/libp2p/go-libp2p-crypto v0.0.1 h1:JNQd8CmoGTohO/akqrH16ewsqZpci2CbgYH/LmYl8gw= -github.com/libp2p/go-libp2p-crypto v0.0.1/go.mod h1:yJkNyDmO341d5wwXxDUGO0LykUVT72ImHNUqh5D/dBE= -github.com/libp2p/go-libp2p-interface-pnet v0.0.1 h1:7GnzRrBTJHEsofi1ahFdPN9Si6skwXQE9UqR2S+Pkh8= -github.com/libp2p/go-libp2p-interface-pnet v0.0.1/go.mod h1:el9jHpQAXK5dnTpKA4yfCNBZXvrzdOU75zz+C6ryp3k= -github.com/libp2p/go-libp2p-net v0.0.1 h1:xJ4Vh4yKF/XKb8fd1Ev0ebAGzVjMxXzrxG2kjtU+F5Q= -github.com/libp2p/go-libp2p-net v0.0.1/go.mod h1:Yt3zgmlsHOgUWSXmt5V/Jpz9upuJBE8EgNU9DrCcR8c= -github.com/libp2p/go-libp2p-peer v0.0.1 h1:0qwAOljzYewINrU+Kndoc+1jAL7vzY/oY2Go4DCGfyY= -github.com/libp2p/go-libp2p-peer v0.0.1/go.mod h1:nXQvOBbwVqoP+T5Y5nCjeH4sP9IX/J0AMzcDUVruVoo= -github.com/libp2p/go-libp2p-peerstore v0.0.1 h1:twKovq8YK5trLrd3nB7PD2Zu9JcyAIdm7Bz9yBWjhq8= -github.com/libp2p/go-libp2p-peerstore v0.0.1/go.mod h1:RabLyPVJLuNQ+GFyoEkfi8H4Ti6k/HtZJ7YKgtSq+20= -github.com/libp2p/go-libp2p-protocol v0.0.1 h1:+zkEmZ2yFDi5adpVE3t9dqh/N9TbpFWywowzeEzBbLM= -github.com/libp2p/go-libp2p-protocol v0.0.1/go.mod h1:Af9n4PiruirSDjHycM1QuiMi/1VZNHYcK8cLgFJLZ4s= -github.com/libp2p/go-libp2p-transport v0.0.1/go.mod h1:UzbUs9X+PHOSw7S3ZmeOxfnwaQY5vGDzZmKPod3N3tk= -github.com/libp2p/go-libp2p-transport v0.0.4 h1:/CPHQMN75/IQwkhBxxIo6p6PtL3rwFZtlzBROT3e8mw= -github.com/libp2p/go-libp2p-transport v0.0.4/go.mod h1:StoY3sx6IqsP6XKoabsPnHCwqKXWUMWU7Rfcsubee/A= -github.com/libp2p/go-libp2p-transport-upgrader v0.0.1 h1:rNtXkY6dty46mxYOHHAZQchI7gQdJStF683FhVnei/k= -github.com/libp2p/go-libp2p-transport-upgrader v0.0.1/go.mod h1:NJpUAgQab/8K6K0m+JmZCe5RUXG10UMEx4kWe9Ipj5c= -github.com/libp2p/go-maddr-filter v0.0.1 h1:apvYTg0aIxxQyBX+XHKOR+0+lYhGs1Yv+JmTH9nyl5I= -github.com/libp2p/go-maddr-filter v0.0.1/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= -github.com/libp2p/go-mplex v0.0.1 h1:dn2XGSrUxLtz3/8u85bGrwhUEKPX8MOF3lpmcWBZCWc= -github.com/libp2p/go-mplex v0.0.1/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0= +github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZxBdp967ls1g+k8= +github.com/libp2p/go-libp2p-core v0.0.1 h1:HSTZtFIq/W5Ue43Zw+uWZyy2Vl5WtF0zDjKN8/DT/1I= +github.com/libp2p/go-libp2p-core v0.0.1/go.mod h1:g/VxnTZ/1ygHxH3dKok7Vno1VfpvGcGip57wjTU4fco= +github.com/libp2p/go-libp2p-mplex v0.2.0 h1:vnR+/fUnL5d2kTB1Lfce1KVSP+bCCy2aJIvqvb9cFqE= +github.com/libp2p/go-libp2p-mplex v0.2.0/go.mod h1:Ejl9IyjvXJ0T9iqUTE1jpYATQ9NM3g+OtR+EMMODbKo= +github.com/libp2p/go-libp2p-testing v0.0.3 h1:bdij4bKaaND7tCsaXVjRfYkMpvoOeKj9AVQGJllA6jM= +github.com/libp2p/go-libp2p-testing v0.0.3/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= +github.com/libp2p/go-libp2p-transport-upgrader v0.1.1 h1:PZMS9lhjK9VytzMCW3tWHAXtKXmlURSc3ZdvwEcKCzw= +github.com/libp2p/go-libp2p-transport-upgrader v0.1.1/go.mod h1:IEtA6or8JUbsV07qPW4r01GnTenLW4oi3lOPbUMGJJA= +github.com/libp2p/go-maddr-filter v0.0.4 h1:hx8HIuuwk34KePddrp2mM5ivgPkZ09JH4AvsALRbFUs= +github.com/libp2p/go-maddr-filter v0.0.4/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= +github.com/libp2p/go-mplex v0.0.3 h1:YiMaevQcZtFU6DmKIF8xEO0vaui5kM5HJ1V1xkWQv14= +github.com/libp2p/go-mplex v0.0.3/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0= github.com/libp2p/go-stream-muxer v0.0.1 h1:Ce6e2Pyu+b5MC1k3eeFtAax0pW4gc6MosYSLV05UeLw= github.com/libp2p/go-stream-muxer v0.0.1/go.mod h1:bAo8x7YkSpadMTbtTaxGVHWUQsR/l5MEaHbKaliuT14= github.com/mattn/go-colorable v0.1.1 h1:G1f5SKeVxmagw/IyvzvtZE4Gybcc4Tr1tf7I8z0XgOg= @@ -92,36 +63,41 @@ github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0 github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16 h1:5W7KhL8HVF3XCFOweFD3BNESdnO8ewyYTFT2R+/b8FQ= github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= -github.com/mr-tron/base58 v1.1.0 h1:Y51FGVJ91WBqCEabAi5OPUz38eAx8DakuAm5svLcsfQ= github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= +github.com/mr-tron/base58 v1.1.1 h1:OJIdWOWYe2l5PQNgimGtuwHY8nDskvJ5vvs//YnzRLs= +github.com/mr-tron/base58 v1.1.1/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= -github.com/multiformats/go-multiaddr v0.0.1 h1:/QUV3VBMDI6pi6xfiw7lr6xhDWWvQKn9udPn68kLSdY= github.com/multiformats/go-multiaddr v0.0.1/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= +github.com/multiformats/go-multiaddr v0.0.2/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= +github.com/multiformats/go-multiaddr v0.0.4 h1:WgMSI84/eRLdbptXMkMWDXPjPq7SPLIgGUVm2eroyU4= +github.com/multiformats/go-multiaddr v0.0.4/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= github.com/multiformats/go-multiaddr-dns v0.0.1 h1:jQt9c6tDSdQLIlBo4tXYx7QUHCPjxsB1zXcag/2S7zc= github.com/multiformats/go-multiaddr-dns v0.0.1/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= github.com/multiformats/go-multiaddr-net v0.0.1 h1:76O59E3FavvHqNg7jvzWzsPSW5JSi/ek0E4eiDVbg9g= github.com/multiformats/go-multiaddr-net v0.0.1/go.mod h1:nw6HSxNmCIQH27XPGBuX+d1tnvM7ihcFwHMSstNAVUU= +github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs= github.com/multiformats/go-multihash v0.0.1 h1:HHwN1K12I+XllBCrqKnhX949Orn4oawPkegHMu2vDqQ= github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= 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/ginkgo v1.8.0 h1:VkHVNpR4iVnU8XQR6DBm8BqYjN7CRzw+xKUbVVbbW9w= +github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.5.0 h1:izbySO9zDPmjJ8rDjLvkA2zJHIo+HkYXHnf7eN7SSyo= +github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/opentracing/opentracing-go v1.0.2 h1:3jA2P6O1F9UOrWVpwrIo17pu01KWvNWg4X946/Y5Zwg= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -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/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a h1:/eS3yfGjQKG+9kayBkj0ip1BGhq6zJ3eaVksphxAaek= +github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a/go.mod h1:7AyxJNCJ7SBZ1MfVQCWD6Uqo2oubI2Eq2y2eqf+A5r0= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 h1:RC6RW7j+1+HkWaX/Yh71Ee5ZHaHYt7ZP4sQgUrm6cDU= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572/go.mod h1:w0SWMsp6j9O/dk4/ZpIhL+3CkG8ofA2vuv7k+ltqUMc= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= -github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1/go.mod h1:8UvriyWtv5Q5EOgjHaSseUEdkQfvwFv1I/In/O2M9gc= github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc h1:9lDbC6Rz4bwmou+oE6Dt4Cb2BGMur5eR/GYptkKUVHo= github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc/go.mod h1:bopw91TMyo8J3tvftk8xmU2kPmlrt4nScJQZU2hE5EM= -github.com/whyrusleeping/go-smux-multiplex v3.0.16+incompatible h1:iqksILj8STw03EJQe7Laj4ubnw+ojOyik18cd5vPL1o= -github.com/whyrusleeping/go-smux-multiplex v3.0.16+incompatible/go.mod h1:34LEDbeKFZInPUrAG+bjuJmUXONGdEFW7XL0SpTY1y4= github.com/whyrusleeping/mafmt v1.2.8 h1:TCghSl5kkwEE0j+sU/gudyhVMRlpBin8fMBBHg59EbA= github.com/whyrusleeping/mafmt v1.2.8/go.mod h1:faQJFPbLSxzD9xpA02ttW/tS9vZykNvXwGvqIpk20FA= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -140,10 +116,8 @@ golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= 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/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= diff --git a/vendor/github.com/libp2p/go-ws-transport/listener.go b/vendor/github.com/libp2p/go-ws-transport/listener.go index 437be989..517c719a 100644 --- a/vendor/github.com/libp2p/go-ws-transport/listener.go +++ b/vendor/github.com/libp2p/go-ws-transport/listener.go @@ -26,7 +26,7 @@ func (l *listener) serve() { func (l *listener) ServeHTTP(w http.ResponseWriter, r *http.Request) { c, err := upgrader.Upgrade(w, r, nil) if err != nil { - http.Error(w, "Failed to upgrade websocket", 400) + // The upgrader writes a response for us. return } diff --git a/vendor/github.com/libp2p/go-ws-transport/package.json b/vendor/github.com/libp2p/go-ws-transport/package.json deleted file mode 100644 index 4be1f82d..00000000 --- a/vendor/github.com/libp2p/go-ws-transport/package.json +++ /dev/null @@ -1,72 +0,0 @@ -{ - "author": "whyrusleeping", - "bugs": { - "url": "https://github.com/libp2p/go-ws-transport/issues" - }, - "gx": { - "dvcsimport": "github.com/libp2p/go-ws-transport" - }, - "gxDependencies": [ - { - "author": "whyrusleeping", - "hash": "Qmc85NSvmSG4Frn9Vb2cBc1rMyULH6D3TNVEfCzSKoUpip", - "name": "go-multiaddr-net", - "version": "1.7.2" - }, - { - "author": "whyrusleeping", - "hash": "QmUrZZavcArYChpibtP8KgQXsAEpvgzUk73B2oj3HLbWc4", - "name": "mafmt", - "version": "1.2.11" - }, - { - "author": "whyrusleeping", - "hash": "QmNQWMWWBmkAcaVEspSNwYB95axzKFhYTdqZtABA2zXoPu", - "name": "go-libp2p-transport", - "version": "3.0.27" - }, - { - "author": "gorilla", - "hash": "QmZH5VXfAJouGMyCCHTRPGCT3e5MG9Lu78Ln3YAYW1XTts", - "name": "websocket", - "version": "0.0.1" - }, - { - "author": "multiformats", - "hash": "QmTZBfrPJmjWsCvHEtX5FE6KimVJhsJg5sBbqEFYf4UZtL", - "name": "go-multiaddr", - "version": "1.4.1" - }, - { - "author": "Stebalien", - "hash": "QmPRoHqULmP4MuKAN5EFaJ64MLpeMY8cny2318xDBDmmkp", - "name": "go-conn-security", - "version": "0.1.28" - }, - { - "author": "whyrusleeping", - "hash": "QmaJvNdDccVkTELQLCGXWrLxgaQ14aMdhzZx1EiHPXKbDc", - "name": "go-smux-multiplex", - "version": "3.0.19" - }, - { - "author": "steb", - "hash": "QmeqC5shQjEBRG9B8roZqQCJ9xb7Pq6AbWxJFMyLgqBBWh", - "name": "go-libp2p-transport-upgrader", - "version": "0.1.28" - }, - { - "author": "whyrusleeping", - "hash": "QmYVXrKrKHDC9FobgmcmshCDyWwdrfwfanNQN4oxJ9Fk3h", - "name": "go-libp2p-peer", - "version": "3.1.2" - } - ], - "gxVersion": "0.4.0", - "language": "go", - "license": "MIT", - "name": "go-ws-transport", - "releaseCmd": "git commit -a -m \"gx publish $VERSION\"", - "version": "2.0.27" -} - diff --git a/vendor/github.com/libp2p/go-ws-transport/websocket.go b/vendor/github.com/libp2p/go-ws-transport/websocket.go index 681d6764..972681a6 100644 --- a/vendor/github.com/libp2p/go-ws-transport/websocket.go +++ b/vendor/github.com/libp2p/go-ws-transport/websocket.go @@ -8,10 +8,12 @@ import ( "net/http" "net/url" - ws "github.com/gorilla/websocket" - peer "github.com/libp2p/go-libp2p-peer" - tpt "github.com/libp2p/go-libp2p-transport" + "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p-core/transport" + tptu "github.com/libp2p/go-libp2p-transport-upgrader" + + ws "github.com/gorilla/websocket" ma "github.com/multiformats/go-multiaddr" manet "github.com/multiformats/go-multiaddr-net" mafmt "github.com/whyrusleeping/mafmt" @@ -61,7 +63,7 @@ func New(u *tptu.Upgrader) *WebsocketTransport { return &WebsocketTransport{u} } -var _ tpt.Transport = (*WebsocketTransport)(nil) +var _ transport.Transport = (*WebsocketTransport)(nil) func (t *WebsocketTransport) CanDial(a ma.Multiaddr) bool { return WsFmt.Matches(a) @@ -94,7 +96,7 @@ func (t *WebsocketTransport) maDial(ctx context.Context, raddr ma.Multiaddr) (ma return mnc, nil } -func (t *WebsocketTransport) Dial(ctx context.Context, raddr ma.Multiaddr, p peer.ID) (tpt.Conn, error) { +func (t *WebsocketTransport) Dial(ctx context.Context, raddr ma.Multiaddr, p peer.ID) (transport.CapableConn, error) { macon, err := t.maDial(ctx, raddr) if err != nil { return nil, err @@ -130,7 +132,7 @@ func (t *WebsocketTransport) maListen(a ma.Multiaddr) (manet.Listener, error) { return malist, nil } -func (t *WebsocketTransport) Listen(a ma.Multiaddr) (tpt.Listener, error) { +func (t *WebsocketTransport) Listen(a ma.Multiaddr) (transport.Listener, error) { malist, err := t.maListen(a) if err != nil { return nil, err diff --git a/vendor/github.com/whyrusleeping/yamux/.gitignore b/vendor/github.com/libp2p/go-yamux/.gitignore similarity index 100% rename from vendor/github.com/whyrusleeping/yamux/.gitignore rename to vendor/github.com/libp2p/go-yamux/.gitignore diff --git a/vendor/github.com/whyrusleeping/yamux/LICENSE b/vendor/github.com/libp2p/go-yamux/LICENSE similarity index 100% rename from vendor/github.com/whyrusleeping/yamux/LICENSE rename to vendor/github.com/libp2p/go-yamux/LICENSE diff --git a/vendor/github.com/libp2p/go-yamux/LICENSE-BSD b/vendor/github.com/libp2p/go-yamux/LICENSE-BSD new file mode 100644 index 00000000..6a66aea5 --- /dev/null +++ b/vendor/github.com/libp2p/go-yamux/LICENSE-BSD @@ -0,0 +1,27 @@ +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/github.com/whyrusleeping/yamux/README.md b/vendor/github.com/libp2p/go-yamux/README.md similarity index 98% rename from vendor/github.com/whyrusleeping/yamux/README.md rename to vendor/github.com/libp2p/go-yamux/README.md index d4db7fc9..dabeec72 100644 --- a/vendor/github.com/whyrusleeping/yamux/README.md +++ b/vendor/github.com/libp2p/go-yamux/README.md @@ -22,7 +22,7 @@ Yamux features include: ## Documentation -For complete documentation, see the associated [Godoc](http://godoc.org/github.com/hashicorp/yamux). +For complete documentation, see the associated [Godoc](http://godoc.org/github.com/libp2p/go-yamux). ## Specification diff --git a/vendor/github.com/whyrusleeping/yamux/addr.go b/vendor/github.com/libp2p/go-yamux/addr.go similarity index 100% rename from vendor/github.com/whyrusleeping/yamux/addr.go rename to vendor/github.com/libp2p/go-yamux/addr.go diff --git a/vendor/github.com/whyrusleeping/yamux/const.go b/vendor/github.com/libp2p/go-yamux/const.go similarity index 73% rename from vendor/github.com/whyrusleeping/yamux/const.go rename to vendor/github.com/libp2p/go-yamux/const.go index 22e349f9..ca9c14cf 100644 --- a/vendor/github.com/whyrusleeping/yamux/const.go +++ b/vendor/github.com/libp2p/go-yamux/const.go @@ -6,59 +6,68 @@ import ( ) type YamuxError struct { - msg string + msg string + timeout, temporary bool } func (ye YamuxError) Error() string { return ye.msg } +func (ye YamuxError) Timeout() bool { + return ye.timeout +} + +func (ye YamuxError) Temporary() bool { + return ye.temporary +} + var ( // ErrInvalidVersion means we received a frame with an // invalid version - ErrInvalidVersion = &YamuxError{"invalid protocol version"} + ErrInvalidVersion = &YamuxError{msg: "invalid protocol version"} // ErrInvalidMsgType means we received a frame with an // invalid message type - ErrInvalidMsgType = &YamuxError{"invalid msg type"} + ErrInvalidMsgType = &YamuxError{msg: "invalid msg type"} // ErrSessionShutdown is used if there is a shutdown during // an operation - ErrSessionShutdown = &YamuxError{"session shutdown"} + ErrSessionShutdown = &YamuxError{msg: "session shutdown"} // ErrStreamsExhausted is returned if we have no more // stream ids to issue - ErrStreamsExhausted = &YamuxError{"streams exhausted"} + ErrStreamsExhausted = &YamuxError{msg: "streams exhausted"} // ErrDuplicateStream is used if a duplicate stream is // opened inbound - ErrDuplicateStream = &YamuxError{"duplicate stream initiated"} + ErrDuplicateStream = &YamuxError{msg: "duplicate stream initiated"} // ErrReceiveWindowExceeded indicates the window was exceeded - ErrRecvWindowExceeded = &YamuxError{"recv window exceeded"} + ErrRecvWindowExceeded = &YamuxError{msg: "recv window exceeded"} // ErrTimeout is used when we reach an IO deadline - ErrTimeout = &YamuxError{"i/o deadline reached"} + ErrTimeout = &YamuxError{msg: "i/o deadline reached", timeout: true, temporary: true} // ErrStreamClosed is returned when using a closed stream - ErrStreamClosed = &YamuxError{"stream closed"} + ErrStreamClosed = &YamuxError{msg: "stream closed"} // ErrUnexpectedFlag is set when we get an unexpected flag - ErrUnexpectedFlag = &YamuxError{"unexpected flag"} + ErrUnexpectedFlag = &YamuxError{msg: "unexpected flag"} // ErrRemoteGoAway is used when we get a go away from the other side - ErrRemoteGoAway = &YamuxError{"remote end is not accepting connections"} + ErrRemoteGoAway = &YamuxError{msg: "remote end is not accepting connections"} // ErrConnectionReset is sent if a stream is reset. This can happen // if the backlog is exceeded, or if there was a remote GoAway. - ErrConnectionReset = &YamuxError{"stream reset"} + ErrConnectionReset = &YamuxError{msg: "stream reset"} // ErrConnectionWriteTimeout indicates that we hit the "safety valve" // timeout writing to the underlying stream connection. - ErrConnectionWriteTimeout = &YamuxError{"connection write timeout"} + ErrConnectionWriteTimeout = &YamuxError{msg: "connection write timeout", timeout: true} // ErrKeepAliveTimeout is sent if a missed keepalive caused the stream close - ErrKeepAliveTimeout = &YamuxError{"keepalive timeout"} + ErrKeepAliveTimeout = &YamuxError{msg: "keepalive timeout", timeout: true} ) const ( @@ -129,7 +138,7 @@ const ( sizeOfStreamID + sizeOfLength ) -type header []byte +type header [headerSize]byte func (h header) Version() uint8 { return h[0] @@ -156,10 +165,12 @@ func (h header) String() string { h.Version(), h.MsgType(), h.Flags(), h.StreamID(), h.Length()) } -func (h header) encode(msgType uint8, flags uint16, streamID uint32, length uint32) { +func encode(msgType uint8, flags uint16, streamID uint32, length uint32) header { + var h header h[0] = protoVersion h[1] = msgType binary.BigEndian.PutUint16(h[2:4], flags) binary.BigEndian.PutUint32(h[4:8], streamID) binary.BigEndian.PutUint32(h[8:12], length) + return h } diff --git a/vendor/github.com/libp2p/go-yamux/deadline.go b/vendor/github.com/libp2p/go-yamux/deadline.go new file mode 100644 index 00000000..16da56dd --- /dev/null +++ b/vendor/github.com/libp2p/go-yamux/deadline.go @@ -0,0 +1,80 @@ +// Copied from the go standard library. +// +// 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-BSD file. + +package yamux + +import ( + "sync" + "time" +) + +// pipeDeadline is an abstraction for handling timeouts. +type pipeDeadline struct { + mu sync.Mutex // Guards timer and cancel + timer *time.Timer + cancel chan struct{} // Must be non-nil +} + +func makePipeDeadline() pipeDeadline { + return pipeDeadline{cancel: make(chan struct{})} +} + +// set sets the point in time when the deadline will time out. +// A timeout event is signaled by closing the channel returned by waiter. +// Once a timeout has occurred, the deadline can be refreshed by specifying a +// t value in the future. +// +// A zero value for t prevents timeout. +func (d *pipeDeadline) set(t time.Time) { + d.mu.Lock() + defer d.mu.Unlock() + + if d.timer != nil && !d.timer.Stop() { + <-d.cancel // Wait for the timer callback to finish and close cancel + } + d.timer = nil + + // Time is zero, then there is no deadline. + closed := isClosedChan(d.cancel) + if t.IsZero() { + if closed { + d.cancel = make(chan struct{}) + } + return + } + + // Time in the future, setup a timer to cancel in the future. + if dur := time.Until(t); dur > 0 { + if closed { + d.cancel = make(chan struct{}) + } + d.timer = time.AfterFunc(dur, func() { + close(d.cancel) + }) + return + } + + // Time in the past, so close immediately. + if !closed { + close(d.cancel) + } +} + +// wait returns a channel that is closed when the deadline is exceeded. +func (d *pipeDeadline) wait() chan struct{} { + d.mu.Lock() + defer d.mu.Unlock() + return d.cancel +} + +func isClosedChan(c <-chan struct{}) bool { + select { + case <-c: + return true + default: + return false + } +} diff --git a/vendor/github.com/libp2p/go-yamux/go.mod b/vendor/github.com/libp2p/go-yamux/go.mod new file mode 100644 index 00000000..0feb3c92 --- /dev/null +++ b/vendor/github.com/libp2p/go-yamux/go.mod @@ -0,0 +1,5 @@ +module github.com/libp2p/go-yamux + +go 1.12 + +require github.com/libp2p/go-buffer-pool v0.0.2 diff --git a/vendor/github.com/libp2p/go-yamux/go.sum b/vendor/github.com/libp2p/go-yamux/go.sum new file mode 100644 index 00000000..012e1223 --- /dev/null +++ b/vendor/github.com/libp2p/go-yamux/go.sum @@ -0,0 +1,2 @@ +github.com/libp2p/go-buffer-pool v0.0.2 h1:QNK2iAFa8gjAe1SPz6mHSMuCcjs+X1wlHzeOSqcmlfs= +github.com/libp2p/go-buffer-pool v0.0.2/go.mod h1:MvaB6xw5vOrDl8rYZGLFdKAuk/hRoRZd1Vi32+RXyFM= diff --git a/vendor/github.com/whyrusleeping/yamux/mux.go b/vendor/github.com/libp2p/go-yamux/mux.go similarity index 75% rename from vendor/github.com/whyrusleeping/yamux/mux.go rename to vendor/github.com/libp2p/go-yamux/mux.go index b6fb648c..a8d7064a 100644 --- a/vendor/github.com/whyrusleeping/yamux/mux.go +++ b/vendor/github.com/libp2p/go-yamux/mux.go @@ -3,6 +3,7 @@ package yamux import ( "fmt" "io" + "net" "os" "time" ) @@ -37,6 +38,15 @@ type Config struct { // // Set to 0 to disable it. ReadBufSize int + + // WriteCoalesceDelay is the maximum amount of time we'll delay + // coalescing a packet before sending it. This should be on the order of + // micro-milliseconds. + WriteCoalesceDelay time.Duration + + // MaxMessageSize is the maximum size of a message that we'll send on a + // stream. This ensures that a single stream doesn't hog a connection. + MaxMessageSize uint32 } // DefaultConfig is used to return a default configuration @@ -49,6 +59,8 @@ func DefaultConfig() *Config { MaxStreamWindowSize: initialStreamWindow, LogOutput: os.Stderr, ReadBufSize: 4096, + MaxMessageSize: 64 * 1024, // Means 64KiB/10s = 52kbps minimum speed. + WriteCoalesceDelay: 100 * time.Microsecond, } } @@ -63,13 +75,19 @@ func VerifyConfig(config *Config) error { if config.MaxStreamWindowSize < initialStreamWindow { return fmt.Errorf("MaxStreamWindowSize must be larger than %d", initialStreamWindow) } + if config.MaxMessageSize < 1024 { + return fmt.Errorf("MaxMessageSize must be greater than a kilobyte") + } + if config.WriteCoalesceDelay < 0 { + return fmt.Errorf("WriteCoalesceDelay must be >= 0") + } return nil } // Server is used to initialize a new server-side connection. // There must be at most one server-side connection. If a nil config is // provided, the DefaultConfiguration will be used. -func Server(conn io.ReadWriteCloser, config *Config) (*Session, error) { +func Server(conn net.Conn, config *Config) (*Session, error) { if config == nil { config = DefaultConfig() } @@ -81,7 +99,7 @@ func Server(conn io.ReadWriteCloser, config *Config) (*Session, error) { // Client is used to initialize a new client-side connection. // There must be at most one client-side connection. -func Client(conn io.ReadWriteCloser, config *Config) (*Session, error) { +func Client(conn net.Conn, config *Config) (*Session, error) { if config == nil { config = DefaultConfig() } diff --git a/vendor/github.com/whyrusleeping/yamux/session.go b/vendor/github.com/libp2p/go-yamux/session.go similarity index 68% rename from vendor/github.com/whyrusleeping/yamux/session.go rename to vendor/github.com/libp2p/go-yamux/session.go index 8d5ac2a0..4af4c055 100644 --- a/vendor/github.com/whyrusleeping/yamux/session.go +++ b/vendor/github.com/libp2p/go-yamux/session.go @@ -8,10 +8,13 @@ import ( "log" "math" "net" + "os" "strings" "sync" "sync/atomic" "time" + + "github.com/libp2p/go-buffer-pool" ) // Session is used to wrap a reliable ordered connection and to @@ -36,7 +39,7 @@ type Session struct { logger *log.Logger // conn is the underlying connection - conn io.ReadWriteCloser + conn net.Conn // reader is a buffered reader reader io.Reader @@ -61,9 +64,8 @@ type Session struct { // acceptCh is used to pass ready streams to the client acceptCh chan *Stream - // sendCh is used to mark a stream as ready to send, - // or to send a header out directly. - sendCh chan *sendReady + // sendCh is used to send messages + sendCh chan []byte // recvDoneCh is closed when recv() exits to avoid a race // between stream registration and stream shutdown @@ -82,15 +84,11 @@ type Session struct { shutdownErr error shutdownCh chan struct{} shutdownLock sync.Mutex -} -// sendReady is used to either mark a stream as ready -// or to directly send a header -type sendReady struct { - Hdr []byte - Body io.Reader - Err chan error - Stage uint32 + // keepaliveTimer is a periodic timer for keepalive messages. It's nil + // when keepalives are disabled. + keepaliveLock sync.Mutex + keepaliveTimer *time.Timer } const ( @@ -99,7 +97,7 @@ const ( ) // newSession is used to construct a new session -func newSession(config *Config, conn io.ReadWriteCloser, client bool, readBuf int) *Session { +func newSession(config *Config, conn net.Conn, client bool, readBuf int) *Session { var reader io.Reader = conn if readBuf > 0 { reader = bufio.NewReaderSize(reader, readBuf) @@ -115,7 +113,7 @@ func newSession(config *Config, conn io.ReadWriteCloser, client bool, readBuf in inflight: make(map[uint32]struct{}), synCh: make(chan struct{}, config.AcceptBacklog), acceptCh: make(chan *Stream, config.AcceptBacklog), - sendCh: make(chan *sendReady, 64), + sendCh: make(chan []byte, 64), recvDoneCh: make(chan struct{}), sendDoneCh: make(chan struct{}), shutdownCh: make(chan struct{}), @@ -125,11 +123,11 @@ func newSession(config *Config, conn io.ReadWriteCloser, client bool, readBuf in } else { s.nextStreamID = 2 } - go s.recv() - go s.send() if config.EnableKeepAlive { - go s.keepalive() + s.startKeepalive() } + go s.recv() + go s.send() return s } @@ -169,7 +167,7 @@ func (s *Session) Open() (net.Conn, error) { // OpenStream is used to create a new stream func (s *Session) OpenStream() (*Stream, error) { if s.IsClosed() { - return nil, ErrSessionShutdown + return nil, s.shutdownErr } if atomic.LoadInt32(&s.remoteGoAway) == 1 { return nil, ErrRemoteGoAway @@ -179,7 +177,7 @@ func (s *Session) OpenStream() (*Stream, error) { select { case s.synCh <- struct{}{}: case <-s.shutdownCh: - return nil, ErrSessionShutdown + return nil, s.shutdownErr } GET_ID: @@ -250,6 +248,7 @@ func (s *Session) Close() error { } close(s.shutdownCh) s.conn.Close() + s.stopKeepalive() <-s.recvDoneCh <-s.sendDoneCh @@ -275,14 +274,13 @@ func (s *Session) exitErr(err error) { // GoAway can be used to prevent accepting further // connections. It does not close the underlying conn. func (s *Session) GoAway() error { - return s.waitForSend(s.goAway(goAwayNormal), nil) + return s.sendMsg(s.goAway(goAwayNormal), nil, nil) } // goAway is used to send a goAway message func (s *Session) goAway(reason uint32) header { atomic.SwapInt32(&s.localGoAway, 1) - hdr := header(make([]byte, headerSize)) - hdr.encode(typeGoAway, 0, 0, reason) + hdr := encode(typeGoAway, 0, 0, reason) return hdr } @@ -299,9 +297,8 @@ func (s *Session) Ping() (time.Duration, error) { s.pingLock.Unlock() // Send the ping request - hdr := header(make([]byte, headerSize)) - hdr.encode(typePing, flagSYN, 0, id) - if err := s.waitForSend(hdr, nil); err != nil { + hdr := encode(typePing, flagSYN, 0, id) + if err := s.sendMsg(hdr, nil, nil); err != nil { return 0, err } @@ -315,140 +312,70 @@ func (s *Session) Ping() (time.Duration, error) { s.pingLock.Unlock() return 0, ErrTimeout case <-s.shutdownCh: - return 0, ErrSessionShutdown + return 0, s.shutdownErr } // Compute the RTT return time.Now().Sub(start), nil } -// keepalive is a long running goroutine that periodically does -// a ping to keep the connection alive. -func (s *Session) keepalive() { - for { - select { - case <-time.After(s.config.KeepAliveInterval): - _, err := s.Ping() - if err != nil { - s.logger.Printf("[ERR] yamux: keepalive failed: %v", err) - s.exitErr(ErrKeepAliveTimeout) - return - } - case <-s.shutdownCh: +// startKeepalive starts the keepalive process. +func (s *Session) startKeepalive() { + s.keepaliveLock.Lock() + defer s.keepaliveLock.Unlock() + s.keepaliveTimer = time.AfterFunc(s.config.KeepAliveInterval, func() { + s.keepaliveLock.Lock() + + if s.keepaliveTimer == nil { + s.keepaliveLock.Unlock() + // keepalives have been stopped. return } - } -} - -// waitForSendErr waits to send a header, checking for a potential shutdown -func (s *Session) waitForSend(hdr header, body io.Reader) error { - errCh := make(chan error, 1) - return s.waitForSendErr(hdr, body, errCh, nil) -} - -func pooledTimer(d time.Duration) (*time.Timer, func()) { - t := timerPool.Get() - timer := t.(*time.Timer) - timer.Reset(d) - cancelFn := func() { - timer.Stop() - select { - case <-timer.C: - default: + _, err := s.Ping() + if err != nil { + // Make sure to unlock before exiting so we don't + // deadlock trying to shutdown keepalives. + s.keepaliveLock.Unlock() + s.logger.Printf("[ERR] yamux: keepalive failed: %v", err) + s.exitErr(ErrKeepAliveTimeout) + return } - timerPool.Put(t) - } - return timer, cancelFn + s.keepaliveTimer.Reset(s.config.KeepAliveInterval) + s.keepaliveLock.Unlock() + }) } -// waitForSendErr waits to send a header with optional data, checking for a -// potential shutdown. Since there's the expectation that sends can happen -// in a timely manner, we enforce the connection write timeout here. -// -// timeout is: -// * `nil` if (a) this is a control message (ping, go away, window update, etc.), or (b) if the user -// has not set a write deadline on the stream. -// * non-`nil` if (a) this is a user-requested write, and (b) the stream has a write deadline. -func (s *Session) waitForSendErr(hdr header, body io.Reader, errCh chan error, timeout <-chan time.Time) error { - select { - case <-s.shutdownCh: - return ErrSessionShutdown - default: - } - - var connWriteTimerCh <-chan time.Time - - if timeout == nil { - // fall back to the connection write timeout. - t, cancelFn := pooledTimer(s.config.ConnectionWriteTimeout) - defer cancelFn() - connWriteTimerCh = t.C - } - - ready := &sendReady{Hdr: hdr, Body: body, Err: errCh, Stage: stageInitial} - - select { - case <-s.shutdownCh: - return ErrSessionShutdown - case s.sendCh <- ready: - case <-timeout: - // we timed out before the write went across the channel. keep connection open. - return ErrTimeout - case <-connWriteTimerCh: - // we timed out before the write went across the channel. keep connection open. - return ErrTimeout - } - - // >>> The write went across the channel. >>> - -WAIT: - select { - case <-s.sendDoneCh: // shutdown isn't enough, we need to wait for the send loop to exit. - return ErrSessionShutdown - case err := <-errCh: - return err - case <-timeout: - // A deadline had been set on the stream. Try to abort the write if it hasn't started. - if atomic.CompareAndSwapUint32(&ready.Stage, stageInitial, stageFinal) { - // If successful, the connection stays alive. - return ErrTimeout - } - // Otherwise, handle the partial write. Await the connection write timeout. - t, cancelFn := pooledTimer(s.config.ConnectionWriteTimeout) - connWriteTimerCh = t.C - defer cancelFn() - goto WAIT - case <-connWriteTimerCh: - // The connection write timeout has fired. Try to cancel the write only if this was a fallback timer. - if timeout == nil && atomic.CompareAndSwapUint32(&ready.Stage, stageInitial, stageFinal) { - return ErrTimeout - } - // Terminate the connection. - s.exitErr(ErrConnectionWriteTimeout) - return ErrConnectionWriteTimeout +// stopKeepalive stops the keepalive process. +func (s *Session) stopKeepalive() { + s.keepaliveLock.Lock() + defer s.keepaliveLock.Unlock() + if s.keepaliveTimer != nil { + s.keepaliveTimer.Stop() } } -// sendNoWait does a send without waiting. Since there's the expectation that -// the send happens right here, we enforce the connection write timeout if we -// can't queue the header to be sent. -func (s *Session) sendNoWait(hdr header) error { +// send sends the header and body. +func (s *Session) sendMsg(hdr header, body []byte, deadline <-chan struct{}) error { select { case <-s.shutdownCh: - return ErrSessionShutdown + return s.shutdownErr default: } - timer, cancelFn := pooledTimer(s.config.ConnectionWriteTimeout) - defer cancelFn() + // duplicate as we're sending this async. + buf := pool.Get(headerSize + len(body)) + copy(buf[:headerSize], hdr[:]) + copy(buf[headerSize:], body) select { - case s.sendCh <- &sendReady{Hdr: hdr, Stage: stageInitial}: - return nil case <-s.shutdownCh: - return ErrSessionShutdown - case <-timer.C: - return ErrConnectionWriteTimeout + pool.Put(buf) + return s.shutdownErr + case s.sendCh <- buf: + return nil + case <-deadline: + pool.Put(buf) + return ErrTimeout } } @@ -458,8 +385,44 @@ func (s *Session) send() { s.exitErr(err) } } + func (s *Session) sendLoop() error { defer close(s.sendDoneCh) + + // Extend the write deadline if we've passed the halfway point. This can + // be expensive so this ensures we only have to do this once every + // ConnectionWriteTimeout/2 (usually 5s). + var lastWriteDeadline time.Time + extendWriteDeadline := func() error { + now := time.Now() + // If over half of the deadline has elapsed, extend it. + if now.Add(s.config.ConnectionWriteTimeout / 2).After(lastWriteDeadline) { + lastWriteDeadline = now.Add(s.config.ConnectionWriteTimeout) + return s.conn.SetWriteDeadline(lastWriteDeadline) + } + return nil + } + + writer := s.conn + + // FIXME: https://github.com/libp2p/go-libp2p/issues/644 + // Write coalescing is disabled for now. + + //writer := pool.Writer{W: s.conn} + + //var writeTimeout *time.Timer + //var writeTimeoutCh <-chan time.Time + //if s.config.WriteCoalesceDelay > 0 { + // writeTimeout = time.NewTimer(s.config.WriteCoalesceDelay) + // defer writeTimeout.Stop() + + // writeTimeoutCh = writeTimeout.C + //} else { + // ch := make(chan time.Time) + // close(ch) + // writeTimeoutCh = ch + //} + for { // yield after processing the last message, if we've shutdown. // s.sendCh is a buffered channel and Go doesn't guarantee select order. @@ -469,42 +432,51 @@ func (s *Session) sendLoop() error { default: } + // Flushes at least once every 100 microseconds unless we're + // constantly writing. + var buf []byte select { - case ready := <-s.sendCh: - // Commit to perform the write, iff it has not expired prior to being consumed from the ch. - if !atomic.CompareAndSwapUint32(&ready.Stage, stageInitial, stageFinal) { - continue - } - - // Send a header if ready - if ready.Hdr != nil { - sent := 0 - for sent < len(ready.Hdr) { - n, err := s.conn.Write(ready.Hdr[sent:]) - if err != nil { - s.logger.Printf("[ERR] yamux: Failed to write header: %v", err) - asyncSendErr(ready.Err, err) - return err - } - sent += n - } - } + case buf = <-s.sendCh: + case <-s.shutdownCh: + return nil + //default: + // select { + // case buf = <-s.sendCh: + // case <-s.shutdownCh: + // return nil + // case <-writeTimeoutCh: + // if err := writer.Flush(); err != nil { + // if os.IsTimeout(err) { + // err = ErrConnectionWriteTimeout + // } + // return err + // } + + // select { + // case buf = <-s.sendCh: + // case <-s.shutdownCh: + // return nil + // } + + // if writeTimeout != nil { + // writeTimeout.Reset(s.config.WriteCoalesceDelay) + // } + // } + } - // Send data from a body if given - if ready.Body != nil { - _, err := io.Copy(s.conn, ready.Body) - if err != nil { - s.logger.Printf("[ERR] yamux: Failed to write body: %v", err) - asyncSendErr(ready.Err, err) - return err - } - } + if err := extendWriteDeadline(); err != nil { + pool.Put(buf) + return err + } - // No error, successful send - asyncSendErr(ready.Err, nil) + _, err := writer.Write(buf) + pool.Put(buf) - case <-s.shutdownCh: - return nil + if err != nil { + if os.IsTimeout(err) { + err = ErrConnectionWriteTimeout + } + return err } } } @@ -529,10 +501,10 @@ var ( // recvLoop continues to receive data until a fatal error is encountered func (s *Session) recvLoop() error { defer close(s.recvDoneCh) - hdr := header(make([]byte, headerSize)) + var hdr header for { // Read the header - if _, err := io.ReadFull(s.reader, hdr); err != nil { + if _, err := io.ReadFull(s.reader, hdr[:]); err != nil { if err != io.EOF && !strings.Contains(err.Error(), "closed") && !strings.Contains(err.Error(), "reset by peer") { s.logger.Printf("[ERR] yamux: Failed to read header: %v", err) } @@ -590,7 +562,7 @@ func (s *Session) handleStreamMessage(hdr header) error { // Check if this is a window update if hdr.MsgType() == typeWindowUpdate { if err := stream.incrSendWindow(hdr, flags); err != nil { - if sendErr := s.sendNoWait(s.goAway(goAwayProtoErr)); sendErr != nil { + if sendErr := s.sendMsg(s.goAway(goAwayProtoErr), nil, nil); sendErr != nil { s.logger.Printf("[WARN] yamux: failed to send go away: %v", sendErr) } return err @@ -600,7 +572,7 @@ func (s *Session) handleStreamMessage(hdr header) error { // Read the new data if err := stream.readData(hdr, flags, s.reader); err != nil { - if sendErr := s.sendNoWait(s.goAway(goAwayProtoErr)); sendErr != nil { + if sendErr := s.sendMsg(s.goAway(goAwayProtoErr), nil, nil); sendErr != nil { s.logger.Printf("[WARN] yamux: failed to send go away: %v", sendErr) } return err @@ -617,9 +589,8 @@ func (s *Session) handlePing(hdr header) error { // don't interfere with the receiving thread blocking for the write. if flags&flagSYN == flagSYN { go func() { - hdr := header(make([]byte, headerSize)) - hdr.encode(typePing, flagACK, 0, pingID) - if err := s.sendNoWait(hdr); err != nil { + hdr := encode(typePing, flagACK, 0, pingID) + if err := s.sendMsg(hdr, nil, nil); err != nil { s.logger.Printf("[WARN] yamux: failed to send ping reply: %v", err) } }() @@ -664,9 +635,8 @@ func (s *Session) incomingStream(id uint32) error { } // Reject immediately if we are doing a go away if atomic.LoadInt32(&s.localGoAway) == 1 { - hdr := header(make([]byte, headerSize)) - hdr.encode(typeWindowUpdate, flagRST, id, 0) - return s.sendNoWait(hdr) + hdr := encode(typeWindowUpdate, flagRST, id, 0) + return s.sendMsg(hdr, nil, nil) } // Allocate a new stream @@ -678,7 +648,7 @@ func (s *Session) incomingStream(id uint32) error { // Check if stream already exists if _, ok := s.streams[id]; ok { s.logger.Printf("[ERR] yamux: duplicate stream declared") - if sendErr := s.sendNoWait(s.goAway(goAwayProtoErr)); sendErr != nil { + if sendErr := s.sendMsg(s.goAway(goAwayProtoErr), nil, nil); sendErr != nil { s.logger.Printf("[WARN] yamux: failed to send go away: %v", sendErr) } return ErrDuplicateStream @@ -695,8 +665,8 @@ func (s *Session) incomingStream(id uint32) error { // Backlog exceeded! RST the stream s.logger.Printf("[WARN] yamux: backlog exceeded, forcing connection reset") delete(s.streams, id) - stream.sendHdr.encode(typeWindowUpdate, flagRST, id, 0) - return s.sendNoWait(stream.sendHdr) + hdr := encode(typeWindowUpdate, flagRST, id, 0) + return s.sendMsg(hdr, nil, nil) } } diff --git a/vendor/github.com/whyrusleeping/yamux/spec.md b/vendor/github.com/libp2p/go-yamux/spec.md similarity index 100% rename from vendor/github.com/whyrusleeping/yamux/spec.md rename to vendor/github.com/libp2p/go-yamux/spec.md diff --git a/vendor/github.com/whyrusleeping/yamux/stream.go b/vendor/github.com/libp2p/go-yamux/stream.go similarity index 78% rename from vendor/github.com/whyrusleeping/yamux/stream.go rename to vendor/github.com/libp2p/go-yamux/stream.go index 58a8f94f..74ffe205 100644 --- a/vendor/github.com/whyrusleeping/yamux/stream.go +++ b/vendor/github.com/libp2p/go-yamux/stream.go @@ -1,7 +1,6 @@ package yamux import ( - "bytes" "io" "sync" "sync/atomic" @@ -38,39 +37,28 @@ type Stream struct { recvLock sync.Mutex recvBuf pool.Buffer - controlHdr header - controlErr chan error - controlHdrLock sync.Mutex - - sendHdr header - sendErr chan error sendLock sync.Mutex recvNotifyCh chan struct{} sendNotifyCh chan struct{} - readDeadline atomic.Value // time.Time - writeDeadline atomic.Value // time.Time + readDeadline, writeDeadline pipeDeadline } // newStream is used to construct a new stream within // a given session for an ID func newStream(session *Session, id uint32, state streamState) *Stream { s := &Stream{ - id: id, - session: session, - state: state, - controlHdr: header(make([]byte, headerSize)), - controlErr: make(chan error, 1), - sendHdr: header(make([]byte, headerSize)), - sendErr: make(chan error, 1), - recvWindow: initialStreamWindow, - sendWindow: initialStreamWindow, - recvNotifyCh: make(chan struct{}, 1), - sendNotifyCh: make(chan struct{}, 1), + id: id, + session: session, + state: state, + recvWindow: initialStreamWindow, + sendWindow: initialStreamWindow, + readDeadline: makePipeDeadline(), + writeDeadline: makePipeDeadline(), + recvNotifyCh: make(chan struct{}, 1), + sendNotifyCh: make(chan struct{}, 1), } - s.readDeadline.Store(time.Time{}) - s.writeDeadline.Store(time.Time{}) return s } @@ -122,21 +110,10 @@ START: return n, err WAIT: - var timeout <-chan time.Time - returnTimer := func() {} - readDeadline := s.readDeadline.Load().(time.Time) - if !readDeadline.IsZero() { - delay := readDeadline.Sub(time.Now()) - timer, cancelFunc := pooledTimer(delay) - timeout = timer.C - returnTimer = cancelFunc - } select { case <-s.recvNotifyCh: - returnTimer() goto START - case <-timeout: - returnTimer() + case <-s.readDeadline.wait(): return 0, ErrTimeout } } @@ -147,16 +124,8 @@ func (s *Stream) Write(b []byte) (n int, err error) { defer s.sendLock.Unlock() total := 0 - var timeout <-chan time.Time - writeDeadline := s.writeDeadline.Load().(time.Time) - if !writeDeadline.IsZero() { - delay := writeDeadline.Sub(time.Now()) - timer, cancelFunc := pooledTimer(delay) - defer cancelFunc() - timeout = timer.C - } for total < len(b) { - n, err := s.write(b[total:], timeout) + n, err := s.write(b[total:]) total += n if err != nil { return total, err @@ -167,10 +136,10 @@ func (s *Stream) Write(b []byte) (n int, err error) { // write is used to write to the stream, may return on // a short write. -func (s *Stream) write(b []byte, timeout <-chan time.Time) (n int, err error) { +func (s *Stream) write(b []byte) (n int, err error) { var flags uint16 var max uint32 - var body io.Reader + var hdr header START: s.stateLock.Lock() @@ -195,13 +164,12 @@ START: // Determine the flags if any flags = s.sendFlags() - // Send up to our send window - max = min(window, uint32(len(b))) - body = bytes.NewReader(b[:max]) + // Send up to min(message, window + max = min(window, s.session.config.MaxMessageSize-headerSize, uint32(len(b))) // Send the header - s.sendHdr.encode(typeData, flags, s.id, max) - if err = s.session.waitForSendErr(s.sendHdr, body, s.sendErr, timeout); err != nil { + hdr = encode(typeData, flags, s.id, max) + if err = s.session.sendMsg(hdr, b[:max], s.writeDeadline.wait()); err != nil { return 0, err } @@ -215,7 +183,7 @@ WAIT: select { case <-s.sendNotifyCh: goto START - case <-timeout: + case <-s.writeDeadline.wait(): return 0, ErrTimeout } } @@ -240,9 +208,6 @@ func (s *Stream) sendFlags() uint16 { // sendWindowUpdate potentially sends a window update enabling // further writes to take place. Must be invoked with the lock. func (s *Stream) sendWindowUpdate() error { - s.controlHdrLock.Lock() - defer s.controlHdrLock.Unlock() - // Determine the delta update max := s.session.config.MaxStreamWindowSize s.recvLock.Lock() @@ -262,8 +227,8 @@ func (s *Stream) sendWindowUpdate() error { s.recvLock.Unlock() // Send the header - s.controlHdr.encode(typeWindowUpdate, flags, s.id, delta) - if err := s.session.waitForSendErr(s.controlHdr, nil, s.controlErr, nil); err != nil { + hdr := encode(typeWindowUpdate, flags, s.id, delta) + if err := s.session.sendMsg(hdr, nil, nil); err != nil { return err } return nil @@ -271,22 +236,16 @@ func (s *Stream) sendWindowUpdate() error { // sendClose is used to send a FIN func (s *Stream) sendClose() error { - s.controlHdrLock.Lock() - defer s.controlHdrLock.Unlock() - flags := s.sendFlags() flags |= flagFIN - s.controlHdr.encode(typeWindowUpdate, flags, s.id, 0) - return s.session.waitForSendErr(s.controlHdr, nil, s.controlErr, nil) + hdr := encode(typeWindowUpdate, flags, s.id, 0) + return s.session.sendMsg(hdr, nil, nil) } // sendReset is used to send a RST func (s *Stream) sendReset() error { - s.controlHdrLock.Lock() - defer s.controlHdrLock.Unlock() - - s.controlHdr.encode(typeWindowUpdate, flagRST, s.id, 0) - return s.session.waitForSendErr(s.controlHdr, nil, s.controlErr, nil) + hdr := encode(typeWindowUpdate, flagRST, s.id, 0) + return s.session.sendMsg(hdr, nil, nil) } // Reset resets the stream (forcibly closes the stream) @@ -311,7 +270,7 @@ func (s *Stream) Reset() error { err := s.sendReset() s.notifyWaiting() - s.session.closeStream(s.id) + s.cleanup() return err } @@ -343,7 +302,7 @@ SEND_CLOSE: err := s.sendClose() s.notifyWaiting() if closeStream { - s.session.closeStream(s.id) + s.cleanup() } return err } @@ -360,6 +319,16 @@ func (s *Stream) forceClose() { } s.stateLock.Unlock() s.notifyWaiting() + + s.readDeadline.set(time.Time{}) + s.readDeadline.set(time.Time{}) +} + +// called when fully closed to release any system resources. +func (s *Stream) cleanup() { + s.session.closeStream(s.id) + s.readDeadline.set(time.Time{}) + s.readDeadline.set(time.Time{}) } // processFlags is used to update the state of the stream @@ -369,7 +338,7 @@ func (s *Stream) processFlags(flags uint16) error { closeStream := false defer func() { if closeStream { - s.session.closeStream(s.id) + s.cleanup() } }() @@ -477,13 +446,25 @@ func (s *Stream) SetDeadline(t time.Time) error { // SetReadDeadline sets the deadline for future Read calls. func (s *Stream) SetReadDeadline(t time.Time) error { - s.readDeadline.Store(t) + s.stateLock.Lock() + defer s.stateLock.Unlock() + switch s.state { + case streamClosed, streamRemoteClose, streamReset: + return nil + } + s.readDeadline.set(t) return nil } // SetWriteDeadline sets the deadline for future Write calls func (s *Stream) SetWriteDeadline(t time.Time) error { - s.writeDeadline.Store(t) + s.stateLock.Lock() + defer s.stateLock.Unlock() + switch s.state { + case streamClosed, streamLocalClose, streamReset: + return nil + } + s.writeDeadline.set(t) return nil } diff --git a/vendor/github.com/whyrusleeping/yamux/util.go b/vendor/github.com/libp2p/go-yamux/util.go similarity index 54% rename from vendor/github.com/whyrusleeping/yamux/util.go rename to vendor/github.com/libp2p/go-yamux/util.go index 8a73e924..b7e427fd 100644 --- a/vendor/github.com/whyrusleeping/yamux/util.go +++ b/vendor/github.com/libp2p/go-yamux/util.go @@ -1,20 +1,5 @@ package yamux -import ( - "sync" - "time" -) - -var ( - timerPool = &sync.Pool{ - New: func() interface{} { - timer := time.NewTimer(time.Hour * 1e6) - timer.Stop() - return timer - }, - } -) - // asyncSendErr is used to try an async send of an error func asyncSendErr(ch chan error, err error) { if ch == nil { @@ -34,10 +19,13 @@ func asyncNotify(ch chan struct{}) { } } -// min computes the minimum of two values -func min(a, b uint32) uint32 { - if a < b { - return a +// min computes the minimum of a set of values +func min(values ...uint32) uint32 { + m := values[0] + for _, v := range values[1:] { + if v < m { + m = v + } } - return b + return m } diff --git a/vendor/github.com/lucas-clemente/quic-go/internal/handshake/crypto_setup.go b/vendor/github.com/lucas-clemente/quic-go/internal/handshake/crypto_setup.go index de6ddc68..f153750c 100644 --- a/vendor/github.com/lucas-clemente/quic-go/internal/handshake/crypto_setup.go +++ b/vendor/github.com/lucas-clemente/quic-go/internal/handshake/crypto_setup.go @@ -16,6 +16,9 @@ import ( "github.com/marten-seemann/qtls" ) +// TLS unexpected_message alert +const alertUnexpectedMessage uint8 = 10 + type messageType uint8 // TLS handshake message types. @@ -207,7 +210,7 @@ func newCryptoSetup( messageChan: make(chan []byte, 100), receivedReadKey: make(chan struct{}), receivedWriteKey: make(chan struct{}), - writeRecord: make(chan struct{}), + writeRecord: make(chan struct{}, 1), closeChan: make(chan struct{}), } qtlsConf := tlsConfigToQtlsConfig(tlsConf, cs, extHandler) @@ -302,10 +305,10 @@ func (h *cryptoSetup) checkEncryptionLevel(msgType messageType, encLevel protoco case typeNewSessionTicket: expected = protocol.Encryption1RTT default: - return fmt.Errorf("unexpected handshake message: %d", msgType) + return qerr.CryptoError(alertUnexpectedMessage, fmt.Sprintf("unexpected handshake message: %d", msgType)) } if encLevel != expected { - return fmt.Errorf("expected handshake message %s to have encryption level %s, has %s", msgType, expected, encLevel) + return qerr.CryptoError(alertUnexpectedMessage, fmt.Sprintf("expected handshake message %s to have encryption level %s, has %s", msgType, expected, encLevel)) } return nil } @@ -355,7 +358,8 @@ func (h *cryptoSetup) handleMessageForServer(msgType messageType) bool { } return true default: - panic("unexpected handshake message") + h.messageErrChan <- qerr.CryptoError(alertUnexpectedMessage, fmt.Sprintf("unexpected handshake message: %d", msgType)) + return false } } @@ -411,7 +415,8 @@ func (h *cryptoSetup) handleMessageForClient(msgType messageType) bool { h.conn.HandlePostHandshakeMessage() return false default: - panic("unexpected handshake message: ") + h.messageErrChan <- qerr.CryptoError(alertUnexpectedMessage, fmt.Sprintf("unexpected handshake message: %d", msgType)) + return false } } @@ -479,13 +484,6 @@ func (h *cryptoSetup) SetWriteKey(suite *qtls.CipherSuite, trafficSecret []byte) // WriteRecord is called when TLS writes data func (h *cryptoSetup) WriteRecord(p []byte) (int, error) { - defer func() { - select { - case h.writeRecord <- struct{}{}: - default: - } - }() - h.mutex.Lock() defer h.mutex.Unlock() @@ -496,6 +494,11 @@ func (h *cryptoSetup) WriteRecord(p []byte) (int, error) { if !h.clientHelloWritten && h.perspective == protocol.PerspectiveClient { h.clientHelloWritten = true close(h.clientHelloWrittenChan) + } else { + // We need additional signaling to properly detect HelloRetryRequests. + // For servers: when the ServerHello is written. + // For clients: when a reply is sent in response to a ServerHello. + h.writeRecord <- struct{}{} } return n, err case protocol.EncryptionHandshake: diff --git a/vendor/github.com/lucas-clemente/quic-go/internal/protocol/version.go b/vendor/github.com/lucas-clemente/quic-go/internal/protocol/version.go index 6e7d6d95..410028b2 100644 --- a/vendor/github.com/lucas-clemente/quic-go/internal/protocol/version.go +++ b/vendor/github.com/lucas-clemente/quic-go/internal/protocol/version.go @@ -18,16 +18,16 @@ const ( // The version numbers, making grepping easier const ( - VersionTLS VersionNumber = VersionMilestone0_11_1 + VersionTLS VersionNumber = VersionMilestone0_11_2 VersionWhatever VersionNumber = 1 // for when the version doesn't matter VersionUnknown VersionNumber = math.MaxUint32 - VersionMilestone0_11_1 VersionNumber = 0xff000013 // QUIC WG draft-19 + VersionMilestone0_11_2 VersionNumber = 0xff000013 // QUIC WG draft-19 ) // SupportedVersions lists the versions that the server supports // must be in sorted descending order -var SupportedVersions = []VersionNumber{VersionMilestone0_11_1} +var SupportedVersions = []VersionNumber{VersionMilestone0_11_2} // IsValidVersion says if the version is known to quic-go func IsValidVersion(v VersionNumber) bool { @@ -40,7 +40,7 @@ func (vn VersionNumber) String() string { return "whatever" case VersionUnknown: return "unknown" - case VersionMilestone0_11_1: + case VersionMilestone0_11_2: return "QUIC WG draft-19" default: if vn.isGQUIC() { diff --git a/vendor/github.com/magiconair/properties/.travis.yml b/vendor/github.com/magiconair/properties/.travis.yml index 3e7c3d2c..f07376f9 100644 --- a/vendor/github.com/magiconair/properties/.travis.yml +++ b/vendor/github.com/magiconair/properties/.travis.yml @@ -7,4 +7,6 @@ go: - 1.8.x - 1.9.x - "1.10.x" + - "1.11.x" + - "1.12.x" - tip diff --git a/vendor/github.com/magiconair/properties/CHANGELOG.md b/vendor/github.com/magiconair/properties/CHANGELOG.md index f83adc20..176626a1 100644 --- a/vendor/github.com/magiconair/properties/CHANGELOG.md +++ b/vendor/github.com/magiconair/properties/CHANGELOG.md @@ -1,5 +1,13 @@ ## Changelog +### [1.8.1](https://github.com/magiconair/properties/tree/v1.8.1) - 10 May 2019 + + * [PR #26](https://github.com/magiconair/properties/pull/35): Close body always after request + + This patch ensures that in `LoadURL` the response body is always closed. + + Thanks to [@liubog2008](https://github.com/liubog2008) for the patch. + ### [1.8](https://github.com/magiconair/properties/tree/v1.8) - 15 May 2018 * [PR #26](https://github.com/magiconair/properties/pull/26): Disable expansion during loading diff --git a/vendor/github.com/magiconair/properties/README.md b/vendor/github.com/magiconair/properties/README.md index 2c05f290..42ed5c37 100644 --- a/vendor/github.com/magiconair/properties/README.md +++ b/vendor/github.com/magiconair/properties/README.md @@ -1,6 +1,6 @@ [![](https://img.shields.io/github/tag/magiconair/properties.svg?style=flat-square&label=release)](https://github.com/magiconair/properties/releases) [![Travis CI Status](https://img.shields.io/travis/magiconair/properties.svg?branch=master&style=flat-square&label=travis)](https://travis-ci.org/magiconair/properties) -[![Codeship CI Status](https://img.shields.io/codeship/16aaf660-f615-0135-b8f0-7e33b70920c0/master.svg?label=codeship&style=flat-square)](https://app.codeship.com/projects/274177") +[![CircleCI Status](https://img.shields.io/circleci/project/github/magiconair/properties.svg?label=circle+ci&style=flat-square)](https://circleci.com/gh/magiconair/properties) [![License](https://img.shields.io/badge/License-BSD%202--Clause-orange.svg?style=flat-square)](https://raw.githubusercontent.com/magiconair/properties/master/LICENSE) [![GoDoc](http://img.shields.io/badge/godoc-reference-5272B4.svg?style=flat-square)](http://godoc.org/github.com/magiconair/properties) @@ -30,7 +30,7 @@ changed from `panic` to `log.Fatal` but this is configurable and custom error handling functions can be provided. See the package documentation for details. -Read the full documentation on [GoDoc](https://godoc.org/github.com/magiconair/properties) [![GoDoc](https://godoc.org/github.com/magiconair/properties?status.png)](https://godoc.org/github.com/magiconair/properties) +Read the full documentation on [![GoDoc](http://img.shields.io/badge/godoc-reference-5272B4.svg?style=flat-square)](http://godoc.org/github.com/magiconair/properties) ## Getting Started diff --git a/vendor/github.com/magiconair/properties/go.mod b/vendor/github.com/magiconair/properties/go.mod new file mode 100644 index 00000000..02a6f865 --- /dev/null +++ b/vendor/github.com/magiconair/properties/go.mod @@ -0,0 +1 @@ +module github.com/magiconair/properties diff --git a/vendor/github.com/magiconair/properties/load.go b/vendor/github.com/magiconair/properties/load.go index c8e1b580..ab953253 100644 --- a/vendor/github.com/magiconair/properties/load.go +++ b/vendor/github.com/magiconair/properties/load.go @@ -115,6 +115,7 @@ func (l *Loader) LoadURL(url string) (*Properties, error) { if err != nil { return nil, fmt.Errorf("properties: error fetching %q. %s", url, err) } + defer resp.Body.Close() if resp.StatusCode == 404 && l.IgnoreMissing { LogPrintf("properties: %s returned %d. skipping", url, resp.StatusCode) @@ -129,7 +130,6 @@ func (l *Loader) LoadURL(url string) (*Properties, error) { if err != nil { return nil, fmt.Errorf("properties: %s error reading response. %s", url, err) } - defer resp.Body.Close() ct := resp.Header.Get("Content-Type") var enc Encoding diff --git a/vendor/github.com/marten-seemann/qtls/.travis.yml b/vendor/github.com/marten-seemann/qtls/.travis.yml new file mode 100644 index 00000000..2179c96e --- /dev/null +++ b/vendor/github.com/marten-seemann/qtls/.travis.yml @@ -0,0 +1,28 @@ +dist: trusty +group: travis_latest + +language: go + +go: + - "1.12.x" + +# first part of the GOARCH workaround +# setting the GOARCH directly doesn't work, since the value will be overwritten later +# so set it to a temporary environment variable first +env: + global: + - GO111MODULE=on + matrix: + - TRAVIS_GOARCH=amd64 + - TRAVIS_GOARCH=386 + + +# second part of the GOARCH workaround +# now actually set the GOARCH env variable to the value of the temporary variable set earlier +before_install: + - export GOARCH=$TRAVIS_GOARCH + - go env # for debugging + +script: + - go test + - if [ ${TRAVIS_GOARCH} == 'amd64' ]; then go test -race; fi diff --git a/vendor/github.com/marten-seemann/qtls/LICENSE b/vendor/github.com/marten-seemann/qtls/LICENSE new file mode 100644 index 00000000..6a66aea5 --- /dev/null +++ b/vendor/github.com/marten-seemann/qtls/LICENSE @@ -0,0 +1,27 @@ +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/github.com/marten-seemann/qtls/README.md b/vendor/github.com/marten-seemann/qtls/README.md new file mode 100644 index 00000000..f765e86f --- /dev/null +++ b/vendor/github.com/marten-seemann/qtls/README.md @@ -0,0 +1,6 @@ +# qtls + +[![Godoc Reference](https://img.shields.io/badge/godoc-reference-blue.svg?style=flat-square)](https://godoc.org/github.com/marten-seemann/qtls) +[![Travis Build Status](https://img.shields.io/travis/marten-seemann/qtls/master.svg?style=flat-square&label=Travis+build)](https://travis-ci.org/marten-seemann/qtls) + +This repository contains a modified version of the standard library's TLS implementation, modified for the QUIC protocol. It is used by [quic-go](https://github.com/lucas-clemente/quic-go). diff --git a/vendor/github.com/marten-seemann/qtls/common.go b/vendor/github.com/marten-seemann/qtls/common.go index df4c98e8..2a6c64d8 100644 --- a/vendor/github.com/marten-seemann/qtls/common.go +++ b/vendor/github.com/marten-seemann/qtls/common.go @@ -561,6 +561,12 @@ type Config struct { // AlternativeRecordLayer is used by QUIC AlternativeRecordLayer RecordLayer + + // Enforce the selection of a supported application protocol. + // Only works for TLS 1.3. + // If enabled, client and server have to agree on an application protocol. + // Otherwise, connection establishment fails. + EnforceNextProtoSelection bool } type RecordLayer interface { @@ -640,6 +646,7 @@ func (c *Config) Clone() *Config { GetExtensions: c.GetExtensions, ReceivedExtensions: c.ReceivedExtensions, sessionTicketKeys: sessionTicketKeys, + EnforceNextProtoSelection: c.EnforceNextProtoSelection, } } diff --git a/vendor/github.com/marten-seemann/qtls/handshake_client_tls13.go b/vendor/github.com/marten-seemann/qtls/handshake_client_tls13.go index 9d8e0f7b..f89830e0 100644 --- a/vendor/github.com/marten-seemann/qtls/handshake_client_tls13.go +++ b/vendor/github.com/marten-seemann/qtls/handshake_client_tls13.go @@ -392,6 +392,18 @@ func (hs *clientHandshakeStateTLS13) readServerParameters() error { c.sendAlert(alertUnsupportedExtension) return errors.New("tls: server advertised unrequested ALPN extension") } + if c.config.EnforceNextProtoSelection { + if len(encryptedExtensions.alpnProtocol) == 0 { + // the server didn't select an ALPN + c.sendAlert(alertNoApplicationProtocol) + return errors.New("ALPN negotiation failed") + } + if _, fallback := mutualProtocol([]string{encryptedExtensions.alpnProtocol}, hs.c.config.NextProtos); fallback { + // the protocol selected by the server was not offered + c.sendAlert(alertNoApplicationProtocol) + return errors.New("ALPN negotiation failed") + } + } c.clientProtocol = encryptedExtensions.alpnProtocol return nil diff --git a/vendor/github.com/marten-seemann/qtls/handshake_server_tls13.go b/vendor/github.com/marten-seemann/qtls/handshake_server_tls13.go index 97f15091..c7cce068 100644 --- a/vendor/github.com/marten-seemann/qtls/handshake_server_tls13.go +++ b/vendor/github.com/marten-seemann/qtls/handshake_server_tls13.go @@ -576,6 +576,10 @@ func (hs *serverHandshakeStateTLS13) sendServerParameters() error { c.clientProtocol = selectedProto } } + if c.config.EnforceNextProtoSelection && len(c.clientProtocol) == 0 { + c.sendAlert(alertNoApplicationProtocol) + return errors.New("ALPN negotiation failed") + } if hs.c.config.GetExtensions != nil { encryptedExtensions.additionalExtensions = hs.c.config.GetExtensions(typeEncryptedExtensions) } diff --git a/vendor/github.com/mattn/go-colorable/go.mod b/vendor/github.com/mattn/go-colorable/go.mod index 9d9f4248..ef3ca9d4 100644 --- a/vendor/github.com/mattn/go-colorable/go.mod +++ b/vendor/github.com/mattn/go-colorable/go.mod @@ -1,3 +1,3 @@ module github.com/mattn/go-colorable -require github.com/mattn/go-isatty v0.0.5 +require github.com/mattn/go-isatty v0.0.8 diff --git a/vendor/github.com/mattn/go-isatty/isatty_others.go b/vendor/github.com/mattn/go-isatty/isatty_others.go index f02849c5..ff714a37 100644 --- a/vendor/github.com/mattn/go-isatty/isatty_others.go +++ b/vendor/github.com/mattn/go-isatty/isatty_others.go @@ -1,4 +1,4 @@ -// +build appengine js +// +build appengine js nacl package isatty diff --git a/vendor/github.com/mattn/go-isatty/isatty_linux.go b/vendor/github.com/mattn/go-isatty/isatty_tcgets.go similarity index 95% rename from vendor/github.com/mattn/go-isatty/isatty_linux.go rename to vendor/github.com/mattn/go-isatty/isatty_tcgets.go index 4f8af465..453b025d 100644 --- a/vendor/github.com/mattn/go-isatty/isatty_linux.go +++ b/vendor/github.com/mattn/go-isatty/isatty_tcgets.go @@ -1,4 +1,4 @@ -// +build linux +// +build linux aix // +build !appengine // +build !android diff --git a/vendor/github.com/mattn/go-runewidth/.travis.yml b/vendor/github.com/mattn/go-runewidth/.travis.yml new file mode 100644 index 00000000..5c9c2a30 --- /dev/null +++ b/vendor/github.com/mattn/go-runewidth/.travis.yml @@ -0,0 +1,8 @@ +language: go +go: + - tip +before_install: + - go get github.com/mattn/goveralls + - go get golang.org/x/tools/cmd/cover +script: + - $HOME/gopath/bin/goveralls -repotoken lAKAWPzcGsD3A8yBX3BGGtRUdJ6CaGERL diff --git a/vendor/github.com/gxed/hashland/LICENSE b/vendor/github.com/mattn/go-runewidth/LICENSE similarity index 96% rename from vendor/github.com/gxed/hashland/LICENSE rename to vendor/github.com/mattn/go-runewidth/LICENSE index ee9d3fac..91b5cef3 100644 --- a/vendor/github.com/gxed/hashland/LICENSE +++ b/vendor/github.com/mattn/go-runewidth/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2014 Lawrence E. Bakst +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 @@ -19,4 +19,3 @@ 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 new file mode 100644 index 00000000..66663a94 --- /dev/null +++ b/vendor/github.com/mattn/go-runewidth/README.mkd @@ -0,0 +1,27 @@ +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 new file mode 100644 index 00000000..3cb94106 --- /dev/null +++ b/vendor/github.com/mattn/go-runewidth/runewidth.go @@ -0,0 +1,977 @@ +package runewidth + +import ( + "os" +) + +var ( + // EastAsianWidth will be set true if the current locale is CJK + EastAsianWidth bool + + // ZeroWidthJoiner is flag to set to use UTR#51 ZWJ + ZeroWidthJoiner bool + + // DefaultCondition is a condition in current locale + DefaultCondition = &Condition{} +) + +func init() { + handleEnv() +} + +func handleEnv() { + env := os.Getenv("RUNEWIDTH_EASTASIAN") + if env == "" { + EastAsianWidth = IsEastAsian() + } else { + EastAsianWidth = env == "1" + } + // update DefaultCondition + DefaultCondition.EastAsianWidth = EastAsianWidth + DefaultCondition.ZeroWidthJoiner = ZeroWidthJoiner +} + +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) >> 1 + + 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, 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{ + {0x203C, 0x203C}, {0x2049, 0x2049}, {0x2122, 0x2122}, + {0x2139, 0x2139}, {0x2194, 0x2199}, {0x21A9, 0x21AA}, + {0x231A, 0x231B}, {0x2328, 0x2328}, {0x23CF, 0x23CF}, + {0x23E9, 0x23F3}, {0x23F8, 0x23FA}, {0x24C2, 0x24C2}, + {0x25AA, 0x25AB}, {0x25B6, 0x25B6}, {0x25C0, 0x25C0}, + {0x25FB, 0x25FE}, {0x2600, 0x2604}, {0x260E, 0x260E}, + {0x2611, 0x2611}, {0x2614, 0x2615}, {0x2618, 0x2618}, + {0x261D, 0x261D}, {0x2620, 0x2620}, {0x2622, 0x2623}, + {0x2626, 0x2626}, {0x262A, 0x262A}, {0x262E, 0x262F}, + {0x2638, 0x263A}, {0x2640, 0x2640}, {0x2642, 0x2642}, + {0x2648, 0x2653}, {0x265F, 0x2660}, {0x2663, 0x2663}, + {0x2665, 0x2666}, {0x2668, 0x2668}, {0x267B, 0x267B}, + {0x267E, 0x267F}, {0x2692, 0x2697}, {0x2699, 0x2699}, + {0x269B, 0x269C}, {0x26A0, 0x26A1}, {0x26AA, 0x26AB}, + {0x26B0, 0x26B1}, {0x26BD, 0x26BE}, {0x26C4, 0x26C5}, + {0x26C8, 0x26C8}, {0x26CE, 0x26CF}, {0x26D1, 0x26D1}, + {0x26D3, 0x26D4}, {0x26E9, 0x26EA}, {0x26F0, 0x26F5}, + {0x26F7, 0x26FA}, {0x26FD, 0x26FD}, {0x2702, 0x2702}, + {0x2705, 0x2705}, {0x2708, 0x270D}, {0x270F, 0x270F}, + {0x2712, 0x2712}, {0x2714, 0x2714}, {0x2716, 0x2716}, + {0x271D, 0x271D}, {0x2721, 0x2721}, {0x2728, 0x2728}, + {0x2733, 0x2734}, {0x2744, 0x2744}, {0x2747, 0x2747}, + {0x274C, 0x274C}, {0x274E, 0x274E}, {0x2753, 0x2755}, + {0x2757, 0x2757}, {0x2763, 0x2764}, {0x2795, 0x2797}, + {0x27A1, 0x27A1}, {0x27B0, 0x27B0}, {0x27BF, 0x27BF}, + {0x2934, 0x2935}, {0x2B05, 0x2B07}, {0x2B1B, 0x2B1C}, + {0x2B50, 0x2B50}, {0x2B55, 0x2B55}, {0x3030, 0x3030}, + {0x303D, 0x303D}, {0x3297, 0x3297}, {0x3299, 0x3299}, + {0x1F004, 0x1F004}, {0x1F0CF, 0x1F0CF}, {0x1F170, 0x1F171}, + {0x1F17E, 0x1F17F}, {0x1F18E, 0x1F18E}, {0x1F191, 0x1F19A}, + {0x1F1E6, 0x1F1FF}, {0x1F201, 0x1F202}, {0x1F21A, 0x1F21A}, + {0x1F22F, 0x1F22F}, {0x1F232, 0x1F23A}, {0x1F250, 0x1F251}, + {0x1F300, 0x1F321}, {0x1F324, 0x1F393}, {0x1F396, 0x1F397}, + {0x1F399, 0x1F39B}, {0x1F39E, 0x1F3F0}, {0x1F3F3, 0x1F3F5}, + {0x1F3F7, 0x1F4FD}, {0x1F4FF, 0x1F53D}, {0x1F549, 0x1F54E}, + {0x1F550, 0x1F567}, {0x1F56F, 0x1F570}, {0x1F573, 0x1F57A}, + {0x1F587, 0x1F587}, {0x1F58A, 0x1F58D}, {0x1F590, 0x1F590}, + {0x1F595, 0x1F596}, {0x1F5A4, 0x1F5A5}, {0x1F5A8, 0x1F5A8}, + {0x1F5B1, 0x1F5B2}, {0x1F5BC, 0x1F5BC}, {0x1F5C2, 0x1F5C4}, + {0x1F5D1, 0x1F5D3}, {0x1F5DC, 0x1F5DE}, {0x1F5E1, 0x1F5E1}, + {0x1F5E3, 0x1F5E3}, {0x1F5E8, 0x1F5E8}, {0x1F5EF, 0x1F5EF}, + {0x1F5F3, 0x1F5F3}, {0x1F5FA, 0x1F64F}, {0x1F680, 0x1F6C5}, + {0x1F6CB, 0x1F6D2}, {0x1F6E0, 0x1F6E5}, {0x1F6E9, 0x1F6E9}, + {0x1F6EB, 0x1F6EC}, {0x1F6F0, 0x1F6F0}, {0x1F6F3, 0x1F6F9}, + {0x1F910, 0x1F93A}, {0x1F93C, 0x1F93E}, {0x1F940, 0x1F945}, + {0x1F947, 0x1F970}, {0x1F973, 0x1F976}, {0x1F97A, 0x1F97A}, + {0x1F97C, 0x1F9A2}, {0x1F9B0, 0x1F9B9}, {0x1F9C0, 0x1F9C2}, + {0x1F9D0, 0x1F9FF}, +} + +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, 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, 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, 0x01CD}, {0x01CF, 0x01CF}, {0x01D1, 0x01D1}, + {0x01D3, 0x01D3}, {0x01D5, 0x01D5}, {0x01D7, 0x01D7}, + {0x01D9, 0x01D9}, {0x01DB, 0x01DB}, {0x01DD, 0x0250}, + {0x0252, 0x0260}, {0x0262, 0x02C3}, {0x02C5, 0x02C6}, + {0x02C8, 0x02C8}, {0x02CC, 0x02CC}, {0x02CE, 0x02CF}, + {0x02D1, 0x02D7}, {0x02DC, 0x02DC}, {0x02DE, 0x02DE}, + {0x02E0, 0x02FF}, {0x0370, 0x0377}, {0x037A, 0x037F}, + {0x0384, 0x038A}, {0x038C, 0x038C}, {0x038E, 0x0390}, + {0x03AA, 0x03B0}, {0x03C2, 0x03C2}, {0x03CA, 0x0400}, + {0x0402, 0x040F}, {0x0450, 0x0450}, {0x0452, 0x052F}, + {0x0531, 0x0556}, {0x0559, 0x055F}, {0x0561, 0x0587}, + {0x0589, 0x058A}, {0x058D, 0x058F}, {0x0591, 0x05C7}, + {0x05D0, 0x05EA}, {0x05F0, 0x05F4}, {0x0600, 0x061C}, + {0x061E, 0x070D}, {0x070F, 0x074A}, {0x074D, 0x07B1}, + {0x07C0, 0x07FA}, {0x0800, 0x082D}, {0x0830, 0x083E}, + {0x0840, 0x085B}, {0x085E, 0x085E}, {0x08A0, 0x08B4}, + {0x08B6, 0x08BD}, {0x08D4, 0x0983}, {0x0985, 0x098C}, + {0x098F, 0x0990}, {0x0993, 0x09A8}, {0x09AA, 0x09B0}, + {0x09B2, 0x09B2}, {0x09B6, 0x09B9}, {0x09BC, 0x09C4}, + {0x09C7, 0x09C8}, {0x09CB, 0x09CE}, {0x09D7, 0x09D7}, + {0x09DC, 0x09DD}, {0x09DF, 0x09E3}, {0x09E6, 0x09FB}, + {0x0A01, 0x0A03}, {0x0A05, 0x0A0A}, {0x0A0F, 0x0A10}, + {0x0A13, 0x0A28}, {0x0A2A, 0x0A30}, {0x0A32, 0x0A33}, + {0x0A35, 0x0A36}, {0x0A38, 0x0A39}, {0x0A3C, 0x0A3C}, + {0x0A3E, 0x0A42}, {0x0A47, 0x0A48}, {0x0A4B, 0x0A4D}, + {0x0A51, 0x0A51}, {0x0A59, 0x0A5C}, {0x0A5E, 0x0A5E}, + {0x0A66, 0x0A75}, {0x0A81, 0x0A83}, {0x0A85, 0x0A8D}, + {0x0A8F, 0x0A91}, {0x0A93, 0x0AA8}, {0x0AAA, 0x0AB0}, + {0x0AB2, 0x0AB3}, {0x0AB5, 0x0AB9}, {0x0ABC, 0x0AC5}, + {0x0AC7, 0x0AC9}, {0x0ACB, 0x0ACD}, {0x0AD0, 0x0AD0}, + {0x0AE0, 0x0AE3}, {0x0AE6, 0x0AF1}, {0x0AF9, 0x0AF9}, + {0x0B01, 0x0B03}, {0x0B05, 0x0B0C}, {0x0B0F, 0x0B10}, + {0x0B13, 0x0B28}, {0x0B2A, 0x0B30}, {0x0B32, 0x0B33}, + {0x0B35, 0x0B39}, {0x0B3C, 0x0B44}, {0x0B47, 0x0B48}, + {0x0B4B, 0x0B4D}, {0x0B56, 0x0B57}, {0x0B5C, 0x0B5D}, + {0x0B5F, 0x0B63}, {0x0B66, 0x0B77}, {0x0B82, 0x0B83}, + {0x0B85, 0x0B8A}, {0x0B8E, 0x0B90}, {0x0B92, 0x0B95}, + {0x0B99, 0x0B9A}, {0x0B9C, 0x0B9C}, {0x0B9E, 0x0B9F}, + {0x0BA3, 0x0BA4}, {0x0BA8, 0x0BAA}, {0x0BAE, 0x0BB9}, + {0x0BBE, 0x0BC2}, {0x0BC6, 0x0BC8}, {0x0BCA, 0x0BCD}, + {0x0BD0, 0x0BD0}, {0x0BD7, 0x0BD7}, {0x0BE6, 0x0BFA}, + {0x0C00, 0x0C03}, {0x0C05, 0x0C0C}, {0x0C0E, 0x0C10}, + {0x0C12, 0x0C28}, {0x0C2A, 0x0C39}, {0x0C3D, 0x0C44}, + {0x0C46, 0x0C48}, {0x0C4A, 0x0C4D}, {0x0C55, 0x0C56}, + {0x0C58, 0x0C5A}, {0x0C60, 0x0C63}, {0x0C66, 0x0C6F}, + {0x0C78, 0x0C83}, {0x0C85, 0x0C8C}, {0x0C8E, 0x0C90}, + {0x0C92, 0x0CA8}, {0x0CAA, 0x0CB3}, {0x0CB5, 0x0CB9}, + {0x0CBC, 0x0CC4}, {0x0CC6, 0x0CC8}, {0x0CCA, 0x0CCD}, + {0x0CD5, 0x0CD6}, {0x0CDE, 0x0CDE}, {0x0CE0, 0x0CE3}, + {0x0CE6, 0x0CEF}, {0x0CF1, 0x0CF2}, {0x0D01, 0x0D03}, + {0x0D05, 0x0D0C}, {0x0D0E, 0x0D10}, {0x0D12, 0x0D3A}, + {0x0D3D, 0x0D44}, {0x0D46, 0x0D48}, {0x0D4A, 0x0D4F}, + {0x0D54, 0x0D63}, {0x0D66, 0x0D7F}, {0x0D82, 0x0D83}, + {0x0D85, 0x0D96}, {0x0D9A, 0x0DB1}, {0x0DB3, 0x0DBB}, + {0x0DBD, 0x0DBD}, {0x0DC0, 0x0DC6}, {0x0DCA, 0x0DCA}, + {0x0DCF, 0x0DD4}, {0x0DD6, 0x0DD6}, {0x0DD8, 0x0DDF}, + {0x0DE6, 0x0DEF}, {0x0DF2, 0x0DF4}, {0x0E01, 0x0E3A}, + {0x0E3F, 0x0E5B}, {0x0E81, 0x0E82}, {0x0E84, 0x0E84}, + {0x0E87, 0x0E88}, {0x0E8A, 0x0E8A}, {0x0E8D, 0x0E8D}, + {0x0E94, 0x0E97}, {0x0E99, 0x0E9F}, {0x0EA1, 0x0EA3}, + {0x0EA5, 0x0EA5}, {0x0EA7, 0x0EA7}, {0x0EAA, 0x0EAB}, + {0x0EAD, 0x0EB9}, {0x0EBB, 0x0EBD}, {0x0EC0, 0x0EC4}, + {0x0EC6, 0x0EC6}, {0x0EC8, 0x0ECD}, {0x0ED0, 0x0ED9}, + {0x0EDC, 0x0EDF}, {0x0F00, 0x0F47}, {0x0F49, 0x0F6C}, + {0x0F71, 0x0F97}, {0x0F99, 0x0FBC}, {0x0FBE, 0x0FCC}, + {0x0FCE, 0x0FDA}, {0x1000, 0x10C5}, {0x10C7, 0x10C7}, + {0x10CD, 0x10CD}, {0x10D0, 0x10FF}, {0x1160, 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, 0x137C}, {0x1380, 0x1399}, {0x13A0, 0x13F5}, + {0x13F8, 0x13FD}, {0x1400, 0x169C}, {0x16A0, 0x16F8}, + {0x1700, 0x170C}, {0x170E, 0x1714}, {0x1720, 0x1736}, + {0x1740, 0x1753}, {0x1760, 0x176C}, {0x176E, 0x1770}, + {0x1772, 0x1773}, {0x1780, 0x17DD}, {0x17E0, 0x17E9}, + {0x17F0, 0x17F9}, {0x1800, 0x180E}, {0x1810, 0x1819}, + {0x1820, 0x1877}, {0x1880, 0x18AA}, {0x18B0, 0x18F5}, + {0x1900, 0x191E}, {0x1920, 0x192B}, {0x1930, 0x193B}, + {0x1940, 0x1940}, {0x1944, 0x196D}, {0x1970, 0x1974}, + {0x1980, 0x19AB}, {0x19B0, 0x19C9}, {0x19D0, 0x19DA}, + {0x19DE, 0x1A1B}, {0x1A1E, 0x1A5E}, {0x1A60, 0x1A7C}, + {0x1A7F, 0x1A89}, {0x1A90, 0x1A99}, {0x1AA0, 0x1AAD}, + {0x1AB0, 0x1ABE}, {0x1B00, 0x1B4B}, {0x1B50, 0x1B7C}, + {0x1B80, 0x1BF3}, {0x1BFC, 0x1C37}, {0x1C3B, 0x1C49}, + {0x1C4D, 0x1C88}, {0x1CC0, 0x1CC7}, {0x1CD0, 0x1CF6}, + {0x1CF8, 0x1CF9}, {0x1D00, 0x1DF5}, {0x1DFB, 0x1F15}, + {0x1F18, 0x1F1D}, {0x1F20, 0x1F45}, {0x1F48, 0x1F4D}, + {0x1F50, 0x1F57}, {0x1F59, 0x1F59}, {0x1F5B, 0x1F5B}, + {0x1F5D, 0x1F5D}, {0x1F5F, 0x1F7D}, {0x1F80, 0x1FB4}, + {0x1FB6, 0x1FC4}, {0x1FC6, 0x1FD3}, {0x1FD6, 0x1FDB}, + {0x1FDD, 0x1FEF}, {0x1FF2, 0x1FF4}, {0x1FF6, 0x1FFE}, + {0x2000, 0x200F}, {0x2011, 0x2012}, {0x2017, 0x2017}, + {0x201A, 0x201B}, {0x201E, 0x201F}, {0x2023, 0x2023}, + {0x2028, 0x202F}, {0x2031, 0x2031}, {0x2034, 0x2034}, + {0x2036, 0x203A}, {0x203C, 0x203D}, {0x203F, 0x2064}, + {0x2066, 0x2071}, {0x2075, 0x207E}, {0x2080, 0x2080}, + {0x2085, 0x208E}, {0x2090, 0x209C}, {0x20A0, 0x20A8}, + {0x20AA, 0x20AB}, {0x20AD, 0x20BE}, {0x20D0, 0x20F0}, + {0x2100, 0x2102}, {0x2104, 0x2104}, {0x2106, 0x2108}, + {0x210A, 0x2112}, {0x2114, 0x2115}, {0x2117, 0x2120}, + {0x2123, 0x2125}, {0x2127, 0x212A}, {0x212C, 0x2152}, + {0x2155, 0x215A}, {0x215F, 0x215F}, {0x216C, 0x216F}, + {0x217A, 0x2188}, {0x218A, 0x218B}, {0x219A, 0x21B7}, + {0x21BA, 0x21D1}, {0x21D3, 0x21D3}, {0x21D5, 0x21E6}, + {0x21E8, 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, 0x2311}, {0x2313, 0x2319}, + {0x231C, 0x2328}, {0x232B, 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, 0x25FC}, {0x25FF, 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, 0x2775}, {0x2780, 0x2794}, {0x2798, 0x27AF}, + {0x27B1, 0x27BE}, {0x27C0, 0x27E5}, {0x27EE, 0x2984}, + {0x2987, 0x2B1A}, {0x2B1D, 0x2B4F}, {0x2B51, 0x2B54}, + {0x2B5A, 0x2B73}, {0x2B76, 0x2B95}, {0x2B98, 0x2BB9}, + {0x2BBD, 0x2BC8}, {0x2BCA, 0x2BD1}, {0x2BEC, 0x2BEF}, + {0x2C00, 0x2C2E}, {0x2C30, 0x2C5E}, {0x2C60, 0x2CF3}, + {0x2CF9, 0x2D25}, {0x2D27, 0x2D27}, {0x2D2D, 0x2D2D}, + {0x2D30, 0x2D67}, {0x2D6F, 0x2D70}, {0x2D7F, 0x2D96}, + {0x2DA0, 0x2DA6}, {0x2DA8, 0x2DAE}, {0x2DB0, 0x2DB6}, + {0x2DB8, 0x2DBE}, {0x2DC0, 0x2DC6}, {0x2DC8, 0x2DCE}, + {0x2DD0, 0x2DD6}, {0x2DD8, 0x2DDE}, {0x2DE0, 0x2E44}, + {0x303F, 0x303F}, {0x4DC0, 0x4DFF}, {0xA4D0, 0xA62B}, + {0xA640, 0xA6F7}, {0xA700, 0xA7AE}, {0xA7B0, 0xA7B7}, + {0xA7F7, 0xA82B}, {0xA830, 0xA839}, {0xA840, 0xA877}, + {0xA880, 0xA8C5}, {0xA8CE, 0xA8D9}, {0xA8E0, 0xA8FD}, + {0xA900, 0xA953}, {0xA95F, 0xA95F}, {0xA980, 0xA9CD}, + {0xA9CF, 0xA9D9}, {0xA9DE, 0xA9FE}, {0xAA00, 0xAA36}, + {0xAA40, 0xAA4D}, {0xAA50, 0xAA59}, {0xAA5C, 0xAAC2}, + {0xAADB, 0xAAF6}, {0xAB01, 0xAB06}, {0xAB09, 0xAB0E}, + {0xAB11, 0xAB16}, {0xAB20, 0xAB26}, {0xAB28, 0xAB2E}, + {0xAB30, 0xAB65}, {0xAB70, 0xABED}, {0xABF0, 0xABF9}, + {0xD7B0, 0xD7C6}, {0xD7CB, 0xD7FB}, {0xD800, 0xDFFF}, + {0xFB00, 0xFB06}, {0xFB13, 0xFB17}, {0xFB1D, 0xFB36}, + {0xFB38, 0xFB3C}, {0xFB3E, 0xFB3E}, {0xFB40, 0xFB41}, + {0xFB43, 0xFB44}, {0xFB46, 0xFBC1}, {0xFBD3, 0xFD3F}, + {0xFD50, 0xFD8F}, {0xFD92, 0xFDC7}, {0xFDF0, 0xFDFD}, + {0xFE20, 0xFE2F}, {0xFE70, 0xFE74}, {0xFE76, 0xFEFC}, + {0xFEFF, 0xFEFF}, {0xFFF9, 0xFFFC}, {0x10000, 0x1000B}, + {0x1000D, 0x10026}, {0x10028, 0x1003A}, {0x1003C, 0x1003D}, + {0x1003F, 0x1004D}, {0x10050, 0x1005D}, {0x10080, 0x100FA}, + {0x10100, 0x10102}, {0x10107, 0x10133}, {0x10137, 0x1018E}, + {0x10190, 0x1019B}, {0x101A0, 0x101A0}, {0x101D0, 0x101FD}, + {0x10280, 0x1029C}, {0x102A0, 0x102D0}, {0x102E0, 0x102FB}, + {0x10300, 0x10323}, {0x10330, 0x1034A}, {0x10350, 0x1037A}, + {0x10380, 0x1039D}, {0x1039F, 0x103C3}, {0x103C8, 0x103D5}, + {0x10400, 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, 0x10855}, {0x10857, 0x1089E}, {0x108A7, 0x108AF}, + {0x108E0, 0x108F2}, {0x108F4, 0x108F5}, {0x108FB, 0x1091B}, + {0x1091F, 0x10939}, {0x1093F, 0x1093F}, {0x10980, 0x109B7}, + {0x109BC, 0x109CF}, {0x109D2, 0x10A03}, {0x10A05, 0x10A06}, + {0x10A0C, 0x10A13}, {0x10A15, 0x10A17}, {0x10A19, 0x10A33}, + {0x10A38, 0x10A3A}, {0x10A3F, 0x10A47}, {0x10A50, 0x10A58}, + {0x10A60, 0x10A9F}, {0x10AC0, 0x10AE6}, {0x10AEB, 0x10AF6}, + {0x10B00, 0x10B35}, {0x10B39, 0x10B55}, {0x10B58, 0x10B72}, + {0x10B78, 0x10B91}, {0x10B99, 0x10B9C}, {0x10BA9, 0x10BAF}, + {0x10C00, 0x10C48}, {0x10C80, 0x10CB2}, {0x10CC0, 0x10CF2}, + {0x10CFA, 0x10CFF}, {0x10E60, 0x10E7E}, {0x11000, 0x1104D}, + {0x11052, 0x1106F}, {0x1107F, 0x110C1}, {0x110D0, 0x110E8}, + {0x110F0, 0x110F9}, {0x11100, 0x11134}, {0x11136, 0x11143}, + {0x11150, 0x11176}, {0x11180, 0x111CD}, {0x111D0, 0x111DF}, + {0x111E1, 0x111F4}, {0x11200, 0x11211}, {0x11213, 0x1123E}, + {0x11280, 0x11286}, {0x11288, 0x11288}, {0x1128A, 0x1128D}, + {0x1128F, 0x1129D}, {0x1129F, 0x112A9}, {0x112B0, 0x112EA}, + {0x112F0, 0x112F9}, {0x11300, 0x11303}, {0x11305, 0x1130C}, + {0x1130F, 0x11310}, {0x11313, 0x11328}, {0x1132A, 0x11330}, + {0x11332, 0x11333}, {0x11335, 0x11339}, {0x1133C, 0x11344}, + {0x11347, 0x11348}, {0x1134B, 0x1134D}, {0x11350, 0x11350}, + {0x11357, 0x11357}, {0x1135D, 0x11363}, {0x11366, 0x1136C}, + {0x11370, 0x11374}, {0x11400, 0x11459}, {0x1145B, 0x1145B}, + {0x1145D, 0x1145D}, {0x11480, 0x114C7}, {0x114D0, 0x114D9}, + {0x11580, 0x115B5}, {0x115B8, 0x115DD}, {0x11600, 0x11644}, + {0x11650, 0x11659}, {0x11660, 0x1166C}, {0x11680, 0x116B7}, + {0x116C0, 0x116C9}, {0x11700, 0x11719}, {0x1171D, 0x1172B}, + {0x11730, 0x1173F}, {0x118A0, 0x118F2}, {0x118FF, 0x118FF}, + {0x11AC0, 0x11AF8}, {0x11C00, 0x11C08}, {0x11C0A, 0x11C36}, + {0x11C38, 0x11C45}, {0x11C50, 0x11C6C}, {0x11C70, 0x11C8F}, + {0x11C92, 0x11CA7}, {0x11CA9, 0x11CB6}, {0x12000, 0x12399}, + {0x12400, 0x1246E}, {0x12470, 0x12474}, {0x12480, 0x12543}, + {0x13000, 0x1342E}, {0x14400, 0x14646}, {0x16800, 0x16A38}, + {0x16A40, 0x16A5E}, {0x16A60, 0x16A69}, {0x16A6E, 0x16A6F}, + {0x16AD0, 0x16AED}, {0x16AF0, 0x16AF5}, {0x16B00, 0x16B45}, + {0x16B50, 0x16B59}, {0x16B5B, 0x16B61}, {0x16B63, 0x16B77}, + {0x16B7D, 0x16B8F}, {0x16F00, 0x16F44}, {0x16F50, 0x16F7E}, + {0x16F8F, 0x16F9F}, {0x1BC00, 0x1BC6A}, {0x1BC70, 0x1BC7C}, + {0x1BC80, 0x1BC88}, {0x1BC90, 0x1BC99}, {0x1BC9C, 0x1BCA3}, + {0x1D000, 0x1D0F5}, {0x1D100, 0x1D126}, {0x1D129, 0x1D1E8}, + {0x1D200, 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, 0x1D7CB}, {0x1D7CE, 0x1DA8B}, + {0x1DA9B, 0x1DA9F}, {0x1DAA1, 0x1DAAF}, {0x1E000, 0x1E006}, + {0x1E008, 0x1E018}, {0x1E01B, 0x1E021}, {0x1E023, 0x1E024}, + {0x1E026, 0x1E02A}, {0x1E800, 0x1E8C4}, {0x1E8C7, 0x1E8D6}, + {0x1E900, 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 + ZeroWidthJoiner bool +} + +// NewCondition return new instance of Condition which is current locale. +func NewCondition() *Condition { + return &Condition{ + EastAsianWidth: EastAsianWidth, + ZeroWidthJoiner: ZeroWidthJoiner, + } +} + +// 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 + } +} + +func (c *Condition) stringWidth(s string) (width int) { + for _, r := range []rune(s) { + width += c.RuneWidth(r) + } + return width +} + +func (c *Condition) stringWidthZeroJoiner(s string) (width int) { + r1, r2 := rune(0), rune(0) + for _, r := range []rune(s) { + if r == 0xFE0E || r == 0xFE0F { + continue + } + w := c.RuneWidth(r) + if r2 == 0x200D && inTables(r, emoji) && inTables(r1, emoji) { + w = 0 + } + width += w + r1, r2 = r2, r + } + return width +} + +// StringWidth return width as you can see +func (c *Condition) StringWidth(s string) (width int) { + if c.ZeroWidthJoiner { + return c.stringWidthZeroJoiner(s) + } + return c.stringWidth(s) +} + +// 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_appengine.go b/vendor/github.com/mattn/go-runewidth/runewidth_appengine.go new file mode 100644 index 00000000..7d99f6e5 --- /dev/null +++ b/vendor/github.com/mattn/go-runewidth/runewidth_appengine.go @@ -0,0 +1,8 @@ +// +build appengine + +package runewidth + +// IsEastAsian return true if the current locale is CJK +func IsEastAsian() bool { + return false +} diff --git a/vendor/github.com/mattn/go-runewidth/runewidth_js.go b/vendor/github.com/mattn/go-runewidth/runewidth_js.go new file mode 100644 index 00000000..c5fdf40b --- /dev/null +++ b/vendor/github.com/mattn/go-runewidth/runewidth_js.go @@ -0,0 +1,9 @@ +// +build js +// +build !appengine + +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 new file mode 100644 index 00000000..66a58b5d --- /dev/null +++ b/vendor/github.com/mattn/go-runewidth/runewidth_posix.go @@ -0,0 +1,79 @@ +// +build !windows +// +build !js +// +build !appengine + +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 new file mode 100644 index 00000000..d6a61777 --- /dev/null +++ b/vendor/github.com/mattn/go-runewidth/runewidth_windows.go @@ -0,0 +1,28 @@ +// +build windows +// +build !appengine + +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/miekg/dns/Gopkg.lock b/vendor/github.com/miekg/dns/Gopkg.lock index 68663220..66be346a 100644 --- a/vendor/github.com/miekg/dns/Gopkg.lock +++ b/vendor/github.com/miekg/dns/Gopkg.lock @@ -3,55 +3,31 @@ [[projects]] branch = "master" - digest = "1:6914c49eed986dfb8dffb33516fa129c49929d4d873f41e073c83c11c372b870" name = "golang.org/x/crypto" - packages = [ - "ed25519", - "ed25519/internal/edwards25519", - ] - pruneopts = "" - revision = "e3636079e1a4c1f337f212cc5cd2aca108f6c900" + packages = ["ed25519","ed25519/internal/edwards25519"] + revision = "20be4c3c3ed52bfccdb2d59a412ee1a936d175a7" [[projects]] branch = "master" - digest = "1:08e41d63f8dac84d83797368b56cf0b339e42d0224e5e56668963c28aec95685" name = "golang.org/x/net" - packages = [ - "bpf", - "context", - "internal/iana", - "internal/socket", - "ipv4", - "ipv6", - ] - pruneopts = "" - revision = "4dfa2610cdf3b287375bbba5b8f2a14d3b01d8de" + packages = ["bpf","internal/iana","internal/socket","ipv4","ipv6"] + revision = "60506f45cf65977eb3a9c6e30f995f54a721c271" [[projects]] branch = "master" - digest = "1:b2ea75de0ccb2db2ac79356407f8a4cd8f798fe15d41b381c00abf3ae8e55ed1" name = "golang.org/x/sync" packages = ["errgroup"] - pruneopts = "" - revision = "1d60e4601c6fd243af51cc01ddf169918a5407ca" + revision = "112230192c580c3556b8cee6403af37a4fc5f28c" [[projects]] branch = "master" - digest = "1:149a432fabebb8221a80f77731b1cd63597197ded4f14af606ebe3a0959004ec" name = "golang.org/x/sys" - packages = ["unix"] - pruneopts = "" - revision = "e4b3c5e9061176387e7cea65e4dc5853801f3fb7" + packages = ["unix","windows"] + revision = "4c4f7f33c9ed00de01c4c741d2177abfcfe19307" [solve-meta] analyzer-name = "dep" analyzer-version = 1 - input-imports = [ - "golang.org/x/crypto/ed25519", - "golang.org/x/net/ipv4", - "golang.org/x/net/ipv6", - "golang.org/x/sync/errgroup", - "golang.org/x/sys/unix", - ] + inputs-digest = "fc70ece982d3660454fe1b9ccd5c91162a1cc080b58ad82aa065ad4a2ec93ce9" solver-name = "gps-cdcl" solver-version = 1 diff --git a/vendor/github.com/miekg/dns/README.md b/vendor/github.com/miekg/dns/README.md index dc2a8228..de4afed6 100644 --- a/vendor/github.com/miekg/dns/README.md +++ b/vendor/github.com/miekg/dns/README.md @@ -69,6 +69,7 @@ A not-so-up-to-date-list-that-may-be-actually-current: * https://github.com/semihalev/sdns * https://render.com * https://github.com/peterzen/goresolver +* https://github.com/folbricht/routedns Send pull request if you want to be listed here. @@ -152,6 +153,7 @@ Example programs can be found in the `github.com/miekg/exdns` repository. * 6844 - CAA record * 6891 - EDNS0 update * 6895 - DNS IANA considerations +* 6944 - DNSSEC DNSKEY Algorithm Status * 6975 - Algorithm Understanding in DNSSEC * 7043 - EUI48/EUI64 records * 7314 - DNS (EDNS) EXPIRE Option diff --git a/vendor/github.com/miekg/dns/acceptfunc.go b/vendor/github.com/miekg/dns/acceptfunc.go index 78c076c2..94e7c9d9 100644 --- a/vendor/github.com/miekg/dns/acceptfunc.go +++ b/vendor/github.com/miekg/dns/acceptfunc.go @@ -35,9 +35,6 @@ func defaultMsgAcceptFunc(dh Header) MsgAcceptAction { return MsgReject } - if isZero := dh.Bits&_Z != 0; isZero { - return MsgReject - } if dh.Qdcount != 1 { return MsgReject } diff --git a/vendor/github.com/miekg/dns/client.go b/vendor/github.com/miekg/dns/client.go index 20cafe27..db2761d4 100644 --- a/vendor/github.com/miekg/dns/client.go +++ b/vendor/github.com/miekg/dns/client.go @@ -6,6 +6,7 @@ import ( "context" "crypto/tls" "encoding/binary" + "fmt" "io" "net" "strings" @@ -128,20 +129,15 @@ func (c *Client) Exchange(m *Msg, address string) (r *Msg, rtt time.Duration, er return c.exchange(m, address) } - t := "nop" - if t1, ok := TypeToString[m.Question[0].Qtype]; ok { - t = t1 - } - cl := "nop" - if cl1, ok := ClassToString[m.Question[0].Qclass]; ok { - cl = cl1 - } - r, rtt, err, shared := c.group.Do(m.Question[0].Name+t+cl, func() (*Msg, time.Duration, error) { + q := m.Question[0] + key := fmt.Sprintf("%s:%d:%d", q.Name, q.Qtype, q.Qclass) + r, rtt, err, shared := c.group.Do(key, func() (*Msg, time.Duration, error) { return c.exchange(m, address) }) if r != nil && shared { r = r.Copy() } + return r, rtt, err } @@ -219,22 +215,22 @@ func (co *Conn) ReadMsgHeader(hdr *Header) ([]byte, error) { n int err error ) - switch co.Conn.(type) { - case *net.TCPConn, *tls.Conn: - var length uint16 - if err := binary.Read(co.Conn, binary.BigEndian, &length); err != nil { - return nil, err - } - p = make([]byte, length) - n, err = io.ReadFull(co.Conn, p) - default: + if _, ok := co.Conn.(net.PacketConn); ok { if co.UDPSize > MinMsgSize { p = make([]byte, co.UDPSize) } else { p = make([]byte, MinMsgSize) } n, err = co.Read(p) + } else { + var length uint16 + if err := binary.Read(co.Conn, binary.BigEndian, &length); err != nil { + return nil, err + } + + p = make([]byte, length) + n, err = io.ReadFull(co.Conn, p) } if err != nil { @@ -260,21 +256,20 @@ func (co *Conn) Read(p []byte) (n int, err error) { return 0, ErrConnEmpty } - switch co.Conn.(type) { - case *net.TCPConn, *tls.Conn: - var length uint16 - if err := binary.Read(co.Conn, binary.BigEndian, &length); err != nil { - return 0, err - } - if int(length) > len(p) { - return 0, io.ErrShortBuffer - } + if _, ok := co.Conn.(net.PacketConn); ok { + // UDP connection + return co.Conn.Read(p) + } - return io.ReadFull(co.Conn, p[:length]) + var length uint16 + if err := binary.Read(co.Conn, binary.BigEndian, &length); err != nil { + return 0, err + } + if int(length) > len(p) { + return 0, io.ErrShortBuffer } - // UDP connection - return co.Conn.Read(p) + return io.ReadFull(co.Conn, p[:length]) } // WriteMsg sends a message through the connection co. @@ -301,21 +296,20 @@ func (co *Conn) WriteMsg(m *Msg) (err error) { } // Write implements the net.Conn Write method. -func (co *Conn) Write(p []byte) (n int, err error) { - switch co.Conn.(type) { - case *net.TCPConn, *tls.Conn: - if len(p) > MaxMsgSize { - return 0, &Error{err: "message too large"} - } - - l := make([]byte, 2) - binary.BigEndian.PutUint16(l, uint16(len(p))) +func (co *Conn) Write(p []byte) (int, error) { + if len(p) > MaxMsgSize { + return 0, &Error{err: "message too large"} + } - n, err := (&net.Buffers{l, p}).WriteTo(co.Conn) - return int(n), err + if _, ok := co.Conn.(net.PacketConn); ok { + return co.Conn.Write(p) } - return co.Conn.Write(p) + l := make([]byte, 2) + binary.BigEndian.PutUint16(l, uint16(len(p))) + + n, err := (&net.Buffers{l, p}).WriteTo(co.Conn) + return int(n), err } // Return the appropriate timeout for a specific request diff --git a/vendor/github.com/miekg/dns/dns.go b/vendor/github.com/miekg/dns/dns.go index f57337b8..ad83a27e 100644 --- a/vendor/github.com/miekg/dns/dns.go +++ b/vendor/github.com/miekg/dns/dns.go @@ -54,7 +54,7 @@ type RR interface { // parse parses an RR from zone file format. // // This will only be called on a new and empty RR type with only the header populated. - parse(c *zlexer, origin, file string) *ParseError + parse(c *zlexer, origin string) *ParseError // isDuplicate returns whether the two RRs are duplicates. isDuplicate(r2 RR) bool @@ -105,7 +105,7 @@ func (h *RR_Header) unpack(msg []byte, off int) (int, error) { panic("dns: internal error: unpack should never be called on RR_Header") } -func (h *RR_Header) parse(c *zlexer, origin, file string) *ParseError { +func (h *RR_Header) parse(c *zlexer, origin string) *ParseError { panic("dns: internal error: parse should never be called on RR_Header") } diff --git a/vendor/github.com/miekg/dns/dnssec.go b/vendor/github.com/miekg/dns/dnssec.go index faf1dc65..12a693f9 100644 --- a/vendor/github.com/miekg/dns/dnssec.go +++ b/vendor/github.com/miekg/dns/dnssec.go @@ -141,8 +141,8 @@ func (k *DNSKEY) KeyTag() uint16 { switch k.Algorithm { case RSAMD5: // Look at the bottom two bytes of the modules, which the last - // item in the pubkey. We could do this faster by looking directly - // at the base64 values. But I'm lazy. + // item in the pubkey. + // This algorithm has been deprecated, but keep this key-tag calculation. modulus, _ := fromBase64([]byte(k.PublicKey)) if len(modulus) > 1 { x := binary.BigEndian.Uint16(modulus[len(modulus)-2:]) @@ -318,6 +318,9 @@ func (rr *RRSIG) Sign(k crypto.Signer, rrset []RR) error { } rr.Signature = toBase64(signature) + case RSAMD5, DSA, DSANSEC3SHA1: + // See RFC 6944. + return ErrAlg default: h := hash.New() h.Write(signdata) diff --git a/vendor/github.com/miekg/dns/dnssec_keygen.go b/vendor/github.com/miekg/dns/dnssec_keygen.go index 33e913ac..60737e5b 100644 --- a/vendor/github.com/miekg/dns/dnssec_keygen.go +++ b/vendor/github.com/miekg/dns/dnssec_keygen.go @@ -2,7 +2,6 @@ package dns import ( "crypto" - "crypto/dsa" "crypto/ecdsa" "crypto/elliptic" "crypto/rand" @@ -20,11 +19,9 @@ import ( // bits should be set to the size of the algorithm. func (k *DNSKEY) Generate(bits int) (crypto.PrivateKey, error) { switch k.Algorithm { - case DSA, DSANSEC3SHA1: - if bits != 1024 { - return nil, ErrKeySize - } - case RSAMD5, RSASHA1, RSASHA256, RSASHA1NSEC3SHA1: + case RSAMD5, DSA, DSANSEC3SHA1: + return nil, ErrAlg + case RSASHA1, RSASHA256, RSASHA1NSEC3SHA1: if bits < 512 || bits > 4096 { return nil, ErrKeySize } @@ -47,20 +44,7 @@ func (k *DNSKEY) Generate(bits int) (crypto.PrivateKey, error) { } switch k.Algorithm { - case DSA, DSANSEC3SHA1: - params := new(dsa.Parameters) - if err := dsa.GenerateParameters(params, rand.Reader, dsa.L1024N160); err != nil { - return nil, err - } - priv := new(dsa.PrivateKey) - priv.PublicKey.Parameters = *params - err := dsa.GenerateKey(priv, rand.Reader) - if err != nil { - return nil, err - } - k.setPublicKeyDSA(params.Q, params.P, params.G, priv.PublicKey.Y) - return priv, nil - case RSAMD5, RSASHA1, RSASHA256, RSASHA512, RSASHA1NSEC3SHA1: + case RSASHA1, RSASHA256, RSASHA512, RSASHA1NSEC3SHA1: priv, err := rsa.GenerateKey(rand.Reader, bits) if err != nil { return nil, err @@ -120,16 +104,6 @@ func (k *DNSKEY) setPublicKeyECDSA(_X, _Y *big.Int) bool { return true } -// Set the public key for DSA -func (k *DNSKEY) setPublicKeyDSA(_Q, _P, _G, _Y *big.Int) bool { - if _Q == nil || _P == nil || _G == nil || _Y == nil { - return false - } - buf := dsaToBuf(_Q, _P, _G, _Y) - k.PublicKey = toBase64(buf) - return true -} - // Set the public key for Ed25519 func (k *DNSKEY) setPublicKeyED25519(_K ed25519.PublicKey) bool { if _K == nil { @@ -164,15 +138,3 @@ func curveToBuf(_X, _Y *big.Int, intlen int) []byte { buf = append(buf, intToBytes(_Y, intlen)...) return buf } - -// Set the public key for X and Y for Curve. The two -// values are just concatenated. -func dsaToBuf(_Q, _P, _G, _Y *big.Int) []byte { - t := divRoundUp(divRoundUp(_G.BitLen(), 8)-64, 8) - buf := []byte{byte(t)} - buf = append(buf, intToBytes(_Q, 20)...) - buf = append(buf, intToBytes(_P, 64+t*8)...) - buf = append(buf, intToBytes(_G, 64+t*8)...) - buf = append(buf, intToBytes(_Y, 64+t*8)...) - return buf -} diff --git a/vendor/github.com/miekg/dns/dnssec_keyscan.go b/vendor/github.com/miekg/dns/dnssec_keyscan.go index e9dd6957..0e6f3201 100644 --- a/vendor/github.com/miekg/dns/dnssec_keyscan.go +++ b/vendor/github.com/miekg/dns/dnssec_keyscan.go @@ -3,7 +3,6 @@ package dns import ( "bufio" "crypto" - "crypto/dsa" "crypto/ecdsa" "crypto/rsa" "io" @@ -44,19 +43,8 @@ func (k *DNSKEY) ReadPrivateKey(q io.Reader, file string) (crypto.PrivateKey, er return nil, ErrPrivKey } switch uint8(algo) { - case DSA: - priv, err := readPrivateKeyDSA(m) - if err != nil { - return nil, err - } - pub := k.publicKeyDSA() - if pub == nil { - return nil, ErrKey - } - priv.PublicKey = *pub - return priv, nil - case RSAMD5: - fallthrough + case RSAMD5, DSA, DSANSEC3SHA1: + return nil, ErrAlg case RSASHA1: fallthrough case RSASHA1NSEC3SHA1: @@ -129,24 +117,6 @@ func readPrivateKeyRSA(m map[string]string) (*rsa.PrivateKey, error) { return p, nil } -func readPrivateKeyDSA(m map[string]string) (*dsa.PrivateKey, error) { - p := new(dsa.PrivateKey) - p.X = new(big.Int) - for k, v := range m { - switch k { - case "private_value(x)": - v1, err := fromBase64([]byte(v)) - if err != nil { - return nil, err - } - p.X.SetBytes(v1) - case "created", "publish", "activate": - /* not used in Go (yet) */ - } - } - return p, nil -} - func readPrivateKeyECDSA(m map[string]string) (*ecdsa.PrivateKey, error) { p := new(ecdsa.PrivateKey) p.D = new(big.Int) diff --git a/vendor/github.com/miekg/dns/edns.go b/vendor/github.com/miekg/dns/edns.go index ca8873e1..8cdbfb0b 100644 --- a/vendor/github.com/miekg/dns/edns.go +++ b/vendor/github.com/miekg/dns/edns.go @@ -88,7 +88,7 @@ func (rr *OPT) len(off int, compression map[string]struct{}) int { return l } -func (rr *OPT) parse(c *zlexer, origin, file string) *ParseError { +func (rr *OPT) parse(c *zlexer, origin string) *ParseError { panic("dns: internal error: parse should never be called on OPT") } diff --git a/vendor/github.com/miekg/dns/msg_helpers.go b/vendor/github.com/miekg/dns/msg_helpers.go index ecd9280f..cb4ae764 100644 --- a/vendor/github.com/miekg/dns/msg_helpers.go +++ b/vendor/github.com/miekg/dns/msg_helpers.go @@ -495,7 +495,7 @@ Option: func packDataOpt(options []EDNS0, msg []byte, off int) (int, error) { for _, el := range options { b, err := el.pack() - if err != nil || off+3 > len(msg) { + if err != nil || off+4 > len(msg) { return len(msg), &Error{err: "overflow packing opt"} } binary.BigEndian.PutUint16(msg[off:], el.Option()) // Option code @@ -587,6 +587,29 @@ func unpackDataNsec(msg []byte, off int) ([]uint16, int, error) { return nsec, off, nil } +// typeBitMapLen is a helper function which computes the "maximum" length of +// a the NSEC Type BitMap field. +func typeBitMapLen(bitmap []uint16) int { + var l int + var lastwindow, lastlength uint16 + for _, t := range bitmap { + window := t / 256 + length := (t-window*256)/8 + 1 + if window > lastwindow && lastlength != 0 { // New window, jump to the new offset + l += int(lastlength) + 2 + lastlength = 0 + } + if window < lastwindow || length < lastlength { + // packDataNsec would return Error{err: "nsec bits out of order"} here, but + // when computing the length, we want do be liberal. + continue + } + lastwindow, lastlength = window, length + } + l += int(lastlength) + 2 + return l +} + func packDataNsec(bitmap []uint16, msg []byte, off int) (int, error) { if len(bitmap) == 0 { return off, nil diff --git a/vendor/github.com/miekg/dns/msg_truncate.go b/vendor/github.com/miekg/dns/msg_truncate.go index 4763fc61..83780af6 100644 --- a/vendor/github.com/miekg/dns/msg_truncate.go +++ b/vendor/github.com/miekg/dns/msg_truncate.go @@ -4,7 +4,7 @@ package dns // size by removing records that exceed the requested size. // // It will first check if the reply fits without compression and then with -// compression. If it won't fit with compression, Scrub then walks the +// compression. If it won't fit with compression, Truncate then walks the // record adding as many records as possible without exceeding the // requested buffer size. // diff --git a/vendor/github.com/miekg/dns/privaterr.go b/vendor/github.com/miekg/dns/privaterr.go index d9c0d267..e28f0663 100644 --- a/vendor/github.com/miekg/dns/privaterr.go +++ b/vendor/github.com/miekg/dns/privaterr.go @@ -1,9 +1,6 @@ package dns -import ( - "fmt" - "strings" -) +import "strings" // PrivateRdata is an interface used for implementing "Private Use" RR types, see // RFC 6895. This allows one to experiment with new RR types, without requesting an @@ -18,7 +15,7 @@ type PrivateRdata interface { // Unpack is used when unpacking a private RR from a buffer. // TODO(miek): diff. signature than Pack, see edns0.go for instance. Unpack([]byte) (int, error) - // Copy copies the Rdata. + // Copy copies the Rdata into the PrivateRdata argument. Copy(PrivateRdata) error // Len returns the length in octets of the Rdata. Len() int @@ -29,22 +26,8 @@ type PrivateRdata interface { type PrivateRR struct { Hdr RR_Header Data PrivateRdata -} - -func mkPrivateRR(rrtype uint16) *PrivateRR { - // Panics if RR is not an instance of PrivateRR. - rrfunc, ok := TypeToRR[rrtype] - if !ok { - panic(fmt.Sprintf("dns: invalid operation with Private RR type %d", rrtype)) - } - - anyrr := rrfunc() - rr, ok := anyrr.(*PrivateRR) - if !ok { - panic(fmt.Sprintf("dns: RR is not a PrivateRR, TypeToRR[%d] generator returned %T", rrtype, anyrr)) - } - return rr + generator func() PrivateRdata // for copy } // Header return the RR header of r. @@ -61,13 +44,12 @@ func (r *PrivateRR) len(off int, compression map[string]struct{}) int { func (r *PrivateRR) copy() RR { // make new RR like this: - rr := mkPrivateRR(r.Hdr.Rrtype) - rr.Hdr = r.Hdr + rr := &PrivateRR{r.Hdr, r.generator(), r.generator} - err := r.Data.Copy(rr.Data) - if err != nil { - panic("dns: got value that could not be used to copy Private rdata") + if err := r.Data.Copy(rr.Data); err != nil { + panic("dns: got value that could not be used to copy Private rdata: " + err.Error()) } + return rr } @@ -86,7 +68,7 @@ func (r *PrivateRR) unpack(msg []byte, off int) (int, error) { return off, err } -func (r *PrivateRR) parse(c *zlexer, origin, file string) *ParseError { +func (r *PrivateRR) parse(c *zlexer, origin string) *ParseError { var l lex text := make([]string, 0, 2) // could be 0..N elements, median is probably 1 Fetch: @@ -103,7 +85,7 @@ Fetch: err := r.Data.Parse(text) if err != nil { - return &ParseError{file, err.Error(), l} + return &ParseError{"", err.Error(), l} } return nil @@ -116,7 +98,7 @@ func (r1 *PrivateRR) isDuplicate(r2 RR) bool { return false } func PrivateHandle(rtypestr string, rtype uint16, generator func() PrivateRdata) { rtypestr = strings.ToUpper(rtypestr) - TypeToRR[rtype] = func() RR { return &PrivateRR{RR_Header{}, generator()} } + TypeToRR[rtype] = func() RR { return &PrivateRR{RR_Header{}, generator(), generator} } TypeToString[rtype] = rtypestr StringToType[rtypestr] = rtype } diff --git a/vendor/github.com/miekg/dns/scan.go b/vendor/github.com/miekg/dns/scan.go index a8691bca..7da14c88 100644 --- a/vendor/github.com/miekg/dns/scan.go +++ b/vendor/github.com/miekg/dns/scan.go @@ -503,9 +503,8 @@ func (zp *ZoneParser) Next() (RR, bool) { return zp.setParseError("expecting $TTL value, not this...", l) } - if e := slurpRemainder(zp.c, zp.file); e != nil { - zp.parseErr = e - return nil, false + if err := slurpRemainder(zp.c); err != nil { + return zp.setParseError(err.err, err.lex) } ttl, ok := stringToTTL(l.token) @@ -527,9 +526,8 @@ func (zp *ZoneParser) Next() (RR, bool) { return zp.setParseError("expecting $ORIGIN value, not this...", l) } - if e := slurpRemainder(zp.c, zp.file); e != nil { - zp.parseErr = e - return nil, false + if err := slurpRemainder(zp.c); err != nil { + return zp.setParseError(err.err, err.lex) } name, ok := toAbsoluteName(l.token, zp.origin) @@ -650,19 +648,44 @@ func (zp *ZoneParser) Next() (RR, bool) { st = zExpectRdata case zExpectRdata: - r, e := setRR(*h, zp.c, zp.origin, zp.file) - if e != nil { - // If e.lex is nil than we have encounter a unknown RR type - // in that case we substitute our current lex token - if e.lex.token == "" && e.lex.value == 0 { - e.lex = l // Uh, dirty + var rr RR + if newFn, ok := TypeToRR[h.Rrtype]; ok && canParseAsRR(h.Rrtype) { + rr = newFn() + *rr.Header() = *h + } else { + rr = &RFC3597{Hdr: *h} + } + + _, isPrivate := rr.(*PrivateRR) + if !isPrivate && zp.c.Peek().token == "" { + // This is a dynamic update rr. + + // TODO(tmthrgd): Previously slurpRemainder was only called + // for certain RR types, which may have been important. + if err := slurpRemainder(zp.c); err != nil { + return zp.setParseError(err.err, err.lex) + } + + return rr, true + } else if l.value == zNewline { + return zp.setParseError("unexpected newline", l) + } + + if err := rr.parse(zp.c, zp.origin); err != nil { + // err is a concrete *ParseError without the file field set. + // The setParseError call below will construct a new + // *ParseError with file set to zp.file. + + // If err.lex is nil than we have encounter an unknown RR type + // in that case we substitute our current lex token. + if err.lex == (lex{}) { + return zp.setParseError(err.err, l) } - zp.parseErr = e - return nil, false + return zp.setParseError(err.err, err.lex) } - return r, true + return rr, true } } @@ -671,6 +694,18 @@ func (zp *ZoneParser) Next() (RR, bool) { return nil, false } +// canParseAsRR returns true if the record type can be parsed as a +// concrete RR. It blacklists certain record types that must be parsed +// according to RFC 3597 because they lack a presentation format. +func canParseAsRR(rrtype uint16) bool { + switch rrtype { + case TypeANY, TypeNULL, TypeOPT, TypeTSIG: + return false + default: + return true + } +} + type zlexer struct { br io.ByteReader @@ -682,7 +717,8 @@ type zlexer struct { comBuf string comment string - l lex + l lex + cachedL *lex brace int quote bool @@ -748,13 +784,37 @@ func (zl *zlexer) readByte() (byte, bool) { return c, true } +func (zl *zlexer) Peek() lex { + if zl.nextL { + return zl.l + } + + l, ok := zl.Next() + if !ok { + return l + } + + if zl.nextL { + // Cache l. Next returns zl.cachedL then zl.l. + zl.cachedL = &l + } else { + // In this case l == zl.l, so we just tell Next to return zl.l. + zl.nextL = true + } + + return l +} + func (zl *zlexer) Next() (lex, bool) { l := &zl.l - if zl.nextL { + switch { + case zl.cachedL != nil: + l, zl.cachedL = zl.cachedL, nil + return *l, true + case zl.nextL: zl.nextL = false return *l, true - } - if l.err { + case l.err: // Parsing errors should be sticky. return lex{value: zEOF}, false } @@ -1302,18 +1362,18 @@ func locCheckEast(token string, longitude uint32) (uint32, bool) { } // "Eat" the rest of the "line" -func slurpRemainder(c *zlexer, f string) *ParseError { +func slurpRemainder(c *zlexer) *ParseError { l, _ := c.Next() switch l.value { case zBlank: l, _ = c.Next() if l.value != zNewline && l.value != zEOF { - return &ParseError{f, "garbage after rdata", l} + return &ParseError{"", "garbage after rdata", l} } case zNewline: case zEOF: default: - return &ParseError{f, "garbage after rdata", l} + return &ParseError{"", "garbage after rdata", l} } return nil } diff --git a/vendor/github.com/miekg/dns/scan_rr.go b/vendor/github.com/miekg/dns/scan_rr.go index 6096f9b0..93b24a69 100644 --- a/vendor/github.com/miekg/dns/scan_rr.go +++ b/vendor/github.com/miekg/dns/scan_rr.go @@ -7,55 +7,21 @@ import ( "strings" ) -// Parse the rdata of each rrtype. -// All data from the channel c is either zString or zBlank. -// After the rdata there may come a zBlank and then a zNewline -// or immediately a zNewline. If this is not the case we flag -// an *ParseError: garbage after rdata. -func setRR(h RR_Header, c *zlexer, o, f string) (RR, *ParseError) { - var rr RR - if newFn, ok := TypeToRR[h.Rrtype]; ok && canParseAsRR(h.Rrtype) { - rr = newFn() - *rr.Header() = h - } else { - rr = &RFC3597{Hdr: h} - } - - err := rr.parse(c, o, f) - if err != nil { - return nil, err - } - - return rr, nil -} - -// canParseAsRR returns true if the record type can be parsed as a -// concrete RR. It blacklists certain record types that must be parsed -// according to RFC 3597 because they lack a presentation format. -func canParseAsRR(rrtype uint16) bool { - switch rrtype { - case TypeANY, TypeNULL, TypeOPT, TypeTSIG: - return false - default: - return true - } -} - // A remainder of the rdata with embedded spaces, return the parsed string (sans the spaces) // or an error -func endingToString(c *zlexer, errstr, f string) (string, *ParseError) { +func endingToString(c *zlexer, errstr string) (string, *ParseError) { var s string l, _ := c.Next() // zString for l.value != zNewline && l.value != zEOF { if l.err { - return s, &ParseError{f, errstr, l} + return s, &ParseError{"", errstr, l} } switch l.value { case zString: s += l.token case zBlank: // Ok default: - return "", &ParseError{f, errstr, l} + return "", &ParseError{"", errstr, l} } l, _ = c.Next() } @@ -65,11 +31,11 @@ func endingToString(c *zlexer, errstr, f string) (string, *ParseError) { // A remainder of the rdata with embedded spaces, split on unquoted whitespace // and return the parsed string slice or an error -func endingToTxtSlice(c *zlexer, errstr, f string) ([]string, *ParseError) { +func endingToTxtSlice(c *zlexer, errstr string) ([]string, *ParseError) { // Get the remaining data until we see a zNewline l, _ := c.Next() if l.err { - return nil, &ParseError{f, errstr, l} + return nil, &ParseError{"", errstr, l} } // Build the slice @@ -78,7 +44,7 @@ func endingToTxtSlice(c *zlexer, errstr, f string) ([]string, *ParseError) { empty := false for l.value != zNewline && l.value != zEOF { if l.err { - return nil, &ParseError{f, errstr, l} + return nil, &ParseError{"", errstr, l} } switch l.value { case zString: @@ -105,7 +71,7 @@ func endingToTxtSlice(c *zlexer, errstr, f string) ([]string, *ParseError) { case zBlank: if quote { // zBlank can only be seen in between txt parts. - return nil, &ParseError{f, errstr, l} + return nil, &ParseError{"", errstr, l} } case zQuote: if empty && quote { @@ -114,24 +80,20 @@ func endingToTxtSlice(c *zlexer, errstr, f string) ([]string, *ParseError) { quote = !quote empty = true default: - return nil, &ParseError{f, errstr, l} + return nil, &ParseError{"", errstr, l} } l, _ = c.Next() } if quote { - return nil, &ParseError{f, errstr, l} + return nil, &ParseError{"", errstr, l} } return s, nil } -func (rr *A) parse(c *zlexer, o, f string) *ParseError { +func (rr *A) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - if len(l.token) == 0 { // dynamic update rr. - return slurpRemainder(c, f) - } - rr.A = net.ParseIP(l.token) // IPv4 addresses cannot include ":". // We do this rather than use net.IP's To4() because @@ -139,82 +101,58 @@ func (rr *A) parse(c *zlexer, o, f string) *ParseError { // IPv4. isIPv4 := !strings.Contains(l.token, ":") if rr.A == nil || !isIPv4 || l.err { - return &ParseError{f, "bad A A", l} + return &ParseError{"", "bad A A", l} } - return slurpRemainder(c, f) + return slurpRemainder(c) } -func (rr *AAAA) parse(c *zlexer, o, f string) *ParseError { +func (rr *AAAA) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - if len(l.token) == 0 { // dynamic update rr. - return slurpRemainder(c, f) - } - rr.AAAA = net.ParseIP(l.token) // IPv6 addresses must include ":", and IPv4 // addresses cannot include ":". isIPv6 := strings.Contains(l.token, ":") if rr.AAAA == nil || !isIPv6 || l.err { - return &ParseError{f, "bad AAAA AAAA", l} + return &ParseError{"", "bad AAAA AAAA", l} } - return slurpRemainder(c, f) + return slurpRemainder(c) } -func (rr *NS) parse(c *zlexer, o, f string) *ParseError { +func (rr *NS) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - rr.Ns = l.token - if len(l.token) == 0 { // dynamic update rr. - return slurpRemainder(c, f) - } - name, nameOk := toAbsoluteName(l.token, o) if l.err || !nameOk { - return &ParseError{f, "bad NS Ns", l} + return &ParseError{"", "bad NS Ns", l} } rr.Ns = name - return slurpRemainder(c, f) + return slurpRemainder(c) } -func (rr *PTR) parse(c *zlexer, o, f string) *ParseError { +func (rr *PTR) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - rr.Ptr = l.token - if len(l.token) == 0 { // dynamic update rr. - return slurpRemainder(c, f) - } - name, nameOk := toAbsoluteName(l.token, o) if l.err || !nameOk { - return &ParseError{f, "bad PTR Ptr", l} + return &ParseError{"", "bad PTR Ptr", l} } rr.Ptr = name - return slurpRemainder(c, f) + return slurpRemainder(c) } -func (rr *NSAPPTR) parse(c *zlexer, o, f string) *ParseError { +func (rr *NSAPPTR) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - rr.Ptr = l.token - if len(l.token) == 0 { // dynamic update rr. - return slurpRemainder(c, f) - } - name, nameOk := toAbsoluteName(l.token, o) if l.err || !nameOk { - return &ParseError{f, "bad NSAP-PTR Ptr", l} + return &ParseError{"", "bad NSAP-PTR Ptr", l} } rr.Ptr = name - return slurpRemainder(c, f) + return slurpRemainder(c) } -func (rr *RP) parse(c *zlexer, o, f string) *ParseError { +func (rr *RP) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - rr.Mbox = l.token - if len(l.token) == 0 { // dynamic update rr. - return slurpRemainder(c, f) - } - mbox, mboxOk := toAbsoluteName(l.token, o) if l.err || !mboxOk { - return &ParseError{f, "bad RP Mbox", l} + return &ParseError{"", "bad RP Mbox", l} } rr.Mbox = mbox @@ -224,60 +162,45 @@ func (rr *RP) parse(c *zlexer, o, f string) *ParseError { txt, txtOk := toAbsoluteName(l.token, o) if l.err || !txtOk { - return &ParseError{f, "bad RP Txt", l} + return &ParseError{"", "bad RP Txt", l} } rr.Txt = txt - return slurpRemainder(c, f) + return slurpRemainder(c) } -func (rr *MR) parse(c *zlexer, o, f string) *ParseError { +func (rr *MR) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - rr.Mr = l.token - if len(l.token) == 0 { // dynamic update rr. - return slurpRemainder(c, f) - } - name, nameOk := toAbsoluteName(l.token, o) if l.err || !nameOk { - return &ParseError{f, "bad MR Mr", l} + return &ParseError{"", "bad MR Mr", l} } rr.Mr = name - return slurpRemainder(c, f) + return slurpRemainder(c) } -func (rr *MB) parse(c *zlexer, o, f string) *ParseError { +func (rr *MB) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - rr.Mb = l.token - if len(l.token) == 0 { // dynamic update rr. - return slurpRemainder(c, f) - } - name, nameOk := toAbsoluteName(l.token, o) if l.err || !nameOk { - return &ParseError{f, "bad MB Mb", l} + return &ParseError{"", "bad MB Mb", l} } rr.Mb = name - return slurpRemainder(c, f) + return slurpRemainder(c) } -func (rr *MG) parse(c *zlexer, o, f string) *ParseError { +func (rr *MG) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - rr.Mg = l.token - if len(l.token) == 0 { // dynamic update rr. - return slurpRemainder(c, f) - } - name, nameOk := toAbsoluteName(l.token, o) if l.err || !nameOk { - return &ParseError{f, "bad MG Mg", l} + return &ParseError{"", "bad MG Mg", l} } rr.Mg = name - return slurpRemainder(c, f) + return slurpRemainder(c) } -func (rr *HINFO) parse(c *zlexer, o, f string) *ParseError { - chunks, e := endingToTxtSlice(c, "bad HINFO Fields", f) +func (rr *HINFO) parse(c *zlexer, o string) *ParseError { + chunks, e := endingToTxtSlice(c, "bad HINFO Fields") if e != nil { return e } @@ -299,16 +222,11 @@ func (rr *HINFO) parse(c *zlexer, o, f string) *ParseError { return nil } -func (rr *MINFO) parse(c *zlexer, o, f string) *ParseError { +func (rr *MINFO) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - rr.Rmail = l.token - if len(l.token) == 0 { // dynamic update rr. - return slurpRemainder(c, f) - } - rmail, rmailOk := toAbsoluteName(l.token, o) if l.err || !rmailOk { - return &ParseError{f, "bad MINFO Rmail", l} + return &ParseError{"", "bad MINFO Rmail", l} } rr.Rmail = rmail @@ -318,52 +236,38 @@ func (rr *MINFO) parse(c *zlexer, o, f string) *ParseError { email, emailOk := toAbsoluteName(l.token, o) if l.err || !emailOk { - return &ParseError{f, "bad MINFO Email", l} + return &ParseError{"", "bad MINFO Email", l} } rr.Email = email - return slurpRemainder(c, f) + return slurpRemainder(c) } -func (rr *MF) parse(c *zlexer, o, f string) *ParseError { +func (rr *MF) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - rr.Mf = l.token - if len(l.token) == 0 { // dynamic update rr. - return slurpRemainder(c, f) - } - name, nameOk := toAbsoluteName(l.token, o) if l.err || !nameOk { - return &ParseError{f, "bad MF Mf", l} + return &ParseError{"", "bad MF Mf", l} } rr.Mf = name - return slurpRemainder(c, f) + return slurpRemainder(c) } -func (rr *MD) parse(c *zlexer, o, f string) *ParseError { +func (rr *MD) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - rr.Md = l.token - if len(l.token) == 0 { // dynamic update rr. - return slurpRemainder(c, f) - } - name, nameOk := toAbsoluteName(l.token, o) if l.err || !nameOk { - return &ParseError{f, "bad MD Md", l} + return &ParseError{"", "bad MD Md", l} } rr.Md = name - return slurpRemainder(c, f) + return slurpRemainder(c) } -func (rr *MX) parse(c *zlexer, o, f string) *ParseError { +func (rr *MX) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - if len(l.token) == 0 { // dynamic update rr. - return slurpRemainder(c, f) - } - i, e := strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { - return &ParseError{f, "bad MX Pref", l} + return &ParseError{"", "bad MX Pref", l} } rr.Preference = uint16(i) @@ -373,22 +277,18 @@ func (rr *MX) parse(c *zlexer, o, f string) *ParseError { name, nameOk := toAbsoluteName(l.token, o) if l.err || !nameOk { - return &ParseError{f, "bad MX Mx", l} + return &ParseError{"", "bad MX Mx", l} } rr.Mx = name - return slurpRemainder(c, f) + return slurpRemainder(c) } -func (rr *RT) parse(c *zlexer, o, f string) *ParseError { +func (rr *RT) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - if len(l.token) == 0 { // dynamic update rr. - return slurpRemainder(c, f) - } - i, e := strconv.ParseUint(l.token, 10, 16) if e != nil { - return &ParseError{f, "bad RT Preference", l} + return &ParseError{"", "bad RT Preference", l} } rr.Preference = uint16(i) @@ -398,22 +298,18 @@ func (rr *RT) parse(c *zlexer, o, f string) *ParseError { name, nameOk := toAbsoluteName(l.token, o) if l.err || !nameOk { - return &ParseError{f, "bad RT Host", l} + return &ParseError{"", "bad RT Host", l} } rr.Host = name - return slurpRemainder(c, f) + return slurpRemainder(c) } -func (rr *AFSDB) parse(c *zlexer, o, f string) *ParseError { +func (rr *AFSDB) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - if len(l.token) == 0 { // dynamic update rr. - return slurpRemainder(c, f) - } - i, e := strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { - return &ParseError{f, "bad AFSDB Subtype", l} + return &ParseError{"", "bad AFSDB Subtype", l} } rr.Subtype = uint16(i) @@ -423,34 +319,26 @@ func (rr *AFSDB) parse(c *zlexer, o, f string) *ParseError { name, nameOk := toAbsoluteName(l.token, o) if l.err || !nameOk { - return &ParseError{f, "bad AFSDB Hostname", l} + return &ParseError{"", "bad AFSDB Hostname", l} } rr.Hostname = name - return slurpRemainder(c, f) + return slurpRemainder(c) } -func (rr *X25) parse(c *zlexer, o, f string) *ParseError { +func (rr *X25) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - if len(l.token) == 0 { // dynamic update rr. - return slurpRemainder(c, f) - } - if l.err { - return &ParseError{f, "bad X25 PSDNAddress", l} + return &ParseError{"", "bad X25 PSDNAddress", l} } rr.PSDNAddress = l.token - return slurpRemainder(c, f) + return slurpRemainder(c) } -func (rr *KX) parse(c *zlexer, o, f string) *ParseError { +func (rr *KX) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - if len(l.token) == 0 { // dynamic update rr. - return slurpRemainder(c, f) - } - i, e := strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { - return &ParseError{f, "bad KX Pref", l} + return &ParseError{"", "bad KX Pref", l} } rr.Preference = uint16(i) @@ -460,52 +348,37 @@ func (rr *KX) parse(c *zlexer, o, f string) *ParseError { name, nameOk := toAbsoluteName(l.token, o) if l.err || !nameOk { - return &ParseError{f, "bad KX Exchanger", l} + return &ParseError{"", "bad KX Exchanger", l} } rr.Exchanger = name - return slurpRemainder(c, f) + return slurpRemainder(c) } -func (rr *CNAME) parse(c *zlexer, o, f string) *ParseError { +func (rr *CNAME) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - rr.Target = l.token - if len(l.token) == 0 { // dynamic update rr. - return slurpRemainder(c, f) - } - name, nameOk := toAbsoluteName(l.token, o) if l.err || !nameOk { - return &ParseError{f, "bad CNAME Target", l} + return &ParseError{"", "bad CNAME Target", l} } rr.Target = name - return slurpRemainder(c, f) + return slurpRemainder(c) } -func (rr *DNAME) parse(c *zlexer, o, f string) *ParseError { +func (rr *DNAME) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - rr.Target = l.token - if len(l.token) == 0 { // dynamic update rr. - return slurpRemainder(c, f) - } - name, nameOk := toAbsoluteName(l.token, o) if l.err || !nameOk { - return &ParseError{f, "bad DNAME Target", l} + return &ParseError{"", "bad DNAME Target", l} } rr.Target = name - return slurpRemainder(c, f) + return slurpRemainder(c) } -func (rr *SOA) parse(c *zlexer, o, f string) *ParseError { +func (rr *SOA) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - rr.Ns = l.token - if len(l.token) == 0 { // dynamic update rr. - return slurpRemainder(c, f) - } - ns, nsOk := toAbsoluteName(l.token, o) if l.err || !nsOk { - return &ParseError{f, "bad SOA Ns", l} + return &ParseError{"", "bad SOA Ns", l} } rr.Ns = ns @@ -515,7 +388,7 @@ func (rr *SOA) parse(c *zlexer, o, f string) *ParseError { mbox, mboxOk := toAbsoluteName(l.token, o) if l.err || !mboxOk { - return &ParseError{f, "bad SOA Mbox", l} + return &ParseError{"", "bad SOA Mbox", l} } rr.Mbox = mbox @@ -528,16 +401,16 @@ func (rr *SOA) parse(c *zlexer, o, f string) *ParseError { for i := 0; i < 5; i++ { l, _ = c.Next() if l.err { - return &ParseError{f, "bad SOA zone parameter", l} + return &ParseError{"", "bad SOA zone parameter", l} } if j, e := strconv.ParseUint(l.token, 10, 32); e != nil { if i == 0 { // Serial must be a number - return &ParseError{f, "bad SOA zone parameter", l} + return &ParseError{"", "bad SOA zone parameter", l} } // We allow other fields to be unitful duration strings if v, ok = stringToTTL(l.token); !ok { - return &ParseError{f, "bad SOA zone parameter", l} + return &ParseError{"", "bad SOA zone parameter", l} } } else { @@ -560,18 +433,14 @@ func (rr *SOA) parse(c *zlexer, o, f string) *ParseError { rr.Minttl = v } } - return slurpRemainder(c, f) + return slurpRemainder(c) } -func (rr *SRV) parse(c *zlexer, o, f string) *ParseError { +func (rr *SRV) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - if len(l.token) == 0 { // dynamic update rr. - return slurpRemainder(c, f) - } - i, e := strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { - return &ParseError{f, "bad SRV Priority", l} + return &ParseError{"", "bad SRV Priority", l} } rr.Priority = uint16(i) @@ -579,7 +448,7 @@ func (rr *SRV) parse(c *zlexer, o, f string) *ParseError { l, _ = c.Next() // zString i, e = strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { - return &ParseError{f, "bad SRV Weight", l} + return &ParseError{"", "bad SRV Weight", l} } rr.Weight = uint16(i) @@ -587,7 +456,7 @@ func (rr *SRV) parse(c *zlexer, o, f string) *ParseError { l, _ = c.Next() // zString i, e = strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { - return &ParseError{f, "bad SRV Port", l} + return &ParseError{"", "bad SRV Port", l} } rr.Port = uint16(i) @@ -597,21 +466,17 @@ func (rr *SRV) parse(c *zlexer, o, f string) *ParseError { name, nameOk := toAbsoluteName(l.token, o) if l.err || !nameOk { - return &ParseError{f, "bad SRV Target", l} + return &ParseError{"", "bad SRV Target", l} } rr.Target = name - return slurpRemainder(c, f) + return slurpRemainder(c) } -func (rr *NAPTR) parse(c *zlexer, o, f string) *ParseError { +func (rr *NAPTR) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - if len(l.token) == 0 { // dynamic update rr. - return slurpRemainder(c, f) - } - i, e := strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { - return &ParseError{f, "bad NAPTR Order", l} + return &ParseError{"", "bad NAPTR Order", l} } rr.Order = uint16(i) @@ -619,7 +484,7 @@ func (rr *NAPTR) parse(c *zlexer, o, f string) *ParseError { l, _ = c.Next() // zString i, e = strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { - return &ParseError{f, "bad NAPTR Preference", l} + return &ParseError{"", "bad NAPTR Preference", l} } rr.Preference = uint16(i) @@ -627,57 +492,57 @@ func (rr *NAPTR) parse(c *zlexer, o, f string) *ParseError { c.Next() // zBlank l, _ = c.Next() // _QUOTE if l.value != zQuote { - return &ParseError{f, "bad NAPTR Flags", l} + return &ParseError{"", "bad NAPTR Flags", l} } l, _ = c.Next() // Either String or Quote if l.value == zString { rr.Flags = l.token l, _ = c.Next() // _QUOTE if l.value != zQuote { - return &ParseError{f, "bad NAPTR Flags", l} + return &ParseError{"", "bad NAPTR Flags", l} } } else if l.value == zQuote { rr.Flags = "" } else { - return &ParseError{f, "bad NAPTR Flags", l} + return &ParseError{"", "bad NAPTR Flags", l} } // Service c.Next() // zBlank l, _ = c.Next() // _QUOTE if l.value != zQuote { - return &ParseError{f, "bad NAPTR Service", l} + return &ParseError{"", "bad NAPTR Service", l} } l, _ = c.Next() // Either String or Quote if l.value == zString { rr.Service = l.token l, _ = c.Next() // _QUOTE if l.value != zQuote { - return &ParseError{f, "bad NAPTR Service", l} + return &ParseError{"", "bad NAPTR Service", l} } } else if l.value == zQuote { rr.Service = "" } else { - return &ParseError{f, "bad NAPTR Service", l} + return &ParseError{"", "bad NAPTR Service", l} } // Regexp c.Next() // zBlank l, _ = c.Next() // _QUOTE if l.value != zQuote { - return &ParseError{f, "bad NAPTR Regexp", l} + return &ParseError{"", "bad NAPTR Regexp", l} } l, _ = c.Next() // Either String or Quote if l.value == zString { rr.Regexp = l.token l, _ = c.Next() // _QUOTE if l.value != zQuote { - return &ParseError{f, "bad NAPTR Regexp", l} + return &ParseError{"", "bad NAPTR Regexp", l} } } else if l.value == zQuote { rr.Regexp = "" } else { - return &ParseError{f, "bad NAPTR Regexp", l} + return &ParseError{"", "bad NAPTR Regexp", l} } // After quote no space?? @@ -687,22 +552,17 @@ func (rr *NAPTR) parse(c *zlexer, o, f string) *ParseError { name, nameOk := toAbsoluteName(l.token, o) if l.err || !nameOk { - return &ParseError{f, "bad NAPTR Replacement", l} + return &ParseError{"", "bad NAPTR Replacement", l} } rr.Replacement = name - return slurpRemainder(c, f) + return slurpRemainder(c) } -func (rr *TALINK) parse(c *zlexer, o, f string) *ParseError { +func (rr *TALINK) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - rr.PreviousName = l.token - if len(l.token) == 0 { // dynamic update rr. - return slurpRemainder(c, f) - } - previousName, previousNameOk := toAbsoluteName(l.token, o) if l.err || !previousNameOk { - return &ParseError{f, "bad TALINK PreviousName", l} + return &ParseError{"", "bad TALINK PreviousName", l} } rr.PreviousName = previousName @@ -712,14 +572,14 @@ func (rr *TALINK) parse(c *zlexer, o, f string) *ParseError { nextName, nextNameOk := toAbsoluteName(l.token, o) if l.err || !nextNameOk { - return &ParseError{f, "bad TALINK NextName", l} + return &ParseError{"", "bad TALINK NextName", l} } rr.NextName = nextName - return slurpRemainder(c, f) + return slurpRemainder(c) } -func (rr *LOC) parse(c *zlexer, o, f string) *ParseError { +func (rr *LOC) parse(c *zlexer, o string) *ParseError { // Non zero defaults for LOC record, see RFC 1876, Section 3. rr.HorizPre = 165 // 10000 rr.VertPre = 162 // 10 @@ -728,12 +588,9 @@ func (rr *LOC) parse(c *zlexer, o, f string) *ParseError { // North l, _ := c.Next() - if len(l.token) == 0 { // dynamic update rr. - return nil - } i, e := strconv.ParseUint(l.token, 10, 32) if e != nil || l.err { - return &ParseError{f, "bad LOC Latitude", l} + return &ParseError{"", "bad LOC Latitude", l} } rr.Latitude = 1000 * 60 * 60 * uint32(i) @@ -745,14 +602,14 @@ func (rr *LOC) parse(c *zlexer, o, f string) *ParseError { } i, e = strconv.ParseUint(l.token, 10, 32) if e != nil || l.err { - return &ParseError{f, "bad LOC Latitude minutes", l} + return &ParseError{"", "bad LOC Latitude minutes", l} } rr.Latitude += 1000 * 60 * uint32(i) c.Next() // zBlank l, _ = c.Next() if i, e := strconv.ParseFloat(l.token, 32); e != nil || l.err { - return &ParseError{f, "bad LOC Latitude seconds", l} + return &ParseError{"", "bad LOC Latitude seconds", l} } else { rr.Latitude += uint32(1000 * i) } @@ -763,14 +620,14 @@ func (rr *LOC) parse(c *zlexer, o, f string) *ParseError { goto East } // If still alive, flag an error - return &ParseError{f, "bad LOC Latitude North/South", l} + return &ParseError{"", "bad LOC Latitude North/South", l} East: // East c.Next() // zBlank l, _ = c.Next() if i, e := strconv.ParseUint(l.token, 10, 32); e != nil || l.err { - return &ParseError{f, "bad LOC Longitude", l} + return &ParseError{"", "bad LOC Longitude", l} } else { rr.Longitude = 1000 * 60 * 60 * uint32(i) } @@ -781,14 +638,14 @@ East: goto Altitude } if i, e := strconv.ParseUint(l.token, 10, 32); e != nil || l.err { - return &ParseError{f, "bad LOC Longitude minutes", l} + return &ParseError{"", "bad LOC Longitude minutes", l} } else { rr.Longitude += 1000 * 60 * uint32(i) } c.Next() // zBlank l, _ = c.Next() if i, e := strconv.ParseFloat(l.token, 32); e != nil || l.err { - return &ParseError{f, "bad LOC Longitude seconds", l} + return &ParseError{"", "bad LOC Longitude seconds", l} } else { rr.Longitude += uint32(1000 * i) } @@ -799,19 +656,19 @@ East: goto Altitude } // If still alive, flag an error - return &ParseError{f, "bad LOC Longitude East/West", l} + return &ParseError{"", "bad LOC Longitude East/West", l} Altitude: c.Next() // zBlank l, _ = c.Next() if len(l.token) == 0 || l.err { - return &ParseError{f, "bad LOC Altitude", l} + return &ParseError{"", "bad LOC Altitude", l} } if l.token[len(l.token)-1] == 'M' || l.token[len(l.token)-1] == 'm' { l.token = l.token[0 : len(l.token)-1] } if i, e := strconv.ParseFloat(l.token, 32); e != nil { - return &ParseError{f, "bad LOC Altitude", l} + return &ParseError{"", "bad LOC Altitude", l} } else { rr.Altitude = uint32(i*100.0 + 10000000.0 + 0.5) } @@ -826,19 +683,19 @@ Altitude: case 0: // Size e, m, ok := stringToCm(l.token) if !ok { - return &ParseError{f, "bad LOC Size", l} + return &ParseError{"", "bad LOC Size", l} } rr.Size = e&0x0f | m<<4&0xf0 case 1: // HorizPre e, m, ok := stringToCm(l.token) if !ok { - return &ParseError{f, "bad LOC HorizPre", l} + return &ParseError{"", "bad LOC HorizPre", l} } rr.HorizPre = e&0x0f | m<<4&0xf0 case 2: // VertPre e, m, ok := stringToCm(l.token) if !ok { - return &ParseError{f, "bad LOC VertPre", l} + return &ParseError{"", "bad LOC VertPre", l} } rr.VertPre = e&0x0f | m<<4&0xf0 } @@ -846,30 +703,26 @@ Altitude: case zBlank: // Ok default: - return &ParseError{f, "bad LOC Size, HorizPre or VertPre", l} + return &ParseError{"", "bad LOC Size, HorizPre or VertPre", l} } l, _ = c.Next() } return nil } -func (rr *HIP) parse(c *zlexer, o, f string) *ParseError { +func (rr *HIP) parse(c *zlexer, o string) *ParseError { // HitLength is not represented l, _ := c.Next() - if len(l.token) == 0 { // dynamic update rr. - return nil - } - i, e := strconv.ParseUint(l.token, 10, 8) if e != nil || l.err { - return &ParseError{f, "bad HIP PublicKeyAlgorithm", l} + return &ParseError{"", "bad HIP PublicKeyAlgorithm", l} } rr.PublicKeyAlgorithm = uint8(i) c.Next() // zBlank l, _ = c.Next() // zString if len(l.token) == 0 || l.err { - return &ParseError{f, "bad HIP Hit", l} + return &ParseError{"", "bad HIP Hit", l} } rr.Hit = l.token // This can not contain spaces, see RFC 5205 Section 6. rr.HitLength = uint8(len(rr.Hit)) / 2 @@ -877,7 +730,7 @@ func (rr *HIP) parse(c *zlexer, o, f string) *ParseError { c.Next() // zBlank l, _ = c.Next() // zString if len(l.token) == 0 || l.err { - return &ParseError{f, "bad HIP PublicKey", l} + return &ParseError{"", "bad HIP PublicKey", l} } rr.PublicKey = l.token // This cannot contain spaces rr.PublicKeyLength = uint16(base64.StdEncoding.DecodedLen(len(rr.PublicKey))) @@ -890,13 +743,13 @@ func (rr *HIP) parse(c *zlexer, o, f string) *ParseError { case zString: name, nameOk := toAbsoluteName(l.token, o) if l.err || !nameOk { - return &ParseError{f, "bad HIP RendezvousServers", l} + return &ParseError{"", "bad HIP RendezvousServers", l} } xs = append(xs, name) case zBlank: // Ok default: - return &ParseError{f, "bad HIP RendezvousServers", l} + return &ParseError{"", "bad HIP RendezvousServers", l} } l, _ = c.Next() } @@ -905,16 +758,12 @@ func (rr *HIP) parse(c *zlexer, o, f string) *ParseError { return nil } -func (rr *CERT) parse(c *zlexer, o, f string) *ParseError { +func (rr *CERT) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - if len(l.token) == 0 { // dynamic update rr. - return nil - } - if v, ok := StringToCertType[l.token]; ok { rr.Type = v } else if i, e := strconv.ParseUint(l.token, 10, 16); e != nil { - return &ParseError{f, "bad CERT Type", l} + return &ParseError{"", "bad CERT Type", l} } else { rr.Type = uint16(i) } @@ -922,7 +771,7 @@ func (rr *CERT) parse(c *zlexer, o, f string) *ParseError { l, _ = c.Next() // zString i, e := strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { - return &ParseError{f, "bad CERT KeyTag", l} + return &ParseError{"", "bad CERT KeyTag", l} } rr.KeyTag = uint16(i) c.Next() // zBlank @@ -930,11 +779,11 @@ func (rr *CERT) parse(c *zlexer, o, f string) *ParseError { if v, ok := StringToAlgorithm[l.token]; ok { rr.Algorithm = v } else if i, e := strconv.ParseUint(l.token, 10, 8); e != nil { - return &ParseError{f, "bad CERT Algorithm", l} + return &ParseError{"", "bad CERT Algorithm", l} } else { rr.Algorithm = uint8(i) } - s, e1 := endingToString(c, "bad CERT Certificate", f) + s, e1 := endingToString(c, "bad CERT Certificate") if e1 != nil { return e1 } @@ -942,8 +791,8 @@ func (rr *CERT) parse(c *zlexer, o, f string) *ParseError { return nil } -func (rr *OPENPGPKEY) parse(c *zlexer, o, f string) *ParseError { - s, e := endingToString(c, "bad OPENPGPKEY PublicKey", f) +func (rr *OPENPGPKEY) parse(c *zlexer, o string) *ParseError { + s, e := endingToString(c, "bad OPENPGPKEY PublicKey") if e != nil { return e } @@ -951,15 +800,12 @@ func (rr *OPENPGPKEY) parse(c *zlexer, o, f string) *ParseError { return nil } -func (rr *CSYNC) parse(c *zlexer, o, f string) *ParseError { +func (rr *CSYNC) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - if len(l.token) == 0 { // dynamic update rr. - return nil - } j, e := strconv.ParseUint(l.token, 10, 32) if e != nil { // Serial must be a number - return &ParseError{f, "bad CSYNC serial", l} + return &ParseError{"", "bad CSYNC serial", l} } rr.Serial = uint32(j) @@ -969,7 +815,7 @@ func (rr *CSYNC) parse(c *zlexer, o, f string) *ParseError { j, e = strconv.ParseUint(l.token, 10, 16) if e != nil { // Serial must be a number - return &ParseError{f, "bad CSYNC flags", l} + return &ParseError{"", "bad CSYNC flags", l} } rr.Flags = uint16(j) @@ -987,38 +833,34 @@ func (rr *CSYNC) parse(c *zlexer, o, f string) *ParseError { tokenUpper := strings.ToUpper(l.token) if k, ok = StringToType[tokenUpper]; !ok { if k, ok = typeToInt(l.token); !ok { - return &ParseError{f, "bad CSYNC TypeBitMap", l} + return &ParseError{"", "bad CSYNC TypeBitMap", l} } } rr.TypeBitMap = append(rr.TypeBitMap, k) default: - return &ParseError{f, "bad CSYNC TypeBitMap", l} + return &ParseError{"", "bad CSYNC TypeBitMap", l} } l, _ = c.Next() } return nil } -func (rr *SIG) parse(c *zlexer, o, f string) *ParseError { - return rr.RRSIG.parse(c, o, f) +func (rr *SIG) parse(c *zlexer, o string) *ParseError { + return rr.RRSIG.parse(c, o) } -func (rr *RRSIG) parse(c *zlexer, o, f string) *ParseError { +func (rr *RRSIG) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - if len(l.token) == 0 { // dynamic update rr. - return nil - } - tokenUpper := strings.ToUpper(l.token) if t, ok := StringToType[tokenUpper]; !ok { if strings.HasPrefix(tokenUpper, "TYPE") { t, ok = typeToInt(l.token) if !ok { - return &ParseError{f, "bad RRSIG Typecovered", l} + return &ParseError{"", "bad RRSIG Typecovered", l} } rr.TypeCovered = t } else { - return &ParseError{f, "bad RRSIG Typecovered", l} + return &ParseError{"", "bad RRSIG Typecovered", l} } } else { rr.TypeCovered = t @@ -1028,7 +870,7 @@ func (rr *RRSIG) parse(c *zlexer, o, f string) *ParseError { l, _ = c.Next() i, err := strconv.ParseUint(l.token, 10, 8) if err != nil || l.err { - return &ParseError{f, "bad RRSIG Algorithm", l} + return &ParseError{"", "bad RRSIG Algorithm", l} } rr.Algorithm = uint8(i) @@ -1036,7 +878,7 @@ func (rr *RRSIG) parse(c *zlexer, o, f string) *ParseError { l, _ = c.Next() i, err = strconv.ParseUint(l.token, 10, 8) if err != nil || l.err { - return &ParseError{f, "bad RRSIG Labels", l} + return &ParseError{"", "bad RRSIG Labels", l} } rr.Labels = uint8(i) @@ -1044,7 +886,7 @@ func (rr *RRSIG) parse(c *zlexer, o, f string) *ParseError { l, _ = c.Next() i, err = strconv.ParseUint(l.token, 10, 32) if err != nil || l.err { - return &ParseError{f, "bad RRSIG OrigTtl", l} + return &ParseError{"", "bad RRSIG OrigTtl", l} } rr.OrigTtl = uint32(i) @@ -1056,7 +898,7 @@ func (rr *RRSIG) parse(c *zlexer, o, f string) *ParseError { // TODO(miek): error out on > MAX_UINT32, same below rr.Expiration = uint32(i) } else { - return &ParseError{f, "bad RRSIG Expiration", l} + return &ParseError{"", "bad RRSIG Expiration", l} } } else { rr.Expiration = i @@ -1068,7 +910,7 @@ func (rr *RRSIG) parse(c *zlexer, o, f string) *ParseError { if i, err := strconv.ParseInt(l.token, 10, 64); err == nil { rr.Inception = uint32(i) } else { - return &ParseError{f, "bad RRSIG Inception", l} + return &ParseError{"", "bad RRSIG Inception", l} } } else { rr.Inception = i @@ -1078,7 +920,7 @@ func (rr *RRSIG) parse(c *zlexer, o, f string) *ParseError { l, _ = c.Next() i, err = strconv.ParseUint(l.token, 10, 16) if err != nil || l.err { - return &ParseError{f, "bad RRSIG KeyTag", l} + return &ParseError{"", "bad RRSIG KeyTag", l} } rr.KeyTag = uint16(i) @@ -1087,11 +929,11 @@ func (rr *RRSIG) parse(c *zlexer, o, f string) *ParseError { rr.SignerName = l.token name, nameOk := toAbsoluteName(l.token, o) if l.err || !nameOk { - return &ParseError{f, "bad RRSIG SignerName", l} + return &ParseError{"", "bad RRSIG SignerName", l} } rr.SignerName = name - s, e := endingToString(c, "bad RRSIG Signature", f) + s, e := endingToString(c, "bad RRSIG Signature") if e != nil { return e } @@ -1100,16 +942,11 @@ func (rr *RRSIG) parse(c *zlexer, o, f string) *ParseError { return nil } -func (rr *NSEC) parse(c *zlexer, o, f string) *ParseError { +func (rr *NSEC) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - rr.NextDomain = l.token - if len(l.token) == 0 { // dynamic update rr. - return nil - } - name, nameOk := toAbsoluteName(l.token, o) if l.err || !nameOk { - return &ParseError{f, "bad NSEC NextDomain", l} + return &ParseError{"", "bad NSEC NextDomain", l} } rr.NextDomain = name @@ -1127,47 +964,43 @@ func (rr *NSEC) parse(c *zlexer, o, f string) *ParseError { tokenUpper := strings.ToUpper(l.token) if k, ok = StringToType[tokenUpper]; !ok { if k, ok = typeToInt(l.token); !ok { - return &ParseError{f, "bad NSEC TypeBitMap", l} + return &ParseError{"", "bad NSEC TypeBitMap", l} } } rr.TypeBitMap = append(rr.TypeBitMap, k) default: - return &ParseError{f, "bad NSEC TypeBitMap", l} + return &ParseError{"", "bad NSEC TypeBitMap", l} } l, _ = c.Next() } return nil } -func (rr *NSEC3) parse(c *zlexer, o, f string) *ParseError { +func (rr *NSEC3) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - if len(l.token) == 0 { // dynamic update rr. - return nil - } - i, e := strconv.ParseUint(l.token, 10, 8) if e != nil || l.err { - return &ParseError{f, "bad NSEC3 Hash", l} + return &ParseError{"", "bad NSEC3 Hash", l} } rr.Hash = uint8(i) c.Next() // zBlank l, _ = c.Next() i, e = strconv.ParseUint(l.token, 10, 8) if e != nil || l.err { - return &ParseError{f, "bad NSEC3 Flags", l} + return &ParseError{"", "bad NSEC3 Flags", l} } rr.Flags = uint8(i) c.Next() // zBlank l, _ = c.Next() i, e = strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { - return &ParseError{f, "bad NSEC3 Iterations", l} + return &ParseError{"", "bad NSEC3 Iterations", l} } rr.Iterations = uint16(i) c.Next() l, _ = c.Next() if len(l.token) == 0 || l.err { - return &ParseError{f, "bad NSEC3 Salt", l} + return &ParseError{"", "bad NSEC3 Salt", l} } if l.token != "-" { rr.SaltLength = uint8(len(l.token)) / 2 @@ -1177,7 +1010,7 @@ func (rr *NSEC3) parse(c *zlexer, o, f string) *ParseError { c.Next() l, _ = c.Next() if len(l.token) == 0 || l.err { - return &ParseError{f, "bad NSEC3 NextDomain", l} + return &ParseError{"", "bad NSEC3 NextDomain", l} } rr.HashLength = 20 // Fix for NSEC3 (sha1 160 bits) rr.NextDomain = l.token @@ -1196,41 +1029,37 @@ func (rr *NSEC3) parse(c *zlexer, o, f string) *ParseError { tokenUpper := strings.ToUpper(l.token) if k, ok = StringToType[tokenUpper]; !ok { if k, ok = typeToInt(l.token); !ok { - return &ParseError{f, "bad NSEC3 TypeBitMap", l} + return &ParseError{"", "bad NSEC3 TypeBitMap", l} } } rr.TypeBitMap = append(rr.TypeBitMap, k) default: - return &ParseError{f, "bad NSEC3 TypeBitMap", l} + return &ParseError{"", "bad NSEC3 TypeBitMap", l} } l, _ = c.Next() } return nil } -func (rr *NSEC3PARAM) parse(c *zlexer, o, f string) *ParseError { +func (rr *NSEC3PARAM) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - if len(l.token) == 0 { // dynamic update rr. - return slurpRemainder(c, f) - } - i, e := strconv.ParseUint(l.token, 10, 8) if e != nil || l.err { - return &ParseError{f, "bad NSEC3PARAM Hash", l} + return &ParseError{"", "bad NSEC3PARAM Hash", l} } rr.Hash = uint8(i) c.Next() // zBlank l, _ = c.Next() i, e = strconv.ParseUint(l.token, 10, 8) if e != nil || l.err { - return &ParseError{f, "bad NSEC3PARAM Flags", l} + return &ParseError{"", "bad NSEC3PARAM Flags", l} } rr.Flags = uint8(i) c.Next() // zBlank l, _ = c.Next() i, e = strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { - return &ParseError{f, "bad NSEC3PARAM Iterations", l} + return &ParseError{"", "bad NSEC3PARAM Iterations", l} } rr.Iterations = uint16(i) c.Next() @@ -1239,17 +1068,13 @@ func (rr *NSEC3PARAM) parse(c *zlexer, o, f string) *ParseError { rr.SaltLength = uint8(len(l.token)) rr.Salt = l.token } - return slurpRemainder(c, f) + return slurpRemainder(c) } -func (rr *EUI48) parse(c *zlexer, o, f string) *ParseError { +func (rr *EUI48) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - if len(l.token) == 0 { // dynamic update rr. - return slurpRemainder(c, f) - } - if len(l.token) != 17 || l.err { - return &ParseError{f, "bad EUI48 Address", l} + return &ParseError{"", "bad EUI48 Address", l} } addr := make([]byte, 12) dash := 0 @@ -1258,7 +1083,7 @@ func (rr *EUI48) parse(c *zlexer, o, f string) *ParseError { addr[i+1] = l.token[i+1+dash] dash++ if l.token[i+1+dash] != '-' { - return &ParseError{f, "bad EUI48 Address", l} + return &ParseError{"", "bad EUI48 Address", l} } } addr[10] = l.token[15] @@ -1266,20 +1091,16 @@ func (rr *EUI48) parse(c *zlexer, o, f string) *ParseError { i, e := strconv.ParseUint(string(addr), 16, 48) if e != nil { - return &ParseError{f, "bad EUI48 Address", l} + return &ParseError{"", "bad EUI48 Address", l} } rr.Address = i - return slurpRemainder(c, f) + return slurpRemainder(c) } -func (rr *EUI64) parse(c *zlexer, o, f string) *ParseError { +func (rr *EUI64) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - if len(l.token) == 0 { // dynamic update rr. - return slurpRemainder(c, f) - } - if len(l.token) != 23 || l.err { - return &ParseError{f, "bad EUI64 Address", l} + return &ParseError{"", "bad EUI64 Address", l} } addr := make([]byte, 16) dash := 0 @@ -1288,7 +1109,7 @@ func (rr *EUI64) parse(c *zlexer, o, f string) *ParseError { addr[i+1] = l.token[i+1+dash] dash++ if l.token[i+1+dash] != '-' { - return &ParseError{f, "bad EUI64 Address", l} + return &ParseError{"", "bad EUI64 Address", l} } } addr[14] = l.token[21] @@ -1296,32 +1117,28 @@ func (rr *EUI64) parse(c *zlexer, o, f string) *ParseError { i, e := strconv.ParseUint(string(addr), 16, 64) if e != nil { - return &ParseError{f, "bad EUI68 Address", l} + return &ParseError{"", "bad EUI68 Address", l} } rr.Address = i - return slurpRemainder(c, f) + return slurpRemainder(c) } -func (rr *SSHFP) parse(c *zlexer, o, f string) *ParseError { +func (rr *SSHFP) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - if len(l.token) == 0 { // dynamic update rr. - return nil - } - i, e := strconv.ParseUint(l.token, 10, 8) if e != nil || l.err { - return &ParseError{f, "bad SSHFP Algorithm", l} + return &ParseError{"", "bad SSHFP Algorithm", l} } rr.Algorithm = uint8(i) c.Next() // zBlank l, _ = c.Next() i, e = strconv.ParseUint(l.token, 10, 8) if e != nil || l.err { - return &ParseError{f, "bad SSHFP Type", l} + return &ParseError{"", "bad SSHFP Type", l} } rr.Type = uint8(i) c.Next() // zBlank - s, e1 := endingToString(c, "bad SSHFP Fingerprint", f) + s, e1 := endingToString(c, "bad SSHFP Fingerprint") if e1 != nil { return e1 } @@ -1329,32 +1146,28 @@ func (rr *SSHFP) parse(c *zlexer, o, f string) *ParseError { return nil } -func (rr *DNSKEY) parseDNSKEY(c *zlexer, o, f, typ string) *ParseError { +func (rr *DNSKEY) parseDNSKEY(c *zlexer, o, typ string) *ParseError { l, _ := c.Next() - if len(l.token) == 0 { // dynamic update rr. - return nil - } - i, e := strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { - return &ParseError{f, "bad " + typ + " Flags", l} + return &ParseError{"", "bad " + typ + " Flags", l} } rr.Flags = uint16(i) c.Next() // zBlank l, _ = c.Next() // zString i, e = strconv.ParseUint(l.token, 10, 8) if e != nil || l.err { - return &ParseError{f, "bad " + typ + " Protocol", l} + return &ParseError{"", "bad " + typ + " Protocol", l} } rr.Protocol = uint8(i) c.Next() // zBlank l, _ = c.Next() // zString i, e = strconv.ParseUint(l.token, 10, 8) if e != nil || l.err { - return &ParseError{f, "bad " + typ + " Algorithm", l} + return &ParseError{"", "bad " + typ + " Algorithm", l} } rr.Algorithm = uint8(i) - s, e1 := endingToString(c, "bad "+typ+" PublicKey", f) + s, e1 := endingToString(c, "bad "+typ+" PublicKey") if e1 != nil { return e1 } @@ -1362,44 +1175,40 @@ func (rr *DNSKEY) parseDNSKEY(c *zlexer, o, f, typ string) *ParseError { return nil } -func (rr *DNSKEY) parse(c *zlexer, o, f string) *ParseError { - return rr.parseDNSKEY(c, o, f, "DNSKEY") +func (rr *DNSKEY) parse(c *zlexer, o string) *ParseError { + return rr.parseDNSKEY(c, o, "DNSKEY") } -func (rr *KEY) parse(c *zlexer, o, f string) *ParseError { - return rr.parseDNSKEY(c, o, f, "KEY") +func (rr *KEY) parse(c *zlexer, o string) *ParseError { + return rr.parseDNSKEY(c, o, "KEY") } -func (rr *CDNSKEY) parse(c *zlexer, o, f string) *ParseError { - return rr.parseDNSKEY(c, o, f, "CDNSKEY") +func (rr *CDNSKEY) parse(c *zlexer, o string) *ParseError { + return rr.parseDNSKEY(c, o, "CDNSKEY") } -func (rr *RKEY) parse(c *zlexer, o, f string) *ParseError { +func (rr *RKEY) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - if len(l.token) == 0 { // dynamic update rr. - return nil - } - i, e := strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { - return &ParseError{f, "bad RKEY Flags", l} + return &ParseError{"", "bad RKEY Flags", l} } rr.Flags = uint16(i) c.Next() // zBlank l, _ = c.Next() // zString i, e = strconv.ParseUint(l.token, 10, 8) if e != nil || l.err { - return &ParseError{f, "bad RKEY Protocol", l} + return &ParseError{"", "bad RKEY Protocol", l} } rr.Protocol = uint8(i) c.Next() // zBlank l, _ = c.Next() // zString i, e = strconv.ParseUint(l.token, 10, 8) if e != nil || l.err { - return &ParseError{f, "bad RKEY Algorithm", l} + return &ParseError{"", "bad RKEY Algorithm", l} } rr.Algorithm = uint8(i) - s, e1 := endingToString(c, "bad RKEY PublicKey", f) + s, e1 := endingToString(c, "bad RKEY PublicKey") if e1 != nil { return e1 } @@ -1407,8 +1216,8 @@ func (rr *RKEY) parse(c *zlexer, o, f string) *ParseError { return nil } -func (rr *EID) parse(c *zlexer, o, f string) *ParseError { - s, e := endingToString(c, "bad EID Endpoint", f) +func (rr *EID) parse(c *zlexer, o string) *ParseError { + s, e := endingToString(c, "bad EID Endpoint") if e != nil { return e } @@ -1416,8 +1225,8 @@ func (rr *EID) parse(c *zlexer, o, f string) *ParseError { return nil } -func (rr *NIMLOC) parse(c *zlexer, o, f string) *ParseError { - s, e := endingToString(c, "bad NIMLOC Locator", f) +func (rr *NIMLOC) parse(c *zlexer, o string) *ParseError { + s, e := endingToString(c, "bad NIMLOC Locator") if e != nil { return e } @@ -1425,43 +1234,35 @@ func (rr *NIMLOC) parse(c *zlexer, o, f string) *ParseError { return nil } -func (rr *GPOS) parse(c *zlexer, o, f string) *ParseError { +func (rr *GPOS) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - if len(l.token) == 0 { // dynamic update rr. - return slurpRemainder(c, f) - } - _, e := strconv.ParseFloat(l.token, 64) if e != nil || l.err { - return &ParseError{f, "bad GPOS Longitude", l} + return &ParseError{"", "bad GPOS Longitude", l} } rr.Longitude = l.token c.Next() // zBlank l, _ = c.Next() _, e = strconv.ParseFloat(l.token, 64) if e != nil || l.err { - return &ParseError{f, "bad GPOS Latitude", l} + return &ParseError{"", "bad GPOS Latitude", l} } rr.Latitude = l.token c.Next() // zBlank l, _ = c.Next() _, e = strconv.ParseFloat(l.token, 64) if e != nil || l.err { - return &ParseError{f, "bad GPOS Altitude", l} + return &ParseError{"", "bad GPOS Altitude", l} } rr.Altitude = l.token - return slurpRemainder(c, f) + return slurpRemainder(c) } -func (rr *DS) parseDS(c *zlexer, o, f, typ string) *ParseError { +func (rr *DS) parseDS(c *zlexer, o, typ string) *ParseError { l, _ := c.Next() - if len(l.token) == 0 { // dynamic update rr. - return nil - } - i, e := strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { - return &ParseError{f, "bad " + typ + " KeyTag", l} + return &ParseError{"", "bad " + typ + " KeyTag", l} } rr.KeyTag = uint16(i) c.Next() // zBlank @@ -1470,7 +1271,7 @@ func (rr *DS) parseDS(c *zlexer, o, f, typ string) *ParseError { tokenUpper := strings.ToUpper(l.token) i, ok := StringToAlgorithm[tokenUpper] if !ok || l.err { - return &ParseError{f, "bad " + typ + " Algorithm", l} + return &ParseError{"", "bad " + typ + " Algorithm", l} } rr.Algorithm = i } else { @@ -1480,10 +1281,10 @@ func (rr *DS) parseDS(c *zlexer, o, f, typ string) *ParseError { l, _ = c.Next() i, e = strconv.ParseUint(l.token, 10, 8) if e != nil || l.err { - return &ParseError{f, "bad " + typ + " DigestType", l} + return &ParseError{"", "bad " + typ + " DigestType", l} } rr.DigestType = uint8(i) - s, e1 := endingToString(c, "bad "+typ+" Digest", f) + s, e1 := endingToString(c, "bad "+typ+" Digest") if e1 != nil { return e1 } @@ -1491,27 +1292,23 @@ func (rr *DS) parseDS(c *zlexer, o, f, typ string) *ParseError { return nil } -func (rr *DS) parse(c *zlexer, o, f string) *ParseError { - return rr.parseDS(c, o, f, "DS") +func (rr *DS) parse(c *zlexer, o string) *ParseError { + return rr.parseDS(c, o, "DS") } -func (rr *DLV) parse(c *zlexer, o, f string) *ParseError { - return rr.parseDS(c, o, f, "DLV") +func (rr *DLV) parse(c *zlexer, o string) *ParseError { + return rr.parseDS(c, o, "DLV") } -func (rr *CDS) parse(c *zlexer, o, f string) *ParseError { - return rr.parseDS(c, o, f, "CDS") +func (rr *CDS) parse(c *zlexer, o string) *ParseError { + return rr.parseDS(c, o, "CDS") } -func (rr *TA) parse(c *zlexer, o, f string) *ParseError { +func (rr *TA) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - if len(l.token) == 0 { // dynamic update rr. - return nil - } - i, e := strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { - return &ParseError{f, "bad TA KeyTag", l} + return &ParseError{"", "bad TA KeyTag", l} } rr.KeyTag = uint16(i) c.Next() // zBlank @@ -1520,7 +1317,7 @@ func (rr *TA) parse(c *zlexer, o, f string) *ParseError { tokenUpper := strings.ToUpper(l.token) i, ok := StringToAlgorithm[tokenUpper] if !ok || l.err { - return &ParseError{f, "bad TA Algorithm", l} + return &ParseError{"", "bad TA Algorithm", l} } rr.Algorithm = i } else { @@ -1530,10 +1327,10 @@ func (rr *TA) parse(c *zlexer, o, f string) *ParseError { l, _ = c.Next() i, e = strconv.ParseUint(l.token, 10, 8) if e != nil || l.err { - return &ParseError{f, "bad TA DigestType", l} + return &ParseError{"", "bad TA DigestType", l} } rr.DigestType = uint8(i) - s, err := endingToString(c, "bad TA Digest", f) + s, err := endingToString(c, "bad TA Digest") if err != nil { return err } @@ -1541,33 +1338,29 @@ func (rr *TA) parse(c *zlexer, o, f string) *ParseError { return nil } -func (rr *TLSA) parse(c *zlexer, o, f string) *ParseError { +func (rr *TLSA) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - if len(l.token) == 0 { // dynamic update rr. - return nil - } - i, e := strconv.ParseUint(l.token, 10, 8) if e != nil || l.err { - return &ParseError{f, "bad TLSA Usage", l} + return &ParseError{"", "bad TLSA Usage", l} } rr.Usage = uint8(i) c.Next() // zBlank l, _ = c.Next() i, e = strconv.ParseUint(l.token, 10, 8) if e != nil || l.err { - return &ParseError{f, "bad TLSA Selector", l} + return &ParseError{"", "bad TLSA Selector", l} } rr.Selector = uint8(i) c.Next() // zBlank l, _ = c.Next() i, e = strconv.ParseUint(l.token, 10, 8) if e != nil || l.err { - return &ParseError{f, "bad TLSA MatchingType", l} + return &ParseError{"", "bad TLSA MatchingType", l} } rr.MatchingType = uint8(i) // So this needs be e2 (i.e. different than e), because...??t - s, e2 := endingToString(c, "bad TLSA Certificate", f) + s, e2 := endingToString(c, "bad TLSA Certificate") if e2 != nil { return e2 } @@ -1575,33 +1368,29 @@ func (rr *TLSA) parse(c *zlexer, o, f string) *ParseError { return nil } -func (rr *SMIMEA) parse(c *zlexer, o, f string) *ParseError { +func (rr *SMIMEA) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - if len(l.token) == 0 { // dynamic update rr. - return nil - } - i, e := strconv.ParseUint(l.token, 10, 8) if e != nil || l.err { - return &ParseError{f, "bad SMIMEA Usage", l} + return &ParseError{"", "bad SMIMEA Usage", l} } rr.Usage = uint8(i) c.Next() // zBlank l, _ = c.Next() i, e = strconv.ParseUint(l.token, 10, 8) if e != nil || l.err { - return &ParseError{f, "bad SMIMEA Selector", l} + return &ParseError{"", "bad SMIMEA Selector", l} } rr.Selector = uint8(i) c.Next() // zBlank l, _ = c.Next() i, e = strconv.ParseUint(l.token, 10, 8) if e != nil || l.err { - return &ParseError{f, "bad SMIMEA MatchingType", l} + return &ParseError{"", "bad SMIMEA MatchingType", l} } rr.MatchingType = uint8(i) // So this needs be e2 (i.e. different than e), because...??t - s, e2 := endingToString(c, "bad SMIMEA Certificate", f) + s, e2 := endingToString(c, "bad SMIMEA Certificate") if e2 != nil { return e2 } @@ -1609,32 +1398,32 @@ func (rr *SMIMEA) parse(c *zlexer, o, f string) *ParseError { return nil } -func (rr *RFC3597) parse(c *zlexer, o, f string) *ParseError { +func (rr *RFC3597) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() if l.token != "\\#" { - return &ParseError{f, "bad RFC3597 Rdata", l} + return &ParseError{"", "bad RFC3597 Rdata", l} } c.Next() // zBlank l, _ = c.Next() rdlength, e := strconv.Atoi(l.token) if e != nil || l.err { - return &ParseError{f, "bad RFC3597 Rdata ", l} + return &ParseError{"", "bad RFC3597 Rdata ", l} } - s, e1 := endingToString(c, "bad RFC3597 Rdata", f) + s, e1 := endingToString(c, "bad RFC3597 Rdata") if e1 != nil { return e1 } if rdlength*2 != len(s) { - return &ParseError{f, "bad RFC3597 Rdata", l} + return &ParseError{"", "bad RFC3597 Rdata", l} } rr.Rdata = s return nil } -func (rr *SPF) parse(c *zlexer, o, f string) *ParseError { - s, e := endingToTxtSlice(c, "bad SPF Txt", f) +func (rr *SPF) parse(c *zlexer, o string) *ParseError { + s, e := endingToTxtSlice(c, "bad SPF Txt") if e != nil { return e } @@ -1642,8 +1431,8 @@ func (rr *SPF) parse(c *zlexer, o, f string) *ParseError { return nil } -func (rr *AVC) parse(c *zlexer, o, f string) *ParseError { - s, e := endingToTxtSlice(c, "bad AVC Txt", f) +func (rr *AVC) parse(c *zlexer, o string) *ParseError { + s, e := endingToTxtSlice(c, "bad AVC Txt") if e != nil { return e } @@ -1651,9 +1440,9 @@ func (rr *AVC) parse(c *zlexer, o, f string) *ParseError { return nil } -func (rr *TXT) parse(c *zlexer, o, f string) *ParseError { +func (rr *TXT) parse(c *zlexer, o string) *ParseError { // no zBlank reading here, because all this rdata is TXT - s, e := endingToTxtSlice(c, "bad TXT Txt", f) + s, e := endingToTxtSlice(c, "bad TXT Txt") if e != nil { return e } @@ -1662,8 +1451,8 @@ func (rr *TXT) parse(c *zlexer, o, f string) *ParseError { } // identical to setTXT -func (rr *NINFO) parse(c *zlexer, o, f string) *ParseError { - s, e := endingToTxtSlice(c, "bad NINFO ZSData", f) +func (rr *NINFO) parse(c *zlexer, o string) *ParseError { + s, e := endingToTxtSlice(c, "bad NINFO ZSData") if e != nil { return e } @@ -1671,40 +1460,36 @@ func (rr *NINFO) parse(c *zlexer, o, f string) *ParseError { return nil } -func (rr *URI) parse(c *zlexer, o, f string) *ParseError { +func (rr *URI) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - if len(l.token) == 0 { // dynamic update rr. - return nil - } - i, e := strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { - return &ParseError{f, "bad URI Priority", l} + return &ParseError{"", "bad URI Priority", l} } rr.Priority = uint16(i) c.Next() // zBlank l, _ = c.Next() i, e = strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { - return &ParseError{f, "bad URI Weight", l} + return &ParseError{"", "bad URI Weight", l} } rr.Weight = uint16(i) c.Next() // zBlank - s, err := endingToTxtSlice(c, "bad URI Target", f) + s, err := endingToTxtSlice(c, "bad URI Target") if err != nil { return err } if len(s) != 1 { - return &ParseError{f, "bad URI Target", l} + return &ParseError{"", "bad URI Target", l} } rr.Target = s[0] return nil } -func (rr *DHCID) parse(c *zlexer, o, f string) *ParseError { +func (rr *DHCID) parse(c *zlexer, o string) *ParseError { // awesome record to parse! - s, e := endingToString(c, "bad DHCID Digest", f) + s, e := endingToString(c, "bad DHCID Digest") if e != nil { return e } @@ -1712,15 +1497,11 @@ func (rr *DHCID) parse(c *zlexer, o, f string) *ParseError { return nil } -func (rr *NID) parse(c *zlexer, o, f string) *ParseError { +func (rr *NID) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - if len(l.token) == 0 { // dynamic update rr. - return slurpRemainder(c, f) - } - i, e := strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { - return &ParseError{f, "bad NID Preference", l} + return &ParseError{"", "bad NID Preference", l} } rr.Preference = uint16(i) c.Next() // zBlank @@ -1730,38 +1511,30 @@ func (rr *NID) parse(c *zlexer, o, f string) *ParseError { return err } rr.NodeID = u - return slurpRemainder(c, f) + return slurpRemainder(c) } -func (rr *L32) parse(c *zlexer, o, f string) *ParseError { +func (rr *L32) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - if len(l.token) == 0 { // dynamic update rr. - return slurpRemainder(c, f) - } - i, e := strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { - return &ParseError{f, "bad L32 Preference", l} + return &ParseError{"", "bad L32 Preference", l} } rr.Preference = uint16(i) c.Next() // zBlank l, _ = c.Next() // zString rr.Locator32 = net.ParseIP(l.token) if rr.Locator32 == nil || l.err { - return &ParseError{f, "bad L32 Locator", l} + return &ParseError{"", "bad L32 Locator", l} } - return slurpRemainder(c, f) + return slurpRemainder(c) } -func (rr *LP) parse(c *zlexer, o, f string) *ParseError { +func (rr *LP) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - if len(l.token) == 0 { // dynamic update rr. - return slurpRemainder(c, f) - } - i, e := strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { - return &ParseError{f, "bad LP Preference", l} + return &ParseError{"", "bad LP Preference", l} } rr.Preference = uint16(i) @@ -1770,22 +1543,18 @@ func (rr *LP) parse(c *zlexer, o, f string) *ParseError { rr.Fqdn = l.token name, nameOk := toAbsoluteName(l.token, o) if l.err || !nameOk { - return &ParseError{f, "bad LP Fqdn", l} + return &ParseError{"", "bad LP Fqdn", l} } rr.Fqdn = name - return slurpRemainder(c, f) + return slurpRemainder(c) } -func (rr *L64) parse(c *zlexer, o, f string) *ParseError { +func (rr *L64) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - if len(l.token) == 0 { // dynamic update rr. - return slurpRemainder(c, f) - } - i, e := strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { - return &ParseError{f, "bad L64 Preference", l} + return &ParseError{"", "bad L64 Preference", l} } rr.Preference = uint16(i) c.Next() // zBlank @@ -1795,39 +1564,31 @@ func (rr *L64) parse(c *zlexer, o, f string) *ParseError { return err } rr.Locator64 = u - return slurpRemainder(c, f) + return slurpRemainder(c) } -func (rr *UID) parse(c *zlexer, o, f string) *ParseError { +func (rr *UID) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - if len(l.token) == 0 { // dynamic update rr. - return slurpRemainder(c, f) - } - i, e := strconv.ParseUint(l.token, 10, 32) if e != nil || l.err { - return &ParseError{f, "bad UID Uid", l} + return &ParseError{"", "bad UID Uid", l} } rr.Uid = uint32(i) - return slurpRemainder(c, f) + return slurpRemainder(c) } -func (rr *GID) parse(c *zlexer, o, f string) *ParseError { +func (rr *GID) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - if len(l.token) == 0 { // dynamic update rr. - return slurpRemainder(c, f) - } - i, e := strconv.ParseUint(l.token, 10, 32) if e != nil || l.err { - return &ParseError{f, "bad GID Gid", l} + return &ParseError{"", "bad GID Gid", l} } rr.Gid = uint32(i) - return slurpRemainder(c, f) + return slurpRemainder(c) } -func (rr *UINFO) parse(c *zlexer, o, f string) *ParseError { - s, e := endingToTxtSlice(c, "bad UINFO Uinfo", f) +func (rr *UINFO) parse(c *zlexer, o string) *ParseError { + s, e := endingToTxtSlice(c, "bad UINFO Uinfo") if e != nil { return e } @@ -1838,15 +1599,11 @@ func (rr *UINFO) parse(c *zlexer, o, f string) *ParseError { return nil } -func (rr *PX) parse(c *zlexer, o, f string) *ParseError { +func (rr *PX) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - if len(l.token) == 0 { // dynamic update rr. - return slurpRemainder(c, f) - } - i, e := strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { - return &ParseError{f, "bad PX Preference", l} + return &ParseError{"", "bad PX Preference", l} } rr.Preference = uint16(i) @@ -1855,7 +1612,7 @@ func (rr *PX) parse(c *zlexer, o, f string) *ParseError { rr.Map822 = l.token map822, map822Ok := toAbsoluteName(l.token, o) if l.err || !map822Ok { - return &ParseError{f, "bad PX Map822", l} + return &ParseError{"", "bad PX Map822", l} } rr.Map822 = map822 @@ -1864,50 +1621,46 @@ func (rr *PX) parse(c *zlexer, o, f string) *ParseError { rr.Mapx400 = l.token mapx400, mapx400Ok := toAbsoluteName(l.token, o) if l.err || !mapx400Ok { - return &ParseError{f, "bad PX Mapx400", l} + return &ParseError{"", "bad PX Mapx400", l} } rr.Mapx400 = mapx400 - return slurpRemainder(c, f) + return slurpRemainder(c) } -func (rr *CAA) parse(c *zlexer, o, f string) *ParseError { +func (rr *CAA) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - if len(l.token) == 0 { // dynamic update rr. - return nil - } - i, err := strconv.ParseUint(l.token, 10, 8) if err != nil || l.err { - return &ParseError{f, "bad CAA Flag", l} + return &ParseError{"", "bad CAA Flag", l} } rr.Flag = uint8(i) c.Next() // zBlank l, _ = c.Next() // zString if l.value != zString { - return &ParseError{f, "bad CAA Tag", l} + return &ParseError{"", "bad CAA Tag", l} } rr.Tag = l.token c.Next() // zBlank - s, e := endingToTxtSlice(c, "bad CAA Value", f) + s, e := endingToTxtSlice(c, "bad CAA Value") if e != nil { return e } if len(s) != 1 { - return &ParseError{f, "bad CAA Value", l} + return &ParseError{"", "bad CAA Value", l} } rr.Value = s[0] return nil } -func (rr *TKEY) parse(c *zlexer, o, f string) *ParseError { +func (rr *TKEY) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() // Algorithm if l.value != zString { - return &ParseError{f, "bad TKEY algorithm", l} + return &ParseError{"", "bad TKEY algorithm", l} } rr.Algorithm = l.token c.Next() // zBlank @@ -1916,13 +1669,13 @@ func (rr *TKEY) parse(c *zlexer, o, f string) *ParseError { l, _ = c.Next() i, err := strconv.ParseUint(l.token, 10, 8) if err != nil || l.err { - return &ParseError{f, "bad TKEY key length", l} + return &ParseError{"", "bad TKEY key length", l} } rr.KeySize = uint16(i) c.Next() // zBlank l, _ = c.Next() if l.value != zString { - return &ParseError{f, "bad TKEY key", l} + return &ParseError{"", "bad TKEY key", l} } rr.Key = l.token c.Next() // zBlank @@ -1931,13 +1684,13 @@ func (rr *TKEY) parse(c *zlexer, o, f string) *ParseError { l, _ = c.Next() i, err = strconv.ParseUint(l.token, 10, 8) if err != nil || l.err { - return &ParseError{f, "bad TKEY otherdata length", l} + return &ParseError{"", "bad TKEY otherdata length", l} } rr.OtherLen = uint16(i) c.Next() // zBlank l, _ = c.Next() if l.value != zString { - return &ParseError{f, "bad TKEY otherday", l} + return &ParseError{"", "bad TKEY otherday", l} } rr.OtherData = l.token diff --git a/vendor/github.com/miekg/dns/server.go b/vendor/github.com/miekg/dns/server.go index b09d3717..354f7712 100644 --- a/vendor/github.com/miekg/dns/server.go +++ b/vendor/github.com/miekg/dns/server.go @@ -571,15 +571,15 @@ func (srv *Server) serveDNS(m []byte, w *response) { req.SetRcodeFormatError(req) // Are we allowed to delete any OPT records here? req.Ns, req.Answer, req.Extra = nil, nil, nil + req.Zero = false w.WriteMsg(req) - + fallthrough + case MsgIgnore: if w.udp != nil && cap(m) == srv.UDPSize { srv.udpPool.Put(m[:srv.UDPSize]) } - return - case MsgIgnore: return } diff --git a/vendor/github.com/miekg/dns/tsig.go b/vendor/github.com/miekg/dns/tsig.go index afa462fa..2c4ef03b 100644 --- a/vendor/github.com/miekg/dns/tsig.go +++ b/vendor/github.com/miekg/dns/tsig.go @@ -54,7 +54,7 @@ func (rr *TSIG) String() string { return s } -func (rr *TSIG) parse(c *zlexer, origin, file string) *ParseError { +func (rr *TSIG) parse(c *zlexer, origin string) *ParseError { panic("dns: internal error: parse should never be called on TSIG") } diff --git a/vendor/github.com/miekg/dns/types.go b/vendor/github.com/miekg/dns/types.go index 835f2fe7..6f79038b 100644 --- a/vendor/github.com/miekg/dns/types.go +++ b/vendor/github.com/miekg/dns/types.go @@ -238,7 +238,7 @@ type ANY struct { func (rr *ANY) String() string { return rr.Hdr.String() } -func (rr *ANY) parse(c *zlexer, origin, file string) *ParseError { +func (rr *ANY) parse(c *zlexer, origin string) *ParseError { panic("dns: internal error: parse should never be called on ANY") } @@ -253,7 +253,7 @@ func (rr *NULL) String() string { return ";" + rr.Hdr.String() + rr.Data } -func (rr *NULL) parse(c *zlexer, origin, file string) *ParseError { +func (rr *NULL) parse(c *zlexer, origin string) *ParseError { panic("dns: internal error: parse should never be called on NULL") } @@ -854,14 +854,7 @@ func (rr *NSEC) String() string { func (rr *NSEC) len(off int, compression map[string]struct{}) int { l := rr.Hdr.len(off, compression) l += domainNameLen(rr.NextDomain, off+l, compression, false) - lastwindow := uint32(2 ^ 32 + 1) - for _, t := range rr.TypeBitMap { - window := t / 256 - if uint32(window) != lastwindow { - l += 1 + 32 - } - lastwindow = uint32(window) - } + l += typeBitMapLen(rr.TypeBitMap) return l } @@ -1020,14 +1013,7 @@ func (rr *NSEC3) String() string { func (rr *NSEC3) len(off int, compression map[string]struct{}) int { l := rr.Hdr.len(off, compression) l += 6 + len(rr.Salt)/2 + 1 + len(rr.NextDomain) + 1 - lastwindow := uint32(2 ^ 32 + 1) - for _, t := range rr.TypeBitMap { - window := t / 256 - if uint32(window) != lastwindow { - l += 1 + 32 - } - lastwindow = uint32(window) - } + l += typeBitMapLen(rr.TypeBitMap) return l } @@ -1344,14 +1330,7 @@ func (rr *CSYNC) String() string { func (rr *CSYNC) len(off int, compression map[string]struct{}) int { l := rr.Hdr.len(off, compression) l += 4 + 2 - lastwindow := uint32(2 ^ 32 + 1) - for _, t := range rr.TypeBitMap { - window := t / 256 - if uint32(window) != lastwindow { - l += 1 + 32 - } - lastwindow = uint32(window) - } + l += typeBitMapLen(rr.TypeBitMap) return l } diff --git a/vendor/github.com/miekg/dns/types_generate.go b/vendor/github.com/miekg/dns/types_generate.go index cbb4a00c..8cda2a74 100644 --- a/vendor/github.com/miekg/dns/types_generate.go +++ b/vendor/github.com/miekg/dns/types_generate.go @@ -189,10 +189,8 @@ func main() { o("l += base64.StdEncoding.DecodedLen(len(rr.%s))\n") case strings.HasPrefix(st.Tag(i), `dns:"size-hex:`): // this has an extra field where the length is stored o("l += len(rr.%s)/2\n") - case strings.HasPrefix(st.Tag(i), `dns:"size-hex`): - fallthrough case st.Tag(i) == `dns:"hex"`: - o("l += len(rr.%s)/2 + 1\n") + o("l += len(rr.%s)/2\n") case st.Tag(i) == `dns:"any"`: o("l += len(rr.%s)\n") case st.Tag(i) == `dns:"a"`: diff --git a/vendor/github.com/miekg/dns/version.go b/vendor/github.com/miekg/dns/version.go index 0e21bd6a..45f45e64 100644 --- a/vendor/github.com/miekg/dns/version.go +++ b/vendor/github.com/miekg/dns/version.go @@ -3,7 +3,7 @@ package dns import "fmt" // Version is current version of this library. -var Version = V{1, 1, 8} +var Version = V{1, 1, 14} // V holds the version of this library. type V struct { diff --git a/vendor/github.com/miekg/dns/xfr.go b/vendor/github.com/miekg/dns/xfr.go index 82afc52e..bb4ca3d8 100644 --- a/vendor/github.com/miekg/dns/xfr.go +++ b/vendor/github.com/miekg/dns/xfr.go @@ -198,11 +198,14 @@ func (t *Transfer) Out(w ResponseWriter, q *Msg, ch chan *Envelope) error { r.Authoritative = true // assume it fits TODO(miek): fix r.Answer = append(r.Answer, x.RR...) + if tsig := q.IsTsig(); tsig != nil && w.TsigStatus() == nil { + r.SetTsig(tsig.Hdr.Name, tsig.Algorithm, tsig.Fudge, time.Now().Unix()) + } if err := w.WriteMsg(r); err != nil { return err } + w.TsigTimersOnly(true) } - w.TsigTimersOnly(true) return nil } diff --git a/vendor/github.com/miekg/dns/ztypes.go b/vendor/github.com/miekg/dns/ztypes.go index 495a83e3..f7ec8352 100644 --- a/vendor/github.com/miekg/dns/ztypes.go +++ b/vendor/github.com/miekg/dns/ztypes.go @@ -312,12 +312,12 @@ func (rr *DS) len(off int, compression map[string]struct{}) int { l += 2 // KeyTag l++ // Algorithm l++ // DigestType - l += len(rr.Digest)/2 + 1 + l += len(rr.Digest) / 2 return l } func (rr *EID) len(off int, compression map[string]struct{}) int { l := rr.Hdr.len(off, compression) - l += len(rr.Endpoint)/2 + 1 + l += len(rr.Endpoint) / 2 return l } func (rr *EUI48) len(off int, compression map[string]struct{}) int { @@ -452,7 +452,7 @@ func (rr *NID) len(off int, compression map[string]struct{}) int { } func (rr *NIMLOC) len(off int, compression map[string]struct{}) int { l := rr.Hdr.len(off, compression) - l += len(rr.Locator)/2 + 1 + l += len(rr.Locator) / 2 return l } func (rr *NINFO) len(off int, compression map[string]struct{}) int { @@ -505,7 +505,7 @@ func (rr *PX) len(off int, compression map[string]struct{}) int { } func (rr *RFC3597) len(off int, compression map[string]struct{}) int { l := rr.Hdr.len(off, compression) - l += len(rr.Rdata)/2 + 1 + l += len(rr.Rdata) / 2 return l } func (rr *RKEY) len(off int, compression map[string]struct{}) int { @@ -546,7 +546,7 @@ func (rr *SMIMEA) len(off int, compression map[string]struct{}) int { l++ // Usage l++ // Selector l++ // MatchingType - l += len(rr.Certificate)/2 + 1 + l += len(rr.Certificate) / 2 return l } func (rr *SOA) len(off int, compression map[string]struct{}) int { @@ -579,7 +579,7 @@ func (rr *SSHFP) len(off int, compression map[string]struct{}) int { l := rr.Hdr.len(off, compression) l++ // Algorithm l++ // Type - l += len(rr.FingerPrint)/2 + 1 + l += len(rr.FingerPrint) / 2 return l } func (rr *TA) len(off int, compression map[string]struct{}) int { @@ -587,7 +587,7 @@ func (rr *TA) len(off int, compression map[string]struct{}) int { l += 2 // KeyTag l++ // Algorithm l++ // DigestType - l += len(rr.Digest)/2 + 1 + l += len(rr.Digest) / 2 return l } func (rr *TALINK) len(off int, compression map[string]struct{}) int { @@ -614,7 +614,7 @@ func (rr *TLSA) len(off int, compression map[string]struct{}) int { l++ // Usage l++ // Selector l++ // MatchingType - l += len(rr.Certificate)/2 + 1 + l += len(rr.Certificate) / 2 return l } func (rr *TSIG) len(off int, compression map[string]struct{}) int { diff --git a/vendor/github.com/mr-tron/base58/base58/base58.go b/vendor/github.com/mr-tron/base58/base58/base58.go index b8810b7b..0bbdfc0b 100644 --- a/vendor/github.com/mr-tron/base58/base58/base58.go +++ b/vendor/github.com/mr-tron/base58/base58/base58.go @@ -39,24 +39,30 @@ func FastBase58EncodingAlphabet(bin []byte, alphabet *Alphabet) string { zcount++ } - size := (binsz-zcount)*138/100 + 1 - var buf = make([]byte, size) + size := ((binsz-zcount)*138/100 + 1) + + // allocate one big buffer up front + buf := make([]byte, size*2+zcount) + + // use the second half for the temporary buffer + tmp := buf[size+zcount:] high = size - 1 for i = zcount; i < binsz; i++ { j = size - 1 for carry = uint32(bin[i]); j > high || carry != 0; j-- { - carry = carry + 256*uint32(buf[j]) - buf[j] = byte(carry % 58) + carry = carry + 256*uint32(tmp[j]) + tmp[j] = byte(carry % 58) carry /= 58 } high = j } - for j = 0; j < size && buf[j] == 0; j++ { + for j = 0; j < size && tmp[j] == 0; j++ { } - var b58 = make([]byte, size-j+zcount) + // Use the first half for the result + b58 := buf[:size-j+zcount] if zcount != 0 { for i = 0; i < zcount; i++ { @@ -65,7 +71,7 @@ func FastBase58EncodingAlphabet(bin []byte, alphabet *Alphabet) string { } for i = zcount; j < size; i++ { - b58[i] = alphabet.encode[buf[j]] + b58[i] = alphabet.encode[tmp[j]] j++ } diff --git a/vendor/github.com/multiformats/go-multiaddr-fmt/.travis.yml b/vendor/github.com/multiformats/go-multiaddr-fmt/.travis.yml new file mode 100644 index 00000000..e4b63473 --- /dev/null +++ b/vendor/github.com/multiformats/go-multiaddr-fmt/.travis.yml @@ -0,0 +1,33 @@ +os: + - linux + +language: go + +go: + - 1.11.x + +env: + global: + - GOTFLAGS="-race" + - IPFS_REUSEPORT=false + matrix: + - BUILD_DEPTYPE=gx + - BUILD_DEPTYPE=gomod + + +# disable travis install +install: + - true + +script: + - bash <(curl -s https://raw.githubusercontent.com/ipfs/ci-helpers/master/travis-ci/run-standard-tests.sh) + + +cache: + directories: + - $GOPATH/src/gx + - $GOPATH/pkg/mod + - /home/travis/.cache/go-build + +notifications: + email: false diff --git a/vendor/github.com/libp2p/go-libp2p-host/LICENSE b/vendor/github.com/multiformats/go-multiaddr-fmt/LICENSE similarity index 100% rename from vendor/github.com/libp2p/go-libp2p-host/LICENSE rename to vendor/github.com/multiformats/go-multiaddr-fmt/LICENSE diff --git a/vendor/github.com/multiformats/go-multiaddr-fmt/README.md b/vendor/github.com/multiformats/go-multiaddr-fmt/README.md new file mode 100644 index 00000000..9fdc5389 --- /dev/null +++ b/vendor/github.com/multiformats/go-multiaddr-fmt/README.md @@ -0,0 +1,34 @@ +# multiaddr format +A validation checker for multiaddrs. Some basic validators for common address +types are provided, but creating your own combinations is easy. + +Usage: +```go +a, _ := ma.NewMultiaddr("/ip4/5.2.67.3/tcp/1708") +TCP.Matches(a) // returns true +``` + +Making your own validators is easy, for example, the `Reliable` multiaddr is +defined as follows: + +```go +// Define IP as either ipv4 or ipv6 +var IP = Or(Base(ma.P_IP4), Base(ma.P_IP6)) + +// Define TCP as 'tcp' on top of either ipv4 or ipv6 +var TCP = And(IP, Base(ma.P_TCP)) + +// Define UDP as 'udp' on top of either ipv4 or ipv6 +var UDP = And(IP, Base(ma.P_UDP)) + +// Define UTP as 'utp' on top of udp (on top of ipv4 or ipv6) +var UTP = And(UDP, Base(ma.P_UTP)) + +// Now define a Reliable transport as either tcp or utp +var Reliable = Or(TCP, UTP) + +// From here, we can easily define multiaddrs for protocols that can run on top +// of any 'reliable' transport (such as ipfs) +``` + +NOTE: the above patterns are already implemented in package diff --git a/vendor/github.com/multiformats/go-multiaddr-fmt/go.mod b/vendor/github.com/multiformats/go-multiaddr-fmt/go.mod new file mode 100644 index 00000000..db40536c --- /dev/null +++ b/vendor/github.com/multiformats/go-multiaddr-fmt/go.mod @@ -0,0 +1,6 @@ +module github.com/multiformats/go-multiaddr-fmt + +require ( + github.com/multiformats/go-multiaddr v0.0.1 + github.com/multiformats/go-multiaddr-dns v0.0.2 +) diff --git a/vendor/github.com/multiformats/go-multiaddr-fmt/go.sum b/vendor/github.com/multiformats/go-multiaddr-fmt/go.sum new file mode 100644 index 00000000..e6220da6 --- /dev/null +++ b/vendor/github.com/multiformats/go-multiaddr-fmt/go.sum @@ -0,0 +1,20 @@ +github.com/gxed/hashland/keccakpg v0.0.1 h1:wrk3uMNaMxbXiHibbPO4S0ymqJMm41WiudyFSs7UnsU= +github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfmKFJ6tItnhQ67kU= +github.com/gxed/hashland/murmur3 v0.0.1 h1:SheiaIt0sda5K+8FLz952/1iWS9zrnKsEJaOJu4ZbSc= +github.com/gxed/hashland/murmur3 v0.0.1/go.mod h1:KjXop02n4/ckmZSnY2+HKcLud/tcmvhST0bie/0lS48= +github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0OXOcUbGjvZxxijuBwbbmlSxLiuofa+g= +github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= +github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16 h1:5W7KhL8HVF3XCFOweFD3BNESdnO8ewyYTFT2R+/b8FQ= +github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= +github.com/mr-tron/base58 v1.1.0 h1:Y51FGVJ91WBqCEabAi5OPUz38eAx8DakuAm5svLcsfQ= +github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= +github.com/multiformats/go-multiaddr v0.0.1 h1:/QUV3VBMDI6pi6xfiw7lr6xhDWWvQKn9udPn68kLSdY= +github.com/multiformats/go-multiaddr v0.0.1/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= +github.com/multiformats/go-multiaddr-dns v0.0.2 h1:/Bbsgsy3R6e3jf2qBahzNHzww6usYaZ0NhNH3sqdFS8= +github.com/multiformats/go-multiaddr-dns v0.0.2/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= +github.com/multiformats/go-multihash v0.0.1 h1:HHwN1K12I+XllBCrqKnhX949Orn4oawPkegHMu2vDqQ= +github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= +golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67 h1:ng3VDlRp5/DHpSWl02R4rM9I+8M2rhmsuLwAMmkLQWE= +golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/sys v0.0.0-20190219092855-153ac476189d h1:Z0Ahzd7HltpJtjAHHxX8QFP3j1yYgiuvjbjRzDj/KH0= +golang.org/x/sys v0.0.0-20190219092855-153ac476189d/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= diff --git a/vendor/github.com/multiformats/go-multiaddr-fmt/package.json b/vendor/github.com/multiformats/go-multiaddr-fmt/package.json new file mode 100644 index 00000000..8303f9c8 --- /dev/null +++ b/vendor/github.com/multiformats/go-multiaddr-fmt/package.json @@ -0,0 +1,30 @@ +{ + "author": "whyrusleeping", + "bugs": {}, + "gx": { + "dvcsimport": "github.com/multiformats/go-multiaddr-fmt" + }, + "gxDependencies": [ + { + "author": "whyrusleeping", + "hash": "QmTZBfrPJmjWsCvHEtX5FE6KimVJhsJg5sBbqEFYf4UZtL", + "name": "go-multiaddr", + "version": "1.4.1" + }, + { + "author": "lgierth", + "hash": "QmR1T4gAM6XCHQugKnPZgZVPzo8WkuvSpL57EKQFgFbwfd", + "name": "go-multiaddr-dns", + "version": "0.3.2" + } + ], + "gxVersion": "0.6.0", + "gx_version": "0.4.0", + "issues_url": "https://github.com/multiformats/go-multiaddr-fmt", + "language": "go", + "license": "", + "name": "go-multiaddr-fmt", + "releaseCmd": "git commit -a -m \"gx publish $VERSION\"", + "version": "1.2.11" +} + diff --git a/vendor/github.com/multiformats/go-multiaddr-fmt/patterns.go b/vendor/github.com/multiformats/go-multiaddr-fmt/patterns.go new file mode 100644 index 00000000..62c45414 --- /dev/null +++ b/vendor/github.com/multiformats/go-multiaddr-fmt/patterns.go @@ -0,0 +1,172 @@ +package mafmt + +import ( + "strings" + + ma "github.com/multiformats/go-multiaddr" + madns "github.com/multiformats/go-multiaddr-dns" +) + +// Define a dns4 format multiaddr +var DNS4 = Base(madns.P_DNS4) + +// Define a dns6 format multiaddr +var DNS6 = Base(madns.P_DNS6) + +// Define a dnsaddr, dns4 or dns6 format multiaddr +var DNS = Or( + Base(madns.P_DNSADDR), + DNS4, + DNS6, +) + +// Define IP as either ipv4 or ipv6 +var IP = Or(Base(ma.P_IP4), Base(ma.P_IP6)) + +// Define TCP as 'tcp' on top of either ipv4 or ipv6, or dns equivalents. +var TCP = Or( + And(DNS, Base(ma.P_TCP)), + And(IP, Base(ma.P_TCP)), +) + +// Define UDP as 'udp' on top of either ipv4 or ipv6, or dns equivalents. +var UDP = Or( + And(DNS, Base(ma.P_UDP)), + And(IP, Base(ma.P_UDP)), +) + +// Define UTP as 'utp' on top of udp (on top of ipv4 or ipv6). +var UTP = And(UDP, Base(ma.P_UTP)) + +// Define QUIC as 'quic' on top of udp (on top of ipv4 or ipv6) +var QUIC = And(UDP, Base(ma.P_QUIC)) + +// Define unreliable transport as udp +var Unreliable = Or(UDP) + +// Now define a Reliable transport as either tcp or utp or quic +var Reliable = Or(TCP, UTP, QUIC) + +// IPFS can run over any reliable underlying transport protocol +var IPFS = And(Reliable, Base(ma.P_IPFS)) + +// Define http over TCP or DNS or http over DNS format multiaddr +var HTTP = Or( + And(TCP, Base(ma.P_HTTP)), + And(IP, Base(ma.P_HTTP)), + And(DNS, Base(ma.P_HTTP)), +) + +// Define https over TCP or DNS or https over DNS format multiaddr +var HTTPS = Or( + And(TCP, Base(ma.P_HTTPS)), + And(IP, Base(ma.P_HTTPS)), + And(DNS, Base(ma.P_HTTPS)), +) + +// Define p2p-webrtc-direct over HTTP or p2p-webrtc-direct over HTTPS format multiaddr +var WebRTCDirect = Or( + And(HTTP, Base(ma.P_P2P_WEBRTC_DIRECT)), + And(HTTPS, Base(ma.P_P2P_WEBRTC_DIRECT))) + +const ( + or = iota + and = iota +) + +func And(ps ...Pattern) Pattern { + return &pattern{ + Op: and, + Args: ps, + } +} + +func Or(ps ...Pattern) Pattern { + return &pattern{ + Op: or, + Args: ps, + } +} + +type Pattern interface { + Matches(ma.Multiaddr) bool + partialMatch([]ma.Protocol) (bool, []ma.Protocol) + String() string +} + +type pattern struct { + Args []Pattern + Op int +} + +func (ptrn *pattern) Matches(a ma.Multiaddr) bool { + ok, rem := ptrn.partialMatch(a.Protocols()) + return ok && len(rem) == 0 +} + +func (ptrn *pattern) partialMatch(pcs []ma.Protocol) (bool, []ma.Protocol) { + switch ptrn.Op { + case or: + for _, a := range ptrn.Args { + ok, rem := a.partialMatch(pcs) + if ok { + return true, rem + } + } + return false, nil + case and: + if len(pcs) < len(ptrn.Args) { + return false, nil + } + + for i := 0; i < len(ptrn.Args); i++ { + ok, rem := ptrn.Args[i].partialMatch(pcs) + if !ok { + return false, nil + } + + pcs = rem + } + + return true, pcs + default: + panic("unrecognized pattern operand") + } +} + +func (ptrn *pattern) String() string { + var sub []string + for _, a := range ptrn.Args { + sub = append(sub, a.String()) + } + + switch ptrn.Op { + case and: + return strings.Join(sub, "/") + case or: + return "{" + strings.Join(sub, "|") + "}" + default: + panic("unrecognized pattern op!") + } +} + +type Base int + +func (p Base) Matches(a ma.Multiaddr) bool { + pcs := a.Protocols() + return pcs[0].Code == int(p) && len(pcs) == 1 +} + +func (p Base) partialMatch(pcs []ma.Protocol) (bool, []ma.Protocol) { + if len(pcs) == 0 { + return false, nil + } + if pcs[0].Code == int(p) { + return true, pcs[1:] + } + return false, nil +} + +func (p Base) String() string { + return ma.ProtocolWithCode(int(p)).Name +} diff --git a/vendor/github.com/multiformats/go-multiaddr/.gitignore b/vendor/github.com/multiformats/go-multiaddr/.gitignore index 1d74e219..699d271b 100644 --- a/vendor/github.com/multiformats/go-multiaddr/.gitignore +++ b/vendor/github.com/multiformats/go-multiaddr/.gitignore @@ -1 +1,3 @@ .vscode/ +multiaddr/multiaddr +tmp/ diff --git a/vendor/github.com/multiformats/go-multiaddr/.travis.yml b/vendor/github.com/multiformats/go-multiaddr/.travis.yml index 18f4287d..95e4daaa 100644 --- a/vendor/github.com/multiformats/go-multiaddr/.travis.yml +++ b/vendor/github.com/multiformats/go-multiaddr/.travis.yml @@ -9,8 +9,8 @@ go: env: global: - GOTFLAGS="-race" + - GO111MODULE=on matrix: - - BUILD_DEPTYPE=gx - BUILD_DEPTYPE=gomod @@ -20,11 +20,10 @@ install: script: - bash <(curl -s https://raw.githubusercontent.com/ipfs/ci-helpers/master/travis-ci/run-standard-tests.sh) - + - make conformance cache: directories: - - $GOPATH/src/gx - $GOPATH/pkg/mod - /home/travis/.cache/go-build diff --git a/vendor/github.com/multiformats/go-multiaddr/Makefile b/vendor/github.com/multiformats/go-multiaddr/Makefile index 9eb5c446..4de9c30e 100644 --- a/vendor/github.com/multiformats/go-multiaddr/Makefile +++ b/vendor/github.com/multiformats/go-multiaddr/Makefile @@ -12,3 +12,15 @@ deps: gx covertools publish: gx-go rewrite --undo +conformance: tmp/multiaddr + go build -o tmp/multiaddr/test/go-multiaddr ./multiaddr + cd tmp/multiaddr/test && MULTIADDR_BIN="./go-multiaddr" go test -v + +tmp/multiaddr: + mkdir -p tmp/ + git clone https://github.com/multiformats/multiaddr tmp/multiaddr/ + +clean: + rm -rf tmp/ + +.PHONY: gx covertools deps publish conformance clean diff --git a/vendor/github.com/multiformats/go-multiaddr/codec.go b/vendor/github.com/multiformats/go-multiaddr/codec.go index ae58b534..35b50c14 100644 --- a/vendor/github.com/multiformats/go-multiaddr/codec.go +++ b/vendor/github.com/multiformats/go-multiaddr/codec.go @@ -7,7 +7,6 @@ import ( ) func stringToBytes(s string) ([]byte, error) { - // consume trailing slashes s = strings.TrimRight(s, "/") @@ -15,17 +14,21 @@ func stringToBytes(s string) ([]byte, error) { sp := strings.Split(s, "/") if sp[0] != "" { - return nil, fmt.Errorf("invalid multiaddr, must begin with /") + return nil, fmt.Errorf("failed to parse multiaddr %q: must begin with /", s) } // consume first empty elem sp = sp[1:] + if len(sp) == 0 { + return nil, fmt.Errorf("failed to parse multiaddr %q: empty multiaddr", s) + } + for len(sp) > 0 { name := sp[0] p := ProtocolWithName(name) if p.Code == 0 { - return nil, fmt.Errorf("no protocol with name %s", sp[0]) + return nil, fmt.Errorf("failed to parse multiaddr %q: unknown protocol %s", s, sp[0]) } _, _ = b.Write(CodeToVarint(p.Code)) sp = sp[1:] @@ -35,7 +38,7 @@ func stringToBytes(s string) ([]byte, error) { } if len(sp) < 1 { - return nil, fmt.Errorf("protocol requires address, none given: %s", name) + return nil, fmt.Errorf("failed to parse multiaddr %q: unexpected end of multiaddr", s) } if p.Path { @@ -46,7 +49,7 @@ func stringToBytes(s string) ([]byte, error) { a, err := p.Transcoder.StringToBytes(sp[0]) if err != nil { - return nil, fmt.Errorf("failed to parse %s: %s %s", p.Name, sp[0], err) + return nil, fmt.Errorf("failed to parse multiaddr %q: invalid value %q for protocol %s: %s", s, sp[0], p.Name, err) } if p.Size < 0 { // varint size. _, _ = b.Write(CodeToVarint(len(a))) @@ -59,6 +62,9 @@ func stringToBytes(s string) ([]byte, error) { } func validateBytes(b []byte) (err error) { + if len(b) == 0 { + return fmt.Errorf("empty multiaddr") + } for len(b) > 0 { code, n, err := ReadVarintCode(b) if err != nil { @@ -137,6 +143,9 @@ func readComponent(b []byte) (int, Component, error) { } func bytesToString(b []byte) (ret string, err error) { + if len(b) == 0 { + return "", fmt.Errorf("empty multiaddr") + } var buf strings.Builder for len(b) > 0 { diff --git a/vendor/github.com/multiformats/go-multiaddr/codecov.yml b/vendor/github.com/multiformats/go-multiaddr/codecov.yml new file mode 100644 index 00000000..ca8100ab --- /dev/null +++ b/vendor/github.com/multiformats/go-multiaddr/codecov.yml @@ -0,0 +1,2 @@ +ignore: + - "multiaddr" diff --git a/vendor/github.com/multiformats/go-multiaddr/multiaddr.go b/vendor/github.com/multiformats/go-multiaddr/multiaddr.go index 6794b92e..58fe8cec 100644 --- a/vendor/github.com/multiformats/go-multiaddr/multiaddr.go +++ b/vendor/github.com/multiformats/go-multiaddr/multiaddr.go @@ -159,6 +159,10 @@ func (m *multiaddr) Decapsulate(o Multiaddr) Multiaddr { return &multiaddr{bytes: cpy} } + if i == 0 { + return nil + } + ma, err := NewMultiaddr(s1[:i]) if err != nil { panic("Multiaddr.Decapsulate incorrect byte boundaries.") diff --git a/vendor/github.com/multiformats/go-multiaddr/protocols.go b/vendor/github.com/multiformats/go-multiaddr/protocols.go index ea5d0bcb..cb38a70e 100644 --- a/vendor/github.com/multiformats/go-multiaddr/protocols.go +++ b/vendor/github.com/multiformats/go-multiaddr/protocols.go @@ -20,7 +20,8 @@ const ( P_HTTPS = 0x01BB P_ONION = 0x01BC // also for backwards compatibility P_ONION3 = 0x01BD - P_GARLIC64 = 0x01CA + P_GARLIC64 = 0x01BE + P_GARLIC32 = 0x01BF P_P2P_WEBRTC_DIRECT = 0x0114 ) @@ -101,6 +102,13 @@ var ( Size: LengthPrefixedVarSize, Transcoder: TranscoderGarlic64, } + protoGARLIC32 = Protocol{ + Name: "garlic32", + Code: P_GARLIC32, + VCode: CodeToVarint(P_GARLIC32), + Size: LengthPrefixedVarSize, + Transcoder: TranscoderGarlic32, + } protoUTP = Protocol{ Name: "utp", Code: P_UTP, @@ -160,6 +168,7 @@ func init() { protoONION2, protoONION3, protoGARLIC64, + protoGARLIC32, protoUTP, protoUDT, protoQUIC, diff --git a/vendor/github.com/multiformats/go-multiaddr/transcoders.go b/vendor/github.com/multiformats/go-multiaddr/transcoders.go index cca2514c..77908b70 100644 --- a/vendor/github.com/multiformats/go-multiaddr/transcoders.go +++ b/vendor/github.com/multiformats/go-multiaddr/transcoders.go @@ -212,13 +212,14 @@ func onion3BtS(b []byte) (string, error) { return str, nil } -var TranscoderGarlic64 = NewTranscoderFromFunctions(garlic64StB, garlic64BtS, garlicValidate) +var TranscoderGarlic64 = NewTranscoderFromFunctions(garlic64StB, garlic64BtS, garlic64Validate) // i2p uses an alternate character set for base64 addresses. This returns an appropriate encoder. var garlicBase64Encoding = base64.NewEncoding("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-~") func garlic64StB(s string) ([]byte, error) { - // i2p base64 address + // i2p base64 address will be between 516 and 616 characters long, depending on + // certificate type if len(s) < 516 || len(s) > 616 { return nil, fmt.Errorf("failed to parse garlic addr: %s not an i2p base64 address. len: %d\n", s, len(s)) } @@ -231,20 +232,58 @@ func garlic64StB(s string) ([]byte, error) { } func garlic64BtS(b []byte) (string, error) { - if len(b) < 386 { - return "", fmt.Errorf("failed to validate garlic addr: %s not an i2p base64 address. len: %d\n", b, len(b)) + if err := garlic64Validate(b); err != nil { + return "", err } addr := garlicBase64Encoding.EncodeToString(b) return addr, nil } -func garlicValidate(b []byte) error { +func garlic64Validate(b []byte) error { + // A garlic64 address will always be greater than 386 bytes long when encoded. if len(b) < 386 { return fmt.Errorf("failed to validate garlic addr: %s not an i2p base64 address. len: %d\n", b, len(b)) } return nil } +var TranscoderGarlic32 = NewTranscoderFromFunctions(garlic32StB, garlic32BtS, garlic32Validate) + +var garlicBase32Encoding = base32.NewEncoding("abcdefghijklmnopqrstuvwxyz234567") + +func garlic32StB(s string) ([]byte, error) { + // an i2p base32 address with a length of greater than 55 characters is + // using an Encrypted Leaseset v2. all other base32 addresses will always be + // exactly 52 characters + if len(s) < 55 && len(s) != 52 { + return nil, fmt.Errorf("failed to parse garlic addr: %s not a i2p base32 address. len: %d", s, len(s)) + } + for len(s)%8 != 0 { + s += "=" + } + garlicHostBytes, err := garlicBase32Encoding.DecodeString(s) + if err != nil { + return nil, fmt.Errorf("failed to decode base32 garlic addr: %s, err: %v len: %v", s, err, len(s)) + } + return garlicHostBytes, nil +} + +func garlic32BtS(b []byte) (string, error) { + if err := garlic32Validate(b); err != nil { + return "", err + } + return strings.TrimRight(garlicBase32Encoding.EncodeToString(b), "="), nil +} + +func garlic32Validate(b []byte) error { + // an i2p base64 for an Encrypted Leaseset v2 will be at least 35 bytes + // long other than that, they will be exactly 32 bytes + if len(b) < 35 && len(b) != 32 { + return fmt.Errorf("failed to validate garlic addr: %s not an i2p base32 address. len: %d\n", b, len(b)) + } + return nil +} + var TranscoderP2P = NewTranscoderFromFunctions(p2pStB, p2pBtS, p2pVal) func p2pStB(s string) ([]byte, error) { diff --git a/vendor/github.com/multiformats/go-multicodec/.travis.yml b/vendor/github.com/multiformats/go-multicodec/.travis.yml deleted file mode 100644 index ddf35b20..00000000 --- a/vendor/github.com/multiformats/go-multicodec/.travis.yml +++ /dev/null @@ -1,17 +0,0 @@ -os: - - linux - -language: go - -go: - - 1.9.x - -install: - - make deps - -script: - - bash <(curl -s https://raw.githubusercontent.com/ipfs/ci-helpers/master/travis-ci/run-standard-tests.sh) - -sudo: false #docker containers for CI - -env: GOTFLAGS="-race -cpu 5" diff --git a/vendor/github.com/multiformats/go-multicodec/LICENSE b/vendor/github.com/multiformats/go-multicodec/LICENSE deleted file mode 100644 index c7386b3c..00000000 --- a/vendor/github.com/multiformats/go-multicodec/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014 Juan Batiz-Benet - -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/multiformats/go-multicodec/Makefile b/vendor/github.com/multiformats/go-multicodec/Makefile deleted file mode 100644 index 20619413..00000000 --- a/vendor/github.com/multiformats/go-multicodec/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -gx: - go get github.com/whyrusleeping/gx - go get github.com/whyrusleeping/gx-go - -deps: gx - gx --verbose install --global - gx-go rewrite - -publish: - gx-go rewrite --undo - diff --git a/vendor/github.com/multiformats/go-multicodec/README.md b/vendor/github.com/multiformats/go-multicodec/README.md deleted file mode 100644 index 2da195ad..00000000 --- a/vendor/github.com/multiformats/go-multicodec/README.md +++ /dev/null @@ -1,84 +0,0 @@ -# go-multicodec - -[![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](http://ipn.io) -[![](https://img.shields.io/badge/project-multiformats-blue.svg?style=flat-square)](https://github.com/multiformats/multiformats) -[![](https://img.shields.io/badge/freenode-%23ipfs-blue.svg?style=flat-square)](https://webchat.freenode.net/?channels=%23ipfs) -[![](https://img.shields.io/badge/readme%20style-standard-brightgreen.svg?style=flat-square)](https://github.com/RichardLitt/standard-readme) -[![Travis CI](https://img.shields.io/travis/multiformats/go-multicodec.svg?style=flat-square&branch=master)](https://travis-ci.org/multiformats/go-multicodec) -[![codecov.io](https://img.shields.io/codecov/c/github/multiformats/go-multicodec.svg?style=flat-square&branch=master)](https://codecov.io/github/multiformats/go-multicodec?branch=master) -[![GoDoc](https://godoc.org/github.com/multiformats/go-multicodec?status.svg)](https://godoc.org/github.com/multiformats/go-multicodec) - -> [multicodec](https://github.com/multiformats/multicodec) implementation in Go. - -### Supported codecs - -- `/cbor` -- `/json` -- `/msgio` -- `/msgpack` -- `/protobuf` - -## Table of Contents - -- [Install](#install) -- [Usage](#usage) -- [Maintainers](#maintainers) -- [Contribute](#contribute) -- [License](#license) - -## Install - -```sh -go get github.com/multiformats/go-multicodec -``` - -## Usage - -Look at the Godocs: - -- https://godoc.org/github.com/multiformats/go-multicodec - -```go -import ( - "os" - "io" - - cbor "github.com/multiformats/go-multicodec/cbor" - json "github.com/multiformats/go-multicodec/json" -) - -func main() { - dec := cbor.Multicodec().Decoder(os.Stdin) - enc := json.Multicodec(false).Encoder(os.Stdout) - - for { - var item interface{} - - if err := dec.Decode(&item); err == io.EOF { - break - } else if err != nil { - panic(err) - } - - if err := enc.Encode(&item); err != nil { - panic(err) - } - } -} -``` - -## Maintainers - -Captain: [@jbenet](https://github.com/jbenet). - -## Contribute - -Contributions welcome. Please check out [the issues](https://github.com/multiformats/go-multicodec/issues). - -Check out our [contributing document](https://github.com/multiformats/multiformats/blob/master/contributing.md) for more information on how we work, and about contributing in general. Please be aware that all interactions related to multiformats are subject to the IPFS [Code of Conduct](https://github.com/ipfs/community/blob/master/code-of-conduct.md). - -Small note: If editing the README, please conform to the [standard-readme](https://github.com/RichardLitt/standard-readme) specification. - -## License - -[MIT](LICENSE) © 2014 Juan Batiz-Benet diff --git a/vendor/github.com/multiformats/go-multicodec/base/b64/codec.go b/vendor/github.com/multiformats/go-multicodec/base/b64/codec.go deleted file mode 100644 index 4139f4db..00000000 --- a/vendor/github.com/multiformats/go-multicodec/base/b64/codec.go +++ /dev/null @@ -1,64 +0,0 @@ -package b64 - -import ( - "encoding/base64" - "io" - - mc "github.com/multiformats/go-multicodec" - base "github.com/multiformats/go-multicodec/base" -) - -var ( - HeaderPath = "/base64/" - Header = mc.Header([]byte(HeaderPath)) - multic = mc.NewMulticodecFromCodec(Codec(), Header) -) - -type codec struct{} - -type decoder struct { - r io.Reader -} - -func (d decoder) Decode(v interface{}) error { - out, ok := v.([]byte) - if !ok { - return base.ErrExpectedByteSlice - } - - _, err := d.r.Read(out) - - return err -} - -func (codec) Decoder(r io.Reader) mc.Decoder { - return decoder{base64.NewDecoder(base64.StdEncoding, r)} -} - -type encoder struct { - w io.WriteCloser -} - -func (e encoder) Encode(v interface{}) error { - slice, ok := v.([]byte) - if !ok { - return base.ErrExpectedByteSlice - } - _, err := e.w.Write(slice) - if err != nil { - return err - } - return e.w.Close() -} - -func (codec) Encoder(w io.Writer) mc.Encoder { - return encoder{base64.NewEncoder(base64.StdEncoding, w)} -} - -func Codec() mc.Codec { - return codec{} -} - -func Multicodec() mc.Multicodec { - return multic -} diff --git a/vendor/github.com/multiformats/go-multicodec/base/bin/codec.go b/vendor/github.com/multiformats/go-multicodec/base/bin/codec.go deleted file mode 100644 index 09c05a82..00000000 --- a/vendor/github.com/multiformats/go-multicodec/base/bin/codec.go +++ /dev/null @@ -1,64 +0,0 @@ -package bin - -import ( - "io" - - mc "github.com/multiformats/go-multicodec" - base "github.com/multiformats/go-multicodec/base" -) - -var ( - HeaderPath = "/bin/" - Header = mc.Header([]byte(HeaderPath)) - multic = mc.NewMulticodecFromCodec(Codec(), Header) -) - -type codec struct{} - -func (codec) Header() []byte { - return Header -} - -type decoder struct { - r io.Reader -} - -func (d decoder) Decode(v interface{}) error { - slice, ok := v.([]byte) - if !ok { - return base.ErrExpectedByteSlice - } - - _, err := d.r.Read(slice) - return err -} - -func (codec) Decoder(r io.Reader) mc.Decoder { - return decoder{r} -} - -type encoder struct { - w io.Writer -} - -func (e encoder) Encode(v interface{}) error { - slice, ok := v.([]byte) - if !ok { - return base.ErrExpectedByteSlice - } - - _, err := e.w.Write(slice) - return err -} - -func (codec) Encoder(w io.Writer) mc.Encoder { - return encoder{w} -} - -func Codec() mc.Codec { - return codec{} -} - -func Multicodec() mc.Multicodec { - return multic -} diff --git a/vendor/github.com/multiformats/go-multicodec/base/errors.go b/vendor/github.com/multiformats/go-multicodec/base/errors.go deleted file mode 100644 index ab6ecfb9..00000000 --- a/vendor/github.com/multiformats/go-multicodec/base/errors.go +++ /dev/null @@ -1,7 +0,0 @@ -package base - -import "errors" - -var ( - ErrExpectedByteSlice = errors.New("expected []byte as input") -) diff --git a/vendor/github.com/multiformats/go-multicodec/base/hex/codec.go b/vendor/github.com/multiformats/go-multicodec/base/hex/codec.go deleted file mode 100644 index d8ef31bb..00000000 --- a/vendor/github.com/multiformats/go-multicodec/base/hex/codec.go +++ /dev/null @@ -1,69 +0,0 @@ -package bin - -import ( - "encoding/hex" - "io" - - mc "github.com/multiformats/go-multicodec" - base "github.com/multiformats/go-multicodec/base" -) - -var ( - HeaderPath = "/base16/" - Header = mc.Header([]byte(HeaderPath)) - multic = mc.NewMulticodecFromCodec(Codec(), Header) -) - -type codec struct{} - -type decoder struct { - r io.Reader -} - -func (d decoder) Decode(v interface{}) error { - out, ok := v.([]byte) - if !ok { - return base.ErrExpectedByteSlice - } - - buf := make([]byte, hex.EncodedLen(len(out))) - _, err := d.r.Read(buf) - if err != nil { - return err - } - _, err = hex.Decode(out, buf) - return err -} - -func (codec) Decoder(r io.Reader) mc.Decoder { - return decoder{r} -} - -type encoder struct { - w io.Writer -} - -func (e encoder) Encode(v interface{}) error { - slice, ok := v.([]byte) - if !ok { - return base.ErrExpectedByteSlice - } - - buf := make([]byte, hex.EncodedLen(len(slice))) - hex.Encode(buf, slice) - - _, err := e.w.Write(buf) - return err -} - -func (codec) Encoder(w io.Writer) mc.Encoder { - return encoder{w} -} - -func Codec() mc.Codec { - return codec{} -} - -func Multicodec() mc.Multicodec { - return multic -} diff --git a/vendor/github.com/multiformats/go-multicodec/base/mux/mux.go b/vendor/github.com/multiformats/go-multicodec/base/mux/mux.go deleted file mode 100644 index be119f9b..00000000 --- a/vendor/github.com/multiformats/go-multicodec/base/mux/mux.go +++ /dev/null @@ -1,20 +0,0 @@ -package basemux - -import ( - mc "github.com/multiformats/go-multicodec" - mux "github.com/multiformats/go-multicodec/mux" - - b64 "github.com/multiformats/go-multicodec/base/b64" - bin "github.com/multiformats/go-multicodec/base/bin" - hex "github.com/multiformats/go-multicodec/base/hex" -) - -func AllBasesMux() *mux.Multicodec { - m := mux.MuxMulticodec([]mc.Multicodec{ - hex.Multicodec(), - b64.Multicodec(), - bin.Multicodec(), - }, mux.SelectFirst) - m.Wrap = false - return m -} diff --git a/vendor/github.com/multiformats/go-multicodec/cbor/cbor.go b/vendor/github.com/multiformats/go-multicodec/cbor/cbor.go deleted file mode 100644 index 1de45b1f..00000000 --- a/vendor/github.com/multiformats/go-multicodec/cbor/cbor.go +++ /dev/null @@ -1,85 +0,0 @@ -package mc_cbor - -import ( - "io" - - cbor "github.com/whyrusleeping/cbor/go" - - mc "github.com/multiformats/go-multicodec" -) - -var HeaderPath string -var Header []byte - -func init() { - HeaderPath = "/cbor" - Header = mc.Header([]byte(HeaderPath)) -} - -type codec struct { - mc bool -} - -func Codec() mc.Codec { - return &codec{ - mc: false, - } -} - -func Multicodec() mc.Multicodec { - return &codec{ - mc: true, - } -} - -func (c *codec) Encoder(w io.Writer) mc.Encoder { - return &encoder{ - w: w, - mc: c.mc, - enc: cbor.NewEncoder(w), - } -} - -func (c *codec) Decoder(r io.Reader) mc.Decoder { - return &decoder{ - r: r, - mc: c.mc, - dec: cbor.NewDecoder(r), - } -} - -func (c *codec) Header() []byte { - return Header -} - -type encoder struct { - w io.Writer - mc bool - enc *cbor.Encoder -} - -type decoder struct { - r io.Reader - mc bool - dec *cbor.Decoder -} - -func (c *encoder) Encode(v interface{}) error { - // if multicodec, write the header first - if c.mc { - if _, err := c.w.Write(Header); err != nil { - return err - } - } - return c.enc.Encode(v) -} - -func (c *decoder) Decode(v interface{}) error { - // if multicodec, consume the header first - if c.mc { - if err := mc.ConsumeHeader(c.r, Header); err != nil { - return err - } - } - return c.dec.Decode(v) -} diff --git a/vendor/github.com/multiformats/go-multicodec/coding.go b/vendor/github.com/multiformats/go-multicodec/coding.go deleted file mode 100644 index 46edc16d..00000000 --- a/vendor/github.com/multiformats/go-multicodec/coding.go +++ /dev/null @@ -1,55 +0,0 @@ -package multicodec - -import ( - "bytes" - "io" -) - -// Codec is an algorithm for coding data from one representation -// to another. For convenience, we define a codec in the usual -// sense: a function and its inverse, to encode and decode. -type Codec interface { - // Decoder wraps given io.Reader and returns an object which - // will decode bytes into objects. - Decoder(r io.Reader) Decoder - - // Encoder wraps given io.Writer and returns an Encoder - Encoder(w io.Writer) Encoder -} - -// Encoder encodes objects into bytes and writes them to an -// underlying io.Writer. Works like encoding.Marshal -type Encoder interface { - Encode(n interface{}) error -} - -// Decoder decodes objects from bytes from an underlying -// io.Reader, into given object. Works like encoding.Unmarshal -type Decoder interface { - Decode(n interface{}) error -} - -// Marshal serializes an object to a []byte. -func Marshal(c Codec, o interface{}) ([]byte, error) { - var buf bytes.Buffer - err := MarshalTo(c, &buf, o) - if err != nil { - return nil, err - } - return buf.Bytes(), nil -} - -// MarshalTo serializes an object to a writer. -func MarshalTo(c Codec, w io.Writer, o interface{}) error { - return c.Encoder(w).Encode(o) -} - -// Unmarshal deserializes an object to a []byte. -func Unmarshal(c Codec, buf []byte, o interface{}) error { - return UnmarshalFrom(c, bytes.NewBuffer(buf), o) -} - -// UnmarshalFrom deserializes an objects from a reader. -func UnmarshalFrom(c Codec, r io.Reader, o interface{}) error { - return c.Decoder(r).Decode(o) -} diff --git a/vendor/github.com/multiformats/go-multicodec/header.go b/vendor/github.com/multiformats/go-multicodec/header.go deleted file mode 100644 index faa4769f..00000000 --- a/vendor/github.com/multiformats/go-multicodec/header.go +++ /dev/null @@ -1,140 +0,0 @@ -package multicodec - -import ( - "bufio" - "bytes" - "errors" - "io" -) - -var ( - ErrType = errors.New("multicodec type error") - ErrHeaderInvalid = errors.New("multicodec header invalid") - ErrMismatch = errors.New("multicodec did not match") - ErrVarints = errors.New("multicodec varints not yet implemented") -) - -// Header returns a multicodec header with the given path. -func Header(path []byte) []byte { - b, err := HeaderSafe(path) - if err != nil { - panic(err.Error) - } - return b -} - -// HeaderSafe works like Header but it returns error instead of calling panic -func HeaderSafe(path []byte) ([]byte, error) { - l := len(path) + 1 // + \n - if l >= 127 { - return nil, ErrVarints - } - - buf := make([]byte, l+1) - buf[0] = byte(l) - copy(buf[1:], path) - buf[l] = '\n' - return buf, nil -} - -// HeaderPath returns the multicodec path from header -func HeaderPath(hdr []byte) []byte { - hdr = hdr[1:] - if hdr[len(hdr)-1] == '\n' { - hdr = hdr[:len(hdr)-1] - } - return hdr -} - -// WriteHeader writes a multicodec header to a writer. -// It uses the given path. -func WriteHeader(w io.Writer, path []byte) error { - hdr := Header(path) - _, err := w.Write(hdr) - return err -} - -// ReadHeader reads a multicodec header from a reader. -// Returns the header found, or an error if the header -// mismatched. -func ReadHeader(r io.Reader) (path []byte, err error) { - lbuf := make([]byte, 1) - if _, err := r.Read(lbuf); err != nil { - return nil, err - } - - l := int(lbuf[0]) - if l > 127 { - return nil, ErrVarints - } - - buf := make([]byte, l+1) - buf[0] = lbuf[0] - if _, err := io.ReadFull(r, buf[1:]); err != nil { - return nil, err - } - if buf[l] != '\n' { - return nil, ErrHeaderInvalid - } - return buf, nil -} - -// ReadPath reads a multicodec header from a reader. -// Returns the path found, or an error if the header -// mismatched. -func ReadPath(r io.Reader) (path []byte, err error) { - hdr, err := ReadHeader(r) - if err != nil { - return nil, err - } - return HeaderPath(hdr), nil -} - -// ConsumePath reads a multicodec header from a reader, -// verifying it matches given path. If it does not, it returns -// ErrProtocolMismatch -func ConsumePath(r io.Reader, path []byte) (err error) { - actual, err := ReadPath(r) - if !bytes.Equal(path, actual) { - return ErrMismatch - } - return nil -} - -// ConsumeHeader reads a multicodec header from a reader, -// verifying it matches given header. If it does not, it returns -// ErrProtocolMismatch -func ConsumeHeader(r io.Reader, header []byte) (err error) { - actual := make([]byte, len(header)) - if _, err := io.ReadFull(r, actual); err != nil { - return err - } - - if !bytes.Equal(header, actual) { - return ErrMismatch - } - return nil -} - -// WrapHeaderReader returns a reader that first reads the -// given header, and then the given reader, using io.MultiReader. -// It is useful if the header has been read through, but still -// needed to pass to a decoder. -func WrapHeaderReader(hdr []byte, r io.Reader) io.Reader { - return io.MultiReader(bytes.NewReader(hdr), r) -} - -func WrapTransformPathToHeader(r io.Reader) (io.Reader, error) { - br := bufio.NewReader(r) - - p, err := br.ReadBytes('\n') - if err != nil { - return nil, err - } - p = p[:len(p)-1] // drop newline - hdr, err := HeaderSafe(p) - if err != nil { - return nil, err - } - return WrapHeaderReader(hdr, br), nil -} diff --git a/vendor/github.com/multiformats/go-multicodec/json/json.go b/vendor/github.com/multiformats/go-multicodec/json/json.go deleted file mode 100644 index 98cd636a..00000000 --- a/vendor/github.com/multiformats/go-multicodec/json/json.go +++ /dev/null @@ -1,145 +0,0 @@ -package mc_json - -import ( - "bytes" - "encoding/json" - "io" - - msgio "github.com/libp2p/go-msgio" - - mc "github.com/multiformats/go-multicodec" -) - -var HeaderPath string -var Header []byte -var HeaderMsgioPath string -var HeaderMsgio []byte - -func init() { - HeaderPath = "/json" - HeaderMsgioPath = "/json/msgio" - Header = mc.Header([]byte(HeaderPath)) - HeaderMsgio = mc.Header([]byte(HeaderMsgioPath)) -} - -type codec struct { - mc bool - msgio bool -} - -func Codec(msgio bool) mc.Codec { - return &codec{mc: false, msgio: msgio} -} - -func Multicodec(msgio bool) mc.Multicodec { - return &codec{mc: true, msgio: msgio} -} - -func (c *codec) Encoder(w io.Writer) mc.Encoder { - buf := bytes.NewBuffer(nil) - return &encoder{ - w: w, - c: c, - buf: buf, - enc: json.NewEncoder(buf), - } -} - -func (c *codec) Decoder(r io.Reader) mc.Decoder { - return &decoder{ - r: r, - c: c, - } -} - -func (c *codec) Header() []byte { - if c.msgio { - return HeaderMsgio - } - return Header -} - -type encoder struct { - w io.Writer - c *codec - enc *json.Encoder - buf *bytes.Buffer -} - -type decoder struct { - r io.Reader - c *codec -} - -func (c *encoder) Encode(v interface{}) error { - defer c.buf.Reset() - w := c.w - - if c.c.mc { - // if multicodec, write the header first - if _, err := c.w.Write(c.c.Header()); err != nil { - return err - } - } - if c.c.msgio { - w = msgio.NewWriter(w) - } - - // recast to deal with map[interface{}]interface{} case - vr, err := recast(v) - if err != nil { - return err - } - - if err := c.enc.Encode(vr); err != nil { - return err - } - - _, err = io.Copy(w, c.buf) - return err -} - -func (c *decoder) Decode(v interface{}) error { - r := c.r - - if c.c.mc { - // if multicodec, consume the header first - if err := mc.ConsumeHeader(c.r, c.c.Header()); err != nil { - return err - } - } - if c.c.msgio { - // need to make a new one per read. - var err error - r, err = msgio.LimitedReader(c.r) - if err != nil { - return err - } - } - - return json.NewDecoder(r).Decode(v) -} - -func recast(v interface{}) (cv interface{}, err error) { - switch v.(type) { - case map[interface{}]interface{}: - vmi := v.(map[interface{}]interface{}) - vms := make(map[string]interface{}, len(vmi)) - for k, v2 := range vmi { - ks, ok := k.(string) - if !ok { - return v, mc.ErrType - } - - rv2, err := recast(v2) - if err != nil { - return v, err - } - - vms[ks] = rv2 - } - return vms, nil - default: - return v, nil // hope for the best. - } -} diff --git a/vendor/github.com/multiformats/go-multicodec/multicodec.go b/vendor/github.com/multiformats/go-multicodec/multicodec.go deleted file mode 100644 index 72a1d2ff..00000000 --- a/vendor/github.com/multiformats/go-multicodec/multicodec.go +++ /dev/null @@ -1,70 +0,0 @@ -package multicodec - -import "io" - -// Multicodec is the interface for a multicodec -type Multicodec interface { - Codec - - Header() []byte -} - -type c2mc struct { - c Codec - header []byte -} - -var _ Multicodec = (*c2mc)(nil) - -func (c c2mc) Header() []byte { - return c.header -} - -type c2mcD struct { - base *c2mc - r io.Reader -} - -func (d c2mcD) Decode(v interface{}) error { - err := ConsumeHeader(d.r, d.base.header) - if err != nil { - return err - } - return d.base.c.Decoder(d.r).Decode(v) -} - -var _ Decoder = (*c2mcD)(nil) - -func (c c2mc) Decoder(r io.Reader) Decoder { - return c2mcD{ - base: &c, - r: r, - } -} - -type c2mcE struct { - base *c2mc - w io.Writer -} - -func (e c2mcE) Encode(v interface{}) error { - _, err := e.w.Write(e.base.Header()) - if err != nil { - return err - } - return e.base.c.Encoder(e.w).Encode(v) -} - -func (c c2mc) Encoder(w io.Writer) Encoder { - return c2mcE{ - base: &c, - w: w, - } -} - -func NewMulticodecFromCodec(c Codec, header []byte) Multicodec { - return c2mc{ - c: c, - header: header, - } -} diff --git a/vendor/github.com/multiformats/go-multicodec/mux/all.go b/vendor/github.com/multiformats/go-multicodec/mux/all.go deleted file mode 100644 index cfad7b2b..00000000 --- a/vendor/github.com/multiformats/go-multicodec/mux/all.go +++ /dev/null @@ -1,15 +0,0 @@ -package muxcodec - -import ( - mc "github.com/multiformats/go-multicodec" - cbor "github.com/multiformats/go-multicodec/cbor" - json "github.com/multiformats/go-multicodec/json" -) - -func StandardMux() *Multicodec { - return MuxMulticodec([]mc.Multicodec{ - cbor.Multicodec(), - json.Multicodec(false), - json.Multicodec(true), - }, SelectFirst) -} diff --git a/vendor/github.com/multiformats/go-multicodec/mux/mux.go b/vendor/github.com/multiformats/go-multicodec/mux/mux.go deleted file mode 100644 index 4e27f27f..00000000 --- a/vendor/github.com/multiformats/go-multicodec/mux/mux.go +++ /dev/null @@ -1,120 +0,0 @@ -package muxcodec - -import ( - "bytes" - "fmt" - "io" - - mc "github.com/multiformats/go-multicodec" -) - -var ( - ErrNoCodec = fmt.Errorf("no suitable codec") -) - -var Header []byte - -func init() { - Header = mc.Header([]byte("/multicodec")) -} - -// SelectCodec is a function that selects which codecs are able to -// marshal a given datastructure, and orders them (to be tried first). -type SelectCodec func(v interface{}, codecs []mc.Multicodec) mc.Multicodec - -// SelectFirst is the default SelectCodec function. selects the first -// codec given. -func SelectFirst(v interface{}, codecs []mc.Multicodec) mc.Multicodec { - return codecs[0] -} - -// MuxMulticodec returns a multicodec that muxes between given codecs. -// It uses the given SelectCodec function when marshaling, to select -// the best codec to use. -func MuxMulticodec(codecs []mc.Multicodec, sel SelectCodec) *Multicodec { - if sel == nil { - sel = SelectFirst - } - return &Multicodec{codecs, sel, true, nil} -} - -type Multicodec struct { - Codecs []mc.Multicodec // subcodecs to use - Select SelectCodec // pick a subcodec for encoding - Wrap bool // whether to wrap with own header - Last mc.Multicodec // the last subcodec used -} - -func (c *Multicodec) Encoder(w io.Writer) mc.Encoder { - return &encoder{w, c} -} - -func (c *Multicodec) Decoder(r io.Reader) mc.Decoder { - return &decoder{r, c} -} - -func (c *Multicodec) Header() []byte { - return Header -} - -type encoder struct { - w io.Writer - c *Multicodec -} - -type decoder struct { - r io.Reader - c *Multicodec -} - -func (c *encoder) Encode(v interface{}) error { - subc := c.c.Select(v, c.c.Codecs) - if subc == nil { - return ErrNoCodec - } - - if c.c.Wrap { // write multicodec header. - if _, err := c.w.Write(c.c.Header()); err != nil { - return err - } - } - - c.c.Last = subc - return subc.Encoder(c.w).Encode(v) -} - -func (c *decoder) Decode(v interface{}) error { - if c.c.Wrap { // read multicodec header. - if err := mc.ConsumeHeader(c.r, c.c.Header()); err != nil { - return err - } - } - - // get next header, to select codec - hdr, err := mc.ReadHeader(c.r) - if err != nil { - return err - } - - // "unwind" the read as subc consumes header - r := mc.WrapHeaderReader(hdr, c.r) - - subc := CodecWithHeader(hdr, c.c.Codecs) - if subc == nil { - return fmt.Errorf("no codec for %s", hdr) - } - - c.c.Last = subc - return subc.Decoder(r).Decode(v) -} - -func CodecWithHeader(hdr []byte, codecs []mc.Multicodec) mc.Multicodec { - // we'll look through the list. should be small. - // if huge, consider a map. - for _, c := range codecs { - if bytes.Equal(hdr, c.Header()) { - return c - } - } - return nil -} diff --git a/vendor/github.com/multiformats/go-multicodec/package.json b/vendor/github.com/multiformats/go-multicodec/package.json deleted file mode 100644 index ecfc4776..00000000 --- a/vendor/github.com/multiformats/go-multicodec/package.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "author": "multiformats", - "bugs": { - "url": "https://github.com/multiformats/go-multicodec/issues" - }, - "gx": { - "dvcsimport": "github.com/multiformats/go-multicodec" - }, - "gxDependencies": [ - { - "author": "whyrusleeping", - "hash": "QmWBug6eBS7AxRdCDVuSY5CnSit7cS2XnPFYJWqWDumhCG", - "name": "go-msgio", - "version": "0.0.3" - }, - { - "author": "whyrusleeping", - "hash": "QmcRKRQjNc2JZPHApR32fbkZVd6WXG2Ch9Kcy7sPxuAJgd", - "name": "cbor", - "version": "0.2.3" - }, - { - "author": "ugorji", - "hash": "QmVTAmbCaPqdfbmpWDCJMQNFxbyJoG2USFsumXmTWY5LFp", - "name": "go-codec", - "version": "2017.10.18" - }, - { - "author": "whyrusleeping", - "hash": "QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8", - "name": "gogo-protobuf", - "version": "0.0.0" - } - ], - "gxVersion": "0.10.0", - "language": "go", - "license": "MIT", - "name": "go-multicodec", - "releaseCmd": "git commit -a -m \"gx publish $VERSION\"", - "version": "0.1.6" -} - diff --git a/vendor/github.com/multiformats/go-multihash/.travis.yml b/vendor/github.com/multiformats/go-multihash/.travis.yml index 18f4287d..09f9a4cc 100644 --- a/vendor/github.com/multiformats/go-multihash/.travis.yml +++ b/vendor/github.com/multiformats/go-multihash/.travis.yml @@ -10,7 +10,6 @@ env: global: - GOTFLAGS="-race" matrix: - - BUILD_DEPTYPE=gx - BUILD_DEPTYPE=gomod @@ -24,7 +23,6 @@ script: cache: directories: - - $GOPATH/src/gx - $GOPATH/pkg/mod - /home/travis/.cache/go-build diff --git a/vendor/github.com/multiformats/go-multihash/go.mod b/vendor/github.com/multiformats/go-multihash/go.mod index 79a1dfc1..27de256a 100644 --- a/vendor/github.com/multiformats/go-multihash/go.mod +++ b/vendor/github.com/multiformats/go-multihash/go.mod @@ -1,11 +1,9 @@ module github.com/multiformats/go-multihash require ( - github.com/gxed/hashland/keccakpg v0.0.1 - github.com/gxed/hashland/murmur3 v0.0.1 github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 - github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16 - github.com/mr-tron/base58 v1.1.0 - golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67 - golang.org/x/sys v0.0.0-20190219092855-153ac476189d // indirect + github.com/minio/sha256-simd v0.1.0 + github.com/mr-tron/base58 v1.1.2 + github.com/spaolacci/murmur3 v1.1.0 + golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8 ) diff --git a/vendor/github.com/multiformats/go-multihash/go.sum b/vendor/github.com/multiformats/go-multihash/go.sum index ecd77b6c..c599c83a 100644 --- a/vendor/github.com/multiformats/go-multihash/go.sum +++ b/vendor/github.com/multiformats/go-multihash/go.sum @@ -1,14 +1,16 @@ -github.com/gxed/hashland/keccakpg v0.0.1 h1:wrk3uMNaMxbXiHibbPO4S0ymqJMm41WiudyFSs7UnsU= -github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfmKFJ6tItnhQ67kU= -github.com/gxed/hashland/murmur3 v0.0.1 h1:SheiaIt0sda5K+8FLz952/1iWS9zrnKsEJaOJu4ZbSc= -github.com/gxed/hashland/murmur3 v0.0.1/go.mod h1:KjXop02n4/ckmZSnY2+HKcLud/tcmvhST0bie/0lS48= github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0OXOcUbGjvZxxijuBwbbmlSxLiuofa+g= github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= -github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16 h1:5W7KhL8HVF3XCFOweFD3BNESdnO8ewyYTFT2R+/b8FQ= -github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= -github.com/mr-tron/base58 v1.1.0 h1:Y51FGVJ91WBqCEabAi5OPUz38eAx8DakuAm5svLcsfQ= -github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= -golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67 h1:ng3VDlRp5/DHpSWl02R4rM9I+8M2rhmsuLwAMmkLQWE= -golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/sys v0.0.0-20190219092855-153ac476189d h1:Z0Ahzd7HltpJtjAHHxX8QFP3j1yYgiuvjbjRzDj/KH0= -golang.org/x/sys v0.0.0-20190219092855-153ac476189d/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +github.com/minio/sha256-simd v0.1.0 h1:U41/2erhAKcmSI14xh/ZTUdBPOzDOIfS93ibzUSl8KM= +github.com/minio/sha256-simd v0.1.0/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= +github.com/mr-tron/base58 v1.1.2 h1:ZEw4I2EgPKDJ2iEw0cNmLB3ROrEmkOtXIkaG7wZg+78= +github.com/mr-tron/base58 v1.1.2/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8 h1:1wopBVtVdWnn03fZelqdXTqk7U7zPQCb+T4rbU9ZEoU= +golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d h1:+R4KGOnez64A81RvjARKc4UT5/tI9ujCIVX+P5KiHuI= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= diff --git a/vendor/github.com/multiformats/go-multihash/multihash.go b/vendor/github.com/multiformats/go-multihash/multihash.go index 54d90153..ccfea831 100644 --- a/vendor/github.com/multiformats/go-multihash/multihash.go +++ b/vendor/github.com/multiformats/go-multihash/multihash.go @@ -31,7 +31,7 @@ type ErrInconsistentLen struct { } func (e ErrInconsistentLen) Error() string { - return fmt.Sprintf("multihash length inconsistent: %v", e.dm) + return fmt.Sprintf("multihash length inconsistent: expected %d, got %d", e.dm.Length, len(e.dm.Digest)) } // constants diff --git a/vendor/github.com/multiformats/go-multihash/package.json b/vendor/github.com/multiformats/go-multihash/package.json deleted file mode 100644 index af15ff52..00000000 --- a/vendor/github.com/multiformats/go-multihash/package.json +++ /dev/null @@ -1,54 +0,0 @@ -{ - "author": "multiformats", - "bugs": { - "url": "https://github.com/multiformats/go-multihash/issues" - }, - "gx": { - "dvcsimport": "github.com/multiformats/go-multihash" - }, - "gxDependencies": [ - { - "author": "whyrusleeping", - "hash": "QmW7VUmSvhvSGbYbdsh7uRjhGmsYkc9fL8aJ5CorxxrU5N", - "name": "go-crypto", - "version": "0.2.1" - }, - { - "author": "mr-tron", - "hash": "QmWFAMPqsEyUX7gDUsRVmMWz59FxSpJ1b2v6bJ1yYzo7jY", - "name": "go-base58-fast", - "version": "0.1.1" - }, - { - "author": "whyrusleeping", - "hash": "QmZtJMfZZvoD3EKpQaf8xsFi83HMtX5acQekY8exMbcWEi", - "name": "keccakpg", - "version": "0.0.1" - }, - { - "author": "minio", - "hash": "QmcTzQXRcU2vf8yX5EEboz1BSvWC7wWmeYAKVQmhp8WZYU", - "name": "sha256-simd", - "version": "0.1.2" - }, - { - "author": "minio", - "hash": "QmZp3eKdYQHHAneECmeK6HhiMwTPufmjC8DuuaGKv3unvx", - "name": "blake2b-simd", - "version": "0.1.1" - }, - { - "author": "whyrusleeping", - "hash": "QmWAXZgFyppTRshtnVHJ8LnA1yoHjUr41ZnsWPoA8wnSgF", - "name": "hashland-murmur3", - "version": "0.0.1" - } - ], - "gxVersion": "0.9.0", - "language": "go", - "license": "MIT", - "name": "go-multihash", - "releaseCmd": "git commit -a -m \"gx release $VERSION\"", - "version": "1.0.10" -} - diff --git a/vendor/github.com/multiformats/go-multihash/sum.go b/vendor/github.com/multiformats/go-multihash/sum.go index f12e2ee9..249cb757 100644 --- a/vendor/github.com/multiformats/go-multihash/sum.go +++ b/vendor/github.com/multiformats/go-multihash/sum.go @@ -7,10 +7,9 @@ import ( "errors" "fmt" - keccak "github.com/gxed/hashland/keccakpg" - murmur3 "github.com/gxed/hashland/murmur3" blake2b "github.com/minio/blake2b-simd" sha256 "github.com/minio/sha256-simd" + murmur3 "github.com/spaolacci/murmur3" blake2s "golang.org/x/crypto/blake2s" sha3 "golang.org/x/crypto/sha3" ) @@ -113,27 +112,14 @@ func sumSHA512(data []byte, length int) ([]byte, error) { a := sha512.Sum512(data) return a[0:64], nil } - -func sumKeccak224(data []byte, length int) ([]byte, error) { - h := keccak.New224() - h.Write(data) - return h.Sum(nil), nil -} - func sumKeccak256(data []byte, length int) ([]byte, error) { - h := keccak.New256() - h.Write(data) - return h.Sum(nil), nil -} - -func sumKeccak384(data []byte, length int) ([]byte, error) { - h := keccak.New384() + h := sha3.NewLegacyKeccak256() h.Write(data) return h.Sum(nil), nil } func sumKeccak512(data []byte, length int) ([]byte, error) { - h := keccak.New512() + h := sha3.NewLegacyKeccak512() h.Write(data) return h.Sum(nil), nil } @@ -191,9 +177,7 @@ func registerNonStdlibHashFuncs() { RegisterHashFunc(SHA2_256, sumSHA256) RegisterHashFunc(DBL_SHA2_256, sumDoubleSHA256) - RegisterHashFunc(KECCAK_224, sumKeccak224) RegisterHashFunc(KECCAK_256, sumKeccak256) - RegisterHashFunc(KECCAK_384, sumKeccak384) RegisterHashFunc(KECCAK_512, sumKeccak512) RegisterHashFunc(SHA3_224, sumSHA3_224) diff --git a/vendor/github.com/multiformats/go-multistream/README.md b/vendor/github.com/multiformats/go-multistream/README.md index 08867fcb..0111fe61 100644 --- a/vendor/github.com/multiformats/go-multistream/README.md +++ b/vendor/github.com/multiformats/go-multistream/README.md @@ -135,11 +135,6 @@ func main() { } ``` - -## Maintainers - -Captain: [@whyrusleeping](https://github.com/whyrusleeping). - ## Contribute Contributions welcome. Please check out [the issues](https://github.com/multiformats/go-multistream/issues). diff --git a/vendor/github.com/multiformats/go-multistream/client.go b/vendor/github.com/multiformats/go-multistream/client.go index 8f41eb13..9a8f15e8 100644 --- a/vendor/github.com/multiformats/go-multistream/client.go +++ b/vendor/github.com/multiformats/go-multistream/client.go @@ -1,6 +1,7 @@ package multistream import ( + "bytes" "errors" "io" ) @@ -9,28 +10,58 @@ import ( // the protocol specified for the handshake. var ErrNotSupported = errors.New("protocol not supported") +// ErrNoProtocols is the error returned when the no protocols have been +// specified. +var ErrNoProtocols = errors.New("no protocols specified") + // SelectProtoOrFail performs the initial multistream handshake // to inform the muxer of the protocol that will be used to communicate // on this ReadWriteCloser. It returns an error if, for example, // the muxer does not know how to handle this protocol. func SelectProtoOrFail(proto string, rwc io.ReadWriteCloser) error { - err := handshake(rwc) - if err != nil { - return err + errCh := make(chan error, 1) + go func() { + var buf bytes.Buffer + delimWrite(&buf, []byte(ProtocolID)) + delimWrite(&buf, []byte(proto)) + _, err := io.Copy(rwc, &buf) + errCh <- err + }() + // We have to read *both* errors. + err1 := readMultistreamHeader(rwc) + err2 := readProto(proto, rwc) + if werr := <-errCh; werr != nil { + return werr } - - return trySelect(proto, rwc) + if err1 != nil { + return err1 + } + if err2 != nil { + return err2 + } + return nil } // SelectOneOf will perform handshakes with the protocols on the given slice // until it finds one which is supported by the muxer. func SelectOneOf(protos []string, rwc io.ReadWriteCloser) (string, error) { - err := handshake(rwc) - if err != nil { - return "", err + if len(protos) == 0 { + return "", ErrNoProtocols } - for _, p := range protos { + // Use SelectProtoOrFail to pipeline the /multistream/1.0.0 handshake + // with an attempt to negotiate the first protocol. If that fails, we + // can continue negotiating the rest of the protocols normally. + // + // This saves us a round trip. + switch err := SelectProtoOrFail(protos[0], rwc); err { + case nil: + return protos[0], nil + case ErrNotSupported: // try others + default: + return "", err + } + for _, p := range protos[1:] { err := trySelect(p, rwc) switch err { case nil: @@ -49,14 +80,16 @@ func handshake(rwc io.ReadWriteCloser) error { errCh <- delimWriteBuffered(rwc, []byte(ProtocolID)) }() - tok, readErr := ReadNextToken(rwc) - writeErr := <-errCh - - if writeErr != nil { - return writeErr + if err := readMultistreamHeader(rwc); err != nil { + return err } - if readErr != nil { - return readErr + return <-errCh +} + +func readMultistreamHeader(r io.ReadWriter) error { + tok, err := ReadNextToken(r) + if err != nil { + return err } if tok != ProtocolID { @@ -70,8 +103,11 @@ func trySelect(proto string, rwc io.ReadWriteCloser) error { if err != nil { return err } + return readProto(proto, rwc) +} - tok, err := ReadNextToken(rwc) +func readProto(proto string, rw io.ReadWriter) error { + tok, err := ReadNextToken(rw) if err != nil { return err } diff --git a/vendor/github.com/multiformats/go-multistream/lazyClient.go b/vendor/github.com/multiformats/go-multistream/lazyClient.go index 311e2cbc..f8d90018 100644 --- a/vendor/github.com/multiformats/go-multistream/lazyClient.go +++ b/vendor/github.com/multiformats/go-multistream/lazyClient.go @@ -1,7 +1,6 @@ package multistream import ( - "bufio" "fmt" "io" "sync" @@ -98,7 +97,9 @@ func (l *lazyClientConn) doWriteHandshake() { // Perform the write handshake but *also* write some extra data. func (l *lazyClientConn) doWriteHandshakeWithData(extra []byte) int { - buf := bufio.NewWriter(l.con) + buf := getWriter(l.con) + defer putWriter(buf) + for _, proto := range l.protos { l.werr = delimWrite(buf, []byte(proto)) if l.werr != nil { diff --git a/vendor/github.com/multiformats/go-multistream/multistream-fuzz.zip b/vendor/github.com/multiformats/go-multistream/multistream-fuzz.zip new file mode 100644 index 0000000000000000000000000000000000000000..c4158f48882fd134d333f65a2093dbadf6e3400a GIT binary patch literal 2339352 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

2kA@^=@3V9zZe>= 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⋘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

)jP#ICOb&wsy7f8mB*4YanInw~a}edax2rz`x1M zvW%dSz*UV(oh}}-{@POrMvuzj z0q5t90G6tdZ~12>NEPMV5iUS0%_l%#7QJ!=oAS&5xZO*rdPAw$^4KVWki@sHXoooN z5M(-mlZ&IK82e~A&*bMKq+0GY#n_)AzRHaa;9&6#yuNxaTe1chhb?WbG}mRN-F5=> z!OaNJK_x0hV025Rr(CQCmBOLy<9_Z)N^%IPiR~7n7Y!$*%nYhiOOm-Y>NKgOCiZ#A zQ!USvJZ9)yf73jvGRRjqsJtjq7kYH~U4$qh$zKzThfk?iwo!F3cssLEXtf@zVK@SU zj<_ZLkdb1wjxdc4mz3?pbimEGM<=ABU;flR3 z>nJmMc-u1pJKs`5*}$U(?B-feP+fs@$P_VPu$Bdh~e z@;s@Kh|!#r2~QTUJS)wBRw0B5pNOV9X*7eIE2+E|J0V8jAHu3>D6NSd7Ne_%5K`^y zS0yfOW#ga6#&5dBSlJLls@@d<(kzIJN>li-ye@>mau*?NnxoHnGv{Dj+2L_z=#16;W+6ie>V5csD*_kyoQc2_jLPGgejvug!29*_j!q-YA9C&f-$Hiz7Uwo{4iL~5B zNOP4Ml=8*s4P7EynbrP0< zRrFo!5o7yK!k)91#pvJpd$uqE^*(Pfr>t7LPOvI7in~p-N^JRn#@egJamS$V{}LSA z#kW<|J_R?y-C}g9KpY#Y$-?F6a&)7|4)vwp;$@2si9*L;0Z91aFSC*Gt$s8q#+*xT zNq_DtC^@=2FH4Pd885lbD!C6!-nQFO67wJPl6LaS)mNoVz0Q|1^)XlAE9|?!!~pYG zCCae@^`ztG)Iwq<=)LkIXlcf$j+Vd+XW1C6j#}vI`Y}-Q@4K@5Gce3JJ;^%RIIrLsD%}ktEh%?szTiF!^}_gYeh#aOvxzZ$YV+_2ViCt(3eN z@`M8_s8FiG)6>QJ%gT-wTk1sD)#|)PFP*xT=9~nf(l8+y!(+%-sZkgP@^C8v6G12; zTO*R;S)%vb4r-B-SX^9krVH!|AiEtCI>a@5i6}q7w%yciwDBl^$rfw)N>tjz&sHD~X+xhMQWfk4LXuaX#reo$n}b7Zp(PSwrO~|` z6SC~UGMFSZ0ct`p4S3fzbaL~P*^He;r^G$0i<1*G9(OF$ak6p&8Qe<~3YnI{#K z@F1&S#&i>a!v+ZBhi=qfj7GhK9gbqD?WI}E+DG8oM@0EfH{$FxNG{>M3rZgSj&?JB zjs}UTAY`R3APVVYNDy^wvgFk#IpN9!umE~Iize{!l+B#kpF!ngq8Qu6P{X@3!@msO zanJ1+u}OjUd{>0eYFy~~#k~!;g-@B@xG?{hcZ3H=7M?UUoc|Zd>Y`PaeU!(O`78L5 zu9xB}>JD&2O9Z{!2S9P|-?D+?b4Cv?F5}DZO5=jE_GBd!!wcIiQl>YRW?}DNFm!yV z)Zs%4HntWrS&EcA@l_7>ZJ+f^Dt8T-HO}^~jkSmVPrtkr`n7V0qhFwv39^1Y$*acd zcpk%Fn5LMM zShKyumY2h4pLJw^_GEe14*T#&DO2BmG4~hZqX0ls3#f0KxcJ@-E~2&+Bo`)d$ZLK8 zDfyAn01glfOpIN`i(70O(rC`|C|pKXm)a5xBt+bP5w87?Y#OUyk+q&rB84B>qvX3+ zWKrXLuw=3$yW~<{((;+suVz#5!9^)kuV(-L#^(LKi!#uSMeN2g(j%n_W;)B{zag9s z5?PHgco^k1-um7&)jG)!!HNHxGEK;MV9%Sy*SvWljOFa@*?`jaBggz$8VH`M?rw%Q zkFYQKibBLkYyTQkA=W#-5nFDS@Ic-{09i@Ih4UmYTXn#JlcnK+{%$>;qdzeg1TQy^ z0y|QO@vh<+uTGj` z!8@$uO#L;~dERYJrCpT9N7GrM^LcnAr z8W*Ea0~Xl5U=r1?HUnbIPb4rm%i@=qlyhbFngJ1#z5{+TJ6<;?jTMa zvhIobl10wshat?tT5Lus+zO{Q9~<|ZxPa_&@>}+Vp_+>R;Q?r6LfPFAacLZ~;-q;d zWR)50j;2<27RoAOlaM@@^}PXUqt_KsgAaSFr?yw;c!FA$psb_Hr&ReqsI)RH-pQe( z-U@2jR3}w92^Oo%%M%Z0@lYBMAqds$<<7kH_;nJq8tqj4(C+X}u}*YXKZ%|C}Wrm)T8 z0T`35KFAlhMsXjcW~;F$#bA*G=8lxJ9&F5bH)WcUWBtPepdZF8lidyxm##Nvn79`z zC=dRCMt0VR3%X6ST3cXND=FiWZqzw(P5`zBLYLv;ui$1tH>lq%ok~8?`l1}0)|XOc zo%tcC9NB!>`iwNM51z-F_^MX`25x^efU$-BvSHcy@LSwykd>|vLB)9LTa2gK#ARh; z5_{kn0;DZOX(bjHf4#0LBLMQy{v=B&xr&pLxQmb;MzD> zAdVlK@&f`+d8dHX%?ldFczAHMBYaW~6VfV}bgM&f`U+r1kd82Bn43H@0#f!6eh#MJ||F$G$ z>O0SIY8j{p@~&GNavMT}S+N218;Ub#0czk{m`-qRn=DnPrx<6{*qJg-WtZ_fr@`!5 z^1JL(WgUi=Vz6f#>$**|Dq{8v4@9+@vEgfY;I<#UjSq6|2hZb!Jo~|;_`qvFhxz)Pk<}a#u}xqM(Hw|GVUJ8xVt-rYzYHzWL>H9kr7Sy z_VkyIr=YBPg(JHNUjx|E2hW7P`F%25SLnGQYj3VRFJ1Gs^d- zb+`zmV$BGWq1TPga-o`*ktRI2%Op=0ZjVhc0kVK2sK_uy~|l)QaIw&Xc7y9Zmab$V&OVmB5MJqv2wWE8WiDRs!^@p`nM!yiC3_rwDgb$P zD1Q~(mc6R)Td#&+=xExTOWEooL<=3x@K9ehaaM8 zcND*Anq_gL3!H%p9U0B^oED2cQ|#>EAhVoz8i3Vg!?CtQ*(z0?ix6x3AQWRwqs~p4 zdbBuY>i6QOE+=;ap4?eb-q2?g>g;+{c!@KS=V`zKl5N! zeT~=$t4~>cla^td1u0+|4rM>|>8Bye^mA@qys2F*Sb}nH0au|GEJ0GEt(6!#q8jAC zvD+N79NQFIIM1u%@fF1UgX^`_0nV6)_1id_x>r}C*^Q{FW$e^NH?joUI2HD6*?LxTFmcRgk zx6|JSO8|gwegvqwJyi3X+?u39(x&&K z6|w}p)4bD>Qnv=AQ;0rt5LY0D64;Qu3Vhx|Z)NPHa%%ahp(&BhHeB)%{nm#Ff%J)e z;ltkvJ^e>}Mra!LmP4a%C4mY`_4-w(z|vK2$)>qKJ}c#PIJ#Rj(O*HnYxmmh51RQ07z(O`VW{_q+r7q9Z0L1j&T#$G;VDyp_tccBzXD}!H&C$i z8H$}!)@JJ_FF2DcmAS-MZYd^ru;y+Zo-&g!>Q6=pF~+7c?Y~Cf=AB*BTkIDl!?4tv zdoQ*85FKiRPoP!X!tvq=A<5^qZ0VbRa{uri`6Yq-eiWFaSV!n8sy6Dd36)OtEVd#q zT6TU}=Y>DX=m*XN_nh@}TQMHI&6^$p%-@L25!|z|PycWx3EA|a3+cl$0qFxI>d^2S zsazyOJQK?pDsEXc#@a*Y$g9g4Y%CZ_<+%-D$p0u{_gF`00F|#KVyuLXSZ!)%WMR$0 ze7P$}j2*!$=2Ep5BCNN;w%gYYW*GvC^~(j$3d7aPq^YiuR>6Z1A3C>?EM`+sI*l9P zfzuY%#a$+c@K`)N7*ySYb>KP#n(Uk=M)wlOxEQDvan&>qG*T>ZDFwr6dVt4`#l=UO zxF9*DtRp!XL@B6qeF;@|LfVlf_yjV_sRHAR8-#S={JBCpaDEd%0BPWT5WW0;K|u1b znYV^$%o=(Le3hrQw-kfaAzIf{Y3aplOA zsW%l`NYp~&;7wRt){z`SAz!<8qd+a!^jhj$H~&Fy?Cjpo`B=B4SH0-qK!GZG&|K6> zQ%m@n43O0VLUgqsP}Cw4T599=G=Z{di&yU;gc$d*nUUv74b#ME6W=#>sQmZ~y%Txv z$l%Df#XB?|(O+vo8ccMT-I2{yM*XJ{iuc+lt4-Fe(VeE5{Efb0FbZ!+v%z~eBSGg3 zNtxh&txtY{5Mx-X7kf}xZ%~TMUpKJzp25}|!u8I@4y409di26SI#_^G+A}{GwSosT zx{W7HQPX;Ym})7zD7^M*enX9(gyHw+{9qrTUEpy>kzDAq({V zO2`ioMgKDxlt z1E}ddl)#bv&YLpz3x=djeOLi9QBvIP!KjNAmRWRN4*z2r%bJs#tSd zyo@8E$}z|YZ0rWXkl%dZyh%83RsbSoa|yS;q zSbOMf>T8MGSkVoW%Zzvez6TR-LSc^P!e^IpP+A+|)ooZfIn_@?BVC2z5zXx9q)69bF;*=Q0!h%L?PByooAa@w<(~gymKIA4UrN{5 z*wj}LmKyIzgQiobH{PHB%R9nDBKMy(72}Q8M|X=+%Xn5Z{`HV+erz+lS#SkimB#519!3bCF1A#8Dyn71EUg^;>Bv-x$b(nzrGEW9fwTCCO-6Jo##CK$_wR zFUf96`Zm(lKRf_t6QWo|x`v2L6UOrx1kG76s~Y{UGdTyCwf?WTdaOUJDasSdCX^`p zi}GzQLX^!^KGt89?{V?GSK8(8KUqMiI`2{sRYzPZce%w_DI9YwUrq?|M-Pk9p-epS zM^Z)NLthAl$X#x#jSOzfBkvAjE!0VcjOdj@5LPkv7Qo}GmjQjnrVE6WwewwV`-PV1 zR}27Ja>JTzb?$XToEn^Fq=OH?mQ8Zb9n!mIP-Mhw(g29DTqv&DlP^B>7heK<&JV-e0>%x_e)l8BrEr~mx&$2 zj?(iR(GF`JUF9Et{g|iCU^P{C&?8^b#L+V$0sE+3RB5BicH`ERX)>8JIxc0JW$ngw z5VRsyH0x?ecA{0@`I`a~R0CHq5V=C`atD=GBNsk$Qzc~_W%N)<8Hc(}^F2)GH}aNO z^N8^}ql}skSa=a$%zFtjuIxSmJ}Y-+(+?*;Q=juXoQaT)n^f8hhEsx)L{&LXxMYfX z-6l&jsBgU(yC1l=-1|a22++raAk5xx-Yc*iN(aT@x1I1woh;F^!^s?Kwo+fKsEvgB zDh^WL(NHp|UR_%4Tg4g+ebO9I7eiPwxwBtr8`~8nRDs->6;dlB@cN`2;N!g{B&h*O zk~>}VPj&FQc6*RvHL2+X@=~V$>;5TIkK{S^ONV$Ebc#Y=o#dy!38f)#v-)sam*5JG zJps*ybN5}}m}Z~t8v__{E$#gN;$N3ubkfJxxgv`Ck}F-_wN&L++7_G&ENbUyiEV}nad&*1MENmLY;>@lgM1a>xjLyxjDr29Z?m`v>^qdnQi=Za zT$rTsf6YF=y8on^clW#D8-nT|#p)r+I>SAbuVd$0v~Qmo{k)~wQn?s?9vHHTQsk(BXL6CF1Hz>| zG<-<3BUtm~V=cM!?;S$q142_~v=}=CQNL$Qvl$za=SfAL`QEa4c3Fsiz3lZou1>PK zi~-La1ADik6k>+7C3oJ*YTF> zq+;Fe0tjBXHT%%#)Pc_3^*+OsGu$atztLr}5`A^#cj*@O+wUO6*w&N3I>Xibd50~2 z3S}Kh4(8c=z~R1Vap$$EV*< zt;p+ss@S>N*{tZ_69=nA(>&0?0Vz|To|7{5i2{?q3C!E*7qbz>J~mSq3C`053hDW# z>QCV}yI#y@ir(mNE8^Ueej7vI$6YB?|C0B`%j080b@KfsM2ziCq2Y!lLt2L%_PC#! z)62MP?QvVlS9qoBL@y7g$o(%$^{>qCUYS7`a!!}MkUet4<7C9nXOw6^o2oNN%7oa& z`jf0mE%yQE=?k1Izs`o-WpmFK<%`<*R`TzMMwXbRPG8yR^A^MqLY?77Vu+6Uwate9`L7{C^zq72&krZohO z>)A4ffXs8RLwJ~xt^yB9HaWQLNuL0(xZ`$0jEi~%AkG>ek7wzaV-yD&Jy+Zks3Lt_ zk%*d&Q}anW0v)P+#g-ci53h5DE@Cpm%nE9@u?@|$mC1VqDzqVA2stJksXT&+^_+3e zwqWmv-p=D$0%(gZwD5335TlO(U7^F|y{AXI3g=uC=^8wzB+^w78XoBy92!97IHJ+@ zRF3=YUw9t3KGHQL%!-uTFKVq9C(juk=^6@eYwfq?*4tqrG14_W{JY-X(ySbpS@Ziv zkNLH6j(&zUJQ|CK7r^uM*g|7jljlQ_7*_bj0hU5Z4O%uJ5MkS%x^%RXbh;J(@h|@E z$IX~O6%Ny3_Xmh`(a-s}73fo^5@MwOUHtfud&nmY9WoK)3&B!iX+v-Nrx%ioK8DFf zJ3>FA>eCn;XXi|vs&9c|m+#=Lf6%FIRM<&<2gSu5oF2?|^2(qO(Q>D+C_rZALg6^W zOozYD<$9RhTUMad;$a;D5`2HH6&F%P1s`a0ikpJc#gQ&TwV_4uNui|w%7rmCFRmbB z%qtM0KX()`-@rB5Ozesrkg6LXLa1BPry)K5WLdTvTg`E@v6WaX^5<+!I*n1NH?Xym ze|U+ph%13=soG?P{P0t?c^em0%5?!tfBAg2C|s1|6hJl!(B$hcWJ}fuT~0~k1%~pk zI^J#SqmFiSEux*WUyR*nnr0G06~XRvE{ZeiBY&jj&NLm(UBsHZ1eC%IQ$mKCa=oex z`v1nN?76LXWzMY!M{tKz=7-dJ7rUGT-HT-U(`U2Ev?pVrYe>q}e|)Ul)cx3j@0@Pv zXRr?zqpozy6he%FCzPKq%*mFYn2Z4-UtEMoE7gYHv?~+-QHw-<53_}x^Ck5?%vN>w zCv0oX=5qYQ%keB_bTXG<=Yy1UNRjStQ$LjrsULRW$miKRrzY8rMyAJ)_1ORLN+0-BLX4K-Z=)%&jfT-)w$Vec@om&~ ztj9L$_XEuTOK)cbz{qX@fGHLLynhS|j(<9P8~t#++p&%QfW?g0v$xUvj35+YYmff@ zKiWojeh;NDVzGOk$lfu zeLr-Y`Ulv7-|o%cH$!#4Z=UGP-Zw|TME?I~LW~cNXY*qe`Dssc^WlUm3~7^)eHB+y zVR|Cr5m&ZTtx%xa4LMYE3sm#Fo5hv^&0-5_#=pc~PyaS?B_@?!pIQAD&V_m@XKX_k zG&^c$pEDV`ACy_&+)U*-M&pJ zY-T^O=ZkZD?^WF18?JKYPj+~jfczs?NX>2R@S-{_3JL^vE#g;DB5G^V22Wdfz+r-Q z=R$%eSlSY9qPGM-quQYI&vP9?Vl}K5phzEiCdZ7;R2{VH`2xiJ&qMx^i5{xn?4@dd z#!)SLg*{U&)lC^SH`61#;b=$R=V3C1<#A$eg2+>4yNyGv8GeGX8XTY8hpK%ahm+vT zR0Bp-R)veXJV4N82*r@e=X$FOm%$$2Q;)>CD? zmBM4ZSFZdG)Pp8{@Kv6%g&P90d;Ppwgcxf;9rUq2auy*;$hSnPHuB<^`Vl*eOd3tV zS*d=mSryJ8aLMm!Bo z>^D;@!;aF329S-NX@d9Y0lws{r)9g1a(=Q`OF8(WqaS2&-y~{Ja6N1-Rr9w&5Hd@* zjhW_}i5E6>7b`i0X>Q*}#9RQjBdbW}_QEtITqG#;ug z<&I}{l2`Y*xFw$$tuoDYL<~Ey5Ffw#D3^)O{UkRHM{1oEfNE|V%b_-!Cs%%74|BMb z_X5w_^B{Es)oul-nvt#;r;mwBS|dTon4-F$hOkRh573-9k<~$;e0700sO8F^=8_I_`QS}xARd$7=c`V(-+=B7&R{L zHckEAdmYoGt!C4s|M6ZP!O~VUYq^L2!MRT`4Ma0=NPbZ#73(_-P0rI`ZU9IeJ9O&v z1w^iV^(MC2hfyW>YKD9&teRb(FOm zw?ZV@%vXA>9hjO_Eg{AoUA_8OXi=%&wCK~NBG4y1q)%Uu!m|Zusnpb`rGNpO&)1v=t=)krDN?%m-0%%=jT~oDZ@z@OB@oS z=?blid~IU%@j--$Ew#gx9r9V!f6OtLSATn<#u&_qD<_nSE9*PtPZWF>)78haAGn3JFeWm9>BnAvUN$$hflhWH6}KNwh|rAOysfb<#ya4qgFq z9yCp}uO)64TPC2EeX2mnYBpeT<)lj*_n8aXbgZ0NDts@l+)ah; zFbB7>HS>KUF0LQQW@gm)$|0KApFmpSx|kEqaTF>+-c z$t%$SS-VMKKgt=pMep=FsWiwfo`dR(+_(SZpt6@L$AZd-HA)-x?V3-iTCtsxT6yMx z4ANJD8a15KMaTG*h9B)~I{9-U`}vx3h7CJYrnwq^J(V)e_u$ua-KP02{JOon?`5he z6k}C64vYh_zw;&ip+oYL;j7j5$( zn{|MbSDh2zdW#iP-Jh_f0?DWGOB^Jeeqzdm!USV|@GNz*1OZ0(u&*vlFl?xVB#(aW zm-aMrXLr?#5R@~ZJaAW9;Hyy|HX4{G{6LlvGIa~INOtX?*n`?#ppSF z$74%wNq_vH1CQb&avy+(jF#>?nAy@_d6zSnEjQiLi%@`13!6YSm~eyJD6bL@{Q`z# z8i2dPl#@$gCe^x4?zG3i2nn)07TBNItefo^66GY1^`*Mg#z%Wj0OHz*nfBcBG<%gHWo3PHltMr%KWDkO7SRo=ZCc=NjhO0Z+;S z1bj;x0R!bx=Aj(i#)aNE$HG&n>Q2D~98UIyyk=0yk;}vNQuVSORJlyj|H?m@!Lir` z_$GVAW5PBTv$F1iDG`QmtV?*(^@i4aP%RR|#0M6~?bSDZZ=s*)7Sf}VLZAeCEa_Om z8CfgX+W_h^1`z&f&(1#-vX;xA)n+gOp`5V3z&bA^V!bByKSz!KzfoqzDPojylSV`! zq_2-@tUZ)VWASj`pv=8ZnpMF@B$nO5mQS7P%GV9YGWhLfScPs27!+0o*I1M=I3-$~ zQOO;=5{}Uzn{E!O#ct$)WU_sHwL7VZWAJ$ za#cLfx(LSLa@>{qR9jH&kC@(B)2MvZwP2mtQa4c09*FoO=9oDvSVJ!D=1An&m^m-W z`^CimeEG96iO>4=Kg1f`)Ogg)BV@r6?O{@4nvGrTPF(bWX`0~w%1UN{DGT9yLvoh>O2UnI@b}$Z>aOfBKv&{l-S;=N+jt@)AU4ppiAR$CaBs%-aZE=Pd zy-hB8?-;o~(li0TcV&KWddckID(En;#3e5JJ+CBRZrj5vQQ8t+{p_0LJ!9myNYhvs zRGH(fQfo@D+w4D7nkFH$U$pAZnSBkbcd*=cz)^3$T`%_Bs@!^<1Fg87t?2z$qW?t; zTsrY`u%$aI`Df4bp{v|*KIGU!LCM=H01+tyGwg{Ts?I8=!lAM_gr0Gk@#(&+%V&>o z4u~t`HFw3!uTk?|RdSaQKFc3H9Lj^3dC8sCYRK!kP7S!c!BMR==ROZr?(-%;tCG81 z;kDK3Jg#`guCA85bHiuKl@GF}!~LmJRUA~>lE14~x~cM! zKJ*sGT6~vGvaiBt%au1mxqPZr6$O(WT%5yno^6AQAOWr!5r$*@6!ml`NLMU%y$4sdy@5rvarmo9z)3;{NgqA$T zav@yv|35@|b8h2TKnwwC7WPPa1%DtKD(m4o)zQM}9F7+<* z=U;Q>^jvw4MOkPDBMzK$^!1zhT=NwW&_lw3|3d73iY z?8})4Alw4*6J){9>in2rv5n}Q&Q1J^CXzDobbV!598J(I?gS04A-Fq17D9r%1r6>_ za9y0>?y|VMy9Rf6cXyY)``&whe&3JjnVNZKw)@m{@9CPZD$FEPlYP0fE6J8+cL^6r z@+mDP{%>C2jQ%)3jG)OQFkVA`zx7L?zuBxF%RNX8DTwTG|84J!Sjg^zPO}-K8+vno z6d#PG5dG!JBG(MC;n44!Zc)fwP=UftK8=J(N5kK{KKv+O57;*`K&IwTdn;$Sx#O!v z#2$4|bWjXyu3q3 z^8GY_RZS2-KSu}_?n>}vdGumU_TpOxEZ(c~1xID3w;yYmw#{ANF_6 z_T@%K&=a+1JwI?h^Zrh%t7m9F$o&da?(;+ItC+ViagM$=&=BaSy(W~z8jHm9F<$*V3(*#yF^LLOx~CIQV4L9?dV&h$en@?F?dG0p{bt->qH}&f78qiN zIsJm0vc%I;@E~|>G&r$F1s+ZWq#g?ny;_bT{iY8mUYpPk#{;Dm3F`Mwurh#XrRnq` zNgAa*X0;16w*2l(_CAkN=6-8tT360Fa*^rJWlY%lB`wRDpGWrWnri#J@ujKWZs4D8 z^z8yur!5>8=OrQ6j~AN7rgg~f>tfS5SKo82s|HKg2XVc*ig}B+7KJ?Z7*waa2F9;2 zn3A=FB!+%=G7s5IQhCK^RU#{FoWj!imDt!p<|=qhzplAea{QFBXU>7ABf@2|Id1Dt6>B zsp2CPxE$V5$7JSO`l4gwq#EM+X0J9!@oI~VR?4bLe zc8$bGX1K4$=YBR}*gmhOBi?+l41oY9iZq-|CXNnVdV%`L?MI}49@j}~xM5z(=1CSe zMFSwWN~)^6Ea-zs0cfJ|ov!(>ty~yUG^vwdZ%%j`EV{MeLfv)oV1VC&*KZt#kzrPX zh6d=%FXgJD<=H9TU!Q2;Di0A{T1ADGUCs?wXfh0YMy@c zn?%cSZCuHYh4~3ABu0%s370M8%bCO~$H(6I8Vh_Ep6h71ll9!GGo-*Mv}_;?OK6Lg zN*2w~GmrZPfqTwxT^f%)i&QeAb3-2dhVY*ZcoNdO)8Ysvt@pN;G&OZpF!t41>zB@XSly#GVnP;pb#jUZ8_6gIoj2~{$>9AK`_?)6s~FDS6h-2L zYIvk$XuLCAH@uFBt}Bh}MY<}n%gY&usertaNxJ~Cd%`lba7(1G?bm&P0MebTOvSTs zMD+fxr&ptL0wKl3t~v#kuH}uQlJokFH&-^X>+}FzYYo z?6w_o0_dMSJ6zf4BR-#sFHK}(I|py~)2hUH?9L+vsajU$uAZiFYmGBcS18*DCxYK? zTLr&h+MhvrFz9KAV8SG7{t1si4u*C~!sr!5SGr_|f96_VEa-rj;c|`d+!5=n^nsl! zf|_b%n-cid5Bq+pMlb2@LIZVvD!w5XtW$w5lR*}e6l`GO`~&TM$=AQ();xkj1h#Ub zz;J$qRXS8C#`BWdfYDZXtRHRV8tR->#mSuZjgf3+8!Y|ZGC4$~Y=WOWM_+3!G|${; zM8W={l%LpL1wAAm*W0zyC;*^UlBtxeWcNEn@yOfx`57rFE20v7a&+C#E06Ou@aDuc z*-+ExQ}<04Ub#bi??h;a%~`XUb|xZHN`+^IEG1CU-1(0e0u|UWf3uBLNVZw=UQqf& zjz8(mGjOEKoN%J%ggLjhP_%0R^fu$M{ZsCt&6@Rfz||A21!M8S0$rmKuofG2)w0mC zN3H3-N3DI>gL-7!J9Bk9q|pDe%kyhi^Kv?8@*wnd@&_GXxMZjKi)=(PIhSFxm@4PR z5vO!C)*&UXrF3-{pGW6jbq1>la0K-n^MJ5X<-h@pHC~mZLFi;=^_6StlrFi(vjk#F z8qnB2jPp|zsc4;P8GgWL1&o^uD5Hu$5++53Oo-9Vk^SzZOWL&1L-yLe3TGJ-xwpvm zP}2i_AAuH*Xzd0?UHx;hu8pDw4%0AcdU_qxaY)Zq0fQ8eVl|$8aAfSfvD0h($yL_qDtE?zgK(1VHw>=}p&iD}`q+TkPGTg=l{0xa(njkkprl6zgZ)dUW6W z)fF~(;%eDr?bUdpDY#?s{08mSN*+nU`RL4)Hf*ZpigfSFHfmg}?07hE)S zOpxJqAly55Q`;mR|0V!2M^QWO5}0T%ILbowakX$$EUzWWfbtUvBE0P|WHw#=QCwxA zwByS0?17_6{vEgTE;!g-gAA5?xatp0U;-kSh0t@~qFt$Em5(QLPF8YX#cWVV^$#b! z5Gz-YNpo}ivz{4}3AP&!R2pc-$@G7iLOjL?~$6#s40Ezpt!-SkU><%3+e32h;1Bc7Oug3TU% z7_~zjs3DV7kT+HLlW=zR#SJwxg|n|6dD?p56p9AhFFMd1u@-rJ(dK5QrfOA(olu*; zcc4$3-1*KjXVLHvh3d0M+^tzIOBap+rLH_WNJcEsfAL{(2{F5CBRal{-6&Lc;pbs) z?Pg1;?XhhPITfmtUUaG+Jgw&WegBR*I15Gn$&~tj9(K-(e}%l5ZDP#>|KE(!^P{)c z5e|`Dz=QJ}iR0~Kgq&8X-gl&ez>3sH#Y`gwdrHE2jI7XN3+f&>!Gjmgk>x2khy{YHTOI75of`tZlIht@?D49aw z1_BCwpWP%`&jaDS{H083!ADg6i+S$DQ!7+hO5$8{ z?ZFy9Xn}0id;Tf33*_p5lEzpjPp8R86vF${3O^a(X?po~**j2e88?rx28}kA7T=51 zT&XVEc-9zass$hJJ$p7Zlp?9H1Wsrva0OLl{#^jHYrrzucimU7?rUmTQ<4n({|f*s{WI-D)=Xo4K7DVSZFR85mibxQZehe zsJ(E@!kv2^sRi>=+gS97Xt|bqG1`7My3b*}X~iw@<|`0U)J4^saOa);G+AW3N6N5j;}^93!`!BS|o$LXNjf_`ciKR+}wG7EF6XQp}`q zeNGRRk*Dr#a$l8_cv__r)0%950kl|8om$Y8?Cd94G5pBUWZJGv^0dYLPm^WK5`R-! zpS6+LxAA!HS)={Xbj0*rBPHmHAE?8sFy3ka?7+D_+)Qp5=uB@ln%~GtLWVB)9r*#K z>6l-%q`&W(esc!5C6sGo8iYy)o|xpHv7J=&9Ye;fPs84SY0nB#*B-C`tvA#2k;pu| zFc}HhzWm`M^S5!^QQ#uP2{!hV+ZTrI5AJptjpTQzK1Qr zQpK6oSXZ6UO4C~7{!Ee#d-tn zDm)hkLKC;fS>eAqS;yQ{j+)cjKUwU*|D&7eU1lk)H z)2St$a0KRaRX5@kg2s3u1xmZaAf`O-WCWW}$*a*h8Kg3K07~GHglbrqLxayu< z&x-v#JIwQ+i%d3{9F!|hQ;BdZB(SZ2B;6fDW7lt~P*GUVv!y8`CufF*xH`>${j2-B z%y+db4*a5+4g$wsu4B*c2Wxcuuc5PuS)lk8t4Pz#VgVsYXop>Nu}>Tk zd=J_PHk7dA#tkTLX+$3oTU@*MPJ3D9ec@`@Y5-83=w*c|R%;LsZSb)NljELF-7H}u zJAy)TfYTP&544>Zpu*-Se`}$gu%)s@rI1TgtiQHe5`%l4J#n}1B~11Ja~{;uVR3ob z(8_WAbk~^dW~|^DE5Tw7x>T~|8F%t&-VSqlF3Er=BZ!&!>B}PBuQ$lTkqP+oSw$okgSd%BabS5LYk;V~>IYZW^}HH~dLNoM&(>m#0?{V<0s zKMYVrb1og^RMe^pw+r=ADvvM3k(gUi81smdMMq2W_r;P8P3G)0%W^!*1!eC(ovjV9 z((xH~q;0~If(oiiRhE>lzV3!swe{g%M(4=@B)V&8 zx&Bd|-=rT?WDmyB9=aPpQuellARUsWftq$-Qzu+LD3K|-ROqKn`FXDajOH!8t?4_ z6y|`s5Qd-b!F=w|j?rU<>;2A$owL<3d>`LVu+DiV^L$VOK;oFp38T{scV06>a7S`| z-3P;_@jK#*=5!6t0VUSF`jx2YW`Dxnw{ug>f!)({w3_wZJ@URk7xj|$7|F%RQxFV>?H?4#WivTtGa+jKj>;Lz=PZ`}_I3=Y z@F+#E~M`lUC9RB@c8!lUtx7-DfMC=3`IPq!kAn?R_^U zo8C@u!3XC87NP@Gl~rZZuG0ciJ?!J-aZKTh%_gK`1C-w3U_yeHjugJ&GRM} zFZj`xi;adZ$1(b6N#LO=1+E99l(*TSZ5MuNol<}GUmSBe`7XQ@#V$Dsy83S)uiJEcZI6^TR1wXWuP%tz zP%jP)IC@;E<<0Oo+kgsvZVW+%wz>BQLe@`Ew)#X5yqFZTaDo1uh-c)TQNfR4nbG@i zTm<9RDNB1N2#Pi%x$BlAO{>Cgb-r)UN0qe=v~cY{kIcQ27C&N|JpD`=f!|@vn$a zt*qG7(R~~Xb{W%ssBI~P4*QN!rw0tMwWv?t4Zo3MuQo#fixz zVaeOGjNpVs#@!0yx1iPRx8ioFiFQ>B?1(cL+fn;7;^NE86R!$2})tU&oKRvH>Xhhms{)TsEDAI z#(tg(xn3u@3h$i3Y`mWg!Bh(n#;f7cjKtC#$9BJ`-kE)At9-JZz^NC9v?WgQ4`4cY(onVW4x=d&4n7r7+rib2gUR;MXt46tz6}bAgFL`LFNw z*G?>Evn;%tBHS7i_Q;m1G)w&ypEQ5PD}K_WzXFAdd)0LmqXKvWs2m-~OD%bZbkkKd zT(fc=d*421b=k^?U7m+NFvdO4AMifM3TpexxFrnp8bWyAi;HAHx}B2%6FO&pq0S}% z(9}A5*04`zyVF6)eC7u8=@K-G4#(UwzfN;GwRU3b*suE`S7l^wac*!aQSBRpBF3iE zR;_BmcRxKY?``bYbKE{XT?Alr^l&%NFv}(`+%C#U$Ar&>!zgzhKMA2su5 zaliY4sX&DDjBsqo1J^~@=mj)S{YMkeY9f!WxIrA9K}?WRZW50zDO5C^dbC#F{&a~?k2_} ziJN-9y4|f!`#{Qv_}Y1qy}*!ilRz??;e>R>OKw4wWQ$ep6pk*lTjL~vXcP>Tw!C(x zycFXWQvZ0k2n%!ImH@gw+TAk9mmGJlzOKT5rft$lE{G5*#5={lfoWm{Cm7pE`+ZOJ zaONku<0FAeZDNK7B@E%bxhJQuWxTS z=soQvx!;>8V{$M|O?y1YUm&K{ShVYxYCfLVT2Torg!Xd&Dxan8CdI0`{$oTcnSGcp?{^%`IBHZT&Ol70vSF@s_vzzaOLEC*hqo4d}*37PK82 z9lyXZfdCjX9=lB@WqLmIRVAq6Ays&Oz*A&Ad)&AWgwu|y)y}}XBvVnz)e!G>mM2Zy zU=a8EJQAhka#;}tj!X$jZc&Qnhy|Wdf3NaFkP2VYpAIzzERB)LZCn8vcjw})9Ygwk zdJk!CnQx$3m6*^%lE3*W79+wTK`KmKCO(#YL3#9MAY6GY^O40^TmdNTzcxh zKKgksleOV(Tx0))Ni=#>N%xHCd<}{M$-nvbF@K~zzKZ!KM5EEy*O3kX&7b;UAb_S1 za~>`;R-L}a=@9WP5U0M4Q@T8CjL_{XW%BsQz-jADF&b>}WVoq5`}{k*L~7F+fG*F? z9ME1n}HU9j0(`QZ> z=Ep1b-GJeO50*_Al%UgB2^Kv3pAEpjHu?Gzo&uit52)BpRn7e@UYeEFPd+-1z9&Jf zHM_}Y8zo!q9R7iAJWF}?P=J$)Mw5A z{W5{A7;@L_mxj3rqw|)y4wvz>MKdN6I-({*RW`7r8gjvb`eBs85o1F`YD^U56i}1U zt|d5$3wv_{K;h`nwC6;;wjev7uHUjF7*bRs*fV!~jl8PW*!tTK6XJ^7Zi*7Rj8ydv zttz#Lm|kp)d$8LxJGn8GloUMtEgU2OO&>Tm78#ofLkununR8*cB@ea*nqWkG{TkqKX}{;*$F z8V~B^K-!l-ZR#x61i8lEej@}^dA#YVI_oC9zIurNojQHV&#{#QGgku%4b{(p@}D84 z;u9Pdo+trC!lDId1XH# z7}5J<;PPy#xCU>vUF9w|9$-(c@m&A%O^oEWW$Cym}G4FbTnvTrms z5y%dlw`-L1q@h^%Vq%61NW$q0nZ4d70Fd;Bg!hN!#rzTXYG#8-v^pqP+qu`@s3R~W zuD2EI(#Rq)Tn(R)_yI6|68cX_HBU&m$~}LhF$W-0pbRuXlnbE#R=!K6=mj@den1x1 zE5XO^b;b{H3I0z9(GZ*|8;GxKLau8#y?P6v$UV6L;R4QHXSn17mcK5a=~4dE!0ycT zfAFJ`t1|&uP)bJsMl(i4hi~Jsz&|zTUb{cUL`8@1?23+`YzpLFIb;$5=J^5h5SW7% zoS6XgxHFazpbflA3IA)Yf-@I@9Gt(aB6nQ^fhQ_J=}8p=&(Qx<0*8`U3_Sw5F^r^C z3maf4fA>e29a|ENm!ttK;78vR1$1o7z9ZKJ6EL0L*};%oMh zYlueflyS)&aRKyMyLlV-Q7)4gQBen-^2flLlQr9u**o4S*LMtsAyu z6xv&Kr%ynR+CMl`zVY&d>wnjP1gqHfcJ9^lY_x$FUl_(>Ilzm8i2UN;6_%41TyS*v z6_(*O7G1tS7CB`EM4FaS@(MhTwZVn-Ia zO)yMi&s3UEplV(%5L48B=Ixo&M2D@eaokFcS8%$BTVnol;WYUngmLs1LNIbuYZ)08 zCelLoOA_`bd@je`|F}ax@3snllktXf2_(uuuEs|qkxDd#eDL8Dyv8~4N$TvLv8^B- zjj0LjJM`!ubJs9blM$A&on9dM=$vO(endPYLjj&q3!5vEei+80t}drHg;*IsU!o)5 z6CV>^Gx5nZQ~$c>yg4*^p#J4d>!q4mcP@g!p{DViJU@l`vHxkqFa2S)ri9e%=lJ$I zF;6*e*u$3lmRNWm?Ll>fB(gRecj-@Bu&*|*^z*n}l6?mMZw$m(@8{5MS9S? zCe&+dP*83Y%4_R+`0#B1Vh8$z1l#Ma^I{4n$_3jj5|+A=o(P?HPQYW<;&AfzCu>Ux zp?CoPDNfjo7q{GywzS~{0OV~h_C^KQ09sEo_)^=}360!ypD+_{$kU~eS#at0F+Oz# zd|y}?PDal3(qvy$8X>o4-N(3~85S5eQrPMGs zp$A^+L$-9~k6lhQs3dRAkz{z8=UNb?-L^1SnZnAx_|uO|uSc&;Fdci}msC%0Fw3E3^HyMNQLsrm>^16XAw$d=XKsFIFo4uNN!H1Z^#l34- zcM=+m3MYiS9W*FI1QB-F?i6VIF(?sJsIQ#9B;eP53|pG$$Dv)Ln*y=m1G z8bMw~UN3K7mpZ5;WY)Q0HYPMNDTZ7RM zKBr_q+1+2_9RZo7b)bKhuPZnrF&beA^-&61-Tfb@blbiEAV=M64y(GpzvL zFiGN1_%hirRjZ(K&R-$r8jY>kgHSQD5@jYOA(dB%8!GlRu|7xOkvN;sXg+qT>X&$F zW93j;hFB@;KLr|)NDgUVa3%hCa2<=6?#jxVd+}*K+f*Pi|uh7;@iza#;D2xj( zIIlka+(KGcL`zx=`~FO2sV2-6|IN!jxt&XyHfFh_4+k>OecS4$O|8vxryLdxqnI7z zcsxnXlRP-&n(gHv{h?vHI4`8dCc^nG>3EUzF=h-nCF^J6lWW%bgX7e^kTi#yP^0ER zTjOA}>S9_H)&A2HSV~@GQuF&C(_NA!M3Fx%jkOtVlJYzge(z9U52=L?wcu&ggW2CnX6H{olt zdR9d~?zcv5kIJF>O_O?3`epYVg`;!EZg1*ueftq&2Bl|h=oWD?R|G)sGZJQZD?GkJ z+mew(i=HM;!}1$+HoRh5+$QYCPa`196L5UKU=y6DMSw7&EyC{P)c?-iOjWW8j^U>w zWi7oYdazXuDJ?GeYU1bLA?ZM7upTHNpMvfpJ&VKHskmx<8A?KWAx=e4H9QD)PXUi+o9ZAKna1<7CB;6IBZ4U0u{ zZG%?h;|0pnC3|F>n@k0g7uOx*8q$>D8i+hUhIC4{Ic=R^j4ES3c z>M<XOtze%{;ZqjQUp7Vi;i+(#5S_M!J<^$C^K}ujO$~NYU=#2N~3Rnjhpl$5213imThh8boL#8I1)@=t5s8n{sXQ@UiQBgW9(vo>)PPjcy z9Vk&IdEcFHD~hM=t+wq3DX!g=g}N^ayW8mRY*7F>lwDBa{4pA~oo6`+4}+jAW1!$Q z%Ioej)a&lP%Y(!&;9*dJ6ziFfp!`?$L8;GVTA4=zxB5Nrg3i2Sc}pp<=Ad-LcwEgU z|4(fQ%P{e=6%`s5yhR#bdpMJQfvw;*?b+HmD=;*Y@+-y0B3fZUy@UJAw0!58>pZ04 zLg>xhP==9`B6^HD^Bq&MEmeC`LY%Zdk{=TR6B+Xtsm&p8?1&z>3sKDPCT5=4uP77))gJ=D8o3y&*Y-8}HQCmHp)^+zfByFse%k z(>-{2g%q6!k}9b)z2-B2eqsIsa|}2-I-Z(T|IVw2+TlgzbYnw04hOIQC(IYxkgB}K z_dx15e-xy$sW`muG(Jb{-VurQ*RtKWjr_It+cwVgrh(Wws{bMpaZby__afPoTpdMAYriccP6 zt>6gy>rFn{&8{WByRKf$;j5+K^XUQh4HNSt-(QN=8NFYvlbjA!W;Tn&2JKlD)yTXLk;~8lnaYc zei7NiI_FI+%!=_vfAheLouVIpBV}AnksU)pB?v@?7^AicNVndTn*wa;>b_oV0L|*&Gh~(sc2Pq(%kS za4$)Wv0ty+4I`LC_1{{qfw!0Sn{~D)n9+ElIk4ZB#F7CH1$(M)Pcq%m3iPM=?_+6v z$ngYrTzRkinVgDUno*pcif-IygKIc6=T^2UD9+|$K5hLXU$a2P(`*`&3d)^|NG$nc zYmUqMcCfc1{l`MfUw8SN@mII?gOxv%R;2mu^KEH@Ykc7?7#zaIUPPM%v$fEOt? zmW*4Jf@1g@9f9%M8Xu|Spnh#Z(SyHt zMjg(*f>Z`HJ!Fa1SdhcPFkGa2Fwpu*X7gwtV+~gZe57xqTq9|;>6Y&f;YnH)rXF9b z%pWBa=jv#x+t`Z2G-^J4l)4HVJolvik?5)8Z*Bx(j$w!pXFrDy4m>S06wC(9m}oS1 z(oS{Rg|mH!ENa5{ubx9_Cu;$$1}fU5yAmax_Q0#I9&`|ly6^8rOOds#z&|b^wBzi( zlql94awUa;60@QNN3I;Y)fQHRobu06QPK*Z>t`811(5iq{}vosnzJD+rb^cHRPNVh z!Vsp2!KeVfQ3QB_;r@x%Wx;N$JZZxU#>cSls$7EEZNJ#B)k@$lqI3S~rSr-swSrzd z!Q;HAjD?^6;OtushB%*66Xk!ko!gM~Nd=~lHA;lSo z*+V>4zr|cLjj+2F8J#=?vu5wq>rnWM=^qDPwV-ytQd|MG!D6X=dt2g>5qaz5kuW!UA z7`vd;A`UqGkt6#znMVj&s6R3dPm65zqXOA{Q1Vc=qB+CvU(%UZI4@QSpEv^xf`1ly zU;ZCBQSEvB&FT7>gmQ4g_uKR!)eT{0`Ytg7;A1_3Xg?d7{l)2Q9A@d^W}4|=FcgWb zRPQ$xMj!Z`yNr}F0xF}PR94j~eNB1mU3IK4%Ucr~5)_c2o`IjpioAUPCK3))WZYij zBw{Fn&&aVyL-L5@MnZaSPT7iuc?*dH;nvycd6%CyMV=F-Fr)gx(iH@wyoM|SAgVxD zqj|R)By?b-o6vt?DPR7f_5%r+z`o7KKKjsYI6lj z({NYbPQNZ?)&nft2fJUVSOc1b-4fun81ucu#a3FL4Iu$LGLFY4WtT=Z%aiL2vwgl1 zP|K3~O_@4hXs6+YM!V{~3n`08dUMkvi?uFh7JK=({~ zQ2)CE_+uHj(Q-ZR_jErwxDdjS0!1o<{)gSgsUM2_qwOzI{+^0^r9P!7TzA#$s$1fb zLR8}v)yXCiw@tQNLO|jq=GN0x0lP5?j+{6z{oO`^)DT}Sd#so48|upBQ&QwT+}FTM zFF*F!8ff8Mk=5r&`7t@mb>g(7txlC@y9KCdDk$H;iM$Af6de}4x@rsj1z13-r~l9M zhp7%eo?6{UXY>j$5JDE$7C5-Df1P)9@g1vw5ELwb_m^dGVycA8H|kW#5^a&8d+9P&8~msAM)!=_<}ip^=SUSxmW>Qa?|oyD9}8sR z5KfR3%9X|VY|*ZI+_=ci?B=}YzZH0VpG%}rWpI7>^3nk2?+7ME?D%+@*FSciwhG8z zq!=VV`Z3B%s6p=E@>D1j7tvIt$9?38<*nu0JR2}ij)2PgFM8Acnj#6>ibWpga?%QC zI3(TY`)f$&oUEAQlO7&nPlEb=;NZMFF1kVZ8CI#e8;LPH4Y7| zj=il1!BMzgVGxYg4YG5}gv~ZS%!(&?x12fn0egMwJ!q}Be(RjD+`|W7M%)#}F13VH z{ckruK4xzeXrX1_BXZr`_oy=1gM^3)PXou&J5k1WX=D6yKatY}jfbS6`&Iu?jps5o z#)l!Ps@90Mk@o9nvEede%3odvDGqhniBqc(b*HoM+lI0tKC+emK(<7_C?d-TAkTi- zu}F(H;p+mFys=M!mUf2T9N>LO8kg_AtfKGuG}_?uZ%R)&AMYUAU~muj@HQyk4Uqox zkkiDNJ99E2mR#IcOc3S!O)f2$G@C}jvQsi+1#EspNVUdLCdhP#t^U`Qk4$rc<2ow4X8b%u)iJdK@m3F0f z@j*cjl{_cf7Mx@RNuY>&W*IZQjNEEt&QWg`*SMd5#~KkiUZpo&fv8q=4qG*2!H+u1 zqPWRX!^xZO!p%o#;bogr96`*PccCRj8XR)!~9-?-`>@S~Pli zGRyZv{@sy$@c7cdvI{lz^HSs_$q%4#)cvs(XrM}A{Q6YokrRA>U-HbiP~=UH?&AFt zQiNCo5c=eCzWiCCiW2#ZTmigz%)Q5VbiWZ2P_SqNe%j1g3L%@G zFY38|O47v_y6^f?^$Lh8O6JbetpdMy$+Mn1Or2JeLT-%d!tmF{|F=Fkeyrl3X^G7^ zdC9)v!uuvAhuV=@4(PlX{=T}nJu>9OUgG_G9jr9gyGb@|^-O2FO}_iZe+0}zlPWXU z1;NFm_f@n@xUeI$Y8`1+k1ZtgnMChZ;VF?-zeN)AmrCrCwA%jIod$Mk-qXuUM|PbQ z2AP;tSAc*nY# zSb8jOA%zxEjaxQ%YULJbt&hlZs4lc!RSz1w^nM@2Co=Uqk;DqOS(0p7TOVoAi)8^b zKAe3kmxV^=U7p}li|NP3H|2NUT-M)i;>z9%LMBBMRW&b{dWbW?=hl<&(X_tXCy!2~ zhbRlzO9L*J6Aec0jpzd5XUM9?>q{c35uOT*Z!X_pa-!#)%ec{(4&3eyG%(C$2{gcr zL<)Dpo*eIX_u%k*wr)0S&pVH&imr?ykEgqbJlM);k#iwI0P@N=AfdgtDv#u<@jnE5 zeOmeQ^MNJ2koNR$gpx{kFOk=Y+NCyzlFdgJWyAr9UzjysYsL4j9!$o(127w|;eevY zm6DG>_xW}4>Dl%O*Dw{{_7L-wyms^eDBl!w>f%cbUE-I4iBX2HOqql?cF`}cI&Y|_ zCCj@Ax|25hSjx1KGBdFo!k{A$TZ2`Hsza!H)YUJiEq3HG?ODY6-iej0gEZgOJkEZe zmnnj8Dnif8x;(6X-=n$|!EXApf8KX_SL08~)vd`jz`oyw3}mrk#(`WVAJ@wichL<> zFN2n)z@?+8p+6j*HduN;0Uhf)EKNqV6A?qu>Ub{lqtagx2MG2>6lB^5dc3fd_5l&B zi2l9P2oVS7uuWzHJDOnyGj<1~E5khlpRc+mT9T>0^_ z{?+k*MYz^2Pih}oujwSY2mBAuyE6-Q|I@YqC_FsIwP;pZf^b)f;YqCwL|_5@LnTPQ zIkcRz@n+fE}a&acRh*W7fQ5|s-sF;L`x@G)p*3AKL~ z6+bpSOu!L67jB3c+Scdu+7Sa>f z?nZ!%qNIB{snOH$ym((kmkD0h-$svIoqZ$eH-!CzaK3Uh5Dg9eEB)z%`E6ve6p8Yq z=Y4N^NyI!A9e3ZVX(pdE=4V!W7arx_((&eT2gYcE{sh8JX*204hS|*Ko|?lsrEW20 z0{=hM`#p5!H7~vP1=9k!y1yDFIY9C03e&vG>IQxoN)BBfewdu5ni6pz=^vyqCZjc)r&&CKe06qCNG*rk{@8tx0IGd92sxFrO@CMM_&=ZM# zx9~n{@m=GdwP&^8io`%L=BVB>3eaEU)dMnw2YrFmgvIV7p%WlQa6OPVOSntVz4w*z z=na%*{h{Zcdo}wE{1NvIgnEkZAd4Pz9SzEV%TGdxJMy*KgI?U_rJY)*I1Umu zHFI3j{7N#5ecQb{os@Dbb<5a9YXgjVM|?=x_lo!9edXZ@^d7mCY{sL9ou)TS@GD%x5Z!1X1iWJKD%aG9WlW*i~hv z`{5^aYRt=Gz423(q_42vp}@gQ+YTO~qj6{RFAyt(>CdPLZt7(}JF`Y{PdEVFRR>`W zcViF_WWXGc5~0hU(8#gq!ES!vPKIRU?QcSCmj5vLeM&-Cn9WkfnYI zy9_Gho90r}x3*OHU#xhXHC$?UA{hR+s9o}Z_dnZo_7zIrrUWZOuKZAlO_PmHn~U}i zeHK9Jx;L(faRo;Cmpc%whC2{e2NU&gi$e{(U9 zyXLic_T8;|BdA@)S$F`-MZeNGp;7a3e^PWVkKANwY&Fe(cO0w%UiCk{2M8fQVq_`Z z$~H;=|n_E37-lDmE%8?%=oH0g#Opr{e!U8xW_em|s1j3ky&rBV)A_x&*_ zMHdi$_@I&p_?g2{a;NJ4P(WP21&1Xm;0gwKd9eKg{MIS3=(%%ycKU7jBAbqe-B|S%cu_QLVAU{{fvqV!yK_JHB;%`ub1;Pljn=`wiXyiIM<4x$*?| ze?t2gz7)6rlf!Ji!X?@NdEdbMKlwV(pzV{Ocb|-s`x_TN9pkSmh&IW>6!e~UG}l>;Zl{jufLxN@+Vzb>|1S6n$b1Uo6ZTuqb96l)VMAmyy#axwkv zS*B^hNBfic2VYG>Z_2^h;2&LKGWtgsnpkKpe;Z$Wp$Q?Pdh@jhk^a|9`d|Jhz?J$S zkic0F#^KsJumnHYfe^~BCr@u~lC_Q1Wzwy=%jus{7{B&H*qV!#dP=@D5i1YUKRre& zu6Q9@+bYI8ho2I4 zM8VWIrsNkyKB4hxo{#_Jul?ZeT}fZH{hFpOUP|=q{^Q+0o=%$D*?V+Adj}W=*7PRf ztDl!7k{`eO1??YtPM04S;OMi z?R8Lp#&e17b?X-ou;1d8`0?ng6tfZUhtSjd*sN{yPQlVP?CaLN2eGqI%;szV22*nY zWUwou|Ak=v6mEUxr+r!k>{hqP!LFg!CXK)VYvWUOLtI6gs_4Z-_4F$RgJfVK845*C zeQ+J6V>acZu+4Yjx}%yp6TT0RX~jC`aSI#N*1wPD=%7~L?CS*whqeFD;oL>x+&@FE zy1YWug75XmESQ4#J$2NW5|m?p-x>WohTcz^f!^hW-t!5)=Mz+x`VoIafKPXexB(lBqZuK{BM28@WfbSLBGL(%uf3S$HO}F%JgmN0JRi$`dUFxn{Uxtr_j(nI zC0LmkTk6P&EVusRuW1)Dyf2VgP(1Y}e zI%@>d$&%ebljCRuk>=9%6*g8z9jKwS$>wYOLG;f8+7!moW;LTtG0Tik~)%N6*#0xLpE?xn+uHMNJ1DRqK_0?lE0r3kS$CC-<#Y-t9W zmpd%+w?d>8AVM<#m6%l2q2Fg&t z>tnyEB5Y7B7V))rkdGP{a#+s55*-n)`q$ZgX{;aQmEtRGK3z(N%{utOE>Tm)j_xHW zjbW3O0t`wPf*T_tsZe#LXh(eQ`$K58&m*c#sIm~|;`t5XoH$1I4WX#bPmGmEEXT?y zzKSyUe7-gx+BubP%;SI^B+AeAE29yUKy0jH*b!EdS2OHZGwh}~dvx9h>?#R%Wa0DW z<+0fLcdCJJ?8|Xfz(ArhIG=04iuIbyt@P7pCsD*<37h51v68YC z#iX_ZxbiZJeA(TJ$=5K=K)y}hF!{0w`7UFdP_ooHD=GQhVu3o7{QV?WmT_3xs$Ra5 zZ9I?a?YB~i0+5Ky3A0KxgC&}0;UqM5vPo@FQejaDPP-W4eL2!g<~~SIA|S_NhWd! zCY@Z^EvL%Zg2Pc_Ji<+a`kzbV2JR=82s*&GO{p=Gd>u+8$yZtok~|(eD#>Tu8tmDr*cB%2r50Mwj=_>0bJ;9WklKZnwCbt&L$u1V@(#2AF#e}bc>hN`$f3dLuM>kv-uT$0tv8|>KP@s8d^5=AQ6HW z{Tw9(btuX3sn0RU!S!WfIf#iI{E^8)tj=1YPb1OI>Pn72H8b^s&LkT;qh^wbRw}5s zX2K`ygn<3S%*RA*ctqyPoJkd zYBeqNIW(w#4USxpsO%GUN3EvO+lh>$_9_dVZQ@5F=#eyoC6d|Z#fr#mqYpez{igS5 zq}qXIo7Ekf7Az&2zhRUNJU~u0=>r6Y0UaeEyAuqRxB+sfSsxQb-jgzy1Yhc9Q`(C? zaZ_4p&#_=z$zUUWbw4`h;H|C{CnDaz<0zTTR?;!bhG+e%gd-C`n{qS)+EQK33Vz?M zX)0H$X+d9iqVp9CO-cN#WDewBC3E05-k)WH!2W!#8E*KoF8PrSfrrHKk_3zvoG<75 zJAw7r1Dvo5Du4lE4_U*A(-0_O;|28EZO`jU?py;1wQB(c@2|+5uo26-bjBj3-X55fnw^Qn#Cq6huW5to@fVbz$t#hV5p1d zX~z$Jy?fMPaIeh~P#>)U zMJ%*ClI_?ToULh^T6tTt^Dc^8Tu1exA#joM0V;Q2qViZ_Z+&R_mXhhS%@kH4TnQAT zN0~K)ITV#qA?=tgB|KHqL<2dk&!c2uNoro=<9{u!ct3=Kmp$TqEDO}HMxm#U8?aqSX`;G^>eC#mXfz5z$Y!Pz0GCcH%7K`r zN&yAsn<<7lW%T^;6rD|`=(%jAm#w~BMW<-iIW?QNQcZ!8M7h_d%2k>c{Hh-|Tt7)o z;Pw3xQRO1-;oyz^RP{GjqZZt%X~8{x$@jxAUYJ;a51qvR60o!b*S1wmj<%M{!zZl~ zm_!c!L)YcsZE=g)23;OIhYwvNAbu4{qlo>tMAL#5THO9{qdn3veyLB_1va}5er-Cx zYLkB_Ut4BINKSVI9D5vx9a?CJM+y)l>bXp z-*4i5<4g$o_V?vU0k^a@3`|9eoDSz^SQWhg8A7C5jrac#Fm@L}hLu?sV3pbc|3@;1 z&rCd;c6IPghAjc>x;0G; zecN<&NbOGVOQB}9v%62D*9;M%H*qV@aZTe9|F;0Julf;WPZh&+k_&*73dJ#4vGQ>M zJ$;}Tcs`TjS169*8;iwszR@dY0B&wFp$DJnrwd$la&w zgI_xWy4U+6*jGbO8}?5ezA4@w3H-Z(&Oe5jVsC+CK`sPq8A_Sd zXQN6<9&sdAtdD&b+bMjgSCdI50WVle`gIJ!?3|?MDcOFQSeYSX&ev_?{r_MZoO)KT zrnOo?TwuleXljbC%rQACsMB}#YPErid648=$|0}NpuV%O*WfN`wZP1QmEm_o1w_QM zNcTdkTeQJ3j-F4To;2#OmCagv=* znA$L%kB+kC2Ay$cnXp`Brw4OCUE+ZRslbMtzO=ALMxKn7sV8Hliu2|C^;R)x;QnOol}O0*fc7|X8SIxgzyJf%0>r**B} zmvbRB#bar@fTb2J?Sk#bSh-J7w=UJR(D!uiB`R(T6wRQNkuc|IbLt2vCnK zrApA35%Q=H%+<8uoTTwZ_`2z|zoKFW=osH)HuO*?^#y?w1twA(rndz8a^{zSa-vc- z4Q4!b$~%2*?OPl0PNg!jHsBqJ69f<-M8R0TR=~A8y?cQrbwSF7-lr5~T})Mut}aa{ zEQ|H3wc*;f%A2tCF74RKsaW=;a#$*2N~z@4UE~C_B|TaMx>SHJcoS1HDDG2`j=Ss; zg`kT~0&v%rE%YKGyd$8FU!rMnifsH2nj;W8g{eRmQQdr0-?pg*C?w9Uyz-{LoT0X5WsHE88%?h z_?6}0@ZE)*zOrC>>NpHHz{$nq;HV4{QmM8GxT6@jS>fey5wltl68JXbW=8^Fh<$cFex>dS8%Cs}zGhvieTvwhL%2HdnSg>9eA#Nl{Jz%CO}G#`h9DV5xC zjQGfWT?W;!N(c-^1co9q8>QHald{i^YOlA1EdDigm9zpG}_3H*F zvNo!1pgQd)cP zSHMe~u(Va(vj|qZ!Or$l}2?xDlF7p|7*A z)3o4@1p18C96$dJFL;(J|Cv}GH5L9Y6tN=^w3`shQ;JO3c?-usbOa&PfaOc_V2q{U zRtwQNkVi=yH&e;uJj%#%GnLtbFQ;oR$lI6b8hjiGT#xJ-XY9P+fo#0@xn#9sc=G2xvcaCIqzqlXU@qvNebxiwSRPylQZ9$ zdFFYZnR(`!XNvn|qnZxTY~@|)6Ifq{JVfje#BYdLm+zNLr_*jYO2oavsn9tS?AZdI zEp<@^QED#|#4Niru-`1eivG3xJD5U(r6rhNz&YOMqJv0dhN8^A7Brh%HXhpYNCNf_nIg zxHr^5B+J%EnVsoUb~e-si+#)D*C~fpLOJO~w9INt0l4-B>`4PO78{_a+#d~`LDEW$3`d>F3hQTCov zjCp#}JgyX-29^d}BeU@vcb!&32MQHM`P8){v{BwOMp1y@I-$>~sQ7r2<$+zSi`?w^ zsMTF~=r*-u>R!Z-QOhp;_(dBh&wdCx=HW4l5_;+LGxf(<{i$od#`4bC?p$T7X=WGg zaCLdI{K)6DgX=5{$9CsTa>pn|k%!YcK)bfQfGO1Y z*Y13cdBEVx*23~2^B$?7BQ>3FNtU_as-~f|XP2vcM&bmNolNB&YrYb608^>jH{UO>d{9wBwM4RP-mO)8-wSHB!Q2MZZ}ce>?3wbb zuH!Di;FWQ78s=wBoqU|jP zyDO0_e;V6ebxCVImBh9m4jxk{mvkX?yNTnf(FsY)7&W##M_0N^z`KcGXg6`3ZXKus z5XsVGtU8BqG~ygW#+TOYQVC+&y37_?Hx{vpA+tMY%KLB82*R8T2;&3nST7fN&jQDyxs7fNS1D;NNCh7{l7k~1lOzkHW8TRhHUar zpFt;29<3S5tIbH#x?I6Kl;&f}#X(==}U4KM$QeW7l_H|D1`W z1&;m5BAXwB@K|+$;SSE%2ZlqZIRX7&v*i<`&K4LBz^^ncq~g6M?;NEl!D7~m`1TXs ze2VpNo@QsCSlgG*W^6=yIIn1dD=UvkLlq)65qDe4^jxZ6YQJE_0e0O_0*4cc)c`0&RmxzXl=|o7t6eExXv{wA7v{ z*9$sYz>dchm{sal;;s$Acn@N7aAYU;lf!ZO&v<^*v3||~z9uW(v%CB#?U@pe({?4s z5y>Kkapf_ENS0wg;^#8G=%gi=nb`&nF|qZrpq_MnH#MwiY)6Qrfl`paIlz{N6Q~Z~ zS>6xzwOGphV^qHiT`@4>jqLA$zujz{Dxj!@*2;UFXN-T!&$}Pz)3Yf($|ya`NIkk= zaS>03TKX}aZJewA7IbX!)~l!^nF9)pdA{Y$!D#|*Wn>#an|`TgUvh}= z0%beV9U`JDU+*T~J2bK}L};Ik<5(7=cL2fNJ0z@Bq7cV=-aXfZVl{J_mK;6Lj;o0>S0+Dt^8m1pBZD~P-8yz&O(ODn^t57VdrKvRjY)IKrvB<07q z7(d2HOQd9X2RE}zzCV9ca1)(?j`=UJU}LeO1jok4gNmHLsyc$?d%!-McG>LeNH<}Z zMf_e~Y}0j_O||T)UDnKdM!|_J`q6v7N$WB?eNi={cQ?NXy+Bs7J^?ed3p=zc>(B-I z4lTnD)eJXU58l-!rUyl14~{AS6Y-^8eGO2y?=?1^mRX|t2R1M|&L&kGD`5wicA|;h z?4WjHMrBJf7y4A~#EcKFhLzKYSKGMI+iE9fyo*m)(5KJ9e1cM`Bs8B$*Nt#?=Ypw} z`1M!`&QK9goQkM@+8lg~_UW9p(5EMd#65qdosZS)lX|lqW|`{5-O8wElV48e*pVKu z-!-k8xLXru4Jf~e_$(){f=0AlW#c-Xi5=LXl1H*kKAFsgz9Q~cpp4~N%>LX}HlSDQ zdF5XapXDih`ZRs|cK)V(f9N&&sv&1OAIs0%%*EKd>&eqS4 z4D!Az2bx!#W03a`@acy+I(Z*mcxHK5xY+$5v%L#z@092f(8rD%W$NcV+4}J^M?b~N zlM53%o#K?}r#NX)_l)pmI6ywf#-*1T@4v-(pKa7o8hziaqfrTwGX8qhFvWS{GC*8- znPG~v6rawcPyYcls+MyHDoXH&c>E6bWSuXE9DX~p!)3(@qnLJ&L@S-~SINe?3$GYL z*A@jtv<#7KoIEEbOx@l4IlK*KSvokW8e)6q;`-{T7fH4LGws zxg^TIyLnI?`|k5KXy1KrP;cl zs3jZed$xEp@$Ubb78?>JInMn*j{ooRnv#D0OM8`SAYq}-+K1Gc4I)s2R z$?JDr4h{llyX-nyd z#q39AaqM`-iC^2<@d~^YbA;7hcvB(OVHe{#Cngigl6DyFad||nz|Lb^RrD2kYpJ4y zcFGOcD@te{mQT=jiU$aBRVCOnBT{b+6U_J{Q!^Dd@{%=;4fNB7C}v_ufJW9cg?raqO%p0AG(=(>RVecJcE^rg5CFe?nFGs=Pnvm0!rOawV82 zSB3NP%6Y!Vm5@|a8P4N9JHSnUd>7)_$uC@I!bRi4WECU~XMp-AkWa75`|}NXc{k({ zM+*X25#VM7u+SP@37I#fvdn8z^)-M@X3VsogG@;@Q!ZqhuV#8&m+6M`)JU~mGl?`l z5$gGESWzI?NHy2sRF30U^-q{g^YPxb;3(-zNGPfd|C#r$fURWcNxF)rYPvVALGDf> zHjUFgoOSLv?vAT@Z!>n1i8waT zDdF8KQz$dK5=_vAUNp_@rOdj4zG36tz7*WIOdMQr)FoFF$IizuBaY3y`+n^Qw}0E< z%GNHkcwJSyomP~h%CO^;Y>wjw*Y=|WEnj@pDefS-9VGC*jda=LbTshud#9+gFldwL zvgZl8fk=Ct{Tc+5KTdlnI`5$xJv1LA$omwwErBv%A0kaR5yuwZ{fMrK`O~R{Tt8D^ z(@Cckg*IruGlk>abz6)0nv+1$tvZTIshPwbPU78AU8(o4GkA{pvQFr0J^^<+VOKY9 z_qBH@3UPN_%P%elGhatOi~7OpJYK8w`&}Y+zOH--RBve)1EFZ=rzD(n=NmI7((;w{ zB)5r(o3*@+%=@N*wndj$8gHi6>y28Zi>gJeOs22R%e&q+Fsg*)-&BGzZ@TH6o8|8K zQ+agJT@!wP(P_Uaue)P3zjzO9iF91Yd!EBjBYAHx)Ssx>l2rxV)yhbhVAT}c$a{G2 zK@NMHDz<67_Zwh|>B+=#tfD{hp5zy9PNo@;^YhmybDVErLX|S|o@wRf=ku#7s2)}B znO@$Nuc@HwUwOoJPc;#@#N}YG;_AcKWM#THyj0oIYgTtUjz`$@jlE5}YqIuf* z78sFpkLmks3o#vy%Z6J*PXgJzKTxq#N%R+$M7xq0iJFo$5{-U{_g)1DH7h8Ilxe)T z5776~B;shR$R}QfU$_i1w)69!O5(U;pE+T0RqN=7rcEmEUd*p5PB2d%T-AEdBfRHb z@aht`lH8q6u|ccvPC-hwj`sRpQ}~)xt2^*gWm~UV6KLVLmZ$JFLPA1iTdAu%5!-YG zySz1qU>Tr}_tN)T_L6`yi1h1-u&&TK4Uno1W5JiK#U%rMCtP z!M|cFTz3!!#Q#Pl@}6_0{9t)fcUS z_k(s|8Qr`n)6Cd~H#224{!H_t-THaarz+2Vp2$EpB&zeG@tw?zZi$%}El@K*k*KeM zeqQuL%)CfYGY!>cGR})0VX{$?137xAIZ_fexfq{ErJl`)3`BqG*O(5^JokBmF=Maa zoAJEgoAH8k&!}}291)JfIse>o+#PrG-V?f^IKtYt1k^mHqDtjj1C_7%A7#f!EmR53 z1|{?zWe-P~pZ}$aiDjG<+`cWevDR#fAITtu!PG&KI|6HKl@nB&{OxZ1HV%`1`0xTuhT_9i{B|9FyBd?rFv*7GbHiU`eJd5)kK%dQIy?`HR>>7; zs+3k3BQ1G1@zM-1Rx+z2c!94(%cJ82KR+RX)0{Et%(km&*VGr=C+TQDWlc|x<3c?I zsnkAc=mH@feQ}$J*bdG+{fYFb;uQT62Og)`q&o1p19^hf^J!<(0U@`ExRsvMYlBI! zkbP94UwQX2;L-{^!FP-8lZGr15)>kh4B`G5@(Ud$1r{2>DQ*g-)R{B$h!POQ?Lxn&Hcnz zVJB+&0vrr{493r$bm8LO&=Z5ufQ#KXL@FIPi8xNox|0@FqD37t1+@5j0(kL^9gATU z(B{lyOsEkP8aOTzh64}hvfi!QSdH7MrS{oG%Gf)~tP3)V+cTOo{@fsKp$qMaIg~N5 zIi>d5*o@nOt1Qb#ss4!z?U87iQJ($R1!KrXq}xpzyD=^ceh9%Nq9ey3+Xa`ORusAG zKY`cHn9R9EQG%JB`*Tc;jptWiY`+bxpqd+x430JO+Ew}U7yP(|@`#%8nY%>30f+rm3cSP6bUI2TK)i3ASNIgZV` zh4xAjm79q~O6{xh6#-+~>08hYIZ<=0P=h|b&%PAt9UWLCK`mC9MRKYK<|_0uL*TC2 zyh9pCRp7=5dN!5XZ=-z<0VeK3rW&T=VEDY!SoZw>Alkuma2pLdYMhDqqKQ>%zYWfd zv&|Zh76(a{o%h*yHF8E&;{aefoW`S{riB$nu2~M;_rwd3v|gkrLHFr+@i4AWjN{K? z^uS?ZXVA}?IeUThNEvx6(P1c)@@n>F9LLG064Z@D^wD8~hWIrH2J!AS2{?8V^x^Qa z$V%R3URp|jYT32+Dh6M&V1j)Fku2YiFh`vJb-Ek&Dzg)5k&pbSlih;J^<4IYbwvq< z;6_2^qvqzZ$Z>+q2@ZDu1X*oc|Z6t6wi%f0j8kY^AdJbHd0&;I6)<@oSirYxb zA$)T^ebbri7huoR-Dc+J`b->GYX%vru#YHO@OUD)v0R5vNLmaf$`|Y;3suZrnMVu@ zKMEc(RA3w%`1v2eSe0@$>O9qLk*GVFNM?w~{8?)(isoEs+{=FFBAr8Jj@}KR3}3~l zC8g|r6osYPM(GKGWPo)3K_;geSYV6b1MNDl>q)G{0yRz(&m_8HGwbakP zL=h4vpIS^QbsI;1om17PdKW>7(OXsP6Z!UR14D^wEFu=W$H!V$wec;LJ;o8q(xW&^ zkO5I%w+|U3GZLsnu#XG&Qxrum>Z2&ZcRRZuQu5f3(ryP5f87VCj3zc^G_ffo^A3B? z6wzicn>1~<(EgT5t;qM6AOUhB(-k0&>g@%A{h7i74>obReWD3R{{~3c*|(WsmsL>| z#fcG$hvhd9%ildL|A%4uKMB5-c0XO{_}1CqH*s8Oj3BlO;xSDR`VeunxL;t3R`9)! z6F@3(PVuBuR0MIky_S_rOgOMk5!BxID!k|I-W(^0EA2&KVp(Ueg!BRXY(ZpbBEBt% ztQ6)Vh`LR^t3vK~P+|Ry4&3Zy%M_GjaS1CP9F|>n8(p`1M`d9<)EX8s%2b-rCEAlf zUl5nu3xMz|?GS27TxXvRgekU<8}0S;QvHP-$FJFE<>yYlkUn3?sIi32QjzaRdw26v zHon@0cmI3=$5lJU4WxF}NO5}7u&dWo@-@J;`YUJ44e=FG;PX z;>6z%+}=c-Ek{V8J!Q0b$Qd{_NXR`POg&)h#&M%_50P4N0sc9~FP$yF2&Q&HY<1EF zZlK*FQZO!J3jd0X_%`#Ule!FBY8>W^x{3Y0aUUh6bEusI#Yt?03QSCh1_nOcprdEst7uK>yUyIbq-BQyD=^Umk8o=i#wW_LQ3dHbm6n%n;&ihcxLEh5 zV|aid5=|k8lB|rl!@YQ~8J2&Kn26&We*V8qv^HIDAntH)R|;{5GkGs=gM`m_{f)T8 zS+0ACJKWcG2XTilaE*;n{C829h+jL!4kGT=mMSm7?n}5Y?_CQ6#?2<;Xqq*-&OG1- z?LrtF_BAq4jR<6F2@+EyL^Eguijdq!a)0AMlDioXC};#JJc_|m@Wd?;1f0^SNW;(*pDJf#6(pF%?=I>ls=3z#5N3t0QIj>>+kbmU)}E? zh@)3-ATr!THUIHTOf{k3V75$kybbF*t||9!CydK>#aT#{z(PVDrly=lI49W4&cr{o z7QywW6h)98GdUeCv%1%r`(8oB?Sk0u6!!*KLloO3b}QD_8Napy5b4OyIQnFEbZr^d z@2++54noA_v*^U4KG^>l%RheE9{yy>4#(s5d#99Q~zz%8o^@cOh^tm0zb*V}) zD#ikv{yAGhf@zl^?r;V=1{t(y?k-TDFfCHmXDb)2K6eXvqN6jN85$|2UVzwb79n>h z6{H-Key$C|*Xsx>O}O)j2_FcswoXvh&i$JP;>Z zXSyrwwnToewFd{55ttoHV-jhtV20?}HESl7q1nJ*d-C*JRh6 zpu~zCcbbC4y72ml`E|C5i*J6d*&c0qLo)+IVZ;dbP!y%Q8Wqw6RUxU%yGs;B8AR@d zO`}X_pu+}2;B+hf_$9^m9C_|xIz&v+<^V2x(f=os1p6OX6laxUfl0g@1t1XwpdAIk zY~r}`3S-3uqn12z@DI~)OOGi^wNqL|S3X2+Buzn5J8A6fH=kb@`c5+-cPCRDD{tt+ z(K(*BfFdm+BBk~qsN-$0$(3rC=VzeyU}2w_>L618u9Ov3u0UQ5tGw!A-M^0Us)zCF z2IF8LUr_kR^Q!wOPW#aAxx`+Ay!z0e;_|8*lY(|zww%(0S~aropkDA$qSK?mtDSW? zShNy;{KGo@^kqR43aASV>!zz5@ zXP5>3l7EKL?CGt4DfL(%}nTFsrY5m!61ah=8+Y z2k~xl@gtdB38va)gim|FF>8q1f6M z>n-2DeSaAHUKOWo!z`ZvK{ z3l%?y8iN+|?D@mG;?kHJ3*sa_wXAG&M-v%(qNp%{>G6B3+Z%(x=Vpo zAym~i_|w5^Rf8o8R&gIz@$JjcP(|VYTE%^5s^Vl+wmpH!6Mj~dxI`{{Fq+78@=IH= z16yz?_Y5s~vi|?rf*rqs$oD)LO=R4yvlO4Hiihg{k5$}uHX=u91Wm<*e7&{n50kHv zKSBqmfk>H9&2~$OUED_rZg7fU zsXs-ytJpqU%^#ffG z?r$!Em7O3igcYAtGT#t!0sw37`m1qW8C&-pQ)H>AEfH^`(|l14#I({r4ws0+C6Og! zWn_t1!IpP)vXw0#T7Oy*&_$sX4Ymu|YIGbcf;K8R0#u5k?w1PUNpJ*`TW5pY&M{1G zP{K;kvOj)27KmPAIR9Qv>dp4$3br-o0K9s@U*pgRYGWNqyqjFT>6;VPZTd(wG4;@U zRLCuSEH4g+6}WC7-hTandu%f=jXrM*`|W1CeBW9{7XV)#9u6y^jd9xhtSL6WEsN-` zt;C^6yqi|j+OJ7~>5tHewuMhVRrIb4UO(@(o0udpwkWlig)Swz4H#-HcQX<9ke1!B zsOq;9Lxr0lYNU9Sc$@h}TRGe_z>7U7WeTe4YZIe3*}xa)#&t?098R`M?ZVg8P>8zlnBe(Q zE8*AdA2b7eUYqulK(H^~za#bUMLty&MS)Npj_}OB)zxH82jR#YYq=0q77oW+d|)I1o?KXZntzQiNjr5rQDAHoa9cQG& zjBBE4P~MA~S*s30OOEnO{MFS!l6-%tg*9di5qE}~;?_3whOVkhj8%=*7yLXM%KH>5 z?-QxKPec`tj;USwdH?0mQ&!OV29^*>unStO%bx5Nxa1z?@Fa_5lug{NJ^A@?4Tcs6 zEp6z)B;6H;7z2+SF@|9jaF&5#7_*6Fx$e3o7El9@h*90@Z$rmK7OW2fhiDhj(x$jK zPT2q#21u6DzBZ2ddQx3&1&tBsReA4p5VV}OuoB!Jj_1#r+6leftx3O^R*gw#qSeSE zJ*`sCjaFUy$Ixm?>*>fiRK%QU7RJzOpP5K$*4{uX6Y&+BI;GV|4+E`EwS<-6H=V@y z=jTl|bs8_oGZ>9g?IUd*aWs_oAYOkp@97KHvIg8?uCAul9mli=3$m2tZFNyf>vJ&4+8!;UN zWeAa7;JVjiH0^XSe*nzqtB3Zsam5vi2$x{2e8ee$c^QeQ0f``Eo*GG1sPRc&13vH`rC&K&EC?RU?B zxHT}*p7ON3**%o1g!_5u!L6LY|w*MIsKB5$~ossv67Y-6Vn5&phZV_&WdE1ig?A z-bZzJpmh-G7a&q`Y7vPI0lV?!>8KE}@pO$C2>p{(wG|EFxfz!csn~uek$Q9aNgQ$P za3xQ!FSg&g{^MH818aNJx%yXOMWJMSur`T4qm&B0=l7 zRdq{*teQXbQd10Rq5puiH<>yoZNzs8jN=xVfRX!m4FnT7r8^uNSEpMAbj~(!1CaH0 z1v=j?!ySUDgB}E?*bcv`v679f5GhRDPFfD=$~!)gjC>eBbG` z9I9O^?$MQDQ0n;B7QB10YPjY zEcykpfjGXIbF)(n=+93zla_-da5zzrvYvJ}eJ|wh8Rqf3`oYx7<9GECq`}H)N5c%K zyDqP2fvcAidebR3gkB}yll)SD=v#Q3NMjV@SU;n8U2!kvYU~0yH4-^z*BFxJ%D+Ri z9{IcO*jaRYV6}5EiNq2WcZ4#EC1>971wx_%cfmCg@q{3*C*DmnuO!k81r=3mvh1^ZV5uUy-bOnJ330jpPTn!a?M_|TzP+(oLP01tT=FnI2S5u*?Tc$>z zkc-lf`8ZzbW5CpYe#`h5UcRQb81;EeFygnDMRFUf$<#(X<*=ElhOKNmS}d7+4X$bh z-MR21VEZ8^DYcg*a@XItkyIVxIL=S*-9)-cJ&IEi~gssrC=^Rkf=df3t*J< zHqR*~j?Iq?)z#`0d39t=Y{22aYLXqN_J*jgaI{igPl49g!qj-1AGZ+4=8AVHadSfT zQdTeN1=@mPUVpI|;DyaZ8m|oV`Ux*=C*ro?b&8_MEx&}7;D_Nj@n`!a#Ke#DMQ*Fn zCd@OY;Tjrmz*Vt-SYD)*Vr zx>UK=6tz^ThUMpMx_BtloVn3LncJu`gMJpDdz9SkXI)Z&bG~_}W7nyMgIKughPe+O zvr#=dpF$)w0e$CTGsp&R)U|Mj&FZ~m2jMR%)m7F$p5}X!T57mSllPlx%^FJ zO{5uybB)?H2}Cv9WE0hFlOqq;`a`|Mip8#%U~ubc*Oqy<(7$9Wt?{jBhB4^7$aXO} zZ-Cyik=m8M{TH9OV8xGA)xoHiPNwdHqZCt{Ke!=*gQy7&q)8@gHjVGbwO6h95e`v( zO#+9zk-*P3l6#!oe|!>M?oMr9v512lwNEv9F1jXp_hed*sgX48B7wsxM9O-GOl|(y z!e09GOAntn@kFn`MP33}D+&CZLSaqY$<*ctP5Abj!B72sd@anQ`(MDO= z>&gAilZfLRybqKOO}qy@O5AM&_(k(US&o5QlGk?W=dlg3_Vdt+w}go4I1x|Knvg)d znYKWhZX)h*8t?uRr`CtB=DA{DakY8$y?(*5p(2MV*Wo7UYaw?7+*X1?x&+<9aN=%H zy#($+dq^PEk9c>x@`x|v;xBlP4nlBlX*JjK)U0li5hM@Ce%<|=mJ^@z99W0w zz_o?&YknR?AkF~9E{qCUw6WUm1ks z@IV+@$Bq1AxZz*iF)ZKjT&*hIP?A&JDTuqB;x5Wk?he!A{hi`&5(o_vOuI=_hhW-3 z92rce7x8k$W;*Qbcc0t@6TH|#1dG}-Voxncx5Wc23$x55y1{c7< zJ`3>)HY@REQDtefjr8?QqN5rMGlQo}OYJ3s8hV;>1bU5_?eY*dr?$aW%;31@D9PmK zLD=!Y0Soa>NU^F{H`<7=B!{?X=W&nc5nlr3AQmJBW+kg5T3jCopB1SMN1=M+8)_xK zu5h~~#ud_nS&A-NSz}Jx6~Vcy@gz(CpEU04 zvQ*{1Z$xG?41R}4g#Oai#=(7ZvT!$u^e{|r#AMaMuo9epI?ntlId(pZC&tWn*<@lj zbE6LiTh9wW#%_ifLl$(v3}0Q7{Sp(q@F26x+Syn2Cn>jg12jE`83UU zrblw$yHNjO^3;!ECHQT8`!~rUz9PD=ef&JAi#uSee8kGRy5WT?6+hP%+ie_OHQP)E zlc-T2&5E*BX(j@Ta*cXL2VF_30iMTcQ;LZ=rI0MEuhrY$=uAh>{4v`0#_qn=>`3y* zKZKQFnG$oq=o-}T+7zRjVCYw#_-?Zj-`zIiZa2@l3ye4;tnR{fhtoN(d>FfDuWm%9 zDc_&JiMU(Mb1tCY)cvWtVtW>+4KzLz-#{BepPIC%`F^=if}(_06ZiU4M7+&Pq+4lf zQ?G<_A21WiobE0h4yC3LF&WNlhZf5}niM5;T;B66U1d~M-`AEd>6UKk9vTExkQ_u> zVn}Ha7*H5;=n_FvN&%4^YUmnDB$XOT0qLP(h#}tj{nz{9ez|L%wVu7tdG_7+?1Gq+ zY=SH9uihQnVaCB6<8ePA^1C?}p6gmlouV%HOrBrkU+er7tCn<@W4+6~xc7mh-pb9h zYu%u=+1pKwCPpYWRy#x#=c?^O14XJY!UcpGTk)Je$FJ`y|4k%cjtUx`?PIl>S#M&8 zx9@+Ya7JqCNDixY*IR_Nb}qlCzdOv8 zA$(0kpiCX%*&)NV|2f>VqgnRT`sJhap+gx*mdp{kiNKWtO<4jF+Bk?^sr_EW>(wjOOUPWA(SFp%)^Q9%pqgmArI;qD=j%|BOO zQ{`@I6+sjdNbr~({>~R>^qSoAMvhv9s6ZGSWSCyJJbiwy!gAH z6ho(eR>YG3KE-CsCW5_3BHrr9+5?!e&Pz+@%x4_i=i8XvNnlb{%MUB=6I<$%H z^Vmi~(#*z4CgUDSsldwktTur+q%!Hh#u$pNDAq62``G};zbVp>UDLLB52;-N-^0wf z$41XCuS#E-I|78I(&^*#O6W?P1rcj5VuzfJ-#T2lvg6fgI<_8*uXZwS_kAUZ8YbWF zdrbI-uLw`ybJDOiK(RY7&@w=kG3O~c7j3a4rEnS{+J~_#Bs}G}bzJs5PY_Sgs@#w0 zeNabB%%zC&YJGC!vDwqT;b=X>_iMW^x?(WUu16?>8b}}g&zPLQuU_F7u0Hyg$u|CE zkMmn_;jpV)sbQL^rKCIF>|d&7NZtC$ibd4O-`BQjrg&dG_;v;D7-S|OKc4D|o_!~; z_2*eL8ol8|hKpR-v+0C6u*ndJmU=#-;W3!&E~gbpi8mId{f5nlEw1tZ67^DsqJ-Gg z*oPzLA4oImkJ#bW%wr9rqHn!#=Hukn#kGQdEz%3TOgZns9P|F$^6Ux4tECSaKy&vR zscl7kA)vRe_SaE}mY?5R6w>}~t))9I_R7rYnbhan;a%0yhG2>AY2M57HeZ?XVg8qH zX50$Kue@hgLy~VJK?NL_rTh{^l@n14M+C(hg*1hH%(YyuV^`IUO(8LX@1_U-DW5V? zn0+$osfQ%R{|>k-Ey@S#$$-X z=OHSbc@`?B$gr>ft?kNWw(~JWt`FctLhVhsRqOk-qq@gBJEB(O(y;LT z-7%ciXTbqM=JkGU$uyAbv(##*ie7o+FJUnY)ep?hf!-pHIZPkCBRhHT9eHz$oIzU zE}y%bQ}=uNXtqz)B?gYfv&va6)~qVR$LdlT0(;Lp(=1_c8kjUj27lYMgfImgb)C<_G_b`zEvhYaHf?_h#XX(Ge;s_R9n6ZvU*4`>jI%cI zr+$xr9x`g1#jH91X`U>Orf8Z&tG|{j`&Zpxnk09+5TZ}Ize|Hs=lHtyA3P71J0?@p z|J(AbHIIOLi}I@<%g$dl>Wn=xmmO_XquA8CNa=PD1&Im?3MCHxLLWCW?z72q!dwNHe@+08t8r{{A-wWP~kFnew zzR0c1u|-ni28LF*1!}<1`<8YbGkf0coTU^%GX6C%cMO3qb$MSa<_ zxe4(Qav-NE+i3kZ)yU@WG+)!7I$TL1Pd!MzZaGGh2v5$TMi16NLt|>NN*w|psfB0# zUwfY-e>CtSiw|k{yN#k>G;_=d?c0Q9zzkAF5T5;wHcF0ygl?X%E)s@{CrcSMi%-Sw zJRfS6EEu{*>#Q3*GhVpu%*lpVmQ)NZq~t}qrwS(A1maZ5Uf4_Fq}OFDt3LW@k(~jO zqEGL($M!}j&F*MXslqQ*ns*Hux+)90dqxZ5Yu`2~S5X)M(_v$@PO-b2s|OONHpqoj z`h}sZm(?boW@?H}Nf+UtMi*YI8Z`&UN8Ko zL+_MLD&{^iE-bTdY4SZ3+fOX=G5 zbuXe1*2q5B^}1hGL$7TkO;O!NY}oC|!%F2AW&y0=*>smr+Gi=L2AtTTZnzy>FG=orUqag2uNWAm&DNSAv#mayFw~SyM`! z7Mrijn#IceuAS=_2HqmGJg(55-{|4OTmI+k^9urr# zA92`D6<<4FQ_V#WCrv)%U%yV*&cr$R7q|c7HIZA9Wmm~rhQ_BD@=wpp6lsj*E$#%X zpv#q}S|){`UNwD6s^>jk7NfE&%C&v=l0Px>R?PNAg}GbdKjHd_V*Oo}>$#@}fi|7f zUg-;kiY&h%rRW#bW};{0g?1B}4S6z=!G5a=P?|+7_^@+j*}S z_}9E9Hn+U`R=oaf`8Nw3{U*Jv&S_Z?-`eVm?M}X*e-V)L3a5LYT~xp0ed7gD=xRuu z4|vxt^nmqx_?S;^#i=y0z8j!q)fGT!K>oHZtYzNyI;2t1ry(O(%JQwvzP}7M(RQ-= zElckw;uxl4TOLVSY6f1!4stMfuP-R*Yo_2sSX&>G>w2bG7yM6 z4jhM{G1QW?wCaE2&(hwv^R_zOC#N6b54#NZmsMYl?CT54B_u^(zcZ9eS1+o0RKr*< z!Vi4+K0*jckf5FE-L{>K-h6x|JUL>U)^Sb7A4Y}Nb3QTqBDz+Zq^X;816i9IUh&Jl z$#1q!SG)2!X-3Bfom@PB5pwm_=Om-=)m@yUQHrDq;n!@LGD?%ppa(B#YZ)2x^*dx} z^ZD(c2IjqocU&hLoX@i`-V%12Hs$=16<;&N#gSlKYkU6FyaW0x;3QqK&D72Rw&cZE z_q{*c?+@3Hw-v89Fa4wWprYkFvPDGsj@sS)Jp?1K`uK9+)#4rxTUOsJno4KOrJZb1 z)BVMdv#uPZ4?wMTT1oT~+`LwE{4kh(y!7I-=4;wT7p?Q@WLS1FQuSsr+UGW!foi3* zJJtDEa=#=IV&^^NyNu!d;Z|XUf*lsVaj_o?ehv*7np&*3xLHiBy9;{684>>0GQRmm zUmD-=$%(j7@H4MdXTnqv*~GYsNKufZ1;Ih4kb4gJ7s*dL?sJrSiPiPr+`Y1~{Q7zF zKiv^C;|nD&O>QcctJHrUVy2R26gT(Gt1TUxteV}b;Oib$v)AUzrb?XsF0!No-M&;$ zvy+QR<-9oY|L8AKso?N~WKQ(SD3K;RX3TE$} zWpBWEA}-WFvS=O_zNB**@p370_%L;QyU_=+=!}$}-UtiMYkvyWA?zJd=?yHhNtF+t5kUxJOoy6^tBg=34+Y++JY$ZDUL4%R%@+ z(zoTaT@meuv|^gBNhY_IKTNx0T5FQi#ysoNbkXU$VGox0)TjxVI-BiJ2xa?l@;J=(Zqc ze?#N?O<1LExpJ!Z0`a1wIoe@Q&^FB71bMz)68zKn$|Q0|xwT>}Aa(C>-j{;rP-k5T z{7gW}i;e_NB%u0~aesKjC{azerCq?8{8QRTuk~?rPVB76g);(!9+?Jtgh2VpcJ@TpU!3ju$cZuaR9*bk?WeYZ9Jhm-fbnW@;nY*i>B+wzeE44;IqPyz6l|t< zVh}oSzH-%Ox`ICIEicuua+lsJ&y7+KJ+7=2UTmAkKalB%Xlh)EKdJe<6;x90Rg;5l zg*m-I&|g4x&&pC8J*H(`K2jjsj54y;4@Uo;An9!Bg{@}_nsm9=WUSVgh34oxUUFShjzMwk@;jxihN14n_~1E2M%;^tU~O5!QPw#A zXn*AUa#&XN=C;RpSY$`y_=93z?gQR6-^e>RvVA9@-S_;W;43s}6iDpjqGn-1ta)ha`9j?Ngl1nC{}y1jl`_Ld|*0VEf4;QH)Igk1zmr>Kj{s>D)N zhS$JdsW|ZA_vQF>i>{IfgJZ6R*lXo7<9v+O(g!NPF5CKtp3P51Y^V(X{gsKh(yi!w3UR&A_-Ld<`&zu^88*iAq*+TwLgHja~9V{QXT1GCj($w$5 zXFnf&q?7YWJNj@kbqx>wwJ}F)1Hrk!OGF;$dM^U9YI-^UFvxm6>66vMr%Cj%NlIO5 zhn%KS#!oGpn3Lt2gfIB95sLNxtx7q7mfIRfgDoCmi%nkMXFvWBywa4sOE~80si@2i zbh53Cc-(OTG&g$Fo>Kj7KR03jI$>^pW|U<eQ z_n=|HU#-u6s4)5|NnU)WV-fIGd;vE%g zmUY)1hN`Nb>Wn;ipiX%d$ksE`^scYCulfK{VHklktx}B3ZOLAblz;b65CWAq7hq2Bng?j^hp*XUPhCb*M6`vejz7HFH>uB>>GH7s*sSO`=I z&4_a?6j+ddcl>1VgAbesea$pnuc+G{hM&ifHTMYpeW0vQHv`o_%M?>g9cy_2V+%f~>qvd1UG7`kWU_Yze15H&A>+&DwYe}FUyk9gmkM-hv6o&G z{L4!lrE!Pn?SyXAV)f4kZVv7my;z6&)2N=QCj48@ZdNy~@%+|M&nDc5Ej6Nely=sI807NdbylCk;|6PZ*cW4_$wbN6+6vg&apT$6n;nJ5vrmm@ z_x`^Nw`}fy&bWxKKsOGrw^JX7{myO3wEdL2uXb^A_0A{iSq6k;w1Pd`uS~4kllLHN%|qt0DT*cFay%%`PYxGTKxl{(_R39%k!Rvgu)gpV`2E; zhjQE|o0M36?J!-7KD%ai)bX?p^($u-6=yLZ{l1yU4SUMUbAX;!_h+luKfzuwCI zvL|jk&X2D*zA7P+IBv)H#pz;b$KUZjlOG#V?SM$&9Cnk&+){>W#QL(TO=GUp06d5k&FkJv=Q ze)adB_sM>|rv1$DL9Nvgv=>0f6e0Fo_n2YZ_s7T@elW8LGX4Ua+Q3bp(k;h~_!nGA zfb;xoGK$$Zp=L9$c6zM;dXn2FJm18pSaMZ}o?PmTz7kD|dY1c3RRG;QWwD{@49HIxIrx70hrgK|hyLiSyHDq6 zz~|cq*I*t;=N;(t)vwc5d9~aNu6z#bOR#yGdl}X{nSSvsE%o!4)2|pcnbFko`@owk zYBfsDo9(&an7`mm-T9#LzGGRkE)3<6U3gT8};eDkD*6k&4%dN+l?%;uEurIBX-DsKg+KBS^CuK z*4DWR9Urlcx2mot*~GEz%$&J`fkpR&m*2h?+w&euwb1BVj-lFna)el_hUx9r{S z4~{L`z895F*aLED3ODuuFs_*?-U^N*^UjI-Ti%h~GmvR6f?2auvVw}L{7e~~txrZU zpC&S1`0S;TO$dk48=a8MN*J!0Cb~R4NrZydrRc*=4cn{L`(+a0-p*gmp9X)7tn!Lo ztGX3N8w>l*XqhwT(hMW?CEXe33FdVS13@r-c9ljIdxG(*r?%e;{vLY2!+jeLf zVqiQ*Ke)H0Qpx$o%pfJ_*-?ddPH za*FY80z*&i%~J7Qf8dhv*${8nW_oRk&*zu6jSp1&zj(*V?}R_Jm3ua3-k#%B!qGUT z)HNhcFt`)>CZ)^L>?-DI)#>h&Pf=P^ouQ$}vXA>V@44a&_O@{L2?bO5yOv`OV9pR} zsBB^==d$y%1Ci>%ZO-)|Oax7M`-GMG*6`%>p8DF}ZSM8+ZL)9a3PS=4Zl9=8 z*&fEuaHMn&hZb>6tFR)x7N!rSzt4p;?yXN;iZpdsXat>b=9RUI@pLT%n!**#>T$P; zCTp+qPV%Axh1-nSx1S&V*0epWO=+kK$bwY`_|%H{J@Q5U-7@3tvv2N=&SHaSnF1wsq0_lhmHzqPGi)azE}D5ZuB>+_;mecocsnKkXM}+nCv#GjB)*f@KXaJ1&b0tVp7Or&mwqlUdqWCI zoJEbZjBs~H%&*BR&+?_~ByyjVCO!_GsXn;)#4El}{&lTj4xt09ZaTfiO~qzhrf+Od zR26=dhG8F|3f24{)^6g~$JMJY{HorJUoIyzE`KkZ6^1nvV0rTQm!kc8shN?`v-75Z zy2rA)8c)d%`9oJPj$VF;aQkBKt-3YzkFpALu9p(5Tr>Z+84t#nl zZvGVRmNdwu!m@_G*v-D>VhHmG9G5n+gV^f3NtB>v_#y5~spblyM&i=j5uRF1w9Phg zdV0p!3Go+zD6jD#L&(N3+a;-fyf|CLrZvu!_3Ec>UY>&1>^398jC^12O$PfuG-uc5 zU^29~R_@jaj^Z!9nnw2=1OHiG&p31P14s(^nR8nXU=f?{4_9rW^ju<|eC<+QNEL6LpSN$ef0)(`V5TG6eSv_sWp^K%W~Z*6)QanPN2O73C%xm$9|h7% zP2)C8Q7+Yjmck+r!f!gINw!10eoyrR8CB7W8(YUucb9I@{Zrzat>O=zS&ql*NxK~7 z=T#Y>dpeO(yI926lccn`9h3sTIl|k>YVk5;xcMEbR}`xsznz+g(OgHj;F)rJ@qOHg zn)|KrZfPE-QL^mak(nY(X5x_2j_uHD$;A8ZGp^*ksI>1pN9F`F{dj+Ctrt?U!Mds= zLg?|xHVPC^?r&dt{9GXcXk)?;O-Nm*h?`0?MtL%}*5&V&wBB6=$-TWfiOsSvVelNy zS?%PZg?8q=rs6#*vNAi+cAEXnCHCF8HB%^kRg7Gudz#ZZ2x+`TGreIDeS5gQ*udG$ z;dhUFAeD)cyl__%d9IZA`K|4=sRQGGKag0~P8kq!1+E*mEiSz|m=Jij(M9!^(c!=- zJ8!5y(Ds{jjkUU;c*6Lt&4*0`#G)r>tZS{^pNZ|xmp$%9yowj!KD4jW|G4Gfyd(Cb zOc`EMQM~B;fO(PI9)e3fRc1e)t`g96pzn9kA}6%Pm9r`GF8Yt@6#8dNR079>xD`s_{`HdRu z?S%h0uNuQkx+{*SM*ke_6mL$|$jkb?3%`*cRCV|vZLJslH*ZaZ_lr-j{p*{9woY9Z zZ6W1TwU*<-VlFI!q_zTG=2Q+{&*&Ar4kP~ErZI8Dq4(T|MzuWn_G0cAUo8i9TCX)GJ5Gb zE8b6Afwh6+tS{S=$`$vFqN#KDDzN*JOwD^D*IGkMukG`wiI`85dy;3HTenx>$y8dw zu_2?}RGyDc=z-0+{yz#!HsLo*wgGHbSQ@KvtScZEJrc#9%UL-Reh)m{XP{6ymT^f{ z5dVtj1sC{Zefc}F=&=pQP~8kZTY(4>`+!jdmEitX;&h^<#iTW9aH9n!S&ewsE{FuN z{00hnPK5DLMl#xin!8G(RN$<3fs4-J`9)Ep2}DZD3}84rm>FRphd|Hv5@H4-RA%Y$ z77Qts=s?EFusJn`2#6v(>Q-OUdiK(g4VA|D0Bsv4*@K?xrHCU^5`n{|&tSUL@E^qO z`dUzq`gLCfoCztSf=VWCcdx>M>ktVKL_xS1&<%_Mu-HtTsuAMgC<^p-5UkGu^lb-J zNe$1V2ApZ*gS}URKEq@Q(IF~Tc%T&_*`AuoUa>eL%v`nP=fAc!Q7T8uJrt4%9Yy2~ zcCo#?k_qLWCeqtmwr9CKYH3D*UBDwgV!tMKKNTjO4BOhXTROJ0jf=L%L{gyJw;s$o zLsb-&aD$zck^e*`8}mzI^J8I$i}v9VDshSDkm)|U(`98c)+>XN`BPl?c< z?z4%6VY~o6nLBpY$97o*h?*b+qIM_29#uE!*jz6<1*>iba1}e40fCl5uxB$zRJU^$ z7`#b}AXlr58hefmTX77Bs1sp;|J&@9={_$@Tv$J`RdLi<5)o#vjHyfXSD%3v67MTH zELsuyq!z1i!7{k#{ba9A9E|=sQdJSzJrrflK!&Mc2d_&%2ri%oyT8MSYbhf^b+E5z zFiLI|CK3n!lBiuwnq5Gqzvs^TI|W)9%H|5ypQB#w3W8~}*temcsi3|Y;-M(NK7=K= z&4Uw(bg|p@no@}X#36@JEsL@a2xUdmo=d{IMSk^`@pzO`qjlI&{Xww%q-cl%W&5UJ zIK-)hodLiv>J7moyAgXZlF9NB)GE0zz8@3dXgMfjW9222?*b5!OJUk}F1~8tasL=A zTldJ#{?CnFNrd5NMpwJE`6tcA5kB8;DqQ?wN|iWhlW#`L0WgJQyL<3c$~<+Dz%FQu z8})<-Wuk~IOOl7V5|ZeAfmxry%s5eV{SVr=B8X96kL^w$uG3W=tA$t+VK(f;MWqp9 zv%NN~lxP!8&vZc)+k2z}ah^R?^mlLQvNQ!MJ^<54)6R$jH#f28!97>3Fjlju5Hg?4b*Jig+?zCTB%-m^#S(^F<9@*$X1P!FNEa}szc88+1Qfv+8- zN5U!;J)npbfr?5YuryufphSP2urEQ$s-RrRaKL7DIN*h8VvmU+Snc${r0Hazfu?yD zHI}KEl{0x*R}2&PO`A4Ruqpy9jj*YV%4em7zt?;ib!$wycY%Yl(jmw`v#!GxxN|* zjh)LQ5S9(bYrV@&TxD?0GgvwmmY=t0-qgs{OL>_4t)zp+n_>z8IcSC1BV2T<*C384 z*b}Qn>;ayQdw?bA*i5e_c6q023~}^*YC}V6ZQTvWr2^cFY)D1&dFJXXtB<0N!VXL| zz7kxi@gHML82aoB6!Z4|mDqKnAAfrJf}Q1yM_k&;EA|o1XInDE#!PU`#dV14TtMO8 za_iQ@Ub7lnp>VIO_5z}!ruGBrLL4mh2dbi~9DZBhMgV^=f&R=7>Lbo`9qbYWVJtyP zhonNin?I1U@8UX#lJwJH0AW=7LgY^%&EQnId%soJ0)38$Xa6&|9ftC`2E-ac&WiZqCOZ9BFl~P$y>( zKN3tAJ-XUcJ;I0A5Rv(h6Wu(^kGk5zHFu6?V@=8zb5P^;$YgGRim<7$H%U4q)gh^q zf(wJ(^XiuPP~5^EP2N#Ip;4_gXg7epnHmVOJ3$CztAfdOlPA;mb7x~ zLo+40-TlLc9*TKh2VbGih$K%fWK%r9M+`LIJ(_%hCW9v7EicNpmTT5&a9JEgTMe6Q z#xI4MIim8QDp__2c6OScJ8%{O_{S#a+-!PXHHp$v(%2_hF1;!Fpw~nu%*BNhUcj7( zjWC#l3U2|A`8pmuxX^+j!nE)h=xtLy0a|X#N0D8Kip#-@8s5&_zMt~|Tt*LGo-HE1 zwQ7c{sIb*_4e23$Y2Z2Zv$u&!11a~!%zIoYcjqc&1iOg{Y$8vHZPAro%z=Z?10s#y z>cv4l6h_5}svE&~WJ!YUAK9N;<-!{HP@1O5S~)^Kn2VDK0EBJK1E)a)%L&lw`s%G! z6-k~t$ZpGQ7-J!YT|*Vj)|-M9dM?e2TKyh325?aO0K2dPX%RUTX4Xv+2NyD9N}#ur z{kWKm*&?C(`lMto)Ziw+M;tW&O|#vVUX(L@pNyfev{*yrls)h?F`+jXC4L`BW!V&2U^N zl?&nyz!_fc8O;Wle5~Z3Rks5jlXh6ifLVDmAmi*%=YlkFF%U~mogfXkgdPx_oHS5# z_L8~Xlg7STM!K1n*MnRb)fS*`lquw(MT-`cM*G}9K)b8-f7v7-v>E>hYa$Llrltj_ zKq2F#R@oeM@WY=-Z<}YRJ!g-4Xti@R#NGk8sh?KYN3tj5Abw6}*Dci0Gj757O6f+$ z0#O0Ig?}f(6hqlOqQ`C(%R3-egI=RgJ=CP(S`UA;c z8mzQg1ZE^0m5`e$1s4aol z*y|ST^^s0A=s|rl6qH_F*86i3>v;2P%kroacmrTw@I_SQfoAgykR81sQSPY}dt1^VXop{|Ad?i&dWdS1T& zAZQYr{0YWZ4RcVX)Uh*mL}9RM9ArPF@3CnCMX+HkfI2}>2Bi?oK|Ro0ZA6zt^zHg- zk?C01F%9~+d4CsZ5Sx*RDmHHZV?Ku@yQ?G>@#E>ynh`Pe~;Digf^2zeub zhm@;=iFQ#4d0#kcBTs8N!Eww=8VFTTG{n^!NUvZp*!2vVXFv;hiMaC}!_9Mi5@Ldx;vAQ3(0!swNUIN^i5I9pA=sm ztDYm9$B+OT^rZ}VH{s88xmQJRAQ9uJE~5~U{ygC>N5IcN=r~y2>Yu@6&?o{Dzp(6;sFloZiE5JUm5w^Gdl?q2McD&h6(ebDov5nWn%H9 zNLg`Rq^3AGxaGfN38+V~-qlcVY z!bM`OSj|Kf4U$p(1(HLH2OiC=WQcff0kXAXrgMTgqMjn|n4A!*f}lW~#vb-d`NyZ3 z$!V}(ShsL6MjM$`4U>+n8*xG%Fj83!Cs`ko+VNDwj(d?Z%u1QC#JxP&gf0>hCIVA3 zC3IT;$jFE4ghED>szpJzFvPeO!@qe-Csc}2+)`LA3C3ma0lbVJ-DILp;9$nA6ay2_ zt|Q|`Ws)%&x74tbL8!sr<9JF#R@z{g$2eMX+6a7qj zmJ4(UM~quAyi#gRubZHT*E3^0-5#`~I|#tLzl)w+x@SPEpCe1t_)#M?;3E3jd!rBT zD;agRA*)~;PsxAD$$GTe*3@KkCVeLlN(5Ze;V=z$ zXaTbBtx>t@fOZ~>*r(3QfVvNvdcbgOwDrm0n#6z%GX@7Vlw0?Q2EA6ufNWPIshD(d z^k77oN;_Z)ry-1r2y_$?TUV3NL)b7UAPo;BLA9m$u>ERSYZ)mUk)^;eascY-j942U z`?)pZ8~Eh7^+V4=_+Z%*jw|KjLllL!UG91z?+lU+MzK!-CVDNI47SI+Tl4#j8 zwl{9sIy+6+lLNIdY6)5`4)Qcb z&gp5ow6H3w4^nWVe5BE_vp6W1ZY#UkT;~IyinUQH5*7{fJZ2>mgsN+F@-1h%|9k7f z&|?{UMg=`&7Y%yWn*nLSL9kK3DFvqlS!LJh@}Z=JJ;?0iX53F*e zsOl0cb78@yFs#2RTc$wpdQ%1qKpQzUiWJ1!Y*#W=Vwo!^>weOwI%|^l?gSD{9Msw| zS_QQ0^>|M#PCGkVa3_;&>1VS6!qR>A2J4XO4v`_yhizQrof*_ z11RLsix!>_g^Z8}udZ{>-AQO8?xr~ENSrT;%a~g0BJ@~Wh_jiyU2J#G8*tw>MlQg&ks^5s{x&;9_JGdQIcu~LG z^^iooDDQ4dyNOQfY2F$E2P;~%uQXcQ{z0V$s9TC&wx!Yu^ME86E^Z%I;eqhVfQeSY z%rc3bmKmK;9*8c-K?gmZgj|L20`yGG}CKQ0%;z`LO;w{-Su zum0arMCX{O%O3vcCwjO`!?9lEdju|KM?f9K@}HZCS_RT#t%{2|sQXIhF`vh-0Lbu6 z-J^}UU79N#@`H2%0s66iQeAW2jyyKwRVdG|lht()QXXrTuv zGL1N*$e`9%!_eC@lLzfP*#zidLn`!dV;VR=$l4jDi~aHmd$=0{kzya~tlo2>KQBQ& zIYE_{AQqx_cvKRk04BaLHq4XqE+c}>B=0a?G2$O}pUjYMD#6F0FJCwR8GRXEL4Yx7 zs&6q{FK%W{@`lOAhf2^Bzrq>qp^W@p?5`f{XVr1gfZ@y-Ki%)QeoyVJ{bSsjPMiX{fU8Jd%i(v(6d5=xwGv_Eq5;{s(h zt?_nmW3IW%t-OiP^??``H$b@=wmwn0+(wg)VmB&go^cxCuHjTfAv66Hczs$iVp5f%Dp45KNpYVH=QvS8{nU_X|j>HbrhqC&M~wa`?$NOG1vIz*S^K74|g>* zlX06`i%p5nV;wYR3WcX`c^;l~mxDD`@OIm^qTf?ZXU4R#O+&PxZS2!VG1rpiTrt;x za$O2CS;lG8m|T+Gh{9+^(&=9@iVt250NW$4?+i6O$=$vb0|?G1xr&#Gc9}Fy)H_Fj zo<*TP!1AmD(WzTQrd{u%yO1a4u}>g>fPvxfn~OsUcC|3k*CgfGG&zcLEi{QN<+Rzu za}!|Yqg}G1(3`J7qR9DKpmh;DM!oz+QHu1m){_7xH#}h0A-$V?`ToNhirx6b==bm5 zn^1oj_ZnfcjzsLRkdR7C&G{u~?NHD>0bp{Gv(2lWdnxGa0Wbr5J!8F!rc; z8PCm3lN{$9jq;7bcw}Di= zeG}046w@{_@A0R*)#%-*%UfgGNTy?At`*AjvdGS@ff$jwfRzq_Q`>!_;iy(n-h}so z<-yG+$Gp|jee(`O!AeI3ggkGl`CUp4rr`SNT%gcllN{UHB1}KW=H|}k)VB5XbLHf% zD9PyQ7wMFDtA%C#?=B^8gqO?GE7YYvJC6wh8yF||@lBL(z>yVScfhzG^!#3ruW#0H z{8)^>Fsbt?D~(94Y+e~HYEHsF{7E&U1b|u2ZB&@YwF{S@ zw~;F4DsKDN$jC2t@_>}4GV0zfp3kXq&qX=fYz*>72Yw1Hm7nUTPjMW(@KuF=Kh$t9 zx8AUNm0c!7*E9YHA2nKgN!s^yFi)a`8xYcNatQ!N9!$+;+_ti2pFF@Z_L1zamo#Ig zwz<=F9n5+Qu2hiTenf9r(*oZ4Hnanv_%NE!>}uRlSQc0?vB3ydzJAbo@;FrJOCBgN zknR10kNY|lUxk&^dDIW|Qev{c68syBJ`>X}dj@6x0H64U_knKg7GZ(nDsz&@)b*$D zepZmLpbrS*w~lN0W081Jg5bD>HwSoTeywa6@6C(b5Ep1*GNF2AkiG# zp33*X5jk5_N=J-|OMNtym40wgTf9$P^Auomf%Dk2+LmdG=C$QpN4GU2Svlo?XWesF zzX2~pedW!U!6AnUOM^8WF41xeWq`%P-Re)1qTlR7%*vjH^xt$ z7$*sseR-s}#wB~fc4pEo5vpYU*ED0+fc4ee)#|VTo)Le3F^9xKCc%QC#<&`Ve^IsT z!N#xtQlgs-!lukoz6`<4sxn*nit69*V!{9fRxw_n#_g&v%fv^_k&YcQXR@s!^Vu=Y( z-=&Mg$F)M&YUu3DcXrmZ$jLJE-l{&k_w}# z7Z2U3KQ%m~FmH+eLeA@##aHPk!wP#D8t8Y{>Z5@@q@~AysVu)mGV1T^_{InNT z>+bH-y)IREnDTxKw~xYku+^^?dX;3JW4B7FrS5fp`nHXq6Zz;OjJb@{f%|rIabWsN z%*oY&yig5mZ3n-YJi^}9YFSw*Gl-lnINUYr^RUQqaKJdkKlSCpT=`GSsDa<(|2kw} ziPZUQdK#r}yf$`GA@t_IE8heR2*3Q@ciE)v2C&xHX_1YRX1`3A{!28)+8s~iD}G9J z6!kfseNcu)x1(zF0GnDTp{qPR&2H9{_C;*54}}q2e*w%o*tHtwK zo$SK;5uu=JAG1YAtZPcdBJ(L+wDbwi3jm=)Ux=W**Ppx^^3*=6H96KM5BVrtUg8&c z;xr{Pzoqn)!=VwBL8O27?>qJ8Ag+}Xp~f#de$hPg4(zx$&$rONI81_Gvg01BKwW?S z-ccq?zRs{`vsVrc^o5i?(m-#L>mn&C##8=Z<- z1BQ0dnTA5f%c@m?v)cHGb4QQ-0P}Ya=dy*XwIg)fmIUZIL@L>q(`-vMG~zYeqA>La zJtZNem!pR=4(?x;Ocwi=C*scqDEX(vj*Xe$g8lD&*5{0if5hvaZp1QIh&td-S;7kj z*WVtovu7Pexr(wR5;a&J6CL5{_T|XiaX2x0S#+ed6NKU~^`UYM83Wy@z8|ph9C!V4 zT#nn@M`^j%$xXAR0Hj}qx_Zu<`>KanyG6Jib+z;;EUl!7x#mfI5=d)(mhtq7J>Kir zc%z3+1@7R;GJh&S_pUae8_}ThiDIg5+b}2PSy&8S!tGjnh=pyoZeypd!&)eNG9>DS zNLZuZg&bn!{m;_FeR$Ey!`g*L=8GhCJl`3*gR<(xANrinbpKRB?=?jKNUWp^d+#U^ ztaGL7F@SGqe^6*|ngA}yCB=r4zAA`RQ5Lof2|d#3xN(&Nq-|YmoOtU1*j?wZvf zV8pugF0}UAY{tV5P3qqq7L2bM`04*20Q^7$zbB`G#5M^pvA1T45*r)7+w$g7!`Eo@ zPMg3q$HFXLf(_E>C6MvEnHDiEi)ZchgOs&FGA&|6)_-p0dR)$tJO<<&=Cp{$g8j>E zLVygk^x~M78Hw%H#ddLT58eKo97)%_LNg@xCi5IHN`afqewk8w>@Aw|^SGRm`hFIC z#bg3YJgUyAilsrz1(SJJtiFV2MfkzAmeVFfh4^hqb#5GjtMD+BcZ$S|Z0YWN$5WGe z5I#?L7NUgwCd@PcC3BE0@#y%*Op9nZS=`0=HouDzx`UoV=DFyfMtA*{P2%=*JY+uy z?^|@_Pr<8emrtQt%5wK)iZG7aI*FGc?c;d~0zd9xL-9`HNorFXB`J{1t9X0y)b3TD z-CLRGl9&ycD+@nGQKea#?(ZmW(khpJ+XmnNrYX_lW2^3?kFC1T+~Uw*73ufgH^~1W znZ_bnA`4UJ{7RvJ^i>{8tKOrxKr+oyU|7dwx-D;B#ho$ggpY5|G{y5Och=@(d{@fD4FK?JrmOAybe|P4arq(=D~pUNa$DPZpHS`WvIB4S>h3<_PEJnFBy%XADOpW zb6OFSxM%!J%$^y^a`dTPndW#+eE1ZReM3IM1oqj(Wx9VEPhjS2!IYmTV$*e4 z2=Rwumlp5mppHMLpTfL6NB> zMY6=SFm>h}NDukdYA}5p^Q1*W;N-cSkvt5djUgkZIa-KM)GQ$wNTxaJPyFv`RGIcF zCY$tERol)KXC&`?)7lC#Iu)`E0&6eRl)?!-)E}Npo(CBiUrA(jv>PQco~_4v>3awC=Z^n>VJd_m%R2dxdbFL?w(6zk*aqi zW%;w?`KLEW(5E-!))>bR!h93I;us{`l?+v?PI1R87|0(d)!Y@BKd$inaf+!uZb5bt zRmx##&WY@CFJ_MlQn^K1F6t+z<>Er7DNV<7FTV30dGQ@As+5l>V$8lh@qZKuzTO{U zURV;#uRS!z)6DtdyA1xF{`=@VASvM+fk8n!J(mg-2ysBt_{YPX?4sg36nJ9-N9kz>dlq*a+b znlG2)jhQTH%s`js67%dcO6E&}p;~OzB=GUtEUOlcRGCwUR-Ln-2Gq8U<&BK&ebmUv z#)J^DOqjoPhRi`Syimm6K9VICWi*8NA1g|y(~ps#Kr(lhGo7v(etInT^F&^(O{8M2 zqcBf=oXkN|!$S_r`^0N2Z_{fl@veBs;S6lw>;hrcd7pn4e2Qo(o-bUl07bxmJR_CW*ZNsXm8;zC6V4%5-Hh4GWU*X$OexZF2BTGehITdqj8uG8jqt6Q7GPQ zZS;e7tVFl3yuVEMGt2ui(fwZr_kX;~2(J?8h~xH$2QHKaI^vPcqkKG8wYihtYa;G? zT{0Fod-X4pY(54y&;MP{=47-vtckemb==r;cfCFf2A(3{<@Wrp*LK|C3>Yl(9e0-L zc*S$DfAIcOdA{aijKzG7|9zUTIT%yJX7^Q{pzFR)uj{(6-7H=A-R@bU`>vnWb>G1< zUEis!j4{pOJng*G{io{8zpdtP(qG2((3+=*)_i;{nRy*64_CH9w#)e(^R~;$#>X%% zqRq>qqqN*j*$gCQv&5c}s<$@{l+}J&w6*r~w$@%WFMElbdykVjNJw>QHg(P|stS*b zcM5)`cR*4lg4@TGO)v3;_tQl_Xn7H{ObHA0VAH4vD}IIh7N3>6u`zTNIhN1fh#8YY zap9)##u>VTHjGajL8Z^4-AO%SAyK6A^^y#eOfvJZICoMDd=yEe4IYMfvG$XunY@_^ z&;z3RzvMEVd5VfpFmGl!H;wUq#7#eEn&Z?M?)9FT#EUO|ySASV2BX zOpBR%KhqrJUgTB5!rXzFlu<%jOtz`nhbSF)=k8lrgK8U;OmjRY%rCx4<{*XL9(Ec- zPhgtEAzpN3(TgCVr#-tGec}9Q;SBc@dIKc5Ql0Im46%DOXEf%HXuMAZQonGfrN^Xt zF0$CeIQ+a)3_mZk+icx(3e;Ke+HE#h;x;w+4ZF>jnpmXfdf**t;P`;c8(Nj+?9Qmk zJoTL}8v4m_hWn0ohceQU%D+D^x0;kZf0SjMTLqDSc0KOco!BeV9HHi$_N~nva3q zAudl5^W0*dA6=e8NCS*%NnPM8cg;;v^KeSy)B9vk*rQGQ(Y3a->UR(Jn15rW<4eXC<4hTkQVS#QiR{$2Lgo$=zZPq+UOk zT3FJyTf;pr`w^D7Z+u6WJ(-$CJNTmRWTrWiNAkEG)qvu5R0Cc)GJ7F~cH(|@<{M?Y z?q6@`1N+eG!BKplrzmdx#;e9W9m1HW2pd?;J2}kP=J7JU_;02~O&P%_*7w)v6YKDUB4-nZX4C-j zO0zTkm1dZPquPlFr;hLk@Pldnq9G-?wB&G?#$r+vOVr#|Hk-{AyN?ghxMIKO=`FS4 zv98`)cIbTG&+M5o%p2N@d9raDgb%#u@$L!FQJyU5DVVyU?Yi)AWE!T>EN4RTTBbQZ z7|x@oLr*@2)KkiO>-k(ux!Hz5M%*(WbKrIoTSzGPmg)ZV;QaVxGnxFT`H;^X^JLcgpm!?b(JZt};cm}^9RVJi* zGwoO+Kyi@n0)UpC?0bPpn>XG zGE8*v$}%XFKr;6heA}jGpQM54@xyppu^pq=Ktlgdm}eXz^Nb^+u5*_RQ?p;C_RM4A zwL!D!HIUH%6Xr?WJZTnLAIa?PVt99STfjLv1yq8ad(N0ef6SOg#~T&0AQn=fz$~HA zXCBP{BVC?tIL8a+pJ99A3}G97F)hja+?@*V#LO5q`xcel&lwP3Q}Ln?kCski#-jmU z#UuC?uluji;)MsEqvXEemqA#mqGXyLPN4iC%>7;YY*km9BAm`MFW-3N=?(2~X#0ySc<2R;5vV8n5eg)F0i2tMm45^qf-A04tB_+;vD{6K6n)Kfqpz8X zNlib%#KIiW1u0ip1$oNXZ8lanZ`Uf*{qst6y?lQyA;e-lw{F53R7F53PFTT_lXWV_Nj$#yfaeP4Oo zQ_%L?WP1tOeuZpbSu5F&1KX!hl(XFfZTBPFUCDL_vfXT!WIGCMe^}o3rDwo)J+fVb z@$ESK4BGxIU$Wf_Y!54M`%Sd{OC;J}PPTK&_JWO)?I&>jtGsOmZNC>O#=lAjqs>Kw zB%8P^`uy>7Hj4-2_*bMD|N4D!x$&=qgZcPZGd}+H0XH}U28)gjcyRhw< zbe@}S0kfNBXm*2}ecFr<`ZI6RPuy%im_0>iOS#!}FbgHK*4*qxFk4%SX8i`MHs3%n zc#aHOfk78As8y=#zT_HZx_`xO(~2VV_}qYU<8wVCEXLK zuj{@KCg{3vai*^OI^Wjyol1=e)6m?u@G`x4uK9bN%6;#jS{C0srqTBf)PnEb8Vc<1 zYMI!>fxT=mtv~)?Ag>z+ZKS#Zq?)gU)vaO6OL2y6-&>*oTQK+ea41{Cplk`7p7bN8 zgL~o&@{}iQ)xd-h#@su?xBK4IbzRL5brzrX`P4GKINyqwR?dG8EB}?ePX7C+Ciw5( zp}OunT&C;3p*r~VSWS~pv*25cDjeT@v{L!@IMbB519*VM_$fd@GEK=GAS(D@hSLL( zRB`1LsIz{cp_!foL|d}p6+ROA3Vh|pFx5-lUB@E>usJ_(ZB=?!nisNE`@qrlLV*$zBH>ynO%{0e>{@mJ$1bPaRd6^woekI~aPm!7% z2S2=y%teZg*^6+wAyh+|P}>Amol^wU%Ln4TG!XZ^Fu&H6%t115H5>D$R>JS$f@aS) zcHlIAbseZPN{XNroBIhU-l%<0x_Lu;ZK`Cm+58i+;S*7{KdWKi`9l4%iF`f>B{ z`D6}KEc53>E4TzHlE!Is3e?3Z&X}Dk&RCnTyU{+NfmauJH@KzXa;E!VMQ6aTmvvqD z{V@|O+FwaL;3(7mYf4S^tvAKFpFPnoT%B13x?MBQuSTDL;rtYR$)y(YsPI5~2fmmH zS3Ayk9);)bo0ZgAZ{k|#s4#dlWUiXOZqpdPZUufY_f4ld=Vf~5kG_0qi_6Jhabcq~ z>U;5k?d1>P2NdLe<>ebV5(WPbU;~ZTuXp0y z+Vzu6OM1GmXw?lW6s*K1xrj za^xfCIl``=V}*YyZ1m+}EcO!fwz!*lC)nAHGEAFpJe}ph8Rng+yS&Q7>lIrkHQ!~o zGj~}#)%_RrM7>4v!}XC+NrPg(skXxp1S9)gzKJu zo?Hi#d8<9fys35rGF{R0pykcOXdw}_XOsrj|qFmRn4derUndWV%UO-fEB2f_*3*uAiiV>ShVhn91g^WjlSmc)&%S7rBxQ%8kH4lMNlu zv-6A{t8sCNCxhO@6{ue2lSjmqQZ{!>iaZjBC6lk+-rG8@!PBy!#m{YP^U2p*hBI08 z0?T^g2u@Qzg3}ax5)NN49)1npB6E-wexV`K-X|~H3So$Y_C*w66b#3?lX^QNeIZp$ zd!KeuXxIY&zQ}tb=zmYPGt4R+w1{54c=0wOhl)3l%v0q5ox1$Zdr>-CefLvTF5wU6 zIpBX4Ur4&AmnceZb`eDh{9;PcROZ(LiLua0n)I&a(XQ#`vnjFpuw+H&qda7Cv%rM zRrh#1?TD2)p zHnQ_VDzA6E&OC+wI=HXGvAQRvn@wXMA+O>ODp;#0=Vi2hig|uyp8YP*HgJ0%sQ=Ll z^Xy`ti>aRd@ds0{UsUtwxi?b61Iavvsp_f%7R!CI1e0E0-Q{)E;y$Sk<=5CH{@19m zj^XZ@m)e;yAeonePtME}J}GH8t~>WdoDK=;QOpxbf2E0Z@>g$>7T}ktnEcO|=(_LW zX;@+3PvXK96n~O9P2w1dgCxEuv4g}nB=S)(O&OoYn}&6EPzw+w^D5(Gjb#_dKM~6= z!o6s@B(zNT|8(7Qy@lm^g?FDR-$$PCL;3Xzy`a~1p^C9yp%?bo+VqiZ;-PM>%iElc zHrH1%)+_WXzh0pi^_1E-66+PXL3|@zukcXle_yXKD$Jt&o;Z!#?_I;7{XVdduKTWC z(RE)9_~(i*(S5n2jr9r-gqfQ2D?=(=ui#B_-k|o^u1eVc%H!>?>Ad|#tvqFIcOHc) zGbsu|Lg@=7nELhUyH$4@Ri=5}dHRfhfzl^Pra97ud1t;FxihUs?$=$k%bQQ62Oyyu zTZ-+fo^|qiJA2R(N{gx7l=hE>+6`B*`%l}!LT_ge_iqi@-P`yO6jUAFmZNr6wz0%3 zYR*i%(PZ!KOk-Y0-<1mFQq9pFZ&`5hO%J&L1kVH8L{(ZOUroo)aT>|I5mz($VumJ# z(qe{w%oFBL$_>Log)$63oQh;&d^!>rptErBBRagWqzbNo&;~ivn5SQyJE=>UbgtBT zUe%^YLoH1qkQoyge5D$5L7>LW;7h$Apm0h)#y9CCc_K3#tD%j&nob9WDo!4V?$bk< zyQn6ZW8*;MNnpl~Jglp{nbFL%Q`G;yCmWRM%sVwE)l&dw;5c8K24%X-vy*vt`TJrT z%M9ZSFh=?sHNXWJ{>!*Yus&q{IlqN+hkKO{8$$UAa{sqVsPIT|@s!te4y8Ph%&R2a zZxkNhrK0dSlt=SPwldvc$5@U5{q;*-Ic7=>VW!~qYRa*$qI+r|MGrtSO(`%Q%vekh zKr&5PUXhL271&5|hN&Bp?ZXQT!qg1~=snZuKv4NMiq;QBLirXB0MD+H=+Xx#-Sqd2_it`wDl?MR#t?o67^b4L#ta zx`&vzRu$%bGDOW^jRa@~aYQYFSd9pHf(&nHRpw0&Rr9N;`L@C{VRsj*8w&ZFB;hgN zoU&5gKgqNOu3UVC+sm)-;~l{`rYQ?jc>u25O98lYFNHEqX*cBOr-iYcg7FVAO&KZP z|CO&V1sUKOYyNOLPE!)a>tFJDlP_uBq@gfx#z$3}4VOP#h1!j`*quWDS7sgZ0P%*} znKxNsbTlJQ4dRX@;XYr#(o)@jh=Q&B`Ux5zN`~-CfbdFSnv%}AgC``DgF#ZiA*Udt zE0n(s$9H;m)VJmJ?8r1n5))MeclbPVxWj2Y;0{NLsX7z`IYfNyT|Qg%?qMU4@nC`k z=H8JEiTYS)o_HVStul~Ia})~m9%IQIBnIuOTOvk1e2RlX?c{59I}p?A>{RNlP3nw& z5NKKfWIwMBqM0`|48vD*^c7!P{xiJ^>iXOl&+n4yq&H=@dmQEh-r>^ z@s&oi=_`$98$sDF#J|2w*L~mJEYY6#QV`7Ix;Hpt$!`!X-#~y`62Drfg5)fiv|i1rA8&RYDrb`{Qvq zVD)BcZ#;u9&J^viwt3;qU1C>f7NHYx5z--6crz?7&Cc8QxEX7Ad0sz z&5?dwzx2pfz@hr81x5id1 z7WH4E;yzQ|Hnkhm99`OR|Gcw_{PPa>J{$wiRJXB2W#F0WHgzV}B88_znbzAL#Z8XF-U z@xh~XrY(hZDDRE%7`}DY9LO$ODK0tJmp2AO)&6g(?*F3Pfdoub;*)vs4UD7U8_2Kv z4^#75t!ssLHTzqta_>sU^7@)eUbu!gfH*F-<$mrEP39f&N=nDEwpQIwHJ{aSpJ~9{ zCAHLCoQ!do+%s`3bC=Y}=mNhp8ZphWL@+a-CaWNsyC9C*_)K$57H^#4JIX*ZcR{l8 zMt|`}c1?N%By$%q{)W4x=6Lv4ym)WGO?nR`a~C8SBvrhzzcFuYG{!g53{vfh;PwdQ zooU10zV;apr_W4pYmTkrjpmU&U?NRlbeGi0c$m3M>Z&;xX`Po>*cd{i-6&1W(c+DX z@6#I~WnU<%ZFoFq?xuJK8Q4&0**<@h@>?9_w;0H8F-%iz0yL!&@9^QZv5GH=_bOb@ z1g&R`n!n(scv>#?5^is<=7dD-yL-I3eH6(w$I7G%+DB^kd1|X^N!D$oaY=V*BSp$> zq-bU=oWZSwYW|b8u5GK7(S>OdO_O+YVdrsbF6_h&9XIUiYaaN%Uc@}x*!82V@J3ta zK5b|AB1WeN^ma1HYB9{cBW^p>B7SepNk6S4(oeXnF5-J(-mWp3gOnHb2N=rxtu5MW z{v=)3edk}myxj6qsqRmsKHw|j?E!oY5F{Tmv6b%=my6%kR^@5503Pa3K#-z8p=NiY z!rP53dnRqg+n+hXl(H*IF1qWit3T+!uBCo$9Y(9{*}TSB=aikYZ_xP{pW}=m>y`$ zm+()i?r%;7ImEv}O!^5Q0`J!je!qrzALFesFONnM z>HRwH(+y-ROjFJz^7sFJirxolbnD6u(3DG$FIbJw%oV^F`GSxaHxe)!<1Dd6>K$fZ zpyFasB34yO@W!qKrk0iCdscU$?s>6Q5QTrDk3&0mOp&h2?9 z)eWpNv+rj)yR*8m86`HG-8QiultrE*<~hJOl_)PIa2GEAja&%Q7;2J-K={ba$HQs< z;e4s?e^qW0l#7qwY(et@nqm`QJHL&-1`^8uR(#MSD5bFP;Y^{A7IY=X z;QHUkc#wV6lS1YrT+^?7^_X>#Wjn*|rnb`f!Ax`HKE{1EwFCJKq!^`+DX$!y5X$v)k`G`qm4idw&t+}++=943G4yv=V zXgSEwEya?N$|rbN2!61{ZK}6FzM`ycNkOyV+GuJlT*L0ZvPhUOZAIoFnWnsk=B)6y zP%WcIHBW|fn3h!|)RW~LqE)LgSIwV`jgD=3C`Cwub8+A9tQY0RhnQ7&G;LX7`=d3k zIdN2NY2E&~(xSrl$1J1=njkc74^ARE%b3HC=5yFFG^P4}3y~_OeL$%Kr0f^Xg4l155?}t*wBc@%LULX#M!UEaHRv6<9eCe{g#IC+}J=A9VnwDXS zRRiHqU%d?$%_>;t4s`pnLZUf0^j+59fty)P(HGi&p1-j(hI_BXom$!pG zHSyxaWLEflsLLC%^^3|jm#0=em$!bsZr*`m?xfb>?D2QGJg$0S#S59|mdkT0)w9Fp zDe@gu%5<0KH1nJ)p3Xd5a2Ckr;Y&cg%9SOde7q*GZ!^Og>B0uVwa;(sd`lCSyBW>| zmp9pNtnJW*mxWh3p06;WMW>$i#zA7Z6iZWbALXTpo1Yxwo=eHX2x3Pdh*O;D%`0iPK=h_h+Mls1b4syTgo8~v|1A}fQO>G9VnYIeFjyIA5*)q9wt_ zqo|UI5BTNscDAP`9-a6&EBq7UquC0KkH=l!`j1n5d~sgH$Kzqe%L0+nF%%=Ccpmd) zIY&a!i0GizY|603rs&AxD_bZ!Mto+DjzJYg$9lfxCCfPy;sV(IG^%2&#`CcMV=IL{ zND=ngP!jm#cp0+hYknjj{$QG8pYa4sd3a)O`_@!*B500xSsWE7YnB)BH<#ndZVpX6 z*!>uP06)|X$&Z5bkMj64hDmW?MicAwU3^sy1WYspOw91lY}3`ZQk-$V0W&DZv7?9w zRU|`nujUy)*-jZAPu25A{8EK(2lBo75wvZUtIbp~4FYc!*=#uL@e_5*QJTuF6z4Fk zqn3@}<(4~X<6jWx!@#vTFY2)~9L4fRsGn8Fg9vkew%G#nsGe+R8h2Dbkh`*-L+mzN zP5w?KFH1*aSz5l9+k)Tl{cA7NnWv=qEu2E-4)mR}m+Ai0TTuB&)LaxQU4tZg$<*lI zm4YR<%~yT-?Z6_XI69CWO@!c8;*WXClW+P0itLCqMdkvq4g&#~)#y!jfZS_n1FuB#D;d6u63V7h@o6ngWKD4vT(c<9> z8$Pd7KmVSGts6c!o7|z{lUJ_cGnZ%1xxBc|41rL#*T}$YLW_2 zT2bf{D`D;q7e{i23n#063;f-wUbylQcf&orUbttgIrNzrk`ME}e+BZ9aGtqg-p%Yd zdywNaCGR1tV&r2QAsqdXb$_$hLstFGq=)`ze^Z@x7nYpZ=TviVqIX2UvlUH(UyJ1~ zdaoC`2&5DN)!#Ekz^E$!BLXzXvRLkolkLgDAVn9)Cb~GFgxN*=_0xt>I;1#9!k1~q zE1nK)eD~7byzDVt#w+^3D?jpA^2llBUFOT^OY84`E!F+Ln-!k-bIfirUb;U=+~d@8a?Q01udAK8RoZKE=NDJ@y5`l{0;cQv?$;G{J~?L`2+aD^ldD0+r%eX?0)9iF2>LsZe!liDtzp0ki7f_ z`oH({0DF#?sUU+F^7u~m!b}-+yj1s(vs^E;$7V5}m@M#L<`5nv)0CL|D;mFw4m3XQ z8Q+0vj#4L&kk&6#gtW#p&K+lkxtotHyK(nRGB&Pb<}xigPR*Zp zh);@w6w9uTG~)Jd^W8rnq5Ko(aec@fB=b5NEUs*m#+0RyiNi^{)TJsZA+Op+F{Qe!+)^x!grV z$0Dc;EQ8v2(+KKiQQU$3_?mQ(OjBk>RTR_<$_Mqk6x0Kvu;cS>Cv#KG55$v#ksd23SuNry;NFi%(UcDS7I)Yg{}3u zC!6ruAdt+fZ2i}Wg=H^`SQyYBW1+)=Qr$nb{B34umT+nrZ(f(-WU+Gl-iqSGW-k{X2Pr=G+{;7$munRAAerV^E6k5Q zMdrtz3dBg5+~W&3dVEhcg>Q(B(%3l=QxaP!yLdC4(UOnO+!8*TWgKCG1BJ#knHX$0 ztbEC>_K7j;nRK`T4)e9Ar>`-S=I6>Z0TLa=0MQokzgR%AF52d=l{~hMX`F;}f{P^ie z{-wre=u3_9;5nrzvZD59oM|fHBnA1xNFKB&yHn7Dg!YdxpHqX(L1JfcE5DO0j5_X# zE@!wp6W1?k5nUs({tqou^IymMzcBB0Q~e)VLH!?DLH$3ka=GP8Vq!kxbe#(8f8XsC zK03X*4iBX6{A4+h%&Tm^Xhg@w7esVC)f=Ou?cV>jpCrX@)&CKny6-Xi)O~m)nUYZF zKlBG8#DRj2yX)|f7{FUr1E^(nsWvws!jEbjf+s^bj@7<%i)&MD>k$8-wsnZx=T_L_ zda3rET3l(hx&N1~Aa8e{JdCi?u|{bt-SU;^}b8(OUn(zje{SD{FCoJu{O01(Iow zw}iP?o6JF4`}YOmikLKr&77)%*|s zt%?5qrY85-3Vw_nNTxYH7UuQi$Q-1)AvrGCzmsZmSB&Aeq=95!Wzu=WzyAyu{*6dO z|Ca6gAO8KxW>KDpi!bfs<;N~6KW^OfU&{0G-I(V1;U4aa)o;?p&V@tYKZccBo-p zx_zp(%~;DEI=}^QtUS(W%@7?DKooaq`drHP<>YJzL2*B zwM!;ZLDC?+Ses9Wgg8crbALTPgZu?@6QjWD9?pGmb|v`$^wHshwv7H*q}X9`9#Pj9;T zEd~tbJ4n7#x&PMZk^ex#n~~DOMfui}2)D}J)O9?48sw$~o6Y90sq4D$`=ncRGl^w* zb`;-xg74^kVpRF?tp0)RF3Z zK>WQ)d_ep?oS%;RRy?>Mc2r%!f&QqEtBdt=V!JK=nDLuF4L;B>&VF3oaF9Y-o%NQD zUyVBp8_}B0c2W17WQD(nFwZ{Pi1j_QAEh{;>q?^8^;67~CEex1G^JT}9xBCrz!c;i zW1-Z+1K`&p3ILE43%{1>y02sFTbB33EVNs!H(%}GpV$7N&x2&R-rRk|u4dyEr0yG) z_+9|_jgaxJn5Mictc~N7kK=IiQF%(I1r%xEgMPSOMqd2g-oYbw;4q3PVMU(G~O=Xcj(P>4hdfFQP*#DK@U{r zPMI`?oC1>JJv%uCQyMW%StZ^m;#XaPWb%bH-l`%J8Xl!c0Lk$Bi^O)xQ@>_f#Hgxx zyy-B7QsgjP@*UBuDo?5Re@Eu`<2`LX6TqH2Ga7H*#><=&t0v z&Bor93}=|HTYK{yXdJZvtEd$%q4<~v<@Z(LNvqsE=mueKH4hr6ZeaG|g@w46F@cGD z3gQ@EYfMMZJH{K|9yNpzAaT34T}%fnX;paep5-m!vp6ZGBna~ZJOhDbni7rXxR0kF zUTm%P-V>_kFPKKx9xtH9sJJgKl(zKDYzM)j{CT%Z*22~NxxC9Wmn!Am8H1Uo?7W-4 zIG0z-bE#5Rz7*!XQl3kdGGCvRZC-VXDaXSH=;W&_N8VjgJ-wM}jxKle!2XtR^8$&@ zj0FXzIaH5}j>64^DC8$wE7iCQ^Zs2(VfF7q5eOQK3lxzNzlVvs5mUqVyhW56c4s`p zw21G*xDzoYY|mRnDIsE|FvpazJ#P`Egq|T-W~&=gjg%0>r1N;i6-@p|Xc5TpFz(0G zd}shC!+&6!!zG@~qEnhsqWk@qaV>}AAuGH7>{4C#b#95xm4Yp$y1)3AsSU|A<B0f^dXNJ^8UyE$54%!6 z?0gsZVr$+4ZA~rEX2N{Vqht<}X^igrh(B1|ifK_*?&5X!d~veje9T6JoI{wtopw=c zeDu+CgLy77&vBNxNAvQzdzCR;YxNJQ z`D?_wt~FE=@%3EWlguSiI@25@Dpyz%-KJJz$I8|vQPawID2dYL6&aaK*8P~(&Vb}Kb5G02MAJwBNw?p~+ zTfOu?$coA*zjeTO`kATGr*T6gA%s^#I+cKsAD{X1AetSBHo@7oa+zcc@~B zddqkOH3B`Nx*_Uv7Ss)k`9Ltwcv}6-kQow~mNX#5IGhi10d3T${BT0l%t0d-i^;8+WGGS@mquJ;ogx3`SC^Jq6K`+9i+b}X6~pSc7Ef_<-ET1ptdpcuI*R>R%gwfaNAUpd`{CPYH>UEABYHMtl%7^#=vc zHTI`a-Tk?Z$0-(1+w)Ks?_pZhT=5Zn0w2MW%TucBE=?J0GmdeD_6{B6h%KKJ@w)%` zZC&@}Hsym9ooqamlKJKDAemR`bj%o}DDEW&Db8RY&bMcMsqXJ{D`@?VH^q6H>hHr; ze=p_r_X1vjFW~W2B+dWsx1Rs~B{2W1S0@)9T0<^8w1(<~PsKKi*YxU;!puYJnqxFr zv>5N{CCtl>_pHmTj49j4Q}#t0v=xhAhW4*;!_Rzt?dNxGfo(Qga#~>PRy8_0gzj|- zH;#7WJ}p15HSm=1CvVc~1%Sd?@Do zfInDH!L<9B7V#3kspfwjaxZ@hKm2jHjVJ?`kasQPo*EEOo*KYciPH`^5fJ6?uJBOK z4|VDX@K(**83Q2ymvUG-zgIh*?$tgg%xm!Bl^UaL!Rx-ug*r5yGW~d-sUcRl8?%ORBO=g7m&12Iolal$!6?|0rPY&r*k=%yJD#{ag4_UnOoGu zxf8%=OGQew+ibp~!rQtQ>hxqgv+Oq8MxfB~?B4nK&G-|L&@L4MMPxB;99m2p~MVye<){}4aozMozWQk?!tSeZq zw>)^WI-L%6J%^tT1wW>5p?FqvUZ-7iD{fX7#rPAqL@^G(Tv|3RQE>6ea612y*5NbH zahK`wKZV4g!R&+$|!lXp~sw;a_VE zf-5mOS)KW16`QSxw^niwt^NVN$tD@&?f!i?z;dW_Zbvo$3n#Tkzw4MsKf6J5Gzq_Q z|0n!Ke2-eB_#XUpY4_*KkEvCPkKt!G?{gt8&ocaEM{Jt5E8HFiS%dNHwt#1^qdePT z4dt2dOyCJ64jmiS2tN|y(w1@Oe}M#W`#Na5w$pcZ%)?(jv_S{L+hH@--S2L+eD*q8 zhIeo75%0n;mlm~~p7qdN2f~2%X7hkF{@) zi?Zk*Uyw)Fa(UKdlT;FIH8L|WEw)!`QPRQI!oox&qnpy543c`Wv;|>%dF!To*CWuD!|1%3Pe{KNAwJJ&O3&YU@O&Y8?Mu|xHC zZG@g~zDe)W#+`EACsvcG;8H*f;BTm>U7Mkv>^5e(-MKtlT%L8pbIMnF5+uo!=#X70 zDb@Q)O`~6UHVMxT?^`vEetb~z`?@M%E}_!o3^vMBewq=OiDb#^@qI*>C(|D5!h4Y= z4>tJu4T3a#qD#xPC%X_IjGG|;!E#<+UQ+-q5+xYWL+Ekuua2Z=)Qq?U`ApU96Af*q zJxGrqNEh);d$I^>(^rP#spSr=E6AOmwQqP!AMZW=K!e}V&n6p%kJGwebA+kp^rJ*I z0EMo269Y)u8%&-7qW*e*fT-zJ8mh8DR=M(dRzp2+GI?tsgWOSe-)9)0L%CVz@^W|> zfI?Ru4QepTREH@bMzztkbyZ7|?tFhpT|z`!SyliX)J1kM~-0&-8wm zeKGnxgO(?kLknsWJlbVU?8S^c}* z7vg!kZ&TCbRjAkslG9(v@fJuOS0~wEcaF;s(B)}o_ZF`A2Q*byp-m!Mf^(;f0^vvr zH6WcPGymSqjEayhg|1>|T-*t5fuSU~9rycPnoU1sh(Vikq!z%;k|^|h4<2e$&$iB0@>=%`hz!r zo!?>7w-Hh?7KJw43DgFNOWKumtgfw7eE{D;AiuFz_^aEV7LIMI{t_v8GocRD;+DTG zwYcylv?r5=W0X^!@^dSb$)!i#ev{U&7M3p^3v8YLK#YT+I)@~7KsgEQYt`ZlBQe)M zzZ>&H;yPp^Y2CIn@EghM@EeKh!&||57h1XjRfMTkRc03l-Ee6VQjT;-6+QLp(kxSc zH%=i3-jSye_;P8M2Liu!S}K2oFPCPyiGG8@Od}Z{euS@~T2ZZ4UHY5p@g6Qs>G`{H zNF4lxJS4&w_iN z09L(K`f#p%{(ky!p8dE_l5wMLbu`Bk?w&Eb^ z>*oB(_Co-j#mCfQdTP)1s?6}o6?`9zPZ--uWcq_XN(Ts3i>KZYWvi{*cG?@3Fbg7V z%RNJ?U)tGWr5lezc{~5%_lH{QZ{~%KEUO7JJnI6M`kQ%g3PqkgZyH5zTW476Q}F6g z^a)Lw=i`~vIes`mMt7L}wmcsr#k7x*V%is=oTOtu?X=(Tbzg|AuHn^2zpvw|;P)$% zd>}HE{T@M${Z4{JXJ2$6x_?t!hJiv;PI{@AO>G%|mg!Aw83x|nI>`73`n|*(9mZZ^ zZBk|3_u=o$S>J9|n%B2$%H7<4*_AA1UiqlW(4e~udz;jfIDY@m%l!2bezx%u3`%E- zm+9ZKrw%}&TTFjOGr`#UKOGf(Ivjgx(2KkA_$;wnGJ(#BTYuyJ#J*1biA7U4WvNUr z;;@xP2Lt^?4RGH3p}y^z_6!u6blcAFqk_z;C`OqPjnnsvG^-*@PPVPe3q;@i4X^i& z2ZEW=Che;0BDDV9e`9@J&zo3Z2Oq*;EgaRVz6_DvzwrQM654>BX==rk!aUwu@Jl#G zCKgl(P1$jPM>vTUW|L51rc}!GYgrL?Eh)n0{Shs1VZJMp0fF#EG+nVj6(y;s$R6+g zqR;7I(=pu^1;0DCs3prH@t#E9oi$Nt3r!g)TYv8^Y8{}^mB^PPv6yt*E0>%kh)os> z-7;FIqqle3D3a3)gW^9;0vby>Fb{*ljl`8?6`uC0)oE7Sr%djF9W!i@{p`qF|a*p%XM3_tzctX}^b*ETiR0ZP$B$}Ei zbX#3rw27%Q{=dPC0?t>3QNi|prYlYd%geg$X87H)SuHteGU0P(Q^QZ1{$!$T)%%~t zjsCh)q1(1&s^~vk5k0}J(>1|=Ho3-j0h7S zWTC8Qd_2`NKAt+5h|+KeTt=4Xe&z|8#x4`n$Yo-@Oz-h5r2`aN8Epr6CX11`cQIfE#z9l$ zYdf%EC{cxh2xm)NGQ!!$UL4`XT`e$fFhKdq+x4tU?z1gDx(v{$M_Zd^~D z0vK*y4o2|2)GcM46h0A{i{3ZNxfpmE&qcSrJlsq+Z2~BCrQ4SVR*zjJvAVnqV)gAA zjeg(4(`UR7bIcS5pOt&Kfzbn~fzbnk@i~?7IcE>!&Btyb0EK3GR;FL{8l?jiy5;9A z!siv?kkA8z;iK|@W)t$n0o_*+K*>czB}%SLV3b759(Ui(x`5q?lISG{N{;rGD0!a_ z)h|wO^!xs3>OlwR-`!l9n|<&Bl0Ly*7;DP!B{a*cyIIFSZOeKZqA2%ylEj=Q6qaTCr8 zjZUnVyk^D8`SmBBoRu8FXe9+O+91;hvzanL;VyKV)Z(kC=m#=OIzMp$P-vDHW%|z? zHvVVqgXO88qMLc$FeiduH+28pRk%;as3qOeFV-f0VtL!yhc-okNn4Y4)x`;Yc!bav z@s;{=I(vE!3s1H1)C?CBH()=9=?P0 zWTUC}x*uudjM=SLd?~HVzcg$*Vdwm_1MQr-#yzv%t_s9c>elFFq23Kc;o{0t6F{`^kn0qfZr z3m~2me=Kim%UCj(E(}J?HZEba^h+`Wyvs1!mquN-%dyj8?Do~-KJ?UBTRE&Iw)=;7 zL^o%mnSV+9PyFzW#9!ma%ewGas0)8xLZOE< zx8u6)b3P3kAg?pind?mHxt&?sfo{ao0D}A@(+`u$I6^#mFP|yzLSQRMHbZvHp6__< zUvLz>FVIuMQY+Kj|3>NU(UI8l$#-(M8S-EH0pM77VU$TNc^EfuizdrH%&$EFq+2z4 z9-qnqd@@16n~UolW0YU%($efX>3Uv-iTRclw@^lbu9 z7utjC&!;^&FLc|_gyo%W&%u}Xh2yB|zQ2tr$QoN}c9lGALR9UKlI|5+ekZdh-#$Pq z>J;TEvL~l$QJvB}Y4(0vcBgipY6w*1+oHpInbgYka3O<}aUT{2&v3FJKt?_mZCiMWgw1DxW04$SyK7r` zj+MTx1&)<~tq+eFTeZpzeuq+kYG}a$C8EXDA}_&IMCV~6lg7V>$%7S(}=cWwj%%7P9F9Mg{GX|!c|}1i_$Oe z#e;4t55x)0ws{L9KJP<9JV4(#5(Pe&Rb9%#1pu}n3b?m04PC>px&g#ZaZA}5o8p@! z3fwH)7=HmPSS~Py69vcBv{|VvP zoF6YVOE)Yx&150`0wj9=g7?}<#$M}^uV((bNYe8Pp(%SdF}@$`N%#inTTLb_tK^TV z{Hk**zUr)efa&G((p+ob^!>P?b%Lj*s@9?GiLTTwcW-KjJ>}meG)vm1@T{r#rWRP! zjwaE}$v7=w5)8ll=Fzp|{*64mka)yfgl1X0F`Ptj60s7uU?cD1SHCG^=e}u31P3sW zt!yJt9eao%^xcMHfaSrkwJ#$n;3nCrBoB28VDoZ-z@Ty4i5zQ6gd$h7-pyN-~`I0;Hk!WW(%BCZnNuH%QIX4%R&FXi;35AoGvqbq%n2 z-k}VU`SB;PF!k2GC#q34A=c(eLvdYCfI}KAhP!o=W96+>JIV z)D3__-sU6=#~QVG4DEU|zhQ*G`#T~0U3BTQOqA)}9-?%B$PXTT+wW&hSIK^2A{pPH z$4uEJ(R>h!#$?Ag;k7$T{5R3^wk1)m7~WB>n8lW+2;Dz-6%@QYtD}2=SK;^pBz5KB zdLGp_K5qf6NwYgmA;DCt*E10pY$GBrK%)-ZhcewZk^YD5a;yB)?#;K-&GSoZrtpHAL@%#P0-)OB~BfH#bIu!#5U5*G;?p^mxqu4mA++^7j7J;+) zsz8PvN)XZ^9zzf02yG5!&4DmiDMlZ ziE2p%W%^iFHD&?j8iT4t+egEHS_bK5ixSTO;7mLY6l> z45HEEZm5y!RE*sQr6_n?+~vkEa^gQHw*q4FIPlw0Qy*uNEo1OD$Vt)L;(q&@f57N% z@B@W!%SsfEA5?uMA6AluW?B9>B+z&^16YsfVbg#uiclUHx1 zi*Z}z*E}aBf6<%(Oxjv^nb0f;R`aN)(2-_-|j!#5Xmmw7HCzD%Asn7Ph%o6z+Wr;+cf~{1h54n}nhhV@S+oP+R>FsT+ z&f42U7!lakyP4j`gzc?nYpBASg*GZ#t@sR^1s2Nf?yi!IIb;`6D>4ENUr!BxUd3z} z8-|?R@*Meto8ztEhj3&i=UT=W|W+aBZkrroN8U7BkWUE@-9qW(#V?{HUpWm(sfB8AOl{Au87vExN9m$<(c%os^ ztHn)U(R|}&bn}|mT;n5KYC`E?T_vS%g=M*B}Cw z-Cyxyspw0Kr2;K3l^U7;10Q^Tz=MxmaTIVVLvCJ4yXu@m>p$%)zWzvY@%2XvdfVmO z6NNq|0zNXNqpyqWLRYlI!gEqM)~k9XT@Z_}V6s;XYs1wHLyefcxF3&nHsE%b9(CHK z4NVq~(N1;Bh&E7Z%xR_wa?^-Ay&PRF%5P9B-X!OM)i;#k*D$@yiD57|54S>>-EWt- z=+XPd@|HY$??#W_S>z^gOT^gJs#Ru}hgAH-w3rhCcZD7gEpO4qc&l2x3_TWl3~ISU z_H*daduMbg*k8e=y~QT^WcBBAyoJB3C2i3$sK_o{r8HBZgt~X1TNhJdt;sAv6zf8~MlRQA7vHfqJ&@!vcAO{r+Ex+0< z^pr*YTAPGtK*)Qs`S#eLT_N6U{Y#2L928V(Et{$32M2309J6w0DW{imBt3wVtrb_Q zCC`#zSF@A_yZ1R%`1=$p{9~D3@*brFgq{mHgF^S$S-JbJ^;Y3nrxx!g^?AN*`3?3` z0@%F3gIa@-pjsb($d+aW7TICnEhO~C%DSh$Lv;geK`8Tn$@#y0mhuB^A^#GY{|Lt= z2iRPGmu4&bQaaSkHyoVs%Qp!_;n>DCn_(kiYp`tbN4~59*n(Jk;g@*(ag1F90Jb1Z zdY43p(a*k*Dp=e4us^D#pZ$0V_p2-G!~r(nlI7_oOfUazB6|5}6RZDzoZ$}`-^w$A z`HVAxchL-ghz}bpe;^N?2@Er4e3CEtba3K#@(@XAZeMqwicw1z<1e;v7xS>IcGIu{ zqTyFTywH>{7PAhryz@15GYU|+pLCk?h0v6liy1L(ml9&y;u%+&DAOIR<^tFPsST6) zH?hqfz~(3361SKU{2(j90V0C6*Ut^X_q-l*FVhTyU39_?MewXT<~s!~2v5dYk`8jz zZdwyzD*9b1Of3hp(CAS^as z8b?(_R?@K~KSh@DogW3lK#@IHS|@;TN!IC7*vy8-lW)%vT9G}&1>1J87v!uUsbZL? zG2OE<-Gd9DoR^<-m}9r9lPhh?-JeIBQq_vmuT3VCzcRH9KU|(2!!A2I%(ExGs_yz> z5vS6(oVr;baMdu!pQ?KR^pAv*Vs=}c%aL}9Fm#sn^Jr7~Ag$eUwW7SELTsudMG*Pt zGs(XulbZxWaZi;iVl%Rf1^FR-*0?q07zM;)4b6_r9_zh!W<6e3#G8sP6`C^rGbRL$ z15*MNMhs5hd~)}A=riWCFE$XL1<1k!zb>t}>mc;>2x%?l%SCt2xW1oBx8Y^(FJRNG zy`c=h>M~vIZ8=PTJi^73=3fmmnXr zc8?qL!;^ro43r!Q;;nL`%-+*84T1D)?1Sa+g}hPpn?V}|K%rTFT!@$GE6=CYmFG)& z4)uU&;P%6W>x`RxeZU%b$|nz6O{RkOaOR@^^;_e665VO54ELV_?nb}xtnuB2@hFs! z21ju>7qLk|zOk)jb2LbAZbGP^K5B@e8!o%3D;An^?{Gvh7Y-ptN8gg4LUE&v1Em(#rPKxID*)dA!3s`&^#QF3q;`6O_|j z+Gw*&>wbe;@j-`bK55{WaBNiFbVDqog0V$a29iyHhO*({AkP~yf4SHpe3<8_85nbk>^No$j~)-Cp4`6Ke( z1OnX%%(I8%0MhQ)M`D31!CHxvXK-l1uBj{Ms zfT~8zqaQO7t{O??wh9eyEhA-mT`Z*o6uRYjL1bW%wY;I@Km%a_=kdao22k|wR=*Cy zeL6~gUO>a{(`NPgR`g|6pI^}qzv9*BpQJCR`g}k5ntU4gkNSe3d*`Z;q*%d$JOBz^ ziO8VPAl~F|G7_jRl9x{6nP7d0`y-yZ&j#_-!3XpZdR*Mfosyf2-iL*_Ys7BSHk*$ap1IT7iO zZ`IQH^Jo?*G~T^*2bz16-n+`3QZ^39_eWck=_XH?s@gPrCQM$cHpp7#jV(*FXVRy& zEX_WGKFwum_S@jIEX_VL4L!2b?3r|vT$^UM;v)&QY4%w7@UB_o_seIu3xyv&5D-s} zE$Y;RxZfb}N83c{ucqBIAmDKTJ`zi zW}@$S3ScOuk6fuis_X4y4RE@<%8Fr-)`#Y*ETbJeF2k7+g(rz)kv`#mu6>scZ z$7fLda_N@q?J)7{)sp)2g1Jq$z0jqPiAZ;xQcImdcBC%CXOTU3m~Q{eo$|tcIPq=T z0E3J9D=_gxtyR9*G8ardd|Jy~F!AtdE_1=e4~3+WjHhPjeRIv3^PV8*{SeQ4j?m)# z@ADco$=Ai9l^dMq{+fsf zAU=ShTNW=g9NMGYk$fi8VRJ^kX1TW!`4GK7&zhi{sRIq~aR++Mrw#xVx~rP6 zjr0{{=;x&H=}Eilt`=JV#*6$>L-HIE;XFBuoBWJfb@k6(&0kCCe9iuaf&*K?pVfI?UFZWLXIHY6$J zQw)uA@20&c{jfRK)8=SmGpoJta%JL4stlme73U}9-|nqF)#$H{!T>-*R~+XlhVNY* zW`U#Y{_juvODffpwXM(<8xmbYw?us+r_3^ZawLb3(p`2J3O(MR4uqMq2kDYM{av22 z6MJaN01Dl9|0tfazfqSjP<|>D8V(fjpR~2^N}$nQAvdk-ZGyd=*xfvV5jV-^;f||`BRC$D1XqH27 z^CIi`4=pl)!2|NHM%)Hp=$iwU?D9hU=EFg{6^To9o-gD%D0!RbVDP6r2ZKLtaSlEW zngj86@ElB{IoO)Oa{wRB%)vE3Hl2gUw-{}c{votY`iGEi*v3kOUM*6Z7tsNb=f^XZ z=SBM|?7YmC4LrdyPyh-|M)3@`1q+RsaQhhSU^bR-K4L=tkEe`?2}?pECddGg=hXWR zKZfo7?l)0~u$;Y40Qz2N^!v-bbHf+-=uIB(95zq|=vzoveC2QQ!tFq|A_#q5PWt^W z&u^)ouU($aUi%Y`{xpx*_gg)Myw0I>!VDQ^zSuzrB^NRp4?Z4IWRG=WAhRKz8~iRh zAfX9Zkv-X^XGPHUfebUsyER`T*mGRE<+Mwb~3^f${>d>JtxB0C4%Bh(pZb^g(&K#!BThWwx>I{#`w+{m@WGszdxxmX_xS9 z6rL?oNc0`XU}IAaOP5@sTgE;c9Ig{L*H-tR@CO=}QRp)5xxV}UMhc$u29v~2j>5i^ zUO5~+m^o8>TktW#30?a3C>Fg_7Cl`=MF9$3*^|aax5oq*jfbMMsi<8RefBmg3Q*`u zlq~v6NKq>k9YaNZ^SJ23|58zaLRZpdhjT)T!tUq0go=JFi~h=*Q-DHOHp*6egcJp7 z&F4MhM+BN9BtwvqMmeG)I;^5~e(8&B-k_G8GzCtO>c~ppio^VD3&+)%`%|Qh2jH!5 z5|3k&@mo*&O;i4Pojd*|n=%6wy7Etc3|S1n`nR zDAJpumVO>v@W?$i#r6dzlPN*SD8WD#n{{YtF`IrJ!#hpSR5-A;1xPmS$DOJ zhMlgD!f4nSbe$Enu*9j68sXWL?%C|}tif2YKLFEo;+^_1RQpPuV7nbI>D-F0>gP29>2*Bh$51G+_328WVIevY! z2JVq>7s7F5!cd_t=W3S+suy}YhtSho8B!80%*UP~*&Fvv8K4&m`N|t9CLpmY7Ls(u z`b4C`xq@QBPBpF)tbr$Oyl-Nlf_!^2M+OdDzBy$KRo`v6E|nz(k%7J5g~sDlPmw*| zdwU0Cug|w9yVw=mrDfWkzQttf75@q^*ZCZu3m``R+@0M7cR^M=!FanNJl-NsG(p*Q zPY0o_JQ!tnG=!q8j8OJdzC_tvt~cAz_Zp}wyr3zn%FaO5J$?`%GVO&zSIY7ugJmOW z3*o}bF25icUqZ&D)y~uq&SH_l8I06I-*pXm&9Hv95uNnAmC|AczS2D>eLd)U{@vN~ zWOEG*j@Q7bheQa+Uuvl@DwxdE>`p{#YE4w~Wq9M-{yBfZW;nw*VxXGUT_2&Ad`0KL z)Y&Xf&SG1zSwl(ma0-2N1kd47wKN&C)BM#$b&MC9tu+=+Q!AeRYYS_%@GEI+-A!ki z>RXE%+4NS=h+w6(bcpAItiz-p;Ga%@fnrcqYQYs?d~9vv@Kx2h(H# z#8t3kRJc_z?~GMokt6f%JsnET6tYlJ$Dac=f1oy{=2>S@^Q6;2&7{1BLF5Tt`Rp;S z+*8CdCsTErJ>EM)HA0MI%^}l~2?tcX(nz!CxmYLe`v$MeY^`24_O7E_F z&*>?rJuk7?f8a_I`vD>iK3|P}SH5~lvKaOf1Ss@DKf zkIT}q(s)?jZLXk8o_HYqL`F8bF0(K)d38Jm1Un(gUx`@p zjiCSsCuef+zMM(D11LN@d;^IK_st8(-GjI>oV+$z&TL1|YPvpvH$R0e!d5(!7w*&tc3fn4 z`Zkeq(eN3PtMWl=IUS^iKWs?62fR|^{e3e^yx)mNzt8$la6B))*uKMf?`RLbck~|1 zyYpDyok#NSp6T4;OZ+^-OY(Vy2!6!ttLf2Uf;WY{8c(-Hmg&>+B6VXFW!p%hOD9fe z;+tTjbbzSKh@c3qgM?H@-up08nVQ>!-JD79XP)Ur$E-w&_ev^M9p`^U>4A z*7zc)dp@CbfUwx;&^47`-;t*?KAGvZiL+(2$hh(NFcC03or4WwWPr|F8`-HND3t00 zcsZq%zQ}lefuGlU0iV}W9+l~TvyA{ip(|JR<>TW4B}j=Uy_OkOYVjcq=3~1|j%oDe zG$w#Tv$cOwVrzIu`T-zd>)5JzwPXM){B3p9xb#&A8KoG`)wXS#EZzA6`T?M3J-(_9 z8inpfJ-KaxEIySTF{Yv;Mut^rS!SW-#R~nY2$XhHpnyI;LU{75HBlYV|3Mb+Je-@r zK(-lXE!MNUs;-rAWLecI>E}bQ2Xt~DXrq33+*vlDlOOHhW#Jx6sW3o1os;%LQ>@b% zy?7AG068Om2Tux8TuNcfkUo;OA{+3%h;rzzdadARYDXt)4{rnHsm8=s+cfI?Fazrg7uI1=HA^-a(-fzgvI zJXPZO4&mP0MntR;^qMR()ZoJhzvd-8HA#NoTo$4UXO@x|NQE173d-yt6>gsmtipv4 zwPL8vP+)ob+0#9h;`k2#TD4-W=vI}kN8zTK$4JYxTfLW^7mT#RfSVQ}Ef2a%7oM`0 z+(9khUML*jt5a`B>|p>GW&iV1Y~twl0EMnxa*EgD=ty3RHBOtE8t|+W$9D?%zBVFa zi}0AG>xtH0RQ=pacrwgFvuV#WnI0QWWC~Ddw#Q}qI|C^lpxa?mr~E7!RG$$aP{7+RkmbAgVs8_S^)Z9_$5yrY0L35k z={)ibe)0n#O6Kq0+}!dYxpxMWN{roGbhAI$Y*J^F4GOS(bZT(e=kvL2JulT*V}kGv zRNeO7M9Q83*%Kpq4^O7EgRV@UNGc_KVmAZzth{_QZVajIHdGJ@K(BJ_Yn#@qm z`@X@r-TpkaWzGA^)d9`>X41S1U0MAulgEEdL97}TD!QdMhC?o2Z2YKOR$&M~>Pg{N8rRVMP^<@~q2 z!y{pCsu7MzJ|jZEFXFchitUv=18W$sn-R{n??AZ7z8CYefHrycdvpdUG_z?L(2RFq zHjJN%Mt{nR!7tZ%*Fmypr*8>`Z)x=$uksr{qg4(tgxi04W78#E9$3Ps-N8$^Ew4!u zYK5-&pQJTOOBUDUbJx+DbV7B>6gEgNjK|(>_V&i!?eN`5S4H=Ec)jj#r1c6AedyLr zD$D5Tv!iIOymXH|8)k>f^hNe~uOs5jXKl2(OuDzmx>MSuSxu&buEI0Oi~(Azg%&DR z`Ld5gGygSv_1hc$bw3Er_Dvagto4=DF@QejaqRUcWl~1E?;HB{K8%TDd&&6W*p1Bf zZ!MM}}3MvL(V~@|%3K@F^js``r@f`NnxOQ{wz<|EZR7 zK7C*i&esc1%^5hq)6Y1+Xf)$It27+W2T?4)|C9nh{QOFl?~&mnX{*mnD2n~Qz+n(f& z^>8Lk{Tz>m*Alo2L2!Y)i~?;o@)gbY5@HtR&r_Hhgt(K<7!txHq*6n--LXBGLG%t` z5Z>r(<=yppbASDqT2FlE>n;|$#W2YCke zR^bS@I2!%FhQC4sI5&y^@`V}WzvKwdL-s78!+)Bxx0qSvrrW78fVdUH0ryzdB(>x! z3Y1t;jECEv(R7IINk`s!#eBHE{U=HX7#wZ6Gz#NWoM^8WPizh2NIirqkkVNc@9a+5 zfwdXb0f4kIgS=U%_)QpiX`QI@wQ`tMcMqfm%cb1#?9$(n>JbXfq89UMeKs=^gqrzy z6)_TyfbMm3ab_g5iIE5^zDx#ZIIYku97iW4V}d8kS`(#W{6|@k83{toT;*#e9Kx!W z4)go{zCq}psqDHVM6KrvQO7)eDhwOJxG}&(ZoUq9NDT52w2b%E!q)MqWE^`(H2Uj) z6`G~1><=>zguYuz?-j{EPMg1lW@kRWD`YwNtW;?rl2(;X3q{f%LQ?g!TpW?Ks%%;S zNy8(AmKBQ}*YU%ITQLE-Z8Q{oP8RIUueH!2SC}=cXPd!uFKi8@(yzUHe;f6~-OjRp z?fn>gCrh|j=Tr+_c_ll94ToBaUw5)4{HZB`Kb3fJ4WMq6MBUq&jsCiWLbLobnS0rq zRiB8u6v&5h!WYt6;j76^p%3*V3I%u$6k5X7&rV!NGm}UG$R3`2P82$La?2EI7FuDf zaGVOJP(;3E@;OlG^eCiI$L(igxJXjykM%8K_@nmqX+=|FEJLg-1VyAM)s1{a_>3Bj5w_TUPZTAY>_GNS>YI&O1>-G<5y#n;TNudY-nkbdAZdS&+O{S!^ zb+?f_m}c8Fk)^4blS!HaD71`3p>;BXi3#>NSvc~XYU#axzrQYCXo|ZC z<(Qn-)T`S1QxOxxGyM4VGZzu_ju-A^vs&^yEz_O{2>aOsWL*@HNX}D|c8Bvz0K+>{ z&z&TI#;YY=iP!gkikHUULue)dB6+Gy_q9>onV8KM{S+@?Cwmt<(Yw%g>`6{fyNl8R zs!R8o$L9&nvg1jveAy|g9H1aqEZZ_!bm4nc6d)|21ff}8lO-n>Qb~ZMBOt*)jp765 zz$7FJ_v++op;>ZespO}q6hP9?|4}cMYJ9WeBs14cyC61`mU<$fWr+2mMpvTY@m@l+ zoG&YPuc6A_YmC9P#ePe6v#*eI-fs`M$@q02Qm1^-;T8%f#Uj6zp^$MWSELX|&DOXVX z6ujK9bS{hz`@D)JQvQ(9QLUKGS3(HgKX+yNDi{pwe*$o-**{SHVT3|mda#YqEGy`z zo~`I73YF&y*2baU7AAH21eSE>ccIJx>y`;kd2#}eJAWvR8z3)(SU5c%`LMgBI8 z_*)*VuUuGPxk6LoWyPBk`TUk>VpXQQ&}vdkiV3ClPcZ7f+D#bxYBz}!z-9s`+ABg- zUhPdp$vjM5`TMD0l~=UMWb(dzd9cdM2z+NK&!L;{)p>xPeA$QFd+=G2{A{vidbf)x zy&LjqVWs!-`q3s;D0?e|%?F*t`xiVL#r~vW`+d*2;C`bgkq4vk;Z3`ee1EWZy)_JL z;pHLP^=60V9oehV@4Mx6sJ$i57pkn9^259Wp096hG+zK=Ad%2&rv=8^kFtB`-rV4q zYa@Ro(0>6VY6L&qHG-b)>MYYQxt7uaVilg@4Z*4la(PD^t^hAme$3}SJ;)E5JxC9l zUH#uEHeRYtvx{gRHx={Vd0C_1cb-3ZM`$wsIHK1?7=HqcKLN%s+v+ld+UkNn$Vyhe z+y_(+BB0t$92VETw=1zh$C`rfLQ{InI=I>R*x1GWqt0-@hRzXSBvH24Gioe)|(JBhlwt*AZS zns~SU8iaR2c<*zCf%gmp?-|}TX^nnSJH$$SK{@eNFxr=W%nG)Hk8w}0*-t$I=pA76 z1UeC5ibEc1@gCromx7r~Cs@bN_6%i;Qp4BjtAOtB>7l{8zj)cTn`PHt-$Pvk=zZf< z_^vH@u*I$=R|R*iH+1c{9^t$8%<@3j_NNDTt>hyl)<=3Y`hBCq#|uV!Jxu&A^!>a^ zc|4p^?6U<>7_Z*drrFIMp<9(azyw@qt6au#>D7Aad*$DZZ$p|3MhQ)^%erTCOeTOr zQ`*V&v{RIxcFH7UmJ6%UGR!PnI{|fqPgX$>7OsC3$W)~HtI9;0(3Ne%5Oa2{mSWB$ z3lJ?M?Tvolk#PL~L^yopJ<5H1M^NA15n=JM@MJJPKD)7Hd?<*I7+LrFbgCPm(3FNp zIQ?mUPUz`R|2KRrlNGG%LKOfMy0UDDftStI5-+!Xh?n-NYk;CZC))CBme- zd$l52DvQZN`S>AY06Cg#OO#qMi=Wm-C=AcrD0(sILL4`TF+pKUkE#;7Q$A>&3AM&$ zJ;ctE{tx()3qFKL+EhqiN9oEA)Z$)Ui1DxFaE5-#6a6JiKR5O@mW`Zt!1|PUdKu-H z2YG(c)up-&q0nsK$n*}sP&z=N*%o2CsM;5$Wt*cs*>;zfZ#H}K?Lvz(m#Y=eJwo!+ zbMyp=^bKfd$91t{KF$AwXPf_DX*V7GAkXuw?1=N~E}H)baSt7)P%1#7D}UWUOVRu8 zZs6mJ`N0tRCbwLzDF1dNwFNMEn&4!Kk*t@^C&irAowBJ1Y_G!w8WVXUgr-zHAXgwx zcU4(g)9Kb+b{9_hC0I}JGl2O1nGHp+B73g4drG6f?n9v|cRj#^EL%-=0u1bL$~X5) zw<=?Q3yK6CD}vtphW&2Qq~QI|28{Ih#o_n67rqGWcSi>X?{_ob;jMV}{oJ{mIZz`& zp)0Eg8f@>x3d#2F#8TchFLB{gSvd7ADhx1aWJm7#pGLNIe(=b;!N}s88QB+$0wcR9 zWMs?Umhw+7ckVil#0W5`b0hw@&ZRta2HGdZh3{N!Q0IzLgFAOIcFtQmllwSW_OXV; zYy%X!GC0-1{)1mh?C*OE3$N?a==aS$5&r#)0y>YFg{QY&=)LViv-~`cS;x^Eh;;xI znq}R%@CpT7vxenu!9bx|ULS|oqIGQZTZhcM$evJ)uVuyxE!FH!ncN*#Q#;{lBedRj z;a+X7_FjB#qrdJiq1o;j$Lwa{>%?vb;ybjN_IP#a&ut!`C^Xx(Fj4?xP z-NuEtcTMkjtSUYq`sW|ZLo8iHJuF?+w1*Myl)c@cgJ$7r;~VYw`@NGLjecJS>4?6P zHC)E=1ur{p)Zk8e2TNM`tkcHV*-tz-)|&!#w1e8N>fGq}J<{}f;m~+PUNY8xwiOy{ zlYFy)n1{|#8--EaN^D`E0$AKsPxihB-*0g1Bnjb0{2&_i1^E4}09!sA&N@1qwr`i&B( zo4jm`C|RqPa`@QNdzorxRuR?AM9)UcqcZ*Z)szlUa0I=YhzM#OP4NJ)35lfZ%;hC- zzCMyUlgwlFE?VA*e)>oxlUL8;xR?sJGFX2?Fc;sG4#A8S$1L?2Z@_TRlDptQafBI^wDOzjgmb=TCPpA z$C@R#_Kv*#gx`0fG1Qa#mU+?~rv3x8pPAgT(eKN~dqfVQ=lG9WQi?7om-wD(z@^-T zzfOq=cmBJZDQ#apQQAI?p`+y99o?e7$6c?g#b_StuD2Ep5Sntetm(Tar~p7*lt)yn z(|km=nvbaMU3TXYwLNRNAL7j@+q zleB;RPUKj0zDNAyio39Mvsp2V%QH#GrBB;MmExCqR&@)_N`HGiF`UFT9Hb+U& zy(0$*zWnwG`u+9@lZ=Lq{x3PaJATZM>Hxia0J80Im7TRXzS$s$hf-j@U0ecN?n@;WpVCP#}P_35j3GRn%IBg_C~ z-F_CVzFdk|7bs$T;7;z_T_>q;0CCX1wrroDAT(u=ta&lVI$Vsg4wcJg`rrJ*2|%GK z9qw#~V*8%v(}8De5XD}A6#MH%bltlPfj~|XQc?**o{k|_~Di@96W-EG7 z?G-(!*YrTl!#(NcGP6l78Ac_Zl_dt zcrRyzk7e;teOs8`6?f1W7JfCGqgBC&pl9=u{bq*}ME|LGaJ;N%;W(u3`sjir zp($f!O?zIT0stjHHzCV&p2@@$WvQy?sT4q=DX}u$`4Oc%@#QSV6uw`&()AQCi6=G% zEr|}eB(`2CnfNcXB%qh@#pZzE_t&YG&`(1WNoPQADwY2hs(xyqgQ?qyVsYZizGNY%+1CARLGv6~; zX5NZgp|c4xYnK2jk!b|IpY0ybhIcEvwz zGkK-_*p%Z)R?X+_5iNI};G9F{5xrR7kXJ7lCM8;avHd;Nds~NCYr^a_-SfFEt_=>X z-`biU&$6z&zJT4MR<80J@EXl^hZoOW|5RGo`cDn}x$8xsVq>-8;=?hpoM(B3>~KD9 zGRI*$|6pus2%e!EocvF|n|1E*u0-xR;)i_ad|gOmJV}u*ywA~Ubd|1omS|;kN@oO8 zJIoqH0N%L%0RM#DrWSyR+ZuS-im9s16bQjO-qA#Y4sg0Zzi;P2bbQlYpjGh&NY~Cl zC>N$-fd`uI{xNp252v< z9x!K>yFOAPV4#ya3R`>l20!;(IF_$9n#RiG&T%=S}w z5`>ZC4B%0`)y7V6K3%6C40Gzt>I8TaKL_&iXTL-`nvEW6 z5g_-w{)8}H$dQOi>nT88#ebH*q00a!5zR$L5=)Z#w$C$-fTcksthd#$IP{k}tbIp9 zM{6fw+@ERqgoklBT|u*(V$!%f_b&FK@UMoiVabw!#yqjcQD0UD3R+q?4>!z7sz^?m=o#fvVX=bZ~*{lrZ zm)0a7~5!kwNV|c$1-hX=!Zw5pGnkifxKfY!HF5scCq~*&obFpsojq7 zvk>RW*Gh;$iULH54zeEm(8C>y%xX>k_tGWe%F5WRfxJKQaAAbTd|^p?sLqMV{(w#+ zr~`TUgN*%VY#(%}wBDSW_O(vriaCIRRx1(qrLHcuTF*%PoQ_^sYg z8J_71I{&XpU!laXfqf&>DRHn(k@q&MZWDLAZRO-ExkbdMw&1icS<{R^=QFYBv#tLtRz0`-NLSmW)>B#LS1r>6=lz$iJO|BYFfp%)0q_(U zYZsCh)}Y^j0>|ulucizBd`PSN#2^&E<-)?FCiM%&DaF&YpE>oazTbh}2bAr)}b63lDkCq0Ev7%#>Q`;Kx@wFy3*#v_$C=fIjd~IAh+b$s)q0lPBccfMoTFFu8BY za>UhjcsA!IRMDBpX6N)^{3WG{Wf*#_nH%l8>=08KfT5%jI~QTLHqu0GV3AJA=K%Zx7GC@_lElt zhN)Z2PdnfJ+w$Kk7h7n*`I1ZLierZpu3nL}&k8aAQZ~)9259*Tx9o`5Bw=h-bBdgzRCcZ5-Em%z3b2^C>`t78t@lZ?b75n1qU*9-O3i-w=_`@QqCpV_D z`Kw53YQBB(NKu*D3Z01E4KL{w4*TS(;LY$E8Ga}kzD=-aqoy-x1k|Hnfqa@j6_k-T z$I?rNMQ)bRBkfym{StsVS}^l>6hfK)f1f@JD5oIZ>pIU#_wPAJ(gFo8`XiaYOz+AiUgt(SK{ zIB?aEM&U7Wy$!LwYMR@wtdy|sD?IZvDQA3dlU$~(M=uf~RCU|W7kCp_bA&IBhE2Ej z;%AK-F_g#uEOlaZ=XBRXkTLQ85tevK1tDawvVt*{(v=TeTm!fdfcENteLA4@^9ddn z{{~XK2`ZbQ)v23R=MnN7gA3g!QGq)h@yW*0-SK|I!Y`XD;>hASlGM*_n!*wYo(gKZ zyKaUr5Mrx)3|Klm#7I*%%O%44L2~}=Z$jpVm;EP3yQmXPS7rhI7O9(z1J0S`eSWAg zejnbyr?d8PI6lZ1m9Qalgj%!$d@INM(~ytVtc*I(vF>>T`B*7-`-`MLs^N9awC-thqZiBwCas#iHidBDZHCE7IGms285#Vf$!j{n4rsehP9PxMyjv zH~YZZoTzt4g@xxEdddww#P3BzDtc!Re$inS0VXW+OTkII1WUXi)1BijpA^wtvWP6T zQb#kI$f5K!BFS8wqkvWRltZU0)&CcJ(a1Jrng3N`w5)fL95$Gx^D;fC#$>ir?+k8t z3349&K4w~{tocS(KmRtQzP1HR{eCa61B z?GCZ@D1blk&haxAo8W%dX=b0Q1&Rn+#Xx9uMyDUOCF2!0g&NB9FrDmG|I3t^jTN~L#wKxZ zc+Ens&c1H1gB^?4kqzBl-;zR>uz||o{uc>b{O39T$1@rBr44CnAc0{@1C@_a%=blA z^Es6pV!!-pbcdUU@dURD&haqyy{RO^QfcE-wAek+t9Y`u@K{WC&pXArnK9&;@utqm zKBu5t`}-)+gh#k$VwvPL#($WDFJ16?(eZxMBPAd^N8qB6&QXoPjOzCLi;S!uq&BRF zDcL`F6fbo@Ra)_Xa-&V$NQ_zMfX8eX8>x>I`wpZZX(zkVFhE^QkBSi!T}B6sH3jQP zaRK8$9AAIFB<>CTrlG=U=lbQD01(m>FiY`;wR#)kNx(<@qQ zA`ay_^rN+(@mjz1?|qltP6Uv{7c+mZVwW)*YXfc>nj!z_7e3J?dk~bweT5{(j*O+H zdY zCVdoUd4+@?=qW~cxqzxI%fU#J1;^irj8bGkwWTLJKM!SO{%f-l`)$}cc#m28rx9w= z+SwdQH4BcKa%(=8)G{qide64UyD|P}p}`7eQOfBp`LJrCSxV~P_y&vdu9JU1Gj>PT zkAiEV-tga)O&AU*VQ|<9vqX}sJoF~ugjCiP_x4TelxE=X()8`9k0Mk&{uUbs`RuRjhn!u1lLe#NS-X9? z;ZXYGwZ!?<(r3OY=6+u8z8dqQNqD%62<1is*GsJ!R*{#&qRU^Zsd8kIxhzUSk_QwA=K zaZbcUW%3D789;~EDSZx5dxPApe?VqK@q)nKh_DANcDz#X=6bF}?)cSb78wT*-?!BI zVsw#I{44AVD_zgfJNjWez&b1A!t9-ojtsd5uLiPk>RCYPYb;Z2_J2zW0_V|II{7O< z{>Xqn0^%7+GS64xGZW}P$sSWFvO~?_8UveNq~SHPI0Jcomm|X=G;$5pCqqsFeJ0M} zvmKt;JH3^~>1G}46OlN6RD~r%!Z4gOxrQ#r28BcQcfooILnkUl*#{w0;ntjqVrq`t zADp+ddoAzSgFxW5&84jetClLr8SRhm9q3g6o|Rfe{?(zlsZ5vuL4e{&FnRN8Wf9Mn z+#<7yEkCtJwQa6w`*qnWjawJJ`^1+5BY~N_se`r?#86lUju~n3u<%>wk_wd3zl|bK zZ)`_-l2^o~Wmiz1>rpy#5sO<7f$Jd%yyM#5?Us7Lt~Xs)Io@{xAsfOVMLpQpfWt4a z%!S0`FtBT2TZb!FSqF;zRSb~%#&nV`f8}{pE}^DCE@9_9tXdPCI;|=`>2fsr`a?@o zUhT9aWm0RL!;>n0FsjGc*Cy}GKmx*p!_l{7Za#Fu-R8l*Lq9P=&V$GQp0i#`cpm`d zpWcF1e>~jmjYLyh>cH8#rHYI_IK%n^7BY4RlLqCH$egmN{nM{*KMF_K6)u~u z-1|89)((dM4H$UiJo}xBq*2%CnXH4U$v70XK_0^Yj9A@z$bi`#Nx+mObEPH5e`i4gE5T;jka728<^2@{yqclTom%Rn;pt4Y|R>f72 zLi9P~RG00AskV;NA{k*4}gcd5Y%vC8c}c9hTECx*3_be zB%A`^j0$YH7mfk_-M(zObQ{Ud9?#8=0_msak^*aq;WTY9@V4`~5{OnLSC2kHOgU_| zqu!UR8G2}H=BinHsb{p#DfuoE<(>1&9FmDV-@P~*hz1r8&ih6oQuL0|6}0kFd|kf2qzf4pd~?15y>z3uLZ+(7vAcMrMpUbw#4A|Spx0ia$eFaa0|*>LE+jInk- zlZ46a>NRYvGD5;zm;=*oLP4H`|sr6bn|od#MwiEI@7KFGue*QvhVb-`@rZFs`ywdZM?igt z7Y1$cI9=gw!prNwnyAge+bP+4nctre)B~143RjdHeTB<&UEwcd@E5UjQ}e5w<(#XH zHr9Mnx+=uQ;V+2%2AsOP5QrNCQSnAl2GGK9z}ph#hCTtN^VJvufai)JX_HnC8-RJcXlZ4W7<23rweN<2`+m@C~Yf zc_A3p_!&hIz9TPIG+6jC(BOzlum^D-hT!@Sh`A+$HifY)Ads^K}?kM6>;pT#sN;kI9Fi zevpBwCO(#%dAD?e*8`Khw@VzSBoEmESh^Jw)2G&h!HYrbt?9;oY3dr zg?D&kj3)Kt`NMkKH$+h@Q27N%M%?BE2!#UWUlJByBu)@TDn9d|^M$SpVGS zfGqfAY5q_jHXnfZm%W?5=;-S&|Myw_KI4;G4!9bN0W2(`bBF?R)|CJbz`%p}4`!3XqMTqR8oUTgALzZC|NbVt z`~K;uR&P3YK9xE0UzwY`qF7;;lhyu*^_9)s(OG1qanEg%?EO07P$|t1&wthOlenrl z`dXLwm{q`9JBt_pxJ}2Z+fF58f#p_Kj`K+$?LmfeF1$nR6w>U$l6TqfR6R3v(p17& z&N)8k1+B^4=Dx2|Ai<8Ro1iE>%Tljw7ZKU|@a81(0yYigxG5Fe(K-m98Q)mCF?|KZ z?u1HB_&fr;XmzTNu8NNQ8H_6wzjX2Z8I!Bt%Jdq+ z79n9<9#A&vlq7nIf`(Y!tL_k@V^g?;jmfZR>~fm+B;>l{Z{pxxg0sisLq+9pu4m;8 z&QwW#EO&gLZw#s&|B~xaI+*k8tFHdYs{&T5-&rX;#o5<xSZ`%+Zo~euwR%!yBY`=Pm`f;d4^km$ch$ zxG?ZhbpjA^PJd|{hD1HiqMC~siM8+UuK5wZT&hkkbh1N@7o;jg;Z{M3P~`>l=Dr6qf9HZF(knp3w&tuW9J3& zwne#n-sCcQc9emZ1$C4BOOomiQ)yuoXTM^Yx+ht+xcOf13kOylXi#`@S?BQ;ogIQ2s`%aW{PQP;nuFbrHJcHQMGXhOL#-jgBN0=C%hkv8 z3%g~EPtEqt-+dDJtm~?TX)vx)XP<6AOfcBsn$9%hPk(Yck{K;nPuCb5h#eEW92NE{ z9keodj_HB8`r=kB^UO`%cSQ-J6Uk=&Y)2Tgy(`8;!(nwWft&x0A*LT9}grZJSS;v3rvz&U8ATQ7<&Vu=z?BE;Y3 zQ^i#ul$vHtO5B*e!%z-+tmeE;7H)7%QNi#EAVxsFY*nzsEO}3w^A(a;n?CtXEp}6z z)%;%6${aZ}=$n5hod#E&NJ+csF3U7LPc|tNBo3`#na|_Ut$nEYyoQHYQGZzHr|o+< zf~hU$=^k3a1f0&};I;GqyvsSk)Qb?5-FsJil2KSL^O4gg=rTr}Pwf1y4vKYIK2K2V zR6%DuRr@5EU7$M0ZnjI&RQ+(`@091N2vd4@U8;#(`ijJx44A4@C{Vpsn!fYe<=f;J zi!Q$@>)I3jSDr)i8??wvXa`#t7pIiAUa=0)K#0m>im-fF}@_)x&DVANvW7B||P}h1b;6BT;+7>@_6&0=G??^6_~}+4}|+!q5#^!=t$;XId;i=BE#Q6b4fZ_U^tMlU2vQuyyXk69vi zdM9dnXMr-{pe@Gpj3BNyWAbMHkriljLNV@&X2&Nc$}>sZ0!auKRo1pa5NV}*yYhBY zL!2y3WK6cTH-v@uUXnZT{2p1aANa&IeZP~WbW9h;vbm2;h5ZiOVD6Y;#>((p2FvZ^ z;-uhM*nSI&ZTtQQK(jCcztW;1SKf#DWF`~Y(7tlzt+TVqoCmqjNNJTs3zh>dG+6I- ze7+$_Zh9*cH}1W(zUB*-lL-NE`2(1>{NNv#&&5*zt+|Wl&$_?yt_~3Xw+}?as*mpb zI*l>~3)}e1f7YbIu#sp=QEZ9xU)aV4G~I1YyKtH#;kc*INpnTY;D40fZS9SB>M=_!y!he;3+76!>=1Iw-3>|}D#o|^i~YhJ;mP-37< zmIaS2C(iE*0vT%wG=pM0p6oWRi4f%7%|g-ODAT^J7F*>bcvj`(PLsum&>V#gjm9VA zhWkErF&yH(s_PTJ+Ryv!Uo4x~P**N^jgh ztpXp_Tkko|kA|qlyK65VpLc7e3&|jq;7o!1E6_m}@1t5Zu15F3%j6>OllKoCT;#}Cy@^M?~eWzfK=jHjF_$j`b-2Q=$!`cOf5bF+F0D}AxaheB>!RBv*J zGP4nSz@gLL>)hzbm)*)7wFPyQVG2aQcz%Z7A%0|fnK!+fLjj1x^XY?UMN>l=pw2bW zU2ehq=0VRCNqIr%WZam_G`lk^g$=B8dz<#v`^np_IA}!_l337fB?&rNPYyS@aTd8S62drJ8&Xid^BUplK zn(wWtnLh&4pEh0&f5TofP33lh51YJ?fK`%2kghX!65=*>8aWlyhmgX)(+gAh`=U_8 zSDu$_TN9iYjv)_-?%7JeJt;Wozvr9V6EecsQ){ zV%lnK3gdYnYjlbgKk`rRLweunlxafP?_5UE8%`MroCg^fbRo*mtzy zGje@{pL6|c|M1xo^7yME=03)T05*1B`oI~G~f*A_|aRh`o(g=zm090m|s>^LJh!aA4R?%nnj*VON- z*ZfDW3+x|2zsddvrf~!K@5Ts{$ZIS^F=aDx#SBGA$q{yfPDl9fCheEzmFk*zF7;q z-T{rli#zp-{x>oaoLt}qG=HeDw&sQSsfSDh*@P@G(Ki}%a-PNvz=UA)U742Q(*xcG zx`@~cjpA` zfRaFJ3dBHG?-npf@uRQn>6-cVLm)s99=X}-=*zd|Ve8v-Kb&O@4(oj1`iLCc4~f8) z>yZ4#id6tW+VB>zKM>}fnMyYG`|^o4K;qWNsM+T{U zG0;dG+n3LLV1GD9C^w?a`KVbXl`KPiUnr66`X0#%nExAExQ+6A-?~}K2=Gv=^3fV& zt8^W5@qJ3gaY3RlI`4z(PT%eg&}PZwT24x&aRE#g*a7M$>+Rx#pf1lq9{J0q9PEbfC^`i(l8vy= zDC0|D3Yn*jNpq)J8Fl6DSj^!lk|~eiesk9rdjlm0l`=r+l3c=&oiUUijBrlOy?jBm z|ASfVJdY)k9WF+$BEVE~CLX3iV%HX5%btI1x{X{jd?@W4gd%d0AAM}!F&&PXFzg$S zAwNVenBm%cQsHp} zzAeK+ZRIZr8+h&Y&R8LGf4sMcIA4#&%uK;ld}q$~OZF9qKz(B|H!5-o%HcIHgik$E zs@KF-2n(c0Id+<`8i}b8qGt)(W2N6yY$#4+1Yky1Kx)-^^iAG-j5;s@ei#B*u6OPh z5OOBNl)b|-a2w>6L2925Jzt<|kcb{&Z!dD=UEP>p>vFw` z1A?!ouS!iFGi91#&OUITqwwi{fWe9&u=C!?7XE0AB>ed>lYl2irW^hNTMlttNC>;S z?H$`rc%6SD(fXYDv^(;EzyLZn-Pb?uQX$#yX?M@l{LxZbO%Lv)2YiXUok4W{+XYs3 zOBo7)dZ!OV+YiHGFmJ{5>#T4wfIHh4*qer-=ei@UMF9LJ%NaoV%vX%5%`)g0l_1vj-g*``B z)qF_PQ{^n-GZ+wL!EWNzfs)SUG;~%#UDdzbK^-bCe6|AgPw=OlStTj`Bv(&Y$6TbV z9o?iYUJ`O%OMo}^UG-tY+c|`=S{EzqAc?!SvF#RZPPvsOFz9;_wDqfR+~fHet&uRu zsnRrv4pa^0#RYBLs^|qtTp=gtzC)xh9`WpQ`fyXj3$uv3@Hsgx#B&aRKbWzPx^d-v zJEJYWk8x7y4I;?|Z+1x-xQmJjlHN`c+$J#AKG{~qrFs+0rjRtar@e= zwzL8p)7*d~aU`tsUuO@~N5$FYTrBU|H&ilrT^O!vB zp`1v5to%w|zTU)~;;*p0r=>z76kx7$LaOb7);+&>_Os=^qpbBP1oE2x=6+I(lNmm? zdRhCy-FuC1qq3bA+bfb}-W08I??=sVVaf7cg1)B*i~|D8<0NYf^-V;9iMEcT#zIcw z%?L^YnNulp%^dvY7Sd?6z}0?tO}lqZW_KGncb?#aiqC4K94`*mvc+S+kl_|P&AU6i z3g@{mInSF=oKr(#;uENwcUQY62SHV_#QgOljZ(tw?waaR%{~gS^BP6k4D$uP~zWf{*S4?PA0;LbT94w=*b1?-g@GFu}>X8nx;BGD|~} z>J^>JNrr>B9jMe-gX&_%@#T&fHQq{@NDmw4AaJ-pP8vt&cuxi@dR8mn+g=p`Jr2s`-0_;oa@`CyS9;&bqP; z>J*~ZBu3xp0i5yUPGJp;~VB!+}4O6nXqv#hR0%T19h||HJZ( zt16y+G5GBJihTe|4v8LtsVWA0OsbL1>xW5!K)nCGCQT^@D8yepnBfP{GY8i7FL^^( ze|3*t*LVB>ccHz}(Zqur@(hruuR}=8rBC@FJVm2lu%?a78)g$X4iekWP=Rw@3^O4T zd_=M=tevfvt3~@f7Puw)&eitAZfVfyh4uZsD?hb5Nx-sP1Tjs8^)o>W z{S3{Dzpx(*iWd%M{rMg&;p<>Yj<-F!nGLDUWhL<^YzCTfT>WG9=@-`exPjxOI7LLi ztqgPd@2!$lm!5W;Yl&SiQx2-?#W;U5C4L*nsnq;D&v1l3Ra)@p%0`iKd(3!jvpKCB zMiL3^8;LubP7B24+OVSiV0A1{V6QA8Whb8JeoZ3iQ_3?7%+HYNk`U-W|YzniF8 zbqEb&-t?dU_nDStr6acY34uhZ1%kqtV5r`TxPI_VSk-+H3CVw1! z0GqpAdNuwpZL@)G_zU&NkNVw6EB(^mGd=G~FZ^2YKjq(c2y5wu6S8eBH0+x?f$^bA z7wK-m+pe}Z#He9EqL#*$k1(@;8Lo^cC!J?0V$p!<#Rb|p zSq+J!BcHmfguqc%mx}vL>AK9h+nwze0*vu)dHBcadH9dls-Rg7q(TwL zTcPdd_=4A$``v$EXY3774q!Xk1C(qv{kiqg$MFfFh69qWh^Pk3GTD+F1_ewy&rkBX z4>P{{oF5K>u)ZVMB}wf`cXad_-Sg&Gin$gKFSOc%C8erYbhd0)%tuDmVw zRJ0kMzFhqEVewXr<-t#D?m=YU_bXW)f6^F~5V0gjDd)0^zKr;ei#5FDYtUkV*z?i$ zHnIecJ{))HIuV8QG+O4P2%WEG*vIj+Sq==?xZ7a}xO`Mzya_nK9LM@S`i&U}AflVx z1f^hjkCiJ`h{JA)dhcJx#ZByMS~k!L_@}#83=zo;HiV%Bx4r2jBZe6hOL#yQoF=^WVb2cW)xl=8sp4le#LP z=a_+k&fPRGRW)18Lne{TXpZxsDN_>4a}f>wO!n*81LvYRYv&@nkKc5x#s{$9cXVb!p3HS@&pRW>)bdhnD4^?=8y@@*}fVzpYF6Q0Znuu>uaPuPJ3_kC=e2D(urR* zH4BXul|`|$vzn2YMRZPHQ~u~>W{~Aj*;Vw}8G4WZ`^lW!wrqQ$^~+&x(xZyv*Nd4< zka?e=Ux4xO{157-kI&h%ap-h?KC5I=d^Z~v-*rvRGHql1S%?iwh#hVQO<;Y@C^jUe2i}i7zZE+~!IzKjl0lj*? zKw*Hdr;`7{)BhDbWc4P|#D8?j<-5O3?C>jG$0?FOd#ypP3Y?&0iQ3 z&)SpJz!HJuVfLzoEJOD3kXf840Fo${n9GMtJX}m)iLxoF8!+o}Zf6 z7+u(YbhqggUw?5RslFidWTfx^BYDavK(E-Mo_71>{3lF2OEYbLmtuaO&2w_TK+Sme z8q5&Ale4QW6>0v0Ac6qM!2%Y)M@zC4eJ~%^-u!cwiANZ<&^oi4LtO_&k)id@*S;=B zLo`e&wHBX!I@r!Af`I_9olUEIs?3O;Kqt(Lf3x=WmX`KpY+0W6WK{1MpX(}O;me@7J>#!IO?|%yc@u;b zR$WlAR_cx;m#3kj=AB9#!{G-w9iePB*M0F9Quc(+F!qFk^&_TUER%$7loVkyK-oOA zR1426q@fv)UZIWox}&2TB+%`9$k7DSCQD%IYfT^)#hOBO*@O$|4H|c`T0^hD&48TLmFO1#hLFsGGQkq zSWM7e(g0@3@lhMMga<*Ts2_u$I#k*!G5t8&9n^@GG%^Yf`P+(pus=S|BGyZS~y1eU5 zIEKS{EN6h^d}v5n6A5yO9~6T!p^L+j0y<=99WX|R3kmN z5yf0%G(sl)so-E>Urzw}qR6kyS7Z@r{d{jjm(r5Nq@!H+2quU;4${SD_zH;yycB>p z_{!G3CP=-PQrHr8Nh`ohmG?tlh@(yLfjWNGCWlZcczyvVjn`EMrv!Jk^^kc$aA&QqT0BR+zR`gtLFPC1?&rEv+ zx(C5aKs@jgn66jXO&m?nsZoij5&YT6O&x6cII0`TQ>N}lpL~{X$IWt(=u@@Nr?HwU z@~@G5oVZI+AuIubid0_u?UCUPOLHt4oS5Exx?E3%GL$%&<&~_tnsS$F=CXsjkm-MTTl+!AKH)hlD;XCzPOGGur} zakb>kPK%Ll4KQ!d;O-ryMX=lO_kn-w?=FWo$g+;#^Q3`Q#_0KAp)Bz%cDlm z;%PwV*IsjJhVP*KV+Df4WOV_eN+|t0;=e4T+L%abNu3a>zXRvm&ax(Z*E+32&W?@8 zNdbXzm9CiOKKo3+WrJQggJod`yp5JLnS~;tkt|2aXf~wIzb(N=By(Ei)+^RC#atdL zS&04@_PGWp(`|Dvy;PU}0Hquf$Y4|9lNr_Jx=&k>aVP{38?+*+pm6 zYeLAQ+btQP(vN$x%!kQzQZAC->^T|igW_SRU1gPcD4L?0;_PBHh2JNLvSB>!b6FB4 z*^S1C+D@FoC*gNNneEVg6lX-7mue|A2x+E+6`43+#&aFkuAw-FoThMs0!t@MY61|( zX09{9u1O8?dTNbV@1x!x=1o3P6*Hq+v7O%wborcxnk>8w4@{qq4NSnLKtV^Io72D_ z|3$pIy*cHSME!=-x~v~<6-!KBNMMQ7x2XjRkI7Q+@u#P1y(|C3J$jxk4c8u8j7X%3 z?6ggh(obQq`TS^4IQ&YiX}=AmyjpJ-q}GO7m{<4nj*kC~|+I!;rAE zllTFSKIFT$f4zjo7BZcQaVLGl!~x6MYmSqE^7U#Al9h3zI!};sCzaDs3VIGwX!xi_ zsJA55W;_zlIZa)LU4F1aVz;iHEh>nYqLQ~`2vh~dkvZ-g_MM^SlIJue)w!_lrF2Y? zvXdojv2UZPq}mt|+a3Gfz^K@S$_FK#si2}i{))^FFMFvq>y=WU%w{XwPVgCMd&_jy z#Z%xjfG?*1`)m5I4r@!MyPofqr&>_PUnWVr?ymNF_w9@3lk4lp|KzPA&ecsAQY;B# zv`SlUv@TK0f7#8lITW<*1+vVxSNo;3RJuqw>(Z+%pDPmaS)wA{dlqpPIUU^=KrOnj zI-wO$Q(f0mkoAI3$A_K*-TNS3P6o7cHT|22XkhZ;_Wt#~Qa72G(ArzcxRt1?jSl2weWC5?oTIzmg+D3iQYcmZ zvK9(D?+vGmT3FY<+fDMDrg{4rdWZ$ko42()*;4jI&OBjw>U?<3e&IpVQT|GVU@JD9mAQ`T2%@Dt5 z6WK6C4mKZ7UmyEI=OqcTb2CM4OE4l%hEk_WP`i=E6?~m@NOy;8s7_|lA6E8=8FL*j z^bJ(H6#v$=)KYDh4|Y$x*1`8DolIHJ!sZXwD&R2d;S*qj^AX}&$-S)hzxMsbp7)?53Z@r~Q zEmd~F625}pf&$fcdAvY-vT^W*lr&7ZDR|CoUj|VG_osNkod?#&&MX0EXp&xeGRaX# zYo*SnVW(uSX`{~C7pAyr2R~QFGnKLQqwI4Uu3>)cnccYW)=I?&)WX{FhkH@@J7lwR zA89E6dbnj6p^L08cbr=0kw(wgF=E{Asm6%i=su3Bm~#T=C>c6SDf>_}MRIJdf}|HR zC*$xZGK|8(_vo@pDMk@a8?IkC2G_!i;~qqyd(}-11Vx08vh(GE^&U4P zXMSufa}zLqDDv=bs1-&nVqgi7lM+c7=_!baNDZp4f4**py1s6XNyW)u9>;r{tI~zPCCgwTOMC zgHw|>!`lGytq~Y_kp1>5su}0={_?`q&BYIa7;lk)C`EEraSNU{G-rbGKpHl;jStbK z62qw}bq^ryzS(L4ltZ?FDY0+}HLfLt8QqXsU-j72@tR>;OpTSUGrEihX5+gPBReY% zmXu;npT+w9^)H>BRGQ!O?v&%DJA$)N{yNCworrl&#*iDl(*BUwyq~=~s6G_`iPwCQ zYs(m%fNY<)T+pnF1y=A(;EL36;}D`^+ni@~30*zM+RN+L$Ro|{_{12pVQ zxk@vLz@OY-zIK{1T+G~6RD3zw)!xuH(Z>6WJfQ)~K6~cYypy|%J7j4u(1@XF0r_lY z=P1^&kn+-3i24nL$~n?V8CCYZ7WL!5qD0qriP5L`9W=dPP=qpGF||U370%rym(uyt z9dISyFys(!n_kPWp=eBfOsuhN%C!t+){aUhK!md+4M9Kcu&M3TcgUb;SLT=+GD`hx z4#m-MdId20CmWn=H*|wd6lp&mAl{tkHl@H(TC9GU_g>je=A+&%isyZU+0F0Ym;=c2 zqPjB5vIbMh|KsQypd)FzXt1$uZ*1GPZ6_Pswv&ymjcsFN+uU$soBw?OIdkUpbanUC zsjjM5b?<%exk-DmTLsO6L{->z*(mY38T^^?n}EtRNaaED=`F1l#w2VFjp+G%oU}jn zPWIl!k@wN}jo$sFRB#GhGXKRIC8#_-XYpds5iCJUAA&z*DM+Yl zUrY7v2V0p9GAWFqGcsK{+`SIR9e}x_&p^7~(xbfMdGzJYn3B7Hr@g15gg;SSoeR{X z))BjO_eOsO0j>pUM!)#;XKy#IU+^P4)us)IZ|TRZ)SRb-AN$YOfQ z0ZUm1Wyj@zu-quo!M#Vj&Vk@G+OWcX_363cR;S!F&MfDsYeiRM!Ig>f55&^zQGkIQCsHzSM2{Kp39T=^9)j;9bIkCd0cA2)oYjJqMuV zexBS}dOAqlCXXunC&$cJ>TyNPjz~Tdzd-i-!KRi(h*R8yPW?cZT3NcsQIP2KjWBzd z^bm+&--vD!u_|7wYopE78ylG~5KV48MJikC@ zqKSkZ`MqwFZhg%IjxxDcQufNCA?@3tk;4G;sn*1jBqI*tfd3a31nhQKUqu@oD4Xt< za*V@6197!vp-Fj*8awhOr4I;uv8(f(`ic_lrpcF3+EFKsalx_xJ+Y5DTAn&evY9pg zDKx*8%fE&&1 z*ge4u;yH%rBN&x!c&ntJPKkpTO0!j#)3Ojrn&>G*(a5sO4F7T><}^q80BzDK$5#hp zGemOH_J11L+EYyXXdxCsA2Qv_>D(}3zV-prAT*o)o#o!~RE88@>K-2Xdt~MOypc1n zpJ?RWe4Cb9ghDiVV?@&Ciz}!zh`My5?rXvNZ7em&dx}R!FRB+akas1cQFUJOhVZzI zXFK#a%`l_PsOl|BI+E=#*)cVOUF}GDB1KGwRl2eCS4zVW^gI}`I_E^db2$g zvDd?4on^{%R;rDP*S7>#(^Y7-EJRg+yWR;M5v1OM@#PUKd#xebJ`Oy}=#PM$8DMn>b1l!B!TUqr?AYk_Ao&w7@CqprqBU>O`on9+ z7RXyZ1nJVD=&JxeUusUt&HXv+&J3=X4ISijm&Y`|S8NRwHT_XK&mBVRa*wDON|ay! z;p&9X8gN0D09tZJ4*XinxlX2~spK-JXB~LId#W_ek5RW@1s=yGUT`c~?e%R%E~HWptNS8!=i7pRXbJ&o-RseNPRI3Ye3WxyPcG& zeCB9cOH+E?KR^F5A%B4IsEh zx-lfC4~RZs&E8bBV118LqZm-^jobs0Ek`jov#%9hv$tR`M2b*Ex(+THgWvlN&qvB8 zaFg7y2@)j-Ix`-M`W08e>ApuT_r3loiRV4D=h*tJMX1N`yxX@9zD_*DKNEqVoju8^ z*{1-x%+-}+Gj;25>Chgoqd3@w$fCp2)L!w&=aZkLhYa44JSFBCs&@drbuIw!R}PW~z(o!BPHb+) zZI)6_?A5M7^O0&Pbqnu{7xA0EtoCqoukRDQr_zTDO>cZM4_Gx;XsdA0Fh${A+Ysrm zE1{*dK6@kPko2T5XL_W`zh$%Ej^Js#- z^sQPlRCa=2xURyIf8mAwk@I60ri&jA1H8FTwfsq*9y+b$!=34gvR5!eyBLF{_Ah3@ z_bw4Opgj71H`dFgI}%REi*IGTsxwCI^W9O>?LAu??a+9xJxN*ZN+g-3Xo}nghU9|a zE%SmQijO6H0s<2#QZ~Jw9Pm-<2;fVN7*ggY%cCe6UB~n2o#ooYH*cW|;G^LAkP;~Y z;PD+?#_+$_moB2=h~$yaEeoHzvn!0QMgR85)^uxwFWIgBwdJ4w@FEchQV(XF^F=EK z(yb3q_dfr_X&;bkLc!CkT{w;d$1Mmw^U5@7EstC|J-1KXx?Y9Ny`VFp`0;QES|{4C zVs0&2cXn0Eo2LpF@-n-@`|#1%6Zc`cM=w+Y$;X`U@JRwKl@0Y>EOynRza3LvJY76SZ?Fd$2MOuer@kDDgzMG zcx=+{Uo!x1Z-kRuu_Qz@Yj+?g6l`7`znp#7KlMJ)LRMrQC*ov=7y3$8C5 zM9c^5XN%S16&ml==WmnRX?SMf|I7mc_q8T$MC7;>Aox=_wRRqczHt?JFhu8l^P|T} zuvSv{qAb4hSO5*YI;xN1@MwBB>6AxompT#)8OH*NYMU$)5FYDKZIeye z`xRpj^2gaV37V({VG#5w!_K_`3TN>~q_=ePC?Xa_WmL|_B&JNo_yf*MbNUsf3zj&w zBuHG2vMT}9-!7!ahyr5$=cGzan+jH2ZWC>PHZ;je`W`!t>@KugVQr3iYs#f#DAv1W~m zus@N13FL|g--x5+%ugi@wAMkdZua|4L-PSnKUFSNgV$Gcwyq3OPM0c=o!Tz(bFd|buTx7 z^FCkCD~p>M^0)L!dD(Y&{0CqnUhW(8$f8!Sj)t-rPpw3Z$2D&M429YMSWnR5&`$UXZ!}aFdH% z(wVy7IT&A94`SWQZ=X2hMICAbsZycWx8ROr-QI;2~FkdVQ&O9K-s#Ow!QWV0)HrQ`kj z*y}6+ZV< z?>T{+hOF?Br^t5b-1}lo<)iBy>94Qi`ZvdIC2Ze7=}rk;rAuxAhS*70;~i;U#G7q& z1_iVBKCtI8kak1tGJ{F!FC@z4#7+26zSQP-3_MI&kWnA-7W=}MygwL92tW#uo5IUa z71(j-AYSe70~4KDT2`)nh?`q0BaYT&ct|myBcD>E_(xv%fgZ9_8S08W)Z@FietNnv z>}PYTYr0AXX*TsS(F^r7PlN+0+8u*kPe1EC-RQSp1>e!1$=t0qv?#hjY~bj7+^2mv z!GD$SPF~3d-90l|2Y+040~}z9Mi?L^tf=6;G`R_B$c` zw(Uc$xW~P!-))d&2!l9vm|v@boUlZ!GRw{CB-iCkupDy|K+>0$=M$poW?3bFogTM( z;Lt>Lz=imV=k#NYX772C(q0@TOCcma{jQi0^9VDY(z{atpbed<)m_SzY5$o_lUjKiO{dbNpo% z8M)=Ole5!xnYzk7XRcq#DN+1u6rdl;b+KmOOH8%Z@E1V`+T!{P=YEbM1}-n!?Iv-m zG71LpjkJ_^i-Mx2_~U~(!4_v11jDu*l3NW^(f490`yH!Q-ZNB!qd-sK>Tt(*!vwMb zy71evh}*HUMpt)KqJ+Z^F2eCC_22(G*`g;-3#J8zc?3fyCfAs=LhlL5bjc>is|rGo zIXcRQDawZbWYJ=_DP{P~FR?tOrnxTp^QI;P6i_K~8R>vudoh)~)(eH1HU$p%6{eE6 z?hL;#SJ3f_L7mtsmvM);*l0Wu(DNo89*QRzf4nJ~AujN{RM53x+FiIIZbB<9N)Q)e z(^!fXDn9-ZJ@%UN$T_D5m*23=O9%OOZ8vhk*<8!1Sczo=tTqpd>pWJa9P-`6=9tS7Y;ygb5?QlS#yep+um0* z-t41?o81v-v=TtBAl}%shI8i_-{P`*O0GYy2L5}zC=XLW(|d&Lw?h{U)sYM|j%Y4_ zF&qC`){FvPyfVj6FZEe#Dz@$8!__Ftpsy8OWU4O6nJd(dYGw|O`v9K!T1Fi05u2`@ zZRxzBw`s_X^+RKgGkYtb%a1Y1V&I!TKz$p+`-{p6OHjx_vrK37Uu!p;2^dlH->uZW ze_{-Z+{Nt<$(oObM*2OnE(@lyiY-J|*Ee!?o<17t9itLLt_69+u zC8zJ9m`51&DbL1RP543la&>F*eIc#`U(FsfZ}|p?!!q{vMG7GYaI5va_=zK?wJQ#{ zFV*d8{gs!rZCo_UxZBoqx>Axne3sc(;o;o!)CmKB%naHWS5_WPWCVhxgt`MMKV3g5 zpCjhPXBU4_k=X`J@F;XuZ5hn5*1T!)J6n$4$H8`~ub28`WHo_pPe4i$zK?rhE>H0k zruEE0($E$MIoRQ2+Xr+RUA%Xbe3iMr}ZCCf;C2fKR;rNx|KQgD9ydji5C^F$!~F|F^g&&-35(8Q&Y}0L!}@v|Q%@ z;31*_yw+7i!;;-|Jl(L9$9T`vPif`LXjQFC*axR%@&UAt-$=lUNual6F#&dRL|mjN zrK$x{tXK&i0+Nnq^MOQoUq9QgZf`0@ee_Msel$}jb{G3tB^~|+2r2& zsS;_lN@;rvx6E*SXkI4^zqP}m%)@*xpm$Awg!6@MKco*(V0EdM1{rTGyRTgTlMv$G z@ZSesUlIJ=HcW!-P~0AEP_v~IIY_;95$&EBr(wcLMnURR9HwfTgH=Ez-p0B3ORN`= z&<$W(4^YXwuGT_dW#2bq*~#4#;8jVK$w->P(Cs4fe)6tTjQLwq)N1MQDwO`zzGkW8 zN7G3feG4E%w;C+)7UASw&S1jJeI<`My8qp_%TjCV17j` zag1oflCd^S{^ILjoB6ond*0REyZlAAiRW5*K^lEEzReGmaav#Y*0a8hrh@jIbfF$? zih?5SGxsjtWP+}7Ptzwv78*`Q_|ubIJ>Nz@+a%l&l7Hl2^iS@4J3q`xu7R!L2a$tz zPyN<`u72{arwdHiUMVZa)^NbB{~4IB`rFw@x9%*ya+$a9K&IuY==rHR127^h2h*=2 zU_`Ep716k44g@!@iAIw^fVMb4N^jZ6fhd+`C0>)I=z|k1R^tfF2T8+7l70z;->nN} zT*zQ#F%FeCb##WU5w?UxG2q(Ry_u>GqbO-~DDYum5TE~^7#<2+iJ;m*_?mAb%2j26 zIU#d`s5to2n<<{BO|`5Yk0n}PSk9tEr9*I&j7`&)izjzCCIso5U3VAqTwN1#E7Is< z1mpdJgABk%bnm{=f>@Af)BT`JrhZInK&vhIyR9Y&FBtEorHWatW@uRph!TIyP-W$k zwgCL(F1-vF(U?#@YHur-$n8!x{t&z-)fs2fZF4UC>Cso!10vton!$J|Ab$HuZ%?fc z*!eMKLLsbO@9lS%H8rov(8e|vwesyCYww9sx<=1A5?i1u>1;Rl3T73C)+=Z@OY4l$ z8qcOcV~b@tyaI-ilZ38n>7uipu&q?K{JF2DuFjqp;F~-~o>>)(`z)%P=+f~AAyr~p zeh77U8?$*+hVw14=h;UL6F8_QJ#608rS##FI~V-p{CYDw<({@TvgJv04Gp?JesvQNiJ1iWwig#|tM*qC@$UcW#ctYk-)C&)+t?0{HL6QHTf< z#i-jJsnyK1yf%-b#%8e;-g`VcEaG}>ixb2(o2Y58#9gM7wiKe9>rwYc(}?KE^hVDg zzCWz^a0Gx+Q&v4mjmH0av8lG;UK09mEmU;|z}qm!SlQ+$mQ3t*>l3+PIS?5tHopV4 zzp78Sf1eyiJdRh;cHvz3626nTxKc`m=QIXPUZ|;#A<5bi`K>b%QUq zgEITGGJIm^pZ3`>i4jSf=;%wz7?uaO&*i1T4*>{4G;%(up@z}l8D!K*U6|OP4~}RJ z&yZiERfc!W9-%)Hqc;h=-G+&klboCtD8TRH32-)*Nk+-j=6;x;w(jjqoXMKZYcFNJ z)f%yo9q@_{lP2Ts0=uKyC$eS8cg0HeAF6FG@~V0!7ZVK<9dby4$!b){CUM;0e7lNC zSBnTO%iHy`%a*kx`P%yOfG{^Qz_im%q1-pMRGw&^xKFs_f|sknZ$zP71GsLPic@x= z3Lo0xi~oZ}6sUZe5Pxz1ivDlU_a4EL+`kHftEslIbTd}^9&w|J0^Z&f0$QeodI)Zg zrAp~dIJZ;yV6Mr*eqVWIFW+t17XC_(@D#wJHRW-&_1})_z3StEuJ-1a9vziaowc<0 zlbj77bGq+e`)Bc4{Hd<4CyI+Jo#Rnn?`~+KdzNtUhuLt&zE!JyOtk}<|F*b;ydjs| zrAJ7&n&gBc*Z=Iq+VScbS)>4Z#6v<;_n4B%{#d$c{t5tUPPxGpybLU6>jdZkqOKg_ zv)?+qBk%pzXqCq!zv38B96^bowc_)@#l=&yY10_8qV0Z2Wpb*Ny1ds3+gv>qmF_ib zA7C5_@1o(?tNjR5lTej-cO`MMKSTvc*!Dr^3t$7)Wx%a8By+kz#IMCnVLthMN+yJU z=d<5AhPUgy7F`li9bwdrx;j}f)Mw)QDz|V`VSQ=GmA3;xZvY1C3-7p<*5oRFzD(3Y&VFdw8C zTCAG&(b=VIQN`8~VcR5UERP4@^d!fyo`*oMug%zGd)8S~`)Q}Th*i!~>T9bF^ZY(` z=Z8roM-hM6nq_#7qYD+fPd}OJK4R-J@NV+lc9JeMpE)5No=7Joocj)dLy{n$ZorDYB_x z3qEWCt5Z-P+|&|yJgmcz%|c?LDSQoCYEs`NK6t4AoN|QOMz@+7;-)wl7DmfTlcr0XJE7rgr`l9KaE5rBZV{5q1uQ%xMkNN@*=?4>~)Xi+UB@kf3jO zQ12D7PhtQLzeGe;QaVh=*Pnz=Pue*u`c+22ToE(h>m>^v+H_Ld?6D}Pk!bL`-QK=n zvTumit#gjykCx{oBLt9mL|;v^qPTt&MJ~N1xRy4s?nzo&Ie$YrGs4X9CmpqlMK2x} zGXs8J`jzRD0E+)|%hLf0p`F}SW#D+aU_K>tyHajf?-mb}tg)FMbgl&N&=u#;b@l{V z=5<#?zsD{L?sJilbMJGl7jJwmElnsO&F}iX)wPqf>u79dma3vJZPe9EYaS|PhW5PG zUmtYU)uY!doWWtZt~zRK6&|PNxpxWcSNx#UD#X#K`beWJM^uWyRy))z5o%GOZh--l z>jpB>wZRG6Z+#NW@e)mET&*xf1RBd+=0C_k|nmHWuUOlFTzZts#C^JsUorC-%b;n z3#H?x(%vUZ)clFxh|KhHLOJW(GVRtX13DhE1FlbwL4X(%5`7mGafPB zakTMDd82Xr=4k*-*rKD1eD0YS#;8=1ZG_OLr7E%(It9(0L9MW5=OZHiP#)7tGgG zXDPK+HsAwi-XJA_X&1$MH`Ay#1gS=Lx!>Z77uKY%3Irr}QLomm)9Uoo=cc5gTF`Fe zq2)AgS;r5c6_0Gy>jdLHg@HvdOVn|p|F{tnI|?#7^T-eT61`bu>F>WA|MmTc5Da{} z&PYqi>W`$wn>py?`S(233Q$a&mDV0+zhy-3cm6hH{N!C0OVPgBg-+6P z-ltWgmpb~OiWV%YijDoCn0vN^e)gG#)gajN#aerW~aq&Tq0u65uNmH89o50;`n&2=RY?&yp#Mh?!=B1Vj9i8DCq(rLu&km^#^NZB;k~%nepKPR5r19 z%eW3?;hLSBdZY~pehrE>tjJjpN@_`AJXg$^EoK9ApP|t{9Mn^}aQCN%on2$0WL9fO z{u#GJ_H}hks9DXcdT;!L0>Sg)cSo$%SWrmw5ButKmSqP0Sm-h9T3Y#*;}UMGKW#wA zIquDH=(PP_A=IOs^_5cl^5!1`-W#ww#3wPjtZRbWN10OWJUJExDREgCD^vQ)Lr!le zL~NH0CSOl5Eo-Wwy-Ym}hPNTH(sy!i@4^W=~p7OS!n)N$M9P za9EPdzuk@dRBS!+o_!=~e4q9V)hDWK7w z)l*7+U_prDk$9JW$XbTnpAj%~RzjR17%EsI`^xBQ&B_^fGV?TS*HL=my^20vp zl1mHfGuwqJQut<(>`Sts5MQ^1eKmpMp*4`hH7mMh!A|L5~ z7v?^o*8NK`IyYO9osq-*g;QH){%hjtyJ~*z*WvCps>n})9(JhJPMr$b30?CWyTrcN zTI@h~#U@a#cOPK&$UVcM&I|`bR*E-gTdcbYx4B?eiyiW9MByiTWO6I^1*|*Qs z%_qIId<0x-R3p0C|10phuD`yo3D?$SP(#t}4|HfoouBLUwUW!|k20Hmk%fF8nL zdahmsOVC})naawASpCS4Pg{^QxPs`_vG1?1=jXn@@6XTc>wtjo_xIi1|DOtYV?`Ea z1f~vSM;-)+G{F{$G-e|SZwSR6K{3Hrj3kLc9{eE!j|RgmM>>=!A8E`&5>6e8?F_?w zh-TuMgDeV45-uVF?=Awb3cQ4DNJ$PlYHY?-UHlLO71c@75Ijn1nl&-9_WL4-1$s8-o&VqchUGo=fhBE<7JY$sd#?RkdE9BAA_lzY(msfA`G_rY(^DivT3iG? z>DZU+s*TXh?o*I5EKm4?z5PP5JuGldAZD9zpod3C*pUq$7C_f^Io_ei@$oDZ;*s8U z?i<71qAe##lMBs6&S{}owmN7T>B;GE7AP}7JSTE7JujBZ#vRLgfY$*9UZm4MbYh1C z@JviWWUR^mY=9||*Up4?>tTW^6M zh@++Ov(pS5$Ood@nSqmI-Fj9Q$1k@KAh3b7AXGnxxHy`S_eU%gFD3%{i9lma)r|0U z*@7T2F%+Pfwh?hg%#Vc>dxb<3e21N()!WqQ^jQ|D| zls2210Nr3$z(&F!hI(2qg_48shtBJrd>B zUmS}D7x)&J49qD8ItKQO(;~rA+!CNLW=gy{)6YglhX?y$4(!Oo*Bo33Q}c(!^s%p@se@BQUg&96vQq&jGHw9IWBUNF|a2DhoGxZ zj2lE3Bjrq1HoMXaH)1el8POZjj_uIy{|PE*9Qf$VkbN|wS53m1@ZX`?h#p5-Y=`Y{ z?0e@CQH0mb1721okf7HCXJ;HLGbae`0~9%P5bQo?qAtF^$Vbb+?G7UF!1sV- zWJfh-iUYg$lLHg|2#gAUl7{R$(n`OgZy=lZ+lS`0X3~Up~Y(*x7(pt0JO8z1X zr6qI!n8n6VqpA^WFXFb?MdWiFZQ`z2R_x2hzLb<+XwFCDn;+usAA;1-Wj8l^p-u^8 z&FHFAnlU#+O7PcP5oNSOQjnxM`eO$~LR=Qe19z^3_JBRpm+x^te{iHeB;zl)$W<6b z+B(U0LCn3gHst&!oV8lC{DbdTUaq`nQvAh)!92b^QoS#bfzLtY-w`P8Gl!>?cQ;~R z-^fGf7fd@>UC5=+ho5PIOeKuhtM6Xl{9}92q3^878UjQ2afhdpw@+nvFW;l<>7#AR zIROdsw&R-nTgR~l*3kA+zQaz?5omx=F6IWbg;1lKl9uj<=BkTYd|vv$)SRJ9_+csG zMQOAtBGcMb^zA}$^mAFx5EF%IV5gwiuxvSAf~@zk&A^y0)7RUA&G)(M*G)}Lth4u1 z4aM@rb)XZcX6;w_?G9vP*>FdiNY}5B{&=kb^XD9r4B{j@v;Lp24(K6vAk^za*eB`xab~mZ@xqM^ z0Q_}t7l1#i4_u81N`CcvVdE0~aYTA3)KeGiO%&lR2<@D#Tj>9RbcV3>PU0yTGA968 z@G()igCxw09rQ*N=q>o;lq_+V#4{hX{F!VHF<5E$eQyi;Q2_C=7vjth|I80=>3whX zl^f(ypauPmap@h!3JQ2Bz0&nN=gqwlvS;p`!13Q#IVz&^=W$$r!tgguh(~{^6Y%n9 zaGO2&$3Eawkk9-;&isCn38GQ05-+`jmP3WW{qrt=9wh#+lzZvj-^ycfju1+??;#)2 zxsVW|U$J>V~sdJ|G>iPg=LLCEVHPn!WUP%JD>Y2_WFS!NURDiXBo#oDF? zymx*p6+PHyK_1aBFHs%Q$KfuG(rV$#Yw17OuH)-YoziO6YRT%JtV?A)^wK`mZ^+KB z(8NvXT8CzAS%{Vym8J zwo!wdf6>@vTJM-W`*UlViTlV2yHNorH=FC&`o7O*P!?iQ6PkGT`ohrP^154GZMbP47$f*{fHf3W>oo}h)i|0O0|&M3Cs4R#ix;$_S( zL$DBBZ?W;}+)vkT6@_$)L_aUTt*_9k$W`Hl(kD*@94V6ge; zLxCKnq+OMj-aVdW^iRQ}nY|vUn~tet>1|TUR1AG&wHcwA@Xw*Ge_&@-8uLw+L&F`o zGwh-0R$Jh7b0_cSmf7B%5LtOfuS?a#HFg)a>&EU1Yt7xo(Kv;t%JdSS`N32*NFQ7B z*LbSl6_a|%2UkwQa*N!@Gv>mvD_A11u2&OSb5=UFJkKL=576f>7$?kJcm&z&+_m-Z zXHLmI9{eaV^{mf>u=~*!bIwr_86mpJ5$~fNy4uKX(;RQzx~RW`N3v z;BtJ{Gas?xiRK_%iv z6oO684b9Mx$#CTk6Nf|EeFgoE8(!Tt_3t{ZCL1498xiKLhJF1Tm5tu^oUGSf{l~f4 zU>is!&kgda%eq#*J_RF`{mth5O=N`$(+m<@NE8%ZbC;jA@`x`q1oN3(`w zXAR;~#z!Oa)tc&BFzQ{2mCa|~&`T>qzp8W8_QsR|M%A3YQk7shU3tgxAib! zC+1*LYwv7Iu4o&;)KKvHllat%wSioK+f%QOfTQ+^(OSuY7ghwy@lOogwz(qFT0E;k zV{>VM=Es8+A+=tWi@f0&n;8;G*rjnxa__;wQ+tsOi3n_JV$EYY8!}>BC0%%>^jlVn zXU=0RZ03L&vxOP?WzC$B+7B&2qf&z%`4X^kA}sDR;>F6dTO&kDDJyakQDSgXhS`2% zU~7n$Zj6IHAS?u~EapVsfvC2H(VX0hw5TqN(t)ryDP1bNWkd2*RG5HP-fIyTMrhDk zfbt4g`5FIQnt2d4{yBu zskbUmIFhF(qA+C{(a}kUEGu)B+08SecDencX+&1Z?_Ff6rKEEhD;itgwthvj2CPn=L==!$!)R6sJL^Ja?3{W4S49v7{kZ9C zjKRljsMTV-SfGfrA}5e_24{oW^2vv;GR1^6oSAS1hewi(F#NXUe$(XliDJ|OuUu?PGZrPDW2ht+!M{>pJo}x z-`&12_ea2(QcSobk{08LqPe}X%dEczRHoo1k_~^2uWf%_ zYn6U?(wjCXG1_4+MIY|D(%@9ud&hLq#CqM?9)*C+k!IWsc{kS8wHn=~n$}9@_P$3k zP4+o8CSMFfUOn+M@kefyl`Hpsv37mjbi}JRRBQ!0rrxkCES$4C;M!!{p;G%(zY^8Z zLMe49xI6!N)fEB#k6}|*Az*J6sJ-p_>pyKD(EuHw)^Nejhr}j@2an)VwBGLN4jmIwEFv^3~0aHiJ=cnWJ0qWEFuR z9Mu|G;_;(Xm{$z5Cp#}PipJ8_)&LkF;6nmvnJziK)tZuV1O!>bKOpLjc&n0)-aMIb zj}Q|C?X|L|*>VK!EBTvSgp^oOFLYE{<>JgEvUBtu$@#7A$qb?l!$jx~%iKGR6I=mjrh^2{@~`PPch zP-yN6Z?do@vC6Afe7a zV;e+tLDD6zx42C4OW!k*n}@D^utnpT`oewis>mN2K}WwjTQa0bq0y>09M*NkbDL3($p(Ds1*^h7+?tF+Ez4$g#t3NoYQ)608!%XlSQanZ zxRdtrus*Z{j-Ps? z>TZq2dW`(6L;X_t8vaTPaeL@NU%JfscF9G&KVJY+c$>fTW_Z z&cf&6*ii97{%Fi2(-d)e88%oKTyfdU<{lay3s*V~YyP7>a-Pr%c7yGO=E}GT-E_tr zUHxRqXbq**xe6xk>1N^k5+U)brAT8Nz2izTId~b&mW*(_&{(SJg!&G)t;!9Pllt=1 z)+mLzjg2A>c1%vW;fqN!akcl59tIOj`+6_W7DAbb4pbVIfxTsd?95IEm7@7Drr%ma z-ale80GeW5scF;U;V~JHhcfvQua$*GiN7OV*KO%FP}rlD&STa*DeCHXR;iZ70wj&n5Zq(YT>PY`dGggo#NpEA3h zXCsVnL{TR^KClI#8ns560ZwC* zg?@#nIdEARId3pLfZ`U`oA$J)ozV&Uf%^+>{l-<94}ICrJ|}vA8)XAcX`Q{aG{k}? zIvdihw5xT#-mVqLP9L`?T!(iBlB7DT=2vW(DBJ4N6Gmp`G}QTMza9anz4(B8n0C7? zf=k%gpxSLTli|Lqn2-OzVRYpxoM@Wrt9jB0LKZm7{R)WvSIgERoMVf&NN)PAy1hLO zj@5xdJ6qTKNZJOC$}4TInfHA0sX3unruzZFYIMQ%$QfR!wx4N-gQ~oaKrP@fQTry_=f&5+2554pR2rhXcmjkAbw2k&Nh8n)xdZ0VMV27P5I50U?wo zawSCH#FU=8{fRhrYjb_Qj)qPRD?iu;ijZJ$N-M`;I#BBt1K`=x2`BA1Rh_tG)npDh zYY?zsHu&omHBQjwHEv*K%{u@8@L0N^<>YiIC|yrkedhIagV-4IY z{W#e$trg6W+IA~d{R(wyX=sZQA$94tE*u41%qo>`HvBe+cCGa|-HKeQH#s~snjvuX zouYWcE`V>H>CGQ8THkY_u`=a@Kh8CR%Zt8 zorSoiEH}1Qgd6#Al2Vu5uO#TIVqccuKG?vYa?D*Fx@!0^%DX}5hx?K9mEr}n+Ee&& z%8*;{|74k>Uz^FVcQI^uvKs(#(oGpPM+r6Bvfc+w{7O?>h$M0D$(n<)M$9fu{UOxH zgB{&?hEo8Bjvj`1>$Dcs(jU>L5?mVvkQuy%2sgZI=c zrkPh74fe{C5GpTn%8y1 z=fu1kt>*jIU&^K)5jpnx(UiNCQ)$7}fd?nfNm^XHl*@Ncq?4p9)_LK*`x^}Q);oo{ z+Tm!WB}x4wszYp4Ut{IKw23Po%GeJ3Z;D*pQ^iVZ$LuP9r+I6ll$YO~&9>1q^NeN} zIGoAdE_dLylG+se=dKYM3+JYy%po>kue<$PHC{p4!Huu8-mtOGaSOMcUpm?L$4Z&Z zHj;5ugl*ls^0$Z?A4%9Q+@^o{X%8QTRyLZ zJIAwgIv;Gx)b&$@JvE68(Rz7o{o*?X=SNMMR)4m)=>MXM-$J>Fu1C&R8uM!+qvzj# zboP6YISr-h>J0Os@ayO7;XGL<)TuCevnfh}srmYGR}H`PnKVnqe^>lojU0SY5PwH> z?T$6%sS1y;ocrkcU7uWi>l?U!7Ty_WJXRbEQSE=|{Zz z-K%#;$}(*-1a-ec>+>9a<_+wBxk;#@W=Fe{)ibgGZP8Y%JjUD ze|9t?P|@kN`+a?jdH?)xCkx=&15xR1Pzsl#7#nrh(&ez!Bi9Gv_js1CmIs(M9rp@q z0`GQ|IhgAty^p?p>)4iPx!}N(B#+%U>yFT>2Pe$}-8tL#Q}yRgK%89`EKq;cpTyM!n=GBv|q;qpi+&N`}Ul2Dk8nW&cUT<1gUeUCg@ls-Eek1gmo-dwu zjfAhq-y|e7MwqQkUkB6in2Dkb&mW3kQT=NL z$KIT9yknw|io2FZI)NBgS8_7Q{v}na`U*W?iAPbXy9g~8(S}| zIS*4kHQ-0oZVy%X`KlL(+KIoXTZ+GLzJC10d*TCT$%y%Q*}%Kfj>O=bZrF(R>=A26 zwJ_#=$;h$w+P6=#6%>yJp9#vbEgL*td}KoZdS!Wapmg@HZ5&f)Q_@z$Y#c-P+9z566lolnU z?qY2I3V0raRtzqERcdzI^!K61kyA>F78r*rzisQgt0Qj@iS->icW3v5`^4>_DrZcT zuvXK};-nk)Jf&x;Z;Ds)P1Lk(eq4IrzOT4rcwghk!Jp5~!awdAf6&eM+EKc8`KxxJ zgsF>ZgPiwr-JtN})b4ln-94EnFCFXDn_m7Ro>-A^;pGJm`C023IKN9kv2y2ayOET8 z#kW`7Yr@VU+vL+l(+)G)pSqjb9+OD_n$cZ*gEF!s?sjguU%0jP&Xtoc1;fhTwvV(N z(4)fukBi;6hz;y6OTmt&J- zic5o6gSSD%7e0$_V?Kwohw;p^w{bp4an2mm;L+d-fzN(@&dtupf#xSgK96SOV@Dq* z-FhC)&c`{!9Riy@4i)Be3a2Ey4hNNOmh*Y15*?g!hl@j@k!2STIJcIUYmn>yQ*15<}WG$Ay0Z1rr8d=MHb zs9b1scs>u6P<9H(CifH{Rj@6CO_EKAEkqqclL8gWe`xqgQnTFbh(jTVNc^)UYzVH9 zlcbBY;Sd^2sLb#|Xaw3$Kj({Kd}y0IK;hQm2swFCle?VLo;T!xFWbeH1%d(uOpKiy zYP_679Kr(Wf(z=q6r=>dHWNrAknGtcIdTr@91Y?3Jq)!Y0Cm?y+n&2YoOEcG?SWtf zfdkUHfG-=QSB18#kecVA&QKuzO0tP_=Ny>ggK)CVN<+1ELba7ZDuk4EH1oim7Sy&8 z8#i0Zg^&yXUoc`h#@R1Gz0zRId`Pl~6t2#}%l3rbo=f8p1V|hLgoXfdLV!}9(;*vz zBzOQasgsb{jzfS>LuQo1+raCq33ZCS%~e%L1X5J|b501qEjusAlLO-1Qyh>j{D)s- zRu-x)@;Ntz-;zV}pw1yk+lL?#IJL32OX5F(yD( zw8^b=2r?>us5U34Hpr48W05>)-r*|&wS5|D+vIrO5eShXgh&Z8S#GFP3IACtp9XXx z)G0woJ^ytonoSOJ0?7k896AR=4v;QF&nL^y`a8+7b4TUIwFmHM^EBN2WAcBggEZ?G zhCDQe3V2Y5tmdQ(lwZ+!PC6g;iC-8S%hPhQ7$aWP+`%ny;rjM7ftdtfM2EN4 zBkq}q5%?9VOcdN8Bts6l&oQzq@ zhq(ElTw}Q0)EY<@vNBpx`{!d2BG;iR04k)iel>Wvh!v-7d)p`Yo=FB&|MC5!OEWk+ z?if3=ceDhG6OYVk1%8DU+e+DE%CWH{VmF?hurz8Am@7UcBJ))4bc>_|%rHc?750w^ z%80?Qtu*rk3lG$Uk6oL+9)pka73>Y=pMzc*;Fw!9p26STM@JzH?_RnRVJrPq=@9qu zZv1FsOJnhbMq=*Fs|Bv4mRffq&#rXj z9XY?=*oKZ$HvC=yX1FUt3D?)V_S+h_78PnrT?pmb_jFz55|{mt}~J00zsLIq4pF6I#nLXOBi|F zg?~k|jPj6S-GQzTh(HwvIt_7MFlrF&#ffflZ!!7N>~jjT6>LsUL! zdSvURu2ly75`Tn1RL7_hbt%Ze;Om;wZYx2j7>XlR{ib?#XA90(r(4awZM=MF z+}(xnF}AAzwRVyt(sn%2QNnm@sn107FZm_HFvD4+j z)_d?z<`qKG46knQ-^<6n_WBf#c?G|5Mzw3bR$(=UdYs(jIsYjt-p8H%xJ)$@FwSWY zgH<0Ln~+JU3Y;S`*;N}NKQnq~FGO9g^H++beRStm^FE6`vG=xmgyt5z5`O>31C-b? z;iA-H+rslU-e)kW?M%MT)1^eynqgYKqsu zpDOeIEE!Pl)&HQis?t01(Wx4e?Oih)_?e>f)vxoE-d%7}BVW>kiAsh@0WN)JC` zKjwL|?$OAq^CvB7H)qWsGOhP3%ih4_EK90S$Y=S)_Fd9-)oSHY6#7J+ZJtmWcqHh> zN!zvYvj1tjOwzp}YVmL&41ZgA^t{>V>47hyHd*B#=bqHU1qj;DRlRH9BQ9MK!g_Z$ zB~?T0v2zjv z2km&%VwVp?xjUN!;4e9$e5d@%3pQTj0t{7MqXYPbNr83|DG!=I?qR?w26ZobYsbYH2?^*Sm1c+a-_z^_k|8+|SU-qZiq&%7@c8;m(&i1{%iF7!pi zsiRelKWQSy#oN&2yt5qvbEm^8{Y+(?|9QLpKb{{Ieoa=c@S$c$vnr*p6YzT)y1gyZvfvf>qw9pP)+Zj;WefEL)eAyDN>jbqbbO z?r>Fc<;uXqGFo3gYltPbX{mLmTa2n5yBy<_kwN?Jb{=$0t=Rgdbn54Ck6L+wproYX z&hs6Y^v}}I|8#%kR+cqvm%HZF^ZKQWzH(gcZEdq#@wNNs>o^Z6UOm;$@kTJWuRVA> z=CXZz+llam%PUcFpSt3o*q?c#pK$Uaf5OQR1JE~nUP0YvXnMi^4WiuN#o{;P>FskeWyE>YFJ)QeG)MLVS4=c zXS3Q5Ka}VVJB3Fa@?vA#$JgeoE+!kVpzL6*h|xuG{;T zqwK8SYi@qPW?tKQHZ<77T-Ax8)OW1s%#2w$j$c7=8>PwH}JwJQd|__R`AWyT;bQv~{O_SFpWg1}(}v z$=P$q(eHQBg@m^@ujU^(typ(P!PC2Wm|v1-;y>p5+3Z!1p4^9Cg?eWyZSLiuZyP$# zV;U)^R3UyRzmLXkkoBmm;M9%I^Qhnh4L;c?zI{D*D(!bv$nEs&`8Ufp3n z{dI2E8BnW#wQc;g>1juKLYF{s?1p(?wYY!X8{4xAPqOV}T?HvaZM?3W_OZAh@BlS3;cfM0b^qqg+RIOiTJ9`1bGp_TH5S&7j(C5x zt17U0q(v{Q(-HikA!^T)VWe-9QMxj{9$yL9?fbTha`<^H`ySK3{9+EW=(T)L$p`*L zMsnp;{`Ge*?FAviHXSzYi&M(IVfj~#8wdA(dtfa)DJF|ys#7l$tUmTB-4={Wopi?w z7HN4``($}~JN&9Qh&MI?vjAoY3Bcs9YH_gkU7!@4uzt-P~PWA$V`4{8wP@btj6ODZJ3# z>ZF7SBEtW&%buyy`-w+)sp|7dfWhZK)c)_+o=sM7d7AWpbrjeP>b~hSXgL0|HqZTx z{?|-%`;xPDrvkcnJI2lCs~t7*QA$E0CZV2L8mrE4w#{(HXL!MjvvES$677E@p&vB= z$x>nz-PH%*EQh&&GigXa<$_Q0`1Uinzbr?!y!qCzY4aSO`%Yo$Z>#@^Fy^ZjWFPb1 z^P9zK&p+!(Z^zk6V1fibQ&w{0RbD^P0nsTRUkLwRU{-87T`qfhe08`8*DcBy+EuQ0 zuOf4(WUzqLT;Koi~kyDMSr6BfSR1RRTe{al z&X*nRkXbXVW$}~&QkecRp7Yi+qkhsF>i3d5bg{EHj(9d}x0iB8IiU>SZ#1Y{n_5kp zd$|5Bn=^L*bM~TAvRjR8QtjnS$ty>xlBe{7UKu-zSv`MjaaN<&kV9=auZ`RNf!IT; zdOFXFwU3)Y`{ToXB{A#6>p_pctC@SqPSzEqg`2*OUC91jEs=TF6;~sCT{Smpg@seC zGN=w!Q5S@t{@ci_riz{Yb<_0r7qQJ&h^&+we2n-)ZO3$%W^=?jPVDoLl9i!iFY zj7u5z-MxFXxKd?h^Q72c$3kDW=IoZAbzPDAQk7r~ZCO6H7E_a!aHhpBC$?y*JeK%p zA;xv`TxIUHvl^+fAG>V-ObiXm*j65!IqSNYq-j>|BvQ{~DKUD>s`jX~P-_2kuQ!jj z^%f5(>x|a@p2b*Jcj>VkH95anRyp@GZaZtZc<008N9QH)c-O{1jzb*82;RBPuW}Hx zO(MRQD?-)ZcUwN-A~F+P3y^3 z@p)8s|EtuG@l`(Se_1~1VpFVDV3V1rLzlCg;G-hJM_#U)pVCY}K%W#xJGrmHPlAqZ z9vS)b^KjO;9}9zNKR&}ApFLYOAT2AnS}eF^Qjsh7wa%%=Iq$p0z(by6);#3m@xcto zX3v^x?VnC!Di?B8)#krwx~M+Mfc}UvUjSaY47kfxnvHgqIfbds^vd3-ZdYFroP09u zRozW=(t0d2!gx$NE|WfV{=Lh$l$Yvq=d)2K?`{$0irbb}%@Qtjyw|;gSdh<*! zBZRy>1pf5op>%JsJV-r_uvw56-_(@yW zx~0Du-ov{f;P8#wHR?eJq5J^uP?$d9x%rFc0h6JCYO7(nJEm_!tQWf<#X1)M6m-*! z9g24ePfQSA?4d`Vzki{q?#XRT@^wPPv%vY>u03YJ>fxn{t%s%jv4bhsj!XzL&&CSd zn(d^>o+>X-%0R`pw0JF?xqBM^@l@>NcR#nIE0PG!HhDtg$Ev)%46{#4DxHuSQcn=B zTEyH^1UzfE>u)JmA}-x$1wT5I?ktE;y(v><$&nX&FW7fxaM`uTK%J&I*I9&`p<_wb<2iV+#xSkgrpQ{YxVvl z2L`@7s~J~USicY#92k=GGhs7U_3zKD%!NNfead;*1mOwINai`}hh;VSl=TRO)w$fn zgoA`gtDlz_l1%PJ(pG9^Q*OXhEJ*xDmxyMa`_E0j$9}h0V!Zqyuqr(L#k{7o)6bAB zt>ep7{dv>E_Jq*-s;p~;ZMKu+%*vxI(e3XE??uOE20eNfa?CprS7y?G z!|HWZy6L`IiYH)Tee-Omzq0-G-Ik)@st}XYu3Li0wC=vLvu`qP2b_Yd9z5?j^29UD zfmbu&lcBoSDFi$^=cyq5>b#h&!s~8={LtHjH1e499qz55syg+oJtXwTs>dX%vts>&qi+7e zx1t&c*F)-Hm%Wk(L$tlH+2$=F7s}~!+9ko_eQjqW>$Ar?W{H+_p>D-6ndxKM|JFOS z@omSKt{8tDK3=C%{r=IfqR!)lYq8Y^m(O^)cg@*UN0l{Ac9%pxeDTYzfJZQQK&a?h z$m@WX(Nf`(Lq|IL^*hfyrdj&RKHx?l-tg6@z`X=|Qu_ldzBv5rRegED06i7vCOC3b zO!>o#^S6lWl_j&FPAA?dUDD%3^-J9Sq&Aj!C49{3+C&WD_!)6`yQO>HyNMq&Z}gRH zpFx@Xd0_5Ur#{L`!v47QdfmZd;M7@^&7nM*(5+j!^M~uLjgS9p|tS*r}Rf(A2nR?Fy%Ch(215g2x?nU4Qk9ypUDf?<>o4= zj+HIuAAiL54nzc{_B!T0mF#JD>_LUO!9x}9|4Pm}S^7XN@JT0wM*g%aw)$w*Yh?0^ zEvfut;>xc-mpo^n;{;4z`G*fv8uhL2=xGKmz-#T%N3TzxMkn9fT!h*E7>qcY~f@@~m;3^D0(cfaf7HF2%mx7B|@qI)CmK@^9A_ zlD_IcbN^GRXId6UO+q9rU;di1i(YeBhboyfkDOB&9QVxpfkouE0uZ;)Z6wSDcA<=(t_mczik<_FC}g}2KS{r!Z>Y#NKl#@$LJ?=)7H zKSMh_zLWclsC$?}5Wl}J-xwfcy8j{2#S|6e5xZC{H|(m$ruVnQzamPGY?OQyCTkfOx=x&fGN+o~` zJajeqr3=e$RoKD|)HZrhD!z}L^I-Am>Qnsja8&GpoF>Eaxatc@Yp!S$ z+dusdv_EIWs%1R6M`$m{D?QIOuH9IAYrhNK)l$@+{&VVsD={K{#?PELT>HX{gp|Vt z%n>%g@`A}T^)v6a9Mk6uYWCmfe&S-^8}clabyJH%^2cy>VL$$S)0*Ta?(g}c?2~_M zijV78q0GCf_Gd!dzPNFB;i^W$EQTBj%BqtmGQUk#3N5=yP7o@dYJE)CbR6CZeC+%A z?r5uS4KaP>%_+Y-)tJ=nKAg^J?@z=oHy-T&}U+vks`mnLZ7edHYo3?rqEJ^@h7V(F6UvH`6?q zxgrt;OW2=n#eTRRyO_~frEB+AC>U$HWn=z(uq9p7y5p_+VD+ol{;L1-YZ8`FANn(k zGz%?~H%`Xd^T#O8UD?O~k}p(f&K__#aObKDoxT^FDl?F7K<*YfPuoRK3_u`;&9;?tgN1q6fMIS?ur5&3y3tG>9mSC z~WaihUEe69?qmnGc6O?X7$V}hY5V%uRBw~7Yod0I`#ZY=K*tYLu3 zWVYqh8h3*nd5Fa%a1&oCb!jYscigWyhub+ZW z^}JqDVNpNpgfF{M2*CWAMM+WcSqSSL{wo8#=*xt;F)~EhfGlmKgYUeaC?Med?nKBC zlV-)7Lw<5&jP*U;AHGB(5SzQp3u=gL-`H2m^^0by)A zU?MlTzESD(om$_?iZ#GCkwNXHeUuwxqXXE-YJ+g%5K?}=LU@sqr42ISPg4HkQSil; zcx*En2~Hc-#o^g0#357#0*ep%5v0QUOWfL7nA>F00|5Hgs7h;9N(py`9}WyS?bZ}W zj6N0@d3}>Hk#THBZk{ivb2LSgk%0@Uu3=4avaG)R$wi>aKJ~p+u7HqdBaz@=2ZSBG z7W*Z_f7TMk$|8p8T66;ftH6(WmJrciZWp}O#+TYa#xp5?_|!4vANZxqW4Q<#CD%k0 zRN7+9PtjE0muLLNgKUW9cI;}X@2fbFhXl3BH^XpgjzjY9sxP)9bvOTtxiX|b;1;wu z8AEFQ=?OrYYRI$sifJ0A0=In_a`Ruv?TAo12F7|&d~K!M20L^_}tG`VWkWM#?MGS(*S{>!ZJh5u0-6YQ1IbM zGP@|CK)NN#Sai|123N=qI=c4=gIJu;T&)V4@LNY$V>}mZ);@9}eGIY1*xh7gLrYnj zi-I-NI=YMP;0kWFm_;mFd-}{jPaE(99h61E*tL*nU)o(5q$H2M?^F@{j!{nXG!1?< z{LE+2tQ|CdN&@yuP(`dBp<&P}Z($HgO*vgmL2%6=eIvBN&ug!W=A$$8nLIh`gTUz) zATJKFc&cIcAd0mqvasiYJqf^3J~$WT*JW=}5cvWInF9sJdR7t#;{pSgRZ!>;3SGL3C{Rl^h*zJ&g5|ahR3G(@+J8|OPM`4{Va-F4R1WV?@Cj|W`WLvz zLGfWkYlEeX!ojpv%wylH8KE?;W>%|yH)!3D%-I~olwVT&P9=2Gt)5N+MXSGMM8WzS z=&P9hP+COBOwtzq#3HdBWV~&#>c)w$`}~Lm)^4;@iuR0l@H4>#1kh7CvQ=O8Bv0}r z@h8v_ydk8*lAJ?$qu?OROEMz?!6g$V>mw^0)Tj-9N9@YFGPGZUfzi=SZPMVP3fdy7 zL{1%w8ToH)ctIkvIX)o>)QfRER4IOP}0`; zRi+$$x{oL)ViDrl4IbZwc?aWgdMb1QQE*5f2$=%^m8yO$+UML6q1DovV(v3%KZ6bh zOd^SdV+BM7vS`uJKiglRHC_4=w_wrxlT<4T0jWuz;dW)*&&Sy|;&Cd$6eksyLn6p} zf?`os_l$P|znl{8!c7L8*zc3NWqX9VcoV2-Ce%YQ3fk~YXUAyZSjzZ!s#!kcl*=Xs zd>0!33yl_|p2JXVcc=QFi6Z`57)zNL&qGyw#?WVyw+KVhvc|ONionGRfN`-Dl#JNs zGxx;-=;jK`ZXb50=*}!iNL#U{BjjhW+`yF8U`7I{!^Xs=as#2~S?Z#o!7w5oPx%1C z;?h=!$k&*=4*@`%=3sH!dC>`@AX?~;g}3L4Ep1tC|E zV9|@$@Q(a@WL*?Gd~I;Zm0>qaOTh;WfelL%BP_c0Nx)2kIKzs}z{zg_Eys2}mbEAh zpT@0NDBf~Ez$HuW5|=l7ikKb}>qh?X>16!hI{PNHpKuGVn=(yAGP)wFix#)pf`1Rus{ z=-kfT*g$6IXb0uDe8!D8#!ue> zttEE}Wwus{2{?Q1ecYBZisgJ1~y4O(GbFKR+Wo4?8%IVZs{lIR81*6-FO2 z3fxnq&_S2|v!$$!=sopI|ImPnrqnJT5w$PG7|sPZCDJc}MzQ-?B8#PN|HW|?y#5kY zfp}L+9X2>M4sn7dr9n$F0t3c8D|)HIHQ=wT%|&3ZRmKxsIqnBu-eiPszbz(Xs`DAv zl1##9ufIhsAJ{Txp?->pTmS2T>7@qY2`lkD6#Do~)%8_G{WTt*kv&8olT|Ms8g(0R z;2;9>n}g%%GZYXWNw8v$>w<303Fw>M0PjA?gf)|g?xGg3ZVc6Y1_!o*Ov#xJfBlQa z0YFTk@B3uMcPfsJDZ==b3&y_(O?P{g-{HQ4Q#5*Oh}*|FEcY5RS&}jGHk_}Q>QYbI zX^VwK#Tb|#*%gW(M!)#%IM3&y)<^AWXGTBqBjCZV6l-Q0-QxE>ry3Od3t)-42`GKolR)*vjD34q4rqF%pgeNQ1`JwBeR~4PW`N~Z__Tev$W^A<^!!f{ zn8!${pp};Kvsx(D2pwV;qQI$NuGRtt5&WdvU7=uF#G2F$4cQ<5LTAEs zS1J&xTVnWy6=upb5kIlr0TBW~Z*C>xoFwZOz0Vr-JOC~G(LgT5=SgoM98Qm6?=+Gt zTAtPiGX44f;MxwN&_oYFDPv2qYu^I1hoH}Yn#tIz5X8eRg9r#1Q#a`^VwPK%%Dt}H z1JS+1%*A%R_WX$ziYn4dO7^Lc^f^A3Ca&4OiS_wX+bHLWO$Hx6YwukgSU|$*%zzCZ z<%xUX-WygxZ4Y&_rJ@LrNo%L{wVy(<>;UB5)3vYyFcHmagz_s(HXt7LFmr8cY!3Va zZ=agVj&>!gRY|?mru>AC9&opFFBI494nE}G(E8-+72>5kCvLb`JU@I}&+40XWf%@n zXx|WOtuWP1WrlMuAxRmbXZxs=T@>ku0DC{IdOOZW6g*4SJ3~#@1}q11@z7YO#$&<^ z+hHBZ!~=in&?Lvf8Ho4>4IBF(=OMyn^~c8k~CSp1b=wJH=@1vgE3Ll1?82SQlxT`v8$-3EXC{4%vw*>Z=6Q-cySTJ1*f5XDjOH_dtsl3ss|))< z1)>-!4x5XV5jjMdes{$S#ype#BG6mGgcxXN*M7O%CgTW}$;wbcA8*BU(K#Qml)$j& zdl2jW3(SV2SVOFt;IDCDE4B4mekkp615+eD4!2~QCwXI zn?Rfj8Wx5hCbnaANY8JBI?}CHP}BiBd$jCmNkuf?=1~(ikunM(60n;*oFvRHI8+T>=&gS8n zx%@0#WvPNW*6g6dx_$#45)NMi)X|G7qTsX{q$lX~g(c*E(b>-co||b_9)JVpzOs7U z7?>#L3~>+^F!U2l+46~?&+q1D0z25e(v+>Yi$)`OE*a%Y2UaX{Jn@% zb7erAkIe5TWg>Sb@O6Du^)`CX+G%AlCtvJI`c_Fhb8G)fKd`hQZPAV3_yNB>lMBA_ zLRa4H21I|r--Z4HZCiojIPgmds11!v=+Vz|->E?)Mo75G5>6}leGL;Yw=*8P$*7A) zQ@KTfl0VquZ%mpkcHFNi4vbg^a%Km?-Xg$k4P3j3iyKEhKu@dNnrz@l|Eq&*37nhq zl7x8I725nRPbRoj3cl{6l3%i>|K)+dUNzN1bB>F+2ttN3FvZt;dKZa2K{sFyr}mxZS=< zZ&956dc~JPCJl?HWM6Z~<0i4?R?ACp*-QAr{4g z#y+?%&A}54NTRm(xP-ArkpOWt42KgY*W2<3_6H=~0PXa15zH*} z5~uFtlW&ETEdv>iN2QMx@pT3J@x}ce55M}(fJd8PW2u));pgiOW(-=C_?$ldPR?6Y zamUi->bq#L-tPTi-^%u+32W(v#M2L#0NW7X0yx~qh;4-%ysMv#`)+TW7YXd%Q?=S% zT+GGLI0^j81&qpxurjQqJ!@%=h6ax10oqb~6_HzCJN-!&_VgWLQ2_o&L|IRcDg*l$ zQ!C+DF+_x&G-QOX^6(sWFYly@^b9h5_GsO4G#39qk$!1e`8mv02Ei)adsyAQ|Aa{w z;CD*8)Sv+rAut2$hKTsfG1OAer~{jW10sYGIo7k%e!W1XOy(C}j-{200P@=(*mvqu z+63d*u@WmQR-pAmNsQo%5nNMkw^l!B`q1 zUN<~04pDkK8@_)o6WDD86TVXs8~sa15XZW|d^dNz6nIGl$Jgm^=E+K*K{Abr@7!OT?mWa}`qxMAA6N>01F73&_y>JP{aOCx zR8l3Y7a2n6Y*lu-;C+n&noG$p79hI(NJb?NYh*gSg9f^CNJoSkk}H`S=no{(ET%ln z%=kt}4+Vj99z1oAwy`EFOX8Ql+0`=y3{GS9q(WKv5!Q5P6jgDGrYn@t1Z8Vbs?rfi z%+fpo`$rftnvsFxL9_a_Axu;%3+aU!NSel#WhbUaVfreh{VvKX;v^;y@#vWvzcgZD zTX6pI=fO#6dJUs2`D6xGLgY?E-`H2m=QxZ23a@1&k{1#F0@9^&hIkkmC)v6yEsAp! zk&eJWB@f{mKbv>MifD)f=%MnC6gLL<1!>u*hZth;*2QaBJfOLR3sjNr#fOrS-e$GE zRNEjSmB7j6?H(fWyDsn{@hgt6PC$^_xlEtmr{jrTl1abuCCxlMIvcqlM-^yskChP~ zo!I?#X4k`x-0fGjjoFlu-CbX%yJ+su`%KS~>5Bhiu!t+h+whqo{MSl?+XOkfAnJf4 z=?S9Jb{m_V1`ZkgT6&5HOjdKAO)x3fcuZO~-eNX}JWvh|of%l*Tpgl>mp?g~w8b3K z`Wjl`)1TQ#Vh%}4$&!*ObQsPH-&sY$J${}zD^0@T+3SlWNyQ?CtgdbRP(WK;t zUpx~EX58i%{FBjWRZh41vp@Sr4+lC=?Eh}_Dx@_qQd|)GS8Q0eclZTUNq#hJ6}aPc zk47w&l07#!&lqYg*q6CSo4$Y5*tDZ(w?6!5X>Qd%{qio%5jN06!L2TiLgV^5JKU+j zxi{o$tDNwnAtJ)0j-^WNeyAs1@&i1EvU$$z^c%AZpXQ0^fB6r2Tx=0|@_PXEOlA(; z*#nE>S)aaK2MJ(Lavb;hq{Hpto$stwxP;5M6Ho&GV`fr6DAXh=GV_H7qoKjH#SdZN zLC{Ke411Y{y8cA^LeC0bFJd2W>kQJH$WNQ@B9#MYK`RzfY!fNn2L^6|2c21Gh&wqd zQwiB|Z@|+jI1v`ka3}Os4+HFlhdp?RM59^qw4P3|GiGazWsrubzqDo__>Epqpff$x zp8Q*!yc~_av&Bq0iM=pOSh#+d(-js!TD4Vnmb>h1S4K!xpPAFiR(E{VA<4CH8 z-!d63EsC6LRf`C=MQk3Djh2bQur+~`FrX!63GsXz&j(gKClk*Ax+-h~+BSK{c;axk zHx2iEAA_&RV3c&bVNvU7+A>6g!+syUfS^iT0ChreE4w1dj!@Vc0f|3sxip6Reb${1 z415HL>{vv+#w1)+z^X`cUv=ovc>8(+=7W zE+-o_x=eXPqZ$`%H_~=(?|ZW5KZJEVw2k_)=DV072YP|qswit3r!i|wb3rbKUU_Ja ziOq4nMN@(n?)Fawc>EBogl!z_#eQ=p`pULdUlK^JiZT;op0mX)Eeodx}%=eNs-L_n8+=WrLr z(6#Q?vOs^PBKOdb3owT=WW=rq6Dj^SEXR@ROct#PPdiPsTKIx=+^$52`}eX$GMU#m zP*Ty%?PMY>CERhZ{i)bPn)(Zdp*+~x#rk^j$s|=8K|HCXveve8os55$Hz9Ic59qzA z=eQj`%aF<;d%+!ltXdt(03N|Iuy4(bXP17moK_wt-Rtp>!es6LCYvJ)_jVugGH1`= zxU}^8=EAyhZ%e*xM>DwFT7jzPiSJ}Vksnc72_Kaw2)3BUf4mAf*o+VV3^Dp2czuqZ zZTJu=5-*$;v;*rK^3#A(Hi{KX8N%NIlKlnf&J2`t94zyB6vYVbtuUaj?^E|Om;c$9?jblHtUoXS@_z(Jue9C;R03nR zEnMGPHMtS``t=GJVwyYP?=GfsKDjjjIiruSSjNB15C3hz`nLbouw%%j@=DpcgAmijJCrYbZ+;N8HCJ&N40K?*uAINL63hwkxJt{BVc|q*a*KDRwD!qWLpVE_ z)~g>F0~(TZ+pbDo71K!o)2$xPLL-ZLJ<8SD~1itqNAvG_Z@UU=}0?%#U3I<%p=ipgNGZC4Cxf31&P z;a)&aXBq&!f)p3wWJF`-+SM_H{x*Cx))fKF7@>|Nd6P!o1sWWL?uw zu8%7Rp@1Uaf&cv4$74?*4ZM-Czj6kEb#T$b0cYls+j?-q2dv}v7L}^qvl(_7Pps&k zpJ%_g@Q)6nhkZ5+Lkq|2(T+8A-I8#TZ9F$nZGe=?Kx&Xdkwmck1NI?f!b~r(B;;Rv0^2Ak4?arR@_^F{mxgAr6zzMo zOntpyV16gBg`Q!9@* zXR-i#{qLc9)&w3vGZxKp(oA2;?>!siW_nL>_{OcVX19&{PFY#swdJj+a9Wmd8wMM; zJtnfl7A9fZw)8Dyp2AR3^?+F2gqAL-;fsHl)JJBhZI0cz%qn2 zBy6qT>oC~1kNVzvyzS*(mg_&X{d3YUF<4{X51(t>m><%>VL!wL11h-$M$e(i8KWQb z(r(4lw?sQQ2egl>p?5dDY2UuE1aZjzo@i2b=v>%!CxyXoSQ{|I!wR^rE8T8qv^I1T zd;J|}3I0;pL}Nd2WjDa%KUE=~pL(!f_YwUO_TodBW%PE>e!CfKxRjy8Mrc}@jP|4* zy+V_%51=*Up`?u061^NPkA*`nVRU%cYJP~7I52eZCQUXV4u&?F!Z3}|<0c}5CEN4H ztOvX_qyUCfH1p&9@m0`%0*a`?%F?BF5_mlN+o+1&+?_Ywzg>KQ?xrop=R zAxhauLn4Y}edx?y$qJZR(oAVJEI|as5+&5o35@7Z-zcbytO+X4AO&`XfI@~vECCFu z7QF2>@S%`&`=mHMR9xc{&6#o48v)>HqsaH$(O1xVzp$3Mi3^Xjm~vfUOK7jpHNr$Q zUKjHN#txDKzJq*ifDm2mXt>|QZM)eiHp1qcC9KIJp8*TOL0ctj3HmZ-Brx^aoyz>sdUB-%G~yU~zhDYo0aee_I3*|6f*c8afqZ zn3-C+t;r4brz68vq$4I(>4lf|X|Ok31)L=movEiMmB6dF^`P5*0DXCzk_?7MAO-Ka9{Sa!W zIW?K&(lVCpO`7@3SjNq@Q60wQN5(q2RJ#xFPL7-f*SVQrxb|$1(>Zqyz-6(*>+TZj zg>>BZqutS(u>G5~+l%rrI4#nc1p_YDMgD+Y+0Ix@MC3NWe5ArQ_lIzO4B$44@I1_( zg_qszxg`&lwjc5M$&kCr64Km8L^i?i_9HYYtB@dalNN&Zg(&0kb;RYJ-}${2FUaN^>R$_#oXNO%2=L%G zUNS^Wv<}84wIr3>KYG#vsqqL)Y<;!Tb+NUmghM_x*3F zR6>PRmT4C%l?qu#REjbQsl>FrONg;W81qm`_DWJ&hJ->*WM5|NvJTm@4#pV!m>FZX zXP)ObpYQL_dFIY@@0@$ieZ9`P=bk&4U{XBuw3H|{2iV&Fg1GMz=!A55IbH4vxP!02 zpsgTlrm1Tteq+oNx1ol^aAcj?$)B*81idh2{`oH~4wJRkzY%Kq#@v;#Y39>L_{YS@ zduNEz(+LsW7}^6<(~Db)d?fzof7Fq0Sg*EBv0@qBc^05y@Mt(o%*Q`jnBz>446#G< zG~^LHhx>@`T75#ZG#$WSV3vIZB3N*~8Xw-_gKW-_|0B|^R=X=wv4_aCZZSL+!UF+w zl_CEG_uj)Iu`pxG5&NHsIOtRx7b1;iA1MV<7~t zT{QZPHu{)_&3i2jZ%N*9BNQjEN_oW!QlG{|i0pjeKUDT}TdJnX;G6q&9yxgrAkTCB z2OHY+r^>(j#Np>$?M;3DA#E2)gTM-W2py{%hak@R50IpVoD+YLzGwE<;p0mGhgE|0 zG1~E81Ty02cChi@R(#w5Qv4J?6wG@6;4yy!a<-0V%894RR0D7zi0_suN{D;`wJfz; zoBkvvj{{5DPeKp+V@@x#GVJ z*Mf#@OeV;E0mfYeR(L4M9j_CfFS6%JF69Yxh!x7aU#4K>lA#t-UlH1k(Cf!wo3-g$!Xr-wQtJTfiva1o zh<`1xbYV4t&v{+7!ymXZYa*#x*!M90)9+22Mo-*^#mnFv*;#1ngw~H0G7Ld69c$Tx zWsH3=AHg91!cM;b!)uYoC^IhDOY^qc?T)R zulFO3^pL7|4Y_F+wrqlG?!$Li5H<}`J%w`LiO&g;kHPPRZ=k+8e1?~XHfxfr+P+UlGKl&f2(nsF=4Hn03o1n}P#y)DsmU=VD(v`@KvV*@8 z+i479cy2D2&?#f0Z*_Mqyf+k0(tq&-d5+`f6%VC}7fdAOnNMAWJ$zS4Jln!6&BgYe zgN_uCngy1#qR;=wVc)(O;*ArCXWw=b_VSbKcwhgKY7jH16Ts@*F$rQBy({n&5Hp?d zWZ!{jkxxV^LJ5!c1*pT3Y{i;7PBC=qIZi`L_{;QVkD~nMLbw<32FFP4Ts7?~?rl$Ib+< zVa2;T<^O>q z8yLr)6+-L#$^C}&xyjg680>0$bPIa$f1gHy)I$C*^mTqYTz;%Y5Kv9rg}4u5O;Q6> zSGxjckY=J!5^KyS^9TrA49p%BLpVMm%`fo?JUBB;5^EN<3~j=_rj-Jm6D*CZL7B-| zFmxG@2#(?~R=5?wpGk!HPqWcF=l5D6mZ$JZH0f8iqta)!6p-|<@aQu5qey{%?@)Y|v@DoRQkY96rOzNz({bj5pR zWyx*(_a#?Xj=%n5YkcjTqy2g2>*(k|I{P*DxSW&UW($+o{5x$_Oole;Qn)ZA2#UTJ zT-1;M`IDHRFMS>os;_G90D?`6=U!v@0!K`F9N`$ zH*)7)Jb{P%5crKEg`>y$=mhS_8}`@sY%hl zQ%w&b!sgR@6gT+b2B6Y(lv-zvw*8@?>vt2#S@S$~P57xScRcv!Q=)G}+Du?IrI}l1 z1g(Y;kniwR*4~A(EcF>iA+L80Fq`M+^8~8j(N~*9$BS`IQz$N=>vFbg8y=m=s*z&g z_i}W0z|en^rNtby8&(uofEcJ3zTF6Ky5{rva3ThO3Ig5Jr|DOPHhXheek00{Uc5t7TGVJmJ4oO6|HMyhIrD$UA zVyWT41f10lnDeQI_QCjVa{kzouP*HSLVeY|)YkMLFmri$pnUqOG88T^ zOey5q!N!;}Rc9|<%A+sXg=k1+L^N@Wg-<#&=s{0_faONM?l=nDrVePsQ2QZL&O3Ph zGdRB-IC*%6RLI-!HL6K^)K}yZ06tw0Z7+roP}w&@x7nv`wX4~17?=H8s1oY4%(LSg z7nM8TJctJ-MYjLJ`*r|%cy#C~{(CE={@H&mm9zx%4&sZ?c_OT&P-P0gcLy+!rbU)| zxS+0&!6BMq(7j@0E{-L+!EkKe@xa*o59udD?Jow8f4fvoRrj~(ua;6@)Ky>7)#^#s z8^bHa6tUSUQhH6D;b0y~iJeEXKT2khi%lQ?M~i{8=`;V)I)9-%U1j}2R%#h}b3gB4 zw>vvTEuQoeZ{?vzJuaUGaw3y|TxXI3)A;KA1(~jR_-KQX7TwjTQSe5_^6q~)>M4ax z(CBpVMMG1$QCD0UkGz%hpIa04ZW}-yt{lwc5ejDzhX7;ESW$!%nE(9gA@M9<;Uhx> zzA1T|ArBnmhPY0IHwXDvag4=Gh zjcDj0*3qEJW=|{rYaw;&57-b~`5s_f0}fr7<%1l@Tu^;x?|b0fy|Mes@C$R(_dtQb znz75!;EX*ozHs>9bJ+4Z@a&}7pP7QAp6QmgWEq0n$OySU7G)UyCc}LHn?oZB%B@u>@30$i}YV+@^J#gEE(ssDQ6i zFU0}0`vpz$Zg(_r>}`phcIPC_{T^zZJ&1ZBst=A3c`4WeRGk6DmQ4(-U)4O05JHgN zNM2hJGL0t+hexJ|B{E48=E)}yd-~3J>CoWXXkG62Wz2IeiD5NYX!zllHo&-dw>X+T z0py3zh8fZl&10}39Fp?G?aLG)Nn&TdxG7B^_OWULraL8?=iyX%OeQ)opQnFQD&y!k zW58W}V|4Xp;ym=znJw{r2du{-t+LjwJZv#Ox=9Xi>~kx%<@bki^w+Xv_}J2iwm9JU z>iC_S_`J|d)lz$uR>N#B#36Ke=b;J;U2=9a6h1En2+xO+_JNUA<=LWG)nU7m?@bYYU9kxrIhNlwg@%5j+d2!U zPwL|rbZZTRTyXa;2B$yM>bu>lA1^*r`4PLfKDy)Ni5XhL^^2ASd*uGq6Oh4;fRxC> zW5u9+G)JGJlQX_l@co0|O4K?V8!)indBC{|h}emEEW84J+QY`HDonJq%rYGJX=*}g z(MF}VOkKqVOtYRcTS4Axdb$yQKBsfzI}fSZjGFXRW)Fr&rKa-Gobe?Y2auZ?%4(W< zwnt?;;7MnM1d-}}F$1LcFF>E8;Z236jFg!Uw2|D_XQ@8EQ-B?(8hSR zsJi15g#(Q6EosP+x@}_Rx&Mv*LL2IDx^U;V-EXWLGD&Ac@9qp+QTSOD|XVY z-*}|Mi;CUAMjF8C_(BV3k)28=Fv_rLlSH$$#PIGC>?jLnlPh!_z!a+Jqh3Ex;m(#e zGd`I=S*mLf+A(pJrS4GTg4E8hf^5Oo*`vw9&Xqr_+9m>2-ms& z)$KZDAB#Yn_!h~6sZ+$ZHF}Uw&+T7kamb-MTO^I_etNNBiek1%$_iZ^8X(}(;%%-o zDF;^~4?y!iII*MyRr#sDpq@o6qXf7Dh5RuH*pcJsAtlxW3)#)N`Mkl#nByinpwo8n z>76xQM|9D6{uJU9^8EAo1$X6+{RW0B4Cf+qE&TN!Qsje`gpU2sl~))csID??h!n%> z_i|t-&um*t<2%-{8ujxy%wkF>!@(P->iCHc^Wtx6Hi}La+1T(2Ccn-)G?8j=Qm?{#cRp8w>TpY&?`S+$=-VA3i6-mY_q>7Ty zGINF0!A>3%IuHRjyxj&>rHK&ftw5^pZO2nB0Y6sXe=(E<@^0LGlc`Ks&Ox!utlP=0 zIxLm1?)=`Iw-p)BVmj)ZjmSHH=o39Wga*0Z_O`)q4YL;iYB|XMI}{hhzwm;!LC`Dh zYQy{nsZ}l!DlcyqT}E%nKzfbz zk>~O60a3l9ivyFgpVuM_+JGejcW9?qK`5Ef#))Z_5G-kQ-$*$d75sNkYwF;=f7k7B zge?FyKw&mbrv?A&CjtDB_Vp(6?DdTkAqNCi-FbCw6q!atzbgp*$Akt&hS07AdUtc( z-6MK~z<$p+r!fbvAqWRacKp8b2cq?P9GU`4GL|+Y`0Q*dY-NxRGL+z9Er-aw6~>*7 z8I&lH+Vz-g;ds#O*^%1e^!cDOui^sbe*Sm|2bxI4ruC2-e2&T4EUCTHV(e~k0QtNi zoc+IZ$>4Xa`zQr2w=z|qk=&`1N>kjKBti6XZHsiD|HbJK&L2QAq9)KmkN9i(I^?Q= z7Vn*F-PL6M{As@enJ{8k4(!p-8rq*jwB@60&kTfbsp8nI!naD7_v$$4q^2u&`?8|< zAwS+WzM67et8(ABlD1Z=?CVO4z&8&|*R<5_N{mUJUEhvt>X>95)AE1G!U+X2QtU#)-gqrVRX@6d+#eH&){P}gvbBb|-m zXJZJDb5U)}4hDQ1QDHWZ|H019$d(nb2S<8h|?As6cV$M*?TOSWjzbyWT@Rf$opS4Ab=J1xtRhi8}k!L;@Ykr^}-S${ec64^&LJ}lS z&znr?qoD@Lk6OmtX2NsC6jk8lFc(rO8$DhcA6L&N4=mV!v`g!EO?c!Q>?Z8rL90lEP*zpCGN z9G{t==RLoB;l6`-0G1?lp-mEGVh%O$ekw>xlewEQSH^$z##iJk&Y0np%nS4n+06)F zK2taoO`leJEC?AaPRX_cSXbCpKG)NLi-VN!56mLXdeMS#UGa-VPAo(2-9u?FsgC$fIij7Wm%F=&L)znAoe38|Fpyh&29Rds5Svm*aV>Pkl^l zSqd9{1#H)FrR9ALvCJu?nOUE_Rlvy&#|?dgLJq^Ramkz-r={P$aCwd0d!cn?M5yHo zMo(no&^MPn`o4BkFRJQbc%og#9D<(_8tNcuc?qjfhNF91yi55E-=XjJ4uVhhb+$Y_ zJhF=SDieOx7J1bpzm1PSfnma55;NVVO^|$OhC&LS2BzKkl)EkwLf}oLRZQ5(+BmGfEVxM+m0V4 zBdabc=HJjO-ZdA#34FMHY|p2+iTW{s_-yCC9CsJi=;Vsb9<4-h@!GXX5UU} z<1_x@Yd=JlUVHYTc6iWl<0(-K(D^CTiqvE;@j%Zk$1#=k%qq=Pe*f{%J1xGOPlANXx4LD-uhJVS=L< z#5*P}9N-FNI62a-ZSBGBbWgm`Z6BBBg4I#`qcwYUyqiC`-s`$kz>By3^ENt7{p#VC zQ5z1bo#U!hqI0~=&cSDBE@Ei+u~(>`L;m%8gx+X&@h0_m`@>J2c%*7hbJWo1dS!z- zQnP17agc2b`o{R|CsARyZzddNvhtg6ZAvFy$E zg@0St440Ve!a@}H{JWkmlU^ZjV)wnJRBse=o7)B1dk*h95wsrKmoh`2R!%GI$75nP zEBVl3XNNj&hE8$xp7?yM=gb*iFbuj?zZn#)&e=AwtHFIgIlsXyk)Bk=+y$s-Xg#!g z#a3pY+m6HRPwAg-d0*@-9@@5UGwa84&~2~a8=0JUQLsgC#2=V{?A?#$JVl2sT2gbj za6+POu**fS;Cq=#b(gM?E?vp{kmB-&M);#d{9@MPm~0$0@}!?P|JndCqbQUOzwB

`p@uEew(W+X#HTv&hYBxUkE$L-$bH_2C4r%0gA< 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

0J=wDvL!%i@0()>KpW6$QQRaCXV=63Vt$KLg7W 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
uBbT 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

m3-_VaV@`&X@x*CkPb`f2ZK`K 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꒛%#lAW7h-Z;&Rv)EgV8_}E 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

TL20`^}nGyS%@&S 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
-ej2<7I11=$78Cw-aTb`Lzo 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

DAR{>%4RKusS%vF#&PiE{G075^{ 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

v~9)g8;Z~i;Rs+V7fAb1MHc;t*M5EHZ>T_* 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

5Oys9o2!^>#;!NNRQVZG2}1^bLovmav3 zLo920!7T+08+?W5S*wAq`aYDekuhIrhl9mN{~TgFKdze(5w3Xwb^wOM{WZADso#(# z)fg*^Isc<&^p77=zwG;cMXR++W>|A)KkSjCsMv0ZD8ZVc;UK%Bsp~N2Y9oj63{})z z$>%IqxzK^dj5y4PrWv@%s@8?Kf+N1dl3yq0YP7?IdFcZ%GVNY5mwRnm
75^g&KeH0bCiI+qg_x!0mFhGU~VS{ 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�C$evnFILylqVIC0PUNr0U-0cv*K-{u{h$1} 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 literal 0 HcmV?d00001 diff --git a/vendor/github.com/multiformats/go-multistream/multistream.go b/vendor/github.com/multiformats/go-multistream/multistream.go index f61b24ea..86d6bc2f 100644 --- a/vendor/github.com/multiformats/go-multistream/multistream.go +++ b/vendor/github.com/multiformats/go-multistream/multistream.go @@ -19,9 +19,15 @@ var ErrTooLarge = errors.New("incoming message was too large") // the multistream muxers on both sides of a channel can work with each other. const ProtocolID = "/multistream/1.0.0" +var writerPool = sync.Pool{ + New: func() interface{} { + return bufio.NewWriter(nil) + }, +} + // HandlerFunc is a user-provided function used by the MultistreamMuxer to // handle a protocol/stream. -type HandlerFunc func(protocol string, rwc io.ReadWriteCloser) error +type HandlerFunc = func(protocol string, rwc io.ReadWriteCloser) error // Handler is a wrapper to HandlerFunc which attaches a name (protocol) and a // match function which can optionally be used to select a handler by other @@ -35,7 +41,7 @@ type Handler struct { // MultistreamMuxer is a muxer for multistream. Depending on the stream // protocol tag it will select the right handler and hand the stream off to it. type MultistreamMuxer struct { - handlerlock sync.Mutex + handlerlock sync.RWMutex handlers []Handler } @@ -55,7 +61,9 @@ func writeUvarint(w io.Writer, i uint64) error { } func delimWriteBuffered(w io.Writer, mes []byte) error { - bw := bufio.NewWriter(w) + bw := getWriter(w) + defer putWriter(bw) + err := delimWrite(bw, mes) if err != nil { return err @@ -123,13 +131,14 @@ func (msm *MultistreamMuxer) AddHandler(protocol string, handler HandlerFunc) { // will be selected even if the handler name and protocol tags are different. func (msm *MultistreamMuxer) AddHandlerWithFunc(protocol string, match func(string) bool, handler HandlerFunc) { msm.handlerlock.Lock() + defer msm.handlerlock.Unlock() + msm.removeHandler(protocol) msm.handlers = append(msm.handlers, Handler{ MatchFunc: match, Handle: handler, AddName: protocol, }) - msm.handlerlock.Unlock() } // RemoveHandler removes the handler with the given name from the muxer. @@ -151,12 +160,14 @@ func (msm *MultistreamMuxer) removeHandler(protocol string) { // Protocols returns the list of handler-names added to this this muxer. func (msm *MultistreamMuxer) Protocols() []string { + msm.handlerlock.RLock() + defer msm.handlerlock.RUnlock() + var out []string - msm.handlerlock.Lock() for _, h := range msm.handlers { out = append(out, h.AddName) } - msm.handlerlock.Unlock() + return out } @@ -165,8 +176,8 @@ func (msm *MultistreamMuxer) Protocols() []string { var ErrIncorrectVersion = errors.New("client connected with incorrect version") func (msm *MultistreamMuxer) findHandler(proto string) *Handler { - msm.handlerlock.Lock() - defer msm.handlerlock.Unlock() + msm.handlerlock.RLock() + defer msm.handlerlock.RUnlock() for _, h := range msm.handlers { if h.MatchFunc(proto) { @@ -181,7 +192,7 @@ func (msm *MultistreamMuxer) findHandler(proto string) *Handler { // a multistream, the protocol used, the handler and an error. It is lazy // because the write-handshake is performed on a subroutine, allowing this // to return before that handshake is completed. -func (msm *MultistreamMuxer) NegotiateLazy(rwc io.ReadWriteCloser) (Multistream, string, HandlerFunc, error) { +func (msm *MultistreamMuxer) NegotiateLazy(rwc io.ReadWriteCloser) (io.ReadWriteCloser, string, HandlerFunc, error) { pval := make(chan string, 1) writeErr := make(chan error, 1) defer close(pval) @@ -324,7 +335,8 @@ loop: // supported protocols to the given Writer. func (msm *MultistreamMuxer) Ls(w io.Writer) error { buf := new(bytes.Buffer) - msm.handlerlock.Lock() + + msm.handlerlock.RLock() err := writeUvarint(buf, uint64(len(msm.handlers))) if err != nil { return err @@ -333,11 +345,12 @@ func (msm *MultistreamMuxer) Ls(w io.Writer) error { for _, h := range msm.handlers { err := delimWrite(buf, []byte(h.AddName)) if err != nil { - msm.handlerlock.Unlock() + msm.handlerlock.RUnlock() return err } } - msm.handlerlock.Unlock() + msm.handlerlock.RUnlock() + ll := make([]byte, 16) nw := binary.PutUvarint(ll, uint64(buf.Len())) @@ -438,3 +451,14 @@ func (br *byteReader) ReadByte() (byte, error) { } return 0, err } + +func getWriter(w io.Writer) *bufio.Writer { + bw := writerPool.Get().(*bufio.Writer) + bw.Reset(w) + return bw +} + +func putWriter(bw *bufio.Writer) { + bw.Reset(nil) + writerPool.Put(bw) +} diff --git a/vendor/github.com/multiformats/go-multistream/multistream_fuzz.go b/vendor/github.com/multiformats/go-multistream/multistream_fuzz.go new file mode 100644 index 00000000..602bbb58 --- /dev/null +++ b/vendor/github.com/multiformats/go-multistream/multistream_fuzz.go @@ -0,0 +1,28 @@ +// +build gofuzz + +package multistream + +import "bytes" + +type rwc struct { + *bytes.Reader +} + +func (*rwc) Write(b []byte) (int, error) { + return len(b), nil +} + +func (*rwc) Close() error { + return nil +} + +func Fuzz(b []byte) int { + readStream := bytes.NewReader(b) + input := &rwc{readStream} + + mux := NewMultistreamMuxer() + mux.AddHandler("/a", nil) + mux.AddHandler("/b", nil) + _ = mux.Handle(input) + return 1 +} diff --git a/vendor/github.com/olekukonko/tablewriter/.gitignore b/vendor/github.com/olekukonko/tablewriter/.gitignore new file mode 100644 index 00000000..b66cec63 --- /dev/null +++ b/vendor/github.com/olekukonko/tablewriter/.gitignore @@ -0,0 +1,15 @@ +# Created by .ignore support plugin (hsz.mobi) +### Go template +# Binaries for programs and plugins +*.exe +*.exe~ +*.dll +*.so +*.dylib + +# Test binary, build with `go test -c` +*.test + +# Output of the go coverage tool, specifically when used with LiteIDE +*.out + diff --git a/vendor/github.com/olekukonko/tablewriter/.travis.yml b/vendor/github.com/olekukonko/tablewriter/.travis.yml new file mode 100644 index 00000000..9c64270e --- /dev/null +++ b/vendor/github.com/olekukonko/tablewriter/.travis.yml @@ -0,0 +1,14 @@ +language: go + +go: + - 1.1 + - 1.2 + - 1.3 + - 1.4 + - 1.5 + - 1.6 + - 1.7 + - 1.8 + - 1.9 + - "1.10" + - tip diff --git a/vendor/github.com/libp2p/go-libp2p-interface-connmgr/LICENSE b/vendor/github.com/olekukonko/tablewriter/LICENSE.md similarity index 94% rename from vendor/github.com/libp2p/go-libp2p-interface-connmgr/LICENSE rename to vendor/github.com/olekukonko/tablewriter/LICENSE.md index 2f06d0eb..a0769b5c 100644 --- a/vendor/github.com/libp2p/go-libp2p-interface-connmgr/LICENSE +++ b/vendor/github.com/olekukonko/tablewriter/LICENSE.md @@ -1,6 +1,4 @@ -The MIT License (MIT) - -Copyright (c) 2017 Jeromy Johnson +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 diff --git a/vendor/github.com/olekukonko/tablewriter/README.md b/vendor/github.com/olekukonko/tablewriter/README.md new file mode 100644 index 00000000..9c2b139b --- /dev/null +++ b/vendor/github.com/olekukonko/tablewriter/README.md @@ -0,0 +1,277 @@ +ASCII Table Writer +========= + +[![Build Status](https://travis-ci.org/olekukonko/tablewriter.png?branch=master)](https://travis-ci.org/olekukonko/tablewriter) +[![Total views](https://img.shields.io/sourcegraph/rrc/github.com/olekukonko/tablewriter.svg)](https://sourcegraph.com/github.com/olekukonko/tablewriter) +[![Godoc](https://godoc.org/github.com/olekukonko/tablewriter?status.svg)](https://godoc.org/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 +- Set custom caption +- Optional reflowing of paragrpahs in multi-line cells. + +#### 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, "testdata/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, "testdata/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 | ++----------+--------------------------+-------+---------+ +``` + + +#### Table with color +```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.SetHeaderColor(tablewriter.Colors{tablewriter.Bold, tablewriter.BgGreenColor}, + tablewriter.Colors{tablewriter.FgHiRedColor, tablewriter.Bold, tablewriter.BgBlackColor}, + tablewriter.Colors{tablewriter.BgRedColor, tablewriter.FgWhiteColor}, + tablewriter.Colors{tablewriter.BgCyanColor, tablewriter.FgWhiteColor}) + +table.SetColumnColor(tablewriter.Colors{tablewriter.Bold, tablewriter.FgHiBlackColor}, + tablewriter.Colors{tablewriter.Bold, tablewriter.FgHiRedColor}, + tablewriter.Colors{tablewriter.Bold, tablewriter.FgHiBlackColor}, + tablewriter.Colors{tablewriter.Bold, tablewriter.FgBlackColor}) + +table.SetFooterColor(tablewriter.Colors{}, tablewriter.Colors{}, + tablewriter.Colors{tablewriter.Bold}, + tablewriter.Colors{tablewriter.FgHiRedColor}) + +table.AppendBulk(data) +table.Render() +``` + +#### Table with color Output +![Table with Color](https://cloud.githubusercontent.com/assets/6460392/21101956/bbc7b356-c0a1-11e6-9f36-dba694746efc.png) + +#### Example 6 - Set table caption +```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"}) +table.SetCaption(true, "Movie ratings.") + +for _, v := range data { + table.Append(v) +} +table.Render() // Send output +``` + +Note: Caption text will wrap with total width of rendered table. + +##### Output 6 +``` ++------+-----------------------+--------+ +| NAME | SIGN | RATING | ++------+-----------------------+--------+ +| A | The Good | 500 | +| B | The Very very Bad Man | 288 | +| C | The Ugly | 120 | +| D | The Gopher | 800 | ++------+-----------------------+--------+ +Movie ratings. +``` + +#### 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 new file mode 100644 index 00000000..98878303 --- /dev/null +++ b/vendor/github.com/olekukonko/tablewriter/csv.go @@ -0,0 +1,52 @@ +// 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 new file mode 100644 index 00000000..dec0385f --- /dev/null +++ b/vendor/github.com/olekukonko/tablewriter/table.go @@ -0,0 +1,839 @@ +// 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{1,3}(?:,\d{3})*|\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 + caption bool + captionText string + autoFmt bool + autoWrap bool + reflowText 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 + headerParams []string + columnsParams []string + footerParams []string + columnsAlign []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{}, + caption: false, + captionText: "Table caption.", + autoFmt: true, + autoWrap: true, + reflowText: 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, + headerParams: []string{}, + columnsParams: []string{}, + footerParams: []string{}, + columnsAlign: []int{}} + 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() + + if t.caption { + t.printCaption() + } +} + +const ( + headerRowIdx = -1 + footerRowIdx = -2 +) + +// Set table header +func (t *Table) SetHeader(keys []string) { + t.colSize = len(keys) + for i, v := range keys { + lines := t.parseDimension(v, i, headerRowIdx) + t.headers = append(t.headers, lines) + } +} + +// Set table Footer +func (t *Table) SetFooter(keys []string) { + //t.colSize = len(keys) + for i, v := range keys { + lines := t.parseDimension(v, i, footerRowIdx) + t.footers = append(t.footers, lines) + } +} + +// Set table Caption +func (t *Table) SetCaption(caption bool, captionText ...string) { + t.caption = caption + if len(captionText) == 1 { + t.captionText = captionText[0] + } +} + +// 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 +} + +// Turn automatic reflowing of multiline text when rewrapping. Default is on (true). +func (t *Table) SetReflowDuringAutoWrap(auto bool) { + t.reflowText = auto +} + +// Set the Default column width +func (t *Table) SetColWidth(width int) { + t.mW = width +} + +// Set the minimal width for a column +func (t *Table) SetColMinWidth(column int, width int) { + t.cs[column] = 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 +} + +func (t *Table) SetColumnAlignment(keys []int) { + for _, v := range keys { + switch v { + case ALIGN_CENTER: + break + case ALIGN_LEFT: + break + case ALIGN_RIGHT: + break + default: + v = ALIGN_DEFAULT + } + t.columnsAlign = append(t.columnsAlign, v) + } +} + +// 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) + } +} + +// NumLines to get the number of lines +func (t *Table) NumLines() int { + return len(t.lines) +} + +// Clear rows +func (t *Table) ClearRows() { + t.lines = [][][]string{} +} + +// Clear footer +func (t *Table) ClearFooter() { + t.footers = [][]string{} +} + +// 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 + } + + // Identify last column + end := len(t.cs) - 1 + + // Get pad function + padFunc := pad(t.hAlign) + + // Checking for ANSI escape sequences for header + is_esc_seq := false + if len(t.headerParams) > 0 { + is_esc_seq = true + } + + // Maximum height. + max := t.rs[headerRowIdx] + + // Print Heading + for x := 0; x < max; x++ { + // Check if border is set + // Replace with space if not set + fmt.Fprint(t.out, ConditionString(t.borders.Left, t.pColumn, SPACE)) + + for y := 0; y <= end; y++ { + v := t.cs[y] + h := "" + if y < len(t.headers) && x < len(t.headers[y]) { + h = t.headers[y][x] + } + if t.autoFmt { + h = Title(h) + } + pad := ConditionString((y == end && !t.borders.Left), SPACE, t.pColumn) + + if is_esc_seq { + fmt.Fprintf(t.out, " %s %s", + format(padFunc(h, SPACE, v), + t.headerParams[y]), pad) + } else { + 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) + } + + // Identify last column + end := len(t.cs) - 1 + + // Get pad function + padFunc := pad(t.fAlign) + + // Checking for ANSI escape sequences for header + is_esc_seq := false + if len(t.footerParams) > 0 { + is_esc_seq = true + } + + // Maximum height. + max := t.rs[footerRowIdx] + + // Print Footer + erasePad := make([]bool, len(t.footers)) + for x := 0; x < max; x++ { + // Check if border is set + // Replace with space if not set + fmt.Fprint(t.out, ConditionString(t.borders.Bottom, t.pColumn, SPACE)) + + for y := 0; y <= end; y++ { + v := t.cs[y] + f := "" + if y < len(t.footers) && x < len(t.footers[y]) { + f = t.footers[y][x] + } + if t.autoFmt { + f = Title(f) + } + pad := ConditionString((y == end && !t.borders.Top), SPACE, t.pColumn) + + if erasePad[y] || (x == 0 && len(f) == 0) { + pad = SPACE + erasePad[y] = true + } + + if is_esc_seq { + fmt.Fprintf(t.out, " %s %s", + format(padFunc(f, SPACE, v), + t.footerParams[y]), pad) + } else { + fmt.Fprintf(t.out, " %s %s", + padFunc(f, SPACE, v), + pad) + } + + //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][0]) + + 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]) != 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) +} + +// Print caption text +func (t Table) printCaption() { + width := t.getTableWidth() + paragraph, _ := WrapString(t.captionText, width) + for linecount := 0; linecount < len(paragraph); linecount++ { + fmt.Fprintln(t.out, paragraph[linecount]) + } +} + +// Calculate the total number of characters in a row +func (t Table) getTableWidth() int { + var chars int + for _, v := range t.cs { + chars += v + } + + // Add chars, spaces, seperators to calculate the total width of the table. + // ncols := t.colSize + // spaces := ncols * 2 + // seps := ncols + 1 + + return (chars + (3 * t.colSize) + 2) +} + +func (t Table) printRows() { + for i, lines := range t.lines { + t.printRow(lines, i) + } +} + +func (t *Table) fillAlignment(num int) { + if len(t.columnsAlign) < num { + t.columnsAlign = make([]int, num) + for i := range t.columnsAlign { + t.columnsAlign[i] = t.align + } + } +} + +// Print Row Information +// Adjust column alignment based on type + +func (t *Table) printRow(columns [][]string, rowIdx int) { + // Get Maximum Height + max := t.rs[rowIdx] + 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{} + + // Checking for ANSI escape sequences for columns + is_esc_seq := false + if len(t.columnsParams) > 0 { + is_esc_seq = true + } + t.fillAlignment(total) + + 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] + + // Embedding escape sequence with column value + if is_esc_seq { + str = format(str, t.columnsParams[y]) + } + + // This would print alignment + // Default alignment would use multiple configuration + switch t.columnsAlign[y] { + 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, rowIdx int, previousLine []string) ([]string, []bool) { + // Get Maximum Height + max := t.rs[rowIdx] + 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 + t.fillAlignment(total) + 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.columnsAlign[y] { + 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 + maxWidth int + ) + + raw = getLines(str) + maxWidth = 0 + for _, line := range raw { + if w := DisplayWidth(line); w > maxWidth { + maxWidth = w + } + } + + // If wrapping, ensure that all paragraphs in the cell fit in the + // specified width. + if t.autoWrap { + // If there's a maximum allowed width for wrapping, use that. + if maxWidth > t.mW { + maxWidth = t.mW + } + + // In the process of doing so, we need to recompute maxWidth. This + // is because perhaps a word in the cell is longer than the + // allowed maximum width in t.mW. + newMaxWidth := maxWidth + newRaw := make([]string, 0, len(raw)) + + if t.reflowText { + // Make a single paragraph of everything. + raw = []string{strings.Join(raw, " ")} + } + for i, para := range raw { + paraLines, _ := WrapString(para, maxWidth) + for _, line := range paraLines { + if w := DisplayWidth(line); w > newMaxWidth { + newMaxWidth = w + } + } + if i > 0 { + newRaw = append(newRaw, " ") + } + newRaw = append(newRaw, paraLines...) + } + raw = newRaw + maxWidth = newMaxWidth + } + + // Store the new known maximum width. + v, ok := t.cs[colKey] + if !ok || v < maxWidth || v == 0 { + t.cs[colKey] = maxWidth + } + + // Remember the number of lines for the row printer. + 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/table_with_color.go b/vendor/github.com/olekukonko/tablewriter/table_with_color.go new file mode 100644 index 00000000..5a4a53ec --- /dev/null +++ b/vendor/github.com/olekukonko/tablewriter/table_with_color.go @@ -0,0 +1,134 @@ +package tablewriter + +import ( + "fmt" + "strconv" + "strings" +) + +const ESC = "\033" +const SEP = ";" + +const ( + BgBlackColor int = iota + 40 + BgRedColor + BgGreenColor + BgYellowColor + BgBlueColor + BgMagentaColor + BgCyanColor + BgWhiteColor +) + +const ( + FgBlackColor int = iota + 30 + FgRedColor + FgGreenColor + FgYellowColor + FgBlueColor + FgMagentaColor + FgCyanColor + FgWhiteColor +) + +const ( + BgHiBlackColor int = iota + 100 + BgHiRedColor + BgHiGreenColor + BgHiYellowColor + BgHiBlueColor + BgHiMagentaColor + BgHiCyanColor + BgHiWhiteColor +) + +const ( + FgHiBlackColor int = iota + 90 + FgHiRedColor + FgHiGreenColor + FgHiYellowColor + FgHiBlueColor + FgHiMagentaColor + FgHiCyanColor + FgHiWhiteColor +) + +const ( + Normal = 0 + Bold = 1 + UnderlineSingle = 4 + Italic +) + +type Colors []int + +func startFormat(seq string) string { + return fmt.Sprintf("%s[%sm", ESC, seq) +} + +func stopFormat() string { + return fmt.Sprintf("%s[%dm", ESC, Normal) +} + +// Making the SGR (Select Graphic Rendition) sequence. +func makeSequence(codes []int) string { + codesInString := []string{} + for _, code := range codes { + codesInString = append(codesInString, strconv.Itoa(code)) + } + return strings.Join(codesInString, SEP) +} + +// Adding ANSI escape sequences before and after string +func format(s string, codes interface{}) string { + var seq string + + switch v := codes.(type) { + + case string: + seq = v + case []int: + seq = makeSequence(v) + default: + return s + } + + if len(seq) == 0 { + return s + } + return startFormat(seq) + s + stopFormat() +} + +// Adding header colors (ANSI codes) +func (t *Table) SetHeaderColor(colors ...Colors) { + if t.colSize != len(colors) { + panic("Number of header colors must be equal to number of headers.") + } + for i := 0; i < len(colors); i++ { + t.headerParams = append(t.headerParams, makeSequence(colors[i])) + } +} + +// Adding column colors (ANSI codes) +func (t *Table) SetColumnColor(colors ...Colors) { + if t.colSize != len(colors) { + panic("Number of column colors must be equal to number of headers.") + } + for i := 0; i < len(colors); i++ { + t.columnsParams = append(t.columnsParams, makeSequence(colors[i])) + } +} + +// Adding column colors (ANSI codes) +func (t *Table) SetFooterColor(colors ...Colors) { + if len(t.footers) != len(colors) { + panic("Number of footer colors must be equal to number of footer.") + } + for i := 0; i < len(colors); i++ { + t.footerParams = append(t.footerParams, makeSequence(colors[i])) + } +} + +func Color(colors ...int) []int { + return colors +} diff --git a/vendor/github.com/olekukonko/tablewriter/util.go b/vendor/github.com/olekukonko/tablewriter/util.go new file mode 100644 index 00000000..9e8f0cbb --- /dev/null +++ b/vendor/github.com/olekukonko/tablewriter/util.go @@ -0,0 +1,93 @@ +// 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 +} + +func isNumOrSpace(r rune) bool { + return ('0' <= r && r <= '9') || r == ' ' +} + +// Format Table Header +// Replace _ , . and spaces +func Title(name string) string { + origLen := len(name) + rs := []rune(name) + for i, r := range rs { + switch r { + case '_': + rs[i] = ' ' + case '.': + // ignore floating number 0.0 + if (i != 0 && !isNumOrSpace(rs[i-1])) || (i != len(rs)-1 && !isNumOrSpace(rs[i+1])) { + rs[i] = ' ' + } + } + } + name = string(rs) + name = strings.TrimSpace(name) + if len(name) == 0 && origLen > 0 { + // Keep at least one character. This is important to preserve + // empty lines in multi-line headers/footers. + 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 new file mode 100644 index 00000000..a092ee1f --- /dev/null +++ b/vendor/github.com/olekukonko/tablewriter/wrap.go @@ -0,0 +1,99 @@ +// 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" + + "github.com/mattn/go-runewidth" +) + +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 = runewidth.StringWidth(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] = runewidth.StringWidth(words[i]) + for j := i + 1; j < n; j++ { + length[i][j] = length[i][j-1] + spc + runewidth.StringWidth(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 { + return strings.Split(s, nl) +} diff --git a/vendor/github.com/pelletier/go-toml/.dockerignore b/vendor/github.com/pelletier/go-toml/.dockerignore new file mode 100644 index 00000000..7b588347 --- /dev/null +++ b/vendor/github.com/pelletier/go-toml/.dockerignore @@ -0,0 +1,2 @@ +cmd/tomll/tomll +cmd/tomljson/tomljson diff --git a/vendor/github.com/pelletier/go-toml/.gitignore b/vendor/github.com/pelletier/go-toml/.gitignore index 99e38bbc..e6ba63a5 100644 --- a/vendor/github.com/pelletier/go-toml/.gitignore +++ b/vendor/github.com/pelletier/go-toml/.gitignore @@ -1,2 +1,5 @@ test_program/test_program_bin fuzz/ +cmd/tomll/tomll +cmd/tomljson/tomljson +cmd/tomltestgen/tomltestgen diff --git a/vendor/github.com/pelletier/go-toml/Dockerfile b/vendor/github.com/pelletier/go-toml/Dockerfile new file mode 100644 index 00000000..8f439d47 --- /dev/null +++ b/vendor/github.com/pelletier/go-toml/Dockerfile @@ -0,0 +1,10 @@ +FROM golang:1.12-alpine3.9 as builder +WORKDIR /go/src/github.com/pelletier/go-toml +COPY . . +ENV CGO_ENABLED=0 +ENV GOOS=linux +RUN go install ./... + +FROM scratch +COPY --from=builder /go/bin/tomll /usr/bin/tomll +COPY --from=builder /go/bin/tomljson /usr/bin/tomljson diff --git a/vendor/github.com/pelletier/go-toml/README.md b/vendor/github.com/pelletier/go-toml/README.md index 031a27a8..f0311b99 100644 --- a/vendor/github.com/pelletier/go-toml/README.md +++ b/vendor/github.com/pelletier/go-toml/README.md @@ -101,6 +101,23 @@ Go-toml provides two handy command line tools: tomljson --help ``` +### Docker image + +Those tools are also availble as a Docker image from +[dockerhub](https://hub.docker.com/r/pelletier/go-toml). For example, to +use `tomljson`: + +``` +docker run -v $PWD:/workdir pelletier/go-toml tomljson /workdir/example.toml +``` + +Only master (`latest`) and tagged versions are published to dockerhub. You +can build your own image as usual: + +``` +docker build -t go-toml . +``` + ## Contribute Feel free to report bugs and patches using GitHub's pull requests system on diff --git a/vendor/github.com/pelletier/go-toml/marshal.go b/vendor/github.com/pelletier/go-toml/marshal.go index 95c77bc7..0e1c57e8 100644 --- a/vendor/github.com/pelletier/go-toml/marshal.go +++ b/vendor/github.com/pelletier/go-toml/marshal.go @@ -6,6 +6,7 @@ import ( "fmt" "io" "reflect" + "sort" "strconv" "strings" "time" @@ -329,7 +330,26 @@ func (e *Encoder) valueToTree(mtype reflect.Type, mval reflect.Value) (*Tree, er } } case reflect.Map: - for _, key := range mval.MapKeys() { + keys := mval.MapKeys() + if e.order == OrderPreserve && len(keys) > 0 { + // Sorting []reflect.Value is not straight forward. + // + // OrderPreserve will support deterministic results when string is used + // as the key to maps. + typ := keys[0].Type() + kind := keys[0].Kind() + if kind == reflect.String { + ikeys := make([]string, len(keys)) + for i := range keys { + ikeys[i] = keys[i].Interface().(string) + } + sort.Strings(ikeys) + for i := range ikeys { + keys[i] = reflect.ValueOf(ikeys[i]).Convert(typ) + } + } + } + for _, key := range keys { mvalf := mval.MapIndex(key) val, err := e.valueToToml(mtype.Elem(), mvalf) if err != nil { @@ -494,11 +514,19 @@ func (d *Decoder) SetTagName(v string) *Decoder { func (d *Decoder) unmarshal(v interface{}) error { mtype := reflect.TypeOf(v) - if mtype.Kind() != reflect.Ptr || mtype.Elem().Kind() != reflect.Struct { - return errors.New("Only a pointer to struct can be unmarshaled from TOML") + if mtype.Kind() != reflect.Ptr { + return errors.New("only a pointer to struct or map can be unmarshaled from TOML") + } + + elem := mtype.Elem() + + switch elem.Kind() { + case reflect.Struct, reflect.Map: + default: + return errors.New("only a pointer to struct or map can be unmarshaled from TOML") } - sval, err := d.valueFromTree(mtype.Elem(), d.tval) + sval, err := d.valueFromTree(elem, d.tval) if err != nil { return err } @@ -546,8 +574,8 @@ func (d *Decoder) valueFromTree(mtype reflect.Type, tval *Tree) (reflect.Value, if !found && opts.defaultValue != "" { mvalf := mval.Field(i) - var val interface{} = nil - var err error = nil + var val interface{} + var err error switch mvalf.Kind() { case reflect.Bool: val, err = strconv.ParseBool(opts.defaultValue) @@ -587,7 +615,7 @@ func (d *Decoder) valueFromTree(mtype reflect.Type, tval *Tree) (reflect.Value, if err != nil { return mval, formatError(err, tval.GetPosition(key)) } - mval.SetMapIndex(reflect.ValueOf(key), mvalf) + mval.SetMapIndex(reflect.ValueOf(key).Convert(mtype.Key()), mvalf) } } return mval, nil diff --git a/vendor/github.com/pelletier/go-toml/marshal_OrderPreserve_Map_test.toml b/vendor/github.com/pelletier/go-toml/marshal_OrderPreserve_Map_test.toml new file mode 100644 index 00000000..a3bd5130 --- /dev/null +++ b/vendor/github.com/pelletier/go-toml/marshal_OrderPreserve_Map_test.toml @@ -0,0 +1,17 @@ +title = "TOML Marshal Testing" + +[basic_map] + one = "one" + two = "two" + +[long_map] + a7 = "1" + b3 = "2" + c8 = "3" + d4 = "4" + e6 = "5" + f5 = "6" + g10 = "7" + h1 = "8" + i2 = "9" + j9 = "10" diff --git a/vendor/github.com/pelletier/go-toml/toml.go b/vendor/github.com/pelletier/go-toml/toml.go index a5f2bfcd..358a9be5 100644 --- a/vendor/github.com/pelletier/go-toml/toml.go +++ b/vendor/github.com/pelletier/go-toml/toml.go @@ -275,7 +275,7 @@ func (t *Tree) Delete(key string) error { return t.DeletePath(keys) } -// Delete removes a key from the tree. +// DeletePath removes a key from the tree. // Keys is an array of path elements (e.g. {"a","b","c"}). func (t *Tree) DeletePath(keys []string) error { keyLen := len(keys) diff --git a/vendor/github.com/pelletier/go-toml/tomltree_write.go b/vendor/github.com/pelletier/go-toml/tomltree_write.go index 6acd4f77..198d5ac1 100644 --- a/vendor/github.com/pelletier/go-toml/tomltree_write.go +++ b/vendor/github.com/pelletier/go-toml/tomltree_write.go @@ -259,7 +259,7 @@ func (t *Tree) writeTo(w io.Writer, indent, keyspace string, bytesCount int64, a } func (t *Tree) writeToOrdered(w io.Writer, indent, keyspace string, bytesCount int64, arraysOneElementPerLine bool, ord marshalOrder) (int64, error) { - orderedVals := make([]sortNode, 0) + var orderedVals []sortNode switch ord { case OrderPreserve: diff --git a/vendor/github.com/prometheus/tsdb/LICENSE b/vendor/github.com/prometheus/tsdb/LICENSE new file mode 100644 index 00000000..261eeb9e --- /dev/null +++ b/vendor/github.com/prometheus/tsdb/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/prometheus/tsdb/fileutil/dir_unix.go b/vendor/github.com/prometheus/tsdb/fileutil/dir_unix.go new file mode 100644 index 00000000..58a77dfc --- /dev/null +++ b/vendor/github.com/prometheus/tsdb/fileutil/dir_unix.go @@ -0,0 +1,22 @@ +// Copyright 2016 The etcd 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 !windows + +package fileutil + +import "os" + +// OpenDir opens a directory for syncing. +func OpenDir(path string) (*os.File, error) { return os.Open(path) } diff --git a/vendor/github.com/prometheus/tsdb/fileutil/dir_windows.go b/vendor/github.com/prometheus/tsdb/fileutil/dir_windows.go new file mode 100644 index 00000000..c123395c --- /dev/null +++ b/vendor/github.com/prometheus/tsdb/fileutil/dir_windows.go @@ -0,0 +1,46 @@ +// Copyright 2016 The etcd 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 windows + +package fileutil + +import ( + "os" + "syscall" +) + +// OpenDir opens a directory in windows with write access for syncing. +func OpenDir(path string) (*os.File, error) { + fd, err := openDir(path) + if err != nil { + return nil, err + } + return os.NewFile(uintptr(fd), path), nil +} + +func openDir(path string) (fd syscall.Handle, err error) { + if len(path) == 0 { + return syscall.InvalidHandle, syscall.ERROR_FILE_NOT_FOUND + } + pathp, err := syscall.UTF16PtrFromString(path) + if err != nil { + return syscall.InvalidHandle, err + } + access := uint32(syscall.GENERIC_READ | syscall.GENERIC_WRITE) + sharemode := uint32(syscall.FILE_SHARE_READ | syscall.FILE_SHARE_WRITE) + createmode := uint32(syscall.OPEN_EXISTING) + fl := uint32(syscall.FILE_FLAG_BACKUP_SEMANTICS) + return syscall.CreateFile(pathp, access, sharemode, nil, createmode, fl, 0) +} diff --git a/vendor/github.com/prometheus/tsdb/fileutil/fileutil.go b/vendor/github.com/prometheus/tsdb/fileutil/fileutil.go new file mode 100644 index 00000000..c55a2b81 --- /dev/null +++ b/vendor/github.com/prometheus/tsdb/fileutil/fileutil.go @@ -0,0 +1,149 @@ +// Copyright 2018 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 fileutil provides utility methods used when dealing with the filesystem in tsdb. +// It is largely copied from github.com/coreos/etcd/pkg/fileutil to avoid the +// dependency chain it brings with it. +// Please check github.com/coreos/etcd for licensing information. +package fileutil + +import ( + "io/ioutil" + "os" + "path/filepath" + "sort" + "strings" +) + +// CopyDirs copies all directories, subdirectories and files recursively including the empty folders. +// Source and destination must be full paths. +func CopyDirs(src, dest string) error { + if err := os.MkdirAll(dest, 0777); err != nil { + return err + } + files, err := readDirs(src) + if err != nil { + return err + } + + for _, f := range files { + dp := filepath.Join(dest, f) + sp := filepath.Join(src, f) + + stat, err := os.Stat(sp) + if err != nil { + return err + } + + // Empty directories are also created. + if stat.IsDir() { + if err := os.MkdirAll(dp, 0777); err != nil { + return err + } + continue + } + + if err := copyFile(sp, dp); err != nil { + return err + } + } + return nil +} + +func copyFile(src, dest string) error { + data, err := ioutil.ReadFile(src) + if err != nil { + return err + } + + err = ioutil.WriteFile(dest, data, 0644) + if err != nil { + return err + } + return nil +} + +// readDirs reads the source directory recursively and +// returns relative paths to all files and empty directories. +func readDirs(src string) ([]string, error) { + var files []string + + err := filepath.Walk(src, func(path string, f os.FileInfo, err error) error { + relativePath := strings.TrimPrefix(path, src) + if len(relativePath) > 0 { + files = append(files, relativePath) + } + return nil + }) + if err != nil { + return nil, err + } + return files, nil +} + +// ReadDir returns the filenames in the given directory in sorted order. +func ReadDir(dirpath string) ([]string, error) { + dir, err := os.Open(dirpath) + if err != nil { + return nil, err + } + defer dir.Close() + names, err := dir.Readdirnames(-1) + if err != nil { + return nil, err + } + sort.Strings(names) + return names, nil +} + +// Rename safely renames a file. +func Rename(from, to string) error { + if err := os.Rename(from, to); err != nil { + return err + } + + // Directory was renamed; sync parent dir to persist rename. + pdir, err := OpenDir(filepath.Dir(to)) + if err != nil { + return err + } + + if err = pdir.Sync(); err != nil { + pdir.Close() + return err + } + return pdir.Close() +} + +// Replace moves a file or directory to a new location and deletes any previous data. +// It is not atomic. +func Replace(from, to string) error { + if err := os.RemoveAll(to); err != nil { + return err + } + if err := os.Rename(from, to); err != nil { + return err + } + + // Directory was renamed; sync parent dir to persist rename. + pdir, err := OpenDir(filepath.Dir(to)) + if err != nil { + return err + } + + if err = pdir.Sync(); err != nil { + pdir.Close() + return err + } + return pdir.Close() +} diff --git a/vendor/github.com/prometheus/tsdb/fileutil/flock.go b/vendor/github.com/prometheus/tsdb/fileutil/flock.go new file mode 100644 index 00000000..d5eaa7ca --- /dev/null +++ b/vendor/github.com/prometheus/tsdb/fileutil/flock.go @@ -0,0 +1,41 @@ +// 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 fileutil + +import ( + "os" + "path/filepath" +) + +// Releaser provides the Release method to release a file lock. +type Releaser interface { + Release() error +} + +// Flock 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 Flock(fileName string) (r Releaser, existed bool, err error) { + if err = os.MkdirAll(filepath.Dir(fileName), 0755); err != nil { + return nil, false, err + } + + _, err = os.Stat(fileName) + existed = err == nil + + r, err = newLock(fileName) + return r, existed, err +} diff --git a/vendor/github.com/prometheus/tsdb/fileutil/flock_plan9.go b/vendor/github.com/prometheus/tsdb/fileutil/flock_plan9.go new file mode 100644 index 00000000..8a3d44c5 --- /dev/null +++ b/vendor/github.com/prometheus/tsdb/fileutil/flock_plan9.go @@ -0,0 +1,32 @@ +// Copyright 2016 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package fileutil + +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/tsdb/fileutil/flock_solaris.go b/vendor/github.com/prometheus/tsdb/fileutil/flock_solaris.go new file mode 100644 index 00000000..7f527ae6 --- /dev/null +++ b/vendor/github.com/prometheus/tsdb/fileutil/flock_solaris.go @@ -0,0 +1,59 @@ +// Copyright 2016 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// +build solaris + +package fileutil + +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/tsdb/fileutil/flock_unix.go b/vendor/github.com/prometheus/tsdb/fileutil/flock_unix.go new file mode 100644 index 00000000..f493fbd8 --- /dev/null +++ b/vendor/github.com/prometheus/tsdb/fileutil/flock_unix.go @@ -0,0 +1,54 @@ +// Copyright 2016 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// +build darwin dragonfly freebsd linux netbsd openbsd + +package fileutil + +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/tsdb/fileutil/flock_windows.go b/vendor/github.com/prometheus/tsdb/fileutil/flock_windows.go new file mode 100644 index 00000000..1c17ff4e --- /dev/null +++ b/vendor/github.com/prometheus/tsdb/fileutil/flock_windows.go @@ -0,0 +1,36 @@ +// Copyright 2016 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package fileutil + +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/prometheus/tsdb/fileutil/mmap.go b/vendor/github.com/prometheus/tsdb/fileutil/mmap.go new file mode 100644 index 00000000..26fc80c5 --- /dev/null +++ b/vendor/github.com/prometheus/tsdb/fileutil/mmap.go @@ -0,0 +1,61 @@ +// Copyright 2018 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 fileutil + +import ( + "os" + + "github.com/pkg/errors" +) + +type MmapFile struct { + f *os.File + b []byte +} + +func OpenMmapFile(path string) (*MmapFile, error) { + f, err := os.Open(path) + if err != nil { + return nil, errors.Wrap(err, "try lock file") + } + info, err := f.Stat() + if err != nil { + return nil, errors.Wrap(err, "stat") + } + + b, err := mmap(f, int(info.Size())) + if err != nil { + return nil, errors.Wrap(err, "mmap") + } + + return &MmapFile{f: f, b: b}, nil +} + +func (f *MmapFile) Close() error { + err0 := munmap(f.b) + err1 := f.f.Close() + + if err0 != nil { + return err0 + } + return err1 +} + +func (f *MmapFile) File() *os.File { + return f.f +} + +func (f *MmapFile) Bytes() []byte { + return f.b +} diff --git a/vendor/github.com/prometheus/tsdb/fileutil/mmap_386.go b/vendor/github.com/prometheus/tsdb/fileutil/mmap_386.go new file mode 100644 index 00000000..66b9d368 --- /dev/null +++ b/vendor/github.com/prometheus/tsdb/fileutil/mmap_386.go @@ -0,0 +1,18 @@ +// Copyright 2018 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 windows + +package fileutil + +const maxMapSize = 0x7FFFFFFF // 2GB diff --git a/vendor/github.com/prometheus/tsdb/fileutil/mmap_amd64.go b/vendor/github.com/prometheus/tsdb/fileutil/mmap_amd64.go new file mode 100644 index 00000000..4b523bc6 --- /dev/null +++ b/vendor/github.com/prometheus/tsdb/fileutil/mmap_amd64.go @@ -0,0 +1,18 @@ +// Copyright 2018 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 windows + +package fileutil + +const maxMapSize = 0xFFFFFFFFFFFF // 256TB diff --git a/vendor/github.com/prometheus/tsdb/fileutil/mmap_unix.go b/vendor/github.com/prometheus/tsdb/fileutil/mmap_unix.go new file mode 100644 index 00000000..043f4d40 --- /dev/null +++ b/vendor/github.com/prometheus/tsdb/fileutil/mmap_unix.go @@ -0,0 +1,30 @@ +// Copyright 2017 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 !windows,!plan9 + +package fileutil + +import ( + "os" + + "golang.org/x/sys/unix" +) + +func mmap(f *os.File, length int) ([]byte, error) { + return unix.Mmap(int(f.Fd()), 0, length, unix.PROT_READ, unix.MAP_SHARED) +} + +func munmap(b []byte) (err error) { + return unix.Munmap(b) +} diff --git a/vendor/github.com/prometheus/tsdb/fileutil/mmap_windows.go b/vendor/github.com/prometheus/tsdb/fileutil/mmap_windows.go new file mode 100644 index 00000000..b9422641 --- /dev/null +++ b/vendor/github.com/prometheus/tsdb/fileutil/mmap_windows.go @@ -0,0 +1,46 @@ +// Copyright 2017 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 fileutil + +import ( + "os" + "syscall" + "unsafe" +) + +func mmap(f *os.File, size int) ([]byte, error) { + low, high := uint32(size), uint32(size>>32) + h, errno := syscall.CreateFileMapping(syscall.Handle(f.Fd()), nil, syscall.PAGE_READONLY, high, low, nil) + if h == 0 { + return nil, os.NewSyscallError("CreateFileMapping", errno) + } + + addr, errno := syscall.MapViewOfFile(h, syscall.FILE_MAP_READ, 0, 0, uintptr(size)) + if addr == 0 { + return nil, os.NewSyscallError("MapViewOfFile", errno) + } + + if err := syscall.CloseHandle(syscall.Handle(h)); err != nil { + return nil, os.NewSyscallError("CloseHandle", err) + } + + return (*[maxMapSize]byte)(unsafe.Pointer(addr))[:size], nil +} + +func munmap(b []byte) error { + if err := syscall.UnmapViewOfFile((uintptr)(unsafe.Pointer(&b[0]))); err != nil { + return os.NewSyscallError("UnmapViewOfFile", err) + } + return nil +} diff --git a/vendor/github.com/prometheus/tsdb/fileutil/preallocate.go b/vendor/github.com/prometheus/tsdb/fileutil/preallocate.go new file mode 100644 index 00000000..c747b7cf --- /dev/null +++ b/vendor/github.com/prometheus/tsdb/fileutil/preallocate.go @@ -0,0 +1,54 @@ +// Copyright 2015 The etcd 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 fileutil + +import ( + "io" + "os" +) + +// Preallocate tries to allocate the space for given +// file. This operation is only supported on linux by a +// few filesystems (btrfs, ext4, etc.). +// If the operation is unsupported, no error will be returned. +// Otherwise, the error encountered will be returned. +func Preallocate(f *os.File, sizeInBytes int64, extendFile bool) error { + if sizeInBytes == 0 { + // fallocate will return EINVAL if length is 0; skip + return nil + } + if extendFile { + return preallocExtend(f, sizeInBytes) + } + return preallocFixed(f, sizeInBytes) +} + +func preallocExtendTrunc(f *os.File, sizeInBytes int64) error { + curOff, err := f.Seek(0, io.SeekCurrent) + if err != nil { + return err + } + size, err := f.Seek(sizeInBytes, io.SeekEnd) + if err != nil { + return err + } + if _, err = f.Seek(curOff, io.SeekStart); err != nil { + return err + } + if sizeInBytes > size { + return nil + } + return f.Truncate(sizeInBytes) +} diff --git a/vendor/github.com/prometheus/tsdb/fileutil/preallocate_darwin.go b/vendor/github.com/prometheus/tsdb/fileutil/preallocate_darwin.go new file mode 100644 index 00000000..c9fa1a6c --- /dev/null +++ b/vendor/github.com/prometheus/tsdb/fileutil/preallocate_darwin.go @@ -0,0 +1,41 @@ +// Copyright 2015 The etcd 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 fileutil + +import ( + "os" + "syscall" + "unsafe" +) + +func preallocExtend(f *os.File, sizeInBytes int64) error { + if err := preallocFixed(f, sizeInBytes); err != nil { + return err + } + return preallocExtendTrunc(f, sizeInBytes) +} + +func preallocFixed(f *os.File, sizeInBytes int64) error { + fstore := &syscall.Fstore_t{ + Flags: syscall.F_ALLOCATEALL, + Posmode: syscall.F_PEOFPOSMODE, + Length: sizeInBytes} + p := unsafe.Pointer(fstore) + _, _, errno := syscall.Syscall(syscall.SYS_FCNTL, f.Fd(), uintptr(syscall.F_PREALLOCATE), uintptr(p)) + if errno == 0 || errno == syscall.ENOTSUP { + return nil + } + return errno +} diff --git a/vendor/github.com/prometheus/tsdb/fileutil/preallocate_linux.go b/vendor/github.com/prometheus/tsdb/fileutil/preallocate_linux.go new file mode 100644 index 00000000..ada04622 --- /dev/null +++ b/vendor/github.com/prometheus/tsdb/fileutil/preallocate_linux.go @@ -0,0 +1,47 @@ +// Copyright 2015 The etcd 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 fileutil + +import ( + "os" + "syscall" +) + +func preallocExtend(f *os.File, sizeInBytes int64) error { + // use mode = 0 to change size + err := syscall.Fallocate(int(f.Fd()), 0, 0, sizeInBytes) + if err != nil { + errno, ok := err.(syscall.Errno) + // not supported; fallback + // fallocate EINTRs frequently in some environments; fallback + if ok && (errno == syscall.ENOTSUP || errno == syscall.EINTR) { + return preallocExtendTrunc(f, sizeInBytes) + } + } + return err +} + +func preallocFixed(f *os.File, sizeInBytes int64) error { + // use mode = 1 to keep size; see FALLOC_FL_KEEP_SIZE + err := syscall.Fallocate(int(f.Fd()), 1, 0, sizeInBytes) + if err != nil { + errno, ok := err.(syscall.Errno) + // treat not supported as nil error + if ok && errno == syscall.ENOTSUP { + return nil + } + } + return err +} diff --git a/vendor/github.com/prometheus/tsdb/fileutil/preallocate_other.go b/vendor/github.com/prometheus/tsdb/fileutil/preallocate_other.go new file mode 100644 index 00000000..162fbc5f --- /dev/null +++ b/vendor/github.com/prometheus/tsdb/fileutil/preallocate_other.go @@ -0,0 +1,25 @@ +// Copyright 2015 The etcd 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 !linux,!darwin + +package fileutil + +import "os" + +func preallocExtend(f *os.File, sizeInBytes int64) error { + return preallocExtendTrunc(f, sizeInBytes) +} + +func preallocFixed(f *os.File, sizeInBytes int64) error { return nil } diff --git a/vendor/github.com/prometheus/tsdb/fileutil/sync.go b/vendor/github.com/prometheus/tsdb/fileutil/sync.go new file mode 100644 index 00000000..2e64a408 --- /dev/null +++ b/vendor/github.com/prometheus/tsdb/fileutil/sync.go @@ -0,0 +1,24 @@ +// Copyright 2016 The etcd 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 !linux,!darwin + +package fileutil + +import "os" + +// Fdatasync is a wrapper around file.Sync(). Special handling is needed on linux platform. +func Fdatasync(f *os.File) error { + return f.Sync() +} diff --git a/vendor/github.com/prometheus/tsdb/fileutil/sync_darwin.go b/vendor/github.com/prometheus/tsdb/fileutil/sync_darwin.go new file mode 100644 index 00000000..2af1b0f4 --- /dev/null +++ b/vendor/github.com/prometheus/tsdb/fileutil/sync_darwin.go @@ -0,0 +1,27 @@ +// Copyright 2016 The etcd 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 + +package fileutil + +import ( + "os" +) + +// Fdatasync on darwin platform invokes fcntl(F_FULLFSYNC) for actual persistence +// on physical drive media. +func Fdatasync(f *os.File) error { + return f.Sync() +} diff --git a/vendor/github.com/prometheus/tsdb/fileutil/sync_linux.go b/vendor/github.com/prometheus/tsdb/fileutil/sync_linux.go new file mode 100644 index 00000000..8b4fc826 --- /dev/null +++ b/vendor/github.com/prometheus/tsdb/fileutil/sync_linux.go @@ -0,0 +1,29 @@ +// Copyright 2016 The etcd 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 linux + +package fileutil + +import ( + "os" + "syscall" +) + +// Fdatasync is similar to fsync(), but does not flush modified metadata +// unless that metadata is needed in order to allow a subsequent data retrieval +// to be correctly handled. +func Fdatasync(f *os.File) error { + return syscall.Fdatasync(int(f.Fd())) +} diff --git a/vendor/github.com/rs/cors/.travis.yml b/vendor/github.com/rs/cors/.travis.yml index bbb5185a..17e5e50d 100644 --- a/vendor/github.com/rs/cors/.travis.yml +++ b/vendor/github.com/rs/cors/.travis.yml @@ -1,4 +1,8 @@ language: go go: -- 1.3 -- 1.4 +- 1.9 +- "1.10" +- tip +matrix: + allow_failures: + - go: tip diff --git a/vendor/github.com/rs/cors/README.md b/vendor/github.com/rs/cors/README.md index 4bf56724..ecc83b29 100644 --- a/vendor/github.com/rs/cors/README.md +++ b/vendor/github.com/rs/cors/README.md @@ -49,6 +49,14 @@ The server now runs on `localhost:8080`: {"hello": "world"} +### Allow * With Credentials Security Protection + +This library has been modified to avoid a well known security issue when configured with `AllowedOrigins` to `*` and `AllowCredentials` to `true`. Such setup used to make the library reflects the request `Origin` header value, working around a security protection embedded into the standard that makes clients to refuse such configuration. This behavior has been removed with [#55](https://github.com/rs/cors/issues/55) and [#57](https://github.com/rs/cors/issues/57). + +If you depend on this behavior and understand the implications, you can restore it using the `AllowOriginFunc` with `func(origin string) {return true}`. + +Please refer to [#55](https://github.com/rs/cors/issues/55) for more information about the security implications. + ### More Examples * `net/http`: [examples/nethttp/server.go](https://github.com/rs/cors/blob/master/examples/nethttp/server.go) @@ -56,6 +64,11 @@ The server now runs on `localhost:8080`: * [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) +* [HttpRouter](https://github.com/julienschmidt/httprouter): [examples/httprouter/server.go](https://github.com/rs/cors/blob/master/examples/httprouter/server.go) +* [Gorilla](http://www.gorillatoolkit.org/pkg/mux): [examples/gorilla/server.go](https://github.com/rs/cors/blob/master/examples/gorilla/server.go) +* [Buffalo](https://gobuffalo.io): [examples/buffalo/server.go](https://github.com/rs/cors/blob/master/examples/buffalo/server.go) +* [Gin](https://gin-gonic.github.io/gin): [examples/gin/server.go](https://github.com/rs/cors/blob/master/examples/gin/server.go) +* [Chi](https://github.com/go-chi/chi): [examples/chi/server.go](https://github.com/rs/cors/blob/master/examples/chi/server.go) ## Parameters @@ -63,8 +76,10 @@ Parameters are passed to the middleware thru the `cors.New` method as follow: ```go c := cors.New(cors.Options{ - AllowedOrigins: []string{"http://foo.com"}, + AllowedOrigins: []string{"http://foo.com", "http://foo.com:8080"}, AllowCredentials: true, + // Enable Debugging for testing, consider disabling in production + Debug: true, }) // Insert the middleware @@ -72,7 +87,8 @@ 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 +* **AllowOriginFunc** `func (origin string) bool`: A custom function to validate the origin. It takes the origin as an argument and returns true if allowed, or false otherwise. If this option is set, the content of `AllowedOrigins` is ignored. +* **AllowOriginRequestFunc** `func (r *http.Request origin string) bool`: A custom function to validate the origin. It takes the HTTP Request object and the origin as argument and returns true if allowed or false otherwise. If this option is set, the content of `AllowedOrigins` and `AllowOriginFunc` 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 diff --git a/vendor/github.com/rs/cors/cors.go b/vendor/github.com/rs/cors/cors.go index 4bb22d8f..d301ca72 100644 --- a/vendor/github.com/rs/cors/cors.go +++ b/vendor/github.com/rs/cors/cors.go @@ -26,9 +26,6 @@ import ( "os" "strconv" "strings" - - "github.com/rs/xhandler" - "golang.org/x/net/context" ) // Options is a configuration container to setup the CORS middleware. @@ -36,7 +33,7 @@ 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. + // (i.e.: http://*.domain.com). Usage of wildcards implies a small performance penalty. // Only one wildcard can be used per origin. // Default value is ["*"] AllowedOrigins []string @@ -44,8 +41,12 @@ type Options struct { // 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 + // AllowOriginFunc is a custom function to validate the origin. It takes the HTTP Request object and the origin as + // argument and returns true if allowed or false otherwise. If this option is set, the content of `AllowedOrigins` + // and `AllowOriginFunc` is ignored. + AllowOriginRequestFunc func(r *http.Request, 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) + // cross-domain requests. Default value is simple methods (HEAD, GET and POST). AllowedMethods []string // AllowedHeaders is list of non simple headers the client is allowed to use with // cross-domain requests. @@ -55,12 +56,12 @@ type Options struct { // 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 + // AllowCredentials indicates whether the request can include user credentials like + // cookies, HTTP authentication or client side SSL certificates. + AllowCredentials bool // OptionsPassthrough instructs preflight to let other potential next handlers to // process the OPTIONS method. Turn this on if your application handles OPTIONS. OptionsPassthrough bool @@ -72,35 +73,38 @@ type Options struct { 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 + // Optional origin validator (with request) function + allowOriginRequestFunc func(r *http.Request, origin string) bool // Normalized list of allowed headers allowedHeaders []string // Normalized list of allowed methods allowedMethods []string // Normalized list of exposed headers - exposedHeaders []string + exposedHeaders []string + maxAge int + // Set to true when allowed origins contains a "*" + allowedOriginsAll bool + // Set to true when allowed headers contains a "*" + allowedHeadersAll bool 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, + exposedHeaders: convert(options.ExposedHeaders, http.CanonicalHeaderKey), + allowOriginFunc: options.AllowOriginFunc, + allowOriginRequestFunc: options.AllowOriginRequestFunc, + allowCredentials: options.AllowCredentials, + maxAge: options.MaxAge, + optionPassthrough: options.OptionsPassthrough, } if options.Debug { c.Log = log.New(os.Stdout, "[cors] ", log.LstdFlags) @@ -112,8 +116,10 @@ func New(options Options) *Cors { // Allowed Origins if len(options.AllowedOrigins) == 0 { - // Default is all origins - c.allowedOriginsAll = true + if options.AllowOriginFunc == nil && options.AllowOriginRequestFunc == nil { + // Default is all origins + c.allowedOriginsAll = true + } } else { c.allowedOrigins = []string{} c.allowedWOrigins = []wildcard{} @@ -128,7 +134,7 @@ func New(options Options) *Cors { 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)]} + w := wildcard{origin[0:i], origin[i+1:]} c.allowedWOrigins = append(c.allowedWOrigins, w) } else { c.allowedOrigins = append(c.allowedOrigins, origin) @@ -139,7 +145,7 @@ func New(options Options) *Cors { // Allowed Headers if len(options.AllowedHeaders) == 0 { // Use sensible defaults - c.allowedHeaders = []string{"Origin", "Accept", "Content-Type"} + c.allowedHeaders = []string{"Origin", "Accept", "Content-Type", "X-Requested-With"} } 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) @@ -155,7 +161,7 @@ func New(options Options) *Cors { // Allowed Methods if len(options.AllowedMethods) == 0 { // Default is spec's "simple" methods - c.allowedMethods = []string{"GET", "POST"} + c.allowedMethods = []string{"GET", "POST", "HEAD"} } else { c.allowedMethods = convert(options.AllowedMethods, strings.ToUpper) } @@ -163,16 +169,27 @@ func New(options Options) *Cors { return c } -// Default creates a new Cors handler with default options +// Default creates a new Cors handler with default options. func Default() *Cors { return New(Options{}) } +// AllowAll create a new Cors handler with permissive configuration allowing all +// origins with all standard methods with any header and credentials. +func AllowAll() *Cors { + return New(Options{ + AllowedOrigins: []string{"*"}, + AllowedMethods: []string{"HEAD", "GET", "POST", "PUT", "PATCH", "DELETE"}, + AllowedHeaders: []string{"*"}, + AllowCredentials: false, + }) +} + // 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" { + if r.Method == http.MethodOptions && r.Header.Get("Access-Control-Request-Method") != "" { c.logf("Handler: Preflight request") c.handlePreflight(w, r) // Preflight requests are standalone and should stop the chain as some other @@ -192,32 +209,9 @@ func (c *Cors) Handler(h http.Handler) http.Handler { }) } -// 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" { + if r.Method == http.MethodOptions && r.Header.Get("Access-Control-Request-Method") != "" { c.logf("HandlerFunc: Preflight request") c.handlePreflight(w, r) } else { @@ -228,7 +222,7 @@ func (c *Cors) HandlerFunc(w http.ResponseWriter, r *http.Request) { // Negroni compatible interface func (c *Cors) ServeHTTP(w http.ResponseWriter, r *http.Request, next http.HandlerFunc) { - if r.Method == "OPTIONS" { + if r.Method == http.MethodOptions && r.Header.Get("Access-Control-Request-Method") != "" { c.logf("ServeHTTP: Preflight request") c.handlePreflight(w, r) // Preflight requests are standalone and should stop the chain as some other @@ -252,7 +246,7 @@ func (c *Cors) handlePreflight(w http.ResponseWriter, r *http.Request) { headers := w.Header() origin := r.Header.Get("Origin") - if r.Method != "OPTIONS" { + if r.Method != http.MethodOptions { c.logf(" Preflight aborted: %s!=OPTIONS", r.Method) return } @@ -267,7 +261,7 @@ func (c *Cors) handlePreflight(w http.ResponseWriter, r *http.Request) { c.logf(" Preflight aborted: empty origin") return } - if !c.isOriginAllowed(origin) { + if !c.isOriginAllowed(r, origin) { c.logf(" Preflight aborted: origin '%s' not allowed", origin) return } @@ -282,7 +276,11 @@ func (c *Cors) handlePreflight(w http.ResponseWriter, r *http.Request) { c.logf(" Preflight aborted: headers '%v' not allowed", reqHeaders) return } - headers.Set("Access-Control-Allow-Origin", origin) + if c.allowedOriginsAll { + headers.Set("Access-Control-Allow-Origin", "*") + } else { + 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)) @@ -306,7 +304,7 @@ func (c *Cors) handleActualRequest(w http.ResponseWriter, r *http.Request) { headers := w.Header() origin := r.Header.Get("Origin") - if r.Method == "OPTIONS" { + if r.Method == http.MethodOptions { c.logf(" Actual request no headers added: method == %s", r.Method) return } @@ -316,7 +314,7 @@ func (c *Cors) handleActualRequest(w http.ResponseWriter, r *http.Request) { c.logf(" Actual request no headers added: missing origin") return } - if !c.isOriginAllowed(origin) { + if !c.isOriginAllowed(r, origin) { c.logf(" Actual request no headers added: origin '%s' not allowed", origin) return } @@ -330,7 +328,11 @@ func (c *Cors) handleActualRequest(w http.ResponseWriter, r *http.Request) { return } - headers.Set("Access-Control-Allow-Origin", origin) + if c.allowedOriginsAll { + headers.Set("Access-Control-Allow-Origin", "*") + } else { + headers.Set("Access-Control-Allow-Origin", origin) + } if len(c.exposedHeaders) > 0 { headers.Set("Access-Control-Expose-Headers", strings.Join(c.exposedHeaders, ", ")) } @@ -349,7 +351,10 @@ func (c *Cors) logf(format string, a ...interface{}) { // isOriginAllowed checks if a given origin is allowed to perform cross-domain requests // on the endpoint -func (c *Cors) isOriginAllowed(origin string) bool { +func (c *Cors) isOriginAllowed(r *http.Request, origin string) bool { + if c.allowOriginRequestFunc != nil { + return c.allowOriginRequestFunc(r, origin) + } if c.allowOriginFunc != nil { return c.allowOriginFunc(origin) } @@ -378,7 +383,7 @@ func (c *Cors) isMethodAllowed(method string) bool { return false } method = strings.ToUpper(method) - if method == "OPTIONS" { + if method == http.MethodOptions { // Always allow preflight requests return true } diff --git a/vendor/github.com/rs/cors/go.mod b/vendor/github.com/rs/cors/go.mod new file mode 100644 index 00000000..0a4c6521 --- /dev/null +++ b/vendor/github.com/rs/cors/go.mod @@ -0,0 +1 @@ +module github.com/rs/cors diff --git a/vendor/github.com/rs/cors/utils.go b/vendor/github.com/rs/cors/utils.go index c7a0aa06..53ad9e9d 100644 --- a/vendor/github.com/rs/cors/utils.go +++ b/vendor/github.com/rs/cors/utils.go @@ -39,19 +39,20 @@ func parseHeaderList(headerList string) []string { headers := make([]string, 0, t) for i := 0; i < l; i++ { b := headerList[i] - if b >= 'a' && b <= 'z' { + switch { + case b >= 'a' && b <= 'z': if upper { h = append(h, b-toLower) } else { h = append(h, b) } - } else if b >= 'A' && b <= 'Z' { + case b >= 'A' && b <= 'Z': if !upper { h = append(h, b+toLower) } else { h = append(h, b) } - } else if b == '-' || b == '_' || (b >= '0' && b <= '9') { + case b == '-' || b == '_' || (b >= '0' && b <= '9'): h = append(h, b) } diff --git a/vendor/github.com/rs/xhandler/.travis.yml b/vendor/github.com/rs/xhandler/.travis.yml deleted file mode 100644 index b65c7a9f..00000000 --- a/vendor/github.com/rs/xhandler/.travis.yml +++ /dev/null @@ -1,7 +0,0 @@ -language: go -go: -- 1.5 -- tip -matrix: - allow_failures: - - go: tip diff --git a/vendor/github.com/rs/xhandler/LICENSE b/vendor/github.com/rs/xhandler/LICENSE deleted file mode 100644 index 47c5e9d2..00000000 --- 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 91c594bd..00000000 --- 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 042274d1..00000000 --- a/vendor/github.com/rs/xhandler/chain.go +++ /dev/null @@ -1,93 +0,0 @@ -package xhandler - -import ( - "net/http" - - "golang.org/x/net/context" -) - -// Chain is an helper to chain middleware handlers together for an easier -// management. -type Chain []func(next HandlerC) HandlerC - -// 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 -// lossing 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 to put -// 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 return 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 an 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 an helper to provide a standard http handler (http.HandlerFunc) -// to Handler(). Your final handler won't have access 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 an helper to provide a standard http handler function -// (http.HandlerFunc) to Handler(). Your final handler won't have access -// 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 return 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 5de13641..00000000 --- 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 close 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 to obey 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 0dfcddf9..00000000 --- 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 do 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 a 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/sirupsen/logrus/.travis.yml b/vendor/github.com/sirupsen/logrus/.travis.yml index 7e54dc6e..848938a6 100644 --- a/vendor/github.com/sirupsen/logrus/.travis.yml +++ b/vendor/github.com/sirupsen/logrus/.travis.yml @@ -5,16 +5,20 @@ git: env: - GO111MODULE=on - GO111MODULE=off -go: [ 1.10.x, 1.11.x, 1.12.x ] -os: [ linux, osx, windows ] +go: [ 1.11.x, 1.12.x ] +os: [ linux, osx ] matrix: exclude: - - env: GO111MODULE=on - go: 1.10.x + - go: 1.12.x + env: GO111MODULE=off + - go: 1.11.x + os: osx install: + - ./travis/install.sh - if [[ "$GO111MODULE" == "on" ]]; then go mod download; fi - if [[ "$GO111MODULE" == "off" ]]; then go get github.com/stretchr/testify/assert golang.org/x/sys/unix github.com/konsorten/go-windows-terminal-sequences; fi script: + - ./travis/cross_build.sh - export GOMAXPROCS=4 - export GORACE=halt_on_error=1 - go test -race -v ./... diff --git a/vendor/github.com/sirupsen/logrus/CHANGELOG.md b/vendor/github.com/sirupsen/logrus/CHANGELOG.md index f62cbd24..51a7ab0c 100644 --- a/vendor/github.com/sirupsen/logrus/CHANGELOG.md +++ b/vendor/github.com/sirupsen/logrus/CHANGELOG.md @@ -1,3 +1,5 @@ +# 1.4.2 + * Fixes build break for plan9, nacl, solaris # 1.4.1 This new release introduces: * Enhance TextFormatter to not print caller information when they are empty (#944) diff --git a/vendor/github.com/sirupsen/logrus/go.mod b/vendor/github.com/sirupsen/logrus/go.mod index 8261a2b3..12fdf989 100644 --- a/vendor/github.com/sirupsen/logrus/go.mod +++ b/vendor/github.com/sirupsen/logrus/go.mod @@ -6,5 +6,5 @@ require ( github.com/pmezard/go-difflib v1.0.0 // indirect github.com/stretchr/objx v0.1.1 // indirect github.com/stretchr/testify v1.2.2 - golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33 + golang.org/x/sys v0.0.0-20190422165155-953cdadca894 ) diff --git a/vendor/github.com/sirupsen/logrus/go.sum b/vendor/github.com/sirupsen/logrus/go.sum index 2d787be6..596c318b 100644 --- a/vendor/github.com/sirupsen/logrus/go.sum +++ b/vendor/github.com/sirupsen/logrus/go.sum @@ -2,6 +2,7 @@ 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/konsorten/go-windows-terminal-sequences v0.0.0-20180402223658-b729f2633dfe h1:CHRGQ8V7OlCYtwaKPJi3iA7J+YdNKdo8j7nG5IgDhjs= github.com/konsorten/go-windows-terminal-sequences v0.0.0-20180402223658-b729f2633dfe/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -11,3 +12,5 @@ github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1 github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33 h1:I6FyU15t786LL7oL/hn43zqTuEGr4PN7F4XJ1p4E3Y8= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894 h1:Cz4ceDQGXuKRnVBDTS23GTn/pU5OE2C0WrNTOYK1Uuc= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/vendor/github.com/sirupsen/logrus/terminal_check_js.go b/vendor/github.com/sirupsen/logrus/terminal_check_no_terminal.go similarity index 79% rename from vendor/github.com/sirupsen/logrus/terminal_check_js.go rename to vendor/github.com/sirupsen/logrus/terminal_check_no_terminal.go index 0c209750..97af92c6 100644 --- a/vendor/github.com/sirupsen/logrus/terminal_check_js.go +++ b/vendor/github.com/sirupsen/logrus/terminal_check_no_terminal.go @@ -1,4 +1,4 @@ -// +build js +// +build js nacl plan9 package logrus diff --git a/vendor/github.com/sirupsen/logrus/terminal_check_notappengine.go b/vendor/github.com/sirupsen/logrus/terminal_check_notappengine.go index 7be2d87c..3293fb3c 100644 --- a/vendor/github.com/sirupsen/logrus/terminal_check_notappengine.go +++ b/vendor/github.com/sirupsen/logrus/terminal_check_notappengine.go @@ -1,4 +1,4 @@ -// +build !appengine,!js,!windows +// +build !appengine,!js,!windows,!nacl,!plan9 package logrus diff --git a/vendor/github.com/sirupsen/logrus/terminal_check_solaris.go b/vendor/github.com/sirupsen/logrus/terminal_check_solaris.go new file mode 100644 index 00000000..f6710b3b --- /dev/null +++ b/vendor/github.com/sirupsen/logrus/terminal_check_solaris.go @@ -0,0 +1,11 @@ +package logrus + +import ( + "golang.org/x/sys/unix" +) + +// IsTerminal returns true if the given file descriptor is a terminal. +func isTerminal(fd int) bool { + _, err := unix.IoctlGetTermio(fd, unix.TCGETA) + return err == nil +} diff --git a/vendor/github.com/sirupsen/logrus/terminal_check_windows.go b/vendor/github.com/sirupsen/logrus/terminal_check_windows.go index 3b9d2864..572889db 100644 --- a/vendor/github.com/sirupsen/logrus/terminal_check_windows.go +++ b/vendor/github.com/sirupsen/logrus/terminal_check_windows.go @@ -6,15 +6,29 @@ import ( "io" "os" "syscall" + + sequences "github.com/konsorten/go-windows-terminal-sequences" ) +func initTerminal(w io.Writer) { + switch v := w.(type) { + case *os.File: + sequences.EnableVirtualTerminalProcessing(syscall.Handle(v.Fd()), true) + } +} + func checkIfTerminal(w io.Writer) bool { + var ret bool switch v := w.(type) { case *os.File: var mode uint32 err := syscall.GetConsoleMode(syscall.Handle(v.Fd()), &mode) - return err == nil + ret = (err == nil) default: - return false + ret = false + } + if ret { + initTerminal(w) } + return ret } diff --git a/vendor/github.com/sirupsen/logrus/terminal_notwindows.go b/vendor/github.com/sirupsen/logrus/terminal_notwindows.go deleted file mode 100644 index 3dbd2372..00000000 --- a/vendor/github.com/sirupsen/logrus/terminal_notwindows.go +++ /dev/null @@ -1,8 +0,0 @@ -// +build !windows - -package logrus - -import "io" - -func initTerminal(w io.Writer) { -} diff --git a/vendor/github.com/sirupsen/logrus/terminal_windows.go b/vendor/github.com/sirupsen/logrus/terminal_windows.go deleted file mode 100644 index b4ef5286..00000000 --- a/vendor/github.com/sirupsen/logrus/terminal_windows.go +++ /dev/null @@ -1,18 +0,0 @@ -// +build !appengine,!js,windows - -package logrus - -import ( - "io" - "os" - "syscall" - - sequences "github.com/konsorten/go-windows-terminal-sequences" -) - -func initTerminal(w io.Writer) { - switch v := w.(type) { - case *os.File: - sequences.EnableVirtualTerminalProcessing(syscall.Handle(v.Fd()), true) - } -} diff --git a/vendor/github.com/sirupsen/logrus/text_formatter.go b/vendor/github.com/sirupsen/logrus/text_formatter.go index 1569161e..e01587c4 100644 --- a/vendor/github.com/sirupsen/logrus/text_formatter.go +++ b/vendor/github.com/sirupsen/logrus/text_formatter.go @@ -84,10 +84,6 @@ type TextFormatter struct { func (f *TextFormatter) init(entry *Entry) { if entry.Logger != nil { f.isTerminal = checkIfTerminal(entry.Logger.Out) - - if f.isTerminal { - initTerminal(entry.Logger.Out) - } } } diff --git a/vendor/github.com/spacemonkeygo/openssl/.gitignore b/vendor/github.com/spacemonkeygo/openssl/.gitignore new file mode 100644 index 00000000..805d350b --- /dev/null +++ b/vendor/github.com/spacemonkeygo/openssl/.gitignore @@ -0,0 +1 @@ +openssl.test diff --git a/vendor/github.com/spacemonkeygo/openssl/AUTHORS b/vendor/github.com/spacemonkeygo/openssl/AUTHORS new file mode 100644 index 00000000..a048c1ea --- /dev/null +++ b/vendor/github.com/spacemonkeygo/openssl/AUTHORS @@ -0,0 +1,24 @@ +Andrew Brampton +Anton Baklanov +Carlos Martín Nieto +Charles Strahan +Christopher Dudley +Christopher Fredericks +Colin Misare +dequis +Gabriel Russell +Giulio +Jakob Unterwurzacher +Juuso Haavisto +kujenga +Phus Lu +Russ Egan +Ryan Hileman +Scott J. Goldman +Scott Kidder +Space Monkey, Inc +Stephen Gallagher +Viacheslav Biriukov +Zack Owens +Ramesh Rayaprolu +Paras Shah diff --git a/vendor/github.com/spacemonkeygo/openssl/LICENSE b/vendor/github.com/spacemonkeygo/openssl/LICENSE new file mode 100644 index 00000000..37ec93a1 --- /dev/null +++ b/vendor/github.com/spacemonkeygo/openssl/LICENSE @@ -0,0 +1,191 @@ +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: + +You must give any other recipients of the Work or Derivative Works a copy of +this License; and +You must cause any modified files to carry prominent notices stating that You +changed the files; and +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 +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/spacemonkeygo/openssl/README.md b/vendor/github.com/spacemonkeygo/openssl/README.md new file mode 100644 index 00000000..854df05a --- /dev/null +++ b/vendor/github.com/spacemonkeygo/openssl/README.md @@ -0,0 +1,30 @@ +# OpenSSL bindings for Go + +Please see http://godoc.org/github.com/spacemonkeygo/openssl for more info + +### License + +Copyright (C) 2017. See 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. + +### Using on macOS +1. Install [homebrew](http://brew.sh/) +2. `$ brew install openssl` or `$ brew install openssl@1.1` + +### Using on Windows +1. Install [mingw-w64](http://mingw-w64.sourceforge.net/) +2. Install [pkg-config-lite](http://sourceforge.net/projects/pkgconfiglite) +3. Build (or install precompiled) openssl for mingw32-w64 +4. Set __PKG\_CONFIG\_PATH__ to the directory containing openssl.pc + (i.e. c:\mingw64\mingw64\lib\pkgconfig) diff --git a/vendor/github.com/spacemonkeygo/openssl/bio.go b/vendor/github.com/spacemonkeygo/openssl/bio.go new file mode 100644 index 00000000..9fe32aa8 --- /dev/null +++ b/vendor/github.com/spacemonkeygo/openssl/bio.go @@ -0,0 +1,305 @@ +// Copyright (C) 2017. See 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 openssl + +// #include "shim.h" +import "C" + +import ( + "errors" + "io" + "reflect" + "sync" + "unsafe" +) + +const ( + SSLRecordSize = 16 * 1024 +) + +func nonCopyGoBytes(ptr uintptr, length int) []byte { + var slice []byte + header := (*reflect.SliceHeader)(unsafe.Pointer(&slice)) + header.Cap = length + header.Len = length + header.Data = ptr + return slice +} + +func nonCopyCString(data *C.char, size C.int) []byte { + return nonCopyGoBytes(uintptr(unsafe.Pointer(data)), int(size)) +} + +var writeBioMapping = newMapping() + +type writeBio struct { + data_mtx sync.Mutex + op_mtx sync.Mutex + buf []byte + release_buffers bool +} + +func loadWritePtr(b *C.BIO) *writeBio { + t := token(C.X_BIO_get_data(b)) + return (*writeBio)(writeBioMapping.Get(t)) +} + +func bioClearRetryFlags(b *C.BIO) { + C.X_BIO_clear_flags(b, C.BIO_FLAGS_RWS|C.BIO_FLAGS_SHOULD_RETRY) +} + +func bioSetRetryRead(b *C.BIO) { + C.X_BIO_set_flags(b, C.BIO_FLAGS_READ|C.BIO_FLAGS_SHOULD_RETRY) +} + +//export go_write_bio_write +func go_write_bio_write(b *C.BIO, data *C.char, size C.int) (rc C.int) { + defer func() { + if err := recover(); err != nil { + logger.Critf("openssl: writeBioWrite panic'd: %v", err) + rc = -1 + } + }() + ptr := loadWritePtr(b) + if ptr == nil || data == nil || size < 0 { + return -1 + } + ptr.data_mtx.Lock() + defer ptr.data_mtx.Unlock() + bioClearRetryFlags(b) + ptr.buf = append(ptr.buf, nonCopyCString(data, size)...) + return size +} + +//export go_write_bio_ctrl +func go_write_bio_ctrl(b *C.BIO, cmd C.int, arg1 C.long, arg2 unsafe.Pointer) ( + rc C.long) { + defer func() { + if err := recover(); err != nil { + logger.Critf("openssl: writeBioCtrl panic'd: %v", err) + rc = -1 + } + }() + switch cmd { + case C.BIO_CTRL_WPENDING: + return writeBioPending(b) + case C.BIO_CTRL_DUP, C.BIO_CTRL_FLUSH: + return 1 + default: + return 0 + } +} + +func writeBioPending(b *C.BIO) C.long { + ptr := loadWritePtr(b) + if ptr == nil { + return 0 + } + ptr.data_mtx.Lock() + defer ptr.data_mtx.Unlock() + return C.long(len(ptr.buf)) +} + +func (b *writeBio) WriteTo(w io.Writer) (rv int64, err error) { + b.op_mtx.Lock() + defer b.op_mtx.Unlock() + + // write whatever data we currently have + b.data_mtx.Lock() + data := b.buf + b.data_mtx.Unlock() + + if len(data) == 0 { + return 0, nil + } + n, err := w.Write(data) + + // subtract however much data we wrote from the buffer + b.data_mtx.Lock() + b.buf = b.buf[:copy(b.buf, b.buf[n:])] + if b.release_buffers && len(b.buf) == 0 { + b.buf = nil + } + b.data_mtx.Unlock() + + return int64(n), err +} + +func (self *writeBio) Disconnect(b *C.BIO) { + if loadWritePtr(b) == self { + writeBioMapping.Del(token(C.X_BIO_get_data(b))) + C.X_BIO_set_data(b, nil) + } +} + +func (b *writeBio) MakeCBIO() *C.BIO { + rv := C.X_BIO_new_write_bio() + token := writeBioMapping.Add(unsafe.Pointer(b)) + C.X_BIO_set_data(rv, unsafe.Pointer(token)) + return rv +} + +var readBioMapping = newMapping() + +type readBio struct { + data_mtx sync.Mutex + op_mtx sync.Mutex + buf []byte + eof bool + release_buffers bool +} + +func loadReadPtr(b *C.BIO) *readBio { + return (*readBio)(readBioMapping.Get(token(C.X_BIO_get_data(b)))) +} + +//export go_read_bio_read +func go_read_bio_read(b *C.BIO, data *C.char, size C.int) (rc C.int) { + defer func() { + if err := recover(); err != nil { + logger.Critf("openssl: go_read_bio_read panic'd: %v", err) + rc = -1 + } + }() + ptr := loadReadPtr(b) + if ptr == nil || size < 0 { + return -1 + } + ptr.data_mtx.Lock() + defer ptr.data_mtx.Unlock() + bioClearRetryFlags(b) + if len(ptr.buf) == 0 { + if ptr.eof { + return 0 + } + bioSetRetryRead(b) + return -1 + } + if size == 0 || data == nil { + return C.int(len(ptr.buf)) + } + n := copy(nonCopyCString(data, size), ptr.buf) + ptr.buf = ptr.buf[:copy(ptr.buf, ptr.buf[n:])] + if ptr.release_buffers && len(ptr.buf) == 0 { + ptr.buf = nil + } + return C.int(n) +} + +//export go_read_bio_ctrl +func go_read_bio_ctrl(b *C.BIO, cmd C.int, arg1 C.long, arg2 unsafe.Pointer) ( + rc C.long) { + + defer func() { + if err := recover(); err != nil { + logger.Critf("openssl: readBioCtrl panic'd: %v", err) + rc = -1 + } + }() + switch cmd { + case C.BIO_CTRL_PENDING: + return readBioPending(b) + case C.BIO_CTRL_DUP, C.BIO_CTRL_FLUSH: + return 1 + default: + return 0 + } +} + +func readBioPending(b *C.BIO) C.long { + ptr := loadReadPtr(b) + if ptr == nil { + return 0 + } + ptr.data_mtx.Lock() + defer ptr.data_mtx.Unlock() + return C.long(len(ptr.buf)) +} + +func (b *readBio) ReadFromOnce(r io.Reader) (n int, err error) { + b.op_mtx.Lock() + defer b.op_mtx.Unlock() + + // make sure we have a destination that fits at least one SSL record + b.data_mtx.Lock() + if cap(b.buf) < len(b.buf)+SSLRecordSize { + new_buf := make([]byte, len(b.buf), len(b.buf)+SSLRecordSize) + copy(new_buf, b.buf) + b.buf = new_buf + } + dst := b.buf[len(b.buf):cap(b.buf)] + dst_slice := b.buf + b.data_mtx.Unlock() + + n, err = r.Read(dst) + b.data_mtx.Lock() + defer b.data_mtx.Unlock() + if n > 0 { + if len(dst_slice) != len(b.buf) { + // someone shrunk the buffer, so we read in too far ahead and we + // need to slide backwards + copy(b.buf[len(b.buf):len(b.buf)+n], dst) + } + b.buf = b.buf[:len(b.buf)+n] + } + return n, err +} + +func (b *readBio) MakeCBIO() *C.BIO { + rv := C.X_BIO_new_read_bio() + token := readBioMapping.Add(unsafe.Pointer(b)) + C.X_BIO_set_data(rv, unsafe.Pointer(token)) + return rv +} + +func (self *readBio) Disconnect(b *C.BIO) { + if loadReadPtr(b) == self { + readBioMapping.Del(token(C.X_BIO_get_data(b))) + C.X_BIO_set_data(b, nil) + } +} + +func (b *readBio) MarkEOF() { + b.data_mtx.Lock() + defer b.data_mtx.Unlock() + b.eof = true +} + +type anyBio C.BIO + +func asAnyBio(b *C.BIO) *anyBio { return (*anyBio)(b) } + +func (b *anyBio) Read(buf []byte) (n int, err error) { + if len(buf) == 0 { + return 0, nil + } + n = int(C.X_BIO_read((*C.BIO)(b), unsafe.Pointer(&buf[0]), C.int(len(buf)))) + if n <= 0 { + return 0, io.EOF + } + return n, nil +} + +func (b *anyBio) Write(buf []byte) (written int, err error) { + if len(buf) == 0 { + return 0, nil + } + n := int(C.X_BIO_write((*C.BIO)(b), unsafe.Pointer(&buf[0]), + C.int(len(buf)))) + if n != len(buf) { + return n, errors.New("BIO write failed") + } + return n, nil +} diff --git a/vendor/github.com/spacemonkeygo/openssl/build.go b/vendor/github.com/spacemonkeygo/openssl/build.go new file mode 100644 index 00000000..5fccc021 --- /dev/null +++ b/vendor/github.com/spacemonkeygo/openssl/build.go @@ -0,0 +1,24 @@ +// Copyright (C) 2017. See 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 !openssl_static + +package openssl + +// #cgo linux windows pkg-config: libssl libcrypto +// #cgo linux CFLAGS: -Wno-deprecated-declarations +// #cgo darwin CFLAGS: -I/usr/local/opt/openssl@1.1/include -I/usr/local/opt/openssl/include -Wno-deprecated-declarations +// #cgo darwin LDFLAGS: -L/usr/local/opt/openssl@1.1/lib -L/usr/local/opt/openssl/lib -lssl -lcrypto +// #cgo windows CFLAGS: -DWIN32_LEAN_AND_MEAN +import "C" diff --git a/vendor/github.com/spacemonkeygo/openssl/build_static.go b/vendor/github.com/spacemonkeygo/openssl/build_static.go new file mode 100644 index 00000000..c84427bc --- /dev/null +++ b/vendor/github.com/spacemonkeygo/openssl/build_static.go @@ -0,0 +1,24 @@ +// Copyright (C) 2017. See 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 openssl_static + +package openssl + +// #cgo linux windows pkg-config: --static libssl libcrypto +// #cgo linux CFLAGS: -Wno-deprecated-declarations +// #cgo darwin CFLAGS: -I/usr/local/opt/openssl@1.1/include -I/usr/local/opt/openssl/include -Wno-deprecated-declarations +// #cgo darwin LDFLAGS: -L/usr/local/opt/openssl@1.1/lib -L/usr/local/opt/openssl/lib -lssl -lcrypto +// #cgo windows CFLAGS: -DWIN32_LEAN_AND_MEAN +import "C" diff --git a/vendor/github.com/spacemonkeygo/openssl/cert.go b/vendor/github.com/spacemonkeygo/openssl/cert.go new file mode 100644 index 00000000..e841e22c --- /dev/null +++ b/vendor/github.com/spacemonkeygo/openssl/cert.go @@ -0,0 +1,415 @@ +// Copyright (C) 2017. See 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 openssl + +// #include "shim.h" +import "C" + +import ( + "errors" + "io/ioutil" + "math/big" + "runtime" + "time" + "unsafe" +) + +type EVP_MD int + +const ( + EVP_NULL EVP_MD = iota + EVP_MD5 EVP_MD = iota + EVP_MD4 EVP_MD = iota + EVP_SHA EVP_MD = iota + EVP_SHA1 EVP_MD = iota + EVP_DSS EVP_MD = iota + EVP_DSS1 EVP_MD = iota + EVP_MDC2 EVP_MD = iota + EVP_RIPEMD160 EVP_MD = iota + EVP_SHA224 EVP_MD = iota + EVP_SHA256 EVP_MD = iota + EVP_SHA384 EVP_MD = iota + EVP_SHA512 EVP_MD = iota +) + +// X509_Version represents a version on an x509 certificate. +type X509_Version int + +// Specify constants for x509 versions because the standard states that they +// are represented internally as one lower than the common version name. +const ( + X509_V1 X509_Version = 0 + X509_V3 X509_Version = 2 +) + +type Certificate struct { + x *C.X509 + Issuer *Certificate + ref interface{} + pubKey PublicKey +} + +type CertificateInfo struct { + Serial *big.Int + Issued time.Duration + Expires time.Duration + Country string + Organization string + CommonName string +} + +type Name struct { + name *C.X509_NAME +} + +// Allocate and return a new Name object. +func NewName() (*Name, error) { + n := C.X509_NAME_new() + if n == nil { + return nil, errors.New("could not create x509 name") + } + name := &Name{name: n} + runtime.SetFinalizer(name, func(n *Name) { + C.X509_NAME_free(n.name) + }) + return name, nil +} + +// AddTextEntry appends a text entry to an X509 NAME. +func (n *Name) AddTextEntry(field, value string) error { + cfield := C.CString(field) + defer C.free(unsafe.Pointer(cfield)) + cvalue := (*C.uchar)(unsafe.Pointer(C.CString(value))) + defer C.free(unsafe.Pointer(cvalue)) + ret := C.X509_NAME_add_entry_by_txt( + n.name, cfield, C.MBSTRING_ASC, cvalue, -1, -1, 0) + if ret != 1 { + return errors.New("failed to add x509 name text entry") + } + return nil +} + +// AddTextEntries allows adding multiple entries to a name in one call. +func (n *Name) AddTextEntries(entries map[string]string) error { + for f, v := range entries { + if err := n.AddTextEntry(f, v); err != nil { + return err + } + } + return nil +} + +// GetEntry returns a name entry based on NID. If no entry, then ("", false) is +// returned. +func (n *Name) GetEntry(nid NID) (entry string, ok bool) { + entrylen := C.X509_NAME_get_text_by_NID(n.name, C.int(nid), nil, 0) + if entrylen == -1 { + return "", false + } + buf := (*C.char)(C.malloc(C.size_t(entrylen + 1))) + defer C.free(unsafe.Pointer(buf)) + C.X509_NAME_get_text_by_NID(n.name, C.int(nid), buf, entrylen+1) + return C.GoStringN(buf, entrylen), true +} + +// NewCertificate generates a basic certificate based +// on the provided CertificateInfo struct +func NewCertificate(info *CertificateInfo, key PublicKey) (*Certificate, error) { + c := &Certificate{x: C.X509_new()} + runtime.SetFinalizer(c, func(c *Certificate) { + C.X509_free(c.x) + }) + + name, err := c.GetSubjectName() + if err != nil { + return nil, err + } + err = name.AddTextEntries(map[string]string{ + "C": info.Country, + "O": info.Organization, + "CN": info.CommonName, + }) + if err != nil { + return nil, err + } + // self-issue for now + if err := c.SetIssuerName(name); err != nil { + return nil, err + } + if err := c.SetSerial(info.Serial); err != nil { + return nil, err + } + if err := c.SetIssueDate(info.Issued); err != nil { + return nil, err + } + if err := c.SetExpireDate(info.Expires); err != nil { + return nil, err + } + if err := c.SetPubKey(key); err != nil { + return nil, err + } + return c, nil +} + +func (c *Certificate) GetSubjectName() (*Name, error) { + n := C.X509_get_subject_name(c.x) + if n == nil { + return nil, errors.New("failed to get subject name") + } + return &Name{name: n}, nil +} + +func (c *Certificate) GetIssuerName() (*Name, error) { + n := C.X509_get_issuer_name(c.x) + if n == nil { + return nil, errors.New("failed to get issuer name") + } + return &Name{name: n}, nil +} + +func (c *Certificate) SetSubjectName(name *Name) error { + if C.X509_set_subject_name(c.x, name.name) != 1 { + return errors.New("failed to set subject name") + } + return nil +} + +// SetIssuer updates the stored Issuer cert +// and the internal x509 Issuer Name of a certificate. +// The stored Issuer reference is used when adding extensions. +func (c *Certificate) SetIssuer(issuer *Certificate) error { + name, err := issuer.GetSubjectName() + if err != nil { + return err + } + if err = c.SetIssuerName(name); err != nil { + return err + } + c.Issuer = issuer + return nil +} + +// SetIssuerName populates the issuer name of a certificate. +// Use SetIssuer instead, if possible. +func (c *Certificate) SetIssuerName(name *Name) error { + if C.X509_set_issuer_name(c.x, name.name) != 1 { + return errors.New("failed to set subject name") + } + return nil +} + +// SetSerial sets the serial of a certificate. +func (c *Certificate) SetSerial(serial *big.Int) error { + sno := C.ASN1_INTEGER_new() + defer C.ASN1_INTEGER_free(sno) + bn := C.BN_new() + defer C.BN_free(bn) + + serialBytes := serial.Bytes() + if bn = C.BN_bin2bn((*C.uchar)(unsafe.Pointer(&serialBytes[0])), C.int(len(serialBytes)), bn); bn == nil { + return errors.New("failed to set serial") + } + if sno = C.BN_to_ASN1_INTEGER(bn, sno); sno == nil { + return errors.New("failed to set serial") + } + if C.X509_set_serialNumber(c.x, sno) != 1 { + return errors.New("failed to set serial") + } + return nil +} + +// SetIssueDate sets the certificate issue date relative to the current time. +func (c *Certificate) SetIssueDate(when time.Duration) error { + offset := C.long(when / time.Second) + result := C.X509_gmtime_adj(C.X_X509_get0_notBefore(c.x), offset) + if result == nil { + return errors.New("failed to set issue date") + } + return nil +} + +// SetExpireDate sets the certificate issue date relative to the current time. +func (c *Certificate) SetExpireDate(when time.Duration) error { + offset := C.long(when / time.Second) + result := C.X509_gmtime_adj(C.X_X509_get0_notAfter(c.x), offset) + if result == nil { + return errors.New("failed to set expire date") + } + return nil +} + +// SetPubKey assigns a new public key to a certificate. +func (c *Certificate) SetPubKey(pubKey PublicKey) error { + c.pubKey = pubKey + if C.X509_set_pubkey(c.x, pubKey.evpPKey()) != 1 { + return errors.New("failed to set public key") + } + return nil +} + +// Sign a certificate using a private key and a digest name. +// Accepted digest names are 'sha256', 'sha384', and 'sha512'. +func (c *Certificate) Sign(privKey PrivateKey, digest EVP_MD) error { + switch digest { + case EVP_SHA256: + case EVP_SHA384: + case EVP_SHA512: + default: + return errors.New("Unsupported digest" + + "You're probably looking for 'EVP_SHA256' or 'EVP_SHA512'.") + } + return c.insecureSign(privKey, digest) +} + +func (c *Certificate) insecureSign(privKey PrivateKey, digest EVP_MD) error { + var md *C.EVP_MD = getDigestFunction(digest) + if C.X509_sign(c.x, privKey.evpPKey(), md) <= 0 { + return errors.New("failed to sign certificate") + } + return nil +} + +func getDigestFunction(digest EVP_MD) (md *C.EVP_MD) { + switch digest { + // please don't use these digest functions + case EVP_NULL: + md = C.X_EVP_md_null() + case EVP_MD5: + md = C.X_EVP_md5() + case EVP_SHA: + md = C.X_EVP_sha() + case EVP_SHA1: + md = C.X_EVP_sha1() + case EVP_DSS: + md = C.X_EVP_dss() + case EVP_DSS1: + md = C.X_EVP_dss1() + case EVP_RIPEMD160: + md = C.X_EVP_ripemd160() + case EVP_SHA224: + md = C.X_EVP_sha224() + // you actually want one of these + case EVP_SHA256: + md = C.X_EVP_sha256() + case EVP_SHA384: + md = C.X_EVP_sha384() + case EVP_SHA512: + md = C.X_EVP_sha512() + } + return md +} + +// Add an extension to a certificate. +// Extension constants are NID_* as found in openssl. +func (c *Certificate) AddExtension(nid NID, value string) error { + issuer := c + if c.Issuer != nil { + issuer = c.Issuer + } + var ctx C.X509V3_CTX + C.X509V3_set_ctx(&ctx, c.x, issuer.x, nil, nil, 0) + ex := C.X509V3_EXT_conf_nid(nil, &ctx, C.int(nid), C.CString(value)) + if ex == nil { + return errors.New("failed to create x509v3 extension") + } + defer C.X509_EXTENSION_free(ex) + if C.X509_add_ext(c.x, ex, -1) <= 0 { + return errors.New("failed to add x509v3 extension") + } + return nil +} + +// Wraps AddExtension using a map of NID to text extension. +// Will return without finishing if it encounters an error. +func (c *Certificate) AddExtensions(extensions map[NID]string) error { + for nid, value := range extensions { + if err := c.AddExtension(nid, value); err != nil { + return err + } + } + return nil +} + +// LoadCertificateFromPEM loads an X509 certificate from a PEM-encoded block. +func LoadCertificateFromPEM(pem_block []byte) (*Certificate, error) { + if len(pem_block) == 0 { + return nil, errors.New("empty pem block") + } + runtime.LockOSThread() + defer runtime.UnlockOSThread() + bio := C.BIO_new_mem_buf(unsafe.Pointer(&pem_block[0]), + C.int(len(pem_block))) + cert := C.PEM_read_bio_X509(bio, nil, nil, nil) + C.BIO_free(bio) + if cert == nil { + return nil, errorFromErrorQueue() + } + x := &Certificate{x: cert} + runtime.SetFinalizer(x, func(x *Certificate) { + C.X509_free(x.x) + }) + return x, nil +} + +// MarshalPEM converts the X509 certificate to PEM-encoded format +func (c *Certificate) MarshalPEM() (pem_block []byte, err error) { + bio := C.BIO_new(C.BIO_s_mem()) + if bio == nil { + return nil, errors.New("failed to allocate memory BIO") + } + defer C.BIO_free(bio) + if int(C.PEM_write_bio_X509(bio, c.x)) != 1 { + return nil, errors.New("failed dumping certificate") + } + return ioutil.ReadAll(asAnyBio(bio)) +} + +// PublicKey returns the public key embedded in the X509 certificate. +func (c *Certificate) PublicKey() (PublicKey, error) { + pkey := C.X509_get_pubkey(c.x) + if pkey == nil { + return nil, errors.New("no public key found") + } + key := &pKey{key: pkey} + runtime.SetFinalizer(key, func(key *pKey) { + C.EVP_PKEY_free(key.key) + }) + return key, nil +} + +// GetSerialNumberHex returns the certificate's serial number in hex format +func (c *Certificate) GetSerialNumberHex() (serial string) { + asn1_i := C.X509_get_serialNumber(c.x) + bignum := C.ASN1_INTEGER_to_BN(asn1_i, nil) + hex := C.BN_bn2hex(bignum) + serial = C.GoString(hex) + C.BN_free(bignum) + C.X_OPENSSL_free(unsafe.Pointer(hex)) + return +} + +// GetVersion returns the X509 version of the certificate. +func (c *Certificate) GetVersion() X509_Version { + return X509_Version(C.X_X509_get_version(c.x)) +} + +// SetVersion sets the X509 version of the certificate. +func (c *Certificate) SetVersion(version X509_Version) error { + cvers := C.long(version) + if C.X_X509_set_version(c.x, cvers) != 1 { + return errors.New("failed to set certificate version") + } + return nil +} diff --git a/vendor/github.com/spacemonkeygo/openssl/ciphers.go b/vendor/github.com/spacemonkeygo/openssl/ciphers.go new file mode 100644 index 00000000..509bf641 --- /dev/null +++ b/vendor/github.com/spacemonkeygo/openssl/ciphers.go @@ -0,0 +1,335 @@ +// Copyright (C) 2017. See 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 openssl + +// #include "shim.h" +import "C" + +import ( + "errors" + "fmt" + "runtime" + "unsafe" +) + +const ( + GCM_TAG_MAXLEN = 16 +) + +type CipherCtx interface { + Cipher() *Cipher + BlockSize() int + KeySize() int + IVSize() int +} + +type Cipher struct { + ptr *C.EVP_CIPHER +} + +func (c *Cipher) Nid() NID { + return NID(C.X_EVP_CIPHER_nid(c.ptr)) +} + +func (c *Cipher) ShortName() (string, error) { + return Nid2ShortName(c.Nid()) +} + +func (c *Cipher) BlockSize() int { + return int(C.X_EVP_CIPHER_block_size(c.ptr)) +} + +func (c *Cipher) KeySize() int { + return int(C.X_EVP_CIPHER_key_length(c.ptr)) +} + +func (c *Cipher) IVSize() int { + return int(C.X_EVP_CIPHER_iv_length(c.ptr)) +} + +func Nid2ShortName(nid NID) (string, error) { + sn := C.OBJ_nid2sn(C.int(nid)) + if sn == nil { + return "", fmt.Errorf("NID %d not found", nid) + } + return C.GoString(sn), nil +} + +func GetCipherByName(name string) (*Cipher, error) { + cname := C.CString(name) + defer C.free(unsafe.Pointer(cname)) + p := C.EVP_get_cipherbyname(cname) + if p == nil { + return nil, fmt.Errorf("Cipher %v not found", name) + } + // we can consider ciphers to use static mem; don't need to free + return &Cipher{ptr: p}, nil +} + +func GetCipherByNid(nid NID) (*Cipher, error) { + sn, err := Nid2ShortName(nid) + if err != nil { + return nil, err + } + return GetCipherByName(sn) +} + +type cipherCtx struct { + ctx *C.EVP_CIPHER_CTX +} + +func newCipherCtx() (*cipherCtx, error) { + cctx := C.EVP_CIPHER_CTX_new() + if cctx == nil { + return nil, errors.New("failed to allocate cipher context") + } + ctx := &cipherCtx{cctx} + runtime.SetFinalizer(ctx, func(ctx *cipherCtx) { + C.EVP_CIPHER_CTX_free(ctx.ctx) + }) + return ctx, nil +} + +func (ctx *cipherCtx) applyKeyAndIV(key, iv []byte) error { + var kptr, iptr *C.uchar + if key != nil { + if len(key) != ctx.KeySize() { + return fmt.Errorf("bad key size (%d bytes instead of %d)", + len(key), ctx.KeySize()) + } + kptr = (*C.uchar)(&key[0]) + } + if iv != nil { + if len(iv) != ctx.IVSize() { + return fmt.Errorf("bad IV size (%d bytes instead of %d)", + len(iv), ctx.IVSize()) + } + iptr = (*C.uchar)(&iv[0]) + } + if kptr != nil || iptr != nil { + var res C.int + if C.X_EVP_CIPHER_CTX_encrypting(ctx.ctx) != 0 { + res = C.EVP_EncryptInit_ex(ctx.ctx, nil, nil, kptr, iptr) + } else { + res = C.EVP_DecryptInit_ex(ctx.ctx, nil, nil, kptr, iptr) + } + if 1 != res { + return errors.New("failed to apply key/IV") + } + } + return nil +} + +func (ctx *cipherCtx) Cipher() *Cipher { + return &Cipher{ptr: C.X_EVP_CIPHER_CTX_cipher(ctx.ctx)} +} + +func (ctx *cipherCtx) BlockSize() int { + return int(C.X_EVP_CIPHER_CTX_block_size(ctx.ctx)) +} + +func (ctx *cipherCtx) KeySize() int { + return int(C.X_EVP_CIPHER_CTX_key_length(ctx.ctx)) +} + +func (ctx *cipherCtx) IVSize() int { + return int(C.X_EVP_CIPHER_CTX_iv_length(ctx.ctx)) +} + +func (ctx *cipherCtx) SetPadding(pad bool) { + if pad { + C.X_EVP_CIPHER_CTX_set_padding(ctx.ctx, 1) + } else { + C.X_EVP_CIPHER_CTX_set_padding(ctx.ctx, 0) + } +} + +func (ctx *cipherCtx) setCtrl(code, arg int) error { + res := C.EVP_CIPHER_CTX_ctrl(ctx.ctx, C.int(code), C.int(arg), nil) + if res != 1 { + return fmt.Errorf("failed to set code %d to %d [result %d]", + code, arg, res) + } + return nil +} + +func (ctx *cipherCtx) setCtrlBytes(code, arg int, value []byte) error { + res := C.EVP_CIPHER_CTX_ctrl(ctx.ctx, C.int(code), C.int(arg), + unsafe.Pointer(&value[0])) + if res != 1 { + return fmt.Errorf("failed to set code %d with arg %d to %x [result %d]", + code, arg, value, res) + } + return nil +} + +func (ctx *cipherCtx) getCtrlInt(code, arg int) (int, error) { + var returnVal C.int + res := C.EVP_CIPHER_CTX_ctrl(ctx.ctx, C.int(code), C.int(arg), + unsafe.Pointer(&returnVal)) + if res != 1 { + return 0, fmt.Errorf("failed to get code %d with arg %d [result %d]", + code, arg, res) + } + return int(returnVal), nil +} + +func (ctx *cipherCtx) getCtrlBytes(code, arg, expectsize int) ([]byte, error) { + returnVal := make([]byte, expectsize) + res := C.EVP_CIPHER_CTX_ctrl(ctx.ctx, C.int(code), C.int(arg), + unsafe.Pointer(&returnVal[0])) + if res != 1 { + return nil, fmt.Errorf("failed to get code %d with arg %d [result %d]", + code, arg, res) + } + return returnVal, nil +} + +type EncryptionCipherCtx interface { + CipherCtx + + // pass in plaintext, get back ciphertext. can be called + // multiple times as needed + EncryptUpdate(input []byte) ([]byte, error) + + // call after all plaintext has been passed in; may return + // additional ciphertext if needed to finish off a block + // or extra padding information + EncryptFinal() ([]byte, error) +} + +type DecryptionCipherCtx interface { + CipherCtx + + // pass in ciphertext, get back plaintext. can be called + // multiple times as needed + DecryptUpdate(input []byte) ([]byte, error) + + // call after all ciphertext has been passed in; may return + // additional plaintext if needed to finish off a block + DecryptFinal() ([]byte, error) +} + +type encryptionCipherCtx struct { + *cipherCtx +} + +type decryptionCipherCtx struct { + *cipherCtx +} + +func newEncryptionCipherCtx(c *Cipher, e *Engine, key, iv []byte) ( + *encryptionCipherCtx, error) { + if c == nil { + return nil, errors.New("null cipher not allowed") + } + ctx, err := newCipherCtx() + if err != nil { + return nil, err + } + var eptr *C.ENGINE + if e != nil { + eptr = e.e + } + if 1 != C.EVP_EncryptInit_ex(ctx.ctx, c.ptr, eptr, nil, nil) { + return nil, errors.New("failed to initialize cipher context") + } + err = ctx.applyKeyAndIV(key, iv) + if err != nil { + return nil, err + } + return &encryptionCipherCtx{cipherCtx: ctx}, nil +} + +func newDecryptionCipherCtx(c *Cipher, e *Engine, key, iv []byte) ( + *decryptionCipherCtx, error) { + if c == nil { + return nil, errors.New("null cipher not allowed") + } + ctx, err := newCipherCtx() + if err != nil { + return nil, err + } + var eptr *C.ENGINE + if e != nil { + eptr = e.e + } + if 1 != C.EVP_DecryptInit_ex(ctx.ctx, c.ptr, eptr, nil, nil) { + return nil, errors.New("failed to initialize cipher context") + } + err = ctx.applyKeyAndIV(key, iv) + if err != nil { + return nil, err + } + return &decryptionCipherCtx{cipherCtx: ctx}, nil +} + +func NewEncryptionCipherCtx(c *Cipher, e *Engine, key, iv []byte) ( + EncryptionCipherCtx, error) { + return newEncryptionCipherCtx(c, e, key, iv) +} + +func NewDecryptionCipherCtx(c *Cipher, e *Engine, key, iv []byte) ( + DecryptionCipherCtx, error) { + return newDecryptionCipherCtx(c, e, key, iv) +} + +func (ctx *encryptionCipherCtx) EncryptUpdate(input []byte) ([]byte, error) { + if len(input) == 0 { + return nil, nil + } + outbuf := make([]byte, len(input)+ctx.BlockSize()) + outlen := C.int(len(outbuf)) + res := C.EVP_EncryptUpdate(ctx.ctx, (*C.uchar)(&outbuf[0]), &outlen, + (*C.uchar)(&input[0]), C.int(len(input))) + if res != 1 { + return nil, fmt.Errorf("failed to encrypt [result %d]", res) + } + return outbuf[:outlen], nil +} + +func (ctx *decryptionCipherCtx) DecryptUpdate(input []byte) ([]byte, error) { + if len(input) == 0 { + return nil, nil + } + outbuf := make([]byte, len(input)+ctx.BlockSize()) + outlen := C.int(len(outbuf)) + res := C.EVP_DecryptUpdate(ctx.ctx, (*C.uchar)(&outbuf[0]), &outlen, + (*C.uchar)(&input[0]), C.int(len(input))) + if res != 1 { + return nil, fmt.Errorf("failed to decrypt [result %d]", res) + } + return outbuf[:outlen], nil +} + +func (ctx *encryptionCipherCtx) EncryptFinal() ([]byte, error) { + outbuf := make([]byte, ctx.BlockSize()) + var outlen C.int + if 1 != C.EVP_EncryptFinal_ex(ctx.ctx, (*C.uchar)(&outbuf[0]), &outlen) { + return nil, errors.New("encryption failed") + } + return outbuf[:outlen], nil +} + +func (ctx *decryptionCipherCtx) DecryptFinal() ([]byte, error) { + outbuf := make([]byte, ctx.BlockSize()) + var outlen C.int + if 1 != C.EVP_DecryptFinal_ex(ctx.ctx, (*C.uchar)(&outbuf[0]), &outlen) { + // this may mean the tag failed to verify- all previous plaintext + // returned must be considered faked and invalid + return nil, errors.New("decryption failed") + } + return outbuf[:outlen], nil +} diff --git a/vendor/github.com/spacemonkeygo/openssl/ciphers_gcm.go b/vendor/github.com/spacemonkeygo/openssl/ciphers_gcm.go new file mode 100644 index 00000000..7b08e0fd --- /dev/null +++ b/vendor/github.com/spacemonkeygo/openssl/ciphers_gcm.go @@ -0,0 +1,152 @@ +// Copyright (C) 2017. See 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 openssl + +// #include +import "C" + +import ( + "errors" + "fmt" +) + +type AuthenticatedEncryptionCipherCtx interface { + EncryptionCipherCtx + + // data passed in to ExtraData() is part of the final output; it is + // not encrypted itself, but is part of the authenticated data. when + // decrypting or authenticating, pass back with the decryption + // context's ExtraData() + ExtraData([]byte) error + + // use after finalizing encryption to get the authenticating tag + GetTag() ([]byte, error) +} + +type AuthenticatedDecryptionCipherCtx interface { + DecryptionCipherCtx + + // pass in any extra data that was added during encryption with the + // encryption context's ExtraData() + ExtraData([]byte) error + + // use before finalizing decryption to tell the library what the + // tag is expected to be + SetTag([]byte) error +} + +type authEncryptionCipherCtx struct { + *encryptionCipherCtx +} + +type authDecryptionCipherCtx struct { + *decryptionCipherCtx +} + +func getGCMCipher(blocksize int) (*Cipher, error) { + var cipherptr *C.EVP_CIPHER + switch blocksize { + case 256: + cipherptr = C.EVP_aes_256_gcm() + case 192: + cipherptr = C.EVP_aes_192_gcm() + case 128: + cipherptr = C.EVP_aes_128_gcm() + default: + return nil, fmt.Errorf("unknown block size %d", blocksize) + } + return &Cipher{ptr: cipherptr}, nil +} + +func NewGCMEncryptionCipherCtx(blocksize int, e *Engine, key, iv []byte) ( + AuthenticatedEncryptionCipherCtx, error) { + cipher, err := getGCMCipher(blocksize) + if err != nil { + return nil, err + } + ctx, err := newEncryptionCipherCtx(cipher, e, key, nil) + if err != nil { + return nil, err + } + if len(iv) > 0 { + err := ctx.setCtrl(C.EVP_CTRL_GCM_SET_IVLEN, len(iv)) + if err != nil { + return nil, fmt.Errorf("could not set IV len to %d: %s", + len(iv), err) + } + if 1 != C.EVP_EncryptInit_ex(ctx.ctx, nil, nil, nil, + (*C.uchar)(&iv[0])) { + return nil, errors.New("failed to apply IV") + } + } + return &authEncryptionCipherCtx{encryptionCipherCtx: ctx}, nil +} + +func NewGCMDecryptionCipherCtx(blocksize int, e *Engine, key, iv []byte) ( + AuthenticatedDecryptionCipherCtx, error) { + cipher, err := getGCMCipher(blocksize) + if err != nil { + return nil, err + } + ctx, err := newDecryptionCipherCtx(cipher, e, key, nil) + if err != nil { + return nil, err + } + if len(iv) > 0 { + err := ctx.setCtrl(C.EVP_CTRL_GCM_SET_IVLEN, len(iv)) + if err != nil { + return nil, fmt.Errorf("could not set IV len to %d: %s", + len(iv), err) + } + if 1 != C.EVP_DecryptInit_ex(ctx.ctx, nil, nil, nil, + (*C.uchar)(&iv[0])) { + return nil, errors.New("failed to apply IV") + } + } + return &authDecryptionCipherCtx{decryptionCipherCtx: ctx}, nil +} + +func (ctx *authEncryptionCipherCtx) ExtraData(aad []byte) error { + if aad == nil { + return nil + } + var outlen C.int + if 1 != C.EVP_EncryptUpdate(ctx.ctx, nil, &outlen, (*C.uchar)(&aad[0]), + C.int(len(aad))) { + return errors.New("failed to add additional authenticated data") + } + return nil +} + +func (ctx *authDecryptionCipherCtx) ExtraData(aad []byte) error { + if aad == nil { + return nil + } + var outlen C.int + if 1 != C.EVP_DecryptUpdate(ctx.ctx, nil, &outlen, (*C.uchar)(&aad[0]), + C.int(len(aad))) { + return errors.New("failed to add additional authenticated data") + } + return nil +} + +func (ctx *authEncryptionCipherCtx) GetTag() ([]byte, error) { + return ctx.getCtrlBytes(C.EVP_CTRL_GCM_GET_TAG, GCM_TAG_MAXLEN, + GCM_TAG_MAXLEN) +} + +func (ctx *authDecryptionCipherCtx) SetTag(tag []byte) error { + return ctx.setCtrlBytes(C.EVP_CTRL_GCM_SET_TAG, len(tag), tag) +} diff --git a/vendor/github.com/spacemonkeygo/openssl/conn.go b/vendor/github.com/spacemonkeygo/openssl/conn.go new file mode 100644 index 00000000..964551cd --- /dev/null +++ b/vendor/github.com/spacemonkeygo/openssl/conn.go @@ -0,0 +1,620 @@ +// Copyright (C) 2017. See 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 openssl + +// #include "shim.h" +import "C" + +import ( + "errors" + "fmt" + "io" + "net" + "runtime" + "sync" + "time" + "unsafe" + + "github.com/spacemonkeygo/openssl/utils" +) + +var ( + zeroReturn = errors.New("zero return") + wantRead = errors.New("want read") + wantWrite = errors.New("want write") + tryAgain = errors.New("try again") +) + +type Conn struct { + *SSL + + conn net.Conn + ctx *Ctx // for gc + into_ssl *readBio + from_ssl *writeBio + is_shutdown bool + mtx sync.Mutex + want_read_future *utils.Future +} + +type VerifyResult int + +const ( + Ok VerifyResult = C.X509_V_OK + UnableToGetIssuerCert VerifyResult = C.X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT + UnableToGetCrl VerifyResult = C.X509_V_ERR_UNABLE_TO_GET_CRL + UnableToDecryptCertSignature VerifyResult = C.X509_V_ERR_UNABLE_TO_DECRYPT_CERT_SIGNATURE + UnableToDecryptCrlSignature VerifyResult = C.X509_V_ERR_UNABLE_TO_DECRYPT_CRL_SIGNATURE + UnableToDecodeIssuerPublicKey VerifyResult = C.X509_V_ERR_UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY + CertSignatureFailure VerifyResult = C.X509_V_ERR_CERT_SIGNATURE_FAILURE + CrlSignatureFailure VerifyResult = C.X509_V_ERR_CRL_SIGNATURE_FAILURE + CertNotYetValid VerifyResult = C.X509_V_ERR_CERT_NOT_YET_VALID + CertHasExpired VerifyResult = C.X509_V_ERR_CERT_HAS_EXPIRED + CrlNotYetValid VerifyResult = C.X509_V_ERR_CRL_NOT_YET_VALID + CrlHasExpired VerifyResult = C.X509_V_ERR_CRL_HAS_EXPIRED + ErrorInCertNotBeforeField VerifyResult = C.X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD + ErrorInCertNotAfterField VerifyResult = C.X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD + ErrorInCrlLastUpdateField VerifyResult = C.X509_V_ERR_ERROR_IN_CRL_LAST_UPDATE_FIELD + ErrorInCrlNextUpdateField VerifyResult = C.X509_V_ERR_ERROR_IN_CRL_NEXT_UPDATE_FIELD + OutOfMem VerifyResult = C.X509_V_ERR_OUT_OF_MEM + DepthZeroSelfSignedCert VerifyResult = C.X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT + SelfSignedCertInChain VerifyResult = C.X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN + UnableToGetIssuerCertLocally VerifyResult = C.X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY + UnableToVerifyLeafSignature VerifyResult = C.X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE + CertChainTooLong VerifyResult = C.X509_V_ERR_CERT_CHAIN_TOO_LONG + CertRevoked VerifyResult = C.X509_V_ERR_CERT_REVOKED + InvalidCa VerifyResult = C.X509_V_ERR_INVALID_CA + PathLengthExceeded VerifyResult = C.X509_V_ERR_PATH_LENGTH_EXCEEDED + InvalidPurpose VerifyResult = C.X509_V_ERR_INVALID_PURPOSE + CertUntrusted VerifyResult = C.X509_V_ERR_CERT_UNTRUSTED + CertRejected VerifyResult = C.X509_V_ERR_CERT_REJECTED + SubjectIssuerMismatch VerifyResult = C.X509_V_ERR_SUBJECT_ISSUER_MISMATCH + AkidSkidMismatch VerifyResult = C.X509_V_ERR_AKID_SKID_MISMATCH + AkidIssuerSerialMismatch VerifyResult = C.X509_V_ERR_AKID_ISSUER_SERIAL_MISMATCH + KeyusageNoCertsign VerifyResult = C.X509_V_ERR_KEYUSAGE_NO_CERTSIGN + UnableToGetCrlIssuer VerifyResult = C.X509_V_ERR_UNABLE_TO_GET_CRL_ISSUER + UnhandledCriticalExtension VerifyResult = C.X509_V_ERR_UNHANDLED_CRITICAL_EXTENSION + KeyusageNoCrlSign VerifyResult = C.X509_V_ERR_KEYUSAGE_NO_CRL_SIGN + UnhandledCriticalCrlExtension VerifyResult = C.X509_V_ERR_UNHANDLED_CRITICAL_CRL_EXTENSION + InvalidNonCa VerifyResult = C.X509_V_ERR_INVALID_NON_CA + ProxyPathLengthExceeded VerifyResult = C.X509_V_ERR_PROXY_PATH_LENGTH_EXCEEDED + KeyusageNoDigitalSignature VerifyResult = C.X509_V_ERR_KEYUSAGE_NO_DIGITAL_SIGNATURE + ProxyCertificatesNotAllowed VerifyResult = C.X509_V_ERR_PROXY_CERTIFICATES_NOT_ALLOWED + InvalidExtension VerifyResult = C.X509_V_ERR_INVALID_EXTENSION + InvalidPolicyExtension VerifyResult = C.X509_V_ERR_INVALID_POLICY_EXTENSION + NoExplicitPolicy VerifyResult = C.X509_V_ERR_NO_EXPLICIT_POLICY + UnnestedResource VerifyResult = C.X509_V_ERR_UNNESTED_RESOURCE + ApplicationVerification VerifyResult = C.X509_V_ERR_APPLICATION_VERIFICATION +) + +func newSSL(ctx *C.SSL_CTX) (*C.SSL, error) { + runtime.LockOSThread() + defer runtime.UnlockOSThread() + ssl := C.SSL_new(ctx) + if ssl == nil { + return nil, errorFromErrorQueue() + } + return ssl, nil +} + +func newConn(conn net.Conn, ctx *Ctx) (*Conn, error) { + ssl, err := newSSL(ctx.ctx) + if err != nil { + return nil, err + } + + into_ssl := &readBio{} + from_ssl := &writeBio{} + + if ctx.GetMode()&ReleaseBuffers > 0 { + into_ssl.release_buffers = true + from_ssl.release_buffers = true + } + + into_ssl_cbio := into_ssl.MakeCBIO() + from_ssl_cbio := from_ssl.MakeCBIO() + if into_ssl_cbio == nil || from_ssl_cbio == nil { + // these frees are null safe + C.BIO_free(into_ssl_cbio) + C.BIO_free(from_ssl_cbio) + C.SSL_free(ssl) + return nil, errors.New("failed to allocate memory BIO") + } + + // the ssl object takes ownership of these objects now + C.SSL_set_bio(ssl, into_ssl_cbio, from_ssl_cbio) + + s := &SSL{ssl: ssl} + C.SSL_set_ex_data(s.ssl, get_ssl_idx(), unsafe.Pointer(s)) + + c := &Conn{ + SSL: s, + + conn: conn, + ctx: ctx, + into_ssl: into_ssl, + from_ssl: from_ssl} + runtime.SetFinalizer(c, func(c *Conn) { + c.into_ssl.Disconnect(into_ssl_cbio) + c.from_ssl.Disconnect(from_ssl_cbio) + C.SSL_free(c.ssl) + }) + return c, nil +} + +// Client wraps an existing stream connection and puts it in the connect state +// for any subsequent handshakes. +// +// IMPORTANT NOTE: if you use this method instead of Dial to construct an SSL +// connection, you are responsible for verifying the peer's hostname. +// Otherwise, you are vulnerable to MITM attacks. +// +// Client also does not set up SNI for you like Dial does. +// +// Client connections probably won't work for you unless you set a verify +// location or add some certs to the certificate store of the client context +// you're using. This library is not nice enough to use the system certificate +// store by default for you yet. +func Client(conn net.Conn, ctx *Ctx) (*Conn, error) { + c, err := newConn(conn, ctx) + if err != nil { + return nil, err + } + C.SSL_set_connect_state(c.ssl) + return c, nil +} + +// Server wraps an existing stream connection and puts it in the accept state +// for any subsequent handshakes. +func Server(conn net.Conn, ctx *Ctx) (*Conn, error) { + c, err := newConn(conn, ctx) + if err != nil { + return nil, err + } + C.SSL_set_accept_state(c.ssl) + return c, nil +} + +func (c *Conn) GetCtx() *Ctx { return c.ctx } + +func (c *Conn) CurrentCipher() (string, error) { + p := C.X_SSL_get_cipher_name(c.ssl) + if p == nil { + return "", errors.New("Session not established") + } + + return C.GoString(p), nil +} + +func (c *Conn) fillInputBuffer() error { + for { + n, err := c.into_ssl.ReadFromOnce(c.conn) + if n == 0 && err == nil { + continue + } + if err == io.EOF { + c.into_ssl.MarkEOF() + return c.Close() + } + return err + } +} + +func (c *Conn) flushOutputBuffer() error { + _, err := c.from_ssl.WriteTo(c.conn) + return err +} + +func (c *Conn) getErrorHandler(rv C.int, errno error) func() error { + errcode := C.SSL_get_error(c.ssl, rv) + switch errcode { + case C.SSL_ERROR_ZERO_RETURN: + return func() error { + c.Close() + return io.ErrUnexpectedEOF + } + case C.SSL_ERROR_WANT_READ: + go c.flushOutputBuffer() + if c.want_read_future != nil { + want_read_future := c.want_read_future + return func() error { + _, err := want_read_future.Get() + return err + } + } + c.want_read_future = utils.NewFuture() + want_read_future := c.want_read_future + return func() (err error) { + defer func() { + c.mtx.Lock() + c.want_read_future = nil + c.mtx.Unlock() + want_read_future.Set(nil, err) + }() + err = c.fillInputBuffer() + if err != nil { + return err + } + return tryAgain + } + case C.SSL_ERROR_WANT_WRITE: + return func() error { + err := c.flushOutputBuffer() + if err != nil { + return err + } + return tryAgain + } + case C.SSL_ERROR_SYSCALL: + var err error + if C.ERR_peek_error() == 0 { + switch rv { + case 0: + err = errors.New("protocol-violating EOF") + case -1: + err = errno + default: + err = errorFromErrorQueue() + } + } else { + err = errorFromErrorQueue() + } + return func() error { return err } + default: + err := errorFromErrorQueue() + return func() error { return err } + } +} + +func (c *Conn) handleError(errcb func() error) error { + if errcb != nil { + return errcb() + } + return nil +} + +func (c *Conn) handshake() func() error { + c.mtx.Lock() + defer c.mtx.Unlock() + if c.is_shutdown { + return func() error { return io.ErrUnexpectedEOF } + } + runtime.LockOSThread() + defer runtime.UnlockOSThread() + rv, errno := C.SSL_do_handshake(c.ssl) + if rv > 0 { + return nil + } + return c.getErrorHandler(rv, errno) +} + +// Handshake performs an SSL handshake. If a handshake is not manually +// triggered, it will run before the first I/O on the encrypted stream. +func (c *Conn) Handshake() error { + err := tryAgain + for err == tryAgain { + err = c.handleError(c.handshake()) + } + go c.flushOutputBuffer() + return err +} + +// PeerCertificate returns the Certificate of the peer with which you're +// communicating. Only valid after a handshake. +func (c *Conn) PeerCertificate() (*Certificate, error) { + c.mtx.Lock() + defer c.mtx.Unlock() + if c.is_shutdown { + return nil, errors.New("connection closed") + } + x := C.SSL_get_peer_certificate(c.ssl) + if x == nil { + return nil, errors.New("no peer certificate found") + } + cert := &Certificate{x: x} + runtime.SetFinalizer(cert, func(cert *Certificate) { + C.X509_free(cert.x) + }) + return cert, nil +} + +// loadCertificateStack loads up a stack of x509 certificates and returns them, +// handling memory ownership. +func (c *Conn) loadCertificateStack(sk *C.struct_stack_st_X509) ( + rv []*Certificate) { + + sk_num := int(C.X_sk_X509_num(sk)) + rv = make([]*Certificate, 0, sk_num) + for i := 0; i < sk_num; i++ { + x := C.X_sk_X509_value(sk, C.int(i)) + // ref holds on to the underlying connection memory so we don't need to + // worry about incrementing refcounts manually or freeing the X509 + rv = append(rv, &Certificate{x: x, ref: c}) + } + return rv +} + +// PeerCertificateChain returns the certificate chain of the peer. If called on +// the client side, the stack also contains the peer's certificate; if called +// on the server side, the peer's certificate must be obtained separately using +// PeerCertificate. +func (c *Conn) PeerCertificateChain() (rv []*Certificate, err error) { + c.mtx.Lock() + defer c.mtx.Unlock() + if c.is_shutdown { + return nil, errors.New("connection closed") + } + sk := C.SSL_get_peer_cert_chain(c.ssl) + if sk == nil { + return nil, errors.New("no peer certificates found") + } + return c.loadCertificateStack(sk), nil +} + +type ConnectionState struct { + Certificate *Certificate + CertificateError error + CertificateChain []*Certificate + CertificateChainError error + SessionReused bool +} + +func (c *Conn) ConnectionState() (rv ConnectionState) { + rv.Certificate, rv.CertificateError = c.PeerCertificate() + rv.CertificateChain, rv.CertificateChainError = c.PeerCertificateChain() + rv.SessionReused = c.SessionReused() + return +} + +func (c *Conn) shutdown() func() error { + c.mtx.Lock() + defer c.mtx.Unlock() + runtime.LockOSThread() + defer runtime.UnlockOSThread() + rv, errno := C.SSL_shutdown(c.ssl) + if rv > 0 { + return nil + } + if rv == 0 { + // The OpenSSL docs say that in this case, the shutdown is not + // finished, and we should call SSL_shutdown() a second time, if a + // bidirectional shutdown is going to be performed. Further, the + // output of SSL_get_error may be misleading, as an erroneous + // SSL_ERROR_SYSCALL may be flagged even though no error occurred. + // So, TODO: revisit bidrectional shutdown, possibly trying again. + // Note: some broken clients won't engage in bidirectional shutdown + // without tickling them to close by sending a TCP_FIN packet, or + // shutting down the write-side of the connection. + return nil + } else { + return c.getErrorHandler(rv, errno) + } +} + +func (c *Conn) shutdownLoop() error { + err := tryAgain + shutdown_tries := 0 + for err == tryAgain { + shutdown_tries = shutdown_tries + 1 + err = c.handleError(c.shutdown()) + if err == nil { + return c.flushOutputBuffer() + } + if err == tryAgain && shutdown_tries >= 2 { + return errors.New("shutdown requested a third time?") + } + } + if err == io.ErrUnexpectedEOF { + err = nil + } + return err +} + +// Close shuts down the SSL connection and closes the underlying wrapped +// connection. +func (c *Conn) Close() error { + c.mtx.Lock() + if c.is_shutdown { + c.mtx.Unlock() + return nil + } + c.is_shutdown = true + c.mtx.Unlock() + var errs utils.ErrorGroup + errs.Add(c.shutdownLoop()) + errs.Add(c.conn.Close()) + return errs.Finalize() +} + +func (c *Conn) read(b []byte) (int, func() error) { + if len(b) == 0 { + return 0, nil + } + c.mtx.Lock() + defer c.mtx.Unlock() + if c.is_shutdown { + return 0, func() error { return io.EOF } + } + runtime.LockOSThread() + defer runtime.UnlockOSThread() + rv, errno := C.SSL_read(c.ssl, unsafe.Pointer(&b[0]), C.int(len(b))) + if rv > 0 { + return int(rv), nil + } + return 0, c.getErrorHandler(rv, errno) +} + +// Read reads up to len(b) bytes into b. It returns the number of bytes read +// and an error if applicable. io.EOF is returned when the caller can expect +// to see no more data. +func (c *Conn) Read(b []byte) (n int, err error) { + if len(b) == 0 { + return 0, nil + } + err = tryAgain + for err == tryAgain { + n, errcb := c.read(b) + err = c.handleError(errcb) + if err == nil { + go c.flushOutputBuffer() + return n, nil + } + if err == io.ErrUnexpectedEOF { + err = io.EOF + } + } + return 0, err +} + +func (c *Conn) write(b []byte) (int, func() error) { + if len(b) == 0 { + return 0, nil + } + c.mtx.Lock() + defer c.mtx.Unlock() + if c.is_shutdown { + err := errors.New("connection closed") + return 0, func() error { return err } + } + runtime.LockOSThread() + defer runtime.UnlockOSThread() + rv, errno := C.SSL_write(c.ssl, unsafe.Pointer(&b[0]), C.int(len(b))) + if rv > 0 { + return int(rv), nil + } + return 0, c.getErrorHandler(rv, errno) +} + +// Write will encrypt the contents of b and write it to the underlying stream. +// Performance will be vastly improved if the size of b is a multiple of +// SSLRecordSize. +func (c *Conn) Write(b []byte) (written int, err error) { + if len(b) == 0 { + return 0, nil + } + err = tryAgain + for err == tryAgain { + n, errcb := c.write(b) + err = c.handleError(errcb) + if err == nil { + return n, c.flushOutputBuffer() + } + } + return 0, err +} + +// VerifyHostname pulls the PeerCertificate and calls VerifyHostname on the +// certificate. +func (c *Conn) VerifyHostname(host string) error { + cert, err := c.PeerCertificate() + if err != nil { + return err + } + return cert.VerifyHostname(host) +} + +// LocalAddr returns the underlying connection's local address +func (c *Conn) LocalAddr() net.Addr { + return c.conn.LocalAddr() +} + +// RemoteAddr returns the underlying connection's remote address +func (c *Conn) RemoteAddr() net.Addr { + return c.conn.RemoteAddr() +} + +// SetDeadline calls SetDeadline on the underlying connection. +func (c *Conn) SetDeadline(t time.Time) error { + return c.conn.SetDeadline(t) +} + +// SetReadDeadline calls SetReadDeadline on the underlying connection. +func (c *Conn) SetReadDeadline(t time.Time) error { + return c.conn.SetReadDeadline(t) +} + +// SetWriteDeadline calls SetWriteDeadline on the underlying connection. +func (c *Conn) SetWriteDeadline(t time.Time) error { + return c.conn.SetWriteDeadline(t) +} + +func (c *Conn) UnderlyingConn() net.Conn { + return c.conn +} + +func (c *Conn) SetTlsExtHostName(name string) error { + cname := C.CString(name) + defer C.free(unsafe.Pointer(cname)) + runtime.LockOSThread() + defer runtime.UnlockOSThread() + if C.X_SSL_set_tlsext_host_name(c.ssl, cname) == 0 { + return errorFromErrorQueue() + } + return nil +} + +func (c *Conn) VerifyResult() VerifyResult { + return VerifyResult(C.SSL_get_verify_result(c.ssl)) +} + +func (c *Conn) SessionReused() bool { + return C.X_SSL_session_reused(c.ssl) == 1 +} + +func (c *Conn) GetSession() ([]byte, error) { + runtime.LockOSThread() + defer runtime.UnlockOSThread() + + // get1 increases the refcount of the session, so we have to free it. + session := (*C.SSL_SESSION)(C.SSL_get1_session(c.ssl)) + if session == nil { + return nil, errors.New("failed to get session") + } + defer C.SSL_SESSION_free(session) + + // get the size of the encoding + slen := C.i2d_SSL_SESSION(session, nil) + + buf := (*C.uchar)(C.malloc(C.size_t(slen))) + defer C.free(unsafe.Pointer(buf)) + + // this modifies the value of buf (seriously), so we have to pass in a temp + // var so that we can actually read the bytes from buf. + tmp := buf + slen2 := C.i2d_SSL_SESSION(session, &tmp) + if slen != slen2 { + return nil, errors.New("session had different lengths") + } + + return C.GoBytes(unsafe.Pointer(buf), slen), nil +} + +func (c *Conn) setSession(session []byte) error { + runtime.LockOSThread() + defer runtime.UnlockOSThread() + + ptr := (*C.uchar)(&session[0]) + s := C.d2i_SSL_SESSION(nil, &ptr, C.long(len(session))) + if s == nil { + return fmt.Errorf("unable to load session: %s", errorFromErrorQueue()) + } + defer C.SSL_SESSION_free(s) + + ret := C.SSL_set_session(c.ssl, s) + if ret != 1 { + return fmt.Errorf("unable to set session: %s", errorFromErrorQueue()) + } + return nil +} diff --git a/vendor/github.com/spacemonkeygo/openssl/ctx.go b/vendor/github.com/spacemonkeygo/openssl/ctx.go new file mode 100644 index 00000000..33befc40 --- /dev/null +++ b/vendor/github.com/spacemonkeygo/openssl/ctx.go @@ -0,0 +1,568 @@ +// Copyright (C) 2017. See 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 openssl + +// #include "shim.h" +import "C" + +import ( + "errors" + "fmt" + "io/ioutil" + "os" + "runtime" + "sync" + "time" + "unsafe" + + "github.com/spacemonkeygo/spacelog" +) + +var ( + ssl_ctx_idx = C.X_SSL_CTX_new_index() + + logger = spacelog.GetLogger() +) + +type Ctx struct { + ctx *C.SSL_CTX + cert *Certificate + chain []*Certificate + key PrivateKey + verify_cb VerifyCallback + sni_cb TLSExtServernameCallback + + ticket_store_mu sync.Mutex + ticket_store *TicketStore +} + +//export get_ssl_ctx_idx +func get_ssl_ctx_idx() C.int { + return ssl_ctx_idx +} + +func newCtx(method *C.SSL_METHOD) (*Ctx, error) { + runtime.LockOSThread() + defer runtime.UnlockOSThread() + ctx := C.SSL_CTX_new(method) + if ctx == nil { + return nil, errorFromErrorQueue() + } + c := &Ctx{ctx: ctx} + C.SSL_CTX_set_ex_data(ctx, get_ssl_ctx_idx(), unsafe.Pointer(c)) + runtime.SetFinalizer(c, func(c *Ctx) { + C.SSL_CTX_free(c.ctx) + }) + return c, nil +} + +type SSLVersion int + +const ( + SSLv3 SSLVersion = 0x02 // Vulnerable to "POODLE" attack. + TLSv1 SSLVersion = 0x03 + TLSv1_1 SSLVersion = 0x04 + TLSv1_2 SSLVersion = 0x05 + + // Make sure to disable SSLv2 and SSLv3 if you use this. SSLv3 is vulnerable + // to the "POODLE" attack, and SSLv2 is what, just don't even. + AnyVersion SSLVersion = 0x06 +) + +// NewCtxWithVersion creates an SSL context that is specific to the provided +// SSL version. See http://www.openssl.org/docs/ssl/SSL_CTX_new.html for more. +func NewCtxWithVersion(version SSLVersion) (*Ctx, error) { + var method *C.SSL_METHOD + switch version { + case SSLv3: + method = C.X_SSLv3_method() + case TLSv1: + method = C.X_TLSv1_method() + case TLSv1_1: + method = C.X_TLSv1_1_method() + case TLSv1_2: + method = C.X_TLSv1_2_method() + case AnyVersion: + method = C.X_SSLv23_method() + } + if method == nil { + return nil, errors.New("unknown ssl/tls version") + } + return newCtx(method) +} + +// NewCtx creates a context that supports any TLS version 1.0 and newer. +func NewCtx() (*Ctx, error) { + c, err := NewCtxWithVersion(AnyVersion) + if err == nil { + c.SetOptions(NoSSLv2 | NoSSLv3) + } + return c, err +} + +// NewCtxFromFiles calls NewCtx, loads the provided files, and configures the +// context to use them. +func NewCtxFromFiles(cert_file string, key_file string) (*Ctx, error) { + ctx, err := NewCtx() + if err != nil { + return nil, err + } + + cert_bytes, err := ioutil.ReadFile(cert_file) + if err != nil { + return nil, err + } + + certs := SplitPEM(cert_bytes) + if len(certs) == 0 { + return nil, fmt.Errorf("No PEM certificate found in '%s'", cert_file) + } + first, certs := certs[0], certs[1:] + cert, err := LoadCertificateFromPEM(first) + if err != nil { + return nil, err + } + + err = ctx.UseCertificate(cert) + if err != nil { + return nil, err + } + + for _, pem := range certs { + cert, err := LoadCertificateFromPEM(pem) + if err != nil { + return nil, err + } + err = ctx.AddChainCertificate(cert) + if err != nil { + return nil, err + } + } + + key_bytes, err := ioutil.ReadFile(key_file) + if err != nil { + return nil, err + } + + key, err := LoadPrivateKeyFromPEM(key_bytes) + if err != nil { + return nil, err + } + + err = ctx.UsePrivateKey(key) + if err != nil { + return nil, err + } + + return ctx, nil +} + +// EllipticCurve repesents the ASN.1 OID of an elliptic curve. +// see https://www.openssl.org/docs/apps/ecparam.html for a list of implemented curves. +type EllipticCurve int + +const ( + // P-256: X9.62/SECG curve over a 256 bit prime field + Prime256v1 EllipticCurve = C.NID_X9_62_prime256v1 + // P-384: NIST/SECG curve over a 384 bit prime field + Secp384r1 EllipticCurve = C.NID_secp384r1 + // P-521: NIST/SECG curve over a 521 bit prime field + Secp521r1 EllipticCurve = C.NID_secp521r1 +) + +// SetEllipticCurve sets the elliptic curve used by the SSL context to +// enable an ECDH cipher suite to be selected during the handshake. +func (c *Ctx) SetEllipticCurve(curve EllipticCurve) error { + runtime.LockOSThread() + defer runtime.UnlockOSThread() + + k := C.EC_KEY_new_by_curve_name(C.int(curve)) + if k == nil { + return errors.New("Unknown curve") + } + defer C.EC_KEY_free(k) + + if int(C.X_SSL_CTX_set_tmp_ecdh(c.ctx, k)) != 1 { + return errorFromErrorQueue() + } + + return nil +} + +// UseCertificate configures the context to present the given certificate to +// peers. +func (c *Ctx) UseCertificate(cert *Certificate) error { + runtime.LockOSThread() + defer runtime.UnlockOSThread() + c.cert = cert + if int(C.SSL_CTX_use_certificate(c.ctx, cert.x)) != 1 { + return errorFromErrorQueue() + } + return nil +} + +// AddChainCertificate adds a certificate to the chain presented in the +// handshake. +func (c *Ctx) AddChainCertificate(cert *Certificate) error { + runtime.LockOSThread() + defer runtime.UnlockOSThread() + c.chain = append(c.chain, cert) + if int(C.X_SSL_CTX_add_extra_chain_cert(c.ctx, cert.x)) != 1 { + return errorFromErrorQueue() + } + // OpenSSL takes ownership via SSL_CTX_add_extra_chain_cert + runtime.SetFinalizer(cert, nil) + return nil +} + +// UsePrivateKey configures the context to use the given private key for SSL +// handshakes. +func (c *Ctx) UsePrivateKey(key PrivateKey) error { + runtime.LockOSThread() + defer runtime.UnlockOSThread() + c.key = key + if int(C.SSL_CTX_use_PrivateKey(c.ctx, key.evpPKey())) != 1 { + return errorFromErrorQueue() + } + return nil +} + +type CertificateStore struct { + store *C.X509_STORE + // for GC + ctx *Ctx + certs []*Certificate +} + +// Allocate a new, empty CertificateStore +func NewCertificateStore() (*CertificateStore, error) { + s := C.X509_STORE_new() + if s == nil { + return nil, errors.New("failed to allocate X509_STORE") + } + store := &CertificateStore{store: s} + runtime.SetFinalizer(store, func(s *CertificateStore) { + C.X509_STORE_free(s.store) + }) + return store, nil +} + +// Parse a chained PEM file, loading all certificates into the Store. +func (s *CertificateStore) LoadCertificatesFromPEM(data []byte) error { + pems := SplitPEM(data) + for _, pem := range pems { + cert, err := LoadCertificateFromPEM(pem) + if err != nil { + return err + } + err = s.AddCertificate(cert) + if err != nil { + return err + } + } + return nil +} + +// GetCertificateStore returns the context's certificate store that will be +// used for peer validation. +func (c *Ctx) GetCertificateStore() *CertificateStore { + // we don't need to dealloc the cert store pointer here, because it points + // to a ctx internal. so we do need to keep the ctx around + return &CertificateStore{ + store: C.SSL_CTX_get_cert_store(c.ctx), + ctx: c} +} + +// AddCertificate marks the provided Certificate as a trusted certificate in +// the given CertificateStore. +func (s *CertificateStore) AddCertificate(cert *Certificate) error { + runtime.LockOSThread() + defer runtime.UnlockOSThread() + s.certs = append(s.certs, cert) + if int(C.X509_STORE_add_cert(s.store, cert.x)) != 1 { + return errorFromErrorQueue() + } + return nil +} + +type CertificateStoreCtx struct { + ctx *C.X509_STORE_CTX + ssl_ctx *Ctx +} + +func (self *CertificateStoreCtx) VerifyResult() VerifyResult { + return VerifyResult(C.X509_STORE_CTX_get_error(self.ctx)) +} + +func (self *CertificateStoreCtx) Err() error { + code := C.X509_STORE_CTX_get_error(self.ctx) + if code == C.X509_V_OK { + return nil + } + return fmt.Errorf("openssl: %s", + C.GoString(C.X509_verify_cert_error_string(C.long(code)))) +} + +func (self *CertificateStoreCtx) Depth() int { + return int(C.X509_STORE_CTX_get_error_depth(self.ctx)) +} + +// the certicate returned is only valid for the lifetime of the underlying +// X509_STORE_CTX +func (self *CertificateStoreCtx) GetCurrentCert() *Certificate { + x509 := C.X509_STORE_CTX_get_current_cert(self.ctx) + if x509 == nil { + return nil + } + // add a ref + if 1 != C.X_X509_add_ref(x509) { + return nil + } + cert := &Certificate{ + x: x509, + } + runtime.SetFinalizer(cert, func(cert *Certificate) { + C.X509_free(cert.x) + }) + return cert +} + +// LoadVerifyLocations tells the context to trust all certificate authorities +// provided in either the ca_file or the ca_path. +// See http://www.openssl.org/docs/ssl/SSL_CTX_load_verify_locations.html for +// more. +func (c *Ctx) LoadVerifyLocations(ca_file string, ca_path string) error { + runtime.LockOSThread() + defer runtime.UnlockOSThread() + var c_ca_file, c_ca_path *C.char + if ca_file != "" { + c_ca_file = C.CString(ca_file) + defer C.free(unsafe.Pointer(c_ca_file)) + } + if ca_path != "" { + c_ca_path = C.CString(ca_path) + defer C.free(unsafe.Pointer(c_ca_path)) + } + if C.SSL_CTX_load_verify_locations(c.ctx, c_ca_file, c_ca_path) != 1 { + return errorFromErrorQueue() + } + return nil +} + +type Options int + +const ( + // NoCompression is only valid if you are using OpenSSL 1.0.1 or newer + NoCompression Options = C.SSL_OP_NO_COMPRESSION + NoSSLv2 Options = C.SSL_OP_NO_SSLv2 + NoSSLv3 Options = C.SSL_OP_NO_SSLv3 + NoTLSv1 Options = C.SSL_OP_NO_TLSv1 + CipherServerPreference Options = C.SSL_OP_CIPHER_SERVER_PREFERENCE + NoSessionResumptionOrRenegotiation Options = C.SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION + NoTicket Options = C.SSL_OP_NO_TICKET +) + +// SetOptions sets context options. See +// http://www.openssl.org/docs/ssl/SSL_CTX_set_options.html +func (c *Ctx) SetOptions(options Options) Options { + return Options(C.X_SSL_CTX_set_options( + c.ctx, C.long(options))) +} + +func (c *Ctx) ClearOptions(options Options) Options { + return Options(C.X_SSL_CTX_clear_options( + c.ctx, C.long(options))) +} + +// GetOptions returns context options. See +// https://www.openssl.org/docs/ssl/SSL_CTX_set_options.html +func (c *Ctx) GetOptions() Options { + return Options(C.X_SSL_CTX_get_options(c.ctx)) +} + +type Modes int + +const ( + // ReleaseBuffers is only valid if you are using OpenSSL 1.0.1 or newer + ReleaseBuffers Modes = C.SSL_MODE_RELEASE_BUFFERS +) + +// SetMode sets context modes. See +// http://www.openssl.org/docs/ssl/SSL_CTX_set_mode.html +func (c *Ctx) SetMode(modes Modes) Modes { + return Modes(C.X_SSL_CTX_set_mode(c.ctx, C.long(modes))) +} + +// GetMode returns context modes. See +// http://www.openssl.org/docs/ssl/SSL_CTX_set_mode.html +func (c *Ctx) GetMode() Modes { + return Modes(C.X_SSL_CTX_get_mode(c.ctx)) +} + +type VerifyOptions int + +const ( + VerifyNone VerifyOptions = C.SSL_VERIFY_NONE + VerifyPeer VerifyOptions = C.SSL_VERIFY_PEER + VerifyFailIfNoPeerCert VerifyOptions = C.SSL_VERIFY_FAIL_IF_NO_PEER_CERT + VerifyClientOnce VerifyOptions = C.SSL_VERIFY_CLIENT_ONCE +) + +type VerifyCallback func(ok bool, store *CertificateStoreCtx) bool + +//export go_ssl_ctx_verify_cb_thunk +func go_ssl_ctx_verify_cb_thunk(p unsafe.Pointer, ok C.int, ctx *C.X509_STORE_CTX) C.int { + defer func() { + if err := recover(); err != nil { + logger.Critf("openssl: verify callback panic'd: %v", err) + os.Exit(1) + } + }() + verify_cb := (*Ctx)(p).verify_cb + // set up defaults just in case verify_cb is nil + if verify_cb != nil { + store := &CertificateStoreCtx{ctx: ctx} + if verify_cb(ok == 1, store) { + ok = 1 + } else { + ok = 0 + } + } + return ok +} + +// SetVerify controls peer verification settings. See +// http://www.openssl.org/docs/ssl/SSL_CTX_set_verify.html +func (c *Ctx) SetVerify(options VerifyOptions, verify_cb VerifyCallback) { + c.verify_cb = verify_cb + if verify_cb != nil { + C.SSL_CTX_set_verify(c.ctx, C.int(options), (*[0]byte)(C.X_SSL_CTX_verify_cb)) + } else { + C.SSL_CTX_set_verify(c.ctx, C.int(options), nil) + } +} + +func (c *Ctx) SetVerifyMode(options VerifyOptions) { + c.SetVerify(options, c.verify_cb) +} + +func (c *Ctx) SetVerifyCallback(verify_cb VerifyCallback) { + c.SetVerify(c.VerifyMode(), verify_cb) +} + +func (c *Ctx) GetVerifyCallback() VerifyCallback { + return c.verify_cb +} + +func (c *Ctx) VerifyMode() VerifyOptions { + return VerifyOptions(C.SSL_CTX_get_verify_mode(c.ctx)) +} + +// SetVerifyDepth controls how many certificates deep the certificate +// verification logic is willing to follow a certificate chain. See +// https://www.openssl.org/docs/ssl/SSL_CTX_set_verify.html +func (c *Ctx) SetVerifyDepth(depth int) { + C.SSL_CTX_set_verify_depth(c.ctx, C.int(depth)) +} + +// GetVerifyDepth controls how many certificates deep the certificate +// verification logic is willing to follow a certificate chain. See +// https://www.openssl.org/docs/ssl/SSL_CTX_set_verify.html +func (c *Ctx) GetVerifyDepth() int { + return int(C.SSL_CTX_get_verify_depth(c.ctx)) +} + +type TLSExtServernameCallback func(ssl *SSL) SSLTLSExtErr + +// SetTLSExtServernameCallback sets callback function for Server Name Indication +// (SNI) rfc6066 (http://tools.ietf.org/html/rfc6066). See +// http://stackoverflow.com/questions/22373332/serving-multiple-domains-in-one-box-with-sni +func (c *Ctx) SetTLSExtServernameCallback(sni_cb TLSExtServernameCallback) { + c.sni_cb = sni_cb + C.X_SSL_CTX_set_tlsext_servername_callback(c.ctx, (*[0]byte)(C.sni_cb)) +} + +func (c *Ctx) SetSessionId(session_id []byte) error { + runtime.LockOSThread() + defer runtime.UnlockOSThread() + var ptr *C.uchar + if len(session_id) > 0 { + ptr = (*C.uchar)(unsafe.Pointer(&session_id[0])) + } + if int(C.SSL_CTX_set_session_id_context(c.ctx, ptr, + C.uint(len(session_id)))) == 0 { + return errorFromErrorQueue() + } + return nil +} + +// SetCipherList sets the list of available ciphers. The format of the list is +// described at http://www.openssl.org/docs/apps/ciphers.html, but see +// http://www.openssl.org/docs/ssl/SSL_CTX_set_cipher_list.html for more. +func (c *Ctx) SetCipherList(list string) error { + runtime.LockOSThread() + defer runtime.UnlockOSThread() + clist := C.CString(list) + defer C.free(unsafe.Pointer(clist)) + if int(C.SSL_CTX_set_cipher_list(c.ctx, clist)) == 0 { + return errorFromErrorQueue() + } + return nil +} + +type SessionCacheModes int + +const ( + SessionCacheOff SessionCacheModes = C.SSL_SESS_CACHE_OFF + SessionCacheClient SessionCacheModes = C.SSL_SESS_CACHE_CLIENT + SessionCacheServer SessionCacheModes = C.SSL_SESS_CACHE_SERVER + SessionCacheBoth SessionCacheModes = C.SSL_SESS_CACHE_BOTH + NoAutoClear SessionCacheModes = C.SSL_SESS_CACHE_NO_AUTO_CLEAR + NoInternalLookup SessionCacheModes = C.SSL_SESS_CACHE_NO_INTERNAL_LOOKUP + NoInternalStore SessionCacheModes = C.SSL_SESS_CACHE_NO_INTERNAL_STORE + NoInternal SessionCacheModes = C.SSL_SESS_CACHE_NO_INTERNAL +) + +// SetSessionCacheMode enables or disables session caching. See +// http://www.openssl.org/docs/ssl/SSL_CTX_set_session_cache_mode.html +func (c *Ctx) SetSessionCacheMode(modes SessionCacheModes) SessionCacheModes { + return SessionCacheModes( + C.X_SSL_CTX_set_session_cache_mode(c.ctx, C.long(modes))) +} + +// Set session cache timeout. Returns previously set value. +// See https://www.openssl.org/docs/ssl/SSL_CTX_set_timeout.html +func (c *Ctx) SetTimeout(t time.Duration) time.Duration { + prev := C.X_SSL_CTX_set_timeout(c.ctx, C.long(t/time.Second)) + return time.Duration(prev) * time.Second +} + +// Get session cache timeout. +// See https://www.openssl.org/docs/ssl/SSL_CTX_set_timeout.html +func (c *Ctx) GetTimeout() time.Duration { + return time.Duration(C.X_SSL_CTX_get_timeout(c.ctx)) * time.Second +} + +// Set session cache size. Returns previously set value. +// https://www.openssl.org/docs/ssl/SSL_CTX_sess_set_cache_size.html +func (c *Ctx) SessSetCacheSize(t int) int { + return int(C.X_SSL_CTX_sess_set_cache_size(c.ctx, C.long(t))) +} + +// Get session cache size. +// https://www.openssl.org/docs/ssl/SSL_CTX_sess_set_cache_size.html +func (c *Ctx) SessGetCacheSize() int { + return int(C.X_SSL_CTX_sess_get_cache_size(c.ctx)) +} diff --git a/vendor/github.com/spacemonkeygo/openssl/dh.go b/vendor/github.com/spacemonkeygo/openssl/dh.go new file mode 100644 index 00000000..75ac5ad4 --- /dev/null +++ b/vendor/github.com/spacemonkeygo/openssl/dh.go @@ -0,0 +1,66 @@ +// Copyright (C) 2017. See 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 openssl + +// #include "shim.h" +import "C" +import ( + "errors" + "unsafe" +) + +// DeriveSharedSecret derives a shared secret using a private key and a peer's +// public key. +// The specific algorithm that is used depends on the types of the +// keys, but it is most commonly a variant of Diffie-Hellman. +func DeriveSharedSecret(private PrivateKey, public PublicKey) ([]byte, error) { + // Create context for the shared secret derivation + dhCtx := C.EVP_PKEY_CTX_new(private.evpPKey(), nil) + if dhCtx == nil { + return nil, errors.New("failed creating shared secret derivation context") + } + defer C.EVP_PKEY_CTX_free(dhCtx) + + // Initialize the context + if int(C.EVP_PKEY_derive_init(dhCtx)) != 1 { + return nil, errors.New("failed initializing shared secret derivation context") + } + + // Provide the peer's public key + if int(C.EVP_PKEY_derive_set_peer(dhCtx, public.evpPKey())) != 1 { + return nil, errors.New("failed adding peer public key to context") + } + + // Determine how large of a buffer we need for the shared secret + var buffLen C.size_t + if int(C.EVP_PKEY_derive(dhCtx, nil, &buffLen)) != 1 { + return nil, errors.New("failed determining shared secret length") + } + + // Allocate a buffer + buffer := C.X_OPENSSL_malloc(buffLen) + if buffer == nil { + return nil, errors.New("failed allocating buffer for shared secret") + } + defer C.X_OPENSSL_free(buffer) + + // Derive the shared secret + if int(C.EVP_PKEY_derive(dhCtx, (*C.uchar)(buffer), &buffLen)) != 1 { + return nil, errors.New("failed deriving the shared secret") + } + + secret := C.GoBytes(unsafe.Pointer(buffer), C.int(buffLen)) + return secret, nil +} diff --git a/vendor/github.com/spacemonkeygo/openssl/dhparam.go b/vendor/github.com/spacemonkeygo/openssl/dhparam.go new file mode 100644 index 00000000..294d0645 --- /dev/null +++ b/vendor/github.com/spacemonkeygo/openssl/dhparam.go @@ -0,0 +1,64 @@ +// Copyright (C) 2017. See 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 openssl + +// #include "shim.h" +import "C" + +import ( + "errors" + "runtime" + "unsafe" +) + +type DH struct { + dh *C.struct_dh_st +} + +// LoadDHParametersFromPEM loads the Diffie-Hellman parameters from +// a PEM-encoded block. +func LoadDHParametersFromPEM(pem_block []byte) (*DH, error) { + if len(pem_block) == 0 { + return nil, errors.New("empty pem block") + } + bio := C.BIO_new_mem_buf(unsafe.Pointer(&pem_block[0]), + C.int(len(pem_block))) + if bio == nil { + return nil, errors.New("failed creating bio") + } + defer C.BIO_free(bio) + + params := C.PEM_read_bio_DHparams(bio, nil, nil, nil) + if params == nil { + return nil, errors.New("failed reading dh parameters") + } + dhparams := &DH{dh: params} + runtime.SetFinalizer(dhparams, func(dhparams *DH) { + C.DH_free(dhparams.dh) + }) + return dhparams, nil +} + +// SetDHParameters sets the DH group (DH parameters) used to +// negotiate an emphemeral DH key during handshaking. +func (c *Ctx) SetDHParameters(dh *DH) error { + runtime.LockOSThread() + defer runtime.UnlockOSThread() + + if int(C.X_SSL_CTX_set_tmp_dh(c.ctx, dh.dh)) != 1 { + return errorFromErrorQueue() + } + return nil +} diff --git a/vendor/github.com/spacemonkeygo/openssl/digest.go b/vendor/github.com/spacemonkeygo/openssl/digest.go new file mode 100644 index 00000000..6d8d2635 --- /dev/null +++ b/vendor/github.com/spacemonkeygo/openssl/digest.go @@ -0,0 +1,51 @@ +// Copyright (C) 2017. See 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 openssl + +// #include "shim.h" +import "C" + +import ( + "fmt" + "unsafe" +) + +// Digest represents and openssl message digest. +type Digest struct { + ptr *C.EVP_MD +} + +// GetDigestByName returns the Digest with the name or nil and an error if the +// digest was not found. +func GetDigestByName(name string) (*Digest, error) { + cname := C.CString(name) + defer C.free(unsafe.Pointer(cname)) + p := C.X_EVP_get_digestbyname(cname) + if p == nil { + return nil, fmt.Errorf("Digest %v not found", name) + } + // we can consider digests to use static mem; don't need to free + return &Digest{ptr: p}, nil +} + +// GetDigestByName returns the Digest with the NID or nil and an error if the +// digest was not found. +func GetDigestByNid(nid NID) (*Digest, error) { + sn, err := Nid2ShortName(nid) + if err != nil { + return nil, err + } + return GetDigestByName(sn) +} diff --git a/vendor/github.com/spacemonkeygo/openssl/engine.go b/vendor/github.com/spacemonkeygo/openssl/engine.go new file mode 100644 index 00000000..78aef956 --- /dev/null +++ b/vendor/github.com/spacemonkeygo/openssl/engine.go @@ -0,0 +1,50 @@ +// Copyright (C) 2017. See 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 openssl + +/* +#include "openssl/engine.h" +*/ +import "C" + +import ( + "fmt" + "runtime" + "unsafe" +) + +type Engine struct { + e *C.ENGINE +} + +func EngineById(name string) (*Engine, error) { + cname := C.CString(name) + defer C.free(unsafe.Pointer(cname)) + e := &Engine{ + e: C.ENGINE_by_id(cname), + } + if e.e == nil { + return nil, fmt.Errorf("engine %s missing", name) + } + if C.ENGINE_init(e.e) == 0 { + C.ENGINE_free(e.e) + return nil, fmt.Errorf("engine %s not initialized", name) + } + runtime.SetFinalizer(e, func(e *Engine) { + C.ENGINE_finish(e.e) + C.ENGINE_free(e.e) + }) + return e, nil +} diff --git a/vendor/github.com/spacemonkeygo/openssl/fips.go b/vendor/github.com/spacemonkeygo/openssl/fips.go new file mode 100644 index 00000000..f65e14d3 --- /dev/null +++ b/vendor/github.com/spacemonkeygo/openssl/fips.go @@ -0,0 +1,39 @@ +// Copyright (C) 2017. See 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 openssl + +/* +#include +*/ +import "C" +import "runtime" + +// FIPSModeSet enables a FIPS 140-2 validated mode of operation. +// https://wiki.openssl.org/index.php/FIPS_mode_set() +func FIPSModeSet(mode bool) error { + runtime.LockOSThread() + defer runtime.UnlockOSThread() + + var r C.int + if mode { + r = C.FIPS_mode_set(1) + } else { + r = C.FIPS_mode_set(0) + } + if r != 1 { + return errorFromErrorQueue() + } + return nil +} diff --git a/vendor/github.com/spacemonkeygo/openssl/go.mod b/vendor/github.com/spacemonkeygo/openssl/go.mod new file mode 100644 index 00000000..73f3bbfe --- /dev/null +++ b/vendor/github.com/spacemonkeygo/openssl/go.mod @@ -0,0 +1,3 @@ +module github.com/spacemonkeygo/openssl + +require github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 diff --git a/vendor/github.com/spacemonkeygo/openssl/go.sum b/vendor/github.com/spacemonkeygo/openssl/go.sum new file mode 100644 index 00000000..1b0ecc56 --- /dev/null +++ b/vendor/github.com/spacemonkeygo/openssl/go.sum @@ -0,0 +1,2 @@ +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 h1:RC6RW7j+1+HkWaX/Yh71Ee5ZHaHYt7ZP4sQgUrm6cDU= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572/go.mod h1:w0SWMsp6j9O/dk4/ZpIhL+3CkG8ofA2vuv7k+ltqUMc= diff --git a/vendor/github.com/spacemonkeygo/openssl/hmac.go b/vendor/github.com/spacemonkeygo/openssl/hmac.go new file mode 100644 index 00000000..a8640cfa --- /dev/null +++ b/vendor/github.com/spacemonkeygo/openssl/hmac.go @@ -0,0 +1,91 @@ +// Copyright (C) 2017. See 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 openssl + +// #include "shim.h" +import "C" + +import ( + "errors" + "runtime" + "unsafe" +) + +type HMAC struct { + ctx *C.HMAC_CTX + engine *Engine + md *C.EVP_MD +} + +func NewHMAC(key []byte, digestAlgorithm EVP_MD) (*HMAC, error) { + return NewHMACWithEngine(key, digestAlgorithm, nil) +} + +func NewHMACWithEngine(key []byte, digestAlgorithm EVP_MD, e *Engine) (*HMAC, error) { + var md *C.EVP_MD = getDigestFunction(digestAlgorithm) + h := &HMAC{engine: e, md: md} + h.ctx = C.X_HMAC_CTX_new() + if h.ctx == nil { + return nil, errors.New("unable to allocate HMAC_CTX") + } + + var c_e *C.ENGINE + if e != nil { + c_e = e.e + } + if rc := C.X_HMAC_Init_ex(h.ctx, + unsafe.Pointer(&key[0]), + C.int(len(key)), + md, + c_e); rc != 1 { + C.X_HMAC_CTX_free(h.ctx) + return nil, errors.New("failed to initialize HMAC_CTX") + } + + runtime.SetFinalizer(h, func(h *HMAC) { h.Close() }) + return h, nil +} + +func (h *HMAC) Close() { + C.X_HMAC_CTX_free(h.ctx) +} + +func (h *HMAC) Write(data []byte) (n int, err error) { + if len(data) == 0 { + return 0, nil + } + if rc := C.X_HMAC_Update(h.ctx, (*C.uchar)(unsafe.Pointer(&data[0])), + C.size_t(len(data))); rc != 1 { + return 0, errors.New("failed to update HMAC") + } + return len(data), nil +} + +func (h *HMAC) Reset() error { + if 1 != C.X_HMAC_Init_ex(h.ctx, nil, 0, nil, nil) { + return errors.New("failed to reset HMAC_CTX") + } + return nil +} + +func (h *HMAC) Final() (result []byte, err error) { + mdLength := C.X_EVP_MD_size(h.md) + result = make([]byte, mdLength) + if rc := C.X_HMAC_Final(h.ctx, (*C.uchar)(unsafe.Pointer(&result[0])), + (*C.uint)(unsafe.Pointer(&mdLength))); rc != 1 { + return nil, errors.New("failed to finalized HMAC") + } + return result, h.Reset() +} diff --git a/vendor/github.com/spacemonkeygo/openssl/hostname.c b/vendor/github.com/spacemonkeygo/openssl/hostname.c new file mode 100644 index 00000000..0bffecad --- /dev/null +++ b/vendor/github.com/spacemonkeygo/openssl/hostname.c @@ -0,0 +1,373 @@ +/* + * Go-OpenSSL notice: + * This file is required for all OpenSSL versions prior to 1.1.0. This simply + * provides the new 1.1.0 X509_check_* methods for hostname validation if they + * don't already exist. + */ + +#include + +#ifndef X509_CHECK_FLAG_ALWAYS_CHECK_SUBJECT + +/* portions from x509v3.h and v3_utl.c */ +/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL + * project. + */ +/* ==================================================================== + * Copyright (c) 1999-2003 The OpenSSL Project. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * licensing@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED 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 OpenSSL PROJECT OR + * ITS 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. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ +/* X509 v3 extension utilities */ + +#include +#include +#include +#include +#include + +#define X509_CHECK_FLAG_ALWAYS_CHECK_SUBJECT 0x1 +#define X509_CHECK_FLAG_NO_WILDCARDS 0x2 + +typedef int (*equal_fn)(const unsigned char *pattern, size_t pattern_len, + const unsigned char *subject, size_t subject_len); + +/* Compare while ASCII ignoring case. */ +static int equal_nocase(const unsigned char *pattern, size_t pattern_len, + const unsigned char *subject, size_t subject_len) + { + if (pattern_len != subject_len) + return 0; + while (pattern_len) + { + unsigned char l = *pattern; + unsigned char r = *subject; + /* The pattern must not contain NUL characters. */ + if (l == 0) + return 0; + if (l != r) + { + if ('A' <= l && l <= 'Z') + l = (l - 'A') + 'a'; + if ('A' <= r && r <= 'Z') + r = (r - 'A') + 'a'; + if (l != r) + return 0; + } + ++pattern; + ++subject; + --pattern_len; + } + return 1; + } + +/* Compare using memcmp. */ +static int equal_case(const unsigned char *pattern, size_t pattern_len, + const unsigned char *subject, size_t subject_len) +{ + /* The pattern must not contain NUL characters. */ + if (memchr(pattern, '\0', pattern_len) != NULL) + return 0; + if (pattern_len != subject_len) + return 0; + return !memcmp(pattern, subject, pattern_len); +} + +/* RFC 5280, section 7.5, requires that only the domain is compared in + a case-insensitive manner. */ +static int equal_email(const unsigned char *a, size_t a_len, + const unsigned char *b, size_t b_len) + { + size_t i = a_len; + if (a_len != b_len) + return 0; + /* We search backwards for the '@' character, so that we do + not have to deal with quoted local-parts. The domain part + is compared in a case-insensitive manner. */ + while (i > 0) + { + --i; + if (a[i] == '@' || b[i] == '@') + { + if (!equal_nocase(a + i, a_len - i, + b + i, a_len - i)) + return 0; + break; + } + } + if (i == 0) + i = a_len; + return equal_case(a, i, b, i); + } + +/* Compare the prefix and suffix with the subject, and check that the + characters in-between are valid. */ +static int wildcard_match(const unsigned char *prefix, size_t prefix_len, + const unsigned char *suffix, size_t suffix_len, + const unsigned char *subject, size_t subject_len) + { + const unsigned char *wildcard_start; + const unsigned char *wildcard_end; + const unsigned char *p; + if (subject_len < prefix_len + suffix_len) + return 0; + if (!equal_nocase(prefix, prefix_len, subject, prefix_len)) + return 0; + wildcard_start = subject + prefix_len; + wildcard_end = subject + (subject_len - suffix_len); + if (!equal_nocase(wildcard_end, suffix_len, suffix, suffix_len)) + return 0; + /* The wildcard must match at least one character. */ + if (wildcard_start == wildcard_end) + return 0; + /* Check that the part matched by the wildcard contains only + permitted characters and only matches a single label. */ + for (p = wildcard_start; p != wildcard_end; ++p) + if (!(('0' <= *p && *p <= '9') || + ('A' <= *p && *p <= 'Z') || + ('a' <= *p && *p <= 'z') || + *p == '-')) + return 0; + return 1; + } + +/* Checks if the memory region consistens of [0-9A-Za-z.-]. */ +static int valid_domain_characters(const unsigned char *p, size_t len) + { + while (len) + { + if (!(('0' <= *p && *p <= '9') || + ('A' <= *p && *p <= 'Z') || + ('a' <= *p && *p <= 'z') || + *p == '-' || *p == '.')) + return 0; + ++p; + --len; + } + return 1; + } + +/* Find the '*' in a wildcard pattern. If no such character is found + or the pattern is otherwise invalid, returns NULL. */ +static const unsigned char *wildcard_find_star(const unsigned char *pattern, + size_t pattern_len) + { + const unsigned char *star = memchr(pattern, '*', pattern_len); + size_t dot_count = 0; + const unsigned char *suffix_start; + size_t suffix_length; + if (star == NULL) + return NULL; + suffix_start = star + 1; + suffix_length = (pattern + pattern_len) - (star + 1); + if (!(valid_domain_characters(pattern, star - pattern) && + valid_domain_characters(suffix_start, suffix_length))) + return NULL; + /* Check that the suffix matches at least two labels. */ + while (suffix_length) + { + if (*suffix_start == '.') + ++dot_count; + ++suffix_start; + --suffix_length; + } + if (dot_count < 2) + return NULL; + return star; + } + +/* Compare using wildcards. */ +static int equal_wildcard(const unsigned char *pattern, size_t pattern_len, + const unsigned char *subject, size_t subject_len) + { + const unsigned char *star = wildcard_find_star(pattern, pattern_len); + if (star == NULL) + return equal_nocase(pattern, pattern_len, + subject, subject_len); + return wildcard_match(pattern, star - pattern, + star + 1, (pattern + pattern_len) - star - 1, + subject, subject_len); + } + +/* Compare an ASN1_STRING to a supplied string. If they match + * return 1. If cmp_type > 0 only compare if string matches the + * type, otherwise convert it to UTF8. + */ + +static int do_check_string(ASN1_STRING *a, int cmp_type, equal_fn equal, + const unsigned char *b, size_t blen) + { + if (!a->data || !a->length) + return 0; + if (cmp_type > 0) + { + if (cmp_type != a->type) + return 0; + if (cmp_type == V_ASN1_IA5STRING) + return equal(a->data, a->length, b, blen); + if (a->length == (int)blen && !memcmp(a->data, b, blen)) + return 1; + else + return 0; + } + else + { + int astrlen, rv; + unsigned char *astr; + astrlen = ASN1_STRING_to_UTF8(&astr, a); + if (astrlen < 0) + return -1; + rv = equal(astr, astrlen, b, blen); + OPENSSL_free(astr); + return rv; + } + } + +static int do_x509_check(X509 *x, const unsigned char *chk, size_t chklen, + unsigned int flags, int check_type) + { + STACK_OF(GENERAL_NAME) *gens = NULL; + X509_NAME *name = NULL; + int i; + int cnid; + int alt_type; + equal_fn equal; + if (check_type == GEN_EMAIL) + { + cnid = NID_pkcs9_emailAddress; + alt_type = V_ASN1_IA5STRING; + equal = equal_email; + } + else if (check_type == GEN_DNS) + { + cnid = NID_commonName; + alt_type = V_ASN1_IA5STRING; + if (flags & X509_CHECK_FLAG_NO_WILDCARDS) + equal = equal_nocase; + else + equal = equal_wildcard; + } + else + { + cnid = 0; + alt_type = V_ASN1_OCTET_STRING; + equal = equal_case; + } + + if (chklen == 0) + chklen = strlen((const char *)chk); + + gens = X509_get_ext_d2i(x, NID_subject_alt_name, NULL, NULL); + if (gens) + { + int rv = 0; + for (i = 0; i < sk_GENERAL_NAME_num(gens); i++) + { + GENERAL_NAME *gen; + ASN1_STRING *cstr; + gen = sk_GENERAL_NAME_value(gens, i); + if(gen->type != check_type) + continue; + if (check_type == GEN_EMAIL) + cstr = gen->d.rfc822Name; + else if (check_type == GEN_DNS) + cstr = gen->d.dNSName; + else + cstr = gen->d.iPAddress; + if (do_check_string(cstr, alt_type, equal, chk, chklen)) + { + rv = 1; + break; + } + } + GENERAL_NAMES_free(gens); + if (rv) + return 1; + if (!(flags & X509_CHECK_FLAG_ALWAYS_CHECK_SUBJECT) || !cnid) + return 0; + } + i = -1; + name = X509_get_subject_name(x); + while((i = X509_NAME_get_index_by_NID(name, cnid, i)) >= 0) + { + X509_NAME_ENTRY *ne; + ASN1_STRING *str; + ne = X509_NAME_get_entry(name, i); + str = X509_NAME_ENTRY_get_data(ne); + if (do_check_string(str, -1, equal, chk, chklen)) + return 1; + } + return 0; + } + +#if OPENSSL_VERSION_NUMBER < 0x1000200fL + +int X509_check_host(X509 *x, const unsigned char *chk, size_t chklen, + unsigned int flags, char **peername) + { + return do_x509_check(x, chk, chklen, flags, GEN_DNS); + } + +int X509_check_email(X509 *x, const unsigned char *chk, size_t chklen, + unsigned int flags) + { + return do_x509_check(x, chk, chklen, flags, GEN_EMAIL); + } + +int X509_check_ip(X509 *x, const unsigned char *chk, size_t chklen, + unsigned int flags) + { + return do_x509_check(x, chk, chklen, flags, GEN_IPADD); + } + +#endif /* OPENSSL_VERSION_NUMBER < 0x1000200fL */ + +#endif diff --git a/vendor/github.com/spacemonkeygo/openssl/hostname.go b/vendor/github.com/spacemonkeygo/openssl/hostname.go new file mode 100644 index 00000000..c92d959e --- /dev/null +++ b/vendor/github.com/spacemonkeygo/openssl/hostname.go @@ -0,0 +1,132 @@ +// Copyright (C) 2017. See 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 openssl + +/* +#include +#include +#include + +#ifndef X509_CHECK_FLAG_ALWAYS_CHECK_SUBJECT +#define X509_CHECK_FLAG_ALWAYS_CHECK_SUBJECT 0x1 +#define X509_CHECK_FLAG_NO_WILDCARDS 0x2 + +extern int X509_check_host(X509 *x, const unsigned char *chk, size_t chklen, + unsigned int flags, char **peername); +extern int X509_check_email(X509 *x, const unsigned char *chk, size_t chklen, + unsigned int flags); +extern int X509_check_ip(X509 *x, const unsigned char *chk, size_t chklen, + unsigned int flags); +#endif +*/ +import "C" + +import ( + "errors" + "net" + "unsafe" +) + +var ( + ValidationError = errors.New("Host validation error") +) + +type CheckFlags int + +const ( + AlwaysCheckSubject CheckFlags = C.X509_CHECK_FLAG_ALWAYS_CHECK_SUBJECT + NoWildcards CheckFlags = C.X509_CHECK_FLAG_NO_WILDCARDS +) + +// CheckHost checks that the X509 certificate is signed for the provided +// host name. See http://www.openssl.org/docs/crypto/X509_check_host.html for +// more. Note that CheckHost does not check the IP field. See VerifyHostname. +// Specifically returns ValidationError if the Certificate didn't match but +// there was no internal error. +func (c *Certificate) CheckHost(host string, flags CheckFlags) error { + chost := unsafe.Pointer(C.CString(host)) + defer C.free(chost) + + rv := C.X509_check_host(c.x, (*C.uchar)(chost), C.size_t(len(host)), + C.uint(flags), nil) + if rv > 0 { + return nil + } + if rv == 0 { + return ValidationError + } + return errors.New("hostname validation had an internal failure") +} + +// CheckEmail checks that the X509 certificate is signed for the provided +// email address. See http://www.openssl.org/docs/crypto/X509_check_host.html +// for more. +// Specifically returns ValidationError if the Certificate didn't match but +// there was no internal error. +func (c *Certificate) CheckEmail(email string, flags CheckFlags) error { + cemail := unsafe.Pointer(C.CString(email)) + defer C.free(cemail) + rv := C.X509_check_email(c.x, (*C.uchar)(cemail), C.size_t(len(email)), + C.uint(flags)) + if rv > 0 { + return nil + } + if rv == 0 { + return ValidationError + } + return errors.New("email validation had an internal failure") +} + +// CheckIP checks that the X509 certificate is signed for the provided +// IP address. See http://www.openssl.org/docs/crypto/X509_check_host.html +// for more. +// Specifically returns ValidationError if the Certificate didn't match but +// there was no internal error. +func (c *Certificate) CheckIP(ip net.IP, flags CheckFlags) error { + // X509_check_ip will fail to validate the 16-byte representation of an IPv4 + // address, so convert to the 4-byte representation. + if ip4 := ip.To4(); ip4 != nil { + ip = ip4 + } + + cip := unsafe.Pointer(&ip[0]) + rv := C.X509_check_ip(c.x, (*C.uchar)(cip), C.size_t(len(ip)), + C.uint(flags)) + if rv > 0 { + return nil + } + if rv == 0 { + return ValidationError + } + return errors.New("ip validation had an internal failure") +} + +// VerifyHostname is a combination of CheckHost and CheckIP. If the provided +// hostname looks like an IP address, it will be checked as an IP address, +// otherwise it will be checked as a hostname. +// Specifically returns ValidationError if the Certificate didn't match but +// there was no internal error. +func (c *Certificate) VerifyHostname(host string) error { + var ip net.IP + if len(host) >= 3 && host[0] == '[' && host[len(host)-1] == ']' { + ip = net.ParseIP(host[1 : len(host)-1]) + } else { + ip = net.ParseIP(host) + } + if ip != nil { + return c.CheckIP(ip, 0) + } + return c.CheckHost(host, 0) +} diff --git a/vendor/github.com/spacemonkeygo/openssl/http.go b/vendor/github.com/spacemonkeygo/openssl/http.go new file mode 100644 index 00000000..39bd5a28 --- /dev/null +++ b/vendor/github.com/spacemonkeygo/openssl/http.go @@ -0,0 +1,61 @@ +// Copyright (C) 2017. See 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 openssl + +import ( + "net/http" +) + +// ListenAndServeTLS will take an http.Handler and serve it using OpenSSL over +// the given tcp address, configured to use the provided cert and key files. +func ListenAndServeTLS(addr string, cert_file string, key_file string, + handler http.Handler) error { + return ServerListenAndServeTLS( + &http.Server{Addr: addr, Handler: handler}, cert_file, key_file) +} + +// ServerListenAndServeTLS will take an http.Server and serve it using OpenSSL +// configured to use the provided cert and key files. +func ServerListenAndServeTLS(srv *http.Server, + cert_file, key_file string) error { + addr := srv.Addr + if addr == "" { + addr = ":https" + } + + ctx, err := NewCtxFromFiles(cert_file, key_file) + if err != nil { + return err + } + + l, err := Listen("tcp", addr, ctx) + if err != nil { + return err + } + + return srv.Serve(l) +} + +// TODO: http client integration +// holy crap, getting this integrated nicely with the Go stdlib HTTP client +// stack so that it does proxying, connection pooling, and most importantly +// hostname verification is really hard. So much stuff is hardcoded to just use +// the built-in TLS lib. I think to get this to work either some crazy +// hacktackery beyond me, an almost straight up fork of the HTTP client, or +// serious stdlib internal refactoring is necessary. +// even more so, good luck getting openssl to use the operating system default +// root certificates if the user doesn't provide any. sadlol +// NOTE: if you're going to try and write your own round tripper, at least use +// openssl.Dial, or equivalent logic diff --git a/vendor/github.com/spacemonkeygo/openssl/init.go b/vendor/github.com/spacemonkeygo/openssl/init.go new file mode 100644 index 00000000..17dc6f38 --- /dev/null +++ b/vendor/github.com/spacemonkeygo/openssl/init.go @@ -0,0 +1,117 @@ +// Copyright (C) 2017. See 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 openssl is a light wrapper around OpenSSL for Go. + +It strives to provide a near-drop-in replacement for the Go standard library +tls package, while allowing for: + +Performance + +OpenSSL is battle-tested and optimized C. While Go's built-in library shows +great promise, it is still young and in some places, inefficient. This simple +OpenSSL wrapper can often do at least 2x with the same cipher and protocol. + +On my lappytop, I get the following benchmarking speeds: + BenchmarkSHA1Large_openssl 1000 2611282 ns/op 401.56 MB/s + BenchmarkSHA1Large_stdlib 500 3963983 ns/op 264.53 MB/s + BenchmarkSHA1Small_openssl 1000000 3476 ns/op 0.29 MB/s + BenchmarkSHA1Small_stdlib 5000000 550 ns/op 1.82 MB/s + BenchmarkSHA256Large_openssl 200 8085314 ns/op 129.69 MB/s + BenchmarkSHA256Large_stdlib 100 18948189 ns/op 55.34 MB/s + BenchmarkSHA256Small_openssl 1000000 4262 ns/op 0.23 MB/s + BenchmarkSHA256Small_stdlib 1000000 1444 ns/op 0.69 MB/s + BenchmarkOpenSSLThroughput 100000 21634 ns/op 47.33 MB/s + BenchmarkStdlibThroughput 50000 58974 ns/op 17.36 MB/s + +Interoperability + +Many systems support OpenSSL with a variety of plugins and modules for things, +such as hardware acceleration in embedded devices. + +Greater flexibility and configuration + +OpenSSL allows for far greater configuration of corner cases and backwards +compatibility (such as support of SSLv2). You shouldn't be using SSLv2 if you +can help but, but sometimes you can't help it. + +Security + +Yeah yeah, Heartbleed. But according to the author of the standard library's +TLS implementation, Go's TLS library is vulnerable to timing attacks. And +whether or not OpenSSL received the appropriate amount of scrutiny +pre-Heartbleed, it sure is receiving it now. + +Usage + +Starting an HTTP server that uses OpenSSL is very easy. It's as simple as: + log.Fatal(openssl.ListenAndServeTLS( + ":8443", "my_server.crt", "my_server.key", myHandler)) + +Getting a net.Listener that uses OpenSSL is also easy: + ctx, err := openssl.NewCtxFromFiles("my_server.crt", "my_server.key") + if err != nil { + log.Fatal(err) + } + l, err := openssl.Listen("tcp", ":7777", ctx) + +Making a client connection is straightforward too: + ctx, err := NewCtx() + if err != nil { + log.Fatal(err) + } + err = ctx.LoadVerifyLocations("/etc/ssl/certs/ca-certificates.crt", "") + if err != nil { + log.Fatal(err) + } + conn, err := openssl.Dial("tcp", "localhost:7777", ctx, 0) + +Help wanted: To get this library to work with net/http's client, we +had to fork net/http. It would be nice if an alternate http client library +supported the generality needed to use OpenSSL instead of crypto/tls. +*/ +package openssl + +// #include "shim.h" +import "C" + +import ( + "errors" + "fmt" + "strings" +) + +func init() { + if rc := C.X_shim_init(); rc != 0 { + panic(fmt.Errorf("X_shim_init failed with %d", rc)) + } +} + +// errorFromErrorQueue needs to run in the same OS thread as the operation +// that caused the possible error +func errorFromErrorQueue() error { + var errs []string + for { + err := C.ERR_get_error() + if err == 0 { + break + } + errs = append(errs, fmt.Sprintf("%s:%s:%s", + C.GoString(C.ERR_lib_error_string(err)), + C.GoString(C.ERR_func_error_string(err)), + C.GoString(C.ERR_reason_error_string(err)))) + } + return errors.New(fmt.Sprintf("SSL errors: %s", strings.Join(errs, "\n"))) +} diff --git a/vendor/github.com/spacemonkeygo/openssl/init_posix.go b/vendor/github.com/spacemonkeygo/openssl/init_posix.go new file mode 100644 index 00000000..2da7f957 --- /dev/null +++ b/vendor/github.com/spacemonkeygo/openssl/init_posix.go @@ -0,0 +1,68 @@ +// Copyright (C) 2017. See 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 linux darwin solaris +// +build !windows + +package openssl + +/* +#include +#include +#include + +pthread_mutex_t* goopenssl_locks; + +int go_init_locks() { + int rc = 0; + int nlock; + int i; + int locks_needed = CRYPTO_num_locks(); + + goopenssl_locks = (pthread_mutex_t*)malloc( + sizeof(pthread_mutex_t) * locks_needed); + if (!goopenssl_locks) { + return ENOMEM; + } + for (nlock = 0; nlock < locks_needed; ++nlock) { + rc = pthread_mutex_init(&goopenssl_locks[nlock], NULL); + if (rc != 0) { + break; + } + } + + if (rc != 0) { + for (i = nlock - 1; i >= 0; --i) { + pthread_mutex_destroy(&goopenssl_locks[i]); + } + free(goopenssl_locks); + goopenssl_locks = NULL; + } + return rc; +} + +void go_thread_locking_callback(int mode, int n, const char *file, + int line) { + if (mode & CRYPTO_LOCK) { + pthread_mutex_lock(&goopenssl_locks[n]); + } else { + pthread_mutex_unlock(&goopenssl_locks[n]); + } +} + +unsigned long go_thread_id_callback(void) { + return (unsigned long)pthread_self(); +} +*/ +import "C" diff --git a/vendor/github.com/spacemonkeygo/openssl/init_windows.go b/vendor/github.com/spacemonkeygo/openssl/init_windows.go new file mode 100644 index 00000000..051133c3 --- /dev/null +++ b/vendor/github.com/spacemonkeygo/openssl/init_windows.go @@ -0,0 +1,57 @@ +// Copyright (C) 2017. See 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 windows + +package openssl + +/* +#include +#include +#include + +CRITICAL_SECTION* goopenssl_locks; + +int go_init_locks() { + int rc = 0; + int nlock; + int i; + int locks_needed = CRYPTO_num_locks(); + + goopenssl_locks = (CRITICAL_SECTION*)malloc( + sizeof(*goopenssl_locks) * locks_needed); + if (!goopenssl_locks) { + return ENOMEM; + } + for (nlock = 0; nlock < locks_needed; ++nlock) { + InitializeCriticalSection(&goopenssl_locks[nlock]); + } + + return 0; +} + +void go_thread_locking_callback(int mode, int n, const char *file, + int line) { + if (mode & CRYPTO_LOCK) { + EnterCriticalSection(&goopenssl_locks[n]); + } else { + LeaveCriticalSection(&goopenssl_locks[n]); + } +} + +unsigned long go_thread_id_callback(void) { + return (unsigned long)GetCurrentThreadId(); +} +*/ +import "C" diff --git a/vendor/github.com/spacemonkeygo/openssl/key.go b/vendor/github.com/spacemonkeygo/openssl/key.go new file mode 100644 index 00000000..91ea98a7 --- /dev/null +++ b/vendor/github.com/spacemonkeygo/openssl/key.go @@ -0,0 +1,504 @@ +// Copyright (C) 2017. See 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 openssl + +// #include "shim.h" +import "C" + +import ( + "errors" + "io/ioutil" + "runtime" + "unsafe" +) + +var ( // some (effectively) constants for tests to refer to + ed25519_support = C.X_ED25519_SUPPORT != 0 +) + +type Method *C.EVP_MD + +var ( + SHA1_Method Method = C.X_EVP_sha1() + SHA256_Method Method = C.X_EVP_sha256() + SHA512_Method Method = C.X_EVP_sha512() +) + +// Constants for the various key types. +// Mapping of name -> NID taken from openssl/evp.h +const ( + KeyTypeNone = NID_undef + KeyTypeRSA = NID_rsaEncryption + KeyTypeRSA2 = NID_rsa + KeyTypeDSA = NID_dsa + KeyTypeDSA1 = NID_dsa_2 + KeyTypeDSA2 = NID_dsaWithSHA + KeyTypeDSA3 = NID_dsaWithSHA1 + KeyTypeDSA4 = NID_dsaWithSHA1_2 + KeyTypeDH = NID_dhKeyAgreement + KeyTypeDHX = NID_dhpublicnumber + KeyTypeEC = NID_X9_62_id_ecPublicKey + KeyTypeHMAC = NID_hmac + KeyTypeCMAC = NID_cmac + KeyTypeTLS1PRF = NID_tls1_prf + KeyTypeHKDF = NID_hkdf + KeyTypeX25519 = NID_X25519 + KeyTypeX448 = NID_X448 + KeyTypeED25519 = NID_ED25519 + KeyTypeED448 = NID_ED448 +) + +type PublicKey interface { + // Verifies the data signature using PKCS1.15 + VerifyPKCS1v15(method Method, data, sig []byte) error + + // MarshalPKIXPublicKeyPEM converts the public key to PEM-encoded PKIX + // format + MarshalPKIXPublicKeyPEM() (pem_block []byte, err error) + + // MarshalPKIXPublicKeyDER converts the public key to DER-encoded PKIX + // format + MarshalPKIXPublicKeyDER() (der_block []byte, err error) + + // KeyType returns an identifier for what kind of key is represented by this + // object. + KeyType() NID + + // BaseType returns an identifier for what kind of key is represented + // by this object. + // Keys that share same algorithm but use different legacy formats + // will have the same BaseType. + // + // For example, a key with a `KeyType() == KeyTypeRSA` and a key with a + // `KeyType() == KeyTypeRSA2` would both have `BaseType() == KeyTypeRSA`. + BaseType() NID + + evpPKey() *C.EVP_PKEY +} + +type PrivateKey interface { + PublicKey + + // Signs the data using PKCS1.15 + SignPKCS1v15(Method, []byte) ([]byte, error) + + // MarshalPKCS1PrivateKeyPEM converts the private key to PEM-encoded PKCS1 + // format + MarshalPKCS1PrivateKeyPEM() (pem_block []byte, err error) + + // MarshalPKCS1PrivateKeyDER converts the private key to DER-encoded PKCS1 + // format + MarshalPKCS1PrivateKeyDER() (der_block []byte, err error) +} + +type pKey struct { + key *C.EVP_PKEY +} + +func (key *pKey) evpPKey() *C.EVP_PKEY { return key.key } + +func (key *pKey) KeyType() NID { + return NID(C.EVP_PKEY_id(key.key)) +} + +func (key *pKey) BaseType() NID { + return NID(C.EVP_PKEY_base_id(key.key)) +} + +func (key *pKey) SignPKCS1v15(method Method, data []byte) ([]byte, error) { + + ctx := C.X_EVP_MD_CTX_new() + defer C.X_EVP_MD_CTX_free(ctx) + + if key.KeyType() == KeyTypeED25519 { + // do ED specific one-shot sign + + if method != nil || len(data) == 0 { + return nil, errors.New("signpkcs1v15: 0-length data or non-null digest") + } + + if 1 != C.X_EVP_DigestSignInit(ctx, nil, nil, nil, key.key) { + return nil, errors.New("signpkcs1v15: failed to init signature") + } + + // evp signatures are 64 bytes + sig := make([]byte, 64, 64) + var sigblen C.size_t = 64 + if 1 != C.X_EVP_DigestSign(ctx, + ((*C.uchar)(unsafe.Pointer(&sig[0]))), + &sigblen, + (*C.uchar)(unsafe.Pointer(&data[0])), + C.size_t(len(data))) { + return nil, errors.New("signpkcs1v15: failed to do one-shot signature") + } + + return sig[:sigblen], nil + } else { + if 1 != C.X_EVP_SignInit(ctx, method) { + return nil, errors.New("signpkcs1v15: failed to init signature") + } + if len(data) > 0 { + if 1 != C.X_EVP_SignUpdate( + ctx, unsafe.Pointer(&data[0]), C.uint(len(data))) { + return nil, errors.New("signpkcs1v15: failed to update signature") + } + } + sig := make([]byte, C.X_EVP_PKEY_size(key.key)) + var sigblen C.uint + if 1 != C.X_EVP_SignFinal(ctx, + ((*C.uchar)(unsafe.Pointer(&sig[0]))), &sigblen, key.key) { + return nil, errors.New("signpkcs1v15: failed to finalize signature") + } + return sig[:sigblen], nil + } +} + +func (key *pKey) VerifyPKCS1v15(method Method, data, sig []byte) error { + ctx := C.X_EVP_MD_CTX_new() + defer C.X_EVP_MD_CTX_free(ctx) + + if key.KeyType() == KeyTypeED25519 { + // do ED specific one-shot sign + + if method != nil || len(data) == 0 || len(sig) == 0 { + return errors.New("verifypkcs1v15: 0-length data or sig or non-null digest") + } + + if 1 != C.X_EVP_DigestVerifyInit(ctx, nil, nil, nil, key.key) { + return errors.New("verifypkcs1v15: failed to init verify") + } + + if 1 != C.X_EVP_DigestVerify(ctx, + ((*C.uchar)(unsafe.Pointer(&sig[0]))), + C.size_t(len(sig)), + (*C.uchar)(unsafe.Pointer(&data[0])), + C.size_t(len(data))) { + return errors.New("verifypkcs1v15: failed to do one-shot verify") + } + + return nil + + } else { + if 1 != C.X_EVP_VerifyInit(ctx, method) { + return errors.New("verifypkcs1v15: failed to init verify") + } + if len(data) > 0 { + if 1 != C.X_EVP_VerifyUpdate( + ctx, unsafe.Pointer(&data[0]), C.uint(len(data))) { + return errors.New("verifypkcs1v15: failed to update verify") + } + } + if 1 != C.X_EVP_VerifyFinal(ctx, + ((*C.uchar)(unsafe.Pointer(&sig[0]))), C.uint(len(sig)), key.key) { + return errors.New("verifypkcs1v15: failed to finalize verify") + } + return nil + } +} + +func (key *pKey) MarshalPKCS1PrivateKeyPEM() (pem_block []byte, + err error) { + bio := C.BIO_new(C.BIO_s_mem()) + if bio == nil { + return nil, errors.New("failed to allocate memory BIO") + } + defer C.BIO_free(bio) + + // PEM_write_bio_PrivateKey_traditional will use the key-specific PKCS1 + // format if one is available for that key type, otherwise it will encode + // to a PKCS8 key. + if int(C.X_PEM_write_bio_PrivateKey_traditional(bio, key.key, nil, nil, + C.int(0), nil, nil)) != 1 { + return nil, errors.New("failed dumping private key") + } + + return ioutil.ReadAll(asAnyBio(bio)) +} + +func (key *pKey) MarshalPKCS1PrivateKeyDER() (der_block []byte, + err error) { + bio := C.BIO_new(C.BIO_s_mem()) + if bio == nil { + return nil, errors.New("failed to allocate memory BIO") + } + defer C.BIO_free(bio) + + if int(C.i2d_PrivateKey_bio(bio, key.key)) != 1 { + return nil, errors.New("failed dumping private key der") + } + + return ioutil.ReadAll(asAnyBio(bio)) +} + +func (key *pKey) MarshalPKIXPublicKeyPEM() (pem_block []byte, + err error) { + bio := C.BIO_new(C.BIO_s_mem()) + if bio == nil { + return nil, errors.New("failed to allocate memory BIO") + } + defer C.BIO_free(bio) + + if int(C.PEM_write_bio_PUBKEY(bio, key.key)) != 1 { + return nil, errors.New("failed dumping public key pem") + } + + return ioutil.ReadAll(asAnyBio(bio)) +} + +func (key *pKey) MarshalPKIXPublicKeyDER() (der_block []byte, + err error) { + bio := C.BIO_new(C.BIO_s_mem()) + if bio == nil { + return nil, errors.New("failed to allocate memory BIO") + } + defer C.BIO_free(bio) + + if int(C.i2d_PUBKEY_bio(bio, key.key)) != 1 { + return nil, errors.New("failed dumping public key der") + } + + return ioutil.ReadAll(asAnyBio(bio)) +} + +// LoadPrivateKeyFromPEM loads a private key from a PEM-encoded block. +func LoadPrivateKeyFromPEM(pem_block []byte) (PrivateKey, error) { + if len(pem_block) == 0 { + return nil, errors.New("empty pem block") + } + bio := C.BIO_new_mem_buf(unsafe.Pointer(&pem_block[0]), + C.int(len(pem_block))) + if bio == nil { + return nil, errors.New("failed creating bio") + } + defer C.BIO_free(bio) + + key := C.PEM_read_bio_PrivateKey(bio, nil, nil, nil) + if key == nil { + return nil, errors.New("failed reading private key") + } + + p := &pKey{key: key} + runtime.SetFinalizer(p, func(p *pKey) { + C.X_EVP_PKEY_free(p.key) + }) + return p, nil +} + +// LoadPrivateKeyFromPEMWithPassword loads a private key from a PEM-encoded block. +func LoadPrivateKeyFromPEMWithPassword(pem_block []byte, password string) ( + PrivateKey, error) { + if len(pem_block) == 0 { + return nil, errors.New("empty pem block") + } + bio := C.BIO_new_mem_buf(unsafe.Pointer(&pem_block[0]), + C.int(len(pem_block))) + if bio == nil { + return nil, errors.New("failed creating bio") + } + defer C.BIO_free(bio) + cs := C.CString(password) + defer C.free(unsafe.Pointer(cs)) + key := C.PEM_read_bio_PrivateKey(bio, nil, nil, unsafe.Pointer(cs)) + if key == nil { + return nil, errors.New("failed reading private key") + } + + p := &pKey{key: key} + runtime.SetFinalizer(p, func(p *pKey) { + C.X_EVP_PKEY_free(p.key) + }) + return p, nil +} + +// LoadPrivateKeyFromDER loads a private key from a DER-encoded block. +func LoadPrivateKeyFromDER(der_block []byte) (PrivateKey, error) { + if len(der_block) == 0 { + return nil, errors.New("empty der block") + } + bio := C.BIO_new_mem_buf(unsafe.Pointer(&der_block[0]), + C.int(len(der_block))) + if bio == nil { + return nil, errors.New("failed creating bio") + } + defer C.BIO_free(bio) + + key := C.d2i_PrivateKey_bio(bio, nil) + if key == nil { + return nil, errors.New("failed reading private key der") + } + + p := &pKey{key: key} + runtime.SetFinalizer(p, func(p *pKey) { + C.X_EVP_PKEY_free(p.key) + }) + return p, nil +} + +// LoadPrivateKeyFromPEMWidthPassword loads a private key from a PEM-encoded block. +// Backwards-compatible with typo +func LoadPrivateKeyFromPEMWidthPassword(pem_block []byte, password string) ( + PrivateKey, error) { + return LoadPrivateKeyFromPEMWithPassword(pem_block, password) +} + +// LoadPublicKeyFromPEM loads a public key from a PEM-encoded block. +func LoadPublicKeyFromPEM(pem_block []byte) (PublicKey, error) { + if len(pem_block) == 0 { + return nil, errors.New("empty pem block") + } + bio := C.BIO_new_mem_buf(unsafe.Pointer(&pem_block[0]), + C.int(len(pem_block))) + if bio == nil { + return nil, errors.New("failed creating bio") + } + defer C.BIO_free(bio) + + key := C.PEM_read_bio_PUBKEY(bio, nil, nil, nil) + if key == nil { + return nil, errors.New("failed reading public key der") + } + + p := &pKey{key: key} + runtime.SetFinalizer(p, func(p *pKey) { + C.X_EVP_PKEY_free(p.key) + }) + return p, nil +} + +// LoadPublicKeyFromDER loads a public key from a DER-encoded block. +func LoadPublicKeyFromDER(der_block []byte) (PublicKey, error) { + if len(der_block) == 0 { + return nil, errors.New("empty der block") + } + bio := C.BIO_new_mem_buf(unsafe.Pointer(&der_block[0]), + C.int(len(der_block))) + if bio == nil { + return nil, errors.New("failed creating bio") + } + defer C.BIO_free(bio) + + key := C.d2i_PUBKEY_bio(bio, nil) + if key == nil { + return nil, errors.New("failed reading public key der") + } + + p := &pKey{key: key} + runtime.SetFinalizer(p, func(p *pKey) { + C.X_EVP_PKEY_free(p.key) + }) + return p, nil +} + +// GenerateRSAKey generates a new RSA private key with an exponent of 3. +func GenerateRSAKey(bits int) (PrivateKey, error) { + return GenerateRSAKeyWithExponent(bits, 3) +} + +// GenerateRSAKeyWithExponent generates a new RSA private key. +func GenerateRSAKeyWithExponent(bits int, exponent int) (PrivateKey, error) { + rsa := C.RSA_generate_key(C.int(bits), C.ulong(exponent), nil, nil) + if rsa == nil { + return nil, errors.New("failed to generate RSA key") + } + key := C.X_EVP_PKEY_new() + if key == nil { + return nil, errors.New("failed to allocate EVP_PKEY") + } + if C.X_EVP_PKEY_assign_charp(key, C.EVP_PKEY_RSA, (*C.char)(unsafe.Pointer(rsa))) != 1 { + C.X_EVP_PKEY_free(key) + return nil, errors.New("failed to assign RSA key") + } + p := &pKey{key: key} + runtime.SetFinalizer(p, func(p *pKey) { + C.X_EVP_PKEY_free(p.key) + }) + return p, nil +} + +// GenerateECKey generates a new elliptic curve private key on the speicified +// curve. +func GenerateECKey(curve EllipticCurve) (PrivateKey, error) { + + // Create context for parameter generation + paramCtx := C.EVP_PKEY_CTX_new_id(C.EVP_PKEY_EC, nil) + if paramCtx == nil { + return nil, errors.New("failed creating EC parameter generation context") + } + defer C.EVP_PKEY_CTX_free(paramCtx) + + // Intialize the parameter generation + if int(C.EVP_PKEY_paramgen_init(paramCtx)) != 1 { + return nil, errors.New("failed initializing EC parameter generation context") + } + + // Set curve in EC parameter generation context + if int(C.X_EVP_PKEY_CTX_set_ec_paramgen_curve_nid(paramCtx, C.int(curve))) != 1 { + return nil, errors.New("failed setting curve in EC parameter generation context") + } + + // Create parameter object + var params *C.EVP_PKEY + if int(C.EVP_PKEY_paramgen(paramCtx, ¶ms)) != 1 { + return nil, errors.New("failed creating EC key generation parameters") + } + defer C.EVP_PKEY_free(params) + + // Create context for the key generation + keyCtx := C.EVP_PKEY_CTX_new(params, nil) + if keyCtx == nil { + return nil, errors.New("failed creating EC key generation context") + } + defer C.EVP_PKEY_CTX_free(keyCtx) + + // Generate the key + var privKey *C.EVP_PKEY + if int(C.EVP_PKEY_keygen_init(keyCtx)) != 1 { + return nil, errors.New("failed initializing EC key generation context") + } + if int(C.EVP_PKEY_keygen(keyCtx, &privKey)) != 1 { + return nil, errors.New("failed generating EC private key") + } + + p := &pKey{key: privKey} + runtime.SetFinalizer(p, func(p *pKey) { + C.X_EVP_PKEY_free(p.key) + }) + return p, nil +} + +// GenerateED25519Key generates a Ed25519 key +func GenerateED25519Key() (PrivateKey, error) { + // Key context + keyCtx := C.EVP_PKEY_CTX_new_id(C.X_EVP_PKEY_ED25519, nil) + if keyCtx == nil { + return nil, errors.New("failed creating EC parameter generation context") + } + defer C.EVP_PKEY_CTX_free(keyCtx) + + // Generate the key + var privKey *C.EVP_PKEY + if int(C.EVP_PKEY_keygen_init(keyCtx)) != 1 { + return nil, errors.New("failed initializing ED25519 key generation context") + } + if int(C.EVP_PKEY_keygen(keyCtx, &privKey)) != 1 { + return nil, errors.New("failed generating ED25519 private key") + } + + p := &pKey{key: privKey} + runtime.SetFinalizer(p, func(p *pKey) { + C.X_EVP_PKEY_free(p.key) + }) + return p, nil +} diff --git a/vendor/github.com/spacemonkeygo/openssl/mapping.go b/vendor/github.com/spacemonkeygo/openssl/mapping.go new file mode 100644 index 00000000..d78cc703 --- /dev/null +++ b/vendor/github.com/spacemonkeygo/openssl/mapping.go @@ -0,0 +1,62 @@ +// Copyright (C) 2017. See 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 openssl + +import ( + "sync" + "unsafe" +) + +// #include +import "C" + +type mapping struct { + lock sync.Mutex + values map[token]unsafe.Pointer +} + +func newMapping() *mapping { + return &mapping{ + values: make(map[token]unsafe.Pointer), + } +} + +type token unsafe.Pointer + +func (m *mapping) Add(x unsafe.Pointer) token { + res := token(C.malloc(1)) + + m.lock.Lock() + m.values[res] = x + m.lock.Unlock() + + return res +} + +func (m *mapping) Get(x token) unsafe.Pointer { + m.lock.Lock() + res := m.values[x] + m.lock.Unlock() + + return res +} + +func (m *mapping) Del(x token) { + m.lock.Lock() + delete(m.values, x) + m.lock.Unlock() + + C.free(unsafe.Pointer(x)) +} diff --git a/vendor/github.com/spacemonkeygo/openssl/md4.go b/vendor/github.com/spacemonkeygo/openssl/md4.go new file mode 100644 index 00000000..e5cc7d86 --- /dev/null +++ b/vendor/github.com/spacemonkeygo/openssl/md4.go @@ -0,0 +1,89 @@ +// Copyright (C) 2017. See 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 openssl + +// #include "shim.h" +import "C" + +import ( + "errors" + "runtime" + "unsafe" +) + +type MD4Hash struct { + ctx *C.EVP_MD_CTX + engine *Engine +} + +func NewMD4Hash() (*MD4Hash, error) { return NewMD4HashWithEngine(nil) } + +func NewMD4HashWithEngine(e *Engine) (*MD4Hash, error) { + hash := &MD4Hash{engine: e} + hash.ctx = C.X_EVP_MD_CTX_new() + if hash.ctx == nil { + return nil, errors.New("openssl: md4: unable to allocate ctx") + } + runtime.SetFinalizer(hash, func(hash *MD4Hash) { hash.Close() }) + if err := hash.Reset(); err != nil { + return nil, err + } + return hash, nil +} + +func (s *MD4Hash) Close() { + if s.ctx != nil { + C.X_EVP_MD_CTX_free(s.ctx) + s.ctx = nil + } +} + +func (s *MD4Hash) Reset() error { + if 1 != C.X_EVP_DigestInit_ex(s.ctx, C.X_EVP_md4(), engineRef(s.engine)) { + return errors.New("openssl: md4: cannot init digest ctx") + } + return nil +} + +func (s *MD4Hash) Write(p []byte) (n int, err error) { + if len(p) == 0 { + return 0, nil + } + if 1 != C.X_EVP_DigestUpdate(s.ctx, unsafe.Pointer(&p[0]), + C.size_t(len(p))) { + return 0, errors.New("openssl: md4: cannot update digest") + } + return len(p), nil +} + +func (s *MD4Hash) Sum() (result [16]byte, err error) { + if 1 != C.X_EVP_DigestFinal_ex(s.ctx, + (*C.uchar)(unsafe.Pointer(&result[0])), nil) { + return result, errors.New("openssl: md4: cannot finalize ctx") + } + return result, s.Reset() +} + +func MD4(data []byte) (result [16]byte, err error) { + hash, err := NewMD4Hash() + if err != nil { + return result, err + } + defer hash.Close() + if _, err := hash.Write(data); err != nil { + return result, err + } + return hash.Sum() +} diff --git a/vendor/github.com/spacemonkeygo/openssl/md5.go b/vendor/github.com/spacemonkeygo/openssl/md5.go new file mode 100644 index 00000000..82f2eb2f --- /dev/null +++ b/vendor/github.com/spacemonkeygo/openssl/md5.go @@ -0,0 +1,89 @@ +// Copyright (C) 2017. See 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 openssl + +// #include "shim.h" +import "C" + +import ( + "errors" + "runtime" + "unsafe" +) + +type MD5Hash struct { + ctx *C.EVP_MD_CTX + engine *Engine +} + +func NewMD5Hash() (*MD5Hash, error) { return NewMD5HashWithEngine(nil) } + +func NewMD5HashWithEngine(e *Engine) (*MD5Hash, error) { + hash := &MD5Hash{engine: e} + hash.ctx = C.X_EVP_MD_CTX_new() + if hash.ctx == nil { + return nil, errors.New("openssl: md5: unable to allocate ctx") + } + runtime.SetFinalizer(hash, func(hash *MD5Hash) { hash.Close() }) + if err := hash.Reset(); err != nil { + return nil, err + } + return hash, nil +} + +func (s *MD5Hash) Close() { + if s.ctx != nil { + C.X_EVP_MD_CTX_free(s.ctx) + s.ctx = nil + } +} + +func (s *MD5Hash) Reset() error { + if 1 != C.X_EVP_DigestInit_ex(s.ctx, C.X_EVP_md5(), engineRef(s.engine)) { + return errors.New("openssl: md5: cannot init digest ctx") + } + return nil +} + +func (s *MD5Hash) Write(p []byte) (n int, err error) { + if len(p) == 0 { + return 0, nil + } + if 1 != C.X_EVP_DigestUpdate(s.ctx, unsafe.Pointer(&p[0]), + C.size_t(len(p))) { + return 0, errors.New("openssl: md5: cannot update digest") + } + return len(p), nil +} + +func (s *MD5Hash) Sum() (result [16]byte, err error) { + if 1 != C.X_EVP_DigestFinal_ex(s.ctx, + (*C.uchar)(unsafe.Pointer(&result[0])), nil) { + return result, errors.New("openssl: md5: cannot finalize ctx") + } + return result, s.Reset() +} + +func MD5(data []byte) (result [16]byte, err error) { + hash, err := NewMD5Hash() + if err != nil { + return result, err + } + defer hash.Close() + if _, err := hash.Write(data); err != nil { + return result, err + } + return hash.Sum() +} diff --git a/vendor/github.com/spacemonkeygo/openssl/net.go b/vendor/github.com/spacemonkeygo/openssl/net.go new file mode 100644 index 00000000..54beb8ee --- /dev/null +++ b/vendor/github.com/spacemonkeygo/openssl/net.go @@ -0,0 +1,147 @@ +// Copyright (C) 2017. See 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 openssl + +import ( + "errors" + "net" +) + +type listener struct { + net.Listener + ctx *Ctx +} + +func (l *listener) Accept() (c net.Conn, err error) { + c, err = l.Listener.Accept() + if err != nil { + return nil, err + } + ssl_c, err := Server(c, l.ctx) + if err != nil { + c.Close() + return nil, err + } + return ssl_c, nil +} + +// NewListener wraps an existing net.Listener such that all accepted +// connections are wrapped as OpenSSL server connections using the provided +// context ctx. +func NewListener(inner net.Listener, ctx *Ctx) net.Listener { + return &listener{ + Listener: inner, + ctx: ctx} +} + +// Listen is a wrapper around net.Listen that wraps incoming connections with +// an OpenSSL server connection using the provided context ctx. +func Listen(network, laddr string, ctx *Ctx) (net.Listener, error) { + if ctx == nil { + return nil, errors.New("no ssl context provided") + } + l, err := net.Listen(network, laddr) + if err != nil { + return nil, err + } + return NewListener(l, ctx), nil +} + +type DialFlags int + +const ( + InsecureSkipHostVerification DialFlags = 1 << iota + DisableSNI +) + +// Dial will connect to network/address and then wrap the corresponding +// underlying connection with an OpenSSL client connection using context ctx. +// If flags includes InsecureSkipHostVerification, the server certificate's +// hostname will not be checked to match the hostname in addr. Otherwise, flags +// should be 0. +// +// Dial probably won't work for you unless you set a verify location or add +// some certs to the certificate store of the client context you're using. +// This library is not nice enough to use the system certificate store by +// default for you yet. +func Dial(network, addr string, ctx *Ctx, flags DialFlags) (*Conn, error) { + return DialSession(network, addr, ctx, flags, nil) +} + +// DialSession will connect to network/address and then wrap the corresponding +// underlying connection with an OpenSSL client connection using context ctx. +// If flags includes InsecureSkipHostVerification, the server certificate's +// hostname will not be checked to match the hostname in addr. Otherwise, flags +// should be 0. +// +// Dial probably won't work for you unless you set a verify location or add +// some certs to the certificate store of the client context you're using. +// This library is not nice enough to use the system certificate store by +// default for you yet. +// +// If session is not nil it will be used to resume the tls state. The session +// can be retrieved from the GetSession method on the Conn. +func DialSession(network, addr string, ctx *Ctx, flags DialFlags, + session []byte) (*Conn, error) { + + host, _, err := net.SplitHostPort(addr) + if err != nil { + return nil, err + } + if ctx == nil { + var err error + ctx, err = NewCtx() + if err != nil { + return nil, err + } + // TODO: use operating system default certificate chain? + } + c, err := net.Dial(network, addr) + if err != nil { + return nil, err + } + conn, err := Client(c, ctx) + if err != nil { + c.Close() + return nil, err + } + if session != nil { + err := conn.setSession(session) + if err != nil { + c.Close() + return nil, err + } + } + if flags&DisableSNI == 0 { + err = conn.SetTlsExtHostName(host) + if err != nil { + conn.Close() + return nil, err + } + } + err = conn.Handshake() + if err != nil { + conn.Close() + return nil, err + } + if flags&InsecureSkipHostVerification == 0 { + err = conn.VerifyHostname(host) + if err != nil { + conn.Close() + return nil, err + } + } + return conn, nil +} diff --git a/vendor/github.com/spacemonkeygo/openssl/nid.go b/vendor/github.com/spacemonkeygo/openssl/nid.go new file mode 100644 index 00000000..936a52e7 --- /dev/null +++ b/vendor/github.com/spacemonkeygo/openssl/nid.go @@ -0,0 +1,210 @@ +// Copyright (C) 2017. See 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 openssl + +type NID int + +const ( + NID_undef NID = 0 + NID_rsadsi NID = 1 + NID_pkcs NID = 2 + NID_md2 NID = 3 + NID_md5 NID = 4 + NID_rc4 NID = 5 + NID_rsaEncryption NID = 6 + NID_md2WithRSAEncryption NID = 7 + NID_md5WithRSAEncryption NID = 8 + NID_pbeWithMD2AndDES_CBC NID = 9 + NID_pbeWithMD5AndDES_CBC NID = 10 + NID_X500 NID = 11 + NID_X509 NID = 12 + NID_commonName NID = 13 + NID_countryName NID = 14 + NID_localityName NID = 15 + NID_stateOrProvinceName NID = 16 + NID_organizationName NID = 17 + NID_organizationalUnitName NID = 18 + NID_rsa NID = 19 + NID_pkcs7 NID = 20 + NID_pkcs7_data NID = 21 + NID_pkcs7_signed NID = 22 + NID_pkcs7_enveloped NID = 23 + NID_pkcs7_signedAndEnveloped NID = 24 + NID_pkcs7_digest NID = 25 + NID_pkcs7_encrypted NID = 26 + NID_pkcs3 NID = 27 + NID_dhKeyAgreement NID = 28 + NID_des_ecb NID = 29 + NID_des_cfb64 NID = 30 + NID_des_cbc NID = 31 + NID_des_ede NID = 32 + NID_des_ede3 NID = 33 + NID_idea_cbc NID = 34 + NID_idea_cfb64 NID = 35 + NID_idea_ecb NID = 36 + NID_rc2_cbc NID = 37 + NID_rc2_ecb NID = 38 + NID_rc2_cfb64 NID = 39 + NID_rc2_ofb64 NID = 40 + NID_sha NID = 41 + NID_shaWithRSAEncryption NID = 42 + NID_des_ede_cbc NID = 43 + NID_des_ede3_cbc NID = 44 + NID_des_ofb64 NID = 45 + NID_idea_ofb64 NID = 46 + NID_pkcs9 NID = 47 + NID_pkcs9_emailAddress NID = 48 + NID_pkcs9_unstructuredName NID = 49 + NID_pkcs9_contentType NID = 50 + NID_pkcs9_messageDigest NID = 51 + NID_pkcs9_signingTime NID = 52 + NID_pkcs9_countersignature NID = 53 + NID_pkcs9_challengePassword NID = 54 + NID_pkcs9_unstructuredAddress NID = 55 + NID_pkcs9_extCertAttributes NID = 56 + NID_netscape NID = 57 + NID_netscape_cert_extension NID = 58 + NID_netscape_data_type NID = 59 + NID_des_ede_cfb64 NID = 60 + NID_des_ede3_cfb64 NID = 61 + NID_des_ede_ofb64 NID = 62 + NID_des_ede3_ofb64 NID = 63 + NID_sha1 NID = 64 + NID_sha1WithRSAEncryption NID = 65 + NID_dsaWithSHA NID = 66 + NID_dsa_2 NID = 67 + NID_pbeWithSHA1AndRC2_CBC NID = 68 + NID_id_pbkdf2 NID = 69 + NID_dsaWithSHA1_2 NID = 70 + NID_netscape_cert_type NID = 71 + NID_netscape_base_url NID = 72 + NID_netscape_revocation_url NID = 73 + NID_netscape_ca_revocation_url NID = 74 + NID_netscape_renewal_url NID = 75 + NID_netscape_ca_policy_url NID = 76 + NID_netscape_ssl_server_name NID = 77 + NID_netscape_comment NID = 78 + NID_netscape_cert_sequence NID = 79 + NID_desx_cbc NID = 80 + NID_id_ce NID = 81 + NID_subject_key_identifier NID = 82 + NID_key_usage NID = 83 + NID_private_key_usage_period NID = 84 + NID_subject_alt_name NID = 85 + NID_issuer_alt_name NID = 86 + NID_basic_constraints NID = 87 + NID_crl_number NID = 88 + NID_certificate_policies NID = 89 + NID_authority_key_identifier NID = 90 + NID_bf_cbc NID = 91 + NID_bf_ecb NID = 92 + NID_bf_cfb64 NID = 93 + NID_bf_ofb64 NID = 94 + NID_mdc2 NID = 95 + NID_mdc2WithRSA NID = 96 + NID_rc4_40 NID = 97 + NID_rc2_40_cbc NID = 98 + NID_givenName NID = 99 + NID_surname NID = 100 + NID_initials NID = 101 + NID_uniqueIdentifier NID = 102 + NID_crl_distribution_points NID = 103 + NID_md5WithRSA NID = 104 + NID_serialNumber NID = 105 + NID_title NID = 106 + NID_description NID = 107 + NID_cast5_cbc NID = 108 + NID_cast5_ecb NID = 109 + NID_cast5_cfb64 NID = 110 + NID_cast5_ofb64 NID = 111 + NID_pbeWithMD5AndCast5_CBC NID = 112 + NID_dsaWithSHA1 NID = 113 + NID_md5_sha1 NID = 114 + NID_sha1WithRSA NID = 115 + NID_dsa NID = 116 + NID_ripemd160 NID = 117 + NID_ripemd160WithRSA NID = 119 + NID_rc5_cbc NID = 120 + NID_rc5_ecb NID = 121 + NID_rc5_cfb64 NID = 122 + NID_rc5_ofb64 NID = 123 + NID_rle_compression NID = 124 + NID_zlib_compression NID = 125 + NID_ext_key_usage NID = 126 + NID_id_pkix NID = 127 + NID_id_kp NID = 128 + NID_server_auth NID = 129 + NID_client_auth NID = 130 + NID_code_sign NID = 131 + NID_email_protect NID = 132 + NID_time_stamp NID = 133 + NID_ms_code_ind NID = 134 + NID_ms_code_com NID = 135 + NID_ms_ctl_sign NID = 136 + NID_ms_sgc NID = 137 + NID_ms_efs NID = 138 + NID_ns_sgc NID = 139 + NID_delta_crl NID = 140 + NID_crl_reason NID = 141 + NID_invalidity_date NID = 142 + NID_sxnet NID = 143 + NID_pbe_WithSHA1And128BitRC4 NID = 144 + NID_pbe_WithSHA1And40BitRC4 NID = 145 + NID_pbe_WithSHA1And3_Key_TripleDES_CBC NID = 146 + NID_pbe_WithSHA1And2_Key_TripleDES_CBC NID = 147 + NID_pbe_WithSHA1And128BitRC2_CBC NID = 148 + NID_pbe_WithSHA1And40BitRC2_CBC NID = 149 + NID_keyBag NID = 150 + NID_pkcs8ShroudedKeyBag NID = 151 + NID_certBag NID = 152 + NID_crlBag NID = 153 + NID_secretBag NID = 154 + NID_safeContentsBag NID = 155 + NID_friendlyName NID = 156 + NID_localKeyID NID = 157 + NID_x509Certificate NID = 158 + NID_sdsiCertificate NID = 159 + NID_x509Crl NID = 160 + NID_pbes2 NID = 161 + NID_pbmac1 NID = 162 + NID_hmacWithSHA1 NID = 163 + NID_id_qt_cps NID = 164 + NID_id_qt_unotice NID = 165 + NID_rc2_64_cbc NID = 166 + NID_SMIMECapabilities NID = 167 + NID_pbeWithMD2AndRC2_CBC NID = 168 + NID_pbeWithMD5AndRC2_CBC NID = 169 + NID_pbeWithSHA1AndDES_CBC NID = 170 + NID_ms_ext_req NID = 171 + NID_ext_req NID = 172 + NID_name NID = 173 + NID_dnQualifier NID = 174 + NID_id_pe NID = 175 + NID_id_ad NID = 176 + NID_info_access NID = 177 + NID_ad_OCSP NID = 178 + NID_ad_ca_issuers NID = 179 + NID_OCSP_sign NID = 180 + NID_X9_62_id_ecPublicKey NID = 408 + NID_hmac NID = 855 + NID_cmac NID = 894 + NID_dhpublicnumber NID = 920 + NID_tls1_prf NID = 1021 + NID_hkdf NID = 1036 + NID_X25519 NID = 1034 + NID_X448 NID = 1035 + NID_ED25519 NID = 1087 + NID_ED448 NID = 1088 +) diff --git a/vendor/github.com/spacemonkeygo/openssl/pem.go b/vendor/github.com/spacemonkeygo/openssl/pem.go new file mode 100644 index 00000000..c8b0c1cf --- /dev/null +++ b/vendor/github.com/spacemonkeygo/openssl/pem.go @@ -0,0 +1,32 @@ +// Copyright (C) 2017. See 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 openssl + +import ( + "regexp" +) + +var pemSplit *regexp.Regexp = regexp.MustCompile(`(?sm)` + + `(^-----[\s-]*?BEGIN.*?-----$` + + `.*?` + + `^-----[\s-]*?END.*?-----$)`) + +func SplitPEM(data []byte) [][]byte { + var results [][]byte + for _, block := range pemSplit.FindAll(data, -1) { + results = append(results, block) + } + return results +} diff --git a/vendor/github.com/spacemonkeygo/openssl/sha1.go b/vendor/github.com/spacemonkeygo/openssl/sha1.go new file mode 100644 index 00000000..c227bee8 --- /dev/null +++ b/vendor/github.com/spacemonkeygo/openssl/sha1.go @@ -0,0 +1,96 @@ +// Copyright (C) 2017. See 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 openssl + +// #include "shim.h" +import "C" + +import ( + "errors" + "runtime" + "unsafe" +) + +type SHA1Hash struct { + ctx *C.EVP_MD_CTX + engine *Engine +} + +func NewSHA1Hash() (*SHA1Hash, error) { return NewSHA1HashWithEngine(nil) } + +func NewSHA1HashWithEngine(e *Engine) (*SHA1Hash, error) { + hash := &SHA1Hash{engine: e} + hash.ctx = C.X_EVP_MD_CTX_new() + if hash.ctx == nil { + return nil, errors.New("openssl: sha1: unable to allocate ctx") + } + runtime.SetFinalizer(hash, func(hash *SHA1Hash) { hash.Close() }) + if err := hash.Reset(); err != nil { + return nil, err + } + return hash, nil +} + +func (s *SHA1Hash) Close() { + if s.ctx != nil { + C.X_EVP_MD_CTX_free(s.ctx) + s.ctx = nil + } +} + +func engineRef(e *Engine) *C.ENGINE { + if e == nil { + return nil + } + return e.e +} + +func (s *SHA1Hash) Reset() error { + if 1 != C.X_EVP_DigestInit_ex(s.ctx, C.X_EVP_sha1(), engineRef(s.engine)) { + return errors.New("openssl: sha1: cannot init digest ctx") + } + return nil +} + +func (s *SHA1Hash) Write(p []byte) (n int, err error) { + if len(p) == 0 { + return 0, nil + } + if 1 != C.X_EVP_DigestUpdate(s.ctx, unsafe.Pointer(&p[0]), + C.size_t(len(p))) { + return 0, errors.New("openssl: sha1: cannot update digest") + } + return len(p), nil +} + +func (s *SHA1Hash) Sum() (result [20]byte, err error) { + if 1 != C.X_EVP_DigestFinal_ex(s.ctx, + (*C.uchar)(unsafe.Pointer(&result[0])), nil) { + return result, errors.New("openssl: sha1: cannot finalize ctx") + } + return result, s.Reset() +} + +func SHA1(data []byte) (result [20]byte, err error) { + hash, err := NewSHA1Hash() + if err != nil { + return result, err + } + defer hash.Close() + if _, err := hash.Write(data); err != nil { + return result, err + } + return hash.Sum() +} diff --git a/vendor/github.com/spacemonkeygo/openssl/sha256.go b/vendor/github.com/spacemonkeygo/openssl/sha256.go new file mode 100644 index 00000000..d25c7a95 --- /dev/null +++ b/vendor/github.com/spacemonkeygo/openssl/sha256.go @@ -0,0 +1,89 @@ +// Copyright (C) 2017. See 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 openssl + +// #include "shim.h" +import "C" + +import ( + "errors" + "runtime" + "unsafe" +) + +type SHA256Hash struct { + ctx *C.EVP_MD_CTX + engine *Engine +} + +func NewSHA256Hash() (*SHA256Hash, error) { return NewSHA256HashWithEngine(nil) } + +func NewSHA256HashWithEngine(e *Engine) (*SHA256Hash, error) { + hash := &SHA256Hash{engine: e} + hash.ctx = C.X_EVP_MD_CTX_new() + if hash.ctx == nil { + return nil, errors.New("openssl: sha256: unable to allocate ctx") + } + runtime.SetFinalizer(hash, func(hash *SHA256Hash) { hash.Close() }) + if err := hash.Reset(); err != nil { + return nil, err + } + return hash, nil +} + +func (s *SHA256Hash) Close() { + if s.ctx != nil { + C.X_EVP_MD_CTX_free(s.ctx) + s.ctx = nil + } +} + +func (s *SHA256Hash) Reset() error { + if 1 != C.X_EVP_DigestInit_ex(s.ctx, C.X_EVP_sha256(), engineRef(s.engine)) { + return errors.New("openssl: sha256: cannot init digest ctx") + } + return nil +} + +func (s *SHA256Hash) Write(p []byte) (n int, err error) { + if len(p) == 0 { + return 0, nil + } + if 1 != C.X_EVP_DigestUpdate(s.ctx, unsafe.Pointer(&p[0]), + C.size_t(len(p))) { + return 0, errors.New("openssl: sha256: cannot update digest") + } + return len(p), nil +} + +func (s *SHA256Hash) Sum() (result [32]byte, err error) { + if 1 != C.X_EVP_DigestFinal_ex(s.ctx, + (*C.uchar)(unsafe.Pointer(&result[0])), nil) { + return result, errors.New("openssl: sha256: cannot finalize ctx") + } + return result, s.Reset() +} + +func SHA256(data []byte) (result [32]byte, err error) { + hash, err := NewSHA256Hash() + if err != nil { + return result, err + } + defer hash.Close() + if _, err := hash.Write(data); err != nil { + return result, err + } + return hash.Sum() +} diff --git a/vendor/github.com/spacemonkeygo/openssl/shim.c b/vendor/github.com/spacemonkeygo/openssl/shim.c new file mode 100644 index 00000000..6e680841 --- /dev/null +++ b/vendor/github.com/spacemonkeygo/openssl/shim.c @@ -0,0 +1,770 @@ +/* + * Copyright (C) 2014 Space Monkey, 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. + * + */ + +#include + +#include + +#include +#include +#include +#include +#include +#include + +#include "_cgo_export.h" + +/* + * Functions defined in other .c files + */ +extern int go_init_locks(); +extern void go_thread_locking_callback(int, int, const char*, int); +extern unsigned long go_thread_id_callback(); +static int go_write_bio_puts(BIO *b, const char *str) { + return go_write_bio_write(b, (char*)str, (int)strlen(str)); +} + +/* + ************************************************ + * v1.1.1 and later implementation + ************************************************ + */ +#if OPENSSL_VERSION_NUMBER >= 0x1010100fL + +const int X_ED25519_SUPPORT = 1; +int X_EVP_PKEY_ED25519 = EVP_PKEY_ED25519; + +int X_EVP_DigestSignInit(EVP_MD_CTX *ctx, EVP_PKEY_CTX **pctx, + const EVP_MD *type, ENGINE *e, EVP_PKEY *pkey){ + return EVP_DigestSignInit(ctx, pctx, type, e, pkey); +} + +int X_EVP_DigestSign(EVP_MD_CTX *ctx, unsigned char *sigret, + size_t *siglen, const unsigned char *tbs, size_t tbslen) { + return EVP_DigestSign(ctx, sigret, siglen, tbs, tbslen); +} + + +int X_EVP_DigestVerifyInit(EVP_MD_CTX *ctx, EVP_PKEY_CTX **pctx, + const EVP_MD *type, ENGINE *e, EVP_PKEY *pkey){ + return EVP_DigestVerifyInit(ctx, pctx, type, e, pkey); +} + +int X_EVP_DigestVerify(EVP_MD_CTX *ctx, const unsigned char *sigret, + size_t siglen, const unsigned char *tbs, size_t tbslen){ + return EVP_DigestVerify(ctx, sigret, siglen, tbs, tbslen); +} + +#else + +const int X_ED25519_SUPPORT = 0; +int X_EVP_PKEY_ED25519 = EVP_PKEY_NONE; + +int X_EVP_DigestSignInit(EVP_MD_CTX *ctx, EVP_PKEY_CTX **pctx, + const EVP_MD *type, ENGINE *e, EVP_PKEY *pkey){ + return 0; +} + +int X_EVP_DigestSign(EVP_MD_CTX *ctx, unsigned char *sigret, + size_t *siglen, const unsigned char *tbs, size_t tbslen) { + return 0; +} + + +int X_EVP_DigestVerifyInit(EVP_MD_CTX *ctx, EVP_PKEY_CTX **pctx, + const EVP_MD *type, ENGINE *e, EVP_PKEY *pkey){ + return 0; +} + +int X_EVP_DigestVerify(EVP_MD_CTX *ctx, const unsigned char *sigret, + size_t siglen, const unsigned char *tbs, size_t tbslen){ + return 0; +} + +#endif + +/* + ************************************************ + * v1.1.X and later implementation + ************************************************ + */ +#if OPENSSL_VERSION_NUMBER >= 0x1010000fL + +void X_BIO_set_data(BIO* bio, void* data) { + BIO_set_data(bio, data); +} + +void* X_BIO_get_data(BIO* bio) { + return BIO_get_data(bio); +} + +EVP_MD_CTX* X_EVP_MD_CTX_new() { + return EVP_MD_CTX_new(); +} + +void X_EVP_MD_CTX_free(EVP_MD_CTX* ctx) { + EVP_MD_CTX_free(ctx); +} + +static int x_bio_create(BIO *b) { + BIO_set_shutdown(b, 1); + BIO_set_init(b, 1); + BIO_set_data(b, NULL); + BIO_clear_flags(b, ~0); + return 1; +} + +static int x_bio_free(BIO *b) { + return 1; +} + +static BIO_METHOD *writeBioMethod; +static BIO_METHOD *readBioMethod; + +BIO_METHOD* BIO_s_readBio() { return readBioMethod; } +BIO_METHOD* BIO_s_writeBio() { return writeBioMethod; } + +int x_bio_init_methods() { + writeBioMethod = BIO_meth_new(BIO_TYPE_SOURCE_SINK, "Go Write BIO"); + if (!writeBioMethod) { + return 1; + } + if (1 != BIO_meth_set_write(writeBioMethod, + (int (*)(BIO *, const char *, int))go_write_bio_write)) { + return 2; + } + if (1 != BIO_meth_set_puts(writeBioMethod, go_write_bio_puts)) { + return 3; + } + if (1 != BIO_meth_set_ctrl(writeBioMethod, go_write_bio_ctrl)) { + return 4; + } + if (1 != BIO_meth_set_create(writeBioMethod, x_bio_create)) { + return 5; + } + if (1 != BIO_meth_set_destroy(writeBioMethod, x_bio_free)) { + return 6; + } + + readBioMethod = BIO_meth_new(BIO_TYPE_SOURCE_SINK, "Go Read BIO"); + if (!readBioMethod) { + return 7; + } + if (1 != BIO_meth_set_read(readBioMethod, go_read_bio_read)) { + return 8; + } + if (1 != BIO_meth_set_ctrl(readBioMethod, go_read_bio_ctrl)) { + return 9; + } + if (1 != BIO_meth_set_create(readBioMethod, x_bio_create)) { + return 10; + } + if (1 != BIO_meth_set_destroy(readBioMethod, x_bio_free)) { + return 11; + } + + return 0; +} + +const EVP_MD *X_EVP_dss() { + return NULL; +} + +const EVP_MD *X_EVP_dss1() { + return NULL; +} + +const EVP_MD *X_EVP_sha() { + return NULL; +} + +int X_EVP_CIPHER_CTX_encrypting(const EVP_CIPHER_CTX *ctx) { + return EVP_CIPHER_CTX_encrypting(ctx); +} + +int X_X509_add_ref(X509* x509) { + return X509_up_ref(x509); +} + +const ASN1_TIME *X_X509_get0_notBefore(const X509 *x) { + return X509_get0_notBefore(x); +} + +const ASN1_TIME *X_X509_get0_notAfter(const X509 *x) { + return X509_get0_notAfter(x); +} + +HMAC_CTX *X_HMAC_CTX_new(void) { + return HMAC_CTX_new(); +} + +void X_HMAC_CTX_free(HMAC_CTX *ctx) { + HMAC_CTX_free(ctx); +} + +int X_PEM_write_bio_PrivateKey_traditional(BIO *bio, EVP_PKEY *key, const EVP_CIPHER *enc, unsigned char *kstr, int klen, pem_password_cb *cb, void *u) { + return PEM_write_bio_PrivateKey_traditional(bio, key, enc, kstr, klen, cb, u); +} + +#endif + +/* + ************************************************ + * v1.0.X implementation + ************************************************ + */ +#if OPENSSL_VERSION_NUMBER < 0x1010000fL + +static int x_bio_create(BIO *b) { + b->shutdown = 1; + b->init = 1; + b->num = -1; + b->ptr = NULL; + b->flags = 0; + return 1; +} + +static int x_bio_free(BIO *b) { + return 1; +} + +static BIO_METHOD writeBioMethod = { + BIO_TYPE_SOURCE_SINK, + "Go Write BIO", + (int (*)(BIO *, const char *, int))go_write_bio_write, + NULL, + go_write_bio_puts, + NULL, + go_write_bio_ctrl, + x_bio_create, + x_bio_free, + NULL}; + +static BIO_METHOD* BIO_s_writeBio() { return &writeBioMethod; } + +static BIO_METHOD readBioMethod = { + BIO_TYPE_SOURCE_SINK, + "Go Read BIO", + NULL, + go_read_bio_read, + NULL, + NULL, + go_read_bio_ctrl, + x_bio_create, + x_bio_free, + NULL}; + +static BIO_METHOD* BIO_s_readBio() { return &readBioMethod; } + +int x_bio_init_methods() { + /* statically initialized above */ + return 0; +} + +void X_BIO_set_data(BIO* bio, void* data) { + bio->ptr = data; +} + +void* X_BIO_get_data(BIO* bio) { + return bio->ptr; +} + +EVP_MD_CTX* X_EVP_MD_CTX_new() { + return EVP_MD_CTX_create(); +} + +void X_EVP_MD_CTX_free(EVP_MD_CTX* ctx) { + EVP_MD_CTX_destroy(ctx); +} + +int X_X509_add_ref(X509* x509) { + CRYPTO_add(&x509->references, 1, CRYPTO_LOCK_X509); + return 1; +} + +const ASN1_TIME *X_X509_get0_notBefore(const X509 *x) { + return x->cert_info->validity->notBefore; +} + +const ASN1_TIME *X_X509_get0_notAfter(const X509 *x) { + return x->cert_info->validity->notAfter; +} + +const EVP_MD *X_EVP_dss() { + return EVP_dss(); +} + +const EVP_MD *X_EVP_dss1() { + return EVP_dss1(); +} + +const EVP_MD *X_EVP_sha() { + return EVP_sha(); +} + +int X_EVP_CIPHER_CTX_encrypting(const EVP_CIPHER_CTX *ctx) { + return ctx->encrypt; +} + +HMAC_CTX *X_HMAC_CTX_new(void) { + /* v1.1.0 uses a OPENSSL_zalloc to allocate the memory which does not exist + * in previous versions. malloc+memset to get the same behavior */ + HMAC_CTX *ctx = (HMAC_CTX *)OPENSSL_malloc(sizeof(HMAC_CTX)); + if (ctx) { + memset(ctx, 0, sizeof(HMAC_CTX)); + HMAC_CTX_init(ctx); + } + return ctx; +} + +void X_HMAC_CTX_free(HMAC_CTX *ctx) { + if (ctx) { + HMAC_CTX_cleanup(ctx); + OPENSSL_free(ctx); + } +} + +int X_PEM_write_bio_PrivateKey_traditional(BIO *bio, EVP_PKEY *key, const EVP_CIPHER *enc, unsigned char *kstr, int klen, pem_password_cb *cb, void *u) { + /* PEM_write_bio_PrivateKey always tries to use the PKCS8 format if it + * is available, instead of using the "traditional" format as stated in the + * OpenSSL man page. + * i2d_PrivateKey should give us the correct DER encoding, so we'll just + * use PEM_ASN1_write_bio directly to write the DER encoding with the correct + * type header. */ + + int ppkey_id, pkey_base_id, ppkey_flags; + const char *pinfo, *ppem_str; + char pem_type_str[80]; + + // Lookup the ASN1 method information to get the pem type + if (EVP_PKEY_asn1_get0_info(&ppkey_id, &pkey_base_id, &ppkey_flags, &pinfo, &ppem_str, key->ameth) != 1) { + return 0; + } + // Set up the PEM type string + if (BIO_snprintf(pem_type_str, 80, "%s PRIVATE KEY", ppem_str) <= 0) { + // Failed to write out the pem type string, something is really wrong. + return 0; + } + // Write out everything to the BIO + return PEM_ASN1_write_bio((i2d_of_void *)i2d_PrivateKey, + pem_type_str, bio, key, enc, kstr, klen, cb, u); +} + +#endif + +/* + ************************************************ + * common implementation + ************************************************ + */ + +int X_shim_init() { + int rc = 0; + + OPENSSL_config(NULL); + ENGINE_load_builtin_engines(); + SSL_load_error_strings(); + SSL_library_init(); + OpenSSL_add_all_algorithms(); + // + // Set up OPENSSL thread safety callbacks. + rc = go_init_locks(); + if (rc != 0) { + return rc; + } + CRYPTO_set_locking_callback(go_thread_locking_callback); + CRYPTO_set_id_callback(go_thread_id_callback); + + rc = x_bio_init_methods(); + if (rc != 0) { + return rc; + } + + return 0; +} + +void * X_OPENSSL_malloc(size_t size) { + return OPENSSL_malloc(size); +} + +void X_OPENSSL_free(void *ref) { + OPENSSL_free(ref); +} + +long X_SSL_set_options(SSL* ssl, long options) { + return SSL_set_options(ssl, options); +} + +long X_SSL_get_options(SSL* ssl) { + return SSL_get_options(ssl); +} + +long X_SSL_clear_options(SSL* ssl, long options) { + return SSL_clear_options(ssl, options); +} + +long X_SSL_set_tlsext_host_name(SSL *ssl, const char *name) { + return SSL_set_tlsext_host_name(ssl, name); +} +const char * X_SSL_get_cipher_name(const SSL *ssl) { + return SSL_get_cipher_name(ssl); +} +int X_SSL_session_reused(SSL *ssl) { + return SSL_session_reused(ssl); +} + +int X_SSL_new_index() { + return SSL_get_ex_new_index(0, NULL, NULL, NULL, NULL); +} + +int X_SSL_verify_cb(int ok, X509_STORE_CTX* store) { + SSL* ssl = (SSL *)X509_STORE_CTX_get_ex_data(store, + SSL_get_ex_data_X509_STORE_CTX_idx()); + void* p = SSL_get_ex_data(ssl, get_ssl_idx()); + // get the pointer to the go Ctx object and pass it back into the thunk + return go_ssl_verify_cb_thunk(p, ok, store); +} + +const SSL_METHOD *X_SSLv23_method() { + return SSLv23_method(); +} + +const SSL_METHOD *X_SSLv3_method() { +#ifndef OPENSSL_NO_SSL3_METHOD + return SSLv3_method(); +#else + return NULL; +#endif +} + +const SSL_METHOD *X_TLSv1_method() { + return TLSv1_method(); +} + +const SSL_METHOD *X_TLSv1_1_method() { +#if defined(TLS1_1_VERSION) && !defined(OPENSSL_SYSNAME_MACOSX) + return TLSv1_1_method(); +#else + return NULL; +#endif +} + +const SSL_METHOD *X_TLSv1_2_method() { +#if defined(TLS1_2_VERSION) && !defined(OPENSSL_SYSNAME_MACOSX) + return TLSv1_2_method(); +#else + return NULL; +#endif +} + +int X_SSL_CTX_new_index() { + return SSL_CTX_get_ex_new_index(0, NULL, NULL, NULL, NULL); +} + +long X_SSL_CTX_set_options(SSL_CTX* ctx, long options) { + return SSL_CTX_set_options(ctx, options); +} + +long X_SSL_CTX_clear_options(SSL_CTX* ctx, long options) { + return SSL_CTX_clear_options(ctx, options); +} + +long X_SSL_CTX_get_options(SSL_CTX* ctx) { + return SSL_CTX_get_options(ctx); +} + +long X_SSL_CTX_set_mode(SSL_CTX* ctx, long modes) { + return SSL_CTX_set_mode(ctx, modes); +} + +long X_SSL_CTX_get_mode(SSL_CTX* ctx) { + return SSL_CTX_get_mode(ctx); +} + +long X_SSL_CTX_set_session_cache_mode(SSL_CTX* ctx, long modes) { + return SSL_CTX_set_session_cache_mode(ctx, modes); +} + +long X_SSL_CTX_sess_set_cache_size(SSL_CTX* ctx, long t) { + return SSL_CTX_sess_set_cache_size(ctx, t); +} + +long X_SSL_CTX_sess_get_cache_size(SSL_CTX* ctx) { + return SSL_CTX_sess_get_cache_size(ctx); +} + +long X_SSL_CTX_set_timeout(SSL_CTX* ctx, long t) { + return SSL_CTX_set_timeout(ctx, t); +} + +long X_SSL_CTX_get_timeout(SSL_CTX* ctx) { + return SSL_CTX_get_timeout(ctx); +} + +long X_SSL_CTX_add_extra_chain_cert(SSL_CTX* ctx, X509 *cert) { + return SSL_CTX_add_extra_chain_cert(ctx, cert); +} + +long X_SSL_CTX_set_tmp_ecdh(SSL_CTX* ctx, EC_KEY *key) { + return SSL_CTX_set_tmp_ecdh(ctx, key); +} + +long X_SSL_CTX_set_tlsext_servername_callback( + SSL_CTX* ctx, int (*cb)(SSL *con, int *ad, void *args)) { + return SSL_CTX_set_tlsext_servername_callback(ctx, cb); +} + +int X_SSL_CTX_verify_cb(int ok, X509_STORE_CTX* store) { + SSL* ssl = (SSL *)X509_STORE_CTX_get_ex_data(store, + SSL_get_ex_data_X509_STORE_CTX_idx()); + SSL_CTX* ssl_ctx = SSL_get_SSL_CTX(ssl); + void* p = SSL_CTX_get_ex_data(ssl_ctx, get_ssl_ctx_idx()); + // get the pointer to the go Ctx object and pass it back into the thunk + return go_ssl_ctx_verify_cb_thunk(p, ok, store); +} + +long X_SSL_CTX_set_tmp_dh(SSL_CTX* ctx, DH *dh) { + return SSL_CTX_set_tmp_dh(ctx, dh); +} + +long X_PEM_read_DHparams(SSL_CTX* ctx, DH *dh) { + return SSL_CTX_set_tmp_dh(ctx, dh); +} + +int X_SSL_CTX_set_tlsext_ticket_key_cb(SSL_CTX *sslctx, + int (*cb)(SSL *s, unsigned char key_name[16], + unsigned char iv[EVP_MAX_IV_LENGTH], + EVP_CIPHER_CTX *ctx, HMAC_CTX *hctx, int enc)) { + return SSL_CTX_set_tlsext_ticket_key_cb(sslctx, cb); +} + +int X_SSL_CTX_ticket_key_cb(SSL *s, unsigned char key_name[16], + unsigned char iv[EVP_MAX_IV_LENGTH], + EVP_CIPHER_CTX *cctx, HMAC_CTX *hctx, int enc) { + + SSL_CTX* ssl_ctx = SSL_get_SSL_CTX(s); + void* p = SSL_CTX_get_ex_data(ssl_ctx, get_ssl_ctx_idx()); + // get the pointer to the go Ctx object and pass it back into the thunk + return go_ticket_key_cb_thunk(p, s, key_name, iv, cctx, hctx, enc); +} + +int X_BIO_get_flags(BIO *b) { + return BIO_get_flags(b); +} + +void X_BIO_set_flags(BIO *b, int flags) { + return BIO_set_flags(b, flags); +} + +void X_BIO_clear_flags(BIO *b, int flags) { + BIO_clear_flags(b, flags); +} + +int X_BIO_read(BIO *b, void *buf, int len) { + return BIO_read(b, buf, len); +} + +int X_BIO_write(BIO *b, const void *buf, int len) { + return BIO_write(b, buf, len); +} + +BIO *X_BIO_new_write_bio() { + return BIO_new(BIO_s_writeBio()); +} + +BIO *X_BIO_new_read_bio() { + return BIO_new(BIO_s_readBio()); +} + +const EVP_MD *X_EVP_get_digestbyname(const char *name) { + return EVP_get_digestbyname(name); +} + +const EVP_MD *X_EVP_md_null() { + return EVP_md_null(); +} + +const EVP_MD *X_EVP_md5() { + return EVP_md5(); +} + +const EVP_MD *X_EVP_md4() { + return EVP_md4(); +} + +const EVP_MD *X_EVP_ripemd160() { + return EVP_ripemd160(); +} + +const EVP_MD *X_EVP_sha224() { + return EVP_sha224(); +} + +const EVP_MD *X_EVP_sha1() { + return EVP_sha1(); +} + +const EVP_MD *X_EVP_sha256() { + return EVP_sha256(); +} + +const EVP_MD *X_EVP_sha384() { + return EVP_sha384(); +} + +const EVP_MD *X_EVP_sha512() { + return EVP_sha512(); +} + +int X_EVP_MD_size(const EVP_MD *md) { + return EVP_MD_size(md); +} + +int X_EVP_DigestInit_ex(EVP_MD_CTX *ctx, const EVP_MD *type, ENGINE *impl) { + return EVP_DigestInit_ex(ctx, type, impl); +} + +int X_EVP_DigestUpdate(EVP_MD_CTX *ctx, const void *d, size_t cnt) { + return EVP_DigestUpdate(ctx, d, cnt); +} + +int X_EVP_DigestFinal_ex(EVP_MD_CTX *ctx, unsigned char *md, unsigned int *s) { + return EVP_DigestFinal_ex(ctx, md, s); +} + +int X_EVP_SignInit(EVP_MD_CTX *ctx, const EVP_MD *type) { + return EVP_SignInit(ctx, type); +} + +int X_EVP_SignUpdate(EVP_MD_CTX *ctx, const void *d, unsigned int cnt) { + return EVP_SignUpdate(ctx, d, cnt); +} + +EVP_PKEY *X_EVP_PKEY_new(void) { + return EVP_PKEY_new(); +} + +void X_EVP_PKEY_free(EVP_PKEY *pkey) { + EVP_PKEY_free(pkey); +} + +int X_EVP_PKEY_size(EVP_PKEY *pkey) { + return EVP_PKEY_size(pkey); +} + +struct rsa_st *X_EVP_PKEY_get1_RSA(EVP_PKEY *pkey) { + return EVP_PKEY_get1_RSA(pkey); +} + +int X_EVP_PKEY_set1_RSA(EVP_PKEY *pkey, struct rsa_st *key) { + return EVP_PKEY_set1_RSA(pkey, key); +} + +int X_EVP_PKEY_assign_charp(EVP_PKEY *pkey, int type, char *key) { + return EVP_PKEY_assign(pkey, type, key); +} + +int X_EVP_SignFinal(EVP_MD_CTX *ctx, unsigned char *md, unsigned int *s, EVP_PKEY *pkey) { + return EVP_SignFinal(ctx, md, s, pkey); +} + +int X_EVP_VerifyInit(EVP_MD_CTX *ctx, const EVP_MD *type) { + return EVP_VerifyInit(ctx, type); +} + +int X_EVP_VerifyUpdate(EVP_MD_CTX *ctx, const void *d, + unsigned int cnt) { + return EVP_VerifyUpdate(ctx, d, cnt); +} + +int X_EVP_VerifyFinal(EVP_MD_CTX *ctx, const unsigned char *sigbuf, unsigned int siglen, EVP_PKEY *pkey) { + return EVP_VerifyFinal(ctx, sigbuf, siglen, pkey); +} + +int X_EVP_CIPHER_block_size(EVP_CIPHER *c) { + return EVP_CIPHER_block_size(c); +} + +int X_EVP_CIPHER_key_length(EVP_CIPHER *c) { + return EVP_CIPHER_key_length(c); +} + +int X_EVP_CIPHER_iv_length(EVP_CIPHER *c) { + return EVP_CIPHER_iv_length(c); +} + +int X_EVP_CIPHER_nid(EVP_CIPHER *c) { + return EVP_CIPHER_nid(c); +} + +int X_EVP_CIPHER_CTX_block_size(EVP_CIPHER_CTX *ctx) { + return EVP_CIPHER_CTX_block_size(ctx); +} + +int X_EVP_CIPHER_CTX_key_length(EVP_CIPHER_CTX *ctx) { + return EVP_CIPHER_CTX_key_length(ctx); +} + +int X_EVP_CIPHER_CTX_iv_length(EVP_CIPHER_CTX *ctx) { + return EVP_CIPHER_CTX_iv_length(ctx); +} + +void X_EVP_CIPHER_CTX_set_padding(EVP_CIPHER_CTX *ctx, int padding) { + //openssl always returns 1 for set_padding + //hence return value is not checked + EVP_CIPHER_CTX_set_padding(ctx, padding); +} + +const EVP_CIPHER *X_EVP_CIPHER_CTX_cipher(EVP_CIPHER_CTX *ctx) { + return EVP_CIPHER_CTX_cipher(ctx); +} + +int X_EVP_PKEY_CTX_set_ec_paramgen_curve_nid(EVP_PKEY_CTX *ctx, int nid) { + return EVP_PKEY_CTX_set_ec_paramgen_curve_nid(ctx, nid); +} + +size_t X_HMAC_size(const HMAC_CTX *e) { + return HMAC_size(e); +} + +int X_HMAC_Init_ex(HMAC_CTX *ctx, const void *key, int len, const EVP_MD *md, ENGINE *impl) { + return HMAC_Init_ex(ctx, key, len, md, impl); +} + +int X_HMAC_Update(HMAC_CTX *ctx, const unsigned char *data, size_t len) { + return HMAC_Update(ctx, data, len); +} + +int X_HMAC_Final(HMAC_CTX *ctx, unsigned char *md, unsigned int *len) { + return HMAC_Final(ctx, md, len); +} + +int X_sk_X509_num(STACK_OF(X509) *sk) { + return sk_X509_num(sk); +} + +X509 *X_sk_X509_value(STACK_OF(X509)* sk, int i) { + return sk_X509_value(sk, i); +} + +long X_X509_get_version(const X509 *x) { + return X509_get_version(x); +} + +int X_X509_set_version(X509 *x, long version) { + return X509_set_version(x, version); +} diff --git a/vendor/github.com/spacemonkeygo/openssl/shim.h b/vendor/github.com/spacemonkeygo/openssl/shim.h new file mode 100644 index 00000000..b792822b --- /dev/null +++ b/vendor/github.com/spacemonkeygo/openssl/shim.h @@ -0,0 +1,172 @@ +/* + * Copyright (C) 2014 Space Monkey, 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. + * + */ + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifndef SSL_MODE_RELEASE_BUFFERS +#define SSL_MODE_RELEASE_BUFFERS 0 +#endif + +#ifndef SSL_OP_NO_COMPRESSION +#define SSL_OP_NO_COMPRESSION 0 +#endif + +/* shim methods */ +extern int X_shim_init(); + +/* Library methods */ +extern void X_OPENSSL_free(void *ref); +extern void *X_OPENSSL_malloc(size_t size); + +/* SSL methods */ +extern long X_SSL_set_options(SSL* ssl, long options); +extern long X_SSL_get_options(SSL* ssl); +extern long X_SSL_clear_options(SSL* ssl, long options); +extern long X_SSL_set_tlsext_host_name(SSL *ssl, const char *name); +extern const char * X_SSL_get_cipher_name(const SSL *ssl); +extern int X_SSL_session_reused(SSL *ssl); +extern int X_SSL_new_index(); + +extern const SSL_METHOD *X_SSLv23_method(); +extern const SSL_METHOD *X_SSLv3_method(); +extern const SSL_METHOD *X_TLSv1_method(); +extern const SSL_METHOD *X_TLSv1_1_method(); +extern const SSL_METHOD *X_TLSv1_2_method(); + +#if defined SSL_CTRL_SET_TLSEXT_HOSTNAME +extern int sni_cb(SSL *ssl_conn, int *ad, void *arg); +#endif +extern int X_SSL_verify_cb(int ok, X509_STORE_CTX* store); + +/* SSL_CTX methods */ +extern int X_SSL_CTX_new_index(); +extern long X_SSL_CTX_set_options(SSL_CTX* ctx, long options); +extern long X_SSL_CTX_clear_options(SSL_CTX* ctx, long options); +extern long X_SSL_CTX_get_options(SSL_CTX* ctx); +extern long X_SSL_CTX_set_mode(SSL_CTX* ctx, long modes); +extern long X_SSL_CTX_get_mode(SSL_CTX* ctx); +extern long X_SSL_CTX_set_session_cache_mode(SSL_CTX* ctx, long modes); +extern long X_SSL_CTX_sess_set_cache_size(SSL_CTX* ctx, long t); +extern long X_SSL_CTX_sess_get_cache_size(SSL_CTX* ctx); +extern long X_SSL_CTX_set_timeout(SSL_CTX* ctx, long t); +extern long X_SSL_CTX_get_timeout(SSL_CTX* ctx); +extern long X_SSL_CTX_add_extra_chain_cert(SSL_CTX* ctx, X509 *cert); +extern long X_SSL_CTX_set_tmp_ecdh(SSL_CTX* ctx, EC_KEY *key); +extern long X_SSL_CTX_set_tlsext_servername_callback(SSL_CTX* ctx, int (*cb)(SSL *con, int *ad, void *args)); +extern int X_SSL_CTX_verify_cb(int ok, X509_STORE_CTX* store); +extern long X_SSL_CTX_set_tmp_dh(SSL_CTX* ctx, DH *dh); +extern long X_PEM_read_DHparams(SSL_CTX* ctx, DH *dh); +extern int X_SSL_CTX_set_tlsext_ticket_key_cb(SSL_CTX *sslctx, + int (*cb)(SSL *s, unsigned char key_name[16], + unsigned char iv[EVP_MAX_IV_LENGTH], + EVP_CIPHER_CTX *ctx, HMAC_CTX *hctx, int enc)); +extern int X_SSL_CTX_ticket_key_cb(SSL *s, unsigned char key_name[16], + unsigned char iv[EVP_MAX_IV_LENGTH], + EVP_CIPHER_CTX *cctx, HMAC_CTX *hctx, int enc); + +/* BIO methods */ +extern int X_BIO_get_flags(BIO *b); +extern void X_BIO_set_flags(BIO *bio, int flags); +extern void X_BIO_clear_flags(BIO *bio, int flags); +extern void X_BIO_set_data(BIO *bio, void* data); +extern void *X_BIO_get_data(BIO *bio); +extern int X_BIO_read(BIO *b, void *buf, int len); +extern int X_BIO_write(BIO *b, const void *buf, int len); +extern BIO *X_BIO_new_write_bio(); +extern BIO *X_BIO_new_read_bio(); + +/* EVP methods */ +extern const int X_ED25519_SUPPORT; +extern int X_EVP_PKEY_ED25519; +extern const EVP_MD *X_EVP_get_digestbyname(const char *name); +extern EVP_MD_CTX *X_EVP_MD_CTX_new(); +extern void X_EVP_MD_CTX_free(EVP_MD_CTX *ctx); +extern const EVP_MD *X_EVP_md_null(); +extern const EVP_MD *X_EVP_md5(); +extern const EVP_MD *X_EVP_md4(); +extern const EVP_MD *X_EVP_sha(); +extern const EVP_MD *X_EVP_sha1(); +extern const EVP_MD *X_EVP_dss(); +extern const EVP_MD *X_EVP_dss1(); +extern const EVP_MD *X_EVP_ripemd160(); +extern const EVP_MD *X_EVP_sha224(); +extern const EVP_MD *X_EVP_sha256(); +extern const EVP_MD *X_EVP_sha384(); +extern const EVP_MD *X_EVP_sha512(); +extern int X_EVP_MD_size(const EVP_MD *md); +extern int X_EVP_DigestInit_ex(EVP_MD_CTX *ctx, const EVP_MD *type, ENGINE *impl); +extern int X_EVP_DigestUpdate(EVP_MD_CTX *ctx, const void *d, size_t cnt); +extern int X_EVP_DigestFinal_ex(EVP_MD_CTX *ctx, unsigned char *md, unsigned int *s); +extern int X_EVP_SignInit(EVP_MD_CTX *ctx, const EVP_MD *type); +extern int X_EVP_SignUpdate(EVP_MD_CTX *ctx, const void *d, unsigned int cnt); +extern int X_EVP_DigestSignInit(EVP_MD_CTX *ctx, EVP_PKEY_CTX **pctx, const EVP_MD *type, ENGINE *e, EVP_PKEY *pkey); +extern int X_EVP_DigestSign(EVP_MD_CTX *ctx, unsigned char *sigret, size_t *siglen, const unsigned char *tbs, size_t tbslen); +extern EVP_PKEY *X_EVP_PKEY_new(void); +extern void X_EVP_PKEY_free(EVP_PKEY *pkey); +extern int X_EVP_PKEY_size(EVP_PKEY *pkey); +extern struct rsa_st *X_EVP_PKEY_get1_RSA(EVP_PKEY *pkey); +extern int X_EVP_PKEY_set1_RSA(EVP_PKEY *pkey, struct rsa_st *key); +extern int X_EVP_PKEY_assign_charp(EVP_PKEY *pkey, int type, char *key); +extern int X_EVP_SignFinal(EVP_MD_CTX *ctx, unsigned char *md, unsigned int *s, EVP_PKEY *pkey); +extern int X_EVP_VerifyInit(EVP_MD_CTX *ctx, const EVP_MD *type); +extern int X_EVP_VerifyUpdate(EVP_MD_CTX *ctx, const void *d, unsigned int cnt); +extern int X_EVP_VerifyFinal(EVP_MD_CTX *ctx, const unsigned char *sigbuf, unsigned int siglen, EVP_PKEY *pkey); +extern int X_EVP_DigestVerifyInit(EVP_MD_CTX *ctx, EVP_PKEY_CTX **pctx, const EVP_MD *type, ENGINE *e, EVP_PKEY *pkey); +extern int X_EVP_DigestVerify(EVP_MD_CTX *ctx, const unsigned char *sigret, size_t siglen, const unsigned char *tbs, size_t tbslen); +extern int X_EVP_CIPHER_block_size(EVP_CIPHER *c); +extern int X_EVP_CIPHER_key_length(EVP_CIPHER *c); +extern int X_EVP_CIPHER_iv_length(EVP_CIPHER *c); +extern int X_EVP_CIPHER_nid(EVP_CIPHER *c); +extern int X_EVP_CIPHER_CTX_block_size(EVP_CIPHER_CTX *ctx); +extern int X_EVP_CIPHER_CTX_key_length(EVP_CIPHER_CTX *ctx); +extern int X_EVP_CIPHER_CTX_iv_length(EVP_CIPHER_CTX *ctx); +extern void X_EVP_CIPHER_CTX_set_padding(EVP_CIPHER_CTX *ctx, int padding); +extern const EVP_CIPHER *X_EVP_CIPHER_CTX_cipher(EVP_CIPHER_CTX *ctx); +extern int X_EVP_CIPHER_CTX_encrypting(const EVP_CIPHER_CTX *ctx); +extern int X_EVP_PKEY_CTX_set_ec_paramgen_curve_nid(EVP_PKEY_CTX *ctx, int nid); + +/* HMAC methods */ +extern size_t X_HMAC_size(const HMAC_CTX *e); +extern HMAC_CTX *X_HMAC_CTX_new(void); +extern void X_HMAC_CTX_free(HMAC_CTX *ctx); +extern int X_HMAC_Init_ex(HMAC_CTX *ctx, const void *key, int len, const EVP_MD *md, ENGINE *impl); +extern int X_HMAC_Update(HMAC_CTX *ctx, const unsigned char *data, size_t len); +extern int X_HMAC_Final(HMAC_CTX *ctx, unsigned char *md, unsigned int *len); + +/* X509 methods */ +extern int X_X509_add_ref(X509* x509); +extern const ASN1_TIME *X_X509_get0_notBefore(const X509 *x); +extern const ASN1_TIME *X_X509_get0_notAfter(const X509 *x); +extern int X_sk_X509_num(STACK_OF(X509) *sk); +extern X509 *X_sk_X509_value(STACK_OF(X509)* sk, int i); +extern long X_X509_get_version(const X509 *x); +extern int X_X509_set_version(X509 *x, long version); + +/* PEM methods */ +extern int X_PEM_write_bio_PrivateKey_traditional(BIO *bio, EVP_PKEY *key, const EVP_CIPHER *enc, unsigned char *kstr, int klen, pem_password_cb *cb, void *u); diff --git a/vendor/github.com/spacemonkeygo/openssl/sni.c b/vendor/github.com/spacemonkeygo/openssl/sni.c new file mode 100644 index 00000000..f9e8d16b --- /dev/null +++ b/vendor/github.com/spacemonkeygo/openssl/sni.c @@ -0,0 +1,23 @@ +// Copyright (C) 2017. See 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. + +#include +#include "_cgo_export.h" +#include + +int sni_cb(SSL *con, int *ad, void *arg) { + SSL_CTX* ssl_ctx = ssl_ctx = SSL_get_SSL_CTX(con); + void* p = SSL_CTX_get_ex_data(ssl_ctx, get_ssl_ctx_idx()); + return sni_cb_thunk(p, con, ad, arg); +} diff --git a/vendor/github.com/spacemonkeygo/openssl/ssl.go b/vendor/github.com/spacemonkeygo/openssl/ssl.go new file mode 100644 index 00000000..117c30c0 --- /dev/null +++ b/vendor/github.com/spacemonkeygo/openssl/ssl.go @@ -0,0 +1,170 @@ +// Copyright (C) 2017. See 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 openssl + +// #include "shim.h" +import "C" + +import ( + "os" + "unsafe" +) + +type SSLTLSExtErr int + +const ( + SSLTLSExtErrOK SSLTLSExtErr = C.SSL_TLSEXT_ERR_OK + SSLTLSExtErrAlertWarning SSLTLSExtErr = C.SSL_TLSEXT_ERR_ALERT_WARNING + SSLTLSEXTErrAlertFatal SSLTLSExtErr = C.SSL_TLSEXT_ERR_ALERT_FATAL + SSLTLSEXTErrNoAck SSLTLSExtErr = C.SSL_TLSEXT_ERR_NOACK +) + +var ( + ssl_idx = C.X_SSL_new_index() +) + +//export get_ssl_idx +func get_ssl_idx() C.int { + return ssl_idx +} + +type SSL struct { + ssl *C.SSL + verify_cb VerifyCallback +} + +//export go_ssl_verify_cb_thunk +func go_ssl_verify_cb_thunk(p unsafe.Pointer, ok C.int, ctx *C.X509_STORE_CTX) C.int { + defer func() { + if err := recover(); err != nil { + logger.Critf("openssl: verify callback panic'd: %v", err) + os.Exit(1) + } + }() + verify_cb := (*SSL)(p).verify_cb + // set up defaults just in case verify_cb is nil + if verify_cb != nil { + store := &CertificateStoreCtx{ctx: ctx} + if verify_cb(ok == 1, store) { + ok = 1 + } else { + ok = 0 + } + } + return ok +} + +// Wrapper around SSL_get_servername. Returns server name according to rfc6066 +// http://tools.ietf.org/html/rfc6066. +func (s *SSL) GetServername() string { + return C.GoString(C.SSL_get_servername(s.ssl, C.TLSEXT_NAMETYPE_host_name)) +} + +// GetOptions returns SSL options. See +// https://www.openssl.org/docs/ssl/SSL_CTX_set_options.html +func (s *SSL) GetOptions() Options { + return Options(C.X_SSL_get_options(s.ssl)) +} + +// SetOptions sets SSL options. See +// https://www.openssl.org/docs/ssl/SSL_CTX_set_options.html +func (s *SSL) SetOptions(options Options) Options { + return Options(C.X_SSL_set_options(s.ssl, C.long(options))) +} + +// ClearOptions clear SSL options. See +// https://www.openssl.org/docs/ssl/SSL_CTX_set_options.html +func (s *SSL) ClearOptions(options Options) Options { + return Options(C.X_SSL_clear_options(s.ssl, C.long(options))) +} + +// SetVerify controls peer verification settings. See +// http://www.openssl.org/docs/ssl/SSL_CTX_set_verify.html +func (s *SSL) SetVerify(options VerifyOptions, verify_cb VerifyCallback) { + s.verify_cb = verify_cb + if verify_cb != nil { + C.SSL_set_verify(s.ssl, C.int(options), (*[0]byte)(C.X_SSL_verify_cb)) + } else { + C.SSL_set_verify(s.ssl, C.int(options), nil) + } +} + +// SetVerifyMode controls peer verification setting. See +// http://www.openssl.org/docs/ssl/SSL_CTX_set_verify.html +func (s *SSL) SetVerifyMode(options VerifyOptions) { + s.SetVerify(options, s.verify_cb) +} + +// SetVerifyCallback controls peer verification setting. See +// http://www.openssl.org/docs/ssl/SSL_CTX_set_verify.html +func (s *SSL) SetVerifyCallback(verify_cb VerifyCallback) { + s.SetVerify(s.VerifyMode(), verify_cb) +} + +// GetVerifyCallback returns callback function. See +// http://www.openssl.org/docs/ssl/SSL_CTX_set_verify.html +func (s *SSL) GetVerifyCallback() VerifyCallback { + return s.verify_cb +} + +// VerifyMode returns peer verification setting. See +// http://www.openssl.org/docs/ssl/SSL_CTX_set_verify.html +func (s *SSL) VerifyMode() VerifyOptions { + return VerifyOptions(C.SSL_get_verify_mode(s.ssl)) +} + +// SetVerifyDepth controls how many certificates deep the certificate +// verification logic is willing to follow a certificate chain. See +// https://www.openssl.org/docs/ssl/SSL_CTX_set_verify.html +func (s *SSL) SetVerifyDepth(depth int) { + C.SSL_set_verify_depth(s.ssl, C.int(depth)) +} + +// GetVerifyDepth controls how many certificates deep the certificate +// verification logic is willing to follow a certificate chain. See +// https://www.openssl.org/docs/ssl/SSL_CTX_set_verify.html +func (s *SSL) GetVerifyDepth() int { + return int(C.SSL_get_verify_depth(s.ssl)) +} + +// SetSSLCtx changes context to new one. Useful for Server Name Indication (SNI) +// rfc6066 http://tools.ietf.org/html/rfc6066. See +// http://stackoverflow.com/questions/22373332/serving-multiple-domains-in-one-box-with-sni +func (s *SSL) SetSSLCtx(ctx *Ctx) { + /* + * SSL_set_SSL_CTX() only changes certs as of 1.0.0d + * adjust other things we care about + */ + C.SSL_set_SSL_CTX(s.ssl, ctx.ctx) +} + +//export sni_cb_thunk +func sni_cb_thunk(p unsafe.Pointer, con *C.SSL, ad unsafe.Pointer, arg unsafe.Pointer) C.int { + defer func() { + if err := recover(); err != nil { + logger.Critf("openssl: verify callback sni panic'd: %v", err) + os.Exit(1) + } + }() + + sni_cb := (*Ctx)(p).sni_cb + + s := &SSL{ssl: con} + // This attaches a pointer to our SSL struct into the SNI callback. + C.SSL_set_ex_data(s.ssl, get_ssl_idx(), unsafe.Pointer(s)) + + // Note: this is ctx.sni_cb, not C.sni_cb + return C.int(sni_cb(s)) +} diff --git a/vendor/github.com/spacemonkeygo/openssl/tickets.go b/vendor/github.com/spacemonkeygo/openssl/tickets.go new file mode 100644 index 00000000..a064d385 --- /dev/null +++ b/vendor/github.com/spacemonkeygo/openssl/tickets.go @@ -0,0 +1,222 @@ +// Copyright (C) 2017. See 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 openssl + +// #include "shim.h" +import "C" + +import ( + "os" + "unsafe" +) + +const ( + KeyNameSize = 16 +) + +// TicketCipherCtx describes the cipher that will be used by the ticket store +// for encrypting the tickets. Engine may be nil if no engine is desired. +type TicketCipherCtx struct { + Cipher *Cipher + Engine *Engine +} + +// TicketDigestCtx describes the digest that will be used by the ticket store +// to authenticate the data. Engine may be nil if no engine is desired. +type TicketDigestCtx struct { + Digest *Digest + Engine *Engine +} + +// TicketName is an identifier for the key material for a ticket. +type TicketName [KeyNameSize]byte + +// TicketKey is the key material for a ticket. If this is lost, forward secrecy +// is lost as it allows decrypting TLS sessions retroactively. +type TicketKey struct { + Name TicketName + CipherKey []byte + HMACKey []byte + IV []byte +} + +// TicketKeyManager is a manager for TicketKeys. It allows one to control the +// lifetime of tickets, causing renewals and expirations for keys that are +// created. Calls to the manager are serialized. +type TicketKeyManager interface { + // New should create a brand new TicketKey with a new name. + New() *TicketKey + + // Current should return a key that is still valid. + Current() *TicketKey + + // Lookup should return a key with the given name, or nil if no name + // exists. + Lookup(name TicketName) *TicketKey + + // Expired should return if the key with the given name is expired and + // should not be used any more. + Expired(name TicketName) bool + + // ShouldRenew should return if the key is still ok to use for the current + // session, but we should send a new key for the client. + ShouldRenew(name TicketName) bool +} + +// TicketStore descibes the encryption and authentication methods the tickets +// will use along with a key manager for generating and keeping track of the +// secrets. +type TicketStore struct { + CipherCtx TicketCipherCtx + DigestCtx TicketDigestCtx + Keys TicketKeyManager +} + +func (t *TicketStore) cipherEngine() *C.ENGINE { + if t.CipherCtx.Engine == nil { + return nil + } + return t.CipherCtx.Engine.e +} + +func (t *TicketStore) digestEngine() *C.ENGINE { + if t.DigestCtx.Engine == nil { + return nil + } + return t.DigestCtx.Engine.e +} + +const ( + // instruct to do a handshake + ticket_resp_requireHandshake = 0 + // crypto context is set up correctly + ticket_resp_sessionOk = 1 + // crypto context is ok, but the ticket should be reissued + ticket_resp_renewSession = 2 + // we had a problem that shouldn't fall back to doing a handshake + ticket_resp_error = -1 + + // asked to create session crypto context + ticket_req_newSession = 1 + // asked to load crypto context for a previous session + ticket_req_lookupSession = 0 +) + +//export go_ticket_key_cb_thunk +func go_ticket_key_cb_thunk(p unsafe.Pointer, s *C.SSL, key_name *C.uchar, + iv *C.uchar, cctx *C.EVP_CIPHER_CTX, hctx *C.HMAC_CTX, enc C.int) C.int { + + // no panic's allowed. it's super hard to guarantee any state at this point + // so just abort everything. + defer func() { + if err := recover(); err != nil { + logger.Critf("openssl: ticket key callback panic'd: %v", err) + os.Exit(1) + } + }() + + ctx := (*Ctx)(p) + store := ctx.ticket_store + if store == nil { + // TODO(jeff): should this be an error condition? it doesn't make sense + // to be called if we don't have a store I believe, but that's probably + // not worth aborting the handshake which is what I believe returning + // an error would do. + return ticket_resp_requireHandshake + } + + ctx.ticket_store_mu.Lock() + defer ctx.ticket_store_mu.Unlock() + + switch enc { + case ticket_req_newSession: + key := store.Keys.Current() + if key == nil { + key = store.Keys.New() + if key == nil { + return ticket_resp_requireHandshake + } + } + + C.memcpy( + unsafe.Pointer(key_name), + unsafe.Pointer(&key.Name[0]), + KeyNameSize) + C.EVP_EncryptInit_ex( + cctx, + store.CipherCtx.Cipher.ptr, + store.cipherEngine(), + (*C.uchar)(&key.CipherKey[0]), + (*C.uchar)(&key.IV[0])) + C.HMAC_Init_ex( + hctx, + unsafe.Pointer(&key.HMACKey[0]), + C.int(len(key.HMACKey)), + store.DigestCtx.Digest.ptr, + store.digestEngine()) + + return ticket_resp_sessionOk + + case ticket_req_lookupSession: + var name TicketName + C.memcpy( + unsafe.Pointer(&name[0]), + unsafe.Pointer(key_name), + KeyNameSize) + + key := store.Keys.Lookup(name) + if key == nil { + return ticket_resp_requireHandshake + } + if store.Keys.Expired(name) { + return ticket_resp_requireHandshake + } + + C.EVP_DecryptInit_ex( + cctx, + store.CipherCtx.Cipher.ptr, + store.cipherEngine(), + (*C.uchar)(&key.CipherKey[0]), + (*C.uchar)(&key.IV[0])) + C.HMAC_Init_ex( + hctx, + unsafe.Pointer(&key.HMACKey[0]), + C.int(len(key.HMACKey)), + store.DigestCtx.Digest.ptr, + store.digestEngine()) + + if store.Keys.ShouldRenew(name) { + return ticket_resp_renewSession + } + + return ticket_resp_sessionOk + + default: + return ticket_resp_error + } +} + +// SetTicketStore sets the ticket store for the context so that clients can do +// ticket based session resumption. If the store is nil, the +func (c *Ctx) SetTicketStore(store *TicketStore) { + c.ticket_store = store + + if store == nil { + C.X_SSL_CTX_set_tlsext_ticket_key_cb(c.ctx, nil) + } else { + C.X_SSL_CTX_set_tlsext_ticket_key_cb(c.ctx, + (*[0]byte)(C.X_SSL_CTX_ticket_key_cb)) + } +} diff --git a/vendor/github.com/spacemonkeygo/openssl/utils/errors.go b/vendor/github.com/spacemonkeygo/openssl/utils/errors.go new file mode 100644 index 00000000..bab314c9 --- /dev/null +++ b/vendor/github.com/spacemonkeygo/openssl/utils/errors.go @@ -0,0 +1,50 @@ +// Copyright (C) 2014 Space Monkey, 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" + "strings" +) + +// ErrorGroup collates errors +type ErrorGroup struct { + Errors []error +} + +// Add adds an error to an existing error group +func (e *ErrorGroup) Add(err error) { + if err != nil { + e.Errors = append(e.Errors, err) + } +} + +// Finalize returns an error corresponding to the ErrorGroup state. If there's +// no errors in the group, finalize returns nil. If there's only one error, +// Finalize returns that error. Otherwise, Finalize will make a new error +// consisting of the messages from the constituent errors. +func (e *ErrorGroup) Finalize() error { + if len(e.Errors) == 0 { + return nil + } + if len(e.Errors) == 1 { + return e.Errors[0] + } + msgs := make([]string, 0, len(e.Errors)) + for _, err := range e.Errors { + msgs = append(msgs, err.Error()) + } + return errors.New(strings.Join(msgs, "\n")) +} diff --git a/vendor/github.com/spacemonkeygo/openssl/utils/future.go b/vendor/github.com/spacemonkeygo/openssl/utils/future.go new file mode 100644 index 00000000..fa1bbbfb --- /dev/null +++ b/vendor/github.com/spacemonkeygo/openssl/utils/future.go @@ -0,0 +1,79 @@ +// Copyright (C) 2014 Space Monkey, 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" +) + +// Future is a type that is essentially the inverse of a channel. With a +// channel, you have multiple senders and one receiver. With a future, you can +// have multiple receivers and one sender. Additionally, a future protects +// against double-sends. Since this is usually used for returning function +// results, we also capture and return error values as well. Use NewFuture +// to initialize. +type Future struct { + mutex *sync.Mutex + cond *sync.Cond + received bool + val interface{} + err error +} + +// NewFuture returns an initialized and ready Future. +func NewFuture() *Future { + mutex := &sync.Mutex{} + return &Future{ + mutex: mutex, + cond: sync.NewCond(mutex), + received: false, + val: nil, + err: nil, + } +} + +// Get blocks until the Future has a value set. +func (self *Future) Get() (interface{}, error) { + self.mutex.Lock() + defer self.mutex.Unlock() + for { + if self.received { + return self.val, self.err + } + self.cond.Wait() + } +} + +// Fired returns whether or not a value has been set. If Fired is true, Get +// won't block. +func (self *Future) Fired() bool { + self.mutex.Lock() + defer self.mutex.Unlock() + return self.received +} + +// Set provides the value to present and future Get calls. If Set has already +// been called, this is a no-op. +func (self *Future) Set(val interface{}, err error) { + self.mutex.Lock() + defer self.mutex.Unlock() + if self.received { + return + } + self.received = true + self.val = val + self.err = err + self.cond.Broadcast() +} diff --git a/vendor/github.com/spacemonkeygo/spacelog/.travis.yml b/vendor/github.com/spacemonkeygo/spacelog/.travis.yml new file mode 100644 index 00000000..d2b67f69 --- /dev/null +++ b/vendor/github.com/spacemonkeygo/spacelog/.travis.yml @@ -0,0 +1,6 @@ +language: go + +go: + - 1.7 + - 1.8 + - tip diff --git a/vendor/github.com/spacemonkeygo/spacelog/LICENSE b/vendor/github.com/spacemonkeygo/spacelog/LICENSE new file mode 100644 index 00000000..37ec93a1 --- /dev/null +++ b/vendor/github.com/spacemonkeygo/spacelog/LICENSE @@ -0,0 +1,191 @@ +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: + +You must give any other recipients of the Work or Derivative Works a copy of +this License; and +You must cause any modified files to carry prominent notices stating that You +changed the files; and +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 +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/spacemonkeygo/spacelog/README.md b/vendor/github.com/spacemonkeygo/spacelog/README.md new file mode 100644 index 00000000..28033f68 --- /dev/null +++ b/vendor/github.com/spacemonkeygo/spacelog/README.md @@ -0,0 +1,19 @@ +# spacelog [![Build Status](https://api.travis-ci.org/spacemonkeygo/spacelog.svg?branch=master)](https://travis-ci.org/spacemonkeygo/spacelog) + +Please see http://godoc.org/github.com/spacemonkeygo/spacelog for info + +### License + +Copyright (C) 2014 Space Monkey, 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. diff --git a/vendor/github.com/spacemonkeygo/spacelog/capture.go b/vendor/github.com/spacemonkeygo/spacelog/capture.go new file mode 100644 index 00000000..d7ea1ca3 --- /dev/null +++ b/vendor/github.com/spacemonkeygo/spacelog/capture.go @@ -0,0 +1,67 @@ +// Copyright (C) 2014 Space Monkey, 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 spacelog + +import ( + "fmt" + "os" + "os/exec" +) + +// CaptureOutputToFile opens a filehandle using the given path, then calls +// CaptureOutputToFd on the associated filehandle. +func CaptureOutputToFile(path string) error { + fh, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE, 0644) + if err != nil { + return err + } + defer fh.Close() + return CaptureOutputToFd(int(fh.Fd())) +} + +// CaptureOutputToProcess starts a process and using CaptureOutputToFd, +// redirects stdout and stderr to the subprocess' stdin. +// CaptureOutputToProcess expects the subcommand to last the lifetime of the +// process, and if the subprocess dies, will panic. +func CaptureOutputToProcess(command string, args ...string) error { + cmd := exec.Command(command, args...) + out, err := cmd.StdinPipe() + if err != nil { + return err + } + defer out.Close() + type fder interface { + Fd() uintptr + } + out_fder, ok := out.(fder) + if !ok { + return fmt.Errorf("unable to get underlying pipe") + } + err = CaptureOutputToFd(int(out_fder.Fd())) + if err != nil { + return err + } + err = cmd.Start() + if err != nil { + return err + } + go func() { + err := cmd.Wait() + if err != nil { + panic(fmt.Errorf("captured output process died! %s", err)) + } + }() + return nil +} diff --git a/vendor/github.com/spacemonkeygo/spacelog/capture_ae.go b/vendor/github.com/spacemonkeygo/spacelog/capture_ae.go new file mode 100644 index 00000000..f759b6f1 --- /dev/null +++ b/vendor/github.com/spacemonkeygo/spacelog/capture_ae.go @@ -0,0 +1,25 @@ +// Copyright (C) 2016 Space Monkey, 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. + +// +build appengine + +package spacelog + +import ( + "fmt" +) + +func CaptureOutputToFd(fd int) error { + return fmt.Errorf("CaptureOutputToFd not supported on App Engine") +} diff --git a/vendor/github.com/spacemonkeygo/spacelog/capture_linux.go b/vendor/github.com/spacemonkeygo/spacelog/capture_linux.go new file mode 100644 index 00000000..34a9c089 --- /dev/null +++ b/vendor/github.com/spacemonkeygo/spacelog/capture_linux.go @@ -0,0 +1,35 @@ +// Copyright (C) 2014 Space Monkey, 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. + +// +build !appengine + +package spacelog + +import ( + "syscall" +) + +// CaptureOutputToFd redirects the current process' stdout and stderr file +// descriptors to the given file descriptor, using the dup3 syscall. +func CaptureOutputToFd(fd int) error { + err := syscall.Dup3(fd, syscall.Stdout, 0) + if err != nil { + return err + } + err = syscall.Dup3(fd, syscall.Stderr, 0) + if err != nil { + return err + } + return nil +} diff --git a/vendor/github.com/spacemonkeygo/spacelog/capture_other.go b/vendor/github.com/spacemonkeygo/spacelog/capture_other.go new file mode 100644 index 00000000..6c65051a --- /dev/null +++ b/vendor/github.com/spacemonkeygo/spacelog/capture_other.go @@ -0,0 +1,38 @@ +// Copyright (C) 2014 Space Monkey, 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. + +// +build !windows +// +build !linux +// +build !appengine +// +build !solaris + +package spacelog + +import ( + "syscall" +) + +// CaptureOutputToFd redirects the current process' stdout and stderr file +// descriptors to the given file descriptor, using the dup2 syscall. +func CaptureOutputToFd(fd int) error { + err := syscall.Dup2(fd, syscall.Stdout) + if err != nil { + return err + } + err = syscall.Dup2(fd, syscall.Stderr) + if err != nil { + return err + } + return nil +} diff --git a/vendor/github.com/spacemonkeygo/spacelog/capture_solaris.go b/vendor/github.com/spacemonkeygo/spacelog/capture_solaris.go new file mode 100644 index 00000000..d77e4f2d --- /dev/null +++ b/vendor/github.com/spacemonkeygo/spacelog/capture_solaris.go @@ -0,0 +1,33 @@ +// Copyright (C) 2014 Space Monkey, 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 spacelog + +import ( + "golang.org/x/sys/unix" +) + +// CaptureOutputToFd redirects the current process' stdout and stderr file +// descriptors to the given file descriptor, using the dup2 syscall. +func CaptureOutputToFd(fd int) error { + err := unix.Dup2(fd, unix.Stdout) + if err != nil { + return err + } + err = unix.Dup2(fd, unix.Stderr) + if err != nil { + return err + } + return nil +} diff --git a/vendor/github.com/spacemonkeygo/spacelog/capture_windows.go b/vendor/github.com/spacemonkeygo/spacelog/capture_windows.go new file mode 100644 index 00000000..e9f061dc --- /dev/null +++ b/vendor/github.com/spacemonkeygo/spacelog/capture_windows.go @@ -0,0 +1,23 @@ +// Copyright (C) 2014 Space Monkey, 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 spacelog + +import ( + "fmt" +) + +func CaptureOutputToFd(fd int) error { + return fmt.Errorf("CaptureOutputToFd not supported on Windows") +} diff --git a/vendor/github.com/spacemonkeygo/spacelog/collection.go b/vendor/github.com/spacemonkeygo/spacelog/collection.go new file mode 100644 index 00000000..8231b4a5 --- /dev/null +++ b/vendor/github.com/spacemonkeygo/spacelog/collection.go @@ -0,0 +1,271 @@ +// Copyright (C) 2014 Space Monkey, 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 spacelog + +import ( + "regexp" + "runtime" + "strings" + "sync" + "text/template" +) + +var ( + // If set, these prefixes will be stripped out of automatic logger names. + IgnoredPrefixes []string + + badChars = regexp.MustCompile("[^a-zA-Z0-9_.-]") + slashes = regexp.MustCompile("[/]") +) + +func callerName() string { + pc, _, _, ok := runtime.Caller(2) + if !ok { + return "unknown.unknown" + } + f := runtime.FuncForPC(pc) + if f == nil { + return "unknown.unknown" + } + name := f.Name() + for _, prefix := range IgnoredPrefixes { + name = strings.TrimPrefix(name, prefix) + } + return badChars.ReplaceAllLiteralString( + slashes.ReplaceAllLiteralString(name, "."), "_") +} + +// LoggerCollections contain all of the loggers a program might use. Typically +// a codebase will just use the default logger collection. +type LoggerCollection struct { + mtx sync.Mutex + loggers map[string]*Logger + level LogLevel + handler Handler +} + +// NewLoggerCollection creates a new logger collection. It's unlikely you will +// ever practically need this method. Use the DefaultLoggerCollection instead. +func NewLoggerCollection() *LoggerCollection { + return &LoggerCollection{ + loggers: make(map[string]*Logger), + level: DefaultLevel, + handler: defaultHandler} +} + +// GetLogger returns a new Logger with a name automatically generated using +// the callstack. If you want to avoid automatic name generation check out +// GetLoggerNamed +func (c *LoggerCollection) GetLogger() *Logger { + return c.GetLoggerNamed(callerName()) +} + +func (c *LoggerCollection) getLogger(name string, level LogLevel, + handler Handler) *Logger { + c.mtx.Lock() + defer c.mtx.Unlock() + + logger, exists := c.loggers[name] + if !exists { + logger = &Logger{level: level, + collection: c, + name: name, + handler: handler} + c.loggers[name] = logger + } + return logger +} + +// ConfigureLoggers configures loggers according to the given string +// specification, which specifies a set of loggers and their associated +// logging levels. Loggers are semicolon-separated; each +// configuration is specified as =. White space outside of +// logger names and levels is ignored. The default level is specified +// with the name "DEFAULT". +// +// An example specification: +// `DEFAULT=ERROR; foo.bar=WARNING` +func (c *LoggerCollection) ConfigureLoggers(specification string) error { + confs := strings.Split(strings.TrimSpace(specification), ";") + for i := range confs { + conf := strings.SplitN(confs[i], "=", 2) + levelstr := strings.TrimSpace(conf[1]) + name := strings.TrimSpace(conf[0]) + level, err := LevelFromString(levelstr) + if err != nil { + return err + } + if name == "DEFAULT" { + c.SetLevel(nil, level) + continue + } + logger := c.GetLoggerNamed(name) + logger.setLevel(level) + } + return nil +} + +// GetLoggerNamed returns a new Logger with the provided name. GetLogger is +// more frequently used. +func (c *LoggerCollection) GetLoggerNamed(name string) *Logger { + c.mtx.Lock() + defer c.mtx.Unlock() + + logger, exists := c.loggers[name] + if !exists { + logger = &Logger{level: c.level, + collection: c, + name: name, + handler: c.handler} + c.loggers[name] = logger + } + return logger +} + +// SetLevel will set the current log level for all loggers with names that +// match a provided regular expression. If the regular expression is nil, then +// all loggers match. +func (c *LoggerCollection) SetLevel(re *regexp.Regexp, level LogLevel) { + c.mtx.Lock() + defer c.mtx.Unlock() + + if re == nil { + c.level = level + } + for name, logger := range c.loggers { + if re == nil || re.MatchString(name) { + logger.setLevel(level) + } + } +} + +// SetHandler will set the current log handler for all loggers with names that +// match a provided regular expression. If the regular expression is nil, then +// all loggers match. +func (c *LoggerCollection) SetHandler(re *regexp.Regexp, handler Handler) { + c.mtx.Lock() + defer c.mtx.Unlock() + + if re == nil { + c.handler = handler + } + for name, logger := range c.loggers { + if re == nil || re.MatchString(name) { + logger.setHandler(handler) + } + } +} + +// SetTextTemplate will set the current text template for all loggers with +// names that match a provided regular expression. If the regular expression +// is nil, then all loggers match. Note that not every handler is guaranteed +// to support text templates and a text template will only apply to +// text-oriented and unstructured handlers. +func (c *LoggerCollection) SetTextTemplate(re *regexp.Regexp, + t *template.Template) { + c.mtx.Lock() + defer c.mtx.Unlock() + + if re == nil { + c.handler.SetTextTemplate(t) + } + for name, logger := range c.loggers { + if re == nil || re.MatchString(name) { + logger.getHandler().SetTextTemplate(t) + } + } +} + +// SetTextOutput will set the current output interface for all loggers with +// names that match a provided regular expression. If the regular expression +// is nil, then all loggers match. Note that not every handler is guaranteed +// to support text output and a text output interface will only apply to +// text-oriented and unstructured handlers. +func (c *LoggerCollection) SetTextOutput(re *regexp.Regexp, + output TextOutput) { + c.mtx.Lock() + defer c.mtx.Unlock() + + if re == nil { + c.handler.SetTextOutput(output) + } + for name, logger := range c.loggers { + if re == nil || re.MatchString(name) { + logger.getHandler().SetTextOutput(output) + } + } +} + +var ( + // It's unlikely you'll need to use this directly + DefaultLoggerCollection = NewLoggerCollection() +) + +// GetLogger returns an automatically-named logger on the default logger +// collection. +func GetLogger() *Logger { + return DefaultLoggerCollection.GetLoggerNamed(callerName()) +} + +// GetLoggerNamed returns a new Logger with the provided name on the default +// logger collection. GetLogger is more frequently used. +func GetLoggerNamed(name string) *Logger { + return DefaultLoggerCollection.GetLoggerNamed(name) +} + +// ConfigureLoggers configures loggers according to the given string +// specification, which specifies a set of loggers and their associated +// logging levels. Loggers are colon- or semicolon-separated; each +// configuration is specified as =. White space outside of +// logger names and levels is ignored. The DEFAULT module is specified +// with the name "DEFAULT". +// +// An example specification: +// `DEFAULT=ERROR; foo.bar=WARNING` +func ConfigureLoggers(specification string) error { + return DefaultLoggerCollection.ConfigureLoggers(specification) +} + +// SetLevel will set the current log level for all loggers on the default +// collection with names that match a provided regular expression. If the +// regular expression is nil, then all loggers match. +func SetLevel(re *regexp.Regexp, level LogLevel) { + DefaultLoggerCollection.SetLevel(re, level) +} + +// SetHandler will set the current log handler for all loggers on the default +// collection with names that match a provided regular expression. If the +// regular expression is nil, then all loggers match. +func SetHandler(re *regexp.Regexp, handler Handler) { + DefaultLoggerCollection.SetHandler(re, handler) +} + +// SetTextTemplate will set the current text template for all loggers on the +// default collection with names that match a provided regular expression. If +// the regular expression is nil, then all loggers match. Note that not every +// handler is guaranteed to support text templates and a text template will +// only apply to text-oriented and unstructured handlers. +func SetTextTemplate(re *regexp.Regexp, t *template.Template) { + DefaultLoggerCollection.SetTextTemplate(re, t) +} + +// SetTextOutput will set the current output interface for all loggers on the +// default collection with names that match a provided regular expression. If +// the regular expression is nil, then all loggers match. Note that not every +// handler is guaranteed to support text output and a text output interface +// will only apply to text-oriented and unstructured handlers. +func SetTextOutput(re *regexp.Regexp, output TextOutput) { + DefaultLoggerCollection.SetTextOutput(re, output) +} diff --git a/vendor/github.com/spacemonkeygo/spacelog/convenience.go b/vendor/github.com/spacemonkeygo/spacelog/convenience.go new file mode 100644 index 00000000..b3056329 --- /dev/null +++ b/vendor/github.com/spacemonkeygo/spacelog/convenience.go @@ -0,0 +1,296 @@ +// Copyright (C) 2014 Space Monkey, 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 spacelog + +import ( + "fmt" + "io" +) + +// Trace logs a collection of values if the logger's level is trace or even +// more permissive. +func (l *Logger) Trace(v ...interface{}) { + if l.getLevel() <= Trace { + l.getHandler().Log(l.name, Trace, fmt.Sprint(v...), 1) + } +} + +// Tracef logs a format string with values if the logger's level is trace or +// even more permissive. +func (l *Logger) Tracef(format string, v ...interface{}) { + if l.getLevel() <= Trace { + l.getHandler().Log(l.name, Trace, fmt.Sprintf(format, v...), 1) + } +} + +// Tracee logs an error value if the error is not nil and the logger's level +// is trace or even more permissive. +func (l *Logger) Tracee(err error) { + if l.getLevel() <= Trace && err != nil { + l.getHandler().Log(l.name, Trace, err.Error(), 1) + } +} + +// TraceEnabled returns true if the logger's level is trace or even more +// permissive. +func (l *Logger) TraceEnabled() bool { + return l.getLevel() <= Trace +} + +// Debug logs a collection of values if the logger's level is debug or even +// more permissive. +func (l *Logger) Debug(v ...interface{}) { + if l.getLevel() <= Debug { + l.getHandler().Log(l.name, Debug, fmt.Sprint(v...), 1) + } +} + +// Debugf logs a format string with values if the logger's level is debug or +// even more permissive. +func (l *Logger) Debugf(format string, v ...interface{}) { + if l.getLevel() <= Debug { + l.getHandler().Log(l.name, Debug, fmt.Sprintf(format, v...), 1) + } +} + +// Debuge logs an error value if the error is not nil and the logger's level +// is debug or even more permissive. +func (l *Logger) Debuge(err error) { + if l.getLevel() <= Debug && err != nil { + l.getHandler().Log(l.name, Debug, err.Error(), 1) + } +} + +// DebugEnabled returns true if the logger's level is debug or even more +// permissive. +func (l *Logger) DebugEnabled() bool { + return l.getLevel() <= Debug +} + +// Info logs a collection of values if the logger's level is info or even +// more permissive. +func (l *Logger) Info(v ...interface{}) { + if l.getLevel() <= Info { + l.getHandler().Log(l.name, Info, fmt.Sprint(v...), 1) + } +} + +// Infof logs a format string with values if the logger's level is info or +// even more permissive. +func (l *Logger) Infof(format string, v ...interface{}) { + if l.getLevel() <= Info { + l.getHandler().Log(l.name, Info, fmt.Sprintf(format, v...), 1) + } +} + +// Infoe logs an error value if the error is not nil and the logger's level +// is info or even more permissive. +func (l *Logger) Infoe(err error) { + if l.getLevel() <= Info && err != nil { + l.getHandler().Log(l.name, Info, err.Error(), 1) + } +} + +// InfoEnabled returns true if the logger's level is info or even more +// permissive. +func (l *Logger) InfoEnabled() bool { + return l.getLevel() <= Info +} + +// Notice logs a collection of values if the logger's level is notice or even +// more permissive. +func (l *Logger) Notice(v ...interface{}) { + if l.getLevel() <= Notice { + l.getHandler().Log(l.name, Notice, fmt.Sprint(v...), 1) + } +} + +// Noticef logs a format string with values if the logger's level is notice or +// even more permissive. +func (l *Logger) Noticef(format string, v ...interface{}) { + if l.getLevel() <= Notice { + l.getHandler().Log(l.name, Notice, fmt.Sprintf(format, v...), 1) + } +} + +// Noticee logs an error value if the error is not nil and the logger's level +// is notice or even more permissive. +func (l *Logger) Noticee(err error) { + if l.getLevel() <= Notice && err != nil { + l.getHandler().Log(l.name, Notice, err.Error(), 1) + } +} + +// NoticeEnabled returns true if the logger's level is notice or even more +// permissive. +func (l *Logger) NoticeEnabled() bool { + return l.getLevel() <= Notice +} + +// Warn logs a collection of values if the logger's level is warning or even +// more permissive. +func (l *Logger) Warn(v ...interface{}) { + if l.getLevel() <= Warning { + l.getHandler().Log(l.name, Warning, fmt.Sprint(v...), 1) + } +} + +// Warnf logs a format string with values if the logger's level is warning or +// even more permissive. +func (l *Logger) Warnf(format string, v ...interface{}) { + if l.getLevel() <= Warning { + l.getHandler().Log(l.name, Warning, fmt.Sprintf(format, v...), 1) + } +} + +// Warne logs an error value if the error is not nil and the logger's level +// is warning or even more permissive. +func (l *Logger) Warne(err error) { + if l.getLevel() <= Warning && err != nil { + l.getHandler().Log(l.name, Warning, err.Error(), 1) + } +} + +// WarnEnabled returns true if the logger's level is warning or even more +// permissive. +func (l *Logger) WarnEnabled() bool { + return l.getLevel() <= Warning +} + +// Error logs a collection of values if the logger's level is error or even +// more permissive. +func (l *Logger) Error(v ...interface{}) { + if l.getLevel() <= Error { + l.getHandler().Log(l.name, Error, fmt.Sprint(v...), 1) + } +} + +// Errorf logs a format string with values if the logger's level is error or +// even more permissive. +func (l *Logger) Errorf(format string, v ...interface{}) { + if l.getLevel() <= Error { + l.getHandler().Log(l.name, Error, fmt.Sprintf(format, v...), 1) + } +} + +// Errore logs an error value if the error is not nil and the logger's level +// is error or even more permissive. +func (l *Logger) Errore(err error) { + if l.getLevel() <= Error && err != nil { + l.getHandler().Log(l.name, Error, err.Error(), 1) + } +} + +// ErrorEnabled returns true if the logger's level is error or even more +// permissive. +func (l *Logger) ErrorEnabled() bool { + return l.getLevel() <= Error +} + +// Crit logs a collection of values if the logger's level is critical or even +// more permissive. +func (l *Logger) Crit(v ...interface{}) { + if l.getLevel() <= Critical { + l.getHandler().Log(l.name, Critical, fmt.Sprint(v...), 1) + } +} + +// Critf logs a format string with values if the logger's level is critical or +// even more permissive. +func (l *Logger) Critf(format string, v ...interface{}) { + if l.getLevel() <= Critical { + l.getHandler().Log(l.name, Critical, fmt.Sprintf(format, v...), 1) + } +} + +// Crite logs an error value if the error is not nil and the logger's level +// is critical or even more permissive. +func (l *Logger) Crite(err error) { + if l.getLevel() <= Critical && err != nil { + l.getHandler().Log(l.name, Critical, err.Error(), 1) + } +} + +// CritEnabled returns true if the logger's level is critical or even more +// permissive. +func (l *Logger) CritEnabled() bool { + return l.getLevel() <= Critical +} + +// Log logs a collection of values if the logger's level is the provided level +// or even more permissive. +func (l *Logger) Log(level LogLevel, v ...interface{}) { + if l.getLevel() <= level { + l.getHandler().Log(l.name, level, fmt.Sprint(v...), 1) + } +} + +// Logf logs a format string with values if the logger's level is the provided +// level or even more permissive. +func (l *Logger) Logf(level LogLevel, format string, v ...interface{}) { + if l.getLevel() <= level { + l.getHandler().Log(l.name, level, fmt.Sprintf(format, v...), 1) + } +} + +// Loge logs an error value if the error is not nil and the logger's level +// is the provided level or even more permissive. +func (l *Logger) Loge(level LogLevel, err error) { + if l.getLevel() <= level && err != nil { + l.getHandler().Log(l.name, level, err.Error(), 1) + } +} + +// LevelEnabled returns true if the logger's level is the provided level or +// even more permissive. +func (l *Logger) LevelEnabled(level LogLevel) bool { + return l.getLevel() <= level +} + +type writer struct { + l *Logger + level LogLevel +} + +func (w *writer) Write(data []byte) (int, error) { + if w.l.getLevel() <= w.level { + w.l.getHandler().Log(w.l.name, w.level, string(data), 1) + } + return len(data), nil +} + +// Writer returns an io.Writer that writes messages at the given log level. +func (l *Logger) Writer(level LogLevel) io.Writer { + return &writer{l: l, level: level} +} + +type writerNoCaller struct { + l *Logger + level LogLevel +} + +func (w *writerNoCaller) Write(data []byte) (int, error) { + if w.l.getLevel() <= w.level { + w.l.getHandler().Log(w.l.name, w.level, string(data), -1) + } + return len(data), nil +} + +// WriterWithoutCaller returns an io.Writer that writes messages at the given +// log level, but does not attempt to collect the Write caller, and provides +// no caller information to the log event. +func (l *Logger) WriterWithoutCaller(level LogLevel) io.Writer { + return &writerNoCaller{l: l, level: level} +} diff --git a/vendor/github.com/spacemonkeygo/spacelog/doc.go b/vendor/github.com/spacemonkeygo/spacelog/doc.go new file mode 100644 index 00000000..28c25b4d --- /dev/null +++ b/vendor/github.com/spacemonkeygo/spacelog/doc.go @@ -0,0 +1,39 @@ +// Copyright (C) 2014 Space Monkey, 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 spacelog is a collection of interface lego bricks designed to help you +build a flexible logging system. + +spacelog is loosely inspired by the Python logging library. + +The basic interaction is between a Logger and a Handler. A Logger is +what the programmer typically interacts with for creating log messages. A +Logger will be at a given log level, and if log messages can clear that +specific logger's log level filter, they will be passed off to the Handler. + +Loggers are instantiated from GetLogger and GetLoggerNamed. + +A Handler is a very generic interface for handling log events. You can provide +your own Handler for doing structured JSON output or colorized output or +countless other things. + +Provided are a simple TextHandler with a variety of log event templates and +TextOutput sinks, such as io.Writer, Syslog, and so forth. + +Make sure to see the source of the setup subpackage for an example of easy and +configurable logging setup at process start: + http://godoc.org/github.com/spacemonkeygo/spacelog/setup +*/ +package spacelog diff --git a/vendor/github.com/spacemonkeygo/spacelog/event.go b/vendor/github.com/spacemonkeygo/spacelog/event.go new file mode 100644 index 00000000..da863cbf --- /dev/null +++ b/vendor/github.com/spacemonkeygo/spacelog/event.go @@ -0,0 +1,75 @@ +// Copyright (C) 2014 Space Monkey, 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 spacelog + +import ( + "path/filepath" + "strings" + "time" +) + +// TermColors is a type that knows how to output terminal colors and formatting +type TermColors struct{} + +// LogEvent is a type made by the default text handler for feeding to log +// templates. It has as much contextual data about the log event as possible. +type LogEvent struct { + LoggerName string + Level LogLevel + Message string + Filepath string + Line int + Timestamp time.Time + + TermColors +} + +// Reset resets the color palette for terminals that support color +func (TermColors) Reset() string { return "\x1b[0m" } +func (TermColors) Bold() string { return "\x1b[1m" } +func (TermColors) Underline() string { return "\x1b[4m" } +func (TermColors) Black() string { return "\x1b[30m" } +func (TermColors) Red() string { return "\x1b[31m" } +func (TermColors) Green() string { return "\x1b[32m" } +func (TermColors) Yellow() string { return "\x1b[33m" } +func (TermColors) Blue() string { return "\x1b[34m" } +func (TermColors) Magenta() string { return "\x1b[35m" } +func (TermColors) Cyan() string { return "\x1b[36m" } +func (TermColors) White() string { return "\x1b[37m" } + +func (l *LogEvent) Filename() string { + if l.Filepath == "" { + return "" + } + return filepath.Base(l.Filepath) +} + +func (l *LogEvent) Time() string { + return l.Timestamp.Format("15:04:05") +} + +func (l *LogEvent) Date() string { + return l.Timestamp.Format("2006/01/02") +} + +// LevelJustified returns the log level in string form justified so that all +// log levels take the same text width. +func (l *LogEvent) LevelJustified() (rv string) { + rv = l.Level.String() + if len(rv) < 5 { + rv += strings.Repeat(" ", 5-len(rv)) + } + return rv +} diff --git a/vendor/github.com/spacemonkeygo/spacelog/handler.go b/vendor/github.com/spacemonkeygo/spacelog/handler.go new file mode 100644 index 00000000..e3db0865 --- /dev/null +++ b/vendor/github.com/spacemonkeygo/spacelog/handler.go @@ -0,0 +1,53 @@ +// Copyright (C) 2014 Space Monkey, 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 spacelog + +import ( + "text/template" +) + +// Handler is an interface that knows how to process log events. This is the +// basic interface type for building a logging system. If you want to route +// structured log data somewhere, you would implement this interface. +type Handler interface { + // Log is called for every message. if calldepth is negative, caller + // information is missing + Log(logger_name string, level LogLevel, msg string, calldepth int) + + // These two calls are expected to be no-ops on non-text-output handlers + SetTextTemplate(t *template.Template) + SetTextOutput(output TextOutput) +} + +// HandlerFunc is a type to make implementation of the Handler interface easier +type HandlerFunc func(logger_name string, level LogLevel, msg string, + calldepth int) + +// Log simply calls f(logger_name, level, msg, calldepth) +func (f HandlerFunc) Log(logger_name string, level LogLevel, msg string, + calldepth int) { + f(logger_name, level, msg, calldepth) +} + +// SetTextTemplate is a no-op +func (HandlerFunc) SetTextTemplate(t *template.Template) {} + +// SetTextOutput is a no-op +func (HandlerFunc) SetTextOutput(output TextOutput) {} + +var ( + defaultHandler = NewTextHandler(StdlibTemplate, + &StdlibOutput{}) +) diff --git a/vendor/github.com/spacemonkeygo/spacelog/level.go b/vendor/github.com/spacemonkeygo/spacelog/level.go new file mode 100644 index 00000000..bf507075 --- /dev/null +++ b/vendor/github.com/spacemonkeygo/spacelog/level.go @@ -0,0 +1,136 @@ +// Copyright (C) 2014 Space Monkey, 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 spacelog + +import ( + "fmt" + "strconv" + "strings" +) + +type LogLevel int32 + +const ( + Trace LogLevel = 5 + Debug LogLevel = 10 + Info LogLevel = 20 + Notice LogLevel = 30 + Warning LogLevel = 40 + Error LogLevel = 50 + Critical LogLevel = 60 + // syslog has Alert + // syslog has Emerg + + DefaultLevel = Notice +) + +// String returns the log level name in short form +func (l LogLevel) String() string { + switch l.Match() { + case Critical: + return "CRIT" + case Error: + return "ERR" + case Warning: + return "WARN" + case Notice: + return "NOTE" + case Info: + return "INFO" + case Debug: + return "DEBUG" + case Trace: + return "TRACE" + default: + return "UNSET" + } +} + +// String returns the log level name in long human readable form +func (l LogLevel) Name() string { + switch l.Match() { + case Critical: + return "critical" + case Error: + return "error" + case Warning: + return "warning" + case Notice: + return "notice" + case Info: + return "info" + case Debug: + return "debug" + case Trace: + return "trace" + default: + return "unset" + } +} + +// Match returns the greatest named log level that is less than or equal to +// the receiver log level. For example, if the log level is 43, Match() will +// return 40 (Warning) +func (l LogLevel) Match() LogLevel { + if l >= Critical { + return Critical + } + if l >= Error { + return Error + } + if l >= Warning { + return Warning + } + if l >= Notice { + return Notice + } + if l >= Info { + return Info + } + if l >= Debug { + return Debug + } + if l >= Trace { + return Trace + } + return 0 +} + +// LevelFromString will convert a named log level to its corresponding value +// type, or error if both the name was unknown and an integer value was unable +// to be parsed. +func LevelFromString(str string) (LogLevel, error) { + switch strings.ToLower(str) { + case "crit", "critical": + return Critical, nil + case "err", "error": + return Error, nil + case "warn", "warning": + return Warning, nil + case "note", "notice": + return Notice, nil + case "info": + return Info, nil + case "debug": + return Debug, nil + case "trace": + return Trace, nil + } + val, err := strconv.ParseInt(str, 10, 32) + if err == nil { + return LogLevel(val), nil + } + return 0, fmt.Errorf("Invalid log level: %s", str) +} diff --git a/vendor/github.com/spacemonkeygo/spacelog/logger.go b/vendor/github.com/spacemonkeygo/spacelog/logger.go new file mode 100644 index 00000000..ae1734b2 --- /dev/null +++ b/vendor/github.com/spacemonkeygo/spacelog/logger.go @@ -0,0 +1,61 @@ +// Copyright (C) 2014 Space Monkey, 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 spacelog + +import ( + "sync" + "sync/atomic" +) + +// Logger is the basic type that allows for logging. A logger has an associated +// name, given to it during construction, either through a logger collection, +// GetLogger, GetLoggerNamed, or another Logger's Scope method. A logger also +// has an associated level and handler, typically configured through the logger +// collection to which it belongs. +type Logger struct { + level LogLevel + name string + collection *LoggerCollection + + handler_mtx sync.RWMutex + handler Handler +} + +// Scope returns a new Logger with the same level and handler, using the +// receiver Logger's name as a prefix. +func (l *Logger) Scope(name string) *Logger { + return l.collection.getLogger(l.name+"."+name, l.getLevel(), + l.getHandler()) +} + +func (l *Logger) setLevel(level LogLevel) { + atomic.StoreInt32((*int32)(&l.level), int32(level)) +} + +func (l *Logger) getLevel() LogLevel { + return LogLevel(atomic.LoadInt32((*int32)(&l.level))) +} + +func (l *Logger) setHandler(handler Handler) { + l.handler_mtx.Lock() + defer l.handler_mtx.Unlock() + l.handler = handler +} + +func (l *Logger) getHandler() Handler { + l.handler_mtx.RLock() + defer l.handler_mtx.RUnlock() + return l.handler +} diff --git a/vendor/github.com/spacemonkeygo/spacelog/output.go b/vendor/github.com/spacemonkeygo/spacelog/output.go new file mode 100644 index 00000000..8751268f --- /dev/null +++ b/vendor/github.com/spacemonkeygo/spacelog/output.go @@ -0,0 +1,178 @@ +// Copyright (C) 2014 Space Monkey, 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 spacelog + +import ( + "bytes" + "fmt" + "io" + "log" + "os" + "sync" +) + +type TextOutput interface { + Output(LogLevel, []byte) +} + +// WriterOutput is an io.Writer wrapper that matches the TextOutput interface +type WriterOutput struct { + w io.Writer +} + +// NewWriterOutput returns a TextOutput that writes messages to an io.Writer +func NewWriterOutput(w io.Writer) *WriterOutput { + return &WriterOutput{w: w} +} + +func (o *WriterOutput) Output(_ LogLevel, message []byte) { + o.w.Write(append(bytes.TrimRight(message, "\r\n"), platformNewline...)) +} + +// StdlibOutput is a TextOutput that simply writes to the default Go stdlib +// logging system. It is the default. If you configure the Go stdlib to write +// to spacelog, make sure to provide a new TextOutput to your logging +// collection +type StdlibOutput struct{} + +func (*StdlibOutput) Output(_ LogLevel, message []byte) { + log.Print(string(message)) +} + +type bufferMsg struct { + level LogLevel + message []byte +} + +// BufferedOutput uses a channel to synchronize writes to a wrapped TextOutput +// and allows for buffering a limited amount of log events. +type BufferedOutput struct { + o TextOutput + c chan bufferMsg + running sync.Mutex + close_once sync.Once +} + +// NewBufferedOutput returns a BufferedOutput wrapping output with a buffer +// size of buffer. +func NewBufferedOutput(output TextOutput, buffer int) *BufferedOutput { + if buffer < 0 { + buffer = 0 + } + b := &BufferedOutput{ + o: output, + c: make(chan bufferMsg, buffer)} + go b.process() + return b +} + +// Close shuts down the BufferedOutput's processing +func (b *BufferedOutput) Close() { + b.close_once.Do(func() { + close(b.c) + }) + b.running.Lock() + b.running.Unlock() +} + +func (b *BufferedOutput) Output(level LogLevel, message []byte) { + b.c <- bufferMsg{level: level, message: message} +} + +func (b *BufferedOutput) process() { + b.running.Lock() + defer b.running.Unlock() + for { + msg, open := <-b.c + if !open { + break + } + b.o.Output(msg.level, msg.message) + } +} + +// A TextOutput object that also implements HupHandlingTextOutput may have its +// OnHup() method called when an administrative signal is sent to this process. +type HupHandlingTextOutput interface { + TextOutput + OnHup() +} + +// FileWriterOutput is like WriterOutput with a plain file handle, but it +// knows how to reopen the file (or try to reopen it) if it hasn't been able +// to open the file previously, or if an appropriate signal has been received. +type FileWriterOutput struct { + *WriterOutput + path string +} + +// Creates a new FileWriterOutput object. This is the only case where an +// error opening the file will be reported to the caller; if we try to +// reopen it later and the reopen fails, we'll just keep trying until it +// works. +func NewFileWriterOutput(path string) (*FileWriterOutput, error) { + fo := &FileWriterOutput{path: path} + fh, err := fo.openFile() + if err != nil { + return nil, err + } + fo.WriterOutput = NewWriterOutput(fh) + return fo, nil +} + +// Try to open the file with the path associated with this object. +func (fo *FileWriterOutput) openFile() (*os.File, error) { + return os.OpenFile(fo.path, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0644) +} + +// Try to communicate a message without using our log file. In all likelihood, +// stderr is closed or redirected to /dev/null, but at least we can try +// writing there. In the very worst case, if an admin attaches a ptrace to +// this process, it will be more clear what the problem is. +func (fo *FileWriterOutput) fallbackLog(tmpl string, args ...interface{}) { + fmt.Fprintf(os.Stderr, tmpl, args...) +} + +// Output a log line by writing it to the file. If the file has been +// released, try to open it again. If that fails, cry for a little +// while, then throw away the message and carry on. +func (fo *FileWriterOutput) Output(ll LogLevel, message []byte) { + if fo.WriterOutput == nil { + fh, err := fo.openFile() + if err != nil { + fo.fallbackLog("Could not open %#v: %s", fo.path, err) + return + } + fo.WriterOutput = NewWriterOutput(fh) + } + fo.WriterOutput.Output(ll, message) +} + +// Throw away any references/handles to the output file. This probably +// means the admin wants to rotate the file out and have this process +// open a new one. Close the underlying io.Writer if that is a thing +// that it knows how to do. +func (fo *FileWriterOutput) OnHup() { + if fo.WriterOutput != nil { + wc, ok := fo.WriterOutput.w.(io.Closer) + if ok { + err := wc.Close() + if err != nil { + fo.fallbackLog("Closing %#v failed: %s", fo.path, err) + } + } + fo.WriterOutput = nil + } +} diff --git a/vendor/github.com/spacemonkeygo/spacelog/output_other.go b/vendor/github.com/spacemonkeygo/spacelog/output_other.go new file mode 100644 index 00000000..2be240a1 --- /dev/null +++ b/vendor/github.com/spacemonkeygo/spacelog/output_other.go @@ -0,0 +1,19 @@ +// Copyright (C) 2014 Space Monkey, 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. + +// +build !windows + +package spacelog + +var platformNewline = []byte("\n") diff --git a/vendor/github.com/spacemonkeygo/spacelog/output_windows.go b/vendor/github.com/spacemonkeygo/spacelog/output_windows.go new file mode 100644 index 00000000..58b71dab --- /dev/null +++ b/vendor/github.com/spacemonkeygo/spacelog/output_windows.go @@ -0,0 +1,17 @@ +// Copyright (C) 2014 Space Monkey, 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 spacelog + +var platformNewline = []byte("\r\n") diff --git a/vendor/github.com/spacemonkeygo/spacelog/setup.go b/vendor/github.com/spacemonkeygo/spacelog/setup.go new file mode 100644 index 00000000..2c1cbcee --- /dev/null +++ b/vendor/github.com/spacemonkeygo/spacelog/setup.go @@ -0,0 +1,189 @@ +// Copyright (C) 2014 Space Monkey, 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 spacelog + +import ( + "bytes" + "fmt" + "log" + "math" + "os" + "os/signal" + "regexp" + "strings" + "text/template" +) + +// SetupConfig is a configuration struct meant to be used with +// github.com/spacemonkeygo/flagfile/utils.Setup +// but can be used independently. +type SetupConfig struct { + Output string `default:"stderr" usage:"log output. can be stdout, stderr, syslog, or a path"` + Level string `default:"" usage:"base logger level"` + Filter string `default:"" usage:"sets loggers matching this regular expression to the lowest level"` + Format string `default:"" usage:"format string to use"` + Stdlevel string `default:"warn" usage:"logger level for stdlib log integration"` + Subproc string `default:"" usage:"process to run for stdout/stderr-captured logging. The command is first processed as a Go template that supports {{.Facility}}, {{.Level}}, and {{.Name}} fields, and then passed to sh. If set, will redirect stdout and stderr to the given process. A good default is 'setsid logger --priority {{.Facility}}.{{.Level}} --tag {{.Name}}'"` + Buffer int `default:"0" usage:"the number of messages to buffer. 0 for no buffer"` + // Facility defaults to syslog.LOG_USER (which is 8) + Facility int `default:"8" usage:"the syslog facility to use if syslog output is configured"` + HupRotate bool `default:"false" usage:"if true, sending a HUP signal will reopen log files"` + Config string `default:"" usage:"a semicolon separated list of logger=level; sets each log to the corresponding level"` +} + +var ( + stdlog = GetLoggerNamed("stdlog") + funcmap = template.FuncMap{"ColorizeLevel": ColorizeLevel} +) + +// SetFormatMethod adds functions to the template function map, such that +// command-line and Setup provided templates can call methods added to the map +// via this method. The map comes prepopulated with ColorizeLevel, but can be +// overridden. SetFormatMethod should be called (if at all) before one of +// this package's Setup methods. +func SetFormatMethod(name string, fn interface{}) { + funcmap[name] = fn +} + +// MustSetup is the same as Setup, but panics instead of returning an error +func MustSetup(procname string, config SetupConfig) { + err := Setup(procname, config) + if err != nil { + panic(err) + } +} + +type subprocInfo struct { + Facility string + Level string + Name string +} + +// Setup takes a given procname and sets spacelog up with the given +// configuration. Setup supports: +// * capturing stdout and stderr to a subprocess +// * configuring the default level +// * configuring log filters (enabling only some loggers) +// * configuring the logging template +// * configuring the output (a file, syslog, stdout, stderr) +// * configuring log event buffering +// * capturing all standard library logging with configurable log level +// It is expected that this method will be called once at process start. +func Setup(procname string, config SetupConfig) error { + if config.Subproc != "" { + t, err := template.New("subproc").Parse(config.Subproc) + if err != nil { + return err + } + var buf bytes.Buffer + err = t.Execute(&buf, &subprocInfo{ + Facility: fmt.Sprintf("%d", config.Facility), + Level: fmt.Sprintf("%d", 2), // syslog.LOG_CRIT + Name: procname}) + if err != nil { + return err + } + err = CaptureOutputToProcess("sh", "-c", string(buf.Bytes())) + if err != nil { + return err + } + } + if config.Config != "" { + err := ConfigureLoggers(config.Config) + if err != nil { + return err + } + } + if config.Level != "" { + level_val, err := LevelFromString(config.Level) + if err != nil { + return err + } + if level_val != DefaultLevel { + SetLevel(nil, level_val) + } + } + if config.Filter != "" { + re, err := regexp.Compile(config.Filter) + if err != nil { + return err + } + SetLevel(re, LogLevel(math.MinInt32)) + } + var t *template.Template + if config.Format != "" { + var err error + t, err = template.New("user").Funcs(funcmap).Parse(config.Format) + if err != nil { + return err + } + } + var textout TextOutput + switch strings.ToLower(config.Output) { + case "syslog": + w, err := NewSyslogOutput(SyslogPriority(config.Facility), procname) + if err != nil { + return err + } + if t == nil { + t = SyslogTemplate + } + textout = w + case "stdout": + if t == nil { + t = DefaultTemplate + } + textout = NewWriterOutput(os.Stdout) + case "stderr", "": + if t == nil { + t = DefaultTemplate + } + textout = NewWriterOutput(os.Stderr) + default: + if t == nil { + t = StandardTemplate + } + var err error + textout, err = NewFileWriterOutput(config.Output) + if err != nil { + return err + } + } + if config.HupRotate { + if hh, ok := textout.(HupHandlingTextOutput); ok { + sigchan := make(chan os.Signal) + signal.Notify(sigchan, sigHUP) + go func() { + for _ = range sigchan { + hh.OnHup() + } + }() + } + } + if config.Buffer > 0 { + textout = NewBufferedOutput(textout, config.Buffer) + } + SetHandler(nil, NewTextHandler(t, textout)) + log.SetFlags(log.Lshortfile) + if config.Stdlevel == "" { + config.Stdlevel = "warn" + } + stdlog_level_val, err := LevelFromString(config.Stdlevel) + if err != nil { + return err + } + log.SetOutput(stdlog.WriterWithoutCaller(stdlog_level_val)) + return nil +} diff --git a/vendor/github.com/spacemonkeygo/spacelog/sighup_appengine.go b/vendor/github.com/spacemonkeygo/spacelog/sighup_appengine.go new file mode 100644 index 00000000..c12ed961 --- /dev/null +++ b/vendor/github.com/spacemonkeygo/spacelog/sighup_appengine.go @@ -0,0 +1,37 @@ +// Copyright (C) 2017 Space Monkey, 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. + +// +build appengine + +package spacelog + +import ( + "strconv" +) + +const ( + sigHUP = syscallSignal(0x1) +) + +type syscallSignal int + +func (s syscallSignal) Signal() {} + +func (s syscallSignal) String() string { + switch s { + case sigHUP: + return "hangup" + } + return "signal " + strconv.Itoa(int(s)) +} diff --git a/vendor/github.com/spacemonkeygo/spacelog/sighup_other.go b/vendor/github.com/spacemonkeygo/spacelog/sighup_other.go new file mode 100644 index 00000000..0e033a8d --- /dev/null +++ b/vendor/github.com/spacemonkeygo/spacelog/sighup_other.go @@ -0,0 +1,23 @@ +// Copyright (C) 2017 Space Monkey, 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. + +// +build !appengine + +package spacelog + +import "syscall" + +const ( + sigHUP = syscall.SIGHUP +) diff --git a/vendor/github.com/spacemonkeygo/spacelog/syslog.go b/vendor/github.com/spacemonkeygo/spacelog/syslog.go new file mode 100644 index 00000000..c2317b6c --- /dev/null +++ b/vendor/github.com/spacemonkeygo/spacelog/syslog.go @@ -0,0 +1,65 @@ +// Copyright (C) 2014 Space Monkey, 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. + +// +build !windows + +package spacelog + +import ( + "bytes" + "log/syslog" +) + +type SyslogPriority syslog.Priority + +// SyslogOutput is a syslog client that matches the TextOutput interface +type SyslogOutput struct { + w *syslog.Writer +} + +// NewSyslogOutput returns a TextOutput object that writes to syslog using +// the given facility and tag. The log level will be determined by the log +// event. +func NewSyslogOutput(facility SyslogPriority, tag string) ( + TextOutput, error) { + w, err := syslog.New(syslog.Priority(facility), tag) + if err != nil { + return nil, err + } + return &SyslogOutput{w: w}, nil +} + +func (o *SyslogOutput) Output(level LogLevel, message []byte) { + level = level.Match() + for _, msg := range bytes.Split(message, []byte{'\n'}) { + switch level { + case Critical: + o.w.Crit(string(msg)) + case Error: + o.w.Err(string(msg)) + case Warning: + o.w.Warning(string(msg)) + case Notice: + o.w.Notice(string(msg)) + case Info: + o.w.Info(string(msg)) + case Debug: + fallthrough + case Trace: + fallthrough + default: + o.w.Debug(string(msg)) + } + } +} diff --git a/vendor/github.com/spacemonkeygo/spacelog/syslog_windows.go b/vendor/github.com/spacemonkeygo/spacelog/syslog_windows.go new file mode 100644 index 00000000..edba3c2a --- /dev/null +++ b/vendor/github.com/spacemonkeygo/spacelog/syslog_windows.go @@ -0,0 +1,26 @@ +// Copyright (C) 2014 Space Monkey, 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 spacelog + +import ( + "fmt" +) + +type SyslogPriority int + +func NewSyslogOutput(facility SyslogPriority, tag string) ( + TextOutput, error) { + return nil, fmt.Errorf("SyslogOutput not supported on Windows") +} diff --git a/vendor/github.com/spacemonkeygo/spacelog/templates.go b/vendor/github.com/spacemonkeygo/spacelog/templates.go new file mode 100644 index 00000000..959033da --- /dev/null +++ b/vendor/github.com/spacemonkeygo/spacelog/templates.go @@ -0,0 +1,69 @@ +// Copyright (C) 2014 Space Monkey, 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 spacelog + +import ( + "text/template" +) + +// ColorizeLevel returns a TermColor byte sequence for the appropriate color +// for the level. If you'd like to configure your own color choices, you can +// make your own template with its own function map to your own colorize +// function. +func ColorizeLevel(level LogLevel) string { + switch level.Match() { + case Critical, Error: + return TermColors{}.Red() + case Warning: + return TermColors{}.Magenta() + case Notice: + return TermColors{}.Yellow() + case Info, Debug, Trace: + return TermColors{}.Green() + } + return "" +} + +var ( + // ColorTemplate uses the default ColorizeLevel method for color choices. + ColorTemplate = template.Must(template.New("color").Funcs(template.FuncMap{ + "ColorizeLevel": ColorizeLevel}).Parse( + `{{.Blue}}{{.Date}} {{.Time}}{{.Reset}} ` + + `{{.Bold}}{{ColorizeLevel .Level}}{{.LevelJustified}}{{.Reset}} ` + + `{{.Underline}}{{.LoggerName}}{{.Reset}} ` + + `{{if .Filename}}{{.Filename}}:{{.Line}} {{end}}- ` + + `{{ColorizeLevel .Level}}{{.Message}}{{.Reset}}`)) + + // StandardTemplate is like ColorTemplate with no color. + StandardTemplate = template.Must(template.New("standard").Parse( + `{{.Date}} {{.Time}} ` + + `{{.Level}} {{.LoggerName}} ` + + `{{if .Filename}}{{.Filename}}:{{.Line}} {{end}}` + + `- {{.Message}}`)) + + // SyslogTemplate is missing the date and time as syslog adds those + // things. + SyslogTemplate = template.Must(template.New("syslog").Parse( + `{{.Level}} {{.LoggerName}} ` + + `{{if .Filename}}{{.Filename}}:{{.Line}} {{end}}` + + `- {{.Message}}`)) + + // StdlibTemplate is missing the date and time as the stdlib logger often + // adds those things. + StdlibTemplate = template.Must(template.New("stdlib").Parse( + `{{.Level}} {{.LoggerName}} ` + + `{{if .Filename}}{{.Filename}}:{{.Line}} {{end}}` + + `- {{.Message}}`)) +) diff --git a/vendor/github.com/spacemonkeygo/spacelog/templates_others.go b/vendor/github.com/spacemonkeygo/spacelog/templates_others.go new file mode 100644 index 00000000..114e2e14 --- /dev/null +++ b/vendor/github.com/spacemonkeygo/spacelog/templates_others.go @@ -0,0 +1,22 @@ +// Copyright (C) 2014 Space Monkey, 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. + +// +build !windows + +package spacelog + +var ( + // DefaultTemplate is default template for stdout/stderr for the platform + DefaultTemplate = ColorTemplate +) diff --git a/vendor/github.com/spacemonkeygo/spacelog/templates_windows.go b/vendor/github.com/spacemonkeygo/spacelog/templates_windows.go new file mode 100644 index 00000000..512b6004 --- /dev/null +++ b/vendor/github.com/spacemonkeygo/spacelog/templates_windows.go @@ -0,0 +1,20 @@ +// Copyright (C) 2014 Space Monkey, 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 spacelog + +var ( + // DefaultTemplate is default template for stdout/stderr for the platform + DefaultTemplate = StandardTemplate +) diff --git a/vendor/github.com/spacemonkeygo/spacelog/text.go b/vendor/github.com/spacemonkeygo/spacelog/text.go new file mode 100644 index 00000000..8b36ce99 --- /dev/null +++ b/vendor/github.com/spacemonkeygo/spacelog/text.go @@ -0,0 +1,80 @@ +// Copyright (C) 2014 Space Monkey, 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 spacelog + +import ( + "bytes" + "fmt" + "runtime" + "strings" + "sync" + "text/template" + "time" +) + +// TextHandler is the default implementation of the Handler interface. A +// TextHandler, on log events, makes LogEvent structures, passes them to the +// configured template, and then passes that output to a configured TextOutput +// interface. +type TextHandler struct { + mtx sync.RWMutex + template *template.Template + output TextOutput +} + +// NewTextHandler creates a Handler that creates LogEvents, passes them to +// the given template, and passes the result to output +func NewTextHandler(t *template.Template, output TextOutput) *TextHandler { + return &TextHandler{template: t, output: output} +} + +// Log makes a LogEvent, formats it with the configured template, then passes +// the output to configured output sink +func (h *TextHandler) Log(logger_name string, level LogLevel, msg string, + calldepth int) { + h.mtx.RLock() + output, template := h.output, h.template + h.mtx.RUnlock() + event := LogEvent{ + LoggerName: logger_name, + Level: level, + Message: strings.TrimRight(msg, "\n\r"), + Timestamp: time.Now()} + if calldepth >= 0 { + _, event.Filepath, event.Line, _ = runtime.Caller(calldepth + 1) + } + var buf bytes.Buffer + err := template.Execute(&buf, &event) + if err != nil { + output.Output(level, []byte( + fmt.Sprintf("log format template failed: %s", err))) + return + } + output.Output(level, buf.Bytes()) +} + +// SetTextTemplate changes the TextHandler's text formatting template +func (h *TextHandler) SetTextTemplate(t *template.Template) { + h.mtx.Lock() + defer h.mtx.Unlock() + h.template = t +} + +// SetTextOutput changes the TextHandler's TextOutput sink +func (h *TextHandler) SetTextOutput(output TextOutput) { + h.mtx.Lock() + defer h.mtx.Unlock() + h.output = output +} diff --git a/vendor/github.com/spf13/cobra/.gitignore b/vendor/github.com/spf13/cobra/.gitignore index 1b8c7c26..3b053c59 100644 --- a/vendor/github.com/spf13/cobra/.gitignore +++ b/vendor/github.com/spf13/cobra/.gitignore @@ -34,3 +34,5 @@ tags *.exe cobra.test + +.idea/* diff --git a/vendor/github.com/spf13/cobra/.travis.yml b/vendor/github.com/spf13/cobra/.travis.yml index 5afcb209..38b85f49 100644 --- a/vendor/github.com/spf13/cobra/.travis.yml +++ b/vendor/github.com/spf13/cobra/.travis.yml @@ -1,21 +1,31 @@ language: go +stages: + - diff + - test + +go: + - 1.10.x + - 1.11.x + - 1.12.x + - tip + matrix: - include: - - go: 1.9.4 - - go: 1.10.0 - - go: tip allow_failures: - go: tip + include: + - stage: diff + go: 1.12.x + script: diff -u <(echo -n) <(gofmt -d -s .) before_install: - mkdir -p bin - - curl -Lso bin/shellcheck https://github.com/caarlos0/shellcheck-docker/releases/download/v0.4.3/shellcheck + - curl -Lso bin/shellcheck https://github.com/caarlos0/shellcheck-docker/releases/download/v0.6.0/shellcheck - chmod +x bin/shellcheck + - go get -u github.com/kyoh86/richgo script: - - PATH=$PATH:$PWD/bin go test -v ./... + - PATH=$PATH:$PWD/bin richgo test -v ./... - go build - - diff -u <(echo -n) <(gofmt -d -s .) - if [ -z $NOVET ]; then - diff -u <(echo -n) <(go tool vet . 2>&1 | grep -vE 'ExampleCommand|bash_completions.*Fprint'); + diff -u <(echo -n) <(go vet . 2>&1 | grep -vE 'ExampleCommand|bash_completions.*Fprint'); fi diff --git a/vendor/github.com/spf13/cobra/README.md b/vendor/github.com/spf13/cobra/README.md index 851fcc08..60c5a425 100644 --- a/vendor/github.com/spf13/cobra/README.md +++ b/vendor/github.com/spf13/cobra/README.md @@ -2,25 +2,29 @@ Cobra is both a library for creating powerful modern CLI applications as well as a program to generate applications and command files. -Many of the most widely used Go projects are built using Cobra including: - -* [Kubernetes](http://kubernetes.io/) -* [Hugo](http://gohugo.io) -* [rkt](https://github.com/coreos/rkt) -* [etcd](https://github.com/coreos/etcd) -* [Moby (former Docker)](https://github.com/moby/moby) -* [Docker (distribution)](https://github.com/docker/distribution) -* [OpenShift](https://www.openshift.com/) -* [Delve](https://github.com/derekparker/delve) -* [GopherJS](http://www.gopherjs.org/) -* [CockroachDB](http://www.cockroachlabs.com/) -* [Bleve](http://www.blevesearch.com/) -* [ProjectAtomic (enterprise)](http://www.projectatomic.io/) -* [GiantSwarm's swarm](https://github.com/giantswarm/cli) -* [Nanobox](https://github.com/nanobox-io/nanobox)/[Nanopack](https://github.com/nanopack) -* [rclone](http://rclone.org/) -* [nehm](https://github.com/bogem/nehm) -* [Pouch](https://github.com/alibaba/pouch) +Many of the most widely used Go projects are built using Cobra, such as: +[Kubernetes](http://kubernetes.io/), +[Hugo](http://gohugo.io), +[rkt](https://github.com/coreos/rkt), +[etcd](https://github.com/coreos/etcd), +[Moby (former Docker)](https://github.com/moby/moby), +[Docker (distribution)](https://github.com/docker/distribution), +[OpenShift](https://www.openshift.com/), +[Delve](https://github.com/derekparker/delve), +[GopherJS](http://www.gopherjs.org/), +[CockroachDB](http://www.cockroachlabs.com/), +[Bleve](http://www.blevesearch.com/), +[ProjectAtomic (enterprise)](http://www.projectatomic.io/), +[Giant Swarm's gsctl](https://github.com/giantswarm/gsctl), +[Nanobox](https://github.com/nanobox-io/nanobox)/[Nanopack](https://github.com/nanopack), +[rclone](http://rclone.org/), +[nehm](https://github.com/bogem/nehm), +[Pouch](https://github.com/alibaba/pouch), +[Istio](https://istio.io), +[Prototool](https://github.com/uber/prototool), +[mattermost-server](https://github.com/mattermost/mattermost-server), +[Gardener](https://github.com/gardener/gardenctl), +etc. [![Build Status](https://travis-ci.org/spf13/cobra.svg "Travis CI status")](https://travis-ci.org/spf13/cobra) [![CircleCI status](https://circleci.com/gh/spf13/cobra.png?circle-token=:circle-token "CircleCI status")](https://circleci.com/gh/spf13/cobra) @@ -45,6 +49,7 @@ Many of the most widely used Go projects are built using Cobra including: * [Suggestions when "unknown command" happens](#suggestions-when-unknown-command-happens) * [Generating documentation for your command](#generating-documentation-for-your-command) * [Generating bash completions](#generating-bash-completions) + * [Generating zsh completions](#generating-zsh-completions) - [Contributing](#contributing) - [License](#license) @@ -152,9 +157,6 @@ In a Cobra app, typically the main.go file is very bare. It serves one purpose: package main import ( - "fmt" - "os" - "{pathToYourApp}/cmd" ) @@ -265,9 +267,6 @@ In a Cobra app, typically the main.go file is very bare. It serves, one purpose, package main import ( - "fmt" - "os" - "{pathToYourApp}/cmd" ) @@ -339,7 +338,7 @@ rootCmd.PersistentFlags().BoolVarP(&Verbose, "verbose", "v", false, "verbose out A flag can also be assigned locally which will only apply to that specific command. ```go -rootCmd.Flags().StringVarP(&Source, "source", "s", "", "Source directory to read from") +localCmd.Flags().StringVarP(&Source, "source", "s", "", "Source directory to read from") ``` ### Local Flag on Parent Commands @@ -395,6 +394,7 @@ The following validators are built in: - `MinimumNArgs(int)` - the command will report an error if there are not at least N positional args. - `MaximumNArgs(int)` - the command will report an error if there are more than N positional args. - `ExactArgs(int)` - the command will report an error if there are not exactly N positional args. +- `ExactValidArgs(int)` - the command will report an error if there are not exactly N positional args OR if there are any positional args that are not in the `ValidArgs` field of `Command` - `RangeArgs(min, max)` - the command will report an error if the number of args is not between the minimum and maximum number of expected args. An example of setting the custom validator: @@ -404,7 +404,7 @@ var cmd = &cobra.Command{ Short: "hello", Args: func(cmd *cobra.Command, args []string) error { if len(args) < 1 { - return errors.New("requires at least one arg") + return errors.New("requires a color argument") } if myapp.IsValidColor(args[0]) { return nil @@ -464,7 +464,7 @@ Echo works a lot like print, except it has a child command.`, } var cmdTimes = &cobra.Command{ - Use: "times [# times] [string to echo]", + Use: "times [string to echo]", Short: "Echo anything to the screen more times", Long: `echo things multiple times back to the user by providing a count and a string.`, @@ -721,6 +721,11 @@ Cobra can generate documentation based on subcommands, flags, etc. in the follow Cobra can generate a bash-completion file. If you add more information to your command, these completions can be amazingly powerful and flexible. Read more about it in [Bash Completions](bash_completions.md). +## Generating zsh completions + +Cobra can generate zsh-completion file. Read more about it in +[Zsh Completions](zsh_completions.md). + # Contributing 1. Fork it diff --git a/vendor/github.com/spf13/cobra/args.go b/vendor/github.com/spf13/cobra/args.go index a5d8a927..c4d820b8 100644 --- a/vendor/github.com/spf13/cobra/args.go +++ b/vendor/github.com/spf13/cobra/args.go @@ -78,6 +78,18 @@ func ExactArgs(n int) PositionalArgs { } } +// ExactValidArgs returns an error if +// there are not exactly N positional args OR +// there are any positional args that are not in the `ValidArgs` field of `Command` +func ExactValidArgs(n int) PositionalArgs { + return func(cmd *Command, args []string) error { + if err := ExactArgs(n)(cmd, args); err != nil { + return err + } + return OnlyValidArgs(cmd, args) + } +} + // RangeArgs returns an error if the number of args is not within the expected range. func RangeArgs(min int, max int) PositionalArgs { return func(cmd *Command, args []string) error { diff --git a/vendor/github.com/spf13/cobra/bash_completions.go b/vendor/github.com/spf13/cobra/bash_completions.go index 8fa8f486..57bb8e1b 100644 --- a/vendor/github.com/spf13/cobra/bash_completions.go +++ b/vendor/github.com/spf13/cobra/bash_completions.go @@ -129,7 +129,13 @@ __%[1]s_handle_reply() fi if [[ ${#COMPREPLY[@]} -eq 0 ]]; then - declare -F __custom_func >/dev/null && __custom_func + if declare -F __%[1]s_custom_func >/dev/null; then + # try command name qualified custom func + __%[1]s_custom_func + else + # otherwise fall back to unqualified for compatibility + declare -F __custom_func >/dev/null && __custom_func + fi fi # available in bash-completion >= 2, not always present on macOS @@ -193,7 +199,8 @@ __%[1]s_handle_flag() fi # skip the argument to a two word flag - if __%[1]s_contains_word "${words[c]}" "${two_word_flags[@]}"; then + if [[ ${words[c]} != *"="* ]] && __%[1]s_contains_word "${words[c]}" "${two_word_flags[@]}"; then + __%[1]s_debug "${FUNCNAME[0]}: found a flag ${words[c]}, skip the next argument" c=$((c+1)) # if we are looking for a flags value, don't show commands if [[ $c -eq $cword ]]; then @@ -373,6 +380,10 @@ func writeFlag(buf *bytes.Buffer, flag *pflag.Flag, cmd *Command) { } format += "\")\n" buf.WriteString(fmt.Sprintf(format, name)) + if len(flag.NoOptDefVal) == 0 { + format = " two_word_flags+=(\"--%s\")\n" + buf.WriteString(fmt.Sprintf(format, name)) + } writeFlagHandler(buf, "--"+name, flag.Annotations, cmd) } @@ -534,51 +545,3 @@ func (c *Command) GenBashCompletionFile(filename string) error { return c.GenBashCompletion(outFile) } - -// MarkFlagRequired adds the BashCompOneRequiredFlag annotation to the named flag if it exists, -// and causes your command to report an error if invoked without the flag. -func (c *Command) MarkFlagRequired(name string) error { - return MarkFlagRequired(c.Flags(), name) -} - -// MarkPersistentFlagRequired adds the BashCompOneRequiredFlag annotation to the named persistent flag if it exists, -// and causes your command to report an error if invoked without the flag. -func (c *Command) MarkPersistentFlagRequired(name string) error { - return MarkFlagRequired(c.PersistentFlags(), name) -} - -// MarkFlagRequired adds the BashCompOneRequiredFlag annotation to the named flag if it exists, -// and causes your command to report an error if invoked without the flag. -func MarkFlagRequired(flags *pflag.FlagSet, name string) error { - return flags.SetAnnotation(name, BashCompOneRequiredFlag, []string{"true"}) -} - -// MarkFlagFilename adds the BashCompFilenameExt annotation to the named flag, if it exists. -// Generated bash autocompletion will select filenames for the flag, limiting to named extensions if provided. -func (c *Command) MarkFlagFilename(name string, extensions ...string) error { - return MarkFlagFilename(c.Flags(), name, extensions...) -} - -// MarkFlagCustom adds the BashCompCustom annotation to the named flag, if it exists. -// Generated bash autocompletion will call the bash function f for the flag. -func (c *Command) MarkFlagCustom(name string, f string) error { - return MarkFlagCustom(c.Flags(), name, f) -} - -// MarkPersistentFlagFilename adds the BashCompFilenameExt annotation to the named persistent flag, if it exists. -// Generated bash autocompletion will select filenames for the flag, limiting to named extensions if provided. -func (c *Command) MarkPersistentFlagFilename(name string, extensions ...string) error { - return MarkFlagFilename(c.PersistentFlags(), name, extensions...) -} - -// MarkFlagFilename adds the BashCompFilenameExt annotation to the named flag in the flag set, if it exists. -// Generated bash autocompletion will select filenames for the flag, limiting to named extensions if provided. -func MarkFlagFilename(flags *pflag.FlagSet, name string, extensions ...string) error { - return flags.SetAnnotation(name, BashCompFilenameExt, extensions) -} - -// MarkFlagCustom adds the BashCompCustom annotation to the named flag in the flag set, if it exists. -// Generated bash autocompletion will call the bash function f for the flag. -func MarkFlagCustom(flags *pflag.FlagSet, name string, f string) error { - return flags.SetAnnotation(name, BashCompCustom, []string{f}) -} diff --git a/vendor/github.com/spf13/cobra/bash_completions.md b/vendor/github.com/spf13/cobra/bash_completions.md index e79d4769..4ac61ee1 100644 --- a/vendor/github.com/spf13/cobra/bash_completions.md +++ b/vendor/github.com/spf13/cobra/bash_completions.md @@ -1,5 +1,40 @@ # Generating Bash Completions For Your Own cobra.Command +If you are using the generator you can create a completion command by running + +```bash +cobra add completion +``` + +Update the help text show how to install the bash_completion Linux show here [Kubectl docs show mac options](https://kubernetes.io/docs/tasks/tools/install-kubectl/#enabling-shell-autocompletion) + +Writing the shell script to stdout allows the most flexible use. + +```go +// completionCmd represents the completion command +var completionCmd = &cobra.Command{ + Use: "completion", + Short: "Generates bash completion scripts", + Long: `To load completion run + +. <(bitbucket completion) + +To configure your bash shell to load completions for each session add to your bashrc + +# ~/.bashrc or ~/.profile +. <(bitbucket completion) +`, + Run: func(cmd *cobra.Command, args []string) { + rootCmd.GenBashCompletion(os.Stdout); + }, +} +``` + +**Note:** The cobra generator may include messages printed to stdout for example if the config file is loaded, this will break the auto complete script + + +## Example from kubectl + Generating bash completions from a cobra command is incredibly easy. An actual program which does so for the kubernetes kubectl binary is as follows: ```go @@ -47,7 +82,7 @@ __kubectl_get_resource() fi } -__custom_func() { +__kubectl_custom_func() { case ${last_command} in kubectl_get | kubectl_describe | kubectl_delete | kubectl_stop) __kubectl_get_resource @@ -74,7 +109,7 @@ Find more information at https://github.com/GoogleCloudPlatform/kubernetes.`, } ``` -The `BashCompletionFunction` option is really only valid/useful on the root command. Doing the above will cause `__custom_func()` to be called when the built in processor was unable to find a solution. In the case of kubernetes a valid command might look something like `kubectl get pod [mypod]`. If you type `kubectl get pod [tab][tab]` the `__customc_func()` will run because the cobra.Command only understood "kubectl" and "get." `__custom_func()` will see that the cobra.Command is "kubectl_get" and will thus call another helper `__kubectl_get_resource()`. `__kubectl_get_resource` will look at the 'nouns' collected. In our example the only noun will be `pod`. So it will call `__kubectl_parse_get pod`. `__kubectl_parse_get` will actually call out to kubernetes and get any pods. It will then set `COMPREPLY` to valid pods! +The `BashCompletionFunction` option is really only valid/useful on the root command. Doing the above will cause `__kubectl_custom_func()` (`___custom_func()`) to be called when the built in processor was unable to find a solution. In the case of kubernetes a valid command might look something like `kubectl get pod [mypod]`. If you type `kubectl get pod [tab][tab]` the `__kubectl_customc_func()` will run because the cobra.Command only understood "kubectl" and "get." `__kubectl_custom_func()` will see that the cobra.Command is "kubectl_get" and will thus call another helper `__kubectl_get_resource()`. `__kubectl_get_resource` will look at the 'nouns' collected. In our example the only noun will be `pod`. So it will call `__kubectl_parse_get pod`. `__kubectl_parse_get` will actually call out to kubernetes and get any pods. It will then set `COMPREPLY` to valid pods! ## Have the completions code complete your 'nouns' diff --git a/vendor/github.com/spf13/cobra/cobra.go b/vendor/github.com/spf13/cobra/cobra.go index 7010fd15..6505c070 100644 --- a/vendor/github.com/spf13/cobra/cobra.go +++ b/vendor/github.com/spf13/cobra/cobra.go @@ -23,6 +23,7 @@ import ( "strconv" "strings" "text/template" + "time" "unicode" ) @@ -56,6 +57,12 @@ var MousetrapHelpText string = `This is a command line tool. You need to open cmd.exe and run it from there. ` +// MousetrapDisplayDuration controls how long the MousetrapHelpText message is displayed on Windows +// if the CLI is started from explorer.exe. Set to 0 to wait for the return key to be pressed. +// To disable the mousetrap, just set MousetrapHelpText to blank string (""). +// Works only on Microsoft Windows. +var MousetrapDisplayDuration time.Duration = 5 * time.Second + // AddTemplateFunc adds a template function that's available to Usage and Help // template generation. func AddTemplateFunc(name string, tmplFunc interface{}) { diff --git a/vendor/github.com/spf13/cobra/command.go b/vendor/github.com/spf13/cobra/command.go index 34d1bf36..c7e89830 100644 --- a/vendor/github.com/spf13/cobra/command.go +++ b/vendor/github.com/spf13/cobra/command.go @@ -177,8 +177,6 @@ type Command struct { // that we can use on every pflag set and children commands globNormFunc func(f *flag.FlagSet, name string) flag.NormalizedName - // output is an output writer defined by user. - output io.Writer // usageFunc is usage func defined by user. usageFunc func(*Command) error // usageTemplate is usage template defined by user. @@ -195,6 +193,13 @@ type Command struct { helpCommand *Command // versionTemplate is the version template defined by user. versionTemplate string + + // inReader is a reader defined by the user that replaces stdin + inReader io.Reader + // outWriter is a writer defined by the user that replaces stdout + outWriter io.Writer + // errWriter is a writer defined by the user that replaces stderr + errWriter io.Writer } // SetArgs sets arguments for the command. It is set to os.Args[1:] by default, if desired, can be overridden @@ -205,8 +210,28 @@ func (c *Command) SetArgs(a []string) { // SetOutput sets the destination for usage and error messages. // If output is nil, os.Stderr is used. +// Deprecated: Use SetOut and/or SetErr instead func (c *Command) SetOutput(output io.Writer) { - c.output = output + c.outWriter = output + c.errWriter = output +} + +// SetOut sets the destination for usage messages. +// If newOut is nil, os.Stdout is used. +func (c *Command) SetOut(newOut io.Writer) { + c.outWriter = newOut +} + +// SetErr sets the destination for error messages. +// If newErr is nil, os.Stderr is used. +func (c *Command) SetErr(newErr io.Writer) { + c.errWriter = newErr +} + +// SetOut sets the source for input data +// If newIn is nil, os.Stdin is used. +func (c *Command) SetIn(newIn io.Reader) { + c.inReader = newIn } // SetUsageFunc sets usage function. Usage can be defined by application. @@ -267,9 +292,19 @@ func (c *Command) OutOrStderr() io.Writer { return c.getOut(os.Stderr) } +// ErrOrStderr returns output to stderr +func (c *Command) ErrOrStderr() io.Writer { + return c.getErr(os.Stderr) +} + +// ErrOrStderr returns output to stderr +func (c *Command) InOrStdin() io.Reader { + return c.getIn(os.Stdin) +} + func (c *Command) getOut(def io.Writer) io.Writer { - if c.output != nil { - return c.output + if c.outWriter != nil { + return c.outWriter } if c.HasParent() { return c.parent.getOut(def) @@ -277,6 +312,26 @@ func (c *Command) getOut(def io.Writer) io.Writer { return def } +func (c *Command) getErr(def io.Writer) io.Writer { + if c.errWriter != nil { + return c.errWriter + } + if c.HasParent() { + return c.parent.getErr(def) + } + return def +} + +func (c *Command) getIn(def io.Reader) io.Reader { + if c.inReader != nil { + return c.inReader + } + if c.HasParent() { + return c.parent.getIn(def) + } + return def +} + // UsageFunc returns either the function set by SetUsageFunc for this command // or a parent, or it returns a default usage function. func (c *Command) UsageFunc() (f func(*Command) error) { @@ -329,13 +384,22 @@ func (c *Command) Help() error { return nil } -// UsageString return usage string. +// UsageString returns usage string. func (c *Command) UsageString() string { - tmpOutput := c.output + // Storing normal writers + tmpOutput := c.outWriter + tmpErr := c.errWriter + bb := new(bytes.Buffer) - c.SetOutput(bb) + c.outWriter = bb + c.errWriter = bb + c.Usage() - c.output = tmpOutput + + // Setting things back to normal + c.outWriter = tmpOutput + c.errWriter = tmpErr + return bb.String() } @@ -817,13 +881,11 @@ func (c *Command) ExecuteC() (cmd *Command, err error) { // overriding c.InitDefaultHelpCmd() - var args []string + args := c.args // Workaround FAIL with "go test -v" or "cobra.test -test.v", see #155 if c.args == nil && filepath.Base(os.Args[0]) != "cobra.test" { args = os.Args[1:] - } else { - args = c.args } var flags []string @@ -1070,6 +1132,21 @@ func (c *Command) Printf(format string, i ...interface{}) { c.Print(fmt.Sprintf(format, i...)) } +// PrintErr is a convenience method to Print to the defined Err output, fallback to Stderr if not set. +func (c *Command) PrintErr(i ...interface{}) { + fmt.Fprint(c.ErrOrStderr(), i...) +} + +// PrintErrln is a convenience method to Println to the defined Err output, fallback to Stderr if not set. +func (c *Command) PrintErrln(i ...interface{}) { + c.Print(fmt.Sprintln(i...)) +} + +// PrintErrf is a convenience method to Printf to the defined Err output, fallback to Stderr if not set. +func (c *Command) PrintErrf(format string, i ...interface{}) { + c.Print(fmt.Sprintf(format, i...)) +} + // CommandPath returns the full path to this command. func (c *Command) CommandPath() string { if c.HasParent() { @@ -1335,7 +1412,7 @@ func (c *Command) LocalFlags() *flag.FlagSet { return c.lflags } -// InheritedFlags returns all flags which were inherited from parents commands. +// InheritedFlags returns all flags which were inherited from parent commands. func (c *Command) InheritedFlags() *flag.FlagSet { c.mergePersistentFlags() diff --git a/vendor/github.com/spf13/cobra/command_win.go b/vendor/github.com/spf13/cobra/command_win.go index edec728e..8768b173 100644 --- a/vendor/github.com/spf13/cobra/command_win.go +++ b/vendor/github.com/spf13/cobra/command_win.go @@ -3,6 +3,7 @@ package cobra import ( + "fmt" "os" "time" @@ -14,7 +15,12 @@ var preExecHookFn = preExecHook func preExecHook(c *Command) { if MousetrapHelpText != "" && mousetrap.StartedByExplorer() { c.Print(MousetrapHelpText) - time.Sleep(5 * time.Second) + if MousetrapDisplayDuration > 0 { + time.Sleep(MousetrapDisplayDuration) + } else { + c.Println("Press return to continue...") + fmt.Scanln() + } os.Exit(1) } } diff --git a/vendor/github.com/spf13/cobra/go.mod b/vendor/github.com/spf13/cobra/go.mod new file mode 100644 index 00000000..9a9eb65a --- /dev/null +++ b/vendor/github.com/spf13/cobra/go.mod @@ -0,0 +1,13 @@ +module github.com/spf13/cobra + +go 1.12 + +require ( + github.com/BurntSushi/toml v0.3.1 // indirect + github.com/cpuguy83/go-md2man v1.0.10 + github.com/inconshreveable/mousetrap v1.0.0 + github.com/mitchellh/go-homedir v1.1.0 + github.com/spf13/pflag v1.0.3 + github.com/spf13/viper v1.3.2 + gopkg.in/yaml.v2 v2.2.2 +) diff --git a/vendor/github.com/spf13/cobra/go.sum b/vendor/github.com/spf13/cobra/go.sum new file mode 100644 index 00000000..9761f4d0 --- /dev/null +++ b/vendor/github.com/spf13/cobra/go.sum @@ -0,0 +1,51 @@ +github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= +github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= +github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= +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/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/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/magiconair/properties v1.8.0 h1:LLgXmsheXeRoUOBOjtwPQCWIYqM/LU1ayDtDePerRcY= +github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc= +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +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/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= +github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= +github.com/spf13/afero v1.1.2 h1:m8/z1t7/fwjysjQRYbP0RD+bUIF/8tJwPdEZsI83ACI= +github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8= +github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk= +github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/viper v1.3.2 h1:VUFqw5KcqRf7i70GOzW7N+Q7+gxVBkSSqiXB12+JQ4M= +github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= +github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a h1:1n5lsVfiQW3yfsRGu98756EH1YthsFqr/5mxHduZW2A= +golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/vendor/github.com/spf13/cobra/powershell_completions.go b/vendor/github.com/spf13/cobra/powershell_completions.go new file mode 100644 index 00000000..756c61b9 --- /dev/null +++ b/vendor/github.com/spf13/cobra/powershell_completions.go @@ -0,0 +1,100 @@ +// PowerShell completions are based on the amazing work from clap: +// https://github.com/clap-rs/clap/blob/3294d18efe5f264d12c9035f404c7d189d4824e1/src/completions/powershell.rs +// +// The generated scripts require PowerShell v5.0+ (which comes Windows 10, but +// can be downloaded separately for windows 7 or 8.1). + +package cobra + +import ( + "bytes" + "fmt" + "io" + "os" + "strings" + + "github.com/spf13/pflag" +) + +var powerShellCompletionTemplate = `using namespace System.Management.Automation +using namespace System.Management.Automation.Language +Register-ArgumentCompleter -Native -CommandName '%s' -ScriptBlock { + param($wordToComplete, $commandAst, $cursorPosition) + $commandElements = $commandAst.CommandElements + $command = @( + '%s' + for ($i = 1; $i -lt $commandElements.Count; $i++) { + $element = $commandElements[$i] + if ($element -isnot [StringConstantExpressionAst] -or + $element.StringConstantType -ne [StringConstantType]::BareWord -or + $element.Value.StartsWith('-')) { + break + } + $element.Value + } + ) -join ';' + $completions = @(switch ($command) {%s + }) + $completions.Where{ $_.CompletionText -like "$wordToComplete*" } | + Sort-Object -Property ListItemText +}` + +func generatePowerShellSubcommandCases(out io.Writer, cmd *Command, previousCommandName string) { + var cmdName string + if previousCommandName == "" { + cmdName = cmd.Name() + } else { + cmdName = fmt.Sprintf("%s;%s", previousCommandName, cmd.Name()) + } + + fmt.Fprintf(out, "\n '%s' {", cmdName) + + cmd.Flags().VisitAll(func(flag *pflag.Flag) { + if nonCompletableFlag(flag) { + return + } + usage := escapeStringForPowerShell(flag.Usage) + if len(flag.Shorthand) > 0 { + fmt.Fprintf(out, "\n [CompletionResult]::new('-%s', '%s', [CompletionResultType]::ParameterName, '%s')", flag.Shorthand, flag.Shorthand, usage) + } + fmt.Fprintf(out, "\n [CompletionResult]::new('--%s', '%s', [CompletionResultType]::ParameterName, '%s')", flag.Name, flag.Name, usage) + }) + + for _, subCmd := range cmd.Commands() { + usage := escapeStringForPowerShell(subCmd.Short) + fmt.Fprintf(out, "\n [CompletionResult]::new('%s', '%s', [CompletionResultType]::ParameterValue, '%s')", subCmd.Name(), subCmd.Name(), usage) + } + + fmt.Fprint(out, "\n break\n }") + + for _, subCmd := range cmd.Commands() { + generatePowerShellSubcommandCases(out, subCmd, cmdName) + } +} + +func escapeStringForPowerShell(s string) string { + return strings.Replace(s, "'", "''", -1) +} + +// GenPowerShellCompletion generates PowerShell completion file and writes to the passed writer. +func (c *Command) GenPowerShellCompletion(w io.Writer) error { + buf := new(bytes.Buffer) + + var subCommandCases bytes.Buffer + generatePowerShellSubcommandCases(&subCommandCases, c, "") + fmt.Fprintf(buf, powerShellCompletionTemplate, c.Name(), c.Name(), subCommandCases.String()) + + _, err := buf.WriteTo(w) + return err +} + +// GenPowerShellCompletionFile generates PowerShell completion file. +func (c *Command) GenPowerShellCompletionFile(filename string) error { + outFile, err := os.Create(filename) + if err != nil { + return err + } + defer outFile.Close() + + return c.GenPowerShellCompletion(outFile) +} diff --git a/vendor/github.com/spf13/cobra/powershell_completions.md b/vendor/github.com/spf13/cobra/powershell_completions.md new file mode 100644 index 00000000..afed8024 --- /dev/null +++ b/vendor/github.com/spf13/cobra/powershell_completions.md @@ -0,0 +1,14 @@ +# Generating PowerShell Completions For Your Own cobra.Command + +Cobra can generate PowerShell completion scripts. Users need PowerShell version 5.0 or above, which comes with Windows 10 and can be downloaded separately for Windows 7 or 8.1. They can then write the completions to a file and source this file from their PowerShell profile, which is referenced by the `$Profile` environment variable. See `Get-Help about_Profiles` for more info about PowerShell profiles. + +# What's supported + +- Completion for subcommands using their `.Short` description +- Completion for non-hidden flags using their `.Name` and `.Shorthand` + +# What's not yet supported + +- Command aliases +- Required, filename or custom flags (they will work like normal flags) +- Custom completion scripts diff --git a/vendor/github.com/spf13/cobra/shell_completions.go b/vendor/github.com/spf13/cobra/shell_completions.go new file mode 100644 index 00000000..ba0af9cb --- /dev/null +++ b/vendor/github.com/spf13/cobra/shell_completions.go @@ -0,0 +1,85 @@ +package cobra + +import ( + "github.com/spf13/pflag" +) + +// MarkFlagRequired adds the BashCompOneRequiredFlag annotation to the named flag if it exists, +// and causes your command to report an error if invoked without the flag. +func (c *Command) MarkFlagRequired(name string) error { + return MarkFlagRequired(c.Flags(), name) +} + +// MarkPersistentFlagRequired adds the BashCompOneRequiredFlag annotation to the named persistent flag if it exists, +// and causes your command to report an error if invoked without the flag. +func (c *Command) MarkPersistentFlagRequired(name string) error { + return MarkFlagRequired(c.PersistentFlags(), name) +} + +// MarkFlagRequired adds the BashCompOneRequiredFlag annotation to the named flag if it exists, +// and causes your command to report an error if invoked without the flag. +func MarkFlagRequired(flags *pflag.FlagSet, name string) error { + return flags.SetAnnotation(name, BashCompOneRequiredFlag, []string{"true"}) +} + +// MarkFlagFilename adds the BashCompFilenameExt annotation to the named flag, if it exists. +// Generated bash autocompletion will select filenames for the flag, limiting to named extensions if provided. +func (c *Command) MarkFlagFilename(name string, extensions ...string) error { + return MarkFlagFilename(c.Flags(), name, extensions...) +} + +// MarkFlagCustom adds the BashCompCustom annotation to the named flag, if it exists. +// Generated bash autocompletion will call the bash function f for the flag. +func (c *Command) MarkFlagCustom(name string, f string) error { + return MarkFlagCustom(c.Flags(), name, f) +} + +// MarkPersistentFlagFilename instructs the various shell completion +// implementations to limit completions for this persistent flag to the +// specified extensions (patterns). +// +// Shell Completion compatibility matrix: bash, zsh +func (c *Command) MarkPersistentFlagFilename(name string, extensions ...string) error { + return MarkFlagFilename(c.PersistentFlags(), name, extensions...) +} + +// MarkFlagFilename instructs the various shell completion implementations to +// limit completions for this flag to the specified extensions (patterns). +// +// Shell Completion compatibility matrix: bash, zsh +func MarkFlagFilename(flags *pflag.FlagSet, name string, extensions ...string) error { + return flags.SetAnnotation(name, BashCompFilenameExt, extensions) +} + +// MarkFlagCustom instructs the various shell completion implementations to +// limit completions for this flag to the specified extensions (patterns). +// +// Shell Completion compatibility matrix: bash, zsh +func MarkFlagCustom(flags *pflag.FlagSet, name string, f string) error { + return flags.SetAnnotation(name, BashCompCustom, []string{f}) +} + +// MarkFlagDirname instructs the various shell completion implementations to +// complete only directories with this named flag. +// +// Shell Completion compatibility matrix: zsh +func (c *Command) MarkFlagDirname(name string) error { + return MarkFlagDirname(c.Flags(), name) +} + +// MarkPersistentFlagDirname instructs the various shell completion +// implementations to complete only directories with this persistent named flag. +// +// Shell Completion compatibility matrix: zsh +func (c *Command) MarkPersistentFlagDirname(name string) error { + return MarkFlagDirname(c.PersistentFlags(), name) +} + +// MarkFlagDirname instructs the various shell completion implementations to +// complete only directories with this specified flag. +// +// Shell Completion compatibility matrix: zsh +func MarkFlagDirname(flags *pflag.FlagSet, name string) error { + zshPattern := "-(/)" + return flags.SetAnnotation(name, zshCompDirname, []string{zshPattern}) +} diff --git a/vendor/github.com/spf13/cobra/zsh_completions.go b/vendor/github.com/spf13/cobra/zsh_completions.go index 889c22e2..12755482 100644 --- a/vendor/github.com/spf13/cobra/zsh_completions.go +++ b/vendor/github.com/spf13/cobra/zsh_completions.go @@ -1,13 +1,102 @@ package cobra import ( - "bytes" + "encoding/json" "fmt" "io" "os" + "sort" "strings" + "text/template" + + "github.com/spf13/pflag" +) + +const ( + zshCompArgumentAnnotation = "cobra_annotations_zsh_completion_argument_annotation" + zshCompArgumentFilenameComp = "cobra_annotations_zsh_completion_argument_file_completion" + zshCompArgumentWordComp = "cobra_annotations_zsh_completion_argument_word_completion" + zshCompDirname = "cobra_annotations_zsh_dirname" +) + +var ( + zshCompFuncMap = template.FuncMap{ + "genZshFuncName": zshCompGenFuncName, + "extractFlags": zshCompExtractFlag, + "genFlagEntryForZshArguments": zshCompGenFlagEntryForArguments, + "extractArgsCompletions": zshCompExtractArgumentCompletionHintsForRendering, + } + zshCompletionText = ` +{{/* should accept Command (that contains subcommands) as parameter */}} +{{define "argumentsC" -}} +{{ $cmdPath := genZshFuncName .}} +function {{$cmdPath}} { + local -a commands + + _arguments -C \{{- range extractFlags .}} + {{genFlagEntryForZshArguments .}} \{{- end}} + "1: :->cmnds" \ + "*::arg:->args" + + case $state in + cmnds) + commands=({{range .Commands}}{{if not .Hidden}} + "{{.Name}}:{{.Short}}"{{end}}{{end}} + ) + _describe "command" commands + ;; + esac + + case "$words[1]" in {{- range .Commands}}{{if not .Hidden}} + {{.Name}}) + {{$cmdPath}}_{{.Name}} + ;;{{end}}{{end}} + esac +} +{{range .Commands}}{{if not .Hidden}} +{{template "selectCmdTemplate" .}} +{{- end}}{{end}} +{{- end}} + +{{/* should accept Command without subcommands as parameter */}} +{{define "arguments" -}} +function {{genZshFuncName .}} { +{{" _arguments"}}{{range extractFlags .}} \ + {{genFlagEntryForZshArguments . -}} +{{end}}{{range extractArgsCompletions .}} \ + {{.}}{{end}} +} +{{end}} + +{{/* dispatcher for commands with or without subcommands */}} +{{define "selectCmdTemplate" -}} +{{if .Hidden}}{{/* ignore hidden*/}}{{else -}} +{{if .Commands}}{{template "argumentsC" .}}{{else}}{{template "arguments" .}}{{end}} +{{- end}} +{{- end}} + +{{/* template entry point */}} +{{define "Main" -}} +#compdef _{{.Name}} {{.Name}} + +{{template "selectCmdTemplate" .}} +{{end}} +` ) +// zshCompArgsAnnotation is used to encode/decode zsh completion for +// arguments to/from Command.Annotations. +type zshCompArgsAnnotation map[int]zshCompArgHint + +type zshCompArgHint struct { + // Indicates the type of the completion to use. One of: + // zshCompArgumentFilenameComp or zshCompArgumentWordComp + Tipe string `json:"type"` + + // A value for the type above (globs for file completion or words) + Options []string `json:"options"` +} + // GenZshCompletionFile generates zsh completion file. func (c *Command) GenZshCompletionFile(filename string) error { outFile, err := os.Create(filename) @@ -19,108 +108,229 @@ func (c *Command) GenZshCompletionFile(filename string) error { return c.GenZshCompletion(outFile) } -// GenZshCompletion generates a zsh completion file and writes to the passed writer. +// GenZshCompletion generates a zsh completion file and writes to the passed +// writer. The completion always run on the root command regardless of the +// command it was called from. func (c *Command) GenZshCompletion(w io.Writer) error { - buf := new(bytes.Buffer) - - writeHeader(buf, c) - maxDepth := maxDepth(c) - writeLevelMapping(buf, maxDepth) - writeLevelCases(buf, maxDepth, c) + tmpl, err := template.New("Main").Funcs(zshCompFuncMap).Parse(zshCompletionText) + if err != nil { + return fmt.Errorf("error creating zsh completion template: %v", err) + } + return tmpl.Execute(w, c.Root()) +} - _, err := buf.WriteTo(w) - return err +// MarkZshCompPositionalArgumentFile marks the specified argument (first +// argument is 1) as completed by file selection. patterns (e.g. "*.txt") are +// optional - if not provided the completion will search for all files. +func (c *Command) MarkZshCompPositionalArgumentFile(argPosition int, patterns ...string) error { + if argPosition < 1 { + return fmt.Errorf("Invalid argument position (%d)", argPosition) + } + annotation, err := c.zshCompGetArgsAnnotations() + if err != nil { + return err + } + if c.zshcompArgsAnnotationnIsDuplicatePosition(annotation, argPosition) { + return fmt.Errorf("Duplicate annotation for positional argument at index %d", argPosition) + } + annotation[argPosition] = zshCompArgHint{ + Tipe: zshCompArgumentFilenameComp, + Options: patterns, + } + return c.zshCompSetArgsAnnotations(annotation) } -func writeHeader(w io.Writer, cmd *Command) { - fmt.Fprintf(w, "#compdef %s\n\n", cmd.Name()) +// MarkZshCompPositionalArgumentWords marks the specified positional argument +// (first argument is 1) as completed by the provided words. At east one word +// must be provided, spaces within words will be offered completion with +// "word\ word". +func (c *Command) MarkZshCompPositionalArgumentWords(argPosition int, words ...string) error { + if argPosition < 1 { + return fmt.Errorf("Invalid argument position (%d)", argPosition) + } + if len(words) == 0 { + return fmt.Errorf("Trying to set empty word list for positional argument %d", argPosition) + } + annotation, err := c.zshCompGetArgsAnnotations() + if err != nil { + return err + } + if c.zshcompArgsAnnotationnIsDuplicatePosition(annotation, argPosition) { + return fmt.Errorf("Duplicate annotation for positional argument at index %d", argPosition) + } + annotation[argPosition] = zshCompArgHint{ + Tipe: zshCompArgumentWordComp, + Options: words, + } + return c.zshCompSetArgsAnnotations(annotation) } -func maxDepth(c *Command) int { - if len(c.Commands()) == 0 { - return 0 +func zshCompExtractArgumentCompletionHintsForRendering(c *Command) ([]string, error) { + var result []string + annotation, err := c.zshCompGetArgsAnnotations() + if err != nil { + return nil, err } - maxDepthSub := 0 - for _, s := range c.Commands() { - subDepth := maxDepth(s) - if subDepth > maxDepthSub { - maxDepthSub = subDepth + for k, v := range annotation { + s, err := zshCompRenderZshCompArgHint(k, v) + if err != nil { + return nil, err } + result = append(result, s) } - return 1 + maxDepthSub + if len(c.ValidArgs) > 0 { + if _, positionOneExists := annotation[1]; !positionOneExists { + s, err := zshCompRenderZshCompArgHint(1, zshCompArgHint{ + Tipe: zshCompArgumentWordComp, + Options: c.ValidArgs, + }) + if err != nil { + return nil, err + } + result = append(result, s) + } + } + sort.Strings(result) + return result, nil } -func writeLevelMapping(w io.Writer, numLevels int) { - fmt.Fprintln(w, `_arguments \`) - for i := 1; i <= numLevels; i++ { - fmt.Fprintf(w, ` '%d: :->level%d' \`, i, i) - fmt.Fprintln(w) +func zshCompRenderZshCompArgHint(i int, z zshCompArgHint) (string, error) { + switch t := z.Tipe; t { + case zshCompArgumentFilenameComp: + var globs []string + for _, g := range z.Options { + globs = append(globs, fmt.Sprintf(`-g "%s"`, g)) + } + return fmt.Sprintf(`'%d: :_files %s'`, i, strings.Join(globs, " ")), nil + case zshCompArgumentWordComp: + var words []string + for _, w := range z.Options { + words = append(words, fmt.Sprintf("%q", w)) + } + return fmt.Sprintf(`'%d: :(%s)'`, i, strings.Join(words, " ")), nil + default: + return "", fmt.Errorf("Invalid zsh argument completion annotation: %s", t) } - fmt.Fprintf(w, ` '%d: :%s'`, numLevels+1, "_files") - fmt.Fprintln(w) } -func writeLevelCases(w io.Writer, maxDepth int, root *Command) { - fmt.Fprintln(w, "case $state in") - defer fmt.Fprintln(w, "esac") +func (c *Command) zshcompArgsAnnotationnIsDuplicatePosition(annotation zshCompArgsAnnotation, position int) bool { + _, dup := annotation[position] + return dup +} - for i := 1; i <= maxDepth; i++ { - fmt.Fprintf(w, " level%d)\n", i) - writeLevel(w, root, i) - fmt.Fprintln(w, " ;;") +func (c *Command) zshCompGetArgsAnnotations() (zshCompArgsAnnotation, error) { + annotation := make(zshCompArgsAnnotation) + annotationString, ok := c.Annotations[zshCompArgumentAnnotation] + if !ok { + return annotation, nil + } + err := json.Unmarshal([]byte(annotationString), &annotation) + if err != nil { + return annotation, fmt.Errorf("Error unmarshaling zsh argument annotation: %v", err) } - fmt.Fprintln(w, " *)") - fmt.Fprintln(w, " _arguments '*: :_files'") - fmt.Fprintln(w, " ;;") + return annotation, nil } -func writeLevel(w io.Writer, root *Command, i int) { - fmt.Fprintf(w, " case $words[%d] in\n", i) - defer fmt.Fprintln(w, " esac") - - commands := filterByLevel(root, i) - byParent := groupByParent(commands) +func (c *Command) zshCompSetArgsAnnotations(annotation zshCompArgsAnnotation) error { + jsn, err := json.Marshal(annotation) + if err != nil { + return fmt.Errorf("Error marshaling zsh argument annotation: %v", err) + } + if c.Annotations == nil { + c.Annotations = make(map[string]string) + } + c.Annotations[zshCompArgumentAnnotation] = string(jsn) + return nil +} - for p, c := range byParent { - names := names(c) - fmt.Fprintf(w, " %s)\n", p) - fmt.Fprintf(w, " _arguments '%d: :(%s)'\n", i, strings.Join(names, " ")) - fmt.Fprintln(w, " ;;") +func zshCompGenFuncName(c *Command) string { + if c.HasParent() { + return zshCompGenFuncName(c.Parent()) + "_" + c.Name() } - fmt.Fprintln(w, " *)") - fmt.Fprintln(w, " _arguments '*: :_files'") - fmt.Fprintln(w, " ;;") + return "_" + c.Name() +} +func zshCompExtractFlag(c *Command) []*pflag.Flag { + var flags []*pflag.Flag + c.LocalFlags().VisitAll(func(f *pflag.Flag) { + if !f.Hidden { + flags = append(flags, f) + } + }) + c.InheritedFlags().VisitAll(func(f *pflag.Flag) { + if !f.Hidden { + flags = append(flags, f) + } + }) + return flags } -func filterByLevel(c *Command, l int) []*Command { - cs := make([]*Command, 0) - if l == 0 { - cs = append(cs, c) - return cs +// zshCompGenFlagEntryForArguments returns an entry that matches _arguments +// zsh-completion parameters. It's too complicated to generate in a template. +func zshCompGenFlagEntryForArguments(f *pflag.Flag) string { + if f.Name == "" || f.Shorthand == "" { + return zshCompGenFlagEntryForSingleOptionFlag(f) } - for _, s := range c.Commands() { - cs = append(cs, filterByLevel(s, l-1)...) + return zshCompGenFlagEntryForMultiOptionFlag(f) +} + +func zshCompGenFlagEntryForSingleOptionFlag(f *pflag.Flag) string { + var option, multiMark, extras string + + if zshCompFlagCouldBeSpecifiedMoreThenOnce(f) { + multiMark = "*" } - return cs + + option = "--" + f.Name + if option == "--" { + option = "-" + f.Shorthand + } + extras = zshCompGenFlagEntryExtras(f) + + return fmt.Sprintf(`'%s%s[%s]%s'`, multiMark, option, zshCompQuoteFlagDescription(f.Usage), extras) } -func groupByParent(commands []*Command) map[string][]*Command { - m := make(map[string][]*Command) - for _, c := range commands { - parent := c.Parent() - if parent == nil { - continue - } - m[parent.Name()] = append(m[parent.Name()], c) +func zshCompGenFlagEntryForMultiOptionFlag(f *pflag.Flag) string { + var options, parenMultiMark, curlyMultiMark, extras string + + if zshCompFlagCouldBeSpecifiedMoreThenOnce(f) { + parenMultiMark = "*" + curlyMultiMark = "\\*" } - return m + + options = fmt.Sprintf(`'(%s-%s %s--%s)'{%s-%s,%s--%s}`, + parenMultiMark, f.Shorthand, parenMultiMark, f.Name, curlyMultiMark, f.Shorthand, curlyMultiMark, f.Name) + extras = zshCompGenFlagEntryExtras(f) + + return fmt.Sprintf(`%s'[%s]%s'`, options, zshCompQuoteFlagDescription(f.Usage), extras) } -func names(commands []*Command) []string { - ns := make([]string, len(commands)) - for i, c := range commands { - ns[i] = c.Name() +func zshCompGenFlagEntryExtras(f *pflag.Flag) string { + if f.NoOptDefVal != "" { + return "" } - return ns + + extras := ":" // allow options for flag (even without assistance) + for key, values := range f.Annotations { + switch key { + case zshCompDirname: + extras = fmt.Sprintf(":filename:_files -g %q", values[0]) + case BashCompFilenameExt: + extras = ":filename:_files" + for _, pattern := range values { + extras = extras + fmt.Sprintf(` -g "%s"`, pattern) + } + } + } + + return extras +} + +func zshCompFlagCouldBeSpecifiedMoreThenOnce(f *pflag.Flag) bool { + return strings.Contains(f.Value.Type(), "Slice") || + strings.Contains(f.Value.Type(), "Array") +} + +func zshCompQuoteFlagDescription(s string) string { + return strings.Replace(s, "'", `'\''`, -1) } diff --git a/vendor/github.com/spf13/cobra/zsh_completions.md b/vendor/github.com/spf13/cobra/zsh_completions.md new file mode 100644 index 00000000..df9c2eac --- /dev/null +++ b/vendor/github.com/spf13/cobra/zsh_completions.md @@ -0,0 +1,39 @@ +## Generating Zsh Completion for your cobra.Command + +Cobra supports native Zsh completion generated from the root `cobra.Command`. +The generated completion script should be put somewhere in your `$fpath` named +`_`. + +### What's Supported + +* Completion for all non-hidden subcommands using their `.Short` description. +* Completion for all non-hidden flags using the following rules: + * Filename completion works by marking the flag with `cmd.MarkFlagFilename...` + family of commands. + * The requirement for argument to the flag is decided by the `.NoOptDefVal` + flag value - if it's empty then completion will expect an argument. + * Flags of one of the various `*Array` and `*Slice` types supports multiple + specifications (with or without argument depending on the specific type). +* Completion of positional arguments using the following rules: + * Argument position for all options below starts at `1`. If argument position + `0` is requested it will raise an error. + * Use `command.MarkZshCompPositionalArgumentFile` to complete filenames. Glob + patterns (e.g. `"*.log"`) are optional - if not specified it will offer to + complete all file types. + * Use `command.MarkZshCompPositionalArgumentWords` to offer specific words for + completion. At least one word is required. + * It's possible to specify completion for some arguments and leave some + unspecified (e.g. offer words for second argument but nothing for first + argument). This will cause no completion for first argument but words + completion for second argument. + * If no argument completion was specified for 1st argument (but optionally was + specified for 2nd) and the command has `ValidArgs` it will be used as + completion options for 1st argument. + * Argument completions only offered for commands with no subcommands. + +### What's not yet Supported + +* Custom completion scripts are not supported yet (We should probably create zsh + specific one, doesn't make sense to re-use the bash one as the functions will + be different). +* Whatever other feature you're looking for and doesn't exist :) diff --git a/vendor/github.com/spf13/viper/go.mod b/vendor/github.com/spf13/viper/go.mod index 86e801c1..27943005 100644 --- a/vendor/github.com/spf13/viper/go.mod +++ b/vendor/github.com/spf13/viper/go.mod @@ -2,23 +2,42 @@ module github.com/spf13/viper require ( github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6 // indirect + github.com/coreos/bbolt v1.3.2 // indirect github.com/coreos/etcd v3.3.10+incompatible // indirect - github.com/coreos/go-etcd v2.0.0+incompatible // indirect github.com/coreos/go-semver v0.2.0 // indirect + github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e // indirect + github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f // indirect + github.com/dgrijalva/jwt-go v3.2.0+incompatible // indirect github.com/fsnotify/fsnotify v1.4.7 + github.com/gogo/protobuf v1.2.1 // indirect + github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef // indirect + github.com/google/btree v1.0.0 // indirect + github.com/gorilla/websocket v1.4.0 // indirect + github.com/grpc-ecosystem/go-grpc-middleware v1.0.0 // indirect + github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 // indirect + github.com/grpc-ecosystem/grpc-gateway v1.9.0 // indirect github.com/hashicorp/hcl v1.0.0 + github.com/jonboulle/clockwork v0.1.0 // indirect github.com/magiconair/properties v1.8.0 github.com/mitchellh/mapstructure v1.1.2 github.com/pelletier/go-toml v1.2.0 + github.com/prometheus/client_golang v0.9.3 // indirect + github.com/soheilhy/cmux v0.1.4 // indirect github.com/spf13/afero v1.1.2 github.com/spf13/cast v1.3.0 github.com/spf13/jwalterweatherman v1.0.0 github.com/spf13/pflag v1.0.3 github.com/stretchr/testify v1.2.2 - github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8 // indirect + github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5 // indirect + github.com/ugorji/go v1.1.4 // indirect + github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 // indirect github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77 - golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9 // indirect - golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a // indirect - golang.org/x/text v0.3.0 // indirect + go.etcd.io/bbolt v1.3.2 // indirect + go.uber.org/atomic v1.4.0 // indirect + go.uber.org/multierr v1.1.0 // indirect + go.uber.org/zap v1.10.0 // indirect + golang.org/x/net v0.0.0-20190522155817-f3200d17e092 // indirect + golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 // indirect + google.golang.org/grpc v1.21.0 // indirect gopkg.in/yaml.v2 v2.2.2 ) diff --git a/vendor/github.com/spf13/viper/go.sum b/vendor/github.com/spf13/viper/go.sum index 5c9fb7d5..97afaffe 100644 --- a/vendor/github.com/spf13/viper/go.sum +++ b/vendor/github.com/spf13/viper/go.sum @@ -1,19 +1,109 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= +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/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/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6 h1:G1bPvciwNyF7IUmKXNt9Ak3m6u9DE1rF+RmtIkBpVdA= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.0 h1:HWo1m869IqiPhD389kmkxeTalrjNbbJTC8LXupb+sl0= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/coreos/bbolt v1.3.2 h1:wZwiHHUieZCquLkDL0B8UhzreNWsPHooDAG3q34zk0s= +github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= +github.com/coreos/etcd v3.3.10+incompatible h1:jFneRYjIvLMLhDLCzuTuU4rSJUjRplcJQ7pD7MnhC04= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= +github.com/coreos/go-semver v0.2.0 h1:3Jm3tLmsgAYcjC+4Up7hJrFBPr+n7rAqYeSw/SZazuY= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e h1:Wf6HqHfScWJN9/ZjdUKyjop4mf3Qdd+1TvvltAvM3m8= +github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f h1:lBNOc5arjvs8E5mO2tbpBpLoyyu8B6e44T7hJy6potg= +github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +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/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/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/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +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/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE= +github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef h1:veQD95Isof8w9/WXiA+pa3tz3fJXkt5B7QaRBrM62gk= +github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q= +github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.0 h1:Iju5GlWwrvL6UBg4zJJt3btmonfrMlCDdsejg4CZE7c= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.9.0 h1:bM6ZAFZmc/wPFaRDi0d5L7hGEZEx/2u+Tmr2evNHDiI= +github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/jonboulle/clockwork v0.1.0 h1:VKV+ZcuP6l3yW9doeqz6ziZGgcynBVQO+obU0+0hcPo= +github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +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/magiconair/properties v1.8.0 h1:LLgXmsheXeRoUOBOjtwPQCWIYqM/LU1ayDtDePerRcY= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/pkg/errors v0.8.0 h1:WdK/asTD0HN+q6hsWO3/vpuAkAr+tw6aNJNDFFf0+qw= +github.com/pkg/errors v0.8.0/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_golang v0.9.3 h1:9iH4JKXLzFbOAdtqv/a+j8aewx2Y8lAjAydhbaScPF8= +github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90 h1:S/YWwWx/RA8rT8tKFRuGUZhuA90OyIBpPCXkcbwU8DE= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.4.0 h1:7etb9YClo3a6HjLzfl6rIQaU+FDfi0VSX39io3aQ+DM= +github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084 h1:sofwID9zm4tzrgykg80hfFph1mryUeLRsUfoocVVmRY= +github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/sirupsen/logrus v1.2.0 h1:juTguoYk5qI21pwyTXY3B3Y5cOTH3ZUyZCg1v/mihuo= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/soheilhy/cmux v0.1.4 h1:0HKaf1o97UwFjHH9o5XsHUOF+tqmdA7KEzXLpiyaw0E= +github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2 h1:m8/z1t7/fwjysjQRYbP0RD+bUIF/8tJwPdEZsI83ACI= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8= @@ -22,14 +112,67 @@ github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9 github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5 h1:LnC5Kc/wtumK+WB441p7ynQJzVuNRJiqddSIE3IlSEQ= +github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/ugorji/go v1.1.4 h1:j4s+tAvLfL3bZyefP2SEWmhBzmuIlH/eqNuPdFPgngw= +github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= +github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 h1:eY9dn8+vbi4tKz5Qo6v2eYzo7kUS51QINcR5jNpbZS8= +github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77 h1:ESFSdwYZvkeru3RtdrYueztKhOBCSAAzS4Gf+k0tEow= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a h1:1n5lsVfiQW3yfsRGu98756EH1YthsFqr/5mxHduZW2A= -golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +go.etcd.io/bbolt v1.3.2 h1:Z/90sZLPOeCy2PwprqkFa25PdkusRzaj9P8zm/KNyvk= +go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.uber.org/atomic v1.4.0 h1:cxzIVoETapQEqDhQu3QfnvXAV4AlzcvUCxkVUFw3+EU= +go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/multierr v1.1.0 h1:HoEmRHQPVSqub6w2z2d2EOVs2fjyFRGyofhKuyDq0QI= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/zap v1.10.0 h1:ORx85nbTijNz8ljznvCMR1ZBIPKFn3jQrag10X2AsuM= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +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/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190522155817-f3200d17e092 h1:4QSRKanuywn15aTZvI/mIDEgPQpswuFndXpOj3rKEco= +golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/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-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv3hCI0z56oJR5vAMgBU= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +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-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8 h1:Nw54tB0rB7hY/N0NQvRW8DG4Yk3Q6T9cu9RcFQDu1tc= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.21.0 h1:G+97AoqBnmZIT91cLG/EkCoK9NSelj64P8bOHHNmGn0= +google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= 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/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= +gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= +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= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/vendor/github.com/spf13/viper/viper.go b/vendor/github.com/spf13/viper/viper.go index 7173c6e9..a3d37f8c 100644 --- a/vendor/github.com/spf13/viper/viper.go +++ b/vendor/github.com/spf13/viper/viper.go @@ -180,10 +180,11 @@ type Viper struct { remoteProviders []*defaultRemoteProvider // Name of file to look for inside the path - configName string - configFile string - configType string - envPrefix string + configName string + configFile string + configType string + configPermissions os.FileMode + envPrefix string automaticEnvApplied bool envKeyReplacer *strings.Replacer @@ -210,6 +211,7 @@ func New() *Viper { v := new(Viper) v.keyDelim = "." v.configName = "config" + v.configPermissions = os.FileMode(0644) v.fs = afero.NewOsFs() v.config = make(map[string]interface{}) v.override = make(map[string]interface{}) @@ -687,6 +689,12 @@ func (v *Viper) Get(key string) interface{} { return cast.ToString(val) case int32, int16, int8, int: return cast.ToInt(val) + case uint: + return cast.ToUint(val) + case uint32: + return cast.ToUint32(val) + case uint64: + return cast.ToUint64(val) case int64: return cast.ToInt64(val) case float64, float32: @@ -750,6 +758,24 @@ func (v *Viper) GetInt64(key string) int64 { return cast.ToInt64(v.Get(key)) } +// GetUint returns the value associated with the key as an unsigned integer. +func GetUint(key string) uint { return v.GetUint(key) } +func (v *Viper) GetUint(key string) uint { + return cast.ToUint(v.Get(key)) +} + +// GetUint32 returns the value associated with the key as an unsigned integer. +func GetUint32(key string) uint32 { return v.GetUint32(key) } +func (v *Viper) GetUint32(key string) uint32 { + return cast.ToUint32(v.Get(key)) +} + +// GetUint64 returns the value associated with the key as an unsigned integer. +func GetUint64(key string) uint64 { return v.GetUint64(key) } +func (v *Viper) GetUint64(key string) uint64 { + return cast.ToUint64(v.Get(key)) +} + // GetFloat64 returns the value associated with the key as a float64. func GetFloat64(key string) float64 { return v.GetFloat64(key) } func (v *Viper) GetFloat64(key string) float64 { @@ -1328,7 +1354,7 @@ func (v *Viper) writeConfig(filename string, force bool) error { return fmt.Errorf("File: %s exists. Use WriteConfig to overwrite.", filename) } } - f, err := v.fs.OpenFile(filename, flags, os.FileMode(0644)) + f, err := v.fs.OpenFile(filename, flags, v.configPermissions) if err != nil { return err } @@ -1765,6 +1791,12 @@ func (v *Viper) SetConfigType(in string) { } } +// SetConfigPermissions sets the permissions for the config file. +func SetConfigPermissions(perm os.FileMode) { v.SetConfigPermissions(perm) } +func (v *Viper) SetConfigPermissions(perm os.FileMode) { + v.configPermissions = perm.Perm() +} + func (v *Viper) getConfigType() string { if v.configType != "" { return v.configType diff --git a/vendor/github.com/steakknife/bloomfilter/.travis.yml b/vendor/github.com/steakknife/bloomfilter/.travis.yml new file mode 100644 index 00000000..73d1238c --- /dev/null +++ b/vendor/github.com/steakknife/bloomfilter/.travis.yml @@ -0,0 +1,14 @@ +language: go +dist: trusty +sudo: false +go: + - "1.8.x" + - "1.9.x" + - "1.10.x" + - master +before_script: + - "go get -u gopkg.in/alecthomas/gometalinter.v2" + - "gometalinter.v2 --install" +script: + - "go test -v -cover -benchmem -bench=. $(go list ./... | grep -v /vendor/ | sed \"s&_${PWD}&.&\")" + - "gometalinter.v2 --enable-all ./..." diff --git a/vendor/github.com/steakknife/bloomfilter/MIT-LICENSE.txt b/vendor/github.com/steakknife/bloomfilter/MIT-LICENSE.txt new file mode 100644 index 00000000..ccf77fe4 --- /dev/null +++ b/vendor/github.com/steakknife/bloomfilter/MIT-LICENSE.txt @@ -0,0 +1,8 @@ +The MIT License (MIT) +Copyright © 2014, 2015 Barry Allard + +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/steakknife/bloomfilter/README.md b/vendor/github.com/steakknife/bloomfilter/README.md new file mode 100644 index 00000000..4fab4f45 --- /dev/null +++ b/vendor/github.com/steakknife/bloomfilter/README.md @@ -0,0 +1,120 @@ +**Important**: Zeroth, [consider](https://bdupras.github.io/filter-tutorial/) if a [Cuckoo filter](https://www.cs.cmu.edu/~dga/papers/cuckoo-conext2014.pdf) could be [right for your use-case](https://github.com/seiflotfy/cuckoofilter). + + +[![GoDoc](https://godoc.org/github.com/steakknife/bloomfilter?status.png)](https://godoc.org/github.com/steakknife/bloomfilter) [![travis](https://img.shields.io/travis/steakknife/bloomfilter.svg)](https://travis-ci.org/steakknife/bloomfilter) + +# Face-meltingly fast, thread-safe, marshalable, unionable, probability- and optimal-size-calculating Bloom filter in go + +Copyright © 2014-2016 Barry Allard + +[MIT license](MIT-LICENSE.txt) + +## WTF is a bloom filter + +**TL;DR: **Probabilistic, extra lookup table to track a set of elements kept elsewhere to reduce expensive, unnecessary set element retrieval and/or iterator operations **when an element is not present in the set.** It's a classic time-storage tradeoff algoritm. + +### Properties + +#### [See wikipedia](https://en.wikipedia.org/wiki/Bloom_filter) for algorithm details + +|Impact|What|Description| +|---|---|---| +|Good|No false negatives|know for certain if a given element is definitely NOT in the set| +|Bad|False positives|uncertain if a given element is in the set| +|Bad|Theoretical potential for hash collisions|in very large systems and/or badly hash.Hash64-conforming implementations| +|Bad|Add only|Cannot remove an element, it would destroy information about other elements| +|Good|Constant storage|uses only a fixed amount of memory| + +## Naming conventions + +(Similar to algorithm) + +|Variable/function|Description|Range| +|---|---|---| +|m/M()|number of bits in the bloom filter (memory representation is about m/8 bytes in size)|>=2| +|n/N()|number of elements present|>=0| +|k/K()|number of keys to use (keys are kept private to user code but are de/serialized to Marshal and file I/O)|>=0| +|maxN|maximum capacity of intended structure|>0| +|p|maximum allowed probability of collision (for computing m and k for optimal sizing)|>0..<1| + +- Memory representation should be exactly `24 + 8*(k + (m+63)/64) + unsafe.Sizeof(RWMutex)` bytes. +- Serialized (`BinaryMarshaler`) representation should be exactly `72 + 8*(k + (m+63)/64)` bytes. (Disk format is less due to compression.) + +## Binary serialization format + +All values in Little-endian format + +|Offset|Offset (Hex)|Length (bytes)|Name|Type| +|---|---|---|---|---| +|0|00|8|k|`uint64`| +|8|08|8|n|`uint64`| +|16|10|8|m|`uint64`| +|24|18|k|(keys)|`[k]uint64`| +|24+8*k|...|(m+63)/64|(bloom filter)|`[(m+63)/64]uint64`| +|24+8\*k+8\*((m+63)/64)|...|48|(SHA384 of all previous fields, hashed in order)|`[48]byte`| + +- `bloomfilter.Filter` conforms to `encoding.BinaryMarshaler` and `encoding.BinaryUnmarshaler' + +## Usage + +```go + +import "github.com/steakknife/bloomfilter" + +const ( + maxElements = 100000 + probCollide = 0.0000001 +) + +bf := bloomfilter.NewOptimal(maxElements, probCollide) + +someValue := ... // must conform to hash.Hash64 + +bf.Add(someValue) +if bf.Contains(someValue) { // probably true, could be false + // whatever +} + +anotherValue := ... // must also conform to hash.Hash64 + +if bf.Contains(anotherValue) { + panic("This should never happen") +} + +err := bf.WriteFile("1.bf.gz") // saves this BF to a file +if err != nil { + panic(err) +} + +bf2, err := bloomfilter.ReadFile("1.bf.gz") // read the BF to another var +if err != nil { + panic(err) +} +``` + + +## Design + +Where possible, branch-free operations are used to avoid deep pipeline / execution unit stalls on branch-misses. + +## Get + + go get -u github.com/steakknife/bloomfilter # master is always stable + +## Source + +- On the web: [https://github.com/steakknife/bloomfilter](https://github.com/steakknife/bloomfilter) + +- Git: `git clone https://github.com/steakknife/bloomfilter` + +## Contact + +- [Feedback](mailto:barry.allard@gmail.com) + +- [Issues](https://github.com/steakknife/bloomfilter/issues) + +## License + +[MIT license](MIT-LICENSE.txt) + +Copyright © 2014-2016 Barry Allard diff --git a/vendor/github.com/steakknife/bloomfilter/binarymarshaler.go b/vendor/github.com/steakknife/bloomfilter/binarymarshaler.go new file mode 100644 index 00000000..2fa66925 --- /dev/null +++ b/vendor/github.com/steakknife/bloomfilter/binarymarshaler.go @@ -0,0 +1,87 @@ +// Package bloomfilter is face-meltingly fast, thread-safe, +// marshalable, unionable, probability- and +// optimal-size-calculating Bloom filter in go +// +// https://github.com/steakknife/bloomfilter +// +// Copyright © 2014, 2015, 2018 Barry Allard +// +// MIT license +// +package bloomfilter + +import ( + "bytes" + "crypto/sha512" + "encoding/binary" +) + +// conforms to encoding.BinaryMarshaler + +// marshalled binary layout (Little Endian): +// +// k 1 uint64 +// n 1 uint64 +// m 1 uint64 +// keys [k]uint64 +// bits [(m+63)/64]uint64 +// hash sha384 (384 bits == 48 bytes) +// +// size = (3 + k + (m+63)/64) * 8 bytes +// + +func (f *Filter) marshal() (buf *bytes.Buffer, + hash [sha512.Size384]byte, + err error, +) { + f.lock.RLock() + defer f.lock.RUnlock() + + debug("write bf k=%d n=%d m=%d\n", f.K(), f.n, f.m) + + buf = new(bytes.Buffer) + + err = binary.Write(buf, binary.LittleEndian, f.K()) + if err != nil { + return nil, hash, err + } + + err = binary.Write(buf, binary.LittleEndian, f.n) + if err != nil { + return nil, hash, err + } + + err = binary.Write(buf, binary.LittleEndian, f.m) + if err != nil { + return nil, hash, err + } + + err = binary.Write(buf, binary.LittleEndian, f.keys) + if err != nil { + return nil, hash, err + } + + err = binary.Write(buf, binary.LittleEndian, f.bits) + if err != nil { + return nil, hash, err + } + + hash = sha512.Sum384(buf.Bytes()) + err = binary.Write(buf, binary.LittleEndian, hash) + return buf, hash, err +} + +// MarshalBinary converts a Filter into []bytes +func (f *Filter) MarshalBinary() (data []byte, err error) { + buf, hash, err := f.marshal() + if err != nil { + return nil, err + } + + debug( + "bloomfilter.MarshalBinary: Successfully wrote %d byte(s), sha384 %v", + buf.Len(), hash, + ) + data = buf.Bytes() + return data, nil +} diff --git a/vendor/github.com/steakknife/bloomfilter/binaryunmarshaler.go b/vendor/github.com/steakknife/bloomfilter/binaryunmarshaler.go new file mode 100644 index 00000000..5be1670c --- /dev/null +++ b/vendor/github.com/steakknife/bloomfilter/binaryunmarshaler.go @@ -0,0 +1,111 @@ +// Package bloomfilter is face-meltingly fast, thread-safe, +// marshalable, unionable, probability- and +// optimal-size-calculating Bloom filter in go +// +// https://github.com/steakknife/bloomfilter +// +// Copyright © 2014, 2015, 2018 Barry Allard +// +// MIT license +// +package bloomfilter + +import ( + "bytes" + "crypto/hmac" + "crypto/sha512" + "encoding/binary" + "io" +) + +func unmarshalBinaryHeader(r io.Reader) (k, n, m uint64, err error) { + err = binary.Read(r, binary.LittleEndian, &k) + if err != nil { + return k, n, m, err + } + + if k < KMin { + return k, n, m, errK() + } + + err = binary.Read(r, binary.LittleEndian, &n) + if err != nil { + return k, n, m, err + } + + err = binary.Read(r, binary.LittleEndian, &m) + if err != nil { + return k, n, m, err + } + + if m < MMin { + return k, n, m, errM() + } + + debug("read bf k=%d n=%d m=%d\n", k, n, m) + + return k, n, m, err +} + +func unmarshalBinaryBits(r io.Reader, m uint64) (bits []uint64, err error) { + bits, err = newBits(m) + if err != nil { + return bits, err + } + err = binary.Read(r, binary.LittleEndian, bits) + return bits, err + +} + +func unmarshalBinaryKeys(r io.Reader, k uint64) (keys []uint64, err error) { + keys = make([]uint64, k) + err = binary.Read(r, binary.LittleEndian, keys) + return keys, err +} + +func checkBinaryHash(r io.Reader, data []byte) (err error) { + expectedHash := make([]byte, sha512.Size384) + err = binary.Read(r, binary.LittleEndian, expectedHash) + if err != nil { + return err + } + + actualHash := sha512.Sum384(data[:len(data)-sha512.Size384]) + + if !hmac.Equal(expectedHash, actualHash[:]) { + debug("bloomfilter.UnmarshalBinary() sha384 hash failed:"+ + " actual %v expected %v", actualHash, expectedHash) + return errHash() + } + + debug("bloomfilter.UnmarshalBinary() successfully read"+ + " %d byte(s), sha384 %v", len(data), actualHash) + return nil +} + +// UnmarshalBinary converts []bytes into a Filter +// conforms to encoding.BinaryUnmarshaler +func (f *Filter) UnmarshalBinary(data []byte) (err error) { + f.lock.Lock() + defer f.lock.Unlock() + + buf := bytes.NewBuffer(data) + + var k uint64 + k, f.n, f.m, err = unmarshalBinaryHeader(buf) + if err != nil { + return err + } + + f.keys, err = unmarshalBinaryKeys(buf, k) + if err != nil { + return err + } + + f.bits, err = unmarshalBinaryBits(buf, f.m) + if err != nil { + return err + } + + return checkBinaryHash(buf, data) +} diff --git a/vendor/github.com/steakknife/bloomfilter/bloomfilter.go b/vendor/github.com/steakknife/bloomfilter/bloomfilter.go new file mode 100644 index 00000000..82250636 --- /dev/null +++ b/vendor/github.com/steakknife/bloomfilter/bloomfilter.go @@ -0,0 +1,123 @@ +// Package bloomfilter is face-meltingly fast, thread-safe, +// marshalable, unionable, probability- and +// optimal-size-calculating Bloom filter in go +// +// https://github.com/steakknife/bloomfilter +// +// Copyright © 2014, 2015, 2018 Barry Allard +// +// MIT license +// +package bloomfilter + +import ( + "hash" + "sync" +) + +// Filter is an opaque Bloom filter type +type Filter struct { + lock sync.RWMutex + bits []uint64 + keys []uint64 + m uint64 // number of bits the "bits" field should recognize + n uint64 // number of inserted elements +} + +// Hashable -> hashes +func (f *Filter) hash(v hash.Hash64) []uint64 { + rawHash := v.Sum64() + n := len(f.keys) + hashes := make([]uint64, n) + for i := 0; i < n; i++ { + hashes[i] = rawHash ^ f.keys[i] + } + return hashes +} + +// M is the size of Bloom filter, in bits +func (f *Filter) M() uint64 { + return f.m +} + +// K is the count of keys +func (f *Filter) K() uint64 { + return uint64(len(f.keys)) +} + +// Add a hashable item, v, to the filter +func (f *Filter) Add(v hash.Hash64) { + f.lock.Lock() + defer f.lock.Unlock() + + for _, i := range f.hash(v) { + // f.setBit(i) + i %= f.m + f.bits[i>>6] |= 1 << uint(i&0x3f) + } + f.n++ +} + +// Contains tests if f contains v +// false: f definitely does not contain value v +// true: f maybe contains value v +func (f *Filter) Contains(v hash.Hash64) bool { + f.lock.RLock() + defer f.lock.RUnlock() + + r := uint64(1) + for _, i := range f.hash(v) { + // r |= f.getBit(k) + i %= f.m + r &= (f.bits[i>>6] >> uint(i&0x3f)) & 1 + } + return uint64ToBool(r) +} + +// Copy f to a new Bloom filter +func (f *Filter) Copy() (*Filter, error) { + f.lock.RLock() + defer f.lock.RUnlock() + + out, err := f.NewCompatible() + if err != nil { + return nil, err + } + copy(out.bits, f.bits) + out.n = f.n + return out, nil +} + +// UnionInPlace merges Bloom filter f2 into f +func (f *Filter) UnionInPlace(f2 *Filter) error { + if !f.IsCompatible(f2) { + return errIncompatibleBloomFilters() + } + + f.lock.Lock() + defer f.lock.Unlock() + + for i, bitword := range f2.bits { + f.bits[i] |= bitword + } + return nil +} + +// Union merges f2 and f2 into a new Filter out +func (f *Filter) Union(f2 *Filter) (out *Filter, err error) { + if !f.IsCompatible(f2) { + return nil, errIncompatibleBloomFilters() + } + + f.lock.RLock() + defer f.lock.RUnlock() + + out, err = f.NewCompatible() + if err != nil { + return nil, err + } + for i, bitword := range f2.bits { + out.bits[i] = f.bits[i] | bitword + } + return out, nil +} diff --git a/vendor/github.com/steakknife/bloomfilter/conformance.go b/vendor/github.com/steakknife/bloomfilter/conformance.go new file mode 100644 index 00000000..2963686f --- /dev/null +++ b/vendor/github.com/steakknife/bloomfilter/conformance.go @@ -0,0 +1,29 @@ +// Package bloomfilter is face-meltingly fast, thread-safe, +// marshalable, unionable, probability- and +// optimal-size-calculating Bloom filter in go +// +// https://github.com/steakknife/bloomfilter +// +// Copyright © 2014, 2015, 2018 Barry Allard +// +// MIT license +// +package bloomfilter + +import ( + "encoding" + "encoding/gob" + "io" +) + +// compile-time conformance tests +var ( + _ encoding.BinaryMarshaler = (*Filter)(nil) + _ encoding.BinaryUnmarshaler = (*Filter)(nil) + _ encoding.TextMarshaler = (*Filter)(nil) + _ encoding.TextUnmarshaler = (*Filter)(nil) + _ io.ReaderFrom = (*Filter)(nil) + _ io.WriterTo = (*Filter)(nil) + _ gob.GobDecoder = (*Filter)(nil) + _ gob.GobEncoder = (*Filter)(nil) +) diff --git a/vendor/github.com/steakknife/bloomfilter/debug.go b/vendor/github.com/steakknife/bloomfilter/debug.go new file mode 100644 index 00000000..e88b934c --- /dev/null +++ b/vendor/github.com/steakknife/bloomfilter/debug.go @@ -0,0 +1,37 @@ +// Package bloomfilter is face-meltingly fast, thread-safe, +// marshalable, unionable, probability- and +// optimal-size-calculating Bloom filter in go +// +// https://github.com/steakknife/bloomfilter +// +// Copyright © 2014, 2015, 2018 Barry Allard +// +// MIT license +// +package bloomfilter + +import ( + "log" + "os" +) + +const debugVar = "GOLANG_STEAKKNIFE_BLOOMFILTER_DEBUG" + +// EnableDebugging permits debug() logging of details to stderr +func EnableDebugging() { + err := os.Setenv(debugVar, "1") + if err != nil { + panic("Unable to Setenv " + debugVar) + } +} + +func debugging() bool { + return os.Getenv(debugVar) != "" +} + +// debug printing when debugging() is true +func debug(format string, a ...interface{}) { + if debugging() { + log.Printf(format, a...) + } +} diff --git a/vendor/github.com/steakknife/bloomfilter/errors.go b/vendor/github.com/steakknife/bloomfilter/errors.go new file mode 100644 index 00000000..b279739b --- /dev/null +++ b/vendor/github.com/steakknife/bloomfilter/errors.go @@ -0,0 +1,34 @@ +// Package bloomfilter is face-meltingly fast, thread-safe, +// marshalable, unionable, probability- and +// optimal-size-calculating Bloom filter in go +// +// https://github.com/steakknife/bloomfilter +// +// Copyright © 2014, 2015, 2018 Barry Allard +// +// MIT license +// +package bloomfilter + +import "fmt" + +func errHash() error { + return fmt.Errorf( + "Hash mismatch, the Bloom filter is probably corrupt") +} +func errK() error { + return fmt.Errorf( + "keys must have length %d or greater", KMin) +} +func errM() error { + return fmt.Errorf( + "m (number of bits in the Bloom filter) must be >= %d", MMin) +} +func errUniqueKeys() error { + return fmt.Errorf( + "Bloom filter keys must be unique") +} +func errIncompatibleBloomFilters() error { + return fmt.Errorf( + "Cannot perform union on two incompatible Bloom filters") +} diff --git a/vendor/github.com/steakknife/bloomfilter/fileio.go b/vendor/github.com/steakknife/bloomfilter/fileio.go new file mode 100644 index 00000000..a4796995 --- /dev/null +++ b/vendor/github.com/steakknife/bloomfilter/fileio.go @@ -0,0 +1,105 @@ +// Package bloomfilter is face-meltingly fast, thread-safe, +// marshalable, unionable, probability- and +// optimal-size-calculating Bloom filter in go +// +// https://github.com/steakknife/bloomfilter +// +// Copyright © 2014, 2015, 2018 Barry Allard +// +// MIT license +// +package bloomfilter + +import ( + "compress/gzip" + "io" + "io/ioutil" + "os" +) + +// ReadFrom r and overwrite f with new Bloom filter data +func (f *Filter) ReadFrom(r io.Reader) (n int64, err error) { + f2, n, err := ReadFrom(r) + if err != nil { + return -1, err + } + f.lock.Lock() + defer f.lock.Unlock() + f.m = f2.m + f.n = f2.n + f.bits = f2.bits + f.keys = f2.keys + return n, nil +} + +// ReadFrom Reader r into a lossless-compressed Bloom filter f +func ReadFrom(r io.Reader) (f *Filter, n int64, err error) { + rawR, err := gzip.NewReader(r) + if err != nil { + return nil, -1, err + } + defer func() { + err = rawR.Close() + }() + + content, err := ioutil.ReadAll(rawR) + if err != nil { + return nil, -1, err + } + + f = new(Filter) + n = int64(len(content)) + err = f.UnmarshalBinary(content) + if err != nil { + return nil, -1, err + } + return f, n, nil +} + +// ReadFile from filename into a lossless-compressed Bloom Filter f +// Suggested file extension: .bf.gz +func ReadFile(filename string) (f *Filter, n int64, err error) { + r, err := os.Open(filename) + if err != nil { + return nil, -1, err + } + defer func() { + err = r.Close() + }() + + return ReadFrom(r) +} + +// WriteTo a Writer w from lossless-compressed Bloom Filter f +func (f *Filter) WriteTo(w io.Writer) (n int64, err error) { + f.lock.RLock() + defer f.lock.RUnlock() + + rawW := gzip.NewWriter(w) + defer func() { + err = rawW.Close() + }() + + content, err := f.MarshalBinary() + if err != nil { + return -1, err + } + + intN, err := rawW.Write(content) + n = int64(intN) + return n, err +} + +// WriteFile filename from a a lossless-compressed Bloom Filter f +// Suggested file extension: .bf.gz +func (f *Filter) WriteFile(filename string) (n int64, err error) { + w, err := os.Create(filename) + if err != nil { + return -1, err + } + defer func() { + err = w.Close() + }() + + return f.WriteTo(w) +} diff --git a/vendor/github.com/steakknife/bloomfilter/gob.go b/vendor/github.com/steakknife/bloomfilter/gob.go new file mode 100644 index 00000000..0d99e55d --- /dev/null +++ b/vendor/github.com/steakknife/bloomfilter/gob.go @@ -0,0 +1,23 @@ +// Package bloomfilter is face-meltingly fast, thread-safe, +// marshalable, unionable, probability- and +// optimal-size-calculating Bloom filter in go +// +// https://github.com/steakknife/bloomfilter +// +// Copyright © 2014, 2015, 2018 Barry Allard +// +// MIT license +// +package bloomfilter + +import _ "encoding/gob" // make sure gob is available + +// GobDecode conforms to interface gob.GobDecoder +func (f *Filter) GobDecode(data []byte) error { + return f.UnmarshalBinary(data) +} + +// GobEncode conforms to interface gob.GobEncoder +func (f *Filter) GobEncode() ([]byte, error) { + return f.MarshalBinary() +} diff --git a/vendor/github.com/steakknife/bloomfilter/iscompatible.go b/vendor/github.com/steakknife/bloomfilter/iscompatible.go new file mode 100644 index 00000000..2073d808 --- /dev/null +++ b/vendor/github.com/steakknife/bloomfilter/iscompatible.go @@ -0,0 +1,41 @@ +// Package bloomfilter is face-meltingly fast, thread-safe, +// marshalable, unionable, probability- and +// optimal-size-calculating Bloom filter in go +// +// https://github.com/steakknife/bloomfilter +// +// Copyright © 2014, 2015, 2018 Barry Allard +// +// MIT license +// +package bloomfilter + +import "unsafe" + +func uint64ToBool(x uint64) bool { + return *(*bool)(unsafe.Pointer(&x)) // #nosec +} + +// returns 0 if equal, does not compare len(b0) with len(b1) +func noBranchCompareUint64s(b0, b1 []uint64) uint64 { + r := uint64(0) + for i, b0i := range b0 { + r |= b0i ^ b1[i] + } + return r +} + +// IsCompatible is true if f and f2 can be Union()ed together +func (f *Filter) IsCompatible(f2 *Filter) bool { + f.lock.RLock() + defer f.lock.RUnlock() + + f.lock.RLock() + defer f2.lock.RUnlock() + + // 0 is true, non-0 is false + compat := f.M() ^ f2.M() + compat |= f.K() ^ f2.K() + compat |= noBranchCompareUint64s(f.keys, f2.keys) + return uint64ToBool(^compat) +} diff --git a/vendor/github.com/steakknife/bloomfilter/new.go b/vendor/github.com/steakknife/bloomfilter/new.go new file mode 100644 index 00000000..bf4323a7 --- /dev/null +++ b/vendor/github.com/steakknife/bloomfilter/new.go @@ -0,0 +1,134 @@ +// Package bloomfilter is face-meltingly fast, thread-safe, +// marshalable, unionable, probability- and +// optimal-size-calculating Bloom filter in go +// +// https://github.com/steakknife/bloomfilter +// +// Copyright © 2014, 2015, 2018 Barry Allard +// +// MIT license +// +package bloomfilter + +import ( + "crypto/rand" + "encoding/binary" + "log" +) + +const ( + // MMin is the minimum Bloom filter bits count + MMin = 2 + // KMin is the minimum number of keys + KMin = 1 + // Uint64Bytes is the number of bytes in type uint64 + Uint64Bytes = 8 +) + +// New Filter with CSPRNG keys +// +// m is the size of the Bloom filter, in bits, >= 2 +// +// k is the number of random keys, >= 1 +func New(m, k uint64) (*Filter, error) { + return NewWithKeys(m, newRandKeys(k)) +} + +func newRandKeys(k uint64) []uint64 { + keys := make([]uint64, k) + err := binary.Read(rand.Reader, binary.LittleEndian, keys) + if err != nil { + log.Panicf( + "Cannot read %d bytes from CSRPNG crypto/rand.Read (err=%v)", + Uint64Bytes, err, + ) + } + return keys +} + +// NewCompatible Filter compatible with f +func (f *Filter) NewCompatible() (*Filter, error) { + return NewWithKeys(f.m, f.keys) +} + +// NewOptimal Bloom filter with random CSPRNG keys +func NewOptimal(maxN uint64, p float64) (*Filter, error) { + m := OptimalM(maxN, p) + k := OptimalK(m, maxN) + debug("New optimal bloom filter ::"+ + " requested max elements (n):%d,"+ + " probability of collision (p):%1.10f "+ + "-> recommends -> bits (m): %d (%f GiB), "+ + "number of keys (k): %d", + maxN, p, m, float64(m)/(gigabitsPerGiB), k) + return New(m, k) +} + +// UniqueKeys is true if all keys are unique +func UniqueKeys(keys []uint64) bool { + for j := 0; j < len(keys)-1; j++ { + elem := keys[j] + for i := 1; i < j; i++ { + if keys[i] == elem { + return false + } + } + } + return true +} + +// NewWithKeys creates a new Filter from user-supplied origKeys +func NewWithKeys(m uint64, origKeys []uint64) (f *Filter, err error) { + bits, err := newBits(m) + if err != nil { + return nil, err + } + keys, err := newKeysCopy(origKeys) + if err != nil { + return nil, err + } + return &Filter{ + m: m, + n: 0, + bits: bits, + keys: keys, + }, nil +} + +func newBits(m uint64) ([]uint64, error) { + if m < MMin { + return nil, errM() + } + return make([]uint64, (m+63)/64), nil +} + +func newKeysBlank(k uint64) ([]uint64, error) { + if k < KMin { + return nil, errK() + } + return make([]uint64, k), nil +} + +func newKeysCopy(origKeys []uint64) (keys []uint64, err error) { + if !UniqueKeys(origKeys) { + return nil, errUniqueKeys() + } + keys, err = newKeysBlank(uint64(len(origKeys))) + if err != nil { + return keys, err + } + copy(keys, origKeys) + return keys, err +} + +func newWithKeysAndBits(m uint64, keys []uint64, bits []uint64, n uint64) ( + f *Filter, err error, +) { + f, err = NewWithKeys(m, keys) + if err != nil { + return nil, err + } + copy(f.bits, bits) + f.n = n + return f, nil +} diff --git a/vendor/github.com/steakknife/bloomfilter/optimal.go b/vendor/github.com/steakknife/bloomfilter/optimal.go new file mode 100644 index 00000000..6e5257eb --- /dev/null +++ b/vendor/github.com/steakknife/bloomfilter/optimal.go @@ -0,0 +1,28 @@ +// Package bloomfilter is face-meltingly fast, thread-safe, +// marshalable, unionable, probability- and +// optimal-size-calculating Bloom filter in go +// +// https://github.com/steakknife/bloomfilter +// +// Copyright © 2014, 2015, 2018 Barry Allard +// +// MIT license +// +package bloomfilter + +import "math" + +const gigabitsPerGiB float64 = 8.0 * 1024 * 1024 * 1024 + +// OptimalK calculates the optimal k value for creating a new Bloom filter +// maxn is the maximum anticipated number of elements +func OptimalK(m, maxN uint64) uint64 { + return uint64(math.Ceil(float64(m) * math.Ln2 / float64(maxN))) +} + +// OptimalM calculates the optimal m value for creating a new Bloom filter +// p is the desired false positive probability +// optimal m = ceiling( - n * ln(p) / ln(2)**2 ) +func OptimalM(maxN uint64, p float64) uint64 { + return uint64(math.Ceil(-float64(maxN) * math.Log(p) / math.Ln2 * math.Ln2)) +} diff --git a/vendor/github.com/steakknife/bloomfilter/statistics.go b/vendor/github.com/steakknife/bloomfilter/statistics.go new file mode 100644 index 00000000..fe50ffa5 --- /dev/null +++ b/vendor/github.com/steakknife/bloomfilter/statistics.go @@ -0,0 +1,43 @@ +// Package bloomfilter is face-meltingly fast, thread-safe, +// marshalable, unionable, probability- and +// optimal-size-calculating Bloom filter in go +// +// https://github.com/steakknife/bloomfilter +// +// Copyright © 2014, 2015, 2018 Barry Allard +// +// MIT license +// +package bloomfilter + +import ( + "math" + + "github.com/steakknife/hamming" +) + +// PreciseFilledRatio is an exhaustive count # of 1's +func (f *Filter) PreciseFilledRatio() float64 { + f.lock.RLock() + defer f.lock.RUnlock() + + return float64(hamming.CountBitsUint64s(f.bits)) / float64(f.M()) +} + +// N is how many elements have been inserted +// (actually, how many Add()s have been performed?) +func (f *Filter) N() uint64 { + f.lock.RLock() + defer f.lock.RUnlock() + + return f.n +} + +// FalsePosititveProbability is the upper-bound probability of false positives +// (1 - exp(-k*(n+0.5)/(m-1))) ** k +func (f *Filter) FalsePosititveProbability() float64 { + k := float64(f.K()) + n := float64(f.N()) + m := float64(f.M()) + return math.Pow(1.0-math.Exp(-k)*(n+0.5)/(m-1), k) +} diff --git a/vendor/github.com/steakknife/bloomfilter/textmarshaler.go b/vendor/github.com/steakknife/bloomfilter/textmarshaler.go new file mode 100644 index 00000000..7ed08eb7 --- /dev/null +++ b/vendor/github.com/steakknife/bloomfilter/textmarshaler.go @@ -0,0 +1,49 @@ +// Package bloomfilter is face-meltingly fast, thread-safe, +// marshalable, unionable, probability- and +// optimal-size-calculating Bloom filter in go +// +// https://github.com/steakknife/bloomfilter +// +// Copyright © 2014, 2015, 2018 Barry Allard +// +// MIT license +// +package bloomfilter + +import "fmt" + +// MarshalText conforms to encoding.TextMarshaler +func (f *Filter) MarshalText() (text []byte, err error) { + f.lock.RLock() + defer f.lock.RUnlock() + + s := fmt.Sprintln("k") + s += fmt.Sprintln(f.K()) + s += fmt.Sprintln("n") + s += fmt.Sprintln(f.n) + s += fmt.Sprintln("m") + s += fmt.Sprintln(f.m) + + s += fmt.Sprintln("keys") + for key := range f.keys { + s += fmt.Sprintf(keyFormat, key) + nl() + } + + s += fmt.Sprintln("bits") + for w := range f.bits { + s += fmt.Sprintf(bitsFormat, w) + nl() + } + + _, hash, err := f.marshal() + if err != nil { + return nil, err + } + s += fmt.Sprintln("sha384") + for b := range hash { + s += fmt.Sprintf("%02x", b) + } + s += nl() + + text = []byte(s) + return text, nil +} diff --git a/vendor/github.com/steakknife/bloomfilter/textunmarshaler.go b/vendor/github.com/steakknife/bloomfilter/textunmarshaler.go new file mode 100644 index 00000000..93240a1a --- /dev/null +++ b/vendor/github.com/steakknife/bloomfilter/textunmarshaler.go @@ -0,0 +1,150 @@ +// Package bloomfilter is face-meltingly fast, thread-safe, +// marshalable, unionable, probability- and +// optimal-size-calculating Bloom filter in go +// +// https://github.com/steakknife/bloomfilter +// +// Copyright © 2014, 2015, 2018 Barry Allard +// +// MIT license +// +package bloomfilter + +import ( + "bytes" + "crypto/hmac" + "crypto/sha512" + "fmt" + "io" +) + +const ( + keyFormat = "%016x" + bitsFormat = "%016x" +) + +func nl() string { + return fmt.Sprintln() +} + +func unmarshalTextHeader(r io.Reader) (k, n, m uint64, err error) { + format := "k" + nl() + "%d" + nl() + format += "n" + nl() + "%d" + nl() + format += "m" + nl() + "%d" + nl() + format += "keys" + nl() + + _, err = fmt.Fscanf(r, format, k, n, m) + return k, n, m, err +} + +func unmarshalTextKeys(r io.Reader, keys []uint64) (err error) { + for i := range keys { + _, err = fmt.Fscanf(r, keyFormat, keys[i]) + if err != nil { + return err + } + } + return nil +} + +func unmarshalTextBits(r io.Reader, bits []uint64) (err error) { + _, err = fmt.Fscanf(r, "bits") + if err != nil { + return err + } + + for i := range bits { + _, err = fmt.Fscanf(r, bitsFormat, bits[i]) + if err != nil { + return err + } + } + + return nil +} + +func unmarshalAndCheckTextHash(r io.Reader, f *Filter) (err error) { + _, err = fmt.Fscanf(r, "sha384") + if err != nil { + return err + } + + actualHash := [sha512.Size384]byte{} + + for i := range actualHash { + _, err = fmt.Fscanf(r, "%02x", actualHash[i]) + if err != nil { + return err + } + } + + _, expectedHash, err := f.marshal() + if err != nil { + return err + } + + if !hmac.Equal(expectedHash[:], actualHash[:]) { + return errHash() + } + + return nil +} + +// UnmarshalText conforms to TextUnmarshaler +func UnmarshalText(text []byte) (f *Filter, err error) { + r := bytes.NewBuffer(text) + k, n, m, err := unmarshalTextHeader(r) + if err != nil { + return nil, err + } + + keys, err := newKeysBlank(k) + if err != nil { + return nil, err + } + + err = unmarshalTextKeys(r, keys) + if err != nil { + return nil, err + } + + bits, err := newBits(m) + if err != nil { + return nil, err + } + + err = unmarshalTextBits(r, bits) + if err != nil { + return nil, err + } + + f, err = newWithKeysAndBits(m, keys, bits, n) + if err != nil { + return nil, err + } + + err = unmarshalAndCheckTextHash(r, f) + if err != nil { + return nil, err + } + + return f, nil +} + +// UnmarshalText method overwrites f with data decoded from text +func (f *Filter) UnmarshalText(text []byte) error { + f.lock.Lock() + defer f.lock.Unlock() + + f2, err := UnmarshalText(text) + if err != nil { + return err + } + + f.m = f2.m + f.n = f2.n + copy(f.bits, f2.bits) + copy(f.keys, f2.keys) + + return nil +} diff --git a/vendor/github.com/steakknife/hamming/.gitignore b/vendor/github.com/steakknife/hamming/.gitignore new file mode 100644 index 00000000..928a2c6d --- /dev/null +++ b/vendor/github.com/steakknife/hamming/.gitignore @@ -0,0 +1,2 @@ +*.o +/coverage.out diff --git a/vendor/github.com/steakknife/hamming/.travis.yml b/vendor/github.com/steakknife/hamming/.travis.yml new file mode 100644 index 00000000..73812128 --- /dev/null +++ b/vendor/github.com/steakknife/hamming/.travis.yml @@ -0,0 +1,14 @@ +language: go +dist: trusty +sudo: false +go: + - "1.8.x" + - "1.9.x" + - "1.10.x" + - master +before_script: + - "go get -u gopkg.in/alecthomas/gometalinter.v2" + - "gometalinter.v2 --install" +script: + - "go test -v -cover -benchmem -bench=. $(go list ./... | grep -v /vendor/ | sed \"s&_${PWD}&.&\")" + - "gometalinter.v2 --enable-all --exclude=dupl ./..." diff --git a/vendor/github.com/steakknife/hamming/MIT-LICENSE.txt b/vendor/github.com/steakknife/hamming/MIT-LICENSE.txt new file mode 100644 index 00000000..924f4c09 --- /dev/null +++ b/vendor/github.com/steakknife/hamming/MIT-LICENSE.txt @@ -0,0 +1,8 @@ +The MIT License (MIT) +Copyright © 2014, 2015, 2016 Barry Allard + +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/steakknife/hamming/README.md b/vendor/github.com/steakknife/hamming/README.md new file mode 100644 index 00000000..3f0af784 --- /dev/null +++ b/vendor/github.com/steakknife/hamming/README.md @@ -0,0 +1,82 @@ +[![GoDoc](https://godoc.org/github.com/steakknife/hamming?status.png)](https://godoc.org/github.com/steakknife/hamming) [![Build Status](https://travis-ci.org/steakknife/hamming.svg?branch=master)](https://travis-ci.org/steakknife/hamming) + + +# hamming distance calculations in Go + +Copyright © 2014, 2015, 2016 Barry Allard + +[MIT license](MIT-LICENSE.txt) + +## Performance + +``` +$ go test -bench=. +BenchmarkCountBitsInt8PopCnt-4 300000000 4.30 ns/op +BenchmarkCountBitsInt16PopCnt-4 300000000 3.83 ns/op +BenchmarkCountBitsInt32PopCnt-4 300000000 3.64 ns/op +BenchmarkCountBitsInt64PopCnt-4 500000000 3.60 ns/op +BenchmarkCountBitsIntPopCnt-4 300000000 5.72 ns/op +BenchmarkCountBitsUint8PopCnt-4 1000000000 2.98 ns/op +BenchmarkCountBitsUint16PopCnt-4 500000000 3.23 ns/op +BenchmarkCountBitsUint32PopCnt-4 500000000 3.00 ns/op +BenchmarkCountBitsUint64PopCnt-4 1000000000 2.94 ns/op +BenchmarkCountBitsUintPopCnt-4 300000000 5.04 ns/op +BenchmarkCountBitsBytePopCnt-4 300000000 3.99 ns/op +BenchmarkCountBitsRunePopCnt-4 300000000 3.83 ns/op +BenchmarkCountBitsInt8-4 2000000000 0.74 ns/op +BenchmarkCountBitsInt16-4 2000000000 1.54 ns/op +BenchmarkCountBitsInt32-4 1000000000 2.63 ns/op +BenchmarkCountBitsInt64-4 1000000000 2.56 ns/op +BenchmarkCountBitsInt-4 200000000 7.23 ns/op +BenchmarkCountBitsUint16-4 2000000000 1.51 ns/op +BenchmarkCountBitsUint32-4 500000000 4.00 ns/op +BenchmarkCountBitsUint64-4 1000000000 2.64 ns/op +BenchmarkCountBitsUint64Alt-4 200000000 7.60 ns/op +BenchmarkCountBitsUint-4 300000000 5.48 ns/op +BenchmarkCountBitsUintReference-4 100000000 19.2 ns/op +BenchmarkCountBitsByte-4 2000000000 0.75 ns/op +BenchmarkCountBitsByteAlt-4 1000000000 2.37 ns/op +BenchmarkCountBitsRune-4 500000000 2.85 ns/op +PASS +ok _/Users/bmf/Projects/hamming 58.305s +$ +``` + +## Usage + +```go +import 'github.com/steakknife/hamming' + +// ... + +// hamming distance between values +hamming.Byte(0xFF, 0x00) // 8 +hamming.Byte(0x00, 0x00) // 0 + +// just count bits in a byte +hamming.CountBitsByte(0xA5), // 4 +``` + +See help in the [docs](https://godoc.org/github.com/steakknife/hamming) + +## Get + + go get -u github.com/steakknife/hamming # master is always stable + +## Source + +- On the web: https://github.com/steakknife/hamming + +- Git: `git clone https://github.com/steakknife/hamming` + +## Contact + +- [Feedback](mailto:barry.allard@gmail.com) + +- [Issues](https://github.com/steakknife/hamming/issues) + +## License + +[MIT license](MIT-LICENSE.txt) + +Copyright © 2014, 2015, 2016 Barry Allard diff --git a/vendor/github.com/steakknife/hamming/doc.go b/vendor/github.com/steakknife/hamming/doc.go new file mode 100644 index 00000000..179e29da --- /dev/null +++ b/vendor/github.com/steakknife/hamming/doc.go @@ -0,0 +1,35 @@ +// +// Package hamming distance calculations in Go +// +// https://github.com/steakknife/hamming +// +// Copyright © 2014, 2015, 2016, 2018 Barry Allard +// +// MIT license +// +// +// Usage +// +// For functions named CountBits.+s?. The plural forms are for slices. +// The CountBits.+ forms are Population Count only, where the bare-type +// forms are Hamming distance (number of bits different) between two values. +// +// Optimized assembly .+PopCnt forms are available on amd64, and operate just +// like the regular forms (Must check and guard on HasPopCnt() first before +// trying to call .+PopCnt functions). +// +// import 'github.com/steakknife/hamming' +// +// // ... +// +// // hamming distance between values +// hamming.Byte(0xFF, 0x00) // 8 +// hamming.Byte(0x00, 0x00) // 0 +// +// // just count bits in a byte +// hamming.CountBitsByte(0xA5), // 4 +// +// Got rune? use int32 +// Got uint8? use byte +// +package hamming diff --git a/vendor/github.com/steakknife/hamming/hamming.go b/vendor/github.com/steakknife/hamming/hamming.go new file mode 100644 index 00000000..269e91a4 --- /dev/null +++ b/vendor/github.com/steakknife/hamming/hamming.go @@ -0,0 +1,70 @@ +// +// Package hamming distance calculations in Go +// +// https://github.com/steakknife/hamming +// +// Copyright © 2014, 2015, 2016, 2018 Barry Allard +// +// MIT license +// +package hamming + +// Int8 hamming distance of two int8's +func Int8(x, y int8) int { + return CountBitsInt8(x ^ y) +} + +// Int16 hamming distance of two int16's +func Int16(x, y int16) int { + return CountBitsInt16(x ^ y) +} + +// Int32 hamming distance of two int32's +func Int32(x, y int32) int { + return CountBitsInt32(x ^ y) +} + +// Int64 hamming distance of two int64's +func Int64(x, y int64) int { + return CountBitsInt64(x ^ y) +} + +// Int hamming distance of two ints +func Int(x, y int) int { + return CountBitsInt(x ^ y) +} + +// Uint8 hamming distance of two uint8's +func Uint8(x, y uint8) int { + return CountBitsUint8(x ^ y) +} + +// Uint16 hamming distance of two uint16's +func Uint16(x, y uint16) int { + return CountBitsUint16(x ^ y) +} + +// Uint32 hamming distance of two uint32's +func Uint32(x, y uint32) int { + return CountBitsUint32(x ^ y) +} + +// Uint64 hamming distance of two uint64's +func Uint64(x, y uint64) int { + return CountBitsUint64(x ^ y) +} + +// Uint hamming distance of two uint's +func Uint(x, y uint) int { + return CountBitsUint(x ^ y) +} + +// Byte hamming distance of two bytes +func Byte(x, y byte) int { + return CountBitsByte(x ^ y) +} + +// Rune hamming distance of two runes +func Rune(x, y rune) int { + return CountBitsRune(x ^ y) +} diff --git a/vendor/github.com/steakknife/hamming/popcnt_amd64.go b/vendor/github.com/steakknife/hamming/popcnt_amd64.go new file mode 100644 index 00000000..a1a6d92b --- /dev/null +++ b/vendor/github.com/steakknife/hamming/popcnt_amd64.go @@ -0,0 +1,65 @@ +// +// Package hamming distance calculations in Go +// +// https://github.com/steakknife/hamming +// +// Copyright © 2014, 2015, 2016, 2018 Barry Allard +// +// MIT license +// +package hamming + +import "strconv" + +// HasPopCnt returns true if *PopCnt functions are callable +func HasPopCnt() (ret bool) + +// CountBitsInt8PopCnt count 1's in x +func CountBitsInt8PopCnt(x int8) (ret int) + +// CountBitsInt16PopCnt count 1's in x +func CountBitsInt16PopCnt(x int16) (ret int) + +// CountBitsInt32PopCnt count 1's in x +func CountBitsInt32PopCnt(x int32) (ret int) + +// CountBitsInt64PopCnt count 1's in x +func CountBitsInt64PopCnt(x int64) (ret int) + +// CountBitsIntPopCnt count 1's in x +func CountBitsIntPopCnt(x int) int { + if strconv.IntSize == 64 { + return CountBitsInt64PopCnt(int64(x)) + } else if strconv.IntSize == 32 { + return CountBitsInt32PopCnt(int32(x)) + } + panic("strconv.IntSize must be 32 or 64") +} + +// CountBitsUint8PopCnt count 1's in x +func CountBitsUint8PopCnt(x uint8) (ret int) + +// CountBitsUint16PopCnt count 1's in x +func CountBitsUint16PopCnt(x uint16) (ret int) + +// CountBitsUint32PopCnt count 1's in x +func CountBitsUint32PopCnt(x uint32) (ret int) + +// CountBitsUint64PopCnt count 1's in x +func CountBitsUint64PopCnt(x uint64) (ret int) + +// CountBitsUintPopCnt count 1's in x +func CountBitsUintPopCnt(x uint) int { + if strconv.IntSize == 64 { + return CountBitsUint64PopCnt(uint64(x)) + } else if strconv.IntSize == 32 { + return CountBitsUint32PopCnt(uint32(x)) + } + panic("strconv.IntSize must be 32 or 64") +} + +// CountBitsBytePopCnt count 1's in x +func CountBitsBytePopCnt(x byte) (ret int) + +// CountBitsRunePopCnt count 1's in x +func CountBitsRunePopCnt(x rune) (ret int) diff --git a/vendor/github.com/steakknife/hamming/popcnt_amd64.s b/vendor/github.com/steakknife/hamming/popcnt_amd64.s new file mode 100644 index 00000000..51c51248 --- /dev/null +++ b/vendor/github.com/steakknife/hamming/popcnt_amd64.s @@ -0,0 +1,64 @@ +// +// hamming distance calculations in Go +// +// https://github.com/steakknife/hamming +// +// Copyright © 2014, 2015, 2016 Barry Allard +// +// MIT license +// + +#include "textflag.h" + +TEXT ·CountBitsInt8PopCnt(SB),NOSPLIT,$0 + JMP ·CountBitsBytePopCnt(SB) + +TEXT ·CountBitsInt16PopCnt(SB),NOSPLIT,$0 + JMP ·CountBitsUint16PopCnt(SB) + +TEXT ·CountBitsInt32PopCnt(SB),NOSPLIT,$0 + JMP ·CountBitsUint32PopCnt(SB) + +TEXT ·CountBitsInt64PopCnt(SB),NOSPLIT,$0 + JMP ·CountBitsUint64PopCnt(SB) + +TEXT ·CountBitsBytePopCnt(SB),NOSPLIT,$0 + JMP ·CountBitsUint8PopCnt(SB) + +TEXT ·CountBitsRunePopCnt(SB),NOSPLIT,$0 + JMP ·CountBitsUint32PopCnt(SB) + +TEXT ·CountBitsUint8PopCnt(SB),NOSPLIT,$0 + XORQ AX, AX + MOVB x+0(FP), AX + POPCNTQ AX, AX + MOVQ AX, ret+8(FP) + RET + +TEXT ·CountBitsUint16PopCnt(SB),NOSPLIT,$0 + XORQ AX, AX + MOVW x+0(FP), AX + POPCNTQ AX, AX + MOVQ AX, ret+8(FP) + RET + +TEXT ·CountBitsUint32PopCnt(SB),NOSPLIT,$0 + XORQ AX, AX + MOVL x+0(FP), AX + POPCNTQ AX, AX + MOVQ AX, ret+8(FP) + RET + +TEXT ·CountBitsUint64PopCnt(SB),NOSPLIT,$0 + POPCNTQ x+0(FP), AX + MOVQ AX, ret+8(FP) + RET + +// func hasPopCnt() (ret bool) +TEXT ·HasPopCnt(SB),NOSPLIT,$0 + MOVL $1, AX + CPUID + SHRL $23, CX // bit 23: Advanced Bit Manipulation Bit (ABM) -> POPCNTQ + ANDL $1, CX + MOVB CX, ret+0(FP) + RET diff --git a/vendor/github.com/steakknife/hamming/popcount.go b/vendor/github.com/steakknife/hamming/popcount.go new file mode 100644 index 00000000..848103bb --- /dev/null +++ b/vendor/github.com/steakknife/hamming/popcount.go @@ -0,0 +1,134 @@ +// +// Package hamming distance calculations in Go +// +// https://github.com/steakknife/hamming +// +// Copyright © 2014, 2015, 2016, 2018 Barry Allard +// +// MIT license +// +package hamming + +import "strconv" + +// References: check out Hacker's Delight, about p. 70 + +func table() [256]uint8 { + return [256]uint8{ + 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8, + } +} + +// CountBitsByteAlt table-less, branch-free implementation +func CountBitsByteAlt(x byte) int { + x = (x & 0x55) + ((x >> 1) & 0x55) + x = (x & 0x33) + ((x >> 2) & 0x33) + return int((x & 0x0f) + ((x >> 4) & 0x0f)) +} + +// CountBitsInt8 count 1's in x +func CountBitsInt8(x int8) int { return CountBitsByte(byte(x)) } + +// CountBitsInt16 count 1's in x +func CountBitsInt16(x int16) int { return CountBitsUint16(uint16(x)) } + +// CountBitsInt32 count 1's in x +func CountBitsInt32(x int32) int { return CountBitsUint32(uint32(x)) } + +// CountBitsInt64 count 1's in x +func CountBitsInt64(x int64) int { return CountBitsUint64(uint64(x)) } + +// CountBitsInt count 1's in x +func CountBitsInt(x int) int { return CountBitsUint(uint(x)) } + +// CountBitsByte count 1's in x +func CountBitsByte(x byte) int { return CountBitsUint8(x) } + +// CountBitsRune count 1's in x +func CountBitsRune(x rune) int { return CountBitsInt32(x) } + +// CountBitsUint8 count 1's in x +func CountBitsUint8(x uint8) int { return int(table()[x]) } + +// CountBitsUint16 count 1's in x +func CountBitsUint16(x uint16) int { + return int(table()[x&0xFF] + table()[(x>>8)&0xFF]) +} + +const ( + m1d uint32 = 0x55555555 + m2d = 0x33333333 + m4d = 0x0f0f0f0f +) + +// CountBitsUint32 count 1's in x +func CountBitsUint32(x uint32) int { + x -= ((x >> 1) & m1d) + x = (x & m2d) + ((x >> 2) & m2d) + x = (x + (x >> 4)) & m4d + x += x >> 8 + x += x >> 16 + return int(x & 0x3f) +} + +const ( + m1q uint64 = 0x5555555555555555 + m2q = 0x3333333333333333 + m4q = 0x0f0f0f0f0f0f0f0f + hq = 0x0101010101010101 +) + +// CountBitsUint64 count 1's in x +func CountBitsUint64(x uint64) int { + // put count of each 2 bits into those 2 bits + x -= (x >> 1) & m1q + + // put count of each 4 bits into those 4 bits + x = (x & m2q) + ((x >> 2) & m2q) + + // put count of each 8 bits into those 8 bits + x = (x + (x >> 4)) & m4q + + // returns left 8 bits of x + (x<<8) + (x<<16) + (x<<24) + ... + return int((x * hq) >> 56) +} + +// CountBitsUint64Alt count 1's in x +func CountBitsUint64Alt(x uint64) int { + return CountBitsUint32(uint32(x>>32)) + CountBitsUint32(uint32(x)) +} + +// CountBitsUintReference count 1's in x +func CountBitsUintReference(x uint) int { + c := 0 + for x != 0 { + x &= x - 1 + c++ + } + return c +} + +// CountBitsUint count 1's in x +func CountBitsUint(x uint) int { + if strconv.IntSize == 64 { + return CountBitsUint64(uint64(x)) + } else if strconv.IntSize == 32 { + return CountBitsUint32(uint32(x)) + } + panic("strconv.IntSize must be 32 or 64 bits") +} diff --git a/vendor/github.com/steakknife/hamming/popcount_slices.go b/vendor/github.com/steakknife/hamming/popcount_slices.go new file mode 100644 index 00000000..957fe116 --- /dev/null +++ b/vendor/github.com/steakknife/hamming/popcount_slices.go @@ -0,0 +1,123 @@ +// +// Package hamming distance calculations in Go +// +// https://github.com/steakknife/hamming +// +// Copyright © 2014, 2015, 2016, 2018 Barry Allard +// +// MIT license +// +package hamming + +// CountBitsInt8s count 1's in b +func CountBitsInt8s(b []int8) int { + c := 0 + for _, x := range b { + c += CountBitsInt8(x) + } + return c +} + +// CountBitsInt16s count 1's in b +func CountBitsInt16s(b []int16) int { + c := 0 + for _, x := range b { + c += CountBitsInt16(x) + } + return c +} + +// CountBitsInt32s count 1's in b +func CountBitsInt32s(b []int32) int { + c := 0 + for _, x := range b { + c += CountBitsInt32(x) + } + return c +} + +// CountBitsInt64s count 1's in b +func CountBitsInt64s(b []int64) int { + c := 0 + for _, x := range b { + c += CountBitsInt64(x) + } + return c +} + +// CountBitsInts count 1's in b +func CountBitsInts(b []int) int { + c := 0 + for _, x := range b { + c += CountBitsInt(x) + } + return c +} + +// CountBitsUint8s count 1's in b +func CountBitsUint8s(b []uint8) int { + c := 0 + for _, x := range b { + c += CountBitsUint8(x) + } + return c +} + +// CountBitsUint16s count 1's in b +func CountBitsUint16s(b []uint16) int { + c := 0 + for _, x := range b { + c += CountBitsUint16(x) + } + return c +} + +// CountBitsUint32s count 1's in b +func CountBitsUint32s(b []uint32) int { + c := 0 + for _, x := range b { + c += CountBitsUint32(x) + } + return c +} + +// CountBitsUint64s count 1's in b +func CountBitsUint64s(b []uint64) int { + c := 0 + for _, x := range b { + c += CountBitsUint64(x) + } + return c +} + +// CountBitsUints count 1's in b +func CountBitsUints(b []uint) int { + c := 0 + for _, x := range b { + c += CountBitsUint(x) + } + return c +} + +// CountBitsBytes count 1's in b +func CountBitsBytes(b []byte) int { + c := 0 + for _, x := range b { + c += CountBitsByte(x) + } + return c +} + +// CountBitsRunes count 1's in b +func CountBitsRunes(b []rune) int { + c := 0 + for _, x := range b { + c += CountBitsRune(x) + } + return c +} + +// CountBitsString count 1's in s +func CountBitsString(s string) int { + return CountBitsBytes([]byte(s)) +} diff --git a/vendor/github.com/steakknife/hamming/popcount_slices_amd64.go b/vendor/github.com/steakknife/hamming/popcount_slices_amd64.go new file mode 100644 index 00000000..b3e13fdf --- /dev/null +++ b/vendor/github.com/steakknife/hamming/popcount_slices_amd64.go @@ -0,0 +1,72 @@ +// +// Package hamming distance calculations in Go +// +// https://github.com/steakknife/hamming +// +// Copyright © 2014, 2015, 2016, 2018 Barry Allard +// +// MIT license +// +package hamming + +import ( + "strconv" + "unsafe" +) + +// CountBitsInt8sPopCnt count 1's in x +func CountBitsInt8sPopCnt(x []int8) (ret int) + +// CountBitsInt16sPopCnt count 1's in x +func CountBitsInt16sPopCnt(x []int16) (ret int) + +// CountBitsInt32sPopCnt count 1's in x +func CountBitsInt32sPopCnt(x []int32) (ret int) + +// CountBitsInt64sPopCnt count 1's in x +func CountBitsInt64sPopCnt(x []int64) (ret int) + +// CountBitsIntsPopCnt count 1's in x +func CountBitsIntsPopCnt(x []int) int { + if strconv.IntSize == 64 { + y := (*[]int64)(unsafe.Pointer(&x)) // #nosec G103 + return CountBitsInt64sPopCnt(*y) + } else if strconv.IntSize == 32 { + y := (*[]int32)(unsafe.Pointer(&x)) // #nosec G103 + return CountBitsInt32sPopCnt(*y) + } + panic("strconv.IntSize must be 32 or 64 bits") +} + +// CountBitsUint8sPopCnt count 1's in x +func CountBitsUint8sPopCnt(x []uint8) (ret int) + +// CountBitsUint16sPopCnt count 1's in x +func CountBitsUint16sPopCnt(x []uint16) (ret int) + +// CountBitsUint32sPopCnt count 1's in x +func CountBitsUint32sPopCnt(x []uint32) (ret int) + +// CountBitsUint64sPopCnt count 1's in x +func CountBitsUint64sPopCnt(x []uint64) (ret int) + +// CountBitsUintsPopCnt count 1's in x +func CountBitsUintsPopCnt(x []uint) int { + if strconv.IntSize == 64 { + y := (*[]uint64)(unsafe.Pointer(&x)) // #nosec G103 + return CountBitsUint64sPopCnt(*y) + } else if strconv.IntSize == 32 { + y := (*[]uint32)(unsafe.Pointer(&x)) // #nosec G103 + return CountBitsUint32sPopCnt(*y) + } + panic("strconv.IntSize must be 32 or 64 bits") +} + +// CountBitsBytesPopCnt count 1's in x +func CountBitsBytesPopCnt(x []byte) (ret int) + +// CountBitsRunesPopCnt count 1's in x +func CountBitsRunesPopCnt(x []rune) (ret int) + +// CountBitsStringPopCnt count 1's in s +func CountBitsStringPopCnt(s string) (ret int) diff --git a/vendor/github.com/steakknife/hamming/popcount_slices_amd64.s b/vendor/github.com/steakknife/hamming/popcount_slices_amd64.s new file mode 100644 index 00000000..b6b8c783 --- /dev/null +++ b/vendor/github.com/steakknife/hamming/popcount_slices_amd64.s @@ -0,0 +1,370 @@ +// +// hamming distance calculations in Go +// +// https://github.com/steakknife/hamming +// +// Copyright © 2014, 2015, 2016 Barry Allard +// +// MIT license +// + +#include "textflag.h" + +// type SliceHeader struct { +// Data uintptr 0 +// Len int 8 +// Cap int 16 +// } + +// 0 x.Data +// 8 x.Len +// 16 x.Cap +// 24 ret + +// type StringHeader struct { +// Data uintptr 0 +// Len int 8 +// } + +// 0 x.Data +// 8 x.Len +// 16 ret + +// func CountBitsInt8sPopCnt(x []int8) (ret int) +TEXT ·CountBitsInt8sPopCnt(SB),NOSPLIT,$0 + JMP ·CountBitsUint8sPopCnt(SB) + +// func CountBitsInt16sPopCnt(x []int16) (ret int) +TEXT ·CountBitsInt16sPopCnt(SB),NOSPLIT,$0 + JMP ·CountBitsUint16sPopCnt(SB) + +// func CountBitsInt32sPopCnt(x []int32) (ret int) +TEXT ·CountBitsInt32sPopCnt(SB),NOSPLIT,$0 + JMP ·CountBitsUint32sPopCnt(SB) + +// func CountBitsInt64sPopCnt(x []int64) (ret int) +TEXT ·CountBitsInt64sPopCnt(SB),NOSPLIT,$0 + JMP ·CountBitsUint64sPopCnt(SB) + +// func CountBitsUint8sPopCnt(x []uint8) (ret int) +TEXT ·CountBitsUint8sPopCnt(SB),NOSPLIT,$0 + XORQ AX, AX // ret = 0 + MOVQ x+8(FP), CX // x.Len -> CX + +test_negative_slice_len: + MOVQ CX, BX // x.Len < 0 ---> x.Len[63] != 0 + SHRQ $63, BX + JNZ done + + MOVQ x+0(FP), DI // x.Data -> DI + + CMPQ CX, $32 // x.Len >= 32 + JL unrolled_loop_skip + +unrolled_loop_setup: + XORQ R9, R9 + XORQ BX, BX + XORQ DX, DX + +unrolled_loop: // 4 unrolled loops of POPCNTQ (4 quad words at a time) + SUBQ $32, CX + + POPCNTQ 0(DI), R10 + ADDQ R10, R9 + POPCNTQ 8(DI), R11 + ADDQ R11, AX + POPCNTQ 16(DI), R12 + ADDQ R12, BX + POPCNTQ 24(DI), R13 + ADDQ R13, DX + + ADDQ $32, DI + CMPQ CX, $32 // x.Len >= 32 + JGE unrolled_loop + +unrolled_loop_done: + ADDQ R9, AX + ADDQ BX, DX + ADDQ DX, AX + + XORQ BX, BX + +unrolled_loop_skip: + CMPQ CX, $0 + JZ done + + XORQ DX, DX + +remainder_loop: + MOVB 0(DI), DL + POPCNTQ DX, BX + ADDQ BX, AX + + INCQ DI + DECQ CX + JNZ remainder_loop + +done: + MOVQ AX, ret+24(FP) + RET + +// func CountBitsUint16sPopCnt(x []uint16) (ret int) +TEXT ·CountBitsUint16sPopCnt(SB),NOSPLIT,$0 + XORQ AX, AX // ret = 0 + MOVQ x+8(FP), CX // x.Len -> CX + +test_negative_slice_len: + MOVQ CX, BX // x.Len*2 < 0 ---> x.Len[63:62] != 0 + SHLQ $1, CX + SHRQ $62, BX + JNZ done + + MOVQ x+0(FP), DI // x.Data -> DI + + + CMPQ CX, $32 // x.Len*2 >= 32 + JL unrolled_loop_skip + +unrolled_loop_setup: + XORQ R9, R9 + XORQ BX, BX + XORQ DX, DX + +unrolled_loop: // 4 unrolled loops of POPCNTQ (4 quad words at a time) + SUBQ $32, CX + + POPCNTQ 0(DI), R10 + ADDQ R10, R9 + POPCNTQ 8(DI), R11 + ADDQ R11, AX + POPCNTQ 16(DI), R12 + ADDQ R12, BX + POPCNTQ 24(DI), R13 + ADDQ R13, DX + + ADDQ $32, DI + CMPQ CX, $32 // x.Len*2 >= 32 + JGE unrolled_loop + +unrolled_loop_done: + ADDQ R9, AX + ADDQ BX, DX + ADDQ DX, AX + + XORQ BX, BX + +unrolled_loop_skip: + CMPQ CX, $0 + JZ done + + XORQ DX, DX + +remainder_loop: + MOVW 0(DI), DX + POPCNTQ DX, BX + ADDQ BX, AX + + ADDQ $2, DI + SUBQ $2, CX + JNZ remainder_loop + +done: + MOVQ AX, ret+24(FP) + RET + +// func CountBitsUint32sPopCnt(x []uint32) (ret int) +TEXT ·CountBitsUint32sPopCnt(SB),NOSPLIT,$0 + XORQ AX, AX // ret = 0 + MOVQ x+8(FP), CX // x.Len -> CX + MOVQ CX, BX + MOVQ x+0(FP), DI // x.Data -> DI + +test_negative_slice_len: + SHLQ $2, CX // x.Len*4 < 0 ---> x.Len[63:61] != 0 + SHRQ $61, BX + JNZ done + + + + CMPQ CX, $32 // x.Len*4 >= 32 + JL unrolled_loop_skip + +unrolled_loop_setup: + XORQ R9, R9 + XORQ BX, BX + XORQ DX, DX + +unrolled_loop: // 4 unrolled loops of POPCNTQ (4 quad words at a time) + SUBQ $32, CX + + POPCNTQ 0(DI), R10 // r9 += popcntq(QW DI+0) + ADDQ R10, R9 + POPCNTQ 8(DI), R11 // ax += popcntq(QW DI+8) + ADDQ R11, AX + POPCNTQ 16(DI), R12 // bx += popcntq(QW DI+16) + ADDQ R12, BX + POPCNTQ 24(DI), R13 // dx += popcntq(QW DI+24) + ADDQ R13, DX + + ADDQ $32, DI + CMPQ CX, $32 // x.Len*4 >= 32 + JGE unrolled_loop + +unrolled_loop_done: + ADDQ R9, AX // ax = (ax + r9) + (bx + dx) + ADDQ BX, DX + ADDQ DX, AX + + XORQ BX, BX + +unrolled_loop_skip: + CMPQ CX, $0 + JZ done + + XORQ DX, DX +remainder_loop: + MOVB (DI), DX // ax += popcnt(DB 0(DI)) + POPCNTQ DX, BX + ADDQ BX, AX + + INCQ DI + DECQ CX + JNZ remainder_loop + +done: + MOVQ AX, ret+24(FP) + RET + +// func CountBitsUint64sPopCnt(x []uint64) (ret int) +TEXT ·CountBitsUint64sPopCnt(SB),NOSPLIT,$0 + XORQ AX, AX // ret = 0 + MOVQ x+8(FP), CX // x.Len -> CX + +test_negative_slice_len: + MOVQ CX, BX // x.Len*8 < 0 ---> x.Len[63:60] != 0 + SHLQ $3, CX + SHRQ $60, BX + JNZ done + + MOVQ x+0(FP), DI // x.Data -> DI + + + CMPQ CX, $32 // x.Len*8 >= 32 + JL unrolled_loop_skip + +unrolled_loop_setup: + XORQ R9, R9 + XORQ BX, BX + XORQ DX, DX + +unrolled_loop: // 4 unrolled loops of POPCNTQ (4 quad words at a time) + SUBQ $32, CX + + POPCNTQ 0(DI), R10 + ADDQ R10, R9 + POPCNTQ 8(DI), R11 + ADDQ R11, AX + POPCNTQ 16(DI), R12 + ADDQ R12, BX + POPCNTQ 24(DI), R13 + ADDQ R13, DX + + ADDQ $32, DI + CMPQ CX, $32 // x.Len*4 >= 32 + JGE unrolled_loop + +unrolled_loop_done: + ADDQ R9, AX + ADDQ BX, DX + ADDQ DX, AX + + XORQ BX, BX + +unrolled_loop_skip: + CMPQ CX, $0 + JZ done + + XORQ DX, DX + +remainder_loop: + MOVQ 0(DI), DX + POPCNTQ DX, BX + ADDQ BX, AX + + ADDQ $8, DI + SUBQ $8, CX + JNZ remainder_loop + +done: + MOVQ AX, ret+24(FP) + RET + +// func CountBitsBytesPopCnt(x []byte) (ret int) +TEXT ·CountBitsBytesPopCnt(SB),NOSPLIT,$0 + JMP ·CountBitsUint8sPopCnt(SB) + +// func CountBitsRunesPopCnt(x []rune) (ret int) +TEXT ·CountBitsRunesPopCnt(SB),NOSPLIT,$0 + JMP ·CountBitsUint32sPopCnt(SB) + +// func CountBitsStringPopCnt(s string) (ret int) +TEXT ·CountBitsStringPopCnt(SB),NOSPLIT,$0 + XORQ AX, AX // ret = 0 + MOVQ x+8(FP), CX // x.Len -> CX + +test_negative_slice_len: + MOVQ CX, BX // x.Len < 0 ---> x.Len[63] != 0 + SHRQ $63, BX + JNZ done + + MOVQ x+0(FP), DI // x.Data -> DI + + CMPQ CX, $32 // x.Len >= 32 + JL unrolled_loop_skip + +unrolled_loop_setup: + XORQ R9, R9 + XORQ BX, BX + XORQ DX, DX + +unrolled_loop: // 4 unrolled loops of POPCNTQ (4 quad words at a time) + SUBQ $32, CX + + POPCNTQ 0(DI), R10 + ADDQ R10, R9 + POPCNTQ 8(DI), R11 + ADDQ R11, AX + POPCNTQ 16(DI), R12 + ADDQ R12, BX + POPCNTQ 24(DI), R13 + ADDQ R13, DX + + ADDQ $32, DI + CMPQ CX, $32 // x.Len >= 32 + JGE unrolled_loop + +unrolled_loop_done: + ADDQ R9, AX + ADDQ BX, DX + ADDQ DX, AX + + XORQ BX, BX + +unrolled_loop_skip: + CMPQ CX, $0 + JZ done + + XORQ DX, DX + +remainder_loop: + MOVB 0(DI), DL + POPCNTQ DX, BX + ADDQ BX, AX + + INCQ DI + DECQ CX + JNZ remainder_loop + +done: + MOVQ AX, ret+16(FP) + RET diff --git a/vendor/github.com/steakknife/hamming/slices_of_hamming.go b/vendor/github.com/steakknife/hamming/slices_of_hamming.go new file mode 100644 index 00000000..82ce948f --- /dev/null +++ b/vendor/github.com/steakknife/hamming/slices_of_hamming.go @@ -0,0 +1,144 @@ +// +// Package hamming distance calculations in Go +// +// https://github.com/steakknife/hamming +// +// Copyright © 2014, 2015, 2016, 2018 Barry Allard +// +// MIT license +// +package hamming + +// Int8s hamming distance of two int8 buffers, of which the size of b0 +// is used for both (panics if b1 < b0, does not compare b1 beyond length of b0) +func Int8s(b0, b1 []int8) int { + d := 0 + for i, x := range b0 { + d += Int8(x, b1[i]) + } + return d +} + +// Int16s hamming distance of two int16 buffers, of which the size of b0 +// is used for both (panics if b1 < b0, does not compare b1 beyond length of b0) +func Int16s(b0, b1 []int16) int { + d := 0 + for i, x := range b0 { + d += Int16(x, b1[i]) + } + return d +} + +// Int32s hamming distance of two int32 buffers, of which the size of b0 +// is used for both (panics if b1 < b0, does not compare b1 beyond length of b0) +func Int32s(b0, b1 []int32) int { + d := 0 + for i, x := range b0 { + d += Int32(x, b1[i]) + } + return d +} + +// Int64s hamming distance of two int64 buffers, of which the size of b0 +// is used for both (panics if b1 < b0, does not compare b1 beyond length of b0) +func Int64s(b0, b1 []int64) int { + d := 0 + for i, x := range b0 { + d += Int64(x, b1[i]) + } + return d +} + +// Ints hamming distance of two int buffers, of which the size of b0 +// is used for both (panics if b1 < b0, does not compare b1 beyond length of b0) +func Ints(b0, b1 []int) int { + d := 0 + for i, x := range b0 { + d += Int(x, b1[i]) + } + return d +} + +// Uint8s hamming distance of two uint8 buffers, of which the size of b0 +// is used for both (panics if b1 < b0, does not compare b1 beyond length of b0) +func Uint8s(b0, b1 []uint8) int { + d := 0 + for i, x := range b0 { + d += Uint8(x, b1[i]) + } + return d +} + +// Uint16s hamming distance of two uint16 buffers, of which the size of b0 +// is used for both (panics if b1 < b0, does not compare b1 beyond length of b0) +func Uint16s(b0, b1 []uint16) int { + d := 0 + for i, x := range b0 { + d += Uint16(x, b1[i]) + } + return d +} + +// Uint32s hamming distance of two uint32 buffers, of which the size of b0 +// is used for both (panics if b1 < b0, does not compare b1 beyond length of b0) +func Uint32s(b0, b1 []uint32) int { + d := 0 + for i, x := range b0 { + d += Uint32(x, b1[i]) + } + return d +} + +// Uint64s hamming distance of two uint64 buffers, of which the size of b0 +// is used for both (panics if b1 < b0, does not compare b1 beyond length of b0) +func Uint64s(b0, b1 []uint64) int { + d := 0 + for i, x := range b0 { + d += Uint64(x, b1[i]) + } + return d +} + +// Uints hamming distance of two uint buffers, of which the size of b0 +// is used for both (panics if b1 < b0, does not compare b1 beyond length of b0) +func Uints(b0, b1 []uint) int { + d := 0 + for i, x := range b0 { + d += Uint(x, b1[i]) + } + return d +} + +// Bytes hamming distance of two byte buffers, of which the size of b0 +// is used for both (panics if b1 < b0, does not compare b1 beyond length of b0) +func Bytes(b0, b1 []byte) int { + d := 0 + for i, x := range b0 { + d += Byte(x, b1[i]) + } + return d +} + +// Runes hamming distance of two rune buffers, of which the size of b0 +// is used for both (panics if b1 < b0, does not compare b1 beyond length of b0) +func Runes(b0, b1 []rune) int { + d := 0 + for i, x := range b0 { + d += Rune(x, b1[i]) + } + return d +} + +// Strings hamming distance of two strings, of which the size of b0 +// is used for both (panics if b1 < b0, does not compare b1 beyond length of b0) +func Strings(b0, b1 string) int { + return Runes(runes(b0), runes(b1)) +} + +// runize string +func runes(s string) (r []rune) { + for _, ch := range s { + r = append(r, ch) + } + return +} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/db.go b/vendor/github.com/syndtr/goleveldb/leveldb/db.go index 0de5ffe8..90fedf7b 100644 --- a/vendor/github.com/syndtr/goleveldb/leveldb/db.go +++ b/vendor/github.com/syndtr/goleveldb/leveldb/db.go @@ -468,7 +468,7 @@ func recoverTable(s *session, o *opt.Options) error { } // Commit. - return s.commit(rec, false) + return s.commit(rec) } func (db *DB) recoverJournal() error { @@ -538,7 +538,7 @@ func (db *DB) recoverJournal() error { rec.setJournalNum(fd.Num) rec.setSeqNum(db.seq) - if err := db.s.commit(rec, false); err != nil { + if err := db.s.commit(rec); err != nil { fr.Close() return err } @@ -617,7 +617,7 @@ func (db *DB) recoverJournal() error { // Commit. rec.setJournalNum(db.journalFd.Num) rec.setSeqNum(db.seq) - if err := db.s.commit(rec, false); err != nil { + if err := db.s.commit(rec); err != nil { // Close journal on error. if db.journal != nil { db.journal.Close() @@ -957,27 +957,15 @@ func (db *DB) GetProperty(name string) (value string, err error) { value = "Compactions\n" + " Level | Tables | Size(MB) | Time(sec) | Read(MB) | Write(MB)\n" + "-------+------------+---------------+---------------+---------------+---------------\n" - var totalTables int - var totalSize, totalRead, totalWrite int64 - var totalDuration time.Duration for level, tables := range v.levels { duration, read, write := db.compStats.getStat(level) if len(tables) == 0 && duration == 0 { continue } - totalTables += len(tables) - totalSize += tables.size() - totalRead += read - totalWrite += write - totalDuration += duration value += fmt.Sprintf(" %3d | %10d | %13.5f | %13.5f | %13.5f | %13.5f\n", level, len(tables), float64(tables.size())/1048576.0, duration.Seconds(), float64(read)/1048576.0, float64(write)/1048576.0) } - value += "-------+------------+---------------+---------------+---------------+---------------\n" - value += fmt.Sprintf(" Total | %10d | %13.5f | %13.5f | %13.5f | %13.5f\n", - totalTables, float64(totalSize)/1048576.0, totalDuration.Seconds(), - float64(totalRead)/1048576.0, float64(totalWrite)/1048576.0) case p == "iostats": value = fmt.Sprintf("Read(MB):%.5f Write(MB):%.5f", float64(db.s.stor.reads())/1048576.0, @@ -1029,10 +1017,10 @@ type DBStats struct { BlockCacheSize int OpenedTablesCount int - LevelSizes Sizes + LevelSizes []int64 LevelTablesCounts []int - LevelRead Sizes - LevelWrite Sizes + LevelRead []int64 + LevelWrite []int64 LevelDurations []time.Duration } diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/db_compaction.go b/vendor/github.com/syndtr/goleveldb/leveldb/db_compaction.go index 56f3632a..0c1b9a53 100644 --- a/vendor/github.com/syndtr/goleveldb/leveldb/db_compaction.go +++ b/vendor/github.com/syndtr/goleveldb/leveldb/db_compaction.go @@ -260,7 +260,7 @@ func (db *DB) compactionCommit(name string, rec *sessionRecord) { db.compCommitLk.Lock() defer db.compCommitLk.Unlock() // Defer is necessary. db.compactionTransactFunc(name+"@commit", func(cnt *compactionTransactCounter) error { - return db.s.commit(rec, true) + return db.s.commit(rec) }, nil) } diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/db_transaction.go b/vendor/github.com/syndtr/goleveldb/leveldb/db_transaction.go index f145b64f..1a000018 100644 --- a/vendor/github.com/syndtr/goleveldb/leveldb/db_transaction.go +++ b/vendor/github.com/syndtr/goleveldb/leveldb/db_transaction.go @@ -209,7 +209,7 @@ func (tr *Transaction) Commit() error { tr.stats.startTimer() var cerr error for retry := 0; retry < 3; retry++ { - cerr = tr.db.s.commit(&tr.rec, false) + cerr = tr.db.s.commit(&tr.rec) if cerr != nil { tr.db.logf("transaction@commit error R·%d %q", retry, cerr) select { diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/filter/bloom.go b/vendor/github.com/syndtr/goleveldb/leveldb/filter/bloom.go index 56ccbfbe..bab0e997 100644 --- a/vendor/github.com/syndtr/goleveldb/leveldb/filter/bloom.go +++ b/vendor/github.com/syndtr/goleveldb/leveldb/filter/bloom.go @@ -16,7 +16,7 @@ func bloomHash(key []byte) uint32 { type bloomFilter int -// Name: The bloom filter serializes its parameters and is backward compatible +// 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 { diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/session.go b/vendor/github.com/syndtr/goleveldb/leveldb/session.go index 7310209b..3f391f93 100644 --- a/vendor/github.com/syndtr/goleveldb/leveldb/session.go +++ b/vendor/github.com/syndtr/goleveldb/leveldb/session.go @@ -47,24 +47,15 @@ type session struct { 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 - ntVersionId int64 // next version id to assign - refCh chan *vTask - relCh chan *vTask - deltaCh chan *vDelta - abandon chan int64 - closeC chan struct{} - closeW sync.WaitGroup - vmu sync.Mutex - - // Testing fields - fileRefCh chan chan map[int64]int // channel used to pass current reference stat + stCompPtrs []internalKey // compaction pointers; need external synchronization + stVersion *version // current version + vmu sync.Mutex } // Creates new initialized session instance. @@ -77,21 +68,13 @@ func newSession(stor storage.Storage, o *opt.Options) (s *session, err error) { return } s = &session{ - stor: newIStorage(stor), - storLock: storLock, - refCh: make(chan *vTask), - relCh: make(chan *vTask), - deltaCh: make(chan *vDelta), - abandon: make(chan int64), - fileRefCh: make(chan chan map[int64]int), - closeC: make(chan struct{}), + stor: newIStorage(stor), + storLock: storLock, + fileRef: make(map[int64]int), } s.setOptions(o) s.tops = newTableOps(s) - - s.closeW.Add(1) - go s.refLoop() - s.setVersion(nil, newVersion(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 } @@ -107,11 +90,7 @@ func (s *session) close() { } s.manifest = nil s.manifestWriter = nil - s.setVersion(nil, &version{s: s, closing: true, id: s.ntVersionId}) - - // Close all background goroutines - close(s.closeC) - s.closeW.Wait() + s.setVersion(&version{s: s, closing: true}) } // Release session lock. @@ -201,27 +180,19 @@ func (s *session) recover() (err error) { } s.manifestFd = fd - s.setVersion(rec, staging.finish(false)) + s.setVersion(staging.finish()) s.setNextFileNum(rec.nextFileNum) s.recordCommited(rec) return nil } // Commit session; need external synchronization. -func (s *session) commit(r *sessionRecord, trivial bool) (err error) { +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, trivial) - - // abandon useless version id to prevent blocking version processing loop. - defer func() { - if err != nil { - s.abandon <- nv.id - s.logf("commit@abandon useless vid D%d", nv.id) - } - }() + nv := v.spawn(r) if s.manifest == nil { // manifest journal writer not yet created, create one @@ -232,7 +203,7 @@ func (s *session) commit(r *sessionRecord, trivial bool) (err error) { // finally, apply new version if no error rise if err == nil { - s.setVersion(r, nv) + 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 index f6030022..089cd00b 100644 --- a/vendor/github.com/syndtr/goleveldb/leveldb/session_compaction.go +++ b/vendor/github.com/syndtr/goleveldb/leveldb/session_compaction.go @@ -181,14 +181,10 @@ func (c *compaction) expand() { t0, t1 := c.levels[0], c.levels[1] imin, imax := t0.getRange(c.s.icmp) - - // For non-zero levels, the ukey can't hop across tables at all. - if c.sourceLevel == 0 { - // 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) - } + // 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. diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/session_util.go b/vendor/github.com/syndtr/goleveldb/leveldb/session_util.go index 67a6df97..40cb2cf9 100644 --- a/vendor/github.com/syndtr/goleveldb/leveldb/session_util.go +++ b/vendor/github.com/syndtr/goleveldb/leveldb/session_util.go @@ -9,7 +9,6 @@ package leveldb import ( "fmt" "sync/atomic" - "time" "github.com/syndtr/goleveldb/leveldb/journal" "github.com/syndtr/goleveldb/leveldb/storage" @@ -40,214 +39,20 @@ func (s *session) newTemp() storage.FileDesc { return storage.FileDesc{Type: storage.TypeTemp, Num: num} } -// Session state. - -const ( - // maxCachedNumber represents the maximum number of version tasks - // that can be cached in the ref loop. - maxCachedNumber = 256 - - // maxCachedTime represents the maximum time for ref loop to cache - // a version task. - maxCachedTime = 5 * time.Minute -) - -// vDelta indicates the change information between the next version -// and the currently specified version -type vDelta struct { - vid int64 - added []int64 - deleted []int64 -} - -// vTask defines a version task for either reference or release. -type vTask struct { - vid int64 - files []tFiles - created time.Time -} - -func (s *session) refLoop() { - var ( - fileRef = make(map[int64]int) // Table file reference counter - ref = make(map[int64]*vTask) // Current referencing version store - deltas = make(map[int64]*vDelta) - referenced = make(map[int64]struct{}) - released = make(map[int64]*vDelta) // Released version that waiting for processing - abandoned = make(map[int64]struct{}) // Abandoned version id - next, last int64 - ) - // addFileRef adds file reference counter with specified file number and - // reference value - addFileRef := func(fnum int64, ref int) int { - ref += fileRef[fnum] - if ref > 0 { - fileRef[fnum] = ref - } else if ref == 0 { - delete(fileRef, fnum) - } else { - panic(fmt.Sprintf("negative ref: %v", fnum)) - } - return ref - } - // skipAbandoned skips useless abandoned version id. - skipAbandoned := func() bool { - if _, exist := abandoned[next]; exist { - delete(abandoned, next) - return true - } - return false - } - // applyDelta applies version change to current file reference. - applyDelta := func(d *vDelta) { - for _, t := range d.added { - addFileRef(t, 1) - } - for _, t := range d.deleted { - if addFileRef(t, -1) == 0 { - s.tops.remove(storage.FileDesc{Type: storage.TypeTable, Num: t}) - } - } - } - - timer := time.NewTimer(0) - <-timer.C // discard the initial tick - defer timer.Stop() - - // processTasks processes version tasks in strict order. - // - // If we want to use delta to reduce the cost of file references and dereferences, - // we must strictly follow the id of the version, otherwise some files that are - // being referenced will be deleted. - // - // In addition, some db operations (such as iterators) may cause a version to be - // referenced for a long time. In order to prevent such operations from blocking - // the entire processing queue, we will properly convert some of the version tasks - // into full file references and releases. - processTasks := func() { - timer.Reset(maxCachedTime) - // Make sure we don't cache too many version tasks. - for { - // Skip any abandoned version number to prevent blocking processing. - if skipAbandoned() { - next += 1 - continue - } - // Don't bother the version that has been released. - if _, exist := released[next]; exist { - break - } - // Ensure the specified version has been referenced. - if _, exist := ref[next]; !exist { - break - } - if last-next < maxCachedNumber && time.Since(ref[next].created) < maxCachedTime { - break - } - // Convert version task into full file references and releases mode. - // Reference version(i+1) first and wait version(i) to release. - // FileRef(i+1) = FileRef(i) + Delta(i) - for _, tt := range ref[next].files { - for _, t := range tt { - addFileRef(t.fd.Num, 1) - } - } - // Note, if some compactions take a long time, even more than 5 minutes, - // we may miss the corresponding delta information here. - // Fortunately it will not affect the correctness of the file reference, - // and we can apply the delta once we receive it. - if d := deltas[next]; d != nil { - applyDelta(d) - } - referenced[next] = struct{}{} - delete(ref, next) - delete(deltas, next) - next += 1 - } - - // Use delta information to process all released versions. - for { - if skipAbandoned() { - next += 1 - continue - } - if d, exist := released[next]; exist { - if d != nil { - applyDelta(d) - } - delete(released, next) - next += 1 - continue - } - return - } - } - - for { - processTasks() - - select { - case t := <-s.refCh: - if _, exist := ref[t.vid]; exist { - panic("duplicate reference request") - } - ref[t.vid] = t - if t.vid > last { - last = t.vid - } - - case d := <-s.deltaCh: - if _, exist := ref[d.vid]; !exist { - if _, exist2 := referenced[d.vid]; !exist2 { - panic("invalid release request") - } - // The reference opt is already expired, apply - // delta here. - applyDelta(d) - continue - } - deltas[d.vid] = d - - case t := <-s.relCh: - if _, exist := referenced[t.vid]; exist { - for _, tt := range t.files { - for _, t := range tt { - if addFileRef(t.fd.Num, -1) == 0 { - s.tops.remove(t.fd) - } - } - } - delete(referenced, t.vid) - continue - } - if _, exist := ref[t.vid]; !exist { - panic("invalid release request") - } - released[t.vid] = deltas[t.vid] - delete(deltas, t.vid) - delete(ref, t.vid) - - case id := <-s.abandon: - if id >= next { - abandoned[id] = struct{}{} - } - - case <-timer.C: - - case r := <-s.fileRefCh: - ref := make(map[int64]int) - for f, c := range fileRef { - ref[f] = c - } - r <- ref - - case <-s.closeC: - s.closeW.Done() - return - } +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 { @@ -264,30 +69,13 @@ func (s *session) tLen(level int) int { } // Set current version to v. -func (s *session) setVersion(r *sessionRecord, v *version) { +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 { - if r != nil { - var ( - added = make([]int64, 0, len(r.addedTables)) - deleted = make([]int64, 0, len(r.deletedTables)) - ) - for _, t := range r.addedTables { - added = append(added, t.num) - } - for _, t := range r.deletedTables { - deleted = append(deleted, t.num) - } - select { - case s.deltaCh <- &vDelta{vid: s.stVersion.id, added: added, deleted: deleted}: - case <-v.s.closeC: - s.log("reference loop already exist") - } - } // Release current version. s.stVersion.releaseNB() } diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/table.go b/vendor/github.com/syndtr/goleveldb/leveldb/table.go index 5ad1f805..1fac60d0 100644 --- a/vendor/github.com/syndtr/goleveldb/leveldb/table.go +++ b/vendor/github.com/syndtr/goleveldb/leveldb/table.go @@ -7,7 +7,6 @@ package leveldb import ( - "bytes" "fmt" "sort" "sync/atomic" @@ -151,30 +150,6 @@ func (tf tFiles) searchMax(icmp *iComparer, ikey internalKey) int { }) } -// Searches smallest index of tables whose its file number -// is smaller than the given number. -func (tf tFiles) searchNumLess(num int64) int { - return sort.Search(len(tf), func(i int) bool { - return tf[i].fd.Num < num - }) -} - -// Searches smallest index of tables whose its smallest -// key is after the given key. -func (tf tFiles) searchMinUkey(icmp *iComparer, umin []byte) int { - return sort.Search(len(tf), func(i int) bool { - return icmp.ucmp.Compare(tf[i].imin.ukey(), umin) > 0 - }) -} - -// Searches smallest index of tables whose its largest -// key is after the given key. -func (tf tFiles) searchMaxUkey(icmp *iComparer, umax []byte) int { - return sort.Search(len(tf), func(i int) bool { - return icmp.ucmp.Compare(tf[i].imax.ukey(), umax) > 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 { @@ -206,50 +181,6 @@ func (tf tFiles) overlaps(icmp *iComparer, umin, umax []byte, unsorted bool) boo // expanded. // The dst content will be overwritten. func (tf tFiles) getOverlaps(dst tFiles, icmp *iComparer, umin, umax []byte, overlapped bool) tFiles { - // Short circuit if tf is empty - if len(tf) == 0 { - return nil - } - // For non-zero levels, there is no ukey hop across at all. - // And what's more, the files in these levels are strictly sorted, - // so use binary search instead of heavy traverse. - if !overlapped { - var begin, end int - // Determine the begin index of the overlapped file - if umin != nil { - index := tf.searchMinUkey(icmp, umin) - if index == 0 { - begin = 0 - } else if bytes.Compare(tf[index-1].imax.ukey(), umin) >= 0 { - // The min ukey overlaps with the index-1 file, expand it. - begin = index - 1 - } else { - begin = index - } - } - // Determine the end index of the overlapped file - if umax != nil { - index := tf.searchMaxUkey(icmp, umax) - if index == len(tf) { - end = len(tf) - } else if bytes.Compare(tf[index].imin.ukey(), umax) <= 0 { - // The max ukey overlaps with the index file, expand it. - end = index + 1 - } else { - end = index - } - } else { - end = len(tf) - } - // Ensure the overlapped file indexes are valid. - if begin >= end { - return nil - } - dst = make([]*tFile, end-begin) - copy(dst, tf[begin:end]) - return dst - } - dst = dst[:0] for i := 0; i < len(tf); { t := tf[i] @@ -262,9 +193,11 @@ func (tf tFiles) getOverlaps(dst tFiles, icmp *iComparer, umin, umax []byte, ove } else if umax != nil && icmp.uCompare(t.imax.ukey(), umax) > 0 { umax = t.imax.ukey() // Restart search if it is overlapped. - dst = dst[:0] - i = 0 - continue + if overlapped { + dst = dst[:0] + i = 0 + continue + } } dst = append(dst, t) @@ -483,15 +416,15 @@ func (t *tOps) newIterator(f *tFile, slice *util.Range, ro *opt.ReadOptions) ite // Removes table from persistent storage. It waits until // no one use the the table. -func (t *tOps) remove(fd storage.FileDesc) { - t.cache.Delete(0, uint64(fd.Num), func() { - if err := t.s.stor.Remove(fd); err != nil { - t.s.logf("table@remove removing @%d %q", fd.Num, err) +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", fd.Num) + t.s.logf("table@remove removed @%d", f.fd.Num) } if t.evictRemoved && t.bcache != nil { - t.bcache.EvictNS(uint64(fd.Num)) + t.bcache.EvictNS(uint64(f.fd.Num)) } }) } diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/version.go b/vendor/github.com/syndtr/goleveldb/leveldb/version.go index 2664560e..73f272af 100644 --- a/vendor/github.com/syndtr/goleveldb/leveldb/version.go +++ b/vendor/github.com/syndtr/goleveldb/leveldb/version.go @@ -9,7 +9,6 @@ package leveldb import ( "fmt" "sync/atomic" - "time" "unsafe" "github.com/syndtr/goleveldb/leveldb/iterator" @@ -23,8 +22,7 @@ type tSet struct { } type version struct { - id int64 // unique monotonous increasing version id - s *session + s *session levels []tFiles @@ -41,11 +39,8 @@ type version struct { released bool } -// newVersion creates a new version with an unique monotonous increasing id. func newVersion(s *session) *version { - id := atomic.AddInt64(&s.ntVersionId, 1) - nv := &version{s: s, id: id - 1} - return nv + return &version{s: s} } func (v *version) incref() { @@ -55,11 +50,11 @@ func (v *version) incref() { v.ref++ if v.ref == 1 { - select { - case v.s.refCh <- &vTask{vid: v.id, files: v.levels, created: time.Now()}: - // We can use v.levels directly here since it is immutable. - case <-v.s.closeC: - v.s.log("reference loop already exist") + // Incr file ref. + for _, tt := range v.levels { + for _, t := range tt { + v.s.addFileRef(t.fd, 1) + } } } } @@ -71,11 +66,13 @@ func (v *version) releaseNB() { } else if v.ref < 0 { panic("negative version ref") } - select { - case v.s.relCh <- &vTask{vid: v.id, files: v.levels, created: time.Now()}: - // We can use v.levels directly here since it is immutable. - case <-v.s.closeC: - v.s.log("reference loop already exist") + + 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 @@ -276,10 +273,10 @@ func (v *version) newStaging() *versionStaging { } // Spawn a new version based on this version. -func (v *version) spawn(r *sessionRecord, trivial bool) *version { +func (v *version) spawn(r *sessionRecord) *version { staging := v.newStaging() staging.commit(r) - return staging.finish(trivial) + return staging.finish() } func (v *version) fillRecord(r *sessionRecord) { @@ -449,7 +446,7 @@ func (p *versionStaging) commit(r *sessionRecord) { } } -func (p *versionStaging) finish(trivial bool) *version { +func (p *versionStaging) finish() *version { // Build new version. nv := newVersion(p.base.s) numLevel := len(p.levels) @@ -466,12 +463,6 @@ func (p *versionStaging) finish(trivial bool) *version { if level < len(p.levels) { scratch := p.levels[level] - // Short circuit if there is no change at all. - if len(scratch.added) == 0 && len(scratch.deleted) == 0 { - nv.levels[level] = baseTabels - continue - } - var nt tFiles // Prealloc list if possible. if n := len(baseTabels) + len(scratch.added) - len(scratch.deleted); n > 0 { @@ -489,41 +480,6 @@ func (p *versionStaging) finish(trivial bool) *version { nt = append(nt, t) } - // Avoid resort if only files in this level are deleted - if len(scratch.added) == 0 { - nv.levels[level] = nt - continue - } - - // For normal table compaction, one compaction will only involve two levels - // of files. And the new files generated after merging the source level and - // source+1 level related files can be inserted as a whole into source+1 level - // without any overlap with the other source+1 files. - // - // When the amount of data maintained by leveldb is large, the number of files - // per level will be very large. While qsort is very inefficient for sorting - // already ordered arrays. Therefore, for the normal table compaction, we use - // binary search here to find the insert index to insert a batch of new added - // files directly instead of using qsort. - if trivial && len(scratch.added) > 0 { - added := make(tFiles, 0, len(scratch.added)) - for _, r := range scratch.added { - added = append(added, tableFileFromRecord(r)) - } - if level == 0 { - added.sortByNum() - index := nt.searchNumLess(added[len(added)-1].fd.Num) - nt = append(nt[:index], append(added, nt[index:]...)...) - } else { - added.sortByKey(p.base.s.icmp) - _, amax := added.getRange(p.base.s.icmp) - index := nt.searchMin(p.base.s.icmp, amax) - nt = append(nt[:index], append(added, nt[index:]...)...) - } - nv.levels[level] = nt - continue - } - // New tables. for _, r := range scratch.added { nt = append(nt, tableFileFromRecord(r)) diff --git a/vendor/github.com/vulcanize/vulcanizedb/pkg/config/contract.go b/vendor/github.com/vulcanize/vulcanizedb/pkg/config/contract.go index 50b8366a..e05317eb 100644 --- a/vendor/github.com/vulcanize/vulcanizedb/pkg/config/contract.go +++ b/vendor/github.com/vulcanize/vulcanizedb/pkg/config/contract.go @@ -17,10 +17,11 @@ package config import ( + "strings" + log "github.com/sirupsen/logrus" "github.com/spf13/viper" "github.com/vulcanize/vulcanizedb/pkg/geth" - "strings" ) // Config struct for generic contract transformer diff --git a/vendor/github.com/vulcanize/vulcanizedb/pkg/config/subscription.go b/vendor/github.com/vulcanize/vulcanizedb/pkg/config/subscription.go new file mode 100644 index 00000000..2aea5d06 --- /dev/null +++ b/vendor/github.com/vulcanize/vulcanizedb/pkg/config/subscription.go @@ -0,0 +1,59 @@ +// VulcanizeDB +// Copyright © 2019 Vulcanize + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero 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 Affero General Public License for more details. + +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package config + +// Subscription config is used by a subscribing transformer to specifiy which data to receive from the seed node +type Subscription struct { + BackFill bool + BackFillOnly bool + StartingBlock int64 + EndingBlock int64 // set to 0 or a negative value to have no ending block + HeaderFilter HeaderFilter + TrxFilter TrxFilter + ReceiptFilter ReceiptFilter + StateFilter StateFilter + StorageFilter StorageFilter +} + +type HeaderFilter struct { + Off bool + FinalOnly bool +} + +type TrxFilter struct { + Off bool + Src []string + Dst []string +} + +type ReceiptFilter struct { + Off bool + Topic0s []string +} + +type StateFilter struct { + Off bool + Addresses []string // is converted to state key by taking its keccak256 hash + IntermediateNodes bool +} + +type StorageFilter struct { + Off bool + Addresses []string + StorageKeys []string + IntermediateNodes bool +} \ No newline at end of file diff --git a/vendor/github.com/vulcanize/vulcanizedb/pkg/core/blockchain.go b/vendor/github.com/vulcanize/vulcanizedb/pkg/core/blockchain.go index be2fe9eb..e77fabe3 100644 --- a/vendor/github.com/vulcanize/vulcanizedb/pkg/core/blockchain.go +++ b/vendor/github.com/vulcanize/vulcanizedb/pkg/core/blockchain.go @@ -17,9 +17,10 @@ package core import ( - "github.com/ethereum/go-ethereum/common" "math/big" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/core/types" ) @@ -30,7 +31,7 @@ type BlockChain interface { GetBlockByNumber(blockNumber int64) (Block, error) GetEthLogsWithCustomQuery(query ethereum.FilterQuery) ([]types.Log, error) GetHeaderByNumber(blockNumber int64) (Header, error) - GetHeaderByNumbers(blockNumbers []int64) ([]Header, error) + GetHeadersByNumbers(blockNumbers []int64) ([]Header, error) GetLogs(contract Contract, startingBlockNumber *big.Int, endingBlockNumber *big.Int) ([]Log, error) GetTransactions(transactionHashes []common.Hash) ([]TransactionModel, error) LastBlock() (*big.Int, error) diff --git a/vendor/github.com/vulcanize/vulcanizedb/pkg/geth/blockchain.go b/vendor/github.com/vulcanize/vulcanizedb/pkg/geth/blockchain.go index dbddc0dd..1c9a34e7 100644 --- a/vendor/github.com/vulcanize/vulcanizedb/pkg/geth/blockchain.go +++ b/vendor/github.com/vulcanize/vulcanizedb/pkg/geth/blockchain.go @@ -79,7 +79,7 @@ func (blockChain *BlockChain) GetHeaderByNumber(blockNumber int64) (header core. return blockChain.getPOWHeader(blockNumber) } -func (blockChain *BlockChain) GetHeaderByNumbers(blockNumbers []int64) (header []core.Header, err error) { +func (blockChain *BlockChain) GetHeadersByNumbers(blockNumbers []int64) (header []core.Header, err error) { if blockChain.node.NetworkID == core.KOVAN_NETWORK_ID { return blockChain.getPOAHeaders(blockNumbers) } diff --git a/vendor/github.com/vulcanize/vulcanizedb/pkg/geth/client/eth_client.go b/vendor/github.com/vulcanize/vulcanizedb/pkg/geth/client/eth_client.go index fca30d39..4e66efa2 100644 --- a/vendor/github.com/vulcanize/vulcanizedb/pkg/geth/client/eth_client.go +++ b/vendor/github.com/vulcanize/vulcanizedb/pkg/geth/client/eth_client.go @@ -18,11 +18,12 @@ package client import ( "context" + "math/big" + "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/ethclient" - "math/big" ) type EthClient struct { diff --git a/vendor/github.com/vulcanize/vulcanizedb/pkg/geth/client/rpc_client.go b/vendor/github.com/vulcanize/vulcanizedb/pkg/geth/client/rpc_client.go index ae657f5d..98dc7f36 100644 --- a/vendor/github.com/vulcanize/vulcanizedb/pkg/geth/client/rpc_client.go +++ b/vendor/github.com/vulcanize/vulcanizedb/pkg/geth/client/rpc_client.go @@ -78,13 +78,13 @@ func (client RpcClient) BatchCall(batch []BatchElem) error { Args: batchElem.Args, Error: batchElem.Error, } - rpcBatch = append(rpcBatch, newBatchElem) } return client.client.BatchCall(rpcBatch) } -// Subscribe subscribes to a geth websocket "namespace_subscribe" subscription with the given channel +// Subscribe subscribes to an rpc "namespace_subscribe" subscription with the given channel +// The first argument needs to be the method we wish to invoke func (client RpcClient) Subscribe(namespace string, payloadChan interface{}, args ...interface{}) (*rpc.ClientSubscription, error) { chanVal := reflect.ValueOf(payloadChan) if chanVal.Kind() != reflect.Chan || chanVal.Type().ChanDir()&reflect.SendDir == 0 { @@ -93,5 +93,5 @@ func (client RpcClient) Subscribe(namespace string, payloadChan interface{}, arg if chanVal.IsNil() { return nil, errors.New("channel given to Subscribe must not be nil") } - return client.client.Subscribe(context.Background(), namespace, payloadChan, args) + return client.client.Subscribe(context.Background(), namespace, payloadChan, args...) } diff --git a/vendor/github.com/whyrusleeping/cbor/go/Makefile b/vendor/github.com/whyrusleeping/cbor/go/Makefile deleted file mode 100644 index 5330af63..00000000 --- a/vendor/github.com/whyrusleeping/cbor/go/Makefile +++ /dev/null @@ -1,12 +0,0 @@ -#PATH:=${HOME}/psrc/golang/go/bin:${PATH} -#PATH += ${HOME}/psrc/golang/go/bin -GOROOT=${HOME}/psrc/golang/go -GOPATH=${HOME}/psrc/gopath - -GO=${GOROOT}/bin/go - -all: - ${GO} build - -test: - ${GO} test diff --git a/vendor/github.com/whyrusleeping/cbor/go/cbor.go b/vendor/github.com/whyrusleeping/cbor/go/cbor.go deleted file mode 100644 index f9a92bc6..00000000 --- a/vendor/github.com/whyrusleeping/cbor/go/cbor.go +++ /dev/null @@ -1,1625 +0,0 @@ -// Should be roughly like encoding/gob -// encoding/json has an inferior interface that only works on whole messages to/from whole blobs at once. Reader/Writer based interfaces are better. - -package cbor - -import ( - "bytes" - "errors" - "fmt" - "io" - "log" - "math" - "math/big" - "reflect" - "sort" - "strings" -) - -var typeMask byte = 0xE0 -var infoBits byte = 0x1F - -const ( - MajorTypeUint byte = 0 - MajorTypeNegInt byte = iota - MajorTypeBytes - MajorTypeText - MajorTypeArray - MajorTypeMap - MajorTypeTag - MajorTypeSimple - MajorTypeFloat byte = MajorTypeSimple -) - -const ( - SimpleValueFalse byte = 20 - SimpleValueTrue byte = iota - SimpleValueNull - SimpleValueUndefined -) - -const ( - OpcodeBreak byte = 0x1F -) - -/* type values */ -var cborUint byte = 0x00 -var cborNegint byte = 0x20 -var cborBytes byte = 0x40 -var cborText byte = 0x60 -var cborArray byte = 0x80 -var cborMap byte = 0xA0 -var cborTag byte = 0xC0 -var cbor7 byte = 0xE0 - -/* cbor7 values */ -const ( - cborFalse byte = 20 - cborTrue byte = 21 - cborNull byte = 22 -) - -/* info bits */ -var int8Follows byte = 24 -var int16Follows byte = 25 -var int32Follows byte = 26 -var int64Follows byte = 27 -var varFollows byte = 31 - -/* tag values */ -var tagBignum uint64 = 2 -var tagNegBignum uint64 = 3 -var tagDecimal uint64 = 4 -var tagBigfloat uint64 = 5 - -/* batch sizes */ -var byteBatch = 1 << 20 -var arrayBatch = 1 << 14 //16k - -// TODO: honor encoding.BinaryMarshaler interface and encapsulate blob returned from that. - -// Load one object into v -func Loads(blob []byte, v interface{}) error { - dec := NewDecoder(bytes.NewReader(blob)) - return dec.Decode(v) -} - -type TagDecoder interface { - // Handle things which match this. - // - // Setup like this: - // var dec Decoder - // var myTagDec TagDecoder - // dec.TagDecoders[myTagDec.GetTag()] = myTagDec - GetTag() uint64 - - // Sub-object will be decoded onto the returned object. - DecodeTarget() interface{} - - // Run after decode onto DecodeTarget has happened. - // The return value from this is returned in place of the - // raw decoded object. - PostDecode(interface{}) (interface{}, error) -} - -type Decoder struct { - reader io.Reader - - // tag byte - tag []byte - - // many values fit within the next 8 bytes - b8 []byte - - // Extra processing for CBOR TAG objects. - TagDecoders map[uint64]TagDecoder -} - -func NewDecoder(r io.Reader) *Decoder { - return &Decoder{ - reader: r, - tag: make([]byte, 1), - b8: make([]byte, 8), - TagDecoders: make(map[uint64]TagDecoder), - } -} -func (dec *Decoder) Decode(v interface{}) error { - rv := reflect.ValueOf(v) - - return dec.DecodeAny(newReflectValue(rv)) -} - -type DecodeValue interface { - // Before decoding, check if there is no error - Prepare() error - - // Got binary string - SetBytes(buf []byte) error - - // Got a number (different formats) - SetBignum(x *big.Int) error - SetUint(u uint64) error - SetInt(i int64) error - SetFloat32(f float32) error - SetFloat64(d float64) error - - // Got null - SetNil() error - - // Got boolean - SetBool(b bool) error - - // Got text string - SetString(s string) error - - // Got a Map (beginning) - CreateMap() (DecodeValueMap, error) - - // Got an array (beginning) - CreateArray(makeLength int) (DecodeValueArray, error) - - // Got a tag - CreateTag(aux uint64, decoder TagDecoder) (DecodeValue, interface{}, error) - - // Got the tag value (maybe transformed by TagDecoder.PostDecode) - SetTag(aux uint64, v DecodeValue, decoder TagDecoder, i interface{}) error -} - -type DecodeValueMap interface { - // Got a map key - CreateMapKey() (DecodeValue, error) - - // Got a map value - CreateMapValue(key DecodeValue) (DecodeValue, error) - - // Got a key / value pair - SetMap(key, val DecodeValue) error - - // The map is at the end - EndMap() error -} - -type DecodeValueArray interface { - // Got an array item - GetArrayValue(index uint64) (DecodeValue, error) - - // After the array item is decoded - AppendArray(value DecodeValue) error - - // The array is at the end - EndArray() error -} - -type reflectValue struct { - v reflect.Value -} - -type MemoryValue struct { - reflectValue - Value interface{} -} - -func NewMemoryValue(value interface{}) *MemoryValue { - res := &MemoryValue{ - reflectValue{reflect.ValueOf(nil)}, - value, - } - res.v = reflect.ValueOf(&res.Value) - return res -} - -func (mv *MemoryValue) ReflectValue() reflect.Value { - return mv.v -} - -func newReflectValue(rv reflect.Value) *reflectValue { - return &reflectValue{rv} -} - -func (r *reflectValue) Prepare() error { - rv := r.v - if (!rv.CanSet()) && (rv.Kind() != reflect.Ptr || rv.IsNil()) { - return &InvalidUnmarshalError{rv.Type()} - } - return nil -} - -func (dec *Decoder) DecodeAny(v DecodeValue) error { - var err error - - _, err = io.ReadFull(dec.reader, dec.tag) - if err != nil { - return err - } - - if err := v.Prepare(); err != nil { - return err - } - - return dec.innerDecodeC(v, dec.tag[0]) -} - -func (dec *Decoder) handleInfoBits(cborInfo byte) (uint64, error) { - var aux uint64 - - if cborInfo <= 23 { - aux = uint64(cborInfo) - return aux, nil - } else if cborInfo == int8Follows { - didread, err := io.ReadFull(dec.reader, dec.b8[:1]) - if didread == 1 { - aux = uint64(dec.b8[0]) - } - return aux, err - } else if cborInfo == int16Follows { - didread, err := io.ReadFull(dec.reader, dec.b8[:2]) - if didread == 2 { - aux = (uint64(dec.b8[0]) << 8) | uint64(dec.b8[1]) - } - return aux, err - } else if cborInfo == int32Follows { - didread, err := io.ReadFull(dec.reader, dec.b8[:4]) - if didread == 4 { - aux = (uint64(dec.b8[0]) << 24) | - (uint64(dec.b8[1]) << 16) | - (uint64(dec.b8[2]) << 8) | - uint64(dec.b8[3]) - } - return aux, err - } else if cborInfo == int64Follows { - didread, err := io.ReadFull(dec.reader, dec.b8) - if didread == 8 { - var shift uint = 56 - i := 0 - aux = uint64(dec.b8[i]) << shift - for i < 7 { - i += 1 - shift -= 8 - aux |= uint64(dec.b8[i]) << shift - } - } - return aux, err - } - return 0, nil -} - -func (dec *Decoder) innerDecodeC(rv DecodeValue, c byte) error { - cborType := c & typeMask - cborInfo := c & infoBits - - aux, err := dec.handleInfoBits(cborInfo) - if err != nil { - log.Printf("error in handleInfoBits: %v", err) - return err - } - //log.Printf("cborType %x cborInfo %d aux %x", cborType, cborInfo, aux) - - if cborType == cborUint { - return rv.SetUint(aux) - } else if cborType == cborNegint { - if aux > 0x7fffffffffffffff { - //return errors.New(fmt.Sprintf("cannot represent -%d", aux)) - bigU := &big.Int{} - bigU.SetUint64(aux) - minusOne := big.NewInt(-1) - bn := &big.Int{} - bn.Sub(minusOne, bigU) - //log.Printf("built big negint: %v", bn) - return rv.SetBignum(bn) - } - return rv.SetInt(-1 - int64(aux)) - } else if cborType == cborBytes { - //log.Printf("cborType %x bytes cborInfo %d aux %x", cborType, cborInfo, aux) - if cborInfo == varFollows { - parts := make([][]byte, 0, 1) - allsize := 0 - subc := []byte{0} - for true { - _, err = io.ReadFull(dec.reader, subc) - if err != nil { - log.Printf("error reading next byte for bar bytes") - return err - } - if subc[0] == 0xff { - // done - var out []byte = nil - if len(parts) == 0 { - out = make([]byte, 0) - } else { - pos := 0 - out = make([]byte, allsize) - for _, p := range parts { - pos += copy(out[pos:], p) - } - } - return rv.SetBytes(out) - } else { - var subb []byte = nil - if (subc[0] & typeMask) != cborBytes { - return fmt.Errorf("sub of var bytes is type %x, wanted %x", subc[0], cborBytes) - } - err = dec.innerDecodeC(newReflectValue(reflect.ValueOf(&subb)), subc[0]) - if err != nil { - log.Printf("error decoding sub bytes") - return err - } - allsize += len(subb) - parts = append(parts, subb) - } - } - } else { - val, err := dec.readBytes(aux) - if err != nil { - return err - } - return rv.SetBytes(val) - } - } else if cborType == cborText { - return dec.decodeText(rv, cborInfo, aux) - } else if cborType == cborArray { - return dec.decodeArray(rv, cborInfo, aux) - } else if cborType == cborMap { - return dec.decodeMap(rv, cborInfo, aux) - } else if cborType == cborTag { - /*var innerOb interface{}*/ - ic := []byte{0} - _, err = io.ReadFull(dec.reader, ic) - if err != nil { - return err - } - if aux == tagBignum { - bn, err := dec.decodeBignum(ic[0]) - if err != nil { - return err - } - return rv.SetBignum(bn) - } else if aux == tagNegBignum { - bn, err := dec.decodeBignum(ic[0]) - if err != nil { - return err - } - minusOne := big.NewInt(-1) - bnOut := &big.Int{} - bnOut.Sub(minusOne, bn) - return rv.SetBignum(bnOut) - } else if aux == tagDecimal { - log.Printf("TODO: directly read bytes into decimal") - } else if aux == tagBigfloat { - log.Printf("TODO: directly read bytes into bigfloat") - } else { - decoder := dec.TagDecoders[aux] - var target interface{} - var trv DecodeValue - var err error - - trv, target, err = rv.CreateTag(aux, decoder) - if err != nil { - return err - } - - err = dec.innerDecodeC(trv, ic[0]) - if err != nil { - return err - } - - return rv.SetTag(aux, trv, decoder, target) - } - return nil - } else if cborType == cbor7 { - if cborInfo == int16Follows { - exp := (aux >> 10) & 0x01f - mant := aux & 0x03ff - var val float64 - if exp == 0 { - val = math.Ldexp(float64(mant), -24) - } else if exp != 31 { - val = math.Ldexp(float64(mant+1024), int(exp-25)) - } else if mant == 0 { - val = math.Inf(1) - } else { - val = math.NaN() - } - if (aux & 0x08000) != 0 { - val = -val - } - return rv.SetFloat64(val) - } else if cborInfo == int32Follows { - f := math.Float32frombits(uint32(aux)) - return rv.SetFloat32(f) - } else if cborInfo == int64Follows { - d := math.Float64frombits(aux) - return rv.SetFloat64(d) - } else if cborInfo == cborFalse { - return rv.SetBool(false) - } else if cborInfo == cborTrue { - return rv.SetBool(true) - } else if cborInfo == cborNull { - return rv.SetNil() - } - } - - return err -} - -func (dec *Decoder) decodeText(rv DecodeValue, cborInfo byte, aux uint64) error { - var err error - if cborInfo == varFollows { - parts := make([]string, 0, 1) - subc := []byte{0} - for true { - _, err = io.ReadFull(dec.reader, subc) - if err != nil { - log.Printf("error reading next byte for var text") - return err - } - if subc[0] == 0xff { - // done - joined := strings.Join(parts, "") - return rv.SetString(joined) - } else { - var subtext interface{} - err = dec.innerDecodeC(newReflectValue(reflect.ValueOf(&subtext)), subc[0]) - if err != nil { - log.Printf("error decoding subtext") - return err - } - st, ok := subtext.(string) - if ok { - parts = append(parts, st) - } else { - return fmt.Errorf("var text sub element not text but %T", subtext) - } - } - } - } else { - raw, err := dec.readBytes(aux) - if err != nil { - return err - } - xs := string(raw) - return rv.SetString(xs) - } - return errors.New("internal error in decodeText, shouldn't get here") -} - -func (dec *Decoder) readBytes(n uint64) ([]byte, error) { - buf := new(bytes.Buffer) - r, err := buf.ReadFrom(&io.LimitedReader{R: dec.reader, N: int64(n)}) - if err != nil { - return nil, err - } - - if r != int64(n) { - return nil, io.ErrUnexpectedEOF - } - return buf.Bytes(), nil -} - -type mapAssignable interface { - ReflectValueForKey(key interface{}) (*reflect.Value, bool) - SetReflectValueForKey(key interface{}, value reflect.Value) error -} - -type mapReflectValue struct { - reflect.Value -} - -func (irv *mapReflectValue) ReflectValueForKey(key interface{}) (*reflect.Value, bool) { - //var x interface{} - //rv := reflect.ValueOf(&x) - rv := reflect.New(irv.Type().Elem()) - return &rv, true -} -func (irv *mapReflectValue) SetReflectValueForKey(key interface{}, value reflect.Value) error { - //log.Printf("k T %T v%#v, v T %s v %#v", key, key, value.Type().String(), value.Interface()) - krv := reflect.Indirect(reflect.ValueOf(key)) - vrv := reflect.Indirect(value) - //log.Printf("irv T %s v %#v", irv.Type().String(), irv.Interface()) - //log.Printf("k T %s v %#v, v T %s v %#v", krv.Type().String(), krv.Interface(), vrv.Type().String(), vrv.Interface()) - if krv.Kind() == reflect.Interface { - krv = krv.Elem() - //log.Printf("ke T %s v %#v", krv.Type().String(), krv.Interface()) - } - if (krv.Kind() == reflect.Slice) || (krv.Kind() == reflect.Array) { - //log.Printf("key is slice or array") - if krv.Type().Elem().Kind() == reflect.Uint8 { - //log.Printf("key is []uint8") - ks := string(krv.Bytes()) - krv = reflect.ValueOf(ks) - } - } - irv.SetMapIndex(krv, vrv) - - return nil -} - -type structAssigner struct { - Srv reflect.Value - - //keyType reflect.Type -} - -func (sa *structAssigner) ReflectValueForKey(key interface{}) (*reflect.Value, bool) { - var skey string - switch tkey := key.(type) { - case string: - skey = tkey - case *string: - skey = *tkey - default: - log.Printf("rvfk key is not string, got %T", key) - return nil, false - } - - ft := sa.Srv.Type() - numFields := ft.NumField() - for i := 0; i < numFields; i++ { - sf := ft.Field(i) - fieldname, ok := fieldname(sf) - if !ok { - continue - } - if (fieldname == skey) || strings.EqualFold(fieldname, skey) { - fieldVal := sa.Srv.FieldByName(sf.Name) - if !fieldVal.CanSet() { - log.Printf("cannot set field %s for key %s", sf.Name, skey) - return nil, false - } - return &fieldVal, true - } - } - return nil, false -} -func (sa *structAssigner) SetReflectValueForKey(key interface{}, value reflect.Value) error { - return nil -} - -func (dec *Decoder) setMapKV(dvm DecodeValueMap, krv DecodeValue) error { - var err error - val, err := dvm.CreateMapValue(krv) - if err != nil { - var throwaway interface{} - err = dec.Decode(&throwaway) - if err != nil { - return err - } - return nil - } - err = dec.DecodeAny(val) - if err != nil { - log.Printf("error decoding map val: T %T v %#v", val, val) - return err - } - err = dvm.SetMap(krv, val) - if err != nil { - log.Printf("error setting value") - return err - } - - return nil -} - -func (r *reflectValue) CreateMap() (DecodeValueMap, error) { - rv := r.v - var drv reflect.Value - if rv.Kind() == reflect.Ptr { - drv = reflect.Indirect(rv) - } else { - drv = rv - } - //log.Print("decode map into d ", drv.Type().String()) - - // inner reflect value - var irv reflect.Value - var ma mapAssignable - - var keyType reflect.Type - - switch drv.Kind() { - case reflect.Interface: - //log.Print("decode map into interface ", drv.Type().String()) - // TODO: maybe I should make this map[string]interface{} - nob := make(map[interface{}]interface{}) - irv = reflect.ValueOf(nob) - ma = &mapReflectValue{irv} - keyType = irv.Type().Key() - case reflect.Struct: - //log.Print("decode map into struct ", drv.Type().String()) - ma = &structAssigner{drv} - keyType = reflect.TypeOf("") - case reflect.Map: - //log.Print("decode map into map ", drv.Type().String()) - if drv.IsNil() { - if drv.CanSet() { - drv.Set(reflect.MakeMap(drv.Type())) - } else { - return nil, fmt.Errorf("target map is nil and not settable") - } - } - keyType = drv.Type().Key() - ma = &mapReflectValue{drv} - default: - return nil, fmt.Errorf("can't read map into %s", rv.Type().String()) - } - - return &reflectValueMap{drv, irv, ma, keyType}, nil -} - -type reflectValueMap struct { - drv reflect.Value - irv reflect.Value - ma mapAssignable - keyType reflect.Type -} - -func (r *reflectValueMap) CreateMapKey() (DecodeValue, error) { - return newReflectValue(reflect.New(r.keyType)), nil -} - -func (r *reflectValueMap) CreateMapValue(key DecodeValue) (DecodeValue, error) { - var err error - v, ok := r.ma.ReflectValueForKey(key.(*reflectValue).v.Interface()) - if !ok { - err = fmt.Errorf("Could not reflect value for key") - } - return newReflectValue(*v), err -} - -func (r *reflectValueMap) SetMap(key, val DecodeValue) error { - return r.ma.SetReflectValueForKey(key.(*reflectValue).v.Interface(), val.(*reflectValue).v) -} - -func (r *reflectValueMap) EndMap() error { - if r.drv.Kind() == reflect.Interface { - r.drv.Set(r.irv) - } - return nil -} - -func (dec *Decoder) decodeMap(rv DecodeValue, cborInfo byte, aux uint64) error { - //log.Print("decode map into ", rv.Type().String()) - // dereferenced reflect value - var dvm DecodeValueMap - var err error - - dvm, err = rv.CreateMap() - if err != nil { - return err - } - - if cborInfo == varFollows { - subc := []byte{0} - for true { - _, err = io.ReadFull(dec.reader, subc) - if err != nil { - log.Printf("error reading next byte for var text") - return err - } - if subc[0] == 0xff { - // Done - break - } else { - //var key interface{} - krv, err := dvm.CreateMapKey() - if err != nil { - return err - } - //var val interface{} - err = dec.innerDecodeC(krv, subc[0]) - if err != nil { - log.Printf("error decoding map key V, %s", err) - return err - } - - err = dec.setMapKV(dvm, krv) - if err != nil { - return err - } - } - } - } else { - var i uint64 - for i = 0; i < aux; i++ { - //var key interface{} - krv, err := dvm.CreateMapKey() - if err != nil { - return err - } - //var val interface{} - //err = dec.Decode(&key) - err = dec.DecodeAny(krv) - if err != nil { - log.Printf("error decoding map key #, %s", err) - return err - } - err = dec.setMapKV(dvm, krv) - if err != nil { - return err - } - } - } - - return dvm.EndMap() -} - -func (r *reflectValue) CreateArray(makeLength int) (DecodeValueArray, error) { - var rv reflect.Value = r.v - - if rv.Kind() == reflect.Ptr { - rv = reflect.Indirect(rv) - } - - // inner reflect value - var irv reflect.Value - var elemType reflect.Type - - switch rv.Kind() { - case reflect.Interface: - // make a slice - nob := make([]interface{}, 0, makeLength) - irv = reflect.ValueOf(nob) - elemType = irv.Type().Elem() - case reflect.Slice: - // we have a slice - irv = rv - elemType = irv.Type().Elem() - case reflect.Array: - // no irv, no elemType - default: - return nil, fmt.Errorf("can't read array into %s", rv.Type().String()) - } - - return &reflectValueArray{rv, makeLength, irv, elemType, 0}, nil -} - -type reflectValueArray struct { - rv reflect.Value - makeLength int - irv reflect.Value - elemType reflect.Type - arrayPos int -} - -func (r *reflectValueArray) GetArrayValue(index uint64) (DecodeValue, error) { - if r.rv.Kind() == reflect.Array { - return &reflectValue{r.rv.Index(r.arrayPos)}, nil - } else { - return &reflectValue{reflect.New(r.elemType)}, nil - } -} - -func (r *reflectValueArray) AppendArray(subrv DecodeValue) error { - if r.rv.Kind() == reflect.Array { - r.arrayPos++ - } else { - r.irv = reflect.Append(r.irv, reflect.Indirect(subrv.(*reflectValue).v)) - } - return nil -} - -func (r *reflectValueArray) EndArray() error { - if r.rv.Kind() != reflect.Array { - r.rv.Set(r.irv) - } - return nil -} - -func (dec *Decoder) decodeArray(rv DecodeValue, cborInfo byte, aux uint64) error { - - var err error - var dva DecodeValueArray - - var makeLength int = 0 - if cborInfo == varFollows { - // no special capacity to allocate the slice to - } else { - makeLength = int(aux) - } - - dva, err = rv.CreateArray(int(min(uint64(makeLength), uint64(arrayBatch)))) - if err != nil { - return err - } - - if cborInfo == varFollows { - //log.Printf("var array") - subc := []byte{0} - var idx uint64 = 0 - for true { - _, err = io.ReadFull(dec.reader, subc) - if err != nil { - log.Printf("error reading next byte for var text") - return err - } - if subc[0] == 0xff { - // Done - break - } - subrv, err := dva.GetArrayValue(idx) - if err != nil { - return err - } - err = dec.innerDecodeC(subrv, subc[0]) - if err != nil { - log.Printf("error decoding array subob") - return err - } - err = dva.AppendArray(subrv) - if err != nil { - return err - } - idx++ - } - } else { - var i uint64 - for i = 0; i < aux; i++ { - subrv, err := dva.GetArrayValue(i) - if err != nil { - return err - } - err = dec.DecodeAny(subrv) - if err != nil { - log.Printf("error decoding array subob") - return err - } - err = dva.AppendArray(subrv) - if err != nil { - return err - } - } - } - - return dva.EndArray() -} - -func (dec *Decoder) decodeBignum(c byte) (*big.Int, error) { - cborType := c & typeMask - cborInfo := c & infoBits - - aux, err := dec.handleInfoBits(cborInfo) - if err != nil { - log.Printf("error in bignum handleInfoBits: %v", err) - return nil, err - } - //log.Printf("bignum cborType %x cborInfo %d aux %x", cborType, cborInfo, aux) - - if cborType != cborBytes { - return nil, fmt.Errorf("attempting to decode bignum but sub object is not bytes but type %x", cborType) - } - - rawbytes, err := dec.readBytes(aux) - if err != nil { - return nil, err - } - - bn := big.NewInt(0) - littleBig := &big.Int{} - d := &big.Int{} - for _, bv := range rawbytes { - d.Lsh(bn, 8) - littleBig.SetUint64(uint64(bv)) - bn.Or(d, littleBig) - } - - return bn, nil -} - -func (r *reflectValue) SetBignum(x *big.Int) error { - rv := r.v - switch rv.Kind() { - case reflect.Ptr: - return newReflectValue(reflect.Indirect(rv)).SetBignum(x) - case reflect.Interface: - rv.Set(reflect.ValueOf(*x)) - return nil - case reflect.Int32: - if x.BitLen() < 32 { - rv.SetInt(x.Int64()) - return nil - } else { - return fmt.Errorf("int too big for int32 target") - } - case reflect.Int, reflect.Int64: - if x.BitLen() < 64 { - rv.SetInt(x.Int64()) - return nil - } else { - return fmt.Errorf("int too big for int64 target") - } - default: - return fmt.Errorf("cannot assign bignum into Kind=%s Type=%s %#v", rv.Kind().String(), rv.Type().String(), rv) - } -} - -func (r *reflectValue) SetBytes(buf []byte) error { - rv := r.v - switch rv.Kind() { - case reflect.Ptr: - return newReflectValue(reflect.Indirect(rv)).SetBytes(buf) - case reflect.Interface: - rv.Set(reflect.ValueOf(buf)) - return nil - case reflect.Slice: - if rv.Type().Elem().Kind() == reflect.Uint8 { - rv.SetBytes(buf) - return nil - } else { - return fmt.Errorf("cannot write []byte to k=%s %s", rv.Kind().String(), rv.Type().String()) - } - case reflect.String: - rv.Set(reflect.ValueOf(string(buf))) - return nil - default: - return fmt.Errorf("cannot assign []byte into Kind=%s Type=%s %#v", rv.Kind().String(), "" /*rv.Type().String()*/, rv) - } -} - -func (r *reflectValue) SetUint(u uint64) error { - rv := r.v - switch rv.Kind() { - case reflect.Ptr: - if rv.IsNil() { - if rv.CanSet() { - rv.Set(reflect.New(rv.Type().Elem())) - // fall through to set indirect below - } else { - return fmt.Errorf("trying to put uint into unsettable nil ptr") - } - } - return newReflectValue(reflect.Indirect(rv)).SetUint(u) - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: - if rv.OverflowUint(u) { - return fmt.Errorf("value %d does not fit into target of type %s", u, rv.Kind().String()) - } - rv.SetUint(u) - return nil - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - if (u == 0xffffffffffffffff) || rv.OverflowInt(int64(u)) { - return fmt.Errorf("value %d does not fit into target of type %s", u, rv.Kind().String()) - } - rv.SetInt(int64(u)) - return nil - case reflect.Interface: - rv.Set(reflect.ValueOf(u)) - return nil - default: - return fmt.Errorf("cannot assign uint into Kind=%s Type=%#v %#v", rv.Kind().String(), rv.Type(), rv) - } -} -func (r *reflectValue) SetInt(i int64) error { - rv := r.v - switch rv.Kind() { - case reflect.Ptr: - return newReflectValue(reflect.Indirect(rv)).SetInt(i) - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - if rv.OverflowInt(i) { - return fmt.Errorf("value %d does not fit into target of type %s", i, rv.Kind().String()) - } - rv.SetInt(i) - return nil - case reflect.Interface: - rv.Set(reflect.ValueOf(i)) - return nil - default: - return fmt.Errorf("cannot assign int into Kind=%s Type=%#v %#v", rv.Kind().String(), rv.Type(), rv) - } -} -func (r *reflectValue) SetFloat32(f float32) error { - rv := r.v - switch rv.Kind() { - case reflect.Ptr: - return newReflectValue(reflect.Indirect(rv)).SetFloat32(f) - case reflect.Float32, reflect.Float64: - rv.SetFloat(float64(f)) - return nil - case reflect.Interface: - rv.Set(reflect.ValueOf(f)) - return nil - default: - return fmt.Errorf("cannot assign float32 into Kind=%s Type=%#v %#v", rv.Kind().String(), rv.Type(), rv) - } -} -func (r *reflectValue) SetFloat64(d float64) error { - rv := r.v - switch rv.Kind() { - case reflect.Ptr: - return newReflectValue(reflect.Indirect(rv)).SetFloat64(d) - case reflect.Float32, reflect.Float64: - rv.SetFloat(d) - return nil - case reflect.Interface: - rv.Set(reflect.ValueOf(d)) - return nil - default: - return fmt.Errorf("cannot assign float64 into Kind=%s Type=%#v %#v", rv.Kind().String(), rv.Type(), rv) - } -} -func (r *reflectValue) SetNil() error { - rv := r.v - switch rv.Kind() { - case reflect.Ptr: - //return setNil(reflect.Indirect(rv)) - rv.Elem().Set(reflect.Zero(rv.Elem().Type())) - case reflect.Interface: - if rv.IsNil() { - // already nil, okay! - return nil - } - rv.Set(reflect.Zero(rv.Type())) - default: - log.Printf("setNil wat %s", rv.Type()) - rv.Set(reflect.Zero(rv.Type())) - } - return nil -} - -func (r *reflectValue) SetBool(b bool) error { - rv := r.v - reflect.Indirect(rv).Set(reflect.ValueOf(b)) - return nil -} - -func (r *reflectValue) SetString(xs string) error { - rv := r.v - // handle either concrete string or string* to nil - deref := reflect.Indirect(rv) - if !deref.CanSet() { - rv.Set(reflect.ValueOf(&xs)) - } else { - deref.Set(reflect.ValueOf(xs)) - } - //reflect.Indirect(rv).Set(reflect.ValueOf(joined)) - return nil -} - -func (r *reflectValue) CreateTag(aux uint64, decoder TagDecoder) (DecodeValue, interface{}, error) { - if decoder != nil { - target := decoder.DecodeTarget() - return newReflectValue(reflect.ValueOf(target)), target, nil - } else { - target := &CBORTag{} - target.Tag = aux - return newReflectValue(reflect.ValueOf(&target.WrappedObject)), target, nil - } -} - -func (r *reflectValue) SetTag(code uint64, val DecodeValue, decoder TagDecoder, target interface{}) error { - rv := r.v - var err error - if decoder != nil { - target, err = decoder.PostDecode(target) - if err != nil { - return err - } - } - reflect.Indirect(rv).Set(reflect.ValueOf(target)) - return nil -} - -// copied from encoding/json/decode.go -// An InvalidUnmarshalError describes an invalid argument passed to Unmarshal. -// (The argument to Unmarshal must be a non-nil pointer.) -type InvalidUnmarshalError struct { - Type reflect.Type -} - -func (e *InvalidUnmarshalError) Error() string { - if e.Type == nil { - return "json: Unmarshal(nil)" - } - - if e.Type.Kind() != reflect.Ptr { - return "json: Unmarshal(non-pointer " + e.Type.String() + ")" - } - return "json: Unmarshal(nil " + e.Type.String() + ")" -} - -type CBORTag struct { - Tag uint64 - WrappedObject interface{} -} - -func (t *CBORTag) ToCBOR(w io.Writer, enc *Encoder) error { - _, err := w.Write(EncodeInt(MajorTypeTag, t.Tag, nil)) - if err != nil { - return err - } - - return enc.Encode(t.WrappedObject) -} - -type Encoder struct { - out io.Writer - filter func(v interface{}) interface{} - - scratch []byte -} - -// parse StructField.Tag.Get("json" or "cbor") -func fieldTagName(xinfo string) (string, bool) { - if len(xinfo) != 0 { - // e.g. `json:"field_name,omitempty"`, or same for cbor - // TODO: honor 'omitempty' option - jiparts := strings.Split(xinfo, ",") - if len(jiparts) > 0 { - fieldName := jiparts[0] - if len(fieldName) > 0 { - return fieldName, true - } - } - } - return "", false -} - -// Return fieldname, bool; if bool is false, don't use this field -func fieldname(fieldinfo reflect.StructField) (string, bool) { - if fieldinfo.PkgPath != "" { - // has path to private package. don't export - return "", false - } - fieldname, ok := fieldTagName(fieldinfo.Tag.Get("cbor")) - if !ok { - fieldname, ok = fieldTagName(fieldinfo.Tag.Get("json")) - } - if ok { - if fieldname == "" { - return fieldinfo.Name, true - } - if fieldname == "-" { - return "", false - } - return fieldname, true - } - return fieldinfo.Name, true -} - -// Write out an object to an io.Writer -func Encode(out io.Writer, ob interface{}) error { - return NewEncoder(out).Encode(ob) -} - -// Write out an object to a new byte slice -func Dumps(ob interface{}) ([]byte, error) { - writeTarget := &bytes.Buffer{} - writeTarget.Grow(20000) - err := Encode(writeTarget, ob) - if err != nil { - return nil, err - } - return writeTarget.Bytes(), nil -} - -type MarshallValue interface { - // Convert the value to CBOR. Specific CBOR data (such as tags) can be written - // on the io.Writer and more complex datatype can be written using the - // Encoder. - // - // To Write a Tag value, a possible implementation would be: - // - // w.Write(cbor.EncodeTag(6, tag_value)) - // enc.Encode(tagged_value) - // - ToCBOR(w io.Writer, enc *Encoder) error -} - -type SimpleMarshallValue interface { - // Convert the value to CBOR. The object is responsible to convert to CBOR - // in the correct format. - ToCBOR(w io.Writer) error -} - -type CBORValue []byte - -func (v CBORValue) ToCBOR(w io.Writer) error { - _, err := w.Write(v) - return err -} - -// Return new Encoder object for writing to supplied io.Writer. -// -// TODO: set options on Encoder object. -func NewEncoder(out io.Writer) *Encoder { - return &Encoder{out, nil, make([]byte, 9)} -} - -func (enc *Encoder) SetFilter(filter func(v interface{}) interface{}) { - enc.filter = filter -} - -func (enc *Encoder) Encode(ob interface{}) error { - if enc.filter != nil { - ob = enc.filter(ob) - } - - if v, ok := ob.(MarshallValue); ok { - return v.ToCBOR(enc.out, enc) - } else if v, ok := ob.(SimpleMarshallValue); ok { - return v.ToCBOR(enc.out) - } - - switch x := ob.(type) { - case int: - return enc.writeInt(int64(x)) - case int8: - return enc.writeInt(int64(x)) - case int16: - return enc.writeInt(int64(x)) - case int32: - return enc.writeInt(int64(x)) - case int64: - return enc.writeInt(x) - case uint: - return enc.tagAuxOut(cborUint, uint64(x)) - case uint8: /* aka byte */ - return enc.tagAuxOut(cborUint, uint64(x)) - case uint16: - return enc.tagAuxOut(cborUint, uint64(x)) - case uint32: - return enc.tagAuxOut(cborUint, uint64(x)) - case uint64: - return enc.tagAuxOut(cborUint, x) - case float32: - return enc.writeFloat(float64(x)) - case float64: - return enc.writeFloat(x) - case string: - return enc.writeText(x) - case []byte: - return enc.writeBytes(x) - case bool: - return enc.writeBool(x) - case nil: - return enc.tagAuxOut(cbor7, uint64(cborNull)) - case big.Int: - return fmt.Errorf("TODO: encode big.Int") - } - - // If none of the simple types work, try reflection - return enc.writeReflection(reflect.ValueOf(ob)) -} - -func (enc *Encoder) writeReflection(rv reflect.Value) error { - if enc.filter != nil { - rv = reflect.ValueOf(enc.filter(rv.Interface())) - } - - if !rv.IsValid() { - return enc.tagAuxOut(cbor7, uint64(cborNull)) - } - - if v, ok := rv.Interface().(MarshallValue); ok { - return v.ToCBOR(enc.out, enc) - } else if v, ok := rv.Interface().(SimpleMarshallValue); ok { - return v.ToCBOR(enc.out) - } - - var err error - switch rv.Kind() { - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - return enc.writeInt(rv.Int()) - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: - return enc.tagAuxOut(cborUint, rv.Uint()) - case reflect.Float32, reflect.Float64: - return enc.writeFloat(rv.Float()) - case reflect.Bool: - return enc.writeBool(rv.Bool()) - case reflect.String: - return enc.writeText(rv.String()) - case reflect.Slice, reflect.Array: - elemType := rv.Type().Elem() - if elemType.Kind() == reflect.Uint8 { - // special case, write out []byte - return enc.writeBytes(rv.Bytes()) - } - alen := rv.Len() - err = enc.tagAuxOut(cborArray, uint64(alen)) - for i := 0; i < alen; i++ { - err = enc.writeReflection(rv.Index(i)) - if err != nil { - log.Printf("error at array elem %d", i) - return err - } - } - return nil - case reflect.Map: - err = enc.tagAuxOut(cborMap, uint64(rv.Len())) - if err != nil { - return err - } - - dup := func(b []byte) []byte { - out := make([]byte, len(b)) - copy(out, b) - return out - } - - keys := rv.MapKeys() - buf := new(bytes.Buffer) - encKeys := make([]cborKeyEntry, 0, len(keys)) - for _, krv := range keys { - tempEnc := NewEncoder(buf) - err := tempEnc.writeReflection(krv) - if err != nil { - log.Println("error encoding map key", err) - return err - } - kval := dup(buf.Bytes()) - encKeys = append(encKeys, cborKeyEntry{ - val: kval, - key: krv, - }) - buf.Reset() - } - - sort.Sort(cborKeySorter(encKeys)) - - for _, ek := range encKeys { - vrv := rv.MapIndex(ek.key) - - _, err := enc.out.Write(ek.val) - if err != nil { - log.Printf("error writing map key") - return err - } - err = enc.writeReflection(vrv) - if err != nil { - log.Printf("error encoding map val") - return err - } - } - - return nil - case reflect.Struct: - // TODO: check for big.Int ? - numfields := rv.NumField() - structType := rv.Type() - usableFields := 0 - for i := 0; i < numfields; i++ { - fieldinfo := structType.Field(i) - _, ok := fieldname(fieldinfo) - if !ok { - continue - } - usableFields++ - } - err = enc.tagAuxOut(cborMap, uint64(usableFields)) - if err != nil { - return err - } - for i := 0; i < numfields; i++ { - fieldinfo := structType.Field(i) - fieldname, ok := fieldname(fieldinfo) - if !ok { - continue - } - err = enc.writeText(fieldname) - if err != nil { - return err - } - err = enc.writeReflection(rv.Field(i)) - if err != nil { - return err - } - } - return nil - case reflect.Interface: - //return fmt.Errorf("TODO: serialize interface{} k=%s T=%s", rv.Kind().String(), rv.Type().String()) - return enc.Encode(rv.Interface()) - case reflect.Ptr: - if rv.IsNil() { - return enc.tagAuxOut(cbor7, uint64(cborNull)) - } - return enc.writeReflection(reflect.Indirect(rv)) - } - - return fmt.Errorf("don't know how to CBOR serialize k=%s t=%s", rv.Kind().String(), rv.Type().String()) -} - -type cborKeySorter []cborKeyEntry -type cborKeyEntry struct { - val []byte - key reflect.Value -} - -func (cks cborKeySorter) Len() int { return len(cks) } -func (cks cborKeySorter) Swap(i, j int) { - cks[i], cks[j] = cks[j], cks[i] -} - -func (cks cborKeySorter) Less(i, j int) bool { - a := keyBytesFromEncoded(cks[i].val) - b := keyBytesFromEncoded(cks[j].val) - switch { - case len(a) < len(b): - return true - case len(a) > len(b): - return false - default: - if bytes.Compare(a, b) < 0 { - return true - } - return false - } -} - -func keyBytesFromEncoded(data []byte) []byte { - cborInfo := data[0] & infoBits - - if cborInfo <= 23 { - return data[1:] - } else if cborInfo == int8Follows { - return data[2:] - } else if cborInfo == int16Follows { - return data[3:] - } else if cborInfo == int32Follows { - return data[5:] - } else if cborInfo == int64Follows { - return data[9:] - } - panic("shouldnt actually hit this") -} - -func (enc *Encoder) writeInt(x int64) error { - if x < 0 { - return enc.tagAuxOut(cborNegint, uint64(-1-x)) - } - return enc.tagAuxOut(cborUint, uint64(x)) -} - -func (enc *Encoder) tagAuxOut(tag byte, x uint64) error { - var err error - if x <= 23 { - // tiny literal - enc.scratch[0] = tag | byte(x) - _, err = enc.out.Write(enc.scratch[:1]) - } else if x < 0x0ff { - enc.scratch[0] = tag | int8Follows - enc.scratch[1] = byte(x & 0x0ff) - _, err = enc.out.Write(enc.scratch[:2]) - } else if x < 0x0ffff { - enc.scratch[0] = tag | int16Follows - enc.scratch[1] = byte((x >> 8) & 0x0ff) - enc.scratch[2] = byte(x & 0x0ff) - _, err = enc.out.Write(enc.scratch[:3]) - } else if x < 0x0ffffffff { - enc.scratch[0] = tag | int32Follows - enc.scratch[1] = byte((x >> 24) & 0x0ff) - enc.scratch[2] = byte((x >> 16) & 0x0ff) - enc.scratch[3] = byte((x >> 8) & 0x0ff) - enc.scratch[4] = byte(x & 0x0ff) - _, err = enc.out.Write(enc.scratch[:5]) - } else { - err = enc.tagAux64(tag, x) - } - return err -} -func (enc *Encoder) tagAux64(tag byte, x uint64) error { - enc.scratch[0] = tag | int64Follows - enc.scratch[1] = byte((x >> 56) & 0x0ff) - enc.scratch[2] = byte((x >> 48) & 0x0ff) - enc.scratch[3] = byte((x >> 40) & 0x0ff) - enc.scratch[4] = byte((x >> 32) & 0x0ff) - enc.scratch[5] = byte((x >> 24) & 0x0ff) - enc.scratch[6] = byte((x >> 16) & 0x0ff) - enc.scratch[7] = byte((x >> 8) & 0x0ff) - enc.scratch[8] = byte(x & 0x0ff) - _, err := enc.out.Write(enc.scratch[:9]) - return err -} - -// Encode a CBOR integer unit. The first argument is the major type, the second -// argument is the integer value. The result is a byte array from 1 to 9 bytes -// depending on the size of the integer value. -// -// The major type (tag argument) must be an integer between 0 and 7 else this -// function panics -// -// If the third parameter is non nil, the slice is reused to construct the -// result to avoid a memory allocation. It should be a slice with a sufficient -// capacity. -func EncodeInt(tag byte, v uint64, buf []byte) []byte { - switch { - case v <= 23: - // tiny literal - return EncodeOpcode(tag, byte(v), buf) - case 23 < v && v < 0x0ff: - return EncodeInt8(tag, uint8(v), buf) - case 0xff <= v && v < 0x0ffff: - return EncodeInt16(tag, uint16(v), buf) - case 0xffff <= v && v < 0x0ffffffff: - return EncodeInt32(tag, uint32(v), buf) - default: - return EncodeInt64(tag, v, buf) - } -} - -func EncodeOpcode(tag byte, opcode byte, buf []byte) []byte { - if tag > 7 { - panic("Wrong tag value") - } - return append(buf[0:0], - (tag<<5)|opcode, - ) -} - -func EncodeInt8(tag byte, v uint8, buf []byte) []byte { - if tag > 7 { - panic("Wrong tag value") - } - return append(buf[0:0], - (tag<<5)|int8Follows, - byte(v&0xff), - ) -} - -func EncodeInt16(tag byte, v uint16, buf []byte) []byte { - if tag > 7 { - panic("Wrong tag value") - } - return append(buf[0:0], - (tag<<5)|int16Follows, - byte((v>>8)&0xff), - byte(v&0xff), - ) -} - -func EncodeInt32(tag byte, v uint32, buf []byte) []byte { - if tag > 7 { - panic("Wrong tag value") - } - return append(buf[0:0], - (tag<<5)|int32Follows, - byte((v>>24)&0xff), - byte((v>>16)&0xff), - byte((v>>8)&0xff), - byte(v&0xff), - ) -} - -func EncodeInt64(tag byte, v uint64, buf []byte) []byte { - if tag > 7 { - panic("Wrong tag value") - } - return append(buf[0:0], - (tag<<5)|int64Follows, - byte((v>>56)&0xff), - byte((v>>48)&0xff), - byte((v>>40)&0xff), - byte((v>>32)&0xff), - byte((v>>24)&0xff), - byte((v>>16)&0xff), - byte((v>>8)&0xff), - byte(v&0xff), - ) -} - -func (enc *Encoder) writeText(x string) error { - enc.tagAuxOut(cborText, uint64(len(x))) - _, err := io.WriteString(enc.out, x) - return err -} - -func (enc *Encoder) writeBytes(x []byte) error { - enc.tagAuxOut(cborBytes, uint64(len(x))) - _, err := enc.out.Write(x) - return err -} - -func (enc *Encoder) writeFloat(x float64) error { - return enc.tagAux64(cbor7, math.Float64bits(x)) -} - -func (enc *Encoder) writeBool(x bool) error { - if x { - return enc.tagAuxOut(cbor7, uint64(cborTrue)) - } else { - return enc.tagAuxOut(cbor7, uint64(cborFalse)) - } -} - -func min(x, y uint64) uint64 { - if x < y { - return x - } - return y -} diff --git a/vendor/github.com/whyrusleeping/cbor/go/doc.go b/vendor/github.com/whyrusleeping/cbor/go/doc.go deleted file mode 100644 index 30ceee30..00000000 --- a/vendor/github.com/whyrusleeping/cbor/go/doc.go +++ /dev/null @@ -1,24 +0,0 @@ -/* -CBOR is IETF RFC 7049, the "Concise Binary Object Representation" -http://tools.ietf.org/html/rfc7049 - -In can be thought of as "binary JSON" but is a superset and somewhat richer representation than JSON. - -Other implementations and more information can also be found at: -http://cbor.io/ - -Serialization and deserialization of structs uses the same tag format as the encoding/json package. If different json and cbor serialization names are needed, a tag `cbor:"fieldName"` can be specified. Example: - - type DemoStruct struct { - FieldNeedsDifferentName string `json:"serialization_name"` - FieldNeedsJsonVsCborName int `json:"json_name" cbor:"cbor_name"` - } - -This might generate json: -{"serialization_name":"foo", "json_name":2} - -And CBOR equivalent to: -{"serialization_name":"foo", "cbor_name":2} - -*/ -package cbor diff --git a/vendor/github.com/whyrusleeping/go-smux-multiplex/LICENSE b/vendor/github.com/whyrusleeping/go-smux-multiplex/LICENSE deleted file mode 100644 index c7386b3c..00000000 --- a/vendor/github.com/whyrusleeping/go-smux-multiplex/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014 Juan Batiz-Benet - -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/whyrusleeping/go-smux-multiplex/package.json b/vendor/github.com/whyrusleeping/go-smux-multiplex/package.json deleted file mode 100644 index 4eadee98..00000000 --- a/vendor/github.com/whyrusleeping/go-smux-multiplex/package.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "author": "whyrusleeping", - "bugs": { - "url": "https://github.com/whyrusleeping/go-smux-multiplex" - }, - "gx": { - "dvcsimport": "github.com/whyrusleeping/go-smux-multiplex" - }, - "gxDependencies": [ - { - "author": "whyrusleeping", - "hash": "QmY9JXR3FupnYAYJWK9aMr9bCpqWKcToQ1tz8DVGTrHpHw", - "name": "go-stream-muxer", - "version": "3.0.0" - }, - { - "author": "whyrusleeping", - "hash": "QmP5tygNbeAH5Z8sGdrnE9rqqkAVYotam3UAgRWWfL2zur", - "name": "go-mplex", - "version": "0.2.30" - } - ], - "gxVersion": "0.7.0", - "language": "go", - "license": "MIT", - "name": "go-smux-multiplex", - "releaseCmd": "git commit -a -m \"gx publish $VERSION\"", - "version": "3.0.16" -} - diff --git a/vendor/github.com/whyrusleeping/go-smux-multistream/.gitignore b/vendor/github.com/whyrusleeping/go-smux-multistream/.gitignore deleted file mode 100644 index 1377554e..00000000 --- a/vendor/github.com/whyrusleeping/go-smux-multistream/.gitignore +++ /dev/null @@ -1 +0,0 @@ -*.swp diff --git a/vendor/github.com/whyrusleeping/go-smux-multistream/LICENSE b/vendor/github.com/whyrusleeping/go-smux-multistream/LICENSE deleted file mode 100644 index c7386b3c..00000000 --- a/vendor/github.com/whyrusleeping/go-smux-multistream/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014 Juan Batiz-Benet - -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/whyrusleeping/go-smux-multistream/README.md b/vendor/github.com/whyrusleeping/go-smux-multistream/README.md deleted file mode 100644 index 393ab1df..00000000 --- a/vendor/github.com/whyrusleeping/go-smux-multistream/README.md +++ /dev/null @@ -1,13 +0,0 @@ -# go-smux-multistream - a go-stream-muxer shim for multistream - -[![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](http://ipn.io) [![](https://img.shields.io/badge/freenode-%23ipfs-blue.svg?style=flat-square)](http://webchat.freenode.net/?channels=%23ipfs) ![](https://raw.githubusercontent.com/libp2p/go-stream-muxer/master/img/badge.png) - -This is an implementation of the [go-stream-muxer](https://github.com/libp2p/go-stream-muxer) interface for [multistream](https://github.com/whyrusleeping/go-multistream). For more information, see that repo. - -## Installation - -```sh -go get -d github.com/whyrusleeping/go-smux-multistream -cd $GOPATH/src/github.com/whyrusleeping/go-smux-multistream -make deps -``` diff --git a/vendor/github.com/whyrusleeping/go-smux-multistream/package.json b/vendor/github.com/whyrusleeping/go-smux-multistream/package.json deleted file mode 100644 index f3949413..00000000 --- a/vendor/github.com/whyrusleeping/go-smux-multistream/package.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "author": "whyrusleeping", - "bugs": { - "url": "https://github.com/whyrusleeping/go-smux-multistream" - }, - "gx": { - "dvcsimport": "github.com/whyrusleeping/go-smux-multistream" - }, - "gxDependencies": [ - { - "author": "whyrusleeping", - "hash": "QmabLh8TrJ3emfAoQk5AbqbLTbMyj7XqumMFmAFxa9epo8", - "name": "go-multistream", - "version": "0.3.9" - }, - { - "author": "whyrusleeping", - "hash": "QmY9JXR3FupnYAYJWK9aMr9bCpqWKcToQ1tz8DVGTrHpHw", - "name": "go-stream-muxer", - "version": "3.0.0" - } - ], - "gxVersion": "0.7.0", - "language": "go", - "license": "", - "name": "go-smux-multistream", - "releaseCmd": "git commit -a -m \"gx publish $VERSION\"", - "version": "2.0.2" -} - diff --git a/vendor/github.com/whyrusleeping/go-smux-yamux/.gitignore b/vendor/github.com/whyrusleeping/go-smux-yamux/.gitignore deleted file mode 100644 index 1377554e..00000000 --- a/vendor/github.com/whyrusleeping/go-smux-yamux/.gitignore +++ /dev/null @@ -1 +0,0 @@ -*.swp diff --git a/vendor/github.com/whyrusleeping/go-smux-yamux/LICENSE b/vendor/github.com/whyrusleeping/go-smux-yamux/LICENSE deleted file mode 100644 index c7386b3c..00000000 --- a/vendor/github.com/whyrusleeping/go-smux-yamux/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014 Juan Batiz-Benet - -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/whyrusleeping/yamux/package.json b/vendor/github.com/whyrusleeping/yamux/package.json deleted file mode 100644 index 0105c0dd..00000000 --- a/vendor/github.com/whyrusleeping/yamux/package.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "author": "whyrusleeping", - "bugs": { - "url": "https://github.com/whyrusleeping/yamux" - }, - "gx": { - "dvcsimport": "github.com/whyrusleeping/yamux" - }, - "gxDependencies": [ - { - "author": "Stebalien", - "hash": "QmQDvJoB6aJWN3sjr3xsgXqKCXf4jU5zdMXpDMsBkYVNqa", - "name": "go-buffer-pool", - "version": "0.1.3" - } - ], - "gxVersion": "0.10.0", - "language": "go", - "license": "", - "name": "yamux", - "releaseCmd": "git commit -a -m \"gx publish $VERSION\"", - "version": "1.1.5" -} - diff --git a/vendor/go.opencensus.io/metric/metricdata/exemplar.go b/vendor/go.opencensus.io/metric/metricdata/exemplar.go index cdbeef05..12695ce2 100644 --- a/vendor/go.opencensus.io/metric/metricdata/exemplar.go +++ b/vendor/go.opencensus.io/metric/metricdata/exemplar.go @@ -18,6 +18,11 @@ import ( "time" ) +// Exemplars keys. +const ( + AttachmentKeySpanContext = "SpanContext" +) + // Exemplar is an example data point associated with each bucket of a // distribution type aggregation. // diff --git a/vendor/go.opencensus.io/metric/metricdata/label.go b/vendor/go.opencensus.io/metric/metricdata/label.go index 87c55b9c..aadae41e 100644 --- a/vendor/go.opencensus.io/metric/metricdata/label.go +++ b/vendor/go.opencensus.io/metric/metricdata/label.go @@ -14,6 +14,13 @@ package metricdata +// LabelKey represents key of a label. It has optional +// description attribute. +type LabelKey struct { + Key string + Description string +} + // LabelValue represents the value of a label. // The zero value represents a missing label value, which may be treated // differently to an empty string value by some back ends. diff --git a/vendor/go.opencensus.io/metric/metricdata/metric.go b/vendor/go.opencensus.io/metric/metricdata/metric.go index 6ccdec58..8293712c 100644 --- a/vendor/go.opencensus.io/metric/metricdata/metric.go +++ b/vendor/go.opencensus.io/metric/metricdata/metric.go @@ -22,11 +22,11 @@ import ( // Descriptor holds metadata about a metric. type Descriptor struct { - Name string // full name of the metric - Description string // human-readable description - Unit Unit // units for the measure - Type Type // type of measure - LabelKeys []string // label keys + Name string // full name of the metric + Description string // human-readable description + Unit Unit // units for the measure + Type Type // type of measure + LabelKeys []LabelKey // label keys } // Metric represents a quantity measured against a resource with different diff --git a/vendor/go.opencensus.io/stats/record.go b/vendor/go.opencensus.io/stats/record.go index d2af0a60..ad469118 100644 --- a/vendor/go.opencensus.io/stats/record.go +++ b/vendor/go.opencensus.io/stats/record.go @@ -18,6 +18,7 @@ package stats import ( "context" + "go.opencensus.io/metric/metricdata" "go.opencensus.io/stats/internal" "go.opencensus.io/tag" ) @@ -30,40 +31,87 @@ func init() { } } +type recordOptions struct { + attachments metricdata.Attachments + mutators []tag.Mutator + measurements []Measurement +} + +// WithAttachments applies provided exemplar attachments. +func WithAttachments(attachments metricdata.Attachments) Options { + return func(ro *recordOptions) { + ro.attachments = attachments + } +} + +// WithTags applies provided tag mutators. +func WithTags(mutators ...tag.Mutator) Options { + return func(ro *recordOptions) { + ro.mutators = mutators + } +} + +// WithMeasurements applies provided measurements. +func WithMeasurements(measurements ...Measurement) Options { + return func(ro *recordOptions) { + ro.measurements = measurements + } +} + +// Options apply changes to recordOptions. +type Options func(*recordOptions) + +func createRecordOption(ros ...Options) *recordOptions { + o := &recordOptions{} + for _, ro := range ros { + ro(o) + } + return o +} + // Record records one or multiple measurements with the same context at once. // If there are any tags in the context, measurements will be tagged with them. func Record(ctx context.Context, ms ...Measurement) { + RecordWithOptions(ctx, WithMeasurements(ms...)) +} + +// RecordWithTags records one or multiple measurements at once. +// +// Measurements will be tagged with the tags in the context mutated by the mutators. +// RecordWithTags is useful if you want to record with tag mutations but don't want +// to propagate the mutations in the context. +func RecordWithTags(ctx context.Context, mutators []tag.Mutator, ms ...Measurement) error { + return RecordWithOptions(ctx, WithTags(mutators...), WithMeasurements(ms...)) +} + +// RecordWithOptions records measurements from the given options (if any) against context +// and tags and attachments in the options (if any). +// If there are any tags in the context, measurements will be tagged with them. +func RecordWithOptions(ctx context.Context, ros ...Options) error { + o := createRecordOption(ros...) + if len(o.measurements) == 0 { + return nil + } recorder := internal.DefaultRecorder if recorder == nil { - return - } - if len(ms) == 0 { - return + return nil } record := false - for _, m := range ms { + for _, m := range o.measurements { if m.desc.subscribed() { record = true break } } if !record { - return + return nil } - // TODO(songy23): fix attachments. - recorder(tag.FromContext(ctx), ms, map[string]interface{}{}) -} - -// RecordWithTags records one or multiple measurements at once. -// -// Measurements will be tagged with the tags in the context mutated by the mutators. -// RecordWithTags is useful if you want to record with tag mutations but don't want -// to propagate the mutations in the context. -func RecordWithTags(ctx context.Context, mutators []tag.Mutator, ms ...Measurement) error { - ctx, err := tag.New(ctx, mutators...) - if err != nil { - return err + if len(o.mutators) > 0 { + var err error + if ctx, err = tag.New(ctx, o.mutators...); err != nil { + return err + } } - Record(ctx, ms...) + recorder(tag.FromContext(ctx), o.measurements, o.attachments) return nil } diff --git a/vendor/go.opencensus.io/stats/view/view_to_metric.go b/vendor/go.opencensus.io/stats/view/view_to_metric.go index 284299fa..f67b5c46 100644 --- a/vendor/go.opencensus.io/stats/view/view_to_metric.go +++ b/vendor/go.opencensus.io/stats/view/view_to_metric.go @@ -73,10 +73,10 @@ func getType(v *View) metricdata.Type { } } -func getLableKeys(v *View) []string { - labelKeys := []string{} +func getLabelKeys(v *View) []metricdata.LabelKey { + labelKeys := []metricdata.LabelKey{} for _, k := range v.TagKeys { - labelKeys = append(labelKeys, k.Name()) + labelKeys = append(labelKeys, metricdata.LabelKey{Key: k.Name()}) } return labelKeys } @@ -87,14 +87,23 @@ func viewToMetricDescriptor(v *View) *metricdata.Descriptor { Description: v.Description, Unit: getUnit(v.Measure.Unit()), Type: getType(v), - LabelKeys: getLableKeys(v), + LabelKeys: getLabelKeys(v), } } -func toLabelValues(row *Row) []metricdata.LabelValue { +func toLabelValues(row *Row, expectedKeys []metricdata.LabelKey) []metricdata.LabelValue { labelValues := []metricdata.LabelValue{} + tagMap := make(map[string]string) for _, tag := range row.Tags { - labelValues = append(labelValues, metricdata.NewLabelValue(tag.Value)) + tagMap[tag.Key.Name()] = tag.Value + } + + for _, key := range expectedKeys { + if val, ok := tagMap[key.Key]; ok { + labelValues = append(labelValues, metricdata.NewLabelValue(val)) + } else { + labelValues = append(labelValues, metricdata.LabelValue{}) + } } return labelValues } @@ -102,7 +111,7 @@ func toLabelValues(row *Row) []metricdata.LabelValue { func rowToTimeseries(v *viewInternal, row *Row, now time.Time, startTime time.Time) *metricdata.TimeSeries { return &metricdata.TimeSeries{ Points: []metricdata.Point{row.Data.toPoint(v.metricDescriptor.Type, now)}, - LabelValues: toLabelValues(row), + LabelValues: toLabelValues(row, v.metricDescriptor.LabelKeys), StartTime: startTime, } } diff --git a/vendor/go.opencensus.io/stats/view/worker.go b/vendor/go.opencensus.io/stats/view/worker.go index 37279b39..2f3c018a 100644 --- a/vendor/go.opencensus.io/stats/view/worker.go +++ b/vendor/go.opencensus.io/stats/view/worker.go @@ -236,6 +236,8 @@ func (w *worker) reportView(v *viewInternal, now time.Time) { } func (w *worker) reportUsage(now time.Time) { + w.mu.Lock() + defer w.mu.Unlock() for _, v := range w.views { w.reportView(v, now) } diff --git a/vendor/go.opencensus.io/stats/view/worker_commands.go b/vendor/go.opencensus.io/stats/view/worker_commands.go index ba6203a5..0267e179 100644 --- a/vendor/go.opencensus.io/stats/view/worker_commands.go +++ b/vendor/go.opencensus.io/stats/view/worker_commands.go @@ -121,6 +121,8 @@ type retrieveDataResp struct { } func (cmd *retrieveDataReq) handleCommand(w *worker) { + w.mu.Lock() + defer w.mu.Unlock() vi, ok := w.views[cmd.v] if !ok { cmd.c <- &retrieveDataResp{ @@ -153,6 +155,8 @@ type recordReq struct { } func (cmd *recordReq) handleCommand(w *worker) { + w.mu.Lock() + defer w.mu.Unlock() for _, m := range cmd.ms { if (m == stats.Measurement{}) { // not registered continue diff --git a/vendor/go.opencensus.io/tag/key.go b/vendor/go.opencensus.io/tag/key.go index ebbed950..4e63d08c 100644 --- a/vendor/go.opencensus.io/tag/key.go +++ b/vendor/go.opencensus.io/tag/key.go @@ -29,6 +29,16 @@ func NewKey(name string) (Key, error) { return Key{name: name}, nil } +// MustNewKey creates or retrieves a string key identified by name. +// An invalid key name raises a panic. +func MustNewKey(name string) Key { + k, err := NewKey(name) + if err != nil { + panic(err) + } + return k +} + // Name returns the name of the key. func (k Key) Name() string { return k.name diff --git a/vendor/go.opencensus.io/tag/map.go b/vendor/go.opencensus.io/tag/map.go index 5b72ba6a..0272ef85 100644 --- a/vendor/go.opencensus.io/tag/map.go +++ b/vendor/go.opencensus.io/tag/map.go @@ -28,10 +28,15 @@ type Tag struct { Value string } +type tagContent struct { + value string + m metadatas +} + // Map is a map of tags. Use New to create a context containing // a new Map. type Map struct { - m map[Key]string + m map[Key]tagContent } // Value returns the value for the key if a value for the key exists. @@ -40,7 +45,7 @@ func (m *Map) Value(k Key) (string, bool) { return "", false } v, ok := m.m[k] - return v, ok + return v.value, ok } func (m *Map) String() string { @@ -62,21 +67,21 @@ func (m *Map) String() string { return buffer.String() } -func (m *Map) insert(k Key, v string) { +func (m *Map) insert(k Key, v string, md metadatas) { if _, ok := m.m[k]; ok { return } - m.m[k] = v + m.m[k] = tagContent{value: v, m: md} } -func (m *Map) update(k Key, v string) { +func (m *Map) update(k Key, v string, md metadatas) { if _, ok := m.m[k]; ok { - m.m[k] = v + m.m[k] = tagContent{value: v, m: md} } } -func (m *Map) upsert(k Key, v string) { - m.m[k] = v +func (m *Map) upsert(k Key, v string, md metadatas) { + m.m[k] = tagContent{value: v, m: md} } func (m *Map) delete(k Key) { @@ -84,7 +89,7 @@ func (m *Map) delete(k Key) { } func newMap() *Map { - return &Map{m: make(map[Key]string)} + return &Map{m: make(map[Key]tagContent)} } // Mutator modifies a tag map. @@ -95,13 +100,17 @@ type Mutator interface { // Insert returns a mutator that inserts a // value associated with k. If k already exists in the tag map, // mutator doesn't update the value. -func Insert(k Key, v string) Mutator { +// Metadata applies metadata to the tag. It is optional. +// Metadatas are applied in the order in which it is provided. +// If more than one metadata updates the same attribute then +// the update from the last metadata prevails. +func Insert(k Key, v string, mds ...Metadata) Mutator { return &mutator{ fn: func(m *Map) (*Map, error) { if !checkValue(v) { return nil, errInvalidValue } - m.insert(k, v) + m.insert(k, v, createMetadatas(mds...)) return m, nil }, } @@ -110,13 +119,17 @@ func Insert(k Key, v string) Mutator { // Update returns a mutator that updates the // value of the tag associated with k with v. If k doesn't // exists in the tag map, the mutator doesn't insert the value. -func Update(k Key, v string) Mutator { +// Metadata applies metadata to the tag. It is optional. +// Metadatas are applied in the order in which it is provided. +// If more than one metadata updates the same attribute then +// the update from the last metadata prevails. +func Update(k Key, v string, mds ...Metadata) Mutator { return &mutator{ fn: func(m *Map) (*Map, error) { if !checkValue(v) { return nil, errInvalidValue } - m.update(k, v) + m.update(k, v, createMetadatas(mds...)) return m, nil }, } @@ -126,18 +139,37 @@ func Update(k Key, v string) Mutator { // value of the tag associated with k with v. It inserts the // value if k doesn't exist already. It mutates the value // if k already exists. -func Upsert(k Key, v string) Mutator { +// Metadata applies metadata to the tag. It is optional. +// Metadatas are applied in the order in which it is provided. +// If more than one metadata updates the same attribute then +// the update from the last metadata prevails. +func Upsert(k Key, v string, mds ...Metadata) Mutator { return &mutator{ fn: func(m *Map) (*Map, error) { if !checkValue(v) { return nil, errInvalidValue } - m.upsert(k, v) + m.upsert(k, v, createMetadatas(mds...)) return m, nil }, } } +func createMetadatas(mds ...Metadata) metadatas { + var metas metadatas + if len(mds) > 0 { + for _, md := range mds { + if md != nil { + md(&metas) + } + } + } else { + WithTTL(TTLUnlimitedPropagation)(&metas) + } + return metas + +} + // Delete returns a mutator that deletes // the value associated with k. func Delete(k Key) Mutator { @@ -160,10 +192,10 @@ func New(ctx context.Context, mutator ...Mutator) (context.Context, error) { if !checkKeyName(k.Name()) { return ctx, fmt.Errorf("key:%q: %v", k, errInvalidKeyName) } - if !checkValue(v) { + if !checkValue(v.value) { return ctx, fmt.Errorf("key:%q value:%q: %v", k.Name(), v, errInvalidValue) } - m.insert(k, v) + m.insert(k, v.value, v.m) } } var err error diff --git a/vendor/go.opencensus.io/tag/map_codec.go b/vendor/go.opencensus.io/tag/map_codec.go index e88e7277..f8b58276 100644 --- a/vendor/go.opencensus.io/tag/map_codec.go +++ b/vendor/go.opencensus.io/tag/map_codec.go @@ -170,9 +170,11 @@ func Encode(m *Map) []byte { } eg.writeByte(byte(tagsVersionID)) for k, v := range m.m { - eg.writeByte(byte(keyTypeString)) - eg.writeStringWithVarintLen(k.name) - eg.writeBytesWithVarintLen([]byte(v)) + if v.m.ttl.ttl == valueTTLUnlimitedPropagation { + eg.writeByte(byte(keyTypeString)) + eg.writeStringWithVarintLen(k.name) + eg.writeBytesWithVarintLen([]byte(v.value)) + } } return eg.bytes() } @@ -190,7 +192,7 @@ func Decode(bytes []byte) (*Map, error) { // DecodeEach decodes the given serialized tag map, calling handler for each // tag key and value decoded. -func DecodeEach(bytes []byte, fn func(key Key, val string)) error { +func DecodeEach(bytes []byte, fn func(key Key, val string, md metadatas)) error { eg := &encoderGRPC{ buf: bytes, } @@ -228,7 +230,7 @@ func DecodeEach(bytes []byte, fn func(key Key, val string)) error { if !checkValue(val) { return errInvalidValue } - fn(key, val) + fn(key, val, createMetadatas(WithTTL(TTLUnlimitedPropagation))) if err != nil { return err } diff --git a/vendor/go.opencensus.io/tag/metadata.go b/vendor/go.opencensus.io/tag/metadata.go new file mode 100644 index 00000000..6571a583 --- /dev/null +++ b/vendor/go.opencensus.io/tag/metadata.go @@ -0,0 +1,52 @@ +// Copyright 2019, OpenCensus 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 tag + +const ( + // valueTTLNoPropagation prevents tag from propagating. + valueTTLNoPropagation = 0 + + // valueTTLUnlimitedPropagation allows tag to propagate without any limits on number of hops. + valueTTLUnlimitedPropagation = -1 +) + +// TTL is metadata that specifies number of hops a tag can propagate. +// Details about TTL metadata is specified at https://github.com/census-instrumentation/opencensus-specs/blob/master/tags/TagMap.md#tagmetadata +type TTL struct { + ttl int +} + +var ( + // TTLUnlimitedPropagation is TTL metadata that allows tag to propagate without any limits on number of hops. + TTLUnlimitedPropagation = TTL{ttl: valueTTLUnlimitedPropagation} + + // TTLNoPropagation is TTL metadata that prevents tag from propagating. + TTLNoPropagation = TTL{ttl: valueTTLNoPropagation} +) + +type metadatas struct { + ttl TTL +} + +// Metadata applies metadatas specified by the function. +type Metadata func(*metadatas) + +// WithTTL applies metadata with provided ttl. +func WithTTL(ttl TTL) Metadata { + return func(m *metadatas) { + m.ttl = ttl + } +} diff --git a/vendor/go.opencensus.io/tag/profile_19.go b/vendor/go.opencensus.io/tag/profile_19.go index f81cd0b4..b34d95e3 100644 --- a/vendor/go.opencensus.io/tag/profile_19.go +++ b/vendor/go.opencensus.io/tag/profile_19.go @@ -25,7 +25,7 @@ func do(ctx context.Context, f func(ctx context.Context)) { m := FromContext(ctx) keyvals := make([]string, 0, 2*len(m.m)) for k, v := range m.m { - keyvals = append(keyvals, k.Name(), v) + keyvals = append(keyvals, k.Name(), v.value) } pprof.Do(ctx, pprof.Labels(keyvals...), f) } diff --git a/vendor/go.uber.org/atomic/.codecov.yml b/vendor/go.uber.org/atomic/.codecov.yml new file mode 100644 index 00000000..6d4d1be7 --- /dev/null +++ b/vendor/go.uber.org/atomic/.codecov.yml @@ -0,0 +1,15 @@ +coverage: + range: 80..100 + round: down + precision: 2 + + status: + project: # measuring the overall project coverage + default: # context, you can create multiple ones with custom titles + enabled: yes # must be yes|true to enable this status + target: 100 # specify the target coverage for each commit status + # option: "auto" (must increase from parent commit or pull request base) + # option: "X%" a static target percentage to hit + if_not_found: success # if parent is not found report status as success, error, or failure + if_ci_failed: error # if ci fails report status as success, error, or failure + diff --git a/vendor/go.uber.org/atomic/.gitignore b/vendor/go.uber.org/atomic/.gitignore new file mode 100644 index 00000000..0a4504f1 --- /dev/null +++ b/vendor/go.uber.org/atomic/.gitignore @@ -0,0 +1,11 @@ +.DS_Store +/vendor +/cover +cover.out +lint.log + +# Binaries +*.test + +# Profiling output +*.prof diff --git a/vendor/go.uber.org/atomic/.travis.yml b/vendor/go.uber.org/atomic/.travis.yml new file mode 100644 index 00000000..0f3769e5 --- /dev/null +++ b/vendor/go.uber.org/atomic/.travis.yml @@ -0,0 +1,27 @@ +sudo: false +language: go +go_import_path: go.uber.org/atomic + +go: + - 1.11.x + - 1.12.x + +matrix: + include: + - go: 1.12.x + env: NO_TEST=yes LINT=yes + +cache: + directories: + - vendor + +install: + - make install_ci + +script: + - test -n "$NO_TEST" || make test_ci + - test -n "$NO_TEST" || scripts/test-ubergo.sh + - test -z "$LINT" || make install_lint lint + +after_success: + - bash <(curl -s https://codecov.io/bash) diff --git a/vendor/go.uber.org/atomic/LICENSE.txt b/vendor/go.uber.org/atomic/LICENSE.txt new file mode 100644 index 00000000..8765c9fb --- /dev/null +++ b/vendor/go.uber.org/atomic/LICENSE.txt @@ -0,0 +1,19 @@ +Copyright (c) 2016 Uber Technologies, 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/go.uber.org/atomic/Makefile b/vendor/go.uber.org/atomic/Makefile new file mode 100644 index 00000000..1ef26307 --- /dev/null +++ b/vendor/go.uber.org/atomic/Makefile @@ -0,0 +1,51 @@ +# Many Go tools take file globs or directories as arguments instead of packages. +PACKAGE_FILES ?= *.go + +# For pre go1.6 +export GO15VENDOREXPERIMENT=1 + + +.PHONY: build +build: + go build -i ./... + + +.PHONY: install +install: + glide --version || go get github.com/Masterminds/glide + glide install + + +.PHONY: test +test: + go test -cover -race ./... + + +.PHONY: install_ci +install_ci: install + go get github.com/wadey/gocovmerge + go get github.com/mattn/goveralls + go get golang.org/x/tools/cmd/cover + +.PHONY: install_lint +install_lint: + go get golang.org/x/lint/golint + + +.PHONY: lint +lint: + @rm -rf lint.log + @echo "Checking formatting..." + @gofmt -d -s $(PACKAGE_FILES) 2>&1 | tee lint.log + @echo "Checking vet..." + @go vet ./... 2>&1 | tee -a lint.log;) + @echo "Checking lint..." + @golint $$(go list ./...) 2>&1 | tee -a lint.log + @echo "Checking for unresolved FIXMEs..." + @git grep -i fixme | grep -v -e vendor -e Makefile | tee -a lint.log + @[ ! -s lint.log ] + + +.PHONY: test_ci +test_ci: install_ci build + ./scripts/cover.sh $(shell go list $(PACKAGES)) diff --git a/vendor/go.uber.org/atomic/README.md b/vendor/go.uber.org/atomic/README.md new file mode 100644 index 00000000..62eb8e57 --- /dev/null +++ b/vendor/go.uber.org/atomic/README.md @@ -0,0 +1,36 @@ +# atomic [![GoDoc][doc-img]][doc] [![Build Status][ci-img]][ci] [![Coverage Status][cov-img]][cov] [![Go Report Card][reportcard-img]][reportcard] + +Simple wrappers for primitive types to enforce atomic access. + +## Installation +`go get -u go.uber.org/atomic` + +## Usage +The standard library's `sync/atomic` is powerful, but it's easy to forget which +variables must be accessed atomically. `go.uber.org/atomic` preserves all the +functionality of the standard library, but wraps the primitive types to +provide a safer, more convenient API. + +```go +var atom atomic.Uint32 +atom.Store(42) +atom.Sub(2) +atom.CAS(40, 11) +``` + +See the [documentation][doc] for a complete API specification. + +## Development Status +Stable. + +___ +Released under the [MIT License](LICENSE.txt). + +[doc-img]: https://godoc.org/github.com/uber-go/atomic?status.svg +[doc]: https://godoc.org/go.uber.org/atomic +[ci-img]: https://travis-ci.com/uber-go/atomic.svg?branch=master +[ci]: https://travis-ci.com/uber-go/atomic +[cov-img]: https://codecov.io/gh/uber-go/atomic/branch/master/graph/badge.svg +[cov]: https://codecov.io/gh/uber-go/atomic +[reportcard-img]: https://goreportcard.com/badge/go.uber.org/atomic +[reportcard]: https://goreportcard.com/report/go.uber.org/atomic diff --git a/vendor/go.uber.org/atomic/atomic.go b/vendor/go.uber.org/atomic/atomic.go new file mode 100644 index 00000000..1db6849f --- /dev/null +++ b/vendor/go.uber.org/atomic/atomic.go @@ -0,0 +1,351 @@ +// Copyright (c) 2016 Uber Technologies, 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. + +// Package atomic provides simple wrappers around numerics to enforce atomic +// access. +package atomic + +import ( + "math" + "sync/atomic" + "time" +) + +// Int32 is an atomic wrapper around an int32. +type Int32 struct{ v int32 } + +// NewInt32 creates an Int32. +func NewInt32(i int32) *Int32 { + return &Int32{i} +} + +// Load atomically loads the wrapped value. +func (i *Int32) Load() int32 { + return atomic.LoadInt32(&i.v) +} + +// Add atomically adds to the wrapped int32 and returns the new value. +func (i *Int32) Add(n int32) int32 { + return atomic.AddInt32(&i.v, n) +} + +// Sub atomically subtracts from the wrapped int32 and returns the new value. +func (i *Int32) Sub(n int32) int32 { + return atomic.AddInt32(&i.v, -n) +} + +// Inc atomically increments the wrapped int32 and returns the new value. +func (i *Int32) Inc() int32 { + return i.Add(1) +} + +// Dec atomically decrements the wrapped int32 and returns the new value. +func (i *Int32) Dec() int32 { + return i.Sub(1) +} + +// CAS is an atomic compare-and-swap. +func (i *Int32) CAS(old, new int32) bool { + return atomic.CompareAndSwapInt32(&i.v, old, new) +} + +// Store atomically stores the passed value. +func (i *Int32) Store(n int32) { + atomic.StoreInt32(&i.v, n) +} + +// Swap atomically swaps the wrapped int32 and returns the old value. +func (i *Int32) Swap(n int32) int32 { + return atomic.SwapInt32(&i.v, n) +} + +// Int64 is an atomic wrapper around an int64. +type Int64 struct{ v int64 } + +// NewInt64 creates an Int64. +func NewInt64(i int64) *Int64 { + return &Int64{i} +} + +// Load atomically loads the wrapped value. +func (i *Int64) Load() int64 { + return atomic.LoadInt64(&i.v) +} + +// Add atomically adds to the wrapped int64 and returns the new value. +func (i *Int64) Add(n int64) int64 { + return atomic.AddInt64(&i.v, n) +} + +// Sub atomically subtracts from the wrapped int64 and returns the new value. +func (i *Int64) Sub(n int64) int64 { + return atomic.AddInt64(&i.v, -n) +} + +// Inc atomically increments the wrapped int64 and returns the new value. +func (i *Int64) Inc() int64 { + return i.Add(1) +} + +// Dec atomically decrements the wrapped int64 and returns the new value. +func (i *Int64) Dec() int64 { + return i.Sub(1) +} + +// CAS is an atomic compare-and-swap. +func (i *Int64) CAS(old, new int64) bool { + return atomic.CompareAndSwapInt64(&i.v, old, new) +} + +// Store atomically stores the passed value. +func (i *Int64) Store(n int64) { + atomic.StoreInt64(&i.v, n) +} + +// Swap atomically swaps the wrapped int64 and returns the old value. +func (i *Int64) Swap(n int64) int64 { + return atomic.SwapInt64(&i.v, n) +} + +// Uint32 is an atomic wrapper around an uint32. +type Uint32 struct{ v uint32 } + +// NewUint32 creates a Uint32. +func NewUint32(i uint32) *Uint32 { + return &Uint32{i} +} + +// Load atomically loads the wrapped value. +func (i *Uint32) Load() uint32 { + return atomic.LoadUint32(&i.v) +} + +// Add atomically adds to the wrapped uint32 and returns the new value. +func (i *Uint32) Add(n uint32) uint32 { + return atomic.AddUint32(&i.v, n) +} + +// Sub atomically subtracts from the wrapped uint32 and returns the new value. +func (i *Uint32) Sub(n uint32) uint32 { + return atomic.AddUint32(&i.v, ^(n - 1)) +} + +// Inc atomically increments the wrapped uint32 and returns the new value. +func (i *Uint32) Inc() uint32 { + return i.Add(1) +} + +// Dec atomically decrements the wrapped int32 and returns the new value. +func (i *Uint32) Dec() uint32 { + return i.Sub(1) +} + +// CAS is an atomic compare-and-swap. +func (i *Uint32) CAS(old, new uint32) bool { + return atomic.CompareAndSwapUint32(&i.v, old, new) +} + +// Store atomically stores the passed value. +func (i *Uint32) Store(n uint32) { + atomic.StoreUint32(&i.v, n) +} + +// Swap atomically swaps the wrapped uint32 and returns the old value. +func (i *Uint32) Swap(n uint32) uint32 { + return atomic.SwapUint32(&i.v, n) +} + +// Uint64 is an atomic wrapper around a uint64. +type Uint64 struct{ v uint64 } + +// NewUint64 creates a Uint64. +func NewUint64(i uint64) *Uint64 { + return &Uint64{i} +} + +// Load atomically loads the wrapped value. +func (i *Uint64) Load() uint64 { + return atomic.LoadUint64(&i.v) +} + +// Add atomically adds to the wrapped uint64 and returns the new value. +func (i *Uint64) Add(n uint64) uint64 { + return atomic.AddUint64(&i.v, n) +} + +// Sub atomically subtracts from the wrapped uint64 and returns the new value. +func (i *Uint64) Sub(n uint64) uint64 { + return atomic.AddUint64(&i.v, ^(n - 1)) +} + +// Inc atomically increments the wrapped uint64 and returns the new value. +func (i *Uint64) Inc() uint64 { + return i.Add(1) +} + +// Dec atomically decrements the wrapped uint64 and returns the new value. +func (i *Uint64) Dec() uint64 { + return i.Sub(1) +} + +// CAS is an atomic compare-and-swap. +func (i *Uint64) CAS(old, new uint64) bool { + return atomic.CompareAndSwapUint64(&i.v, old, new) +} + +// Store atomically stores the passed value. +func (i *Uint64) Store(n uint64) { + atomic.StoreUint64(&i.v, n) +} + +// Swap atomically swaps the wrapped uint64 and returns the old value. +func (i *Uint64) Swap(n uint64) uint64 { + return atomic.SwapUint64(&i.v, n) +} + +// Bool is an atomic Boolean. +type Bool struct{ v uint32 } + +// NewBool creates a Bool. +func NewBool(initial bool) *Bool { + return &Bool{boolToInt(initial)} +} + +// Load atomically loads the Boolean. +func (b *Bool) Load() bool { + return truthy(atomic.LoadUint32(&b.v)) +} + +// CAS is an atomic compare-and-swap. +func (b *Bool) CAS(old, new bool) bool { + return atomic.CompareAndSwapUint32(&b.v, boolToInt(old), boolToInt(new)) +} + +// Store atomically stores the passed value. +func (b *Bool) Store(new bool) { + atomic.StoreUint32(&b.v, boolToInt(new)) +} + +// Swap sets the given value and returns the previous value. +func (b *Bool) Swap(new bool) bool { + return truthy(atomic.SwapUint32(&b.v, boolToInt(new))) +} + +// Toggle atomically negates the Boolean and returns the previous value. +func (b *Bool) Toggle() bool { + return truthy(atomic.AddUint32(&b.v, 1) - 1) +} + +func truthy(n uint32) bool { + return n&1 == 1 +} + +func boolToInt(b bool) uint32 { + if b { + return 1 + } + return 0 +} + +// Float64 is an atomic wrapper around float64. +type Float64 struct { + v uint64 +} + +// NewFloat64 creates a Float64. +func NewFloat64(f float64) *Float64 { + return &Float64{math.Float64bits(f)} +} + +// Load atomically loads the wrapped value. +func (f *Float64) Load() float64 { + return math.Float64frombits(atomic.LoadUint64(&f.v)) +} + +// Store atomically stores the passed value. +func (f *Float64) Store(s float64) { + atomic.StoreUint64(&f.v, math.Float64bits(s)) +} + +// Add atomically adds to the wrapped float64 and returns the new value. +func (f *Float64) Add(s float64) float64 { + for { + old := f.Load() + new := old + s + if f.CAS(old, new) { + return new + } + } +} + +// Sub atomically subtracts from the wrapped float64 and returns the new value. +func (f *Float64) Sub(s float64) float64 { + return f.Add(-s) +} + +// CAS is an atomic compare-and-swap. +func (f *Float64) CAS(old, new float64) bool { + return atomic.CompareAndSwapUint64(&f.v, math.Float64bits(old), math.Float64bits(new)) +} + +// Duration is an atomic wrapper around time.Duration +// https://godoc.org/time#Duration +type Duration struct { + v Int64 +} + +// NewDuration creates a Duration. +func NewDuration(d time.Duration) *Duration { + return &Duration{v: *NewInt64(int64(d))} +} + +// Load atomically loads the wrapped value. +func (d *Duration) Load() time.Duration { + return time.Duration(d.v.Load()) +} + +// Store atomically stores the passed value. +func (d *Duration) Store(n time.Duration) { + d.v.Store(int64(n)) +} + +// Add atomically adds to the wrapped time.Duration and returns the new value. +func (d *Duration) Add(n time.Duration) time.Duration { + return time.Duration(d.v.Add(int64(n))) +} + +// Sub atomically subtracts from the wrapped time.Duration and returns the new value. +func (d *Duration) Sub(n time.Duration) time.Duration { + return time.Duration(d.v.Sub(int64(n))) +} + +// Swap atomically swaps the wrapped time.Duration and returns the old value. +func (d *Duration) Swap(n time.Duration) time.Duration { + return time.Duration(d.v.Swap(int64(n))) +} + +// CAS is an atomic compare-and-swap. +func (d *Duration) CAS(old, new time.Duration) bool { + return d.v.CAS(int64(old), int64(new)) +} + +// Value shadows the type of the same name from sync/atomic +// https://godoc.org/sync/atomic#Value +type Value struct{ atomic.Value } diff --git a/vendor/go.uber.org/atomic/error.go b/vendor/go.uber.org/atomic/error.go new file mode 100644 index 00000000..0489d19b --- /dev/null +++ b/vendor/go.uber.org/atomic/error.go @@ -0,0 +1,55 @@ +// Copyright (c) 2016 Uber Technologies, 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. + +package atomic + +// Error is an atomic type-safe wrapper around Value for errors +type Error struct{ v Value } + +// errorHolder is non-nil holder for error object. +// atomic.Value panics on saving nil object, so err object needs to be +// wrapped with valid object first. +type errorHolder struct{ err error } + +// NewError creates new atomic error object +func NewError(err error) *Error { + e := &Error{} + if err != nil { + e.Store(err) + } + return e +} + +// Load atomically loads the wrapped error +func (e *Error) Load() error { + v := e.v.Load() + if v == nil { + return nil + } + + eh := v.(errorHolder) + return eh.err +} + +// Store atomically stores error. +// NOTE: a holder object is allocated on each Store call. +func (e *Error) Store(err error) { + e.v.Store(errorHolder{err: err}) +} diff --git a/vendor/go.uber.org/atomic/glide.lock b/vendor/go.uber.org/atomic/glide.lock new file mode 100644 index 00000000..3c72c599 --- /dev/null +++ b/vendor/go.uber.org/atomic/glide.lock @@ -0,0 +1,17 @@ +hash: f14d51408e3e0e4f73b34e4039484c78059cd7fc5f4996fdd73db20dc8d24f53 +updated: 2016-10-27T00:10:51.16960137-07:00 +imports: [] +testImports: +- name: github.com/davecgh/go-spew + version: 5215b55f46b2b919f50a1df0eaa5886afe4e3b3d + subpackages: + - spew +- name: github.com/pmezard/go-difflib + version: d8ed2627bdf02c080bf22230dbb337003b7aba2d + subpackages: + - difflib +- name: github.com/stretchr/testify + version: d77da356e56a7428ad25149ca77381849a6a5232 + subpackages: + - assert + - require diff --git a/vendor/go.uber.org/atomic/glide.yaml b/vendor/go.uber.org/atomic/glide.yaml new file mode 100644 index 00000000..4cf608ec --- /dev/null +++ b/vendor/go.uber.org/atomic/glide.yaml @@ -0,0 +1,6 @@ +package: go.uber.org/atomic +testImport: +- package: github.com/stretchr/testify + subpackages: + - assert + - require diff --git a/vendor/go.uber.org/atomic/string.go b/vendor/go.uber.org/atomic/string.go new file mode 100644 index 00000000..ede8136f --- /dev/null +++ b/vendor/go.uber.org/atomic/string.go @@ -0,0 +1,49 @@ +// Copyright (c) 2016 Uber Technologies, 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. + +package atomic + +// String is an atomic type-safe wrapper around Value for strings. +type String struct{ v Value } + +// NewString creates a String. +func NewString(str string) *String { + s := &String{} + if str != "" { + s.Store(str) + } + return s +} + +// Load atomically loads the wrapped string. +func (s *String) Load() string { + v := s.v.Load() + if v == nil { + return "" + } + return v.(string) +} + +// Store atomically stores the passed string. +// Note: Converting the string to an interface{} to store in the Value +// requires an allocation. +func (s *String) Store(str string) { + s.v.Store(str) +} diff --git a/vendor/go.uber.org/dig/.codecov.yml b/vendor/go.uber.org/dig/.codecov.yml new file mode 100644 index 00000000..c474df1c --- /dev/null +++ b/vendor/go.uber.org/dig/.codecov.yml @@ -0,0 +1,19 @@ +coverage: + range: 70..98 + round: down + precision: 2 + + status: + project: # measuring the overall project coverage + default: # context, you can create multiple ones with custom titles + enabled: yes # must be yes|true to enable this status + target: 98 # specify the target coverage for each commit status + # option: "auto" (must increase from parent commit or pull request base) + # option: "X%" a static target percentage to hit + if_not_found: success # if parent is not found report status as success, error, or failure + if_ci_failed: error # if ci fails report status as success, error, or failure + + patch: + default: + enabled: yes + target: 70 diff --git a/vendor/go.uber.org/dig/.gitignore b/vendor/go.uber.org/dig/.gitignore new file mode 100644 index 00000000..23249243 --- /dev/null +++ b/vendor/go.uber.org/dig/.gitignore @@ -0,0 +1,11 @@ +/vendor +/.bench +*.mem +*.cpu +*.test +*.log +*.out +*.html +*.coverprofile +coverage.txt +*.pprof diff --git a/vendor/go.uber.org/dig/.travis.yml b/vendor/go.uber.org/dig/.travis.yml new file mode 100644 index 00000000..c0b94633 --- /dev/null +++ b/vendor/go.uber.org/dig/.travis.yml @@ -0,0 +1,18 @@ +language: go +sudo: false +go_import_path: go.uber.org/dig + +matrix: + include: + - go: "1.10" + - go: "1.11" + env: LINT=1 + +cache: + directories: + - vendor +install: + - make dependencies +script: + - test -z "$LINT" && echo "Skipping lint" || make lint + - make ci diff --git a/vendor/go.uber.org/dig/CHANGELOG.md b/vendor/go.uber.org/dig/CHANGELOG.md new file mode 100644 index 00000000..6251d203 --- /dev/null +++ b/vendor/go.uber.org/dig/CHANGELOG.md @@ -0,0 +1,160 @@ +# Changelog +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) +and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). + +## [1.7.0] - 2019-01-04 +### Added +- Added `Group` option for `Provide` to add value groups to the container without +rewriting constructors. See package doucmentation for more information. + +## [1.6.0] - 2018-11-06 +### Changed +- When an error graph is visualized, the graph is pruned so that the graph only + contains failure nodes. +- Container visualization is now oriented from right to left. + +## [1.5.1] - 2018-11-01 +### Fixed +- Fixed a test that was causing Dig to be unusable with Go Modules. + +## [1.5.0] - 2018-09-19 +### Added +- Added a `DeferAcyclicVerification` container option that defers graph cycle + detection until the next Invoke. + +### Changed +- Improved cycle-detection performance by 50x in certain degenerative cases. + +## [1.4.0] - 2018-08-16 +### Added +- Added `Visualize` function to visualize the state of the container in the + GraphViz DOT format. This allows visualization of error types and the + dependency relationships of types in the container. +- Added `CanVisualizeError` function to determine if an error can be visualized + in the graph. +- Added `Name` option for `Provide` to add named values to the container + without rewriting constructors. See package documentation for more + information. + +### Changed +- `name:"..."` tags on nested Result Objects will now cause errors instead of + being ignored. + +## [1.3.0] - 2017-12-04 +### Changed +- Improved messages for errors thrown by Dig under a many scenarios to be more + informative. + +## [1.2.0] - 2017-11-07 +### Added +- `dig.In` and `dig.Out` now support value groups, making it possible to + produce many values of the same type from different constructors. See package + documentation for more information. + +## [1.1.0] - 2017-09-15 +### Added +- Added the `dig.RootCause` function which allows retrieving the original + constructor error that caused an `Invoke` failure. + +### Changed +- Errors from `Invoke` now attempt to hint to the user a presence of a similar + type, for example a pointer to the requested type and vice versa. + +## [1.0.0] - 2017-07-31 + +First stable release: no breaking changes will be made in the 1.x series. + +### Changed +- `Provide` and `Invoke` will now fail if `dig.In` or `dig.Out` structs + contain unexported fields. Previously these fields were ignored which often + led to confusion. + +## [1.0.0-rc2] - 2017-07-21 +### Added +- Exported `dig.IsIn` and `dig.IsOut` so that consuming libraries can check if + a params or return struct embeds the `dig.In` and `dig.Out` types, respectively. + +### Changed +- Added variadic options to all public APIS so that new functionality can be + introduced post v1.0.0 without introducing breaking changes. +- Functions with variadic arguments can now be passed to `dig.Provide` and + `dig.Invoke`. Previously this caused an error, whereas now the args will be ignored. + +## [1.0.0-rc1] - 2017-06-21 + +First release candidate. + +## [0.5.0] - 2017-06-19 +### Added +- `dig.In` and `dig.Out` now support named instances, i.e.: + + ```go + type param struct { + dig.In + + DB1 DB.Connection `name:"primary"` + DB2 DB.Connection `name:"secondary"` + } + ``` + +### Fixed +- Structs compatible with `dig.In` and `dig.Out` may now be generated using + `reflect.StructOf`. + +## [0.4.0] - 2017-06-12 +### Added +- Add `dig.In` embeddable type for advanced use-cases of specifying dependencies. +- Add `dig.Out` embeddable type for advanced use-cases of constructors + inserting types in the container. +- Add support for optional parameters through `optional:"true"` tag on `dig.In` objects. +- Add support for value types and many built-ins (maps, slices, channels). + +### Changed +- **[Breaking]** Restrict the API surface to only `Provide` and `Invoke`. +- **[Breaking]** Update `Provide` method to accept variadic arguments. + +### Removed +- **[Breaking]** Remove `Must*` funcs to greatly reduce API surface area. +- Providing constructors with common returned types results in an error. + +## [0.3] - 2017-05-02 +### Added +- Add functionality to `Provide` to support constructor with `n` return + objects to be resolved into the `dig.Graph` +- Add `Invoke` function to invoke provided function and insert return + objects into the `dig.Graph` + +### Changed +- Rename `RegisterAll` and `MustRegisterAll` to `ProvideAll` and + `MustProvideAll`. + +## [0.2] - 2017-03-27 +### Changed +- Rename `Register` to `Provide` for clarity and to recude clash with other + Register functions. +- Rename `dig.Graph` to `dig.Container`. + +### Removed +- Remove the package-level functions and the `DefaultGraph`. + +## 0.1 - 2017-03-23 + +Initial release. + +[1.7.0]: https://github.com/uber-go/dig/compare/v1.6.0...v1.7.0 +[1.6.0]: https://github.com/uber-go/dig/compare/v1.5.1...v1.6.0 +[1.5.1]: https://github.com/uber-go/dig/compare/v1.5.0...v1.5.1 +[1.5.0]: https://github.com/uber-go/dig/compare/v1.4.0...v1.5.0 +[1.4.0]: https://github.com/uber-go/dig/compare/v1.3.0...v1.4.0 +[1.3.0]: https://github.com/uber-go/dig/compare/v1.2.0...v1.3.0 +[1.2.0]: https://github.com/uber-go/dig/compare/v1.1.0...v1.2.0 +[1.1.0]: https://github.com/uber-go/dig/compare/v1.0.0...v1.1.0 +[1.0.0]: https://github.com/uber-go/dig/compare/v1.0.0-rc2...v1.0.0 +[1.0.0-rc2]: https://github.com/uber-go/dig/compare/v1.0.0-rc1...v1.0.0-rc2 +[1.0.0-rc1]: https://github.com/uber-go/dig/compare/v0.5.0...v1.0.0-rc1 +[0.5.0]: https://github.com/uber-go/dig/compare/v0.4.0...v0.5.0 +[0.4.0]: https://github.com/uber-go/dig/compare/v0.3...v0.4.0 +[0.3]: https://github.com/uber-go/dig/compare/v0.2...v0.3 +[0.2]: https://github.com/uber-go/dig/compare/v0.1...v0.2 diff --git a/vendor/github.com/ipfs/go-ipfs-addr/LICENSE b/vendor/go.uber.org/dig/LICENSE similarity index 94% rename from vendor/github.com/ipfs/go-ipfs-addr/LICENSE rename to vendor/go.uber.org/dig/LICENSE index 83f48ce5..00a8d056 100644 --- a/vendor/github.com/ipfs/go-ipfs-addr/LICENSE +++ b/vendor/go.uber.org/dig/LICENSE @@ -1,6 +1,4 @@ -The MIT License (MIT) - -Copyright (c) 2017 Whyrusleeping +Copyright (c) 2017-2018 Uber Technologies, 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 diff --git a/vendor/go.uber.org/dig/Makefile b/vendor/go.uber.org/dig/Makefile new file mode 100644 index 00000000..10cb24fa --- /dev/null +++ b/vendor/go.uber.org/dig/Makefile @@ -0,0 +1,52 @@ +BENCH_FLAGS ?= -cpuprofile=cpu.pprof -memprofile=mem.pprof -benchmem +PKGS ?= $(shell glide novendor | grep -v examples) +PKG_FILES ?= *.go +GO_VERSION := $(shell go version | cut -d " " -f 3) + +.PHONY: all +all: lint test + +.PHONY: dependencies +dependencies: + @echo "Installing Glide and locked dependencies..." + glide --version || go get -u -f github.com/Masterminds/glide + glide install + @echo "Installing uber-license tool..." + command -v update-license >/dev/null || go get -u -f go.uber.org/tools/update-license + @echo "Installing golint..." + command -v golint >/dev/null || go get -u -f github.com/golang/lint/golint + +.PHONY: license +license: dependencies + ./check_license.sh | tee -a lint.log + +.PHONY: lint +lint: + @rm -rf lint.log + @echo "Checking formatting..." + @gofmt -d -s $(PKG_FILES) 2>&1 | tee lint.log + @echo "Installing test dependencies for vet..." + @go test -i $(PKGS) + @echo "Checking vet..." + @$(foreach dir,$(PKG_FILES),go tool vet $(VET_RULES) $(dir) 2>&1 | tee -a lint.log;) + @echo "Checking lint..." + @$(foreach dir,$(PKGS),golint $(dir) 2>&1 | tee -a lint.log;) + @echo "Checking for unresolved FIXMEs..." + @git grep -i fixme | grep -v -e vendor -e Makefile | tee -a lint.log + @echo "Checking for license headers..." + @DRY_RUN=1 ./check_license.sh | tee -a lint.log + @[ ! -s lint.log ] + +.PHONY: test +test: + @.build/test.sh + +.PHONY: ci +ci: SHELL := /bin/bash +ci: test + bash <(curl -s https://codecov.io/bash) + +.PHONY: bench +BENCH ?= . +bench: + @$(foreach pkg,$(PKGS),go test -bench=$(BENCH) -run="^$$" $(BENCH_FLAGS) $(pkg);) diff --git a/vendor/go.uber.org/dig/README.md b/vendor/go.uber.org/dig/README.md new file mode 100644 index 00000000..f23fa1ac --- /dev/null +++ b/vendor/go.uber.org/dig/README.md @@ -0,0 +1,43 @@ +# :hammer: dig [![GoDoc][doc-img]][doc] [![GitHub release][release-img]][release] [![Build Status][ci-img]][ci] [![Coverage Status][cov-img]][cov] [![Go Report Card][report-card-img]][report-card] + +A reflection based dependency injection toolkit for Go. + +### Good for: + +* Powering an application framework, e.g. [Fx](https://github.com/uber-go/fx). +* Resolving the object graph during process startup. + +### Bad for: + +* Using in place of an application framework, e.g. [Fx](https://github.com/uber-go/fx). +* Resolving dependencies after the process has already started. +* Exposing to user-land code as a [Service Locator](https://martinfowler.com/articles/injection.html#UsingAServiceLocator). + +## Installation + +We recommend locking to [SemVer](http://semver.org/) range `^1` using [Glide](https://github.com/Masterminds/glide): + +``` +glide get 'go.uber.org/dig#^1' +``` + +## Stability + +This library is `v1` and follows [SemVer](http://semver.org/) strictly. + +No breaking changes will be made to exported APIs before `v2.0.0`. + +[doc-img]: http://img.shields.io/badge/GoDoc-Reference-blue.svg +[doc]: https://godoc.org/go.uber.org/dig + +[release-img]: https://img.shields.io/github/release/uber-go/dig.svg +[release]: https://github.com/uber-go/dig/releases + +[ci-img]: https://img.shields.io/travis/uber-go/dig/master.svg +[ci]: https://travis-ci.org/uber-go/dig/branches + +[cov-img]: https://codecov.io/gh/uber-go/dig/branch/master/graph/badge.svg +[cov]: https://codecov.io/gh/uber-go/dig/branch/master + +[report-card-img]: https://goreportcard.com/badge/github.com/uber-go/dig +[report-card]: https://goreportcard.com/report/github.com/uber-go/dig diff --git a/vendor/go.uber.org/dig/check_license.sh b/vendor/go.uber.org/dig/check_license.sh new file mode 100755 index 00000000..e8162850 --- /dev/null +++ b/vendor/go.uber.org/dig/check_license.sh @@ -0,0 +1,23 @@ +#!/bin/bash + +set -eo pipefail + +run_update_license() { + # doing this because of SC2046 warning + for file in $(git ls-files | grep '\.go$'); do + update-license $@ "${file}" + done +} + +if [ -z "${DRY_RUN}" ]; then + run_update_license +else + DRY_OUTPUT="$(run_update_license --dry)" + if [ -n "${DRY_OUTPUT}" ]; then + echo "The following files do not have correct license headers." + echo "Please run make license and amend your commit." + echo + echo "${DRY_OUTPUT}" + exit 1 + fi +fi diff --git a/vendor/go.uber.org/dig/cycle.go b/vendor/go.uber.org/dig/cycle.go new file mode 100644 index 00000000..03f9f6bc --- /dev/null +++ b/vendor/go.uber.org/dig/cycle.go @@ -0,0 +1,142 @@ +// Copyright (c) 2019 Uber Technologies, 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. + +package dig + +import ( + "bytes" + "fmt" + + "go.uber.org/dig/internal/digreflect" +) + +type cycleEntry struct { + Key key + Func *digreflect.Func +} + +type errCycleDetected struct { + Path []cycleEntry +} + +func (e errCycleDetected) Error() string { + // We get something like, + // + // foo provided by "path/to/package".NewFoo (path/to/file.go:42) + // depends on bar provided by "another/package".NewBar (somefile.go:1) + // depends on baz provided by "somepackage".NewBar (anotherfile.go:2) + // depends on foo provided by "path/to/package".NewFoo (path/to/file.go:42) + // + b := new(bytes.Buffer) + + for i, entry := range e.Path { + if i > 0 { + b.WriteString("\n\tdepends on ") + } + fmt.Fprintf(b, "%v provided by %v", entry.Key, entry.Func) + } + return b.String() +} + +// IsCycleDetected returns a boolean as to whether the provided error indicates +// a cycle was detected in the container graph. +func IsCycleDetected(err error) bool { + _, ok := RootCause(err).(errCycleDetected) + return ok +} + +func verifyAcyclic(c containerStore, n provider, k key) error { + visited := make(map[key]struct{}) + err := detectCycles(n, c, []cycleEntry{ + {Key: k, Func: n.Location()}, + }, visited) + if err != nil { + err = errWrapf(err, "this function introduces a cycle") + } + return err +} + +func detectCycles(n provider, c containerStore, path []cycleEntry, visited map[key]struct{}) error { + var err error + walkParam(n.ParamList(), paramVisitorFunc(func(param param) bool { + if err != nil { + return false + } + + var ( + k key + providers []provider + ) + switch p := param.(type) { + case paramSingle: + k = key{name: p.Name, t: p.Type} + if _, ok := visited[k]; ok { + // We've already checked the dependencies for this type. + return false + } + providers = c.getValueProviders(p.Name, p.Type) + case paramGroupedSlice: + // NOTE: The key uses the element type, not the slice type. + k = key{group: p.Group, t: p.Type.Elem()} + if _, ok := visited[k]; ok { + // We've already checked the dependencies for this type. + return false + } + providers = c.getGroupProviders(p.Group, p.Type.Elem()) + default: + // Recurse for non-edge params. + return true + } + + entry := cycleEntry{Func: n.Location(), Key: k} + + if len(path) > 0 { + // Only mark a key as visited if path exists, i.e. this is not the + // first iteration through the c.verifyAcyclic() check. Otherwise the + // early exit from checking visited above will short circuit the + // cycle check below. + visited[k] = struct{}{} + + // If it exists, the first element of path is the new addition to the + // graph, therefore it must be in any cycle that exists, assuming + // verifyAcyclic has been run for every previous Provide. + // + // Alternatively, if deferAcyclicVerification was set and detectCycles + // is only being called before the first Invoke, each node in the + // graph will be tested as the first element of the path, so any + // cycle that exists is guaranteed to trip the following condition. + if path[0].Key == k { + err = errCycleDetected{Path: append(path, entry)} + return false + } + } + + for _, n := range providers { + if e := detectCycles(n, c, append(path, entry), visited); e != nil { + err = e + return false + } + } + + return true + })) + + return err +} diff --git a/vendor/go.uber.org/dig/dig.go b/vendor/go.uber.org/dig/dig.go new file mode 100644 index 00000000..36df0873 --- /dev/null +++ b/vendor/go.uber.org/dig/dig.go @@ -0,0 +1,774 @@ +// Copyright (c) 2019 Uber Technologies, 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. + +package dig + +import ( + "errors" + "fmt" + "math/rand" + "reflect" + "sort" + "strconv" + "strings" + "time" + + "go.uber.org/dig/internal/digreflect" + "go.uber.org/dig/internal/dot" +) + +const ( + _optionalTag = "optional" + _nameTag = "name" + _groupTag = "group" +) + +// Unique identification of an object in the graph. +type key struct { + t reflect.Type + + // Only one of name or group will be set. + name string + group string +} + +// Option configures a Container. It's included for future functionality; +// currently, there are no concrete implementations. +type Option interface { + applyOption(*Container) +} + +type optionFunc func(*Container) + +func (f optionFunc) applyOption(c *Container) { f(c) } + +type provideOptions struct { + Name string + Group string +} + +func (o *provideOptions) Validate() error { + if len(o.Group) > 0 && len(o.Name) > 0 { + return fmt.Errorf( + "cannot use named values with value groups: name:%q provided with group:%q", o.Name, o.Group) + } + + // Names must be representable inside a backquoted string. The only + // limitation for raw string literals as per + // https://golang.org/ref/spec#raw_string_lit is that they cannot contain + // backquotes. + if strings.ContainsRune(o.Name, '`') { + return fmt.Errorf("invalid dig.Name(%q): names cannot contain backquotes", o.Name) + } + if strings.ContainsRune(o.Group, '`') { + return fmt.Errorf("invalid dig.Group(%q): group names cannot contain backquotes", o.Group) + } + return nil +} + +// A ProvideOption modifies the default behavior of Provide. +type ProvideOption interface { + applyProvideOption(*provideOptions) +} + +type provideOptionFunc func(*provideOptions) + +func (f provideOptionFunc) applyProvideOption(opts *provideOptions) { f(opts) } + +// Name is a ProvideOption that specifies that all values produced by a +// constructor should have the given name. See also the package documentation +// about Named Values. +// +// Given, +// +// func NewReadOnlyConnection(...) (*Connection, error) +// func NewReadWriteConnection(...) (*Connection, error) +// +// The following will provide two connections to the container: one under the +// name "ro" and the other under the name "rw". +// +// c.Provide(NewReadOnlyConnection, dig.Name("ro")) +// c.Provide(NewReadWriteConnection, dig.Name("rw")) +// +// This option cannot be provided for constructors which produce result +// objects. +func Name(name string) ProvideOption { + return provideOptionFunc(func(opts *provideOptions) { + opts.Name = name + }) +} + +// Group is a ProvideOption that specifies that all values produced by a +// constructor should be added to the specified group. See also the package +// documentation about Value Groups. +// +// This option cannot be provided for constructors which produce result +// objects. +func Group(group string) ProvideOption { + return provideOptionFunc(func(opts *provideOptions) { + opts.Group = group + }) +} + +// An InvokeOption modifies the default behavior of Invoke. It's included for +// future functionality; currently, there are no concrete implementations. +type InvokeOption interface { + unimplemented() +} + +// Container is a directed acyclic graph of types and their dependencies. +type Container struct { + // Mapping from key to all the nodes that can provide a value for that + // key. + providers map[key][]*node + + // All nodes in the container. + nodes []*node + + // Values that have already been generated in the container. + values map[key]reflect.Value + + // Values groups that have already been generated in the container. + groups map[key][]reflect.Value + + // Source of randomness. + rand *rand.Rand + + // Flag indicating whether the graph has been checked for cycles. + isVerifiedAcyclic bool + + // Defer acyclic check on provide until Invoke. + deferAcyclicVerification bool +} + +// containerWriter provides write access to the Container's underlying data +// store. +type containerWriter interface { + // setValue sets the value with the given name and type in the container. + // If a value with the same name and type already exists, it will be + // overwritten. + setValue(name string, t reflect.Type, v reflect.Value) + + // submitGroupedValue submits a value to the value group with the provided + // name. + submitGroupedValue(name string, t reflect.Type, v reflect.Value) +} + +// containerStore provides access to the Container's underlying data store. +type containerStore interface { + containerWriter + + // Returns a slice containing all known types. + knownTypes() []reflect.Type + + // Retrieves the value with the provided name and type, if any. + getValue(name string, t reflect.Type) (v reflect.Value, ok bool) + + // Retrieves all values for the provided group and type. + // + // The order in which the values are returned is undefined. + getValueGroup(name string, t reflect.Type) []reflect.Value + + // Returns the providers that can produce a value with the given name and + // type. + getValueProviders(name string, t reflect.Type) []provider + + // Returns the providers that can produce values for the given group and + // type. + getGroupProviders(name string, t reflect.Type) []provider + + createGraph() *dot.Graph +} + +// provider encapsulates a user-provided constructor. +type provider interface { + // ID is a unique numerical identifier for this provider. + ID() dot.CtorID + + // Location returns where this constructor was defined. + Location() *digreflect.Func + + // ParamList returns information about the direct dependencies of this + // constructor. + ParamList() paramList + + // ResultList returns information about the values produced by this + // constructor. + ResultList() resultList + + // Calls the underlying constructor, reading values from the + // containerStore as needed. + // + // The values produced by this provider should be submitted into the + // containerStore. + Call(containerStore) error +} + +// New constructs a Container. +func New(opts ...Option) *Container { + c := &Container{ + providers: make(map[key][]*node), + values: make(map[key]reflect.Value), + groups: make(map[key][]reflect.Value), + rand: rand.New(rand.NewSource(time.Now().UnixNano())), + } + + for _, opt := range opts { + opt.applyOption(c) + } + return c +} + +// DeferAcyclicVerification is an Option to override the default behavior +// of container.Provide, deferring the dependency graph validation to no longer +// run after each call to container.Provide. The container will instead verify +// the graph on first `Invoke`. +// +// Applications adding providers to a container in a tight loop may experience +// performance improvements by initializing the container with this option. +func DeferAcyclicVerification() Option { + return optionFunc(func(c *Container) { + c.deferAcyclicVerification = true + }) +} + +// Changes the source of randomness for the container. +// +// This will help provide determinism during tests. +func setRand(r *rand.Rand) Option { + return optionFunc(func(c *Container) { + c.rand = r + }) +} + +func (c *Container) knownTypes() []reflect.Type { + typeSet := make(map[reflect.Type]struct{}, len(c.providers)) + for k := range c.providers { + typeSet[k.t] = struct{}{} + } + + types := make([]reflect.Type, 0, len(typeSet)) + for t := range typeSet { + types = append(types, t) + } + sort.Sort(byTypeName(types)) + return types +} + +func (c *Container) getValue(name string, t reflect.Type) (v reflect.Value, ok bool) { + v, ok = c.values[key{name: name, t: t}] + return +} + +func (c *Container) setValue(name string, t reflect.Type, v reflect.Value) { + c.values[key{name: name, t: t}] = v +} + +func (c *Container) getValueGroup(name string, t reflect.Type) []reflect.Value { + items := c.groups[key{group: name, t: t}] + // shuffle the list so users don't rely on the ordering of grouped values + return shuffledCopy(c.rand, items) +} + +func (c *Container) submitGroupedValue(name string, t reflect.Type, v reflect.Value) { + k := key{group: name, t: t} + c.groups[k] = append(c.groups[k], v) +} + +func (c *Container) getValueProviders(name string, t reflect.Type) []provider { + return c.getProviders(key{name: name, t: t}) +} + +func (c *Container) getGroupProviders(name string, t reflect.Type) []provider { + return c.getProviders(key{group: name, t: t}) +} + +func (c *Container) getProviders(k key) []provider { + nodes := c.providers[k] + providers := make([]provider, len(nodes)) + for i, n := range nodes { + providers[i] = n + } + return providers +} + +// Provide teaches the container how to build values of one or more types and +// expresses their dependencies. +// +// The first argument of Provide is a function that accepts zero or more +// parameters and returns one or more results. The function may optionally +// return an error to indicate that it failed to build the value. This +// function will be treated as the constructor for all the types it returns. +// This function will be called AT MOST ONCE when a type produced by it, or a +// type that consumes this function's output, is requested via Invoke. If the +// same types are requested multiple times, the previously produced value will +// be reused. +// +// In addition to accepting constructors that accept dependencies as separate +// arguments and produce results as separate return values, Provide also +// accepts constructors that specify dependencies as dig.In structs and/or +// specify results as dig.Out structs. +func (c *Container) Provide(constructor interface{}, opts ...ProvideOption) error { + ctype := reflect.TypeOf(constructor) + if ctype == nil { + return errors.New("can't provide an untyped nil") + } + if ctype.Kind() != reflect.Func { + return fmt.Errorf("must provide constructor function, got %v (type %v)", constructor, ctype) + } + + var options provideOptions + for _, o := range opts { + o.applyProvideOption(&options) + } + if err := options.Validate(); err != nil { + return err + } + + if err := c.provide(constructor, options); err != nil { + return errProvide{ + Func: digreflect.InspectFunc(constructor), + Reason: err, + } + } + return nil +} + +// Invoke runs the given function after instantiating its dependencies. +// +// Any arguments that the function has are treated as its dependencies. The +// dependencies are instantiated in an unspecified order along with any +// dependencies that they might have. +// +// The function may return an error to indicate failure. The error will be +// returned to the caller as-is. +func (c *Container) Invoke(function interface{}, opts ...InvokeOption) error { + ftype := reflect.TypeOf(function) + if ftype == nil { + return errors.New("can't invoke an untyped nil") + } + if ftype.Kind() != reflect.Func { + return fmt.Errorf("can't invoke non-function %v (type %v)", function, ftype) + } + + pl, err := newParamList(ftype) + if err != nil { + return err + } + + if err := shallowCheckDependencies(c, pl); err != nil { + return errMissingDependencies{ + Func: digreflect.InspectFunc(function), + Reason: err, + } + } + + if !c.isVerifiedAcyclic { + if err := c.verifyAcyclic(); err != nil { + return err + } + } + + args, err := pl.BuildList(c) + if err != nil { + return errArgumentsFailed{ + Func: digreflect.InspectFunc(function), + Reason: err, + } + } + + returned := reflect.ValueOf(function).Call(args) + if len(returned) == 0 { + return nil + } + if last := returned[len(returned)-1]; isError(last.Type()) { + if err, _ := last.Interface().(error); err != nil { + return err + } + } + return nil +} + +func (c *Container) verifyAcyclic() error { + visited := make(map[key]struct{}) + for _, n := range c.nodes { + if err := detectCycles(n, c, nil /* path */, visited); err != nil { + return errWrapf(err, "cycle detected in dependency graph") + } + } + + c.isVerifiedAcyclic = true + return nil +} + +func (c *Container) provide(ctor interface{}, opts provideOptions) error { + n, err := newNode( + ctor, + nodeOptions{ + ResultName: opts.Name, + ResultGroup: opts.Group, + }, + ) + if err != nil { + return err + } + + keys, err := c.findAndValidateResults(n) + if err != nil { + return err + } + + ctype := reflect.TypeOf(ctor) + if len(keys) == 0 { + return fmt.Errorf("%v must provide at least one non-error type", ctype) + } + + for k := range keys { + c.isVerifiedAcyclic = false + oldProviders := c.providers[k] + c.providers[k] = append(c.providers[k], n) + + if c.deferAcyclicVerification { + continue + } + if err := verifyAcyclic(c, n, k); err != nil { + c.providers[k] = oldProviders + return err + } + c.isVerifiedAcyclic = true + } + + c.nodes = append(c.nodes, n) + + return nil +} + +// Builds a collection of all result types produced by this node. +func (c *Container) findAndValidateResults(n *node) (map[key]struct{}, error) { + var err error + keyPaths := make(map[key]string) + walkResult(n.ResultList(), connectionVisitor{ + c: c, + n: n, + err: &err, + keyPaths: keyPaths, + }) + + if err != nil { + return nil, err + } + + keys := make(map[key]struct{}, len(keyPaths)) + for k := range keyPaths { + keys[k] = struct{}{} + } + return keys, nil +} + +// Visits the results of a node and compiles a collection of all the keys +// produced by that node. +type connectionVisitor struct { + c *Container + n *node + + // If this points to a non-nil value, we've already encountered an error + // and should stop traversing. + err *error + + // Map of keys provided to path that provided this. The path is a string + // documenting which positional return value or dig.Out attribute is + // providing this particular key. + // + // For example, "[0].Foo" indicates that the value was provided by the Foo + // attribute of the dig.Out returned as the first result of the + // constructor. + keyPaths map[key]string + + // We track the path to the current result here. For example, this will + // be, ["[1]", "Foo", "Bar"] when we're visiting Bar in, + // + // func() (io.Writer, struct { + // dig.Out + // + // Foo struct { + // dig.Out + // + // Bar io.Reader + // } + // }) + currentResultPath []string +} + +func (cv connectionVisitor) AnnotateWithField(f resultObjectField) resultVisitor { + cv.currentResultPath = append(cv.currentResultPath, f.FieldName) + return cv +} + +func (cv connectionVisitor) AnnotateWithPosition(i int) resultVisitor { + cv.currentResultPath = append(cv.currentResultPath, fmt.Sprintf("[%d]", i)) + return cv +} + +func (cv connectionVisitor) Visit(res result) resultVisitor { + // Already failed. Stop looking. + if *cv.err != nil { + return nil + } + + path := strings.Join(cv.currentResultPath, ".") + + switch r := res.(type) { + case resultSingle: + k := key{name: r.Name, t: r.Type} + + if conflict, ok := cv.keyPaths[k]; ok { + *cv.err = fmt.Errorf( + "cannot provide %v from %v: already provided by %v", + k, path, conflict) + return nil + } + + if ps := cv.c.providers[k]; len(ps) > 0 { + cons := make([]string, len(ps)) + for i, p := range ps { + cons[i] = fmt.Sprint(p.Location()) + } + + *cv.err = fmt.Errorf( + "cannot provide %v from %v: already provided by %v", + k, path, strings.Join(cons, "; ")) + return nil + } + + cv.keyPaths[k] = path + + case resultGrouped: + // we don't really care about the path for this since conflicts are + // okay for group results. We'll track it for the sake of having a + // value there. + k := key{group: r.Group, t: r.Type} + cv.keyPaths[k] = path + } + + return cv +} + +// node is a node in the dependency graph. Each node maps to a single +// constructor provided by the user. +// +// Nodes can produce zero or more values that they store into the container. +// For the Provide path, we verify that nodes produce at least one value, +// otherwise the function will never be called. +type node struct { + ctor interface{} + ctype reflect.Type + + // Location where this function was defined. + location *digreflect.Func + + // id uniquely identifies the constructor that produces a node. + id dot.CtorID + + // Whether the constructor owned by this node was already called. + called bool + + // Type information about constructor parameters. + paramList paramList + + // Type information about constructor results. + resultList resultList +} + +type nodeOptions struct { + // If specified, all values produced by this node have the provided name + // or belong to the specified value group + ResultName string + ResultGroup string +} + +func newNode(ctor interface{}, opts nodeOptions) (*node, error) { + cval := reflect.ValueOf(ctor) + ctype := cval.Type() + cptr := cval.Pointer() + + params, err := newParamList(ctype) + if err != nil { + return nil, err + } + + results, err := newResultList( + ctype, + resultOptions{ + Name: opts.ResultName, + Group: opts.ResultGroup, + }, + ) + if err != nil { + return nil, err + } + + return &node{ + ctor: ctor, + ctype: ctype, + location: digreflect.InspectFunc(ctor), + id: dot.CtorID(cptr), + paramList: params, + resultList: results, + }, err +} + +func (n *node) Location() *digreflect.Func { return n.location } +func (n *node) ParamList() paramList { return n.paramList } +func (n *node) ResultList() resultList { return n.resultList } +func (n *node) ID() dot.CtorID { return n.id } + +// Call calls this node's constructor if it hasn't already been called and +// injects any values produced by it into the provided container. +func (n *node) Call(c containerStore) error { + if n.called { + return nil + } + + if err := shallowCheckDependencies(c, n.paramList); err != nil { + return errMissingDependencies{ + Func: n.location, + Reason: err, + } + } + + args, err := n.paramList.BuildList(c) + if err != nil { + return errArgumentsFailed{ + Func: n.location, + Reason: err, + } + } + + receiver := newStagingContainerWriter() + results := reflect.ValueOf(n.ctor).Call(args) + if err := n.resultList.ExtractList(receiver, results); err != nil { + return errConstructorFailed{Func: n.location, Reason: err} + } + receiver.Commit(c) + n.called = true + return nil +} + +// Checks if a field of an In struct is optional. +func isFieldOptional(f reflect.StructField) (bool, error) { + tag := f.Tag.Get(_optionalTag) + if tag == "" { + return false, nil + } + + optional, err := strconv.ParseBool(tag) + if err != nil { + err = errWrapf(err, + "invalid value %q for %q tag on field %v", + tag, _optionalTag, f.Name) + } + + return optional, err +} + +// Checks that all direct dependencies of the provided param are present in +// the container. Returns an error if not. +func shallowCheckDependencies(c containerStore, p param) error { + var missing errMissingManyTypes + var addMissingNodes []*dot.Param + walkParam(p, paramVisitorFunc(func(p param) bool { + ps, ok := p.(paramSingle) + if !ok { + return true + } + + if ns := c.getValueProviders(ps.Name, ps.Type); len(ns) == 0 && !ps.Optional { + missing = append(missing, newErrMissingType(c, key{name: ps.Name, t: ps.Type})) + addMissingNodes = append(addMissingNodes, ps.DotParam()...) + } + + return true + })) + + if len(missing) > 0 { + return missing + } + return nil +} + +// stagingContainerWriter is a containerWriter that records the changes that +// would be made to a containerWriter and defers them until Commit is called. +type stagingContainerWriter struct { + values map[key]reflect.Value + groups map[key][]reflect.Value +} + +var _ containerWriter = (*stagingContainerWriter)(nil) + +func newStagingContainerWriter() *stagingContainerWriter { + return &stagingContainerWriter{ + values: make(map[key]reflect.Value), + groups: make(map[key][]reflect.Value), + } +} + +func (sr *stagingContainerWriter) setValue(name string, t reflect.Type, v reflect.Value) { + sr.values[key{t: t, name: name}] = v +} + +func (sr *stagingContainerWriter) submitGroupedValue(group string, t reflect.Type, v reflect.Value) { + k := key{t: t, group: group} + sr.groups[k] = append(sr.groups[k], v) +} + +// Commit commits the received results to the provided containerWriter. +func (sr *stagingContainerWriter) Commit(cw containerWriter) { + for k, v := range sr.values { + cw.setValue(k.name, k.t, v) + } + + for k, vs := range sr.groups { + for _, v := range vs { + cw.submitGroupedValue(k.group, k.t, v) + } + } +} + +type byTypeName []reflect.Type + +func (bs byTypeName) Len() int { + return len(bs) +} + +func (bs byTypeName) Less(i int, j int) bool { + return fmt.Sprint(bs[i]) < fmt.Sprint(bs[j]) +} + +func (bs byTypeName) Swap(i int, j int) { + bs[i], bs[j] = bs[j], bs[i] +} + +func shuffledCopy(rand *rand.Rand, items []reflect.Value) []reflect.Value { + newItems := make([]reflect.Value, len(items)) + for i, j := range rand.Perm(len(items)) { + newItems[i] = items[j] + } + return newItems +} diff --git a/vendor/go.uber.org/dig/doc.go b/vendor/go.uber.org/dig/doc.go new file mode 100644 index 00000000..f1172b5c --- /dev/null +++ b/vendor/go.uber.org/dig/doc.go @@ -0,0 +1,334 @@ +// Copyright (c) 2019 Uber Technologies, 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. + +// Package dig provides an opinionated way of resolving object dependencies. +// +// Status +// +// STABLE. No breaking changes will be made in this major version. +// +// Container +// +// Dig exposes type Container as an object capable of resolving a directed +// acyclic dependency graph. Use the New function to create one. +// +// c := dig.New() +// +// Provide +// +// Constructors for different types are added to the container by using the +// Provide method. A constructor can declare a dependency on another type by +// simply adding it as a function parameter. Dependencies for a type can be +// added to the graph both, before and after the type was added. +// +// err := c.Provide(func(conn *sql.DB) (*UserGateway, error) { +// // ... +// }) +// if err != nil { +// // ... +// } +// +// if err := c.Provide(newDBConnection); err != nil { +// // ... +// } +// +// Multiple constructors can rely on the same type. The container creates a +// singleton for each retained type, instantiating it at most once when +// requested directly or as a dependency of another type. +// +// err := c.Provide(func(conn *sql.DB) *CommentGateway { +// // ... +// }) +// if err != nil { +// // ... +// } +// +// Constructors can declare any number of dependencies as parameters and +// optionally, return errors. +// +// err := c.Provide(func(u *UserGateway, c *CommentGateway) (*RequestHandler, error) { +// // ... +// }) +// if err != nil { +// // ... +// } +// +// if err := c.Provide(newHTTPServer); err != nil { +// // ... +// } +// +// Constructors can also return multiple results to add multiple types to the +// container. +// +// err := c.Provide(func(conn *sql.DB) (*UserGateway, *CommentGateway, error) { +// // ... +// }) +// if err != nil { +// // ... +// } +// +// Constructors that accept a variadic number of arguments are treated as if +// they don't have those arguments. That is, +// +// func NewVoteGateway(db *sql.DB, options ...Option) *VoteGateway +// +// Is treated the same as, +// +// func NewVoteGateway(db *sql.DB) *VoteGateway +// +// The constructor will be called with all other dependencies and no variadic +// arguments. +// +// Invoke +// +// Types added to to the container may be consumed by using the Invoke method. +// Invoke accepts any function that accepts one or more parameters and +// optionally, returns an error. Dig calls the function with the requested +// type, instantiating only those types that were requested by the function. +// The call fails if any type or its dependencies (both direct and transitive) +// were not available in the container. +// +// err := c.Invoke(func(l *log.Logger) { +// // ... +// }) +// if err != nil { +// // ... +// } +// +// err := c.Invoke(func(server *http.Server) error { +// // ... +// }) +// if err != nil { +// // ... +// } +// +// Any error returned by the invoked function is propagated back to the +// caller. +// +// Parameter Objects +// +// Constructors declare their dependencies as function parameters. This can +// very quickly become unreadable if the constructor has a lot of +// dependencies. +// +// func NewHandler(users *UserGateway, comments *CommentGateway, posts *PostGateway, votes *VoteGateway, authz *AuthZGateway) *Handler { +// // ... +// } +// +// A pattern employed to improve readability in a situation like this is to +// create a struct that lists all the parameters of the function as fields and +// changing the function to accept that struct instead. This is referred to as +// a parameter object. +// +// Dig has first class support for parameter objects: any struct embedding +// dig.In gets treated as a parameter object. The following is equivalent to +// the constructor above. +// +// type HandlerParams struct { +// dig.In +// +// Users *UserGateway +// Comments *CommentGateway +// Posts *PostGateway +// Votes *VoteGateway +// AuthZ *AuthZGateway +// } +// +// func NewHandler(p HandlerParams) *Handler { +// // ... +// } +// +// Handlers can receive any combination of parameter objects and parameters. +// +// func NewHandler(p HandlerParams, l *log.Logger) *Handler { +// // ... +// } +// +// Result Objects +// +// Result objects are the flip side of parameter objects. These are structs +// that represent multiple outputs from a single function as fields in the +// struct. Structs embedding dig.Out get treated as result objects. +// +// func SetupGateways(conn *sql.DB) (*UserGateway, *CommentGateway, *PostGateway, error) { +// // ... +// } +// +// The above is equivalent to, +// +// type Gateways struct { +// dig.Out +// +// Users *UserGateway +// Comments *CommentGateway +// Posts *PostGateway +// } +// +// func SetupGateways(conn *sql.DB) (Gateways, error) { +// // ... +// } +// +// Optional Dependencies +// +// Constructors often don't have a hard dependency on some types and +// are able to operate in a degraded state when that dependency is missing. +// Dig supports declaring dependencies as optional by adding an +// `optional:"true"` tag to fields of a dig.In struct. +// +// Fields in a dig.In structs that have the `optional:"true"` tag are treated +// as optional by Dig. +// +// type UserGatewayParams struct { +// dig.In +// +// Conn *sql.DB +// Cache *redis.Client `optional:"true"` +// } +// +// If an optional field is not available in the container, the constructor +// will receive a zero value for the field. +// +// func NewUserGateway(p UserGatewayParams, log *log.Logger) (*UserGateway, error) { +// if p.Cache != nil { +// log.Print("Logging disabled") +// } +// // ... +// } +// +// Constructors that declare dependencies as optional MUST handle the case of +// those dependencies being absent. +// +// The optional tag also allows adding new dependencies without breaking +// existing consumers of the constructor. +// +// Named Values +// +// Some use cases call for multiple values of the same type. Dig allows adding +// multiple values of the same type to the container with the use of Named +// Values. +// +// Named Values can be produced by passing the dig.Name option when a +// constructor is provided. All values produced by that constructor will have +// the given name. +// +// Given the following constructors, +// +// func NewReadOnlyConnection(...) (*sql.DB, error) +// func NewReadWriteConnection(...) (*sql.DB, error) +// +// You can provide *sql.DB into a Container under different names by passing +// the dig.Name option. +// +// c.Provide(NewReadOnlyConnection, dig.Name("ro")) +// c.Provide(NewReadWriteConnection, dig.Name("rw")) +// +// Alternatively, you can produce a dig.Out struct and tag its fields with +// `name:".."` to have the corresponding value added to the graph under the +// specified name. +// +// type ConnectionResult struct { +// dig.Out +// +// ReadWrite *sql.DB `name:"rw"` +// ReadOnly *sql.DB `name:"ro"` +// } +// +// func ConnectToDatabase(...) (ConnectionResult, error) { +// // ... +// return ConnectionResult{ReadWrite: rw, ReadOnly: ro}, nil +// } +// +// Regardless of how a Named Value was produced, it can be consumed by another +// constructor by accepting a dig.In struct which has exported fields with the +// same name AND type that you provided. +// +// type GatewayParams struct { +// dig.In +// +// WriteToConn *sql.DB `name:"rw"` +// ReadFromConn *sql.DB `name:"ro"` +// } +// +// The name tag may be combined with the optional tag to declare the +// dependency optional. +// +// type GatewayParams struct { +// dig.In +// +// WriteToConn *sql.DB `name:"rw"` +// ReadFromConn *sql.DB `name:"ro" optional:"true"` +// } +// +// func NewCommentGateway(p GatewayParams, log *log.Logger) (*CommentGateway, error) { +// if p.ReadFromConn == nil { +// log.Print("Warning: Using RW connection for reads") +// p.ReadFromConn = p.WriteToConn +// } +// // ... +// } +// +// Value Groups +// +// Added in Dig 1.2. +// +// Dig provides value groups to allow producing and consuming many values of +// the same type. Value groups allow constructors to send values to a named, +// unordered collection in the container. Other constructors can request all +// values in this collection as a slice. +// +// Constructors can send values into value groups by returning a dig.Out +// struct tagged with `group:".."`. +// +// type HandlerResult struct { +// dig.Out +// +// Handler Handler `group:"server"` +// } +// +// func NewHelloHandler() HandlerResult { +// .. +// } +// +// func NewEchoHandler() HandlerResult { +// .. +// } +// +// Any number of constructors may provide values to this named collection. +// Other constructors can request all values for this collection by requesting +// a slice tagged with `group:".."`. This will execute all constructors that +// provide a value to that group in an unspecified order. +// +// type ServerParams struct { +// dig.In +// +// Handlers []Handler `group:"server"` +// } +// +// func NewServer(p ServerParams) *Server { +// server := newServer() +// for _, h := range p.Handlers { +// server.Register(h) +// } +// return server +// } +// +// Note that values in a value group are unordered. Dig makes no guarantees +// about the order in which these values will be produced. +package dig // import "go.uber.org/dig" diff --git a/vendor/go.uber.org/dig/error.go b/vendor/go.uber.org/dig/error.go new file mode 100644 index 00000000..6bf3d012 --- /dev/null +++ b/vendor/go.uber.org/dig/error.go @@ -0,0 +1,324 @@ +// Copyright (c) 2019 Uber Technologies, 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. + +package dig + +import ( + "bytes" + "fmt" + "reflect" + "sort" + + "go.uber.org/dig/internal/digreflect" + "go.uber.org/dig/internal/dot" +) + +// Errors which know their underlying cause should implement this interface to +// be compatible with RootCause. +// +// We use an unexported "cause" method instead of "Cause" because we don't +// want dig-internal causes to be confused with the cause of the user-provided +// errors. (For example, if the users are using github.com/pkg/errors.) +type causer interface { + cause() error +} + +// RootCause returns the original error that caused the provided dig failure. +// +// RootCause may be used on errors returned by Invoke to get the original +// error returned by a constructor or invoked function. +func RootCause(err error) error { + for { + if e, ok := err.(causer); ok { + err = e.cause() + } else { + return err + } + } +} + +// errWrapf wraps an existing error with more contextual information. +// +// The given error is treated as the cause of the returned error (see causer). +// +// RootCause(errWrapf(errWrapf(err, ...), ...)) == err +// +// Use errWrapf instead of fmt.Errorf if the message ends with ": ". +func errWrapf(err error, msg string, args ...interface{}) error { + if err == nil { + return nil + } + + if len(args) > 0 { + msg = fmt.Sprintf(msg, args...) + } + + return wrappedError{err: err, msg: msg} +} + +type wrappedError struct { + err error + msg string +} + +func (e wrappedError) cause() error { return e.err } + +func (e wrappedError) Error() string { + return fmt.Sprintf("%v: %v", e.msg, e.err) +} + +// errProvide is returned when a constructor could not be Provided into the +// container. +type errProvide struct { + Func *digreflect.Func + Reason error +} + +func (e errProvide) cause() error { return e.Reason } + +func (e errProvide) Error() string { + return fmt.Sprintf("function %v cannot be provided: %v", e.Func, e.Reason) +} + +// errConstructorFailed is returned when a user-provided constructor failed +// with a non-nil error. +type errConstructorFailed struct { + Func *digreflect.Func + Reason error +} + +func (e errConstructorFailed) cause() error { return e.Reason } + +func (e errConstructorFailed) Error() string { + return fmt.Sprintf("function %v returned a non-nil error: %v", e.Func, e.Reason) +} + +// errArgumentsFailed is returned when a function could not be run because one +// of its dependencies failed to build for any reason. +type errArgumentsFailed struct { + Func *digreflect.Func + Reason error +} + +func (e errArgumentsFailed) cause() error { return e.Reason } + +func (e errArgumentsFailed) Error() string { + return fmt.Sprintf("could not build arguments for function %v: %v", e.Func, e.Reason) +} + +// errMissingDependencies is returned when the dependencies of a function are +// not available in the container. +type errMissingDependencies struct { + Func *digreflect.Func + Reason error +} + +func (e errMissingDependencies) cause() error { return e.Reason } + +func (e errMissingDependencies) Error() string { + return fmt.Sprintf("missing dependencies for function %v: %v", e.Func, e.Reason) +} + +// errParamSingleFailed is returned when a paramSingle could not be built. +type errParamSingleFailed struct { + Key key + Reason error + CtorID dot.CtorID +} + +func (e errParamSingleFailed) cause() error { return e.Reason } + +func (e errParamSingleFailed) Error() string { + return fmt.Sprintf("failed to build %v: %v", e.Key, e.Reason) +} + +func (e errParamSingleFailed) updateGraph(g *dot.Graph) { + failed := &dot.Result{ + Node: &dot.Node{ + Name: e.Key.name, + Group: e.Key.group, + Type: e.Key.t, + }, + } + g.FailNodes([]*dot.Result{failed}, e.CtorID) +} + +// errParamGroupFailed is returned when a value group cannot be built because +// any of the values in the group failed to build. +type errParamGroupFailed struct { + Key key + Reason error + CtorID dot.CtorID +} + +func (e errParamGroupFailed) cause() error { return e.Reason } + +func (e errParamGroupFailed) Error() string { + return fmt.Sprintf("could not build value group %v: %v", e.Key, e.Reason) +} + +func (e errParamGroupFailed) updateGraph(g *dot.Graph) { + g.FailGroupNodes(e.Key.group, e.Key.t, e.CtorID) +} + +// errMissingType is returned when a single value that was expected in the +// container was not available. +type errMissingType struct { + Key key + + // If non-empty, we will include suggestions for what the user may have + // meant. + suggestions []key +} + +func newErrMissingType(c containerStore, k key) errMissingType { + // Possible types we will look for in the container. We will always look + // for pointers to the requested type and some extras on a per-Kind basis. + + suggestions := []reflect.Type{reflect.PtrTo(k.t)} + if k.t.Kind() == reflect.Ptr { + // The user requested a pointer but maybe we have a value. + suggestions = append(suggestions, k.t.Elem()) + } + + knownTypes := c.knownTypes() + if k.t.Kind() == reflect.Interface { + // Maybe we have an implementation of the interface. + for _, t := range knownTypes { + if t.Implements(k.t) { + suggestions = append(suggestions, t) + } + } + } else { + // Maybe we have an interface that this type implements. + for _, t := range knownTypes { + if t.Kind() == reflect.Interface { + if k.t.Implements(t) { + suggestions = append(suggestions, t) + } + } + } + } + + // range through c.providers is non-deterministic. Let's sort the list of + // suggestions. + sort.Sort(byTypeName(suggestions)) + + err := errMissingType{Key: k} + for _, t := range suggestions { + if len(c.getValueProviders(k.name, t)) > 0 { + k.t = t + err.suggestions = append(err.suggestions, k) + } + } + + return err +} + +func (e errMissingType) Error() string { + // Sample messages: + // + // type io.Reader is not in the container, did you mean to Provide it? + // type io.Reader is not in the container, did you mean to use one of *bytes.Buffer, *MyBuffer + // type bytes.Buffer is not in the container, did you mean to use *bytes.Buffer? + // type *foo[name="bar"] is not in the container, did you mean to use foo[name="bar"]? + + b := new(bytes.Buffer) + + fmt.Fprintf(b, "type %v is not in the container", e.Key) + switch len(e.suggestions) { + case 0: + b.WriteString(", did you mean to Provide it?") + case 1: + fmt.Fprintf(b, ", did you mean to use %v?", e.suggestions[0]) + default: + b.WriteString(", did you mean to use one of ") + for i, k := range e.suggestions { + if i > 0 { + b.WriteString(", ") + if i == len(e.suggestions)-1 { + b.WriteString("or ") + } + } + fmt.Fprint(b, k) + } + b.WriteString("?") + } + + return b.String() +} + +// errMissingManyTypes combines multiple errMissingType errors. +type errMissingManyTypes []errMissingType // length must be non-zero + +func (e errMissingManyTypes) Error() string { + if len(e) == 1 { + return e[0].Error() + } + + b := new(bytes.Buffer) + + b.WriteString("the following types are not in the container: ") + for i, err := range e { + if i > 0 { + b.WriteString("; ") + } + fmt.Fprintf(b, "%v", err.Key) + switch len(err.suggestions) { + case 0: + // do nothing + case 1: + fmt.Fprintf(b, " (did you mean %v?)", err.suggestions[0]) + default: + b.WriteString(" (did you mean ") + for i, k := range err.suggestions { + if i > 0 { + b.WriteString(", ") + if i == len(err.suggestions)-1 { + b.WriteString("or ") + } + } + fmt.Fprint(b, k) + } + b.WriteString("?)") + } + } + + return b.String() +} + +func (e errMissingManyTypes) updateGraph(g *dot.Graph) { + missing := make([]*dot.Result, len(e)) + + for i, err := range e { + missing[i] = &dot.Result{ + Node: &dot.Node{ + Name: err.Key.name, + Group: err.Key.group, + Type: err.Key.t, + }, + } + } + g.AddMissingNodes(missing) +} + +type errVisualizer interface { + updateGraph(*dot.Graph) +} diff --git a/vendor/go.uber.org/dig/glide.lock b/vendor/go.uber.org/dig/glide.lock new file mode 100644 index 00000000..f9d27846 --- /dev/null +++ b/vendor/go.uber.org/dig/glide.lock @@ -0,0 +1,17 @@ +hash: b6270b9f130f8c89f82156ca8d44cb16a3311c7a04746f2805f02c2f72bb58ec +updated: 2017-10-25T09:30:43.315666535-07:00 +imports: [] +testImports: +- name: github.com/davecgh/go-spew + version: 5215b55f46b2b919f50a1df0eaa5886afe4e3b3d + subpackages: + - spew +- name: github.com/pmezard/go-difflib + version: d8ed2627bdf02c080bf22230dbb337003b7aba2d + subpackages: + - difflib +- name: github.com/stretchr/testify + version: d77da356e56a7428ad25149ca77381849a6a5232 + subpackages: + - assert + - require diff --git a/vendor/go.uber.org/dig/glide.yaml b/vendor/go.uber.org/dig/glide.yaml new file mode 100644 index 00000000..972b804c --- /dev/null +++ b/vendor/go.uber.org/dig/glide.yaml @@ -0,0 +1,7 @@ +package: go.uber.org/dig +license: MIT +testImport: +- package: github.com/stretchr/testify + subpackages: + - assert + - require diff --git a/vendor/go.uber.org/dig/graph.go b/vendor/go.uber.org/dig/graph.go new file mode 100644 index 00000000..dd8e8229 --- /dev/null +++ b/vendor/go.uber.org/dig/graph.go @@ -0,0 +1,179 @@ +// Copyright (c) 2019 Uber Technologies, 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. + +package dig + +import ( + "io" + "strconv" + "text/template" + + "go.uber.org/dig/internal/dot" +) + +// A VisualizeOption modifies the default behavior of Visualize. +type VisualizeOption interface { + applyVisualizeOption(*visualizeOptions) +} + +type visualizeOptions struct { + VisualizeError error +} + +type visualizeOptionFunc func(*visualizeOptions) + +func (f visualizeOptionFunc) applyVisualizeOption(opts *visualizeOptions) { f(opts) } + +// VisualizeError includes a visualization of the given error in the output of +// Visualize if an error was returned by Invoke or Provide. +// +// if err := c.Provide(...); err != nil { +// dig.Visualize(c, w, dig.VisualizeError(err)) +// } +// +// This option has no effect if the error was nil or if it didn't contain any +// information to visualize. +func VisualizeError(err error) VisualizeOption { + return visualizeOptionFunc(func(opts *visualizeOptions) { + opts.VisualizeError = err + }) +} + +func updateGraph(dg *dot.Graph, err error) error { + var errors []errVisualizer + // Unwrap error to find the root cause. + for { + if ev, ok := err.(errVisualizer); ok { + errors = append(errors, ev) + } + e, ok := err.(causer) + if !ok { + break + } + err = e.cause() + } + + // If there are no errVisualizers included, we do not modify the graph. + if len(errors) == 0 { + return nil + } + + // We iterate in reverse because the last element is the root cause. + for i := len(errors) - 1; i >= 0; i-- { + errors[i].updateGraph(dg) + } + + // Remove non-error entries from the graph for readability. + dg.PruneSuccess() + + return nil +} + +var _graphTmpl = template.Must( + template.New("DotGraph"). + Funcs(template.FuncMap{ + "quote": strconv.Quote, + }). + Parse(`digraph { + rankdir=RL; + graph [compound=true]; + {{range $g := .Groups}} + {{- quote .String}} [{{.Attributes}}]; + {{range .Results}} + {{- quote $g.String}} -> {{quote .String}}; + {{end}} + {{end -}} + {{range $index, $ctor := .Ctors}} + subgraph cluster_{{$index}} { + constructor_{{$index}} [shape=plaintext label={{quote .Name}}]; + {{with .ErrorType}}color={{.Color}};{{end}} + {{range .Results}} + {{- quote .String}} [{{.Attributes}}]; + {{end}} + } + {{range .Params}} + constructor_{{$index}} -> {{quote .String}} [ltail=cluster_{{$index}}{{if .Optional}} style=dashed{{end}}]; + {{end}} + {{range .GroupParams}} + constructor_{{$index}} -> {{quote .String}} [ltail=cluster_{{$index}}]; + {{end -}} + {{end}} + {{range .Failed.TransitiveFailures}} + {{- quote .String}} [color=orange]; + {{end -}} + {{range .Failed.RootCauses}} + {{- quote .String}} [color=red]; + {{end}} +}`)) + +// Visualize parses the graph in Container c into DOT format and writes it to +// io.Writer w. +func Visualize(c *Container, w io.Writer, opts ...VisualizeOption) error { + dg := c.createGraph() + + var options visualizeOptions + for _, o := range opts { + o.applyVisualizeOption(&options) + } + + if options.VisualizeError != nil { + if err := updateGraph(dg, options.VisualizeError); err != nil { + return err + } + } + + return _graphTmpl.Execute(w, dg) +} + +// CanVisualizeError returns true if the error is an errVisualizer. +func CanVisualizeError(err error) bool { + for { + if _, ok := err.(errVisualizer); ok { + return true + } + e, ok := err.(causer) + if !ok { + break + } + err = e.cause() + } + + return false +} + +func (c *Container) createGraph() *dot.Graph { + dg := dot.NewGraph() + + for _, n := range c.nodes { + dg.AddCtor(newDotCtor(n), n.paramList.DotParam(), n.resultList.DotResult()) + } + + return dg +} + +func newDotCtor(n *node) *dot.Ctor { + return &dot.Ctor{ + ID: n.id, + Name: n.location.Name, + Package: n.location.Package, + File: n.location.File, + Line: n.location.Line, + } +} diff --git a/vendor/go.uber.org/dig/internal/digreflect/func.go b/vendor/go.uber.org/dig/internal/digreflect/func.go new file mode 100644 index 00000000..05758ce5 --- /dev/null +++ b/vendor/go.uber.org/dig/internal/digreflect/func.go @@ -0,0 +1,103 @@ +// Copyright (c) 2019 Uber Technologies, 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. + +package digreflect + +import ( + "fmt" + "net/url" + "reflect" + "runtime" + "strings" +) + +// Func contains runtime information about a function. +type Func struct { + // Name of the function. + Name string + + // Name of the package in which this function is defined. + Package string + + // Path to the file in which this function is defined. + File string + + // Line number in the file at which this function is defined. + Line int +} + +// String returns a string representation of the function. +func (f *Func) String() string { + // "path/to/package".MyFunction (path/to/file.go:42) + return fmt.Sprintf("%q.%v (%v:%v)", f.Package, f.Name, f.File, f.Line) +} + +// InspectFunc inspects and returns runtime information about the given +// function. +func InspectFunc(function interface{}) *Func { + fptr := reflect.ValueOf(function).Pointer() + f := runtime.FuncForPC(fptr) + pkgName, funcName := splitFuncName(f.Name()) + fileName, lineNum := f.FileLine(fptr) + return &Func{ + Name: funcName, + Package: pkgName, + File: fileName, + Line: lineNum, + } +} + +const _vendor = "/vendor/" + +func splitFuncName(function string) (pname string, fname string) { + if len(function) == 0 { + return + } + + // We have something like "path.to/my/pkg.MyFunction". If the function is + // a closure, it is something like, "path.to/my/pkg.MyFunction.func1". + + idx := 0 + + // Everything up to the first "." after the last "/" is the package name. + // Everything after the "." is the full function name. + if i := strings.LastIndex(function, "/"); i >= 0 { + idx = i + } + if i := strings.Index(function[idx:], "."); i >= 0 { + idx += i + } + pname, fname = function[:idx], function[idx+1:] + + // The package may be vendored. + if i := strings.Index(pname, _vendor); i > 0 { + pname = pname[i+len(_vendor):] + } + + // Package names are URL-encoded to avoid ambiguity in the case where the + // package name contains ".git". Otherwise, "foo/bar.git.MyFunction" would + // mean that "git" is the top-level function and "MyFunction" is embedded + // inside it. + if unescaped, err := url.QueryUnescape(pname); err == nil { + pname = unescaped + } + + return +} diff --git a/vendor/go.uber.org/dig/internal/dot/README.md b/vendor/go.uber.org/dig/internal/dot/README.md new file mode 100644 index 00000000..1198ade5 --- /dev/null +++ b/vendor/go.uber.org/dig/internal/dot/README.md @@ -0,0 +1,61 @@ +# Dot + +The dot module generates a DOT file representation of a dependency graph. + +## Interpreting the graph + +The graph should be read from left to right. The leftmost node in the graph (the root node) depends +on its dependency tree to the right. An arrow from node_a to node_b in the graph means that node_b +is consumed by node_a and that node_b is a parameter of node_a. The rendered graph holds the +following kinds of nodes, + +**Nodes:** + +- *Constructors* [Rectangles]: Takes parameters and produces results. +- *Results* [Ovals]: Results inside a constructor are produced by that constructor. Results are consumed +directly by other constructors and/or part of a group of results. +- *Groups* [Diamonds]: Represent value groups in [fx](https://godoc.org/go.uber.org/fx). Multiple results can form a group. Any +result linked to a group by an edge are members of that group. A group is a collection of results. +Groups can also be parameters of constructors. + +**Edges:** + +- *Solid Arrows*: An arrow from node_a to node_b means that node_b is a parameter of node_a and that +node_a depends on node_b. +- *Dashed Arrows*: A dashed arrow from node_a to node_b represents an optional dependency that node_a +has on node_b. + +**Graph Colors:** + +- *Red*: Graph nodes are the root cause failures. +- *Orange*: Graph nodes are the transitive failures. + +## Testing and verifying changes + +Unit tests and visualize golden tests are run with + +```shell +$ make test +``` + +You can visualize the effect of your code changes by visualizing generated test graphs as pngs. + +In the dig root directory, generate the graph DOT files with respect to your latest code changes. + +```shell +$ go test -generate +``` + +Assuming that you have [graphviz](https://www.graphviz.org/) installed and are in the testdata directory, +generate a png image representation of a graph for viewing. + +```shell +$ dot -Tpng ${name_of_dot_file_in_testdata}.dot -o ${name_of_dot_file_in_testdata}.png +$ open ${name_of_dot_file_in_testdata}.png +``` + +## Graph Pruning + +If dot.Visualize is used to visualize an error graph, non-failing nodes are pruned out of the graph +to make the error graph more readable to the user. Pruning increases readability since successful +nodes clutter the graph and do not help the user debug errors. diff --git a/vendor/go.uber.org/dig/internal/dot/graph.go b/vendor/go.uber.org/dig/internal/dot/graph.go new file mode 100644 index 00000000..3706fa11 --- /dev/null +++ b/vendor/go.uber.org/dig/internal/dot/graph.go @@ -0,0 +1,466 @@ +// Copyright (c) 2019 Uber Technologies, 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. + +package dot + +import ( + "fmt" + "reflect" +) + +// ErrorType of a constructor or group is updated when they fail to build. +type ErrorType int + +const ( + noError ErrorType = iota + rootCause + transitiveFailure +) + +// CtorID is a unique numeric identifier for constructors. +type CtorID uintptr + +// Ctor encodes a constructor provided to the container for the DOT graph. +type Ctor struct { + Name string + Package string + File string + Line int + ID CtorID + Params []*Param + GroupParams []*Group + Results []*Result + ErrorType ErrorType +} + +// removeParam deletes the dependency on the provided result's nodeKey. +// This is used to prune links to results of deleted constructors. +func (c *Ctor) removeParam(k nodeKey) { + var pruned []*Param + for _, p := range c.Params { + if k != p.nodeKey() { + pruned = append(pruned, p) + } + } + c.Params = pruned +} + +type nodeKey struct { + t reflect.Type + name string + group string +} + +// Node is a single node in a graph and is embedded into Params and Results. +type Node struct { + Type reflect.Type + Name string + Group string +} + +func (n *Node) nodeKey() nodeKey { + return nodeKey{t: n.Type, name: n.Name, group: n.Group} +} + +// Param is a parameter node in the graph. Parameters are the input to constructors. +type Param struct { + *Node + + Optional bool +} + +// Result is a result node in the graph. Results are the output of constructors. +type Result struct { + *Node + + // GroupIndex is added to differentiate grouped values from one another. + // Since grouped values have the same type and group, their Node / string + // representations are the same so we need indices to uniquely identify + // the values. + GroupIndex int +} + +// Group is a group node in the graph. Group represents an fx value group. +type Group struct { + // Type is the type of values in the group. + Type reflect.Type + Name string + Results []*Result + ErrorType ErrorType +} + +func (g *Group) nodeKey() nodeKey { + return nodeKey{t: g.Type, group: g.Name} +} + +// TODO(rhang): Avoid linear search to discover group results that should be pruned. +func (g *Group) removeResult(r *Result) { + var pruned []*Result + for _, rg := range g.Results { + if r.GroupIndex != rg.GroupIndex { + pruned = append(pruned, rg) + } + } + g.Results = pruned +} + +// Graph is the DOT-format graph in a Container. +type Graph struct { + Ctors []*Ctor + ctorMap map[CtorID]*Ctor + + Groups []*Group + groupMap map[nodeKey]*Group + + consumers map[nodeKey][]*Ctor + + Failed *FailedNodes +} + +// FailedNodes is the nodes that failed in the graph. +type FailedNodes struct { + // RootCauses is a list of the point of failures. They are the root causes + // of failed invokes and can be either missing types (not provided) or + // error types (error providing). + RootCauses []*Result + + // TransitiveFailures is the list of nodes that failed to build due to + // missing/failed dependencies. + TransitiveFailures []*Result + + // ctors is a collection of failed constructors IDs that are populated as the graph is + // traversed for errors. + ctors map[CtorID]struct{} + + // Groups is a collection of failed groupKeys that is populated as the graph is traversed + // for errors. + groups map[nodeKey]struct{} +} + +// NewGraph creates an empty graph. +func NewGraph() *Graph { + return &Graph{ + ctorMap: make(map[CtorID]*Ctor), + groupMap: make(map[nodeKey]*Group), + consumers: make(map[nodeKey][]*Ctor), + Failed: &FailedNodes{ + ctors: make(map[CtorID]struct{}), + groups: make(map[nodeKey]struct{}), + }, + } +} + +// NewGroup creates a new group with information in the groupKey. +func NewGroup(k nodeKey) *Group { + return &Group{ + Type: k.t, + Name: k.group, + } +} + +// AddCtor adds the constructor with paramList and resultList into the graph. +func (dg *Graph) AddCtor(c *Ctor, paramList []*Param, resultList []*Result) { + var ( + params []*Param + groupParams []*Group + ) + + // Loop through the paramList to separate them into regular params and + // grouped params. For grouped params, we use getGroup to find the actual + // group. + for _, param := range paramList { + if param.Group == "" { + // Not a value group. + params = append(params, param) + continue + } + + k := nodeKey{t: param.Type.Elem(), group: param.Group} + group := dg.getGroup(k) + groupParams = append(groupParams, group) + } + + for _, result := range resultList { + // If the result is a grouped value, we want to update its GroupIndex + // and add it to the Group. + if result.Group != "" { + dg.addToGroup(result, c.ID) + } + } + + c.Params = params + c.GroupParams = groupParams + c.Results = resultList + + // Track which constructors consume a parameter. + for _, p := range paramList { + k := p.nodeKey() + dg.consumers[k] = append(dg.consumers[k], c) + } + + dg.Ctors = append(dg.Ctors, c) + dg.ctorMap[c.ID] = c +} + +func (dg *Graph) failNode(r *Result, isRootCause bool) { + if isRootCause { + dg.addRootCause(r) + } else { + dg.addTransitiveFailure(r) + } +} + +// AddMissingNodes adds missing nodes to the list of failed Results in the graph. +func (dg *Graph) AddMissingNodes(results []*Result) { + // The failure(s) are root causes if there are no other failures. + isRootCause := len(dg.Failed.RootCauses) == 0 + + for _, r := range results { + dg.failNode(r, isRootCause) + } +} + +// FailNodes adds results to the list of failed Results in the graph, and +// updates the state of the constructor with the given id accordingly. +func (dg *Graph) FailNodes(results []*Result, id CtorID) { + // This failure is the root cause if there are no other failures. + isRootCause := len(dg.Failed.RootCauses) == 0 + dg.Failed.ctors[id] = struct{}{} + + for _, r := range results { + dg.failNode(r, isRootCause) + } + + if c, ok := dg.ctorMap[id]; ok { + if isRootCause { + c.ErrorType = rootCause + } else { + c.ErrorType = transitiveFailure + } + } +} + +// FailGroupNodes finds and adds the failed grouped nodes to the list of failed +// Results in the graph, and updates the state of the group and constructor +// with the given id accordingly. +func (dg *Graph) FailGroupNodes(name string, t reflect.Type, id CtorID) { + // This failure is the root cause if there are no other failures. + isRootCause := len(dg.Failed.RootCauses) == 0 + + k := nodeKey{t: t, group: name} + group := dg.getGroup(k) + + // If the ctor does not exist it cannot be failed. + if _, ok := dg.ctorMap[id]; !ok { + return + } + + // Track which constructors and groups have failed. + dg.Failed.ctors[id] = struct{}{} + dg.Failed.groups[k] = struct{}{} + + for _, r := range dg.ctorMap[id].Results { + if r.Type == t && r.Group == name { + dg.failNode(r, isRootCause) + } + } + + if c, ok := dg.ctorMap[id]; ok { + if isRootCause { + group.ErrorType = rootCause + c.ErrorType = rootCause + } else { + group.ErrorType = transitiveFailure + c.ErrorType = transitiveFailure + } + } +} + +// getGroup finds the group by nodeKey from the graph. If it is not available, +// a new group is created and returned. +func (dg *Graph) getGroup(k nodeKey) *Group { + g, ok := dg.groupMap[k] + if !ok { + g = NewGroup(k) + dg.groupMap[k] = g + dg.Groups = append(dg.Groups, g) + } + return g +} + +// addToGroup adds a newly provided grouped result to the appropriate group. +func (dg *Graph) addToGroup(r *Result, id CtorID) { + k := nodeKey{t: r.Type, group: r.Group} + group := dg.getGroup(k) + + r.GroupIndex = len(group.Results) + group.Results = append(group.Results, r) +} + +// PruneSuccess removes elements from the graph that do not have failed results. +// Removing elements that do not have failing results makes the graph easier to debug, +// since non-failing nodes and edges can clutter the graph and don't help the user debug. +func (dg *Graph) PruneSuccess() { + dg.pruneCtors(dg.Failed.ctors) + dg.pruneGroups(dg.Failed.groups) +} + +// pruneCtors removes constructors from the graph that do not have failing Results. +func (dg *Graph) pruneCtors(failed map[CtorID]struct{}) { + var pruned []*Ctor + for _, c := range dg.Ctors { + if _, ok := failed[c.ID]; ok { + pruned = append(pruned, c) + continue + } + // If a constructor is deleted, the constructor's stale result references need to + // be removed from that result's Group and/or consuming constructor. + dg.pruneCtorParams(c, dg.consumers) + dg.pruneGroupResults(c, dg.groupMap) + delete(dg.ctorMap, c.ID) + } + + dg.Ctors = pruned +} + +// pruneGroups removes groups from the graph that do not have failing results. +func (dg *Graph) pruneGroups(failed map[nodeKey]struct{}) { + var pruned []*Group + for _, g := range dg.Groups { + k := g.nodeKey() + if _, ok := failed[k]; ok { + pruned = append(pruned, g) + continue + } + delete(dg.groupMap, k) + } + dg.Groups = pruned + + dg.pruneCtorGroupParams(dg.groupMap) +} + +// pruneCtorParams removes results of the constructor argument that are still referenced in the +// Params of constructors that consume those results. If the results in the constructor are found +// in the params of a consuming constructor that result should be removed. +func (dg *Graph) pruneCtorParams(c *Ctor, consumers map[nodeKey][]*Ctor) { + for _, r := range c.Results { + for _, ctor := range consumers[r.nodeKey()] { + ctor.removeParam(r.nodeKey()) + } + } +} + +// pruneCtorGroupParams removes constructor results that are still referenced in the GroupParams of +// constructors that consume those results. +func (dg *Graph) pruneCtorGroupParams(groups map[nodeKey]*Group) { + for _, c := range dg.Ctors { + var pruned []*Group + for _, gp := range c.GroupParams { + k := gp.nodeKey() + if _, ok := groups[k]; ok { + pruned = append(pruned, gp) + } + } + c.GroupParams = pruned + } +} + +// pruneGroupResults removes results of the constructor argument that are still referenced in +// the Group object that contains that result. If a group no longer exists references to that +// should should be removed. +func (dg *Graph) pruneGroupResults(c *Ctor, groups map[nodeKey]*Group) { + for _, r := range c.Results { + k := r.nodeKey() + if k.group == "" { + continue + } + + g, ok := groups[k] + if ok { + g.removeResult(r) + } + } +} + +// String implements fmt.Stringer for Param. +func (p *Param) String() string { + if p.Name != "" { + return fmt.Sprintf("%v[name=%v]", p.Type.String(), p.Name) + } + return p.Type.String() +} + +// String implements fmt.Stringer for Result. +func (r *Result) String() string { + switch { + case r.Name != "": + return fmt.Sprintf("%v[name=%v]", r.Type.String(), r.Name) + case r.Group != "": + return fmt.Sprintf("%v[group=%v]%v", r.Type.String(), r.Group, r.GroupIndex) + default: + return r.Type.String() + } +} + +// String implements fmt.Stringer for Group. +func (g *Group) String() string { + return fmt.Sprintf("[type=%v group=%v]", g.Type.String(), g.Name) +} + +// Attributes composes and returns a string of the Result node's attributes. +func (r *Result) Attributes() string { + switch { + case r.Name != "": + return fmt.Sprintf(`label=<%v
Name: %v>`, r.Type, r.Name) + case r.Group != "": + return fmt.Sprintf(`label=<%v
Group: %v>`, r.Type, r.Group) + default: + return fmt.Sprintf(`label=<%v>`, r.Type) + } +} + +// Attributes composes and returns a string of the Group node's attributes. +func (g *Group) Attributes() string { + attr := fmt.Sprintf(`shape=diamond label=<%v
Group: %v>`, g.Type, g.Name) + if g.ErrorType != noError { + attr += " color=" + g.ErrorType.Color() + } + return attr +} + +// Color returns the color representation of each ErrorType. +func (s ErrorType) Color() string { + switch s { + case rootCause: + return "red" + case transitiveFailure: + return "orange" + default: + return "black" + } +} + +func (dg *Graph) addRootCause(r *Result) { + dg.Failed.RootCauses = append(dg.Failed.RootCauses, r) +} + +func (dg *Graph) addTransitiveFailure(r *Result) { + dg.Failed.TransitiveFailures = append(dg.Failed.TransitiveFailures, r) +} diff --git a/vendor/go.uber.org/dig/param.go b/vendor/go.uber.org/dig/param.go new file mode 100644 index 00000000..4daa4135 --- /dev/null +++ b/vendor/go.uber.org/dig/param.go @@ -0,0 +1,454 @@ +// Copyright (c) 2019 Uber Technologies, 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. + +package dig + +import ( + "errors" + "fmt" + "reflect" + + "go.uber.org/dig/internal/dot" +) + +// The param interface represents a dependency for a constructor. +// +// The following implementations exist: +// paramList All arguments of the constructor. +// paramSingle An explicitly requested type. +// paramObject dig.In struct where each field in the struct can be another +// param. +// paramGroupedSlice +// A slice consuming a value group. This will receive all +// values produced with a `group:".."` tag with the same name +// as a slice. +type param interface { + fmt.Stringer + + // Builds this dependency and any of its dependencies from the provided + // Container. + // + // This MAY panic if the param does not produce a single value. + Build(containerStore) (reflect.Value, error) + + // DotParam returns a slice of dot.Param(s). + DotParam() []*dot.Param +} + +var ( + _ param = paramSingle{} + _ param = paramObject{} + _ param = paramList{} + _ param = paramGroupedSlice{} +) + +// newParam builds a param from the given type. If the provided type is a +// dig.In struct, an paramObject will be returned. +func newParam(t reflect.Type) (param, error) { + switch { + case IsOut(t) || (t.Kind() == reflect.Ptr && IsOut(t.Elem())) || embedsType(t, _outPtrType): + return nil, fmt.Errorf("cannot depend on result objects: %v embeds a dig.Out", t) + case IsIn(t): + return newParamObject(t) + case embedsType(t, _inPtrType): + return nil, fmt.Errorf( + "cannot build a parameter object by embedding *dig.In, embed dig.In instead: "+ + "%v embeds *dig.In", t) + case t.Kind() == reflect.Ptr && IsIn(t.Elem()): + return nil, fmt.Errorf( + "cannot depend on a pointer to a parameter object, use a value instead: "+ + "%v is a pointer to a struct that embeds dig.In", t) + default: + return paramSingle{Type: t}, nil + } +} + +// paramVisitor visits every param in a param tree, allowing tracking state at +// each level. +type paramVisitor interface { + // Visit is called on the param being visited. + // + // If Visit returns a non-nil paramVisitor, that paramVisitor visits all + // the child params of this param. + Visit(param) paramVisitor + + // We can implement AnnotateWithField and AnnotateWithPosition like + // resultVisitor if we need to track that information in the future. +} + +// paramVisitorFunc is a paramVisitor that visits param in a tree with the +// return value deciding whether the descendants of this param should be +// recursed into. +type paramVisitorFunc func(param) (recurse bool) + +func (f paramVisitorFunc) Visit(p param) paramVisitor { + if f(p) { + return f + } + return nil +} + +// walkParam walks the param tree for the given param with the provided +// visitor. +// +// paramVisitor.Visit will be called on the provided param and if a non-nil +// paramVisitor is received, this param's descendants will be walked with that +// visitor. +// +// This is very similar to how go/ast.Walk works. +func walkParam(p param, v paramVisitor) { + v = v.Visit(p) + if v == nil { + return + } + + switch par := p.(type) { + case paramSingle, paramGroupedSlice: + // No sub-results + case paramObject: + for _, f := range par.Fields { + walkParam(f.Param, v) + } + case paramList: + for _, p := range par.Params { + walkParam(p, v) + } + default: + panic(fmt.Sprintf( + "It looks like you have found a bug in dig. "+ + "Please file an issue at https://github.com/uber-go/dig/issues/ "+ + "and provide the following message: "+ + "received unknown param type %T", p)) + } +} + +// paramList holds all arguments of the constructor as params. +// +// NOTE: Build() MUST NOT be called on paramList. Instead, BuildList +// must be called. +type paramList struct { + ctype reflect.Type // type of the constructor + + Params []param +} + +func (pl paramList) DotParam() []*dot.Param { + var types []*dot.Param + for _, param := range pl.Params { + types = append(types, param.DotParam()...) + } + return types +} + +// newParamList builds a paramList from the provided constructor type. +// +// Variadic arguments of a constructor are ignored and not included as +// dependencies. +func newParamList(ctype reflect.Type) (paramList, error) { + numArgs := ctype.NumIn() + if ctype.IsVariadic() { + // NOTE: If the function is variadic, we skip the last argument + // because we're not filling variadic arguments yet. See #120. + numArgs-- + } + + pl := paramList{ + ctype: ctype, + Params: make([]param, 0, numArgs), + } + + for i := 0; i < numArgs; i++ { + p, err := newParam(ctype.In(i)) + if err != nil { + return pl, errWrapf(err, "bad argument %d", i+1) + } + pl.Params = append(pl.Params, p) + } + + return pl, nil +} + +func (pl paramList) Build(containerStore) (reflect.Value, error) { + panic("It looks like you have found a bug in dig. " + + "Please file an issue at https://github.com/uber-go/dig/issues/ " + + "and provide the following message: " + + "paramList.Build() must never be called") +} + +// BuildList returns an ordered list of values which may be passed directly +// to the underlying constructor. +func (pl paramList) BuildList(c containerStore) ([]reflect.Value, error) { + args := make([]reflect.Value, len(pl.Params)) + for i, p := range pl.Params { + var err error + args[i], err = p.Build(c) + if err != nil { + return nil, err + } + } + return args, nil +} + +// paramSingle is an explicitly requested type, optionally with a name. +// +// This object must be present in the graph as-is unless it's specified as +// optional. +type paramSingle struct { + Name string + Optional bool + Type reflect.Type +} + +func (ps paramSingle) DotParam() []*dot.Param { + return []*dot.Param{ + { + Node: &dot.Node{ + Type: ps.Type, + Name: ps.Name, + }, + Optional: ps.Optional, + }, + } +} + +func (ps paramSingle) Build(c containerStore) (reflect.Value, error) { + if v, ok := c.getValue(ps.Name, ps.Type); ok { + return v, nil + } + + providers := c.getValueProviders(ps.Name, ps.Type) + if len(providers) == 0 { + if ps.Optional { + return reflect.Zero(ps.Type), nil + } + return _noValue, newErrMissingType(c, key{name: ps.Name, t: ps.Type}) + } + + for _, n := range providers { + err := n.Call(c) + if err == nil { + continue + } + + // If we're missing dependencies but the parameter itself is optional, + // we can just move on. + if _, ok := err.(errMissingDependencies); ok && ps.Optional { + return reflect.Zero(ps.Type), nil + } + + return _noValue, errParamSingleFailed{ + CtorID: n.ID(), + Key: key{t: ps.Type, name: ps.Name}, + Reason: err, + } + } + + // If we get here, it's impossible for the value to be absent from the + // container. + v, _ := c.getValue(ps.Name, ps.Type) + return v, nil +} + +// paramObject is a dig.In struct where each field is another param. +// +// This object is not expected in the graph as-is. +type paramObject struct { + Type reflect.Type + Fields []paramObjectField +} + +func (po paramObject) DotParam() []*dot.Param { + var types []*dot.Param + for _, field := range po.Fields { + types = append(types, field.DotParam()...) + } + return types +} + +// newParamObject builds an paramObject from the provided type. The type MUST +// be a dig.In struct. +func newParamObject(t reflect.Type) (paramObject, error) { + po := paramObject{Type: t} + + for i := 0; i < t.NumField(); i++ { + f := t.Field(i) + if f.Type == _inType { + // Skip over the dig.In embed. + continue + } + + pof, err := newParamObjectField(i, f) + if err != nil { + return po, errWrapf(err, "bad field %q of %v", f.Name, t) + } + + po.Fields = append(po.Fields, pof) + } + + return po, nil +} + +func (po paramObject) Build(c containerStore) (reflect.Value, error) { + dest := reflect.New(po.Type).Elem() + for _, f := range po.Fields { + v, err := f.Build(c) + if err != nil { + return dest, err + } + dest.Field(f.FieldIndex).Set(v) + } + return dest, nil +} + +// paramObjectField is a single field of a dig.In struct. +type paramObjectField struct { + // Name of the field in the struct. + FieldName string + + // Index of this field in the target struct. + // + // We need to track this separately because not all fields of the + // struct map to params. + FieldIndex int + + // The dependency requested by this field. + Param param +} + +func (pof paramObjectField) DotParam() []*dot.Param { + return pof.Param.DotParam() +} + +func newParamObjectField(idx int, f reflect.StructField) (paramObjectField, error) { + pof := paramObjectField{ + FieldName: f.Name, + FieldIndex: idx, + } + + var p param + switch { + case f.PkgPath != "": + return pof, fmt.Errorf( + "unexported fields not allowed in dig.In, did you mean to export %q (%v)?", + f.Name, f.Type) + + case f.Tag.Get(_groupTag) != "": + var err error + p, err = newParamGroupedSlice(f) + if err != nil { + return pof, err + } + + default: + var err error + p, err = newParam(f.Type) + if err != nil { + return pof, err + } + } + + if ps, ok := p.(paramSingle); ok { + ps.Name = f.Tag.Get(_nameTag) + + var err error + ps.Optional, err = isFieldOptional(f) + if err != nil { + return pof, err + } + + p = ps + } + + pof.Param = p + return pof, nil +} + +func (pof paramObjectField) Build(c containerStore) (reflect.Value, error) { + v, err := pof.Param.Build(c) + if err != nil { + return v, err + } + return v, nil +} + +// paramGroupedSlice is a param which produces a slice of values with the same +// group name. +type paramGroupedSlice struct { + // Name of the group as specified in the `group:".."` tag. + Group string + + // Type of the slice. + Type reflect.Type +} + +func (pt paramGroupedSlice) DotParam() []*dot.Param { + return []*dot.Param{ + { + Node: &dot.Node{ + Type: pt.Type, + Group: pt.Group, + }, + }, + } +} + +// newParamGroupedSlice builds a paramGroupedSlice from the provided type with +// the given name. +// +// The type MUST be a slice type. +func newParamGroupedSlice(f reflect.StructField) (paramGroupedSlice, error) { + pg := paramGroupedSlice{Group: f.Tag.Get(_groupTag), Type: f.Type} + + name := f.Tag.Get(_nameTag) + optional, _ := isFieldOptional(f) + switch { + case f.Type.Kind() != reflect.Slice: + return pg, fmt.Errorf("value groups may be consumed as slices only: "+ + "field %q (%v) is not a slice", f.Name, f.Type) + case name != "": + return pg, fmt.Errorf( + "cannot use named values with value groups: name:%q requested with group:%q", name, pg.Group) + + case optional: + return pg, errors.New("value groups cannot be optional") + } + + return pg, nil +} + +func (pt paramGroupedSlice) Build(c containerStore) (reflect.Value, error) { + for _, n := range c.getGroupProviders(pt.Group, pt.Type.Elem()) { + if err := n.Call(c); err != nil { + return _noValue, errParamGroupFailed{ + CtorID: n.ID(), + Key: key{group: pt.Group, t: pt.Type.Elem()}, + Reason: err, + } + } + } + + items := c.getValueGroup(pt.Group, pt.Type.Elem()) + + result := reflect.MakeSlice(pt.Type, len(items), len(items)) + for i, v := range items { + result.Index(i).Set(v) + } + return result, nil +} diff --git a/vendor/go.uber.org/dig/result.go b/vendor/go.uber.org/dig/result.go new file mode 100644 index 00000000..d113e260 --- /dev/null +++ b/vendor/go.uber.org/dig/result.go @@ -0,0 +1,406 @@ +// Copyright (c) 2019 Uber Technologies, 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. + +package dig + +import ( + "errors" + "fmt" + "reflect" + + "go.uber.org/dig/internal/dot" +) + +// The result interface represents a result produced by a constructor. +// +// The following implementations exist: +// resultList All values returned by the constructor. +// resultSingle A single value produced by a constructor. +// resultObject dig.Out struct where each field in the struct can be +// another result. +// resultGrouped A value produced by a constructor that is part of a value +// group. +type result interface { + // Extracts the values for this result from the provided value and + // stores them into the provided containerWriter. + // + // This MAY panic if the result does not consume a single value. + Extract(containerWriter, reflect.Value) + + // DotResult returns a slice of dot.Result(s). + DotResult() []*dot.Result +} + +var ( + _ result = resultSingle{} + _ result = resultObject{} + _ result = resultList{} + _ result = resultGrouped{} +) + +type resultOptions struct { + // If set, this is the name of the associated result value. + // + // For Result Objects, name:".." tags on fields override this. + Name string + Group string +} + +// newResult builds a result from the given type. +func newResult(t reflect.Type, opts resultOptions) (result, error) { + switch { + case IsIn(t) || (t.Kind() == reflect.Ptr && IsIn(t.Elem())) || embedsType(t, _inPtrType): + return nil, fmt.Errorf("cannot provide parameter objects: %v embeds a dig.In", t) + case isError(t): + return nil, fmt.Errorf("cannot return an error here, return it from the constructor instead") + case IsOut(t): + return newResultObject(t, opts) + case embedsType(t, _outPtrType): + return nil, fmt.Errorf( + "cannot build a result object by embedding *dig.Out, embed dig.Out instead: "+ + "%v embeds *dig.Out", t) + case t.Kind() == reflect.Ptr && IsOut(t.Elem()): + return nil, fmt.Errorf( + "cannot return a pointer to a result object, use a value instead: "+ + "%v is a pointer to a struct that embeds dig.Out", t) + case len(opts.Group) > 0: + return resultGrouped{Type: t, Group: opts.Group}, nil + default: + return resultSingle{Type: t, Name: opts.Name}, nil + } +} + +// resultVisitor visits every result in a result tree, allowing tracking state +// at each level. +type resultVisitor interface { + // Visit is called on the result being visited. + // + // If Visit returns a non-nil resultVisitor, that resultVisitor visits all + // the child results of this result. + Visit(result) resultVisitor + + // AnnotateWithField is called on each field of a resultObject after + // visiting it but before walking its descendants. + // + // The same resultVisitor is used for all fields: the one returned upon + // visiting the resultObject. + // + // For each visited field, if AnnotateWithField returns a non-nil + // resultVisitor, it will be used to walk the result of that field. + AnnotateWithField(resultObjectField) resultVisitor + + // AnnotateWithPosition is called with the index of each result of a + // resultList after vising it but before walking its descendants. + // + // The same resultVisitor is used for all results: the one returned upon + // visiting the resultList. + // + // For each position, if AnnotateWithPosition returns a non-nil + // resultVisitor, it will be used to walk the result at that index. + AnnotateWithPosition(idx int) resultVisitor +} + +// walkResult walks the result tree for the given result with the provided +// visitor. +// +// resultVisitor.Visit will be called on the provided result and if a non-nil +// resultVisitor is received, it will be used to walk its descendants. If a +// resultObject or resultList was visited, AnnotateWithField and +// AnnotateWithPosition respectively will be called before visiting the +// descendants of that resultObject/resultList. +// +// This is very similar to how go/ast.Walk works. +func walkResult(r result, v resultVisitor) { + v = v.Visit(r) + if v == nil { + return + } + + switch res := r.(type) { + case resultSingle, resultGrouped: + // No sub-results + case resultObject: + w := v + for _, f := range res.Fields { + if v := w.AnnotateWithField(f); v != nil { + walkResult(f.Result, v) + } + } + case resultList: + w := v + for i, r := range res.Results { + if v := w.AnnotateWithPosition(i); v != nil { + walkResult(r, v) + } + } + default: + panic(fmt.Sprintf( + "It looks like you have found a bug in dig. "+ + "Please file an issue at https://github.com/uber-go/dig/issues/ "+ + "and provide the following message: "+ + "received unknown result type %T", res)) + } +} + +// resultList holds all values returned by the constructor as results. +type resultList struct { + ctype reflect.Type + + Results []result + + // For each item at index i returned by the constructor, resultIndexes[i] + // is the index in .Results for the corresponding result object. + // resultIndexes[i] is -1 for errors returned by constructors. + resultIndexes []int +} + +func (rl resultList) DotResult() []*dot.Result { + var types []*dot.Result + for _, result := range rl.Results { + types = append(types, result.DotResult()...) + } + return types +} + +func newResultList(ctype reflect.Type, opts resultOptions) (resultList, error) { + rl := resultList{ + ctype: ctype, + Results: make([]result, 0, ctype.NumOut()), + resultIndexes: make([]int, ctype.NumOut()), + } + + resultIdx := 0 + for i := 0; i < ctype.NumOut(); i++ { + t := ctype.Out(i) + if isError(t) { + rl.resultIndexes[i] = -1 + continue + } + + r, err := newResult(t, opts) + if err != nil { + return rl, errWrapf(err, "bad result %d", i+1) + } + + rl.Results = append(rl.Results, r) + rl.resultIndexes[i] = resultIdx + resultIdx++ + } + + return rl, nil +} + +func (resultList) Extract(containerWriter, reflect.Value) { + panic("It looks like you have found a bug in dig. " + + "Please file an issue at https://github.com/uber-go/dig/issues/ " + + "and provide the following message: " + + "resultList.Extract() must never be called") +} + +func (rl resultList) ExtractList(cw containerWriter, values []reflect.Value) error { + for i, v := range values { + if resultIdx := rl.resultIndexes[i]; resultIdx >= 0 { + rl.Results[resultIdx].Extract(cw, v) + continue + } + + if err, _ := v.Interface().(error); err != nil { + return err + } + } + + return nil +} + +// resultSingle is an explicit value produced by a constructor, optionally +// with a name. +// +// This object will be added to the graph as-is. +type resultSingle struct { + Name string + Type reflect.Type +} + +func (rs resultSingle) DotResult() []*dot.Result { + return []*dot.Result{ + { + Node: &dot.Node{ + Type: rs.Type, + Name: rs.Name, + }, + }, + } +} + +func (rs resultSingle) Extract(cw containerWriter, v reflect.Value) { + cw.setValue(rs.Name, rs.Type, v) +} + +// resultObject is a dig.Out struct where each field is another result. +// +// This object is not added to the graph. Its fields are interpreted as +// results and added to the graph if needed. +type resultObject struct { + Type reflect.Type + Fields []resultObjectField +} + +func (ro resultObject) DotResult() []*dot.Result { + var types []*dot.Result + for _, field := range ro.Fields { + types = append(types, field.DotResult()...) + } + return types +} + +func newResultObject(t reflect.Type, opts resultOptions) (resultObject, error) { + ro := resultObject{Type: t} + if len(opts.Name) > 0 { + return ro, fmt.Errorf( + "cannot specify a name for result objects: %v embeds dig.Out", t) + } + + if len(opts.Group) > 0 { + return ro, fmt.Errorf( + "cannot specify a group for result objects: %v embeds dig.Out", t) + } + + for i := 0; i < t.NumField(); i++ { + f := t.Field(i) + if f.Type == _outType { + // Skip over the dig.Out embed. + continue + } + + rof, err := newResultObjectField(i, f, opts) + if err != nil { + return ro, errWrapf(err, "bad field %q of %v", f.Name, t) + } + + ro.Fields = append(ro.Fields, rof) + } + return ro, nil +} + +func (ro resultObject) Extract(cw containerWriter, v reflect.Value) { + for _, f := range ro.Fields { + f.Result.Extract(cw, v.Field(f.FieldIndex)) + } +} + +// resultObjectField is a single field inside a dig.Out struct. +type resultObjectField struct { + // Name of the field in the struct. + FieldName string + + // Index of the field in the struct. + // + // We need to track this separately because not all fields of the struct + // map to results. + FieldIndex int + + // Result produced by this field. + Result result +} + +func (rof resultObjectField) DotResult() []*dot.Result { + return rof.Result.DotResult() +} + +// newResultObjectField(i, f, opts) builds a resultObjectField from the field +// f at index i. +func newResultObjectField(idx int, f reflect.StructField, opts resultOptions) (resultObjectField, error) { + rof := resultObjectField{ + FieldName: f.Name, + FieldIndex: idx, + } + + var r result + switch { + case f.PkgPath != "": + return rof, fmt.Errorf( + "unexported fields not allowed in dig.Out, did you mean to export %q (%v)?", f.Name, f.Type) + + case f.Tag.Get(_groupTag) != "": + var err error + r, err = newResultGrouped(f) + if err != nil { + return rof, err + } + + default: + var err error + if name := f.Tag.Get(_nameTag); len(name) > 0 { + // can modify in-place because options are passed-by-value. + opts.Name = name + } + r, err = newResult(f.Type, opts) + if err != nil { + return rof, err + } + } + + rof.Result = r + return rof, nil +} + +// resultGrouped is a value produced by a constructor that is part of a result +// group. +// +// These will be produced as fields of a dig.Out struct. +type resultGrouped struct { + // Name of the group as specified in the `group:".."` tag. + Group string + + // Type of value produced. + Type reflect.Type +} + +func (rt resultGrouped) DotResult() []*dot.Result { + return []*dot.Result{ + { + Node: &dot.Node{ + Type: rt.Type, + Group: rt.Group, + }, + }, + } +} + +// newResultGrouped(f) builds a new resultGrouped from the provided field. +func newResultGrouped(f reflect.StructField) (resultGrouped, error) { + rg := resultGrouped{Group: f.Tag.Get(_groupTag), Type: f.Type} + + name := f.Tag.Get(_nameTag) + optional, _ := isFieldOptional(f) + switch { + case name != "": + return rg, fmt.Errorf( + "cannot use named values with value groups: name:%q provided with group:%q", name, rg.Group) + case optional: + return rg, errors.New("value groups cannot be optional") + } + + return rg, nil +} + +func (rt resultGrouped) Extract(cw containerWriter, v reflect.Value) { + cw.submitGroupedValue(rt.Group, rt.Type, v) +} diff --git a/vendor/go.uber.org/dig/stringer.go b/vendor/go.uber.org/dig/stringer.go new file mode 100644 index 00000000..d10fa0fb --- /dev/null +++ b/vendor/go.uber.org/dig/stringer.go @@ -0,0 +1,106 @@ +// Copyright (c) 2019 Uber Technologies, 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. + +package dig + +import ( + "bytes" + "fmt" + "strings" +) + +// String representation of the entire Container +func (c *Container) String() string { + b := &bytes.Buffer{} + fmt.Fprintln(b, "nodes: {") + for k, vs := range c.providers { + for _, v := range vs { + fmt.Fprintln(b, "\t", k, "->", v) + } + } + fmt.Fprintln(b, "}") + + fmt.Fprintln(b, "values: {") + for k, v := range c.values { + fmt.Fprintln(b, "\t", k, "=>", v) + } + for k, vs := range c.groups { + for _, v := range vs { + fmt.Fprintln(b, "\t", k, "=>", v) + } + } + fmt.Fprintln(b, "}") + + return b.String() +} + +func (n *node) String() string { + return fmt.Sprintf("deps: %v, ctor: %v", n.paramList, n.ctype) +} + +func (k key) String() string { + if k.name != "" { + return fmt.Sprintf("%v[name=%q]", k.t, k.name) + } + if k.group != "" { + return fmt.Sprintf("%v[group=%q]", k.t, k.group) + } + return k.t.String() +} + +func (pl paramList) String() string { + args := make([]string, len(pl.Params)) + for i, p := range pl.Params { + args[i] = p.String() + } + return fmt.Sprint(args) +} + +func (sp paramSingle) String() string { + // tally.Scope[optional] means optional + // tally.Scope[optional, name="foo"] means named optional + + var opts []string + if sp.Optional { + opts = append(opts, "optional") + } + if sp.Name != "" { + opts = append(opts, fmt.Sprintf("name=%q", sp.Name)) + } + + if len(opts) == 0 { + return fmt.Sprint(sp.Type) + } + + return fmt.Sprintf("%v[%v]", sp.Type, strings.Join(opts, ", ")) +} + +func (op paramObject) String() string { + fields := make([]string, len(op.Fields)) + for i, f := range op.Fields { + fields[i] = f.Param.String() + } + return strings.Join(fields, " ") +} + +func (pt paramGroupedSlice) String() string { + // io.Reader[group="foo"] refers to a group of io.Readers called 'foo' + return fmt.Sprintf("%v[group=%q]", pt.Type.Elem(), pt.Group) +} diff --git a/vendor/go.uber.org/dig/types.go b/vendor/go.uber.org/dig/types.go new file mode 100644 index 00000000..8ab87ea5 --- /dev/null +++ b/vendor/go.uber.org/dig/types.go @@ -0,0 +1,159 @@ +// Copyright (c) 2019 Uber Technologies, 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. + +package dig + +import ( + "container/list" + "reflect" +) + +var ( + _noValue reflect.Value + _errType = reflect.TypeOf((*error)(nil)).Elem() + _inPtrType = reflect.TypeOf((*In)(nil)) + _inType = reflect.TypeOf(In{}) + _outPtrType = reflect.TypeOf((*Out)(nil)) + _outType = reflect.TypeOf(Out{}) +) + +// Special interface embedded inside dig sentinel values (dig.In, dig.Out) to +// make their special nature obvious in the godocs. Otherwise they will appear +// as plain empty structs. +type digSentinel interface { + digSentinel() +} + +// In may be embedded into structs to request dig to treat them as special +// parameter structs. When a constructor accepts such a struct, instead of the +// struct becoming a dependency for that constructor, all its fields become +// dependencies instead. See the section on Parameter Objects in the +// package-level documentation for more information. +// +// Fields of the struct may optionally be tagged to customize the behavior of +// dig. The following tags are supported, +// +// name Requests a value with the same name and type from the +// container. See Named Values for more information. +// optional If set to true, indicates that the dependency is optional and +// the constructor gracefully handles its absence. +// group Name of the Value Group from which this field will be filled. +// The field must be a slice type. See Value Groups in the +// package documentation for more information. +type In struct{ digSentinel } + +// Out is an embeddable type that signals to dig that the returned +// struct should be treated differently. Instead of the struct itself +// becoming part of the container, all members of the struct will. + +// Out may be embedded into structs to request dig to treat them as special +// result structs. When a constructor returns such a struct, instead of the +// struct becoming a result of the constructor, all its fields become results +// of the constructor. See the section on Result Objects in the package-level +// documentation for more information. +// +// Fields of the struct may optionally be tagged to customize the behavior of +// dig. The following tags are supported, +// +// name Specifies the name of the value. Only a field on a dig.In +// struct with the same 'name' annotation can receive this +// value. See Named Values for more information. +// group Name of the Value Group to which this field's value is being +// sent. See Value Groups in the package documentation for more +// information. +type Out struct{ digSentinel } + +func isError(t reflect.Type) bool { + return t.Implements(_errType) +} + +// IsIn checks whether the given struct is a dig.In struct. A struct qualifies +// as a dig.In struct if it embeds the dig.In type or if any struct that it +// embeds is a dig.In struct. The parameter may be the reflect.Type of the +// struct rather than the struct itself. +// +// A struct MUST qualify as a dig.In struct for its fields to be treated +// specially by dig. +// +// See the documentation for dig.In for a comprehensive list of supported +// tags. +func IsIn(o interface{}) bool { + return embedsType(o, _inType) +} + +// IsOut checks whether the given struct is a dig.Out struct. A struct +// qualifies as a dig.Out struct if it embeds the dig.Out type or if any +// struct that it embeds is a dig.Out struct. The parameter may be the +// reflect.Type of the struct rather than the struct itself. +// +// A struct MUST qualify as a dig.Out struct for its fields to be treated +// specially by dig. +// +// See the documentation for dig.Out for a comprehensive list of supported +// tags. +func IsOut(o interface{}) bool { + return embedsType(o, _outType) +} + +// Returns true if t embeds e or if any of the types embedded by t embed e. +func embedsType(i interface{}, e reflect.Type) bool { + // TODO: this function doesn't consider e being a pointer. + // given `type A foo { *In }`, this function would return false for + // embedding dig.In, which makes for some extra error checking in places + // that call this funciton. Might be worthwhile to consider reflect.Indirect + // usage to clean up the callers. + + if i == nil { + return false + } + + // maybe it's already a reflect.Type + t, ok := i.(reflect.Type) + if !ok { + // take the type if it's not + t = reflect.TypeOf(i) + } + + // We are going to do a breadth-first search of all embedded fields. + types := list.New() + types.PushBack(t) + for types.Len() > 0 { + t := types.Remove(types.Front()).(reflect.Type) + + if t == e { + return true + } + + if t.Kind() != reflect.Struct { + continue + } + + for i := 0; i < t.NumField(); i++ { + f := t.Field(i) + if f.Anonymous { + types.PushBack(f.Type) + } + } + } + + // If perf is an issue, we can cache known In objects and Out objects in a + // map[reflect.Type]struct{}. + return false +} diff --git a/vendor/go.uber.org/dig/version.go b/vendor/go.uber.org/dig/version.go new file mode 100644 index 00000000..9bc5dd46 --- /dev/null +++ b/vendor/go.uber.org/dig/version.go @@ -0,0 +1,24 @@ +// Copyright (c) 2019 Uber Technologies, 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. + +package dig + +// Version of the library. +const Version = "1.7.0" diff --git a/vendor/go.uber.org/fx/.codecov.yml b/vendor/go.uber.org/fx/.codecov.yml new file mode 100644 index 00000000..2e90589d --- /dev/null +++ b/vendor/go.uber.org/fx/.codecov.yml @@ -0,0 +1,15 @@ + +coverage: + range: 80..100 + round: down + precision: 2 + + status: + project: # measuring the overall project coverage + default: # context, you can create multiple ones with custom titles + enabled: yes # must be yes|true to enable this status + target: 90% # specify the target coverage for each commit status + # option: "auto" (must increase from parent commit or pull request base) + # option: "X%" a static target percentage to hit + if_not_found: success # if parent is not found report status as success, error, or failure + if_ci_failed: error # if ci fails report status as success, error, or failure diff --git a/vendor/go.uber.org/fx/.gitignore b/vendor/go.uber.org/fx/.gitignore new file mode 100644 index 00000000..c6dced35 --- /dev/null +++ b/vendor/go.uber.org/fx/.gitignore @@ -0,0 +1,13 @@ +/vendor +/.bench +*.mem +*.cpu +*.test +*.log +*.out +*.html +*.coverprofile +coverage.txt +*.pprof +/.bin +/.cache diff --git a/vendor/go.uber.org/fx/.travis.yml b/vendor/go.uber.org/fx/.travis.yml new file mode 100644 index 00000000..c99e6332 --- /dev/null +++ b/vendor/go.uber.org/fx/.travis.yml @@ -0,0 +1,18 @@ +language: go +sudo: false + +go_import_path: go.uber.org/fx +go: + - "1.10.4" + - "1.11" + - tip + +cache: + directories: + - vendor + +install: + - make dependencies + +script: + - make ci diff --git a/vendor/go.uber.org/fx/CHANGELOG.md b/vendor/go.uber.org/fx/CHANGELOG.md new file mode 100644 index 00000000..af7647ca --- /dev/null +++ b/vendor/go.uber.org/fx/CHANGELOG.md @@ -0,0 +1,193 @@ +# Changelog +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) +and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). + +## [1.9.0] - 2019-01-22 +### Added +- Add the ability to shutdown Fx applications from inside the container. See + the Shutdowner documentation for details. +- Add `fx.Annotated` to allow users to provide named values without creating a + new constructor. + +## [1.8.0] - 2018-11-06 +### Added +- Provide DOT graph of dependencies in the container. + +## [1.7.1] - 2018-09-26 +### Fixed +- Make `fxtest.New` ensure that the app was created successfully. Previously, + it would return the app (similar to `fx.New`, which expects the user to verify + the error). +- Update dig container to defer acyclic validation until after Invoke. Application + startup time should improve proportional to the size of the dependency graph. +- Fix a goroutine leak in `fxtest.Lifecycle`. + +## [1.7.0] - 2018-08-16 +### Added +- Add `fx.ErrorHook` option to allow users to provide `ErrorHandler`s on invoke + failures. +- `VisualizeError` returns the visualization wrapped in the error if available. + +## [1.6.0] - 2018-06-12 +### Added +- Add `fx.Error` option to short-circuit application startup. + +## [1.5.0] - 2018-04-11 +### Added +- Add `fx.StartTimeout` and `fx.StopTimeout` to make configuring application + start and stop timeouts easier. +- Export the default start and stop timeout as `fx.DefaultTimeout`. + +### Fixed +- Make `fxtest` respect the application's start and stop timeouts. + +## [1.4.0] - 2017-12-07 +### Added +- Add `fx.Populate` to populate variables with values from the dependency + injection container without requiring intermediate structs. + +## [1.3.0] - 2017-11-28 +### Changed +- Improve readability of hook logging in addition to provide and invoke. + +### Fixed +- Fix bug which caused the OnStop for a lifecycle hook to be called even if it + failed to start. + +## [1.2.0] - 2017-09-06 +### Added +- Add `fx.NopLogger` which disables the Fx application's log output. + +## [1.1.0] - 2017-08-22 +### Changed +- Improve readability of start up logging. + +## [1.0.0] - 2017-07-31 +First stable release: no breaking changes will be made in the 1.x series. + +### Added +- `fx.Extract` now supports `fx.In` tags on target structs. + +### Changed +- **[Breaking]** Rename `fx.Inject` to `fx.Extract`. +- **[Breaking]** Rename `fxtest.Must*` to `fxtest.Require*`. + +### Removed +- **[Breaking]** Remove `fx.Timeout` and `fx.DefaultTimeout`. + +## [1.0.0-rc2] - 2017-07-21 + +- **[Breaking]** Lifecycle hooks now take a context. +- Add `fx.In` and `fx.Out` which exposes optional and named types. + Modules should embed these types instead of relying on `dig.In` and `dig.Out`. +- Add an `Err` method to retrieve the underlying errors during the dependency + graph construction. The same error is also returned from `Start`. +- Graph resolution now happens as part of `fx.New`, rather than at the beginning + of `app.Start`. This allows inspection of the graph errors through `app.Err()` + before the decision to start the app. +- Add a `Logger` option, which allows users to send Fx's logs to different + sink. +- Add `fxtest.App`, which redirects log output to the user's `testing.TB` and + provides some lifecycle helpers. + +## [1.0.0-rc1] - 2017-06-20 + +- **[Breaking]** Providing types into `fx.App` and invoking functions are now + options passed during application construction. This makes users' + interactions with modules and collections of modules identical. +- **[Breaking]** `TestLifecycle` is now in a separate `fxtest` subpackage. +- Add `fx.Inject()` to pull values from the container into a struct. + +## [1.0.0-beta4] - 2017-06-12 + +- **[Breaking]** Monolithic framework, as released in initial betas, has been + broken into smaller pieces as a result of recent advances in `dig` library. + This is a radical departure from the previous direction, but it needed to + be done for the long-term good of the project. +- **[Breaking]** `Module interface` has been scoped all the way down to being + *a single dig constructor*. This allows for very sophisticated module + compositions. See `go.uber.org/dig` for more information on the constructors. +- **[Breaking]** `package config` has been moved to its own repository. + see `go.uber.org/config` for more information. +- `fx.Lifecycle` has been added for modules to hook into the framework + lifecycle events. +- `service.Host` interface which composed a number of primitives together + (configuration, metrics, tracing) has been deprecated in favor of + `fx.App`. + +## [1.0.0-beta3] - 2017-03-28 + +- **[Breaking]** Environment config provider was removed. If you were using + environment variables to override YAML values, see + [config documentation](config/README.md) for more information. +- **[Breaking]** Simplify Provider interface: remove `Scope` method from the + `config.Provider` interface, one can use either ScopedProvider and Value.Get() + to access sub fields. +- Add `task.MustRegister` convenience function which fails fast by panicking + Note that this should only be used during app initialization, and is provided + to avoid repetetive error checking for services which register many tasks. +- Expose options on task module to disable execution. This will allow users to + enqueue and consume tasks on different clusters. +- **[Breaking]** Rename Backend interface `Publish` to `Enqueue`. Created a new + `ExecuteAsync` method that will kick off workers to consume tasks and this is + subsumed by module Start. +- **[Breaking]** Rename package `uhttp/client` to `uhttp/uhttpclient` for clarity. +- **[Breaking]** Rename `PopulateStruct` method in value to `Populate`. + The method can now populate not only structs, but anything: slices, + maps, builtin types and maps. +- **[Breaking]** `package dig` has moved from `go.uber.org/fx/dig` to a new home + at `go.uber.org/dig`. +- **[Breaking]** Pass a tracer the `uhttp/uhttpclient` constructor explicitly, instead + of using a global tracer. This will allow to use http client in parallel tests. + +## [1.0.0-beta2] - 2017-03-09 + +- **[Breaking]** Remove `ulog.Logger` interface and expose `*zap.Logger` directly. +- **[Breaking]** Rename config and module from `modules.rpc` to `modules.yarpc` +- **[Breaking]** Rename config key from `modules.http` to `modules.uhttp` to match + the module name +- **[Breaking]** Upgrade `zap` to `v1.0.0-rc.3` (now go.uber.org/zap, was + github.com/uber-go/zap) +- Remove now-unused `config.IsDevelopmentEnv()` helper to encourage better + testing practices. Not a breaking change as nobody is using this func + themselves according to our code search tool. +- Log `traceID` and `spanID` in hex format to match Jaeger UI. Upgrade Jaeger to + min version 2.1.0 + and use jaeger's adapters for jaeger and tally initialization. +- Tally now supports reporting histogram samples for a bucket. Upgrade Tally to 2.1.0 +- **[Breaking]** Make new module naming consistent `yarpc.ThriftModule` to + `yarpc.New`, `task.NewModule` + to `task.New` +- **[Breaking]** Rename `yarpc.CreateThriftServiceFunc` to `yarpc.ServiceCreateFunc` + as it is not thrift-specific. +- Report version metrics for company-wide version usage information. +- Allow configurable service name and module name via service options. +- DIG constructors now support returning a tuple with the second argument being + an error. + +## 1.0.0-beta1 - 2017-02-20 + +This is the first beta release of the framework, where we invite users to start +building services on it and provide us feedback. **Warning** we are not +promising API compatibility between beta releases and the final 1.0.0 release. +In fact, we expect our beta user feedback to require some changes to the way +things work. Once we reach 1.0, we will provider proper version compatibility. + +[1.9.0]: https://github.com/uber-go/fx/compare/v1.8.0...v1.9.0 +[1.8.0]: https://github.com/uber-go/fx/compare/v1.7.1...v1.8.0 +[1.7.1]: https://github.com/uber-go/fx/compare/v1.7.0...v1.7.1 +[1.7.0]: https://github.com/uber-go/fx/compare/v1.6.0...v1.7.0 +[1.6.0]: https://github.com/uber-go/fx/compare/v1.5.0...v1.6.0 +[1.5.0]: https://github.com/uber-go/fx/compare/v1.4.0...v1.5.0 +[1.4.0]: https://github.com/uber-go/fx/compare/v1.3.0...v1.4.0 +[1.3.0]: https://github.com/uber-go/fx/compare/v1.2.0...v1.3.0 +[1.2.0]: https://github.com/uber-go/fx/compare/v1.1.0...v1.2.0 +[1.1.0]: https://github.com/uber-go/fx/compare/v1.0.0...v1.1.0 +[1.0.0]: https://github.com/uber-go/fx/compare/v1.0.0-rc2...v1.0.0 +[1.0.0-rc2]: https://github.com/uber-go/fx/compare/v1.0.0-rc1...v1.0.0-rc2 +[1.0.0-rc1]: https://github.com/uber-go/fx/compare/v1.0.0-beta4...v1.0.0-rc1 +[1.0.0-beta4]: https://github.com/uber-go/fx/compare/v1.0.0-beta3...v1.0.0-beta4 +[1.0.0-beta3]: https://github.com/uber-go/fx/compare/v1.0.0-beta2...v1.0.0-beta3 +[1.0.0-beta2]: https://github.com/uber-go/fx/compare/v1.0.0-beta1...v1.0.0-beta2 diff --git a/vendor/go.uber.org/fx/CONTRIBUTING.md b/vendor/go.uber.org/fx/CONTRIBUTING.md new file mode 100644 index 00000000..8458a900 --- /dev/null +++ b/vendor/go.uber.org/fx/CONTRIBUTING.md @@ -0,0 +1,79 @@ +# Contributing + +Thanks for helping to make Fx better for everyone! + +If you'd like to add new exported APIs, please [open an issue][open-issue] +describing your proposal — discussing API changes ahead of time makes +pull request review much smoother. + +Note that you'll need to sign [Uber's Contributor License Agreement][cla] +before we can accept any of your contributions. If necessary, a bot will remind +you to accept the CLA when you open your pull request. + +## Setup + +[Fork][fork], then clone the repository: + +``` +mkdir -p $GOPATH/src/go.uber.org +cd $GOPATH/src/go.uber.org +git clone git@github.com:your_github_username/fx.git +cd fx +git remote add upstream https://github.com/uber-go/fx.git +git fetch upstream +``` + +Install Fx's dependencies: + +``` +make dependencies +``` + +Make sure that the tests and the style checkers pass: + +``` +make test +make lint +``` + +For `make lint` to work, you must be using the minor version of Go specified in +the Makefile's `LINTABLE_MINOR_VERSIONS` variable. This is fine, but it means +that you'll only discover style violations after you open your pull request. + +## Making changes + +Start by creating a new branch for your changes: + +``` +cd $GOPATH/src/go.uber.org/fx +git checkout master +git fetch upstream +git rebase upstream/master +git checkout -b cool_new_feature +``` + +Make your changes, and then check that `make lint` and `make test` still pass. +If you're satisfied with your changes, push them to your fork. + +``` +git push origin cool_new_feature +``` + +Then use the GitHub UI to [open a pull request][pr]. + +At this point, you're waiting on us to review your changes. We *try* to respond +to issues and pull requests within a few business days, and we may suggest some +improvements or alternatives. Once your changes are approved, one of the +project maintainers will merge them. + +We're much more likely to approve your changes if you: + +* Add tests for new functionality. +* Write a [good commit message][commit-message]. +* Maintain backward compatibility. + +[fork]: https://github.com/uber-go/fx/fork +[open-issue]: https://github.com/uber-go/fx/issues/new +[cla]: https://cla-assistant.io/uber-go/fx +[commit-message]: http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html +[pr]: https://github.com/uber-go/fx/compare diff --git a/vendor/github.com/libp2p/go-libp2p-metrics/LICENSE b/vendor/go.uber.org/fx/LICENSE similarity index 94% rename from vendor/github.com/libp2p/go-libp2p-metrics/LICENSE rename to vendor/go.uber.org/fx/LICENSE index 26100332..20e81eaf 100644 --- a/vendor/github.com/libp2p/go-libp2p-metrics/LICENSE +++ b/vendor/go.uber.org/fx/LICENSE @@ -1,6 +1,4 @@ -The MIT License (MIT) - -Copyright (c) 2016 Jeromy Johnson +Copyright (c) 2016-2018 Uber Technologies, 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 diff --git a/vendor/go.uber.org/fx/Makefile b/vendor/go.uber.org/fx/Makefile new file mode 100644 index 00000000..c5c26d54 --- /dev/null +++ b/vendor/go.uber.org/fx/Makefile @@ -0,0 +1,59 @@ +PKGS ?= $(shell glide novendor) +PKG_FILES ?= *.go + +# The linting tools evolve with each Go version, so run them only on the latest +# stable release. +GO_VERSION := $(shell go version | cut -d " " -f 3) +GO_MINOR_VERSION := $(word 2,$(subst ., ,$(GO_VERSION))) +LINTABLE_MINOR_VERSIONS := 11 +ifneq ($(filter $(LINTABLE_MINOR_VERSIONS),$(GO_MINOR_VERSION)),) +SHOULD_LINT := true +endif + +.PHONY: dependencies +dependencies: + @echo "Installing Glide and locked dependencies..." + glide --version || go get -u -f github.com/Masterminds/glide + glide install + @echo "Installing uber-license tool..." + update-license || go get -u -f go.uber.org/tools/update-license +ifdef SHOULD_LINT + @echo "Installing golint..." + go install ./vendor/golang.org/x/lint/golint +else + @echo "Not installing golint, since we don't expect to lint on" $(GO_VERSION) +endif + +.PHONY: test +test: + @.build/test.sh + +.PHONY: license +license: + $(ECHO_V).build/check_license.sh + +.PHONY: ci +ci: SHELL := /bin/bash +ci: test lint + bash <(curl -s https://codecov.io/bash) + +.PHONY: lint +lint: +ifdef SHOULD_LINT + @rm -rf lint.log + @echo "Checking formatting..." + @gofmt -d -s $(PKG_FILES) 2>&1 | tee lint.log + @echo "Installing test dependencies for vet..." + @go test -i $(PKGS) + @echo "Checking vet..." + @$(foreach dir,$(PKG_FILES),go tool vet $(VET_RULES) $(dir) 2>&1 | tee -a lint.log;) + @echo "Checking lint..." + @$(foreach dir,$(PKGS),golint $(dir) 2>&1 | tee -a lint.log;) + @echo "Checking for unresolved FIXMEs..." + @git grep -i fixme | grep -v -e vendor -e Makefile -e .md | tee -a lint.log + @echo "Checking for license headers..." + @DRY_RUN=1 .build/check_license.sh | tee -a lint.log + @[ ! -s lint.log ] +else + @echo "Skipping linters on" $(GO_VERSION) +endif diff --git a/vendor/go.uber.org/fx/README.md b/vendor/go.uber.org/fx/README.md new file mode 100644 index 00000000..42eaf51d --- /dev/null +++ b/vendor/go.uber.org/fx/README.md @@ -0,0 +1,40 @@ +# :unicorn: Fx [![GoDoc][doc-img]][doc] [![Github release][release-img]][release] [![Build Status][ci-img]][ci] [![Coverage Status][cov-img]][cov] [![Go Report Card][report-card-img]][report-card] + +An application framework for Go that: + +* Makes dependency injection easy. +* Eliminates the need for global state and `func init()`. + +## Installation + +We recommend locking to [SemVer](http://semver.org/) range `^1` using [Glide](https://github.com/Masterminds/glide): + +``` +glide get 'go.uber.org/fx#^1' +``` + +## Stability + +This library is `v1` and follows [SemVer](http://semver.org/) strictly. + +No breaking changes will be made to exported APIs before `v2.0.0`. + +This project follows the [Go Release Policy][release-policy]. Each major +version of Go is supported until there are two newer major releases. + +[doc-img]: http://img.shields.io/badge/GoDoc-Reference-blue.svg +[doc]: https://godoc.org/go.uber.org/fx + +[release-img]: https://img.shields.io/github/release/uber-go/fx.svg +[release]: https://github.com/uber-go/fx/releases + +[ci-img]: https://img.shields.io/travis/uber-go/fx/master.svg +[ci]: https://travis-ci.org/uber-go/fx/branches + +[cov-img]: https://codecov.io/gh/uber-go/fx/branch/dev/graph/badge.svg +[cov]: https://codecov.io/gh/uber-go/fx/branch/dev + +[report-card-img]: https://goreportcard.com/badge/github.com/uber-go/fx +[report-card]: https://goreportcard.com/report/github.com/uber-go/fx + +[release-policy]: https://golang.org/doc/devel/release.html#policy diff --git a/vendor/go.uber.org/fx/annotated.go b/vendor/go.uber.org/fx/annotated.go new file mode 100644 index 00000000..69e04cde --- /dev/null +++ b/vendor/go.uber.org/fx/annotated.go @@ -0,0 +1,64 @@ +// Copyright (c) 2019 Uber Technologies, 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. + +package fx + +// Annotated annotates a constructor provided to Fx with additional options. +// +// For example, +// +// func NewReadOnlyConnection(...) (*Connection, error) +// +// fx.Provide(fx.Annotated{ +// Name: "ro", +// Target: NewReadOnlyConnection, +// }) +// +// Is equivalent to, +// +// type result struct { +// fx.Out +// +// Connection *Connection `name:"ro"` +// } +// +// fx.Provide(func(...) (Result, error) { +// conn, err := NewReadOnlyConnection(...) +// return Result{Connection: conn}, err +// }) +// +// Annotated cannot be used with constructors which produce fx.Out objects. +type Annotated struct { + // If specified, this will be used as the name for all non-error values returned + // by the constructor. For more information on named values, see the documentation + // for the fx.Out type. + // + // A name option may not be provided if a group option is provided. + Name string + + // If specified, this will be used as the group name for all non-error values returned + // by the constructor. For more information on value groups, see the package documentation. + // + // A group option may not be provided if a name option is provided. + Group string + + // Target is the constructor being annotated with fx.Annotated. + Target interface{} +} diff --git a/vendor/go.uber.org/fx/app.go b/vendor/go.uber.org/fx/app.go new file mode 100644 index 00000000..f71f92f5 --- /dev/null +++ b/vendor/go.uber.org/fx/app.go @@ -0,0 +1,608 @@ +// Copyright (c) 2019 Uber Technologies, 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. + +package fx + +import ( + "bytes" + "context" + "errors" + "fmt" + "os" + "os/signal" + "reflect" + "strings" + "sync" + "syscall" + "time" + + "go.uber.org/dig" + "go.uber.org/fx/internal/fxlog" + "go.uber.org/fx/internal/fxreflect" + "go.uber.org/fx/internal/lifecycle" + "go.uber.org/multierr" +) + +// DefaultTimeout is the default timeout for starting or stopping an +// application. It can be configured with the StartTimeout and StopTimeout +// options. +const DefaultTimeout = 15 * time.Second + +// An Option configures an App using the functional options paradigm +// popularized by Rob Pike. If you're unfamiliar with this style, see +// https://commandcenter.blogspot.com/2014/01/self-referential-functions-and-design.html. +type Option interface { + apply(*App) +} + +type optionFunc func(*App) + +func (f optionFunc) apply(app *App) { f(app) } + +// Provide registers any number of constructor functions, teaching the +// application how to instantiate various types. The supplied constructor +// function(s) may depend on other types available in the application, must +// return one or more objects, and may return an error. For example: +// +// // Constructs type *C, depends on *A and *B. +// func(*A, *B) *C +// +// // Constructs type *C, depends on *A and *B, and indicates failure by +// // returning an error. +// func(*A, *B) (*C, error) +// +// // Constructs types *B and *C, depends on *A, and can fail. +// func(*A) (*B, *C, error) +// +// The order in which constructors are provided doesn't matter, and passing +// multiple Provide options appends to the application's collection of +// constructors. Constructors are called only if one or more of their returned +// types are needed, and their results are cached for reuse (so instances of a +// type are effectively singletons within an application). Taken together, +// these properties make it perfectly reasonable to Provide a large number of +// constructors even if only a fraction of them are used. +// +// See the documentation of the In and Out types for advanced features, +// including optional parameters and named instances. +func Provide(constructors ...interface{}) Option { + return provideOption(constructors) +} + +type provideOption []interface{} + +func (po provideOption) apply(app *App) { + app.provides = append(app.provides, po...) +} + +func (po provideOption) String() string { + items := make([]string, len(po)) + for i, c := range po { + items[i] = fxreflect.FuncName(c) + } + return fmt.Sprintf("fx.Provide(%s)", strings.Join(items, ", ")) +} + +// Invoke registers functions that are executed eagerly on application start. +// Arguments for these invocations are built using the constructors registered +// by Provide. Passing multiple Invoke options appends the new invocations to +// the application's existing list. +// +// Unlike constructors, invocations are always executed, and they're always +// run in order. Invocations may have any number of returned values. If the +// final returned object is an error, it's assumed to be a success indicator. +// All other returned values are discarded. +// +// Typically, invoked functions take a handful of high-level objects (whose +// constructors depend on lower-level objects) and introduce them to each +// other. This kick-starts the application by forcing it to instantiate a +// variety of types. +// +// To see an invocation in use, read through the package-level example. For +// advanced features, including optional parameters and named instances, see +// the documentation of the In and Out types. +func Invoke(funcs ...interface{}) Option { + return invokeOption(funcs) +} + +type invokeOption []interface{} + +func (io invokeOption) apply(app *App) { + app.invokes = append(app.invokes, io...) +} + +func (io invokeOption) String() string { + items := make([]string, len(io)) + for i, f := range io { + items[i] = fxreflect.FuncName(f) + } + return fmt.Sprintf("fx.Invoke(%s)", strings.Join(items, ", ")) +} + +// Error registers any number of errors with the application to short-circuit +// startup. If more than one error is given, the errors are combined into a +// single error. +// +// Similar to invocations, errors are applied in order. All Provide and Invoke +// options registered before or after an Error option will not be applied. +func Error(errs ...error) Option { + return optionFunc(func(app *App) { + app.err = multierr.Append(app.err, multierr.Combine(errs...)) + }) +} + +// Options converts a collection of Options into a single Option. This allows +// packages to bundle sophisticated functionality into easy-to-use Fx modules. +// For example, a logging package might export a simple option like this: +// +// package logging +// +// var Module = fx.Provide(func() *log.Logger { +// return log.New(os.Stdout, "", 0) +// }) +// +// A shared all-in-one microservice package could then use Options to bundle +// logging with similar metrics, tracing, and gRPC modules: +// +// package server +// +// var Module = fx.Options( +// logging.Module, +// metrics.Module, +// tracing.Module, +// grpc.Module, +// ) +// +// Since this all-in-one module has a minimal API surface, it's easy to add +// new functionality to it without breaking existing users. Individual +// applications can take advantage of all this functionality with only one +// line of code: +// +// app := fx.New(server.Module) +// +// Use this pattern sparingly, since it limits the user's ability to customize +// their application. +func Options(opts ...Option) Option { + return optionGroup(opts) +} + +type optionGroup []Option + +func (og optionGroup) apply(app *App) { + for _, opt := range og { + opt.apply(app) + } +} + +func (og optionGroup) String() string { + items := make([]string, len(og)) + for i, opt := range og { + items[i] = fmt.Sprint(opt) + } + return fmt.Sprintf("fx.Options(%s)", strings.Join(items, ", ")) +} + +// StartTimeout changes the application's start timeout. +func StartTimeout(v time.Duration) Option { + return optionFunc(func(app *App) { + app.startTimeout = v + }) +} + +// StopTimeout changes the application's stop timeout. +func StopTimeout(v time.Duration) Option { + return optionFunc(func(app *App) { + app.stopTimeout = v + }) +} + +// Printer is the interface required by Fx's logging backend. It's implemented +// by most loggers, including the one bundled with the standard library. +type Printer interface { + Printf(string, ...interface{}) +} + +// Logger redirects the application's log output to the provided printer. +func Logger(p Printer) Option { + return optionFunc(func(app *App) { + app.logger = &fxlog.Logger{Printer: p} + app.lifecycle = &lifecycleWrapper{lifecycle.New(app.logger)} + }) +} + +// NopLogger disables the application's log output. Note that this makes some +// failures difficult to debug, since no errors are printed to console. +var NopLogger = Logger(nopLogger{}) + +type nopLogger struct{} + +func (l nopLogger) Printf(string, ...interface{}) { + return +} + +// An App is a modular application built around dependency injection. Most +// users will only need to use the New constructor and the all-in-one Run +// convenience method. In more unusual cases, users may need to use the Err, +// Start, Done, and Stop methods by hand instead of relying on Run. +// +// New creates and initializes an App. All applications begin with a +// constructor for the Lifecycle type already registered. +// +// In addition to that built-in functionality, users typically pass a handful +// of Provide options and one or more Invoke options. The Provide options +// teach the application how to instantiate a variety of types, and the Invoke +// options describe how to initialize the application. +// +// When created, the application immediately executes all the functions passed +// via Invoke options. To supply these functions with the parameters they +// need, the application looks for constructors that return the appropriate +// types; if constructors for any required types are missing or any +// invocations return an error, the application will fail to start (and Err +// will return a descriptive error message). +// +// Once all the invocations (and any required constructors) have been called, +// New returns and the application is ready to be started using Run or Start. +// On startup, it executes any OnStart hooks registered with its Lifecycle. +// OnStart hooks are executed one at a time, in order, and must all complete +// within a configurable deadline (by default, 15 seconds). For details on the +// order in which OnStart hooks are executed, see the documentation for the +// Start method. +// +// At this point, the application has successfully started up. If started via +// Run, it will continue operating until it receives a shutdown signal from +// Done (see the Done documentation for details); if started explicitly via +// Start, it will operate until the user calls Stop. On shutdown, OnStop hooks +// execute one at a time, in reverse order, and must all complete within a +// configurable deadline (again, 15 seconds by default). +type App struct { + err error + container *dig.Container + lifecycle *lifecycleWrapper + provides []interface{} + invokes []interface{} + logger *fxlog.Logger + startTimeout time.Duration + stopTimeout time.Duration + errorHooks []ErrorHandler + + donesMu sync.RWMutex + dones []chan os.Signal +} + +// ErrorHook registers error handlers that implement error handling functions. +// They are executed on invoke failures. Passing multiple ErrorHandlers appends +// the new handlers to the application's existing list. +func ErrorHook(funcs ...ErrorHandler) Option { + return errorHookOption(funcs) +} + +// ErrorHandler handles Fx application startup errors. +type ErrorHandler interface { + HandleError(error) +} + +type errorHookOption []ErrorHandler + +func (eho errorHookOption) apply(app *App) { + app.errorHooks = append(app.errorHooks, eho...) +} + +type errorHandlerList []ErrorHandler + +func (ehl errorHandlerList) HandleError(err error) { + for _, eh := range ehl { + eh.HandleError(err) + } +} + +// New creates and initializes an App, immediately executing any functions +// registered via Invoke options. See the documentation of the App struct for +// details on the application's initialization, startup, and shutdown logic. +func New(opts ...Option) *App { + logger := fxlog.New() + lc := &lifecycleWrapper{lifecycle.New(logger)} + + app := &App{ + container: dig.New(dig.DeferAcyclicVerification()), + lifecycle: lc, + logger: logger, + startTimeout: DefaultTimeout, + stopTimeout: DefaultTimeout, + } + + for _, opt := range opts { + opt.apply(app) + } + + for _, p := range app.provides { + app.provide(p) + } + app.provide(func() Lifecycle { return app.lifecycle }) + app.provide(app.shutdowner) + app.provide(app.dotGraph) + + if app.err != nil { + app.logger.Printf("Error after options were applied: %v", app.err) + return app + } + + if err := app.executeInvokes(); err != nil { + app.err = err + + if dig.CanVisualizeError(err) { + var b bytes.Buffer + dig.Visualize(app.container, &b, dig.VisualizeError(err)) + err = errorWithGraph{ + graph: b.String(), + err: err, + } + } + errorHandlerList(app.errorHooks).HandleError(err) + } + return app +} + +// DotGraph contains a DOT language visualization of the dependency graph in +// an Fx application. It is provided in the container by default at +// initialization. On failure to build the dependency graph, it is attached +// to the error and if possible, colorized to highlight the root cause of the +// failure. +type DotGraph string + +type errWithGraph interface { + Graph() DotGraph +} + +type errorWithGraph struct { + graph string + err error +} + +func (err errorWithGraph) Graph() DotGraph { + return DotGraph(err.graph) +} + +func (err errorWithGraph) Error() string { + return err.err.Error() +} + +// VisualizeError returns the visualization of the error if available. +func VisualizeError(err error) (string, error) { + if e, ok := err.(errWithGraph); ok && e.Graph() != "" { + return string(e.Graph()), nil + } + return "", errors.New("unable to visualize error") +} + +// Run starts the application, blocks on the signals channel, and then +// gracefully shuts the application down. It uses DefaultTimeout to set a +// deadline for application startup and shutdown, unless the user has +// configured different timeouts with the StartTimeout or StopTimeout options. +// It's designed to make typical applications simple to run. +// +// However, all of Run's functionality is implemented in terms of the exported +// Start, Done, and Stop methods. Applications with more specialized needs +// can use those methods directly instead of relying on Run. +func (app *App) Run() { + app.run(app.Done()) +} + +// Err returns any error encountered during New's initialization. See the +// documentation of the New method for details, but typical errors include +// missing constructors, circular dependencies, constructor errors, and +// invocation errors. +// +// Most users won't need to use this method, since both Run and Start +// short-circuit if initialization failed. +func (app *App) Err() error { + return app.err +} + +// Start kicks off all long-running goroutines, like network servers or +// message queue consumers. It does this by interacting with the application's +// Lifecycle. +// +// By taking a dependency on the Lifecycle type, some of the user-supplied +// functions called during initialization may have registered start and stop +// hooks. Because initialization calls constructors serially and in dependency +// order, hooks are naturally registered in dependency order too. +// +// Start executes all OnStart hooks registered with the application's +// Lifecycle, one at a time and in order. This ensures that each constructor's +// start hooks aren't executed until all its dependencies' start hooks +// complete. If any of the start hooks return an error, Start short-circuits, +// calls Stop, and returns the inciting error. +// +// Note that Start short-circuits immediately if the New constructor +// encountered any errors in application initialization. +func (app *App) Start(ctx context.Context) error { + return withTimeout(ctx, app.start) +} + +// Stop gracefully stops the application. It executes any registered OnStop +// hooks in reverse order, so that each constructor's stop hooks are called +// before its dependencies' stop hooks. +// +// If the application didn't start cleanly, only hooks whose OnStart phase was +// called are executed. However, all those hooks are executed, even if some +// fail. +func (app *App) Stop(ctx context.Context) error { + return withTimeout(ctx, app.lifecycle.Stop) +} + +// Done returns a channel of signals to block on after starting the +// application. Applications listen for the SIGINT and SIGTERM signals; during +// development, users can send the application SIGTERM by pressing Ctrl-C in +// the same terminal as the running process. +// +// Alternatively, a signal can be broadcast to all done channels manually by +// using the Shutdown functionality (see the Shutdowner documentation for details). +func (app *App) Done() <-chan os.Signal { + c := make(chan os.Signal, 1) + signal.Notify(c, syscall.SIGINT, syscall.SIGTERM) + + app.donesMu.Lock() + app.dones = append(app.dones, c) + app.donesMu.Unlock() + return c +} + +// StartTimeout returns the configured startup timeout. Apps default to using +// DefaultTimeout, but users can configure this behavior using the +// StartTimeout option. +func (app *App) StartTimeout() time.Duration { + return app.startTimeout +} + +// StopTimeout returns the configured shutdown timeout. Apps default to using +// DefaultTimeout, but users can configure this behavior using the StopTimeout +// option. +func (app *App) StopTimeout() time.Duration { + return app.stopTimeout +} + +func (app *App) dotGraph() (DotGraph, error) { + var b bytes.Buffer + err := dig.Visualize(app.container, &b) + return DotGraph(b.String()), err +} + +func (app *App) provide(constructor interface{}) { + if app.err != nil { + return + } + app.logger.PrintProvide(constructor) + + if _, ok := constructor.(Option); ok { + app.err = fmt.Errorf("fx.Option should be passed to fx.New directly, not to fx.Provide: fx.Provide received %v", constructor) + return + } + + if a, ok := constructor.(Annotated); ok { + var opts []dig.ProvideOption + switch { + case len(a.Group) > 0 && len(a.Name) > 0: + app.err = fmt.Errorf("fx.Annotate may not specify both name and group for %v", constructor) + return + case len(a.Name) > 0: + opts = append(opts, dig.Name(a.Name)) + case len(a.Group) > 0: + opts = append(opts, dig.Group(a.Group)) + + } + + if err := app.container.Provide(a.Target, opts...); err != nil { + app.err = err + } + return + } + + if reflect.TypeOf(constructor).Kind() == reflect.Func { + ft := reflect.ValueOf(constructor).Type() + + for i := 0; i < ft.NumOut(); i++ { + t := ft.Out(i) + + if t == reflect.TypeOf(Annotated{}) { + app.err = fmt.Errorf("fx.Annotated should be passed to fx.Provide directly, it should not be returned by the constructor: fx.Provide received %v", constructor) + return + } + } + } + + if err := app.container.Provide(constructor); err != nil { + app.err = err + } +} + +// Execute invokes in order supplied to New, returning the first error +// encountered. +func (app *App) executeInvokes() error { + // TODO: consider taking a context to limit the time spent running invocations. + var err error + + for _, fn := range app.invokes { + fname := fxreflect.FuncName(fn) + app.logger.Printf("INVOKE\t\t%s", fname) + + if _, ok := fn.(Option); ok { + err = fmt.Errorf("fx.Option should be passed to fx.New directly, not to fx.Invoke: fx.Invoke received %v", fn) + } else { + err = app.container.Invoke(fn) + } + + if err != nil { + app.logger.Printf("Error during %q invoke: %v", fname, err) + break + } + } + + return err +} + +func (app *App) run(done <-chan os.Signal) { + startCtx, cancel := context.WithTimeout(context.Background(), app.StartTimeout()) + defer cancel() + + if err := app.Start(startCtx); err != nil { + app.logger.Fatalf("ERROR\t\tFailed to start: %v", err) + } + + app.logger.PrintSignal(<-done) + + stopCtx, cancel := context.WithTimeout(context.Background(), app.StopTimeout()) + defer cancel() + + if err := app.Stop(stopCtx); err != nil { + app.logger.Fatalf("ERROR\t\tFailed to stop cleanly: %v", err) + } +} + +func (app *App) start(ctx context.Context) error { + if app.err != nil { + // Some provides failed, short-circuit immediately. + return app.err + } + + // Attempt to start cleanly. + if err := app.lifecycle.Start(ctx); err != nil { + // Start failed, roll back. + app.logger.Printf("ERROR\t\tStart failed, rolling back: %v", err) + if stopErr := app.lifecycle.Stop(ctx); stopErr != nil { + app.logger.Printf("ERROR\t\tCouldn't rollback cleanly: %v", stopErr) + return multierr.Append(err, stopErr) + } + return err + } + + app.logger.Printf("RUNNING") + return nil +} + +func withTimeout(ctx context.Context, f func(context.Context) error) error { + c := make(chan error, 1) + go func() { c <- f(ctx) }() + + select { + case <-ctx.Done(): + return ctx.Err() + case err := <-c: + return err + } +} diff --git a/vendor/go.uber.org/fx/doc.go b/vendor/go.uber.org/fx/doc.go new file mode 100644 index 00000000..c86996c5 --- /dev/null +++ b/vendor/go.uber.org/fx/doc.go @@ -0,0 +1,39 @@ +// Copyright (c) 2019 Uber Technologies, 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. + +// Package fx is a framework that makes it easy to build applications out of +// reusable, composable modules. +// +// Fx applications use dependency injection to eliminate globals without the +// tedium of manually wiring together function calls. Unlike other approaches +// to dependency injection, Fx works with plain Go functions: you don't need +// to use struct tags or embed special types, so Fx automatically works well +// with most Go packages. +// +// Basic usage is explained in the package-level example below. If you're new +// to Fx, start there! Advanced features, including named instances, optional +// parameters, and value groups, are explained under the In and Out types. +// +// Testing Fx Applications +// +// To test functions that use the Lifecycle type or to write end-to-end tests +// of your Fx application, use the helper functions and types provided by the +// go.uber.org/fx/fxtest package. +package fx diff --git a/vendor/go.uber.org/fx/extract.go b/vendor/go.uber.org/fx/extract.go new file mode 100644 index 00000000..8fb34a0b --- /dev/null +++ b/vendor/go.uber.org/fx/extract.go @@ -0,0 +1,157 @@ +// Copyright (c) 2019 Uber Technologies, 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. + +package fx + +import ( + "fmt" + "reflect" + "unicode" + "unicode/utf8" +) + +var _typeOfIn = reflect.TypeOf(In{}) + +// Extract fills the given struct with values from the dependency injection +// container on application initialization. The target MUST be a pointer to a +// struct. Only exported fields will be filled. +// +// Extract will be deprecated soon: use Populate instead, which doesn't +// require defining a container struct. +func Extract(target interface{}) Option { + v := reflect.ValueOf(target) + + if t := v.Type(); t.Kind() != reflect.Ptr || t.Elem().Kind() != reflect.Struct { + return invokeErr(fmt.Errorf("Extract expected a pointer to a struct, got a %v", t)) + } + + v = v.Elem() + t := v.Type() + + // We generate a function which accepts a single fx.In struct as an + // argument. This struct contains all exported fields of the target + // struct. + + // Fields of the generated fx.In struct. + fields := make([]reflect.StructField, 0, t.NumField()+1) + + // Anonymous dig.In field. + fields = append(fields, reflect.StructField{ + Name: _typeOfIn.Name(), + Anonymous: true, + Type: _typeOfIn, + }) + + // List of values in the target struct aligned with the fields of the + // generated struct. + // + // So for example, if the target is, + // + // var target struct { + // Foo io.Reader + // bar []byte + // Baz io.Writer + // } + // + // The generated struct has the shape, + // + // struct { + // fx.In + // + // F0 io.Reader + // F2 io.Writer + // } + // + // And `targets` is, + // + // [ + // target.Field(0), // Foo io.Reader + // target.Field(2), // Baz io.Writer + // ] + // + // As we iterate through the fields of the generated struct, we can copy + // the value into the corresponding value in the targets list. + targets := make([]reflect.Value, 0, t.NumField()) + + for i := 0; i < t.NumField(); i++ { + f := t.Field(i) + + // Skip unexported fields. + if f.Anonymous { + // If embedded, StructField.PkgPath is not a reliable indicator of + // whether the field is exported. See + // https://github.com/golang/go/issues/21122 + + t := f.Type + if t.Kind() == reflect.Ptr { + t = t.Elem() + } + + if !isExported(t.Name()) { + continue + } + } else if f.PkgPath != "" { + continue + } + + // We don't copy over names or embedded semantics. + fields = append(fields, reflect.StructField{ + Name: fmt.Sprintf("F%d", i), + Type: f.Type, + Tag: f.Tag, + }) + targets = append(targets, v.Field(i)) + } + + // Equivalent to, + // + // func(r struct { + // fx.In + // + // F1 Foo + // F2 Bar + // }) { + // target.Foo = r.F1 + // target.Bar = r.F2 + // } + + fn := reflect.MakeFunc( + reflect.FuncOf( + []reflect.Type{reflect.StructOf(fields)}, + nil, /* results */ + false, /* variadic */ + ), + func(args []reflect.Value) []reflect.Value { + result := args[0] + for i := 1; i < result.NumField(); i++ { + targets[i-1].Set(result.Field(i)) + } + return nil + }, + ) + + return Invoke(fn.Interface()) +} + +// isExported reports whether the identifier is exported. +func isExported(id string) bool { + r, _ := utf8.DecodeRuneInString(id) + return unicode.IsUpper(r) +} diff --git a/vendor/go.uber.org/fx/glide.lock b/vendor/go.uber.org/fx/glide.lock new file mode 100644 index 00000000..4fb92261 --- /dev/null +++ b/vendor/go.uber.org/fx/glide.lock @@ -0,0 +1,44 @@ +hash: 71b848dcf5bde6b02fd7ca7cf3ac1e7628dd27e7248f3823900bce9a78005038 +updated: 2018-09-20T11:31:48.18331584-07:00 +imports: +- name: go.uber.org/atomic + version: 1ea20fb1cbb1cc08cbd0d913a96dead89aa18289 +- name: go.uber.org/dig + version: 7ff117f761a3f1b3eb521945c17a1091438eb6de + subpackages: + - internal/digreflect + - internal/dot +- name: go.uber.org/multierr + version: 3c4937480c32f4c13a875a1829af76c98ca3d40a +testImports: +- name: github.com/davecgh/go-spew + version: 8991bc29aa16c548c550c7ff78260e27b9ab7c73 + subpackages: + - spew +- name: github.com/pmezard/go-difflib + version: 792786c7400a136282c1664665ae0a8db921c6c2 + subpackages: + - difflib +- name: github.com/stretchr/testify + version: f35b8ab0b5a2cef36673838d662e249dd9c94686 + subpackages: + - assert + - require +- name: go.uber.org/goleak + version: 1ac8aeca0a53163331564467638f6ffb639636bf + subpackages: + - internal/stack +- name: go.uber.org/tools + version: ce2550dad7144b81ae2f67dc5e55597643f6902b + subpackages: + - update-license +- name: golang.org/x/lint + version: 06c8688daad7faa9da5a0c2f163a3d14aac986ca + repo: https://github.com/golang/lint + vcs: git + subpackages: + - golint +- name: golang.org/x/tools + version: 4e70a1b26a7875f00ca1916637a876b5ffaeec59 + subpackages: + - cover diff --git a/vendor/go.uber.org/fx/glide.yaml b/vendor/go.uber.org/fx/glide.yaml new file mode 100644 index 00000000..f4422bc6 --- /dev/null +++ b/vendor/go.uber.org/fx/glide.yaml @@ -0,0 +1,25 @@ +package: go.uber.org/fx +import: +- package: go.uber.org/multierr + version: ^1 +- package: go.uber.org/dig + version: ^1.7 # At least version 1.7 is required for fx/dig `Group` support. +testImport: +- package: github.com/stretchr/testify + version: ^1 + subpackages: + - assert + - require +- package: go.uber.org/tools + subpackages: + - update-license +- package: golang.org/x/tools + subpackages: + - cover +- package: golang.org/x/lint + repo: https://github.com/golang/lint + vcs: git + subpackages: + - golint +- package: go.uber.org/goleak + version: ~0.10 diff --git a/vendor/go.uber.org/fx/inout.go b/vendor/go.uber.org/fx/inout.go new file mode 100644 index 00000000..6c37c567 --- /dev/null +++ b/vendor/go.uber.org/fx/inout.go @@ -0,0 +1,254 @@ +// Copyright (c) 2019 Uber Technologies, 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. + +package fx + +import "go.uber.org/dig" + +// In can be embedded in a constructor's parameter struct to take advantage of +// advanced dependency injection features. +// +// Modules should take a single parameter struct that embeds an In in order to +// provide a forward-compatible API: since adding fields to a struct is +// backward-compatible, modules can then add optional dependencies in minor +// releases. +// +// Parameter Structs +// +// Fx constructors declare their dependencies as function parameters. This can +// quickly become unreadable if the constructor has a lot of dependencies. +// +// func NewHandler(users *UserGateway, comments *CommentGateway, posts *PostGateway, votes *VoteGateway, authz *AuthZGateway) *Handler { +// // ... +// } +// +// To improve the readability of constructors like this, create a struct that +// lists all the dependencies as fields and change the function to accept that +// struct instead. The new struct is called a parameter struct. +// +// Fx has first class support for parameter structs: any struct embedding +// fx.In gets treated as a parameter struct, so the individual fields in the +// struct are supplied via dependency injection. Using a parameter struct, we +// can make the constructor above much more readable: +// +// type HandlerParams struct { +// fx.In +// +// Users *UserGateway +// Comments *CommentGateway +// Posts *PostGateway +// Votes *VoteGateway +// AuthZ *AuthZGateway +// } +// +// func NewHandler(p HandlerParams) *Handler { +// // ... +// } +// +// Though it's rarely a good idea, constructors can receive any combination of +// parameter structs and parameters. +// +// func NewHandler(p HandlerParams, l *log.Logger) *Handler { +// // ... +// } +// +// Optional Dependencies +// +// Constructors often have soft dependencies on some types: if those types are +// missing, they can operate in a degraded state. Fx supports optional +// dependencies via the `optional:"true"` tag to fields on parameter structs. +// +// type UserGatewayParams struct { +// fx.In +// +// Conn *sql.DB +// Cache *redis.Client `optional:"true"` +// } +// +// If an optional field isn't available in the container, the constructor +// receives the field's zero value. +// +// func NewUserGateway(p UserGatewayParams, log *log.Logger) (*UserGateway, error) { +// if p.Cache != nil { +// log.Print("Caching disabled") +// } +// // ... +// } +// +// Constructors that declare optional dependencies MUST gracefully handle +// situations in which those dependencies are absent. +// +// The optional tag also allows adding new dependencies without breaking +// existing consumers of the constructor. +// +// Named Values +// +// Some use cases require the application container to hold multiple values of +// the same type. For details on producing named values, see the documentation +// for the Out type. +// +// Fx allows functions to consume named values via the `name:".."` tag on +// parameter structs. Note that both the name AND type of the fields on the +// parameter struct must match the corresponding result struct. +// +// type GatewayParams struct { +// fx.In +// +// WriteToConn *sql.DB `name:"rw"` +// ReadFromConn *sql.DB `name:"ro"` +// } +// +// The name tag may be combined with the optional tag to declare the +// dependency optional. +// +// type GatewayParams struct { +// fx.In +// +// WriteToConn *sql.DB `name:"rw"` +// ReadFromConn *sql.DB `name:"ro" optional:"true"` +// } +// +// func NewCommentGateway(p GatewayParams, log *log.Logger) (*CommentGateway, error) { +// if p.ReadFromConn == nil { +// log.Print("Warning: Using RW connection for reads") +// p.ReadFromConn = p.WriteToConn +// } +// // ... +// } +// +// Value Groups +// +// To make it easier to produce and consume many values of the same type, Fx +// supports named, unordered collections called value groups. For details on +// producing value groups, see the documentation for the Out type. +// +// Functions can depend on a value group by requesting a slice tagged with +// `group:".."`. This will execute all constructors that provide a value to +// that group in an unspecified order, then collect all the results into a +// single slice. Keep in mind that this makes the types of the parameter and +// result struct fields different: if a group of constructors each returns +// type T, parameter structs consuming the group must use a field of type []T. +// +// type ServerParams struct { +// fx.In +// +// Handlers []Handler `group:"server"` +// } +// +// func NewServer(p ServerParams) *Server { +// server := newServer() +// for _, h := range p.Handlers { +// server.Register(h) +// } +// return server +// } +// +// Note that values in a value group are unordered. Fx makes no guarantees +// about the order in which these values will be produced. +type In struct{ dig.In } + +// Out is the inverse of In: it can be embedded in result structs to take +// advantage of advanced features. +// +// Modules should return a single result struct that embeds an Out in order to +// provide a forward-compatible API: since adding fields to a struct is +// backward-compatible, minor releases can provide additional types. +// +// Result Structs +// +// Result structs are the inverse of parameter structs (discussed in the In +// documentation). These structs represent multiple outputs from a +// single function as fields. Fx treats all structs embedding fx.Out as result +// structs, so other constructors can rely on the result struct's fields +// directly. +// +// Without result structs, we sometimes have function definitions like this: +// +// func SetupGateways(conn *sql.DB) (*UserGateway, *CommentGateway, *PostGateway, error) { +// // ... +// } +// +// With result structs, we can make this both more readable and easier to +// modify in the future: +// +// type Gateways struct { +// fx.Out +// +// Users *UserGateway +// Comments *CommentGateway +// Posts *PostGateway +// } +// +// func SetupGateways(conn *sql.DB) (Gateways, error) { +// // ... +// } +// +// Named Values +// +// Some use cases require the application container to hold multiple values of +// the same type. For details on consuming named values, see the documentation +// for the In type. +// +// A constructor that produces a result struct can tag any field with +// `name:".."` to have the corresponding value added to the graph under the +// specified name. An application may contain at most one unnamed value of a +// given type, but may contain any number of named values of the same type. +// +// type ConnectionResult struct { +// fx.Out +// +// ReadWrite *sql.DB `name:"rw"` +// ReadOnly *sql.DB `name:"ro"` +// } +// +// func ConnectToDatabase(...) (ConnectionResult, error) { +// // ... +// return ConnectionResult{ReadWrite: rw, ReadOnly: ro}, nil +// } +// +// Value Groups +// +// To make it easier to produce and consume many values of the same type, Fx +// supports named, unordered collections called value groups. For details on +// consuming value groups, see the documentation for the In type. +// +// Constructors can send values into value groups by returning a result struct +// tagged with `group:".."`. +// +// type HandlerResult struct { +// fx.Out +// +// Handler Handler `group:"server"` +// } +// +// func NewHelloHandler() HandlerResult { +// // ... +// } +// +// func NewEchoHandler() HandlerResult { +// // ... +// } +// +// Any number of constructors may provide values to this named collection, but +// the ordering of the final collection is unspecified. Keep in mind that +// value groups require parameter and result structs to use fields with +// different types: if a group of constructors each returns type T, parameter +// structs consuming the group must use a field of type []T. +type Out struct{ dig.Out } diff --git a/vendor/go.uber.org/fx/internal/fxlog/fxlog.go b/vendor/go.uber.org/fx/internal/fxlog/fxlog.go new file mode 100644 index 00000000..18c3e366 --- /dev/null +++ b/vendor/go.uber.org/fx/internal/fxlog/fxlog.go @@ -0,0 +1,80 @@ +// Copyright (c) 2019 Uber Technologies, 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. + +package fxlog + +import ( + "fmt" + "log" + "os" + "strings" + + "go.uber.org/fx/internal/fxreflect" +) + +var _exit = func() { os.Exit(1) } + +// Printer is a formatting printer. +type Printer interface { + Printf(string, ...interface{}) +} + +// New returns a new Logger backed by the standard library's log package. +func New() *Logger { + return &Logger{log.New(os.Stderr, "", log.LstdFlags)} +} + +// A Logger writes output to standard error. +type Logger struct { + Printer +} + +// Printf logs a formatted Fx line. +func (l *Logger) Printf(format string, v ...interface{}) { + l.Printer.Printf(prepend(format), v...) +} + +// PrintProvide logs a type provided into the dig.Container. +func (l *Logger) PrintProvide(t interface{}) { + for _, rtype := range fxreflect.ReturnTypes(t) { + l.Printf("PROVIDE\t%s <= %s", rtype, fxreflect.FuncName(t)) + } +} + +// PrintSignal logs an os.Signal. +func (l *Logger) PrintSignal(signal os.Signal) { + l.Printf(strings.ToUpper(signal.String())) +} + +// Panic logs an Fx line then panics. +func (l *Logger) Panic(err error) { + l.Printer.Printf(prepend(err.Error())) + panic(err) +} + +// Fatalf logs an Fx line then fatals. +func (l *Logger) Fatalf(format string, v ...interface{}) { + l.Printer.Printf(prepend(format), v...) + _exit() +} + +func prepend(str string) string { + return fmt.Sprintf("[Fx] %s", str) +} diff --git a/vendor/go.uber.org/fx/internal/fxreflect/fxreflect.go b/vendor/go.uber.org/fx/internal/fxreflect/fxreflect.go new file mode 100644 index 00000000..8e2692dc --- /dev/null +++ b/vendor/go.uber.org/fx/internal/fxreflect/fxreflect.go @@ -0,0 +1,163 @@ +// Copyright (c) 2019 Uber Technologies, 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. + +package fxreflect + +import ( + "fmt" + "net/url" + "reflect" + "regexp" + "runtime" + "strings" + + "go.uber.org/dig" +) + +// Match from beginning of the line until the first `vendor/` (non-greedy) +var vendorRe = regexp.MustCompile("^.*?/vendor/") + +// ReturnTypes takes a func and returns a slice of string'd types. +func ReturnTypes(t interface{}) []string { + if reflect.TypeOf(t).Kind() != reflect.Func { + // Invalid provide, will be logged as an error. + return []string{} + } + + rtypes := []string{} + ft := reflect.ValueOf(t).Type() + + for i := 0; i < ft.NumOut(); i++ { + t := ft.Out(i) + + traverseOuts(key{t: t}, func(s string) { + rtypes = append(rtypes, s) + }) + } + + return rtypes +} + +type key struct { + t reflect.Type + name string +} + +func (k *key) String() string { + if k.name != "" { + return fmt.Sprintf("%v:%s", k.t, k.name) + } + return k.t.String() +} + +func traverseOuts(k key, f func(s string)) { + // skip errors + if isErr(k.t) { + return + } + + // call funtion on non-Out types + if dig.IsOut(k.t) { + // keep recursing down on field members in case they are ins + for i := 0; i < k.t.NumField(); i++ { + field := k.t.Field(i) + ft := field.Type + + if field.PkgPath != "" { + continue // skip private fields + } + + // keep recursing to traverse all the embedded objects + k := key{ + t: ft, + name: field.Tag.Get("name"), + } + traverseOuts(k, f) + } + + return + } + + f(k.String()) +} + +// sanitize makes the function name suitable for logging display. It removes +// url-encoded elements from the `dot.git` package names and shortens the +// vendored paths. +func sanitize(function string) string { + // Use the stdlib to un-escape any package import paths which can happen + // in the case of the "dot-git" postfix. Seems like a bug in stdlib =/ + if unescaped, err := url.QueryUnescape(function); err == nil { + function = unescaped + } + + // strip everything prior to the vendor + return vendorRe.ReplaceAllString(function, "vendor/") +} + +// Caller returns the formatted calling func name +func Caller() string { + // Ascend at most 8 frames looking for a caller outside fx. + pcs := make([]uintptr, 8) + + // Don't include this frame. + n := runtime.Callers(2, pcs) + if n == 0 { + return "n/a" + } + + frames := runtime.CallersFrames(pcs) + for f, more := frames.Next(); more; f, more = frames.Next() { + if shouldIgnoreFrame(f) { + continue + } + return sanitize(f.Function) + } + return "n/a" +} + +// FuncName returns a funcs formatted name +func FuncName(fn interface{}) string { + fnV := reflect.ValueOf(fn) + if fnV.Kind() != reflect.Func { + return "n/a" + } + + function := runtime.FuncForPC(fnV.Pointer()).Name() + return fmt.Sprintf("%s()", sanitize(function)) +} + +func isErr(t reflect.Type) bool { + errInterface := reflect.TypeOf((*error)(nil)).Elem() + return t.Implements(errInterface) +} + +// Ascend the call stack until we leave the Fx production code. This allows us +// to avoid hard-coding a frame skip, which makes this code work well even +// when it's wrapped. +func shouldIgnoreFrame(f runtime.Frame) bool { + if strings.Contains(f.File, "_test.go") { + return false + } + if strings.Contains(f.File, "go.uber.org/fx") { + return true + } + return false +} diff --git a/vendor/go.uber.org/fx/internal/lifecycle/lifecycle.go b/vendor/go.uber.org/fx/internal/lifecycle/lifecycle.go new file mode 100644 index 00000000..ded22ed4 --- /dev/null +++ b/vendor/go.uber.org/fx/internal/lifecycle/lifecycle.go @@ -0,0 +1,92 @@ +// Copyright (c) 2019 Uber Technologies, 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. + +package lifecycle + +import ( + "context" + + "go.uber.org/fx/internal/fxlog" + "go.uber.org/fx/internal/fxreflect" + "go.uber.org/multierr" +) + +// A Hook is a pair of start and stop callbacks, either of which can be nil, +// plus a string identifying the supplier of the hook. +type Hook struct { + OnStart func(context.Context) error + OnStop func(context.Context) error + caller string +} + +// Lifecycle coordinates application lifecycle hooks. +type Lifecycle struct { + logger *fxlog.Logger + hooks []Hook + numStarted int +} + +// New constructs a new Lifecycle. +func New(logger *fxlog.Logger) *Lifecycle { + if logger == nil { + logger = fxlog.New() + } + return &Lifecycle{logger: logger} +} + +// Append adds a Hook to the lifecycle. +func (l *Lifecycle) Append(hook Hook) { + hook.caller = fxreflect.Caller() + l.hooks = append(l.hooks, hook) +} + +// Start runs all OnStart hooks, returning immediately if it encounters an +// error. +func (l *Lifecycle) Start(ctx context.Context) error { + for _, hook := range l.hooks { + if hook.OnStart != nil { + l.logger.Printf("START\t\t%s()", hook.caller) + if err := hook.OnStart(ctx); err != nil { + return err + } + } + l.numStarted++ + } + return nil +} + +// Stop runs any OnStop hooks whose OnStart counterpart succeeded. OnStop +// hooks run in reverse order. +func (l *Lifecycle) Stop(ctx context.Context) error { + var errs []error + // Run backward from last successful OnStart. + for ; l.numStarted > 0; l.numStarted-- { + hook := l.hooks[l.numStarted-1] + if hook.OnStop == nil { + continue + } + l.logger.Printf("STOP\t\t%s()", hook.caller) + if err := hook.OnStop(ctx); err != nil { + // For best-effort cleanup, keep going after errors. + errs = append(errs, err) + } + } + return multierr.Combine(errs...) +} diff --git a/vendor/go.uber.org/fx/lifecycle.go b/vendor/go.uber.org/fx/lifecycle.go new file mode 100644 index 00000000..f187e223 --- /dev/null +++ b/vendor/go.uber.org/fx/lifecycle.go @@ -0,0 +1,52 @@ +// Copyright (c) 2019 Uber Technologies, 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. + +package fx + +import ( + "context" + + "go.uber.org/fx/internal/lifecycle" +) + +// Lifecycle allows constructors to register callbacks that are executed on +// application start and stop. See the documentation for App for details on Fx +// applications' initialization, startup, and shutdown logic. +type Lifecycle interface { + Append(Hook) +} + +// A Hook is a pair of start and stop callbacks, either of which can be nil. +// If a Hook's OnStart callback isn't executed (because a previous OnStart +// failure short-circuited application startup), its OnStop callback won't be +// executed. +type Hook struct { + OnStart func(context.Context) error + OnStop func(context.Context) error +} + +type lifecycleWrapper struct{ *lifecycle.Lifecycle } + +func (l *lifecycleWrapper) Append(h Hook) { + l.Lifecycle.Append(lifecycle.Hook{ + OnStart: h.OnStart, + OnStop: h.OnStop, + }) +} diff --git a/vendor/go.uber.org/fx/populate.go b/vendor/go.uber.org/fx/populate.go new file mode 100644 index 00000000..1c503c5b --- /dev/null +++ b/vendor/go.uber.org/fx/populate.go @@ -0,0 +1,73 @@ +// Copyright (c) 2019 Uber Technologies, 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. + +package fx + +import ( + "fmt" + "reflect" +) + +// Populate sets targets with values from the dependency injection container +// during application initialization. All targets must be pointers to the +// values that must be populated. Pointers to structs that embed In are +// supported, which can be used to populate multiple values in a struct. +// +// This is most helpful in unit tests: it lets tests leverage Fx's automatic +// constructor wiring to build a few structs, but then extract those structs +// for further testing. +func Populate(targets ...interface{}) Option { + // Validate all targets are non-nil pointers. + targetTypes := make([]reflect.Type, len(targets)) + for i, t := range targets { + if t == nil { + return invokeErr(fmt.Errorf("failed to Populate: target %v is nil", i+1)) + } + rt := reflect.TypeOf(t) + if rt.Kind() != reflect.Ptr { + return invokeErr(fmt.Errorf("failed to Populate: target %v is not a pointer type, got %T", i+1, t)) + } + + targetTypes[i] = reflect.TypeOf(t).Elem() + } + + // Build a function that looks like: + // + // func(t1 T1, t2 T2, ...) { + // *targets[0] = t1 + // *targets[1] = t2 + // [...] + // } + // + fnType := reflect.FuncOf(targetTypes, nil, false /* variadic */) + fn := reflect.MakeFunc(fnType, func(args []reflect.Value) []reflect.Value { + for i, arg := range args { + reflect.ValueOf(targets[i]).Elem().Set(arg) + } + return nil + }) + return Invoke(fn.Interface()) +} + +func invokeErr(err error) Option { + return Invoke(func() error { + return err + }) +} diff --git a/vendor/go.uber.org/fx/shutdown.go b/vendor/go.uber.org/fx/shutdown.go new file mode 100644 index 00000000..928e45d8 --- /dev/null +++ b/vendor/go.uber.org/fx/shutdown.go @@ -0,0 +1,79 @@ +// Copyright (c) 2019 Uber Technologies, 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. + +package fx + +import ( + "fmt" + "os" + "syscall" +) + +// Shutdowner provides a method that can manually trigger the shutdown of the +// application by sending a signal to all open Done channels. Shutdowner works +// on applications using Run as well as Start, Done, and Stop. The Shutdowner is +// provided to all Fx applications. +type Shutdowner interface { + Shutdown(...ShutdownOption) error +} + +// ShutdownOption provides a way to configure properties of the shutdown +// process. Currently, no options have been implemented. +type ShutdownOption interface { + apply(*shutdowner) +} + +type shutdowner struct { + app *App +} + +// Shutdown broadcasts a signal to all of the application's Done channels +// and begins the Stop process. +func (s *shutdowner) Shutdown(opts ...ShutdownOption) error { + return s.app.broadcastSignal(syscall.SIGTERM) +} + +func (app *App) shutdowner() Shutdowner { + return &shutdowner{app: app} +} + +func (app *App) broadcastSignal(signal os.Signal) error { + app.donesMu.RLock() + defer app.donesMu.RUnlock() + + var unsent int + for _, done := range app.dones { + select { + case done <- signal: + default: + // shutdown called when done channel has already received a + // termination signal that has not been cleared + unsent++ + } + } + + if unsent != 0 { + return fmt.Errorf("failed to send %v signal to %v out of %v channels", + signal, unsent, len(app.dones), + ) + } + + return nil +} diff --git a/vendor/go.uber.org/fx/version.go b/vendor/go.uber.org/fx/version.go new file mode 100644 index 00000000..1fe32c35 --- /dev/null +++ b/vendor/go.uber.org/fx/version.go @@ -0,0 +1,24 @@ +// Copyright (c) 2019 Uber Technologies, 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. + +package fx + +// Version is exported for runtime compatibility checks. +const Version = "1.9.0" diff --git a/vendor/go.uber.org/multierr/.codecov.yml b/vendor/go.uber.org/multierr/.codecov.yml new file mode 100644 index 00000000..6d4d1be7 --- /dev/null +++ b/vendor/go.uber.org/multierr/.codecov.yml @@ -0,0 +1,15 @@ +coverage: + range: 80..100 + round: down + precision: 2 + + status: + project: # measuring the overall project coverage + default: # context, you can create multiple ones with custom titles + enabled: yes # must be yes|true to enable this status + target: 100 # specify the target coverage for each commit status + # option: "auto" (must increase from parent commit or pull request base) + # option: "X%" a static target percentage to hit + if_not_found: success # if parent is not found report status as success, error, or failure + if_ci_failed: error # if ci fails report status as success, error, or failure + diff --git a/vendor/go.uber.org/multierr/.gitignore b/vendor/go.uber.org/multierr/.gitignore new file mode 100644 index 00000000..61ead866 --- /dev/null +++ b/vendor/go.uber.org/multierr/.gitignore @@ -0,0 +1 @@ +/vendor diff --git a/vendor/go.uber.org/multierr/.travis.yml b/vendor/go.uber.org/multierr/.travis.yml new file mode 100644 index 00000000..5ffa8fed --- /dev/null +++ b/vendor/go.uber.org/multierr/.travis.yml @@ -0,0 +1,33 @@ +sudo: false +language: go +go_import_path: go.uber.org/multierr + +env: + global: + - GO15VENDOREXPERIMENT=1 + +go: + - 1.7 + - 1.8 + - tip + +cache: + directories: + - vendor + +before_install: +- go version + +install: +- | + set -e + make install_ci + +script: +- | + set -e + make lint + make test_ci + +after_success: +- bash <(curl -s https://codecov.io/bash) diff --git a/vendor/go.uber.org/multierr/CHANGELOG.md b/vendor/go.uber.org/multierr/CHANGELOG.md new file mode 100644 index 00000000..898445d0 --- /dev/null +++ b/vendor/go.uber.org/multierr/CHANGELOG.md @@ -0,0 +1,28 @@ +Releases +======== + +v1.1.0 (2017-06-30) +=================== + +- Added an `Errors(error) []error` function to extract the underlying list of + errors for a multierr error. + + +v1.0.0 (2017-05-31) +=================== + +No changes since v0.2.0. This release is committing to making no breaking +changes to the current API in the 1.X series. + + +v0.2.0 (2017-04-11) +=================== + +- Repeatedly appending to the same error is now faster due to fewer + allocations. + + +v0.1.0 (2017-31-03) +=================== + +- Initial release diff --git a/vendor/go.uber.org/multierr/LICENSE.txt b/vendor/go.uber.org/multierr/LICENSE.txt new file mode 100644 index 00000000..858e0247 --- /dev/null +++ b/vendor/go.uber.org/multierr/LICENSE.txt @@ -0,0 +1,19 @@ +Copyright (c) 2017 Uber Technologies, 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/go.uber.org/multierr/Makefile b/vendor/go.uber.org/multierr/Makefile new file mode 100644 index 00000000..a7437d06 --- /dev/null +++ b/vendor/go.uber.org/multierr/Makefile @@ -0,0 +1,74 @@ +export GO15VENDOREXPERIMENT=1 + +PACKAGES := $(shell glide nv) + +GO_FILES := $(shell \ + find . '(' -path '*/.*' -o -path './vendor' ')' -prune \ + -o -name '*.go' -print | cut -b3-) + +.PHONY: install +install: + glide --version || go get github.com/Masterminds/glide + glide install + +.PHONY: build +build: + go build -i $(PACKAGES) + +.PHONY: test +test: + go test -cover -race $(PACKAGES) + +.PHONY: gofmt +gofmt: + $(eval FMT_LOG := $(shell mktemp -t gofmt.XXXXX)) + @gofmt -e -s -l $(GO_FILES) > $(FMT_LOG) || true + @[ ! -s "$(FMT_LOG)" ] || (echo "gofmt failed:" | cat - $(FMT_LOG) && false) + +.PHONY: govet +govet: + $(eval VET_LOG := $(shell mktemp -t govet.XXXXX)) + @go vet $(PACKAGES) 2>&1 \ + | grep -v '^exit status' > $(VET_LOG) || true + @[ ! -s "$(VET_LOG)" ] || (echo "govet failed:" | cat - $(VET_LOG) && false) + +.PHONY: golint +golint: + @go get github.com/golang/lint/golint + $(eval LINT_LOG := $(shell mktemp -t golint.XXXXX)) + @cat /dev/null > $(LINT_LOG) + @$(foreach pkg, $(PACKAGES), golint $(pkg) >> $(LINT_LOG) || true;) + @[ ! -s "$(LINT_LOG)" ] || (echo "golint failed:" | cat - $(LINT_LOG) && false) + +.PHONY: staticcheck +staticcheck: + @go get honnef.co/go/tools/cmd/staticcheck + $(eval STATICCHECK_LOG := $(shell mktemp -t staticcheck.XXXXX)) + @staticcheck $(PACKAGES) 2>&1 > $(STATICCHECK_LOG) || true + @[ ! -s "$(STATICCHECK_LOG)" ] || (echo "staticcheck failed:" | cat - $(STATICCHECK_LOG) && false) + +.PHONY: lint +lint: gofmt govet golint staticcheck + +.PHONY: cover +cover: + ./scripts/cover.sh $(shell go list $(PACKAGES)) + go tool cover -html=cover.out -o cover.html + +update-license: + @go get go.uber.org/tools/update-license + @update-license \ + $(shell go list -json $(PACKAGES) | \ + jq -r '.Dir + "/" + (.GoFiles | .[])') + +############################################################################## + +.PHONY: install_ci +install_ci: install + go get github.com/wadey/gocovmerge + go get github.com/mattn/goveralls + go get golang.org/x/tools/cmd/cover + +.PHONY: test_ci +test_ci: install_ci + ./scripts/cover.sh $(shell go list $(PACKAGES)) diff --git a/vendor/go.uber.org/multierr/README.md b/vendor/go.uber.org/multierr/README.md new file mode 100644 index 00000000..065088f6 --- /dev/null +++ b/vendor/go.uber.org/multierr/README.md @@ -0,0 +1,23 @@ +# multierr [![GoDoc][doc-img]][doc] [![Build Status][ci-img]][ci] [![Coverage Status][cov-img]][cov] + +`multierr` allows combining one or more Go `error`s together. + +## Installation + + go get -u go.uber.org/multierr + +## Status + +Stable: No breaking changes will be made before 2.0. + +------------------------------------------------------------------------------- + +Released under the [MIT License]. + +[MIT License]: LICENSE.txt +[doc-img]: https://godoc.org/go.uber.org/multierr?status.svg +[doc]: https://godoc.org/go.uber.org/multierr +[ci-img]: https://travis-ci.org/uber-go/multierr.svg?branch=master +[cov-img]: https://codecov.io/gh/uber-go/multierr/branch/master/graph/badge.svg +[ci]: https://travis-ci.org/uber-go/multierr +[cov]: https://codecov.io/gh/uber-go/multierr diff --git a/vendor/go.uber.org/multierr/error.go b/vendor/go.uber.org/multierr/error.go new file mode 100644 index 00000000..de6ce473 --- /dev/null +++ b/vendor/go.uber.org/multierr/error.go @@ -0,0 +1,401 @@ +// Copyright (c) 2017 Uber Technologies, 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. + +// Package multierr allows combining one or more errors together. +// +// Overview +// +// Errors can be combined with the use of the Combine function. +// +// multierr.Combine( +// reader.Close(), +// writer.Close(), +// conn.Close(), +// ) +// +// If only two errors are being combined, the Append function may be used +// instead. +// +// err = multierr.Combine(reader.Close(), writer.Close()) +// +// This makes it possible to record resource cleanup failures from deferred +// blocks with the help of named return values. +// +// func sendRequest(req Request) (err error) { +// conn, err := openConnection() +// if err != nil { +// return err +// } +// defer func() { +// err = multierr.Append(err, conn.Close()) +// }() +// // ... +// } +// +// The underlying list of errors for a returned error object may be retrieved +// with the Errors function. +// +// errors := multierr.Errors(err) +// if len(errors) > 0 { +// fmt.Println("The following errors occurred:") +// } +// +// Advanced Usage +// +// Errors returned by Combine and Append MAY implement the following +// interface. +// +// type errorGroup interface { +// // Returns a slice containing the underlying list of errors. +// // +// // This slice MUST NOT be modified by the caller. +// Errors() []error +// } +// +// Note that if you need access to list of errors behind a multierr error, you +// should prefer using the Errors function. That said, if you need cheap +// read-only access to the underlying errors slice, you can attempt to cast +// the error to this interface. You MUST handle the failure case gracefully +// because errors returned by Combine and Append are not guaranteed to +// implement this interface. +// +// var errors []error +// group, ok := err.(errorGroup) +// if ok { +// errors = group.Errors() +// } else { +// errors = []error{err} +// } +package multierr // import "go.uber.org/multierr" + +import ( + "bytes" + "fmt" + "io" + "strings" + "sync" + + "go.uber.org/atomic" +) + +var ( + // Separator for single-line error messages. + _singlelineSeparator = []byte("; ") + + _newline = []byte("\n") + + // Prefix for multi-line messages + _multilinePrefix = []byte("the following errors occurred:") + + // Prefix for the first and following lines of an item in a list of + // multi-line error messages. + // + // For example, if a single item is: + // + // foo + // bar + // + // It will become, + // + // - foo + // bar + _multilineSeparator = []byte("\n - ") + _multilineIndent = []byte(" ") +) + +// _bufferPool is a pool of bytes.Buffers. +var _bufferPool = sync.Pool{ + New: func() interface{} { + return &bytes.Buffer{} + }, +} + +type errorGroup interface { + Errors() []error +} + +// Errors returns a slice containing zero or more errors that the supplied +// error is composed of. If the error is nil, the returned slice is empty. +// +// err := multierr.Append(r.Close(), w.Close()) +// errors := multierr.Errors(err) +// +// If the error is not composed of other errors, the returned slice contains +// just the error that was passed in. +// +// Callers of this function are free to modify the returned slice. +func Errors(err error) []error { + if err == nil { + return nil + } + + // Note that we're casting to multiError, not errorGroup. Our contract is + // that returned errors MAY implement errorGroup. Errors, however, only + // has special behavior for multierr-specific error objects. + // + // This behavior can be expanded in the future but I think it's prudent to + // start with as little as possible in terms of contract and possibility + // of misuse. + eg, ok := err.(*multiError) + if !ok { + return []error{err} + } + + errors := eg.Errors() + result := make([]error, len(errors)) + copy(result, errors) + return result +} + +// multiError is an error that holds one or more errors. +// +// An instance of this is guaranteed to be non-empty and flattened. That is, +// none of the errors inside multiError are other multiErrors. +// +// multiError formats to a semi-colon delimited list of error messages with +// %v and with a more readable multi-line format with %+v. +type multiError struct { + copyNeeded atomic.Bool + errors []error +} + +var _ errorGroup = (*multiError)(nil) + +// Errors returns the list of underlying errors. +// +// This slice MUST NOT be modified. +func (merr *multiError) Errors() []error { + if merr == nil { + return nil + } + return merr.errors +} + +func (merr *multiError) Error() string { + if merr == nil { + return "" + } + + buff := _bufferPool.Get().(*bytes.Buffer) + buff.Reset() + + merr.writeSingleline(buff) + + result := buff.String() + _bufferPool.Put(buff) + return result +} + +func (merr *multiError) Format(f fmt.State, c rune) { + if c == 'v' && f.Flag('+') { + merr.writeMultiline(f) + } else { + merr.writeSingleline(f) + } +} + +func (merr *multiError) writeSingleline(w io.Writer) { + first := true + for _, item := range merr.errors { + if first { + first = false + } else { + w.Write(_singlelineSeparator) + } + io.WriteString(w, item.Error()) + } +} + +func (merr *multiError) writeMultiline(w io.Writer) { + w.Write(_multilinePrefix) + for _, item := range merr.errors { + w.Write(_multilineSeparator) + writePrefixLine(w, _multilineIndent, fmt.Sprintf("%+v", item)) + } +} + +// Writes s to the writer with the given prefix added before each line after +// the first. +func writePrefixLine(w io.Writer, prefix []byte, s string) { + first := true + for len(s) > 0 { + if first { + first = false + } else { + w.Write(prefix) + } + + idx := strings.IndexByte(s, '\n') + if idx < 0 { + idx = len(s) - 1 + } + + io.WriteString(w, s[:idx+1]) + s = s[idx+1:] + } +} + +type inspectResult struct { + // Number of top-level non-nil errors + Count int + + // Total number of errors including multiErrors + Capacity int + + // Index of the first non-nil error in the list. Value is meaningless if + // Count is zero. + FirstErrorIdx int + + // Whether the list contains at least one multiError + ContainsMultiError bool +} + +// Inspects the given slice of errors so that we can efficiently allocate +// space for it. +func inspect(errors []error) (res inspectResult) { + first := true + for i, err := range errors { + if err == nil { + continue + } + + res.Count++ + if first { + first = false + res.FirstErrorIdx = i + } + + if merr, ok := err.(*multiError); ok { + res.Capacity += len(merr.errors) + res.ContainsMultiError = true + } else { + res.Capacity++ + } + } + return +} + +// fromSlice converts the given list of errors into a single error. +func fromSlice(errors []error) error { + res := inspect(errors) + switch res.Count { + case 0: + return nil + case 1: + // only one non-nil entry + return errors[res.FirstErrorIdx] + case len(errors): + if !res.ContainsMultiError { + // already flat + return &multiError{errors: errors} + } + } + + nonNilErrs := make([]error, 0, res.Capacity) + for _, err := range errors[res.FirstErrorIdx:] { + if err == nil { + continue + } + + if nested, ok := err.(*multiError); ok { + nonNilErrs = append(nonNilErrs, nested.errors...) + } else { + nonNilErrs = append(nonNilErrs, err) + } + } + + return &multiError{errors: nonNilErrs} +} + +// Combine combines the passed errors into a single error. +// +// If zero arguments were passed or if all items are nil, a nil error is +// returned. +// +// Combine(nil, nil) // == nil +// +// If only a single error was passed, it is returned as-is. +// +// Combine(err) // == err +// +// Combine skips over nil arguments so this function may be used to combine +// together errors from operations that fail independently of each other. +// +// multierr.Combine( +// reader.Close(), +// writer.Close(), +// pipe.Close(), +// ) +// +// If any of the passed errors is a multierr error, it will be flattened along +// with the other errors. +// +// multierr.Combine(multierr.Combine(err1, err2), err3) +// // is the same as +// multierr.Combine(err1, err2, err3) +// +// The returned error formats into a readable multi-line error message if +// formatted with %+v. +// +// fmt.Sprintf("%+v", multierr.Combine(err1, err2)) +func Combine(errors ...error) error { + return fromSlice(errors) +} + +// Append appends the given errors together. Either value may be nil. +// +// This function is a specialization of Combine for the common case where +// there are only two errors. +// +// err = multierr.Append(reader.Close(), writer.Close()) +// +// The following pattern may also be used to record failure of deferred +// operations without losing information about the original error. +// +// func doSomething(..) (err error) { +// f := acquireResource() +// defer func() { +// err = multierr.Append(err, f.Close()) +// }() +func Append(left error, right error) error { + switch { + case left == nil: + return right + case right == nil: + return left + } + + if _, ok := right.(*multiError); !ok { + if l, ok := left.(*multiError); ok && !l.copyNeeded.Swap(true) { + // Common case where the error on the left is constantly being + // appended to. + errs := append(l.errors, right) + return &multiError{errors: errs} + } else if !ok { + // Both errors are single errors. + return &multiError{errors: []error{left, right}} + } + } + + // Either right or both, left and right, are multiErrors. Rely on usual + // expensive logic. + errors := [2]error{left, right} + return fromSlice(errors[0:]) +} diff --git a/vendor/go.uber.org/multierr/glide.lock b/vendor/go.uber.org/multierr/glide.lock new file mode 100644 index 00000000..f9ea94c3 --- /dev/null +++ b/vendor/go.uber.org/multierr/glide.lock @@ -0,0 +1,19 @@ +hash: b53b5e9a84b9cb3cc4b2d0499e23da2feca1eec318ce9bb717ecf35bf24bf221 +updated: 2017-04-10T13:34:45.671678062-07:00 +imports: +- name: go.uber.org/atomic + version: 3b8db5e93c4c02efbc313e17b2e796b0914a01fb +testImports: +- name: github.com/davecgh/go-spew + version: 6d212800a42e8ab5c146b8ace3490ee17e5225f9 + subpackages: + - spew +- name: github.com/pmezard/go-difflib + version: d8ed2627bdf02c080bf22230dbb337003b7aba2d + subpackages: + - difflib +- name: github.com/stretchr/testify + version: 69483b4bd14f5845b5a1e55bca19e954e827f1d0 + subpackages: + - assert + - require diff --git a/vendor/go.uber.org/multierr/glide.yaml b/vendor/go.uber.org/multierr/glide.yaml new file mode 100644 index 00000000..6ef084ec --- /dev/null +++ b/vendor/go.uber.org/multierr/glide.yaml @@ -0,0 +1,8 @@ +package: go.uber.org/multierr +import: +- package: go.uber.org/atomic + version: ^1 +testImport: +- package: github.com/stretchr/testify + subpackages: + - assert diff --git a/vendor/golang.org/x/crypto/internal/chacha20/asm_ppc64le.s b/vendor/golang.org/x/crypto/internal/chacha20/asm_ppc64le.s new file mode 100644 index 00000000..cde3fc98 --- /dev/null +++ b/vendor/golang.org/x/crypto/internal/chacha20/asm_ppc64le.s @@ -0,0 +1,668 @@ +// Copyright 2019 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. + +// Based on CRYPTOGAMS code with the following comment: +// # ==================================================================== +// # Written by Andy Polyakov for the OpenSSL +// # project. The module is, however, dual licensed under OpenSSL and +// # CRYPTOGAMS licenses depending on where you obtain it. For further +// # details see http://www.openssl.org/~appro/cryptogams/. +// # ==================================================================== + +// Original code can be found at the link below: +// https://github.com/dot-asm/cryptogams/commit/a60f5b50ed908e91e5c39ca79126a4a876d5d8ff + +// There are some differences between CRYPTOGAMS code and this one. The round +// loop for "_int" isn't the same as the original. Some adjustments were +// necessary because there are less vector registers available. For example, some +// X variables (r12, r13, r14, and r15) share the same register used by the +// counter. The original code uses ctr to name the counter. Here we use CNT +// because golang uses CTR as the counter register name. + +// +build ppc64le,!gccgo,!appengine + +#include "textflag.h" + +#define OUT R3 +#define INP R4 +#define LEN R5 +#define KEY R6 +#define CNT R7 + +#define TEMP R8 + +#define X0 R11 +#define X1 R12 +#define X2 R14 +#define X3 R15 +#define X4 R16 +#define X5 R17 +#define X6 R18 +#define X7 R19 +#define X8 R20 +#define X9 R21 +#define X10 R22 +#define X11 R23 +#define X12 R24 +#define X13 R25 +#define X14 R26 +#define X15 R27 + +#define CON0 X0 +#define CON1 X1 +#define CON2 X2 +#define CON3 X3 + +#define KEY0 X4 +#define KEY1 X5 +#define KEY2 X6 +#define KEY3 X7 +#define KEY4 X8 +#define KEY5 X9 +#define KEY6 X10 +#define KEY7 X11 + +#define CNT0 X12 +#define CNT1 X13 +#define CNT2 X14 +#define CNT3 X15 + +#define TMP0 R9 +#define TMP1 R10 +#define TMP2 R28 +#define TMP3 R29 + +#define CONSTS R8 + +#define A0 V0 +#define B0 V1 +#define C0 V2 +#define D0 V3 +#define A1 V4 +#define B1 V5 +#define C1 V6 +#define D1 V7 +#define A2 V8 +#define B2 V9 +#define C2 V10 +#define D2 V11 +#define T0 V12 +#define T1 V13 +#define T2 V14 + +#define K0 V15 +#define K1 V16 +#define K2 V17 +#define K3 V18 +#define K4 V19 +#define K5 V20 + +#define FOUR V21 +#define SIXTEEN V22 +#define TWENTY4 V23 +#define TWENTY V24 +#define TWELVE V25 +#define TWENTY5 V26 +#define SEVEN V27 + +#define INPPERM V28 +#define OUTPERM V29 +#define OUTMASK V30 + +#define DD0 V31 +#define DD1 SEVEN +#define DD2 T0 +#define DD3 T1 +#define DD4 T2 + +DATA ·consts+0x00(SB)/8, $0x3320646e61707865 +DATA ·consts+0x08(SB)/8, $0x6b20657479622d32 +DATA ·consts+0x10(SB)/8, $0x0000000000000001 +DATA ·consts+0x18(SB)/8, $0x0000000000000000 +DATA ·consts+0x20(SB)/8, $0x0000000000000004 +DATA ·consts+0x28(SB)/8, $0x0000000000000000 +DATA ·consts+0x30(SB)/8, $0x0a0b08090e0f0c0d +DATA ·consts+0x38(SB)/8, $0x0203000106070405 +DATA ·consts+0x40(SB)/8, $0x090a0b080d0e0f0c +DATA ·consts+0x48(SB)/8, $0x0102030005060704 +GLOBL ·consts(SB), RODATA, $80 + +//func chaCha20_ctr32_vmx(out, inp *byte, len int, key *[32]byte, counter *[16]byte) +TEXT ·chaCha20_ctr32_vmx(SB),NOSPLIT|NOFRAME,$0 + // Load the arguments inside the registers + MOVD out+0(FP), OUT + MOVD inp+8(FP), INP + MOVD len+16(FP), LEN + MOVD key+24(FP), KEY + MOVD counter+32(FP), CNT + + MOVD $·consts(SB), CONSTS // point to consts addr + + MOVD $16, X0 + MOVD $32, X1 + MOVD $48, X2 + MOVD $64, X3 + MOVD $31, X4 + MOVD $15, X5 + + // Load key + LVX (KEY)(R0), K1 + LVSR (KEY)(R0), T0 + LVX (KEY)(X0), K2 + LVX (KEY)(X4), DD0 + + // Load counter + LVX (CNT)(R0), K3 + LVSR (CNT)(R0), T1 + LVX (CNT)(X5), DD1 + + // Load constants + LVX (CONSTS)(R0), K0 + LVX (CONSTS)(X0), K5 + LVX (CONSTS)(X1), FOUR + LVX (CONSTS)(X2), SIXTEEN + LVX (CONSTS)(X3), TWENTY4 + + // Align key and counter + VPERM K2, K1, T0, K1 + VPERM DD0, K2, T0, K2 + VPERM DD1, K3, T1, K3 + + // Load counter to GPR + MOVWZ 0(CNT), CNT0 + MOVWZ 4(CNT), CNT1 + MOVWZ 8(CNT), CNT2 + MOVWZ 12(CNT), CNT3 + + // Adjust vectors for the initial state + VADDUWM K3, K5, K3 + VADDUWM K3, K5, K4 + VADDUWM K4, K5, K5 + + // Synthesized constants + VSPLTISW $-12, TWENTY + VSPLTISW $12, TWELVE + VSPLTISW $-7, TWENTY5 + + VXOR T0, T0, T0 + VSPLTISW $-1, OUTMASK + LVSR (INP)(R0), INPPERM + LVSL (OUT)(R0), OUTPERM + VPERM OUTMASK, T0, OUTPERM, OUTMASK + +loop_outer_vmx: + // Load constant + MOVD $0x61707865, CON0 + MOVD $0x3320646e, CON1 + MOVD $0x79622d32, CON2 + MOVD $0x6b206574, CON3 + + VOR K0, K0, A0 + VOR K0, K0, A1 + VOR K0, K0, A2 + VOR K1, K1, B0 + + MOVD $10, TEMP + + // Load key to GPR + MOVWZ 0(KEY), X4 + MOVWZ 4(KEY), X5 + MOVWZ 8(KEY), X6 + MOVWZ 12(KEY), X7 + VOR K1, K1, B1 + VOR K1, K1, B2 + MOVWZ 16(KEY), X8 + MOVWZ 0(CNT), X12 + MOVWZ 20(KEY), X9 + MOVWZ 4(CNT), X13 + VOR K2, K2, C0 + VOR K2, K2, C1 + MOVWZ 24(KEY), X10 + MOVWZ 8(CNT), X14 + VOR K2, K2, C2 + VOR K3, K3, D0 + MOVWZ 28(KEY), X11 + MOVWZ 12(CNT), X15 + VOR K4, K4, D1 + VOR K5, K5, D2 + + MOVD X4, TMP0 + MOVD X5, TMP1 + MOVD X6, TMP2 + MOVD X7, TMP3 + VSPLTISW $7, SEVEN + + MOVD TEMP, CTR + +loop_vmx: + // CRYPTOGAMS uses a macro to create a loop using perl. This isn't possible + // using assembly macros. Therefore, the macro expansion result was used + // in order to maintain the algorithm efficiency. + // This loop generates three keystream blocks using VMX instructions and, + // in parallel, one keystream block using scalar instructions. + ADD X4, X0, X0 + ADD X5, X1, X1 + VADDUWM A0, B0, A0 + VADDUWM A1, B1, A1 + ADD X6, X2, X2 + ADD X7, X3, X3 + VADDUWM A2, B2, A2 + VXOR D0, A0, D0 + XOR X0, X12, X12 + XOR X1, X13, X13 + VXOR D1, A1, D1 + VXOR D2, A2, D2 + XOR X2, X14, X14 + XOR X3, X15, X15 + VPERM D0, D0, SIXTEEN, D0 + VPERM D1, D1, SIXTEEN, D1 + ROTLW $16, X12, X12 + ROTLW $16, X13, X13 + VPERM D2, D2, SIXTEEN, D2 + VADDUWM C0, D0, C0 + ROTLW $16, X14, X14 + ROTLW $16, X15, X15 + VADDUWM C1, D1, C1 + VADDUWM C2, D2, C2 + ADD X12, X8, X8 + ADD X13, X9, X9 + VXOR B0, C0, T0 + VXOR B1, C1, T1 + ADD X14, X10, X10 + ADD X15, X11, X11 + VXOR B2, C2, T2 + VRLW T0, TWELVE, B0 + XOR X8, X4, X4 + XOR X9, X5, X5 + VRLW T1, TWELVE, B1 + VRLW T2, TWELVE, B2 + XOR X10, X6, X6 + XOR X11, X7, X7 + VADDUWM A0, B0, A0 + VADDUWM A1, B1, A1 + ROTLW $12, X4, X4 + ROTLW $12, X5, X5 + VADDUWM A2, B2, A2 + VXOR D0, A0, D0 + ROTLW $12, X6, X6 + ROTLW $12, X7, X7 + VXOR D1, A1, D1 + VXOR D2, A2, D2 + ADD X4, X0, X0 + ADD X5, X1, X1 + VPERM D0, D0, TWENTY4, D0 + VPERM D1, D1, TWENTY4, D1 + ADD X6, X2, X2 + ADD X7, X3, X3 + VPERM D2, D2, TWENTY4, D2 + VADDUWM C0, D0, C0 + XOR X0, X12, X12 + XOR X1, X13, X13 + VADDUWM C1, D1, C1 + VADDUWM C2, D2, C2 + XOR X2, X14, X14 + XOR X3, X15, X15 + VXOR B0, C0, T0 + VXOR B1, C1, T1 + ROTLW $8, X12, X12 + ROTLW $8, X13, X13 + VXOR B2, C2, T2 + VRLW T0, SEVEN, B0 + ROTLW $8, X14, X14 + ROTLW $8, X15, X15 + VRLW T1, SEVEN, B1 + VRLW T2, SEVEN, B2 + ADD X12, X8, X8 + ADD X13, X9, X9 + VSLDOI $8, C0, C0, C0 + VSLDOI $8, C1, C1, C1 + ADD X14, X10, X10 + ADD X15, X11, X11 + VSLDOI $8, C2, C2, C2 + VSLDOI $12, B0, B0, B0 + XOR X8, X4, X4 + XOR X9, X5, X5 + VSLDOI $12, B1, B1, B1 + VSLDOI $12, B2, B2, B2 + XOR X10, X6, X6 + XOR X11, X7, X7 + VSLDOI $4, D0, D0, D0 + VSLDOI $4, D1, D1, D1 + ROTLW $7, X4, X4 + ROTLW $7, X5, X5 + VSLDOI $4, D2, D2, D2 + VADDUWM A0, B0, A0 + ROTLW $7, X6, X6 + ROTLW $7, X7, X7 + VADDUWM A1, B1, A1 + VADDUWM A2, B2, A2 + ADD X5, X0, X0 + ADD X6, X1, X1 + VXOR D0, A0, D0 + VXOR D1, A1, D1 + ADD X7, X2, X2 + ADD X4, X3, X3 + VXOR D2, A2, D2 + VPERM D0, D0, SIXTEEN, D0 + XOR X0, X15, X15 + XOR X1, X12, X12 + VPERM D1, D1, SIXTEEN, D1 + VPERM D2, D2, SIXTEEN, D2 + XOR X2, X13, X13 + XOR X3, X14, X14 + VADDUWM C0, D0, C0 + VADDUWM C1, D1, C1 + ROTLW $16, X15, X15 + ROTLW $16, X12, X12 + VADDUWM C2, D2, C2 + VXOR B0, C0, T0 + ROTLW $16, X13, X13 + ROTLW $16, X14, X14 + VXOR B1, C1, T1 + VXOR B2, C2, T2 + ADD X15, X10, X10 + ADD X12, X11, X11 + VRLW T0, TWELVE, B0 + VRLW T1, TWELVE, B1 + ADD X13, X8, X8 + ADD X14, X9, X9 + VRLW T2, TWELVE, B2 + VADDUWM A0, B0, A0 + XOR X10, X5, X5 + XOR X11, X6, X6 + VADDUWM A1, B1, A1 + VADDUWM A2, B2, A2 + XOR X8, X7, X7 + XOR X9, X4, X4 + VXOR D0, A0, D0 + VXOR D1, A1, D1 + ROTLW $12, X5, X5 + ROTLW $12, X6, X6 + VXOR D2, A2, D2 + VPERM D0, D0, TWENTY4, D0 + ROTLW $12, X7, X7 + ROTLW $12, X4, X4 + VPERM D1, D1, TWENTY4, D1 + VPERM D2, D2, TWENTY4, D2 + ADD X5, X0, X0 + ADD X6, X1, X1 + VADDUWM C0, D0, C0 + VADDUWM C1, D1, C1 + ADD X7, X2, X2 + ADD X4, X3, X3 + VADDUWM C2, D2, C2 + VXOR B0, C0, T0 + XOR X0, X15, X15 + XOR X1, X12, X12 + VXOR B1, C1, T1 + VXOR B2, C2, T2 + XOR X2, X13, X13 + XOR X3, X14, X14 + VRLW T0, SEVEN, B0 + VRLW T1, SEVEN, B1 + ROTLW $8, X15, X15 + ROTLW $8, X12, X12 + VRLW T2, SEVEN, B2 + VSLDOI $8, C0, C0, C0 + ROTLW $8, X13, X13 + ROTLW $8, X14, X14 + VSLDOI $8, C1, C1, C1 + VSLDOI $8, C2, C2, C2 + ADD X15, X10, X10 + ADD X12, X11, X11 + VSLDOI $4, B0, B0, B0 + VSLDOI $4, B1, B1, B1 + ADD X13, X8, X8 + ADD X14, X9, X9 + VSLDOI $4, B2, B2, B2 + VSLDOI $12, D0, D0, D0 + XOR X10, X5, X5 + XOR X11, X6, X6 + VSLDOI $12, D1, D1, D1 + VSLDOI $12, D2, D2, D2 + XOR X8, X7, X7 + XOR X9, X4, X4 + ROTLW $7, X5, X5 + ROTLW $7, X6, X6 + ROTLW $7, X7, X7 + ROTLW $7, X4, X4 + BC 0x10, 0, loop_vmx + + SUB $256, LEN, LEN + + // Accumulate key block + ADD $0x61707865, X0, X0 + ADD $0x3320646e, X1, X1 + ADD $0x79622d32, X2, X2 + ADD $0x6b206574, X3, X3 + ADD TMP0, X4, X4 + ADD TMP1, X5, X5 + ADD TMP2, X6, X6 + ADD TMP3, X7, X7 + MOVWZ 16(KEY), TMP0 + MOVWZ 20(KEY), TMP1 + MOVWZ 24(KEY), TMP2 + MOVWZ 28(KEY), TMP3 + ADD TMP0, X8, X8 + ADD TMP1, X9, X9 + ADD TMP2, X10, X10 + ADD TMP3, X11, X11 + + MOVWZ 12(CNT), TMP0 + MOVWZ 8(CNT), TMP1 + MOVWZ 4(CNT), TMP2 + MOVWZ 0(CNT), TEMP + ADD TMP0, X15, X15 + ADD TMP1, X14, X14 + ADD TMP2, X13, X13 + ADD TEMP, X12, X12 + + // Accumulate key block + VADDUWM A0, K0, A0 + VADDUWM A1, K0, A1 + VADDUWM A2, K0, A2 + VADDUWM B0, K1, B0 + VADDUWM B1, K1, B1 + VADDUWM B2, K1, B2 + VADDUWM C0, K2, C0 + VADDUWM C1, K2, C1 + VADDUWM C2, K2, C2 + VADDUWM D0, K3, D0 + VADDUWM D1, K4, D1 + VADDUWM D2, K5, D2 + + // Increment counter + ADD $4, TEMP, TEMP + MOVW TEMP, 0(CNT) + + VADDUWM K3, FOUR, K3 + VADDUWM K4, FOUR, K4 + VADDUWM K5, FOUR, K5 + + // XOR the input slice (INP) with the keystream, which is stored in GPRs (X0-X3). + + // Load input (aligned or not) + MOVWZ 0(INP), TMP0 + MOVWZ 4(INP), TMP1 + MOVWZ 8(INP), TMP2 + MOVWZ 12(INP), TMP3 + + // XOR with input + XOR TMP0, X0, X0 + XOR TMP1, X1, X1 + XOR TMP2, X2, X2 + XOR TMP3, X3, X3 + MOVWZ 16(INP), TMP0 + MOVWZ 20(INP), TMP1 + MOVWZ 24(INP), TMP2 + MOVWZ 28(INP), TMP3 + XOR TMP0, X4, X4 + XOR TMP1, X5, X5 + XOR TMP2, X6, X6 + XOR TMP3, X7, X7 + MOVWZ 32(INP), TMP0 + MOVWZ 36(INP), TMP1 + MOVWZ 40(INP), TMP2 + MOVWZ 44(INP), TMP3 + XOR TMP0, X8, X8 + XOR TMP1, X9, X9 + XOR TMP2, X10, X10 + XOR TMP3, X11, X11 + MOVWZ 48(INP), TMP0 + MOVWZ 52(INP), TMP1 + MOVWZ 56(INP), TMP2 + MOVWZ 60(INP), TMP3 + XOR TMP0, X12, X12 + XOR TMP1, X13, X13 + XOR TMP2, X14, X14 + XOR TMP3, X15, X15 + + // Store output (aligned or not) + MOVW X0, 0(OUT) + MOVW X1, 4(OUT) + MOVW X2, 8(OUT) + MOVW X3, 12(OUT) + + ADD $64, INP, INP // INP points to the end of the slice for the alignment code below + + MOVW X4, 16(OUT) + MOVD $16, TMP0 + MOVW X5, 20(OUT) + MOVD $32, TMP1 + MOVW X6, 24(OUT) + MOVD $48, TMP2 + MOVW X7, 28(OUT) + MOVD $64, TMP3 + MOVW X8, 32(OUT) + MOVW X9, 36(OUT) + MOVW X10, 40(OUT) + MOVW X11, 44(OUT) + MOVW X12, 48(OUT) + MOVW X13, 52(OUT) + MOVW X14, 56(OUT) + MOVW X15, 60(OUT) + ADD $64, OUT, OUT + + // Load input + LVX (INP)(R0), DD0 + LVX (INP)(TMP0), DD1 + LVX (INP)(TMP1), DD2 + LVX (INP)(TMP2), DD3 + LVX (INP)(TMP3), DD4 + ADD $64, INP, INP + + VPERM DD1, DD0, INPPERM, DD0 // Align input + VPERM DD2, DD1, INPPERM, DD1 + VPERM DD3, DD2, INPPERM, DD2 + VPERM DD4, DD3, INPPERM, DD3 + VXOR A0, DD0, A0 // XOR with input + VXOR B0, DD1, B0 + LVX (INP)(TMP0), DD1 // Keep loading input + VXOR C0, DD2, C0 + LVX (INP)(TMP1), DD2 + VXOR D0, DD3, D0 + LVX (INP)(TMP2), DD3 + LVX (INP)(TMP3), DD0 + ADD $64, INP, INP + MOVD $63, TMP3 // 63 is not a typo + VPERM A0, A0, OUTPERM, A0 + VPERM B0, B0, OUTPERM, B0 + VPERM C0, C0, OUTPERM, C0 + VPERM D0, D0, OUTPERM, D0 + + VPERM DD1, DD4, INPPERM, DD4 // Align input + VPERM DD2, DD1, INPPERM, DD1 + VPERM DD3, DD2, INPPERM, DD2 + VPERM DD0, DD3, INPPERM, DD3 + VXOR A1, DD4, A1 + VXOR B1, DD1, B1 + LVX (INP)(TMP0), DD1 // Keep loading + VXOR C1, DD2, C1 + LVX (INP)(TMP1), DD2 + VXOR D1, DD3, D1 + LVX (INP)(TMP2), DD3 + + // Note that the LVX address is always rounded down to the nearest 16-byte + // boundary, and that it always points to at most 15 bytes beyond the end of + // the slice, so we cannot cross a page boundary. + LVX (INP)(TMP3), DD4 // Redundant in aligned case. + ADD $64, INP, INP + VPERM A1, A1, OUTPERM, A1 // Pre-misalign output + VPERM B1, B1, OUTPERM, B1 + VPERM C1, C1, OUTPERM, C1 + VPERM D1, D1, OUTPERM, D1 + + VPERM DD1, DD0, INPPERM, DD0 // Align Input + VPERM DD2, DD1, INPPERM, DD1 + VPERM DD3, DD2, INPPERM, DD2 + VPERM DD4, DD3, INPPERM, DD3 + VXOR A2, DD0, A2 + VXOR B2, DD1, B2 + VXOR C2, DD2, C2 + VXOR D2, DD3, D2 + VPERM A2, A2, OUTPERM, A2 + VPERM B2, B2, OUTPERM, B2 + VPERM C2, C2, OUTPERM, C2 + VPERM D2, D2, OUTPERM, D2 + + ANDCC $15, OUT, X1 // Is out aligned? + MOVD OUT, X0 + + VSEL A0, B0, OUTMASK, DD0 // Collect pre-misaligned output + VSEL B0, C0, OUTMASK, DD1 + VSEL C0, D0, OUTMASK, DD2 + VSEL D0, A1, OUTMASK, DD3 + VSEL A1, B1, OUTMASK, B0 + VSEL B1, C1, OUTMASK, C0 + VSEL C1, D1, OUTMASK, D0 + VSEL D1, A2, OUTMASK, A1 + VSEL A2, B2, OUTMASK, B1 + VSEL B2, C2, OUTMASK, C1 + VSEL C2, D2, OUTMASK, D1 + + STVX DD0, (OUT+TMP0) + STVX DD1, (OUT+TMP1) + STVX DD2, (OUT+TMP2) + ADD $64, OUT, OUT + STVX DD3, (OUT+R0) + STVX B0, (OUT+TMP0) + STVX C0, (OUT+TMP1) + STVX D0, (OUT+TMP2) + ADD $64, OUT, OUT + STVX A1, (OUT+R0) + STVX B1, (OUT+TMP0) + STVX C1, (OUT+TMP1) + STVX D1, (OUT+TMP2) + ADD $64, OUT, OUT + + BEQ aligned_vmx + + SUB X1, OUT, X2 // in misaligned case edges + MOVD $0, X3 // are written byte-by-byte + +unaligned_tail_vmx: + STVEBX D2, (X2+X3) + ADD $1, X3, X3 + CMPW X3, X1 + BNE unaligned_tail_vmx + SUB X1, X0, X2 + +unaligned_head_vmx: + STVEBX A0, (X2+X1) + CMPW X1, $15 + ADD $1, X1, X1 + BNE unaligned_head_vmx + + CMPU LEN, $255 // done with 256-byte block yet? + BGT loop_outer_vmx + + JMP done_vmx + +aligned_vmx: + STVX A0, (X0+R0) + CMPU LEN, $255 // done with 256-byte block yet? + BGT loop_outer_vmx + +done_vmx: + RET diff --git a/vendor/golang.org/x/crypto/internal/chacha20/chacha_noasm.go b/vendor/golang.org/x/crypto/internal/chacha20/chacha_noasm.go index 47eac031..bf8beba6 100644 --- a/vendor/golang.org/x/crypto/internal/chacha20/chacha_noasm.go +++ b/vendor/golang.org/x/crypto/internal/chacha20/chacha_noasm.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build !arm64,!s390x arm64,!go1.11 gccgo appengine +// +build !ppc64le,!arm64,!s390x arm64,!go1.11 gccgo appengine package chacha20 diff --git a/vendor/golang.org/x/crypto/internal/chacha20/chacha_ppc64le.go b/vendor/golang.org/x/crypto/internal/chacha20/chacha_ppc64le.go new file mode 100644 index 00000000..638cb5e5 --- /dev/null +++ b/vendor/golang.org/x/crypto/internal/chacha20/chacha_ppc64le.go @@ -0,0 +1,52 @@ +// Copyright 2019 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 ppc64le,!gccgo,!appengine + +package chacha20 + +import "encoding/binary" + +const ( + bufSize = 256 + haveAsm = true +) + +//go:noescape +func chaCha20_ctr32_vmx(out, inp *byte, len int, key *[8]uint32, counter *uint32) + +func (c *Cipher) xorKeyStreamAsm(dst, src []byte) { + if len(src) >= bufSize { + chaCha20_ctr32_vmx(&dst[0], &src[0], len(src)-len(src)%bufSize, &c.key, &c.counter) + } + if len(src)%bufSize != 0 { + chaCha20_ctr32_vmx(&c.buf[0], &c.buf[0], bufSize, &c.key, &c.counter) + start := len(src) - len(src)%bufSize + ts, td, tb := src[start:], dst[start:], c.buf[:] + // Unroll loop to XOR 32 bytes per iteration. + for i := 0; i < len(ts)-32; i += 32 { + td, tb = td[:len(ts)], tb[:len(ts)] // bounds check elimination + s0 := binary.LittleEndian.Uint64(ts[0:8]) + s1 := binary.LittleEndian.Uint64(ts[8:16]) + s2 := binary.LittleEndian.Uint64(ts[16:24]) + s3 := binary.LittleEndian.Uint64(ts[24:32]) + b0 := binary.LittleEndian.Uint64(tb[0:8]) + b1 := binary.LittleEndian.Uint64(tb[8:16]) + b2 := binary.LittleEndian.Uint64(tb[16:24]) + b3 := binary.LittleEndian.Uint64(tb[24:32]) + binary.LittleEndian.PutUint64(td[0:8], s0^b0) + binary.LittleEndian.PutUint64(td[8:16], s1^b1) + binary.LittleEndian.PutUint64(td[16:24], s2^b2) + binary.LittleEndian.PutUint64(td[24:32], s3^b3) + ts, td, tb = ts[32:], td[32:], tb[32:] + } + td, tb = td[:len(ts)], tb[:len(ts)] // bounds check elimination + for i, v := range ts { + td[i] = tb[i] ^ v + } + c.len = bufSize - (len(src) % bufSize) + + } + +} diff --git a/vendor/golang.org/x/crypto/poly1305/mac_noasm.go b/vendor/golang.org/x/crypto/poly1305/mac_noasm.go index 8387d299..a8dd589a 100644 --- a/vendor/golang.org/x/crypto/poly1305/mac_noasm.go +++ b/vendor/golang.org/x/crypto/poly1305/mac_noasm.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build !amd64 gccgo appengine +// +build !amd64,!ppc64le gccgo appengine package poly1305 diff --git a/vendor/golang.org/x/crypto/poly1305/sum_noasm.go b/vendor/golang.org/x/crypto/poly1305/sum_noasm.go index fcdef46a..8a9c2070 100644 --- a/vendor/golang.org/x/crypto/poly1305/sum_noasm.go +++ b/vendor/golang.org/x/crypto/poly1305/sum_noasm.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build s390x,!go1.11 !arm,!amd64,!s390x gccgo appengine nacl +// +build s390x,!go1.11 !arm,!amd64,!s390x,!ppc64le gccgo appengine nacl package poly1305 diff --git a/vendor/golang.org/x/crypto/poly1305/sum_ppc64le.go b/vendor/golang.org/x/crypto/poly1305/sum_ppc64le.go new file mode 100644 index 00000000..2402b637 --- /dev/null +++ b/vendor/golang.org/x/crypto/poly1305/sum_ppc64le.go @@ -0,0 +1,68 @@ +// Copyright 2019 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 ppc64le,!gccgo,!appengine + +package poly1305 + +//go:noescape +func initialize(state *[7]uint64, key *[32]byte) + +//go:noescape +func update(state *[7]uint64, msg []byte) + +//go:noescape +func finalize(tag *[TagSize]byte, state *[7]uint64) + +// 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) { + h := newMAC(key) + h.Write(m) + h.Sum(out) +} + +func newMAC(key *[32]byte) (h mac) { + initialize(&h.state, key) + return +} + +type mac struct { + state [7]uint64 // := uint64{ h0, h1, h2, r0, r1, pad0, pad1 } + + buffer [TagSize]byte + offset int +} + +func (h *mac) Write(p []byte) (n int, err error) { + n = len(p) + if h.offset > 0 { + remaining := TagSize - h.offset + if n < remaining { + h.offset += copy(h.buffer[h.offset:], p) + return n, nil + } + copy(h.buffer[h.offset:], p[:remaining]) + p = p[remaining:] + h.offset = 0 + update(&h.state, h.buffer[:]) + } + if nn := len(p) - (len(p) % TagSize); nn > 0 { + update(&h.state, p[:nn]) + p = p[nn:] + } + if len(p) > 0 { + h.offset += copy(h.buffer[h.offset:], p) + } + return n, nil +} + +func (h *mac) Sum(out *[16]byte) { + state := h.state + if h.offset > 0 { + update(&state, h.buffer[:h.offset]) + } + finalize(out, &state) +} diff --git a/vendor/golang.org/x/crypto/poly1305/sum_ppc64le.s b/vendor/golang.org/x/crypto/poly1305/sum_ppc64le.s new file mode 100644 index 00000000..55c7167e --- /dev/null +++ b/vendor/golang.org/x/crypto/poly1305/sum_ppc64le.s @@ -0,0 +1,247 @@ +// Copyright 2019 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 ppc64le,!gccgo,!appengine + +#include "textflag.h" + +// This was ported from the amd64 implementation. + +#define POLY1305_ADD(msg, h0, h1, h2, t0, t1, t2) \ + MOVD (msg), t0; \ + MOVD 8(msg), t1; \ + MOVD $1, t2; \ + ADDC t0, h0, h0; \ + ADDE t1, h1, h1; \ + ADDE t2, h2; \ + ADD $16, msg + +#define POLY1305_MUL(h0, h1, h2, r0, r1, t0, t1, t2, t3, t4, t5) \ + MULLD r0, h0, t0; \ + MULLD r0, h1, t4; \ + MULHDU r0, h0, t1; \ + MULHDU r0, h1, t5; \ + ADDC t4, t1, t1; \ + MULLD r0, h2, t2; \ + ADDZE t5; \ + MULHDU r1, h0, t4; \ + MULLD r1, h0, h0; \ + ADD t5, t2, t2; \ + ADDC h0, t1, t1; \ + MULLD h2, r1, t3; \ + ADDZE t4, h0; \ + MULHDU r1, h1, t5; \ + MULLD r1, h1, t4; \ + ADDC t4, t2, t2; \ + ADDE t5, t3, t3; \ + ADDC h0, t2, t2; \ + MOVD $-4, t4; \ + MOVD t0, h0; \ + MOVD t1, h1; \ + ADDZE t3; \ + ANDCC $3, t2, h2; \ + AND t2, t4, t0; \ + ADDC t0, h0, h0; \ + ADDE t3, h1, h1; \ + SLD $62, t3, t4; \ + SRD $2, t2; \ + ADDZE h2; \ + OR t4, t2, t2; \ + SRD $2, t3; \ + ADDC t2, h0, h0; \ + ADDE t3, h1, h1; \ + ADDZE h2 + +DATA ·poly1305Mask<>+0x00(SB)/8, $0x0FFFFFFC0FFFFFFF +DATA ·poly1305Mask<>+0x08(SB)/8, $0x0FFFFFFC0FFFFFFC +GLOBL ·poly1305Mask<>(SB), RODATA, $16 + +// func update(state *[7]uint64, msg []byte) + +TEXT ·update(SB), $0-32 + MOVD state+0(FP), R3 + MOVD msg_base+8(FP), R4 + MOVD msg_len+16(FP), R5 + + MOVD 0(R3), R8 // h0 + MOVD 8(R3), R9 // h1 + MOVD 16(R3), R10 // h2 + MOVD 24(R3), R11 // r0 + MOVD 32(R3), R12 // r1 + + CMP R5, $16 + BLT bytes_between_0_and_15 + +loop: + POLY1305_ADD(R4, R8, R9, R10, R20, R21, R22) + +multiply: + POLY1305_MUL(R8, R9, R10, R11, R12, R16, R17, R18, R14, R20, R21) + ADD $-16, R5 + CMP R5, $16 + BGE loop + +bytes_between_0_and_15: + CMP $0, R5 + BEQ done + MOVD $0, R16 // h0 + MOVD $0, R17 // h1 + +flush_buffer: + CMP R5, $8 + BLE just1 + + MOVD $8, R21 + SUB R21, R5, R21 + + // Greater than 8 -- load the rightmost remaining bytes in msg + // and put into R17 (h1) + MOVD (R4)(R21), R17 + MOVD $16, R22 + + // Find the offset to those bytes + SUB R5, R22, R22 + SLD $3, R22 + + // Shift to get only the bytes in msg + SRD R22, R17, R17 + + // Put 1 at high end + MOVD $1, R23 + SLD $3, R21 + SLD R21, R23, R23 + OR R23, R17, R17 + + // Remainder is 8 + MOVD $8, R5 + +just1: + CMP R5, $8 + BLT less8 + + // Exactly 8 + MOVD (R4), R16 + + CMP $0, R17 + + // Check if we've already set R17; if not + // set 1 to indicate end of msg. + BNE carry + MOVD $1, R17 + BR carry + +less8: + MOVD $0, R16 // h0 + MOVD $0, R22 // shift count + CMP R5, $4 + BLT less4 + MOVWZ (R4), R16 + ADD $4, R4 + ADD $-4, R5 + MOVD $32, R22 + +less4: + CMP R5, $2 + BLT less2 + MOVHZ (R4), R21 + SLD R22, R21, R21 + OR R16, R21, R16 + ADD $16, R22 + ADD $-2, R5 + ADD $2, R4 + +less2: + CMP $0, R5 + BEQ insert1 + MOVBZ (R4), R21 + SLD R22, R21, R21 + OR R16, R21, R16 + ADD $8, R22 + +insert1: + // Insert 1 at end of msg + MOVD $1, R21 + SLD R22, R21, R21 + OR R16, R21, R16 + +carry: + // Add new values to h0, h1, h2 + ADDC R16, R8 + ADDE R17, R9 + ADDE $0, R10 + MOVD $16, R5 + ADD R5, R4 + BR multiply + +done: + // Save h0, h1, h2 in state + MOVD R8, 0(R3) + MOVD R9, 8(R3) + MOVD R10, 16(R3) + RET + +// func initialize(state *[7]uint64, key *[32]byte) +TEXT ·initialize(SB), $0-16 + MOVD state+0(FP), R3 + MOVD key+8(FP), R4 + + // state[0...7] is initialized with zero + // Load key + MOVD 0(R4), R5 + MOVD 8(R4), R6 + MOVD 16(R4), R7 + MOVD 24(R4), R8 + + // Address of key mask + MOVD $·poly1305Mask<>(SB), R9 + + // Save original key in state + MOVD R7, 40(R3) + MOVD R8, 48(R3) + + // Get mask + MOVD (R9), R7 + MOVD 8(R9), R8 + + // And with key + AND R5, R7, R5 + AND R6, R8, R6 + + // Save masked key in state + MOVD R5, 24(R3) + MOVD R6, 32(R3) + RET + +// func finalize(tag *[TagSize]byte, state *[7]uint64) +TEXT ·finalize(SB), $0-16 + MOVD tag+0(FP), R3 + MOVD state+8(FP), R4 + + // Get h0, h1, h2 from state + MOVD 0(R4), R5 + MOVD 8(R4), R6 + MOVD 16(R4), R7 + + // Save h0, h1 + MOVD R5, R8 + MOVD R6, R9 + MOVD $3, R20 + MOVD $-1, R21 + SUBC $-5, R5 + SUBE R21, R6 + SUBE R20, R7 + MOVD $0, R21 + SUBZE R21 + + // Check for carry + CMP $0, R21 + ISEL $2, R5, R8, R5 + ISEL $2, R6, R9, R6 + MOVD 40(R4), R8 + MOVD 48(R4), R9 + ADDC R8, R5 + ADDE R9, R6 + MOVD R5, 0(R3) + MOVD R6, 8(R3) + RET diff --git a/vendor/golang.org/x/crypto/sha3/shake.go b/vendor/golang.org/x/crypto/sha3/shake.go index a39e5d51..d7be2954 100644 --- a/vendor/golang.org/x/crypto/sha3/shake.go +++ b/vendor/golang.org/x/crypto/sha3/shake.go @@ -41,7 +41,7 @@ type ShakeHash interface { // cSHAKE specific context type cshakeState struct { - state // SHA-3 state context and Read/Write operations + *state // SHA-3 state context and Read/Write operations // initBlock is the cSHAKE specific initialization set of bytes. It is initialized // by newCShake function and stores concatenation of N followed by S, encoded @@ -82,7 +82,7 @@ func leftEncode(value uint64) []byte { } func newCShake(N, S []byte, rate int, dsbyte byte) ShakeHash { - c := cshakeState{state: state{rate: rate, dsbyte: dsbyte}} + c := cshakeState{state: &state{rate: rate, dsbyte: dsbyte}} // leftEncode returns max 9 bytes c.initBlock = make([]byte, 0, 9*2+len(N)+len(S)) @@ -104,7 +104,7 @@ func (c *cshakeState) Reset() { func (c *cshakeState) Clone() ShakeHash { b := make([]byte, len(c.initBlock)) copy(b, c.initBlock) - return &cshakeState{state: *c.clone(), initBlock: b} + return &cshakeState{state: c.clone(), initBlock: b} } // Clone returns copy of SHAKE context within its current state. diff --git a/vendor/golang.org/x/net/bpf/vm_instructions.go b/vendor/golang.org/x/net/bpf/vm_instructions.go index f0d2e55b..cf8947c3 100644 --- a/vendor/golang.org/x/net/bpf/vm_instructions.go +++ b/vendor/golang.org/x/net/bpf/vm_instructions.go @@ -129,7 +129,8 @@ func loadIndirect(ins LoadIndirect, in []byte, regX uint32) (uint32, bool) { func loadMemShift(ins LoadMemShift, in []byte) (uint32, bool) { offset := int(ins.Off) - if !inBounds(len(in), offset, 0) { + // Size of LoadMemShift is always 1 byte + if !inBounds(len(in), offset, 1) { return 0, false } diff --git a/vendor/golang.org/x/net/html/parse.go b/vendor/golang.org/x/net/html/parse.go index e0bfc1f3..992cff2a 100644 --- a/vendor/golang.org/x/net/html/parse.go +++ b/vendor/golang.org/x/net/html/parse.go @@ -2300,6 +2300,33 @@ func (p *parser) parse() error { // // The input is assumed to be UTF-8 encoded. func Parse(r io.Reader) (*Node, error) { + return ParseWithOptions(r) +} + +// ParseFragment parses a fragment of HTML and returns the nodes that were +// found. If the fragment is the InnerHTML for an existing element, pass that +// element in context. +// +// It has the same intricacies as Parse. +func ParseFragment(r io.Reader, context *Node) ([]*Node, error) { + return ParseFragmentWithOptions(r, context) +} + +// ParseOption configures a parser. +type ParseOption func(p *parser) + +// ParseOptionEnableScripting configures the scripting flag. +// https://html.spec.whatwg.org/multipage/webappapis.html#enabling-and-disabling-scripting +// +// By default, scripting is enabled. +func ParseOptionEnableScripting(enable bool) ParseOption { + return func(p *parser) { + p.scripting = enable + } +} + +// ParseWithOptions is like Parse, with options. +func ParseWithOptions(r io.Reader, opts ...ParseOption) (*Node, error) { p := &parser{ tokenizer: NewTokenizer(r), doc: &Node{ @@ -2309,6 +2336,11 @@ func Parse(r io.Reader) (*Node, error) { framesetOK: true, im: initialIM, } + + for _, f := range opts { + f(p) + } + err := p.parse() if err != nil { return nil, err @@ -2316,12 +2348,8 @@ func Parse(r io.Reader) (*Node, error) { return p.doc, nil } -// ParseFragment parses a fragment of HTML and returns the nodes that were -// found. If the fragment is the InnerHTML for an existing element, pass that -// element in context. -// -// It has the same intricacies as Parse. -func ParseFragment(r io.Reader, context *Node) ([]*Node, error) { +// ParseFragmentWithOptions is like ParseFragment, with options. +func ParseFragmentWithOptions(r io.Reader, context *Node, opts ...ParseOption) ([]*Node, error) { contextTag := "" if context != nil { if context.Type != ElementNode { @@ -2345,6 +2373,10 @@ func ParseFragment(r io.Reader, context *Node) ([]*Node, error) { context: context, } + for _, f := range opts { + f(p) + } + root := &Node{ Type: ElementNode, DataAtom: a.Html, diff --git a/vendor/golang.org/x/net/internal/socket/cmsghdr_linux_64bit.go b/vendor/golang.org/x/net/internal/socket/cmsghdr_linux_64bit.go index 63f0534f..27be0efa 100644 --- a/vendor/golang.org/x/net/internal/socket/cmsghdr_linux_64bit.go +++ b/vendor/golang.org/x/net/internal/socket/cmsghdr_linux_64bit.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build arm64 amd64 ppc64 ppc64le mips64 mips64le s390x +// +build arm64 amd64 ppc64 ppc64le mips64 mips64le riscv64 s390x // +build linux package socket diff --git a/vendor/golang.org/x/net/internal/socket/defs_aix.go b/vendor/golang.org/x/net/internal/socket/defs_aix.go index ed6f8071..c9d05b26 100644 --- a/vendor/golang.org/x/net/internal/socket/defs_aix.go +++ b/vendor/golang.org/x/net/internal/socket/defs_aix.go @@ -16,14 +16,6 @@ package socket */ import "C" -const ( - sysAF_UNSPEC = C.AF_UNSPEC - sysAF_INET = C.AF_INET - sysAF_INET6 = C.AF_INET6 - - sysSOCK_RAW = C.SOCK_RAW -) - type iovec C.struct_iovec type msghdr C.struct_msghdr diff --git a/vendor/golang.org/x/net/internal/socket/defs_darwin.go b/vendor/golang.org/x/net/internal/socket/defs_darwin.go index 14e28c0b..b780bc67 100644 --- a/vendor/golang.org/x/net/internal/socket/defs_darwin.go +++ b/vendor/golang.org/x/net/internal/socket/defs_darwin.go @@ -16,14 +16,6 @@ package socket */ import "C" -const ( - sysAF_UNSPEC = C.AF_UNSPEC - sysAF_INET = C.AF_INET - sysAF_INET6 = C.AF_INET6 - - sysSOCK_RAW = C.SOCK_RAW -) - type iovec C.struct_iovec type msghdr C.struct_msghdr diff --git a/vendor/golang.org/x/net/internal/socket/defs_dragonfly.go b/vendor/golang.org/x/net/internal/socket/defs_dragonfly.go index 14e28c0b..b780bc67 100644 --- a/vendor/golang.org/x/net/internal/socket/defs_dragonfly.go +++ b/vendor/golang.org/x/net/internal/socket/defs_dragonfly.go @@ -16,14 +16,6 @@ package socket */ import "C" -const ( - sysAF_UNSPEC = C.AF_UNSPEC - sysAF_INET = C.AF_INET - sysAF_INET6 = C.AF_INET6 - - sysSOCK_RAW = C.SOCK_RAW -) - type iovec C.struct_iovec type msghdr C.struct_msghdr diff --git a/vendor/golang.org/x/net/internal/socket/defs_freebsd.go b/vendor/golang.org/x/net/internal/socket/defs_freebsd.go index 14e28c0b..b780bc67 100644 --- a/vendor/golang.org/x/net/internal/socket/defs_freebsd.go +++ b/vendor/golang.org/x/net/internal/socket/defs_freebsd.go @@ -16,14 +16,6 @@ package socket */ import "C" -const ( - sysAF_UNSPEC = C.AF_UNSPEC - sysAF_INET = C.AF_INET - sysAF_INET6 = C.AF_INET6 - - sysSOCK_RAW = C.SOCK_RAW -) - type iovec C.struct_iovec type msghdr C.struct_msghdr diff --git a/vendor/golang.org/x/net/internal/socket/defs_linux.go b/vendor/golang.org/x/net/internal/socket/defs_linux.go index ce9ec2f6..6c5c11dc 100644 --- a/vendor/golang.org/x/net/internal/socket/defs_linux.go +++ b/vendor/golang.org/x/net/internal/socket/defs_linux.go @@ -18,14 +18,6 @@ package socket */ import "C" -const ( - sysAF_UNSPEC = C.AF_UNSPEC - sysAF_INET = C.AF_INET - sysAF_INET6 = C.AF_INET6 - - sysSOCK_RAW = C.SOCK_RAW -) - type iovec C.struct_iovec type msghdr C.struct_msghdr diff --git a/vendor/golang.org/x/net/internal/socket/defs_netbsd.go b/vendor/golang.org/x/net/internal/socket/defs_netbsd.go index 3f843356..3d3b7763 100644 --- a/vendor/golang.org/x/net/internal/socket/defs_netbsd.go +++ b/vendor/golang.org/x/net/internal/socket/defs_netbsd.go @@ -16,14 +16,6 @@ package socket */ import "C" -const ( - sysAF_UNSPEC = C.AF_UNSPEC - sysAF_INET = C.AF_INET - sysAF_INET6 = C.AF_INET6 - - sysSOCK_RAW = C.SOCK_RAW -) - type iovec C.struct_iovec type msghdr C.struct_msghdr diff --git a/vendor/golang.org/x/net/internal/socket/defs_openbsd.go b/vendor/golang.org/x/net/internal/socket/defs_openbsd.go index 14e28c0b..b780bc67 100644 --- a/vendor/golang.org/x/net/internal/socket/defs_openbsd.go +++ b/vendor/golang.org/x/net/internal/socket/defs_openbsd.go @@ -16,14 +16,6 @@ package socket */ import "C" -const ( - sysAF_UNSPEC = C.AF_UNSPEC - sysAF_INET = C.AF_INET - sysAF_INET6 = C.AF_INET6 - - sysSOCK_RAW = C.SOCK_RAW -) - type iovec C.struct_iovec type msghdr C.struct_msghdr diff --git a/vendor/golang.org/x/net/internal/socket/defs_solaris.go b/vendor/golang.org/x/net/internal/socket/defs_solaris.go index 14e28c0b..b780bc67 100644 --- a/vendor/golang.org/x/net/internal/socket/defs_solaris.go +++ b/vendor/golang.org/x/net/internal/socket/defs_solaris.go @@ -16,14 +16,6 @@ package socket */ import "C" -const ( - sysAF_UNSPEC = C.AF_UNSPEC - sysAF_INET = C.AF_INET - sysAF_INET6 = C.AF_INET6 - - sysSOCK_RAW = C.SOCK_RAW -) - type iovec C.struct_iovec type msghdr C.struct_msghdr diff --git a/vendor/golang.org/x/net/internal/socket/iovec_64bit.go b/vendor/golang.org/x/net/internal/socket/iovec_64bit.go index 07738825..dfeda752 100644 --- a/vendor/golang.org/x/net/internal/socket/iovec_64bit.go +++ b/vendor/golang.org/x/net/internal/socket/iovec_64bit.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build arm64 amd64 ppc64 ppc64le mips64 mips64le s390x +// +build arm64 amd64 ppc64 ppc64le mips64 mips64le riscv64 s390x // +build aix darwin dragonfly freebsd linux netbsd openbsd package socket diff --git a/vendor/golang.org/x/net/internal/socket/msghdr_linux_64bit.go b/vendor/golang.org/x/net/internal/socket/msghdr_linux_64bit.go index 610fc4f3..e731833a 100644 --- a/vendor/golang.org/x/net/internal/socket/msghdr_linux_64bit.go +++ b/vendor/golang.org/x/net/internal/socket/msghdr_linux_64bit.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build arm64 amd64 ppc64 ppc64le mips64 mips64le s390x +// +build arm64 amd64 ppc64 ppc64le mips64 mips64le riscv64 s390x // +build linux package socket diff --git a/vendor/golang.org/x/net/internal/socket/sys_const_unix.go b/vendor/golang.org/x/net/internal/socket/sys_const_unix.go new file mode 100644 index 00000000..43797d6e --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/sys_const_unix.go @@ -0,0 +1,17 @@ +// Copyright 2019 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 netbsd openbsd solaris + +package socket + +import "golang.org/x/sys/unix" + +const ( + sysAF_UNSPEC = unix.AF_UNSPEC + sysAF_INET = unix.AF_INET + sysAF_INET6 = unix.AF_INET6 + + sysSOCK_RAW = unix.SOCK_RAW +) diff --git a/vendor/golang.org/x/sys/windows/mkerrors.go b/vendor/golang.org/x/net/internal/socket/sys_linux_riscv64.go similarity index 65% rename from vendor/golang.org/x/sys/windows/mkerrors.go rename to vendor/golang.org/x/net/internal/socket/sys_linux_riscv64.go index cbf123ef..64f69f1d 100644 --- a/vendor/golang.org/x/sys/windows/mkerrors.go +++ b/vendor/golang.org/x/net/internal/socket/sys_linux_riscv64.go @@ -2,6 +2,11 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -package windows +// +build riscv64 -//go:generate ./mkerrors.bash zerrors_windows.go +package socket + +const ( + sysRECVMMSG = 0xf3 + sysSENDMMSG = 0x10d +) diff --git a/vendor/golang.org/x/net/internal/socket/sys_windows.go b/vendor/golang.org/x/net/internal/socket/sys_windows.go index 924e327b..d556a446 100644 --- a/vendor/golang.org/x/net/internal/socket/sys_windows.go +++ b/vendor/golang.org/x/net/internal/socket/sys_windows.go @@ -7,6 +7,8 @@ package socket import ( "syscall" "unsafe" + + "golang.org/x/sys/windows" ) func probeProtocolStack() int { @@ -15,11 +17,11 @@ func probeProtocolStack() int { } const ( - sysAF_UNSPEC = 0x0 - sysAF_INET = 0x2 - sysAF_INET6 = 0x17 + sysAF_UNSPEC = windows.AF_UNSPEC + sysAF_INET = windows.AF_INET + sysAF_INET6 = windows.AF_INET6 - sysSOCK_RAW = 0x3 + sysSOCK_RAW = windows.SOCK_RAW ) type sockaddrInet struct { diff --git a/vendor/golang.org/x/net/internal/socket/zsys_aix_ppc64.go b/vendor/golang.org/x/net/internal/socket/zsys_aix_ppc64.go index 3a825f47..813385a9 100644 --- a/vendor/golang.org/x/net/internal/socket/zsys_aix_ppc64.go +++ b/vendor/golang.org/x/net/internal/socket/zsys_aix_ppc64.go @@ -6,14 +6,6 @@ package socket -const ( - sysAF_UNSPEC = 0x0 - sysAF_INET = 0x2 - sysAF_INET6 = 0x18 - - sysSOCK_RAW = 0x3 -) - type iovec struct { Base *byte Len uint64 diff --git a/vendor/golang.org/x/net/internal/socket/zsys_darwin_386.go b/vendor/golang.org/x/net/internal/socket/zsys_darwin_386.go index 26f8feff..083bda51 100644 --- a/vendor/golang.org/x/net/internal/socket/zsys_darwin_386.go +++ b/vendor/golang.org/x/net/internal/socket/zsys_darwin_386.go @@ -1,16 +1,8 @@ -// Created by cgo -godefs - DO NOT EDIT +// Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs defs_darwin.go package socket -const ( - sysAF_UNSPEC = 0x0 - sysAF_INET = 0x2 - sysAF_INET6 = 0x1e - - sysSOCK_RAW = 0x3 -) - type iovec struct { Base *byte Len uint32 diff --git a/vendor/golang.org/x/net/internal/socket/zsys_darwin_amd64.go b/vendor/golang.org/x/net/internal/socket/zsys_darwin_amd64.go index e2987f7d..55c6c9f5 100644 --- a/vendor/golang.org/x/net/internal/socket/zsys_darwin_amd64.go +++ b/vendor/golang.org/x/net/internal/socket/zsys_darwin_amd64.go @@ -1,16 +1,8 @@ -// Created by cgo -godefs - DO NOT EDIT +// Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs defs_darwin.go package socket -const ( - sysAF_UNSPEC = 0x0 - sysAF_INET = 0x2 - sysAF_INET6 = 0x1e - - sysSOCK_RAW = 0x3 -) - type iovec struct { Base *byte Len uint64 diff --git a/vendor/golang.org/x/net/internal/socket/zsys_darwin_arm.go b/vendor/golang.org/x/net/internal/socket/zsys_darwin_arm.go index 26f8feff..083bda51 100644 --- a/vendor/golang.org/x/net/internal/socket/zsys_darwin_arm.go +++ b/vendor/golang.org/x/net/internal/socket/zsys_darwin_arm.go @@ -1,16 +1,8 @@ -// Created by cgo -godefs - DO NOT EDIT +// Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs defs_darwin.go package socket -const ( - sysAF_UNSPEC = 0x0 - sysAF_INET = 0x2 - sysAF_INET6 = 0x1e - - sysSOCK_RAW = 0x3 -) - type iovec struct { Base *byte Len uint32 diff --git a/vendor/golang.org/x/net/internal/socket/zsys_darwin_arm64.go b/vendor/golang.org/x/net/internal/socket/zsys_darwin_arm64.go index e2987f7d..55c6c9f5 100644 --- a/vendor/golang.org/x/net/internal/socket/zsys_darwin_arm64.go +++ b/vendor/golang.org/x/net/internal/socket/zsys_darwin_arm64.go @@ -1,16 +1,8 @@ -// Created by cgo -godefs - DO NOT EDIT +// Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs defs_darwin.go package socket -const ( - sysAF_UNSPEC = 0x0 - sysAF_INET = 0x2 - sysAF_INET6 = 0x1e - - sysSOCK_RAW = 0x3 -) - type iovec struct { Base *byte Len uint64 diff --git a/vendor/golang.org/x/net/internal/socket/zsys_dragonfly_amd64.go b/vendor/golang.org/x/net/internal/socket/zsys_dragonfly_amd64.go index c582abd5..8b7d161d 100644 --- a/vendor/golang.org/x/net/internal/socket/zsys_dragonfly_amd64.go +++ b/vendor/golang.org/x/net/internal/socket/zsys_dragonfly_amd64.go @@ -1,16 +1,8 @@ -// Created by cgo -godefs - DO NOT EDIT +// Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs defs_dragonfly.go package socket -const ( - sysAF_UNSPEC = 0x0 - sysAF_INET = 0x2 - sysAF_INET6 = 0x1c - - sysSOCK_RAW = 0x3 -) - type iovec struct { Base *byte Len uint64 diff --git a/vendor/golang.org/x/net/internal/socket/zsys_freebsd_386.go b/vendor/golang.org/x/net/internal/socket/zsys_freebsd_386.go index 04a24886..3e71ff57 100644 --- a/vendor/golang.org/x/net/internal/socket/zsys_freebsd_386.go +++ b/vendor/golang.org/x/net/internal/socket/zsys_freebsd_386.go @@ -1,16 +1,8 @@ -// Created by cgo -godefs - DO NOT EDIT +// Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs defs_freebsd.go package socket -const ( - sysAF_UNSPEC = 0x0 - sysAF_INET = 0x2 - sysAF_INET6 = 0x1c - - sysSOCK_RAW = 0x3 -) - type iovec struct { Base *byte Len uint32 diff --git a/vendor/golang.org/x/net/internal/socket/zsys_freebsd_amd64.go b/vendor/golang.org/x/net/internal/socket/zsys_freebsd_amd64.go index 35c7cb9c..238d90de 100644 --- a/vendor/golang.org/x/net/internal/socket/zsys_freebsd_amd64.go +++ b/vendor/golang.org/x/net/internal/socket/zsys_freebsd_amd64.go @@ -1,16 +1,8 @@ -// Created by cgo -godefs - DO NOT EDIT +// Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs defs_freebsd.go package socket -const ( - sysAF_UNSPEC = 0x0 - sysAF_INET = 0x2 - sysAF_INET6 = 0x1c - - sysSOCK_RAW = 0x3 -) - type iovec struct { Base *byte Len uint64 diff --git a/vendor/golang.org/x/net/internal/socket/zsys_freebsd_arm.go b/vendor/golang.org/x/net/internal/socket/zsys_freebsd_arm.go index 04a24886..3e71ff57 100644 --- a/vendor/golang.org/x/net/internal/socket/zsys_freebsd_arm.go +++ b/vendor/golang.org/x/net/internal/socket/zsys_freebsd_arm.go @@ -1,16 +1,8 @@ -// Created by cgo -godefs - DO NOT EDIT +// Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs defs_freebsd.go package socket -const ( - sysAF_UNSPEC = 0x0 - sysAF_INET = 0x2 - sysAF_INET6 = 0x1c - - sysSOCK_RAW = 0x3 -) - type iovec struct { Base *byte Len uint32 diff --git a/vendor/golang.org/x/net/internal/socket/zsys_freebsd_arm64.go b/vendor/golang.org/x/net/internal/socket/zsys_freebsd_arm64.go new file mode 100644 index 00000000..238d90de --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/zsys_freebsd_arm64.go @@ -0,0 +1,53 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs defs_freebsd.go + +package socket + +type iovec struct { + Base *byte + Len uint64 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Pad_cgo_0 [4]byte + Iov *iovec + Iovlen int32 + Pad_cgo_1 [4]byte + Control *byte + Controllen uint32 + Flags int32 +} + +type cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type sockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofIovec = 0x10 + sizeofMsghdr = 0x30 + sizeofCmsghdr = 0xc + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/vendor/golang.org/x/net/internal/socket/zsys_linux_386.go b/vendor/golang.org/x/net/internal/socket/zsys_linux_386.go index 43020693..72d8b254 100644 --- a/vendor/golang.org/x/net/internal/socket/zsys_linux_386.go +++ b/vendor/golang.org/x/net/internal/socket/zsys_linux_386.go @@ -1,16 +1,8 @@ -// Created by cgo -godefs - DO NOT EDIT +// Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs defs_linux.go package socket -const ( - sysAF_UNSPEC = 0x0 - sysAF_INET = 0x2 - sysAF_INET6 = 0xa - - sysSOCK_RAW = 0x3 -) - type iovec struct { Base *byte Len uint32 diff --git a/vendor/golang.org/x/net/internal/socket/zsys_linux_amd64.go b/vendor/golang.org/x/net/internal/socket/zsys_linux_amd64.go index 1502f6c5..3545319a 100644 --- a/vendor/golang.org/x/net/internal/socket/zsys_linux_amd64.go +++ b/vendor/golang.org/x/net/internal/socket/zsys_linux_amd64.go @@ -1,16 +1,8 @@ -// Created by cgo -godefs - DO NOT EDIT +// Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs defs_linux.go package socket -const ( - sysAF_UNSPEC = 0x0 - sysAF_INET = 0x2 - sysAF_INET6 = 0xa - - sysSOCK_RAW = 0x3 -) - type iovec struct { Base *byte Len uint64 diff --git a/vendor/golang.org/x/net/internal/socket/zsys_linux_arm.go b/vendor/golang.org/x/net/internal/socket/zsys_linux_arm.go index 43020693..72d8b254 100644 --- a/vendor/golang.org/x/net/internal/socket/zsys_linux_arm.go +++ b/vendor/golang.org/x/net/internal/socket/zsys_linux_arm.go @@ -1,16 +1,8 @@ -// Created by cgo -godefs - DO NOT EDIT +// Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs defs_linux.go package socket -const ( - sysAF_UNSPEC = 0x0 - sysAF_INET = 0x2 - sysAF_INET6 = 0xa - - sysSOCK_RAW = 0x3 -) - type iovec struct { Base *byte Len uint32 diff --git a/vendor/golang.org/x/net/internal/socket/zsys_linux_arm64.go b/vendor/golang.org/x/net/internal/socket/zsys_linux_arm64.go index 1502f6c5..3545319a 100644 --- a/vendor/golang.org/x/net/internal/socket/zsys_linux_arm64.go +++ b/vendor/golang.org/x/net/internal/socket/zsys_linux_arm64.go @@ -1,16 +1,8 @@ -// Created by cgo -godefs - DO NOT EDIT +// Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs defs_linux.go package socket -const ( - sysAF_UNSPEC = 0x0 - sysAF_INET = 0x2 - sysAF_INET6 = 0xa - - sysSOCK_RAW = 0x3 -) - type iovec struct { Base *byte Len uint64 diff --git a/vendor/golang.org/x/net/internal/socket/zsys_linux_mips.go b/vendor/golang.org/x/net/internal/socket/zsys_linux_mips.go index 43020693..72d8b254 100644 --- a/vendor/golang.org/x/net/internal/socket/zsys_linux_mips.go +++ b/vendor/golang.org/x/net/internal/socket/zsys_linux_mips.go @@ -1,16 +1,8 @@ -// Created by cgo -godefs - DO NOT EDIT +// Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs defs_linux.go package socket -const ( - sysAF_UNSPEC = 0x0 - sysAF_INET = 0x2 - sysAF_INET6 = 0xa - - sysSOCK_RAW = 0x3 -) - type iovec struct { Base *byte Len uint32 diff --git a/vendor/golang.org/x/net/internal/socket/zsys_linux_mips64.go b/vendor/golang.org/x/net/internal/socket/zsys_linux_mips64.go index 1502f6c5..3545319a 100644 --- a/vendor/golang.org/x/net/internal/socket/zsys_linux_mips64.go +++ b/vendor/golang.org/x/net/internal/socket/zsys_linux_mips64.go @@ -1,16 +1,8 @@ -// Created by cgo -godefs - DO NOT EDIT +// Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs defs_linux.go package socket -const ( - sysAF_UNSPEC = 0x0 - sysAF_INET = 0x2 - sysAF_INET6 = 0xa - - sysSOCK_RAW = 0x3 -) - type iovec struct { Base *byte Len uint64 diff --git a/vendor/golang.org/x/net/internal/socket/zsys_linux_mips64le.go b/vendor/golang.org/x/net/internal/socket/zsys_linux_mips64le.go index 1502f6c5..3545319a 100644 --- a/vendor/golang.org/x/net/internal/socket/zsys_linux_mips64le.go +++ b/vendor/golang.org/x/net/internal/socket/zsys_linux_mips64le.go @@ -1,16 +1,8 @@ -// Created by cgo -godefs - DO NOT EDIT +// Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs defs_linux.go package socket -const ( - sysAF_UNSPEC = 0x0 - sysAF_INET = 0x2 - sysAF_INET6 = 0xa - - sysSOCK_RAW = 0x3 -) - type iovec struct { Base *byte Len uint64 diff --git a/vendor/golang.org/x/net/internal/socket/zsys_linux_mipsle.go b/vendor/golang.org/x/net/internal/socket/zsys_linux_mipsle.go index 43020693..72d8b254 100644 --- a/vendor/golang.org/x/net/internal/socket/zsys_linux_mipsle.go +++ b/vendor/golang.org/x/net/internal/socket/zsys_linux_mipsle.go @@ -1,16 +1,8 @@ -// Created by cgo -godefs - DO NOT EDIT +// Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs defs_linux.go package socket -const ( - sysAF_UNSPEC = 0x0 - sysAF_INET = 0x2 - sysAF_INET6 = 0xa - - sysSOCK_RAW = 0x3 -) - type iovec struct { Base *byte Len uint32 diff --git a/vendor/golang.org/x/net/internal/socket/zsys_linux_ppc64.go b/vendor/golang.org/x/net/internal/socket/zsys_linux_ppc64.go index 1502f6c5..3545319a 100644 --- a/vendor/golang.org/x/net/internal/socket/zsys_linux_ppc64.go +++ b/vendor/golang.org/x/net/internal/socket/zsys_linux_ppc64.go @@ -1,16 +1,8 @@ -// Created by cgo -godefs - DO NOT EDIT +// Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs defs_linux.go package socket -const ( - sysAF_UNSPEC = 0x0 - sysAF_INET = 0x2 - sysAF_INET6 = 0xa - - sysSOCK_RAW = 0x3 -) - type iovec struct { Base *byte Len uint64 diff --git a/vendor/golang.org/x/net/internal/socket/zsys_linux_ppc64le.go b/vendor/golang.org/x/net/internal/socket/zsys_linux_ppc64le.go index 1502f6c5..3545319a 100644 --- a/vendor/golang.org/x/net/internal/socket/zsys_linux_ppc64le.go +++ b/vendor/golang.org/x/net/internal/socket/zsys_linux_ppc64le.go @@ -1,16 +1,8 @@ -// Created by cgo -godefs - DO NOT EDIT +// Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs defs_linux.go package socket -const ( - sysAF_UNSPEC = 0x0 - sysAF_INET = 0x2 - sysAF_INET6 = 0xa - - sysSOCK_RAW = 0x3 -) - type iovec struct { Base *byte Len uint64 diff --git a/vendor/golang.org/x/net/internal/socket/zsys_linux_riscv64.go b/vendor/golang.org/x/net/internal/socket/zsys_linux_riscv64.go new file mode 100644 index 00000000..dbff234f --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/zsys_linux_riscv64.go @@ -0,0 +1,59 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs defs_linux.go + +// +build riscv64 + +package socket + +type iovec struct { + Base *byte + Len uint64 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Iov *iovec + Iovlen uint64 + Control *byte + Controllen uint64 + Flags int32 + Pad_cgo_0 [4]byte +} + +type mmsghdr struct { + Hdr msghdr + Len uint32 + Pad_cgo_0 [4]byte +} + +type cmsghdr struct { + Len uint64 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + X__pad [8]uint8 +} + +type sockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofIovec = 0x10 + sizeofMsghdr = 0x38 + sizeofMmsghdr = 0x40 + sizeofCmsghdr = 0x10 + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/vendor/golang.org/x/net/internal/socket/zsys_linux_s390x.go b/vendor/golang.org/x/net/internal/socket/zsys_linux_s390x.go index 1502f6c5..3545319a 100644 --- a/vendor/golang.org/x/net/internal/socket/zsys_linux_s390x.go +++ b/vendor/golang.org/x/net/internal/socket/zsys_linux_s390x.go @@ -1,16 +1,8 @@ -// Created by cgo -godefs - DO NOT EDIT +// Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs defs_linux.go package socket -const ( - sysAF_UNSPEC = 0x0 - sysAF_INET = 0x2 - sysAF_INET6 = 0xa - - sysSOCK_RAW = 0x3 -) - type iovec struct { Base *byte Len uint64 diff --git a/vendor/golang.org/x/net/internal/socket/zsys_netbsd_386.go b/vendor/golang.org/x/net/internal/socket/zsys_netbsd_386.go index db60491f..bf8f47c8 100644 --- a/vendor/golang.org/x/net/internal/socket/zsys_netbsd_386.go +++ b/vendor/golang.org/x/net/internal/socket/zsys_netbsd_386.go @@ -1,16 +1,8 @@ -// Created by cgo -godefs - DO NOT EDIT +// Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs defs_netbsd.go package socket -const ( - sysAF_UNSPEC = 0x0 - sysAF_INET = 0x2 - sysAF_INET6 = 0x18 - - sysSOCK_RAW = 0x3 -) - type iovec struct { Base *byte Len uint32 diff --git a/vendor/golang.org/x/net/internal/socket/zsys_netbsd_amd64.go b/vendor/golang.org/x/net/internal/socket/zsys_netbsd_amd64.go index 2a1a7998..a46eff99 100644 --- a/vendor/golang.org/x/net/internal/socket/zsys_netbsd_amd64.go +++ b/vendor/golang.org/x/net/internal/socket/zsys_netbsd_amd64.go @@ -1,16 +1,8 @@ -// Created by cgo -godefs - DO NOT EDIT +// Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs defs_netbsd.go package socket -const ( - sysAF_UNSPEC = 0x0 - sysAF_INET = 0x2 - sysAF_INET6 = 0x18 - - sysSOCK_RAW = 0x3 -) - type iovec struct { Base *byte Len uint64 diff --git a/vendor/golang.org/x/net/internal/socket/zsys_netbsd_arm.go b/vendor/golang.org/x/net/internal/socket/zsys_netbsd_arm.go index db60491f..bf8f47c8 100644 --- a/vendor/golang.org/x/net/internal/socket/zsys_netbsd_arm.go +++ b/vendor/golang.org/x/net/internal/socket/zsys_netbsd_arm.go @@ -1,16 +1,8 @@ -// Created by cgo -godefs - DO NOT EDIT +// Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs defs_netbsd.go package socket -const ( - sysAF_UNSPEC = 0x0 - sysAF_INET = 0x2 - sysAF_INET6 = 0x18 - - sysSOCK_RAW = 0x3 -) - type iovec struct { Base *byte Len uint32 diff --git a/vendor/golang.org/x/net/internal/socket/zsys_netbsd_arm64.go b/vendor/golang.org/x/net/internal/socket/zsys_netbsd_arm64.go new file mode 100644 index 00000000..a46eff99 --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/zsys_netbsd_arm64.go @@ -0,0 +1,60 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs defs_netbsd.go + +package socket + +type iovec struct { + Base *byte + Len uint64 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Pad_cgo_0 [4]byte + Iov *iovec + Iovlen int32 + Pad_cgo_1 [4]byte + Control *byte + Controllen uint32 + Flags int32 +} + +type mmsghdr struct { + Hdr msghdr + Len uint32 + Pad_cgo_0 [4]byte +} + +type cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type sockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofIovec = 0x10 + sizeofMsghdr = 0x30 + sizeofMmsghdr = 0x40 + sizeofCmsghdr = 0xc + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/vendor/golang.org/x/net/internal/socket/zsys_openbsd_386.go b/vendor/golang.org/x/net/internal/socket/zsys_openbsd_386.go index 1c836361..73655a14 100644 --- a/vendor/golang.org/x/net/internal/socket/zsys_openbsd_386.go +++ b/vendor/golang.org/x/net/internal/socket/zsys_openbsd_386.go @@ -1,16 +1,8 @@ -// Created by cgo -godefs - DO NOT EDIT +// Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs defs_openbsd.go package socket -const ( - sysAF_UNSPEC = 0x0 - sysAF_INET = 0x2 - sysAF_INET6 = 0x18 - - sysSOCK_RAW = 0x3 -) - type iovec struct { Base *byte Len uint32 diff --git a/vendor/golang.org/x/net/internal/socket/zsys_openbsd_amd64.go b/vendor/golang.org/x/net/internal/socket/zsys_openbsd_amd64.go index a6c0bf46..0a4de80f 100644 --- a/vendor/golang.org/x/net/internal/socket/zsys_openbsd_amd64.go +++ b/vendor/golang.org/x/net/internal/socket/zsys_openbsd_amd64.go @@ -1,16 +1,8 @@ -// Created by cgo -godefs - DO NOT EDIT +// Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs defs_openbsd.go package socket -const ( - sysAF_UNSPEC = 0x0 - sysAF_INET = 0x2 - sysAF_INET6 = 0x18 - - sysSOCK_RAW = 0x3 -) - type iovec struct { Base *byte Len uint64 diff --git a/vendor/golang.org/x/net/internal/socket/zsys_openbsd_arm.go b/vendor/golang.org/x/net/internal/socket/zsys_openbsd_arm.go index 1c836361..73655a14 100644 --- a/vendor/golang.org/x/net/internal/socket/zsys_openbsd_arm.go +++ b/vendor/golang.org/x/net/internal/socket/zsys_openbsd_arm.go @@ -1,16 +1,8 @@ -// Created by cgo -godefs - DO NOT EDIT +// Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs defs_openbsd.go package socket -const ( - sysAF_UNSPEC = 0x0 - sysAF_INET = 0x2 - sysAF_INET6 = 0x18 - - sysSOCK_RAW = 0x3 -) - type iovec struct { Base *byte Len uint32 diff --git a/vendor/golang.org/x/net/internal/socket/zsys_openbsd_arm64.go b/vendor/golang.org/x/net/internal/socket/zsys_openbsd_arm64.go new file mode 100644 index 00000000..0a4de80f --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/zsys_openbsd_arm64.go @@ -0,0 +1,53 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs defs_openbsd.go + +package socket + +type iovec struct { + Base *byte + Len uint64 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Pad_cgo_0 [4]byte + Iov *iovec + Iovlen uint32 + Pad_cgo_1 [4]byte + Control *byte + Controllen uint32 + Flags int32 +} + +type cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type sockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofIovec = 0x10 + sizeofMsghdr = 0x30 + sizeofCmsghdr = 0xc + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/vendor/golang.org/x/net/internal/socket/zsys_solaris_amd64.go b/vendor/golang.org/x/net/internal/socket/zsys_solaris_amd64.go index 327c6329..353cd5fb 100644 --- a/vendor/golang.org/x/net/internal/socket/zsys_solaris_amd64.go +++ b/vendor/golang.org/x/net/internal/socket/zsys_solaris_amd64.go @@ -1,16 +1,8 @@ -// Created by cgo -godefs - DO NOT EDIT +// Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs defs_solaris.go package socket -const ( - sysAF_UNSPEC = 0x0 - sysAF_INET = 0x2 - sysAF_INET6 = 0x1a - - sysSOCK_RAW = 0x4 -) - type iovec struct { Base *int8 Len uint64 diff --git a/vendor/golang.org/x/net/ipv4/zsys_darwin.go b/vendor/golang.org/x/net/ipv4/zsys_darwin.go index c07cc883..e05a251b 100644 --- a/vendor/golang.org/x/net/ipv4/zsys_darwin.go +++ b/vendor/golang.org/x/net/ipv4/zsys_darwin.go @@ -1,4 +1,4 @@ -// Created by cgo -godefs - DO NOT EDIT +// Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs defs_darwin.go package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/zsys_dragonfly.go b/vendor/golang.org/x/net/ipv4/zsys_dragonfly.go index c4365e9e..6d65e9fc 100644 --- a/vendor/golang.org/x/net/ipv4/zsys_dragonfly.go +++ b/vendor/golang.org/x/net/ipv4/zsys_dragonfly.go @@ -1,4 +1,4 @@ -// Created by cgo -godefs - DO NOT EDIT +// Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs defs_dragonfly.go package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/zsys_freebsd_386.go b/vendor/golang.org/x/net/ipv4/zsys_freebsd_386.go index 8c4aec94..136e2b8f 100644 --- a/vendor/golang.org/x/net/ipv4/zsys_freebsd_386.go +++ b/vendor/golang.org/x/net/ipv4/zsys_freebsd_386.go @@ -1,4 +1,4 @@ -// Created by cgo -godefs - DO NOT EDIT +// Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs defs_freebsd.go package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/zsys_freebsd_amd64.go b/vendor/golang.org/x/net/ipv4/zsys_freebsd_amd64.go index 4b10b7c5..4f730f19 100644 --- a/vendor/golang.org/x/net/ipv4/zsys_freebsd_amd64.go +++ b/vendor/golang.org/x/net/ipv4/zsys_freebsd_amd64.go @@ -1,4 +1,4 @@ -// Created by cgo -godefs - DO NOT EDIT +// Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs defs_freebsd.go package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/zsys_freebsd_arm.go b/vendor/golang.org/x/net/ipv4/zsys_freebsd_arm.go index 4b10b7c5..4f730f19 100644 --- a/vendor/golang.org/x/net/ipv4/zsys_freebsd_arm.go +++ b/vendor/golang.org/x/net/ipv4/zsys_freebsd_arm.go @@ -1,4 +1,4 @@ -// Created by cgo -godefs - DO NOT EDIT +// Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs defs_freebsd.go package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/zsys_linux_386.go b/vendor/golang.org/x/net/ipv4/zsys_linux_386.go index c0260f0c..43ef8e59 100644 --- a/vendor/golang.org/x/net/ipv4/zsys_linux_386.go +++ b/vendor/golang.org/x/net/ipv4/zsys_linux_386.go @@ -1,4 +1,4 @@ -// Created by cgo -godefs - DO NOT EDIT +// Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs defs_linux.go package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/zsys_linux_amd64.go b/vendor/golang.org/x/net/ipv4/zsys_linux_amd64.go index 9c967eaa..ee8204da 100644 --- a/vendor/golang.org/x/net/ipv4/zsys_linux_amd64.go +++ b/vendor/golang.org/x/net/ipv4/zsys_linux_amd64.go @@ -1,4 +1,4 @@ -// Created by cgo -godefs - DO NOT EDIT +// Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs defs_linux.go package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/zsys_linux_arm.go b/vendor/golang.org/x/net/ipv4/zsys_linux_arm.go index c0260f0c..43ef8e59 100644 --- a/vendor/golang.org/x/net/ipv4/zsys_linux_arm.go +++ b/vendor/golang.org/x/net/ipv4/zsys_linux_arm.go @@ -1,4 +1,4 @@ -// Created by cgo -godefs - DO NOT EDIT +// Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs defs_linux.go package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/zsys_linux_arm64.go b/vendor/golang.org/x/net/ipv4/zsys_linux_arm64.go index 9c967eaa..ee8204da 100644 --- a/vendor/golang.org/x/net/ipv4/zsys_linux_arm64.go +++ b/vendor/golang.org/x/net/ipv4/zsys_linux_arm64.go @@ -1,4 +1,4 @@ -// Created by cgo -godefs - DO NOT EDIT +// Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs defs_linux.go package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/zsys_linux_mips.go b/vendor/golang.org/x/net/ipv4/zsys_linux_mips.go index c0260f0c..43ef8e59 100644 --- a/vendor/golang.org/x/net/ipv4/zsys_linux_mips.go +++ b/vendor/golang.org/x/net/ipv4/zsys_linux_mips.go @@ -1,4 +1,4 @@ -// Created by cgo -godefs - DO NOT EDIT +// Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs defs_linux.go package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/zsys_linux_mips64.go b/vendor/golang.org/x/net/ipv4/zsys_linux_mips64.go index 9c967eaa..ee8204da 100644 --- a/vendor/golang.org/x/net/ipv4/zsys_linux_mips64.go +++ b/vendor/golang.org/x/net/ipv4/zsys_linux_mips64.go @@ -1,4 +1,4 @@ -// Created by cgo -godefs - DO NOT EDIT +// Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs defs_linux.go package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/zsys_linux_mips64le.go b/vendor/golang.org/x/net/ipv4/zsys_linux_mips64le.go index 9c967eaa..ee8204da 100644 --- a/vendor/golang.org/x/net/ipv4/zsys_linux_mips64le.go +++ b/vendor/golang.org/x/net/ipv4/zsys_linux_mips64le.go @@ -1,4 +1,4 @@ -// Created by cgo -godefs - DO NOT EDIT +// Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs defs_linux.go package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/zsys_linux_mipsle.go b/vendor/golang.org/x/net/ipv4/zsys_linux_mipsle.go index c0260f0c..43ef8e59 100644 --- a/vendor/golang.org/x/net/ipv4/zsys_linux_mipsle.go +++ b/vendor/golang.org/x/net/ipv4/zsys_linux_mipsle.go @@ -1,4 +1,4 @@ -// Created by cgo -godefs - DO NOT EDIT +// Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs defs_linux.go package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/zsys_linux_ppc.go b/vendor/golang.org/x/net/ipv4/zsys_linux_ppc.go index f65bd9a7..fa1b6bc6 100644 --- a/vendor/golang.org/x/net/ipv4/zsys_linux_ppc.go +++ b/vendor/golang.org/x/net/ipv4/zsys_linux_ppc.go @@ -1,4 +1,4 @@ -// Created by cgo -godefs - DO NOT EDIT +// Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs defs_linux.go package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/zsys_linux_ppc64.go b/vendor/golang.org/x/net/ipv4/zsys_linux_ppc64.go index 9c967eaa..ee8204da 100644 --- a/vendor/golang.org/x/net/ipv4/zsys_linux_ppc64.go +++ b/vendor/golang.org/x/net/ipv4/zsys_linux_ppc64.go @@ -1,4 +1,4 @@ -// Created by cgo -godefs - DO NOT EDIT +// Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs defs_linux.go package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/zsys_linux_ppc64le.go b/vendor/golang.org/x/net/ipv4/zsys_linux_ppc64le.go index 9c967eaa..ee8204da 100644 --- a/vendor/golang.org/x/net/ipv4/zsys_linux_ppc64le.go +++ b/vendor/golang.org/x/net/ipv4/zsys_linux_ppc64le.go @@ -1,4 +1,4 @@ -// Created by cgo -godefs - DO NOT EDIT +// Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs defs_linux.go package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/zsys_linux_riscv64.go b/vendor/golang.org/x/net/ipv4/zsys_linux_riscv64.go new file mode 100644 index 00000000..0c0d4801 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/zsys_linux_riscv64.go @@ -0,0 +1,151 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs defs_linux.go + +// +build riscv64 + +package ipv4 + +const ( + sysIP_TOS = 0x1 + sysIP_TTL = 0x2 + sysIP_HDRINCL = 0x3 + sysIP_OPTIONS = 0x4 + sysIP_ROUTER_ALERT = 0x5 + sysIP_RECVOPTS = 0x6 + sysIP_RETOPTS = 0x7 + sysIP_PKTINFO = 0x8 + sysIP_PKTOPTIONS = 0x9 + sysIP_MTU_DISCOVER = 0xa + sysIP_RECVERR = 0xb + sysIP_RECVTTL = 0xc + sysIP_RECVTOS = 0xd + sysIP_MTU = 0xe + sysIP_FREEBIND = 0xf + sysIP_TRANSPARENT = 0x13 + sysIP_RECVRETOPTS = 0x7 + sysIP_ORIGDSTADDR = 0x14 + sysIP_RECVORIGDSTADDR = 0x14 + sysIP_MINTTL = 0x15 + sysIP_NODEFRAG = 0x16 + sysIP_UNICAST_IF = 0x32 + + sysIP_MULTICAST_IF = 0x20 + sysIP_MULTICAST_TTL = 0x21 + sysIP_MULTICAST_LOOP = 0x22 + sysIP_ADD_MEMBERSHIP = 0x23 + sysIP_DROP_MEMBERSHIP = 0x24 + sysIP_UNBLOCK_SOURCE = 0x25 + sysIP_BLOCK_SOURCE = 0x26 + sysIP_ADD_SOURCE_MEMBERSHIP = 0x27 + sysIP_DROP_SOURCE_MEMBERSHIP = 0x28 + sysIP_MSFILTER = 0x29 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIP_MULTICAST_ALL = 0x31 + + sysICMP_FILTER = 0x1 + + sysSO_EE_ORIGIN_NONE = 0x0 + sysSO_EE_ORIGIN_LOCAL = 0x1 + sysSO_EE_ORIGIN_ICMP = 0x2 + sysSO_EE_ORIGIN_ICMP6 = 0x3 + sysSO_EE_ORIGIN_TXSTATUS = 0x4 + sysSO_EE_ORIGIN_TIMESTAMPING = 0x4 + + sysSOL_SOCKET = 0x1 + sysSO_ATTACH_FILTER = 0x1a + + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet = 0x10 + sizeofInetPktinfo = 0xc + sizeofSockExtendedErr = 0x10 + + sizeofIPMreq = 0x8 + sizeofIPMreqn = 0xc + sizeofIPMreqSource = 0xc + sizeofGroupReq = 0x88 + sizeofGroupSourceReq = 0x108 + + sizeofICMPFilter = 0x4 + + sizeofSockFprog = 0x10 +) + +type kernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + X__pad [8]uint8 +} + +type inetPktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type sockExtendedErr struct { + Errno uint32 + Origin uint8 + Type uint8 + Code uint8 + Pad uint8 + Info uint32 + Data uint32 +} + +type ipMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type ipMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type ipMreqSource struct { + Multiaddr uint32 + Interface uint32 + Sourceaddr uint32 +} + +type groupReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage + Source kernelSockaddrStorage +} + +type icmpFilter struct { + Data uint32 +} + +type sockFProg struct { + Len uint16 + Filter *sockFilter +} + +type sockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} diff --git a/vendor/golang.org/x/net/ipv4/zsys_linux_s390x.go b/vendor/golang.org/x/net/ipv4/zsys_linux_s390x.go index 9c967eaa..ee8204da 100644 --- a/vendor/golang.org/x/net/ipv4/zsys_linux_s390x.go +++ b/vendor/golang.org/x/net/ipv4/zsys_linux_s390x.go @@ -1,4 +1,4 @@ -// Created by cgo -godefs - DO NOT EDIT +// Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs defs_linux.go package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/zsys_netbsd.go b/vendor/golang.org/x/net/ipv4/zsys_netbsd.go index fd3624d9..8cfc648a 100644 --- a/vendor/golang.org/x/net/ipv4/zsys_netbsd.go +++ b/vendor/golang.org/x/net/ipv4/zsys_netbsd.go @@ -1,4 +1,4 @@ -// Created by cgo -godefs - DO NOT EDIT +// Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs defs_netbsd.go package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/zsys_openbsd.go b/vendor/golang.org/x/net/ipv4/zsys_openbsd.go index 12f36be7..37629cb0 100644 --- a/vendor/golang.org/x/net/ipv4/zsys_openbsd.go +++ b/vendor/golang.org/x/net/ipv4/zsys_openbsd.go @@ -1,4 +1,4 @@ -// Created by cgo -godefs - DO NOT EDIT +// Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs defs_openbsd.go package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/zsys_solaris.go b/vendor/golang.org/x/net/ipv4/zsys_solaris.go index 0a3875cc..cb80a308 100644 --- a/vendor/golang.org/x/net/ipv4/zsys_solaris.go +++ b/vendor/golang.org/x/net/ipv4/zsys_solaris.go @@ -1,4 +1,4 @@ -// Created by cgo -godefs - DO NOT EDIT +// Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs defs_solaris.go package ipv4 diff --git a/vendor/golang.org/x/net/ipv6/zsys_darwin.go b/vendor/golang.org/x/net/ipv6/zsys_darwin.go index 6aab1dfa..555744af 100644 --- a/vendor/golang.org/x/net/ipv6/zsys_darwin.go +++ b/vendor/golang.org/x/net/ipv6/zsys_darwin.go @@ -1,4 +1,4 @@ -// Created by cgo -godefs - DO NOT EDIT +// Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs defs_darwin.go package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/zsys_dragonfly.go b/vendor/golang.org/x/net/ipv6/zsys_dragonfly.go index d2de804d..cf3cc102 100644 --- a/vendor/golang.org/x/net/ipv6/zsys_dragonfly.go +++ b/vendor/golang.org/x/net/ipv6/zsys_dragonfly.go @@ -1,4 +1,4 @@ -// Created by cgo -godefs - DO NOT EDIT +// Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs defs_dragonfly.go package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/zsys_freebsd_386.go b/vendor/golang.org/x/net/ipv6/zsys_freebsd_386.go index 919e572d..73f31b26 100644 --- a/vendor/golang.org/x/net/ipv6/zsys_freebsd_386.go +++ b/vendor/golang.org/x/net/ipv6/zsys_freebsd_386.go @@ -1,4 +1,4 @@ -// Created by cgo -godefs - DO NOT EDIT +// Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs defs_freebsd.go package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/zsys_freebsd_amd64.go b/vendor/golang.org/x/net/ipv6/zsys_freebsd_amd64.go index cb8141f9..490ce7cf 100644 --- a/vendor/golang.org/x/net/ipv6/zsys_freebsd_amd64.go +++ b/vendor/golang.org/x/net/ipv6/zsys_freebsd_amd64.go @@ -1,4 +1,4 @@ -// Created by cgo -godefs - DO NOT EDIT +// Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs defs_freebsd.go package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/zsys_freebsd_arm.go b/vendor/golang.org/x/net/ipv6/zsys_freebsd_arm.go index cb8141f9..490ce7cf 100644 --- a/vendor/golang.org/x/net/ipv6/zsys_freebsd_arm.go +++ b/vendor/golang.org/x/net/ipv6/zsys_freebsd_arm.go @@ -1,4 +1,4 @@ -// Created by cgo -godefs - DO NOT EDIT +// Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs defs_freebsd.go package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/zsys_linux_386.go b/vendor/golang.org/x/net/ipv6/zsys_linux_386.go index 73aa8c6d..14155dec 100644 --- a/vendor/golang.org/x/net/ipv6/zsys_linux_386.go +++ b/vendor/golang.org/x/net/ipv6/zsys_linux_386.go @@ -1,4 +1,4 @@ -// Created by cgo -godefs - DO NOT EDIT +// Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs defs_linux.go package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/zsys_linux_amd64.go b/vendor/golang.org/x/net/ipv6/zsys_linux_amd64.go index b64f0157..9566d764 100644 --- a/vendor/golang.org/x/net/ipv6/zsys_linux_amd64.go +++ b/vendor/golang.org/x/net/ipv6/zsys_linux_amd64.go @@ -1,4 +1,4 @@ -// Created by cgo -godefs - DO NOT EDIT +// Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs defs_linux.go package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/zsys_linux_arm.go b/vendor/golang.org/x/net/ipv6/zsys_linux_arm.go index 73aa8c6d..14155dec 100644 --- a/vendor/golang.org/x/net/ipv6/zsys_linux_arm.go +++ b/vendor/golang.org/x/net/ipv6/zsys_linux_arm.go @@ -1,4 +1,4 @@ -// Created by cgo -godefs - DO NOT EDIT +// Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs defs_linux.go package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/zsys_linux_arm64.go b/vendor/golang.org/x/net/ipv6/zsys_linux_arm64.go index b64f0157..9566d764 100644 --- a/vendor/golang.org/x/net/ipv6/zsys_linux_arm64.go +++ b/vendor/golang.org/x/net/ipv6/zsys_linux_arm64.go @@ -1,4 +1,4 @@ -// Created by cgo -godefs - DO NOT EDIT +// Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs defs_linux.go package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/zsys_linux_mips.go b/vendor/golang.org/x/net/ipv6/zsys_linux_mips.go index 73aa8c6d..14155dec 100644 --- a/vendor/golang.org/x/net/ipv6/zsys_linux_mips.go +++ b/vendor/golang.org/x/net/ipv6/zsys_linux_mips.go @@ -1,4 +1,4 @@ -// Created by cgo -godefs - DO NOT EDIT +// Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs defs_linux.go package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/zsys_linux_mips64.go b/vendor/golang.org/x/net/ipv6/zsys_linux_mips64.go index b64f0157..9566d764 100644 --- a/vendor/golang.org/x/net/ipv6/zsys_linux_mips64.go +++ b/vendor/golang.org/x/net/ipv6/zsys_linux_mips64.go @@ -1,4 +1,4 @@ -// Created by cgo -godefs - DO NOT EDIT +// Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs defs_linux.go package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/zsys_linux_mips64le.go b/vendor/golang.org/x/net/ipv6/zsys_linux_mips64le.go index b64f0157..9566d764 100644 --- a/vendor/golang.org/x/net/ipv6/zsys_linux_mips64le.go +++ b/vendor/golang.org/x/net/ipv6/zsys_linux_mips64le.go @@ -1,4 +1,4 @@ -// Created by cgo -godefs - DO NOT EDIT +// Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs defs_linux.go package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/zsys_linux_mipsle.go b/vendor/golang.org/x/net/ipv6/zsys_linux_mipsle.go index 73aa8c6d..14155dec 100644 --- a/vendor/golang.org/x/net/ipv6/zsys_linux_mipsle.go +++ b/vendor/golang.org/x/net/ipv6/zsys_linux_mipsle.go @@ -1,4 +1,4 @@ -// Created by cgo -godefs - DO NOT EDIT +// Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs defs_linux.go package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/zsys_linux_ppc.go b/vendor/golang.org/x/net/ipv6/zsys_linux_ppc.go index c9bf6a87..a51e142b 100644 --- a/vendor/golang.org/x/net/ipv6/zsys_linux_ppc.go +++ b/vendor/golang.org/x/net/ipv6/zsys_linux_ppc.go @@ -1,4 +1,4 @@ -// Created by cgo -godefs - DO NOT EDIT +// Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs defs_linux.go package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/zsys_linux_ppc64.go b/vendor/golang.org/x/net/ipv6/zsys_linux_ppc64.go index b64f0157..9566d764 100644 --- a/vendor/golang.org/x/net/ipv6/zsys_linux_ppc64.go +++ b/vendor/golang.org/x/net/ipv6/zsys_linux_ppc64.go @@ -1,4 +1,4 @@ -// Created by cgo -godefs - DO NOT EDIT +// Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs defs_linux.go package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/zsys_linux_ppc64le.go b/vendor/golang.org/x/net/ipv6/zsys_linux_ppc64le.go index b64f0157..9566d764 100644 --- a/vendor/golang.org/x/net/ipv6/zsys_linux_ppc64le.go +++ b/vendor/golang.org/x/net/ipv6/zsys_linux_ppc64le.go @@ -1,4 +1,4 @@ -// Created by cgo -godefs - DO NOT EDIT +// Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs defs_linux.go package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/zsys_linux_riscv64.go b/vendor/golang.org/x/net/ipv6/zsys_linux_riscv64.go new file mode 100644 index 00000000..1ee237b2 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/zsys_linux_riscv64.go @@ -0,0 +1,173 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs defs_linux.go + +// +build riscv64 + +package ipv6 + +const ( + sysIPV6_ADDRFORM = 0x1 + sysIPV6_2292PKTINFO = 0x2 + sysIPV6_2292HOPOPTS = 0x3 + sysIPV6_2292DSTOPTS = 0x4 + sysIPV6_2292RTHDR = 0x5 + sysIPV6_2292PKTOPTIONS = 0x6 + sysIPV6_CHECKSUM = 0x7 + sysIPV6_2292HOPLIMIT = 0x8 + sysIPV6_NEXTHOP = 0x9 + sysIPV6_FLOWINFO = 0xb + + sysIPV6_UNICAST_HOPS = 0x10 + sysIPV6_MULTICAST_IF = 0x11 + sysIPV6_MULTICAST_HOPS = 0x12 + sysIPV6_MULTICAST_LOOP = 0x13 + sysIPV6_ADD_MEMBERSHIP = 0x14 + sysIPV6_DROP_MEMBERSHIP = 0x15 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIPV6_ROUTER_ALERT = 0x16 + sysIPV6_MTU_DISCOVER = 0x17 + sysIPV6_MTU = 0x18 + sysIPV6_RECVERR = 0x19 + sysIPV6_V6ONLY = 0x1a + sysIPV6_JOIN_ANYCAST = 0x1b + sysIPV6_LEAVE_ANYCAST = 0x1c + + sysIPV6_FLOWLABEL_MGR = 0x20 + sysIPV6_FLOWINFO_SEND = 0x21 + + sysIPV6_IPSEC_POLICY = 0x22 + sysIPV6_XFRM_POLICY = 0x23 + + sysIPV6_RECVPKTINFO = 0x31 + sysIPV6_PKTINFO = 0x32 + sysIPV6_RECVHOPLIMIT = 0x33 + sysIPV6_HOPLIMIT = 0x34 + sysIPV6_RECVHOPOPTS = 0x35 + sysIPV6_HOPOPTS = 0x36 + sysIPV6_RTHDRDSTOPTS = 0x37 + sysIPV6_RECVRTHDR = 0x38 + sysIPV6_RTHDR = 0x39 + sysIPV6_RECVDSTOPTS = 0x3a + sysIPV6_DSTOPTS = 0x3b + sysIPV6_RECVPATHMTU = 0x3c + sysIPV6_PATHMTU = 0x3d + sysIPV6_DONTFRAG = 0x3e + + sysIPV6_RECVTCLASS = 0x42 + sysIPV6_TCLASS = 0x43 + + sysIPV6_ADDR_PREFERENCES = 0x48 + + sysIPV6_PREFER_SRC_TMP = 0x1 + sysIPV6_PREFER_SRC_PUBLIC = 0x2 + sysIPV6_PREFER_SRC_PUBTMP_DEFAULT = 0x100 + sysIPV6_PREFER_SRC_COA = 0x4 + sysIPV6_PREFER_SRC_HOME = 0x400 + sysIPV6_PREFER_SRC_CGA = 0x8 + sysIPV6_PREFER_SRC_NONCGA = 0x800 + + sysIPV6_MINHOPCOUNT = 0x49 + + sysIPV6_ORIGDSTADDR = 0x4a + sysIPV6_RECVORIGDSTADDR = 0x4a + sysIPV6_TRANSPARENT = 0x4b + sysIPV6_UNICAST_IF = 0x4c + + sysICMPV6_FILTER = 0x1 + + sysICMPV6_FILTER_BLOCK = 0x1 + sysICMPV6_FILTER_PASS = 0x2 + sysICMPV6_FILTER_BLOCKOTHERS = 0x3 + sysICMPV6_FILTER_PASSONLY = 0x4 + + sysSOL_SOCKET = 0x1 + sysSO_ATTACH_FILTER = 0x1a + + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet6 = 0x1c + sizeofInet6Pktinfo = 0x14 + sizeofIPv6Mtuinfo = 0x20 + sizeofIPv6FlowlabelReq = 0x20 + + sizeofIPv6Mreq = 0x14 + sizeofGroupReq = 0x88 + sizeofGroupSourceReq = 0x108 + + sizeofICMPv6Filter = 0x20 + + sizeofSockFprog = 0x10 +) + +type kernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex int32 +} + +type ipv6Mtuinfo struct { + Addr sockaddrInet6 + Mtu uint32 +} + +type ipv6FlowlabelReq struct { + Dst [16]byte /* in6_addr */ + Label uint32 + Action uint8 + Share uint8 + Flags uint16 + Expires uint16 + Linger uint16 + X__flr_pad uint32 +} + +type ipv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Ifindex int32 +} + +type groupReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage + Source kernelSockaddrStorage +} + +type icmpv6Filter struct { + Data [8]uint32 +} + +type sockFProg struct { + Len uint16 + Filter *sockFilter +} + +type sockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} diff --git a/vendor/golang.org/x/net/ipv6/zsys_linux_s390x.go b/vendor/golang.org/x/net/ipv6/zsys_linux_s390x.go index b64f0157..9566d764 100644 --- a/vendor/golang.org/x/net/ipv6/zsys_linux_s390x.go +++ b/vendor/golang.org/x/net/ipv6/zsys_linux_s390x.go @@ -1,4 +1,4 @@ -// Created by cgo -godefs - DO NOT EDIT +// Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs defs_linux.go package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/zsys_netbsd.go b/vendor/golang.org/x/net/ipv6/zsys_netbsd.go index bcada13b..e39571e0 100644 --- a/vendor/golang.org/x/net/ipv6/zsys_netbsd.go +++ b/vendor/golang.org/x/net/ipv6/zsys_netbsd.go @@ -1,4 +1,4 @@ -// Created by cgo -godefs - DO NOT EDIT +// Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs defs_netbsd.go package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/zsys_openbsd.go b/vendor/golang.org/x/net/ipv6/zsys_openbsd.go index 86cf3c63..cc1899a6 100644 --- a/vendor/golang.org/x/net/ipv6/zsys_openbsd.go +++ b/vendor/golang.org/x/net/ipv6/zsys_openbsd.go @@ -1,4 +1,4 @@ -// Created by cgo -godefs - DO NOT EDIT +// Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs defs_openbsd.go package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/zsys_solaris.go b/vendor/golang.org/x/net/ipv6/zsys_solaris.go index cf1837dd..690eef93 100644 --- a/vendor/golang.org/x/net/ipv6/zsys_solaris.go +++ b/vendor/golang.org/x/net/ipv6/zsys_solaris.go @@ -1,4 +1,4 @@ -// Created by cgo -godefs - DO NOT EDIT +// Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs defs_solaris.go package ipv6 diff --git a/vendor/golang.org/x/sys/cpu/asm_aix_ppc64.s b/vendor/golang.org/x/sys/cpu/asm_aix_ppc64.s new file mode 100644 index 00000000..06f84b85 --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/asm_aix_ppc64.s @@ -0,0 +1,17 @@ +// 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 !gccgo + +#include "textflag.h" + +// +// System calls for ppc64, AIX are implemented in runtime/syscall_aix.go +// + +TEXT ·syscall6(SB),NOSPLIT,$0-88 + JMP syscall·syscall6(SB) + +TEXT ·rawSyscall6(SB),NOSPLIT,$0-88 + JMP syscall·rawSyscall6(SB) diff --git a/vendor/golang.org/x/sys/cpu/cpu_aix_ppc64.go b/vendor/golang.org/x/sys/cpu/cpu_aix_ppc64.go index d8c26a04..be602722 100644 --- a/vendor/golang.org/x/sys/cpu/cpu_aix_ppc64.go +++ b/vendor/golang.org/x/sys/cpu/cpu_aix_ppc64.go @@ -6,8 +6,6 @@ package cpu -import "golang.org/x/sys/unix" - const cacheLineSize = 128 const ( @@ -18,7 +16,7 @@ const ( ) func init() { - impl := unix.Getsystemcfg(_SC_IMPL) + impl := getsystemcfg(_SC_IMPL) if impl&_IMPL_POWER8 != 0 { PPC64.IsPOWER8 = true } @@ -28,3 +26,9 @@ func init() { Initialized = true } + +func getsystemcfg(label int) (n uint64) { + r0, _ := callgetsystemcfg(label) + n = uint64(r0) + return +} diff --git a/vendor/golang.org/x/sys/cpu/syscall_aix_ppc64_gc.go b/vendor/golang.org/x/sys/cpu/syscall_aix_ppc64_gc.go new file mode 100644 index 00000000..78fe25e8 --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/syscall_aix_ppc64_gc.go @@ -0,0 +1,36 @@ +// Copyright 2019 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. + +// Minimal copy of x/sys/unix so the cpu package can make a +// system call on AIX without depending on x/sys/unix. +// (See golang.org/issue/32102) + +// +build aix,ppc64 +// +build !gccgo + +package cpu + +import ( + "syscall" + "unsafe" +) + +//go:cgo_import_dynamic libc_getsystemcfg getsystemcfg "libc.a/shr_64.o" + +//go:linkname libc_getsystemcfg libc_getsystemcfg + +type syscallFunc uintptr + +var libc_getsystemcfg syscallFunc + +type errno = syscall.Errno + +// Implemented in runtime/syscall_aix.go. +func rawSyscall6(trap, nargs, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err errno) +func syscall6(trap, nargs, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err errno) + +func callgetsystemcfg(label int) (r1 uintptr, e1 errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_getsystemcfg)), 1, uintptr(label), 0, 0, 0, 0, 0) + return +} diff --git a/vendor/golang.org/x/sys/unix/asm_linux_riscv64.s b/vendor/golang.org/x/sys/unix/asm_linux_riscv64.s new file mode 100644 index 00000000..6db717de --- /dev/null +++ b/vendor/golang.org/x/sys/unix/asm_linux_riscv64.s @@ -0,0 +1,54 @@ +// Copyright 2019 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 riscv64,!gccgo + +#include "textflag.h" + +// +// System calls for linux/riscv64. +// +// Where available, just jump to package syscall's implementation of +// these functions. + +TEXT ·Syscall(SB),NOSPLIT,$0-56 + JMP syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-80 + JMP syscall·Syscall6(SB) + +TEXT ·SyscallNoError(SB),NOSPLIT,$0-48 + CALL runtime·entersyscall(SB) + MOV a1+8(FP), A0 + MOV a2+16(FP), A1 + MOV a3+24(FP), A2 + MOV $0, A3 + MOV $0, A4 + MOV $0, A5 + MOV $0, A6 + MOV trap+0(FP), A7 // syscall entry + ECALL + MOV A0, r1+32(FP) // r1 + MOV A1, r2+40(FP) // r2 + CALL runtime·exitsyscall(SB) + RET + +TEXT ·RawSyscall(SB),NOSPLIT,$0-56 + JMP syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-80 + JMP syscall·RawSyscall6(SB) + +TEXT ·RawSyscallNoError(SB),NOSPLIT,$0-48 + MOV a1+8(FP), A0 + MOV a2+16(FP), A1 + MOV a3+24(FP), A2 + MOV ZERO, A3 + MOV ZERO, A4 + MOV ZERO, A5 + MOV trap+0(FP), A7 // syscall entry + ECALL + MOV A0, r1+32(FP) + MOV A1, r2+40(FP) + RET diff --git a/vendor/golang.org/x/sys/unix/asm_openbsd_arm64.s b/vendor/golang.org/x/sys/unix/asm_openbsd_arm64.s new file mode 100644 index 00000000..0cedea3d --- /dev/null +++ b/vendor/golang.org/x/sys/unix/asm_openbsd_arm64.s @@ -0,0 +1,29 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !gccgo + +#include "textflag.h" + +// +// System call support for arm64, OpenBSD +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-56 + JMP syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-80 + JMP syscall·Syscall6(SB) + +TEXT ·Syscall9(SB),NOSPLIT,$0-104 + JMP syscall·Syscall9(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-56 + JMP syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-80 + JMP syscall·RawSyscall6(SB) diff --git a/vendor/golang.org/x/sys/unix/mkall.sh b/vendor/golang.org/x/sys/unix/mkall.sh index 1e5c59d0..5a22eca9 100755 --- a/vendor/golang.org/x/sys/unix/mkall.sh +++ b/vendor/golang.org/x/sys/unix/mkall.sh @@ -105,25 +105,25 @@ dragonfly_amd64) freebsd_386) mkerrors="$mkerrors -m32" mksyscall="go run mksyscall.go -l32" - mksysnum="go run mksysnum.go 'https://svn.freebsd.org/base/stable/10/sys/kern/syscalls.master'" + mksysnum="go run mksysnum.go 'https://svn.freebsd.org/base/stable/11/sys/kern/syscalls.master'" mktypes="GOARCH=$GOARCH go tool cgo -godefs" ;; freebsd_amd64) mkerrors="$mkerrors -m64" - mksysnum="go run mksysnum.go 'https://svn.freebsd.org/base/stable/10/sys/kern/syscalls.master'" + mksysnum="go run mksysnum.go 'https://svn.freebsd.org/base/stable/11/sys/kern/syscalls.master'" mktypes="GOARCH=$GOARCH go tool cgo -godefs" ;; freebsd_arm) mkerrors="$mkerrors" mksyscall="go run mksyscall.go -l32 -arm" - mksysnum="go run mksysnum.go 'https://svn.freebsd.org/base/stable/10/sys/kern/syscalls.master'" + mksysnum="go run mksysnum.go 'https://svn.freebsd.org/base/stable/11/sys/kern/syscalls.master'" # Let the type of C char be signed for making the bare syscall # API consistent across platforms. mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char" ;; freebsd_arm64) mkerrors="$mkerrors -m64" - mksysnum="go run mksysnum.go 'https://svn.freebsd.org/base/stable/10/sys/kern/syscalls.master'" + mksysnum="go run mksysnum.go 'https://svn.freebsd.org/base/stable/11/sys/kern/syscalls.master'" mktypes="GOARCH=$GOARCH go tool cgo -godefs" ;; netbsd_386) @@ -146,24 +146,39 @@ netbsd_arm) # API consistent across platforms. mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char" ;; +netbsd_arm64) + mkerrors="$mkerrors -m64" + mksyscall="go run mksyscall.go -netbsd" + mksysnum="go run mksysnum.go 'http://cvsweb.netbsd.org/bsdweb.cgi/~checkout~/src/sys/kern/syscalls.master'" + mktypes="GOARCH=$GOARCH go tool cgo -godefs" + ;; openbsd_386) mkerrors="$mkerrors -m32" mksyscall="go run mksyscall.go -l32 -openbsd" - mksysctl="./mksysctl_openbsd.pl" + mksysctl="go run mksysctl_openbsd.go" mksysnum="go run mksysnum.go 'https://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master'" mktypes="GOARCH=$GOARCH go tool cgo -godefs" ;; openbsd_amd64) mkerrors="$mkerrors -m64" mksyscall="go run mksyscall.go -openbsd" - mksysctl="./mksysctl_openbsd.pl" + mksysctl="go run mksysctl_openbsd.go" mksysnum="go run mksysnum.go 'https://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master'" mktypes="GOARCH=$GOARCH go tool cgo -godefs" ;; openbsd_arm) mkerrors="$mkerrors" mksyscall="go run mksyscall.go -l32 -openbsd -arm" - mksysctl="./mksysctl_openbsd.pl" + mksysctl="go run mksysctl_openbsd.go" + mksysnum="go run mksysnum.go 'https://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master'" + # Let the type of C char be signed for making the bare syscall + # API consistent across platforms. + mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char" + ;; +openbsd_arm64) + mkerrors="$mkerrors -m64" + mksyscall="go run mksyscall.go -openbsd" + mksysctl="go run mksysctl_openbsd.go" mksysnum="go run mksysnum.go 'https://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master'" # Let the type of C char be signed for making the bare syscall # API consistent across platforms. diff --git a/vendor/golang.org/x/sys/unix/mkerrors.sh b/vendor/golang.org/x/sys/unix/mkerrors.sh index cfb61ba0..4c91159c 100755 --- a/vendor/golang.org/x/sys/unix/mkerrors.sh +++ b/vendor/golang.org/x/sys/unix/mkerrors.sh @@ -182,6 +182,7 @@ struct ltchars { #include #include #include +#include #include #include #include @@ -222,6 +223,7 @@ struct ltchars { #include #include #include +#include #include #include @@ -432,7 +434,7 @@ ccflags="$@" $2 ~ /^TC[IO](ON|OFF)$/ || $2 ~ /^IN_/ || $2 ~ /^LOCK_(SH|EX|NB|UN)$/ || - $2 ~ /^(AF|SOCK|SO|SOL|IPPROTO|IP|IPV6|ICMP6|TCP|EVFILT|NOTE|EV|SHUT|PROT|MAP|MFD|T?PACKET|MSG|SCM|MCL|DT|MADV|PR)_/ || + $2 ~ /^(AF|SOCK|SO|SOL|IPPROTO|IP|IPV6|ICMP6|TCP|MCAST|EVFILT|NOTE|EV|SHUT|PROT|MAP|MFD|T?PACKET|MSG|SCM|MCL|DT|MADV|PR)_/ || $2 ~ /^TP_STATUS_/ || $2 ~ /^FALLOC_/ || $2 == "ICMPV6_FILTER" || @@ -465,7 +467,7 @@ ccflags="$@" $2 ~ /^RLIMIT_(AS|CORE|CPU|DATA|FSIZE|LOCKS|MEMLOCK|MSGQUEUE|NICE|NOFILE|NPROC|RSS|RTPRIO|RTTIME|SIGPENDING|STACK)|RLIM_INFINITY/ || $2 ~ /^PRIO_(PROCESS|PGRP|USER)/ || $2 ~ /^CLONE_[A-Z_]+/ || - $2 !~ /^(BPF_TIMEVAL)$/ && + $2 !~ /^(BPF_TIMEVAL|BPF_FIB_LOOKUP_[A-Z]+)$/ && $2 ~ /^(BPF|DLT)_/ || $2 ~ /^(CLOCK|TIMER)_/ || $2 ~ /^CAN_/ || @@ -499,6 +501,7 @@ ccflags="$@" $2 ~ /^NFN/ || $2 ~ /^XDP_/ || $2 ~ /^(HDIO|WIN|SMART)_/ || + $2 ~ /^CRYPTO_/ || $2 !~ "WMESGLEN" && $2 ~ /^W[A-Z0-9]+$/ || $2 ~/^PPPIOC/ || diff --git a/vendor/golang.org/x/sys/unix/mkpost.go b/vendor/golang.org/x/sys/unix/mkpost.go index 9feddd00..4d5b531b 100644 --- a/vendor/golang.org/x/sys/unix/mkpost.go +++ b/vendor/golang.org/x/sys/unix/mkpost.go @@ -42,6 +42,13 @@ func main() { log.Fatal(err) } + if goos == "aix" { + // Replace type of Atim, Mtim and Ctim by Timespec in Stat_t + // to avoid having both StTimespec and Timespec. + sttimespec := regexp.MustCompile(`_Ctype_struct_st_timespec`) + b = sttimespec.ReplaceAll(b, []byte("Timespec")) + } + // Intentionally export __val fields in Fsid and Sigset_t valRegex := regexp.MustCompile(`type (Fsid|Sigset_t) struct {(\s+)X__val(\s+\S+\s+)}`) b = valRegex.ReplaceAll(b, []byte("type $1 struct {${2}Val$3}")) @@ -96,6 +103,15 @@ func main() { cgoCommandRegex := regexp.MustCompile(`(cgo -godefs .*)`) b = cgoCommandRegex.ReplaceAll(b, []byte(replacement)) + // Rename Stat_t time fields + if goos == "freebsd" && goarch == "386" { + // Hide Stat_t.[AMCB]tim_ext fields + renameStatTimeExtFieldsRegex := regexp.MustCompile(`[AMCB]tim_ext`) + b = renameStatTimeExtFieldsRegex.ReplaceAll(b, []byte("_")) + } + renameStatTimeFieldsRegex := regexp.MustCompile(`([AMCB])(?:irth)?time?(?:spec)?\s+(Timespec|StTimespec)`) + b = renameStatTimeFieldsRegex.ReplaceAll(b, []byte("${1}tim ${2}")) + // gofmt b, err = format.Source(b) if err != nil { diff --git a/vendor/golang.org/x/sys/unix/mksysctl_openbsd.go b/vendor/golang.org/x/sys/unix/mksysctl_openbsd.go new file mode 100644 index 00000000..b6b40990 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/mksysctl_openbsd.go @@ -0,0 +1,355 @@ +// Copyright 2019 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 + +// Parse the header files for OpenBSD and generate a Go usable sysctl MIB. +// +// Build a MIB with each entry being an array containing the level, type and +// a hash that will contain additional entries if the current entry is a node. +// We then walk this MIB and create a flattened sysctl name to OID hash. + +package main + +import ( + "bufio" + "fmt" + "os" + "path/filepath" + "regexp" + "sort" + "strings" +) + +var ( + goos, goarch string +) + +// cmdLine returns this programs's commandline arguments. +func cmdLine() string { + return "go run mksysctl_openbsd.go " + strings.Join(os.Args[1:], " ") +} + +// buildTags returns build tags. +func buildTags() string { + return fmt.Sprintf("%s,%s", goarch, goos) +} + +// reMatch performs regular expression match and stores the substring slice to value pointed by m. +func reMatch(re *regexp.Regexp, str string, m *[]string) bool { + *m = re.FindStringSubmatch(str) + if *m != nil { + return true + } + return false +} + +type nodeElement struct { + n int + t string + pE *map[string]nodeElement +} + +var ( + debugEnabled bool + mib map[string]nodeElement + node *map[string]nodeElement + nodeMap map[string]string + sysCtl []string +) + +var ( + ctlNames1RE = regexp.MustCompile(`^#define\s+(CTL_NAMES)\s+{`) + ctlNames2RE = regexp.MustCompile(`^#define\s+(CTL_(.*)_NAMES)\s+{`) + ctlNames3RE = regexp.MustCompile(`^#define\s+((.*)CTL_NAMES)\s+{`) + netInetRE = regexp.MustCompile(`^netinet/`) + netInet6RE = regexp.MustCompile(`^netinet6/`) + netRE = regexp.MustCompile(`^net/`) + bracesRE = regexp.MustCompile(`{.*}`) + ctlTypeRE = regexp.MustCompile(`{\s+"(\w+)",\s+(CTLTYPE_[A-Z]+)\s+}`) + fsNetKernRE = regexp.MustCompile(`^(fs|net|kern)_`) +) + +func debug(s string) { + if debugEnabled { + fmt.Fprintln(os.Stderr, s) + } +} + +// Walk the MIB and build a sysctl name to OID mapping. +func buildSysctl(pNode *map[string]nodeElement, name string, oid []int) { + lNode := pNode // local copy of pointer to node + var keys []string + for k := range *lNode { + keys = append(keys, k) + } + sort.Strings(keys) + + for _, key := range keys { + nodename := name + if name != "" { + nodename += "." + } + nodename += key + + nodeoid := append(oid, (*pNode)[key].n) + + if (*pNode)[key].t == `CTLTYPE_NODE` { + if _, ok := nodeMap[nodename]; ok { + lNode = &mib + ctlName := nodeMap[nodename] + for _, part := range strings.Split(ctlName, ".") { + lNode = ((*lNode)[part]).pE + } + } else { + lNode = (*pNode)[key].pE + } + buildSysctl(lNode, nodename, nodeoid) + } else if (*pNode)[key].t != "" { + oidStr := []string{} + for j := range nodeoid { + oidStr = append(oidStr, fmt.Sprintf("%d", nodeoid[j])) + } + text := "\t{ \"" + nodename + "\", []_C_int{ " + strings.Join(oidStr, ", ") + " } }, \n" + sysCtl = append(sysCtl, text) + } + } +} + +func main() { + // Get the OS (using GOOS_TARGET if it exist) + goos = os.Getenv("GOOS_TARGET") + if goos == "" { + goos = os.Getenv("GOOS") + } + // Get the architecture (using GOARCH_TARGET if it exists) + goarch = os.Getenv("GOARCH_TARGET") + if goarch == "" { + goarch = os.Getenv("GOARCH") + } + // Check if GOOS and GOARCH environment variables are defined + if goarch == "" || goos == "" { + fmt.Fprintf(os.Stderr, "GOARCH or GOOS not defined in environment\n") + os.Exit(1) + } + + mib = make(map[string]nodeElement) + headers := [...]string{ + `sys/sysctl.h`, + `sys/socket.h`, + `sys/tty.h`, + `sys/malloc.h`, + `sys/mount.h`, + `sys/namei.h`, + `sys/sem.h`, + `sys/shm.h`, + `sys/vmmeter.h`, + `uvm/uvmexp.h`, + `uvm/uvm_param.h`, + `uvm/uvm_swap_encrypt.h`, + `ddb/db_var.h`, + `net/if.h`, + `net/if_pfsync.h`, + `net/pipex.h`, + `netinet/in.h`, + `netinet/icmp_var.h`, + `netinet/igmp_var.h`, + `netinet/ip_ah.h`, + `netinet/ip_carp.h`, + `netinet/ip_divert.h`, + `netinet/ip_esp.h`, + `netinet/ip_ether.h`, + `netinet/ip_gre.h`, + `netinet/ip_ipcomp.h`, + `netinet/ip_ipip.h`, + `netinet/pim_var.h`, + `netinet/tcp_var.h`, + `netinet/udp_var.h`, + `netinet6/in6.h`, + `netinet6/ip6_divert.h`, + `netinet6/pim6_var.h`, + `netinet/icmp6.h`, + `netmpls/mpls.h`, + } + + ctls := [...]string{ + `kern`, + `vm`, + `fs`, + `net`, + //debug /* Special handling required */ + `hw`, + //machdep /* Arch specific */ + `user`, + `ddb`, + //vfs /* Special handling required */ + `fs.posix`, + `kern.forkstat`, + `kern.intrcnt`, + `kern.malloc`, + `kern.nchstats`, + `kern.seminfo`, + `kern.shminfo`, + `kern.timecounter`, + `kern.tty`, + `kern.watchdog`, + `net.bpf`, + `net.ifq`, + `net.inet`, + `net.inet.ah`, + `net.inet.carp`, + `net.inet.divert`, + `net.inet.esp`, + `net.inet.etherip`, + `net.inet.gre`, + `net.inet.icmp`, + `net.inet.igmp`, + `net.inet.ip`, + `net.inet.ip.ifq`, + `net.inet.ipcomp`, + `net.inet.ipip`, + `net.inet.mobileip`, + `net.inet.pfsync`, + `net.inet.pim`, + `net.inet.tcp`, + `net.inet.udp`, + `net.inet6`, + `net.inet6.divert`, + `net.inet6.ip6`, + `net.inet6.icmp6`, + `net.inet6.pim6`, + `net.inet6.tcp6`, + `net.inet6.udp6`, + `net.mpls`, + `net.mpls.ifq`, + `net.key`, + `net.pflow`, + `net.pfsync`, + `net.pipex`, + `net.rt`, + `vm.swapencrypt`, + //vfsgenctl /* Special handling required */ + } + + // Node name "fixups" + ctlMap := map[string]string{ + "ipproto": "net.inet", + "net.inet.ipproto": "net.inet", + "net.inet6.ipv6proto": "net.inet6", + "net.inet6.ipv6": "net.inet6.ip6", + "net.inet.icmpv6": "net.inet6.icmp6", + "net.inet6.divert6": "net.inet6.divert", + "net.inet6.tcp6": "net.inet.tcp", + "net.inet6.udp6": "net.inet.udp", + "mpls": "net.mpls", + "swpenc": "vm.swapencrypt", + } + + // Node mappings + nodeMap = map[string]string{ + "net.inet.ip.ifq": "net.ifq", + "net.inet.pfsync": "net.pfsync", + "net.mpls.ifq": "net.ifq", + } + + mCtls := make(map[string]bool) + for _, ctl := range ctls { + mCtls[ctl] = true + } + + for _, header := range headers { + debug("Processing " + header) + file, err := os.Open(filepath.Join("/usr/include", header)) + if err != nil { + fmt.Fprintf(os.Stderr, "%v\n", err) + os.Exit(1) + } + s := bufio.NewScanner(file) + for s.Scan() { + var sub []string + if reMatch(ctlNames1RE, s.Text(), &sub) || + reMatch(ctlNames2RE, s.Text(), &sub) || + reMatch(ctlNames3RE, s.Text(), &sub) { + if sub[1] == `CTL_NAMES` { + // Top level. + node = &mib + } else { + // Node. + nodename := strings.ToLower(sub[2]) + ctlName := "" + if reMatch(netInetRE, header, &sub) { + ctlName = "net.inet." + nodename + } else if reMatch(netInet6RE, header, &sub) { + ctlName = "net.inet6." + nodename + } else if reMatch(netRE, header, &sub) { + ctlName = "net." + nodename + } else { + ctlName = nodename + ctlName = fsNetKernRE.ReplaceAllString(ctlName, `$1.`) + } + + if val, ok := ctlMap[ctlName]; ok { + ctlName = val + } + if _, ok := mCtls[ctlName]; !ok { + debug("Ignoring " + ctlName + "...") + continue + } + + // Walk down from the top of the MIB. + node = &mib + for _, part := range strings.Split(ctlName, ".") { + if _, ok := (*node)[part]; !ok { + debug("Missing node " + part) + (*node)[part] = nodeElement{n: 0, t: "", pE: &map[string]nodeElement{}} + } + node = (*node)[part].pE + } + } + + // Populate current node with entries. + i := -1 + for !strings.HasPrefix(s.Text(), "}") { + s.Scan() + if reMatch(bracesRE, s.Text(), &sub) { + i++ + } + if !reMatch(ctlTypeRE, s.Text(), &sub) { + continue + } + (*node)[sub[1]] = nodeElement{n: i, t: sub[2], pE: &map[string]nodeElement{}} + } + } + } + err = s.Err() + if err != nil { + fmt.Fprintf(os.Stderr, "%v\n", err) + os.Exit(1) + } + file.Close() + } + buildSysctl(&mib, "", []int{}) + + sort.Strings(sysCtl) + text := strings.Join(sysCtl, "") + + fmt.Printf(srcTemplate, cmdLine(), buildTags(), text) +} + +const srcTemplate = `// %s +// Code generated by the command above; DO NOT EDIT. + +// +build %s + +package unix + +type mibentry struct { + ctlname string + ctloid []_C_int +} + +var sysctlMib = []mibentry { +%s +} +` diff --git a/vendor/golang.org/x/sys/unix/mksysctl_openbsd.pl b/vendor/golang.org/x/sys/unix/mksysctl_openbsd.pl deleted file mode 100755 index 20632e14..00000000 --- a/vendor/golang.org/x/sys/unix/mksysctl_openbsd.pl +++ /dev/null @@ -1,265 +0,0 @@ -#!/usr/bin/env perl - -# 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. - -# -# Parse the header files for OpenBSD and generate a Go usable sysctl MIB. -# -# Build a MIB with each entry being an array containing the level, type and -# a hash that will contain additional entries if the current entry is a node. -# We then walk this MIB and create a flattened sysctl name to OID hash. -# - -use strict; - -if($ENV{'GOARCH'} eq "" || $ENV{'GOOS'} eq "") { - print STDERR "GOARCH or GOOS not defined in environment\n"; - exit 1; -} - -my $debug = 0; -my %ctls = (); - -my @headers = qw ( - sys/sysctl.h - sys/socket.h - sys/tty.h - sys/malloc.h - sys/mount.h - sys/namei.h - sys/sem.h - sys/shm.h - sys/vmmeter.h - uvm/uvmexp.h - uvm/uvm_param.h - uvm/uvm_swap_encrypt.h - ddb/db_var.h - net/if.h - net/if_pfsync.h - net/pipex.h - netinet/in.h - netinet/icmp_var.h - netinet/igmp_var.h - netinet/ip_ah.h - netinet/ip_carp.h - netinet/ip_divert.h - netinet/ip_esp.h - netinet/ip_ether.h - netinet/ip_gre.h - netinet/ip_ipcomp.h - netinet/ip_ipip.h - netinet/pim_var.h - netinet/tcp_var.h - netinet/udp_var.h - netinet6/in6.h - netinet6/ip6_divert.h - netinet6/pim6_var.h - netinet/icmp6.h - netmpls/mpls.h -); - -my @ctls = qw ( - kern - vm - fs - net - #debug # Special handling required - hw - #machdep # Arch specific - user - ddb - #vfs # Special handling required - fs.posix - kern.forkstat - kern.intrcnt - kern.malloc - kern.nchstats - kern.seminfo - kern.shminfo - kern.timecounter - kern.tty - kern.watchdog - net.bpf - net.ifq - net.inet - net.inet.ah - net.inet.carp - net.inet.divert - net.inet.esp - net.inet.etherip - net.inet.gre - net.inet.icmp - net.inet.igmp - net.inet.ip - net.inet.ip.ifq - net.inet.ipcomp - net.inet.ipip - net.inet.mobileip - net.inet.pfsync - net.inet.pim - net.inet.tcp - net.inet.udp - net.inet6 - net.inet6.divert - net.inet6.ip6 - net.inet6.icmp6 - net.inet6.pim6 - net.inet6.tcp6 - net.inet6.udp6 - net.mpls - net.mpls.ifq - net.key - net.pflow - net.pfsync - net.pipex - net.rt - vm.swapencrypt - #vfsgenctl # Special handling required -); - -# Node name "fixups" -my %ctl_map = ( - "ipproto" => "net.inet", - "net.inet.ipproto" => "net.inet", - "net.inet6.ipv6proto" => "net.inet6", - "net.inet6.ipv6" => "net.inet6.ip6", - "net.inet.icmpv6" => "net.inet6.icmp6", - "net.inet6.divert6" => "net.inet6.divert", - "net.inet6.tcp6" => "net.inet.tcp", - "net.inet6.udp6" => "net.inet.udp", - "mpls" => "net.mpls", - "swpenc" => "vm.swapencrypt" -); - -# Node mappings -my %node_map = ( - "net.inet.ip.ifq" => "net.ifq", - "net.inet.pfsync" => "net.pfsync", - "net.mpls.ifq" => "net.ifq" -); - -my $ctlname; -my %mib = (); -my %sysctl = (); -my $node; - -sub debug() { - print STDERR "$_[0]\n" if $debug; -} - -# Walk the MIB and build a sysctl name to OID mapping. -sub build_sysctl() { - my ($node, $name, $oid) = @_; - my %node = %{$node}; - my @oid = @{$oid}; - - foreach my $key (sort keys %node) { - my @node = @{$node{$key}}; - my $nodename = $name.($name ne '' ? '.' : '').$key; - my @nodeoid = (@oid, $node[0]); - if ($node[1] eq 'CTLTYPE_NODE') { - if (exists $node_map{$nodename}) { - $node = \%mib; - $ctlname = $node_map{$nodename}; - foreach my $part (split /\./, $ctlname) { - $node = \%{@{$$node{$part}}[2]}; - } - } else { - $node = $node[2]; - } - &build_sysctl($node, $nodename, \@nodeoid); - } elsif ($node[1] ne '') { - $sysctl{$nodename} = \@nodeoid; - } - } -} - -foreach my $ctl (@ctls) { - $ctls{$ctl} = $ctl; -} - -# Build MIB -foreach my $header (@headers) { - &debug("Processing $header..."); - open HEADER, "/usr/include/$header" || - print STDERR "Failed to open $header\n"; - while (
) { - if ($_ =~ /^#define\s+(CTL_NAMES)\s+{/ || - $_ =~ /^#define\s+(CTL_(.*)_NAMES)\s+{/ || - $_ =~ /^#define\s+((.*)CTL_NAMES)\s+{/) { - if ($1 eq 'CTL_NAMES') { - # Top level. - $node = \%mib; - } else { - # Node. - my $nodename = lc($2); - if ($header =~ /^netinet\//) { - $ctlname = "net.inet.$nodename"; - } elsif ($header =~ /^netinet6\//) { - $ctlname = "net.inet6.$nodename"; - } elsif ($header =~ /^net\//) { - $ctlname = "net.$nodename"; - } else { - $ctlname = "$nodename"; - $ctlname =~ s/^(fs|net|kern)_/$1\./; - } - if (exists $ctl_map{$ctlname}) { - $ctlname = $ctl_map{$ctlname}; - } - if (not exists $ctls{$ctlname}) { - &debug("Ignoring $ctlname..."); - next; - } - - # Walk down from the top of the MIB. - $node = \%mib; - foreach my $part (split /\./, $ctlname) { - if (not exists $$node{$part}) { - &debug("Missing node $part"); - $$node{$part} = [ 0, '', {} ]; - } - $node = \%{@{$$node{$part}}[2]}; - } - } - - # Populate current node with entries. - my $i = -1; - while (defined($_) && $_ !~ /^}/) { - $_ =
; - $i++ if $_ =~ /{.*}/; - next if $_ !~ /{\s+"(\w+)",\s+(CTLTYPE_[A-Z]+)\s+}/; - $$node{$1} = [ $i, $2, {} ]; - } - } - } - close HEADER; -} - -&build_sysctl(\%mib, "", []); - -print <>= 32 + stat.Mtim.Nsec >>= 32 + stat.Ctim.Nsec >>= 32 +} + +func Fstat(fd int, stat *Stat_t) error { + err := fstat(fd, stat) + if err != nil { + return err + } + fixStatTimFields(stat) + return nil +} + +func Fstatat(dirfd int, path string, stat *Stat_t, flags int) error { + err := fstatat(dirfd, path, stat, flags) + if err != nil { + return err + } + fixStatTimFields(stat) + return nil +} + +func Lstat(path string, stat *Stat_t) error { + err := lstat(path, stat) + if err != nil { + return err + } + fixStatTimFields(stat) + return nil +} + +func Stat(path string, statptr *Stat_t) error { + err := stat(path, statptr) + if err != nil { + return err + } + fixStatTimFields(statptr) + return nil +} diff --git a/vendor/golang.org/x/sys/unix/syscall_freebsd.go b/vendor/golang.org/x/sys/unix/syscall_freebsd.go index a7ca1ebe..1b6abe12 100644 --- a/vendor/golang.org/x/sys/unix/syscall_freebsd.go +++ b/vendor/golang.org/x/sys/unix/syscall_freebsd.go @@ -362,7 +362,21 @@ func Getdents(fd int, buf []byte) (n int, err error) { func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { if supportsABI(_ino64First) { - return getdirentries_freebsd12(fd, buf, basep) + if unsafe.Sizeof(*basep) == 8 { + return getdirentries_freebsd12(fd, buf, (*uint64)(unsafe.Pointer(basep))) + } + // The freebsd12 syscall needs a 64-bit base. On 32-bit machines + // we can't just use the basep passed in. See #32498. + var base uint64 = uint64(*basep) + n, err = getdirentries_freebsd12(fd, buf, &base) + *basep = uintptr(base) + if base>>32 != 0 { + // We can't stuff the base back into a uintptr, so any + // future calls would be suspect. Generate an error. + // EIO is allowed by getdirentries. + err = EIO + } + return } // The old syscall entries are smaller than the new. Use 1/4 of the original @@ -404,22 +418,22 @@ func roundup(x, y int) int { func (s *Stat_t) convertFrom(old *stat_freebsd11_t) { *s = Stat_t{ - Dev: uint64(old.Dev), - Ino: uint64(old.Ino), - Nlink: uint64(old.Nlink), - Mode: old.Mode, - Uid: old.Uid, - Gid: old.Gid, - Rdev: uint64(old.Rdev), - Atim: old.Atim, - Mtim: old.Mtim, - Ctim: old.Ctim, - Birthtim: old.Birthtim, - Size: old.Size, - Blocks: old.Blocks, - Blksize: old.Blksize, - Flags: old.Flags, - Gen: uint64(old.Gen), + Dev: uint64(old.Dev), + Ino: uint64(old.Ino), + Nlink: uint64(old.Nlink), + Mode: old.Mode, + Uid: old.Uid, + Gid: old.Gid, + Rdev: uint64(old.Rdev), + Atim: old.Atim, + Mtim: old.Mtim, + Ctim: old.Ctim, + Btim: old.Btim, + Size: old.Size, + Blocks: old.Blocks, + Blksize: old.Blksize, + Flags: old.Flags, + Gen: uint64(old.Gen), } } @@ -555,7 +569,7 @@ func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err e //sys Fsync(fd int) (err error) //sys Ftruncate(fd int, length int64) (err error) //sys getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) -//sys getdirentries_freebsd12(fd int, buf []byte, basep *uintptr) (n int, err error) +//sys getdirentries_freebsd12(fd int, buf []byte, basep *uint64) (n int, err error) //sys Getdtablesize() (size int) //sysnb Getegid() (egid int) //sysnb Geteuid() (uid int) diff --git a/vendor/golang.org/x/sys/unix/syscall_linux.go b/vendor/golang.org/x/sys/unix/syscall_linux.go index 558f07b5..c92545ea 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux.go @@ -109,6 +109,12 @@ func IoctlGetInt(fd int, req uint) (int, error) { return value, err } +func IoctlGetUint32(fd int, req uint) (uint32, error) { + var value uint32 + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return value, err +} + func IoctlGetWinsize(fd int, req uint) (*Winsize, error) { var value Winsize err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) @@ -1531,9 +1537,13 @@ func Setgid(uid int) (err error) { return EOPNOTSUPP } +func Signalfd(fd int, sigmask *Sigset_t, flags int) (newfd int, err error) { + return signalfd(fd, sigmask, _C__NSIG/8, flags) +} + //sys Setpriority(which int, who int, prio int) (err error) //sys Setxattr(path string, attr string, data []byte, flags int) (err error) -//sys Signalfd(fd int, mask *Sigset_t, flags int) = SYS_SIGNALFD4 +//sys signalfd(fd int, sigmask *Sigset_t, maskSize uintptr, flags int) (newfd int, err error) = SYS_SIGNALFD4 //sys Statx(dirfd int, path string, flags int, mask int, stat *Statx_t) (err error) //sys Sync() //sys Syncfs(fd int) (err error) @@ -1675,6 +1685,69 @@ type fileHandle struct { Type int32 } +// FileHandle represents the C struct file_handle used by +// name_to_handle_at (see NameToHandleAt) and open_by_handle_at (see +// OpenByHandleAt). +type FileHandle struct { + *fileHandle +} + +// NewFileHandle constructs a FileHandle. +func NewFileHandle(handleType int32, handle []byte) FileHandle { + const hdrSize = unsafe.Sizeof(fileHandle{}) + buf := make([]byte, hdrSize+uintptr(len(handle))) + copy(buf[hdrSize:], handle) + fh := (*fileHandle)(unsafe.Pointer(&buf[0])) + fh.Type = handleType + fh.Bytes = uint32(len(handle)) + return FileHandle{fh} +} + +func (fh *FileHandle) Size() int { return int(fh.fileHandle.Bytes) } +func (fh *FileHandle) Type() int32 { return fh.fileHandle.Type } +func (fh *FileHandle) Bytes() []byte { + n := fh.Size() + if n == 0 { + return nil + } + return (*[1 << 30]byte)(unsafe.Pointer(uintptr(unsafe.Pointer(&fh.fileHandle.Type)) + 4))[:n:n] +} + +// NameToHandleAt wraps the name_to_handle_at system call; it obtains +// a handle for a path name. +func NameToHandleAt(dirfd int, path string, flags int) (handle FileHandle, mountID int, err error) { + var mid _C_int + // Try first with a small buffer, assuming the handle will + // only be 32 bytes. + size := uint32(32 + unsafe.Sizeof(fileHandle{})) + didResize := false + for { + buf := make([]byte, size) + fh := (*fileHandle)(unsafe.Pointer(&buf[0])) + fh.Bytes = size - uint32(unsafe.Sizeof(fileHandle{})) + err = nameToHandleAt(dirfd, path, fh, &mid, flags) + if err == EOVERFLOW { + if didResize { + // We shouldn't need to resize more than once + return + } + didResize = true + size = fh.Bytes + uint32(unsafe.Sizeof(fileHandle{})) + continue + } + if err != nil { + return + } + return FileHandle{fh}, int(mid), nil + } +} + +// OpenByHandleAt wraps the open_by_handle_at system call; it opens a +// file via a handle as previously returned by NameToHandleAt. +func OpenByHandleAt(mountFD int, handle FileHandle, flags int) (fd int, err error) { + return openByHandleAt(mountFD, handle.fileHandle, flags) +} + /* * Unimplemented */ diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_arm.go b/vendor/golang.org/x/sys/unix/syscall_linux_arm.go index 3a3c37b4..f6267944 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_arm.go @@ -272,3 +272,16 @@ func SyncFileRange(fd int, off int64, n int64, flags int) error { // order of their arguments. return armSyncFileRange(fd, flags, off, n) } + +//sys kexecFileLoad(kernelFd int, initrdFd int, cmdlineLen int, cmdline string, flags int) (err error) + +func KexecFileLoad(kernelFd int, initrdFd int, cmdline string, flags int) error { + cmdlineLen := len(cmdline) + if cmdlineLen > 0 { + // Account for the additional NULL byte added by + // BytePtrFromString in kexecFileLoad. The kexec_file_load + // syscall expects a NULL-terminated string. + cmdlineLen++ + } + return kexecFileLoad(kernelFd, initrdFd, cmdlineLen, cmdline, flags) +} diff --git a/vendor/golang.org/x/sys/unix/syscall_netbsd.go b/vendor/golang.org/x/sys/unix/syscall_netbsd.go index 5240e16e..8f4c320e 100644 --- a/vendor/golang.org/x/sys/unix/syscall_netbsd.go +++ b/vendor/golang.org/x/sys/unix/syscall_netbsd.go @@ -120,9 +120,30 @@ func Pipe(p []int) (err error) { return } -//sys getdents(fd int, buf []byte) (n int, err error) +//sys Getdents(fd int, buf []byte) (n int, err error) func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { - return getdents(fd, buf) + n, err = Getdents(fd, buf) + if err != nil || basep == nil { + return + } + + var off int64 + off, err = Seek(fd, 0, 1 /* SEEK_CUR */) + if err != nil { + *basep = ^uintptr(0) + return + } + *basep = uintptr(off) + if unsafe.Sizeof(*basep) == 8 { + return + } + if off>>4 != 0 { + // We can't stuff the offset back into a uintptr, so any + // future calls would be suspect. Generate an error. + // EIO is allowed by getdirentries. + err = EIO + } + return } const ImplementsGetwd = true diff --git a/vendor/golang.org/x/sys/unix/syscall_openbsd.go b/vendor/golang.org/x/sys/unix/syscall_openbsd.go index c8648ec0..276c93be 100644 --- a/vendor/golang.org/x/sys/unix/syscall_openbsd.go +++ b/vendor/golang.org/x/sys/unix/syscall_openbsd.go @@ -89,9 +89,30 @@ func Pipe(p []int) (err error) { return } -//sys getdents(fd int, buf []byte) (n int, err error) +//sys Getdents(fd int, buf []byte) (n int, err error) func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { - return getdents(fd, buf) + n, err = Getdents(fd, buf) + if err != nil || basep == nil { + return + } + + var off int64 + off, err = Seek(fd, 0, 1 /* SEEK_CUR */) + if err != nil { + *basep = ^uintptr(0) + return + } + *basep = uintptr(off) + if unsafe.Sizeof(*basep) == 8 { + return + } + if off>>4 != 0 { + // We can't stuff the offset back into a uintptr, so any + // future calls would be suspect. Generate an error. + // EIO was allowed by getdirentries. + err = EIO + } + return } const ImplementsGetwd = true diff --git a/vendor/golang.org/x/sys/unix/syscall_openbsd_arm64.go b/vendor/golang.org/x/sys/unix/syscall_openbsd_arm64.go new file mode 100644 index 00000000..0fb39cf5 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/syscall_openbsd_arm64.go @@ -0,0 +1,37 @@ +// Copyright 2019 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 arm64,openbsd + +package unix + +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: sec, Nsec: nsec} +} + +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: sec, Usec: usec} +} + +func SetKevent(k *Kevent_t, fd, mode, flags int) { + k.Ident = uint64(fd) + k.Filter = int16(mode) + k.Flags = uint16(flags) +} + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint64(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} + +// SYS___SYSCTL is used by syscall_bsd.go for all BSDs, but in modern versions +// of openbsd/amd64 the syscall is called sysctl instead of __sysctl. +const SYS___SYSCTL = SYS_SYSCTL diff --git a/vendor/golang.org/x/sys/unix/types_aix.go b/vendor/golang.org/x/sys/unix/types_aix.go index 25e83494..40d2beed 100644 --- a/vendor/golang.org/x/sys/unix/types_aix.go +++ b/vendor/golang.org/x/sys/unix/types_aix.go @@ -87,8 +87,6 @@ type Mode_t C.mode_t type Timespec C.struct_timespec -type StTimespec C.struct_st_timespec - type Timeval C.struct_timeval type Timeval32 C.struct_timeval32 @@ -133,6 +131,8 @@ type RawSockaddrInet6 C.struct_sockaddr_in6 type RawSockaddrUnix C.struct_sockaddr_un +type RawSockaddrDatalink C.struct_sockaddr_dl + type RawSockaddr C.struct_sockaddr type RawSockaddrAny C.struct_sockaddr_any @@ -156,17 +156,18 @@ type Linger C.struct_linger type Msghdr C.struct_msghdr const ( - SizeofSockaddrInet4 = C.sizeof_struct_sockaddr_in - SizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 - SizeofSockaddrAny = C.sizeof_struct_sockaddr_any - SizeofSockaddrUnix = C.sizeof_struct_sockaddr_un - SizeofLinger = C.sizeof_struct_linger - SizeofIPMreq = C.sizeof_struct_ip_mreq - SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq - SizeofIPv6MTUInfo = C.sizeof_struct_ip6_mtuinfo - SizeofMsghdr = C.sizeof_struct_msghdr - SizeofCmsghdr = C.sizeof_struct_cmsghdr - SizeofICMPv6Filter = C.sizeof_struct_icmp6_filter + SizeofSockaddrInet4 = C.sizeof_struct_sockaddr_in + SizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 + SizeofSockaddrAny = C.sizeof_struct_sockaddr_any + SizeofSockaddrUnix = C.sizeof_struct_sockaddr_un + SizeofSockaddrDatalink = C.sizeof_struct_sockaddr_dl + SizeofLinger = C.sizeof_struct_linger + SizeofIPMreq = C.sizeof_struct_ip_mreq + SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq + SizeofIPv6MTUInfo = C.sizeof_struct_ip6_mtuinfo + SizeofMsghdr = C.sizeof_struct_msghdr + SizeofCmsghdr = C.sizeof_struct_cmsghdr + SizeofICMPv6Filter = C.sizeof_struct_icmp6_filter ) // Routing and interface messages diff --git a/vendor/golang.org/x/sys/unix/openbsd_unveil.go b/vendor/golang.org/x/sys/unix/unveil_openbsd.go similarity index 98% rename from vendor/golang.org/x/sys/unix/openbsd_unveil.go rename to vendor/golang.org/x/sys/unix/unveil_openbsd.go index aebc2dc5..168d5ae7 100644 --- a/vendor/golang.org/x/sys/unix/openbsd_unveil.go +++ b/vendor/golang.org/x/sys/unix/unveil_openbsd.go @@ -2,8 +2,6 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build openbsd - package unix import ( diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_386.go b/vendor/golang.org/x/sys/unix/zerrors_linux_386.go index 9e99d67c..881e69f1 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_386.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_386.go @@ -197,10 +197,59 @@ const ( BPF_ABS = 0x20 BPF_ADD = 0x0 BPF_ALU = 0x4 + BPF_ALU64 = 0x7 BPF_AND = 0x50 + BPF_ANY = 0x0 + BPF_ARSH = 0xc0 BPF_B = 0x10 + BPF_BUILD_ID_SIZE = 0x14 + BPF_CALL = 0x80 + BPF_DEVCG_ACC_MKNOD = 0x1 + BPF_DEVCG_ACC_READ = 0x2 + BPF_DEVCG_ACC_WRITE = 0x4 + BPF_DEVCG_DEV_BLOCK = 0x1 + BPF_DEVCG_DEV_CHAR = 0x2 BPF_DIV = 0x30 + BPF_DW = 0x18 + BPF_END = 0xd0 + BPF_EXIST = 0x2 + BPF_EXIT = 0x90 + BPF_FROM_BE = 0x8 + BPF_FROM_LE = 0x0 BPF_FS_MAGIC = 0xcafe4a11 + BPF_F_ALLOW_MULTI = 0x2 + BPF_F_ALLOW_OVERRIDE = 0x1 + BPF_F_ANY_ALIGNMENT = 0x2 + BPF_F_CTXLEN_MASK = 0xfffff00000000 + BPF_F_CURRENT_CPU = 0xffffffff + BPF_F_CURRENT_NETNS = -0x1 + BPF_F_DONT_FRAGMENT = 0x4 + BPF_F_FAST_STACK_CMP = 0x200 + BPF_F_HDR_FIELD_MASK = 0xf + BPF_F_INDEX_MASK = 0xffffffff + BPF_F_INGRESS = 0x1 + BPF_F_INVALIDATE_HASH = 0x2 + BPF_F_LOCK = 0x4 + BPF_F_MARK_ENFORCE = 0x40 + BPF_F_MARK_MANGLED_0 = 0x20 + BPF_F_NO_COMMON_LRU = 0x2 + BPF_F_NO_PREALLOC = 0x1 + BPF_F_NUMA_NODE = 0x4 + BPF_F_PSEUDO_HDR = 0x10 + BPF_F_QUERY_EFFECTIVE = 0x1 + BPF_F_RDONLY = 0x8 + BPF_F_RECOMPUTE_CSUM = 0x1 + BPF_F_REUSE_STACKID = 0x400 + BPF_F_SEQ_NUMBER = 0x8 + BPF_F_SKIP_FIELD_MASK = 0xff + BPF_F_STACK_BUILD_ID = 0x20 + BPF_F_STRICT_ALIGNMENT = 0x1 + BPF_F_TUNINFO_IPV6 = 0x1 + BPF_F_USER_BUILD_ID = 0x800 + BPF_F_USER_STACK = 0x100 + BPF_F_WRONLY = 0x10 + BPF_F_ZERO_CSUM_TX = 0x2 + BPF_F_ZERO_SEED = 0x40 BPF_H = 0x8 BPF_IMM = 0x0 BPF_IND = 0x40 @@ -208,8 +257,16 @@ const ( BPF_JEQ = 0x10 BPF_JGE = 0x30 BPF_JGT = 0x20 + BPF_JLE = 0xb0 + BPF_JLT = 0xa0 BPF_JMP = 0x5 + BPF_JMP32 = 0x6 + BPF_JNE = 0x50 BPF_JSET = 0x40 + BPF_JSGE = 0x70 + BPF_JSGT = 0x60 + BPF_JSLE = 0xd0 + BPF_JSLT = 0xc0 BPF_K = 0x0 BPF_LD = 0x0 BPF_LDX = 0x1 @@ -223,20 +280,33 @@ const ( BPF_MINOR_VERSION = 0x1 BPF_MISC = 0x7 BPF_MOD = 0x90 + BPF_MOV = 0xb0 BPF_MSH = 0xa0 BPF_MUL = 0x20 BPF_NEG = 0x80 BPF_NET_OFF = -0x100000 + BPF_NOEXIST = 0x1 + BPF_OBJ_NAME_LEN = 0x10 BPF_OR = 0x40 + BPF_PSEUDO_CALL = 0x1 + BPF_PSEUDO_MAP_FD = 0x1 BPF_RET = 0x6 BPF_RSH = 0x70 + BPF_SOCK_OPS_ALL_CB_FLAGS = 0x7 + BPF_SOCK_OPS_RETRANS_CB_FLAG = 0x2 + BPF_SOCK_OPS_RTO_CB_FLAG = 0x1 + BPF_SOCK_OPS_STATE_CB_FLAG = 0x4 BPF_ST = 0x2 BPF_STX = 0x3 BPF_SUB = 0x10 + BPF_TAG_SIZE = 0x8 BPF_TAX = 0x0 + BPF_TO_BE = 0x8 + BPF_TO_LE = 0x0 BPF_TXA = 0x80 BPF_W = 0x0 BPF_X = 0x8 + BPF_XADD = 0xc0 BPF_XOR = 0xa0 BRKINT = 0x2 BS0 = 0x0 @@ -320,6 +390,10 @@ const ( CRDLY = 0x600 CREAD = 0x80 CRTSCTS = 0x80000000 + CRYPTO_MAX_NAME = 0x40 + CRYPTO_MSG_MAX = 0x15 + CRYPTO_NR_MSGTYPES = 0x6 + CRYPTO_REPORT_MAXSIZE = 0x160 CS5 = 0x0 CS6 = 0x10 CS7 = 0x20 @@ -497,6 +571,7 @@ const ( FAN_ALL_MARK_FLAGS = 0xff FAN_ALL_OUTGOING_EVENTS = 0x3403b FAN_ALL_PERM_EVENTS = 0x30000 + FAN_ATTRIB = 0x4 FAN_AUDIT = 0x10 FAN_CLASS_CONTENT = 0x4 FAN_CLASS_NOTIF = 0x0 @@ -505,8 +580,12 @@ const ( FAN_CLOSE = 0x18 FAN_CLOSE_NOWRITE = 0x10 FAN_CLOSE_WRITE = 0x8 + FAN_CREATE = 0x100 + FAN_DELETE = 0x200 + FAN_DELETE_SELF = 0x400 FAN_DENY = 0x2 FAN_ENABLE_AUDIT = 0x40 + FAN_EVENT_INFO_TYPE_FID = 0x1 FAN_EVENT_METADATA_LEN = 0x18 FAN_EVENT_ON_CHILD = 0x8000000 FAN_MARK_ADD = 0x1 @@ -520,6 +599,10 @@ const ( FAN_MARK_ONLYDIR = 0x8 FAN_MARK_REMOVE = 0x2 FAN_MODIFY = 0x2 + FAN_MOVE = 0xc0 + FAN_MOVED_FROM = 0x40 + FAN_MOVED_TO = 0x80 + FAN_MOVE_SELF = 0x800 FAN_NOFD = -0x1 FAN_NONBLOCK = 0x2 FAN_ONDIR = 0x40000000 @@ -528,6 +611,7 @@ const ( FAN_OPEN_EXEC_PERM = 0x40000 FAN_OPEN_PERM = 0x10000 FAN_Q_OVERFLOW = 0x4000 + FAN_REPORT_FID = 0x200 FAN_REPORT_TID = 0x100 FAN_UNLIMITED_MARKS = 0x20 FAN_UNLIMITED_QUEUE = 0x10 @@ -1052,6 +1136,15 @@ const ( MAP_STACK = 0x20000 MAP_SYNC = 0x80000 MAP_TYPE = 0xf + MCAST_BLOCK_SOURCE = 0x2b + MCAST_EXCLUDE = 0x0 + MCAST_INCLUDE = 0x1 + MCAST_JOIN_GROUP = 0x2a + MCAST_JOIN_SOURCE_GROUP = 0x2e + MCAST_LEAVE_GROUP = 0x2d + MCAST_LEAVE_SOURCE_GROUP = 0x2f + MCAST_MSFILTER = 0x30 + MCAST_UNBLOCK_SOURCE = 0x2c MCL_CURRENT = 0x1 MCL_FUTURE = 0x2 MCL_ONFAULT = 0x4 @@ -1487,6 +1580,7 @@ const ( PR_SET_TSC = 0x1a PR_SET_UNALIGN = 0x6 PR_SPEC_DISABLE = 0x4 + PR_SPEC_DISABLE_NOEXEC = 0x10 PR_SPEC_ENABLE = 0x2 PR_SPEC_FORCE_DISABLE = 0x8 PR_SPEC_INDIRECT_BRANCH = 0x1 @@ -1957,6 +2051,7 @@ const ( SO_ATTACH_REUSEPORT_CBPF = 0x33 SO_ATTACH_REUSEPORT_EBPF = 0x34 SO_BINDTODEVICE = 0x19 + SO_BINDTOIFINDEX = 0x3e SO_BPF_EXTENSIONS = 0x30 SO_BROADCAST = 0x6 SO_BSDCOMPAT = 0xe @@ -2005,6 +2100,8 @@ const ( SO_RCVBUFFORCE = 0x21 SO_RCVLOWAT = 0x12 SO_RCVTIMEO = 0x14 + SO_RCVTIMEO_NEW = 0x42 + SO_RCVTIMEO_OLD = 0x14 SO_REUSEADDR = 0x2 SO_REUSEPORT = 0xf SO_RXQ_OVFL = 0x28 @@ -2016,9 +2113,17 @@ const ( SO_SNDBUFFORCE = 0x20 SO_SNDLOWAT = 0x13 SO_SNDTIMEO = 0x15 + SO_SNDTIMEO_NEW = 0x43 + SO_SNDTIMEO_OLD = 0x15 SO_TIMESTAMP = 0x1d SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPING_NEW = 0x41 + SO_TIMESTAMPING_OLD = 0x25 SO_TIMESTAMPNS = 0x23 + SO_TIMESTAMPNS_NEW = 0x40 + SO_TIMESTAMPNS_OLD = 0x23 + SO_TIMESTAMP_NEW = 0x3f + SO_TIMESTAMP_OLD = 0x1d SO_TXTIME = 0x3d SO_TYPE = 0x3 SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 @@ -2111,6 +2216,8 @@ const ( TCOFLUSH = 0x1 TCOOFF = 0x0 TCOON = 0x1 + TCP_BPF_IW = 0x3e9 + TCP_BPF_SNDCWND_CLAMP = 0x3ea TCP_CC_INFO = 0x1a TCP_CM_INQ = 0x24 TCP_CONGESTION = 0xd @@ -2312,8 +2419,10 @@ const ( UBI_IOCMKVOL = 0x40986f00 UBI_IOCRMVOL = 0x40046f01 UBI_IOCRNVOL = 0x51106f03 + UBI_IOCRPEB = 0x40046f04 UBI_IOCRSVOL = 0x400c6f02 UBI_IOCSETVOLPROP = 0x40104f06 + UBI_IOCSPEB = 0x40046f05 UBI_IOCVOLCRBLK = 0x40804f07 UBI_IOCVOLRMBLK = 0x4f08 UBI_IOCVOLUP = 0x40084f00 @@ -2462,6 +2571,7 @@ const ( XDP_FLAGS_SKB_MODE = 0x2 XDP_FLAGS_UPDATE_IF_NOEXIST = 0x1 XDP_MMAP_OFFSETS = 0x1 + XDP_PACKET_HEADROOM = 0x100 XDP_PGOFF_RX_RING = 0x0 XDP_PGOFF_TX_RING = 0x80000000 XDP_RX_RING = 0x2 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go index e3091f1e..039b007d 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go @@ -197,10 +197,59 @@ const ( BPF_ABS = 0x20 BPF_ADD = 0x0 BPF_ALU = 0x4 + BPF_ALU64 = 0x7 BPF_AND = 0x50 + BPF_ANY = 0x0 + BPF_ARSH = 0xc0 BPF_B = 0x10 + BPF_BUILD_ID_SIZE = 0x14 + BPF_CALL = 0x80 + BPF_DEVCG_ACC_MKNOD = 0x1 + BPF_DEVCG_ACC_READ = 0x2 + BPF_DEVCG_ACC_WRITE = 0x4 + BPF_DEVCG_DEV_BLOCK = 0x1 + BPF_DEVCG_DEV_CHAR = 0x2 BPF_DIV = 0x30 + BPF_DW = 0x18 + BPF_END = 0xd0 + BPF_EXIST = 0x2 + BPF_EXIT = 0x90 + BPF_FROM_BE = 0x8 + BPF_FROM_LE = 0x0 BPF_FS_MAGIC = 0xcafe4a11 + BPF_F_ALLOW_MULTI = 0x2 + BPF_F_ALLOW_OVERRIDE = 0x1 + BPF_F_ANY_ALIGNMENT = 0x2 + BPF_F_CTXLEN_MASK = 0xfffff00000000 + BPF_F_CURRENT_CPU = 0xffffffff + BPF_F_CURRENT_NETNS = -0x1 + BPF_F_DONT_FRAGMENT = 0x4 + BPF_F_FAST_STACK_CMP = 0x200 + BPF_F_HDR_FIELD_MASK = 0xf + BPF_F_INDEX_MASK = 0xffffffff + BPF_F_INGRESS = 0x1 + BPF_F_INVALIDATE_HASH = 0x2 + BPF_F_LOCK = 0x4 + BPF_F_MARK_ENFORCE = 0x40 + BPF_F_MARK_MANGLED_0 = 0x20 + BPF_F_NO_COMMON_LRU = 0x2 + BPF_F_NO_PREALLOC = 0x1 + BPF_F_NUMA_NODE = 0x4 + BPF_F_PSEUDO_HDR = 0x10 + BPF_F_QUERY_EFFECTIVE = 0x1 + BPF_F_RDONLY = 0x8 + BPF_F_RECOMPUTE_CSUM = 0x1 + BPF_F_REUSE_STACKID = 0x400 + BPF_F_SEQ_NUMBER = 0x8 + BPF_F_SKIP_FIELD_MASK = 0xff + BPF_F_STACK_BUILD_ID = 0x20 + BPF_F_STRICT_ALIGNMENT = 0x1 + BPF_F_TUNINFO_IPV6 = 0x1 + BPF_F_USER_BUILD_ID = 0x800 + BPF_F_USER_STACK = 0x100 + BPF_F_WRONLY = 0x10 + BPF_F_ZERO_CSUM_TX = 0x2 + BPF_F_ZERO_SEED = 0x40 BPF_H = 0x8 BPF_IMM = 0x0 BPF_IND = 0x40 @@ -208,8 +257,16 @@ const ( BPF_JEQ = 0x10 BPF_JGE = 0x30 BPF_JGT = 0x20 + BPF_JLE = 0xb0 + BPF_JLT = 0xa0 BPF_JMP = 0x5 + BPF_JMP32 = 0x6 + BPF_JNE = 0x50 BPF_JSET = 0x40 + BPF_JSGE = 0x70 + BPF_JSGT = 0x60 + BPF_JSLE = 0xd0 + BPF_JSLT = 0xc0 BPF_K = 0x0 BPF_LD = 0x0 BPF_LDX = 0x1 @@ -223,20 +280,33 @@ const ( BPF_MINOR_VERSION = 0x1 BPF_MISC = 0x7 BPF_MOD = 0x90 + BPF_MOV = 0xb0 BPF_MSH = 0xa0 BPF_MUL = 0x20 BPF_NEG = 0x80 BPF_NET_OFF = -0x100000 + BPF_NOEXIST = 0x1 + BPF_OBJ_NAME_LEN = 0x10 BPF_OR = 0x40 + BPF_PSEUDO_CALL = 0x1 + BPF_PSEUDO_MAP_FD = 0x1 BPF_RET = 0x6 BPF_RSH = 0x70 + BPF_SOCK_OPS_ALL_CB_FLAGS = 0x7 + BPF_SOCK_OPS_RETRANS_CB_FLAG = 0x2 + BPF_SOCK_OPS_RTO_CB_FLAG = 0x1 + BPF_SOCK_OPS_STATE_CB_FLAG = 0x4 BPF_ST = 0x2 BPF_STX = 0x3 BPF_SUB = 0x10 + BPF_TAG_SIZE = 0x8 BPF_TAX = 0x0 + BPF_TO_BE = 0x8 + BPF_TO_LE = 0x0 BPF_TXA = 0x80 BPF_W = 0x0 BPF_X = 0x8 + BPF_XADD = 0xc0 BPF_XOR = 0xa0 BRKINT = 0x2 BS0 = 0x0 @@ -320,6 +390,10 @@ const ( CRDLY = 0x600 CREAD = 0x80 CRTSCTS = 0x80000000 + CRYPTO_MAX_NAME = 0x40 + CRYPTO_MSG_MAX = 0x15 + CRYPTO_NR_MSGTYPES = 0x6 + CRYPTO_REPORT_MAXSIZE = 0x160 CS5 = 0x0 CS6 = 0x10 CS7 = 0x20 @@ -497,6 +571,7 @@ const ( FAN_ALL_MARK_FLAGS = 0xff FAN_ALL_OUTGOING_EVENTS = 0x3403b FAN_ALL_PERM_EVENTS = 0x30000 + FAN_ATTRIB = 0x4 FAN_AUDIT = 0x10 FAN_CLASS_CONTENT = 0x4 FAN_CLASS_NOTIF = 0x0 @@ -505,8 +580,12 @@ const ( FAN_CLOSE = 0x18 FAN_CLOSE_NOWRITE = 0x10 FAN_CLOSE_WRITE = 0x8 + FAN_CREATE = 0x100 + FAN_DELETE = 0x200 + FAN_DELETE_SELF = 0x400 FAN_DENY = 0x2 FAN_ENABLE_AUDIT = 0x40 + FAN_EVENT_INFO_TYPE_FID = 0x1 FAN_EVENT_METADATA_LEN = 0x18 FAN_EVENT_ON_CHILD = 0x8000000 FAN_MARK_ADD = 0x1 @@ -520,6 +599,10 @@ const ( FAN_MARK_ONLYDIR = 0x8 FAN_MARK_REMOVE = 0x2 FAN_MODIFY = 0x2 + FAN_MOVE = 0xc0 + FAN_MOVED_FROM = 0x40 + FAN_MOVED_TO = 0x80 + FAN_MOVE_SELF = 0x800 FAN_NOFD = -0x1 FAN_NONBLOCK = 0x2 FAN_ONDIR = 0x40000000 @@ -528,6 +611,7 @@ const ( FAN_OPEN_EXEC_PERM = 0x40000 FAN_OPEN_PERM = 0x10000 FAN_Q_OVERFLOW = 0x4000 + FAN_REPORT_FID = 0x200 FAN_REPORT_TID = 0x100 FAN_UNLIMITED_MARKS = 0x20 FAN_UNLIMITED_QUEUE = 0x10 @@ -1052,6 +1136,15 @@ const ( MAP_STACK = 0x20000 MAP_SYNC = 0x80000 MAP_TYPE = 0xf + MCAST_BLOCK_SOURCE = 0x2b + MCAST_EXCLUDE = 0x0 + MCAST_INCLUDE = 0x1 + MCAST_JOIN_GROUP = 0x2a + MCAST_JOIN_SOURCE_GROUP = 0x2e + MCAST_LEAVE_GROUP = 0x2d + MCAST_LEAVE_SOURCE_GROUP = 0x2f + MCAST_MSFILTER = 0x30 + MCAST_UNBLOCK_SOURCE = 0x2c MCL_CURRENT = 0x1 MCL_FUTURE = 0x2 MCL_ONFAULT = 0x4 @@ -1487,6 +1580,7 @@ const ( PR_SET_TSC = 0x1a PR_SET_UNALIGN = 0x6 PR_SPEC_DISABLE = 0x4 + PR_SPEC_DISABLE_NOEXEC = 0x10 PR_SPEC_ENABLE = 0x2 PR_SPEC_FORCE_DISABLE = 0x8 PR_SPEC_INDIRECT_BRANCH = 0x1 @@ -1958,6 +2052,7 @@ const ( SO_ATTACH_REUSEPORT_CBPF = 0x33 SO_ATTACH_REUSEPORT_EBPF = 0x34 SO_BINDTODEVICE = 0x19 + SO_BINDTOIFINDEX = 0x3e SO_BPF_EXTENSIONS = 0x30 SO_BROADCAST = 0x6 SO_BSDCOMPAT = 0xe @@ -2006,6 +2101,8 @@ const ( SO_RCVBUFFORCE = 0x21 SO_RCVLOWAT = 0x12 SO_RCVTIMEO = 0x14 + SO_RCVTIMEO_NEW = 0x42 + SO_RCVTIMEO_OLD = 0x14 SO_REUSEADDR = 0x2 SO_REUSEPORT = 0xf SO_RXQ_OVFL = 0x28 @@ -2017,9 +2114,17 @@ const ( SO_SNDBUFFORCE = 0x20 SO_SNDLOWAT = 0x13 SO_SNDTIMEO = 0x15 + SO_SNDTIMEO_NEW = 0x43 + SO_SNDTIMEO_OLD = 0x15 SO_TIMESTAMP = 0x1d SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPING_NEW = 0x41 + SO_TIMESTAMPING_OLD = 0x25 SO_TIMESTAMPNS = 0x23 + SO_TIMESTAMPNS_NEW = 0x40 + SO_TIMESTAMPNS_OLD = 0x23 + SO_TIMESTAMP_NEW = 0x3f + SO_TIMESTAMP_OLD = 0x1d SO_TXTIME = 0x3d SO_TYPE = 0x3 SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 @@ -2112,6 +2217,8 @@ const ( TCOFLUSH = 0x1 TCOOFF = 0x0 TCOON = 0x1 + TCP_BPF_IW = 0x3e9 + TCP_BPF_SNDCWND_CLAMP = 0x3ea TCP_CC_INFO = 0x1a TCP_CM_INQ = 0x24 TCP_CONGESTION = 0xd @@ -2313,8 +2420,10 @@ const ( UBI_IOCMKVOL = 0x40986f00 UBI_IOCRMVOL = 0x40046f01 UBI_IOCRNVOL = 0x51106f03 + UBI_IOCRPEB = 0x40046f04 UBI_IOCRSVOL = 0x400c6f02 UBI_IOCSETVOLPROP = 0x40104f06 + UBI_IOCSPEB = 0x40046f05 UBI_IOCVOLCRBLK = 0x40804f07 UBI_IOCVOLRMBLK = 0x4f08 UBI_IOCVOLUP = 0x40084f00 @@ -2462,6 +2571,7 @@ const ( XDP_FLAGS_SKB_MODE = 0x2 XDP_FLAGS_UPDATE_IF_NOEXIST = 0x1 XDP_MMAP_OFFSETS = 0x1 + XDP_PACKET_HEADROOM = 0x100 XDP_PGOFF_RX_RING = 0x0 XDP_PGOFF_TX_RING = 0x80000000 XDP_RX_RING = 0x2 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go b/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go index a75dfebc..97ed569a 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go @@ -197,10 +197,59 @@ const ( BPF_ABS = 0x20 BPF_ADD = 0x0 BPF_ALU = 0x4 + BPF_ALU64 = 0x7 BPF_AND = 0x50 + BPF_ANY = 0x0 + BPF_ARSH = 0xc0 BPF_B = 0x10 + BPF_BUILD_ID_SIZE = 0x14 + BPF_CALL = 0x80 + BPF_DEVCG_ACC_MKNOD = 0x1 + BPF_DEVCG_ACC_READ = 0x2 + BPF_DEVCG_ACC_WRITE = 0x4 + BPF_DEVCG_DEV_BLOCK = 0x1 + BPF_DEVCG_DEV_CHAR = 0x2 BPF_DIV = 0x30 + BPF_DW = 0x18 + BPF_END = 0xd0 + BPF_EXIST = 0x2 + BPF_EXIT = 0x90 + BPF_FROM_BE = 0x8 + BPF_FROM_LE = 0x0 BPF_FS_MAGIC = 0xcafe4a11 + BPF_F_ALLOW_MULTI = 0x2 + BPF_F_ALLOW_OVERRIDE = 0x1 + BPF_F_ANY_ALIGNMENT = 0x2 + BPF_F_CTXLEN_MASK = 0xfffff00000000 + BPF_F_CURRENT_CPU = 0xffffffff + BPF_F_CURRENT_NETNS = -0x1 + BPF_F_DONT_FRAGMENT = 0x4 + BPF_F_FAST_STACK_CMP = 0x200 + BPF_F_HDR_FIELD_MASK = 0xf + BPF_F_INDEX_MASK = 0xffffffff + BPF_F_INGRESS = 0x1 + BPF_F_INVALIDATE_HASH = 0x2 + BPF_F_LOCK = 0x4 + BPF_F_MARK_ENFORCE = 0x40 + BPF_F_MARK_MANGLED_0 = 0x20 + BPF_F_NO_COMMON_LRU = 0x2 + BPF_F_NO_PREALLOC = 0x1 + BPF_F_NUMA_NODE = 0x4 + BPF_F_PSEUDO_HDR = 0x10 + BPF_F_QUERY_EFFECTIVE = 0x1 + BPF_F_RDONLY = 0x8 + BPF_F_RECOMPUTE_CSUM = 0x1 + BPF_F_REUSE_STACKID = 0x400 + BPF_F_SEQ_NUMBER = 0x8 + BPF_F_SKIP_FIELD_MASK = 0xff + BPF_F_STACK_BUILD_ID = 0x20 + BPF_F_STRICT_ALIGNMENT = 0x1 + BPF_F_TUNINFO_IPV6 = 0x1 + BPF_F_USER_BUILD_ID = 0x800 + BPF_F_USER_STACK = 0x100 + BPF_F_WRONLY = 0x10 + BPF_F_ZERO_CSUM_TX = 0x2 + BPF_F_ZERO_SEED = 0x40 BPF_H = 0x8 BPF_IMM = 0x0 BPF_IND = 0x40 @@ -208,8 +257,16 @@ const ( BPF_JEQ = 0x10 BPF_JGE = 0x30 BPF_JGT = 0x20 + BPF_JLE = 0xb0 + BPF_JLT = 0xa0 BPF_JMP = 0x5 + BPF_JMP32 = 0x6 + BPF_JNE = 0x50 BPF_JSET = 0x40 + BPF_JSGE = 0x70 + BPF_JSGT = 0x60 + BPF_JSLE = 0xd0 + BPF_JSLT = 0xc0 BPF_K = 0x0 BPF_LD = 0x0 BPF_LDX = 0x1 @@ -223,20 +280,33 @@ const ( BPF_MINOR_VERSION = 0x1 BPF_MISC = 0x7 BPF_MOD = 0x90 + BPF_MOV = 0xb0 BPF_MSH = 0xa0 BPF_MUL = 0x20 BPF_NEG = 0x80 BPF_NET_OFF = -0x100000 + BPF_NOEXIST = 0x1 + BPF_OBJ_NAME_LEN = 0x10 BPF_OR = 0x40 + BPF_PSEUDO_CALL = 0x1 + BPF_PSEUDO_MAP_FD = 0x1 BPF_RET = 0x6 BPF_RSH = 0x70 + BPF_SOCK_OPS_ALL_CB_FLAGS = 0x7 + BPF_SOCK_OPS_RETRANS_CB_FLAG = 0x2 + BPF_SOCK_OPS_RTO_CB_FLAG = 0x1 + BPF_SOCK_OPS_STATE_CB_FLAG = 0x4 BPF_ST = 0x2 BPF_STX = 0x3 BPF_SUB = 0x10 + BPF_TAG_SIZE = 0x8 BPF_TAX = 0x0 + BPF_TO_BE = 0x8 + BPF_TO_LE = 0x0 BPF_TXA = 0x80 BPF_W = 0x0 BPF_X = 0x8 + BPF_XADD = 0xc0 BPF_XOR = 0xa0 BRKINT = 0x2 BS0 = 0x0 @@ -320,6 +390,10 @@ const ( CRDLY = 0x600 CREAD = 0x80 CRTSCTS = 0x80000000 + CRYPTO_MAX_NAME = 0x40 + CRYPTO_MSG_MAX = 0x15 + CRYPTO_NR_MSGTYPES = 0x6 + CRYPTO_REPORT_MAXSIZE = 0x160 CS5 = 0x0 CS6 = 0x10 CS7 = 0x20 @@ -497,6 +571,7 @@ const ( FAN_ALL_MARK_FLAGS = 0xff FAN_ALL_OUTGOING_EVENTS = 0x3403b FAN_ALL_PERM_EVENTS = 0x30000 + FAN_ATTRIB = 0x4 FAN_AUDIT = 0x10 FAN_CLASS_CONTENT = 0x4 FAN_CLASS_NOTIF = 0x0 @@ -505,8 +580,12 @@ const ( FAN_CLOSE = 0x18 FAN_CLOSE_NOWRITE = 0x10 FAN_CLOSE_WRITE = 0x8 + FAN_CREATE = 0x100 + FAN_DELETE = 0x200 + FAN_DELETE_SELF = 0x400 FAN_DENY = 0x2 FAN_ENABLE_AUDIT = 0x40 + FAN_EVENT_INFO_TYPE_FID = 0x1 FAN_EVENT_METADATA_LEN = 0x18 FAN_EVENT_ON_CHILD = 0x8000000 FAN_MARK_ADD = 0x1 @@ -520,6 +599,10 @@ const ( FAN_MARK_ONLYDIR = 0x8 FAN_MARK_REMOVE = 0x2 FAN_MODIFY = 0x2 + FAN_MOVE = 0xc0 + FAN_MOVED_FROM = 0x40 + FAN_MOVED_TO = 0x80 + FAN_MOVE_SELF = 0x800 FAN_NOFD = -0x1 FAN_NONBLOCK = 0x2 FAN_ONDIR = 0x40000000 @@ -528,6 +611,7 @@ const ( FAN_OPEN_EXEC_PERM = 0x40000 FAN_OPEN_PERM = 0x10000 FAN_Q_OVERFLOW = 0x4000 + FAN_REPORT_FID = 0x200 FAN_REPORT_TID = 0x100 FAN_UNLIMITED_MARKS = 0x20 FAN_UNLIMITED_QUEUE = 0x10 @@ -1050,6 +1134,15 @@ const ( MAP_STACK = 0x20000 MAP_SYNC = 0x80000 MAP_TYPE = 0xf + MCAST_BLOCK_SOURCE = 0x2b + MCAST_EXCLUDE = 0x0 + MCAST_INCLUDE = 0x1 + MCAST_JOIN_GROUP = 0x2a + MCAST_JOIN_SOURCE_GROUP = 0x2e + MCAST_LEAVE_GROUP = 0x2d + MCAST_LEAVE_SOURCE_GROUP = 0x2f + MCAST_MSFILTER = 0x30 + MCAST_UNBLOCK_SOURCE = 0x2c MCL_CURRENT = 0x1 MCL_FUTURE = 0x2 MCL_ONFAULT = 0x4 @@ -1485,6 +1578,7 @@ const ( PR_SET_TSC = 0x1a PR_SET_UNALIGN = 0x6 PR_SPEC_DISABLE = 0x4 + PR_SPEC_DISABLE_NOEXEC = 0x10 PR_SPEC_ENABLE = 0x2 PR_SPEC_FORCE_DISABLE = 0x8 PR_SPEC_INDIRECT_BRANCH = 0x1 @@ -1964,6 +2058,7 @@ const ( SO_ATTACH_REUSEPORT_CBPF = 0x33 SO_ATTACH_REUSEPORT_EBPF = 0x34 SO_BINDTODEVICE = 0x19 + SO_BINDTOIFINDEX = 0x3e SO_BPF_EXTENSIONS = 0x30 SO_BROADCAST = 0x6 SO_BSDCOMPAT = 0xe @@ -2012,6 +2107,8 @@ const ( SO_RCVBUFFORCE = 0x21 SO_RCVLOWAT = 0x12 SO_RCVTIMEO = 0x14 + SO_RCVTIMEO_NEW = 0x42 + SO_RCVTIMEO_OLD = 0x14 SO_REUSEADDR = 0x2 SO_REUSEPORT = 0xf SO_RXQ_OVFL = 0x28 @@ -2023,9 +2120,17 @@ const ( SO_SNDBUFFORCE = 0x20 SO_SNDLOWAT = 0x13 SO_SNDTIMEO = 0x15 + SO_SNDTIMEO_NEW = 0x43 + SO_SNDTIMEO_OLD = 0x15 SO_TIMESTAMP = 0x1d SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPING_NEW = 0x41 + SO_TIMESTAMPING_OLD = 0x25 SO_TIMESTAMPNS = 0x23 + SO_TIMESTAMPNS_NEW = 0x40 + SO_TIMESTAMPNS_OLD = 0x23 + SO_TIMESTAMP_NEW = 0x3f + SO_TIMESTAMP_OLD = 0x1d SO_TXTIME = 0x3d SO_TYPE = 0x3 SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 @@ -2118,6 +2223,8 @@ const ( TCOFLUSH = 0x1 TCOOFF = 0x0 TCOON = 0x1 + TCP_BPF_IW = 0x3e9 + TCP_BPF_SNDCWND_CLAMP = 0x3ea TCP_CC_INFO = 0x1a TCP_CM_INQ = 0x24 TCP_CONGESTION = 0xd @@ -2319,8 +2426,10 @@ const ( UBI_IOCMKVOL = 0x40986f00 UBI_IOCRMVOL = 0x40046f01 UBI_IOCRNVOL = 0x51106f03 + UBI_IOCRPEB = 0x40046f04 UBI_IOCRSVOL = 0x400c6f02 UBI_IOCSETVOLPROP = 0x40104f06 + UBI_IOCSPEB = 0x40046f05 UBI_IOCVOLCRBLK = 0x40804f07 UBI_IOCVOLRMBLK = 0x4f08 UBI_IOCVOLUP = 0x40084f00 @@ -2468,6 +2577,7 @@ const ( XDP_FLAGS_SKB_MODE = 0x2 XDP_FLAGS_UPDATE_IF_NOEXIST = 0x1 XDP_MMAP_OFFSETS = 0x1 + XDP_PACKET_HEADROOM = 0x100 XDP_PGOFF_RX_RING = 0x0 XDP_PGOFF_TX_RING = 0x80000000 XDP_RX_RING = 0x2 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go index 393ad7c9..d47f3ba6 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go @@ -197,10 +197,59 @@ const ( BPF_ABS = 0x20 BPF_ADD = 0x0 BPF_ALU = 0x4 + BPF_ALU64 = 0x7 BPF_AND = 0x50 + BPF_ANY = 0x0 + BPF_ARSH = 0xc0 BPF_B = 0x10 + BPF_BUILD_ID_SIZE = 0x14 + BPF_CALL = 0x80 + BPF_DEVCG_ACC_MKNOD = 0x1 + BPF_DEVCG_ACC_READ = 0x2 + BPF_DEVCG_ACC_WRITE = 0x4 + BPF_DEVCG_DEV_BLOCK = 0x1 + BPF_DEVCG_DEV_CHAR = 0x2 BPF_DIV = 0x30 + BPF_DW = 0x18 + BPF_END = 0xd0 + BPF_EXIST = 0x2 + BPF_EXIT = 0x90 + BPF_FROM_BE = 0x8 + BPF_FROM_LE = 0x0 BPF_FS_MAGIC = 0xcafe4a11 + BPF_F_ALLOW_MULTI = 0x2 + BPF_F_ALLOW_OVERRIDE = 0x1 + BPF_F_ANY_ALIGNMENT = 0x2 + BPF_F_CTXLEN_MASK = 0xfffff00000000 + BPF_F_CURRENT_CPU = 0xffffffff + BPF_F_CURRENT_NETNS = -0x1 + BPF_F_DONT_FRAGMENT = 0x4 + BPF_F_FAST_STACK_CMP = 0x200 + BPF_F_HDR_FIELD_MASK = 0xf + BPF_F_INDEX_MASK = 0xffffffff + BPF_F_INGRESS = 0x1 + BPF_F_INVALIDATE_HASH = 0x2 + BPF_F_LOCK = 0x4 + BPF_F_MARK_ENFORCE = 0x40 + BPF_F_MARK_MANGLED_0 = 0x20 + BPF_F_NO_COMMON_LRU = 0x2 + BPF_F_NO_PREALLOC = 0x1 + BPF_F_NUMA_NODE = 0x4 + BPF_F_PSEUDO_HDR = 0x10 + BPF_F_QUERY_EFFECTIVE = 0x1 + BPF_F_RDONLY = 0x8 + BPF_F_RECOMPUTE_CSUM = 0x1 + BPF_F_REUSE_STACKID = 0x400 + BPF_F_SEQ_NUMBER = 0x8 + BPF_F_SKIP_FIELD_MASK = 0xff + BPF_F_STACK_BUILD_ID = 0x20 + BPF_F_STRICT_ALIGNMENT = 0x1 + BPF_F_TUNINFO_IPV6 = 0x1 + BPF_F_USER_BUILD_ID = 0x800 + BPF_F_USER_STACK = 0x100 + BPF_F_WRONLY = 0x10 + BPF_F_ZERO_CSUM_TX = 0x2 + BPF_F_ZERO_SEED = 0x40 BPF_H = 0x8 BPF_IMM = 0x0 BPF_IND = 0x40 @@ -208,8 +257,16 @@ const ( BPF_JEQ = 0x10 BPF_JGE = 0x30 BPF_JGT = 0x20 + BPF_JLE = 0xb0 + BPF_JLT = 0xa0 BPF_JMP = 0x5 + BPF_JMP32 = 0x6 + BPF_JNE = 0x50 BPF_JSET = 0x40 + BPF_JSGE = 0x70 + BPF_JSGT = 0x60 + BPF_JSLE = 0xd0 + BPF_JSLT = 0xc0 BPF_K = 0x0 BPF_LD = 0x0 BPF_LDX = 0x1 @@ -223,20 +280,33 @@ const ( BPF_MINOR_VERSION = 0x1 BPF_MISC = 0x7 BPF_MOD = 0x90 + BPF_MOV = 0xb0 BPF_MSH = 0xa0 BPF_MUL = 0x20 BPF_NEG = 0x80 BPF_NET_OFF = -0x100000 + BPF_NOEXIST = 0x1 + BPF_OBJ_NAME_LEN = 0x10 BPF_OR = 0x40 + BPF_PSEUDO_CALL = 0x1 + BPF_PSEUDO_MAP_FD = 0x1 BPF_RET = 0x6 BPF_RSH = 0x70 + BPF_SOCK_OPS_ALL_CB_FLAGS = 0x7 + BPF_SOCK_OPS_RETRANS_CB_FLAG = 0x2 + BPF_SOCK_OPS_RTO_CB_FLAG = 0x1 + BPF_SOCK_OPS_STATE_CB_FLAG = 0x4 BPF_ST = 0x2 BPF_STX = 0x3 BPF_SUB = 0x10 + BPF_TAG_SIZE = 0x8 BPF_TAX = 0x0 + BPF_TO_BE = 0x8 + BPF_TO_LE = 0x0 BPF_TXA = 0x80 BPF_W = 0x0 BPF_X = 0x8 + BPF_XADD = 0xc0 BPF_XOR = 0xa0 BRKINT = 0x2 BS0 = 0x0 @@ -320,6 +390,10 @@ const ( CRDLY = 0x600 CREAD = 0x80 CRTSCTS = 0x80000000 + CRYPTO_MAX_NAME = 0x40 + CRYPTO_MSG_MAX = 0x15 + CRYPTO_NR_MSGTYPES = 0x6 + CRYPTO_REPORT_MAXSIZE = 0x160 CS5 = 0x0 CS6 = 0x10 CS7 = 0x20 @@ -499,6 +573,7 @@ const ( FAN_ALL_MARK_FLAGS = 0xff FAN_ALL_OUTGOING_EVENTS = 0x3403b FAN_ALL_PERM_EVENTS = 0x30000 + FAN_ATTRIB = 0x4 FAN_AUDIT = 0x10 FAN_CLASS_CONTENT = 0x4 FAN_CLASS_NOTIF = 0x0 @@ -507,8 +582,12 @@ const ( FAN_CLOSE = 0x18 FAN_CLOSE_NOWRITE = 0x10 FAN_CLOSE_WRITE = 0x8 + FAN_CREATE = 0x100 + FAN_DELETE = 0x200 + FAN_DELETE_SELF = 0x400 FAN_DENY = 0x2 FAN_ENABLE_AUDIT = 0x40 + FAN_EVENT_INFO_TYPE_FID = 0x1 FAN_EVENT_METADATA_LEN = 0x18 FAN_EVENT_ON_CHILD = 0x8000000 FAN_MARK_ADD = 0x1 @@ -522,6 +601,10 @@ const ( FAN_MARK_ONLYDIR = 0x8 FAN_MARK_REMOVE = 0x2 FAN_MODIFY = 0x2 + FAN_MOVE = 0xc0 + FAN_MOVED_FROM = 0x40 + FAN_MOVED_TO = 0x80 + FAN_MOVE_SELF = 0x800 FAN_NOFD = -0x1 FAN_NONBLOCK = 0x2 FAN_ONDIR = 0x40000000 @@ -530,6 +613,7 @@ const ( FAN_OPEN_EXEC_PERM = 0x40000 FAN_OPEN_PERM = 0x10000 FAN_Q_OVERFLOW = 0x4000 + FAN_REPORT_FID = 0x200 FAN_REPORT_TID = 0x100 FAN_UNLIMITED_MARKS = 0x20 FAN_UNLIMITED_QUEUE = 0x10 @@ -1053,6 +1137,15 @@ const ( MAP_STACK = 0x20000 MAP_SYNC = 0x80000 MAP_TYPE = 0xf + MCAST_BLOCK_SOURCE = 0x2b + MCAST_EXCLUDE = 0x0 + MCAST_INCLUDE = 0x1 + MCAST_JOIN_GROUP = 0x2a + MCAST_JOIN_SOURCE_GROUP = 0x2e + MCAST_LEAVE_GROUP = 0x2d + MCAST_LEAVE_SOURCE_GROUP = 0x2f + MCAST_MSFILTER = 0x30 + MCAST_UNBLOCK_SOURCE = 0x2c MCL_CURRENT = 0x1 MCL_FUTURE = 0x2 MCL_ONFAULT = 0x4 @@ -1488,6 +1581,7 @@ const ( PR_SET_TSC = 0x1a PR_SET_UNALIGN = 0x6 PR_SPEC_DISABLE = 0x4 + PR_SPEC_DISABLE_NOEXEC = 0x10 PR_SPEC_ENABLE = 0x2 PR_SPEC_FORCE_DISABLE = 0x8 PR_SPEC_INDIRECT_BRANCH = 0x1 @@ -1948,6 +2042,7 @@ const ( SO_ATTACH_REUSEPORT_CBPF = 0x33 SO_ATTACH_REUSEPORT_EBPF = 0x34 SO_BINDTODEVICE = 0x19 + SO_BINDTOIFINDEX = 0x3e SO_BPF_EXTENSIONS = 0x30 SO_BROADCAST = 0x6 SO_BSDCOMPAT = 0xe @@ -1996,6 +2091,8 @@ const ( SO_RCVBUFFORCE = 0x21 SO_RCVLOWAT = 0x12 SO_RCVTIMEO = 0x14 + SO_RCVTIMEO_NEW = 0x42 + SO_RCVTIMEO_OLD = 0x14 SO_REUSEADDR = 0x2 SO_REUSEPORT = 0xf SO_RXQ_OVFL = 0x28 @@ -2007,9 +2104,17 @@ const ( SO_SNDBUFFORCE = 0x20 SO_SNDLOWAT = 0x13 SO_SNDTIMEO = 0x15 + SO_SNDTIMEO_NEW = 0x43 + SO_SNDTIMEO_OLD = 0x15 SO_TIMESTAMP = 0x1d SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPING_NEW = 0x41 + SO_TIMESTAMPING_OLD = 0x25 SO_TIMESTAMPNS = 0x23 + SO_TIMESTAMPNS_NEW = 0x40 + SO_TIMESTAMPNS_OLD = 0x23 + SO_TIMESTAMP_NEW = 0x3f + SO_TIMESTAMP_OLD = 0x1d SO_TXTIME = 0x3d SO_TYPE = 0x3 SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 @@ -2103,6 +2208,8 @@ const ( TCOFLUSH = 0x1 TCOOFF = 0x0 TCOON = 0x1 + TCP_BPF_IW = 0x3e9 + TCP_BPF_SNDCWND_CLAMP = 0x3ea TCP_CC_INFO = 0x1a TCP_CM_INQ = 0x24 TCP_CONGESTION = 0xd @@ -2304,8 +2411,10 @@ const ( UBI_IOCMKVOL = 0x40986f00 UBI_IOCRMVOL = 0x40046f01 UBI_IOCRNVOL = 0x51106f03 + UBI_IOCRPEB = 0x40046f04 UBI_IOCRSVOL = 0x400c6f02 UBI_IOCSETVOLPROP = 0x40104f06 + UBI_IOCSPEB = 0x40046f05 UBI_IOCVOLCRBLK = 0x40804f07 UBI_IOCVOLRMBLK = 0x4f08 UBI_IOCVOLUP = 0x40084f00 @@ -2453,6 +2562,7 @@ const ( XDP_FLAGS_SKB_MODE = 0x2 XDP_FLAGS_UPDATE_IF_NOEXIST = 0x1 XDP_MMAP_OFFSETS = 0x1 + XDP_PACKET_HEADROOM = 0x100 XDP_PGOFF_RX_RING = 0x0 XDP_PGOFF_TX_RING = 0x80000000 XDP_RX_RING = 0x2 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go index ba1beb90..0ae030ee 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go @@ -197,10 +197,59 @@ const ( BPF_ABS = 0x20 BPF_ADD = 0x0 BPF_ALU = 0x4 + BPF_ALU64 = 0x7 BPF_AND = 0x50 + BPF_ANY = 0x0 + BPF_ARSH = 0xc0 BPF_B = 0x10 + BPF_BUILD_ID_SIZE = 0x14 + BPF_CALL = 0x80 + BPF_DEVCG_ACC_MKNOD = 0x1 + BPF_DEVCG_ACC_READ = 0x2 + BPF_DEVCG_ACC_WRITE = 0x4 + BPF_DEVCG_DEV_BLOCK = 0x1 + BPF_DEVCG_DEV_CHAR = 0x2 BPF_DIV = 0x30 + BPF_DW = 0x18 + BPF_END = 0xd0 + BPF_EXIST = 0x2 + BPF_EXIT = 0x90 + BPF_FROM_BE = 0x8 + BPF_FROM_LE = 0x0 BPF_FS_MAGIC = 0xcafe4a11 + BPF_F_ALLOW_MULTI = 0x2 + BPF_F_ALLOW_OVERRIDE = 0x1 + BPF_F_ANY_ALIGNMENT = 0x2 + BPF_F_CTXLEN_MASK = 0xfffff00000000 + BPF_F_CURRENT_CPU = 0xffffffff + BPF_F_CURRENT_NETNS = -0x1 + BPF_F_DONT_FRAGMENT = 0x4 + BPF_F_FAST_STACK_CMP = 0x200 + BPF_F_HDR_FIELD_MASK = 0xf + BPF_F_INDEX_MASK = 0xffffffff + BPF_F_INGRESS = 0x1 + BPF_F_INVALIDATE_HASH = 0x2 + BPF_F_LOCK = 0x4 + BPF_F_MARK_ENFORCE = 0x40 + BPF_F_MARK_MANGLED_0 = 0x20 + BPF_F_NO_COMMON_LRU = 0x2 + BPF_F_NO_PREALLOC = 0x1 + BPF_F_NUMA_NODE = 0x4 + BPF_F_PSEUDO_HDR = 0x10 + BPF_F_QUERY_EFFECTIVE = 0x1 + BPF_F_RDONLY = 0x8 + BPF_F_RECOMPUTE_CSUM = 0x1 + BPF_F_REUSE_STACKID = 0x400 + BPF_F_SEQ_NUMBER = 0x8 + BPF_F_SKIP_FIELD_MASK = 0xff + BPF_F_STACK_BUILD_ID = 0x20 + BPF_F_STRICT_ALIGNMENT = 0x1 + BPF_F_TUNINFO_IPV6 = 0x1 + BPF_F_USER_BUILD_ID = 0x800 + BPF_F_USER_STACK = 0x100 + BPF_F_WRONLY = 0x10 + BPF_F_ZERO_CSUM_TX = 0x2 + BPF_F_ZERO_SEED = 0x40 BPF_H = 0x8 BPF_IMM = 0x0 BPF_IND = 0x40 @@ -208,8 +257,16 @@ const ( BPF_JEQ = 0x10 BPF_JGE = 0x30 BPF_JGT = 0x20 + BPF_JLE = 0xb0 + BPF_JLT = 0xa0 BPF_JMP = 0x5 + BPF_JMP32 = 0x6 + BPF_JNE = 0x50 BPF_JSET = 0x40 + BPF_JSGE = 0x70 + BPF_JSGT = 0x60 + BPF_JSLE = 0xd0 + BPF_JSLT = 0xc0 BPF_K = 0x0 BPF_LD = 0x0 BPF_LDX = 0x1 @@ -223,20 +280,33 @@ const ( BPF_MINOR_VERSION = 0x1 BPF_MISC = 0x7 BPF_MOD = 0x90 + BPF_MOV = 0xb0 BPF_MSH = 0xa0 BPF_MUL = 0x20 BPF_NEG = 0x80 BPF_NET_OFF = -0x100000 + BPF_NOEXIST = 0x1 + BPF_OBJ_NAME_LEN = 0x10 BPF_OR = 0x40 + BPF_PSEUDO_CALL = 0x1 + BPF_PSEUDO_MAP_FD = 0x1 BPF_RET = 0x6 BPF_RSH = 0x70 + BPF_SOCK_OPS_ALL_CB_FLAGS = 0x7 + BPF_SOCK_OPS_RETRANS_CB_FLAG = 0x2 + BPF_SOCK_OPS_RTO_CB_FLAG = 0x1 + BPF_SOCK_OPS_STATE_CB_FLAG = 0x4 BPF_ST = 0x2 BPF_STX = 0x3 BPF_SUB = 0x10 + BPF_TAG_SIZE = 0x8 BPF_TAX = 0x0 + BPF_TO_BE = 0x8 + BPF_TO_LE = 0x0 BPF_TXA = 0x80 BPF_W = 0x0 BPF_X = 0x8 + BPF_XADD = 0xc0 BPF_XOR = 0xa0 BRKINT = 0x2 BS0 = 0x0 @@ -320,6 +390,10 @@ const ( CRDLY = 0x600 CREAD = 0x80 CRTSCTS = 0x80000000 + CRYPTO_MAX_NAME = 0x40 + CRYPTO_MSG_MAX = 0x15 + CRYPTO_NR_MSGTYPES = 0x6 + CRYPTO_REPORT_MAXSIZE = 0x160 CS5 = 0x0 CS6 = 0x10 CS7 = 0x20 @@ -497,6 +571,7 @@ const ( FAN_ALL_MARK_FLAGS = 0xff FAN_ALL_OUTGOING_EVENTS = 0x3403b FAN_ALL_PERM_EVENTS = 0x30000 + FAN_ATTRIB = 0x4 FAN_AUDIT = 0x10 FAN_CLASS_CONTENT = 0x4 FAN_CLASS_NOTIF = 0x0 @@ -505,8 +580,12 @@ const ( FAN_CLOSE = 0x18 FAN_CLOSE_NOWRITE = 0x10 FAN_CLOSE_WRITE = 0x8 + FAN_CREATE = 0x100 + FAN_DELETE = 0x200 + FAN_DELETE_SELF = 0x400 FAN_DENY = 0x2 FAN_ENABLE_AUDIT = 0x40 + FAN_EVENT_INFO_TYPE_FID = 0x1 FAN_EVENT_METADATA_LEN = 0x18 FAN_EVENT_ON_CHILD = 0x8000000 FAN_MARK_ADD = 0x1 @@ -520,6 +599,10 @@ const ( FAN_MARK_ONLYDIR = 0x8 FAN_MARK_REMOVE = 0x2 FAN_MODIFY = 0x2 + FAN_MOVE = 0xc0 + FAN_MOVED_FROM = 0x40 + FAN_MOVED_TO = 0x80 + FAN_MOVE_SELF = 0x800 FAN_NOFD = -0x1 FAN_NONBLOCK = 0x2 FAN_ONDIR = 0x40000000 @@ -528,6 +611,7 @@ const ( FAN_OPEN_EXEC_PERM = 0x40000 FAN_OPEN_PERM = 0x10000 FAN_Q_OVERFLOW = 0x4000 + FAN_REPORT_FID = 0x200 FAN_REPORT_TID = 0x100 FAN_UNLIMITED_MARKS = 0x20 FAN_UNLIMITED_QUEUE = 0x10 @@ -1050,6 +1134,15 @@ const ( MAP_SHARED_VALIDATE = 0x3 MAP_STACK = 0x40000 MAP_TYPE = 0xf + MCAST_BLOCK_SOURCE = 0x2b + MCAST_EXCLUDE = 0x0 + MCAST_INCLUDE = 0x1 + MCAST_JOIN_GROUP = 0x2a + MCAST_JOIN_SOURCE_GROUP = 0x2e + MCAST_LEAVE_GROUP = 0x2d + MCAST_LEAVE_SOURCE_GROUP = 0x2f + MCAST_MSFILTER = 0x30 + MCAST_UNBLOCK_SOURCE = 0x2c MCL_CURRENT = 0x1 MCL_FUTURE = 0x2 MCL_ONFAULT = 0x4 @@ -1485,6 +1578,7 @@ const ( PR_SET_TSC = 0x1a PR_SET_UNALIGN = 0x6 PR_SPEC_DISABLE = 0x4 + PR_SPEC_DISABLE_NOEXEC = 0x10 PR_SPEC_ENABLE = 0x2 PR_SPEC_FORCE_DISABLE = 0x8 PR_SPEC_INDIRECT_BRANCH = 0x1 @@ -1957,6 +2051,7 @@ const ( SO_ATTACH_REUSEPORT_CBPF = 0x33 SO_ATTACH_REUSEPORT_EBPF = 0x34 SO_BINDTODEVICE = 0x19 + SO_BINDTOIFINDEX = 0x3e SO_BPF_EXTENSIONS = 0x30 SO_BROADCAST = 0x20 SO_BSDCOMPAT = 0xe @@ -2005,6 +2100,8 @@ const ( SO_RCVBUFFORCE = 0x21 SO_RCVLOWAT = 0x1004 SO_RCVTIMEO = 0x1006 + SO_RCVTIMEO_NEW = 0x42 + SO_RCVTIMEO_OLD = 0x1006 SO_REUSEADDR = 0x4 SO_REUSEPORT = 0x200 SO_RXQ_OVFL = 0x28 @@ -2016,10 +2113,18 @@ const ( SO_SNDBUFFORCE = 0x1f SO_SNDLOWAT = 0x1003 SO_SNDTIMEO = 0x1005 + SO_SNDTIMEO_NEW = 0x43 + SO_SNDTIMEO_OLD = 0x1005 SO_STYLE = 0x1008 SO_TIMESTAMP = 0x1d SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPING_NEW = 0x41 + SO_TIMESTAMPING_OLD = 0x25 SO_TIMESTAMPNS = 0x23 + SO_TIMESTAMPNS_NEW = 0x40 + SO_TIMESTAMPNS_OLD = 0x23 + SO_TIMESTAMP_NEW = 0x3f + SO_TIMESTAMP_OLD = 0x1d SO_TXTIME = 0x3d SO_TYPE = 0x1008 SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 @@ -2111,6 +2216,8 @@ const ( TCOFLUSH = 0x1 TCOOFF = 0x0 TCOON = 0x1 + TCP_BPF_IW = 0x3e9 + TCP_BPF_SNDCWND_CLAMP = 0x3ea TCP_CC_INFO = 0x1a TCP_CM_INQ = 0x24 TCP_CONGESTION = 0xd @@ -2314,8 +2421,10 @@ const ( UBI_IOCMKVOL = 0x80986f00 UBI_IOCRMVOL = 0x80046f01 UBI_IOCRNVOL = 0x91106f03 + UBI_IOCRPEB = 0x80046f04 UBI_IOCRSVOL = 0x800c6f02 UBI_IOCSETVOLPROP = 0x80104f06 + UBI_IOCSPEB = 0x80046f05 UBI_IOCVOLCRBLK = 0x80804f07 UBI_IOCVOLRMBLK = 0x20004f08 UBI_IOCVOLUP = 0x80084f00 @@ -2464,6 +2573,7 @@ const ( XDP_FLAGS_SKB_MODE = 0x2 XDP_FLAGS_UPDATE_IF_NOEXIST = 0x1 XDP_MMAP_OFFSETS = 0x1 + XDP_PACKET_HEADROOM = 0x100 XDP_PGOFF_RX_RING = 0x0 XDP_PGOFF_TX_RING = 0x80000000 XDP_RX_RING = 0x2 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go index efba3e5c..91b49ddd 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go @@ -197,10 +197,59 @@ const ( BPF_ABS = 0x20 BPF_ADD = 0x0 BPF_ALU = 0x4 + BPF_ALU64 = 0x7 BPF_AND = 0x50 + BPF_ANY = 0x0 + BPF_ARSH = 0xc0 BPF_B = 0x10 + BPF_BUILD_ID_SIZE = 0x14 + BPF_CALL = 0x80 + BPF_DEVCG_ACC_MKNOD = 0x1 + BPF_DEVCG_ACC_READ = 0x2 + BPF_DEVCG_ACC_WRITE = 0x4 + BPF_DEVCG_DEV_BLOCK = 0x1 + BPF_DEVCG_DEV_CHAR = 0x2 BPF_DIV = 0x30 + BPF_DW = 0x18 + BPF_END = 0xd0 + BPF_EXIST = 0x2 + BPF_EXIT = 0x90 + BPF_FROM_BE = 0x8 + BPF_FROM_LE = 0x0 BPF_FS_MAGIC = 0xcafe4a11 + BPF_F_ALLOW_MULTI = 0x2 + BPF_F_ALLOW_OVERRIDE = 0x1 + BPF_F_ANY_ALIGNMENT = 0x2 + BPF_F_CTXLEN_MASK = 0xfffff00000000 + BPF_F_CURRENT_CPU = 0xffffffff + BPF_F_CURRENT_NETNS = -0x1 + BPF_F_DONT_FRAGMENT = 0x4 + BPF_F_FAST_STACK_CMP = 0x200 + BPF_F_HDR_FIELD_MASK = 0xf + BPF_F_INDEX_MASK = 0xffffffff + BPF_F_INGRESS = 0x1 + BPF_F_INVALIDATE_HASH = 0x2 + BPF_F_LOCK = 0x4 + BPF_F_MARK_ENFORCE = 0x40 + BPF_F_MARK_MANGLED_0 = 0x20 + BPF_F_NO_COMMON_LRU = 0x2 + BPF_F_NO_PREALLOC = 0x1 + BPF_F_NUMA_NODE = 0x4 + BPF_F_PSEUDO_HDR = 0x10 + BPF_F_QUERY_EFFECTIVE = 0x1 + BPF_F_RDONLY = 0x8 + BPF_F_RECOMPUTE_CSUM = 0x1 + BPF_F_REUSE_STACKID = 0x400 + BPF_F_SEQ_NUMBER = 0x8 + BPF_F_SKIP_FIELD_MASK = 0xff + BPF_F_STACK_BUILD_ID = 0x20 + BPF_F_STRICT_ALIGNMENT = 0x1 + BPF_F_TUNINFO_IPV6 = 0x1 + BPF_F_USER_BUILD_ID = 0x800 + BPF_F_USER_STACK = 0x100 + BPF_F_WRONLY = 0x10 + BPF_F_ZERO_CSUM_TX = 0x2 + BPF_F_ZERO_SEED = 0x40 BPF_H = 0x8 BPF_IMM = 0x0 BPF_IND = 0x40 @@ -208,8 +257,16 @@ const ( BPF_JEQ = 0x10 BPF_JGE = 0x30 BPF_JGT = 0x20 + BPF_JLE = 0xb0 + BPF_JLT = 0xa0 BPF_JMP = 0x5 + BPF_JMP32 = 0x6 + BPF_JNE = 0x50 BPF_JSET = 0x40 + BPF_JSGE = 0x70 + BPF_JSGT = 0x60 + BPF_JSLE = 0xd0 + BPF_JSLT = 0xc0 BPF_K = 0x0 BPF_LD = 0x0 BPF_LDX = 0x1 @@ -223,20 +280,33 @@ const ( BPF_MINOR_VERSION = 0x1 BPF_MISC = 0x7 BPF_MOD = 0x90 + BPF_MOV = 0xb0 BPF_MSH = 0xa0 BPF_MUL = 0x20 BPF_NEG = 0x80 BPF_NET_OFF = -0x100000 + BPF_NOEXIST = 0x1 + BPF_OBJ_NAME_LEN = 0x10 BPF_OR = 0x40 + BPF_PSEUDO_CALL = 0x1 + BPF_PSEUDO_MAP_FD = 0x1 BPF_RET = 0x6 BPF_RSH = 0x70 + BPF_SOCK_OPS_ALL_CB_FLAGS = 0x7 + BPF_SOCK_OPS_RETRANS_CB_FLAG = 0x2 + BPF_SOCK_OPS_RTO_CB_FLAG = 0x1 + BPF_SOCK_OPS_STATE_CB_FLAG = 0x4 BPF_ST = 0x2 BPF_STX = 0x3 BPF_SUB = 0x10 + BPF_TAG_SIZE = 0x8 BPF_TAX = 0x0 + BPF_TO_BE = 0x8 + BPF_TO_LE = 0x0 BPF_TXA = 0x80 BPF_W = 0x0 BPF_X = 0x8 + BPF_XADD = 0xc0 BPF_XOR = 0xa0 BRKINT = 0x2 BS0 = 0x0 @@ -320,6 +390,10 @@ const ( CRDLY = 0x600 CREAD = 0x80 CRTSCTS = 0x80000000 + CRYPTO_MAX_NAME = 0x40 + CRYPTO_MSG_MAX = 0x15 + CRYPTO_NR_MSGTYPES = 0x6 + CRYPTO_REPORT_MAXSIZE = 0x160 CS5 = 0x0 CS6 = 0x10 CS7 = 0x20 @@ -497,6 +571,7 @@ const ( FAN_ALL_MARK_FLAGS = 0xff FAN_ALL_OUTGOING_EVENTS = 0x3403b FAN_ALL_PERM_EVENTS = 0x30000 + FAN_ATTRIB = 0x4 FAN_AUDIT = 0x10 FAN_CLASS_CONTENT = 0x4 FAN_CLASS_NOTIF = 0x0 @@ -505,8 +580,12 @@ const ( FAN_CLOSE = 0x18 FAN_CLOSE_NOWRITE = 0x10 FAN_CLOSE_WRITE = 0x8 + FAN_CREATE = 0x100 + FAN_DELETE = 0x200 + FAN_DELETE_SELF = 0x400 FAN_DENY = 0x2 FAN_ENABLE_AUDIT = 0x40 + FAN_EVENT_INFO_TYPE_FID = 0x1 FAN_EVENT_METADATA_LEN = 0x18 FAN_EVENT_ON_CHILD = 0x8000000 FAN_MARK_ADD = 0x1 @@ -520,6 +599,10 @@ const ( FAN_MARK_ONLYDIR = 0x8 FAN_MARK_REMOVE = 0x2 FAN_MODIFY = 0x2 + FAN_MOVE = 0xc0 + FAN_MOVED_FROM = 0x40 + FAN_MOVED_TO = 0x80 + FAN_MOVE_SELF = 0x800 FAN_NOFD = -0x1 FAN_NONBLOCK = 0x2 FAN_ONDIR = 0x40000000 @@ -528,6 +611,7 @@ const ( FAN_OPEN_EXEC_PERM = 0x40000 FAN_OPEN_PERM = 0x10000 FAN_Q_OVERFLOW = 0x4000 + FAN_REPORT_FID = 0x200 FAN_REPORT_TID = 0x100 FAN_UNLIMITED_MARKS = 0x20 FAN_UNLIMITED_QUEUE = 0x10 @@ -1050,6 +1134,15 @@ const ( MAP_SHARED_VALIDATE = 0x3 MAP_STACK = 0x40000 MAP_TYPE = 0xf + MCAST_BLOCK_SOURCE = 0x2b + MCAST_EXCLUDE = 0x0 + MCAST_INCLUDE = 0x1 + MCAST_JOIN_GROUP = 0x2a + MCAST_JOIN_SOURCE_GROUP = 0x2e + MCAST_LEAVE_GROUP = 0x2d + MCAST_LEAVE_SOURCE_GROUP = 0x2f + MCAST_MSFILTER = 0x30 + MCAST_UNBLOCK_SOURCE = 0x2c MCL_CURRENT = 0x1 MCL_FUTURE = 0x2 MCL_ONFAULT = 0x4 @@ -1485,6 +1578,7 @@ const ( PR_SET_TSC = 0x1a PR_SET_UNALIGN = 0x6 PR_SPEC_DISABLE = 0x4 + PR_SPEC_DISABLE_NOEXEC = 0x10 PR_SPEC_ENABLE = 0x2 PR_SPEC_FORCE_DISABLE = 0x8 PR_SPEC_INDIRECT_BRANCH = 0x1 @@ -1957,6 +2051,7 @@ const ( SO_ATTACH_REUSEPORT_CBPF = 0x33 SO_ATTACH_REUSEPORT_EBPF = 0x34 SO_BINDTODEVICE = 0x19 + SO_BINDTOIFINDEX = 0x3e SO_BPF_EXTENSIONS = 0x30 SO_BROADCAST = 0x20 SO_BSDCOMPAT = 0xe @@ -2005,6 +2100,8 @@ const ( SO_RCVBUFFORCE = 0x21 SO_RCVLOWAT = 0x1004 SO_RCVTIMEO = 0x1006 + SO_RCVTIMEO_NEW = 0x42 + SO_RCVTIMEO_OLD = 0x1006 SO_REUSEADDR = 0x4 SO_REUSEPORT = 0x200 SO_RXQ_OVFL = 0x28 @@ -2016,10 +2113,18 @@ const ( SO_SNDBUFFORCE = 0x1f SO_SNDLOWAT = 0x1003 SO_SNDTIMEO = 0x1005 + SO_SNDTIMEO_NEW = 0x43 + SO_SNDTIMEO_OLD = 0x1005 SO_STYLE = 0x1008 SO_TIMESTAMP = 0x1d SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPING_NEW = 0x41 + SO_TIMESTAMPING_OLD = 0x25 SO_TIMESTAMPNS = 0x23 + SO_TIMESTAMPNS_NEW = 0x40 + SO_TIMESTAMPNS_OLD = 0x23 + SO_TIMESTAMP_NEW = 0x3f + SO_TIMESTAMP_OLD = 0x1d SO_TXTIME = 0x3d SO_TYPE = 0x1008 SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 @@ -2111,6 +2216,8 @@ const ( TCOFLUSH = 0x1 TCOOFF = 0x0 TCOON = 0x1 + TCP_BPF_IW = 0x3e9 + TCP_BPF_SNDCWND_CLAMP = 0x3ea TCP_CC_INFO = 0x1a TCP_CM_INQ = 0x24 TCP_CONGESTION = 0xd @@ -2314,8 +2421,10 @@ const ( UBI_IOCMKVOL = 0x80986f00 UBI_IOCRMVOL = 0x80046f01 UBI_IOCRNVOL = 0x91106f03 + UBI_IOCRPEB = 0x80046f04 UBI_IOCRSVOL = 0x800c6f02 UBI_IOCSETVOLPROP = 0x80104f06 + UBI_IOCSPEB = 0x80046f05 UBI_IOCVOLCRBLK = 0x80804f07 UBI_IOCVOLRMBLK = 0x20004f08 UBI_IOCVOLUP = 0x80084f00 @@ -2464,6 +2573,7 @@ const ( XDP_FLAGS_SKB_MODE = 0x2 XDP_FLAGS_UPDATE_IF_NOEXIST = 0x1 XDP_MMAP_OFFSETS = 0x1 + XDP_PACKET_HEADROOM = 0x100 XDP_PGOFF_RX_RING = 0x0 XDP_PGOFF_TX_RING = 0x80000000 XDP_RX_RING = 0x2 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go index d3f6e906..7f1ef04e 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go @@ -197,10 +197,59 @@ const ( BPF_ABS = 0x20 BPF_ADD = 0x0 BPF_ALU = 0x4 + BPF_ALU64 = 0x7 BPF_AND = 0x50 + BPF_ANY = 0x0 + BPF_ARSH = 0xc0 BPF_B = 0x10 + BPF_BUILD_ID_SIZE = 0x14 + BPF_CALL = 0x80 + BPF_DEVCG_ACC_MKNOD = 0x1 + BPF_DEVCG_ACC_READ = 0x2 + BPF_DEVCG_ACC_WRITE = 0x4 + BPF_DEVCG_DEV_BLOCK = 0x1 + BPF_DEVCG_DEV_CHAR = 0x2 BPF_DIV = 0x30 + BPF_DW = 0x18 + BPF_END = 0xd0 + BPF_EXIST = 0x2 + BPF_EXIT = 0x90 + BPF_FROM_BE = 0x8 + BPF_FROM_LE = 0x0 BPF_FS_MAGIC = 0xcafe4a11 + BPF_F_ALLOW_MULTI = 0x2 + BPF_F_ALLOW_OVERRIDE = 0x1 + BPF_F_ANY_ALIGNMENT = 0x2 + BPF_F_CTXLEN_MASK = 0xfffff00000000 + BPF_F_CURRENT_CPU = 0xffffffff + BPF_F_CURRENT_NETNS = -0x1 + BPF_F_DONT_FRAGMENT = 0x4 + BPF_F_FAST_STACK_CMP = 0x200 + BPF_F_HDR_FIELD_MASK = 0xf + BPF_F_INDEX_MASK = 0xffffffff + BPF_F_INGRESS = 0x1 + BPF_F_INVALIDATE_HASH = 0x2 + BPF_F_LOCK = 0x4 + BPF_F_MARK_ENFORCE = 0x40 + BPF_F_MARK_MANGLED_0 = 0x20 + BPF_F_NO_COMMON_LRU = 0x2 + BPF_F_NO_PREALLOC = 0x1 + BPF_F_NUMA_NODE = 0x4 + BPF_F_PSEUDO_HDR = 0x10 + BPF_F_QUERY_EFFECTIVE = 0x1 + BPF_F_RDONLY = 0x8 + BPF_F_RECOMPUTE_CSUM = 0x1 + BPF_F_REUSE_STACKID = 0x400 + BPF_F_SEQ_NUMBER = 0x8 + BPF_F_SKIP_FIELD_MASK = 0xff + BPF_F_STACK_BUILD_ID = 0x20 + BPF_F_STRICT_ALIGNMENT = 0x1 + BPF_F_TUNINFO_IPV6 = 0x1 + BPF_F_USER_BUILD_ID = 0x800 + BPF_F_USER_STACK = 0x100 + BPF_F_WRONLY = 0x10 + BPF_F_ZERO_CSUM_TX = 0x2 + BPF_F_ZERO_SEED = 0x40 BPF_H = 0x8 BPF_IMM = 0x0 BPF_IND = 0x40 @@ -208,8 +257,16 @@ const ( BPF_JEQ = 0x10 BPF_JGE = 0x30 BPF_JGT = 0x20 + BPF_JLE = 0xb0 + BPF_JLT = 0xa0 BPF_JMP = 0x5 + BPF_JMP32 = 0x6 + BPF_JNE = 0x50 BPF_JSET = 0x40 + BPF_JSGE = 0x70 + BPF_JSGT = 0x60 + BPF_JSLE = 0xd0 + BPF_JSLT = 0xc0 BPF_K = 0x0 BPF_LD = 0x0 BPF_LDX = 0x1 @@ -223,20 +280,33 @@ const ( BPF_MINOR_VERSION = 0x1 BPF_MISC = 0x7 BPF_MOD = 0x90 + BPF_MOV = 0xb0 BPF_MSH = 0xa0 BPF_MUL = 0x20 BPF_NEG = 0x80 BPF_NET_OFF = -0x100000 + BPF_NOEXIST = 0x1 + BPF_OBJ_NAME_LEN = 0x10 BPF_OR = 0x40 + BPF_PSEUDO_CALL = 0x1 + BPF_PSEUDO_MAP_FD = 0x1 BPF_RET = 0x6 BPF_RSH = 0x70 + BPF_SOCK_OPS_ALL_CB_FLAGS = 0x7 + BPF_SOCK_OPS_RETRANS_CB_FLAG = 0x2 + BPF_SOCK_OPS_RTO_CB_FLAG = 0x1 + BPF_SOCK_OPS_STATE_CB_FLAG = 0x4 BPF_ST = 0x2 BPF_STX = 0x3 BPF_SUB = 0x10 + BPF_TAG_SIZE = 0x8 BPF_TAX = 0x0 + BPF_TO_BE = 0x8 + BPF_TO_LE = 0x0 BPF_TXA = 0x80 BPF_W = 0x0 BPF_X = 0x8 + BPF_XADD = 0xc0 BPF_XOR = 0xa0 BRKINT = 0x2 BS0 = 0x0 @@ -320,6 +390,10 @@ const ( CRDLY = 0x600 CREAD = 0x80 CRTSCTS = 0x80000000 + CRYPTO_MAX_NAME = 0x40 + CRYPTO_MSG_MAX = 0x15 + CRYPTO_NR_MSGTYPES = 0x6 + CRYPTO_REPORT_MAXSIZE = 0x160 CS5 = 0x0 CS6 = 0x10 CS7 = 0x20 @@ -497,6 +571,7 @@ const ( FAN_ALL_MARK_FLAGS = 0xff FAN_ALL_OUTGOING_EVENTS = 0x3403b FAN_ALL_PERM_EVENTS = 0x30000 + FAN_ATTRIB = 0x4 FAN_AUDIT = 0x10 FAN_CLASS_CONTENT = 0x4 FAN_CLASS_NOTIF = 0x0 @@ -505,8 +580,12 @@ const ( FAN_CLOSE = 0x18 FAN_CLOSE_NOWRITE = 0x10 FAN_CLOSE_WRITE = 0x8 + FAN_CREATE = 0x100 + FAN_DELETE = 0x200 + FAN_DELETE_SELF = 0x400 FAN_DENY = 0x2 FAN_ENABLE_AUDIT = 0x40 + FAN_EVENT_INFO_TYPE_FID = 0x1 FAN_EVENT_METADATA_LEN = 0x18 FAN_EVENT_ON_CHILD = 0x8000000 FAN_MARK_ADD = 0x1 @@ -520,6 +599,10 @@ const ( FAN_MARK_ONLYDIR = 0x8 FAN_MARK_REMOVE = 0x2 FAN_MODIFY = 0x2 + FAN_MOVE = 0xc0 + FAN_MOVED_FROM = 0x40 + FAN_MOVED_TO = 0x80 + FAN_MOVE_SELF = 0x800 FAN_NOFD = -0x1 FAN_NONBLOCK = 0x2 FAN_ONDIR = 0x40000000 @@ -528,6 +611,7 @@ const ( FAN_OPEN_EXEC_PERM = 0x40000 FAN_OPEN_PERM = 0x10000 FAN_Q_OVERFLOW = 0x4000 + FAN_REPORT_FID = 0x200 FAN_REPORT_TID = 0x100 FAN_UNLIMITED_MARKS = 0x20 FAN_UNLIMITED_QUEUE = 0x10 @@ -1050,6 +1134,15 @@ const ( MAP_SHARED_VALIDATE = 0x3 MAP_STACK = 0x40000 MAP_TYPE = 0xf + MCAST_BLOCK_SOURCE = 0x2b + MCAST_EXCLUDE = 0x0 + MCAST_INCLUDE = 0x1 + MCAST_JOIN_GROUP = 0x2a + MCAST_JOIN_SOURCE_GROUP = 0x2e + MCAST_LEAVE_GROUP = 0x2d + MCAST_LEAVE_SOURCE_GROUP = 0x2f + MCAST_MSFILTER = 0x30 + MCAST_UNBLOCK_SOURCE = 0x2c MCL_CURRENT = 0x1 MCL_FUTURE = 0x2 MCL_ONFAULT = 0x4 @@ -1485,6 +1578,7 @@ const ( PR_SET_TSC = 0x1a PR_SET_UNALIGN = 0x6 PR_SPEC_DISABLE = 0x4 + PR_SPEC_DISABLE_NOEXEC = 0x10 PR_SPEC_ENABLE = 0x2 PR_SPEC_FORCE_DISABLE = 0x8 PR_SPEC_INDIRECT_BRANCH = 0x1 @@ -1957,6 +2051,7 @@ const ( SO_ATTACH_REUSEPORT_CBPF = 0x33 SO_ATTACH_REUSEPORT_EBPF = 0x34 SO_BINDTODEVICE = 0x19 + SO_BINDTOIFINDEX = 0x3e SO_BPF_EXTENSIONS = 0x30 SO_BROADCAST = 0x20 SO_BSDCOMPAT = 0xe @@ -2005,6 +2100,8 @@ const ( SO_RCVBUFFORCE = 0x21 SO_RCVLOWAT = 0x1004 SO_RCVTIMEO = 0x1006 + SO_RCVTIMEO_NEW = 0x42 + SO_RCVTIMEO_OLD = 0x1006 SO_REUSEADDR = 0x4 SO_REUSEPORT = 0x200 SO_RXQ_OVFL = 0x28 @@ -2016,10 +2113,18 @@ const ( SO_SNDBUFFORCE = 0x1f SO_SNDLOWAT = 0x1003 SO_SNDTIMEO = 0x1005 + SO_SNDTIMEO_NEW = 0x43 + SO_SNDTIMEO_OLD = 0x1005 SO_STYLE = 0x1008 SO_TIMESTAMP = 0x1d SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPING_NEW = 0x41 + SO_TIMESTAMPING_OLD = 0x25 SO_TIMESTAMPNS = 0x23 + SO_TIMESTAMPNS_NEW = 0x40 + SO_TIMESTAMPNS_OLD = 0x23 + SO_TIMESTAMP_NEW = 0x3f + SO_TIMESTAMP_OLD = 0x1d SO_TXTIME = 0x3d SO_TYPE = 0x1008 SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 @@ -2111,6 +2216,8 @@ const ( TCOFLUSH = 0x1 TCOOFF = 0x0 TCOON = 0x1 + TCP_BPF_IW = 0x3e9 + TCP_BPF_SNDCWND_CLAMP = 0x3ea TCP_CC_INFO = 0x1a TCP_CM_INQ = 0x24 TCP_CONGESTION = 0xd @@ -2314,8 +2421,10 @@ const ( UBI_IOCMKVOL = 0x80986f00 UBI_IOCRMVOL = 0x80046f01 UBI_IOCRNVOL = 0x91106f03 + UBI_IOCRPEB = 0x80046f04 UBI_IOCRSVOL = 0x800c6f02 UBI_IOCSETVOLPROP = 0x80104f06 + UBI_IOCSPEB = 0x80046f05 UBI_IOCVOLCRBLK = 0x80804f07 UBI_IOCVOLRMBLK = 0x20004f08 UBI_IOCVOLUP = 0x80084f00 @@ -2464,6 +2573,7 @@ const ( XDP_FLAGS_SKB_MODE = 0x2 XDP_FLAGS_UPDATE_IF_NOEXIST = 0x1 XDP_MMAP_OFFSETS = 0x1 + XDP_PACKET_HEADROOM = 0x100 XDP_PGOFF_RX_RING = 0x0 XDP_PGOFF_TX_RING = 0x80000000 XDP_RX_RING = 0x2 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go index 7275cd87..724a244f 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go @@ -197,10 +197,59 @@ const ( BPF_ABS = 0x20 BPF_ADD = 0x0 BPF_ALU = 0x4 + BPF_ALU64 = 0x7 BPF_AND = 0x50 + BPF_ANY = 0x0 + BPF_ARSH = 0xc0 BPF_B = 0x10 + BPF_BUILD_ID_SIZE = 0x14 + BPF_CALL = 0x80 + BPF_DEVCG_ACC_MKNOD = 0x1 + BPF_DEVCG_ACC_READ = 0x2 + BPF_DEVCG_ACC_WRITE = 0x4 + BPF_DEVCG_DEV_BLOCK = 0x1 + BPF_DEVCG_DEV_CHAR = 0x2 BPF_DIV = 0x30 + BPF_DW = 0x18 + BPF_END = 0xd0 + BPF_EXIST = 0x2 + BPF_EXIT = 0x90 + BPF_FROM_BE = 0x8 + BPF_FROM_LE = 0x0 BPF_FS_MAGIC = 0xcafe4a11 + BPF_F_ALLOW_MULTI = 0x2 + BPF_F_ALLOW_OVERRIDE = 0x1 + BPF_F_ANY_ALIGNMENT = 0x2 + BPF_F_CTXLEN_MASK = 0xfffff00000000 + BPF_F_CURRENT_CPU = 0xffffffff + BPF_F_CURRENT_NETNS = -0x1 + BPF_F_DONT_FRAGMENT = 0x4 + BPF_F_FAST_STACK_CMP = 0x200 + BPF_F_HDR_FIELD_MASK = 0xf + BPF_F_INDEX_MASK = 0xffffffff + BPF_F_INGRESS = 0x1 + BPF_F_INVALIDATE_HASH = 0x2 + BPF_F_LOCK = 0x4 + BPF_F_MARK_ENFORCE = 0x40 + BPF_F_MARK_MANGLED_0 = 0x20 + BPF_F_NO_COMMON_LRU = 0x2 + BPF_F_NO_PREALLOC = 0x1 + BPF_F_NUMA_NODE = 0x4 + BPF_F_PSEUDO_HDR = 0x10 + BPF_F_QUERY_EFFECTIVE = 0x1 + BPF_F_RDONLY = 0x8 + BPF_F_RECOMPUTE_CSUM = 0x1 + BPF_F_REUSE_STACKID = 0x400 + BPF_F_SEQ_NUMBER = 0x8 + BPF_F_SKIP_FIELD_MASK = 0xff + BPF_F_STACK_BUILD_ID = 0x20 + BPF_F_STRICT_ALIGNMENT = 0x1 + BPF_F_TUNINFO_IPV6 = 0x1 + BPF_F_USER_BUILD_ID = 0x800 + BPF_F_USER_STACK = 0x100 + BPF_F_WRONLY = 0x10 + BPF_F_ZERO_CSUM_TX = 0x2 + BPF_F_ZERO_SEED = 0x40 BPF_H = 0x8 BPF_IMM = 0x0 BPF_IND = 0x40 @@ -208,8 +257,16 @@ const ( BPF_JEQ = 0x10 BPF_JGE = 0x30 BPF_JGT = 0x20 + BPF_JLE = 0xb0 + BPF_JLT = 0xa0 BPF_JMP = 0x5 + BPF_JMP32 = 0x6 + BPF_JNE = 0x50 BPF_JSET = 0x40 + BPF_JSGE = 0x70 + BPF_JSGT = 0x60 + BPF_JSLE = 0xd0 + BPF_JSLT = 0xc0 BPF_K = 0x0 BPF_LD = 0x0 BPF_LDX = 0x1 @@ -223,20 +280,33 @@ const ( BPF_MINOR_VERSION = 0x1 BPF_MISC = 0x7 BPF_MOD = 0x90 + BPF_MOV = 0xb0 BPF_MSH = 0xa0 BPF_MUL = 0x20 BPF_NEG = 0x80 BPF_NET_OFF = -0x100000 + BPF_NOEXIST = 0x1 + BPF_OBJ_NAME_LEN = 0x10 BPF_OR = 0x40 + BPF_PSEUDO_CALL = 0x1 + BPF_PSEUDO_MAP_FD = 0x1 BPF_RET = 0x6 BPF_RSH = 0x70 + BPF_SOCK_OPS_ALL_CB_FLAGS = 0x7 + BPF_SOCK_OPS_RETRANS_CB_FLAG = 0x2 + BPF_SOCK_OPS_RTO_CB_FLAG = 0x1 + BPF_SOCK_OPS_STATE_CB_FLAG = 0x4 BPF_ST = 0x2 BPF_STX = 0x3 BPF_SUB = 0x10 + BPF_TAG_SIZE = 0x8 BPF_TAX = 0x0 + BPF_TO_BE = 0x8 + BPF_TO_LE = 0x0 BPF_TXA = 0x80 BPF_W = 0x0 BPF_X = 0x8 + BPF_XADD = 0xc0 BPF_XOR = 0xa0 BRKINT = 0x2 BS0 = 0x0 @@ -320,6 +390,10 @@ const ( CRDLY = 0x600 CREAD = 0x80 CRTSCTS = 0x80000000 + CRYPTO_MAX_NAME = 0x40 + CRYPTO_MSG_MAX = 0x15 + CRYPTO_NR_MSGTYPES = 0x6 + CRYPTO_REPORT_MAXSIZE = 0x160 CS5 = 0x0 CS6 = 0x10 CS7 = 0x20 @@ -497,6 +571,7 @@ const ( FAN_ALL_MARK_FLAGS = 0xff FAN_ALL_OUTGOING_EVENTS = 0x3403b FAN_ALL_PERM_EVENTS = 0x30000 + FAN_ATTRIB = 0x4 FAN_AUDIT = 0x10 FAN_CLASS_CONTENT = 0x4 FAN_CLASS_NOTIF = 0x0 @@ -505,8 +580,12 @@ const ( FAN_CLOSE = 0x18 FAN_CLOSE_NOWRITE = 0x10 FAN_CLOSE_WRITE = 0x8 + FAN_CREATE = 0x100 + FAN_DELETE = 0x200 + FAN_DELETE_SELF = 0x400 FAN_DENY = 0x2 FAN_ENABLE_AUDIT = 0x40 + FAN_EVENT_INFO_TYPE_FID = 0x1 FAN_EVENT_METADATA_LEN = 0x18 FAN_EVENT_ON_CHILD = 0x8000000 FAN_MARK_ADD = 0x1 @@ -520,6 +599,10 @@ const ( FAN_MARK_ONLYDIR = 0x8 FAN_MARK_REMOVE = 0x2 FAN_MODIFY = 0x2 + FAN_MOVE = 0xc0 + FAN_MOVED_FROM = 0x40 + FAN_MOVED_TO = 0x80 + FAN_MOVE_SELF = 0x800 FAN_NOFD = -0x1 FAN_NONBLOCK = 0x2 FAN_ONDIR = 0x40000000 @@ -528,6 +611,7 @@ const ( FAN_OPEN_EXEC_PERM = 0x40000 FAN_OPEN_PERM = 0x10000 FAN_Q_OVERFLOW = 0x4000 + FAN_REPORT_FID = 0x200 FAN_REPORT_TID = 0x100 FAN_UNLIMITED_MARKS = 0x20 FAN_UNLIMITED_QUEUE = 0x10 @@ -1050,6 +1134,15 @@ const ( MAP_SHARED_VALIDATE = 0x3 MAP_STACK = 0x40000 MAP_TYPE = 0xf + MCAST_BLOCK_SOURCE = 0x2b + MCAST_EXCLUDE = 0x0 + MCAST_INCLUDE = 0x1 + MCAST_JOIN_GROUP = 0x2a + MCAST_JOIN_SOURCE_GROUP = 0x2e + MCAST_LEAVE_GROUP = 0x2d + MCAST_LEAVE_SOURCE_GROUP = 0x2f + MCAST_MSFILTER = 0x30 + MCAST_UNBLOCK_SOURCE = 0x2c MCL_CURRENT = 0x1 MCL_FUTURE = 0x2 MCL_ONFAULT = 0x4 @@ -1485,6 +1578,7 @@ const ( PR_SET_TSC = 0x1a PR_SET_UNALIGN = 0x6 PR_SPEC_DISABLE = 0x4 + PR_SPEC_DISABLE_NOEXEC = 0x10 PR_SPEC_ENABLE = 0x2 PR_SPEC_FORCE_DISABLE = 0x8 PR_SPEC_INDIRECT_BRANCH = 0x1 @@ -1957,6 +2051,7 @@ const ( SO_ATTACH_REUSEPORT_CBPF = 0x33 SO_ATTACH_REUSEPORT_EBPF = 0x34 SO_BINDTODEVICE = 0x19 + SO_BINDTOIFINDEX = 0x3e SO_BPF_EXTENSIONS = 0x30 SO_BROADCAST = 0x20 SO_BSDCOMPAT = 0xe @@ -2005,6 +2100,8 @@ const ( SO_RCVBUFFORCE = 0x21 SO_RCVLOWAT = 0x1004 SO_RCVTIMEO = 0x1006 + SO_RCVTIMEO_NEW = 0x42 + SO_RCVTIMEO_OLD = 0x1006 SO_REUSEADDR = 0x4 SO_REUSEPORT = 0x200 SO_RXQ_OVFL = 0x28 @@ -2016,10 +2113,18 @@ const ( SO_SNDBUFFORCE = 0x1f SO_SNDLOWAT = 0x1003 SO_SNDTIMEO = 0x1005 + SO_SNDTIMEO_NEW = 0x43 + SO_SNDTIMEO_OLD = 0x1005 SO_STYLE = 0x1008 SO_TIMESTAMP = 0x1d SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPING_NEW = 0x41 + SO_TIMESTAMPING_OLD = 0x25 SO_TIMESTAMPNS = 0x23 + SO_TIMESTAMPNS_NEW = 0x40 + SO_TIMESTAMPNS_OLD = 0x23 + SO_TIMESTAMP_NEW = 0x3f + SO_TIMESTAMP_OLD = 0x1d SO_TXTIME = 0x3d SO_TYPE = 0x1008 SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 @@ -2111,6 +2216,8 @@ const ( TCOFLUSH = 0x1 TCOOFF = 0x0 TCOON = 0x1 + TCP_BPF_IW = 0x3e9 + TCP_BPF_SNDCWND_CLAMP = 0x3ea TCP_CC_INFO = 0x1a TCP_CM_INQ = 0x24 TCP_CONGESTION = 0xd @@ -2314,8 +2421,10 @@ const ( UBI_IOCMKVOL = 0x80986f00 UBI_IOCRMVOL = 0x80046f01 UBI_IOCRNVOL = 0x91106f03 + UBI_IOCRPEB = 0x80046f04 UBI_IOCRSVOL = 0x800c6f02 UBI_IOCSETVOLPROP = 0x80104f06 + UBI_IOCSPEB = 0x80046f05 UBI_IOCVOLCRBLK = 0x80804f07 UBI_IOCVOLRMBLK = 0x20004f08 UBI_IOCVOLUP = 0x80084f00 @@ -2464,6 +2573,7 @@ const ( XDP_FLAGS_SKB_MODE = 0x2 XDP_FLAGS_UPDATE_IF_NOEXIST = 0x1 XDP_MMAP_OFFSETS = 0x1 + XDP_PACKET_HEADROOM = 0x100 XDP_PGOFF_RX_RING = 0x0 XDP_PGOFF_TX_RING = 0x80000000 XDP_RX_RING = 0x2 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go index 7586a134..25044629 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go @@ -197,10 +197,59 @@ const ( BPF_ABS = 0x20 BPF_ADD = 0x0 BPF_ALU = 0x4 + BPF_ALU64 = 0x7 BPF_AND = 0x50 + BPF_ANY = 0x0 + BPF_ARSH = 0xc0 BPF_B = 0x10 + BPF_BUILD_ID_SIZE = 0x14 + BPF_CALL = 0x80 + BPF_DEVCG_ACC_MKNOD = 0x1 + BPF_DEVCG_ACC_READ = 0x2 + BPF_DEVCG_ACC_WRITE = 0x4 + BPF_DEVCG_DEV_BLOCK = 0x1 + BPF_DEVCG_DEV_CHAR = 0x2 BPF_DIV = 0x30 + BPF_DW = 0x18 + BPF_END = 0xd0 + BPF_EXIST = 0x2 + BPF_EXIT = 0x90 + BPF_FROM_BE = 0x8 + BPF_FROM_LE = 0x0 BPF_FS_MAGIC = 0xcafe4a11 + BPF_F_ALLOW_MULTI = 0x2 + BPF_F_ALLOW_OVERRIDE = 0x1 + BPF_F_ANY_ALIGNMENT = 0x2 + BPF_F_CTXLEN_MASK = 0xfffff00000000 + BPF_F_CURRENT_CPU = 0xffffffff + BPF_F_CURRENT_NETNS = -0x1 + BPF_F_DONT_FRAGMENT = 0x4 + BPF_F_FAST_STACK_CMP = 0x200 + BPF_F_HDR_FIELD_MASK = 0xf + BPF_F_INDEX_MASK = 0xffffffff + BPF_F_INGRESS = 0x1 + BPF_F_INVALIDATE_HASH = 0x2 + BPF_F_LOCK = 0x4 + BPF_F_MARK_ENFORCE = 0x40 + BPF_F_MARK_MANGLED_0 = 0x20 + BPF_F_NO_COMMON_LRU = 0x2 + BPF_F_NO_PREALLOC = 0x1 + BPF_F_NUMA_NODE = 0x4 + BPF_F_PSEUDO_HDR = 0x10 + BPF_F_QUERY_EFFECTIVE = 0x1 + BPF_F_RDONLY = 0x8 + BPF_F_RECOMPUTE_CSUM = 0x1 + BPF_F_REUSE_STACKID = 0x400 + BPF_F_SEQ_NUMBER = 0x8 + BPF_F_SKIP_FIELD_MASK = 0xff + BPF_F_STACK_BUILD_ID = 0x20 + BPF_F_STRICT_ALIGNMENT = 0x1 + BPF_F_TUNINFO_IPV6 = 0x1 + BPF_F_USER_BUILD_ID = 0x800 + BPF_F_USER_STACK = 0x100 + BPF_F_WRONLY = 0x10 + BPF_F_ZERO_CSUM_TX = 0x2 + BPF_F_ZERO_SEED = 0x40 BPF_H = 0x8 BPF_IMM = 0x0 BPF_IND = 0x40 @@ -208,8 +257,16 @@ const ( BPF_JEQ = 0x10 BPF_JGE = 0x30 BPF_JGT = 0x20 + BPF_JLE = 0xb0 + BPF_JLT = 0xa0 BPF_JMP = 0x5 + BPF_JMP32 = 0x6 + BPF_JNE = 0x50 BPF_JSET = 0x40 + BPF_JSGE = 0x70 + BPF_JSGT = 0x60 + BPF_JSLE = 0xd0 + BPF_JSLT = 0xc0 BPF_K = 0x0 BPF_LD = 0x0 BPF_LDX = 0x1 @@ -223,20 +280,33 @@ const ( BPF_MINOR_VERSION = 0x1 BPF_MISC = 0x7 BPF_MOD = 0x90 + BPF_MOV = 0xb0 BPF_MSH = 0xa0 BPF_MUL = 0x20 BPF_NEG = 0x80 BPF_NET_OFF = -0x100000 + BPF_NOEXIST = 0x1 + BPF_OBJ_NAME_LEN = 0x10 BPF_OR = 0x40 + BPF_PSEUDO_CALL = 0x1 + BPF_PSEUDO_MAP_FD = 0x1 BPF_RET = 0x6 BPF_RSH = 0x70 + BPF_SOCK_OPS_ALL_CB_FLAGS = 0x7 + BPF_SOCK_OPS_RETRANS_CB_FLAG = 0x2 + BPF_SOCK_OPS_RTO_CB_FLAG = 0x1 + BPF_SOCK_OPS_STATE_CB_FLAG = 0x4 BPF_ST = 0x2 BPF_STX = 0x3 BPF_SUB = 0x10 + BPF_TAG_SIZE = 0x8 BPF_TAX = 0x0 + BPF_TO_BE = 0x8 + BPF_TO_LE = 0x0 BPF_TXA = 0x80 BPF_W = 0x0 BPF_X = 0x8 + BPF_XADD = 0xc0 BPF_XOR = 0xa0 BRKINT = 0x2 BS0 = 0x0 @@ -320,6 +390,10 @@ const ( CRDLY = 0x3000 CREAD = 0x800 CRTSCTS = 0x80000000 + CRYPTO_MAX_NAME = 0x40 + CRYPTO_MSG_MAX = 0x15 + CRYPTO_NR_MSGTYPES = 0x6 + CRYPTO_REPORT_MAXSIZE = 0x160 CS5 = 0x0 CS6 = 0x100 CS7 = 0x200 @@ -497,6 +571,7 @@ const ( FAN_ALL_MARK_FLAGS = 0xff FAN_ALL_OUTGOING_EVENTS = 0x3403b FAN_ALL_PERM_EVENTS = 0x30000 + FAN_ATTRIB = 0x4 FAN_AUDIT = 0x10 FAN_CLASS_CONTENT = 0x4 FAN_CLASS_NOTIF = 0x0 @@ -505,8 +580,12 @@ const ( FAN_CLOSE = 0x18 FAN_CLOSE_NOWRITE = 0x10 FAN_CLOSE_WRITE = 0x8 + FAN_CREATE = 0x100 + FAN_DELETE = 0x200 + FAN_DELETE_SELF = 0x400 FAN_DENY = 0x2 FAN_ENABLE_AUDIT = 0x40 + FAN_EVENT_INFO_TYPE_FID = 0x1 FAN_EVENT_METADATA_LEN = 0x18 FAN_EVENT_ON_CHILD = 0x8000000 FAN_MARK_ADD = 0x1 @@ -520,6 +599,10 @@ const ( FAN_MARK_ONLYDIR = 0x8 FAN_MARK_REMOVE = 0x2 FAN_MODIFY = 0x2 + FAN_MOVE = 0xc0 + FAN_MOVED_FROM = 0x40 + FAN_MOVED_TO = 0x80 + FAN_MOVE_SELF = 0x800 FAN_NOFD = -0x1 FAN_NONBLOCK = 0x2 FAN_ONDIR = 0x40000000 @@ -528,6 +611,7 @@ const ( FAN_OPEN_EXEC_PERM = 0x40000 FAN_OPEN_PERM = 0x10000 FAN_Q_OVERFLOW = 0x4000 + FAN_REPORT_FID = 0x200 FAN_REPORT_TID = 0x100 FAN_UNLIMITED_MARKS = 0x20 FAN_UNLIMITED_QUEUE = 0x10 @@ -1049,6 +1133,15 @@ const ( MAP_SHARED_VALIDATE = 0x3 MAP_STACK = 0x20000 MAP_TYPE = 0xf + MCAST_BLOCK_SOURCE = 0x2b + MCAST_EXCLUDE = 0x0 + MCAST_INCLUDE = 0x1 + MCAST_JOIN_GROUP = 0x2a + MCAST_JOIN_SOURCE_GROUP = 0x2e + MCAST_LEAVE_GROUP = 0x2d + MCAST_LEAVE_SOURCE_GROUP = 0x2f + MCAST_MSFILTER = 0x30 + MCAST_UNBLOCK_SOURCE = 0x2c MCL_CURRENT = 0x2000 MCL_FUTURE = 0x4000 MCL_ONFAULT = 0x8000 @@ -1487,6 +1580,7 @@ const ( PR_SET_TSC = 0x1a PR_SET_UNALIGN = 0x6 PR_SPEC_DISABLE = 0x4 + PR_SPEC_DISABLE_NOEXEC = 0x10 PR_SPEC_ENABLE = 0x2 PR_SPEC_FORCE_DISABLE = 0x8 PR_SPEC_INDIRECT_BRANCH = 0x1 @@ -2015,6 +2109,7 @@ const ( SO_ATTACH_REUSEPORT_CBPF = 0x33 SO_ATTACH_REUSEPORT_EBPF = 0x34 SO_BINDTODEVICE = 0x19 + SO_BINDTOIFINDEX = 0x3e SO_BPF_EXTENSIONS = 0x30 SO_BROADCAST = 0x6 SO_BSDCOMPAT = 0xe @@ -2063,6 +2158,8 @@ const ( SO_RCVBUFFORCE = 0x21 SO_RCVLOWAT = 0x10 SO_RCVTIMEO = 0x12 + SO_RCVTIMEO_NEW = 0x42 + SO_RCVTIMEO_OLD = 0x12 SO_REUSEADDR = 0x2 SO_REUSEPORT = 0xf SO_RXQ_OVFL = 0x28 @@ -2074,9 +2171,17 @@ const ( SO_SNDBUFFORCE = 0x20 SO_SNDLOWAT = 0x11 SO_SNDTIMEO = 0x13 + SO_SNDTIMEO_NEW = 0x43 + SO_SNDTIMEO_OLD = 0x13 SO_TIMESTAMP = 0x1d SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPING_NEW = 0x41 + SO_TIMESTAMPING_OLD = 0x25 SO_TIMESTAMPNS = 0x23 + SO_TIMESTAMPNS_NEW = 0x40 + SO_TIMESTAMPNS_OLD = 0x23 + SO_TIMESTAMP_NEW = 0x3f + SO_TIMESTAMP_OLD = 0x1d SO_TXTIME = 0x3d SO_TYPE = 0x3 SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 @@ -2167,6 +2272,8 @@ const ( TCOFLUSH = 0x1 TCOOFF = 0x0 TCOON = 0x1 + TCP_BPF_IW = 0x3e9 + TCP_BPF_SNDCWND_CLAMP = 0x3ea TCP_CC_INFO = 0x1a TCP_CM_INQ = 0x24 TCP_CONGESTION = 0xd @@ -2374,8 +2481,10 @@ const ( UBI_IOCMKVOL = 0x80986f00 UBI_IOCRMVOL = 0x80046f01 UBI_IOCRNVOL = 0x91106f03 + UBI_IOCRPEB = 0x80046f04 UBI_IOCRSVOL = 0x800c6f02 UBI_IOCSETVOLPROP = 0x80104f06 + UBI_IOCSPEB = 0x80046f05 UBI_IOCVOLCRBLK = 0x80804f07 UBI_IOCVOLRMBLK = 0x20004f08 UBI_IOCVOLUP = 0x80084f00 @@ -2523,6 +2632,7 @@ const ( XDP_FLAGS_SKB_MODE = 0x2 XDP_FLAGS_UPDATE_IF_NOEXIST = 0x1 XDP_MMAP_OFFSETS = 0x1 + XDP_PACKET_HEADROOM = 0x100 XDP_PGOFF_RX_RING = 0x0 XDP_PGOFF_TX_RING = 0x80000000 XDP_RX_RING = 0x2 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go index b861ec78..e7c49911 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go @@ -197,10 +197,59 @@ const ( BPF_ABS = 0x20 BPF_ADD = 0x0 BPF_ALU = 0x4 + BPF_ALU64 = 0x7 BPF_AND = 0x50 + BPF_ANY = 0x0 + BPF_ARSH = 0xc0 BPF_B = 0x10 + BPF_BUILD_ID_SIZE = 0x14 + BPF_CALL = 0x80 + BPF_DEVCG_ACC_MKNOD = 0x1 + BPF_DEVCG_ACC_READ = 0x2 + BPF_DEVCG_ACC_WRITE = 0x4 + BPF_DEVCG_DEV_BLOCK = 0x1 + BPF_DEVCG_DEV_CHAR = 0x2 BPF_DIV = 0x30 + BPF_DW = 0x18 + BPF_END = 0xd0 + BPF_EXIST = 0x2 + BPF_EXIT = 0x90 + BPF_FROM_BE = 0x8 + BPF_FROM_LE = 0x0 BPF_FS_MAGIC = 0xcafe4a11 + BPF_F_ALLOW_MULTI = 0x2 + BPF_F_ALLOW_OVERRIDE = 0x1 + BPF_F_ANY_ALIGNMENT = 0x2 + BPF_F_CTXLEN_MASK = 0xfffff00000000 + BPF_F_CURRENT_CPU = 0xffffffff + BPF_F_CURRENT_NETNS = -0x1 + BPF_F_DONT_FRAGMENT = 0x4 + BPF_F_FAST_STACK_CMP = 0x200 + BPF_F_HDR_FIELD_MASK = 0xf + BPF_F_INDEX_MASK = 0xffffffff + BPF_F_INGRESS = 0x1 + BPF_F_INVALIDATE_HASH = 0x2 + BPF_F_LOCK = 0x4 + BPF_F_MARK_ENFORCE = 0x40 + BPF_F_MARK_MANGLED_0 = 0x20 + BPF_F_NO_COMMON_LRU = 0x2 + BPF_F_NO_PREALLOC = 0x1 + BPF_F_NUMA_NODE = 0x4 + BPF_F_PSEUDO_HDR = 0x10 + BPF_F_QUERY_EFFECTIVE = 0x1 + BPF_F_RDONLY = 0x8 + BPF_F_RECOMPUTE_CSUM = 0x1 + BPF_F_REUSE_STACKID = 0x400 + BPF_F_SEQ_NUMBER = 0x8 + BPF_F_SKIP_FIELD_MASK = 0xff + BPF_F_STACK_BUILD_ID = 0x20 + BPF_F_STRICT_ALIGNMENT = 0x1 + BPF_F_TUNINFO_IPV6 = 0x1 + BPF_F_USER_BUILD_ID = 0x800 + BPF_F_USER_STACK = 0x100 + BPF_F_WRONLY = 0x10 + BPF_F_ZERO_CSUM_TX = 0x2 + BPF_F_ZERO_SEED = 0x40 BPF_H = 0x8 BPF_IMM = 0x0 BPF_IND = 0x40 @@ -208,8 +257,16 @@ const ( BPF_JEQ = 0x10 BPF_JGE = 0x30 BPF_JGT = 0x20 + BPF_JLE = 0xb0 + BPF_JLT = 0xa0 BPF_JMP = 0x5 + BPF_JMP32 = 0x6 + BPF_JNE = 0x50 BPF_JSET = 0x40 + BPF_JSGE = 0x70 + BPF_JSGT = 0x60 + BPF_JSLE = 0xd0 + BPF_JSLT = 0xc0 BPF_K = 0x0 BPF_LD = 0x0 BPF_LDX = 0x1 @@ -223,20 +280,33 @@ const ( BPF_MINOR_VERSION = 0x1 BPF_MISC = 0x7 BPF_MOD = 0x90 + BPF_MOV = 0xb0 BPF_MSH = 0xa0 BPF_MUL = 0x20 BPF_NEG = 0x80 BPF_NET_OFF = -0x100000 + BPF_NOEXIST = 0x1 + BPF_OBJ_NAME_LEN = 0x10 BPF_OR = 0x40 + BPF_PSEUDO_CALL = 0x1 + BPF_PSEUDO_MAP_FD = 0x1 BPF_RET = 0x6 BPF_RSH = 0x70 + BPF_SOCK_OPS_ALL_CB_FLAGS = 0x7 + BPF_SOCK_OPS_RETRANS_CB_FLAG = 0x2 + BPF_SOCK_OPS_RTO_CB_FLAG = 0x1 + BPF_SOCK_OPS_STATE_CB_FLAG = 0x4 BPF_ST = 0x2 BPF_STX = 0x3 BPF_SUB = 0x10 + BPF_TAG_SIZE = 0x8 BPF_TAX = 0x0 + BPF_TO_BE = 0x8 + BPF_TO_LE = 0x0 BPF_TXA = 0x80 BPF_W = 0x0 BPF_X = 0x8 + BPF_XADD = 0xc0 BPF_XOR = 0xa0 BRKINT = 0x2 BS0 = 0x0 @@ -320,6 +390,10 @@ const ( CRDLY = 0x3000 CREAD = 0x800 CRTSCTS = 0x80000000 + CRYPTO_MAX_NAME = 0x40 + CRYPTO_MSG_MAX = 0x15 + CRYPTO_NR_MSGTYPES = 0x6 + CRYPTO_REPORT_MAXSIZE = 0x160 CS5 = 0x0 CS6 = 0x100 CS7 = 0x200 @@ -497,6 +571,7 @@ const ( FAN_ALL_MARK_FLAGS = 0xff FAN_ALL_OUTGOING_EVENTS = 0x3403b FAN_ALL_PERM_EVENTS = 0x30000 + FAN_ATTRIB = 0x4 FAN_AUDIT = 0x10 FAN_CLASS_CONTENT = 0x4 FAN_CLASS_NOTIF = 0x0 @@ -505,8 +580,12 @@ const ( FAN_CLOSE = 0x18 FAN_CLOSE_NOWRITE = 0x10 FAN_CLOSE_WRITE = 0x8 + FAN_CREATE = 0x100 + FAN_DELETE = 0x200 + FAN_DELETE_SELF = 0x400 FAN_DENY = 0x2 FAN_ENABLE_AUDIT = 0x40 + FAN_EVENT_INFO_TYPE_FID = 0x1 FAN_EVENT_METADATA_LEN = 0x18 FAN_EVENT_ON_CHILD = 0x8000000 FAN_MARK_ADD = 0x1 @@ -520,6 +599,10 @@ const ( FAN_MARK_ONLYDIR = 0x8 FAN_MARK_REMOVE = 0x2 FAN_MODIFY = 0x2 + FAN_MOVE = 0xc0 + FAN_MOVED_FROM = 0x40 + FAN_MOVED_TO = 0x80 + FAN_MOVE_SELF = 0x800 FAN_NOFD = -0x1 FAN_NONBLOCK = 0x2 FAN_ONDIR = 0x40000000 @@ -528,6 +611,7 @@ const ( FAN_OPEN_EXEC_PERM = 0x40000 FAN_OPEN_PERM = 0x10000 FAN_Q_OVERFLOW = 0x4000 + FAN_REPORT_FID = 0x200 FAN_REPORT_TID = 0x100 FAN_UNLIMITED_MARKS = 0x20 FAN_UNLIMITED_QUEUE = 0x10 @@ -1049,6 +1133,15 @@ const ( MAP_SHARED_VALIDATE = 0x3 MAP_STACK = 0x20000 MAP_TYPE = 0xf + MCAST_BLOCK_SOURCE = 0x2b + MCAST_EXCLUDE = 0x0 + MCAST_INCLUDE = 0x1 + MCAST_JOIN_GROUP = 0x2a + MCAST_JOIN_SOURCE_GROUP = 0x2e + MCAST_LEAVE_GROUP = 0x2d + MCAST_LEAVE_SOURCE_GROUP = 0x2f + MCAST_MSFILTER = 0x30 + MCAST_UNBLOCK_SOURCE = 0x2c MCL_CURRENT = 0x2000 MCL_FUTURE = 0x4000 MCL_ONFAULT = 0x8000 @@ -1487,6 +1580,7 @@ const ( PR_SET_TSC = 0x1a PR_SET_UNALIGN = 0x6 PR_SPEC_DISABLE = 0x4 + PR_SPEC_DISABLE_NOEXEC = 0x10 PR_SPEC_ENABLE = 0x2 PR_SPEC_FORCE_DISABLE = 0x8 PR_SPEC_INDIRECT_BRANCH = 0x1 @@ -2015,6 +2109,7 @@ const ( SO_ATTACH_REUSEPORT_CBPF = 0x33 SO_ATTACH_REUSEPORT_EBPF = 0x34 SO_BINDTODEVICE = 0x19 + SO_BINDTOIFINDEX = 0x3e SO_BPF_EXTENSIONS = 0x30 SO_BROADCAST = 0x6 SO_BSDCOMPAT = 0xe @@ -2063,6 +2158,8 @@ const ( SO_RCVBUFFORCE = 0x21 SO_RCVLOWAT = 0x10 SO_RCVTIMEO = 0x12 + SO_RCVTIMEO_NEW = 0x42 + SO_RCVTIMEO_OLD = 0x12 SO_REUSEADDR = 0x2 SO_REUSEPORT = 0xf SO_RXQ_OVFL = 0x28 @@ -2074,9 +2171,17 @@ const ( SO_SNDBUFFORCE = 0x20 SO_SNDLOWAT = 0x11 SO_SNDTIMEO = 0x13 + SO_SNDTIMEO_NEW = 0x43 + SO_SNDTIMEO_OLD = 0x13 SO_TIMESTAMP = 0x1d SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPING_NEW = 0x41 + SO_TIMESTAMPING_OLD = 0x25 SO_TIMESTAMPNS = 0x23 + SO_TIMESTAMPNS_NEW = 0x40 + SO_TIMESTAMPNS_OLD = 0x23 + SO_TIMESTAMP_NEW = 0x3f + SO_TIMESTAMP_OLD = 0x1d SO_TXTIME = 0x3d SO_TYPE = 0x3 SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 @@ -2167,6 +2272,8 @@ const ( TCOFLUSH = 0x1 TCOOFF = 0x0 TCOON = 0x1 + TCP_BPF_IW = 0x3e9 + TCP_BPF_SNDCWND_CLAMP = 0x3ea TCP_CC_INFO = 0x1a TCP_CM_INQ = 0x24 TCP_CONGESTION = 0xd @@ -2374,8 +2481,10 @@ const ( UBI_IOCMKVOL = 0x80986f00 UBI_IOCRMVOL = 0x80046f01 UBI_IOCRNVOL = 0x91106f03 + UBI_IOCRPEB = 0x80046f04 UBI_IOCRSVOL = 0x800c6f02 UBI_IOCSETVOLPROP = 0x80104f06 + UBI_IOCSPEB = 0x80046f05 UBI_IOCVOLCRBLK = 0x80804f07 UBI_IOCVOLRMBLK = 0x20004f08 UBI_IOCVOLUP = 0x80084f00 @@ -2523,6 +2632,7 @@ const ( XDP_FLAGS_SKB_MODE = 0x2 XDP_FLAGS_UPDATE_IF_NOEXIST = 0x1 XDP_MMAP_OFFSETS = 0x1 + XDP_PACKET_HEADROOM = 0x100 XDP_PGOFF_RX_RING = 0x0 XDP_PGOFF_TX_RING = 0x80000000 XDP_RX_RING = 0x2 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go index a321ec23..0373d65a 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go @@ -197,10 +197,59 @@ const ( BPF_ABS = 0x20 BPF_ADD = 0x0 BPF_ALU = 0x4 + BPF_ALU64 = 0x7 BPF_AND = 0x50 + BPF_ANY = 0x0 + BPF_ARSH = 0xc0 BPF_B = 0x10 + BPF_BUILD_ID_SIZE = 0x14 + BPF_CALL = 0x80 + BPF_DEVCG_ACC_MKNOD = 0x1 + BPF_DEVCG_ACC_READ = 0x2 + BPF_DEVCG_ACC_WRITE = 0x4 + BPF_DEVCG_DEV_BLOCK = 0x1 + BPF_DEVCG_DEV_CHAR = 0x2 BPF_DIV = 0x30 + BPF_DW = 0x18 + BPF_END = 0xd0 + BPF_EXIST = 0x2 + BPF_EXIT = 0x90 + BPF_FROM_BE = 0x8 + BPF_FROM_LE = 0x0 BPF_FS_MAGIC = 0xcafe4a11 + BPF_F_ALLOW_MULTI = 0x2 + BPF_F_ALLOW_OVERRIDE = 0x1 + BPF_F_ANY_ALIGNMENT = 0x2 + BPF_F_CTXLEN_MASK = 0xfffff00000000 + BPF_F_CURRENT_CPU = 0xffffffff + BPF_F_CURRENT_NETNS = -0x1 + BPF_F_DONT_FRAGMENT = 0x4 + BPF_F_FAST_STACK_CMP = 0x200 + BPF_F_HDR_FIELD_MASK = 0xf + BPF_F_INDEX_MASK = 0xffffffff + BPF_F_INGRESS = 0x1 + BPF_F_INVALIDATE_HASH = 0x2 + BPF_F_LOCK = 0x4 + BPF_F_MARK_ENFORCE = 0x40 + BPF_F_MARK_MANGLED_0 = 0x20 + BPF_F_NO_COMMON_LRU = 0x2 + BPF_F_NO_PREALLOC = 0x1 + BPF_F_NUMA_NODE = 0x4 + BPF_F_PSEUDO_HDR = 0x10 + BPF_F_QUERY_EFFECTIVE = 0x1 + BPF_F_RDONLY = 0x8 + BPF_F_RECOMPUTE_CSUM = 0x1 + BPF_F_REUSE_STACKID = 0x400 + BPF_F_SEQ_NUMBER = 0x8 + BPF_F_SKIP_FIELD_MASK = 0xff + BPF_F_STACK_BUILD_ID = 0x20 + BPF_F_STRICT_ALIGNMENT = 0x1 + BPF_F_TUNINFO_IPV6 = 0x1 + BPF_F_USER_BUILD_ID = 0x800 + BPF_F_USER_STACK = 0x100 + BPF_F_WRONLY = 0x10 + BPF_F_ZERO_CSUM_TX = 0x2 + BPF_F_ZERO_SEED = 0x40 BPF_H = 0x8 BPF_IMM = 0x0 BPF_IND = 0x40 @@ -208,8 +257,16 @@ const ( BPF_JEQ = 0x10 BPF_JGE = 0x30 BPF_JGT = 0x20 + BPF_JLE = 0xb0 + BPF_JLT = 0xa0 BPF_JMP = 0x5 + BPF_JMP32 = 0x6 + BPF_JNE = 0x50 BPF_JSET = 0x40 + BPF_JSGE = 0x70 + BPF_JSGT = 0x60 + BPF_JSLE = 0xd0 + BPF_JSLT = 0xc0 BPF_K = 0x0 BPF_LD = 0x0 BPF_LDX = 0x1 @@ -223,20 +280,33 @@ const ( BPF_MINOR_VERSION = 0x1 BPF_MISC = 0x7 BPF_MOD = 0x90 + BPF_MOV = 0xb0 BPF_MSH = 0xa0 BPF_MUL = 0x20 BPF_NEG = 0x80 BPF_NET_OFF = -0x100000 + BPF_NOEXIST = 0x1 + BPF_OBJ_NAME_LEN = 0x10 BPF_OR = 0x40 + BPF_PSEUDO_CALL = 0x1 + BPF_PSEUDO_MAP_FD = 0x1 BPF_RET = 0x6 BPF_RSH = 0x70 + BPF_SOCK_OPS_ALL_CB_FLAGS = 0x7 + BPF_SOCK_OPS_RETRANS_CB_FLAG = 0x2 + BPF_SOCK_OPS_RTO_CB_FLAG = 0x1 + BPF_SOCK_OPS_STATE_CB_FLAG = 0x4 BPF_ST = 0x2 BPF_STX = 0x3 BPF_SUB = 0x10 + BPF_TAG_SIZE = 0x8 BPF_TAX = 0x0 + BPF_TO_BE = 0x8 + BPF_TO_LE = 0x0 BPF_TXA = 0x80 BPF_W = 0x0 BPF_X = 0x8 + BPF_XADD = 0xc0 BPF_XOR = 0xa0 BRKINT = 0x2 BS0 = 0x0 @@ -320,6 +390,10 @@ const ( CRDLY = 0x600 CREAD = 0x80 CRTSCTS = 0x80000000 + CRYPTO_MAX_NAME = 0x40 + CRYPTO_MSG_MAX = 0x15 + CRYPTO_NR_MSGTYPES = 0x6 + CRYPTO_REPORT_MAXSIZE = 0x160 CS5 = 0x0 CS6 = 0x10 CS7 = 0x20 @@ -497,6 +571,7 @@ const ( FAN_ALL_MARK_FLAGS = 0xff FAN_ALL_OUTGOING_EVENTS = 0x3403b FAN_ALL_PERM_EVENTS = 0x30000 + FAN_ATTRIB = 0x4 FAN_AUDIT = 0x10 FAN_CLASS_CONTENT = 0x4 FAN_CLASS_NOTIF = 0x0 @@ -505,8 +580,12 @@ const ( FAN_CLOSE = 0x18 FAN_CLOSE_NOWRITE = 0x10 FAN_CLOSE_WRITE = 0x8 + FAN_CREATE = 0x100 + FAN_DELETE = 0x200 + FAN_DELETE_SELF = 0x400 FAN_DENY = 0x2 FAN_ENABLE_AUDIT = 0x40 + FAN_EVENT_INFO_TYPE_FID = 0x1 FAN_EVENT_METADATA_LEN = 0x18 FAN_EVENT_ON_CHILD = 0x8000000 FAN_MARK_ADD = 0x1 @@ -520,6 +599,10 @@ const ( FAN_MARK_ONLYDIR = 0x8 FAN_MARK_REMOVE = 0x2 FAN_MODIFY = 0x2 + FAN_MOVE = 0xc0 + FAN_MOVED_FROM = 0x40 + FAN_MOVED_TO = 0x80 + FAN_MOVE_SELF = 0x800 FAN_NOFD = -0x1 FAN_NONBLOCK = 0x2 FAN_ONDIR = 0x40000000 @@ -528,6 +611,7 @@ const ( FAN_OPEN_EXEC_PERM = 0x40000 FAN_OPEN_PERM = 0x10000 FAN_Q_OVERFLOW = 0x4000 + FAN_REPORT_FID = 0x200 FAN_REPORT_TID = 0x100 FAN_UNLIMITED_MARKS = 0x20 FAN_UNLIMITED_QUEUE = 0x10 @@ -1050,6 +1134,15 @@ const ( MAP_STACK = 0x20000 MAP_SYNC = 0x80000 MAP_TYPE = 0xf + MCAST_BLOCK_SOURCE = 0x2b + MCAST_EXCLUDE = 0x0 + MCAST_INCLUDE = 0x1 + MCAST_JOIN_GROUP = 0x2a + MCAST_JOIN_SOURCE_GROUP = 0x2e + MCAST_LEAVE_GROUP = 0x2d + MCAST_LEAVE_SOURCE_GROUP = 0x2f + MCAST_MSFILTER = 0x30 + MCAST_UNBLOCK_SOURCE = 0x2c MCL_CURRENT = 0x1 MCL_FUTURE = 0x2 MCL_ONFAULT = 0x4 @@ -1485,6 +1578,7 @@ const ( PR_SET_TSC = 0x1a PR_SET_UNALIGN = 0x6 PR_SPEC_DISABLE = 0x4 + PR_SPEC_DISABLE_NOEXEC = 0x10 PR_SPEC_ENABLE = 0x2 PR_SPEC_FORCE_DISABLE = 0x8 PR_SPEC_INDIRECT_BRANCH = 0x1 @@ -1945,6 +2039,7 @@ const ( SO_ATTACH_REUSEPORT_CBPF = 0x33 SO_ATTACH_REUSEPORT_EBPF = 0x34 SO_BINDTODEVICE = 0x19 + SO_BINDTOIFINDEX = 0x3e SO_BPF_EXTENSIONS = 0x30 SO_BROADCAST = 0x6 SO_BSDCOMPAT = 0xe @@ -1993,6 +2088,8 @@ const ( SO_RCVBUFFORCE = 0x21 SO_RCVLOWAT = 0x12 SO_RCVTIMEO = 0x14 + SO_RCVTIMEO_NEW = 0x42 + SO_RCVTIMEO_OLD = 0x14 SO_REUSEADDR = 0x2 SO_REUSEPORT = 0xf SO_RXQ_OVFL = 0x28 @@ -2004,9 +2101,17 @@ const ( SO_SNDBUFFORCE = 0x20 SO_SNDLOWAT = 0x13 SO_SNDTIMEO = 0x15 + SO_SNDTIMEO_NEW = 0x43 + SO_SNDTIMEO_OLD = 0x15 SO_TIMESTAMP = 0x1d SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPING_NEW = 0x41 + SO_TIMESTAMPING_OLD = 0x25 SO_TIMESTAMPNS = 0x23 + SO_TIMESTAMPNS_NEW = 0x40 + SO_TIMESTAMPNS_OLD = 0x23 + SO_TIMESTAMP_NEW = 0x3f + SO_TIMESTAMP_OLD = 0x1d SO_TXTIME = 0x3d SO_TYPE = 0x3 SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 @@ -2099,6 +2204,8 @@ const ( TCOFLUSH = 0x1 TCOOFF = 0x0 TCOON = 0x1 + TCP_BPF_IW = 0x3e9 + TCP_BPF_SNDCWND_CLAMP = 0x3ea TCP_CC_INFO = 0x1a TCP_CM_INQ = 0x24 TCP_CONGESTION = 0xd @@ -2300,8 +2407,10 @@ const ( UBI_IOCMKVOL = 0x40986f00 UBI_IOCRMVOL = 0x40046f01 UBI_IOCRNVOL = 0x51106f03 + UBI_IOCRPEB = 0x40046f04 UBI_IOCRSVOL = 0x400c6f02 UBI_IOCSETVOLPROP = 0x40104f06 + UBI_IOCSPEB = 0x40046f05 UBI_IOCVOLCRBLK = 0x40804f07 UBI_IOCVOLRMBLK = 0x4f08 UBI_IOCVOLUP = 0x40084f00 @@ -2449,6 +2558,7 @@ const ( XDP_FLAGS_SKB_MODE = 0x2 XDP_FLAGS_UPDATE_IF_NOEXIST = 0x1 XDP_MMAP_OFFSETS = 0x1 + XDP_PACKET_HEADROOM = 0x100 XDP_PGOFF_RX_RING = 0x0 XDP_PGOFF_TX_RING = 0x80000000 XDP_RX_RING = 0x2 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go b/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go index f6c99164..b2ed7ee6 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go @@ -197,10 +197,59 @@ const ( BPF_ABS = 0x20 BPF_ADD = 0x0 BPF_ALU = 0x4 + BPF_ALU64 = 0x7 BPF_AND = 0x50 + BPF_ANY = 0x0 + BPF_ARSH = 0xc0 BPF_B = 0x10 + BPF_BUILD_ID_SIZE = 0x14 + BPF_CALL = 0x80 + BPF_DEVCG_ACC_MKNOD = 0x1 + BPF_DEVCG_ACC_READ = 0x2 + BPF_DEVCG_ACC_WRITE = 0x4 + BPF_DEVCG_DEV_BLOCK = 0x1 + BPF_DEVCG_DEV_CHAR = 0x2 BPF_DIV = 0x30 + BPF_DW = 0x18 + BPF_END = 0xd0 + BPF_EXIST = 0x2 + BPF_EXIT = 0x90 + BPF_FROM_BE = 0x8 + BPF_FROM_LE = 0x0 BPF_FS_MAGIC = 0xcafe4a11 + BPF_F_ALLOW_MULTI = 0x2 + BPF_F_ALLOW_OVERRIDE = 0x1 + BPF_F_ANY_ALIGNMENT = 0x2 + BPF_F_CTXLEN_MASK = 0xfffff00000000 + BPF_F_CURRENT_CPU = 0xffffffff + BPF_F_CURRENT_NETNS = -0x1 + BPF_F_DONT_FRAGMENT = 0x4 + BPF_F_FAST_STACK_CMP = 0x200 + BPF_F_HDR_FIELD_MASK = 0xf + BPF_F_INDEX_MASK = 0xffffffff + BPF_F_INGRESS = 0x1 + BPF_F_INVALIDATE_HASH = 0x2 + BPF_F_LOCK = 0x4 + BPF_F_MARK_ENFORCE = 0x40 + BPF_F_MARK_MANGLED_0 = 0x20 + BPF_F_NO_COMMON_LRU = 0x2 + BPF_F_NO_PREALLOC = 0x1 + BPF_F_NUMA_NODE = 0x4 + BPF_F_PSEUDO_HDR = 0x10 + BPF_F_QUERY_EFFECTIVE = 0x1 + BPF_F_RDONLY = 0x8 + BPF_F_RECOMPUTE_CSUM = 0x1 + BPF_F_REUSE_STACKID = 0x400 + BPF_F_SEQ_NUMBER = 0x8 + BPF_F_SKIP_FIELD_MASK = 0xff + BPF_F_STACK_BUILD_ID = 0x20 + BPF_F_STRICT_ALIGNMENT = 0x1 + BPF_F_TUNINFO_IPV6 = 0x1 + BPF_F_USER_BUILD_ID = 0x800 + BPF_F_USER_STACK = 0x100 + BPF_F_WRONLY = 0x10 + BPF_F_ZERO_CSUM_TX = 0x2 + BPF_F_ZERO_SEED = 0x40 BPF_H = 0x8 BPF_IMM = 0x0 BPF_IND = 0x40 @@ -208,8 +257,16 @@ const ( BPF_JEQ = 0x10 BPF_JGE = 0x30 BPF_JGT = 0x20 + BPF_JLE = 0xb0 + BPF_JLT = 0xa0 BPF_JMP = 0x5 + BPF_JMP32 = 0x6 + BPF_JNE = 0x50 BPF_JSET = 0x40 + BPF_JSGE = 0x70 + BPF_JSGT = 0x60 + BPF_JSLE = 0xd0 + BPF_JSLT = 0xc0 BPF_K = 0x0 BPF_LD = 0x0 BPF_LDX = 0x1 @@ -223,20 +280,33 @@ const ( BPF_MINOR_VERSION = 0x1 BPF_MISC = 0x7 BPF_MOD = 0x90 + BPF_MOV = 0xb0 BPF_MSH = 0xa0 BPF_MUL = 0x20 BPF_NEG = 0x80 BPF_NET_OFF = -0x100000 + BPF_NOEXIST = 0x1 + BPF_OBJ_NAME_LEN = 0x10 BPF_OR = 0x40 + BPF_PSEUDO_CALL = 0x1 + BPF_PSEUDO_MAP_FD = 0x1 BPF_RET = 0x6 BPF_RSH = 0x70 + BPF_SOCK_OPS_ALL_CB_FLAGS = 0x7 + BPF_SOCK_OPS_RETRANS_CB_FLAG = 0x2 + BPF_SOCK_OPS_RTO_CB_FLAG = 0x1 + BPF_SOCK_OPS_STATE_CB_FLAG = 0x4 BPF_ST = 0x2 BPF_STX = 0x3 BPF_SUB = 0x10 + BPF_TAG_SIZE = 0x8 BPF_TAX = 0x0 + BPF_TO_BE = 0x8 + BPF_TO_LE = 0x0 BPF_TXA = 0x80 BPF_W = 0x0 BPF_X = 0x8 + BPF_XADD = 0xc0 BPF_XOR = 0xa0 BRKINT = 0x2 BS0 = 0x0 @@ -320,6 +390,10 @@ const ( CRDLY = 0x600 CREAD = 0x80 CRTSCTS = 0x80000000 + CRYPTO_MAX_NAME = 0x40 + CRYPTO_MSG_MAX = 0x15 + CRYPTO_NR_MSGTYPES = 0x6 + CRYPTO_REPORT_MAXSIZE = 0x160 CS5 = 0x0 CS6 = 0x10 CS7 = 0x20 @@ -497,6 +571,7 @@ const ( FAN_ALL_MARK_FLAGS = 0xff FAN_ALL_OUTGOING_EVENTS = 0x3403b FAN_ALL_PERM_EVENTS = 0x30000 + FAN_ATTRIB = 0x4 FAN_AUDIT = 0x10 FAN_CLASS_CONTENT = 0x4 FAN_CLASS_NOTIF = 0x0 @@ -505,8 +580,12 @@ const ( FAN_CLOSE = 0x18 FAN_CLOSE_NOWRITE = 0x10 FAN_CLOSE_WRITE = 0x8 + FAN_CREATE = 0x100 + FAN_DELETE = 0x200 + FAN_DELETE_SELF = 0x400 FAN_DENY = 0x2 FAN_ENABLE_AUDIT = 0x40 + FAN_EVENT_INFO_TYPE_FID = 0x1 FAN_EVENT_METADATA_LEN = 0x18 FAN_EVENT_ON_CHILD = 0x8000000 FAN_MARK_ADD = 0x1 @@ -520,6 +599,10 @@ const ( FAN_MARK_ONLYDIR = 0x8 FAN_MARK_REMOVE = 0x2 FAN_MODIFY = 0x2 + FAN_MOVE = 0xc0 + FAN_MOVED_FROM = 0x40 + FAN_MOVED_TO = 0x80 + FAN_MOVE_SELF = 0x800 FAN_NOFD = -0x1 FAN_NONBLOCK = 0x2 FAN_ONDIR = 0x40000000 @@ -528,6 +611,7 @@ const ( FAN_OPEN_EXEC_PERM = 0x40000 FAN_OPEN_PERM = 0x10000 FAN_Q_OVERFLOW = 0x4000 + FAN_REPORT_FID = 0x200 FAN_REPORT_TID = 0x100 FAN_UNLIMITED_MARKS = 0x20 FAN_UNLIMITED_QUEUE = 0x10 @@ -1050,6 +1134,15 @@ const ( MAP_STACK = 0x20000 MAP_SYNC = 0x80000 MAP_TYPE = 0xf + MCAST_BLOCK_SOURCE = 0x2b + MCAST_EXCLUDE = 0x0 + MCAST_INCLUDE = 0x1 + MCAST_JOIN_GROUP = 0x2a + MCAST_JOIN_SOURCE_GROUP = 0x2e + MCAST_LEAVE_GROUP = 0x2d + MCAST_LEAVE_SOURCE_GROUP = 0x2f + MCAST_MSFILTER = 0x30 + MCAST_UNBLOCK_SOURCE = 0x2c MCL_CURRENT = 0x1 MCL_FUTURE = 0x2 MCL_ONFAULT = 0x4 @@ -1485,6 +1578,7 @@ const ( PR_SET_TSC = 0x1a PR_SET_UNALIGN = 0x6 PR_SPEC_DISABLE = 0x4 + PR_SPEC_DISABLE_NOEXEC = 0x10 PR_SPEC_ENABLE = 0x2 PR_SPEC_FORCE_DISABLE = 0x8 PR_SPEC_INDIRECT_BRANCH = 0x1 @@ -2018,6 +2112,7 @@ const ( SO_ATTACH_REUSEPORT_CBPF = 0x33 SO_ATTACH_REUSEPORT_EBPF = 0x34 SO_BINDTODEVICE = 0x19 + SO_BINDTOIFINDEX = 0x3e SO_BPF_EXTENSIONS = 0x30 SO_BROADCAST = 0x6 SO_BSDCOMPAT = 0xe @@ -2066,6 +2161,8 @@ const ( SO_RCVBUFFORCE = 0x21 SO_RCVLOWAT = 0x12 SO_RCVTIMEO = 0x14 + SO_RCVTIMEO_NEW = 0x42 + SO_RCVTIMEO_OLD = 0x14 SO_REUSEADDR = 0x2 SO_REUSEPORT = 0xf SO_RXQ_OVFL = 0x28 @@ -2077,9 +2174,17 @@ const ( SO_SNDBUFFORCE = 0x20 SO_SNDLOWAT = 0x13 SO_SNDTIMEO = 0x15 + SO_SNDTIMEO_NEW = 0x43 + SO_SNDTIMEO_OLD = 0x15 SO_TIMESTAMP = 0x1d SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPING_NEW = 0x41 + SO_TIMESTAMPING_OLD = 0x25 SO_TIMESTAMPNS = 0x23 + SO_TIMESTAMPNS_NEW = 0x40 + SO_TIMESTAMPNS_OLD = 0x23 + SO_TIMESTAMP_NEW = 0x3f + SO_TIMESTAMP_OLD = 0x1d SO_TXTIME = 0x3d SO_TYPE = 0x3 SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 @@ -2172,6 +2277,8 @@ const ( TCOFLUSH = 0x1 TCOOFF = 0x0 TCOON = 0x1 + TCP_BPF_IW = 0x3e9 + TCP_BPF_SNDCWND_CLAMP = 0x3ea TCP_CC_INFO = 0x1a TCP_CM_INQ = 0x24 TCP_CONGESTION = 0xd @@ -2373,8 +2480,10 @@ const ( UBI_IOCMKVOL = 0x40986f00 UBI_IOCRMVOL = 0x40046f01 UBI_IOCRNVOL = 0x51106f03 + UBI_IOCRPEB = 0x40046f04 UBI_IOCRSVOL = 0x400c6f02 UBI_IOCSETVOLPROP = 0x40104f06 + UBI_IOCSPEB = 0x40046f05 UBI_IOCVOLCRBLK = 0x40804f07 UBI_IOCVOLRMBLK = 0x4f08 UBI_IOCVOLUP = 0x40084f00 @@ -2522,6 +2631,7 @@ const ( XDP_FLAGS_SKB_MODE = 0x2 XDP_FLAGS_UPDATE_IF_NOEXIST = 0x1 XDP_MMAP_OFFSETS = 0x1 + XDP_PACKET_HEADROOM = 0x100 XDP_PGOFF_RX_RING = 0x0 XDP_PGOFF_TX_RING = 0x80000000 XDP_RX_RING = 0x2 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go index c1e95e29..58067c52 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go @@ -200,10 +200,59 @@ const ( BPF_ABS = 0x20 BPF_ADD = 0x0 BPF_ALU = 0x4 + BPF_ALU64 = 0x7 BPF_AND = 0x50 + BPF_ANY = 0x0 + BPF_ARSH = 0xc0 BPF_B = 0x10 + BPF_BUILD_ID_SIZE = 0x14 + BPF_CALL = 0x80 + BPF_DEVCG_ACC_MKNOD = 0x1 + BPF_DEVCG_ACC_READ = 0x2 + BPF_DEVCG_ACC_WRITE = 0x4 + BPF_DEVCG_DEV_BLOCK = 0x1 + BPF_DEVCG_DEV_CHAR = 0x2 BPF_DIV = 0x30 + BPF_DW = 0x18 + BPF_END = 0xd0 + BPF_EXIST = 0x2 + BPF_EXIT = 0x90 + BPF_FROM_BE = 0x8 + BPF_FROM_LE = 0x0 BPF_FS_MAGIC = 0xcafe4a11 + BPF_F_ALLOW_MULTI = 0x2 + BPF_F_ALLOW_OVERRIDE = 0x1 + BPF_F_ANY_ALIGNMENT = 0x2 + BPF_F_CTXLEN_MASK = 0xfffff00000000 + BPF_F_CURRENT_CPU = 0xffffffff + BPF_F_CURRENT_NETNS = -0x1 + BPF_F_DONT_FRAGMENT = 0x4 + BPF_F_FAST_STACK_CMP = 0x200 + BPF_F_HDR_FIELD_MASK = 0xf + BPF_F_INDEX_MASK = 0xffffffff + BPF_F_INGRESS = 0x1 + BPF_F_INVALIDATE_HASH = 0x2 + BPF_F_LOCK = 0x4 + BPF_F_MARK_ENFORCE = 0x40 + BPF_F_MARK_MANGLED_0 = 0x20 + BPF_F_NO_COMMON_LRU = 0x2 + BPF_F_NO_PREALLOC = 0x1 + BPF_F_NUMA_NODE = 0x4 + BPF_F_PSEUDO_HDR = 0x10 + BPF_F_QUERY_EFFECTIVE = 0x1 + BPF_F_RDONLY = 0x8 + BPF_F_RECOMPUTE_CSUM = 0x1 + BPF_F_REUSE_STACKID = 0x400 + BPF_F_SEQ_NUMBER = 0x8 + BPF_F_SKIP_FIELD_MASK = 0xff + BPF_F_STACK_BUILD_ID = 0x20 + BPF_F_STRICT_ALIGNMENT = 0x1 + BPF_F_TUNINFO_IPV6 = 0x1 + BPF_F_USER_BUILD_ID = 0x800 + BPF_F_USER_STACK = 0x100 + BPF_F_WRONLY = 0x10 + BPF_F_ZERO_CSUM_TX = 0x2 + BPF_F_ZERO_SEED = 0x40 BPF_H = 0x8 BPF_IMM = 0x0 BPF_IND = 0x40 @@ -211,8 +260,16 @@ const ( BPF_JEQ = 0x10 BPF_JGE = 0x30 BPF_JGT = 0x20 + BPF_JLE = 0xb0 + BPF_JLT = 0xa0 BPF_JMP = 0x5 + BPF_JMP32 = 0x6 + BPF_JNE = 0x50 BPF_JSET = 0x40 + BPF_JSGE = 0x70 + BPF_JSGT = 0x60 + BPF_JSLE = 0xd0 + BPF_JSLT = 0xc0 BPF_K = 0x0 BPF_LD = 0x0 BPF_LDX = 0x1 @@ -226,20 +283,33 @@ const ( BPF_MINOR_VERSION = 0x1 BPF_MISC = 0x7 BPF_MOD = 0x90 + BPF_MOV = 0xb0 BPF_MSH = 0xa0 BPF_MUL = 0x20 BPF_NEG = 0x80 BPF_NET_OFF = -0x100000 + BPF_NOEXIST = 0x1 + BPF_OBJ_NAME_LEN = 0x10 BPF_OR = 0x40 + BPF_PSEUDO_CALL = 0x1 + BPF_PSEUDO_MAP_FD = 0x1 BPF_RET = 0x6 BPF_RSH = 0x70 + BPF_SOCK_OPS_ALL_CB_FLAGS = 0x7 + BPF_SOCK_OPS_RETRANS_CB_FLAG = 0x2 + BPF_SOCK_OPS_RTO_CB_FLAG = 0x1 + BPF_SOCK_OPS_STATE_CB_FLAG = 0x4 BPF_ST = 0x2 BPF_STX = 0x3 BPF_SUB = 0x10 + BPF_TAG_SIZE = 0x8 BPF_TAX = 0x0 + BPF_TO_BE = 0x8 + BPF_TO_LE = 0x0 BPF_TXA = 0x80 BPF_W = 0x0 BPF_X = 0x8 + BPF_XADD = 0xc0 BPF_XOR = 0xa0 BRKINT = 0x2 BS0 = 0x0 @@ -323,6 +393,10 @@ const ( CRDLY = 0x600 CREAD = 0x80 CRTSCTS = 0x80000000 + CRYPTO_MAX_NAME = 0x40 + CRYPTO_MSG_MAX = 0x15 + CRYPTO_NR_MSGTYPES = 0x6 + CRYPTO_REPORT_MAXSIZE = 0x160 CS5 = 0x0 CS6 = 0x10 CS7 = 0x20 @@ -501,6 +575,7 @@ const ( FAN_ALL_MARK_FLAGS = 0xff FAN_ALL_OUTGOING_EVENTS = 0x3403b FAN_ALL_PERM_EVENTS = 0x30000 + FAN_ATTRIB = 0x4 FAN_AUDIT = 0x10 FAN_CLASS_CONTENT = 0x4 FAN_CLASS_NOTIF = 0x0 @@ -509,8 +584,12 @@ const ( FAN_CLOSE = 0x18 FAN_CLOSE_NOWRITE = 0x10 FAN_CLOSE_WRITE = 0x8 + FAN_CREATE = 0x100 + FAN_DELETE = 0x200 + FAN_DELETE_SELF = 0x400 FAN_DENY = 0x2 FAN_ENABLE_AUDIT = 0x40 + FAN_EVENT_INFO_TYPE_FID = 0x1 FAN_EVENT_METADATA_LEN = 0x18 FAN_EVENT_ON_CHILD = 0x8000000 FAN_MARK_ADD = 0x1 @@ -524,6 +603,10 @@ const ( FAN_MARK_ONLYDIR = 0x8 FAN_MARK_REMOVE = 0x2 FAN_MODIFY = 0x2 + FAN_MOVE = 0xc0 + FAN_MOVED_FROM = 0x40 + FAN_MOVED_TO = 0x80 + FAN_MOVE_SELF = 0x800 FAN_NOFD = -0x1 FAN_NONBLOCK = 0x2 FAN_ONDIR = 0x40000000 @@ -532,6 +615,7 @@ const ( FAN_OPEN_EXEC_PERM = 0x40000 FAN_OPEN_PERM = 0x10000 FAN_Q_OVERFLOW = 0x4000 + FAN_REPORT_FID = 0x200 FAN_REPORT_TID = 0x100 FAN_UNLIMITED_MARKS = 0x20 FAN_UNLIMITED_QUEUE = 0x10 @@ -1054,6 +1138,15 @@ const ( MAP_SHARED_VALIDATE = 0x3 MAP_STACK = 0x20000 MAP_TYPE = 0xf + MCAST_BLOCK_SOURCE = 0x2b + MCAST_EXCLUDE = 0x0 + MCAST_INCLUDE = 0x1 + MCAST_JOIN_GROUP = 0x2a + MCAST_JOIN_SOURCE_GROUP = 0x2e + MCAST_LEAVE_GROUP = 0x2d + MCAST_LEAVE_SOURCE_GROUP = 0x2f + MCAST_MSFILTER = 0x30 + MCAST_UNBLOCK_SOURCE = 0x2c MCL_CURRENT = 0x2000 MCL_FUTURE = 0x4000 MCL_ONFAULT = 0x8000 @@ -1489,6 +1582,7 @@ const ( PR_SET_TSC = 0x1a PR_SET_UNALIGN = 0x6 PR_SPEC_DISABLE = 0x4 + PR_SPEC_DISABLE_NOEXEC = 0x10 PR_SPEC_ENABLE = 0x2 PR_SPEC_FORCE_DISABLE = 0x8 PR_SPEC_INDIRECT_BRANCH = 0x1 @@ -2010,6 +2104,7 @@ const ( SO_ATTACH_REUSEPORT_CBPF = 0x35 SO_ATTACH_REUSEPORT_EBPF = 0x36 SO_BINDTODEVICE = 0xd + SO_BINDTOIFINDEX = 0x41 SO_BPF_EXTENSIONS = 0x32 SO_BROADCAST = 0x20 SO_BSDCOMPAT = 0x400 @@ -2058,6 +2153,8 @@ const ( SO_RCVBUFFORCE = 0x100b SO_RCVLOWAT = 0x800 SO_RCVTIMEO = 0x2000 + SO_RCVTIMEO_NEW = 0x44 + SO_RCVTIMEO_OLD = 0x2000 SO_REUSEADDR = 0x4 SO_REUSEPORT = 0x200 SO_RXQ_OVFL = 0x24 @@ -2069,9 +2166,17 @@ const ( SO_SNDBUFFORCE = 0x100a SO_SNDLOWAT = 0x1000 SO_SNDTIMEO = 0x4000 + SO_SNDTIMEO_NEW = 0x45 + SO_SNDTIMEO_OLD = 0x4000 SO_TIMESTAMP = 0x1d SO_TIMESTAMPING = 0x23 + SO_TIMESTAMPING_NEW = 0x43 + SO_TIMESTAMPING_OLD = 0x23 SO_TIMESTAMPNS = 0x21 + SO_TIMESTAMPNS_NEW = 0x42 + SO_TIMESTAMPNS_OLD = 0x21 + SO_TIMESTAMP_NEW = 0x46 + SO_TIMESTAMP_OLD = 0x1d SO_TXTIME = 0x3f SO_TYPE = 0x1008 SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 @@ -2163,6 +2268,8 @@ const ( TCOFLUSH = 0x1 TCOOFF = 0x0 TCOON = 0x1 + TCP_BPF_IW = 0x3e9 + TCP_BPF_SNDCWND_CLAMP = 0x3ea TCP_CC_INFO = 0x1a TCP_CM_INQ = 0x24 TCP_CONGESTION = 0xd @@ -2362,8 +2469,10 @@ const ( UBI_IOCMKVOL = 0x80986f00 UBI_IOCRMVOL = 0x80046f01 UBI_IOCRNVOL = 0x91106f03 + UBI_IOCRPEB = 0x80046f04 UBI_IOCRSVOL = 0x800c6f02 UBI_IOCSETVOLPROP = 0x80104f06 + UBI_IOCSPEB = 0x80046f05 UBI_IOCVOLCRBLK = 0x80804f07 UBI_IOCVOLRMBLK = 0x20004f08 UBI_IOCVOLUP = 0x80084f00 @@ -2511,6 +2620,7 @@ const ( XDP_FLAGS_SKB_MODE = 0x2 XDP_FLAGS_UPDATE_IF_NOEXIST = 0x1 XDP_MMAP_OFFSETS = 0x1 + XDP_PACKET_HEADROOM = 0x100 XDP_PGOFF_RX_RING = 0x0 XDP_PGOFF_TX_RING = 0x80000000 XDP_RX_RING = 0x2 diff --git a/vendor/golang.org/x/sys/unix/zerrors_openbsd_arm64.go b/vendor/golang.org/x/sys/unix/zerrors_openbsd_arm64.go new file mode 100644 index 00000000..ec5f92de --- /dev/null +++ b/vendor/golang.org/x/sys/unix/zerrors_openbsd_arm64.go @@ -0,0 +1,1789 @@ +// mkerrors.sh -m64 +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build arm64,openbsd + +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs -- -m64 _const.go + +package unix + +import "syscall" + +const ( + AF_APPLETALK = 0x10 + AF_BLUETOOTH = 0x20 + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_CNT = 0x15 + AF_COIP = 0x14 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_E164 = 0x1a + AF_ECMA = 0x8 + AF_ENCAP = 0x1c + AF_HYLINK = 0xf + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x18 + AF_IPX = 0x17 + AF_ISDN = 0x1a + AF_ISO = 0x7 + AF_KEY = 0x1e + AF_LAT = 0xe + AF_LINK = 0x12 + AF_LOCAL = 0x1 + AF_MAX = 0x24 + AF_MPLS = 0x21 + AF_NATM = 0x1b + AF_NS = 0x6 + AF_OSI = 0x7 + AF_PUP = 0x4 + AF_ROUTE = 0x11 + AF_SIP = 0x1d + AF_SNA = 0xb + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + ALTWERASE = 0x200 + ARPHRD_ETHER = 0x1 + ARPHRD_FRELAY = 0xf + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + B0 = 0x0 + B110 = 0x6e + B115200 = 0x1c200 + B1200 = 0x4b0 + B134 = 0x86 + B14400 = 0x3840 + B150 = 0x96 + B1800 = 0x708 + B19200 = 0x4b00 + B200 = 0xc8 + B230400 = 0x38400 + B2400 = 0x960 + B28800 = 0x7080 + B300 = 0x12c + B38400 = 0x9600 + B4800 = 0x12c0 + B50 = 0x32 + B57600 = 0xe100 + B600 = 0x258 + B7200 = 0x1c20 + B75 = 0x4b + B76800 = 0x12c00 + B9600 = 0x2580 + BIOCFLUSH = 0x20004268 + BIOCGBLEN = 0x40044266 + BIOCGDIRFILT = 0x4004427c + BIOCGDLT = 0x4004426a + BIOCGDLTLIST = 0xc010427b + BIOCGETIF = 0x4020426b + BIOCGFILDROP = 0x40044278 + BIOCGHDRCMPLT = 0x40044274 + BIOCGRSIG = 0x40044273 + BIOCGRTIMEOUT = 0x4010426e + BIOCGSTATS = 0x4008426f + BIOCIMMEDIATE = 0x80044270 + BIOCLOCK = 0x20004276 + BIOCPROMISC = 0x20004269 + BIOCSBLEN = 0xc0044266 + BIOCSDIRFILT = 0x8004427d + BIOCSDLT = 0x8004427a + BIOCSETF = 0x80104267 + BIOCSETIF = 0x8020426c + BIOCSETWF = 0x80104277 + BIOCSFILDROP = 0x80044279 + BIOCSHDRCMPLT = 0x80044275 + BIOCSRSIG = 0x80044272 + BIOCSRTIMEOUT = 0x8010426d + BIOCVERSION = 0x40044271 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALIGNMENT = 0x4 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIRECTION_IN = 0x1 + BPF_DIRECTION_OUT = 0x2 + BPF_DIV = 0x30 + BPF_FILDROP_CAPTURE = 0x1 + BPF_FILDROP_DROP = 0x2 + BPF_FILDROP_PASS = 0x0 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x200000 + BPF_MAXINSNS = 0x200 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINBUFSIZE = 0x20 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RELEASE = 0x30bb6 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BRKINT = 0x2 + CFLUSH = 0xf + CLOCAL = 0x8000 + CLOCK_BOOTTIME = 0x6 + CLOCK_MONOTONIC = 0x3 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_THREAD_CPUTIME_ID = 0x4 + CLOCK_UPTIME = 0x5 + CREAD = 0x800 + CRTSCTS = 0x10000 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0xff + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + CTL_HW = 0x6 + CTL_KERN = 0x1 + CTL_MAXNAME = 0xc + CTL_NET = 0x4 + DIOCOSFPFLUSH = 0x2000444e + DLT_ARCNET = 0x7 + DLT_ATM_RFC1483 = 0xb + DLT_AX25 = 0x3 + DLT_CHAOS = 0x5 + DLT_C_HDLC = 0x68 + DLT_EN10MB = 0x1 + DLT_EN3MB = 0x2 + DLT_ENC = 0xd + DLT_FDDI = 0xa + DLT_IEEE802 = 0x6 + DLT_IEEE802_11 = 0x69 + DLT_IEEE802_11_RADIO = 0x7f + DLT_LOOP = 0xc + DLT_MPLS = 0xdb + DLT_NULL = 0x0 + DLT_OPENFLOW = 0x10b + DLT_PFLOG = 0x75 + DLT_PFSYNC = 0x12 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0x10 + DLT_PPP_ETHER = 0x33 + DLT_PPP_SERIAL = 0x32 + DLT_PRONET = 0x4 + DLT_RAW = 0xe + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xf + DLT_USBPCAP = 0xf9 + DLT_USER0 = 0x93 + DLT_USER1 = 0x94 + DLT_USER10 = 0x9d + DLT_USER11 = 0x9e + DLT_USER12 = 0x9f + DLT_USER13 = 0xa0 + DLT_USER14 = 0xa1 + DLT_USER15 = 0xa2 + DLT_USER2 = 0x95 + DLT_USER3 = 0x96 + DLT_USER4 = 0x97 + DLT_USER5 = 0x98 + DLT_USER6 = 0x99 + DLT_USER7 = 0x9a + DLT_USER8 = 0x9b + DLT_USER9 = 0x9c + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EMT_TAGOVF = 0x1 + EMUL_ENABLED = 0x1 + EMUL_NATIVE = 0x2 + ENDRUNDISC = 0x9 + ETHERMIN = 0x2e + ETHERMTU = 0x5dc + ETHERTYPE_8023 = 0x4 + ETHERTYPE_AARP = 0x80f3 + ETHERTYPE_ACCTON = 0x8390 + ETHERTYPE_AEONIC = 0x8036 + ETHERTYPE_ALPHA = 0x814a + ETHERTYPE_AMBER = 0x6008 + ETHERTYPE_AMOEBA = 0x8145 + ETHERTYPE_AOE = 0x88a2 + ETHERTYPE_APOLLO = 0x80f7 + ETHERTYPE_APOLLODOMAIN = 0x8019 + ETHERTYPE_APPLETALK = 0x809b + ETHERTYPE_APPLITEK = 0x80c7 + ETHERTYPE_ARGONAUT = 0x803a + ETHERTYPE_ARP = 0x806 + ETHERTYPE_AT = 0x809b + ETHERTYPE_ATALK = 0x809b + ETHERTYPE_ATOMIC = 0x86df + ETHERTYPE_ATT = 0x8069 + ETHERTYPE_ATTSTANFORD = 0x8008 + ETHERTYPE_AUTOPHON = 0x806a + ETHERTYPE_AXIS = 0x8856 + ETHERTYPE_BCLOOP = 0x9003 + ETHERTYPE_BOFL = 0x8102 + ETHERTYPE_CABLETRON = 0x7034 + ETHERTYPE_CHAOS = 0x804 + ETHERTYPE_COMDESIGN = 0x806c + ETHERTYPE_COMPUGRAPHIC = 0x806d + ETHERTYPE_COUNTERPOINT = 0x8062 + ETHERTYPE_CRONUS = 0x8004 + ETHERTYPE_CRONUSVLN = 0x8003 + ETHERTYPE_DCA = 0x1234 + ETHERTYPE_DDE = 0x807b + ETHERTYPE_DEBNI = 0xaaaa + ETHERTYPE_DECAM = 0x8048 + ETHERTYPE_DECCUST = 0x6006 + ETHERTYPE_DECDIAG = 0x6005 + ETHERTYPE_DECDNS = 0x803c + ETHERTYPE_DECDTS = 0x803e + ETHERTYPE_DECEXPER = 0x6000 + ETHERTYPE_DECLAST = 0x8041 + ETHERTYPE_DECLTM = 0x803f + ETHERTYPE_DECMUMPS = 0x6009 + ETHERTYPE_DECNETBIOS = 0x8040 + ETHERTYPE_DELTACON = 0x86de + ETHERTYPE_DIDDLE = 0x4321 + ETHERTYPE_DLOG1 = 0x660 + ETHERTYPE_DLOG2 = 0x661 + ETHERTYPE_DN = 0x6003 + ETHERTYPE_DOGFIGHT = 0x1989 + ETHERTYPE_DSMD = 0x8039 + ETHERTYPE_ECMA = 0x803 + ETHERTYPE_ENCRYPT = 0x803d + ETHERTYPE_ES = 0x805d + ETHERTYPE_EXCELAN = 0x8010 + ETHERTYPE_EXPERDATA = 0x8049 + ETHERTYPE_FLIP = 0x8146 + ETHERTYPE_FLOWCONTROL = 0x8808 + ETHERTYPE_FRARP = 0x808 + ETHERTYPE_GENDYN = 0x8068 + ETHERTYPE_HAYES = 0x8130 + ETHERTYPE_HIPPI_FP = 0x8180 + ETHERTYPE_HITACHI = 0x8820 + ETHERTYPE_HP = 0x8005 + ETHERTYPE_IEEEPUP = 0xa00 + ETHERTYPE_IEEEPUPAT = 0xa01 + ETHERTYPE_IMLBL = 0x4c42 + ETHERTYPE_IMLBLDIAG = 0x424c + ETHERTYPE_IP = 0x800 + ETHERTYPE_IPAS = 0x876c + ETHERTYPE_IPV6 = 0x86dd + ETHERTYPE_IPX = 0x8137 + ETHERTYPE_IPXNEW = 0x8037 + ETHERTYPE_KALPANA = 0x8582 + ETHERTYPE_LANBRIDGE = 0x8038 + ETHERTYPE_LANPROBE = 0x8888 + ETHERTYPE_LAT = 0x6004 + ETHERTYPE_LBACK = 0x9000 + ETHERTYPE_LITTLE = 0x8060 + ETHERTYPE_LLDP = 0x88cc + ETHERTYPE_LOGICRAFT = 0x8148 + ETHERTYPE_LOOPBACK = 0x9000 + ETHERTYPE_MATRA = 0x807a + ETHERTYPE_MAX = 0xffff + ETHERTYPE_MERIT = 0x807c + ETHERTYPE_MICP = 0x873a + ETHERTYPE_MOPDL = 0x6001 + ETHERTYPE_MOPRC = 0x6002 + ETHERTYPE_MOTOROLA = 0x818d + ETHERTYPE_MPLS = 0x8847 + ETHERTYPE_MPLS_MCAST = 0x8848 + ETHERTYPE_MUMPS = 0x813f + ETHERTYPE_NBPCC = 0x3c04 + ETHERTYPE_NBPCLAIM = 0x3c09 + ETHERTYPE_NBPCLREQ = 0x3c05 + ETHERTYPE_NBPCLRSP = 0x3c06 + ETHERTYPE_NBPCREQ = 0x3c02 + ETHERTYPE_NBPCRSP = 0x3c03 + ETHERTYPE_NBPDG = 0x3c07 + ETHERTYPE_NBPDGB = 0x3c08 + ETHERTYPE_NBPDLTE = 0x3c0a + ETHERTYPE_NBPRAR = 0x3c0c + ETHERTYPE_NBPRAS = 0x3c0b + ETHERTYPE_NBPRST = 0x3c0d + ETHERTYPE_NBPSCD = 0x3c01 + ETHERTYPE_NBPVCD = 0x3c00 + ETHERTYPE_NBS = 0x802 + ETHERTYPE_NCD = 0x8149 + ETHERTYPE_NESTAR = 0x8006 + ETHERTYPE_NETBEUI = 0x8191 + ETHERTYPE_NOVELL = 0x8138 + ETHERTYPE_NS = 0x600 + ETHERTYPE_NSAT = 0x601 + ETHERTYPE_NSCOMPAT = 0x807 + ETHERTYPE_NTRAILER = 0x10 + ETHERTYPE_OS9 = 0x7007 + ETHERTYPE_OS9NET = 0x7009 + ETHERTYPE_PACER = 0x80c6 + ETHERTYPE_PAE = 0x888e + ETHERTYPE_PBB = 0x88e7 + ETHERTYPE_PCS = 0x4242 + ETHERTYPE_PLANNING = 0x8044 + ETHERTYPE_PPP = 0x880b + ETHERTYPE_PPPOE = 0x8864 + ETHERTYPE_PPPOEDISC = 0x8863 + ETHERTYPE_PRIMENTS = 0x7031 + ETHERTYPE_PUP = 0x200 + ETHERTYPE_PUPAT = 0x200 + ETHERTYPE_QINQ = 0x88a8 + ETHERTYPE_RACAL = 0x7030 + ETHERTYPE_RATIONAL = 0x8150 + ETHERTYPE_RAWFR = 0x6559 + ETHERTYPE_RCL = 0x1995 + ETHERTYPE_RDP = 0x8739 + ETHERTYPE_RETIX = 0x80f2 + ETHERTYPE_REVARP = 0x8035 + ETHERTYPE_SCA = 0x6007 + ETHERTYPE_SECTRA = 0x86db + ETHERTYPE_SECUREDATA = 0x876d + ETHERTYPE_SGITW = 0x817e + ETHERTYPE_SG_BOUNCE = 0x8016 + ETHERTYPE_SG_DIAG = 0x8013 + ETHERTYPE_SG_NETGAMES = 0x8014 + ETHERTYPE_SG_RESV = 0x8015 + ETHERTYPE_SIMNET = 0x5208 + ETHERTYPE_SLOW = 0x8809 + ETHERTYPE_SNA = 0x80d5 + ETHERTYPE_SNMP = 0x814c + ETHERTYPE_SONIX = 0xfaf5 + ETHERTYPE_SPIDER = 0x809f + ETHERTYPE_SPRITE = 0x500 + ETHERTYPE_STP = 0x8181 + ETHERTYPE_TALARIS = 0x812b + ETHERTYPE_TALARISMC = 0x852b + ETHERTYPE_TCPCOMP = 0x876b + ETHERTYPE_TCPSM = 0x9002 + ETHERTYPE_TEC = 0x814f + ETHERTYPE_TIGAN = 0x802f + ETHERTYPE_TRAIL = 0x1000 + ETHERTYPE_TRANSETHER = 0x6558 + ETHERTYPE_TYMSHARE = 0x802e + ETHERTYPE_UBBST = 0x7005 + ETHERTYPE_UBDEBUG = 0x900 + ETHERTYPE_UBDIAGLOOP = 0x7002 + ETHERTYPE_UBDL = 0x7000 + ETHERTYPE_UBNIU = 0x7001 + ETHERTYPE_UBNMC = 0x7003 + ETHERTYPE_VALID = 0x1600 + ETHERTYPE_VARIAN = 0x80dd + ETHERTYPE_VAXELN = 0x803b + ETHERTYPE_VEECO = 0x8067 + ETHERTYPE_VEXP = 0x805b + ETHERTYPE_VGLAB = 0x8131 + ETHERTYPE_VINES = 0xbad + ETHERTYPE_VINESECHO = 0xbaf + ETHERTYPE_VINESLOOP = 0xbae + ETHERTYPE_VITAL = 0xff00 + ETHERTYPE_VLAN = 0x8100 + ETHERTYPE_VLTLMAN = 0x8080 + ETHERTYPE_VPROD = 0x805c + ETHERTYPE_VURESERVED = 0x8147 + ETHERTYPE_WATERLOO = 0x8130 + ETHERTYPE_WELLFLEET = 0x8103 + ETHERTYPE_X25 = 0x805 + ETHERTYPE_X75 = 0x801 + ETHERTYPE_XNSSM = 0x9001 + ETHERTYPE_XTP = 0x817d + ETHER_ADDR_LEN = 0x6 + ETHER_ALIGN = 0x2 + ETHER_CRC_LEN = 0x4 + ETHER_CRC_POLY_BE = 0x4c11db6 + ETHER_CRC_POLY_LE = 0xedb88320 + ETHER_HDR_LEN = 0xe + ETHER_MAX_DIX_LEN = 0x600 + ETHER_MAX_HARDMTU_LEN = 0xff9b + ETHER_MAX_LEN = 0x5ee + ETHER_MIN_LEN = 0x40 + ETHER_TYPE_LEN = 0x2 + ETHER_VLAN_ENCAP_LEN = 0x4 + EVFILT_AIO = -0x3 + EVFILT_DEVICE = -0x8 + EVFILT_PROC = -0x5 + EVFILT_READ = -0x1 + EVFILT_SIGNAL = -0x6 + EVFILT_SYSCOUNT = 0x8 + EVFILT_TIMER = -0x7 + EVFILT_VNODE = -0x4 + EVFILT_WRITE = -0x2 + EVL_ENCAPLEN = 0x4 + EVL_PRIO_BITS = 0xd + EVL_PRIO_MAX = 0x7 + EVL_VLID_MASK = 0xfff + EVL_VLID_MAX = 0xffe + EVL_VLID_MIN = 0x1 + EVL_VLID_NULL = 0x0 + EV_ADD = 0x1 + EV_CLEAR = 0x20 + EV_DELETE = 0x2 + EV_DISABLE = 0x8 + EV_DISPATCH = 0x80 + EV_ENABLE = 0x4 + EV_EOF = 0x8000 + EV_ERROR = 0x4000 + EV_FLAG1 = 0x2000 + EV_ONESHOT = 0x10 + EV_RECEIPT = 0x40 + EV_SYSFLAGS = 0xf000 + EXTA = 0x4b00 + EXTB = 0x9600 + EXTPROC = 0x800 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FLUSHO = 0x800000 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0xa + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0x7 + F_GETOWN = 0x5 + F_ISATTY = 0xb + F_OK = 0x0 + F_RDLCK = 0x1 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLK = 0x8 + F_SETLKW = 0x9 + F_SETOWN = 0x6 + F_UNLCK = 0x2 + F_WRLCK = 0x3 + HUPCL = 0x4000 + HW_MACHINE = 0x1 + ICANON = 0x100 + ICMP6_FILTER = 0x12 + ICRNL = 0x100 + IEXTEN = 0x400 + IFAN_ARRIVAL = 0x0 + IFAN_DEPARTURE = 0x1 + IFF_ALLMULTI = 0x200 + IFF_BROADCAST = 0x2 + IFF_CANTCHANGE = 0x8e52 + IFF_DEBUG = 0x4 + IFF_LINK0 = 0x1000 + IFF_LINK1 = 0x2000 + IFF_LINK2 = 0x4000 + IFF_LOOPBACK = 0x8 + IFF_MULTICAST = 0x8000 + IFF_NOARP = 0x80 + IFF_OACTIVE = 0x400 + IFF_POINTOPOINT = 0x10 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SIMPLEX = 0x800 + IFF_STATICARP = 0x20 + IFF_UP = 0x1 + IFNAMSIZ = 0x10 + IFT_1822 = 0x2 + IFT_A12MPPSWITCH = 0x82 + IFT_AAL2 = 0xbb + IFT_AAL5 = 0x31 + IFT_ADSL = 0x5e + IFT_AFLANE8023 = 0x3b + IFT_AFLANE8025 = 0x3c + IFT_ARAP = 0x58 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ASYNC = 0x54 + IFT_ATM = 0x25 + IFT_ATMDXI = 0x69 + IFT_ATMFUNI = 0x6a + IFT_ATMIMA = 0x6b + IFT_ATMLOGICAL = 0x50 + IFT_ATMRADIO = 0xbd + IFT_ATMSUBINTERFACE = 0x86 + IFT_ATMVCIENDPT = 0xc2 + IFT_ATMVIRTUAL = 0x95 + IFT_BGPPOLICYACCOUNTING = 0xa2 + IFT_BLUETOOTH = 0xf8 + IFT_BRIDGE = 0xd1 + IFT_BSC = 0x53 + IFT_CARP = 0xf7 + IFT_CCTEMUL = 0x3d + IFT_CEPT = 0x13 + IFT_CES = 0x85 + IFT_CHANNEL = 0x46 + IFT_CNR = 0x55 + IFT_COFFEE = 0x84 + IFT_COMPOSITELINK = 0x9b + IFT_DCN = 0x8d + IFT_DIGITALPOWERLINE = 0x8a + IFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba + IFT_DLSW = 0x4a + IFT_DOCSCABLEDOWNSTREAM = 0x80 + IFT_DOCSCABLEMACLAYER = 0x7f + IFT_DOCSCABLEUPSTREAM = 0x81 + IFT_DOCSCABLEUPSTREAMCHANNEL = 0xcd + IFT_DS0 = 0x51 + IFT_DS0BUNDLE = 0x52 + IFT_DS1FDL = 0xaa + IFT_DS3 = 0x1e + IFT_DTM = 0x8c + IFT_DUMMY = 0xf1 + IFT_DVBASILN = 0xac + IFT_DVBASIOUT = 0xad + IFT_DVBRCCDOWNSTREAM = 0x93 + IFT_DVBRCCMACLAYER = 0x92 + IFT_DVBRCCUPSTREAM = 0x94 + IFT_ECONET = 0xce + IFT_ENC = 0xf4 + IFT_EON = 0x19 + IFT_EPLRS = 0x57 + IFT_ESCON = 0x49 + IFT_ETHER = 0x6 + IFT_FAITH = 0xf3 + IFT_FAST = 0x7d + IFT_FASTETHER = 0x3e + IFT_FASTETHERFX = 0x45 + IFT_FDDI = 0xf + IFT_FIBRECHANNEL = 0x38 + IFT_FRAMERELAYINTERCONNECT = 0x3a + IFT_FRAMERELAYMPI = 0x5c + IFT_FRDLCIENDPT = 0xc1 + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_FRF16MFRBUNDLE = 0xa3 + IFT_FRFORWARD = 0x9e + IFT_G703AT2MB = 0x43 + IFT_G703AT64K = 0x42 + IFT_GIF = 0xf0 + IFT_GIGABITETHERNET = 0x75 + IFT_GR303IDT = 0xb2 + IFT_GR303RDT = 0xb1 + IFT_H323GATEKEEPER = 0xa4 + IFT_H323PROXY = 0xa5 + IFT_HDH1822 = 0x3 + IFT_HDLC = 0x76 + IFT_HDSL2 = 0xa8 + IFT_HIPERLAN2 = 0xb7 + IFT_HIPPI = 0x2f + IFT_HIPPIINTERFACE = 0x39 + IFT_HOSTPAD = 0x5a + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IBM370PARCHAN = 0x48 + IFT_IDSL = 0x9a + IFT_IEEE1394 = 0x90 + IFT_IEEE80211 = 0x47 + IFT_IEEE80212 = 0x37 + IFT_IEEE8023ADLAG = 0xa1 + IFT_IFGSN = 0x91 + IFT_IMT = 0xbe + IFT_INFINIBAND = 0xc7 + IFT_INTERLEAVE = 0x7c + IFT_IP = 0x7e + IFT_IPFORWARD = 0x8e + IFT_IPOVERATM = 0x72 + IFT_IPOVERCDLC = 0x6d + IFT_IPOVERCLAW = 0x6e + IFT_IPSWITCH = 0x4e + IFT_ISDN = 0x3f + IFT_ISDNBASIC = 0x14 + IFT_ISDNPRIMARY = 0x15 + IFT_ISDNS = 0x4b + IFT_ISDNU = 0x4c + IFT_ISO88022LLC = 0x29 + IFT_ISO88023 = 0x7 + IFT_ISO88024 = 0x8 + IFT_ISO88025 = 0x9 + IFT_ISO88025CRFPINT = 0x62 + IFT_ISO88025DTR = 0x56 + IFT_ISO88025FIBER = 0x73 + IFT_ISO88026 = 0xa + IFT_ISUP = 0xb3 + IFT_L2VLAN = 0x87 + IFT_L3IPVLAN = 0x88 + IFT_L3IPXVLAN = 0x89 + IFT_LAPB = 0x10 + IFT_LAPD = 0x4d + IFT_LAPF = 0x77 + IFT_LINEGROUP = 0xd2 + IFT_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MBIM = 0xfa + IFT_MEDIAMAILOVERIP = 0x8b + IFT_MFSIGLINK = 0xa7 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_MPC = 0x71 + IFT_MPLS = 0xa6 + IFT_MPLSTUNNEL = 0x96 + IFT_MSDSL = 0x8f + IFT_MVL = 0xbf + IFT_MYRINET = 0x63 + IFT_NFAS = 0xaf + IFT_NSIP = 0x1b + IFT_OPTICALCHANNEL = 0xc3 + IFT_OPTICALTRANSPORT = 0xc4 + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PFLOG = 0xf5 + IFT_PFLOW = 0xf9 + IFT_PFSYNC = 0xf6 + IFT_PLC = 0xae + IFT_PON155 = 0xcf + IFT_PON622 = 0xd0 + IFT_POS = 0xab + IFT_PPP = 0x17 + IFT_PPPMULTILINKBUNDLE = 0x6c + IFT_PROPATM = 0xc5 + IFT_PROPBWAP2MP = 0xb8 + IFT_PROPCNLS = 0x59 + IFT_PROPDOCSWIRELESSDOWNSTREAM = 0xb5 + IFT_PROPDOCSWIRELESSMACLAYER = 0xb4 + IFT_PROPDOCSWIRELESSUPSTREAM = 0xb6 + IFT_PROPMUX = 0x36 + IFT_PROPVIRTUAL = 0x35 + IFT_PROPWIRELESSP2P = 0x9d + IFT_PTPSERIAL = 0x16 + IFT_PVC = 0xf2 + IFT_Q2931 = 0xc9 + IFT_QLLC = 0x44 + IFT_RADIOMAC = 0xbc + IFT_RADSL = 0x5f + IFT_REACHDSL = 0xc0 + IFT_RFC1483 = 0x9f + IFT_RS232 = 0x21 + IFT_RSRB = 0x4f + IFT_SDLC = 0x11 + IFT_SDSL = 0x60 + IFT_SHDSL = 0xa9 + IFT_SIP = 0x1f + IFT_SIPSIG = 0xcc + IFT_SIPTG = 0xcb + IFT_SLIP = 0x1c + IFT_SMDSDXI = 0x2b + IFT_SMDSICIP = 0x34 + IFT_SONET = 0x27 + IFT_SONETOVERHEADCHANNEL = 0xb9 + IFT_SONETPATH = 0x32 + IFT_SONETVT = 0x33 + IFT_SRP = 0x97 + IFT_SS7SIGLINK = 0x9c + IFT_STACKTOSTACK = 0x6f + IFT_STARLAN = 0xb + IFT_T1 = 0x12 + IFT_TDLC = 0x74 + IFT_TELINK = 0xc8 + IFT_TERMPAD = 0x5b + IFT_TR008 = 0xb0 + IFT_TRANSPHDLC = 0x7b + IFT_TUNNEL = 0x83 + IFT_ULTRA = 0x1d + IFT_USB = 0xa0 + IFT_V11 = 0x40 + IFT_V35 = 0x2d + IFT_V36 = 0x41 + IFT_V37 = 0x78 + IFT_VDSL = 0x61 + IFT_VIRTUALIPADDRESS = 0x70 + IFT_VIRTUALTG = 0xca + IFT_VOICEDID = 0xd5 + IFT_VOICEEM = 0x64 + IFT_VOICEEMFGD = 0xd3 + IFT_VOICEENCAP = 0x67 + IFT_VOICEFGDEANA = 0xd4 + IFT_VOICEFXO = 0x65 + IFT_VOICEFXS = 0x66 + IFT_VOICEOVERATM = 0x98 + IFT_VOICEOVERCABLE = 0xc6 + IFT_VOICEOVERFRAMERELAY = 0x99 + IFT_VOICEOVERIP = 0x68 + IFT_X213 = 0x5d + IFT_X25 = 0x5 + IFT_X25DDN = 0x4 + IFT_X25HUNTGROUP = 0x7a + IFT_X25MLP = 0x79 + IFT_X25PLE = 0x28 + IFT_XETHER = 0x1a + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLASSD_HOST = 0xfffffff + IN_CLASSD_NET = 0xf0000000 + IN_CLASSD_NSHIFT = 0x1c + IN_LOOPBACKNET = 0x7f + IN_RFC3021_HOST = 0x1 + IN_RFC3021_NET = 0xfffffffe + IN_RFC3021_NSHIFT = 0x1f + IPPROTO_AH = 0x33 + IPPROTO_CARP = 0x70 + IPPROTO_DIVERT = 0x102 + IPPROTO_DONE = 0x101 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_EON = 0x50 + IPPROTO_ESP = 0x32 + IPPROTO_ETHERIP = 0x61 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GGP = 0x3 + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPCOMP = 0x6c + IPPROTO_IPIP = 0x4 + IPPROTO_IPV4 = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MAX = 0x100 + IPPROTO_MAXID = 0x103 + IPPROTO_MOBILE = 0x37 + IPPROTO_MPLS = 0x89 + IPPROTO_NONE = 0x3b + IPPROTO_PFSYNC = 0xf0 + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPV6_AUTH_LEVEL = 0x35 + IPV6_AUTOFLOWLABEL = 0x3b + IPV6_CHECKSUM = 0x1a + IPV6_DEFAULT_MULTICAST_HOPS = 0x1 + IPV6_DEFAULT_MULTICAST_LOOP = 0x1 + IPV6_DEFHLIM = 0x40 + IPV6_DONTFRAG = 0x3e + IPV6_DSTOPTS = 0x32 + IPV6_ESP_NETWORK_LEVEL = 0x37 + IPV6_ESP_TRANS_LEVEL = 0x36 + IPV6_FAITH = 0x1d + IPV6_FLOWINFO_MASK = 0xffffff0f + IPV6_FLOWLABEL_MASK = 0xffff0f00 + IPV6_FRAGTTL = 0x78 + IPV6_HLIMDEC = 0x1 + IPV6_HOPLIMIT = 0x2f + IPV6_HOPOPTS = 0x31 + IPV6_IPCOMP_LEVEL = 0x3c + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + IPV6_MAXHLIM = 0xff + IPV6_MAXPACKET = 0xffff + IPV6_MINHOPCOUNT = 0x41 + IPV6_MMTU = 0x500 + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_LOOP = 0xb + IPV6_NEXTHOP = 0x30 + IPV6_OPTIONS = 0x1 + IPV6_PATHMTU = 0x2c + IPV6_PIPEX = 0x3f + IPV6_PKTINFO = 0x2e + IPV6_PORTRANGE = 0xe + IPV6_PORTRANGE_DEFAULT = 0x0 + IPV6_PORTRANGE_HIGH = 0x1 + IPV6_PORTRANGE_LOW = 0x2 + IPV6_RECVDSTOPTS = 0x28 + IPV6_RECVDSTPORT = 0x40 + IPV6_RECVHOPLIMIT = 0x25 + IPV6_RECVHOPOPTS = 0x27 + IPV6_RECVPATHMTU = 0x2b + IPV6_RECVPKTINFO = 0x24 + IPV6_RECVRTHDR = 0x26 + IPV6_RECVTCLASS = 0x39 + IPV6_RTABLE = 0x1021 + IPV6_RTHDR = 0x33 + IPV6_RTHDRDSTOPTS = 0x23 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SOCKOPT_RESERVED1 = 0x3 + IPV6_TCLASS = 0x3d + IPV6_UNICAST_HOPS = 0x4 + IPV6_USE_MIN_MTU = 0x2a + IPV6_V6ONLY = 0x1b + IPV6_VERSION = 0x60 + IPV6_VERSION_MASK = 0xf0 + IP_ADD_MEMBERSHIP = 0xc + IP_AUTH_LEVEL = 0x14 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0xd + IP_ESP_NETWORK_LEVEL = 0x16 + IP_ESP_TRANS_LEVEL = 0x15 + IP_HDRINCL = 0x2 + IP_IPCOMP_LEVEL = 0x1d + IP_IPDEFTTL = 0x25 + IP_IPSECFLOWINFO = 0x24 + IP_IPSEC_LOCAL_AUTH = 0x1b + IP_IPSEC_LOCAL_CRED = 0x19 + IP_IPSEC_LOCAL_ID = 0x17 + IP_IPSEC_REMOTE_AUTH = 0x1c + IP_IPSEC_REMOTE_CRED = 0x1a + IP_IPSEC_REMOTE_ID = 0x18 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0xfff + IP_MF = 0x2000 + IP_MINTTL = 0x20 + IP_MIN_MEMBERSHIPS = 0xf + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_LOOP = 0xb + IP_MULTICAST_TTL = 0xa + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x1 + IP_PIPEX = 0x22 + IP_PORTRANGE = 0x13 + IP_PORTRANGE_DEFAULT = 0x0 + IP_PORTRANGE_HIGH = 0x1 + IP_PORTRANGE_LOW = 0x2 + IP_RECVDSTADDR = 0x7 + IP_RECVDSTPORT = 0x21 + IP_RECVIF = 0x1e + IP_RECVOPTS = 0x5 + IP_RECVRETOPTS = 0x6 + IP_RECVRTABLE = 0x23 + IP_RECVTTL = 0x1f + IP_RETOPTS = 0x8 + IP_RF = 0x8000 + IP_RTABLE = 0x1021 + IP_SENDSRCADDR = 0x7 + IP_TOS = 0x3 + IP_TTL = 0x4 + ISIG = 0x80 + ISTRIP = 0x20 + IUCLC = 0x1000 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + KERN_HOSTNAME = 0xa + KERN_OSRELEASE = 0x2 + KERN_OSTYPE = 0x1 + KERN_VERSION = 0x4 + LCNT_OVERLOAD_FLUSH = 0x6 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DONTNEED = 0x4 + MADV_FREE = 0x6 + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_SEQUENTIAL = 0x2 + MADV_SPACEAVAIL = 0x5 + MADV_WILLNEED = 0x3 + MAP_ANON = 0x1000 + MAP_ANONYMOUS = 0x1000 + MAP_CONCEAL = 0x8000 + MAP_COPY = 0x2 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_FLAGMASK = 0xfff7 + MAP_HASSEMAPHORE = 0x0 + MAP_INHERIT = 0x0 + MAP_INHERIT_COPY = 0x1 + MAP_INHERIT_NONE = 0x2 + MAP_INHERIT_SHARE = 0x0 + MAP_INHERIT_ZERO = 0x3 + MAP_NOEXTEND = 0x0 + MAP_NORESERVE = 0x0 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x0 + MAP_SHARED = 0x1 + MAP_STACK = 0x4000 + MAP_TRYFIXED = 0x0 + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MNT_ASYNC = 0x40 + MNT_DEFEXPORTED = 0x200 + MNT_DELEXPORT = 0x20000 + MNT_DOOMED = 0x8000000 + MNT_EXPORTANON = 0x400 + MNT_EXPORTED = 0x100 + MNT_EXRDONLY = 0x80 + MNT_FORCE = 0x80000 + MNT_LAZY = 0x3 + MNT_LOCAL = 0x1000 + MNT_NOATIME = 0x8000 + MNT_NODEV = 0x10 + MNT_NOEXEC = 0x4 + MNT_NOPERM = 0x20 + MNT_NOSUID = 0x8 + MNT_NOWAIT = 0x2 + MNT_QUOTA = 0x2000 + MNT_RDONLY = 0x1 + MNT_RELOAD = 0x40000 + MNT_ROOTFS = 0x4000 + MNT_SOFTDEP = 0x4000000 + MNT_STALLED = 0x100000 + MNT_SWAPPABLE = 0x200000 + MNT_SYNCHRONOUS = 0x2 + MNT_UPDATE = 0x10000 + MNT_VISFLAGMASK = 0x400ffff + MNT_WAIT = 0x1 + MNT_WANTRDWR = 0x2000000 + MNT_WXALLOWED = 0x800 + MSG_BCAST = 0x100 + MSG_CMSG_CLOEXEC = 0x800 + MSG_CTRUNC = 0x20 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_EOR = 0x8 + MSG_MCAST = 0x200 + MSG_NOSIGNAL = 0x400 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_TRUNC = 0x10 + MSG_WAITALL = 0x40 + MS_ASYNC = 0x1 + MS_INVALIDATE = 0x4 + MS_SYNC = 0x2 + NAME_MAX = 0xff + NET_RT_DUMP = 0x1 + NET_RT_FLAGS = 0x2 + NET_RT_IFLIST = 0x3 + NET_RT_IFNAMES = 0x6 + NET_RT_MAXID = 0x7 + NET_RT_STATS = 0x4 + NET_RT_TABLE = 0x5 + NOFLSH = 0x80000000 + NOKERNINFO = 0x2000000 + NOTE_ATTRIB = 0x8 + NOTE_CHANGE = 0x1 + NOTE_CHILD = 0x4 + NOTE_DELETE = 0x1 + NOTE_EOF = 0x2 + NOTE_EXEC = 0x20000000 + NOTE_EXIT = 0x80000000 + NOTE_EXTEND = 0x4 + NOTE_FORK = 0x40000000 + NOTE_LINK = 0x10 + NOTE_LOWAT = 0x1 + NOTE_PCTRLMASK = 0xf0000000 + NOTE_PDATAMASK = 0xfffff + NOTE_RENAME = 0x20 + NOTE_REVOKE = 0x40 + NOTE_TRACK = 0x1 + NOTE_TRACKERR = 0x2 + NOTE_TRUNCATE = 0x80 + NOTE_WRITE = 0x2 + OCRNL = 0x10 + OLCUC = 0x20 + ONLCR = 0x2 + ONLRET = 0x80 + ONOCR = 0x40 + ONOEOT = 0x8 + OPOST = 0x1 + OXTABS = 0x4 + O_ACCMODE = 0x3 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x10000 + O_CREAT = 0x200 + O_DIRECTORY = 0x20000 + O_DSYNC = 0x80 + O_EXCL = 0x800 + O_EXLOCK = 0x20 + O_FSYNC = 0x80 + O_NDELAY = 0x4 + O_NOCTTY = 0x8000 + O_NOFOLLOW = 0x100 + O_NONBLOCK = 0x4 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x80 + O_SHLOCK = 0x10 + O_SYNC = 0x80 + O_TRUNC = 0x400 + O_WRONLY = 0x1 + PARENB = 0x1000 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PF_FLUSH = 0x1 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_MEMLOCK = 0x6 + RLIMIT_NOFILE = 0x8 + RLIMIT_NPROC = 0x7 + RLIMIT_RSS = 0x5 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0x7fffffffffffffff + RTAX_AUTHOR = 0x6 + RTAX_BFD = 0xb + RTAX_BRD = 0x7 + RTAX_DNS = 0xc + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_LABEL = 0xa + RTAX_MAX = 0xf + RTAX_NETMASK = 0x2 + RTAX_SEARCH = 0xe + RTAX_SRC = 0x8 + RTAX_SRCMASK = 0x9 + RTAX_STATIC = 0xd + RTA_AUTHOR = 0x40 + RTA_BFD = 0x800 + RTA_BRD = 0x80 + RTA_DNS = 0x1000 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_LABEL = 0x400 + RTA_NETMASK = 0x4 + RTA_SEARCH = 0x4000 + RTA_SRC = 0x100 + RTA_SRCMASK = 0x200 + RTA_STATIC = 0x2000 + RTF_ANNOUNCE = 0x4000 + RTF_BFD = 0x1000000 + RTF_BLACKHOLE = 0x1000 + RTF_BROADCAST = 0x400000 + RTF_CACHED = 0x20000 + RTF_CLONED = 0x10000 + RTF_CLONING = 0x100 + RTF_CONNECTED = 0x800000 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_FMASK = 0x110fc08 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_LLINFO = 0x400 + RTF_LOCAL = 0x200000 + RTF_MODIFIED = 0x20 + RTF_MPATH = 0x40000 + RTF_MPLS = 0x100000 + RTF_MULTICAST = 0x200 + RTF_PERMANENT_ARP = 0x2000 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_PROTO3 = 0x2000 + RTF_REJECT = 0x8 + RTF_STATIC = 0x800 + RTF_UP = 0x1 + RTF_USETRAILERS = 0x8000 + RTM_80211INFO = 0x15 + RTM_ADD = 0x1 + RTM_BFD = 0x12 + RTM_CHANGE = 0x3 + RTM_CHGADDRATTR = 0x14 + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_DESYNC = 0x10 + RTM_GET = 0x4 + RTM_IFANNOUNCE = 0xf + RTM_IFINFO = 0xe + RTM_INVALIDATE = 0x11 + RTM_LOSING = 0x5 + RTM_MAXSIZE = 0x800 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_PROPOSAL = 0x13 + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_RTTUNIT = 0xf4240 + RTM_VERSION = 0x5 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RT_TABLEID_BITS = 0x8 + RT_TABLEID_MASK = 0xff + RT_TABLEID_MAX = 0xff + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x4 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDMULTI = 0x80206931 + SIOCAIFADDR = 0x8040691a + SIOCAIFGROUP = 0x80286987 + SIOCATMARK = 0x40047307 + SIOCBRDGADD = 0x8060693c + SIOCBRDGADDL = 0x80606949 + SIOCBRDGADDS = 0x80606941 + SIOCBRDGARL = 0x808c694d + SIOCBRDGDADDR = 0x81286947 + SIOCBRDGDEL = 0x8060693d + SIOCBRDGDELS = 0x80606942 + SIOCBRDGFLUSH = 0x80606948 + SIOCBRDGFRL = 0x808c694e + SIOCBRDGGCACHE = 0xc0186941 + SIOCBRDGGFD = 0xc0186952 + SIOCBRDGGHT = 0xc0186951 + SIOCBRDGGIFFLGS = 0xc060693e + SIOCBRDGGMA = 0xc0186953 + SIOCBRDGGPARAM = 0xc0406958 + SIOCBRDGGPRI = 0xc0186950 + SIOCBRDGGRL = 0xc030694f + SIOCBRDGGTO = 0xc0186946 + SIOCBRDGIFS = 0xc0606942 + SIOCBRDGRTS = 0xc0206943 + SIOCBRDGSADDR = 0xc1286944 + SIOCBRDGSCACHE = 0x80186940 + SIOCBRDGSFD = 0x80186952 + SIOCBRDGSHT = 0x80186951 + SIOCBRDGSIFCOST = 0x80606955 + SIOCBRDGSIFFLGS = 0x8060693f + SIOCBRDGSIFPRIO = 0x80606954 + SIOCBRDGSIFPROT = 0x8060694a + SIOCBRDGSMA = 0x80186953 + SIOCBRDGSPRI = 0x80186950 + SIOCBRDGSPROTO = 0x8018695a + SIOCBRDGSTO = 0x80186945 + SIOCBRDGSTXHC = 0x80186959 + SIOCDELLABEL = 0x80206997 + SIOCDELMULTI = 0x80206932 + SIOCDIFADDR = 0x80206919 + SIOCDIFGROUP = 0x80286989 + SIOCDIFPARENT = 0x802069b4 + SIOCDIFPHYADDR = 0x80206949 + SIOCDPWE3NEIGHBOR = 0x802069de + SIOCDVNETID = 0x802069af + SIOCGETKALIVE = 0xc01869a4 + SIOCGETLABEL = 0x8020699a + SIOCGETMPWCFG = 0xc02069ae + SIOCGETPFLOW = 0xc02069fe + SIOCGETPFSYNC = 0xc02069f8 + SIOCGETSGCNT = 0xc0207534 + SIOCGETVIFCNT = 0xc0287533 + SIOCGETVLAN = 0xc0206990 + SIOCGIFADDR = 0xc0206921 + SIOCGIFBRDADDR = 0xc0206923 + SIOCGIFCONF = 0xc0106924 + SIOCGIFDATA = 0xc020691b + SIOCGIFDESCR = 0xc0206981 + SIOCGIFDSTADDR = 0xc0206922 + SIOCGIFFLAGS = 0xc0206911 + SIOCGIFGATTR = 0xc028698b + SIOCGIFGENERIC = 0xc020693a + SIOCGIFGLIST = 0xc028698d + SIOCGIFGMEMB = 0xc028698a + SIOCGIFGROUP = 0xc0286988 + SIOCGIFHARDMTU = 0xc02069a5 + SIOCGIFLLPRIO = 0xc02069b6 + SIOCGIFMEDIA = 0xc0406938 + SIOCGIFMETRIC = 0xc0206917 + SIOCGIFMTU = 0xc020697e + SIOCGIFNETMASK = 0xc0206925 + SIOCGIFPAIR = 0xc02069b1 + SIOCGIFPARENT = 0xc02069b3 + SIOCGIFPRIORITY = 0xc020699c + SIOCGIFRDOMAIN = 0xc02069a0 + SIOCGIFRTLABEL = 0xc0206983 + SIOCGIFRXR = 0x802069aa + SIOCGIFSFFPAGE = 0xc1126939 + SIOCGIFXFLAGS = 0xc020699e + SIOCGLIFPHYADDR = 0xc218694b + SIOCGLIFPHYDF = 0xc02069c2 + SIOCGLIFPHYECN = 0xc02069c8 + SIOCGLIFPHYRTABLE = 0xc02069a2 + SIOCGLIFPHYTTL = 0xc02069a9 + SIOCGPGRP = 0x40047309 + SIOCGPWE3 = 0xc0206998 + SIOCGPWE3CTRLWORD = 0xc02069dc + SIOCGPWE3FAT = 0xc02069dd + SIOCGPWE3NEIGHBOR = 0xc21869de + SIOCGSPPPPARAMS = 0xc0206994 + SIOCGTXHPRIO = 0xc02069c6 + SIOCGUMBINFO = 0xc02069be + SIOCGUMBPARAM = 0xc02069c0 + SIOCGVH = 0xc02069f6 + SIOCGVNETFLOWID = 0xc02069c4 + SIOCGVNETID = 0xc02069a7 + SIOCIFAFATTACH = 0x801169ab + SIOCIFAFDETACH = 0x801169ac + SIOCIFCREATE = 0x8020697a + SIOCIFDESTROY = 0x80206979 + SIOCIFGCLONERS = 0xc0106978 + SIOCSETKALIVE = 0x801869a3 + SIOCSETLABEL = 0x80206999 + SIOCSETMPWCFG = 0x802069ad + SIOCSETPFLOW = 0x802069fd + SIOCSETPFSYNC = 0x802069f7 + SIOCSETVLAN = 0x8020698f + SIOCSIFADDR = 0x8020690c + SIOCSIFBRDADDR = 0x80206913 + SIOCSIFDESCR = 0x80206980 + SIOCSIFDSTADDR = 0x8020690e + SIOCSIFFLAGS = 0x80206910 + SIOCSIFGATTR = 0x8028698c + SIOCSIFGENERIC = 0x80206939 + SIOCSIFLLADDR = 0x8020691f + SIOCSIFLLPRIO = 0x802069b5 + SIOCSIFMEDIA = 0xc0206937 + SIOCSIFMETRIC = 0x80206918 + SIOCSIFMTU = 0x8020697f + SIOCSIFNETMASK = 0x80206916 + SIOCSIFPAIR = 0x802069b0 + SIOCSIFPARENT = 0x802069b2 + SIOCSIFPRIORITY = 0x8020699b + SIOCSIFRDOMAIN = 0x8020699f + SIOCSIFRTLABEL = 0x80206982 + SIOCSIFXFLAGS = 0x8020699d + SIOCSLIFPHYADDR = 0x8218694a + SIOCSLIFPHYDF = 0x802069c1 + SIOCSLIFPHYECN = 0x802069c7 + SIOCSLIFPHYRTABLE = 0x802069a1 + SIOCSLIFPHYTTL = 0x802069a8 + SIOCSPGRP = 0x80047308 + SIOCSPWE3CTRLWORD = 0x802069dc + SIOCSPWE3FAT = 0x802069dd + SIOCSPWE3NEIGHBOR = 0x821869de + SIOCSSPPPPARAMS = 0x80206993 + SIOCSTXHPRIO = 0x802069c5 + SIOCSUMBPARAM = 0x802069bf + SIOCSVH = 0xc02069f5 + SIOCSVNETFLOWID = 0x802069c3 + SIOCSVNETID = 0x802069a6 + SIOCSWGDPID = 0xc018695b + SIOCSWGMAXFLOW = 0xc0186960 + SIOCSWGMAXGROUP = 0xc018695d + SIOCSWSDPID = 0x8018695c + SIOCSWSPORTNO = 0xc060695f + SOCK_CLOEXEC = 0x8000 + SOCK_DGRAM = 0x2 + SOCK_DNS = 0x1000 + SOCK_NONBLOCK = 0x4000 + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_BINDANY = 0x1000 + SO_BROADCAST = 0x20 + SO_DEBUG = 0x1 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_KEEPALIVE = 0x8 + SO_LINGER = 0x80 + SO_NETPROC = 0x1020 + SO_OOBINLINE = 0x100 + SO_PEERCRED = 0x1022 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_RTABLE = 0x1021 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_SPLICE = 0x1023 + SO_TIMESTAMP = 0x800 + SO_TYPE = 0x1008 + SO_USELOOPBACK = 0x40 + SO_ZEROIZE = 0x2000 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISTXT = 0x200 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TCIFLUSH = 0x1 + TCIOFF = 0x3 + TCIOFLUSH = 0x3 + TCION = 0x4 + TCOFLUSH = 0x2 + TCOOFF = 0x1 + TCOON = 0x2 + TCP_MAXBURST = 0x4 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_SACK = 0x3 + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0x4 + TCP_MSS = 0x200 + TCP_NODELAY = 0x1 + TCP_NOPUSH = 0x10 + TCP_SACK_ENABLE = 0x8 + TCSAFLUSH = 0x2 + TIMER_ABSTIME = 0x1 + TIMER_RELTIME = 0x0 + TIOCCBRK = 0x2000747a + TIOCCDTR = 0x20007478 + TIOCCHKVERAUTH = 0x2000741e + TIOCCLRVERAUTH = 0x2000741d + TIOCCONS = 0x80047462 + TIOCDRAIN = 0x2000745e + TIOCEXCL = 0x2000740d + TIOCEXT = 0x80047460 + TIOCFLAG_CLOCAL = 0x2 + TIOCFLAG_CRTSCTS = 0x4 + TIOCFLAG_MDMBUF = 0x8 + TIOCFLAG_PPS = 0x10 + TIOCFLAG_SOFTCAR = 0x1 + TIOCFLUSH = 0x80047410 + TIOCGETA = 0x402c7413 + TIOCGETD = 0x4004741a + TIOCGFLAGS = 0x4004745d + TIOCGPGRP = 0x40047477 + TIOCGSID = 0x40047463 + TIOCGTSTAMP = 0x4010745b + TIOCGWINSZ = 0x40087468 + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGET = 0x4004746a + TIOCMODG = 0x4004746a + TIOCMODS = 0x8004746d + TIOCMSET = 0x8004746d + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x20007471 + TIOCNXCL = 0x2000740e + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x80047470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCREMOTE = 0x80047469 + TIOCSBRK = 0x2000747b + TIOCSCTTY = 0x20007461 + TIOCSDTR = 0x20007479 + TIOCSETA = 0x802c7414 + TIOCSETAF = 0x802c7416 + TIOCSETAW = 0x802c7415 + TIOCSETD = 0x8004741b + TIOCSETVERAUTH = 0x8004741c + TIOCSFLAGS = 0x8004745c + TIOCSIG = 0x8004745f + TIOCSPGRP = 0x80047476 + TIOCSTART = 0x2000746e + TIOCSTAT = 0x20007465 + TIOCSTOP = 0x2000746f + TIOCSTSTAMP = 0x8008745a + TIOCSWINSZ = 0x80087467 + TIOCUCNTL = 0x80047466 + TIOCUCNTL_CBRK = 0x7a + TIOCUCNTL_SBRK = 0x7b + TOSTOP = 0x400000 + UTIME_NOW = -0x2 + UTIME_OMIT = -0x1 + VDISCARD = 0xf + VDSUSP = 0xb + VEOF = 0x0 + VEOL = 0x1 + VEOL2 = 0x2 + VERASE = 0x3 + VINTR = 0x8 + VKILL = 0x5 + VLNEXT = 0xe + VMIN = 0x10 + VM_ANONMIN = 0x7 + VM_LOADAVG = 0x2 + VM_MALLOC_CONF = 0xc + VM_MAXID = 0xd + VM_MAXSLP = 0xa + VM_METER = 0x1 + VM_NKMEMPAGES = 0x6 + VM_PSSTRINGS = 0x3 + VM_SWAPENCRYPT = 0x5 + VM_USPACE = 0xb + VM_UVMEXP = 0x4 + VM_VNODEMIN = 0x9 + VM_VTEXTMIN = 0x8 + VQUIT = 0x9 + VREPRINT = 0x6 + VSTART = 0xc + VSTATUS = 0x12 + VSTOP = 0xd + VSUSP = 0xa + VTIME = 0x11 + VWERASE = 0x4 + WALTSIG = 0x4 + WCONTINUED = 0x8 + WCOREFLAG = 0x80 + WNOHANG = 0x1 + WUNTRACED = 0x2 + XCASE = 0x1000000 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x30) + EADDRNOTAVAIL = syscall.Errno(0x31) + EAFNOSUPPORT = syscall.Errno(0x2f) + EAGAIN = syscall.Errno(0x23) + EALREADY = syscall.Errno(0x25) + EAUTH = syscall.Errno(0x50) + EBADF = syscall.Errno(0x9) + EBADMSG = syscall.Errno(0x5c) + EBADRPC = syscall.Errno(0x48) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x58) + ECHILD = syscall.Errno(0xa) + ECONNABORTED = syscall.Errno(0x35) + ECONNREFUSED = syscall.Errno(0x3d) + ECONNRESET = syscall.Errno(0x36) + EDEADLK = syscall.Errno(0xb) + EDESTADDRREQ = syscall.Errno(0x27) + EDOM = syscall.Errno(0x21) + EDQUOT = syscall.Errno(0x45) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EFTYPE = syscall.Errno(0x4f) + EHOSTDOWN = syscall.Errno(0x40) + EHOSTUNREACH = syscall.Errno(0x41) + EIDRM = syscall.Errno(0x59) + EILSEQ = syscall.Errno(0x54) + EINPROGRESS = syscall.Errno(0x24) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EIPSEC = syscall.Errno(0x52) + EISCONN = syscall.Errno(0x38) + EISDIR = syscall.Errno(0x15) + ELAST = syscall.Errno(0x5f) + ELOOP = syscall.Errno(0x3e) + EMEDIUMTYPE = syscall.Errno(0x56) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x28) + ENAMETOOLONG = syscall.Errno(0x3f) + ENEEDAUTH = syscall.Errno(0x51) + ENETDOWN = syscall.Errno(0x32) + ENETRESET = syscall.Errno(0x34) + ENETUNREACH = syscall.Errno(0x33) + ENFILE = syscall.Errno(0x17) + ENOATTR = syscall.Errno(0x53) + ENOBUFS = syscall.Errno(0x37) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOLCK = syscall.Errno(0x4d) + ENOMEDIUM = syscall.Errno(0x55) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x5a) + ENOPROTOOPT = syscall.Errno(0x2a) + ENOSPC = syscall.Errno(0x1c) + ENOSYS = syscall.Errno(0x4e) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x39) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x42) + ENOTRECOVERABLE = syscall.Errno(0x5d) + ENOTSOCK = syscall.Errno(0x26) + ENOTSUP = syscall.Errno(0x5b) + ENOTTY = syscall.Errno(0x19) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x2d) + EOVERFLOW = syscall.Errno(0x57) + EOWNERDEAD = syscall.Errno(0x5e) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x2e) + EPIPE = syscall.Errno(0x20) + EPROCLIM = syscall.Errno(0x43) + EPROCUNAVAIL = syscall.Errno(0x4c) + EPROGMISMATCH = syscall.Errno(0x4b) + EPROGUNAVAIL = syscall.Errno(0x4a) + EPROTO = syscall.Errno(0x5f) + EPROTONOSUPPORT = syscall.Errno(0x2b) + EPROTOTYPE = syscall.Errno(0x29) + ERANGE = syscall.Errno(0x22) + EREMOTE = syscall.Errno(0x47) + EROFS = syscall.Errno(0x1e) + ERPCMISMATCH = syscall.Errno(0x49) + ESHUTDOWN = syscall.Errno(0x3a) + ESOCKTNOSUPPORT = syscall.Errno(0x2c) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESTALE = syscall.Errno(0x46) + ETIMEDOUT = syscall.Errno(0x3c) + ETOOMANYREFS = syscall.Errno(0x3b) + ETXTBSY = syscall.Errno(0x1a) + EUSERS = syscall.Errno(0x44) + EWOULDBLOCK = syscall.Errno(0x23) + EXDEV = syscall.Errno(0x12) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x14) + SIGCONT = syscall.Signal(0x13) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINFO = syscall.Signal(0x1d) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x17) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPROF = syscall.Signal(0x1b) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x11) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTHR = syscall.Signal(0x20) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x12) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x10) + SIGUSR1 = syscall.Signal(0x1e) + SIGUSR2 = syscall.Signal(0x1f) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errorList = [...]struct { + num syscall.Errno + name string + desc string +}{ + {1, "EPERM", "operation not permitted"}, + {2, "ENOENT", "no such file or directory"}, + {3, "ESRCH", "no such process"}, + {4, "EINTR", "interrupted system call"}, + {5, "EIO", "input/output error"}, + {6, "ENXIO", "device not configured"}, + {7, "E2BIG", "argument list too long"}, + {8, "ENOEXEC", "exec format error"}, + {9, "EBADF", "bad file descriptor"}, + {10, "ECHILD", "no child processes"}, + {11, "EDEADLK", "resource deadlock avoided"}, + {12, "ENOMEM", "cannot allocate memory"}, + {13, "EACCES", "permission denied"}, + {14, "EFAULT", "bad address"}, + {15, "ENOTBLK", "block device required"}, + {16, "EBUSY", "device busy"}, + {17, "EEXIST", "file exists"}, + {18, "EXDEV", "cross-device link"}, + {19, "ENODEV", "operation not supported by device"}, + {20, "ENOTDIR", "not a directory"}, + {21, "EISDIR", "is a directory"}, + {22, "EINVAL", "invalid argument"}, + {23, "ENFILE", "too many open files in system"}, + {24, "EMFILE", "too many open files"}, + {25, "ENOTTY", "inappropriate ioctl for device"}, + {26, "ETXTBSY", "text file busy"}, + {27, "EFBIG", "file too large"}, + {28, "ENOSPC", "no space left on device"}, + {29, "ESPIPE", "illegal seek"}, + {30, "EROFS", "read-only file system"}, + {31, "EMLINK", "too many links"}, + {32, "EPIPE", "broken pipe"}, + {33, "EDOM", "numerical argument out of domain"}, + {34, "ERANGE", "result too large"}, + {35, "EAGAIN", "resource temporarily unavailable"}, + {36, "EINPROGRESS", "operation now in progress"}, + {37, "EALREADY", "operation already in progress"}, + {38, "ENOTSOCK", "socket operation on non-socket"}, + {39, "EDESTADDRREQ", "destination address required"}, + {40, "EMSGSIZE", "message too long"}, + {41, "EPROTOTYPE", "protocol wrong type for socket"}, + {42, "ENOPROTOOPT", "protocol not available"}, + {43, "EPROTONOSUPPORT", "protocol not supported"}, + {44, "ESOCKTNOSUPPORT", "socket type not supported"}, + {45, "EOPNOTSUPP", "operation not supported"}, + {46, "EPFNOSUPPORT", "protocol family not supported"}, + {47, "EAFNOSUPPORT", "address family not supported by protocol family"}, + {48, "EADDRINUSE", "address already in use"}, + {49, "EADDRNOTAVAIL", "can't assign requested address"}, + {50, "ENETDOWN", "network is down"}, + {51, "ENETUNREACH", "network is unreachable"}, + {52, "ENETRESET", "network dropped connection on reset"}, + {53, "ECONNABORTED", "software caused connection abort"}, + {54, "ECONNRESET", "connection reset by peer"}, + {55, "ENOBUFS", "no buffer space available"}, + {56, "EISCONN", "socket is already connected"}, + {57, "ENOTCONN", "socket is not connected"}, + {58, "ESHUTDOWN", "can't send after socket shutdown"}, + {59, "ETOOMANYREFS", "too many references: can't splice"}, + {60, "ETIMEDOUT", "operation timed out"}, + {61, "ECONNREFUSED", "connection refused"}, + {62, "ELOOP", "too many levels of symbolic links"}, + {63, "ENAMETOOLONG", "file name too long"}, + {64, "EHOSTDOWN", "host is down"}, + {65, "EHOSTUNREACH", "no route to host"}, + {66, "ENOTEMPTY", "directory not empty"}, + {67, "EPROCLIM", "too many processes"}, + {68, "EUSERS", "too many users"}, + {69, "EDQUOT", "disk quota exceeded"}, + {70, "ESTALE", "stale NFS file handle"}, + {71, "EREMOTE", "too many levels of remote in path"}, + {72, "EBADRPC", "RPC struct is bad"}, + {73, "ERPCMISMATCH", "RPC version wrong"}, + {74, "EPROGUNAVAIL", "RPC program not available"}, + {75, "EPROGMISMATCH", "program version wrong"}, + {76, "EPROCUNAVAIL", "bad procedure for program"}, + {77, "ENOLCK", "no locks available"}, + {78, "ENOSYS", "function not implemented"}, + {79, "EFTYPE", "inappropriate file type or format"}, + {80, "EAUTH", "authentication error"}, + {81, "ENEEDAUTH", "need authenticator"}, + {82, "EIPSEC", "IPsec processing failure"}, + {83, "ENOATTR", "attribute not found"}, + {84, "EILSEQ", "illegal byte sequence"}, + {85, "ENOMEDIUM", "no medium found"}, + {86, "EMEDIUMTYPE", "wrong medium type"}, + {87, "EOVERFLOW", "value too large to be stored in data type"}, + {88, "ECANCELED", "operation canceled"}, + {89, "EIDRM", "identifier removed"}, + {90, "ENOMSG", "no message of desired type"}, + {91, "ENOTSUP", "not supported"}, + {92, "EBADMSG", "bad message"}, + {93, "ENOTRECOVERABLE", "state not recoverable"}, + {94, "EOWNERDEAD", "previous owner died"}, + {95, "ELAST", "protocol error"}, +} + +// Signal table +var signalList = [...]struct { + num syscall.Signal + name string + desc string +}{ + {1, "SIGHUP", "hangup"}, + {2, "SIGINT", "interrupt"}, + {3, "SIGQUIT", "quit"}, + {4, "SIGILL", "illegal instruction"}, + {5, "SIGTRAP", "trace/BPT trap"}, + {6, "SIGABRT", "abort trap"}, + {7, "SIGEMT", "EMT trap"}, + {8, "SIGFPE", "floating point exception"}, + {9, "SIGKILL", "killed"}, + {10, "SIGBUS", "bus error"}, + {11, "SIGSEGV", "segmentation fault"}, + {12, "SIGSYS", "bad system call"}, + {13, "SIGPIPE", "broken pipe"}, + {14, "SIGALRM", "alarm clock"}, + {15, "SIGTERM", "terminated"}, + {16, "SIGURG", "urgent I/O condition"}, + {17, "SIGSTOP", "suspended (signal)"}, + {18, "SIGTSTP", "suspended"}, + {19, "SIGCONT", "continued"}, + {20, "SIGCHLD", "child exited"}, + {21, "SIGTTIN", "stopped (tty input)"}, + {22, "SIGTTOU", "stopped (tty output)"}, + {23, "SIGIO", "I/O possible"}, + {24, "SIGXCPU", "cputime limit exceeded"}, + {25, "SIGXFSZ", "filesize limit exceeded"}, + {26, "SIGVTALRM", "virtual timer expired"}, + {27, "SIGPROF", "profiling timer expired"}, + {28, "SIGWINCH", "window size changes"}, + {29, "SIGINFO", "information request"}, + {30, "SIGUSR1", "user defined signal 1"}, + {31, "SIGUSR2", "user defined signal 2"}, + {32, "SIGTHR", "thread AST"}, +} diff --git a/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc.go b/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc.go index 4a9e99a0..ed657ff1 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc.go @@ -859,7 +859,7 @@ func Fchown(fd int, uid int, gid int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Fstat(fd int, stat *Stat_t) (err error) { +func fstat(fd int, stat *Stat_t) (err error) { r0, er := C.fstat(C.int(fd), C.uintptr_t(uintptr(unsafe.Pointer(stat)))) if r0 == -1 && er != nil { err = er @@ -869,7 +869,7 @@ func Fstat(fd int, stat *Stat_t) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) { +func fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) { _p0 := uintptr(unsafe.Pointer(C.CString(path))) r0, er := C.fstatat(C.int(dirfd), C.uintptr_t(_p0), C.uintptr_t(uintptr(unsafe.Pointer(stat))), C.int(flags)) if r0 == -1 && er != nil { @@ -953,7 +953,7 @@ func Listen(s int, n int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Lstat(path string, stat *Stat_t) (err error) { +func lstat(path string, stat *Stat_t) (err error) { _p0 := uintptr(unsafe.Pointer(C.CString(path))) r0, er := C.lstat(C.uintptr_t(_p0), C.uintptr_t(uintptr(unsafe.Pointer(stat)))) if r0 == -1 && er != nil { @@ -1071,9 +1071,9 @@ func Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n i // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Stat(path string, stat *Stat_t) (err error) { +func stat(path string, statptr *Stat_t) (err error) { _p0 := uintptr(unsafe.Pointer(C.CString(path))) - r0, er := C.stat(C.uintptr_t(_p0), C.uintptr_t(uintptr(unsafe.Pointer(stat)))) + r0, er := C.stat(C.uintptr_t(_p0), C.uintptr_t(uintptr(unsafe.Pointer(statptr)))) if r0 == -1 && er != nil { err = er } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64.go b/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64.go index c3371ddc..664b293b 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64.go @@ -803,7 +803,7 @@ func Fchown(fd int, uid int, gid int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Fstat(fd int, stat *Stat_t) (err error) { +func fstat(fd int, stat *Stat_t) (err error) { _, e1 := callfstat(fd, uintptr(unsafe.Pointer(stat))) if e1 != 0 { err = errnoErr(e1) @@ -813,7 +813,7 @@ func Fstat(fd int, stat *Stat_t) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) { +func fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { @@ -905,7 +905,7 @@ func Listen(s int, n int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Lstat(path string, stat *Stat_t) (err error) { +func lstat(path string, stat *Stat_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { @@ -1023,13 +1023,13 @@ func Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n i // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Stat(path string, stat *Stat_t) (err error) { +func stat(path string, statptr *Stat_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } - _, e1 := callstat(uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat))) + _, e1 := callstat(uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(statptr))) if e1 != 0 { err = errnoErr(e1) } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gc.go b/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gc.go index 4eda7232..4b3a8ad7 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gc.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gc.go @@ -941,8 +941,8 @@ func callsplice(rfd int, roff uintptr, wfd int, woff uintptr, len int, flags int // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func callstat(_p0 uintptr, stat uintptr) (r1 uintptr, e1 Errno) { - r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_stat)), 2, _p0, stat, 0, 0, 0, 0) +func callstat(_p0 uintptr, statptr uintptr) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_stat)), 2, _p0, statptr, 0, 0, 0, 0) return } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gccgo.go b/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gccgo.go index e5c4cbdd..cde4dbc5 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gccgo.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gccgo.go @@ -783,8 +783,8 @@ func callsplice(rfd int, roff uintptr, wfd int, woff uintptr, len int, flags int // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func callstat(_p0 uintptr, stat uintptr) (r1 uintptr, e1 Errno) { - r1 = uintptr(C.stat(C.uintptr_t(_p0), C.uintptr_t(stat))) +func callstat(_p0 uintptr, statptr uintptr) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.stat(C.uintptr_t(_p0), C.uintptr_t(statptr))) e1 = syscall.GetErrno() return } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go index 80903e47..2707c013 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go @@ -1019,7 +1019,7 @@ func getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func getdirentries_freebsd12(fd int, buf []byte, basep *uintptr) (n int, err error) { +func getdirentries_freebsd12(fd int, buf []byte, basep *uint64) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go index cd250ff0..8e3c0cea 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go @@ -1019,7 +1019,7 @@ func getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func getdirentries_freebsd12(fd int, buf []byte, basep *uintptr) (n int, err error) { +func getdirentries_freebsd12(fd int, buf []byte, basep *uint64) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go index 290a9c2c..641f86a0 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go @@ -1019,7 +1019,7 @@ func getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func getdirentries_freebsd12(fd int, buf []byte, basep *uintptr) (n int, err error) { +func getdirentries_freebsd12(fd int, buf []byte, basep *uint64) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm64.go b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm64.go index c6df9d2e..68fbccf7 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm64.go @@ -1019,7 +1019,7 @@ func getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func getdirentries_freebsd12(fd int, buf []byte, basep *uintptr) (n int, err error) { +func getdirentries_freebsd12(fd int, buf []byte, basep *uint64) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go index feb3c039..81d90a27 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go @@ -1381,8 +1381,12 @@ func Setxattr(path string, attr string, data []byte, flags int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Signalfd(fd int, mask *Sigset_t, flags int) { - SyscallNoError(SYS_SIGNALFD4, uintptr(fd), uintptr(unsafe.Pointer(mask)), uintptr(flags)) +func signalfd(fd int, sigmask *Sigset_t, maskSize uintptr, flags int) (newfd int, err error) { + r0, _, e1 := Syscall6(SYS_SIGNALFD4, uintptr(fd), uintptr(unsafe.Pointer(sigmask)), uintptr(maskSize), uintptr(flags), 0, 0) + newfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } return } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go index fa0cb252..0c184586 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go @@ -1381,8 +1381,12 @@ func Setxattr(path string, attr string, data []byte, flags int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Signalfd(fd int, mask *Sigset_t, flags int) { - SyscallNoError(SYS_SIGNALFD4, uintptr(fd), uintptr(unsafe.Pointer(mask)), uintptr(flags)) +func signalfd(fd int, sigmask *Sigset_t, maskSize uintptr, flags int) (newfd int, err error) { + r0, _, e1 := Syscall6(SYS_SIGNALFD4, uintptr(fd), uintptr(unsafe.Pointer(sigmask)), uintptr(maskSize), uintptr(flags), 0, 0) + newfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } return } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go index daec1d5d..18ef8a62 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go @@ -1381,8 +1381,12 @@ func Setxattr(path string, attr string, data []byte, flags int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Signalfd(fd int, mask *Sigset_t, flags int) { - SyscallNoError(SYS_SIGNALFD4, uintptr(fd), uintptr(unsafe.Pointer(mask)), uintptr(flags)) +func signalfd(fd int, sigmask *Sigset_t, maskSize uintptr, flags int) (newfd int, err error) { + r0, _, e1 := Syscall6(SYS_SIGNALFD4, uintptr(fd), uintptr(unsafe.Pointer(sigmask)), uintptr(maskSize), uintptr(flags), 0, 0) + newfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } return } @@ -2366,3 +2370,18 @@ func armSyncFileRange(fd int, flags int, off int64, n int64) (err error) { } return } + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kexecFileLoad(kernelFd int, initrdFd int, cmdlineLen int, cmdline string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(cmdline) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_KEXEC_FILE_LOAD, uintptr(kernelFd), uintptr(initrdFd), uintptr(cmdlineLen), uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go index ad9820b5..2fba25d0 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go @@ -1381,8 +1381,12 @@ func Setxattr(path string, attr string, data []byte, flags int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Signalfd(fd int, mask *Sigset_t, flags int) { - SyscallNoError(SYS_SIGNALFD4, uintptr(fd), uintptr(unsafe.Pointer(mask)), uintptr(flags)) +func signalfd(fd int, sigmask *Sigset_t, maskSize uintptr, flags int) (newfd int, err error) { + r0, _, e1 := Syscall6(SYS_SIGNALFD4, uintptr(fd), uintptr(unsafe.Pointer(sigmask)), uintptr(maskSize), uintptr(flags), 0, 0) + newfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } return } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go index c82ce7d2..c330f4ff 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go @@ -1381,8 +1381,12 @@ func Setxattr(path string, attr string, data []byte, flags int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Signalfd(fd int, mask *Sigset_t, flags int) { - SyscallNoError(SYS_SIGNALFD4, uintptr(fd), uintptr(unsafe.Pointer(mask)), uintptr(flags)) +func signalfd(fd int, sigmask *Sigset_t, maskSize uintptr, flags int) (newfd int, err error) { + r0, _, e1 := Syscall6(SYS_SIGNALFD4, uintptr(fd), uintptr(unsafe.Pointer(sigmask)), uintptr(maskSize), uintptr(flags), 0, 0) + newfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } return } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go index d1b77c19..8e9e0098 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go @@ -1381,8 +1381,12 @@ func Setxattr(path string, attr string, data []byte, flags int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Signalfd(fd int, mask *Sigset_t, flags int) { - SyscallNoError(SYS_SIGNALFD4, uintptr(fd), uintptr(unsafe.Pointer(mask)), uintptr(flags)) +func signalfd(fd int, sigmask *Sigset_t, maskSize uintptr, flags int) (newfd int, err error) { + r0, _, e1 := Syscall6(SYS_SIGNALFD4, uintptr(fd), uintptr(unsafe.Pointer(sigmask)), uintptr(maskSize), uintptr(flags), 0, 0) + newfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } return } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go index b8e45f98..c22d6260 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go @@ -1381,8 +1381,12 @@ func Setxattr(path string, attr string, data []byte, flags int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Signalfd(fd int, mask *Sigset_t, flags int) { - SyscallNoError(SYS_SIGNALFD4, uintptr(fd), uintptr(unsafe.Pointer(mask)), uintptr(flags)) +func signalfd(fd int, sigmask *Sigset_t, maskSize uintptr, flags int) (newfd int, err error) { + r0, _, e1 := Syscall6(SYS_SIGNALFD4, uintptr(fd), uintptr(unsafe.Pointer(sigmask)), uintptr(maskSize), uintptr(flags), 0, 0) + newfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } return } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go index e26c748d..700a99e9 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go @@ -1381,8 +1381,12 @@ func Setxattr(path string, attr string, data []byte, flags int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Signalfd(fd int, mask *Sigset_t, flags int) { - SyscallNoError(SYS_SIGNALFD4, uintptr(fd), uintptr(unsafe.Pointer(mask)), uintptr(flags)) +func signalfd(fd int, sigmask *Sigset_t, maskSize uintptr, flags int) (newfd int, err error) { + r0, _, e1 := Syscall6(SYS_SIGNALFD4, uintptr(fd), uintptr(unsafe.Pointer(sigmask)), uintptr(maskSize), uintptr(flags), 0, 0) + newfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } return } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go index 0a958ca0..cec4c106 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go @@ -1381,8 +1381,12 @@ func Setxattr(path string, attr string, data []byte, flags int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Signalfd(fd int, mask *Sigset_t, flags int) { - SyscallNoError(SYS_SIGNALFD4, uintptr(fd), uintptr(unsafe.Pointer(mask)), uintptr(flags)) +func signalfd(fd int, sigmask *Sigset_t, maskSize uintptr, flags int) (newfd int, err error) { + r0, _, e1 := Syscall6(SYS_SIGNALFD4, uintptr(fd), uintptr(unsafe.Pointer(sigmask)), uintptr(maskSize), uintptr(flags), 0, 0) + newfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } return } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go index 658f361e..677ef5a6 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go @@ -1381,8 +1381,12 @@ func Setxattr(path string, attr string, data []byte, flags int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Signalfd(fd int, mask *Sigset_t, flags int) { - SyscallNoError(SYS_SIGNALFD4, uintptr(fd), uintptr(unsafe.Pointer(mask)), uintptr(flags)) +func signalfd(fd int, sigmask *Sigset_t, maskSize uintptr, flags int) (newfd int, err error) { + r0, _, e1 := Syscall6(SYS_SIGNALFD4, uintptr(fd), uintptr(unsafe.Pointer(sigmask)), uintptr(maskSize), uintptr(flags), 0, 0) + newfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } return } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go index daff3003..565034c5 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go @@ -1381,8 +1381,12 @@ func Setxattr(path string, attr string, data []byte, flags int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Signalfd(fd int, mask *Sigset_t, flags int) { - SyscallNoError(SYS_SIGNALFD4, uintptr(fd), uintptr(unsafe.Pointer(mask)), uintptr(flags)) +func signalfd(fd int, sigmask *Sigset_t, maskSize uintptr, flags int) (newfd int, err error) { + r0, _, e1 := Syscall6(SYS_SIGNALFD4, uintptr(fd), uintptr(unsafe.Pointer(sigmask)), uintptr(maskSize), uintptr(flags), 0, 0) + newfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } return } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go index caf6ea86..7feb2c6b 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go @@ -1381,8 +1381,12 @@ func Setxattr(path string, attr string, data []byte, flags int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Signalfd(fd int, mask *Sigset_t, flags int) { - SyscallNoError(SYS_SIGNALFD4, uintptr(fd), uintptr(unsafe.Pointer(mask)), uintptr(flags)) +func signalfd(fd int, sigmask *Sigset_t, maskSize uintptr, flags int) (newfd int, err error) { + r0, _, e1 := Syscall6(SYS_SIGNALFD4, uintptr(fd), uintptr(unsafe.Pointer(sigmask)), uintptr(maskSize), uintptr(flags), 0, 0) + newfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } return } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go index 369a04b5..07655c45 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go @@ -1381,8 +1381,12 @@ func Setxattr(path string, attr string, data []byte, flags int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Signalfd(fd int, mask *Sigset_t, flags int) { - SyscallNoError(SYS_SIGNALFD4, uintptr(fd), uintptr(unsafe.Pointer(mask)), uintptr(flags)) +func signalfd(fd int, sigmask *Sigset_t, maskSize uintptr, flags int) (newfd int, err error) { + r0, _, e1 := Syscall6(SYS_SIGNALFD4, uintptr(fd), uintptr(unsafe.Pointer(sigmask)), uintptr(maskSize), uintptr(flags), 0, 0) + newfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } return } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go index 642db767..7e058266 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go @@ -389,7 +389,7 @@ func pipe() (fd1 int, fd2 int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func getdents(fd int, buf []byte) (n int, err error) { +func Getdents(fd int, buf []byte) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go index 59585fee..d94d076a 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go @@ -389,7 +389,7 @@ func pipe() (fd1 int, fd2 int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func getdents(fd int, buf []byte) (n int, err error) { +func Getdents(fd int, buf []byte) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go index 6ec31434..cf5bf3d0 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go @@ -389,7 +389,7 @@ func pipe() (fd1 int, fd2 int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func getdents(fd int, buf []byte) (n int, err error) { +func Getdents(fd int, buf []byte) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go index 603d1443..243a9317 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go @@ -389,7 +389,7 @@ func pipe() (fd1 int, fd2 int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func getdents(fd int, buf []byte) (n int, err error) { +func Getdents(fd int, buf []byte) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go index 6a489fac..a9532d07 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go @@ -387,7 +387,7 @@ func pipe(p *[2]_C_int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func getdents(fd int, buf []byte) (n int, err error) { +func Getdents(fd int, buf []byte) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go index 30cba434..0cb9f017 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go @@ -387,7 +387,7 @@ func pipe(p *[2]_C_int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func getdents(fd int, buf []byte) (n int, err error) { +func Getdents(fd int, buf []byte) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go index fa1beda3..6fc99b54 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go @@ -387,7 +387,7 @@ func pipe(p *[2]_C_int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func getdents(fd int, buf []byte) (n int, err error) { +func Getdents(fd int, buf []byte) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.go new file mode 100644 index 00000000..27878a72 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.go @@ -0,0 +1,1692 @@ +// go run mksyscall.go -openbsd -tags openbsd,arm64 syscall_bsd.go syscall_openbsd.go syscall_openbsd_arm64.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build openbsd,arm64 + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(ngid int, gid *_Gid_t) (n int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(ngid int, gid *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { + r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(s int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { + r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { + var _p0 unsafe.Pointer + if len(mib) > 0 { + _p0 = unsafe.Pointer(&mib[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, timeval *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimes(fd int, timeval *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, behav int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe(p *[2]_C_int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdents(fd int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETDENTS, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getcwd(buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS___GETCWD, uintptr(_p0), uintptr(len(buf)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Access(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { + _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chflags(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chmod(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(fd int) (nfd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(from int, to int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchflags(fd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fpathconf(fd int, name int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FSTATAT, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatfs(fd int, stat *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), 0, uintptr(length)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgrp() (pgrp int) { + r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) + pgrp = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrtable() (rtable int, err error) { + r0, _, e1 := RawSyscall(SYS_GETRTABLE, 0, 0, 0) + rtable = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Issetugid() (tainted bool) { + r0, _, _ := Syscall(SYS_ISSETUGID, 0, 0, 0) + tainted = bool(r0 != 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, signum syscall.Signal) (err error) { + _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kqueue() (fd int, err error) { + r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Link(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Linkat(pathfd int, path string, linkfd int, link string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(pathfd), uintptr(unsafe.Pointer(_p0)), uintptr(linkfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, backlog int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdir(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkfifo(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkfifoat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKFIFOAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknod(path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Open(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Openat(dirfd int, path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pathconf(path string, name int) (val int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlink(path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rename(from string, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat(fromfd int, from string, tofd int, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(fromfd), uintptr(unsafe.Pointer(_p0)), uintptr(tofd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Revoke(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rmdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + r0, _, e1 := Syscall6(SYS_LSEEK, uintptr(fd), 0, uintptr(offset), uintptr(whence), 0, 0) + newoffset = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { + _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setegid(egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEGID, uintptr(egid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seteuid(euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setgid(gid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setlogin(name string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(name) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresgid(rgid int, egid int, sgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresuid(ruid int, euid int, suid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrtable(rtable int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRTABLE, uintptr(rtable), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tp *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setuid(uid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, stat *Statfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlink(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() (err error) { + _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(newmask int) (oldmask int) { + r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlink(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlinkat(dirfd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { + r0, _, e1 := Syscall9(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), 0, uintptr(pos), 0, 0) + ret = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/vendor/golang.org/x/sys/unix/zsysctl_openbsd_386.go b/vendor/golang.org/x/sys/unix/zsysctl_openbsd_386.go index b005031a..37dcc74c 100644 --- a/vendor/golang.org/x/sys/unix/zsysctl_openbsd_386.go +++ b/vendor/golang.org/x/sys/unix/zsysctl_openbsd_386.go @@ -1,6 +1,8 @@ // mksysctl_openbsd.pl // Code generated by the command above; DO NOT EDIT. +// +build 386,openbsd + package unix type mibentry struct { diff --git a/vendor/golang.org/x/sys/unix/zsysctl_openbsd_amd64.go b/vendor/golang.org/x/sys/unix/zsysctl_openbsd_amd64.go index d014451c..fe6caa6e 100644 --- a/vendor/golang.org/x/sys/unix/zsysctl_openbsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsysctl_openbsd_amd64.go @@ -1,4 +1,4 @@ -// mksysctl_openbsd.pl +// go run mksysctl_openbsd.go // Code generated by the command above; DO NOT EDIT. // +build amd64,openbsd diff --git a/vendor/golang.org/x/sys/unix/zsysctl_openbsd_arm.go b/vendor/golang.org/x/sys/unix/zsysctl_openbsd_arm.go index b005031a..6eb8c0b0 100644 --- a/vendor/golang.org/x/sys/unix/zsysctl_openbsd_arm.go +++ b/vendor/golang.org/x/sys/unix/zsysctl_openbsd_arm.go @@ -1,6 +1,8 @@ -// mksysctl_openbsd.pl +// go run mksysctl_openbsd.go // Code generated by the command above; DO NOT EDIT. +// +build arm,openbsd + package unix type mibentry struct { diff --git a/vendor/golang.org/x/sys/unix/zsysctl_openbsd_arm64.go b/vendor/golang.org/x/sys/unix/zsysctl_openbsd_arm64.go new file mode 100644 index 00000000..ba4304fd --- /dev/null +++ b/vendor/golang.org/x/sys/unix/zsysctl_openbsd_arm64.go @@ -0,0 +1,275 @@ +// go run mksysctl_openbsd.go +// Code generated by the command above; DO NOT EDIT. + +// +build arm64,openbsd + +package unix + +type mibentry struct { + ctlname string + ctloid []_C_int +} + +var sysctlMib = []mibentry{ + {"ddb.console", []_C_int{9, 6}}, + {"ddb.log", []_C_int{9, 7}}, + {"ddb.max_line", []_C_int{9, 3}}, + {"ddb.max_width", []_C_int{9, 2}}, + {"ddb.panic", []_C_int{9, 5}}, + {"ddb.profile", []_C_int{9, 9}}, + {"ddb.radix", []_C_int{9, 1}}, + {"ddb.tab_stop_width", []_C_int{9, 4}}, + {"ddb.trigger", []_C_int{9, 8}}, + {"fs.posix.setuid", []_C_int{3, 1, 1}}, + {"hw.allowpowerdown", []_C_int{6, 22}}, + {"hw.byteorder", []_C_int{6, 4}}, + {"hw.cpuspeed", []_C_int{6, 12}}, + {"hw.diskcount", []_C_int{6, 10}}, + {"hw.disknames", []_C_int{6, 8}}, + {"hw.diskstats", []_C_int{6, 9}}, + {"hw.machine", []_C_int{6, 1}}, + {"hw.model", []_C_int{6, 2}}, + {"hw.ncpu", []_C_int{6, 3}}, + {"hw.ncpufound", []_C_int{6, 21}}, + {"hw.ncpuonline", []_C_int{6, 25}}, + {"hw.pagesize", []_C_int{6, 7}}, + {"hw.perfpolicy", []_C_int{6, 23}}, + {"hw.physmem", []_C_int{6, 19}}, + {"hw.product", []_C_int{6, 15}}, + {"hw.serialno", []_C_int{6, 17}}, + {"hw.setperf", []_C_int{6, 13}}, + {"hw.smt", []_C_int{6, 24}}, + {"hw.usermem", []_C_int{6, 20}}, + {"hw.uuid", []_C_int{6, 18}}, + {"hw.vendor", []_C_int{6, 14}}, + {"hw.version", []_C_int{6, 16}}, + {"kern.allowkmem", []_C_int{1, 52}}, + {"kern.argmax", []_C_int{1, 8}}, + {"kern.audio", []_C_int{1, 84}}, + {"kern.boottime", []_C_int{1, 21}}, + {"kern.bufcachepercent", []_C_int{1, 72}}, + {"kern.ccpu", []_C_int{1, 45}}, + {"kern.clockrate", []_C_int{1, 12}}, + {"kern.consdev", []_C_int{1, 75}}, + {"kern.cp_time", []_C_int{1, 40}}, + {"kern.cp_time2", []_C_int{1, 71}}, + {"kern.cpustats", []_C_int{1, 85}}, + {"kern.domainname", []_C_int{1, 22}}, + {"kern.file", []_C_int{1, 73}}, + {"kern.forkstat", []_C_int{1, 42}}, + {"kern.fscale", []_C_int{1, 46}}, + {"kern.fsync", []_C_int{1, 33}}, + {"kern.global_ptrace", []_C_int{1, 81}}, + {"kern.hostid", []_C_int{1, 11}}, + {"kern.hostname", []_C_int{1, 10}}, + {"kern.intrcnt.nintrcnt", []_C_int{1, 63, 1}}, + {"kern.job_control", []_C_int{1, 19}}, + {"kern.malloc.buckets", []_C_int{1, 39, 1}}, + {"kern.malloc.kmemnames", []_C_int{1, 39, 3}}, + {"kern.maxclusters", []_C_int{1, 67}}, + {"kern.maxfiles", []_C_int{1, 7}}, + {"kern.maxlocksperuid", []_C_int{1, 70}}, + {"kern.maxpartitions", []_C_int{1, 23}}, + {"kern.maxproc", []_C_int{1, 6}}, + {"kern.maxthread", []_C_int{1, 25}}, + {"kern.maxvnodes", []_C_int{1, 5}}, + {"kern.mbstat", []_C_int{1, 59}}, + {"kern.msgbuf", []_C_int{1, 48}}, + {"kern.msgbufsize", []_C_int{1, 38}}, + {"kern.nchstats", []_C_int{1, 41}}, + {"kern.netlivelocks", []_C_int{1, 76}}, + {"kern.nfiles", []_C_int{1, 56}}, + {"kern.ngroups", []_C_int{1, 18}}, + {"kern.nosuidcoredump", []_C_int{1, 32}}, + {"kern.nprocs", []_C_int{1, 47}}, + {"kern.nselcoll", []_C_int{1, 43}}, + {"kern.nthreads", []_C_int{1, 26}}, + {"kern.numvnodes", []_C_int{1, 58}}, + {"kern.osrelease", []_C_int{1, 2}}, + {"kern.osrevision", []_C_int{1, 3}}, + {"kern.ostype", []_C_int{1, 1}}, + {"kern.osversion", []_C_int{1, 27}}, + {"kern.pool_debug", []_C_int{1, 77}}, + {"kern.posix1version", []_C_int{1, 17}}, + {"kern.proc", []_C_int{1, 66}}, + {"kern.rawpartition", []_C_int{1, 24}}, + {"kern.saved_ids", []_C_int{1, 20}}, + {"kern.securelevel", []_C_int{1, 9}}, + {"kern.seminfo", []_C_int{1, 61}}, + {"kern.shminfo", []_C_int{1, 62}}, + {"kern.somaxconn", []_C_int{1, 28}}, + {"kern.sominconn", []_C_int{1, 29}}, + {"kern.splassert", []_C_int{1, 54}}, + {"kern.stackgap_random", []_C_int{1, 50}}, + {"kern.sysvipc_info", []_C_int{1, 51}}, + {"kern.sysvmsg", []_C_int{1, 34}}, + {"kern.sysvsem", []_C_int{1, 35}}, + {"kern.sysvshm", []_C_int{1, 36}}, + {"kern.timecounter.choice", []_C_int{1, 69, 4}}, + {"kern.timecounter.hardware", []_C_int{1, 69, 3}}, + {"kern.timecounter.tick", []_C_int{1, 69, 1}}, + {"kern.timecounter.timestepwarnings", []_C_int{1, 69, 2}}, + {"kern.tty.tk_cancc", []_C_int{1, 44, 4}}, + {"kern.tty.tk_nin", []_C_int{1, 44, 1}}, + {"kern.tty.tk_nout", []_C_int{1, 44, 2}}, + {"kern.tty.tk_rawcc", []_C_int{1, 44, 3}}, + {"kern.tty.ttyinfo", []_C_int{1, 44, 5}}, + {"kern.ttycount", []_C_int{1, 57}}, + {"kern.version", []_C_int{1, 4}}, + {"kern.watchdog.auto", []_C_int{1, 64, 2}}, + {"kern.watchdog.period", []_C_int{1, 64, 1}}, + {"kern.witnesswatch", []_C_int{1, 53}}, + {"kern.wxabort", []_C_int{1, 74}}, + {"net.bpf.bufsize", []_C_int{4, 31, 1}}, + {"net.bpf.maxbufsize", []_C_int{4, 31, 2}}, + {"net.inet.ah.enable", []_C_int{4, 2, 51, 1}}, + {"net.inet.ah.stats", []_C_int{4, 2, 51, 2}}, + {"net.inet.carp.allow", []_C_int{4, 2, 112, 1}}, + {"net.inet.carp.log", []_C_int{4, 2, 112, 3}}, + {"net.inet.carp.preempt", []_C_int{4, 2, 112, 2}}, + {"net.inet.carp.stats", []_C_int{4, 2, 112, 4}}, + {"net.inet.divert.recvspace", []_C_int{4, 2, 258, 1}}, + {"net.inet.divert.sendspace", []_C_int{4, 2, 258, 2}}, + {"net.inet.divert.stats", []_C_int{4, 2, 258, 3}}, + {"net.inet.esp.enable", []_C_int{4, 2, 50, 1}}, + {"net.inet.esp.stats", []_C_int{4, 2, 50, 4}}, + {"net.inet.esp.udpencap", []_C_int{4, 2, 50, 2}}, + {"net.inet.esp.udpencap_port", []_C_int{4, 2, 50, 3}}, + {"net.inet.etherip.allow", []_C_int{4, 2, 97, 1}}, + {"net.inet.etherip.stats", []_C_int{4, 2, 97, 2}}, + {"net.inet.gre.allow", []_C_int{4, 2, 47, 1}}, + {"net.inet.gre.wccp", []_C_int{4, 2, 47, 2}}, + {"net.inet.icmp.bmcastecho", []_C_int{4, 2, 1, 2}}, + {"net.inet.icmp.errppslimit", []_C_int{4, 2, 1, 3}}, + {"net.inet.icmp.maskrepl", []_C_int{4, 2, 1, 1}}, + {"net.inet.icmp.rediraccept", []_C_int{4, 2, 1, 4}}, + {"net.inet.icmp.redirtimeout", []_C_int{4, 2, 1, 5}}, + {"net.inet.icmp.stats", []_C_int{4, 2, 1, 7}}, + {"net.inet.icmp.tstamprepl", []_C_int{4, 2, 1, 6}}, + {"net.inet.igmp.stats", []_C_int{4, 2, 2, 1}}, + {"net.inet.ip.arpdown", []_C_int{4, 2, 0, 40}}, + {"net.inet.ip.arpqueued", []_C_int{4, 2, 0, 36}}, + {"net.inet.ip.arptimeout", []_C_int{4, 2, 0, 39}}, + {"net.inet.ip.encdebug", []_C_int{4, 2, 0, 12}}, + {"net.inet.ip.forwarding", []_C_int{4, 2, 0, 1}}, + {"net.inet.ip.ifq.congestion", []_C_int{4, 2, 0, 30, 4}}, + {"net.inet.ip.ifq.drops", []_C_int{4, 2, 0, 30, 3}}, + {"net.inet.ip.ifq.len", []_C_int{4, 2, 0, 30, 1}}, + {"net.inet.ip.ifq.maxlen", []_C_int{4, 2, 0, 30, 2}}, + {"net.inet.ip.maxqueue", []_C_int{4, 2, 0, 11}}, + {"net.inet.ip.mforwarding", []_C_int{4, 2, 0, 31}}, + {"net.inet.ip.mrtmfc", []_C_int{4, 2, 0, 37}}, + {"net.inet.ip.mrtproto", []_C_int{4, 2, 0, 34}}, + {"net.inet.ip.mrtstats", []_C_int{4, 2, 0, 35}}, + {"net.inet.ip.mrtvif", []_C_int{4, 2, 0, 38}}, + {"net.inet.ip.mtu", []_C_int{4, 2, 0, 4}}, + {"net.inet.ip.mtudisc", []_C_int{4, 2, 0, 27}}, + {"net.inet.ip.mtudisctimeout", []_C_int{4, 2, 0, 28}}, + {"net.inet.ip.multipath", []_C_int{4, 2, 0, 32}}, + {"net.inet.ip.portfirst", []_C_int{4, 2, 0, 7}}, + {"net.inet.ip.porthifirst", []_C_int{4, 2, 0, 9}}, + {"net.inet.ip.porthilast", []_C_int{4, 2, 0, 10}}, + {"net.inet.ip.portlast", []_C_int{4, 2, 0, 8}}, + {"net.inet.ip.redirect", []_C_int{4, 2, 0, 2}}, + {"net.inet.ip.sourceroute", []_C_int{4, 2, 0, 5}}, + {"net.inet.ip.stats", []_C_int{4, 2, 0, 33}}, + {"net.inet.ip.ttl", []_C_int{4, 2, 0, 3}}, + {"net.inet.ipcomp.enable", []_C_int{4, 2, 108, 1}}, + {"net.inet.ipcomp.stats", []_C_int{4, 2, 108, 2}}, + {"net.inet.ipip.allow", []_C_int{4, 2, 4, 1}}, + {"net.inet.ipip.stats", []_C_int{4, 2, 4, 2}}, + {"net.inet.mobileip.allow", []_C_int{4, 2, 55, 1}}, + {"net.inet.pfsync.stats", []_C_int{4, 2, 240, 1}}, + {"net.inet.tcp.ackonpush", []_C_int{4, 2, 6, 13}}, + {"net.inet.tcp.always_keepalive", []_C_int{4, 2, 6, 22}}, + {"net.inet.tcp.baddynamic", []_C_int{4, 2, 6, 6}}, + {"net.inet.tcp.drop", []_C_int{4, 2, 6, 19}}, + {"net.inet.tcp.ecn", []_C_int{4, 2, 6, 14}}, + {"net.inet.tcp.ident", []_C_int{4, 2, 6, 9}}, + {"net.inet.tcp.keepidle", []_C_int{4, 2, 6, 3}}, + {"net.inet.tcp.keepinittime", []_C_int{4, 2, 6, 2}}, + {"net.inet.tcp.keepintvl", []_C_int{4, 2, 6, 4}}, + {"net.inet.tcp.mssdflt", []_C_int{4, 2, 6, 11}}, + {"net.inet.tcp.reasslimit", []_C_int{4, 2, 6, 18}}, + {"net.inet.tcp.rfc1323", []_C_int{4, 2, 6, 1}}, + {"net.inet.tcp.rfc3390", []_C_int{4, 2, 6, 17}}, + {"net.inet.tcp.rootonly", []_C_int{4, 2, 6, 24}}, + {"net.inet.tcp.rstppslimit", []_C_int{4, 2, 6, 12}}, + {"net.inet.tcp.sack", []_C_int{4, 2, 6, 10}}, + {"net.inet.tcp.sackholelimit", []_C_int{4, 2, 6, 20}}, + {"net.inet.tcp.slowhz", []_C_int{4, 2, 6, 5}}, + {"net.inet.tcp.stats", []_C_int{4, 2, 6, 21}}, + {"net.inet.tcp.synbucketlimit", []_C_int{4, 2, 6, 16}}, + {"net.inet.tcp.syncachelimit", []_C_int{4, 2, 6, 15}}, + {"net.inet.tcp.synhashsize", []_C_int{4, 2, 6, 25}}, + {"net.inet.tcp.synuselimit", []_C_int{4, 2, 6, 23}}, + {"net.inet.udp.baddynamic", []_C_int{4, 2, 17, 2}}, + {"net.inet.udp.checksum", []_C_int{4, 2, 17, 1}}, + {"net.inet.udp.recvspace", []_C_int{4, 2, 17, 3}}, + {"net.inet.udp.rootonly", []_C_int{4, 2, 17, 6}}, + {"net.inet.udp.sendspace", []_C_int{4, 2, 17, 4}}, + {"net.inet.udp.stats", []_C_int{4, 2, 17, 5}}, + {"net.inet6.divert.recvspace", []_C_int{4, 24, 86, 1}}, + {"net.inet6.divert.sendspace", []_C_int{4, 24, 86, 2}}, + {"net.inet6.divert.stats", []_C_int{4, 24, 86, 3}}, + {"net.inet6.icmp6.errppslimit", []_C_int{4, 24, 30, 14}}, + {"net.inet6.icmp6.mtudisc_hiwat", []_C_int{4, 24, 30, 16}}, + {"net.inet6.icmp6.mtudisc_lowat", []_C_int{4, 24, 30, 17}}, + {"net.inet6.icmp6.nd6_debug", []_C_int{4, 24, 30, 18}}, + {"net.inet6.icmp6.nd6_delay", []_C_int{4, 24, 30, 8}}, + {"net.inet6.icmp6.nd6_maxnudhint", []_C_int{4, 24, 30, 15}}, + {"net.inet6.icmp6.nd6_mmaxtries", []_C_int{4, 24, 30, 10}}, + {"net.inet6.icmp6.nd6_umaxtries", []_C_int{4, 24, 30, 9}}, + {"net.inet6.icmp6.redirtimeout", []_C_int{4, 24, 30, 3}}, + {"net.inet6.ip6.auto_flowlabel", []_C_int{4, 24, 17, 17}}, + {"net.inet6.ip6.dad_count", []_C_int{4, 24, 17, 16}}, + {"net.inet6.ip6.dad_pending", []_C_int{4, 24, 17, 49}}, + {"net.inet6.ip6.defmcasthlim", []_C_int{4, 24, 17, 18}}, + {"net.inet6.ip6.forwarding", []_C_int{4, 24, 17, 1}}, + {"net.inet6.ip6.forwsrcrt", []_C_int{4, 24, 17, 5}}, + {"net.inet6.ip6.hdrnestlimit", []_C_int{4, 24, 17, 15}}, + {"net.inet6.ip6.hlim", []_C_int{4, 24, 17, 3}}, + {"net.inet6.ip6.log_interval", []_C_int{4, 24, 17, 14}}, + {"net.inet6.ip6.maxdynroutes", []_C_int{4, 24, 17, 48}}, + {"net.inet6.ip6.maxfragpackets", []_C_int{4, 24, 17, 9}}, + {"net.inet6.ip6.maxfrags", []_C_int{4, 24, 17, 41}}, + {"net.inet6.ip6.mforwarding", []_C_int{4, 24, 17, 42}}, + {"net.inet6.ip6.mrtmfc", []_C_int{4, 24, 17, 53}}, + {"net.inet6.ip6.mrtmif", []_C_int{4, 24, 17, 52}}, + {"net.inet6.ip6.mrtproto", []_C_int{4, 24, 17, 8}}, + {"net.inet6.ip6.mtudisctimeout", []_C_int{4, 24, 17, 50}}, + {"net.inet6.ip6.multicast_mtudisc", []_C_int{4, 24, 17, 44}}, + {"net.inet6.ip6.multipath", []_C_int{4, 24, 17, 43}}, + {"net.inet6.ip6.neighborgcthresh", []_C_int{4, 24, 17, 45}}, + {"net.inet6.ip6.redirect", []_C_int{4, 24, 17, 2}}, + {"net.inet6.ip6.soiikey", []_C_int{4, 24, 17, 54}}, + {"net.inet6.ip6.sourcecheck", []_C_int{4, 24, 17, 10}}, + {"net.inet6.ip6.sourcecheck_logint", []_C_int{4, 24, 17, 11}}, + {"net.inet6.ip6.use_deprecated", []_C_int{4, 24, 17, 21}}, + {"net.key.sadb_dump", []_C_int{4, 30, 1}}, + {"net.key.spd_dump", []_C_int{4, 30, 2}}, + {"net.mpls.ifq.congestion", []_C_int{4, 33, 3, 4}}, + {"net.mpls.ifq.drops", []_C_int{4, 33, 3, 3}}, + {"net.mpls.ifq.len", []_C_int{4, 33, 3, 1}}, + {"net.mpls.ifq.maxlen", []_C_int{4, 33, 3, 2}}, + {"net.mpls.mapttl_ip", []_C_int{4, 33, 5}}, + {"net.mpls.mapttl_ip6", []_C_int{4, 33, 6}}, + {"net.mpls.maxloop_inkernel", []_C_int{4, 33, 4}}, + {"net.mpls.ttl", []_C_int{4, 33, 2}}, + {"net.pflow.stats", []_C_int{4, 34, 1}}, + {"net.pipex.enable", []_C_int{4, 35, 1}}, + {"vm.anonmin", []_C_int{2, 7}}, + {"vm.loadavg", []_C_int{2, 2}}, + {"vm.malloc_conf", []_C_int{2, 12}}, + {"vm.maxslp", []_C_int{2, 10}}, + {"vm.nkmempages", []_C_int{2, 6}}, + {"vm.psstrings", []_C_int{2, 3}}, + {"vm.swapencrypt.enable", []_C_int{2, 5, 0}}, + {"vm.swapencrypt.keyscreated", []_C_int{2, 5, 1}}, + {"vm.swapencrypt.keysdeleted", []_C_int{2, 5, 2}}, + {"vm.uspace", []_C_int{2, 11}}, + {"vm.uvmexp", []_C_int{2, 4}}, + {"vm.vmmeter", []_C_int{2, 1}}, + {"vm.vnodemin", []_C_int{2, 9}}, + {"vm.vtextmin", []_C_int{2, 8}}, +} diff --git a/vendor/golang.org/x/sys/unix/zsysnum_freebsd_386.go b/vendor/golang.org/x/sys/unix/zsysnum_freebsd_386.go index 55c3a329..9474974b 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_freebsd_386.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_freebsd_386.go @@ -1,4 +1,4 @@ -// go run mksysnum.go https://svn.freebsd.org/base/stable/10/sys/kern/syscalls.master +// go run mksysnum.go https://svn.freebsd.org/base/stable/11/sys/kern/syscalls.master // Code generated by the command above; see README.md. DO NOT EDIT. // +build 386,freebsd @@ -118,8 +118,6 @@ const ( SYS_SEMSYS = 169 // { int semsys(int which, int a2, int a3, int a4, int a5); } SYS_MSGSYS = 170 // { int msgsys(int which, int a2, int a3, int a4, int a5, int a6); } SYS_SHMSYS = 171 // { int shmsys(int which, int a2, int a3, int a4); } - SYS_FREEBSD6_PREAD = 173 // { ssize_t freebsd6_pread(int fd, void *buf, size_t nbyte, int pad, off_t offset); } - SYS_FREEBSD6_PWRITE = 174 // { ssize_t freebsd6_pwrite(int fd, const void *buf, size_t nbyte, int pad, off_t offset); } SYS_SETFIB = 175 // { int setfib(int fibnum); } SYS_NTP_ADJTIME = 176 // { int ntp_adjtime(struct timex *tp); } SYS_SETGID = 181 // { int setgid(gid_t gid); } @@ -133,10 +131,6 @@ const ( SYS_GETRLIMIT = 194 // { int getrlimit(u_int which, struct rlimit *rlp); } getrlimit __getrlimit_args int SYS_SETRLIMIT = 195 // { int setrlimit(u_int which, struct rlimit *rlp); } setrlimit __setrlimit_args int SYS_GETDIRENTRIES = 196 // { int getdirentries(int fd, char *buf, u_int count, long *basep); } - SYS_FREEBSD6_MMAP = 197 // { caddr_t freebsd6_mmap(caddr_t addr, size_t len, int prot, int flags, int fd, int pad, off_t pos); } - SYS_FREEBSD6_LSEEK = 199 // { off_t freebsd6_lseek(int fd, int pad, off_t offset, int whence); } - SYS_FREEBSD6_TRUNCATE = 200 // { int freebsd6_truncate(char *path, int pad, off_t length); } - SYS_FREEBSD6_FTRUNCATE = 201 // { int freebsd6_ftruncate(int fd, int pad, off_t length); } SYS___SYSCTL = 202 // { int __sysctl(int *name, u_int namelen, void *old, size_t *oldlenp, void *new, size_t newlen); } __sysctl sysctl_args int SYS_MLOCK = 203 // { int mlock(const void *addr, size_t len); } SYS_MUNLOCK = 204 // { int munlock(const void *addr, size_t len); } @@ -164,6 +158,7 @@ const ( SYS_FFCLOCK_GETCOUNTER = 241 // { int ffclock_getcounter(ffcounter *ffcount); } SYS_FFCLOCK_SETESTIMATE = 242 // { int ffclock_setestimate( struct ffclock_estimate *cest); } SYS_FFCLOCK_GETESTIMATE = 243 // { int ffclock_getestimate( struct ffclock_estimate *cest); } + SYS_CLOCK_NANOSLEEP = 244 // { int clock_nanosleep(clockid_t clock_id, int flags, const struct timespec *rqtp, struct timespec *rmtp); } SYS_CLOCK_GETCPUCLOCKID2 = 247 // { int clock_getcpuclockid2(id_t id,int which, clockid_t *clock_id); } SYS_NTP_GETTIME = 248 // { int ntp_gettime(struct ntptimeval *ntvp); } SYS_MINHERIT = 250 // { int minherit(void *addr, size_t len, int inherit); } @@ -197,13 +192,10 @@ const ( SYS_GETSID = 310 // { int getsid(pid_t pid); } SYS_SETRESUID = 311 // { int setresuid(uid_t ruid, uid_t euid, uid_t suid); } SYS_SETRESGID = 312 // { int setresgid(gid_t rgid, gid_t egid, gid_t sgid); } - SYS_AIO_RETURN = 314 // { int aio_return(struct aiocb *aiocbp); } + SYS_AIO_RETURN = 314 // { ssize_t aio_return(struct aiocb *aiocbp); } SYS_AIO_SUSPEND = 315 // { int aio_suspend( struct aiocb * const * aiocbp, int nent, const struct timespec *timeout); } SYS_AIO_CANCEL = 316 // { int aio_cancel(int fd, struct aiocb *aiocbp); } SYS_AIO_ERROR = 317 // { int aio_error(struct aiocb *aiocbp); } - SYS_OAIO_READ = 318 // { int oaio_read(struct oaiocb *aiocbp); } - SYS_OAIO_WRITE = 319 // { int oaio_write(struct oaiocb *aiocbp); } - SYS_OLIO_LISTIO = 320 // { int olio_listio(int mode, struct oaiocb * const *acb_list, int nent, struct osigevent *sig); } SYS_YIELD = 321 // { int yield(void); } SYS_MLOCKALL = 324 // { int mlockall(int how); } SYS_MUNLOCKALL = 325 // { int munlockall(void); } @@ -236,7 +228,7 @@ const ( SYS_EXTATTR_SET_FILE = 356 // { ssize_t extattr_set_file( const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } SYS_EXTATTR_GET_FILE = 357 // { ssize_t extattr_get_file( const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } SYS_EXTATTR_DELETE_FILE = 358 // { int extattr_delete_file(const char *path, int attrnamespace, const char *attrname); } - SYS_AIO_WAITCOMPLETE = 359 // { int aio_waitcomplete( struct aiocb **aiocbp, struct timespec *timeout); } + SYS_AIO_WAITCOMPLETE = 359 // { ssize_t aio_waitcomplete( struct aiocb **aiocbp, struct timespec *timeout); } SYS_GETRESUID = 360 // { int getresuid(uid_t *ruid, uid_t *euid, uid_t *suid); } SYS_GETRESGID = 361 // { int getresgid(gid_t *rgid, gid_t *egid, gid_t *sgid); } SYS_KQUEUE = 362 // { int kqueue(void); } @@ -258,7 +250,7 @@ const ( SYS_UUIDGEN = 392 // { int uuidgen(struct uuid *store, int count); } SYS_SENDFILE = 393 // { int sendfile(int fd, int s, off_t offset, size_t nbytes, struct sf_hdtr *hdtr, off_t *sbytes, int flags); } SYS_MAC_SYSCALL = 394 // { int mac_syscall(const char *policy, int call, void *arg); } - SYS_GETFSSTAT = 395 // { int getfsstat(struct statfs *buf, long bufsize, int flags); } + SYS_GETFSSTAT = 395 // { int getfsstat(struct statfs *buf, long bufsize, int mode); } SYS_STATFS = 396 // { int statfs(char *path, struct statfs *buf); } SYS_FSTATFS = 397 // { int fstatfs(int fd, struct statfs *buf); } SYS_FHSTATFS = 398 // { int fhstatfs(const struct fhandle *u_fhp, struct statfs *buf); } @@ -293,8 +285,6 @@ const ( SYS_THR_EXIT = 431 // { void thr_exit(long *state); } SYS_THR_SELF = 432 // { int thr_self(long *id); } SYS_THR_KILL = 433 // { int thr_kill(long id, int sig); } - SYS__UMTX_LOCK = 434 // { int _umtx_lock(struct umtx *umtx); } - SYS__UMTX_UNLOCK = 435 // { int _umtx_unlock(struct umtx *umtx); } SYS_JAIL_ATTACH = 436 // { int jail_attach(int jid); } SYS_EXTATTR_LIST_FD = 437 // { ssize_t extattr_list_fd(int fd, int attrnamespace, void *data, size_t nbytes); } SYS_EXTATTR_LIST_FILE = 438 // { ssize_t extattr_list_file( const char *path, int attrnamespace, void *data, size_t nbytes); } @@ -400,4 +390,7 @@ const ( SYS_PPOLL = 545 // { int ppoll(struct pollfd *fds, u_int nfds, const struct timespec *ts, const sigset_t *set); } SYS_FUTIMENS = 546 // { int futimens(int fd, struct timespec *times); } SYS_UTIMENSAT = 547 // { int utimensat(int fd, char *path, struct timespec *times, int flag); } + SYS_NUMA_GETAFFINITY = 548 // { int numa_getaffinity(cpuwhich_t which, id_t id, struct vm_domain_policy_entry *policy); } + SYS_NUMA_SETAFFINITY = 549 // { int numa_setaffinity(cpuwhich_t which, id_t id, const struct vm_domain_policy_entry *policy); } + SYS_FDATASYNC = 550 // { int fdatasync(int fd); } ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_freebsd_amd64.go b/vendor/golang.org/x/sys/unix/zsysnum_freebsd_amd64.go index b39be6cb..48a7beae 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_freebsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_freebsd_amd64.go @@ -1,4 +1,4 @@ -// go run mksysnum.go https://svn.freebsd.org/base/stable/10/sys/kern/syscalls.master +// go run mksysnum.go https://svn.freebsd.org/base/stable/11/sys/kern/syscalls.master // Code generated by the command above; see README.md. DO NOT EDIT. // +build amd64,freebsd @@ -118,8 +118,6 @@ const ( SYS_SEMSYS = 169 // { int semsys(int which, int a2, int a3, int a4, int a5); } SYS_MSGSYS = 170 // { int msgsys(int which, int a2, int a3, int a4, int a5, int a6); } SYS_SHMSYS = 171 // { int shmsys(int which, int a2, int a3, int a4); } - SYS_FREEBSD6_PREAD = 173 // { ssize_t freebsd6_pread(int fd, void *buf, size_t nbyte, int pad, off_t offset); } - SYS_FREEBSD6_PWRITE = 174 // { ssize_t freebsd6_pwrite(int fd, const void *buf, size_t nbyte, int pad, off_t offset); } SYS_SETFIB = 175 // { int setfib(int fibnum); } SYS_NTP_ADJTIME = 176 // { int ntp_adjtime(struct timex *tp); } SYS_SETGID = 181 // { int setgid(gid_t gid); } @@ -133,10 +131,6 @@ const ( SYS_GETRLIMIT = 194 // { int getrlimit(u_int which, struct rlimit *rlp); } getrlimit __getrlimit_args int SYS_SETRLIMIT = 195 // { int setrlimit(u_int which, struct rlimit *rlp); } setrlimit __setrlimit_args int SYS_GETDIRENTRIES = 196 // { int getdirentries(int fd, char *buf, u_int count, long *basep); } - SYS_FREEBSD6_MMAP = 197 // { caddr_t freebsd6_mmap(caddr_t addr, size_t len, int prot, int flags, int fd, int pad, off_t pos); } - SYS_FREEBSD6_LSEEK = 199 // { off_t freebsd6_lseek(int fd, int pad, off_t offset, int whence); } - SYS_FREEBSD6_TRUNCATE = 200 // { int freebsd6_truncate(char *path, int pad, off_t length); } - SYS_FREEBSD6_FTRUNCATE = 201 // { int freebsd6_ftruncate(int fd, int pad, off_t length); } SYS___SYSCTL = 202 // { int __sysctl(int *name, u_int namelen, void *old, size_t *oldlenp, void *new, size_t newlen); } __sysctl sysctl_args int SYS_MLOCK = 203 // { int mlock(const void *addr, size_t len); } SYS_MUNLOCK = 204 // { int munlock(const void *addr, size_t len); } @@ -164,6 +158,7 @@ const ( SYS_FFCLOCK_GETCOUNTER = 241 // { int ffclock_getcounter(ffcounter *ffcount); } SYS_FFCLOCK_SETESTIMATE = 242 // { int ffclock_setestimate( struct ffclock_estimate *cest); } SYS_FFCLOCK_GETESTIMATE = 243 // { int ffclock_getestimate( struct ffclock_estimate *cest); } + SYS_CLOCK_NANOSLEEP = 244 // { int clock_nanosleep(clockid_t clock_id, int flags, const struct timespec *rqtp, struct timespec *rmtp); } SYS_CLOCK_GETCPUCLOCKID2 = 247 // { int clock_getcpuclockid2(id_t id,int which, clockid_t *clock_id); } SYS_NTP_GETTIME = 248 // { int ntp_gettime(struct ntptimeval *ntvp); } SYS_MINHERIT = 250 // { int minherit(void *addr, size_t len, int inherit); } @@ -197,13 +192,10 @@ const ( SYS_GETSID = 310 // { int getsid(pid_t pid); } SYS_SETRESUID = 311 // { int setresuid(uid_t ruid, uid_t euid, uid_t suid); } SYS_SETRESGID = 312 // { int setresgid(gid_t rgid, gid_t egid, gid_t sgid); } - SYS_AIO_RETURN = 314 // { int aio_return(struct aiocb *aiocbp); } + SYS_AIO_RETURN = 314 // { ssize_t aio_return(struct aiocb *aiocbp); } SYS_AIO_SUSPEND = 315 // { int aio_suspend( struct aiocb * const * aiocbp, int nent, const struct timespec *timeout); } SYS_AIO_CANCEL = 316 // { int aio_cancel(int fd, struct aiocb *aiocbp); } SYS_AIO_ERROR = 317 // { int aio_error(struct aiocb *aiocbp); } - SYS_OAIO_READ = 318 // { int oaio_read(struct oaiocb *aiocbp); } - SYS_OAIO_WRITE = 319 // { int oaio_write(struct oaiocb *aiocbp); } - SYS_OLIO_LISTIO = 320 // { int olio_listio(int mode, struct oaiocb * const *acb_list, int nent, struct osigevent *sig); } SYS_YIELD = 321 // { int yield(void); } SYS_MLOCKALL = 324 // { int mlockall(int how); } SYS_MUNLOCKALL = 325 // { int munlockall(void); } @@ -236,7 +228,7 @@ const ( SYS_EXTATTR_SET_FILE = 356 // { ssize_t extattr_set_file( const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } SYS_EXTATTR_GET_FILE = 357 // { ssize_t extattr_get_file( const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } SYS_EXTATTR_DELETE_FILE = 358 // { int extattr_delete_file(const char *path, int attrnamespace, const char *attrname); } - SYS_AIO_WAITCOMPLETE = 359 // { int aio_waitcomplete( struct aiocb **aiocbp, struct timespec *timeout); } + SYS_AIO_WAITCOMPLETE = 359 // { ssize_t aio_waitcomplete( struct aiocb **aiocbp, struct timespec *timeout); } SYS_GETRESUID = 360 // { int getresuid(uid_t *ruid, uid_t *euid, uid_t *suid); } SYS_GETRESGID = 361 // { int getresgid(gid_t *rgid, gid_t *egid, gid_t *sgid); } SYS_KQUEUE = 362 // { int kqueue(void); } @@ -258,7 +250,7 @@ const ( SYS_UUIDGEN = 392 // { int uuidgen(struct uuid *store, int count); } SYS_SENDFILE = 393 // { int sendfile(int fd, int s, off_t offset, size_t nbytes, struct sf_hdtr *hdtr, off_t *sbytes, int flags); } SYS_MAC_SYSCALL = 394 // { int mac_syscall(const char *policy, int call, void *arg); } - SYS_GETFSSTAT = 395 // { int getfsstat(struct statfs *buf, long bufsize, int flags); } + SYS_GETFSSTAT = 395 // { int getfsstat(struct statfs *buf, long bufsize, int mode); } SYS_STATFS = 396 // { int statfs(char *path, struct statfs *buf); } SYS_FSTATFS = 397 // { int fstatfs(int fd, struct statfs *buf); } SYS_FHSTATFS = 398 // { int fhstatfs(const struct fhandle *u_fhp, struct statfs *buf); } @@ -293,8 +285,6 @@ const ( SYS_THR_EXIT = 431 // { void thr_exit(long *state); } SYS_THR_SELF = 432 // { int thr_self(long *id); } SYS_THR_KILL = 433 // { int thr_kill(long id, int sig); } - SYS__UMTX_LOCK = 434 // { int _umtx_lock(struct umtx *umtx); } - SYS__UMTX_UNLOCK = 435 // { int _umtx_unlock(struct umtx *umtx); } SYS_JAIL_ATTACH = 436 // { int jail_attach(int jid); } SYS_EXTATTR_LIST_FD = 437 // { ssize_t extattr_list_fd(int fd, int attrnamespace, void *data, size_t nbytes); } SYS_EXTATTR_LIST_FILE = 438 // { ssize_t extattr_list_file( const char *path, int attrnamespace, void *data, size_t nbytes); } @@ -400,4 +390,7 @@ const ( SYS_PPOLL = 545 // { int ppoll(struct pollfd *fds, u_int nfds, const struct timespec *ts, const sigset_t *set); } SYS_FUTIMENS = 546 // { int futimens(int fd, struct timespec *times); } SYS_UTIMENSAT = 547 // { int utimensat(int fd, char *path, struct timespec *times, int flag); } + SYS_NUMA_GETAFFINITY = 548 // { int numa_getaffinity(cpuwhich_t which, id_t id, struct vm_domain_policy_entry *policy); } + SYS_NUMA_SETAFFINITY = 549 // { int numa_setaffinity(cpuwhich_t which, id_t id, const struct vm_domain_policy_entry *policy); } + SYS_FDATASYNC = 550 // { int fdatasync(int fd); } ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm.go b/vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm.go index 44ffd4ce..4a6dfd4a 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm.go @@ -1,4 +1,4 @@ -// go run mksysnum.go https://svn.freebsd.org/base/stable/10/sys/kern/syscalls.master +// go run mksysnum.go https://svn.freebsd.org/base/stable/11/sys/kern/syscalls.master // Code generated by the command above; see README.md. DO NOT EDIT. // +build arm,freebsd @@ -118,8 +118,6 @@ const ( SYS_SEMSYS = 169 // { int semsys(int which, int a2, int a3, int a4, int a5); } SYS_MSGSYS = 170 // { int msgsys(int which, int a2, int a3, int a4, int a5, int a6); } SYS_SHMSYS = 171 // { int shmsys(int which, int a2, int a3, int a4); } - SYS_FREEBSD6_PREAD = 173 // { ssize_t freebsd6_pread(int fd, void *buf, size_t nbyte, int pad, off_t offset); } - SYS_FREEBSD6_PWRITE = 174 // { ssize_t freebsd6_pwrite(int fd, const void *buf, size_t nbyte, int pad, off_t offset); } SYS_SETFIB = 175 // { int setfib(int fibnum); } SYS_NTP_ADJTIME = 176 // { int ntp_adjtime(struct timex *tp); } SYS_SETGID = 181 // { int setgid(gid_t gid); } @@ -133,10 +131,6 @@ const ( SYS_GETRLIMIT = 194 // { int getrlimit(u_int which, struct rlimit *rlp); } getrlimit __getrlimit_args int SYS_SETRLIMIT = 195 // { int setrlimit(u_int which, struct rlimit *rlp); } setrlimit __setrlimit_args int SYS_GETDIRENTRIES = 196 // { int getdirentries(int fd, char *buf, u_int count, long *basep); } - SYS_FREEBSD6_MMAP = 197 // { caddr_t freebsd6_mmap(caddr_t addr, size_t len, int prot, int flags, int fd, int pad, off_t pos); } - SYS_FREEBSD6_LSEEK = 199 // { off_t freebsd6_lseek(int fd, int pad, off_t offset, int whence); } - SYS_FREEBSD6_TRUNCATE = 200 // { int freebsd6_truncate(char *path, int pad, off_t length); } - SYS_FREEBSD6_FTRUNCATE = 201 // { int freebsd6_ftruncate(int fd, int pad, off_t length); } SYS___SYSCTL = 202 // { int __sysctl(int *name, u_int namelen, void *old, size_t *oldlenp, void *new, size_t newlen); } __sysctl sysctl_args int SYS_MLOCK = 203 // { int mlock(const void *addr, size_t len); } SYS_MUNLOCK = 204 // { int munlock(const void *addr, size_t len); } @@ -164,6 +158,7 @@ const ( SYS_FFCLOCK_GETCOUNTER = 241 // { int ffclock_getcounter(ffcounter *ffcount); } SYS_FFCLOCK_SETESTIMATE = 242 // { int ffclock_setestimate( struct ffclock_estimate *cest); } SYS_FFCLOCK_GETESTIMATE = 243 // { int ffclock_getestimate( struct ffclock_estimate *cest); } + SYS_CLOCK_NANOSLEEP = 244 // { int clock_nanosleep(clockid_t clock_id, int flags, const struct timespec *rqtp, struct timespec *rmtp); } SYS_CLOCK_GETCPUCLOCKID2 = 247 // { int clock_getcpuclockid2(id_t id,int which, clockid_t *clock_id); } SYS_NTP_GETTIME = 248 // { int ntp_gettime(struct ntptimeval *ntvp); } SYS_MINHERIT = 250 // { int minherit(void *addr, size_t len, int inherit); } @@ -197,13 +192,10 @@ const ( SYS_GETSID = 310 // { int getsid(pid_t pid); } SYS_SETRESUID = 311 // { int setresuid(uid_t ruid, uid_t euid, uid_t suid); } SYS_SETRESGID = 312 // { int setresgid(gid_t rgid, gid_t egid, gid_t sgid); } - SYS_AIO_RETURN = 314 // { int aio_return(struct aiocb *aiocbp); } + SYS_AIO_RETURN = 314 // { ssize_t aio_return(struct aiocb *aiocbp); } SYS_AIO_SUSPEND = 315 // { int aio_suspend( struct aiocb * const * aiocbp, int nent, const struct timespec *timeout); } SYS_AIO_CANCEL = 316 // { int aio_cancel(int fd, struct aiocb *aiocbp); } SYS_AIO_ERROR = 317 // { int aio_error(struct aiocb *aiocbp); } - SYS_OAIO_READ = 318 // { int oaio_read(struct oaiocb *aiocbp); } - SYS_OAIO_WRITE = 319 // { int oaio_write(struct oaiocb *aiocbp); } - SYS_OLIO_LISTIO = 320 // { int olio_listio(int mode, struct oaiocb * const *acb_list, int nent, struct osigevent *sig); } SYS_YIELD = 321 // { int yield(void); } SYS_MLOCKALL = 324 // { int mlockall(int how); } SYS_MUNLOCKALL = 325 // { int munlockall(void); } @@ -236,7 +228,7 @@ const ( SYS_EXTATTR_SET_FILE = 356 // { ssize_t extattr_set_file( const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } SYS_EXTATTR_GET_FILE = 357 // { ssize_t extattr_get_file( const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } SYS_EXTATTR_DELETE_FILE = 358 // { int extattr_delete_file(const char *path, int attrnamespace, const char *attrname); } - SYS_AIO_WAITCOMPLETE = 359 // { int aio_waitcomplete( struct aiocb **aiocbp, struct timespec *timeout); } + SYS_AIO_WAITCOMPLETE = 359 // { ssize_t aio_waitcomplete( struct aiocb **aiocbp, struct timespec *timeout); } SYS_GETRESUID = 360 // { int getresuid(uid_t *ruid, uid_t *euid, uid_t *suid); } SYS_GETRESGID = 361 // { int getresgid(gid_t *rgid, gid_t *egid, gid_t *sgid); } SYS_KQUEUE = 362 // { int kqueue(void); } @@ -258,7 +250,7 @@ const ( SYS_UUIDGEN = 392 // { int uuidgen(struct uuid *store, int count); } SYS_SENDFILE = 393 // { int sendfile(int fd, int s, off_t offset, size_t nbytes, struct sf_hdtr *hdtr, off_t *sbytes, int flags); } SYS_MAC_SYSCALL = 394 // { int mac_syscall(const char *policy, int call, void *arg); } - SYS_GETFSSTAT = 395 // { int getfsstat(struct statfs *buf, long bufsize, int flags); } + SYS_GETFSSTAT = 395 // { int getfsstat(struct statfs *buf, long bufsize, int mode); } SYS_STATFS = 396 // { int statfs(char *path, struct statfs *buf); } SYS_FSTATFS = 397 // { int fstatfs(int fd, struct statfs *buf); } SYS_FHSTATFS = 398 // { int fhstatfs(const struct fhandle *u_fhp, struct statfs *buf); } @@ -293,8 +285,6 @@ const ( SYS_THR_EXIT = 431 // { void thr_exit(long *state); } SYS_THR_SELF = 432 // { int thr_self(long *id); } SYS_THR_KILL = 433 // { int thr_kill(long id, int sig); } - SYS__UMTX_LOCK = 434 // { int _umtx_lock(struct umtx *umtx); } - SYS__UMTX_UNLOCK = 435 // { int _umtx_unlock(struct umtx *umtx); } SYS_JAIL_ATTACH = 436 // { int jail_attach(int jid); } SYS_EXTATTR_LIST_FD = 437 // { ssize_t extattr_list_fd(int fd, int attrnamespace, void *data, size_t nbytes); } SYS_EXTATTR_LIST_FILE = 438 // { ssize_t extattr_list_file( const char *path, int attrnamespace, void *data, size_t nbytes); } @@ -400,4 +390,7 @@ const ( SYS_PPOLL = 545 // { int ppoll(struct pollfd *fds, u_int nfds, const struct timespec *ts, const sigset_t *set); } SYS_FUTIMENS = 546 // { int futimens(int fd, struct timespec *times); } SYS_UTIMENSAT = 547 // { int utimensat(int fd, char *path, struct timespec *times, int flag); } + SYS_NUMA_GETAFFINITY = 548 // { int numa_getaffinity(cpuwhich_t which, id_t id, struct vm_domain_policy_entry *policy); } + SYS_NUMA_SETAFFINITY = 549 // { int numa_setaffinity(cpuwhich_t which, id_t id, const struct vm_domain_policy_entry *policy); } + SYS_FDATASYNC = 550 // { int fdatasync(int fd); } ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm64.go b/vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm64.go index 9f21e955..3e51af8e 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm64.go @@ -1,4 +1,4 @@ -// go run mksysnum.go https://svn.freebsd.org/base/stable/10/sys/kern/syscalls.master +// go run mksysnum.go https://svn.freebsd.org/base/stable/11/sys/kern/syscalls.master // Code generated by the command above; see README.md. DO NOT EDIT. // +build arm64,freebsd @@ -7,13 +7,13 @@ package unix const ( // SYS_NOSYS = 0; // { int nosys(void); } syscall nosys_args int - SYS_EXIT = 1 // { void sys_exit(int rval); } exit \ + SYS_EXIT = 1 // { void sys_exit(int rval); } exit sys_exit_args void SYS_FORK = 2 // { int fork(void); } - SYS_READ = 3 // { ssize_t read(int fd, void *buf, \ - SYS_WRITE = 4 // { ssize_t write(int fd, const void *buf, \ + SYS_READ = 3 // { ssize_t read(int fd, void *buf, size_t nbyte); } + SYS_WRITE = 4 // { ssize_t write(int fd, const void *buf, size_t nbyte); } SYS_OPEN = 5 // { int open(char *path, int flags, int mode); } SYS_CLOSE = 6 // { int close(int fd); } - SYS_WAIT4 = 7 // { int wait4(int pid, int *status, \ + SYS_WAIT4 = 7 // { int wait4(int pid, int *status, int options, struct rusage *rusage); } SYS_LINK = 9 // { int link(char *path, char *link); } SYS_UNLINK = 10 // { int unlink(char *path); } SYS_CHDIR = 12 // { int chdir(char *path); } @@ -21,20 +21,20 @@ const ( SYS_MKNOD = 14 // { int mknod(char *path, int mode, int dev); } SYS_CHMOD = 15 // { int chmod(char *path, int mode); } SYS_CHOWN = 16 // { int chown(char *path, int uid, int gid); } - SYS_OBREAK = 17 // { int obreak(char *nsize); } break \ + SYS_OBREAK = 17 // { int obreak(char *nsize); } break obreak_args int SYS_GETPID = 20 // { pid_t getpid(void); } - SYS_MOUNT = 21 // { int mount(char *type, char *path, \ + SYS_MOUNT = 21 // { int mount(char *type, char *path, int flags, caddr_t data); } SYS_UNMOUNT = 22 // { int unmount(char *path, int flags); } SYS_SETUID = 23 // { int setuid(uid_t uid); } SYS_GETUID = 24 // { uid_t getuid(void); } SYS_GETEUID = 25 // { uid_t geteuid(void); } - SYS_PTRACE = 26 // { int ptrace(int req, pid_t pid, \ - SYS_RECVMSG = 27 // { int recvmsg(int s, struct msghdr *msg, \ - SYS_SENDMSG = 28 // { int sendmsg(int s, struct msghdr *msg, \ - SYS_RECVFROM = 29 // { int recvfrom(int s, caddr_t buf, \ - SYS_ACCEPT = 30 // { int accept(int s, \ - SYS_GETPEERNAME = 31 // { int getpeername(int fdes, \ - SYS_GETSOCKNAME = 32 // { int getsockname(int fdes, \ + SYS_PTRACE = 26 // { int ptrace(int req, pid_t pid, caddr_t addr, int data); } + SYS_RECVMSG = 27 // { int recvmsg(int s, struct msghdr *msg, int flags); } + SYS_SENDMSG = 28 // { int sendmsg(int s, struct msghdr *msg, int flags); } + SYS_RECVFROM = 29 // { int recvfrom(int s, caddr_t buf, size_t len, int flags, struct sockaddr * __restrict from, __socklen_t * __restrict fromlenaddr); } + SYS_ACCEPT = 30 // { int accept(int s, struct sockaddr * __restrict name, __socklen_t * __restrict anamelen); } + SYS_GETPEERNAME = 31 // { int getpeername(int fdes, struct sockaddr * __restrict asa, __socklen_t * __restrict alen); } + SYS_GETSOCKNAME = 32 // { int getsockname(int fdes, struct sockaddr * __restrict asa, __socklen_t * __restrict alen); } SYS_ACCESS = 33 // { int access(char *path, int amode); } SYS_CHFLAGS = 34 // { int chflags(const char *path, u_long flags); } SYS_FCHFLAGS = 35 // { int fchflags(int fd, u_long flags); } @@ -42,56 +42,57 @@ const ( SYS_KILL = 37 // { int kill(int pid, int signum); } SYS_GETPPID = 39 // { pid_t getppid(void); } SYS_DUP = 41 // { int dup(u_int fd); } + SYS_PIPE = 42 // { int pipe(void); } SYS_GETEGID = 43 // { gid_t getegid(void); } - SYS_PROFIL = 44 // { int profil(caddr_t samples, size_t size, \ - SYS_KTRACE = 45 // { int ktrace(const char *fname, int ops, \ + SYS_PROFIL = 44 // { int profil(caddr_t samples, size_t size, size_t offset, u_int scale); } + SYS_KTRACE = 45 // { int ktrace(const char *fname, int ops, int facs, int pid); } SYS_GETGID = 47 // { gid_t getgid(void); } - SYS_GETLOGIN = 49 // { int getlogin(char *namebuf, u_int \ + SYS_GETLOGIN = 49 // { int getlogin(char *namebuf, u_int namelen); } SYS_SETLOGIN = 50 // { int setlogin(char *namebuf); } SYS_ACCT = 51 // { int acct(char *path); } - SYS_SIGALTSTACK = 53 // { int sigaltstack(stack_t *ss, \ - SYS_IOCTL = 54 // { int ioctl(int fd, u_long com, \ + SYS_SIGALTSTACK = 53 // { int sigaltstack(stack_t *ss, stack_t *oss); } + SYS_IOCTL = 54 // { int ioctl(int fd, u_long com, caddr_t data); } SYS_REBOOT = 55 // { int reboot(int opt); } SYS_REVOKE = 56 // { int revoke(char *path); } SYS_SYMLINK = 57 // { int symlink(char *path, char *link); } - SYS_READLINK = 58 // { ssize_t readlink(char *path, char *buf, \ - SYS_EXECVE = 59 // { int execve(char *fname, char **argv, \ - SYS_UMASK = 60 // { int umask(int newmask); } umask umask_args \ + SYS_READLINK = 58 // { ssize_t readlink(char *path, char *buf, size_t count); } + SYS_EXECVE = 59 // { int execve(char *fname, char **argv, char **envv); } + SYS_UMASK = 60 // { int umask(int newmask); } umask umask_args int SYS_CHROOT = 61 // { int chroot(char *path); } - SYS_MSYNC = 65 // { int msync(void *addr, size_t len, \ + SYS_MSYNC = 65 // { int msync(void *addr, size_t len, int flags); } SYS_VFORK = 66 // { int vfork(void); } SYS_SBRK = 69 // { int sbrk(int incr); } SYS_SSTK = 70 // { int sstk(int incr); } - SYS_OVADVISE = 72 // { int ovadvise(int anom); } vadvise \ + SYS_OVADVISE = 72 // { int ovadvise(int anom); } vadvise ovadvise_args int SYS_MUNMAP = 73 // { int munmap(void *addr, size_t len); } - SYS_MPROTECT = 74 // { int mprotect(const void *addr, size_t len, \ - SYS_MADVISE = 75 // { int madvise(void *addr, size_t len, \ - SYS_MINCORE = 78 // { int mincore(const void *addr, size_t len, \ - SYS_GETGROUPS = 79 // { int getgroups(u_int gidsetsize, \ - SYS_SETGROUPS = 80 // { int setgroups(u_int gidsetsize, \ + SYS_MPROTECT = 74 // { int mprotect(const void *addr, size_t len, int prot); } + SYS_MADVISE = 75 // { int madvise(void *addr, size_t len, int behav); } + SYS_MINCORE = 78 // { int mincore(const void *addr, size_t len, char *vec); } + SYS_GETGROUPS = 79 // { int getgroups(u_int gidsetsize, gid_t *gidset); } + SYS_SETGROUPS = 80 // { int setgroups(u_int gidsetsize, gid_t *gidset); } SYS_GETPGRP = 81 // { int getpgrp(void); } SYS_SETPGID = 82 // { int setpgid(int pid, int pgid); } - SYS_SETITIMER = 83 // { int setitimer(u_int which, struct \ + SYS_SETITIMER = 83 // { int setitimer(u_int which, struct itimerval *itv, struct itimerval *oitv); } SYS_SWAPON = 85 // { int swapon(char *name); } - SYS_GETITIMER = 86 // { int getitimer(u_int which, \ + SYS_GETITIMER = 86 // { int getitimer(u_int which, struct itimerval *itv); } SYS_GETDTABLESIZE = 89 // { int getdtablesize(void); } SYS_DUP2 = 90 // { int dup2(u_int from, u_int to); } SYS_FCNTL = 92 // { int fcntl(int fd, int cmd, long arg); } - SYS_SELECT = 93 // { int select(int nd, fd_set *in, fd_set *ou, \ + SYS_SELECT = 93 // { int select(int nd, fd_set *in, fd_set *ou, fd_set *ex, struct timeval *tv); } SYS_FSYNC = 95 // { int fsync(int fd); } - SYS_SETPRIORITY = 96 // { int setpriority(int which, int who, \ - SYS_SOCKET = 97 // { int socket(int domain, int type, \ - SYS_CONNECT = 98 // { int connect(int s, caddr_t name, \ + SYS_SETPRIORITY = 96 // { int setpriority(int which, int who, int prio); } + SYS_SOCKET = 97 // { int socket(int domain, int type, int protocol); } + SYS_CONNECT = 98 // { int connect(int s, caddr_t name, int namelen); } SYS_GETPRIORITY = 100 // { int getpriority(int which, int who); } - SYS_BIND = 104 // { int bind(int s, caddr_t name, \ - SYS_SETSOCKOPT = 105 // { int setsockopt(int s, int level, int name, \ + SYS_BIND = 104 // { int bind(int s, caddr_t name, int namelen); } + SYS_SETSOCKOPT = 105 // { int setsockopt(int s, int level, int name, caddr_t val, int valsize); } SYS_LISTEN = 106 // { int listen(int s, int backlog); } - SYS_GETTIMEOFDAY = 116 // { int gettimeofday(struct timeval *tp, \ - SYS_GETRUSAGE = 117 // { int getrusage(int who, \ - SYS_GETSOCKOPT = 118 // { int getsockopt(int s, int level, int name, \ - SYS_READV = 120 // { int readv(int fd, struct iovec *iovp, \ - SYS_WRITEV = 121 // { int writev(int fd, struct iovec *iovp, \ - SYS_SETTIMEOFDAY = 122 // { int settimeofday(struct timeval *tv, \ + SYS_GETTIMEOFDAY = 116 // { int gettimeofday(struct timeval *tp, struct timezone *tzp); } + SYS_GETRUSAGE = 117 // { int getrusage(int who, struct rusage *rusage); } + SYS_GETSOCKOPT = 118 // { int getsockopt(int s, int level, int name, caddr_t val, int *avalsize); } + SYS_READV = 120 // { int readv(int fd, struct iovec *iovp, u_int iovcnt); } + SYS_WRITEV = 121 // { int writev(int fd, struct iovec *iovp, u_int iovcnt); } + SYS_SETTIMEOFDAY = 122 // { int settimeofday(struct timeval *tv, struct timezone *tzp); } SYS_FCHOWN = 123 // { int fchown(int fd, int uid, int gid); } SYS_FCHMOD = 124 // { int fchmod(int fd, int mode); } SYS_SETREUID = 126 // { int setreuid(int ruid, int euid); } @@ -99,24 +100,24 @@ const ( SYS_RENAME = 128 // { int rename(char *from, char *to); } SYS_FLOCK = 131 // { int flock(int fd, int how); } SYS_MKFIFO = 132 // { int mkfifo(char *path, int mode); } - SYS_SENDTO = 133 // { int sendto(int s, caddr_t buf, size_t len, \ + SYS_SENDTO = 133 // { int sendto(int s, caddr_t buf, size_t len, int flags, caddr_t to, int tolen); } SYS_SHUTDOWN = 134 // { int shutdown(int s, int how); } - SYS_SOCKETPAIR = 135 // { int socketpair(int domain, int type, \ + SYS_SOCKETPAIR = 135 // { int socketpair(int domain, int type, int protocol, int *rsv); } SYS_MKDIR = 136 // { int mkdir(char *path, int mode); } SYS_RMDIR = 137 // { int rmdir(char *path); } - SYS_UTIMES = 138 // { int utimes(char *path, \ - SYS_ADJTIME = 140 // { int adjtime(struct timeval *delta, \ + SYS_UTIMES = 138 // { int utimes(char *path, struct timeval *tptr); } + SYS_ADJTIME = 140 // { int adjtime(struct timeval *delta, struct timeval *olddelta); } SYS_SETSID = 147 // { int setsid(void); } - SYS_QUOTACTL = 148 // { int quotactl(char *path, int cmd, int uid, \ + SYS_QUOTACTL = 148 // { int quotactl(char *path, int cmd, int uid, caddr_t arg); } SYS_NLM_SYSCALL = 154 // { int nlm_syscall(int debug_level, int grace_period, int addr_count, char **addrs); } SYS_NFSSVC = 155 // { int nfssvc(int flag, caddr_t argp); } - SYS_LGETFH = 160 // { int lgetfh(char *fname, \ - SYS_GETFH = 161 // { int getfh(char *fname, \ + SYS_LGETFH = 160 // { int lgetfh(char *fname, struct fhandle *fhp); } + SYS_GETFH = 161 // { int getfh(char *fname, struct fhandle *fhp); } SYS_SYSARCH = 165 // { int sysarch(int op, char *parms); } - SYS_RTPRIO = 166 // { int rtprio(int function, pid_t pid, \ - SYS_SEMSYS = 169 // { int semsys(int which, int a2, int a3, \ - SYS_MSGSYS = 170 // { int msgsys(int which, int a2, int a3, \ - SYS_SHMSYS = 171 // { int shmsys(int which, int a2, int a3, \ + SYS_RTPRIO = 166 // { int rtprio(int function, pid_t pid, struct rtprio *rtp); } + SYS_SEMSYS = 169 // { int semsys(int which, int a2, int a3, int a4, int a5); } + SYS_MSGSYS = 170 // { int msgsys(int which, int a2, int a3, int a4, int a5, int a6); } + SYS_SHMSYS = 171 // { int shmsys(int which, int a2, int a3, int a4); } SYS_SETFIB = 175 // { int setfib(int fibnum); } SYS_NTP_ADJTIME = 176 // { int ntp_adjtime(struct timex *tp); } SYS_SETGID = 181 // { int setgid(gid_t gid); } @@ -127,269 +128,269 @@ const ( SYS_LSTAT = 190 // { int lstat(char *path, struct stat *ub); } SYS_PATHCONF = 191 // { int pathconf(char *path, int name); } SYS_FPATHCONF = 192 // { int fpathconf(int fd, int name); } - SYS_GETRLIMIT = 194 // { int getrlimit(u_int which, \ - SYS_SETRLIMIT = 195 // { int setrlimit(u_int which, \ - SYS_GETDIRENTRIES = 196 // { int getdirentries(int fd, char *buf, \ - SYS___SYSCTL = 202 // { int __sysctl(int *name, u_int namelen, \ + SYS_GETRLIMIT = 194 // { int getrlimit(u_int which, struct rlimit *rlp); } getrlimit __getrlimit_args int + SYS_SETRLIMIT = 195 // { int setrlimit(u_int which, struct rlimit *rlp); } setrlimit __setrlimit_args int + SYS_GETDIRENTRIES = 196 // { int getdirentries(int fd, char *buf, u_int count, long *basep); } + SYS___SYSCTL = 202 // { int __sysctl(int *name, u_int namelen, void *old, size_t *oldlenp, void *new, size_t newlen); } __sysctl sysctl_args int SYS_MLOCK = 203 // { int mlock(const void *addr, size_t len); } SYS_MUNLOCK = 204 // { int munlock(const void *addr, size_t len); } SYS_UNDELETE = 205 // { int undelete(char *path); } SYS_FUTIMES = 206 // { int futimes(int fd, struct timeval *tptr); } SYS_GETPGID = 207 // { int getpgid(pid_t pid); } - SYS_POLL = 209 // { int poll(struct pollfd *fds, u_int nfds, \ - SYS_SEMGET = 221 // { int semget(key_t key, int nsems, \ - SYS_SEMOP = 222 // { int semop(int semid, struct sembuf *sops, \ + SYS_POLL = 209 // { int poll(struct pollfd *fds, u_int nfds, int timeout); } + SYS_SEMGET = 221 // { int semget(key_t key, int nsems, int semflg); } + SYS_SEMOP = 222 // { int semop(int semid, struct sembuf *sops, size_t nsops); } SYS_MSGGET = 225 // { int msgget(key_t key, int msgflg); } - SYS_MSGSND = 226 // { int msgsnd(int msqid, const void *msgp, \ - SYS_MSGRCV = 227 // { int msgrcv(int msqid, void *msgp, \ - SYS_SHMAT = 228 // { int shmat(int shmid, const void *shmaddr, \ + SYS_MSGSND = 226 // { int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); } + SYS_MSGRCV = 227 // { int msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg); } + SYS_SHMAT = 228 // { int shmat(int shmid, const void *shmaddr, int shmflg); } SYS_SHMDT = 230 // { int shmdt(const void *shmaddr); } - SYS_SHMGET = 231 // { int shmget(key_t key, size_t size, \ - SYS_CLOCK_GETTIME = 232 // { int clock_gettime(clockid_t clock_id, \ - SYS_CLOCK_SETTIME = 233 // { int clock_settime( \ - SYS_CLOCK_GETRES = 234 // { int clock_getres(clockid_t clock_id, \ - SYS_KTIMER_CREATE = 235 // { int ktimer_create(clockid_t clock_id, \ + SYS_SHMGET = 231 // { int shmget(key_t key, size_t size, int shmflg); } + SYS_CLOCK_GETTIME = 232 // { int clock_gettime(clockid_t clock_id, struct timespec *tp); } + SYS_CLOCK_SETTIME = 233 // { int clock_settime( clockid_t clock_id, const struct timespec *tp); } + SYS_CLOCK_GETRES = 234 // { int clock_getres(clockid_t clock_id, struct timespec *tp); } + SYS_KTIMER_CREATE = 235 // { int ktimer_create(clockid_t clock_id, struct sigevent *evp, int *timerid); } SYS_KTIMER_DELETE = 236 // { int ktimer_delete(int timerid); } - SYS_KTIMER_SETTIME = 237 // { int ktimer_settime(int timerid, int flags, \ - SYS_KTIMER_GETTIME = 238 // { int ktimer_gettime(int timerid, struct \ + SYS_KTIMER_SETTIME = 237 // { int ktimer_settime(int timerid, int flags, const struct itimerspec *value, struct itimerspec *ovalue); } + SYS_KTIMER_GETTIME = 238 // { int ktimer_gettime(int timerid, struct itimerspec *value); } SYS_KTIMER_GETOVERRUN = 239 // { int ktimer_getoverrun(int timerid); } - SYS_NANOSLEEP = 240 // { int nanosleep(const struct timespec *rqtp, \ + SYS_NANOSLEEP = 240 // { int nanosleep(const struct timespec *rqtp, struct timespec *rmtp); } SYS_FFCLOCK_GETCOUNTER = 241 // { int ffclock_getcounter(ffcounter *ffcount); } - SYS_FFCLOCK_SETESTIMATE = 242 // { int ffclock_setestimate( \ - SYS_FFCLOCK_GETESTIMATE = 243 // { int ffclock_getestimate( \ - SYS_CLOCK_NANOSLEEP = 244 // { int clock_nanosleep(clockid_t clock_id, \ - SYS_CLOCK_GETCPUCLOCKID2 = 247 // { int clock_getcpuclockid2(id_t id,\ + SYS_FFCLOCK_SETESTIMATE = 242 // { int ffclock_setestimate( struct ffclock_estimate *cest); } + SYS_FFCLOCK_GETESTIMATE = 243 // { int ffclock_getestimate( struct ffclock_estimate *cest); } + SYS_CLOCK_NANOSLEEP = 244 // { int clock_nanosleep(clockid_t clock_id, int flags, const struct timespec *rqtp, struct timespec *rmtp); } + SYS_CLOCK_GETCPUCLOCKID2 = 247 // { int clock_getcpuclockid2(id_t id,int which, clockid_t *clock_id); } SYS_NTP_GETTIME = 248 // { int ntp_gettime(struct ntptimeval *ntvp); } - SYS_MINHERIT = 250 // { int minherit(void *addr, size_t len, \ + SYS_MINHERIT = 250 // { int minherit(void *addr, size_t len, int inherit); } SYS_RFORK = 251 // { int rfork(int flags); } - SYS_OPENBSD_POLL = 252 // { int openbsd_poll(struct pollfd *fds, \ + SYS_OPENBSD_POLL = 252 // { int openbsd_poll(struct pollfd *fds, u_int nfds, int timeout); } SYS_ISSETUGID = 253 // { int issetugid(void); } SYS_LCHOWN = 254 // { int lchown(char *path, int uid, int gid); } SYS_AIO_READ = 255 // { int aio_read(struct aiocb *aiocbp); } SYS_AIO_WRITE = 256 // { int aio_write(struct aiocb *aiocbp); } - SYS_LIO_LISTIO = 257 // { int lio_listio(int mode, \ - SYS_GETDENTS = 272 // { int getdents(int fd, char *buf, \ + SYS_LIO_LISTIO = 257 // { int lio_listio(int mode, struct aiocb * const *acb_list, int nent, struct sigevent *sig); } + SYS_GETDENTS = 272 // { int getdents(int fd, char *buf, size_t count); } SYS_LCHMOD = 274 // { int lchmod(char *path, mode_t mode); } - SYS_LUTIMES = 276 // { int lutimes(char *path, \ + SYS_LUTIMES = 276 // { int lutimes(char *path, struct timeval *tptr); } SYS_NSTAT = 278 // { int nstat(char *path, struct nstat *ub); } SYS_NFSTAT = 279 // { int nfstat(int fd, struct nstat *sb); } SYS_NLSTAT = 280 // { int nlstat(char *path, struct nstat *ub); } - SYS_PREADV = 289 // { ssize_t preadv(int fd, struct iovec *iovp, \ - SYS_PWRITEV = 290 // { ssize_t pwritev(int fd, struct iovec *iovp, \ - SYS_FHOPEN = 298 // { int fhopen(const struct fhandle *u_fhp, \ - SYS_FHSTAT = 299 // { int fhstat(const struct fhandle *u_fhp, \ + SYS_PREADV = 289 // { ssize_t preadv(int fd, struct iovec *iovp, u_int iovcnt, off_t offset); } + SYS_PWRITEV = 290 // { ssize_t pwritev(int fd, struct iovec *iovp, u_int iovcnt, off_t offset); } + SYS_FHOPEN = 298 // { int fhopen(const struct fhandle *u_fhp, int flags); } + SYS_FHSTAT = 299 // { int fhstat(const struct fhandle *u_fhp, struct stat *sb); } SYS_MODNEXT = 300 // { int modnext(int modid); } - SYS_MODSTAT = 301 // { int modstat(int modid, \ + SYS_MODSTAT = 301 // { int modstat(int modid, struct module_stat *stat); } SYS_MODFNEXT = 302 // { int modfnext(int modid); } SYS_MODFIND = 303 // { int modfind(const char *name); } SYS_KLDLOAD = 304 // { int kldload(const char *file); } SYS_KLDUNLOAD = 305 // { int kldunload(int fileid); } SYS_KLDFIND = 306 // { int kldfind(const char *file); } SYS_KLDNEXT = 307 // { int kldnext(int fileid); } - SYS_KLDSTAT = 308 // { int kldstat(int fileid, struct \ + SYS_KLDSTAT = 308 // { int kldstat(int fileid, struct kld_file_stat* stat); } SYS_KLDFIRSTMOD = 309 // { int kldfirstmod(int fileid); } SYS_GETSID = 310 // { int getsid(pid_t pid); } - SYS_SETRESUID = 311 // { int setresuid(uid_t ruid, uid_t euid, \ - SYS_SETRESGID = 312 // { int setresgid(gid_t rgid, gid_t egid, \ + SYS_SETRESUID = 311 // { int setresuid(uid_t ruid, uid_t euid, uid_t suid); } + SYS_SETRESGID = 312 // { int setresgid(gid_t rgid, gid_t egid, gid_t sgid); } SYS_AIO_RETURN = 314 // { ssize_t aio_return(struct aiocb *aiocbp); } - SYS_AIO_SUSPEND = 315 // { int aio_suspend( \ - SYS_AIO_CANCEL = 316 // { int aio_cancel(int fd, \ + SYS_AIO_SUSPEND = 315 // { int aio_suspend( struct aiocb * const * aiocbp, int nent, const struct timespec *timeout); } + SYS_AIO_CANCEL = 316 // { int aio_cancel(int fd, struct aiocb *aiocbp); } SYS_AIO_ERROR = 317 // { int aio_error(struct aiocb *aiocbp); } SYS_YIELD = 321 // { int yield(void); } SYS_MLOCKALL = 324 // { int mlockall(int how); } SYS_MUNLOCKALL = 325 // { int munlockall(void); } SYS___GETCWD = 326 // { int __getcwd(char *buf, u_int buflen); } - SYS_SCHED_SETPARAM = 327 // { int sched_setparam (pid_t pid, \ - SYS_SCHED_GETPARAM = 328 // { int sched_getparam (pid_t pid, struct \ - SYS_SCHED_SETSCHEDULER = 329 // { int sched_setscheduler (pid_t pid, int \ + SYS_SCHED_SETPARAM = 327 // { int sched_setparam (pid_t pid, const struct sched_param *param); } + SYS_SCHED_GETPARAM = 328 // { int sched_getparam (pid_t pid, struct sched_param *param); } + SYS_SCHED_SETSCHEDULER = 329 // { int sched_setscheduler (pid_t pid, int policy, const struct sched_param *param); } SYS_SCHED_GETSCHEDULER = 330 // { int sched_getscheduler (pid_t pid); } SYS_SCHED_YIELD = 331 // { int sched_yield (void); } SYS_SCHED_GET_PRIORITY_MAX = 332 // { int sched_get_priority_max (int policy); } SYS_SCHED_GET_PRIORITY_MIN = 333 // { int sched_get_priority_min (int policy); } - SYS_SCHED_RR_GET_INTERVAL = 334 // { int sched_rr_get_interval (pid_t pid, \ + SYS_SCHED_RR_GET_INTERVAL = 334 // { int sched_rr_get_interval (pid_t pid, struct timespec *interval); } SYS_UTRACE = 335 // { int utrace(const void *addr, size_t len); } - SYS_KLDSYM = 337 // { int kldsym(int fileid, int cmd, \ + SYS_KLDSYM = 337 // { int kldsym(int fileid, int cmd, void *data); } SYS_JAIL = 338 // { int jail(struct jail *jail); } - SYS_SIGPROCMASK = 340 // { int sigprocmask(int how, \ + SYS_SIGPROCMASK = 340 // { int sigprocmask(int how, const sigset_t *set, sigset_t *oset); } SYS_SIGSUSPEND = 341 // { int sigsuspend(const sigset_t *sigmask); } SYS_SIGPENDING = 343 // { int sigpending(sigset_t *set); } - SYS_SIGTIMEDWAIT = 345 // { int sigtimedwait(const sigset_t *set, \ - SYS_SIGWAITINFO = 346 // { int sigwaitinfo(const sigset_t *set, \ - SYS___ACL_GET_FILE = 347 // { int __acl_get_file(const char *path, \ - SYS___ACL_SET_FILE = 348 // { int __acl_set_file(const char *path, \ - SYS___ACL_GET_FD = 349 // { int __acl_get_fd(int filedes, \ - SYS___ACL_SET_FD = 350 // { int __acl_set_fd(int filedes, \ - SYS___ACL_DELETE_FILE = 351 // { int __acl_delete_file(const char *path, \ - SYS___ACL_DELETE_FD = 352 // { int __acl_delete_fd(int filedes, \ - SYS___ACL_ACLCHECK_FILE = 353 // { int __acl_aclcheck_file(const char *path, \ - SYS___ACL_ACLCHECK_FD = 354 // { int __acl_aclcheck_fd(int filedes, \ - SYS_EXTATTRCTL = 355 // { int extattrctl(const char *path, int cmd, \ - SYS_EXTATTR_SET_FILE = 356 // { ssize_t extattr_set_file( \ - SYS_EXTATTR_GET_FILE = 357 // { ssize_t extattr_get_file( \ - SYS_EXTATTR_DELETE_FILE = 358 // { int extattr_delete_file(const char *path, \ - SYS_AIO_WAITCOMPLETE = 359 // { ssize_t aio_waitcomplete( \ - SYS_GETRESUID = 360 // { int getresuid(uid_t *ruid, uid_t *euid, \ - SYS_GETRESGID = 361 // { int getresgid(gid_t *rgid, gid_t *egid, \ + SYS_SIGTIMEDWAIT = 345 // { int sigtimedwait(const sigset_t *set, siginfo_t *info, const struct timespec *timeout); } + SYS_SIGWAITINFO = 346 // { int sigwaitinfo(const sigset_t *set, siginfo_t *info); } + SYS___ACL_GET_FILE = 347 // { int __acl_get_file(const char *path, acl_type_t type, struct acl *aclp); } + SYS___ACL_SET_FILE = 348 // { int __acl_set_file(const char *path, acl_type_t type, struct acl *aclp); } + SYS___ACL_GET_FD = 349 // { int __acl_get_fd(int filedes, acl_type_t type, struct acl *aclp); } + SYS___ACL_SET_FD = 350 // { int __acl_set_fd(int filedes, acl_type_t type, struct acl *aclp); } + SYS___ACL_DELETE_FILE = 351 // { int __acl_delete_file(const char *path, acl_type_t type); } + SYS___ACL_DELETE_FD = 352 // { int __acl_delete_fd(int filedes, acl_type_t type); } + SYS___ACL_ACLCHECK_FILE = 353 // { int __acl_aclcheck_file(const char *path, acl_type_t type, struct acl *aclp); } + SYS___ACL_ACLCHECK_FD = 354 // { int __acl_aclcheck_fd(int filedes, acl_type_t type, struct acl *aclp); } + SYS_EXTATTRCTL = 355 // { int extattrctl(const char *path, int cmd, const char *filename, int attrnamespace, const char *attrname); } + SYS_EXTATTR_SET_FILE = 356 // { ssize_t extattr_set_file( const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_GET_FILE = 357 // { ssize_t extattr_get_file( const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_DELETE_FILE = 358 // { int extattr_delete_file(const char *path, int attrnamespace, const char *attrname); } + SYS_AIO_WAITCOMPLETE = 359 // { ssize_t aio_waitcomplete( struct aiocb **aiocbp, struct timespec *timeout); } + SYS_GETRESUID = 360 // { int getresuid(uid_t *ruid, uid_t *euid, uid_t *suid); } + SYS_GETRESGID = 361 // { int getresgid(gid_t *rgid, gid_t *egid, gid_t *sgid); } SYS_KQUEUE = 362 // { int kqueue(void); } - SYS_KEVENT = 363 // { int kevent(int fd, \ - SYS_EXTATTR_SET_FD = 371 // { ssize_t extattr_set_fd(int fd, \ - SYS_EXTATTR_GET_FD = 372 // { ssize_t extattr_get_fd(int fd, \ - SYS_EXTATTR_DELETE_FD = 373 // { int extattr_delete_fd(int fd, \ + SYS_KEVENT = 363 // { int kevent(int fd, struct kevent *changelist, int nchanges, struct kevent *eventlist, int nevents, const struct timespec *timeout); } + SYS_EXTATTR_SET_FD = 371 // { ssize_t extattr_set_fd(int fd, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_GET_FD = 372 // { ssize_t extattr_get_fd(int fd, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_DELETE_FD = 373 // { int extattr_delete_fd(int fd, int attrnamespace, const char *attrname); } SYS___SETUGID = 374 // { int __setugid(int flag); } SYS_EACCESS = 376 // { int eaccess(char *path, int amode); } - SYS_NMOUNT = 378 // { int nmount(struct iovec *iovp, \ + SYS_NMOUNT = 378 // { int nmount(struct iovec *iovp, unsigned int iovcnt, int flags); } SYS___MAC_GET_PROC = 384 // { int __mac_get_proc(struct mac *mac_p); } SYS___MAC_SET_PROC = 385 // { int __mac_set_proc(struct mac *mac_p); } - SYS___MAC_GET_FD = 386 // { int __mac_get_fd(int fd, \ - SYS___MAC_GET_FILE = 387 // { int __mac_get_file(const char *path_p, \ - SYS___MAC_SET_FD = 388 // { int __mac_set_fd(int fd, \ - SYS___MAC_SET_FILE = 389 // { int __mac_set_file(const char *path_p, \ - SYS_KENV = 390 // { int kenv(int what, const char *name, \ - SYS_LCHFLAGS = 391 // { int lchflags(const char *path, \ - SYS_UUIDGEN = 392 // { int uuidgen(struct uuid *store, \ - SYS_SENDFILE = 393 // { int sendfile(int fd, int s, off_t offset, \ - SYS_MAC_SYSCALL = 394 // { int mac_syscall(const char *policy, \ - SYS_GETFSSTAT = 395 // { int getfsstat(struct statfs *buf, \ - SYS_STATFS = 396 // { int statfs(char *path, \ + SYS___MAC_GET_FD = 386 // { int __mac_get_fd(int fd, struct mac *mac_p); } + SYS___MAC_GET_FILE = 387 // { int __mac_get_file(const char *path_p, struct mac *mac_p); } + SYS___MAC_SET_FD = 388 // { int __mac_set_fd(int fd, struct mac *mac_p); } + SYS___MAC_SET_FILE = 389 // { int __mac_set_file(const char *path_p, struct mac *mac_p); } + SYS_KENV = 390 // { int kenv(int what, const char *name, char *value, int len); } + SYS_LCHFLAGS = 391 // { int lchflags(const char *path, u_long flags); } + SYS_UUIDGEN = 392 // { int uuidgen(struct uuid *store, int count); } + SYS_SENDFILE = 393 // { int sendfile(int fd, int s, off_t offset, size_t nbytes, struct sf_hdtr *hdtr, off_t *sbytes, int flags); } + SYS_MAC_SYSCALL = 394 // { int mac_syscall(const char *policy, int call, void *arg); } + SYS_GETFSSTAT = 395 // { int getfsstat(struct statfs *buf, long bufsize, int mode); } + SYS_STATFS = 396 // { int statfs(char *path, struct statfs *buf); } SYS_FSTATFS = 397 // { int fstatfs(int fd, struct statfs *buf); } - SYS_FHSTATFS = 398 // { int fhstatfs(const struct fhandle *u_fhp, \ + SYS_FHSTATFS = 398 // { int fhstatfs(const struct fhandle *u_fhp, struct statfs *buf); } SYS_KSEM_CLOSE = 400 // { int ksem_close(semid_t id); } SYS_KSEM_POST = 401 // { int ksem_post(semid_t id); } SYS_KSEM_WAIT = 402 // { int ksem_wait(semid_t id); } SYS_KSEM_TRYWAIT = 403 // { int ksem_trywait(semid_t id); } - SYS_KSEM_INIT = 404 // { int ksem_init(semid_t *idp, \ - SYS_KSEM_OPEN = 405 // { int ksem_open(semid_t *idp, \ + SYS_KSEM_INIT = 404 // { int ksem_init(semid_t *idp, unsigned int value); } + SYS_KSEM_OPEN = 405 // { int ksem_open(semid_t *idp, const char *name, int oflag, mode_t mode, unsigned int value); } SYS_KSEM_UNLINK = 406 // { int ksem_unlink(const char *name); } SYS_KSEM_GETVALUE = 407 // { int ksem_getvalue(semid_t id, int *val); } SYS_KSEM_DESTROY = 408 // { int ksem_destroy(semid_t id); } - SYS___MAC_GET_PID = 409 // { int __mac_get_pid(pid_t pid, \ - SYS___MAC_GET_LINK = 410 // { int __mac_get_link(const char *path_p, \ - SYS___MAC_SET_LINK = 411 // { int __mac_set_link(const char *path_p, \ - SYS_EXTATTR_SET_LINK = 412 // { ssize_t extattr_set_link( \ - SYS_EXTATTR_GET_LINK = 413 // { ssize_t extattr_get_link( \ - SYS_EXTATTR_DELETE_LINK = 414 // { int extattr_delete_link( \ - SYS___MAC_EXECVE = 415 // { int __mac_execve(char *fname, char **argv, \ - SYS_SIGACTION = 416 // { int sigaction(int sig, \ - SYS_SIGRETURN = 417 // { int sigreturn( \ + SYS___MAC_GET_PID = 409 // { int __mac_get_pid(pid_t pid, struct mac *mac_p); } + SYS___MAC_GET_LINK = 410 // { int __mac_get_link(const char *path_p, struct mac *mac_p); } + SYS___MAC_SET_LINK = 411 // { int __mac_set_link(const char *path_p, struct mac *mac_p); } + SYS_EXTATTR_SET_LINK = 412 // { ssize_t extattr_set_link( const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_GET_LINK = 413 // { ssize_t extattr_get_link( const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_DELETE_LINK = 414 // { int extattr_delete_link( const char *path, int attrnamespace, const char *attrname); } + SYS___MAC_EXECVE = 415 // { int __mac_execve(char *fname, char **argv, char **envv, struct mac *mac_p); } + SYS_SIGACTION = 416 // { int sigaction(int sig, const struct sigaction *act, struct sigaction *oact); } + SYS_SIGRETURN = 417 // { int sigreturn( const struct __ucontext *sigcntxp); } SYS_GETCONTEXT = 421 // { int getcontext(struct __ucontext *ucp); } - SYS_SETCONTEXT = 422 // { int setcontext( \ - SYS_SWAPCONTEXT = 423 // { int swapcontext(struct __ucontext *oucp, \ + SYS_SETCONTEXT = 422 // { int setcontext( const struct __ucontext *ucp); } + SYS_SWAPCONTEXT = 423 // { int swapcontext(struct __ucontext *oucp, const struct __ucontext *ucp); } SYS_SWAPOFF = 424 // { int swapoff(const char *name); } - SYS___ACL_GET_LINK = 425 // { int __acl_get_link(const char *path, \ - SYS___ACL_SET_LINK = 426 // { int __acl_set_link(const char *path, \ - SYS___ACL_DELETE_LINK = 427 // { int __acl_delete_link(const char *path, \ - SYS___ACL_ACLCHECK_LINK = 428 // { int __acl_aclcheck_link(const char *path, \ - SYS_SIGWAIT = 429 // { int sigwait(const sigset_t *set, \ - SYS_THR_CREATE = 430 // { int thr_create(ucontext_t *ctx, long *id, \ + SYS___ACL_GET_LINK = 425 // { int __acl_get_link(const char *path, acl_type_t type, struct acl *aclp); } + SYS___ACL_SET_LINK = 426 // { int __acl_set_link(const char *path, acl_type_t type, struct acl *aclp); } + SYS___ACL_DELETE_LINK = 427 // { int __acl_delete_link(const char *path, acl_type_t type); } + SYS___ACL_ACLCHECK_LINK = 428 // { int __acl_aclcheck_link(const char *path, acl_type_t type, struct acl *aclp); } + SYS_SIGWAIT = 429 // { int sigwait(const sigset_t *set, int *sig); } + SYS_THR_CREATE = 430 // { int thr_create(ucontext_t *ctx, long *id, int flags); } SYS_THR_EXIT = 431 // { void thr_exit(long *state); } SYS_THR_SELF = 432 // { int thr_self(long *id); } SYS_THR_KILL = 433 // { int thr_kill(long id, int sig); } SYS_JAIL_ATTACH = 436 // { int jail_attach(int jid); } - SYS_EXTATTR_LIST_FD = 437 // { ssize_t extattr_list_fd(int fd, \ - SYS_EXTATTR_LIST_FILE = 438 // { ssize_t extattr_list_file( \ - SYS_EXTATTR_LIST_LINK = 439 // { ssize_t extattr_list_link( \ - SYS_KSEM_TIMEDWAIT = 441 // { int ksem_timedwait(semid_t id, \ - SYS_THR_SUSPEND = 442 // { int thr_suspend( \ + SYS_EXTATTR_LIST_FD = 437 // { ssize_t extattr_list_fd(int fd, int attrnamespace, void *data, size_t nbytes); } + SYS_EXTATTR_LIST_FILE = 438 // { ssize_t extattr_list_file( const char *path, int attrnamespace, void *data, size_t nbytes); } + SYS_EXTATTR_LIST_LINK = 439 // { ssize_t extattr_list_link( const char *path, int attrnamespace, void *data, size_t nbytes); } + SYS_KSEM_TIMEDWAIT = 441 // { int ksem_timedwait(semid_t id, const struct timespec *abstime); } + SYS_THR_SUSPEND = 442 // { int thr_suspend( const struct timespec *timeout); } SYS_THR_WAKE = 443 // { int thr_wake(long id); } SYS_KLDUNLOADF = 444 // { int kldunloadf(int fileid, int flags); } - SYS_AUDIT = 445 // { int audit(const void *record, \ - SYS_AUDITON = 446 // { int auditon(int cmd, void *data, \ + SYS_AUDIT = 445 // { int audit(const void *record, u_int length); } + SYS_AUDITON = 446 // { int auditon(int cmd, void *data, u_int length); } SYS_GETAUID = 447 // { int getauid(uid_t *auid); } SYS_SETAUID = 448 // { int setauid(uid_t *auid); } SYS_GETAUDIT = 449 // { int getaudit(struct auditinfo *auditinfo); } SYS_SETAUDIT = 450 // { int setaudit(struct auditinfo *auditinfo); } - SYS_GETAUDIT_ADDR = 451 // { int getaudit_addr( \ - SYS_SETAUDIT_ADDR = 452 // { int setaudit_addr( \ + SYS_GETAUDIT_ADDR = 451 // { int getaudit_addr( struct auditinfo_addr *auditinfo_addr, u_int length); } + SYS_SETAUDIT_ADDR = 452 // { int setaudit_addr( struct auditinfo_addr *auditinfo_addr, u_int length); } SYS_AUDITCTL = 453 // { int auditctl(char *path); } - SYS__UMTX_OP = 454 // { int _umtx_op(void *obj, int op, \ - SYS_THR_NEW = 455 // { int thr_new(struct thr_param *param, \ + SYS__UMTX_OP = 454 // { int _umtx_op(void *obj, int op, u_long val, void *uaddr1, void *uaddr2); } + SYS_THR_NEW = 455 // { int thr_new(struct thr_param *param, int param_size); } SYS_SIGQUEUE = 456 // { int sigqueue(pid_t pid, int signum, void *value); } - SYS_KMQ_OPEN = 457 // { int kmq_open(const char *path, int flags, \ - SYS_KMQ_SETATTR = 458 // { int kmq_setattr(int mqd, \ - SYS_KMQ_TIMEDRECEIVE = 459 // { int kmq_timedreceive(int mqd, \ - SYS_KMQ_TIMEDSEND = 460 // { int kmq_timedsend(int mqd, \ - SYS_KMQ_NOTIFY = 461 // { int kmq_notify(int mqd, \ + SYS_KMQ_OPEN = 457 // { int kmq_open(const char *path, int flags, mode_t mode, const struct mq_attr *attr); } + SYS_KMQ_SETATTR = 458 // { int kmq_setattr(int mqd, const struct mq_attr *attr, struct mq_attr *oattr); } + SYS_KMQ_TIMEDRECEIVE = 459 // { int kmq_timedreceive(int mqd, char *msg_ptr, size_t msg_len, unsigned *msg_prio, const struct timespec *abs_timeout); } + SYS_KMQ_TIMEDSEND = 460 // { int kmq_timedsend(int mqd, const char *msg_ptr, size_t msg_len,unsigned msg_prio, const struct timespec *abs_timeout);} + SYS_KMQ_NOTIFY = 461 // { int kmq_notify(int mqd, const struct sigevent *sigev); } SYS_KMQ_UNLINK = 462 // { int kmq_unlink(const char *path); } SYS_ABORT2 = 463 // { int abort2(const char *why, int nargs, void **args); } SYS_THR_SET_NAME = 464 // { int thr_set_name(long id, const char *name); } SYS_AIO_FSYNC = 465 // { int aio_fsync(int op, struct aiocb *aiocbp); } - SYS_RTPRIO_THREAD = 466 // { int rtprio_thread(int function, \ + SYS_RTPRIO_THREAD = 466 // { int rtprio_thread(int function, lwpid_t lwpid, struct rtprio *rtp); } SYS_SCTP_PEELOFF = 471 // { int sctp_peeloff(int sd, uint32_t name); } - SYS_SCTP_GENERIC_SENDMSG = 472 // { int sctp_generic_sendmsg(int sd, caddr_t msg, int mlen, \ - SYS_SCTP_GENERIC_SENDMSG_IOV = 473 // { int sctp_generic_sendmsg_iov(int sd, struct iovec *iov, int iovlen, \ - SYS_SCTP_GENERIC_RECVMSG = 474 // { int sctp_generic_recvmsg(int sd, struct iovec *iov, int iovlen, \ - SYS_PREAD = 475 // { ssize_t pread(int fd, void *buf, \ - SYS_PWRITE = 476 // { ssize_t pwrite(int fd, const void *buf, \ - SYS_MMAP = 477 // { caddr_t mmap(caddr_t addr, size_t len, \ - SYS_LSEEK = 478 // { off_t lseek(int fd, off_t offset, \ + SYS_SCTP_GENERIC_SENDMSG = 472 // { int sctp_generic_sendmsg(int sd, caddr_t msg, int mlen, caddr_t to, __socklen_t tolen, struct sctp_sndrcvinfo *sinfo, int flags); } + SYS_SCTP_GENERIC_SENDMSG_IOV = 473 // { int sctp_generic_sendmsg_iov(int sd, struct iovec *iov, int iovlen, caddr_t to, __socklen_t tolen, struct sctp_sndrcvinfo *sinfo, int flags); } + SYS_SCTP_GENERIC_RECVMSG = 474 // { int sctp_generic_recvmsg(int sd, struct iovec *iov, int iovlen, struct sockaddr * from, __socklen_t *fromlenaddr, struct sctp_sndrcvinfo *sinfo, int *msg_flags); } + SYS_PREAD = 475 // { ssize_t pread(int fd, void *buf, size_t nbyte, off_t offset); } + SYS_PWRITE = 476 // { ssize_t pwrite(int fd, const void *buf, size_t nbyte, off_t offset); } + SYS_MMAP = 477 // { caddr_t mmap(caddr_t addr, size_t len, int prot, int flags, int fd, off_t pos); } + SYS_LSEEK = 478 // { off_t lseek(int fd, off_t offset, int whence); } SYS_TRUNCATE = 479 // { int truncate(char *path, off_t length); } SYS_FTRUNCATE = 480 // { int ftruncate(int fd, off_t length); } SYS_THR_KILL2 = 481 // { int thr_kill2(pid_t pid, long id, int sig); } - SYS_SHM_OPEN = 482 // { int shm_open(const char *path, int flags, \ + SYS_SHM_OPEN = 482 // { int shm_open(const char *path, int flags, mode_t mode); } SYS_SHM_UNLINK = 483 // { int shm_unlink(const char *path); } SYS_CPUSET = 484 // { int cpuset(cpusetid_t *setid); } - SYS_CPUSET_SETID = 485 // { int cpuset_setid(cpuwhich_t which, id_t id, \ - SYS_CPUSET_GETID = 486 // { int cpuset_getid(cpulevel_t level, \ - SYS_CPUSET_GETAFFINITY = 487 // { int cpuset_getaffinity(cpulevel_t level, \ - SYS_CPUSET_SETAFFINITY = 488 // { int cpuset_setaffinity(cpulevel_t level, \ - SYS_FACCESSAT = 489 // { int faccessat(int fd, char *path, int amode, \ - SYS_FCHMODAT = 490 // { int fchmodat(int fd, char *path, mode_t mode, \ - SYS_FCHOWNAT = 491 // { int fchownat(int fd, char *path, uid_t uid, \ - SYS_FEXECVE = 492 // { int fexecve(int fd, char **argv, \ - SYS_FSTATAT = 493 // { int fstatat(int fd, char *path, \ - SYS_FUTIMESAT = 494 // { int futimesat(int fd, char *path, \ - SYS_LINKAT = 495 // { int linkat(int fd1, char *path1, int fd2, \ + SYS_CPUSET_SETID = 485 // { int cpuset_setid(cpuwhich_t which, id_t id, cpusetid_t setid); } + SYS_CPUSET_GETID = 486 // { int cpuset_getid(cpulevel_t level, cpuwhich_t which, id_t id, cpusetid_t *setid); } + SYS_CPUSET_GETAFFINITY = 487 // { int cpuset_getaffinity(cpulevel_t level, cpuwhich_t which, id_t id, size_t cpusetsize, cpuset_t *mask); } + SYS_CPUSET_SETAFFINITY = 488 // { int cpuset_setaffinity(cpulevel_t level, cpuwhich_t which, id_t id, size_t cpusetsize, const cpuset_t *mask); } + SYS_FACCESSAT = 489 // { int faccessat(int fd, char *path, int amode, int flag); } + SYS_FCHMODAT = 490 // { int fchmodat(int fd, char *path, mode_t mode, int flag); } + SYS_FCHOWNAT = 491 // { int fchownat(int fd, char *path, uid_t uid, gid_t gid, int flag); } + SYS_FEXECVE = 492 // { int fexecve(int fd, char **argv, char **envv); } + SYS_FSTATAT = 493 // { int fstatat(int fd, char *path, struct stat *buf, int flag); } + SYS_FUTIMESAT = 494 // { int futimesat(int fd, char *path, struct timeval *times); } + SYS_LINKAT = 495 // { int linkat(int fd1, char *path1, int fd2, char *path2, int flag); } SYS_MKDIRAT = 496 // { int mkdirat(int fd, char *path, mode_t mode); } SYS_MKFIFOAT = 497 // { int mkfifoat(int fd, char *path, mode_t mode); } - SYS_MKNODAT = 498 // { int mknodat(int fd, char *path, mode_t mode, \ - SYS_OPENAT = 499 // { int openat(int fd, char *path, int flag, \ - SYS_READLINKAT = 500 // { int readlinkat(int fd, char *path, char *buf, \ - SYS_RENAMEAT = 501 // { int renameat(int oldfd, char *old, int newfd, \ - SYS_SYMLINKAT = 502 // { int symlinkat(char *path1, int fd, \ + SYS_MKNODAT = 498 // { int mknodat(int fd, char *path, mode_t mode, dev_t dev); } + SYS_OPENAT = 499 // { int openat(int fd, char *path, int flag, mode_t mode); } + SYS_READLINKAT = 500 // { int readlinkat(int fd, char *path, char *buf, size_t bufsize); } + SYS_RENAMEAT = 501 // { int renameat(int oldfd, char *old, int newfd, char *new); } + SYS_SYMLINKAT = 502 // { int symlinkat(char *path1, int fd, char *path2); } SYS_UNLINKAT = 503 // { int unlinkat(int fd, char *path, int flag); } SYS_POSIX_OPENPT = 504 // { int posix_openpt(int flags); } SYS_GSSD_SYSCALL = 505 // { int gssd_syscall(char *path); } - SYS_JAIL_GET = 506 // { int jail_get(struct iovec *iovp, \ - SYS_JAIL_SET = 507 // { int jail_set(struct iovec *iovp, \ + SYS_JAIL_GET = 506 // { int jail_get(struct iovec *iovp, unsigned int iovcnt, int flags); } + SYS_JAIL_SET = 507 // { int jail_set(struct iovec *iovp, unsigned int iovcnt, int flags); } SYS_JAIL_REMOVE = 508 // { int jail_remove(int jid); } SYS_CLOSEFROM = 509 // { int closefrom(int lowfd); } - SYS___SEMCTL = 510 // { int __semctl(int semid, int semnum, \ - SYS_MSGCTL = 511 // { int msgctl(int msqid, int cmd, \ - SYS_SHMCTL = 512 // { int shmctl(int shmid, int cmd, \ + SYS___SEMCTL = 510 // { int __semctl(int semid, int semnum, int cmd, union semun *arg); } + SYS_MSGCTL = 511 // { int msgctl(int msqid, int cmd, struct msqid_ds *buf); } + SYS_SHMCTL = 512 // { int shmctl(int shmid, int cmd, struct shmid_ds *buf); } SYS_LPATHCONF = 513 // { int lpathconf(char *path, int name); } - SYS___CAP_RIGHTS_GET = 515 // { int __cap_rights_get(int version, \ + SYS___CAP_RIGHTS_GET = 515 // { int __cap_rights_get(int version, int fd, cap_rights_t *rightsp); } SYS_CAP_ENTER = 516 // { int cap_enter(void); } SYS_CAP_GETMODE = 517 // { int cap_getmode(u_int *modep); } SYS_PDFORK = 518 // { int pdfork(int *fdp, int flags); } SYS_PDKILL = 519 // { int pdkill(int fd, int signum); } SYS_PDGETPID = 520 // { int pdgetpid(int fd, pid_t *pidp); } - SYS_PSELECT = 522 // { int pselect(int nd, fd_set *in, \ - SYS_GETLOGINCLASS = 523 // { int getloginclass(char *namebuf, \ + SYS_PSELECT = 522 // { int pselect(int nd, fd_set *in, fd_set *ou, fd_set *ex, const struct timespec *ts, const sigset_t *sm); } + SYS_GETLOGINCLASS = 523 // { int getloginclass(char *namebuf, size_t namelen); } SYS_SETLOGINCLASS = 524 // { int setloginclass(const char *namebuf); } - SYS_RCTL_GET_RACCT = 525 // { int rctl_get_racct(const void *inbufp, \ - SYS_RCTL_GET_RULES = 526 // { int rctl_get_rules(const void *inbufp, \ - SYS_RCTL_GET_LIMITS = 527 // { int rctl_get_limits(const void *inbufp, \ - SYS_RCTL_ADD_RULE = 528 // { int rctl_add_rule(const void *inbufp, \ - SYS_RCTL_REMOVE_RULE = 529 // { int rctl_remove_rule(const void *inbufp, \ - SYS_POSIX_FALLOCATE = 530 // { int posix_fallocate(int fd, \ - SYS_POSIX_FADVISE = 531 // { int posix_fadvise(int fd, off_t offset, \ - SYS_WAIT6 = 532 // { int wait6(idtype_t idtype, id_t id, \ - SYS_CAP_RIGHTS_LIMIT = 533 // { int cap_rights_limit(int fd, \ - SYS_CAP_IOCTLS_LIMIT = 534 // { int cap_ioctls_limit(int fd, \ - SYS_CAP_IOCTLS_GET = 535 // { ssize_t cap_ioctls_get(int fd, \ - SYS_CAP_FCNTLS_LIMIT = 536 // { int cap_fcntls_limit(int fd, \ - SYS_CAP_FCNTLS_GET = 537 // { int cap_fcntls_get(int fd, \ - SYS_BINDAT = 538 // { int bindat(int fd, int s, caddr_t name, \ - SYS_CONNECTAT = 539 // { int connectat(int fd, int s, caddr_t name, \ - SYS_CHFLAGSAT = 540 // { int chflagsat(int fd, const char *path, \ - SYS_ACCEPT4 = 541 // { int accept4(int s, \ + SYS_RCTL_GET_RACCT = 525 // { int rctl_get_racct(const void *inbufp, size_t inbuflen, void *outbufp, size_t outbuflen); } + SYS_RCTL_GET_RULES = 526 // { int rctl_get_rules(const void *inbufp, size_t inbuflen, void *outbufp, size_t outbuflen); } + SYS_RCTL_GET_LIMITS = 527 // { int rctl_get_limits(const void *inbufp, size_t inbuflen, void *outbufp, size_t outbuflen); } + SYS_RCTL_ADD_RULE = 528 // { int rctl_add_rule(const void *inbufp, size_t inbuflen, void *outbufp, size_t outbuflen); } + SYS_RCTL_REMOVE_RULE = 529 // { int rctl_remove_rule(const void *inbufp, size_t inbuflen, void *outbufp, size_t outbuflen); } + SYS_POSIX_FALLOCATE = 530 // { int posix_fallocate(int fd, off_t offset, off_t len); } + SYS_POSIX_FADVISE = 531 // { int posix_fadvise(int fd, off_t offset, off_t len, int advice); } + SYS_WAIT6 = 532 // { int wait6(idtype_t idtype, id_t id, int *status, int options, struct __wrusage *wrusage, siginfo_t *info); } + SYS_CAP_RIGHTS_LIMIT = 533 // { int cap_rights_limit(int fd, cap_rights_t *rightsp); } + SYS_CAP_IOCTLS_LIMIT = 534 // { int cap_ioctls_limit(int fd, const u_long *cmds, size_t ncmds); } + SYS_CAP_IOCTLS_GET = 535 // { ssize_t cap_ioctls_get(int fd, u_long *cmds, size_t maxcmds); } + SYS_CAP_FCNTLS_LIMIT = 536 // { int cap_fcntls_limit(int fd, uint32_t fcntlrights); } + SYS_CAP_FCNTLS_GET = 537 // { int cap_fcntls_get(int fd, uint32_t *fcntlrightsp); } + SYS_BINDAT = 538 // { int bindat(int fd, int s, caddr_t name, int namelen); } + SYS_CONNECTAT = 539 // { int connectat(int fd, int s, caddr_t name, int namelen); } + SYS_CHFLAGSAT = 540 // { int chflagsat(int fd, const char *path, u_long flags, int atflag); } + SYS_ACCEPT4 = 541 // { int accept4(int s, struct sockaddr * __restrict name, __socklen_t * __restrict anamelen, int flags); } SYS_PIPE2 = 542 // { int pipe2(int *fildes, int flags); } SYS_AIO_MLOCK = 543 // { int aio_mlock(struct aiocb *aiocbp); } - SYS_PROCCTL = 544 // { int procctl(idtype_t idtype, id_t id, \ - SYS_PPOLL = 545 // { int ppoll(struct pollfd *fds, u_int nfds, \ - SYS_FUTIMENS = 546 // { int futimens(int fd, \ - SYS_UTIMENSAT = 547 // { int utimensat(int fd, \ - SYS_NUMA_GETAFFINITY = 548 // { int numa_getaffinity(cpuwhich_t which, \ - SYS_NUMA_SETAFFINITY = 549 // { int numa_setaffinity(cpuwhich_t which, \ + SYS_PROCCTL = 544 // { int procctl(idtype_t idtype, id_t id, int com, void *data); } + SYS_PPOLL = 545 // { int ppoll(struct pollfd *fds, u_int nfds, const struct timespec *ts, const sigset_t *set); } + SYS_FUTIMENS = 546 // { int futimens(int fd, struct timespec *times); } + SYS_UTIMENSAT = 547 // { int utimensat(int fd, char *path, struct timespec *times, int flag); } + SYS_NUMA_GETAFFINITY = 548 // { int numa_getaffinity(cpuwhich_t which, id_t id, struct vm_domain_policy_entry *policy); } + SYS_NUMA_SETAFFINITY = 549 // { int numa_setaffinity(cpuwhich_t which, id_t id, const struct vm_domain_policy_entry *policy); } SYS_FDATASYNC = 550 // { int fdatasync(int fd); } ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go index 8d17873d..33b6e4d1 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go @@ -6,387 +6,421 @@ package unix const ( - SYS_RESTART_SYSCALL = 0 - SYS_EXIT = 1 - SYS_FORK = 2 - SYS_READ = 3 - SYS_WRITE = 4 - SYS_OPEN = 5 - SYS_CLOSE = 6 - SYS_WAITPID = 7 - SYS_CREAT = 8 - SYS_LINK = 9 - SYS_UNLINK = 10 - SYS_EXECVE = 11 - SYS_CHDIR = 12 - SYS_TIME = 13 - SYS_MKNOD = 14 - SYS_CHMOD = 15 - SYS_LCHOWN = 16 - SYS_BREAK = 17 - SYS_OLDSTAT = 18 - SYS_LSEEK = 19 - SYS_GETPID = 20 - SYS_MOUNT = 21 - SYS_UMOUNT = 22 - SYS_SETUID = 23 - SYS_GETUID = 24 - SYS_STIME = 25 - SYS_PTRACE = 26 - SYS_ALARM = 27 - SYS_OLDFSTAT = 28 - SYS_PAUSE = 29 - SYS_UTIME = 30 - SYS_STTY = 31 - SYS_GTTY = 32 - SYS_ACCESS = 33 - SYS_NICE = 34 - SYS_FTIME = 35 - SYS_SYNC = 36 - SYS_KILL = 37 - SYS_RENAME = 38 - SYS_MKDIR = 39 - SYS_RMDIR = 40 - SYS_DUP = 41 - SYS_PIPE = 42 - SYS_TIMES = 43 - SYS_PROF = 44 - SYS_BRK = 45 - SYS_SETGID = 46 - SYS_GETGID = 47 - SYS_SIGNAL = 48 - SYS_GETEUID = 49 - SYS_GETEGID = 50 - SYS_ACCT = 51 - SYS_UMOUNT2 = 52 - SYS_LOCK = 53 - SYS_IOCTL = 54 - SYS_FCNTL = 55 - SYS_MPX = 56 - SYS_SETPGID = 57 - SYS_ULIMIT = 58 - SYS_OLDOLDUNAME = 59 - SYS_UMASK = 60 - SYS_CHROOT = 61 - SYS_USTAT = 62 - SYS_DUP2 = 63 - SYS_GETPPID = 64 - SYS_GETPGRP = 65 - SYS_SETSID = 66 - SYS_SIGACTION = 67 - SYS_SGETMASK = 68 - SYS_SSETMASK = 69 - SYS_SETREUID = 70 - SYS_SETREGID = 71 - SYS_SIGSUSPEND = 72 - SYS_SIGPENDING = 73 - SYS_SETHOSTNAME = 74 - SYS_SETRLIMIT = 75 - SYS_GETRLIMIT = 76 - SYS_GETRUSAGE = 77 - SYS_GETTIMEOFDAY = 78 - SYS_SETTIMEOFDAY = 79 - SYS_GETGROUPS = 80 - SYS_SETGROUPS = 81 - SYS_SELECT = 82 - SYS_SYMLINK = 83 - SYS_OLDLSTAT = 84 - SYS_READLINK = 85 - SYS_USELIB = 86 - SYS_SWAPON = 87 - SYS_REBOOT = 88 - SYS_READDIR = 89 - SYS_MMAP = 90 - SYS_MUNMAP = 91 - SYS_TRUNCATE = 92 - SYS_FTRUNCATE = 93 - SYS_FCHMOD = 94 - SYS_FCHOWN = 95 - SYS_GETPRIORITY = 96 - SYS_SETPRIORITY = 97 - SYS_PROFIL = 98 - SYS_STATFS = 99 - SYS_FSTATFS = 100 - SYS_IOPERM = 101 - SYS_SOCKETCALL = 102 - SYS_SYSLOG = 103 - SYS_SETITIMER = 104 - SYS_GETITIMER = 105 - SYS_STAT = 106 - SYS_LSTAT = 107 - SYS_FSTAT = 108 - SYS_OLDUNAME = 109 - SYS_IOPL = 110 - SYS_VHANGUP = 111 - SYS_IDLE = 112 - SYS_VM86OLD = 113 - SYS_WAIT4 = 114 - SYS_SWAPOFF = 115 - SYS_SYSINFO = 116 - SYS_IPC = 117 - SYS_FSYNC = 118 - SYS_SIGRETURN = 119 - SYS_CLONE = 120 - SYS_SETDOMAINNAME = 121 - SYS_UNAME = 122 - SYS_MODIFY_LDT = 123 - SYS_ADJTIMEX = 124 - SYS_MPROTECT = 125 - SYS_SIGPROCMASK = 126 - SYS_CREATE_MODULE = 127 - SYS_INIT_MODULE = 128 - SYS_DELETE_MODULE = 129 - SYS_GET_KERNEL_SYMS = 130 - SYS_QUOTACTL = 131 - SYS_GETPGID = 132 - SYS_FCHDIR = 133 - SYS_BDFLUSH = 134 - SYS_SYSFS = 135 - SYS_PERSONALITY = 136 - SYS_AFS_SYSCALL = 137 - SYS_SETFSUID = 138 - SYS_SETFSGID = 139 - SYS__LLSEEK = 140 - SYS_GETDENTS = 141 - SYS__NEWSELECT = 142 - SYS_FLOCK = 143 - SYS_MSYNC = 144 - SYS_READV = 145 - SYS_WRITEV = 146 - SYS_GETSID = 147 - SYS_FDATASYNC = 148 - SYS__SYSCTL = 149 - SYS_MLOCK = 150 - SYS_MUNLOCK = 151 - SYS_MLOCKALL = 152 - SYS_MUNLOCKALL = 153 - SYS_SCHED_SETPARAM = 154 - SYS_SCHED_GETPARAM = 155 - SYS_SCHED_SETSCHEDULER = 156 - SYS_SCHED_GETSCHEDULER = 157 - SYS_SCHED_YIELD = 158 - SYS_SCHED_GET_PRIORITY_MAX = 159 - SYS_SCHED_GET_PRIORITY_MIN = 160 - SYS_SCHED_RR_GET_INTERVAL = 161 - SYS_NANOSLEEP = 162 - SYS_MREMAP = 163 - SYS_SETRESUID = 164 - SYS_GETRESUID = 165 - SYS_VM86 = 166 - SYS_QUERY_MODULE = 167 - SYS_POLL = 168 - SYS_NFSSERVCTL = 169 - SYS_SETRESGID = 170 - SYS_GETRESGID = 171 - SYS_PRCTL = 172 - SYS_RT_SIGRETURN = 173 - SYS_RT_SIGACTION = 174 - SYS_RT_SIGPROCMASK = 175 - SYS_RT_SIGPENDING = 176 - SYS_RT_SIGTIMEDWAIT = 177 - SYS_RT_SIGQUEUEINFO = 178 - SYS_RT_SIGSUSPEND = 179 - SYS_PREAD64 = 180 - SYS_PWRITE64 = 181 - SYS_CHOWN = 182 - SYS_GETCWD = 183 - SYS_CAPGET = 184 - SYS_CAPSET = 185 - SYS_SIGALTSTACK = 186 - SYS_SENDFILE = 187 - SYS_GETPMSG = 188 - SYS_PUTPMSG = 189 - SYS_VFORK = 190 - SYS_UGETRLIMIT = 191 - SYS_MMAP2 = 192 - SYS_TRUNCATE64 = 193 - SYS_FTRUNCATE64 = 194 - SYS_STAT64 = 195 - SYS_LSTAT64 = 196 - SYS_FSTAT64 = 197 - SYS_LCHOWN32 = 198 - SYS_GETUID32 = 199 - SYS_GETGID32 = 200 - SYS_GETEUID32 = 201 - SYS_GETEGID32 = 202 - SYS_SETREUID32 = 203 - SYS_SETREGID32 = 204 - SYS_GETGROUPS32 = 205 - SYS_SETGROUPS32 = 206 - SYS_FCHOWN32 = 207 - SYS_SETRESUID32 = 208 - SYS_GETRESUID32 = 209 - SYS_SETRESGID32 = 210 - SYS_GETRESGID32 = 211 - SYS_CHOWN32 = 212 - SYS_SETUID32 = 213 - SYS_SETGID32 = 214 - SYS_SETFSUID32 = 215 - SYS_SETFSGID32 = 216 - SYS_PIVOT_ROOT = 217 - SYS_MINCORE = 218 - SYS_MADVISE = 219 - SYS_GETDENTS64 = 220 - SYS_FCNTL64 = 221 - SYS_GETTID = 224 - SYS_READAHEAD = 225 - SYS_SETXATTR = 226 - SYS_LSETXATTR = 227 - SYS_FSETXATTR = 228 - SYS_GETXATTR = 229 - SYS_LGETXATTR = 230 - SYS_FGETXATTR = 231 - SYS_LISTXATTR = 232 - SYS_LLISTXATTR = 233 - SYS_FLISTXATTR = 234 - SYS_REMOVEXATTR = 235 - SYS_LREMOVEXATTR = 236 - SYS_FREMOVEXATTR = 237 - SYS_TKILL = 238 - SYS_SENDFILE64 = 239 - SYS_FUTEX = 240 - SYS_SCHED_SETAFFINITY = 241 - SYS_SCHED_GETAFFINITY = 242 - SYS_SET_THREAD_AREA = 243 - SYS_GET_THREAD_AREA = 244 - SYS_IO_SETUP = 245 - SYS_IO_DESTROY = 246 - SYS_IO_GETEVENTS = 247 - SYS_IO_SUBMIT = 248 - SYS_IO_CANCEL = 249 - SYS_FADVISE64 = 250 - SYS_EXIT_GROUP = 252 - SYS_LOOKUP_DCOOKIE = 253 - SYS_EPOLL_CREATE = 254 - SYS_EPOLL_CTL = 255 - SYS_EPOLL_WAIT = 256 - SYS_REMAP_FILE_PAGES = 257 - SYS_SET_TID_ADDRESS = 258 - SYS_TIMER_CREATE = 259 - SYS_TIMER_SETTIME = 260 - SYS_TIMER_GETTIME = 261 - SYS_TIMER_GETOVERRUN = 262 - SYS_TIMER_DELETE = 263 - SYS_CLOCK_SETTIME = 264 - SYS_CLOCK_GETTIME = 265 - SYS_CLOCK_GETRES = 266 - SYS_CLOCK_NANOSLEEP = 267 - SYS_STATFS64 = 268 - SYS_FSTATFS64 = 269 - SYS_TGKILL = 270 - SYS_UTIMES = 271 - SYS_FADVISE64_64 = 272 - SYS_VSERVER = 273 - SYS_MBIND = 274 - SYS_GET_MEMPOLICY = 275 - SYS_SET_MEMPOLICY = 276 - SYS_MQ_OPEN = 277 - SYS_MQ_UNLINK = 278 - SYS_MQ_TIMEDSEND = 279 - SYS_MQ_TIMEDRECEIVE = 280 - SYS_MQ_NOTIFY = 281 - SYS_MQ_GETSETATTR = 282 - SYS_KEXEC_LOAD = 283 - SYS_WAITID = 284 - SYS_ADD_KEY = 286 - SYS_REQUEST_KEY = 287 - SYS_KEYCTL = 288 - SYS_IOPRIO_SET = 289 - SYS_IOPRIO_GET = 290 - SYS_INOTIFY_INIT = 291 - SYS_INOTIFY_ADD_WATCH = 292 - SYS_INOTIFY_RM_WATCH = 293 - SYS_MIGRATE_PAGES = 294 - SYS_OPENAT = 295 - SYS_MKDIRAT = 296 - SYS_MKNODAT = 297 - SYS_FCHOWNAT = 298 - SYS_FUTIMESAT = 299 - SYS_FSTATAT64 = 300 - SYS_UNLINKAT = 301 - SYS_RENAMEAT = 302 - SYS_LINKAT = 303 - SYS_SYMLINKAT = 304 - SYS_READLINKAT = 305 - SYS_FCHMODAT = 306 - SYS_FACCESSAT = 307 - SYS_PSELECT6 = 308 - SYS_PPOLL = 309 - SYS_UNSHARE = 310 - SYS_SET_ROBUST_LIST = 311 - SYS_GET_ROBUST_LIST = 312 - SYS_SPLICE = 313 - SYS_SYNC_FILE_RANGE = 314 - SYS_TEE = 315 - SYS_VMSPLICE = 316 - SYS_MOVE_PAGES = 317 - SYS_GETCPU = 318 - SYS_EPOLL_PWAIT = 319 - SYS_UTIMENSAT = 320 - SYS_SIGNALFD = 321 - SYS_TIMERFD_CREATE = 322 - SYS_EVENTFD = 323 - SYS_FALLOCATE = 324 - SYS_TIMERFD_SETTIME = 325 - SYS_TIMERFD_GETTIME = 326 - SYS_SIGNALFD4 = 327 - SYS_EVENTFD2 = 328 - SYS_EPOLL_CREATE1 = 329 - SYS_DUP3 = 330 - SYS_PIPE2 = 331 - SYS_INOTIFY_INIT1 = 332 - SYS_PREADV = 333 - SYS_PWRITEV = 334 - SYS_RT_TGSIGQUEUEINFO = 335 - SYS_PERF_EVENT_OPEN = 336 - SYS_RECVMMSG = 337 - SYS_FANOTIFY_INIT = 338 - SYS_FANOTIFY_MARK = 339 - SYS_PRLIMIT64 = 340 - SYS_NAME_TO_HANDLE_AT = 341 - SYS_OPEN_BY_HANDLE_AT = 342 - SYS_CLOCK_ADJTIME = 343 - SYS_SYNCFS = 344 - SYS_SENDMMSG = 345 - SYS_SETNS = 346 - SYS_PROCESS_VM_READV = 347 - SYS_PROCESS_VM_WRITEV = 348 - SYS_KCMP = 349 - SYS_FINIT_MODULE = 350 - SYS_SCHED_SETATTR = 351 - SYS_SCHED_GETATTR = 352 - SYS_RENAMEAT2 = 353 - SYS_SECCOMP = 354 - SYS_GETRANDOM = 355 - SYS_MEMFD_CREATE = 356 - SYS_BPF = 357 - SYS_EXECVEAT = 358 - SYS_SOCKET = 359 - SYS_SOCKETPAIR = 360 - SYS_BIND = 361 - SYS_CONNECT = 362 - SYS_LISTEN = 363 - SYS_ACCEPT4 = 364 - SYS_GETSOCKOPT = 365 - SYS_SETSOCKOPT = 366 - SYS_GETSOCKNAME = 367 - SYS_GETPEERNAME = 368 - SYS_SENDTO = 369 - SYS_SENDMSG = 370 - SYS_RECVFROM = 371 - SYS_RECVMSG = 372 - SYS_SHUTDOWN = 373 - SYS_USERFAULTFD = 374 - SYS_MEMBARRIER = 375 - SYS_MLOCK2 = 376 - SYS_COPY_FILE_RANGE = 377 - SYS_PREADV2 = 378 - SYS_PWRITEV2 = 379 - SYS_PKEY_MPROTECT = 380 - SYS_PKEY_ALLOC = 381 - SYS_PKEY_FREE = 382 - SYS_STATX = 383 - SYS_ARCH_PRCTL = 384 - SYS_IO_PGETEVENTS = 385 - SYS_RSEQ = 386 + SYS_RESTART_SYSCALL = 0 + SYS_EXIT = 1 + SYS_FORK = 2 + SYS_READ = 3 + SYS_WRITE = 4 + SYS_OPEN = 5 + SYS_CLOSE = 6 + SYS_WAITPID = 7 + SYS_CREAT = 8 + SYS_LINK = 9 + SYS_UNLINK = 10 + SYS_EXECVE = 11 + SYS_CHDIR = 12 + SYS_TIME = 13 + SYS_MKNOD = 14 + SYS_CHMOD = 15 + SYS_LCHOWN = 16 + SYS_BREAK = 17 + SYS_OLDSTAT = 18 + SYS_LSEEK = 19 + SYS_GETPID = 20 + SYS_MOUNT = 21 + SYS_UMOUNT = 22 + SYS_SETUID = 23 + SYS_GETUID = 24 + SYS_STIME = 25 + SYS_PTRACE = 26 + SYS_ALARM = 27 + SYS_OLDFSTAT = 28 + SYS_PAUSE = 29 + SYS_UTIME = 30 + SYS_STTY = 31 + SYS_GTTY = 32 + SYS_ACCESS = 33 + SYS_NICE = 34 + SYS_FTIME = 35 + SYS_SYNC = 36 + SYS_KILL = 37 + SYS_RENAME = 38 + SYS_MKDIR = 39 + SYS_RMDIR = 40 + SYS_DUP = 41 + SYS_PIPE = 42 + SYS_TIMES = 43 + SYS_PROF = 44 + SYS_BRK = 45 + SYS_SETGID = 46 + SYS_GETGID = 47 + SYS_SIGNAL = 48 + SYS_GETEUID = 49 + SYS_GETEGID = 50 + SYS_ACCT = 51 + SYS_UMOUNT2 = 52 + SYS_LOCK = 53 + SYS_IOCTL = 54 + SYS_FCNTL = 55 + SYS_MPX = 56 + SYS_SETPGID = 57 + SYS_ULIMIT = 58 + SYS_OLDOLDUNAME = 59 + SYS_UMASK = 60 + SYS_CHROOT = 61 + SYS_USTAT = 62 + SYS_DUP2 = 63 + SYS_GETPPID = 64 + SYS_GETPGRP = 65 + SYS_SETSID = 66 + SYS_SIGACTION = 67 + SYS_SGETMASK = 68 + SYS_SSETMASK = 69 + SYS_SETREUID = 70 + SYS_SETREGID = 71 + SYS_SIGSUSPEND = 72 + SYS_SIGPENDING = 73 + SYS_SETHOSTNAME = 74 + SYS_SETRLIMIT = 75 + SYS_GETRLIMIT = 76 + SYS_GETRUSAGE = 77 + SYS_GETTIMEOFDAY = 78 + SYS_SETTIMEOFDAY = 79 + SYS_GETGROUPS = 80 + SYS_SETGROUPS = 81 + SYS_SELECT = 82 + SYS_SYMLINK = 83 + SYS_OLDLSTAT = 84 + SYS_READLINK = 85 + SYS_USELIB = 86 + SYS_SWAPON = 87 + SYS_REBOOT = 88 + SYS_READDIR = 89 + SYS_MMAP = 90 + SYS_MUNMAP = 91 + SYS_TRUNCATE = 92 + SYS_FTRUNCATE = 93 + SYS_FCHMOD = 94 + SYS_FCHOWN = 95 + SYS_GETPRIORITY = 96 + SYS_SETPRIORITY = 97 + SYS_PROFIL = 98 + SYS_STATFS = 99 + SYS_FSTATFS = 100 + SYS_IOPERM = 101 + SYS_SOCKETCALL = 102 + SYS_SYSLOG = 103 + SYS_SETITIMER = 104 + SYS_GETITIMER = 105 + SYS_STAT = 106 + SYS_LSTAT = 107 + SYS_FSTAT = 108 + SYS_OLDUNAME = 109 + SYS_IOPL = 110 + SYS_VHANGUP = 111 + SYS_IDLE = 112 + SYS_VM86OLD = 113 + SYS_WAIT4 = 114 + SYS_SWAPOFF = 115 + SYS_SYSINFO = 116 + SYS_IPC = 117 + SYS_FSYNC = 118 + SYS_SIGRETURN = 119 + SYS_CLONE = 120 + SYS_SETDOMAINNAME = 121 + SYS_UNAME = 122 + SYS_MODIFY_LDT = 123 + SYS_ADJTIMEX = 124 + SYS_MPROTECT = 125 + SYS_SIGPROCMASK = 126 + SYS_CREATE_MODULE = 127 + SYS_INIT_MODULE = 128 + SYS_DELETE_MODULE = 129 + SYS_GET_KERNEL_SYMS = 130 + SYS_QUOTACTL = 131 + SYS_GETPGID = 132 + SYS_FCHDIR = 133 + SYS_BDFLUSH = 134 + SYS_SYSFS = 135 + SYS_PERSONALITY = 136 + SYS_AFS_SYSCALL = 137 + SYS_SETFSUID = 138 + SYS_SETFSGID = 139 + SYS__LLSEEK = 140 + SYS_GETDENTS = 141 + SYS__NEWSELECT = 142 + SYS_FLOCK = 143 + SYS_MSYNC = 144 + SYS_READV = 145 + SYS_WRITEV = 146 + SYS_GETSID = 147 + SYS_FDATASYNC = 148 + SYS__SYSCTL = 149 + SYS_MLOCK = 150 + SYS_MUNLOCK = 151 + SYS_MLOCKALL = 152 + SYS_MUNLOCKALL = 153 + SYS_SCHED_SETPARAM = 154 + SYS_SCHED_GETPARAM = 155 + SYS_SCHED_SETSCHEDULER = 156 + SYS_SCHED_GETSCHEDULER = 157 + SYS_SCHED_YIELD = 158 + SYS_SCHED_GET_PRIORITY_MAX = 159 + SYS_SCHED_GET_PRIORITY_MIN = 160 + SYS_SCHED_RR_GET_INTERVAL = 161 + SYS_NANOSLEEP = 162 + SYS_MREMAP = 163 + SYS_SETRESUID = 164 + SYS_GETRESUID = 165 + SYS_VM86 = 166 + SYS_QUERY_MODULE = 167 + SYS_POLL = 168 + SYS_NFSSERVCTL = 169 + SYS_SETRESGID = 170 + SYS_GETRESGID = 171 + SYS_PRCTL = 172 + SYS_RT_SIGRETURN = 173 + SYS_RT_SIGACTION = 174 + SYS_RT_SIGPROCMASK = 175 + SYS_RT_SIGPENDING = 176 + SYS_RT_SIGTIMEDWAIT = 177 + SYS_RT_SIGQUEUEINFO = 178 + SYS_RT_SIGSUSPEND = 179 + SYS_PREAD64 = 180 + SYS_PWRITE64 = 181 + SYS_CHOWN = 182 + SYS_GETCWD = 183 + SYS_CAPGET = 184 + SYS_CAPSET = 185 + SYS_SIGALTSTACK = 186 + SYS_SENDFILE = 187 + SYS_GETPMSG = 188 + SYS_PUTPMSG = 189 + SYS_VFORK = 190 + SYS_UGETRLIMIT = 191 + SYS_MMAP2 = 192 + SYS_TRUNCATE64 = 193 + SYS_FTRUNCATE64 = 194 + SYS_STAT64 = 195 + SYS_LSTAT64 = 196 + SYS_FSTAT64 = 197 + SYS_LCHOWN32 = 198 + SYS_GETUID32 = 199 + SYS_GETGID32 = 200 + SYS_GETEUID32 = 201 + SYS_GETEGID32 = 202 + SYS_SETREUID32 = 203 + SYS_SETREGID32 = 204 + SYS_GETGROUPS32 = 205 + SYS_SETGROUPS32 = 206 + SYS_FCHOWN32 = 207 + SYS_SETRESUID32 = 208 + SYS_GETRESUID32 = 209 + SYS_SETRESGID32 = 210 + SYS_GETRESGID32 = 211 + SYS_CHOWN32 = 212 + SYS_SETUID32 = 213 + SYS_SETGID32 = 214 + SYS_SETFSUID32 = 215 + SYS_SETFSGID32 = 216 + SYS_PIVOT_ROOT = 217 + SYS_MINCORE = 218 + SYS_MADVISE = 219 + SYS_GETDENTS64 = 220 + SYS_FCNTL64 = 221 + SYS_GETTID = 224 + SYS_READAHEAD = 225 + SYS_SETXATTR = 226 + SYS_LSETXATTR = 227 + SYS_FSETXATTR = 228 + SYS_GETXATTR = 229 + SYS_LGETXATTR = 230 + SYS_FGETXATTR = 231 + SYS_LISTXATTR = 232 + SYS_LLISTXATTR = 233 + SYS_FLISTXATTR = 234 + SYS_REMOVEXATTR = 235 + SYS_LREMOVEXATTR = 236 + SYS_FREMOVEXATTR = 237 + SYS_TKILL = 238 + SYS_SENDFILE64 = 239 + SYS_FUTEX = 240 + SYS_SCHED_SETAFFINITY = 241 + SYS_SCHED_GETAFFINITY = 242 + SYS_SET_THREAD_AREA = 243 + SYS_GET_THREAD_AREA = 244 + SYS_IO_SETUP = 245 + SYS_IO_DESTROY = 246 + SYS_IO_GETEVENTS = 247 + SYS_IO_SUBMIT = 248 + SYS_IO_CANCEL = 249 + SYS_FADVISE64 = 250 + SYS_EXIT_GROUP = 252 + SYS_LOOKUP_DCOOKIE = 253 + SYS_EPOLL_CREATE = 254 + SYS_EPOLL_CTL = 255 + SYS_EPOLL_WAIT = 256 + SYS_REMAP_FILE_PAGES = 257 + SYS_SET_TID_ADDRESS = 258 + SYS_TIMER_CREATE = 259 + SYS_TIMER_SETTIME = 260 + SYS_TIMER_GETTIME = 261 + SYS_TIMER_GETOVERRUN = 262 + SYS_TIMER_DELETE = 263 + SYS_CLOCK_SETTIME = 264 + SYS_CLOCK_GETTIME = 265 + SYS_CLOCK_GETRES = 266 + SYS_CLOCK_NANOSLEEP = 267 + SYS_STATFS64 = 268 + SYS_FSTATFS64 = 269 + SYS_TGKILL = 270 + SYS_UTIMES = 271 + SYS_FADVISE64_64 = 272 + SYS_VSERVER = 273 + SYS_MBIND = 274 + SYS_GET_MEMPOLICY = 275 + SYS_SET_MEMPOLICY = 276 + SYS_MQ_OPEN = 277 + SYS_MQ_UNLINK = 278 + SYS_MQ_TIMEDSEND = 279 + SYS_MQ_TIMEDRECEIVE = 280 + SYS_MQ_NOTIFY = 281 + SYS_MQ_GETSETATTR = 282 + SYS_KEXEC_LOAD = 283 + SYS_WAITID = 284 + SYS_ADD_KEY = 286 + SYS_REQUEST_KEY = 287 + SYS_KEYCTL = 288 + SYS_IOPRIO_SET = 289 + SYS_IOPRIO_GET = 290 + SYS_INOTIFY_INIT = 291 + SYS_INOTIFY_ADD_WATCH = 292 + SYS_INOTIFY_RM_WATCH = 293 + SYS_MIGRATE_PAGES = 294 + SYS_OPENAT = 295 + SYS_MKDIRAT = 296 + SYS_MKNODAT = 297 + SYS_FCHOWNAT = 298 + SYS_FUTIMESAT = 299 + SYS_FSTATAT64 = 300 + SYS_UNLINKAT = 301 + SYS_RENAMEAT = 302 + SYS_LINKAT = 303 + SYS_SYMLINKAT = 304 + SYS_READLINKAT = 305 + SYS_FCHMODAT = 306 + SYS_FACCESSAT = 307 + SYS_PSELECT6 = 308 + SYS_PPOLL = 309 + SYS_UNSHARE = 310 + SYS_SET_ROBUST_LIST = 311 + SYS_GET_ROBUST_LIST = 312 + SYS_SPLICE = 313 + SYS_SYNC_FILE_RANGE = 314 + SYS_TEE = 315 + SYS_VMSPLICE = 316 + SYS_MOVE_PAGES = 317 + SYS_GETCPU = 318 + SYS_EPOLL_PWAIT = 319 + SYS_UTIMENSAT = 320 + SYS_SIGNALFD = 321 + SYS_TIMERFD_CREATE = 322 + SYS_EVENTFD = 323 + SYS_FALLOCATE = 324 + SYS_TIMERFD_SETTIME = 325 + SYS_TIMERFD_GETTIME = 326 + SYS_SIGNALFD4 = 327 + SYS_EVENTFD2 = 328 + SYS_EPOLL_CREATE1 = 329 + SYS_DUP3 = 330 + SYS_PIPE2 = 331 + SYS_INOTIFY_INIT1 = 332 + SYS_PREADV = 333 + SYS_PWRITEV = 334 + SYS_RT_TGSIGQUEUEINFO = 335 + SYS_PERF_EVENT_OPEN = 336 + SYS_RECVMMSG = 337 + SYS_FANOTIFY_INIT = 338 + SYS_FANOTIFY_MARK = 339 + SYS_PRLIMIT64 = 340 + SYS_NAME_TO_HANDLE_AT = 341 + SYS_OPEN_BY_HANDLE_AT = 342 + SYS_CLOCK_ADJTIME = 343 + SYS_SYNCFS = 344 + SYS_SENDMMSG = 345 + SYS_SETNS = 346 + SYS_PROCESS_VM_READV = 347 + SYS_PROCESS_VM_WRITEV = 348 + SYS_KCMP = 349 + SYS_FINIT_MODULE = 350 + SYS_SCHED_SETATTR = 351 + SYS_SCHED_GETATTR = 352 + SYS_RENAMEAT2 = 353 + SYS_SECCOMP = 354 + SYS_GETRANDOM = 355 + SYS_MEMFD_CREATE = 356 + SYS_BPF = 357 + SYS_EXECVEAT = 358 + SYS_SOCKET = 359 + SYS_SOCKETPAIR = 360 + SYS_BIND = 361 + SYS_CONNECT = 362 + SYS_LISTEN = 363 + SYS_ACCEPT4 = 364 + SYS_GETSOCKOPT = 365 + SYS_SETSOCKOPT = 366 + SYS_GETSOCKNAME = 367 + SYS_GETPEERNAME = 368 + SYS_SENDTO = 369 + SYS_SENDMSG = 370 + SYS_RECVFROM = 371 + SYS_RECVMSG = 372 + SYS_SHUTDOWN = 373 + SYS_USERFAULTFD = 374 + SYS_MEMBARRIER = 375 + SYS_MLOCK2 = 376 + SYS_COPY_FILE_RANGE = 377 + SYS_PREADV2 = 378 + SYS_PWRITEV2 = 379 + SYS_PKEY_MPROTECT = 380 + SYS_PKEY_ALLOC = 381 + SYS_PKEY_FREE = 382 + SYS_STATX = 383 + SYS_ARCH_PRCTL = 384 + SYS_IO_PGETEVENTS = 385 + SYS_RSEQ = 386 + SYS_SEMGET = 393 + SYS_SEMCTL = 394 + SYS_SHMGET = 395 + SYS_SHMCTL = 396 + SYS_SHMAT = 397 + SYS_SHMDT = 398 + SYS_MSGGET = 399 + SYS_MSGSND = 400 + SYS_MSGRCV = 401 + SYS_MSGCTL = 402 + SYS_CLOCK_GETTIME64 = 403 + SYS_CLOCK_SETTIME64 = 404 + SYS_CLOCK_ADJTIME64 = 405 + SYS_CLOCK_GETRES_TIME64 = 406 + SYS_CLOCK_NANOSLEEP_TIME64 = 407 + SYS_TIMER_GETTIME64 = 408 + SYS_TIMER_SETTIME64 = 409 + SYS_TIMERFD_GETTIME64 = 410 + SYS_TIMERFD_SETTIME64 = 411 + SYS_UTIMENSAT_TIME64 = 412 + SYS_PSELECT6_TIME64 = 413 + SYS_PPOLL_TIME64 = 414 + SYS_IO_PGETEVENTS_TIME64 = 416 + SYS_RECVMMSG_TIME64 = 417 + SYS_MQ_TIMEDSEND_TIME64 = 418 + SYS_MQ_TIMEDRECEIVE_TIME64 = 419 + SYS_SEMTIMEDOP_TIME64 = 420 + SYS_RT_SIGTIMEDWAIT_TIME64 = 421 + SYS_FUTEX_TIME64 = 422 + SYS_SCHED_RR_GET_INTERVAL_TIME64 = 423 + SYS_PIDFD_SEND_SIGNAL = 424 + SYS_IO_URING_SETUP = 425 + SYS_IO_URING_ENTER = 426 + SYS_IO_URING_REGISTER = 427 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go index b3d8ad79..9ba20784 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go @@ -341,4 +341,8 @@ const ( SYS_STATX = 332 SYS_IO_PGETEVENTS = 333 SYS_RSEQ = 334 + SYS_PIDFD_SEND_SIGNAL = 424 + SYS_IO_URING_SETUP = 425 + SYS_IO_URING_ENTER = 426 + SYS_IO_URING_REGISTER = 427 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go index e092822f..94f68f10 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go @@ -6,359 +6,385 @@ package unix const ( - SYS_RESTART_SYSCALL = 0 - SYS_EXIT = 1 - SYS_FORK = 2 - SYS_READ = 3 - SYS_WRITE = 4 - SYS_OPEN = 5 - SYS_CLOSE = 6 - SYS_CREAT = 8 - SYS_LINK = 9 - SYS_UNLINK = 10 - SYS_EXECVE = 11 - SYS_CHDIR = 12 - SYS_MKNOD = 14 - SYS_CHMOD = 15 - SYS_LCHOWN = 16 - SYS_LSEEK = 19 - SYS_GETPID = 20 - SYS_MOUNT = 21 - SYS_SETUID = 23 - SYS_GETUID = 24 - SYS_PTRACE = 26 - SYS_PAUSE = 29 - SYS_ACCESS = 33 - SYS_NICE = 34 - SYS_SYNC = 36 - SYS_KILL = 37 - SYS_RENAME = 38 - SYS_MKDIR = 39 - SYS_RMDIR = 40 - SYS_DUP = 41 - SYS_PIPE = 42 - SYS_TIMES = 43 - SYS_BRK = 45 - SYS_SETGID = 46 - SYS_GETGID = 47 - SYS_GETEUID = 49 - SYS_GETEGID = 50 - SYS_ACCT = 51 - SYS_UMOUNT2 = 52 - SYS_IOCTL = 54 - SYS_FCNTL = 55 - SYS_SETPGID = 57 - SYS_UMASK = 60 - SYS_CHROOT = 61 - SYS_USTAT = 62 - SYS_DUP2 = 63 - SYS_GETPPID = 64 - SYS_GETPGRP = 65 - SYS_SETSID = 66 - SYS_SIGACTION = 67 - SYS_SETREUID = 70 - SYS_SETREGID = 71 - SYS_SIGSUSPEND = 72 - SYS_SIGPENDING = 73 - SYS_SETHOSTNAME = 74 - SYS_SETRLIMIT = 75 - SYS_GETRUSAGE = 77 - SYS_GETTIMEOFDAY = 78 - SYS_SETTIMEOFDAY = 79 - SYS_GETGROUPS = 80 - SYS_SETGROUPS = 81 - SYS_SYMLINK = 83 - SYS_READLINK = 85 - SYS_USELIB = 86 - SYS_SWAPON = 87 - SYS_REBOOT = 88 - SYS_MUNMAP = 91 - SYS_TRUNCATE = 92 - SYS_FTRUNCATE = 93 - SYS_FCHMOD = 94 - SYS_FCHOWN = 95 - SYS_GETPRIORITY = 96 - SYS_SETPRIORITY = 97 - SYS_STATFS = 99 - SYS_FSTATFS = 100 - SYS_SYSLOG = 103 - SYS_SETITIMER = 104 - SYS_GETITIMER = 105 - SYS_STAT = 106 - SYS_LSTAT = 107 - SYS_FSTAT = 108 - SYS_VHANGUP = 111 - SYS_WAIT4 = 114 - SYS_SWAPOFF = 115 - SYS_SYSINFO = 116 - SYS_FSYNC = 118 - SYS_SIGRETURN = 119 - SYS_CLONE = 120 - SYS_SETDOMAINNAME = 121 - SYS_UNAME = 122 - SYS_ADJTIMEX = 124 - SYS_MPROTECT = 125 - SYS_SIGPROCMASK = 126 - SYS_INIT_MODULE = 128 - SYS_DELETE_MODULE = 129 - SYS_QUOTACTL = 131 - SYS_GETPGID = 132 - SYS_FCHDIR = 133 - SYS_BDFLUSH = 134 - SYS_SYSFS = 135 - SYS_PERSONALITY = 136 - SYS_SETFSUID = 138 - SYS_SETFSGID = 139 - SYS__LLSEEK = 140 - SYS_GETDENTS = 141 - SYS__NEWSELECT = 142 - SYS_FLOCK = 143 - SYS_MSYNC = 144 - SYS_READV = 145 - SYS_WRITEV = 146 - SYS_GETSID = 147 - SYS_FDATASYNC = 148 - SYS__SYSCTL = 149 - SYS_MLOCK = 150 - SYS_MUNLOCK = 151 - SYS_MLOCKALL = 152 - SYS_MUNLOCKALL = 153 - SYS_SCHED_SETPARAM = 154 - SYS_SCHED_GETPARAM = 155 - SYS_SCHED_SETSCHEDULER = 156 - SYS_SCHED_GETSCHEDULER = 157 - SYS_SCHED_YIELD = 158 - SYS_SCHED_GET_PRIORITY_MAX = 159 - SYS_SCHED_GET_PRIORITY_MIN = 160 - SYS_SCHED_RR_GET_INTERVAL = 161 - SYS_NANOSLEEP = 162 - SYS_MREMAP = 163 - SYS_SETRESUID = 164 - SYS_GETRESUID = 165 - SYS_POLL = 168 - SYS_NFSSERVCTL = 169 - SYS_SETRESGID = 170 - SYS_GETRESGID = 171 - SYS_PRCTL = 172 - SYS_RT_SIGRETURN = 173 - SYS_RT_SIGACTION = 174 - SYS_RT_SIGPROCMASK = 175 - SYS_RT_SIGPENDING = 176 - SYS_RT_SIGTIMEDWAIT = 177 - SYS_RT_SIGQUEUEINFO = 178 - SYS_RT_SIGSUSPEND = 179 - SYS_PREAD64 = 180 - SYS_PWRITE64 = 181 - SYS_CHOWN = 182 - SYS_GETCWD = 183 - SYS_CAPGET = 184 - SYS_CAPSET = 185 - SYS_SIGALTSTACK = 186 - SYS_SENDFILE = 187 - SYS_VFORK = 190 - SYS_UGETRLIMIT = 191 - SYS_MMAP2 = 192 - SYS_TRUNCATE64 = 193 - SYS_FTRUNCATE64 = 194 - SYS_STAT64 = 195 - SYS_LSTAT64 = 196 - SYS_FSTAT64 = 197 - SYS_LCHOWN32 = 198 - SYS_GETUID32 = 199 - SYS_GETGID32 = 200 - SYS_GETEUID32 = 201 - SYS_GETEGID32 = 202 - SYS_SETREUID32 = 203 - SYS_SETREGID32 = 204 - SYS_GETGROUPS32 = 205 - SYS_SETGROUPS32 = 206 - SYS_FCHOWN32 = 207 - SYS_SETRESUID32 = 208 - SYS_GETRESUID32 = 209 - SYS_SETRESGID32 = 210 - SYS_GETRESGID32 = 211 - SYS_CHOWN32 = 212 - SYS_SETUID32 = 213 - SYS_SETGID32 = 214 - SYS_SETFSUID32 = 215 - SYS_SETFSGID32 = 216 - SYS_GETDENTS64 = 217 - SYS_PIVOT_ROOT = 218 - SYS_MINCORE = 219 - SYS_MADVISE = 220 - SYS_FCNTL64 = 221 - SYS_GETTID = 224 - SYS_READAHEAD = 225 - SYS_SETXATTR = 226 - SYS_LSETXATTR = 227 - SYS_FSETXATTR = 228 - SYS_GETXATTR = 229 - SYS_LGETXATTR = 230 - SYS_FGETXATTR = 231 - SYS_LISTXATTR = 232 - SYS_LLISTXATTR = 233 - SYS_FLISTXATTR = 234 - SYS_REMOVEXATTR = 235 - SYS_LREMOVEXATTR = 236 - SYS_FREMOVEXATTR = 237 - SYS_TKILL = 238 - SYS_SENDFILE64 = 239 - SYS_FUTEX = 240 - SYS_SCHED_SETAFFINITY = 241 - SYS_SCHED_GETAFFINITY = 242 - SYS_IO_SETUP = 243 - SYS_IO_DESTROY = 244 - SYS_IO_GETEVENTS = 245 - SYS_IO_SUBMIT = 246 - SYS_IO_CANCEL = 247 - SYS_EXIT_GROUP = 248 - SYS_LOOKUP_DCOOKIE = 249 - SYS_EPOLL_CREATE = 250 - SYS_EPOLL_CTL = 251 - SYS_EPOLL_WAIT = 252 - SYS_REMAP_FILE_PAGES = 253 - SYS_SET_TID_ADDRESS = 256 - SYS_TIMER_CREATE = 257 - SYS_TIMER_SETTIME = 258 - SYS_TIMER_GETTIME = 259 - SYS_TIMER_GETOVERRUN = 260 - SYS_TIMER_DELETE = 261 - SYS_CLOCK_SETTIME = 262 - SYS_CLOCK_GETTIME = 263 - SYS_CLOCK_GETRES = 264 - SYS_CLOCK_NANOSLEEP = 265 - SYS_STATFS64 = 266 - SYS_FSTATFS64 = 267 - SYS_TGKILL = 268 - SYS_UTIMES = 269 - SYS_ARM_FADVISE64_64 = 270 - SYS_PCICONFIG_IOBASE = 271 - SYS_PCICONFIG_READ = 272 - SYS_PCICONFIG_WRITE = 273 - SYS_MQ_OPEN = 274 - SYS_MQ_UNLINK = 275 - SYS_MQ_TIMEDSEND = 276 - SYS_MQ_TIMEDRECEIVE = 277 - SYS_MQ_NOTIFY = 278 - SYS_MQ_GETSETATTR = 279 - SYS_WAITID = 280 - SYS_SOCKET = 281 - SYS_BIND = 282 - SYS_CONNECT = 283 - SYS_LISTEN = 284 - SYS_ACCEPT = 285 - SYS_GETSOCKNAME = 286 - SYS_GETPEERNAME = 287 - SYS_SOCKETPAIR = 288 - SYS_SEND = 289 - SYS_SENDTO = 290 - SYS_RECV = 291 - SYS_RECVFROM = 292 - SYS_SHUTDOWN = 293 - SYS_SETSOCKOPT = 294 - SYS_GETSOCKOPT = 295 - SYS_SENDMSG = 296 - SYS_RECVMSG = 297 - SYS_SEMOP = 298 - SYS_SEMGET = 299 - SYS_SEMCTL = 300 - SYS_MSGSND = 301 - SYS_MSGRCV = 302 - SYS_MSGGET = 303 - SYS_MSGCTL = 304 - SYS_SHMAT = 305 - SYS_SHMDT = 306 - SYS_SHMGET = 307 - SYS_SHMCTL = 308 - SYS_ADD_KEY = 309 - SYS_REQUEST_KEY = 310 - SYS_KEYCTL = 311 - SYS_SEMTIMEDOP = 312 - SYS_VSERVER = 313 - SYS_IOPRIO_SET = 314 - SYS_IOPRIO_GET = 315 - SYS_INOTIFY_INIT = 316 - SYS_INOTIFY_ADD_WATCH = 317 - SYS_INOTIFY_RM_WATCH = 318 - SYS_MBIND = 319 - SYS_GET_MEMPOLICY = 320 - SYS_SET_MEMPOLICY = 321 - SYS_OPENAT = 322 - SYS_MKDIRAT = 323 - SYS_MKNODAT = 324 - SYS_FCHOWNAT = 325 - SYS_FUTIMESAT = 326 - SYS_FSTATAT64 = 327 - SYS_UNLINKAT = 328 - SYS_RENAMEAT = 329 - SYS_LINKAT = 330 - SYS_SYMLINKAT = 331 - SYS_READLINKAT = 332 - SYS_FCHMODAT = 333 - SYS_FACCESSAT = 334 - SYS_PSELECT6 = 335 - SYS_PPOLL = 336 - SYS_UNSHARE = 337 - SYS_SET_ROBUST_LIST = 338 - SYS_GET_ROBUST_LIST = 339 - SYS_SPLICE = 340 - SYS_ARM_SYNC_FILE_RANGE = 341 - SYS_TEE = 342 - SYS_VMSPLICE = 343 - SYS_MOVE_PAGES = 344 - SYS_GETCPU = 345 - SYS_EPOLL_PWAIT = 346 - SYS_KEXEC_LOAD = 347 - SYS_UTIMENSAT = 348 - SYS_SIGNALFD = 349 - SYS_TIMERFD_CREATE = 350 - SYS_EVENTFD = 351 - SYS_FALLOCATE = 352 - SYS_TIMERFD_SETTIME = 353 - SYS_TIMERFD_GETTIME = 354 - SYS_SIGNALFD4 = 355 - SYS_EVENTFD2 = 356 - SYS_EPOLL_CREATE1 = 357 - SYS_DUP3 = 358 - SYS_PIPE2 = 359 - SYS_INOTIFY_INIT1 = 360 - SYS_PREADV = 361 - SYS_PWRITEV = 362 - SYS_RT_TGSIGQUEUEINFO = 363 - SYS_PERF_EVENT_OPEN = 364 - SYS_RECVMMSG = 365 - SYS_ACCEPT4 = 366 - SYS_FANOTIFY_INIT = 367 - SYS_FANOTIFY_MARK = 368 - SYS_PRLIMIT64 = 369 - SYS_NAME_TO_HANDLE_AT = 370 - SYS_OPEN_BY_HANDLE_AT = 371 - SYS_CLOCK_ADJTIME = 372 - SYS_SYNCFS = 373 - SYS_SENDMMSG = 374 - SYS_SETNS = 375 - SYS_PROCESS_VM_READV = 376 - SYS_PROCESS_VM_WRITEV = 377 - SYS_KCMP = 378 - SYS_FINIT_MODULE = 379 - SYS_SCHED_SETATTR = 380 - SYS_SCHED_GETATTR = 381 - SYS_RENAMEAT2 = 382 - SYS_SECCOMP = 383 - SYS_GETRANDOM = 384 - SYS_MEMFD_CREATE = 385 - SYS_BPF = 386 - SYS_EXECVEAT = 387 - SYS_USERFAULTFD = 388 - SYS_MEMBARRIER = 389 - SYS_MLOCK2 = 390 - SYS_COPY_FILE_RANGE = 391 - SYS_PREADV2 = 392 - SYS_PWRITEV2 = 393 - SYS_PKEY_MPROTECT = 394 - SYS_PKEY_ALLOC = 395 - SYS_PKEY_FREE = 396 - SYS_STATX = 397 - SYS_RSEQ = 398 - SYS_IO_PGETEVENTS = 399 + SYS_RESTART_SYSCALL = 0 + SYS_EXIT = 1 + SYS_FORK = 2 + SYS_READ = 3 + SYS_WRITE = 4 + SYS_OPEN = 5 + SYS_CLOSE = 6 + SYS_CREAT = 8 + SYS_LINK = 9 + SYS_UNLINK = 10 + SYS_EXECVE = 11 + SYS_CHDIR = 12 + SYS_MKNOD = 14 + SYS_CHMOD = 15 + SYS_LCHOWN = 16 + SYS_LSEEK = 19 + SYS_GETPID = 20 + SYS_MOUNT = 21 + SYS_SETUID = 23 + SYS_GETUID = 24 + SYS_PTRACE = 26 + SYS_PAUSE = 29 + SYS_ACCESS = 33 + SYS_NICE = 34 + SYS_SYNC = 36 + SYS_KILL = 37 + SYS_RENAME = 38 + SYS_MKDIR = 39 + SYS_RMDIR = 40 + SYS_DUP = 41 + SYS_PIPE = 42 + SYS_TIMES = 43 + SYS_BRK = 45 + SYS_SETGID = 46 + SYS_GETGID = 47 + SYS_GETEUID = 49 + SYS_GETEGID = 50 + SYS_ACCT = 51 + SYS_UMOUNT2 = 52 + SYS_IOCTL = 54 + SYS_FCNTL = 55 + SYS_SETPGID = 57 + SYS_UMASK = 60 + SYS_CHROOT = 61 + SYS_USTAT = 62 + SYS_DUP2 = 63 + SYS_GETPPID = 64 + SYS_GETPGRP = 65 + SYS_SETSID = 66 + SYS_SIGACTION = 67 + SYS_SETREUID = 70 + SYS_SETREGID = 71 + SYS_SIGSUSPEND = 72 + SYS_SIGPENDING = 73 + SYS_SETHOSTNAME = 74 + SYS_SETRLIMIT = 75 + SYS_GETRUSAGE = 77 + SYS_GETTIMEOFDAY = 78 + SYS_SETTIMEOFDAY = 79 + SYS_GETGROUPS = 80 + SYS_SETGROUPS = 81 + SYS_SYMLINK = 83 + SYS_READLINK = 85 + SYS_USELIB = 86 + SYS_SWAPON = 87 + SYS_REBOOT = 88 + SYS_MUNMAP = 91 + SYS_TRUNCATE = 92 + SYS_FTRUNCATE = 93 + SYS_FCHMOD = 94 + SYS_FCHOWN = 95 + SYS_GETPRIORITY = 96 + SYS_SETPRIORITY = 97 + SYS_STATFS = 99 + SYS_FSTATFS = 100 + SYS_SYSLOG = 103 + SYS_SETITIMER = 104 + SYS_GETITIMER = 105 + SYS_STAT = 106 + SYS_LSTAT = 107 + SYS_FSTAT = 108 + SYS_VHANGUP = 111 + SYS_WAIT4 = 114 + SYS_SWAPOFF = 115 + SYS_SYSINFO = 116 + SYS_FSYNC = 118 + SYS_SIGRETURN = 119 + SYS_CLONE = 120 + SYS_SETDOMAINNAME = 121 + SYS_UNAME = 122 + SYS_ADJTIMEX = 124 + SYS_MPROTECT = 125 + SYS_SIGPROCMASK = 126 + SYS_INIT_MODULE = 128 + SYS_DELETE_MODULE = 129 + SYS_QUOTACTL = 131 + SYS_GETPGID = 132 + SYS_FCHDIR = 133 + SYS_BDFLUSH = 134 + SYS_SYSFS = 135 + SYS_PERSONALITY = 136 + SYS_SETFSUID = 138 + SYS_SETFSGID = 139 + SYS__LLSEEK = 140 + SYS_GETDENTS = 141 + SYS__NEWSELECT = 142 + SYS_FLOCK = 143 + SYS_MSYNC = 144 + SYS_READV = 145 + SYS_WRITEV = 146 + SYS_GETSID = 147 + SYS_FDATASYNC = 148 + SYS__SYSCTL = 149 + SYS_MLOCK = 150 + SYS_MUNLOCK = 151 + SYS_MLOCKALL = 152 + SYS_MUNLOCKALL = 153 + SYS_SCHED_SETPARAM = 154 + SYS_SCHED_GETPARAM = 155 + SYS_SCHED_SETSCHEDULER = 156 + SYS_SCHED_GETSCHEDULER = 157 + SYS_SCHED_YIELD = 158 + SYS_SCHED_GET_PRIORITY_MAX = 159 + SYS_SCHED_GET_PRIORITY_MIN = 160 + SYS_SCHED_RR_GET_INTERVAL = 161 + SYS_NANOSLEEP = 162 + SYS_MREMAP = 163 + SYS_SETRESUID = 164 + SYS_GETRESUID = 165 + SYS_POLL = 168 + SYS_NFSSERVCTL = 169 + SYS_SETRESGID = 170 + SYS_GETRESGID = 171 + SYS_PRCTL = 172 + SYS_RT_SIGRETURN = 173 + SYS_RT_SIGACTION = 174 + SYS_RT_SIGPROCMASK = 175 + SYS_RT_SIGPENDING = 176 + SYS_RT_SIGTIMEDWAIT = 177 + SYS_RT_SIGQUEUEINFO = 178 + SYS_RT_SIGSUSPEND = 179 + SYS_PREAD64 = 180 + SYS_PWRITE64 = 181 + SYS_CHOWN = 182 + SYS_GETCWD = 183 + SYS_CAPGET = 184 + SYS_CAPSET = 185 + SYS_SIGALTSTACK = 186 + SYS_SENDFILE = 187 + SYS_VFORK = 190 + SYS_UGETRLIMIT = 191 + SYS_MMAP2 = 192 + SYS_TRUNCATE64 = 193 + SYS_FTRUNCATE64 = 194 + SYS_STAT64 = 195 + SYS_LSTAT64 = 196 + SYS_FSTAT64 = 197 + SYS_LCHOWN32 = 198 + SYS_GETUID32 = 199 + SYS_GETGID32 = 200 + SYS_GETEUID32 = 201 + SYS_GETEGID32 = 202 + SYS_SETREUID32 = 203 + SYS_SETREGID32 = 204 + SYS_GETGROUPS32 = 205 + SYS_SETGROUPS32 = 206 + SYS_FCHOWN32 = 207 + SYS_SETRESUID32 = 208 + SYS_GETRESUID32 = 209 + SYS_SETRESGID32 = 210 + SYS_GETRESGID32 = 211 + SYS_CHOWN32 = 212 + SYS_SETUID32 = 213 + SYS_SETGID32 = 214 + SYS_SETFSUID32 = 215 + SYS_SETFSGID32 = 216 + SYS_GETDENTS64 = 217 + SYS_PIVOT_ROOT = 218 + SYS_MINCORE = 219 + SYS_MADVISE = 220 + SYS_FCNTL64 = 221 + SYS_GETTID = 224 + SYS_READAHEAD = 225 + SYS_SETXATTR = 226 + SYS_LSETXATTR = 227 + SYS_FSETXATTR = 228 + SYS_GETXATTR = 229 + SYS_LGETXATTR = 230 + SYS_FGETXATTR = 231 + SYS_LISTXATTR = 232 + SYS_LLISTXATTR = 233 + SYS_FLISTXATTR = 234 + SYS_REMOVEXATTR = 235 + SYS_LREMOVEXATTR = 236 + SYS_FREMOVEXATTR = 237 + SYS_TKILL = 238 + SYS_SENDFILE64 = 239 + SYS_FUTEX = 240 + SYS_SCHED_SETAFFINITY = 241 + SYS_SCHED_GETAFFINITY = 242 + SYS_IO_SETUP = 243 + SYS_IO_DESTROY = 244 + SYS_IO_GETEVENTS = 245 + SYS_IO_SUBMIT = 246 + SYS_IO_CANCEL = 247 + SYS_EXIT_GROUP = 248 + SYS_LOOKUP_DCOOKIE = 249 + SYS_EPOLL_CREATE = 250 + SYS_EPOLL_CTL = 251 + SYS_EPOLL_WAIT = 252 + SYS_REMAP_FILE_PAGES = 253 + SYS_SET_TID_ADDRESS = 256 + SYS_TIMER_CREATE = 257 + SYS_TIMER_SETTIME = 258 + SYS_TIMER_GETTIME = 259 + SYS_TIMER_GETOVERRUN = 260 + SYS_TIMER_DELETE = 261 + SYS_CLOCK_SETTIME = 262 + SYS_CLOCK_GETTIME = 263 + SYS_CLOCK_GETRES = 264 + SYS_CLOCK_NANOSLEEP = 265 + SYS_STATFS64 = 266 + SYS_FSTATFS64 = 267 + SYS_TGKILL = 268 + SYS_UTIMES = 269 + SYS_ARM_FADVISE64_64 = 270 + SYS_PCICONFIG_IOBASE = 271 + SYS_PCICONFIG_READ = 272 + SYS_PCICONFIG_WRITE = 273 + SYS_MQ_OPEN = 274 + SYS_MQ_UNLINK = 275 + SYS_MQ_TIMEDSEND = 276 + SYS_MQ_TIMEDRECEIVE = 277 + SYS_MQ_NOTIFY = 278 + SYS_MQ_GETSETATTR = 279 + SYS_WAITID = 280 + SYS_SOCKET = 281 + SYS_BIND = 282 + SYS_CONNECT = 283 + SYS_LISTEN = 284 + SYS_ACCEPT = 285 + SYS_GETSOCKNAME = 286 + SYS_GETPEERNAME = 287 + SYS_SOCKETPAIR = 288 + SYS_SEND = 289 + SYS_SENDTO = 290 + SYS_RECV = 291 + SYS_RECVFROM = 292 + SYS_SHUTDOWN = 293 + SYS_SETSOCKOPT = 294 + SYS_GETSOCKOPT = 295 + SYS_SENDMSG = 296 + SYS_RECVMSG = 297 + SYS_SEMOP = 298 + SYS_SEMGET = 299 + SYS_SEMCTL = 300 + SYS_MSGSND = 301 + SYS_MSGRCV = 302 + SYS_MSGGET = 303 + SYS_MSGCTL = 304 + SYS_SHMAT = 305 + SYS_SHMDT = 306 + SYS_SHMGET = 307 + SYS_SHMCTL = 308 + SYS_ADD_KEY = 309 + SYS_REQUEST_KEY = 310 + SYS_KEYCTL = 311 + SYS_SEMTIMEDOP = 312 + SYS_VSERVER = 313 + SYS_IOPRIO_SET = 314 + SYS_IOPRIO_GET = 315 + SYS_INOTIFY_INIT = 316 + SYS_INOTIFY_ADD_WATCH = 317 + SYS_INOTIFY_RM_WATCH = 318 + SYS_MBIND = 319 + SYS_GET_MEMPOLICY = 320 + SYS_SET_MEMPOLICY = 321 + SYS_OPENAT = 322 + SYS_MKDIRAT = 323 + SYS_MKNODAT = 324 + SYS_FCHOWNAT = 325 + SYS_FUTIMESAT = 326 + SYS_FSTATAT64 = 327 + SYS_UNLINKAT = 328 + SYS_RENAMEAT = 329 + SYS_LINKAT = 330 + SYS_SYMLINKAT = 331 + SYS_READLINKAT = 332 + SYS_FCHMODAT = 333 + SYS_FACCESSAT = 334 + SYS_PSELECT6 = 335 + SYS_PPOLL = 336 + SYS_UNSHARE = 337 + SYS_SET_ROBUST_LIST = 338 + SYS_GET_ROBUST_LIST = 339 + SYS_SPLICE = 340 + SYS_ARM_SYNC_FILE_RANGE = 341 + SYS_TEE = 342 + SYS_VMSPLICE = 343 + SYS_MOVE_PAGES = 344 + SYS_GETCPU = 345 + SYS_EPOLL_PWAIT = 346 + SYS_KEXEC_LOAD = 347 + SYS_UTIMENSAT = 348 + SYS_SIGNALFD = 349 + SYS_TIMERFD_CREATE = 350 + SYS_EVENTFD = 351 + SYS_FALLOCATE = 352 + SYS_TIMERFD_SETTIME = 353 + SYS_TIMERFD_GETTIME = 354 + SYS_SIGNALFD4 = 355 + SYS_EVENTFD2 = 356 + SYS_EPOLL_CREATE1 = 357 + SYS_DUP3 = 358 + SYS_PIPE2 = 359 + SYS_INOTIFY_INIT1 = 360 + SYS_PREADV = 361 + SYS_PWRITEV = 362 + SYS_RT_TGSIGQUEUEINFO = 363 + SYS_PERF_EVENT_OPEN = 364 + SYS_RECVMMSG = 365 + SYS_ACCEPT4 = 366 + SYS_FANOTIFY_INIT = 367 + SYS_FANOTIFY_MARK = 368 + SYS_PRLIMIT64 = 369 + SYS_NAME_TO_HANDLE_AT = 370 + SYS_OPEN_BY_HANDLE_AT = 371 + SYS_CLOCK_ADJTIME = 372 + SYS_SYNCFS = 373 + SYS_SENDMMSG = 374 + SYS_SETNS = 375 + SYS_PROCESS_VM_READV = 376 + SYS_PROCESS_VM_WRITEV = 377 + SYS_KCMP = 378 + SYS_FINIT_MODULE = 379 + SYS_SCHED_SETATTR = 380 + SYS_SCHED_GETATTR = 381 + SYS_RENAMEAT2 = 382 + SYS_SECCOMP = 383 + SYS_GETRANDOM = 384 + SYS_MEMFD_CREATE = 385 + SYS_BPF = 386 + SYS_EXECVEAT = 387 + SYS_USERFAULTFD = 388 + SYS_MEMBARRIER = 389 + SYS_MLOCK2 = 390 + SYS_COPY_FILE_RANGE = 391 + SYS_PREADV2 = 392 + SYS_PWRITEV2 = 393 + SYS_PKEY_MPROTECT = 394 + SYS_PKEY_ALLOC = 395 + SYS_PKEY_FREE = 396 + SYS_STATX = 397 + SYS_RSEQ = 398 + SYS_IO_PGETEVENTS = 399 + SYS_MIGRATE_PAGES = 400 + SYS_KEXEC_FILE_LOAD = 401 + SYS_CLOCK_GETTIME64 = 403 + SYS_CLOCK_SETTIME64 = 404 + SYS_CLOCK_ADJTIME64 = 405 + SYS_CLOCK_GETRES_TIME64 = 406 + SYS_CLOCK_NANOSLEEP_TIME64 = 407 + SYS_TIMER_GETTIME64 = 408 + SYS_TIMER_SETTIME64 = 409 + SYS_TIMERFD_GETTIME64 = 410 + SYS_TIMERFD_SETTIME64 = 411 + SYS_UTIMENSAT_TIME64 = 412 + SYS_PSELECT6_TIME64 = 413 + SYS_PPOLL_TIME64 = 414 + SYS_IO_PGETEVENTS_TIME64 = 416 + SYS_RECVMMSG_TIME64 = 417 + SYS_MQ_TIMEDSEND_TIME64 = 418 + SYS_MQ_TIMEDRECEIVE_TIME64 = 419 + SYS_SEMTIMEDOP_TIME64 = 420 + SYS_RT_SIGTIMEDWAIT_TIME64 = 421 + SYS_FUTEX_TIME64 = 422 + SYS_SCHED_RR_GET_INTERVAL_TIME64 = 423 + SYS_PIDFD_SEND_SIGNAL = 424 + SYS_IO_URING_SETUP = 425 + SYS_IO_URING_ENTER = 426 + SYS_IO_URING_REGISTER = 427 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go index b81d508a..15c41351 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go @@ -286,4 +286,8 @@ const ( SYS_IO_PGETEVENTS = 292 SYS_RSEQ = 293 SYS_KEXEC_FILE_LOAD = 294 + SYS_PIDFD_SEND_SIGNAL = 424 + SYS_IO_URING_SETUP = 425 + SYS_IO_URING_ENTER = 426 + SYS_IO_URING_REGISTER = 427 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go index 6893a5bd..638465b1 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go @@ -6,372 +6,406 @@ package unix const ( - SYS_SYSCALL = 4000 - SYS_EXIT = 4001 - SYS_FORK = 4002 - SYS_READ = 4003 - SYS_WRITE = 4004 - SYS_OPEN = 4005 - SYS_CLOSE = 4006 - SYS_WAITPID = 4007 - SYS_CREAT = 4008 - SYS_LINK = 4009 - SYS_UNLINK = 4010 - SYS_EXECVE = 4011 - SYS_CHDIR = 4012 - SYS_TIME = 4013 - SYS_MKNOD = 4014 - SYS_CHMOD = 4015 - SYS_LCHOWN = 4016 - SYS_BREAK = 4017 - SYS_UNUSED18 = 4018 - SYS_LSEEK = 4019 - SYS_GETPID = 4020 - SYS_MOUNT = 4021 - SYS_UMOUNT = 4022 - SYS_SETUID = 4023 - SYS_GETUID = 4024 - SYS_STIME = 4025 - SYS_PTRACE = 4026 - SYS_ALARM = 4027 - SYS_UNUSED28 = 4028 - SYS_PAUSE = 4029 - SYS_UTIME = 4030 - SYS_STTY = 4031 - SYS_GTTY = 4032 - SYS_ACCESS = 4033 - SYS_NICE = 4034 - SYS_FTIME = 4035 - SYS_SYNC = 4036 - SYS_KILL = 4037 - SYS_RENAME = 4038 - SYS_MKDIR = 4039 - SYS_RMDIR = 4040 - SYS_DUP = 4041 - SYS_PIPE = 4042 - SYS_TIMES = 4043 - SYS_PROF = 4044 - SYS_BRK = 4045 - SYS_SETGID = 4046 - SYS_GETGID = 4047 - SYS_SIGNAL = 4048 - SYS_GETEUID = 4049 - SYS_GETEGID = 4050 - SYS_ACCT = 4051 - SYS_UMOUNT2 = 4052 - SYS_LOCK = 4053 - SYS_IOCTL = 4054 - SYS_FCNTL = 4055 - SYS_MPX = 4056 - SYS_SETPGID = 4057 - SYS_ULIMIT = 4058 - SYS_UNUSED59 = 4059 - SYS_UMASK = 4060 - SYS_CHROOT = 4061 - SYS_USTAT = 4062 - SYS_DUP2 = 4063 - SYS_GETPPID = 4064 - SYS_GETPGRP = 4065 - SYS_SETSID = 4066 - SYS_SIGACTION = 4067 - SYS_SGETMASK = 4068 - SYS_SSETMASK = 4069 - SYS_SETREUID = 4070 - SYS_SETREGID = 4071 - SYS_SIGSUSPEND = 4072 - SYS_SIGPENDING = 4073 - SYS_SETHOSTNAME = 4074 - SYS_SETRLIMIT = 4075 - SYS_GETRLIMIT = 4076 - SYS_GETRUSAGE = 4077 - SYS_GETTIMEOFDAY = 4078 - SYS_SETTIMEOFDAY = 4079 - SYS_GETGROUPS = 4080 - SYS_SETGROUPS = 4081 - SYS_RESERVED82 = 4082 - SYS_SYMLINK = 4083 - SYS_UNUSED84 = 4084 - SYS_READLINK = 4085 - SYS_USELIB = 4086 - SYS_SWAPON = 4087 - SYS_REBOOT = 4088 - SYS_READDIR = 4089 - SYS_MMAP = 4090 - SYS_MUNMAP = 4091 - SYS_TRUNCATE = 4092 - SYS_FTRUNCATE = 4093 - SYS_FCHMOD = 4094 - SYS_FCHOWN = 4095 - SYS_GETPRIORITY = 4096 - SYS_SETPRIORITY = 4097 - SYS_PROFIL = 4098 - SYS_STATFS = 4099 - SYS_FSTATFS = 4100 - SYS_IOPERM = 4101 - SYS_SOCKETCALL = 4102 - SYS_SYSLOG = 4103 - SYS_SETITIMER = 4104 - SYS_GETITIMER = 4105 - SYS_STAT = 4106 - SYS_LSTAT = 4107 - SYS_FSTAT = 4108 - SYS_UNUSED109 = 4109 - SYS_IOPL = 4110 - SYS_VHANGUP = 4111 - SYS_IDLE = 4112 - SYS_VM86 = 4113 - SYS_WAIT4 = 4114 - SYS_SWAPOFF = 4115 - SYS_SYSINFO = 4116 - SYS_IPC = 4117 - SYS_FSYNC = 4118 - SYS_SIGRETURN = 4119 - SYS_CLONE = 4120 - SYS_SETDOMAINNAME = 4121 - SYS_UNAME = 4122 - SYS_MODIFY_LDT = 4123 - SYS_ADJTIMEX = 4124 - SYS_MPROTECT = 4125 - SYS_SIGPROCMASK = 4126 - SYS_CREATE_MODULE = 4127 - SYS_INIT_MODULE = 4128 - SYS_DELETE_MODULE = 4129 - SYS_GET_KERNEL_SYMS = 4130 - SYS_QUOTACTL = 4131 - SYS_GETPGID = 4132 - SYS_FCHDIR = 4133 - SYS_BDFLUSH = 4134 - SYS_SYSFS = 4135 - SYS_PERSONALITY = 4136 - SYS_AFS_SYSCALL = 4137 - SYS_SETFSUID = 4138 - SYS_SETFSGID = 4139 - SYS__LLSEEK = 4140 - SYS_GETDENTS = 4141 - SYS__NEWSELECT = 4142 - SYS_FLOCK = 4143 - SYS_MSYNC = 4144 - SYS_READV = 4145 - SYS_WRITEV = 4146 - SYS_CACHEFLUSH = 4147 - SYS_CACHECTL = 4148 - SYS_SYSMIPS = 4149 - SYS_UNUSED150 = 4150 - SYS_GETSID = 4151 - SYS_FDATASYNC = 4152 - SYS__SYSCTL = 4153 - SYS_MLOCK = 4154 - SYS_MUNLOCK = 4155 - SYS_MLOCKALL = 4156 - SYS_MUNLOCKALL = 4157 - SYS_SCHED_SETPARAM = 4158 - SYS_SCHED_GETPARAM = 4159 - SYS_SCHED_SETSCHEDULER = 4160 - SYS_SCHED_GETSCHEDULER = 4161 - SYS_SCHED_YIELD = 4162 - SYS_SCHED_GET_PRIORITY_MAX = 4163 - SYS_SCHED_GET_PRIORITY_MIN = 4164 - SYS_SCHED_RR_GET_INTERVAL = 4165 - SYS_NANOSLEEP = 4166 - SYS_MREMAP = 4167 - SYS_ACCEPT = 4168 - SYS_BIND = 4169 - SYS_CONNECT = 4170 - SYS_GETPEERNAME = 4171 - SYS_GETSOCKNAME = 4172 - SYS_GETSOCKOPT = 4173 - SYS_LISTEN = 4174 - SYS_RECV = 4175 - SYS_RECVFROM = 4176 - SYS_RECVMSG = 4177 - SYS_SEND = 4178 - SYS_SENDMSG = 4179 - SYS_SENDTO = 4180 - SYS_SETSOCKOPT = 4181 - SYS_SHUTDOWN = 4182 - SYS_SOCKET = 4183 - SYS_SOCKETPAIR = 4184 - SYS_SETRESUID = 4185 - SYS_GETRESUID = 4186 - SYS_QUERY_MODULE = 4187 - SYS_POLL = 4188 - SYS_NFSSERVCTL = 4189 - SYS_SETRESGID = 4190 - SYS_GETRESGID = 4191 - SYS_PRCTL = 4192 - SYS_RT_SIGRETURN = 4193 - SYS_RT_SIGACTION = 4194 - SYS_RT_SIGPROCMASK = 4195 - SYS_RT_SIGPENDING = 4196 - SYS_RT_SIGTIMEDWAIT = 4197 - SYS_RT_SIGQUEUEINFO = 4198 - SYS_RT_SIGSUSPEND = 4199 - SYS_PREAD64 = 4200 - SYS_PWRITE64 = 4201 - SYS_CHOWN = 4202 - SYS_GETCWD = 4203 - SYS_CAPGET = 4204 - SYS_CAPSET = 4205 - SYS_SIGALTSTACK = 4206 - SYS_SENDFILE = 4207 - SYS_GETPMSG = 4208 - SYS_PUTPMSG = 4209 - SYS_MMAP2 = 4210 - SYS_TRUNCATE64 = 4211 - SYS_FTRUNCATE64 = 4212 - SYS_STAT64 = 4213 - SYS_LSTAT64 = 4214 - SYS_FSTAT64 = 4215 - SYS_PIVOT_ROOT = 4216 - SYS_MINCORE = 4217 - SYS_MADVISE = 4218 - SYS_GETDENTS64 = 4219 - SYS_FCNTL64 = 4220 - SYS_RESERVED221 = 4221 - SYS_GETTID = 4222 - SYS_READAHEAD = 4223 - SYS_SETXATTR = 4224 - SYS_LSETXATTR = 4225 - SYS_FSETXATTR = 4226 - SYS_GETXATTR = 4227 - SYS_LGETXATTR = 4228 - SYS_FGETXATTR = 4229 - SYS_LISTXATTR = 4230 - SYS_LLISTXATTR = 4231 - SYS_FLISTXATTR = 4232 - SYS_REMOVEXATTR = 4233 - SYS_LREMOVEXATTR = 4234 - SYS_FREMOVEXATTR = 4235 - SYS_TKILL = 4236 - SYS_SENDFILE64 = 4237 - SYS_FUTEX = 4238 - SYS_SCHED_SETAFFINITY = 4239 - SYS_SCHED_GETAFFINITY = 4240 - SYS_IO_SETUP = 4241 - SYS_IO_DESTROY = 4242 - SYS_IO_GETEVENTS = 4243 - SYS_IO_SUBMIT = 4244 - SYS_IO_CANCEL = 4245 - SYS_EXIT_GROUP = 4246 - SYS_LOOKUP_DCOOKIE = 4247 - SYS_EPOLL_CREATE = 4248 - SYS_EPOLL_CTL = 4249 - SYS_EPOLL_WAIT = 4250 - SYS_REMAP_FILE_PAGES = 4251 - SYS_SET_TID_ADDRESS = 4252 - SYS_RESTART_SYSCALL = 4253 - SYS_FADVISE64 = 4254 - SYS_STATFS64 = 4255 - SYS_FSTATFS64 = 4256 - SYS_TIMER_CREATE = 4257 - SYS_TIMER_SETTIME = 4258 - SYS_TIMER_GETTIME = 4259 - SYS_TIMER_GETOVERRUN = 4260 - SYS_TIMER_DELETE = 4261 - SYS_CLOCK_SETTIME = 4262 - SYS_CLOCK_GETTIME = 4263 - SYS_CLOCK_GETRES = 4264 - SYS_CLOCK_NANOSLEEP = 4265 - SYS_TGKILL = 4266 - SYS_UTIMES = 4267 - SYS_MBIND = 4268 - SYS_GET_MEMPOLICY = 4269 - SYS_SET_MEMPOLICY = 4270 - SYS_MQ_OPEN = 4271 - SYS_MQ_UNLINK = 4272 - SYS_MQ_TIMEDSEND = 4273 - SYS_MQ_TIMEDRECEIVE = 4274 - SYS_MQ_NOTIFY = 4275 - SYS_MQ_GETSETATTR = 4276 - SYS_VSERVER = 4277 - SYS_WAITID = 4278 - SYS_ADD_KEY = 4280 - SYS_REQUEST_KEY = 4281 - SYS_KEYCTL = 4282 - SYS_SET_THREAD_AREA = 4283 - SYS_INOTIFY_INIT = 4284 - SYS_INOTIFY_ADD_WATCH = 4285 - SYS_INOTIFY_RM_WATCH = 4286 - SYS_MIGRATE_PAGES = 4287 - SYS_OPENAT = 4288 - SYS_MKDIRAT = 4289 - SYS_MKNODAT = 4290 - SYS_FCHOWNAT = 4291 - SYS_FUTIMESAT = 4292 - SYS_FSTATAT64 = 4293 - SYS_UNLINKAT = 4294 - SYS_RENAMEAT = 4295 - SYS_LINKAT = 4296 - SYS_SYMLINKAT = 4297 - SYS_READLINKAT = 4298 - SYS_FCHMODAT = 4299 - SYS_FACCESSAT = 4300 - SYS_PSELECT6 = 4301 - SYS_PPOLL = 4302 - SYS_UNSHARE = 4303 - SYS_SPLICE = 4304 - SYS_SYNC_FILE_RANGE = 4305 - SYS_TEE = 4306 - SYS_VMSPLICE = 4307 - SYS_MOVE_PAGES = 4308 - SYS_SET_ROBUST_LIST = 4309 - SYS_GET_ROBUST_LIST = 4310 - SYS_KEXEC_LOAD = 4311 - SYS_GETCPU = 4312 - SYS_EPOLL_PWAIT = 4313 - SYS_IOPRIO_SET = 4314 - SYS_IOPRIO_GET = 4315 - SYS_UTIMENSAT = 4316 - SYS_SIGNALFD = 4317 - SYS_TIMERFD = 4318 - SYS_EVENTFD = 4319 - SYS_FALLOCATE = 4320 - SYS_TIMERFD_CREATE = 4321 - SYS_TIMERFD_GETTIME = 4322 - SYS_TIMERFD_SETTIME = 4323 - SYS_SIGNALFD4 = 4324 - SYS_EVENTFD2 = 4325 - SYS_EPOLL_CREATE1 = 4326 - SYS_DUP3 = 4327 - SYS_PIPE2 = 4328 - SYS_INOTIFY_INIT1 = 4329 - SYS_PREADV = 4330 - SYS_PWRITEV = 4331 - SYS_RT_TGSIGQUEUEINFO = 4332 - SYS_PERF_EVENT_OPEN = 4333 - SYS_ACCEPT4 = 4334 - SYS_RECVMMSG = 4335 - SYS_FANOTIFY_INIT = 4336 - SYS_FANOTIFY_MARK = 4337 - SYS_PRLIMIT64 = 4338 - SYS_NAME_TO_HANDLE_AT = 4339 - SYS_OPEN_BY_HANDLE_AT = 4340 - SYS_CLOCK_ADJTIME = 4341 - SYS_SYNCFS = 4342 - SYS_SENDMMSG = 4343 - SYS_SETNS = 4344 - SYS_PROCESS_VM_READV = 4345 - SYS_PROCESS_VM_WRITEV = 4346 - SYS_KCMP = 4347 - SYS_FINIT_MODULE = 4348 - SYS_SCHED_SETATTR = 4349 - SYS_SCHED_GETATTR = 4350 - SYS_RENAMEAT2 = 4351 - SYS_SECCOMP = 4352 - SYS_GETRANDOM = 4353 - SYS_MEMFD_CREATE = 4354 - SYS_BPF = 4355 - SYS_EXECVEAT = 4356 - SYS_USERFAULTFD = 4357 - SYS_MEMBARRIER = 4358 - SYS_MLOCK2 = 4359 - SYS_COPY_FILE_RANGE = 4360 - SYS_PREADV2 = 4361 - SYS_PWRITEV2 = 4362 - SYS_PKEY_MPROTECT = 4363 - SYS_PKEY_ALLOC = 4364 - SYS_PKEY_FREE = 4365 - SYS_STATX = 4366 - SYS_RSEQ = 4367 - SYS_IO_PGETEVENTS = 4368 + SYS_SYSCALL = 4000 + SYS_EXIT = 4001 + SYS_FORK = 4002 + SYS_READ = 4003 + SYS_WRITE = 4004 + SYS_OPEN = 4005 + SYS_CLOSE = 4006 + SYS_WAITPID = 4007 + SYS_CREAT = 4008 + SYS_LINK = 4009 + SYS_UNLINK = 4010 + SYS_EXECVE = 4011 + SYS_CHDIR = 4012 + SYS_TIME = 4013 + SYS_MKNOD = 4014 + SYS_CHMOD = 4015 + SYS_LCHOWN = 4016 + SYS_BREAK = 4017 + SYS_UNUSED18 = 4018 + SYS_LSEEK = 4019 + SYS_GETPID = 4020 + SYS_MOUNT = 4021 + SYS_UMOUNT = 4022 + SYS_SETUID = 4023 + SYS_GETUID = 4024 + SYS_STIME = 4025 + SYS_PTRACE = 4026 + SYS_ALARM = 4027 + SYS_UNUSED28 = 4028 + SYS_PAUSE = 4029 + SYS_UTIME = 4030 + SYS_STTY = 4031 + SYS_GTTY = 4032 + SYS_ACCESS = 4033 + SYS_NICE = 4034 + SYS_FTIME = 4035 + SYS_SYNC = 4036 + SYS_KILL = 4037 + SYS_RENAME = 4038 + SYS_MKDIR = 4039 + SYS_RMDIR = 4040 + SYS_DUP = 4041 + SYS_PIPE = 4042 + SYS_TIMES = 4043 + SYS_PROF = 4044 + SYS_BRK = 4045 + SYS_SETGID = 4046 + SYS_GETGID = 4047 + SYS_SIGNAL = 4048 + SYS_GETEUID = 4049 + SYS_GETEGID = 4050 + SYS_ACCT = 4051 + SYS_UMOUNT2 = 4052 + SYS_LOCK = 4053 + SYS_IOCTL = 4054 + SYS_FCNTL = 4055 + SYS_MPX = 4056 + SYS_SETPGID = 4057 + SYS_ULIMIT = 4058 + SYS_UNUSED59 = 4059 + SYS_UMASK = 4060 + SYS_CHROOT = 4061 + SYS_USTAT = 4062 + SYS_DUP2 = 4063 + SYS_GETPPID = 4064 + SYS_GETPGRP = 4065 + SYS_SETSID = 4066 + SYS_SIGACTION = 4067 + SYS_SGETMASK = 4068 + SYS_SSETMASK = 4069 + SYS_SETREUID = 4070 + SYS_SETREGID = 4071 + SYS_SIGSUSPEND = 4072 + SYS_SIGPENDING = 4073 + SYS_SETHOSTNAME = 4074 + SYS_SETRLIMIT = 4075 + SYS_GETRLIMIT = 4076 + SYS_GETRUSAGE = 4077 + SYS_GETTIMEOFDAY = 4078 + SYS_SETTIMEOFDAY = 4079 + SYS_GETGROUPS = 4080 + SYS_SETGROUPS = 4081 + SYS_RESERVED82 = 4082 + SYS_SYMLINK = 4083 + SYS_UNUSED84 = 4084 + SYS_READLINK = 4085 + SYS_USELIB = 4086 + SYS_SWAPON = 4087 + SYS_REBOOT = 4088 + SYS_READDIR = 4089 + SYS_MMAP = 4090 + SYS_MUNMAP = 4091 + SYS_TRUNCATE = 4092 + SYS_FTRUNCATE = 4093 + SYS_FCHMOD = 4094 + SYS_FCHOWN = 4095 + SYS_GETPRIORITY = 4096 + SYS_SETPRIORITY = 4097 + SYS_PROFIL = 4098 + SYS_STATFS = 4099 + SYS_FSTATFS = 4100 + SYS_IOPERM = 4101 + SYS_SOCKETCALL = 4102 + SYS_SYSLOG = 4103 + SYS_SETITIMER = 4104 + SYS_GETITIMER = 4105 + SYS_STAT = 4106 + SYS_LSTAT = 4107 + SYS_FSTAT = 4108 + SYS_UNUSED109 = 4109 + SYS_IOPL = 4110 + SYS_VHANGUP = 4111 + SYS_IDLE = 4112 + SYS_VM86 = 4113 + SYS_WAIT4 = 4114 + SYS_SWAPOFF = 4115 + SYS_SYSINFO = 4116 + SYS_IPC = 4117 + SYS_FSYNC = 4118 + SYS_SIGRETURN = 4119 + SYS_CLONE = 4120 + SYS_SETDOMAINNAME = 4121 + SYS_UNAME = 4122 + SYS_MODIFY_LDT = 4123 + SYS_ADJTIMEX = 4124 + SYS_MPROTECT = 4125 + SYS_SIGPROCMASK = 4126 + SYS_CREATE_MODULE = 4127 + SYS_INIT_MODULE = 4128 + SYS_DELETE_MODULE = 4129 + SYS_GET_KERNEL_SYMS = 4130 + SYS_QUOTACTL = 4131 + SYS_GETPGID = 4132 + SYS_FCHDIR = 4133 + SYS_BDFLUSH = 4134 + SYS_SYSFS = 4135 + SYS_PERSONALITY = 4136 + SYS_AFS_SYSCALL = 4137 + SYS_SETFSUID = 4138 + SYS_SETFSGID = 4139 + SYS__LLSEEK = 4140 + SYS_GETDENTS = 4141 + SYS__NEWSELECT = 4142 + SYS_FLOCK = 4143 + SYS_MSYNC = 4144 + SYS_READV = 4145 + SYS_WRITEV = 4146 + SYS_CACHEFLUSH = 4147 + SYS_CACHECTL = 4148 + SYS_SYSMIPS = 4149 + SYS_UNUSED150 = 4150 + SYS_GETSID = 4151 + SYS_FDATASYNC = 4152 + SYS__SYSCTL = 4153 + SYS_MLOCK = 4154 + SYS_MUNLOCK = 4155 + SYS_MLOCKALL = 4156 + SYS_MUNLOCKALL = 4157 + SYS_SCHED_SETPARAM = 4158 + SYS_SCHED_GETPARAM = 4159 + SYS_SCHED_SETSCHEDULER = 4160 + SYS_SCHED_GETSCHEDULER = 4161 + SYS_SCHED_YIELD = 4162 + SYS_SCHED_GET_PRIORITY_MAX = 4163 + SYS_SCHED_GET_PRIORITY_MIN = 4164 + SYS_SCHED_RR_GET_INTERVAL = 4165 + SYS_NANOSLEEP = 4166 + SYS_MREMAP = 4167 + SYS_ACCEPT = 4168 + SYS_BIND = 4169 + SYS_CONNECT = 4170 + SYS_GETPEERNAME = 4171 + SYS_GETSOCKNAME = 4172 + SYS_GETSOCKOPT = 4173 + SYS_LISTEN = 4174 + SYS_RECV = 4175 + SYS_RECVFROM = 4176 + SYS_RECVMSG = 4177 + SYS_SEND = 4178 + SYS_SENDMSG = 4179 + SYS_SENDTO = 4180 + SYS_SETSOCKOPT = 4181 + SYS_SHUTDOWN = 4182 + SYS_SOCKET = 4183 + SYS_SOCKETPAIR = 4184 + SYS_SETRESUID = 4185 + SYS_GETRESUID = 4186 + SYS_QUERY_MODULE = 4187 + SYS_POLL = 4188 + SYS_NFSSERVCTL = 4189 + SYS_SETRESGID = 4190 + SYS_GETRESGID = 4191 + SYS_PRCTL = 4192 + SYS_RT_SIGRETURN = 4193 + SYS_RT_SIGACTION = 4194 + SYS_RT_SIGPROCMASK = 4195 + SYS_RT_SIGPENDING = 4196 + SYS_RT_SIGTIMEDWAIT = 4197 + SYS_RT_SIGQUEUEINFO = 4198 + SYS_RT_SIGSUSPEND = 4199 + SYS_PREAD64 = 4200 + SYS_PWRITE64 = 4201 + SYS_CHOWN = 4202 + SYS_GETCWD = 4203 + SYS_CAPGET = 4204 + SYS_CAPSET = 4205 + SYS_SIGALTSTACK = 4206 + SYS_SENDFILE = 4207 + SYS_GETPMSG = 4208 + SYS_PUTPMSG = 4209 + SYS_MMAP2 = 4210 + SYS_TRUNCATE64 = 4211 + SYS_FTRUNCATE64 = 4212 + SYS_STAT64 = 4213 + SYS_LSTAT64 = 4214 + SYS_FSTAT64 = 4215 + SYS_PIVOT_ROOT = 4216 + SYS_MINCORE = 4217 + SYS_MADVISE = 4218 + SYS_GETDENTS64 = 4219 + SYS_FCNTL64 = 4220 + SYS_RESERVED221 = 4221 + SYS_GETTID = 4222 + SYS_READAHEAD = 4223 + SYS_SETXATTR = 4224 + SYS_LSETXATTR = 4225 + SYS_FSETXATTR = 4226 + SYS_GETXATTR = 4227 + SYS_LGETXATTR = 4228 + SYS_FGETXATTR = 4229 + SYS_LISTXATTR = 4230 + SYS_LLISTXATTR = 4231 + SYS_FLISTXATTR = 4232 + SYS_REMOVEXATTR = 4233 + SYS_LREMOVEXATTR = 4234 + SYS_FREMOVEXATTR = 4235 + SYS_TKILL = 4236 + SYS_SENDFILE64 = 4237 + SYS_FUTEX = 4238 + SYS_SCHED_SETAFFINITY = 4239 + SYS_SCHED_GETAFFINITY = 4240 + SYS_IO_SETUP = 4241 + SYS_IO_DESTROY = 4242 + SYS_IO_GETEVENTS = 4243 + SYS_IO_SUBMIT = 4244 + SYS_IO_CANCEL = 4245 + SYS_EXIT_GROUP = 4246 + SYS_LOOKUP_DCOOKIE = 4247 + SYS_EPOLL_CREATE = 4248 + SYS_EPOLL_CTL = 4249 + SYS_EPOLL_WAIT = 4250 + SYS_REMAP_FILE_PAGES = 4251 + SYS_SET_TID_ADDRESS = 4252 + SYS_RESTART_SYSCALL = 4253 + SYS_FADVISE64 = 4254 + SYS_STATFS64 = 4255 + SYS_FSTATFS64 = 4256 + SYS_TIMER_CREATE = 4257 + SYS_TIMER_SETTIME = 4258 + SYS_TIMER_GETTIME = 4259 + SYS_TIMER_GETOVERRUN = 4260 + SYS_TIMER_DELETE = 4261 + SYS_CLOCK_SETTIME = 4262 + SYS_CLOCK_GETTIME = 4263 + SYS_CLOCK_GETRES = 4264 + SYS_CLOCK_NANOSLEEP = 4265 + SYS_TGKILL = 4266 + SYS_UTIMES = 4267 + SYS_MBIND = 4268 + SYS_GET_MEMPOLICY = 4269 + SYS_SET_MEMPOLICY = 4270 + SYS_MQ_OPEN = 4271 + SYS_MQ_UNLINK = 4272 + SYS_MQ_TIMEDSEND = 4273 + SYS_MQ_TIMEDRECEIVE = 4274 + SYS_MQ_NOTIFY = 4275 + SYS_MQ_GETSETATTR = 4276 + SYS_VSERVER = 4277 + SYS_WAITID = 4278 + SYS_ADD_KEY = 4280 + SYS_REQUEST_KEY = 4281 + SYS_KEYCTL = 4282 + SYS_SET_THREAD_AREA = 4283 + SYS_INOTIFY_INIT = 4284 + SYS_INOTIFY_ADD_WATCH = 4285 + SYS_INOTIFY_RM_WATCH = 4286 + SYS_MIGRATE_PAGES = 4287 + SYS_OPENAT = 4288 + SYS_MKDIRAT = 4289 + SYS_MKNODAT = 4290 + SYS_FCHOWNAT = 4291 + SYS_FUTIMESAT = 4292 + SYS_FSTATAT64 = 4293 + SYS_UNLINKAT = 4294 + SYS_RENAMEAT = 4295 + SYS_LINKAT = 4296 + SYS_SYMLINKAT = 4297 + SYS_READLINKAT = 4298 + SYS_FCHMODAT = 4299 + SYS_FACCESSAT = 4300 + SYS_PSELECT6 = 4301 + SYS_PPOLL = 4302 + SYS_UNSHARE = 4303 + SYS_SPLICE = 4304 + SYS_SYNC_FILE_RANGE = 4305 + SYS_TEE = 4306 + SYS_VMSPLICE = 4307 + SYS_MOVE_PAGES = 4308 + SYS_SET_ROBUST_LIST = 4309 + SYS_GET_ROBUST_LIST = 4310 + SYS_KEXEC_LOAD = 4311 + SYS_GETCPU = 4312 + SYS_EPOLL_PWAIT = 4313 + SYS_IOPRIO_SET = 4314 + SYS_IOPRIO_GET = 4315 + SYS_UTIMENSAT = 4316 + SYS_SIGNALFD = 4317 + SYS_TIMERFD = 4318 + SYS_EVENTFD = 4319 + SYS_FALLOCATE = 4320 + SYS_TIMERFD_CREATE = 4321 + SYS_TIMERFD_GETTIME = 4322 + SYS_TIMERFD_SETTIME = 4323 + SYS_SIGNALFD4 = 4324 + SYS_EVENTFD2 = 4325 + SYS_EPOLL_CREATE1 = 4326 + SYS_DUP3 = 4327 + SYS_PIPE2 = 4328 + SYS_INOTIFY_INIT1 = 4329 + SYS_PREADV = 4330 + SYS_PWRITEV = 4331 + SYS_RT_TGSIGQUEUEINFO = 4332 + SYS_PERF_EVENT_OPEN = 4333 + SYS_ACCEPT4 = 4334 + SYS_RECVMMSG = 4335 + SYS_FANOTIFY_INIT = 4336 + SYS_FANOTIFY_MARK = 4337 + SYS_PRLIMIT64 = 4338 + SYS_NAME_TO_HANDLE_AT = 4339 + SYS_OPEN_BY_HANDLE_AT = 4340 + SYS_CLOCK_ADJTIME = 4341 + SYS_SYNCFS = 4342 + SYS_SENDMMSG = 4343 + SYS_SETNS = 4344 + SYS_PROCESS_VM_READV = 4345 + SYS_PROCESS_VM_WRITEV = 4346 + SYS_KCMP = 4347 + SYS_FINIT_MODULE = 4348 + SYS_SCHED_SETATTR = 4349 + SYS_SCHED_GETATTR = 4350 + SYS_RENAMEAT2 = 4351 + SYS_SECCOMP = 4352 + SYS_GETRANDOM = 4353 + SYS_MEMFD_CREATE = 4354 + SYS_BPF = 4355 + SYS_EXECVEAT = 4356 + SYS_USERFAULTFD = 4357 + SYS_MEMBARRIER = 4358 + SYS_MLOCK2 = 4359 + SYS_COPY_FILE_RANGE = 4360 + SYS_PREADV2 = 4361 + SYS_PWRITEV2 = 4362 + SYS_PKEY_MPROTECT = 4363 + SYS_PKEY_ALLOC = 4364 + SYS_PKEY_FREE = 4365 + SYS_STATX = 4366 + SYS_RSEQ = 4367 + SYS_IO_PGETEVENTS = 4368 + SYS_SEMGET = 4393 + SYS_SEMCTL = 4394 + SYS_SHMGET = 4395 + SYS_SHMCTL = 4396 + SYS_SHMAT = 4397 + SYS_SHMDT = 4398 + SYS_MSGGET = 4399 + SYS_MSGSND = 4400 + SYS_MSGRCV = 4401 + SYS_MSGCTL = 4402 + SYS_CLOCK_GETTIME64 = 4403 + SYS_CLOCK_SETTIME64 = 4404 + SYS_CLOCK_ADJTIME64 = 4405 + SYS_CLOCK_GETRES_TIME64 = 4406 + SYS_CLOCK_NANOSLEEP_TIME64 = 4407 + SYS_TIMER_GETTIME64 = 4408 + SYS_TIMER_SETTIME64 = 4409 + SYS_TIMERFD_GETTIME64 = 4410 + SYS_TIMERFD_SETTIME64 = 4411 + SYS_UTIMENSAT_TIME64 = 4412 + SYS_PSELECT6_TIME64 = 4413 + SYS_PPOLL_TIME64 = 4414 + SYS_IO_PGETEVENTS_TIME64 = 4416 + SYS_RECVMMSG_TIME64 = 4417 + SYS_MQ_TIMEDSEND_TIME64 = 4418 + SYS_MQ_TIMEDRECEIVE_TIME64 = 4419 + SYS_SEMTIMEDOP_TIME64 = 4420 + SYS_RT_SIGTIMEDWAIT_TIME64 = 4421 + SYS_FUTEX_TIME64 = 4422 + SYS_SCHED_RR_GET_INTERVAL_TIME64 = 4423 + SYS_PIDFD_SEND_SIGNAL = 4424 + SYS_IO_URING_SETUP = 4425 + SYS_IO_URING_ENTER = 4426 + SYS_IO_URING_REGISTER = 4427 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go index 40164cac..57ec82aa 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go @@ -334,4 +334,8 @@ const ( SYS_STATX = 5326 SYS_RSEQ = 5327 SYS_IO_PGETEVENTS = 5328 + SYS_PIDFD_SEND_SIGNAL = 5424 + SYS_IO_URING_SETUP = 5425 + SYS_IO_URING_ENTER = 5426 + SYS_IO_URING_REGISTER = 5427 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go index 8a909738..825a3e3b 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go @@ -334,4 +334,8 @@ const ( SYS_STATX = 5326 SYS_RSEQ = 5327 SYS_IO_PGETEVENTS = 5328 + SYS_PIDFD_SEND_SIGNAL = 5424 + SYS_IO_URING_SETUP = 5425 + SYS_IO_URING_ENTER = 5426 + SYS_IO_URING_REGISTER = 5427 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go index 8d781842..f152dfdd 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go @@ -6,372 +6,406 @@ package unix const ( - SYS_SYSCALL = 4000 - SYS_EXIT = 4001 - SYS_FORK = 4002 - SYS_READ = 4003 - SYS_WRITE = 4004 - SYS_OPEN = 4005 - SYS_CLOSE = 4006 - SYS_WAITPID = 4007 - SYS_CREAT = 4008 - SYS_LINK = 4009 - SYS_UNLINK = 4010 - SYS_EXECVE = 4011 - SYS_CHDIR = 4012 - SYS_TIME = 4013 - SYS_MKNOD = 4014 - SYS_CHMOD = 4015 - SYS_LCHOWN = 4016 - SYS_BREAK = 4017 - SYS_UNUSED18 = 4018 - SYS_LSEEK = 4019 - SYS_GETPID = 4020 - SYS_MOUNT = 4021 - SYS_UMOUNT = 4022 - SYS_SETUID = 4023 - SYS_GETUID = 4024 - SYS_STIME = 4025 - SYS_PTRACE = 4026 - SYS_ALARM = 4027 - SYS_UNUSED28 = 4028 - SYS_PAUSE = 4029 - SYS_UTIME = 4030 - SYS_STTY = 4031 - SYS_GTTY = 4032 - SYS_ACCESS = 4033 - SYS_NICE = 4034 - SYS_FTIME = 4035 - SYS_SYNC = 4036 - SYS_KILL = 4037 - SYS_RENAME = 4038 - SYS_MKDIR = 4039 - SYS_RMDIR = 4040 - SYS_DUP = 4041 - SYS_PIPE = 4042 - SYS_TIMES = 4043 - SYS_PROF = 4044 - SYS_BRK = 4045 - SYS_SETGID = 4046 - SYS_GETGID = 4047 - SYS_SIGNAL = 4048 - SYS_GETEUID = 4049 - SYS_GETEGID = 4050 - SYS_ACCT = 4051 - SYS_UMOUNT2 = 4052 - SYS_LOCK = 4053 - SYS_IOCTL = 4054 - SYS_FCNTL = 4055 - SYS_MPX = 4056 - SYS_SETPGID = 4057 - SYS_ULIMIT = 4058 - SYS_UNUSED59 = 4059 - SYS_UMASK = 4060 - SYS_CHROOT = 4061 - SYS_USTAT = 4062 - SYS_DUP2 = 4063 - SYS_GETPPID = 4064 - SYS_GETPGRP = 4065 - SYS_SETSID = 4066 - SYS_SIGACTION = 4067 - SYS_SGETMASK = 4068 - SYS_SSETMASK = 4069 - SYS_SETREUID = 4070 - SYS_SETREGID = 4071 - SYS_SIGSUSPEND = 4072 - SYS_SIGPENDING = 4073 - SYS_SETHOSTNAME = 4074 - SYS_SETRLIMIT = 4075 - SYS_GETRLIMIT = 4076 - SYS_GETRUSAGE = 4077 - SYS_GETTIMEOFDAY = 4078 - SYS_SETTIMEOFDAY = 4079 - SYS_GETGROUPS = 4080 - SYS_SETGROUPS = 4081 - SYS_RESERVED82 = 4082 - SYS_SYMLINK = 4083 - SYS_UNUSED84 = 4084 - SYS_READLINK = 4085 - SYS_USELIB = 4086 - SYS_SWAPON = 4087 - SYS_REBOOT = 4088 - SYS_READDIR = 4089 - SYS_MMAP = 4090 - SYS_MUNMAP = 4091 - SYS_TRUNCATE = 4092 - SYS_FTRUNCATE = 4093 - SYS_FCHMOD = 4094 - SYS_FCHOWN = 4095 - SYS_GETPRIORITY = 4096 - SYS_SETPRIORITY = 4097 - SYS_PROFIL = 4098 - SYS_STATFS = 4099 - SYS_FSTATFS = 4100 - SYS_IOPERM = 4101 - SYS_SOCKETCALL = 4102 - SYS_SYSLOG = 4103 - SYS_SETITIMER = 4104 - SYS_GETITIMER = 4105 - SYS_STAT = 4106 - SYS_LSTAT = 4107 - SYS_FSTAT = 4108 - SYS_UNUSED109 = 4109 - SYS_IOPL = 4110 - SYS_VHANGUP = 4111 - SYS_IDLE = 4112 - SYS_VM86 = 4113 - SYS_WAIT4 = 4114 - SYS_SWAPOFF = 4115 - SYS_SYSINFO = 4116 - SYS_IPC = 4117 - SYS_FSYNC = 4118 - SYS_SIGRETURN = 4119 - SYS_CLONE = 4120 - SYS_SETDOMAINNAME = 4121 - SYS_UNAME = 4122 - SYS_MODIFY_LDT = 4123 - SYS_ADJTIMEX = 4124 - SYS_MPROTECT = 4125 - SYS_SIGPROCMASK = 4126 - SYS_CREATE_MODULE = 4127 - SYS_INIT_MODULE = 4128 - SYS_DELETE_MODULE = 4129 - SYS_GET_KERNEL_SYMS = 4130 - SYS_QUOTACTL = 4131 - SYS_GETPGID = 4132 - SYS_FCHDIR = 4133 - SYS_BDFLUSH = 4134 - SYS_SYSFS = 4135 - SYS_PERSONALITY = 4136 - SYS_AFS_SYSCALL = 4137 - SYS_SETFSUID = 4138 - SYS_SETFSGID = 4139 - SYS__LLSEEK = 4140 - SYS_GETDENTS = 4141 - SYS__NEWSELECT = 4142 - SYS_FLOCK = 4143 - SYS_MSYNC = 4144 - SYS_READV = 4145 - SYS_WRITEV = 4146 - SYS_CACHEFLUSH = 4147 - SYS_CACHECTL = 4148 - SYS_SYSMIPS = 4149 - SYS_UNUSED150 = 4150 - SYS_GETSID = 4151 - SYS_FDATASYNC = 4152 - SYS__SYSCTL = 4153 - SYS_MLOCK = 4154 - SYS_MUNLOCK = 4155 - SYS_MLOCKALL = 4156 - SYS_MUNLOCKALL = 4157 - SYS_SCHED_SETPARAM = 4158 - SYS_SCHED_GETPARAM = 4159 - SYS_SCHED_SETSCHEDULER = 4160 - SYS_SCHED_GETSCHEDULER = 4161 - SYS_SCHED_YIELD = 4162 - SYS_SCHED_GET_PRIORITY_MAX = 4163 - SYS_SCHED_GET_PRIORITY_MIN = 4164 - SYS_SCHED_RR_GET_INTERVAL = 4165 - SYS_NANOSLEEP = 4166 - SYS_MREMAP = 4167 - SYS_ACCEPT = 4168 - SYS_BIND = 4169 - SYS_CONNECT = 4170 - SYS_GETPEERNAME = 4171 - SYS_GETSOCKNAME = 4172 - SYS_GETSOCKOPT = 4173 - SYS_LISTEN = 4174 - SYS_RECV = 4175 - SYS_RECVFROM = 4176 - SYS_RECVMSG = 4177 - SYS_SEND = 4178 - SYS_SENDMSG = 4179 - SYS_SENDTO = 4180 - SYS_SETSOCKOPT = 4181 - SYS_SHUTDOWN = 4182 - SYS_SOCKET = 4183 - SYS_SOCKETPAIR = 4184 - SYS_SETRESUID = 4185 - SYS_GETRESUID = 4186 - SYS_QUERY_MODULE = 4187 - SYS_POLL = 4188 - SYS_NFSSERVCTL = 4189 - SYS_SETRESGID = 4190 - SYS_GETRESGID = 4191 - SYS_PRCTL = 4192 - SYS_RT_SIGRETURN = 4193 - SYS_RT_SIGACTION = 4194 - SYS_RT_SIGPROCMASK = 4195 - SYS_RT_SIGPENDING = 4196 - SYS_RT_SIGTIMEDWAIT = 4197 - SYS_RT_SIGQUEUEINFO = 4198 - SYS_RT_SIGSUSPEND = 4199 - SYS_PREAD64 = 4200 - SYS_PWRITE64 = 4201 - SYS_CHOWN = 4202 - SYS_GETCWD = 4203 - SYS_CAPGET = 4204 - SYS_CAPSET = 4205 - SYS_SIGALTSTACK = 4206 - SYS_SENDFILE = 4207 - SYS_GETPMSG = 4208 - SYS_PUTPMSG = 4209 - SYS_MMAP2 = 4210 - SYS_TRUNCATE64 = 4211 - SYS_FTRUNCATE64 = 4212 - SYS_STAT64 = 4213 - SYS_LSTAT64 = 4214 - SYS_FSTAT64 = 4215 - SYS_PIVOT_ROOT = 4216 - SYS_MINCORE = 4217 - SYS_MADVISE = 4218 - SYS_GETDENTS64 = 4219 - SYS_FCNTL64 = 4220 - SYS_RESERVED221 = 4221 - SYS_GETTID = 4222 - SYS_READAHEAD = 4223 - SYS_SETXATTR = 4224 - SYS_LSETXATTR = 4225 - SYS_FSETXATTR = 4226 - SYS_GETXATTR = 4227 - SYS_LGETXATTR = 4228 - SYS_FGETXATTR = 4229 - SYS_LISTXATTR = 4230 - SYS_LLISTXATTR = 4231 - SYS_FLISTXATTR = 4232 - SYS_REMOVEXATTR = 4233 - SYS_LREMOVEXATTR = 4234 - SYS_FREMOVEXATTR = 4235 - SYS_TKILL = 4236 - SYS_SENDFILE64 = 4237 - SYS_FUTEX = 4238 - SYS_SCHED_SETAFFINITY = 4239 - SYS_SCHED_GETAFFINITY = 4240 - SYS_IO_SETUP = 4241 - SYS_IO_DESTROY = 4242 - SYS_IO_GETEVENTS = 4243 - SYS_IO_SUBMIT = 4244 - SYS_IO_CANCEL = 4245 - SYS_EXIT_GROUP = 4246 - SYS_LOOKUP_DCOOKIE = 4247 - SYS_EPOLL_CREATE = 4248 - SYS_EPOLL_CTL = 4249 - SYS_EPOLL_WAIT = 4250 - SYS_REMAP_FILE_PAGES = 4251 - SYS_SET_TID_ADDRESS = 4252 - SYS_RESTART_SYSCALL = 4253 - SYS_FADVISE64 = 4254 - SYS_STATFS64 = 4255 - SYS_FSTATFS64 = 4256 - SYS_TIMER_CREATE = 4257 - SYS_TIMER_SETTIME = 4258 - SYS_TIMER_GETTIME = 4259 - SYS_TIMER_GETOVERRUN = 4260 - SYS_TIMER_DELETE = 4261 - SYS_CLOCK_SETTIME = 4262 - SYS_CLOCK_GETTIME = 4263 - SYS_CLOCK_GETRES = 4264 - SYS_CLOCK_NANOSLEEP = 4265 - SYS_TGKILL = 4266 - SYS_UTIMES = 4267 - SYS_MBIND = 4268 - SYS_GET_MEMPOLICY = 4269 - SYS_SET_MEMPOLICY = 4270 - SYS_MQ_OPEN = 4271 - SYS_MQ_UNLINK = 4272 - SYS_MQ_TIMEDSEND = 4273 - SYS_MQ_TIMEDRECEIVE = 4274 - SYS_MQ_NOTIFY = 4275 - SYS_MQ_GETSETATTR = 4276 - SYS_VSERVER = 4277 - SYS_WAITID = 4278 - SYS_ADD_KEY = 4280 - SYS_REQUEST_KEY = 4281 - SYS_KEYCTL = 4282 - SYS_SET_THREAD_AREA = 4283 - SYS_INOTIFY_INIT = 4284 - SYS_INOTIFY_ADD_WATCH = 4285 - SYS_INOTIFY_RM_WATCH = 4286 - SYS_MIGRATE_PAGES = 4287 - SYS_OPENAT = 4288 - SYS_MKDIRAT = 4289 - SYS_MKNODAT = 4290 - SYS_FCHOWNAT = 4291 - SYS_FUTIMESAT = 4292 - SYS_FSTATAT64 = 4293 - SYS_UNLINKAT = 4294 - SYS_RENAMEAT = 4295 - SYS_LINKAT = 4296 - SYS_SYMLINKAT = 4297 - SYS_READLINKAT = 4298 - SYS_FCHMODAT = 4299 - SYS_FACCESSAT = 4300 - SYS_PSELECT6 = 4301 - SYS_PPOLL = 4302 - SYS_UNSHARE = 4303 - SYS_SPLICE = 4304 - SYS_SYNC_FILE_RANGE = 4305 - SYS_TEE = 4306 - SYS_VMSPLICE = 4307 - SYS_MOVE_PAGES = 4308 - SYS_SET_ROBUST_LIST = 4309 - SYS_GET_ROBUST_LIST = 4310 - SYS_KEXEC_LOAD = 4311 - SYS_GETCPU = 4312 - SYS_EPOLL_PWAIT = 4313 - SYS_IOPRIO_SET = 4314 - SYS_IOPRIO_GET = 4315 - SYS_UTIMENSAT = 4316 - SYS_SIGNALFD = 4317 - SYS_TIMERFD = 4318 - SYS_EVENTFD = 4319 - SYS_FALLOCATE = 4320 - SYS_TIMERFD_CREATE = 4321 - SYS_TIMERFD_GETTIME = 4322 - SYS_TIMERFD_SETTIME = 4323 - SYS_SIGNALFD4 = 4324 - SYS_EVENTFD2 = 4325 - SYS_EPOLL_CREATE1 = 4326 - SYS_DUP3 = 4327 - SYS_PIPE2 = 4328 - SYS_INOTIFY_INIT1 = 4329 - SYS_PREADV = 4330 - SYS_PWRITEV = 4331 - SYS_RT_TGSIGQUEUEINFO = 4332 - SYS_PERF_EVENT_OPEN = 4333 - SYS_ACCEPT4 = 4334 - SYS_RECVMMSG = 4335 - SYS_FANOTIFY_INIT = 4336 - SYS_FANOTIFY_MARK = 4337 - SYS_PRLIMIT64 = 4338 - SYS_NAME_TO_HANDLE_AT = 4339 - SYS_OPEN_BY_HANDLE_AT = 4340 - SYS_CLOCK_ADJTIME = 4341 - SYS_SYNCFS = 4342 - SYS_SENDMMSG = 4343 - SYS_SETNS = 4344 - SYS_PROCESS_VM_READV = 4345 - SYS_PROCESS_VM_WRITEV = 4346 - SYS_KCMP = 4347 - SYS_FINIT_MODULE = 4348 - SYS_SCHED_SETATTR = 4349 - SYS_SCHED_GETATTR = 4350 - SYS_RENAMEAT2 = 4351 - SYS_SECCOMP = 4352 - SYS_GETRANDOM = 4353 - SYS_MEMFD_CREATE = 4354 - SYS_BPF = 4355 - SYS_EXECVEAT = 4356 - SYS_USERFAULTFD = 4357 - SYS_MEMBARRIER = 4358 - SYS_MLOCK2 = 4359 - SYS_COPY_FILE_RANGE = 4360 - SYS_PREADV2 = 4361 - SYS_PWRITEV2 = 4362 - SYS_PKEY_MPROTECT = 4363 - SYS_PKEY_ALLOC = 4364 - SYS_PKEY_FREE = 4365 - SYS_STATX = 4366 - SYS_RSEQ = 4367 - SYS_IO_PGETEVENTS = 4368 + SYS_SYSCALL = 4000 + SYS_EXIT = 4001 + SYS_FORK = 4002 + SYS_READ = 4003 + SYS_WRITE = 4004 + SYS_OPEN = 4005 + SYS_CLOSE = 4006 + SYS_WAITPID = 4007 + SYS_CREAT = 4008 + SYS_LINK = 4009 + SYS_UNLINK = 4010 + SYS_EXECVE = 4011 + SYS_CHDIR = 4012 + SYS_TIME = 4013 + SYS_MKNOD = 4014 + SYS_CHMOD = 4015 + SYS_LCHOWN = 4016 + SYS_BREAK = 4017 + SYS_UNUSED18 = 4018 + SYS_LSEEK = 4019 + SYS_GETPID = 4020 + SYS_MOUNT = 4021 + SYS_UMOUNT = 4022 + SYS_SETUID = 4023 + SYS_GETUID = 4024 + SYS_STIME = 4025 + SYS_PTRACE = 4026 + SYS_ALARM = 4027 + SYS_UNUSED28 = 4028 + SYS_PAUSE = 4029 + SYS_UTIME = 4030 + SYS_STTY = 4031 + SYS_GTTY = 4032 + SYS_ACCESS = 4033 + SYS_NICE = 4034 + SYS_FTIME = 4035 + SYS_SYNC = 4036 + SYS_KILL = 4037 + SYS_RENAME = 4038 + SYS_MKDIR = 4039 + SYS_RMDIR = 4040 + SYS_DUP = 4041 + SYS_PIPE = 4042 + SYS_TIMES = 4043 + SYS_PROF = 4044 + SYS_BRK = 4045 + SYS_SETGID = 4046 + SYS_GETGID = 4047 + SYS_SIGNAL = 4048 + SYS_GETEUID = 4049 + SYS_GETEGID = 4050 + SYS_ACCT = 4051 + SYS_UMOUNT2 = 4052 + SYS_LOCK = 4053 + SYS_IOCTL = 4054 + SYS_FCNTL = 4055 + SYS_MPX = 4056 + SYS_SETPGID = 4057 + SYS_ULIMIT = 4058 + SYS_UNUSED59 = 4059 + SYS_UMASK = 4060 + SYS_CHROOT = 4061 + SYS_USTAT = 4062 + SYS_DUP2 = 4063 + SYS_GETPPID = 4064 + SYS_GETPGRP = 4065 + SYS_SETSID = 4066 + SYS_SIGACTION = 4067 + SYS_SGETMASK = 4068 + SYS_SSETMASK = 4069 + SYS_SETREUID = 4070 + SYS_SETREGID = 4071 + SYS_SIGSUSPEND = 4072 + SYS_SIGPENDING = 4073 + SYS_SETHOSTNAME = 4074 + SYS_SETRLIMIT = 4075 + SYS_GETRLIMIT = 4076 + SYS_GETRUSAGE = 4077 + SYS_GETTIMEOFDAY = 4078 + SYS_SETTIMEOFDAY = 4079 + SYS_GETGROUPS = 4080 + SYS_SETGROUPS = 4081 + SYS_RESERVED82 = 4082 + SYS_SYMLINK = 4083 + SYS_UNUSED84 = 4084 + SYS_READLINK = 4085 + SYS_USELIB = 4086 + SYS_SWAPON = 4087 + SYS_REBOOT = 4088 + SYS_READDIR = 4089 + SYS_MMAP = 4090 + SYS_MUNMAP = 4091 + SYS_TRUNCATE = 4092 + SYS_FTRUNCATE = 4093 + SYS_FCHMOD = 4094 + SYS_FCHOWN = 4095 + SYS_GETPRIORITY = 4096 + SYS_SETPRIORITY = 4097 + SYS_PROFIL = 4098 + SYS_STATFS = 4099 + SYS_FSTATFS = 4100 + SYS_IOPERM = 4101 + SYS_SOCKETCALL = 4102 + SYS_SYSLOG = 4103 + SYS_SETITIMER = 4104 + SYS_GETITIMER = 4105 + SYS_STAT = 4106 + SYS_LSTAT = 4107 + SYS_FSTAT = 4108 + SYS_UNUSED109 = 4109 + SYS_IOPL = 4110 + SYS_VHANGUP = 4111 + SYS_IDLE = 4112 + SYS_VM86 = 4113 + SYS_WAIT4 = 4114 + SYS_SWAPOFF = 4115 + SYS_SYSINFO = 4116 + SYS_IPC = 4117 + SYS_FSYNC = 4118 + SYS_SIGRETURN = 4119 + SYS_CLONE = 4120 + SYS_SETDOMAINNAME = 4121 + SYS_UNAME = 4122 + SYS_MODIFY_LDT = 4123 + SYS_ADJTIMEX = 4124 + SYS_MPROTECT = 4125 + SYS_SIGPROCMASK = 4126 + SYS_CREATE_MODULE = 4127 + SYS_INIT_MODULE = 4128 + SYS_DELETE_MODULE = 4129 + SYS_GET_KERNEL_SYMS = 4130 + SYS_QUOTACTL = 4131 + SYS_GETPGID = 4132 + SYS_FCHDIR = 4133 + SYS_BDFLUSH = 4134 + SYS_SYSFS = 4135 + SYS_PERSONALITY = 4136 + SYS_AFS_SYSCALL = 4137 + SYS_SETFSUID = 4138 + SYS_SETFSGID = 4139 + SYS__LLSEEK = 4140 + SYS_GETDENTS = 4141 + SYS__NEWSELECT = 4142 + SYS_FLOCK = 4143 + SYS_MSYNC = 4144 + SYS_READV = 4145 + SYS_WRITEV = 4146 + SYS_CACHEFLUSH = 4147 + SYS_CACHECTL = 4148 + SYS_SYSMIPS = 4149 + SYS_UNUSED150 = 4150 + SYS_GETSID = 4151 + SYS_FDATASYNC = 4152 + SYS__SYSCTL = 4153 + SYS_MLOCK = 4154 + SYS_MUNLOCK = 4155 + SYS_MLOCKALL = 4156 + SYS_MUNLOCKALL = 4157 + SYS_SCHED_SETPARAM = 4158 + SYS_SCHED_GETPARAM = 4159 + SYS_SCHED_SETSCHEDULER = 4160 + SYS_SCHED_GETSCHEDULER = 4161 + SYS_SCHED_YIELD = 4162 + SYS_SCHED_GET_PRIORITY_MAX = 4163 + SYS_SCHED_GET_PRIORITY_MIN = 4164 + SYS_SCHED_RR_GET_INTERVAL = 4165 + SYS_NANOSLEEP = 4166 + SYS_MREMAP = 4167 + SYS_ACCEPT = 4168 + SYS_BIND = 4169 + SYS_CONNECT = 4170 + SYS_GETPEERNAME = 4171 + SYS_GETSOCKNAME = 4172 + SYS_GETSOCKOPT = 4173 + SYS_LISTEN = 4174 + SYS_RECV = 4175 + SYS_RECVFROM = 4176 + SYS_RECVMSG = 4177 + SYS_SEND = 4178 + SYS_SENDMSG = 4179 + SYS_SENDTO = 4180 + SYS_SETSOCKOPT = 4181 + SYS_SHUTDOWN = 4182 + SYS_SOCKET = 4183 + SYS_SOCKETPAIR = 4184 + SYS_SETRESUID = 4185 + SYS_GETRESUID = 4186 + SYS_QUERY_MODULE = 4187 + SYS_POLL = 4188 + SYS_NFSSERVCTL = 4189 + SYS_SETRESGID = 4190 + SYS_GETRESGID = 4191 + SYS_PRCTL = 4192 + SYS_RT_SIGRETURN = 4193 + SYS_RT_SIGACTION = 4194 + SYS_RT_SIGPROCMASK = 4195 + SYS_RT_SIGPENDING = 4196 + SYS_RT_SIGTIMEDWAIT = 4197 + SYS_RT_SIGQUEUEINFO = 4198 + SYS_RT_SIGSUSPEND = 4199 + SYS_PREAD64 = 4200 + SYS_PWRITE64 = 4201 + SYS_CHOWN = 4202 + SYS_GETCWD = 4203 + SYS_CAPGET = 4204 + SYS_CAPSET = 4205 + SYS_SIGALTSTACK = 4206 + SYS_SENDFILE = 4207 + SYS_GETPMSG = 4208 + SYS_PUTPMSG = 4209 + SYS_MMAP2 = 4210 + SYS_TRUNCATE64 = 4211 + SYS_FTRUNCATE64 = 4212 + SYS_STAT64 = 4213 + SYS_LSTAT64 = 4214 + SYS_FSTAT64 = 4215 + SYS_PIVOT_ROOT = 4216 + SYS_MINCORE = 4217 + SYS_MADVISE = 4218 + SYS_GETDENTS64 = 4219 + SYS_FCNTL64 = 4220 + SYS_RESERVED221 = 4221 + SYS_GETTID = 4222 + SYS_READAHEAD = 4223 + SYS_SETXATTR = 4224 + SYS_LSETXATTR = 4225 + SYS_FSETXATTR = 4226 + SYS_GETXATTR = 4227 + SYS_LGETXATTR = 4228 + SYS_FGETXATTR = 4229 + SYS_LISTXATTR = 4230 + SYS_LLISTXATTR = 4231 + SYS_FLISTXATTR = 4232 + SYS_REMOVEXATTR = 4233 + SYS_LREMOVEXATTR = 4234 + SYS_FREMOVEXATTR = 4235 + SYS_TKILL = 4236 + SYS_SENDFILE64 = 4237 + SYS_FUTEX = 4238 + SYS_SCHED_SETAFFINITY = 4239 + SYS_SCHED_GETAFFINITY = 4240 + SYS_IO_SETUP = 4241 + SYS_IO_DESTROY = 4242 + SYS_IO_GETEVENTS = 4243 + SYS_IO_SUBMIT = 4244 + SYS_IO_CANCEL = 4245 + SYS_EXIT_GROUP = 4246 + SYS_LOOKUP_DCOOKIE = 4247 + SYS_EPOLL_CREATE = 4248 + SYS_EPOLL_CTL = 4249 + SYS_EPOLL_WAIT = 4250 + SYS_REMAP_FILE_PAGES = 4251 + SYS_SET_TID_ADDRESS = 4252 + SYS_RESTART_SYSCALL = 4253 + SYS_FADVISE64 = 4254 + SYS_STATFS64 = 4255 + SYS_FSTATFS64 = 4256 + SYS_TIMER_CREATE = 4257 + SYS_TIMER_SETTIME = 4258 + SYS_TIMER_GETTIME = 4259 + SYS_TIMER_GETOVERRUN = 4260 + SYS_TIMER_DELETE = 4261 + SYS_CLOCK_SETTIME = 4262 + SYS_CLOCK_GETTIME = 4263 + SYS_CLOCK_GETRES = 4264 + SYS_CLOCK_NANOSLEEP = 4265 + SYS_TGKILL = 4266 + SYS_UTIMES = 4267 + SYS_MBIND = 4268 + SYS_GET_MEMPOLICY = 4269 + SYS_SET_MEMPOLICY = 4270 + SYS_MQ_OPEN = 4271 + SYS_MQ_UNLINK = 4272 + SYS_MQ_TIMEDSEND = 4273 + SYS_MQ_TIMEDRECEIVE = 4274 + SYS_MQ_NOTIFY = 4275 + SYS_MQ_GETSETATTR = 4276 + SYS_VSERVER = 4277 + SYS_WAITID = 4278 + SYS_ADD_KEY = 4280 + SYS_REQUEST_KEY = 4281 + SYS_KEYCTL = 4282 + SYS_SET_THREAD_AREA = 4283 + SYS_INOTIFY_INIT = 4284 + SYS_INOTIFY_ADD_WATCH = 4285 + SYS_INOTIFY_RM_WATCH = 4286 + SYS_MIGRATE_PAGES = 4287 + SYS_OPENAT = 4288 + SYS_MKDIRAT = 4289 + SYS_MKNODAT = 4290 + SYS_FCHOWNAT = 4291 + SYS_FUTIMESAT = 4292 + SYS_FSTATAT64 = 4293 + SYS_UNLINKAT = 4294 + SYS_RENAMEAT = 4295 + SYS_LINKAT = 4296 + SYS_SYMLINKAT = 4297 + SYS_READLINKAT = 4298 + SYS_FCHMODAT = 4299 + SYS_FACCESSAT = 4300 + SYS_PSELECT6 = 4301 + SYS_PPOLL = 4302 + SYS_UNSHARE = 4303 + SYS_SPLICE = 4304 + SYS_SYNC_FILE_RANGE = 4305 + SYS_TEE = 4306 + SYS_VMSPLICE = 4307 + SYS_MOVE_PAGES = 4308 + SYS_SET_ROBUST_LIST = 4309 + SYS_GET_ROBUST_LIST = 4310 + SYS_KEXEC_LOAD = 4311 + SYS_GETCPU = 4312 + SYS_EPOLL_PWAIT = 4313 + SYS_IOPRIO_SET = 4314 + SYS_IOPRIO_GET = 4315 + SYS_UTIMENSAT = 4316 + SYS_SIGNALFD = 4317 + SYS_TIMERFD = 4318 + SYS_EVENTFD = 4319 + SYS_FALLOCATE = 4320 + SYS_TIMERFD_CREATE = 4321 + SYS_TIMERFD_GETTIME = 4322 + SYS_TIMERFD_SETTIME = 4323 + SYS_SIGNALFD4 = 4324 + SYS_EVENTFD2 = 4325 + SYS_EPOLL_CREATE1 = 4326 + SYS_DUP3 = 4327 + SYS_PIPE2 = 4328 + SYS_INOTIFY_INIT1 = 4329 + SYS_PREADV = 4330 + SYS_PWRITEV = 4331 + SYS_RT_TGSIGQUEUEINFO = 4332 + SYS_PERF_EVENT_OPEN = 4333 + SYS_ACCEPT4 = 4334 + SYS_RECVMMSG = 4335 + SYS_FANOTIFY_INIT = 4336 + SYS_FANOTIFY_MARK = 4337 + SYS_PRLIMIT64 = 4338 + SYS_NAME_TO_HANDLE_AT = 4339 + SYS_OPEN_BY_HANDLE_AT = 4340 + SYS_CLOCK_ADJTIME = 4341 + SYS_SYNCFS = 4342 + SYS_SENDMMSG = 4343 + SYS_SETNS = 4344 + SYS_PROCESS_VM_READV = 4345 + SYS_PROCESS_VM_WRITEV = 4346 + SYS_KCMP = 4347 + SYS_FINIT_MODULE = 4348 + SYS_SCHED_SETATTR = 4349 + SYS_SCHED_GETATTR = 4350 + SYS_RENAMEAT2 = 4351 + SYS_SECCOMP = 4352 + SYS_GETRANDOM = 4353 + SYS_MEMFD_CREATE = 4354 + SYS_BPF = 4355 + SYS_EXECVEAT = 4356 + SYS_USERFAULTFD = 4357 + SYS_MEMBARRIER = 4358 + SYS_MLOCK2 = 4359 + SYS_COPY_FILE_RANGE = 4360 + SYS_PREADV2 = 4361 + SYS_PWRITEV2 = 4362 + SYS_PKEY_MPROTECT = 4363 + SYS_PKEY_ALLOC = 4364 + SYS_PKEY_FREE = 4365 + SYS_STATX = 4366 + SYS_RSEQ = 4367 + SYS_IO_PGETEVENTS = 4368 + SYS_SEMGET = 4393 + SYS_SEMCTL = 4394 + SYS_SHMGET = 4395 + SYS_SHMCTL = 4396 + SYS_SHMAT = 4397 + SYS_SHMDT = 4398 + SYS_MSGGET = 4399 + SYS_MSGSND = 4400 + SYS_MSGRCV = 4401 + SYS_MSGCTL = 4402 + SYS_CLOCK_GETTIME64 = 4403 + SYS_CLOCK_SETTIME64 = 4404 + SYS_CLOCK_ADJTIME64 = 4405 + SYS_CLOCK_GETRES_TIME64 = 4406 + SYS_CLOCK_NANOSLEEP_TIME64 = 4407 + SYS_TIMER_GETTIME64 = 4408 + SYS_TIMER_SETTIME64 = 4409 + SYS_TIMERFD_GETTIME64 = 4410 + SYS_TIMERFD_SETTIME64 = 4411 + SYS_UTIMENSAT_TIME64 = 4412 + SYS_PSELECT6_TIME64 = 4413 + SYS_PPOLL_TIME64 = 4414 + SYS_IO_PGETEVENTS_TIME64 = 4416 + SYS_RECVMMSG_TIME64 = 4417 + SYS_MQ_TIMEDSEND_TIME64 = 4418 + SYS_MQ_TIMEDRECEIVE_TIME64 = 4419 + SYS_SEMTIMEDOP_TIME64 = 4420 + SYS_RT_SIGTIMEDWAIT_TIME64 = 4421 + SYS_FUTEX_TIME64 = 4422 + SYS_SCHED_RR_GET_INTERVAL_TIME64 = 4423 + SYS_PIDFD_SEND_SIGNAL = 4424 + SYS_IO_URING_SETUP = 4425 + SYS_IO_URING_ENTER = 4426 + SYS_IO_URING_REGISTER = 4427 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go index ec5bde3d..7cbe78b1 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go @@ -372,4 +372,19 @@ const ( SYS_PKEY_MPROTECT = 386 SYS_RSEQ = 387 SYS_IO_PGETEVENTS = 388 + SYS_SEMTIMEDOP = 392 + SYS_SEMGET = 393 + SYS_SEMCTL = 394 + SYS_SHMGET = 395 + SYS_SHMCTL = 396 + SYS_SHMAT = 397 + SYS_SHMDT = 398 + SYS_MSGGET = 399 + SYS_MSGSND = 400 + SYS_MSGRCV = 401 + SYS_MSGCTL = 402 + SYS_PIDFD_SEND_SIGNAL = 424 + SYS_IO_URING_SETUP = 425 + SYS_IO_URING_ENTER = 426 + SYS_IO_URING_REGISTER = 427 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go index bdbabdbc..51a2f123 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go @@ -372,4 +372,19 @@ const ( SYS_PKEY_MPROTECT = 386 SYS_RSEQ = 387 SYS_IO_PGETEVENTS = 388 + SYS_SEMTIMEDOP = 392 + SYS_SEMGET = 393 + SYS_SEMCTL = 394 + SYS_SHMGET = 395 + SYS_SHMCTL = 396 + SYS_SHMAT = 397 + SYS_SHMDT = 398 + SYS_MSGGET = 399 + SYS_MSGSND = 400 + SYS_MSGRCV = 401 + SYS_MSGCTL = 402 + SYS_PIDFD_SEND_SIGNAL = 424 + SYS_IO_URING_SETUP = 425 + SYS_IO_URING_ENTER = 426 + SYS_IO_URING_REGISTER = 427 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go index 2c8c46a2..323432ae 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go @@ -285,4 +285,8 @@ const ( SYS_IO_PGETEVENTS = 292 SYS_RSEQ = 293 SYS_KEXEC_FILE_LOAD = 294 + SYS_PIDFD_SEND_SIGNAL = 424 + SYS_IO_URING_SETUP = 425 + SYS_IO_URING_ENTER = 426 + SYS_IO_URING_REGISTER = 427 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go index 6eb7c257..9dca9748 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go @@ -334,4 +334,22 @@ const ( SYS_KEXEC_FILE_LOAD = 381 SYS_IO_PGETEVENTS = 382 SYS_RSEQ = 383 + SYS_PKEY_MPROTECT = 384 + SYS_PKEY_ALLOC = 385 + SYS_PKEY_FREE = 386 + SYS_SEMTIMEDOP = 392 + SYS_SEMGET = 393 + SYS_SEMCTL = 394 + SYS_SHMGET = 395 + SYS_SHMCTL = 396 + SYS_SHMAT = 397 + SYS_SHMDT = 398 + SYS_MSGGET = 399 + SYS_MSGSND = 400 + SYS_MSGRCV = 401 + SYS_MSGCTL = 402 + SYS_PIDFD_SEND_SIGNAL = 424 + SYS_IO_URING_SETUP = 425 + SYS_IO_URING_ENTER = 426 + SYS_IO_URING_REGISTER = 427 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go index 6ed30637..d3da46f0 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go @@ -348,4 +348,23 @@ const ( SYS_PWRITEV2 = 359 SYS_STATX = 360 SYS_IO_PGETEVENTS = 361 + SYS_PKEY_MPROTECT = 362 + SYS_PKEY_ALLOC = 363 + SYS_PKEY_FREE = 364 + SYS_RSEQ = 365 + SYS_SEMTIMEDOP = 392 + SYS_SEMGET = 393 + SYS_SEMCTL = 394 + SYS_SHMGET = 395 + SYS_SHMCTL = 396 + SYS_SHMAT = 397 + SYS_SHMDT = 398 + SYS_MSGGET = 399 + SYS_MSGSND = 400 + SYS_MSGRCV = 401 + SYS_MSGCTL = 402 + SYS_PIDFD_SEND_SIGNAL = 424 + SYS_IO_URING_SETUP = 425 + SYS_IO_URING_ENTER = 426 + SYS_IO_URING_REGISTER = 427 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_openbsd_arm64.go b/vendor/golang.org/x/sys/unix/zsysnum_openbsd_arm64.go new file mode 100644 index 00000000..fe2b689b --- /dev/null +++ b/vendor/golang.org/x/sys/unix/zsysnum_openbsd_arm64.go @@ -0,0 +1,217 @@ +// go run mksysnum.go https://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build arm64,openbsd + +package unix + +const ( + SYS_EXIT = 1 // { void sys_exit(int rval); } + SYS_FORK = 2 // { int sys_fork(void); } + SYS_READ = 3 // { ssize_t sys_read(int fd, void *buf, size_t nbyte); } + SYS_WRITE = 4 // { ssize_t sys_write(int fd, const void *buf, size_t nbyte); } + SYS_OPEN = 5 // { int sys_open(const char *path, int flags, ... mode_t mode); } + SYS_CLOSE = 6 // { int sys_close(int fd); } + SYS_GETENTROPY = 7 // { int sys_getentropy(void *buf, size_t nbyte); } + SYS___TFORK = 8 // { int sys___tfork(const struct __tfork *param, size_t psize); } + SYS_LINK = 9 // { int sys_link(const char *path, const char *link); } + SYS_UNLINK = 10 // { int sys_unlink(const char *path); } + SYS_WAIT4 = 11 // { pid_t sys_wait4(pid_t pid, int *status, int options, struct rusage *rusage); } + SYS_CHDIR = 12 // { int sys_chdir(const char *path); } + SYS_FCHDIR = 13 // { int sys_fchdir(int fd); } + SYS_MKNOD = 14 // { int sys_mknod(const char *path, mode_t mode, dev_t dev); } + SYS_CHMOD = 15 // { int sys_chmod(const char *path, mode_t mode); } + SYS_CHOWN = 16 // { int sys_chown(const char *path, uid_t uid, gid_t gid); } + SYS_OBREAK = 17 // { int sys_obreak(char *nsize); } break + SYS_GETDTABLECOUNT = 18 // { int sys_getdtablecount(void); } + SYS_GETRUSAGE = 19 // { int sys_getrusage(int who, struct rusage *rusage); } + SYS_GETPID = 20 // { pid_t sys_getpid(void); } + SYS_MOUNT = 21 // { int sys_mount(const char *type, const char *path, int flags, void *data); } + SYS_UNMOUNT = 22 // { int sys_unmount(const char *path, int flags); } + SYS_SETUID = 23 // { int sys_setuid(uid_t uid); } + SYS_GETUID = 24 // { uid_t sys_getuid(void); } + SYS_GETEUID = 25 // { uid_t sys_geteuid(void); } + SYS_PTRACE = 26 // { int sys_ptrace(int req, pid_t pid, caddr_t addr, int data); } + SYS_RECVMSG = 27 // { ssize_t sys_recvmsg(int s, struct msghdr *msg, int flags); } + SYS_SENDMSG = 28 // { ssize_t sys_sendmsg(int s, const struct msghdr *msg, int flags); } + SYS_RECVFROM = 29 // { ssize_t sys_recvfrom(int s, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *fromlenaddr); } + SYS_ACCEPT = 30 // { int sys_accept(int s, struct sockaddr *name, socklen_t *anamelen); } + SYS_GETPEERNAME = 31 // { int sys_getpeername(int fdes, struct sockaddr *asa, socklen_t *alen); } + SYS_GETSOCKNAME = 32 // { int sys_getsockname(int fdes, struct sockaddr *asa, socklen_t *alen); } + SYS_ACCESS = 33 // { int sys_access(const char *path, int amode); } + SYS_CHFLAGS = 34 // { int sys_chflags(const char *path, u_int flags); } + SYS_FCHFLAGS = 35 // { int sys_fchflags(int fd, u_int flags); } + SYS_SYNC = 36 // { void sys_sync(void); } + SYS_STAT = 38 // { int sys_stat(const char *path, struct stat *ub); } + SYS_GETPPID = 39 // { pid_t sys_getppid(void); } + SYS_LSTAT = 40 // { int sys_lstat(const char *path, struct stat *ub); } + SYS_DUP = 41 // { int sys_dup(int fd); } + SYS_FSTATAT = 42 // { int sys_fstatat(int fd, const char *path, struct stat *buf, int flag); } + SYS_GETEGID = 43 // { gid_t sys_getegid(void); } + SYS_PROFIL = 44 // { int sys_profil(caddr_t samples, size_t size, u_long offset, u_int scale); } + SYS_KTRACE = 45 // { int sys_ktrace(const char *fname, int ops, int facs, pid_t pid); } + SYS_SIGACTION = 46 // { int sys_sigaction(int signum, const struct sigaction *nsa, struct sigaction *osa); } + SYS_GETGID = 47 // { gid_t sys_getgid(void); } + SYS_SIGPROCMASK = 48 // { int sys_sigprocmask(int how, sigset_t mask); } + SYS_SETLOGIN = 50 // { int sys_setlogin(const char *namebuf); } + SYS_ACCT = 51 // { int sys_acct(const char *path); } + SYS_SIGPENDING = 52 // { int sys_sigpending(void); } + SYS_FSTAT = 53 // { int sys_fstat(int fd, struct stat *sb); } + SYS_IOCTL = 54 // { int sys_ioctl(int fd, u_long com, ... void *data); } + SYS_REBOOT = 55 // { int sys_reboot(int opt); } + SYS_REVOKE = 56 // { int sys_revoke(const char *path); } + SYS_SYMLINK = 57 // { int sys_symlink(const char *path, const char *link); } + SYS_READLINK = 58 // { ssize_t sys_readlink(const char *path, char *buf, size_t count); } + SYS_EXECVE = 59 // { int sys_execve(const char *path, char * const *argp, char * const *envp); } + SYS_UMASK = 60 // { mode_t sys_umask(mode_t newmask); } + SYS_CHROOT = 61 // { int sys_chroot(const char *path); } + SYS_GETFSSTAT = 62 // { int sys_getfsstat(struct statfs *buf, size_t bufsize, int flags); } + SYS_STATFS = 63 // { int sys_statfs(const char *path, struct statfs *buf); } + SYS_FSTATFS = 64 // { int sys_fstatfs(int fd, struct statfs *buf); } + SYS_FHSTATFS = 65 // { int sys_fhstatfs(const fhandle_t *fhp, struct statfs *buf); } + SYS_VFORK = 66 // { int sys_vfork(void); } + SYS_GETTIMEOFDAY = 67 // { int sys_gettimeofday(struct timeval *tp, struct timezone *tzp); } + SYS_SETTIMEOFDAY = 68 // { int sys_settimeofday(const struct timeval *tv, const struct timezone *tzp); } + SYS_SETITIMER = 69 // { int sys_setitimer(int which, const struct itimerval *itv, struct itimerval *oitv); } + SYS_GETITIMER = 70 // { int sys_getitimer(int which, struct itimerval *itv); } + SYS_SELECT = 71 // { int sys_select(int nd, fd_set *in, fd_set *ou, fd_set *ex, struct timeval *tv); } + SYS_KEVENT = 72 // { int sys_kevent(int fd, const struct kevent *changelist, int nchanges, struct kevent *eventlist, int nevents, const struct timespec *timeout); } + SYS_MUNMAP = 73 // { int sys_munmap(void *addr, size_t len); } + SYS_MPROTECT = 74 // { int sys_mprotect(void *addr, size_t len, int prot); } + SYS_MADVISE = 75 // { int sys_madvise(void *addr, size_t len, int behav); } + SYS_UTIMES = 76 // { int sys_utimes(const char *path, const struct timeval *tptr); } + SYS_FUTIMES = 77 // { int sys_futimes(int fd, const struct timeval *tptr); } + SYS_GETGROUPS = 79 // { int sys_getgroups(int gidsetsize, gid_t *gidset); } + SYS_SETGROUPS = 80 // { int sys_setgroups(int gidsetsize, const gid_t *gidset); } + SYS_GETPGRP = 81 // { int sys_getpgrp(void); } + SYS_SETPGID = 82 // { int sys_setpgid(pid_t pid, pid_t pgid); } + SYS_FUTEX = 83 // { int sys_futex(uint32_t *f, int op, int val, const struct timespec *timeout, uint32_t *g); } + SYS_UTIMENSAT = 84 // { int sys_utimensat(int fd, const char *path, const struct timespec *times, int flag); } + SYS_FUTIMENS = 85 // { int sys_futimens(int fd, const struct timespec *times); } + SYS_KBIND = 86 // { int sys_kbind(const struct __kbind *param, size_t psize, int64_t proc_cookie); } + SYS_CLOCK_GETTIME = 87 // { int sys_clock_gettime(clockid_t clock_id, struct timespec *tp); } + SYS_CLOCK_SETTIME = 88 // { int sys_clock_settime(clockid_t clock_id, const struct timespec *tp); } + SYS_CLOCK_GETRES = 89 // { int sys_clock_getres(clockid_t clock_id, struct timespec *tp); } + SYS_DUP2 = 90 // { int sys_dup2(int from, int to); } + SYS_NANOSLEEP = 91 // { int sys_nanosleep(const struct timespec *rqtp, struct timespec *rmtp); } + SYS_FCNTL = 92 // { int sys_fcntl(int fd, int cmd, ... void *arg); } + SYS_ACCEPT4 = 93 // { int sys_accept4(int s, struct sockaddr *name, socklen_t *anamelen, int flags); } + SYS___THRSLEEP = 94 // { int sys___thrsleep(const volatile void *ident, clockid_t clock_id, const struct timespec *tp, void *lock, const int *abort); } + SYS_FSYNC = 95 // { int sys_fsync(int fd); } + SYS_SETPRIORITY = 96 // { int sys_setpriority(int which, id_t who, int prio); } + SYS_SOCKET = 97 // { int sys_socket(int domain, int type, int protocol); } + SYS_CONNECT = 98 // { int sys_connect(int s, const struct sockaddr *name, socklen_t namelen); } + SYS_GETDENTS = 99 // { int sys_getdents(int fd, void *buf, size_t buflen); } + SYS_GETPRIORITY = 100 // { int sys_getpriority(int which, id_t who); } + SYS_PIPE2 = 101 // { int sys_pipe2(int *fdp, int flags); } + SYS_DUP3 = 102 // { int sys_dup3(int from, int to, int flags); } + SYS_SIGRETURN = 103 // { int sys_sigreturn(struct sigcontext *sigcntxp); } + SYS_BIND = 104 // { int sys_bind(int s, const struct sockaddr *name, socklen_t namelen); } + SYS_SETSOCKOPT = 105 // { int sys_setsockopt(int s, int level, int name, const void *val, socklen_t valsize); } + SYS_LISTEN = 106 // { int sys_listen(int s, int backlog); } + SYS_CHFLAGSAT = 107 // { int sys_chflagsat(int fd, const char *path, u_int flags, int atflags); } + SYS_PLEDGE = 108 // { int sys_pledge(const char *promises, const char *execpromises); } + SYS_PPOLL = 109 // { int sys_ppoll(struct pollfd *fds, u_int nfds, const struct timespec *ts, const sigset_t *mask); } + SYS_PSELECT = 110 // { int sys_pselect(int nd, fd_set *in, fd_set *ou, fd_set *ex, const struct timespec *ts, const sigset_t *mask); } + SYS_SIGSUSPEND = 111 // { int sys_sigsuspend(int mask); } + SYS_SENDSYSLOG = 112 // { int sys_sendsyslog(const char *buf, size_t nbyte, int flags); } + SYS_UNVEIL = 114 // { int sys_unveil(const char *path, const char *permissions); } + SYS_GETSOCKOPT = 118 // { int sys_getsockopt(int s, int level, int name, void *val, socklen_t *avalsize); } + SYS_THRKILL = 119 // { int sys_thrkill(pid_t tid, int signum, void *tcb); } + SYS_READV = 120 // { ssize_t sys_readv(int fd, const struct iovec *iovp, int iovcnt); } + SYS_WRITEV = 121 // { ssize_t sys_writev(int fd, const struct iovec *iovp, int iovcnt); } + SYS_KILL = 122 // { int sys_kill(int pid, int signum); } + SYS_FCHOWN = 123 // { int sys_fchown(int fd, uid_t uid, gid_t gid); } + SYS_FCHMOD = 124 // { int sys_fchmod(int fd, mode_t mode); } + SYS_SETREUID = 126 // { int sys_setreuid(uid_t ruid, uid_t euid); } + SYS_SETREGID = 127 // { int sys_setregid(gid_t rgid, gid_t egid); } + SYS_RENAME = 128 // { int sys_rename(const char *from, const char *to); } + SYS_FLOCK = 131 // { int sys_flock(int fd, int how); } + SYS_MKFIFO = 132 // { int sys_mkfifo(const char *path, mode_t mode); } + SYS_SENDTO = 133 // { ssize_t sys_sendto(int s, const void *buf, size_t len, int flags, const struct sockaddr *to, socklen_t tolen); } + SYS_SHUTDOWN = 134 // { int sys_shutdown(int s, int how); } + SYS_SOCKETPAIR = 135 // { int sys_socketpair(int domain, int type, int protocol, int *rsv); } + SYS_MKDIR = 136 // { int sys_mkdir(const char *path, mode_t mode); } + SYS_RMDIR = 137 // { int sys_rmdir(const char *path); } + SYS_ADJTIME = 140 // { int sys_adjtime(const struct timeval *delta, struct timeval *olddelta); } + SYS_GETLOGIN_R = 141 // { int sys_getlogin_r(char *namebuf, u_int namelen); } + SYS_SETSID = 147 // { int sys_setsid(void); } + SYS_QUOTACTL = 148 // { int sys_quotactl(const char *path, int cmd, int uid, char *arg); } + SYS_NFSSVC = 155 // { int sys_nfssvc(int flag, void *argp); } + SYS_GETFH = 161 // { int sys_getfh(const char *fname, fhandle_t *fhp); } + SYS_SYSARCH = 165 // { int sys_sysarch(int op, void *parms); } + SYS_PREAD = 173 // { ssize_t sys_pread(int fd, void *buf, size_t nbyte, int pad, off_t offset); } + SYS_PWRITE = 174 // { ssize_t sys_pwrite(int fd, const void *buf, size_t nbyte, int pad, off_t offset); } + SYS_SETGID = 181 // { int sys_setgid(gid_t gid); } + SYS_SETEGID = 182 // { int sys_setegid(gid_t egid); } + SYS_SETEUID = 183 // { int sys_seteuid(uid_t euid); } + SYS_PATHCONF = 191 // { long sys_pathconf(const char *path, int name); } + SYS_FPATHCONF = 192 // { long sys_fpathconf(int fd, int name); } + SYS_SWAPCTL = 193 // { int sys_swapctl(int cmd, const void *arg, int misc); } + SYS_GETRLIMIT = 194 // { int sys_getrlimit(int which, struct rlimit *rlp); } + SYS_SETRLIMIT = 195 // { int sys_setrlimit(int which, const struct rlimit *rlp); } + SYS_MMAP = 197 // { void *sys_mmap(void *addr, size_t len, int prot, int flags, int fd, long pad, off_t pos); } + SYS_LSEEK = 199 // { off_t sys_lseek(int fd, int pad, off_t offset, int whence); } + SYS_TRUNCATE = 200 // { int sys_truncate(const char *path, int pad, off_t length); } + SYS_FTRUNCATE = 201 // { int sys_ftruncate(int fd, int pad, off_t length); } + SYS_SYSCTL = 202 // { int sys_sysctl(const int *name, u_int namelen, void *old, size_t *oldlenp, void *new, size_t newlen); } + SYS_MLOCK = 203 // { int sys_mlock(const void *addr, size_t len); } + SYS_MUNLOCK = 204 // { int sys_munlock(const void *addr, size_t len); } + SYS_GETPGID = 207 // { pid_t sys_getpgid(pid_t pid); } + SYS_UTRACE = 209 // { int sys_utrace(const char *label, const void *addr, size_t len); } + SYS_SEMGET = 221 // { int sys_semget(key_t key, int nsems, int semflg); } + SYS_MSGGET = 225 // { int sys_msgget(key_t key, int msgflg); } + SYS_MSGSND = 226 // { int sys_msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); } + SYS_MSGRCV = 227 // { int sys_msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg); } + SYS_SHMAT = 228 // { void *sys_shmat(int shmid, const void *shmaddr, int shmflg); } + SYS_SHMDT = 230 // { int sys_shmdt(const void *shmaddr); } + SYS_MINHERIT = 250 // { int sys_minherit(void *addr, size_t len, int inherit); } + SYS_POLL = 252 // { int sys_poll(struct pollfd *fds, u_int nfds, int timeout); } + SYS_ISSETUGID = 253 // { int sys_issetugid(void); } + SYS_LCHOWN = 254 // { int sys_lchown(const char *path, uid_t uid, gid_t gid); } + SYS_GETSID = 255 // { pid_t sys_getsid(pid_t pid); } + SYS_MSYNC = 256 // { int sys_msync(void *addr, size_t len, int flags); } + SYS_PIPE = 263 // { int sys_pipe(int *fdp); } + SYS_FHOPEN = 264 // { int sys_fhopen(const fhandle_t *fhp, int flags); } + SYS_PREADV = 267 // { ssize_t sys_preadv(int fd, const struct iovec *iovp, int iovcnt, int pad, off_t offset); } + SYS_PWRITEV = 268 // { ssize_t sys_pwritev(int fd, const struct iovec *iovp, int iovcnt, int pad, off_t offset); } + SYS_KQUEUE = 269 // { int sys_kqueue(void); } + SYS_MLOCKALL = 271 // { int sys_mlockall(int flags); } + SYS_MUNLOCKALL = 272 // { int sys_munlockall(void); } + SYS_GETRESUID = 281 // { int sys_getresuid(uid_t *ruid, uid_t *euid, uid_t *suid); } + SYS_SETRESUID = 282 // { int sys_setresuid(uid_t ruid, uid_t euid, uid_t suid); } + SYS_GETRESGID = 283 // { int sys_getresgid(gid_t *rgid, gid_t *egid, gid_t *sgid); } + SYS_SETRESGID = 284 // { int sys_setresgid(gid_t rgid, gid_t egid, gid_t sgid); } + SYS_MQUERY = 286 // { void *sys_mquery(void *addr, size_t len, int prot, int flags, int fd, long pad, off_t pos); } + SYS_CLOSEFROM = 287 // { int sys_closefrom(int fd); } + SYS_SIGALTSTACK = 288 // { int sys_sigaltstack(const struct sigaltstack *nss, struct sigaltstack *oss); } + SYS_SHMGET = 289 // { int sys_shmget(key_t key, size_t size, int shmflg); } + SYS_SEMOP = 290 // { int sys_semop(int semid, struct sembuf *sops, size_t nsops); } + SYS_FHSTAT = 294 // { int sys_fhstat(const fhandle_t *fhp, struct stat *sb); } + SYS___SEMCTL = 295 // { int sys___semctl(int semid, int semnum, int cmd, union semun *arg); } + SYS_SHMCTL = 296 // { int sys_shmctl(int shmid, int cmd, struct shmid_ds *buf); } + SYS_MSGCTL = 297 // { int sys_msgctl(int msqid, int cmd, struct msqid_ds *buf); } + SYS_SCHED_YIELD = 298 // { int sys_sched_yield(void); } + SYS_GETTHRID = 299 // { pid_t sys_getthrid(void); } + SYS___THRWAKEUP = 301 // { int sys___thrwakeup(const volatile void *ident, int n); } + SYS___THREXIT = 302 // { void sys___threxit(pid_t *notdead); } + SYS___THRSIGDIVERT = 303 // { int sys___thrsigdivert(sigset_t sigmask, siginfo_t *info, const struct timespec *timeout); } + SYS___GETCWD = 304 // { int sys___getcwd(char *buf, size_t len); } + SYS_ADJFREQ = 305 // { int sys_adjfreq(const int64_t *freq, int64_t *oldfreq); } + SYS_SETRTABLE = 310 // { int sys_setrtable(int rtableid); } + SYS_GETRTABLE = 311 // { int sys_getrtable(void); } + SYS_FACCESSAT = 313 // { int sys_faccessat(int fd, const char *path, int amode, int flag); } + SYS_FCHMODAT = 314 // { int sys_fchmodat(int fd, const char *path, mode_t mode, int flag); } + SYS_FCHOWNAT = 315 // { int sys_fchownat(int fd, const char *path, uid_t uid, gid_t gid, int flag); } + SYS_LINKAT = 317 // { int sys_linkat(int fd1, const char *path1, int fd2, const char *path2, int flag); } + SYS_MKDIRAT = 318 // { int sys_mkdirat(int fd, const char *path, mode_t mode); } + SYS_MKFIFOAT = 319 // { int sys_mkfifoat(int fd, const char *path, mode_t mode); } + SYS_MKNODAT = 320 // { int sys_mknodat(int fd, const char *path, mode_t mode, dev_t dev); } + SYS_OPENAT = 321 // { int sys_openat(int fd, const char *path, int flags, ... mode_t mode); } + SYS_READLINKAT = 322 // { ssize_t sys_readlinkat(int fd, const char *path, char *buf, size_t count); } + SYS_RENAMEAT = 323 // { int sys_renameat(int fromfd, const char *from, int tofd, const char *to); } + SYS_SYMLINKAT = 324 // { int sys_symlinkat(const char *path, int fd, const char *link); } + SYS_UNLINKAT = 325 // { int sys_unlinkat(int fd, const char *path, int flag); } + SYS___SET_TCB = 329 // { void sys___set_tcb(void *tcb); } + SYS___GET_TCB = 330 // { void *sys___get_tcb(void); } +) diff --git a/vendor/golang.org/x/sys/unix/ztypes_aix_ppc.go b/vendor/golang.org/x/sys/unix/ztypes_aix_ppc.go index cedc9b0f..2c1f815e 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_aix_ppc.go +++ b/vendor/golang.org/x/sys/unix/ztypes_aix_ppc.go @@ -30,11 +30,6 @@ type Timespec struct { Nsec int32 } -type StTimespec struct { - Sec int32 - Nsec int32 -} - type Timeval struct { Sec int32 Usec int32 @@ -101,9 +96,9 @@ type Stat_t struct { Gid uint32 Rdev uint32 Size int32 - Atim StTimespec - Mtim StTimespec - Ctim StTimespec + Atim Timespec + Mtim Timespec + Ctim Timespec Blksize int32 Blocks int32 Vfstype int32 @@ -148,6 +143,17 @@ type RawSockaddrUnix struct { Path [1023]uint8 } +type RawSockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [120]uint8 +} + type RawSockaddr struct { Len uint8 Family uint8 @@ -207,17 +213,18 @@ type Msghdr struct { } const ( - SizeofSockaddrInet4 = 0x10 - SizeofSockaddrInet6 = 0x1c - SizeofSockaddrAny = 0x404 - SizeofSockaddrUnix = 0x401 - SizeofLinger = 0x8 - SizeofIPMreq = 0x8 - SizeofIPv6Mreq = 0x14 - SizeofIPv6MTUInfo = 0x20 - SizeofMsghdr = 0x1c - SizeofCmsghdr = 0xc - SizeofICMPv6Filter = 0x20 + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x404 + SizeofSockaddrUnix = 0x401 + SizeofSockaddrDatalink = 0x80 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPv6Mreq = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofMsghdr = 0x1c + SizeofCmsghdr = 0xc + SizeofICMPv6Filter = 0x20 ) const ( diff --git a/vendor/golang.org/x/sys/unix/ztypes_aix_ppc64.go b/vendor/golang.org/x/sys/unix/ztypes_aix_ppc64.go index 904359f6..b4a069ec 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_aix_ppc64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_aix_ppc64.go @@ -30,12 +30,6 @@ type Timespec struct { Nsec int64 } -type StTimespec struct { - Sec int64 - Nsec int32 - _ [4]byte -} - type Timeval struct { Sec int64 Usec int32 @@ -103,9 +97,9 @@ type Stat_t struct { Gid uint32 Rdev uint64 Ssize int32 - Atim StTimespec - Mtim StTimespec - Ctim StTimespec + Atim Timespec + Mtim Timespec + Ctim Timespec Blksize int64 Blocks int64 Vfstype int32 @@ -153,6 +147,17 @@ type RawSockaddrUnix struct { Path [1023]uint8 } +type RawSockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [120]uint8 +} + type RawSockaddr struct { Len uint8 Family uint8 @@ -212,17 +217,18 @@ type Msghdr struct { } const ( - SizeofSockaddrInet4 = 0x10 - SizeofSockaddrInet6 = 0x1c - SizeofSockaddrAny = 0x404 - SizeofSockaddrUnix = 0x401 - SizeofLinger = 0x8 - SizeofIPMreq = 0x8 - SizeofIPv6Mreq = 0x14 - SizeofIPv6MTUInfo = 0x20 - SizeofMsghdr = 0x30 - SizeofCmsghdr = 0xc - SizeofICMPv6Filter = 0x20 + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x404 + SizeofSockaddrUnix = 0x401 + SizeofSockaddrDatalink = 0x80 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPv6Mreq = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofMsghdr = 0x30 + SizeofCmsghdr = 0xc + SizeofICMPv6Filter = 0x20 ) const ( diff --git a/vendor/golang.org/x/sys/unix/ztypes_darwin_386.go b/vendor/golang.org/x/sys/unix/ztypes_darwin_386.go index cefe2f8e..9f47b87c 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_darwin_386.go +++ b/vendor/golang.org/x/sys/unix/ztypes_darwin_386.go @@ -59,24 +59,24 @@ type Rlimit struct { type _Gid_t uint32 type Stat_t struct { - Dev int32 - Mode uint16 - Nlink uint16 - Ino uint64 - Uid uint32 - Gid uint32 - Rdev int32 - Atimespec Timespec - Mtimespec Timespec - Ctimespec Timespec - Birthtimespec Timespec - Size int64 - Blocks int64 - Blksize int32 - Flags uint32 - Gen uint32 - Lspare int32 - Qspare [2]int64 + Dev int32 + Mode uint16 + Nlink uint16 + Ino uint64 + Uid uint32 + Gid uint32 + Rdev int32 + Atim Timespec + Mtim Timespec + Ctim Timespec + Btim Timespec + Size int64 + Blocks int64 + Blksize int32 + Flags uint32 + Gen uint32 + Lspare int32 + Qspare [2]int64 } type Statfs_t struct { diff --git a/vendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go index c6bb883c..966798a8 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go @@ -63,25 +63,25 @@ type Rlimit struct { type _Gid_t uint32 type Stat_t struct { - Dev int32 - Mode uint16 - Nlink uint16 - Ino uint64 - Uid uint32 - Gid uint32 - Rdev int32 - _ [4]byte - Atimespec Timespec - Mtimespec Timespec - Ctimespec Timespec - Birthtimespec Timespec - Size int64 - Blocks int64 - Blksize int32 - Flags uint32 - Gen uint32 - Lspare int32 - Qspare [2]int64 + Dev int32 + Mode uint16 + Nlink uint16 + Ino uint64 + Uid uint32 + Gid uint32 + Rdev int32 + _ [4]byte + Atim Timespec + Mtim Timespec + Ctim Timespec + Btim Timespec + Size int64 + Blocks int64 + Blksize int32 + Flags uint32 + Gen uint32 + Lspare int32 + Qspare [2]int64 } type Statfs_t struct { diff --git a/vendor/golang.org/x/sys/unix/ztypes_darwin_arm.go b/vendor/golang.org/x/sys/unix/ztypes_darwin_arm.go index 94c23bc2..4fe4c9cd 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_darwin_arm.go +++ b/vendor/golang.org/x/sys/unix/ztypes_darwin_arm.go @@ -60,24 +60,24 @@ type Rlimit struct { type _Gid_t uint32 type Stat_t struct { - Dev int32 - Mode uint16 - Nlink uint16 - Ino uint64 - Uid uint32 - Gid uint32 - Rdev int32 - Atimespec Timespec - Mtimespec Timespec - Ctimespec Timespec - Birthtimespec Timespec - Size int64 - Blocks int64 - Blksize int32 - Flags uint32 - Gen uint32 - Lspare int32 - Qspare [2]int64 + Dev int32 + Mode uint16 + Nlink uint16 + Ino uint64 + Uid uint32 + Gid uint32 + Rdev int32 + Atim Timespec + Mtim Timespec + Ctim Timespec + Btim Timespec + Size int64 + Blocks int64 + Blksize int32 + Flags uint32 + Gen uint32 + Lspare int32 + Qspare [2]int64 } type Statfs_t struct { diff --git a/vendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go b/vendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go index c82a930c..21999e4b 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go @@ -63,25 +63,25 @@ type Rlimit struct { type _Gid_t uint32 type Stat_t struct { - Dev int32 - Mode uint16 - Nlink uint16 - Ino uint64 - Uid uint32 - Gid uint32 - Rdev int32 - _ [4]byte - Atimespec Timespec - Mtimespec Timespec - Ctimespec Timespec - Birthtimespec Timespec - Size int64 - Blocks int64 - Blksize int32 - Flags uint32 - Gen uint32 - Lspare int32 - Qspare [2]int64 + Dev int32 + Mode uint16 + Nlink uint16 + Ino uint64 + Uid uint32 + Gid uint32 + Rdev int32 + _ [4]byte + Atim Timespec + Mtim Timespec + Ctim Timespec + Btim Timespec + Size int64 + Blocks int64 + Blksize int32 + Flags uint32 + Gen uint32 + Lspare int32 + Qspare [2]int64 } type Statfs_t struct { diff --git a/vendor/golang.org/x/sys/unix/ztypes_dragonfly_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_dragonfly_amd64.go index 7b34e2e2..c206f2b0 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_dragonfly_amd64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_dragonfly_amd64.go @@ -57,25 +57,25 @@ type Rlimit struct { type _Gid_t uint32 type Stat_t struct { - Ino uint64 - Nlink uint32 - Dev uint32 - Mode uint16 - Padding1 uint16 - Uid uint32 - Gid uint32 - Rdev uint32 - Atim Timespec - Mtim Timespec - Ctim Timespec - Size int64 - Blocks int64 - Blksize uint32 - Flags uint32 - Gen uint32 - Lspare int32 - Qspare1 int64 - Qspare2 int64 + Ino uint64 + Nlink uint32 + Dev uint32 + Mode uint16 + _1 uint16 + Uid uint32 + Gid uint32 + Rdev uint32 + Atim Timespec + Mtim Timespec + Ctim Timespec + Size int64 + Blocks int64 + Blksize uint32 + Flags uint32 + Gen uint32 + Lspare int32 + Qspare1 int64 + Qspare2 int64 } type Statfs_t struct { diff --git a/vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go b/vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go index c146c1ad..0edc5409 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go +++ b/vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go @@ -62,50 +62,50 @@ const ( ) type Stat_t struct { - Dev uint64 - Ino uint64 - Nlink uint64 - Mode uint16 - _0 int16 - Uid uint32 - Gid uint32 - _1 int32 - Rdev uint64 - Atim_ext int32 - Atim Timespec - Mtim_ext int32 - Mtim Timespec - Ctim_ext int32 - Ctim Timespec - Btim_ext int32 - Birthtim Timespec - Size int64 - Blocks int64 - Blksize int32 - Flags uint32 - Gen uint64 - Spare [10]uint64 + Dev uint64 + Ino uint64 + Nlink uint64 + Mode uint16 + _0 int16 + Uid uint32 + Gid uint32 + _1 int32 + Rdev uint64 + _ int32 + Atim Timespec + _ int32 + Mtim Timespec + _ int32 + Ctim Timespec + _ int32 + Btim Timespec + Size int64 + Blocks int64 + Blksize int32 + Flags uint32 + Gen uint64 + Spare [10]uint64 } type stat_freebsd11_t struct { - Dev uint32 - Ino uint32 - Mode uint16 - Nlink uint16 - Uid uint32 - Gid uint32 - Rdev uint32 - Atim Timespec - Mtim Timespec - Ctim Timespec - Size int64 - Blocks int64 - Blksize int32 - Flags uint32 - Gen uint32 - Lspare int32 - Birthtim Timespec - _ [8]byte + Dev uint32 + Ino uint32 + Mode uint16 + Nlink uint16 + Uid uint32 + Gid uint32 + Rdev uint32 + Atim Timespec + Mtim Timespec + Ctim Timespec + Size int64 + Blocks int64 + Blksize int32 + Flags uint32 + Gen uint32 + Lspare int32 + Btim Timespec + _ [8]byte } type Statfs_t struct { diff --git a/vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go index ac33a8dd..8881ce84 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go @@ -62,45 +62,45 @@ const ( ) type Stat_t struct { - Dev uint64 - Ino uint64 - Nlink uint64 - Mode uint16 - _0 int16 - Uid uint32 - Gid uint32 - _1 int32 - Rdev uint64 - Atim Timespec - Mtim Timespec - Ctim Timespec - Birthtim Timespec - Size int64 - Blocks int64 - Blksize int32 - Flags uint32 - Gen uint64 - Spare [10]uint64 + Dev uint64 + Ino uint64 + Nlink uint64 + Mode uint16 + _0 int16 + Uid uint32 + Gid uint32 + _1 int32 + Rdev uint64 + Atim Timespec + Mtim Timespec + Ctim Timespec + Btim Timespec + Size int64 + Blocks int64 + Blksize int32 + Flags uint32 + Gen uint64 + Spare [10]uint64 } type stat_freebsd11_t struct { - Dev uint32 - Ino uint32 - Mode uint16 - Nlink uint16 - Uid uint32 - Gid uint32 - Rdev uint32 - Atim Timespec - Mtim Timespec - Ctim Timespec - Size int64 - Blocks int64 - Blksize int32 - Flags uint32 - Gen uint32 - Lspare int32 - Birthtim Timespec + Dev uint32 + Ino uint32 + Mode uint16 + Nlink uint16 + Uid uint32 + Gid uint32 + Rdev uint32 + Atim Timespec + Mtim Timespec + Ctim Timespec + Size int64 + Blocks int64 + Blksize int32 + Flags uint32 + Gen uint32 + Lspare int32 + Btim Timespec } type Statfs_t struct { diff --git a/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go b/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go index e27511a6..fc713999 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go +++ b/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go @@ -64,45 +64,45 @@ const ( ) type Stat_t struct { - Dev uint64 - Ino uint64 - Nlink uint64 - Mode uint16 - _0 int16 - Uid uint32 - Gid uint32 - _1 int32 - Rdev uint64 - Atim Timespec - Mtim Timespec - Ctim Timespec - Birthtim Timespec - Size int64 - Blocks int64 - Blksize int32 - Flags uint32 - Gen uint64 - Spare [10]uint64 + Dev uint64 + Ino uint64 + Nlink uint64 + Mode uint16 + _0 int16 + Uid uint32 + Gid uint32 + _1 int32 + Rdev uint64 + Atim Timespec + Mtim Timespec + Ctim Timespec + Btim Timespec + Size int64 + Blocks int64 + Blksize int32 + Flags uint32 + Gen uint64 + Spare [10]uint64 } type stat_freebsd11_t struct { - Dev uint32 - Ino uint32 - Mode uint16 - Nlink uint16 - Uid uint32 - Gid uint32 - Rdev uint32 - Atim Timespec - Mtim Timespec - Ctim Timespec - Size int64 - Blocks int64 - Blksize int32 - Flags uint32 - Gen uint32 - Lspare int32 - Birthtim Timespec + Dev uint32 + Ino uint32 + Mode uint16 + Nlink uint16 + Uid uint32 + Gid uint32 + Rdev uint32 + Atim Timespec + Mtim Timespec + Ctim Timespec + Size int64 + Blocks int64 + Blksize int32 + Flags uint32 + Gen uint32 + Lspare int32 + Btim Timespec } type Statfs_t struct { diff --git a/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm64.go b/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm64.go index 2aadc1a4..5a0753ee 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm64.go @@ -62,45 +62,45 @@ const ( ) type Stat_t struct { - Dev uint64 - Ino uint64 - Nlink uint64 - Mode uint16 - _0 int16 - Uid uint32 - Gid uint32 - _1 int32 - Rdev uint64 - Atim Timespec - Mtim Timespec - Ctim Timespec - Birthtim Timespec - Size int64 - Blocks int64 - Blksize int32 - Flags uint32 - Gen uint64 - Spare [10]uint64 + Dev uint64 + Ino uint64 + Nlink uint64 + Mode uint16 + _0 int16 + Uid uint32 + Gid uint32 + _1 int32 + Rdev uint64 + Atim Timespec + Mtim Timespec + Ctim Timespec + Btim Timespec + Size int64 + Blocks int64 + Blksize int32 + Flags uint32 + Gen uint64 + Spare [10]uint64 } type stat_freebsd11_t struct { - Dev uint32 - Ino uint32 - Mode uint16 - Nlink uint16 - Uid uint32 - Gid uint32 - Rdev uint32 - Atim Timespec - Mtim Timespec - Ctim Timespec - Size int64 - Blocks int64 - Blksize int32 - Flags uint32 - Gen uint32 - Lspare int32 - Birthtim Timespec + Dev uint32 + Ino uint32 + Mode uint16 + Nlink uint16 + Uid uint32 + Gid uint32 + Rdev uint32 + Atim Timespec + Mtim Timespec + Ctim Timespec + Size int64 + Blocks int64 + Blksize int32 + Flags uint32 + Gen uint32 + Lspare int32 + Btim Timespec } type Statfs_t struct { diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_386.go b/vendor/golang.org/x/sys/unix/ztypes_linux_386.go index a908f259..06e3a3f4 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_386.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_386.go @@ -829,6 +829,8 @@ type Sigset_t struct { Val [32]uint32 } +const _C__NSIG = 0x41 + type SignalfdSiginfo struct { Signo uint32 Errno int32 @@ -1452,6 +1454,21 @@ type TpacketBlockDesc struct { Hdr [40]byte } +type TpacketBDTS struct { + Sec uint32 + Usec uint32 +} + +type TpacketHdrV1 struct { + Block_status uint32 + Num_pkts uint32 + Offset_to_first_pkt uint32 + Blk_len uint32 + Seq_num uint64 + Ts_first_pkt TpacketBDTS + Ts_last_pkt TpacketBDTS +} + type TpacketReq struct { Block_size uint32 Block_nr uint32 @@ -2133,3 +2150,320 @@ type FanotifyResponse struct { Fd int32 Response uint32 } + +const ( + CRYPTO_MSG_BASE = 0x10 + CRYPTO_MSG_NEWALG = 0x10 + CRYPTO_MSG_DELALG = 0x11 + CRYPTO_MSG_UPDATEALG = 0x12 + CRYPTO_MSG_GETALG = 0x13 + CRYPTO_MSG_DELRNG = 0x14 + CRYPTO_MSG_GETSTAT = 0x15 +) + +const ( + CRYPTOCFGA_UNSPEC = 0x0 + CRYPTOCFGA_PRIORITY_VAL = 0x1 + CRYPTOCFGA_REPORT_LARVAL = 0x2 + CRYPTOCFGA_REPORT_HASH = 0x3 + CRYPTOCFGA_REPORT_BLKCIPHER = 0x4 + CRYPTOCFGA_REPORT_AEAD = 0x5 + CRYPTOCFGA_REPORT_COMPRESS = 0x6 + CRYPTOCFGA_REPORT_RNG = 0x7 + CRYPTOCFGA_REPORT_CIPHER = 0x8 + CRYPTOCFGA_REPORT_AKCIPHER = 0x9 + CRYPTOCFGA_REPORT_KPP = 0xa + CRYPTOCFGA_REPORT_ACOMP = 0xb + CRYPTOCFGA_STAT_LARVAL = 0xc + CRYPTOCFGA_STAT_HASH = 0xd + CRYPTOCFGA_STAT_BLKCIPHER = 0xe + CRYPTOCFGA_STAT_AEAD = 0xf + CRYPTOCFGA_STAT_COMPRESS = 0x10 + CRYPTOCFGA_STAT_RNG = 0x11 + CRYPTOCFGA_STAT_CIPHER = 0x12 + CRYPTOCFGA_STAT_AKCIPHER = 0x13 + CRYPTOCFGA_STAT_KPP = 0x14 + CRYPTOCFGA_STAT_ACOMP = 0x15 +) + +type CryptoUserAlg struct { + Name [64]int8 + Driver_name [64]int8 + Module_name [64]int8 + Type uint32 + Mask uint32 + Refcnt uint32 + Flags uint32 +} + +type CryptoStatAEAD struct { + Type [64]int8 + Encrypt_cnt uint64 + Encrypt_tlen uint64 + Decrypt_cnt uint64 + Decrypt_tlen uint64 + Err_cnt uint64 +} + +type CryptoStatAKCipher struct { + Type [64]int8 + Encrypt_cnt uint64 + Encrypt_tlen uint64 + Decrypt_cnt uint64 + Decrypt_tlen uint64 + Verify_cnt uint64 + Sign_cnt uint64 + Err_cnt uint64 +} + +type CryptoStatCipher struct { + Type [64]int8 + Encrypt_cnt uint64 + Encrypt_tlen uint64 + Decrypt_cnt uint64 + Decrypt_tlen uint64 + Err_cnt uint64 +} + +type CryptoStatCompress struct { + Type [64]int8 + Compress_cnt uint64 + Compress_tlen uint64 + Decompress_cnt uint64 + Decompress_tlen uint64 + Err_cnt uint64 +} + +type CryptoStatHash struct { + Type [64]int8 + Hash_cnt uint64 + Hash_tlen uint64 + Err_cnt uint64 +} + +type CryptoStatKPP struct { + Type [64]int8 + Setsecret_cnt uint64 + Generate_public_key_cnt uint64 + Compute_shared_secret_cnt uint64 + Err_cnt uint64 +} + +type CryptoStatRNG struct { + Type [64]int8 + Generate_cnt uint64 + Generate_tlen uint64 + Seed_cnt uint64 + Err_cnt uint64 +} + +type CryptoStatLarval struct { + Type [64]int8 +} + +type CryptoReportLarval struct { + Type [64]int8 +} + +type CryptoReportHash struct { + Type [64]int8 + Blocksize uint32 + Digestsize uint32 +} + +type CryptoReportCipher struct { + Type [64]int8 + Blocksize uint32 + Min_keysize uint32 + Max_keysize uint32 +} + +type CryptoReportBlkCipher struct { + Type [64]int8 + Geniv [64]int8 + Blocksize uint32 + Min_keysize uint32 + Max_keysize uint32 + Ivsize uint32 +} + +type CryptoReportAEAD struct { + Type [64]int8 + Geniv [64]int8 + Blocksize uint32 + Maxauthsize uint32 + Ivsize uint32 +} + +type CryptoReportComp struct { + Type [64]int8 +} + +type CryptoReportRNG struct { + Type [64]int8 + Seedsize uint32 +} + +type CryptoReportAKCipher struct { + Type [64]int8 +} + +type CryptoReportKPP struct { + Type [64]int8 +} + +type CryptoReportAcomp struct { + Type [64]int8 +} + +const ( + BPF_REG_0 = 0x0 + BPF_REG_1 = 0x1 + BPF_REG_2 = 0x2 + BPF_REG_3 = 0x3 + BPF_REG_4 = 0x4 + BPF_REG_5 = 0x5 + BPF_REG_6 = 0x6 + BPF_REG_7 = 0x7 + BPF_REG_8 = 0x8 + BPF_REG_9 = 0x9 + BPF_REG_10 = 0xa + BPF_MAP_CREATE = 0x0 + BPF_MAP_LOOKUP_ELEM = 0x1 + BPF_MAP_UPDATE_ELEM = 0x2 + BPF_MAP_DELETE_ELEM = 0x3 + BPF_MAP_GET_NEXT_KEY = 0x4 + BPF_PROG_LOAD = 0x5 + BPF_OBJ_PIN = 0x6 + BPF_OBJ_GET = 0x7 + BPF_PROG_ATTACH = 0x8 + BPF_PROG_DETACH = 0x9 + BPF_PROG_TEST_RUN = 0xa + BPF_PROG_GET_NEXT_ID = 0xb + BPF_MAP_GET_NEXT_ID = 0xc + BPF_PROG_GET_FD_BY_ID = 0xd + BPF_MAP_GET_FD_BY_ID = 0xe + BPF_OBJ_GET_INFO_BY_FD = 0xf + BPF_PROG_QUERY = 0x10 + BPF_RAW_TRACEPOINT_OPEN = 0x11 + BPF_BTF_LOAD = 0x12 + BPF_BTF_GET_FD_BY_ID = 0x13 + BPF_TASK_FD_QUERY = 0x14 + BPF_MAP_LOOKUP_AND_DELETE_ELEM = 0x15 + BPF_MAP_TYPE_UNSPEC = 0x0 + BPF_MAP_TYPE_HASH = 0x1 + BPF_MAP_TYPE_ARRAY = 0x2 + BPF_MAP_TYPE_PROG_ARRAY = 0x3 + BPF_MAP_TYPE_PERF_EVENT_ARRAY = 0x4 + BPF_MAP_TYPE_PERCPU_HASH = 0x5 + BPF_MAP_TYPE_PERCPU_ARRAY = 0x6 + BPF_MAP_TYPE_STACK_TRACE = 0x7 + BPF_MAP_TYPE_CGROUP_ARRAY = 0x8 + BPF_MAP_TYPE_LRU_HASH = 0x9 + BPF_MAP_TYPE_LRU_PERCPU_HASH = 0xa + BPF_MAP_TYPE_LPM_TRIE = 0xb + BPF_MAP_TYPE_ARRAY_OF_MAPS = 0xc + BPF_MAP_TYPE_HASH_OF_MAPS = 0xd + BPF_MAP_TYPE_DEVMAP = 0xe + BPF_MAP_TYPE_SOCKMAP = 0xf + BPF_MAP_TYPE_CPUMAP = 0x10 + BPF_MAP_TYPE_XSKMAP = 0x11 + BPF_MAP_TYPE_SOCKHASH = 0x12 + BPF_MAP_TYPE_CGROUP_STORAGE = 0x13 + BPF_MAP_TYPE_REUSEPORT_SOCKARRAY = 0x14 + BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE = 0x15 + BPF_MAP_TYPE_QUEUE = 0x16 + BPF_MAP_TYPE_STACK = 0x17 + BPF_PROG_TYPE_UNSPEC = 0x0 + BPF_PROG_TYPE_SOCKET_FILTER = 0x1 + BPF_PROG_TYPE_KPROBE = 0x2 + BPF_PROG_TYPE_SCHED_CLS = 0x3 + BPF_PROG_TYPE_SCHED_ACT = 0x4 + BPF_PROG_TYPE_TRACEPOINT = 0x5 + BPF_PROG_TYPE_XDP = 0x6 + BPF_PROG_TYPE_PERF_EVENT = 0x7 + BPF_PROG_TYPE_CGROUP_SKB = 0x8 + BPF_PROG_TYPE_CGROUP_SOCK = 0x9 + BPF_PROG_TYPE_LWT_IN = 0xa + BPF_PROG_TYPE_LWT_OUT = 0xb + BPF_PROG_TYPE_LWT_XMIT = 0xc + BPF_PROG_TYPE_SOCK_OPS = 0xd + BPF_PROG_TYPE_SK_SKB = 0xe + BPF_PROG_TYPE_CGROUP_DEVICE = 0xf + BPF_PROG_TYPE_SK_MSG = 0x10 + BPF_PROG_TYPE_RAW_TRACEPOINT = 0x11 + BPF_PROG_TYPE_CGROUP_SOCK_ADDR = 0x12 + BPF_PROG_TYPE_LWT_SEG6LOCAL = 0x13 + BPF_PROG_TYPE_LIRC_MODE2 = 0x14 + BPF_PROG_TYPE_SK_REUSEPORT = 0x15 + BPF_PROG_TYPE_FLOW_DISSECTOR = 0x16 + BPF_CGROUP_INET_INGRESS = 0x0 + BPF_CGROUP_INET_EGRESS = 0x1 + BPF_CGROUP_INET_SOCK_CREATE = 0x2 + BPF_CGROUP_SOCK_OPS = 0x3 + BPF_SK_SKB_STREAM_PARSER = 0x4 + BPF_SK_SKB_STREAM_VERDICT = 0x5 + BPF_CGROUP_DEVICE = 0x6 + BPF_SK_MSG_VERDICT = 0x7 + BPF_CGROUP_INET4_BIND = 0x8 + BPF_CGROUP_INET6_BIND = 0x9 + BPF_CGROUP_INET4_CONNECT = 0xa + BPF_CGROUP_INET6_CONNECT = 0xb + BPF_CGROUP_INET4_POST_BIND = 0xc + BPF_CGROUP_INET6_POST_BIND = 0xd + BPF_CGROUP_UDP4_SENDMSG = 0xe + BPF_CGROUP_UDP6_SENDMSG = 0xf + BPF_LIRC_MODE2 = 0x10 + BPF_FLOW_DISSECTOR = 0x11 + BPF_STACK_BUILD_ID_EMPTY = 0x0 + BPF_STACK_BUILD_ID_VALID = 0x1 + BPF_STACK_BUILD_ID_IP = 0x2 + BPF_ADJ_ROOM_NET = 0x0 + BPF_HDR_START_MAC = 0x0 + BPF_HDR_START_NET = 0x1 + BPF_LWT_ENCAP_SEG6 = 0x0 + BPF_LWT_ENCAP_SEG6_INLINE = 0x1 + BPF_OK = 0x0 + BPF_DROP = 0x2 + BPF_REDIRECT = 0x7 + BPF_SOCK_OPS_VOID = 0x0 + BPF_SOCK_OPS_TIMEOUT_INIT = 0x1 + BPF_SOCK_OPS_RWND_INIT = 0x2 + BPF_SOCK_OPS_TCP_CONNECT_CB = 0x3 + BPF_SOCK_OPS_ACTIVE_ESTABLISHED_CB = 0x4 + BPF_SOCK_OPS_PASSIVE_ESTABLISHED_CB = 0x5 + BPF_SOCK_OPS_NEEDS_ECN = 0x6 + BPF_SOCK_OPS_BASE_RTT = 0x7 + BPF_SOCK_OPS_RTO_CB = 0x8 + BPF_SOCK_OPS_RETRANS_CB = 0x9 + BPF_SOCK_OPS_STATE_CB = 0xa + BPF_SOCK_OPS_TCP_LISTEN_CB = 0xb + BPF_TCP_ESTABLISHED = 0x1 + BPF_TCP_SYN_SENT = 0x2 + BPF_TCP_SYN_RECV = 0x3 + BPF_TCP_FIN_WAIT1 = 0x4 + BPF_TCP_FIN_WAIT2 = 0x5 + BPF_TCP_TIME_WAIT = 0x6 + BPF_TCP_CLOSE = 0x7 + BPF_TCP_CLOSE_WAIT = 0x8 + BPF_TCP_LAST_ACK = 0x9 + BPF_TCP_LISTEN = 0xa + BPF_TCP_CLOSING = 0xb + BPF_TCP_NEW_SYN_RECV = 0xc + BPF_TCP_MAX_STATES = 0xd + BPF_FIB_LKUP_RET_SUCCESS = 0x0 + BPF_FIB_LKUP_RET_BLACKHOLE = 0x1 + BPF_FIB_LKUP_RET_UNREACHABLE = 0x2 + BPF_FIB_LKUP_RET_PROHIBIT = 0x3 + BPF_FIB_LKUP_RET_NOT_FWDED = 0x4 + BPF_FIB_LKUP_RET_FWD_DISABLED = 0x5 + BPF_FIB_LKUP_RET_UNSUPP_LWT = 0x6 + BPF_FIB_LKUP_RET_NO_NEIGH = 0x7 + BPF_FIB_LKUP_RET_FRAG_NEEDED = 0x8 + BPF_FD_TYPE_RAW_TRACEPOINT = 0x0 + BPF_FD_TYPE_TRACEPOINT = 0x1 + BPF_FD_TYPE_KPROBE = 0x2 + BPF_FD_TYPE_KRETPROBE = 0x3 + BPF_FD_TYPE_UPROBE = 0x4 + BPF_FD_TYPE_URETPROBE = 0x5 +) diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go index e63fa741..cef25e73 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go @@ -842,6 +842,8 @@ type Sigset_t struct { Val [16]uint64 } +const _C__NSIG = 0x41 + type SignalfdSiginfo struct { Signo uint32 Errno int32 @@ -1464,6 +1466,21 @@ type TpacketBlockDesc struct { Hdr [40]byte } +type TpacketBDTS struct { + Sec uint32 + Usec uint32 +} + +type TpacketHdrV1 struct { + Block_status uint32 + Num_pkts uint32 + Offset_to_first_pkt uint32 + Blk_len uint32 + Seq_num uint64 + Ts_first_pkt TpacketBDTS + Ts_last_pkt TpacketBDTS +} + type TpacketReq struct { Block_size uint32 Block_nr uint32 @@ -2146,3 +2163,320 @@ type FanotifyResponse struct { Fd int32 Response uint32 } + +const ( + CRYPTO_MSG_BASE = 0x10 + CRYPTO_MSG_NEWALG = 0x10 + CRYPTO_MSG_DELALG = 0x11 + CRYPTO_MSG_UPDATEALG = 0x12 + CRYPTO_MSG_GETALG = 0x13 + CRYPTO_MSG_DELRNG = 0x14 + CRYPTO_MSG_GETSTAT = 0x15 +) + +const ( + CRYPTOCFGA_UNSPEC = 0x0 + CRYPTOCFGA_PRIORITY_VAL = 0x1 + CRYPTOCFGA_REPORT_LARVAL = 0x2 + CRYPTOCFGA_REPORT_HASH = 0x3 + CRYPTOCFGA_REPORT_BLKCIPHER = 0x4 + CRYPTOCFGA_REPORT_AEAD = 0x5 + CRYPTOCFGA_REPORT_COMPRESS = 0x6 + CRYPTOCFGA_REPORT_RNG = 0x7 + CRYPTOCFGA_REPORT_CIPHER = 0x8 + CRYPTOCFGA_REPORT_AKCIPHER = 0x9 + CRYPTOCFGA_REPORT_KPP = 0xa + CRYPTOCFGA_REPORT_ACOMP = 0xb + CRYPTOCFGA_STAT_LARVAL = 0xc + CRYPTOCFGA_STAT_HASH = 0xd + CRYPTOCFGA_STAT_BLKCIPHER = 0xe + CRYPTOCFGA_STAT_AEAD = 0xf + CRYPTOCFGA_STAT_COMPRESS = 0x10 + CRYPTOCFGA_STAT_RNG = 0x11 + CRYPTOCFGA_STAT_CIPHER = 0x12 + CRYPTOCFGA_STAT_AKCIPHER = 0x13 + CRYPTOCFGA_STAT_KPP = 0x14 + CRYPTOCFGA_STAT_ACOMP = 0x15 +) + +type CryptoUserAlg struct { + Name [64]int8 + Driver_name [64]int8 + Module_name [64]int8 + Type uint32 + Mask uint32 + Refcnt uint32 + Flags uint32 +} + +type CryptoStatAEAD struct { + Type [64]int8 + Encrypt_cnt uint64 + Encrypt_tlen uint64 + Decrypt_cnt uint64 + Decrypt_tlen uint64 + Err_cnt uint64 +} + +type CryptoStatAKCipher struct { + Type [64]int8 + Encrypt_cnt uint64 + Encrypt_tlen uint64 + Decrypt_cnt uint64 + Decrypt_tlen uint64 + Verify_cnt uint64 + Sign_cnt uint64 + Err_cnt uint64 +} + +type CryptoStatCipher struct { + Type [64]int8 + Encrypt_cnt uint64 + Encrypt_tlen uint64 + Decrypt_cnt uint64 + Decrypt_tlen uint64 + Err_cnt uint64 +} + +type CryptoStatCompress struct { + Type [64]int8 + Compress_cnt uint64 + Compress_tlen uint64 + Decompress_cnt uint64 + Decompress_tlen uint64 + Err_cnt uint64 +} + +type CryptoStatHash struct { + Type [64]int8 + Hash_cnt uint64 + Hash_tlen uint64 + Err_cnt uint64 +} + +type CryptoStatKPP struct { + Type [64]int8 + Setsecret_cnt uint64 + Generate_public_key_cnt uint64 + Compute_shared_secret_cnt uint64 + Err_cnt uint64 +} + +type CryptoStatRNG struct { + Type [64]int8 + Generate_cnt uint64 + Generate_tlen uint64 + Seed_cnt uint64 + Err_cnt uint64 +} + +type CryptoStatLarval struct { + Type [64]int8 +} + +type CryptoReportLarval struct { + Type [64]int8 +} + +type CryptoReportHash struct { + Type [64]int8 + Blocksize uint32 + Digestsize uint32 +} + +type CryptoReportCipher struct { + Type [64]int8 + Blocksize uint32 + Min_keysize uint32 + Max_keysize uint32 +} + +type CryptoReportBlkCipher struct { + Type [64]int8 + Geniv [64]int8 + Blocksize uint32 + Min_keysize uint32 + Max_keysize uint32 + Ivsize uint32 +} + +type CryptoReportAEAD struct { + Type [64]int8 + Geniv [64]int8 + Blocksize uint32 + Maxauthsize uint32 + Ivsize uint32 +} + +type CryptoReportComp struct { + Type [64]int8 +} + +type CryptoReportRNG struct { + Type [64]int8 + Seedsize uint32 +} + +type CryptoReportAKCipher struct { + Type [64]int8 +} + +type CryptoReportKPP struct { + Type [64]int8 +} + +type CryptoReportAcomp struct { + Type [64]int8 +} + +const ( + BPF_REG_0 = 0x0 + BPF_REG_1 = 0x1 + BPF_REG_2 = 0x2 + BPF_REG_3 = 0x3 + BPF_REG_4 = 0x4 + BPF_REG_5 = 0x5 + BPF_REG_6 = 0x6 + BPF_REG_7 = 0x7 + BPF_REG_8 = 0x8 + BPF_REG_9 = 0x9 + BPF_REG_10 = 0xa + BPF_MAP_CREATE = 0x0 + BPF_MAP_LOOKUP_ELEM = 0x1 + BPF_MAP_UPDATE_ELEM = 0x2 + BPF_MAP_DELETE_ELEM = 0x3 + BPF_MAP_GET_NEXT_KEY = 0x4 + BPF_PROG_LOAD = 0x5 + BPF_OBJ_PIN = 0x6 + BPF_OBJ_GET = 0x7 + BPF_PROG_ATTACH = 0x8 + BPF_PROG_DETACH = 0x9 + BPF_PROG_TEST_RUN = 0xa + BPF_PROG_GET_NEXT_ID = 0xb + BPF_MAP_GET_NEXT_ID = 0xc + BPF_PROG_GET_FD_BY_ID = 0xd + BPF_MAP_GET_FD_BY_ID = 0xe + BPF_OBJ_GET_INFO_BY_FD = 0xf + BPF_PROG_QUERY = 0x10 + BPF_RAW_TRACEPOINT_OPEN = 0x11 + BPF_BTF_LOAD = 0x12 + BPF_BTF_GET_FD_BY_ID = 0x13 + BPF_TASK_FD_QUERY = 0x14 + BPF_MAP_LOOKUP_AND_DELETE_ELEM = 0x15 + BPF_MAP_TYPE_UNSPEC = 0x0 + BPF_MAP_TYPE_HASH = 0x1 + BPF_MAP_TYPE_ARRAY = 0x2 + BPF_MAP_TYPE_PROG_ARRAY = 0x3 + BPF_MAP_TYPE_PERF_EVENT_ARRAY = 0x4 + BPF_MAP_TYPE_PERCPU_HASH = 0x5 + BPF_MAP_TYPE_PERCPU_ARRAY = 0x6 + BPF_MAP_TYPE_STACK_TRACE = 0x7 + BPF_MAP_TYPE_CGROUP_ARRAY = 0x8 + BPF_MAP_TYPE_LRU_HASH = 0x9 + BPF_MAP_TYPE_LRU_PERCPU_HASH = 0xa + BPF_MAP_TYPE_LPM_TRIE = 0xb + BPF_MAP_TYPE_ARRAY_OF_MAPS = 0xc + BPF_MAP_TYPE_HASH_OF_MAPS = 0xd + BPF_MAP_TYPE_DEVMAP = 0xe + BPF_MAP_TYPE_SOCKMAP = 0xf + BPF_MAP_TYPE_CPUMAP = 0x10 + BPF_MAP_TYPE_XSKMAP = 0x11 + BPF_MAP_TYPE_SOCKHASH = 0x12 + BPF_MAP_TYPE_CGROUP_STORAGE = 0x13 + BPF_MAP_TYPE_REUSEPORT_SOCKARRAY = 0x14 + BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE = 0x15 + BPF_MAP_TYPE_QUEUE = 0x16 + BPF_MAP_TYPE_STACK = 0x17 + BPF_PROG_TYPE_UNSPEC = 0x0 + BPF_PROG_TYPE_SOCKET_FILTER = 0x1 + BPF_PROG_TYPE_KPROBE = 0x2 + BPF_PROG_TYPE_SCHED_CLS = 0x3 + BPF_PROG_TYPE_SCHED_ACT = 0x4 + BPF_PROG_TYPE_TRACEPOINT = 0x5 + BPF_PROG_TYPE_XDP = 0x6 + BPF_PROG_TYPE_PERF_EVENT = 0x7 + BPF_PROG_TYPE_CGROUP_SKB = 0x8 + BPF_PROG_TYPE_CGROUP_SOCK = 0x9 + BPF_PROG_TYPE_LWT_IN = 0xa + BPF_PROG_TYPE_LWT_OUT = 0xb + BPF_PROG_TYPE_LWT_XMIT = 0xc + BPF_PROG_TYPE_SOCK_OPS = 0xd + BPF_PROG_TYPE_SK_SKB = 0xe + BPF_PROG_TYPE_CGROUP_DEVICE = 0xf + BPF_PROG_TYPE_SK_MSG = 0x10 + BPF_PROG_TYPE_RAW_TRACEPOINT = 0x11 + BPF_PROG_TYPE_CGROUP_SOCK_ADDR = 0x12 + BPF_PROG_TYPE_LWT_SEG6LOCAL = 0x13 + BPF_PROG_TYPE_LIRC_MODE2 = 0x14 + BPF_PROG_TYPE_SK_REUSEPORT = 0x15 + BPF_PROG_TYPE_FLOW_DISSECTOR = 0x16 + BPF_CGROUP_INET_INGRESS = 0x0 + BPF_CGROUP_INET_EGRESS = 0x1 + BPF_CGROUP_INET_SOCK_CREATE = 0x2 + BPF_CGROUP_SOCK_OPS = 0x3 + BPF_SK_SKB_STREAM_PARSER = 0x4 + BPF_SK_SKB_STREAM_VERDICT = 0x5 + BPF_CGROUP_DEVICE = 0x6 + BPF_SK_MSG_VERDICT = 0x7 + BPF_CGROUP_INET4_BIND = 0x8 + BPF_CGROUP_INET6_BIND = 0x9 + BPF_CGROUP_INET4_CONNECT = 0xa + BPF_CGROUP_INET6_CONNECT = 0xb + BPF_CGROUP_INET4_POST_BIND = 0xc + BPF_CGROUP_INET6_POST_BIND = 0xd + BPF_CGROUP_UDP4_SENDMSG = 0xe + BPF_CGROUP_UDP6_SENDMSG = 0xf + BPF_LIRC_MODE2 = 0x10 + BPF_FLOW_DISSECTOR = 0x11 + BPF_STACK_BUILD_ID_EMPTY = 0x0 + BPF_STACK_BUILD_ID_VALID = 0x1 + BPF_STACK_BUILD_ID_IP = 0x2 + BPF_ADJ_ROOM_NET = 0x0 + BPF_HDR_START_MAC = 0x0 + BPF_HDR_START_NET = 0x1 + BPF_LWT_ENCAP_SEG6 = 0x0 + BPF_LWT_ENCAP_SEG6_INLINE = 0x1 + BPF_OK = 0x0 + BPF_DROP = 0x2 + BPF_REDIRECT = 0x7 + BPF_SOCK_OPS_VOID = 0x0 + BPF_SOCK_OPS_TIMEOUT_INIT = 0x1 + BPF_SOCK_OPS_RWND_INIT = 0x2 + BPF_SOCK_OPS_TCP_CONNECT_CB = 0x3 + BPF_SOCK_OPS_ACTIVE_ESTABLISHED_CB = 0x4 + BPF_SOCK_OPS_PASSIVE_ESTABLISHED_CB = 0x5 + BPF_SOCK_OPS_NEEDS_ECN = 0x6 + BPF_SOCK_OPS_BASE_RTT = 0x7 + BPF_SOCK_OPS_RTO_CB = 0x8 + BPF_SOCK_OPS_RETRANS_CB = 0x9 + BPF_SOCK_OPS_STATE_CB = 0xa + BPF_SOCK_OPS_TCP_LISTEN_CB = 0xb + BPF_TCP_ESTABLISHED = 0x1 + BPF_TCP_SYN_SENT = 0x2 + BPF_TCP_SYN_RECV = 0x3 + BPF_TCP_FIN_WAIT1 = 0x4 + BPF_TCP_FIN_WAIT2 = 0x5 + BPF_TCP_TIME_WAIT = 0x6 + BPF_TCP_CLOSE = 0x7 + BPF_TCP_CLOSE_WAIT = 0x8 + BPF_TCP_LAST_ACK = 0x9 + BPF_TCP_LISTEN = 0xa + BPF_TCP_CLOSING = 0xb + BPF_TCP_NEW_SYN_RECV = 0xc + BPF_TCP_MAX_STATES = 0xd + BPF_FIB_LKUP_RET_SUCCESS = 0x0 + BPF_FIB_LKUP_RET_BLACKHOLE = 0x1 + BPF_FIB_LKUP_RET_UNREACHABLE = 0x2 + BPF_FIB_LKUP_RET_PROHIBIT = 0x3 + BPF_FIB_LKUP_RET_NOT_FWDED = 0x4 + BPF_FIB_LKUP_RET_FWD_DISABLED = 0x5 + BPF_FIB_LKUP_RET_UNSUPP_LWT = 0x6 + BPF_FIB_LKUP_RET_NO_NEIGH = 0x7 + BPF_FIB_LKUP_RET_FRAG_NEEDED = 0x8 + BPF_FD_TYPE_RAW_TRACEPOINT = 0x0 + BPF_FD_TYPE_TRACEPOINT = 0x1 + BPF_FD_TYPE_KPROBE = 0x2 + BPF_FD_TYPE_KRETPROBE = 0x3 + BPF_FD_TYPE_UPROBE = 0x4 + BPF_FD_TYPE_URETPROBE = 0x5 +) diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go b/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go index 34e4e6db..c4369361 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go @@ -818,6 +818,8 @@ type Sigset_t struct { Val [32]uint32 } +const _C__NSIG = 0x41 + type SignalfdSiginfo struct { Signo uint32 Errno int32 @@ -1442,6 +1444,21 @@ type TpacketBlockDesc struct { Hdr [40]byte } +type TpacketBDTS struct { + Sec uint32 + Usec uint32 +} + +type TpacketHdrV1 struct { + Block_status uint32 + Num_pkts uint32 + Offset_to_first_pkt uint32 + Blk_len uint32 + Seq_num uint64 + Ts_first_pkt TpacketBDTS + Ts_last_pkt TpacketBDTS +} + type TpacketReq struct { Block_size uint32 Block_nr uint32 @@ -2124,3 +2141,320 @@ type FanotifyResponse struct { Fd int32 Response uint32 } + +const ( + CRYPTO_MSG_BASE = 0x10 + CRYPTO_MSG_NEWALG = 0x10 + CRYPTO_MSG_DELALG = 0x11 + CRYPTO_MSG_UPDATEALG = 0x12 + CRYPTO_MSG_GETALG = 0x13 + CRYPTO_MSG_DELRNG = 0x14 + CRYPTO_MSG_GETSTAT = 0x15 +) + +const ( + CRYPTOCFGA_UNSPEC = 0x0 + CRYPTOCFGA_PRIORITY_VAL = 0x1 + CRYPTOCFGA_REPORT_LARVAL = 0x2 + CRYPTOCFGA_REPORT_HASH = 0x3 + CRYPTOCFGA_REPORT_BLKCIPHER = 0x4 + CRYPTOCFGA_REPORT_AEAD = 0x5 + CRYPTOCFGA_REPORT_COMPRESS = 0x6 + CRYPTOCFGA_REPORT_RNG = 0x7 + CRYPTOCFGA_REPORT_CIPHER = 0x8 + CRYPTOCFGA_REPORT_AKCIPHER = 0x9 + CRYPTOCFGA_REPORT_KPP = 0xa + CRYPTOCFGA_REPORT_ACOMP = 0xb + CRYPTOCFGA_STAT_LARVAL = 0xc + CRYPTOCFGA_STAT_HASH = 0xd + CRYPTOCFGA_STAT_BLKCIPHER = 0xe + CRYPTOCFGA_STAT_AEAD = 0xf + CRYPTOCFGA_STAT_COMPRESS = 0x10 + CRYPTOCFGA_STAT_RNG = 0x11 + CRYPTOCFGA_STAT_CIPHER = 0x12 + CRYPTOCFGA_STAT_AKCIPHER = 0x13 + CRYPTOCFGA_STAT_KPP = 0x14 + CRYPTOCFGA_STAT_ACOMP = 0x15 +) + +type CryptoUserAlg struct { + Name [64]uint8 + Driver_name [64]uint8 + Module_name [64]uint8 + Type uint32 + Mask uint32 + Refcnt uint32 + Flags uint32 +} + +type CryptoStatAEAD struct { + Type [64]uint8 + Encrypt_cnt uint64 + Encrypt_tlen uint64 + Decrypt_cnt uint64 + Decrypt_tlen uint64 + Err_cnt uint64 +} + +type CryptoStatAKCipher struct { + Type [64]uint8 + Encrypt_cnt uint64 + Encrypt_tlen uint64 + Decrypt_cnt uint64 + Decrypt_tlen uint64 + Verify_cnt uint64 + Sign_cnt uint64 + Err_cnt uint64 +} + +type CryptoStatCipher struct { + Type [64]uint8 + Encrypt_cnt uint64 + Encrypt_tlen uint64 + Decrypt_cnt uint64 + Decrypt_tlen uint64 + Err_cnt uint64 +} + +type CryptoStatCompress struct { + Type [64]uint8 + Compress_cnt uint64 + Compress_tlen uint64 + Decompress_cnt uint64 + Decompress_tlen uint64 + Err_cnt uint64 +} + +type CryptoStatHash struct { + Type [64]uint8 + Hash_cnt uint64 + Hash_tlen uint64 + Err_cnt uint64 +} + +type CryptoStatKPP struct { + Type [64]uint8 + Setsecret_cnt uint64 + Generate_public_key_cnt uint64 + Compute_shared_secret_cnt uint64 + Err_cnt uint64 +} + +type CryptoStatRNG struct { + Type [64]uint8 + Generate_cnt uint64 + Generate_tlen uint64 + Seed_cnt uint64 + Err_cnt uint64 +} + +type CryptoStatLarval struct { + Type [64]uint8 +} + +type CryptoReportLarval struct { + Type [64]uint8 +} + +type CryptoReportHash struct { + Type [64]uint8 + Blocksize uint32 + Digestsize uint32 +} + +type CryptoReportCipher struct { + Type [64]uint8 + Blocksize uint32 + Min_keysize uint32 + Max_keysize uint32 +} + +type CryptoReportBlkCipher struct { + Type [64]uint8 + Geniv [64]uint8 + Blocksize uint32 + Min_keysize uint32 + Max_keysize uint32 + Ivsize uint32 +} + +type CryptoReportAEAD struct { + Type [64]uint8 + Geniv [64]uint8 + Blocksize uint32 + Maxauthsize uint32 + Ivsize uint32 +} + +type CryptoReportComp struct { + Type [64]uint8 +} + +type CryptoReportRNG struct { + Type [64]uint8 + Seedsize uint32 +} + +type CryptoReportAKCipher struct { + Type [64]uint8 +} + +type CryptoReportKPP struct { + Type [64]uint8 +} + +type CryptoReportAcomp struct { + Type [64]uint8 +} + +const ( + BPF_REG_0 = 0x0 + BPF_REG_1 = 0x1 + BPF_REG_2 = 0x2 + BPF_REG_3 = 0x3 + BPF_REG_4 = 0x4 + BPF_REG_5 = 0x5 + BPF_REG_6 = 0x6 + BPF_REG_7 = 0x7 + BPF_REG_8 = 0x8 + BPF_REG_9 = 0x9 + BPF_REG_10 = 0xa + BPF_MAP_CREATE = 0x0 + BPF_MAP_LOOKUP_ELEM = 0x1 + BPF_MAP_UPDATE_ELEM = 0x2 + BPF_MAP_DELETE_ELEM = 0x3 + BPF_MAP_GET_NEXT_KEY = 0x4 + BPF_PROG_LOAD = 0x5 + BPF_OBJ_PIN = 0x6 + BPF_OBJ_GET = 0x7 + BPF_PROG_ATTACH = 0x8 + BPF_PROG_DETACH = 0x9 + BPF_PROG_TEST_RUN = 0xa + BPF_PROG_GET_NEXT_ID = 0xb + BPF_MAP_GET_NEXT_ID = 0xc + BPF_PROG_GET_FD_BY_ID = 0xd + BPF_MAP_GET_FD_BY_ID = 0xe + BPF_OBJ_GET_INFO_BY_FD = 0xf + BPF_PROG_QUERY = 0x10 + BPF_RAW_TRACEPOINT_OPEN = 0x11 + BPF_BTF_LOAD = 0x12 + BPF_BTF_GET_FD_BY_ID = 0x13 + BPF_TASK_FD_QUERY = 0x14 + BPF_MAP_LOOKUP_AND_DELETE_ELEM = 0x15 + BPF_MAP_TYPE_UNSPEC = 0x0 + BPF_MAP_TYPE_HASH = 0x1 + BPF_MAP_TYPE_ARRAY = 0x2 + BPF_MAP_TYPE_PROG_ARRAY = 0x3 + BPF_MAP_TYPE_PERF_EVENT_ARRAY = 0x4 + BPF_MAP_TYPE_PERCPU_HASH = 0x5 + BPF_MAP_TYPE_PERCPU_ARRAY = 0x6 + BPF_MAP_TYPE_STACK_TRACE = 0x7 + BPF_MAP_TYPE_CGROUP_ARRAY = 0x8 + BPF_MAP_TYPE_LRU_HASH = 0x9 + BPF_MAP_TYPE_LRU_PERCPU_HASH = 0xa + BPF_MAP_TYPE_LPM_TRIE = 0xb + BPF_MAP_TYPE_ARRAY_OF_MAPS = 0xc + BPF_MAP_TYPE_HASH_OF_MAPS = 0xd + BPF_MAP_TYPE_DEVMAP = 0xe + BPF_MAP_TYPE_SOCKMAP = 0xf + BPF_MAP_TYPE_CPUMAP = 0x10 + BPF_MAP_TYPE_XSKMAP = 0x11 + BPF_MAP_TYPE_SOCKHASH = 0x12 + BPF_MAP_TYPE_CGROUP_STORAGE = 0x13 + BPF_MAP_TYPE_REUSEPORT_SOCKARRAY = 0x14 + BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE = 0x15 + BPF_MAP_TYPE_QUEUE = 0x16 + BPF_MAP_TYPE_STACK = 0x17 + BPF_PROG_TYPE_UNSPEC = 0x0 + BPF_PROG_TYPE_SOCKET_FILTER = 0x1 + BPF_PROG_TYPE_KPROBE = 0x2 + BPF_PROG_TYPE_SCHED_CLS = 0x3 + BPF_PROG_TYPE_SCHED_ACT = 0x4 + BPF_PROG_TYPE_TRACEPOINT = 0x5 + BPF_PROG_TYPE_XDP = 0x6 + BPF_PROG_TYPE_PERF_EVENT = 0x7 + BPF_PROG_TYPE_CGROUP_SKB = 0x8 + BPF_PROG_TYPE_CGROUP_SOCK = 0x9 + BPF_PROG_TYPE_LWT_IN = 0xa + BPF_PROG_TYPE_LWT_OUT = 0xb + BPF_PROG_TYPE_LWT_XMIT = 0xc + BPF_PROG_TYPE_SOCK_OPS = 0xd + BPF_PROG_TYPE_SK_SKB = 0xe + BPF_PROG_TYPE_CGROUP_DEVICE = 0xf + BPF_PROG_TYPE_SK_MSG = 0x10 + BPF_PROG_TYPE_RAW_TRACEPOINT = 0x11 + BPF_PROG_TYPE_CGROUP_SOCK_ADDR = 0x12 + BPF_PROG_TYPE_LWT_SEG6LOCAL = 0x13 + BPF_PROG_TYPE_LIRC_MODE2 = 0x14 + BPF_PROG_TYPE_SK_REUSEPORT = 0x15 + BPF_PROG_TYPE_FLOW_DISSECTOR = 0x16 + BPF_CGROUP_INET_INGRESS = 0x0 + BPF_CGROUP_INET_EGRESS = 0x1 + BPF_CGROUP_INET_SOCK_CREATE = 0x2 + BPF_CGROUP_SOCK_OPS = 0x3 + BPF_SK_SKB_STREAM_PARSER = 0x4 + BPF_SK_SKB_STREAM_VERDICT = 0x5 + BPF_CGROUP_DEVICE = 0x6 + BPF_SK_MSG_VERDICT = 0x7 + BPF_CGROUP_INET4_BIND = 0x8 + BPF_CGROUP_INET6_BIND = 0x9 + BPF_CGROUP_INET4_CONNECT = 0xa + BPF_CGROUP_INET6_CONNECT = 0xb + BPF_CGROUP_INET4_POST_BIND = 0xc + BPF_CGROUP_INET6_POST_BIND = 0xd + BPF_CGROUP_UDP4_SENDMSG = 0xe + BPF_CGROUP_UDP6_SENDMSG = 0xf + BPF_LIRC_MODE2 = 0x10 + BPF_FLOW_DISSECTOR = 0x11 + BPF_STACK_BUILD_ID_EMPTY = 0x0 + BPF_STACK_BUILD_ID_VALID = 0x1 + BPF_STACK_BUILD_ID_IP = 0x2 + BPF_ADJ_ROOM_NET = 0x0 + BPF_HDR_START_MAC = 0x0 + BPF_HDR_START_NET = 0x1 + BPF_LWT_ENCAP_SEG6 = 0x0 + BPF_LWT_ENCAP_SEG6_INLINE = 0x1 + BPF_OK = 0x0 + BPF_DROP = 0x2 + BPF_REDIRECT = 0x7 + BPF_SOCK_OPS_VOID = 0x0 + BPF_SOCK_OPS_TIMEOUT_INIT = 0x1 + BPF_SOCK_OPS_RWND_INIT = 0x2 + BPF_SOCK_OPS_TCP_CONNECT_CB = 0x3 + BPF_SOCK_OPS_ACTIVE_ESTABLISHED_CB = 0x4 + BPF_SOCK_OPS_PASSIVE_ESTABLISHED_CB = 0x5 + BPF_SOCK_OPS_NEEDS_ECN = 0x6 + BPF_SOCK_OPS_BASE_RTT = 0x7 + BPF_SOCK_OPS_RTO_CB = 0x8 + BPF_SOCK_OPS_RETRANS_CB = 0x9 + BPF_SOCK_OPS_STATE_CB = 0xa + BPF_SOCK_OPS_TCP_LISTEN_CB = 0xb + BPF_TCP_ESTABLISHED = 0x1 + BPF_TCP_SYN_SENT = 0x2 + BPF_TCP_SYN_RECV = 0x3 + BPF_TCP_FIN_WAIT1 = 0x4 + BPF_TCP_FIN_WAIT2 = 0x5 + BPF_TCP_TIME_WAIT = 0x6 + BPF_TCP_CLOSE = 0x7 + BPF_TCP_CLOSE_WAIT = 0x8 + BPF_TCP_LAST_ACK = 0x9 + BPF_TCP_LISTEN = 0xa + BPF_TCP_CLOSING = 0xb + BPF_TCP_NEW_SYN_RECV = 0xc + BPF_TCP_MAX_STATES = 0xd + BPF_FIB_LKUP_RET_SUCCESS = 0x0 + BPF_FIB_LKUP_RET_BLACKHOLE = 0x1 + BPF_FIB_LKUP_RET_UNREACHABLE = 0x2 + BPF_FIB_LKUP_RET_PROHIBIT = 0x3 + BPF_FIB_LKUP_RET_NOT_FWDED = 0x4 + BPF_FIB_LKUP_RET_FWD_DISABLED = 0x5 + BPF_FIB_LKUP_RET_UNSUPP_LWT = 0x6 + BPF_FIB_LKUP_RET_NO_NEIGH = 0x7 + BPF_FIB_LKUP_RET_FRAG_NEEDED = 0x8 + BPF_FD_TYPE_RAW_TRACEPOINT = 0x0 + BPF_FD_TYPE_TRACEPOINT = 0x1 + BPF_FD_TYPE_KPROBE = 0x2 + BPF_FD_TYPE_KRETPROBE = 0x3 + BPF_FD_TYPE_UPROBE = 0x4 + BPF_FD_TYPE_URETPROBE = 0x5 +) diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go index 7f2e26f1..76c55e05 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go @@ -821,6 +821,8 @@ type Sigset_t struct { Val [16]uint64 } +const _C__NSIG = 0x41 + type SignalfdSiginfo struct { Signo uint32 Errno int32 @@ -1443,6 +1445,21 @@ type TpacketBlockDesc struct { Hdr [40]byte } +type TpacketBDTS struct { + Sec uint32 + Usec uint32 +} + +type TpacketHdrV1 struct { + Block_status uint32 + Num_pkts uint32 + Offset_to_first_pkt uint32 + Blk_len uint32 + Seq_num uint64 + Ts_first_pkt TpacketBDTS + Ts_last_pkt TpacketBDTS +} + type TpacketReq struct { Block_size uint32 Block_nr uint32 @@ -2125,3 +2142,320 @@ type FanotifyResponse struct { Fd int32 Response uint32 } + +const ( + CRYPTO_MSG_BASE = 0x10 + CRYPTO_MSG_NEWALG = 0x10 + CRYPTO_MSG_DELALG = 0x11 + CRYPTO_MSG_UPDATEALG = 0x12 + CRYPTO_MSG_GETALG = 0x13 + CRYPTO_MSG_DELRNG = 0x14 + CRYPTO_MSG_GETSTAT = 0x15 +) + +const ( + CRYPTOCFGA_UNSPEC = 0x0 + CRYPTOCFGA_PRIORITY_VAL = 0x1 + CRYPTOCFGA_REPORT_LARVAL = 0x2 + CRYPTOCFGA_REPORT_HASH = 0x3 + CRYPTOCFGA_REPORT_BLKCIPHER = 0x4 + CRYPTOCFGA_REPORT_AEAD = 0x5 + CRYPTOCFGA_REPORT_COMPRESS = 0x6 + CRYPTOCFGA_REPORT_RNG = 0x7 + CRYPTOCFGA_REPORT_CIPHER = 0x8 + CRYPTOCFGA_REPORT_AKCIPHER = 0x9 + CRYPTOCFGA_REPORT_KPP = 0xa + CRYPTOCFGA_REPORT_ACOMP = 0xb + CRYPTOCFGA_STAT_LARVAL = 0xc + CRYPTOCFGA_STAT_HASH = 0xd + CRYPTOCFGA_STAT_BLKCIPHER = 0xe + CRYPTOCFGA_STAT_AEAD = 0xf + CRYPTOCFGA_STAT_COMPRESS = 0x10 + CRYPTOCFGA_STAT_RNG = 0x11 + CRYPTOCFGA_STAT_CIPHER = 0x12 + CRYPTOCFGA_STAT_AKCIPHER = 0x13 + CRYPTOCFGA_STAT_KPP = 0x14 + CRYPTOCFGA_STAT_ACOMP = 0x15 +) + +type CryptoUserAlg struct { + Name [64]int8 + Driver_name [64]int8 + Module_name [64]int8 + Type uint32 + Mask uint32 + Refcnt uint32 + Flags uint32 +} + +type CryptoStatAEAD struct { + Type [64]int8 + Encrypt_cnt uint64 + Encrypt_tlen uint64 + Decrypt_cnt uint64 + Decrypt_tlen uint64 + Err_cnt uint64 +} + +type CryptoStatAKCipher struct { + Type [64]int8 + Encrypt_cnt uint64 + Encrypt_tlen uint64 + Decrypt_cnt uint64 + Decrypt_tlen uint64 + Verify_cnt uint64 + Sign_cnt uint64 + Err_cnt uint64 +} + +type CryptoStatCipher struct { + Type [64]int8 + Encrypt_cnt uint64 + Encrypt_tlen uint64 + Decrypt_cnt uint64 + Decrypt_tlen uint64 + Err_cnt uint64 +} + +type CryptoStatCompress struct { + Type [64]int8 + Compress_cnt uint64 + Compress_tlen uint64 + Decompress_cnt uint64 + Decompress_tlen uint64 + Err_cnt uint64 +} + +type CryptoStatHash struct { + Type [64]int8 + Hash_cnt uint64 + Hash_tlen uint64 + Err_cnt uint64 +} + +type CryptoStatKPP struct { + Type [64]int8 + Setsecret_cnt uint64 + Generate_public_key_cnt uint64 + Compute_shared_secret_cnt uint64 + Err_cnt uint64 +} + +type CryptoStatRNG struct { + Type [64]int8 + Generate_cnt uint64 + Generate_tlen uint64 + Seed_cnt uint64 + Err_cnt uint64 +} + +type CryptoStatLarval struct { + Type [64]int8 +} + +type CryptoReportLarval struct { + Type [64]int8 +} + +type CryptoReportHash struct { + Type [64]int8 + Blocksize uint32 + Digestsize uint32 +} + +type CryptoReportCipher struct { + Type [64]int8 + Blocksize uint32 + Min_keysize uint32 + Max_keysize uint32 +} + +type CryptoReportBlkCipher struct { + Type [64]int8 + Geniv [64]int8 + Blocksize uint32 + Min_keysize uint32 + Max_keysize uint32 + Ivsize uint32 +} + +type CryptoReportAEAD struct { + Type [64]int8 + Geniv [64]int8 + Blocksize uint32 + Maxauthsize uint32 + Ivsize uint32 +} + +type CryptoReportComp struct { + Type [64]int8 +} + +type CryptoReportRNG struct { + Type [64]int8 + Seedsize uint32 +} + +type CryptoReportAKCipher struct { + Type [64]int8 +} + +type CryptoReportKPP struct { + Type [64]int8 +} + +type CryptoReportAcomp struct { + Type [64]int8 +} + +const ( + BPF_REG_0 = 0x0 + BPF_REG_1 = 0x1 + BPF_REG_2 = 0x2 + BPF_REG_3 = 0x3 + BPF_REG_4 = 0x4 + BPF_REG_5 = 0x5 + BPF_REG_6 = 0x6 + BPF_REG_7 = 0x7 + BPF_REG_8 = 0x8 + BPF_REG_9 = 0x9 + BPF_REG_10 = 0xa + BPF_MAP_CREATE = 0x0 + BPF_MAP_LOOKUP_ELEM = 0x1 + BPF_MAP_UPDATE_ELEM = 0x2 + BPF_MAP_DELETE_ELEM = 0x3 + BPF_MAP_GET_NEXT_KEY = 0x4 + BPF_PROG_LOAD = 0x5 + BPF_OBJ_PIN = 0x6 + BPF_OBJ_GET = 0x7 + BPF_PROG_ATTACH = 0x8 + BPF_PROG_DETACH = 0x9 + BPF_PROG_TEST_RUN = 0xa + BPF_PROG_GET_NEXT_ID = 0xb + BPF_MAP_GET_NEXT_ID = 0xc + BPF_PROG_GET_FD_BY_ID = 0xd + BPF_MAP_GET_FD_BY_ID = 0xe + BPF_OBJ_GET_INFO_BY_FD = 0xf + BPF_PROG_QUERY = 0x10 + BPF_RAW_TRACEPOINT_OPEN = 0x11 + BPF_BTF_LOAD = 0x12 + BPF_BTF_GET_FD_BY_ID = 0x13 + BPF_TASK_FD_QUERY = 0x14 + BPF_MAP_LOOKUP_AND_DELETE_ELEM = 0x15 + BPF_MAP_TYPE_UNSPEC = 0x0 + BPF_MAP_TYPE_HASH = 0x1 + BPF_MAP_TYPE_ARRAY = 0x2 + BPF_MAP_TYPE_PROG_ARRAY = 0x3 + BPF_MAP_TYPE_PERF_EVENT_ARRAY = 0x4 + BPF_MAP_TYPE_PERCPU_HASH = 0x5 + BPF_MAP_TYPE_PERCPU_ARRAY = 0x6 + BPF_MAP_TYPE_STACK_TRACE = 0x7 + BPF_MAP_TYPE_CGROUP_ARRAY = 0x8 + BPF_MAP_TYPE_LRU_HASH = 0x9 + BPF_MAP_TYPE_LRU_PERCPU_HASH = 0xa + BPF_MAP_TYPE_LPM_TRIE = 0xb + BPF_MAP_TYPE_ARRAY_OF_MAPS = 0xc + BPF_MAP_TYPE_HASH_OF_MAPS = 0xd + BPF_MAP_TYPE_DEVMAP = 0xe + BPF_MAP_TYPE_SOCKMAP = 0xf + BPF_MAP_TYPE_CPUMAP = 0x10 + BPF_MAP_TYPE_XSKMAP = 0x11 + BPF_MAP_TYPE_SOCKHASH = 0x12 + BPF_MAP_TYPE_CGROUP_STORAGE = 0x13 + BPF_MAP_TYPE_REUSEPORT_SOCKARRAY = 0x14 + BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE = 0x15 + BPF_MAP_TYPE_QUEUE = 0x16 + BPF_MAP_TYPE_STACK = 0x17 + BPF_PROG_TYPE_UNSPEC = 0x0 + BPF_PROG_TYPE_SOCKET_FILTER = 0x1 + BPF_PROG_TYPE_KPROBE = 0x2 + BPF_PROG_TYPE_SCHED_CLS = 0x3 + BPF_PROG_TYPE_SCHED_ACT = 0x4 + BPF_PROG_TYPE_TRACEPOINT = 0x5 + BPF_PROG_TYPE_XDP = 0x6 + BPF_PROG_TYPE_PERF_EVENT = 0x7 + BPF_PROG_TYPE_CGROUP_SKB = 0x8 + BPF_PROG_TYPE_CGROUP_SOCK = 0x9 + BPF_PROG_TYPE_LWT_IN = 0xa + BPF_PROG_TYPE_LWT_OUT = 0xb + BPF_PROG_TYPE_LWT_XMIT = 0xc + BPF_PROG_TYPE_SOCK_OPS = 0xd + BPF_PROG_TYPE_SK_SKB = 0xe + BPF_PROG_TYPE_CGROUP_DEVICE = 0xf + BPF_PROG_TYPE_SK_MSG = 0x10 + BPF_PROG_TYPE_RAW_TRACEPOINT = 0x11 + BPF_PROG_TYPE_CGROUP_SOCK_ADDR = 0x12 + BPF_PROG_TYPE_LWT_SEG6LOCAL = 0x13 + BPF_PROG_TYPE_LIRC_MODE2 = 0x14 + BPF_PROG_TYPE_SK_REUSEPORT = 0x15 + BPF_PROG_TYPE_FLOW_DISSECTOR = 0x16 + BPF_CGROUP_INET_INGRESS = 0x0 + BPF_CGROUP_INET_EGRESS = 0x1 + BPF_CGROUP_INET_SOCK_CREATE = 0x2 + BPF_CGROUP_SOCK_OPS = 0x3 + BPF_SK_SKB_STREAM_PARSER = 0x4 + BPF_SK_SKB_STREAM_VERDICT = 0x5 + BPF_CGROUP_DEVICE = 0x6 + BPF_SK_MSG_VERDICT = 0x7 + BPF_CGROUP_INET4_BIND = 0x8 + BPF_CGROUP_INET6_BIND = 0x9 + BPF_CGROUP_INET4_CONNECT = 0xa + BPF_CGROUP_INET6_CONNECT = 0xb + BPF_CGROUP_INET4_POST_BIND = 0xc + BPF_CGROUP_INET6_POST_BIND = 0xd + BPF_CGROUP_UDP4_SENDMSG = 0xe + BPF_CGROUP_UDP6_SENDMSG = 0xf + BPF_LIRC_MODE2 = 0x10 + BPF_FLOW_DISSECTOR = 0x11 + BPF_STACK_BUILD_ID_EMPTY = 0x0 + BPF_STACK_BUILD_ID_VALID = 0x1 + BPF_STACK_BUILD_ID_IP = 0x2 + BPF_ADJ_ROOM_NET = 0x0 + BPF_HDR_START_MAC = 0x0 + BPF_HDR_START_NET = 0x1 + BPF_LWT_ENCAP_SEG6 = 0x0 + BPF_LWT_ENCAP_SEG6_INLINE = 0x1 + BPF_OK = 0x0 + BPF_DROP = 0x2 + BPF_REDIRECT = 0x7 + BPF_SOCK_OPS_VOID = 0x0 + BPF_SOCK_OPS_TIMEOUT_INIT = 0x1 + BPF_SOCK_OPS_RWND_INIT = 0x2 + BPF_SOCK_OPS_TCP_CONNECT_CB = 0x3 + BPF_SOCK_OPS_ACTIVE_ESTABLISHED_CB = 0x4 + BPF_SOCK_OPS_PASSIVE_ESTABLISHED_CB = 0x5 + BPF_SOCK_OPS_NEEDS_ECN = 0x6 + BPF_SOCK_OPS_BASE_RTT = 0x7 + BPF_SOCK_OPS_RTO_CB = 0x8 + BPF_SOCK_OPS_RETRANS_CB = 0x9 + BPF_SOCK_OPS_STATE_CB = 0xa + BPF_SOCK_OPS_TCP_LISTEN_CB = 0xb + BPF_TCP_ESTABLISHED = 0x1 + BPF_TCP_SYN_SENT = 0x2 + BPF_TCP_SYN_RECV = 0x3 + BPF_TCP_FIN_WAIT1 = 0x4 + BPF_TCP_FIN_WAIT2 = 0x5 + BPF_TCP_TIME_WAIT = 0x6 + BPF_TCP_CLOSE = 0x7 + BPF_TCP_CLOSE_WAIT = 0x8 + BPF_TCP_LAST_ACK = 0x9 + BPF_TCP_LISTEN = 0xa + BPF_TCP_CLOSING = 0xb + BPF_TCP_NEW_SYN_RECV = 0xc + BPF_TCP_MAX_STATES = 0xd + BPF_FIB_LKUP_RET_SUCCESS = 0x0 + BPF_FIB_LKUP_RET_BLACKHOLE = 0x1 + BPF_FIB_LKUP_RET_UNREACHABLE = 0x2 + BPF_FIB_LKUP_RET_PROHIBIT = 0x3 + BPF_FIB_LKUP_RET_NOT_FWDED = 0x4 + BPF_FIB_LKUP_RET_FWD_DISABLED = 0x5 + BPF_FIB_LKUP_RET_UNSUPP_LWT = 0x6 + BPF_FIB_LKUP_RET_NO_NEIGH = 0x7 + BPF_FIB_LKUP_RET_FRAG_NEEDED = 0x8 + BPF_FD_TYPE_RAW_TRACEPOINT = 0x0 + BPF_FD_TYPE_TRACEPOINT = 0x1 + BPF_FD_TYPE_KPROBE = 0x2 + BPF_FD_TYPE_KRETPROBE = 0x3 + BPF_FD_TYPE_UPROBE = 0x4 + BPF_FD_TYPE_URETPROBE = 0x5 +) diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go index 66e408fa..4302d574 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go @@ -823,6 +823,8 @@ type Sigset_t struct { Val [32]uint32 } +const _C__NSIG = 0x80 + type SignalfdSiginfo struct { Signo uint32 Errno int32 @@ -1448,6 +1450,21 @@ type TpacketBlockDesc struct { Hdr [40]byte } +type TpacketBDTS struct { + Sec uint32 + Usec uint32 +} + +type TpacketHdrV1 struct { + Block_status uint32 + Num_pkts uint32 + Offset_to_first_pkt uint32 + Blk_len uint32 + Seq_num uint64 + Ts_first_pkt TpacketBDTS + Ts_last_pkt TpacketBDTS +} + type TpacketReq struct { Block_size uint32 Block_nr uint32 @@ -2130,3 +2147,320 @@ type FanotifyResponse struct { Fd int32 Response uint32 } + +const ( + CRYPTO_MSG_BASE = 0x10 + CRYPTO_MSG_NEWALG = 0x10 + CRYPTO_MSG_DELALG = 0x11 + CRYPTO_MSG_UPDATEALG = 0x12 + CRYPTO_MSG_GETALG = 0x13 + CRYPTO_MSG_DELRNG = 0x14 + CRYPTO_MSG_GETSTAT = 0x15 +) + +const ( + CRYPTOCFGA_UNSPEC = 0x0 + CRYPTOCFGA_PRIORITY_VAL = 0x1 + CRYPTOCFGA_REPORT_LARVAL = 0x2 + CRYPTOCFGA_REPORT_HASH = 0x3 + CRYPTOCFGA_REPORT_BLKCIPHER = 0x4 + CRYPTOCFGA_REPORT_AEAD = 0x5 + CRYPTOCFGA_REPORT_COMPRESS = 0x6 + CRYPTOCFGA_REPORT_RNG = 0x7 + CRYPTOCFGA_REPORT_CIPHER = 0x8 + CRYPTOCFGA_REPORT_AKCIPHER = 0x9 + CRYPTOCFGA_REPORT_KPP = 0xa + CRYPTOCFGA_REPORT_ACOMP = 0xb + CRYPTOCFGA_STAT_LARVAL = 0xc + CRYPTOCFGA_STAT_HASH = 0xd + CRYPTOCFGA_STAT_BLKCIPHER = 0xe + CRYPTOCFGA_STAT_AEAD = 0xf + CRYPTOCFGA_STAT_COMPRESS = 0x10 + CRYPTOCFGA_STAT_RNG = 0x11 + CRYPTOCFGA_STAT_CIPHER = 0x12 + CRYPTOCFGA_STAT_AKCIPHER = 0x13 + CRYPTOCFGA_STAT_KPP = 0x14 + CRYPTOCFGA_STAT_ACOMP = 0x15 +) + +type CryptoUserAlg struct { + Name [64]int8 + Driver_name [64]int8 + Module_name [64]int8 + Type uint32 + Mask uint32 + Refcnt uint32 + Flags uint32 +} + +type CryptoStatAEAD struct { + Type [64]int8 + Encrypt_cnt uint64 + Encrypt_tlen uint64 + Decrypt_cnt uint64 + Decrypt_tlen uint64 + Err_cnt uint64 +} + +type CryptoStatAKCipher struct { + Type [64]int8 + Encrypt_cnt uint64 + Encrypt_tlen uint64 + Decrypt_cnt uint64 + Decrypt_tlen uint64 + Verify_cnt uint64 + Sign_cnt uint64 + Err_cnt uint64 +} + +type CryptoStatCipher struct { + Type [64]int8 + Encrypt_cnt uint64 + Encrypt_tlen uint64 + Decrypt_cnt uint64 + Decrypt_tlen uint64 + Err_cnt uint64 +} + +type CryptoStatCompress struct { + Type [64]int8 + Compress_cnt uint64 + Compress_tlen uint64 + Decompress_cnt uint64 + Decompress_tlen uint64 + Err_cnt uint64 +} + +type CryptoStatHash struct { + Type [64]int8 + Hash_cnt uint64 + Hash_tlen uint64 + Err_cnt uint64 +} + +type CryptoStatKPP struct { + Type [64]int8 + Setsecret_cnt uint64 + Generate_public_key_cnt uint64 + Compute_shared_secret_cnt uint64 + Err_cnt uint64 +} + +type CryptoStatRNG struct { + Type [64]int8 + Generate_cnt uint64 + Generate_tlen uint64 + Seed_cnt uint64 + Err_cnt uint64 +} + +type CryptoStatLarval struct { + Type [64]int8 +} + +type CryptoReportLarval struct { + Type [64]int8 +} + +type CryptoReportHash struct { + Type [64]int8 + Blocksize uint32 + Digestsize uint32 +} + +type CryptoReportCipher struct { + Type [64]int8 + Blocksize uint32 + Min_keysize uint32 + Max_keysize uint32 +} + +type CryptoReportBlkCipher struct { + Type [64]int8 + Geniv [64]int8 + Blocksize uint32 + Min_keysize uint32 + Max_keysize uint32 + Ivsize uint32 +} + +type CryptoReportAEAD struct { + Type [64]int8 + Geniv [64]int8 + Blocksize uint32 + Maxauthsize uint32 + Ivsize uint32 +} + +type CryptoReportComp struct { + Type [64]int8 +} + +type CryptoReportRNG struct { + Type [64]int8 + Seedsize uint32 +} + +type CryptoReportAKCipher struct { + Type [64]int8 +} + +type CryptoReportKPP struct { + Type [64]int8 +} + +type CryptoReportAcomp struct { + Type [64]int8 +} + +const ( + BPF_REG_0 = 0x0 + BPF_REG_1 = 0x1 + BPF_REG_2 = 0x2 + BPF_REG_3 = 0x3 + BPF_REG_4 = 0x4 + BPF_REG_5 = 0x5 + BPF_REG_6 = 0x6 + BPF_REG_7 = 0x7 + BPF_REG_8 = 0x8 + BPF_REG_9 = 0x9 + BPF_REG_10 = 0xa + BPF_MAP_CREATE = 0x0 + BPF_MAP_LOOKUP_ELEM = 0x1 + BPF_MAP_UPDATE_ELEM = 0x2 + BPF_MAP_DELETE_ELEM = 0x3 + BPF_MAP_GET_NEXT_KEY = 0x4 + BPF_PROG_LOAD = 0x5 + BPF_OBJ_PIN = 0x6 + BPF_OBJ_GET = 0x7 + BPF_PROG_ATTACH = 0x8 + BPF_PROG_DETACH = 0x9 + BPF_PROG_TEST_RUN = 0xa + BPF_PROG_GET_NEXT_ID = 0xb + BPF_MAP_GET_NEXT_ID = 0xc + BPF_PROG_GET_FD_BY_ID = 0xd + BPF_MAP_GET_FD_BY_ID = 0xe + BPF_OBJ_GET_INFO_BY_FD = 0xf + BPF_PROG_QUERY = 0x10 + BPF_RAW_TRACEPOINT_OPEN = 0x11 + BPF_BTF_LOAD = 0x12 + BPF_BTF_GET_FD_BY_ID = 0x13 + BPF_TASK_FD_QUERY = 0x14 + BPF_MAP_LOOKUP_AND_DELETE_ELEM = 0x15 + BPF_MAP_TYPE_UNSPEC = 0x0 + BPF_MAP_TYPE_HASH = 0x1 + BPF_MAP_TYPE_ARRAY = 0x2 + BPF_MAP_TYPE_PROG_ARRAY = 0x3 + BPF_MAP_TYPE_PERF_EVENT_ARRAY = 0x4 + BPF_MAP_TYPE_PERCPU_HASH = 0x5 + BPF_MAP_TYPE_PERCPU_ARRAY = 0x6 + BPF_MAP_TYPE_STACK_TRACE = 0x7 + BPF_MAP_TYPE_CGROUP_ARRAY = 0x8 + BPF_MAP_TYPE_LRU_HASH = 0x9 + BPF_MAP_TYPE_LRU_PERCPU_HASH = 0xa + BPF_MAP_TYPE_LPM_TRIE = 0xb + BPF_MAP_TYPE_ARRAY_OF_MAPS = 0xc + BPF_MAP_TYPE_HASH_OF_MAPS = 0xd + BPF_MAP_TYPE_DEVMAP = 0xe + BPF_MAP_TYPE_SOCKMAP = 0xf + BPF_MAP_TYPE_CPUMAP = 0x10 + BPF_MAP_TYPE_XSKMAP = 0x11 + BPF_MAP_TYPE_SOCKHASH = 0x12 + BPF_MAP_TYPE_CGROUP_STORAGE = 0x13 + BPF_MAP_TYPE_REUSEPORT_SOCKARRAY = 0x14 + BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE = 0x15 + BPF_MAP_TYPE_QUEUE = 0x16 + BPF_MAP_TYPE_STACK = 0x17 + BPF_PROG_TYPE_UNSPEC = 0x0 + BPF_PROG_TYPE_SOCKET_FILTER = 0x1 + BPF_PROG_TYPE_KPROBE = 0x2 + BPF_PROG_TYPE_SCHED_CLS = 0x3 + BPF_PROG_TYPE_SCHED_ACT = 0x4 + BPF_PROG_TYPE_TRACEPOINT = 0x5 + BPF_PROG_TYPE_XDP = 0x6 + BPF_PROG_TYPE_PERF_EVENT = 0x7 + BPF_PROG_TYPE_CGROUP_SKB = 0x8 + BPF_PROG_TYPE_CGROUP_SOCK = 0x9 + BPF_PROG_TYPE_LWT_IN = 0xa + BPF_PROG_TYPE_LWT_OUT = 0xb + BPF_PROG_TYPE_LWT_XMIT = 0xc + BPF_PROG_TYPE_SOCK_OPS = 0xd + BPF_PROG_TYPE_SK_SKB = 0xe + BPF_PROG_TYPE_CGROUP_DEVICE = 0xf + BPF_PROG_TYPE_SK_MSG = 0x10 + BPF_PROG_TYPE_RAW_TRACEPOINT = 0x11 + BPF_PROG_TYPE_CGROUP_SOCK_ADDR = 0x12 + BPF_PROG_TYPE_LWT_SEG6LOCAL = 0x13 + BPF_PROG_TYPE_LIRC_MODE2 = 0x14 + BPF_PROG_TYPE_SK_REUSEPORT = 0x15 + BPF_PROG_TYPE_FLOW_DISSECTOR = 0x16 + BPF_CGROUP_INET_INGRESS = 0x0 + BPF_CGROUP_INET_EGRESS = 0x1 + BPF_CGROUP_INET_SOCK_CREATE = 0x2 + BPF_CGROUP_SOCK_OPS = 0x3 + BPF_SK_SKB_STREAM_PARSER = 0x4 + BPF_SK_SKB_STREAM_VERDICT = 0x5 + BPF_CGROUP_DEVICE = 0x6 + BPF_SK_MSG_VERDICT = 0x7 + BPF_CGROUP_INET4_BIND = 0x8 + BPF_CGROUP_INET6_BIND = 0x9 + BPF_CGROUP_INET4_CONNECT = 0xa + BPF_CGROUP_INET6_CONNECT = 0xb + BPF_CGROUP_INET4_POST_BIND = 0xc + BPF_CGROUP_INET6_POST_BIND = 0xd + BPF_CGROUP_UDP4_SENDMSG = 0xe + BPF_CGROUP_UDP6_SENDMSG = 0xf + BPF_LIRC_MODE2 = 0x10 + BPF_FLOW_DISSECTOR = 0x11 + BPF_STACK_BUILD_ID_EMPTY = 0x0 + BPF_STACK_BUILD_ID_VALID = 0x1 + BPF_STACK_BUILD_ID_IP = 0x2 + BPF_ADJ_ROOM_NET = 0x0 + BPF_HDR_START_MAC = 0x0 + BPF_HDR_START_NET = 0x1 + BPF_LWT_ENCAP_SEG6 = 0x0 + BPF_LWT_ENCAP_SEG6_INLINE = 0x1 + BPF_OK = 0x0 + BPF_DROP = 0x2 + BPF_REDIRECT = 0x7 + BPF_SOCK_OPS_VOID = 0x0 + BPF_SOCK_OPS_TIMEOUT_INIT = 0x1 + BPF_SOCK_OPS_RWND_INIT = 0x2 + BPF_SOCK_OPS_TCP_CONNECT_CB = 0x3 + BPF_SOCK_OPS_ACTIVE_ESTABLISHED_CB = 0x4 + BPF_SOCK_OPS_PASSIVE_ESTABLISHED_CB = 0x5 + BPF_SOCK_OPS_NEEDS_ECN = 0x6 + BPF_SOCK_OPS_BASE_RTT = 0x7 + BPF_SOCK_OPS_RTO_CB = 0x8 + BPF_SOCK_OPS_RETRANS_CB = 0x9 + BPF_SOCK_OPS_STATE_CB = 0xa + BPF_SOCK_OPS_TCP_LISTEN_CB = 0xb + BPF_TCP_ESTABLISHED = 0x1 + BPF_TCP_SYN_SENT = 0x2 + BPF_TCP_SYN_RECV = 0x3 + BPF_TCP_FIN_WAIT1 = 0x4 + BPF_TCP_FIN_WAIT2 = 0x5 + BPF_TCP_TIME_WAIT = 0x6 + BPF_TCP_CLOSE = 0x7 + BPF_TCP_CLOSE_WAIT = 0x8 + BPF_TCP_LAST_ACK = 0x9 + BPF_TCP_LISTEN = 0xa + BPF_TCP_CLOSING = 0xb + BPF_TCP_NEW_SYN_RECV = 0xc + BPF_TCP_MAX_STATES = 0xd + BPF_FIB_LKUP_RET_SUCCESS = 0x0 + BPF_FIB_LKUP_RET_BLACKHOLE = 0x1 + BPF_FIB_LKUP_RET_UNREACHABLE = 0x2 + BPF_FIB_LKUP_RET_PROHIBIT = 0x3 + BPF_FIB_LKUP_RET_NOT_FWDED = 0x4 + BPF_FIB_LKUP_RET_FWD_DISABLED = 0x5 + BPF_FIB_LKUP_RET_UNSUPP_LWT = 0x6 + BPF_FIB_LKUP_RET_NO_NEIGH = 0x7 + BPF_FIB_LKUP_RET_FRAG_NEEDED = 0x8 + BPF_FD_TYPE_RAW_TRACEPOINT = 0x0 + BPF_FD_TYPE_TRACEPOINT = 0x1 + BPF_FD_TYPE_KPROBE = 0x2 + BPF_FD_TYPE_KRETPROBE = 0x3 + BPF_FD_TYPE_UPROBE = 0x4 + BPF_FD_TYPE_URETPROBE = 0x5 +) diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go index e60575a3..7ea742be 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go @@ -823,6 +823,8 @@ type Sigset_t struct { Val [16]uint64 } +const _C__NSIG = 0x80 + type SignalfdSiginfo struct { Signo uint32 Errno int32 @@ -1445,6 +1447,21 @@ type TpacketBlockDesc struct { Hdr [40]byte } +type TpacketBDTS struct { + Sec uint32 + Usec uint32 +} + +type TpacketHdrV1 struct { + Block_status uint32 + Num_pkts uint32 + Offset_to_first_pkt uint32 + Blk_len uint32 + Seq_num uint64 + Ts_first_pkt TpacketBDTS + Ts_last_pkt TpacketBDTS +} + type TpacketReq struct { Block_size uint32 Block_nr uint32 @@ -2127,3 +2144,320 @@ type FanotifyResponse struct { Fd int32 Response uint32 } + +const ( + CRYPTO_MSG_BASE = 0x10 + CRYPTO_MSG_NEWALG = 0x10 + CRYPTO_MSG_DELALG = 0x11 + CRYPTO_MSG_UPDATEALG = 0x12 + CRYPTO_MSG_GETALG = 0x13 + CRYPTO_MSG_DELRNG = 0x14 + CRYPTO_MSG_GETSTAT = 0x15 +) + +const ( + CRYPTOCFGA_UNSPEC = 0x0 + CRYPTOCFGA_PRIORITY_VAL = 0x1 + CRYPTOCFGA_REPORT_LARVAL = 0x2 + CRYPTOCFGA_REPORT_HASH = 0x3 + CRYPTOCFGA_REPORT_BLKCIPHER = 0x4 + CRYPTOCFGA_REPORT_AEAD = 0x5 + CRYPTOCFGA_REPORT_COMPRESS = 0x6 + CRYPTOCFGA_REPORT_RNG = 0x7 + CRYPTOCFGA_REPORT_CIPHER = 0x8 + CRYPTOCFGA_REPORT_AKCIPHER = 0x9 + CRYPTOCFGA_REPORT_KPP = 0xa + CRYPTOCFGA_REPORT_ACOMP = 0xb + CRYPTOCFGA_STAT_LARVAL = 0xc + CRYPTOCFGA_STAT_HASH = 0xd + CRYPTOCFGA_STAT_BLKCIPHER = 0xe + CRYPTOCFGA_STAT_AEAD = 0xf + CRYPTOCFGA_STAT_COMPRESS = 0x10 + CRYPTOCFGA_STAT_RNG = 0x11 + CRYPTOCFGA_STAT_CIPHER = 0x12 + CRYPTOCFGA_STAT_AKCIPHER = 0x13 + CRYPTOCFGA_STAT_KPP = 0x14 + CRYPTOCFGA_STAT_ACOMP = 0x15 +) + +type CryptoUserAlg struct { + Name [64]int8 + Driver_name [64]int8 + Module_name [64]int8 + Type uint32 + Mask uint32 + Refcnt uint32 + Flags uint32 +} + +type CryptoStatAEAD struct { + Type [64]int8 + Encrypt_cnt uint64 + Encrypt_tlen uint64 + Decrypt_cnt uint64 + Decrypt_tlen uint64 + Err_cnt uint64 +} + +type CryptoStatAKCipher struct { + Type [64]int8 + Encrypt_cnt uint64 + Encrypt_tlen uint64 + Decrypt_cnt uint64 + Decrypt_tlen uint64 + Verify_cnt uint64 + Sign_cnt uint64 + Err_cnt uint64 +} + +type CryptoStatCipher struct { + Type [64]int8 + Encrypt_cnt uint64 + Encrypt_tlen uint64 + Decrypt_cnt uint64 + Decrypt_tlen uint64 + Err_cnt uint64 +} + +type CryptoStatCompress struct { + Type [64]int8 + Compress_cnt uint64 + Compress_tlen uint64 + Decompress_cnt uint64 + Decompress_tlen uint64 + Err_cnt uint64 +} + +type CryptoStatHash struct { + Type [64]int8 + Hash_cnt uint64 + Hash_tlen uint64 + Err_cnt uint64 +} + +type CryptoStatKPP struct { + Type [64]int8 + Setsecret_cnt uint64 + Generate_public_key_cnt uint64 + Compute_shared_secret_cnt uint64 + Err_cnt uint64 +} + +type CryptoStatRNG struct { + Type [64]int8 + Generate_cnt uint64 + Generate_tlen uint64 + Seed_cnt uint64 + Err_cnt uint64 +} + +type CryptoStatLarval struct { + Type [64]int8 +} + +type CryptoReportLarval struct { + Type [64]int8 +} + +type CryptoReportHash struct { + Type [64]int8 + Blocksize uint32 + Digestsize uint32 +} + +type CryptoReportCipher struct { + Type [64]int8 + Blocksize uint32 + Min_keysize uint32 + Max_keysize uint32 +} + +type CryptoReportBlkCipher struct { + Type [64]int8 + Geniv [64]int8 + Blocksize uint32 + Min_keysize uint32 + Max_keysize uint32 + Ivsize uint32 +} + +type CryptoReportAEAD struct { + Type [64]int8 + Geniv [64]int8 + Blocksize uint32 + Maxauthsize uint32 + Ivsize uint32 +} + +type CryptoReportComp struct { + Type [64]int8 +} + +type CryptoReportRNG struct { + Type [64]int8 + Seedsize uint32 +} + +type CryptoReportAKCipher struct { + Type [64]int8 +} + +type CryptoReportKPP struct { + Type [64]int8 +} + +type CryptoReportAcomp struct { + Type [64]int8 +} + +const ( + BPF_REG_0 = 0x0 + BPF_REG_1 = 0x1 + BPF_REG_2 = 0x2 + BPF_REG_3 = 0x3 + BPF_REG_4 = 0x4 + BPF_REG_5 = 0x5 + BPF_REG_6 = 0x6 + BPF_REG_7 = 0x7 + BPF_REG_8 = 0x8 + BPF_REG_9 = 0x9 + BPF_REG_10 = 0xa + BPF_MAP_CREATE = 0x0 + BPF_MAP_LOOKUP_ELEM = 0x1 + BPF_MAP_UPDATE_ELEM = 0x2 + BPF_MAP_DELETE_ELEM = 0x3 + BPF_MAP_GET_NEXT_KEY = 0x4 + BPF_PROG_LOAD = 0x5 + BPF_OBJ_PIN = 0x6 + BPF_OBJ_GET = 0x7 + BPF_PROG_ATTACH = 0x8 + BPF_PROG_DETACH = 0x9 + BPF_PROG_TEST_RUN = 0xa + BPF_PROG_GET_NEXT_ID = 0xb + BPF_MAP_GET_NEXT_ID = 0xc + BPF_PROG_GET_FD_BY_ID = 0xd + BPF_MAP_GET_FD_BY_ID = 0xe + BPF_OBJ_GET_INFO_BY_FD = 0xf + BPF_PROG_QUERY = 0x10 + BPF_RAW_TRACEPOINT_OPEN = 0x11 + BPF_BTF_LOAD = 0x12 + BPF_BTF_GET_FD_BY_ID = 0x13 + BPF_TASK_FD_QUERY = 0x14 + BPF_MAP_LOOKUP_AND_DELETE_ELEM = 0x15 + BPF_MAP_TYPE_UNSPEC = 0x0 + BPF_MAP_TYPE_HASH = 0x1 + BPF_MAP_TYPE_ARRAY = 0x2 + BPF_MAP_TYPE_PROG_ARRAY = 0x3 + BPF_MAP_TYPE_PERF_EVENT_ARRAY = 0x4 + BPF_MAP_TYPE_PERCPU_HASH = 0x5 + BPF_MAP_TYPE_PERCPU_ARRAY = 0x6 + BPF_MAP_TYPE_STACK_TRACE = 0x7 + BPF_MAP_TYPE_CGROUP_ARRAY = 0x8 + BPF_MAP_TYPE_LRU_HASH = 0x9 + BPF_MAP_TYPE_LRU_PERCPU_HASH = 0xa + BPF_MAP_TYPE_LPM_TRIE = 0xb + BPF_MAP_TYPE_ARRAY_OF_MAPS = 0xc + BPF_MAP_TYPE_HASH_OF_MAPS = 0xd + BPF_MAP_TYPE_DEVMAP = 0xe + BPF_MAP_TYPE_SOCKMAP = 0xf + BPF_MAP_TYPE_CPUMAP = 0x10 + BPF_MAP_TYPE_XSKMAP = 0x11 + BPF_MAP_TYPE_SOCKHASH = 0x12 + BPF_MAP_TYPE_CGROUP_STORAGE = 0x13 + BPF_MAP_TYPE_REUSEPORT_SOCKARRAY = 0x14 + BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE = 0x15 + BPF_MAP_TYPE_QUEUE = 0x16 + BPF_MAP_TYPE_STACK = 0x17 + BPF_PROG_TYPE_UNSPEC = 0x0 + BPF_PROG_TYPE_SOCKET_FILTER = 0x1 + BPF_PROG_TYPE_KPROBE = 0x2 + BPF_PROG_TYPE_SCHED_CLS = 0x3 + BPF_PROG_TYPE_SCHED_ACT = 0x4 + BPF_PROG_TYPE_TRACEPOINT = 0x5 + BPF_PROG_TYPE_XDP = 0x6 + BPF_PROG_TYPE_PERF_EVENT = 0x7 + BPF_PROG_TYPE_CGROUP_SKB = 0x8 + BPF_PROG_TYPE_CGROUP_SOCK = 0x9 + BPF_PROG_TYPE_LWT_IN = 0xa + BPF_PROG_TYPE_LWT_OUT = 0xb + BPF_PROG_TYPE_LWT_XMIT = 0xc + BPF_PROG_TYPE_SOCK_OPS = 0xd + BPF_PROG_TYPE_SK_SKB = 0xe + BPF_PROG_TYPE_CGROUP_DEVICE = 0xf + BPF_PROG_TYPE_SK_MSG = 0x10 + BPF_PROG_TYPE_RAW_TRACEPOINT = 0x11 + BPF_PROG_TYPE_CGROUP_SOCK_ADDR = 0x12 + BPF_PROG_TYPE_LWT_SEG6LOCAL = 0x13 + BPF_PROG_TYPE_LIRC_MODE2 = 0x14 + BPF_PROG_TYPE_SK_REUSEPORT = 0x15 + BPF_PROG_TYPE_FLOW_DISSECTOR = 0x16 + BPF_CGROUP_INET_INGRESS = 0x0 + BPF_CGROUP_INET_EGRESS = 0x1 + BPF_CGROUP_INET_SOCK_CREATE = 0x2 + BPF_CGROUP_SOCK_OPS = 0x3 + BPF_SK_SKB_STREAM_PARSER = 0x4 + BPF_SK_SKB_STREAM_VERDICT = 0x5 + BPF_CGROUP_DEVICE = 0x6 + BPF_SK_MSG_VERDICT = 0x7 + BPF_CGROUP_INET4_BIND = 0x8 + BPF_CGROUP_INET6_BIND = 0x9 + BPF_CGROUP_INET4_CONNECT = 0xa + BPF_CGROUP_INET6_CONNECT = 0xb + BPF_CGROUP_INET4_POST_BIND = 0xc + BPF_CGROUP_INET6_POST_BIND = 0xd + BPF_CGROUP_UDP4_SENDMSG = 0xe + BPF_CGROUP_UDP6_SENDMSG = 0xf + BPF_LIRC_MODE2 = 0x10 + BPF_FLOW_DISSECTOR = 0x11 + BPF_STACK_BUILD_ID_EMPTY = 0x0 + BPF_STACK_BUILD_ID_VALID = 0x1 + BPF_STACK_BUILD_ID_IP = 0x2 + BPF_ADJ_ROOM_NET = 0x0 + BPF_HDR_START_MAC = 0x0 + BPF_HDR_START_NET = 0x1 + BPF_LWT_ENCAP_SEG6 = 0x0 + BPF_LWT_ENCAP_SEG6_INLINE = 0x1 + BPF_OK = 0x0 + BPF_DROP = 0x2 + BPF_REDIRECT = 0x7 + BPF_SOCK_OPS_VOID = 0x0 + BPF_SOCK_OPS_TIMEOUT_INIT = 0x1 + BPF_SOCK_OPS_RWND_INIT = 0x2 + BPF_SOCK_OPS_TCP_CONNECT_CB = 0x3 + BPF_SOCK_OPS_ACTIVE_ESTABLISHED_CB = 0x4 + BPF_SOCK_OPS_PASSIVE_ESTABLISHED_CB = 0x5 + BPF_SOCK_OPS_NEEDS_ECN = 0x6 + BPF_SOCK_OPS_BASE_RTT = 0x7 + BPF_SOCK_OPS_RTO_CB = 0x8 + BPF_SOCK_OPS_RETRANS_CB = 0x9 + BPF_SOCK_OPS_STATE_CB = 0xa + BPF_SOCK_OPS_TCP_LISTEN_CB = 0xb + BPF_TCP_ESTABLISHED = 0x1 + BPF_TCP_SYN_SENT = 0x2 + BPF_TCP_SYN_RECV = 0x3 + BPF_TCP_FIN_WAIT1 = 0x4 + BPF_TCP_FIN_WAIT2 = 0x5 + BPF_TCP_TIME_WAIT = 0x6 + BPF_TCP_CLOSE = 0x7 + BPF_TCP_CLOSE_WAIT = 0x8 + BPF_TCP_LAST_ACK = 0x9 + BPF_TCP_LISTEN = 0xa + BPF_TCP_CLOSING = 0xb + BPF_TCP_NEW_SYN_RECV = 0xc + BPF_TCP_MAX_STATES = 0xd + BPF_FIB_LKUP_RET_SUCCESS = 0x0 + BPF_FIB_LKUP_RET_BLACKHOLE = 0x1 + BPF_FIB_LKUP_RET_UNREACHABLE = 0x2 + BPF_FIB_LKUP_RET_PROHIBIT = 0x3 + BPF_FIB_LKUP_RET_NOT_FWDED = 0x4 + BPF_FIB_LKUP_RET_FWD_DISABLED = 0x5 + BPF_FIB_LKUP_RET_UNSUPP_LWT = 0x6 + BPF_FIB_LKUP_RET_NO_NEIGH = 0x7 + BPF_FIB_LKUP_RET_FRAG_NEEDED = 0x8 + BPF_FD_TYPE_RAW_TRACEPOINT = 0x0 + BPF_FD_TYPE_TRACEPOINT = 0x1 + BPF_FD_TYPE_KPROBE = 0x2 + BPF_FD_TYPE_KRETPROBE = 0x3 + BPF_FD_TYPE_UPROBE = 0x4 + BPF_FD_TYPE_URETPROBE = 0x5 +) diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go index af5836a4..8f2b8ad4 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go @@ -823,6 +823,8 @@ type Sigset_t struct { Val [16]uint64 } +const _C__NSIG = 0x80 + type SignalfdSiginfo struct { Signo uint32 Errno int32 @@ -1445,6 +1447,21 @@ type TpacketBlockDesc struct { Hdr [40]byte } +type TpacketBDTS struct { + Sec uint32 + Usec uint32 +} + +type TpacketHdrV1 struct { + Block_status uint32 + Num_pkts uint32 + Offset_to_first_pkt uint32 + Blk_len uint32 + Seq_num uint64 + Ts_first_pkt TpacketBDTS + Ts_last_pkt TpacketBDTS +} + type TpacketReq struct { Block_size uint32 Block_nr uint32 @@ -2127,3 +2144,320 @@ type FanotifyResponse struct { Fd int32 Response uint32 } + +const ( + CRYPTO_MSG_BASE = 0x10 + CRYPTO_MSG_NEWALG = 0x10 + CRYPTO_MSG_DELALG = 0x11 + CRYPTO_MSG_UPDATEALG = 0x12 + CRYPTO_MSG_GETALG = 0x13 + CRYPTO_MSG_DELRNG = 0x14 + CRYPTO_MSG_GETSTAT = 0x15 +) + +const ( + CRYPTOCFGA_UNSPEC = 0x0 + CRYPTOCFGA_PRIORITY_VAL = 0x1 + CRYPTOCFGA_REPORT_LARVAL = 0x2 + CRYPTOCFGA_REPORT_HASH = 0x3 + CRYPTOCFGA_REPORT_BLKCIPHER = 0x4 + CRYPTOCFGA_REPORT_AEAD = 0x5 + CRYPTOCFGA_REPORT_COMPRESS = 0x6 + CRYPTOCFGA_REPORT_RNG = 0x7 + CRYPTOCFGA_REPORT_CIPHER = 0x8 + CRYPTOCFGA_REPORT_AKCIPHER = 0x9 + CRYPTOCFGA_REPORT_KPP = 0xa + CRYPTOCFGA_REPORT_ACOMP = 0xb + CRYPTOCFGA_STAT_LARVAL = 0xc + CRYPTOCFGA_STAT_HASH = 0xd + CRYPTOCFGA_STAT_BLKCIPHER = 0xe + CRYPTOCFGA_STAT_AEAD = 0xf + CRYPTOCFGA_STAT_COMPRESS = 0x10 + CRYPTOCFGA_STAT_RNG = 0x11 + CRYPTOCFGA_STAT_CIPHER = 0x12 + CRYPTOCFGA_STAT_AKCIPHER = 0x13 + CRYPTOCFGA_STAT_KPP = 0x14 + CRYPTOCFGA_STAT_ACOMP = 0x15 +) + +type CryptoUserAlg struct { + Name [64]int8 + Driver_name [64]int8 + Module_name [64]int8 + Type uint32 + Mask uint32 + Refcnt uint32 + Flags uint32 +} + +type CryptoStatAEAD struct { + Type [64]int8 + Encrypt_cnt uint64 + Encrypt_tlen uint64 + Decrypt_cnt uint64 + Decrypt_tlen uint64 + Err_cnt uint64 +} + +type CryptoStatAKCipher struct { + Type [64]int8 + Encrypt_cnt uint64 + Encrypt_tlen uint64 + Decrypt_cnt uint64 + Decrypt_tlen uint64 + Verify_cnt uint64 + Sign_cnt uint64 + Err_cnt uint64 +} + +type CryptoStatCipher struct { + Type [64]int8 + Encrypt_cnt uint64 + Encrypt_tlen uint64 + Decrypt_cnt uint64 + Decrypt_tlen uint64 + Err_cnt uint64 +} + +type CryptoStatCompress struct { + Type [64]int8 + Compress_cnt uint64 + Compress_tlen uint64 + Decompress_cnt uint64 + Decompress_tlen uint64 + Err_cnt uint64 +} + +type CryptoStatHash struct { + Type [64]int8 + Hash_cnt uint64 + Hash_tlen uint64 + Err_cnt uint64 +} + +type CryptoStatKPP struct { + Type [64]int8 + Setsecret_cnt uint64 + Generate_public_key_cnt uint64 + Compute_shared_secret_cnt uint64 + Err_cnt uint64 +} + +type CryptoStatRNG struct { + Type [64]int8 + Generate_cnt uint64 + Generate_tlen uint64 + Seed_cnt uint64 + Err_cnt uint64 +} + +type CryptoStatLarval struct { + Type [64]int8 +} + +type CryptoReportLarval struct { + Type [64]int8 +} + +type CryptoReportHash struct { + Type [64]int8 + Blocksize uint32 + Digestsize uint32 +} + +type CryptoReportCipher struct { + Type [64]int8 + Blocksize uint32 + Min_keysize uint32 + Max_keysize uint32 +} + +type CryptoReportBlkCipher struct { + Type [64]int8 + Geniv [64]int8 + Blocksize uint32 + Min_keysize uint32 + Max_keysize uint32 + Ivsize uint32 +} + +type CryptoReportAEAD struct { + Type [64]int8 + Geniv [64]int8 + Blocksize uint32 + Maxauthsize uint32 + Ivsize uint32 +} + +type CryptoReportComp struct { + Type [64]int8 +} + +type CryptoReportRNG struct { + Type [64]int8 + Seedsize uint32 +} + +type CryptoReportAKCipher struct { + Type [64]int8 +} + +type CryptoReportKPP struct { + Type [64]int8 +} + +type CryptoReportAcomp struct { + Type [64]int8 +} + +const ( + BPF_REG_0 = 0x0 + BPF_REG_1 = 0x1 + BPF_REG_2 = 0x2 + BPF_REG_3 = 0x3 + BPF_REG_4 = 0x4 + BPF_REG_5 = 0x5 + BPF_REG_6 = 0x6 + BPF_REG_7 = 0x7 + BPF_REG_8 = 0x8 + BPF_REG_9 = 0x9 + BPF_REG_10 = 0xa + BPF_MAP_CREATE = 0x0 + BPF_MAP_LOOKUP_ELEM = 0x1 + BPF_MAP_UPDATE_ELEM = 0x2 + BPF_MAP_DELETE_ELEM = 0x3 + BPF_MAP_GET_NEXT_KEY = 0x4 + BPF_PROG_LOAD = 0x5 + BPF_OBJ_PIN = 0x6 + BPF_OBJ_GET = 0x7 + BPF_PROG_ATTACH = 0x8 + BPF_PROG_DETACH = 0x9 + BPF_PROG_TEST_RUN = 0xa + BPF_PROG_GET_NEXT_ID = 0xb + BPF_MAP_GET_NEXT_ID = 0xc + BPF_PROG_GET_FD_BY_ID = 0xd + BPF_MAP_GET_FD_BY_ID = 0xe + BPF_OBJ_GET_INFO_BY_FD = 0xf + BPF_PROG_QUERY = 0x10 + BPF_RAW_TRACEPOINT_OPEN = 0x11 + BPF_BTF_LOAD = 0x12 + BPF_BTF_GET_FD_BY_ID = 0x13 + BPF_TASK_FD_QUERY = 0x14 + BPF_MAP_LOOKUP_AND_DELETE_ELEM = 0x15 + BPF_MAP_TYPE_UNSPEC = 0x0 + BPF_MAP_TYPE_HASH = 0x1 + BPF_MAP_TYPE_ARRAY = 0x2 + BPF_MAP_TYPE_PROG_ARRAY = 0x3 + BPF_MAP_TYPE_PERF_EVENT_ARRAY = 0x4 + BPF_MAP_TYPE_PERCPU_HASH = 0x5 + BPF_MAP_TYPE_PERCPU_ARRAY = 0x6 + BPF_MAP_TYPE_STACK_TRACE = 0x7 + BPF_MAP_TYPE_CGROUP_ARRAY = 0x8 + BPF_MAP_TYPE_LRU_HASH = 0x9 + BPF_MAP_TYPE_LRU_PERCPU_HASH = 0xa + BPF_MAP_TYPE_LPM_TRIE = 0xb + BPF_MAP_TYPE_ARRAY_OF_MAPS = 0xc + BPF_MAP_TYPE_HASH_OF_MAPS = 0xd + BPF_MAP_TYPE_DEVMAP = 0xe + BPF_MAP_TYPE_SOCKMAP = 0xf + BPF_MAP_TYPE_CPUMAP = 0x10 + BPF_MAP_TYPE_XSKMAP = 0x11 + BPF_MAP_TYPE_SOCKHASH = 0x12 + BPF_MAP_TYPE_CGROUP_STORAGE = 0x13 + BPF_MAP_TYPE_REUSEPORT_SOCKARRAY = 0x14 + BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE = 0x15 + BPF_MAP_TYPE_QUEUE = 0x16 + BPF_MAP_TYPE_STACK = 0x17 + BPF_PROG_TYPE_UNSPEC = 0x0 + BPF_PROG_TYPE_SOCKET_FILTER = 0x1 + BPF_PROG_TYPE_KPROBE = 0x2 + BPF_PROG_TYPE_SCHED_CLS = 0x3 + BPF_PROG_TYPE_SCHED_ACT = 0x4 + BPF_PROG_TYPE_TRACEPOINT = 0x5 + BPF_PROG_TYPE_XDP = 0x6 + BPF_PROG_TYPE_PERF_EVENT = 0x7 + BPF_PROG_TYPE_CGROUP_SKB = 0x8 + BPF_PROG_TYPE_CGROUP_SOCK = 0x9 + BPF_PROG_TYPE_LWT_IN = 0xa + BPF_PROG_TYPE_LWT_OUT = 0xb + BPF_PROG_TYPE_LWT_XMIT = 0xc + BPF_PROG_TYPE_SOCK_OPS = 0xd + BPF_PROG_TYPE_SK_SKB = 0xe + BPF_PROG_TYPE_CGROUP_DEVICE = 0xf + BPF_PROG_TYPE_SK_MSG = 0x10 + BPF_PROG_TYPE_RAW_TRACEPOINT = 0x11 + BPF_PROG_TYPE_CGROUP_SOCK_ADDR = 0x12 + BPF_PROG_TYPE_LWT_SEG6LOCAL = 0x13 + BPF_PROG_TYPE_LIRC_MODE2 = 0x14 + BPF_PROG_TYPE_SK_REUSEPORT = 0x15 + BPF_PROG_TYPE_FLOW_DISSECTOR = 0x16 + BPF_CGROUP_INET_INGRESS = 0x0 + BPF_CGROUP_INET_EGRESS = 0x1 + BPF_CGROUP_INET_SOCK_CREATE = 0x2 + BPF_CGROUP_SOCK_OPS = 0x3 + BPF_SK_SKB_STREAM_PARSER = 0x4 + BPF_SK_SKB_STREAM_VERDICT = 0x5 + BPF_CGROUP_DEVICE = 0x6 + BPF_SK_MSG_VERDICT = 0x7 + BPF_CGROUP_INET4_BIND = 0x8 + BPF_CGROUP_INET6_BIND = 0x9 + BPF_CGROUP_INET4_CONNECT = 0xa + BPF_CGROUP_INET6_CONNECT = 0xb + BPF_CGROUP_INET4_POST_BIND = 0xc + BPF_CGROUP_INET6_POST_BIND = 0xd + BPF_CGROUP_UDP4_SENDMSG = 0xe + BPF_CGROUP_UDP6_SENDMSG = 0xf + BPF_LIRC_MODE2 = 0x10 + BPF_FLOW_DISSECTOR = 0x11 + BPF_STACK_BUILD_ID_EMPTY = 0x0 + BPF_STACK_BUILD_ID_VALID = 0x1 + BPF_STACK_BUILD_ID_IP = 0x2 + BPF_ADJ_ROOM_NET = 0x0 + BPF_HDR_START_MAC = 0x0 + BPF_HDR_START_NET = 0x1 + BPF_LWT_ENCAP_SEG6 = 0x0 + BPF_LWT_ENCAP_SEG6_INLINE = 0x1 + BPF_OK = 0x0 + BPF_DROP = 0x2 + BPF_REDIRECT = 0x7 + BPF_SOCK_OPS_VOID = 0x0 + BPF_SOCK_OPS_TIMEOUT_INIT = 0x1 + BPF_SOCK_OPS_RWND_INIT = 0x2 + BPF_SOCK_OPS_TCP_CONNECT_CB = 0x3 + BPF_SOCK_OPS_ACTIVE_ESTABLISHED_CB = 0x4 + BPF_SOCK_OPS_PASSIVE_ESTABLISHED_CB = 0x5 + BPF_SOCK_OPS_NEEDS_ECN = 0x6 + BPF_SOCK_OPS_BASE_RTT = 0x7 + BPF_SOCK_OPS_RTO_CB = 0x8 + BPF_SOCK_OPS_RETRANS_CB = 0x9 + BPF_SOCK_OPS_STATE_CB = 0xa + BPF_SOCK_OPS_TCP_LISTEN_CB = 0xb + BPF_TCP_ESTABLISHED = 0x1 + BPF_TCP_SYN_SENT = 0x2 + BPF_TCP_SYN_RECV = 0x3 + BPF_TCP_FIN_WAIT1 = 0x4 + BPF_TCP_FIN_WAIT2 = 0x5 + BPF_TCP_TIME_WAIT = 0x6 + BPF_TCP_CLOSE = 0x7 + BPF_TCP_CLOSE_WAIT = 0x8 + BPF_TCP_LAST_ACK = 0x9 + BPF_TCP_LISTEN = 0xa + BPF_TCP_CLOSING = 0xb + BPF_TCP_NEW_SYN_RECV = 0xc + BPF_TCP_MAX_STATES = 0xd + BPF_FIB_LKUP_RET_SUCCESS = 0x0 + BPF_FIB_LKUP_RET_BLACKHOLE = 0x1 + BPF_FIB_LKUP_RET_UNREACHABLE = 0x2 + BPF_FIB_LKUP_RET_PROHIBIT = 0x3 + BPF_FIB_LKUP_RET_NOT_FWDED = 0x4 + BPF_FIB_LKUP_RET_FWD_DISABLED = 0x5 + BPF_FIB_LKUP_RET_UNSUPP_LWT = 0x6 + BPF_FIB_LKUP_RET_NO_NEIGH = 0x7 + BPF_FIB_LKUP_RET_FRAG_NEEDED = 0x8 + BPF_FD_TYPE_RAW_TRACEPOINT = 0x0 + BPF_FD_TYPE_TRACEPOINT = 0x1 + BPF_FD_TYPE_KPROBE = 0x2 + BPF_FD_TYPE_KRETPROBE = 0x3 + BPF_FD_TYPE_UPROBE = 0x4 + BPF_FD_TYPE_URETPROBE = 0x5 +) diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go index 471706ac..865bf57d 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go @@ -823,6 +823,8 @@ type Sigset_t struct { Val [32]uint32 } +const _C__NSIG = 0x80 + type SignalfdSiginfo struct { Signo uint32 Errno int32 @@ -1448,6 +1450,21 @@ type TpacketBlockDesc struct { Hdr [40]byte } +type TpacketBDTS struct { + Sec uint32 + Usec uint32 +} + +type TpacketHdrV1 struct { + Block_status uint32 + Num_pkts uint32 + Offset_to_first_pkt uint32 + Blk_len uint32 + Seq_num uint64 + Ts_first_pkt TpacketBDTS + Ts_last_pkt TpacketBDTS +} + type TpacketReq struct { Block_size uint32 Block_nr uint32 @@ -2130,3 +2147,320 @@ type FanotifyResponse struct { Fd int32 Response uint32 } + +const ( + CRYPTO_MSG_BASE = 0x10 + CRYPTO_MSG_NEWALG = 0x10 + CRYPTO_MSG_DELALG = 0x11 + CRYPTO_MSG_UPDATEALG = 0x12 + CRYPTO_MSG_GETALG = 0x13 + CRYPTO_MSG_DELRNG = 0x14 + CRYPTO_MSG_GETSTAT = 0x15 +) + +const ( + CRYPTOCFGA_UNSPEC = 0x0 + CRYPTOCFGA_PRIORITY_VAL = 0x1 + CRYPTOCFGA_REPORT_LARVAL = 0x2 + CRYPTOCFGA_REPORT_HASH = 0x3 + CRYPTOCFGA_REPORT_BLKCIPHER = 0x4 + CRYPTOCFGA_REPORT_AEAD = 0x5 + CRYPTOCFGA_REPORT_COMPRESS = 0x6 + CRYPTOCFGA_REPORT_RNG = 0x7 + CRYPTOCFGA_REPORT_CIPHER = 0x8 + CRYPTOCFGA_REPORT_AKCIPHER = 0x9 + CRYPTOCFGA_REPORT_KPP = 0xa + CRYPTOCFGA_REPORT_ACOMP = 0xb + CRYPTOCFGA_STAT_LARVAL = 0xc + CRYPTOCFGA_STAT_HASH = 0xd + CRYPTOCFGA_STAT_BLKCIPHER = 0xe + CRYPTOCFGA_STAT_AEAD = 0xf + CRYPTOCFGA_STAT_COMPRESS = 0x10 + CRYPTOCFGA_STAT_RNG = 0x11 + CRYPTOCFGA_STAT_CIPHER = 0x12 + CRYPTOCFGA_STAT_AKCIPHER = 0x13 + CRYPTOCFGA_STAT_KPP = 0x14 + CRYPTOCFGA_STAT_ACOMP = 0x15 +) + +type CryptoUserAlg struct { + Name [64]int8 + Driver_name [64]int8 + Module_name [64]int8 + Type uint32 + Mask uint32 + Refcnt uint32 + Flags uint32 +} + +type CryptoStatAEAD struct { + Type [64]int8 + Encrypt_cnt uint64 + Encrypt_tlen uint64 + Decrypt_cnt uint64 + Decrypt_tlen uint64 + Err_cnt uint64 +} + +type CryptoStatAKCipher struct { + Type [64]int8 + Encrypt_cnt uint64 + Encrypt_tlen uint64 + Decrypt_cnt uint64 + Decrypt_tlen uint64 + Verify_cnt uint64 + Sign_cnt uint64 + Err_cnt uint64 +} + +type CryptoStatCipher struct { + Type [64]int8 + Encrypt_cnt uint64 + Encrypt_tlen uint64 + Decrypt_cnt uint64 + Decrypt_tlen uint64 + Err_cnt uint64 +} + +type CryptoStatCompress struct { + Type [64]int8 + Compress_cnt uint64 + Compress_tlen uint64 + Decompress_cnt uint64 + Decompress_tlen uint64 + Err_cnt uint64 +} + +type CryptoStatHash struct { + Type [64]int8 + Hash_cnt uint64 + Hash_tlen uint64 + Err_cnt uint64 +} + +type CryptoStatKPP struct { + Type [64]int8 + Setsecret_cnt uint64 + Generate_public_key_cnt uint64 + Compute_shared_secret_cnt uint64 + Err_cnt uint64 +} + +type CryptoStatRNG struct { + Type [64]int8 + Generate_cnt uint64 + Generate_tlen uint64 + Seed_cnt uint64 + Err_cnt uint64 +} + +type CryptoStatLarval struct { + Type [64]int8 +} + +type CryptoReportLarval struct { + Type [64]int8 +} + +type CryptoReportHash struct { + Type [64]int8 + Blocksize uint32 + Digestsize uint32 +} + +type CryptoReportCipher struct { + Type [64]int8 + Blocksize uint32 + Min_keysize uint32 + Max_keysize uint32 +} + +type CryptoReportBlkCipher struct { + Type [64]int8 + Geniv [64]int8 + Blocksize uint32 + Min_keysize uint32 + Max_keysize uint32 + Ivsize uint32 +} + +type CryptoReportAEAD struct { + Type [64]int8 + Geniv [64]int8 + Blocksize uint32 + Maxauthsize uint32 + Ivsize uint32 +} + +type CryptoReportComp struct { + Type [64]int8 +} + +type CryptoReportRNG struct { + Type [64]int8 + Seedsize uint32 +} + +type CryptoReportAKCipher struct { + Type [64]int8 +} + +type CryptoReportKPP struct { + Type [64]int8 +} + +type CryptoReportAcomp struct { + Type [64]int8 +} + +const ( + BPF_REG_0 = 0x0 + BPF_REG_1 = 0x1 + BPF_REG_2 = 0x2 + BPF_REG_3 = 0x3 + BPF_REG_4 = 0x4 + BPF_REG_5 = 0x5 + BPF_REG_6 = 0x6 + BPF_REG_7 = 0x7 + BPF_REG_8 = 0x8 + BPF_REG_9 = 0x9 + BPF_REG_10 = 0xa + BPF_MAP_CREATE = 0x0 + BPF_MAP_LOOKUP_ELEM = 0x1 + BPF_MAP_UPDATE_ELEM = 0x2 + BPF_MAP_DELETE_ELEM = 0x3 + BPF_MAP_GET_NEXT_KEY = 0x4 + BPF_PROG_LOAD = 0x5 + BPF_OBJ_PIN = 0x6 + BPF_OBJ_GET = 0x7 + BPF_PROG_ATTACH = 0x8 + BPF_PROG_DETACH = 0x9 + BPF_PROG_TEST_RUN = 0xa + BPF_PROG_GET_NEXT_ID = 0xb + BPF_MAP_GET_NEXT_ID = 0xc + BPF_PROG_GET_FD_BY_ID = 0xd + BPF_MAP_GET_FD_BY_ID = 0xe + BPF_OBJ_GET_INFO_BY_FD = 0xf + BPF_PROG_QUERY = 0x10 + BPF_RAW_TRACEPOINT_OPEN = 0x11 + BPF_BTF_LOAD = 0x12 + BPF_BTF_GET_FD_BY_ID = 0x13 + BPF_TASK_FD_QUERY = 0x14 + BPF_MAP_LOOKUP_AND_DELETE_ELEM = 0x15 + BPF_MAP_TYPE_UNSPEC = 0x0 + BPF_MAP_TYPE_HASH = 0x1 + BPF_MAP_TYPE_ARRAY = 0x2 + BPF_MAP_TYPE_PROG_ARRAY = 0x3 + BPF_MAP_TYPE_PERF_EVENT_ARRAY = 0x4 + BPF_MAP_TYPE_PERCPU_HASH = 0x5 + BPF_MAP_TYPE_PERCPU_ARRAY = 0x6 + BPF_MAP_TYPE_STACK_TRACE = 0x7 + BPF_MAP_TYPE_CGROUP_ARRAY = 0x8 + BPF_MAP_TYPE_LRU_HASH = 0x9 + BPF_MAP_TYPE_LRU_PERCPU_HASH = 0xa + BPF_MAP_TYPE_LPM_TRIE = 0xb + BPF_MAP_TYPE_ARRAY_OF_MAPS = 0xc + BPF_MAP_TYPE_HASH_OF_MAPS = 0xd + BPF_MAP_TYPE_DEVMAP = 0xe + BPF_MAP_TYPE_SOCKMAP = 0xf + BPF_MAP_TYPE_CPUMAP = 0x10 + BPF_MAP_TYPE_XSKMAP = 0x11 + BPF_MAP_TYPE_SOCKHASH = 0x12 + BPF_MAP_TYPE_CGROUP_STORAGE = 0x13 + BPF_MAP_TYPE_REUSEPORT_SOCKARRAY = 0x14 + BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE = 0x15 + BPF_MAP_TYPE_QUEUE = 0x16 + BPF_MAP_TYPE_STACK = 0x17 + BPF_PROG_TYPE_UNSPEC = 0x0 + BPF_PROG_TYPE_SOCKET_FILTER = 0x1 + BPF_PROG_TYPE_KPROBE = 0x2 + BPF_PROG_TYPE_SCHED_CLS = 0x3 + BPF_PROG_TYPE_SCHED_ACT = 0x4 + BPF_PROG_TYPE_TRACEPOINT = 0x5 + BPF_PROG_TYPE_XDP = 0x6 + BPF_PROG_TYPE_PERF_EVENT = 0x7 + BPF_PROG_TYPE_CGROUP_SKB = 0x8 + BPF_PROG_TYPE_CGROUP_SOCK = 0x9 + BPF_PROG_TYPE_LWT_IN = 0xa + BPF_PROG_TYPE_LWT_OUT = 0xb + BPF_PROG_TYPE_LWT_XMIT = 0xc + BPF_PROG_TYPE_SOCK_OPS = 0xd + BPF_PROG_TYPE_SK_SKB = 0xe + BPF_PROG_TYPE_CGROUP_DEVICE = 0xf + BPF_PROG_TYPE_SK_MSG = 0x10 + BPF_PROG_TYPE_RAW_TRACEPOINT = 0x11 + BPF_PROG_TYPE_CGROUP_SOCK_ADDR = 0x12 + BPF_PROG_TYPE_LWT_SEG6LOCAL = 0x13 + BPF_PROG_TYPE_LIRC_MODE2 = 0x14 + BPF_PROG_TYPE_SK_REUSEPORT = 0x15 + BPF_PROG_TYPE_FLOW_DISSECTOR = 0x16 + BPF_CGROUP_INET_INGRESS = 0x0 + BPF_CGROUP_INET_EGRESS = 0x1 + BPF_CGROUP_INET_SOCK_CREATE = 0x2 + BPF_CGROUP_SOCK_OPS = 0x3 + BPF_SK_SKB_STREAM_PARSER = 0x4 + BPF_SK_SKB_STREAM_VERDICT = 0x5 + BPF_CGROUP_DEVICE = 0x6 + BPF_SK_MSG_VERDICT = 0x7 + BPF_CGROUP_INET4_BIND = 0x8 + BPF_CGROUP_INET6_BIND = 0x9 + BPF_CGROUP_INET4_CONNECT = 0xa + BPF_CGROUP_INET6_CONNECT = 0xb + BPF_CGROUP_INET4_POST_BIND = 0xc + BPF_CGROUP_INET6_POST_BIND = 0xd + BPF_CGROUP_UDP4_SENDMSG = 0xe + BPF_CGROUP_UDP6_SENDMSG = 0xf + BPF_LIRC_MODE2 = 0x10 + BPF_FLOW_DISSECTOR = 0x11 + BPF_STACK_BUILD_ID_EMPTY = 0x0 + BPF_STACK_BUILD_ID_VALID = 0x1 + BPF_STACK_BUILD_ID_IP = 0x2 + BPF_ADJ_ROOM_NET = 0x0 + BPF_HDR_START_MAC = 0x0 + BPF_HDR_START_NET = 0x1 + BPF_LWT_ENCAP_SEG6 = 0x0 + BPF_LWT_ENCAP_SEG6_INLINE = 0x1 + BPF_OK = 0x0 + BPF_DROP = 0x2 + BPF_REDIRECT = 0x7 + BPF_SOCK_OPS_VOID = 0x0 + BPF_SOCK_OPS_TIMEOUT_INIT = 0x1 + BPF_SOCK_OPS_RWND_INIT = 0x2 + BPF_SOCK_OPS_TCP_CONNECT_CB = 0x3 + BPF_SOCK_OPS_ACTIVE_ESTABLISHED_CB = 0x4 + BPF_SOCK_OPS_PASSIVE_ESTABLISHED_CB = 0x5 + BPF_SOCK_OPS_NEEDS_ECN = 0x6 + BPF_SOCK_OPS_BASE_RTT = 0x7 + BPF_SOCK_OPS_RTO_CB = 0x8 + BPF_SOCK_OPS_RETRANS_CB = 0x9 + BPF_SOCK_OPS_STATE_CB = 0xa + BPF_SOCK_OPS_TCP_LISTEN_CB = 0xb + BPF_TCP_ESTABLISHED = 0x1 + BPF_TCP_SYN_SENT = 0x2 + BPF_TCP_SYN_RECV = 0x3 + BPF_TCP_FIN_WAIT1 = 0x4 + BPF_TCP_FIN_WAIT2 = 0x5 + BPF_TCP_TIME_WAIT = 0x6 + BPF_TCP_CLOSE = 0x7 + BPF_TCP_CLOSE_WAIT = 0x8 + BPF_TCP_LAST_ACK = 0x9 + BPF_TCP_LISTEN = 0xa + BPF_TCP_CLOSING = 0xb + BPF_TCP_NEW_SYN_RECV = 0xc + BPF_TCP_MAX_STATES = 0xd + BPF_FIB_LKUP_RET_SUCCESS = 0x0 + BPF_FIB_LKUP_RET_BLACKHOLE = 0x1 + BPF_FIB_LKUP_RET_UNREACHABLE = 0x2 + BPF_FIB_LKUP_RET_PROHIBIT = 0x3 + BPF_FIB_LKUP_RET_NOT_FWDED = 0x4 + BPF_FIB_LKUP_RET_FWD_DISABLED = 0x5 + BPF_FIB_LKUP_RET_UNSUPP_LWT = 0x6 + BPF_FIB_LKUP_RET_NO_NEIGH = 0x7 + BPF_FIB_LKUP_RET_FRAG_NEEDED = 0x8 + BPF_FD_TYPE_RAW_TRACEPOINT = 0x0 + BPF_FD_TYPE_TRACEPOINT = 0x1 + BPF_FD_TYPE_KPROBE = 0x2 + BPF_FD_TYPE_KRETPROBE = 0x3 + BPF_FD_TYPE_UPROBE = 0x4 + BPF_FD_TYPE_URETPROBE = 0x5 +) diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go index 6cfa149f..2b68027d 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go @@ -831,6 +831,8 @@ type Sigset_t struct { Val [16]uint64 } +const _C__NSIG = 0x41 + type SignalfdSiginfo struct { Signo uint32 Errno int32 @@ -1453,6 +1455,21 @@ type TpacketBlockDesc struct { Hdr [40]byte } +type TpacketBDTS struct { + Sec uint32 + Usec uint32 +} + +type TpacketHdrV1 struct { + Block_status uint32 + Num_pkts uint32 + Offset_to_first_pkt uint32 + Blk_len uint32 + Seq_num uint64 + Ts_first_pkt TpacketBDTS + Ts_last_pkt TpacketBDTS +} + type TpacketReq struct { Block_size uint32 Block_nr uint32 @@ -2135,3 +2152,320 @@ type FanotifyResponse struct { Fd int32 Response uint32 } + +const ( + CRYPTO_MSG_BASE = 0x10 + CRYPTO_MSG_NEWALG = 0x10 + CRYPTO_MSG_DELALG = 0x11 + CRYPTO_MSG_UPDATEALG = 0x12 + CRYPTO_MSG_GETALG = 0x13 + CRYPTO_MSG_DELRNG = 0x14 + CRYPTO_MSG_GETSTAT = 0x15 +) + +const ( + CRYPTOCFGA_UNSPEC = 0x0 + CRYPTOCFGA_PRIORITY_VAL = 0x1 + CRYPTOCFGA_REPORT_LARVAL = 0x2 + CRYPTOCFGA_REPORT_HASH = 0x3 + CRYPTOCFGA_REPORT_BLKCIPHER = 0x4 + CRYPTOCFGA_REPORT_AEAD = 0x5 + CRYPTOCFGA_REPORT_COMPRESS = 0x6 + CRYPTOCFGA_REPORT_RNG = 0x7 + CRYPTOCFGA_REPORT_CIPHER = 0x8 + CRYPTOCFGA_REPORT_AKCIPHER = 0x9 + CRYPTOCFGA_REPORT_KPP = 0xa + CRYPTOCFGA_REPORT_ACOMP = 0xb + CRYPTOCFGA_STAT_LARVAL = 0xc + CRYPTOCFGA_STAT_HASH = 0xd + CRYPTOCFGA_STAT_BLKCIPHER = 0xe + CRYPTOCFGA_STAT_AEAD = 0xf + CRYPTOCFGA_STAT_COMPRESS = 0x10 + CRYPTOCFGA_STAT_RNG = 0x11 + CRYPTOCFGA_STAT_CIPHER = 0x12 + CRYPTOCFGA_STAT_AKCIPHER = 0x13 + CRYPTOCFGA_STAT_KPP = 0x14 + CRYPTOCFGA_STAT_ACOMP = 0x15 +) + +type CryptoUserAlg struct { + Name [64]uint8 + Driver_name [64]uint8 + Module_name [64]uint8 + Type uint32 + Mask uint32 + Refcnt uint32 + Flags uint32 +} + +type CryptoStatAEAD struct { + Type [64]uint8 + Encrypt_cnt uint64 + Encrypt_tlen uint64 + Decrypt_cnt uint64 + Decrypt_tlen uint64 + Err_cnt uint64 +} + +type CryptoStatAKCipher struct { + Type [64]uint8 + Encrypt_cnt uint64 + Encrypt_tlen uint64 + Decrypt_cnt uint64 + Decrypt_tlen uint64 + Verify_cnt uint64 + Sign_cnt uint64 + Err_cnt uint64 +} + +type CryptoStatCipher struct { + Type [64]uint8 + Encrypt_cnt uint64 + Encrypt_tlen uint64 + Decrypt_cnt uint64 + Decrypt_tlen uint64 + Err_cnt uint64 +} + +type CryptoStatCompress struct { + Type [64]uint8 + Compress_cnt uint64 + Compress_tlen uint64 + Decompress_cnt uint64 + Decompress_tlen uint64 + Err_cnt uint64 +} + +type CryptoStatHash struct { + Type [64]uint8 + Hash_cnt uint64 + Hash_tlen uint64 + Err_cnt uint64 +} + +type CryptoStatKPP struct { + Type [64]uint8 + Setsecret_cnt uint64 + Generate_public_key_cnt uint64 + Compute_shared_secret_cnt uint64 + Err_cnt uint64 +} + +type CryptoStatRNG struct { + Type [64]uint8 + Generate_cnt uint64 + Generate_tlen uint64 + Seed_cnt uint64 + Err_cnt uint64 +} + +type CryptoStatLarval struct { + Type [64]uint8 +} + +type CryptoReportLarval struct { + Type [64]uint8 +} + +type CryptoReportHash struct { + Type [64]uint8 + Blocksize uint32 + Digestsize uint32 +} + +type CryptoReportCipher struct { + Type [64]uint8 + Blocksize uint32 + Min_keysize uint32 + Max_keysize uint32 +} + +type CryptoReportBlkCipher struct { + Type [64]uint8 + Geniv [64]uint8 + Blocksize uint32 + Min_keysize uint32 + Max_keysize uint32 + Ivsize uint32 +} + +type CryptoReportAEAD struct { + Type [64]uint8 + Geniv [64]uint8 + Blocksize uint32 + Maxauthsize uint32 + Ivsize uint32 +} + +type CryptoReportComp struct { + Type [64]uint8 +} + +type CryptoReportRNG struct { + Type [64]uint8 + Seedsize uint32 +} + +type CryptoReportAKCipher struct { + Type [64]uint8 +} + +type CryptoReportKPP struct { + Type [64]uint8 +} + +type CryptoReportAcomp struct { + Type [64]uint8 +} + +const ( + BPF_REG_0 = 0x0 + BPF_REG_1 = 0x1 + BPF_REG_2 = 0x2 + BPF_REG_3 = 0x3 + BPF_REG_4 = 0x4 + BPF_REG_5 = 0x5 + BPF_REG_6 = 0x6 + BPF_REG_7 = 0x7 + BPF_REG_8 = 0x8 + BPF_REG_9 = 0x9 + BPF_REG_10 = 0xa + BPF_MAP_CREATE = 0x0 + BPF_MAP_LOOKUP_ELEM = 0x1 + BPF_MAP_UPDATE_ELEM = 0x2 + BPF_MAP_DELETE_ELEM = 0x3 + BPF_MAP_GET_NEXT_KEY = 0x4 + BPF_PROG_LOAD = 0x5 + BPF_OBJ_PIN = 0x6 + BPF_OBJ_GET = 0x7 + BPF_PROG_ATTACH = 0x8 + BPF_PROG_DETACH = 0x9 + BPF_PROG_TEST_RUN = 0xa + BPF_PROG_GET_NEXT_ID = 0xb + BPF_MAP_GET_NEXT_ID = 0xc + BPF_PROG_GET_FD_BY_ID = 0xd + BPF_MAP_GET_FD_BY_ID = 0xe + BPF_OBJ_GET_INFO_BY_FD = 0xf + BPF_PROG_QUERY = 0x10 + BPF_RAW_TRACEPOINT_OPEN = 0x11 + BPF_BTF_LOAD = 0x12 + BPF_BTF_GET_FD_BY_ID = 0x13 + BPF_TASK_FD_QUERY = 0x14 + BPF_MAP_LOOKUP_AND_DELETE_ELEM = 0x15 + BPF_MAP_TYPE_UNSPEC = 0x0 + BPF_MAP_TYPE_HASH = 0x1 + BPF_MAP_TYPE_ARRAY = 0x2 + BPF_MAP_TYPE_PROG_ARRAY = 0x3 + BPF_MAP_TYPE_PERF_EVENT_ARRAY = 0x4 + BPF_MAP_TYPE_PERCPU_HASH = 0x5 + BPF_MAP_TYPE_PERCPU_ARRAY = 0x6 + BPF_MAP_TYPE_STACK_TRACE = 0x7 + BPF_MAP_TYPE_CGROUP_ARRAY = 0x8 + BPF_MAP_TYPE_LRU_HASH = 0x9 + BPF_MAP_TYPE_LRU_PERCPU_HASH = 0xa + BPF_MAP_TYPE_LPM_TRIE = 0xb + BPF_MAP_TYPE_ARRAY_OF_MAPS = 0xc + BPF_MAP_TYPE_HASH_OF_MAPS = 0xd + BPF_MAP_TYPE_DEVMAP = 0xe + BPF_MAP_TYPE_SOCKMAP = 0xf + BPF_MAP_TYPE_CPUMAP = 0x10 + BPF_MAP_TYPE_XSKMAP = 0x11 + BPF_MAP_TYPE_SOCKHASH = 0x12 + BPF_MAP_TYPE_CGROUP_STORAGE = 0x13 + BPF_MAP_TYPE_REUSEPORT_SOCKARRAY = 0x14 + BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE = 0x15 + BPF_MAP_TYPE_QUEUE = 0x16 + BPF_MAP_TYPE_STACK = 0x17 + BPF_PROG_TYPE_UNSPEC = 0x0 + BPF_PROG_TYPE_SOCKET_FILTER = 0x1 + BPF_PROG_TYPE_KPROBE = 0x2 + BPF_PROG_TYPE_SCHED_CLS = 0x3 + BPF_PROG_TYPE_SCHED_ACT = 0x4 + BPF_PROG_TYPE_TRACEPOINT = 0x5 + BPF_PROG_TYPE_XDP = 0x6 + BPF_PROG_TYPE_PERF_EVENT = 0x7 + BPF_PROG_TYPE_CGROUP_SKB = 0x8 + BPF_PROG_TYPE_CGROUP_SOCK = 0x9 + BPF_PROG_TYPE_LWT_IN = 0xa + BPF_PROG_TYPE_LWT_OUT = 0xb + BPF_PROG_TYPE_LWT_XMIT = 0xc + BPF_PROG_TYPE_SOCK_OPS = 0xd + BPF_PROG_TYPE_SK_SKB = 0xe + BPF_PROG_TYPE_CGROUP_DEVICE = 0xf + BPF_PROG_TYPE_SK_MSG = 0x10 + BPF_PROG_TYPE_RAW_TRACEPOINT = 0x11 + BPF_PROG_TYPE_CGROUP_SOCK_ADDR = 0x12 + BPF_PROG_TYPE_LWT_SEG6LOCAL = 0x13 + BPF_PROG_TYPE_LIRC_MODE2 = 0x14 + BPF_PROG_TYPE_SK_REUSEPORT = 0x15 + BPF_PROG_TYPE_FLOW_DISSECTOR = 0x16 + BPF_CGROUP_INET_INGRESS = 0x0 + BPF_CGROUP_INET_EGRESS = 0x1 + BPF_CGROUP_INET_SOCK_CREATE = 0x2 + BPF_CGROUP_SOCK_OPS = 0x3 + BPF_SK_SKB_STREAM_PARSER = 0x4 + BPF_SK_SKB_STREAM_VERDICT = 0x5 + BPF_CGROUP_DEVICE = 0x6 + BPF_SK_MSG_VERDICT = 0x7 + BPF_CGROUP_INET4_BIND = 0x8 + BPF_CGROUP_INET6_BIND = 0x9 + BPF_CGROUP_INET4_CONNECT = 0xa + BPF_CGROUP_INET6_CONNECT = 0xb + BPF_CGROUP_INET4_POST_BIND = 0xc + BPF_CGROUP_INET6_POST_BIND = 0xd + BPF_CGROUP_UDP4_SENDMSG = 0xe + BPF_CGROUP_UDP6_SENDMSG = 0xf + BPF_LIRC_MODE2 = 0x10 + BPF_FLOW_DISSECTOR = 0x11 + BPF_STACK_BUILD_ID_EMPTY = 0x0 + BPF_STACK_BUILD_ID_VALID = 0x1 + BPF_STACK_BUILD_ID_IP = 0x2 + BPF_ADJ_ROOM_NET = 0x0 + BPF_HDR_START_MAC = 0x0 + BPF_HDR_START_NET = 0x1 + BPF_LWT_ENCAP_SEG6 = 0x0 + BPF_LWT_ENCAP_SEG6_INLINE = 0x1 + BPF_OK = 0x0 + BPF_DROP = 0x2 + BPF_REDIRECT = 0x7 + BPF_SOCK_OPS_VOID = 0x0 + BPF_SOCK_OPS_TIMEOUT_INIT = 0x1 + BPF_SOCK_OPS_RWND_INIT = 0x2 + BPF_SOCK_OPS_TCP_CONNECT_CB = 0x3 + BPF_SOCK_OPS_ACTIVE_ESTABLISHED_CB = 0x4 + BPF_SOCK_OPS_PASSIVE_ESTABLISHED_CB = 0x5 + BPF_SOCK_OPS_NEEDS_ECN = 0x6 + BPF_SOCK_OPS_BASE_RTT = 0x7 + BPF_SOCK_OPS_RTO_CB = 0x8 + BPF_SOCK_OPS_RETRANS_CB = 0x9 + BPF_SOCK_OPS_STATE_CB = 0xa + BPF_SOCK_OPS_TCP_LISTEN_CB = 0xb + BPF_TCP_ESTABLISHED = 0x1 + BPF_TCP_SYN_SENT = 0x2 + BPF_TCP_SYN_RECV = 0x3 + BPF_TCP_FIN_WAIT1 = 0x4 + BPF_TCP_FIN_WAIT2 = 0x5 + BPF_TCP_TIME_WAIT = 0x6 + BPF_TCP_CLOSE = 0x7 + BPF_TCP_CLOSE_WAIT = 0x8 + BPF_TCP_LAST_ACK = 0x9 + BPF_TCP_LISTEN = 0xa + BPF_TCP_CLOSING = 0xb + BPF_TCP_NEW_SYN_RECV = 0xc + BPF_TCP_MAX_STATES = 0xd + BPF_FIB_LKUP_RET_SUCCESS = 0x0 + BPF_FIB_LKUP_RET_BLACKHOLE = 0x1 + BPF_FIB_LKUP_RET_UNREACHABLE = 0x2 + BPF_FIB_LKUP_RET_PROHIBIT = 0x3 + BPF_FIB_LKUP_RET_NOT_FWDED = 0x4 + BPF_FIB_LKUP_RET_FWD_DISABLED = 0x5 + BPF_FIB_LKUP_RET_UNSUPP_LWT = 0x6 + BPF_FIB_LKUP_RET_NO_NEIGH = 0x7 + BPF_FIB_LKUP_RET_FRAG_NEEDED = 0x8 + BPF_FD_TYPE_RAW_TRACEPOINT = 0x0 + BPF_FD_TYPE_TRACEPOINT = 0x1 + BPF_FD_TYPE_KPROBE = 0x2 + BPF_FD_TYPE_KRETPROBE = 0x3 + BPF_FD_TYPE_UPROBE = 0x4 + BPF_FD_TYPE_URETPROBE = 0x5 +) diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go index acb3773f..76cd7e64 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go @@ -831,6 +831,8 @@ type Sigset_t struct { Val [16]uint64 } +const _C__NSIG = 0x41 + type SignalfdSiginfo struct { Signo uint32 Errno int32 @@ -1453,6 +1455,21 @@ type TpacketBlockDesc struct { Hdr [40]byte } +type TpacketBDTS struct { + Sec uint32 + Usec uint32 +} + +type TpacketHdrV1 struct { + Block_status uint32 + Num_pkts uint32 + Offset_to_first_pkt uint32 + Blk_len uint32 + Seq_num uint64 + Ts_first_pkt TpacketBDTS + Ts_last_pkt TpacketBDTS +} + type TpacketReq struct { Block_size uint32 Block_nr uint32 @@ -2135,3 +2152,320 @@ type FanotifyResponse struct { Fd int32 Response uint32 } + +const ( + CRYPTO_MSG_BASE = 0x10 + CRYPTO_MSG_NEWALG = 0x10 + CRYPTO_MSG_DELALG = 0x11 + CRYPTO_MSG_UPDATEALG = 0x12 + CRYPTO_MSG_GETALG = 0x13 + CRYPTO_MSG_DELRNG = 0x14 + CRYPTO_MSG_GETSTAT = 0x15 +) + +const ( + CRYPTOCFGA_UNSPEC = 0x0 + CRYPTOCFGA_PRIORITY_VAL = 0x1 + CRYPTOCFGA_REPORT_LARVAL = 0x2 + CRYPTOCFGA_REPORT_HASH = 0x3 + CRYPTOCFGA_REPORT_BLKCIPHER = 0x4 + CRYPTOCFGA_REPORT_AEAD = 0x5 + CRYPTOCFGA_REPORT_COMPRESS = 0x6 + CRYPTOCFGA_REPORT_RNG = 0x7 + CRYPTOCFGA_REPORT_CIPHER = 0x8 + CRYPTOCFGA_REPORT_AKCIPHER = 0x9 + CRYPTOCFGA_REPORT_KPP = 0xa + CRYPTOCFGA_REPORT_ACOMP = 0xb + CRYPTOCFGA_STAT_LARVAL = 0xc + CRYPTOCFGA_STAT_HASH = 0xd + CRYPTOCFGA_STAT_BLKCIPHER = 0xe + CRYPTOCFGA_STAT_AEAD = 0xf + CRYPTOCFGA_STAT_COMPRESS = 0x10 + CRYPTOCFGA_STAT_RNG = 0x11 + CRYPTOCFGA_STAT_CIPHER = 0x12 + CRYPTOCFGA_STAT_AKCIPHER = 0x13 + CRYPTOCFGA_STAT_KPP = 0x14 + CRYPTOCFGA_STAT_ACOMP = 0x15 +) + +type CryptoUserAlg struct { + Name [64]uint8 + Driver_name [64]uint8 + Module_name [64]uint8 + Type uint32 + Mask uint32 + Refcnt uint32 + Flags uint32 +} + +type CryptoStatAEAD struct { + Type [64]uint8 + Encrypt_cnt uint64 + Encrypt_tlen uint64 + Decrypt_cnt uint64 + Decrypt_tlen uint64 + Err_cnt uint64 +} + +type CryptoStatAKCipher struct { + Type [64]uint8 + Encrypt_cnt uint64 + Encrypt_tlen uint64 + Decrypt_cnt uint64 + Decrypt_tlen uint64 + Verify_cnt uint64 + Sign_cnt uint64 + Err_cnt uint64 +} + +type CryptoStatCipher struct { + Type [64]uint8 + Encrypt_cnt uint64 + Encrypt_tlen uint64 + Decrypt_cnt uint64 + Decrypt_tlen uint64 + Err_cnt uint64 +} + +type CryptoStatCompress struct { + Type [64]uint8 + Compress_cnt uint64 + Compress_tlen uint64 + Decompress_cnt uint64 + Decompress_tlen uint64 + Err_cnt uint64 +} + +type CryptoStatHash struct { + Type [64]uint8 + Hash_cnt uint64 + Hash_tlen uint64 + Err_cnt uint64 +} + +type CryptoStatKPP struct { + Type [64]uint8 + Setsecret_cnt uint64 + Generate_public_key_cnt uint64 + Compute_shared_secret_cnt uint64 + Err_cnt uint64 +} + +type CryptoStatRNG struct { + Type [64]uint8 + Generate_cnt uint64 + Generate_tlen uint64 + Seed_cnt uint64 + Err_cnt uint64 +} + +type CryptoStatLarval struct { + Type [64]uint8 +} + +type CryptoReportLarval struct { + Type [64]uint8 +} + +type CryptoReportHash struct { + Type [64]uint8 + Blocksize uint32 + Digestsize uint32 +} + +type CryptoReportCipher struct { + Type [64]uint8 + Blocksize uint32 + Min_keysize uint32 + Max_keysize uint32 +} + +type CryptoReportBlkCipher struct { + Type [64]uint8 + Geniv [64]uint8 + Blocksize uint32 + Min_keysize uint32 + Max_keysize uint32 + Ivsize uint32 +} + +type CryptoReportAEAD struct { + Type [64]uint8 + Geniv [64]uint8 + Blocksize uint32 + Maxauthsize uint32 + Ivsize uint32 +} + +type CryptoReportComp struct { + Type [64]uint8 +} + +type CryptoReportRNG struct { + Type [64]uint8 + Seedsize uint32 +} + +type CryptoReportAKCipher struct { + Type [64]uint8 +} + +type CryptoReportKPP struct { + Type [64]uint8 +} + +type CryptoReportAcomp struct { + Type [64]uint8 +} + +const ( + BPF_REG_0 = 0x0 + BPF_REG_1 = 0x1 + BPF_REG_2 = 0x2 + BPF_REG_3 = 0x3 + BPF_REG_4 = 0x4 + BPF_REG_5 = 0x5 + BPF_REG_6 = 0x6 + BPF_REG_7 = 0x7 + BPF_REG_8 = 0x8 + BPF_REG_9 = 0x9 + BPF_REG_10 = 0xa + BPF_MAP_CREATE = 0x0 + BPF_MAP_LOOKUP_ELEM = 0x1 + BPF_MAP_UPDATE_ELEM = 0x2 + BPF_MAP_DELETE_ELEM = 0x3 + BPF_MAP_GET_NEXT_KEY = 0x4 + BPF_PROG_LOAD = 0x5 + BPF_OBJ_PIN = 0x6 + BPF_OBJ_GET = 0x7 + BPF_PROG_ATTACH = 0x8 + BPF_PROG_DETACH = 0x9 + BPF_PROG_TEST_RUN = 0xa + BPF_PROG_GET_NEXT_ID = 0xb + BPF_MAP_GET_NEXT_ID = 0xc + BPF_PROG_GET_FD_BY_ID = 0xd + BPF_MAP_GET_FD_BY_ID = 0xe + BPF_OBJ_GET_INFO_BY_FD = 0xf + BPF_PROG_QUERY = 0x10 + BPF_RAW_TRACEPOINT_OPEN = 0x11 + BPF_BTF_LOAD = 0x12 + BPF_BTF_GET_FD_BY_ID = 0x13 + BPF_TASK_FD_QUERY = 0x14 + BPF_MAP_LOOKUP_AND_DELETE_ELEM = 0x15 + BPF_MAP_TYPE_UNSPEC = 0x0 + BPF_MAP_TYPE_HASH = 0x1 + BPF_MAP_TYPE_ARRAY = 0x2 + BPF_MAP_TYPE_PROG_ARRAY = 0x3 + BPF_MAP_TYPE_PERF_EVENT_ARRAY = 0x4 + BPF_MAP_TYPE_PERCPU_HASH = 0x5 + BPF_MAP_TYPE_PERCPU_ARRAY = 0x6 + BPF_MAP_TYPE_STACK_TRACE = 0x7 + BPF_MAP_TYPE_CGROUP_ARRAY = 0x8 + BPF_MAP_TYPE_LRU_HASH = 0x9 + BPF_MAP_TYPE_LRU_PERCPU_HASH = 0xa + BPF_MAP_TYPE_LPM_TRIE = 0xb + BPF_MAP_TYPE_ARRAY_OF_MAPS = 0xc + BPF_MAP_TYPE_HASH_OF_MAPS = 0xd + BPF_MAP_TYPE_DEVMAP = 0xe + BPF_MAP_TYPE_SOCKMAP = 0xf + BPF_MAP_TYPE_CPUMAP = 0x10 + BPF_MAP_TYPE_XSKMAP = 0x11 + BPF_MAP_TYPE_SOCKHASH = 0x12 + BPF_MAP_TYPE_CGROUP_STORAGE = 0x13 + BPF_MAP_TYPE_REUSEPORT_SOCKARRAY = 0x14 + BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE = 0x15 + BPF_MAP_TYPE_QUEUE = 0x16 + BPF_MAP_TYPE_STACK = 0x17 + BPF_PROG_TYPE_UNSPEC = 0x0 + BPF_PROG_TYPE_SOCKET_FILTER = 0x1 + BPF_PROG_TYPE_KPROBE = 0x2 + BPF_PROG_TYPE_SCHED_CLS = 0x3 + BPF_PROG_TYPE_SCHED_ACT = 0x4 + BPF_PROG_TYPE_TRACEPOINT = 0x5 + BPF_PROG_TYPE_XDP = 0x6 + BPF_PROG_TYPE_PERF_EVENT = 0x7 + BPF_PROG_TYPE_CGROUP_SKB = 0x8 + BPF_PROG_TYPE_CGROUP_SOCK = 0x9 + BPF_PROG_TYPE_LWT_IN = 0xa + BPF_PROG_TYPE_LWT_OUT = 0xb + BPF_PROG_TYPE_LWT_XMIT = 0xc + BPF_PROG_TYPE_SOCK_OPS = 0xd + BPF_PROG_TYPE_SK_SKB = 0xe + BPF_PROG_TYPE_CGROUP_DEVICE = 0xf + BPF_PROG_TYPE_SK_MSG = 0x10 + BPF_PROG_TYPE_RAW_TRACEPOINT = 0x11 + BPF_PROG_TYPE_CGROUP_SOCK_ADDR = 0x12 + BPF_PROG_TYPE_LWT_SEG6LOCAL = 0x13 + BPF_PROG_TYPE_LIRC_MODE2 = 0x14 + BPF_PROG_TYPE_SK_REUSEPORT = 0x15 + BPF_PROG_TYPE_FLOW_DISSECTOR = 0x16 + BPF_CGROUP_INET_INGRESS = 0x0 + BPF_CGROUP_INET_EGRESS = 0x1 + BPF_CGROUP_INET_SOCK_CREATE = 0x2 + BPF_CGROUP_SOCK_OPS = 0x3 + BPF_SK_SKB_STREAM_PARSER = 0x4 + BPF_SK_SKB_STREAM_VERDICT = 0x5 + BPF_CGROUP_DEVICE = 0x6 + BPF_SK_MSG_VERDICT = 0x7 + BPF_CGROUP_INET4_BIND = 0x8 + BPF_CGROUP_INET6_BIND = 0x9 + BPF_CGROUP_INET4_CONNECT = 0xa + BPF_CGROUP_INET6_CONNECT = 0xb + BPF_CGROUP_INET4_POST_BIND = 0xc + BPF_CGROUP_INET6_POST_BIND = 0xd + BPF_CGROUP_UDP4_SENDMSG = 0xe + BPF_CGROUP_UDP6_SENDMSG = 0xf + BPF_LIRC_MODE2 = 0x10 + BPF_FLOW_DISSECTOR = 0x11 + BPF_STACK_BUILD_ID_EMPTY = 0x0 + BPF_STACK_BUILD_ID_VALID = 0x1 + BPF_STACK_BUILD_ID_IP = 0x2 + BPF_ADJ_ROOM_NET = 0x0 + BPF_HDR_START_MAC = 0x0 + BPF_HDR_START_NET = 0x1 + BPF_LWT_ENCAP_SEG6 = 0x0 + BPF_LWT_ENCAP_SEG6_INLINE = 0x1 + BPF_OK = 0x0 + BPF_DROP = 0x2 + BPF_REDIRECT = 0x7 + BPF_SOCK_OPS_VOID = 0x0 + BPF_SOCK_OPS_TIMEOUT_INIT = 0x1 + BPF_SOCK_OPS_RWND_INIT = 0x2 + BPF_SOCK_OPS_TCP_CONNECT_CB = 0x3 + BPF_SOCK_OPS_ACTIVE_ESTABLISHED_CB = 0x4 + BPF_SOCK_OPS_PASSIVE_ESTABLISHED_CB = 0x5 + BPF_SOCK_OPS_NEEDS_ECN = 0x6 + BPF_SOCK_OPS_BASE_RTT = 0x7 + BPF_SOCK_OPS_RTO_CB = 0x8 + BPF_SOCK_OPS_RETRANS_CB = 0x9 + BPF_SOCK_OPS_STATE_CB = 0xa + BPF_SOCK_OPS_TCP_LISTEN_CB = 0xb + BPF_TCP_ESTABLISHED = 0x1 + BPF_TCP_SYN_SENT = 0x2 + BPF_TCP_SYN_RECV = 0x3 + BPF_TCP_FIN_WAIT1 = 0x4 + BPF_TCP_FIN_WAIT2 = 0x5 + BPF_TCP_TIME_WAIT = 0x6 + BPF_TCP_CLOSE = 0x7 + BPF_TCP_CLOSE_WAIT = 0x8 + BPF_TCP_LAST_ACK = 0x9 + BPF_TCP_LISTEN = 0xa + BPF_TCP_CLOSING = 0xb + BPF_TCP_NEW_SYN_RECV = 0xc + BPF_TCP_MAX_STATES = 0xd + BPF_FIB_LKUP_RET_SUCCESS = 0x0 + BPF_FIB_LKUP_RET_BLACKHOLE = 0x1 + BPF_FIB_LKUP_RET_UNREACHABLE = 0x2 + BPF_FIB_LKUP_RET_PROHIBIT = 0x3 + BPF_FIB_LKUP_RET_NOT_FWDED = 0x4 + BPF_FIB_LKUP_RET_FWD_DISABLED = 0x5 + BPF_FIB_LKUP_RET_UNSUPP_LWT = 0x6 + BPF_FIB_LKUP_RET_NO_NEIGH = 0x7 + BPF_FIB_LKUP_RET_FRAG_NEEDED = 0x8 + BPF_FD_TYPE_RAW_TRACEPOINT = 0x0 + BPF_FD_TYPE_TRACEPOINT = 0x1 + BPF_FD_TYPE_KPROBE = 0x2 + BPF_FD_TYPE_KRETPROBE = 0x3 + BPF_FD_TYPE_UPROBE = 0x4 + BPF_FD_TYPE_URETPROBE = 0x5 +) diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go index 9735b257..f99f0615 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go @@ -848,6 +848,8 @@ type Sigset_t struct { Val [16]uint64 } +const _C__NSIG = 0x41 + type SignalfdSiginfo struct { Signo uint32 Errno int32 @@ -1470,6 +1472,21 @@ type TpacketBlockDesc struct { Hdr [40]byte } +type TpacketBDTS struct { + Sec uint32 + Usec uint32 +} + +type TpacketHdrV1 struct { + Block_status uint32 + Num_pkts uint32 + Offset_to_first_pkt uint32 + Blk_len uint32 + Seq_num uint64 + Ts_first_pkt TpacketBDTS + Ts_last_pkt TpacketBDTS +} + type TpacketReq struct { Block_size uint32 Block_nr uint32 @@ -2152,3 +2169,320 @@ type FanotifyResponse struct { Fd int32 Response uint32 } + +const ( + CRYPTO_MSG_BASE = 0x10 + CRYPTO_MSG_NEWALG = 0x10 + CRYPTO_MSG_DELALG = 0x11 + CRYPTO_MSG_UPDATEALG = 0x12 + CRYPTO_MSG_GETALG = 0x13 + CRYPTO_MSG_DELRNG = 0x14 + CRYPTO_MSG_GETSTAT = 0x15 +) + +const ( + CRYPTOCFGA_UNSPEC = 0x0 + CRYPTOCFGA_PRIORITY_VAL = 0x1 + CRYPTOCFGA_REPORT_LARVAL = 0x2 + CRYPTOCFGA_REPORT_HASH = 0x3 + CRYPTOCFGA_REPORT_BLKCIPHER = 0x4 + CRYPTOCFGA_REPORT_AEAD = 0x5 + CRYPTOCFGA_REPORT_COMPRESS = 0x6 + CRYPTOCFGA_REPORT_RNG = 0x7 + CRYPTOCFGA_REPORT_CIPHER = 0x8 + CRYPTOCFGA_REPORT_AKCIPHER = 0x9 + CRYPTOCFGA_REPORT_KPP = 0xa + CRYPTOCFGA_REPORT_ACOMP = 0xb + CRYPTOCFGA_STAT_LARVAL = 0xc + CRYPTOCFGA_STAT_HASH = 0xd + CRYPTOCFGA_STAT_BLKCIPHER = 0xe + CRYPTOCFGA_STAT_AEAD = 0xf + CRYPTOCFGA_STAT_COMPRESS = 0x10 + CRYPTOCFGA_STAT_RNG = 0x11 + CRYPTOCFGA_STAT_CIPHER = 0x12 + CRYPTOCFGA_STAT_AKCIPHER = 0x13 + CRYPTOCFGA_STAT_KPP = 0x14 + CRYPTOCFGA_STAT_ACOMP = 0x15 +) + +type CryptoUserAlg struct { + Name [64]uint8 + Driver_name [64]uint8 + Module_name [64]uint8 + Type uint32 + Mask uint32 + Refcnt uint32 + Flags uint32 +} + +type CryptoStatAEAD struct { + Type [64]uint8 + Encrypt_cnt uint64 + Encrypt_tlen uint64 + Decrypt_cnt uint64 + Decrypt_tlen uint64 + Err_cnt uint64 +} + +type CryptoStatAKCipher struct { + Type [64]uint8 + Encrypt_cnt uint64 + Encrypt_tlen uint64 + Decrypt_cnt uint64 + Decrypt_tlen uint64 + Verify_cnt uint64 + Sign_cnt uint64 + Err_cnt uint64 +} + +type CryptoStatCipher struct { + Type [64]uint8 + Encrypt_cnt uint64 + Encrypt_tlen uint64 + Decrypt_cnt uint64 + Decrypt_tlen uint64 + Err_cnt uint64 +} + +type CryptoStatCompress struct { + Type [64]uint8 + Compress_cnt uint64 + Compress_tlen uint64 + Decompress_cnt uint64 + Decompress_tlen uint64 + Err_cnt uint64 +} + +type CryptoStatHash struct { + Type [64]uint8 + Hash_cnt uint64 + Hash_tlen uint64 + Err_cnt uint64 +} + +type CryptoStatKPP struct { + Type [64]uint8 + Setsecret_cnt uint64 + Generate_public_key_cnt uint64 + Compute_shared_secret_cnt uint64 + Err_cnt uint64 +} + +type CryptoStatRNG struct { + Type [64]uint8 + Generate_cnt uint64 + Generate_tlen uint64 + Seed_cnt uint64 + Err_cnt uint64 +} + +type CryptoStatLarval struct { + Type [64]uint8 +} + +type CryptoReportLarval struct { + Type [64]uint8 +} + +type CryptoReportHash struct { + Type [64]uint8 + Blocksize uint32 + Digestsize uint32 +} + +type CryptoReportCipher struct { + Type [64]uint8 + Blocksize uint32 + Min_keysize uint32 + Max_keysize uint32 +} + +type CryptoReportBlkCipher struct { + Type [64]uint8 + Geniv [64]uint8 + Blocksize uint32 + Min_keysize uint32 + Max_keysize uint32 + Ivsize uint32 +} + +type CryptoReportAEAD struct { + Type [64]uint8 + Geniv [64]uint8 + Blocksize uint32 + Maxauthsize uint32 + Ivsize uint32 +} + +type CryptoReportComp struct { + Type [64]uint8 +} + +type CryptoReportRNG struct { + Type [64]uint8 + Seedsize uint32 +} + +type CryptoReportAKCipher struct { + Type [64]uint8 +} + +type CryptoReportKPP struct { + Type [64]uint8 +} + +type CryptoReportAcomp struct { + Type [64]uint8 +} + +const ( + BPF_REG_0 = 0x0 + BPF_REG_1 = 0x1 + BPF_REG_2 = 0x2 + BPF_REG_3 = 0x3 + BPF_REG_4 = 0x4 + BPF_REG_5 = 0x5 + BPF_REG_6 = 0x6 + BPF_REG_7 = 0x7 + BPF_REG_8 = 0x8 + BPF_REG_9 = 0x9 + BPF_REG_10 = 0xa + BPF_MAP_CREATE = 0x0 + BPF_MAP_LOOKUP_ELEM = 0x1 + BPF_MAP_UPDATE_ELEM = 0x2 + BPF_MAP_DELETE_ELEM = 0x3 + BPF_MAP_GET_NEXT_KEY = 0x4 + BPF_PROG_LOAD = 0x5 + BPF_OBJ_PIN = 0x6 + BPF_OBJ_GET = 0x7 + BPF_PROG_ATTACH = 0x8 + BPF_PROG_DETACH = 0x9 + BPF_PROG_TEST_RUN = 0xa + BPF_PROG_GET_NEXT_ID = 0xb + BPF_MAP_GET_NEXT_ID = 0xc + BPF_PROG_GET_FD_BY_ID = 0xd + BPF_MAP_GET_FD_BY_ID = 0xe + BPF_OBJ_GET_INFO_BY_FD = 0xf + BPF_PROG_QUERY = 0x10 + BPF_RAW_TRACEPOINT_OPEN = 0x11 + BPF_BTF_LOAD = 0x12 + BPF_BTF_GET_FD_BY_ID = 0x13 + BPF_TASK_FD_QUERY = 0x14 + BPF_MAP_LOOKUP_AND_DELETE_ELEM = 0x15 + BPF_MAP_TYPE_UNSPEC = 0x0 + BPF_MAP_TYPE_HASH = 0x1 + BPF_MAP_TYPE_ARRAY = 0x2 + BPF_MAP_TYPE_PROG_ARRAY = 0x3 + BPF_MAP_TYPE_PERF_EVENT_ARRAY = 0x4 + BPF_MAP_TYPE_PERCPU_HASH = 0x5 + BPF_MAP_TYPE_PERCPU_ARRAY = 0x6 + BPF_MAP_TYPE_STACK_TRACE = 0x7 + BPF_MAP_TYPE_CGROUP_ARRAY = 0x8 + BPF_MAP_TYPE_LRU_HASH = 0x9 + BPF_MAP_TYPE_LRU_PERCPU_HASH = 0xa + BPF_MAP_TYPE_LPM_TRIE = 0xb + BPF_MAP_TYPE_ARRAY_OF_MAPS = 0xc + BPF_MAP_TYPE_HASH_OF_MAPS = 0xd + BPF_MAP_TYPE_DEVMAP = 0xe + BPF_MAP_TYPE_SOCKMAP = 0xf + BPF_MAP_TYPE_CPUMAP = 0x10 + BPF_MAP_TYPE_XSKMAP = 0x11 + BPF_MAP_TYPE_SOCKHASH = 0x12 + BPF_MAP_TYPE_CGROUP_STORAGE = 0x13 + BPF_MAP_TYPE_REUSEPORT_SOCKARRAY = 0x14 + BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE = 0x15 + BPF_MAP_TYPE_QUEUE = 0x16 + BPF_MAP_TYPE_STACK = 0x17 + BPF_PROG_TYPE_UNSPEC = 0x0 + BPF_PROG_TYPE_SOCKET_FILTER = 0x1 + BPF_PROG_TYPE_KPROBE = 0x2 + BPF_PROG_TYPE_SCHED_CLS = 0x3 + BPF_PROG_TYPE_SCHED_ACT = 0x4 + BPF_PROG_TYPE_TRACEPOINT = 0x5 + BPF_PROG_TYPE_XDP = 0x6 + BPF_PROG_TYPE_PERF_EVENT = 0x7 + BPF_PROG_TYPE_CGROUP_SKB = 0x8 + BPF_PROG_TYPE_CGROUP_SOCK = 0x9 + BPF_PROG_TYPE_LWT_IN = 0xa + BPF_PROG_TYPE_LWT_OUT = 0xb + BPF_PROG_TYPE_LWT_XMIT = 0xc + BPF_PROG_TYPE_SOCK_OPS = 0xd + BPF_PROG_TYPE_SK_SKB = 0xe + BPF_PROG_TYPE_CGROUP_DEVICE = 0xf + BPF_PROG_TYPE_SK_MSG = 0x10 + BPF_PROG_TYPE_RAW_TRACEPOINT = 0x11 + BPF_PROG_TYPE_CGROUP_SOCK_ADDR = 0x12 + BPF_PROG_TYPE_LWT_SEG6LOCAL = 0x13 + BPF_PROG_TYPE_LIRC_MODE2 = 0x14 + BPF_PROG_TYPE_SK_REUSEPORT = 0x15 + BPF_PROG_TYPE_FLOW_DISSECTOR = 0x16 + BPF_CGROUP_INET_INGRESS = 0x0 + BPF_CGROUP_INET_EGRESS = 0x1 + BPF_CGROUP_INET_SOCK_CREATE = 0x2 + BPF_CGROUP_SOCK_OPS = 0x3 + BPF_SK_SKB_STREAM_PARSER = 0x4 + BPF_SK_SKB_STREAM_VERDICT = 0x5 + BPF_CGROUP_DEVICE = 0x6 + BPF_SK_MSG_VERDICT = 0x7 + BPF_CGROUP_INET4_BIND = 0x8 + BPF_CGROUP_INET6_BIND = 0x9 + BPF_CGROUP_INET4_CONNECT = 0xa + BPF_CGROUP_INET6_CONNECT = 0xb + BPF_CGROUP_INET4_POST_BIND = 0xc + BPF_CGROUP_INET6_POST_BIND = 0xd + BPF_CGROUP_UDP4_SENDMSG = 0xe + BPF_CGROUP_UDP6_SENDMSG = 0xf + BPF_LIRC_MODE2 = 0x10 + BPF_FLOW_DISSECTOR = 0x11 + BPF_STACK_BUILD_ID_EMPTY = 0x0 + BPF_STACK_BUILD_ID_VALID = 0x1 + BPF_STACK_BUILD_ID_IP = 0x2 + BPF_ADJ_ROOM_NET = 0x0 + BPF_HDR_START_MAC = 0x0 + BPF_HDR_START_NET = 0x1 + BPF_LWT_ENCAP_SEG6 = 0x0 + BPF_LWT_ENCAP_SEG6_INLINE = 0x1 + BPF_OK = 0x0 + BPF_DROP = 0x2 + BPF_REDIRECT = 0x7 + BPF_SOCK_OPS_VOID = 0x0 + BPF_SOCK_OPS_TIMEOUT_INIT = 0x1 + BPF_SOCK_OPS_RWND_INIT = 0x2 + BPF_SOCK_OPS_TCP_CONNECT_CB = 0x3 + BPF_SOCK_OPS_ACTIVE_ESTABLISHED_CB = 0x4 + BPF_SOCK_OPS_PASSIVE_ESTABLISHED_CB = 0x5 + BPF_SOCK_OPS_NEEDS_ECN = 0x6 + BPF_SOCK_OPS_BASE_RTT = 0x7 + BPF_SOCK_OPS_RTO_CB = 0x8 + BPF_SOCK_OPS_RETRANS_CB = 0x9 + BPF_SOCK_OPS_STATE_CB = 0xa + BPF_SOCK_OPS_TCP_LISTEN_CB = 0xb + BPF_TCP_ESTABLISHED = 0x1 + BPF_TCP_SYN_SENT = 0x2 + BPF_TCP_SYN_RECV = 0x3 + BPF_TCP_FIN_WAIT1 = 0x4 + BPF_TCP_FIN_WAIT2 = 0x5 + BPF_TCP_TIME_WAIT = 0x6 + BPF_TCP_CLOSE = 0x7 + BPF_TCP_CLOSE_WAIT = 0x8 + BPF_TCP_LAST_ACK = 0x9 + BPF_TCP_LISTEN = 0xa + BPF_TCP_CLOSING = 0xb + BPF_TCP_NEW_SYN_RECV = 0xc + BPF_TCP_MAX_STATES = 0xd + BPF_FIB_LKUP_RET_SUCCESS = 0x0 + BPF_FIB_LKUP_RET_BLACKHOLE = 0x1 + BPF_FIB_LKUP_RET_UNREACHABLE = 0x2 + BPF_FIB_LKUP_RET_PROHIBIT = 0x3 + BPF_FIB_LKUP_RET_NOT_FWDED = 0x4 + BPF_FIB_LKUP_RET_FWD_DISABLED = 0x5 + BPF_FIB_LKUP_RET_UNSUPP_LWT = 0x6 + BPF_FIB_LKUP_RET_NO_NEIGH = 0x7 + BPF_FIB_LKUP_RET_FRAG_NEEDED = 0x8 + BPF_FD_TYPE_RAW_TRACEPOINT = 0x0 + BPF_FD_TYPE_TRACEPOINT = 0x1 + BPF_FD_TYPE_KPROBE = 0x2 + BPF_FD_TYPE_KRETPROBE = 0x3 + BPF_FD_TYPE_UPROBE = 0x4 + BPF_FD_TYPE_URETPROBE = 0x5 +) diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go b/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go index 5369f652..d9d03ae4 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go @@ -844,6 +844,8 @@ type Sigset_t struct { Val [16]uint64 } +const _C__NSIG = 0x41 + type SignalfdSiginfo struct { Signo uint32 Errno int32 @@ -1467,6 +1469,21 @@ type TpacketBlockDesc struct { Hdr [40]byte } +type TpacketBDTS struct { + Sec uint32 + Usec uint32 +} + +type TpacketHdrV1 struct { + Block_status uint32 + Num_pkts uint32 + Offset_to_first_pkt uint32 + Blk_len uint32 + Seq_num uint64 + Ts_first_pkt TpacketBDTS + Ts_last_pkt TpacketBDTS +} + type TpacketReq struct { Block_size uint32 Block_nr uint32 @@ -2149,3 +2166,320 @@ type FanotifyResponse struct { Fd int32 Response uint32 } + +const ( + CRYPTO_MSG_BASE = 0x10 + CRYPTO_MSG_NEWALG = 0x10 + CRYPTO_MSG_DELALG = 0x11 + CRYPTO_MSG_UPDATEALG = 0x12 + CRYPTO_MSG_GETALG = 0x13 + CRYPTO_MSG_DELRNG = 0x14 + CRYPTO_MSG_GETSTAT = 0x15 +) + +const ( + CRYPTOCFGA_UNSPEC = 0x0 + CRYPTOCFGA_PRIORITY_VAL = 0x1 + CRYPTOCFGA_REPORT_LARVAL = 0x2 + CRYPTOCFGA_REPORT_HASH = 0x3 + CRYPTOCFGA_REPORT_BLKCIPHER = 0x4 + CRYPTOCFGA_REPORT_AEAD = 0x5 + CRYPTOCFGA_REPORT_COMPRESS = 0x6 + CRYPTOCFGA_REPORT_RNG = 0x7 + CRYPTOCFGA_REPORT_CIPHER = 0x8 + CRYPTOCFGA_REPORT_AKCIPHER = 0x9 + CRYPTOCFGA_REPORT_KPP = 0xa + CRYPTOCFGA_REPORT_ACOMP = 0xb + CRYPTOCFGA_STAT_LARVAL = 0xc + CRYPTOCFGA_STAT_HASH = 0xd + CRYPTOCFGA_STAT_BLKCIPHER = 0xe + CRYPTOCFGA_STAT_AEAD = 0xf + CRYPTOCFGA_STAT_COMPRESS = 0x10 + CRYPTOCFGA_STAT_RNG = 0x11 + CRYPTOCFGA_STAT_CIPHER = 0x12 + CRYPTOCFGA_STAT_AKCIPHER = 0x13 + CRYPTOCFGA_STAT_KPP = 0x14 + CRYPTOCFGA_STAT_ACOMP = 0x15 +) + +type CryptoUserAlg struct { + Name [64]int8 + Driver_name [64]int8 + Module_name [64]int8 + Type uint32 + Mask uint32 + Refcnt uint32 + Flags uint32 +} + +type CryptoStatAEAD struct { + Type [64]int8 + Encrypt_cnt uint64 + Encrypt_tlen uint64 + Decrypt_cnt uint64 + Decrypt_tlen uint64 + Err_cnt uint64 +} + +type CryptoStatAKCipher struct { + Type [64]int8 + Encrypt_cnt uint64 + Encrypt_tlen uint64 + Decrypt_cnt uint64 + Decrypt_tlen uint64 + Verify_cnt uint64 + Sign_cnt uint64 + Err_cnt uint64 +} + +type CryptoStatCipher struct { + Type [64]int8 + Encrypt_cnt uint64 + Encrypt_tlen uint64 + Decrypt_cnt uint64 + Decrypt_tlen uint64 + Err_cnt uint64 +} + +type CryptoStatCompress struct { + Type [64]int8 + Compress_cnt uint64 + Compress_tlen uint64 + Decompress_cnt uint64 + Decompress_tlen uint64 + Err_cnt uint64 +} + +type CryptoStatHash struct { + Type [64]int8 + Hash_cnt uint64 + Hash_tlen uint64 + Err_cnt uint64 +} + +type CryptoStatKPP struct { + Type [64]int8 + Setsecret_cnt uint64 + Generate_public_key_cnt uint64 + Compute_shared_secret_cnt uint64 + Err_cnt uint64 +} + +type CryptoStatRNG struct { + Type [64]int8 + Generate_cnt uint64 + Generate_tlen uint64 + Seed_cnt uint64 + Err_cnt uint64 +} + +type CryptoStatLarval struct { + Type [64]int8 +} + +type CryptoReportLarval struct { + Type [64]int8 +} + +type CryptoReportHash struct { + Type [64]int8 + Blocksize uint32 + Digestsize uint32 +} + +type CryptoReportCipher struct { + Type [64]int8 + Blocksize uint32 + Min_keysize uint32 + Max_keysize uint32 +} + +type CryptoReportBlkCipher struct { + Type [64]int8 + Geniv [64]int8 + Blocksize uint32 + Min_keysize uint32 + Max_keysize uint32 + Ivsize uint32 +} + +type CryptoReportAEAD struct { + Type [64]int8 + Geniv [64]int8 + Blocksize uint32 + Maxauthsize uint32 + Ivsize uint32 +} + +type CryptoReportComp struct { + Type [64]int8 +} + +type CryptoReportRNG struct { + Type [64]int8 + Seedsize uint32 +} + +type CryptoReportAKCipher struct { + Type [64]int8 +} + +type CryptoReportKPP struct { + Type [64]int8 +} + +type CryptoReportAcomp struct { + Type [64]int8 +} + +const ( + BPF_REG_0 = 0x0 + BPF_REG_1 = 0x1 + BPF_REG_2 = 0x2 + BPF_REG_3 = 0x3 + BPF_REG_4 = 0x4 + BPF_REG_5 = 0x5 + BPF_REG_6 = 0x6 + BPF_REG_7 = 0x7 + BPF_REG_8 = 0x8 + BPF_REG_9 = 0x9 + BPF_REG_10 = 0xa + BPF_MAP_CREATE = 0x0 + BPF_MAP_LOOKUP_ELEM = 0x1 + BPF_MAP_UPDATE_ELEM = 0x2 + BPF_MAP_DELETE_ELEM = 0x3 + BPF_MAP_GET_NEXT_KEY = 0x4 + BPF_PROG_LOAD = 0x5 + BPF_OBJ_PIN = 0x6 + BPF_OBJ_GET = 0x7 + BPF_PROG_ATTACH = 0x8 + BPF_PROG_DETACH = 0x9 + BPF_PROG_TEST_RUN = 0xa + BPF_PROG_GET_NEXT_ID = 0xb + BPF_MAP_GET_NEXT_ID = 0xc + BPF_PROG_GET_FD_BY_ID = 0xd + BPF_MAP_GET_FD_BY_ID = 0xe + BPF_OBJ_GET_INFO_BY_FD = 0xf + BPF_PROG_QUERY = 0x10 + BPF_RAW_TRACEPOINT_OPEN = 0x11 + BPF_BTF_LOAD = 0x12 + BPF_BTF_GET_FD_BY_ID = 0x13 + BPF_TASK_FD_QUERY = 0x14 + BPF_MAP_LOOKUP_AND_DELETE_ELEM = 0x15 + BPF_MAP_TYPE_UNSPEC = 0x0 + BPF_MAP_TYPE_HASH = 0x1 + BPF_MAP_TYPE_ARRAY = 0x2 + BPF_MAP_TYPE_PROG_ARRAY = 0x3 + BPF_MAP_TYPE_PERF_EVENT_ARRAY = 0x4 + BPF_MAP_TYPE_PERCPU_HASH = 0x5 + BPF_MAP_TYPE_PERCPU_ARRAY = 0x6 + BPF_MAP_TYPE_STACK_TRACE = 0x7 + BPF_MAP_TYPE_CGROUP_ARRAY = 0x8 + BPF_MAP_TYPE_LRU_HASH = 0x9 + BPF_MAP_TYPE_LRU_PERCPU_HASH = 0xa + BPF_MAP_TYPE_LPM_TRIE = 0xb + BPF_MAP_TYPE_ARRAY_OF_MAPS = 0xc + BPF_MAP_TYPE_HASH_OF_MAPS = 0xd + BPF_MAP_TYPE_DEVMAP = 0xe + BPF_MAP_TYPE_SOCKMAP = 0xf + BPF_MAP_TYPE_CPUMAP = 0x10 + BPF_MAP_TYPE_XSKMAP = 0x11 + BPF_MAP_TYPE_SOCKHASH = 0x12 + BPF_MAP_TYPE_CGROUP_STORAGE = 0x13 + BPF_MAP_TYPE_REUSEPORT_SOCKARRAY = 0x14 + BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE = 0x15 + BPF_MAP_TYPE_QUEUE = 0x16 + BPF_MAP_TYPE_STACK = 0x17 + BPF_PROG_TYPE_UNSPEC = 0x0 + BPF_PROG_TYPE_SOCKET_FILTER = 0x1 + BPF_PROG_TYPE_KPROBE = 0x2 + BPF_PROG_TYPE_SCHED_CLS = 0x3 + BPF_PROG_TYPE_SCHED_ACT = 0x4 + BPF_PROG_TYPE_TRACEPOINT = 0x5 + BPF_PROG_TYPE_XDP = 0x6 + BPF_PROG_TYPE_PERF_EVENT = 0x7 + BPF_PROG_TYPE_CGROUP_SKB = 0x8 + BPF_PROG_TYPE_CGROUP_SOCK = 0x9 + BPF_PROG_TYPE_LWT_IN = 0xa + BPF_PROG_TYPE_LWT_OUT = 0xb + BPF_PROG_TYPE_LWT_XMIT = 0xc + BPF_PROG_TYPE_SOCK_OPS = 0xd + BPF_PROG_TYPE_SK_SKB = 0xe + BPF_PROG_TYPE_CGROUP_DEVICE = 0xf + BPF_PROG_TYPE_SK_MSG = 0x10 + BPF_PROG_TYPE_RAW_TRACEPOINT = 0x11 + BPF_PROG_TYPE_CGROUP_SOCK_ADDR = 0x12 + BPF_PROG_TYPE_LWT_SEG6LOCAL = 0x13 + BPF_PROG_TYPE_LIRC_MODE2 = 0x14 + BPF_PROG_TYPE_SK_REUSEPORT = 0x15 + BPF_PROG_TYPE_FLOW_DISSECTOR = 0x16 + BPF_CGROUP_INET_INGRESS = 0x0 + BPF_CGROUP_INET_EGRESS = 0x1 + BPF_CGROUP_INET_SOCK_CREATE = 0x2 + BPF_CGROUP_SOCK_OPS = 0x3 + BPF_SK_SKB_STREAM_PARSER = 0x4 + BPF_SK_SKB_STREAM_VERDICT = 0x5 + BPF_CGROUP_DEVICE = 0x6 + BPF_SK_MSG_VERDICT = 0x7 + BPF_CGROUP_INET4_BIND = 0x8 + BPF_CGROUP_INET6_BIND = 0x9 + BPF_CGROUP_INET4_CONNECT = 0xa + BPF_CGROUP_INET6_CONNECT = 0xb + BPF_CGROUP_INET4_POST_BIND = 0xc + BPF_CGROUP_INET6_POST_BIND = 0xd + BPF_CGROUP_UDP4_SENDMSG = 0xe + BPF_CGROUP_UDP6_SENDMSG = 0xf + BPF_LIRC_MODE2 = 0x10 + BPF_FLOW_DISSECTOR = 0x11 + BPF_STACK_BUILD_ID_EMPTY = 0x0 + BPF_STACK_BUILD_ID_VALID = 0x1 + BPF_STACK_BUILD_ID_IP = 0x2 + BPF_ADJ_ROOM_NET = 0x0 + BPF_HDR_START_MAC = 0x0 + BPF_HDR_START_NET = 0x1 + BPF_LWT_ENCAP_SEG6 = 0x0 + BPF_LWT_ENCAP_SEG6_INLINE = 0x1 + BPF_OK = 0x0 + BPF_DROP = 0x2 + BPF_REDIRECT = 0x7 + BPF_SOCK_OPS_VOID = 0x0 + BPF_SOCK_OPS_TIMEOUT_INIT = 0x1 + BPF_SOCK_OPS_RWND_INIT = 0x2 + BPF_SOCK_OPS_TCP_CONNECT_CB = 0x3 + BPF_SOCK_OPS_ACTIVE_ESTABLISHED_CB = 0x4 + BPF_SOCK_OPS_PASSIVE_ESTABLISHED_CB = 0x5 + BPF_SOCK_OPS_NEEDS_ECN = 0x6 + BPF_SOCK_OPS_BASE_RTT = 0x7 + BPF_SOCK_OPS_RTO_CB = 0x8 + BPF_SOCK_OPS_RETRANS_CB = 0x9 + BPF_SOCK_OPS_STATE_CB = 0xa + BPF_SOCK_OPS_TCP_LISTEN_CB = 0xb + BPF_TCP_ESTABLISHED = 0x1 + BPF_TCP_SYN_SENT = 0x2 + BPF_TCP_SYN_RECV = 0x3 + BPF_TCP_FIN_WAIT1 = 0x4 + BPF_TCP_FIN_WAIT2 = 0x5 + BPF_TCP_TIME_WAIT = 0x6 + BPF_TCP_CLOSE = 0x7 + BPF_TCP_CLOSE_WAIT = 0x8 + BPF_TCP_LAST_ACK = 0x9 + BPF_TCP_LISTEN = 0xa + BPF_TCP_CLOSING = 0xb + BPF_TCP_NEW_SYN_RECV = 0xc + BPF_TCP_MAX_STATES = 0xd + BPF_FIB_LKUP_RET_SUCCESS = 0x0 + BPF_FIB_LKUP_RET_BLACKHOLE = 0x1 + BPF_FIB_LKUP_RET_UNREACHABLE = 0x2 + BPF_FIB_LKUP_RET_PROHIBIT = 0x3 + BPF_FIB_LKUP_RET_NOT_FWDED = 0x4 + BPF_FIB_LKUP_RET_FWD_DISABLED = 0x5 + BPF_FIB_LKUP_RET_UNSUPP_LWT = 0x6 + BPF_FIB_LKUP_RET_NO_NEIGH = 0x7 + BPF_FIB_LKUP_RET_FRAG_NEEDED = 0x8 + BPF_FD_TYPE_RAW_TRACEPOINT = 0x0 + BPF_FD_TYPE_TRACEPOINT = 0x1 + BPF_FD_TYPE_KPROBE = 0x2 + BPF_FD_TYPE_KRETPROBE = 0x3 + BPF_FD_TYPE_UPROBE = 0x4 + BPF_FD_TYPE_URETPROBE = 0x5 +) diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go index 552dbe51..b247fe94 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go @@ -826,6 +826,8 @@ type Sigset_t struct { Val [16]uint64 } +const _C__NSIG = 0x41 + type SignalfdSiginfo struct { Signo uint32 Errno int32 @@ -1448,6 +1450,21 @@ type TpacketBlockDesc struct { Hdr [40]byte } +type TpacketBDTS struct { + Sec uint32 + Usec uint32 +} + +type TpacketHdrV1 struct { + Block_status uint32 + Num_pkts uint32 + Offset_to_first_pkt uint32 + Blk_len uint32 + Seq_num uint64 + Ts_first_pkt TpacketBDTS + Ts_last_pkt TpacketBDTS +} + type TpacketReq struct { Block_size uint32 Block_nr uint32 @@ -2130,3 +2147,320 @@ type FanotifyResponse struct { Fd int32 Response uint32 } + +const ( + CRYPTO_MSG_BASE = 0x10 + CRYPTO_MSG_NEWALG = 0x10 + CRYPTO_MSG_DELALG = 0x11 + CRYPTO_MSG_UPDATEALG = 0x12 + CRYPTO_MSG_GETALG = 0x13 + CRYPTO_MSG_DELRNG = 0x14 + CRYPTO_MSG_GETSTAT = 0x15 +) + +const ( + CRYPTOCFGA_UNSPEC = 0x0 + CRYPTOCFGA_PRIORITY_VAL = 0x1 + CRYPTOCFGA_REPORT_LARVAL = 0x2 + CRYPTOCFGA_REPORT_HASH = 0x3 + CRYPTOCFGA_REPORT_BLKCIPHER = 0x4 + CRYPTOCFGA_REPORT_AEAD = 0x5 + CRYPTOCFGA_REPORT_COMPRESS = 0x6 + CRYPTOCFGA_REPORT_RNG = 0x7 + CRYPTOCFGA_REPORT_CIPHER = 0x8 + CRYPTOCFGA_REPORT_AKCIPHER = 0x9 + CRYPTOCFGA_REPORT_KPP = 0xa + CRYPTOCFGA_REPORT_ACOMP = 0xb + CRYPTOCFGA_STAT_LARVAL = 0xc + CRYPTOCFGA_STAT_HASH = 0xd + CRYPTOCFGA_STAT_BLKCIPHER = 0xe + CRYPTOCFGA_STAT_AEAD = 0xf + CRYPTOCFGA_STAT_COMPRESS = 0x10 + CRYPTOCFGA_STAT_RNG = 0x11 + CRYPTOCFGA_STAT_CIPHER = 0x12 + CRYPTOCFGA_STAT_AKCIPHER = 0x13 + CRYPTOCFGA_STAT_KPP = 0x14 + CRYPTOCFGA_STAT_ACOMP = 0x15 +) + +type CryptoUserAlg struct { + Name [64]int8 + Driver_name [64]int8 + Module_name [64]int8 + Type uint32 + Mask uint32 + Refcnt uint32 + Flags uint32 +} + +type CryptoStatAEAD struct { + Type [64]int8 + Encrypt_cnt uint64 + Encrypt_tlen uint64 + Decrypt_cnt uint64 + Decrypt_tlen uint64 + Err_cnt uint64 +} + +type CryptoStatAKCipher struct { + Type [64]int8 + Encrypt_cnt uint64 + Encrypt_tlen uint64 + Decrypt_cnt uint64 + Decrypt_tlen uint64 + Verify_cnt uint64 + Sign_cnt uint64 + Err_cnt uint64 +} + +type CryptoStatCipher struct { + Type [64]int8 + Encrypt_cnt uint64 + Encrypt_tlen uint64 + Decrypt_cnt uint64 + Decrypt_tlen uint64 + Err_cnt uint64 +} + +type CryptoStatCompress struct { + Type [64]int8 + Compress_cnt uint64 + Compress_tlen uint64 + Decompress_cnt uint64 + Decompress_tlen uint64 + Err_cnt uint64 +} + +type CryptoStatHash struct { + Type [64]int8 + Hash_cnt uint64 + Hash_tlen uint64 + Err_cnt uint64 +} + +type CryptoStatKPP struct { + Type [64]int8 + Setsecret_cnt uint64 + Generate_public_key_cnt uint64 + Compute_shared_secret_cnt uint64 + Err_cnt uint64 +} + +type CryptoStatRNG struct { + Type [64]int8 + Generate_cnt uint64 + Generate_tlen uint64 + Seed_cnt uint64 + Err_cnt uint64 +} + +type CryptoStatLarval struct { + Type [64]int8 +} + +type CryptoReportLarval struct { + Type [64]int8 +} + +type CryptoReportHash struct { + Type [64]int8 + Blocksize uint32 + Digestsize uint32 +} + +type CryptoReportCipher struct { + Type [64]int8 + Blocksize uint32 + Min_keysize uint32 + Max_keysize uint32 +} + +type CryptoReportBlkCipher struct { + Type [64]int8 + Geniv [64]int8 + Blocksize uint32 + Min_keysize uint32 + Max_keysize uint32 + Ivsize uint32 +} + +type CryptoReportAEAD struct { + Type [64]int8 + Geniv [64]int8 + Blocksize uint32 + Maxauthsize uint32 + Ivsize uint32 +} + +type CryptoReportComp struct { + Type [64]int8 +} + +type CryptoReportRNG struct { + Type [64]int8 + Seedsize uint32 +} + +type CryptoReportAKCipher struct { + Type [64]int8 +} + +type CryptoReportKPP struct { + Type [64]int8 +} + +type CryptoReportAcomp struct { + Type [64]int8 +} + +const ( + BPF_REG_0 = 0x0 + BPF_REG_1 = 0x1 + BPF_REG_2 = 0x2 + BPF_REG_3 = 0x3 + BPF_REG_4 = 0x4 + BPF_REG_5 = 0x5 + BPF_REG_6 = 0x6 + BPF_REG_7 = 0x7 + BPF_REG_8 = 0x8 + BPF_REG_9 = 0x9 + BPF_REG_10 = 0xa + BPF_MAP_CREATE = 0x0 + BPF_MAP_LOOKUP_ELEM = 0x1 + BPF_MAP_UPDATE_ELEM = 0x2 + BPF_MAP_DELETE_ELEM = 0x3 + BPF_MAP_GET_NEXT_KEY = 0x4 + BPF_PROG_LOAD = 0x5 + BPF_OBJ_PIN = 0x6 + BPF_OBJ_GET = 0x7 + BPF_PROG_ATTACH = 0x8 + BPF_PROG_DETACH = 0x9 + BPF_PROG_TEST_RUN = 0xa + BPF_PROG_GET_NEXT_ID = 0xb + BPF_MAP_GET_NEXT_ID = 0xc + BPF_PROG_GET_FD_BY_ID = 0xd + BPF_MAP_GET_FD_BY_ID = 0xe + BPF_OBJ_GET_INFO_BY_FD = 0xf + BPF_PROG_QUERY = 0x10 + BPF_RAW_TRACEPOINT_OPEN = 0x11 + BPF_BTF_LOAD = 0x12 + BPF_BTF_GET_FD_BY_ID = 0x13 + BPF_TASK_FD_QUERY = 0x14 + BPF_MAP_LOOKUP_AND_DELETE_ELEM = 0x15 + BPF_MAP_TYPE_UNSPEC = 0x0 + BPF_MAP_TYPE_HASH = 0x1 + BPF_MAP_TYPE_ARRAY = 0x2 + BPF_MAP_TYPE_PROG_ARRAY = 0x3 + BPF_MAP_TYPE_PERF_EVENT_ARRAY = 0x4 + BPF_MAP_TYPE_PERCPU_HASH = 0x5 + BPF_MAP_TYPE_PERCPU_ARRAY = 0x6 + BPF_MAP_TYPE_STACK_TRACE = 0x7 + BPF_MAP_TYPE_CGROUP_ARRAY = 0x8 + BPF_MAP_TYPE_LRU_HASH = 0x9 + BPF_MAP_TYPE_LRU_PERCPU_HASH = 0xa + BPF_MAP_TYPE_LPM_TRIE = 0xb + BPF_MAP_TYPE_ARRAY_OF_MAPS = 0xc + BPF_MAP_TYPE_HASH_OF_MAPS = 0xd + BPF_MAP_TYPE_DEVMAP = 0xe + BPF_MAP_TYPE_SOCKMAP = 0xf + BPF_MAP_TYPE_CPUMAP = 0x10 + BPF_MAP_TYPE_XSKMAP = 0x11 + BPF_MAP_TYPE_SOCKHASH = 0x12 + BPF_MAP_TYPE_CGROUP_STORAGE = 0x13 + BPF_MAP_TYPE_REUSEPORT_SOCKARRAY = 0x14 + BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE = 0x15 + BPF_MAP_TYPE_QUEUE = 0x16 + BPF_MAP_TYPE_STACK = 0x17 + BPF_PROG_TYPE_UNSPEC = 0x0 + BPF_PROG_TYPE_SOCKET_FILTER = 0x1 + BPF_PROG_TYPE_KPROBE = 0x2 + BPF_PROG_TYPE_SCHED_CLS = 0x3 + BPF_PROG_TYPE_SCHED_ACT = 0x4 + BPF_PROG_TYPE_TRACEPOINT = 0x5 + BPF_PROG_TYPE_XDP = 0x6 + BPF_PROG_TYPE_PERF_EVENT = 0x7 + BPF_PROG_TYPE_CGROUP_SKB = 0x8 + BPF_PROG_TYPE_CGROUP_SOCK = 0x9 + BPF_PROG_TYPE_LWT_IN = 0xa + BPF_PROG_TYPE_LWT_OUT = 0xb + BPF_PROG_TYPE_LWT_XMIT = 0xc + BPF_PROG_TYPE_SOCK_OPS = 0xd + BPF_PROG_TYPE_SK_SKB = 0xe + BPF_PROG_TYPE_CGROUP_DEVICE = 0xf + BPF_PROG_TYPE_SK_MSG = 0x10 + BPF_PROG_TYPE_RAW_TRACEPOINT = 0x11 + BPF_PROG_TYPE_CGROUP_SOCK_ADDR = 0x12 + BPF_PROG_TYPE_LWT_SEG6LOCAL = 0x13 + BPF_PROG_TYPE_LIRC_MODE2 = 0x14 + BPF_PROG_TYPE_SK_REUSEPORT = 0x15 + BPF_PROG_TYPE_FLOW_DISSECTOR = 0x16 + BPF_CGROUP_INET_INGRESS = 0x0 + BPF_CGROUP_INET_EGRESS = 0x1 + BPF_CGROUP_INET_SOCK_CREATE = 0x2 + BPF_CGROUP_SOCK_OPS = 0x3 + BPF_SK_SKB_STREAM_PARSER = 0x4 + BPF_SK_SKB_STREAM_VERDICT = 0x5 + BPF_CGROUP_DEVICE = 0x6 + BPF_SK_MSG_VERDICT = 0x7 + BPF_CGROUP_INET4_BIND = 0x8 + BPF_CGROUP_INET6_BIND = 0x9 + BPF_CGROUP_INET4_CONNECT = 0xa + BPF_CGROUP_INET6_CONNECT = 0xb + BPF_CGROUP_INET4_POST_BIND = 0xc + BPF_CGROUP_INET6_POST_BIND = 0xd + BPF_CGROUP_UDP4_SENDMSG = 0xe + BPF_CGROUP_UDP6_SENDMSG = 0xf + BPF_LIRC_MODE2 = 0x10 + BPF_FLOW_DISSECTOR = 0x11 + BPF_STACK_BUILD_ID_EMPTY = 0x0 + BPF_STACK_BUILD_ID_VALID = 0x1 + BPF_STACK_BUILD_ID_IP = 0x2 + BPF_ADJ_ROOM_NET = 0x0 + BPF_HDR_START_MAC = 0x0 + BPF_HDR_START_NET = 0x1 + BPF_LWT_ENCAP_SEG6 = 0x0 + BPF_LWT_ENCAP_SEG6_INLINE = 0x1 + BPF_OK = 0x0 + BPF_DROP = 0x2 + BPF_REDIRECT = 0x7 + BPF_SOCK_OPS_VOID = 0x0 + BPF_SOCK_OPS_TIMEOUT_INIT = 0x1 + BPF_SOCK_OPS_RWND_INIT = 0x2 + BPF_SOCK_OPS_TCP_CONNECT_CB = 0x3 + BPF_SOCK_OPS_ACTIVE_ESTABLISHED_CB = 0x4 + BPF_SOCK_OPS_PASSIVE_ESTABLISHED_CB = 0x5 + BPF_SOCK_OPS_NEEDS_ECN = 0x6 + BPF_SOCK_OPS_BASE_RTT = 0x7 + BPF_SOCK_OPS_RTO_CB = 0x8 + BPF_SOCK_OPS_RETRANS_CB = 0x9 + BPF_SOCK_OPS_STATE_CB = 0xa + BPF_SOCK_OPS_TCP_LISTEN_CB = 0xb + BPF_TCP_ESTABLISHED = 0x1 + BPF_TCP_SYN_SENT = 0x2 + BPF_TCP_SYN_RECV = 0x3 + BPF_TCP_FIN_WAIT1 = 0x4 + BPF_TCP_FIN_WAIT2 = 0x5 + BPF_TCP_TIME_WAIT = 0x6 + BPF_TCP_CLOSE = 0x7 + BPF_TCP_CLOSE_WAIT = 0x8 + BPF_TCP_LAST_ACK = 0x9 + BPF_TCP_LISTEN = 0xa + BPF_TCP_CLOSING = 0xb + BPF_TCP_NEW_SYN_RECV = 0xc + BPF_TCP_MAX_STATES = 0xd + BPF_FIB_LKUP_RET_SUCCESS = 0x0 + BPF_FIB_LKUP_RET_BLACKHOLE = 0x1 + BPF_FIB_LKUP_RET_UNREACHABLE = 0x2 + BPF_FIB_LKUP_RET_PROHIBIT = 0x3 + BPF_FIB_LKUP_RET_NOT_FWDED = 0x4 + BPF_FIB_LKUP_RET_FWD_DISABLED = 0x5 + BPF_FIB_LKUP_RET_UNSUPP_LWT = 0x6 + BPF_FIB_LKUP_RET_NO_NEIGH = 0x7 + BPF_FIB_LKUP_RET_FRAG_NEEDED = 0x8 + BPF_FD_TYPE_RAW_TRACEPOINT = 0x0 + BPF_FD_TYPE_TRACEPOINT = 0x1 + BPF_FD_TYPE_KPROBE = 0x2 + BPF_FD_TYPE_KRETPROBE = 0x3 + BPF_FD_TYPE_UPROBE = 0x4 + BPF_FD_TYPE_URETPROBE = 0x5 +) diff --git a/vendor/golang.org/x/sys/unix/ztypes_netbsd_386.go b/vendor/golang.org/x/sys/unix/ztypes_netbsd_386.go index 2dae0c17..a2268b4f 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_netbsd_386.go +++ b/vendor/golang.org/x/sys/unix/ztypes_netbsd_386.go @@ -57,23 +57,23 @@ type Rlimit struct { type _Gid_t uint32 type Stat_t struct { - Dev uint64 - Mode uint32 - Ino uint64 - Nlink uint32 - Uid uint32 - Gid uint32 - Rdev uint64 - Atimespec Timespec - Mtimespec Timespec - Ctimespec Timespec - Birthtimespec Timespec - Size int64 - Blocks int64 - Blksize uint32 - Flags uint32 - Gen uint32 - Spare [2]uint32 + Dev uint64 + Mode uint32 + Ino uint64 + Nlink uint32 + Uid uint32 + Gid uint32 + Rdev uint64 + Atim Timespec + Mtim Timespec + Ctim Timespec + Btim Timespec + Size int64 + Blocks int64 + Blksize uint32 + Flags uint32 + Gen uint32 + Spare [2]uint32 } type Statfs_t [0]byte diff --git a/vendor/golang.org/x/sys/unix/ztypes_netbsd_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_netbsd_amd64.go index 1f0e76c0..59e1da0a 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_netbsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_netbsd_amd64.go @@ -58,26 +58,26 @@ type Rlimit struct { type _Gid_t uint32 type Stat_t struct { - Dev uint64 - Mode uint32 - Pad_cgo_0 [4]byte - Ino uint64 - Nlink uint32 - Uid uint32 - Gid uint32 - Pad_cgo_1 [4]byte - Rdev uint64 - Atimespec Timespec - Mtimespec Timespec - Ctimespec Timespec - Birthtimespec Timespec - Size int64 - Blocks int64 - Blksize uint32 - Flags uint32 - Gen uint32 - Spare [2]uint32 - Pad_cgo_2 [4]byte + Dev uint64 + Mode uint32 + _ [4]byte + Ino uint64 + Nlink uint32 + Uid uint32 + Gid uint32 + _ [4]byte + Rdev uint64 + Atim Timespec + Mtim Timespec + Ctim Timespec + Btim Timespec + Size int64 + Blocks int64 + Blksize uint32 + Flags uint32 + Gen uint32 + Spare [2]uint32 + _ [4]byte } type Statfs_t [0]byte diff --git a/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go b/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go index 53f2159c..1f1f0f38 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go +++ b/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go @@ -59,26 +59,26 @@ type Rlimit struct { type _Gid_t uint32 type Stat_t struct { - Dev uint64 - Mode uint32 - Pad_cgo_0 [4]byte - Ino uint64 - Nlink uint32 - Uid uint32 - Gid uint32 - Pad_cgo_1 [4]byte - Rdev uint64 - Atimespec Timespec - Mtimespec Timespec - Ctimespec Timespec - Birthtimespec Timespec - Size int64 - Blocks int64 - Blksize uint32 - Flags uint32 - Gen uint32 - Spare [2]uint32 - Pad_cgo_2 [4]byte + Dev uint64 + Mode uint32 + _ [4]byte + Ino uint64 + Nlink uint32 + Uid uint32 + Gid uint32 + _ [4]byte + Rdev uint64 + Atim Timespec + Mtim Timespec + Ctim Timespec + Btim Timespec + Size int64 + Blocks int64 + Blksize uint32 + Flags uint32 + Gen uint32 + Spare [2]uint32 + _ [4]byte } type Statfs_t [0]byte diff --git a/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm64.go b/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm64.go index 43da2c41..8dca204a 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm64.go @@ -58,26 +58,26 @@ type Rlimit struct { type _Gid_t uint32 type Stat_t struct { - Dev uint64 - Mode uint32 - Pad_cgo_0 [4]byte - Ino uint64 - Nlink uint32 - Uid uint32 - Gid uint32 - Pad_cgo_1 [4]byte - Rdev uint64 - Atimespec Timespec - Mtimespec Timespec - Ctimespec Timespec - Birthtimespec Timespec - Size int64 - Blocks int64 - Blksize uint32 - Flags uint32 - Gen uint32 - Spare [2]uint32 - Pad_cgo_2 [4]byte + Dev uint64 + Mode uint32 + _ [4]byte + Ino uint64 + Nlink uint32 + Uid uint32 + Gid uint32 + _ [4]byte + Rdev uint64 + Atim Timespec + Mtim Timespec + Ctim Timespec + Btim Timespec + Size int64 + Blocks int64 + Blksize uint32 + Flags uint32 + Gen uint32 + Spare [2]uint32 + _ [4]byte } type Statfs_t [0]byte diff --git a/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm64.go b/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm64.go new file mode 100644 index 00000000..fa369a32 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm64.go @@ -0,0 +1,564 @@ +// cgo -godefs -- -fsigned-char types_openbsd.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build arm64,openbsd + +package unix + +const ( + SizeofPtr = 0x8 + SizeofShort = 0x2 + SizeofInt = 0x4 + SizeofLong = 0x8 + SizeofLongLong = 0x8 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int64 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int64 +} + +type Timeval struct { + Sec int64 + Usec int64 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + 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 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Mode uint32 + Dev int32 + Ino uint64 + Nlink uint32 + Uid uint32 + Gid uint32 + Rdev int32 + Atim Timespec + Mtim Timespec + Ctim Timespec + Size int64 + Blocks int64 + Blksize int32 + Flags uint32 + Gen uint32 + _ Timespec +} + +type Statfs_t struct { + F_flags uint32 + F_bsize uint32 + F_iosize uint32 + F_blocks uint64 + F_bfree uint64 + F_bavail int64 + F_files uint64 + F_ffree uint64 + F_favail int64 + F_syncwrites uint64 + F_syncreads uint64 + F_asyncwrites uint64 + F_asyncreads uint64 + F_fsid Fsid + F_namemax uint32 + F_owner uint32 + F_ctime uint64 + F_fstypename [16]int8 + F_mntonname [90]int8 + F_mntfromname [90]int8 + F_mntfromspec [90]int8 + _ [2]byte + Mount_info [160]byte +} + +type Flock_t struct { + Start int64 + Len int64 + Pid int32 + Type int16 + Whence int16 +} + +type Dirent struct { + Fileno uint64 + Off int64 + Reclen uint16 + Type uint8 + Namlen uint8 + _ [4]uint8 + Name [256]int8 +} + +type Fsid struct { + Val [2]int32 +} + +const ( + PathMax = 0x400 +) + +type RawSockaddrInet4 struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type RawSockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Len uint8 + Family uint8 + Path [104]int8 +} + +type RawSockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [24]int8 +} + +type RawSockaddr struct { + Len uint8 + Family uint8 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [92]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint64 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Iov *Iovec + Iovlen uint32 + Control *byte + Controllen uint32 + Flags int32 +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Filt [8]uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x6c + SizeofSockaddrUnix = 0x6a + SizeofSockaddrDatalink = 0x20 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x30 + SizeofCmsghdr = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 +) + +const ( + PTRACE_TRACEME = 0x0 + PTRACE_CONT = 0x7 + PTRACE_KILL = 0x8 +) + +type Kevent_t struct { + Ident uint64 + Filter int16 + Flags uint16 + Fflags uint32 + Data int64 + Udata *byte +} + +type FdSet struct { + Bits [32]uint32 +} + +const ( + SizeofIfMsghdr = 0xa8 + SizeofIfData = 0x90 + SizeofIfaMsghdr = 0x18 + SizeofIfAnnounceMsghdr = 0x1a + SizeofRtMsghdr = 0x60 + SizeofRtMetrics = 0x38 +) + +type IfMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Hdrlen uint16 + Index uint16 + Tableid uint16 + Pad1 uint8 + Pad2 uint8 + Addrs int32 + Flags int32 + Xflags int32 + Data IfData +} + +type IfData struct { + Type uint8 + Addrlen uint8 + Hdrlen uint8 + Link_state uint8 + Mtu uint32 + Metric uint32 + Rdomain uint32 + Baudrate uint64 + Ipackets uint64 + Ierrors uint64 + Opackets uint64 + Oerrors uint64 + Collisions uint64 + Ibytes uint64 + Obytes uint64 + Imcasts uint64 + Omcasts uint64 + Iqdrops uint64 + Oqdrops uint64 + Noproto uint64 + Capabilities uint32 + Lastchange Timeval +} + +type IfaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Hdrlen uint16 + Index uint16 + Tableid uint16 + Pad1 uint8 + Pad2 uint8 + Addrs int32 + Flags int32 + Metric int32 +} + +type IfAnnounceMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Hdrlen uint16 + Index uint16 + What uint16 + Name [16]int8 +} + +type RtMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Hdrlen uint16 + Index uint16 + Tableid uint16 + Priority uint8 + Mpls uint8 + Addrs int32 + Flags int32 + Fmask int32 + Pid int32 + Seq int32 + Errno int32 + Inits uint32 + Rmx RtMetrics +} + +type RtMetrics struct { + Pksent uint64 + Expire int64 + Locks uint32 + Mtu uint32 + Refcnt uint32 + Hopcount uint32 + Recvpipe uint32 + Sendpipe uint32 + Ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Pad uint32 +} + +type Mclpool struct{} + +const ( + SizeofBpfVersion = 0x4 + SizeofBpfStat = 0x8 + SizeofBpfProgram = 0x10 + SizeofBpfInsn = 0x8 + SizeofBpfHdr = 0x14 +) + +type BpfVersion struct { + Major uint16 + Minor uint16 +} + +type BpfStat struct { + Recv uint32 + Drop uint32 +} + +type BpfProgram struct { + Len uint32 + Insns *BpfInsn +} + +type BpfInsn struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type BpfHdr struct { + Tstamp BpfTimeval + Caplen uint32 + Datalen uint32 + Hdrlen uint16 + _ [2]byte +} + +type BpfTimeval struct { + Sec uint32 + Usec uint32 +} + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Cc [20]uint8 + Ispeed int32 + Ospeed int32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +const ( + AT_FDCWD = -0x64 + AT_SYMLINK_NOFOLLOW = 0x2 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLERR = 0x8 + POLLHUP = 0x10 + POLLIN = 0x1 + POLLNVAL = 0x20 + POLLOUT = 0x4 + POLLPRI = 0x2 + POLLRDBAND = 0x80 + POLLRDNORM = 0x40 + POLLWRBAND = 0x100 + POLLWRNORM = 0x4 +) + +type Sigset_t uint32 + +type Utsname struct { + Sysname [256]byte + Nodename [256]byte + Release [256]byte + Version [256]byte + Machine [256]byte +} + +const SizeofUvmexp = 0x158 + +type Uvmexp struct { + Pagesize int32 + Pagemask int32 + Pageshift int32 + Npages int32 + Free int32 + Active int32 + Inactive int32 + Paging int32 + Wired int32 + Zeropages int32 + Reserve_pagedaemon int32 + Reserve_kernel int32 + Unused01 int32 + Vnodepages int32 + Vtextpages int32 + Freemin int32 + Freetarg int32 + Inactarg int32 + Wiredmax int32 + Anonmin int32 + Vtextmin int32 + Vnodemin int32 + Anonminpct int32 + Vtextminpct int32 + Vnodeminpct int32 + Nswapdev int32 + Swpages int32 + Swpginuse int32 + Swpgonly int32 + Nswget int32 + Nanon int32 + Unused05 int32 + Unused06 int32 + Faults int32 + Traps int32 + Intrs int32 + Swtch int32 + Softs int32 + Syscalls int32 + Pageins int32 + Unused07 int32 + Unused08 int32 + Pgswapin int32 + Pgswapout int32 + Forks int32 + Forks_ppwait int32 + Forks_sharevm int32 + Pga_zerohit int32 + Pga_zeromiss int32 + Unused09 int32 + Fltnoram int32 + Fltnoanon int32 + Fltnoamap int32 + Fltpgwait int32 + Fltpgrele int32 + Fltrelck int32 + Fltrelckok int32 + Fltanget int32 + Fltanretry int32 + Fltamcopy int32 + Fltnamap int32 + Fltnomap int32 + Fltlget int32 + Fltget int32 + Flt_anon int32 + Flt_acow int32 + Flt_obj int32 + Flt_prcopy int32 + Flt_przero int32 + Pdwoke int32 + Pdrevs int32 + Pdswout int32 + Pdfreed int32 + Pdscans int32 + Pdanscan int32 + Pdobscan int32 + Pdreact int32 + Pdbusy int32 + Pdpageouts int32 + Pdpending int32 + Pddeact int32 + Unused11 int32 + Unused12 int32 + Unused13 int32 + Fpswtch int32 + Kmapent int32 +} + +const SizeofClockinfo = 0x14 + +type Clockinfo struct { + Hz int32 + Tick int32 + Tickadj int32 + Stathz int32 + Profhz int32 +} diff --git a/vendor/golang.org/x/sys/windows/env_windows.go b/vendor/golang.org/x/sys/windows/env_windows.go index bdc71e24..f482a9fa 100644 --- a/vendor/golang.org/x/sys/windows/env_windows.go +++ b/vendor/golang.org/x/sys/windows/env_windows.go @@ -6,7 +6,11 @@ package windows -import "syscall" +import ( + "syscall" + "unicode/utf16" + "unsafe" +) func Getenv(key string) (value string, found bool) { return syscall.Getenv(key) @@ -24,6 +28,34 @@ func Environ() []string { return syscall.Environ() } +// Returns a default environment associated with the token, rather than the current +// process. If inheritExisting is true, then this environment also inherits the +// environment of the current process. +func (token Token) Environ(inheritExisting bool) (env []string, err error) { + var block *uint16 + err = CreateEnvironmentBlock(&block, token, inheritExisting) + if err != nil { + return nil, err + } + defer DestroyEnvironmentBlock(block) + blockp := uintptr(unsafe.Pointer(block)) + for { + entry := (*[(1 << 30) - 1]uint16)(unsafe.Pointer(blockp))[:] + for i, v := range entry { + if v == 0 { + entry = entry[:i] + break + } + } + if len(entry) == 0 { + break + } + env = append(env, string(utf16.Decode(entry))) + blockp += 2 * (uintptr(len(entry)) + 1) + } + return env, nil +} + func Unsetenv(key string) error { return syscall.Unsetenv(key) } diff --git a/vendor/golang.org/x/sys/windows/mkerrors.bash b/vendor/golang.org/x/sys/windows/mkerrors.bash index a70b24f3..2163843a 100755 --- a/vendor/golang.org/x/sys/windows/mkerrors.bash +++ b/vendor/golang.org/x/sys/windows/mkerrors.bash @@ -7,14 +7,13 @@ set -e shopt -s nullglob -[[ $# -eq 1 ]] || { echo "Usage: $0 OUTPUT_FILE.go" >&2; exit 1; } winerror="$(printf '%s\n' "/mnt/c/Program Files (x86)/Windows Kits/"/*/Include/*/shared/winerror.h | sort -Vr | head -n 1)" [[ -n $winerror ]] || { echo "Unable to find winerror.h" >&2; exit 1; } declare -A errors { - echo "// Code generated by 'go generate'; DO NOT EDIT." + echo "// Code generated by 'mkerrors.bash'; DO NOT EDIT." echo echo "package windows" echo "import \"syscall\"" @@ -61,4 +60,4 @@ declare -A errors done < "$winerror" echo ")" -} | gofmt > "$1" +} | gofmt > "zerrors_windows.go" diff --git a/vendor/golang.org/x/sys/windows/mkknownfolderids.bash b/vendor/golang.org/x/sys/windows/mkknownfolderids.bash new file mode 100755 index 00000000..ab8924e9 --- /dev/null +++ b/vendor/golang.org/x/sys/windows/mkknownfolderids.bash @@ -0,0 +1,27 @@ +#!/bin/bash + +# Copyright 2019 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. + +set -e +shopt -s nullglob + +knownfolders="$(printf '%s\n' "/mnt/c/Program Files (x86)/Windows Kits/"/*/Include/*/um/KnownFolders.h | sort -Vr | head -n 1)" +[[ -n $knownfolders ]] || { echo "Unable to find KnownFolders.h" >&2; exit 1; } + +{ + echo "// Code generated by 'mkknownfolderids.bash'; DO NOT EDIT." + echo + echo "package windows" + echo "type KNOWNFOLDERID GUID" + echo "var (" + while read -r line; do + [[ $line =~ DEFINE_KNOWN_FOLDER\((FOLDERID_[^,]+),[\t\ ]*(0x[^,]+),[\t\ ]*(0x[^,]+),[\t\ ]*(0x[^,]+),[\t\ ]*(0x[^,]+),[\t\ ]*(0x[^,]+),[\t\ ]*(0x[^,]+),[\t\ ]*(0x[^,]+),[\t\ ]*(0x[^,]+),[\t\ ]*(0x[^,]+),[\t\ ]*(0x[^,]+),[\t\ ]*(0x[^,]+)\) ]] || continue + printf "%s = &KNOWNFOLDERID{0x%08x, 0x%04x, 0x%04x, [8]byte{0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x}}\n" \ + "${BASH_REMATCH[1]}" $(( "${BASH_REMATCH[2]}" )) $(( "${BASH_REMATCH[3]}" )) $(( "${BASH_REMATCH[4]}" )) \ + $(( "${BASH_REMATCH[5]}" )) $(( "${BASH_REMATCH[6]}" )) $(( "${BASH_REMATCH[7]}" )) $(( "${BASH_REMATCH[8]}" )) \ + $(( "${BASH_REMATCH[9]}" )) $(( "${BASH_REMATCH[10]}" )) $(( "${BASH_REMATCH[11]}" )) $(( "${BASH_REMATCH[12]}" )) + done < "$knownfolders" + echo ")" +} | gofmt > "zknownfolderids_windows.go" diff --git a/vendor/golang.org/x/sys/windows/mksyscall.go b/vendor/golang.org/x/sys/windows/mksyscall.go index fb7db0ef..62770572 100644 --- a/vendor/golang.org/x/sys/windows/mksyscall.go +++ b/vendor/golang.org/x/sys/windows/mksyscall.go @@ -2,6 +2,8 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +// +build generate + package windows //go:generate go run $GOROOT/src/syscall/mksyscall_windows.go -output zsyscall_windows.go eventlog.go service.go syscall_windows.go security_windows.go diff --git a/vendor/golang.org/x/sys/windows/security_windows.go b/vendor/golang.org/x/sys/windows/security_windows.go index da06406c..61b49647 100644 --- a/vendor/golang.org/x/sys/windows/security_windows.go +++ b/vendor/golang.org/x/sys/windows/security_windows.go @@ -170,15 +170,20 @@ const ( //sys CopySid(destSidLen uint32, destSid *SID, srcSid *SID) (err error) = advapi32.CopySid //sys AllocateAndInitializeSid(identAuth *SidIdentifierAuthority, subAuth byte, subAuth0 uint32, subAuth1 uint32, subAuth2 uint32, subAuth3 uint32, subAuth4 uint32, subAuth5 uint32, subAuth6 uint32, subAuth7 uint32, sid **SID) (err error) = advapi32.AllocateAndInitializeSid //sys createWellKnownSid(sidType WELL_KNOWN_SID_TYPE, domainSid *SID, sid *SID, sizeSid *uint32) (err error) = advapi32.CreateWellKnownSid +//sys isWellKnownSid(sid *SID, sidType WELL_KNOWN_SID_TYPE) (isWellKnown bool) = advapi32.IsWellKnownSid //sys FreeSid(sid *SID) (err error) [failretval!=0] = advapi32.FreeSid //sys EqualSid(sid1 *SID, sid2 *SID) (isEqual bool) = advapi32.EqualSid +//sys getSidIdentifierAuthority(sid *SID) (authority *SidIdentifierAuthority) = advapi32.GetSidIdentifierAuthority +//sys getSidSubAuthorityCount(sid *SID) (count *uint8) = advapi32.GetSidSubAuthorityCount +//sys getSidSubAuthority(sid *SID, index uint32) (subAuthority *uint32) = advapi32.GetSidSubAuthority +//sys isValidSid(sid *SID) (isValid bool) = advapi32.IsValidSid // The security identifier (SID) structure is a variable-length // structure used to uniquely identify users or groups. type SID struct{} // StringToSid converts a string-format security identifier -// sid into a valid, functional sid. +// SID into a valid, functional SID. func StringToSid(s string) (*SID, error) { var sid *SID p, e := UTF16PtrFromString(s) @@ -193,7 +198,7 @@ func StringToSid(s string) (*SID, error) { return sid.Copy() } -// LookupSID retrieves a security identifier sid for the account +// LookupSID retrieves a security identifier SID for the account // and the name of the domain on which the account was found. // System specify target computer to search. func LookupSID(system, account string) (sid *SID, domain string, accType uint32, err error) { @@ -230,7 +235,7 @@ func LookupSID(system, account string) (sid *SID, domain string, accType uint32, } } -// String converts sid to a string format +// String converts SID to a string format // suitable for display, storage, or transmission. func (sid *SID) String() (string, error) { var s *uint16 @@ -242,12 +247,12 @@ func (sid *SID) String() (string, error) { return UTF16ToString((*[256]uint16)(unsafe.Pointer(s))[:]), nil } -// Len returns the length, in bytes, of a valid security identifier sid. +// Len returns the length, in bytes, of a valid security identifier SID. func (sid *SID) Len() int { return int(GetLengthSid(sid)) } -// Copy creates a duplicate of security identifier sid. +// Copy creates a duplicate of security identifier SID. func (sid *SID) Copy() (*SID, error) { b := make([]byte, sid.Len()) sid2 := (*SID)(unsafe.Pointer(&b[0])) @@ -258,8 +263,42 @@ func (sid *SID) Copy() (*SID, error) { return sid2, nil } -// LookupAccount retrieves the name of the account for this sid -// and the name of the first domain on which this sid is found. +// IdentifierAuthority returns the identifier authority of the SID. +func (sid *SID) IdentifierAuthority() SidIdentifierAuthority { + return *getSidIdentifierAuthority(sid) +} + +// SubAuthorityCount returns the number of sub-authorities in the SID. +func (sid *SID) SubAuthorityCount() uint8 { + return *getSidSubAuthorityCount(sid) +} + +// SubAuthority returns the sub-authority of the SID as specified by +// the index, which must be less than sid.SubAuthorityCount(). +func (sid *SID) SubAuthority(idx uint32) uint32 { + if idx >= uint32(sid.SubAuthorityCount()) { + panic("sub-authority index out of range") + } + return *getSidSubAuthority(sid, idx) +} + +// IsValid returns whether the SID has a valid revision and length. +func (sid *SID) IsValid() bool { + return isValidSid(sid) +} + +// Equals compares two SIDs for equality. +func (sid *SID) Equals(sid2 *SID) bool { + return EqualSid(sid, sid2) +} + +// IsWellKnown determines whether the SID matches the well-known sidType. +func (sid *SID) IsWellKnown(sidType WELL_KNOWN_SID_TYPE) bool { + return isWellKnownSid(sid, sidType) +} + +// LookupAccount retrieves the name of the account for this SID +// and the name of the first domain on which this SID is found. // System specify target computer to search for. func (sid *SID) LookupAccount(system string) (account, domain string, accType uint32, err error) { var sys *uint16 @@ -287,7 +326,7 @@ func (sid *SID) LookupAccount(system string) (account, domain string, accType ui } } -// Various types of pre-specified sids that can be synthesized at runtime. +// Various types of pre-specified SIDs that can be synthesized and compared at runtime. type WELL_KNOWN_SID_TYPE uint32 const ( @@ -413,13 +452,13 @@ const ( WinBuiltinDeviceOwnersSid = 119 ) -// Creates a sid for a well-known predefined alias, generally using the constants of the form +// Creates a SID for a well-known predefined alias, generally using the constants of the form // Win*Sid, for the local machine. func CreateWellKnownSid(sidType WELL_KNOWN_SID_TYPE) (*SID, error) { return CreateWellKnownDomainSid(sidType, nil) } -// Creates a sid for a well-known predefined alias, generally using the constants of the form +// Creates a SID for a well-known predefined alias, generally using the constants of the form // Win*Sid, for the domain specified by the domainSid parameter. func CreateWellKnownDomainSid(sidType WELL_KNOWN_SID_TYPE, domainSid *SID) (*SID, error) { n := uint32(50) @@ -502,6 +541,53 @@ const ( MaxTokenInfoClass ) +// Group attributes inside of Tokengroups.Groups[i].Attributes +const ( + SE_GROUP_MANDATORY = 0x00000001 + SE_GROUP_ENABLED_BY_DEFAULT = 0x00000002 + SE_GROUP_ENABLED = 0x00000004 + SE_GROUP_OWNER = 0x00000008 + SE_GROUP_USE_FOR_DENY_ONLY = 0x00000010 + SE_GROUP_INTEGRITY = 0x00000020 + SE_GROUP_INTEGRITY_ENABLED = 0x00000040 + SE_GROUP_LOGON_ID = 0xC0000000 + SE_GROUP_RESOURCE = 0x20000000 + SE_GROUP_VALID_ATTRIBUTES = SE_GROUP_MANDATORY | SE_GROUP_ENABLED_BY_DEFAULT | SE_GROUP_ENABLED | SE_GROUP_OWNER | SE_GROUP_USE_FOR_DENY_ONLY | SE_GROUP_LOGON_ID | SE_GROUP_RESOURCE | SE_GROUP_INTEGRITY | SE_GROUP_INTEGRITY_ENABLED +) + +// Privilege attributes +const ( + SE_PRIVILEGE_ENABLED_BY_DEFAULT = 0x00000001 + SE_PRIVILEGE_ENABLED = 0x00000002 + SE_PRIVILEGE_REMOVED = 0x00000004 + SE_PRIVILEGE_USED_FOR_ACCESS = 0x80000000 + SE_PRIVILEGE_VALID_ATTRIBUTES = SE_PRIVILEGE_ENABLED_BY_DEFAULT | SE_PRIVILEGE_ENABLED | SE_PRIVILEGE_REMOVED | SE_PRIVILEGE_USED_FOR_ACCESS +) + +// Token types +const ( + TokenPrimary = 1 + TokenImpersonation = 2 +) + +// Impersonation levels +const ( + SecurityAnonymous = 0 + SecurityIdentification = 1 + SecurityImpersonation = 2 + SecurityDelegation = 3 +) + +type LUID struct { + LowPart uint32 + HighPart int32 +} + +type LUIDAndAttributes struct { + Luid LUID + Attributes uint32 +} + type SIDAndAttributes struct { Sid *SID Attributes uint32 @@ -517,13 +603,45 @@ type Tokenprimarygroup struct { type Tokengroups struct { GroupCount uint32 - Groups [1]SIDAndAttributes + Groups [1]SIDAndAttributes // Use AllGroups() for iterating. +} + +// AllGroups returns a slice that can be used to iterate over the groups in g. +func (g *Tokengroups) AllGroups() []SIDAndAttributes { + return (*[(1 << 28) - 1]SIDAndAttributes)(unsafe.Pointer(&g.Groups[0]))[:g.GroupCount:g.GroupCount] +} + +type Tokenprivileges struct { + PrivilegeCount uint32 + Privileges [1]LUIDAndAttributes // Use AllPrivileges() for iterating. +} + +// AllPrivileges returns a slice that can be used to iterate over the privileges in p. +func (p *Tokenprivileges) AllPrivileges() []LUIDAndAttributes { + return (*[(1 << 27) - 1]LUIDAndAttributes)(unsafe.Pointer(&p.Privileges[0]))[:p.PrivilegeCount:p.PrivilegeCount] +} + +type Tokenmandatorylabel struct { + Label SIDAndAttributes +} + +func (tml *Tokenmandatorylabel) Size() uint32 { + return uint32(unsafe.Sizeof(Tokenmandatorylabel{})) + GetLengthSid(tml.Label.Sid) } // Authorization Functions -//sys checkTokenMembership(tokenHandle Token, sidToCheck *SID, isMember *int32) (err error) = advapi32.CheckTokenMembership -//sys OpenProcessToken(h Handle, access uint32, token *Token) (err error) = advapi32.OpenProcessToken -//sys GetTokenInformation(t Token, infoClass uint32, info *byte, infoLen uint32, returnedLen *uint32) (err error) = advapi32.GetTokenInformation +//sys checkTokenMembership(tokenHandle Token, sidToCheck *SID, isMember *int32) (err error) = advapi32.CheckTokenMembership +//sys OpenProcessToken(process Handle, access uint32, token *Token) (err error) = advapi32.OpenProcessToken +//sys OpenThreadToken(thread Handle, access uint32, openAsSelf bool, token *Token) (err error) = advapi32.OpenThreadToken +//sys ImpersonateSelf(impersonationlevel uint32) (err error) = advapi32.ImpersonateSelf +//sys RevertToSelf() (err error) = advapi32.RevertToSelf +//sys SetThreadToken(thread *Handle, token Token) (err error) = advapi32.SetThreadToken +//sys LookupPrivilegeValue(systemname *uint16, name *uint16, luid *LUID) (err error) = advapi32.LookupPrivilegeValueW +//sys AdjustTokenPrivileges(token Token, disableAllPrivileges bool, newstate *Tokenprivileges, buflen uint32, prevstate *Tokenprivileges, returnlen *uint32) (err error) = advapi32.AdjustTokenPrivileges +//sys AdjustTokenGroups(token Token, resetToDefault bool, newstate *Tokengroups, buflen uint32, prevstate *Tokengroups, returnlen *uint32) (err error) = advapi32.AdjustTokenGroups +//sys GetTokenInformation(token Token, infoClass uint32, info *byte, infoLen uint32, returnedLen *uint32) (err error) = advapi32.GetTokenInformation +//sys SetTokenInformation(token Token, infoClass uint32, info *byte, infoLen uint32) (err error) = advapi32.SetTokenInformation +//sys DuplicateTokenEx(existingToken Token, desiredAccess uint32, tokenAttributes *SecurityAttributes, impersonationLevel uint32, tokenType uint32, newToken *Token) (err error) = advapi32.DuplicateTokenEx //sys GetUserProfileDirectory(t Token, dir *uint16, dirLen *uint32) (err error) = userenv.GetUserProfileDirectoryW //sys getSystemDirectory(dir *uint16, dirLen uint32) (len uint32, err error) = kernel32.GetSystemDirectoryW @@ -537,7 +655,9 @@ type Tokengroups struct { type Token Handle // OpenCurrentProcessToken opens the access token -// associated with current process. +// associated with current process. It is a real +// token that needs to be closed, unlike +// GetCurrentProcessToken. func OpenCurrentProcessToken() (Token, error) { p, e := GetCurrentProcess() if e != nil { @@ -551,6 +671,27 @@ func OpenCurrentProcessToken() (Token, error) { return t, nil } +// GetCurrentProcessToken returns the access token associated with +// the current process. It is a pseudo token that does not need +// to be closed. +func GetCurrentProcessToken() Token { + return Token(^uintptr(4 - 1)) +} + +// GetCurrentThreadToken return the access token associated with +// the current thread. It is a pseudo token that does not need +// to be closed. +func GetCurrentThreadToken() Token { + return Token(^uintptr(5 - 1)) +} + +// GetCurrentThreadEffectiveToken returns the effective access token +// associated with the current thread. It is a pseudo token that does +// not need to be closed. +func GetCurrentThreadEffectiveToken() Token { + return Token(^uintptr(6 - 1)) +} + // Close releases access to access token. func (t Token) Close() error { return CloseHandle(Handle(t)) @@ -622,6 +763,28 @@ func (t Token) GetUserProfileDirectory() (string, error) { } } +// IsElevated returns whether the current token is elevated from a UAC perspective. +func (token Token) IsElevated() bool { + var isElevated uint32 + var outLen uint32 + err := GetTokenInformation(token, TokenElevation, (*byte)(unsafe.Pointer(&isElevated)), uint32(unsafe.Sizeof(isElevated)), &outLen) + if err != nil { + return false + } + return outLen == uint32(unsafe.Sizeof(isElevated)) && isElevated != 0 +} + +// GetLinkedToken returns the linked token, which may be an elevated UAC token. +func (token Token) GetLinkedToken() (Token, error) { + var linkedToken Token + var outLen uint32 + err := GetTokenInformation(token, TokenLinkedToken, (*byte)(unsafe.Pointer(&linkedToken)), uint32(unsafe.Sizeof(linkedToken)), &outLen) + if err != nil { + return Token(0), err + } + return linkedToken, nil +} + // GetSystemDirectory retrieves path to current location of the system // directory, which is typically, though not always, C:\Windows\System32. func GetSystemDirectory() (string, error) { @@ -647,3 +810,45 @@ func (t Token) IsMember(sid *SID) (bool, error) { } return b != 0, nil } + +const ( + WTS_CONSOLE_CONNECT = 0x1 + WTS_CONSOLE_DISCONNECT = 0x2 + WTS_REMOTE_CONNECT = 0x3 + WTS_REMOTE_DISCONNECT = 0x4 + WTS_SESSION_LOGON = 0x5 + WTS_SESSION_LOGOFF = 0x6 + WTS_SESSION_LOCK = 0x7 + WTS_SESSION_UNLOCK = 0x8 + WTS_SESSION_REMOTE_CONTROL = 0x9 + WTS_SESSION_CREATE = 0xa + WTS_SESSION_TERMINATE = 0xb +) + +const ( + WTSActive = 0 + WTSConnected = 1 + WTSConnectQuery = 2 + WTSShadow = 3 + WTSDisconnected = 4 + WTSIdle = 5 + WTSListen = 6 + WTSReset = 7 + WTSDown = 8 + WTSInit = 9 +) + +type WTSSESSION_NOTIFICATION struct { + Size uint32 + SessionID uint32 +} + +type WTS_SESSION_INFO struct { + SessionID uint32 + WindowStationName *uint16 + State uint32 +} + +//sys WTSQueryUserToken(session uint32, token *Token) (err error) = wtsapi32.WTSQueryUserToken +//sys WTSEnumerateSessions(handle Handle, reserved uint32, version uint32, sessions **WTS_SESSION_INFO, count *uint32) (err error) = wtsapi32.WTSEnumerateSessionsW +//sys WTSFreeMemory(ptr uintptr) = wtsapi32.WTSFreeMemory diff --git a/vendor/golang.org/x/sys/windows/service.go b/vendor/golang.org/x/sys/windows/service.go index 994b1290..03383f1d 100644 --- a/vendor/golang.org/x/sys/windows/service.go +++ b/vendor/golang.org/x/sys/windows/service.go @@ -85,21 +85,47 @@ const ( SERVICE_INACTIVE = 2 SERVICE_STATE_ALL = 3 - SERVICE_QUERY_CONFIG = 1 - SERVICE_CHANGE_CONFIG = 2 - SERVICE_QUERY_STATUS = 4 - SERVICE_ENUMERATE_DEPENDENTS = 8 - SERVICE_START = 16 - SERVICE_STOP = 32 - SERVICE_PAUSE_CONTINUE = 64 - SERVICE_INTERROGATE = 128 - SERVICE_USER_DEFINED_CONTROL = 256 - SERVICE_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED | SERVICE_QUERY_CONFIG | SERVICE_CHANGE_CONFIG | SERVICE_QUERY_STATUS | SERVICE_ENUMERATE_DEPENDENTS | SERVICE_START | SERVICE_STOP | SERVICE_PAUSE_CONTINUE | SERVICE_INTERROGATE | SERVICE_USER_DEFINED_CONTROL + SERVICE_QUERY_CONFIG = 1 + SERVICE_CHANGE_CONFIG = 2 + SERVICE_QUERY_STATUS = 4 + SERVICE_ENUMERATE_DEPENDENTS = 8 + SERVICE_START = 16 + SERVICE_STOP = 32 + SERVICE_PAUSE_CONTINUE = 64 + SERVICE_INTERROGATE = 128 + SERVICE_USER_DEFINED_CONTROL = 256 + SERVICE_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED | SERVICE_QUERY_CONFIG | SERVICE_CHANGE_CONFIG | SERVICE_QUERY_STATUS | SERVICE_ENUMERATE_DEPENDENTS | SERVICE_START | SERVICE_STOP | SERVICE_PAUSE_CONTINUE | SERVICE_INTERROGATE | SERVICE_USER_DEFINED_CONTROL + SERVICE_RUNS_IN_SYSTEM_PROCESS = 1 - SERVICE_CONFIG_DESCRIPTION = 1 - SERVICE_CONFIG_FAILURE_ACTIONS = 2 + + SERVICE_CONFIG_DESCRIPTION = 1 + SERVICE_CONFIG_FAILURE_ACTIONS = 2 + SERVICE_CONFIG_DELAYED_AUTO_START_INFO = 3 + SERVICE_CONFIG_FAILURE_ACTIONS_FLAG = 4 + SERVICE_CONFIG_SERVICE_SID_INFO = 5 + SERVICE_CONFIG_REQUIRED_PRIVILEGES_INFO = 6 + SERVICE_CONFIG_PRESHUTDOWN_INFO = 7 + SERVICE_CONFIG_TRIGGER_INFO = 8 + SERVICE_CONFIG_PREFERRED_NODE = 9 + SERVICE_CONFIG_LAUNCH_PROTECTED = 12 + + SERVICE_SID_TYPE_NONE = 0 + SERVICE_SID_TYPE_UNRESTRICTED = 1 + SERVICE_SID_TYPE_RESTRICTED = 2 | SERVICE_SID_TYPE_UNRESTRICTED SC_ENUM_PROCESS_INFO = 0 + + SERVICE_NOTIFY_STATUS_CHANGE = 2 + SERVICE_NOTIFY_STOPPED = 0x00000001 + SERVICE_NOTIFY_START_PENDING = 0x00000002 + SERVICE_NOTIFY_STOP_PENDING = 0x00000004 + SERVICE_NOTIFY_RUNNING = 0x00000008 + SERVICE_NOTIFY_CONTINUE_PENDING = 0x00000010 + SERVICE_NOTIFY_PAUSE_PENDING = 0x00000020 + SERVICE_NOTIFY_PAUSED = 0x00000040 + SERVICE_NOTIFY_CREATED = 0x00000080 + SERVICE_NOTIFY_DELETED = 0x00000100 + SERVICE_NOTIFY_DELETE_PENDING = 0x00000200 ) type SERVICE_STATUS struct { @@ -151,6 +177,16 @@ type ENUM_SERVICE_STATUS_PROCESS struct { ServiceStatusProcess SERVICE_STATUS_PROCESS } +type SERVICE_NOTIFY struct { + Version uint32 + NotifyCallback uintptr + Context uintptr + NotificationStatus uint32 + ServiceStatus SERVICE_STATUS_PROCESS + NotificationTriggered uint32 + ServiceNames *uint16 +} + type SERVICE_FAILURE_ACTIONS struct { ResetPeriod uint32 RebootMsg *uint16 @@ -164,12 +200,19 @@ type SC_ACTION struct { Delay uint32 } +type QUERY_SERVICE_LOCK_STATUS struct { + IsLocked uint32 + LockOwner *uint16 + LockDuration uint32 +} + //sys CloseServiceHandle(handle Handle) (err error) = advapi32.CloseServiceHandle //sys CreateService(mgr Handle, serviceName *uint16, displayName *uint16, access uint32, srvType uint32, startType uint32, errCtl uint32, pathName *uint16, loadOrderGroup *uint16, tagId *uint32, dependencies *uint16, serviceStartName *uint16, password *uint16) (handle Handle, err error) [failretval==0] = advapi32.CreateServiceW //sys OpenService(mgr Handle, serviceName *uint16, access uint32) (handle Handle, err error) [failretval==0] = advapi32.OpenServiceW //sys DeleteService(service Handle) (err error) = advapi32.DeleteService //sys StartService(service Handle, numArgs uint32, argVectors **uint16) (err error) = advapi32.StartServiceW //sys QueryServiceStatus(service Handle, status *SERVICE_STATUS) (err error) = advapi32.QueryServiceStatus +//sys QueryServiceLockStatus(mgr Handle, lockStatus *QUERY_SERVICE_LOCK_STATUS, bufSize uint32, bytesNeeded *uint32) (err error) = advapi32.QueryServiceLockStatusW //sys ControlService(service Handle, control uint32, status *SERVICE_STATUS) (err error) = advapi32.ControlService //sys StartServiceCtrlDispatcher(serviceTable *SERVICE_TABLE_ENTRY) (err error) = advapi32.StartServiceCtrlDispatcherW //sys SetServiceStatus(service Handle, serviceStatus *SERVICE_STATUS) (err error) = advapi32.SetServiceStatus @@ -178,4 +221,5 @@ type SC_ACTION struct { //sys ChangeServiceConfig2(service Handle, infoLevel uint32, info *byte) (err error) = advapi32.ChangeServiceConfig2W //sys QueryServiceConfig2(service Handle, infoLevel uint32, buff *byte, buffSize uint32, bytesNeeded *uint32) (err error) = advapi32.QueryServiceConfig2W //sys EnumServicesStatusEx(mgr Handle, infoLevel uint32, serviceType uint32, serviceState uint32, services *byte, bufSize uint32, bytesNeeded *uint32, servicesReturned *uint32, resumeHandle *uint32, groupName *uint16) (err error) = advapi32.EnumServicesStatusExW -//sys QueryServiceStatusEx(service Handle, infoLevel uint32, buff *byte, buffSize uint32, bytesNeeded *uint32) (err error) = advapi32.QueryServiceStatusEx +//sys QueryServiceStatusEx(service Handle, infoLevel uint32, buff *byte, buffSize uint32, bytesNeeded *uint32) (err error) = advapi32.QueryServiceStatusEx +//sys NotifyServiceStatusChange(service Handle, notifyMask uint32, notifier *SERVICE_NOTIFY) (ret error) = advapi32.NotifyServiceStatusChangeW diff --git a/vendor/golang.org/x/sys/windows/syscall_windows.go b/vendor/golang.org/x/sys/windows/syscall_windows.go index 4c9bc55b..92ce02bb 100644 --- a/vendor/golang.org/x/sys/windows/syscall_windows.go +++ b/vendor/golang.org/x/sys/windows/syscall_windows.go @@ -10,6 +10,7 @@ import ( errorspkg "errors" "sync" "syscall" + "time" "unicode/utf16" "unsafe" ) @@ -55,6 +56,10 @@ const ( FILE_UNICODE_ON_DISK = 0x00000004 FILE_VOLUME_IS_COMPRESSED = 0x00008000 FILE_VOLUME_QUOTAS = 0x00000020 + + // Return values of SleepEx and other APC functions + STATUS_USER_APC = 0x000000C0 + WAIT_IO_COMPLETION = STATUS_USER_APC ) // StringToUTF16 is deprecated. Use UTF16FromString instead. @@ -134,7 +139,8 @@ func NewCallbackCDecl(fn interface{}) uintptr { //sys GetVersion() (ver uint32, err error) //sys FormatMessage(flags uint32, msgsrc uintptr, msgid uint32, langid uint32, buf []uint16, args *byte) (n uint32, err error) = FormatMessageW //sys ExitProcess(exitcode uint32) -//sys CreateFile(name *uint16, access uint32, mode uint32, sa *SecurityAttributes, createmode uint32, attrs uint32, templatefile int32) (handle Handle, err error) [failretval==InvalidHandle] = CreateFileW +//sys IsWow64Process(handle Handle, isWow64 *bool) (err error) = IsWow64Process +//sys CreateFile(name *uint16, access uint32, mode uint32, sa *SecurityAttributes, createmode uint32, attrs uint32, templatefile Handle) (handle Handle, err error) [failretval==InvalidHandle] = CreateFileW //sys ReadFile(handle Handle, buf []byte, done *uint32, overlapped *Overlapped) (err error) //sys WriteFile(handle Handle, buf []byte, done *uint32, overlapped *Overlapped) (err error) //sys GetOverlappedResult(handle Handle, overlapped *Overlapped, done *uint32, wait bool) (err error) @@ -166,11 +172,14 @@ func NewCallbackCDecl(fn interface{}) uintptr { //sys CancelIo(s Handle) (err error) //sys CancelIoEx(s Handle, o *Overlapped) (err error) //sys CreateProcess(appName *uint16, commandLine *uint16, procSecurity *SecurityAttributes, threadSecurity *SecurityAttributes, inheritHandles bool, creationFlags uint32, env *uint16, currentDir *uint16, startupInfo *StartupInfo, outProcInfo *ProcessInformation) (err error) = CreateProcessW -//sys OpenProcess(da uint32, inheritHandle bool, pid uint32) (handle Handle, err error) +//sys OpenProcess(desiredAccess uint32, inheritHandle bool, processId uint32) (handle Handle, err error) +//sys ShellExecute(hwnd Handle, verb *uint16, file *uint16, args *uint16, cwd *uint16, showCmd int32) (err error) = shell32.ShellExecuteW +//sys shGetKnownFolderPath(id *KNOWNFOLDERID, flags uint32, token Token, path **uint16) (ret error) = shell32.SHGetKnownFolderPath //sys TerminateProcess(handle Handle, exitcode uint32) (err error) //sys GetExitCodeProcess(handle Handle, exitcode *uint32) (err error) //sys GetStartupInfo(startupInfo *StartupInfo) (err error) = GetStartupInfoW //sys GetCurrentProcess() (pseudoHandle Handle, err error) +//sys GetCurrentThread() (pseudoHandle Handle, err error) //sys GetProcessTimes(handle Handle, creationTime *Filetime, exitTime *Filetime, kernelTime *Filetime, userTime *Filetime) (err error) //sys DuplicateHandle(hSourceProcessHandle Handle, hSourceHandle Handle, hTargetProcessHandle Handle, lpTargetHandle *Handle, dwDesiredAccess uint32, bInheritHandle bool, dwOptions uint32) (err error) //sys WaitForSingleObject(handle Handle, waitMilliseconds uint32) (event uint32, err error) [failretval==0xffffffff] @@ -185,6 +194,9 @@ func NewCallbackCDecl(fn interface{}) uintptr { //sys FreeEnvironmentStrings(envs *uint16) (err error) = kernel32.FreeEnvironmentStringsW //sys GetEnvironmentVariable(name *uint16, buffer *uint16, size uint32) (n uint32, err error) = kernel32.GetEnvironmentVariableW //sys SetEnvironmentVariable(name *uint16, value *uint16) (err error) = kernel32.SetEnvironmentVariableW +//sys CreateEnvironmentBlock(block **uint16, token Token, inheritExisting bool) (err error) = userenv.CreateEnvironmentBlock +//sys DestroyEnvironmentBlock(block *uint16) (err error) = userenv.DestroyEnvironmentBlock +//sys getTickCount64() (ms uint64) = kernel32.GetTickCount64 //sys SetFileTime(handle Handle, ctime *Filetime, atime *Filetime, wtime *Filetime) (err error) //sys GetFileAttributes(name *uint16) (attrs uint32, err error) [failretval==INVALID_FILE_ATTRIBUTES] = kernel32.GetFileAttributesW //sys SetFileAttributes(name *uint16, attrs uint32) (err error) = kernel32.SetFileAttributesW @@ -223,7 +235,7 @@ func NewCallbackCDecl(fn interface{}) uintptr { //sys RegQueryInfoKey(key Handle, class *uint16, classLen *uint32, reserved *uint32, subkeysLen *uint32, maxSubkeyLen *uint32, maxClassLen *uint32, valuesLen *uint32, maxValueNameLen *uint32, maxValueLen *uint32, saLen *uint32, lastWriteTime *Filetime) (regerrno error) = advapi32.RegQueryInfoKeyW //sys RegEnumKeyEx(key Handle, index uint32, name *uint16, nameLen *uint32, reserved *uint32, class *uint16, classLen *uint32, lastWriteTime *Filetime) (regerrno error) = advapi32.RegEnumKeyExW //sys RegQueryValueEx(key Handle, name *uint16, reserved *uint32, valtype *uint32, buf *byte, buflen *uint32) (regerrno error) = advapi32.RegQueryValueExW -//sys getCurrentProcessId() (pid uint32) = kernel32.GetCurrentProcessId +//sys GetCurrentProcessId() (pid uint32) = kernel32.GetCurrentProcessId //sys GetConsoleMode(console Handle, mode *uint32) (err error) = kernel32.GetConsoleMode //sys SetConsoleMode(console Handle, mode uint32) (err error) = kernel32.SetConsoleMode //sys GetConsoleScreenBufferInfo(console Handle, info *ConsoleScreenBufferInfo) (err error) = kernel32.GetConsoleScreenBufferInfo @@ -232,6 +244,8 @@ func NewCallbackCDecl(fn interface{}) uintptr { //sys CreateToolhelp32Snapshot(flags uint32, processId uint32) (handle Handle, err error) [failretval==InvalidHandle] = kernel32.CreateToolhelp32Snapshot //sys Process32First(snapshot Handle, procEntry *ProcessEntry32) (err error) = kernel32.Process32FirstW //sys Process32Next(snapshot Handle, procEntry *ProcessEntry32) (err error) = kernel32.Process32NextW +//sys Thread32First(snapshot Handle, threadEntry *ThreadEntry32) (err error) +//sys Thread32Next(snapshot Handle, threadEntry *ThreadEntry32) (err error) //sys DeviceIoControl(handle Handle, ioControlCode uint32, inBuffer *byte, inBufferSize uint32, outBuffer *byte, outBufferSize uint32, bytesReturned *uint32, overlapped *Overlapped) (err error) // This function returns 1 byte BOOLEAN rather than the 4 byte BOOL. //sys CreateSymbolicLink(symlinkfilename *uint16, targetfilename *uint16, flags uint32) (err error) [failretval&0xff==0] = CreateSymbolicLinkW @@ -243,6 +257,18 @@ func NewCallbackCDecl(fn interface{}) uintptr { //sys SetEvent(event Handle) (err error) = kernel32.SetEvent //sys ResetEvent(event Handle) (err error) = kernel32.ResetEvent //sys PulseEvent(event Handle) (err error) = kernel32.PulseEvent +//sys SleepEx(milliseconds uint32, alertable bool) (ret uint32) = kernel32.SleepEx +//sys CreateJobObject(jobAttr *SecurityAttributes, name *uint16) (handle Handle, err error) = kernel32.CreateJobObjectW +//sys AssignProcessToJobObject(job Handle, process Handle) (err error) = kernel32.AssignProcessToJobObject +//sys TerminateJobObject(job Handle, exitCode uint32) (err error) = kernel32.TerminateJobObject +//sys SetErrorMode(mode uint32) (ret uint32) = kernel32.SetErrorMode +//sys ResumeThread(thread Handle) (ret uint32, err error) [failretval==0xffffffff] = kernel32.ResumeThread +//sys SetPriorityClass(process Handle, priorityClass uint32) (err error) = kernel32.SetPriorityClass +//sys GetPriorityClass(process Handle) (ret uint32, err error) = kernel32.GetPriorityClass +//sys SetInformationJobObject(job Handle, JobObjectInformationClass uint32, JobObjectInformation uintptr, JobObjectInformationLength uint32) (ret int, err error) +//sys GenerateConsoleCtrlEvent(ctrlEvent uint32, processGroupID uint32) (err error) +//sys GetProcessId(process Handle) (id uint32, err error) +//sys OpenThread(desiredAccess uint32, inheritHandle bool, threadId uint32) (handle Handle, err error) // Volume Management Functions //sys DefineDosDevice(flags uint32, deviceName *uint16, targetPath *uint16) (err error) = DefineDosDeviceW @@ -264,6 +290,11 @@ func NewCallbackCDecl(fn interface{}) uintptr { //sys QueryDosDevice(deviceName *uint16, targetPath *uint16, max uint32) (n uint32, err error) [failretval==0] = QueryDosDeviceW //sys SetVolumeLabel(rootPathName *uint16, volumeName *uint16) (err error) = SetVolumeLabelW //sys SetVolumeMountPoint(volumeMountPoint *uint16, volumeName *uint16) (err error) = SetVolumeMountPointW +//sys MessageBox(hwnd Handle, text *uint16, caption *uint16, boxtype uint32) (ret int32, err error) [failretval==0] = user32.MessageBoxW +//sys clsidFromString(lpsz *uint16, pclsid *GUID) (ret error) = ole32.CLSIDFromString +//sys stringFromGUID2(rguid *GUID, lpsz *uint16, cchMax int32) (chars int32) = ole32.StringFromGUID2 +//sys coCreateGuid(pguid *GUID) (ret error) = ole32.CoCreateGuid +//sys coTaskMemFree(address unsafe.Pointer) = ole32.CoTaskMemFree // syscall interface implementation for other packages @@ -478,6 +509,10 @@ func ComputerName() (name string, err error) { return string(utf16.Decode(b[0:n])), nil } +func DurationSinceBoot() time.Duration { + return time.Duration(getTickCount64()) * time.Millisecond +} + func Ftruncate(fd Handle, length int64) (err error) { curoffset, e := Seek(fd, 0, 1) if e != nil { @@ -561,9 +596,6 @@ func Fsync(fd Handle) (err error) { } func Chmod(path string, mode uint32) (err error) { - if mode == 0 { - return syscall.EINVAL - } p, e := UTF16PtrFromString(path) if e != nil { return e @@ -1090,7 +1122,7 @@ func SetsockoptIPv6Mreq(fd Handle, level, opt int, mreq *IPv6Mreq) (err error) { return syscall.EWINDOWS } -func Getpid() (pid int) { return int(getCurrentProcessId()) } +func Getpid() (pid int) { return int(GetCurrentProcessId()) } func FindFirstFile(name *uint16, data *Win32finddata) (handle Handle, err error) { // NOTE(rsc): The Win32finddata struct is wrong for the system call: @@ -1218,3 +1250,57 @@ func Readlink(path string, buf []byte) (n int, err error) { return n, nil } + +// GUIDFromString parses a string in the form of +// "{XXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" into a GUID. +func GUIDFromString(str string) (GUID, error) { + guid := GUID{} + str16, err := syscall.UTF16PtrFromString(str) + if err != nil { + return guid, err + } + err = clsidFromString(str16, &guid) + if err != nil { + return guid, err + } + return guid, nil +} + +// GenerateGUID creates a new random GUID. +func GenerateGUID() (GUID, error) { + guid := GUID{} + err := coCreateGuid(&guid) + if err != nil { + return guid, err + } + return guid, nil +} + +// String returns the canonical string form of the GUID, +// in the form of "{XXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}". +func (guid GUID) String() string { + var str [100]uint16 + chars := stringFromGUID2(&guid, &str[0], int32(len(str))) + if chars <= 1 { + return "" + } + return string(utf16.Decode(str[:chars-1])) +} + +// KnownFolderPath returns a well-known folder path for the current user, specified by one of +// the FOLDERID_ constants, and chosen and optionally created based on a KF_ flag. +func KnownFolderPath(folderID *KNOWNFOLDERID, flags uint32) (string, error) { + return Token(0).KnownFolderPath(folderID, flags) +} + +// KnownFolderPath returns a well-known folder path for the user token, specified by one of +// the FOLDERID_ constants, and chosen and optionally created based on a KF_ flag. +func (t Token) KnownFolderPath(folderID *KNOWNFOLDERID, flags uint32) (string, error) { + var p *uint16 + err := shGetKnownFolderPath(folderID, flags, t, &p) + if err != nil { + return "", err + } + defer coTaskMemFree(unsafe.Pointer(p)) + return UTF16ToString((*[(1 << 30) - 1]uint16)(unsafe.Pointer(p))[:]), nil +} diff --git a/vendor/golang.org/x/sys/windows/types_windows.go b/vendor/golang.org/x/sys/windows/types_windows.go index ee279368..1cba11ed 100644 --- a/vendor/golang.org/x/sys/windows/types_windows.go +++ b/vendor/golang.org/x/sys/windows/types_windows.go @@ -4,7 +4,11 @@ package windows -import "syscall" +import ( + "net" + "syscall" + "unsafe" +) const ( // Invented values to support what package os expects. @@ -154,9 +158,39 @@ const ( WAIT_OBJECT_0 = 0x00000000 WAIT_FAILED = 0xFFFFFFFF - PROCESS_TERMINATE = 1 - PROCESS_QUERY_INFORMATION = 0x00000400 - SYNCHRONIZE = 0x00100000 + // Standard access rights. + DELETE = 0x00010000 + READ_CONTROL = 0x00020000 + SYNCHRONIZE = 0x00100000 + WRITE_DAC = 0x00040000 + WRITE_OWNER = 0x00080000 + + // Access rights for process. + PROCESS_CREATE_PROCESS = 0x0080 + PROCESS_CREATE_THREAD = 0x0002 + PROCESS_DUP_HANDLE = 0x0040 + PROCESS_QUERY_INFORMATION = 0x0400 + PROCESS_QUERY_LIMITED_INFORMATION = 0x1000 + PROCESS_SET_INFORMATION = 0x0200 + PROCESS_SET_QUOTA = 0x0100 + PROCESS_SUSPEND_RESUME = 0x0800 + PROCESS_TERMINATE = 0x0001 + PROCESS_VM_OPERATION = 0x0008 + PROCESS_VM_READ = 0x0010 + PROCESS_VM_WRITE = 0x0020 + + // Access rights for thread. + THREAD_DIRECT_IMPERSONATION = 0x0200 + THREAD_GET_CONTEXT = 0x0008 + THREAD_IMPERSONATE = 0x0100 + THREAD_QUERY_INFORMATION = 0x0040 + THREAD_QUERY_LIMITED_INFORMATION = 0x0800 + THREAD_SET_CONTEXT = 0x0010 + THREAD_SET_INFORMATION = 0x0020 + THREAD_SET_LIMITED_INFORMATION = 0x0400 + THREAD_SET_THREAD_TOKEN = 0x0080 + THREAD_SUSPEND_RESUME = 0x0002 + THREAD_TERMINATE = 0x0001 FILE_MAP_COPY = 0x01 FILE_MAP_WRITE = 0x02 @@ -396,6 +430,26 @@ const ( SECURITY_FLAG_IGNORE_CERT_DATE_INVALID = 0x00002000 ) +const ( + // flags for SetErrorMode + SEM_FAILCRITICALERRORS = 0x0001 + SEM_NOALIGNMENTFAULTEXCEPT = 0x0004 + SEM_NOGPFAULTERRORBOX = 0x0002 + SEM_NOOPENFILEERRORBOX = 0x8000 +) + +const ( + // Priority class. + ABOVE_NORMAL_PRIORITY_CLASS = 0x00008000 + BELOW_NORMAL_PRIORITY_CLASS = 0x00004000 + HIGH_PRIORITY_CLASS = 0x00000080 + IDLE_PRIORITY_CLASS = 0x00000040 + NORMAL_PRIORITY_CLASS = 0x00000020 + PROCESS_MODE_BACKGROUND_BEGIN = 0x00100000 + PROCESS_MODE_BACKGROUND_END = 0x00200000 + REALTIME_PRIORITY_CLASS = 0x00000100 +) + var ( OID_PKIX_KP_SERVER_AUTH = []byte("1.3.6.1.5.5.7.3.1\x00") OID_SERVER_GATED_CRYPTO = []byte("1.3.6.1.4.1.311.10.3.3\x00") @@ -605,6 +659,16 @@ type ProcessEntry32 struct { ExeFile [MAX_PATH]uint16 } +type ThreadEntry32 struct { + Size uint32 + Usage uint32 + ThreadID uint32 + OwnerProcessID uint32 + BasePri int32 + DeltaPri int32 + Flags uint32 +} + type Systemtime struct { Year uint16 Month uint16 @@ -1286,6 +1350,41 @@ const ( ComputerNameMax = 8 ) +// For MessageBox() +const ( + MB_OK = 0x00000000 + MB_OKCANCEL = 0x00000001 + MB_ABORTRETRYIGNORE = 0x00000002 + MB_YESNOCANCEL = 0x00000003 + MB_YESNO = 0x00000004 + MB_RETRYCANCEL = 0x00000005 + MB_CANCELTRYCONTINUE = 0x00000006 + MB_ICONHAND = 0x00000010 + MB_ICONQUESTION = 0x00000020 + MB_ICONEXCLAMATION = 0x00000030 + MB_ICONASTERISK = 0x00000040 + MB_USERICON = 0x00000080 + MB_ICONWARNING = MB_ICONEXCLAMATION + MB_ICONERROR = MB_ICONHAND + MB_ICONINFORMATION = MB_ICONASTERISK + MB_ICONSTOP = MB_ICONHAND + MB_DEFBUTTON1 = 0x00000000 + MB_DEFBUTTON2 = 0x00000100 + MB_DEFBUTTON3 = 0x00000200 + MB_DEFBUTTON4 = 0x00000300 + MB_APPLMODAL = 0x00000000 + MB_SYSTEMMODAL = 0x00001000 + MB_TASKMODAL = 0x00002000 + MB_HELP = 0x00004000 + MB_NOFOCUS = 0x00008000 + MB_SETFOREGROUND = 0x00010000 + MB_DEFAULT_DESKTOP_ONLY = 0x00020000 + MB_TOPMOST = 0x00040000 + MB_RIGHT = 0x00080000 + MB_RTLREADING = 0x00100000 + MB_SERVICE_NOTIFICATION = 0x00200000 +) + const ( MOVEFILE_REPLACE_EXISTING = 0x1 MOVEFILE_COPY_ALLOWED = 0x2 @@ -1314,6 +1413,16 @@ type SocketAddress struct { SockaddrLength int32 } +// IP returns an IPv4 or IPv6 address, or nil if the underlying SocketAddress is neither. +func (addr *SocketAddress) IP() net.IP { + if uintptr(addr.SockaddrLength) >= unsafe.Sizeof(RawSockaddrInet4{}) && addr.Sockaddr.Addr.Family == AF_INET { + return (*RawSockaddrInet4)(unsafe.Pointer(addr.Sockaddr)).Addr[:] + } else if uintptr(addr.SockaddrLength) >= unsafe.Sizeof(RawSockaddrInet6{}) && addr.Sockaddr.Addr.Family == AF_INET6 { + return (*RawSockaddrInet6)(unsafe.Pointer(addr.Sockaddr)).Addr[:] + } + return nil +} + type IpAdapterUnicastAddress struct { Length uint32 Flags uint32 @@ -1439,3 +1548,104 @@ type ConsoleScreenBufferInfo struct { } const UNIX_PATH_MAX = 108 // defined in afunix.h + +const ( + // flags for JOBOBJECT_BASIC_LIMIT_INFORMATION.LimitFlags + JOB_OBJECT_LIMIT_ACTIVE_PROCESS = 0x00000008 + JOB_OBJECT_LIMIT_AFFINITY = 0x00000010 + JOB_OBJECT_LIMIT_BREAKAWAY_OK = 0x00000800 + JOB_OBJECT_LIMIT_DIE_ON_UNHANDLED_EXCEPTION = 0x00000400 + JOB_OBJECT_LIMIT_JOB_MEMORY = 0x00000200 + JOB_OBJECT_LIMIT_JOB_TIME = 0x00000004 + JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE = 0x00002000 + JOB_OBJECT_LIMIT_PRESERVE_JOB_TIME = 0x00000040 + JOB_OBJECT_LIMIT_PRIORITY_CLASS = 0x00000020 + JOB_OBJECT_LIMIT_PROCESS_MEMORY = 0x00000100 + JOB_OBJECT_LIMIT_PROCESS_TIME = 0x00000002 + JOB_OBJECT_LIMIT_SCHEDULING_CLASS = 0x00000080 + JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK = 0x00001000 + JOB_OBJECT_LIMIT_SUBSET_AFFINITY = 0x00004000 + JOB_OBJECT_LIMIT_WORKINGSET = 0x00000001 +) + +type JOBOBJECT_BASIC_LIMIT_INFORMATION struct { + PerProcessUserTimeLimit int64 + PerJobUserTimeLimit int64 + LimitFlags uint32 + MinimumWorkingSetSize uintptr + MaximumWorkingSetSize uintptr + ActiveProcessLimit uint32 + Affinity uintptr + PriorityClass uint32 + SchedulingClass uint32 +} + +type IO_COUNTERS struct { + ReadOperationCount uint64 + WriteOperationCount uint64 + OtherOperationCount uint64 + ReadTransferCount uint64 + WriteTransferCount uint64 + OtherTransferCount uint64 +} + +type JOBOBJECT_EXTENDED_LIMIT_INFORMATION struct { + BasicLimitInformation JOBOBJECT_BASIC_LIMIT_INFORMATION + IoInfo IO_COUNTERS + ProcessMemoryLimit uintptr + JobMemoryLimit uintptr + PeakProcessMemoryUsed uintptr + PeakJobMemoryUsed uintptr +} + +const ( + // UIRestrictionsClass + JOB_OBJECT_UILIMIT_DESKTOP = 0x00000040 + JOB_OBJECT_UILIMIT_DISPLAYSETTINGS = 0x00000010 + JOB_OBJECT_UILIMIT_EXITWINDOWS = 0x00000080 + JOB_OBJECT_UILIMIT_GLOBALATOMS = 0x00000020 + JOB_OBJECT_UILIMIT_HANDLES = 0x00000001 + JOB_OBJECT_UILIMIT_READCLIPBOARD = 0x00000002 + JOB_OBJECT_UILIMIT_SYSTEMPARAMETERS = 0x00000008 + JOB_OBJECT_UILIMIT_WRITECLIPBOARD = 0x00000004 +) + +type JOBOBJECT_BASIC_UI_RESTRICTIONS struct { + UIRestrictionsClass uint32 +} + +const ( + // JobObjectInformationClass + JobObjectAssociateCompletionPortInformation = 7 + JobObjectBasicLimitInformation = 2 + JobObjectBasicUIRestrictions = 4 + JobObjectCpuRateControlInformation = 15 + JobObjectEndOfJobTimeInformation = 6 + JobObjectExtendedLimitInformation = 9 + JobObjectGroupInformation = 11 + JobObjectGroupInformationEx = 14 + JobObjectLimitViolationInformation2 = 35 + JobObjectNetRateControlInformation = 32 + JobObjectNotificationLimitInformation = 12 + JobObjectNotificationLimitInformation2 = 34 + JobObjectSecurityLimitInformation = 5 +) + +const ( + KF_FLAG_DEFAULT = 0x00000000 + KF_FLAG_FORCE_APP_DATA_REDIRECTION = 0x00080000 + KF_FLAG_RETURN_FILTER_REDIRECTION_TARGET = 0x00040000 + KF_FLAG_FORCE_PACKAGE_REDIRECTION = 0x00020000 + KF_FLAG_NO_PACKAGE_REDIRECTION = 0x00010000 + KF_FLAG_FORCE_APPCONTAINER_REDIRECTION = 0x00020000 + KF_FLAG_NO_APPCONTAINER_REDIRECTION = 0x00010000 + KF_FLAG_CREATE = 0x00008000 + KF_FLAG_DONT_VERIFY = 0x00004000 + KF_FLAG_DONT_UNEXPAND = 0x00002000 + KF_FLAG_NO_ALIAS = 0x00001000 + KF_FLAG_INIT = 0x00000800 + KF_FLAG_DEFAULT_PATH = 0x00000400 + KF_FLAG_NOT_PARENT_RELATIVE = 0x00000200 + KF_FLAG_SIMPLE_IDLIST = 0x00000100 + KF_FLAG_ALIAS_ONLY = 0x80000000 +) diff --git a/vendor/golang.org/x/sys/windows/zerrors_windows.go b/vendor/golang.org/x/sys/windows/zerrors_windows.go index 2b4cea5b..f0212003 100644 --- a/vendor/golang.org/x/sys/windows/zerrors_windows.go +++ b/vendor/golang.org/x/sys/windows/zerrors_windows.go @@ -1,4 +1,4 @@ -// Code generated by 'go generate'; DO NOT EDIT. +// Code generated by 'mkerrors.bash'; DO NOT EDIT. package windows diff --git a/vendor/golang.org/x/sys/windows/zknownfolderids_windows.go b/vendor/golang.org/x/sys/windows/zknownfolderids_windows.go new file mode 100644 index 00000000..6048ac67 --- /dev/null +++ b/vendor/golang.org/x/sys/windows/zknownfolderids_windows.go @@ -0,0 +1,149 @@ +// Code generated by 'mkknownfolderids.bash'; DO NOT EDIT. + +package windows + +type KNOWNFOLDERID GUID + +var ( + FOLDERID_NetworkFolder = &KNOWNFOLDERID{0xd20beec4, 0x5ca8, 0x4905, [8]byte{0xae, 0x3b, 0xbf, 0x25, 0x1e, 0xa0, 0x9b, 0x53}} + FOLDERID_ComputerFolder = &KNOWNFOLDERID{0x0ac0837c, 0xbbf8, 0x452a, [8]byte{0x85, 0x0d, 0x79, 0xd0, 0x8e, 0x66, 0x7c, 0xa7}} + FOLDERID_InternetFolder = &KNOWNFOLDERID{0x4d9f7874, 0x4e0c, 0x4904, [8]byte{0x96, 0x7b, 0x40, 0xb0, 0xd2, 0x0c, 0x3e, 0x4b}} + FOLDERID_ControlPanelFolder = &KNOWNFOLDERID{0x82a74aeb, 0xaeb4, 0x465c, [8]byte{0xa0, 0x14, 0xd0, 0x97, 0xee, 0x34, 0x6d, 0x63}} + FOLDERID_PrintersFolder = &KNOWNFOLDERID{0x76fc4e2d, 0xd6ad, 0x4519, [8]byte{0xa6, 0x63, 0x37, 0xbd, 0x56, 0x06, 0x81, 0x85}} + FOLDERID_SyncManagerFolder = &KNOWNFOLDERID{0x43668bf8, 0xc14e, 0x49b2, [8]byte{0x97, 0xc9, 0x74, 0x77, 0x84, 0xd7, 0x84, 0xb7}} + FOLDERID_SyncSetupFolder = &KNOWNFOLDERID{0x0f214138, 0xb1d3, 0x4a90, [8]byte{0xbb, 0xa9, 0x27, 0xcb, 0xc0, 0xc5, 0x38, 0x9a}} + FOLDERID_ConflictFolder = &KNOWNFOLDERID{0x4bfefb45, 0x347d, 0x4006, [8]byte{0xa5, 0xbe, 0xac, 0x0c, 0xb0, 0x56, 0x71, 0x92}} + FOLDERID_SyncResultsFolder = &KNOWNFOLDERID{0x289a9a43, 0xbe44, 0x4057, [8]byte{0xa4, 0x1b, 0x58, 0x7a, 0x76, 0xd7, 0xe7, 0xf9}} + FOLDERID_RecycleBinFolder = &KNOWNFOLDERID{0xb7534046, 0x3ecb, 0x4c18, [8]byte{0xbe, 0x4e, 0x64, 0xcd, 0x4c, 0xb7, 0xd6, 0xac}} + FOLDERID_ConnectionsFolder = &KNOWNFOLDERID{0x6f0cd92b, 0x2e97, 0x45d1, [8]byte{0x88, 0xff, 0xb0, 0xd1, 0x86, 0xb8, 0xde, 0xdd}} + FOLDERID_Fonts = &KNOWNFOLDERID{0xfd228cb7, 0xae11, 0x4ae3, [8]byte{0x86, 0x4c, 0x16, 0xf3, 0x91, 0x0a, 0xb8, 0xfe}} + FOLDERID_Desktop = &KNOWNFOLDERID{0xb4bfcc3a, 0xdb2c, 0x424c, [8]byte{0xb0, 0x29, 0x7f, 0xe9, 0x9a, 0x87, 0xc6, 0x41}} + FOLDERID_Startup = &KNOWNFOLDERID{0xb97d20bb, 0xf46a, 0x4c97, [8]byte{0xba, 0x10, 0x5e, 0x36, 0x08, 0x43, 0x08, 0x54}} + FOLDERID_Programs = &KNOWNFOLDERID{0xa77f5d77, 0x2e2b, 0x44c3, [8]byte{0xa6, 0xa2, 0xab, 0xa6, 0x01, 0x05, 0x4a, 0x51}} + FOLDERID_StartMenu = &KNOWNFOLDERID{0x625b53c3, 0xab48, 0x4ec1, [8]byte{0xba, 0x1f, 0xa1, 0xef, 0x41, 0x46, 0xfc, 0x19}} + FOLDERID_Recent = &KNOWNFOLDERID{0xae50c081, 0xebd2, 0x438a, [8]byte{0x86, 0x55, 0x8a, 0x09, 0x2e, 0x34, 0x98, 0x7a}} + FOLDERID_SendTo = &KNOWNFOLDERID{0x8983036c, 0x27c0, 0x404b, [8]byte{0x8f, 0x08, 0x10, 0x2d, 0x10, 0xdc, 0xfd, 0x74}} + FOLDERID_Documents = &KNOWNFOLDERID{0xfdd39ad0, 0x238f, 0x46af, [8]byte{0xad, 0xb4, 0x6c, 0x85, 0x48, 0x03, 0x69, 0xc7}} + FOLDERID_Favorites = &KNOWNFOLDERID{0x1777f761, 0x68ad, 0x4d8a, [8]byte{0x87, 0xbd, 0x30, 0xb7, 0x59, 0xfa, 0x33, 0xdd}} + FOLDERID_NetHood = &KNOWNFOLDERID{0xc5abbf53, 0xe17f, 0x4121, [8]byte{0x89, 0x00, 0x86, 0x62, 0x6f, 0xc2, 0xc9, 0x73}} + FOLDERID_PrintHood = &KNOWNFOLDERID{0x9274bd8d, 0xcfd1, 0x41c3, [8]byte{0xb3, 0x5e, 0xb1, 0x3f, 0x55, 0xa7, 0x58, 0xf4}} + FOLDERID_Templates = &KNOWNFOLDERID{0xa63293e8, 0x664e, 0x48db, [8]byte{0xa0, 0x79, 0xdf, 0x75, 0x9e, 0x05, 0x09, 0xf7}} + FOLDERID_CommonStartup = &KNOWNFOLDERID{0x82a5ea35, 0xd9cd, 0x47c5, [8]byte{0x96, 0x29, 0xe1, 0x5d, 0x2f, 0x71, 0x4e, 0x6e}} + FOLDERID_CommonPrograms = &KNOWNFOLDERID{0x0139d44e, 0x6afe, 0x49f2, [8]byte{0x86, 0x90, 0x3d, 0xaf, 0xca, 0xe6, 0xff, 0xb8}} + FOLDERID_CommonStartMenu = &KNOWNFOLDERID{0xa4115719, 0xd62e, 0x491d, [8]byte{0xaa, 0x7c, 0xe7, 0x4b, 0x8b, 0xe3, 0xb0, 0x67}} + FOLDERID_PublicDesktop = &KNOWNFOLDERID{0xc4aa340d, 0xf20f, 0x4863, [8]byte{0xaf, 0xef, 0xf8, 0x7e, 0xf2, 0xe6, 0xba, 0x25}} + FOLDERID_ProgramData = &KNOWNFOLDERID{0x62ab5d82, 0xfdc1, 0x4dc3, [8]byte{0xa9, 0xdd, 0x07, 0x0d, 0x1d, 0x49, 0x5d, 0x97}} + FOLDERID_CommonTemplates = &KNOWNFOLDERID{0xb94237e7, 0x57ac, 0x4347, [8]byte{0x91, 0x51, 0xb0, 0x8c, 0x6c, 0x32, 0xd1, 0xf7}} + FOLDERID_PublicDocuments = &KNOWNFOLDERID{0xed4824af, 0xdce4, 0x45a8, [8]byte{0x81, 0xe2, 0xfc, 0x79, 0x65, 0x08, 0x36, 0x34}} + FOLDERID_RoamingAppData = &KNOWNFOLDERID{0x3eb685db, 0x65f9, 0x4cf6, [8]byte{0xa0, 0x3a, 0xe3, 0xef, 0x65, 0x72, 0x9f, 0x3d}} + FOLDERID_LocalAppData = &KNOWNFOLDERID{0xf1b32785, 0x6fba, 0x4fcf, [8]byte{0x9d, 0x55, 0x7b, 0x8e, 0x7f, 0x15, 0x70, 0x91}} + FOLDERID_LocalAppDataLow = &KNOWNFOLDERID{0xa520a1a4, 0x1780, 0x4ff6, [8]byte{0xbd, 0x18, 0x16, 0x73, 0x43, 0xc5, 0xaf, 0x16}} + FOLDERID_InternetCache = &KNOWNFOLDERID{0x352481e8, 0x33be, 0x4251, [8]byte{0xba, 0x85, 0x60, 0x07, 0xca, 0xed, 0xcf, 0x9d}} + FOLDERID_Cookies = &KNOWNFOLDERID{0x2b0f765d, 0xc0e9, 0x4171, [8]byte{0x90, 0x8e, 0x08, 0xa6, 0x11, 0xb8, 0x4f, 0xf6}} + FOLDERID_History = &KNOWNFOLDERID{0xd9dc8a3b, 0xb784, 0x432e, [8]byte{0xa7, 0x81, 0x5a, 0x11, 0x30, 0xa7, 0x59, 0x63}} + FOLDERID_System = &KNOWNFOLDERID{0x1ac14e77, 0x02e7, 0x4e5d, [8]byte{0xb7, 0x44, 0x2e, 0xb1, 0xae, 0x51, 0x98, 0xb7}} + FOLDERID_SystemX86 = &KNOWNFOLDERID{0xd65231b0, 0xb2f1, 0x4857, [8]byte{0xa4, 0xce, 0xa8, 0xe7, 0xc6, 0xea, 0x7d, 0x27}} + FOLDERID_Windows = &KNOWNFOLDERID{0xf38bf404, 0x1d43, 0x42f2, [8]byte{0x93, 0x05, 0x67, 0xde, 0x0b, 0x28, 0xfc, 0x23}} + FOLDERID_Profile = &KNOWNFOLDERID{0x5e6c858f, 0x0e22, 0x4760, [8]byte{0x9a, 0xfe, 0xea, 0x33, 0x17, 0xb6, 0x71, 0x73}} + FOLDERID_Pictures = &KNOWNFOLDERID{0x33e28130, 0x4e1e, 0x4676, [8]byte{0x83, 0x5a, 0x98, 0x39, 0x5c, 0x3b, 0xc3, 0xbb}} + FOLDERID_ProgramFilesX86 = &KNOWNFOLDERID{0x7c5a40ef, 0xa0fb, 0x4bfc, [8]byte{0x87, 0x4a, 0xc0, 0xf2, 0xe0, 0xb9, 0xfa, 0x8e}} + FOLDERID_ProgramFilesCommonX86 = &KNOWNFOLDERID{0xde974d24, 0xd9c6, 0x4d3e, [8]byte{0xbf, 0x91, 0xf4, 0x45, 0x51, 0x20, 0xb9, 0x17}} + FOLDERID_ProgramFilesX64 = &KNOWNFOLDERID{0x6d809377, 0x6af0, 0x444b, [8]byte{0x89, 0x57, 0xa3, 0x77, 0x3f, 0x02, 0x20, 0x0e}} + FOLDERID_ProgramFilesCommonX64 = &KNOWNFOLDERID{0x6365d5a7, 0x0f0d, 0x45e5, [8]byte{0x87, 0xf6, 0x0d, 0xa5, 0x6b, 0x6a, 0x4f, 0x7d}} + FOLDERID_ProgramFiles = &KNOWNFOLDERID{0x905e63b6, 0xc1bf, 0x494e, [8]byte{0xb2, 0x9c, 0x65, 0xb7, 0x32, 0xd3, 0xd2, 0x1a}} + FOLDERID_ProgramFilesCommon = &KNOWNFOLDERID{0xf7f1ed05, 0x9f6d, 0x47a2, [8]byte{0xaa, 0xae, 0x29, 0xd3, 0x17, 0xc6, 0xf0, 0x66}} + FOLDERID_UserProgramFiles = &KNOWNFOLDERID{0x5cd7aee2, 0x2219, 0x4a67, [8]byte{0xb8, 0x5d, 0x6c, 0x9c, 0xe1, 0x56, 0x60, 0xcb}} + FOLDERID_UserProgramFilesCommon = &KNOWNFOLDERID{0xbcbd3057, 0xca5c, 0x4622, [8]byte{0xb4, 0x2d, 0xbc, 0x56, 0xdb, 0x0a, 0xe5, 0x16}} + FOLDERID_AdminTools = &KNOWNFOLDERID{0x724ef170, 0xa42d, 0x4fef, [8]byte{0x9f, 0x26, 0xb6, 0x0e, 0x84, 0x6f, 0xba, 0x4f}} + FOLDERID_CommonAdminTools = &KNOWNFOLDERID{0xd0384e7d, 0xbac3, 0x4797, [8]byte{0x8f, 0x14, 0xcb, 0xa2, 0x29, 0xb3, 0x92, 0xb5}} + FOLDERID_Music = &KNOWNFOLDERID{0x4bd8d571, 0x6d19, 0x48d3, [8]byte{0xbe, 0x97, 0x42, 0x22, 0x20, 0x08, 0x0e, 0x43}} + FOLDERID_Videos = &KNOWNFOLDERID{0x18989b1d, 0x99b5, 0x455b, [8]byte{0x84, 0x1c, 0xab, 0x7c, 0x74, 0xe4, 0xdd, 0xfc}} + FOLDERID_Ringtones = &KNOWNFOLDERID{0xc870044b, 0xf49e, 0x4126, [8]byte{0xa9, 0xc3, 0xb5, 0x2a, 0x1f, 0xf4, 0x11, 0xe8}} + FOLDERID_PublicPictures = &KNOWNFOLDERID{0xb6ebfb86, 0x6907, 0x413c, [8]byte{0x9a, 0xf7, 0x4f, 0xc2, 0xab, 0xf0, 0x7c, 0xc5}} + FOLDERID_PublicMusic = &KNOWNFOLDERID{0x3214fab5, 0x9757, 0x4298, [8]byte{0xbb, 0x61, 0x92, 0xa9, 0xde, 0xaa, 0x44, 0xff}} + FOLDERID_PublicVideos = &KNOWNFOLDERID{0x2400183a, 0x6185, 0x49fb, [8]byte{0xa2, 0xd8, 0x4a, 0x39, 0x2a, 0x60, 0x2b, 0xa3}} + FOLDERID_PublicRingtones = &KNOWNFOLDERID{0xe555ab60, 0x153b, 0x4d17, [8]byte{0x9f, 0x04, 0xa5, 0xfe, 0x99, 0xfc, 0x15, 0xec}} + FOLDERID_ResourceDir = &KNOWNFOLDERID{0x8ad10c31, 0x2adb, 0x4296, [8]byte{0xa8, 0xf7, 0xe4, 0x70, 0x12, 0x32, 0xc9, 0x72}} + FOLDERID_LocalizedResourcesDir = &KNOWNFOLDERID{0x2a00375e, 0x224c, 0x49de, [8]byte{0xb8, 0xd1, 0x44, 0x0d, 0xf7, 0xef, 0x3d, 0xdc}} + FOLDERID_CommonOEMLinks = &KNOWNFOLDERID{0xc1bae2d0, 0x10df, 0x4334, [8]byte{0xbe, 0xdd, 0x7a, 0xa2, 0x0b, 0x22, 0x7a, 0x9d}} + FOLDERID_CDBurning = &KNOWNFOLDERID{0x9e52ab10, 0xf80d, 0x49df, [8]byte{0xac, 0xb8, 0x43, 0x30, 0xf5, 0x68, 0x78, 0x55}} + FOLDERID_UserProfiles = &KNOWNFOLDERID{0x0762d272, 0xc50a, 0x4bb0, [8]byte{0xa3, 0x82, 0x69, 0x7d, 0xcd, 0x72, 0x9b, 0x80}} + FOLDERID_Playlists = &KNOWNFOLDERID{0xde92c1c7, 0x837f, 0x4f69, [8]byte{0xa3, 0xbb, 0x86, 0xe6, 0x31, 0x20, 0x4a, 0x23}} + FOLDERID_SamplePlaylists = &KNOWNFOLDERID{0x15ca69b3, 0x30ee, 0x49c1, [8]byte{0xac, 0xe1, 0x6b, 0x5e, 0xc3, 0x72, 0xaf, 0xb5}} + FOLDERID_SampleMusic = &KNOWNFOLDERID{0xb250c668, 0xf57d, 0x4ee1, [8]byte{0xa6, 0x3c, 0x29, 0x0e, 0xe7, 0xd1, 0xaa, 0x1f}} + FOLDERID_SamplePictures = &KNOWNFOLDERID{0xc4900540, 0x2379, 0x4c75, [8]byte{0x84, 0x4b, 0x64, 0xe6, 0xfa, 0xf8, 0x71, 0x6b}} + FOLDERID_SampleVideos = &KNOWNFOLDERID{0x859ead94, 0x2e85, 0x48ad, [8]byte{0xa7, 0x1a, 0x09, 0x69, 0xcb, 0x56, 0xa6, 0xcd}} + FOLDERID_PhotoAlbums = &KNOWNFOLDERID{0x69d2cf90, 0xfc33, 0x4fb7, [8]byte{0x9a, 0x0c, 0xeb, 0xb0, 0xf0, 0xfc, 0xb4, 0x3c}} + FOLDERID_Public = &KNOWNFOLDERID{0xdfdf76a2, 0xc82a, 0x4d63, [8]byte{0x90, 0x6a, 0x56, 0x44, 0xac, 0x45, 0x73, 0x85}} + FOLDERID_ChangeRemovePrograms = &KNOWNFOLDERID{0xdf7266ac, 0x9274, 0x4867, [8]byte{0x8d, 0x55, 0x3b, 0xd6, 0x61, 0xde, 0x87, 0x2d}} + FOLDERID_AppUpdates = &KNOWNFOLDERID{0xa305ce99, 0xf527, 0x492b, [8]byte{0x8b, 0x1a, 0x7e, 0x76, 0xfa, 0x98, 0xd6, 0xe4}} + FOLDERID_AddNewPrograms = &KNOWNFOLDERID{0xde61d971, 0x5ebc, 0x4f02, [8]byte{0xa3, 0xa9, 0x6c, 0x82, 0x89, 0x5e, 0x5c, 0x04}} + FOLDERID_Downloads = &KNOWNFOLDERID{0x374de290, 0x123f, 0x4565, [8]byte{0x91, 0x64, 0x39, 0xc4, 0x92, 0x5e, 0x46, 0x7b}} + FOLDERID_PublicDownloads = &KNOWNFOLDERID{0x3d644c9b, 0x1fb8, 0x4f30, [8]byte{0x9b, 0x45, 0xf6, 0x70, 0x23, 0x5f, 0x79, 0xc0}} + FOLDERID_SavedSearches = &KNOWNFOLDERID{0x7d1d3a04, 0xdebb, 0x4115, [8]byte{0x95, 0xcf, 0x2f, 0x29, 0xda, 0x29, 0x20, 0xda}} + FOLDERID_QuickLaunch = &KNOWNFOLDERID{0x52a4f021, 0x7b75, 0x48a9, [8]byte{0x9f, 0x6b, 0x4b, 0x87, 0xa2, 0x10, 0xbc, 0x8f}} + FOLDERID_Contacts = &KNOWNFOLDERID{0x56784854, 0xc6cb, 0x462b, [8]byte{0x81, 0x69, 0x88, 0xe3, 0x50, 0xac, 0xb8, 0x82}} + FOLDERID_SidebarParts = &KNOWNFOLDERID{0xa75d362e, 0x50fc, 0x4fb7, [8]byte{0xac, 0x2c, 0xa8, 0xbe, 0xaa, 0x31, 0x44, 0x93}} + FOLDERID_SidebarDefaultParts = &KNOWNFOLDERID{0x7b396e54, 0x9ec5, 0x4300, [8]byte{0xbe, 0x0a, 0x24, 0x82, 0xeb, 0xae, 0x1a, 0x26}} + FOLDERID_PublicGameTasks = &KNOWNFOLDERID{0xdebf2536, 0xe1a8, 0x4c59, [8]byte{0xb6, 0xa2, 0x41, 0x45, 0x86, 0x47, 0x6a, 0xea}} + FOLDERID_GameTasks = &KNOWNFOLDERID{0x054fae61, 0x4dd8, 0x4787, [8]byte{0x80, 0xb6, 0x09, 0x02, 0x20, 0xc4, 0xb7, 0x00}} + FOLDERID_SavedGames = &KNOWNFOLDERID{0x4c5c32ff, 0xbb9d, 0x43b0, [8]byte{0xb5, 0xb4, 0x2d, 0x72, 0xe5, 0x4e, 0xaa, 0xa4}} + FOLDERID_Games = &KNOWNFOLDERID{0xcac52c1a, 0xb53d, 0x4edc, [8]byte{0x92, 0xd7, 0x6b, 0x2e, 0x8a, 0xc1, 0x94, 0x34}} + FOLDERID_SEARCH_MAPI = &KNOWNFOLDERID{0x98ec0e18, 0x2098, 0x4d44, [8]byte{0x86, 0x44, 0x66, 0x97, 0x93, 0x15, 0xa2, 0x81}} + FOLDERID_SEARCH_CSC = &KNOWNFOLDERID{0xee32e446, 0x31ca, 0x4aba, [8]byte{0x81, 0x4f, 0xa5, 0xeb, 0xd2, 0xfd, 0x6d, 0x5e}} + FOLDERID_Links = &KNOWNFOLDERID{0xbfb9d5e0, 0xc6a9, 0x404c, [8]byte{0xb2, 0xb2, 0xae, 0x6d, 0xb6, 0xaf, 0x49, 0x68}} + FOLDERID_UsersFiles = &KNOWNFOLDERID{0xf3ce0f7c, 0x4901, 0x4acc, [8]byte{0x86, 0x48, 0xd5, 0xd4, 0x4b, 0x04, 0xef, 0x8f}} + FOLDERID_UsersLibraries = &KNOWNFOLDERID{0xa302545d, 0xdeff, 0x464b, [8]byte{0xab, 0xe8, 0x61, 0xc8, 0x64, 0x8d, 0x93, 0x9b}} + FOLDERID_SearchHome = &KNOWNFOLDERID{0x190337d1, 0xb8ca, 0x4121, [8]byte{0xa6, 0x39, 0x6d, 0x47, 0x2d, 0x16, 0x97, 0x2a}} + FOLDERID_OriginalImages = &KNOWNFOLDERID{0x2c36c0aa, 0x5812, 0x4b87, [8]byte{0xbf, 0xd0, 0x4c, 0xd0, 0xdf, 0xb1, 0x9b, 0x39}} + FOLDERID_DocumentsLibrary = &KNOWNFOLDERID{0x7b0db17d, 0x9cd2, 0x4a93, [8]byte{0x97, 0x33, 0x46, 0xcc, 0x89, 0x02, 0x2e, 0x7c}} + FOLDERID_MusicLibrary = &KNOWNFOLDERID{0x2112ab0a, 0xc86a, 0x4ffe, [8]byte{0xa3, 0x68, 0x0d, 0xe9, 0x6e, 0x47, 0x01, 0x2e}} + FOLDERID_PicturesLibrary = &KNOWNFOLDERID{0xa990ae9f, 0xa03b, 0x4e80, [8]byte{0x94, 0xbc, 0x99, 0x12, 0xd7, 0x50, 0x41, 0x04}} + FOLDERID_VideosLibrary = &KNOWNFOLDERID{0x491e922f, 0x5643, 0x4af4, [8]byte{0xa7, 0xeb, 0x4e, 0x7a, 0x13, 0x8d, 0x81, 0x74}} + FOLDERID_RecordedTVLibrary = &KNOWNFOLDERID{0x1a6fdba2, 0xf42d, 0x4358, [8]byte{0xa7, 0x98, 0xb7, 0x4d, 0x74, 0x59, 0x26, 0xc5}} + FOLDERID_HomeGroup = &KNOWNFOLDERID{0x52528a6b, 0xb9e3, 0x4add, [8]byte{0xb6, 0x0d, 0x58, 0x8c, 0x2d, 0xba, 0x84, 0x2d}} + FOLDERID_HomeGroupCurrentUser = &KNOWNFOLDERID{0x9b74b6a3, 0x0dfd, 0x4f11, [8]byte{0x9e, 0x78, 0x5f, 0x78, 0x00, 0xf2, 0xe7, 0x72}} + FOLDERID_DeviceMetadataStore = &KNOWNFOLDERID{0x5ce4a5e9, 0xe4eb, 0x479d, [8]byte{0xb8, 0x9f, 0x13, 0x0c, 0x02, 0x88, 0x61, 0x55}} + FOLDERID_Libraries = &KNOWNFOLDERID{0x1b3ea5dc, 0xb587, 0x4786, [8]byte{0xb4, 0xef, 0xbd, 0x1d, 0xc3, 0x32, 0xae, 0xae}} + FOLDERID_PublicLibraries = &KNOWNFOLDERID{0x48daf80b, 0xe6cf, 0x4f4e, [8]byte{0xb8, 0x00, 0x0e, 0x69, 0xd8, 0x4e, 0xe3, 0x84}} + FOLDERID_UserPinned = &KNOWNFOLDERID{0x9e3995ab, 0x1f9c, 0x4f13, [8]byte{0xb8, 0x27, 0x48, 0xb2, 0x4b, 0x6c, 0x71, 0x74}} + FOLDERID_ImplicitAppShortcuts = &KNOWNFOLDERID{0xbcb5256f, 0x79f6, 0x4cee, [8]byte{0xb7, 0x25, 0xdc, 0x34, 0xe4, 0x02, 0xfd, 0x46}} + FOLDERID_AccountPictures = &KNOWNFOLDERID{0x008ca0b1, 0x55b4, 0x4c56, [8]byte{0xb8, 0xa8, 0x4d, 0xe4, 0xb2, 0x99, 0xd3, 0xbe}} + FOLDERID_PublicUserTiles = &KNOWNFOLDERID{0x0482af6c, 0x08f1, 0x4c34, [8]byte{0x8c, 0x90, 0xe1, 0x7e, 0xc9, 0x8b, 0x1e, 0x17}} + FOLDERID_AppsFolder = &KNOWNFOLDERID{0x1e87508d, 0x89c2, 0x42f0, [8]byte{0x8a, 0x7e, 0x64, 0x5a, 0x0f, 0x50, 0xca, 0x58}} + FOLDERID_StartMenuAllPrograms = &KNOWNFOLDERID{0xf26305ef, 0x6948, 0x40b9, [8]byte{0xb2, 0x55, 0x81, 0x45, 0x3d, 0x09, 0xc7, 0x85}} + FOLDERID_CommonStartMenuPlaces = &KNOWNFOLDERID{0xa440879f, 0x87a0, 0x4f7d, [8]byte{0xb7, 0x00, 0x02, 0x07, 0xb9, 0x66, 0x19, 0x4a}} + FOLDERID_ApplicationShortcuts = &KNOWNFOLDERID{0xa3918781, 0xe5f2, 0x4890, [8]byte{0xb3, 0xd9, 0xa7, 0xe5, 0x43, 0x32, 0x32, 0x8c}} + FOLDERID_RoamingTiles = &KNOWNFOLDERID{0x00bcfc5a, 0xed94, 0x4e48, [8]byte{0x96, 0xa1, 0x3f, 0x62, 0x17, 0xf2, 0x19, 0x90}} + FOLDERID_RoamedTileImages = &KNOWNFOLDERID{0xaaa8d5a5, 0xf1d6, 0x4259, [8]byte{0xba, 0xa8, 0x78, 0xe7, 0xef, 0x60, 0x83, 0x5e}} + FOLDERID_Screenshots = &KNOWNFOLDERID{0xb7bede81, 0xdf94, 0x4682, [8]byte{0xa7, 0xd8, 0x57, 0xa5, 0x26, 0x20, 0xb8, 0x6f}} + FOLDERID_CameraRoll = &KNOWNFOLDERID{0xab5fb87b, 0x7ce2, 0x4f83, [8]byte{0x91, 0x5d, 0x55, 0x08, 0x46, 0xc9, 0x53, 0x7b}} + FOLDERID_SkyDrive = &KNOWNFOLDERID{0xa52bba46, 0xe9e1, 0x435f, [8]byte{0xb3, 0xd9, 0x28, 0xda, 0xa6, 0x48, 0xc0, 0xf6}} + FOLDERID_OneDrive = &KNOWNFOLDERID{0xa52bba46, 0xe9e1, 0x435f, [8]byte{0xb3, 0xd9, 0x28, 0xda, 0xa6, 0x48, 0xc0, 0xf6}} + FOLDERID_SkyDriveDocuments = &KNOWNFOLDERID{0x24d89e24, 0x2f19, 0x4534, [8]byte{0x9d, 0xde, 0x6a, 0x66, 0x71, 0xfb, 0xb8, 0xfe}} + FOLDERID_SkyDrivePictures = &KNOWNFOLDERID{0x339719b5, 0x8c47, 0x4894, [8]byte{0x94, 0xc2, 0xd8, 0xf7, 0x7a, 0xdd, 0x44, 0xa6}} + FOLDERID_SkyDriveMusic = &KNOWNFOLDERID{0xc3f2459e, 0x80d6, 0x45dc, [8]byte{0xbf, 0xef, 0x1f, 0x76, 0x9f, 0x2b, 0xe7, 0x30}} + FOLDERID_SkyDriveCameraRoll = &KNOWNFOLDERID{0x767e6811, 0x49cb, 0x4273, [8]byte{0x87, 0xc2, 0x20, 0xf3, 0x55, 0xe1, 0x08, 0x5b}} + FOLDERID_SearchHistory = &KNOWNFOLDERID{0x0d4c3db6, 0x03a3, 0x462f, [8]byte{0xa0, 0xe6, 0x08, 0x92, 0x4c, 0x41, 0xb5, 0xd4}} + FOLDERID_SearchTemplates = &KNOWNFOLDERID{0x7e636bfe, 0xdfa9, 0x4d5e, [8]byte{0xb4, 0x56, 0xd7, 0xb3, 0x98, 0x51, 0xd8, 0xa9}} + FOLDERID_CameraRollLibrary = &KNOWNFOLDERID{0x2b20df75, 0x1eda, 0x4039, [8]byte{0x80, 0x97, 0x38, 0x79, 0x82, 0x27, 0xd5, 0xb7}} + FOLDERID_SavedPictures = &KNOWNFOLDERID{0x3b193882, 0xd3ad, 0x4eab, [8]byte{0x96, 0x5a, 0x69, 0x82, 0x9d, 0x1f, 0xb5, 0x9f}} + FOLDERID_SavedPicturesLibrary = &KNOWNFOLDERID{0xe25b5812, 0xbe88, 0x4bd9, [8]byte{0x94, 0xb0, 0x29, 0x23, 0x34, 0x77, 0xb6, 0xc3}} + FOLDERID_RetailDemo = &KNOWNFOLDERID{0x12d4c69e, 0x24ad, 0x4923, [8]byte{0xbe, 0x19, 0x31, 0x32, 0x1c, 0x43, 0xa7, 0x67}} + FOLDERID_Device = &KNOWNFOLDERID{0x1c2ac1dc, 0x4358, 0x4b6c, [8]byte{0x97, 0x33, 0xaf, 0x21, 0x15, 0x65, 0x76, 0xf0}} + FOLDERID_DevelopmentFiles = &KNOWNFOLDERID{0xdbe8e08e, 0x3053, 0x4bbc, [8]byte{0xb1, 0x83, 0x2a, 0x7b, 0x2b, 0x19, 0x1e, 0x59}} + FOLDERID_Objects3D = &KNOWNFOLDERID{0x31c0dd25, 0x9439, 0x4f12, [8]byte{0xbf, 0x41, 0x7f, 0xf4, 0xed, 0xa3, 0x87, 0x22}} + FOLDERID_AppCaptures = &KNOWNFOLDERID{0xedc0fe71, 0x98d8, 0x4f4a, [8]byte{0xb9, 0x20, 0xc8, 0xdc, 0x13, 0x3c, 0xb1, 0x65}} + FOLDERID_LocalDocuments = &KNOWNFOLDERID{0xf42ee2d3, 0x909f, 0x4907, [8]byte{0x88, 0x71, 0x4c, 0x22, 0xfc, 0x0b, 0xf7, 0x56}} + FOLDERID_LocalPictures = &KNOWNFOLDERID{0x0ddd015d, 0xb06c, 0x45d5, [8]byte{0x8c, 0x4c, 0xf5, 0x97, 0x13, 0x85, 0x46, 0x39}} + FOLDERID_LocalVideos = &KNOWNFOLDERID{0x35286a68, 0x3c57, 0x41a1, [8]byte{0xbb, 0xb1, 0x0e, 0xae, 0x73, 0xd7, 0x6c, 0x95}} + FOLDERID_LocalMusic = &KNOWNFOLDERID{0xa0c69a99, 0x21c8, 0x4671, [8]byte{0x87, 0x03, 0x79, 0x34, 0x16, 0x2f, 0xcf, 0x1d}} + FOLDERID_LocalDownloads = &KNOWNFOLDERID{0x7d83ee9b, 0x2244, 0x4e70, [8]byte{0xb1, 0xf5, 0x53, 0x93, 0x04, 0x2a, 0xf1, 0xe4}} + FOLDERID_RecordedCalls = &KNOWNFOLDERID{0x2f8b40c2, 0x83ed, 0x48ee, [8]byte{0xb3, 0x83, 0xa1, 0xf1, 0x57, 0xec, 0x6f, 0x9a}} + FOLDERID_AllAppMods = &KNOWNFOLDERID{0x7ad67899, 0x66af, 0x43ba, [8]byte{0x91, 0x56, 0x6a, 0xad, 0x42, 0xe6, 0xc5, 0x96}} + FOLDERID_CurrentAppMods = &KNOWNFOLDERID{0x3db40b20, 0x2a30, 0x4dbe, [8]byte{0x91, 0x7e, 0x77, 0x1d, 0xd2, 0x1d, 0xd0, 0x99}} + FOLDERID_AppDataDesktop = &KNOWNFOLDERID{0xb2c5e279, 0x7add, 0x439f, [8]byte{0xb2, 0x8c, 0xc4, 0x1f, 0xe1, 0xbb, 0xf6, 0x72}} + FOLDERID_AppDataDocuments = &KNOWNFOLDERID{0x7be16610, 0x1f7f, 0x44ac, [8]byte{0xbf, 0xf0, 0x83, 0xe1, 0x5f, 0x2f, 0xfc, 0xa1}} + FOLDERID_AppDataFavorites = &KNOWNFOLDERID{0x7cfbefbc, 0xde1f, 0x45aa, [8]byte{0xb8, 0x43, 0xa5, 0x42, 0xac, 0x53, 0x6c, 0xc9}} + FOLDERID_AppDataProgramData = &KNOWNFOLDERID{0x559d40a3, 0xa036, 0x40fa, [8]byte{0xaf, 0x61, 0x84, 0xcb, 0x43, 0x0a, 0x4d, 0x34}} +) diff --git a/vendor/golang.org/x/sys/windows/zsyscall_windows.go b/vendor/golang.org/x/sys/windows/zsyscall_windows.go index 7060f434..e66ab049 100644 --- a/vendor/golang.org/x/sys/windows/zsyscall_windows.go +++ b/vendor/golang.org/x/sys/windows/zsyscall_windows.go @@ -38,14 +38,17 @@ var ( modadvapi32 = NewLazySystemDLL("advapi32.dll") modkernel32 = NewLazySystemDLL("kernel32.dll") modshell32 = NewLazySystemDLL("shell32.dll") + moduserenv = NewLazySystemDLL("userenv.dll") modmswsock = NewLazySystemDLL("mswsock.dll") modcrypt32 = NewLazySystemDLL("crypt32.dll") + moduser32 = NewLazySystemDLL("user32.dll") + modole32 = NewLazySystemDLL("ole32.dll") modws2_32 = NewLazySystemDLL("ws2_32.dll") moddnsapi = NewLazySystemDLL("dnsapi.dll") modiphlpapi = NewLazySystemDLL("iphlpapi.dll") modsecur32 = NewLazySystemDLL("secur32.dll") modnetapi32 = NewLazySystemDLL("netapi32.dll") - moduserenv = NewLazySystemDLL("userenv.dll") + modwtsapi32 = NewLazySystemDLL("wtsapi32.dll") procRegisterEventSourceW = modadvapi32.NewProc("RegisterEventSourceW") procDeregisterEventSource = modadvapi32.NewProc("DeregisterEventSource") @@ -57,6 +60,7 @@ var ( procDeleteService = modadvapi32.NewProc("DeleteService") procStartServiceW = modadvapi32.NewProc("StartServiceW") procQueryServiceStatus = modadvapi32.NewProc("QueryServiceStatus") + procQueryServiceLockStatusW = modadvapi32.NewProc("QueryServiceLockStatusW") procControlService = modadvapi32.NewProc("ControlService") procStartServiceCtrlDispatcherW = modadvapi32.NewProc("StartServiceCtrlDispatcherW") procSetServiceStatus = modadvapi32.NewProc("SetServiceStatus") @@ -66,6 +70,7 @@ var ( procQueryServiceConfig2W = modadvapi32.NewProc("QueryServiceConfig2W") procEnumServicesStatusExW = modadvapi32.NewProc("EnumServicesStatusExW") procQueryServiceStatusEx = modadvapi32.NewProc("QueryServiceStatusEx") + procNotifyServiceStatusChangeW = modadvapi32.NewProc("NotifyServiceStatusChangeW") procGetLastError = modkernel32.NewProc("GetLastError") procLoadLibraryW = modkernel32.NewProc("LoadLibraryW") procLoadLibraryExW = modkernel32.NewProc("LoadLibraryExW") @@ -74,6 +79,7 @@ var ( procGetVersion = modkernel32.NewProc("GetVersion") procFormatMessageW = modkernel32.NewProc("FormatMessageW") procExitProcess = modkernel32.NewProc("ExitProcess") + procIsWow64Process = modkernel32.NewProc("IsWow64Process") procCreateFileW = modkernel32.NewProc("CreateFileW") procReadFile = modkernel32.NewProc("ReadFile") procWriteFile = modkernel32.NewProc("WriteFile") @@ -107,10 +113,13 @@ var ( procCancelIoEx = modkernel32.NewProc("CancelIoEx") procCreateProcessW = modkernel32.NewProc("CreateProcessW") procOpenProcess = modkernel32.NewProc("OpenProcess") + procShellExecuteW = modshell32.NewProc("ShellExecuteW") + procSHGetKnownFolderPath = modshell32.NewProc("SHGetKnownFolderPath") procTerminateProcess = modkernel32.NewProc("TerminateProcess") procGetExitCodeProcess = modkernel32.NewProc("GetExitCodeProcess") procGetStartupInfoW = modkernel32.NewProc("GetStartupInfoW") procGetCurrentProcess = modkernel32.NewProc("GetCurrentProcess") + procGetCurrentThread = modkernel32.NewProc("GetCurrentThread") procGetProcessTimes = modkernel32.NewProc("GetProcessTimes") procDuplicateHandle = modkernel32.NewProc("DuplicateHandle") procWaitForSingleObject = modkernel32.NewProc("WaitForSingleObject") @@ -125,6 +134,9 @@ var ( procFreeEnvironmentStringsW = modkernel32.NewProc("FreeEnvironmentStringsW") procGetEnvironmentVariableW = modkernel32.NewProc("GetEnvironmentVariableW") procSetEnvironmentVariableW = modkernel32.NewProc("SetEnvironmentVariableW") + procCreateEnvironmentBlock = moduserenv.NewProc("CreateEnvironmentBlock") + procDestroyEnvironmentBlock = moduserenv.NewProc("DestroyEnvironmentBlock") + procGetTickCount64 = modkernel32.NewProc("GetTickCount64") procSetFileTime = modkernel32.NewProc("SetFileTime") procGetFileAttributesW = modkernel32.NewProc("GetFileAttributesW") procSetFileAttributesW = modkernel32.NewProc("SetFileAttributesW") @@ -172,6 +184,8 @@ var ( procCreateToolhelp32Snapshot = modkernel32.NewProc("CreateToolhelp32Snapshot") procProcess32FirstW = modkernel32.NewProc("Process32FirstW") procProcess32NextW = modkernel32.NewProc("Process32NextW") + procThread32First = modkernel32.NewProc("Thread32First") + procThread32Next = modkernel32.NewProc("Thread32Next") procDeviceIoControl = modkernel32.NewProc("DeviceIoControl") procCreateSymbolicLinkW = modkernel32.NewProc("CreateSymbolicLinkW") procCreateHardLinkW = modkernel32.NewProc("CreateHardLinkW") @@ -182,6 +196,18 @@ var ( procSetEvent = modkernel32.NewProc("SetEvent") procResetEvent = modkernel32.NewProc("ResetEvent") procPulseEvent = modkernel32.NewProc("PulseEvent") + procSleepEx = modkernel32.NewProc("SleepEx") + procCreateJobObjectW = modkernel32.NewProc("CreateJobObjectW") + procAssignProcessToJobObject = modkernel32.NewProc("AssignProcessToJobObject") + procTerminateJobObject = modkernel32.NewProc("TerminateJobObject") + procSetErrorMode = modkernel32.NewProc("SetErrorMode") + procResumeThread = modkernel32.NewProc("ResumeThread") + procSetPriorityClass = modkernel32.NewProc("SetPriorityClass") + procGetPriorityClass = modkernel32.NewProc("GetPriorityClass") + procSetInformationJobObject = modkernel32.NewProc("SetInformationJobObject") + procGenerateConsoleCtrlEvent = modkernel32.NewProc("GenerateConsoleCtrlEvent") + procGetProcessId = modkernel32.NewProc("GetProcessId") + procOpenThread = modkernel32.NewProc("OpenThread") procDefineDosDeviceW = modkernel32.NewProc("DefineDosDeviceW") procDeleteVolumeMountPointW = modkernel32.NewProc("DeleteVolumeMountPointW") procFindFirstVolumeW = modkernel32.NewProc("FindFirstVolumeW") @@ -201,6 +227,11 @@ var ( procQueryDosDeviceW = modkernel32.NewProc("QueryDosDeviceW") procSetVolumeLabelW = modkernel32.NewProc("SetVolumeLabelW") procSetVolumeMountPointW = modkernel32.NewProc("SetVolumeMountPointW") + procMessageBoxW = moduser32.NewProc("MessageBoxW") + procCLSIDFromString = modole32.NewProc("CLSIDFromString") + procStringFromGUID2 = modole32.NewProc("StringFromGUID2") + procCoCreateGuid = modole32.NewProc("CoCreateGuid") + procCoTaskMemFree = modole32.NewProc("CoTaskMemFree") procWSAStartup = modws2_32.NewProc("WSAStartup") procWSACleanup = modws2_32.NewProc("WSACleanup") procWSAIoctl = modws2_32.NewProc("WSAIoctl") @@ -249,13 +280,30 @@ var ( procCopySid = modadvapi32.NewProc("CopySid") procAllocateAndInitializeSid = modadvapi32.NewProc("AllocateAndInitializeSid") procCreateWellKnownSid = modadvapi32.NewProc("CreateWellKnownSid") + procIsWellKnownSid = modadvapi32.NewProc("IsWellKnownSid") procFreeSid = modadvapi32.NewProc("FreeSid") procEqualSid = modadvapi32.NewProc("EqualSid") + procGetSidIdentifierAuthority = modadvapi32.NewProc("GetSidIdentifierAuthority") + procGetSidSubAuthorityCount = modadvapi32.NewProc("GetSidSubAuthorityCount") + procGetSidSubAuthority = modadvapi32.NewProc("GetSidSubAuthority") + procIsValidSid = modadvapi32.NewProc("IsValidSid") procCheckTokenMembership = modadvapi32.NewProc("CheckTokenMembership") procOpenProcessToken = modadvapi32.NewProc("OpenProcessToken") + procOpenThreadToken = modadvapi32.NewProc("OpenThreadToken") + procImpersonateSelf = modadvapi32.NewProc("ImpersonateSelf") + procRevertToSelf = modadvapi32.NewProc("RevertToSelf") + procSetThreadToken = modadvapi32.NewProc("SetThreadToken") + procLookupPrivilegeValueW = modadvapi32.NewProc("LookupPrivilegeValueW") + procAdjustTokenPrivileges = modadvapi32.NewProc("AdjustTokenPrivileges") + procAdjustTokenGroups = modadvapi32.NewProc("AdjustTokenGroups") procGetTokenInformation = modadvapi32.NewProc("GetTokenInformation") + procSetTokenInformation = modadvapi32.NewProc("SetTokenInformation") + procDuplicateTokenEx = modadvapi32.NewProc("DuplicateTokenEx") procGetUserProfileDirectoryW = moduserenv.NewProc("GetUserProfileDirectoryW") procGetSystemDirectoryW = modkernel32.NewProc("GetSystemDirectoryW") + procWTSQueryUserToken = modwtsapi32.NewProc("WTSQueryUserToken") + procWTSEnumerateSessionsW = modwtsapi32.NewProc("WTSEnumerateSessionsW") + procWTSFreeMemory = modwtsapi32.NewProc("WTSFreeMemory") ) func RegisterEventSource(uncServerName *uint16, sourceName *uint16) (handle Handle, err error) { @@ -382,6 +430,18 @@ func QueryServiceStatus(service Handle, status *SERVICE_STATUS) (err error) { return } +func QueryServiceLockStatus(mgr Handle, lockStatus *QUERY_SERVICE_LOCK_STATUS, bufSize uint32, bytesNeeded *uint32) (err error) { + r1, _, e1 := syscall.Syscall6(procQueryServiceLockStatusW.Addr(), 4, uintptr(mgr), uintptr(unsafe.Pointer(lockStatus)), uintptr(bufSize), uintptr(unsafe.Pointer(bytesNeeded)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + func ControlService(service Handle, control uint32, status *SERVICE_STATUS) (err error) { r1, _, e1 := syscall.Syscall(procControlService.Addr(), 3, uintptr(service), uintptr(control), uintptr(unsafe.Pointer(status))) if r1 == 0 { @@ -490,6 +550,14 @@ func QueryServiceStatusEx(service Handle, infoLevel uint32, buff *byte, buffSize return } +func NotifyServiceStatusChange(service Handle, notifyMask uint32, notifier *SERVICE_NOTIFY) (ret error) { + r0, _, _ := syscall.Syscall(procNotifyServiceStatusChangeW.Addr(), 3, uintptr(service), uintptr(notifyMask), uintptr(unsafe.Pointer(notifier))) + if r0 != 0 { + ret = syscall.Errno(r0) + } + return +} + func GetLastError() (lasterr error) { r0, _, _ := syscall.Syscall(procGetLastError.Addr(), 0, 0, 0, 0) if r0 != 0 { @@ -611,7 +679,19 @@ func ExitProcess(exitcode uint32) { return } -func CreateFile(name *uint16, access uint32, mode uint32, sa *SecurityAttributes, createmode uint32, attrs uint32, templatefile int32) (handle Handle, err error) { +func IsWow64Process(handle Handle, isWow64 *bool) (err error) { + r1, _, e1 := syscall.Syscall(procIsWow64Process.Addr(), 2, uintptr(handle), uintptr(unsafe.Pointer(isWow64)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CreateFile(name *uint16, access uint32, mode uint32, sa *SecurityAttributes, createmode uint32, attrs uint32, templatefile Handle) (handle Handle, err error) { r0, _, e1 := syscall.Syscall9(procCreateFileW.Addr(), 7, uintptr(unsafe.Pointer(name)), uintptr(access), uintptr(mode), uintptr(unsafe.Pointer(sa)), uintptr(createmode), uintptr(attrs), uintptr(templatefile), 0, 0) handle = Handle(r0) if handle == InvalidHandle { @@ -1008,14 +1088,14 @@ func CreateProcess(appName *uint16, commandLine *uint16, procSecurity *SecurityA return } -func OpenProcess(da uint32, inheritHandle bool, pid uint32) (handle Handle, err error) { +func OpenProcess(desiredAccess uint32, inheritHandle bool, processId uint32) (handle Handle, err error) { var _p0 uint32 if inheritHandle { _p0 = 1 } else { _p0 = 0 } - r0, _, e1 := syscall.Syscall(procOpenProcess.Addr(), 3, uintptr(da), uintptr(_p0), uintptr(pid)) + r0, _, e1 := syscall.Syscall(procOpenProcess.Addr(), 3, uintptr(desiredAccess), uintptr(_p0), uintptr(processId)) handle = Handle(r0) if handle == 0 { if e1 != 0 { @@ -1027,6 +1107,26 @@ func OpenProcess(da uint32, inheritHandle bool, pid uint32) (handle Handle, err return } +func ShellExecute(hwnd Handle, verb *uint16, file *uint16, args *uint16, cwd *uint16, showCmd int32) (err error) { + r1, _, e1 := syscall.Syscall6(procShellExecuteW.Addr(), 6, uintptr(hwnd), uintptr(unsafe.Pointer(verb)), uintptr(unsafe.Pointer(file)), uintptr(unsafe.Pointer(args)), uintptr(unsafe.Pointer(cwd)), uintptr(showCmd)) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func shGetKnownFolderPath(id *KNOWNFOLDERID, flags uint32, token Token, path **uint16) (ret error) { + r0, _, _ := syscall.Syscall6(procSHGetKnownFolderPath.Addr(), 4, uintptr(unsafe.Pointer(id)), uintptr(flags), uintptr(token), uintptr(unsafe.Pointer(path)), 0, 0) + if r0 != 0 { + ret = syscall.Errno(r0) + } + return +} + func TerminateProcess(handle Handle, exitcode uint32) (err error) { r1, _, e1 := syscall.Syscall(procTerminateProcess.Addr(), 2, uintptr(handle), uintptr(exitcode), 0) if r1 == 0 { @@ -1076,6 +1176,19 @@ func GetCurrentProcess() (pseudoHandle Handle, err error) { return } +func GetCurrentThread() (pseudoHandle Handle, err error) { + r0, _, e1 := syscall.Syscall(procGetCurrentThread.Addr(), 0, 0, 0, 0) + pseudoHandle = Handle(r0) + if pseudoHandle == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + func GetProcessTimes(handle Handle, creationTime *Filetime, exitTime *Filetime, kernelTime *Filetime, userTime *Filetime) (err error) { r1, _, e1 := syscall.Syscall6(procGetProcessTimes.Addr(), 5, uintptr(handle), uintptr(unsafe.Pointer(creationTime)), uintptr(unsafe.Pointer(exitTime)), uintptr(unsafe.Pointer(kernelTime)), uintptr(unsafe.Pointer(userTime)), 0) if r1 == 0 { @@ -1262,6 +1375,42 @@ func SetEnvironmentVariable(name *uint16, value *uint16) (err error) { return } +func CreateEnvironmentBlock(block **uint16, token Token, inheritExisting bool) (err error) { + var _p0 uint32 + if inheritExisting { + _p0 = 1 + } else { + _p0 = 0 + } + r1, _, e1 := syscall.Syscall(procCreateEnvironmentBlock.Addr(), 3, uintptr(unsafe.Pointer(block)), uintptr(token), uintptr(_p0)) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func DestroyEnvironmentBlock(block *uint16) (err error) { + r1, _, e1 := syscall.Syscall(procDestroyEnvironmentBlock.Addr(), 1, uintptr(unsafe.Pointer(block)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func getTickCount64() (ms uint64) { + r0, _, _ := syscall.Syscall(procGetTickCount64.Addr(), 0, 0, 0, 0) + ms = uint64(r0) + return +} + func SetFileTime(handle Handle, ctime *Filetime, atime *Filetime, wtime *Filetime) (err error) { r1, _, e1 := syscall.Syscall6(procSetFileTime.Addr(), 4, uintptr(handle), uintptr(unsafe.Pointer(ctime)), uintptr(unsafe.Pointer(atime)), uintptr(unsafe.Pointer(wtime)), 0, 0) if r1 == 0 { @@ -1704,7 +1853,7 @@ func RegQueryValueEx(key Handle, name *uint16, reserved *uint32, valtype *uint32 return } -func getCurrentProcessId() (pid uint32) { +func GetCurrentProcessId() (pid uint32) { r0, _, _ := syscall.Syscall(procGetCurrentProcessId.Addr(), 0, 0, 0, 0) pid = uint32(r0) return @@ -1807,6 +1956,30 @@ func Process32Next(snapshot Handle, procEntry *ProcessEntry32) (err error) { return } +func Thread32First(snapshot Handle, threadEntry *ThreadEntry32) (err error) { + r1, _, e1 := syscall.Syscall(procThread32First.Addr(), 2, uintptr(snapshot), uintptr(unsafe.Pointer(threadEntry)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func Thread32Next(snapshot Handle, threadEntry *ThreadEntry32) (err error) { + r1, _, e1 := syscall.Syscall(procThread32Next.Addr(), 2, uintptr(snapshot), uintptr(unsafe.Pointer(threadEntry)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + func DeviceIoControl(handle Handle, ioControlCode uint32, inBuffer *byte, inBufferSize uint32, outBuffer *byte, outBufferSize uint32, bytesReturned *uint32, overlapped *Overlapped) (err error) { r1, _, e1 := syscall.Syscall9(procDeviceIoControl.Addr(), 8, uintptr(handle), uintptr(ioControlCode), uintptr(unsafe.Pointer(inBuffer)), uintptr(inBufferSize), uintptr(unsafe.Pointer(outBuffer)), uintptr(outBufferSize), uintptr(unsafe.Pointer(bytesReturned)), uintptr(unsafe.Pointer(overlapped)), 0) if r1 == 0 { @@ -1930,6 +2103,156 @@ func PulseEvent(event Handle) (err error) { return } +func SleepEx(milliseconds uint32, alertable bool) (ret uint32) { + var _p0 uint32 + if alertable { + _p0 = 1 + } else { + _p0 = 0 + } + r0, _, _ := syscall.Syscall(procSleepEx.Addr(), 2, uintptr(milliseconds), uintptr(_p0), 0) + ret = uint32(r0) + return +} + +func CreateJobObject(jobAttr *SecurityAttributes, name *uint16) (handle Handle, err error) { + r0, _, e1 := syscall.Syscall(procCreateJobObjectW.Addr(), 2, uintptr(unsafe.Pointer(jobAttr)), uintptr(unsafe.Pointer(name)), 0) + handle = Handle(r0) + if handle == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func AssignProcessToJobObject(job Handle, process Handle) (err error) { + r1, _, e1 := syscall.Syscall(procAssignProcessToJobObject.Addr(), 2, uintptr(job), uintptr(process), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func TerminateJobObject(job Handle, exitCode uint32) (err error) { + r1, _, e1 := syscall.Syscall(procTerminateJobObject.Addr(), 2, uintptr(job), uintptr(exitCode), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func SetErrorMode(mode uint32) (ret uint32) { + r0, _, _ := syscall.Syscall(procSetErrorMode.Addr(), 1, uintptr(mode), 0, 0) + ret = uint32(r0) + return +} + +func ResumeThread(thread Handle) (ret uint32, err error) { + r0, _, e1 := syscall.Syscall(procResumeThread.Addr(), 1, uintptr(thread), 0, 0) + ret = uint32(r0) + if ret == 0xffffffff { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func SetPriorityClass(process Handle, priorityClass uint32) (err error) { + r1, _, e1 := syscall.Syscall(procSetPriorityClass.Addr(), 2, uintptr(process), uintptr(priorityClass), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetPriorityClass(process Handle) (ret uint32, err error) { + r0, _, e1 := syscall.Syscall(procGetPriorityClass.Addr(), 1, uintptr(process), 0, 0) + ret = uint32(r0) + if ret == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func SetInformationJobObject(job Handle, JobObjectInformationClass uint32, JobObjectInformation uintptr, JobObjectInformationLength uint32) (ret int, err error) { + r0, _, e1 := syscall.Syscall6(procSetInformationJobObject.Addr(), 4, uintptr(job), uintptr(JobObjectInformationClass), uintptr(JobObjectInformation), uintptr(JobObjectInformationLength), 0, 0) + ret = int(r0) + if ret == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GenerateConsoleCtrlEvent(ctrlEvent uint32, processGroupID uint32) (err error) { + r1, _, e1 := syscall.Syscall(procGenerateConsoleCtrlEvent.Addr(), 2, uintptr(ctrlEvent), uintptr(processGroupID), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetProcessId(process Handle) (id uint32, err error) { + r0, _, e1 := syscall.Syscall(procGetProcessId.Addr(), 1, uintptr(process), 0, 0) + id = uint32(r0) + if id == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func OpenThread(desiredAccess uint32, inheritHandle bool, threadId uint32) (handle Handle, err error) { + var _p0 uint32 + if inheritHandle { + _p0 = 1 + } else { + _p0 = 0 + } + r0, _, e1 := syscall.Syscall(procOpenThread.Addr(), 3, uintptr(desiredAccess), uintptr(_p0), uintptr(threadId)) + handle = Handle(r0) + if handle == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + func DefineDosDevice(flags uint32, deviceName *uint16, targetPath *uint16) (err error) { r1, _, e1 := syscall.Syscall(procDefineDosDeviceW.Addr(), 3, uintptr(flags), uintptr(unsafe.Pointer(deviceName)), uintptr(unsafe.Pointer(targetPath))) if r1 == 0 { @@ -2157,6 +2480,46 @@ func SetVolumeMountPoint(volumeMountPoint *uint16, volumeName *uint16) (err erro return } +func MessageBox(hwnd Handle, text *uint16, caption *uint16, boxtype uint32) (ret int32, err error) { + r0, _, e1 := syscall.Syscall6(procMessageBoxW.Addr(), 4, uintptr(hwnd), uintptr(unsafe.Pointer(text)), uintptr(unsafe.Pointer(caption)), uintptr(boxtype), 0, 0) + ret = int32(r0) + if ret == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func clsidFromString(lpsz *uint16, pclsid *GUID) (ret error) { + r0, _, _ := syscall.Syscall(procCLSIDFromString.Addr(), 2, uintptr(unsafe.Pointer(lpsz)), uintptr(unsafe.Pointer(pclsid)), 0) + if r0 != 0 { + ret = syscall.Errno(r0) + } + return +} + +func stringFromGUID2(rguid *GUID, lpsz *uint16, cchMax int32) (chars int32) { + r0, _, _ := syscall.Syscall(procStringFromGUID2.Addr(), 3, uintptr(unsafe.Pointer(rguid)), uintptr(unsafe.Pointer(lpsz)), uintptr(cchMax)) + chars = int32(r0) + return +} + +func coCreateGuid(pguid *GUID) (ret error) { + r0, _, _ := syscall.Syscall(procCoCreateGuid.Addr(), 1, uintptr(unsafe.Pointer(pguid)), 0, 0) + if r0 != 0 { + ret = syscall.Errno(r0) + } + return +} + +func coTaskMemFree(address unsafe.Pointer) { + syscall.Syscall(procCoTaskMemFree.Addr(), 1, uintptr(address), 0, 0) + return +} + func WSAStartup(verreq uint32, data *WSAData) (sockerr error) { r0, _, _ := syscall.Syscall(procWSAStartup.Addr(), 2, uintptr(verreq), uintptr(unsafe.Pointer(data)), 0) if r0 != 0 { @@ -2699,6 +3062,12 @@ func createWellKnownSid(sidType WELL_KNOWN_SID_TYPE, domainSid *SID, sid *SID, s return } +func isWellKnownSid(sid *SID, sidType WELL_KNOWN_SID_TYPE) (isWellKnown bool) { + r0, _, _ := syscall.Syscall(procIsWellKnownSid.Addr(), 2, uintptr(unsafe.Pointer(sid)), uintptr(sidType), 0) + isWellKnown = r0 != 0 + return +} + func FreeSid(sid *SID) (err error) { r1, _, e1 := syscall.Syscall(procFreeSid.Addr(), 1, uintptr(unsafe.Pointer(sid)), 0, 0) if r1 != 0 { @@ -2717,6 +3086,30 @@ func EqualSid(sid1 *SID, sid2 *SID) (isEqual bool) { return } +func getSidIdentifierAuthority(sid *SID) (authority *SidIdentifierAuthority) { + r0, _, _ := syscall.Syscall(procGetSidIdentifierAuthority.Addr(), 1, uintptr(unsafe.Pointer(sid)), 0, 0) + authority = (*SidIdentifierAuthority)(unsafe.Pointer(r0)) + return +} + +func getSidSubAuthorityCount(sid *SID) (count *uint8) { + r0, _, _ := syscall.Syscall(procGetSidSubAuthorityCount.Addr(), 1, uintptr(unsafe.Pointer(sid)), 0, 0) + count = (*uint8)(unsafe.Pointer(r0)) + return +} + +func getSidSubAuthority(sid *SID, index uint32) (subAuthority *uint32) { + r0, _, _ := syscall.Syscall(procGetSidSubAuthority.Addr(), 2, uintptr(unsafe.Pointer(sid)), uintptr(index), 0) + subAuthority = (*uint32)(unsafe.Pointer(r0)) + return +} + +func isValidSid(sid *SID) (isValid bool) { + r0, _, _ := syscall.Syscall(procIsValidSid.Addr(), 1, uintptr(unsafe.Pointer(sid)), 0, 0) + isValid = r0 != 0 + return +} + func checkTokenMembership(tokenHandle Token, sidToCheck *SID, isMember *int32) (err error) { r1, _, e1 := syscall.Syscall(procCheckTokenMembership.Addr(), 3, uintptr(tokenHandle), uintptr(unsafe.Pointer(sidToCheck)), uintptr(unsafe.Pointer(isMember))) if r1 == 0 { @@ -2729,8 +3122,134 @@ func checkTokenMembership(tokenHandle Token, sidToCheck *SID, isMember *int32) ( return } -func OpenProcessToken(h Handle, access uint32, token *Token) (err error) { - r1, _, e1 := syscall.Syscall(procOpenProcessToken.Addr(), 3, uintptr(h), uintptr(access), uintptr(unsafe.Pointer(token))) +func OpenProcessToken(process Handle, access uint32, token *Token) (err error) { + r1, _, e1 := syscall.Syscall(procOpenProcessToken.Addr(), 3, uintptr(process), uintptr(access), uintptr(unsafe.Pointer(token))) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func OpenThreadToken(thread Handle, access uint32, openAsSelf bool, token *Token) (err error) { + var _p0 uint32 + if openAsSelf { + _p0 = 1 + } else { + _p0 = 0 + } + r1, _, e1 := syscall.Syscall6(procOpenThreadToken.Addr(), 4, uintptr(thread), uintptr(access), uintptr(_p0), uintptr(unsafe.Pointer(token)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func ImpersonateSelf(impersonationlevel uint32) (err error) { + r1, _, e1 := syscall.Syscall(procImpersonateSelf.Addr(), 1, uintptr(impersonationlevel), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func RevertToSelf() (err error) { + r1, _, e1 := syscall.Syscall(procRevertToSelf.Addr(), 0, 0, 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func SetThreadToken(thread *Handle, token Token) (err error) { + r1, _, e1 := syscall.Syscall(procSetThreadToken.Addr(), 2, uintptr(unsafe.Pointer(thread)), uintptr(token), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func LookupPrivilegeValue(systemname *uint16, name *uint16, luid *LUID) (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 = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func AdjustTokenPrivileges(token Token, disableAllPrivileges bool, newstate *Tokenprivileges, buflen uint32, prevstate *Tokenprivileges, returnlen *uint32) (err error) { + var _p0 uint32 + if disableAllPrivileges { + _p0 = 1 + } else { + _p0 = 0 + } + r1, _, e1 := syscall.Syscall6(procAdjustTokenPrivileges.Addr(), 6, uintptr(token), uintptr(_p0), uintptr(unsafe.Pointer(newstate)), uintptr(buflen), uintptr(unsafe.Pointer(prevstate)), uintptr(unsafe.Pointer(returnlen))) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func AdjustTokenGroups(token Token, resetToDefault bool, newstate *Tokengroups, buflen uint32, prevstate *Tokengroups, returnlen *uint32) (err error) { + var _p0 uint32 + if resetToDefault { + _p0 = 1 + } else { + _p0 = 0 + } + r1, _, e1 := syscall.Syscall6(procAdjustTokenGroups.Addr(), 6, uintptr(token), uintptr(_p0), uintptr(unsafe.Pointer(newstate)), uintptr(buflen), uintptr(unsafe.Pointer(prevstate)), uintptr(unsafe.Pointer(returnlen))) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetTokenInformation(token Token, infoClass uint32, info *byte, infoLen uint32, returnedLen *uint32) (err error) { + r1, _, e1 := syscall.Syscall6(procGetTokenInformation.Addr(), 5, uintptr(token), uintptr(infoClass), uintptr(unsafe.Pointer(info)), uintptr(infoLen), uintptr(unsafe.Pointer(returnedLen)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func SetTokenInformation(token Token, infoClass uint32, info *byte, infoLen uint32) (err error) { + r1, _, e1 := syscall.Syscall6(procSetTokenInformation.Addr(), 4, uintptr(token), uintptr(infoClass), uintptr(unsafe.Pointer(info)), uintptr(infoLen), 0, 0) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) @@ -2741,8 +3260,8 @@ func OpenProcessToken(h Handle, access uint32, token *Token) (err error) { return } -func GetTokenInformation(t Token, infoClass uint32, info *byte, infoLen uint32, returnedLen *uint32) (err error) { - r1, _, e1 := syscall.Syscall6(procGetTokenInformation.Addr(), 5, uintptr(t), uintptr(infoClass), uintptr(unsafe.Pointer(info)), uintptr(infoLen), uintptr(unsafe.Pointer(returnedLen)), 0) +func DuplicateTokenEx(existingToken Token, desiredAccess uint32, tokenAttributes *SecurityAttributes, impersonationLevel uint32, tokenType uint32, newToken *Token) (err error) { + r1, _, e1 := syscall.Syscall6(procDuplicateTokenEx.Addr(), 6, uintptr(existingToken), uintptr(desiredAccess), uintptr(unsafe.Pointer(tokenAttributes)), uintptr(impersonationLevel), uintptr(tokenType), uintptr(unsafe.Pointer(newToken))) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) @@ -2777,3 +3296,32 @@ func getSystemDirectory(dir *uint16, dirLen uint32) (len uint32, err error) { } return } + +func WTSQueryUserToken(session uint32, token *Token) (err error) { + r1, _, e1 := syscall.Syscall(procWTSQueryUserToken.Addr(), 2, uintptr(session), uintptr(unsafe.Pointer(token)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func WTSEnumerateSessions(handle Handle, reserved uint32, version uint32, sessions **WTS_SESSION_INFO, count *uint32) (err error) { + r1, _, e1 := syscall.Syscall6(procWTSEnumerateSessionsW.Addr(), 5, uintptr(handle), uintptr(reserved), uintptr(version), uintptr(unsafe.Pointer(sessions)), uintptr(unsafe.Pointer(count)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func WTSFreeMemory(ptr uintptr) { + syscall.Syscall(procWTSFreeMemory.Addr(), 1, uintptr(ptr), 0, 0) + return +} diff --git a/vendor/golang.org/x/text/encoding/internal/identifier/gen.go b/vendor/golang.org/x/text/encoding/internal/identifier/gen.go index 0c8eba7e..26cfef9c 100644 --- a/vendor/golang.org/x/text/encoding/internal/identifier/gen.go +++ b/vendor/golang.org/x/text/encoding/internal/identifier/gen.go @@ -109,7 +109,12 @@ func main() { use = use || a.Value != "person" } if a.Name.Local == "data" && use { - attr = a.Value + " " + // Patch up URLs to use https. From some links, the + // https version is different from the http one. + s := a.Value + s = strings.Replace(s, "http://", "https://", -1) + s = strings.Replace(s, "/unicode/", "/", -1) + attr = s + " " } } } diff --git a/vendor/golang.org/x/text/encoding/internal/identifier/mib.go b/vendor/golang.org/x/text/encoding/internal/identifier/mib.go index 8cc29021..fc7df1bc 100644 --- a/vendor/golang.org/x/text/encoding/internal/identifier/mib.go +++ b/vendor/golang.org/x/text/encoding/internal/identifier/mib.go @@ -538,8 +538,6 @@ const ( // ISO111ECMACyrillic is the MIB identifier with IANA name ECMA-cyrillic. // // ISO registry - // (formerly ECMA - // registry ) ISO111ECMACyrillic MIB = 77 // ISO121Canadian1 is the MIB identifier with IANA name CSA_Z243.4-1985-1. @@ -732,18 +730,18 @@ const ( // ISO885913 is the MIB identifier with IANA name ISO-8859-13. // - // ISO See http://www.iana.org/assignments/charset-reg/ISO-8859-13 http://www.iana.org/assignments/charset-reg/ISO-8859-13 + // ISO See https://www.iana.org/assignments/charset-reg/ISO-8859-13 https://www.iana.org/assignments/charset-reg/ISO-8859-13 ISO885913 MIB = 109 // ISO885914 is the MIB identifier with IANA name ISO-8859-14. // - // ISO See http://www.iana.org/assignments/charset-reg/ISO-8859-14 + // ISO See https://www.iana.org/assignments/charset-reg/ISO-8859-14 ISO885914 MIB = 110 // ISO885915 is the MIB identifier with IANA name ISO-8859-15. // // ISO - // Please see: http://www.iana.org/assignments/charset-reg/ISO-8859-15 + // Please see: https://www.iana.org/assignments/charset-reg/ISO-8859-15 ISO885915 MIB = 111 // ISO885916 is the MIB identifier with IANA name ISO-8859-16. @@ -754,41 +752,41 @@ const ( // GBK is the MIB identifier with IANA name GBK. // // Chinese IT Standardization Technical Committee - // Please see: http://www.iana.org/assignments/charset-reg/GBK + // Please see: https://www.iana.org/assignments/charset-reg/GBK GBK MIB = 113 // GB18030 is the MIB identifier with IANA name GB18030. // // Chinese IT Standardization Technical Committee - // Please see: http://www.iana.org/assignments/charset-reg/GB18030 + // Please see: https://www.iana.org/assignments/charset-reg/GB18030 GB18030 MIB = 114 // OSDEBCDICDF0415 is the MIB identifier with IANA name OSD_EBCDIC_DF04_15. // // Fujitsu-Siemens standard mainframe EBCDIC encoding - // Please see: http://www.iana.org/assignments/charset-reg/OSD-EBCDIC-DF04-15 + // Please see: https://www.iana.org/assignments/charset-reg/OSD-EBCDIC-DF04-15 OSDEBCDICDF0415 MIB = 115 // OSDEBCDICDF03IRV is the MIB identifier with IANA name OSD_EBCDIC_DF03_IRV. // // Fujitsu-Siemens standard mainframe EBCDIC encoding - // Please see: http://www.iana.org/assignments/charset-reg/OSD-EBCDIC-DF03-IRV + // Please see: https://www.iana.org/assignments/charset-reg/OSD-EBCDIC-DF03-IRV OSDEBCDICDF03IRV MIB = 116 // OSDEBCDICDF041 is the MIB identifier with IANA name OSD_EBCDIC_DF04_1. // // Fujitsu-Siemens standard mainframe EBCDIC encoding - // Please see: http://www.iana.org/assignments/charset-reg/OSD-EBCDIC-DF04-1 + // Please see: https://www.iana.org/assignments/charset-reg/OSD-EBCDIC-DF04-1 OSDEBCDICDF041 MIB = 117 // ISO115481 is the MIB identifier with IANA name ISO-11548-1. // - // See http://www.iana.org/assignments/charset-reg/ISO-11548-1 + // See https://www.iana.org/assignments/charset-reg/ISO-11548-1 ISO115481 MIB = 118 // KZ1048 is the MIB identifier with IANA name KZ-1048. // - // See http://www.iana.org/assignments/charset-reg/KZ-1048 + // See https://www.iana.org/assignments/charset-reg/KZ-1048 KZ1048 MIB = 119 // Unicode is the MIB identifier with IANA name ISO-10646-UCS-2. @@ -855,7 +853,7 @@ const ( // SCSU is the MIB identifier with IANA name SCSU. // - // SCSU See http://www.iana.org/assignments/charset-reg/SCSU + // SCSU See https://www.iana.org/assignments/charset-reg/SCSU SCSU MIB = 1011 // UTF7 is the MIB identifier with IANA name UTF-7. @@ -884,22 +882,22 @@ const ( // CESU8 is the MIB identifier with IANA name CESU-8. // - // https://www.unicode.org/unicode/reports/tr26 + // https://www.unicode.org/reports/tr26 CESU8 MIB = 1016 // UTF32 is the MIB identifier with IANA name UTF-32. // - // https://www.unicode.org/unicode/reports/tr19/ + // https://www.unicode.org/reports/tr19/ UTF32 MIB = 1017 // UTF32BE is the MIB identifier with IANA name UTF-32BE. // - // https://www.unicode.org/unicode/reports/tr19/ + // https://www.unicode.org/reports/tr19/ UTF32BE MIB = 1018 // UTF32LE is the MIB identifier with IANA name UTF-32LE. // - // https://www.unicode.org/unicode/reports/tr19/ + // https://www.unicode.org/reports/tr19/ UTF32LE MIB = 1019 // BOCU1 is the MIB identifier with IANA name BOCU-1. @@ -1461,152 +1459,152 @@ const ( // IBM00858 is the MIB identifier with IANA name IBM00858. // - // IBM See http://www.iana.org/assignments/charset-reg/IBM00858 + // IBM See https://www.iana.org/assignments/charset-reg/IBM00858 IBM00858 MIB = 2089 // IBM00924 is the MIB identifier with IANA name IBM00924. // - // IBM See http://www.iana.org/assignments/charset-reg/IBM00924 + // IBM See https://www.iana.org/assignments/charset-reg/IBM00924 IBM00924 MIB = 2090 // IBM01140 is the MIB identifier with IANA name IBM01140. // - // IBM See http://www.iana.org/assignments/charset-reg/IBM01140 + // IBM See https://www.iana.org/assignments/charset-reg/IBM01140 IBM01140 MIB = 2091 // IBM01141 is the MIB identifier with IANA name IBM01141. // - // IBM See http://www.iana.org/assignments/charset-reg/IBM01141 + // IBM See https://www.iana.org/assignments/charset-reg/IBM01141 IBM01141 MIB = 2092 // IBM01142 is the MIB identifier with IANA name IBM01142. // - // IBM See http://www.iana.org/assignments/charset-reg/IBM01142 + // IBM See https://www.iana.org/assignments/charset-reg/IBM01142 IBM01142 MIB = 2093 // IBM01143 is the MIB identifier with IANA name IBM01143. // - // IBM See http://www.iana.org/assignments/charset-reg/IBM01143 + // IBM See https://www.iana.org/assignments/charset-reg/IBM01143 IBM01143 MIB = 2094 // IBM01144 is the MIB identifier with IANA name IBM01144. // - // IBM See http://www.iana.org/assignments/charset-reg/IBM01144 + // IBM See https://www.iana.org/assignments/charset-reg/IBM01144 IBM01144 MIB = 2095 // IBM01145 is the MIB identifier with IANA name IBM01145. // - // IBM See http://www.iana.org/assignments/charset-reg/IBM01145 + // IBM See https://www.iana.org/assignments/charset-reg/IBM01145 IBM01145 MIB = 2096 // IBM01146 is the MIB identifier with IANA name IBM01146. // - // IBM See http://www.iana.org/assignments/charset-reg/IBM01146 + // IBM See https://www.iana.org/assignments/charset-reg/IBM01146 IBM01146 MIB = 2097 // IBM01147 is the MIB identifier with IANA name IBM01147. // - // IBM See http://www.iana.org/assignments/charset-reg/IBM01147 + // IBM See https://www.iana.org/assignments/charset-reg/IBM01147 IBM01147 MIB = 2098 // IBM01148 is the MIB identifier with IANA name IBM01148. // - // IBM See http://www.iana.org/assignments/charset-reg/IBM01148 + // IBM See https://www.iana.org/assignments/charset-reg/IBM01148 IBM01148 MIB = 2099 // IBM01149 is the MIB identifier with IANA name IBM01149. // - // IBM See http://www.iana.org/assignments/charset-reg/IBM01149 + // IBM See https://www.iana.org/assignments/charset-reg/IBM01149 IBM01149 MIB = 2100 // Big5HKSCS is the MIB identifier with IANA name Big5-HKSCS. // - // See http://www.iana.org/assignments/charset-reg/Big5-HKSCS + // See https://www.iana.org/assignments/charset-reg/Big5-HKSCS Big5HKSCS MIB = 2101 // IBM1047 is the MIB identifier with IANA name IBM1047. // - // IBM1047 (EBCDIC Latin 1/Open Systems) http://www-1.ibm.com/servers/eserver/iseries/software/globalization/pdf/cp01047z.pdf + // IBM1047 (EBCDIC Latin 1/Open Systems) https://www-1.ibm.com/servers/eserver/iseries/software/globalization/pdf/cp01047z.pdf IBM1047 MIB = 2102 // PTCP154 is the MIB identifier with IANA name PTCP154. // - // See http://www.iana.org/assignments/charset-reg/PTCP154 + // See https://www.iana.org/assignments/charset-reg/PTCP154 PTCP154 MIB = 2103 // Amiga1251 is the MIB identifier with IANA name Amiga-1251. // - // See http://www.amiga.ultranet.ru/Amiga-1251.html + // See https://www.amiga.ultranet.ru/Amiga-1251.html Amiga1251 MIB = 2104 // KOI7switched is the MIB identifier with IANA name KOI7-switched. // - // See http://www.iana.org/assignments/charset-reg/KOI7-switched + // See https://www.iana.org/assignments/charset-reg/KOI7-switched KOI7switched MIB = 2105 // BRF is the MIB identifier with IANA name BRF. // - // See http://www.iana.org/assignments/charset-reg/BRF + // See https://www.iana.org/assignments/charset-reg/BRF BRF MIB = 2106 // TSCII is the MIB identifier with IANA name TSCII. // - // See http://www.iana.org/assignments/charset-reg/TSCII + // See https://www.iana.org/assignments/charset-reg/TSCII TSCII MIB = 2107 // CP51932 is the MIB identifier with IANA name CP51932. // - // See http://www.iana.org/assignments/charset-reg/CP51932 + // See https://www.iana.org/assignments/charset-reg/CP51932 CP51932 MIB = 2108 // Windows874 is the MIB identifier with IANA name windows-874. // - // See http://www.iana.org/assignments/charset-reg/windows-874 + // See https://www.iana.org/assignments/charset-reg/windows-874 Windows874 MIB = 2109 // Windows1250 is the MIB identifier with IANA name windows-1250. // - // Microsoft http://www.iana.org/assignments/charset-reg/windows-1250 + // Microsoft https://www.iana.org/assignments/charset-reg/windows-1250 Windows1250 MIB = 2250 // Windows1251 is the MIB identifier with IANA name windows-1251. // - // Microsoft http://www.iana.org/assignments/charset-reg/windows-1251 + // Microsoft https://www.iana.org/assignments/charset-reg/windows-1251 Windows1251 MIB = 2251 // Windows1252 is the MIB identifier with IANA name windows-1252. // - // Microsoft http://www.iana.org/assignments/charset-reg/windows-1252 + // Microsoft https://www.iana.org/assignments/charset-reg/windows-1252 Windows1252 MIB = 2252 // Windows1253 is the MIB identifier with IANA name windows-1253. // - // Microsoft http://www.iana.org/assignments/charset-reg/windows-1253 + // Microsoft https://www.iana.org/assignments/charset-reg/windows-1253 Windows1253 MIB = 2253 // Windows1254 is the MIB identifier with IANA name windows-1254. // - // Microsoft http://www.iana.org/assignments/charset-reg/windows-1254 + // Microsoft https://www.iana.org/assignments/charset-reg/windows-1254 Windows1254 MIB = 2254 // Windows1255 is the MIB identifier with IANA name windows-1255. // - // Microsoft http://www.iana.org/assignments/charset-reg/windows-1255 + // Microsoft https://www.iana.org/assignments/charset-reg/windows-1255 Windows1255 MIB = 2255 // Windows1256 is the MIB identifier with IANA name windows-1256. // - // Microsoft http://www.iana.org/assignments/charset-reg/windows-1256 + // Microsoft https://www.iana.org/assignments/charset-reg/windows-1256 Windows1256 MIB = 2256 // Windows1257 is the MIB identifier with IANA name windows-1257. // - // Microsoft http://www.iana.org/assignments/charset-reg/windows-1257 + // Microsoft https://www.iana.org/assignments/charset-reg/windows-1257 Windows1257 MIB = 2257 // Windows1258 is the MIB identifier with IANA name windows-1258. // - // Microsoft http://www.iana.org/assignments/charset-reg/windows-1258 + // Microsoft https://www.iana.org/assignments/charset-reg/windows-1258 Windows1258 MIB = 2258 // TIS620 is the MIB identifier with IANA name TIS-620. @@ -1616,6 +1614,6 @@ const ( // CP50220 is the MIB identifier with IANA name CP50220. // - // See http://www.iana.org/assignments/charset-reg/CP50220 + // See https://www.iana.org/assignments/charset-reg/CP50220 CP50220 MIB = 2260 ) diff --git a/vendor/golang.org/x/text/internal/gen/gen.go b/vendor/golang.org/x/text/internal/gen/gen.go index 41c3268c..cc6510fd 100644 --- a/vendor/golang.org/x/text/internal/gen/gen.go +++ b/vendor/golang.org/x/text/internal/gen/gen.go @@ -85,7 +85,7 @@ func CLDRVersion() string { var tags = []struct{ version, buildTags string }{ {"9.0.0", "!go1.10"}, - {"10.0.0", "go1.10, !go1.13"}, + {"10.0.0", "go1.10,!go1.13"}, {"11.0.0", "go1.13"}, } diff --git a/vendor/golang.org/x/text/unicode/norm/tables10.0.0.go b/vendor/golang.org/x/text/unicode/norm/tables10.0.0.go index c48a97b0..26fbd55a 100644 --- a/vendor/golang.org/x/text/unicode/norm/tables10.0.0.go +++ b/vendor/golang.org/x/text/unicode/norm/tables10.0.0.go @@ -1,6 +1,6 @@ // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. -// +build go1.10 +// +build go1.10,!go1.13 package norm diff --git a/vendor/golang.org/x/text/unicode/norm/tables11.0.0.go b/vendor/golang.org/x/text/unicode/norm/tables11.0.0.go new file mode 100644 index 00000000..7297cce3 --- /dev/null +++ b/vendor/golang.org/x/text/unicode/norm/tables11.0.0.go @@ -0,0 +1,7693 @@ +// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. + +// +build go1.13 + +package norm + +import "sync" + +const ( + // Version is the Unicode edition from which the tables are derived. + Version = "11.0.0" + + // MaxTransformChunkSize indicates the maximum number of bytes that Transform + // may need to write atomically for any Form. Making a destination buffer at + // least this size ensures that Transform can always make progress and that + // the user does not need to grow the buffer on an ErrShortDst. + MaxTransformChunkSize = 35 + maxNonStarters*4 +) + +var ccc = [55]uint8{ + 0, 1, 7, 8, 9, 10, 11, 12, + 13, 14, 15, 16, 17, 18, 19, 20, + 21, 22, 23, 24, 25, 26, 27, 28, + 29, 30, 31, 32, 33, 34, 35, 36, + 84, 91, 103, 107, 118, 122, 129, 130, + 132, 202, 214, 216, 218, 220, 222, 224, + 226, 228, 230, 232, 233, 234, 240, +} + +const ( + firstMulti = 0x186D + firstCCC = 0x2C9E + endMulti = 0x2F60 + firstLeadingCCC = 0x49AE + firstCCCZeroExcept = 0x4A78 + firstStarterWithNLead = 0x4A9F + lastDecomp = 0x4AA1 + maxDecomp = 0x8000 +) + +// decomps: 19105 bytes +var decomps = [...]byte{ + // Bytes 0 - 3f + 0x00, 0x41, 0x20, 0x41, 0x21, 0x41, 0x22, 0x41, + 0x23, 0x41, 0x24, 0x41, 0x25, 0x41, 0x26, 0x41, + 0x27, 0x41, 0x28, 0x41, 0x29, 0x41, 0x2A, 0x41, + 0x2B, 0x41, 0x2C, 0x41, 0x2D, 0x41, 0x2E, 0x41, + 0x2F, 0x41, 0x30, 0x41, 0x31, 0x41, 0x32, 0x41, + 0x33, 0x41, 0x34, 0x41, 0x35, 0x41, 0x36, 0x41, + 0x37, 0x41, 0x38, 0x41, 0x39, 0x41, 0x3A, 0x41, + 0x3B, 0x41, 0x3C, 0x41, 0x3D, 0x41, 0x3E, 0x41, + // Bytes 40 - 7f + 0x3F, 0x41, 0x40, 0x41, 0x41, 0x41, 0x42, 0x41, + 0x43, 0x41, 0x44, 0x41, 0x45, 0x41, 0x46, 0x41, + 0x47, 0x41, 0x48, 0x41, 0x49, 0x41, 0x4A, 0x41, + 0x4B, 0x41, 0x4C, 0x41, 0x4D, 0x41, 0x4E, 0x41, + 0x4F, 0x41, 0x50, 0x41, 0x51, 0x41, 0x52, 0x41, + 0x53, 0x41, 0x54, 0x41, 0x55, 0x41, 0x56, 0x41, + 0x57, 0x41, 0x58, 0x41, 0x59, 0x41, 0x5A, 0x41, + 0x5B, 0x41, 0x5C, 0x41, 0x5D, 0x41, 0x5E, 0x41, + // Bytes 80 - bf + 0x5F, 0x41, 0x60, 0x41, 0x61, 0x41, 0x62, 0x41, + 0x63, 0x41, 0x64, 0x41, 0x65, 0x41, 0x66, 0x41, + 0x67, 0x41, 0x68, 0x41, 0x69, 0x41, 0x6A, 0x41, + 0x6B, 0x41, 0x6C, 0x41, 0x6D, 0x41, 0x6E, 0x41, + 0x6F, 0x41, 0x70, 0x41, 0x71, 0x41, 0x72, 0x41, + 0x73, 0x41, 0x74, 0x41, 0x75, 0x41, 0x76, 0x41, + 0x77, 0x41, 0x78, 0x41, 0x79, 0x41, 0x7A, 0x41, + 0x7B, 0x41, 0x7C, 0x41, 0x7D, 0x41, 0x7E, 0x42, + // Bytes c0 - ff + 0xC2, 0xA2, 0x42, 0xC2, 0xA3, 0x42, 0xC2, 0xA5, + 0x42, 0xC2, 0xA6, 0x42, 0xC2, 0xAC, 0x42, 0xC2, + 0xB7, 0x42, 0xC3, 0x86, 0x42, 0xC3, 0xB0, 0x42, + 0xC4, 0xA6, 0x42, 0xC4, 0xA7, 0x42, 0xC4, 0xB1, + 0x42, 0xC5, 0x8B, 0x42, 0xC5, 0x93, 0x42, 0xC6, + 0x8E, 0x42, 0xC6, 0x90, 0x42, 0xC6, 0xAB, 0x42, + 0xC8, 0xA2, 0x42, 0xC8, 0xB7, 0x42, 0xC9, 0x90, + 0x42, 0xC9, 0x91, 0x42, 0xC9, 0x92, 0x42, 0xC9, + // Bytes 100 - 13f + 0x94, 0x42, 0xC9, 0x95, 0x42, 0xC9, 0x99, 0x42, + 0xC9, 0x9B, 0x42, 0xC9, 0x9C, 0x42, 0xC9, 0x9F, + 0x42, 0xC9, 0xA1, 0x42, 0xC9, 0xA3, 0x42, 0xC9, + 0xA5, 0x42, 0xC9, 0xA6, 0x42, 0xC9, 0xA8, 0x42, + 0xC9, 0xA9, 0x42, 0xC9, 0xAA, 0x42, 0xC9, 0xAB, + 0x42, 0xC9, 0xAD, 0x42, 0xC9, 0xAF, 0x42, 0xC9, + 0xB0, 0x42, 0xC9, 0xB1, 0x42, 0xC9, 0xB2, 0x42, + 0xC9, 0xB3, 0x42, 0xC9, 0xB4, 0x42, 0xC9, 0xB5, + // Bytes 140 - 17f + 0x42, 0xC9, 0xB8, 0x42, 0xC9, 0xB9, 0x42, 0xC9, + 0xBB, 0x42, 0xCA, 0x81, 0x42, 0xCA, 0x82, 0x42, + 0xCA, 0x83, 0x42, 0xCA, 0x89, 0x42, 0xCA, 0x8A, + 0x42, 0xCA, 0x8B, 0x42, 0xCA, 0x8C, 0x42, 0xCA, + 0x90, 0x42, 0xCA, 0x91, 0x42, 0xCA, 0x92, 0x42, + 0xCA, 0x95, 0x42, 0xCA, 0x9D, 0x42, 0xCA, 0x9F, + 0x42, 0xCA, 0xB9, 0x42, 0xCE, 0x91, 0x42, 0xCE, + 0x92, 0x42, 0xCE, 0x93, 0x42, 0xCE, 0x94, 0x42, + // Bytes 180 - 1bf + 0xCE, 0x95, 0x42, 0xCE, 0x96, 0x42, 0xCE, 0x97, + 0x42, 0xCE, 0x98, 0x42, 0xCE, 0x99, 0x42, 0xCE, + 0x9A, 0x42, 0xCE, 0x9B, 0x42, 0xCE, 0x9C, 0x42, + 0xCE, 0x9D, 0x42, 0xCE, 0x9E, 0x42, 0xCE, 0x9F, + 0x42, 0xCE, 0xA0, 0x42, 0xCE, 0xA1, 0x42, 0xCE, + 0xA3, 0x42, 0xCE, 0xA4, 0x42, 0xCE, 0xA5, 0x42, + 0xCE, 0xA6, 0x42, 0xCE, 0xA7, 0x42, 0xCE, 0xA8, + 0x42, 0xCE, 0xA9, 0x42, 0xCE, 0xB1, 0x42, 0xCE, + // Bytes 1c0 - 1ff + 0xB2, 0x42, 0xCE, 0xB3, 0x42, 0xCE, 0xB4, 0x42, + 0xCE, 0xB5, 0x42, 0xCE, 0xB6, 0x42, 0xCE, 0xB7, + 0x42, 0xCE, 0xB8, 0x42, 0xCE, 0xB9, 0x42, 0xCE, + 0xBA, 0x42, 0xCE, 0xBB, 0x42, 0xCE, 0xBC, 0x42, + 0xCE, 0xBD, 0x42, 0xCE, 0xBE, 0x42, 0xCE, 0xBF, + 0x42, 0xCF, 0x80, 0x42, 0xCF, 0x81, 0x42, 0xCF, + 0x82, 0x42, 0xCF, 0x83, 0x42, 0xCF, 0x84, 0x42, + 0xCF, 0x85, 0x42, 0xCF, 0x86, 0x42, 0xCF, 0x87, + // Bytes 200 - 23f + 0x42, 0xCF, 0x88, 0x42, 0xCF, 0x89, 0x42, 0xCF, + 0x9C, 0x42, 0xCF, 0x9D, 0x42, 0xD0, 0xBD, 0x42, + 0xD1, 0x8A, 0x42, 0xD1, 0x8C, 0x42, 0xD7, 0x90, + 0x42, 0xD7, 0x91, 0x42, 0xD7, 0x92, 0x42, 0xD7, + 0x93, 0x42, 0xD7, 0x94, 0x42, 0xD7, 0x9B, 0x42, + 0xD7, 0x9C, 0x42, 0xD7, 0x9D, 0x42, 0xD7, 0xA2, + 0x42, 0xD7, 0xA8, 0x42, 0xD7, 0xAA, 0x42, 0xD8, + 0xA1, 0x42, 0xD8, 0xA7, 0x42, 0xD8, 0xA8, 0x42, + // Bytes 240 - 27f + 0xD8, 0xA9, 0x42, 0xD8, 0xAA, 0x42, 0xD8, 0xAB, + 0x42, 0xD8, 0xAC, 0x42, 0xD8, 0xAD, 0x42, 0xD8, + 0xAE, 0x42, 0xD8, 0xAF, 0x42, 0xD8, 0xB0, 0x42, + 0xD8, 0xB1, 0x42, 0xD8, 0xB2, 0x42, 0xD8, 0xB3, + 0x42, 0xD8, 0xB4, 0x42, 0xD8, 0xB5, 0x42, 0xD8, + 0xB6, 0x42, 0xD8, 0xB7, 0x42, 0xD8, 0xB8, 0x42, + 0xD8, 0xB9, 0x42, 0xD8, 0xBA, 0x42, 0xD9, 0x81, + 0x42, 0xD9, 0x82, 0x42, 0xD9, 0x83, 0x42, 0xD9, + // Bytes 280 - 2bf + 0x84, 0x42, 0xD9, 0x85, 0x42, 0xD9, 0x86, 0x42, + 0xD9, 0x87, 0x42, 0xD9, 0x88, 0x42, 0xD9, 0x89, + 0x42, 0xD9, 0x8A, 0x42, 0xD9, 0xAE, 0x42, 0xD9, + 0xAF, 0x42, 0xD9, 0xB1, 0x42, 0xD9, 0xB9, 0x42, + 0xD9, 0xBA, 0x42, 0xD9, 0xBB, 0x42, 0xD9, 0xBE, + 0x42, 0xD9, 0xBF, 0x42, 0xDA, 0x80, 0x42, 0xDA, + 0x83, 0x42, 0xDA, 0x84, 0x42, 0xDA, 0x86, 0x42, + 0xDA, 0x87, 0x42, 0xDA, 0x88, 0x42, 0xDA, 0x8C, + // Bytes 2c0 - 2ff + 0x42, 0xDA, 0x8D, 0x42, 0xDA, 0x8E, 0x42, 0xDA, + 0x91, 0x42, 0xDA, 0x98, 0x42, 0xDA, 0xA1, 0x42, + 0xDA, 0xA4, 0x42, 0xDA, 0xA6, 0x42, 0xDA, 0xA9, + 0x42, 0xDA, 0xAD, 0x42, 0xDA, 0xAF, 0x42, 0xDA, + 0xB1, 0x42, 0xDA, 0xB3, 0x42, 0xDA, 0xBA, 0x42, + 0xDA, 0xBB, 0x42, 0xDA, 0xBE, 0x42, 0xDB, 0x81, + 0x42, 0xDB, 0x85, 0x42, 0xDB, 0x86, 0x42, 0xDB, + 0x87, 0x42, 0xDB, 0x88, 0x42, 0xDB, 0x89, 0x42, + // Bytes 300 - 33f + 0xDB, 0x8B, 0x42, 0xDB, 0x8C, 0x42, 0xDB, 0x90, + 0x42, 0xDB, 0x92, 0x43, 0xE0, 0xBC, 0x8B, 0x43, + 0xE1, 0x83, 0x9C, 0x43, 0xE1, 0x84, 0x80, 0x43, + 0xE1, 0x84, 0x81, 0x43, 0xE1, 0x84, 0x82, 0x43, + 0xE1, 0x84, 0x83, 0x43, 0xE1, 0x84, 0x84, 0x43, + 0xE1, 0x84, 0x85, 0x43, 0xE1, 0x84, 0x86, 0x43, + 0xE1, 0x84, 0x87, 0x43, 0xE1, 0x84, 0x88, 0x43, + 0xE1, 0x84, 0x89, 0x43, 0xE1, 0x84, 0x8A, 0x43, + // Bytes 340 - 37f + 0xE1, 0x84, 0x8B, 0x43, 0xE1, 0x84, 0x8C, 0x43, + 0xE1, 0x84, 0x8D, 0x43, 0xE1, 0x84, 0x8E, 0x43, + 0xE1, 0x84, 0x8F, 0x43, 0xE1, 0x84, 0x90, 0x43, + 0xE1, 0x84, 0x91, 0x43, 0xE1, 0x84, 0x92, 0x43, + 0xE1, 0x84, 0x94, 0x43, 0xE1, 0x84, 0x95, 0x43, + 0xE1, 0x84, 0x9A, 0x43, 0xE1, 0x84, 0x9C, 0x43, + 0xE1, 0x84, 0x9D, 0x43, 0xE1, 0x84, 0x9E, 0x43, + 0xE1, 0x84, 0xA0, 0x43, 0xE1, 0x84, 0xA1, 0x43, + // Bytes 380 - 3bf + 0xE1, 0x84, 0xA2, 0x43, 0xE1, 0x84, 0xA3, 0x43, + 0xE1, 0x84, 0xA7, 0x43, 0xE1, 0x84, 0xA9, 0x43, + 0xE1, 0x84, 0xAB, 0x43, 0xE1, 0x84, 0xAC, 0x43, + 0xE1, 0x84, 0xAD, 0x43, 0xE1, 0x84, 0xAE, 0x43, + 0xE1, 0x84, 0xAF, 0x43, 0xE1, 0x84, 0xB2, 0x43, + 0xE1, 0x84, 0xB6, 0x43, 0xE1, 0x85, 0x80, 0x43, + 0xE1, 0x85, 0x87, 0x43, 0xE1, 0x85, 0x8C, 0x43, + 0xE1, 0x85, 0x97, 0x43, 0xE1, 0x85, 0x98, 0x43, + // Bytes 3c0 - 3ff + 0xE1, 0x85, 0x99, 0x43, 0xE1, 0x85, 0xA0, 0x43, + 0xE1, 0x86, 0x84, 0x43, 0xE1, 0x86, 0x85, 0x43, + 0xE1, 0x86, 0x88, 0x43, 0xE1, 0x86, 0x91, 0x43, + 0xE1, 0x86, 0x92, 0x43, 0xE1, 0x86, 0x94, 0x43, + 0xE1, 0x86, 0x9E, 0x43, 0xE1, 0x86, 0xA1, 0x43, + 0xE1, 0x87, 0x87, 0x43, 0xE1, 0x87, 0x88, 0x43, + 0xE1, 0x87, 0x8C, 0x43, 0xE1, 0x87, 0x8E, 0x43, + 0xE1, 0x87, 0x93, 0x43, 0xE1, 0x87, 0x97, 0x43, + // Bytes 400 - 43f + 0xE1, 0x87, 0x99, 0x43, 0xE1, 0x87, 0x9D, 0x43, + 0xE1, 0x87, 0x9F, 0x43, 0xE1, 0x87, 0xB1, 0x43, + 0xE1, 0x87, 0xB2, 0x43, 0xE1, 0xB4, 0x82, 0x43, + 0xE1, 0xB4, 0x96, 0x43, 0xE1, 0xB4, 0x97, 0x43, + 0xE1, 0xB4, 0x9C, 0x43, 0xE1, 0xB4, 0x9D, 0x43, + 0xE1, 0xB4, 0xA5, 0x43, 0xE1, 0xB5, 0xBB, 0x43, + 0xE1, 0xB6, 0x85, 0x43, 0xE2, 0x80, 0x82, 0x43, + 0xE2, 0x80, 0x83, 0x43, 0xE2, 0x80, 0x90, 0x43, + // Bytes 440 - 47f + 0xE2, 0x80, 0x93, 0x43, 0xE2, 0x80, 0x94, 0x43, + 0xE2, 0x82, 0xA9, 0x43, 0xE2, 0x86, 0x90, 0x43, + 0xE2, 0x86, 0x91, 0x43, 0xE2, 0x86, 0x92, 0x43, + 0xE2, 0x86, 0x93, 0x43, 0xE2, 0x88, 0x82, 0x43, + 0xE2, 0x88, 0x87, 0x43, 0xE2, 0x88, 0x91, 0x43, + 0xE2, 0x88, 0x92, 0x43, 0xE2, 0x94, 0x82, 0x43, + 0xE2, 0x96, 0xA0, 0x43, 0xE2, 0x97, 0x8B, 0x43, + 0xE2, 0xA6, 0x85, 0x43, 0xE2, 0xA6, 0x86, 0x43, + // Bytes 480 - 4bf + 0xE2, 0xB5, 0xA1, 0x43, 0xE3, 0x80, 0x81, 0x43, + 0xE3, 0x80, 0x82, 0x43, 0xE3, 0x80, 0x88, 0x43, + 0xE3, 0x80, 0x89, 0x43, 0xE3, 0x80, 0x8A, 0x43, + 0xE3, 0x80, 0x8B, 0x43, 0xE3, 0x80, 0x8C, 0x43, + 0xE3, 0x80, 0x8D, 0x43, 0xE3, 0x80, 0x8E, 0x43, + 0xE3, 0x80, 0x8F, 0x43, 0xE3, 0x80, 0x90, 0x43, + 0xE3, 0x80, 0x91, 0x43, 0xE3, 0x80, 0x92, 0x43, + 0xE3, 0x80, 0x94, 0x43, 0xE3, 0x80, 0x95, 0x43, + // Bytes 4c0 - 4ff + 0xE3, 0x80, 0x96, 0x43, 0xE3, 0x80, 0x97, 0x43, + 0xE3, 0x82, 0xA1, 0x43, 0xE3, 0x82, 0xA2, 0x43, + 0xE3, 0x82, 0xA3, 0x43, 0xE3, 0x82, 0xA4, 0x43, + 0xE3, 0x82, 0xA5, 0x43, 0xE3, 0x82, 0xA6, 0x43, + 0xE3, 0x82, 0xA7, 0x43, 0xE3, 0x82, 0xA8, 0x43, + 0xE3, 0x82, 0xA9, 0x43, 0xE3, 0x82, 0xAA, 0x43, + 0xE3, 0x82, 0xAB, 0x43, 0xE3, 0x82, 0xAD, 0x43, + 0xE3, 0x82, 0xAF, 0x43, 0xE3, 0x82, 0xB1, 0x43, + // Bytes 500 - 53f + 0xE3, 0x82, 0xB3, 0x43, 0xE3, 0x82, 0xB5, 0x43, + 0xE3, 0x82, 0xB7, 0x43, 0xE3, 0x82, 0xB9, 0x43, + 0xE3, 0x82, 0xBB, 0x43, 0xE3, 0x82, 0xBD, 0x43, + 0xE3, 0x82, 0xBF, 0x43, 0xE3, 0x83, 0x81, 0x43, + 0xE3, 0x83, 0x83, 0x43, 0xE3, 0x83, 0x84, 0x43, + 0xE3, 0x83, 0x86, 0x43, 0xE3, 0x83, 0x88, 0x43, + 0xE3, 0x83, 0x8A, 0x43, 0xE3, 0x83, 0x8B, 0x43, + 0xE3, 0x83, 0x8C, 0x43, 0xE3, 0x83, 0x8D, 0x43, + // Bytes 540 - 57f + 0xE3, 0x83, 0x8E, 0x43, 0xE3, 0x83, 0x8F, 0x43, + 0xE3, 0x83, 0x92, 0x43, 0xE3, 0x83, 0x95, 0x43, + 0xE3, 0x83, 0x98, 0x43, 0xE3, 0x83, 0x9B, 0x43, + 0xE3, 0x83, 0x9E, 0x43, 0xE3, 0x83, 0x9F, 0x43, + 0xE3, 0x83, 0xA0, 0x43, 0xE3, 0x83, 0xA1, 0x43, + 0xE3, 0x83, 0xA2, 0x43, 0xE3, 0x83, 0xA3, 0x43, + 0xE3, 0x83, 0xA4, 0x43, 0xE3, 0x83, 0xA5, 0x43, + 0xE3, 0x83, 0xA6, 0x43, 0xE3, 0x83, 0xA7, 0x43, + // Bytes 580 - 5bf + 0xE3, 0x83, 0xA8, 0x43, 0xE3, 0x83, 0xA9, 0x43, + 0xE3, 0x83, 0xAA, 0x43, 0xE3, 0x83, 0xAB, 0x43, + 0xE3, 0x83, 0xAC, 0x43, 0xE3, 0x83, 0xAD, 0x43, + 0xE3, 0x83, 0xAF, 0x43, 0xE3, 0x83, 0xB0, 0x43, + 0xE3, 0x83, 0xB1, 0x43, 0xE3, 0x83, 0xB2, 0x43, + 0xE3, 0x83, 0xB3, 0x43, 0xE3, 0x83, 0xBB, 0x43, + 0xE3, 0x83, 0xBC, 0x43, 0xE3, 0x92, 0x9E, 0x43, + 0xE3, 0x92, 0xB9, 0x43, 0xE3, 0x92, 0xBB, 0x43, + // Bytes 5c0 - 5ff + 0xE3, 0x93, 0x9F, 0x43, 0xE3, 0x94, 0x95, 0x43, + 0xE3, 0x9B, 0xAE, 0x43, 0xE3, 0x9B, 0xBC, 0x43, + 0xE3, 0x9E, 0x81, 0x43, 0xE3, 0xA0, 0xAF, 0x43, + 0xE3, 0xA1, 0xA2, 0x43, 0xE3, 0xA1, 0xBC, 0x43, + 0xE3, 0xA3, 0x87, 0x43, 0xE3, 0xA3, 0xA3, 0x43, + 0xE3, 0xA4, 0x9C, 0x43, 0xE3, 0xA4, 0xBA, 0x43, + 0xE3, 0xA8, 0xAE, 0x43, 0xE3, 0xA9, 0xAC, 0x43, + 0xE3, 0xAB, 0xA4, 0x43, 0xE3, 0xAC, 0x88, 0x43, + // Bytes 600 - 63f + 0xE3, 0xAC, 0x99, 0x43, 0xE3, 0xAD, 0x89, 0x43, + 0xE3, 0xAE, 0x9D, 0x43, 0xE3, 0xB0, 0x98, 0x43, + 0xE3, 0xB1, 0x8E, 0x43, 0xE3, 0xB4, 0xB3, 0x43, + 0xE3, 0xB6, 0x96, 0x43, 0xE3, 0xBA, 0xAC, 0x43, + 0xE3, 0xBA, 0xB8, 0x43, 0xE3, 0xBC, 0x9B, 0x43, + 0xE3, 0xBF, 0xBC, 0x43, 0xE4, 0x80, 0x88, 0x43, + 0xE4, 0x80, 0x98, 0x43, 0xE4, 0x80, 0xB9, 0x43, + 0xE4, 0x81, 0x86, 0x43, 0xE4, 0x82, 0x96, 0x43, + // Bytes 640 - 67f + 0xE4, 0x83, 0xA3, 0x43, 0xE4, 0x84, 0xAF, 0x43, + 0xE4, 0x88, 0x82, 0x43, 0xE4, 0x88, 0xA7, 0x43, + 0xE4, 0x8A, 0xA0, 0x43, 0xE4, 0x8C, 0x81, 0x43, + 0xE4, 0x8C, 0xB4, 0x43, 0xE4, 0x8D, 0x99, 0x43, + 0xE4, 0x8F, 0x95, 0x43, 0xE4, 0x8F, 0x99, 0x43, + 0xE4, 0x90, 0x8B, 0x43, 0xE4, 0x91, 0xAB, 0x43, + 0xE4, 0x94, 0xAB, 0x43, 0xE4, 0x95, 0x9D, 0x43, + 0xE4, 0x95, 0xA1, 0x43, 0xE4, 0x95, 0xAB, 0x43, + // Bytes 680 - 6bf + 0xE4, 0x97, 0x97, 0x43, 0xE4, 0x97, 0xB9, 0x43, + 0xE4, 0x98, 0xB5, 0x43, 0xE4, 0x9A, 0xBE, 0x43, + 0xE4, 0x9B, 0x87, 0x43, 0xE4, 0xA6, 0x95, 0x43, + 0xE4, 0xA7, 0xA6, 0x43, 0xE4, 0xA9, 0xAE, 0x43, + 0xE4, 0xA9, 0xB6, 0x43, 0xE4, 0xAA, 0xB2, 0x43, + 0xE4, 0xAC, 0xB3, 0x43, 0xE4, 0xAF, 0x8E, 0x43, + 0xE4, 0xB3, 0x8E, 0x43, 0xE4, 0xB3, 0xAD, 0x43, + 0xE4, 0xB3, 0xB8, 0x43, 0xE4, 0xB5, 0x96, 0x43, + // Bytes 6c0 - 6ff + 0xE4, 0xB8, 0x80, 0x43, 0xE4, 0xB8, 0x81, 0x43, + 0xE4, 0xB8, 0x83, 0x43, 0xE4, 0xB8, 0x89, 0x43, + 0xE4, 0xB8, 0x8A, 0x43, 0xE4, 0xB8, 0x8B, 0x43, + 0xE4, 0xB8, 0x8D, 0x43, 0xE4, 0xB8, 0x99, 0x43, + 0xE4, 0xB8, 0xA6, 0x43, 0xE4, 0xB8, 0xA8, 0x43, + 0xE4, 0xB8, 0xAD, 0x43, 0xE4, 0xB8, 0xB2, 0x43, + 0xE4, 0xB8, 0xB6, 0x43, 0xE4, 0xB8, 0xB8, 0x43, + 0xE4, 0xB8, 0xB9, 0x43, 0xE4, 0xB8, 0xBD, 0x43, + // Bytes 700 - 73f + 0xE4, 0xB8, 0xBF, 0x43, 0xE4, 0xB9, 0x81, 0x43, + 0xE4, 0xB9, 0x99, 0x43, 0xE4, 0xB9, 0x9D, 0x43, + 0xE4, 0xBA, 0x82, 0x43, 0xE4, 0xBA, 0x85, 0x43, + 0xE4, 0xBA, 0x86, 0x43, 0xE4, 0xBA, 0x8C, 0x43, + 0xE4, 0xBA, 0x94, 0x43, 0xE4, 0xBA, 0xA0, 0x43, + 0xE4, 0xBA, 0xA4, 0x43, 0xE4, 0xBA, 0xAE, 0x43, + 0xE4, 0xBA, 0xBA, 0x43, 0xE4, 0xBB, 0x80, 0x43, + 0xE4, 0xBB, 0x8C, 0x43, 0xE4, 0xBB, 0xA4, 0x43, + // Bytes 740 - 77f + 0xE4, 0xBC, 0x81, 0x43, 0xE4, 0xBC, 0x91, 0x43, + 0xE4, 0xBD, 0xA0, 0x43, 0xE4, 0xBE, 0x80, 0x43, + 0xE4, 0xBE, 0x86, 0x43, 0xE4, 0xBE, 0x8B, 0x43, + 0xE4, 0xBE, 0xAE, 0x43, 0xE4, 0xBE, 0xBB, 0x43, + 0xE4, 0xBE, 0xBF, 0x43, 0xE5, 0x80, 0x82, 0x43, + 0xE5, 0x80, 0xAB, 0x43, 0xE5, 0x81, 0xBA, 0x43, + 0xE5, 0x82, 0x99, 0x43, 0xE5, 0x83, 0x8F, 0x43, + 0xE5, 0x83, 0x9A, 0x43, 0xE5, 0x83, 0xA7, 0x43, + // Bytes 780 - 7bf + 0xE5, 0x84, 0xAA, 0x43, 0xE5, 0x84, 0xBF, 0x43, + 0xE5, 0x85, 0x80, 0x43, 0xE5, 0x85, 0x85, 0x43, + 0xE5, 0x85, 0x8D, 0x43, 0xE5, 0x85, 0x94, 0x43, + 0xE5, 0x85, 0xA4, 0x43, 0xE5, 0x85, 0xA5, 0x43, + 0xE5, 0x85, 0xA7, 0x43, 0xE5, 0x85, 0xA8, 0x43, + 0xE5, 0x85, 0xA9, 0x43, 0xE5, 0x85, 0xAB, 0x43, + 0xE5, 0x85, 0xAD, 0x43, 0xE5, 0x85, 0xB7, 0x43, + 0xE5, 0x86, 0x80, 0x43, 0xE5, 0x86, 0x82, 0x43, + // Bytes 7c0 - 7ff + 0xE5, 0x86, 0x8D, 0x43, 0xE5, 0x86, 0x92, 0x43, + 0xE5, 0x86, 0x95, 0x43, 0xE5, 0x86, 0x96, 0x43, + 0xE5, 0x86, 0x97, 0x43, 0xE5, 0x86, 0x99, 0x43, + 0xE5, 0x86, 0xA4, 0x43, 0xE5, 0x86, 0xAB, 0x43, + 0xE5, 0x86, 0xAC, 0x43, 0xE5, 0x86, 0xB5, 0x43, + 0xE5, 0x86, 0xB7, 0x43, 0xE5, 0x87, 0x89, 0x43, + 0xE5, 0x87, 0x8C, 0x43, 0xE5, 0x87, 0x9C, 0x43, + 0xE5, 0x87, 0x9E, 0x43, 0xE5, 0x87, 0xA0, 0x43, + // Bytes 800 - 83f + 0xE5, 0x87, 0xB5, 0x43, 0xE5, 0x88, 0x80, 0x43, + 0xE5, 0x88, 0x83, 0x43, 0xE5, 0x88, 0x87, 0x43, + 0xE5, 0x88, 0x97, 0x43, 0xE5, 0x88, 0x9D, 0x43, + 0xE5, 0x88, 0xA9, 0x43, 0xE5, 0x88, 0xBA, 0x43, + 0xE5, 0x88, 0xBB, 0x43, 0xE5, 0x89, 0x86, 0x43, + 0xE5, 0x89, 0x8D, 0x43, 0xE5, 0x89, 0xB2, 0x43, + 0xE5, 0x89, 0xB7, 0x43, 0xE5, 0x8A, 0x89, 0x43, + 0xE5, 0x8A, 0x9B, 0x43, 0xE5, 0x8A, 0xA3, 0x43, + // Bytes 840 - 87f + 0xE5, 0x8A, 0xB3, 0x43, 0xE5, 0x8A, 0xB4, 0x43, + 0xE5, 0x8B, 0x87, 0x43, 0xE5, 0x8B, 0x89, 0x43, + 0xE5, 0x8B, 0x92, 0x43, 0xE5, 0x8B, 0x9E, 0x43, + 0xE5, 0x8B, 0xA4, 0x43, 0xE5, 0x8B, 0xB5, 0x43, + 0xE5, 0x8B, 0xB9, 0x43, 0xE5, 0x8B, 0xBA, 0x43, + 0xE5, 0x8C, 0x85, 0x43, 0xE5, 0x8C, 0x86, 0x43, + 0xE5, 0x8C, 0x95, 0x43, 0xE5, 0x8C, 0x97, 0x43, + 0xE5, 0x8C, 0x9A, 0x43, 0xE5, 0x8C, 0xB8, 0x43, + // Bytes 880 - 8bf + 0xE5, 0x8C, 0xBB, 0x43, 0xE5, 0x8C, 0xBF, 0x43, + 0xE5, 0x8D, 0x81, 0x43, 0xE5, 0x8D, 0x84, 0x43, + 0xE5, 0x8D, 0x85, 0x43, 0xE5, 0x8D, 0x89, 0x43, + 0xE5, 0x8D, 0x91, 0x43, 0xE5, 0x8D, 0x94, 0x43, + 0xE5, 0x8D, 0x9A, 0x43, 0xE5, 0x8D, 0x9C, 0x43, + 0xE5, 0x8D, 0xA9, 0x43, 0xE5, 0x8D, 0xB0, 0x43, + 0xE5, 0x8D, 0xB3, 0x43, 0xE5, 0x8D, 0xB5, 0x43, + 0xE5, 0x8D, 0xBD, 0x43, 0xE5, 0x8D, 0xBF, 0x43, + // Bytes 8c0 - 8ff + 0xE5, 0x8E, 0x82, 0x43, 0xE5, 0x8E, 0xB6, 0x43, + 0xE5, 0x8F, 0x83, 0x43, 0xE5, 0x8F, 0x88, 0x43, + 0xE5, 0x8F, 0x8A, 0x43, 0xE5, 0x8F, 0x8C, 0x43, + 0xE5, 0x8F, 0x9F, 0x43, 0xE5, 0x8F, 0xA3, 0x43, + 0xE5, 0x8F, 0xA5, 0x43, 0xE5, 0x8F, 0xAB, 0x43, + 0xE5, 0x8F, 0xAF, 0x43, 0xE5, 0x8F, 0xB1, 0x43, + 0xE5, 0x8F, 0xB3, 0x43, 0xE5, 0x90, 0x86, 0x43, + 0xE5, 0x90, 0x88, 0x43, 0xE5, 0x90, 0x8D, 0x43, + // Bytes 900 - 93f + 0xE5, 0x90, 0x8F, 0x43, 0xE5, 0x90, 0x9D, 0x43, + 0xE5, 0x90, 0xB8, 0x43, 0xE5, 0x90, 0xB9, 0x43, + 0xE5, 0x91, 0x82, 0x43, 0xE5, 0x91, 0x88, 0x43, + 0xE5, 0x91, 0xA8, 0x43, 0xE5, 0x92, 0x9E, 0x43, + 0xE5, 0x92, 0xA2, 0x43, 0xE5, 0x92, 0xBD, 0x43, + 0xE5, 0x93, 0xB6, 0x43, 0xE5, 0x94, 0x90, 0x43, + 0xE5, 0x95, 0x8F, 0x43, 0xE5, 0x95, 0x93, 0x43, + 0xE5, 0x95, 0x95, 0x43, 0xE5, 0x95, 0xA3, 0x43, + // Bytes 940 - 97f + 0xE5, 0x96, 0x84, 0x43, 0xE5, 0x96, 0x87, 0x43, + 0xE5, 0x96, 0x99, 0x43, 0xE5, 0x96, 0x9D, 0x43, + 0xE5, 0x96, 0xAB, 0x43, 0xE5, 0x96, 0xB3, 0x43, + 0xE5, 0x96, 0xB6, 0x43, 0xE5, 0x97, 0x80, 0x43, + 0xE5, 0x97, 0x82, 0x43, 0xE5, 0x97, 0xA2, 0x43, + 0xE5, 0x98, 0x86, 0x43, 0xE5, 0x99, 0x91, 0x43, + 0xE5, 0x99, 0xA8, 0x43, 0xE5, 0x99, 0xB4, 0x43, + 0xE5, 0x9B, 0x97, 0x43, 0xE5, 0x9B, 0x9B, 0x43, + // Bytes 980 - 9bf + 0xE5, 0x9B, 0xB9, 0x43, 0xE5, 0x9C, 0x96, 0x43, + 0xE5, 0x9C, 0x97, 0x43, 0xE5, 0x9C, 0x9F, 0x43, + 0xE5, 0x9C, 0xB0, 0x43, 0xE5, 0x9E, 0x8B, 0x43, + 0xE5, 0x9F, 0x8E, 0x43, 0xE5, 0x9F, 0xB4, 0x43, + 0xE5, 0xA0, 0x8D, 0x43, 0xE5, 0xA0, 0xB1, 0x43, + 0xE5, 0xA0, 0xB2, 0x43, 0xE5, 0xA1, 0x80, 0x43, + 0xE5, 0xA1, 0x9A, 0x43, 0xE5, 0xA1, 0x9E, 0x43, + 0xE5, 0xA2, 0xA8, 0x43, 0xE5, 0xA2, 0xAC, 0x43, + // Bytes 9c0 - 9ff + 0xE5, 0xA2, 0xB3, 0x43, 0xE5, 0xA3, 0x98, 0x43, + 0xE5, 0xA3, 0x9F, 0x43, 0xE5, 0xA3, 0xAB, 0x43, + 0xE5, 0xA3, 0xAE, 0x43, 0xE5, 0xA3, 0xB0, 0x43, + 0xE5, 0xA3, 0xB2, 0x43, 0xE5, 0xA3, 0xB7, 0x43, + 0xE5, 0xA4, 0x82, 0x43, 0xE5, 0xA4, 0x86, 0x43, + 0xE5, 0xA4, 0x8A, 0x43, 0xE5, 0xA4, 0x95, 0x43, + 0xE5, 0xA4, 0x9A, 0x43, 0xE5, 0xA4, 0x9C, 0x43, + 0xE5, 0xA4, 0xA2, 0x43, 0xE5, 0xA4, 0xA7, 0x43, + // Bytes a00 - a3f + 0xE5, 0xA4, 0xA9, 0x43, 0xE5, 0xA5, 0x84, 0x43, + 0xE5, 0xA5, 0x88, 0x43, 0xE5, 0xA5, 0x91, 0x43, + 0xE5, 0xA5, 0x94, 0x43, 0xE5, 0xA5, 0xA2, 0x43, + 0xE5, 0xA5, 0xB3, 0x43, 0xE5, 0xA7, 0x98, 0x43, + 0xE5, 0xA7, 0xAC, 0x43, 0xE5, 0xA8, 0x9B, 0x43, + 0xE5, 0xA8, 0xA7, 0x43, 0xE5, 0xA9, 0xA2, 0x43, + 0xE5, 0xA9, 0xA6, 0x43, 0xE5, 0xAA, 0xB5, 0x43, + 0xE5, 0xAC, 0x88, 0x43, 0xE5, 0xAC, 0xA8, 0x43, + // Bytes a40 - a7f + 0xE5, 0xAC, 0xBE, 0x43, 0xE5, 0xAD, 0x90, 0x43, + 0xE5, 0xAD, 0x97, 0x43, 0xE5, 0xAD, 0xA6, 0x43, + 0xE5, 0xAE, 0x80, 0x43, 0xE5, 0xAE, 0x85, 0x43, + 0xE5, 0xAE, 0x97, 0x43, 0xE5, 0xAF, 0x83, 0x43, + 0xE5, 0xAF, 0x98, 0x43, 0xE5, 0xAF, 0xA7, 0x43, + 0xE5, 0xAF, 0xAE, 0x43, 0xE5, 0xAF, 0xB3, 0x43, + 0xE5, 0xAF, 0xB8, 0x43, 0xE5, 0xAF, 0xBF, 0x43, + 0xE5, 0xB0, 0x86, 0x43, 0xE5, 0xB0, 0x8F, 0x43, + // Bytes a80 - abf + 0xE5, 0xB0, 0xA2, 0x43, 0xE5, 0xB0, 0xB8, 0x43, + 0xE5, 0xB0, 0xBF, 0x43, 0xE5, 0xB1, 0xA0, 0x43, + 0xE5, 0xB1, 0xA2, 0x43, 0xE5, 0xB1, 0xA4, 0x43, + 0xE5, 0xB1, 0xA5, 0x43, 0xE5, 0xB1, 0xAE, 0x43, + 0xE5, 0xB1, 0xB1, 0x43, 0xE5, 0xB2, 0x8D, 0x43, + 0xE5, 0xB3, 0x80, 0x43, 0xE5, 0xB4, 0x99, 0x43, + 0xE5, 0xB5, 0x83, 0x43, 0xE5, 0xB5, 0x90, 0x43, + 0xE5, 0xB5, 0xAB, 0x43, 0xE5, 0xB5, 0xAE, 0x43, + // Bytes ac0 - aff + 0xE5, 0xB5, 0xBC, 0x43, 0xE5, 0xB6, 0xB2, 0x43, + 0xE5, 0xB6, 0xBA, 0x43, 0xE5, 0xB7, 0x9B, 0x43, + 0xE5, 0xB7, 0xA1, 0x43, 0xE5, 0xB7, 0xA2, 0x43, + 0xE5, 0xB7, 0xA5, 0x43, 0xE5, 0xB7, 0xA6, 0x43, + 0xE5, 0xB7, 0xB1, 0x43, 0xE5, 0xB7, 0xBD, 0x43, + 0xE5, 0xB7, 0xBE, 0x43, 0xE5, 0xB8, 0xA8, 0x43, + 0xE5, 0xB8, 0xBD, 0x43, 0xE5, 0xB9, 0xA9, 0x43, + 0xE5, 0xB9, 0xB2, 0x43, 0xE5, 0xB9, 0xB4, 0x43, + // Bytes b00 - b3f + 0xE5, 0xB9, 0xBA, 0x43, 0xE5, 0xB9, 0xBC, 0x43, + 0xE5, 0xB9, 0xBF, 0x43, 0xE5, 0xBA, 0xA6, 0x43, + 0xE5, 0xBA, 0xB0, 0x43, 0xE5, 0xBA, 0xB3, 0x43, + 0xE5, 0xBA, 0xB6, 0x43, 0xE5, 0xBB, 0x89, 0x43, + 0xE5, 0xBB, 0x8A, 0x43, 0xE5, 0xBB, 0x92, 0x43, + 0xE5, 0xBB, 0x93, 0x43, 0xE5, 0xBB, 0x99, 0x43, + 0xE5, 0xBB, 0xAC, 0x43, 0xE5, 0xBB, 0xB4, 0x43, + 0xE5, 0xBB, 0xBE, 0x43, 0xE5, 0xBC, 0x84, 0x43, + // Bytes b40 - b7f + 0xE5, 0xBC, 0x8B, 0x43, 0xE5, 0xBC, 0x93, 0x43, + 0xE5, 0xBC, 0xA2, 0x43, 0xE5, 0xBD, 0x90, 0x43, + 0xE5, 0xBD, 0x93, 0x43, 0xE5, 0xBD, 0xA1, 0x43, + 0xE5, 0xBD, 0xA2, 0x43, 0xE5, 0xBD, 0xA9, 0x43, + 0xE5, 0xBD, 0xAB, 0x43, 0xE5, 0xBD, 0xB3, 0x43, + 0xE5, 0xBE, 0x8B, 0x43, 0xE5, 0xBE, 0x8C, 0x43, + 0xE5, 0xBE, 0x97, 0x43, 0xE5, 0xBE, 0x9A, 0x43, + 0xE5, 0xBE, 0xA9, 0x43, 0xE5, 0xBE, 0xAD, 0x43, + // Bytes b80 - bbf + 0xE5, 0xBF, 0x83, 0x43, 0xE5, 0xBF, 0x8D, 0x43, + 0xE5, 0xBF, 0x97, 0x43, 0xE5, 0xBF, 0xB5, 0x43, + 0xE5, 0xBF, 0xB9, 0x43, 0xE6, 0x80, 0x92, 0x43, + 0xE6, 0x80, 0x9C, 0x43, 0xE6, 0x81, 0xB5, 0x43, + 0xE6, 0x82, 0x81, 0x43, 0xE6, 0x82, 0x94, 0x43, + 0xE6, 0x83, 0x87, 0x43, 0xE6, 0x83, 0x98, 0x43, + 0xE6, 0x83, 0xA1, 0x43, 0xE6, 0x84, 0x88, 0x43, + 0xE6, 0x85, 0x84, 0x43, 0xE6, 0x85, 0x88, 0x43, + // Bytes bc0 - bff + 0xE6, 0x85, 0x8C, 0x43, 0xE6, 0x85, 0x8E, 0x43, + 0xE6, 0x85, 0xA0, 0x43, 0xE6, 0x85, 0xA8, 0x43, + 0xE6, 0x85, 0xBA, 0x43, 0xE6, 0x86, 0x8E, 0x43, + 0xE6, 0x86, 0x90, 0x43, 0xE6, 0x86, 0xA4, 0x43, + 0xE6, 0x86, 0xAF, 0x43, 0xE6, 0x86, 0xB2, 0x43, + 0xE6, 0x87, 0x9E, 0x43, 0xE6, 0x87, 0xB2, 0x43, + 0xE6, 0x87, 0xB6, 0x43, 0xE6, 0x88, 0x80, 0x43, + 0xE6, 0x88, 0x88, 0x43, 0xE6, 0x88, 0x90, 0x43, + // Bytes c00 - c3f + 0xE6, 0x88, 0x9B, 0x43, 0xE6, 0x88, 0xAE, 0x43, + 0xE6, 0x88, 0xB4, 0x43, 0xE6, 0x88, 0xB6, 0x43, + 0xE6, 0x89, 0x8B, 0x43, 0xE6, 0x89, 0x93, 0x43, + 0xE6, 0x89, 0x9D, 0x43, 0xE6, 0x8A, 0x95, 0x43, + 0xE6, 0x8A, 0xB1, 0x43, 0xE6, 0x8B, 0x89, 0x43, + 0xE6, 0x8B, 0x8F, 0x43, 0xE6, 0x8B, 0x93, 0x43, + 0xE6, 0x8B, 0x94, 0x43, 0xE6, 0x8B, 0xBC, 0x43, + 0xE6, 0x8B, 0xBE, 0x43, 0xE6, 0x8C, 0x87, 0x43, + // Bytes c40 - c7f + 0xE6, 0x8C, 0xBD, 0x43, 0xE6, 0x8D, 0x90, 0x43, + 0xE6, 0x8D, 0x95, 0x43, 0xE6, 0x8D, 0xA8, 0x43, + 0xE6, 0x8D, 0xBB, 0x43, 0xE6, 0x8E, 0x83, 0x43, + 0xE6, 0x8E, 0xA0, 0x43, 0xE6, 0x8E, 0xA9, 0x43, + 0xE6, 0x8F, 0x84, 0x43, 0xE6, 0x8F, 0x85, 0x43, + 0xE6, 0x8F, 0xA4, 0x43, 0xE6, 0x90, 0x9C, 0x43, + 0xE6, 0x90, 0xA2, 0x43, 0xE6, 0x91, 0x92, 0x43, + 0xE6, 0x91, 0xA9, 0x43, 0xE6, 0x91, 0xB7, 0x43, + // Bytes c80 - cbf + 0xE6, 0x91, 0xBE, 0x43, 0xE6, 0x92, 0x9A, 0x43, + 0xE6, 0x92, 0x9D, 0x43, 0xE6, 0x93, 0x84, 0x43, + 0xE6, 0x94, 0xAF, 0x43, 0xE6, 0x94, 0xB4, 0x43, + 0xE6, 0x95, 0x8F, 0x43, 0xE6, 0x95, 0x96, 0x43, + 0xE6, 0x95, 0xAC, 0x43, 0xE6, 0x95, 0xB8, 0x43, + 0xE6, 0x96, 0x87, 0x43, 0xE6, 0x96, 0x97, 0x43, + 0xE6, 0x96, 0x99, 0x43, 0xE6, 0x96, 0xA4, 0x43, + 0xE6, 0x96, 0xB0, 0x43, 0xE6, 0x96, 0xB9, 0x43, + // Bytes cc0 - cff + 0xE6, 0x97, 0x85, 0x43, 0xE6, 0x97, 0xA0, 0x43, + 0xE6, 0x97, 0xA2, 0x43, 0xE6, 0x97, 0xA3, 0x43, + 0xE6, 0x97, 0xA5, 0x43, 0xE6, 0x98, 0x93, 0x43, + 0xE6, 0x98, 0xA0, 0x43, 0xE6, 0x99, 0x89, 0x43, + 0xE6, 0x99, 0xB4, 0x43, 0xE6, 0x9A, 0x88, 0x43, + 0xE6, 0x9A, 0x91, 0x43, 0xE6, 0x9A, 0x9C, 0x43, + 0xE6, 0x9A, 0xB4, 0x43, 0xE6, 0x9B, 0x86, 0x43, + 0xE6, 0x9B, 0xB0, 0x43, 0xE6, 0x9B, 0xB4, 0x43, + // Bytes d00 - d3f + 0xE6, 0x9B, 0xB8, 0x43, 0xE6, 0x9C, 0x80, 0x43, + 0xE6, 0x9C, 0x88, 0x43, 0xE6, 0x9C, 0x89, 0x43, + 0xE6, 0x9C, 0x97, 0x43, 0xE6, 0x9C, 0x9B, 0x43, + 0xE6, 0x9C, 0xA1, 0x43, 0xE6, 0x9C, 0xA8, 0x43, + 0xE6, 0x9D, 0x8E, 0x43, 0xE6, 0x9D, 0x93, 0x43, + 0xE6, 0x9D, 0x96, 0x43, 0xE6, 0x9D, 0x9E, 0x43, + 0xE6, 0x9D, 0xBB, 0x43, 0xE6, 0x9E, 0x85, 0x43, + 0xE6, 0x9E, 0x97, 0x43, 0xE6, 0x9F, 0xB3, 0x43, + // Bytes d40 - d7f + 0xE6, 0x9F, 0xBA, 0x43, 0xE6, 0xA0, 0x97, 0x43, + 0xE6, 0xA0, 0x9F, 0x43, 0xE6, 0xA0, 0xAA, 0x43, + 0xE6, 0xA1, 0x92, 0x43, 0xE6, 0xA2, 0x81, 0x43, + 0xE6, 0xA2, 0x85, 0x43, 0xE6, 0xA2, 0x8E, 0x43, + 0xE6, 0xA2, 0xA8, 0x43, 0xE6, 0xA4, 0x94, 0x43, + 0xE6, 0xA5, 0x82, 0x43, 0xE6, 0xA6, 0xA3, 0x43, + 0xE6, 0xA7, 0xAA, 0x43, 0xE6, 0xA8, 0x82, 0x43, + 0xE6, 0xA8, 0x93, 0x43, 0xE6, 0xAA, 0xA8, 0x43, + // Bytes d80 - dbf + 0xE6, 0xAB, 0x93, 0x43, 0xE6, 0xAB, 0x9B, 0x43, + 0xE6, 0xAC, 0x84, 0x43, 0xE6, 0xAC, 0xA0, 0x43, + 0xE6, 0xAC, 0xA1, 0x43, 0xE6, 0xAD, 0x94, 0x43, + 0xE6, 0xAD, 0xA2, 0x43, 0xE6, 0xAD, 0xA3, 0x43, + 0xE6, 0xAD, 0xB2, 0x43, 0xE6, 0xAD, 0xB7, 0x43, + 0xE6, 0xAD, 0xB9, 0x43, 0xE6, 0xAE, 0x9F, 0x43, + 0xE6, 0xAE, 0xAE, 0x43, 0xE6, 0xAE, 0xB3, 0x43, + 0xE6, 0xAE, 0xBA, 0x43, 0xE6, 0xAE, 0xBB, 0x43, + // Bytes dc0 - dff + 0xE6, 0xAF, 0x8B, 0x43, 0xE6, 0xAF, 0x8D, 0x43, + 0xE6, 0xAF, 0x94, 0x43, 0xE6, 0xAF, 0x9B, 0x43, + 0xE6, 0xB0, 0x8F, 0x43, 0xE6, 0xB0, 0x94, 0x43, + 0xE6, 0xB0, 0xB4, 0x43, 0xE6, 0xB1, 0x8E, 0x43, + 0xE6, 0xB1, 0xA7, 0x43, 0xE6, 0xB2, 0x88, 0x43, + 0xE6, 0xB2, 0xBF, 0x43, 0xE6, 0xB3, 0x8C, 0x43, + 0xE6, 0xB3, 0x8D, 0x43, 0xE6, 0xB3, 0xA5, 0x43, + 0xE6, 0xB3, 0xA8, 0x43, 0xE6, 0xB4, 0x96, 0x43, + // Bytes e00 - e3f + 0xE6, 0xB4, 0x9B, 0x43, 0xE6, 0xB4, 0x9E, 0x43, + 0xE6, 0xB4, 0xB4, 0x43, 0xE6, 0xB4, 0xBE, 0x43, + 0xE6, 0xB5, 0x81, 0x43, 0xE6, 0xB5, 0xA9, 0x43, + 0xE6, 0xB5, 0xAA, 0x43, 0xE6, 0xB5, 0xB7, 0x43, + 0xE6, 0xB5, 0xB8, 0x43, 0xE6, 0xB6, 0x85, 0x43, + 0xE6, 0xB7, 0x8B, 0x43, 0xE6, 0xB7, 0x9A, 0x43, + 0xE6, 0xB7, 0xAA, 0x43, 0xE6, 0xB7, 0xB9, 0x43, + 0xE6, 0xB8, 0x9A, 0x43, 0xE6, 0xB8, 0xAF, 0x43, + // Bytes e40 - e7f + 0xE6, 0xB9, 0xAE, 0x43, 0xE6, 0xBA, 0x80, 0x43, + 0xE6, 0xBA, 0x9C, 0x43, 0xE6, 0xBA, 0xBA, 0x43, + 0xE6, 0xBB, 0x87, 0x43, 0xE6, 0xBB, 0x8B, 0x43, + 0xE6, 0xBB, 0x91, 0x43, 0xE6, 0xBB, 0x9B, 0x43, + 0xE6, 0xBC, 0x8F, 0x43, 0xE6, 0xBC, 0x94, 0x43, + 0xE6, 0xBC, 0xA2, 0x43, 0xE6, 0xBC, 0xA3, 0x43, + 0xE6, 0xBD, 0xAE, 0x43, 0xE6, 0xBF, 0x86, 0x43, + 0xE6, 0xBF, 0xAB, 0x43, 0xE6, 0xBF, 0xBE, 0x43, + // Bytes e80 - ebf + 0xE7, 0x80, 0x9B, 0x43, 0xE7, 0x80, 0x9E, 0x43, + 0xE7, 0x80, 0xB9, 0x43, 0xE7, 0x81, 0x8A, 0x43, + 0xE7, 0x81, 0xAB, 0x43, 0xE7, 0x81, 0xB0, 0x43, + 0xE7, 0x81, 0xB7, 0x43, 0xE7, 0x81, 0xBD, 0x43, + 0xE7, 0x82, 0x99, 0x43, 0xE7, 0x82, 0xAD, 0x43, + 0xE7, 0x83, 0x88, 0x43, 0xE7, 0x83, 0x99, 0x43, + 0xE7, 0x84, 0xA1, 0x43, 0xE7, 0x85, 0x85, 0x43, + 0xE7, 0x85, 0x89, 0x43, 0xE7, 0x85, 0xAE, 0x43, + // Bytes ec0 - eff + 0xE7, 0x86, 0x9C, 0x43, 0xE7, 0x87, 0x8E, 0x43, + 0xE7, 0x87, 0x90, 0x43, 0xE7, 0x88, 0x90, 0x43, + 0xE7, 0x88, 0x9B, 0x43, 0xE7, 0x88, 0xA8, 0x43, + 0xE7, 0x88, 0xAA, 0x43, 0xE7, 0x88, 0xAB, 0x43, + 0xE7, 0x88, 0xB5, 0x43, 0xE7, 0x88, 0xB6, 0x43, + 0xE7, 0x88, 0xBB, 0x43, 0xE7, 0x88, 0xBF, 0x43, + 0xE7, 0x89, 0x87, 0x43, 0xE7, 0x89, 0x90, 0x43, + 0xE7, 0x89, 0x99, 0x43, 0xE7, 0x89, 0x9B, 0x43, + // Bytes f00 - f3f + 0xE7, 0x89, 0xA2, 0x43, 0xE7, 0x89, 0xB9, 0x43, + 0xE7, 0x8A, 0x80, 0x43, 0xE7, 0x8A, 0x95, 0x43, + 0xE7, 0x8A, 0xAC, 0x43, 0xE7, 0x8A, 0xAF, 0x43, + 0xE7, 0x8B, 0x80, 0x43, 0xE7, 0x8B, 0xBC, 0x43, + 0xE7, 0x8C, 0xAA, 0x43, 0xE7, 0x8D, 0xB5, 0x43, + 0xE7, 0x8D, 0xBA, 0x43, 0xE7, 0x8E, 0x84, 0x43, + 0xE7, 0x8E, 0x87, 0x43, 0xE7, 0x8E, 0x89, 0x43, + 0xE7, 0x8E, 0x8B, 0x43, 0xE7, 0x8E, 0xA5, 0x43, + // Bytes f40 - f7f + 0xE7, 0x8E, 0xB2, 0x43, 0xE7, 0x8F, 0x9E, 0x43, + 0xE7, 0x90, 0x86, 0x43, 0xE7, 0x90, 0x89, 0x43, + 0xE7, 0x90, 0xA2, 0x43, 0xE7, 0x91, 0x87, 0x43, + 0xE7, 0x91, 0x9C, 0x43, 0xE7, 0x91, 0xA9, 0x43, + 0xE7, 0x91, 0xB1, 0x43, 0xE7, 0x92, 0x85, 0x43, + 0xE7, 0x92, 0x89, 0x43, 0xE7, 0x92, 0x98, 0x43, + 0xE7, 0x93, 0x8A, 0x43, 0xE7, 0x93, 0x9C, 0x43, + 0xE7, 0x93, 0xA6, 0x43, 0xE7, 0x94, 0x86, 0x43, + // Bytes f80 - fbf + 0xE7, 0x94, 0x98, 0x43, 0xE7, 0x94, 0x9F, 0x43, + 0xE7, 0x94, 0xA4, 0x43, 0xE7, 0x94, 0xA8, 0x43, + 0xE7, 0x94, 0xB0, 0x43, 0xE7, 0x94, 0xB2, 0x43, + 0xE7, 0x94, 0xB3, 0x43, 0xE7, 0x94, 0xB7, 0x43, + 0xE7, 0x94, 0xBB, 0x43, 0xE7, 0x94, 0xBE, 0x43, + 0xE7, 0x95, 0x99, 0x43, 0xE7, 0x95, 0xA5, 0x43, + 0xE7, 0x95, 0xB0, 0x43, 0xE7, 0x96, 0x8B, 0x43, + 0xE7, 0x96, 0x92, 0x43, 0xE7, 0x97, 0xA2, 0x43, + // Bytes fc0 - fff + 0xE7, 0x98, 0x90, 0x43, 0xE7, 0x98, 0x9D, 0x43, + 0xE7, 0x98, 0x9F, 0x43, 0xE7, 0x99, 0x82, 0x43, + 0xE7, 0x99, 0xA9, 0x43, 0xE7, 0x99, 0xB6, 0x43, + 0xE7, 0x99, 0xBD, 0x43, 0xE7, 0x9A, 0xAE, 0x43, + 0xE7, 0x9A, 0xBF, 0x43, 0xE7, 0x9B, 0x8A, 0x43, + 0xE7, 0x9B, 0x9B, 0x43, 0xE7, 0x9B, 0xA3, 0x43, + 0xE7, 0x9B, 0xA7, 0x43, 0xE7, 0x9B, 0xAE, 0x43, + 0xE7, 0x9B, 0xB4, 0x43, 0xE7, 0x9C, 0x81, 0x43, + // Bytes 1000 - 103f + 0xE7, 0x9C, 0x9E, 0x43, 0xE7, 0x9C, 0x9F, 0x43, + 0xE7, 0x9D, 0x80, 0x43, 0xE7, 0x9D, 0x8A, 0x43, + 0xE7, 0x9E, 0x8B, 0x43, 0xE7, 0x9E, 0xA7, 0x43, + 0xE7, 0x9F, 0x9B, 0x43, 0xE7, 0x9F, 0xA2, 0x43, + 0xE7, 0x9F, 0xB3, 0x43, 0xE7, 0xA1, 0x8E, 0x43, + 0xE7, 0xA1, 0xAB, 0x43, 0xE7, 0xA2, 0x8C, 0x43, + 0xE7, 0xA2, 0x91, 0x43, 0xE7, 0xA3, 0x8A, 0x43, + 0xE7, 0xA3, 0x8C, 0x43, 0xE7, 0xA3, 0xBB, 0x43, + // Bytes 1040 - 107f + 0xE7, 0xA4, 0xAA, 0x43, 0xE7, 0xA4, 0xBA, 0x43, + 0xE7, 0xA4, 0xBC, 0x43, 0xE7, 0xA4, 0xBE, 0x43, + 0xE7, 0xA5, 0x88, 0x43, 0xE7, 0xA5, 0x89, 0x43, + 0xE7, 0xA5, 0x90, 0x43, 0xE7, 0xA5, 0x96, 0x43, + 0xE7, 0xA5, 0x9D, 0x43, 0xE7, 0xA5, 0x9E, 0x43, + 0xE7, 0xA5, 0xA5, 0x43, 0xE7, 0xA5, 0xBF, 0x43, + 0xE7, 0xA6, 0x81, 0x43, 0xE7, 0xA6, 0x8D, 0x43, + 0xE7, 0xA6, 0x8E, 0x43, 0xE7, 0xA6, 0x8F, 0x43, + // Bytes 1080 - 10bf + 0xE7, 0xA6, 0xAE, 0x43, 0xE7, 0xA6, 0xB8, 0x43, + 0xE7, 0xA6, 0xBE, 0x43, 0xE7, 0xA7, 0x8A, 0x43, + 0xE7, 0xA7, 0x98, 0x43, 0xE7, 0xA7, 0xAB, 0x43, + 0xE7, 0xA8, 0x9C, 0x43, 0xE7, 0xA9, 0x80, 0x43, + 0xE7, 0xA9, 0x8A, 0x43, 0xE7, 0xA9, 0x8F, 0x43, + 0xE7, 0xA9, 0xB4, 0x43, 0xE7, 0xA9, 0xBA, 0x43, + 0xE7, 0xAA, 0x81, 0x43, 0xE7, 0xAA, 0xB1, 0x43, + 0xE7, 0xAB, 0x8B, 0x43, 0xE7, 0xAB, 0xAE, 0x43, + // Bytes 10c0 - 10ff + 0xE7, 0xAB, 0xB9, 0x43, 0xE7, 0xAC, 0xA0, 0x43, + 0xE7, 0xAE, 0x8F, 0x43, 0xE7, 0xAF, 0x80, 0x43, + 0xE7, 0xAF, 0x86, 0x43, 0xE7, 0xAF, 0x89, 0x43, + 0xE7, 0xB0, 0xBE, 0x43, 0xE7, 0xB1, 0xA0, 0x43, + 0xE7, 0xB1, 0xB3, 0x43, 0xE7, 0xB1, 0xBB, 0x43, + 0xE7, 0xB2, 0x92, 0x43, 0xE7, 0xB2, 0xBE, 0x43, + 0xE7, 0xB3, 0x92, 0x43, 0xE7, 0xB3, 0x96, 0x43, + 0xE7, 0xB3, 0xA3, 0x43, 0xE7, 0xB3, 0xA7, 0x43, + // Bytes 1100 - 113f + 0xE7, 0xB3, 0xA8, 0x43, 0xE7, 0xB3, 0xB8, 0x43, + 0xE7, 0xB4, 0x80, 0x43, 0xE7, 0xB4, 0x90, 0x43, + 0xE7, 0xB4, 0xA2, 0x43, 0xE7, 0xB4, 0xAF, 0x43, + 0xE7, 0xB5, 0x82, 0x43, 0xE7, 0xB5, 0x9B, 0x43, + 0xE7, 0xB5, 0xA3, 0x43, 0xE7, 0xB6, 0xA0, 0x43, + 0xE7, 0xB6, 0xBE, 0x43, 0xE7, 0xB7, 0x87, 0x43, + 0xE7, 0xB7, 0xB4, 0x43, 0xE7, 0xB8, 0x82, 0x43, + 0xE7, 0xB8, 0x89, 0x43, 0xE7, 0xB8, 0xB7, 0x43, + // Bytes 1140 - 117f + 0xE7, 0xB9, 0x81, 0x43, 0xE7, 0xB9, 0x85, 0x43, + 0xE7, 0xBC, 0xB6, 0x43, 0xE7, 0xBC, 0xBE, 0x43, + 0xE7, 0xBD, 0x91, 0x43, 0xE7, 0xBD, 0xB2, 0x43, + 0xE7, 0xBD, 0xB9, 0x43, 0xE7, 0xBD, 0xBA, 0x43, + 0xE7, 0xBE, 0x85, 0x43, 0xE7, 0xBE, 0x8A, 0x43, + 0xE7, 0xBE, 0x95, 0x43, 0xE7, 0xBE, 0x9A, 0x43, + 0xE7, 0xBE, 0xBD, 0x43, 0xE7, 0xBF, 0xBA, 0x43, + 0xE8, 0x80, 0x81, 0x43, 0xE8, 0x80, 0x85, 0x43, + // Bytes 1180 - 11bf + 0xE8, 0x80, 0x8C, 0x43, 0xE8, 0x80, 0x92, 0x43, + 0xE8, 0x80, 0xB3, 0x43, 0xE8, 0x81, 0x86, 0x43, + 0xE8, 0x81, 0xA0, 0x43, 0xE8, 0x81, 0xAF, 0x43, + 0xE8, 0x81, 0xB0, 0x43, 0xE8, 0x81, 0xBE, 0x43, + 0xE8, 0x81, 0xBF, 0x43, 0xE8, 0x82, 0x89, 0x43, + 0xE8, 0x82, 0x8B, 0x43, 0xE8, 0x82, 0xAD, 0x43, + 0xE8, 0x82, 0xB2, 0x43, 0xE8, 0x84, 0x83, 0x43, + 0xE8, 0x84, 0xBE, 0x43, 0xE8, 0x87, 0x98, 0x43, + // Bytes 11c0 - 11ff + 0xE8, 0x87, 0xA3, 0x43, 0xE8, 0x87, 0xA8, 0x43, + 0xE8, 0x87, 0xAA, 0x43, 0xE8, 0x87, 0xAD, 0x43, + 0xE8, 0x87, 0xB3, 0x43, 0xE8, 0x87, 0xBC, 0x43, + 0xE8, 0x88, 0x81, 0x43, 0xE8, 0x88, 0x84, 0x43, + 0xE8, 0x88, 0x8C, 0x43, 0xE8, 0x88, 0x98, 0x43, + 0xE8, 0x88, 0x9B, 0x43, 0xE8, 0x88, 0x9F, 0x43, + 0xE8, 0x89, 0xAE, 0x43, 0xE8, 0x89, 0xAF, 0x43, + 0xE8, 0x89, 0xB2, 0x43, 0xE8, 0x89, 0xB8, 0x43, + // Bytes 1200 - 123f + 0xE8, 0x89, 0xB9, 0x43, 0xE8, 0x8A, 0x8B, 0x43, + 0xE8, 0x8A, 0x91, 0x43, 0xE8, 0x8A, 0x9D, 0x43, + 0xE8, 0x8A, 0xB1, 0x43, 0xE8, 0x8A, 0xB3, 0x43, + 0xE8, 0x8A, 0xBD, 0x43, 0xE8, 0x8B, 0xA5, 0x43, + 0xE8, 0x8B, 0xA6, 0x43, 0xE8, 0x8C, 0x9D, 0x43, + 0xE8, 0x8C, 0xA3, 0x43, 0xE8, 0x8C, 0xB6, 0x43, + 0xE8, 0x8D, 0x92, 0x43, 0xE8, 0x8D, 0x93, 0x43, + 0xE8, 0x8D, 0xA3, 0x43, 0xE8, 0x8E, 0xAD, 0x43, + // Bytes 1240 - 127f + 0xE8, 0x8E, 0xBD, 0x43, 0xE8, 0x8F, 0x89, 0x43, + 0xE8, 0x8F, 0x8A, 0x43, 0xE8, 0x8F, 0x8C, 0x43, + 0xE8, 0x8F, 0x9C, 0x43, 0xE8, 0x8F, 0xA7, 0x43, + 0xE8, 0x8F, 0xAF, 0x43, 0xE8, 0x8F, 0xB1, 0x43, + 0xE8, 0x90, 0xBD, 0x43, 0xE8, 0x91, 0x89, 0x43, + 0xE8, 0x91, 0x97, 0x43, 0xE8, 0x93, 0xAE, 0x43, + 0xE8, 0x93, 0xB1, 0x43, 0xE8, 0x93, 0xB3, 0x43, + 0xE8, 0x93, 0xBC, 0x43, 0xE8, 0x94, 0x96, 0x43, + // Bytes 1280 - 12bf + 0xE8, 0x95, 0xA4, 0x43, 0xE8, 0x97, 0x8D, 0x43, + 0xE8, 0x97, 0xBA, 0x43, 0xE8, 0x98, 0x86, 0x43, + 0xE8, 0x98, 0x92, 0x43, 0xE8, 0x98, 0xAD, 0x43, + 0xE8, 0x98, 0xBF, 0x43, 0xE8, 0x99, 0x8D, 0x43, + 0xE8, 0x99, 0x90, 0x43, 0xE8, 0x99, 0x9C, 0x43, + 0xE8, 0x99, 0xA7, 0x43, 0xE8, 0x99, 0xA9, 0x43, + 0xE8, 0x99, 0xAB, 0x43, 0xE8, 0x9A, 0x88, 0x43, + 0xE8, 0x9A, 0xA9, 0x43, 0xE8, 0x9B, 0xA2, 0x43, + // Bytes 12c0 - 12ff + 0xE8, 0x9C, 0x8E, 0x43, 0xE8, 0x9C, 0xA8, 0x43, + 0xE8, 0x9D, 0xAB, 0x43, 0xE8, 0x9D, 0xB9, 0x43, + 0xE8, 0x9E, 0x86, 0x43, 0xE8, 0x9E, 0xBA, 0x43, + 0xE8, 0x9F, 0xA1, 0x43, 0xE8, 0xA0, 0x81, 0x43, + 0xE8, 0xA0, 0x9F, 0x43, 0xE8, 0xA1, 0x80, 0x43, + 0xE8, 0xA1, 0x8C, 0x43, 0xE8, 0xA1, 0xA0, 0x43, + 0xE8, 0xA1, 0xA3, 0x43, 0xE8, 0xA3, 0x82, 0x43, + 0xE8, 0xA3, 0x8F, 0x43, 0xE8, 0xA3, 0x97, 0x43, + // Bytes 1300 - 133f + 0xE8, 0xA3, 0x9E, 0x43, 0xE8, 0xA3, 0xA1, 0x43, + 0xE8, 0xA3, 0xB8, 0x43, 0xE8, 0xA3, 0xBA, 0x43, + 0xE8, 0xA4, 0x90, 0x43, 0xE8, 0xA5, 0x81, 0x43, + 0xE8, 0xA5, 0xA4, 0x43, 0xE8, 0xA5, 0xBE, 0x43, + 0xE8, 0xA6, 0x86, 0x43, 0xE8, 0xA6, 0x8B, 0x43, + 0xE8, 0xA6, 0x96, 0x43, 0xE8, 0xA7, 0x92, 0x43, + 0xE8, 0xA7, 0xA3, 0x43, 0xE8, 0xA8, 0x80, 0x43, + 0xE8, 0xAA, 0xA0, 0x43, 0xE8, 0xAA, 0xAA, 0x43, + // Bytes 1340 - 137f + 0xE8, 0xAA, 0xBF, 0x43, 0xE8, 0xAB, 0x8B, 0x43, + 0xE8, 0xAB, 0x92, 0x43, 0xE8, 0xAB, 0x96, 0x43, + 0xE8, 0xAB, 0xAD, 0x43, 0xE8, 0xAB, 0xB8, 0x43, + 0xE8, 0xAB, 0xBE, 0x43, 0xE8, 0xAC, 0x81, 0x43, + 0xE8, 0xAC, 0xB9, 0x43, 0xE8, 0xAD, 0x98, 0x43, + 0xE8, 0xAE, 0x80, 0x43, 0xE8, 0xAE, 0x8A, 0x43, + 0xE8, 0xB0, 0xB7, 0x43, 0xE8, 0xB1, 0x86, 0x43, + 0xE8, 0xB1, 0x88, 0x43, 0xE8, 0xB1, 0x95, 0x43, + // Bytes 1380 - 13bf + 0xE8, 0xB1, 0xB8, 0x43, 0xE8, 0xB2, 0x9D, 0x43, + 0xE8, 0xB2, 0xA1, 0x43, 0xE8, 0xB2, 0xA9, 0x43, + 0xE8, 0xB2, 0xAB, 0x43, 0xE8, 0xB3, 0x81, 0x43, + 0xE8, 0xB3, 0x82, 0x43, 0xE8, 0xB3, 0x87, 0x43, + 0xE8, 0xB3, 0x88, 0x43, 0xE8, 0xB3, 0x93, 0x43, + 0xE8, 0xB4, 0x88, 0x43, 0xE8, 0xB4, 0x9B, 0x43, + 0xE8, 0xB5, 0xA4, 0x43, 0xE8, 0xB5, 0xB0, 0x43, + 0xE8, 0xB5, 0xB7, 0x43, 0xE8, 0xB6, 0xB3, 0x43, + // Bytes 13c0 - 13ff + 0xE8, 0xB6, 0xBC, 0x43, 0xE8, 0xB7, 0x8B, 0x43, + 0xE8, 0xB7, 0xAF, 0x43, 0xE8, 0xB7, 0xB0, 0x43, + 0xE8, 0xBA, 0xAB, 0x43, 0xE8, 0xBB, 0x8A, 0x43, + 0xE8, 0xBB, 0x94, 0x43, 0xE8, 0xBC, 0xA6, 0x43, + 0xE8, 0xBC, 0xAA, 0x43, 0xE8, 0xBC, 0xB8, 0x43, + 0xE8, 0xBC, 0xBB, 0x43, 0xE8, 0xBD, 0xA2, 0x43, + 0xE8, 0xBE, 0x9B, 0x43, 0xE8, 0xBE, 0x9E, 0x43, + 0xE8, 0xBE, 0xB0, 0x43, 0xE8, 0xBE, 0xB5, 0x43, + // Bytes 1400 - 143f + 0xE8, 0xBE, 0xB6, 0x43, 0xE9, 0x80, 0xA3, 0x43, + 0xE9, 0x80, 0xB8, 0x43, 0xE9, 0x81, 0x8A, 0x43, + 0xE9, 0x81, 0xA9, 0x43, 0xE9, 0x81, 0xB2, 0x43, + 0xE9, 0x81, 0xBC, 0x43, 0xE9, 0x82, 0x8F, 0x43, + 0xE9, 0x82, 0x91, 0x43, 0xE9, 0x82, 0x94, 0x43, + 0xE9, 0x83, 0x8E, 0x43, 0xE9, 0x83, 0x9E, 0x43, + 0xE9, 0x83, 0xB1, 0x43, 0xE9, 0x83, 0xBD, 0x43, + 0xE9, 0x84, 0x91, 0x43, 0xE9, 0x84, 0x9B, 0x43, + // Bytes 1440 - 147f + 0xE9, 0x85, 0x89, 0x43, 0xE9, 0x85, 0x8D, 0x43, + 0xE9, 0x85, 0xAA, 0x43, 0xE9, 0x86, 0x99, 0x43, + 0xE9, 0x86, 0xB4, 0x43, 0xE9, 0x87, 0x86, 0x43, + 0xE9, 0x87, 0x8C, 0x43, 0xE9, 0x87, 0x8F, 0x43, + 0xE9, 0x87, 0x91, 0x43, 0xE9, 0x88, 0xB4, 0x43, + 0xE9, 0x88, 0xB8, 0x43, 0xE9, 0x89, 0xB6, 0x43, + 0xE9, 0x89, 0xBC, 0x43, 0xE9, 0x8B, 0x97, 0x43, + 0xE9, 0x8B, 0x98, 0x43, 0xE9, 0x8C, 0x84, 0x43, + // Bytes 1480 - 14bf + 0xE9, 0x8D, 0x8A, 0x43, 0xE9, 0x8F, 0xB9, 0x43, + 0xE9, 0x90, 0x95, 0x43, 0xE9, 0x95, 0xB7, 0x43, + 0xE9, 0x96, 0x80, 0x43, 0xE9, 0x96, 0x8B, 0x43, + 0xE9, 0x96, 0xAD, 0x43, 0xE9, 0x96, 0xB7, 0x43, + 0xE9, 0x98, 0x9C, 0x43, 0xE9, 0x98, 0xAE, 0x43, + 0xE9, 0x99, 0x8B, 0x43, 0xE9, 0x99, 0x8D, 0x43, + 0xE9, 0x99, 0xB5, 0x43, 0xE9, 0x99, 0xB8, 0x43, + 0xE9, 0x99, 0xBC, 0x43, 0xE9, 0x9A, 0x86, 0x43, + // Bytes 14c0 - 14ff + 0xE9, 0x9A, 0xA3, 0x43, 0xE9, 0x9A, 0xB6, 0x43, + 0xE9, 0x9A, 0xB7, 0x43, 0xE9, 0x9A, 0xB8, 0x43, + 0xE9, 0x9A, 0xB9, 0x43, 0xE9, 0x9B, 0x83, 0x43, + 0xE9, 0x9B, 0xA2, 0x43, 0xE9, 0x9B, 0xA3, 0x43, + 0xE9, 0x9B, 0xA8, 0x43, 0xE9, 0x9B, 0xB6, 0x43, + 0xE9, 0x9B, 0xB7, 0x43, 0xE9, 0x9C, 0xA3, 0x43, + 0xE9, 0x9C, 0xB2, 0x43, 0xE9, 0x9D, 0x88, 0x43, + 0xE9, 0x9D, 0x91, 0x43, 0xE9, 0x9D, 0x96, 0x43, + // Bytes 1500 - 153f + 0xE9, 0x9D, 0x9E, 0x43, 0xE9, 0x9D, 0xA2, 0x43, + 0xE9, 0x9D, 0xA9, 0x43, 0xE9, 0x9F, 0x8B, 0x43, + 0xE9, 0x9F, 0x9B, 0x43, 0xE9, 0x9F, 0xA0, 0x43, + 0xE9, 0x9F, 0xAD, 0x43, 0xE9, 0x9F, 0xB3, 0x43, + 0xE9, 0x9F, 0xBF, 0x43, 0xE9, 0xA0, 0x81, 0x43, + 0xE9, 0xA0, 0x85, 0x43, 0xE9, 0xA0, 0x8B, 0x43, + 0xE9, 0xA0, 0x98, 0x43, 0xE9, 0xA0, 0xA9, 0x43, + 0xE9, 0xA0, 0xBB, 0x43, 0xE9, 0xA1, 0x9E, 0x43, + // Bytes 1540 - 157f + 0xE9, 0xA2, 0xA8, 0x43, 0xE9, 0xA3, 0x9B, 0x43, + 0xE9, 0xA3, 0x9F, 0x43, 0xE9, 0xA3, 0xA2, 0x43, + 0xE9, 0xA3, 0xAF, 0x43, 0xE9, 0xA3, 0xBC, 0x43, + 0xE9, 0xA4, 0xA8, 0x43, 0xE9, 0xA4, 0xA9, 0x43, + 0xE9, 0xA6, 0x96, 0x43, 0xE9, 0xA6, 0x99, 0x43, + 0xE9, 0xA6, 0xA7, 0x43, 0xE9, 0xA6, 0xAC, 0x43, + 0xE9, 0xA7, 0x82, 0x43, 0xE9, 0xA7, 0xB1, 0x43, + 0xE9, 0xA7, 0xBE, 0x43, 0xE9, 0xA9, 0xAA, 0x43, + // Bytes 1580 - 15bf + 0xE9, 0xAA, 0xA8, 0x43, 0xE9, 0xAB, 0x98, 0x43, + 0xE9, 0xAB, 0x9F, 0x43, 0xE9, 0xAC, 0x92, 0x43, + 0xE9, 0xAC, 0xA5, 0x43, 0xE9, 0xAC, 0xAF, 0x43, + 0xE9, 0xAC, 0xB2, 0x43, 0xE9, 0xAC, 0xBC, 0x43, + 0xE9, 0xAD, 0x9A, 0x43, 0xE9, 0xAD, 0xAF, 0x43, + 0xE9, 0xB1, 0x80, 0x43, 0xE9, 0xB1, 0x97, 0x43, + 0xE9, 0xB3, 0xA5, 0x43, 0xE9, 0xB3, 0xBD, 0x43, + 0xE9, 0xB5, 0xA7, 0x43, 0xE9, 0xB6, 0xB4, 0x43, + // Bytes 15c0 - 15ff + 0xE9, 0xB7, 0xBA, 0x43, 0xE9, 0xB8, 0x9E, 0x43, + 0xE9, 0xB9, 0xB5, 0x43, 0xE9, 0xB9, 0xBF, 0x43, + 0xE9, 0xBA, 0x97, 0x43, 0xE9, 0xBA, 0x9F, 0x43, + 0xE9, 0xBA, 0xA5, 0x43, 0xE9, 0xBA, 0xBB, 0x43, + 0xE9, 0xBB, 0x83, 0x43, 0xE9, 0xBB, 0x8D, 0x43, + 0xE9, 0xBB, 0x8E, 0x43, 0xE9, 0xBB, 0x91, 0x43, + 0xE9, 0xBB, 0xB9, 0x43, 0xE9, 0xBB, 0xBD, 0x43, + 0xE9, 0xBB, 0xBE, 0x43, 0xE9, 0xBC, 0x85, 0x43, + // Bytes 1600 - 163f + 0xE9, 0xBC, 0x8E, 0x43, 0xE9, 0xBC, 0x8F, 0x43, + 0xE9, 0xBC, 0x93, 0x43, 0xE9, 0xBC, 0x96, 0x43, + 0xE9, 0xBC, 0xA0, 0x43, 0xE9, 0xBC, 0xBB, 0x43, + 0xE9, 0xBD, 0x83, 0x43, 0xE9, 0xBD, 0x8A, 0x43, + 0xE9, 0xBD, 0x92, 0x43, 0xE9, 0xBE, 0x8D, 0x43, + 0xE9, 0xBE, 0x8E, 0x43, 0xE9, 0xBE, 0x9C, 0x43, + 0xE9, 0xBE, 0x9F, 0x43, 0xE9, 0xBE, 0xA0, 0x43, + 0xEA, 0x9C, 0xA7, 0x43, 0xEA, 0x9D, 0xAF, 0x43, + // Bytes 1640 - 167f + 0xEA, 0xAC, 0xB7, 0x43, 0xEA, 0xAD, 0x92, 0x44, + 0xF0, 0xA0, 0x84, 0xA2, 0x44, 0xF0, 0xA0, 0x94, + 0x9C, 0x44, 0xF0, 0xA0, 0x94, 0xA5, 0x44, 0xF0, + 0xA0, 0x95, 0x8B, 0x44, 0xF0, 0xA0, 0x98, 0xBA, + 0x44, 0xF0, 0xA0, 0xA0, 0x84, 0x44, 0xF0, 0xA0, + 0xA3, 0x9E, 0x44, 0xF0, 0xA0, 0xA8, 0xAC, 0x44, + 0xF0, 0xA0, 0xAD, 0xA3, 0x44, 0xF0, 0xA1, 0x93, + 0xA4, 0x44, 0xF0, 0xA1, 0x9A, 0xA8, 0x44, 0xF0, + // Bytes 1680 - 16bf + 0xA1, 0x9B, 0xAA, 0x44, 0xF0, 0xA1, 0xA7, 0x88, + 0x44, 0xF0, 0xA1, 0xAC, 0x98, 0x44, 0xF0, 0xA1, + 0xB4, 0x8B, 0x44, 0xF0, 0xA1, 0xB7, 0xA4, 0x44, + 0xF0, 0xA1, 0xB7, 0xA6, 0x44, 0xF0, 0xA2, 0x86, + 0x83, 0x44, 0xF0, 0xA2, 0x86, 0x9F, 0x44, 0xF0, + 0xA2, 0x8C, 0xB1, 0x44, 0xF0, 0xA2, 0x9B, 0x94, + 0x44, 0xF0, 0xA2, 0xA1, 0x84, 0x44, 0xF0, 0xA2, + 0xA1, 0x8A, 0x44, 0xF0, 0xA2, 0xAC, 0x8C, 0x44, + // Bytes 16c0 - 16ff + 0xF0, 0xA2, 0xAF, 0xB1, 0x44, 0xF0, 0xA3, 0x80, + 0x8A, 0x44, 0xF0, 0xA3, 0x8A, 0xB8, 0x44, 0xF0, + 0xA3, 0x8D, 0x9F, 0x44, 0xF0, 0xA3, 0x8E, 0x93, + 0x44, 0xF0, 0xA3, 0x8E, 0x9C, 0x44, 0xF0, 0xA3, + 0x8F, 0x83, 0x44, 0xF0, 0xA3, 0x8F, 0x95, 0x44, + 0xF0, 0xA3, 0x91, 0xAD, 0x44, 0xF0, 0xA3, 0x9A, + 0xA3, 0x44, 0xF0, 0xA3, 0xA2, 0xA7, 0x44, 0xF0, + 0xA3, 0xAA, 0x8D, 0x44, 0xF0, 0xA3, 0xAB, 0xBA, + // Bytes 1700 - 173f + 0x44, 0xF0, 0xA3, 0xB2, 0xBC, 0x44, 0xF0, 0xA3, + 0xB4, 0x9E, 0x44, 0xF0, 0xA3, 0xBB, 0x91, 0x44, + 0xF0, 0xA3, 0xBD, 0x9E, 0x44, 0xF0, 0xA3, 0xBE, + 0x8E, 0x44, 0xF0, 0xA4, 0x89, 0xA3, 0x44, 0xF0, + 0xA4, 0x8B, 0xAE, 0x44, 0xF0, 0xA4, 0x8E, 0xAB, + 0x44, 0xF0, 0xA4, 0x98, 0x88, 0x44, 0xF0, 0xA4, + 0x9C, 0xB5, 0x44, 0xF0, 0xA4, 0xA0, 0x94, 0x44, + 0xF0, 0xA4, 0xB0, 0xB6, 0x44, 0xF0, 0xA4, 0xB2, + // Bytes 1740 - 177f + 0x92, 0x44, 0xF0, 0xA4, 0xBE, 0xA1, 0x44, 0xF0, + 0xA4, 0xBE, 0xB8, 0x44, 0xF0, 0xA5, 0x81, 0x84, + 0x44, 0xF0, 0xA5, 0x83, 0xB2, 0x44, 0xF0, 0xA5, + 0x83, 0xB3, 0x44, 0xF0, 0xA5, 0x84, 0x99, 0x44, + 0xF0, 0xA5, 0x84, 0xB3, 0x44, 0xF0, 0xA5, 0x89, + 0x89, 0x44, 0xF0, 0xA5, 0x90, 0x9D, 0x44, 0xF0, + 0xA5, 0x98, 0xA6, 0x44, 0xF0, 0xA5, 0x9A, 0x9A, + 0x44, 0xF0, 0xA5, 0x9B, 0x85, 0x44, 0xF0, 0xA5, + // Bytes 1780 - 17bf + 0xA5, 0xBC, 0x44, 0xF0, 0xA5, 0xAA, 0xA7, 0x44, + 0xF0, 0xA5, 0xAE, 0xAB, 0x44, 0xF0, 0xA5, 0xB2, + 0x80, 0x44, 0xF0, 0xA5, 0xB3, 0x90, 0x44, 0xF0, + 0xA5, 0xBE, 0x86, 0x44, 0xF0, 0xA6, 0x87, 0x9A, + 0x44, 0xF0, 0xA6, 0x88, 0xA8, 0x44, 0xF0, 0xA6, + 0x89, 0x87, 0x44, 0xF0, 0xA6, 0x8B, 0x99, 0x44, + 0xF0, 0xA6, 0x8C, 0xBE, 0x44, 0xF0, 0xA6, 0x93, + 0x9A, 0x44, 0xF0, 0xA6, 0x94, 0xA3, 0x44, 0xF0, + // Bytes 17c0 - 17ff + 0xA6, 0x96, 0xA8, 0x44, 0xF0, 0xA6, 0x9E, 0xA7, + 0x44, 0xF0, 0xA6, 0x9E, 0xB5, 0x44, 0xF0, 0xA6, + 0xAC, 0xBC, 0x44, 0xF0, 0xA6, 0xB0, 0xB6, 0x44, + 0xF0, 0xA6, 0xB3, 0x95, 0x44, 0xF0, 0xA6, 0xB5, + 0xAB, 0x44, 0xF0, 0xA6, 0xBC, 0xAC, 0x44, 0xF0, + 0xA6, 0xBE, 0xB1, 0x44, 0xF0, 0xA7, 0x83, 0x92, + 0x44, 0xF0, 0xA7, 0x8F, 0x8A, 0x44, 0xF0, 0xA7, + 0x99, 0xA7, 0x44, 0xF0, 0xA7, 0xA2, 0xAE, 0x44, + // Bytes 1800 - 183f + 0xF0, 0xA7, 0xA5, 0xA6, 0x44, 0xF0, 0xA7, 0xB2, + 0xA8, 0x44, 0xF0, 0xA7, 0xBB, 0x93, 0x44, 0xF0, + 0xA7, 0xBC, 0xAF, 0x44, 0xF0, 0xA8, 0x97, 0x92, + 0x44, 0xF0, 0xA8, 0x97, 0xAD, 0x44, 0xF0, 0xA8, + 0x9C, 0xAE, 0x44, 0xF0, 0xA8, 0xAF, 0xBA, 0x44, + 0xF0, 0xA8, 0xB5, 0xB7, 0x44, 0xF0, 0xA9, 0x85, + 0x85, 0x44, 0xF0, 0xA9, 0x87, 0x9F, 0x44, 0xF0, + 0xA9, 0x88, 0x9A, 0x44, 0xF0, 0xA9, 0x90, 0x8A, + // Bytes 1840 - 187f + 0x44, 0xF0, 0xA9, 0x92, 0x96, 0x44, 0xF0, 0xA9, + 0x96, 0xB6, 0x44, 0xF0, 0xA9, 0xAC, 0xB0, 0x44, + 0xF0, 0xAA, 0x83, 0x8E, 0x44, 0xF0, 0xAA, 0x84, + 0x85, 0x44, 0xF0, 0xAA, 0x88, 0x8E, 0x44, 0xF0, + 0xAA, 0x8A, 0x91, 0x44, 0xF0, 0xAA, 0x8E, 0x92, + 0x44, 0xF0, 0xAA, 0x98, 0x80, 0x42, 0x21, 0x21, + 0x42, 0x21, 0x3F, 0x42, 0x2E, 0x2E, 0x42, 0x30, + 0x2C, 0x42, 0x30, 0x2E, 0x42, 0x31, 0x2C, 0x42, + // Bytes 1880 - 18bf + 0x31, 0x2E, 0x42, 0x31, 0x30, 0x42, 0x31, 0x31, + 0x42, 0x31, 0x32, 0x42, 0x31, 0x33, 0x42, 0x31, + 0x34, 0x42, 0x31, 0x35, 0x42, 0x31, 0x36, 0x42, + 0x31, 0x37, 0x42, 0x31, 0x38, 0x42, 0x31, 0x39, + 0x42, 0x32, 0x2C, 0x42, 0x32, 0x2E, 0x42, 0x32, + 0x30, 0x42, 0x32, 0x31, 0x42, 0x32, 0x32, 0x42, + 0x32, 0x33, 0x42, 0x32, 0x34, 0x42, 0x32, 0x35, + 0x42, 0x32, 0x36, 0x42, 0x32, 0x37, 0x42, 0x32, + // Bytes 18c0 - 18ff + 0x38, 0x42, 0x32, 0x39, 0x42, 0x33, 0x2C, 0x42, + 0x33, 0x2E, 0x42, 0x33, 0x30, 0x42, 0x33, 0x31, + 0x42, 0x33, 0x32, 0x42, 0x33, 0x33, 0x42, 0x33, + 0x34, 0x42, 0x33, 0x35, 0x42, 0x33, 0x36, 0x42, + 0x33, 0x37, 0x42, 0x33, 0x38, 0x42, 0x33, 0x39, + 0x42, 0x34, 0x2C, 0x42, 0x34, 0x2E, 0x42, 0x34, + 0x30, 0x42, 0x34, 0x31, 0x42, 0x34, 0x32, 0x42, + 0x34, 0x33, 0x42, 0x34, 0x34, 0x42, 0x34, 0x35, + // Bytes 1900 - 193f + 0x42, 0x34, 0x36, 0x42, 0x34, 0x37, 0x42, 0x34, + 0x38, 0x42, 0x34, 0x39, 0x42, 0x35, 0x2C, 0x42, + 0x35, 0x2E, 0x42, 0x35, 0x30, 0x42, 0x36, 0x2C, + 0x42, 0x36, 0x2E, 0x42, 0x37, 0x2C, 0x42, 0x37, + 0x2E, 0x42, 0x38, 0x2C, 0x42, 0x38, 0x2E, 0x42, + 0x39, 0x2C, 0x42, 0x39, 0x2E, 0x42, 0x3D, 0x3D, + 0x42, 0x3F, 0x21, 0x42, 0x3F, 0x3F, 0x42, 0x41, + 0x55, 0x42, 0x42, 0x71, 0x42, 0x43, 0x44, 0x42, + // Bytes 1940 - 197f + 0x44, 0x4A, 0x42, 0x44, 0x5A, 0x42, 0x44, 0x7A, + 0x42, 0x47, 0x42, 0x42, 0x47, 0x79, 0x42, 0x48, + 0x50, 0x42, 0x48, 0x56, 0x42, 0x48, 0x67, 0x42, + 0x48, 0x7A, 0x42, 0x49, 0x49, 0x42, 0x49, 0x4A, + 0x42, 0x49, 0x55, 0x42, 0x49, 0x56, 0x42, 0x49, + 0x58, 0x42, 0x4B, 0x42, 0x42, 0x4B, 0x4B, 0x42, + 0x4B, 0x4D, 0x42, 0x4C, 0x4A, 0x42, 0x4C, 0x6A, + 0x42, 0x4D, 0x42, 0x42, 0x4D, 0x43, 0x42, 0x4D, + // Bytes 1980 - 19bf + 0x44, 0x42, 0x4D, 0x56, 0x42, 0x4D, 0x57, 0x42, + 0x4E, 0x4A, 0x42, 0x4E, 0x6A, 0x42, 0x4E, 0x6F, + 0x42, 0x50, 0x48, 0x42, 0x50, 0x52, 0x42, 0x50, + 0x61, 0x42, 0x52, 0x73, 0x42, 0x53, 0x44, 0x42, + 0x53, 0x4D, 0x42, 0x53, 0x53, 0x42, 0x53, 0x76, + 0x42, 0x54, 0x4D, 0x42, 0x56, 0x49, 0x42, 0x57, + 0x43, 0x42, 0x57, 0x5A, 0x42, 0x57, 0x62, 0x42, + 0x58, 0x49, 0x42, 0x63, 0x63, 0x42, 0x63, 0x64, + // Bytes 19c0 - 19ff + 0x42, 0x63, 0x6D, 0x42, 0x64, 0x42, 0x42, 0x64, + 0x61, 0x42, 0x64, 0x6C, 0x42, 0x64, 0x6D, 0x42, + 0x64, 0x7A, 0x42, 0x65, 0x56, 0x42, 0x66, 0x66, + 0x42, 0x66, 0x69, 0x42, 0x66, 0x6C, 0x42, 0x66, + 0x6D, 0x42, 0x68, 0x61, 0x42, 0x69, 0x69, 0x42, + 0x69, 0x6A, 0x42, 0x69, 0x6E, 0x42, 0x69, 0x76, + 0x42, 0x69, 0x78, 0x42, 0x6B, 0x41, 0x42, 0x6B, + 0x56, 0x42, 0x6B, 0x57, 0x42, 0x6B, 0x67, 0x42, + // Bytes 1a00 - 1a3f + 0x6B, 0x6C, 0x42, 0x6B, 0x6D, 0x42, 0x6B, 0x74, + 0x42, 0x6C, 0x6A, 0x42, 0x6C, 0x6D, 0x42, 0x6C, + 0x6E, 0x42, 0x6C, 0x78, 0x42, 0x6D, 0x32, 0x42, + 0x6D, 0x33, 0x42, 0x6D, 0x41, 0x42, 0x6D, 0x56, + 0x42, 0x6D, 0x57, 0x42, 0x6D, 0x62, 0x42, 0x6D, + 0x67, 0x42, 0x6D, 0x6C, 0x42, 0x6D, 0x6D, 0x42, + 0x6D, 0x73, 0x42, 0x6E, 0x41, 0x42, 0x6E, 0x46, + 0x42, 0x6E, 0x56, 0x42, 0x6E, 0x57, 0x42, 0x6E, + // Bytes 1a40 - 1a7f + 0x6A, 0x42, 0x6E, 0x6D, 0x42, 0x6E, 0x73, 0x42, + 0x6F, 0x56, 0x42, 0x70, 0x41, 0x42, 0x70, 0x46, + 0x42, 0x70, 0x56, 0x42, 0x70, 0x57, 0x42, 0x70, + 0x63, 0x42, 0x70, 0x73, 0x42, 0x73, 0x72, 0x42, + 0x73, 0x74, 0x42, 0x76, 0x69, 0x42, 0x78, 0x69, + 0x43, 0x28, 0x31, 0x29, 0x43, 0x28, 0x32, 0x29, + 0x43, 0x28, 0x33, 0x29, 0x43, 0x28, 0x34, 0x29, + 0x43, 0x28, 0x35, 0x29, 0x43, 0x28, 0x36, 0x29, + // Bytes 1a80 - 1abf + 0x43, 0x28, 0x37, 0x29, 0x43, 0x28, 0x38, 0x29, + 0x43, 0x28, 0x39, 0x29, 0x43, 0x28, 0x41, 0x29, + 0x43, 0x28, 0x42, 0x29, 0x43, 0x28, 0x43, 0x29, + 0x43, 0x28, 0x44, 0x29, 0x43, 0x28, 0x45, 0x29, + 0x43, 0x28, 0x46, 0x29, 0x43, 0x28, 0x47, 0x29, + 0x43, 0x28, 0x48, 0x29, 0x43, 0x28, 0x49, 0x29, + 0x43, 0x28, 0x4A, 0x29, 0x43, 0x28, 0x4B, 0x29, + 0x43, 0x28, 0x4C, 0x29, 0x43, 0x28, 0x4D, 0x29, + // Bytes 1ac0 - 1aff + 0x43, 0x28, 0x4E, 0x29, 0x43, 0x28, 0x4F, 0x29, + 0x43, 0x28, 0x50, 0x29, 0x43, 0x28, 0x51, 0x29, + 0x43, 0x28, 0x52, 0x29, 0x43, 0x28, 0x53, 0x29, + 0x43, 0x28, 0x54, 0x29, 0x43, 0x28, 0x55, 0x29, + 0x43, 0x28, 0x56, 0x29, 0x43, 0x28, 0x57, 0x29, + 0x43, 0x28, 0x58, 0x29, 0x43, 0x28, 0x59, 0x29, + 0x43, 0x28, 0x5A, 0x29, 0x43, 0x28, 0x61, 0x29, + 0x43, 0x28, 0x62, 0x29, 0x43, 0x28, 0x63, 0x29, + // Bytes 1b00 - 1b3f + 0x43, 0x28, 0x64, 0x29, 0x43, 0x28, 0x65, 0x29, + 0x43, 0x28, 0x66, 0x29, 0x43, 0x28, 0x67, 0x29, + 0x43, 0x28, 0x68, 0x29, 0x43, 0x28, 0x69, 0x29, + 0x43, 0x28, 0x6A, 0x29, 0x43, 0x28, 0x6B, 0x29, + 0x43, 0x28, 0x6C, 0x29, 0x43, 0x28, 0x6D, 0x29, + 0x43, 0x28, 0x6E, 0x29, 0x43, 0x28, 0x6F, 0x29, + 0x43, 0x28, 0x70, 0x29, 0x43, 0x28, 0x71, 0x29, + 0x43, 0x28, 0x72, 0x29, 0x43, 0x28, 0x73, 0x29, + // Bytes 1b40 - 1b7f + 0x43, 0x28, 0x74, 0x29, 0x43, 0x28, 0x75, 0x29, + 0x43, 0x28, 0x76, 0x29, 0x43, 0x28, 0x77, 0x29, + 0x43, 0x28, 0x78, 0x29, 0x43, 0x28, 0x79, 0x29, + 0x43, 0x28, 0x7A, 0x29, 0x43, 0x2E, 0x2E, 0x2E, + 0x43, 0x31, 0x30, 0x2E, 0x43, 0x31, 0x31, 0x2E, + 0x43, 0x31, 0x32, 0x2E, 0x43, 0x31, 0x33, 0x2E, + 0x43, 0x31, 0x34, 0x2E, 0x43, 0x31, 0x35, 0x2E, + 0x43, 0x31, 0x36, 0x2E, 0x43, 0x31, 0x37, 0x2E, + // Bytes 1b80 - 1bbf + 0x43, 0x31, 0x38, 0x2E, 0x43, 0x31, 0x39, 0x2E, + 0x43, 0x32, 0x30, 0x2E, 0x43, 0x3A, 0x3A, 0x3D, + 0x43, 0x3D, 0x3D, 0x3D, 0x43, 0x43, 0x6F, 0x2E, + 0x43, 0x46, 0x41, 0x58, 0x43, 0x47, 0x48, 0x7A, + 0x43, 0x47, 0x50, 0x61, 0x43, 0x49, 0x49, 0x49, + 0x43, 0x4C, 0x54, 0x44, 0x43, 0x4C, 0xC2, 0xB7, + 0x43, 0x4D, 0x48, 0x7A, 0x43, 0x4D, 0x50, 0x61, + 0x43, 0x4D, 0xCE, 0xA9, 0x43, 0x50, 0x50, 0x4D, + // Bytes 1bc0 - 1bff + 0x43, 0x50, 0x50, 0x56, 0x43, 0x50, 0x54, 0x45, + 0x43, 0x54, 0x45, 0x4C, 0x43, 0x54, 0x48, 0x7A, + 0x43, 0x56, 0x49, 0x49, 0x43, 0x58, 0x49, 0x49, + 0x43, 0x61, 0x2F, 0x63, 0x43, 0x61, 0x2F, 0x73, + 0x43, 0x61, 0xCA, 0xBE, 0x43, 0x62, 0x61, 0x72, + 0x43, 0x63, 0x2F, 0x6F, 0x43, 0x63, 0x2F, 0x75, + 0x43, 0x63, 0x61, 0x6C, 0x43, 0x63, 0x6D, 0x32, + 0x43, 0x63, 0x6D, 0x33, 0x43, 0x64, 0x6D, 0x32, + // Bytes 1c00 - 1c3f + 0x43, 0x64, 0x6D, 0x33, 0x43, 0x65, 0x72, 0x67, + 0x43, 0x66, 0x66, 0x69, 0x43, 0x66, 0x66, 0x6C, + 0x43, 0x67, 0x61, 0x6C, 0x43, 0x68, 0x50, 0x61, + 0x43, 0x69, 0x69, 0x69, 0x43, 0x6B, 0x48, 0x7A, + 0x43, 0x6B, 0x50, 0x61, 0x43, 0x6B, 0x6D, 0x32, + 0x43, 0x6B, 0x6D, 0x33, 0x43, 0x6B, 0xCE, 0xA9, + 0x43, 0x6C, 0x6F, 0x67, 0x43, 0x6C, 0xC2, 0xB7, + 0x43, 0x6D, 0x69, 0x6C, 0x43, 0x6D, 0x6D, 0x32, + // Bytes 1c40 - 1c7f + 0x43, 0x6D, 0x6D, 0x33, 0x43, 0x6D, 0x6F, 0x6C, + 0x43, 0x72, 0x61, 0x64, 0x43, 0x76, 0x69, 0x69, + 0x43, 0x78, 0x69, 0x69, 0x43, 0xC2, 0xB0, 0x43, + 0x43, 0xC2, 0xB0, 0x46, 0x43, 0xCA, 0xBC, 0x6E, + 0x43, 0xCE, 0xBC, 0x41, 0x43, 0xCE, 0xBC, 0x46, + 0x43, 0xCE, 0xBC, 0x56, 0x43, 0xCE, 0xBC, 0x57, + 0x43, 0xCE, 0xBC, 0x67, 0x43, 0xCE, 0xBC, 0x6C, + 0x43, 0xCE, 0xBC, 0x6D, 0x43, 0xCE, 0xBC, 0x73, + // Bytes 1c80 - 1cbf + 0x44, 0x28, 0x31, 0x30, 0x29, 0x44, 0x28, 0x31, + 0x31, 0x29, 0x44, 0x28, 0x31, 0x32, 0x29, 0x44, + 0x28, 0x31, 0x33, 0x29, 0x44, 0x28, 0x31, 0x34, + 0x29, 0x44, 0x28, 0x31, 0x35, 0x29, 0x44, 0x28, + 0x31, 0x36, 0x29, 0x44, 0x28, 0x31, 0x37, 0x29, + 0x44, 0x28, 0x31, 0x38, 0x29, 0x44, 0x28, 0x31, + 0x39, 0x29, 0x44, 0x28, 0x32, 0x30, 0x29, 0x44, + 0x30, 0xE7, 0x82, 0xB9, 0x44, 0x31, 0xE2, 0x81, + // Bytes 1cc0 - 1cff + 0x84, 0x44, 0x31, 0xE6, 0x97, 0xA5, 0x44, 0x31, + 0xE6, 0x9C, 0x88, 0x44, 0x31, 0xE7, 0x82, 0xB9, + 0x44, 0x32, 0xE6, 0x97, 0xA5, 0x44, 0x32, 0xE6, + 0x9C, 0x88, 0x44, 0x32, 0xE7, 0x82, 0xB9, 0x44, + 0x33, 0xE6, 0x97, 0xA5, 0x44, 0x33, 0xE6, 0x9C, + 0x88, 0x44, 0x33, 0xE7, 0x82, 0xB9, 0x44, 0x34, + 0xE6, 0x97, 0xA5, 0x44, 0x34, 0xE6, 0x9C, 0x88, + 0x44, 0x34, 0xE7, 0x82, 0xB9, 0x44, 0x35, 0xE6, + // Bytes 1d00 - 1d3f + 0x97, 0xA5, 0x44, 0x35, 0xE6, 0x9C, 0x88, 0x44, + 0x35, 0xE7, 0x82, 0xB9, 0x44, 0x36, 0xE6, 0x97, + 0xA5, 0x44, 0x36, 0xE6, 0x9C, 0x88, 0x44, 0x36, + 0xE7, 0x82, 0xB9, 0x44, 0x37, 0xE6, 0x97, 0xA5, + 0x44, 0x37, 0xE6, 0x9C, 0x88, 0x44, 0x37, 0xE7, + 0x82, 0xB9, 0x44, 0x38, 0xE6, 0x97, 0xA5, 0x44, + 0x38, 0xE6, 0x9C, 0x88, 0x44, 0x38, 0xE7, 0x82, + 0xB9, 0x44, 0x39, 0xE6, 0x97, 0xA5, 0x44, 0x39, + // Bytes 1d40 - 1d7f + 0xE6, 0x9C, 0x88, 0x44, 0x39, 0xE7, 0x82, 0xB9, + 0x44, 0x56, 0x49, 0x49, 0x49, 0x44, 0x61, 0x2E, + 0x6D, 0x2E, 0x44, 0x6B, 0x63, 0x61, 0x6C, 0x44, + 0x70, 0x2E, 0x6D, 0x2E, 0x44, 0x76, 0x69, 0x69, + 0x69, 0x44, 0xD5, 0xA5, 0xD6, 0x82, 0x44, 0xD5, + 0xB4, 0xD5, 0xA5, 0x44, 0xD5, 0xB4, 0xD5, 0xAB, + 0x44, 0xD5, 0xB4, 0xD5, 0xAD, 0x44, 0xD5, 0xB4, + 0xD5, 0xB6, 0x44, 0xD5, 0xBE, 0xD5, 0xB6, 0x44, + // Bytes 1d80 - 1dbf + 0xD7, 0x90, 0xD7, 0x9C, 0x44, 0xD8, 0xA7, 0xD9, + 0xB4, 0x44, 0xD8, 0xA8, 0xD8, 0xAC, 0x44, 0xD8, + 0xA8, 0xD8, 0xAD, 0x44, 0xD8, 0xA8, 0xD8, 0xAE, + 0x44, 0xD8, 0xA8, 0xD8, 0xB1, 0x44, 0xD8, 0xA8, + 0xD8, 0xB2, 0x44, 0xD8, 0xA8, 0xD9, 0x85, 0x44, + 0xD8, 0xA8, 0xD9, 0x86, 0x44, 0xD8, 0xA8, 0xD9, + 0x87, 0x44, 0xD8, 0xA8, 0xD9, 0x89, 0x44, 0xD8, + 0xA8, 0xD9, 0x8A, 0x44, 0xD8, 0xAA, 0xD8, 0xAC, + // Bytes 1dc0 - 1dff + 0x44, 0xD8, 0xAA, 0xD8, 0xAD, 0x44, 0xD8, 0xAA, + 0xD8, 0xAE, 0x44, 0xD8, 0xAA, 0xD8, 0xB1, 0x44, + 0xD8, 0xAA, 0xD8, 0xB2, 0x44, 0xD8, 0xAA, 0xD9, + 0x85, 0x44, 0xD8, 0xAA, 0xD9, 0x86, 0x44, 0xD8, + 0xAA, 0xD9, 0x87, 0x44, 0xD8, 0xAA, 0xD9, 0x89, + 0x44, 0xD8, 0xAA, 0xD9, 0x8A, 0x44, 0xD8, 0xAB, + 0xD8, 0xAC, 0x44, 0xD8, 0xAB, 0xD8, 0xB1, 0x44, + 0xD8, 0xAB, 0xD8, 0xB2, 0x44, 0xD8, 0xAB, 0xD9, + // Bytes 1e00 - 1e3f + 0x85, 0x44, 0xD8, 0xAB, 0xD9, 0x86, 0x44, 0xD8, + 0xAB, 0xD9, 0x87, 0x44, 0xD8, 0xAB, 0xD9, 0x89, + 0x44, 0xD8, 0xAB, 0xD9, 0x8A, 0x44, 0xD8, 0xAC, + 0xD8, 0xAD, 0x44, 0xD8, 0xAC, 0xD9, 0x85, 0x44, + 0xD8, 0xAC, 0xD9, 0x89, 0x44, 0xD8, 0xAC, 0xD9, + 0x8A, 0x44, 0xD8, 0xAD, 0xD8, 0xAC, 0x44, 0xD8, + 0xAD, 0xD9, 0x85, 0x44, 0xD8, 0xAD, 0xD9, 0x89, + 0x44, 0xD8, 0xAD, 0xD9, 0x8A, 0x44, 0xD8, 0xAE, + // Bytes 1e40 - 1e7f + 0xD8, 0xAC, 0x44, 0xD8, 0xAE, 0xD8, 0xAD, 0x44, + 0xD8, 0xAE, 0xD9, 0x85, 0x44, 0xD8, 0xAE, 0xD9, + 0x89, 0x44, 0xD8, 0xAE, 0xD9, 0x8A, 0x44, 0xD8, + 0xB3, 0xD8, 0xAC, 0x44, 0xD8, 0xB3, 0xD8, 0xAD, + 0x44, 0xD8, 0xB3, 0xD8, 0xAE, 0x44, 0xD8, 0xB3, + 0xD8, 0xB1, 0x44, 0xD8, 0xB3, 0xD9, 0x85, 0x44, + 0xD8, 0xB3, 0xD9, 0x87, 0x44, 0xD8, 0xB3, 0xD9, + 0x89, 0x44, 0xD8, 0xB3, 0xD9, 0x8A, 0x44, 0xD8, + // Bytes 1e80 - 1ebf + 0xB4, 0xD8, 0xAC, 0x44, 0xD8, 0xB4, 0xD8, 0xAD, + 0x44, 0xD8, 0xB4, 0xD8, 0xAE, 0x44, 0xD8, 0xB4, + 0xD8, 0xB1, 0x44, 0xD8, 0xB4, 0xD9, 0x85, 0x44, + 0xD8, 0xB4, 0xD9, 0x87, 0x44, 0xD8, 0xB4, 0xD9, + 0x89, 0x44, 0xD8, 0xB4, 0xD9, 0x8A, 0x44, 0xD8, + 0xB5, 0xD8, 0xAD, 0x44, 0xD8, 0xB5, 0xD8, 0xAE, + 0x44, 0xD8, 0xB5, 0xD8, 0xB1, 0x44, 0xD8, 0xB5, + 0xD9, 0x85, 0x44, 0xD8, 0xB5, 0xD9, 0x89, 0x44, + // Bytes 1ec0 - 1eff + 0xD8, 0xB5, 0xD9, 0x8A, 0x44, 0xD8, 0xB6, 0xD8, + 0xAC, 0x44, 0xD8, 0xB6, 0xD8, 0xAD, 0x44, 0xD8, + 0xB6, 0xD8, 0xAE, 0x44, 0xD8, 0xB6, 0xD8, 0xB1, + 0x44, 0xD8, 0xB6, 0xD9, 0x85, 0x44, 0xD8, 0xB6, + 0xD9, 0x89, 0x44, 0xD8, 0xB6, 0xD9, 0x8A, 0x44, + 0xD8, 0xB7, 0xD8, 0xAD, 0x44, 0xD8, 0xB7, 0xD9, + 0x85, 0x44, 0xD8, 0xB7, 0xD9, 0x89, 0x44, 0xD8, + 0xB7, 0xD9, 0x8A, 0x44, 0xD8, 0xB8, 0xD9, 0x85, + // Bytes 1f00 - 1f3f + 0x44, 0xD8, 0xB9, 0xD8, 0xAC, 0x44, 0xD8, 0xB9, + 0xD9, 0x85, 0x44, 0xD8, 0xB9, 0xD9, 0x89, 0x44, + 0xD8, 0xB9, 0xD9, 0x8A, 0x44, 0xD8, 0xBA, 0xD8, + 0xAC, 0x44, 0xD8, 0xBA, 0xD9, 0x85, 0x44, 0xD8, + 0xBA, 0xD9, 0x89, 0x44, 0xD8, 0xBA, 0xD9, 0x8A, + 0x44, 0xD9, 0x81, 0xD8, 0xAC, 0x44, 0xD9, 0x81, + 0xD8, 0xAD, 0x44, 0xD9, 0x81, 0xD8, 0xAE, 0x44, + 0xD9, 0x81, 0xD9, 0x85, 0x44, 0xD9, 0x81, 0xD9, + // Bytes 1f40 - 1f7f + 0x89, 0x44, 0xD9, 0x81, 0xD9, 0x8A, 0x44, 0xD9, + 0x82, 0xD8, 0xAD, 0x44, 0xD9, 0x82, 0xD9, 0x85, + 0x44, 0xD9, 0x82, 0xD9, 0x89, 0x44, 0xD9, 0x82, + 0xD9, 0x8A, 0x44, 0xD9, 0x83, 0xD8, 0xA7, 0x44, + 0xD9, 0x83, 0xD8, 0xAC, 0x44, 0xD9, 0x83, 0xD8, + 0xAD, 0x44, 0xD9, 0x83, 0xD8, 0xAE, 0x44, 0xD9, + 0x83, 0xD9, 0x84, 0x44, 0xD9, 0x83, 0xD9, 0x85, + 0x44, 0xD9, 0x83, 0xD9, 0x89, 0x44, 0xD9, 0x83, + // Bytes 1f80 - 1fbf + 0xD9, 0x8A, 0x44, 0xD9, 0x84, 0xD8, 0xA7, 0x44, + 0xD9, 0x84, 0xD8, 0xAC, 0x44, 0xD9, 0x84, 0xD8, + 0xAD, 0x44, 0xD9, 0x84, 0xD8, 0xAE, 0x44, 0xD9, + 0x84, 0xD9, 0x85, 0x44, 0xD9, 0x84, 0xD9, 0x87, + 0x44, 0xD9, 0x84, 0xD9, 0x89, 0x44, 0xD9, 0x84, + 0xD9, 0x8A, 0x44, 0xD9, 0x85, 0xD8, 0xA7, 0x44, + 0xD9, 0x85, 0xD8, 0xAC, 0x44, 0xD9, 0x85, 0xD8, + 0xAD, 0x44, 0xD9, 0x85, 0xD8, 0xAE, 0x44, 0xD9, + // Bytes 1fc0 - 1fff + 0x85, 0xD9, 0x85, 0x44, 0xD9, 0x85, 0xD9, 0x89, + 0x44, 0xD9, 0x85, 0xD9, 0x8A, 0x44, 0xD9, 0x86, + 0xD8, 0xAC, 0x44, 0xD9, 0x86, 0xD8, 0xAD, 0x44, + 0xD9, 0x86, 0xD8, 0xAE, 0x44, 0xD9, 0x86, 0xD8, + 0xB1, 0x44, 0xD9, 0x86, 0xD8, 0xB2, 0x44, 0xD9, + 0x86, 0xD9, 0x85, 0x44, 0xD9, 0x86, 0xD9, 0x86, + 0x44, 0xD9, 0x86, 0xD9, 0x87, 0x44, 0xD9, 0x86, + 0xD9, 0x89, 0x44, 0xD9, 0x86, 0xD9, 0x8A, 0x44, + // Bytes 2000 - 203f + 0xD9, 0x87, 0xD8, 0xAC, 0x44, 0xD9, 0x87, 0xD9, + 0x85, 0x44, 0xD9, 0x87, 0xD9, 0x89, 0x44, 0xD9, + 0x87, 0xD9, 0x8A, 0x44, 0xD9, 0x88, 0xD9, 0xB4, + 0x44, 0xD9, 0x8A, 0xD8, 0xAC, 0x44, 0xD9, 0x8A, + 0xD8, 0xAD, 0x44, 0xD9, 0x8A, 0xD8, 0xAE, 0x44, + 0xD9, 0x8A, 0xD8, 0xB1, 0x44, 0xD9, 0x8A, 0xD8, + 0xB2, 0x44, 0xD9, 0x8A, 0xD9, 0x85, 0x44, 0xD9, + 0x8A, 0xD9, 0x86, 0x44, 0xD9, 0x8A, 0xD9, 0x87, + // Bytes 2040 - 207f + 0x44, 0xD9, 0x8A, 0xD9, 0x89, 0x44, 0xD9, 0x8A, + 0xD9, 0x8A, 0x44, 0xD9, 0x8A, 0xD9, 0xB4, 0x44, + 0xDB, 0x87, 0xD9, 0xB4, 0x45, 0x28, 0xE1, 0x84, + 0x80, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x82, 0x29, + 0x45, 0x28, 0xE1, 0x84, 0x83, 0x29, 0x45, 0x28, + 0xE1, 0x84, 0x85, 0x29, 0x45, 0x28, 0xE1, 0x84, + 0x86, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x87, 0x29, + 0x45, 0x28, 0xE1, 0x84, 0x89, 0x29, 0x45, 0x28, + // Bytes 2080 - 20bf + 0xE1, 0x84, 0x8B, 0x29, 0x45, 0x28, 0xE1, 0x84, + 0x8C, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x8E, 0x29, + 0x45, 0x28, 0xE1, 0x84, 0x8F, 0x29, 0x45, 0x28, + 0xE1, 0x84, 0x90, 0x29, 0x45, 0x28, 0xE1, 0x84, + 0x91, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x92, 0x29, + 0x45, 0x28, 0xE4, 0xB8, 0x80, 0x29, 0x45, 0x28, + 0xE4, 0xB8, 0x83, 0x29, 0x45, 0x28, 0xE4, 0xB8, + 0x89, 0x29, 0x45, 0x28, 0xE4, 0xB9, 0x9D, 0x29, + // Bytes 20c0 - 20ff + 0x45, 0x28, 0xE4, 0xBA, 0x8C, 0x29, 0x45, 0x28, + 0xE4, 0xBA, 0x94, 0x29, 0x45, 0x28, 0xE4, 0xBB, + 0xA3, 0x29, 0x45, 0x28, 0xE4, 0xBC, 0x81, 0x29, + 0x45, 0x28, 0xE4, 0xBC, 0x91, 0x29, 0x45, 0x28, + 0xE5, 0x85, 0xAB, 0x29, 0x45, 0x28, 0xE5, 0x85, + 0xAD, 0x29, 0x45, 0x28, 0xE5, 0x8A, 0xB4, 0x29, + 0x45, 0x28, 0xE5, 0x8D, 0x81, 0x29, 0x45, 0x28, + 0xE5, 0x8D, 0x94, 0x29, 0x45, 0x28, 0xE5, 0x90, + // Bytes 2100 - 213f + 0x8D, 0x29, 0x45, 0x28, 0xE5, 0x91, 0xBC, 0x29, + 0x45, 0x28, 0xE5, 0x9B, 0x9B, 0x29, 0x45, 0x28, + 0xE5, 0x9C, 0x9F, 0x29, 0x45, 0x28, 0xE5, 0xAD, + 0xA6, 0x29, 0x45, 0x28, 0xE6, 0x97, 0xA5, 0x29, + 0x45, 0x28, 0xE6, 0x9C, 0x88, 0x29, 0x45, 0x28, + 0xE6, 0x9C, 0x89, 0x29, 0x45, 0x28, 0xE6, 0x9C, + 0xA8, 0x29, 0x45, 0x28, 0xE6, 0xA0, 0xAA, 0x29, + 0x45, 0x28, 0xE6, 0xB0, 0xB4, 0x29, 0x45, 0x28, + // Bytes 2140 - 217f + 0xE7, 0x81, 0xAB, 0x29, 0x45, 0x28, 0xE7, 0x89, + 0xB9, 0x29, 0x45, 0x28, 0xE7, 0x9B, 0xA3, 0x29, + 0x45, 0x28, 0xE7, 0xA4, 0xBE, 0x29, 0x45, 0x28, + 0xE7, 0xA5, 0x9D, 0x29, 0x45, 0x28, 0xE7, 0xA5, + 0xAD, 0x29, 0x45, 0x28, 0xE8, 0x87, 0xAA, 0x29, + 0x45, 0x28, 0xE8, 0x87, 0xB3, 0x29, 0x45, 0x28, + 0xE8, 0xB2, 0xA1, 0x29, 0x45, 0x28, 0xE8, 0xB3, + 0x87, 0x29, 0x45, 0x28, 0xE9, 0x87, 0x91, 0x29, + // Bytes 2180 - 21bf + 0x45, 0x30, 0xE2, 0x81, 0x84, 0x33, 0x45, 0x31, + 0x30, 0xE6, 0x97, 0xA5, 0x45, 0x31, 0x30, 0xE6, + 0x9C, 0x88, 0x45, 0x31, 0x30, 0xE7, 0x82, 0xB9, + 0x45, 0x31, 0x31, 0xE6, 0x97, 0xA5, 0x45, 0x31, + 0x31, 0xE6, 0x9C, 0x88, 0x45, 0x31, 0x31, 0xE7, + 0x82, 0xB9, 0x45, 0x31, 0x32, 0xE6, 0x97, 0xA5, + 0x45, 0x31, 0x32, 0xE6, 0x9C, 0x88, 0x45, 0x31, + 0x32, 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x33, 0xE6, + // Bytes 21c0 - 21ff + 0x97, 0xA5, 0x45, 0x31, 0x33, 0xE7, 0x82, 0xB9, + 0x45, 0x31, 0x34, 0xE6, 0x97, 0xA5, 0x45, 0x31, + 0x34, 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x35, 0xE6, + 0x97, 0xA5, 0x45, 0x31, 0x35, 0xE7, 0x82, 0xB9, + 0x45, 0x31, 0x36, 0xE6, 0x97, 0xA5, 0x45, 0x31, + 0x36, 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x37, 0xE6, + 0x97, 0xA5, 0x45, 0x31, 0x37, 0xE7, 0x82, 0xB9, + 0x45, 0x31, 0x38, 0xE6, 0x97, 0xA5, 0x45, 0x31, + // Bytes 2200 - 223f + 0x38, 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x39, 0xE6, + 0x97, 0xA5, 0x45, 0x31, 0x39, 0xE7, 0x82, 0xB9, + 0x45, 0x31, 0xE2, 0x81, 0x84, 0x32, 0x45, 0x31, + 0xE2, 0x81, 0x84, 0x33, 0x45, 0x31, 0xE2, 0x81, + 0x84, 0x34, 0x45, 0x31, 0xE2, 0x81, 0x84, 0x35, + 0x45, 0x31, 0xE2, 0x81, 0x84, 0x36, 0x45, 0x31, + 0xE2, 0x81, 0x84, 0x37, 0x45, 0x31, 0xE2, 0x81, + 0x84, 0x38, 0x45, 0x31, 0xE2, 0x81, 0x84, 0x39, + // Bytes 2240 - 227f + 0x45, 0x32, 0x30, 0xE6, 0x97, 0xA5, 0x45, 0x32, + 0x30, 0xE7, 0x82, 0xB9, 0x45, 0x32, 0x31, 0xE6, + 0x97, 0xA5, 0x45, 0x32, 0x31, 0xE7, 0x82, 0xB9, + 0x45, 0x32, 0x32, 0xE6, 0x97, 0xA5, 0x45, 0x32, + 0x32, 0xE7, 0x82, 0xB9, 0x45, 0x32, 0x33, 0xE6, + 0x97, 0xA5, 0x45, 0x32, 0x33, 0xE7, 0x82, 0xB9, + 0x45, 0x32, 0x34, 0xE6, 0x97, 0xA5, 0x45, 0x32, + 0x34, 0xE7, 0x82, 0xB9, 0x45, 0x32, 0x35, 0xE6, + // Bytes 2280 - 22bf + 0x97, 0xA5, 0x45, 0x32, 0x36, 0xE6, 0x97, 0xA5, + 0x45, 0x32, 0x37, 0xE6, 0x97, 0xA5, 0x45, 0x32, + 0x38, 0xE6, 0x97, 0xA5, 0x45, 0x32, 0x39, 0xE6, + 0x97, 0xA5, 0x45, 0x32, 0xE2, 0x81, 0x84, 0x33, + 0x45, 0x32, 0xE2, 0x81, 0x84, 0x35, 0x45, 0x33, + 0x30, 0xE6, 0x97, 0xA5, 0x45, 0x33, 0x31, 0xE6, + 0x97, 0xA5, 0x45, 0x33, 0xE2, 0x81, 0x84, 0x34, + 0x45, 0x33, 0xE2, 0x81, 0x84, 0x35, 0x45, 0x33, + // Bytes 22c0 - 22ff + 0xE2, 0x81, 0x84, 0x38, 0x45, 0x34, 0xE2, 0x81, + 0x84, 0x35, 0x45, 0x35, 0xE2, 0x81, 0x84, 0x36, + 0x45, 0x35, 0xE2, 0x81, 0x84, 0x38, 0x45, 0x37, + 0xE2, 0x81, 0x84, 0x38, 0x45, 0x41, 0xE2, 0x88, + 0x95, 0x6D, 0x45, 0x56, 0xE2, 0x88, 0x95, 0x6D, + 0x45, 0x6D, 0xE2, 0x88, 0x95, 0x73, 0x46, 0x31, + 0xE2, 0x81, 0x84, 0x31, 0x30, 0x46, 0x43, 0xE2, + 0x88, 0x95, 0x6B, 0x67, 0x46, 0x6D, 0xE2, 0x88, + // Bytes 2300 - 233f + 0x95, 0x73, 0x32, 0x46, 0xD8, 0xA8, 0xD8, 0xAD, + 0xD9, 0x8A, 0x46, 0xD8, 0xA8, 0xD8, 0xAE, 0xD9, + 0x8A, 0x46, 0xD8, 0xAA, 0xD8, 0xAC, 0xD9, 0x85, + 0x46, 0xD8, 0xAA, 0xD8, 0xAC, 0xD9, 0x89, 0x46, + 0xD8, 0xAA, 0xD8, 0xAC, 0xD9, 0x8A, 0x46, 0xD8, + 0xAA, 0xD8, 0xAD, 0xD8, 0xAC, 0x46, 0xD8, 0xAA, + 0xD8, 0xAD, 0xD9, 0x85, 0x46, 0xD8, 0xAA, 0xD8, + 0xAE, 0xD9, 0x85, 0x46, 0xD8, 0xAA, 0xD8, 0xAE, + // Bytes 2340 - 237f + 0xD9, 0x89, 0x46, 0xD8, 0xAA, 0xD8, 0xAE, 0xD9, + 0x8A, 0x46, 0xD8, 0xAA, 0xD9, 0x85, 0xD8, 0xAC, + 0x46, 0xD8, 0xAA, 0xD9, 0x85, 0xD8, 0xAD, 0x46, + 0xD8, 0xAA, 0xD9, 0x85, 0xD8, 0xAE, 0x46, 0xD8, + 0xAA, 0xD9, 0x85, 0xD9, 0x89, 0x46, 0xD8, 0xAA, + 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD8, 0xAC, 0xD8, + 0xAD, 0xD9, 0x89, 0x46, 0xD8, 0xAC, 0xD8, 0xAD, + 0xD9, 0x8A, 0x46, 0xD8, 0xAC, 0xD9, 0x85, 0xD8, + // Bytes 2380 - 23bf + 0xAD, 0x46, 0xD8, 0xAC, 0xD9, 0x85, 0xD9, 0x89, + 0x46, 0xD8, 0xAC, 0xD9, 0x85, 0xD9, 0x8A, 0x46, + 0xD8, 0xAD, 0xD8, 0xAC, 0xD9, 0x8A, 0x46, 0xD8, + 0xAD, 0xD9, 0x85, 0xD9, 0x89, 0x46, 0xD8, 0xAD, + 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD8, 0xB3, 0xD8, + 0xAC, 0xD8, 0xAD, 0x46, 0xD8, 0xB3, 0xD8, 0xAC, + 0xD9, 0x89, 0x46, 0xD8, 0xB3, 0xD8, 0xAD, 0xD8, + 0xAC, 0x46, 0xD8, 0xB3, 0xD8, 0xAE, 0xD9, 0x89, + // Bytes 23c0 - 23ff + 0x46, 0xD8, 0xB3, 0xD8, 0xAE, 0xD9, 0x8A, 0x46, + 0xD8, 0xB3, 0xD9, 0x85, 0xD8, 0xAC, 0x46, 0xD8, + 0xB3, 0xD9, 0x85, 0xD8, 0xAD, 0x46, 0xD8, 0xB3, + 0xD9, 0x85, 0xD9, 0x85, 0x46, 0xD8, 0xB4, 0xD8, + 0xAC, 0xD9, 0x8A, 0x46, 0xD8, 0xB4, 0xD8, 0xAD, + 0xD9, 0x85, 0x46, 0xD8, 0xB4, 0xD8, 0xAD, 0xD9, + 0x8A, 0x46, 0xD8, 0xB4, 0xD9, 0x85, 0xD8, 0xAE, + 0x46, 0xD8, 0xB4, 0xD9, 0x85, 0xD9, 0x85, 0x46, + // Bytes 2400 - 243f + 0xD8, 0xB5, 0xD8, 0xAD, 0xD8, 0xAD, 0x46, 0xD8, + 0xB5, 0xD8, 0xAD, 0xD9, 0x8A, 0x46, 0xD8, 0xB5, + 0xD9, 0x84, 0xD9, 0x89, 0x46, 0xD8, 0xB5, 0xD9, + 0x84, 0xDB, 0x92, 0x46, 0xD8, 0xB5, 0xD9, 0x85, + 0xD9, 0x85, 0x46, 0xD8, 0xB6, 0xD8, 0xAD, 0xD9, + 0x89, 0x46, 0xD8, 0xB6, 0xD8, 0xAD, 0xD9, 0x8A, + 0x46, 0xD8, 0xB6, 0xD8, 0xAE, 0xD9, 0x85, 0x46, + 0xD8, 0xB7, 0xD9, 0x85, 0xD8, 0xAD, 0x46, 0xD8, + // Bytes 2440 - 247f + 0xB7, 0xD9, 0x85, 0xD9, 0x85, 0x46, 0xD8, 0xB7, + 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD8, 0xB9, 0xD8, + 0xAC, 0xD9, 0x85, 0x46, 0xD8, 0xB9, 0xD9, 0x85, + 0xD9, 0x85, 0x46, 0xD8, 0xB9, 0xD9, 0x85, 0xD9, + 0x89, 0x46, 0xD8, 0xB9, 0xD9, 0x85, 0xD9, 0x8A, + 0x46, 0xD8, 0xBA, 0xD9, 0x85, 0xD9, 0x85, 0x46, + 0xD8, 0xBA, 0xD9, 0x85, 0xD9, 0x89, 0x46, 0xD8, + 0xBA, 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD9, 0x81, + // Bytes 2480 - 24bf + 0xD8, 0xAE, 0xD9, 0x85, 0x46, 0xD9, 0x81, 0xD9, + 0x85, 0xD9, 0x8A, 0x46, 0xD9, 0x82, 0xD9, 0x84, + 0xDB, 0x92, 0x46, 0xD9, 0x82, 0xD9, 0x85, 0xD8, + 0xAD, 0x46, 0xD9, 0x82, 0xD9, 0x85, 0xD9, 0x85, + 0x46, 0xD9, 0x82, 0xD9, 0x85, 0xD9, 0x8A, 0x46, + 0xD9, 0x83, 0xD9, 0x85, 0xD9, 0x85, 0x46, 0xD9, + 0x83, 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD9, 0x84, + 0xD8, 0xAC, 0xD8, 0xAC, 0x46, 0xD9, 0x84, 0xD8, + // Bytes 24c0 - 24ff + 0xAC, 0xD9, 0x85, 0x46, 0xD9, 0x84, 0xD8, 0xAC, + 0xD9, 0x8A, 0x46, 0xD9, 0x84, 0xD8, 0xAD, 0xD9, + 0x85, 0x46, 0xD9, 0x84, 0xD8, 0xAD, 0xD9, 0x89, + 0x46, 0xD9, 0x84, 0xD8, 0xAD, 0xD9, 0x8A, 0x46, + 0xD9, 0x84, 0xD8, 0xAE, 0xD9, 0x85, 0x46, 0xD9, + 0x84, 0xD9, 0x85, 0xD8, 0xAD, 0x46, 0xD9, 0x84, + 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD9, 0x85, 0xD8, + 0xAC, 0xD8, 0xAD, 0x46, 0xD9, 0x85, 0xD8, 0xAC, + // Bytes 2500 - 253f + 0xD8, 0xAE, 0x46, 0xD9, 0x85, 0xD8, 0xAC, 0xD9, + 0x85, 0x46, 0xD9, 0x85, 0xD8, 0xAC, 0xD9, 0x8A, + 0x46, 0xD9, 0x85, 0xD8, 0xAD, 0xD8, 0xAC, 0x46, + 0xD9, 0x85, 0xD8, 0xAD, 0xD9, 0x85, 0x46, 0xD9, + 0x85, 0xD8, 0xAD, 0xD9, 0x8A, 0x46, 0xD9, 0x85, + 0xD8, 0xAE, 0xD8, 0xAC, 0x46, 0xD9, 0x85, 0xD8, + 0xAE, 0xD9, 0x85, 0x46, 0xD9, 0x85, 0xD8, 0xAE, + 0xD9, 0x8A, 0x46, 0xD9, 0x85, 0xD9, 0x85, 0xD9, + // Bytes 2540 - 257f + 0x8A, 0x46, 0xD9, 0x86, 0xD8, 0xAC, 0xD8, 0xAD, + 0x46, 0xD9, 0x86, 0xD8, 0xAC, 0xD9, 0x85, 0x46, + 0xD9, 0x86, 0xD8, 0xAC, 0xD9, 0x89, 0x46, 0xD9, + 0x86, 0xD8, 0xAC, 0xD9, 0x8A, 0x46, 0xD9, 0x86, + 0xD8, 0xAD, 0xD9, 0x85, 0x46, 0xD9, 0x86, 0xD8, + 0xAD, 0xD9, 0x89, 0x46, 0xD9, 0x86, 0xD8, 0xAD, + 0xD9, 0x8A, 0x46, 0xD9, 0x86, 0xD9, 0x85, 0xD9, + 0x89, 0x46, 0xD9, 0x86, 0xD9, 0x85, 0xD9, 0x8A, + // Bytes 2580 - 25bf + 0x46, 0xD9, 0x87, 0xD9, 0x85, 0xD8, 0xAC, 0x46, + 0xD9, 0x87, 0xD9, 0x85, 0xD9, 0x85, 0x46, 0xD9, + 0x8A, 0xD8, 0xAC, 0xD9, 0x8A, 0x46, 0xD9, 0x8A, + 0xD8, 0xAD, 0xD9, 0x8A, 0x46, 0xD9, 0x8A, 0xD9, + 0x85, 0xD9, 0x85, 0x46, 0xD9, 0x8A, 0xD9, 0x85, + 0xD9, 0x8A, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD8, + 0xA7, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD8, 0xAC, + 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD8, 0xAD, 0x46, + // Bytes 25c0 - 25ff + 0xD9, 0x8A, 0xD9, 0x94, 0xD8, 0xAE, 0x46, 0xD9, + 0x8A, 0xD9, 0x94, 0xD8, 0xB1, 0x46, 0xD9, 0x8A, + 0xD9, 0x94, 0xD8, 0xB2, 0x46, 0xD9, 0x8A, 0xD9, + 0x94, 0xD9, 0x85, 0x46, 0xD9, 0x8A, 0xD9, 0x94, + 0xD9, 0x86, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD9, + 0x87, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD9, 0x88, + 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD9, 0x89, 0x46, + 0xD9, 0x8A, 0xD9, 0x94, 0xD9, 0x8A, 0x46, 0xD9, + // Bytes 2600 - 263f + 0x8A, 0xD9, 0x94, 0xDB, 0x86, 0x46, 0xD9, 0x8A, + 0xD9, 0x94, 0xDB, 0x87, 0x46, 0xD9, 0x8A, 0xD9, + 0x94, 0xDB, 0x88, 0x46, 0xD9, 0x8A, 0xD9, 0x94, + 0xDB, 0x90, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xDB, + 0x95, 0x46, 0xE0, 0xB9, 0x8D, 0xE0, 0xB8, 0xB2, + 0x46, 0xE0, 0xBA, 0xAB, 0xE0, 0xBA, 0x99, 0x46, + 0xE0, 0xBA, 0xAB, 0xE0, 0xBA, 0xA1, 0x46, 0xE0, + 0xBB, 0x8D, 0xE0, 0xBA, 0xB2, 0x46, 0xE0, 0xBD, + // Bytes 2640 - 267f + 0x80, 0xE0, 0xBE, 0xB5, 0x46, 0xE0, 0xBD, 0x82, + 0xE0, 0xBE, 0xB7, 0x46, 0xE0, 0xBD, 0x8C, 0xE0, + 0xBE, 0xB7, 0x46, 0xE0, 0xBD, 0x91, 0xE0, 0xBE, + 0xB7, 0x46, 0xE0, 0xBD, 0x96, 0xE0, 0xBE, 0xB7, + 0x46, 0xE0, 0xBD, 0x9B, 0xE0, 0xBE, 0xB7, 0x46, + 0xE0, 0xBE, 0x90, 0xE0, 0xBE, 0xB5, 0x46, 0xE0, + 0xBE, 0x92, 0xE0, 0xBE, 0xB7, 0x46, 0xE0, 0xBE, + 0x9C, 0xE0, 0xBE, 0xB7, 0x46, 0xE0, 0xBE, 0xA1, + // Bytes 2680 - 26bf + 0xE0, 0xBE, 0xB7, 0x46, 0xE0, 0xBE, 0xA6, 0xE0, + 0xBE, 0xB7, 0x46, 0xE0, 0xBE, 0xAB, 0xE0, 0xBE, + 0xB7, 0x46, 0xE2, 0x80, 0xB2, 0xE2, 0x80, 0xB2, + 0x46, 0xE2, 0x80, 0xB5, 0xE2, 0x80, 0xB5, 0x46, + 0xE2, 0x88, 0xAB, 0xE2, 0x88, 0xAB, 0x46, 0xE2, + 0x88, 0xAE, 0xE2, 0x88, 0xAE, 0x46, 0xE3, 0x81, + 0xBB, 0xE3, 0x81, 0x8B, 0x46, 0xE3, 0x82, 0x88, + 0xE3, 0x82, 0x8A, 0x46, 0xE3, 0x82, 0xAD, 0xE3, + // Bytes 26c0 - 26ff + 0x83, 0xAD, 0x46, 0xE3, 0x82, 0xB3, 0xE3, 0x82, + 0xB3, 0x46, 0xE3, 0x82, 0xB3, 0xE3, 0x83, 0x88, + 0x46, 0xE3, 0x83, 0x88, 0xE3, 0x83, 0xB3, 0x46, + 0xE3, 0x83, 0x8A, 0xE3, 0x83, 0x8E, 0x46, 0xE3, + 0x83, 0x9B, 0xE3, 0x83, 0xB3, 0x46, 0xE3, 0x83, + 0x9F, 0xE3, 0x83, 0xAA, 0x46, 0xE3, 0x83, 0xAA, + 0xE3, 0x83, 0xA9, 0x46, 0xE3, 0x83, 0xAC, 0xE3, + 0x83, 0xA0, 0x46, 0xE5, 0xA4, 0xA7, 0xE6, 0xAD, + // Bytes 2700 - 273f + 0xA3, 0x46, 0xE5, 0xB9, 0xB3, 0xE6, 0x88, 0x90, + 0x46, 0xE6, 0x98, 0x8E, 0xE6, 0xB2, 0xBB, 0x46, + 0xE6, 0x98, 0xAD, 0xE5, 0x92, 0x8C, 0x47, 0x72, + 0x61, 0x64, 0xE2, 0x88, 0x95, 0x73, 0x47, 0xE3, + 0x80, 0x94, 0x53, 0xE3, 0x80, 0x95, 0x48, 0x28, + 0xE1, 0x84, 0x80, 0xE1, 0x85, 0xA1, 0x29, 0x48, + 0x28, 0xE1, 0x84, 0x82, 0xE1, 0x85, 0xA1, 0x29, + 0x48, 0x28, 0xE1, 0x84, 0x83, 0xE1, 0x85, 0xA1, + // Bytes 2740 - 277f + 0x29, 0x48, 0x28, 0xE1, 0x84, 0x85, 0xE1, 0x85, + 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x86, 0xE1, + 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x87, + 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, + 0x89, 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, + 0x84, 0x8B, 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, + 0xE1, 0x84, 0x8C, 0xE1, 0x85, 0xA1, 0x29, 0x48, + 0x28, 0xE1, 0x84, 0x8C, 0xE1, 0x85, 0xAE, 0x29, + // Bytes 2780 - 27bf + 0x48, 0x28, 0xE1, 0x84, 0x8E, 0xE1, 0x85, 0xA1, + 0x29, 0x48, 0x28, 0xE1, 0x84, 0x8F, 0xE1, 0x85, + 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x90, 0xE1, + 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x91, + 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, + 0x92, 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x72, 0x61, + 0x64, 0xE2, 0x88, 0x95, 0x73, 0x32, 0x48, 0xD8, + 0xA7, 0xD9, 0x83, 0xD8, 0xA8, 0xD8, 0xB1, 0x48, + // Bytes 27c0 - 27ff + 0xD8, 0xA7, 0xD9, 0x84, 0xD9, 0x84, 0xD9, 0x87, + 0x48, 0xD8, 0xB1, 0xD8, 0xB3, 0xD9, 0x88, 0xD9, + 0x84, 0x48, 0xD8, 0xB1, 0xDB, 0x8C, 0xD8, 0xA7, + 0xD9, 0x84, 0x48, 0xD8, 0xB5, 0xD9, 0x84, 0xD8, + 0xB9, 0xD9, 0x85, 0x48, 0xD8, 0xB9, 0xD9, 0x84, + 0xD9, 0x8A, 0xD9, 0x87, 0x48, 0xD9, 0x85, 0xD8, + 0xAD, 0xD9, 0x85, 0xD8, 0xAF, 0x48, 0xD9, 0x88, + 0xD8, 0xB3, 0xD9, 0x84, 0xD9, 0x85, 0x49, 0xE2, + // Bytes 2800 - 283f + 0x80, 0xB2, 0xE2, 0x80, 0xB2, 0xE2, 0x80, 0xB2, + 0x49, 0xE2, 0x80, 0xB5, 0xE2, 0x80, 0xB5, 0xE2, + 0x80, 0xB5, 0x49, 0xE2, 0x88, 0xAB, 0xE2, 0x88, + 0xAB, 0xE2, 0x88, 0xAB, 0x49, 0xE2, 0x88, 0xAE, + 0xE2, 0x88, 0xAE, 0xE2, 0x88, 0xAE, 0x49, 0xE3, + 0x80, 0x94, 0xE4, 0xB8, 0x89, 0xE3, 0x80, 0x95, + 0x49, 0xE3, 0x80, 0x94, 0xE4, 0xBA, 0x8C, 0xE3, + 0x80, 0x95, 0x49, 0xE3, 0x80, 0x94, 0xE5, 0x8B, + // Bytes 2840 - 287f + 0x9D, 0xE3, 0x80, 0x95, 0x49, 0xE3, 0x80, 0x94, + 0xE5, 0xAE, 0x89, 0xE3, 0x80, 0x95, 0x49, 0xE3, + 0x80, 0x94, 0xE6, 0x89, 0x93, 0xE3, 0x80, 0x95, + 0x49, 0xE3, 0x80, 0x94, 0xE6, 0x95, 0x97, 0xE3, + 0x80, 0x95, 0x49, 0xE3, 0x80, 0x94, 0xE6, 0x9C, + 0xAC, 0xE3, 0x80, 0x95, 0x49, 0xE3, 0x80, 0x94, + 0xE7, 0x82, 0xB9, 0xE3, 0x80, 0x95, 0x49, 0xE3, + 0x80, 0x94, 0xE7, 0x9B, 0x97, 0xE3, 0x80, 0x95, + // Bytes 2880 - 28bf + 0x49, 0xE3, 0x82, 0xA2, 0xE3, 0x83, 0xBC, 0xE3, + 0x83, 0xAB, 0x49, 0xE3, 0x82, 0xA4, 0xE3, 0x83, + 0xB3, 0xE3, 0x83, 0x81, 0x49, 0xE3, 0x82, 0xA6, + 0xE3, 0x82, 0xA9, 0xE3, 0x83, 0xB3, 0x49, 0xE3, + 0x82, 0xAA, 0xE3, 0x83, 0xB3, 0xE3, 0x82, 0xB9, + 0x49, 0xE3, 0x82, 0xAA, 0xE3, 0x83, 0xBC, 0xE3, + 0x83, 0xA0, 0x49, 0xE3, 0x82, 0xAB, 0xE3, 0x82, + 0xA4, 0xE3, 0x83, 0xAA, 0x49, 0xE3, 0x82, 0xB1, + // Bytes 28c0 - 28ff + 0xE3, 0x83, 0xBC, 0xE3, 0x82, 0xB9, 0x49, 0xE3, + 0x82, 0xB3, 0xE3, 0x83, 0xAB, 0xE3, 0x83, 0x8A, + 0x49, 0xE3, 0x82, 0xBB, 0xE3, 0x83, 0xB3, 0xE3, + 0x83, 0x81, 0x49, 0xE3, 0x82, 0xBB, 0xE3, 0x83, + 0xB3, 0xE3, 0x83, 0x88, 0x49, 0xE3, 0x83, 0x86, + 0xE3, 0x82, 0x99, 0xE3, 0x82, 0xB7, 0x49, 0xE3, + 0x83, 0x88, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xAB, + 0x49, 0xE3, 0x83, 0x8E, 0xE3, 0x83, 0x83, 0xE3, + // Bytes 2900 - 293f + 0x83, 0x88, 0x49, 0xE3, 0x83, 0x8F, 0xE3, 0x82, + 0xA4, 0xE3, 0x83, 0x84, 0x49, 0xE3, 0x83, 0x92, + 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xAB, 0x49, 0xE3, + 0x83, 0x92, 0xE3, 0x82, 0x9A, 0xE3, 0x82, 0xB3, + 0x49, 0xE3, 0x83, 0x95, 0xE3, 0x83, 0xA9, 0xE3, + 0x83, 0xB3, 0x49, 0xE3, 0x83, 0x98, 0xE3, 0x82, + 0x9A, 0xE3, 0x82, 0xBD, 0x49, 0xE3, 0x83, 0x98, + 0xE3, 0x83, 0xAB, 0xE3, 0x83, 0x84, 0x49, 0xE3, + // Bytes 2940 - 297f + 0x83, 0x9B, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0xAB, + 0x49, 0xE3, 0x83, 0x9B, 0xE3, 0x83, 0xBC, 0xE3, + 0x83, 0xB3, 0x49, 0xE3, 0x83, 0x9E, 0xE3, 0x82, + 0xA4, 0xE3, 0x83, 0xAB, 0x49, 0xE3, 0x83, 0x9E, + 0xE3, 0x83, 0x83, 0xE3, 0x83, 0x8F, 0x49, 0xE3, + 0x83, 0x9E, 0xE3, 0x83, 0xAB, 0xE3, 0x82, 0xAF, + 0x49, 0xE3, 0x83, 0xA4, 0xE3, 0x83, 0xBC, 0xE3, + 0x83, 0xAB, 0x49, 0xE3, 0x83, 0xA6, 0xE3, 0x82, + // Bytes 2980 - 29bf + 0xA2, 0xE3, 0x83, 0xB3, 0x49, 0xE3, 0x83, 0xAF, + 0xE3, 0x83, 0x83, 0xE3, 0x83, 0x88, 0x4C, 0xE2, + 0x80, 0xB2, 0xE2, 0x80, 0xB2, 0xE2, 0x80, 0xB2, + 0xE2, 0x80, 0xB2, 0x4C, 0xE2, 0x88, 0xAB, 0xE2, + 0x88, 0xAB, 0xE2, 0x88, 0xAB, 0xE2, 0x88, 0xAB, + 0x4C, 0xE3, 0x82, 0xA2, 0xE3, 0x83, 0xAB, 0xE3, + 0x83, 0x95, 0xE3, 0x82, 0xA1, 0x4C, 0xE3, 0x82, + 0xA8, 0xE3, 0x83, 0xBC, 0xE3, 0x82, 0xAB, 0xE3, + // Bytes 29c0 - 29ff + 0x83, 0xBC, 0x4C, 0xE3, 0x82, 0xAB, 0xE3, 0x82, + 0x99, 0xE3, 0x83, 0xAD, 0xE3, 0x83, 0xB3, 0x4C, + 0xE3, 0x82, 0xAB, 0xE3, 0x82, 0x99, 0xE3, 0x83, + 0xB3, 0xE3, 0x83, 0x9E, 0x4C, 0xE3, 0x82, 0xAB, + 0xE3, 0x83, 0xA9, 0xE3, 0x83, 0x83, 0xE3, 0x83, + 0x88, 0x4C, 0xE3, 0x82, 0xAB, 0xE3, 0x83, 0xAD, + 0xE3, 0x83, 0xAA, 0xE3, 0x83, 0xBC, 0x4C, 0xE3, + 0x82, 0xAD, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0x8B, + // Bytes 2a00 - 2a3f + 0xE3, 0x83, 0xBC, 0x4C, 0xE3, 0x82, 0xAD, 0xE3, + 0x83, 0xA5, 0xE3, 0x83, 0xAA, 0xE3, 0x83, 0xBC, + 0x4C, 0xE3, 0x82, 0xAF, 0xE3, 0x82, 0x99, 0xE3, + 0x83, 0xA9, 0xE3, 0x83, 0xA0, 0x4C, 0xE3, 0x82, + 0xAF, 0xE3, 0x83, 0xAD, 0xE3, 0x83, 0xBC, 0xE3, + 0x83, 0x8D, 0x4C, 0xE3, 0x82, 0xB5, 0xE3, 0x82, + 0xA4, 0xE3, 0x82, 0xAF, 0xE3, 0x83, 0xAB, 0x4C, + 0xE3, 0x82, 0xBF, 0xE3, 0x82, 0x99, 0xE3, 0x83, + // Bytes 2a40 - 2a7f + 0xBC, 0xE3, 0x82, 0xB9, 0x4C, 0xE3, 0x83, 0x8F, + 0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xBC, 0xE3, 0x83, + 0x84, 0x4C, 0xE3, 0x83, 0x92, 0xE3, 0x82, 0x9A, + 0xE3, 0x82, 0xAF, 0xE3, 0x83, 0xAB, 0x4C, 0xE3, + 0x83, 0x95, 0xE3, 0x82, 0xA3, 0xE3, 0x83, 0xBC, + 0xE3, 0x83, 0x88, 0x4C, 0xE3, 0x83, 0x98, 0xE3, + 0x82, 0x99, 0xE3, 0x83, 0xBC, 0xE3, 0x82, 0xBF, + 0x4C, 0xE3, 0x83, 0x98, 0xE3, 0x82, 0x9A, 0xE3, + // Bytes 2a80 - 2abf + 0x83, 0x8B, 0xE3, 0x83, 0x92, 0x4C, 0xE3, 0x83, + 0x98, 0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xB3, 0xE3, + 0x82, 0xB9, 0x4C, 0xE3, 0x83, 0x9B, 0xE3, 0x82, + 0x99, 0xE3, 0x83, 0xAB, 0xE3, 0x83, 0x88, 0x4C, + 0xE3, 0x83, 0x9E, 0xE3, 0x82, 0xA4, 0xE3, 0x82, + 0xAF, 0xE3, 0x83, 0xAD, 0x4C, 0xE3, 0x83, 0x9F, + 0xE3, 0x82, 0xAF, 0xE3, 0x83, 0xAD, 0xE3, 0x83, + 0xB3, 0x4C, 0xE3, 0x83, 0xA1, 0xE3, 0x83, 0xBC, + // Bytes 2ac0 - 2aff + 0xE3, 0x83, 0x88, 0xE3, 0x83, 0xAB, 0x4C, 0xE3, + 0x83, 0xAA, 0xE3, 0x83, 0x83, 0xE3, 0x83, 0x88, + 0xE3, 0x83, 0xAB, 0x4C, 0xE3, 0x83, 0xAB, 0xE3, + 0x83, 0x92, 0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xBC, + 0x4C, 0xE6, 0xA0, 0xAA, 0xE5, 0xBC, 0x8F, 0xE4, + 0xBC, 0x9A, 0xE7, 0xA4, 0xBE, 0x4E, 0x28, 0xE1, + 0x84, 0x8B, 0xE1, 0x85, 0xA9, 0xE1, 0x84, 0x92, + 0xE1, 0x85, 0xAE, 0x29, 0x4F, 0xD8, 0xAC, 0xD9, + // Bytes 2b00 - 2b3f + 0x84, 0x20, 0xD8, 0xAC, 0xD9, 0x84, 0xD8, 0xA7, + 0xD9, 0x84, 0xD9, 0x87, 0x4F, 0xE3, 0x82, 0xA2, + 0xE3, 0x83, 0x8F, 0xE3, 0x82, 0x9A, 0xE3, 0x83, + 0xBC, 0xE3, 0x83, 0x88, 0x4F, 0xE3, 0x82, 0xA2, + 0xE3, 0x83, 0xB3, 0xE3, 0x83, 0x98, 0xE3, 0x82, + 0x9A, 0xE3, 0x82, 0xA2, 0x4F, 0xE3, 0x82, 0xAD, + 0xE3, 0x83, 0xAD, 0xE3, 0x83, 0xAF, 0xE3, 0x83, + 0x83, 0xE3, 0x83, 0x88, 0x4F, 0xE3, 0x82, 0xB5, + // Bytes 2b40 - 2b7f + 0xE3, 0x83, 0xB3, 0xE3, 0x83, 0x81, 0xE3, 0x83, + 0xBC, 0xE3, 0x83, 0xA0, 0x4F, 0xE3, 0x83, 0x8F, + 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xBC, 0xE3, 0x83, + 0xAC, 0xE3, 0x83, 0xAB, 0x4F, 0xE3, 0x83, 0x98, + 0xE3, 0x82, 0xAF, 0xE3, 0x82, 0xBF, 0xE3, 0x83, + 0xBC, 0xE3, 0x83, 0xAB, 0x4F, 0xE3, 0x83, 0x9B, + 0xE3, 0x82, 0x9A, 0xE3, 0x82, 0xA4, 0xE3, 0x83, + 0xB3, 0xE3, 0x83, 0x88, 0x4F, 0xE3, 0x83, 0x9E, + // Bytes 2b80 - 2bbf + 0xE3, 0x83, 0xB3, 0xE3, 0x82, 0xB7, 0xE3, 0x83, + 0xA7, 0xE3, 0x83, 0xB3, 0x4F, 0xE3, 0x83, 0xA1, + 0xE3, 0x82, 0xAB, 0xE3, 0x82, 0x99, 0xE3, 0x83, + 0x88, 0xE3, 0x83, 0xB3, 0x4F, 0xE3, 0x83, 0xAB, + 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0x95, 0xE3, 0x82, + 0x99, 0xE3, 0x83, 0xAB, 0x51, 0x28, 0xE1, 0x84, + 0x8B, 0xE1, 0x85, 0xA9, 0xE1, 0x84, 0x8C, 0xE1, + 0x85, 0xA5, 0xE1, 0x86, 0xAB, 0x29, 0x52, 0xE3, + // Bytes 2bc0 - 2bff + 0x82, 0xAD, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xAB, + 0xE3, 0x82, 0xBF, 0xE3, 0x82, 0x99, 0xE3, 0x83, + 0xBC, 0x52, 0xE3, 0x82, 0xAD, 0xE3, 0x83, 0xAD, + 0xE3, 0x82, 0xAF, 0xE3, 0x82, 0x99, 0xE3, 0x83, + 0xA9, 0xE3, 0x83, 0xA0, 0x52, 0xE3, 0x82, 0xAD, + 0xE3, 0x83, 0xAD, 0xE3, 0x83, 0xA1, 0xE3, 0x83, + 0xBC, 0xE3, 0x83, 0x88, 0xE3, 0x83, 0xAB, 0x52, + 0xE3, 0x82, 0xAF, 0xE3, 0x82, 0x99, 0xE3, 0x83, + // Bytes 2c00 - 2c3f + 0xA9, 0xE3, 0x83, 0xA0, 0xE3, 0x83, 0x88, 0xE3, + 0x83, 0xB3, 0x52, 0xE3, 0x82, 0xAF, 0xE3, 0x83, + 0xAB, 0xE3, 0x82, 0xBB, 0xE3, 0x82, 0x99, 0xE3, + 0x82, 0xA4, 0xE3, 0x83, 0xAD, 0x52, 0xE3, 0x83, + 0x8F, 0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xBC, 0xE3, + 0x82, 0xBB, 0xE3, 0x83, 0xB3, 0xE3, 0x83, 0x88, + 0x52, 0xE3, 0x83, 0x92, 0xE3, 0x82, 0x9A, 0xE3, + 0x82, 0xA2, 0xE3, 0x82, 0xB9, 0xE3, 0x83, 0x88, + // Bytes 2c40 - 2c7f + 0xE3, 0x83, 0xAB, 0x52, 0xE3, 0x83, 0x95, 0xE3, + 0x82, 0x99, 0xE3, 0x83, 0x83, 0xE3, 0x82, 0xB7, + 0xE3, 0x82, 0xA7, 0xE3, 0x83, 0xAB, 0x52, 0xE3, + 0x83, 0x9F, 0xE3, 0x83, 0xAA, 0xE3, 0x83, 0x8F, + 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xBC, 0xE3, 0x83, + 0xAB, 0x52, 0xE3, 0x83, 0xAC, 0xE3, 0x83, 0xB3, + 0xE3, 0x83, 0x88, 0xE3, 0x82, 0xB1, 0xE3, 0x82, + 0x99, 0xE3, 0x83, 0xB3, 0x61, 0xD8, 0xB5, 0xD9, + // Bytes 2c80 - 2cbf + 0x84, 0xD9, 0x89, 0x20, 0xD8, 0xA7, 0xD9, 0x84, + 0xD9, 0x84, 0xD9, 0x87, 0x20, 0xD8, 0xB9, 0xD9, + 0x84, 0xD9, 0x8A, 0xD9, 0x87, 0x20, 0xD9, 0x88, + 0xD8, 0xB3, 0xD9, 0x84, 0xD9, 0x85, 0x06, 0xE0, + 0xA7, 0x87, 0xE0, 0xA6, 0xBE, 0x01, 0x06, 0xE0, + 0xA7, 0x87, 0xE0, 0xA7, 0x97, 0x01, 0x06, 0xE0, + 0xAD, 0x87, 0xE0, 0xAC, 0xBE, 0x01, 0x06, 0xE0, + 0xAD, 0x87, 0xE0, 0xAD, 0x96, 0x01, 0x06, 0xE0, + // Bytes 2cc0 - 2cff + 0xAD, 0x87, 0xE0, 0xAD, 0x97, 0x01, 0x06, 0xE0, + 0xAE, 0x92, 0xE0, 0xAF, 0x97, 0x01, 0x06, 0xE0, + 0xAF, 0x86, 0xE0, 0xAE, 0xBE, 0x01, 0x06, 0xE0, + 0xAF, 0x86, 0xE0, 0xAF, 0x97, 0x01, 0x06, 0xE0, + 0xAF, 0x87, 0xE0, 0xAE, 0xBE, 0x01, 0x06, 0xE0, + 0xB2, 0xBF, 0xE0, 0xB3, 0x95, 0x01, 0x06, 0xE0, + 0xB3, 0x86, 0xE0, 0xB3, 0x95, 0x01, 0x06, 0xE0, + 0xB3, 0x86, 0xE0, 0xB3, 0x96, 0x01, 0x06, 0xE0, + // Bytes 2d00 - 2d3f + 0xB5, 0x86, 0xE0, 0xB4, 0xBE, 0x01, 0x06, 0xE0, + 0xB5, 0x86, 0xE0, 0xB5, 0x97, 0x01, 0x06, 0xE0, + 0xB5, 0x87, 0xE0, 0xB4, 0xBE, 0x01, 0x06, 0xE0, + 0xB7, 0x99, 0xE0, 0xB7, 0x9F, 0x01, 0x06, 0xE1, + 0x80, 0xA5, 0xE1, 0x80, 0xAE, 0x01, 0x06, 0xE1, + 0xAC, 0x85, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, + 0xAC, 0x87, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, + 0xAC, 0x89, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, + // Bytes 2d40 - 2d7f + 0xAC, 0x8B, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, + 0xAC, 0x8D, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, + 0xAC, 0x91, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, + 0xAC, 0xBA, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, + 0xAC, 0xBC, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, + 0xAC, 0xBE, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, + 0xAC, 0xBF, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, + 0xAD, 0x82, 0xE1, 0xAC, 0xB5, 0x01, 0x08, 0xF0, + // Bytes 2d80 - 2dbf + 0x91, 0x84, 0xB1, 0xF0, 0x91, 0x84, 0xA7, 0x01, + 0x08, 0xF0, 0x91, 0x84, 0xB2, 0xF0, 0x91, 0x84, + 0xA7, 0x01, 0x08, 0xF0, 0x91, 0x8D, 0x87, 0xF0, + 0x91, 0x8C, 0xBE, 0x01, 0x08, 0xF0, 0x91, 0x8D, + 0x87, 0xF0, 0x91, 0x8D, 0x97, 0x01, 0x08, 0xF0, + 0x91, 0x92, 0xB9, 0xF0, 0x91, 0x92, 0xB0, 0x01, + 0x08, 0xF0, 0x91, 0x92, 0xB9, 0xF0, 0x91, 0x92, + 0xBA, 0x01, 0x08, 0xF0, 0x91, 0x92, 0xB9, 0xF0, + // Bytes 2dc0 - 2dff + 0x91, 0x92, 0xBD, 0x01, 0x08, 0xF0, 0x91, 0x96, + 0xB8, 0xF0, 0x91, 0x96, 0xAF, 0x01, 0x08, 0xF0, + 0x91, 0x96, 0xB9, 0xF0, 0x91, 0x96, 0xAF, 0x01, + 0x09, 0xE0, 0xB3, 0x86, 0xE0, 0xB3, 0x82, 0xE0, + 0xB3, 0x95, 0x02, 0x09, 0xE0, 0xB7, 0x99, 0xE0, + 0xB7, 0x8F, 0xE0, 0xB7, 0x8A, 0x12, 0x44, 0x44, + 0x5A, 0xCC, 0x8C, 0xC9, 0x44, 0x44, 0x7A, 0xCC, + 0x8C, 0xC9, 0x44, 0x64, 0x7A, 0xCC, 0x8C, 0xC9, + // Bytes 2e00 - 2e3f + 0x46, 0xD9, 0x84, 0xD8, 0xA7, 0xD9, 0x93, 0xC9, + 0x46, 0xD9, 0x84, 0xD8, 0xA7, 0xD9, 0x94, 0xC9, + 0x46, 0xD9, 0x84, 0xD8, 0xA7, 0xD9, 0x95, 0xB5, + 0x46, 0xE1, 0x84, 0x80, 0xE1, 0x85, 0xA1, 0x01, + 0x46, 0xE1, 0x84, 0x82, 0xE1, 0x85, 0xA1, 0x01, + 0x46, 0xE1, 0x84, 0x83, 0xE1, 0x85, 0xA1, 0x01, + 0x46, 0xE1, 0x84, 0x85, 0xE1, 0x85, 0xA1, 0x01, + 0x46, 0xE1, 0x84, 0x86, 0xE1, 0x85, 0xA1, 0x01, + // Bytes 2e40 - 2e7f + 0x46, 0xE1, 0x84, 0x87, 0xE1, 0x85, 0xA1, 0x01, + 0x46, 0xE1, 0x84, 0x89, 0xE1, 0x85, 0xA1, 0x01, + 0x46, 0xE1, 0x84, 0x8B, 0xE1, 0x85, 0xA1, 0x01, + 0x46, 0xE1, 0x84, 0x8B, 0xE1, 0x85, 0xAE, 0x01, + 0x46, 0xE1, 0x84, 0x8C, 0xE1, 0x85, 0xA1, 0x01, + 0x46, 0xE1, 0x84, 0x8E, 0xE1, 0x85, 0xA1, 0x01, + 0x46, 0xE1, 0x84, 0x8F, 0xE1, 0x85, 0xA1, 0x01, + 0x46, 0xE1, 0x84, 0x90, 0xE1, 0x85, 0xA1, 0x01, + // Bytes 2e80 - 2ebf + 0x46, 0xE1, 0x84, 0x91, 0xE1, 0x85, 0xA1, 0x01, + 0x46, 0xE1, 0x84, 0x92, 0xE1, 0x85, 0xA1, 0x01, + 0x49, 0xE3, 0x83, 0xA1, 0xE3, 0x82, 0xAB, 0xE3, + 0x82, 0x99, 0x0D, 0x4C, 0xE1, 0x84, 0x8C, 0xE1, + 0x85, 0xAE, 0xE1, 0x84, 0x8B, 0xE1, 0x85, 0xB4, + 0x01, 0x4C, 0xE3, 0x82, 0xAD, 0xE3, 0x82, 0x99, + 0xE3, 0x82, 0xAB, 0xE3, 0x82, 0x99, 0x0D, 0x4C, + 0xE3, 0x82, 0xB3, 0xE3, 0x83, 0xBC, 0xE3, 0x83, + // Bytes 2ec0 - 2eff + 0x9B, 0xE3, 0x82, 0x9A, 0x0D, 0x4C, 0xE3, 0x83, + 0xA4, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0x88, 0xE3, + 0x82, 0x99, 0x0D, 0x4F, 0xE1, 0x84, 0x8E, 0xE1, + 0x85, 0xA1, 0xE1, 0x86, 0xB7, 0xE1, 0x84, 0x80, + 0xE1, 0x85, 0xA9, 0x01, 0x4F, 0xE3, 0x82, 0xA4, + 0xE3, 0x83, 0x8B, 0xE3, 0x83, 0xB3, 0xE3, 0x82, + 0xAF, 0xE3, 0x82, 0x99, 0x0D, 0x4F, 0xE3, 0x82, + 0xB7, 0xE3, 0x83, 0xAA, 0xE3, 0x83, 0xB3, 0xE3, + // Bytes 2f00 - 2f3f + 0x82, 0xAF, 0xE3, 0x82, 0x99, 0x0D, 0x4F, 0xE3, + 0x83, 0x98, 0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xBC, + 0xE3, 0x82, 0xB7, 0xE3, 0x82, 0x99, 0x0D, 0x4F, + 0xE3, 0x83, 0x9B, 0xE3, 0x82, 0x9A, 0xE3, 0x83, + 0xB3, 0xE3, 0x83, 0x88, 0xE3, 0x82, 0x99, 0x0D, + 0x52, 0xE3, 0x82, 0xA8, 0xE3, 0x82, 0xB9, 0xE3, + 0x82, 0xAF, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0x88, + 0xE3, 0x82, 0x99, 0x0D, 0x52, 0xE3, 0x83, 0x95, + // Bytes 2f40 - 2f7f + 0xE3, 0x82, 0xA1, 0xE3, 0x83, 0xA9, 0xE3, 0x83, + 0x83, 0xE3, 0x83, 0x88, 0xE3, 0x82, 0x99, 0x0D, + 0x86, 0xE0, 0xB3, 0x86, 0xE0, 0xB3, 0x82, 0x01, + 0x86, 0xE0, 0xB7, 0x99, 0xE0, 0xB7, 0x8F, 0x01, + 0x03, 0x3C, 0xCC, 0xB8, 0x05, 0x03, 0x3D, 0xCC, + 0xB8, 0x05, 0x03, 0x3E, 0xCC, 0xB8, 0x05, 0x03, + 0x41, 0xCC, 0x80, 0xC9, 0x03, 0x41, 0xCC, 0x81, + 0xC9, 0x03, 0x41, 0xCC, 0x83, 0xC9, 0x03, 0x41, + // Bytes 2f80 - 2fbf + 0xCC, 0x84, 0xC9, 0x03, 0x41, 0xCC, 0x89, 0xC9, + 0x03, 0x41, 0xCC, 0x8C, 0xC9, 0x03, 0x41, 0xCC, + 0x8F, 0xC9, 0x03, 0x41, 0xCC, 0x91, 0xC9, 0x03, + 0x41, 0xCC, 0xA5, 0xB5, 0x03, 0x41, 0xCC, 0xA8, + 0xA5, 0x03, 0x42, 0xCC, 0x87, 0xC9, 0x03, 0x42, + 0xCC, 0xA3, 0xB5, 0x03, 0x42, 0xCC, 0xB1, 0xB5, + 0x03, 0x43, 0xCC, 0x81, 0xC9, 0x03, 0x43, 0xCC, + 0x82, 0xC9, 0x03, 0x43, 0xCC, 0x87, 0xC9, 0x03, + // Bytes 2fc0 - 2fff + 0x43, 0xCC, 0x8C, 0xC9, 0x03, 0x44, 0xCC, 0x87, + 0xC9, 0x03, 0x44, 0xCC, 0x8C, 0xC9, 0x03, 0x44, + 0xCC, 0xA3, 0xB5, 0x03, 0x44, 0xCC, 0xA7, 0xA5, + 0x03, 0x44, 0xCC, 0xAD, 0xB5, 0x03, 0x44, 0xCC, + 0xB1, 0xB5, 0x03, 0x45, 0xCC, 0x80, 0xC9, 0x03, + 0x45, 0xCC, 0x81, 0xC9, 0x03, 0x45, 0xCC, 0x83, + 0xC9, 0x03, 0x45, 0xCC, 0x86, 0xC9, 0x03, 0x45, + 0xCC, 0x87, 0xC9, 0x03, 0x45, 0xCC, 0x88, 0xC9, + // Bytes 3000 - 303f + 0x03, 0x45, 0xCC, 0x89, 0xC9, 0x03, 0x45, 0xCC, + 0x8C, 0xC9, 0x03, 0x45, 0xCC, 0x8F, 0xC9, 0x03, + 0x45, 0xCC, 0x91, 0xC9, 0x03, 0x45, 0xCC, 0xA8, + 0xA5, 0x03, 0x45, 0xCC, 0xAD, 0xB5, 0x03, 0x45, + 0xCC, 0xB0, 0xB5, 0x03, 0x46, 0xCC, 0x87, 0xC9, + 0x03, 0x47, 0xCC, 0x81, 0xC9, 0x03, 0x47, 0xCC, + 0x82, 0xC9, 0x03, 0x47, 0xCC, 0x84, 0xC9, 0x03, + 0x47, 0xCC, 0x86, 0xC9, 0x03, 0x47, 0xCC, 0x87, + // Bytes 3040 - 307f + 0xC9, 0x03, 0x47, 0xCC, 0x8C, 0xC9, 0x03, 0x47, + 0xCC, 0xA7, 0xA5, 0x03, 0x48, 0xCC, 0x82, 0xC9, + 0x03, 0x48, 0xCC, 0x87, 0xC9, 0x03, 0x48, 0xCC, + 0x88, 0xC9, 0x03, 0x48, 0xCC, 0x8C, 0xC9, 0x03, + 0x48, 0xCC, 0xA3, 0xB5, 0x03, 0x48, 0xCC, 0xA7, + 0xA5, 0x03, 0x48, 0xCC, 0xAE, 0xB5, 0x03, 0x49, + 0xCC, 0x80, 0xC9, 0x03, 0x49, 0xCC, 0x81, 0xC9, + 0x03, 0x49, 0xCC, 0x82, 0xC9, 0x03, 0x49, 0xCC, + // Bytes 3080 - 30bf + 0x83, 0xC9, 0x03, 0x49, 0xCC, 0x84, 0xC9, 0x03, + 0x49, 0xCC, 0x86, 0xC9, 0x03, 0x49, 0xCC, 0x87, + 0xC9, 0x03, 0x49, 0xCC, 0x89, 0xC9, 0x03, 0x49, + 0xCC, 0x8C, 0xC9, 0x03, 0x49, 0xCC, 0x8F, 0xC9, + 0x03, 0x49, 0xCC, 0x91, 0xC9, 0x03, 0x49, 0xCC, + 0xA3, 0xB5, 0x03, 0x49, 0xCC, 0xA8, 0xA5, 0x03, + 0x49, 0xCC, 0xB0, 0xB5, 0x03, 0x4A, 0xCC, 0x82, + 0xC9, 0x03, 0x4B, 0xCC, 0x81, 0xC9, 0x03, 0x4B, + // Bytes 30c0 - 30ff + 0xCC, 0x8C, 0xC9, 0x03, 0x4B, 0xCC, 0xA3, 0xB5, + 0x03, 0x4B, 0xCC, 0xA7, 0xA5, 0x03, 0x4B, 0xCC, + 0xB1, 0xB5, 0x03, 0x4C, 0xCC, 0x81, 0xC9, 0x03, + 0x4C, 0xCC, 0x8C, 0xC9, 0x03, 0x4C, 0xCC, 0xA7, + 0xA5, 0x03, 0x4C, 0xCC, 0xAD, 0xB5, 0x03, 0x4C, + 0xCC, 0xB1, 0xB5, 0x03, 0x4D, 0xCC, 0x81, 0xC9, + 0x03, 0x4D, 0xCC, 0x87, 0xC9, 0x03, 0x4D, 0xCC, + 0xA3, 0xB5, 0x03, 0x4E, 0xCC, 0x80, 0xC9, 0x03, + // Bytes 3100 - 313f + 0x4E, 0xCC, 0x81, 0xC9, 0x03, 0x4E, 0xCC, 0x83, + 0xC9, 0x03, 0x4E, 0xCC, 0x87, 0xC9, 0x03, 0x4E, + 0xCC, 0x8C, 0xC9, 0x03, 0x4E, 0xCC, 0xA3, 0xB5, + 0x03, 0x4E, 0xCC, 0xA7, 0xA5, 0x03, 0x4E, 0xCC, + 0xAD, 0xB5, 0x03, 0x4E, 0xCC, 0xB1, 0xB5, 0x03, + 0x4F, 0xCC, 0x80, 0xC9, 0x03, 0x4F, 0xCC, 0x81, + 0xC9, 0x03, 0x4F, 0xCC, 0x86, 0xC9, 0x03, 0x4F, + 0xCC, 0x89, 0xC9, 0x03, 0x4F, 0xCC, 0x8B, 0xC9, + // Bytes 3140 - 317f + 0x03, 0x4F, 0xCC, 0x8C, 0xC9, 0x03, 0x4F, 0xCC, + 0x8F, 0xC9, 0x03, 0x4F, 0xCC, 0x91, 0xC9, 0x03, + 0x50, 0xCC, 0x81, 0xC9, 0x03, 0x50, 0xCC, 0x87, + 0xC9, 0x03, 0x52, 0xCC, 0x81, 0xC9, 0x03, 0x52, + 0xCC, 0x87, 0xC9, 0x03, 0x52, 0xCC, 0x8C, 0xC9, + 0x03, 0x52, 0xCC, 0x8F, 0xC9, 0x03, 0x52, 0xCC, + 0x91, 0xC9, 0x03, 0x52, 0xCC, 0xA7, 0xA5, 0x03, + 0x52, 0xCC, 0xB1, 0xB5, 0x03, 0x53, 0xCC, 0x82, + // Bytes 3180 - 31bf + 0xC9, 0x03, 0x53, 0xCC, 0x87, 0xC9, 0x03, 0x53, + 0xCC, 0xA6, 0xB5, 0x03, 0x53, 0xCC, 0xA7, 0xA5, + 0x03, 0x54, 0xCC, 0x87, 0xC9, 0x03, 0x54, 0xCC, + 0x8C, 0xC9, 0x03, 0x54, 0xCC, 0xA3, 0xB5, 0x03, + 0x54, 0xCC, 0xA6, 0xB5, 0x03, 0x54, 0xCC, 0xA7, + 0xA5, 0x03, 0x54, 0xCC, 0xAD, 0xB5, 0x03, 0x54, + 0xCC, 0xB1, 0xB5, 0x03, 0x55, 0xCC, 0x80, 0xC9, + 0x03, 0x55, 0xCC, 0x81, 0xC9, 0x03, 0x55, 0xCC, + // Bytes 31c0 - 31ff + 0x82, 0xC9, 0x03, 0x55, 0xCC, 0x86, 0xC9, 0x03, + 0x55, 0xCC, 0x89, 0xC9, 0x03, 0x55, 0xCC, 0x8A, + 0xC9, 0x03, 0x55, 0xCC, 0x8B, 0xC9, 0x03, 0x55, + 0xCC, 0x8C, 0xC9, 0x03, 0x55, 0xCC, 0x8F, 0xC9, + 0x03, 0x55, 0xCC, 0x91, 0xC9, 0x03, 0x55, 0xCC, + 0xA3, 0xB5, 0x03, 0x55, 0xCC, 0xA4, 0xB5, 0x03, + 0x55, 0xCC, 0xA8, 0xA5, 0x03, 0x55, 0xCC, 0xAD, + 0xB5, 0x03, 0x55, 0xCC, 0xB0, 0xB5, 0x03, 0x56, + // Bytes 3200 - 323f + 0xCC, 0x83, 0xC9, 0x03, 0x56, 0xCC, 0xA3, 0xB5, + 0x03, 0x57, 0xCC, 0x80, 0xC9, 0x03, 0x57, 0xCC, + 0x81, 0xC9, 0x03, 0x57, 0xCC, 0x82, 0xC9, 0x03, + 0x57, 0xCC, 0x87, 0xC9, 0x03, 0x57, 0xCC, 0x88, + 0xC9, 0x03, 0x57, 0xCC, 0xA3, 0xB5, 0x03, 0x58, + 0xCC, 0x87, 0xC9, 0x03, 0x58, 0xCC, 0x88, 0xC9, + 0x03, 0x59, 0xCC, 0x80, 0xC9, 0x03, 0x59, 0xCC, + 0x81, 0xC9, 0x03, 0x59, 0xCC, 0x82, 0xC9, 0x03, + // Bytes 3240 - 327f + 0x59, 0xCC, 0x83, 0xC9, 0x03, 0x59, 0xCC, 0x84, + 0xC9, 0x03, 0x59, 0xCC, 0x87, 0xC9, 0x03, 0x59, + 0xCC, 0x88, 0xC9, 0x03, 0x59, 0xCC, 0x89, 0xC9, + 0x03, 0x59, 0xCC, 0xA3, 0xB5, 0x03, 0x5A, 0xCC, + 0x81, 0xC9, 0x03, 0x5A, 0xCC, 0x82, 0xC9, 0x03, + 0x5A, 0xCC, 0x87, 0xC9, 0x03, 0x5A, 0xCC, 0x8C, + 0xC9, 0x03, 0x5A, 0xCC, 0xA3, 0xB5, 0x03, 0x5A, + 0xCC, 0xB1, 0xB5, 0x03, 0x61, 0xCC, 0x80, 0xC9, + // Bytes 3280 - 32bf + 0x03, 0x61, 0xCC, 0x81, 0xC9, 0x03, 0x61, 0xCC, + 0x83, 0xC9, 0x03, 0x61, 0xCC, 0x84, 0xC9, 0x03, + 0x61, 0xCC, 0x89, 0xC9, 0x03, 0x61, 0xCC, 0x8C, + 0xC9, 0x03, 0x61, 0xCC, 0x8F, 0xC9, 0x03, 0x61, + 0xCC, 0x91, 0xC9, 0x03, 0x61, 0xCC, 0xA5, 0xB5, + 0x03, 0x61, 0xCC, 0xA8, 0xA5, 0x03, 0x62, 0xCC, + 0x87, 0xC9, 0x03, 0x62, 0xCC, 0xA3, 0xB5, 0x03, + 0x62, 0xCC, 0xB1, 0xB5, 0x03, 0x63, 0xCC, 0x81, + // Bytes 32c0 - 32ff + 0xC9, 0x03, 0x63, 0xCC, 0x82, 0xC9, 0x03, 0x63, + 0xCC, 0x87, 0xC9, 0x03, 0x63, 0xCC, 0x8C, 0xC9, + 0x03, 0x64, 0xCC, 0x87, 0xC9, 0x03, 0x64, 0xCC, + 0x8C, 0xC9, 0x03, 0x64, 0xCC, 0xA3, 0xB5, 0x03, + 0x64, 0xCC, 0xA7, 0xA5, 0x03, 0x64, 0xCC, 0xAD, + 0xB5, 0x03, 0x64, 0xCC, 0xB1, 0xB5, 0x03, 0x65, + 0xCC, 0x80, 0xC9, 0x03, 0x65, 0xCC, 0x81, 0xC9, + 0x03, 0x65, 0xCC, 0x83, 0xC9, 0x03, 0x65, 0xCC, + // Bytes 3300 - 333f + 0x86, 0xC9, 0x03, 0x65, 0xCC, 0x87, 0xC9, 0x03, + 0x65, 0xCC, 0x88, 0xC9, 0x03, 0x65, 0xCC, 0x89, + 0xC9, 0x03, 0x65, 0xCC, 0x8C, 0xC9, 0x03, 0x65, + 0xCC, 0x8F, 0xC9, 0x03, 0x65, 0xCC, 0x91, 0xC9, + 0x03, 0x65, 0xCC, 0xA8, 0xA5, 0x03, 0x65, 0xCC, + 0xAD, 0xB5, 0x03, 0x65, 0xCC, 0xB0, 0xB5, 0x03, + 0x66, 0xCC, 0x87, 0xC9, 0x03, 0x67, 0xCC, 0x81, + 0xC9, 0x03, 0x67, 0xCC, 0x82, 0xC9, 0x03, 0x67, + // Bytes 3340 - 337f + 0xCC, 0x84, 0xC9, 0x03, 0x67, 0xCC, 0x86, 0xC9, + 0x03, 0x67, 0xCC, 0x87, 0xC9, 0x03, 0x67, 0xCC, + 0x8C, 0xC9, 0x03, 0x67, 0xCC, 0xA7, 0xA5, 0x03, + 0x68, 0xCC, 0x82, 0xC9, 0x03, 0x68, 0xCC, 0x87, + 0xC9, 0x03, 0x68, 0xCC, 0x88, 0xC9, 0x03, 0x68, + 0xCC, 0x8C, 0xC9, 0x03, 0x68, 0xCC, 0xA3, 0xB5, + 0x03, 0x68, 0xCC, 0xA7, 0xA5, 0x03, 0x68, 0xCC, + 0xAE, 0xB5, 0x03, 0x68, 0xCC, 0xB1, 0xB5, 0x03, + // Bytes 3380 - 33bf + 0x69, 0xCC, 0x80, 0xC9, 0x03, 0x69, 0xCC, 0x81, + 0xC9, 0x03, 0x69, 0xCC, 0x82, 0xC9, 0x03, 0x69, + 0xCC, 0x83, 0xC9, 0x03, 0x69, 0xCC, 0x84, 0xC9, + 0x03, 0x69, 0xCC, 0x86, 0xC9, 0x03, 0x69, 0xCC, + 0x89, 0xC9, 0x03, 0x69, 0xCC, 0x8C, 0xC9, 0x03, + 0x69, 0xCC, 0x8F, 0xC9, 0x03, 0x69, 0xCC, 0x91, + 0xC9, 0x03, 0x69, 0xCC, 0xA3, 0xB5, 0x03, 0x69, + 0xCC, 0xA8, 0xA5, 0x03, 0x69, 0xCC, 0xB0, 0xB5, + // Bytes 33c0 - 33ff + 0x03, 0x6A, 0xCC, 0x82, 0xC9, 0x03, 0x6A, 0xCC, + 0x8C, 0xC9, 0x03, 0x6B, 0xCC, 0x81, 0xC9, 0x03, + 0x6B, 0xCC, 0x8C, 0xC9, 0x03, 0x6B, 0xCC, 0xA3, + 0xB5, 0x03, 0x6B, 0xCC, 0xA7, 0xA5, 0x03, 0x6B, + 0xCC, 0xB1, 0xB5, 0x03, 0x6C, 0xCC, 0x81, 0xC9, + 0x03, 0x6C, 0xCC, 0x8C, 0xC9, 0x03, 0x6C, 0xCC, + 0xA7, 0xA5, 0x03, 0x6C, 0xCC, 0xAD, 0xB5, 0x03, + 0x6C, 0xCC, 0xB1, 0xB5, 0x03, 0x6D, 0xCC, 0x81, + // Bytes 3400 - 343f + 0xC9, 0x03, 0x6D, 0xCC, 0x87, 0xC9, 0x03, 0x6D, + 0xCC, 0xA3, 0xB5, 0x03, 0x6E, 0xCC, 0x80, 0xC9, + 0x03, 0x6E, 0xCC, 0x81, 0xC9, 0x03, 0x6E, 0xCC, + 0x83, 0xC9, 0x03, 0x6E, 0xCC, 0x87, 0xC9, 0x03, + 0x6E, 0xCC, 0x8C, 0xC9, 0x03, 0x6E, 0xCC, 0xA3, + 0xB5, 0x03, 0x6E, 0xCC, 0xA7, 0xA5, 0x03, 0x6E, + 0xCC, 0xAD, 0xB5, 0x03, 0x6E, 0xCC, 0xB1, 0xB5, + 0x03, 0x6F, 0xCC, 0x80, 0xC9, 0x03, 0x6F, 0xCC, + // Bytes 3440 - 347f + 0x81, 0xC9, 0x03, 0x6F, 0xCC, 0x86, 0xC9, 0x03, + 0x6F, 0xCC, 0x89, 0xC9, 0x03, 0x6F, 0xCC, 0x8B, + 0xC9, 0x03, 0x6F, 0xCC, 0x8C, 0xC9, 0x03, 0x6F, + 0xCC, 0x8F, 0xC9, 0x03, 0x6F, 0xCC, 0x91, 0xC9, + 0x03, 0x70, 0xCC, 0x81, 0xC9, 0x03, 0x70, 0xCC, + 0x87, 0xC9, 0x03, 0x72, 0xCC, 0x81, 0xC9, 0x03, + 0x72, 0xCC, 0x87, 0xC9, 0x03, 0x72, 0xCC, 0x8C, + 0xC9, 0x03, 0x72, 0xCC, 0x8F, 0xC9, 0x03, 0x72, + // Bytes 3480 - 34bf + 0xCC, 0x91, 0xC9, 0x03, 0x72, 0xCC, 0xA7, 0xA5, + 0x03, 0x72, 0xCC, 0xB1, 0xB5, 0x03, 0x73, 0xCC, + 0x82, 0xC9, 0x03, 0x73, 0xCC, 0x87, 0xC9, 0x03, + 0x73, 0xCC, 0xA6, 0xB5, 0x03, 0x73, 0xCC, 0xA7, + 0xA5, 0x03, 0x74, 0xCC, 0x87, 0xC9, 0x03, 0x74, + 0xCC, 0x88, 0xC9, 0x03, 0x74, 0xCC, 0x8C, 0xC9, + 0x03, 0x74, 0xCC, 0xA3, 0xB5, 0x03, 0x74, 0xCC, + 0xA6, 0xB5, 0x03, 0x74, 0xCC, 0xA7, 0xA5, 0x03, + // Bytes 34c0 - 34ff + 0x74, 0xCC, 0xAD, 0xB5, 0x03, 0x74, 0xCC, 0xB1, + 0xB5, 0x03, 0x75, 0xCC, 0x80, 0xC9, 0x03, 0x75, + 0xCC, 0x81, 0xC9, 0x03, 0x75, 0xCC, 0x82, 0xC9, + 0x03, 0x75, 0xCC, 0x86, 0xC9, 0x03, 0x75, 0xCC, + 0x89, 0xC9, 0x03, 0x75, 0xCC, 0x8A, 0xC9, 0x03, + 0x75, 0xCC, 0x8B, 0xC9, 0x03, 0x75, 0xCC, 0x8C, + 0xC9, 0x03, 0x75, 0xCC, 0x8F, 0xC9, 0x03, 0x75, + 0xCC, 0x91, 0xC9, 0x03, 0x75, 0xCC, 0xA3, 0xB5, + // Bytes 3500 - 353f + 0x03, 0x75, 0xCC, 0xA4, 0xB5, 0x03, 0x75, 0xCC, + 0xA8, 0xA5, 0x03, 0x75, 0xCC, 0xAD, 0xB5, 0x03, + 0x75, 0xCC, 0xB0, 0xB5, 0x03, 0x76, 0xCC, 0x83, + 0xC9, 0x03, 0x76, 0xCC, 0xA3, 0xB5, 0x03, 0x77, + 0xCC, 0x80, 0xC9, 0x03, 0x77, 0xCC, 0x81, 0xC9, + 0x03, 0x77, 0xCC, 0x82, 0xC9, 0x03, 0x77, 0xCC, + 0x87, 0xC9, 0x03, 0x77, 0xCC, 0x88, 0xC9, 0x03, + 0x77, 0xCC, 0x8A, 0xC9, 0x03, 0x77, 0xCC, 0xA3, + // Bytes 3540 - 357f + 0xB5, 0x03, 0x78, 0xCC, 0x87, 0xC9, 0x03, 0x78, + 0xCC, 0x88, 0xC9, 0x03, 0x79, 0xCC, 0x80, 0xC9, + 0x03, 0x79, 0xCC, 0x81, 0xC9, 0x03, 0x79, 0xCC, + 0x82, 0xC9, 0x03, 0x79, 0xCC, 0x83, 0xC9, 0x03, + 0x79, 0xCC, 0x84, 0xC9, 0x03, 0x79, 0xCC, 0x87, + 0xC9, 0x03, 0x79, 0xCC, 0x88, 0xC9, 0x03, 0x79, + 0xCC, 0x89, 0xC9, 0x03, 0x79, 0xCC, 0x8A, 0xC9, + 0x03, 0x79, 0xCC, 0xA3, 0xB5, 0x03, 0x7A, 0xCC, + // Bytes 3580 - 35bf + 0x81, 0xC9, 0x03, 0x7A, 0xCC, 0x82, 0xC9, 0x03, + 0x7A, 0xCC, 0x87, 0xC9, 0x03, 0x7A, 0xCC, 0x8C, + 0xC9, 0x03, 0x7A, 0xCC, 0xA3, 0xB5, 0x03, 0x7A, + 0xCC, 0xB1, 0xB5, 0x04, 0xC2, 0xA8, 0xCC, 0x80, + 0xCA, 0x04, 0xC2, 0xA8, 0xCC, 0x81, 0xCA, 0x04, + 0xC2, 0xA8, 0xCD, 0x82, 0xCA, 0x04, 0xC3, 0x86, + 0xCC, 0x81, 0xC9, 0x04, 0xC3, 0x86, 0xCC, 0x84, + 0xC9, 0x04, 0xC3, 0x98, 0xCC, 0x81, 0xC9, 0x04, + // Bytes 35c0 - 35ff + 0xC3, 0xA6, 0xCC, 0x81, 0xC9, 0x04, 0xC3, 0xA6, + 0xCC, 0x84, 0xC9, 0x04, 0xC3, 0xB8, 0xCC, 0x81, + 0xC9, 0x04, 0xC5, 0xBF, 0xCC, 0x87, 0xC9, 0x04, + 0xC6, 0xB7, 0xCC, 0x8C, 0xC9, 0x04, 0xCA, 0x92, + 0xCC, 0x8C, 0xC9, 0x04, 0xCE, 0x91, 0xCC, 0x80, + 0xC9, 0x04, 0xCE, 0x91, 0xCC, 0x81, 0xC9, 0x04, + 0xCE, 0x91, 0xCC, 0x84, 0xC9, 0x04, 0xCE, 0x91, + 0xCC, 0x86, 0xC9, 0x04, 0xCE, 0x91, 0xCD, 0x85, + // Bytes 3600 - 363f + 0xD9, 0x04, 0xCE, 0x95, 0xCC, 0x80, 0xC9, 0x04, + 0xCE, 0x95, 0xCC, 0x81, 0xC9, 0x04, 0xCE, 0x97, + 0xCC, 0x80, 0xC9, 0x04, 0xCE, 0x97, 0xCC, 0x81, + 0xC9, 0x04, 0xCE, 0x97, 0xCD, 0x85, 0xD9, 0x04, + 0xCE, 0x99, 0xCC, 0x80, 0xC9, 0x04, 0xCE, 0x99, + 0xCC, 0x81, 0xC9, 0x04, 0xCE, 0x99, 0xCC, 0x84, + 0xC9, 0x04, 0xCE, 0x99, 0xCC, 0x86, 0xC9, 0x04, + 0xCE, 0x99, 0xCC, 0x88, 0xC9, 0x04, 0xCE, 0x9F, + // Bytes 3640 - 367f + 0xCC, 0x80, 0xC9, 0x04, 0xCE, 0x9F, 0xCC, 0x81, + 0xC9, 0x04, 0xCE, 0xA1, 0xCC, 0x94, 0xC9, 0x04, + 0xCE, 0xA5, 0xCC, 0x80, 0xC9, 0x04, 0xCE, 0xA5, + 0xCC, 0x81, 0xC9, 0x04, 0xCE, 0xA5, 0xCC, 0x84, + 0xC9, 0x04, 0xCE, 0xA5, 0xCC, 0x86, 0xC9, 0x04, + 0xCE, 0xA5, 0xCC, 0x88, 0xC9, 0x04, 0xCE, 0xA9, + 0xCC, 0x80, 0xC9, 0x04, 0xCE, 0xA9, 0xCC, 0x81, + 0xC9, 0x04, 0xCE, 0xA9, 0xCD, 0x85, 0xD9, 0x04, + // Bytes 3680 - 36bf + 0xCE, 0xB1, 0xCC, 0x84, 0xC9, 0x04, 0xCE, 0xB1, + 0xCC, 0x86, 0xC9, 0x04, 0xCE, 0xB1, 0xCD, 0x85, + 0xD9, 0x04, 0xCE, 0xB5, 0xCC, 0x80, 0xC9, 0x04, + 0xCE, 0xB5, 0xCC, 0x81, 0xC9, 0x04, 0xCE, 0xB7, + 0xCD, 0x85, 0xD9, 0x04, 0xCE, 0xB9, 0xCC, 0x80, + 0xC9, 0x04, 0xCE, 0xB9, 0xCC, 0x81, 0xC9, 0x04, + 0xCE, 0xB9, 0xCC, 0x84, 0xC9, 0x04, 0xCE, 0xB9, + 0xCC, 0x86, 0xC9, 0x04, 0xCE, 0xB9, 0xCD, 0x82, + // Bytes 36c0 - 36ff + 0xC9, 0x04, 0xCE, 0xBF, 0xCC, 0x80, 0xC9, 0x04, + 0xCE, 0xBF, 0xCC, 0x81, 0xC9, 0x04, 0xCF, 0x81, + 0xCC, 0x93, 0xC9, 0x04, 0xCF, 0x81, 0xCC, 0x94, + 0xC9, 0x04, 0xCF, 0x85, 0xCC, 0x80, 0xC9, 0x04, + 0xCF, 0x85, 0xCC, 0x81, 0xC9, 0x04, 0xCF, 0x85, + 0xCC, 0x84, 0xC9, 0x04, 0xCF, 0x85, 0xCC, 0x86, + 0xC9, 0x04, 0xCF, 0x85, 0xCD, 0x82, 0xC9, 0x04, + 0xCF, 0x89, 0xCD, 0x85, 0xD9, 0x04, 0xCF, 0x92, + // Bytes 3700 - 373f + 0xCC, 0x81, 0xC9, 0x04, 0xCF, 0x92, 0xCC, 0x88, + 0xC9, 0x04, 0xD0, 0x86, 0xCC, 0x88, 0xC9, 0x04, + 0xD0, 0x90, 0xCC, 0x86, 0xC9, 0x04, 0xD0, 0x90, + 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0x93, 0xCC, 0x81, + 0xC9, 0x04, 0xD0, 0x95, 0xCC, 0x80, 0xC9, 0x04, + 0xD0, 0x95, 0xCC, 0x86, 0xC9, 0x04, 0xD0, 0x95, + 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0x96, 0xCC, 0x86, + 0xC9, 0x04, 0xD0, 0x96, 0xCC, 0x88, 0xC9, 0x04, + // Bytes 3740 - 377f + 0xD0, 0x97, 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0x98, + 0xCC, 0x80, 0xC9, 0x04, 0xD0, 0x98, 0xCC, 0x84, + 0xC9, 0x04, 0xD0, 0x98, 0xCC, 0x86, 0xC9, 0x04, + 0xD0, 0x98, 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0x9A, + 0xCC, 0x81, 0xC9, 0x04, 0xD0, 0x9E, 0xCC, 0x88, + 0xC9, 0x04, 0xD0, 0xA3, 0xCC, 0x84, 0xC9, 0x04, + 0xD0, 0xA3, 0xCC, 0x86, 0xC9, 0x04, 0xD0, 0xA3, + 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0xA3, 0xCC, 0x8B, + // Bytes 3780 - 37bf + 0xC9, 0x04, 0xD0, 0xA7, 0xCC, 0x88, 0xC9, 0x04, + 0xD0, 0xAB, 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0xAD, + 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0xB0, 0xCC, 0x86, + 0xC9, 0x04, 0xD0, 0xB0, 0xCC, 0x88, 0xC9, 0x04, + 0xD0, 0xB3, 0xCC, 0x81, 0xC9, 0x04, 0xD0, 0xB5, + 0xCC, 0x80, 0xC9, 0x04, 0xD0, 0xB5, 0xCC, 0x86, + 0xC9, 0x04, 0xD0, 0xB5, 0xCC, 0x88, 0xC9, 0x04, + 0xD0, 0xB6, 0xCC, 0x86, 0xC9, 0x04, 0xD0, 0xB6, + // Bytes 37c0 - 37ff + 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0xB7, 0xCC, 0x88, + 0xC9, 0x04, 0xD0, 0xB8, 0xCC, 0x80, 0xC9, 0x04, + 0xD0, 0xB8, 0xCC, 0x84, 0xC9, 0x04, 0xD0, 0xB8, + 0xCC, 0x86, 0xC9, 0x04, 0xD0, 0xB8, 0xCC, 0x88, + 0xC9, 0x04, 0xD0, 0xBA, 0xCC, 0x81, 0xC9, 0x04, + 0xD0, 0xBE, 0xCC, 0x88, 0xC9, 0x04, 0xD1, 0x83, + 0xCC, 0x84, 0xC9, 0x04, 0xD1, 0x83, 0xCC, 0x86, + 0xC9, 0x04, 0xD1, 0x83, 0xCC, 0x88, 0xC9, 0x04, + // Bytes 3800 - 383f + 0xD1, 0x83, 0xCC, 0x8B, 0xC9, 0x04, 0xD1, 0x87, + 0xCC, 0x88, 0xC9, 0x04, 0xD1, 0x8B, 0xCC, 0x88, + 0xC9, 0x04, 0xD1, 0x8D, 0xCC, 0x88, 0xC9, 0x04, + 0xD1, 0x96, 0xCC, 0x88, 0xC9, 0x04, 0xD1, 0xB4, + 0xCC, 0x8F, 0xC9, 0x04, 0xD1, 0xB5, 0xCC, 0x8F, + 0xC9, 0x04, 0xD3, 0x98, 0xCC, 0x88, 0xC9, 0x04, + 0xD3, 0x99, 0xCC, 0x88, 0xC9, 0x04, 0xD3, 0xA8, + 0xCC, 0x88, 0xC9, 0x04, 0xD3, 0xA9, 0xCC, 0x88, + // Bytes 3840 - 387f + 0xC9, 0x04, 0xD8, 0xA7, 0xD9, 0x93, 0xC9, 0x04, + 0xD8, 0xA7, 0xD9, 0x94, 0xC9, 0x04, 0xD8, 0xA7, + 0xD9, 0x95, 0xB5, 0x04, 0xD9, 0x88, 0xD9, 0x94, + 0xC9, 0x04, 0xD9, 0x8A, 0xD9, 0x94, 0xC9, 0x04, + 0xDB, 0x81, 0xD9, 0x94, 0xC9, 0x04, 0xDB, 0x92, + 0xD9, 0x94, 0xC9, 0x04, 0xDB, 0x95, 0xD9, 0x94, + 0xC9, 0x05, 0x41, 0xCC, 0x82, 0xCC, 0x80, 0xCA, + 0x05, 0x41, 0xCC, 0x82, 0xCC, 0x81, 0xCA, 0x05, + // Bytes 3880 - 38bf + 0x41, 0xCC, 0x82, 0xCC, 0x83, 0xCA, 0x05, 0x41, + 0xCC, 0x82, 0xCC, 0x89, 0xCA, 0x05, 0x41, 0xCC, + 0x86, 0xCC, 0x80, 0xCA, 0x05, 0x41, 0xCC, 0x86, + 0xCC, 0x81, 0xCA, 0x05, 0x41, 0xCC, 0x86, 0xCC, + 0x83, 0xCA, 0x05, 0x41, 0xCC, 0x86, 0xCC, 0x89, + 0xCA, 0x05, 0x41, 0xCC, 0x87, 0xCC, 0x84, 0xCA, + 0x05, 0x41, 0xCC, 0x88, 0xCC, 0x84, 0xCA, 0x05, + 0x41, 0xCC, 0x8A, 0xCC, 0x81, 0xCA, 0x05, 0x41, + // Bytes 38c0 - 38ff + 0xCC, 0xA3, 0xCC, 0x82, 0xCA, 0x05, 0x41, 0xCC, + 0xA3, 0xCC, 0x86, 0xCA, 0x05, 0x43, 0xCC, 0xA7, + 0xCC, 0x81, 0xCA, 0x05, 0x45, 0xCC, 0x82, 0xCC, + 0x80, 0xCA, 0x05, 0x45, 0xCC, 0x82, 0xCC, 0x81, + 0xCA, 0x05, 0x45, 0xCC, 0x82, 0xCC, 0x83, 0xCA, + 0x05, 0x45, 0xCC, 0x82, 0xCC, 0x89, 0xCA, 0x05, + 0x45, 0xCC, 0x84, 0xCC, 0x80, 0xCA, 0x05, 0x45, + 0xCC, 0x84, 0xCC, 0x81, 0xCA, 0x05, 0x45, 0xCC, + // Bytes 3900 - 393f + 0xA3, 0xCC, 0x82, 0xCA, 0x05, 0x45, 0xCC, 0xA7, + 0xCC, 0x86, 0xCA, 0x05, 0x49, 0xCC, 0x88, 0xCC, + 0x81, 0xCA, 0x05, 0x4C, 0xCC, 0xA3, 0xCC, 0x84, + 0xCA, 0x05, 0x4F, 0xCC, 0x82, 0xCC, 0x80, 0xCA, + 0x05, 0x4F, 0xCC, 0x82, 0xCC, 0x81, 0xCA, 0x05, + 0x4F, 0xCC, 0x82, 0xCC, 0x83, 0xCA, 0x05, 0x4F, + 0xCC, 0x82, 0xCC, 0x89, 0xCA, 0x05, 0x4F, 0xCC, + 0x83, 0xCC, 0x81, 0xCA, 0x05, 0x4F, 0xCC, 0x83, + // Bytes 3940 - 397f + 0xCC, 0x84, 0xCA, 0x05, 0x4F, 0xCC, 0x83, 0xCC, + 0x88, 0xCA, 0x05, 0x4F, 0xCC, 0x84, 0xCC, 0x80, + 0xCA, 0x05, 0x4F, 0xCC, 0x84, 0xCC, 0x81, 0xCA, + 0x05, 0x4F, 0xCC, 0x87, 0xCC, 0x84, 0xCA, 0x05, + 0x4F, 0xCC, 0x88, 0xCC, 0x84, 0xCA, 0x05, 0x4F, + 0xCC, 0x9B, 0xCC, 0x80, 0xCA, 0x05, 0x4F, 0xCC, + 0x9B, 0xCC, 0x81, 0xCA, 0x05, 0x4F, 0xCC, 0x9B, + 0xCC, 0x83, 0xCA, 0x05, 0x4F, 0xCC, 0x9B, 0xCC, + // Bytes 3980 - 39bf + 0x89, 0xCA, 0x05, 0x4F, 0xCC, 0x9B, 0xCC, 0xA3, + 0xB6, 0x05, 0x4F, 0xCC, 0xA3, 0xCC, 0x82, 0xCA, + 0x05, 0x4F, 0xCC, 0xA8, 0xCC, 0x84, 0xCA, 0x05, + 0x52, 0xCC, 0xA3, 0xCC, 0x84, 0xCA, 0x05, 0x53, + 0xCC, 0x81, 0xCC, 0x87, 0xCA, 0x05, 0x53, 0xCC, + 0x8C, 0xCC, 0x87, 0xCA, 0x05, 0x53, 0xCC, 0xA3, + 0xCC, 0x87, 0xCA, 0x05, 0x55, 0xCC, 0x83, 0xCC, + 0x81, 0xCA, 0x05, 0x55, 0xCC, 0x84, 0xCC, 0x88, + // Bytes 39c0 - 39ff + 0xCA, 0x05, 0x55, 0xCC, 0x88, 0xCC, 0x80, 0xCA, + 0x05, 0x55, 0xCC, 0x88, 0xCC, 0x81, 0xCA, 0x05, + 0x55, 0xCC, 0x88, 0xCC, 0x84, 0xCA, 0x05, 0x55, + 0xCC, 0x88, 0xCC, 0x8C, 0xCA, 0x05, 0x55, 0xCC, + 0x9B, 0xCC, 0x80, 0xCA, 0x05, 0x55, 0xCC, 0x9B, + 0xCC, 0x81, 0xCA, 0x05, 0x55, 0xCC, 0x9B, 0xCC, + 0x83, 0xCA, 0x05, 0x55, 0xCC, 0x9B, 0xCC, 0x89, + 0xCA, 0x05, 0x55, 0xCC, 0x9B, 0xCC, 0xA3, 0xB6, + // Bytes 3a00 - 3a3f + 0x05, 0x61, 0xCC, 0x82, 0xCC, 0x80, 0xCA, 0x05, + 0x61, 0xCC, 0x82, 0xCC, 0x81, 0xCA, 0x05, 0x61, + 0xCC, 0x82, 0xCC, 0x83, 0xCA, 0x05, 0x61, 0xCC, + 0x82, 0xCC, 0x89, 0xCA, 0x05, 0x61, 0xCC, 0x86, + 0xCC, 0x80, 0xCA, 0x05, 0x61, 0xCC, 0x86, 0xCC, + 0x81, 0xCA, 0x05, 0x61, 0xCC, 0x86, 0xCC, 0x83, + 0xCA, 0x05, 0x61, 0xCC, 0x86, 0xCC, 0x89, 0xCA, + 0x05, 0x61, 0xCC, 0x87, 0xCC, 0x84, 0xCA, 0x05, + // Bytes 3a40 - 3a7f + 0x61, 0xCC, 0x88, 0xCC, 0x84, 0xCA, 0x05, 0x61, + 0xCC, 0x8A, 0xCC, 0x81, 0xCA, 0x05, 0x61, 0xCC, + 0xA3, 0xCC, 0x82, 0xCA, 0x05, 0x61, 0xCC, 0xA3, + 0xCC, 0x86, 0xCA, 0x05, 0x63, 0xCC, 0xA7, 0xCC, + 0x81, 0xCA, 0x05, 0x65, 0xCC, 0x82, 0xCC, 0x80, + 0xCA, 0x05, 0x65, 0xCC, 0x82, 0xCC, 0x81, 0xCA, + 0x05, 0x65, 0xCC, 0x82, 0xCC, 0x83, 0xCA, 0x05, + 0x65, 0xCC, 0x82, 0xCC, 0x89, 0xCA, 0x05, 0x65, + // Bytes 3a80 - 3abf + 0xCC, 0x84, 0xCC, 0x80, 0xCA, 0x05, 0x65, 0xCC, + 0x84, 0xCC, 0x81, 0xCA, 0x05, 0x65, 0xCC, 0xA3, + 0xCC, 0x82, 0xCA, 0x05, 0x65, 0xCC, 0xA7, 0xCC, + 0x86, 0xCA, 0x05, 0x69, 0xCC, 0x88, 0xCC, 0x81, + 0xCA, 0x05, 0x6C, 0xCC, 0xA3, 0xCC, 0x84, 0xCA, + 0x05, 0x6F, 0xCC, 0x82, 0xCC, 0x80, 0xCA, 0x05, + 0x6F, 0xCC, 0x82, 0xCC, 0x81, 0xCA, 0x05, 0x6F, + 0xCC, 0x82, 0xCC, 0x83, 0xCA, 0x05, 0x6F, 0xCC, + // Bytes 3ac0 - 3aff + 0x82, 0xCC, 0x89, 0xCA, 0x05, 0x6F, 0xCC, 0x83, + 0xCC, 0x81, 0xCA, 0x05, 0x6F, 0xCC, 0x83, 0xCC, + 0x84, 0xCA, 0x05, 0x6F, 0xCC, 0x83, 0xCC, 0x88, + 0xCA, 0x05, 0x6F, 0xCC, 0x84, 0xCC, 0x80, 0xCA, + 0x05, 0x6F, 0xCC, 0x84, 0xCC, 0x81, 0xCA, 0x05, + 0x6F, 0xCC, 0x87, 0xCC, 0x84, 0xCA, 0x05, 0x6F, + 0xCC, 0x88, 0xCC, 0x84, 0xCA, 0x05, 0x6F, 0xCC, + 0x9B, 0xCC, 0x80, 0xCA, 0x05, 0x6F, 0xCC, 0x9B, + // Bytes 3b00 - 3b3f + 0xCC, 0x81, 0xCA, 0x05, 0x6F, 0xCC, 0x9B, 0xCC, + 0x83, 0xCA, 0x05, 0x6F, 0xCC, 0x9B, 0xCC, 0x89, + 0xCA, 0x05, 0x6F, 0xCC, 0x9B, 0xCC, 0xA3, 0xB6, + 0x05, 0x6F, 0xCC, 0xA3, 0xCC, 0x82, 0xCA, 0x05, + 0x6F, 0xCC, 0xA8, 0xCC, 0x84, 0xCA, 0x05, 0x72, + 0xCC, 0xA3, 0xCC, 0x84, 0xCA, 0x05, 0x73, 0xCC, + 0x81, 0xCC, 0x87, 0xCA, 0x05, 0x73, 0xCC, 0x8C, + 0xCC, 0x87, 0xCA, 0x05, 0x73, 0xCC, 0xA3, 0xCC, + // Bytes 3b40 - 3b7f + 0x87, 0xCA, 0x05, 0x75, 0xCC, 0x83, 0xCC, 0x81, + 0xCA, 0x05, 0x75, 0xCC, 0x84, 0xCC, 0x88, 0xCA, + 0x05, 0x75, 0xCC, 0x88, 0xCC, 0x80, 0xCA, 0x05, + 0x75, 0xCC, 0x88, 0xCC, 0x81, 0xCA, 0x05, 0x75, + 0xCC, 0x88, 0xCC, 0x84, 0xCA, 0x05, 0x75, 0xCC, + 0x88, 0xCC, 0x8C, 0xCA, 0x05, 0x75, 0xCC, 0x9B, + 0xCC, 0x80, 0xCA, 0x05, 0x75, 0xCC, 0x9B, 0xCC, + 0x81, 0xCA, 0x05, 0x75, 0xCC, 0x9B, 0xCC, 0x83, + // Bytes 3b80 - 3bbf + 0xCA, 0x05, 0x75, 0xCC, 0x9B, 0xCC, 0x89, 0xCA, + 0x05, 0x75, 0xCC, 0x9B, 0xCC, 0xA3, 0xB6, 0x05, + 0xE1, 0xBE, 0xBF, 0xCC, 0x80, 0xCA, 0x05, 0xE1, + 0xBE, 0xBF, 0xCC, 0x81, 0xCA, 0x05, 0xE1, 0xBE, + 0xBF, 0xCD, 0x82, 0xCA, 0x05, 0xE1, 0xBF, 0xBE, + 0xCC, 0x80, 0xCA, 0x05, 0xE1, 0xBF, 0xBE, 0xCC, + 0x81, 0xCA, 0x05, 0xE1, 0xBF, 0xBE, 0xCD, 0x82, + 0xCA, 0x05, 0xE2, 0x86, 0x90, 0xCC, 0xB8, 0x05, + // Bytes 3bc0 - 3bff + 0x05, 0xE2, 0x86, 0x92, 0xCC, 0xB8, 0x05, 0x05, + 0xE2, 0x86, 0x94, 0xCC, 0xB8, 0x05, 0x05, 0xE2, + 0x87, 0x90, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x87, + 0x92, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x87, 0x94, + 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x88, 0x83, 0xCC, + 0xB8, 0x05, 0x05, 0xE2, 0x88, 0x88, 0xCC, 0xB8, + 0x05, 0x05, 0xE2, 0x88, 0x8B, 0xCC, 0xB8, 0x05, + 0x05, 0xE2, 0x88, 0xA3, 0xCC, 0xB8, 0x05, 0x05, + // Bytes 3c00 - 3c3f + 0xE2, 0x88, 0xA5, 0xCC, 0xB8, 0x05, 0x05, 0xE2, + 0x88, 0xBC, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, + 0x83, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0x85, + 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0x88, 0xCC, + 0xB8, 0x05, 0x05, 0xE2, 0x89, 0x8D, 0xCC, 0xB8, + 0x05, 0x05, 0xE2, 0x89, 0xA1, 0xCC, 0xB8, 0x05, + 0x05, 0xE2, 0x89, 0xA4, 0xCC, 0xB8, 0x05, 0x05, + 0xE2, 0x89, 0xA5, 0xCC, 0xB8, 0x05, 0x05, 0xE2, + // Bytes 3c40 - 3c7f + 0x89, 0xB2, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, + 0xB3, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0xB6, + 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0xB7, 0xCC, + 0xB8, 0x05, 0x05, 0xE2, 0x89, 0xBA, 0xCC, 0xB8, + 0x05, 0x05, 0xE2, 0x89, 0xBB, 0xCC, 0xB8, 0x05, + 0x05, 0xE2, 0x89, 0xBC, 0xCC, 0xB8, 0x05, 0x05, + 0xE2, 0x89, 0xBD, 0xCC, 0xB8, 0x05, 0x05, 0xE2, + 0x8A, 0x82, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, + // Bytes 3c80 - 3cbf + 0x83, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0x86, + 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0x87, 0xCC, + 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0x91, 0xCC, 0xB8, + 0x05, 0x05, 0xE2, 0x8A, 0x92, 0xCC, 0xB8, 0x05, + 0x05, 0xE2, 0x8A, 0xA2, 0xCC, 0xB8, 0x05, 0x05, + 0xE2, 0x8A, 0xA8, 0xCC, 0xB8, 0x05, 0x05, 0xE2, + 0x8A, 0xA9, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, + 0xAB, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0xB2, + // Bytes 3cc0 - 3cff + 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0xB3, 0xCC, + 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0xB4, 0xCC, 0xB8, + 0x05, 0x05, 0xE2, 0x8A, 0xB5, 0xCC, 0xB8, 0x05, + 0x06, 0xCE, 0x91, 0xCC, 0x93, 0xCD, 0x85, 0xDA, + 0x06, 0xCE, 0x91, 0xCC, 0x94, 0xCD, 0x85, 0xDA, + 0x06, 0xCE, 0x95, 0xCC, 0x93, 0xCC, 0x80, 0xCA, + 0x06, 0xCE, 0x95, 0xCC, 0x93, 0xCC, 0x81, 0xCA, + 0x06, 0xCE, 0x95, 0xCC, 0x94, 0xCC, 0x80, 0xCA, + // Bytes 3d00 - 3d3f + 0x06, 0xCE, 0x95, 0xCC, 0x94, 0xCC, 0x81, 0xCA, + 0x06, 0xCE, 0x97, 0xCC, 0x93, 0xCD, 0x85, 0xDA, + 0x06, 0xCE, 0x97, 0xCC, 0x94, 0xCD, 0x85, 0xDA, + 0x06, 0xCE, 0x99, 0xCC, 0x93, 0xCC, 0x80, 0xCA, + 0x06, 0xCE, 0x99, 0xCC, 0x93, 0xCC, 0x81, 0xCA, + 0x06, 0xCE, 0x99, 0xCC, 0x93, 0xCD, 0x82, 0xCA, + 0x06, 0xCE, 0x99, 0xCC, 0x94, 0xCC, 0x80, 0xCA, + 0x06, 0xCE, 0x99, 0xCC, 0x94, 0xCC, 0x81, 0xCA, + // Bytes 3d40 - 3d7f + 0x06, 0xCE, 0x99, 0xCC, 0x94, 0xCD, 0x82, 0xCA, + 0x06, 0xCE, 0x9F, 0xCC, 0x93, 0xCC, 0x80, 0xCA, + 0x06, 0xCE, 0x9F, 0xCC, 0x93, 0xCC, 0x81, 0xCA, + 0x06, 0xCE, 0x9F, 0xCC, 0x94, 0xCC, 0x80, 0xCA, + 0x06, 0xCE, 0x9F, 0xCC, 0x94, 0xCC, 0x81, 0xCA, + 0x06, 0xCE, 0xA5, 0xCC, 0x94, 0xCC, 0x80, 0xCA, + 0x06, 0xCE, 0xA5, 0xCC, 0x94, 0xCC, 0x81, 0xCA, + 0x06, 0xCE, 0xA5, 0xCC, 0x94, 0xCD, 0x82, 0xCA, + // Bytes 3d80 - 3dbf + 0x06, 0xCE, 0xA9, 0xCC, 0x93, 0xCD, 0x85, 0xDA, + 0x06, 0xCE, 0xA9, 0xCC, 0x94, 0xCD, 0x85, 0xDA, + 0x06, 0xCE, 0xB1, 0xCC, 0x80, 0xCD, 0x85, 0xDA, + 0x06, 0xCE, 0xB1, 0xCC, 0x81, 0xCD, 0x85, 0xDA, + 0x06, 0xCE, 0xB1, 0xCC, 0x93, 0xCD, 0x85, 0xDA, + 0x06, 0xCE, 0xB1, 0xCC, 0x94, 0xCD, 0x85, 0xDA, + 0x06, 0xCE, 0xB1, 0xCD, 0x82, 0xCD, 0x85, 0xDA, + 0x06, 0xCE, 0xB5, 0xCC, 0x93, 0xCC, 0x80, 0xCA, + // Bytes 3dc0 - 3dff + 0x06, 0xCE, 0xB5, 0xCC, 0x93, 0xCC, 0x81, 0xCA, + 0x06, 0xCE, 0xB5, 0xCC, 0x94, 0xCC, 0x80, 0xCA, + 0x06, 0xCE, 0xB5, 0xCC, 0x94, 0xCC, 0x81, 0xCA, + 0x06, 0xCE, 0xB7, 0xCC, 0x80, 0xCD, 0x85, 0xDA, + 0x06, 0xCE, 0xB7, 0xCC, 0x81, 0xCD, 0x85, 0xDA, + 0x06, 0xCE, 0xB7, 0xCC, 0x93, 0xCD, 0x85, 0xDA, + 0x06, 0xCE, 0xB7, 0xCC, 0x94, 0xCD, 0x85, 0xDA, + 0x06, 0xCE, 0xB7, 0xCD, 0x82, 0xCD, 0x85, 0xDA, + // Bytes 3e00 - 3e3f + 0x06, 0xCE, 0xB9, 0xCC, 0x88, 0xCC, 0x80, 0xCA, + 0x06, 0xCE, 0xB9, 0xCC, 0x88, 0xCC, 0x81, 0xCA, + 0x06, 0xCE, 0xB9, 0xCC, 0x88, 0xCD, 0x82, 0xCA, + 0x06, 0xCE, 0xB9, 0xCC, 0x93, 0xCC, 0x80, 0xCA, + 0x06, 0xCE, 0xB9, 0xCC, 0x93, 0xCC, 0x81, 0xCA, + 0x06, 0xCE, 0xB9, 0xCC, 0x93, 0xCD, 0x82, 0xCA, + 0x06, 0xCE, 0xB9, 0xCC, 0x94, 0xCC, 0x80, 0xCA, + 0x06, 0xCE, 0xB9, 0xCC, 0x94, 0xCC, 0x81, 0xCA, + // Bytes 3e40 - 3e7f + 0x06, 0xCE, 0xB9, 0xCC, 0x94, 0xCD, 0x82, 0xCA, + 0x06, 0xCE, 0xBF, 0xCC, 0x93, 0xCC, 0x80, 0xCA, + 0x06, 0xCE, 0xBF, 0xCC, 0x93, 0xCC, 0x81, 0xCA, + 0x06, 0xCE, 0xBF, 0xCC, 0x94, 0xCC, 0x80, 0xCA, + 0x06, 0xCE, 0xBF, 0xCC, 0x94, 0xCC, 0x81, 0xCA, + 0x06, 0xCF, 0x85, 0xCC, 0x88, 0xCC, 0x80, 0xCA, + 0x06, 0xCF, 0x85, 0xCC, 0x88, 0xCC, 0x81, 0xCA, + 0x06, 0xCF, 0x85, 0xCC, 0x88, 0xCD, 0x82, 0xCA, + // Bytes 3e80 - 3ebf + 0x06, 0xCF, 0x85, 0xCC, 0x93, 0xCC, 0x80, 0xCA, + 0x06, 0xCF, 0x85, 0xCC, 0x93, 0xCC, 0x81, 0xCA, + 0x06, 0xCF, 0x85, 0xCC, 0x93, 0xCD, 0x82, 0xCA, + 0x06, 0xCF, 0x85, 0xCC, 0x94, 0xCC, 0x80, 0xCA, + 0x06, 0xCF, 0x85, 0xCC, 0x94, 0xCC, 0x81, 0xCA, + 0x06, 0xCF, 0x85, 0xCC, 0x94, 0xCD, 0x82, 0xCA, + 0x06, 0xCF, 0x89, 0xCC, 0x80, 0xCD, 0x85, 0xDA, + 0x06, 0xCF, 0x89, 0xCC, 0x81, 0xCD, 0x85, 0xDA, + // Bytes 3ec0 - 3eff + 0x06, 0xCF, 0x89, 0xCC, 0x93, 0xCD, 0x85, 0xDA, + 0x06, 0xCF, 0x89, 0xCC, 0x94, 0xCD, 0x85, 0xDA, + 0x06, 0xCF, 0x89, 0xCD, 0x82, 0xCD, 0x85, 0xDA, + 0x06, 0xE0, 0xA4, 0xA8, 0xE0, 0xA4, 0xBC, 0x09, + 0x06, 0xE0, 0xA4, 0xB0, 0xE0, 0xA4, 0xBC, 0x09, + 0x06, 0xE0, 0xA4, 0xB3, 0xE0, 0xA4, 0xBC, 0x09, + 0x06, 0xE0, 0xB1, 0x86, 0xE0, 0xB1, 0x96, 0x85, + 0x06, 0xE0, 0xB7, 0x99, 0xE0, 0xB7, 0x8A, 0x11, + // Bytes 3f00 - 3f3f + 0x06, 0xE3, 0x81, 0x86, 0xE3, 0x82, 0x99, 0x0D, + 0x06, 0xE3, 0x81, 0x8B, 0xE3, 0x82, 0x99, 0x0D, + 0x06, 0xE3, 0x81, 0x8D, 0xE3, 0x82, 0x99, 0x0D, + 0x06, 0xE3, 0x81, 0x8F, 0xE3, 0x82, 0x99, 0x0D, + 0x06, 0xE3, 0x81, 0x91, 0xE3, 0x82, 0x99, 0x0D, + 0x06, 0xE3, 0x81, 0x93, 0xE3, 0x82, 0x99, 0x0D, + 0x06, 0xE3, 0x81, 0x95, 0xE3, 0x82, 0x99, 0x0D, + 0x06, 0xE3, 0x81, 0x97, 0xE3, 0x82, 0x99, 0x0D, + // Bytes 3f40 - 3f7f + 0x06, 0xE3, 0x81, 0x99, 0xE3, 0x82, 0x99, 0x0D, + 0x06, 0xE3, 0x81, 0x9B, 0xE3, 0x82, 0x99, 0x0D, + 0x06, 0xE3, 0x81, 0x9D, 0xE3, 0x82, 0x99, 0x0D, + 0x06, 0xE3, 0x81, 0x9F, 0xE3, 0x82, 0x99, 0x0D, + 0x06, 0xE3, 0x81, 0xA1, 0xE3, 0x82, 0x99, 0x0D, + 0x06, 0xE3, 0x81, 0xA4, 0xE3, 0x82, 0x99, 0x0D, + 0x06, 0xE3, 0x81, 0xA6, 0xE3, 0x82, 0x99, 0x0D, + 0x06, 0xE3, 0x81, 0xA8, 0xE3, 0x82, 0x99, 0x0D, + // Bytes 3f80 - 3fbf + 0x06, 0xE3, 0x81, 0xAF, 0xE3, 0x82, 0x99, 0x0D, + 0x06, 0xE3, 0x81, 0xAF, 0xE3, 0x82, 0x9A, 0x0D, + 0x06, 0xE3, 0x81, 0xB2, 0xE3, 0x82, 0x99, 0x0D, + 0x06, 0xE3, 0x81, 0xB2, 0xE3, 0x82, 0x9A, 0x0D, + 0x06, 0xE3, 0x81, 0xB5, 0xE3, 0x82, 0x99, 0x0D, + 0x06, 0xE3, 0x81, 0xB5, 0xE3, 0x82, 0x9A, 0x0D, + 0x06, 0xE3, 0x81, 0xB8, 0xE3, 0x82, 0x99, 0x0D, + 0x06, 0xE3, 0x81, 0xB8, 0xE3, 0x82, 0x9A, 0x0D, + // Bytes 3fc0 - 3fff + 0x06, 0xE3, 0x81, 0xBB, 0xE3, 0x82, 0x99, 0x0D, + 0x06, 0xE3, 0x81, 0xBB, 0xE3, 0x82, 0x9A, 0x0D, + 0x06, 0xE3, 0x82, 0x9D, 0xE3, 0x82, 0x99, 0x0D, + 0x06, 0xE3, 0x82, 0xA6, 0xE3, 0x82, 0x99, 0x0D, + 0x06, 0xE3, 0x82, 0xAB, 0xE3, 0x82, 0x99, 0x0D, + 0x06, 0xE3, 0x82, 0xAD, 0xE3, 0x82, 0x99, 0x0D, + 0x06, 0xE3, 0x82, 0xAF, 0xE3, 0x82, 0x99, 0x0D, + 0x06, 0xE3, 0x82, 0xB1, 0xE3, 0x82, 0x99, 0x0D, + // Bytes 4000 - 403f + 0x06, 0xE3, 0x82, 0xB3, 0xE3, 0x82, 0x99, 0x0D, + 0x06, 0xE3, 0x82, 0xB5, 0xE3, 0x82, 0x99, 0x0D, + 0x06, 0xE3, 0x82, 0xB7, 0xE3, 0x82, 0x99, 0x0D, + 0x06, 0xE3, 0x82, 0xB9, 0xE3, 0x82, 0x99, 0x0D, + 0x06, 0xE3, 0x82, 0xBB, 0xE3, 0x82, 0x99, 0x0D, + 0x06, 0xE3, 0x82, 0xBD, 0xE3, 0x82, 0x99, 0x0D, + 0x06, 0xE3, 0x82, 0xBF, 0xE3, 0x82, 0x99, 0x0D, + 0x06, 0xE3, 0x83, 0x81, 0xE3, 0x82, 0x99, 0x0D, + // Bytes 4040 - 407f + 0x06, 0xE3, 0x83, 0x84, 0xE3, 0x82, 0x99, 0x0D, + 0x06, 0xE3, 0x83, 0x86, 0xE3, 0x82, 0x99, 0x0D, + 0x06, 0xE3, 0x83, 0x88, 0xE3, 0x82, 0x99, 0x0D, + 0x06, 0xE3, 0x83, 0x8F, 0xE3, 0x82, 0x99, 0x0D, + 0x06, 0xE3, 0x83, 0x8F, 0xE3, 0x82, 0x9A, 0x0D, + 0x06, 0xE3, 0x83, 0x92, 0xE3, 0x82, 0x99, 0x0D, + 0x06, 0xE3, 0x83, 0x92, 0xE3, 0x82, 0x9A, 0x0D, + 0x06, 0xE3, 0x83, 0x95, 0xE3, 0x82, 0x99, 0x0D, + // Bytes 4080 - 40bf + 0x06, 0xE3, 0x83, 0x95, 0xE3, 0x82, 0x9A, 0x0D, + 0x06, 0xE3, 0x83, 0x98, 0xE3, 0x82, 0x99, 0x0D, + 0x06, 0xE3, 0x83, 0x98, 0xE3, 0x82, 0x9A, 0x0D, + 0x06, 0xE3, 0x83, 0x9B, 0xE3, 0x82, 0x99, 0x0D, + 0x06, 0xE3, 0x83, 0x9B, 0xE3, 0x82, 0x9A, 0x0D, + 0x06, 0xE3, 0x83, 0xAF, 0xE3, 0x82, 0x99, 0x0D, + 0x06, 0xE3, 0x83, 0xB0, 0xE3, 0x82, 0x99, 0x0D, + 0x06, 0xE3, 0x83, 0xB1, 0xE3, 0x82, 0x99, 0x0D, + // Bytes 40c0 - 40ff + 0x06, 0xE3, 0x83, 0xB2, 0xE3, 0x82, 0x99, 0x0D, + 0x06, 0xE3, 0x83, 0xBD, 0xE3, 0x82, 0x99, 0x0D, + 0x08, 0xCE, 0x91, 0xCC, 0x93, 0xCC, 0x80, 0xCD, + 0x85, 0xDB, 0x08, 0xCE, 0x91, 0xCC, 0x93, 0xCC, + 0x81, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0x91, 0xCC, + 0x93, 0xCD, 0x82, 0xCD, 0x85, 0xDB, 0x08, 0xCE, + 0x91, 0xCC, 0x94, 0xCC, 0x80, 0xCD, 0x85, 0xDB, + 0x08, 0xCE, 0x91, 0xCC, 0x94, 0xCC, 0x81, 0xCD, + // Bytes 4100 - 413f + 0x85, 0xDB, 0x08, 0xCE, 0x91, 0xCC, 0x94, 0xCD, + 0x82, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0x97, 0xCC, + 0x93, 0xCC, 0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCE, + 0x97, 0xCC, 0x93, 0xCC, 0x81, 0xCD, 0x85, 0xDB, + 0x08, 0xCE, 0x97, 0xCC, 0x93, 0xCD, 0x82, 0xCD, + 0x85, 0xDB, 0x08, 0xCE, 0x97, 0xCC, 0x94, 0xCC, + 0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0x97, 0xCC, + 0x94, 0xCC, 0x81, 0xCD, 0x85, 0xDB, 0x08, 0xCE, + // Bytes 4140 - 417f + 0x97, 0xCC, 0x94, 0xCD, 0x82, 0xCD, 0x85, 0xDB, + 0x08, 0xCE, 0xA9, 0xCC, 0x93, 0xCC, 0x80, 0xCD, + 0x85, 0xDB, 0x08, 0xCE, 0xA9, 0xCC, 0x93, 0xCC, + 0x81, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0xA9, 0xCC, + 0x93, 0xCD, 0x82, 0xCD, 0x85, 0xDB, 0x08, 0xCE, + 0xA9, 0xCC, 0x94, 0xCC, 0x80, 0xCD, 0x85, 0xDB, + 0x08, 0xCE, 0xA9, 0xCC, 0x94, 0xCC, 0x81, 0xCD, + 0x85, 0xDB, 0x08, 0xCE, 0xA9, 0xCC, 0x94, 0xCD, + // Bytes 4180 - 41bf + 0x82, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0xB1, 0xCC, + 0x93, 0xCC, 0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCE, + 0xB1, 0xCC, 0x93, 0xCC, 0x81, 0xCD, 0x85, 0xDB, + 0x08, 0xCE, 0xB1, 0xCC, 0x93, 0xCD, 0x82, 0xCD, + 0x85, 0xDB, 0x08, 0xCE, 0xB1, 0xCC, 0x94, 0xCC, + 0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0xB1, 0xCC, + 0x94, 0xCC, 0x81, 0xCD, 0x85, 0xDB, 0x08, 0xCE, + 0xB1, 0xCC, 0x94, 0xCD, 0x82, 0xCD, 0x85, 0xDB, + // Bytes 41c0 - 41ff + 0x08, 0xCE, 0xB7, 0xCC, 0x93, 0xCC, 0x80, 0xCD, + 0x85, 0xDB, 0x08, 0xCE, 0xB7, 0xCC, 0x93, 0xCC, + 0x81, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0xB7, 0xCC, + 0x93, 0xCD, 0x82, 0xCD, 0x85, 0xDB, 0x08, 0xCE, + 0xB7, 0xCC, 0x94, 0xCC, 0x80, 0xCD, 0x85, 0xDB, + 0x08, 0xCE, 0xB7, 0xCC, 0x94, 0xCC, 0x81, 0xCD, + 0x85, 0xDB, 0x08, 0xCE, 0xB7, 0xCC, 0x94, 0xCD, + 0x82, 0xCD, 0x85, 0xDB, 0x08, 0xCF, 0x89, 0xCC, + // Bytes 4200 - 423f + 0x93, 0xCC, 0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCF, + 0x89, 0xCC, 0x93, 0xCC, 0x81, 0xCD, 0x85, 0xDB, + 0x08, 0xCF, 0x89, 0xCC, 0x93, 0xCD, 0x82, 0xCD, + 0x85, 0xDB, 0x08, 0xCF, 0x89, 0xCC, 0x94, 0xCC, + 0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCF, 0x89, 0xCC, + 0x94, 0xCC, 0x81, 0xCD, 0x85, 0xDB, 0x08, 0xCF, + 0x89, 0xCC, 0x94, 0xCD, 0x82, 0xCD, 0x85, 0xDB, + 0x08, 0xF0, 0x91, 0x82, 0x99, 0xF0, 0x91, 0x82, + // Bytes 4240 - 427f + 0xBA, 0x09, 0x08, 0xF0, 0x91, 0x82, 0x9B, 0xF0, + 0x91, 0x82, 0xBA, 0x09, 0x08, 0xF0, 0x91, 0x82, + 0xA5, 0xF0, 0x91, 0x82, 0xBA, 0x09, 0x42, 0xC2, + 0xB4, 0x01, 0x43, 0x20, 0xCC, 0x81, 0xC9, 0x43, + 0x20, 0xCC, 0x83, 0xC9, 0x43, 0x20, 0xCC, 0x84, + 0xC9, 0x43, 0x20, 0xCC, 0x85, 0xC9, 0x43, 0x20, + 0xCC, 0x86, 0xC9, 0x43, 0x20, 0xCC, 0x87, 0xC9, + 0x43, 0x20, 0xCC, 0x88, 0xC9, 0x43, 0x20, 0xCC, + // Bytes 4280 - 42bf + 0x8A, 0xC9, 0x43, 0x20, 0xCC, 0x8B, 0xC9, 0x43, + 0x20, 0xCC, 0x93, 0xC9, 0x43, 0x20, 0xCC, 0x94, + 0xC9, 0x43, 0x20, 0xCC, 0xA7, 0xA5, 0x43, 0x20, + 0xCC, 0xA8, 0xA5, 0x43, 0x20, 0xCC, 0xB3, 0xB5, + 0x43, 0x20, 0xCD, 0x82, 0xC9, 0x43, 0x20, 0xCD, + 0x85, 0xD9, 0x43, 0x20, 0xD9, 0x8B, 0x59, 0x43, + 0x20, 0xD9, 0x8C, 0x5D, 0x43, 0x20, 0xD9, 0x8D, + 0x61, 0x43, 0x20, 0xD9, 0x8E, 0x65, 0x43, 0x20, + // Bytes 42c0 - 42ff + 0xD9, 0x8F, 0x69, 0x43, 0x20, 0xD9, 0x90, 0x6D, + 0x43, 0x20, 0xD9, 0x91, 0x71, 0x43, 0x20, 0xD9, + 0x92, 0x75, 0x43, 0x41, 0xCC, 0x8A, 0xC9, 0x43, + 0x73, 0xCC, 0x87, 0xC9, 0x44, 0x20, 0xE3, 0x82, + 0x99, 0x0D, 0x44, 0x20, 0xE3, 0x82, 0x9A, 0x0D, + 0x44, 0xC2, 0xA8, 0xCC, 0x81, 0xCA, 0x44, 0xCE, + 0x91, 0xCC, 0x81, 0xC9, 0x44, 0xCE, 0x95, 0xCC, + 0x81, 0xC9, 0x44, 0xCE, 0x97, 0xCC, 0x81, 0xC9, + // Bytes 4300 - 433f + 0x44, 0xCE, 0x99, 0xCC, 0x81, 0xC9, 0x44, 0xCE, + 0x9F, 0xCC, 0x81, 0xC9, 0x44, 0xCE, 0xA5, 0xCC, + 0x81, 0xC9, 0x44, 0xCE, 0xA5, 0xCC, 0x88, 0xC9, + 0x44, 0xCE, 0xA9, 0xCC, 0x81, 0xC9, 0x44, 0xCE, + 0xB1, 0xCC, 0x81, 0xC9, 0x44, 0xCE, 0xB5, 0xCC, + 0x81, 0xC9, 0x44, 0xCE, 0xB7, 0xCC, 0x81, 0xC9, + 0x44, 0xCE, 0xB9, 0xCC, 0x81, 0xC9, 0x44, 0xCE, + 0xBF, 0xCC, 0x81, 0xC9, 0x44, 0xCF, 0x85, 0xCC, + // Bytes 4340 - 437f + 0x81, 0xC9, 0x44, 0xCF, 0x89, 0xCC, 0x81, 0xC9, + 0x44, 0xD7, 0x90, 0xD6, 0xB7, 0x31, 0x44, 0xD7, + 0x90, 0xD6, 0xB8, 0x35, 0x44, 0xD7, 0x90, 0xD6, + 0xBC, 0x41, 0x44, 0xD7, 0x91, 0xD6, 0xBC, 0x41, + 0x44, 0xD7, 0x91, 0xD6, 0xBF, 0x49, 0x44, 0xD7, + 0x92, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0x93, 0xD6, + 0xBC, 0x41, 0x44, 0xD7, 0x94, 0xD6, 0xBC, 0x41, + 0x44, 0xD7, 0x95, 0xD6, 0xB9, 0x39, 0x44, 0xD7, + // Bytes 4380 - 43bf + 0x95, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0x96, 0xD6, + 0xBC, 0x41, 0x44, 0xD7, 0x98, 0xD6, 0xBC, 0x41, + 0x44, 0xD7, 0x99, 0xD6, 0xB4, 0x25, 0x44, 0xD7, + 0x99, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0x9A, 0xD6, + 0xBC, 0x41, 0x44, 0xD7, 0x9B, 0xD6, 0xBC, 0x41, + 0x44, 0xD7, 0x9B, 0xD6, 0xBF, 0x49, 0x44, 0xD7, + 0x9C, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0x9E, 0xD6, + 0xBC, 0x41, 0x44, 0xD7, 0xA0, 0xD6, 0xBC, 0x41, + // Bytes 43c0 - 43ff + 0x44, 0xD7, 0xA1, 0xD6, 0xBC, 0x41, 0x44, 0xD7, + 0xA3, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0xA4, 0xD6, + 0xBC, 0x41, 0x44, 0xD7, 0xA4, 0xD6, 0xBF, 0x49, + 0x44, 0xD7, 0xA6, 0xD6, 0xBC, 0x41, 0x44, 0xD7, + 0xA7, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0xA8, 0xD6, + 0xBC, 0x41, 0x44, 0xD7, 0xA9, 0xD6, 0xBC, 0x41, + 0x44, 0xD7, 0xA9, 0xD7, 0x81, 0x4D, 0x44, 0xD7, + 0xA9, 0xD7, 0x82, 0x51, 0x44, 0xD7, 0xAA, 0xD6, + // Bytes 4400 - 443f + 0xBC, 0x41, 0x44, 0xD7, 0xB2, 0xD6, 0xB7, 0x31, + 0x44, 0xD8, 0xA7, 0xD9, 0x8B, 0x59, 0x44, 0xD8, + 0xA7, 0xD9, 0x93, 0xC9, 0x44, 0xD8, 0xA7, 0xD9, + 0x94, 0xC9, 0x44, 0xD8, 0xA7, 0xD9, 0x95, 0xB5, + 0x44, 0xD8, 0xB0, 0xD9, 0xB0, 0x79, 0x44, 0xD8, + 0xB1, 0xD9, 0xB0, 0x79, 0x44, 0xD9, 0x80, 0xD9, + 0x8B, 0x59, 0x44, 0xD9, 0x80, 0xD9, 0x8E, 0x65, + 0x44, 0xD9, 0x80, 0xD9, 0x8F, 0x69, 0x44, 0xD9, + // Bytes 4440 - 447f + 0x80, 0xD9, 0x90, 0x6D, 0x44, 0xD9, 0x80, 0xD9, + 0x91, 0x71, 0x44, 0xD9, 0x80, 0xD9, 0x92, 0x75, + 0x44, 0xD9, 0x87, 0xD9, 0xB0, 0x79, 0x44, 0xD9, + 0x88, 0xD9, 0x94, 0xC9, 0x44, 0xD9, 0x89, 0xD9, + 0xB0, 0x79, 0x44, 0xD9, 0x8A, 0xD9, 0x94, 0xC9, + 0x44, 0xDB, 0x92, 0xD9, 0x94, 0xC9, 0x44, 0xDB, + 0x95, 0xD9, 0x94, 0xC9, 0x45, 0x20, 0xCC, 0x88, + 0xCC, 0x80, 0xCA, 0x45, 0x20, 0xCC, 0x88, 0xCC, + // Bytes 4480 - 44bf + 0x81, 0xCA, 0x45, 0x20, 0xCC, 0x88, 0xCD, 0x82, + 0xCA, 0x45, 0x20, 0xCC, 0x93, 0xCC, 0x80, 0xCA, + 0x45, 0x20, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x45, + 0x20, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x45, 0x20, + 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x45, 0x20, 0xCC, + 0x94, 0xCC, 0x81, 0xCA, 0x45, 0x20, 0xCC, 0x94, + 0xCD, 0x82, 0xCA, 0x45, 0x20, 0xD9, 0x8C, 0xD9, + 0x91, 0x72, 0x45, 0x20, 0xD9, 0x8D, 0xD9, 0x91, + // Bytes 44c0 - 44ff + 0x72, 0x45, 0x20, 0xD9, 0x8E, 0xD9, 0x91, 0x72, + 0x45, 0x20, 0xD9, 0x8F, 0xD9, 0x91, 0x72, 0x45, + 0x20, 0xD9, 0x90, 0xD9, 0x91, 0x72, 0x45, 0x20, + 0xD9, 0x91, 0xD9, 0xB0, 0x7A, 0x45, 0xE2, 0xAB, + 0x9D, 0xCC, 0xB8, 0x05, 0x46, 0xCE, 0xB9, 0xCC, + 0x88, 0xCC, 0x81, 0xCA, 0x46, 0xCF, 0x85, 0xCC, + 0x88, 0xCC, 0x81, 0xCA, 0x46, 0xD7, 0xA9, 0xD6, + 0xBC, 0xD7, 0x81, 0x4E, 0x46, 0xD7, 0xA9, 0xD6, + // Bytes 4500 - 453f + 0xBC, 0xD7, 0x82, 0x52, 0x46, 0xD9, 0x80, 0xD9, + 0x8E, 0xD9, 0x91, 0x72, 0x46, 0xD9, 0x80, 0xD9, + 0x8F, 0xD9, 0x91, 0x72, 0x46, 0xD9, 0x80, 0xD9, + 0x90, 0xD9, 0x91, 0x72, 0x46, 0xE0, 0xA4, 0x95, + 0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0x96, + 0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0x97, + 0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0x9C, + 0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0xA1, + // Bytes 4540 - 457f + 0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0xA2, + 0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0xAB, + 0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0xAF, + 0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA6, 0xA1, + 0xE0, 0xA6, 0xBC, 0x09, 0x46, 0xE0, 0xA6, 0xA2, + 0xE0, 0xA6, 0xBC, 0x09, 0x46, 0xE0, 0xA6, 0xAF, + 0xE0, 0xA6, 0xBC, 0x09, 0x46, 0xE0, 0xA8, 0x96, + 0xE0, 0xA8, 0xBC, 0x09, 0x46, 0xE0, 0xA8, 0x97, + // Bytes 4580 - 45bf + 0xE0, 0xA8, 0xBC, 0x09, 0x46, 0xE0, 0xA8, 0x9C, + 0xE0, 0xA8, 0xBC, 0x09, 0x46, 0xE0, 0xA8, 0xAB, + 0xE0, 0xA8, 0xBC, 0x09, 0x46, 0xE0, 0xA8, 0xB2, + 0xE0, 0xA8, 0xBC, 0x09, 0x46, 0xE0, 0xA8, 0xB8, + 0xE0, 0xA8, 0xBC, 0x09, 0x46, 0xE0, 0xAC, 0xA1, + 0xE0, 0xAC, 0xBC, 0x09, 0x46, 0xE0, 0xAC, 0xA2, + 0xE0, 0xAC, 0xBC, 0x09, 0x46, 0xE0, 0xBE, 0xB2, + 0xE0, 0xBE, 0x80, 0x9D, 0x46, 0xE0, 0xBE, 0xB3, + // Bytes 45c0 - 45ff + 0xE0, 0xBE, 0x80, 0x9D, 0x46, 0xE3, 0x83, 0x86, + 0xE3, 0x82, 0x99, 0x0D, 0x48, 0xF0, 0x9D, 0x85, + 0x97, 0xF0, 0x9D, 0x85, 0xA5, 0xAD, 0x48, 0xF0, + 0x9D, 0x85, 0x98, 0xF0, 0x9D, 0x85, 0xA5, 0xAD, + 0x48, 0xF0, 0x9D, 0x86, 0xB9, 0xF0, 0x9D, 0x85, + 0xA5, 0xAD, 0x48, 0xF0, 0x9D, 0x86, 0xBA, 0xF0, + 0x9D, 0x85, 0xA5, 0xAD, 0x49, 0xE0, 0xBE, 0xB2, + 0xE0, 0xBD, 0xB1, 0xE0, 0xBE, 0x80, 0x9E, 0x49, + // Bytes 4600 - 463f + 0xE0, 0xBE, 0xB3, 0xE0, 0xBD, 0xB1, 0xE0, 0xBE, + 0x80, 0x9E, 0x4C, 0xF0, 0x9D, 0x85, 0x98, 0xF0, + 0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85, 0xAE, 0xAE, + 0x4C, 0xF0, 0x9D, 0x85, 0x98, 0xF0, 0x9D, 0x85, + 0xA5, 0xF0, 0x9D, 0x85, 0xAF, 0xAE, 0x4C, 0xF0, + 0x9D, 0x85, 0x98, 0xF0, 0x9D, 0x85, 0xA5, 0xF0, + 0x9D, 0x85, 0xB0, 0xAE, 0x4C, 0xF0, 0x9D, 0x85, + 0x98, 0xF0, 0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85, + // Bytes 4640 - 467f + 0xB1, 0xAE, 0x4C, 0xF0, 0x9D, 0x85, 0x98, 0xF0, + 0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85, 0xB2, 0xAE, + 0x4C, 0xF0, 0x9D, 0x86, 0xB9, 0xF0, 0x9D, 0x85, + 0xA5, 0xF0, 0x9D, 0x85, 0xAE, 0xAE, 0x4C, 0xF0, + 0x9D, 0x86, 0xB9, 0xF0, 0x9D, 0x85, 0xA5, 0xF0, + 0x9D, 0x85, 0xAF, 0xAE, 0x4C, 0xF0, 0x9D, 0x86, + 0xBA, 0xF0, 0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85, + 0xAE, 0xAE, 0x4C, 0xF0, 0x9D, 0x86, 0xBA, 0xF0, + // Bytes 4680 - 46bf + 0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85, 0xAF, 0xAE, + 0x83, 0x41, 0xCC, 0x82, 0xC9, 0x83, 0x41, 0xCC, + 0x86, 0xC9, 0x83, 0x41, 0xCC, 0x87, 0xC9, 0x83, + 0x41, 0xCC, 0x88, 0xC9, 0x83, 0x41, 0xCC, 0x8A, + 0xC9, 0x83, 0x41, 0xCC, 0xA3, 0xB5, 0x83, 0x43, + 0xCC, 0xA7, 0xA5, 0x83, 0x45, 0xCC, 0x82, 0xC9, + 0x83, 0x45, 0xCC, 0x84, 0xC9, 0x83, 0x45, 0xCC, + 0xA3, 0xB5, 0x83, 0x45, 0xCC, 0xA7, 0xA5, 0x83, + // Bytes 46c0 - 46ff + 0x49, 0xCC, 0x88, 0xC9, 0x83, 0x4C, 0xCC, 0xA3, + 0xB5, 0x83, 0x4F, 0xCC, 0x82, 0xC9, 0x83, 0x4F, + 0xCC, 0x83, 0xC9, 0x83, 0x4F, 0xCC, 0x84, 0xC9, + 0x83, 0x4F, 0xCC, 0x87, 0xC9, 0x83, 0x4F, 0xCC, + 0x88, 0xC9, 0x83, 0x4F, 0xCC, 0x9B, 0xAD, 0x83, + 0x4F, 0xCC, 0xA3, 0xB5, 0x83, 0x4F, 0xCC, 0xA8, + 0xA5, 0x83, 0x52, 0xCC, 0xA3, 0xB5, 0x83, 0x53, + 0xCC, 0x81, 0xC9, 0x83, 0x53, 0xCC, 0x8C, 0xC9, + // Bytes 4700 - 473f + 0x83, 0x53, 0xCC, 0xA3, 0xB5, 0x83, 0x55, 0xCC, + 0x83, 0xC9, 0x83, 0x55, 0xCC, 0x84, 0xC9, 0x83, + 0x55, 0xCC, 0x88, 0xC9, 0x83, 0x55, 0xCC, 0x9B, + 0xAD, 0x83, 0x61, 0xCC, 0x82, 0xC9, 0x83, 0x61, + 0xCC, 0x86, 0xC9, 0x83, 0x61, 0xCC, 0x87, 0xC9, + 0x83, 0x61, 0xCC, 0x88, 0xC9, 0x83, 0x61, 0xCC, + 0x8A, 0xC9, 0x83, 0x61, 0xCC, 0xA3, 0xB5, 0x83, + 0x63, 0xCC, 0xA7, 0xA5, 0x83, 0x65, 0xCC, 0x82, + // Bytes 4740 - 477f + 0xC9, 0x83, 0x65, 0xCC, 0x84, 0xC9, 0x83, 0x65, + 0xCC, 0xA3, 0xB5, 0x83, 0x65, 0xCC, 0xA7, 0xA5, + 0x83, 0x69, 0xCC, 0x88, 0xC9, 0x83, 0x6C, 0xCC, + 0xA3, 0xB5, 0x83, 0x6F, 0xCC, 0x82, 0xC9, 0x83, + 0x6F, 0xCC, 0x83, 0xC9, 0x83, 0x6F, 0xCC, 0x84, + 0xC9, 0x83, 0x6F, 0xCC, 0x87, 0xC9, 0x83, 0x6F, + 0xCC, 0x88, 0xC9, 0x83, 0x6F, 0xCC, 0x9B, 0xAD, + 0x83, 0x6F, 0xCC, 0xA3, 0xB5, 0x83, 0x6F, 0xCC, + // Bytes 4780 - 47bf + 0xA8, 0xA5, 0x83, 0x72, 0xCC, 0xA3, 0xB5, 0x83, + 0x73, 0xCC, 0x81, 0xC9, 0x83, 0x73, 0xCC, 0x8C, + 0xC9, 0x83, 0x73, 0xCC, 0xA3, 0xB5, 0x83, 0x75, + 0xCC, 0x83, 0xC9, 0x83, 0x75, 0xCC, 0x84, 0xC9, + 0x83, 0x75, 0xCC, 0x88, 0xC9, 0x83, 0x75, 0xCC, + 0x9B, 0xAD, 0x84, 0xCE, 0x91, 0xCC, 0x93, 0xC9, + 0x84, 0xCE, 0x91, 0xCC, 0x94, 0xC9, 0x84, 0xCE, + 0x95, 0xCC, 0x93, 0xC9, 0x84, 0xCE, 0x95, 0xCC, + // Bytes 47c0 - 47ff + 0x94, 0xC9, 0x84, 0xCE, 0x97, 0xCC, 0x93, 0xC9, + 0x84, 0xCE, 0x97, 0xCC, 0x94, 0xC9, 0x84, 0xCE, + 0x99, 0xCC, 0x93, 0xC9, 0x84, 0xCE, 0x99, 0xCC, + 0x94, 0xC9, 0x84, 0xCE, 0x9F, 0xCC, 0x93, 0xC9, + 0x84, 0xCE, 0x9F, 0xCC, 0x94, 0xC9, 0x84, 0xCE, + 0xA5, 0xCC, 0x94, 0xC9, 0x84, 0xCE, 0xA9, 0xCC, + 0x93, 0xC9, 0x84, 0xCE, 0xA9, 0xCC, 0x94, 0xC9, + 0x84, 0xCE, 0xB1, 0xCC, 0x80, 0xC9, 0x84, 0xCE, + // Bytes 4800 - 483f + 0xB1, 0xCC, 0x81, 0xC9, 0x84, 0xCE, 0xB1, 0xCC, + 0x93, 0xC9, 0x84, 0xCE, 0xB1, 0xCC, 0x94, 0xC9, + 0x84, 0xCE, 0xB1, 0xCD, 0x82, 0xC9, 0x84, 0xCE, + 0xB5, 0xCC, 0x93, 0xC9, 0x84, 0xCE, 0xB5, 0xCC, + 0x94, 0xC9, 0x84, 0xCE, 0xB7, 0xCC, 0x80, 0xC9, + 0x84, 0xCE, 0xB7, 0xCC, 0x81, 0xC9, 0x84, 0xCE, + 0xB7, 0xCC, 0x93, 0xC9, 0x84, 0xCE, 0xB7, 0xCC, + 0x94, 0xC9, 0x84, 0xCE, 0xB7, 0xCD, 0x82, 0xC9, + // Bytes 4840 - 487f + 0x84, 0xCE, 0xB9, 0xCC, 0x88, 0xC9, 0x84, 0xCE, + 0xB9, 0xCC, 0x93, 0xC9, 0x84, 0xCE, 0xB9, 0xCC, + 0x94, 0xC9, 0x84, 0xCE, 0xBF, 0xCC, 0x93, 0xC9, + 0x84, 0xCE, 0xBF, 0xCC, 0x94, 0xC9, 0x84, 0xCF, + 0x85, 0xCC, 0x88, 0xC9, 0x84, 0xCF, 0x85, 0xCC, + 0x93, 0xC9, 0x84, 0xCF, 0x85, 0xCC, 0x94, 0xC9, + 0x84, 0xCF, 0x89, 0xCC, 0x80, 0xC9, 0x84, 0xCF, + 0x89, 0xCC, 0x81, 0xC9, 0x84, 0xCF, 0x89, 0xCC, + // Bytes 4880 - 48bf + 0x93, 0xC9, 0x84, 0xCF, 0x89, 0xCC, 0x94, 0xC9, + 0x84, 0xCF, 0x89, 0xCD, 0x82, 0xC9, 0x86, 0xCE, + 0x91, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x86, 0xCE, + 0x91, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x86, 0xCE, + 0x91, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x86, 0xCE, + 0x91, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x86, 0xCE, + 0x91, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x86, 0xCE, + 0x91, 0xCC, 0x94, 0xCD, 0x82, 0xCA, 0x86, 0xCE, + // Bytes 48c0 - 48ff + 0x97, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x86, 0xCE, + 0x97, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x86, 0xCE, + 0x97, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x86, 0xCE, + 0x97, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x86, 0xCE, + 0x97, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x86, 0xCE, + 0x97, 0xCC, 0x94, 0xCD, 0x82, 0xCA, 0x86, 0xCE, + 0xA9, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x86, 0xCE, + 0xA9, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x86, 0xCE, + // Bytes 4900 - 493f + 0xA9, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x86, 0xCE, + 0xA9, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x86, 0xCE, + 0xA9, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x86, 0xCE, + 0xA9, 0xCC, 0x94, 0xCD, 0x82, 0xCA, 0x86, 0xCE, + 0xB1, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x86, 0xCE, + 0xB1, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x86, 0xCE, + 0xB1, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x86, 0xCE, + 0xB1, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x86, 0xCE, + // Bytes 4940 - 497f + 0xB1, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x86, 0xCE, + 0xB1, 0xCC, 0x94, 0xCD, 0x82, 0xCA, 0x86, 0xCE, + 0xB7, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x86, 0xCE, + 0xB7, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x86, 0xCE, + 0xB7, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x86, 0xCE, + 0xB7, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x86, 0xCE, + 0xB7, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x86, 0xCE, + 0xB7, 0xCC, 0x94, 0xCD, 0x82, 0xCA, 0x86, 0xCF, + // Bytes 4980 - 49bf + 0x89, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x86, 0xCF, + 0x89, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x86, 0xCF, + 0x89, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x86, 0xCF, + 0x89, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x86, 0xCF, + 0x89, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x86, 0xCF, + 0x89, 0xCC, 0x94, 0xCD, 0x82, 0xCA, 0x42, 0xCC, + 0x80, 0xC9, 0x32, 0x42, 0xCC, 0x81, 0xC9, 0x32, + 0x42, 0xCC, 0x93, 0xC9, 0x32, 0x43, 0xE1, 0x85, + // Bytes 49c0 - 49ff + 0xA1, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xA2, 0x01, + 0x00, 0x43, 0xE1, 0x85, 0xA3, 0x01, 0x00, 0x43, + 0xE1, 0x85, 0xA4, 0x01, 0x00, 0x43, 0xE1, 0x85, + 0xA5, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xA6, 0x01, + 0x00, 0x43, 0xE1, 0x85, 0xA7, 0x01, 0x00, 0x43, + 0xE1, 0x85, 0xA8, 0x01, 0x00, 0x43, 0xE1, 0x85, + 0xA9, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xAA, 0x01, + 0x00, 0x43, 0xE1, 0x85, 0xAB, 0x01, 0x00, 0x43, + // Bytes 4a00 - 4a3f + 0xE1, 0x85, 0xAC, 0x01, 0x00, 0x43, 0xE1, 0x85, + 0xAD, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xAE, 0x01, + 0x00, 0x43, 0xE1, 0x85, 0xAF, 0x01, 0x00, 0x43, + 0xE1, 0x85, 0xB0, 0x01, 0x00, 0x43, 0xE1, 0x85, + 0xB1, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xB2, 0x01, + 0x00, 0x43, 0xE1, 0x85, 0xB3, 0x01, 0x00, 0x43, + 0xE1, 0x85, 0xB4, 0x01, 0x00, 0x43, 0xE1, 0x85, + 0xB5, 0x01, 0x00, 0x43, 0xE1, 0x86, 0xAA, 0x01, + // Bytes 4a40 - 4a7f + 0x00, 0x43, 0xE1, 0x86, 0xAC, 0x01, 0x00, 0x43, + 0xE1, 0x86, 0xAD, 0x01, 0x00, 0x43, 0xE1, 0x86, + 0xB0, 0x01, 0x00, 0x43, 0xE1, 0x86, 0xB1, 0x01, + 0x00, 0x43, 0xE1, 0x86, 0xB2, 0x01, 0x00, 0x43, + 0xE1, 0x86, 0xB3, 0x01, 0x00, 0x43, 0xE1, 0x86, + 0xB4, 0x01, 0x00, 0x43, 0xE1, 0x86, 0xB5, 0x01, + 0x00, 0x44, 0xCC, 0x88, 0xCC, 0x81, 0xCA, 0x32, + 0x43, 0xE3, 0x82, 0x99, 0x0D, 0x03, 0x43, 0xE3, + // Bytes 4a80 - 4abf + 0x82, 0x9A, 0x0D, 0x03, 0x46, 0xE0, 0xBD, 0xB1, + 0xE0, 0xBD, 0xB2, 0x9E, 0x26, 0x46, 0xE0, 0xBD, + 0xB1, 0xE0, 0xBD, 0xB4, 0xA2, 0x26, 0x46, 0xE0, + 0xBD, 0xB1, 0xE0, 0xBE, 0x80, 0x9E, 0x26, 0x00, + 0x01, +} + +// lookup returns the trie value for the first UTF-8 encoding in s and +// the width in bytes of this encoding. The size will be 0 if s does not +// hold enough bytes to complete the encoding. len(s) must be greater than 0. +func (t *nfcTrie) lookup(s []byte) (v uint16, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return nfcValues[c0], 1 + case c0 < 0xC2: + return 0, 1 // Illegal UTF-8: not a starter, not ASCII. + case c0 < 0xE0: // 2-byte UTF-8 + if len(s) < 2 { + return 0, 0 + } + i := nfcIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c1), 2 + case c0 < 0xF0: // 3-byte UTF-8 + if len(s) < 3 { + return 0, 0 + } + i := nfcIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = nfcIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c2), 3 + case c0 < 0xF8: // 4-byte UTF-8 + if len(s) < 4 { + return 0, 0 + } + i := nfcIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = nfcIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + o = uint32(i)<<6 + uint32(c2) + i = nfcIndex[o] + c3 := s[3] + if c3 < 0x80 || 0xC0 <= c3 { + return 0, 3 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c3), 4 + } + // Illegal rune + return 0, 1 +} + +// lookupUnsafe returns the trie value for the first UTF-8 encoding in s. +// s must start with a full and valid UTF-8 encoded rune. +func (t *nfcTrie) lookupUnsafe(s []byte) uint16 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return nfcValues[c0] + } + i := nfcIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = nfcIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = nfcIndex[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} + +// lookupString returns the trie value for the first UTF-8 encoding in s and +// the width in bytes of this encoding. The size will be 0 if s does not +// hold enough bytes to complete the encoding. len(s) must be greater than 0. +func (t *nfcTrie) lookupString(s string) (v uint16, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return nfcValues[c0], 1 + case c0 < 0xC2: + return 0, 1 // Illegal UTF-8: not a starter, not ASCII. + case c0 < 0xE0: // 2-byte UTF-8 + if len(s) < 2 { + return 0, 0 + } + i := nfcIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c1), 2 + case c0 < 0xF0: // 3-byte UTF-8 + if len(s) < 3 { + return 0, 0 + } + i := nfcIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = nfcIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c2), 3 + case c0 < 0xF8: // 4-byte UTF-8 + if len(s) < 4 { + return 0, 0 + } + i := nfcIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = nfcIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + o = uint32(i)<<6 + uint32(c2) + i = nfcIndex[o] + c3 := s[3] + if c3 < 0x80 || 0xC0 <= c3 { + return 0, 3 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c3), 4 + } + // Illegal rune + return 0, 1 +} + +// lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s. +// s must start with a full and valid UTF-8 encoded rune. +func (t *nfcTrie) lookupStringUnsafe(s string) uint16 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return nfcValues[c0] + } + i := nfcIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = nfcIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = nfcIndex[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} + +// nfcTrie. Total size: 10586 bytes (10.34 KiB). Checksum: dd926e82067bee11. +type nfcTrie struct{} + +func newNfcTrie(i int) *nfcTrie { + return &nfcTrie{} +} + +// lookupValue determines the type of block n and looks up the value for b. +func (t *nfcTrie) lookupValue(n uint32, b byte) uint16 { + switch { + case n < 46: + return uint16(nfcValues[n<<6+uint32(b)]) + default: + n -= 46 + return uint16(nfcSparse.lookup(n, b)) + } +} + +// nfcValues: 48 blocks, 3072 entries, 6144 bytes +// The third block is the zero block. +var nfcValues = [3072]uint16{ + // Block 0x0, offset 0x0 + 0x3c: 0xa000, 0x3d: 0xa000, 0x3e: 0xa000, + // Block 0x1, offset 0x40 + 0x41: 0xa000, 0x42: 0xa000, 0x43: 0xa000, 0x44: 0xa000, 0x45: 0xa000, + 0x46: 0xa000, 0x47: 0xa000, 0x48: 0xa000, 0x49: 0xa000, 0x4a: 0xa000, 0x4b: 0xa000, + 0x4c: 0xa000, 0x4d: 0xa000, 0x4e: 0xa000, 0x4f: 0xa000, 0x50: 0xa000, + 0x52: 0xa000, 0x53: 0xa000, 0x54: 0xa000, 0x55: 0xa000, 0x56: 0xa000, 0x57: 0xa000, + 0x58: 0xa000, 0x59: 0xa000, 0x5a: 0xa000, + 0x61: 0xa000, 0x62: 0xa000, 0x63: 0xa000, + 0x64: 0xa000, 0x65: 0xa000, 0x66: 0xa000, 0x67: 0xa000, 0x68: 0xa000, 0x69: 0xa000, + 0x6a: 0xa000, 0x6b: 0xa000, 0x6c: 0xa000, 0x6d: 0xa000, 0x6e: 0xa000, 0x6f: 0xa000, + 0x70: 0xa000, 0x72: 0xa000, 0x73: 0xa000, 0x74: 0xa000, 0x75: 0xa000, + 0x76: 0xa000, 0x77: 0xa000, 0x78: 0xa000, 0x79: 0xa000, 0x7a: 0xa000, + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc0: 0x2f6f, 0xc1: 0x2f74, 0xc2: 0x4688, 0xc3: 0x2f79, 0xc4: 0x4697, 0xc5: 0x469c, + 0xc6: 0xa000, 0xc7: 0x46a6, 0xc8: 0x2fe2, 0xc9: 0x2fe7, 0xca: 0x46ab, 0xcb: 0x2ffb, + 0xcc: 0x306e, 0xcd: 0x3073, 0xce: 0x3078, 0xcf: 0x46bf, 0xd1: 0x3104, + 0xd2: 0x3127, 0xd3: 0x312c, 0xd4: 0x46c9, 0xd5: 0x46ce, 0xd6: 0x46dd, + 0xd8: 0xa000, 0xd9: 0x31b3, 0xda: 0x31b8, 0xdb: 0x31bd, 0xdc: 0x470f, 0xdd: 0x3235, + 0xe0: 0x327b, 0xe1: 0x3280, 0xe2: 0x4719, 0xe3: 0x3285, + 0xe4: 0x4728, 0xe5: 0x472d, 0xe6: 0xa000, 0xe7: 0x4737, 0xe8: 0x32ee, 0xe9: 0x32f3, + 0xea: 0x473c, 0xeb: 0x3307, 0xec: 0x337f, 0xed: 0x3384, 0xee: 0x3389, 0xef: 0x4750, + 0xf1: 0x3415, 0xf2: 0x3438, 0xf3: 0x343d, 0xf4: 0x475a, 0xf5: 0x475f, + 0xf6: 0x476e, 0xf8: 0xa000, 0xf9: 0x34c9, 0xfa: 0x34ce, 0xfb: 0x34d3, + 0xfc: 0x47a0, 0xfd: 0x3550, 0xff: 0x3569, + // Block 0x4, offset 0x100 + 0x100: 0x2f7e, 0x101: 0x328a, 0x102: 0x468d, 0x103: 0x471e, 0x104: 0x2f9c, 0x105: 0x32a8, + 0x106: 0x2fb0, 0x107: 0x32bc, 0x108: 0x2fb5, 0x109: 0x32c1, 0x10a: 0x2fba, 0x10b: 0x32c6, + 0x10c: 0x2fbf, 0x10d: 0x32cb, 0x10e: 0x2fc9, 0x10f: 0x32d5, + 0x112: 0x46b0, 0x113: 0x4741, 0x114: 0x2ff1, 0x115: 0x32fd, 0x116: 0x2ff6, 0x117: 0x3302, + 0x118: 0x3014, 0x119: 0x3320, 0x11a: 0x3005, 0x11b: 0x3311, 0x11c: 0x302d, 0x11d: 0x3339, + 0x11e: 0x3037, 0x11f: 0x3343, 0x120: 0x303c, 0x121: 0x3348, 0x122: 0x3046, 0x123: 0x3352, + 0x124: 0x304b, 0x125: 0x3357, 0x128: 0x307d, 0x129: 0x338e, + 0x12a: 0x3082, 0x12b: 0x3393, 0x12c: 0x3087, 0x12d: 0x3398, 0x12e: 0x30aa, 0x12f: 0x33b6, + 0x130: 0x308c, 0x134: 0x30b4, 0x135: 0x33c0, + 0x136: 0x30c8, 0x137: 0x33d9, 0x139: 0x30d2, 0x13a: 0x33e3, 0x13b: 0x30dc, + 0x13c: 0x33ed, 0x13d: 0x30d7, 0x13e: 0x33e8, + // Block 0x5, offset 0x140 + 0x143: 0x30ff, 0x144: 0x3410, 0x145: 0x3118, + 0x146: 0x3429, 0x147: 0x310e, 0x148: 0x341f, + 0x14c: 0x46d3, 0x14d: 0x4764, 0x14e: 0x3131, 0x14f: 0x3442, 0x150: 0x313b, 0x151: 0x344c, + 0x154: 0x3159, 0x155: 0x346a, 0x156: 0x3172, 0x157: 0x3483, + 0x158: 0x3163, 0x159: 0x3474, 0x15a: 0x46f6, 0x15b: 0x4787, 0x15c: 0x317c, 0x15d: 0x348d, + 0x15e: 0x318b, 0x15f: 0x349c, 0x160: 0x46fb, 0x161: 0x478c, 0x162: 0x31a4, 0x163: 0x34ba, + 0x164: 0x3195, 0x165: 0x34ab, 0x168: 0x4705, 0x169: 0x4796, + 0x16a: 0x470a, 0x16b: 0x479b, 0x16c: 0x31c2, 0x16d: 0x34d8, 0x16e: 0x31cc, 0x16f: 0x34e2, + 0x170: 0x31d1, 0x171: 0x34e7, 0x172: 0x31ef, 0x173: 0x3505, 0x174: 0x3212, 0x175: 0x3528, + 0x176: 0x323a, 0x177: 0x3555, 0x178: 0x324e, 0x179: 0x325d, 0x17a: 0x357d, 0x17b: 0x3267, + 0x17c: 0x3587, 0x17d: 0x326c, 0x17e: 0x358c, 0x17f: 0xa000, + // Block 0x6, offset 0x180 + 0x184: 0x8100, 0x185: 0x8100, + 0x186: 0x8100, + 0x18d: 0x2f88, 0x18e: 0x3294, 0x18f: 0x3096, 0x190: 0x33a2, 0x191: 0x3140, + 0x192: 0x3451, 0x193: 0x31d6, 0x194: 0x34ec, 0x195: 0x39cf, 0x196: 0x3b5e, 0x197: 0x39c8, + 0x198: 0x3b57, 0x199: 0x39d6, 0x19a: 0x3b65, 0x19b: 0x39c1, 0x19c: 0x3b50, + 0x19e: 0x38b0, 0x19f: 0x3a3f, 0x1a0: 0x38a9, 0x1a1: 0x3a38, 0x1a2: 0x35b3, 0x1a3: 0x35c5, + 0x1a6: 0x3041, 0x1a7: 0x334d, 0x1a8: 0x30be, 0x1a9: 0x33cf, + 0x1aa: 0x46ec, 0x1ab: 0x477d, 0x1ac: 0x3990, 0x1ad: 0x3b1f, 0x1ae: 0x35d7, 0x1af: 0x35dd, + 0x1b0: 0x33c5, 0x1b4: 0x3028, 0x1b5: 0x3334, + 0x1b8: 0x30fa, 0x1b9: 0x340b, 0x1ba: 0x38b7, 0x1bb: 0x3a46, + 0x1bc: 0x35ad, 0x1bd: 0x35bf, 0x1be: 0x35b9, 0x1bf: 0x35cb, + // Block 0x7, offset 0x1c0 + 0x1c0: 0x2f8d, 0x1c1: 0x3299, 0x1c2: 0x2f92, 0x1c3: 0x329e, 0x1c4: 0x300a, 0x1c5: 0x3316, + 0x1c6: 0x300f, 0x1c7: 0x331b, 0x1c8: 0x309b, 0x1c9: 0x33a7, 0x1ca: 0x30a0, 0x1cb: 0x33ac, + 0x1cc: 0x3145, 0x1cd: 0x3456, 0x1ce: 0x314a, 0x1cf: 0x345b, 0x1d0: 0x3168, 0x1d1: 0x3479, + 0x1d2: 0x316d, 0x1d3: 0x347e, 0x1d4: 0x31db, 0x1d5: 0x34f1, 0x1d6: 0x31e0, 0x1d7: 0x34f6, + 0x1d8: 0x3186, 0x1d9: 0x3497, 0x1da: 0x319f, 0x1db: 0x34b5, + 0x1de: 0x305a, 0x1df: 0x3366, + 0x1e6: 0x4692, 0x1e7: 0x4723, 0x1e8: 0x46ba, 0x1e9: 0x474b, + 0x1ea: 0x395f, 0x1eb: 0x3aee, 0x1ec: 0x393c, 0x1ed: 0x3acb, 0x1ee: 0x46d8, 0x1ef: 0x4769, + 0x1f0: 0x3958, 0x1f1: 0x3ae7, 0x1f2: 0x3244, 0x1f3: 0x355f, + // Block 0x8, offset 0x200 + 0x200: 0x9932, 0x201: 0x9932, 0x202: 0x9932, 0x203: 0x9932, 0x204: 0x9932, 0x205: 0x8132, + 0x206: 0x9932, 0x207: 0x9932, 0x208: 0x9932, 0x209: 0x9932, 0x20a: 0x9932, 0x20b: 0x9932, + 0x20c: 0x9932, 0x20d: 0x8132, 0x20e: 0x8132, 0x20f: 0x9932, 0x210: 0x8132, 0x211: 0x9932, + 0x212: 0x8132, 0x213: 0x9932, 0x214: 0x9932, 0x215: 0x8133, 0x216: 0x812d, 0x217: 0x812d, + 0x218: 0x812d, 0x219: 0x812d, 0x21a: 0x8133, 0x21b: 0x992b, 0x21c: 0x812d, 0x21d: 0x812d, + 0x21e: 0x812d, 0x21f: 0x812d, 0x220: 0x812d, 0x221: 0x8129, 0x222: 0x8129, 0x223: 0x992d, + 0x224: 0x992d, 0x225: 0x992d, 0x226: 0x992d, 0x227: 0x9929, 0x228: 0x9929, 0x229: 0x812d, + 0x22a: 0x812d, 0x22b: 0x812d, 0x22c: 0x812d, 0x22d: 0x992d, 0x22e: 0x992d, 0x22f: 0x812d, + 0x230: 0x992d, 0x231: 0x992d, 0x232: 0x812d, 0x233: 0x812d, 0x234: 0x8101, 0x235: 0x8101, + 0x236: 0x8101, 0x237: 0x8101, 0x238: 0x9901, 0x239: 0x812d, 0x23a: 0x812d, 0x23b: 0x812d, + 0x23c: 0x812d, 0x23d: 0x8132, 0x23e: 0x8132, 0x23f: 0x8132, + // Block 0x9, offset 0x240 + 0x240: 0x49ae, 0x241: 0x49b3, 0x242: 0x9932, 0x243: 0x49b8, 0x244: 0x4a71, 0x245: 0x9936, + 0x246: 0x8132, 0x247: 0x812d, 0x248: 0x812d, 0x249: 0x812d, 0x24a: 0x8132, 0x24b: 0x8132, + 0x24c: 0x8132, 0x24d: 0x812d, 0x24e: 0x812d, 0x250: 0x8132, 0x251: 0x8132, + 0x252: 0x8132, 0x253: 0x812d, 0x254: 0x812d, 0x255: 0x812d, 0x256: 0x812d, 0x257: 0x8132, + 0x258: 0x8133, 0x259: 0x812d, 0x25a: 0x812d, 0x25b: 0x8132, 0x25c: 0x8134, 0x25d: 0x8135, + 0x25e: 0x8135, 0x25f: 0x8134, 0x260: 0x8135, 0x261: 0x8135, 0x262: 0x8134, 0x263: 0x8132, + 0x264: 0x8132, 0x265: 0x8132, 0x266: 0x8132, 0x267: 0x8132, 0x268: 0x8132, 0x269: 0x8132, + 0x26a: 0x8132, 0x26b: 0x8132, 0x26c: 0x8132, 0x26d: 0x8132, 0x26e: 0x8132, 0x26f: 0x8132, + 0x274: 0x0170, + 0x27a: 0x8100, + 0x27e: 0x0037, + // Block 0xa, offset 0x280 + 0x284: 0x8100, 0x285: 0x35a1, + 0x286: 0x35e9, 0x287: 0x00ce, 0x288: 0x3607, 0x289: 0x3613, 0x28a: 0x3625, + 0x28c: 0x3643, 0x28e: 0x3655, 0x28f: 0x3673, 0x290: 0x3e08, 0x291: 0xa000, + 0x295: 0xa000, 0x297: 0xa000, + 0x299: 0xa000, + 0x29f: 0xa000, 0x2a1: 0xa000, + 0x2a5: 0xa000, 0x2a9: 0xa000, + 0x2aa: 0x3637, 0x2ab: 0x3667, 0x2ac: 0x47fe, 0x2ad: 0x3697, 0x2ae: 0x4828, 0x2af: 0x36a9, + 0x2b0: 0x3e70, 0x2b1: 0xa000, 0x2b5: 0xa000, + 0x2b7: 0xa000, 0x2b9: 0xa000, + 0x2bf: 0xa000, + // Block 0xb, offset 0x2c0 + 0x2c0: 0x3721, 0x2c1: 0x372d, 0x2c3: 0x371b, + 0x2c6: 0xa000, 0x2c7: 0x3709, + 0x2cc: 0x375d, 0x2cd: 0x3745, 0x2ce: 0x376f, 0x2d0: 0xa000, + 0x2d3: 0xa000, 0x2d5: 0xa000, 0x2d6: 0xa000, 0x2d7: 0xa000, + 0x2d8: 0xa000, 0x2d9: 0x3751, 0x2da: 0xa000, + 0x2de: 0xa000, 0x2e3: 0xa000, + 0x2e7: 0xa000, + 0x2eb: 0xa000, 0x2ed: 0xa000, + 0x2f0: 0xa000, 0x2f3: 0xa000, 0x2f5: 0xa000, + 0x2f6: 0xa000, 0x2f7: 0xa000, 0x2f8: 0xa000, 0x2f9: 0x37d5, 0x2fa: 0xa000, + 0x2fe: 0xa000, + // Block 0xc, offset 0x300 + 0x301: 0x3733, 0x302: 0x37b7, + 0x310: 0x370f, 0x311: 0x3793, + 0x312: 0x3715, 0x313: 0x3799, 0x316: 0x3727, 0x317: 0x37ab, + 0x318: 0xa000, 0x319: 0xa000, 0x31a: 0x3829, 0x31b: 0x382f, 0x31c: 0x3739, 0x31d: 0x37bd, + 0x31e: 0x373f, 0x31f: 0x37c3, 0x322: 0x374b, 0x323: 0x37cf, + 0x324: 0x3757, 0x325: 0x37db, 0x326: 0x3763, 0x327: 0x37e7, 0x328: 0xa000, 0x329: 0xa000, + 0x32a: 0x3835, 0x32b: 0x383b, 0x32c: 0x378d, 0x32d: 0x3811, 0x32e: 0x3769, 0x32f: 0x37ed, + 0x330: 0x3775, 0x331: 0x37f9, 0x332: 0x377b, 0x333: 0x37ff, 0x334: 0x3781, 0x335: 0x3805, + 0x338: 0x3787, 0x339: 0x380b, + // Block 0xd, offset 0x340 + 0x351: 0x812d, + 0x352: 0x8132, 0x353: 0x8132, 0x354: 0x8132, 0x355: 0x8132, 0x356: 0x812d, 0x357: 0x8132, + 0x358: 0x8132, 0x359: 0x8132, 0x35a: 0x812e, 0x35b: 0x812d, 0x35c: 0x8132, 0x35d: 0x8132, + 0x35e: 0x8132, 0x35f: 0x8132, 0x360: 0x8132, 0x361: 0x8132, 0x362: 0x812d, 0x363: 0x812d, + 0x364: 0x812d, 0x365: 0x812d, 0x366: 0x812d, 0x367: 0x812d, 0x368: 0x8132, 0x369: 0x8132, + 0x36a: 0x812d, 0x36b: 0x8132, 0x36c: 0x8132, 0x36d: 0x812e, 0x36e: 0x8131, 0x36f: 0x8132, + 0x370: 0x8105, 0x371: 0x8106, 0x372: 0x8107, 0x373: 0x8108, 0x374: 0x8109, 0x375: 0x810a, + 0x376: 0x810b, 0x377: 0x810c, 0x378: 0x810d, 0x379: 0x810e, 0x37a: 0x810e, 0x37b: 0x810f, + 0x37c: 0x8110, 0x37d: 0x8111, 0x37f: 0x8112, + // Block 0xe, offset 0x380 + 0x388: 0xa000, 0x38a: 0xa000, 0x38b: 0x8116, + 0x38c: 0x8117, 0x38d: 0x8118, 0x38e: 0x8119, 0x38f: 0x811a, 0x390: 0x811b, 0x391: 0x811c, + 0x392: 0x811d, 0x393: 0x9932, 0x394: 0x9932, 0x395: 0x992d, 0x396: 0x812d, 0x397: 0x8132, + 0x398: 0x8132, 0x399: 0x8132, 0x39a: 0x8132, 0x39b: 0x8132, 0x39c: 0x812d, 0x39d: 0x8132, + 0x39e: 0x8132, 0x39f: 0x812d, + 0x3b0: 0x811e, + // Block 0xf, offset 0x3c0 + 0x3d3: 0x812d, 0x3d4: 0x8132, 0x3d5: 0x8132, 0x3d6: 0x8132, 0x3d7: 0x8132, + 0x3d8: 0x8132, 0x3d9: 0x8132, 0x3da: 0x8132, 0x3db: 0x8132, 0x3dc: 0x8132, 0x3dd: 0x8132, + 0x3de: 0x8132, 0x3df: 0x8132, 0x3e0: 0x8132, 0x3e1: 0x8132, 0x3e3: 0x812d, + 0x3e4: 0x8132, 0x3e5: 0x8132, 0x3e6: 0x812d, 0x3e7: 0x8132, 0x3e8: 0x8132, 0x3e9: 0x812d, + 0x3ea: 0x8132, 0x3eb: 0x8132, 0x3ec: 0x8132, 0x3ed: 0x812d, 0x3ee: 0x812d, 0x3ef: 0x812d, + 0x3f0: 0x8116, 0x3f1: 0x8117, 0x3f2: 0x8118, 0x3f3: 0x8132, 0x3f4: 0x8132, 0x3f5: 0x8132, + 0x3f6: 0x812d, 0x3f7: 0x8132, 0x3f8: 0x8132, 0x3f9: 0x812d, 0x3fa: 0x812d, 0x3fb: 0x8132, + 0x3fc: 0x8132, 0x3fd: 0x8132, 0x3fe: 0x8132, 0x3ff: 0x8132, + // Block 0x10, offset 0x400 + 0x405: 0xa000, + 0x406: 0x2d26, 0x407: 0xa000, 0x408: 0x2d2e, 0x409: 0xa000, 0x40a: 0x2d36, 0x40b: 0xa000, + 0x40c: 0x2d3e, 0x40d: 0xa000, 0x40e: 0x2d46, 0x411: 0xa000, + 0x412: 0x2d4e, + 0x434: 0x8102, 0x435: 0x9900, + 0x43a: 0xa000, 0x43b: 0x2d56, + 0x43c: 0xa000, 0x43d: 0x2d5e, 0x43e: 0xa000, 0x43f: 0xa000, + // Block 0x11, offset 0x440 + 0x440: 0x8132, 0x441: 0x8132, 0x442: 0x812d, 0x443: 0x8132, 0x444: 0x8132, 0x445: 0x8132, + 0x446: 0x8132, 0x447: 0x8132, 0x448: 0x8132, 0x449: 0x8132, 0x44a: 0x812d, 0x44b: 0x8132, + 0x44c: 0x8132, 0x44d: 0x8135, 0x44e: 0x812a, 0x44f: 0x812d, 0x450: 0x8129, 0x451: 0x8132, + 0x452: 0x8132, 0x453: 0x8132, 0x454: 0x8132, 0x455: 0x8132, 0x456: 0x8132, 0x457: 0x8132, + 0x458: 0x8132, 0x459: 0x8132, 0x45a: 0x8132, 0x45b: 0x8132, 0x45c: 0x8132, 0x45d: 0x8132, + 0x45e: 0x8132, 0x45f: 0x8132, 0x460: 0x8132, 0x461: 0x8132, 0x462: 0x8132, 0x463: 0x8132, + 0x464: 0x8132, 0x465: 0x8132, 0x466: 0x8132, 0x467: 0x8132, 0x468: 0x8132, 0x469: 0x8132, + 0x46a: 0x8132, 0x46b: 0x8132, 0x46c: 0x8132, 0x46d: 0x8132, 0x46e: 0x8132, 0x46f: 0x8132, + 0x470: 0x8132, 0x471: 0x8132, 0x472: 0x8132, 0x473: 0x8132, 0x474: 0x8132, 0x475: 0x8132, + 0x476: 0x8133, 0x477: 0x8131, 0x478: 0x8131, 0x479: 0x812d, 0x47b: 0x8132, + 0x47c: 0x8134, 0x47d: 0x812d, 0x47e: 0x8132, 0x47f: 0x812d, + // Block 0x12, offset 0x480 + 0x480: 0x2f97, 0x481: 0x32a3, 0x482: 0x2fa1, 0x483: 0x32ad, 0x484: 0x2fa6, 0x485: 0x32b2, + 0x486: 0x2fab, 0x487: 0x32b7, 0x488: 0x38cc, 0x489: 0x3a5b, 0x48a: 0x2fc4, 0x48b: 0x32d0, + 0x48c: 0x2fce, 0x48d: 0x32da, 0x48e: 0x2fdd, 0x48f: 0x32e9, 0x490: 0x2fd3, 0x491: 0x32df, + 0x492: 0x2fd8, 0x493: 0x32e4, 0x494: 0x38ef, 0x495: 0x3a7e, 0x496: 0x38f6, 0x497: 0x3a85, + 0x498: 0x3019, 0x499: 0x3325, 0x49a: 0x301e, 0x49b: 0x332a, 0x49c: 0x3904, 0x49d: 0x3a93, + 0x49e: 0x3023, 0x49f: 0x332f, 0x4a0: 0x3032, 0x4a1: 0x333e, 0x4a2: 0x3050, 0x4a3: 0x335c, + 0x4a4: 0x305f, 0x4a5: 0x336b, 0x4a6: 0x3055, 0x4a7: 0x3361, 0x4a8: 0x3064, 0x4a9: 0x3370, + 0x4aa: 0x3069, 0x4ab: 0x3375, 0x4ac: 0x30af, 0x4ad: 0x33bb, 0x4ae: 0x390b, 0x4af: 0x3a9a, + 0x4b0: 0x30b9, 0x4b1: 0x33ca, 0x4b2: 0x30c3, 0x4b3: 0x33d4, 0x4b4: 0x30cd, 0x4b5: 0x33de, + 0x4b6: 0x46c4, 0x4b7: 0x4755, 0x4b8: 0x3912, 0x4b9: 0x3aa1, 0x4ba: 0x30e6, 0x4bb: 0x33f7, + 0x4bc: 0x30e1, 0x4bd: 0x33f2, 0x4be: 0x30eb, 0x4bf: 0x33fc, + // Block 0x13, offset 0x4c0 + 0x4c0: 0x30f0, 0x4c1: 0x3401, 0x4c2: 0x30f5, 0x4c3: 0x3406, 0x4c4: 0x3109, 0x4c5: 0x341a, + 0x4c6: 0x3113, 0x4c7: 0x3424, 0x4c8: 0x3122, 0x4c9: 0x3433, 0x4ca: 0x311d, 0x4cb: 0x342e, + 0x4cc: 0x3935, 0x4cd: 0x3ac4, 0x4ce: 0x3943, 0x4cf: 0x3ad2, 0x4d0: 0x394a, 0x4d1: 0x3ad9, + 0x4d2: 0x3951, 0x4d3: 0x3ae0, 0x4d4: 0x314f, 0x4d5: 0x3460, 0x4d6: 0x3154, 0x4d7: 0x3465, + 0x4d8: 0x315e, 0x4d9: 0x346f, 0x4da: 0x46f1, 0x4db: 0x4782, 0x4dc: 0x3997, 0x4dd: 0x3b26, + 0x4de: 0x3177, 0x4df: 0x3488, 0x4e0: 0x3181, 0x4e1: 0x3492, 0x4e2: 0x4700, 0x4e3: 0x4791, + 0x4e4: 0x399e, 0x4e5: 0x3b2d, 0x4e6: 0x39a5, 0x4e7: 0x3b34, 0x4e8: 0x39ac, 0x4e9: 0x3b3b, + 0x4ea: 0x3190, 0x4eb: 0x34a1, 0x4ec: 0x319a, 0x4ed: 0x34b0, 0x4ee: 0x31ae, 0x4ef: 0x34c4, + 0x4f0: 0x31a9, 0x4f1: 0x34bf, 0x4f2: 0x31ea, 0x4f3: 0x3500, 0x4f4: 0x31f9, 0x4f5: 0x350f, + 0x4f6: 0x31f4, 0x4f7: 0x350a, 0x4f8: 0x39b3, 0x4f9: 0x3b42, 0x4fa: 0x39ba, 0x4fb: 0x3b49, + 0x4fc: 0x31fe, 0x4fd: 0x3514, 0x4fe: 0x3203, 0x4ff: 0x3519, + // Block 0x14, offset 0x500 + 0x500: 0x3208, 0x501: 0x351e, 0x502: 0x320d, 0x503: 0x3523, 0x504: 0x321c, 0x505: 0x3532, + 0x506: 0x3217, 0x507: 0x352d, 0x508: 0x3221, 0x509: 0x353c, 0x50a: 0x3226, 0x50b: 0x3541, + 0x50c: 0x322b, 0x50d: 0x3546, 0x50e: 0x3249, 0x50f: 0x3564, 0x510: 0x3262, 0x511: 0x3582, + 0x512: 0x3271, 0x513: 0x3591, 0x514: 0x3276, 0x515: 0x3596, 0x516: 0x337a, 0x517: 0x34a6, + 0x518: 0x3537, 0x519: 0x3573, 0x51b: 0x35d1, + 0x520: 0x46a1, 0x521: 0x4732, 0x522: 0x2f83, 0x523: 0x328f, + 0x524: 0x3878, 0x525: 0x3a07, 0x526: 0x3871, 0x527: 0x3a00, 0x528: 0x3886, 0x529: 0x3a15, + 0x52a: 0x387f, 0x52b: 0x3a0e, 0x52c: 0x38be, 0x52d: 0x3a4d, 0x52e: 0x3894, 0x52f: 0x3a23, + 0x530: 0x388d, 0x531: 0x3a1c, 0x532: 0x38a2, 0x533: 0x3a31, 0x534: 0x389b, 0x535: 0x3a2a, + 0x536: 0x38c5, 0x537: 0x3a54, 0x538: 0x46b5, 0x539: 0x4746, 0x53a: 0x3000, 0x53b: 0x330c, + 0x53c: 0x2fec, 0x53d: 0x32f8, 0x53e: 0x38da, 0x53f: 0x3a69, + // Block 0x15, offset 0x540 + 0x540: 0x38d3, 0x541: 0x3a62, 0x542: 0x38e8, 0x543: 0x3a77, 0x544: 0x38e1, 0x545: 0x3a70, + 0x546: 0x38fd, 0x547: 0x3a8c, 0x548: 0x3091, 0x549: 0x339d, 0x54a: 0x30a5, 0x54b: 0x33b1, + 0x54c: 0x46e7, 0x54d: 0x4778, 0x54e: 0x3136, 0x54f: 0x3447, 0x550: 0x3920, 0x551: 0x3aaf, + 0x552: 0x3919, 0x553: 0x3aa8, 0x554: 0x392e, 0x555: 0x3abd, 0x556: 0x3927, 0x557: 0x3ab6, + 0x558: 0x3989, 0x559: 0x3b18, 0x55a: 0x396d, 0x55b: 0x3afc, 0x55c: 0x3966, 0x55d: 0x3af5, + 0x55e: 0x397b, 0x55f: 0x3b0a, 0x560: 0x3974, 0x561: 0x3b03, 0x562: 0x3982, 0x563: 0x3b11, + 0x564: 0x31e5, 0x565: 0x34fb, 0x566: 0x31c7, 0x567: 0x34dd, 0x568: 0x39e4, 0x569: 0x3b73, + 0x56a: 0x39dd, 0x56b: 0x3b6c, 0x56c: 0x39f2, 0x56d: 0x3b81, 0x56e: 0x39eb, 0x56f: 0x3b7a, + 0x570: 0x39f9, 0x571: 0x3b88, 0x572: 0x3230, 0x573: 0x354b, 0x574: 0x3258, 0x575: 0x3578, + 0x576: 0x3253, 0x577: 0x356e, 0x578: 0x323f, 0x579: 0x355a, + // Block 0x16, offset 0x580 + 0x580: 0x4804, 0x581: 0x480a, 0x582: 0x491e, 0x583: 0x4936, 0x584: 0x4926, 0x585: 0x493e, + 0x586: 0x492e, 0x587: 0x4946, 0x588: 0x47aa, 0x589: 0x47b0, 0x58a: 0x488e, 0x58b: 0x48a6, + 0x58c: 0x4896, 0x58d: 0x48ae, 0x58e: 0x489e, 0x58f: 0x48b6, 0x590: 0x4816, 0x591: 0x481c, + 0x592: 0x3db8, 0x593: 0x3dc8, 0x594: 0x3dc0, 0x595: 0x3dd0, + 0x598: 0x47b6, 0x599: 0x47bc, 0x59a: 0x3ce8, 0x59b: 0x3cf8, 0x59c: 0x3cf0, 0x59d: 0x3d00, + 0x5a0: 0x482e, 0x5a1: 0x4834, 0x5a2: 0x494e, 0x5a3: 0x4966, + 0x5a4: 0x4956, 0x5a5: 0x496e, 0x5a6: 0x495e, 0x5a7: 0x4976, 0x5a8: 0x47c2, 0x5a9: 0x47c8, + 0x5aa: 0x48be, 0x5ab: 0x48d6, 0x5ac: 0x48c6, 0x5ad: 0x48de, 0x5ae: 0x48ce, 0x5af: 0x48e6, + 0x5b0: 0x4846, 0x5b1: 0x484c, 0x5b2: 0x3e18, 0x5b3: 0x3e30, 0x5b4: 0x3e20, 0x5b5: 0x3e38, + 0x5b6: 0x3e28, 0x5b7: 0x3e40, 0x5b8: 0x47ce, 0x5b9: 0x47d4, 0x5ba: 0x3d18, 0x5bb: 0x3d30, + 0x5bc: 0x3d20, 0x5bd: 0x3d38, 0x5be: 0x3d28, 0x5bf: 0x3d40, + // Block 0x17, offset 0x5c0 + 0x5c0: 0x4852, 0x5c1: 0x4858, 0x5c2: 0x3e48, 0x5c3: 0x3e58, 0x5c4: 0x3e50, 0x5c5: 0x3e60, + 0x5c8: 0x47da, 0x5c9: 0x47e0, 0x5ca: 0x3d48, 0x5cb: 0x3d58, + 0x5cc: 0x3d50, 0x5cd: 0x3d60, 0x5d0: 0x4864, 0x5d1: 0x486a, + 0x5d2: 0x3e80, 0x5d3: 0x3e98, 0x5d4: 0x3e88, 0x5d5: 0x3ea0, 0x5d6: 0x3e90, 0x5d7: 0x3ea8, + 0x5d9: 0x47e6, 0x5db: 0x3d68, 0x5dd: 0x3d70, + 0x5df: 0x3d78, 0x5e0: 0x487c, 0x5e1: 0x4882, 0x5e2: 0x497e, 0x5e3: 0x4996, + 0x5e4: 0x4986, 0x5e5: 0x499e, 0x5e6: 0x498e, 0x5e7: 0x49a6, 0x5e8: 0x47ec, 0x5e9: 0x47f2, + 0x5ea: 0x48ee, 0x5eb: 0x4906, 0x5ec: 0x48f6, 0x5ed: 0x490e, 0x5ee: 0x48fe, 0x5ef: 0x4916, + 0x5f0: 0x47f8, 0x5f1: 0x431e, 0x5f2: 0x3691, 0x5f3: 0x4324, 0x5f4: 0x4822, 0x5f5: 0x432a, + 0x5f6: 0x36a3, 0x5f7: 0x4330, 0x5f8: 0x36c1, 0x5f9: 0x4336, 0x5fa: 0x36d9, 0x5fb: 0x433c, + 0x5fc: 0x4870, 0x5fd: 0x4342, + // Block 0x18, offset 0x600 + 0x600: 0x3da0, 0x601: 0x3da8, 0x602: 0x4184, 0x603: 0x41a2, 0x604: 0x418e, 0x605: 0x41ac, + 0x606: 0x4198, 0x607: 0x41b6, 0x608: 0x3cd8, 0x609: 0x3ce0, 0x60a: 0x40d0, 0x60b: 0x40ee, + 0x60c: 0x40da, 0x60d: 0x40f8, 0x60e: 0x40e4, 0x60f: 0x4102, 0x610: 0x3de8, 0x611: 0x3df0, + 0x612: 0x41c0, 0x613: 0x41de, 0x614: 0x41ca, 0x615: 0x41e8, 0x616: 0x41d4, 0x617: 0x41f2, + 0x618: 0x3d08, 0x619: 0x3d10, 0x61a: 0x410c, 0x61b: 0x412a, 0x61c: 0x4116, 0x61d: 0x4134, + 0x61e: 0x4120, 0x61f: 0x413e, 0x620: 0x3ec0, 0x621: 0x3ec8, 0x622: 0x41fc, 0x623: 0x421a, + 0x624: 0x4206, 0x625: 0x4224, 0x626: 0x4210, 0x627: 0x422e, 0x628: 0x3d80, 0x629: 0x3d88, + 0x62a: 0x4148, 0x62b: 0x4166, 0x62c: 0x4152, 0x62d: 0x4170, 0x62e: 0x415c, 0x62f: 0x417a, + 0x630: 0x3685, 0x631: 0x367f, 0x632: 0x3d90, 0x633: 0x368b, 0x634: 0x3d98, + 0x636: 0x4810, 0x637: 0x3db0, 0x638: 0x35f5, 0x639: 0x35ef, 0x63a: 0x35e3, 0x63b: 0x42ee, + 0x63c: 0x35fb, 0x63d: 0x8100, 0x63e: 0x01d3, 0x63f: 0xa100, + // Block 0x19, offset 0x640 + 0x640: 0x8100, 0x641: 0x35a7, 0x642: 0x3dd8, 0x643: 0x369d, 0x644: 0x3de0, + 0x646: 0x483a, 0x647: 0x3df8, 0x648: 0x3601, 0x649: 0x42f4, 0x64a: 0x360d, 0x64b: 0x42fa, + 0x64c: 0x3619, 0x64d: 0x3b8f, 0x64e: 0x3b96, 0x64f: 0x3b9d, 0x650: 0x36b5, 0x651: 0x36af, + 0x652: 0x3e00, 0x653: 0x44e4, 0x656: 0x36bb, 0x657: 0x3e10, + 0x658: 0x3631, 0x659: 0x362b, 0x65a: 0x361f, 0x65b: 0x4300, 0x65d: 0x3ba4, + 0x65e: 0x3bab, 0x65f: 0x3bb2, 0x660: 0x36eb, 0x661: 0x36e5, 0x662: 0x3e68, 0x663: 0x44ec, + 0x664: 0x36cd, 0x665: 0x36d3, 0x666: 0x36f1, 0x667: 0x3e78, 0x668: 0x3661, 0x669: 0x365b, + 0x66a: 0x364f, 0x66b: 0x430c, 0x66c: 0x3649, 0x66d: 0x359b, 0x66e: 0x42e8, 0x66f: 0x0081, + 0x672: 0x3eb0, 0x673: 0x36f7, 0x674: 0x3eb8, + 0x676: 0x4888, 0x677: 0x3ed0, 0x678: 0x363d, 0x679: 0x4306, 0x67a: 0x366d, 0x67b: 0x4318, + 0x67c: 0x3679, 0x67d: 0x4256, 0x67e: 0xa100, + // Block 0x1a, offset 0x680 + 0x681: 0x3c06, 0x683: 0xa000, 0x684: 0x3c0d, 0x685: 0xa000, + 0x687: 0x3c14, 0x688: 0xa000, 0x689: 0x3c1b, + 0x68d: 0xa000, + 0x6a0: 0x2f65, 0x6a1: 0xa000, 0x6a2: 0x3c29, + 0x6a4: 0xa000, 0x6a5: 0xa000, + 0x6ad: 0x3c22, 0x6ae: 0x2f60, 0x6af: 0x2f6a, + 0x6b0: 0x3c30, 0x6b1: 0x3c37, 0x6b2: 0xa000, 0x6b3: 0xa000, 0x6b4: 0x3c3e, 0x6b5: 0x3c45, + 0x6b6: 0xa000, 0x6b7: 0xa000, 0x6b8: 0x3c4c, 0x6b9: 0x3c53, 0x6ba: 0xa000, 0x6bb: 0xa000, + 0x6bc: 0xa000, 0x6bd: 0xa000, + // Block 0x1b, offset 0x6c0 + 0x6c0: 0x3c5a, 0x6c1: 0x3c61, 0x6c2: 0xa000, 0x6c3: 0xa000, 0x6c4: 0x3c76, 0x6c5: 0x3c7d, + 0x6c6: 0xa000, 0x6c7: 0xa000, 0x6c8: 0x3c84, 0x6c9: 0x3c8b, + 0x6d1: 0xa000, + 0x6d2: 0xa000, + 0x6e2: 0xa000, + 0x6e8: 0xa000, 0x6e9: 0xa000, + 0x6eb: 0xa000, 0x6ec: 0x3ca0, 0x6ed: 0x3ca7, 0x6ee: 0x3cae, 0x6ef: 0x3cb5, + 0x6f2: 0xa000, 0x6f3: 0xa000, 0x6f4: 0xa000, 0x6f5: 0xa000, + // Block 0x1c, offset 0x700 + 0x706: 0xa000, 0x70b: 0xa000, + 0x70c: 0x3f08, 0x70d: 0xa000, 0x70e: 0x3f10, 0x70f: 0xa000, 0x710: 0x3f18, 0x711: 0xa000, + 0x712: 0x3f20, 0x713: 0xa000, 0x714: 0x3f28, 0x715: 0xa000, 0x716: 0x3f30, 0x717: 0xa000, + 0x718: 0x3f38, 0x719: 0xa000, 0x71a: 0x3f40, 0x71b: 0xa000, 0x71c: 0x3f48, 0x71d: 0xa000, + 0x71e: 0x3f50, 0x71f: 0xa000, 0x720: 0x3f58, 0x721: 0xa000, 0x722: 0x3f60, + 0x724: 0xa000, 0x725: 0x3f68, 0x726: 0xa000, 0x727: 0x3f70, 0x728: 0xa000, 0x729: 0x3f78, + 0x72f: 0xa000, + 0x730: 0x3f80, 0x731: 0x3f88, 0x732: 0xa000, 0x733: 0x3f90, 0x734: 0x3f98, 0x735: 0xa000, + 0x736: 0x3fa0, 0x737: 0x3fa8, 0x738: 0xa000, 0x739: 0x3fb0, 0x73a: 0x3fb8, 0x73b: 0xa000, + 0x73c: 0x3fc0, 0x73d: 0x3fc8, + // Block 0x1d, offset 0x740 + 0x754: 0x3f00, + 0x759: 0x9903, 0x75a: 0x9903, 0x75b: 0x8100, 0x75c: 0x8100, 0x75d: 0xa000, + 0x75e: 0x3fd0, + 0x766: 0xa000, + 0x76b: 0xa000, 0x76c: 0x3fe0, 0x76d: 0xa000, 0x76e: 0x3fe8, 0x76f: 0xa000, + 0x770: 0x3ff0, 0x771: 0xa000, 0x772: 0x3ff8, 0x773: 0xa000, 0x774: 0x4000, 0x775: 0xa000, + 0x776: 0x4008, 0x777: 0xa000, 0x778: 0x4010, 0x779: 0xa000, 0x77a: 0x4018, 0x77b: 0xa000, + 0x77c: 0x4020, 0x77d: 0xa000, 0x77e: 0x4028, 0x77f: 0xa000, + // Block 0x1e, offset 0x780 + 0x780: 0x4030, 0x781: 0xa000, 0x782: 0x4038, 0x784: 0xa000, 0x785: 0x4040, + 0x786: 0xa000, 0x787: 0x4048, 0x788: 0xa000, 0x789: 0x4050, + 0x78f: 0xa000, 0x790: 0x4058, 0x791: 0x4060, + 0x792: 0xa000, 0x793: 0x4068, 0x794: 0x4070, 0x795: 0xa000, 0x796: 0x4078, 0x797: 0x4080, + 0x798: 0xa000, 0x799: 0x4088, 0x79a: 0x4090, 0x79b: 0xa000, 0x79c: 0x4098, 0x79d: 0x40a0, + 0x7af: 0xa000, + 0x7b0: 0xa000, 0x7b1: 0xa000, 0x7b2: 0xa000, 0x7b4: 0x3fd8, + 0x7b7: 0x40a8, 0x7b8: 0x40b0, 0x7b9: 0x40b8, 0x7ba: 0x40c0, + 0x7bd: 0xa000, 0x7be: 0x40c8, + // Block 0x1f, offset 0x7c0 + 0x7c0: 0x1377, 0x7c1: 0x0cfb, 0x7c2: 0x13d3, 0x7c3: 0x139f, 0x7c4: 0x0e57, 0x7c5: 0x06eb, + 0x7c6: 0x08df, 0x7c7: 0x162b, 0x7c8: 0x162b, 0x7c9: 0x0a0b, 0x7ca: 0x145f, 0x7cb: 0x0943, + 0x7cc: 0x0a07, 0x7cd: 0x0bef, 0x7ce: 0x0fcf, 0x7cf: 0x115f, 0x7d0: 0x1297, 0x7d1: 0x12d3, + 0x7d2: 0x1307, 0x7d3: 0x141b, 0x7d4: 0x0d73, 0x7d5: 0x0dff, 0x7d6: 0x0eab, 0x7d7: 0x0f43, + 0x7d8: 0x125f, 0x7d9: 0x1447, 0x7da: 0x1573, 0x7db: 0x070f, 0x7dc: 0x08b3, 0x7dd: 0x0d87, + 0x7de: 0x0ecf, 0x7df: 0x1293, 0x7e0: 0x15c3, 0x7e1: 0x0ab3, 0x7e2: 0x0e77, 0x7e3: 0x1283, + 0x7e4: 0x1317, 0x7e5: 0x0c23, 0x7e6: 0x11bb, 0x7e7: 0x12df, 0x7e8: 0x0b1f, 0x7e9: 0x0d0f, + 0x7ea: 0x0e17, 0x7eb: 0x0f1b, 0x7ec: 0x1427, 0x7ed: 0x074f, 0x7ee: 0x07e7, 0x7ef: 0x0853, + 0x7f0: 0x0c8b, 0x7f1: 0x0d7f, 0x7f2: 0x0ecb, 0x7f3: 0x0fef, 0x7f4: 0x1177, 0x7f5: 0x128b, + 0x7f6: 0x12a3, 0x7f7: 0x13c7, 0x7f8: 0x14ef, 0x7f9: 0x15a3, 0x7fa: 0x15bf, 0x7fb: 0x102b, + 0x7fc: 0x106b, 0x7fd: 0x1123, 0x7fe: 0x1243, 0x7ff: 0x147b, + // Block 0x20, offset 0x800 + 0x800: 0x15cb, 0x801: 0x134b, 0x802: 0x09c7, 0x803: 0x0b3b, 0x804: 0x10db, 0x805: 0x119b, + 0x806: 0x0eff, 0x807: 0x1033, 0x808: 0x1397, 0x809: 0x14e7, 0x80a: 0x09c3, 0x80b: 0x0a8f, + 0x80c: 0x0d77, 0x80d: 0x0e2b, 0x80e: 0x0e5f, 0x80f: 0x1113, 0x810: 0x113b, 0x811: 0x14a7, + 0x812: 0x084f, 0x813: 0x11a7, 0x814: 0x07f3, 0x815: 0x07ef, 0x816: 0x1097, 0x817: 0x1127, + 0x818: 0x125b, 0x819: 0x14af, 0x81a: 0x1367, 0x81b: 0x0c27, 0x81c: 0x0d73, 0x81d: 0x1357, + 0x81e: 0x06f7, 0x81f: 0x0a63, 0x820: 0x0b93, 0x821: 0x0f2f, 0x822: 0x0faf, 0x823: 0x0873, + 0x824: 0x103b, 0x825: 0x075f, 0x826: 0x0b77, 0x827: 0x06d7, 0x828: 0x0deb, 0x829: 0x0ca3, + 0x82a: 0x110f, 0x82b: 0x08c7, 0x82c: 0x09b3, 0x82d: 0x0ffb, 0x82e: 0x1263, 0x82f: 0x133b, + 0x830: 0x0db7, 0x831: 0x13f7, 0x832: 0x0de3, 0x833: 0x0c37, 0x834: 0x121b, 0x835: 0x0c57, + 0x836: 0x0fab, 0x837: 0x072b, 0x838: 0x07a7, 0x839: 0x07eb, 0x83a: 0x0d53, 0x83b: 0x10fb, + 0x83c: 0x11f3, 0x83d: 0x1347, 0x83e: 0x145b, 0x83f: 0x085b, + // Block 0x21, offset 0x840 + 0x840: 0x090f, 0x841: 0x0a17, 0x842: 0x0b2f, 0x843: 0x0cbf, 0x844: 0x0e7b, 0x845: 0x103f, + 0x846: 0x1497, 0x847: 0x157b, 0x848: 0x15cf, 0x849: 0x15e7, 0x84a: 0x0837, 0x84b: 0x0cf3, + 0x84c: 0x0da3, 0x84d: 0x13eb, 0x84e: 0x0afb, 0x84f: 0x0bd7, 0x850: 0x0bf3, 0x851: 0x0c83, + 0x852: 0x0e6b, 0x853: 0x0eb7, 0x854: 0x0f67, 0x855: 0x108b, 0x856: 0x112f, 0x857: 0x1193, + 0x858: 0x13db, 0x859: 0x126b, 0x85a: 0x1403, 0x85b: 0x147f, 0x85c: 0x080f, 0x85d: 0x083b, + 0x85e: 0x0923, 0x85f: 0x0ea7, 0x860: 0x12f3, 0x861: 0x133b, 0x862: 0x0b1b, 0x863: 0x0b8b, + 0x864: 0x0c4f, 0x865: 0x0daf, 0x866: 0x10d7, 0x867: 0x0f23, 0x868: 0x073b, 0x869: 0x097f, + 0x86a: 0x0a63, 0x86b: 0x0ac7, 0x86c: 0x0b97, 0x86d: 0x0f3f, 0x86e: 0x0f5b, 0x86f: 0x116b, + 0x870: 0x118b, 0x871: 0x1463, 0x872: 0x14e3, 0x873: 0x14f3, 0x874: 0x152f, 0x875: 0x0753, + 0x876: 0x107f, 0x877: 0x144f, 0x878: 0x14cb, 0x879: 0x0baf, 0x87a: 0x0717, 0x87b: 0x0777, + 0x87c: 0x0a67, 0x87d: 0x0a87, 0x87e: 0x0caf, 0x87f: 0x0d73, + // Block 0x22, offset 0x880 + 0x880: 0x0ec3, 0x881: 0x0fcb, 0x882: 0x1277, 0x883: 0x1417, 0x884: 0x1623, 0x885: 0x0ce3, + 0x886: 0x14a3, 0x887: 0x0833, 0x888: 0x0d2f, 0x889: 0x0d3b, 0x88a: 0x0e0f, 0x88b: 0x0e47, + 0x88c: 0x0f4b, 0x88d: 0x0fa7, 0x88e: 0x1027, 0x88f: 0x110b, 0x890: 0x153b, 0x891: 0x07af, + 0x892: 0x0c03, 0x893: 0x14b3, 0x894: 0x0767, 0x895: 0x0aab, 0x896: 0x0e2f, 0x897: 0x13df, + 0x898: 0x0b67, 0x899: 0x0bb7, 0x89a: 0x0d43, 0x89b: 0x0f2f, 0x89c: 0x14bb, 0x89d: 0x0817, + 0x89e: 0x08ff, 0x89f: 0x0a97, 0x8a0: 0x0cd3, 0x8a1: 0x0d1f, 0x8a2: 0x0d5f, 0x8a3: 0x0df3, + 0x8a4: 0x0f47, 0x8a5: 0x0fbb, 0x8a6: 0x1157, 0x8a7: 0x12f7, 0x8a8: 0x1303, 0x8a9: 0x1457, + 0x8aa: 0x14d7, 0x8ab: 0x0883, 0x8ac: 0x0e4b, 0x8ad: 0x0903, 0x8ae: 0x0ec7, 0x8af: 0x0f6b, + 0x8b0: 0x1287, 0x8b1: 0x14bf, 0x8b2: 0x15ab, 0x8b3: 0x15d3, 0x8b4: 0x0d37, 0x8b5: 0x0e27, + 0x8b6: 0x11c3, 0x8b7: 0x10b7, 0x8b8: 0x10c3, 0x8b9: 0x10e7, 0x8ba: 0x0f17, 0x8bb: 0x0e9f, + 0x8bc: 0x1363, 0x8bd: 0x0733, 0x8be: 0x122b, 0x8bf: 0x081b, + // Block 0x23, offset 0x8c0 + 0x8c0: 0x080b, 0x8c1: 0x0b0b, 0x8c2: 0x0c2b, 0x8c3: 0x10f3, 0x8c4: 0x0a53, 0x8c5: 0x0e03, + 0x8c6: 0x0cef, 0x8c7: 0x13e7, 0x8c8: 0x12e7, 0x8c9: 0x14ab, 0x8ca: 0x1323, 0x8cb: 0x0b27, + 0x8cc: 0x0787, 0x8cd: 0x095b, 0x8d0: 0x09af, + 0x8d2: 0x0cdf, 0x8d5: 0x07f7, 0x8d6: 0x0f1f, 0x8d7: 0x0fe3, + 0x8d8: 0x1047, 0x8d9: 0x1063, 0x8da: 0x1067, 0x8db: 0x107b, 0x8dc: 0x14fb, 0x8dd: 0x10eb, + 0x8de: 0x116f, 0x8e0: 0x128f, 0x8e2: 0x1353, + 0x8e5: 0x1407, 0x8e6: 0x1433, + 0x8ea: 0x154f, 0x8eb: 0x1553, 0x8ec: 0x1557, 0x8ed: 0x15bb, 0x8ee: 0x142b, 0x8ef: 0x14c7, + 0x8f0: 0x0757, 0x8f1: 0x077b, 0x8f2: 0x078f, 0x8f3: 0x084b, 0x8f4: 0x0857, 0x8f5: 0x0897, + 0x8f6: 0x094b, 0x8f7: 0x0967, 0x8f8: 0x096f, 0x8f9: 0x09ab, 0x8fa: 0x09b7, 0x8fb: 0x0a93, + 0x8fc: 0x0a9b, 0x8fd: 0x0ba3, 0x8fe: 0x0bcb, 0x8ff: 0x0bd3, + // Block 0x24, offset 0x900 + 0x900: 0x0beb, 0x901: 0x0c97, 0x902: 0x0cc7, 0x903: 0x0ce7, 0x904: 0x0d57, 0x905: 0x0e1b, + 0x906: 0x0e37, 0x907: 0x0e67, 0x908: 0x0ebb, 0x909: 0x0edb, 0x90a: 0x0f4f, 0x90b: 0x102f, + 0x90c: 0x104b, 0x90d: 0x1053, 0x90e: 0x104f, 0x90f: 0x1057, 0x910: 0x105b, 0x911: 0x105f, + 0x912: 0x1073, 0x913: 0x1077, 0x914: 0x109b, 0x915: 0x10af, 0x916: 0x10cb, 0x917: 0x112f, + 0x918: 0x1137, 0x919: 0x113f, 0x91a: 0x1153, 0x91b: 0x117b, 0x91c: 0x11cb, 0x91d: 0x11ff, + 0x91e: 0x11ff, 0x91f: 0x1267, 0x920: 0x130f, 0x921: 0x1327, 0x922: 0x135b, 0x923: 0x135f, + 0x924: 0x13a3, 0x925: 0x13a7, 0x926: 0x13ff, 0x927: 0x1407, 0x928: 0x14db, 0x929: 0x151f, + 0x92a: 0x1537, 0x92b: 0x0b9b, 0x92c: 0x171e, 0x92d: 0x11e3, + 0x930: 0x06df, 0x931: 0x07e3, 0x932: 0x07a3, 0x933: 0x074b, 0x934: 0x078b, 0x935: 0x07b7, + 0x936: 0x0847, 0x937: 0x0863, 0x938: 0x094b, 0x939: 0x0937, 0x93a: 0x0947, 0x93b: 0x0963, + 0x93c: 0x09af, 0x93d: 0x09bf, 0x93e: 0x0a03, 0x93f: 0x0a0f, + // Block 0x25, offset 0x940 + 0x940: 0x0a2b, 0x941: 0x0a3b, 0x942: 0x0b23, 0x943: 0x0b2b, 0x944: 0x0b5b, 0x945: 0x0b7b, + 0x946: 0x0bab, 0x947: 0x0bc3, 0x948: 0x0bb3, 0x949: 0x0bd3, 0x94a: 0x0bc7, 0x94b: 0x0beb, + 0x94c: 0x0c07, 0x94d: 0x0c5f, 0x94e: 0x0c6b, 0x94f: 0x0c73, 0x950: 0x0c9b, 0x951: 0x0cdf, + 0x952: 0x0d0f, 0x953: 0x0d13, 0x954: 0x0d27, 0x955: 0x0da7, 0x956: 0x0db7, 0x957: 0x0e0f, + 0x958: 0x0e5b, 0x959: 0x0e53, 0x95a: 0x0e67, 0x95b: 0x0e83, 0x95c: 0x0ebb, 0x95d: 0x1013, + 0x95e: 0x0edf, 0x95f: 0x0f13, 0x960: 0x0f1f, 0x961: 0x0f5f, 0x962: 0x0f7b, 0x963: 0x0f9f, + 0x964: 0x0fc3, 0x965: 0x0fc7, 0x966: 0x0fe3, 0x967: 0x0fe7, 0x968: 0x0ff7, 0x969: 0x100b, + 0x96a: 0x1007, 0x96b: 0x1037, 0x96c: 0x10b3, 0x96d: 0x10cb, 0x96e: 0x10e3, 0x96f: 0x111b, + 0x970: 0x112f, 0x971: 0x114b, 0x972: 0x117b, 0x973: 0x122f, 0x974: 0x1257, 0x975: 0x12cb, + 0x976: 0x1313, 0x977: 0x131f, 0x978: 0x1327, 0x979: 0x133f, 0x97a: 0x1353, 0x97b: 0x1343, + 0x97c: 0x135b, 0x97d: 0x1357, 0x97e: 0x134f, 0x97f: 0x135f, + // Block 0x26, offset 0x980 + 0x980: 0x136b, 0x981: 0x13a7, 0x982: 0x13e3, 0x983: 0x1413, 0x984: 0x144b, 0x985: 0x146b, + 0x986: 0x14b7, 0x987: 0x14db, 0x988: 0x14fb, 0x989: 0x150f, 0x98a: 0x151f, 0x98b: 0x152b, + 0x98c: 0x1537, 0x98d: 0x158b, 0x98e: 0x162b, 0x98f: 0x16b5, 0x990: 0x16b0, 0x991: 0x16e2, + 0x992: 0x0607, 0x993: 0x062f, 0x994: 0x0633, 0x995: 0x1764, 0x996: 0x1791, 0x997: 0x1809, + 0x998: 0x1617, 0x999: 0x1627, + // Block 0x27, offset 0x9c0 + 0x9c0: 0x06fb, 0x9c1: 0x06f3, 0x9c2: 0x0703, 0x9c3: 0x1647, 0x9c4: 0x0747, 0x9c5: 0x0757, + 0x9c6: 0x075b, 0x9c7: 0x0763, 0x9c8: 0x076b, 0x9c9: 0x076f, 0x9ca: 0x077b, 0x9cb: 0x0773, + 0x9cc: 0x05b3, 0x9cd: 0x165b, 0x9ce: 0x078f, 0x9cf: 0x0793, 0x9d0: 0x0797, 0x9d1: 0x07b3, + 0x9d2: 0x164c, 0x9d3: 0x05b7, 0x9d4: 0x079f, 0x9d5: 0x07bf, 0x9d6: 0x1656, 0x9d7: 0x07cf, + 0x9d8: 0x07d7, 0x9d9: 0x0737, 0x9da: 0x07df, 0x9db: 0x07e3, 0x9dc: 0x1831, 0x9dd: 0x07ff, + 0x9de: 0x0807, 0x9df: 0x05bf, 0x9e0: 0x081f, 0x9e1: 0x0823, 0x9e2: 0x082b, 0x9e3: 0x082f, + 0x9e4: 0x05c3, 0x9e5: 0x0847, 0x9e6: 0x084b, 0x9e7: 0x0857, 0x9e8: 0x0863, 0x9e9: 0x0867, + 0x9ea: 0x086b, 0x9eb: 0x0873, 0x9ec: 0x0893, 0x9ed: 0x0897, 0x9ee: 0x089f, 0x9ef: 0x08af, + 0x9f0: 0x08b7, 0x9f1: 0x08bb, 0x9f2: 0x08bb, 0x9f3: 0x08bb, 0x9f4: 0x166a, 0x9f5: 0x0e93, + 0x9f6: 0x08cf, 0x9f7: 0x08d7, 0x9f8: 0x166f, 0x9f9: 0x08e3, 0x9fa: 0x08eb, 0x9fb: 0x08f3, + 0x9fc: 0x091b, 0x9fd: 0x0907, 0x9fe: 0x0913, 0x9ff: 0x0917, + // Block 0x28, offset 0xa00 + 0xa00: 0x091f, 0xa01: 0x0927, 0xa02: 0x092b, 0xa03: 0x0933, 0xa04: 0x093b, 0xa05: 0x093f, + 0xa06: 0x093f, 0xa07: 0x0947, 0xa08: 0x094f, 0xa09: 0x0953, 0xa0a: 0x095f, 0xa0b: 0x0983, + 0xa0c: 0x0967, 0xa0d: 0x0987, 0xa0e: 0x096b, 0xa0f: 0x0973, 0xa10: 0x080b, 0xa11: 0x09cf, + 0xa12: 0x0997, 0xa13: 0x099b, 0xa14: 0x099f, 0xa15: 0x0993, 0xa16: 0x09a7, 0xa17: 0x09a3, + 0xa18: 0x09bb, 0xa19: 0x1674, 0xa1a: 0x09d7, 0xa1b: 0x09db, 0xa1c: 0x09e3, 0xa1d: 0x09ef, + 0xa1e: 0x09f7, 0xa1f: 0x0a13, 0xa20: 0x1679, 0xa21: 0x167e, 0xa22: 0x0a1f, 0xa23: 0x0a23, + 0xa24: 0x0a27, 0xa25: 0x0a1b, 0xa26: 0x0a2f, 0xa27: 0x05c7, 0xa28: 0x05cb, 0xa29: 0x0a37, + 0xa2a: 0x0a3f, 0xa2b: 0x0a3f, 0xa2c: 0x1683, 0xa2d: 0x0a5b, 0xa2e: 0x0a5f, 0xa2f: 0x0a63, + 0xa30: 0x0a6b, 0xa31: 0x1688, 0xa32: 0x0a73, 0xa33: 0x0a77, 0xa34: 0x0b4f, 0xa35: 0x0a7f, + 0xa36: 0x05cf, 0xa37: 0x0a8b, 0xa38: 0x0a9b, 0xa39: 0x0aa7, 0xa3a: 0x0aa3, 0xa3b: 0x1692, + 0xa3c: 0x0aaf, 0xa3d: 0x1697, 0xa3e: 0x0abb, 0xa3f: 0x0ab7, + // Block 0x29, offset 0xa40 + 0xa40: 0x0abf, 0xa41: 0x0acf, 0xa42: 0x0ad3, 0xa43: 0x05d3, 0xa44: 0x0ae3, 0xa45: 0x0aeb, + 0xa46: 0x0aef, 0xa47: 0x0af3, 0xa48: 0x05d7, 0xa49: 0x169c, 0xa4a: 0x05db, 0xa4b: 0x0b0f, + 0xa4c: 0x0b13, 0xa4d: 0x0b17, 0xa4e: 0x0b1f, 0xa4f: 0x1863, 0xa50: 0x0b37, 0xa51: 0x16a6, + 0xa52: 0x16a6, 0xa53: 0x11d7, 0xa54: 0x0b47, 0xa55: 0x0b47, 0xa56: 0x05df, 0xa57: 0x16c9, + 0xa58: 0x179b, 0xa59: 0x0b57, 0xa5a: 0x0b5f, 0xa5b: 0x05e3, 0xa5c: 0x0b73, 0xa5d: 0x0b83, + 0xa5e: 0x0b87, 0xa5f: 0x0b8f, 0xa60: 0x0b9f, 0xa61: 0x05eb, 0xa62: 0x05e7, 0xa63: 0x0ba3, + 0xa64: 0x16ab, 0xa65: 0x0ba7, 0xa66: 0x0bbb, 0xa67: 0x0bbf, 0xa68: 0x0bc3, 0xa69: 0x0bbf, + 0xa6a: 0x0bcf, 0xa6b: 0x0bd3, 0xa6c: 0x0be3, 0xa6d: 0x0bdb, 0xa6e: 0x0bdf, 0xa6f: 0x0be7, + 0xa70: 0x0beb, 0xa71: 0x0bef, 0xa72: 0x0bfb, 0xa73: 0x0bff, 0xa74: 0x0c17, 0xa75: 0x0c1f, + 0xa76: 0x0c2f, 0xa77: 0x0c43, 0xa78: 0x16ba, 0xa79: 0x0c3f, 0xa7a: 0x0c33, 0xa7b: 0x0c4b, + 0xa7c: 0x0c53, 0xa7d: 0x0c67, 0xa7e: 0x16bf, 0xa7f: 0x0c6f, + // Block 0x2a, offset 0xa80 + 0xa80: 0x0c63, 0xa81: 0x0c5b, 0xa82: 0x05ef, 0xa83: 0x0c77, 0xa84: 0x0c7f, 0xa85: 0x0c87, + 0xa86: 0x0c7b, 0xa87: 0x05f3, 0xa88: 0x0c97, 0xa89: 0x0c9f, 0xa8a: 0x16c4, 0xa8b: 0x0ccb, + 0xa8c: 0x0cff, 0xa8d: 0x0cdb, 0xa8e: 0x05ff, 0xa8f: 0x0ce7, 0xa90: 0x05fb, 0xa91: 0x05f7, + 0xa92: 0x07c3, 0xa93: 0x07c7, 0xa94: 0x0d03, 0xa95: 0x0ceb, 0xa96: 0x11ab, 0xa97: 0x0663, + 0xa98: 0x0d0f, 0xa99: 0x0d13, 0xa9a: 0x0d17, 0xa9b: 0x0d2b, 0xa9c: 0x0d23, 0xa9d: 0x16dd, + 0xa9e: 0x0603, 0xa9f: 0x0d3f, 0xaa0: 0x0d33, 0xaa1: 0x0d4f, 0xaa2: 0x0d57, 0xaa3: 0x16e7, + 0xaa4: 0x0d5b, 0xaa5: 0x0d47, 0xaa6: 0x0d63, 0xaa7: 0x0607, 0xaa8: 0x0d67, 0xaa9: 0x0d6b, + 0xaaa: 0x0d6f, 0xaab: 0x0d7b, 0xaac: 0x16ec, 0xaad: 0x0d83, 0xaae: 0x060b, 0xaaf: 0x0d8f, + 0xab0: 0x16f1, 0xab1: 0x0d93, 0xab2: 0x060f, 0xab3: 0x0d9f, 0xab4: 0x0dab, 0xab5: 0x0db7, + 0xab6: 0x0dbb, 0xab7: 0x16f6, 0xab8: 0x168d, 0xab9: 0x16fb, 0xaba: 0x0ddb, 0xabb: 0x1700, + 0xabc: 0x0de7, 0xabd: 0x0def, 0xabe: 0x0ddf, 0xabf: 0x0dfb, + // Block 0x2b, offset 0xac0 + 0xac0: 0x0e0b, 0xac1: 0x0e1b, 0xac2: 0x0e0f, 0xac3: 0x0e13, 0xac4: 0x0e1f, 0xac5: 0x0e23, + 0xac6: 0x1705, 0xac7: 0x0e07, 0xac8: 0x0e3b, 0xac9: 0x0e3f, 0xaca: 0x0613, 0xacb: 0x0e53, + 0xacc: 0x0e4f, 0xacd: 0x170a, 0xace: 0x0e33, 0xacf: 0x0e6f, 0xad0: 0x170f, 0xad1: 0x1714, + 0xad2: 0x0e73, 0xad3: 0x0e87, 0xad4: 0x0e83, 0xad5: 0x0e7f, 0xad6: 0x0617, 0xad7: 0x0e8b, + 0xad8: 0x0e9b, 0xad9: 0x0e97, 0xada: 0x0ea3, 0xadb: 0x1651, 0xadc: 0x0eb3, 0xadd: 0x1719, + 0xade: 0x0ebf, 0xadf: 0x1723, 0xae0: 0x0ed3, 0xae1: 0x0edf, 0xae2: 0x0ef3, 0xae3: 0x1728, + 0xae4: 0x0f07, 0xae5: 0x0f0b, 0xae6: 0x172d, 0xae7: 0x1732, 0xae8: 0x0f27, 0xae9: 0x0f37, + 0xaea: 0x061b, 0xaeb: 0x0f3b, 0xaec: 0x061f, 0xaed: 0x061f, 0xaee: 0x0f53, 0xaef: 0x0f57, + 0xaf0: 0x0f5f, 0xaf1: 0x0f63, 0xaf2: 0x0f6f, 0xaf3: 0x0623, 0xaf4: 0x0f87, 0xaf5: 0x1737, + 0xaf6: 0x0fa3, 0xaf7: 0x173c, 0xaf8: 0x0faf, 0xaf9: 0x16a1, 0xafa: 0x0fbf, 0xafb: 0x1741, + 0xafc: 0x1746, 0xafd: 0x174b, 0xafe: 0x0627, 0xaff: 0x062b, + // Block 0x2c, offset 0xb00 + 0xb00: 0x0ff7, 0xb01: 0x1755, 0xb02: 0x1750, 0xb03: 0x175a, 0xb04: 0x175f, 0xb05: 0x0fff, + 0xb06: 0x1003, 0xb07: 0x1003, 0xb08: 0x100b, 0xb09: 0x0633, 0xb0a: 0x100f, 0xb0b: 0x0637, + 0xb0c: 0x063b, 0xb0d: 0x1769, 0xb0e: 0x1023, 0xb0f: 0x102b, 0xb10: 0x1037, 0xb11: 0x063f, + 0xb12: 0x176e, 0xb13: 0x105b, 0xb14: 0x1773, 0xb15: 0x1778, 0xb16: 0x107b, 0xb17: 0x1093, + 0xb18: 0x0643, 0xb19: 0x109b, 0xb1a: 0x109f, 0xb1b: 0x10a3, 0xb1c: 0x177d, 0xb1d: 0x1782, + 0xb1e: 0x1782, 0xb1f: 0x10bb, 0xb20: 0x0647, 0xb21: 0x1787, 0xb22: 0x10cf, 0xb23: 0x10d3, + 0xb24: 0x064b, 0xb25: 0x178c, 0xb26: 0x10ef, 0xb27: 0x064f, 0xb28: 0x10ff, 0xb29: 0x10f7, + 0xb2a: 0x1107, 0xb2b: 0x1796, 0xb2c: 0x111f, 0xb2d: 0x0653, 0xb2e: 0x112b, 0xb2f: 0x1133, + 0xb30: 0x1143, 0xb31: 0x0657, 0xb32: 0x17a0, 0xb33: 0x17a5, 0xb34: 0x065b, 0xb35: 0x17aa, + 0xb36: 0x115b, 0xb37: 0x17af, 0xb38: 0x1167, 0xb39: 0x1173, 0xb3a: 0x117b, 0xb3b: 0x17b4, + 0xb3c: 0x17b9, 0xb3d: 0x118f, 0xb3e: 0x17be, 0xb3f: 0x1197, + // Block 0x2d, offset 0xb40 + 0xb40: 0x16ce, 0xb41: 0x065f, 0xb42: 0x11af, 0xb43: 0x11b3, 0xb44: 0x0667, 0xb45: 0x11b7, + 0xb46: 0x0a33, 0xb47: 0x17c3, 0xb48: 0x17c8, 0xb49: 0x16d3, 0xb4a: 0x16d8, 0xb4b: 0x11d7, + 0xb4c: 0x11db, 0xb4d: 0x13f3, 0xb4e: 0x066b, 0xb4f: 0x1207, 0xb50: 0x1203, 0xb51: 0x120b, + 0xb52: 0x083f, 0xb53: 0x120f, 0xb54: 0x1213, 0xb55: 0x1217, 0xb56: 0x121f, 0xb57: 0x17cd, + 0xb58: 0x121b, 0xb59: 0x1223, 0xb5a: 0x1237, 0xb5b: 0x123b, 0xb5c: 0x1227, 0xb5d: 0x123f, + 0xb5e: 0x1253, 0xb5f: 0x1267, 0xb60: 0x1233, 0xb61: 0x1247, 0xb62: 0x124b, 0xb63: 0x124f, + 0xb64: 0x17d2, 0xb65: 0x17dc, 0xb66: 0x17d7, 0xb67: 0x066f, 0xb68: 0x126f, 0xb69: 0x1273, + 0xb6a: 0x127b, 0xb6b: 0x17f0, 0xb6c: 0x127f, 0xb6d: 0x17e1, 0xb6e: 0x0673, 0xb6f: 0x0677, + 0xb70: 0x17e6, 0xb71: 0x17eb, 0xb72: 0x067b, 0xb73: 0x129f, 0xb74: 0x12a3, 0xb75: 0x12a7, + 0xb76: 0x12ab, 0xb77: 0x12b7, 0xb78: 0x12b3, 0xb79: 0x12bf, 0xb7a: 0x12bb, 0xb7b: 0x12cb, + 0xb7c: 0x12c3, 0xb7d: 0x12c7, 0xb7e: 0x12cf, 0xb7f: 0x067f, + // Block 0x2e, offset 0xb80 + 0xb80: 0x12d7, 0xb81: 0x12db, 0xb82: 0x0683, 0xb83: 0x12eb, 0xb84: 0x12ef, 0xb85: 0x17f5, + 0xb86: 0x12fb, 0xb87: 0x12ff, 0xb88: 0x0687, 0xb89: 0x130b, 0xb8a: 0x05bb, 0xb8b: 0x17fa, + 0xb8c: 0x17ff, 0xb8d: 0x068b, 0xb8e: 0x068f, 0xb8f: 0x1337, 0xb90: 0x134f, 0xb91: 0x136b, + 0xb92: 0x137b, 0xb93: 0x1804, 0xb94: 0x138f, 0xb95: 0x1393, 0xb96: 0x13ab, 0xb97: 0x13b7, + 0xb98: 0x180e, 0xb99: 0x1660, 0xb9a: 0x13c3, 0xb9b: 0x13bf, 0xb9c: 0x13cb, 0xb9d: 0x1665, + 0xb9e: 0x13d7, 0xb9f: 0x13e3, 0xba0: 0x1813, 0xba1: 0x1818, 0xba2: 0x1423, 0xba3: 0x142f, + 0xba4: 0x1437, 0xba5: 0x181d, 0xba6: 0x143b, 0xba7: 0x1467, 0xba8: 0x1473, 0xba9: 0x1477, + 0xbaa: 0x146f, 0xbab: 0x1483, 0xbac: 0x1487, 0xbad: 0x1822, 0xbae: 0x1493, 0xbaf: 0x0693, + 0xbb0: 0x149b, 0xbb1: 0x1827, 0xbb2: 0x0697, 0xbb3: 0x14d3, 0xbb4: 0x0ac3, 0xbb5: 0x14eb, + 0xbb6: 0x182c, 0xbb7: 0x1836, 0xbb8: 0x069b, 0xbb9: 0x069f, 0xbba: 0x1513, 0xbbb: 0x183b, + 0xbbc: 0x06a3, 0xbbd: 0x1840, 0xbbe: 0x152b, 0xbbf: 0x152b, + // Block 0x2f, offset 0xbc0 + 0xbc0: 0x1533, 0xbc1: 0x1845, 0xbc2: 0x154b, 0xbc3: 0x06a7, 0xbc4: 0x155b, 0xbc5: 0x1567, + 0xbc6: 0x156f, 0xbc7: 0x1577, 0xbc8: 0x06ab, 0xbc9: 0x184a, 0xbca: 0x158b, 0xbcb: 0x15a7, + 0xbcc: 0x15b3, 0xbcd: 0x06af, 0xbce: 0x06b3, 0xbcf: 0x15b7, 0xbd0: 0x184f, 0xbd1: 0x06b7, + 0xbd2: 0x1854, 0xbd3: 0x1859, 0xbd4: 0x185e, 0xbd5: 0x15db, 0xbd6: 0x06bb, 0xbd7: 0x15ef, + 0xbd8: 0x15f7, 0xbd9: 0x15fb, 0xbda: 0x1603, 0xbdb: 0x160b, 0xbdc: 0x1613, 0xbdd: 0x1868, +} + +// nfcIndex: 22 blocks, 1408 entries, 1408 bytes +// Block 0 is the zero block. +var nfcIndex = [1408]uint8{ + // Block 0x0, offset 0x0 + // Block 0x1, offset 0x40 + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc2: 0x2e, 0xc3: 0x01, 0xc4: 0x02, 0xc5: 0x03, 0xc6: 0x2f, 0xc7: 0x04, + 0xc8: 0x05, 0xca: 0x30, 0xcb: 0x31, 0xcc: 0x06, 0xcd: 0x07, 0xce: 0x08, 0xcf: 0x32, + 0xd0: 0x09, 0xd1: 0x33, 0xd2: 0x34, 0xd3: 0x0a, 0xd6: 0x0b, 0xd7: 0x35, + 0xd8: 0x36, 0xd9: 0x0c, 0xdb: 0x37, 0xdc: 0x38, 0xdd: 0x39, 0xdf: 0x3a, + 0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05, + 0xea: 0x06, 0xeb: 0x07, 0xec: 0x08, 0xed: 0x09, 0xef: 0x0a, + 0xf0: 0x13, + // Block 0x4, offset 0x100 + 0x120: 0x3b, 0x121: 0x3c, 0x123: 0x0d, 0x124: 0x3d, 0x125: 0x3e, 0x126: 0x3f, 0x127: 0x40, + 0x128: 0x41, 0x129: 0x42, 0x12a: 0x43, 0x12b: 0x44, 0x12c: 0x3f, 0x12d: 0x45, 0x12e: 0x46, 0x12f: 0x47, + 0x131: 0x48, 0x132: 0x49, 0x133: 0x4a, 0x134: 0x4b, 0x135: 0x4c, 0x137: 0x4d, + 0x138: 0x4e, 0x139: 0x4f, 0x13a: 0x50, 0x13b: 0x51, 0x13c: 0x52, 0x13d: 0x53, 0x13e: 0x54, 0x13f: 0x55, + // Block 0x5, offset 0x140 + 0x140: 0x56, 0x142: 0x57, 0x144: 0x58, 0x145: 0x59, 0x146: 0x5a, 0x147: 0x5b, + 0x14d: 0x5c, + 0x15c: 0x5d, 0x15f: 0x5e, + 0x162: 0x5f, 0x164: 0x60, + 0x168: 0x61, 0x169: 0x62, 0x16a: 0x63, 0x16c: 0x0e, 0x16d: 0x64, 0x16e: 0x65, 0x16f: 0x66, + 0x170: 0x67, 0x173: 0x68, 0x177: 0x0f, + 0x178: 0x10, 0x179: 0x11, 0x17a: 0x12, 0x17b: 0x13, 0x17c: 0x14, 0x17d: 0x15, 0x17e: 0x16, 0x17f: 0x17, + // Block 0x6, offset 0x180 + 0x180: 0x69, 0x183: 0x6a, 0x184: 0x6b, 0x186: 0x6c, 0x187: 0x6d, + 0x188: 0x6e, 0x189: 0x18, 0x18a: 0x19, 0x18b: 0x6f, 0x18c: 0x70, + 0x1ab: 0x71, + 0x1b3: 0x72, 0x1b5: 0x73, 0x1b7: 0x74, + // Block 0x7, offset 0x1c0 + 0x1c0: 0x75, 0x1c1: 0x1a, 0x1c2: 0x1b, 0x1c3: 0x1c, 0x1c4: 0x76, 0x1c5: 0x77, + 0x1c9: 0x78, 0x1cc: 0x79, 0x1cd: 0x7a, + // Block 0x8, offset 0x200 + 0x219: 0x7b, 0x21a: 0x7c, 0x21b: 0x7d, + 0x220: 0x7e, 0x223: 0x7f, 0x224: 0x80, 0x225: 0x81, 0x226: 0x82, 0x227: 0x83, + 0x22a: 0x84, 0x22b: 0x85, 0x22f: 0x86, + 0x230: 0x87, 0x231: 0x88, 0x232: 0x89, 0x233: 0x8a, 0x234: 0x8b, 0x235: 0x8c, 0x236: 0x8d, 0x237: 0x87, + 0x238: 0x88, 0x239: 0x89, 0x23a: 0x8a, 0x23b: 0x8b, 0x23c: 0x8c, 0x23d: 0x8d, 0x23e: 0x87, 0x23f: 0x88, + // Block 0x9, offset 0x240 + 0x240: 0x89, 0x241: 0x8a, 0x242: 0x8b, 0x243: 0x8c, 0x244: 0x8d, 0x245: 0x87, 0x246: 0x88, 0x247: 0x89, + 0x248: 0x8a, 0x249: 0x8b, 0x24a: 0x8c, 0x24b: 0x8d, 0x24c: 0x87, 0x24d: 0x88, 0x24e: 0x89, 0x24f: 0x8a, + 0x250: 0x8b, 0x251: 0x8c, 0x252: 0x8d, 0x253: 0x87, 0x254: 0x88, 0x255: 0x89, 0x256: 0x8a, 0x257: 0x8b, + 0x258: 0x8c, 0x259: 0x8d, 0x25a: 0x87, 0x25b: 0x88, 0x25c: 0x89, 0x25d: 0x8a, 0x25e: 0x8b, 0x25f: 0x8c, + 0x260: 0x8d, 0x261: 0x87, 0x262: 0x88, 0x263: 0x89, 0x264: 0x8a, 0x265: 0x8b, 0x266: 0x8c, 0x267: 0x8d, + 0x268: 0x87, 0x269: 0x88, 0x26a: 0x89, 0x26b: 0x8a, 0x26c: 0x8b, 0x26d: 0x8c, 0x26e: 0x8d, 0x26f: 0x87, + 0x270: 0x88, 0x271: 0x89, 0x272: 0x8a, 0x273: 0x8b, 0x274: 0x8c, 0x275: 0x8d, 0x276: 0x87, 0x277: 0x88, + 0x278: 0x89, 0x279: 0x8a, 0x27a: 0x8b, 0x27b: 0x8c, 0x27c: 0x8d, 0x27d: 0x87, 0x27e: 0x88, 0x27f: 0x89, + // Block 0xa, offset 0x280 + 0x280: 0x8a, 0x281: 0x8b, 0x282: 0x8c, 0x283: 0x8d, 0x284: 0x87, 0x285: 0x88, 0x286: 0x89, 0x287: 0x8a, + 0x288: 0x8b, 0x289: 0x8c, 0x28a: 0x8d, 0x28b: 0x87, 0x28c: 0x88, 0x28d: 0x89, 0x28e: 0x8a, 0x28f: 0x8b, + 0x290: 0x8c, 0x291: 0x8d, 0x292: 0x87, 0x293: 0x88, 0x294: 0x89, 0x295: 0x8a, 0x296: 0x8b, 0x297: 0x8c, + 0x298: 0x8d, 0x299: 0x87, 0x29a: 0x88, 0x29b: 0x89, 0x29c: 0x8a, 0x29d: 0x8b, 0x29e: 0x8c, 0x29f: 0x8d, + 0x2a0: 0x87, 0x2a1: 0x88, 0x2a2: 0x89, 0x2a3: 0x8a, 0x2a4: 0x8b, 0x2a5: 0x8c, 0x2a6: 0x8d, 0x2a7: 0x87, + 0x2a8: 0x88, 0x2a9: 0x89, 0x2aa: 0x8a, 0x2ab: 0x8b, 0x2ac: 0x8c, 0x2ad: 0x8d, 0x2ae: 0x87, 0x2af: 0x88, + 0x2b0: 0x89, 0x2b1: 0x8a, 0x2b2: 0x8b, 0x2b3: 0x8c, 0x2b4: 0x8d, 0x2b5: 0x87, 0x2b6: 0x88, 0x2b7: 0x89, + 0x2b8: 0x8a, 0x2b9: 0x8b, 0x2ba: 0x8c, 0x2bb: 0x8d, 0x2bc: 0x87, 0x2bd: 0x88, 0x2be: 0x89, 0x2bf: 0x8a, + // Block 0xb, offset 0x2c0 + 0x2c0: 0x8b, 0x2c1: 0x8c, 0x2c2: 0x8d, 0x2c3: 0x87, 0x2c4: 0x88, 0x2c5: 0x89, 0x2c6: 0x8a, 0x2c7: 0x8b, + 0x2c8: 0x8c, 0x2c9: 0x8d, 0x2ca: 0x87, 0x2cb: 0x88, 0x2cc: 0x89, 0x2cd: 0x8a, 0x2ce: 0x8b, 0x2cf: 0x8c, + 0x2d0: 0x8d, 0x2d1: 0x87, 0x2d2: 0x88, 0x2d3: 0x89, 0x2d4: 0x8a, 0x2d5: 0x8b, 0x2d6: 0x8c, 0x2d7: 0x8d, + 0x2d8: 0x87, 0x2d9: 0x88, 0x2da: 0x89, 0x2db: 0x8a, 0x2dc: 0x8b, 0x2dd: 0x8c, 0x2de: 0x8e, + // Block 0xc, offset 0x300 + 0x324: 0x1d, 0x325: 0x1e, 0x326: 0x1f, 0x327: 0x20, + 0x328: 0x21, 0x329: 0x22, 0x32a: 0x23, 0x32b: 0x24, 0x32c: 0x8f, 0x32d: 0x90, 0x32e: 0x91, + 0x331: 0x92, 0x332: 0x93, 0x333: 0x94, 0x334: 0x95, + 0x338: 0x96, 0x339: 0x97, 0x33a: 0x98, 0x33b: 0x99, 0x33e: 0x9a, 0x33f: 0x9b, + // Block 0xd, offset 0x340 + 0x347: 0x9c, + 0x34b: 0x9d, 0x34d: 0x9e, + 0x368: 0x9f, 0x36b: 0xa0, + 0x374: 0xa1, + 0x37d: 0xa2, + // Block 0xe, offset 0x380 + 0x381: 0xa3, 0x382: 0xa4, 0x384: 0xa5, 0x385: 0x82, 0x387: 0xa6, + 0x388: 0xa7, 0x38b: 0xa8, 0x38c: 0xa9, 0x38d: 0xaa, + 0x391: 0xab, 0x392: 0xac, 0x393: 0xad, 0x396: 0xae, 0x397: 0xaf, + 0x398: 0x73, 0x39a: 0xb0, 0x39c: 0xb1, + 0x3a0: 0xb2, + 0x3a8: 0xb3, 0x3a9: 0xb4, 0x3aa: 0xb5, + 0x3b0: 0x73, 0x3b5: 0xb6, 0x3b6: 0xb7, + // Block 0xf, offset 0x3c0 + 0x3eb: 0xb8, 0x3ec: 0xb9, + // Block 0x10, offset 0x400 + 0x432: 0xba, + // Block 0x11, offset 0x440 + 0x445: 0xbb, 0x446: 0xbc, 0x447: 0xbd, + 0x449: 0xbe, + // Block 0x12, offset 0x480 + 0x480: 0xbf, + 0x4a3: 0xc0, 0x4a5: 0xc1, + // Block 0x13, offset 0x4c0 + 0x4c8: 0xc2, + // Block 0x14, offset 0x500 + 0x520: 0x25, 0x521: 0x26, 0x522: 0x27, 0x523: 0x28, 0x524: 0x29, 0x525: 0x2a, 0x526: 0x2b, 0x527: 0x2c, + 0x528: 0x2d, + // Block 0x15, offset 0x540 + 0x550: 0x0b, 0x551: 0x0c, 0x556: 0x0d, + 0x55b: 0x0e, 0x55d: 0x0f, 0x55e: 0x10, 0x55f: 0x11, + 0x56f: 0x12, +} + +// nfcSparseOffset: 149 entries, 298 bytes +var nfcSparseOffset = []uint16{0x0, 0x5, 0x9, 0xb, 0xd, 0x18, 0x28, 0x2a, 0x2f, 0x3a, 0x49, 0x56, 0x5e, 0x63, 0x68, 0x6a, 0x72, 0x79, 0x7c, 0x84, 0x88, 0x8c, 0x8e, 0x90, 0x99, 0x9d, 0xa4, 0xa9, 0xac, 0xb6, 0xb9, 0xc0, 0xc8, 0xcb, 0xcd, 0xcf, 0xd1, 0xd6, 0xe7, 0xf3, 0xf5, 0xfb, 0xfd, 0xff, 0x101, 0x103, 0x105, 0x107, 0x10a, 0x10d, 0x10f, 0x112, 0x115, 0x119, 0x11e, 0x127, 0x129, 0x12c, 0x12e, 0x139, 0x13d, 0x14b, 0x14e, 0x154, 0x15a, 0x165, 0x169, 0x16b, 0x16d, 0x16f, 0x171, 0x173, 0x179, 0x17d, 0x17f, 0x181, 0x189, 0x18d, 0x190, 0x192, 0x194, 0x196, 0x199, 0x19b, 0x19d, 0x19f, 0x1a1, 0x1a7, 0x1aa, 0x1ac, 0x1b3, 0x1b9, 0x1bf, 0x1c7, 0x1cd, 0x1d3, 0x1d9, 0x1dd, 0x1eb, 0x1f4, 0x1f7, 0x1fa, 0x1fc, 0x1ff, 0x201, 0x205, 0x20a, 0x20c, 0x20e, 0x213, 0x219, 0x21b, 0x21d, 0x21f, 0x225, 0x228, 0x22a, 0x230, 0x233, 0x23b, 0x242, 0x245, 0x248, 0x24a, 0x24d, 0x255, 0x259, 0x260, 0x263, 0x269, 0x26b, 0x26e, 0x270, 0x273, 0x275, 0x277, 0x279, 0x27c, 0x27e, 0x280, 0x282, 0x284, 0x291, 0x29b, 0x29d, 0x29f, 0x2a5, 0x2a7, 0x2aa} + +// nfcSparseValues: 684 entries, 2736 bytes +var nfcSparseValues = [684]valueRange{ + // Block 0x0, offset 0x0 + {value: 0x0000, lo: 0x04}, + {value: 0xa100, lo: 0xa8, hi: 0xa8}, + {value: 0x8100, lo: 0xaf, hi: 0xaf}, + {value: 0x8100, lo: 0xb4, hi: 0xb4}, + {value: 0x8100, lo: 0xb8, hi: 0xb8}, + // Block 0x1, offset 0x5 + {value: 0x0091, lo: 0x03}, + {value: 0x46e2, lo: 0xa0, hi: 0xa1}, + {value: 0x4714, lo: 0xaf, hi: 0xb0}, + {value: 0xa000, lo: 0xb7, hi: 0xb7}, + // Block 0x2, offset 0x9 + {value: 0x0000, lo: 0x01}, + {value: 0xa000, lo: 0x92, hi: 0x92}, + // Block 0x3, offset 0xb + {value: 0x0000, lo: 0x01}, + {value: 0x8100, lo: 0x98, hi: 0x9d}, + // Block 0x4, offset 0xd + {value: 0x0006, lo: 0x0a}, + {value: 0xa000, lo: 0x81, hi: 0x81}, + {value: 0xa000, lo: 0x85, hi: 0x85}, + {value: 0xa000, lo: 0x89, hi: 0x89}, + {value: 0x4840, lo: 0x8a, hi: 0x8a}, + {value: 0x485e, lo: 0x8b, hi: 0x8b}, + {value: 0x36c7, lo: 0x8c, hi: 0x8c}, + {value: 0x36df, lo: 0x8d, hi: 0x8d}, + {value: 0x4876, lo: 0x8e, hi: 0x8e}, + {value: 0xa000, lo: 0x92, hi: 0x92}, + {value: 0x36fd, lo: 0x93, hi: 0x94}, + // Block 0x5, offset 0x18 + {value: 0x0000, lo: 0x0f}, + {value: 0xa000, lo: 0x83, hi: 0x83}, + {value: 0xa000, lo: 0x87, hi: 0x87}, + {value: 0xa000, lo: 0x8b, hi: 0x8b}, + {value: 0xa000, lo: 0x8d, hi: 0x8d}, + {value: 0x37a5, lo: 0x90, hi: 0x90}, + {value: 0x37b1, lo: 0x91, hi: 0x91}, + {value: 0x379f, lo: 0x93, hi: 0x93}, + {value: 0xa000, lo: 0x96, hi: 0x96}, + {value: 0x3817, lo: 0x97, hi: 0x97}, + {value: 0x37e1, lo: 0x9c, hi: 0x9c}, + {value: 0x37c9, lo: 0x9d, hi: 0x9d}, + {value: 0x37f3, lo: 0x9e, hi: 0x9e}, + {value: 0xa000, lo: 0xb4, hi: 0xb5}, + {value: 0x381d, lo: 0xb6, hi: 0xb6}, + {value: 0x3823, lo: 0xb7, hi: 0xb7}, + // Block 0x6, offset 0x28 + {value: 0x0000, lo: 0x01}, + {value: 0x8132, lo: 0x83, hi: 0x87}, + // Block 0x7, offset 0x2a + {value: 0x0001, lo: 0x04}, + {value: 0x8113, lo: 0x81, hi: 0x82}, + {value: 0x8132, lo: 0x84, hi: 0x84}, + {value: 0x812d, lo: 0x85, hi: 0x85}, + {value: 0x810d, lo: 0x87, hi: 0x87}, + // Block 0x8, offset 0x2f + {value: 0x0000, lo: 0x0a}, + {value: 0x8132, lo: 0x90, hi: 0x97}, + {value: 0x8119, lo: 0x98, hi: 0x98}, + {value: 0x811a, lo: 0x99, hi: 0x99}, + {value: 0x811b, lo: 0x9a, hi: 0x9a}, + {value: 0x3841, lo: 0xa2, hi: 0xa2}, + {value: 0x3847, lo: 0xa3, hi: 0xa3}, + {value: 0x3853, lo: 0xa4, hi: 0xa4}, + {value: 0x384d, lo: 0xa5, hi: 0xa5}, + {value: 0x3859, lo: 0xa6, hi: 0xa6}, + {value: 0xa000, lo: 0xa7, hi: 0xa7}, + // Block 0x9, offset 0x3a + {value: 0x0000, lo: 0x0e}, + {value: 0x386b, lo: 0x80, hi: 0x80}, + {value: 0xa000, lo: 0x81, hi: 0x81}, + {value: 0x385f, lo: 0x82, hi: 0x82}, + {value: 0xa000, lo: 0x92, hi: 0x92}, + {value: 0x3865, lo: 0x93, hi: 0x93}, + {value: 0xa000, lo: 0x95, hi: 0x95}, + {value: 0x8132, lo: 0x96, hi: 0x9c}, + {value: 0x8132, lo: 0x9f, hi: 0xa2}, + {value: 0x812d, lo: 0xa3, hi: 0xa3}, + {value: 0x8132, lo: 0xa4, hi: 0xa4}, + {value: 0x8132, lo: 0xa7, hi: 0xa8}, + {value: 0x812d, lo: 0xaa, hi: 0xaa}, + {value: 0x8132, lo: 0xab, hi: 0xac}, + {value: 0x812d, lo: 0xad, hi: 0xad}, + // Block 0xa, offset 0x49 + {value: 0x0000, lo: 0x0c}, + {value: 0x811f, lo: 0x91, hi: 0x91}, + {value: 0x8132, lo: 0xb0, hi: 0xb0}, + {value: 0x812d, lo: 0xb1, hi: 0xb1}, + {value: 0x8132, lo: 0xb2, hi: 0xb3}, + {value: 0x812d, lo: 0xb4, hi: 0xb4}, + {value: 0x8132, lo: 0xb5, hi: 0xb6}, + {value: 0x812d, lo: 0xb7, hi: 0xb9}, + {value: 0x8132, lo: 0xba, hi: 0xba}, + {value: 0x812d, lo: 0xbb, hi: 0xbc}, + {value: 0x8132, lo: 0xbd, hi: 0xbd}, + {value: 0x812d, lo: 0xbe, hi: 0xbe}, + {value: 0x8132, lo: 0xbf, hi: 0xbf}, + // Block 0xb, offset 0x56 + {value: 0x0005, lo: 0x07}, + {value: 0x8132, lo: 0x80, hi: 0x80}, + {value: 0x8132, lo: 0x81, hi: 0x81}, + {value: 0x812d, lo: 0x82, hi: 0x83}, + {value: 0x812d, lo: 0x84, hi: 0x85}, + {value: 0x812d, lo: 0x86, hi: 0x87}, + {value: 0x812d, lo: 0x88, hi: 0x89}, + {value: 0x8132, lo: 0x8a, hi: 0x8a}, + // Block 0xc, offset 0x5e + {value: 0x0000, lo: 0x04}, + {value: 0x8132, lo: 0xab, hi: 0xb1}, + {value: 0x812d, lo: 0xb2, hi: 0xb2}, + {value: 0x8132, lo: 0xb3, hi: 0xb3}, + {value: 0x812d, lo: 0xbd, hi: 0xbd}, + // Block 0xd, offset 0x63 + {value: 0x0000, lo: 0x04}, + {value: 0x8132, lo: 0x96, hi: 0x99}, + {value: 0x8132, lo: 0x9b, hi: 0xa3}, + {value: 0x8132, lo: 0xa5, hi: 0xa7}, + {value: 0x8132, lo: 0xa9, hi: 0xad}, + // Block 0xe, offset 0x68 + {value: 0x0000, lo: 0x01}, + {value: 0x812d, lo: 0x99, hi: 0x9b}, + // Block 0xf, offset 0x6a + {value: 0x0000, lo: 0x07}, + {value: 0xa000, lo: 0xa8, hi: 0xa8}, + {value: 0x3ed8, lo: 0xa9, hi: 0xa9}, + {value: 0xa000, lo: 0xb0, hi: 0xb0}, + {value: 0x3ee0, lo: 0xb1, hi: 0xb1}, + {value: 0xa000, lo: 0xb3, hi: 0xb3}, + {value: 0x3ee8, lo: 0xb4, hi: 0xb4}, + {value: 0x9902, lo: 0xbc, hi: 0xbc}, + // Block 0x10, offset 0x72 + {value: 0x0008, lo: 0x06}, + {value: 0x8104, lo: 0x8d, hi: 0x8d}, + {value: 0x8132, lo: 0x91, hi: 0x91}, + {value: 0x812d, lo: 0x92, hi: 0x92}, + {value: 0x8132, lo: 0x93, hi: 0x93}, + {value: 0x8132, lo: 0x94, hi: 0x94}, + {value: 0x451c, lo: 0x98, hi: 0x9f}, + // Block 0x11, offset 0x79 + {value: 0x0000, lo: 0x02}, + {value: 0x8102, lo: 0xbc, hi: 0xbc}, + {value: 0x9900, lo: 0xbe, hi: 0xbe}, + // Block 0x12, offset 0x7c + {value: 0x0008, lo: 0x07}, + {value: 0xa000, lo: 0x87, hi: 0x87}, + {value: 0x2c9e, lo: 0x8b, hi: 0x8c}, + {value: 0x8104, lo: 0x8d, hi: 0x8d}, + {value: 0x9900, lo: 0x97, hi: 0x97}, + {value: 0x455c, lo: 0x9c, hi: 0x9d}, + {value: 0x456c, lo: 0x9f, hi: 0x9f}, + {value: 0x8132, lo: 0xbe, hi: 0xbe}, + // Block 0x13, offset 0x84 + {value: 0x0000, lo: 0x03}, + {value: 0x4594, lo: 0xb3, hi: 0xb3}, + {value: 0x459c, lo: 0xb6, hi: 0xb6}, + {value: 0x8102, lo: 0xbc, hi: 0xbc}, + // Block 0x14, offset 0x88 + {value: 0x0008, lo: 0x03}, + {value: 0x8104, lo: 0x8d, hi: 0x8d}, + {value: 0x4574, lo: 0x99, hi: 0x9b}, + {value: 0x458c, lo: 0x9e, hi: 0x9e}, + // Block 0x15, offset 0x8c + {value: 0x0000, lo: 0x01}, + {value: 0x8102, lo: 0xbc, hi: 0xbc}, + // Block 0x16, offset 0x8e + {value: 0x0000, lo: 0x01}, + {value: 0x8104, lo: 0x8d, hi: 0x8d}, + // Block 0x17, offset 0x90 + {value: 0x0000, lo: 0x08}, + {value: 0xa000, lo: 0x87, hi: 0x87}, + {value: 0x2cb6, lo: 0x88, hi: 0x88}, + {value: 0x2cae, lo: 0x8b, hi: 0x8b}, + {value: 0x2cbe, lo: 0x8c, hi: 0x8c}, + {value: 0x8104, lo: 0x8d, hi: 0x8d}, + {value: 0x9900, lo: 0x96, hi: 0x97}, + {value: 0x45a4, lo: 0x9c, hi: 0x9c}, + {value: 0x45ac, lo: 0x9d, hi: 0x9d}, + // Block 0x18, offset 0x99 + {value: 0x0000, lo: 0x03}, + {value: 0xa000, lo: 0x92, hi: 0x92}, + {value: 0x2cc6, lo: 0x94, hi: 0x94}, + {value: 0x9900, lo: 0xbe, hi: 0xbe}, + // Block 0x19, offset 0x9d + {value: 0x0000, lo: 0x06}, + {value: 0xa000, lo: 0x86, hi: 0x87}, + {value: 0x2cce, lo: 0x8a, hi: 0x8a}, + {value: 0x2cde, lo: 0x8b, hi: 0x8b}, + {value: 0x2cd6, lo: 0x8c, hi: 0x8c}, + {value: 0x8104, lo: 0x8d, hi: 0x8d}, + {value: 0x9900, lo: 0x97, hi: 0x97}, + // Block 0x1a, offset 0xa4 + {value: 0x1801, lo: 0x04}, + {value: 0xa000, lo: 0x86, hi: 0x86}, + {value: 0x3ef0, lo: 0x88, hi: 0x88}, + {value: 0x8104, lo: 0x8d, hi: 0x8d}, + {value: 0x8120, lo: 0x95, hi: 0x96}, + // Block 0x1b, offset 0xa9 + {value: 0x0000, lo: 0x02}, + {value: 0x8102, lo: 0xbc, hi: 0xbc}, + {value: 0xa000, lo: 0xbf, hi: 0xbf}, + // Block 0x1c, offset 0xac + {value: 0x0000, lo: 0x09}, + {value: 0x2ce6, lo: 0x80, hi: 0x80}, + {value: 0x9900, lo: 0x82, hi: 0x82}, + {value: 0xa000, lo: 0x86, hi: 0x86}, + {value: 0x2cee, lo: 0x87, hi: 0x87}, + {value: 0x2cf6, lo: 0x88, hi: 0x88}, + {value: 0x2f50, lo: 0x8a, hi: 0x8a}, + {value: 0x2dd8, lo: 0x8b, hi: 0x8b}, + {value: 0x8104, lo: 0x8d, hi: 0x8d}, + {value: 0x9900, lo: 0x95, hi: 0x96}, + // Block 0x1d, offset 0xb6 + {value: 0x0000, lo: 0x02}, + {value: 0x8104, lo: 0xbb, hi: 0xbc}, + {value: 0x9900, lo: 0xbe, hi: 0xbe}, + // Block 0x1e, offset 0xb9 + {value: 0x0000, lo: 0x06}, + {value: 0xa000, lo: 0x86, hi: 0x87}, + {value: 0x2cfe, lo: 0x8a, hi: 0x8a}, + {value: 0x2d0e, lo: 0x8b, hi: 0x8b}, + {value: 0x2d06, lo: 0x8c, hi: 0x8c}, + {value: 0x8104, lo: 0x8d, hi: 0x8d}, + {value: 0x9900, lo: 0x97, hi: 0x97}, + // Block 0x1f, offset 0xc0 + {value: 0x6bea, lo: 0x07}, + {value: 0x9904, lo: 0x8a, hi: 0x8a}, + {value: 0x9900, lo: 0x8f, hi: 0x8f}, + {value: 0xa000, lo: 0x99, hi: 0x99}, + {value: 0x3ef8, lo: 0x9a, hi: 0x9a}, + {value: 0x2f58, lo: 0x9c, hi: 0x9c}, + {value: 0x2de3, lo: 0x9d, hi: 0x9d}, + {value: 0x2d16, lo: 0x9e, hi: 0x9f}, + // Block 0x20, offset 0xc8 + {value: 0x0000, lo: 0x02}, + {value: 0x8122, lo: 0xb8, hi: 0xb9}, + {value: 0x8104, lo: 0xba, hi: 0xba}, + // Block 0x21, offset 0xcb + {value: 0x0000, lo: 0x01}, + {value: 0x8123, lo: 0x88, hi: 0x8b}, + // Block 0x22, offset 0xcd + {value: 0x0000, lo: 0x01}, + {value: 0x8124, lo: 0xb8, hi: 0xb9}, + // Block 0x23, offset 0xcf + {value: 0x0000, lo: 0x01}, + {value: 0x8125, lo: 0x88, hi: 0x8b}, + // Block 0x24, offset 0xd1 + {value: 0x0000, lo: 0x04}, + {value: 0x812d, lo: 0x98, hi: 0x99}, + {value: 0x812d, lo: 0xb5, hi: 0xb5}, + {value: 0x812d, lo: 0xb7, hi: 0xb7}, + {value: 0x812b, lo: 0xb9, hi: 0xb9}, + // Block 0x25, offset 0xd6 + {value: 0x0000, lo: 0x10}, + {value: 0x2644, lo: 0x83, hi: 0x83}, + {value: 0x264b, lo: 0x8d, hi: 0x8d}, + {value: 0x2652, lo: 0x92, hi: 0x92}, + {value: 0x2659, lo: 0x97, hi: 0x97}, + {value: 0x2660, lo: 0x9c, hi: 0x9c}, + {value: 0x263d, lo: 0xa9, hi: 0xa9}, + {value: 0x8126, lo: 0xb1, hi: 0xb1}, + {value: 0x8127, lo: 0xb2, hi: 0xb2}, + {value: 0x4a84, lo: 0xb3, hi: 0xb3}, + {value: 0x8128, lo: 0xb4, hi: 0xb4}, + {value: 0x4a8d, lo: 0xb5, hi: 0xb5}, + {value: 0x45b4, lo: 0xb6, hi: 0xb6}, + {value: 0x8200, lo: 0xb7, hi: 0xb7}, + {value: 0x45bc, lo: 0xb8, hi: 0xb8}, + {value: 0x8200, lo: 0xb9, hi: 0xb9}, + {value: 0x8127, lo: 0xba, hi: 0xbd}, + // Block 0x26, offset 0xe7 + {value: 0x0000, lo: 0x0b}, + {value: 0x8127, lo: 0x80, hi: 0x80}, + {value: 0x4a96, lo: 0x81, hi: 0x81}, + {value: 0x8132, lo: 0x82, hi: 0x83}, + {value: 0x8104, lo: 0x84, hi: 0x84}, + {value: 0x8132, lo: 0x86, hi: 0x87}, + {value: 0x266e, lo: 0x93, hi: 0x93}, + {value: 0x2675, lo: 0x9d, hi: 0x9d}, + {value: 0x267c, lo: 0xa2, hi: 0xa2}, + {value: 0x2683, lo: 0xa7, hi: 0xa7}, + {value: 0x268a, lo: 0xac, hi: 0xac}, + {value: 0x2667, lo: 0xb9, hi: 0xb9}, + // Block 0x27, offset 0xf3 + {value: 0x0000, lo: 0x01}, + {value: 0x812d, lo: 0x86, hi: 0x86}, + // Block 0x28, offset 0xf5 + {value: 0x0000, lo: 0x05}, + {value: 0xa000, lo: 0xa5, hi: 0xa5}, + {value: 0x2d1e, lo: 0xa6, hi: 0xa6}, + {value: 0x9900, lo: 0xae, hi: 0xae}, + {value: 0x8102, lo: 0xb7, hi: 0xb7}, + {value: 0x8104, lo: 0xb9, hi: 0xba}, + // Block 0x29, offset 0xfb + {value: 0x0000, lo: 0x01}, + {value: 0x812d, lo: 0x8d, hi: 0x8d}, + // Block 0x2a, offset 0xfd + {value: 0x0000, lo: 0x01}, + {value: 0xa000, lo: 0x80, hi: 0x92}, + // Block 0x2b, offset 0xff + {value: 0x0000, lo: 0x01}, + {value: 0xb900, lo: 0xa1, hi: 0xb5}, + // Block 0x2c, offset 0x101 + {value: 0x0000, lo: 0x01}, + {value: 0x9900, lo: 0xa8, hi: 0xbf}, + // Block 0x2d, offset 0x103 + {value: 0x0000, lo: 0x01}, + {value: 0x9900, lo: 0x80, hi: 0x82}, + // Block 0x2e, offset 0x105 + {value: 0x0000, lo: 0x01}, + {value: 0x8132, lo: 0x9d, hi: 0x9f}, + // Block 0x2f, offset 0x107 + {value: 0x0000, lo: 0x02}, + {value: 0x8104, lo: 0x94, hi: 0x94}, + {value: 0x8104, lo: 0xb4, hi: 0xb4}, + // Block 0x30, offset 0x10a + {value: 0x0000, lo: 0x02}, + {value: 0x8104, lo: 0x92, hi: 0x92}, + {value: 0x8132, lo: 0x9d, hi: 0x9d}, + // Block 0x31, offset 0x10d + {value: 0x0000, lo: 0x01}, + {value: 0x8131, lo: 0xa9, hi: 0xa9}, + // Block 0x32, offset 0x10f + {value: 0x0004, lo: 0x02}, + {value: 0x812e, lo: 0xb9, hi: 0xba}, + {value: 0x812d, lo: 0xbb, hi: 0xbb}, + // Block 0x33, offset 0x112 + {value: 0x0000, lo: 0x02}, + {value: 0x8132, lo: 0x97, hi: 0x97}, + {value: 0x812d, lo: 0x98, hi: 0x98}, + // Block 0x34, offset 0x115 + {value: 0x0000, lo: 0x03}, + {value: 0x8104, lo: 0xa0, hi: 0xa0}, + {value: 0x8132, lo: 0xb5, hi: 0xbc}, + {value: 0x812d, lo: 0xbf, hi: 0xbf}, + // Block 0x35, offset 0x119 + {value: 0x0000, lo: 0x04}, + {value: 0x8132, lo: 0xb0, hi: 0xb4}, + {value: 0x812d, lo: 0xb5, hi: 0xba}, + {value: 0x8132, lo: 0xbb, hi: 0xbc}, + {value: 0x812d, lo: 0xbd, hi: 0xbd}, + // Block 0x36, offset 0x11e + {value: 0x0000, lo: 0x08}, + {value: 0x2d66, lo: 0x80, hi: 0x80}, + {value: 0x2d6e, lo: 0x81, hi: 0x81}, + {value: 0xa000, lo: 0x82, hi: 0x82}, + {value: 0x2d76, lo: 0x83, hi: 0x83}, + {value: 0x8104, lo: 0x84, hi: 0x84}, + {value: 0x8132, lo: 0xab, hi: 0xab}, + {value: 0x812d, lo: 0xac, hi: 0xac}, + {value: 0x8132, lo: 0xad, hi: 0xb3}, + // Block 0x37, offset 0x127 + {value: 0x0000, lo: 0x01}, + {value: 0x8104, lo: 0xaa, hi: 0xab}, + // Block 0x38, offset 0x129 + {value: 0x0000, lo: 0x02}, + {value: 0x8102, lo: 0xa6, hi: 0xa6}, + {value: 0x8104, lo: 0xb2, hi: 0xb3}, + // Block 0x39, offset 0x12c + {value: 0x0000, lo: 0x01}, + {value: 0x8102, lo: 0xb7, hi: 0xb7}, + // Block 0x3a, offset 0x12e + {value: 0x0000, lo: 0x0a}, + {value: 0x8132, lo: 0x90, hi: 0x92}, + {value: 0x8101, lo: 0x94, hi: 0x94}, + {value: 0x812d, lo: 0x95, hi: 0x99}, + {value: 0x8132, lo: 0x9a, hi: 0x9b}, + {value: 0x812d, lo: 0x9c, hi: 0x9f}, + {value: 0x8132, lo: 0xa0, hi: 0xa0}, + {value: 0x8101, lo: 0xa2, hi: 0xa8}, + {value: 0x812d, lo: 0xad, hi: 0xad}, + {value: 0x8132, lo: 0xb4, hi: 0xb4}, + {value: 0x8132, lo: 0xb8, hi: 0xb9}, + // Block 0x3b, offset 0x139 + {value: 0x0004, lo: 0x03}, + {value: 0x0433, lo: 0x80, hi: 0x81}, + {value: 0x8100, lo: 0x97, hi: 0x97}, + {value: 0x8100, lo: 0xbe, hi: 0xbe}, + // Block 0x3c, offset 0x13d + {value: 0x0000, lo: 0x0d}, + {value: 0x8132, lo: 0x90, hi: 0x91}, + {value: 0x8101, lo: 0x92, hi: 0x93}, + {value: 0x8132, lo: 0x94, hi: 0x97}, + {value: 0x8101, lo: 0x98, hi: 0x9a}, + {value: 0x8132, lo: 0x9b, hi: 0x9c}, + {value: 0x8132, lo: 0xa1, hi: 0xa1}, + {value: 0x8101, lo: 0xa5, hi: 0xa6}, + {value: 0x8132, lo: 0xa7, hi: 0xa7}, + {value: 0x812d, lo: 0xa8, hi: 0xa8}, + {value: 0x8132, lo: 0xa9, hi: 0xa9}, + {value: 0x8101, lo: 0xaa, hi: 0xab}, + {value: 0x812d, lo: 0xac, hi: 0xaf}, + {value: 0x8132, lo: 0xb0, hi: 0xb0}, + // Block 0x3d, offset 0x14b + {value: 0x427b, lo: 0x02}, + {value: 0x01b8, lo: 0xa6, hi: 0xa6}, + {value: 0x0057, lo: 0xaa, hi: 0xab}, + // Block 0x3e, offset 0x14e + {value: 0x0007, lo: 0x05}, + {value: 0xa000, lo: 0x90, hi: 0x90}, + {value: 0xa000, lo: 0x92, hi: 0x92}, + {value: 0xa000, lo: 0x94, hi: 0x94}, + {value: 0x3bb9, lo: 0x9a, hi: 0x9b}, + {value: 0x3bc7, lo: 0xae, hi: 0xae}, + // Block 0x3f, offset 0x154 + {value: 0x000e, lo: 0x05}, + {value: 0x3bce, lo: 0x8d, hi: 0x8e}, + {value: 0x3bd5, lo: 0x8f, hi: 0x8f}, + {value: 0xa000, lo: 0x90, hi: 0x90}, + {value: 0xa000, lo: 0x92, hi: 0x92}, + {value: 0xa000, lo: 0x94, hi: 0x94}, + // Block 0x40, offset 0x15a + {value: 0x6408, lo: 0x0a}, + {value: 0xa000, lo: 0x83, hi: 0x83}, + {value: 0x3be3, lo: 0x84, hi: 0x84}, + {value: 0xa000, lo: 0x88, hi: 0x88}, + {value: 0x3bea, lo: 0x89, hi: 0x89}, + {value: 0xa000, lo: 0x8b, hi: 0x8b}, + {value: 0x3bf1, lo: 0x8c, hi: 0x8c}, + {value: 0xa000, lo: 0xa3, hi: 0xa3}, + {value: 0x3bf8, lo: 0xa4, hi: 0xa5}, + {value: 0x3bff, lo: 0xa6, hi: 0xa6}, + {value: 0xa000, lo: 0xbc, hi: 0xbc}, + // Block 0x41, offset 0x165 + {value: 0x0007, lo: 0x03}, + {value: 0x3c68, lo: 0xa0, hi: 0xa1}, + {value: 0x3c92, lo: 0xa2, hi: 0xa3}, + {value: 0x3cbc, lo: 0xaa, hi: 0xad}, + // Block 0x42, offset 0x169 + {value: 0x0004, lo: 0x01}, + {value: 0x048b, lo: 0xa9, hi: 0xaa}, + // Block 0x43, offset 0x16b + {value: 0x0000, lo: 0x01}, + {value: 0x44dd, lo: 0x9c, hi: 0x9c}, + // Block 0x44, offset 0x16d + {value: 0x0000, lo: 0x01}, + {value: 0x8132, lo: 0xaf, hi: 0xb1}, + // Block 0x45, offset 0x16f + {value: 0x0000, lo: 0x01}, + {value: 0x8104, lo: 0xbf, hi: 0xbf}, + // Block 0x46, offset 0x171 + {value: 0x0000, lo: 0x01}, + {value: 0x8132, lo: 0xa0, hi: 0xbf}, + // Block 0x47, offset 0x173 + {value: 0x0000, lo: 0x05}, + {value: 0x812c, lo: 0xaa, hi: 0xaa}, + {value: 0x8131, lo: 0xab, hi: 0xab}, + {value: 0x8133, lo: 0xac, hi: 0xac}, + {value: 0x812e, lo: 0xad, hi: 0xad}, + {value: 0x812f, lo: 0xae, hi: 0xaf}, + // Block 0x48, offset 0x179 + {value: 0x0000, lo: 0x03}, + {value: 0x4a9f, lo: 0xb3, hi: 0xb3}, + {value: 0x4a9f, lo: 0xb5, hi: 0xb6}, + {value: 0x4a9f, lo: 0xba, hi: 0xbf}, + // Block 0x49, offset 0x17d + {value: 0x0000, lo: 0x01}, + {value: 0x4a9f, lo: 0x8f, hi: 0xa3}, + // Block 0x4a, offset 0x17f + {value: 0x0000, lo: 0x01}, + {value: 0x8100, lo: 0xae, hi: 0xbe}, + // Block 0x4b, offset 0x181 + {value: 0x0000, lo: 0x07}, + {value: 0x8100, lo: 0x84, hi: 0x84}, + {value: 0x8100, lo: 0x87, hi: 0x87}, + {value: 0x8100, lo: 0x90, hi: 0x90}, + {value: 0x8100, lo: 0x9e, hi: 0x9e}, + {value: 0x8100, lo: 0xa1, hi: 0xa1}, + {value: 0x8100, lo: 0xb2, hi: 0xb2}, + {value: 0x8100, lo: 0xbb, hi: 0xbb}, + // Block 0x4c, offset 0x189 + {value: 0x0000, lo: 0x03}, + {value: 0x8100, lo: 0x80, hi: 0x80}, + {value: 0x8100, lo: 0x8b, hi: 0x8b}, + {value: 0x8100, lo: 0x8e, hi: 0x8e}, + // Block 0x4d, offset 0x18d + {value: 0x0000, lo: 0x02}, + {value: 0x8132, lo: 0xaf, hi: 0xaf}, + {value: 0x8132, lo: 0xb4, hi: 0xbd}, + // Block 0x4e, offset 0x190 + {value: 0x0000, lo: 0x01}, + {value: 0x8132, lo: 0x9e, hi: 0x9f}, + // Block 0x4f, offset 0x192 + {value: 0x0000, lo: 0x01}, + {value: 0x8132, lo: 0xb0, hi: 0xb1}, + // Block 0x50, offset 0x194 + {value: 0x0000, lo: 0x01}, + {value: 0x8104, lo: 0x86, hi: 0x86}, + // Block 0x51, offset 0x196 + {value: 0x0000, lo: 0x02}, + {value: 0x8104, lo: 0x84, hi: 0x84}, + {value: 0x8132, lo: 0xa0, hi: 0xb1}, + // Block 0x52, offset 0x199 + {value: 0x0000, lo: 0x01}, + {value: 0x812d, lo: 0xab, hi: 0xad}, + // Block 0x53, offset 0x19b + {value: 0x0000, lo: 0x01}, + {value: 0x8104, lo: 0x93, hi: 0x93}, + // Block 0x54, offset 0x19d + {value: 0x0000, lo: 0x01}, + {value: 0x8102, lo: 0xb3, hi: 0xb3}, + // Block 0x55, offset 0x19f + {value: 0x0000, lo: 0x01}, + {value: 0x8104, lo: 0x80, hi: 0x80}, + // Block 0x56, offset 0x1a1 + {value: 0x0000, lo: 0x05}, + {value: 0x8132, lo: 0xb0, hi: 0xb0}, + {value: 0x8132, lo: 0xb2, hi: 0xb3}, + {value: 0x812d, lo: 0xb4, hi: 0xb4}, + {value: 0x8132, lo: 0xb7, hi: 0xb8}, + {value: 0x8132, lo: 0xbe, hi: 0xbf}, + // Block 0x57, offset 0x1a7 + {value: 0x0000, lo: 0x02}, + {value: 0x8132, lo: 0x81, hi: 0x81}, + {value: 0x8104, lo: 0xb6, hi: 0xb6}, + // Block 0x58, offset 0x1aa + {value: 0x0000, lo: 0x01}, + {value: 0x8104, lo: 0xad, hi: 0xad}, + // Block 0x59, offset 0x1ac + {value: 0x0000, lo: 0x06}, + {value: 0xe500, lo: 0x80, hi: 0x80}, + {value: 0xc600, lo: 0x81, hi: 0x9b}, + {value: 0xe500, lo: 0x9c, hi: 0x9c}, + {value: 0xc600, lo: 0x9d, hi: 0xb7}, + {value: 0xe500, lo: 0xb8, hi: 0xb8}, + {value: 0xc600, lo: 0xb9, hi: 0xbf}, + // Block 0x5a, offset 0x1b3 + {value: 0x0000, lo: 0x05}, + {value: 0xc600, lo: 0x80, hi: 0x93}, + {value: 0xe500, lo: 0x94, hi: 0x94}, + {value: 0xc600, lo: 0x95, hi: 0xaf}, + {value: 0xe500, lo: 0xb0, hi: 0xb0}, + {value: 0xc600, lo: 0xb1, hi: 0xbf}, + // Block 0x5b, offset 0x1b9 + {value: 0x0000, lo: 0x05}, + {value: 0xc600, lo: 0x80, hi: 0x8b}, + {value: 0xe500, lo: 0x8c, hi: 0x8c}, + {value: 0xc600, lo: 0x8d, hi: 0xa7}, + {value: 0xe500, lo: 0xa8, hi: 0xa8}, + {value: 0xc600, lo: 0xa9, hi: 0xbf}, + // Block 0x5c, offset 0x1bf + {value: 0x0000, lo: 0x07}, + {value: 0xc600, lo: 0x80, hi: 0x83}, + {value: 0xe500, lo: 0x84, hi: 0x84}, + {value: 0xc600, lo: 0x85, hi: 0x9f}, + {value: 0xe500, lo: 0xa0, hi: 0xa0}, + {value: 0xc600, lo: 0xa1, hi: 0xbb}, + {value: 0xe500, lo: 0xbc, hi: 0xbc}, + {value: 0xc600, lo: 0xbd, hi: 0xbf}, + // Block 0x5d, offset 0x1c7 + {value: 0x0000, lo: 0x05}, + {value: 0xc600, lo: 0x80, hi: 0x97}, + {value: 0xe500, lo: 0x98, hi: 0x98}, + {value: 0xc600, lo: 0x99, hi: 0xb3}, + {value: 0xe500, lo: 0xb4, hi: 0xb4}, + {value: 0xc600, lo: 0xb5, hi: 0xbf}, + // Block 0x5e, offset 0x1cd + {value: 0x0000, lo: 0x05}, + {value: 0xc600, lo: 0x80, hi: 0x8f}, + {value: 0xe500, lo: 0x90, hi: 0x90}, + {value: 0xc600, lo: 0x91, hi: 0xab}, + {value: 0xe500, lo: 0xac, hi: 0xac}, + {value: 0xc600, lo: 0xad, hi: 0xbf}, + // Block 0x5f, offset 0x1d3 + {value: 0x0000, lo: 0x05}, + {value: 0xc600, lo: 0x80, hi: 0x87}, + {value: 0xe500, lo: 0x88, hi: 0x88}, + {value: 0xc600, lo: 0x89, hi: 0xa3}, + {value: 0xe500, lo: 0xa4, hi: 0xa4}, + {value: 0xc600, lo: 0xa5, hi: 0xbf}, + // Block 0x60, offset 0x1d9 + {value: 0x0000, lo: 0x03}, + {value: 0xc600, lo: 0x80, hi: 0x87}, + {value: 0xe500, lo: 0x88, hi: 0x88}, + {value: 0xc600, lo: 0x89, hi: 0xa3}, + // Block 0x61, offset 0x1dd + {value: 0x0006, lo: 0x0d}, + {value: 0x4390, lo: 0x9d, hi: 0x9d}, + {value: 0x8115, lo: 0x9e, hi: 0x9e}, + {value: 0x4402, lo: 0x9f, hi: 0x9f}, + {value: 0x43f0, lo: 0xaa, hi: 0xab}, + {value: 0x44f4, lo: 0xac, hi: 0xac}, + {value: 0x44fc, lo: 0xad, hi: 0xad}, + {value: 0x4348, lo: 0xae, hi: 0xb1}, + {value: 0x4366, lo: 0xb2, hi: 0xb4}, + {value: 0x437e, lo: 0xb5, hi: 0xb6}, + {value: 0x438a, lo: 0xb8, hi: 0xb8}, + {value: 0x4396, lo: 0xb9, hi: 0xbb}, + {value: 0x43ae, lo: 0xbc, hi: 0xbc}, + {value: 0x43b4, lo: 0xbe, hi: 0xbe}, + // Block 0x62, offset 0x1eb + {value: 0x0006, lo: 0x08}, + {value: 0x43ba, lo: 0x80, hi: 0x81}, + {value: 0x43c6, lo: 0x83, hi: 0x84}, + {value: 0x43d8, lo: 0x86, hi: 0x89}, + {value: 0x43fc, lo: 0x8a, hi: 0x8a}, + {value: 0x4378, lo: 0x8b, hi: 0x8b}, + {value: 0x4360, lo: 0x8c, hi: 0x8c}, + {value: 0x43a8, lo: 0x8d, hi: 0x8d}, + {value: 0x43d2, lo: 0x8e, hi: 0x8e}, + // Block 0x63, offset 0x1f4 + {value: 0x0000, lo: 0x02}, + {value: 0x8100, lo: 0xa4, hi: 0xa5}, + {value: 0x8100, lo: 0xb0, hi: 0xb1}, + // Block 0x64, offset 0x1f7 + {value: 0x0000, lo: 0x02}, + {value: 0x8100, lo: 0x9b, hi: 0x9d}, + {value: 0x8200, lo: 0x9e, hi: 0xa3}, + // Block 0x65, offset 0x1fa + {value: 0x0000, lo: 0x01}, + {value: 0x8100, lo: 0x90, hi: 0x90}, + // Block 0x66, offset 0x1fc + {value: 0x0000, lo: 0x02}, + {value: 0x8100, lo: 0x99, hi: 0x99}, + {value: 0x8200, lo: 0xb2, hi: 0xb4}, + // Block 0x67, offset 0x1ff + {value: 0x0000, lo: 0x01}, + {value: 0x8100, lo: 0xbc, hi: 0xbd}, + // Block 0x68, offset 0x201 + {value: 0x0000, lo: 0x03}, + {value: 0x8132, lo: 0xa0, hi: 0xa6}, + {value: 0x812d, lo: 0xa7, hi: 0xad}, + {value: 0x8132, lo: 0xae, hi: 0xaf}, + // Block 0x69, offset 0x205 + {value: 0x0000, lo: 0x04}, + {value: 0x8100, lo: 0x89, hi: 0x8c}, + {value: 0x8100, lo: 0xb0, hi: 0xb2}, + {value: 0x8100, lo: 0xb4, hi: 0xb4}, + {value: 0x8100, lo: 0xb6, hi: 0xbf}, + // Block 0x6a, offset 0x20a + {value: 0x0000, lo: 0x01}, + {value: 0x8100, lo: 0x81, hi: 0x8c}, + // Block 0x6b, offset 0x20c + {value: 0x0000, lo: 0x01}, + {value: 0x8100, lo: 0xb5, hi: 0xba}, + // Block 0x6c, offset 0x20e + {value: 0x0000, lo: 0x04}, + {value: 0x4a9f, lo: 0x9e, hi: 0x9f}, + {value: 0x4a9f, lo: 0xa3, hi: 0xa3}, + {value: 0x4a9f, lo: 0xa5, hi: 0xa6}, + {value: 0x4a9f, lo: 0xaa, hi: 0xaf}, + // Block 0x6d, offset 0x213 + {value: 0x0000, lo: 0x05}, + {value: 0x4a9f, lo: 0x82, hi: 0x87}, + {value: 0x4a9f, lo: 0x8a, hi: 0x8f}, + {value: 0x4a9f, lo: 0x92, hi: 0x97}, + {value: 0x4a9f, lo: 0x9a, hi: 0x9c}, + {value: 0x8100, lo: 0xa3, hi: 0xa3}, + // Block 0x6e, offset 0x219 + {value: 0x0000, lo: 0x01}, + {value: 0x812d, lo: 0xbd, hi: 0xbd}, + // Block 0x6f, offset 0x21b + {value: 0x0000, lo: 0x01}, + {value: 0x812d, lo: 0xa0, hi: 0xa0}, + // Block 0x70, offset 0x21d + {value: 0x0000, lo: 0x01}, + {value: 0x8132, lo: 0xb6, hi: 0xba}, + // Block 0x71, offset 0x21f + {value: 0x002c, lo: 0x05}, + {value: 0x812d, lo: 0x8d, hi: 0x8d}, + {value: 0x8132, lo: 0x8f, hi: 0x8f}, + {value: 0x8132, lo: 0xb8, hi: 0xb8}, + {value: 0x8101, lo: 0xb9, hi: 0xba}, + {value: 0x8104, lo: 0xbf, hi: 0xbf}, + // Block 0x72, offset 0x225 + {value: 0x0000, lo: 0x02}, + {value: 0x8132, lo: 0xa5, hi: 0xa5}, + {value: 0x812d, lo: 0xa6, hi: 0xa6}, + // Block 0x73, offset 0x228 + {value: 0x0000, lo: 0x01}, + {value: 0x8132, lo: 0xa4, hi: 0xa7}, + // Block 0x74, offset 0x22a + {value: 0x0000, lo: 0x05}, + {value: 0x812d, lo: 0x86, hi: 0x87}, + {value: 0x8132, lo: 0x88, hi: 0x8a}, + {value: 0x812d, lo: 0x8b, hi: 0x8b}, + {value: 0x8132, lo: 0x8c, hi: 0x8c}, + {value: 0x812d, lo: 0x8d, hi: 0x90}, + // Block 0x75, offset 0x230 + {value: 0x0000, lo: 0x02}, + {value: 0x8104, lo: 0x86, hi: 0x86}, + {value: 0x8104, lo: 0xbf, hi: 0xbf}, + // Block 0x76, offset 0x233 + {value: 0x17fe, lo: 0x07}, + {value: 0xa000, lo: 0x99, hi: 0x99}, + {value: 0x4238, lo: 0x9a, hi: 0x9a}, + {value: 0xa000, lo: 0x9b, hi: 0x9b}, + {value: 0x4242, lo: 0x9c, hi: 0x9c}, + {value: 0xa000, lo: 0xa5, hi: 0xa5}, + {value: 0x424c, lo: 0xab, hi: 0xab}, + {value: 0x8104, lo: 0xb9, hi: 0xba}, + // Block 0x77, offset 0x23b + {value: 0x0000, lo: 0x06}, + {value: 0x8132, lo: 0x80, hi: 0x82}, + {value: 0x9900, lo: 0xa7, hi: 0xa7}, + {value: 0x2d7e, lo: 0xae, hi: 0xae}, + {value: 0x2d88, lo: 0xaf, hi: 0xaf}, + {value: 0xa000, lo: 0xb1, hi: 0xb2}, + {value: 0x8104, lo: 0xb3, hi: 0xb4}, + // Block 0x78, offset 0x242 + {value: 0x0000, lo: 0x02}, + {value: 0x8104, lo: 0x80, hi: 0x80}, + {value: 0x8102, lo: 0x8a, hi: 0x8a}, + // Block 0x79, offset 0x245 + {value: 0x0000, lo: 0x02}, + {value: 0x8104, lo: 0xb5, hi: 0xb5}, + {value: 0x8102, lo: 0xb6, hi: 0xb6}, + // Block 0x7a, offset 0x248 + {value: 0x0002, lo: 0x01}, + {value: 0x8102, lo: 0xa9, hi: 0xaa}, + // Block 0x7b, offset 0x24a + {value: 0x0000, lo: 0x02}, + {value: 0x8102, lo: 0xbb, hi: 0xbc}, + {value: 0x9900, lo: 0xbe, hi: 0xbe}, + // Block 0x7c, offset 0x24d + {value: 0x0000, lo: 0x07}, + {value: 0xa000, lo: 0x87, hi: 0x87}, + {value: 0x2d92, lo: 0x8b, hi: 0x8b}, + {value: 0x2d9c, lo: 0x8c, hi: 0x8c}, + {value: 0x8104, lo: 0x8d, hi: 0x8d}, + {value: 0x9900, lo: 0x97, hi: 0x97}, + {value: 0x8132, lo: 0xa6, hi: 0xac}, + {value: 0x8132, lo: 0xb0, hi: 0xb4}, + // Block 0x7d, offset 0x255 + {value: 0x0000, lo: 0x03}, + {value: 0x8104, lo: 0x82, hi: 0x82}, + {value: 0x8102, lo: 0x86, hi: 0x86}, + {value: 0x8132, lo: 0x9e, hi: 0x9e}, + // Block 0x7e, offset 0x259 + {value: 0x6b5a, lo: 0x06}, + {value: 0x9900, lo: 0xb0, hi: 0xb0}, + {value: 0xa000, lo: 0xb9, hi: 0xb9}, + {value: 0x9900, lo: 0xba, hi: 0xba}, + {value: 0x2db0, lo: 0xbb, hi: 0xbb}, + {value: 0x2da6, lo: 0xbc, hi: 0xbd}, + {value: 0x2dba, lo: 0xbe, hi: 0xbe}, + // Block 0x7f, offset 0x260 + {value: 0x0000, lo: 0x02}, + {value: 0x8104, lo: 0x82, hi: 0x82}, + {value: 0x8102, lo: 0x83, hi: 0x83}, + // Block 0x80, offset 0x263 + {value: 0x0000, lo: 0x05}, + {value: 0x9900, lo: 0xaf, hi: 0xaf}, + {value: 0xa000, lo: 0xb8, hi: 0xb9}, + {value: 0x2dc4, lo: 0xba, hi: 0xba}, + {value: 0x2dce, lo: 0xbb, hi: 0xbb}, + {value: 0x8104, lo: 0xbf, hi: 0xbf}, + // Block 0x81, offset 0x269 + {value: 0x0000, lo: 0x01}, + {value: 0x8102, lo: 0x80, hi: 0x80}, + // Block 0x82, offset 0x26b + {value: 0x0000, lo: 0x02}, + {value: 0x8104, lo: 0xb6, hi: 0xb6}, + {value: 0x8102, lo: 0xb7, hi: 0xb7}, + // Block 0x83, offset 0x26e + {value: 0x0000, lo: 0x01}, + {value: 0x8104, lo: 0xab, hi: 0xab}, + // Block 0x84, offset 0x270 + {value: 0x0000, lo: 0x02}, + {value: 0x8104, lo: 0xb9, hi: 0xb9}, + {value: 0x8102, lo: 0xba, hi: 0xba}, + // Block 0x85, offset 0x273 + {value: 0x0000, lo: 0x01}, + {value: 0x8104, lo: 0xb4, hi: 0xb4}, + // Block 0x86, offset 0x275 + {value: 0x0000, lo: 0x01}, + {value: 0x8104, lo: 0x87, hi: 0x87}, + // Block 0x87, offset 0x277 + {value: 0x0000, lo: 0x01}, + {value: 0x8104, lo: 0x99, hi: 0x99}, + // Block 0x88, offset 0x279 + {value: 0x0000, lo: 0x02}, + {value: 0x8102, lo: 0x82, hi: 0x82}, + {value: 0x8104, lo: 0x84, hi: 0x85}, + // Block 0x89, offset 0x27c + {value: 0x0000, lo: 0x01}, + {value: 0x8104, lo: 0x97, hi: 0x97}, + // Block 0x8a, offset 0x27e + {value: 0x0000, lo: 0x01}, + {value: 0x8101, lo: 0xb0, hi: 0xb4}, + // Block 0x8b, offset 0x280 + {value: 0x0000, lo: 0x01}, + {value: 0x8132, lo: 0xb0, hi: 0xb6}, + // Block 0x8c, offset 0x282 + {value: 0x0000, lo: 0x01}, + {value: 0x8101, lo: 0x9e, hi: 0x9e}, + // Block 0x8d, offset 0x284 + {value: 0x0000, lo: 0x0c}, + {value: 0x45cc, lo: 0x9e, hi: 0x9e}, + {value: 0x45d6, lo: 0x9f, hi: 0x9f}, + {value: 0x460a, lo: 0xa0, hi: 0xa0}, + {value: 0x4618, lo: 0xa1, hi: 0xa1}, + {value: 0x4626, lo: 0xa2, hi: 0xa2}, + {value: 0x4634, lo: 0xa3, hi: 0xa3}, + {value: 0x4642, lo: 0xa4, hi: 0xa4}, + {value: 0x812b, lo: 0xa5, hi: 0xa6}, + {value: 0x8101, lo: 0xa7, hi: 0xa9}, + {value: 0x8130, lo: 0xad, hi: 0xad}, + {value: 0x812b, lo: 0xae, hi: 0xb2}, + {value: 0x812d, lo: 0xbb, hi: 0xbf}, + // Block 0x8e, offset 0x291 + {value: 0x0000, lo: 0x09}, + {value: 0x812d, lo: 0x80, hi: 0x82}, + {value: 0x8132, lo: 0x85, hi: 0x89}, + {value: 0x812d, lo: 0x8a, hi: 0x8b}, + {value: 0x8132, lo: 0xaa, hi: 0xad}, + {value: 0x45e0, lo: 0xbb, hi: 0xbb}, + {value: 0x45ea, lo: 0xbc, hi: 0xbc}, + {value: 0x4650, lo: 0xbd, hi: 0xbd}, + {value: 0x466c, lo: 0xbe, hi: 0xbe}, + {value: 0x465e, lo: 0xbf, hi: 0xbf}, + // Block 0x8f, offset 0x29b + {value: 0x0000, lo: 0x01}, + {value: 0x467a, lo: 0x80, hi: 0x80}, + // Block 0x90, offset 0x29d + {value: 0x0000, lo: 0x01}, + {value: 0x8132, lo: 0x82, hi: 0x84}, + // Block 0x91, offset 0x29f + {value: 0x0000, lo: 0x05}, + {value: 0x8132, lo: 0x80, hi: 0x86}, + {value: 0x8132, lo: 0x88, hi: 0x98}, + {value: 0x8132, lo: 0x9b, hi: 0xa1}, + {value: 0x8132, lo: 0xa3, hi: 0xa4}, + {value: 0x8132, lo: 0xa6, hi: 0xaa}, + // Block 0x92, offset 0x2a5 + {value: 0x0000, lo: 0x01}, + {value: 0x812d, lo: 0x90, hi: 0x96}, + // Block 0x93, offset 0x2a7 + {value: 0x0000, lo: 0x02}, + {value: 0x8132, lo: 0x84, hi: 0x89}, + {value: 0x8102, lo: 0x8a, hi: 0x8a}, + // Block 0x94, offset 0x2aa + {value: 0x0000, lo: 0x01}, + {value: 0x8100, lo: 0x93, hi: 0x93}, +} + +// lookup returns the trie value for the first UTF-8 encoding in s and +// the width in bytes of this encoding. The size will be 0 if s does not +// hold enough bytes to complete the encoding. len(s) must be greater than 0. +func (t *nfkcTrie) lookup(s []byte) (v uint16, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return nfkcValues[c0], 1 + case c0 < 0xC2: + return 0, 1 // Illegal UTF-8: not a starter, not ASCII. + case c0 < 0xE0: // 2-byte UTF-8 + if len(s) < 2 { + return 0, 0 + } + i := nfkcIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c1), 2 + case c0 < 0xF0: // 3-byte UTF-8 + if len(s) < 3 { + return 0, 0 + } + i := nfkcIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = nfkcIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c2), 3 + case c0 < 0xF8: // 4-byte UTF-8 + if len(s) < 4 { + return 0, 0 + } + i := nfkcIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = nfkcIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + o = uint32(i)<<6 + uint32(c2) + i = nfkcIndex[o] + c3 := s[3] + if c3 < 0x80 || 0xC0 <= c3 { + return 0, 3 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c3), 4 + } + // Illegal rune + return 0, 1 +} + +// lookupUnsafe returns the trie value for the first UTF-8 encoding in s. +// s must start with a full and valid UTF-8 encoded rune. +func (t *nfkcTrie) lookupUnsafe(s []byte) uint16 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return nfkcValues[c0] + } + i := nfkcIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = nfkcIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = nfkcIndex[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} + +// lookupString returns the trie value for the first UTF-8 encoding in s and +// the width in bytes of this encoding. The size will be 0 if s does not +// hold enough bytes to complete the encoding. len(s) must be greater than 0. +func (t *nfkcTrie) lookupString(s string) (v uint16, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return nfkcValues[c0], 1 + case c0 < 0xC2: + return 0, 1 // Illegal UTF-8: not a starter, not ASCII. + case c0 < 0xE0: // 2-byte UTF-8 + if len(s) < 2 { + return 0, 0 + } + i := nfkcIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c1), 2 + case c0 < 0xF0: // 3-byte UTF-8 + if len(s) < 3 { + return 0, 0 + } + i := nfkcIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = nfkcIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c2), 3 + case c0 < 0xF8: // 4-byte UTF-8 + if len(s) < 4 { + return 0, 0 + } + i := nfkcIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = nfkcIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + o = uint32(i)<<6 + uint32(c2) + i = nfkcIndex[o] + c3 := s[3] + if c3 < 0x80 || 0xC0 <= c3 { + return 0, 3 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c3), 4 + } + // Illegal rune + return 0, 1 +} + +// lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s. +// s must start with a full and valid UTF-8 encoded rune. +func (t *nfkcTrie) lookupStringUnsafe(s string) uint16 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return nfkcValues[c0] + } + i := nfkcIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = nfkcIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = nfkcIndex[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} + +// nfkcTrie. Total size: 17248 bytes (16.84 KiB). Checksum: 4fb368372b6b1b27. +type nfkcTrie struct{} + +func newNfkcTrie(i int) *nfkcTrie { + return &nfkcTrie{} +} + +// lookupValue determines the type of block n and looks up the value for b. +func (t *nfkcTrie) lookupValue(n uint32, b byte) uint16 { + switch { + case n < 92: + return uint16(nfkcValues[n<<6+uint32(b)]) + default: + n -= 92 + return uint16(nfkcSparse.lookup(n, b)) + } +} + +// nfkcValues: 94 blocks, 6016 entries, 12032 bytes +// The third block is the zero block. +var nfkcValues = [6016]uint16{ + // Block 0x0, offset 0x0 + 0x3c: 0xa000, 0x3d: 0xa000, 0x3e: 0xa000, + // Block 0x1, offset 0x40 + 0x41: 0xa000, 0x42: 0xa000, 0x43: 0xa000, 0x44: 0xa000, 0x45: 0xa000, + 0x46: 0xa000, 0x47: 0xa000, 0x48: 0xa000, 0x49: 0xa000, 0x4a: 0xa000, 0x4b: 0xa000, + 0x4c: 0xa000, 0x4d: 0xa000, 0x4e: 0xa000, 0x4f: 0xa000, 0x50: 0xa000, + 0x52: 0xa000, 0x53: 0xa000, 0x54: 0xa000, 0x55: 0xa000, 0x56: 0xa000, 0x57: 0xa000, + 0x58: 0xa000, 0x59: 0xa000, 0x5a: 0xa000, + 0x61: 0xa000, 0x62: 0xa000, 0x63: 0xa000, + 0x64: 0xa000, 0x65: 0xa000, 0x66: 0xa000, 0x67: 0xa000, 0x68: 0xa000, 0x69: 0xa000, + 0x6a: 0xa000, 0x6b: 0xa000, 0x6c: 0xa000, 0x6d: 0xa000, 0x6e: 0xa000, 0x6f: 0xa000, + 0x70: 0xa000, 0x72: 0xa000, 0x73: 0xa000, 0x74: 0xa000, 0x75: 0xa000, + 0x76: 0xa000, 0x77: 0xa000, 0x78: 0xa000, 0x79: 0xa000, 0x7a: 0xa000, + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc0: 0x2f6f, 0xc1: 0x2f74, 0xc2: 0x4688, 0xc3: 0x2f79, 0xc4: 0x4697, 0xc5: 0x469c, + 0xc6: 0xa000, 0xc7: 0x46a6, 0xc8: 0x2fe2, 0xc9: 0x2fe7, 0xca: 0x46ab, 0xcb: 0x2ffb, + 0xcc: 0x306e, 0xcd: 0x3073, 0xce: 0x3078, 0xcf: 0x46bf, 0xd1: 0x3104, + 0xd2: 0x3127, 0xd3: 0x312c, 0xd4: 0x46c9, 0xd5: 0x46ce, 0xd6: 0x46dd, + 0xd8: 0xa000, 0xd9: 0x31b3, 0xda: 0x31b8, 0xdb: 0x31bd, 0xdc: 0x470f, 0xdd: 0x3235, + 0xe0: 0x327b, 0xe1: 0x3280, 0xe2: 0x4719, 0xe3: 0x3285, + 0xe4: 0x4728, 0xe5: 0x472d, 0xe6: 0xa000, 0xe7: 0x4737, 0xe8: 0x32ee, 0xe9: 0x32f3, + 0xea: 0x473c, 0xeb: 0x3307, 0xec: 0x337f, 0xed: 0x3384, 0xee: 0x3389, 0xef: 0x4750, + 0xf1: 0x3415, 0xf2: 0x3438, 0xf3: 0x343d, 0xf4: 0x475a, 0xf5: 0x475f, + 0xf6: 0x476e, 0xf8: 0xa000, 0xf9: 0x34c9, 0xfa: 0x34ce, 0xfb: 0x34d3, + 0xfc: 0x47a0, 0xfd: 0x3550, 0xff: 0x3569, + // Block 0x4, offset 0x100 + 0x100: 0x2f7e, 0x101: 0x328a, 0x102: 0x468d, 0x103: 0x471e, 0x104: 0x2f9c, 0x105: 0x32a8, + 0x106: 0x2fb0, 0x107: 0x32bc, 0x108: 0x2fb5, 0x109: 0x32c1, 0x10a: 0x2fba, 0x10b: 0x32c6, + 0x10c: 0x2fbf, 0x10d: 0x32cb, 0x10e: 0x2fc9, 0x10f: 0x32d5, + 0x112: 0x46b0, 0x113: 0x4741, 0x114: 0x2ff1, 0x115: 0x32fd, 0x116: 0x2ff6, 0x117: 0x3302, + 0x118: 0x3014, 0x119: 0x3320, 0x11a: 0x3005, 0x11b: 0x3311, 0x11c: 0x302d, 0x11d: 0x3339, + 0x11e: 0x3037, 0x11f: 0x3343, 0x120: 0x303c, 0x121: 0x3348, 0x122: 0x3046, 0x123: 0x3352, + 0x124: 0x304b, 0x125: 0x3357, 0x128: 0x307d, 0x129: 0x338e, + 0x12a: 0x3082, 0x12b: 0x3393, 0x12c: 0x3087, 0x12d: 0x3398, 0x12e: 0x30aa, 0x12f: 0x33b6, + 0x130: 0x308c, 0x132: 0x195d, 0x133: 0x19e7, 0x134: 0x30b4, 0x135: 0x33c0, + 0x136: 0x30c8, 0x137: 0x33d9, 0x139: 0x30d2, 0x13a: 0x33e3, 0x13b: 0x30dc, + 0x13c: 0x33ed, 0x13d: 0x30d7, 0x13e: 0x33e8, 0x13f: 0x1bac, + // Block 0x5, offset 0x140 + 0x140: 0x1c34, 0x143: 0x30ff, 0x144: 0x3410, 0x145: 0x3118, + 0x146: 0x3429, 0x147: 0x310e, 0x148: 0x341f, 0x149: 0x1c5c, + 0x14c: 0x46d3, 0x14d: 0x4764, 0x14e: 0x3131, 0x14f: 0x3442, 0x150: 0x313b, 0x151: 0x344c, + 0x154: 0x3159, 0x155: 0x346a, 0x156: 0x3172, 0x157: 0x3483, + 0x158: 0x3163, 0x159: 0x3474, 0x15a: 0x46f6, 0x15b: 0x4787, 0x15c: 0x317c, 0x15d: 0x348d, + 0x15e: 0x318b, 0x15f: 0x349c, 0x160: 0x46fb, 0x161: 0x478c, 0x162: 0x31a4, 0x163: 0x34ba, + 0x164: 0x3195, 0x165: 0x34ab, 0x168: 0x4705, 0x169: 0x4796, + 0x16a: 0x470a, 0x16b: 0x479b, 0x16c: 0x31c2, 0x16d: 0x34d8, 0x16e: 0x31cc, 0x16f: 0x34e2, + 0x170: 0x31d1, 0x171: 0x34e7, 0x172: 0x31ef, 0x173: 0x3505, 0x174: 0x3212, 0x175: 0x3528, + 0x176: 0x323a, 0x177: 0x3555, 0x178: 0x324e, 0x179: 0x325d, 0x17a: 0x357d, 0x17b: 0x3267, + 0x17c: 0x3587, 0x17d: 0x326c, 0x17e: 0x358c, 0x17f: 0x00a7, + // Block 0x6, offset 0x180 + 0x184: 0x2dee, 0x185: 0x2df4, + 0x186: 0x2dfa, 0x187: 0x1972, 0x188: 0x1975, 0x189: 0x1a08, 0x18a: 0x1987, 0x18b: 0x198a, + 0x18c: 0x1a3e, 0x18d: 0x2f88, 0x18e: 0x3294, 0x18f: 0x3096, 0x190: 0x33a2, 0x191: 0x3140, + 0x192: 0x3451, 0x193: 0x31d6, 0x194: 0x34ec, 0x195: 0x39cf, 0x196: 0x3b5e, 0x197: 0x39c8, + 0x198: 0x3b57, 0x199: 0x39d6, 0x19a: 0x3b65, 0x19b: 0x39c1, 0x19c: 0x3b50, + 0x19e: 0x38b0, 0x19f: 0x3a3f, 0x1a0: 0x38a9, 0x1a1: 0x3a38, 0x1a2: 0x35b3, 0x1a3: 0x35c5, + 0x1a6: 0x3041, 0x1a7: 0x334d, 0x1a8: 0x30be, 0x1a9: 0x33cf, + 0x1aa: 0x46ec, 0x1ab: 0x477d, 0x1ac: 0x3990, 0x1ad: 0x3b1f, 0x1ae: 0x35d7, 0x1af: 0x35dd, + 0x1b0: 0x33c5, 0x1b1: 0x1942, 0x1b2: 0x1945, 0x1b3: 0x19cf, 0x1b4: 0x3028, 0x1b5: 0x3334, + 0x1b8: 0x30fa, 0x1b9: 0x340b, 0x1ba: 0x38b7, 0x1bb: 0x3a46, + 0x1bc: 0x35ad, 0x1bd: 0x35bf, 0x1be: 0x35b9, 0x1bf: 0x35cb, + // Block 0x7, offset 0x1c0 + 0x1c0: 0x2f8d, 0x1c1: 0x3299, 0x1c2: 0x2f92, 0x1c3: 0x329e, 0x1c4: 0x300a, 0x1c5: 0x3316, + 0x1c6: 0x300f, 0x1c7: 0x331b, 0x1c8: 0x309b, 0x1c9: 0x33a7, 0x1ca: 0x30a0, 0x1cb: 0x33ac, + 0x1cc: 0x3145, 0x1cd: 0x3456, 0x1ce: 0x314a, 0x1cf: 0x345b, 0x1d0: 0x3168, 0x1d1: 0x3479, + 0x1d2: 0x316d, 0x1d3: 0x347e, 0x1d4: 0x31db, 0x1d5: 0x34f1, 0x1d6: 0x31e0, 0x1d7: 0x34f6, + 0x1d8: 0x3186, 0x1d9: 0x3497, 0x1da: 0x319f, 0x1db: 0x34b5, + 0x1de: 0x305a, 0x1df: 0x3366, + 0x1e6: 0x4692, 0x1e7: 0x4723, 0x1e8: 0x46ba, 0x1e9: 0x474b, + 0x1ea: 0x395f, 0x1eb: 0x3aee, 0x1ec: 0x393c, 0x1ed: 0x3acb, 0x1ee: 0x46d8, 0x1ef: 0x4769, + 0x1f0: 0x3958, 0x1f1: 0x3ae7, 0x1f2: 0x3244, 0x1f3: 0x355f, + // Block 0x8, offset 0x200 + 0x200: 0x9932, 0x201: 0x9932, 0x202: 0x9932, 0x203: 0x9932, 0x204: 0x9932, 0x205: 0x8132, + 0x206: 0x9932, 0x207: 0x9932, 0x208: 0x9932, 0x209: 0x9932, 0x20a: 0x9932, 0x20b: 0x9932, + 0x20c: 0x9932, 0x20d: 0x8132, 0x20e: 0x8132, 0x20f: 0x9932, 0x210: 0x8132, 0x211: 0x9932, + 0x212: 0x8132, 0x213: 0x9932, 0x214: 0x9932, 0x215: 0x8133, 0x216: 0x812d, 0x217: 0x812d, + 0x218: 0x812d, 0x219: 0x812d, 0x21a: 0x8133, 0x21b: 0x992b, 0x21c: 0x812d, 0x21d: 0x812d, + 0x21e: 0x812d, 0x21f: 0x812d, 0x220: 0x812d, 0x221: 0x8129, 0x222: 0x8129, 0x223: 0x992d, + 0x224: 0x992d, 0x225: 0x992d, 0x226: 0x992d, 0x227: 0x9929, 0x228: 0x9929, 0x229: 0x812d, + 0x22a: 0x812d, 0x22b: 0x812d, 0x22c: 0x812d, 0x22d: 0x992d, 0x22e: 0x992d, 0x22f: 0x812d, + 0x230: 0x992d, 0x231: 0x992d, 0x232: 0x812d, 0x233: 0x812d, 0x234: 0x8101, 0x235: 0x8101, + 0x236: 0x8101, 0x237: 0x8101, 0x238: 0x9901, 0x239: 0x812d, 0x23a: 0x812d, 0x23b: 0x812d, + 0x23c: 0x812d, 0x23d: 0x8132, 0x23e: 0x8132, 0x23f: 0x8132, + // Block 0x9, offset 0x240 + 0x240: 0x49ae, 0x241: 0x49b3, 0x242: 0x9932, 0x243: 0x49b8, 0x244: 0x4a71, 0x245: 0x9936, + 0x246: 0x8132, 0x247: 0x812d, 0x248: 0x812d, 0x249: 0x812d, 0x24a: 0x8132, 0x24b: 0x8132, + 0x24c: 0x8132, 0x24d: 0x812d, 0x24e: 0x812d, 0x250: 0x8132, 0x251: 0x8132, + 0x252: 0x8132, 0x253: 0x812d, 0x254: 0x812d, 0x255: 0x812d, 0x256: 0x812d, 0x257: 0x8132, + 0x258: 0x8133, 0x259: 0x812d, 0x25a: 0x812d, 0x25b: 0x8132, 0x25c: 0x8134, 0x25d: 0x8135, + 0x25e: 0x8135, 0x25f: 0x8134, 0x260: 0x8135, 0x261: 0x8135, 0x262: 0x8134, 0x263: 0x8132, + 0x264: 0x8132, 0x265: 0x8132, 0x266: 0x8132, 0x267: 0x8132, 0x268: 0x8132, 0x269: 0x8132, + 0x26a: 0x8132, 0x26b: 0x8132, 0x26c: 0x8132, 0x26d: 0x8132, 0x26e: 0x8132, 0x26f: 0x8132, + 0x274: 0x0170, + 0x27a: 0x42a5, + 0x27e: 0x0037, + // Block 0xa, offset 0x280 + 0x284: 0x425a, 0x285: 0x447b, + 0x286: 0x35e9, 0x287: 0x00ce, 0x288: 0x3607, 0x289: 0x3613, 0x28a: 0x3625, + 0x28c: 0x3643, 0x28e: 0x3655, 0x28f: 0x3673, 0x290: 0x3e08, 0x291: 0xa000, + 0x295: 0xa000, 0x297: 0xa000, + 0x299: 0xa000, + 0x29f: 0xa000, 0x2a1: 0xa000, + 0x2a5: 0xa000, 0x2a9: 0xa000, + 0x2aa: 0x3637, 0x2ab: 0x3667, 0x2ac: 0x47fe, 0x2ad: 0x3697, 0x2ae: 0x4828, 0x2af: 0x36a9, + 0x2b0: 0x3e70, 0x2b1: 0xa000, 0x2b5: 0xa000, + 0x2b7: 0xa000, 0x2b9: 0xa000, + 0x2bf: 0xa000, + // Block 0xb, offset 0x2c0 + 0x2c1: 0xa000, 0x2c5: 0xa000, + 0x2c9: 0xa000, 0x2ca: 0x4840, 0x2cb: 0x485e, + 0x2cc: 0x36c7, 0x2cd: 0x36df, 0x2ce: 0x4876, 0x2d0: 0x01be, 0x2d1: 0x01d0, + 0x2d2: 0x01ac, 0x2d3: 0x430c, 0x2d4: 0x4312, 0x2d5: 0x01fa, 0x2d6: 0x01e8, + 0x2f0: 0x01d6, 0x2f1: 0x01eb, 0x2f2: 0x01ee, 0x2f4: 0x0188, 0x2f5: 0x01c7, + 0x2f9: 0x01a6, + // Block 0xc, offset 0x300 + 0x300: 0x3721, 0x301: 0x372d, 0x303: 0x371b, + 0x306: 0xa000, 0x307: 0x3709, + 0x30c: 0x375d, 0x30d: 0x3745, 0x30e: 0x376f, 0x310: 0xa000, + 0x313: 0xa000, 0x315: 0xa000, 0x316: 0xa000, 0x317: 0xa000, + 0x318: 0xa000, 0x319: 0x3751, 0x31a: 0xa000, + 0x31e: 0xa000, 0x323: 0xa000, + 0x327: 0xa000, + 0x32b: 0xa000, 0x32d: 0xa000, + 0x330: 0xa000, 0x333: 0xa000, 0x335: 0xa000, + 0x336: 0xa000, 0x337: 0xa000, 0x338: 0xa000, 0x339: 0x37d5, 0x33a: 0xa000, + 0x33e: 0xa000, + // Block 0xd, offset 0x340 + 0x341: 0x3733, 0x342: 0x37b7, + 0x350: 0x370f, 0x351: 0x3793, + 0x352: 0x3715, 0x353: 0x3799, 0x356: 0x3727, 0x357: 0x37ab, + 0x358: 0xa000, 0x359: 0xa000, 0x35a: 0x3829, 0x35b: 0x382f, 0x35c: 0x3739, 0x35d: 0x37bd, + 0x35e: 0x373f, 0x35f: 0x37c3, 0x362: 0x374b, 0x363: 0x37cf, + 0x364: 0x3757, 0x365: 0x37db, 0x366: 0x3763, 0x367: 0x37e7, 0x368: 0xa000, 0x369: 0xa000, + 0x36a: 0x3835, 0x36b: 0x383b, 0x36c: 0x378d, 0x36d: 0x3811, 0x36e: 0x3769, 0x36f: 0x37ed, + 0x370: 0x3775, 0x371: 0x37f9, 0x372: 0x377b, 0x373: 0x37ff, 0x374: 0x3781, 0x375: 0x3805, + 0x378: 0x3787, 0x379: 0x380b, + // Block 0xe, offset 0x380 + 0x387: 0x1d61, + 0x391: 0x812d, + 0x392: 0x8132, 0x393: 0x8132, 0x394: 0x8132, 0x395: 0x8132, 0x396: 0x812d, 0x397: 0x8132, + 0x398: 0x8132, 0x399: 0x8132, 0x39a: 0x812e, 0x39b: 0x812d, 0x39c: 0x8132, 0x39d: 0x8132, + 0x39e: 0x8132, 0x39f: 0x8132, 0x3a0: 0x8132, 0x3a1: 0x8132, 0x3a2: 0x812d, 0x3a3: 0x812d, + 0x3a4: 0x812d, 0x3a5: 0x812d, 0x3a6: 0x812d, 0x3a7: 0x812d, 0x3a8: 0x8132, 0x3a9: 0x8132, + 0x3aa: 0x812d, 0x3ab: 0x8132, 0x3ac: 0x8132, 0x3ad: 0x812e, 0x3ae: 0x8131, 0x3af: 0x8132, + 0x3b0: 0x8105, 0x3b1: 0x8106, 0x3b2: 0x8107, 0x3b3: 0x8108, 0x3b4: 0x8109, 0x3b5: 0x810a, + 0x3b6: 0x810b, 0x3b7: 0x810c, 0x3b8: 0x810d, 0x3b9: 0x810e, 0x3ba: 0x810e, 0x3bb: 0x810f, + 0x3bc: 0x8110, 0x3bd: 0x8111, 0x3bf: 0x8112, + // Block 0xf, offset 0x3c0 + 0x3c8: 0xa000, 0x3ca: 0xa000, 0x3cb: 0x8116, + 0x3cc: 0x8117, 0x3cd: 0x8118, 0x3ce: 0x8119, 0x3cf: 0x811a, 0x3d0: 0x811b, 0x3d1: 0x811c, + 0x3d2: 0x811d, 0x3d3: 0x9932, 0x3d4: 0x9932, 0x3d5: 0x992d, 0x3d6: 0x812d, 0x3d7: 0x8132, + 0x3d8: 0x8132, 0x3d9: 0x8132, 0x3da: 0x8132, 0x3db: 0x8132, 0x3dc: 0x812d, 0x3dd: 0x8132, + 0x3de: 0x8132, 0x3df: 0x812d, + 0x3f0: 0x811e, 0x3f5: 0x1d84, + 0x3f6: 0x2013, 0x3f7: 0x204f, 0x3f8: 0x204a, + // Block 0x10, offset 0x400 + 0x413: 0x812d, 0x414: 0x8132, 0x415: 0x8132, 0x416: 0x8132, 0x417: 0x8132, + 0x418: 0x8132, 0x419: 0x8132, 0x41a: 0x8132, 0x41b: 0x8132, 0x41c: 0x8132, 0x41d: 0x8132, + 0x41e: 0x8132, 0x41f: 0x8132, 0x420: 0x8132, 0x421: 0x8132, 0x423: 0x812d, + 0x424: 0x8132, 0x425: 0x8132, 0x426: 0x812d, 0x427: 0x8132, 0x428: 0x8132, 0x429: 0x812d, + 0x42a: 0x8132, 0x42b: 0x8132, 0x42c: 0x8132, 0x42d: 0x812d, 0x42e: 0x812d, 0x42f: 0x812d, + 0x430: 0x8116, 0x431: 0x8117, 0x432: 0x8118, 0x433: 0x8132, 0x434: 0x8132, 0x435: 0x8132, + 0x436: 0x812d, 0x437: 0x8132, 0x438: 0x8132, 0x439: 0x812d, 0x43a: 0x812d, 0x43b: 0x8132, + 0x43c: 0x8132, 0x43d: 0x8132, 0x43e: 0x8132, 0x43f: 0x8132, + // Block 0x11, offset 0x440 + 0x445: 0xa000, + 0x446: 0x2d26, 0x447: 0xa000, 0x448: 0x2d2e, 0x449: 0xa000, 0x44a: 0x2d36, 0x44b: 0xa000, + 0x44c: 0x2d3e, 0x44d: 0xa000, 0x44e: 0x2d46, 0x451: 0xa000, + 0x452: 0x2d4e, + 0x474: 0x8102, 0x475: 0x9900, + 0x47a: 0xa000, 0x47b: 0x2d56, + 0x47c: 0xa000, 0x47d: 0x2d5e, 0x47e: 0xa000, 0x47f: 0xa000, + // Block 0x12, offset 0x480 + 0x480: 0x0069, 0x481: 0x006b, 0x482: 0x006f, 0x483: 0x0083, 0x484: 0x00f5, 0x485: 0x00f8, + 0x486: 0x0413, 0x487: 0x0085, 0x488: 0x0089, 0x489: 0x008b, 0x48a: 0x0104, 0x48b: 0x0107, + 0x48c: 0x010a, 0x48d: 0x008f, 0x48f: 0x0097, 0x490: 0x009b, 0x491: 0x00e0, + 0x492: 0x009f, 0x493: 0x00fe, 0x494: 0x0417, 0x495: 0x041b, 0x496: 0x00a1, 0x497: 0x00a9, + 0x498: 0x00ab, 0x499: 0x0423, 0x49a: 0x012b, 0x49b: 0x00ad, 0x49c: 0x0427, 0x49d: 0x01be, + 0x49e: 0x01c1, 0x49f: 0x01c4, 0x4a0: 0x01fa, 0x4a1: 0x01fd, 0x4a2: 0x0093, 0x4a3: 0x00a5, + 0x4a4: 0x00ab, 0x4a5: 0x00ad, 0x4a6: 0x01be, 0x4a7: 0x01c1, 0x4a8: 0x01eb, 0x4a9: 0x01fa, + 0x4aa: 0x01fd, + 0x4b8: 0x020c, + // Block 0x13, offset 0x4c0 + 0x4db: 0x00fb, 0x4dc: 0x0087, 0x4dd: 0x0101, + 0x4de: 0x00d4, 0x4df: 0x010a, 0x4e0: 0x008d, 0x4e1: 0x010d, 0x4e2: 0x0110, 0x4e3: 0x0116, + 0x4e4: 0x011c, 0x4e5: 0x011f, 0x4e6: 0x0122, 0x4e7: 0x042b, 0x4e8: 0x016a, 0x4e9: 0x0128, + 0x4ea: 0x042f, 0x4eb: 0x016d, 0x4ec: 0x0131, 0x4ed: 0x012e, 0x4ee: 0x0134, 0x4ef: 0x0137, + 0x4f0: 0x013a, 0x4f1: 0x013d, 0x4f2: 0x0140, 0x4f3: 0x014c, 0x4f4: 0x014f, 0x4f5: 0x00ec, + 0x4f6: 0x0152, 0x4f7: 0x0155, 0x4f8: 0x041f, 0x4f9: 0x0158, 0x4fa: 0x015b, 0x4fb: 0x00b5, + 0x4fc: 0x015e, 0x4fd: 0x0161, 0x4fe: 0x0164, 0x4ff: 0x01d0, + // Block 0x14, offset 0x500 + 0x500: 0x8132, 0x501: 0x8132, 0x502: 0x812d, 0x503: 0x8132, 0x504: 0x8132, 0x505: 0x8132, + 0x506: 0x8132, 0x507: 0x8132, 0x508: 0x8132, 0x509: 0x8132, 0x50a: 0x812d, 0x50b: 0x8132, + 0x50c: 0x8132, 0x50d: 0x8135, 0x50e: 0x812a, 0x50f: 0x812d, 0x510: 0x8129, 0x511: 0x8132, + 0x512: 0x8132, 0x513: 0x8132, 0x514: 0x8132, 0x515: 0x8132, 0x516: 0x8132, 0x517: 0x8132, + 0x518: 0x8132, 0x519: 0x8132, 0x51a: 0x8132, 0x51b: 0x8132, 0x51c: 0x8132, 0x51d: 0x8132, + 0x51e: 0x8132, 0x51f: 0x8132, 0x520: 0x8132, 0x521: 0x8132, 0x522: 0x8132, 0x523: 0x8132, + 0x524: 0x8132, 0x525: 0x8132, 0x526: 0x8132, 0x527: 0x8132, 0x528: 0x8132, 0x529: 0x8132, + 0x52a: 0x8132, 0x52b: 0x8132, 0x52c: 0x8132, 0x52d: 0x8132, 0x52e: 0x8132, 0x52f: 0x8132, + 0x530: 0x8132, 0x531: 0x8132, 0x532: 0x8132, 0x533: 0x8132, 0x534: 0x8132, 0x535: 0x8132, + 0x536: 0x8133, 0x537: 0x8131, 0x538: 0x8131, 0x539: 0x812d, 0x53b: 0x8132, + 0x53c: 0x8134, 0x53d: 0x812d, 0x53e: 0x8132, 0x53f: 0x812d, + // Block 0x15, offset 0x540 + 0x540: 0x2f97, 0x541: 0x32a3, 0x542: 0x2fa1, 0x543: 0x32ad, 0x544: 0x2fa6, 0x545: 0x32b2, + 0x546: 0x2fab, 0x547: 0x32b7, 0x548: 0x38cc, 0x549: 0x3a5b, 0x54a: 0x2fc4, 0x54b: 0x32d0, + 0x54c: 0x2fce, 0x54d: 0x32da, 0x54e: 0x2fdd, 0x54f: 0x32e9, 0x550: 0x2fd3, 0x551: 0x32df, + 0x552: 0x2fd8, 0x553: 0x32e4, 0x554: 0x38ef, 0x555: 0x3a7e, 0x556: 0x38f6, 0x557: 0x3a85, + 0x558: 0x3019, 0x559: 0x3325, 0x55a: 0x301e, 0x55b: 0x332a, 0x55c: 0x3904, 0x55d: 0x3a93, + 0x55e: 0x3023, 0x55f: 0x332f, 0x560: 0x3032, 0x561: 0x333e, 0x562: 0x3050, 0x563: 0x335c, + 0x564: 0x305f, 0x565: 0x336b, 0x566: 0x3055, 0x567: 0x3361, 0x568: 0x3064, 0x569: 0x3370, + 0x56a: 0x3069, 0x56b: 0x3375, 0x56c: 0x30af, 0x56d: 0x33bb, 0x56e: 0x390b, 0x56f: 0x3a9a, + 0x570: 0x30b9, 0x571: 0x33ca, 0x572: 0x30c3, 0x573: 0x33d4, 0x574: 0x30cd, 0x575: 0x33de, + 0x576: 0x46c4, 0x577: 0x4755, 0x578: 0x3912, 0x579: 0x3aa1, 0x57a: 0x30e6, 0x57b: 0x33f7, + 0x57c: 0x30e1, 0x57d: 0x33f2, 0x57e: 0x30eb, 0x57f: 0x33fc, + // Block 0x16, offset 0x580 + 0x580: 0x30f0, 0x581: 0x3401, 0x582: 0x30f5, 0x583: 0x3406, 0x584: 0x3109, 0x585: 0x341a, + 0x586: 0x3113, 0x587: 0x3424, 0x588: 0x3122, 0x589: 0x3433, 0x58a: 0x311d, 0x58b: 0x342e, + 0x58c: 0x3935, 0x58d: 0x3ac4, 0x58e: 0x3943, 0x58f: 0x3ad2, 0x590: 0x394a, 0x591: 0x3ad9, + 0x592: 0x3951, 0x593: 0x3ae0, 0x594: 0x314f, 0x595: 0x3460, 0x596: 0x3154, 0x597: 0x3465, + 0x598: 0x315e, 0x599: 0x346f, 0x59a: 0x46f1, 0x59b: 0x4782, 0x59c: 0x3997, 0x59d: 0x3b26, + 0x59e: 0x3177, 0x59f: 0x3488, 0x5a0: 0x3181, 0x5a1: 0x3492, 0x5a2: 0x4700, 0x5a3: 0x4791, + 0x5a4: 0x399e, 0x5a5: 0x3b2d, 0x5a6: 0x39a5, 0x5a7: 0x3b34, 0x5a8: 0x39ac, 0x5a9: 0x3b3b, + 0x5aa: 0x3190, 0x5ab: 0x34a1, 0x5ac: 0x319a, 0x5ad: 0x34b0, 0x5ae: 0x31ae, 0x5af: 0x34c4, + 0x5b0: 0x31a9, 0x5b1: 0x34bf, 0x5b2: 0x31ea, 0x5b3: 0x3500, 0x5b4: 0x31f9, 0x5b5: 0x350f, + 0x5b6: 0x31f4, 0x5b7: 0x350a, 0x5b8: 0x39b3, 0x5b9: 0x3b42, 0x5ba: 0x39ba, 0x5bb: 0x3b49, + 0x5bc: 0x31fe, 0x5bd: 0x3514, 0x5be: 0x3203, 0x5bf: 0x3519, + // Block 0x17, offset 0x5c0 + 0x5c0: 0x3208, 0x5c1: 0x351e, 0x5c2: 0x320d, 0x5c3: 0x3523, 0x5c4: 0x321c, 0x5c5: 0x3532, + 0x5c6: 0x3217, 0x5c7: 0x352d, 0x5c8: 0x3221, 0x5c9: 0x353c, 0x5ca: 0x3226, 0x5cb: 0x3541, + 0x5cc: 0x322b, 0x5cd: 0x3546, 0x5ce: 0x3249, 0x5cf: 0x3564, 0x5d0: 0x3262, 0x5d1: 0x3582, + 0x5d2: 0x3271, 0x5d3: 0x3591, 0x5d4: 0x3276, 0x5d5: 0x3596, 0x5d6: 0x337a, 0x5d7: 0x34a6, + 0x5d8: 0x3537, 0x5d9: 0x3573, 0x5da: 0x1be0, 0x5db: 0x42d7, + 0x5e0: 0x46a1, 0x5e1: 0x4732, 0x5e2: 0x2f83, 0x5e3: 0x328f, + 0x5e4: 0x3878, 0x5e5: 0x3a07, 0x5e6: 0x3871, 0x5e7: 0x3a00, 0x5e8: 0x3886, 0x5e9: 0x3a15, + 0x5ea: 0x387f, 0x5eb: 0x3a0e, 0x5ec: 0x38be, 0x5ed: 0x3a4d, 0x5ee: 0x3894, 0x5ef: 0x3a23, + 0x5f0: 0x388d, 0x5f1: 0x3a1c, 0x5f2: 0x38a2, 0x5f3: 0x3a31, 0x5f4: 0x389b, 0x5f5: 0x3a2a, + 0x5f6: 0x38c5, 0x5f7: 0x3a54, 0x5f8: 0x46b5, 0x5f9: 0x4746, 0x5fa: 0x3000, 0x5fb: 0x330c, + 0x5fc: 0x2fec, 0x5fd: 0x32f8, 0x5fe: 0x38da, 0x5ff: 0x3a69, + // Block 0x18, offset 0x600 + 0x600: 0x38d3, 0x601: 0x3a62, 0x602: 0x38e8, 0x603: 0x3a77, 0x604: 0x38e1, 0x605: 0x3a70, + 0x606: 0x38fd, 0x607: 0x3a8c, 0x608: 0x3091, 0x609: 0x339d, 0x60a: 0x30a5, 0x60b: 0x33b1, + 0x60c: 0x46e7, 0x60d: 0x4778, 0x60e: 0x3136, 0x60f: 0x3447, 0x610: 0x3920, 0x611: 0x3aaf, + 0x612: 0x3919, 0x613: 0x3aa8, 0x614: 0x392e, 0x615: 0x3abd, 0x616: 0x3927, 0x617: 0x3ab6, + 0x618: 0x3989, 0x619: 0x3b18, 0x61a: 0x396d, 0x61b: 0x3afc, 0x61c: 0x3966, 0x61d: 0x3af5, + 0x61e: 0x397b, 0x61f: 0x3b0a, 0x620: 0x3974, 0x621: 0x3b03, 0x622: 0x3982, 0x623: 0x3b11, + 0x624: 0x31e5, 0x625: 0x34fb, 0x626: 0x31c7, 0x627: 0x34dd, 0x628: 0x39e4, 0x629: 0x3b73, + 0x62a: 0x39dd, 0x62b: 0x3b6c, 0x62c: 0x39f2, 0x62d: 0x3b81, 0x62e: 0x39eb, 0x62f: 0x3b7a, + 0x630: 0x39f9, 0x631: 0x3b88, 0x632: 0x3230, 0x633: 0x354b, 0x634: 0x3258, 0x635: 0x3578, + 0x636: 0x3253, 0x637: 0x356e, 0x638: 0x323f, 0x639: 0x355a, + // Block 0x19, offset 0x640 + 0x640: 0x4804, 0x641: 0x480a, 0x642: 0x491e, 0x643: 0x4936, 0x644: 0x4926, 0x645: 0x493e, + 0x646: 0x492e, 0x647: 0x4946, 0x648: 0x47aa, 0x649: 0x47b0, 0x64a: 0x488e, 0x64b: 0x48a6, + 0x64c: 0x4896, 0x64d: 0x48ae, 0x64e: 0x489e, 0x64f: 0x48b6, 0x650: 0x4816, 0x651: 0x481c, + 0x652: 0x3db8, 0x653: 0x3dc8, 0x654: 0x3dc0, 0x655: 0x3dd0, + 0x658: 0x47b6, 0x659: 0x47bc, 0x65a: 0x3ce8, 0x65b: 0x3cf8, 0x65c: 0x3cf0, 0x65d: 0x3d00, + 0x660: 0x482e, 0x661: 0x4834, 0x662: 0x494e, 0x663: 0x4966, + 0x664: 0x4956, 0x665: 0x496e, 0x666: 0x495e, 0x667: 0x4976, 0x668: 0x47c2, 0x669: 0x47c8, + 0x66a: 0x48be, 0x66b: 0x48d6, 0x66c: 0x48c6, 0x66d: 0x48de, 0x66e: 0x48ce, 0x66f: 0x48e6, + 0x670: 0x4846, 0x671: 0x484c, 0x672: 0x3e18, 0x673: 0x3e30, 0x674: 0x3e20, 0x675: 0x3e38, + 0x676: 0x3e28, 0x677: 0x3e40, 0x678: 0x47ce, 0x679: 0x47d4, 0x67a: 0x3d18, 0x67b: 0x3d30, + 0x67c: 0x3d20, 0x67d: 0x3d38, 0x67e: 0x3d28, 0x67f: 0x3d40, + // Block 0x1a, offset 0x680 + 0x680: 0x4852, 0x681: 0x4858, 0x682: 0x3e48, 0x683: 0x3e58, 0x684: 0x3e50, 0x685: 0x3e60, + 0x688: 0x47da, 0x689: 0x47e0, 0x68a: 0x3d48, 0x68b: 0x3d58, + 0x68c: 0x3d50, 0x68d: 0x3d60, 0x690: 0x4864, 0x691: 0x486a, + 0x692: 0x3e80, 0x693: 0x3e98, 0x694: 0x3e88, 0x695: 0x3ea0, 0x696: 0x3e90, 0x697: 0x3ea8, + 0x699: 0x47e6, 0x69b: 0x3d68, 0x69d: 0x3d70, + 0x69f: 0x3d78, 0x6a0: 0x487c, 0x6a1: 0x4882, 0x6a2: 0x497e, 0x6a3: 0x4996, + 0x6a4: 0x4986, 0x6a5: 0x499e, 0x6a6: 0x498e, 0x6a7: 0x49a6, 0x6a8: 0x47ec, 0x6a9: 0x47f2, + 0x6aa: 0x48ee, 0x6ab: 0x4906, 0x6ac: 0x48f6, 0x6ad: 0x490e, 0x6ae: 0x48fe, 0x6af: 0x4916, + 0x6b0: 0x47f8, 0x6b1: 0x431e, 0x6b2: 0x3691, 0x6b3: 0x4324, 0x6b4: 0x4822, 0x6b5: 0x432a, + 0x6b6: 0x36a3, 0x6b7: 0x4330, 0x6b8: 0x36c1, 0x6b9: 0x4336, 0x6ba: 0x36d9, 0x6bb: 0x433c, + 0x6bc: 0x4870, 0x6bd: 0x4342, + // Block 0x1b, offset 0x6c0 + 0x6c0: 0x3da0, 0x6c1: 0x3da8, 0x6c2: 0x4184, 0x6c3: 0x41a2, 0x6c4: 0x418e, 0x6c5: 0x41ac, + 0x6c6: 0x4198, 0x6c7: 0x41b6, 0x6c8: 0x3cd8, 0x6c9: 0x3ce0, 0x6ca: 0x40d0, 0x6cb: 0x40ee, + 0x6cc: 0x40da, 0x6cd: 0x40f8, 0x6ce: 0x40e4, 0x6cf: 0x4102, 0x6d0: 0x3de8, 0x6d1: 0x3df0, + 0x6d2: 0x41c0, 0x6d3: 0x41de, 0x6d4: 0x41ca, 0x6d5: 0x41e8, 0x6d6: 0x41d4, 0x6d7: 0x41f2, + 0x6d8: 0x3d08, 0x6d9: 0x3d10, 0x6da: 0x410c, 0x6db: 0x412a, 0x6dc: 0x4116, 0x6dd: 0x4134, + 0x6de: 0x4120, 0x6df: 0x413e, 0x6e0: 0x3ec0, 0x6e1: 0x3ec8, 0x6e2: 0x41fc, 0x6e3: 0x421a, + 0x6e4: 0x4206, 0x6e5: 0x4224, 0x6e6: 0x4210, 0x6e7: 0x422e, 0x6e8: 0x3d80, 0x6e9: 0x3d88, + 0x6ea: 0x4148, 0x6eb: 0x4166, 0x6ec: 0x4152, 0x6ed: 0x4170, 0x6ee: 0x415c, 0x6ef: 0x417a, + 0x6f0: 0x3685, 0x6f1: 0x367f, 0x6f2: 0x3d90, 0x6f3: 0x368b, 0x6f4: 0x3d98, + 0x6f6: 0x4810, 0x6f7: 0x3db0, 0x6f8: 0x35f5, 0x6f9: 0x35ef, 0x6fa: 0x35e3, 0x6fb: 0x42ee, + 0x6fc: 0x35fb, 0x6fd: 0x4287, 0x6fe: 0x01d3, 0x6ff: 0x4287, + // Block 0x1c, offset 0x700 + 0x700: 0x42a0, 0x701: 0x4482, 0x702: 0x3dd8, 0x703: 0x369d, 0x704: 0x3de0, + 0x706: 0x483a, 0x707: 0x3df8, 0x708: 0x3601, 0x709: 0x42f4, 0x70a: 0x360d, 0x70b: 0x42fa, + 0x70c: 0x3619, 0x70d: 0x4489, 0x70e: 0x4490, 0x70f: 0x4497, 0x710: 0x36b5, 0x711: 0x36af, + 0x712: 0x3e00, 0x713: 0x44e4, 0x716: 0x36bb, 0x717: 0x3e10, + 0x718: 0x3631, 0x719: 0x362b, 0x71a: 0x361f, 0x71b: 0x4300, 0x71d: 0x449e, + 0x71e: 0x44a5, 0x71f: 0x44ac, 0x720: 0x36eb, 0x721: 0x36e5, 0x722: 0x3e68, 0x723: 0x44ec, + 0x724: 0x36cd, 0x725: 0x36d3, 0x726: 0x36f1, 0x727: 0x3e78, 0x728: 0x3661, 0x729: 0x365b, + 0x72a: 0x364f, 0x72b: 0x430c, 0x72c: 0x3649, 0x72d: 0x4474, 0x72e: 0x447b, 0x72f: 0x0081, + 0x732: 0x3eb0, 0x733: 0x36f7, 0x734: 0x3eb8, + 0x736: 0x4888, 0x737: 0x3ed0, 0x738: 0x363d, 0x739: 0x4306, 0x73a: 0x366d, 0x73b: 0x4318, + 0x73c: 0x3679, 0x73d: 0x425a, 0x73e: 0x428c, + // Block 0x1d, offset 0x740 + 0x740: 0x1bd8, 0x741: 0x1bdc, 0x742: 0x0047, 0x743: 0x1c54, 0x745: 0x1be8, + 0x746: 0x1bec, 0x747: 0x00e9, 0x749: 0x1c58, 0x74a: 0x008f, 0x74b: 0x0051, + 0x74c: 0x0051, 0x74d: 0x0051, 0x74e: 0x0091, 0x74f: 0x00da, 0x750: 0x0053, 0x751: 0x0053, + 0x752: 0x0059, 0x753: 0x0099, 0x755: 0x005d, 0x756: 0x198d, + 0x759: 0x0061, 0x75a: 0x0063, 0x75b: 0x0065, 0x75c: 0x0065, 0x75d: 0x0065, + 0x760: 0x199f, 0x761: 0x1bc8, 0x762: 0x19a8, + 0x764: 0x0075, 0x766: 0x01b8, 0x768: 0x0075, + 0x76a: 0x0057, 0x76b: 0x42d2, 0x76c: 0x0045, 0x76d: 0x0047, 0x76f: 0x008b, + 0x770: 0x004b, 0x771: 0x004d, 0x773: 0x005b, 0x774: 0x009f, 0x775: 0x0215, + 0x776: 0x0218, 0x777: 0x021b, 0x778: 0x021e, 0x779: 0x0093, 0x77b: 0x1b98, + 0x77c: 0x01e8, 0x77d: 0x01c1, 0x77e: 0x0179, 0x77f: 0x01a0, + // Block 0x1e, offset 0x780 + 0x780: 0x0463, 0x785: 0x0049, + 0x786: 0x0089, 0x787: 0x008b, 0x788: 0x0093, 0x789: 0x0095, + 0x790: 0x222e, 0x791: 0x223a, + 0x792: 0x22ee, 0x793: 0x2216, 0x794: 0x229a, 0x795: 0x2222, 0x796: 0x22a0, 0x797: 0x22b8, + 0x798: 0x22c4, 0x799: 0x2228, 0x79a: 0x22ca, 0x79b: 0x2234, 0x79c: 0x22be, 0x79d: 0x22d0, + 0x79e: 0x22d6, 0x79f: 0x1cbc, 0x7a0: 0x0053, 0x7a1: 0x195a, 0x7a2: 0x1ba4, 0x7a3: 0x1963, + 0x7a4: 0x006d, 0x7a5: 0x19ab, 0x7a6: 0x1bd0, 0x7a7: 0x1d48, 0x7a8: 0x1966, 0x7a9: 0x0071, + 0x7aa: 0x19b7, 0x7ab: 0x1bd4, 0x7ac: 0x0059, 0x7ad: 0x0047, 0x7ae: 0x0049, 0x7af: 0x005b, + 0x7b0: 0x0093, 0x7b1: 0x19e4, 0x7b2: 0x1c18, 0x7b3: 0x19ed, 0x7b4: 0x00ad, 0x7b5: 0x1a62, + 0x7b6: 0x1c4c, 0x7b7: 0x1d5c, 0x7b8: 0x19f0, 0x7b9: 0x00b1, 0x7ba: 0x1a65, 0x7bb: 0x1c50, + 0x7bc: 0x0099, 0x7bd: 0x0087, 0x7be: 0x0089, 0x7bf: 0x009b, + // Block 0x1f, offset 0x7c0 + 0x7c1: 0x3c06, 0x7c3: 0xa000, 0x7c4: 0x3c0d, 0x7c5: 0xa000, + 0x7c7: 0x3c14, 0x7c8: 0xa000, 0x7c9: 0x3c1b, + 0x7cd: 0xa000, + 0x7e0: 0x2f65, 0x7e1: 0xa000, 0x7e2: 0x3c29, + 0x7e4: 0xa000, 0x7e5: 0xa000, + 0x7ed: 0x3c22, 0x7ee: 0x2f60, 0x7ef: 0x2f6a, + 0x7f0: 0x3c30, 0x7f1: 0x3c37, 0x7f2: 0xa000, 0x7f3: 0xa000, 0x7f4: 0x3c3e, 0x7f5: 0x3c45, + 0x7f6: 0xa000, 0x7f7: 0xa000, 0x7f8: 0x3c4c, 0x7f9: 0x3c53, 0x7fa: 0xa000, 0x7fb: 0xa000, + 0x7fc: 0xa000, 0x7fd: 0xa000, + // Block 0x20, offset 0x800 + 0x800: 0x3c5a, 0x801: 0x3c61, 0x802: 0xa000, 0x803: 0xa000, 0x804: 0x3c76, 0x805: 0x3c7d, + 0x806: 0xa000, 0x807: 0xa000, 0x808: 0x3c84, 0x809: 0x3c8b, + 0x811: 0xa000, + 0x812: 0xa000, + 0x822: 0xa000, + 0x828: 0xa000, 0x829: 0xa000, + 0x82b: 0xa000, 0x82c: 0x3ca0, 0x82d: 0x3ca7, 0x82e: 0x3cae, 0x82f: 0x3cb5, + 0x832: 0xa000, 0x833: 0xa000, 0x834: 0xa000, 0x835: 0xa000, + // Block 0x21, offset 0x840 + 0x860: 0x0023, 0x861: 0x0025, 0x862: 0x0027, 0x863: 0x0029, + 0x864: 0x002b, 0x865: 0x002d, 0x866: 0x002f, 0x867: 0x0031, 0x868: 0x0033, 0x869: 0x1882, + 0x86a: 0x1885, 0x86b: 0x1888, 0x86c: 0x188b, 0x86d: 0x188e, 0x86e: 0x1891, 0x86f: 0x1894, + 0x870: 0x1897, 0x871: 0x189a, 0x872: 0x189d, 0x873: 0x18a6, 0x874: 0x1a68, 0x875: 0x1a6c, + 0x876: 0x1a70, 0x877: 0x1a74, 0x878: 0x1a78, 0x879: 0x1a7c, 0x87a: 0x1a80, 0x87b: 0x1a84, + 0x87c: 0x1a88, 0x87d: 0x1c80, 0x87e: 0x1c85, 0x87f: 0x1c8a, + // Block 0x22, offset 0x880 + 0x880: 0x1c8f, 0x881: 0x1c94, 0x882: 0x1c99, 0x883: 0x1c9e, 0x884: 0x1ca3, 0x885: 0x1ca8, + 0x886: 0x1cad, 0x887: 0x1cb2, 0x888: 0x187f, 0x889: 0x18a3, 0x88a: 0x18c7, 0x88b: 0x18eb, + 0x88c: 0x190f, 0x88d: 0x1918, 0x88e: 0x191e, 0x88f: 0x1924, 0x890: 0x192a, 0x891: 0x1b60, + 0x892: 0x1b64, 0x893: 0x1b68, 0x894: 0x1b6c, 0x895: 0x1b70, 0x896: 0x1b74, 0x897: 0x1b78, + 0x898: 0x1b7c, 0x899: 0x1b80, 0x89a: 0x1b84, 0x89b: 0x1b88, 0x89c: 0x1af4, 0x89d: 0x1af8, + 0x89e: 0x1afc, 0x89f: 0x1b00, 0x8a0: 0x1b04, 0x8a1: 0x1b08, 0x8a2: 0x1b0c, 0x8a3: 0x1b10, + 0x8a4: 0x1b14, 0x8a5: 0x1b18, 0x8a6: 0x1b1c, 0x8a7: 0x1b20, 0x8a8: 0x1b24, 0x8a9: 0x1b28, + 0x8aa: 0x1b2c, 0x8ab: 0x1b30, 0x8ac: 0x1b34, 0x8ad: 0x1b38, 0x8ae: 0x1b3c, 0x8af: 0x1b40, + 0x8b0: 0x1b44, 0x8b1: 0x1b48, 0x8b2: 0x1b4c, 0x8b3: 0x1b50, 0x8b4: 0x1b54, 0x8b5: 0x1b58, + 0x8b6: 0x0043, 0x8b7: 0x0045, 0x8b8: 0x0047, 0x8b9: 0x0049, 0x8ba: 0x004b, 0x8bb: 0x004d, + 0x8bc: 0x004f, 0x8bd: 0x0051, 0x8be: 0x0053, 0x8bf: 0x0055, + // Block 0x23, offset 0x8c0 + 0x8c0: 0x06bf, 0x8c1: 0x06e3, 0x8c2: 0x06ef, 0x8c3: 0x06ff, 0x8c4: 0x0707, 0x8c5: 0x0713, + 0x8c6: 0x071b, 0x8c7: 0x0723, 0x8c8: 0x072f, 0x8c9: 0x0783, 0x8ca: 0x079b, 0x8cb: 0x07ab, + 0x8cc: 0x07bb, 0x8cd: 0x07cb, 0x8ce: 0x07db, 0x8cf: 0x07fb, 0x8d0: 0x07ff, 0x8d1: 0x0803, + 0x8d2: 0x0837, 0x8d3: 0x085f, 0x8d4: 0x086f, 0x8d5: 0x0877, 0x8d6: 0x087b, 0x8d7: 0x0887, + 0x8d8: 0x08a3, 0x8d9: 0x08a7, 0x8da: 0x08bf, 0x8db: 0x08c3, 0x8dc: 0x08cb, 0x8dd: 0x08db, + 0x8de: 0x0977, 0x8df: 0x098b, 0x8e0: 0x09cb, 0x8e1: 0x09df, 0x8e2: 0x09e7, 0x8e3: 0x09eb, + 0x8e4: 0x09fb, 0x8e5: 0x0a17, 0x8e6: 0x0a43, 0x8e7: 0x0a4f, 0x8e8: 0x0a6f, 0x8e9: 0x0a7b, + 0x8ea: 0x0a7f, 0x8eb: 0x0a83, 0x8ec: 0x0a9b, 0x8ed: 0x0a9f, 0x8ee: 0x0acb, 0x8ef: 0x0ad7, + 0x8f0: 0x0adf, 0x8f1: 0x0ae7, 0x8f2: 0x0af7, 0x8f3: 0x0aff, 0x8f4: 0x0b07, 0x8f5: 0x0b33, + 0x8f6: 0x0b37, 0x8f7: 0x0b3f, 0x8f8: 0x0b43, 0x8f9: 0x0b4b, 0x8fa: 0x0b53, 0x8fb: 0x0b63, + 0x8fc: 0x0b7f, 0x8fd: 0x0bf7, 0x8fe: 0x0c0b, 0x8ff: 0x0c0f, + // Block 0x24, offset 0x900 + 0x900: 0x0c8f, 0x901: 0x0c93, 0x902: 0x0ca7, 0x903: 0x0cab, 0x904: 0x0cb3, 0x905: 0x0cbb, + 0x906: 0x0cc3, 0x907: 0x0ccf, 0x908: 0x0cf7, 0x909: 0x0d07, 0x90a: 0x0d1b, 0x90b: 0x0d8b, + 0x90c: 0x0d97, 0x90d: 0x0da7, 0x90e: 0x0db3, 0x90f: 0x0dbf, 0x910: 0x0dc7, 0x911: 0x0dcb, + 0x912: 0x0dcf, 0x913: 0x0dd3, 0x914: 0x0dd7, 0x915: 0x0e8f, 0x916: 0x0ed7, 0x917: 0x0ee3, + 0x918: 0x0ee7, 0x919: 0x0eeb, 0x91a: 0x0eef, 0x91b: 0x0ef7, 0x91c: 0x0efb, 0x91d: 0x0f0f, + 0x91e: 0x0f2b, 0x91f: 0x0f33, 0x920: 0x0f73, 0x921: 0x0f77, 0x922: 0x0f7f, 0x923: 0x0f83, + 0x924: 0x0f8b, 0x925: 0x0f8f, 0x926: 0x0fb3, 0x927: 0x0fb7, 0x928: 0x0fd3, 0x929: 0x0fd7, + 0x92a: 0x0fdb, 0x92b: 0x0fdf, 0x92c: 0x0ff3, 0x92d: 0x1017, 0x92e: 0x101b, 0x92f: 0x101f, + 0x930: 0x1043, 0x931: 0x1083, 0x932: 0x1087, 0x933: 0x10a7, 0x934: 0x10b7, 0x935: 0x10bf, + 0x936: 0x10df, 0x937: 0x1103, 0x938: 0x1147, 0x939: 0x114f, 0x93a: 0x1163, 0x93b: 0x116f, + 0x93c: 0x1177, 0x93d: 0x117f, 0x93e: 0x1183, 0x93f: 0x1187, + // Block 0x25, offset 0x940 + 0x940: 0x119f, 0x941: 0x11a3, 0x942: 0x11bf, 0x943: 0x11c7, 0x944: 0x11cf, 0x945: 0x11d3, + 0x946: 0x11df, 0x947: 0x11e7, 0x948: 0x11eb, 0x949: 0x11ef, 0x94a: 0x11f7, 0x94b: 0x11fb, + 0x94c: 0x129b, 0x94d: 0x12af, 0x94e: 0x12e3, 0x94f: 0x12e7, 0x950: 0x12ef, 0x951: 0x131b, + 0x952: 0x1323, 0x953: 0x132b, 0x954: 0x1333, 0x955: 0x136f, 0x956: 0x1373, 0x957: 0x137b, + 0x958: 0x137f, 0x959: 0x1383, 0x95a: 0x13af, 0x95b: 0x13b3, 0x95c: 0x13bb, 0x95d: 0x13cf, + 0x95e: 0x13d3, 0x95f: 0x13ef, 0x960: 0x13f7, 0x961: 0x13fb, 0x962: 0x141f, 0x963: 0x143f, + 0x964: 0x1453, 0x965: 0x1457, 0x966: 0x145f, 0x967: 0x148b, 0x968: 0x148f, 0x969: 0x149f, + 0x96a: 0x14c3, 0x96b: 0x14cf, 0x96c: 0x14df, 0x96d: 0x14f7, 0x96e: 0x14ff, 0x96f: 0x1503, + 0x970: 0x1507, 0x971: 0x150b, 0x972: 0x1517, 0x973: 0x151b, 0x974: 0x1523, 0x975: 0x153f, + 0x976: 0x1543, 0x977: 0x1547, 0x978: 0x155f, 0x979: 0x1563, 0x97a: 0x156b, 0x97b: 0x157f, + 0x97c: 0x1583, 0x97d: 0x1587, 0x97e: 0x158f, 0x97f: 0x1593, + // Block 0x26, offset 0x980 + 0x986: 0xa000, 0x98b: 0xa000, + 0x98c: 0x3f08, 0x98d: 0xa000, 0x98e: 0x3f10, 0x98f: 0xa000, 0x990: 0x3f18, 0x991: 0xa000, + 0x992: 0x3f20, 0x993: 0xa000, 0x994: 0x3f28, 0x995: 0xa000, 0x996: 0x3f30, 0x997: 0xa000, + 0x998: 0x3f38, 0x999: 0xa000, 0x99a: 0x3f40, 0x99b: 0xa000, 0x99c: 0x3f48, 0x99d: 0xa000, + 0x99e: 0x3f50, 0x99f: 0xa000, 0x9a0: 0x3f58, 0x9a1: 0xa000, 0x9a2: 0x3f60, + 0x9a4: 0xa000, 0x9a5: 0x3f68, 0x9a6: 0xa000, 0x9a7: 0x3f70, 0x9a8: 0xa000, 0x9a9: 0x3f78, + 0x9af: 0xa000, + 0x9b0: 0x3f80, 0x9b1: 0x3f88, 0x9b2: 0xa000, 0x9b3: 0x3f90, 0x9b4: 0x3f98, 0x9b5: 0xa000, + 0x9b6: 0x3fa0, 0x9b7: 0x3fa8, 0x9b8: 0xa000, 0x9b9: 0x3fb0, 0x9ba: 0x3fb8, 0x9bb: 0xa000, + 0x9bc: 0x3fc0, 0x9bd: 0x3fc8, + // Block 0x27, offset 0x9c0 + 0x9d4: 0x3f00, + 0x9d9: 0x9903, 0x9da: 0x9903, 0x9db: 0x42dc, 0x9dc: 0x42e2, 0x9dd: 0xa000, + 0x9de: 0x3fd0, 0x9df: 0x26b4, + 0x9e6: 0xa000, + 0x9eb: 0xa000, 0x9ec: 0x3fe0, 0x9ed: 0xa000, 0x9ee: 0x3fe8, 0x9ef: 0xa000, + 0x9f0: 0x3ff0, 0x9f1: 0xa000, 0x9f2: 0x3ff8, 0x9f3: 0xa000, 0x9f4: 0x4000, 0x9f5: 0xa000, + 0x9f6: 0x4008, 0x9f7: 0xa000, 0x9f8: 0x4010, 0x9f9: 0xa000, 0x9fa: 0x4018, 0x9fb: 0xa000, + 0x9fc: 0x4020, 0x9fd: 0xa000, 0x9fe: 0x4028, 0x9ff: 0xa000, + // Block 0x28, offset 0xa00 + 0xa00: 0x4030, 0xa01: 0xa000, 0xa02: 0x4038, 0xa04: 0xa000, 0xa05: 0x4040, + 0xa06: 0xa000, 0xa07: 0x4048, 0xa08: 0xa000, 0xa09: 0x4050, + 0xa0f: 0xa000, 0xa10: 0x4058, 0xa11: 0x4060, + 0xa12: 0xa000, 0xa13: 0x4068, 0xa14: 0x4070, 0xa15: 0xa000, 0xa16: 0x4078, 0xa17: 0x4080, + 0xa18: 0xa000, 0xa19: 0x4088, 0xa1a: 0x4090, 0xa1b: 0xa000, 0xa1c: 0x4098, 0xa1d: 0x40a0, + 0xa2f: 0xa000, + 0xa30: 0xa000, 0xa31: 0xa000, 0xa32: 0xa000, 0xa34: 0x3fd8, + 0xa37: 0x40a8, 0xa38: 0x40b0, 0xa39: 0x40b8, 0xa3a: 0x40c0, + 0xa3d: 0xa000, 0xa3e: 0x40c8, 0xa3f: 0x26c9, + // Block 0x29, offset 0xa40 + 0xa40: 0x0367, 0xa41: 0x032b, 0xa42: 0x032f, 0xa43: 0x0333, 0xa44: 0x037b, 0xa45: 0x0337, + 0xa46: 0x033b, 0xa47: 0x033f, 0xa48: 0x0343, 0xa49: 0x0347, 0xa4a: 0x034b, 0xa4b: 0x034f, + 0xa4c: 0x0353, 0xa4d: 0x0357, 0xa4e: 0x035b, 0xa4f: 0x49bd, 0xa50: 0x49c3, 0xa51: 0x49c9, + 0xa52: 0x49cf, 0xa53: 0x49d5, 0xa54: 0x49db, 0xa55: 0x49e1, 0xa56: 0x49e7, 0xa57: 0x49ed, + 0xa58: 0x49f3, 0xa59: 0x49f9, 0xa5a: 0x49ff, 0xa5b: 0x4a05, 0xa5c: 0x4a0b, 0xa5d: 0x4a11, + 0xa5e: 0x4a17, 0xa5f: 0x4a1d, 0xa60: 0x4a23, 0xa61: 0x4a29, 0xa62: 0x4a2f, 0xa63: 0x4a35, + 0xa64: 0x03c3, 0xa65: 0x035f, 0xa66: 0x0363, 0xa67: 0x03e7, 0xa68: 0x03eb, 0xa69: 0x03ef, + 0xa6a: 0x03f3, 0xa6b: 0x03f7, 0xa6c: 0x03fb, 0xa6d: 0x03ff, 0xa6e: 0x036b, 0xa6f: 0x0403, + 0xa70: 0x0407, 0xa71: 0x036f, 0xa72: 0x0373, 0xa73: 0x0377, 0xa74: 0x037f, 0xa75: 0x0383, + 0xa76: 0x0387, 0xa77: 0x038b, 0xa78: 0x038f, 0xa79: 0x0393, 0xa7a: 0x0397, 0xa7b: 0x039b, + 0xa7c: 0x039f, 0xa7d: 0x03a3, 0xa7e: 0x03a7, 0xa7f: 0x03ab, + // Block 0x2a, offset 0xa80 + 0xa80: 0x03af, 0xa81: 0x03b3, 0xa82: 0x040b, 0xa83: 0x040f, 0xa84: 0x03b7, 0xa85: 0x03bb, + 0xa86: 0x03bf, 0xa87: 0x03c7, 0xa88: 0x03cb, 0xa89: 0x03cf, 0xa8a: 0x03d3, 0xa8b: 0x03d7, + 0xa8c: 0x03db, 0xa8d: 0x03df, 0xa8e: 0x03e3, + 0xa92: 0x06bf, 0xa93: 0x071b, 0xa94: 0x06cb, 0xa95: 0x097b, 0xa96: 0x06cf, 0xa97: 0x06e7, + 0xa98: 0x06d3, 0xa99: 0x0f93, 0xa9a: 0x0707, 0xa9b: 0x06db, 0xa9c: 0x06c3, 0xa9d: 0x09ff, + 0xa9e: 0x098f, 0xa9f: 0x072f, + // Block 0x2b, offset 0xac0 + 0xac0: 0x2054, 0xac1: 0x205a, 0xac2: 0x2060, 0xac3: 0x2066, 0xac4: 0x206c, 0xac5: 0x2072, + 0xac6: 0x2078, 0xac7: 0x207e, 0xac8: 0x2084, 0xac9: 0x208a, 0xaca: 0x2090, 0xacb: 0x2096, + 0xacc: 0x209c, 0xacd: 0x20a2, 0xace: 0x2726, 0xacf: 0x272f, 0xad0: 0x2738, 0xad1: 0x2741, + 0xad2: 0x274a, 0xad3: 0x2753, 0xad4: 0x275c, 0xad5: 0x2765, 0xad6: 0x276e, 0xad7: 0x2780, + 0xad8: 0x2789, 0xad9: 0x2792, 0xada: 0x279b, 0xadb: 0x27a4, 0xadc: 0x2777, 0xadd: 0x2bac, + 0xade: 0x2aed, 0xae0: 0x20a8, 0xae1: 0x20c0, 0xae2: 0x20b4, 0xae3: 0x2108, + 0xae4: 0x20c6, 0xae5: 0x20e4, 0xae6: 0x20ae, 0xae7: 0x20de, 0xae8: 0x20ba, 0xae9: 0x20f0, + 0xaea: 0x2120, 0xaeb: 0x213e, 0xaec: 0x2138, 0xaed: 0x212c, 0xaee: 0x217a, 0xaef: 0x210e, + 0xaf0: 0x211a, 0xaf1: 0x2132, 0xaf2: 0x2126, 0xaf3: 0x2150, 0xaf4: 0x20fc, 0xaf5: 0x2144, + 0xaf6: 0x216e, 0xaf7: 0x2156, 0xaf8: 0x20ea, 0xaf9: 0x20cc, 0xafa: 0x2102, 0xafb: 0x2114, + 0xafc: 0x214a, 0xafd: 0x20d2, 0xafe: 0x2174, 0xaff: 0x20f6, + // Block 0x2c, offset 0xb00 + 0xb00: 0x215c, 0xb01: 0x20d8, 0xb02: 0x2162, 0xb03: 0x2168, 0xb04: 0x092f, 0xb05: 0x0b03, + 0xb06: 0x0ca7, 0xb07: 0x10c7, + 0xb10: 0x1bc4, 0xb11: 0x18a9, + 0xb12: 0x18ac, 0xb13: 0x18af, 0xb14: 0x18b2, 0xb15: 0x18b5, 0xb16: 0x18b8, 0xb17: 0x18bb, + 0xb18: 0x18be, 0xb19: 0x18c1, 0xb1a: 0x18ca, 0xb1b: 0x18cd, 0xb1c: 0x18d0, 0xb1d: 0x18d3, + 0xb1e: 0x18d6, 0xb1f: 0x18d9, 0xb20: 0x0313, 0xb21: 0x031b, 0xb22: 0x031f, 0xb23: 0x0327, + 0xb24: 0x032b, 0xb25: 0x032f, 0xb26: 0x0337, 0xb27: 0x033f, 0xb28: 0x0343, 0xb29: 0x034b, + 0xb2a: 0x034f, 0xb2b: 0x0353, 0xb2c: 0x0357, 0xb2d: 0x035b, 0xb2e: 0x2e18, 0xb2f: 0x2e20, + 0xb30: 0x2e28, 0xb31: 0x2e30, 0xb32: 0x2e38, 0xb33: 0x2e40, 0xb34: 0x2e48, 0xb35: 0x2e50, + 0xb36: 0x2e60, 0xb37: 0x2e68, 0xb38: 0x2e70, 0xb39: 0x2e78, 0xb3a: 0x2e80, 0xb3b: 0x2e88, + 0xb3c: 0x2ed3, 0xb3d: 0x2e9b, 0xb3e: 0x2e58, + // Block 0x2d, offset 0xb40 + 0xb40: 0x06bf, 0xb41: 0x071b, 0xb42: 0x06cb, 0xb43: 0x097b, 0xb44: 0x071f, 0xb45: 0x07af, + 0xb46: 0x06c7, 0xb47: 0x07ab, 0xb48: 0x070b, 0xb49: 0x0887, 0xb4a: 0x0d07, 0xb4b: 0x0e8f, + 0xb4c: 0x0dd7, 0xb4d: 0x0d1b, 0xb4e: 0x145f, 0xb4f: 0x098b, 0xb50: 0x0ccf, 0xb51: 0x0d4b, + 0xb52: 0x0d0b, 0xb53: 0x104b, 0xb54: 0x08fb, 0xb55: 0x0f03, 0xb56: 0x1387, 0xb57: 0x105f, + 0xb58: 0x0843, 0xb59: 0x108f, 0xb5a: 0x0f9b, 0xb5b: 0x0a17, 0xb5c: 0x140f, 0xb5d: 0x077f, + 0xb5e: 0x08ab, 0xb5f: 0x0df7, 0xb60: 0x1527, 0xb61: 0x0743, 0xb62: 0x07d3, 0xb63: 0x0d9b, + 0xb64: 0x06cf, 0xb65: 0x06e7, 0xb66: 0x06d3, 0xb67: 0x0adb, 0xb68: 0x08ef, 0xb69: 0x087f, + 0xb6a: 0x0a57, 0xb6b: 0x0a4b, 0xb6c: 0x0feb, 0xb6d: 0x073f, 0xb6e: 0x139b, 0xb6f: 0x089b, + 0xb70: 0x09f3, 0xb71: 0x18dc, 0xb72: 0x18df, 0xb73: 0x18e2, 0xb74: 0x18e5, 0xb75: 0x18ee, + 0xb76: 0x18f1, 0xb77: 0x18f4, 0xb78: 0x18f7, 0xb79: 0x18fa, 0xb7a: 0x18fd, 0xb7b: 0x1900, + 0xb7c: 0x1903, 0xb7d: 0x1906, 0xb7e: 0x1909, 0xb7f: 0x1912, + // Block 0x2e, offset 0xb80 + 0xb80: 0x1cc6, 0xb81: 0x1cd5, 0xb82: 0x1ce4, 0xb83: 0x1cf3, 0xb84: 0x1d02, 0xb85: 0x1d11, + 0xb86: 0x1d20, 0xb87: 0x1d2f, 0xb88: 0x1d3e, 0xb89: 0x218c, 0xb8a: 0x219e, 0xb8b: 0x21b0, + 0xb8c: 0x1954, 0xb8d: 0x1c04, 0xb8e: 0x19d2, 0xb8f: 0x1ba8, 0xb90: 0x04cb, 0xb91: 0x04d3, + 0xb92: 0x04db, 0xb93: 0x04e3, 0xb94: 0x04eb, 0xb95: 0x04ef, 0xb96: 0x04f3, 0xb97: 0x04f7, + 0xb98: 0x04fb, 0xb99: 0x04ff, 0xb9a: 0x0503, 0xb9b: 0x0507, 0xb9c: 0x050b, 0xb9d: 0x050f, + 0xb9e: 0x0513, 0xb9f: 0x0517, 0xba0: 0x051b, 0xba1: 0x0523, 0xba2: 0x0527, 0xba3: 0x052b, + 0xba4: 0x052f, 0xba5: 0x0533, 0xba6: 0x0537, 0xba7: 0x053b, 0xba8: 0x053f, 0xba9: 0x0543, + 0xbaa: 0x0547, 0xbab: 0x054b, 0xbac: 0x054f, 0xbad: 0x0553, 0xbae: 0x0557, 0xbaf: 0x055b, + 0xbb0: 0x055f, 0xbb1: 0x0563, 0xbb2: 0x0567, 0xbb3: 0x056f, 0xbb4: 0x0577, 0xbb5: 0x057f, + 0xbb6: 0x0583, 0xbb7: 0x0587, 0xbb8: 0x058b, 0xbb9: 0x058f, 0xbba: 0x0593, 0xbbb: 0x0597, + 0xbbc: 0x059b, 0xbbd: 0x059f, 0xbbe: 0x05a3, + // Block 0x2f, offset 0xbc0 + 0xbc0: 0x2b0c, 0xbc1: 0x29a8, 0xbc2: 0x2b1c, 0xbc3: 0x2880, 0xbc4: 0x2ee4, 0xbc5: 0x288a, + 0xbc6: 0x2894, 0xbc7: 0x2f28, 0xbc8: 0x29b5, 0xbc9: 0x289e, 0xbca: 0x28a8, 0xbcb: 0x28b2, + 0xbcc: 0x29dc, 0xbcd: 0x29e9, 0xbce: 0x29c2, 0xbcf: 0x29cf, 0xbd0: 0x2ea9, 0xbd1: 0x29f6, + 0xbd2: 0x2a03, 0xbd3: 0x2bbe, 0xbd4: 0x26bb, 0xbd5: 0x2bd1, 0xbd6: 0x2be4, 0xbd7: 0x2b2c, + 0xbd8: 0x2a10, 0xbd9: 0x2bf7, 0xbda: 0x2c0a, 0xbdb: 0x2a1d, 0xbdc: 0x28bc, 0xbdd: 0x28c6, + 0xbde: 0x2eb7, 0xbdf: 0x2a2a, 0xbe0: 0x2b3c, 0xbe1: 0x2ef5, 0xbe2: 0x28d0, 0xbe3: 0x28da, + 0xbe4: 0x2a37, 0xbe5: 0x28e4, 0xbe6: 0x28ee, 0xbe7: 0x26d0, 0xbe8: 0x26d7, 0xbe9: 0x28f8, + 0xbea: 0x2902, 0xbeb: 0x2c1d, 0xbec: 0x2a44, 0xbed: 0x2b4c, 0xbee: 0x2c30, 0xbef: 0x2a51, + 0xbf0: 0x2916, 0xbf1: 0x290c, 0xbf2: 0x2f3c, 0xbf3: 0x2a5e, 0xbf4: 0x2c43, 0xbf5: 0x2920, + 0xbf6: 0x2b5c, 0xbf7: 0x292a, 0xbf8: 0x2a78, 0xbf9: 0x2934, 0xbfa: 0x2a85, 0xbfb: 0x2f06, + 0xbfc: 0x2a6b, 0xbfd: 0x2b6c, 0xbfe: 0x2a92, 0xbff: 0x26de, + // Block 0x30, offset 0xc00 + 0xc00: 0x2f17, 0xc01: 0x293e, 0xc02: 0x2948, 0xc03: 0x2a9f, 0xc04: 0x2952, 0xc05: 0x295c, + 0xc06: 0x2966, 0xc07: 0x2b7c, 0xc08: 0x2aac, 0xc09: 0x26e5, 0xc0a: 0x2c56, 0xc0b: 0x2e90, + 0xc0c: 0x2b8c, 0xc0d: 0x2ab9, 0xc0e: 0x2ec5, 0xc0f: 0x2970, 0xc10: 0x297a, 0xc11: 0x2ac6, + 0xc12: 0x26ec, 0xc13: 0x2ad3, 0xc14: 0x2b9c, 0xc15: 0x26f3, 0xc16: 0x2c69, 0xc17: 0x2984, + 0xc18: 0x1cb7, 0xc19: 0x1ccb, 0xc1a: 0x1cda, 0xc1b: 0x1ce9, 0xc1c: 0x1cf8, 0xc1d: 0x1d07, + 0xc1e: 0x1d16, 0xc1f: 0x1d25, 0xc20: 0x1d34, 0xc21: 0x1d43, 0xc22: 0x2192, 0xc23: 0x21a4, + 0xc24: 0x21b6, 0xc25: 0x21c2, 0xc26: 0x21ce, 0xc27: 0x21da, 0xc28: 0x21e6, 0xc29: 0x21f2, + 0xc2a: 0x21fe, 0xc2b: 0x220a, 0xc2c: 0x2246, 0xc2d: 0x2252, 0xc2e: 0x225e, 0xc2f: 0x226a, + 0xc30: 0x2276, 0xc31: 0x1c14, 0xc32: 0x19c6, 0xc33: 0x1936, 0xc34: 0x1be4, 0xc35: 0x1a47, + 0xc36: 0x1a56, 0xc37: 0x19cc, 0xc38: 0x1bfc, 0xc39: 0x1c00, 0xc3a: 0x1960, 0xc3b: 0x2701, + 0xc3c: 0x270f, 0xc3d: 0x26fa, 0xc3e: 0x2708, 0xc3f: 0x2ae0, + // Block 0x31, offset 0xc40 + 0xc40: 0x1a4a, 0xc41: 0x1a32, 0xc42: 0x1c60, 0xc43: 0x1a1a, 0xc44: 0x19f3, 0xc45: 0x1969, + 0xc46: 0x1978, 0xc47: 0x1948, 0xc48: 0x1bf0, 0xc49: 0x1d52, 0xc4a: 0x1a4d, 0xc4b: 0x1a35, + 0xc4c: 0x1c64, 0xc4d: 0x1c70, 0xc4e: 0x1a26, 0xc4f: 0x19fc, 0xc50: 0x1957, 0xc51: 0x1c1c, + 0xc52: 0x1bb0, 0xc53: 0x1b9c, 0xc54: 0x1bcc, 0xc55: 0x1c74, 0xc56: 0x1a29, 0xc57: 0x19c9, + 0xc58: 0x19ff, 0xc59: 0x19de, 0xc5a: 0x1a41, 0xc5b: 0x1c78, 0xc5c: 0x1a2c, 0xc5d: 0x19c0, + 0xc5e: 0x1a02, 0xc5f: 0x1c3c, 0xc60: 0x1bf4, 0xc61: 0x1a14, 0xc62: 0x1c24, 0xc63: 0x1c40, + 0xc64: 0x1bf8, 0xc65: 0x1a17, 0xc66: 0x1c28, 0xc67: 0x22e8, 0xc68: 0x22fc, 0xc69: 0x1996, + 0xc6a: 0x1c20, 0xc6b: 0x1bb4, 0xc6c: 0x1ba0, 0xc6d: 0x1c48, 0xc6e: 0x2716, 0xc6f: 0x27ad, + 0xc70: 0x1a59, 0xc71: 0x1a44, 0xc72: 0x1c7c, 0xc73: 0x1a2f, 0xc74: 0x1a50, 0xc75: 0x1a38, + 0xc76: 0x1c68, 0xc77: 0x1a1d, 0xc78: 0x19f6, 0xc79: 0x1981, 0xc7a: 0x1a53, 0xc7b: 0x1a3b, + 0xc7c: 0x1c6c, 0xc7d: 0x1a20, 0xc7e: 0x19f9, 0xc7f: 0x1984, + // Block 0x32, offset 0xc80 + 0xc80: 0x1c2c, 0xc81: 0x1bb8, 0xc82: 0x1d4d, 0xc83: 0x1939, 0xc84: 0x19ba, 0xc85: 0x19bd, + 0xc86: 0x22f5, 0xc87: 0x1b94, 0xc88: 0x19c3, 0xc89: 0x194b, 0xc8a: 0x19e1, 0xc8b: 0x194e, + 0xc8c: 0x19ea, 0xc8d: 0x196c, 0xc8e: 0x196f, 0xc8f: 0x1a05, 0xc90: 0x1a0b, 0xc91: 0x1a0e, + 0xc92: 0x1c30, 0xc93: 0x1a11, 0xc94: 0x1a23, 0xc95: 0x1c38, 0xc96: 0x1c44, 0xc97: 0x1990, + 0xc98: 0x1d57, 0xc99: 0x1bbc, 0xc9a: 0x1993, 0xc9b: 0x1a5c, 0xc9c: 0x19a5, 0xc9d: 0x19b4, + 0xc9e: 0x22e2, 0xc9f: 0x22dc, 0xca0: 0x1cc1, 0xca1: 0x1cd0, 0xca2: 0x1cdf, 0xca3: 0x1cee, + 0xca4: 0x1cfd, 0xca5: 0x1d0c, 0xca6: 0x1d1b, 0xca7: 0x1d2a, 0xca8: 0x1d39, 0xca9: 0x2186, + 0xcaa: 0x2198, 0xcab: 0x21aa, 0xcac: 0x21bc, 0xcad: 0x21c8, 0xcae: 0x21d4, 0xcaf: 0x21e0, + 0xcb0: 0x21ec, 0xcb1: 0x21f8, 0xcb2: 0x2204, 0xcb3: 0x2240, 0xcb4: 0x224c, 0xcb5: 0x2258, + 0xcb6: 0x2264, 0xcb7: 0x2270, 0xcb8: 0x227c, 0xcb9: 0x2282, 0xcba: 0x2288, 0xcbb: 0x228e, + 0xcbc: 0x2294, 0xcbd: 0x22a6, 0xcbe: 0x22ac, 0xcbf: 0x1c10, + // Block 0x33, offset 0xcc0 + 0xcc0: 0x1377, 0xcc1: 0x0cfb, 0xcc2: 0x13d3, 0xcc3: 0x139f, 0xcc4: 0x0e57, 0xcc5: 0x06eb, + 0xcc6: 0x08df, 0xcc7: 0x162b, 0xcc8: 0x162b, 0xcc9: 0x0a0b, 0xcca: 0x145f, 0xccb: 0x0943, + 0xccc: 0x0a07, 0xccd: 0x0bef, 0xcce: 0x0fcf, 0xccf: 0x115f, 0xcd0: 0x1297, 0xcd1: 0x12d3, + 0xcd2: 0x1307, 0xcd3: 0x141b, 0xcd4: 0x0d73, 0xcd5: 0x0dff, 0xcd6: 0x0eab, 0xcd7: 0x0f43, + 0xcd8: 0x125f, 0xcd9: 0x1447, 0xcda: 0x1573, 0xcdb: 0x070f, 0xcdc: 0x08b3, 0xcdd: 0x0d87, + 0xcde: 0x0ecf, 0xcdf: 0x1293, 0xce0: 0x15c3, 0xce1: 0x0ab3, 0xce2: 0x0e77, 0xce3: 0x1283, + 0xce4: 0x1317, 0xce5: 0x0c23, 0xce6: 0x11bb, 0xce7: 0x12df, 0xce8: 0x0b1f, 0xce9: 0x0d0f, + 0xcea: 0x0e17, 0xceb: 0x0f1b, 0xcec: 0x1427, 0xced: 0x074f, 0xcee: 0x07e7, 0xcef: 0x0853, + 0xcf0: 0x0c8b, 0xcf1: 0x0d7f, 0xcf2: 0x0ecb, 0xcf3: 0x0fef, 0xcf4: 0x1177, 0xcf5: 0x128b, + 0xcf6: 0x12a3, 0xcf7: 0x13c7, 0xcf8: 0x14ef, 0xcf9: 0x15a3, 0xcfa: 0x15bf, 0xcfb: 0x102b, + 0xcfc: 0x106b, 0xcfd: 0x1123, 0xcfe: 0x1243, 0xcff: 0x147b, + // Block 0x34, offset 0xd00 + 0xd00: 0x15cb, 0xd01: 0x134b, 0xd02: 0x09c7, 0xd03: 0x0b3b, 0xd04: 0x10db, 0xd05: 0x119b, + 0xd06: 0x0eff, 0xd07: 0x1033, 0xd08: 0x1397, 0xd09: 0x14e7, 0xd0a: 0x09c3, 0xd0b: 0x0a8f, + 0xd0c: 0x0d77, 0xd0d: 0x0e2b, 0xd0e: 0x0e5f, 0xd0f: 0x1113, 0xd10: 0x113b, 0xd11: 0x14a7, + 0xd12: 0x084f, 0xd13: 0x11a7, 0xd14: 0x07f3, 0xd15: 0x07ef, 0xd16: 0x1097, 0xd17: 0x1127, + 0xd18: 0x125b, 0xd19: 0x14af, 0xd1a: 0x1367, 0xd1b: 0x0c27, 0xd1c: 0x0d73, 0xd1d: 0x1357, + 0xd1e: 0x06f7, 0xd1f: 0x0a63, 0xd20: 0x0b93, 0xd21: 0x0f2f, 0xd22: 0x0faf, 0xd23: 0x0873, + 0xd24: 0x103b, 0xd25: 0x075f, 0xd26: 0x0b77, 0xd27: 0x06d7, 0xd28: 0x0deb, 0xd29: 0x0ca3, + 0xd2a: 0x110f, 0xd2b: 0x08c7, 0xd2c: 0x09b3, 0xd2d: 0x0ffb, 0xd2e: 0x1263, 0xd2f: 0x133b, + 0xd30: 0x0db7, 0xd31: 0x13f7, 0xd32: 0x0de3, 0xd33: 0x0c37, 0xd34: 0x121b, 0xd35: 0x0c57, + 0xd36: 0x0fab, 0xd37: 0x072b, 0xd38: 0x07a7, 0xd39: 0x07eb, 0xd3a: 0x0d53, 0xd3b: 0x10fb, + 0xd3c: 0x11f3, 0xd3d: 0x1347, 0xd3e: 0x145b, 0xd3f: 0x085b, + // Block 0x35, offset 0xd40 + 0xd40: 0x090f, 0xd41: 0x0a17, 0xd42: 0x0b2f, 0xd43: 0x0cbf, 0xd44: 0x0e7b, 0xd45: 0x103f, + 0xd46: 0x1497, 0xd47: 0x157b, 0xd48: 0x15cf, 0xd49: 0x15e7, 0xd4a: 0x0837, 0xd4b: 0x0cf3, + 0xd4c: 0x0da3, 0xd4d: 0x13eb, 0xd4e: 0x0afb, 0xd4f: 0x0bd7, 0xd50: 0x0bf3, 0xd51: 0x0c83, + 0xd52: 0x0e6b, 0xd53: 0x0eb7, 0xd54: 0x0f67, 0xd55: 0x108b, 0xd56: 0x112f, 0xd57: 0x1193, + 0xd58: 0x13db, 0xd59: 0x126b, 0xd5a: 0x1403, 0xd5b: 0x147f, 0xd5c: 0x080f, 0xd5d: 0x083b, + 0xd5e: 0x0923, 0xd5f: 0x0ea7, 0xd60: 0x12f3, 0xd61: 0x133b, 0xd62: 0x0b1b, 0xd63: 0x0b8b, + 0xd64: 0x0c4f, 0xd65: 0x0daf, 0xd66: 0x10d7, 0xd67: 0x0f23, 0xd68: 0x073b, 0xd69: 0x097f, + 0xd6a: 0x0a63, 0xd6b: 0x0ac7, 0xd6c: 0x0b97, 0xd6d: 0x0f3f, 0xd6e: 0x0f5b, 0xd6f: 0x116b, + 0xd70: 0x118b, 0xd71: 0x1463, 0xd72: 0x14e3, 0xd73: 0x14f3, 0xd74: 0x152f, 0xd75: 0x0753, + 0xd76: 0x107f, 0xd77: 0x144f, 0xd78: 0x14cb, 0xd79: 0x0baf, 0xd7a: 0x0717, 0xd7b: 0x0777, + 0xd7c: 0x0a67, 0xd7d: 0x0a87, 0xd7e: 0x0caf, 0xd7f: 0x0d73, + // Block 0x36, offset 0xd80 + 0xd80: 0x0ec3, 0xd81: 0x0fcb, 0xd82: 0x1277, 0xd83: 0x1417, 0xd84: 0x1623, 0xd85: 0x0ce3, + 0xd86: 0x14a3, 0xd87: 0x0833, 0xd88: 0x0d2f, 0xd89: 0x0d3b, 0xd8a: 0x0e0f, 0xd8b: 0x0e47, + 0xd8c: 0x0f4b, 0xd8d: 0x0fa7, 0xd8e: 0x1027, 0xd8f: 0x110b, 0xd90: 0x153b, 0xd91: 0x07af, + 0xd92: 0x0c03, 0xd93: 0x14b3, 0xd94: 0x0767, 0xd95: 0x0aab, 0xd96: 0x0e2f, 0xd97: 0x13df, + 0xd98: 0x0b67, 0xd99: 0x0bb7, 0xd9a: 0x0d43, 0xd9b: 0x0f2f, 0xd9c: 0x14bb, 0xd9d: 0x0817, + 0xd9e: 0x08ff, 0xd9f: 0x0a97, 0xda0: 0x0cd3, 0xda1: 0x0d1f, 0xda2: 0x0d5f, 0xda3: 0x0df3, + 0xda4: 0x0f47, 0xda5: 0x0fbb, 0xda6: 0x1157, 0xda7: 0x12f7, 0xda8: 0x1303, 0xda9: 0x1457, + 0xdaa: 0x14d7, 0xdab: 0x0883, 0xdac: 0x0e4b, 0xdad: 0x0903, 0xdae: 0x0ec7, 0xdaf: 0x0f6b, + 0xdb0: 0x1287, 0xdb1: 0x14bf, 0xdb2: 0x15ab, 0xdb3: 0x15d3, 0xdb4: 0x0d37, 0xdb5: 0x0e27, + 0xdb6: 0x11c3, 0xdb7: 0x10b7, 0xdb8: 0x10c3, 0xdb9: 0x10e7, 0xdba: 0x0f17, 0xdbb: 0x0e9f, + 0xdbc: 0x1363, 0xdbd: 0x0733, 0xdbe: 0x122b, 0xdbf: 0x081b, + // Block 0x37, offset 0xdc0 + 0xdc0: 0x080b, 0xdc1: 0x0b0b, 0xdc2: 0x0c2b, 0xdc3: 0x10f3, 0xdc4: 0x0a53, 0xdc5: 0x0e03, + 0xdc6: 0x0cef, 0xdc7: 0x13e7, 0xdc8: 0x12e7, 0xdc9: 0x14ab, 0xdca: 0x1323, 0xdcb: 0x0b27, + 0xdcc: 0x0787, 0xdcd: 0x095b, 0xdd0: 0x09af, + 0xdd2: 0x0cdf, 0xdd5: 0x07f7, 0xdd6: 0x0f1f, 0xdd7: 0x0fe3, + 0xdd8: 0x1047, 0xdd9: 0x1063, 0xdda: 0x1067, 0xddb: 0x107b, 0xddc: 0x14fb, 0xddd: 0x10eb, + 0xdde: 0x116f, 0xde0: 0x128f, 0xde2: 0x1353, + 0xde5: 0x1407, 0xde6: 0x1433, + 0xdea: 0x154f, 0xdeb: 0x1553, 0xdec: 0x1557, 0xded: 0x15bb, 0xdee: 0x142b, 0xdef: 0x14c7, + 0xdf0: 0x0757, 0xdf1: 0x077b, 0xdf2: 0x078f, 0xdf3: 0x084b, 0xdf4: 0x0857, 0xdf5: 0x0897, + 0xdf6: 0x094b, 0xdf7: 0x0967, 0xdf8: 0x096f, 0xdf9: 0x09ab, 0xdfa: 0x09b7, 0xdfb: 0x0a93, + 0xdfc: 0x0a9b, 0xdfd: 0x0ba3, 0xdfe: 0x0bcb, 0xdff: 0x0bd3, + // Block 0x38, offset 0xe00 + 0xe00: 0x0beb, 0xe01: 0x0c97, 0xe02: 0x0cc7, 0xe03: 0x0ce7, 0xe04: 0x0d57, 0xe05: 0x0e1b, + 0xe06: 0x0e37, 0xe07: 0x0e67, 0xe08: 0x0ebb, 0xe09: 0x0edb, 0xe0a: 0x0f4f, 0xe0b: 0x102f, + 0xe0c: 0x104b, 0xe0d: 0x1053, 0xe0e: 0x104f, 0xe0f: 0x1057, 0xe10: 0x105b, 0xe11: 0x105f, + 0xe12: 0x1073, 0xe13: 0x1077, 0xe14: 0x109b, 0xe15: 0x10af, 0xe16: 0x10cb, 0xe17: 0x112f, + 0xe18: 0x1137, 0xe19: 0x113f, 0xe1a: 0x1153, 0xe1b: 0x117b, 0xe1c: 0x11cb, 0xe1d: 0x11ff, + 0xe1e: 0x11ff, 0xe1f: 0x1267, 0xe20: 0x130f, 0xe21: 0x1327, 0xe22: 0x135b, 0xe23: 0x135f, + 0xe24: 0x13a3, 0xe25: 0x13a7, 0xe26: 0x13ff, 0xe27: 0x1407, 0xe28: 0x14db, 0xe29: 0x151f, + 0xe2a: 0x1537, 0xe2b: 0x0b9b, 0xe2c: 0x171e, 0xe2d: 0x11e3, + 0xe30: 0x06df, 0xe31: 0x07e3, 0xe32: 0x07a3, 0xe33: 0x074b, 0xe34: 0x078b, 0xe35: 0x07b7, + 0xe36: 0x0847, 0xe37: 0x0863, 0xe38: 0x094b, 0xe39: 0x0937, 0xe3a: 0x0947, 0xe3b: 0x0963, + 0xe3c: 0x09af, 0xe3d: 0x09bf, 0xe3e: 0x0a03, 0xe3f: 0x0a0f, + // Block 0x39, offset 0xe40 + 0xe40: 0x0a2b, 0xe41: 0x0a3b, 0xe42: 0x0b23, 0xe43: 0x0b2b, 0xe44: 0x0b5b, 0xe45: 0x0b7b, + 0xe46: 0x0bab, 0xe47: 0x0bc3, 0xe48: 0x0bb3, 0xe49: 0x0bd3, 0xe4a: 0x0bc7, 0xe4b: 0x0beb, + 0xe4c: 0x0c07, 0xe4d: 0x0c5f, 0xe4e: 0x0c6b, 0xe4f: 0x0c73, 0xe50: 0x0c9b, 0xe51: 0x0cdf, + 0xe52: 0x0d0f, 0xe53: 0x0d13, 0xe54: 0x0d27, 0xe55: 0x0da7, 0xe56: 0x0db7, 0xe57: 0x0e0f, + 0xe58: 0x0e5b, 0xe59: 0x0e53, 0xe5a: 0x0e67, 0xe5b: 0x0e83, 0xe5c: 0x0ebb, 0xe5d: 0x1013, + 0xe5e: 0x0edf, 0xe5f: 0x0f13, 0xe60: 0x0f1f, 0xe61: 0x0f5f, 0xe62: 0x0f7b, 0xe63: 0x0f9f, + 0xe64: 0x0fc3, 0xe65: 0x0fc7, 0xe66: 0x0fe3, 0xe67: 0x0fe7, 0xe68: 0x0ff7, 0xe69: 0x100b, + 0xe6a: 0x1007, 0xe6b: 0x1037, 0xe6c: 0x10b3, 0xe6d: 0x10cb, 0xe6e: 0x10e3, 0xe6f: 0x111b, + 0xe70: 0x112f, 0xe71: 0x114b, 0xe72: 0x117b, 0xe73: 0x122f, 0xe74: 0x1257, 0xe75: 0x12cb, + 0xe76: 0x1313, 0xe77: 0x131f, 0xe78: 0x1327, 0xe79: 0x133f, 0xe7a: 0x1353, 0xe7b: 0x1343, + 0xe7c: 0x135b, 0xe7d: 0x1357, 0xe7e: 0x134f, 0xe7f: 0x135f, + // Block 0x3a, offset 0xe80 + 0xe80: 0x136b, 0xe81: 0x13a7, 0xe82: 0x13e3, 0xe83: 0x1413, 0xe84: 0x144b, 0xe85: 0x146b, + 0xe86: 0x14b7, 0xe87: 0x14db, 0xe88: 0x14fb, 0xe89: 0x150f, 0xe8a: 0x151f, 0xe8b: 0x152b, + 0xe8c: 0x1537, 0xe8d: 0x158b, 0xe8e: 0x162b, 0xe8f: 0x16b5, 0xe90: 0x16b0, 0xe91: 0x16e2, + 0xe92: 0x0607, 0xe93: 0x062f, 0xe94: 0x0633, 0xe95: 0x1764, 0xe96: 0x1791, 0xe97: 0x1809, + 0xe98: 0x1617, 0xe99: 0x1627, + // Block 0x3b, offset 0xec0 + 0xec0: 0x19d5, 0xec1: 0x19d8, 0xec2: 0x19db, 0xec3: 0x1c08, 0xec4: 0x1c0c, 0xec5: 0x1a5f, + 0xec6: 0x1a5f, + 0xed3: 0x1d75, 0xed4: 0x1d66, 0xed5: 0x1d6b, 0xed6: 0x1d7a, 0xed7: 0x1d70, + 0xedd: 0x4390, + 0xede: 0x8115, 0xedf: 0x4402, 0xee0: 0x022d, 0xee1: 0x0215, 0xee2: 0x021e, 0xee3: 0x0221, + 0xee4: 0x0224, 0xee5: 0x0227, 0xee6: 0x022a, 0xee7: 0x0230, 0xee8: 0x0233, 0xee9: 0x0017, + 0xeea: 0x43f0, 0xeeb: 0x43f6, 0xeec: 0x44f4, 0xeed: 0x44fc, 0xeee: 0x4348, 0xeef: 0x434e, + 0xef0: 0x4354, 0xef1: 0x435a, 0xef2: 0x4366, 0xef3: 0x436c, 0xef4: 0x4372, 0xef5: 0x437e, + 0xef6: 0x4384, 0xef8: 0x438a, 0xef9: 0x4396, 0xefa: 0x439c, 0xefb: 0x43a2, + 0xefc: 0x43ae, 0xefe: 0x43b4, + // Block 0x3c, offset 0xf00 + 0xf00: 0x43ba, 0xf01: 0x43c0, 0xf03: 0x43c6, 0xf04: 0x43cc, + 0xf06: 0x43d8, 0xf07: 0x43de, 0xf08: 0x43e4, 0xf09: 0x43ea, 0xf0a: 0x43fc, 0xf0b: 0x4378, + 0xf0c: 0x4360, 0xf0d: 0x43a8, 0xf0e: 0x43d2, 0xf0f: 0x1d7f, 0xf10: 0x0299, 0xf11: 0x0299, + 0xf12: 0x02a2, 0xf13: 0x02a2, 0xf14: 0x02a2, 0xf15: 0x02a2, 0xf16: 0x02a5, 0xf17: 0x02a5, + 0xf18: 0x02a5, 0xf19: 0x02a5, 0xf1a: 0x02ab, 0xf1b: 0x02ab, 0xf1c: 0x02ab, 0xf1d: 0x02ab, + 0xf1e: 0x029f, 0xf1f: 0x029f, 0xf20: 0x029f, 0xf21: 0x029f, 0xf22: 0x02a8, 0xf23: 0x02a8, + 0xf24: 0x02a8, 0xf25: 0x02a8, 0xf26: 0x029c, 0xf27: 0x029c, 0xf28: 0x029c, 0xf29: 0x029c, + 0xf2a: 0x02cf, 0xf2b: 0x02cf, 0xf2c: 0x02cf, 0xf2d: 0x02cf, 0xf2e: 0x02d2, 0xf2f: 0x02d2, + 0xf30: 0x02d2, 0xf31: 0x02d2, 0xf32: 0x02b1, 0xf33: 0x02b1, 0xf34: 0x02b1, 0xf35: 0x02b1, + 0xf36: 0x02ae, 0xf37: 0x02ae, 0xf38: 0x02ae, 0xf39: 0x02ae, 0xf3a: 0x02b4, 0xf3b: 0x02b4, + 0xf3c: 0x02b4, 0xf3d: 0x02b4, 0xf3e: 0x02b7, 0xf3f: 0x02b7, + // Block 0x3d, offset 0xf40 + 0xf40: 0x02b7, 0xf41: 0x02b7, 0xf42: 0x02c0, 0xf43: 0x02c0, 0xf44: 0x02bd, 0xf45: 0x02bd, + 0xf46: 0x02c3, 0xf47: 0x02c3, 0xf48: 0x02ba, 0xf49: 0x02ba, 0xf4a: 0x02c9, 0xf4b: 0x02c9, + 0xf4c: 0x02c6, 0xf4d: 0x02c6, 0xf4e: 0x02d5, 0xf4f: 0x02d5, 0xf50: 0x02d5, 0xf51: 0x02d5, + 0xf52: 0x02db, 0xf53: 0x02db, 0xf54: 0x02db, 0xf55: 0x02db, 0xf56: 0x02e1, 0xf57: 0x02e1, + 0xf58: 0x02e1, 0xf59: 0x02e1, 0xf5a: 0x02de, 0xf5b: 0x02de, 0xf5c: 0x02de, 0xf5d: 0x02de, + 0xf5e: 0x02e4, 0xf5f: 0x02e4, 0xf60: 0x02e7, 0xf61: 0x02e7, 0xf62: 0x02e7, 0xf63: 0x02e7, + 0xf64: 0x446e, 0xf65: 0x446e, 0xf66: 0x02ed, 0xf67: 0x02ed, 0xf68: 0x02ed, 0xf69: 0x02ed, + 0xf6a: 0x02ea, 0xf6b: 0x02ea, 0xf6c: 0x02ea, 0xf6d: 0x02ea, 0xf6e: 0x0308, 0xf6f: 0x0308, + 0xf70: 0x4468, 0xf71: 0x4468, + // Block 0x3e, offset 0xf80 + 0xf93: 0x02d8, 0xf94: 0x02d8, 0xf95: 0x02d8, 0xf96: 0x02d8, 0xf97: 0x02f6, + 0xf98: 0x02f6, 0xf99: 0x02f3, 0xf9a: 0x02f3, 0xf9b: 0x02f9, 0xf9c: 0x02f9, 0xf9d: 0x204f, + 0xf9e: 0x02ff, 0xf9f: 0x02ff, 0xfa0: 0x02f0, 0xfa1: 0x02f0, 0xfa2: 0x02fc, 0xfa3: 0x02fc, + 0xfa4: 0x0305, 0xfa5: 0x0305, 0xfa6: 0x0305, 0xfa7: 0x0305, 0xfa8: 0x028d, 0xfa9: 0x028d, + 0xfaa: 0x25aa, 0xfab: 0x25aa, 0xfac: 0x261a, 0xfad: 0x261a, 0xfae: 0x25e9, 0xfaf: 0x25e9, + 0xfb0: 0x2605, 0xfb1: 0x2605, 0xfb2: 0x25fe, 0xfb3: 0x25fe, 0xfb4: 0x260c, 0xfb5: 0x260c, + 0xfb6: 0x2613, 0xfb7: 0x2613, 0xfb8: 0x2613, 0xfb9: 0x25f0, 0xfba: 0x25f0, 0xfbb: 0x25f0, + 0xfbc: 0x0302, 0xfbd: 0x0302, 0xfbe: 0x0302, 0xfbf: 0x0302, + // Block 0x3f, offset 0xfc0 + 0xfc0: 0x25b1, 0xfc1: 0x25b8, 0xfc2: 0x25d4, 0xfc3: 0x25f0, 0xfc4: 0x25f7, 0xfc5: 0x1d89, + 0xfc6: 0x1d8e, 0xfc7: 0x1d93, 0xfc8: 0x1da2, 0xfc9: 0x1db1, 0xfca: 0x1db6, 0xfcb: 0x1dbb, + 0xfcc: 0x1dc0, 0xfcd: 0x1dc5, 0xfce: 0x1dd4, 0xfcf: 0x1de3, 0xfd0: 0x1de8, 0xfd1: 0x1ded, + 0xfd2: 0x1dfc, 0xfd3: 0x1e0b, 0xfd4: 0x1e10, 0xfd5: 0x1e15, 0xfd6: 0x1e1a, 0xfd7: 0x1e29, + 0xfd8: 0x1e2e, 0xfd9: 0x1e3d, 0xfda: 0x1e42, 0xfdb: 0x1e47, 0xfdc: 0x1e56, 0xfdd: 0x1e5b, + 0xfde: 0x1e60, 0xfdf: 0x1e6a, 0xfe0: 0x1ea6, 0xfe1: 0x1eb5, 0xfe2: 0x1ec4, 0xfe3: 0x1ec9, + 0xfe4: 0x1ece, 0xfe5: 0x1ed8, 0xfe6: 0x1ee7, 0xfe7: 0x1eec, 0xfe8: 0x1efb, 0xfe9: 0x1f00, + 0xfea: 0x1f05, 0xfeb: 0x1f14, 0xfec: 0x1f19, 0xfed: 0x1f28, 0xfee: 0x1f2d, 0xfef: 0x1f32, + 0xff0: 0x1f37, 0xff1: 0x1f3c, 0xff2: 0x1f41, 0xff3: 0x1f46, 0xff4: 0x1f4b, 0xff5: 0x1f50, + 0xff6: 0x1f55, 0xff7: 0x1f5a, 0xff8: 0x1f5f, 0xff9: 0x1f64, 0xffa: 0x1f69, 0xffb: 0x1f6e, + 0xffc: 0x1f73, 0xffd: 0x1f78, 0xffe: 0x1f7d, 0xfff: 0x1f87, + // Block 0x40, offset 0x1000 + 0x1000: 0x1f8c, 0x1001: 0x1f91, 0x1002: 0x1f96, 0x1003: 0x1fa0, 0x1004: 0x1fa5, 0x1005: 0x1faf, + 0x1006: 0x1fb4, 0x1007: 0x1fb9, 0x1008: 0x1fbe, 0x1009: 0x1fc3, 0x100a: 0x1fc8, 0x100b: 0x1fcd, + 0x100c: 0x1fd2, 0x100d: 0x1fd7, 0x100e: 0x1fe6, 0x100f: 0x1ff5, 0x1010: 0x1ffa, 0x1011: 0x1fff, + 0x1012: 0x2004, 0x1013: 0x2009, 0x1014: 0x200e, 0x1015: 0x2018, 0x1016: 0x201d, 0x1017: 0x2022, + 0x1018: 0x2031, 0x1019: 0x2040, 0x101a: 0x2045, 0x101b: 0x4420, 0x101c: 0x4426, 0x101d: 0x445c, + 0x101e: 0x44b3, 0x101f: 0x44ba, 0x1020: 0x44c1, 0x1021: 0x44c8, 0x1022: 0x44cf, 0x1023: 0x44d6, + 0x1024: 0x25c6, 0x1025: 0x25cd, 0x1026: 0x25d4, 0x1027: 0x25db, 0x1028: 0x25f0, 0x1029: 0x25f7, + 0x102a: 0x1d98, 0x102b: 0x1d9d, 0x102c: 0x1da2, 0x102d: 0x1da7, 0x102e: 0x1db1, 0x102f: 0x1db6, + 0x1030: 0x1dca, 0x1031: 0x1dcf, 0x1032: 0x1dd4, 0x1033: 0x1dd9, 0x1034: 0x1de3, 0x1035: 0x1de8, + 0x1036: 0x1df2, 0x1037: 0x1df7, 0x1038: 0x1dfc, 0x1039: 0x1e01, 0x103a: 0x1e0b, 0x103b: 0x1e10, + 0x103c: 0x1f3c, 0x103d: 0x1f41, 0x103e: 0x1f50, 0x103f: 0x1f55, + // Block 0x41, offset 0x1040 + 0x1040: 0x1f5a, 0x1041: 0x1f6e, 0x1042: 0x1f73, 0x1043: 0x1f78, 0x1044: 0x1f7d, 0x1045: 0x1f96, + 0x1046: 0x1fa0, 0x1047: 0x1fa5, 0x1048: 0x1faa, 0x1049: 0x1fbe, 0x104a: 0x1fdc, 0x104b: 0x1fe1, + 0x104c: 0x1fe6, 0x104d: 0x1feb, 0x104e: 0x1ff5, 0x104f: 0x1ffa, 0x1050: 0x445c, 0x1051: 0x2027, + 0x1052: 0x202c, 0x1053: 0x2031, 0x1054: 0x2036, 0x1055: 0x2040, 0x1056: 0x2045, 0x1057: 0x25b1, + 0x1058: 0x25b8, 0x1059: 0x25bf, 0x105a: 0x25d4, 0x105b: 0x25e2, 0x105c: 0x1d89, 0x105d: 0x1d8e, + 0x105e: 0x1d93, 0x105f: 0x1da2, 0x1060: 0x1dac, 0x1061: 0x1dbb, 0x1062: 0x1dc0, 0x1063: 0x1dc5, + 0x1064: 0x1dd4, 0x1065: 0x1dde, 0x1066: 0x1dfc, 0x1067: 0x1e15, 0x1068: 0x1e1a, 0x1069: 0x1e29, + 0x106a: 0x1e2e, 0x106b: 0x1e3d, 0x106c: 0x1e47, 0x106d: 0x1e56, 0x106e: 0x1e5b, 0x106f: 0x1e60, + 0x1070: 0x1e6a, 0x1071: 0x1ea6, 0x1072: 0x1eab, 0x1073: 0x1eb5, 0x1074: 0x1ec4, 0x1075: 0x1ec9, + 0x1076: 0x1ece, 0x1077: 0x1ed8, 0x1078: 0x1ee7, 0x1079: 0x1efb, 0x107a: 0x1f00, 0x107b: 0x1f05, + 0x107c: 0x1f14, 0x107d: 0x1f19, 0x107e: 0x1f28, 0x107f: 0x1f2d, + // Block 0x42, offset 0x1080 + 0x1080: 0x1f32, 0x1081: 0x1f37, 0x1082: 0x1f46, 0x1083: 0x1f4b, 0x1084: 0x1f5f, 0x1085: 0x1f64, + 0x1086: 0x1f69, 0x1087: 0x1f6e, 0x1088: 0x1f73, 0x1089: 0x1f87, 0x108a: 0x1f8c, 0x108b: 0x1f91, + 0x108c: 0x1f96, 0x108d: 0x1f9b, 0x108e: 0x1faf, 0x108f: 0x1fb4, 0x1090: 0x1fb9, 0x1091: 0x1fbe, + 0x1092: 0x1fcd, 0x1093: 0x1fd2, 0x1094: 0x1fd7, 0x1095: 0x1fe6, 0x1096: 0x1ff0, 0x1097: 0x1fff, + 0x1098: 0x2004, 0x1099: 0x4450, 0x109a: 0x2018, 0x109b: 0x201d, 0x109c: 0x2022, 0x109d: 0x2031, + 0x109e: 0x203b, 0x109f: 0x25d4, 0x10a0: 0x25e2, 0x10a1: 0x1da2, 0x10a2: 0x1dac, 0x10a3: 0x1dd4, + 0x10a4: 0x1dde, 0x10a5: 0x1dfc, 0x10a6: 0x1e06, 0x10a7: 0x1e6a, 0x10a8: 0x1e6f, 0x10a9: 0x1e92, + 0x10aa: 0x1e97, 0x10ab: 0x1f6e, 0x10ac: 0x1f73, 0x10ad: 0x1f96, 0x10ae: 0x1fe6, 0x10af: 0x1ff0, + 0x10b0: 0x2031, 0x10b1: 0x203b, 0x10b2: 0x4504, 0x10b3: 0x450c, 0x10b4: 0x4514, 0x10b5: 0x1ef1, + 0x10b6: 0x1ef6, 0x10b7: 0x1f0a, 0x10b8: 0x1f0f, 0x10b9: 0x1f1e, 0x10ba: 0x1f23, 0x10bb: 0x1e74, + 0x10bc: 0x1e79, 0x10bd: 0x1e9c, 0x10be: 0x1ea1, 0x10bf: 0x1e33, + // Block 0x43, offset 0x10c0 + 0x10c0: 0x1e38, 0x10c1: 0x1e1f, 0x10c2: 0x1e24, 0x10c3: 0x1e4c, 0x10c4: 0x1e51, 0x10c5: 0x1eba, + 0x10c6: 0x1ebf, 0x10c7: 0x1edd, 0x10c8: 0x1ee2, 0x10c9: 0x1e7e, 0x10ca: 0x1e83, 0x10cb: 0x1e88, + 0x10cc: 0x1e92, 0x10cd: 0x1e8d, 0x10ce: 0x1e65, 0x10cf: 0x1eb0, 0x10d0: 0x1ed3, 0x10d1: 0x1ef1, + 0x10d2: 0x1ef6, 0x10d3: 0x1f0a, 0x10d4: 0x1f0f, 0x10d5: 0x1f1e, 0x10d6: 0x1f23, 0x10d7: 0x1e74, + 0x10d8: 0x1e79, 0x10d9: 0x1e9c, 0x10da: 0x1ea1, 0x10db: 0x1e33, 0x10dc: 0x1e38, 0x10dd: 0x1e1f, + 0x10de: 0x1e24, 0x10df: 0x1e4c, 0x10e0: 0x1e51, 0x10e1: 0x1eba, 0x10e2: 0x1ebf, 0x10e3: 0x1edd, + 0x10e4: 0x1ee2, 0x10e5: 0x1e7e, 0x10e6: 0x1e83, 0x10e7: 0x1e88, 0x10e8: 0x1e92, 0x10e9: 0x1e8d, + 0x10ea: 0x1e65, 0x10eb: 0x1eb0, 0x10ec: 0x1ed3, 0x10ed: 0x1e7e, 0x10ee: 0x1e83, 0x10ef: 0x1e88, + 0x10f0: 0x1e92, 0x10f1: 0x1e6f, 0x10f2: 0x1e97, 0x10f3: 0x1eec, 0x10f4: 0x1e56, 0x10f5: 0x1e5b, + 0x10f6: 0x1e60, 0x10f7: 0x1e7e, 0x10f8: 0x1e83, 0x10f9: 0x1e88, 0x10fa: 0x1eec, 0x10fb: 0x1efb, + 0x10fc: 0x4408, 0x10fd: 0x4408, + // Block 0x44, offset 0x1100 + 0x1110: 0x2311, 0x1111: 0x2326, + 0x1112: 0x2326, 0x1113: 0x232d, 0x1114: 0x2334, 0x1115: 0x2349, 0x1116: 0x2350, 0x1117: 0x2357, + 0x1118: 0x237a, 0x1119: 0x237a, 0x111a: 0x239d, 0x111b: 0x2396, 0x111c: 0x23b2, 0x111d: 0x23a4, + 0x111e: 0x23ab, 0x111f: 0x23ce, 0x1120: 0x23ce, 0x1121: 0x23c7, 0x1122: 0x23d5, 0x1123: 0x23d5, + 0x1124: 0x23ff, 0x1125: 0x23ff, 0x1126: 0x241b, 0x1127: 0x23e3, 0x1128: 0x23e3, 0x1129: 0x23dc, + 0x112a: 0x23f1, 0x112b: 0x23f1, 0x112c: 0x23f8, 0x112d: 0x23f8, 0x112e: 0x2422, 0x112f: 0x2430, + 0x1130: 0x2430, 0x1131: 0x2437, 0x1132: 0x2437, 0x1133: 0x243e, 0x1134: 0x2445, 0x1135: 0x244c, + 0x1136: 0x2453, 0x1137: 0x2453, 0x1138: 0x245a, 0x1139: 0x2468, 0x113a: 0x2476, 0x113b: 0x246f, + 0x113c: 0x247d, 0x113d: 0x247d, 0x113e: 0x2492, 0x113f: 0x2499, + // Block 0x45, offset 0x1140 + 0x1140: 0x24ca, 0x1141: 0x24d8, 0x1142: 0x24d1, 0x1143: 0x24b5, 0x1144: 0x24b5, 0x1145: 0x24df, + 0x1146: 0x24df, 0x1147: 0x24e6, 0x1148: 0x24e6, 0x1149: 0x2510, 0x114a: 0x2517, 0x114b: 0x251e, + 0x114c: 0x24f4, 0x114d: 0x2502, 0x114e: 0x2525, 0x114f: 0x252c, + 0x1152: 0x24fb, 0x1153: 0x2580, 0x1154: 0x2587, 0x1155: 0x255d, 0x1156: 0x2564, 0x1157: 0x2548, + 0x1158: 0x2548, 0x1159: 0x254f, 0x115a: 0x2579, 0x115b: 0x2572, 0x115c: 0x259c, 0x115d: 0x259c, + 0x115e: 0x230a, 0x115f: 0x231f, 0x1160: 0x2318, 0x1161: 0x2342, 0x1162: 0x233b, 0x1163: 0x2365, + 0x1164: 0x235e, 0x1165: 0x2388, 0x1166: 0x236c, 0x1167: 0x2381, 0x1168: 0x23b9, 0x1169: 0x2406, + 0x116a: 0x23ea, 0x116b: 0x2429, 0x116c: 0x24c3, 0x116d: 0x24ed, 0x116e: 0x2595, 0x116f: 0x258e, + 0x1170: 0x25a3, 0x1171: 0x253a, 0x1172: 0x24a0, 0x1173: 0x256b, 0x1174: 0x2492, 0x1175: 0x24ca, + 0x1176: 0x2461, 0x1177: 0x24ae, 0x1178: 0x2541, 0x1179: 0x2533, 0x117a: 0x24bc, 0x117b: 0x24a7, + 0x117c: 0x24bc, 0x117d: 0x2541, 0x117e: 0x2373, 0x117f: 0x238f, + // Block 0x46, offset 0x1180 + 0x1180: 0x2509, 0x1181: 0x2484, 0x1182: 0x2303, 0x1183: 0x24a7, 0x1184: 0x244c, 0x1185: 0x241b, + 0x1186: 0x23c0, 0x1187: 0x2556, + 0x11b0: 0x2414, 0x11b1: 0x248b, 0x11b2: 0x27bf, 0x11b3: 0x27b6, 0x11b4: 0x27ec, 0x11b5: 0x27da, + 0x11b6: 0x27c8, 0x11b7: 0x27e3, 0x11b8: 0x27f5, 0x11b9: 0x240d, 0x11ba: 0x2c7c, 0x11bb: 0x2afc, + 0x11bc: 0x27d1, + // Block 0x47, offset 0x11c0 + 0x11d0: 0x0019, 0x11d1: 0x0483, + 0x11d2: 0x0487, 0x11d3: 0x0035, 0x11d4: 0x0037, 0x11d5: 0x0003, 0x11d6: 0x003f, 0x11d7: 0x04bf, + 0x11d8: 0x04c3, 0x11d9: 0x1b5c, + 0x11e0: 0x8132, 0x11e1: 0x8132, 0x11e2: 0x8132, 0x11e3: 0x8132, + 0x11e4: 0x8132, 0x11e5: 0x8132, 0x11e6: 0x8132, 0x11e7: 0x812d, 0x11e8: 0x812d, 0x11e9: 0x812d, + 0x11ea: 0x812d, 0x11eb: 0x812d, 0x11ec: 0x812d, 0x11ed: 0x812d, 0x11ee: 0x8132, 0x11ef: 0x8132, + 0x11f0: 0x1873, 0x11f1: 0x0443, 0x11f2: 0x043f, 0x11f3: 0x007f, 0x11f4: 0x007f, 0x11f5: 0x0011, + 0x11f6: 0x0013, 0x11f7: 0x00b7, 0x11f8: 0x00bb, 0x11f9: 0x04b7, 0x11fa: 0x04bb, 0x11fb: 0x04ab, + 0x11fc: 0x04af, 0x11fd: 0x0493, 0x11fe: 0x0497, 0x11ff: 0x048b, + // Block 0x48, offset 0x1200 + 0x1200: 0x048f, 0x1201: 0x049b, 0x1202: 0x049f, 0x1203: 0x04a3, 0x1204: 0x04a7, + 0x1207: 0x0077, 0x1208: 0x007b, 0x1209: 0x4269, 0x120a: 0x4269, 0x120b: 0x4269, + 0x120c: 0x4269, 0x120d: 0x007f, 0x120e: 0x007f, 0x120f: 0x007f, 0x1210: 0x0019, 0x1211: 0x0483, + 0x1212: 0x001d, 0x1214: 0x0037, 0x1215: 0x0035, 0x1216: 0x003f, 0x1217: 0x0003, + 0x1218: 0x0443, 0x1219: 0x0011, 0x121a: 0x0013, 0x121b: 0x00b7, 0x121c: 0x00bb, 0x121d: 0x04b7, + 0x121e: 0x04bb, 0x121f: 0x0007, 0x1220: 0x000d, 0x1221: 0x0015, 0x1222: 0x0017, 0x1223: 0x001b, + 0x1224: 0x0039, 0x1225: 0x003d, 0x1226: 0x003b, 0x1228: 0x0079, 0x1229: 0x0009, + 0x122a: 0x000b, 0x122b: 0x0041, + 0x1230: 0x42aa, 0x1231: 0x442c, 0x1232: 0x42af, 0x1234: 0x42b4, + 0x1236: 0x42b9, 0x1237: 0x4432, 0x1238: 0x42be, 0x1239: 0x4438, 0x123a: 0x42c3, 0x123b: 0x443e, + 0x123c: 0x42c8, 0x123d: 0x4444, 0x123e: 0x42cd, 0x123f: 0x444a, + // Block 0x49, offset 0x1240 + 0x1240: 0x0236, 0x1241: 0x440e, 0x1242: 0x440e, 0x1243: 0x4414, 0x1244: 0x4414, 0x1245: 0x4456, + 0x1246: 0x4456, 0x1247: 0x441a, 0x1248: 0x441a, 0x1249: 0x4462, 0x124a: 0x4462, 0x124b: 0x4462, + 0x124c: 0x4462, 0x124d: 0x0239, 0x124e: 0x0239, 0x124f: 0x023c, 0x1250: 0x023c, 0x1251: 0x023c, + 0x1252: 0x023c, 0x1253: 0x023f, 0x1254: 0x023f, 0x1255: 0x0242, 0x1256: 0x0242, 0x1257: 0x0242, + 0x1258: 0x0242, 0x1259: 0x0245, 0x125a: 0x0245, 0x125b: 0x0245, 0x125c: 0x0245, 0x125d: 0x0248, + 0x125e: 0x0248, 0x125f: 0x0248, 0x1260: 0x0248, 0x1261: 0x024b, 0x1262: 0x024b, 0x1263: 0x024b, + 0x1264: 0x024b, 0x1265: 0x024e, 0x1266: 0x024e, 0x1267: 0x024e, 0x1268: 0x024e, 0x1269: 0x0251, + 0x126a: 0x0251, 0x126b: 0x0254, 0x126c: 0x0254, 0x126d: 0x0257, 0x126e: 0x0257, 0x126f: 0x025a, + 0x1270: 0x025a, 0x1271: 0x025d, 0x1272: 0x025d, 0x1273: 0x025d, 0x1274: 0x025d, 0x1275: 0x0260, + 0x1276: 0x0260, 0x1277: 0x0260, 0x1278: 0x0260, 0x1279: 0x0263, 0x127a: 0x0263, 0x127b: 0x0263, + 0x127c: 0x0263, 0x127d: 0x0266, 0x127e: 0x0266, 0x127f: 0x0266, + // Block 0x4a, offset 0x1280 + 0x1280: 0x0266, 0x1281: 0x0269, 0x1282: 0x0269, 0x1283: 0x0269, 0x1284: 0x0269, 0x1285: 0x026c, + 0x1286: 0x026c, 0x1287: 0x026c, 0x1288: 0x026c, 0x1289: 0x026f, 0x128a: 0x026f, 0x128b: 0x026f, + 0x128c: 0x026f, 0x128d: 0x0272, 0x128e: 0x0272, 0x128f: 0x0272, 0x1290: 0x0272, 0x1291: 0x0275, + 0x1292: 0x0275, 0x1293: 0x0275, 0x1294: 0x0275, 0x1295: 0x0278, 0x1296: 0x0278, 0x1297: 0x0278, + 0x1298: 0x0278, 0x1299: 0x027b, 0x129a: 0x027b, 0x129b: 0x027b, 0x129c: 0x027b, 0x129d: 0x027e, + 0x129e: 0x027e, 0x129f: 0x027e, 0x12a0: 0x027e, 0x12a1: 0x0281, 0x12a2: 0x0281, 0x12a3: 0x0281, + 0x12a4: 0x0281, 0x12a5: 0x0284, 0x12a6: 0x0284, 0x12a7: 0x0284, 0x12a8: 0x0284, 0x12a9: 0x0287, + 0x12aa: 0x0287, 0x12ab: 0x0287, 0x12ac: 0x0287, 0x12ad: 0x028a, 0x12ae: 0x028a, 0x12af: 0x028d, + 0x12b0: 0x028d, 0x12b1: 0x0290, 0x12b2: 0x0290, 0x12b3: 0x0290, 0x12b4: 0x0290, 0x12b5: 0x2e00, + 0x12b6: 0x2e00, 0x12b7: 0x2e08, 0x12b8: 0x2e08, 0x12b9: 0x2e10, 0x12ba: 0x2e10, 0x12bb: 0x1f82, + 0x12bc: 0x1f82, + // Block 0x4b, offset 0x12c0 + 0x12c0: 0x0081, 0x12c1: 0x0083, 0x12c2: 0x0085, 0x12c3: 0x0087, 0x12c4: 0x0089, 0x12c5: 0x008b, + 0x12c6: 0x008d, 0x12c7: 0x008f, 0x12c8: 0x0091, 0x12c9: 0x0093, 0x12ca: 0x0095, 0x12cb: 0x0097, + 0x12cc: 0x0099, 0x12cd: 0x009b, 0x12ce: 0x009d, 0x12cf: 0x009f, 0x12d0: 0x00a1, 0x12d1: 0x00a3, + 0x12d2: 0x00a5, 0x12d3: 0x00a7, 0x12d4: 0x00a9, 0x12d5: 0x00ab, 0x12d6: 0x00ad, 0x12d7: 0x00af, + 0x12d8: 0x00b1, 0x12d9: 0x00b3, 0x12da: 0x00b5, 0x12db: 0x00b7, 0x12dc: 0x00b9, 0x12dd: 0x00bb, + 0x12de: 0x00bd, 0x12df: 0x0477, 0x12e0: 0x047b, 0x12e1: 0x0487, 0x12e2: 0x049b, 0x12e3: 0x049f, + 0x12e4: 0x0483, 0x12e5: 0x05ab, 0x12e6: 0x05a3, 0x12e7: 0x04c7, 0x12e8: 0x04cf, 0x12e9: 0x04d7, + 0x12ea: 0x04df, 0x12eb: 0x04e7, 0x12ec: 0x056b, 0x12ed: 0x0573, 0x12ee: 0x057b, 0x12ef: 0x051f, + 0x12f0: 0x05af, 0x12f1: 0x04cb, 0x12f2: 0x04d3, 0x12f3: 0x04db, 0x12f4: 0x04e3, 0x12f5: 0x04eb, + 0x12f6: 0x04ef, 0x12f7: 0x04f3, 0x12f8: 0x04f7, 0x12f9: 0x04fb, 0x12fa: 0x04ff, 0x12fb: 0x0503, + 0x12fc: 0x0507, 0x12fd: 0x050b, 0x12fe: 0x050f, 0x12ff: 0x0513, + // Block 0x4c, offset 0x1300 + 0x1300: 0x0517, 0x1301: 0x051b, 0x1302: 0x0523, 0x1303: 0x0527, 0x1304: 0x052b, 0x1305: 0x052f, + 0x1306: 0x0533, 0x1307: 0x0537, 0x1308: 0x053b, 0x1309: 0x053f, 0x130a: 0x0543, 0x130b: 0x0547, + 0x130c: 0x054b, 0x130d: 0x054f, 0x130e: 0x0553, 0x130f: 0x0557, 0x1310: 0x055b, 0x1311: 0x055f, + 0x1312: 0x0563, 0x1313: 0x0567, 0x1314: 0x056f, 0x1315: 0x0577, 0x1316: 0x057f, 0x1317: 0x0583, + 0x1318: 0x0587, 0x1319: 0x058b, 0x131a: 0x058f, 0x131b: 0x0593, 0x131c: 0x0597, 0x131d: 0x05a7, + 0x131e: 0x4a78, 0x131f: 0x4a7e, 0x1320: 0x03c3, 0x1321: 0x0313, 0x1322: 0x0317, 0x1323: 0x4a3b, + 0x1324: 0x031b, 0x1325: 0x4a41, 0x1326: 0x4a47, 0x1327: 0x031f, 0x1328: 0x0323, 0x1329: 0x0327, + 0x132a: 0x4a4d, 0x132b: 0x4a53, 0x132c: 0x4a59, 0x132d: 0x4a5f, 0x132e: 0x4a65, 0x132f: 0x4a6b, + 0x1330: 0x0367, 0x1331: 0x032b, 0x1332: 0x032f, 0x1333: 0x0333, 0x1334: 0x037b, 0x1335: 0x0337, + 0x1336: 0x033b, 0x1337: 0x033f, 0x1338: 0x0343, 0x1339: 0x0347, 0x133a: 0x034b, 0x133b: 0x034f, + 0x133c: 0x0353, 0x133d: 0x0357, 0x133e: 0x035b, + // Block 0x4d, offset 0x1340 + 0x1342: 0x49bd, 0x1343: 0x49c3, 0x1344: 0x49c9, 0x1345: 0x49cf, + 0x1346: 0x49d5, 0x1347: 0x49db, 0x134a: 0x49e1, 0x134b: 0x49e7, + 0x134c: 0x49ed, 0x134d: 0x49f3, 0x134e: 0x49f9, 0x134f: 0x49ff, + 0x1352: 0x4a05, 0x1353: 0x4a0b, 0x1354: 0x4a11, 0x1355: 0x4a17, 0x1356: 0x4a1d, 0x1357: 0x4a23, + 0x135a: 0x4a29, 0x135b: 0x4a2f, 0x135c: 0x4a35, + 0x1360: 0x00bf, 0x1361: 0x00c2, 0x1362: 0x00cb, 0x1363: 0x4264, + 0x1364: 0x00c8, 0x1365: 0x00c5, 0x1366: 0x0447, 0x1368: 0x046b, 0x1369: 0x044b, + 0x136a: 0x044f, 0x136b: 0x0453, 0x136c: 0x0457, 0x136d: 0x046f, 0x136e: 0x0473, + // Block 0x4e, offset 0x1380 + 0x1380: 0x0063, 0x1381: 0x0065, 0x1382: 0x0067, 0x1383: 0x0069, 0x1384: 0x006b, 0x1385: 0x006d, + 0x1386: 0x006f, 0x1387: 0x0071, 0x1388: 0x0073, 0x1389: 0x0075, 0x138a: 0x0083, 0x138b: 0x0085, + 0x138c: 0x0087, 0x138d: 0x0089, 0x138e: 0x008b, 0x138f: 0x008d, 0x1390: 0x008f, 0x1391: 0x0091, + 0x1392: 0x0093, 0x1393: 0x0095, 0x1394: 0x0097, 0x1395: 0x0099, 0x1396: 0x009b, 0x1397: 0x009d, + 0x1398: 0x009f, 0x1399: 0x00a1, 0x139a: 0x00a3, 0x139b: 0x00a5, 0x139c: 0x00a7, 0x139d: 0x00a9, + 0x139e: 0x00ab, 0x139f: 0x00ad, 0x13a0: 0x00af, 0x13a1: 0x00b1, 0x13a2: 0x00b3, 0x13a3: 0x00b5, + 0x13a4: 0x00dd, 0x13a5: 0x00f2, 0x13a8: 0x0173, 0x13a9: 0x0176, + 0x13aa: 0x0179, 0x13ab: 0x017c, 0x13ac: 0x017f, 0x13ad: 0x0182, 0x13ae: 0x0185, 0x13af: 0x0188, + 0x13b0: 0x018b, 0x13b1: 0x018e, 0x13b2: 0x0191, 0x13b3: 0x0194, 0x13b4: 0x0197, 0x13b5: 0x019a, + 0x13b6: 0x019d, 0x13b7: 0x01a0, 0x13b8: 0x01a3, 0x13b9: 0x0188, 0x13ba: 0x01a6, 0x13bb: 0x01a9, + 0x13bc: 0x01ac, 0x13bd: 0x01af, 0x13be: 0x01b2, 0x13bf: 0x01b5, + // Block 0x4f, offset 0x13c0 + 0x13c0: 0x01fd, 0x13c1: 0x0200, 0x13c2: 0x0203, 0x13c3: 0x045b, 0x13c4: 0x01c7, 0x13c5: 0x01d0, + 0x13c6: 0x01d6, 0x13c7: 0x01fa, 0x13c8: 0x01eb, 0x13c9: 0x01e8, 0x13ca: 0x0206, 0x13cb: 0x0209, + 0x13ce: 0x0021, 0x13cf: 0x0023, 0x13d0: 0x0025, 0x13d1: 0x0027, + 0x13d2: 0x0029, 0x13d3: 0x002b, 0x13d4: 0x002d, 0x13d5: 0x002f, 0x13d6: 0x0031, 0x13d7: 0x0033, + 0x13d8: 0x0021, 0x13d9: 0x0023, 0x13da: 0x0025, 0x13db: 0x0027, 0x13dc: 0x0029, 0x13dd: 0x002b, + 0x13de: 0x002d, 0x13df: 0x002f, 0x13e0: 0x0031, 0x13e1: 0x0033, 0x13e2: 0x0021, 0x13e3: 0x0023, + 0x13e4: 0x0025, 0x13e5: 0x0027, 0x13e6: 0x0029, 0x13e7: 0x002b, 0x13e8: 0x002d, 0x13e9: 0x002f, + 0x13ea: 0x0031, 0x13eb: 0x0033, 0x13ec: 0x0021, 0x13ed: 0x0023, 0x13ee: 0x0025, 0x13ef: 0x0027, + 0x13f0: 0x0029, 0x13f1: 0x002b, 0x13f2: 0x002d, 0x13f3: 0x002f, 0x13f4: 0x0031, 0x13f5: 0x0033, + 0x13f6: 0x0021, 0x13f7: 0x0023, 0x13f8: 0x0025, 0x13f9: 0x0027, 0x13fa: 0x0029, 0x13fb: 0x002b, + 0x13fc: 0x002d, 0x13fd: 0x002f, 0x13fe: 0x0031, 0x13ff: 0x0033, + // Block 0x50, offset 0x1400 + 0x1400: 0x0239, 0x1401: 0x023c, 0x1402: 0x0248, 0x1403: 0x0251, 0x1405: 0x028a, + 0x1406: 0x025a, 0x1407: 0x024b, 0x1408: 0x0269, 0x1409: 0x0290, 0x140a: 0x027b, 0x140b: 0x027e, + 0x140c: 0x0281, 0x140d: 0x0284, 0x140e: 0x025d, 0x140f: 0x026f, 0x1410: 0x0275, 0x1411: 0x0263, + 0x1412: 0x0278, 0x1413: 0x0257, 0x1414: 0x0260, 0x1415: 0x0242, 0x1416: 0x0245, 0x1417: 0x024e, + 0x1418: 0x0254, 0x1419: 0x0266, 0x141a: 0x026c, 0x141b: 0x0272, 0x141c: 0x0293, 0x141d: 0x02e4, + 0x141e: 0x02cc, 0x141f: 0x0296, 0x1421: 0x023c, 0x1422: 0x0248, + 0x1424: 0x0287, 0x1427: 0x024b, 0x1429: 0x0290, + 0x142a: 0x027b, 0x142b: 0x027e, 0x142c: 0x0281, 0x142d: 0x0284, 0x142e: 0x025d, 0x142f: 0x026f, + 0x1430: 0x0275, 0x1431: 0x0263, 0x1432: 0x0278, 0x1434: 0x0260, 0x1435: 0x0242, + 0x1436: 0x0245, 0x1437: 0x024e, 0x1439: 0x0266, 0x143b: 0x0272, + // Block 0x51, offset 0x1440 + 0x1442: 0x0248, + 0x1447: 0x024b, 0x1449: 0x0290, 0x144b: 0x027e, + 0x144d: 0x0284, 0x144e: 0x025d, 0x144f: 0x026f, 0x1451: 0x0263, + 0x1452: 0x0278, 0x1454: 0x0260, 0x1457: 0x024e, + 0x1459: 0x0266, 0x145b: 0x0272, 0x145d: 0x02e4, + 0x145f: 0x0296, 0x1461: 0x023c, 0x1462: 0x0248, + 0x1464: 0x0287, 0x1467: 0x024b, 0x1468: 0x0269, 0x1469: 0x0290, + 0x146a: 0x027b, 0x146c: 0x0281, 0x146d: 0x0284, 0x146e: 0x025d, 0x146f: 0x026f, + 0x1470: 0x0275, 0x1471: 0x0263, 0x1472: 0x0278, 0x1474: 0x0260, 0x1475: 0x0242, + 0x1476: 0x0245, 0x1477: 0x024e, 0x1479: 0x0266, 0x147a: 0x026c, 0x147b: 0x0272, + 0x147c: 0x0293, 0x147e: 0x02cc, + // Block 0x52, offset 0x1480 + 0x1480: 0x0239, 0x1481: 0x023c, 0x1482: 0x0248, 0x1483: 0x0251, 0x1484: 0x0287, 0x1485: 0x028a, + 0x1486: 0x025a, 0x1487: 0x024b, 0x1488: 0x0269, 0x1489: 0x0290, 0x148b: 0x027e, + 0x148c: 0x0281, 0x148d: 0x0284, 0x148e: 0x025d, 0x148f: 0x026f, 0x1490: 0x0275, 0x1491: 0x0263, + 0x1492: 0x0278, 0x1493: 0x0257, 0x1494: 0x0260, 0x1495: 0x0242, 0x1496: 0x0245, 0x1497: 0x024e, + 0x1498: 0x0254, 0x1499: 0x0266, 0x149a: 0x026c, 0x149b: 0x0272, + 0x14a1: 0x023c, 0x14a2: 0x0248, 0x14a3: 0x0251, + 0x14a5: 0x028a, 0x14a6: 0x025a, 0x14a7: 0x024b, 0x14a8: 0x0269, 0x14a9: 0x0290, + 0x14ab: 0x027e, 0x14ac: 0x0281, 0x14ad: 0x0284, 0x14ae: 0x025d, 0x14af: 0x026f, + 0x14b0: 0x0275, 0x14b1: 0x0263, 0x14b2: 0x0278, 0x14b3: 0x0257, 0x14b4: 0x0260, 0x14b5: 0x0242, + 0x14b6: 0x0245, 0x14b7: 0x024e, 0x14b8: 0x0254, 0x14b9: 0x0266, 0x14ba: 0x026c, 0x14bb: 0x0272, + // Block 0x53, offset 0x14c0 + 0x14c0: 0x1879, 0x14c1: 0x1876, 0x14c2: 0x187c, 0x14c3: 0x18a0, 0x14c4: 0x18c4, 0x14c5: 0x18e8, + 0x14c6: 0x190c, 0x14c7: 0x1915, 0x14c8: 0x191b, 0x14c9: 0x1921, 0x14ca: 0x1927, + 0x14d0: 0x1a8c, 0x14d1: 0x1a90, + 0x14d2: 0x1a94, 0x14d3: 0x1a98, 0x14d4: 0x1a9c, 0x14d5: 0x1aa0, 0x14d6: 0x1aa4, 0x14d7: 0x1aa8, + 0x14d8: 0x1aac, 0x14d9: 0x1ab0, 0x14da: 0x1ab4, 0x14db: 0x1ab8, 0x14dc: 0x1abc, 0x14dd: 0x1ac0, + 0x14de: 0x1ac4, 0x14df: 0x1ac8, 0x14e0: 0x1acc, 0x14e1: 0x1ad0, 0x14e2: 0x1ad4, 0x14e3: 0x1ad8, + 0x14e4: 0x1adc, 0x14e5: 0x1ae0, 0x14e6: 0x1ae4, 0x14e7: 0x1ae8, 0x14e8: 0x1aec, 0x14e9: 0x1af0, + 0x14ea: 0x271e, 0x14eb: 0x0047, 0x14ec: 0x0065, 0x14ed: 0x193c, 0x14ee: 0x19b1, + 0x14f0: 0x0043, 0x14f1: 0x0045, 0x14f2: 0x0047, 0x14f3: 0x0049, 0x14f4: 0x004b, 0x14f5: 0x004d, + 0x14f6: 0x004f, 0x14f7: 0x0051, 0x14f8: 0x0053, 0x14f9: 0x0055, 0x14fa: 0x0057, 0x14fb: 0x0059, + 0x14fc: 0x005b, 0x14fd: 0x005d, 0x14fe: 0x005f, 0x14ff: 0x0061, + // Block 0x54, offset 0x1500 + 0x1500: 0x26ad, 0x1501: 0x26c2, 0x1502: 0x0503, + 0x1510: 0x0c0f, 0x1511: 0x0a47, + 0x1512: 0x08d3, 0x1513: 0x45c4, 0x1514: 0x071b, 0x1515: 0x09ef, 0x1516: 0x132f, 0x1517: 0x09ff, + 0x1518: 0x0727, 0x1519: 0x0cd7, 0x151a: 0x0eaf, 0x151b: 0x0caf, 0x151c: 0x0827, 0x151d: 0x0b6b, + 0x151e: 0x07bf, 0x151f: 0x0cb7, 0x1520: 0x0813, 0x1521: 0x1117, 0x1522: 0x0f83, 0x1523: 0x138b, + 0x1524: 0x09d3, 0x1525: 0x090b, 0x1526: 0x0e63, 0x1527: 0x0c1b, 0x1528: 0x0c47, 0x1529: 0x06bf, + 0x152a: 0x06cb, 0x152b: 0x140b, 0x152c: 0x0adb, 0x152d: 0x06e7, 0x152e: 0x08ef, 0x152f: 0x0c3b, + 0x1530: 0x13b3, 0x1531: 0x0c13, 0x1532: 0x106f, 0x1533: 0x10ab, 0x1534: 0x08f7, 0x1535: 0x0e43, + 0x1536: 0x0d0b, 0x1537: 0x0d07, 0x1538: 0x0f97, 0x1539: 0x082b, 0x153a: 0x0957, 0x153b: 0x1443, + // Block 0x55, offset 0x1540 + 0x1540: 0x06fb, 0x1541: 0x06f3, 0x1542: 0x0703, 0x1543: 0x1647, 0x1544: 0x0747, 0x1545: 0x0757, + 0x1546: 0x075b, 0x1547: 0x0763, 0x1548: 0x076b, 0x1549: 0x076f, 0x154a: 0x077b, 0x154b: 0x0773, + 0x154c: 0x05b3, 0x154d: 0x165b, 0x154e: 0x078f, 0x154f: 0x0793, 0x1550: 0x0797, 0x1551: 0x07b3, + 0x1552: 0x164c, 0x1553: 0x05b7, 0x1554: 0x079f, 0x1555: 0x07bf, 0x1556: 0x1656, 0x1557: 0x07cf, + 0x1558: 0x07d7, 0x1559: 0x0737, 0x155a: 0x07df, 0x155b: 0x07e3, 0x155c: 0x1831, 0x155d: 0x07ff, + 0x155e: 0x0807, 0x155f: 0x05bf, 0x1560: 0x081f, 0x1561: 0x0823, 0x1562: 0x082b, 0x1563: 0x082f, + 0x1564: 0x05c3, 0x1565: 0x0847, 0x1566: 0x084b, 0x1567: 0x0857, 0x1568: 0x0863, 0x1569: 0x0867, + 0x156a: 0x086b, 0x156b: 0x0873, 0x156c: 0x0893, 0x156d: 0x0897, 0x156e: 0x089f, 0x156f: 0x08af, + 0x1570: 0x08b7, 0x1571: 0x08bb, 0x1572: 0x08bb, 0x1573: 0x08bb, 0x1574: 0x166a, 0x1575: 0x0e93, + 0x1576: 0x08cf, 0x1577: 0x08d7, 0x1578: 0x166f, 0x1579: 0x08e3, 0x157a: 0x08eb, 0x157b: 0x08f3, + 0x157c: 0x091b, 0x157d: 0x0907, 0x157e: 0x0913, 0x157f: 0x0917, + // Block 0x56, offset 0x1580 + 0x1580: 0x091f, 0x1581: 0x0927, 0x1582: 0x092b, 0x1583: 0x0933, 0x1584: 0x093b, 0x1585: 0x093f, + 0x1586: 0x093f, 0x1587: 0x0947, 0x1588: 0x094f, 0x1589: 0x0953, 0x158a: 0x095f, 0x158b: 0x0983, + 0x158c: 0x0967, 0x158d: 0x0987, 0x158e: 0x096b, 0x158f: 0x0973, 0x1590: 0x080b, 0x1591: 0x09cf, + 0x1592: 0x0997, 0x1593: 0x099b, 0x1594: 0x099f, 0x1595: 0x0993, 0x1596: 0x09a7, 0x1597: 0x09a3, + 0x1598: 0x09bb, 0x1599: 0x1674, 0x159a: 0x09d7, 0x159b: 0x09db, 0x159c: 0x09e3, 0x159d: 0x09ef, + 0x159e: 0x09f7, 0x159f: 0x0a13, 0x15a0: 0x1679, 0x15a1: 0x167e, 0x15a2: 0x0a1f, 0x15a3: 0x0a23, + 0x15a4: 0x0a27, 0x15a5: 0x0a1b, 0x15a6: 0x0a2f, 0x15a7: 0x05c7, 0x15a8: 0x05cb, 0x15a9: 0x0a37, + 0x15aa: 0x0a3f, 0x15ab: 0x0a3f, 0x15ac: 0x1683, 0x15ad: 0x0a5b, 0x15ae: 0x0a5f, 0x15af: 0x0a63, + 0x15b0: 0x0a6b, 0x15b1: 0x1688, 0x15b2: 0x0a73, 0x15b3: 0x0a77, 0x15b4: 0x0b4f, 0x15b5: 0x0a7f, + 0x15b6: 0x05cf, 0x15b7: 0x0a8b, 0x15b8: 0x0a9b, 0x15b9: 0x0aa7, 0x15ba: 0x0aa3, 0x15bb: 0x1692, + 0x15bc: 0x0aaf, 0x15bd: 0x1697, 0x15be: 0x0abb, 0x15bf: 0x0ab7, + // Block 0x57, offset 0x15c0 + 0x15c0: 0x0abf, 0x15c1: 0x0acf, 0x15c2: 0x0ad3, 0x15c3: 0x05d3, 0x15c4: 0x0ae3, 0x15c5: 0x0aeb, + 0x15c6: 0x0aef, 0x15c7: 0x0af3, 0x15c8: 0x05d7, 0x15c9: 0x169c, 0x15ca: 0x05db, 0x15cb: 0x0b0f, + 0x15cc: 0x0b13, 0x15cd: 0x0b17, 0x15ce: 0x0b1f, 0x15cf: 0x1863, 0x15d0: 0x0b37, 0x15d1: 0x16a6, + 0x15d2: 0x16a6, 0x15d3: 0x11d7, 0x15d4: 0x0b47, 0x15d5: 0x0b47, 0x15d6: 0x05df, 0x15d7: 0x16c9, + 0x15d8: 0x179b, 0x15d9: 0x0b57, 0x15da: 0x0b5f, 0x15db: 0x05e3, 0x15dc: 0x0b73, 0x15dd: 0x0b83, + 0x15de: 0x0b87, 0x15df: 0x0b8f, 0x15e0: 0x0b9f, 0x15e1: 0x05eb, 0x15e2: 0x05e7, 0x15e3: 0x0ba3, + 0x15e4: 0x16ab, 0x15e5: 0x0ba7, 0x15e6: 0x0bbb, 0x15e7: 0x0bbf, 0x15e8: 0x0bc3, 0x15e9: 0x0bbf, + 0x15ea: 0x0bcf, 0x15eb: 0x0bd3, 0x15ec: 0x0be3, 0x15ed: 0x0bdb, 0x15ee: 0x0bdf, 0x15ef: 0x0be7, + 0x15f0: 0x0beb, 0x15f1: 0x0bef, 0x15f2: 0x0bfb, 0x15f3: 0x0bff, 0x15f4: 0x0c17, 0x15f5: 0x0c1f, + 0x15f6: 0x0c2f, 0x15f7: 0x0c43, 0x15f8: 0x16ba, 0x15f9: 0x0c3f, 0x15fa: 0x0c33, 0x15fb: 0x0c4b, + 0x15fc: 0x0c53, 0x15fd: 0x0c67, 0x15fe: 0x16bf, 0x15ff: 0x0c6f, + // Block 0x58, offset 0x1600 + 0x1600: 0x0c63, 0x1601: 0x0c5b, 0x1602: 0x05ef, 0x1603: 0x0c77, 0x1604: 0x0c7f, 0x1605: 0x0c87, + 0x1606: 0x0c7b, 0x1607: 0x05f3, 0x1608: 0x0c97, 0x1609: 0x0c9f, 0x160a: 0x16c4, 0x160b: 0x0ccb, + 0x160c: 0x0cff, 0x160d: 0x0cdb, 0x160e: 0x05ff, 0x160f: 0x0ce7, 0x1610: 0x05fb, 0x1611: 0x05f7, + 0x1612: 0x07c3, 0x1613: 0x07c7, 0x1614: 0x0d03, 0x1615: 0x0ceb, 0x1616: 0x11ab, 0x1617: 0x0663, + 0x1618: 0x0d0f, 0x1619: 0x0d13, 0x161a: 0x0d17, 0x161b: 0x0d2b, 0x161c: 0x0d23, 0x161d: 0x16dd, + 0x161e: 0x0603, 0x161f: 0x0d3f, 0x1620: 0x0d33, 0x1621: 0x0d4f, 0x1622: 0x0d57, 0x1623: 0x16e7, + 0x1624: 0x0d5b, 0x1625: 0x0d47, 0x1626: 0x0d63, 0x1627: 0x0607, 0x1628: 0x0d67, 0x1629: 0x0d6b, + 0x162a: 0x0d6f, 0x162b: 0x0d7b, 0x162c: 0x16ec, 0x162d: 0x0d83, 0x162e: 0x060b, 0x162f: 0x0d8f, + 0x1630: 0x16f1, 0x1631: 0x0d93, 0x1632: 0x060f, 0x1633: 0x0d9f, 0x1634: 0x0dab, 0x1635: 0x0db7, + 0x1636: 0x0dbb, 0x1637: 0x16f6, 0x1638: 0x168d, 0x1639: 0x16fb, 0x163a: 0x0ddb, 0x163b: 0x1700, + 0x163c: 0x0de7, 0x163d: 0x0def, 0x163e: 0x0ddf, 0x163f: 0x0dfb, + // Block 0x59, offset 0x1640 + 0x1640: 0x0e0b, 0x1641: 0x0e1b, 0x1642: 0x0e0f, 0x1643: 0x0e13, 0x1644: 0x0e1f, 0x1645: 0x0e23, + 0x1646: 0x1705, 0x1647: 0x0e07, 0x1648: 0x0e3b, 0x1649: 0x0e3f, 0x164a: 0x0613, 0x164b: 0x0e53, + 0x164c: 0x0e4f, 0x164d: 0x170a, 0x164e: 0x0e33, 0x164f: 0x0e6f, 0x1650: 0x170f, 0x1651: 0x1714, + 0x1652: 0x0e73, 0x1653: 0x0e87, 0x1654: 0x0e83, 0x1655: 0x0e7f, 0x1656: 0x0617, 0x1657: 0x0e8b, + 0x1658: 0x0e9b, 0x1659: 0x0e97, 0x165a: 0x0ea3, 0x165b: 0x1651, 0x165c: 0x0eb3, 0x165d: 0x1719, + 0x165e: 0x0ebf, 0x165f: 0x1723, 0x1660: 0x0ed3, 0x1661: 0x0edf, 0x1662: 0x0ef3, 0x1663: 0x1728, + 0x1664: 0x0f07, 0x1665: 0x0f0b, 0x1666: 0x172d, 0x1667: 0x1732, 0x1668: 0x0f27, 0x1669: 0x0f37, + 0x166a: 0x061b, 0x166b: 0x0f3b, 0x166c: 0x061f, 0x166d: 0x061f, 0x166e: 0x0f53, 0x166f: 0x0f57, + 0x1670: 0x0f5f, 0x1671: 0x0f63, 0x1672: 0x0f6f, 0x1673: 0x0623, 0x1674: 0x0f87, 0x1675: 0x1737, + 0x1676: 0x0fa3, 0x1677: 0x173c, 0x1678: 0x0faf, 0x1679: 0x16a1, 0x167a: 0x0fbf, 0x167b: 0x1741, + 0x167c: 0x1746, 0x167d: 0x174b, 0x167e: 0x0627, 0x167f: 0x062b, + // Block 0x5a, offset 0x1680 + 0x1680: 0x0ff7, 0x1681: 0x1755, 0x1682: 0x1750, 0x1683: 0x175a, 0x1684: 0x175f, 0x1685: 0x0fff, + 0x1686: 0x1003, 0x1687: 0x1003, 0x1688: 0x100b, 0x1689: 0x0633, 0x168a: 0x100f, 0x168b: 0x0637, + 0x168c: 0x063b, 0x168d: 0x1769, 0x168e: 0x1023, 0x168f: 0x102b, 0x1690: 0x1037, 0x1691: 0x063f, + 0x1692: 0x176e, 0x1693: 0x105b, 0x1694: 0x1773, 0x1695: 0x1778, 0x1696: 0x107b, 0x1697: 0x1093, + 0x1698: 0x0643, 0x1699: 0x109b, 0x169a: 0x109f, 0x169b: 0x10a3, 0x169c: 0x177d, 0x169d: 0x1782, + 0x169e: 0x1782, 0x169f: 0x10bb, 0x16a0: 0x0647, 0x16a1: 0x1787, 0x16a2: 0x10cf, 0x16a3: 0x10d3, + 0x16a4: 0x064b, 0x16a5: 0x178c, 0x16a6: 0x10ef, 0x16a7: 0x064f, 0x16a8: 0x10ff, 0x16a9: 0x10f7, + 0x16aa: 0x1107, 0x16ab: 0x1796, 0x16ac: 0x111f, 0x16ad: 0x0653, 0x16ae: 0x112b, 0x16af: 0x1133, + 0x16b0: 0x1143, 0x16b1: 0x0657, 0x16b2: 0x17a0, 0x16b3: 0x17a5, 0x16b4: 0x065b, 0x16b5: 0x17aa, + 0x16b6: 0x115b, 0x16b7: 0x17af, 0x16b8: 0x1167, 0x16b9: 0x1173, 0x16ba: 0x117b, 0x16bb: 0x17b4, + 0x16bc: 0x17b9, 0x16bd: 0x118f, 0x16be: 0x17be, 0x16bf: 0x1197, + // Block 0x5b, offset 0x16c0 + 0x16c0: 0x16ce, 0x16c1: 0x065f, 0x16c2: 0x11af, 0x16c3: 0x11b3, 0x16c4: 0x0667, 0x16c5: 0x11b7, + 0x16c6: 0x0a33, 0x16c7: 0x17c3, 0x16c8: 0x17c8, 0x16c9: 0x16d3, 0x16ca: 0x16d8, 0x16cb: 0x11d7, + 0x16cc: 0x11db, 0x16cd: 0x13f3, 0x16ce: 0x066b, 0x16cf: 0x1207, 0x16d0: 0x1203, 0x16d1: 0x120b, + 0x16d2: 0x083f, 0x16d3: 0x120f, 0x16d4: 0x1213, 0x16d5: 0x1217, 0x16d6: 0x121f, 0x16d7: 0x17cd, + 0x16d8: 0x121b, 0x16d9: 0x1223, 0x16da: 0x1237, 0x16db: 0x123b, 0x16dc: 0x1227, 0x16dd: 0x123f, + 0x16de: 0x1253, 0x16df: 0x1267, 0x16e0: 0x1233, 0x16e1: 0x1247, 0x16e2: 0x124b, 0x16e3: 0x124f, + 0x16e4: 0x17d2, 0x16e5: 0x17dc, 0x16e6: 0x17d7, 0x16e7: 0x066f, 0x16e8: 0x126f, 0x16e9: 0x1273, + 0x16ea: 0x127b, 0x16eb: 0x17f0, 0x16ec: 0x127f, 0x16ed: 0x17e1, 0x16ee: 0x0673, 0x16ef: 0x0677, + 0x16f0: 0x17e6, 0x16f1: 0x17eb, 0x16f2: 0x067b, 0x16f3: 0x129f, 0x16f4: 0x12a3, 0x16f5: 0x12a7, + 0x16f6: 0x12ab, 0x16f7: 0x12b7, 0x16f8: 0x12b3, 0x16f9: 0x12bf, 0x16fa: 0x12bb, 0x16fb: 0x12cb, + 0x16fc: 0x12c3, 0x16fd: 0x12c7, 0x16fe: 0x12cf, 0x16ff: 0x067f, + // Block 0x5c, offset 0x1700 + 0x1700: 0x12d7, 0x1701: 0x12db, 0x1702: 0x0683, 0x1703: 0x12eb, 0x1704: 0x12ef, 0x1705: 0x17f5, + 0x1706: 0x12fb, 0x1707: 0x12ff, 0x1708: 0x0687, 0x1709: 0x130b, 0x170a: 0x05bb, 0x170b: 0x17fa, + 0x170c: 0x17ff, 0x170d: 0x068b, 0x170e: 0x068f, 0x170f: 0x1337, 0x1710: 0x134f, 0x1711: 0x136b, + 0x1712: 0x137b, 0x1713: 0x1804, 0x1714: 0x138f, 0x1715: 0x1393, 0x1716: 0x13ab, 0x1717: 0x13b7, + 0x1718: 0x180e, 0x1719: 0x1660, 0x171a: 0x13c3, 0x171b: 0x13bf, 0x171c: 0x13cb, 0x171d: 0x1665, + 0x171e: 0x13d7, 0x171f: 0x13e3, 0x1720: 0x1813, 0x1721: 0x1818, 0x1722: 0x1423, 0x1723: 0x142f, + 0x1724: 0x1437, 0x1725: 0x181d, 0x1726: 0x143b, 0x1727: 0x1467, 0x1728: 0x1473, 0x1729: 0x1477, + 0x172a: 0x146f, 0x172b: 0x1483, 0x172c: 0x1487, 0x172d: 0x1822, 0x172e: 0x1493, 0x172f: 0x0693, + 0x1730: 0x149b, 0x1731: 0x1827, 0x1732: 0x0697, 0x1733: 0x14d3, 0x1734: 0x0ac3, 0x1735: 0x14eb, + 0x1736: 0x182c, 0x1737: 0x1836, 0x1738: 0x069b, 0x1739: 0x069f, 0x173a: 0x1513, 0x173b: 0x183b, + 0x173c: 0x06a3, 0x173d: 0x1840, 0x173e: 0x152b, 0x173f: 0x152b, + // Block 0x5d, offset 0x1740 + 0x1740: 0x1533, 0x1741: 0x1845, 0x1742: 0x154b, 0x1743: 0x06a7, 0x1744: 0x155b, 0x1745: 0x1567, + 0x1746: 0x156f, 0x1747: 0x1577, 0x1748: 0x06ab, 0x1749: 0x184a, 0x174a: 0x158b, 0x174b: 0x15a7, + 0x174c: 0x15b3, 0x174d: 0x06af, 0x174e: 0x06b3, 0x174f: 0x15b7, 0x1750: 0x184f, 0x1751: 0x06b7, + 0x1752: 0x1854, 0x1753: 0x1859, 0x1754: 0x185e, 0x1755: 0x15db, 0x1756: 0x06bb, 0x1757: 0x15ef, + 0x1758: 0x15f7, 0x1759: 0x15fb, 0x175a: 0x1603, 0x175b: 0x160b, 0x175c: 0x1613, 0x175d: 0x1868, +} + +// nfkcIndex: 22 blocks, 1408 entries, 1408 bytes +// Block 0 is the zero block. +var nfkcIndex = [1408]uint8{ + // Block 0x0, offset 0x0 + // Block 0x1, offset 0x40 + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc2: 0x5c, 0xc3: 0x01, 0xc4: 0x02, 0xc5: 0x03, 0xc6: 0x5d, 0xc7: 0x04, + 0xc8: 0x05, 0xca: 0x5e, 0xcb: 0x5f, 0xcc: 0x06, 0xcd: 0x07, 0xce: 0x08, 0xcf: 0x09, + 0xd0: 0x0a, 0xd1: 0x60, 0xd2: 0x61, 0xd3: 0x0b, 0xd6: 0x0c, 0xd7: 0x62, + 0xd8: 0x63, 0xd9: 0x0d, 0xdb: 0x64, 0xdc: 0x65, 0xdd: 0x66, 0xdf: 0x67, + 0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05, + 0xea: 0x06, 0xeb: 0x07, 0xec: 0x08, 0xed: 0x09, 0xef: 0x0a, + 0xf0: 0x13, + // Block 0x4, offset 0x100 + 0x120: 0x68, 0x121: 0x69, 0x123: 0x0e, 0x124: 0x6a, 0x125: 0x6b, 0x126: 0x6c, 0x127: 0x6d, + 0x128: 0x6e, 0x129: 0x6f, 0x12a: 0x70, 0x12b: 0x71, 0x12c: 0x6c, 0x12d: 0x72, 0x12e: 0x73, 0x12f: 0x74, + 0x131: 0x75, 0x132: 0x76, 0x133: 0x77, 0x134: 0x78, 0x135: 0x79, 0x137: 0x7a, + 0x138: 0x7b, 0x139: 0x7c, 0x13a: 0x7d, 0x13b: 0x7e, 0x13c: 0x7f, 0x13d: 0x80, 0x13e: 0x81, 0x13f: 0x82, + // Block 0x5, offset 0x140 + 0x140: 0x83, 0x142: 0x84, 0x143: 0x85, 0x144: 0x86, 0x145: 0x87, 0x146: 0x88, 0x147: 0x89, + 0x14d: 0x8a, + 0x15c: 0x8b, 0x15f: 0x8c, + 0x162: 0x8d, 0x164: 0x8e, + 0x168: 0x8f, 0x169: 0x90, 0x16a: 0x91, 0x16c: 0x0f, 0x16d: 0x92, 0x16e: 0x93, 0x16f: 0x94, + 0x170: 0x95, 0x173: 0x96, 0x174: 0x97, 0x175: 0x10, 0x176: 0x11, 0x177: 0x12, + 0x178: 0x13, 0x179: 0x14, 0x17a: 0x15, 0x17b: 0x16, 0x17c: 0x17, 0x17d: 0x18, 0x17e: 0x19, 0x17f: 0x1a, + // Block 0x6, offset 0x180 + 0x180: 0x98, 0x181: 0x99, 0x182: 0x9a, 0x183: 0x9b, 0x184: 0x1b, 0x185: 0x1c, 0x186: 0x9c, 0x187: 0x9d, + 0x188: 0x9e, 0x189: 0x1d, 0x18a: 0x1e, 0x18b: 0x9f, 0x18c: 0xa0, + 0x191: 0x1f, 0x192: 0x20, 0x193: 0xa1, + 0x1a8: 0xa2, 0x1a9: 0xa3, 0x1ab: 0xa4, + 0x1b1: 0xa5, 0x1b3: 0xa6, 0x1b5: 0xa7, 0x1b7: 0xa8, + 0x1ba: 0xa9, 0x1bb: 0xaa, 0x1bc: 0x21, 0x1bd: 0x22, 0x1be: 0x23, 0x1bf: 0xab, + // Block 0x7, offset 0x1c0 + 0x1c0: 0xac, 0x1c1: 0x24, 0x1c2: 0x25, 0x1c3: 0x26, 0x1c4: 0xad, 0x1c5: 0x27, 0x1c6: 0x28, + 0x1c8: 0x29, 0x1c9: 0x2a, 0x1ca: 0x2b, 0x1cb: 0x2c, 0x1cc: 0x2d, 0x1cd: 0x2e, 0x1ce: 0x2f, 0x1cf: 0x30, + // Block 0x8, offset 0x200 + 0x219: 0xae, 0x21a: 0xaf, 0x21b: 0xb0, 0x21d: 0xb1, 0x21f: 0xb2, + 0x220: 0xb3, 0x223: 0xb4, 0x224: 0xb5, 0x225: 0xb6, 0x226: 0xb7, 0x227: 0xb8, + 0x22a: 0xb9, 0x22b: 0xba, 0x22d: 0xbb, 0x22f: 0xbc, + 0x230: 0xbd, 0x231: 0xbe, 0x232: 0xbf, 0x233: 0xc0, 0x234: 0xc1, 0x235: 0xc2, 0x236: 0xc3, 0x237: 0xbd, + 0x238: 0xbe, 0x239: 0xbf, 0x23a: 0xc0, 0x23b: 0xc1, 0x23c: 0xc2, 0x23d: 0xc3, 0x23e: 0xbd, 0x23f: 0xbe, + // Block 0x9, offset 0x240 + 0x240: 0xbf, 0x241: 0xc0, 0x242: 0xc1, 0x243: 0xc2, 0x244: 0xc3, 0x245: 0xbd, 0x246: 0xbe, 0x247: 0xbf, + 0x248: 0xc0, 0x249: 0xc1, 0x24a: 0xc2, 0x24b: 0xc3, 0x24c: 0xbd, 0x24d: 0xbe, 0x24e: 0xbf, 0x24f: 0xc0, + 0x250: 0xc1, 0x251: 0xc2, 0x252: 0xc3, 0x253: 0xbd, 0x254: 0xbe, 0x255: 0xbf, 0x256: 0xc0, 0x257: 0xc1, + 0x258: 0xc2, 0x259: 0xc3, 0x25a: 0xbd, 0x25b: 0xbe, 0x25c: 0xbf, 0x25d: 0xc0, 0x25e: 0xc1, 0x25f: 0xc2, + 0x260: 0xc3, 0x261: 0xbd, 0x262: 0xbe, 0x263: 0xbf, 0x264: 0xc0, 0x265: 0xc1, 0x266: 0xc2, 0x267: 0xc3, + 0x268: 0xbd, 0x269: 0xbe, 0x26a: 0xbf, 0x26b: 0xc0, 0x26c: 0xc1, 0x26d: 0xc2, 0x26e: 0xc3, 0x26f: 0xbd, + 0x270: 0xbe, 0x271: 0xbf, 0x272: 0xc0, 0x273: 0xc1, 0x274: 0xc2, 0x275: 0xc3, 0x276: 0xbd, 0x277: 0xbe, + 0x278: 0xbf, 0x279: 0xc0, 0x27a: 0xc1, 0x27b: 0xc2, 0x27c: 0xc3, 0x27d: 0xbd, 0x27e: 0xbe, 0x27f: 0xbf, + // Block 0xa, offset 0x280 + 0x280: 0xc0, 0x281: 0xc1, 0x282: 0xc2, 0x283: 0xc3, 0x284: 0xbd, 0x285: 0xbe, 0x286: 0xbf, 0x287: 0xc0, + 0x288: 0xc1, 0x289: 0xc2, 0x28a: 0xc3, 0x28b: 0xbd, 0x28c: 0xbe, 0x28d: 0xbf, 0x28e: 0xc0, 0x28f: 0xc1, + 0x290: 0xc2, 0x291: 0xc3, 0x292: 0xbd, 0x293: 0xbe, 0x294: 0xbf, 0x295: 0xc0, 0x296: 0xc1, 0x297: 0xc2, + 0x298: 0xc3, 0x299: 0xbd, 0x29a: 0xbe, 0x29b: 0xbf, 0x29c: 0xc0, 0x29d: 0xc1, 0x29e: 0xc2, 0x29f: 0xc3, + 0x2a0: 0xbd, 0x2a1: 0xbe, 0x2a2: 0xbf, 0x2a3: 0xc0, 0x2a4: 0xc1, 0x2a5: 0xc2, 0x2a6: 0xc3, 0x2a7: 0xbd, + 0x2a8: 0xbe, 0x2a9: 0xbf, 0x2aa: 0xc0, 0x2ab: 0xc1, 0x2ac: 0xc2, 0x2ad: 0xc3, 0x2ae: 0xbd, 0x2af: 0xbe, + 0x2b0: 0xbf, 0x2b1: 0xc0, 0x2b2: 0xc1, 0x2b3: 0xc2, 0x2b4: 0xc3, 0x2b5: 0xbd, 0x2b6: 0xbe, 0x2b7: 0xbf, + 0x2b8: 0xc0, 0x2b9: 0xc1, 0x2ba: 0xc2, 0x2bb: 0xc3, 0x2bc: 0xbd, 0x2bd: 0xbe, 0x2be: 0xbf, 0x2bf: 0xc0, + // Block 0xb, offset 0x2c0 + 0x2c0: 0xc1, 0x2c1: 0xc2, 0x2c2: 0xc3, 0x2c3: 0xbd, 0x2c4: 0xbe, 0x2c5: 0xbf, 0x2c6: 0xc0, 0x2c7: 0xc1, + 0x2c8: 0xc2, 0x2c9: 0xc3, 0x2ca: 0xbd, 0x2cb: 0xbe, 0x2cc: 0xbf, 0x2cd: 0xc0, 0x2ce: 0xc1, 0x2cf: 0xc2, + 0x2d0: 0xc3, 0x2d1: 0xbd, 0x2d2: 0xbe, 0x2d3: 0xbf, 0x2d4: 0xc0, 0x2d5: 0xc1, 0x2d6: 0xc2, 0x2d7: 0xc3, + 0x2d8: 0xbd, 0x2d9: 0xbe, 0x2da: 0xbf, 0x2db: 0xc0, 0x2dc: 0xc1, 0x2dd: 0xc2, 0x2de: 0xc4, + // Block 0xc, offset 0x300 + 0x324: 0x31, 0x325: 0x32, 0x326: 0x33, 0x327: 0x34, + 0x328: 0x35, 0x329: 0x36, 0x32a: 0x37, 0x32b: 0x38, 0x32c: 0x39, 0x32d: 0x3a, 0x32e: 0x3b, 0x32f: 0x3c, + 0x330: 0x3d, 0x331: 0x3e, 0x332: 0x3f, 0x333: 0x40, 0x334: 0x41, 0x335: 0x42, 0x336: 0x43, 0x337: 0x44, + 0x338: 0x45, 0x339: 0x46, 0x33a: 0x47, 0x33b: 0x48, 0x33c: 0xc5, 0x33d: 0x49, 0x33e: 0x4a, 0x33f: 0x4b, + // Block 0xd, offset 0x340 + 0x347: 0xc6, + 0x34b: 0xc7, 0x34d: 0xc8, + 0x368: 0xc9, 0x36b: 0xca, + 0x374: 0xcb, + 0x37d: 0xcc, + // Block 0xe, offset 0x380 + 0x381: 0xcd, 0x382: 0xce, 0x384: 0xcf, 0x385: 0xb7, 0x387: 0xd0, + 0x388: 0xd1, 0x38b: 0xd2, 0x38c: 0xd3, 0x38d: 0xd4, + 0x391: 0xd5, 0x392: 0xd6, 0x393: 0xd7, 0x396: 0xd8, 0x397: 0xd9, + 0x398: 0xda, 0x39a: 0xdb, 0x39c: 0xdc, + 0x3a0: 0xdd, + 0x3a8: 0xde, 0x3a9: 0xdf, 0x3aa: 0xe0, + 0x3b0: 0xda, 0x3b5: 0xe1, 0x3b6: 0xe2, + // Block 0xf, offset 0x3c0 + 0x3eb: 0xe3, 0x3ec: 0xe4, + // Block 0x10, offset 0x400 + 0x432: 0xe5, + // Block 0x11, offset 0x440 + 0x445: 0xe6, 0x446: 0xe7, 0x447: 0xe8, + 0x449: 0xe9, + 0x450: 0xea, 0x451: 0xeb, 0x452: 0xec, 0x453: 0xed, 0x454: 0xee, 0x455: 0xef, 0x456: 0xf0, 0x457: 0xf1, + 0x458: 0xf2, 0x459: 0xf3, 0x45a: 0x4c, 0x45b: 0xf4, 0x45c: 0xf5, 0x45d: 0xf6, 0x45e: 0xf7, 0x45f: 0x4d, + // Block 0x12, offset 0x480 + 0x480: 0xf8, + 0x4a3: 0xf9, 0x4a5: 0xfa, + 0x4b8: 0x4e, 0x4b9: 0x4f, 0x4ba: 0x50, + // Block 0x13, offset 0x4c0 + 0x4c4: 0x51, 0x4c5: 0xfb, 0x4c6: 0xfc, + 0x4c8: 0x52, 0x4c9: 0xfd, + // Block 0x14, offset 0x500 + 0x520: 0x53, 0x521: 0x54, 0x522: 0x55, 0x523: 0x56, 0x524: 0x57, 0x525: 0x58, 0x526: 0x59, 0x527: 0x5a, + 0x528: 0x5b, + // Block 0x15, offset 0x540 + 0x550: 0x0b, 0x551: 0x0c, 0x556: 0x0d, + 0x55b: 0x0e, 0x55d: 0x0f, 0x55e: 0x10, 0x55f: 0x11, + 0x56f: 0x12, +} + +// nfkcSparseOffset: 162 entries, 324 bytes +var nfkcSparseOffset = []uint16{0x0, 0xe, 0x12, 0x1b, 0x25, 0x35, 0x37, 0x3c, 0x47, 0x56, 0x63, 0x6b, 0x70, 0x75, 0x77, 0x7f, 0x86, 0x89, 0x91, 0x95, 0x99, 0x9b, 0x9d, 0xa6, 0xaa, 0xb1, 0xb6, 0xb9, 0xc3, 0xc6, 0xcd, 0xd5, 0xd9, 0xdb, 0xde, 0xe2, 0xe8, 0xf9, 0x105, 0x107, 0x10d, 0x10f, 0x111, 0x113, 0x115, 0x117, 0x119, 0x11b, 0x11e, 0x121, 0x123, 0x126, 0x129, 0x12d, 0x132, 0x13b, 0x13d, 0x140, 0x142, 0x14d, 0x158, 0x166, 0x174, 0x184, 0x192, 0x199, 0x19f, 0x1ae, 0x1b2, 0x1b4, 0x1b8, 0x1ba, 0x1bd, 0x1bf, 0x1c2, 0x1c4, 0x1c7, 0x1c9, 0x1cb, 0x1cd, 0x1d9, 0x1e3, 0x1ed, 0x1f0, 0x1f4, 0x1f6, 0x1f8, 0x1fa, 0x1fc, 0x1ff, 0x201, 0x203, 0x205, 0x207, 0x20d, 0x210, 0x214, 0x216, 0x21d, 0x223, 0x229, 0x231, 0x237, 0x23d, 0x243, 0x247, 0x249, 0x24b, 0x24d, 0x24f, 0x255, 0x258, 0x25a, 0x260, 0x263, 0x26b, 0x272, 0x275, 0x278, 0x27a, 0x27d, 0x285, 0x289, 0x290, 0x293, 0x299, 0x29b, 0x29d, 0x2a0, 0x2a2, 0x2a5, 0x2a7, 0x2a9, 0x2ab, 0x2ae, 0x2b0, 0x2b2, 0x2b4, 0x2b6, 0x2c3, 0x2cd, 0x2cf, 0x2d1, 0x2d5, 0x2da, 0x2e6, 0x2eb, 0x2f4, 0x2fa, 0x2ff, 0x303, 0x308, 0x30c, 0x31c, 0x32a, 0x338, 0x346, 0x34c, 0x34e, 0x351, 0x35b, 0x35d} + +// nfkcSparseValues: 871 entries, 3484 bytes +var nfkcSparseValues = [871]valueRange{ + // Block 0x0, offset 0x0 + {value: 0x0002, lo: 0x0d}, + {value: 0x0001, lo: 0xa0, hi: 0xa0}, + {value: 0x4278, lo: 0xa8, hi: 0xa8}, + {value: 0x0083, lo: 0xaa, hi: 0xaa}, + {value: 0x4264, lo: 0xaf, hi: 0xaf}, + {value: 0x0025, lo: 0xb2, hi: 0xb3}, + {value: 0x425a, lo: 0xb4, hi: 0xb4}, + {value: 0x01dc, lo: 0xb5, hi: 0xb5}, + {value: 0x4291, lo: 0xb8, hi: 0xb8}, + {value: 0x0023, lo: 0xb9, hi: 0xb9}, + {value: 0x009f, lo: 0xba, hi: 0xba}, + {value: 0x221c, lo: 0xbc, hi: 0xbc}, + {value: 0x2210, lo: 0xbd, hi: 0xbd}, + {value: 0x22b2, lo: 0xbe, hi: 0xbe}, + // Block 0x1, offset 0xe + {value: 0x0091, lo: 0x03}, + {value: 0x46e2, lo: 0xa0, hi: 0xa1}, + {value: 0x4714, lo: 0xaf, hi: 0xb0}, + {value: 0xa000, lo: 0xb7, hi: 0xb7}, + // Block 0x2, offset 0x12 + {value: 0x0003, lo: 0x08}, + {value: 0xa000, lo: 0x92, hi: 0x92}, + {value: 0x0091, lo: 0xb0, hi: 0xb0}, + {value: 0x0119, lo: 0xb1, hi: 0xb1}, + {value: 0x0095, lo: 0xb2, hi: 0xb2}, + {value: 0x00a5, lo: 0xb3, hi: 0xb3}, + {value: 0x0143, lo: 0xb4, hi: 0xb6}, + {value: 0x00af, lo: 0xb7, hi: 0xb7}, + {value: 0x00b3, lo: 0xb8, hi: 0xb8}, + // Block 0x3, offset 0x1b + {value: 0x000a, lo: 0x09}, + {value: 0x426e, lo: 0x98, hi: 0x98}, + {value: 0x4273, lo: 0x99, hi: 0x9a}, + {value: 0x4296, lo: 0x9b, hi: 0x9b}, + {value: 0x425f, lo: 0x9c, hi: 0x9c}, + {value: 0x4282, lo: 0x9d, hi: 0x9d}, + {value: 0x0113, lo: 0xa0, hi: 0xa0}, + {value: 0x0099, lo: 0xa1, hi: 0xa1}, + {value: 0x00a7, lo: 0xa2, hi: 0xa3}, + {value: 0x0167, lo: 0xa4, hi: 0xa4}, + // Block 0x4, offset 0x25 + {value: 0x0000, lo: 0x0f}, + {value: 0xa000, lo: 0x83, hi: 0x83}, + {value: 0xa000, lo: 0x87, hi: 0x87}, + {value: 0xa000, lo: 0x8b, hi: 0x8b}, + {value: 0xa000, lo: 0x8d, hi: 0x8d}, + {value: 0x37a5, lo: 0x90, hi: 0x90}, + {value: 0x37b1, lo: 0x91, hi: 0x91}, + {value: 0x379f, lo: 0x93, hi: 0x93}, + {value: 0xa000, lo: 0x96, hi: 0x96}, + {value: 0x3817, lo: 0x97, hi: 0x97}, + {value: 0x37e1, lo: 0x9c, hi: 0x9c}, + {value: 0x37c9, lo: 0x9d, hi: 0x9d}, + {value: 0x37f3, lo: 0x9e, hi: 0x9e}, + {value: 0xa000, lo: 0xb4, hi: 0xb5}, + {value: 0x381d, lo: 0xb6, hi: 0xb6}, + {value: 0x3823, lo: 0xb7, hi: 0xb7}, + // Block 0x5, offset 0x35 + {value: 0x0000, lo: 0x01}, + {value: 0x8132, lo: 0x83, hi: 0x87}, + // Block 0x6, offset 0x37 + {value: 0x0001, lo: 0x04}, + {value: 0x8113, lo: 0x81, hi: 0x82}, + {value: 0x8132, lo: 0x84, hi: 0x84}, + {value: 0x812d, lo: 0x85, hi: 0x85}, + {value: 0x810d, lo: 0x87, hi: 0x87}, + // Block 0x7, offset 0x3c + {value: 0x0000, lo: 0x0a}, + {value: 0x8132, lo: 0x90, hi: 0x97}, + {value: 0x8119, lo: 0x98, hi: 0x98}, + {value: 0x811a, lo: 0x99, hi: 0x99}, + {value: 0x811b, lo: 0x9a, hi: 0x9a}, + {value: 0x3841, lo: 0xa2, hi: 0xa2}, + {value: 0x3847, lo: 0xa3, hi: 0xa3}, + {value: 0x3853, lo: 0xa4, hi: 0xa4}, + {value: 0x384d, lo: 0xa5, hi: 0xa5}, + {value: 0x3859, lo: 0xa6, hi: 0xa6}, + {value: 0xa000, lo: 0xa7, hi: 0xa7}, + // Block 0x8, offset 0x47 + {value: 0x0000, lo: 0x0e}, + {value: 0x386b, lo: 0x80, hi: 0x80}, + {value: 0xa000, lo: 0x81, hi: 0x81}, + {value: 0x385f, lo: 0x82, hi: 0x82}, + {value: 0xa000, lo: 0x92, hi: 0x92}, + {value: 0x3865, lo: 0x93, hi: 0x93}, + {value: 0xa000, lo: 0x95, hi: 0x95}, + {value: 0x8132, lo: 0x96, hi: 0x9c}, + {value: 0x8132, lo: 0x9f, hi: 0xa2}, + {value: 0x812d, lo: 0xa3, hi: 0xa3}, + {value: 0x8132, lo: 0xa4, hi: 0xa4}, + {value: 0x8132, lo: 0xa7, hi: 0xa8}, + {value: 0x812d, lo: 0xaa, hi: 0xaa}, + {value: 0x8132, lo: 0xab, hi: 0xac}, + {value: 0x812d, lo: 0xad, hi: 0xad}, + // Block 0x9, offset 0x56 + {value: 0x0000, lo: 0x0c}, + {value: 0x811f, lo: 0x91, hi: 0x91}, + {value: 0x8132, lo: 0xb0, hi: 0xb0}, + {value: 0x812d, lo: 0xb1, hi: 0xb1}, + {value: 0x8132, lo: 0xb2, hi: 0xb3}, + {value: 0x812d, lo: 0xb4, hi: 0xb4}, + {value: 0x8132, lo: 0xb5, hi: 0xb6}, + {value: 0x812d, lo: 0xb7, hi: 0xb9}, + {value: 0x8132, lo: 0xba, hi: 0xba}, + {value: 0x812d, lo: 0xbb, hi: 0xbc}, + {value: 0x8132, lo: 0xbd, hi: 0xbd}, + {value: 0x812d, lo: 0xbe, hi: 0xbe}, + {value: 0x8132, lo: 0xbf, hi: 0xbf}, + // Block 0xa, offset 0x63 + {value: 0x0005, lo: 0x07}, + {value: 0x8132, lo: 0x80, hi: 0x80}, + {value: 0x8132, lo: 0x81, hi: 0x81}, + {value: 0x812d, lo: 0x82, hi: 0x83}, + {value: 0x812d, lo: 0x84, hi: 0x85}, + {value: 0x812d, lo: 0x86, hi: 0x87}, + {value: 0x812d, lo: 0x88, hi: 0x89}, + {value: 0x8132, lo: 0x8a, hi: 0x8a}, + // Block 0xb, offset 0x6b + {value: 0x0000, lo: 0x04}, + {value: 0x8132, lo: 0xab, hi: 0xb1}, + {value: 0x812d, lo: 0xb2, hi: 0xb2}, + {value: 0x8132, lo: 0xb3, hi: 0xb3}, + {value: 0x812d, lo: 0xbd, hi: 0xbd}, + // Block 0xc, offset 0x70 + {value: 0x0000, lo: 0x04}, + {value: 0x8132, lo: 0x96, hi: 0x99}, + {value: 0x8132, lo: 0x9b, hi: 0xa3}, + {value: 0x8132, lo: 0xa5, hi: 0xa7}, + {value: 0x8132, lo: 0xa9, hi: 0xad}, + // Block 0xd, offset 0x75 + {value: 0x0000, lo: 0x01}, + {value: 0x812d, lo: 0x99, hi: 0x9b}, + // Block 0xe, offset 0x77 + {value: 0x0000, lo: 0x07}, + {value: 0xa000, lo: 0xa8, hi: 0xa8}, + {value: 0x3ed8, lo: 0xa9, hi: 0xa9}, + {value: 0xa000, lo: 0xb0, hi: 0xb0}, + {value: 0x3ee0, lo: 0xb1, hi: 0xb1}, + {value: 0xa000, lo: 0xb3, hi: 0xb3}, + {value: 0x3ee8, lo: 0xb4, hi: 0xb4}, + {value: 0x9902, lo: 0xbc, hi: 0xbc}, + // Block 0xf, offset 0x7f + {value: 0x0008, lo: 0x06}, + {value: 0x8104, lo: 0x8d, hi: 0x8d}, + {value: 0x8132, lo: 0x91, hi: 0x91}, + {value: 0x812d, lo: 0x92, hi: 0x92}, + {value: 0x8132, lo: 0x93, hi: 0x93}, + {value: 0x8132, lo: 0x94, hi: 0x94}, + {value: 0x451c, lo: 0x98, hi: 0x9f}, + // Block 0x10, offset 0x86 + {value: 0x0000, lo: 0x02}, + {value: 0x8102, lo: 0xbc, hi: 0xbc}, + {value: 0x9900, lo: 0xbe, hi: 0xbe}, + // Block 0x11, offset 0x89 + {value: 0x0008, lo: 0x07}, + {value: 0xa000, lo: 0x87, hi: 0x87}, + {value: 0x2c9e, lo: 0x8b, hi: 0x8c}, + {value: 0x8104, lo: 0x8d, hi: 0x8d}, + {value: 0x9900, lo: 0x97, hi: 0x97}, + {value: 0x455c, lo: 0x9c, hi: 0x9d}, + {value: 0x456c, lo: 0x9f, hi: 0x9f}, + {value: 0x8132, lo: 0xbe, hi: 0xbe}, + // Block 0x12, offset 0x91 + {value: 0x0000, lo: 0x03}, + {value: 0x4594, lo: 0xb3, hi: 0xb3}, + {value: 0x459c, lo: 0xb6, hi: 0xb6}, + {value: 0x8102, lo: 0xbc, hi: 0xbc}, + // Block 0x13, offset 0x95 + {value: 0x0008, lo: 0x03}, + {value: 0x8104, lo: 0x8d, hi: 0x8d}, + {value: 0x4574, lo: 0x99, hi: 0x9b}, + {value: 0x458c, lo: 0x9e, hi: 0x9e}, + // Block 0x14, offset 0x99 + {value: 0x0000, lo: 0x01}, + {value: 0x8102, lo: 0xbc, hi: 0xbc}, + // Block 0x15, offset 0x9b + {value: 0x0000, lo: 0x01}, + {value: 0x8104, lo: 0x8d, hi: 0x8d}, + // Block 0x16, offset 0x9d + {value: 0x0000, lo: 0x08}, + {value: 0xa000, lo: 0x87, hi: 0x87}, + {value: 0x2cb6, lo: 0x88, hi: 0x88}, + {value: 0x2cae, lo: 0x8b, hi: 0x8b}, + {value: 0x2cbe, lo: 0x8c, hi: 0x8c}, + {value: 0x8104, lo: 0x8d, hi: 0x8d}, + {value: 0x9900, lo: 0x96, hi: 0x97}, + {value: 0x45a4, lo: 0x9c, hi: 0x9c}, + {value: 0x45ac, lo: 0x9d, hi: 0x9d}, + // Block 0x17, offset 0xa6 + {value: 0x0000, lo: 0x03}, + {value: 0xa000, lo: 0x92, hi: 0x92}, + {value: 0x2cc6, lo: 0x94, hi: 0x94}, + {value: 0x9900, lo: 0xbe, hi: 0xbe}, + // Block 0x18, offset 0xaa + {value: 0x0000, lo: 0x06}, + {value: 0xa000, lo: 0x86, hi: 0x87}, + {value: 0x2cce, lo: 0x8a, hi: 0x8a}, + {value: 0x2cde, lo: 0x8b, hi: 0x8b}, + {value: 0x2cd6, lo: 0x8c, hi: 0x8c}, + {value: 0x8104, lo: 0x8d, hi: 0x8d}, + {value: 0x9900, lo: 0x97, hi: 0x97}, + // Block 0x19, offset 0xb1 + {value: 0x1801, lo: 0x04}, + {value: 0xa000, lo: 0x86, hi: 0x86}, + {value: 0x3ef0, lo: 0x88, hi: 0x88}, + {value: 0x8104, lo: 0x8d, hi: 0x8d}, + {value: 0x8120, lo: 0x95, hi: 0x96}, + // Block 0x1a, offset 0xb6 + {value: 0x0000, lo: 0x02}, + {value: 0x8102, lo: 0xbc, hi: 0xbc}, + {value: 0xa000, lo: 0xbf, hi: 0xbf}, + // Block 0x1b, offset 0xb9 + {value: 0x0000, lo: 0x09}, + {value: 0x2ce6, lo: 0x80, hi: 0x80}, + {value: 0x9900, lo: 0x82, hi: 0x82}, + {value: 0xa000, lo: 0x86, hi: 0x86}, + {value: 0x2cee, lo: 0x87, hi: 0x87}, + {value: 0x2cf6, lo: 0x88, hi: 0x88}, + {value: 0x2f50, lo: 0x8a, hi: 0x8a}, + {value: 0x2dd8, lo: 0x8b, hi: 0x8b}, + {value: 0x8104, lo: 0x8d, hi: 0x8d}, + {value: 0x9900, lo: 0x95, hi: 0x96}, + // Block 0x1c, offset 0xc3 + {value: 0x0000, lo: 0x02}, + {value: 0x8104, lo: 0xbb, hi: 0xbc}, + {value: 0x9900, lo: 0xbe, hi: 0xbe}, + // Block 0x1d, offset 0xc6 + {value: 0x0000, lo: 0x06}, + {value: 0xa000, lo: 0x86, hi: 0x87}, + {value: 0x2cfe, lo: 0x8a, hi: 0x8a}, + {value: 0x2d0e, lo: 0x8b, hi: 0x8b}, + {value: 0x2d06, lo: 0x8c, hi: 0x8c}, + {value: 0x8104, lo: 0x8d, hi: 0x8d}, + {value: 0x9900, lo: 0x97, hi: 0x97}, + // Block 0x1e, offset 0xcd + {value: 0x6bea, lo: 0x07}, + {value: 0x9904, lo: 0x8a, hi: 0x8a}, + {value: 0x9900, lo: 0x8f, hi: 0x8f}, + {value: 0xa000, lo: 0x99, hi: 0x99}, + {value: 0x3ef8, lo: 0x9a, hi: 0x9a}, + {value: 0x2f58, lo: 0x9c, hi: 0x9c}, + {value: 0x2de3, lo: 0x9d, hi: 0x9d}, + {value: 0x2d16, lo: 0x9e, hi: 0x9f}, + // Block 0x1f, offset 0xd5 + {value: 0x0000, lo: 0x03}, + {value: 0x2621, lo: 0xb3, hi: 0xb3}, + {value: 0x8122, lo: 0xb8, hi: 0xb9}, + {value: 0x8104, lo: 0xba, hi: 0xba}, + // Block 0x20, offset 0xd9 + {value: 0x0000, lo: 0x01}, + {value: 0x8123, lo: 0x88, hi: 0x8b}, + // Block 0x21, offset 0xdb + {value: 0x0000, lo: 0x02}, + {value: 0x2636, lo: 0xb3, hi: 0xb3}, + {value: 0x8124, lo: 0xb8, hi: 0xb9}, + // Block 0x22, offset 0xde + {value: 0x0000, lo: 0x03}, + {value: 0x8125, lo: 0x88, hi: 0x8b}, + {value: 0x2628, lo: 0x9c, hi: 0x9c}, + {value: 0x262f, lo: 0x9d, hi: 0x9d}, + // Block 0x23, offset 0xe2 + {value: 0x0000, lo: 0x05}, + {value: 0x030b, lo: 0x8c, hi: 0x8c}, + {value: 0x812d, lo: 0x98, hi: 0x99}, + {value: 0x812d, lo: 0xb5, hi: 0xb5}, + {value: 0x812d, lo: 0xb7, hi: 0xb7}, + {value: 0x812b, lo: 0xb9, hi: 0xb9}, + // Block 0x24, offset 0xe8 + {value: 0x0000, lo: 0x10}, + {value: 0x2644, lo: 0x83, hi: 0x83}, + {value: 0x264b, lo: 0x8d, hi: 0x8d}, + {value: 0x2652, lo: 0x92, hi: 0x92}, + {value: 0x2659, lo: 0x97, hi: 0x97}, + {value: 0x2660, lo: 0x9c, hi: 0x9c}, + {value: 0x263d, lo: 0xa9, hi: 0xa9}, + {value: 0x8126, lo: 0xb1, hi: 0xb1}, + {value: 0x8127, lo: 0xb2, hi: 0xb2}, + {value: 0x4a84, lo: 0xb3, hi: 0xb3}, + {value: 0x8128, lo: 0xb4, hi: 0xb4}, + {value: 0x4a8d, lo: 0xb5, hi: 0xb5}, + {value: 0x45b4, lo: 0xb6, hi: 0xb6}, + {value: 0x45f4, lo: 0xb7, hi: 0xb7}, + {value: 0x45bc, lo: 0xb8, hi: 0xb8}, + {value: 0x45ff, lo: 0xb9, hi: 0xb9}, + {value: 0x8127, lo: 0xba, hi: 0xbd}, + // Block 0x25, offset 0xf9 + {value: 0x0000, lo: 0x0b}, + {value: 0x8127, lo: 0x80, hi: 0x80}, + {value: 0x4a96, lo: 0x81, hi: 0x81}, + {value: 0x8132, lo: 0x82, hi: 0x83}, + {value: 0x8104, lo: 0x84, hi: 0x84}, + {value: 0x8132, lo: 0x86, hi: 0x87}, + {value: 0x266e, lo: 0x93, hi: 0x93}, + {value: 0x2675, lo: 0x9d, hi: 0x9d}, + {value: 0x267c, lo: 0xa2, hi: 0xa2}, + {value: 0x2683, lo: 0xa7, hi: 0xa7}, + {value: 0x268a, lo: 0xac, hi: 0xac}, + {value: 0x2667, lo: 0xb9, hi: 0xb9}, + // Block 0x26, offset 0x105 + {value: 0x0000, lo: 0x01}, + {value: 0x812d, lo: 0x86, hi: 0x86}, + // Block 0x27, offset 0x107 + {value: 0x0000, lo: 0x05}, + {value: 0xa000, lo: 0xa5, hi: 0xa5}, + {value: 0x2d1e, lo: 0xa6, hi: 0xa6}, + {value: 0x9900, lo: 0xae, hi: 0xae}, + {value: 0x8102, lo: 0xb7, hi: 0xb7}, + {value: 0x8104, lo: 0xb9, hi: 0xba}, + // Block 0x28, offset 0x10d + {value: 0x0000, lo: 0x01}, + {value: 0x812d, lo: 0x8d, hi: 0x8d}, + // Block 0x29, offset 0x10f + {value: 0x0000, lo: 0x01}, + {value: 0x030f, lo: 0xbc, hi: 0xbc}, + // Block 0x2a, offset 0x111 + {value: 0x0000, lo: 0x01}, + {value: 0xa000, lo: 0x80, hi: 0x92}, + // Block 0x2b, offset 0x113 + {value: 0x0000, lo: 0x01}, + {value: 0xb900, lo: 0xa1, hi: 0xb5}, + // Block 0x2c, offset 0x115 + {value: 0x0000, lo: 0x01}, + {value: 0x9900, lo: 0xa8, hi: 0xbf}, + // Block 0x2d, offset 0x117 + {value: 0x0000, lo: 0x01}, + {value: 0x9900, lo: 0x80, hi: 0x82}, + // Block 0x2e, offset 0x119 + {value: 0x0000, lo: 0x01}, + {value: 0x8132, lo: 0x9d, hi: 0x9f}, + // Block 0x2f, offset 0x11b + {value: 0x0000, lo: 0x02}, + {value: 0x8104, lo: 0x94, hi: 0x94}, + {value: 0x8104, lo: 0xb4, hi: 0xb4}, + // Block 0x30, offset 0x11e + {value: 0x0000, lo: 0x02}, + {value: 0x8104, lo: 0x92, hi: 0x92}, + {value: 0x8132, lo: 0x9d, hi: 0x9d}, + // Block 0x31, offset 0x121 + {value: 0x0000, lo: 0x01}, + {value: 0x8131, lo: 0xa9, hi: 0xa9}, + // Block 0x32, offset 0x123 + {value: 0x0004, lo: 0x02}, + {value: 0x812e, lo: 0xb9, hi: 0xba}, + {value: 0x812d, lo: 0xbb, hi: 0xbb}, + // Block 0x33, offset 0x126 + {value: 0x0000, lo: 0x02}, + {value: 0x8132, lo: 0x97, hi: 0x97}, + {value: 0x812d, lo: 0x98, hi: 0x98}, + // Block 0x34, offset 0x129 + {value: 0x0000, lo: 0x03}, + {value: 0x8104, lo: 0xa0, hi: 0xa0}, + {value: 0x8132, lo: 0xb5, hi: 0xbc}, + {value: 0x812d, lo: 0xbf, hi: 0xbf}, + // Block 0x35, offset 0x12d + {value: 0x0000, lo: 0x04}, + {value: 0x8132, lo: 0xb0, hi: 0xb4}, + {value: 0x812d, lo: 0xb5, hi: 0xba}, + {value: 0x8132, lo: 0xbb, hi: 0xbc}, + {value: 0x812d, lo: 0xbd, hi: 0xbd}, + // Block 0x36, offset 0x132 + {value: 0x0000, lo: 0x08}, + {value: 0x2d66, lo: 0x80, hi: 0x80}, + {value: 0x2d6e, lo: 0x81, hi: 0x81}, + {value: 0xa000, lo: 0x82, hi: 0x82}, + {value: 0x2d76, lo: 0x83, hi: 0x83}, + {value: 0x8104, lo: 0x84, hi: 0x84}, + {value: 0x8132, lo: 0xab, hi: 0xab}, + {value: 0x812d, lo: 0xac, hi: 0xac}, + {value: 0x8132, lo: 0xad, hi: 0xb3}, + // Block 0x37, offset 0x13b + {value: 0x0000, lo: 0x01}, + {value: 0x8104, lo: 0xaa, hi: 0xab}, + // Block 0x38, offset 0x13d + {value: 0x0000, lo: 0x02}, + {value: 0x8102, lo: 0xa6, hi: 0xa6}, + {value: 0x8104, lo: 0xb2, hi: 0xb3}, + // Block 0x39, offset 0x140 + {value: 0x0000, lo: 0x01}, + {value: 0x8102, lo: 0xb7, hi: 0xb7}, + // Block 0x3a, offset 0x142 + {value: 0x0000, lo: 0x0a}, + {value: 0x8132, lo: 0x90, hi: 0x92}, + {value: 0x8101, lo: 0x94, hi: 0x94}, + {value: 0x812d, lo: 0x95, hi: 0x99}, + {value: 0x8132, lo: 0x9a, hi: 0x9b}, + {value: 0x812d, lo: 0x9c, hi: 0x9f}, + {value: 0x8132, lo: 0xa0, hi: 0xa0}, + {value: 0x8101, lo: 0xa2, hi: 0xa8}, + {value: 0x812d, lo: 0xad, hi: 0xad}, + {value: 0x8132, lo: 0xb4, hi: 0xb4}, + {value: 0x8132, lo: 0xb8, hi: 0xb9}, + // Block 0x3b, offset 0x14d + {value: 0x0002, lo: 0x0a}, + {value: 0x0043, lo: 0xac, hi: 0xac}, + {value: 0x00d1, lo: 0xad, hi: 0xad}, + {value: 0x0045, lo: 0xae, hi: 0xae}, + {value: 0x0049, lo: 0xb0, hi: 0xb1}, + {value: 0x00e6, lo: 0xb2, hi: 0xb2}, + {value: 0x004f, lo: 0xb3, hi: 0xba}, + {value: 0x005f, lo: 0xbc, hi: 0xbc}, + {value: 0x00ef, lo: 0xbd, hi: 0xbd}, + {value: 0x0061, lo: 0xbe, hi: 0xbe}, + {value: 0x0065, lo: 0xbf, hi: 0xbf}, + // Block 0x3c, offset 0x158 + {value: 0x0000, lo: 0x0d}, + {value: 0x0001, lo: 0x80, hi: 0x8a}, + {value: 0x043b, lo: 0x91, hi: 0x91}, + {value: 0x429b, lo: 0x97, hi: 0x97}, + {value: 0x001d, lo: 0xa4, hi: 0xa4}, + {value: 0x1873, lo: 0xa5, hi: 0xa5}, + {value: 0x1b5c, lo: 0xa6, hi: 0xa6}, + {value: 0x0001, lo: 0xaf, hi: 0xaf}, + {value: 0x2691, lo: 0xb3, hi: 0xb3}, + {value: 0x27fe, lo: 0xb4, hi: 0xb4}, + {value: 0x2698, lo: 0xb6, hi: 0xb6}, + {value: 0x2808, lo: 0xb7, hi: 0xb7}, + {value: 0x186d, lo: 0xbc, hi: 0xbc}, + {value: 0x4269, lo: 0xbe, hi: 0xbe}, + // Block 0x3d, offset 0x166 + {value: 0x0002, lo: 0x0d}, + {value: 0x1933, lo: 0x87, hi: 0x87}, + {value: 0x1930, lo: 0x88, hi: 0x88}, + {value: 0x1870, lo: 0x89, hi: 0x89}, + {value: 0x298e, lo: 0x97, hi: 0x97}, + {value: 0x0001, lo: 0x9f, hi: 0x9f}, + {value: 0x0021, lo: 0xb0, hi: 0xb0}, + {value: 0x0093, lo: 0xb1, hi: 0xb1}, + {value: 0x0029, lo: 0xb4, hi: 0xb9}, + {value: 0x0017, lo: 0xba, hi: 0xba}, + {value: 0x0467, lo: 0xbb, hi: 0xbb}, + {value: 0x003b, lo: 0xbc, hi: 0xbc}, + {value: 0x0011, lo: 0xbd, hi: 0xbe}, + {value: 0x009d, lo: 0xbf, hi: 0xbf}, + // Block 0x3e, offset 0x174 + {value: 0x0002, lo: 0x0f}, + {value: 0x0021, lo: 0x80, hi: 0x89}, + {value: 0x0017, lo: 0x8a, hi: 0x8a}, + {value: 0x0467, lo: 0x8b, hi: 0x8b}, + {value: 0x003b, lo: 0x8c, hi: 0x8c}, + {value: 0x0011, lo: 0x8d, hi: 0x8e}, + {value: 0x0083, lo: 0x90, hi: 0x90}, + {value: 0x008b, lo: 0x91, hi: 0x91}, + {value: 0x009f, lo: 0x92, hi: 0x92}, + {value: 0x00b1, lo: 0x93, hi: 0x93}, + {value: 0x0104, lo: 0x94, hi: 0x94}, + {value: 0x0091, lo: 0x95, hi: 0x95}, + {value: 0x0097, lo: 0x96, hi: 0x99}, + {value: 0x00a1, lo: 0x9a, hi: 0x9a}, + {value: 0x00a7, lo: 0x9b, hi: 0x9c}, + {value: 0x1999, lo: 0xa8, hi: 0xa8}, + // Block 0x3f, offset 0x184 + {value: 0x0000, lo: 0x0d}, + {value: 0x8132, lo: 0x90, hi: 0x91}, + {value: 0x8101, lo: 0x92, hi: 0x93}, + {value: 0x8132, lo: 0x94, hi: 0x97}, + {value: 0x8101, lo: 0x98, hi: 0x9a}, + {value: 0x8132, lo: 0x9b, hi: 0x9c}, + {value: 0x8132, lo: 0xa1, hi: 0xa1}, + {value: 0x8101, lo: 0xa5, hi: 0xa6}, + {value: 0x8132, lo: 0xa7, hi: 0xa7}, + {value: 0x812d, lo: 0xa8, hi: 0xa8}, + {value: 0x8132, lo: 0xa9, hi: 0xa9}, + {value: 0x8101, lo: 0xaa, hi: 0xab}, + {value: 0x812d, lo: 0xac, hi: 0xaf}, + {value: 0x8132, lo: 0xb0, hi: 0xb0}, + // Block 0x40, offset 0x192 + {value: 0x0007, lo: 0x06}, + {value: 0x2180, lo: 0x89, hi: 0x89}, + {value: 0xa000, lo: 0x90, hi: 0x90}, + {value: 0xa000, lo: 0x92, hi: 0x92}, + {value: 0xa000, lo: 0x94, hi: 0x94}, + {value: 0x3bb9, lo: 0x9a, hi: 0x9b}, + {value: 0x3bc7, lo: 0xae, hi: 0xae}, + // Block 0x41, offset 0x199 + {value: 0x000e, lo: 0x05}, + {value: 0x3bce, lo: 0x8d, hi: 0x8e}, + {value: 0x3bd5, lo: 0x8f, hi: 0x8f}, + {value: 0xa000, lo: 0x90, hi: 0x90}, + {value: 0xa000, lo: 0x92, hi: 0x92}, + {value: 0xa000, lo: 0x94, hi: 0x94}, + // Block 0x42, offset 0x19f + {value: 0x0173, lo: 0x0e}, + {value: 0xa000, lo: 0x83, hi: 0x83}, + {value: 0x3be3, lo: 0x84, hi: 0x84}, + {value: 0xa000, lo: 0x88, hi: 0x88}, + {value: 0x3bea, lo: 0x89, hi: 0x89}, + {value: 0xa000, lo: 0x8b, hi: 0x8b}, + {value: 0x3bf1, lo: 0x8c, hi: 0x8c}, + {value: 0xa000, lo: 0xa3, hi: 0xa3}, + {value: 0x3bf8, lo: 0xa4, hi: 0xa4}, + {value: 0xa000, lo: 0xa5, hi: 0xa5}, + {value: 0x3bff, lo: 0xa6, hi: 0xa6}, + {value: 0x269f, lo: 0xac, hi: 0xad}, + {value: 0x26a6, lo: 0xaf, hi: 0xaf}, + {value: 0x281c, lo: 0xb0, hi: 0xb0}, + {value: 0xa000, lo: 0xbc, hi: 0xbc}, + // Block 0x43, offset 0x1ae + {value: 0x0007, lo: 0x03}, + {value: 0x3c68, lo: 0xa0, hi: 0xa1}, + {value: 0x3c92, lo: 0xa2, hi: 0xa3}, + {value: 0x3cbc, lo: 0xaa, hi: 0xad}, + // Block 0x44, offset 0x1b2 + {value: 0x0004, lo: 0x01}, + {value: 0x048b, lo: 0xa9, hi: 0xaa}, + // Block 0x45, offset 0x1b4 + {value: 0x0002, lo: 0x03}, + {value: 0x0057, lo: 0x80, hi: 0x8f}, + {value: 0x0083, lo: 0x90, hi: 0xa9}, + {value: 0x0021, lo: 0xaa, hi: 0xaa}, + // Block 0x46, offset 0x1b8 + {value: 0x0000, lo: 0x01}, + {value: 0x299b, lo: 0x8c, hi: 0x8c}, + // Block 0x47, offset 0x1ba + {value: 0x0263, lo: 0x02}, + {value: 0x1b8c, lo: 0xb4, hi: 0xb4}, + {value: 0x192d, lo: 0xb5, hi: 0xb6}, + // Block 0x48, offset 0x1bd + {value: 0x0000, lo: 0x01}, + {value: 0x44dd, lo: 0x9c, hi: 0x9c}, + // Block 0x49, offset 0x1bf + {value: 0x0000, lo: 0x02}, + {value: 0x0095, lo: 0xbc, hi: 0xbc}, + {value: 0x006d, lo: 0xbd, hi: 0xbd}, + // Block 0x4a, offset 0x1c2 + {value: 0x0000, lo: 0x01}, + {value: 0x8132, lo: 0xaf, hi: 0xb1}, + // Block 0x4b, offset 0x1c4 + {value: 0x0000, lo: 0x02}, + {value: 0x047f, lo: 0xaf, hi: 0xaf}, + {value: 0x8104, lo: 0xbf, hi: 0xbf}, + // Block 0x4c, offset 0x1c7 + {value: 0x0000, lo: 0x01}, + {value: 0x8132, lo: 0xa0, hi: 0xbf}, + // Block 0x4d, offset 0x1c9 + {value: 0x0000, lo: 0x01}, + {value: 0x0dc3, lo: 0x9f, hi: 0x9f}, + // Block 0x4e, offset 0x1cb + {value: 0x0000, lo: 0x01}, + {value: 0x162f, lo: 0xb3, hi: 0xb3}, + // Block 0x4f, offset 0x1cd + {value: 0x0004, lo: 0x0b}, + {value: 0x1597, lo: 0x80, hi: 0x82}, + {value: 0x15af, lo: 0x83, hi: 0x83}, + {value: 0x15c7, lo: 0x84, hi: 0x85}, + {value: 0x15d7, lo: 0x86, hi: 0x89}, + {value: 0x15eb, lo: 0x8a, hi: 0x8c}, + {value: 0x15ff, lo: 0x8d, hi: 0x8d}, + {value: 0x1607, lo: 0x8e, hi: 0x8e}, + {value: 0x160f, lo: 0x8f, hi: 0x90}, + {value: 0x161b, lo: 0x91, hi: 0x93}, + {value: 0x162b, lo: 0x94, hi: 0x94}, + {value: 0x1633, lo: 0x95, hi: 0x95}, + // Block 0x50, offset 0x1d9 + {value: 0x0004, lo: 0x09}, + {value: 0x0001, lo: 0x80, hi: 0x80}, + {value: 0x812c, lo: 0xaa, hi: 0xaa}, + {value: 0x8131, lo: 0xab, hi: 0xab}, + {value: 0x8133, lo: 0xac, hi: 0xac}, + {value: 0x812e, lo: 0xad, hi: 0xad}, + {value: 0x812f, lo: 0xae, hi: 0xae}, + {value: 0x812f, lo: 0xaf, hi: 0xaf}, + {value: 0x04b3, lo: 0xb6, hi: 0xb6}, + {value: 0x0887, lo: 0xb8, hi: 0xba}, + // Block 0x51, offset 0x1e3 + {value: 0x0006, lo: 0x09}, + {value: 0x0313, lo: 0xb1, hi: 0xb1}, + {value: 0x0317, lo: 0xb2, hi: 0xb2}, + {value: 0x4a3b, lo: 0xb3, hi: 0xb3}, + {value: 0x031b, lo: 0xb4, hi: 0xb4}, + {value: 0x4a41, lo: 0xb5, hi: 0xb6}, + {value: 0x031f, lo: 0xb7, hi: 0xb7}, + {value: 0x0323, lo: 0xb8, hi: 0xb8}, + {value: 0x0327, lo: 0xb9, hi: 0xb9}, + {value: 0x4a4d, lo: 0xba, hi: 0xbf}, + // Block 0x52, offset 0x1ed + {value: 0x0000, lo: 0x02}, + {value: 0x8132, lo: 0xaf, hi: 0xaf}, + {value: 0x8132, lo: 0xb4, hi: 0xbd}, + // Block 0x53, offset 0x1f0 + {value: 0x0000, lo: 0x03}, + {value: 0x020f, lo: 0x9c, hi: 0x9c}, + {value: 0x0212, lo: 0x9d, hi: 0x9d}, + {value: 0x8132, lo: 0x9e, hi: 0x9f}, + // Block 0x54, offset 0x1f4 + {value: 0x0000, lo: 0x01}, + {value: 0x8132, lo: 0xb0, hi: 0xb1}, + // Block 0x55, offset 0x1f6 + {value: 0x0000, lo: 0x01}, + {value: 0x163b, lo: 0xb0, hi: 0xb0}, + // Block 0x56, offset 0x1f8 + {value: 0x000c, lo: 0x01}, + {value: 0x00d7, lo: 0xb8, hi: 0xb9}, + // Block 0x57, offset 0x1fa + {value: 0x0000, lo: 0x01}, + {value: 0x8104, lo: 0x86, hi: 0x86}, + // Block 0x58, offset 0x1fc + {value: 0x0000, lo: 0x02}, + {value: 0x8104, lo: 0x84, hi: 0x84}, + {value: 0x8132, lo: 0xa0, hi: 0xb1}, + // Block 0x59, offset 0x1ff + {value: 0x0000, lo: 0x01}, + {value: 0x812d, lo: 0xab, hi: 0xad}, + // Block 0x5a, offset 0x201 + {value: 0x0000, lo: 0x01}, + {value: 0x8104, lo: 0x93, hi: 0x93}, + // Block 0x5b, offset 0x203 + {value: 0x0000, lo: 0x01}, + {value: 0x8102, lo: 0xb3, hi: 0xb3}, + // Block 0x5c, offset 0x205 + {value: 0x0000, lo: 0x01}, + {value: 0x8104, lo: 0x80, hi: 0x80}, + // Block 0x5d, offset 0x207 + {value: 0x0000, lo: 0x05}, + {value: 0x8132, lo: 0xb0, hi: 0xb0}, + {value: 0x8132, lo: 0xb2, hi: 0xb3}, + {value: 0x812d, lo: 0xb4, hi: 0xb4}, + {value: 0x8132, lo: 0xb7, hi: 0xb8}, + {value: 0x8132, lo: 0xbe, hi: 0xbf}, + // Block 0x5e, offset 0x20d + {value: 0x0000, lo: 0x02}, + {value: 0x8132, lo: 0x81, hi: 0x81}, + {value: 0x8104, lo: 0xb6, hi: 0xb6}, + // Block 0x5f, offset 0x210 + {value: 0x0008, lo: 0x03}, + {value: 0x1637, lo: 0x9c, hi: 0x9d}, + {value: 0x0125, lo: 0x9e, hi: 0x9e}, + {value: 0x1643, lo: 0x9f, hi: 0x9f}, + // Block 0x60, offset 0x214 + {value: 0x0000, lo: 0x01}, + {value: 0x8104, lo: 0xad, hi: 0xad}, + // Block 0x61, offset 0x216 + {value: 0x0000, lo: 0x06}, + {value: 0xe500, lo: 0x80, hi: 0x80}, + {value: 0xc600, lo: 0x81, hi: 0x9b}, + {value: 0xe500, lo: 0x9c, hi: 0x9c}, + {value: 0xc600, lo: 0x9d, hi: 0xb7}, + {value: 0xe500, lo: 0xb8, hi: 0xb8}, + {value: 0xc600, lo: 0xb9, hi: 0xbf}, + // Block 0x62, offset 0x21d + {value: 0x0000, lo: 0x05}, + {value: 0xc600, lo: 0x80, hi: 0x93}, + {value: 0xe500, lo: 0x94, hi: 0x94}, + {value: 0xc600, lo: 0x95, hi: 0xaf}, + {value: 0xe500, lo: 0xb0, hi: 0xb0}, + {value: 0xc600, lo: 0xb1, hi: 0xbf}, + // Block 0x63, offset 0x223 + {value: 0x0000, lo: 0x05}, + {value: 0xc600, lo: 0x80, hi: 0x8b}, + {value: 0xe500, lo: 0x8c, hi: 0x8c}, + {value: 0xc600, lo: 0x8d, hi: 0xa7}, + {value: 0xe500, lo: 0xa8, hi: 0xa8}, + {value: 0xc600, lo: 0xa9, hi: 0xbf}, + // Block 0x64, offset 0x229 + {value: 0x0000, lo: 0x07}, + {value: 0xc600, lo: 0x80, hi: 0x83}, + {value: 0xe500, lo: 0x84, hi: 0x84}, + {value: 0xc600, lo: 0x85, hi: 0x9f}, + {value: 0xe500, lo: 0xa0, hi: 0xa0}, + {value: 0xc600, lo: 0xa1, hi: 0xbb}, + {value: 0xe500, lo: 0xbc, hi: 0xbc}, + {value: 0xc600, lo: 0xbd, hi: 0xbf}, + // Block 0x65, offset 0x231 + {value: 0x0000, lo: 0x05}, + {value: 0xc600, lo: 0x80, hi: 0x97}, + {value: 0xe500, lo: 0x98, hi: 0x98}, + {value: 0xc600, lo: 0x99, hi: 0xb3}, + {value: 0xe500, lo: 0xb4, hi: 0xb4}, + {value: 0xc600, lo: 0xb5, hi: 0xbf}, + // Block 0x66, offset 0x237 + {value: 0x0000, lo: 0x05}, + {value: 0xc600, lo: 0x80, hi: 0x8f}, + {value: 0xe500, lo: 0x90, hi: 0x90}, + {value: 0xc600, lo: 0x91, hi: 0xab}, + {value: 0xe500, lo: 0xac, hi: 0xac}, + {value: 0xc600, lo: 0xad, hi: 0xbf}, + // Block 0x67, offset 0x23d + {value: 0x0000, lo: 0x05}, + {value: 0xc600, lo: 0x80, hi: 0x87}, + {value: 0xe500, lo: 0x88, hi: 0x88}, + {value: 0xc600, lo: 0x89, hi: 0xa3}, + {value: 0xe500, lo: 0xa4, hi: 0xa4}, + {value: 0xc600, lo: 0xa5, hi: 0xbf}, + // Block 0x68, offset 0x243 + {value: 0x0000, lo: 0x03}, + {value: 0xc600, lo: 0x80, hi: 0x87}, + {value: 0xe500, lo: 0x88, hi: 0x88}, + {value: 0xc600, lo: 0x89, hi: 0xa3}, + // Block 0x69, offset 0x247 + {value: 0x0002, lo: 0x01}, + {value: 0x0003, lo: 0x81, hi: 0xbf}, + // Block 0x6a, offset 0x249 + {value: 0x0000, lo: 0x01}, + {value: 0x812d, lo: 0xbd, hi: 0xbd}, + // Block 0x6b, offset 0x24b + {value: 0x0000, lo: 0x01}, + {value: 0x812d, lo: 0xa0, hi: 0xa0}, + // Block 0x6c, offset 0x24d + {value: 0x0000, lo: 0x01}, + {value: 0x8132, lo: 0xb6, hi: 0xba}, + // Block 0x6d, offset 0x24f + {value: 0x002c, lo: 0x05}, + {value: 0x812d, lo: 0x8d, hi: 0x8d}, + {value: 0x8132, lo: 0x8f, hi: 0x8f}, + {value: 0x8132, lo: 0xb8, hi: 0xb8}, + {value: 0x8101, lo: 0xb9, hi: 0xba}, + {value: 0x8104, lo: 0xbf, hi: 0xbf}, + // Block 0x6e, offset 0x255 + {value: 0x0000, lo: 0x02}, + {value: 0x8132, lo: 0xa5, hi: 0xa5}, + {value: 0x812d, lo: 0xa6, hi: 0xa6}, + // Block 0x6f, offset 0x258 + {value: 0x0000, lo: 0x01}, + {value: 0x8132, lo: 0xa4, hi: 0xa7}, + // Block 0x70, offset 0x25a + {value: 0x0000, lo: 0x05}, + {value: 0x812d, lo: 0x86, hi: 0x87}, + {value: 0x8132, lo: 0x88, hi: 0x8a}, + {value: 0x812d, lo: 0x8b, hi: 0x8b}, + {value: 0x8132, lo: 0x8c, hi: 0x8c}, + {value: 0x812d, lo: 0x8d, hi: 0x90}, + // Block 0x71, offset 0x260 + {value: 0x0000, lo: 0x02}, + {value: 0x8104, lo: 0x86, hi: 0x86}, + {value: 0x8104, lo: 0xbf, hi: 0xbf}, + // Block 0x72, offset 0x263 + {value: 0x17fe, lo: 0x07}, + {value: 0xa000, lo: 0x99, hi: 0x99}, + {value: 0x4238, lo: 0x9a, hi: 0x9a}, + {value: 0xa000, lo: 0x9b, hi: 0x9b}, + {value: 0x4242, lo: 0x9c, hi: 0x9c}, + {value: 0xa000, lo: 0xa5, hi: 0xa5}, + {value: 0x424c, lo: 0xab, hi: 0xab}, + {value: 0x8104, lo: 0xb9, hi: 0xba}, + // Block 0x73, offset 0x26b + {value: 0x0000, lo: 0x06}, + {value: 0x8132, lo: 0x80, hi: 0x82}, + {value: 0x9900, lo: 0xa7, hi: 0xa7}, + {value: 0x2d7e, lo: 0xae, hi: 0xae}, + {value: 0x2d88, lo: 0xaf, hi: 0xaf}, + {value: 0xa000, lo: 0xb1, hi: 0xb2}, + {value: 0x8104, lo: 0xb3, hi: 0xb4}, + // Block 0x74, offset 0x272 + {value: 0x0000, lo: 0x02}, + {value: 0x8104, lo: 0x80, hi: 0x80}, + {value: 0x8102, lo: 0x8a, hi: 0x8a}, + // Block 0x75, offset 0x275 + {value: 0x0000, lo: 0x02}, + {value: 0x8104, lo: 0xb5, hi: 0xb5}, + {value: 0x8102, lo: 0xb6, hi: 0xb6}, + // Block 0x76, offset 0x278 + {value: 0x0002, lo: 0x01}, + {value: 0x8102, lo: 0xa9, hi: 0xaa}, + // Block 0x77, offset 0x27a + {value: 0x0000, lo: 0x02}, + {value: 0x8102, lo: 0xbb, hi: 0xbc}, + {value: 0x9900, lo: 0xbe, hi: 0xbe}, + // Block 0x78, offset 0x27d + {value: 0x0000, lo: 0x07}, + {value: 0xa000, lo: 0x87, hi: 0x87}, + {value: 0x2d92, lo: 0x8b, hi: 0x8b}, + {value: 0x2d9c, lo: 0x8c, hi: 0x8c}, + {value: 0x8104, lo: 0x8d, hi: 0x8d}, + {value: 0x9900, lo: 0x97, hi: 0x97}, + {value: 0x8132, lo: 0xa6, hi: 0xac}, + {value: 0x8132, lo: 0xb0, hi: 0xb4}, + // Block 0x79, offset 0x285 + {value: 0x0000, lo: 0x03}, + {value: 0x8104, lo: 0x82, hi: 0x82}, + {value: 0x8102, lo: 0x86, hi: 0x86}, + {value: 0x8132, lo: 0x9e, hi: 0x9e}, + // Block 0x7a, offset 0x289 + {value: 0x6b5a, lo: 0x06}, + {value: 0x9900, lo: 0xb0, hi: 0xb0}, + {value: 0xa000, lo: 0xb9, hi: 0xb9}, + {value: 0x9900, lo: 0xba, hi: 0xba}, + {value: 0x2db0, lo: 0xbb, hi: 0xbb}, + {value: 0x2da6, lo: 0xbc, hi: 0xbd}, + {value: 0x2dba, lo: 0xbe, hi: 0xbe}, + // Block 0x7b, offset 0x290 + {value: 0x0000, lo: 0x02}, + {value: 0x8104, lo: 0x82, hi: 0x82}, + {value: 0x8102, lo: 0x83, hi: 0x83}, + // Block 0x7c, offset 0x293 + {value: 0x0000, lo: 0x05}, + {value: 0x9900, lo: 0xaf, hi: 0xaf}, + {value: 0xa000, lo: 0xb8, hi: 0xb9}, + {value: 0x2dc4, lo: 0xba, hi: 0xba}, + {value: 0x2dce, lo: 0xbb, hi: 0xbb}, + {value: 0x8104, lo: 0xbf, hi: 0xbf}, + // Block 0x7d, offset 0x299 + {value: 0x0000, lo: 0x01}, + {value: 0x8102, lo: 0x80, hi: 0x80}, + // Block 0x7e, offset 0x29b + {value: 0x0000, lo: 0x01}, + {value: 0x8104, lo: 0xbf, hi: 0xbf}, + // Block 0x7f, offset 0x29d + {value: 0x0000, lo: 0x02}, + {value: 0x8104, lo: 0xb6, hi: 0xb6}, + {value: 0x8102, lo: 0xb7, hi: 0xb7}, + // Block 0x80, offset 0x2a0 + {value: 0x0000, lo: 0x01}, + {value: 0x8104, lo: 0xab, hi: 0xab}, + // Block 0x81, offset 0x2a2 + {value: 0x0000, lo: 0x02}, + {value: 0x8104, lo: 0xb9, hi: 0xb9}, + {value: 0x8102, lo: 0xba, hi: 0xba}, + // Block 0x82, offset 0x2a5 + {value: 0x0000, lo: 0x01}, + {value: 0x8104, lo: 0xb4, hi: 0xb4}, + // Block 0x83, offset 0x2a7 + {value: 0x0000, lo: 0x01}, + {value: 0x8104, lo: 0x87, hi: 0x87}, + // Block 0x84, offset 0x2a9 + {value: 0x0000, lo: 0x01}, + {value: 0x8104, lo: 0x99, hi: 0x99}, + // Block 0x85, offset 0x2ab + {value: 0x0000, lo: 0x02}, + {value: 0x8102, lo: 0x82, hi: 0x82}, + {value: 0x8104, lo: 0x84, hi: 0x85}, + // Block 0x86, offset 0x2ae + {value: 0x0000, lo: 0x01}, + {value: 0x8104, lo: 0x97, hi: 0x97}, + // Block 0x87, offset 0x2b0 + {value: 0x0000, lo: 0x01}, + {value: 0x8101, lo: 0xb0, hi: 0xb4}, + // Block 0x88, offset 0x2b2 + {value: 0x0000, lo: 0x01}, + {value: 0x8132, lo: 0xb0, hi: 0xb6}, + // Block 0x89, offset 0x2b4 + {value: 0x0000, lo: 0x01}, + {value: 0x8101, lo: 0x9e, hi: 0x9e}, + // Block 0x8a, offset 0x2b6 + {value: 0x0000, lo: 0x0c}, + {value: 0x45cc, lo: 0x9e, hi: 0x9e}, + {value: 0x45d6, lo: 0x9f, hi: 0x9f}, + {value: 0x460a, lo: 0xa0, hi: 0xa0}, + {value: 0x4618, lo: 0xa1, hi: 0xa1}, + {value: 0x4626, lo: 0xa2, hi: 0xa2}, + {value: 0x4634, lo: 0xa3, hi: 0xa3}, + {value: 0x4642, lo: 0xa4, hi: 0xa4}, + {value: 0x812b, lo: 0xa5, hi: 0xa6}, + {value: 0x8101, lo: 0xa7, hi: 0xa9}, + {value: 0x8130, lo: 0xad, hi: 0xad}, + {value: 0x812b, lo: 0xae, hi: 0xb2}, + {value: 0x812d, lo: 0xbb, hi: 0xbf}, + // Block 0x8b, offset 0x2c3 + {value: 0x0000, lo: 0x09}, + {value: 0x812d, lo: 0x80, hi: 0x82}, + {value: 0x8132, lo: 0x85, hi: 0x89}, + {value: 0x812d, lo: 0x8a, hi: 0x8b}, + {value: 0x8132, lo: 0xaa, hi: 0xad}, + {value: 0x45e0, lo: 0xbb, hi: 0xbb}, + {value: 0x45ea, lo: 0xbc, hi: 0xbc}, + {value: 0x4650, lo: 0xbd, hi: 0xbd}, + {value: 0x466c, lo: 0xbe, hi: 0xbe}, + {value: 0x465e, lo: 0xbf, hi: 0xbf}, + // Block 0x8c, offset 0x2cd + {value: 0x0000, lo: 0x01}, + {value: 0x467a, lo: 0x80, hi: 0x80}, + // Block 0x8d, offset 0x2cf + {value: 0x0000, lo: 0x01}, + {value: 0x8132, lo: 0x82, hi: 0x84}, + // Block 0x8e, offset 0x2d1 + {value: 0x0002, lo: 0x03}, + {value: 0x0043, lo: 0x80, hi: 0x99}, + {value: 0x0083, lo: 0x9a, hi: 0xb3}, + {value: 0x0043, lo: 0xb4, hi: 0xbf}, + // Block 0x8f, offset 0x2d5 + {value: 0x0002, lo: 0x04}, + {value: 0x005b, lo: 0x80, hi: 0x8d}, + {value: 0x0083, lo: 0x8e, hi: 0x94}, + {value: 0x0093, lo: 0x96, hi: 0xa7}, + {value: 0x0043, lo: 0xa8, hi: 0xbf}, + // Block 0x90, offset 0x2da + {value: 0x0002, lo: 0x0b}, + {value: 0x0073, lo: 0x80, hi: 0x81}, + {value: 0x0083, lo: 0x82, hi: 0x9b}, + {value: 0x0043, lo: 0x9c, hi: 0x9c}, + {value: 0x0047, lo: 0x9e, hi: 0x9f}, + {value: 0x004f, lo: 0xa2, hi: 0xa2}, + {value: 0x0055, lo: 0xa5, hi: 0xa6}, + {value: 0x005d, lo: 0xa9, hi: 0xac}, + {value: 0x0067, lo: 0xae, hi: 0xb5}, + {value: 0x0083, lo: 0xb6, hi: 0xb9}, + {value: 0x008d, lo: 0xbb, hi: 0xbb}, + {value: 0x0091, lo: 0xbd, hi: 0xbf}, + // Block 0x91, offset 0x2e6 + {value: 0x0002, lo: 0x04}, + {value: 0x0097, lo: 0x80, hi: 0x83}, + {value: 0x00a1, lo: 0x85, hi: 0x8f}, + {value: 0x0043, lo: 0x90, hi: 0xa9}, + {value: 0x0083, lo: 0xaa, hi: 0xbf}, + // Block 0x92, offset 0x2eb + {value: 0x0002, lo: 0x08}, + {value: 0x00af, lo: 0x80, hi: 0x83}, + {value: 0x0043, lo: 0x84, hi: 0x85}, + {value: 0x0049, lo: 0x87, hi: 0x8a}, + {value: 0x0055, lo: 0x8d, hi: 0x94}, + {value: 0x0067, lo: 0x96, hi: 0x9c}, + {value: 0x0083, lo: 0x9e, hi: 0xb7}, + {value: 0x0043, lo: 0xb8, hi: 0xb9}, + {value: 0x0049, lo: 0xbb, hi: 0xbe}, + // Block 0x93, offset 0x2f4 + {value: 0x0002, lo: 0x05}, + {value: 0x0053, lo: 0x80, hi: 0x84}, + {value: 0x005f, lo: 0x86, hi: 0x86}, + {value: 0x0067, lo: 0x8a, hi: 0x90}, + {value: 0x0083, lo: 0x92, hi: 0xab}, + {value: 0x0043, lo: 0xac, hi: 0xbf}, + // Block 0x94, offset 0x2fa + {value: 0x0002, lo: 0x04}, + {value: 0x006b, lo: 0x80, hi: 0x85}, + {value: 0x0083, lo: 0x86, hi: 0x9f}, + {value: 0x0043, lo: 0xa0, hi: 0xb9}, + {value: 0x0083, lo: 0xba, hi: 0xbf}, + // Block 0x95, offset 0x2ff + {value: 0x0002, lo: 0x03}, + {value: 0x008f, lo: 0x80, hi: 0x93}, + {value: 0x0043, lo: 0x94, hi: 0xad}, + {value: 0x0083, lo: 0xae, hi: 0xbf}, + // Block 0x96, offset 0x303 + {value: 0x0002, lo: 0x04}, + {value: 0x00a7, lo: 0x80, hi: 0x87}, + {value: 0x0043, lo: 0x88, hi: 0xa1}, + {value: 0x0083, lo: 0xa2, hi: 0xbb}, + {value: 0x0043, lo: 0xbc, hi: 0xbf}, + // Block 0x97, offset 0x308 + {value: 0x0002, lo: 0x03}, + {value: 0x004b, lo: 0x80, hi: 0x95}, + {value: 0x0083, lo: 0x96, hi: 0xaf}, + {value: 0x0043, lo: 0xb0, hi: 0xbf}, + // Block 0x98, offset 0x30c + {value: 0x0003, lo: 0x0f}, + {value: 0x01b8, lo: 0x80, hi: 0x80}, + {value: 0x045f, lo: 0x81, hi: 0x81}, + {value: 0x01bb, lo: 0x82, hi: 0x9a}, + {value: 0x045b, lo: 0x9b, hi: 0x9b}, + {value: 0x01c7, lo: 0x9c, hi: 0x9c}, + {value: 0x01d0, lo: 0x9d, hi: 0x9d}, + {value: 0x01d6, lo: 0x9e, hi: 0x9e}, + {value: 0x01fa, lo: 0x9f, hi: 0x9f}, + {value: 0x01eb, lo: 0xa0, hi: 0xa0}, + {value: 0x01e8, lo: 0xa1, hi: 0xa1}, + {value: 0x0173, lo: 0xa2, hi: 0xb2}, + {value: 0x0188, lo: 0xb3, hi: 0xb3}, + {value: 0x01a6, lo: 0xb4, hi: 0xba}, + {value: 0x045f, lo: 0xbb, hi: 0xbb}, + {value: 0x01bb, lo: 0xbc, hi: 0xbf}, + // Block 0x99, offset 0x31c + {value: 0x0003, lo: 0x0d}, + {value: 0x01c7, lo: 0x80, hi: 0x94}, + {value: 0x045b, lo: 0x95, hi: 0x95}, + {value: 0x01c7, lo: 0x96, hi: 0x96}, + {value: 0x01d0, lo: 0x97, hi: 0x97}, + {value: 0x01d6, lo: 0x98, hi: 0x98}, + {value: 0x01fa, lo: 0x99, hi: 0x99}, + {value: 0x01eb, lo: 0x9a, hi: 0x9a}, + {value: 0x01e8, lo: 0x9b, hi: 0x9b}, + {value: 0x0173, lo: 0x9c, hi: 0xac}, + {value: 0x0188, lo: 0xad, hi: 0xad}, + {value: 0x01a6, lo: 0xae, hi: 0xb4}, + {value: 0x045f, lo: 0xb5, hi: 0xb5}, + {value: 0x01bb, lo: 0xb6, hi: 0xbf}, + // Block 0x9a, offset 0x32a + {value: 0x0003, lo: 0x0d}, + {value: 0x01d9, lo: 0x80, hi: 0x8e}, + {value: 0x045b, lo: 0x8f, hi: 0x8f}, + {value: 0x01c7, lo: 0x90, hi: 0x90}, + {value: 0x01d0, lo: 0x91, hi: 0x91}, + {value: 0x01d6, lo: 0x92, hi: 0x92}, + {value: 0x01fa, lo: 0x93, hi: 0x93}, + {value: 0x01eb, lo: 0x94, hi: 0x94}, + {value: 0x01e8, lo: 0x95, hi: 0x95}, + {value: 0x0173, lo: 0x96, hi: 0xa6}, + {value: 0x0188, lo: 0xa7, hi: 0xa7}, + {value: 0x01a6, lo: 0xa8, hi: 0xae}, + {value: 0x045f, lo: 0xaf, hi: 0xaf}, + {value: 0x01bb, lo: 0xb0, hi: 0xbf}, + // Block 0x9b, offset 0x338 + {value: 0x0003, lo: 0x0d}, + {value: 0x01eb, lo: 0x80, hi: 0x88}, + {value: 0x045b, lo: 0x89, hi: 0x89}, + {value: 0x01c7, lo: 0x8a, hi: 0x8a}, + {value: 0x01d0, lo: 0x8b, hi: 0x8b}, + {value: 0x01d6, lo: 0x8c, hi: 0x8c}, + {value: 0x01fa, lo: 0x8d, hi: 0x8d}, + {value: 0x01eb, lo: 0x8e, hi: 0x8e}, + {value: 0x01e8, lo: 0x8f, hi: 0x8f}, + {value: 0x0173, lo: 0x90, hi: 0xa0}, + {value: 0x0188, lo: 0xa1, hi: 0xa1}, + {value: 0x01a6, lo: 0xa2, hi: 0xa8}, + {value: 0x045f, lo: 0xa9, hi: 0xa9}, + {value: 0x01bb, lo: 0xaa, hi: 0xbf}, + // Block 0x9c, offset 0x346 + {value: 0x0000, lo: 0x05}, + {value: 0x8132, lo: 0x80, hi: 0x86}, + {value: 0x8132, lo: 0x88, hi: 0x98}, + {value: 0x8132, lo: 0x9b, hi: 0xa1}, + {value: 0x8132, lo: 0xa3, hi: 0xa4}, + {value: 0x8132, lo: 0xa6, hi: 0xaa}, + // Block 0x9d, offset 0x34c + {value: 0x0000, lo: 0x01}, + {value: 0x812d, lo: 0x90, hi: 0x96}, + // Block 0x9e, offset 0x34e + {value: 0x0000, lo: 0x02}, + {value: 0x8132, lo: 0x84, hi: 0x89}, + {value: 0x8102, lo: 0x8a, hi: 0x8a}, + // Block 0x9f, offset 0x351 + {value: 0x0002, lo: 0x09}, + {value: 0x0063, lo: 0x80, hi: 0x89}, + {value: 0x1951, lo: 0x8a, hi: 0x8a}, + {value: 0x1981, lo: 0x8b, hi: 0x8b}, + {value: 0x199c, lo: 0x8c, hi: 0x8c}, + {value: 0x19a2, lo: 0x8d, hi: 0x8d}, + {value: 0x1bc0, lo: 0x8e, hi: 0x8e}, + {value: 0x19ae, lo: 0x8f, hi: 0x8f}, + {value: 0x197b, lo: 0xaa, hi: 0xaa}, + {value: 0x197e, lo: 0xab, hi: 0xab}, + // Block 0xa0, offset 0x35b + {value: 0x0000, lo: 0x01}, + {value: 0x193f, lo: 0x90, hi: 0x90}, + // Block 0xa1, offset 0x35d + {value: 0x0028, lo: 0x09}, + {value: 0x2862, lo: 0x80, hi: 0x80}, + {value: 0x2826, lo: 0x81, hi: 0x81}, + {value: 0x2830, lo: 0x82, hi: 0x82}, + {value: 0x2844, lo: 0x83, hi: 0x84}, + {value: 0x284e, lo: 0x85, hi: 0x86}, + {value: 0x283a, lo: 0x87, hi: 0x87}, + {value: 0x2858, lo: 0x88, hi: 0x88}, + {value: 0x0b6f, lo: 0x90, hi: 0x90}, + {value: 0x08e7, lo: 0x91, hi: 0x91}, +} + +// recompMap: 7520 bytes (entries only) +var recompMap map[uint32]rune +var recompMapOnce sync.Once + +const recompMapPacked = "" + + "\x00A\x03\x00\x00\x00\x00\xc0" + // 0x00410300: 0x000000C0 + "\x00A\x03\x01\x00\x00\x00\xc1" + // 0x00410301: 0x000000C1 + "\x00A\x03\x02\x00\x00\x00\xc2" + // 0x00410302: 0x000000C2 + "\x00A\x03\x03\x00\x00\x00\xc3" + // 0x00410303: 0x000000C3 + "\x00A\x03\b\x00\x00\x00\xc4" + // 0x00410308: 0x000000C4 + "\x00A\x03\n\x00\x00\x00\xc5" + // 0x0041030A: 0x000000C5 + "\x00C\x03'\x00\x00\x00\xc7" + // 0x00430327: 0x000000C7 + "\x00E\x03\x00\x00\x00\x00\xc8" + // 0x00450300: 0x000000C8 + "\x00E\x03\x01\x00\x00\x00\xc9" + // 0x00450301: 0x000000C9 + "\x00E\x03\x02\x00\x00\x00\xca" + // 0x00450302: 0x000000CA + "\x00E\x03\b\x00\x00\x00\xcb" + // 0x00450308: 0x000000CB + "\x00I\x03\x00\x00\x00\x00\xcc" + // 0x00490300: 0x000000CC + "\x00I\x03\x01\x00\x00\x00\xcd" + // 0x00490301: 0x000000CD + "\x00I\x03\x02\x00\x00\x00\xce" + // 0x00490302: 0x000000CE + "\x00I\x03\b\x00\x00\x00\xcf" + // 0x00490308: 0x000000CF + "\x00N\x03\x03\x00\x00\x00\xd1" + // 0x004E0303: 0x000000D1 + "\x00O\x03\x00\x00\x00\x00\xd2" + // 0x004F0300: 0x000000D2 + "\x00O\x03\x01\x00\x00\x00\xd3" + // 0x004F0301: 0x000000D3 + "\x00O\x03\x02\x00\x00\x00\xd4" + // 0x004F0302: 0x000000D4 + "\x00O\x03\x03\x00\x00\x00\xd5" + // 0x004F0303: 0x000000D5 + "\x00O\x03\b\x00\x00\x00\xd6" + // 0x004F0308: 0x000000D6 + "\x00U\x03\x00\x00\x00\x00\xd9" + // 0x00550300: 0x000000D9 + "\x00U\x03\x01\x00\x00\x00\xda" + // 0x00550301: 0x000000DA + "\x00U\x03\x02\x00\x00\x00\xdb" + // 0x00550302: 0x000000DB + "\x00U\x03\b\x00\x00\x00\xdc" + // 0x00550308: 0x000000DC + "\x00Y\x03\x01\x00\x00\x00\xdd" + // 0x00590301: 0x000000DD + "\x00a\x03\x00\x00\x00\x00\xe0" + // 0x00610300: 0x000000E0 + "\x00a\x03\x01\x00\x00\x00\xe1" + // 0x00610301: 0x000000E1 + "\x00a\x03\x02\x00\x00\x00\xe2" + // 0x00610302: 0x000000E2 + "\x00a\x03\x03\x00\x00\x00\xe3" + // 0x00610303: 0x000000E3 + "\x00a\x03\b\x00\x00\x00\xe4" + // 0x00610308: 0x000000E4 + "\x00a\x03\n\x00\x00\x00\xe5" + // 0x0061030A: 0x000000E5 + "\x00c\x03'\x00\x00\x00\xe7" + // 0x00630327: 0x000000E7 + "\x00e\x03\x00\x00\x00\x00\xe8" + // 0x00650300: 0x000000E8 + "\x00e\x03\x01\x00\x00\x00\xe9" + // 0x00650301: 0x000000E9 + "\x00e\x03\x02\x00\x00\x00\xea" + // 0x00650302: 0x000000EA + "\x00e\x03\b\x00\x00\x00\xeb" + // 0x00650308: 0x000000EB + "\x00i\x03\x00\x00\x00\x00\xec" + // 0x00690300: 0x000000EC + "\x00i\x03\x01\x00\x00\x00\xed" + // 0x00690301: 0x000000ED + "\x00i\x03\x02\x00\x00\x00\xee" + // 0x00690302: 0x000000EE + "\x00i\x03\b\x00\x00\x00\xef" + // 0x00690308: 0x000000EF + "\x00n\x03\x03\x00\x00\x00\xf1" + // 0x006E0303: 0x000000F1 + "\x00o\x03\x00\x00\x00\x00\xf2" + // 0x006F0300: 0x000000F2 + "\x00o\x03\x01\x00\x00\x00\xf3" + // 0x006F0301: 0x000000F3 + "\x00o\x03\x02\x00\x00\x00\xf4" + // 0x006F0302: 0x000000F4 + "\x00o\x03\x03\x00\x00\x00\xf5" + // 0x006F0303: 0x000000F5 + "\x00o\x03\b\x00\x00\x00\xf6" + // 0x006F0308: 0x000000F6 + "\x00u\x03\x00\x00\x00\x00\xf9" + // 0x00750300: 0x000000F9 + "\x00u\x03\x01\x00\x00\x00\xfa" + // 0x00750301: 0x000000FA + "\x00u\x03\x02\x00\x00\x00\xfb" + // 0x00750302: 0x000000FB + "\x00u\x03\b\x00\x00\x00\xfc" + // 0x00750308: 0x000000FC + "\x00y\x03\x01\x00\x00\x00\xfd" + // 0x00790301: 0x000000FD + "\x00y\x03\b\x00\x00\x00\xff" + // 0x00790308: 0x000000FF + "\x00A\x03\x04\x00\x00\x01\x00" + // 0x00410304: 0x00000100 + "\x00a\x03\x04\x00\x00\x01\x01" + // 0x00610304: 0x00000101 + "\x00A\x03\x06\x00\x00\x01\x02" + // 0x00410306: 0x00000102 + "\x00a\x03\x06\x00\x00\x01\x03" + // 0x00610306: 0x00000103 + "\x00A\x03(\x00\x00\x01\x04" + // 0x00410328: 0x00000104 + "\x00a\x03(\x00\x00\x01\x05" + // 0x00610328: 0x00000105 + "\x00C\x03\x01\x00\x00\x01\x06" + // 0x00430301: 0x00000106 + "\x00c\x03\x01\x00\x00\x01\a" + // 0x00630301: 0x00000107 + "\x00C\x03\x02\x00\x00\x01\b" + // 0x00430302: 0x00000108 + "\x00c\x03\x02\x00\x00\x01\t" + // 0x00630302: 0x00000109 + "\x00C\x03\a\x00\x00\x01\n" + // 0x00430307: 0x0000010A + "\x00c\x03\a\x00\x00\x01\v" + // 0x00630307: 0x0000010B + "\x00C\x03\f\x00\x00\x01\f" + // 0x0043030C: 0x0000010C + "\x00c\x03\f\x00\x00\x01\r" + // 0x0063030C: 0x0000010D + "\x00D\x03\f\x00\x00\x01\x0e" + // 0x0044030C: 0x0000010E + "\x00d\x03\f\x00\x00\x01\x0f" + // 0x0064030C: 0x0000010F + "\x00E\x03\x04\x00\x00\x01\x12" + // 0x00450304: 0x00000112 + "\x00e\x03\x04\x00\x00\x01\x13" + // 0x00650304: 0x00000113 + "\x00E\x03\x06\x00\x00\x01\x14" + // 0x00450306: 0x00000114 + "\x00e\x03\x06\x00\x00\x01\x15" + // 0x00650306: 0x00000115 + "\x00E\x03\a\x00\x00\x01\x16" + // 0x00450307: 0x00000116 + "\x00e\x03\a\x00\x00\x01\x17" + // 0x00650307: 0x00000117 + "\x00E\x03(\x00\x00\x01\x18" + // 0x00450328: 0x00000118 + "\x00e\x03(\x00\x00\x01\x19" + // 0x00650328: 0x00000119 + "\x00E\x03\f\x00\x00\x01\x1a" + // 0x0045030C: 0x0000011A + "\x00e\x03\f\x00\x00\x01\x1b" + // 0x0065030C: 0x0000011B + "\x00G\x03\x02\x00\x00\x01\x1c" + // 0x00470302: 0x0000011C + "\x00g\x03\x02\x00\x00\x01\x1d" + // 0x00670302: 0x0000011D + "\x00G\x03\x06\x00\x00\x01\x1e" + // 0x00470306: 0x0000011E + "\x00g\x03\x06\x00\x00\x01\x1f" + // 0x00670306: 0x0000011F + "\x00G\x03\a\x00\x00\x01 " + // 0x00470307: 0x00000120 + "\x00g\x03\a\x00\x00\x01!" + // 0x00670307: 0x00000121 + "\x00G\x03'\x00\x00\x01\"" + // 0x00470327: 0x00000122 + "\x00g\x03'\x00\x00\x01#" + // 0x00670327: 0x00000123 + "\x00H\x03\x02\x00\x00\x01$" + // 0x00480302: 0x00000124 + "\x00h\x03\x02\x00\x00\x01%" + // 0x00680302: 0x00000125 + "\x00I\x03\x03\x00\x00\x01(" + // 0x00490303: 0x00000128 + "\x00i\x03\x03\x00\x00\x01)" + // 0x00690303: 0x00000129 + "\x00I\x03\x04\x00\x00\x01*" + // 0x00490304: 0x0000012A + "\x00i\x03\x04\x00\x00\x01+" + // 0x00690304: 0x0000012B + "\x00I\x03\x06\x00\x00\x01," + // 0x00490306: 0x0000012C + "\x00i\x03\x06\x00\x00\x01-" + // 0x00690306: 0x0000012D + "\x00I\x03(\x00\x00\x01." + // 0x00490328: 0x0000012E + "\x00i\x03(\x00\x00\x01/" + // 0x00690328: 0x0000012F + "\x00I\x03\a\x00\x00\x010" + // 0x00490307: 0x00000130 + "\x00J\x03\x02\x00\x00\x014" + // 0x004A0302: 0x00000134 + "\x00j\x03\x02\x00\x00\x015" + // 0x006A0302: 0x00000135 + "\x00K\x03'\x00\x00\x016" + // 0x004B0327: 0x00000136 + "\x00k\x03'\x00\x00\x017" + // 0x006B0327: 0x00000137 + "\x00L\x03\x01\x00\x00\x019" + // 0x004C0301: 0x00000139 + "\x00l\x03\x01\x00\x00\x01:" + // 0x006C0301: 0x0000013A + "\x00L\x03'\x00\x00\x01;" + // 0x004C0327: 0x0000013B + "\x00l\x03'\x00\x00\x01<" + // 0x006C0327: 0x0000013C + "\x00L\x03\f\x00\x00\x01=" + // 0x004C030C: 0x0000013D + "\x00l\x03\f\x00\x00\x01>" + // 0x006C030C: 0x0000013E + "\x00N\x03\x01\x00\x00\x01C" + // 0x004E0301: 0x00000143 + "\x00n\x03\x01\x00\x00\x01D" + // 0x006E0301: 0x00000144 + "\x00N\x03'\x00\x00\x01E" + // 0x004E0327: 0x00000145 + "\x00n\x03'\x00\x00\x01F" + // 0x006E0327: 0x00000146 + "\x00N\x03\f\x00\x00\x01G" + // 0x004E030C: 0x00000147 + "\x00n\x03\f\x00\x00\x01H" + // 0x006E030C: 0x00000148 + "\x00O\x03\x04\x00\x00\x01L" + // 0x004F0304: 0x0000014C + "\x00o\x03\x04\x00\x00\x01M" + // 0x006F0304: 0x0000014D + "\x00O\x03\x06\x00\x00\x01N" + // 0x004F0306: 0x0000014E + "\x00o\x03\x06\x00\x00\x01O" + // 0x006F0306: 0x0000014F + "\x00O\x03\v\x00\x00\x01P" + // 0x004F030B: 0x00000150 + "\x00o\x03\v\x00\x00\x01Q" + // 0x006F030B: 0x00000151 + "\x00R\x03\x01\x00\x00\x01T" + // 0x00520301: 0x00000154 + "\x00r\x03\x01\x00\x00\x01U" + // 0x00720301: 0x00000155 + "\x00R\x03'\x00\x00\x01V" + // 0x00520327: 0x00000156 + "\x00r\x03'\x00\x00\x01W" + // 0x00720327: 0x00000157 + "\x00R\x03\f\x00\x00\x01X" + // 0x0052030C: 0x00000158 + "\x00r\x03\f\x00\x00\x01Y" + // 0x0072030C: 0x00000159 + "\x00S\x03\x01\x00\x00\x01Z" + // 0x00530301: 0x0000015A + "\x00s\x03\x01\x00\x00\x01[" + // 0x00730301: 0x0000015B + "\x00S\x03\x02\x00\x00\x01\\" + // 0x00530302: 0x0000015C + "\x00s\x03\x02\x00\x00\x01]" + // 0x00730302: 0x0000015D + "\x00S\x03'\x00\x00\x01^" + // 0x00530327: 0x0000015E + "\x00s\x03'\x00\x00\x01_" + // 0x00730327: 0x0000015F + "\x00S\x03\f\x00\x00\x01`" + // 0x0053030C: 0x00000160 + "\x00s\x03\f\x00\x00\x01a" + // 0x0073030C: 0x00000161 + "\x00T\x03'\x00\x00\x01b" + // 0x00540327: 0x00000162 + "\x00t\x03'\x00\x00\x01c" + // 0x00740327: 0x00000163 + "\x00T\x03\f\x00\x00\x01d" + // 0x0054030C: 0x00000164 + "\x00t\x03\f\x00\x00\x01e" + // 0x0074030C: 0x00000165 + "\x00U\x03\x03\x00\x00\x01h" + // 0x00550303: 0x00000168 + "\x00u\x03\x03\x00\x00\x01i" + // 0x00750303: 0x00000169 + "\x00U\x03\x04\x00\x00\x01j" + // 0x00550304: 0x0000016A + "\x00u\x03\x04\x00\x00\x01k" + // 0x00750304: 0x0000016B + "\x00U\x03\x06\x00\x00\x01l" + // 0x00550306: 0x0000016C + "\x00u\x03\x06\x00\x00\x01m" + // 0x00750306: 0x0000016D + "\x00U\x03\n\x00\x00\x01n" + // 0x0055030A: 0x0000016E + "\x00u\x03\n\x00\x00\x01o" + // 0x0075030A: 0x0000016F + "\x00U\x03\v\x00\x00\x01p" + // 0x0055030B: 0x00000170 + "\x00u\x03\v\x00\x00\x01q" + // 0x0075030B: 0x00000171 + "\x00U\x03(\x00\x00\x01r" + // 0x00550328: 0x00000172 + "\x00u\x03(\x00\x00\x01s" + // 0x00750328: 0x00000173 + "\x00W\x03\x02\x00\x00\x01t" + // 0x00570302: 0x00000174 + "\x00w\x03\x02\x00\x00\x01u" + // 0x00770302: 0x00000175 + "\x00Y\x03\x02\x00\x00\x01v" + // 0x00590302: 0x00000176 + "\x00y\x03\x02\x00\x00\x01w" + // 0x00790302: 0x00000177 + "\x00Y\x03\b\x00\x00\x01x" + // 0x00590308: 0x00000178 + "\x00Z\x03\x01\x00\x00\x01y" + // 0x005A0301: 0x00000179 + "\x00z\x03\x01\x00\x00\x01z" + // 0x007A0301: 0x0000017A + "\x00Z\x03\a\x00\x00\x01{" + // 0x005A0307: 0x0000017B + "\x00z\x03\a\x00\x00\x01|" + // 0x007A0307: 0x0000017C + "\x00Z\x03\f\x00\x00\x01}" + // 0x005A030C: 0x0000017D + "\x00z\x03\f\x00\x00\x01~" + // 0x007A030C: 0x0000017E + "\x00O\x03\x1b\x00\x00\x01\xa0" + // 0x004F031B: 0x000001A0 + "\x00o\x03\x1b\x00\x00\x01\xa1" + // 0x006F031B: 0x000001A1 + "\x00U\x03\x1b\x00\x00\x01\xaf" + // 0x0055031B: 0x000001AF + "\x00u\x03\x1b\x00\x00\x01\xb0" + // 0x0075031B: 0x000001B0 + "\x00A\x03\f\x00\x00\x01\xcd" + // 0x0041030C: 0x000001CD + "\x00a\x03\f\x00\x00\x01\xce" + // 0x0061030C: 0x000001CE + "\x00I\x03\f\x00\x00\x01\xcf" + // 0x0049030C: 0x000001CF + "\x00i\x03\f\x00\x00\x01\xd0" + // 0x0069030C: 0x000001D0 + "\x00O\x03\f\x00\x00\x01\xd1" + // 0x004F030C: 0x000001D1 + "\x00o\x03\f\x00\x00\x01\xd2" + // 0x006F030C: 0x000001D2 + "\x00U\x03\f\x00\x00\x01\xd3" + // 0x0055030C: 0x000001D3 + "\x00u\x03\f\x00\x00\x01\xd4" + // 0x0075030C: 0x000001D4 + "\x00\xdc\x03\x04\x00\x00\x01\xd5" + // 0x00DC0304: 0x000001D5 + "\x00\xfc\x03\x04\x00\x00\x01\xd6" + // 0x00FC0304: 0x000001D6 + "\x00\xdc\x03\x01\x00\x00\x01\xd7" + // 0x00DC0301: 0x000001D7 + "\x00\xfc\x03\x01\x00\x00\x01\xd8" + // 0x00FC0301: 0x000001D8 + "\x00\xdc\x03\f\x00\x00\x01\xd9" + // 0x00DC030C: 0x000001D9 + "\x00\xfc\x03\f\x00\x00\x01\xda" + // 0x00FC030C: 0x000001DA + "\x00\xdc\x03\x00\x00\x00\x01\xdb" + // 0x00DC0300: 0x000001DB + "\x00\xfc\x03\x00\x00\x00\x01\xdc" + // 0x00FC0300: 0x000001DC + "\x00\xc4\x03\x04\x00\x00\x01\xde" + // 0x00C40304: 0x000001DE + "\x00\xe4\x03\x04\x00\x00\x01\xdf" + // 0x00E40304: 0x000001DF + "\x02&\x03\x04\x00\x00\x01\xe0" + // 0x02260304: 0x000001E0 + "\x02'\x03\x04\x00\x00\x01\xe1" + // 0x02270304: 0x000001E1 + "\x00\xc6\x03\x04\x00\x00\x01\xe2" + // 0x00C60304: 0x000001E2 + "\x00\xe6\x03\x04\x00\x00\x01\xe3" + // 0x00E60304: 0x000001E3 + "\x00G\x03\f\x00\x00\x01\xe6" + // 0x0047030C: 0x000001E6 + "\x00g\x03\f\x00\x00\x01\xe7" + // 0x0067030C: 0x000001E7 + "\x00K\x03\f\x00\x00\x01\xe8" + // 0x004B030C: 0x000001E8 + "\x00k\x03\f\x00\x00\x01\xe9" + // 0x006B030C: 0x000001E9 + "\x00O\x03(\x00\x00\x01\xea" + // 0x004F0328: 0x000001EA + "\x00o\x03(\x00\x00\x01\xeb" + // 0x006F0328: 0x000001EB + "\x01\xea\x03\x04\x00\x00\x01\xec" + // 0x01EA0304: 0x000001EC + "\x01\xeb\x03\x04\x00\x00\x01\xed" + // 0x01EB0304: 0x000001ED + "\x01\xb7\x03\f\x00\x00\x01\xee" + // 0x01B7030C: 0x000001EE + "\x02\x92\x03\f\x00\x00\x01\xef" + // 0x0292030C: 0x000001EF + "\x00j\x03\f\x00\x00\x01\xf0" + // 0x006A030C: 0x000001F0 + "\x00G\x03\x01\x00\x00\x01\xf4" + // 0x00470301: 0x000001F4 + "\x00g\x03\x01\x00\x00\x01\xf5" + // 0x00670301: 0x000001F5 + "\x00N\x03\x00\x00\x00\x01\xf8" + // 0x004E0300: 0x000001F8 + "\x00n\x03\x00\x00\x00\x01\xf9" + // 0x006E0300: 0x000001F9 + "\x00\xc5\x03\x01\x00\x00\x01\xfa" + // 0x00C50301: 0x000001FA + "\x00\xe5\x03\x01\x00\x00\x01\xfb" + // 0x00E50301: 0x000001FB + "\x00\xc6\x03\x01\x00\x00\x01\xfc" + // 0x00C60301: 0x000001FC + "\x00\xe6\x03\x01\x00\x00\x01\xfd" + // 0x00E60301: 0x000001FD + "\x00\xd8\x03\x01\x00\x00\x01\xfe" + // 0x00D80301: 0x000001FE + "\x00\xf8\x03\x01\x00\x00\x01\xff" + // 0x00F80301: 0x000001FF + "\x00A\x03\x0f\x00\x00\x02\x00" + // 0x0041030F: 0x00000200 + "\x00a\x03\x0f\x00\x00\x02\x01" + // 0x0061030F: 0x00000201 + "\x00A\x03\x11\x00\x00\x02\x02" + // 0x00410311: 0x00000202 + "\x00a\x03\x11\x00\x00\x02\x03" + // 0x00610311: 0x00000203 + "\x00E\x03\x0f\x00\x00\x02\x04" + // 0x0045030F: 0x00000204 + "\x00e\x03\x0f\x00\x00\x02\x05" + // 0x0065030F: 0x00000205 + "\x00E\x03\x11\x00\x00\x02\x06" + // 0x00450311: 0x00000206 + "\x00e\x03\x11\x00\x00\x02\a" + // 0x00650311: 0x00000207 + "\x00I\x03\x0f\x00\x00\x02\b" + // 0x0049030F: 0x00000208 + "\x00i\x03\x0f\x00\x00\x02\t" + // 0x0069030F: 0x00000209 + "\x00I\x03\x11\x00\x00\x02\n" + // 0x00490311: 0x0000020A + "\x00i\x03\x11\x00\x00\x02\v" + // 0x00690311: 0x0000020B + "\x00O\x03\x0f\x00\x00\x02\f" + // 0x004F030F: 0x0000020C + "\x00o\x03\x0f\x00\x00\x02\r" + // 0x006F030F: 0x0000020D + "\x00O\x03\x11\x00\x00\x02\x0e" + // 0x004F0311: 0x0000020E + "\x00o\x03\x11\x00\x00\x02\x0f" + // 0x006F0311: 0x0000020F + "\x00R\x03\x0f\x00\x00\x02\x10" + // 0x0052030F: 0x00000210 + "\x00r\x03\x0f\x00\x00\x02\x11" + // 0x0072030F: 0x00000211 + "\x00R\x03\x11\x00\x00\x02\x12" + // 0x00520311: 0x00000212 + "\x00r\x03\x11\x00\x00\x02\x13" + // 0x00720311: 0x00000213 + "\x00U\x03\x0f\x00\x00\x02\x14" + // 0x0055030F: 0x00000214 + "\x00u\x03\x0f\x00\x00\x02\x15" + // 0x0075030F: 0x00000215 + "\x00U\x03\x11\x00\x00\x02\x16" + // 0x00550311: 0x00000216 + "\x00u\x03\x11\x00\x00\x02\x17" + // 0x00750311: 0x00000217 + "\x00S\x03&\x00\x00\x02\x18" + // 0x00530326: 0x00000218 + "\x00s\x03&\x00\x00\x02\x19" + // 0x00730326: 0x00000219 + "\x00T\x03&\x00\x00\x02\x1a" + // 0x00540326: 0x0000021A + "\x00t\x03&\x00\x00\x02\x1b" + // 0x00740326: 0x0000021B + "\x00H\x03\f\x00\x00\x02\x1e" + // 0x0048030C: 0x0000021E + "\x00h\x03\f\x00\x00\x02\x1f" + // 0x0068030C: 0x0000021F + "\x00A\x03\a\x00\x00\x02&" + // 0x00410307: 0x00000226 + "\x00a\x03\a\x00\x00\x02'" + // 0x00610307: 0x00000227 + "\x00E\x03'\x00\x00\x02(" + // 0x00450327: 0x00000228 + "\x00e\x03'\x00\x00\x02)" + // 0x00650327: 0x00000229 + "\x00\xd6\x03\x04\x00\x00\x02*" + // 0x00D60304: 0x0000022A + "\x00\xf6\x03\x04\x00\x00\x02+" + // 0x00F60304: 0x0000022B + "\x00\xd5\x03\x04\x00\x00\x02," + // 0x00D50304: 0x0000022C + "\x00\xf5\x03\x04\x00\x00\x02-" + // 0x00F50304: 0x0000022D + "\x00O\x03\a\x00\x00\x02." + // 0x004F0307: 0x0000022E + "\x00o\x03\a\x00\x00\x02/" + // 0x006F0307: 0x0000022F + "\x02.\x03\x04\x00\x00\x020" + // 0x022E0304: 0x00000230 + "\x02/\x03\x04\x00\x00\x021" + // 0x022F0304: 0x00000231 + "\x00Y\x03\x04\x00\x00\x022" + // 0x00590304: 0x00000232 + "\x00y\x03\x04\x00\x00\x023" + // 0x00790304: 0x00000233 + "\x00\xa8\x03\x01\x00\x00\x03\x85" + // 0x00A80301: 0x00000385 + "\x03\x91\x03\x01\x00\x00\x03\x86" + // 0x03910301: 0x00000386 + "\x03\x95\x03\x01\x00\x00\x03\x88" + // 0x03950301: 0x00000388 + "\x03\x97\x03\x01\x00\x00\x03\x89" + // 0x03970301: 0x00000389 + "\x03\x99\x03\x01\x00\x00\x03\x8a" + // 0x03990301: 0x0000038A + "\x03\x9f\x03\x01\x00\x00\x03\x8c" + // 0x039F0301: 0x0000038C + "\x03\xa5\x03\x01\x00\x00\x03\x8e" + // 0x03A50301: 0x0000038E + "\x03\xa9\x03\x01\x00\x00\x03\x8f" + // 0x03A90301: 0x0000038F + "\x03\xca\x03\x01\x00\x00\x03\x90" + // 0x03CA0301: 0x00000390 + "\x03\x99\x03\b\x00\x00\x03\xaa" + // 0x03990308: 0x000003AA + "\x03\xa5\x03\b\x00\x00\x03\xab" + // 0x03A50308: 0x000003AB + "\x03\xb1\x03\x01\x00\x00\x03\xac" + // 0x03B10301: 0x000003AC + "\x03\xb5\x03\x01\x00\x00\x03\xad" + // 0x03B50301: 0x000003AD + "\x03\xb7\x03\x01\x00\x00\x03\xae" + // 0x03B70301: 0x000003AE + "\x03\xb9\x03\x01\x00\x00\x03\xaf" + // 0x03B90301: 0x000003AF + "\x03\xcb\x03\x01\x00\x00\x03\xb0" + // 0x03CB0301: 0x000003B0 + "\x03\xb9\x03\b\x00\x00\x03\xca" + // 0x03B90308: 0x000003CA + "\x03\xc5\x03\b\x00\x00\x03\xcb" + // 0x03C50308: 0x000003CB + "\x03\xbf\x03\x01\x00\x00\x03\xcc" + // 0x03BF0301: 0x000003CC + "\x03\xc5\x03\x01\x00\x00\x03\xcd" + // 0x03C50301: 0x000003CD + "\x03\xc9\x03\x01\x00\x00\x03\xce" + // 0x03C90301: 0x000003CE + "\x03\xd2\x03\x01\x00\x00\x03\xd3" + // 0x03D20301: 0x000003D3 + "\x03\xd2\x03\b\x00\x00\x03\xd4" + // 0x03D20308: 0x000003D4 + "\x04\x15\x03\x00\x00\x00\x04\x00" + // 0x04150300: 0x00000400 + "\x04\x15\x03\b\x00\x00\x04\x01" + // 0x04150308: 0x00000401 + "\x04\x13\x03\x01\x00\x00\x04\x03" + // 0x04130301: 0x00000403 + "\x04\x06\x03\b\x00\x00\x04\a" + // 0x04060308: 0x00000407 + "\x04\x1a\x03\x01\x00\x00\x04\f" + // 0x041A0301: 0x0000040C + "\x04\x18\x03\x00\x00\x00\x04\r" + // 0x04180300: 0x0000040D + "\x04#\x03\x06\x00\x00\x04\x0e" + // 0x04230306: 0x0000040E + "\x04\x18\x03\x06\x00\x00\x04\x19" + // 0x04180306: 0x00000419 + "\x048\x03\x06\x00\x00\x049" + // 0x04380306: 0x00000439 + "\x045\x03\x00\x00\x00\x04P" + // 0x04350300: 0x00000450 + "\x045\x03\b\x00\x00\x04Q" + // 0x04350308: 0x00000451 + "\x043\x03\x01\x00\x00\x04S" + // 0x04330301: 0x00000453 + "\x04V\x03\b\x00\x00\x04W" + // 0x04560308: 0x00000457 + "\x04:\x03\x01\x00\x00\x04\\" + // 0x043A0301: 0x0000045C + "\x048\x03\x00\x00\x00\x04]" + // 0x04380300: 0x0000045D + "\x04C\x03\x06\x00\x00\x04^" + // 0x04430306: 0x0000045E + "\x04t\x03\x0f\x00\x00\x04v" + // 0x0474030F: 0x00000476 + "\x04u\x03\x0f\x00\x00\x04w" + // 0x0475030F: 0x00000477 + "\x04\x16\x03\x06\x00\x00\x04\xc1" + // 0x04160306: 0x000004C1 + "\x046\x03\x06\x00\x00\x04\xc2" + // 0x04360306: 0x000004C2 + "\x04\x10\x03\x06\x00\x00\x04\xd0" + // 0x04100306: 0x000004D0 + "\x040\x03\x06\x00\x00\x04\xd1" + // 0x04300306: 0x000004D1 + "\x04\x10\x03\b\x00\x00\x04\xd2" + // 0x04100308: 0x000004D2 + "\x040\x03\b\x00\x00\x04\xd3" + // 0x04300308: 0x000004D3 + "\x04\x15\x03\x06\x00\x00\x04\xd6" + // 0x04150306: 0x000004D6 + "\x045\x03\x06\x00\x00\x04\xd7" + // 0x04350306: 0x000004D7 + "\x04\xd8\x03\b\x00\x00\x04\xda" + // 0x04D80308: 0x000004DA + "\x04\xd9\x03\b\x00\x00\x04\xdb" + // 0x04D90308: 0x000004DB + "\x04\x16\x03\b\x00\x00\x04\xdc" + // 0x04160308: 0x000004DC + "\x046\x03\b\x00\x00\x04\xdd" + // 0x04360308: 0x000004DD + "\x04\x17\x03\b\x00\x00\x04\xde" + // 0x04170308: 0x000004DE + "\x047\x03\b\x00\x00\x04\xdf" + // 0x04370308: 0x000004DF + "\x04\x18\x03\x04\x00\x00\x04\xe2" + // 0x04180304: 0x000004E2 + "\x048\x03\x04\x00\x00\x04\xe3" + // 0x04380304: 0x000004E3 + "\x04\x18\x03\b\x00\x00\x04\xe4" + // 0x04180308: 0x000004E4 + "\x048\x03\b\x00\x00\x04\xe5" + // 0x04380308: 0x000004E5 + "\x04\x1e\x03\b\x00\x00\x04\xe6" + // 0x041E0308: 0x000004E6 + "\x04>\x03\b\x00\x00\x04\xe7" + // 0x043E0308: 0x000004E7 + "\x04\xe8\x03\b\x00\x00\x04\xea" + // 0x04E80308: 0x000004EA + "\x04\xe9\x03\b\x00\x00\x04\xeb" + // 0x04E90308: 0x000004EB + "\x04-\x03\b\x00\x00\x04\xec" + // 0x042D0308: 0x000004EC + "\x04M\x03\b\x00\x00\x04\xed" + // 0x044D0308: 0x000004ED + "\x04#\x03\x04\x00\x00\x04\xee" + // 0x04230304: 0x000004EE + "\x04C\x03\x04\x00\x00\x04\xef" + // 0x04430304: 0x000004EF + "\x04#\x03\b\x00\x00\x04\xf0" + // 0x04230308: 0x000004F0 + "\x04C\x03\b\x00\x00\x04\xf1" + // 0x04430308: 0x000004F1 + "\x04#\x03\v\x00\x00\x04\xf2" + // 0x0423030B: 0x000004F2 + "\x04C\x03\v\x00\x00\x04\xf3" + // 0x0443030B: 0x000004F3 + "\x04'\x03\b\x00\x00\x04\xf4" + // 0x04270308: 0x000004F4 + "\x04G\x03\b\x00\x00\x04\xf5" + // 0x04470308: 0x000004F5 + "\x04+\x03\b\x00\x00\x04\xf8" + // 0x042B0308: 0x000004F8 + "\x04K\x03\b\x00\x00\x04\xf9" + // 0x044B0308: 0x000004F9 + "\x06'\x06S\x00\x00\x06\"" + // 0x06270653: 0x00000622 + "\x06'\x06T\x00\x00\x06#" + // 0x06270654: 0x00000623 + "\x06H\x06T\x00\x00\x06$" + // 0x06480654: 0x00000624 + "\x06'\x06U\x00\x00\x06%" + // 0x06270655: 0x00000625 + "\x06J\x06T\x00\x00\x06&" + // 0x064A0654: 0x00000626 + "\x06\xd5\x06T\x00\x00\x06\xc0" + // 0x06D50654: 0x000006C0 + "\x06\xc1\x06T\x00\x00\x06\xc2" + // 0x06C10654: 0x000006C2 + "\x06\xd2\x06T\x00\x00\x06\xd3" + // 0x06D20654: 0x000006D3 + "\t(\t<\x00\x00\t)" + // 0x0928093C: 0x00000929 + "\t0\t<\x00\x00\t1" + // 0x0930093C: 0x00000931 + "\t3\t<\x00\x00\t4" + // 0x0933093C: 0x00000934 + "\t\xc7\t\xbe\x00\x00\t\xcb" + // 0x09C709BE: 0x000009CB + "\t\xc7\t\xd7\x00\x00\t\xcc" + // 0x09C709D7: 0x000009CC + "\vG\vV\x00\x00\vH" + // 0x0B470B56: 0x00000B48 + "\vG\v>\x00\x00\vK" + // 0x0B470B3E: 0x00000B4B + "\vG\vW\x00\x00\vL" + // 0x0B470B57: 0x00000B4C + "\v\x92\v\xd7\x00\x00\v\x94" + // 0x0B920BD7: 0x00000B94 + "\v\xc6\v\xbe\x00\x00\v\xca" + // 0x0BC60BBE: 0x00000BCA + "\v\xc7\v\xbe\x00\x00\v\xcb" + // 0x0BC70BBE: 0x00000BCB + "\v\xc6\v\xd7\x00\x00\v\xcc" + // 0x0BC60BD7: 0x00000BCC + "\fF\fV\x00\x00\fH" + // 0x0C460C56: 0x00000C48 + "\f\xbf\f\xd5\x00\x00\f\xc0" + // 0x0CBF0CD5: 0x00000CC0 + "\f\xc6\f\xd5\x00\x00\f\xc7" + // 0x0CC60CD5: 0x00000CC7 + "\f\xc6\f\xd6\x00\x00\f\xc8" + // 0x0CC60CD6: 0x00000CC8 + "\f\xc6\f\xc2\x00\x00\f\xca" + // 0x0CC60CC2: 0x00000CCA + "\f\xca\f\xd5\x00\x00\f\xcb" + // 0x0CCA0CD5: 0x00000CCB + "\rF\r>\x00\x00\rJ" + // 0x0D460D3E: 0x00000D4A + "\rG\r>\x00\x00\rK" + // 0x0D470D3E: 0x00000D4B + "\rF\rW\x00\x00\rL" + // 0x0D460D57: 0x00000D4C + "\r\xd9\r\xca\x00\x00\r\xda" + // 0x0DD90DCA: 0x00000DDA + "\r\xd9\r\xcf\x00\x00\r\xdc" + // 0x0DD90DCF: 0x00000DDC + "\r\xdc\r\xca\x00\x00\r\xdd" + // 0x0DDC0DCA: 0x00000DDD + "\r\xd9\r\xdf\x00\x00\r\xde" + // 0x0DD90DDF: 0x00000DDE + "\x10%\x10.\x00\x00\x10&" + // 0x1025102E: 0x00001026 + "\x1b\x05\x1b5\x00\x00\x1b\x06" + // 0x1B051B35: 0x00001B06 + "\x1b\a\x1b5\x00\x00\x1b\b" + // 0x1B071B35: 0x00001B08 + "\x1b\t\x1b5\x00\x00\x1b\n" + // 0x1B091B35: 0x00001B0A + "\x1b\v\x1b5\x00\x00\x1b\f" + // 0x1B0B1B35: 0x00001B0C + "\x1b\r\x1b5\x00\x00\x1b\x0e" + // 0x1B0D1B35: 0x00001B0E + "\x1b\x11\x1b5\x00\x00\x1b\x12" + // 0x1B111B35: 0x00001B12 + "\x1b:\x1b5\x00\x00\x1b;" + // 0x1B3A1B35: 0x00001B3B + "\x1b<\x1b5\x00\x00\x1b=" + // 0x1B3C1B35: 0x00001B3D + "\x1b>\x1b5\x00\x00\x1b@" + // 0x1B3E1B35: 0x00001B40 + "\x1b?\x1b5\x00\x00\x1bA" + // 0x1B3F1B35: 0x00001B41 + "\x1bB\x1b5\x00\x00\x1bC" + // 0x1B421B35: 0x00001B43 + "\x00A\x03%\x00\x00\x1e\x00" + // 0x00410325: 0x00001E00 + "\x00a\x03%\x00\x00\x1e\x01" + // 0x00610325: 0x00001E01 + "\x00B\x03\a\x00\x00\x1e\x02" + // 0x00420307: 0x00001E02 + "\x00b\x03\a\x00\x00\x1e\x03" + // 0x00620307: 0x00001E03 + "\x00B\x03#\x00\x00\x1e\x04" + // 0x00420323: 0x00001E04 + "\x00b\x03#\x00\x00\x1e\x05" + // 0x00620323: 0x00001E05 + "\x00B\x031\x00\x00\x1e\x06" + // 0x00420331: 0x00001E06 + "\x00b\x031\x00\x00\x1e\a" + // 0x00620331: 0x00001E07 + "\x00\xc7\x03\x01\x00\x00\x1e\b" + // 0x00C70301: 0x00001E08 + "\x00\xe7\x03\x01\x00\x00\x1e\t" + // 0x00E70301: 0x00001E09 + "\x00D\x03\a\x00\x00\x1e\n" + // 0x00440307: 0x00001E0A + "\x00d\x03\a\x00\x00\x1e\v" + // 0x00640307: 0x00001E0B + "\x00D\x03#\x00\x00\x1e\f" + // 0x00440323: 0x00001E0C + "\x00d\x03#\x00\x00\x1e\r" + // 0x00640323: 0x00001E0D + "\x00D\x031\x00\x00\x1e\x0e" + // 0x00440331: 0x00001E0E + "\x00d\x031\x00\x00\x1e\x0f" + // 0x00640331: 0x00001E0F + "\x00D\x03'\x00\x00\x1e\x10" + // 0x00440327: 0x00001E10 + "\x00d\x03'\x00\x00\x1e\x11" + // 0x00640327: 0x00001E11 + "\x00D\x03-\x00\x00\x1e\x12" + // 0x0044032D: 0x00001E12 + "\x00d\x03-\x00\x00\x1e\x13" + // 0x0064032D: 0x00001E13 + "\x01\x12\x03\x00\x00\x00\x1e\x14" + // 0x01120300: 0x00001E14 + "\x01\x13\x03\x00\x00\x00\x1e\x15" + // 0x01130300: 0x00001E15 + "\x01\x12\x03\x01\x00\x00\x1e\x16" + // 0x01120301: 0x00001E16 + "\x01\x13\x03\x01\x00\x00\x1e\x17" + // 0x01130301: 0x00001E17 + "\x00E\x03-\x00\x00\x1e\x18" + // 0x0045032D: 0x00001E18 + "\x00e\x03-\x00\x00\x1e\x19" + // 0x0065032D: 0x00001E19 + "\x00E\x030\x00\x00\x1e\x1a" + // 0x00450330: 0x00001E1A + "\x00e\x030\x00\x00\x1e\x1b" + // 0x00650330: 0x00001E1B + "\x02(\x03\x06\x00\x00\x1e\x1c" + // 0x02280306: 0x00001E1C + "\x02)\x03\x06\x00\x00\x1e\x1d" + // 0x02290306: 0x00001E1D + "\x00F\x03\a\x00\x00\x1e\x1e" + // 0x00460307: 0x00001E1E + "\x00f\x03\a\x00\x00\x1e\x1f" + // 0x00660307: 0x00001E1F + "\x00G\x03\x04\x00\x00\x1e " + // 0x00470304: 0x00001E20 + "\x00g\x03\x04\x00\x00\x1e!" + // 0x00670304: 0x00001E21 + "\x00H\x03\a\x00\x00\x1e\"" + // 0x00480307: 0x00001E22 + "\x00h\x03\a\x00\x00\x1e#" + // 0x00680307: 0x00001E23 + "\x00H\x03#\x00\x00\x1e$" + // 0x00480323: 0x00001E24 + "\x00h\x03#\x00\x00\x1e%" + // 0x00680323: 0x00001E25 + "\x00H\x03\b\x00\x00\x1e&" + // 0x00480308: 0x00001E26 + "\x00h\x03\b\x00\x00\x1e'" + // 0x00680308: 0x00001E27 + "\x00H\x03'\x00\x00\x1e(" + // 0x00480327: 0x00001E28 + "\x00h\x03'\x00\x00\x1e)" + // 0x00680327: 0x00001E29 + "\x00H\x03.\x00\x00\x1e*" + // 0x0048032E: 0x00001E2A + "\x00h\x03.\x00\x00\x1e+" + // 0x0068032E: 0x00001E2B + "\x00I\x030\x00\x00\x1e," + // 0x00490330: 0x00001E2C + "\x00i\x030\x00\x00\x1e-" + // 0x00690330: 0x00001E2D + "\x00\xcf\x03\x01\x00\x00\x1e." + // 0x00CF0301: 0x00001E2E + "\x00\xef\x03\x01\x00\x00\x1e/" + // 0x00EF0301: 0x00001E2F + "\x00K\x03\x01\x00\x00\x1e0" + // 0x004B0301: 0x00001E30 + "\x00k\x03\x01\x00\x00\x1e1" + // 0x006B0301: 0x00001E31 + "\x00K\x03#\x00\x00\x1e2" + // 0x004B0323: 0x00001E32 + "\x00k\x03#\x00\x00\x1e3" + // 0x006B0323: 0x00001E33 + "\x00K\x031\x00\x00\x1e4" + // 0x004B0331: 0x00001E34 + "\x00k\x031\x00\x00\x1e5" + // 0x006B0331: 0x00001E35 + "\x00L\x03#\x00\x00\x1e6" + // 0x004C0323: 0x00001E36 + "\x00l\x03#\x00\x00\x1e7" + // 0x006C0323: 0x00001E37 + "\x1e6\x03\x04\x00\x00\x1e8" + // 0x1E360304: 0x00001E38 + "\x1e7\x03\x04\x00\x00\x1e9" + // 0x1E370304: 0x00001E39 + "\x00L\x031\x00\x00\x1e:" + // 0x004C0331: 0x00001E3A + "\x00l\x031\x00\x00\x1e;" + // 0x006C0331: 0x00001E3B + "\x00L\x03-\x00\x00\x1e<" + // 0x004C032D: 0x00001E3C + "\x00l\x03-\x00\x00\x1e=" + // 0x006C032D: 0x00001E3D + "\x00M\x03\x01\x00\x00\x1e>" + // 0x004D0301: 0x00001E3E + "\x00m\x03\x01\x00\x00\x1e?" + // 0x006D0301: 0x00001E3F + "\x00M\x03\a\x00\x00\x1e@" + // 0x004D0307: 0x00001E40 + "\x00m\x03\a\x00\x00\x1eA" + // 0x006D0307: 0x00001E41 + "\x00M\x03#\x00\x00\x1eB" + // 0x004D0323: 0x00001E42 + "\x00m\x03#\x00\x00\x1eC" + // 0x006D0323: 0x00001E43 + "\x00N\x03\a\x00\x00\x1eD" + // 0x004E0307: 0x00001E44 + "\x00n\x03\a\x00\x00\x1eE" + // 0x006E0307: 0x00001E45 + "\x00N\x03#\x00\x00\x1eF" + // 0x004E0323: 0x00001E46 + "\x00n\x03#\x00\x00\x1eG" + // 0x006E0323: 0x00001E47 + "\x00N\x031\x00\x00\x1eH" + // 0x004E0331: 0x00001E48 + "\x00n\x031\x00\x00\x1eI" + // 0x006E0331: 0x00001E49 + "\x00N\x03-\x00\x00\x1eJ" + // 0x004E032D: 0x00001E4A + "\x00n\x03-\x00\x00\x1eK" + // 0x006E032D: 0x00001E4B + "\x00\xd5\x03\x01\x00\x00\x1eL" + // 0x00D50301: 0x00001E4C + "\x00\xf5\x03\x01\x00\x00\x1eM" + // 0x00F50301: 0x00001E4D + "\x00\xd5\x03\b\x00\x00\x1eN" + // 0x00D50308: 0x00001E4E + "\x00\xf5\x03\b\x00\x00\x1eO" + // 0x00F50308: 0x00001E4F + "\x01L\x03\x00\x00\x00\x1eP" + // 0x014C0300: 0x00001E50 + "\x01M\x03\x00\x00\x00\x1eQ" + // 0x014D0300: 0x00001E51 + "\x01L\x03\x01\x00\x00\x1eR" + // 0x014C0301: 0x00001E52 + "\x01M\x03\x01\x00\x00\x1eS" + // 0x014D0301: 0x00001E53 + "\x00P\x03\x01\x00\x00\x1eT" + // 0x00500301: 0x00001E54 + "\x00p\x03\x01\x00\x00\x1eU" + // 0x00700301: 0x00001E55 + "\x00P\x03\a\x00\x00\x1eV" + // 0x00500307: 0x00001E56 + "\x00p\x03\a\x00\x00\x1eW" + // 0x00700307: 0x00001E57 + "\x00R\x03\a\x00\x00\x1eX" + // 0x00520307: 0x00001E58 + "\x00r\x03\a\x00\x00\x1eY" + // 0x00720307: 0x00001E59 + "\x00R\x03#\x00\x00\x1eZ" + // 0x00520323: 0x00001E5A + "\x00r\x03#\x00\x00\x1e[" + // 0x00720323: 0x00001E5B + "\x1eZ\x03\x04\x00\x00\x1e\\" + // 0x1E5A0304: 0x00001E5C + "\x1e[\x03\x04\x00\x00\x1e]" + // 0x1E5B0304: 0x00001E5D + "\x00R\x031\x00\x00\x1e^" + // 0x00520331: 0x00001E5E + "\x00r\x031\x00\x00\x1e_" + // 0x00720331: 0x00001E5F + "\x00S\x03\a\x00\x00\x1e`" + // 0x00530307: 0x00001E60 + "\x00s\x03\a\x00\x00\x1ea" + // 0x00730307: 0x00001E61 + "\x00S\x03#\x00\x00\x1eb" + // 0x00530323: 0x00001E62 + "\x00s\x03#\x00\x00\x1ec" + // 0x00730323: 0x00001E63 + "\x01Z\x03\a\x00\x00\x1ed" + // 0x015A0307: 0x00001E64 + "\x01[\x03\a\x00\x00\x1ee" + // 0x015B0307: 0x00001E65 + "\x01`\x03\a\x00\x00\x1ef" + // 0x01600307: 0x00001E66 + "\x01a\x03\a\x00\x00\x1eg" + // 0x01610307: 0x00001E67 + "\x1eb\x03\a\x00\x00\x1eh" + // 0x1E620307: 0x00001E68 + "\x1ec\x03\a\x00\x00\x1ei" + // 0x1E630307: 0x00001E69 + "\x00T\x03\a\x00\x00\x1ej" + // 0x00540307: 0x00001E6A + "\x00t\x03\a\x00\x00\x1ek" + // 0x00740307: 0x00001E6B + "\x00T\x03#\x00\x00\x1el" + // 0x00540323: 0x00001E6C + "\x00t\x03#\x00\x00\x1em" + // 0x00740323: 0x00001E6D + "\x00T\x031\x00\x00\x1en" + // 0x00540331: 0x00001E6E + "\x00t\x031\x00\x00\x1eo" + // 0x00740331: 0x00001E6F + "\x00T\x03-\x00\x00\x1ep" + // 0x0054032D: 0x00001E70 + "\x00t\x03-\x00\x00\x1eq" + // 0x0074032D: 0x00001E71 + "\x00U\x03$\x00\x00\x1er" + // 0x00550324: 0x00001E72 + "\x00u\x03$\x00\x00\x1es" + // 0x00750324: 0x00001E73 + "\x00U\x030\x00\x00\x1et" + // 0x00550330: 0x00001E74 + "\x00u\x030\x00\x00\x1eu" + // 0x00750330: 0x00001E75 + "\x00U\x03-\x00\x00\x1ev" + // 0x0055032D: 0x00001E76 + "\x00u\x03-\x00\x00\x1ew" + // 0x0075032D: 0x00001E77 + "\x01h\x03\x01\x00\x00\x1ex" + // 0x01680301: 0x00001E78 + "\x01i\x03\x01\x00\x00\x1ey" + // 0x01690301: 0x00001E79 + "\x01j\x03\b\x00\x00\x1ez" + // 0x016A0308: 0x00001E7A + "\x01k\x03\b\x00\x00\x1e{" + // 0x016B0308: 0x00001E7B + "\x00V\x03\x03\x00\x00\x1e|" + // 0x00560303: 0x00001E7C + "\x00v\x03\x03\x00\x00\x1e}" + // 0x00760303: 0x00001E7D + "\x00V\x03#\x00\x00\x1e~" + // 0x00560323: 0x00001E7E + "\x00v\x03#\x00\x00\x1e\u007f" + // 0x00760323: 0x00001E7F + "\x00W\x03\x00\x00\x00\x1e\x80" + // 0x00570300: 0x00001E80 + "\x00w\x03\x00\x00\x00\x1e\x81" + // 0x00770300: 0x00001E81 + "\x00W\x03\x01\x00\x00\x1e\x82" + // 0x00570301: 0x00001E82 + "\x00w\x03\x01\x00\x00\x1e\x83" + // 0x00770301: 0x00001E83 + "\x00W\x03\b\x00\x00\x1e\x84" + // 0x00570308: 0x00001E84 + "\x00w\x03\b\x00\x00\x1e\x85" + // 0x00770308: 0x00001E85 + "\x00W\x03\a\x00\x00\x1e\x86" + // 0x00570307: 0x00001E86 + "\x00w\x03\a\x00\x00\x1e\x87" + // 0x00770307: 0x00001E87 + "\x00W\x03#\x00\x00\x1e\x88" + // 0x00570323: 0x00001E88 + "\x00w\x03#\x00\x00\x1e\x89" + // 0x00770323: 0x00001E89 + "\x00X\x03\a\x00\x00\x1e\x8a" + // 0x00580307: 0x00001E8A + "\x00x\x03\a\x00\x00\x1e\x8b" + // 0x00780307: 0x00001E8B + "\x00X\x03\b\x00\x00\x1e\x8c" + // 0x00580308: 0x00001E8C + "\x00x\x03\b\x00\x00\x1e\x8d" + // 0x00780308: 0x00001E8D + "\x00Y\x03\a\x00\x00\x1e\x8e" + // 0x00590307: 0x00001E8E + "\x00y\x03\a\x00\x00\x1e\x8f" + // 0x00790307: 0x00001E8F + "\x00Z\x03\x02\x00\x00\x1e\x90" + // 0x005A0302: 0x00001E90 + "\x00z\x03\x02\x00\x00\x1e\x91" + // 0x007A0302: 0x00001E91 + "\x00Z\x03#\x00\x00\x1e\x92" + // 0x005A0323: 0x00001E92 + "\x00z\x03#\x00\x00\x1e\x93" + // 0x007A0323: 0x00001E93 + "\x00Z\x031\x00\x00\x1e\x94" + // 0x005A0331: 0x00001E94 + "\x00z\x031\x00\x00\x1e\x95" + // 0x007A0331: 0x00001E95 + "\x00h\x031\x00\x00\x1e\x96" + // 0x00680331: 0x00001E96 + "\x00t\x03\b\x00\x00\x1e\x97" + // 0x00740308: 0x00001E97 + "\x00w\x03\n\x00\x00\x1e\x98" + // 0x0077030A: 0x00001E98 + "\x00y\x03\n\x00\x00\x1e\x99" + // 0x0079030A: 0x00001E99 + "\x01\u007f\x03\a\x00\x00\x1e\x9b" + // 0x017F0307: 0x00001E9B + "\x00A\x03#\x00\x00\x1e\xa0" + // 0x00410323: 0x00001EA0 + "\x00a\x03#\x00\x00\x1e\xa1" + // 0x00610323: 0x00001EA1 + "\x00A\x03\t\x00\x00\x1e\xa2" + // 0x00410309: 0x00001EA2 + "\x00a\x03\t\x00\x00\x1e\xa3" + // 0x00610309: 0x00001EA3 + "\x00\xc2\x03\x01\x00\x00\x1e\xa4" + // 0x00C20301: 0x00001EA4 + "\x00\xe2\x03\x01\x00\x00\x1e\xa5" + // 0x00E20301: 0x00001EA5 + "\x00\xc2\x03\x00\x00\x00\x1e\xa6" + // 0x00C20300: 0x00001EA6 + "\x00\xe2\x03\x00\x00\x00\x1e\xa7" + // 0x00E20300: 0x00001EA7 + "\x00\xc2\x03\t\x00\x00\x1e\xa8" + // 0x00C20309: 0x00001EA8 + "\x00\xe2\x03\t\x00\x00\x1e\xa9" + // 0x00E20309: 0x00001EA9 + "\x00\xc2\x03\x03\x00\x00\x1e\xaa" + // 0x00C20303: 0x00001EAA + "\x00\xe2\x03\x03\x00\x00\x1e\xab" + // 0x00E20303: 0x00001EAB + "\x1e\xa0\x03\x02\x00\x00\x1e\xac" + // 0x1EA00302: 0x00001EAC + "\x1e\xa1\x03\x02\x00\x00\x1e\xad" + // 0x1EA10302: 0x00001EAD + "\x01\x02\x03\x01\x00\x00\x1e\xae" + // 0x01020301: 0x00001EAE + "\x01\x03\x03\x01\x00\x00\x1e\xaf" + // 0x01030301: 0x00001EAF + "\x01\x02\x03\x00\x00\x00\x1e\xb0" + // 0x01020300: 0x00001EB0 + "\x01\x03\x03\x00\x00\x00\x1e\xb1" + // 0x01030300: 0x00001EB1 + "\x01\x02\x03\t\x00\x00\x1e\xb2" + // 0x01020309: 0x00001EB2 + "\x01\x03\x03\t\x00\x00\x1e\xb3" + // 0x01030309: 0x00001EB3 + "\x01\x02\x03\x03\x00\x00\x1e\xb4" + // 0x01020303: 0x00001EB4 + "\x01\x03\x03\x03\x00\x00\x1e\xb5" + // 0x01030303: 0x00001EB5 + "\x1e\xa0\x03\x06\x00\x00\x1e\xb6" + // 0x1EA00306: 0x00001EB6 + "\x1e\xa1\x03\x06\x00\x00\x1e\xb7" + // 0x1EA10306: 0x00001EB7 + "\x00E\x03#\x00\x00\x1e\xb8" + // 0x00450323: 0x00001EB8 + "\x00e\x03#\x00\x00\x1e\xb9" + // 0x00650323: 0x00001EB9 + "\x00E\x03\t\x00\x00\x1e\xba" + // 0x00450309: 0x00001EBA + "\x00e\x03\t\x00\x00\x1e\xbb" + // 0x00650309: 0x00001EBB + "\x00E\x03\x03\x00\x00\x1e\xbc" + // 0x00450303: 0x00001EBC + "\x00e\x03\x03\x00\x00\x1e\xbd" + // 0x00650303: 0x00001EBD + "\x00\xca\x03\x01\x00\x00\x1e\xbe" + // 0x00CA0301: 0x00001EBE + "\x00\xea\x03\x01\x00\x00\x1e\xbf" + // 0x00EA0301: 0x00001EBF + "\x00\xca\x03\x00\x00\x00\x1e\xc0" + // 0x00CA0300: 0x00001EC0 + "\x00\xea\x03\x00\x00\x00\x1e\xc1" + // 0x00EA0300: 0x00001EC1 + "\x00\xca\x03\t\x00\x00\x1e\xc2" + // 0x00CA0309: 0x00001EC2 + "\x00\xea\x03\t\x00\x00\x1e\xc3" + // 0x00EA0309: 0x00001EC3 + "\x00\xca\x03\x03\x00\x00\x1e\xc4" + // 0x00CA0303: 0x00001EC4 + "\x00\xea\x03\x03\x00\x00\x1e\xc5" + // 0x00EA0303: 0x00001EC5 + "\x1e\xb8\x03\x02\x00\x00\x1e\xc6" + // 0x1EB80302: 0x00001EC6 + "\x1e\xb9\x03\x02\x00\x00\x1e\xc7" + // 0x1EB90302: 0x00001EC7 + "\x00I\x03\t\x00\x00\x1e\xc8" + // 0x00490309: 0x00001EC8 + "\x00i\x03\t\x00\x00\x1e\xc9" + // 0x00690309: 0x00001EC9 + "\x00I\x03#\x00\x00\x1e\xca" + // 0x00490323: 0x00001ECA + "\x00i\x03#\x00\x00\x1e\xcb" + // 0x00690323: 0x00001ECB + "\x00O\x03#\x00\x00\x1e\xcc" + // 0x004F0323: 0x00001ECC + "\x00o\x03#\x00\x00\x1e\xcd" + // 0x006F0323: 0x00001ECD + "\x00O\x03\t\x00\x00\x1e\xce" + // 0x004F0309: 0x00001ECE + "\x00o\x03\t\x00\x00\x1e\xcf" + // 0x006F0309: 0x00001ECF + "\x00\xd4\x03\x01\x00\x00\x1e\xd0" + // 0x00D40301: 0x00001ED0 + "\x00\xf4\x03\x01\x00\x00\x1e\xd1" + // 0x00F40301: 0x00001ED1 + "\x00\xd4\x03\x00\x00\x00\x1e\xd2" + // 0x00D40300: 0x00001ED2 + "\x00\xf4\x03\x00\x00\x00\x1e\xd3" + // 0x00F40300: 0x00001ED3 + "\x00\xd4\x03\t\x00\x00\x1e\xd4" + // 0x00D40309: 0x00001ED4 + "\x00\xf4\x03\t\x00\x00\x1e\xd5" + // 0x00F40309: 0x00001ED5 + "\x00\xd4\x03\x03\x00\x00\x1e\xd6" + // 0x00D40303: 0x00001ED6 + "\x00\xf4\x03\x03\x00\x00\x1e\xd7" + // 0x00F40303: 0x00001ED7 + "\x1e\xcc\x03\x02\x00\x00\x1e\xd8" + // 0x1ECC0302: 0x00001ED8 + "\x1e\xcd\x03\x02\x00\x00\x1e\xd9" + // 0x1ECD0302: 0x00001ED9 + "\x01\xa0\x03\x01\x00\x00\x1e\xda" + // 0x01A00301: 0x00001EDA + "\x01\xa1\x03\x01\x00\x00\x1e\xdb" + // 0x01A10301: 0x00001EDB + "\x01\xa0\x03\x00\x00\x00\x1e\xdc" + // 0x01A00300: 0x00001EDC + "\x01\xa1\x03\x00\x00\x00\x1e\xdd" + // 0x01A10300: 0x00001EDD + "\x01\xa0\x03\t\x00\x00\x1e\xde" + // 0x01A00309: 0x00001EDE + "\x01\xa1\x03\t\x00\x00\x1e\xdf" + // 0x01A10309: 0x00001EDF + "\x01\xa0\x03\x03\x00\x00\x1e\xe0" + // 0x01A00303: 0x00001EE0 + "\x01\xa1\x03\x03\x00\x00\x1e\xe1" + // 0x01A10303: 0x00001EE1 + "\x01\xa0\x03#\x00\x00\x1e\xe2" + // 0x01A00323: 0x00001EE2 + "\x01\xa1\x03#\x00\x00\x1e\xe3" + // 0x01A10323: 0x00001EE3 + "\x00U\x03#\x00\x00\x1e\xe4" + // 0x00550323: 0x00001EE4 + "\x00u\x03#\x00\x00\x1e\xe5" + // 0x00750323: 0x00001EE5 + "\x00U\x03\t\x00\x00\x1e\xe6" + // 0x00550309: 0x00001EE6 + "\x00u\x03\t\x00\x00\x1e\xe7" + // 0x00750309: 0x00001EE7 + "\x01\xaf\x03\x01\x00\x00\x1e\xe8" + // 0x01AF0301: 0x00001EE8 + "\x01\xb0\x03\x01\x00\x00\x1e\xe9" + // 0x01B00301: 0x00001EE9 + "\x01\xaf\x03\x00\x00\x00\x1e\xea" + // 0x01AF0300: 0x00001EEA + "\x01\xb0\x03\x00\x00\x00\x1e\xeb" + // 0x01B00300: 0x00001EEB + "\x01\xaf\x03\t\x00\x00\x1e\xec" + // 0x01AF0309: 0x00001EEC + "\x01\xb0\x03\t\x00\x00\x1e\xed" + // 0x01B00309: 0x00001EED + "\x01\xaf\x03\x03\x00\x00\x1e\xee" + // 0x01AF0303: 0x00001EEE + "\x01\xb0\x03\x03\x00\x00\x1e\xef" + // 0x01B00303: 0x00001EEF + "\x01\xaf\x03#\x00\x00\x1e\xf0" + // 0x01AF0323: 0x00001EF0 + "\x01\xb0\x03#\x00\x00\x1e\xf1" + // 0x01B00323: 0x00001EF1 + "\x00Y\x03\x00\x00\x00\x1e\xf2" + // 0x00590300: 0x00001EF2 + "\x00y\x03\x00\x00\x00\x1e\xf3" + // 0x00790300: 0x00001EF3 + "\x00Y\x03#\x00\x00\x1e\xf4" + // 0x00590323: 0x00001EF4 + "\x00y\x03#\x00\x00\x1e\xf5" + // 0x00790323: 0x00001EF5 + "\x00Y\x03\t\x00\x00\x1e\xf6" + // 0x00590309: 0x00001EF6 + "\x00y\x03\t\x00\x00\x1e\xf7" + // 0x00790309: 0x00001EF7 + "\x00Y\x03\x03\x00\x00\x1e\xf8" + // 0x00590303: 0x00001EF8 + "\x00y\x03\x03\x00\x00\x1e\xf9" + // 0x00790303: 0x00001EF9 + "\x03\xb1\x03\x13\x00\x00\x1f\x00" + // 0x03B10313: 0x00001F00 + "\x03\xb1\x03\x14\x00\x00\x1f\x01" + // 0x03B10314: 0x00001F01 + "\x1f\x00\x03\x00\x00\x00\x1f\x02" + // 0x1F000300: 0x00001F02 + "\x1f\x01\x03\x00\x00\x00\x1f\x03" + // 0x1F010300: 0x00001F03 + "\x1f\x00\x03\x01\x00\x00\x1f\x04" + // 0x1F000301: 0x00001F04 + "\x1f\x01\x03\x01\x00\x00\x1f\x05" + // 0x1F010301: 0x00001F05 + "\x1f\x00\x03B\x00\x00\x1f\x06" + // 0x1F000342: 0x00001F06 + "\x1f\x01\x03B\x00\x00\x1f\a" + // 0x1F010342: 0x00001F07 + "\x03\x91\x03\x13\x00\x00\x1f\b" + // 0x03910313: 0x00001F08 + "\x03\x91\x03\x14\x00\x00\x1f\t" + // 0x03910314: 0x00001F09 + "\x1f\b\x03\x00\x00\x00\x1f\n" + // 0x1F080300: 0x00001F0A + "\x1f\t\x03\x00\x00\x00\x1f\v" + // 0x1F090300: 0x00001F0B + "\x1f\b\x03\x01\x00\x00\x1f\f" + // 0x1F080301: 0x00001F0C + "\x1f\t\x03\x01\x00\x00\x1f\r" + // 0x1F090301: 0x00001F0D + "\x1f\b\x03B\x00\x00\x1f\x0e" + // 0x1F080342: 0x00001F0E + "\x1f\t\x03B\x00\x00\x1f\x0f" + // 0x1F090342: 0x00001F0F + "\x03\xb5\x03\x13\x00\x00\x1f\x10" + // 0x03B50313: 0x00001F10 + "\x03\xb5\x03\x14\x00\x00\x1f\x11" + // 0x03B50314: 0x00001F11 + "\x1f\x10\x03\x00\x00\x00\x1f\x12" + // 0x1F100300: 0x00001F12 + "\x1f\x11\x03\x00\x00\x00\x1f\x13" + // 0x1F110300: 0x00001F13 + "\x1f\x10\x03\x01\x00\x00\x1f\x14" + // 0x1F100301: 0x00001F14 + "\x1f\x11\x03\x01\x00\x00\x1f\x15" + // 0x1F110301: 0x00001F15 + "\x03\x95\x03\x13\x00\x00\x1f\x18" + // 0x03950313: 0x00001F18 + "\x03\x95\x03\x14\x00\x00\x1f\x19" + // 0x03950314: 0x00001F19 + "\x1f\x18\x03\x00\x00\x00\x1f\x1a" + // 0x1F180300: 0x00001F1A + "\x1f\x19\x03\x00\x00\x00\x1f\x1b" + // 0x1F190300: 0x00001F1B + "\x1f\x18\x03\x01\x00\x00\x1f\x1c" + // 0x1F180301: 0x00001F1C + "\x1f\x19\x03\x01\x00\x00\x1f\x1d" + // 0x1F190301: 0x00001F1D + "\x03\xb7\x03\x13\x00\x00\x1f " + // 0x03B70313: 0x00001F20 + "\x03\xb7\x03\x14\x00\x00\x1f!" + // 0x03B70314: 0x00001F21 + "\x1f \x03\x00\x00\x00\x1f\"" + // 0x1F200300: 0x00001F22 + "\x1f!\x03\x00\x00\x00\x1f#" + // 0x1F210300: 0x00001F23 + "\x1f \x03\x01\x00\x00\x1f$" + // 0x1F200301: 0x00001F24 + "\x1f!\x03\x01\x00\x00\x1f%" + // 0x1F210301: 0x00001F25 + "\x1f \x03B\x00\x00\x1f&" + // 0x1F200342: 0x00001F26 + "\x1f!\x03B\x00\x00\x1f'" + // 0x1F210342: 0x00001F27 + "\x03\x97\x03\x13\x00\x00\x1f(" + // 0x03970313: 0x00001F28 + "\x03\x97\x03\x14\x00\x00\x1f)" + // 0x03970314: 0x00001F29 + "\x1f(\x03\x00\x00\x00\x1f*" + // 0x1F280300: 0x00001F2A + "\x1f)\x03\x00\x00\x00\x1f+" + // 0x1F290300: 0x00001F2B + "\x1f(\x03\x01\x00\x00\x1f," + // 0x1F280301: 0x00001F2C + "\x1f)\x03\x01\x00\x00\x1f-" + // 0x1F290301: 0x00001F2D + "\x1f(\x03B\x00\x00\x1f." + // 0x1F280342: 0x00001F2E + "\x1f)\x03B\x00\x00\x1f/" + // 0x1F290342: 0x00001F2F + "\x03\xb9\x03\x13\x00\x00\x1f0" + // 0x03B90313: 0x00001F30 + "\x03\xb9\x03\x14\x00\x00\x1f1" + // 0x03B90314: 0x00001F31 + "\x1f0\x03\x00\x00\x00\x1f2" + // 0x1F300300: 0x00001F32 + "\x1f1\x03\x00\x00\x00\x1f3" + // 0x1F310300: 0x00001F33 + "\x1f0\x03\x01\x00\x00\x1f4" + // 0x1F300301: 0x00001F34 + "\x1f1\x03\x01\x00\x00\x1f5" + // 0x1F310301: 0x00001F35 + "\x1f0\x03B\x00\x00\x1f6" + // 0x1F300342: 0x00001F36 + "\x1f1\x03B\x00\x00\x1f7" + // 0x1F310342: 0x00001F37 + "\x03\x99\x03\x13\x00\x00\x1f8" + // 0x03990313: 0x00001F38 + "\x03\x99\x03\x14\x00\x00\x1f9" + // 0x03990314: 0x00001F39 + "\x1f8\x03\x00\x00\x00\x1f:" + // 0x1F380300: 0x00001F3A + "\x1f9\x03\x00\x00\x00\x1f;" + // 0x1F390300: 0x00001F3B + "\x1f8\x03\x01\x00\x00\x1f<" + // 0x1F380301: 0x00001F3C + "\x1f9\x03\x01\x00\x00\x1f=" + // 0x1F390301: 0x00001F3D + "\x1f8\x03B\x00\x00\x1f>" + // 0x1F380342: 0x00001F3E + "\x1f9\x03B\x00\x00\x1f?" + // 0x1F390342: 0x00001F3F + "\x03\xbf\x03\x13\x00\x00\x1f@" + // 0x03BF0313: 0x00001F40 + "\x03\xbf\x03\x14\x00\x00\x1fA" + // 0x03BF0314: 0x00001F41 + "\x1f@\x03\x00\x00\x00\x1fB" + // 0x1F400300: 0x00001F42 + "\x1fA\x03\x00\x00\x00\x1fC" + // 0x1F410300: 0x00001F43 + "\x1f@\x03\x01\x00\x00\x1fD" + // 0x1F400301: 0x00001F44 + "\x1fA\x03\x01\x00\x00\x1fE" + // 0x1F410301: 0x00001F45 + "\x03\x9f\x03\x13\x00\x00\x1fH" + // 0x039F0313: 0x00001F48 + "\x03\x9f\x03\x14\x00\x00\x1fI" + // 0x039F0314: 0x00001F49 + "\x1fH\x03\x00\x00\x00\x1fJ" + // 0x1F480300: 0x00001F4A + "\x1fI\x03\x00\x00\x00\x1fK" + // 0x1F490300: 0x00001F4B + "\x1fH\x03\x01\x00\x00\x1fL" + // 0x1F480301: 0x00001F4C + "\x1fI\x03\x01\x00\x00\x1fM" + // 0x1F490301: 0x00001F4D + "\x03\xc5\x03\x13\x00\x00\x1fP" + // 0x03C50313: 0x00001F50 + "\x03\xc5\x03\x14\x00\x00\x1fQ" + // 0x03C50314: 0x00001F51 + "\x1fP\x03\x00\x00\x00\x1fR" + // 0x1F500300: 0x00001F52 + "\x1fQ\x03\x00\x00\x00\x1fS" + // 0x1F510300: 0x00001F53 + "\x1fP\x03\x01\x00\x00\x1fT" + // 0x1F500301: 0x00001F54 + "\x1fQ\x03\x01\x00\x00\x1fU" + // 0x1F510301: 0x00001F55 + "\x1fP\x03B\x00\x00\x1fV" + // 0x1F500342: 0x00001F56 + "\x1fQ\x03B\x00\x00\x1fW" + // 0x1F510342: 0x00001F57 + "\x03\xa5\x03\x14\x00\x00\x1fY" + // 0x03A50314: 0x00001F59 + "\x1fY\x03\x00\x00\x00\x1f[" + // 0x1F590300: 0x00001F5B + "\x1fY\x03\x01\x00\x00\x1f]" + // 0x1F590301: 0x00001F5D + "\x1fY\x03B\x00\x00\x1f_" + // 0x1F590342: 0x00001F5F + "\x03\xc9\x03\x13\x00\x00\x1f`" + // 0x03C90313: 0x00001F60 + "\x03\xc9\x03\x14\x00\x00\x1fa" + // 0x03C90314: 0x00001F61 + "\x1f`\x03\x00\x00\x00\x1fb" + // 0x1F600300: 0x00001F62 + "\x1fa\x03\x00\x00\x00\x1fc" + // 0x1F610300: 0x00001F63 + "\x1f`\x03\x01\x00\x00\x1fd" + // 0x1F600301: 0x00001F64 + "\x1fa\x03\x01\x00\x00\x1fe" + // 0x1F610301: 0x00001F65 + "\x1f`\x03B\x00\x00\x1ff" + // 0x1F600342: 0x00001F66 + "\x1fa\x03B\x00\x00\x1fg" + // 0x1F610342: 0x00001F67 + "\x03\xa9\x03\x13\x00\x00\x1fh" + // 0x03A90313: 0x00001F68 + "\x03\xa9\x03\x14\x00\x00\x1fi" + // 0x03A90314: 0x00001F69 + "\x1fh\x03\x00\x00\x00\x1fj" + // 0x1F680300: 0x00001F6A + "\x1fi\x03\x00\x00\x00\x1fk" + // 0x1F690300: 0x00001F6B + "\x1fh\x03\x01\x00\x00\x1fl" + // 0x1F680301: 0x00001F6C + "\x1fi\x03\x01\x00\x00\x1fm" + // 0x1F690301: 0x00001F6D + "\x1fh\x03B\x00\x00\x1fn" + // 0x1F680342: 0x00001F6E + "\x1fi\x03B\x00\x00\x1fo" + // 0x1F690342: 0x00001F6F + "\x03\xb1\x03\x00\x00\x00\x1fp" + // 0x03B10300: 0x00001F70 + "\x03\xb5\x03\x00\x00\x00\x1fr" + // 0x03B50300: 0x00001F72 + "\x03\xb7\x03\x00\x00\x00\x1ft" + // 0x03B70300: 0x00001F74 + "\x03\xb9\x03\x00\x00\x00\x1fv" + // 0x03B90300: 0x00001F76 + "\x03\xbf\x03\x00\x00\x00\x1fx" + // 0x03BF0300: 0x00001F78 + "\x03\xc5\x03\x00\x00\x00\x1fz" + // 0x03C50300: 0x00001F7A + "\x03\xc9\x03\x00\x00\x00\x1f|" + // 0x03C90300: 0x00001F7C + "\x1f\x00\x03E\x00\x00\x1f\x80" + // 0x1F000345: 0x00001F80 + "\x1f\x01\x03E\x00\x00\x1f\x81" + // 0x1F010345: 0x00001F81 + "\x1f\x02\x03E\x00\x00\x1f\x82" + // 0x1F020345: 0x00001F82 + "\x1f\x03\x03E\x00\x00\x1f\x83" + // 0x1F030345: 0x00001F83 + "\x1f\x04\x03E\x00\x00\x1f\x84" + // 0x1F040345: 0x00001F84 + "\x1f\x05\x03E\x00\x00\x1f\x85" + // 0x1F050345: 0x00001F85 + "\x1f\x06\x03E\x00\x00\x1f\x86" + // 0x1F060345: 0x00001F86 + "\x1f\a\x03E\x00\x00\x1f\x87" + // 0x1F070345: 0x00001F87 + "\x1f\b\x03E\x00\x00\x1f\x88" + // 0x1F080345: 0x00001F88 + "\x1f\t\x03E\x00\x00\x1f\x89" + // 0x1F090345: 0x00001F89 + "\x1f\n\x03E\x00\x00\x1f\x8a" + // 0x1F0A0345: 0x00001F8A + "\x1f\v\x03E\x00\x00\x1f\x8b" + // 0x1F0B0345: 0x00001F8B + "\x1f\f\x03E\x00\x00\x1f\x8c" + // 0x1F0C0345: 0x00001F8C + "\x1f\r\x03E\x00\x00\x1f\x8d" + // 0x1F0D0345: 0x00001F8D + "\x1f\x0e\x03E\x00\x00\x1f\x8e" + // 0x1F0E0345: 0x00001F8E + "\x1f\x0f\x03E\x00\x00\x1f\x8f" + // 0x1F0F0345: 0x00001F8F + "\x1f \x03E\x00\x00\x1f\x90" + // 0x1F200345: 0x00001F90 + "\x1f!\x03E\x00\x00\x1f\x91" + // 0x1F210345: 0x00001F91 + "\x1f\"\x03E\x00\x00\x1f\x92" + // 0x1F220345: 0x00001F92 + "\x1f#\x03E\x00\x00\x1f\x93" + // 0x1F230345: 0x00001F93 + "\x1f$\x03E\x00\x00\x1f\x94" + // 0x1F240345: 0x00001F94 + "\x1f%\x03E\x00\x00\x1f\x95" + // 0x1F250345: 0x00001F95 + "\x1f&\x03E\x00\x00\x1f\x96" + // 0x1F260345: 0x00001F96 + "\x1f'\x03E\x00\x00\x1f\x97" + // 0x1F270345: 0x00001F97 + "\x1f(\x03E\x00\x00\x1f\x98" + // 0x1F280345: 0x00001F98 + "\x1f)\x03E\x00\x00\x1f\x99" + // 0x1F290345: 0x00001F99 + "\x1f*\x03E\x00\x00\x1f\x9a" + // 0x1F2A0345: 0x00001F9A + "\x1f+\x03E\x00\x00\x1f\x9b" + // 0x1F2B0345: 0x00001F9B + "\x1f,\x03E\x00\x00\x1f\x9c" + // 0x1F2C0345: 0x00001F9C + "\x1f-\x03E\x00\x00\x1f\x9d" + // 0x1F2D0345: 0x00001F9D + "\x1f.\x03E\x00\x00\x1f\x9e" + // 0x1F2E0345: 0x00001F9E + "\x1f/\x03E\x00\x00\x1f\x9f" + // 0x1F2F0345: 0x00001F9F + "\x1f`\x03E\x00\x00\x1f\xa0" + // 0x1F600345: 0x00001FA0 + "\x1fa\x03E\x00\x00\x1f\xa1" + // 0x1F610345: 0x00001FA1 + "\x1fb\x03E\x00\x00\x1f\xa2" + // 0x1F620345: 0x00001FA2 + "\x1fc\x03E\x00\x00\x1f\xa3" + // 0x1F630345: 0x00001FA3 + "\x1fd\x03E\x00\x00\x1f\xa4" + // 0x1F640345: 0x00001FA4 + "\x1fe\x03E\x00\x00\x1f\xa5" + // 0x1F650345: 0x00001FA5 + "\x1ff\x03E\x00\x00\x1f\xa6" + // 0x1F660345: 0x00001FA6 + "\x1fg\x03E\x00\x00\x1f\xa7" + // 0x1F670345: 0x00001FA7 + "\x1fh\x03E\x00\x00\x1f\xa8" + // 0x1F680345: 0x00001FA8 + "\x1fi\x03E\x00\x00\x1f\xa9" + // 0x1F690345: 0x00001FA9 + "\x1fj\x03E\x00\x00\x1f\xaa" + // 0x1F6A0345: 0x00001FAA + "\x1fk\x03E\x00\x00\x1f\xab" + // 0x1F6B0345: 0x00001FAB + "\x1fl\x03E\x00\x00\x1f\xac" + // 0x1F6C0345: 0x00001FAC + "\x1fm\x03E\x00\x00\x1f\xad" + // 0x1F6D0345: 0x00001FAD + "\x1fn\x03E\x00\x00\x1f\xae" + // 0x1F6E0345: 0x00001FAE + "\x1fo\x03E\x00\x00\x1f\xaf" + // 0x1F6F0345: 0x00001FAF + "\x03\xb1\x03\x06\x00\x00\x1f\xb0" + // 0x03B10306: 0x00001FB0 + "\x03\xb1\x03\x04\x00\x00\x1f\xb1" + // 0x03B10304: 0x00001FB1 + "\x1fp\x03E\x00\x00\x1f\xb2" + // 0x1F700345: 0x00001FB2 + "\x03\xb1\x03E\x00\x00\x1f\xb3" + // 0x03B10345: 0x00001FB3 + "\x03\xac\x03E\x00\x00\x1f\xb4" + // 0x03AC0345: 0x00001FB4 + "\x03\xb1\x03B\x00\x00\x1f\xb6" + // 0x03B10342: 0x00001FB6 + "\x1f\xb6\x03E\x00\x00\x1f\xb7" + // 0x1FB60345: 0x00001FB7 + "\x03\x91\x03\x06\x00\x00\x1f\xb8" + // 0x03910306: 0x00001FB8 + "\x03\x91\x03\x04\x00\x00\x1f\xb9" + // 0x03910304: 0x00001FB9 + "\x03\x91\x03\x00\x00\x00\x1f\xba" + // 0x03910300: 0x00001FBA + "\x03\x91\x03E\x00\x00\x1f\xbc" + // 0x03910345: 0x00001FBC + "\x00\xa8\x03B\x00\x00\x1f\xc1" + // 0x00A80342: 0x00001FC1 + "\x1ft\x03E\x00\x00\x1f\xc2" + // 0x1F740345: 0x00001FC2 + "\x03\xb7\x03E\x00\x00\x1f\xc3" + // 0x03B70345: 0x00001FC3 + "\x03\xae\x03E\x00\x00\x1f\xc4" + // 0x03AE0345: 0x00001FC4 + "\x03\xb7\x03B\x00\x00\x1f\xc6" + // 0x03B70342: 0x00001FC6 + "\x1f\xc6\x03E\x00\x00\x1f\xc7" + // 0x1FC60345: 0x00001FC7 + "\x03\x95\x03\x00\x00\x00\x1f\xc8" + // 0x03950300: 0x00001FC8 + "\x03\x97\x03\x00\x00\x00\x1f\xca" + // 0x03970300: 0x00001FCA + "\x03\x97\x03E\x00\x00\x1f\xcc" + // 0x03970345: 0x00001FCC + "\x1f\xbf\x03\x00\x00\x00\x1f\xcd" + // 0x1FBF0300: 0x00001FCD + "\x1f\xbf\x03\x01\x00\x00\x1f\xce" + // 0x1FBF0301: 0x00001FCE + "\x1f\xbf\x03B\x00\x00\x1f\xcf" + // 0x1FBF0342: 0x00001FCF + "\x03\xb9\x03\x06\x00\x00\x1f\xd0" + // 0x03B90306: 0x00001FD0 + "\x03\xb9\x03\x04\x00\x00\x1f\xd1" + // 0x03B90304: 0x00001FD1 + "\x03\xca\x03\x00\x00\x00\x1f\xd2" + // 0x03CA0300: 0x00001FD2 + "\x03\xb9\x03B\x00\x00\x1f\xd6" + // 0x03B90342: 0x00001FD6 + "\x03\xca\x03B\x00\x00\x1f\xd7" + // 0x03CA0342: 0x00001FD7 + "\x03\x99\x03\x06\x00\x00\x1f\xd8" + // 0x03990306: 0x00001FD8 + "\x03\x99\x03\x04\x00\x00\x1f\xd9" + // 0x03990304: 0x00001FD9 + "\x03\x99\x03\x00\x00\x00\x1f\xda" + // 0x03990300: 0x00001FDA + "\x1f\xfe\x03\x00\x00\x00\x1f\xdd" + // 0x1FFE0300: 0x00001FDD + "\x1f\xfe\x03\x01\x00\x00\x1f\xde" + // 0x1FFE0301: 0x00001FDE + "\x1f\xfe\x03B\x00\x00\x1f\xdf" + // 0x1FFE0342: 0x00001FDF + "\x03\xc5\x03\x06\x00\x00\x1f\xe0" + // 0x03C50306: 0x00001FE0 + "\x03\xc5\x03\x04\x00\x00\x1f\xe1" + // 0x03C50304: 0x00001FE1 + "\x03\xcb\x03\x00\x00\x00\x1f\xe2" + // 0x03CB0300: 0x00001FE2 + "\x03\xc1\x03\x13\x00\x00\x1f\xe4" + // 0x03C10313: 0x00001FE4 + "\x03\xc1\x03\x14\x00\x00\x1f\xe5" + // 0x03C10314: 0x00001FE5 + "\x03\xc5\x03B\x00\x00\x1f\xe6" + // 0x03C50342: 0x00001FE6 + "\x03\xcb\x03B\x00\x00\x1f\xe7" + // 0x03CB0342: 0x00001FE7 + "\x03\xa5\x03\x06\x00\x00\x1f\xe8" + // 0x03A50306: 0x00001FE8 + "\x03\xa5\x03\x04\x00\x00\x1f\xe9" + // 0x03A50304: 0x00001FE9 + "\x03\xa5\x03\x00\x00\x00\x1f\xea" + // 0x03A50300: 0x00001FEA + "\x03\xa1\x03\x14\x00\x00\x1f\xec" + // 0x03A10314: 0x00001FEC + "\x00\xa8\x03\x00\x00\x00\x1f\xed" + // 0x00A80300: 0x00001FED + "\x1f|\x03E\x00\x00\x1f\xf2" + // 0x1F7C0345: 0x00001FF2 + "\x03\xc9\x03E\x00\x00\x1f\xf3" + // 0x03C90345: 0x00001FF3 + "\x03\xce\x03E\x00\x00\x1f\xf4" + // 0x03CE0345: 0x00001FF4 + "\x03\xc9\x03B\x00\x00\x1f\xf6" + // 0x03C90342: 0x00001FF6 + "\x1f\xf6\x03E\x00\x00\x1f\xf7" + // 0x1FF60345: 0x00001FF7 + "\x03\x9f\x03\x00\x00\x00\x1f\xf8" + // 0x039F0300: 0x00001FF8 + "\x03\xa9\x03\x00\x00\x00\x1f\xfa" + // 0x03A90300: 0x00001FFA + "\x03\xa9\x03E\x00\x00\x1f\xfc" + // 0x03A90345: 0x00001FFC + "!\x90\x038\x00\x00!\x9a" + // 0x21900338: 0x0000219A + "!\x92\x038\x00\x00!\x9b" + // 0x21920338: 0x0000219B + "!\x94\x038\x00\x00!\xae" + // 0x21940338: 0x000021AE + "!\xd0\x038\x00\x00!\xcd" + // 0x21D00338: 0x000021CD + "!\xd4\x038\x00\x00!\xce" + // 0x21D40338: 0x000021CE + "!\xd2\x038\x00\x00!\xcf" + // 0x21D20338: 0x000021CF + "\"\x03\x038\x00\x00\"\x04" + // 0x22030338: 0x00002204 + "\"\b\x038\x00\x00\"\t" + // 0x22080338: 0x00002209 + "\"\v\x038\x00\x00\"\f" + // 0x220B0338: 0x0000220C + "\"#\x038\x00\x00\"$" + // 0x22230338: 0x00002224 + "\"%\x038\x00\x00\"&" + // 0x22250338: 0x00002226 + "\"<\x038\x00\x00\"A" + // 0x223C0338: 0x00002241 + "\"C\x038\x00\x00\"D" + // 0x22430338: 0x00002244 + "\"E\x038\x00\x00\"G" + // 0x22450338: 0x00002247 + "\"H\x038\x00\x00\"I" + // 0x22480338: 0x00002249 + "\x00=\x038\x00\x00\"`" + // 0x003D0338: 0x00002260 + "\"a\x038\x00\x00\"b" + // 0x22610338: 0x00002262 + "\"M\x038\x00\x00\"m" + // 0x224D0338: 0x0000226D + "\x00<\x038\x00\x00\"n" + // 0x003C0338: 0x0000226E + "\x00>\x038\x00\x00\"o" + // 0x003E0338: 0x0000226F + "\"d\x038\x00\x00\"p" + // 0x22640338: 0x00002270 + "\"e\x038\x00\x00\"q" + // 0x22650338: 0x00002271 + "\"r\x038\x00\x00\"t" + // 0x22720338: 0x00002274 + "\"s\x038\x00\x00\"u" + // 0x22730338: 0x00002275 + "\"v\x038\x00\x00\"x" + // 0x22760338: 0x00002278 + "\"w\x038\x00\x00\"y" + // 0x22770338: 0x00002279 + "\"z\x038\x00\x00\"\x80" + // 0x227A0338: 0x00002280 + "\"{\x038\x00\x00\"\x81" + // 0x227B0338: 0x00002281 + "\"\x82\x038\x00\x00\"\x84" + // 0x22820338: 0x00002284 + "\"\x83\x038\x00\x00\"\x85" + // 0x22830338: 0x00002285 + "\"\x86\x038\x00\x00\"\x88" + // 0x22860338: 0x00002288 + "\"\x87\x038\x00\x00\"\x89" + // 0x22870338: 0x00002289 + "\"\xa2\x038\x00\x00\"\xac" + // 0x22A20338: 0x000022AC + "\"\xa8\x038\x00\x00\"\xad" + // 0x22A80338: 0x000022AD + "\"\xa9\x038\x00\x00\"\xae" + // 0x22A90338: 0x000022AE + "\"\xab\x038\x00\x00\"\xaf" + // 0x22AB0338: 0x000022AF + "\"|\x038\x00\x00\"\xe0" + // 0x227C0338: 0x000022E0 + "\"}\x038\x00\x00\"\xe1" + // 0x227D0338: 0x000022E1 + "\"\x91\x038\x00\x00\"\xe2" + // 0x22910338: 0x000022E2 + "\"\x92\x038\x00\x00\"\xe3" + // 0x22920338: 0x000022E3 + "\"\xb2\x038\x00\x00\"\xea" + // 0x22B20338: 0x000022EA + "\"\xb3\x038\x00\x00\"\xeb" + // 0x22B30338: 0x000022EB + "\"\xb4\x038\x00\x00\"\xec" + // 0x22B40338: 0x000022EC + "\"\xb5\x038\x00\x00\"\xed" + // 0x22B50338: 0x000022ED + "0K0\x99\x00\x000L" + // 0x304B3099: 0x0000304C + "0M0\x99\x00\x000N" + // 0x304D3099: 0x0000304E + "0O0\x99\x00\x000P" + // 0x304F3099: 0x00003050 + "0Q0\x99\x00\x000R" + // 0x30513099: 0x00003052 + "0S0\x99\x00\x000T" + // 0x30533099: 0x00003054 + "0U0\x99\x00\x000V" + // 0x30553099: 0x00003056 + "0W0\x99\x00\x000X" + // 0x30573099: 0x00003058 + "0Y0\x99\x00\x000Z" + // 0x30593099: 0x0000305A + "0[0\x99\x00\x000\\" + // 0x305B3099: 0x0000305C + "0]0\x99\x00\x000^" + // 0x305D3099: 0x0000305E + "0_0\x99\x00\x000`" + // 0x305F3099: 0x00003060 + "0a0\x99\x00\x000b" + // 0x30613099: 0x00003062 + "0d0\x99\x00\x000e" + // 0x30643099: 0x00003065 + "0f0\x99\x00\x000g" + // 0x30663099: 0x00003067 + "0h0\x99\x00\x000i" + // 0x30683099: 0x00003069 + "0o0\x99\x00\x000p" + // 0x306F3099: 0x00003070 + "0o0\x9a\x00\x000q" + // 0x306F309A: 0x00003071 + "0r0\x99\x00\x000s" + // 0x30723099: 0x00003073 + "0r0\x9a\x00\x000t" + // 0x3072309A: 0x00003074 + "0u0\x99\x00\x000v" + // 0x30753099: 0x00003076 + "0u0\x9a\x00\x000w" + // 0x3075309A: 0x00003077 + "0x0\x99\x00\x000y" + // 0x30783099: 0x00003079 + "0x0\x9a\x00\x000z" + // 0x3078309A: 0x0000307A + "0{0\x99\x00\x000|" + // 0x307B3099: 0x0000307C + "0{0\x9a\x00\x000}" + // 0x307B309A: 0x0000307D + "0F0\x99\x00\x000\x94" + // 0x30463099: 0x00003094 + "0\x9d0\x99\x00\x000\x9e" + // 0x309D3099: 0x0000309E + "0\xab0\x99\x00\x000\xac" + // 0x30AB3099: 0x000030AC + "0\xad0\x99\x00\x000\xae" + // 0x30AD3099: 0x000030AE + "0\xaf0\x99\x00\x000\xb0" + // 0x30AF3099: 0x000030B0 + "0\xb10\x99\x00\x000\xb2" + // 0x30B13099: 0x000030B2 + "0\xb30\x99\x00\x000\xb4" + // 0x30B33099: 0x000030B4 + "0\xb50\x99\x00\x000\xb6" + // 0x30B53099: 0x000030B6 + "0\xb70\x99\x00\x000\xb8" + // 0x30B73099: 0x000030B8 + "0\xb90\x99\x00\x000\xba" + // 0x30B93099: 0x000030BA + "0\xbb0\x99\x00\x000\xbc" + // 0x30BB3099: 0x000030BC + "0\xbd0\x99\x00\x000\xbe" + // 0x30BD3099: 0x000030BE + "0\xbf0\x99\x00\x000\xc0" + // 0x30BF3099: 0x000030C0 + "0\xc10\x99\x00\x000\xc2" + // 0x30C13099: 0x000030C2 + "0\xc40\x99\x00\x000\xc5" + // 0x30C43099: 0x000030C5 + "0\xc60\x99\x00\x000\xc7" + // 0x30C63099: 0x000030C7 + "0\xc80\x99\x00\x000\xc9" + // 0x30C83099: 0x000030C9 + "0\xcf0\x99\x00\x000\xd0" + // 0x30CF3099: 0x000030D0 + "0\xcf0\x9a\x00\x000\xd1" + // 0x30CF309A: 0x000030D1 + "0\xd20\x99\x00\x000\xd3" + // 0x30D23099: 0x000030D3 + "0\xd20\x9a\x00\x000\xd4" + // 0x30D2309A: 0x000030D4 + "0\xd50\x99\x00\x000\xd6" + // 0x30D53099: 0x000030D6 + "0\xd50\x9a\x00\x000\xd7" + // 0x30D5309A: 0x000030D7 + "0\xd80\x99\x00\x000\xd9" + // 0x30D83099: 0x000030D9 + "0\xd80\x9a\x00\x000\xda" + // 0x30D8309A: 0x000030DA + "0\xdb0\x99\x00\x000\xdc" + // 0x30DB3099: 0x000030DC + "0\xdb0\x9a\x00\x000\xdd" + // 0x30DB309A: 0x000030DD + "0\xa60\x99\x00\x000\xf4" + // 0x30A63099: 0x000030F4 + "0\xef0\x99\x00\x000\xf7" + // 0x30EF3099: 0x000030F7 + "0\xf00\x99\x00\x000\xf8" + // 0x30F03099: 0x000030F8 + "0\xf10\x99\x00\x000\xf9" + // 0x30F13099: 0x000030F9 + "0\xf20\x99\x00\x000\xfa" + // 0x30F23099: 0x000030FA + "0\xfd0\x99\x00\x000\xfe" + // 0x30FD3099: 0x000030FE + "\x10\x99\x10\xba\x00\x01\x10\x9a" + // 0x109910BA: 0x0001109A + "\x10\x9b\x10\xba\x00\x01\x10\x9c" + // 0x109B10BA: 0x0001109C + "\x10\xa5\x10\xba\x00\x01\x10\xab" + // 0x10A510BA: 0x000110AB + "\x111\x11'\x00\x01\x11." + // 0x11311127: 0x0001112E + "\x112\x11'\x00\x01\x11/" + // 0x11321127: 0x0001112F + "\x13G\x13>\x00\x01\x13K" + // 0x1347133E: 0x0001134B + "\x13G\x13W\x00\x01\x13L" + // 0x13471357: 0x0001134C + "\x14\xb9\x14\xba\x00\x01\x14\xbb" + // 0x14B914BA: 0x000114BB + "\x14\xb9\x14\xb0\x00\x01\x14\xbc" + // 0x14B914B0: 0x000114BC + "\x14\xb9\x14\xbd\x00\x01\x14\xbe" + // 0x14B914BD: 0x000114BE + "\x15\xb8\x15\xaf\x00\x01\x15\xba" + // 0x15B815AF: 0x000115BA + "\x15\xb9\x15\xaf\x00\x01\x15\xbb" + // 0x15B915AF: 0x000115BB + "" + // Total size of tables: 53KB (54514 bytes) diff --git a/vendor/golang.org/x/xerrors/codereview.cfg b/vendor/golang.org/x/xerrors/codereview.cfg new file mode 100644 index 00000000..3f8b14b6 --- /dev/null +++ b/vendor/golang.org/x/xerrors/codereview.cfg @@ -0,0 +1 @@ +issuerepo: golang/go diff --git a/vendor/golang.org/x/xerrors/wrap.go b/vendor/golang.org/x/xerrors/wrap.go index ebfe244e..9a3b5103 100644 --- a/vendor/golang.org/x/xerrors/wrap.go +++ b/vendor/golang.org/x/xerrors/wrap.go @@ -51,8 +51,10 @@ func Is(err, target error) bool { if target == nil { return err == target } + + isComparable := reflect.TypeOf(target).Comparable() for { - if err == target { + if isComparable && err == target { return true } if x, ok := err.(interface{ Is(error) bool }); ok && x.Is(target) { diff --git a/vendor/gopkg.in/fsnotify/fsnotify.v1/.editorconfig b/vendor/gopkg.in/fsnotify.v1/.editorconfig similarity index 100% rename from vendor/gopkg.in/fsnotify/fsnotify.v1/.editorconfig rename to vendor/gopkg.in/fsnotify.v1/.editorconfig diff --git a/vendor/gopkg.in/fsnotify/fsnotify.v1/.gitignore b/vendor/gopkg.in/fsnotify.v1/.gitignore similarity index 100% rename from vendor/gopkg.in/fsnotify/fsnotify.v1/.gitignore rename to vendor/gopkg.in/fsnotify.v1/.gitignore diff --git a/vendor/gopkg.in/fsnotify/fsnotify.v1/.travis.yml b/vendor/gopkg.in/fsnotify.v1/.travis.yml similarity index 100% rename from vendor/gopkg.in/fsnotify/fsnotify.v1/.travis.yml rename to vendor/gopkg.in/fsnotify.v1/.travis.yml diff --git a/vendor/gopkg.in/fsnotify/fsnotify.v1/AUTHORS b/vendor/gopkg.in/fsnotify.v1/AUTHORS similarity index 100% rename from vendor/gopkg.in/fsnotify/fsnotify.v1/AUTHORS rename to vendor/gopkg.in/fsnotify.v1/AUTHORS diff --git a/vendor/gopkg.in/fsnotify/fsnotify.v1/CHANGELOG.md b/vendor/gopkg.in/fsnotify.v1/CHANGELOG.md similarity index 100% rename from vendor/gopkg.in/fsnotify/fsnotify.v1/CHANGELOG.md rename to vendor/gopkg.in/fsnotify.v1/CHANGELOG.md diff --git a/vendor/gopkg.in/fsnotify/fsnotify.v1/CONTRIBUTING.md b/vendor/gopkg.in/fsnotify.v1/CONTRIBUTING.md similarity index 100% rename from vendor/gopkg.in/fsnotify/fsnotify.v1/CONTRIBUTING.md rename to vendor/gopkg.in/fsnotify.v1/CONTRIBUTING.md diff --git a/vendor/gopkg.in/fsnotify/fsnotify.v1/LICENSE b/vendor/gopkg.in/fsnotify.v1/LICENSE similarity index 100% rename from vendor/gopkg.in/fsnotify/fsnotify.v1/LICENSE rename to vendor/gopkg.in/fsnotify.v1/LICENSE diff --git a/vendor/gopkg.in/fsnotify/fsnotify.v1/README.md b/vendor/gopkg.in/fsnotify.v1/README.md similarity index 100% rename from vendor/gopkg.in/fsnotify/fsnotify.v1/README.md rename to vendor/gopkg.in/fsnotify.v1/README.md diff --git a/vendor/gopkg.in/fsnotify/fsnotify.v1/fen.go b/vendor/gopkg.in/fsnotify.v1/fen.go similarity index 100% rename from vendor/gopkg.in/fsnotify/fsnotify.v1/fen.go rename to vendor/gopkg.in/fsnotify.v1/fen.go diff --git a/vendor/gopkg.in/fsnotify/fsnotify.v1/fsnotify.go b/vendor/gopkg.in/fsnotify.v1/fsnotify.go similarity index 100% rename from vendor/gopkg.in/fsnotify/fsnotify.v1/fsnotify.go rename to vendor/gopkg.in/fsnotify.v1/fsnotify.go diff --git a/vendor/gopkg.in/fsnotify/fsnotify.v1/inotify.go b/vendor/gopkg.in/fsnotify.v1/inotify.go similarity index 100% rename from vendor/gopkg.in/fsnotify/fsnotify.v1/inotify.go rename to vendor/gopkg.in/fsnotify.v1/inotify.go diff --git a/vendor/gopkg.in/fsnotify/fsnotify.v1/inotify_poller.go b/vendor/gopkg.in/fsnotify.v1/inotify_poller.go similarity index 100% rename from vendor/gopkg.in/fsnotify/fsnotify.v1/inotify_poller.go rename to vendor/gopkg.in/fsnotify.v1/inotify_poller.go diff --git a/vendor/gopkg.in/fsnotify/fsnotify.v1/kqueue.go b/vendor/gopkg.in/fsnotify.v1/kqueue.go similarity index 100% rename from vendor/gopkg.in/fsnotify/fsnotify.v1/kqueue.go rename to vendor/gopkg.in/fsnotify.v1/kqueue.go diff --git a/vendor/gopkg.in/fsnotify/fsnotify.v1/open_mode_bsd.go b/vendor/gopkg.in/fsnotify.v1/open_mode_bsd.go similarity index 100% rename from vendor/gopkg.in/fsnotify/fsnotify.v1/open_mode_bsd.go rename to vendor/gopkg.in/fsnotify.v1/open_mode_bsd.go diff --git a/vendor/gopkg.in/fsnotify/fsnotify.v1/open_mode_darwin.go b/vendor/gopkg.in/fsnotify.v1/open_mode_darwin.go similarity index 100% rename from vendor/gopkg.in/fsnotify/fsnotify.v1/open_mode_darwin.go rename to vendor/gopkg.in/fsnotify.v1/open_mode_darwin.go diff --git a/vendor/gopkg.in/fsnotify/fsnotify.v1/windows.go b/vendor/gopkg.in/fsnotify.v1/windows.go similarity index 100% rename from vendor/gopkg.in/fsnotify/fsnotify.v1/windows.go rename to vendor/gopkg.in/fsnotify.v1/windows.go diff --git a/vendor/gopkg.in/tomb.v1/tomb.go b/vendor/gopkg.in/tomb.v1/tomb.go index 5bcd5f84..9aec56d8 100644 --- a/vendor/gopkg.in/tomb.v1/tomb.go +++ b/vendor/gopkg.in/tomb.v1/tomb.go @@ -46,7 +46,7 @@ // When the tomb state changes to dying and there's still logic going // on within the goroutine, nested functions and methods may choose to // return ErrDying as their error value, as this error won't alter the -// tomb state if provied to the Kill method. This is a convenient way to +// tomb state if provided to the Kill method. This is a convenient way to // follow standard Go practices in the context of a dying tomb. // // For background and a detailed example, see the following blog post:

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 Mk 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 ro|+l@LTC5_nr1$Ef0|NSgKsT- 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⋘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�&|IMvF>xCjX1@2fvxQs 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 ?bH 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 z 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�p)KaS(U9H~DsRlX?*W^IHEZ%3k0n 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≥Z`G1j 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